[med-svn] [hyphy] 01/02: Imported Upstream version 2.2.4+dfsg

Andreas Tille tille at debian.org
Wed Jul 8 15:50:21 UTC 2015


This is an automated email from the git hooks/post-receive script.

tille pushed a commit to branch master
in repository hyphy.

commit 47bfdd6c6de2b7674fd5e73ebe45d9c9f2af6ee7
Author: Andreas Tille <tille at debian.org>
Date:   Wed Jul 8 17:26:26 2015 +0200

    Imported Upstream version 2.2.4+dfsg
---
 CMakeLists.txt                                     |   711 +
 Examples/BatchLanguage/MatrixIndexing.bf           |     1 +
 Examples/BatchLanguage/profile_test.bf             |     1 +
 Examples/Categories/data/aspectrin.nuc             |     1 +
 Examples/Categories/definitions+MLE.bf             |     1 +
 Examples/Categories/definitions.bf                 |     1 +
 Examples/Categories/definitions2.bf                |     1 +
 Examples/Categories/definitions3.bf                |     1 +
 Examples/Categories/displayFunction.bf             |     1 +
 .../ConstraintDefinition/ReplicateConstraint1.bf   |     1 +
 .../ConstraintDefinition/ReplicateConstraint2.bf   |     1 +
 .../ConstraintDefinition/ReplicateConstraint3.bf   |     1 +
 Examples/ConstraintDefinition/data/hiv.seq         |     1 +
 Examples/ConstraintDefinition/shared.bf            |     1 +
 Examples/DataFilters/HKY852blocks.bf               |     1 +
 Examples/DataFilters/HKY852blocks2models.bf        |     1 +
 Examples/DataFilters/data/actin2.flt               |     1 +
 Examples/MoreComplexModels/ExonIntron.bf           |     1 +
 Examples/MoreComplexModels/Models/EI.mdl           |     1 +
 Examples/MoreComplexModels/Models/MG94x2.mdl       |     1 +
 Examples/MoreComplexModels/aa.bf                   |     1 +
 Examples/MoreComplexModels/data/3.seq              |     1 +
 Examples/MoreComplexModels/data/stewart.aa         |     1 +
 Examples/MoreComplexModels/data/ubiq.flt           |     1 +
 Examples/SimpleAnalyses/F81.bf                     |     1 +
 Examples/SimpleAnalyses/HKY85.bf                   |     1 +
 Examples/SimpleAnalyses/HKY85shared.bf             |     1 +
 Examples/SimpleAnalyses/JC69.bf                    |     1 +
 Examples/SimpleAnalyses/K2P.bf                     |     1 +
 Examples/SimpleAnalyses/K2Pshared.bf               |     1 +
 Examples/SimpleAnalyses/Non-Rev.bf                 |     1 +
 Examples/SimpleAnalyses/REV.bf                     |     1 +
 Examples/SimpleAnalyses/REVshared.bf               |     1 +
 Examples/SimpleAnalyses/data/hiv.nuc               |     1 +
 Examples/SimpleConstraints/F81K81uf_relratio.bf    |     1 +
 Examples/SimpleConstraints/F81relrate.bf           |     1 +
 Examples/SimpleConstraints/F81relratio.bf          |     1 +
 Examples/SimpleConstraints/HKY85relrate.bf         |     1 +
 Examples/SimpleConstraints/HKY85relratio.bf        |     1 +
 Examples/SimpleConstraints/MolecularClockF81.bf    |     1 +
 Examples/SimpleConstraints/MolecularClockHKY85.bf  |     1 +
 Examples/SimpleConstraints/data/3.seq              |     1 +
 Examples/SimpleConstraints/data/aspectrin1.nuc     |     1 +
 Examples/SimpleConstraints/data/aspectrin2.nuc     |     1 +
 Examples/SimpleConstraints/data/molclock.seq       |     1 +
 Examples/Simulation/PBootstrapHetRates.bf          |     1 +
 Examples/Simulation/ParametricBootstrap.bf         |     1 +
 Examples/Simulation/RelativeRatePBS.bf             |     1 +
 Examples/Simulation/data/3.seq                     |     1 +
 Examples/Simulation/data/hiv.nuc                   |     1 +
 README.md                                          |    54 +
 cmake/FindOpenCL.cmake                             |    76 +
 cmake/cmake_uninstall.cmake.in                     |    24 +
 contrib/cl2hdr.c                                   |   126 +
 contrib/gtest-1.7.0/CHANGES                        |   157 +
 contrib/gtest-1.7.0/CMakeLists.txt                 |   252 +
 contrib/gtest-1.7.0/CONTRIBUTORS                   |    37 +
 contrib/gtest-1.7.0/LICENSE                        |    28 +
 contrib/gtest-1.7.0/Makefile.am                    |   306 +
 contrib/gtest-1.7.0/Makefile.in                    |  1360 ++
 contrib/gtest-1.7.0/README                         |   435 +
 contrib/gtest-1.7.0/aclocal.m4                     |  1198 ++
 contrib/gtest-1.7.0/build-aux/config.guess         |  1530 ++
 contrib/gtest-1.7.0/build-aux/config.h.in          |    69 +
 contrib/gtest-1.7.0/build-aux/config.sub           |  1773 ++
 contrib/gtest-1.7.0/build-aux/depcomp              |   688 +
 contrib/gtest-1.7.0/build-aux/install-sh           |   527 +
 contrib/gtest-1.7.0/build-aux/ltmain.sh            |  9661 +++++++++
 contrib/gtest-1.7.0/build-aux/missing              |   331 +
 contrib/gtest-1.7.0/cmake/internal_utils.cmake     |   227 +
 contrib/gtest-1.7.0/codegear/gtest.cbproj          |   138 +
 contrib/gtest-1.7.0/codegear/gtest.groupproj       |    54 +
 contrib/gtest-1.7.0/codegear/gtest_all.cc          |    38 +
 contrib/gtest-1.7.0/codegear/gtest_link.cc         |    40 +
 contrib/gtest-1.7.0/codegear/gtest_main.cbproj     |    82 +
 contrib/gtest-1.7.0/codegear/gtest_unittest.cbproj |    88 +
 contrib/gtest-1.7.0/configure                      | 18222 +++++++++++++++++
 contrib/gtest-1.7.0/configure.ac                   |    68 +
 contrib/gtest-1.7.0/fused-src/gtest/gtest-all.cc   |  9592 +++++++++
 contrib/gtest-1.7.0/fused-src/gtest/gtest.h        | 20061 +++++++++++++++++++
 contrib/gtest-1.7.0/fused-src/gtest/gtest_main.cc  |    38 +
 .../gtest-1.7.0/include/gtest/gtest-death-test.h   |   294 +
 contrib/gtest-1.7.0/include/gtest/gtest-message.h  |   250 +
 .../gtest-1.7.0/include/gtest/gtest-param-test.h   |  1421 ++
 .../include/gtest/gtest-param-test.h.pump          |   487 +
 contrib/gtest-1.7.0/include/gtest/gtest-printers.h |   855 +
 contrib/gtest-1.7.0/include/gtest/gtest-spi.h      |   232 +
 .../gtest-1.7.0/include/gtest/gtest-test-part.h    |   179 +
 .../gtest-1.7.0/include/gtest/gtest-typed-test.h   |   259 +
 contrib/gtest-1.7.0/include/gtest/gtest.h          |  2291 +++
 .../gtest-1.7.0/include/gtest/gtest_pred_impl.h    |   358 +
 contrib/gtest-1.7.0/include/gtest/gtest_prod.h     |    58 +
 .../gtest/internal/gtest-death-test-internal.h     |   319 +
 .../include/gtest/internal/gtest-filepath.h        |   206 +
 .../include/gtest/internal/gtest-internal.h        |  1158 ++
 .../include/gtest/internal/gtest-linked_ptr.h      |   233 +
 .../gtest/internal/gtest-param-util-generated.h    |  5143 +++++
 .../internal/gtest-param-util-generated.h.pump     |   301 +
 .../include/gtest/internal/gtest-param-util.h      |   619 +
 .../include/gtest/internal/gtest-port.h            |  1947 ++
 .../include/gtest/internal/gtest-string.h          |   167 +
 .../include/gtest/internal/gtest-tuple.h           |  1012 +
 .../include/gtest/internal/gtest-tuple.h.pump      |   339 +
 .../include/gtest/internal/gtest-type-util.h       |  3331 +++
 .../include/gtest/internal/gtest-type-util.h.pump  |   297 +
 contrib/gtest-1.7.0/m4/acx_pthread.m4              |   363 +
 contrib/gtest-1.7.0/m4/gtest.m4                    |    74 +
 contrib/gtest-1.7.0/m4/libtool.m4                  |  8001 ++++++++
 contrib/gtest-1.7.0/m4/ltoptions.m4                |   384 +
 contrib/gtest-1.7.0/m4/ltsugar.m4                  |   123 +
 contrib/gtest-1.7.0/m4/ltversion.m4                |    23 +
 contrib/gtest-1.7.0/m4/lt~obsolete.m4              |    98 +
 contrib/gtest-1.7.0/make/Makefile                  |    82 +
 contrib/gtest-1.7.0/msvc/gtest-md.sln              |    45 +
 contrib/gtest-1.7.0/msvc/gtest-md.vcproj           |   126 +
 contrib/gtest-1.7.0/msvc/gtest.sln                 |    45 +
 contrib/gtest-1.7.0/msvc/gtest.vcproj              |   126 +
 contrib/gtest-1.7.0/msvc/gtest_main-md.vcproj      |   129 +
 contrib/gtest-1.7.0/msvc/gtest_main.vcproj         |   129 +
 contrib/gtest-1.7.0/msvc/gtest_prod_test-md.vcproj |   164 +
 contrib/gtest-1.7.0/msvc/gtest_prod_test.vcproj    |   164 +
 contrib/gtest-1.7.0/msvc/gtest_unittest-md.vcproj  |   147 +
 contrib/gtest-1.7.0/msvc/gtest_unittest.vcproj     |   147 +
 contrib/gtest-1.7.0/samples/prime_tables.h         |   123 +
 contrib/gtest-1.7.0/samples/sample1.cc             |    68 +
 contrib/gtest-1.7.0/samples/sample1.h              |    43 +
 contrib/gtest-1.7.0/samples/sample10_unittest.cc   |   144 +
 contrib/gtest-1.7.0/samples/sample1_unittest.cc    |   153 +
 contrib/gtest-1.7.0/samples/sample2.cc             |    56 +
 contrib/gtest-1.7.0/samples/sample2.h              |    85 +
 contrib/gtest-1.7.0/samples/sample2_unittest.cc    |   109 +
 contrib/gtest-1.7.0/samples/sample3-inl.h          |   172 +
 contrib/gtest-1.7.0/samples/sample3_unittest.cc    |   151 +
 contrib/gtest-1.7.0/samples/sample4.cc             |    46 +
 contrib/gtest-1.7.0/samples/sample4.h              |    53 +
 contrib/gtest-1.7.0/samples/sample4_unittest.cc    |    45 +
 contrib/gtest-1.7.0/samples/sample5_unittest.cc    |   199 +
 contrib/gtest-1.7.0/samples/sample6_unittest.cc    |   224 +
 contrib/gtest-1.7.0/samples/sample7_unittest.cc    |   130 +
 contrib/gtest-1.7.0/samples/sample8_unittest.cc    |   173 +
 contrib/gtest-1.7.0/samples/sample9_unittest.cc    |   160 +
 contrib/gtest-1.7.0/scripts/fuse_gtest_files.py    |   250 +
 contrib/gtest-1.7.0/scripts/gen_gtest_pred_impl.py |   730 +
 contrib/gtest-1.7.0/scripts/gtest-config.in        |   274 +
 contrib/gtest-1.7.0/scripts/pump.py                |   855 +
 contrib/gtest-1.7.0/scripts/test/Makefile          |    59 +
 contrib/gtest-1.7.0/src/gtest-all.cc               |    48 +
 contrib/gtest-1.7.0/src/gtest-death-test.cc        |  1344 ++
 contrib/gtest-1.7.0/src/gtest-filepath.cc          |   382 +
 contrib/gtest-1.7.0/src/gtest-internal-inl.h       |  1218 ++
 contrib/gtest-1.7.0/src/gtest-port.cc              |   805 +
 contrib/gtest-1.7.0/src/gtest-printers.cc          |   363 +
 contrib/gtest-1.7.0/src/gtest-test-part.cc         |   110 +
 contrib/gtest-1.7.0/src/gtest-typed-test.cc        |   110 +
 contrib/gtest-1.7.0/src/gtest.cc                   |  5015 +++++
 contrib/gtest-1.7.0/src/gtest_main.cc              |    38 +
 .../gtest-1.7.0/test/gtest-death-test_ex_test.cc   |    93 +
 contrib/gtest-1.7.0/test/gtest-death-test_test.cc  |  1367 ++
 contrib/gtest-1.7.0/test/gtest-filepath_test.cc    |   680 +
 contrib/gtest-1.7.0/test/gtest-linked_ptr_test.cc  |   154 +
 contrib/gtest-1.7.0/test/gtest-listener_test.cc    |   310 +
 contrib/gtest-1.7.0/test/gtest-message_test.cc     |   159 +
 contrib/gtest-1.7.0/test/gtest-options_test.cc     |   215 +
 contrib/gtest-1.7.0/test/gtest-param-test2_test.cc |    65 +
 contrib/gtest-1.7.0/test/gtest-param-test_test.cc  |   904 +
 contrib/gtest-1.7.0/test/gtest-param-test_test.h   |    57 +
 contrib/gtest-1.7.0/test/gtest-port_test.cc        |  1253 ++
 contrib/gtest-1.7.0/test/gtest-printers_test.cc    |  1566 ++
 contrib/gtest-1.7.0/test/gtest-test-part_test.cc   |   208 +
 contrib/gtest-1.7.0/test/gtest-tuple_test.cc       |   320 +
 contrib/gtest-1.7.0/test/gtest-typed-test2_test.cc |    45 +
 contrib/gtest-1.7.0/test/gtest-typed-test_test.cc  |   360 +
 contrib/gtest-1.7.0/test/gtest-typed-test_test.h   |    66 +
 .../gtest-1.7.0/test/gtest-unittest-api_test.cc    |   341 +
 contrib/gtest-1.7.0/test/gtest_all_test.cc         |    47 +
 .../test/gtest_break_on_failure_unittest.py        |   212 +
 .../test/gtest_break_on_failure_unittest_.cc       |    88 +
 .../test/gtest_catch_exceptions_test.py            |   237 +
 .../test/gtest_catch_exceptions_test_.cc           |   311 +
 contrib/gtest-1.7.0/test/gtest_color_test.py       |   130 +
 contrib/gtest-1.7.0/test/gtest_color_test_.cc      |    71 +
 contrib/gtest-1.7.0/test/gtest_env_var_test.py     |   103 +
 contrib/gtest-1.7.0/test/gtest_env_var_test_.cc    |   126 +
 contrib/gtest-1.7.0/test/gtest_environment_test.cc |   192 +
 contrib/gtest-1.7.0/test/gtest_filter_unittest.py  |   633 +
 contrib/gtest-1.7.0/test/gtest_filter_unittest_.cc |   140 +
 contrib/gtest-1.7.0/test/gtest_help_test.py        |   172 +
 contrib/gtest-1.7.0/test/gtest_help_test_.cc       |    46 +
 .../gtest-1.7.0/test/gtest_list_tests_unittest.py  |   207 +
 .../gtest-1.7.0/test/gtest_list_tests_unittest_.cc |   157 +
 contrib/gtest-1.7.0/test/gtest_main_unittest.cc    |    45 +
 contrib/gtest-1.7.0/test/gtest_no_test_unittest.cc |    56 +
 contrib/gtest-1.7.0/test/gtest_output_test.py      |   335 +
 contrib/gtest-1.7.0/test/gtest_output_test_.cc     |  1034 +
 .../test/gtest_output_test_golden_lin.txt          |   720 +
 .../gtest-1.7.0/test/gtest_pred_impl_unittest.cc   |  2427 +++
 .../gtest-1.7.0/test/gtest_premature_exit_test.cc  |   141 +
 contrib/gtest-1.7.0/test/gtest_prod_test.cc        |    57 +
 contrib/gtest-1.7.0/test/gtest_repeat_test.cc      |   253 +
 contrib/gtest-1.7.0/test/gtest_shuffle_test.py     |   325 +
 contrib/gtest-1.7.0/test/gtest_shuffle_test_.cc    |   103 +
 contrib/gtest-1.7.0/test/gtest_sole_header_test.cc |    57 +
 contrib/gtest-1.7.0/test/gtest_stress_test.cc      |   256 +
 contrib/gtest-1.7.0/test/gtest_test_utils.py       |   320 +
 .../test/gtest_throw_on_failure_ex_test.cc         |    92 +
 .../test/gtest_throw_on_failure_test.py            |   171 +
 .../test/gtest_throw_on_failure_test_.cc           |    72 +
 .../gtest-1.7.0/test/gtest_uninitialized_test.py   |    70 +
 .../gtest-1.7.0/test/gtest_uninitialized_test_.cc  |    43 +
 contrib/gtest-1.7.0/test/gtest_unittest.cc         |  7415 +++++++
 .../gtest-1.7.0/test/gtest_xml_outfile1_test_.cc   |    49 +
 .../gtest-1.7.0/test/gtest_xml_outfile2_test_.cc   |    49 +
 .../gtest-1.7.0/test/gtest_xml_outfiles_test.py    |   132 +
 .../gtest-1.7.0/test/gtest_xml_output_unittest.py  |   307 +
 .../gtest-1.7.0/test/gtest_xml_output_unittest_.cc |   181 +
 contrib/gtest-1.7.0/test/gtest_xml_test_utils.py   |   194 +
 contrib/gtest-1.7.0/test/production.cc             |    36 +
 contrib/gtest-1.7.0/test/production.h              |    55 +
 .../gtest-1.7.0/xcode/Config/DebugProject.xcconfig |    30 +
 .../xcode/Config/FrameworkTarget.xcconfig          |    17 +
 contrib/gtest-1.7.0/xcode/Config/General.xcconfig  |    41 +
 .../xcode/Config/ReleaseProject.xcconfig           |    32 +
 .../xcode/Config/StaticLibraryTarget.xcconfig      |    18 +
 .../gtest-1.7.0/xcode/Config/TestTarget.xcconfig   |     8 +
 contrib/gtest-1.7.0/xcode/Resources/Info.plist     |    30 +
 .../xcode/Samples/FrameworkSample/Info.plist       |    28 +
 .../WidgetFramework.xcodeproj/project.pbxproj      |   457 +
 .../xcode/Samples/FrameworkSample/runtests.sh      |    62 +
 .../xcode/Samples/FrameworkSample/widget.cc        |    63 +
 .../xcode/Samples/FrameworkSample/widget.h         |    59 +
 .../xcode/Samples/FrameworkSample/widget_test.cc   |    68 +
 contrib/gtest-1.7.0/xcode/Scripts/runtests.sh      |    65 +
 .../gtest-1.7.0/xcode/Scripts/versiongenerate.py   |   100 +
 .../xcode/gtest.xcodeproj/project.pbxproj          |  1135 ++
 help/Commands/query.bf                             |   170 +
 help/Commands/reference.sql                        |   Bin 0 -> 139264 bytes
 help/Getting Started With HyPhy.pdf                |   Bin 0 -> 1058637 bytes
 help/SelectionAnalyses.pdf                         |   Bin 0 -> 966666 bytes
 package.json                                       |    12 +
 res/ChartAddIns/Approximate_CDF                    |    34 +
 res/ChartAddIns/Column Operations                  |    88 +
 res/ChartAddIns/Complex Select Cells By Value      |   138 +
 res/ChartAddIns/Contigency Table                   |   142 +
 res/ChartAddIns/Covariance                         |    78 +
 res/ChartAddIns/DBAddIns/DescriptiveStats.bf       |    49 +
 res/ChartAddIns/DBAddIns/FromSQLFlatFile.bf        |    16 +
 res/ChartAddIns/DBAddIns/HY_DBW_TemplateList       |    12 +
 res/ChartAddIns/DBAddIns/ToChartWindow.bf          |    53 +
 res/ChartAddIns/DBAddIns/ToConsole.bf              |    35 +
 res/ChartAddIns/DBAddIns/ToFastaFile.bf            |    32 +
 res/ChartAddIns/DBAddIns/ToFastaFileFromPandit.bf  |    73 +
 res/ChartAddIns/DBAddIns/ToFrontierFastaFile.bf    |    62 +
 res/ChartAddIns/DBAddIns/ToSQLFlatFile.bf          |    97 +
 res/ChartAddIns/DBAddIns/ToTabFile.bf              |    48 +
 res/ChartAddIns/Descriptive Statistics             |    91 +
 res/ChartAddIns/Distribution Moments               |   153 +
 .../DistributionAddIns/Event Posteriors            |    87 +
 .../DistributionAddIns/Includes/posteriors.ibf     |    26 +
 .../Most Likely Class Assignment                   |    67 +
 .../DistributionAddIns/Posterior Distribution      |    34 +
 .../DistributionAddIns/Posterior Moments           |    65 +
 res/ChartAddIns/DistributionAddIns/Prior Moments   |    62 +
 res/ChartAddIns/Gaussian Penalty Clustering        |   229 +
 res/ChartAddIns/Goodness of Fit                    |    90 +
 res/ChartAddIns/Histogram                          |   103 +
 res/ChartAddIns/K-Mean Clustering                  |   108 +
 res/ChartAddIns/KH Resampler                       |   106 +
 res/ChartAddIns/Linear Fit                         |    75 +
 res/ChartAddIns/Linear Fit.orig                    |    79 +
 res/ChartAddIns/Mean Profile Plot                  |    93 +
 res/ChartAddIns/Median Profile Plot                |   172 +
 res/ChartAddIns/Poisson Mixture Fit                |   265 +
 res/ChartAddIns/Populate Cells                     |    25 +
 res/ChartAddIns/Profile Mean Clustering            |   259 +
 res/ChartAddIns/Running Sum                        |    32 +
 res/ChartAddIns/Samplers/lhc.bf                    |    66 +
 res/ChartAddIns/Samplers/sir.bf                    |   135 +
 res/ChartAddIns/Samplers/srs.ibf                   |   108 +
 res/ChartAddIns/Select Cells By Index              |    46 +
 res/ChartAddIns/Select Cells By Value              |    96 +
 res/ChartAddIns/SingleColumn                       |    22 +
 res/ChartAddIns/Sort                               |    29 +
 res/DatapanelAddIns/Character Plot                 |   177 +
 res/DatapanelAddIns/Character Plot Two             |   392 +
 res/DatapanelAddIns/Compare Subsets                |   141 +
 res/DatapanelAddIns/Sequence Plot                  |   194 +
 res/DatapanelAddIns/TBD/Character Plot By Sequence |   382 +
 res/DatapanelAddIns/ibfs/char_colors.def           |    28 +
 res/GeneticCodes/Alt_Yeast_Nuclear.cod             |    67 +
 res/GeneticCodes/Ascidian_mtDNA.cod                |    67 +
 res/GeneticCodes/Blepharisma_Nuclear.cod           |    67 +
 res/GeneticCodes/Ciliate.cod                       |    68 +
 res/GeneticCodes/Echinoderm_mtDNA.cod              |    68 +
 res/GeneticCodes/Euplotid_Nuclear.cod              |    68 +
 res/GeneticCodes/Flatworm_mtDNA.cod                |    68 +
 res/GeneticCodes/Invertebrate_mtDNA.cod            |    67 +
 res/GeneticCodes/Mold_mtDNA.cod                    |    67 +
 res/GeneticCodes/Thraustochytrium_mtDNA.cod        |    69 +
 res/GeneticCodes/Vertebratemtdna.cod               |    99 +
 res/GeneticCodes/Yeast_mtDNA.cod                   |    67 +
 res/SubstitutionClasses/AAEFV/Equal                |     3 +
 res/SubstitutionClasses/AAEFV/Estimated            |    51 +
 res/SubstitutionClasses/AAEFV/Observed In Data Set |     8 +
 .../AAEFV/Observed In Partition                    |     8 +
 res/SubstitutionClasses/CodonEFV/Equal             |    20 +
 res/SubstitutionClasses/CodonEFV/Observed Codon    |   100 +
 .../CodonEFV/Observed Nuc 3 params.                |   121 +
 .../CodonEFV/Observed Nuc 9 params.                |   131 +
 .../Heterogeneity/2 Bin Discrete                   |    10 +
 res/SubstitutionClasses/Heterogeneity/Beta         |    11 +
 res/SubstitutionClasses/Heterogeneity/Beta-Gamma   |    21 +
 .../Heterogeneity/General Discrete                 |    68 +
 res/SubstitutionClasses/Heterogeneity/Half Normal  |    14 +
 res/SubstitutionClasses/Heterogeneity/Lognormal    |    11 +
 res/SubstitutionClasses/NucEFV/Equal               |     3 +
 res/SubstitutionClasses/NucEFV/Estimated           |    23 +
 .../NucEFV/Observed In Data Set                    |     7 +
 .../NucEFV/Observed In Partition                   |     8 +
 res/SubstitutionClasses/aa.bf                      |   137 +
 res/SubstitutionClasses/codon.bf                   |   374 +
 res/SubstitutionClasses/dinuc.bf                   |   103 +
 res/SubstitutionClasses/nuc.bf                     |    41 +
 res/SubstitutionModels/Aminoacid/Dayhoff.mdl       |   348 +
 res/SubstitutionModels/Aminoacid/EIAA.mdl          |    92 +
 res/SubstitutionModels/Aminoacid/Fitness.mdl       |    91 +
 res/SubstitutionModels/Aminoacid/Jones.mdl         |   802 +
 res/SubstitutionModels/Aminoacid/mtREV.mdl         |  1213 ++
 res/SubstitutionModels/Binary/F81.mdl              |    45 +
 res/SubstitutionModels/Codon/GY94_3x4.mdl          |   271 +
 .../Codon/Lineage_MG94xHKY85.mdl                   |   265 +
 res/SubstitutionModels/Codon/MG94.mdl              |   229 +
 res/SubstitutionModels/Codon/MG94REVOmegaCF3x4.mdl |   427 +
 res/SubstitutionModels/Codon/MG94_3x4.mdl          |   222 +
 res/SubstitutionModels/Codon/MG94_HKY85x3_4.mdl    |   243 +
 res/SubstitutionModels/Codon/MG94_REV_3x4.mdl      |   416 +
 res/SubstitutionModels/Codon/MG94_REV_3x4.mdl copy |     0
 .../Codon/MG94xHKY85_3x4_2Rates.mdl                |   233 +
 .../Codon/MG94xREV_3x4_DualRV.mdl                  |   365 +
 .../Codon/MG94xREV_3x4_DualRV_GDD.mdl              |   500 +
 res/SubstitutionModels/Codon/MG94xTN93_3x4.mdl     |   413 +
 res/SubstitutionModels/Nucleotide/EFVEstimated.ibf |    27 +
 res/SubstitutionModels/Nucleotide/F81.mdl          |    59 +
 res/SubstitutionModels/Nucleotide/HKY85.mdl        |    72 +
 res/SubstitutionModels/Nucleotide/REV.mdl          |    74 +
 res/SubstitutionModels/Nucleotide/REVBetaGamma.mdl |    86 +
 res/SubstitutionModels/Nucleotide/TrN.mdl          |    70 +
 res/SubstitutionModels/User/Nucleotide/JC69        |    31 +
 res/SubstitutionModels/User/Nucleotide/K2P         |    31 +
 res/TemplateBatchFiles/2RatesAnalyses/GY94.mdl     |   353 +
 .../2RatesAnalyses/MG94GY94xREV_PARRIS_syn3.mdl    |   285 +
 res/TemplateBatchFiles/2RatesAnalyses/MG94xREV.mdl |   221 +
 .../2RatesAnalyses/MG94xREVxBivariate.mdl          |   158 +
 .../MG94xREVxBivariate_Multirate.mdl               |   193 +
 .../2RatesAnalyses/PARRIS_M1.def                   |    16 +
 .../2RatesAnalyses/PARRIS_M2.def                   |    22 +
 .../2RatesAnalyses/PARRIS_M3.def                   |    24 +
 .../2RatesAnalyses/PARRIS_syn3.def                 |    26 +
 .../2RatesAnalyses/PARRIS_synvar.def               |    24 +
 .../2RatesAnalyses/discreteGenerator.bf            |   261 +
 .../2RatesAnalyses/discreteGeneratorNoPS.bf        |   184 +
 res/TemplateBatchFiles/2RatesAnalyses/gamma1.def   |    35 +
 .../2RatesAnalyses/gamma2+Inv.def                  |    47 +
 res/TemplateBatchFiles/2RatesAnalyses/gamma2.def   |    32 +
 res/TemplateBatchFiles/454.bf                      |   537 +
 res/TemplateBatchFiles/AAModelComparison.bf        |   252 +
 res/TemplateBatchFiles/AddABias.ibf                |   279 +
 res/TemplateBatchFiles/AnalyzeCodonData.bf         |    53 +
 res/TemplateBatchFiles/AnalyzeCodonDataMPI.bf      |    71 +
 res/TemplateBatchFiles/AnalyzeDiNucData.bf         |    28 +
 res/TemplateBatchFiles/AnalyzeNucDataFreq.bf       |    46 +
 res/TemplateBatchFiles/AnalyzeNucDataFreq2.bf      |    58 +
 res/TemplateBatchFiles/AnalyzeNucProtData.bf       |    28 +
 res/TemplateBatchFiles/AnalyzeNucProtData2.bf      |   133 +
 res/TemplateBatchFiles/BGM.bf                      |   248 +
 res/TemplateBatchFiles/BS2007.bf                   |   295 +
 res/TemplateBatchFiles/BUSTED-SRV.bf               |   551 +
 res/TemplateBatchFiles/BUSTED.bf                   |   499 +
 .../BivariateCodonRateAnalysis.bf                  |   120 +
 res/TemplateBatchFiles/BranchClassDNDS.bf          |   460 +
 res/TemplateBatchFiles/BranchSiteREL.bf            |  1080 +
 res/TemplateBatchFiles/BranchSiteRELMultiModel.bf  |   575 +
 res/TemplateBatchFiles/BranchSwap.bf               |   440 +
 res/TemplateBatchFiles/CleanGaps.bf                |   112 +
 res/TemplateBatchFiles/CleanStopCodons.bf          |   244 +
 res/TemplateBatchFiles/ClusterAnalysis.bf          |   535 +
 res/TemplateBatchFiles/ClusterByDistanceRange.bf   |   655 +
 .../CodonBivariateRateProcessor.bf                 |   444 +
 res/TemplateBatchFiles/CodonModelCompare.bf        |  1046 +
 res/TemplateBatchFiles/CodonToProtein.bf           |   181 +
 res/TemplateBatchFiles/CodonUsageBias.bf           |   571 +
 res/TemplateBatchFiles/CompareSelectivePressure.bf |   937 +
 .../CompareSelectivePressureIVL.bf                 |   970 +
 res/TemplateBatchFiles/ConvertDataFile.bf          |    57 +
 res/TemplateBatchFiles/DatedTipsMolecularClock.bf  |   598 +
 res/TemplateBatchFiles/DirectionalREL.bf           |   570 +
 res/TemplateBatchFiles/DirectionalREL_MF.bf        |   523 +
 res/TemplateBatchFiles/DistanceMatrix.bf           |   312 +
 res/TemplateBatchFiles/DistanceMatrix_Splits.bf    |   258 +
 res/TemplateBatchFiles/Distances/CodonTools.def    |    17 +
 res/TemplateBatchFiles/Distances/CodonTools2.def   |    18 +
 .../Distances/CodonToolsMain.def                   |   344 +
 res/TemplateBatchFiles/Distances/JC69              |    26 +
 res/TemplateBatchFiles/Distances/K2P               |    33 +
 res/TemplateBatchFiles/Distances/K2P_RV            |    42 +
 .../Distances/Modified_Nei_Gojobori                |   155 +
 res/TemplateBatchFiles/Distances/Nei_Gojobori      |   147 +
 res/TemplateBatchFiles/Distances/PC                |    15 +
 res/TemplateBatchFiles/Distances/PC_MH             |    20 +
 res/TemplateBatchFiles/Distances/PC_RV             |    23 +
 res/TemplateBatchFiles/Distances/T3P               |    39 +
 res/TemplateBatchFiles/Distances/TN84              |    46 +
 res/TemplateBatchFiles/Distances/TN93              |    81 +
 res/TemplateBatchFiles/Distances/TN93_RV           |    61 +
 res/TemplateBatchFiles/Distances/Unaligned_LZ      |    29 +
 res/TemplateBatchFiles/Distances/Unaligned_LZ_FR   |    68 +
 res/TemplateBatchFiles/Distances/p_Distance        |    16 +
 res/TemplateBatchFiles/Distances/p_Distance_aa     |    19 +
 res/TemplateBatchFiles/Distances/p_Distance_binary |    16 +
 res/TemplateBatchFiles/Distances/p_Distance_codon  |    61 +
 res/TemplateBatchFiles/FUBAR.bf                    |   209 +
 res/TemplateBatchFiles/FUBAR_HBL/FUBAR_PHASE_1.bf  |    23 +
 res/TemplateBatchFiles/FUBAR_HBL/FUBAR_PHASE_2.bf  |   133 +
 res/TemplateBatchFiles/FUBAR_HBL/FUBAR_PHASE_3.bf  |   245 +
 res/TemplateBatchFiles/FUBAR_HBL/FUBAR_PHASE_4.bf  |   106 +
 res/TemplateBatchFiles/FUBAR_HBL/FUBAR_PHASE_5.bf  |   168 +
 res/TemplateBatchFiles/FUBAR_HBL/FUBAR_tools.ibf   |   359 +
 res/TemplateBatchFiles/F_ST.bf                     |   742 +
 res/TemplateBatchFiles/FitnessAAModels.bf          |   394 +
 res/TemplateBatchFiles/GADatedClock.bf             |   716 +
 res/TemplateBatchFiles/GADatedClock.ibf            |   250 +
 res/TemplateBatchFiles/GADatedClockProcessor.bf    |   347 +
 res/TemplateBatchFiles/GADatedClockProcessorM.bf   |   420 +
 res/TemplateBatchFiles/GARD.bf                     |  1385 ++
 res/TemplateBatchFiles/GARDProcessor.bf            |   768 +
 res/TemplateBatchFiles/GARD_GA_CHC.ibf             |   446 +
 res/TemplateBatchFiles/GARecomb.bf                 |   973 +
 res/TemplateBatchFiles/GA_CHC.ibf                  |   458 +
 res/TemplateBatchFiles/GA_CHC_Binary.ibf           |   599 +
 res/TemplateBatchFiles/GA_CHC_kernel.ibf           |   447 +
 res/TemplateBatchFiles/GUI/crayolaColors.def       |     1 +
 res/TemplateBatchFiles/Gateaux.bf                  |   332 +
 res/TemplateBatchFiles/Gateaux2.bf                 |   302 +
 res/TemplateBatchFiles/GateauxMR.bf                |   328 +
 res/TemplateBatchFiles/KHTest.bf                   |   317 +
 res/TemplateBatchFiles/Kernel_PCA.bf               |    62 +
 res/TemplateBatchFiles/Kernel_k_means.bf           |   245 +
 res/TemplateBatchFiles/Kernel_support.ibf          |   177 +
 res/TemplateBatchFiles/LHT.bf                      |   207 +
 res/TemplateBatchFiles/LRTRecombTest.bf            |   309 +
 res/TemplateBatchFiles/LZ_Complexity.bf            |    78 +
 res/TemplateBatchFiles/LocalBranchSiteTest.bf      |   373 +
 res/TemplateBatchFiles/LocalMolClock.bf            |   265 +
 res/TemplateBatchFiles/MEDS.bf                     |   479 +
 res/TemplateBatchFiles/MEME_mf.bf                  |   793 +
 res/TemplateBatchFiles/MFPSreader.def              |   103 +
 res/TemplateBatchFiles/MFPositiveSelection.bf      |  1113 +
 .../MFPositiveSelectionPooled.bf                   |   876 +
 res/TemplateBatchFiles/MGvsGY.bf                   |   698 +
 res/TemplateBatchFiles/MaxChi2.bf                  |   245 +
 res/TemplateBatchFiles/MergeSequences.bf           |    37 +
 res/TemplateBatchFiles/MergeSites.bf               |    37 +
 res/TemplateBatchFiles/ModelSelectorAAProcessor.bf |   377 +
 res/TemplateBatchFiles/ModelSelectorBranch.bf      |   745 +
 res/TemplateBatchFiles/ModelSelectorCodon.bf       |   998 +
 res/TemplateBatchFiles/ModelSelectorCodon.ibf      |    44 +
 .../ModelSelectorCodonProcessor.bf                 |   945 +
 res/TemplateBatchFiles/ModelSelectorRNA.bf         |   596 +
 res/TemplateBatchFiles/ModelSelectorRNA_1.bf       |   798 +
 res/TemplateBatchFiles/ModelTest.bf                |   725 +
 res/TemplateBatchFiles/MolClockAllRoots.bf         |   267 +
 res/TemplateBatchFiles/MolecularClock.bf           |   147 +
 res/TemplateBatchFiles/NeighborJoining.bf          |   189 +
 res/TemplateBatchFiles/NielsenYang.bf              |  1209 ++
 res/TemplateBatchFiles/NucModelCompare.bf          |  1087 +
 res/TemplateBatchFiles/PARRIS.bf                   |  1427 ++
 res/TemplateBatchFiles/PairwiseDNDS.bf             |     0
 res/TemplateBatchFiles/PairwiseRelativeRate.bf     |   331 +
 res/TemplateBatchFiles/PairwiseRelativeRatio.bf    |   373 +
 res/TemplateBatchFiles/PairwiseSiteDiversity.bf    |   202 +
 res/TemplateBatchFiles/PartitionDataFile.bf        |    45 +
 res/TemplateBatchFiles/PartitionRateComparison.bf  |   800 +
 res/TemplateBatchFiles/Phylohandbook.bf            |     2 +
 res/TemplateBatchFiles/Plato.bf                    |   313 +
 res/TemplateBatchFiles/PositiveSelectionLI.bf      |  1810 ++
 res/TemplateBatchFiles/QuickSelectionDetection.bf  |  1727 ++
 .../QuickSelectionDetectionMF.bf                   |   384 +
 res/TemplateBatchFiles/RELAX.bf                    |   724 +
 res/TemplateBatchFiles/RateClassCounter.bf         |   918 +
 res/TemplateBatchFiles/ReduceDataSetMatrix.bf      |   405 +
 res/TemplateBatchFiles/RelativeRate.bf             |   163 +
 res/TemplateBatchFiles/RelativeRateL.bf            |   340 +
 res/TemplateBatchFiles/RelativeRatio.bf            |   258 +
 res/TemplateBatchFiles/SGASimProcessor.bf          |   547 +
 res/TemplateBatchFiles/SGEmulator.bf               |   919 +
 res/TemplateBatchFiles/SGEmulator_MF.bf            |   741 +
 res/TemplateBatchFiles/SGIvL.bf                    |   758 +
 res/TemplateBatchFiles/SSRatesTest.bf              |   116 +
 res/TemplateBatchFiles/SampleProcessor.bf          |  1340 ++
 res/TemplateBatchFiles/Samplers/lhc.bf             |   233 +
 res/TemplateBatchFiles/Samplers/lhc_supp.ibf       |    48 +
 res/TemplateBatchFiles/Samplers/sir.bf             |   135 +
 res/TemplateBatchFiles/Samplers/srs.ibf            |   339 +
 res/TemplateBatchFiles/SandNSAmbigs.bf             |   455 +
 res/TemplateBatchFiles/SelectionLRT.bf             |   367 +
 res/TemplateBatchFiles/SeqAlignShared.ibf          |   783 +
 res/TemplateBatchFiles/SeqAlignment.bf             |    54 +
 res/TemplateBatchFiles/SeqAlignmentCodon.bf        |     7 +
 res/TemplateBatchFiles/SeqAlignmentCodonShared.ibf |   212 +
 res/TemplateBatchFiles/SeqAlignmentNuc.bf          |   101 +
 res/TemplateBatchFiles/SeqAlignmentNucShared.ibf   |   290 +
 res/TemplateBatchFiles/SeqAlignmentProt.bf         |   232 +
 res/TemplateBatchFiles/SeqAlignmentTop75.bf        |   638 +
 res/TemplateBatchFiles/SequentialAddition.bf       |   191 +
 res/TemplateBatchFiles/SequentialAddition.ibf      |   618 +
 res/TemplateBatchFiles/SimilarityPlot.bf           |   167 +
 res/TemplateBatchFiles/SimmondsAI.bf               |   337 +
 res/TemplateBatchFiles/SimpleMutationCounter.bf    |   261 +
 res/TemplateBatchFiles/SingleBreakpointRecomb-2.bf |   726 +
 res/TemplateBatchFiles/SingleBreakpointRecomb.bf   |  1183 ++
 res/TemplateBatchFiles/SiteRates.bf                |   226 +
 res/TemplateBatchFiles/SiteRates2.bf               |   273 +
 res/TemplateBatchFiles/SlatkinMaddison-2parts.bf   |   395 +
 res/TemplateBatchFiles/SlatkinMaddison.bf          |   463 +
 res/TemplateBatchFiles/SlidingNucWindow.bf         |   104 +
 res/TemplateBatchFiles/SlidingWindowAnalysis.bf    |   277 +
 res/TemplateBatchFiles/SplitSequencesByPattern.bf  |    51 +
 res/TemplateBatchFiles/StarDecomposition.bf        |   566 +
 res/TemplateBatchFiles/StrandGRMTest.bf            |   109 +
 res/TemplateBatchFiles/StripStopCodons.bf          |   103 +
 .../SubtreeSelectionComparison.bf                  |   385 +
 res/TemplateBatchFiles/TemplateModels/190          |    23 +
 .../TemplateModels/BranchSiteTemplate.mdl          |   227 +
 res/TemplateBatchFiles/TemplateModels/CF3x4.bf     |   121 +
 .../TemplateModels/Custom_AA.mdl                   |   154 +
 .../TemplateModels/Custom_AA_empirical.mdl         |   168 +
 res/TemplateBatchFiles/TemplateModels/Dayhoff.mdl  |   832 +
 .../TemplateModels/Dayhoff_F.mdl                   |   812 +
 res/TemplateBatchFiles/TemplateModels/Default      |    25 +
 .../TemplateModels/ECM+F+omega.mdl                 |   154 +
 res/TemplateBatchFiles/TemplateModels/ECM+F.mdl    |   152 +
 res/TemplateBatchFiles/TemplateModels/ECM+F3x4.mdl |   180 +
 .../TemplateModels/ECM+MLFREQS.mdl                 |   162 +
 res/TemplateBatchFiles/TemplateModels/ECM.mdl      |   154 +
 res/TemplateBatchFiles/TemplateModels/EIAA.mdl     |    74 +
 res/TemplateBatchFiles/TemplateModels/EIAAFreq.mdl |   120 +
 res/TemplateBatchFiles/TemplateModels/EX.dat       |    23 +
 res/TemplateBatchFiles/TemplateModels/EX.mdl       |   790 +
 .../TemplateModels/EmpiricalAA/BLOSUM62            |    44 +
 .../TemplateModels/EmpiricalAA/Dayhoff             |    46 +
 .../TemplateModels/EmpiricalAA/H5N1                |    46 +
 .../TemplateModels/EmpiricalAA/HIVBetween          |    47 +
 .../TemplateModels/EmpiricalAA/HIVWithin           |    47 +
 .../TemplateModels/EmpiricalAA/IAV                 |    46 +
 .../TemplateModels/EmpiricalAA/JTT                 |    47 +
 .../TemplateModels/EmpiricalAA/LCAP                |   126 +
 .../TemplateModels/EmpiricalAA/LG                  |    44 +
 .../TemplateModels/EmpiricalAA/MtArt               |    44 +
 .../TemplateModels/EmpiricalAA/VT                  |    44 +
 .../TemplateModels/EmpiricalAA/WAG                 |    46 +
 .../TemplateModels/EmpiricalAA/cpREV               |    44 +
 .../TemplateModels/EmpiricalAA/modellist.ibf       |   168 +
 .../TemplateModels/EmpiricalAA/mtMAM               |    46 +
 .../TemplateModels/EmpiricalAA/mtREV24             |    46 +
 .../TemplateModels/EmpiricalAA/rtREV               |    46 +
 .../TemplateModels/EmpiricalCodon/KHG_ECM          |    71 +
 .../TemplateModels/EmpiricalCodon/KHG_ECMu         |    72 +
 res/TemplateBatchFiles/TemplateModels/F81.mdl      |    54 +
 .../TemplateModels/F81_binary.mdl                  |    49 +
 res/TemplateBatchFiles/TemplateModels/F84.mdl      |    96 +
 res/TemplateBatchFiles/TemplateModels/F84P.mdl     |   146 +
 res/TemplateBatchFiles/TemplateModels/GRM.mdl      |    71 +
 res/TemplateBatchFiles/TemplateModels/GY94.ibf     |   238 +
 res/TemplateBatchFiles/TemplateModels/GY94.mdl     |   100 +
 .../TemplateModels/GY94customF3x4.mdl              |   275 +
 res/TemplateBatchFiles/TemplateModels/GY94w9.mdl   |   118 +
 .../TemplateModels/HIVbetween+F.mdl                |    10 +
 .../TemplateModels/HIVbetween.ibf                  |    64 +
 .../TemplateModels/HIVbetween.mdl                  |    32 +
 .../TemplateModels/HIVwithin+F.mdl                 |    10 +
 .../TemplateModels/HIVwithin.ibf                   |    71 +
 .../TemplateModels/HIVwithin.mdl                   |    31 +
 res/TemplateBatchFiles/TemplateModels/HKY85.mdl    |    61 +
 res/TemplateBatchFiles/TemplateModels/JC69.mdl     |    56 +
 .../TemplateModels/JC69_binary.mdl                 |    51 +
 res/TemplateBatchFiles/TemplateModels/Jones.mdl    |   839 +
 res/TemplateBatchFiles/TemplateModels/Jones_F.mdl  |   804 +
 res/TemplateBatchFiles/TemplateModels/K2P.mdl      |    64 +
 res/TemplateBatchFiles/TemplateModels/K3ST.mdl     |    64 +
 res/TemplateBatchFiles/TemplateModels/LCAP.mdl     |   315 +
 res/TemplateBatchFiles/TemplateModels/MEC.mdl      |   319 +
 res/TemplateBatchFiles/TemplateModels/MG94.mdl     |   277 +
 .../TemplateModels/MG94custom.mdl                  |   377 +
 .../TemplateModels/MG94customCF3x4.mdl             |   378 +
 .../TemplateModels/MG94customF1x4.mdl              |   378 +
 .../TemplateModels/MG94customFreqs.mdl             |   351 +
 res/TemplateBatchFiles/TemplateModels/MG94wAA.mdl  |   273 +
 .../TemplateModels/MG94wAAF61.mdl                  |   244 +
 .../TemplateModels/MG94wAAF61multiple.mdl          |   265 +
 .../TemplateModels/MG94wAAFreqs.mdl                |   241 +
 .../TemplateModels/MG94wAAUserFreqs.mdl            |   247 +
 res/TemplateBatchFiles/TemplateModels/MG94wEX.mdl  |   238 +
 .../TemplateModels/MG94with9freqs.mdl              |   287 +
 res/TemplateBatchFiles/TemplateModels/MG94x2.mdl   |   396 +
 .../TemplateModels/MGFreqsEstimator.ibf            |    66 +
 res/TemplateBatchFiles/TemplateModels/MGwAA.ibf    |   126 +
 res/TemplateBatchFiles/TemplateModels/MGwEX.ibf    |   106 +
 .../TemplateModels/NRM+Freqs.mdl                   |    70 +
 res/TemplateBatchFiles/TemplateModels/NRM.mdl      |    67 +
 res/TemplateBatchFiles/TemplateModels/PCH          |    25 +
 res/TemplateBatchFiles/TemplateModels/RNA16.mdl    |   203 +
 res/TemplateBatchFiles/TemplateModels/RNA16A       |    18 +
 res/TemplateBatchFiles/TemplateModels/RNA16SvH.mdl |   143 +
 .../TemplateModels/RNAEqualInput                   |    19 +
 res/TemplateBatchFiles/TemplateModels/RNAF81       |    18 +
 .../TemplateModels/RNAMuse95.mdl                   |   164 +
 res/TemplateBatchFiles/TemplateModels/RNAREV       |    19 +
 res/TemplateBatchFiles/TemplateModels/RNAREV_1     |    19 +
 res/TemplateBatchFiles/TemplateModels/S4           |    24 +
 res/TemplateBatchFiles/TemplateModels/STGRM.mdl    |    75 +
 res/TemplateBatchFiles/TemplateModels/TrN.mdl      |    64 +
 .../TemplateModels/UniversalCode.def               |   192 +
 res/TemplateBatchFiles/TemplateModels/WAG.mdl      |   814 +
 res/TemplateBatchFiles/TemplateModels/WAG_F.mdl    |   792 +
 .../TemplateModels/Yang2000Distributions.def       |   330 +
 .../TemplateModels/chooseGeneticCode.def           |   624 +
 res/TemplateBatchFiles/TemplateModels/custm4x4.mdl |   371 +
 .../TemplateModels/defineGamma.mdl                 |   456 +
 res/TemplateBatchFiles/TemplateModels/defineHM.mdl |   421 +
 res/TemplateBatchFiles/TemplateModels/fitness.mdl  |    90 +
 .../TemplateModels/modelParameters.mdl             |    18 +
 .../TemplateModels/modelParameters2.mdl            |    17 +
 .../TemplateModels/modelParameters3.mdl            |    18 +
 .../TemplateModels/modelParameters4.mdl            |    28 +
 .../TemplateModels/modelParameters5.mdl            |    17 +
 res/TemplateBatchFiles/TemplateModels/models.lst   |    65 +
 res/TemplateBatchFiles/TemplateModels/mtMAM.mdl    |   518 +
 res/TemplateBatchFiles/TemplateModels/mtMAM_F.mdl  |   499 +
 res/TemplateBatchFiles/TemplateModels/mtREV.mdl    |    83 +
 res/TemplateBatchFiles/TemplateModels/mtREV_24.mdl |   814 +
 .../TemplateModels/mtREV_24_F.mdl                  |   793 +
 .../TemplateModels/reducedREV.mdl                  |   158 +
 res/TemplateBatchFiles/TemplateModels/rtREV.mdl    |   813 +
 res/TemplateBatchFiles/TemplateModels/rtREV_F.mdl  |   794 +
 res/TemplateBatchFiles/TestBranchDNDS.bf           |   446 +
 res/TemplateBatchFiles/TestClade.bf                |  1081 +
 res/TemplateBatchFiles/TestCladeMeans.bf           |   420 +
 res/TemplateBatchFiles/TopologySearch.bf           |   498 +
 .../TopologySearchConstrained.bf                   |   411 +
 .../TreeCorrelationCoefficients.bf                 |   337 +
 res/TemplateBatchFiles/TreeTools.ibf               |   819 +
 res/TemplateBatchFiles/UpperBound.bf               |    61 +
 res/TemplateBatchFiles/Utility/AncestralMapper.bf  |   740 +
 .../Utility/BranchLengthFitters.bf                 |    94 +
 .../Utility/CoalescentPostProcessor.bf             |   504 +
 res/TemplateBatchFiles/Utility/CodonTools.bf       |    67 +
 res/TemplateBatchFiles/Utility/DBTools.ibf         |   216 +
 .../Utility/DescriptiveStatistics.bf               |   117 +
 res/TemplateBatchFiles/Utility/GrabBag.bf          |   961 +
 res/TemplateBatchFiles/Utility/HXB2Mapper.bf       |   421 +
 res/TemplateBatchFiles/Utility/LocalMGREV.bf       |   141 +
 .../Utility/LocalMGREVMLFreqs.bf                   |   233 +
 res/TemplateBatchFiles/Utility/MPITools.bf         |    85 +
 res/TemplateBatchFiles/Utility/NJ.bf               |   253 +
 res/TemplateBatchFiles/Utility/PS_Plotters.bf      |  1662 ++
 res/TemplateBatchFiles/Utility/PostScript.bf       |   339 +
 .../Utility/ProbabilityDistributions.bf            |    92 +
 .../Utility/ReadDelimitedFiles.bf                  |   511 +
 res/TemplateBatchFiles/Utility/TreeFunctions.bf    |    58 +
 .../Utility/WriteDelimitedFiles.bf                 |    55 +
 res/TemplateBatchFiles/WANC.bf                     |   379 +
 res/TemplateBatchFiles/WebUpdate.bf                |   213 +
 .../YangNielsenBranchSite2005.bf                   |   513 +
 res/TemplateBatchFiles/_BMS_Aux.ibf                |   174 +
 res/TemplateBatchFiles/_CMS_Aux.ibf                |   344 +
 res/TemplateBatchFiles/_MFReader_.ibf              |   219 +
 res/TemplateBatchFiles/_MSCOneStep.ibf             |    62 +
 res/TemplateBatchFiles/_tipDater.ibf               |    83 +
 res/TemplateBatchFiles/bayesgraph.ibf              |   845 +
 res/TemplateBatchFiles/binomial.ibf                |    89 +
 res/TemplateBatchFiles/branchSwappingFunctions.bf  |   411 +
 res/TemplateBatchFiles/categoryEcho.bf             |   169 +
 res/TemplateBatchFiles/chooseDistanceFormula.def   |    95 +
 .../dNdSBivariateRateAnalysis.bf                   |   827 +
 .../dNdSBivariateRateAnalysis_CompareDS.bf         |   850 +
 .../dNdSDistributionComparison.bf                  |  1025 +
 .../dNdSDistributionComparisonMF.bf                |     0
 .../dNdSDistributionComparisonPartitions.bf        |   996 +
 res/TemplateBatchFiles/dNdSRateAnalysis.bf         |   980 +
 res/TemplateBatchFiles/dNdSRateAnalysis_MF.bf      |   835 +
 res/TemplateBatchFiles/dNdSResultProcessor.bf      |  1374 ++
 res/TemplateBatchFiles/dSdNTreeTools.ibf           |   104 +
 .../distanceMethodNPBootstrap.bf                   |   443 +
 .../distanceRMethodNPBootstrap.bf                  |   373 +
 res/TemplateBatchFiles/doNNISwap.bf                |   150 +
 res/TemplateBatchFiles/doSPRSwap.bf                |   133 +
 res/TemplateBatchFiles/files.lst                   |   102 +
 res/TemplateBatchFiles/globalChecker.ibf           |    26 +
 .../heuristicMethodNPBootstrap.bf                  |   273 +
 res/TemplateBatchFiles/last.date                   |     1 +
 res/TemplateBatchFiles/lib2014/IOFunctions.bf      |   125 +
 res/TemplateBatchFiles/lib2014/UtilityFunctions.bf |   108 +
 res/TemplateBatchFiles/lib2014/models/DNA.bf       |    65 +
 res/TemplateBatchFiles/lib2014/models/DNA/GTR.bf   |    60 +
 res/TemplateBatchFiles/lib2014/models/codon.bf     |   103 +
 .../lib2014/models/codon/MG_REV.bf                 |   109 +
 .../lib2014/models/frequencies.bf                  |   173 +
 .../lib2014/models/model_functions.bf              |   183 +
 .../lib2014/models/parameters.bf                   |   263 +
 res/TemplateBatchFiles/lib2014/models/terms.bf     |    41 +
 res/TemplateBatchFiles/lib2014/tasks/estimators.bf |   223 +
 res/TemplateBatchFiles/molclockBootstrap.bf        |   245 +
 .../pairwiseDistanceEstimator.ibf                  |   370 +
 .../pairwiseDistanceEstimatorCounter.ibf           |    10 +
 res/TemplateBatchFiles/partitionSequences.ibf      |    95 +
 res/TemplateBatchFiles/post_ancestors.bf           |    27 +
 res/TemplateBatchFiles/post_counting.bf            |    54 +
 res/TemplateBatchFiles/post_covariance.bf          |    54 +
 res/TemplateBatchFiles/post_dNdS.bf                |   144 +
 res/TemplateBatchFiles/post_lfprofile.bf           |    18 +
 res/TemplateBatchFiles/post_npbs.bf                |    16 +
 res/TemplateBatchFiles/post_pbs.bf                 |    15 +
 res/TemplateBatchFiles/post_sampler.bf             |   210 +
 res/TemplateBatchFiles/post_saveResults.bf         |    37 +
 res/TemplateBatchFiles/post_sns.bf                 |    96 +
 res/TemplateBatchFiles/post_variance.bf            |   141 +
 res/TemplateBatchFiles/post_viewResults.bf         |    34 +
 res/TemplateBatchFiles/postprocessors.lst          |    16 +
 res/TemplateBatchFiles/qndhelper1.ibf              |   860 +
 res/TemplateBatchFiles/qndhelper1_mf.ibf           |   310 +
 res/TemplateBatchFiles/qndhelper2.ibf              |   431 +
 res/TemplateBatchFiles/qndhelper2_mf.ibf           |   448 +
 res/TemplateBatchFiles/qndhelper3.ibf              |   149 +
 res/TemplateBatchFiles/qndhelper4.ibf              |   174 +
 res/TemplateBatchFiles/queryTree.bf                |   142 +
 res/TemplateBatchFiles/readIndexFile.bf            |    23 +
 res/TemplateBatchFiles/relrateBootstrap.bf         |   375 +
 res/TemplateBatchFiles/relrateBootstrapL.bf        |   232 +
 res/TemplateBatchFiles/relratioBootstrap.bf        |   131 +
 res/TemplateBatchFiles/selectModelParameters.bf    |    23 +
 res/TemplateBatchFiles/simpleBootstrap.bf          |   389 +
 res/TopologyInference/Exhaustive_Search            |   414 +
 res/TopologyInference/Neighbor_Joining             |   161 +
 res/TopologyInference/Sequential_Addition          |   636 +
 res/TopologyInference/Star_Decomposition           |   555 +
 .../Support/branchSwappingFunctions.bf             |   411 +
 res/TopologyInference/Support/doNNISwap.bf         |    91 +
 res/TopologyInference/Support/doSPRSwap.bf         |   115 +
 res/TreeAddIns/Splits                              |    38 +
 res/TreeAddIns/Tree Statistics                     |   195 +
 res/UserAddins/AAContent                           |    43 +
 res/UserAddins/BatchFileByURL                      |     9 +
 res/UserAddins/BranchLengthCI                      |    93 +
 res/UserAddins/CodonMutationToTreeMapper           |   304 +
 res/UserAddins/CountSubstitutions                  |    88 +
 res/UserAddins/ExportLikelihoodFunction            |    32 +
 res/UserAddins/GenBankSequences                    |    32 +
 res/UserAddins/Includes/ChooseALF.ibf              |    32 +
 res/UserAddins/Includes/MappersHelp.ibf            |   202 +
 res/UserAddins/Includes/MappersHelpAA.ibf          |   139 +
 res/UserAddins/LRT                                 |    10 +
 res/UserAddins/ListUserFunctions                   |    21 +
 res/UserAddins/MapSubstitutions                    |    97 +
 res/UserAddins/MeanPairwiseDivergence              |    70 +
 res/UserAddins/MeanPairwiseDivergenceSubset        |   161 +
 res/UserAddins/ModelCounter                        |    39 +
 res/UserAddins/OldAddins/AAMutationCounter         |   311 +
 .../OldAddins/CodonMutationToTreeMapper.bf         |   477 +
 res/UserAddins/OldAddins/ColorPSTree               |   156 +
 res/UserAddins/OldAddins/ConvergentAndParallel     |   303 +
 res/UserAddins/OldAddins/CopyBranchLengths         |    27 +
 res/UserAddins/OldAddins/DashPSTree                |   141 +
 res/UserAddins/OldAddins/ExpsPerDirection          |    36 +
 res/UserAddins/OldAddins/FilterAssignments         |    55 +
 .../OldAddins/InferredAASubstitutionsCounter       |   479 +
 res/UserAddins/OldAddins/LocaldNdS                 |    67 +
 res/UserAddins/OldAddins/ModelFitSummary           |    25 +
 res/UserAddins/OldAddins/ModelFitSummaryAA         |    54 +
 .../OldAddins/Multiclass DN DS inference           |   229 +
 .../OldAddins/PartitionBranchesByClasses           |    44 +
 res/UserAddins/OldAddins/PredictivePosteriorP      |   322 +
 res/UserAddins/OldAddins/RNARateMatrix             |    64 +
 res/UserAddins/OldAddins/SimulateAndTabDN_DS       |   106 +
 res/UserAddins/OldAddins/SimulateFromLF            |    37 +
 res/UserAddins/OldAddins/TreeLengthConstraint      |    81 +
 res/UserAddins/OldAddins/dNanddSTrees.bf           |   203 +
 res/UserAddins/OldAddins/dS and dN factors         |    37 +
 res/UserAddins/RecombinationProcessor.bf           |   728 +
 res/UserAddins/SimulateFromLF                      |    27 +
 res/UserAddins/Tidbits                             |    18 +
 res/data/brown.nuc                                 |    83 +
 res/data/integrase_BDA.nex                         |    33 +
 res/data/p51.aa                                    |    35 +
 res/data/p51.nex                                   |    30 +
 scripts/build.sh                                   |   414 +
 scripts/buildFromSVN.sh                            |    65 +
 scripts/buildMinGWFromSVN.sh                       |    59 +
 scripts/build_mingw.sh                             |   115 +
 scripts/build_mingw_MEGA.sh                        |   117 +
 scripts/build_mingw_gui.sh                         |   162 +
 scripts/gtk_build.sh                               |   217 +
 scripts/intelCCbuild.sh                            |     1 +
 src/core/_hyExecutionContext.cpp                   |    73 +
 src/core/alignment.cpp                             |  1640 ++
 src/core/avllist.cpp                               |   892 +
 src/core/avllistx.cpp                              |   163 +
 src/core/avllistxl.cpp                             |   175 +
 src/core/baseobj.cpp                               |   735 +
 src/core/batchlan.cpp                              |  7599 +++++++
 src/core/batchlan2.cpp                             |  2366 +++
 src/core/batchlanhelpers.cpp                       |   442 +
 src/core/batchlanruntime.cpp                       |  1429 ++
 src/core/calcnode.cpp                              | 11586 +++++++++++
 src/core/calcnode2.cpp                             |  2485 +++
 src/core/category.cpp                              |  1268 ++
 src/core/classes.cp                                |   556 +
 src/core/constant.cpp                              |   821 +
 src/core/error.cpp                                 |   479 +
 src/core/fisher_exact.cpp                          |  2395 +++
 src/core/formula.cpp                               |  2678 +++
 src/core/fstring.cpp                               |   888 +
 src/core/include/_hyExecutionContext.h             |    65 +
 src/core/include/alignment.h                       |    50 +
 src/core/include/avllist.h                         |   109 +
 src/core/include/avllistx.h                        |    79 +
 src/core/include/avllistxl.h                       |    76 +
 src/core/include/baseobj.h                         |   172 +
 src/core/include/batchlan.h                        |   682 +
 src/core/include/calcnode.h                        |   863 +
 src/core/include/category.h                        |   232 +
 src/core/include/classes.h                         |   188 +
 src/core/include/constant.h                        |   121 +
 src/core/include/defines.h                         |   298 +
 src/core/include/errorfns.h                        |    91 +
 src/core/include/formula.h                         |   218 +
 src/core/include/fstring.h                         |   110 +
 src/core/include/gnuregex.h                        |   490 +
 src/core/include/hy_strings.h                      |   976 +
 src/core/include/likefunc.h                        |   798 +
 src/core/include/list.h                            |   358 +
 src/core/include/mathobj.h                         |   316 +
 src/core/include/matrix.h                          |   774 +
 src/core/include/mypthread.h                       |     1 +
 src/core/include/operation.h                       |   149 +
 src/core/include/parser.h                          |   208 +
 src/core/include/polynoml.h                        |   203 +
 src/core/include/sequence.h                        |   129 +
 src/core/include/simplelist.h                      |   478 +
 src/core/include/site.h                            |   640 +
 src/core/include/stack.h                           |    71 +
 src/core/include/trie.h                            |   265 +
 src/core/include/variable.h                        |   173 +
 src/core/include/variablecontainer.h               |   156 +
 src/core/likefunc.cpp                              | 10815 ++++++++++
 src/core/likefunc2.cpp                             |  1397 ++
 src/core/likefuncocl.cpp                           |  1158 ++
 src/core/list.cpp                                  |   684 +
 src/core/mathobj.cpp                               |   176 +
 src/core/matrix.cpp                                |  9914 +++++++++
 src/core/nexus.cpp                                 |  1413 ++
 src/core/operation.cpp                             |   613 +
 src/core/parser.cpp                                |  1210 ++
 src/core/parser2.cpp                               |  1809 ++
 src/core/polynoml.cpp                              |  2858 +++
 src/core/ptr_array.cp                              |    97 +
 src/core/regex.cpp                                 |  5075 +++++
 src/core/sequence.cpp                              |   760 +
 src/core/simplelist.cpp                            |  1744 ++
 src/core/site.cpp                                  |  6529 ++++++
 src/core/stack.cpp                                 |    94 +
 src/core/strings.cpp                               |  2518 +++
 src/core/trie.cpp                                  |   463 +
 src/core/variable.cpp                              |   676 +
 src/core/variablecontainer.cpp                     |  1188 ++
 src/gui/Components/HYButton.cpp                    |     1 +
 src/gui/Components/HYButtonBar.cpp                 |   199 +
 src/gui/Components/HYCheckBox.cpp                  |     1 +
 src/gui/Components/HYLabel.cpp                     |     1 +
 src/gui/Components/HYPullDown.cpp                  |   192 +
 src/gui/Components/HYSequencePanel.cpp             |  1667 ++
 src/gui/Components/HYTable.cpp                     |     1 +
 src/gui/Components/HYTextBox.cpp                   |     1 +
 src/gui/HYBaseGUI.cpp                              |   227 +
 src/gui/HYChartWindow.cpp                          |  5004 +++++
 src/gui/HYComponent.cpp                            |     1 +
 src/gui/HYConsoleWindow.cpp                        |   794 +
 src/gui/HYDBWindow.cpp                             |  1194 ++
 src/gui/HYDataPanel.cpp                            |  9218 +++++++++
 src/gui/HYDialogDefs.cpp                           |  4932 +++++
 src/gui/HYEventTypes.cpp                           |   362 +
 src/gui/HYGraphicPane.cpp                          |   599 +
 src/gui/HYModelWindow.cpp                          |  4109 ++++
 src/gui/HYObjectInspector.cpp                      |   971 +
 src/gui/HYParameterTable.cpp                       |  4990 +++++
 src/gui/HYSharedMain.cpp                           |   486 +
 src/gui/HYTreePanel.cpp                            |  7787 +++++++
 src/gui/HYWindow.cpp                               |   863 +
 src/gui/gtk/Components/HYPlatformButton.cpp        |   257 +
 src/gui/gtk/Components/HYPlatformButtonBar.cpp     |   504 +
 src/gui/gtk/Components/HYPlatformCheckBox.cpp      |   199 +
 src/gui/gtk/Components/HYPlatformLabel.cpp         |   186 +
 src/gui/gtk/Components/HYPlatformPullDown.cpp      |   424 +
 src/gui/gtk/Components/HYPlatformSequencePane.cpp  |   307 +
 src/gui/gtk/Components/HYPlatformTable.cpp         |  1605 ++
 src/gui/gtk/Components/HYPlatformTextBox.cpp       |   585 +
 src/gui/gtk/HYPlatformComponent.cpp                |   562 +
 src/gui/gtk/HYPlatformGraphicPane.cpp              |   548 +
 src/gui/gtk/HYPlatformUtils.cpp                    |   665 +
 src/gui/gtk/HYPlatformWindow.cpp                   |   724 +
 .../gtk/WindowClasses/HYPlatformBootsrapWindow.cpp |    41 +
 .../gtk/WindowClasses/HYPlatformChartWindow.cpp    |   338 +
 .../gtk/WindowClasses/HYPlatformConsoleWindow.cpp  |   563 +
 src/gui/gtk/WindowClasses/HYPlatformDBWindow.cpp   |     1 +
 src/gui/gtk/WindowClasses/HYPlatformDataPanel.cpp  |   752 +
 src/gui/gtk/WindowClasses/HYPlatformGWindow.cpp    |    69 +
 .../gtk/WindowClasses/HYPlatformModelWindow.cpp    |   156 +
 src/gui/gtk/WindowClasses/HYPlatformPWindow.cpp    |   225 +
 .../gtk/WindowClasses/HYPlatformParameterTable.cpp |   251 +
 src/gui/gtk/WindowClasses/HYPlatformTWindow.cpp    |   545 +
 src/gui/gtk/WindowClasses/HYPlatformTreePanel.cpp  |   853 +
 src/gui/gtk/include/Components/HYPlatformButton.h  |    43 +
 .../gtk/include/Components/HYPlatformButtonBar.h   |    60 +
 .../gtk/include/Components/HYPlatformCheckbox.h    |    39 +
 src/gui/gtk/include/Components/HYPlatformLabel.h   |    41 +
 .../gtk/include/Components/HYPlatformPullDown.h    |    61 +
 src/gui/gtk/include/Components/HYPlatformTable.h   |    70 +
 src/gui/gtk/include/Components/HYPlatformTextbox.h |    64 +
 src/gui/gtk/include/HYPlatformComponent.h          |    78 +
 src/gui/gtk/include/HYPlatformGraphicPane.h        |    97 +
 src/gui/gtk/include/HYPlatformWindow.h             |   175 +
 src/gui/include/Components/HYButton.h              |    79 +
 src/gui/include/Components/HYButtonBar.h           |    98 +
 src/gui/include/Components/HYCanvas.h              |    73 +
 src/gui/include/Components/HYComponent.h           |   133 +
 src/gui/include/Components/HYLabel.h               |   229 +
 src/gui/include/Components/HYList.h                |    80 +
 src/gui/include/Components/HYPullDown.h            |    98 +
 src/gui/include/Components/HYSequencePanel.h       |   123 +
 src/gui/include/Components/HYTableComponent.h      |   237 +
 src/gui/include/Components/HYTextBox.h             |   117 +
 src/gui/include/HYBaseGUI.h                        |   126 +
 src/gui/include/HYDialogs.h                        |   406 +
 src/gui/include/HYEventTypes.h                     |    87 +
 src/gui/include/HYGraphicPane.h                    |   120 +
 src/gui/include/HYObjectInspector.h                |    50 +
 src/gui/include/HYSharedMain.h                     |   211 +
 src/gui/include/HYTableWindow.h                    |   100 +
 src/gui/include/HYUtils.h                          |   205 +
 src/gui/include/HYWindow.h                         |   119 +
 src/gui/include/WindowClasses/HYChartWindow.h      |   238 +
 src/gui/include/WindowClasses/HYConsoleWindow.h    |   102 +
 src/gui/include/WindowClasses/HYDBWindow.h         |    77 +
 src/gui/include/WindowClasses/HYDataPanel.h        |   629 +
 src/gui/include/WindowClasses/HYGWindow.h          |    87 +
 src/gui/include/WindowClasses/HYModelWindow.h      |   200 +
 src/gui/include/WindowClasses/HYParameterTable.h   |   224 +
 src/gui/include/WindowClasses/HYTreePanel.h        |   394 +
 src/gui/include/preferences.h                      |   111 +
 src/gui/include/shared_main.h                      |     0
 src/gui/mac/Components/HYPlatformButton.cpp        |     1 +
 src/gui/mac/Components/HYPlatformButtonBar.cpp     |     1 +
 src/gui/mac/Components/HYPlatformCheckBox.cpp      |     1 +
 src/gui/mac/Components/HYPlatformLabel.cpp         |     1 +
 src/gui/mac/Components/HYPlatformList.cpp          |     1 +
 src/gui/mac/Components/HYPlatformPullDown.cpp      |     1 +
 src/gui/mac/Components/HYPlatformSequencePane.cpp  |     1 +
 src/gui/mac/Components/HYPlatformTable.cpp         |     1 +
 src/gui/mac/Components/HYPlatformTextBox.cpp       |  1241 ++
 src/gui/mac/Docs.icns                              |   Bin 0 -> 169303 bytes
 src/gui/mac/HYPHY.icns                             |   Bin 0 -> 169303 bytes
 src/gui/mac/HYPHYMP.icns                           |   Bin 0 -> 169303 bytes
 src/gui/mac/HYPlatformComponent.cpp                |     1 +
 src/gui/mac/HYPlatformGraphicPane.cpp              |   607 +
 src/gui/mac/HYPlatformUtils.cpp                    |     1 +
 src/gui/mac/HYPlatformWindow.cpp                   |  1118 ++
 src/gui/mac/HyPhy.rsrc                             |   Bin 0 -> 388670 bytes
 src/gui/mac/Info.plist                             |    58 +
 .../mac/WindowClasses/HYPlatformBootsrapWindow.cpp |     1 +
 .../mac/WindowClasses/HYPlatformChartWindow.cpp    |     1 +
 .../mac/WindowClasses/HYPlatformConsoleWindow.cpp  |   394 +
 src/gui/mac/WindowClasses/HYPlatformDBWindow.cpp   |     1 +
 src/gui/mac/WindowClasses/HYPlatformDataPanel.cpp  |  1100 +
 src/gui/mac/WindowClasses/HYPlatformGWindow.cpp    |     1 +
 .../mac/WindowClasses/HYPlatformModelWindow.cpp    |     1 +
 src/gui/mac/WindowClasses/HYPlatformPWindow.cpp    |     1 +
 .../mac/WindowClasses/HYPlatformParameterTable.cpp |     1 +
 src/gui/mac/WindowClasses/HYPlatformTWindow.cpp    |     1 +
 src/gui/mac/WindowClasses/HYPlatformTreePanel.cpp  |     1 +
 src/gui/mac/hydialogs.cpp                          |   774 +
 src/gui/mac/iHyPhyDebug.rsrc                       |   Bin 0 -> 388670 bytes
 src/gui/mac/include/Components/HYPlatformButton.h  |    92 +
 .../mac/include/Components/HYPlatformButtonBar.h   |   118 +
 .../mac/include/Components/HYPlatformCheckbox.h    |    78 +
 src/gui/mac/include/Components/HYPlatformLabel.h   |    88 +
 src/gui/mac/include/Components/HYPlatformList.h    |    94 +
 .../mac/include/Components/HYPlatformPullDown.h    |   120 +
 src/gui/mac/include/Components/HYPlatformTable.h   |   112 +
 src/gui/mac/include/Components/HYPlatformTextbox.h |   152 +
 src/gui/mac/include/HYPlatformButtonMenu.h         |   196 +
 src/gui/mac/include/HYPlatformComponent.h          |    77 +
 src/gui/mac/include/HYPlatformGraphicPane.h        |    90 +
 src/gui/mac/include/HYPlatformWindow.h             |   160 +
 src/gui/mac/plist.r                                |     3 +
 src/gui/mac/plist.xml                              |    36 +
 src/gui/mac/plistmp.r                              |     1 +
 src/gui/preferences.cpp                            |   766 +
 src/gui/qt/helpers.cpp                             |   242 +
 src/gui/qt/hyphy_qt_utility.cpp                    |    54 +
 src/gui/qt/hyphyevents.cpp                         |    49 +
 src/gui/qt/hyphyhierarchicalselector.cpp           |   248 +
 src/gui/qt/hyphymain.cpp                           |   470 +
 src/gui/qt/hyphymessageoutput.cpp                  |    70 +
 src/gui/qt/include/hyphy_qt_helpers.h              |    75 +
 src/gui/qt/include/hyphyevents.h                   |    59 +
 src/gui/qt/include/hyphyhierarchicalselector.h     |    83 +
 src/gui/qt/include/hyphymain.h                     |   176 +
 src/gui/qt/include/hyphymessageoutput.h            |    51 +
 src/gui/qt/include/qterminal.h                     |    45 +
 src/gui/qt/include/simplerequest.h                 |    25 +
 src/gui/qt/main.cpp                                |    62 +
 src/gui/qt/qterminal.cpp                           |   273 +
 src/gui/qt/simplerequest.cpp                       |    77 +
 src/gui/qt/ui/hyphyhierarchicalselector.ui         |    71 +
 src/gui/qt/ui/hyphymain.ui                         |    49 +
 src/gui/qt/ui/hyphymessageoutput.ui                |    49 +
 src/gui/res/GTKResources/130.png                   |   Bin 0 -> 1240 bytes
 src/gui/res/GTKResources/131.png                   |   Bin 0 -> 164 bytes
 src/gui/res/GTKResources/132.png                   |   Bin 0 -> 189 bytes
 src/gui/res/GTKResources/133.png                   |   Bin 0 -> 1596 bytes
 src/gui/res/GTKResources/4000.png                  |   Bin 0 -> 936 bytes
 src/gui/res/GTKResources/4000.xpm                  |    26 +
 src/gui/res/GTKResources/4001.png                  |   Bin 0 -> 184 bytes
 src/gui/res/GTKResources/4001.xpm                  |    26 +
 src/gui/res/GTKResources/4002.png                  |   Bin 0 -> 176 bytes
 src/gui/res/GTKResources/4002.xpm                  |    25 +
 src/gui/res/GTKResources/4003.png                  |   Bin 0 -> 177 bytes
 src/gui/res/GTKResources/4003.xpm                  |    25 +
 src/gui/res/GTKResources/4011.png                  |   Bin 0 -> 899 bytes
 src/gui/res/GTKResources/4020.png                  |   Bin 0 -> 918 bytes
 src/gui/res/GTKResources/5000.png                  |   Bin 0 -> 288 bytes
 src/gui/res/GTKResources/5001.png                  |   Bin 0 -> 277 bytes
 src/gui/res/GTKResources/5002.png                  |   Bin 0 -> 295 bytes
 src/gui/res/GTKResources/5003.png                  |   Bin 0 -> 271 bytes
 src/gui/res/GTKResources/5004.png                  |   Bin 0 -> 267 bytes
 src/gui/res/GTKResources/5005.png                  |   Bin 0 -> 274 bytes
 src/gui/res/GTKResources/5006.png                  |   Bin 0 -> 152 bytes
 src/gui/res/GTKResources/5007.png                  |   Bin 0 -> 231 bytes
 src/gui/res/GTKResources/5020.png                  |   Bin 0 -> 918 bytes
 src/gui/res/GTKResources/6000.png                  |   Bin 0 -> 935 bytes
 src/gui/res/GTKResources/6001.png                  |   Bin 0 -> 922 bytes
 src/gui/res/GTKResources/6002.png                  |   Bin 0 -> 900 bytes
 src/gui/res/GTKResources/6003.png                  |   Bin 0 -> 968 bytes
 src/gui/res/GTKResources/6004.png                  |   Bin 0 -> 927 bytes
 src/gui/res/GTKResources/6005.png                  |   Bin 0 -> 952 bytes
 src/gui/res/GTKResources/6006.png                  |   Bin 0 -> 946 bytes
 src/gui/res/GTKResources/6007.png                  |   Bin 0 -> 208 bytes
 src/gui/res/GTKResources/6008.png                  |   Bin 0 -> 217 bytes
 src/gui/res/GTKResources/6009.png                  |   Bin 0 -> 191 bytes
 src/gui/res/GTKResources/6010.png                  |   Bin 0 -> 913 bytes
 src/gui/res/GTKResources/6011.png                  |   Bin 0 -> 945 bytes
 src/gui/res/GTKResources/6012.png                  |   Bin 0 -> 198 bytes
 src/gui/res/GTKResources/6013.png                  |   Bin 0 -> 191 bytes
 src/gui/res/GTKResources/6014.png                  |   Bin 0 -> 202 bytes
 src/gui/res/GTKResources/6016.png                  |   Bin 0 -> 963 bytes
 src/gui/res/GTKResources/6017.png                  |   Bin 0 -> 307 bytes
 src/gui/res/GTKResources/6018.png                  |   Bin 0 -> 271 bytes
 src/gui/res/GTKResources/6019.png                  |   Bin 0 -> 230 bytes
 src/gui/res/GTKResources/6020.png                  |   Bin 0 -> 205 bytes
 src/gui/res/GTKResources/6021.png                  |   Bin 0 -> 291 bytes
 src/gui/res/GTKResources/6022.png                  |   Bin 0 -> 326 bytes
 src/gui/res/GTKResources/6030.png                  |   Bin 0 -> 945 bytes
 src/gui/res/GTKResources/6031.png                  |   Bin 0 -> 265 bytes
 src/gui/res/GTKResources/6032.png                  |   Bin 0 -> 283 bytes
 src/gui/res/GTKResources/6033.png                  |   Bin 0 -> 942 bytes
 src/gui/res/GTKResources/6034.png                  |   Bin 0 -> 959 bytes
 src/gui/res/GTKResources/6035.png                  |   Bin 0 -> 948 bytes
 src/gui/res/GTKResources/6036.png                  |   Bin 0 -> 957 bytes
 src/gui/res/GTKResources/6040.png                  |   Bin 0 -> 925 bytes
 src/gui/res/GTKResources/6041.png                  |   Bin 0 -> 925 bytes
 src/gui/res/GTKResources/6042.png                  |   Bin 0 -> 920 bytes
 src/gui/res/GTKResources/7000.png                  |   Bin 0 -> 923 bytes
 src/gui/res/GTKResources/7001.png                  |   Bin 0 -> 933 bytes
 src/gui/res/GTKResources/7002.png                  |   Bin 0 -> 933 bytes
 src/gui/res/GTKResources/7003.png                  |   Bin 0 -> 921 bytes
 src/gui/res/GTKResources/7004.png                  |   Bin 0 -> 943 bytes
 src/gui/res/GTKResources/7005.png                  |   Bin 0 -> 978 bytes
 src/gui/res/GTKResources/7010.png                  |   Bin 0 -> 929 bytes
 src/gui/res/GTKResources/7011.png                  |   Bin 0 -> 247 bytes
 src/gui/res/GTKResources/7012.png                  |   Bin 0 -> 225 bytes
 src/gui/res/GTKResources/7013.png                  |   Bin 0 -> 229 bytes
 src/gui/res/GTKResources/7014.png                  |   Bin 0 -> 202 bytes
 src/gui/res/GTKResources/7020.png                  |   Bin 0 -> 194 bytes
 src/gui/res/GTKResources/7050.png                  |   Bin 0 -> 1021 bytes
 src/gui/res/GTKResources/striped.xpm               |    18 +
 src/gui/res/GTKResources/theme/arrow_down1.png     |   Bin 0 -> 281 bytes
 src/gui/res/GTKResources/theme/arrow_down2.png     |   Bin 0 -> 281 bytes
 src/gui/res/GTKResources/theme/arrow_down3.png     |   Bin 0 -> 281 bytes
 src/gui/res/GTKResources/theme/arrow_left1.png     |   Bin 0 -> 276 bytes
 src/gui/res/GTKResources/theme/arrow_left2.png     |   Bin 0 -> 276 bytes
 src/gui/res/GTKResources/theme/arrow_left3.png     |   Bin 0 -> 276 bytes
 src/gui/res/GTKResources/theme/arrow_right1.png    |   Bin 0 -> 290 bytes
 src/gui/res/GTKResources/theme/arrow_right2.png    |   Bin 0 -> 290 bytes
 src/gui/res/GTKResources/theme/arrow_right3.png    |   Bin 0 -> 290 bytes
 src/gui/res/GTKResources/theme/arrow_up1.png       |   Bin 0 -> 250 bytes
 src/gui/res/GTKResources/theme/arrow_up2.png       |   Bin 0 -> 250 bytes
 src/gui/res/GTKResources/theme/arrow_up3.png       |   Bin 0 -> 250 bytes
 src/gui/res/GTKResources/theme/background.png      |   Bin 0 -> 144 bytes
 src/gui/res/GTKResources/theme/blank.png           |   Bin 0 -> 71 bytes
 src/gui/res/GTKResources/theme/button0.png         |   Bin 0 -> 3873 bytes
 src/gui/res/GTKResources/theme/button1.png         |   Bin 0 -> 811 bytes
 src/gui/res/GTKResources/theme/button11.png        |   Bin 0 -> 1928 bytes
 src/gui/res/GTKResources/theme/button11alpha.png   |   Bin 0 -> 1967 bytes
 src/gui/res/GTKResources/theme/button12.png        |   Bin 0 -> 1512 bytes
 src/gui/res/GTKResources/theme/button12alpha.png   |   Bin 0 -> 1587 bytes
 src/gui/res/GTKResources/theme/button13.png        |   Bin 0 -> 1586 bytes
 src/gui/res/GTKResources/theme/button13alpha.png   |   Bin 0 -> 1586 bytes
 src/gui/res/GTKResources/theme/button2.png         |   Bin 0 -> 4194 bytes
 src/gui/res/GTKResources/theme/button3.png         |   Bin 0 -> 803 bytes
 src/gui/res/GTKResources/theme/button4.png         |   Bin 0 -> 822 bytes
 src/gui/res/GTKResources/theme/button5.png         |   Bin 0 -> 621 bytes
 src/gui/res/GTKResources/theme/button6.png         |   Bin 0 -> 605 bytes
 src/gui/res/GTKResources/theme/button7.png         |   Bin 0 -> 822 bytes
 src/gui/res/GTKResources/theme/button8.png         |   Bin 0 -> 822 bytes
 src/gui/res/GTKResources/theme/button9.png         |   Bin 0 -> 3873 bytes
 src/gui/res/GTKResources/theme/check1.png          |   Bin 0 -> 695 bytes
 src/gui/res/GTKResources/theme/check2.png          |   Bin 0 -> 1525 bytes
 src/gui/res/GTKResources/theme/empty.png           |   Bin 0 -> 162 bytes
 src/gui/res/GTKResources/theme/entry1.png          |   Bin 0 -> 144 bytes
 src/gui/res/GTKResources/theme/entry2.png          |   Bin 0 -> 144 bytes
 src/gui/res/GTKResources/theme/focus.png           |   Bin 0 -> 4018 bytes
 src/gui/res/GTKResources/theme/frame1.png          |   Bin 0 -> 4181 bytes
 src/gui/res/GTKResources/theme/frame2.png          |   Bin 0 -> 4181 bytes
 src/gui/res/GTKResources/theme/frame_gap.png       |   Bin 0 -> 4181 bytes
 .../res/GTKResources/theme/frame_gap_top_end.png   |   Bin 0 -> 163 bytes
 .../res/GTKResources/theme/frame_gap_top_start.png |   Bin 0 -> 162 bytes
 src/gui/res/GTKResources/theme/gap_bottom.png      |   Bin 0 -> 144 bytes
 src/gui/res/GTKResources/theme/gap_bottom_end.png  |   Bin 0 -> 144 bytes
 .../res/GTKResources/theme/gap_bottom_start.png    |   Bin 0 -> 144 bytes
 src/gui/res/GTKResources/theme/gap_left.png        |   Bin 0 -> 144 bytes
 src/gui/res/GTKResources/theme/gap_left_end.png    |   Bin 0 -> 144 bytes
 src/gui/res/GTKResources/theme/gap_left_start.png  |   Bin 0 -> 144 bytes
 src/gui/res/GTKResources/theme/gap_right.png       |   Bin 0 -> 144 bytes
 src/gui/res/GTKResources/theme/gap_right_end.png   |   Bin 0 -> 144 bytes
 src/gui/res/GTKResources/theme/gap_right_start.png |   Bin 0 -> 144 bytes
 src/gui/res/GTKResources/theme/gap_top.png         |   Bin 0 -> 144 bytes
 src/gui/res/GTKResources/theme/gap_top_end.png     |   Bin 0 -> 144 bytes
 src/gui/res/GTKResources/theme/gap_top_start.png   |   Bin 0 -> 144 bytes
 .../res/GTKResources/theme/handle_vert_thumb.png   |   Bin 0 -> 323 bytes
 src/gui/res/GTKResources/theme/hline.png           |   Bin 0 -> 158 bytes
 src/gui/res/GTKResources/theme/htrough.png         |   Bin 0 -> 1427 bytes
 src/gui/res/GTKResources/theme/menu_selected.png   |   Bin 0 -> 223 bytes
 src/gui/res/GTKResources/theme/menu_shadow.png     |   Bin 0 -> 209 bytes
 src/gui/res/GTKResources/theme/menubar.png         |   Bin 0 -> 144 bytes
 src/gui/res/GTKResources/theme/notebook1.png       |   Bin 0 -> 144 bytes
 src/gui/res/GTKResources/theme/notebook2.png       |   Bin 0 -> 1766 bytes
 src/gui/res/GTKResources/theme/notebook3.png       |   Bin 0 -> 1133 bytes
 src/gui/res/GTKResources/theme/notebook4.png       |   Bin 0 -> 1754 bytes
 src/gui/res/GTKResources/theme/notebook5.png       |   Bin 0 -> 1113 bytes
 src/gui/res/GTKResources/theme/notebook_border.png |   Bin 0 -> 180 bytes
 src/gui/res/GTKResources/theme/option1.png         |   Bin 0 -> 943 bytes
 src/gui/res/GTKResources/theme/option2.png         |   Bin 0 -> 1083 bytes
 src/gui/res/GTKResources/theme/option_menu.png     |   Bin 0 -> 3279 bytes
 .../res/GTKResources/theme/scrollbar_horiz1.png    |   Bin 0 -> 1797 bytes
 .../res/GTKResources/theme/scrollbar_horiz2.png    |   Bin 0 -> 1355 bytes
 src/gui/res/GTKResources/theme/scrollbar_vert1.png |   Bin 0 -> 1796 bytes
 src/gui/res/GTKResources/theme/shadow1.png         |   Bin 0 -> 447 bytes
 src/gui/res/GTKResources/theme/shadow2.png         |   Bin 0 -> 1061 bytes
 src/gui/res/GTKResources/theme/slider_horiz1.png   |   Bin 0 -> 482 bytes
 src/gui/res/GTKResources/theme/slider_hth1.png     |   Bin 0 -> 353 bytes
 src/gui/res/GTKResources/theme/slider_hth2.png     |   Bin 0 -> 207 bytes
 src/gui/res/GTKResources/theme/slider_vert1.png    |   Bin 0 -> 483 bytes
 src/gui/res/GTKResources/theme/slider_vth1.png     |   Bin 0 -> 311 bytes
 src/gui/res/GTKResources/theme/slider_vth2.png     |   Bin 0 -> 192 bytes
 src/gui/res/GTKResources/theme/theme.rc            |   944 +
 src/gui/res/GTKResources/theme/vline.png           |   Bin 0 -> 173 bytes
 src/gui/res/GTKResources/theme/vtrough.png         |   Bin 0 -> 1318 bytes
 src/gui/res/GTKResources/theme/white.png           |   Bin 0 -> 134 bytes
 src/gui/res/Windows/128.cur                        |   Bin 0 -> 2238 bytes
 src/gui/res/Windows/129.cur                        |   Bin 0 -> 2238 bytes
 src/gui/res/Windows/130.bmp                        |   Bin 0 -> 12342 bytes
 src/gui/res/Windows/131.bmp                        |   Bin 0 -> 1334 bytes
 src/gui/res/Windows/132.bmp                        |   Bin 0 -> 1334 bytes
 src/gui/res/Windows/132.cur                        |   Bin 0 -> 2238 bytes
 src/gui/res/Windows/133.bmp                        |   Bin 0 -> 11958 bytes
 src/gui/res/Windows/3000.bmp                       |   Bin 0 -> 1110 bytes
 src/gui/res/Windows/333.bmp                        |   Bin 0 -> 1334 bytes
 src/gui/res/Windows/400.bmp                        |   Bin 0 -> 38454 bytes
 src/gui/res/Windows/4000.bmp                       |   Bin 0 -> 1224 bytes
 src/gui/res/Windows/4001.bmp                       |   Bin 0 -> 1222 bytes
 src/gui/res/Windows/4002.bmp                       |   Bin 0 -> 1222 bytes
 src/gui/res/Windows/4003.bmp                       |   Bin 0 -> 1222 bytes
 src/gui/res/Windows/401.bmp                        |   Bin 0 -> 38454 bytes
 src/gui/res/Windows/4011.bmp                       |   Bin 0 -> 1286 bytes
 src/gui/res/Windows/402.bmp                        |   Bin 0 -> 38454 bytes
 src/gui/res/Windows/4020.bmp                       |   Bin 0 -> 1222 bytes
 src/gui/res/Windows/5000.bmp                       |   Bin 0 -> 1466 bytes
 src/gui/res/Windows/5001.bmp                       |   Bin 0 -> 1478 bytes
 src/gui/res/Windows/5002.bmp                       |   Bin 0 -> 1466 bytes
 src/gui/res/Windows/5003.bmp                       |   Bin 0 -> 1478 bytes
 src/gui/res/Windows/5004.bmp                       |   Bin 0 -> 1464 bytes
 src/gui/res/Windows/5005.bmp                       |   Bin 0 -> 1432 bytes
 src/gui/res/Windows/5006.bmp                       |   Bin 0 -> 1314 bytes
 src/gui/res/Windows/5007.bmp                       |   Bin 0 -> 1464 bytes
 src/gui/res/Windows/6000.bmp                       |   Bin 0 -> 1266 bytes
 src/gui/res/Windows/6001.bmp                       |   Bin 0 -> 1334 bytes
 src/gui/res/Windows/6002.bmp                       |   Bin 0 -> 1178 bytes
 src/gui/res/Windows/6003.bmp                       |   Bin 0 -> 1334 bytes
 src/gui/res/Windows/6004.bmp                       |   Bin 0 -> 1310 bytes
 src/gui/res/Windows/6005.bmp                       |   Bin 0 -> 1304 bytes
 src/gui/res/Windows/6006.bmp                       |   Bin 0 -> 1324 bytes
 src/gui/res/Windows/6007.bmp                       |   Bin 0 -> 1298 bytes
 src/gui/res/Windows/6008.bmp                       |   Bin 0 -> 1312 bytes
 src/gui/res/Windows/6009.bmp                       |   Bin 0 -> 1246 bytes
 src/gui/res/Windows/6010.bmp                       |   Bin 0 -> 1334 bytes
 src/gui/res/Windows/6011.bmp                       |   Bin 0 -> 1308 bytes
 src/gui/res/Windows/6012.bmp                       |   Bin 0 -> 1226 bytes
 src/gui/res/Windows/6013.bmp                       |   Bin 0 -> 246 bytes
 src/gui/res/Windows/6014.bmp                       |   Bin 0 -> 246 bytes
 src/gui/res/Windows/6016.bmp                       |   Bin 0 -> 1336 bytes
 src/gui/res/Windows/6017.bmp                       |   Bin 0 -> 1334 bytes
 src/gui/res/Windows/6018.bmp                       |   Bin 0 -> 1258 bytes
 src/gui/res/Windows/6019.bmp                       |   Bin 0 -> 1314 bytes
 src/gui/res/Windows/6020.bmp                       |   Bin 0 -> 1294 bytes
 src/gui/res/Windows/6021.bmp                       |   Bin 0 -> 1334 bytes
 src/gui/res/Windows/6022.bmp                       |   Bin 0 -> 1314 bytes
 src/gui/res/Windows/6030.bmp                       |   Bin 0 -> 1334 bytes
 src/gui/res/Windows/6031.bmp                       |   Bin 0 -> 1260 bytes
 src/gui/res/Windows/6032.bmp                       |   Bin 0 -> 1318 bytes
 src/gui/res/Windows/6033.bmp                       |   Bin 0 -> 1330 bytes
 src/gui/res/Windows/6034.bmp                       |   Bin 0 -> 1318 bytes
 src/gui/res/Windows/6035.bmp                       |   Bin 0 -> 1314 bytes
 src/gui/res/Windows/6036.bmp                       |   Bin 0 -> 1282 bytes
 src/gui/res/Windows/6040.bmp                       |   Bin 0 -> 1282 bytes
 src/gui/res/Windows/6041.bmp                       |   Bin 0 -> 1316 bytes
 src/gui/res/Windows/6042.bmp                       |   Bin 0 -> 1226 bytes
 src/gui/res/Windows/7000.bmp                       |   Bin 0 -> 1326 bytes
 src/gui/res/Windows/7001.bmp                       |   Bin 0 -> 1308 bytes
 src/gui/res/Windows/7002.bmp                       |   Bin 0 -> 1296 bytes
 src/gui/res/Windows/7003.bmp                       |   Bin 0 -> 1286 bytes
 src/gui/res/Windows/7004.bmp                       |   Bin 0 -> 1294 bytes
 src/gui/res/Windows/7005.bmp                       |   Bin 0 -> 1300 bytes
 src/gui/res/Windows/7010.bmp                       |   Bin 0 -> 1270 bytes
 src/gui/res/Windows/7011.bmp                       |   Bin 0 -> 1334 bytes
 src/gui/res/Windows/7012.bmp                       |   Bin 0 -> 1334 bytes
 src/gui/res/Windows/7013.bmp                       |   Bin 0 -> 1258 bytes
 src/gui/res/Windows/7014.bmp                       |   Bin 0 -> 1246 bytes
 src/gui/res/Windows/7020.bmp                       |   Bin 0 -> 1334 bytes
 src/gui/res/Windows/7050.bmp                       |   Bin 0 -> 1334 bytes
 src/gui/res/Windows/Win.rc                         |     1 +
 src/gui/res/Windows/desk.ico                       |   Bin 0 -> 204862 bytes
 src/gui/res/Windows/hyphy.bmp                      |   Bin 0 -> 91880 bytes
 src/gui/res/Windows/pthreadGC2.dll                 |   Bin 0 -> 69088 bytes
 src/gui/res/Windows/pthreadVC2.dll                 |   Bin 0 -> 86070 bytes
 src/gui/win/Components/HYPlatformButton.cpp        |     1 +
 src/gui/win/Components/HYPlatformButtonBar.cpp     |     1 +
 src/gui/win/Components/HYPlatformCheckBox.cpp      |     1 +
 src/gui/win/Components/HYPlatformLabel.cpp         |     1 +
 src/gui/win/Components/HYPlatformPullDown.cpp      |     1 +
 src/gui/win/Components/HYPlatformSequencePane.cpp  |   249 +
 src/gui/win/Components/HYPlatformTable.cpp         |  1771 ++
 src/gui/win/Components/HYPlatformTextBox.cpp       |   740 +
 src/gui/win/HYPlatformComponent.cpp                |   672 +
 src/gui/win/HYPlatformGraphicPane.cpp              |     1 +
 src/gui/win/HYPlatformWindow.cpp                   |   863 +
 src/gui/win/HYPlatfromUtils.cpp                    |   773 +
 .../win/WindowClasses/HYPlatformBootsrapWindow.cpp |     1 +
 .../win/WindowClasses/HYPlatformChartWindow.cpp    |     1 +
 .../win/WindowClasses/HYPlatformConsoleWindow.cpp  |   584 +
 src/gui/win/WindowClasses/HYPlatformDBWindow.cpp   |     1 +
 src/gui/win/WindowClasses/HYPlatformDataPanel.cpp  |     1 +
 src/gui/win/WindowClasses/HYPlatformGWindow.cpp    |     1 +
 .../win/WindowClasses/HYPlatformModelWindow.cpp    |     1 +
 src/gui/win/WindowClasses/HYPlatformPWindow.cpp    |     1 +
 .../win/WindowClasses/HYPlatformParameterTable.cpp |     1 +
 src/gui/win/WindowClasses/HYPlatformTWindow.cpp    |     1 +
 src/gui/win/WindowClasses/HYPlatformTreePanel.cpp  |  1328 ++
 src/gui/win/include/Components/HYPlatformButton.h  |     1 +
 .../win/include/Components/HYPlatformButtonBar.h   |     1 +
 .../win/include/Components/HYPlatformCheckbox.h    |     1 +
 src/gui/win/include/Components/HYPlatformLabel.h   |     1 +
 .../win/include/Components/HYPlatformPullDown.h    |     1 +
 src/gui/win/include/Components/HYPlatformTable.h   |     1 +
 src/gui/win/include/Components/HYPlatformTextbox.h |     1 +
 src/gui/win/include/HYPlatformButtonMenu.h         |     1 +
 src/gui/win/include/HYPlatformComponent.h          |     1 +
 src/gui/win/include/HYPlatformGraphicPane.h        |     1 +
 src/gui/win/include/HYPlatformWindow.h             |     1 +
 src/gui/win/include/pthread.h                      |  1363 ++
 src/gui/win/include/sched.h                        |   178 +
 src/gui/win/include/semaphore.h                    |   166 +
 src/lib/Examples/HBL/F81.bf                        |     1 +
 src/lib/Examples/HBL/HKY85.bf                      |     1 +
 src/lib/Examples/HBL/data/hiv.nuc                  |     1 +
 src/lib/Examples/Python/BasicHyPhy.py              |   112 +
 src/lib/Examples/R/BasicHyPhy.R                    |   126 +
 src/lib/LibraryModules/Python/HyPhy/__init__.py    |    78 +
 src/lib/LibraryModules/R/HyPhy.R                   |  1338 ++
 src/lib/Link/THyPhy.cpp                            |   518 +
 src/lib/Link/THyPhy.h                              |   282 +
 src/lib/README                                     |    53 +
 src/lib/SWIGWrappers/THyPhy_R.cpp                  |  3344 ++++
 src/lib/SWIGWrappers/THyPhy_py3.cpp                |  7440 +++++++
 src/lib/SWIGWrappers/THyPhy_python.cpp             |  7440 +++++++
 src/lib/batchfiles.list                            |   530 +
 src/lib/build.sh                                   |   186 +
 src/lib/setup.py                                   |    95 +
 src/mains/gtk.cpp                                  |   424 +
 src/mains/mac.cpp                                  |  1559 ++
 src/mains/unix.cpp                                 |   841 +
 src/mains/win.cpp                                  |   859 +
 src/new/HYNetInterface.cpp                         |   375 +
 src/new/Net.cpp                                    |   606 +
 src/new/bayesgraph.cpp                             |  2658 +++
 src/new/bayesgraph2.cpp                            |  1801 ++
 src/new/bgm.cpp                                    |  3257 +++
 src/new/bgm2.cpp                                   |  1845 ++
 src/new/include/HYNetInterface.h                   |    40 +
 src/new/include/SerangNet.h                        |    95 +
 src/new/include/bayesgraph.h                       |   209 +
 src/new/include/bgm.h                              |   226 +
 src/new/include/scfg.h                             |   706 +
 src/new/scfg.cpp                                   |  2272 +++
 src/ocl/opencl_kernels.cl                          |   311 +
 src/utils/hyphyunixutils.cpp                       |   348 +
 tests/gtests/ut_avllists.cpp                       |   623 +
 tests/gtests/ut_avllists.h                         |     0
 tests/gtests/ut_list.cpp                           |   456 +
 tests/gtests/ut_lists.h                            |     8 +
 tests/gtests/ut_simplelists.cpp                    |   698 +
 tests/gtests/ut_simplelists.h                      |     0
 tests/gtests/ut_strings.cpp                        |  1416 ++
 tests/gtests/ut_strings.h                          |     0
 tests/hbltests/Ancestors/CodonAncestors.bf         |   664 +
 tests/hbltests/Ancestors/LeafProbs.bf              |   118 +
 tests/hbltests/Ancestors/NucAncestors.bf           |   226 +
 tests/hbltests/Ancestors/NucRVAncestors.bf         |   114 +
 tests/hbltests/BFFeatures/Level1.bf                |     1 +
 tests/hbltests/BFFeatures/Level2/File1.bf          |     1 +
 tests/hbltests/BFFeatures/Level2/File2.bf          |     1 +
 tests/hbltests/BFFeatures/TreeSplits.bf            |    15 +
 tests/hbltests/BFFeatures/kernel.dump              |   466 +
 tests/hbltests/BayesianGraphicalModels/TestBGM.bf  |   167 +
 tests/hbltests/BayesianGraphicalModels/alarm.xml   |   472 +
 tests/hbltests/HMM/RateHMM.bf                      |    89 +
 tests/hbltests/HMM/SmallNuc.bf                     |   123 +
 tests/hbltests/HMM/SmallNucRel.bf                  |   106 +
 tests/hbltests/HMM/TreeHMM.bf                      |    77 +
 tests/hbltests/REL/BS-REL.bf                       |    43 +
 tests/hbltests/REL/GTR_G_I.bf                      |   125 +
 tests/hbltests/REL/IntermediateNucRel.bf           |  1056 +
 tests/hbltests/REL/ModelMixture.bf                 |  3074 +++
 tests/hbltests/REL/MultiplePartitions.bf           |   221 +
 tests/hbltests/REL/NY.bf                           |    49 +
 tests/hbltests/REL/SmallNucRel.bf                  |  1447 ++
 .../RegressionTesting/ClearConstraintsBug.bf       |   683 +
 .../RegressionTesting/LocalReferenceBug.bf         |    14 +
 tests/hbltests/RegressionTesting/ParseNexus.bf     |    44 +
 .../hbltests/RegressionTesting/RELAX/segfault.nex  |    86 +
 .../RELAX/segfault.nex.RELAX.json                  |  1285 ++
 .../RELAX/segfault.nex.alternative.fit             |  3783 ++++
 .../RELAX/segfault.nex.partitioned_descriptive.fit |  3783 ++++
 .../RegressionTesting/RELAX/segfault.nex.tre       |     1 +
 tests/hbltests/RegressionTesting/RELAX/wrapper.bf  |     7 +
 tests/hbltests/RegressionTesting/expModelCrash.bf  |  1727 ++
 .../RegressionTesting/res/69genes.test.nex         |    65 +
 tests/hbltests/RegressionTesting/unaryMinus.bf     |     5 +
 tests/hbltests/Shared/REL_utils.bf                 |    11 +
 tests/hbltests/Shared/TestInstrumentation.bf       |   129 +
 .../SimpleOptimizations/IntermediateCodon.bf       |   634 +
 .../SimpleOptimizations/IntermediateNuc.bf         |    57 +
 .../SimpleOptimizations/IntermediateProtein.bf     |  1510 ++
 tests/hbltests/SimpleOptimizations/LargeNuc.bf     |  9407 +++++++++
 tests/hbltests/SimpleOptimizations/SmallCodon.bf   |   675 +
 .../SimpleOptimizations/SmallCodonLocal.bf         |   672 +
 .../SimpleOptimizations/TwoSequenceTest.bf         |    64 +
 .../SpecializedOptimizations/SingleSiteTemplate.bf |   640 +
 .../SpecializedOptimizations/SiteLikelihood.bf     |  1237 ++
 .../NonReversibleWithDynamicFrequencies.bf         |    25 +
 .../hbltests/UnitTests/HBLCommands/AllCommands.bf  |   575 +
 .../hbltests/UnitTests/HBLCommands/BranchLength.bf |   105 +
 .../hbltests/UnitTests/HBLCommands/DeleteObject.bf |    29 +
 .../UnitTests/HBLCommands/Differentiate.bf         |    33 +
 tests/hbltests/UnitTests/HBLCommands/DoSQL.bf      |    15 +
 tests/hbltests/UnitTests/HBLCommands/Export.bf     |    37 +
 .../hbltests/UnitTests/HBLCommands/GetDataInfo.bf  |    51 +
 tests/hbltests/UnitTests/HBLCommands/GetString.bf  |   193 +
 tests/hbltests/UnitTests/HBLCommands/GetURL.bf     |    33 +
 .../UnitTests/HBLCommands/HarvestFrequencies.bf    |    92 +
 tests/hbltests/UnitTests/HBLCommands/JSON.bf       |    23 +
 .../UnitTests/HBLCommands/RequireVersion.bf        |     2 +
 tests/hbltests/UnitTests/HBLCommands/TestTools.ibf |    39 +
 tests/hbltests/UnitTests/HBLCommands/Type.bf       |    48 +
 .../UnitTests/HBLCommands/res/SCFG/SCFG.ibf        |   493 +
 .../UnitTests/HBLCommands/res/SCFG/scfgG6c.bf      |    94 +
 .../UnitTests/HBLCommands/res/SCFG/small.txt       |     1 +
 .../UnitTests/HBLCommands/res/test_likefunc.nex    |   648 +
 .../UnitTests/HBLCommands/res/test_likefunc2.nex   |  1484 ++
 .../HBLCommands/testdata/Chinook_Sqlite.sqlite     |   Bin 0 -> 1091584 bytes
 .../hbltests/UnitTests/HBLCommands/tmp/GetURL.txt  |     0
 tests/hbltests/data/2.fas                          |     4 +
 tests/hbltests/data/2.prot                         |     4 +
 tests/hbltests/data/2.tree                         |     1 +
 tests/hbltests/data/5.fas                          |    10 +
 tests/hbltests/data/CD2.nex                        |    86 +
 tests/hbltests/data/HIVenvSweden.seq               |    18 +
 tests/hbltests/data/HMM2_synthetic.fas             |    37 +
 tests/hbltests/data/HMM4_synthetic.fas             |    37 +
 tests/hbltests/data/fluHA.nex                      |   371 +
 tests/hbltests/data/fluHA_codon.nex                |   372 +
 tests/hbltests/data/mtDNA.fas                      |  1429 ++
 1409 files changed, 547639 insertions(+)

diff --git a/CMakeLists.txt b/CMakeLists.txt
new file mode 100644
index 0000000..9ce7fc1
--- /dev/null
+++ b/CMakeLists.txt
@@ -0,0 +1,711 @@
+cmake_minimum_required(VERSION 3.0.0)
+project(HyPhy)
+cmake_policy(VERSION 3.0.0)
+cmake_policy(SET CMP0026 OLD)
+
+set(CMAKE_CONFIGURATION_TYPES Release)
+
+#-------------------------------------------------------------------------------
+# SSE MACROS
+#-------------------------------------------------------------------------------
+
+macro(PCL_CHECK_FOR_SSE3)
+  include(CheckCXXSourceRuns)
+  set(CMAKE_REQUIRED_FLAGS)
+
+  if(CMAKE_COMPILER_IS_GNUCC OR CMAKE_COMPILER_IS_GNUCXX OR CMAKE_COMPILER_IS_CLANG)
+      set(CMAKE_REQUIRED_FLAGS "-msse3")
+  endif(CMAKE_COMPILER_IS_GNUCC OR CMAKE_COMPILER_IS_GNUCXX OR CMAKE_COMPILER_IS_CLANG)
+
+  check_cxx_source_runs("
+      #include <pmmintrin.h>
+      int main ()
+      {
+          __m128d a, b;
+          double vals[2] = {0};
+          a = _mm_loadu_pd (vals);
+          b = _mm_hadd_pd (a,a);
+          _mm_storeu_pd (vals, b);
+          return (0);
+      }"
+      HAVE_SSE3_EXTENSIONS)
+endmacro(PCL_CHECK_FOR_SSE3)
+
+#-------------------------------------------------------------------------------
+# SSE MACROS
+#-------------------------------------------------------------------------------
+
+macro(PCL_CHECK_FOR_AVX)
+  include(CheckCXXSourceRuns)
+  set(CMAKE_REQUIRED_FLAGS)
+
+  if(CMAKE_COMPILER_IS_GNUCC OR CMAKE_COMPILER_IS_GNUCXX OR CMAKE_COMPILER_IS_CLANG)
+      set(CMAKE_REQUIRED_FLAGS "-march=corei7-avx -mtune=corei7-avx")
+  endif(CMAKE_COMPILER_IS_GNUCC OR CMAKE_COMPILER_IS_GNUCXX OR CMAKE_COMPILER_IS_CLANG)
+
+  check_cxx_source_runs("
+      #include <immintrin.h>
+      int main ()
+      {
+          __m256d a, b;
+          double vals[4] = {0.};
+          a = _mm256_loadu_pd (vals);
+          b = _mm256_hadd_pd (a,a);
+          _mm256_storeu_pd (vals, b);
+          return (0);
+      }"
+      HAVE_AVX_EXTENSIONS)
+endmacro(PCL_CHECK_FOR_AVX)
+
+
+#-------------------------------------------------------------------------------
+# set the CMAKE_MODULE_PATH so we can import OpenCL
+#-------------------------------------------------------------------------------
+set(CMAKE_MODULE_PATH cmake)
+set(HYPHY_VERSION 2.1)
+
+#-------------------------------------------------------------------------------
+# figure out some system-stuff for compile-time workarounds
+#-------------------------------------------------------------------------------
+set(MACOSX_LION false)
+if(${CMAKE_SYSTEM_NAME} STREQUAL "Darwin")
+    if(${CMAKE_SYSTEM_VERSION} VERSION_GREATER 11.0.0 OR ${CMAKE_SYSTEM_VERSION} VERSION_EQUAL 11.0.0)
+        set(MACOSX_LION true)
+    endif(${CMAKE_SYSTEM_VERSION} VERSION_GREATER 11.0.0 OR ${CMAKE_SYSTEM_VERSION} VERSION_EQUAL 11.0.0)
+    
+    if(${CMAKE_SYSTEM_VERSION} VERSION_GREATER 12.0.0 OR ${CMAKE_SYSTEM_VERSION} VERSION_EQUAL 12.0.0)
+        set(MACOSX_LION false)
+    endif(${CMAKE_SYSTEM_VERSION} VERSION_GREATER 12.0.0 OR ${CMAKE_SYSTEM_VERSION} VERSION_EQUAL 12.0.0)
+    
+endif(${CMAKE_SYSTEM_NAME} STREQUAL "Darwin")
+
+set(MACOSX_GT_LION false)
+if(${CMAKE_SYSTEM_NAME} STREQUAL "Darwin")
+    if(${CMAKE_SYSTEM_VERSION} VERSION_GREATER 11.0.0 OR ${CMAKE_SYSTEM_VERSION} VERSION_EQUAL 11.0.0)
+        set(MACOSX_GT_LION true)
+    endif(${CMAKE_SYSTEM_VERSION} VERSION_GREATER 11.0.0 OR ${CMAKE_SYSTEM_VERSION} VERSION_EQUAL 11.0.0)
+endif(${CMAKE_SYSTEM_NAME} STREQUAL "Darwin")
+
+
+
+
+#-------------------------------------------------------------------------------
+# make it fast, scotty
+#-------------------------------------------------------------------------------
+if(CMAKE_COMPILER_IS_GNUCC OR CMAKE_COMPILER_IS_GNUCXX)
+    execute_process(
+        COMMAND ${CMAKE_CXX_COMPILER} -dumpversion
+        OUTPUT_VARIABLE GCC_VERSION
+    )
+
+    set(GCC45 false)
+    set(GCC46 false)
+
+    if(${GCC_VERSION} VERSION_GREATER 4.5 OR ${GCC_VERSION} VERSION_EQUAL 4.5)
+        set(GCC45 true)
+    endif(${GCC_VERSION} VERSION_GREATER 4.5 OR ${GCC_VERSION} VERSION_EQUAL 4.5)
+
+    if(${GCC_VERSION} VERSION_GREATER 4.6 OR ${GCC_VERSION} VERSION_EQUAL 4.6)
+        set(GCC46 true)
+    endif(${GCC_VERSION} VERSION_GREATER 4.6 OR ${GCC_VERSION} VERSION_EQUAL 4.6)
+
+    if(${MACOSX_LION})
+        set(DEFAULT_WARNING_FLAGS "-Wno-int-to-pointer-cast -Wno-conversion-null -Wno-dangling-else -Wno-logical-op-parentheses")
+    endif(${MACOSX_LION})
+
+    if(${GCC45})
+        set(DEFAULT_COMPILE_FLAGS "-g -fsigned-char -O3")
+    else(${GCC45})
+        set(DEFAULT_COMPILE_FLAGS "-g -fsigned-char -O3")
+    endif(${GCC45})
+
+    if(${GCC46})
+        set(DEFAULT_WARNING_FLAGS "-Wno-int-to-pointer-cast -Wno-conversion-null")
+    endif(${GCC46})
+    
+    PCL_CHECK_FOR_AVX()
+    if(${HAVE_AVX_EXTENSIONS})
+        set(DEFAULT_COMPILE_FLAGS "${DEFAULT_COMPILE_FLAGS} -march=corei7-avx -mtune=corei7-avx")
+        add_definitions (-D_SLKP_USE_AVX_INTRINSICS)
+    else(${HAVE_AVX_EXTENSIONS})
+        PCL_CHECK_FOR_SSE3()
+        if(${HAVE_SSE3_EXTENSIONS})
+            add_definitions (-D_SLKP_USE_SSE_INTRINSICS)
+            set(DEFAULT_COMPILE_FLAGS "${DEFAULT_COMPILE_FLAGS} -msse3 ")
+        endif(${HAVE_SSE3_EXTENSIONS})
+    endif (${HAVE_AVX_EXTENSIONS})
+    
+
+    set(DEFAULT_LINK_FLAGS "${DEFAULT_COMPILE_FLAGS}")
+endif(CMAKE_COMPILER_IS_GNUCC OR CMAKE_COMPILER_IS_GNUCXX)
+
+if(NOT DEFINED DEFAULT_COMPILE_FLAGS)
+    set(DEFAULT_COMPILE_FLAGS "")
+endif(NOT DEFINED DEFAULT_COMPILE_FLAGS)
+
+if(NOT DEFINED DEFAULT_LINK_FLAGS)
+    set(DEFAULT_LINK_FLAGS "")
+endif(NOT DEFINED DEFAULT_LINK_FLAGS)
+
+if(NOT DEFINED DEFAULT_WARNING_FLAGS)
+    set(DEFAULT_WARNING_FLAGS "")
+endif(NOT DEFINED DEFAULT_WARNING_FLAGS)
+
+
+#-------------------------------------------------------------------------------
+# OpenMP support
+#-------------------------------------------------------------------------------
+find_package(OpenMP)
+
+if(${MACOSX_LION} OR NOT ${OPENMP_FOUND})
+    set(OpenMP_CXX_FLAGS "")
+endif(${MACOSX_LION} OR NOT ${OPENMP_FOUND})
+
+
+#-------------------------------------------------------------------------------
+# default installation prefix
+#-------------------------------------------------------------------------------
+set(INSTALL_PREFIX /usr/local CACHE PATH "Installation prefix")
+set(CMAKE_INSTALL_PREFIX ${INSTALL_PREFIX} CACHE INTERNAL "Installation prefix" FORCE)
+set(DEFAULT_LIBRARIES dl pthread)
+
+#-------------------------------------------------------------------------------
+# LIBCurl support
+#-------------------------------------------------------------------------------
+find_package(CURL)
+if(${CURL_FOUND})
+    set(DEFAULT_LIBRARIES dl pthread crypto curl ssl)
+    add_definitions (-D__HYPHYCURL__)
+endif(${CURL_FOUND})
+
+#-------------------------------------------------------------------------------
+# gtest dependency
+#-------------------------------------------------------------------------------
+add_subdirectory(contrib/gtest-1.7.0)
+set_property(
+    TARGET gtest gtest_main
+    PROPERTY EXCLUDE_FROM_ALL true
+)
+
+
+#-------------------------------------------------------------------------------
+# uninstall target
+#-------------------------------------------------------------------------------
+configure_file(
+    "${CMAKE_CURRENT_SOURCE_DIR}/cmake/cmake_uninstall.cmake.in"
+    "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake"
+    IMMEDIATE @ONLY
+)
+add_custom_target(uninstall
+    COMMAND ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake
+)
+
+
+#-------------------------------------------------------------------------------
+# setup the files we'll be using
+#-------------------------------------------------------------------------------
+file(GLOB SRC_CORE src/core/*.cpp)
+file(GLOB SRC_GUI src/gui/*.cpp src/gui/Components/*.cpp)
+file(GLOB SRC_GTESTS tests/gtests/*.cpp)
+file(GLOB SRC_NEW src/new/*.cpp)
+
+set(SRC_LINK src/lib/Link/THyPhy.cpp)
+set(SRC_PREFS src/gui/preferences.cpp)
+set(SRC_SQLITE3 contrib/SQLite-3.8.2/sqlite3.c)
+set(SRC_UNIXMAIN src/mains/unix.cpp)
+set(SRC_GTKMAIN src/mains/gtk.cpp)
+set(SRC_MACMAIN src/mains/mac.cpp)
+set(SRC_UTILS src/utils/hyphyunixutils.cpp)
+
+set(SRC_COMMON ${SRC_CORE} ${SRC_NEW} ${SRC_SQLITE3} ${SRC_UTILS})
+
+
+#-------------------------------------------------------------------------------
+# setup some source properties so that we don't spam stdout
+#-------------------------------------------------------------------------------
+set_property(
+    SOURCE ${SRC_CORE}
+    PROPERTY COMPILE_FLAGS "${DEFAULT_WARNING_FLAGS}"
+)
+
+set_property(
+    SOURCE ${SRC_SQLITE3}
+    PROPERTY COMPILE_FLAGS "-Wno-int-to-pointer-cast -Wno-pointer-to-int-cast"
+)
+
+set_property(
+    SOURCE src/core/calcnode2.cpp
+    PROPERTY COMPILE_FLAGS "-fstrict-aliasing -funroll-loops"
+)
+
+#-------------------------------------------------------------------------------
+# shared compilation definitions and header includes
+#-------------------------------------------------------------------------------
+add_definitions(-D_SLKP_LFENGINE_REWRITE_ -D__AFYP_REWRITE_BGM__)
+
+if(CMAKE_SIZEOF_VOID_P EQUAL 8)
+    add_definitions(-D__HYPHY_64__)
+endif(CMAKE_SIZEOF_VOID_P EQUAL 8)
+
+include_directories(
+    src/core/include
+    src/lib/Link src/new/include
+    contrib/SQLite-3.8.2 # SQLite
+    src/gui/include
+    src/gui/include/Components
+    src/gui/include/WindowClasses
+    contrib/gtest-1.7.0/include
+    tests/gtests
+)
+
+
+#-------------------------------------------------------------------------------
+# shared hyphy hbl stdlib target
+#-------------------------------------------------------------------------------
+install(DIRECTORY res/ DESTINATION lib/hyphy)
+
+
+#-------------------------------------------------------------------------------
+# hyphy library target
+#-------------------------------------------------------------------------------
+add_library(
+  hyphy_mp SHARED
+  EXCLUDE_FROM_ALL
+  ${SRC_COMMON} ${SRC_LINK} ${SRC_PREFS}
+)
+target_link_libraries(hyphy_mp ${DEFAULT_LIBRARIES})
+
+install(
+  TARGETS hyphy_mp
+  LIBRARY DESTINATION lib
+  OPTIONAL
+)
+
+add_custom_target(LIB DEPENDS hyphy_mp)
+
+set_property(
+    TARGET hyphy_mp
+    APPEND PROPERTY COMPILE_DEFINITIONS __HEADLESS__
+)
+
+
+#-------------------------------------------------------------------------------
+# hyphy mp2 target
+#-------------------------------------------------------------------------------
+add_executable(
+    HYPHYMP
+    EXCLUDE_FROM_ALL
+    ${SRC_COMMON} ${SRC_UNIXMAIN}
+)
+
+target_link_libraries(HYPHYMP ${DEFAULT_LIBRARIES})
+
+install(
+    TARGETS HYPHYMP
+    RUNTIME DESTINATION bin
+    OPTIONAL
+)
+
+add_custom_target(MP2 DEPENDS HYPHYMP)
+
+
+#-------------------------------------------------------------------------------
+# hyphy OpenCL target
+#-------------------------------------------------------------------------------
+find_package(OpenCL)
+if(${OPENCL_FOUND})
+
+    add_executable(
+        HYPHYOCL
+        EXCLUDE_FROM_ALL
+        ${SRC_COMMON} ${SRC_UNIXMAIN} ${CMAKE_CURRENT_BINARY_DIR}/src/ocl/opencl_kernels.h
+    )
+
+    include_directories(${OPENCL_INCLUDE_DIR} ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR}/src/ocl)
+    target_link_libraries(HYPHYOCL ${DEFAULT_LIBRARIES} ${OPENCL_LIBRARIES})
+
+    install(
+        TARGETS HYPHYOCL
+        RUNTIME DESTINATION bin
+        OPTIONAL
+    )
+
+    add_custom_target(OCL DEPENDS HYPHYOCL)
+    set_property(
+        TARGET HYPHYOCL
+        APPEND PROPERTY COMPILE_DEFINITIONS __MP__ __MP2__ __UNIX__ _HY_GPU_EXAMPLE_CALCULATOR MDSOCL
+    )
+    set_target_properties(
+        HYPHYOCL
+        PROPERTIES
+        COMPILE_FLAGS "${DEFAULT_COMPILE_FLAGS}"
+        LINK_FLAGS "${DEFAULT_LINK_FLAGS}"
+    )
+    add_executable(
+        cl2hdr
+        EXCLUDE_FROM_ALL
+        contrib/cl2hdr.c
+    )
+    add_custom_command(
+        OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/src/ocl/opencl_kernels.h
+        COMMAND cl2hdr ${CMAKE_CURRENT_SOURCE_DIR}/src/ocl/opencl_kernels.cl ${CMAKE_CURRENT_BINARY_DIR}/src/ocl/opencl_kernels.h
+        DEPENDS cl2hdr ${CMAKE_CURRENT_SOURCE_DIR}/src/ocl/opencl_kernels.cl
+    )
+endif(${OPENCL_FOUND})
+
+
+#-------------------------------------------------------------------------------
+# hyphy mpi target
+#-------------------------------------------------------------------------------
+find_package(MPI)
+
+if(${MPI_FOUND})
+
+    add_executable(
+        HYPHYMPI
+        EXCLUDE_FROM_ALL
+        ${SRC_COMMON} ${SRC_UNIXMAIN}
+    )
+
+    include_directories(${MPI_INCLUDE_PATH})
+
+    target_link_libraries(HYPHYMPI ${DEFAULT_LIBRARIES} ${MPI_LIBRARIES})
+
+    install(
+        TARGETS HYPHYMPI
+        RUNTIME DESTINATION bin
+        OPTIONAL
+    )
+
+    add_custom_target(MPI DEPENDS HYPHYMPI)
+
+    # set definitions here 'cause "s_t_p" below doesn't like lists
+    set_property(
+        TARGET HYPHYMPI
+        APPEND PROPERTY COMPILE_DEFINITIONS __HYPHYMPI__ __UNIX__ _HYPHY_LIBDIRECTORY_="${CMAKE_INSTALL_PREFIX}/lib/hyphy"
+    )
+
+    set_target_properties(
+        HYPHYMPI
+        PROPERTIES
+        COMPILE_FLAGS "${DEFAULT_COMPILE_FLAGS} ${MPI_COMPILE_FLAGS}"
+        LINK_FLAGS "${DEFAULT_LINK_FLAGS} ${MPI_LINK_FLAGS}"
+    )
+endif(${MPI_FOUND})
+
+
+#-------------------------------------------------------------------------------
+# hyphy debug target
+#-------------------------------------------------------------------------------
+add_executable(
+    HYPHYDEBUG
+    EXCLUDE_FROM_ALL
+    ${SRC_COMMON} ${SRC_UNIXMAIN}
+)
+
+target_link_libraries(HYPHYDEBUG ${DEFAULT_LIBRARIES})
+add_custom_target(DEBUG DEPENDS HYPHYDEBUG)
+
+set_target_properties(
+    HYPHYDEBUG
+    PROPERTIES
+    COMPILE_FLAGS "${DEFAULT_COMPILE_FLAGS} ${OpenMP_CXX_FLAGS} -g -fprofile-arcs -ftest-coverage -pg"
+    LINK_FLAGS "${DEFAULT_COMPILE_FLAGS} ${OpenMP_CXX_FLAGS} -g -fprofile-arcs -ftest-coverage -pg"
+)
+
+
+
+#-------------------------------------------------------------------------------
+# hyphy gtest target
+#-------------------------------------------------------------------------------
+add_executable(
+    HYPHYGTEST
+    EXCLUDE_FROM_ALL
+    ${SRC_COMMON} ${SRC_GTESTS} ${SRC_UNIXMAIN}
+)
+add_dependencies(HYPHYGTEST gtest)
+target_link_libraries(HYPHYGTEST ${DEFAULT_LIBRARIES} gtest)
+add_custom_target(GTEST DEPENDS HYPHYGTEST)
+
+set_property(
+    TARGET HYPHYGTEST
+    APPEND PROPERTY COMPILE_DEFINITIONS __UNITTEST__
+)
+set_target_properties(
+    HYPHYGTEST
+    PROPERTIES
+    COMPILE_FLAGS "${DEFAULT_COMPILE_FLAGS} ${OpenMP_CXX_FLAGS} -msse3 -g -fprofile-arcs -ftest-coverage -pg"
+    LINK_FLAGS "${DEFAULT_COMPILE_FLAGS} ${OpenMP_CXX_FLAGS} -msse3 -g -fprofile-arcs -ftest-coverage -pg"
+)
+
+#-------------------------------------------------------------------------------
+# hyphy gtk+ target
+#-------------------------------------------------------------------------------
+
+
+find_package(GTK2 2.6)
+
+if((${GTK2_FOUND}))
+	file(
+        GLOB SRC_GUI_GTK
+        src/gui/gtk/*.cpp
+        src/gui/gtk/Components/*.cpp
+        src/gui/gtk/WindowClasses/*.cpp
+    )
+	include_directories(
+        ${GTK2_INCLUDE_DIRS}
+        src/gui/gtk/include
+        src/gui/gtk/include/Components
+        /Developer/Headers/FlatCarbon
+    )
+	add_executable(
+        HYPHYGTK
+        EXCLUDE_FROM_ALL
+        ${SRC_GUI_GTK} ${SRC_GTKMAIN} ${SRC_GUI} ${SRC_COMMON}
+    )
+    target_link_libraries(HYPHYGTK ${DEFAULT_LIBRARIES} ${GTK2_LIBRARIES})
+
+	add_custom_target(GTK DEPENDS HYPHYGTK)
+
+	install(DIRECTORY src/gui/res/GTKResources/ DESTINATION lib/hyphy/GTKResources)
+
+  install(
+        TARGETS HYPHYGTK
+        RUNTIME DESTINATION bin
+        OPTIONAL
+    )
+
+    set_property(
+        TARGET HYPHYGTK
+        APPEND PROPERTY COMPILE_DEFINITIONS __HYPHY_GTK__ GDK_PIXBUF_ENABLE_BACKEND __UNIX__ _HYPHY_LIBDIRECTORY_="${CMAKE_INSTALL_PREFIX}/lib/hyphy"
+    )
+    set_target_properties(
+        HYPHYGTK
+        PROPERTIES
+        COMPILE_FLAGS "${DEFAULT_COMPILE_FLAGS} ${GTK2_COMPILE_FLAGS}"
+        LINK_FLAGS "${DEFAULT_LINK_FLAGS} ${GTK2_LINK_FLAGS}"
+    )
+endif((${GTK2_FOUND}))
+
+#-------------------------------------------------------------------------------
+# target-specific and occasionally-shared properties
+#-------------------------------------------------------------------------------
+
+if(UNIX)
+    set_property(
+        TARGET HYPHYMP hyphy_mp HYPHYGTEST HYPHYDEBUG
+        APPEND PROPERTY COMPILE_DEFINITIONS __UNIX__
+    )
+endif(UNIX)
+
+set_property(
+    TARGET hyphy_mp HYPHYMP
+    APPEND PROPERTY COMPILE_DEFINITIONS __MP__ __MP2__
+)
+
+set_property(
+    TARGET hyphy_mp HYPHYMP HYPHYGTEST HYPHYDEBUG
+    APPEND PROPERTY COMPILE_DEFINITIONS _HYPHY_LIBDIRECTORY_="${CMAKE_INSTALL_PREFIX}/lib/hyphy"
+)
+
+set_property(
+    TARGET HYPHYDEBUG HYPHYGTEST
+    APPEND PROPERTY COMPILE_DEFINITIONS __HYPHYDEBUG__
+)
+
+set_target_properties(
+    hyphy_mp HYPHYMP
+    PROPERTIES
+    COMPILE_FLAGS "${DEFAULT_COMPILE_FLAGS} ${OpenMP_CXX_FLAGS}"
+    LINK_FLAGS "${DEFAULT_LINK_FLAGS} ${OpenMP_CXX_FLAGS}"
+)
+
+
+#-------------------------------------------------------------------------------
+# hyphy MacOSX gui target
+#-------------------------------------------------------------------------------
+if(APPLE AND NOT ${MACOSX_GT_LION})
+
+    #---------------------------------------------------------------------------
+    # MacOSX gui files
+    #---------------------------------------------------------------------------
+    set(RES_MACGUI src/gui/mac/HyPhy.rsrc src/gui/mac/HYPHYMP.icns)
+    set(RES_MACGUIDEBUG src/gui/mac/iHyPhyDebug.rsrc src/gui/mac/HYPHYMP.icns)
+    file(
+        GLOB SRC_MACGUI
+        src/gui/mac/*.cpp
+        src/gui/mac/Components/*.cpp
+        src/gui/mac/WindowClasses/*.cpp
+    )
+
+    #---------------------------------------------------------------------------
+    # MacOSX gui executable and directives
+    #---------------------------------------------------------------------------
+    add_executable(HyPhy
+        MACOSX_BUNDLE
+		    EXCLUDE_FROM_ALL
+        ${SRC_CORE} ${SRC_NEW} ${SRC_SQLITE3} ${SRC_GUI} ${SRC_MACGUI} ${SRC_MACMAIN}
+        ${RES_MACGUI}
+    )
+
+    add_executable(iHyPhyDebug
+        MACOSX_BUNDLE
+        EXCLUDE_FROM_ALL
+        ${SRC_CORE} ${SRC_NEW} ${SRC_SQLITE3} ${SRC_GUI} ${SRC_MACGUI} ${SRC_MACMAIN}
+        ${RES_MACGUIDEBUG}
+    )
+
+    include_directories(src/gui/mac/include src/gui/mac/include/Components /Developer/Headers/FlatCarbon)
+    find_library(CARBON NAMES Carbon)
+    find_library(QUICKTIME NAMES Quicktime)
+    target_link_libraries(HyPhy ${DEFAULT_LIBRARIES} ${CARBON} ${QUICKTIME})
+    target_link_libraries(iHyPhyDebug ${DEFAULT_LIBRARIES} ${CARBON} ${QUICKTIME})
+    add_custom_target(MAC DEPENDS HyPhy)
+    add_custom_target(MACDebug DEPENDS iHyPhyDebug)
+
+    #---------------------------------------------------------------------------
+    # install the hyphy hbl stdlib into the .app
+    #---------------------------------------------------------------------------
+
+    get_target_property    (HYPHY_APPEXE HyPhy LOCATION)
+    get_filename_component (HYPHY_APPDIR ${HYPHY_APPEXE} PATH)
+
+    add_custom_command(
+        TARGET HyPhy
+        PRE_BUILD
+        COMMAND ${CMAKE_COMMAND} -E remove_directory ${HYPHY_APPDIR}/../Resources/HBL
+    )
+    add_custom_command(
+        TARGET HyPhy
+        POST_BUILD
+        COMMAND ${CMAKE_COMMAND} -E copy_directory ${CMAKE_CURRENT_SOURCE_DIR}/res ${HYPHY_APPDIR}/../Resources/HBL
+    )
+
+    get_target_property    (IHYPHYDEBUG_APPEXE iHyPhyDebug LOCATION)
+    get_filename_component (IHYPHYDEBUG_APPDIR ${IHYPHYDEBUG_APPEXE} PATH)
+
+	add_custom_target(
+		HYPHY_DMG
+		DEPENDS HyPhy
+	)
+
+	set (HYPHY_DISTRIBUTE_DIR ${HYPHY_APPDIR}/../../../HyPhy${HYPHY_VERSION})
+
+	find_program (HAZ_DMG_CANVAS "dmgcanvas")
+
+	if (${HAZ_DMG_CANVAS} MATCHES ".+dmgcanvas$")
+		add_custom_command(
+				TARGET HYPHY_DMG
+				POST_BUILD
+				COMMAND ${HAZ_DMG_CANVAS} ${CMAKE_CURRENT_SOURCE_DIR}/installers/Mac/MAC_dmg_template.dmgCanvas ${CMAKE_CURRENT_SOURCE_DIR}/installers/Mac/hyphy.dmg
+			)
+	else (${HAZ_DMG_CANVAS} MATCHES ".+dmgcanvas$")
+		add_custom_command(
+				TARGET HYPHY_DMG
+				POST_BUILD
+				COMMAND ${CMAKE_COMMAND} -E remove_directory ${HYPHY_DISTRIBUTE_DIR}
+				COMMAND ${CMAKE_COMMAND} -E make_directory ${HYPHY_DISTRIBUTE_DIR}
+				COMMAND ${CMAKE_COMMAND} -E make_directory ${HYPHY_DISTRIBUTE_DIR}/Documentation/
+				COMMAND ${CMAKE_COMMAND} -E make_directory ${HYPHY_DISTRIBUTE_DIR}/HyPhy.app/
+				COMMAND ${CMAKE_COMMAND} -E copy_directory ${HYPHY_DISTRIBUTE_DIR}/../HyPhy.app ${HYPHY_DISTRIBUTE_DIR}/HyPhy.app/
+				COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/help/SelectionAnalyses.pdf ${HYPHY_DISTRIBUTE_DIR}/Documentation/
+				COMMAND ${CMAKE_COMMAND} -E copy "${CMAKE_CURRENT_SOURCE_DIR}/help/Getting Started With HyPhy.pdf" ${HYPHY_DISTRIBUTE_DIR}/Documentation/
+				COMMAND ${CMAKE_COMMAND} -E remove -f ${HYPHY_DISTRIBUTE_DIR}/../hyphy.dmg
+				COMMAND hdiutil create -srcfolder ${HYPHY_DISTRIBUTE_DIR} -format UDBZ ${HYPHY_DISTRIBUTE_DIR}/../hyphy.dmg
+			)
+	endif (${HAZ_DMG_CANVAS} MATCHES ".+dmgcanvas$")
+
+    add_custom_command(
+        TARGET iHyPhyDebug
+        PRE_BUILD
+        COMMAND ${CMAKE_COMMAND} -E remove_directory ${IHYPHYDEBUG_APPDIR}/../Resources/HBL
+    )
+    add_custom_command(
+        TARGET iHyPhyDebug
+        POST_BUILD
+        COMMAND ${CMAKE_COMMAND} -E copy_directory ${CMAKE_CURRENT_SOURCE_DIR}/res ${IHYPHYDEBUG_APPDIR}/../Resources/HBL
+    )
+
+    #---------------------------------------------------------------------------
+    # MacOSX gui-specific properties
+    #---------------------------------------------------------------------------
+    set_property(
+        TARGET HyPhy
+        APPEND PROPERTY COMPILE_DEFINITIONS __HYPHYXCODE__ __MAC__ __MP__ __MP2__ APPNAME="HyPhy"
+    )
+    set_property(
+        TARGET iHyPhyDebug
+        APPEND PROPERTY COMPILE_DEFINITIONS __HYPHYXCODE__ __MAC__ __MP__ __MP2__ __HYPHYDEBUG__ APPNAME="iHyPhyDebug"
+    )
+    set_target_properties(
+        HyPhy
+        PROPERTIES
+        COMPILE_FLAGS "${DEFAULT_COMPILE_FLAGS} -Ofast -Wno-char-subscripts -Wno-deprecated -Wno-deprecated-declarations -Wno-sign-compare"
+        LINK_FLAGS "${DEFAULT_COMPILE_FLAGS} -Ofast -Wno-char-subscripts -Wno-deprecated -Wno-deprecated-declarations -Wno-sign-compare"
+        XCODE_ATTRIBUTE_ENABLE_OPENMP_SUPPORT YES
+        XCODE_GCC_AUTO_VECTORIZATION YES
+	)
+    set_target_properties(
+        iHyPhyDebug
+        PROPERTIES
+        COMPILE_FLAGS "${DEFAULT_COMPILE_FLAGS} -Wno-char-subscripts -Wno-deprecated -Wno-deprecated-declarations -Wno-sign-compare -g -O0"
+        LINK_FLAGS "${DEFAULT_COMPILE_FLAGS} -Wno-char-subscripts -Wno-deprecated -Wno-deprecated-declarations -Wno-sign-compare -g -O0"
+	)
+
+    set_property(
+        SOURCE
+        src/gui/mac/hydialogs.cpp
+        src/gui/mac/HYPlatformComponent.cpp
+        src/gui/mac/HYPlatformUtils.cpp
+        src/gui/mac/HYPlatformWindow.cpp
+        src/gui/mac/Components/HYPlatformCheckBox.cpp
+        src/gui/mac/Components/HYPlatformPullDown.cpp
+        src/gui/mac/WindowClasses/HYPlatformChartWindow.cpp
+        src/gui/mac/WindowClasses/HYPlatformConsoleWindow.cpp
+        src/gui/mac/WindowClasses/HYPlatformDataPanel.cpp
+        src/gui/mac/WindowClasses/HYPlatformModelWindow.cpp
+        src/gui/mac/WindowClasses/HYPlatformParameterTable.cpp
+        src/gui/mac/WindowClasses/HYPlatformPWindow.cpp
+        src/gui/mac/WindowClasses/HYPlatformTreePanel.cpp
+        src/gui/preferences.cpp
+        src/mains/mac.cpp
+        PROPERTY COMPILE_FLAGS "-fpascal-strings"
+    )
+    set_source_files_properties(
+        ${RES_MACGUI}
+        PROPERTIES MACOSX_PACKAGE_LOCATION Resources
+    )
+
+    set_source_files_properties(
+        ${RES_MACGUIDEBUG}
+        PROPERTIES MACOSX_PACKAGE_LOCATION Resources
+    )
+
+    set_target_properties(
+        HyPhy
+        PROPERTIES MACOSX_BUNDLE_INFO_PLIST src/gui/mac/Info.plist
+    )
+
+    set_target_properties(
+        HyPhy MAC
+        PROPERTIES
+        OSX_ARCHITECTURES i386
+    )
+
+   
+    set_target_properties(
+        HyPhy HYPHY_DMG
+        PROPERTIES
+        OSX_ARCHITECTURES i386
+    )
+
+    set_target_properties(
+        iHyPhyDebug
+        PROPERTIES MACOSX_BUNDLE_INFO_PLIST src/gui/mac/Info.plist
+    )
+    set_target_properties(
+        iHyPhyDebug MACDebug
+        PROPERTIES
+        OSX_ARCHITECTURES i386
+    )
+endif(APPLE AND NOT ${MACOSX_GT_LION})
diff --git a/Examples/BatchLanguage/MatrixIndexing.bf b/Examples/BatchLanguage/MatrixIndexing.bf
new file mode 100644
index 0000000..aa1344d
--- /dev/null
+++ b/Examples/BatchLanguage/MatrixIndexing.bf
@@ -0,0 +1 @@
+fprintf (stdout, "\n1). Spawning a zero-populated 5x6 matrix and setting it's values to random numbers in [0,1].\n");
aMatrix = {5,6};
aMatrix = aMatrix ["Random(0,1)"];
fprintf (stdout, aMatrix, "\n");

fprintf (stdout, "\n2). Accessing a second-row third-column element and a random element.\n\n");
r = Random (0, Rows(aMatrix))$1;
c = Random (0, Columns(aMatrix))$1;
fprintf (stdout, "matrix[1][2]=", aMatrix[1][2], "\nmatrix[", r , "][" , c, "]=", aMatrix[r][c], "\n");

fprintf (stdout, "\n3). Accessing the fourth row.\n\n");
fprintf (stdout, "matrix[3][-1]=\n", aMatrix[3][-1],"\n");

fprintf (stdout, "\n4). Accessing the first column.\n\n");
fprintf (stdout, "matrix[-1][0]=\n", aMatrix[-1][0],"\n");

fprintf (stdout, "\n5). Populating a matrix template (below the diagonal).\n\n");
template={5,6};
template=template["_MATRIX_ELEMENT_ROW_>_MATRIX_ELEMENT_COLUMN_"];
fprintf (stdout, template ,"\n");

fprintf (stdout, "\n6). Extracting (by row) matrix elements using the template.\n\n");
fprintf (stdout, aMatrix[template] ,"\n");

fprintf (stdout, "\n7). Extracting a submatrix: top left corner at (1,1) - bottom right corner at (3,2).\n\n");
fprintf (stdout, "matrix[{{1,1}}][{{3,2}}]=\n", aMatrix[{{1,1}}][{{3,2}}],"\n");

fprintf (stdout, "\n8). Returning a matrix in which all elements are squared and above diagonal elements are further increased by 1.\n\n");
fprintf (stdout, "\n", aMatrix["_MATRIX_ELEMENT_VALUE_^2+(_MATRIX_ELEMENT_ROW_<_MATRIX_ELEMENT_COLUMN_)"],"\n");

\ No newline at end of file
diff --git a/Examples/BatchLanguage/profile_test.bf b/Examples/BatchLanguage/profile_test.bf
new file mode 100644
index 0000000..64cee8b
--- /dev/null
+++ b/Examples/BatchLanguage/profile_test.bf
@@ -0,0 +1 @@
+#profile START;

s = 0;
m = {5,1};

for (k=0; k<250000; k=k+1)
{
	s = s + k;
	t = Random (0,5);
	m [t] = m [t] + 1;
}

#profile PAUSE;

s2 = 0;
for (k=1; k<10000; k=k+1)
{
	s2 = s2+1/k;
}

#profile _hyphy_profile_dump;

stats  			= _hyphy_profile_dump["STATS"];
_profile_summer	= {1,Rows(stats)};
_profile_summer = _profile_summer["1"] * stats;
_instructions   = _hyphy_profile_dump["INSTRUCTION"];
_indices	    = _hyphy_profile_dump["INSTRUCTION INDEX"];

fprintf (stdout, "\nTotal run time (seconds)      : ", Format(_profile_summer[1]/1000000,15,6),
				 "\nTotal number of steps         : ", Format(_profile_summer[0],15,0), "\n\n");
				 
for (k=0; k<Columns(_instructions); k=k+1)
{
	fprintf (stdout, Format (_indices[k],6,0), " : ", _instructions[k], "\n\tCall count: ", stats[k][0], 
												   "\n\tTime (seconds): ", stats[k][1]/1000000, "\n");
}
\ No newline at end of file
diff --git a/Examples/Categories/data/aspectrin.nuc b/Examples/Categories/data/aspectrin.nuc
new file mode 100644
index 0000000..637919a
--- /dev/null
+++ b/Examples/Categories/data/aspectrin.nuc
@@ -0,0 +1 @@
+#NEXUS

BEGIN TAXA;
	DIMENSIONS NTAX = 4;
	TAXLABELS
		'humnal01' 'chikal01' 'flyal01' 'humeal01' ;
END;

BEGIN CHARACTERS;
	DIMENSIONS NCHAR = 324;
	FORMAT
		DATATYPE = DNA
		GAP=-
		MISSING=?
	;

MATRIX
	'humnal01'  TCCTATCGATTCCAGTTCTTTCAAAGAGATGCTGAAGAGCTGGAGAAATGGATACAGGAAAAACTTCAGATTGCATCTGATGAGAATTAT---AAAGACCCAACCAACTTGCAGGGAAAGCTTCAGAAGCATCAAGCATTTGAAGCTGAAGTGCAGGCCAACTCAGGAGCCATTGTTAAGCTGGATGAAACTGGAAACCTGATGATCTCAGAAGGGCATTTTGCATCTGAAACC------ATACGGACCCGTTTGATGGAGCTGCACCGCCAGTGGGAATTACTTTTGGAGAAGATGCGAGAAAAAGGAATCAAATTGCTGCAG
	'chikal01'  TCCTATCGGTTCCAGTTCTTCCAGCGTGATGCAGATGAGCTGGGAAAATGGATCCAAGAGAAACTCCAGATAGCATCTGATGAAAATTAC---AAAGACCCAAGCAATTTACAGGGGAAGCTGCAGAAGCACCAGGCCTTTGAAGCTGAGGTGCAGGCCAATTCAGGGGCTATCGTTAAGCTGGATGAGACTGGAAATCAGATGATCAATGAAGGCCATTTTGCATCTGAAACC------ATAAGAACTCGTCTACAGGAGCTGCACCGACTATGGGAGTTACTGCTGGAAAAAATGAGAGAGAAGGGAGTGAAGCTGTTGCAA
	'flyal01'   TCGCGCCGCTTCCAGTACTTCAAGCGCGATGCCGACGAGTTGGAGTCGTGGATCCACGAGAAGCTGCAGGCAGCCAGCGAGGAGAGCTAC---CGCGATCCGACCAACCTGCAGGCCAAAATCCAGAAACATCAGGCGTTCGAGGCGGAGGTGTCGGCGCACAGCAACGCCATTGTCTCGCTGGACAACACTGGCCAGGAGATGATCAACCAGCAACATTTTGCCTCCGAGTCG------ATTCAGGTCCGCCTCGACGAGCTGCACAAGCTGTGGGAGCTGCTTCTTAGCCGTCTGGCCGAGAAGGGTCTAAAGCTGCAGCAG
	'humeal01'  TCCTATCACTTACAAGTTTTCAAGCGAGATGCAGATGATCTGGGGAAGTGGATCATGGAGAAAGTCAATATCTTAACCGATAAGAGCTAT---GAAGACCCAACTAATATACAGGGGAAATATCAGAAGCATCAATCCCTTGAAGCAGAGGTGCAAACGAAATCAAGACTCATGTCTGAACTGGAAAAAACAAGGGAAGAACGATTTACCATGGGTCATTCTGCCCACGAAGAA------ACGAAGGCCCATATAGAGGAGCTACGCCACCTGTGGGACCTGCTGTTAGAGCTGACCCTGGAGAAGGGTGACCAGTTGCTGCGG;
END;

BEGIN TREES;
	TREE tree = ((humnal01,chikal01),flyal01,humeal01);
END;
\ No newline at end of file
diff --git a/Examples/Categories/definitions+MLE.bf b/Examples/Categories/definitions+MLE.bf
new file mode 100644
index 0000000..5368616
--- /dev/null
+++ b/Examples/Categories/definitions+MLE.bf
@@ -0,0 +1 @@
+/* This is an example HY-PHY Batch File.

	In this file, we will illustrate how to intergate category 
	variables into evolutionary models
	
   Sergei L. Kosakovsky Pond and Spencer V. Muse 
   June 2001. 
*/

/* 0. Read in the file that contains a function to display
	  properties of a category variable */
	  
#include "displayfunction.bf";
	  
/* 1. Read and filter the data */

DataSet 		spectrinData = ReadDataFile ("data/aspectrin.nuc");
DataSetFilter	filteredData = CreateFilter (spectrinData,1);
HarvestFrequencies (observedFreqs, filteredData, 1, 1, 1);

/* 2. Define the category variable PRIOR to initializing the model matrix */

category catVar = (2,EQUAL,MEAN, ,{{1}{5}}, 1,2);

/* 3. Now define the HKY85 model with each rate matrix enrty having the 
	  additional multiplier of catVar. This instructs HyPhy to compute 
	  E[likelihood] with respect to catVar. "t" is the branch length.s
*/

global   TR;
/* shared tranversion/transition ratio. */

HKY85RateMatrix = 

		{{*,			t*catVar*TR,		t*catVar,		t*catVar*TR}
		 {t*catVar*TR,	*,					t*catVar*TR,	t*catVar}
		 {t*catVar,		t*catVar*TR,		*,				t*catVar*TR}
		 {t*TR*catVar,	t*catVar,			t*catVar*TR,	*}};

Model HKY85	 = (HKY85RateMatrix, observedFreqs);

/* 4. Define the tree and the likelihood function. Obtain MLE and report results. */


Tree	givenTree = DATAFILE_TREE;
LikelihoodFunction  theLnLik = (filteredData, givenTree);
Export (modelStr, USE_LAST_MODEL);
fprintf (stdout, modelStr, "\n");
Optimize (result, theLnLik);
fprintf (stdout,"1). 2 fixed equiprobable rates\n\n",theLnLik);

/* Get information about the catVar:
	a two column matrix of rates and their probabilities,
	and pass it to the echoCatVar function (defined in
	the file included at step 0. for display */
	
GetInformation (catInfo,catVar);
catInfo = echoCatVar (catInfo);

/* 5. Redefine the category variable and repeat optimization. 
	  Note that the tree and the likelihood function must also be redefined
	  to incorporate the updates to catVar.*/

category catVar = (2,{{1/3}{2/3}} ,MEAN, ,{{1}{5}}, 1,2);
Tree	givenTree = DATAFILE_TREE;
LikelihoodFunction  theLnLik = (filteredData, givenTree);
Optimize (result, theLnLik);
fprintf (stdout,"\n\n2). 2 fixed rates with different probabilities\n\n",theLnLik);
GetInformation (catInfo,catVar);
catInfo = echoCatVar (catInfo);

global R = 1;
category catVar = (3,EQUAL,MEAN, ,{{R}{4*R}{9*R}}, 0, 1e25);
Tree	givenTree = DATAFILE_TREE;
LikelihoodFunction  theLnLik = (filteredData, givenTree);
Optimize (result, theLnLik);
fprintf (stdout,"\n\n3). 3 proportional equiprobable rates\n\n",theLnLik);
GetInformation (catInfo,catVar);
catInfo = echoCatVar (catInfo);

global lambda = 1;
rateMatrix = {8,1};
for (k=0; k<8; k=k+1)
{
	rateMatrix[k][0]:=k__;
}
probMatrix = {8,1}; 
probMatrix[0][0]:= Exp(-lambda);
factorial = 1;
for (k=1; k<8; k=k+1)
{
	factorial = factorial*k;
	probMatrix[k][0]:=lambda^(k__)/factorial__*Exp(-lambda);
}

category catVar = (8,probMatrix,MEAN, ,rateMatrix, 0, 1e25);
Tree	givenTree = DATAFILE_TREE;
LikelihoodFunction  theLnLik = (filteredData, givenTree);
Optimize (result, theLnLik);
fprintf (stdout,"4). Truncated Poisson with 8 rate classes.\n\n",theLnLik);
GetInformation (catInfo,catVar);
catInfo = echoCatVar (catInfo);

global P = .1;
P:<1;
rateMatrix = {10,1};
for (k=0; k<10; k=k+1)
{
	rateMatrix[k][0]:=k__;
}
probMatrix = {10,1}; 
probMatrix[0][0]:= (1-P);
for (k=1; k<10; k=k+1)
{
	probMatrix[k][0]:=(1-P)*P^(k__);
}

category catVar = (10,probMatrix,MEAN, ,rateMatrix, 0, 1e25);
Tree	givenTree = DATAFILE_TREE;
LikelihoodFunction  theLnLik = (filteredData, givenTree);
Optimize (result, theLnLik);
fprintf (stdout,"5). Truncated geometric with 10 rate classes.\n\n",theLnLik);
GetInformation (catInfo,catVar);
catInfo = echoCatVar (catInfo);

global 	lambda = 1;

category catVar =  (8,		/* number of rates */
					EQUAL,  /* probs. of rates */
					MEAN,	/* sampling method */
					lambda*Exp(-lambda*_x_), /* density */
					1-Exp(-lambda*_x_), /*CDF*/
					0, 				   /*left bound*/
					1e25, 			   /*right bound*/
					-_x_*Exp(-lambda*_x_) + (1-Exp(-lambda*_x_))/lambda 
						/* "antiderivative" of x f(x) */
				   );
				   
Tree	givenTree = DATAFILE_TREE;
LikelihoodFunction  theLnLik = (filteredData, givenTree);
Optimize (result, theLnLik);
fprintf (stdout,"6.1). Discretized (by MEAN) exponential with 8 rate classes.\n\n",theLnLik);
GetInformation (catInfo,catVar);
catInfo = echoCatVar (catInfo);

global 	lambda = 1;

category catVar =  (8,		/* number of rates */
					EQUAL,  /* probs. of rates */
					MEDIAN,	/* sampling method */
					lambda*Exp(-lambda*_x_), /* density */
					1-Exp(-lambda*_x_), /*CDF*/
					0, 				   /*left bound*/
					1e25, 			   /*right bound*/
					-_x_*Exp(-lambda*_x_) + (1-Exp(-lambda*_x_))/lambda 
						/* "antiderivative" of x f(x) */
				   );
				   
Tree	givenTree = DATAFILE_TREE;
LikelihoodFunction  theLnLik = (filteredData, givenTree);
Optimize (result, theLnLik);
fprintf (stdout,"6.2). Discretized (by MEDIAN) exponential with 8 rate classes.\n\n",theLnLik);
GetInformation (catInfo,catVar);
catInfo = echoCatVar (catInfo);

global 	lambda = 1;

category catVar =  (8,		/* number of rates */
					EQUAL,  /* probs. of rates */
					SCALED_MEDIAN,	/* sampling method */
					lambda*Exp(-lambda*_x_), /* density */
					1-Exp(-lambda*_x_), /*CDF*/
					0, 				   /*left bound*/
					1e25, 			   /*right bound*/
					-_x_*Exp(-lambda*_x_) + (1-Exp(-lambda*_x_))/lambda 
						/* "antiderivative" of x f(x) */
				   );
				   
Tree	givenTree = DATAFILE_TREE;
LikelihoodFunction  theLnLik = (filteredData, givenTree);
Optimize (result, theLnLik);
fprintf (stdout,"6.3). Discretized (by SCALED_MEDIAN) exponential with 8 rate classes.\n\n",theLnLik);
GetInformation (catInfo,catVar);
catInfo = echoCatVar (catInfo);

global alpha = .5;
alpha:>0.01;alpha:<100;

category catVar =  (10,		/* number of rates */
					EQUAL,  /* probs. of rates */
					MEAN,	/* sampling method */
					GammaDist(_x_,alpha,alpha), /* density */
					CGammaDist(_x_,alpha,alpha), /*CDF*/
					0, 				   /*left bound*/
					1e25, 			   /*right bound*/
					CGammaDist(_x_,alpha+1,alpha)
						/* "antiderivative" of x f(x) */
				   );

Tree	givenTree = DATAFILE_TREE;
LikelihoodFunction  theLnLik = (filteredData, givenTree);
Optimize (result, theLnLik);
fprintf (stdout,"7). Discretized gamma with 8 rate classes.\n\n",theLnLik);
GetInformation (catInfo,catVar);
catInfo = echoCatVar (catInfo);

global betaP = 1;
global betaQ = 1;
betaP:>0.05;betaP:<100;
betaQ:>0.05;betaQ:<100;

category catVar =  (8,		/* number of rates */
					EQUAL,  /* probs. of rates */
					MEAN,	/* sampling method */
					_x_^(betaP-1)*(1-_x_)^(betaQ-1)/Beta(betaP,betaQ), /* density */
					IBeta(_x_,betaP,betaQ), /*CDF*/
					0, 				   /*left bound*/
					1, 			   /*right bound*/
					IBeta(_x_,betaP+1,betaQ)*betaP/(betaP+betaQ)
						/* "antiderivative" of x f(x) */
				   );
Tree	givenTree = DATAFILE_TREE;
LikelihoodFunction  theLnLik = (filteredData, givenTree);
Optimize (result, theLnLik);
fprintf (stdout,"8). Discretized beta with 8 rate classes.\n\n",theLnLik);
GetInformation (catInfo,catVar);
catInfo = echoCatVar (catInfo);

global mu = 3;
global sigma  = .5;
sigma:>0.0001;
sqrt2pi = Sqrt(8*Arctan(1));

category catVar =  (8,		/* number of rates */
					EQUAL,  /* probs. of rates */
					MEAN,	/* sampling method */
					Exp((_x_-mu)(mu-_x_)/(2*sigma*sigma))/(sqrt2pi__*sigma)/ZCDF(mu/sigma), /* density */
					(1-ZCDF((mu-_x_)/sigma))/ZCDF(mu/sigma), /*CDF*/
					0, 				   /*left bound*/
					1e25, 			   /*right bound*/
					(mu*(1-ZCDF(-mu/sigma)-ZCDF((mu-_x_)/sigma))+
				    sigma*(Exp(-mu*mu/(2*sigma*sigma))-
				    Exp((_x_-mu)(mu-_x_)/(2*sigma*sigma)))/sqrt2pi__)/ZCDF(mu/sigma)
						/* "antiderivative" of x f(x) */
				   );

Tree	givenTree = DATAFILE_TREE;
LikelihoodFunction  theLnLik = (filteredData, givenTree);
Optimize (result, theLnLik);
fprintf (stdout,"9). Discretized normal>0 with 8 rate classes.\n\n",theLnLik);
GetInformation (catInfo,catVar);
catInfo = echoCatVar (catInfo);

/* 6. An example of Hidden Markov Chain correlation */

lambda:<1;
lambda=.125;
hiddenMarkovM = {8,8};
hiddenMarkovF = {8,1};
for (k=0; k<8; k=k+1)
{
	hiddenMarkovM [k][k] := lambda+(1-lambda)/8;
	hiddenMarkovF [k][1] := 1/8;
	
	for (l=k+1;l<8;l=l+1)
	{
		hiddenMarkovM [k][l] := (1-lambda)/8;
		hiddenMarkovM [l][k] := (1-lambda)/8;
	}
}
Model HMM = (hiddenMarkovM,hiddenMarkovF,false);
global alpha = .5;
alpha:>0.01;alpha:<100;

category catVar =  (8,		/* number of rates */
					hiddenMarkovF,  /* probs. of rates */
					MEAN,	/* sampling method */
					GammaDist(_x_,alpha,alpha), /* density */
					CGammaDist(_x_,alpha,alpha), /*CDF*/
					0, 				   /*left bound*/
					1e25, 			   /*right bound*/
					CGammaDist(_x_,alpha+1,alpha),
						/* "antiderivative" of x f(x) */
					HMM /* Hidden Markov transition model */
				   );

UseModel (HKY85); /* otherwise HMM would be applied to the tree */

Tree	givenTree = DATAFILE_TREE;
LikelihoodFunction  theLnLik = (filteredData, givenTree);
Optimize (result, theLnLik);
fprintf (stdout,"10). Discretized gamma with 8 rate classes and \n\tspatial rate correlation via a HMM.\n\n",theLnLik);
GetInformation (catInfo,catVar);
catInfo = echoCatVar (catInfo);

\ No newline at end of file
diff --git a/Examples/Categories/definitions.bf b/Examples/Categories/definitions.bf
new file mode 100644
index 0000000..fdc99ce
--- /dev/null
+++ b/Examples/Categories/definitions.bf
@@ -0,0 +1 @@
+/* This is an example HY-PHY Batch File.

	In this file, we will illustrate how to define discrete category
	variables to model rate heterogeneity.
	
   Sergei L. Kosakovsky Pond and Spencer V. Muse 
   June 2001. 
*/

/* this will display the category info, along with sample mean and variance */
#include "displayFunction.bf";


/* 1. We begin with the simplest possible category variable:

	it has two rates: 1 and 2 with probability .5 each
	
	The first argument in defining a category variable is the number of rate classes.
	
	The second argument defines the probability of each class. We set it to
	EQUAL.
	
	The third argument is only meaningful for continuously sampled distributions,
	and is essentially ignored.
	
	The fourth argument is the density of the distribution that we are sampling,
	which is again not applicable here.
	
	The fifth argument is the CDF of the distribution that we are sampling,
	which in this case consists of the explicit enumeration of rates.
	
	The sixth and seventh arguments are the bounds of the support of the distribution.
	([1,2]) in this case. For discrete distributions, the bounds are not important.

	The rest of the arguments aren't used for this simple case and are omitted.
*/

category catVar = (2,EQUAL,MEAN, ,{{1}{2}}, 1,2);

fprintf (stdout,"1). 2 fixed equiprobable rates\n");

GetInformation (catInfo,catVar);
catInfo = echoCatVar (catInfo);


/* 
   2. We modify the previous example so that rate "1" has probability 1/3 and
	  rate "2" has probability 2/3. To that end we simply replace the second
	  argument with the explicit matrix of frequencies.
*/

category catVar = (2,{{1/3}{2/3}} ,MEAN, ,{{1}{2}}, 1,2);

fprintf (stdout,"2). 2 fixed rates with different probabilities\n");

GetInformation (catInfo,catVar);
catInfo = echoCatVar (catInfo);


/* 
   3. Next category variable has 3 equiprobable rates which depend on the parameter R, which
   and maintain the ratios 1:4:9. 
*/

global R;

category catVar = (3,EQUAL,MEAN, ,{{R}{4*R}{9*R}}, 0, 1e25);

R = 1;
fprintf (stdout,"3). 3 proportional equiprobable rates\n R = 1.\n");

GetInformation (catInfo,catVar);
catInfo = echoCatVar (catInfo);


R = 5;
fprintf (stdout,"\n R = 5. \n");

GetInformation (catInfo,catVar);
catInfo = echoCatVar (catInfo);


/* 
   4. The next example prompts the user to enter the number of categories and
   the ratios between categories.
*/

fprintf (stdout,"4). User defined discrete distribution\n\n Enter the number of categories:");
fscanf (stdin,"Number",rateCount);

if (rateCount<=1)
{
	fprintf (stdout, "\n\n", rateCount, " is an invalid number of categories");
	return;
}

/* define the matrix for the ratios */

multiplierMatrix = {rateCount,1};

fprintf (stdout,"\n");

for (k=0; k<rateCount; k=k+1)
{
	fprintf (stdout, "Multiplier for category ", k+1,":");
	fscanf (stdin,"Number",M);
	multiplierMatrix[k][0]:=M__*R;
	/* the use of M__ forces HyPhy to substitute the numeric value of M into the expression.
	   If we didn't use it, all matrix entries would hold the same expression : "M*R"
	 */
}

category catVar = (rateCount,EQUAL,MEAN, ,multiplierMatrix, 0, 1e25);

R=1;
fprintf (stdout,"\n R = 1. \n");
GetInformation (catInfo,catVar);
catInfo = echoCatVar (catInfo);


R=2;
fprintf (stdout,"\n R = 2. \n");
GetInformation (catInfo,catVar);
catInfo = echoCatVar (catInfo);


/* 
   5. Here is a way to define the general discrete distribution with 3 rates.
   Note how we avoid the use of P1+P2+P3=1 constraint be an alternative 
   parametrization.
*/

global P  = 1/6;
global P1 = 1/3;

/* constrain the probabilities to be no more than 1 */

P:<1;
P1:<1;

/* probability matrix */

probMatrix = {{P}
			  {(1-P)P1}
			  {(1-P)(1-P1)}};
			  
/* rate matrix is parametrized in such a way that rate1<=rate2<=rate3.
   It is just a matter of preference though. */
   
global  M1 = 2;
global  M2 = 1.5;  
   
M1:>1;
M2:>1;  

rateMatrix = {{R}
			  {R*M1}
			  {R*M1*M2}};
			  
category catVar = (3,probMatrix,MEAN, ,rateMatrix, 0, 1e25);

R=1;
fprintf (stdout,"5). General Discrete Distribution with 3 rate classes.\n");

GetInformation (catInfo,catVar);
catInfo = echoCatVar (catInfo);


/* 
   6. Truncated ([0,9]) Poisson with parameter lambda. P{X=k} = lambda^k/k! Exp(-lambda)
*/

global lambda = .9;

rateMatrix = {10,1};
for (k=0; k<10; k=k+1)
{
	rateMatrix[k][0]:=k__;
}

probMatrix = {10,1}; 

probMatrix[0][0]:= Exp(-lambda);
factorial = 1;
for (k=1; k<10; k=k+1)
{
	factorial = factorial*k;
	probMatrix[k][0]:=lambda^(k__)/factorial__*Exp(-lambda);
}

/* HYPHY will automatically normalize the probability matrix to sum to 1 
if it doesn't already */

category catVar = (10,probMatrix,MEAN, ,rateMatrix, 0, 1e25);

fprintf (stdout,"6). Truncated Poisson with 10 rate classes (lambda = .9).\n");
GetInformation (catInfo,catVar);
catInfo = echoCatVar (catInfo);


/* 
   7. Truncated geometric with parameter p. P{X=k} = (1-p)p^k
*/

fprintf (stdout,"7). Truncated geometric (P=.25) with user specified number of classes.\n\n Enter the number of categories:");
fscanf (stdin,"Number",rateCount);

if (rateCount<=1)
{
	fprintf (stdout, "\n\n", rateCount, " is an invalid number of categories");
	return;
}

global P = .25;
P:<1;

rateMatrix = {rateCount,1};
for (k=0; k<rateCount; k=k+1)
{
	rateMatrix[k][0]:=k__;
}
probMatrix = {rateCount,1}; 
probMatrix[0][0]:= 1-P;
for (k=1; k<rateCount; k=k+1)
{
	probMatrix[k][0]:=(1-P)P^(k__);
}

/* HYPHY will automatically normalize the probability matrix to sum to 1 
if it doesn't already */

category catVar = (rateCount,probMatrix,MEAN, ,rateMatrix, 0, 1e25);

GetInformation (catInfo,catVar);
catInfo = echoCatVar (catInfo);

\ No newline at end of file
diff --git a/Examples/Categories/definitions2.bf b/Examples/Categories/definitions2.bf
new file mode 100644
index 0000000..3cf4411
--- /dev/null
+++ b/Examples/Categories/definitions2.bf
@@ -0,0 +1 @@
+/* This is an example HY-PHY Batch File.

	In this file, we will illustrate how to define category
	variables sampled from continuous distribution to model rate heterogeneity.
	
   Sergei L. Kosakovsky Pond and Spencer V. Muse 
   June 2001. 
*/

/* 1. We begin with a simple distribution:

	it has 4 equiprobable rate classes
	
	The first argument in defining a category variable is the number of rate classes.
	
	The second argument defines the probability of each class. We set it to
	EQUAL.
	
	The third argument determines how the continuous distribution is sampled:
		MEAN - weighted (conditional) mean over an interval
		MEDIAN - median of the interval
		SCALED_MEDIAN - medians of the intervals scaled so that the discretized
		distribution has the same mean as the continous one.
	
	The fourth argument is the density of the distribution that we are sampling;
	Let us begin with the exponential random variable over [0,Inf].
	Its density is 
		
		f(_x_) = lambda Exp(-lambda _x_). 
	
	It MUST be defined in terms of "_x_" (and  other parameters if applicable, e.g "lambda" here).
	"_x_" is the variable of integration.
	
	The fifth argument is the CDF of the distribution that we are sampling.
	It can be left blank to suggest that HyPhy numerically integrate the density,
	but should always be specified if known, because it will GREATLY improve the speed.
	It must also be defined in terms of _x_ and specify P{X<=_x_}.
	For the exponential random variable the CDF is:
	
		F(_x_) = 1-Exp(-lamda _x_).
	
	The sixth and seventh arguments are the bounds of the support of the distribution.
	([0,1e25] in this case: 1e25 -or any other large number- is Inf). 

	The seventh (optional) argument is only used if "MEAN" sampling is requested.
	It is the formula which gives the intergal of x f(x) over the interval (-Inf, _x_].
	It is used for computing conditional means. If this argument is not supplied, 
	HyPhy will perform numerical integration (which is much slower than direct evaluation).
	
	For the exponential random variable it is:
	
	-_x_ Exp (-lambda _x_) + (1-Exp(-lambda _x_)/lambda
*/

/* this will display the category info, along with sample mean and variance */
#include "displayFunction.bf";

global lambda = 2;

category catVar =  (4,		/* number of rates */
					EQUAL,  /* probs. of rates */
					MEAN,	/* sampling method */
					lambda*Exp(-lambda*_x_), /* density */
					1-Exp(-lambda*_x_), /*CDF*/
					0, 				   /*left bound*/
					1e25, 			   /*right bound*/
					-_x_*Exp(-lambda*_x_) + (1-Exp(-lambda*_x_))/lambda 
						/* "antiderivative" of x f(x) */
				   );

fprintf (stdout,"1). 4 equiprobable rates sampled from Exponential with lambda = 2\n");

GetInformation (catInfo,catVar);
fprintf (stdout, "\nSample by MEAN:");
catInfo = echoCatVar (catInfo);
/* note that sample mean if 1/2 as expected, because it is the mean of exponential with lambda = 2,
   sample variance if close to 1/4 which is what it is for the continuous case. If we increase the number
   of classes, sample variance will approach 1/4 */

/* now we try the sampling by median. Notice that the sample mean is no longer 1/2 */

category catVar =  (4,		/* number of rates */
					EQUAL,  /* probs. of rates */
					MEDIAN,	/* sampling method */
					lambda*Exp(-lambda*_x_), /* density */
					1-Exp(-lambda*_x_), /*CDF*/
					0, 				   /*left bound*/
					1e25, 			   /*right bound*/
					-_x_*Exp(-lambda*_x_) + (1-Exp(-lambda*_x_))/lambda 
						/* "antiderivative" of x f(x) */
				   );
				   
GetInformation (catInfo,catVar);
fprintf (stdout, "\nSample by MEDIAN:");
catInfo = echoCatVar (catInfo);

/* now we try the sampling by scaled median. The sample mean is back to 1/2 */

category catVar =  (4,		/* number of rates */
					EQUAL,  /* probs. of rates */
					SCALED_MEDIAN,	/* sampling method */
					lambda*Exp(-lambda*_x_), /* density */
					1-Exp(-lambda*_x_), /*CDF*/
					0, 				   /*left bound*/
					1e25, 			   /*right bound*/
					-_x_*Exp(-lambda*_x_) + (1-Exp(-lambda*_x_))/lambda 
						/* "antiderivative" of x f(x) */
				   );
				   
GetInformation (catInfo,catVar);
fprintf (stdout, "\nSample by SCALED_MEDIAN:");
catInfo = echoCatVar (catInfo);

/* Sample by MEAN again. Omit the last term to try numerical averaging. 
  Numerical avergaing is VERY SLOW compared to direct evaluation, so
  don't use unless you must! */

category catVar =  (4,		/* number of rates */
					EQUAL,  /* probs. of rates */
					MEAN,	/* sampling method */
					lambda*Exp(-lambda*_x_), /* density */
					1-Exp(-lambda*_x_), /*CDF*/
					0, 				   /*left bound*/
					1e25, 			   /*right bound*/
				   );
				   
GetInformation (catInfo,catVar);
fprintf (stdout, "\nSample by MEAN (numerical averaging):");
catInfo = echoCatVar (catInfo);

/* Sample by MEAN again. Omit CDF AND the average to do both numerically.
   This is by far the slowest method of sampling. Use it only if there
   is absolutely no other choice! */

category catVar =  (4,		/* number of rates */
					EQUAL,  /* probs. of rates */
					MEAN,	/* sampling method */
					lambda*Exp(-lambda*_x_), /* density */
					,                  /*skip CDF */
					0, 				   /*left bound*/
					1e25, 			   /*right bound*/
				   );
				   
GetInformation (catInfo,catVar);
fprintf (stdout, "\nSample by MEAN (numerical CDF and averaging):");
catInfo = echoCatVar (catInfo);


/* 2. The only guaranteed way to "embed" models by increasing the number
of rate classes is to use MEDIAN sampling, and increase the number
of categories by a factor of 3. Note that in this example
all rates sampled with 3 classes are also present in the 9 rate 
class sample */

fprintf (stdout,"2). Equiprobable rates sampled from Exponential with lambda = 2\n");

category catVar =  (3,		/* number of rates */
					EQUAL,  /* probs. of rates */
					MEDIAN,	/* sampling method */
					lambda*Exp(-lambda*_x_), /* density */
					1-Exp(-lambda*_x_), /*CDF*/
					0, 				   /*left bound*/
					1e25, 			   /*right bound*/
					-_x_*Exp(-lambda*_x_) + (1-Exp(-lambda*_x_))/lambda 
						/* "antiderivative" of x f(x) */
				   );
				   
GetInformation (catInfo,catVar);
fprintf (stdout, "\nSample by MEDIAN (3 rate classes):");
catInfo = echoCatVar (catInfo);

category catVar =  (9,		/* number of rates */
					EQUAL,  /* probs. of rates */
					MEDIAN,	/* sampling method */
					lambda*Exp(-lambda*_x_), /* density */
					1-Exp(-lambda*_x_), /*CDF*/
					0, 				   /*left bound*/
					1e25, 			   /*right bound*/
					-_x_*Exp(-lambda*_x_) + (1-Exp(-lambda*_x_))/lambda 
						/* "antiderivative" of x f(x) */
				   );
				   
GetInformation (catInfo,catVar);
fprintf (stdout, "\nSample by MEDIAN (9 rate classes):");
catInfo = echoCatVar (catInfo);

/* 3. Sampling the Gamma distribution requires special functions.  */

fprintf (stdout,"3). Equiprobable rates sampled from Gamma with mean 1, variance 1/10. \n");

global alpha = 10;
/* gamma distrubution develops very high derivatives 
for small or large alpha values, and they can't be 
sampled reliably - thus the bounds on alpha.*/

alpha:>0.01;alpha:<100;

category catVar =  (10,		/* number of rates */
					EQUAL,  /* probs. of rates */
					MEAN,	/* sampling method */
					GammaDist(_x_,alpha,alpha), /* density */
					CGammaDist(_x_,alpha,alpha), /*CDF*/
					0, 				   /*left bound*/
					1e25, 			   /*right bound*/
					CGammaDist(_x_,alpha+1,alpha)
						/* "antiderivative" of x f(x) */
				   );
				   
GetInformation (catInfo,catVar);
fprintf (stdout, "\nSample by MEAN (10 rate classes):");
catInfo = echoCatVar (catInfo);

/* 4. General Gamma distribution has mean alpha/beta, variance alpha/beta^2  */

fprintf (stdout,"4). Equiprobable rates sampled from Gamma with mean 2, variance 1/25. \n");

global alpha = 100;

/* gamma distrubution develops very high derivatives 
for small or large alpha/beta values, and they can't be 
sampled reliably - thus the bounds on alpha.*/

alpha:>0.01;alpha:<100;
global beta =  50; 
beta:>0.01;beta:<100;

category catVar =  (10,		/* number of rates */
					EQUAL,  /* probs. of rates */
					MEAN,	/* sampling method */
					GammaDist(_x_,alpha,beta), /* density */
					CGammaDist(_x_,alpha,beta), /*CDF*/
					0, 				   /*left bound*/
					1e25, 			   /*right bound*/
					CGammaDist(_x_,alpha+1,beta)*alpha/beta
						/* "antiderivative" of x f(x) */
				   );
				   
GetInformation (catInfo,catVar);
fprintf (stdout, "\nSample by MEAN (10 rate classes):");
catInfo = echoCatVar (catInfo);

/* 5. A sample from the beta distribution.
	  Beta distributions has mean p/(p+q) and variance pq/[(p+q)^2(p+q+1)]  */

fprintf (stdout,"5). Equiprobable rates sampled from Beta with mean 1/2 , variance 1/12. \n");

/* beta distrubution develops very high derivatives 
for small or large P and Q values, and they can't be 
sampled reliably - thus the bounds on alpha.*/

global betaP = 1;
global betaQ = 1;
betaP:>0.05;betaP:<100;
betaQ:>0.05;betaQ:<100;

category catVar =  (8,		/* number of rates */
					EQUAL,  /* probs. of rates */
					MEAN,	/* sampling method */
					_x_^(betaP-1)*(1-_x_)^(betaQ-1)/Beta(betaP,betaQ), /* density */
					IBeta(_x_,betaP,betaQ), /*CDF*/
					0, 				   /*left bound*/
					1, 			   /*right bound*/
					IBeta(_x_,betaP+1,betaQ)*betaP/(betaP+betaQ)
						/* "antiderivative" of x f(x) */
				   );
				   
GetInformation (catInfo,catVar);
fprintf (stdout, "\nSample by MEAN (8 rate classes):");
catInfo = echoCatVar (catInfo);

/* 6. A sample from the normal restricted to [0, Inf). ZCDF is the N(0,1) CDF.*/

fprintf (stdout,"6). Equiprobable rates sampled from Normal(>0) with mean 3 , variance 1/4. \n");

global mu = 3;
global sigma  = .5;
sigma:>0.0001;

sqrt2pi = Sqrt(8*Arctan(1));

category catVar =  (8,		/* number of rates */
					EQUAL,  /* probs. of rates */
					MEAN,	/* sampling method */
					Exp((_x_-mu)(mu-_x_)/(2*sigma*sigma))/(sqrt2pi__*sigma)/ZCDF(mu/sigma), /* density */
					(1-ZCDF((mu-_x_)/sigma))/ZCDF(mu/sigma), /*CDF*/
					0, 				   /*left bound*/
					1e25, 			   /*right bound*/
					(mu*(1-ZCDF(-mu/sigma)-ZCDF((mu-_x_)/sigma))+
				    sigma*(Exp(-mu*mu/(2*sigma*sigma))-
				    Exp((_x_-mu)(mu-_x_)/(2*sigma*sigma)))/sqrt2pi__)/ZCDF(mu/sigma)
						/* "antiderivative" of x f(x) */
				   );
				   
GetInformation (catInfo,catVar);
fprintf (stdout, "\nSample by MEAN (8 rate classes):");
catInfo = echoCatVar (catInfo);
\ No newline at end of file
diff --git a/Examples/Categories/definitions3.bf b/Examples/Categories/definitions3.bf
new file mode 100644
index 0000000..515f7f0
--- /dev/null
+++ b/Examples/Categories/definitions3.bf
@@ -0,0 +1 @@
+/* This is an example HY-PHY Batch File.

	In this file, we will illustrate how to define category
	variables sampled from continuous distribution to model rate heterogeneity
	and spatially correlated via a hidden markov chain
	
   Sergei L. Kosakovsky Pond and Spencer V. Muse 
   June 2001. 
*/

/* 1.
	Refer to definition1.bf and definition2.bf for 
	examples on how to define a distribution of rates.
	To introduce space correlation via a hidden markov model
	we need to specify an additional parameter in the call
	to "category": the transition matrix for the HMM.
	The following example defines a simple HMM model
	following the paper of Felsenstein and Churchill (1996 J Mol Evol).
*/

#include "displayFunction.bf";

global lambda = .5;
lambda :< 1;

hiddenMarkovM = {10,10};
hiddenMarkovF = {10,1};

for (k=0; k<10; k=k+1)
{
	hiddenMarkovM [k][k] := lambda+(1-lambda)/10;
	hiddenMarkovF [k][1] := 1/10;
	
	for (l=k+1;l<10;l=l+1)
	{
		hiddenMarkovM [k][l] := (1-lambda)/10;
		hiddenMarkovM [l][k] := (1-lambda)/10;
	}
}


Model HMM = (hiddenMarkovM,hiddenMarkovF,false);

global alpha = 1;
alpha:>0.01;alpha:<100;

category catVar =  (10,		/* number of rates */
					hiddenMarkovF,  /* probs. of rates */
					MEAN,	/* sampling method */
					GammaDist(_x_,alpha,alpha), /* density */
					CGammaDist(_x_,alpha,alpha), /*CDF*/
					0, 				   /*left bound*/
					1e25, 			   /*right bound*/
					CGammaDist(_x_,alpha+1,alpha),
						/* "antiderivative" of x f(x) */
					HMM /* transition matrix for the hidden Markov model */
				   );
				   
GetInformation (catInfo,catVar);
catInfo = echoCatVar (catInfo);
\ No newline at end of file
diff --git a/Examples/Categories/displayFunction.bf b/Examples/Categories/displayFunction.bf
new file mode 100644
index 0000000..17b5d10
--- /dev/null
+++ b/Examples/Categories/displayFunction.bf
@@ -0,0 +1 @@
+function echoCatVar (distrInfo)
{
	D = Columns(distrInfo);
	E = 0.0;
	for (k=0; k<D; k=k+1)
	{
		E = distrInfo[0][k]*distrInfo[1][k]+E;
	}
	sampleVar = 0.0;
	for (k=0; k<D; k=k+1)
	{
		sampleVar = sampleVar+(distrInfo[0][k]-E)*(distrInfo[0][k]-E);
	}
	sampleVar = sampleVar/(D-1);
	fprintf  (stdout,"\n\nSample mean = ",E, " (sample variance = ",sampleVar,")\n");
	for (k=0; k<D; k=k+1)
	{
		fprintf (stdout,"\nRate[",Format(k,0,0),"]=",Format(distrInfo[0][k],12,8), " (weight=", 
						  Format(distrInfo[1][k],9,7),")");
	}
	fprintf (stdout,"\n------------------------------------------------\n");
	return 0.0;
}
\ No newline at end of file
diff --git a/Examples/ConstraintDefinition/ReplicateConstraint1.bf b/Examples/ConstraintDefinition/ReplicateConstraint1.bf
new file mode 100644
index 0000000..fc902b8
--- /dev/null
+++ b/Examples/ConstraintDefinition/ReplicateConstraint1.bf
@@ -0,0 +1 @@
+/* This is an example HY-PHY Batch File.

	In this file, we will illustrate how to use the "ReplicateConstraint" command to 
	apply a constraint to the tree branches.
	
   Sergei L. Kosakovsky Pond and Spencer V. Muse 
   June 2001. 
*/


/* 1. Include a file which reads the data and the tree,
  defines a model and the likelihood function */
  
#include "shared.bf";

/* 2. We begin by obtaining the MLE estimates for the
	tree with each branch having 2 rates  - transitions
	and transversions, and printing out the result.
	LIKELIHOOD_FUNCTION_OUTPUT = 3 formats the output
	as a list of parameters (incl. constraints) for easier
	understanding of the effect of constraints */
	
Optimize (res, hivLik);

LIKELIHOOD_FUNCTION_OUTPUT = 3;

fprintf (stdout, "1).Unconstrained HKY85\n\n", hivLik);

/* 3. The first application of replicate constraint will
set the transition rate at each branch to be equal to the
transversion rate at the same branch. The constraint 
can be specified as "branch.trst:=branch.trsv". This is
essentially the same as reducing the HKY85 model to the
F81 model. 
	
	The first argument of "ReplicateConstraint" is
the constraint inself. "this1" etc. will be replaced
with the first argument that follows (hivTree), and
this2 - with the 2nd argument (also hivTree). This defines
the tree on which "ReplicateConstraint" operates. It will
recurse down the tree and will attempt to match "?.trst"
and "?.trsv" with the names of actual parameters that 
are present at the branch. '?' is the wildcard character 
(it matches every name including the empty string).

	The output following the optimization will reflect
these new constraints.

 */

ReplicateConstraint ("this1.?.trst:=this2.?.trvs", hivTree, hivTree);

Optimize (res, hivLik);

fprintf (stdout, "\n\n2).HKY85 constrained to F81\n\n", hivLik);


/* 4. If we modify the constraint as follows, it will only
be applied to the branches whose name containts the word "Node".
By default every internal branch is named "Node" followed by a 
number, so the constraint will only apply to internal nodes.

Note the use of "ClearConstraints" to remove the constraints
generated in the previous step.
 */
 
ClearConstraints (hivTree);

ReplicateConstraint ("this1.?Node?.trst:=this2.?Node?.trvs", hivTree, hivTree);

Optimize (res, hivLik);

fprintf (stdout, "\n\n3).HKY85 constrained to F81 on internal branches\n\n", hivLik);

/* 5. Next, we implement a slightly more involved constraint.
We wish to impose the constraint that the ratio of trst and
tsvr for each branch is the same accross the entire tree.
This would be the "classic" HKY85 model, with one shared ratio.
We declare the global variable "R" to be this ratio.

 */
 
global R = 1;

ClearConstraints (hivTree);

ReplicateConstraint ("this1.?.trvs:=R*this2.?.trst", hivTree, hivTree);

Optimize (res, hivLik);

fprintf (stdout, "\n\n4).HKY85 with shared ratio.\n\n", hivLik);
\ No newline at end of file
diff --git a/Examples/ConstraintDefinition/ReplicateConstraint2.bf b/Examples/ConstraintDefinition/ReplicateConstraint2.bf
new file mode 100644
index 0000000..e251ed6
--- /dev/null
+++ b/Examples/ConstraintDefinition/ReplicateConstraint2.bf
@@ -0,0 +1 @@
+/* This is an example HY-PHY Batch File.

	In this file, we will illustrate how to use the "ReplicateConstraint" command to 
	apply a constraint to the tree branches.
	
   Sergei L. Kosakovsky Pond and Spencer V. Muse 
   June 2001. 
*/


/* 1. Include a file which reads the data and the tree,
  defines a model and the likelihood function */
  
#include "shared.bf";

/* 2. We begin by obtaining the MLE estimates for the
	tree with each branch having 2 rates  - transitions
	and transversions, and printing out the result.
	LIKELIHOOD_FUNCTION_OUTPUT = 3 formats the output
	as a list of parameters (incl. constraints) for easier
	understanding of the effect of constraints */

Optimize (res, hivLik);

LIKELIHOOD_FUNCTION_OUTPUT = 3;

fprintf (stdout, "1).Unconstrained HKY85\n\n", hivLik);

/* 3. ReplicateConstrain can aslo be used to apply a
constraint to a subtree rooted at some internal node.

To do that, we pass the name of the internal node as
the "this" argument replacement as in the following example.

The tree in the example data set has an internal node named
"iNode1".
 */

ReplicateConstraint ("this1.?.trst:=this2.?.trvs", hivTree.iNode1, hivTree.iNode1);

Optimize (res, hivLik);

fprintf (stdout, "\n\n2).HKY85 constrained to F81 on the \"iNode1\" subtree \n\n", hivLik);

/* 4. If you wish to apply the constraint to an internal node itself only,
and not to its descendants, embed the name of the node in the constraint itself.
*/

ClearConstraints(hivTree);

ReplicateConstraint ("this1.iNode1.trst:=this2.iNode1.trvs", hivTree.iNode1, hivTree.iNode1);

Optimize (res, hivLik);

fprintf (stdout, "\n\n3).HKY85 constrained to F81 on the \"iNode1\" branch \n\n", hivLik);

/* 5. ReplicateConstraint can also set up a constraint between
two different subtrees (of the same structure though).

	The tree in the example file, has two subtrees of the same structure (,()),
one rooted an iNode1, and the other at iNode2. We set up all the parameters
in subtree at iNode1 to be equal to corresponding parameters at iNode2.

*/
 
ClearConstraints(hivTree);

ReplicateConstraint ("this1.?.?:=this2.?.?", hivTree.iNode1, hivTree.iNode2);

Optimize (res, hivLik);

fprintf (stdout, "\n\n4).HKY85 with \"iNode1\" subtree constrained equal to \"iNode2\" subtree\n\n", hivLik);

/* 6. A slight twist on the example above, is to make
the parameters in one subtree proportional, rather than equal, to
the corresponding parameters in the second subtree.
*/
 
global R = 1;

ClearConstraints(hivTree);

ReplicateConstraint ("this1.?.?:=R*this2.?.?", hivTree.iNode1, hivTree.iNode2);

Optimize (res, hivLik);

fprintf (stdout, "\n\n5).HKY85 with \"iNode1\" subtree constrained proportional to \"iNode2\" subtree\n\n", hivLik);

/* 7. Here's an example of a more complicated constraint:
		
		on the subtree starting at "iNode2", transitions and transversion rates are the same,
		and equal to the average of the transitions and transversion rates of the corresponding
		branch in the subtree starting "iNode1".
	
*/
 
ClearConstraints(hivTree);

ReplicateConstraint ("this1.?.trst:=.5*(this2.?.trst+this3.?.trvs)", hivTree.iNode1, hivTree.iNode2, hivTree.iNode2);
ReplicateConstraint ("this1.?.trvs:=this2.?.trst", hivTree.iNode1, hivTree.iNode1);

Optimize (res, hivLik);

fprintf (stdout, "\n\n5).HKY85 with \"iNode1\" subtree constrained to the average of those in the \"iNode2\" subtree\n\n", hivLik);
\ No newline at end of file
diff --git a/Examples/ConstraintDefinition/ReplicateConstraint3.bf b/Examples/ConstraintDefinition/ReplicateConstraint3.bf
new file mode 100644
index 0000000..341ce17
--- /dev/null
+++ b/Examples/ConstraintDefinition/ReplicateConstraint3.bf
@@ -0,0 +1 @@
+/* This is an example HY-PHY Batch File.

	In this file, we will illustrate how to use the "ReplicateConstraint" command to 
	apply a constraint to the tree branches.
	
	This example used "ChoiceList" to obtain user input, and "ReplicateConstraint" 
	to set up a simple LRT test
	
    Sergei L. Kosakovsky Pond and Spencer V. Muse 
 	June 2001. 
*/


/* 1. Include a file which reads the data and the tree,
  defines a model and the likelihood function */
  
#include "shared.bf";

/* 2. We begin by obtaining the MLE estimates for the
	tree with each branch having 2 rates  - transitions
	and transversions, and printing out the result.
	
	We will need this for the LRT later	
*/
	
Optimize (res, hivLik);

fprintf (stdout, "1).Unconstrained HKY85\n\n", hivLik);

/* 3. Use ChoiceList to obtain user input on what model
	  parameters to constrain.
 */

ChoiceList (userChoice,"Parameter to Constrain",1,SKIP_NONE,
			"Transitions","Constrain transition rates",
			"Transversions","Constrain transversion rates",
			"Both","Constraint transition and transversion rates");
			
/* 4. If the selection was canceled "userChoice" will be set to -1,
	  otherwise it will contain the index of the selection, starting at 0.
*/

if (userChoice<0)
{
	return;
}

/* 5. Now we set up the constraint string to pass to ReplicateConstraint. */

if (userChoice==0)
{
	constraintString = "trst";
}
else
{
	if (userChoice==1)
	{
		constraintString = "trvs";
	}
	else
	{
		if (userChoice==2)
		{
			constraintString = "?";
		}
	}
}

constraintString = "this1.?."+constraintString+":=this2.?."+constraintString;

/* 6. Set up the constraint on subtrees starting at iNode1 and iNode2 and obtain the MLE */

ReplicateConstraint (constraintString,hivTree.iNode1,hivTree.iNode2);

Optimize (res2, hivLik);

fprintf (stdout, "\n\n2).Constrained model\n\n", hivLik);

/* 7. Perform the LRT */

lrStat = 2(res[1][0]-res2[1][0]);
degFreedom = (res[1][1]-res2[1][1]);

fprintf (stdout, "\n\n LRT:\n\n lrt statistic = ",lrStat,"\n degrees of freedom = ", degFreedom,
				 "\n\n Chi-squared P-Value = ", 1-CChi2(lrStat,degFreedom));

/* Note: take a peek at RelativeRate.bf in TemplateBatchFiles to
   see how to use the ChoiceList in case the list of available model
   parameters is not known apriori */
\ No newline at end of file
diff --git a/Examples/ConstraintDefinition/data/hiv.seq b/Examples/ConstraintDefinition/data/hiv.seq
new file mode 100644
index 0000000..6477076
--- /dev/null
+++ b/Examples/ConstraintDefinition/data/hiv.seq
@@ -0,0 +1 @@
+#719
ATAGTAATTAGATCTGAAAACTTCTCGAACAATGCTAAAACCATAATAGTACAGCTAAAT
AAATCTGTAGAAATTAATTGTACAAGACCCAACAACAATACAAGAAGAAGTATACAT
TTCGGACCAGGGAAAGCATTTTATGCAGGAGAAATAATAGGAGATATAAGACAAGCA
TATTGTACTCTTAATGGAGCAGAATGGAATAACACTGTAAAACAGGTAGCTGCAAAATTA
AGAGAAAAATTTAATAAAACAATAATCTTTAATCAATCC
#136
GTAGTAATTAGATCTGAAAACTTCTCGAACAATGCTAAAACCATAATAGTACAGCTAAAT
AAATCTGTAGAAATTAATTGTACAAGACCCAACAACAATACAAGAAGAAGTATACAT
TTTGGACCAGGGAAAGCATTTTATGCAGGAGAAATAATAGGAGATATAAGACAAGCA
TATTGTACCCTTAATGGAACAGAATGGAATAACACTTTAAAACAGGTAGCTGAAAAATTA
AGAGAACAATTTATTAAAACAATAGTTTTTAATCAATCC
#135
GTAGTAATTAGATCTGAAAACTTCACGAACAATGCTAAAACCATAATAGTACAGCTAAAT
AAATCTGTAGAAATTAATTGTGTAAGACCCGGCAACAATACAAGAAGAAGTATACAT
ATAGGACCAGGGAGAGCATATTATACAGGAGAAGTAATAGGAGATATAAGACAAGCA
CATTGTAACCTTAGTAGAACAGACTGGAATAAAACTTTAAAACAGGTAGCTGAAAAATTA
AGAGAACAATTTAATACAACAATAGTCTTTAATCAATCC
#105r
ATAGTAATTAGATCTGAAAACTTCACGAACAATGCTAAAACCATAATAGTACAGCTAAAT
AAATCTGTAGAAATTAAGTGTGAAAGACCCAACAACAATACAAGAAAAAGTGTACAT
ATAGGACCAGGGAAAGCATATTATACAGGAGAAATAATAGGAGATATAAGACAAGCA
CATTGTAACCTTAGTGGAACAGAATGGAGGGAAACTTTAAAACAGGTAGCTGAAAAATTA
AGAGAACAATTTAATAAAACAATAGTCTTTAATCAATCC
#529
ATAGTAATTAGATCTGAAAACTTCACGAACAATGCTAAAACCATAATAGTACATCTAAAT
GAATCTGTAGAAATTATTTGTGAAAGACCCAACAACAATACAAGAAAAAGTGTACAT
ATGGGACCAGGGAGAGCATATTACACAGGAGAAATAATAGGAGATATAAGACAAGCA
CATTGTAACATTAGTAGAACAAATTGGACGGAAACTTTAAAACAGGTAGCTGAAAAATTA
AGAGAACAATTTAATAAAACAATAGTCTTTAATCAATCC
#317
GTAGTAATTAGATCTGAAAACTTCACGAACAATGCTAAGACCATAATAGTACAGCTAAAT
AAACCTGTAAAAATTAATTGTACAAGACCCAACAACAATGCAAAAATAAGAATACAT
ATAGGACCAGGGAGACCATTTTATACAGCAGGAGAAATAGGAAATATAAGACAAGCA
CATTGTAACCTTAGTAGAACAGACTGGAATAACACTTTAAAACTGGTAGCTGAAAAATTA
AGAGAACAATTTAATAAAACAATAGTCTTTAATCAATCC
#6767
GTAGTAATTAGATCTGAAAACTTCACGAACAATGCTAAGACCATAATAGTACAGCTAAAT
AACTCTGTAACAATTAAGTGTGAAAGACCCAACAACAATACAAGAAAAAGTATACCT
ATAGGACCAGGGAGAGCCTTTTATACAACAGGAGACATAGGAGATATAAGACAAGCA
CATTGTAACCTTAGTAGAAAAGACTGGAATGACACTTTAAGACAGGTAGTTGGAAAGTTA
AGAGAACAATTTGGAAGAACAATAATCTTTAATCAATCC
#6760
ATAGTAATTAGATCTGAAAACTTCACGAACAATGCTAAAACCATAATAGTACAGCTAAAG
GAACCTGTAAACATTACTTGTGAAAGACCCAGCAACAATACAAGAAAAAGTATACAT
ATAGGACCAGGAAAAGCATTTTATGCAACAGGAGAAATAGGAGATATAAGACGAGCA
CATTGTAACCTTAATAGAACAGCATGGAATAAAACTTTAAAACAGGTAGTTGAAAAATTA
AGAGAACAATTTAAGAAAACAATAACCTTTAACCAATCC
#9939
ATAGTAATCAGATCTGAAAACTTCTCGGACAATGCTAAAACCATAATAGTACAGCTAAAC
AACACTGTAAACATTACTTGTGAAAGACCCAACAACAATACAAGAAAAAGGATACAT
ATAGGACCAGGGAGAGCAGTTTATACAACAGGACAAATAGGAGATATAAGAAAAGCA
CATTGTAACCTTAGTAGAACAAATTGGACTGAAACTTTAAGACAAGTAGCTGAAAAATTA
AAAGAACAATTTAATAAAACAATAATCTTTAATAATTCC
#113
GTAGTAATTCGATCTGAAAACTTCACGGACAATGCTAAAACCATAATAGTACAGCTAAAC
AAATCTGTAGAAATTACTTGTGTAAGACCCAACAACAATACAAGAAAAAGTATAAAT
ATAAGACCAGGGAGAGCATTTTATACAACAGGAGAAATAGGAGATATAAGACAAGCA
CATTGTAACCTTAGTAGAACAGCATGGAATGAAGCTTTAAGACAAGTAGCTAAAAAATTA
AAAGAACAATTTAATAGAACAATAGTCTTTAATCAATCC
#822
ATAGTAATTAGATCTGAAAACTTCACAGACAATGCTAAAACCATAATAGTACAGCTAAAC
AAATCTGTAGAAATTAATTGTATAAGACCCAACAACAATACAAGAAAAAGTATACAT
ATAGGACCAGGGAGAGCATTTTATACAACAGGAGACATAGGAGATATAAGACAAGCA
TATTGTAACCTTAGTAGAACAGCATGGAATGAAACTTTAAGACAAGTAGCTCAAAAATTA
AAAGAACAATTTAATAGAACAATAGTCTTTAATCAATCC
#159
ATAGTAATTAGATCTGAAAACTTCACAGACAATGCTAAAACCATAATAGTACAGCTAAAT
AAATCTGTAGAAATTAATTGTACAAGACCCAACAACAATACAAGAAAAAGTATACAT
ATAGGACCAGGGAGAGCTTTTTATACAACAGGTGAAATAGGAGATTTAAGACAAGCA
CATTGTAACCTTAGTAGAACAGCATGGAATGAAACTTTAAGACAAGTAGCTAAAAAATTA
AAAGAACAATTTAATAGAACAATAGTTTTTAATCAATCC
#256
ATAGTAATTAGATCTGAAAACTTCACGGACAATGCTAAAACCATAATAGTACAGCTAAAT
AAATCTGTAGAAATTAATTGTACAAGACCCAACAACAATACAAGAAAAAGTATAAAT
ATAGGACCAGGGAGAGCATTTTATACAACAGGTGAAATAGGAAATTTAAGACAAGCA
CATTGTAACCTTAGTAGAACAGCATGGAATGAAACTTTAAGACAAGTAGCTAAAAAACTA
AAAGAACAATTTAATAGAACAATAGTTTTTAATCAATCC

(((317,6767),((135,(529,105r))iNode1,(719,136))),6760,((113,9939),(256,(822,159))iNode2))
\ No newline at end of file
diff --git a/Examples/ConstraintDefinition/shared.bf b/Examples/ConstraintDefinition/shared.bf
new file mode 100644
index 0000000..a45c386
--- /dev/null
+++ b/Examples/ConstraintDefinition/shared.bf
@@ -0,0 +1 @@
+/* This is an example HY-PHY Batch File.

	This file contains the shared part of "ReplicateConstraint" examples.
	
   Sergei L. Kosakovsky Pond and Spencer V. Muse 
   June 2001. 
*/


/* 1. Read in the data and store the result in a DataSet variable.*/

DataSet 		nucleotideSequences = ReadDataFile ("data/hiv.seq");

   
/* 2. Filter the data, specifying that all of the data is to be used
	  and that it is to be treated as nucleotides. */

	  
DataSetFilter	filteredData = CreateFilter (nucleotideSequences,1);



/* 3. Collect observed nucleotide frequencies from the filtered data. observedFreqs will
	  store the vector of frequencies. */

HarvestFrequencies (observedFreqs, filteredData, 1, 1, 1);



/* 4. Define the HKY substitution matrix. '*' is defined to be -(sum of off-diag row elements) */

HKY85RateMatrix  = 

		{{*,trvs,trst,trvs}
		 {trvs,*,trvs,trst}
		 {trst,trvs,*,trvs}
		 {trvs,trst,trvs,*}};

		 

/*5.  Define the HKY85 model, by combining the substitution matrix with the vector of observed (equilibrium)
	  frequencies. */

Model HKY85	 = (HKY85RateMatrix , observedFreqs);

/*6.  Use the tree from the data file:
 (((317,6767),((135,(529,105r))iNode1,(719,136))),6760,((113,9939),(256,(822,159))iNode2))
 */

Tree	hivTree = DATAFILE_TREE;

/*7.  Since all the likelihood function ingredients (data, tree, equilibrium frequencies)
	  have been defined we are ready to construct the likelihood function. */

LikelihoodFunction  hivLik = (filteredData, hivTree);
\ No newline at end of file
diff --git a/Examples/DataFilters/HKY852blocks.bf b/Examples/DataFilters/HKY852blocks.bf
new file mode 100644
index 0000000..804409d
--- /dev/null
+++ b/Examples/DataFilters/HKY852blocks.bf
@@ -0,0 +1 @@
+/* This is an example HY-PHY Batch File.

   It reads a '#' nucleotide dataset data/actin2.flt, parititions
   the data into two blocks - first 100 sites and the rest, then
   applies HKY85 to both partitions. The only difference between the two
   is the fact that we use different equilibrium frequencies for each partition.
      
   Output is printed out as a Newick Style tree with branch lengths
   representing the number of expected substitutions per branch (which
   is the default setting for nucleotide models w/o rate variation).
   Also, the likelihood ratio statistic is evaluated and the P-value
   for the test is reported.
   
   Sergei L. Kosakovsky Pond and Spencer V. Muse 
   December 1999. 
*/

/* 1. Read in the data and store the result in  DataSet variables.
	  The variable nuclotideSequence.sites holds the number of sites
	  in the data set. */

DataSet 		nucleotideSequence = ReadDataFile ("data/actin2.flt");
   
/* 2. Filter the data. 
	  "0-99" specifies first one hundred sites and 
	  (siteIndex>=100)&&(siteIndex<nuclotideSequence.sites)
	  takes the rest of the data.*/
	  
	  
DataSetFilter	filteredData1 	= CreateFilter (nucleotideSequence,1,"0-99");
DataSetFilter	filteredData2 	= CreateFilter (nucleotideSequence,1,
											   (siteIndex>=100)&&(siteIndex<nucleotideSequence.sites));

/* 3. Collect observed nucleotide frequencies from the filtered data. observedFreqs will
	  store the vector of frequencies. */

HarvestFrequencies (observedFreqs1, filteredData1, 1, 1, 1);
HarvestFrequencies (observedFreqs2, filteredData2, 1, 1, 1);

/* 4. Define the HKY85 substitution matrix. '*' is defined to be -(sum of off-diag row elements) */

HKY85RateMatrix = 
		{{*,trvs,trst,trvs}
		 {trvs,*,trvs,trst}
		 {trst,trvs,*,trvs}
		 {trvs,trst,trvs,*}};
		 		 
/*5.  Define the HKY85 model. USE_FUNCTION_FREQUENCIES allows the model
	  to pull its equilibrium frequencies from the vector passed to the lk function.*/

Model 	HKY85_1 = (HKY85RateMatrix, observedFreqs1);
Tree	actinTree1 = (ZMU60513,ZMU60514,((((((ZMU60511,ZMU60510),OSRAC2),(OSRAC1,SVSOAC1)),((OSRAC3,ZMU60507),ZMU60509)),(MZEACT1G,OSRAC7)),ZMU60508));
Model 	HKY85_2 = (HKY85RateMatrix, observedFreqs2);
Tree	actinTree2 = (ZMU60513,ZMU60514,((((((ZMU60511,ZMU60510),OSRAC2),(OSRAC1,SVSOAC1)),((OSRAC3,ZMU60507),ZMU60509)),(MZEACT1G,OSRAC7)),ZMU60508));


/*7. 	Set up the likelihood function, maximize, print results */

LikelihoodFunction  theLnLik = (filteredData1, actinTree1,filteredData2, actinTree2);

Optimize (paramValues, theLnLik);

fprintf  (stdout, "\n ----- RESULTS ----- \n", theLnLik);






\ No newline at end of file
diff --git a/Examples/DataFilters/HKY852blocks2models.bf b/Examples/DataFilters/HKY852blocks2models.bf
new file mode 100644
index 0000000..f48c347
--- /dev/null
+++ b/Examples/DataFilters/HKY852blocks2models.bf
@@ -0,0 +1 @@
+/* This is an example HY-PHY Batch File.



   It reads a '#' nucleotide dataset data/actin2.flt, parititions

   the data into two blocks - each third nucleotide position

   and the rest. We then apply HKY85 to the 1st partition and

   F81 to the 2nd.

      

   Output is printed out as a Newick Style tree with branch lengths

   representing the number of expected substitutions per branch (which

   is the default setting for nucleotide models w/o rate variation).

   Also, the likelihood ratio statistic is evaluated and the P-value

   for the test is reported.

   

   Sergei L. Kosakovsky Pond and Spencer V. Muse 

   December 1999. 

*/



/* 1. Read in the data and store the result in  DataSet variables.

	  The variable nuclotideSequence.sites holds the number of sites

	  in the data set. */



DataSet 		nucleotideSequence = ReadDataFile ("data/actin2.flt");

   

/* 2. Filter the data. 

	  "<001>" defines a comb of size 3, choosing the 3rd element of each triplet

	  "<110>" defines a comb of size 3, choosing the 1st and 2nd elements of each triplet */

	    

DataSetFilter	filteredData1 	= CreateFilter (nucleotideSequence,1,"<001>");

DataSetFilter	filteredData2 	= CreateFilter (nucleotideSequence,1,"<110>");



/* 3. Collect observed nucleotide frequencies from the filtered data. observedFreqs will

	  store the vector of frequencies. */



HarvestFrequencies (observedFreqs1, filteredData1, 1, 1, 1);

HarvestFrequencies (observedFreqs2, filteredData2, 1, 1, 1);



/* 4. Define the HKY85 substitution matrix. '*' is defined to be -(sum of off-diag row elements) */



HKY85RateMatrix = 

		{{*,trvs,trst,trvs}

		 {trvs,*,trvs,trst}

		 {trst,trvs,*,trvs}

		 {trvs,trst,trvs,*}};

		 		 

F81RateMatrix = 

		{{*,mu,mu,mu}

		 {mu,*,mu,mu}

		 {mu,mu,*,mu}

		 {mu,mu,mu,*}};



/*5.  Define the models.*/



Model 	HKY85 = (HKY85RateMatrix, observedFreqs1);

Model 	F81 =   (F81RateMatrix, observedFreqs2);



/*6.  Define 2 trees, one for each block. Even though the topology is the same,

	  the trees will have separate branch parameters for each partition.

*/



UseModel (HKY85);

Tree	actinTree1 = (ZMU60513,ZMU60514,((((((ZMU60511,ZMU60510),OSRAC2),(OSRAC1,SVSOAC1)),((OSRAC3,ZMU60507),ZMU60509)),(MZEACT1G,OSRAC7)),ZMU60508));

UseModel (F81);

Tree	actinTree2 = (ZMU60513,ZMU60514,((((((ZMU60511,ZMU60510),OSRAC2),(OSRAC1,SVSOAC1)),((OSRAC3,ZMU60507),ZMU60509)),(MZEACT1G,OSRAC7)),ZMU60508));



/*7. 	Set up the likelihood function, maximize, print results */



LikelihoodFunction  theLnLik = (filteredData1, actinTree1,  

                                filteredData2, actinTree2);



Optimize (paramValues, theLnLik);



fprintf  (stdout, "\n ----- RESULTS ----- \n", theLnLik);



\ No newline at end of file
diff --git a/Examples/DataFilters/data/actin2.flt b/Examples/DataFilters/data/actin2.flt
new file mode 100644
index 0000000..eb4f67e
--- /dev/null
+++ b/Examples/DataFilters/data/actin2.flt
@@ -0,0 +1 @@
+#ZMU60513
gcaggtttcgctggtgacgac---gcgccgagggcagtctttcccagcatcgtaggcagg
ccacggcacactggt---atggtgggcatgggccaaaaggatgcatacgtgggcgacgga
gcccag---tccaagagaggcattctgacgctcaagtacccaatcgagcacggcattgtg
ggcaactgggacgacatggagaagatctggcaccacaccttctacaacgagctccgtgtg
gcgcctgaggagcaccccatactgctgaccgaggctcctctgaaccccaaggccaacagg
gagaagatgacccagatcatgtttgagacgttt------agctgcccagcaatgtatgtg
tccatccaggcagttctttccctgtacgccatgggacgaacgactggtatcgtgctcgac
tctggtgacggcgtgcagcactgtcccccaatctacgaggggtacacgcttcctcatgct
attattcgattggaccttgccggtcgtgacctcaccgacaacctgatgaagatcctcacc
gagaggggttactccttcaccacgaccgccgagcgagagatagtcagggacatcaaggaa
aaacttgcctacattgctcttgattacgagcaggagctggagacggccaggaccagctcc
accgtcgagaagagctacgagctgcccgatggccaggttatcacaatcggcgcagaaagg
tttaggtgccctgaggtgctattccagccatctttcattggcatggaatctcctggcatc
catgaagccacgtacaactccatcatgaagtgtgacgtcgatatcagaaaggacctgtac
ggtaatgtcgtcctcagtggtggctccactatgttccctggcatcggtgaccgcatgagc
aaggagatcgctgcgcttgcccccagcagcatgaaggtgaaggtggttgctccgccggag
aggaagtacagcgtttggattggtggctccattctggcctctctcagtaccttccagcag
#ZMU60514
gcaggtttcgctggtgacgac---gcgccgagggcagtctttcccagcatcgtaggcagg
ccacggcacactggcgtgatggtgggcatgggccaaaaggatgcatacgtgggcgacgaa
gcccag---tccaagagaggcattctgacgctcaagtacccaatcgagcacggcattgtg
ggcaactgggacgacatggagaagatctggcaccacaccttctacaacgagctccgtgtg
gcgcctgaggagcaccctatactgctgaccgaggctcctctgaaccccaaggccaacagg
gagaagatgacccagatcatgtttgagacgttt------agctgcccagcaatgtatgtg
tccatccaggcagttctttccctgtacgccagtggacgaacgactggtatcgtgctcgac
tctggtgacggcgtgcagcactgtcccccaatctacgaagggtacacgcttcctcatgct
attattcgattggaccttgccggtcgtgacctcaccgacaacctgatgaagatcctcacc
gagaggggttactccttcaccacgaccgccgagcgagagatagtcagggacatcaaggaa
aaacttgcctacattgctcttgattacgagcaggagctggagacggccaggaccagctcc
accgtcgagaagagctacgagctgcccgatggccaggttatcacaatcggcgcagaaagg
tttaggtgccctgaggtgctattccagccatctttcattggcatggaatctcctggcatc
catgaagccacgtacaactccatcatgaagcgtgacgtcgatatcagaaaggacctgtac
ggtaatgtcgtcctcagtggtggctccactatgttccctggcatcggtaaccgtatgagc
aaggagatcactgcccttgcgccgagcagcatgaaaatcaaggtggtggcaccgcctgag
aggaaatacagtgtctggataggaggatccatccttgcctccctgagcaccttccaacag
#ZMU60511
gctggttttgctggtgacgat---gcgccaagggctgttttcccaagcattgttggacgc
ccacgtcacactggcgtgatggttggcatggggcagaaggatgcgtatgttggcgatgag
gctcag---tccaagaggggtatcctgactttgaagtacccgatcgaacatggcattgtc
aacaactgggatgatatggagaagatctggcaccacaccttctataacgaactccgtgtt
gcgcctgaagagcaccctgtgctgctgaccgaagccccactcaacccaaaggctaacagg
gagaagatgacccaaatcatgtttgagactttc------aatgttcctgccatgtatgtc
gccatccaggctgtgctttccctgtacgccagtggacgtacaactggtattgtattggac
tctggtgatggtgtcagccacacagtgccaatctatgaaggttatgcccttcctcatgcc
atcctgcgccttgaccttgctgggcgtgacctgactgacagcctgatgaagatcctcact
gagagaggttactccttcaccacctctgctgaacgcgaaattgtaagagacatcaaggaa
aagcttgcatatgtggctcttgaatacgaccaggagctcgagaatgccaagagcagctca
tctgtggagaagagctacgagctgcctgatggtcaggtgatcaccattggggcagagagg
ttcagatgccctgaggtcctcttccagccttccttcattggtatggaagctcctggcatc
catgagaccacctacaactccatcatgaagtgcgatgtcgacatcaggaaggacttgtat
ggtaacattgtgctcagtggtggcacgaccatgttccctggtattgcggaccgtatgagc
aaggagatcactgcccttgcgccgagcagcatggaaatcaaggtggtggcaccgcctgag
aggaaatacagtgtctggataggaggatccatccttgcctccctgagcaccttccaacag
#ZMU60510
gctggttttgctggtgacgat---gcgccaagggctgttttcccaagcattgtcggacgc
ccccgtcacactggtgtgatggttggcatggggcagaaggatgcgtatgttggtgacgag
gcccag---tccaagaggggtatcctgactttgaagtaccccatcgaacatggtattgtt
agcaattgggatgacatggagaagatctggcaccacaccttctataatgaactccgtgtg
gcgcctgaagagcaccctgtcgtgctgacggaagccccactcaaccccaaagctaacagg
gagaagatgacccaaatcatgtttgagaccttc------aatgttcctgccatgtatgtc
gccatccaggctgtgctttccctgtacgccagtgggcgtaacactggtattgtgttggac
tctggtgatggtgtcagccacaccgtgccaatctacgaaggttatgcccttcctcatgcc
atcctgcgtcttgaccttgctgggcgtgacctgactgacagcctgatgaagatcctcacc
gagagaggttactccttcaccaccacggccgaacgggaaatcgtacgggacatcaaggaa
aagcttgcatacgtggctcttgactatgatcaggagctggagaacgccaagagcagctca
tctgtggagaagagctacgagctgcctgatggccaggtgatcaccattggggcggagagg
ttccgatgccccgaggtcctcttccagccttccttcattggtatggaagctcctggcatc
catgagaccacctacaactccatcatgaaatgcgacgtggatatcaggaaggacttgtat
ggtaacattgttctcagtggtggcacaaccatgttccctggcatcgctgaccgtatgagc
aaggagatcaccgcccttgccccgagcagcatgaaaatcaaggtggtggctccacccgag
aggaaatacagtgtctggataggagggtccatccttgcttccctgagcaccttccaacag
#MZEACT1G
gccggtttcgctggtgatgat---gcgccaagagctgtcttccccagcattgtgggaaga
ccacgccacaccggtgtcatggtcggcatgggccaaaaggatgcctacgtaggtgatgag
gctcag---gccaagagaggcatcctgacactgaagtacccgattgagcatggcattgtc
aacaactgggatgacatggagaac---tggcatcacaccttctacaacgagctccgtgtt
tcgcctgaagatcaccctgtgctgctgaccgaggcccctctcaaccccaaggccaacaga
gagaaaatgacgcagattatgtttgaaaccttc------gaatgcccagcaatgtatgtt
gctatcgaggctgttctttcgttgtacgctagtgggcgaacaactggtattgtgatggat
tcaggtgatggtgtgagccacacggttccaatttatgaaggatacacacttcctcatgct
attctccgtttggatcttgcggggcgtgacctcaccgaccacctaatgaagatcctcaca
gagagagggtactccctcactacgagcgctgagcgggagattgtcagggacataaaggag
aagcttgcctacgttgcccttgattatgaacaggagctggagactgccaagagcagctcc
tctgtcgagaagagctacgagatgcctgatggtcaggtcatcaccattgggtcagaaagg
ttcaggtgccccgaggtgttgttccaaccatcccttgttggcatggaatcgcctagcgtc
catgaggccacgtacaactccatcatgaagtgtgatgttgatatcaggaaggatttgtat
ggtaacgttgtcctcagtgggggttttaccatgtttcctgggattgccgatcgtatgagc
aaggagatcacgtccctagttcctagcagcatgaaggttaaagtagttgcgccacctaga
aggaagtacagtgtctggatcggtggctctattttggcttctctcagcacttttcagcag
#OSRAC1
gctgggttcgccggagatgat---gcgcccagggctgtcttccccagcattgtcggccgc
cctcgccacaccggtgtcatggtcggaatgggccagaaggacgcctacgtcggcgacgag
gcgcag---tccaagaggggtatcttgaccctcaagtaccccatcgagcatggtatcgtc
agcaactgggatgatatggagaagatctggcatcacaccttctacaacgagctccgtgtg
gccccggaggagcaccccgtcctcctcaccgaggctcctctcaaccccaaggccaatcgt
gagaagatgacccagatcatgtttgagaccttc------aacacccctgctatgtacgtc
gccatccaggccgtcctctctctgtatgccagtggtcgtacccaaggtaatgtgttggac
tctggtgatggtgtcagccacactgtccccatctatgaaggatatgctctcccccatgct
atccctcgtctcgaccttgctgggcgtgatctcactgattacctcatgaagatcctgacg
gagcgtggttactcattcaccacaacggccgagcgggaaattgtgagggacatgaaggag
aagctttcctacatcgccctggactatgaccaggaaatggagactgccaagaccagctcc
tccgtggagaagagctacgagcttcctgatggacaggttatcaccattggtgctgagcgt
ttccgctgccctgaggtcctcttccagccttccttcataggaatggaagctgcgggtatc
catgagactacatacaactccatcatgaagtgcgacgtggatattaggaaggatctatat
ggcaacatcgttctcagtggtggtaccactatgttccctggcattgctgacaggatgagc
aaggaagatcactgccttgctcctagcagcatgaagatcaaggtggtcgcccctcctgaa
aggaagtacagtgtctggattggaggatccatcttggcatctctcagcacattccagcag
#OSRAC2
gctggtttggctggagatgat---gctccccgtgctgttttcccgagtattgttggccgt
ccgcgacatacaggcgttatggttgggatgggacaaaaagatgcttatgtcggtgatgag
gcccaa---tccaagaggggtatcctaaccttgaaataccccattgagcatggaattgta
agcaactgggatgacatggagaaaatttggcaccacacattctacaatgagcttcgtgta
gcaccagaagagcatccaattcttcttacggaggctccgcttaaccctaaggccaacagg
gagaagatgacacaaattatgtttgagacattcacgttgcacgttccagccatgtatgtc
gctattcaagccgtgctttccctctatgctagtggacgtactactggtattgtcttggat
tctggagatggtgtcagtcacacagtcccaatctacgaaggttatgcccttccgcatgcc
attctccgtcttgatcgtgctggtagggatctgactgattccctcatgaagatcctgact
gagaggggttactcagtcaccactcctgccgagcgggaaattgccgctgacatcaaggaa
aagcttgcatacgtccgtcttgactacgagcaggagcttgagactgcaaagagcagctca
tcagttgagaagagctatgagctgcccgatggacaggtgatcaccattggcgcggagcgc
ttcagatgcccagaggtcatgttccagccttctctcatcggcatggaagctccaggcatc
catgagacgacatacaactccatcatgaagtgcgatgttgatatcagaaaggacctgtat
ggtaacattgttctcagtggtggatccaccatgttccctggcatccggagaccgatgagc
aaggaagatcaccgcgctgcgccaagcagcatgaagatcaaggttgtcgctccgccagag
aggaagtacagtgtctggattggaggatccatcttggcatctctgagcaccttccagcag
#OSRAC3
gctggttttgctggtgatgat---gcccccagagcagtgttccctagtatagttggtcag
cctcggcacactggtgtcatggttggaatgggccaaaaagatgcctatgtgggtgatgag
gcacaa---tcaaaaagaggtatcttgaccttgaaataccctattgagcatggtatgtgg
aacaactgggacgacatggagaaaatctggcatcacaccttctacaatgagctgcgtgtg
ctccctgaggaacatccaattttgctgacagaagctcctctgaaccaaagggctaacaga
gagaaaatgacccaaatcatgtttgagacattc------aatgcaccagcaatgtatgtg
gctattcaagctgttctttcactatatgccagtggtcgtacaacaggtatggtgcttgat
tctggtgatggtgtgactcacacagtgccaatctatgaaggatatgcacttcctcatgct
attcttcggttggatcttgctggtcgtgatctgactgactgcctaatgaagatccttaca
gaaagaggttattcctttacaacaactgcagagcgggaaagtgtgagagacataaaagag
aagcttgcatatattgctcttgattatgagcaggagctgagagtcgccaagagcagctcc
tctgttgagaagagctatgaggttgcagatggacaagtcatcacaattggcgcgagagag
gttcagtgcccagaa---ctgttccagccctcgctgattgggatggaagctccggggatc
catgagaccacctacaactctgtcatgaagtgtgaagtggatatcaggaaggatctctat
ggtaacattgtgcttagtggaggaactaccatgttccctggcattgctgacaggatgagc
aaggaggattacgcccttgcaccaagcagcatgaagatcaaggtcgtggcacctcctgag
agaaaatacagtgtctggattggaggttctatccttgcctccctcagcacattccaacag
#OSRAC7
gccggttttgctggtgatgatgatgcacccagggctgtctttcctagcattgtaggcagg
ccacgccacagcggtgtcatggttggtatgggccagaaggatgcctatgtgggtgatgaa
gctgcagtcgaaaagagggatatcttgacattgaaatacccaatcgagcatggtattgtc
aacaactgggatgacatggagaagatatggcaccacaccttctacaatgagctccgtgtg
gctcctgaagagcatcctgtattgctgaccgaggctcctatgaaccccaaggcaaacaga
gagaagatgacccagatcatgttcgagaccttc------aactgcccagcgatgtacgtt
gccatccaggccgttctttcgttgtatgccagtggtcgaacatctggtattgtacttgac
tctggtgatggtgtaagtcacactgttccaatatacgaaggatttacactcgcgcatgct
attcttcgactcgatcttgctgggcgtgaccttaccgacaaccttatgaagattctcaca
gagaggggttactccttcaccacaactgctgagcgggaaattgttagagacataaaggag
aagctcgcctatgttgctcttgattatgaacaggagcttgatactgccaggagtagctcc
tctattgagaagagctatgagcttctggacggccaggtcatcaccatcggagcagaaagg
ttcaggtgcccggaggtgctcttccagccatcttttattggtatggaagctcctggcatc
catgaagccacatacaactccatcatgaagtgcgatgttgatattagaaaggatttgtac
ggtaatgtggtccttagtgggggatctacaatgttccctggtattggtgatcgtatgagc
aaggaaataactgcactctgccctggcagtatg------aaggtagttgcaccgccagag
aggaaatacagtgtctggattggtgggttcatcctggcttctctcagtacctttcagcag
#SVSOAC1
gctgggttcgctggagatgac---gcccccagggccgtcttccccagcattgtcggccgg
ccgcgccacaccggtgtcatggtcgggatggggcagaaggacgcctacgttggtgacgag
gcgcag---tccaagaggggtatcctgaccctcaagtaccccatcgagcacggaatcgtc
agcaactgggacgatatggagaagatctggcatcacaccttctacaacgagctccgtgtg
gctcccgaggagcaccccgtcctcctcactgaggcgcccctgaaccccaaggctaaccgt
gagaagatgacccagatcatgttcgagaccttc------aacacccccgccatgtacgtc
gccatccaggccgtcctctctctgtatgccagcggtcgtaccacaggtatcgtgctcgac
tcgggagatggtgtcagccacactgtccccatctacgaagggtacgccctcccccacgcc
atcctgcgtctcgacctcgctggccgcgaccttaccgactacctcatgaagatcctgact
gagcgcggctactccttcaccaccactgctgagcgggaaattgtcagggacatgaaggag
aagctcgcctacattgccctggactacgaccaggagatggagactgccaagaccagctct
tccgtggagaagagctacgagcttcctgatggacaggtcatcaccattgcggcggaccga
ttccgctgccctgaggtcctcttccagccatccttcattgggatggaagctgctggcatt
cacgagactacctacaactccatcatgaagtgcgacgtggatattaggaaggatctatat
ggcaacatcgtcctctctggtggtaccactatgttccctgggattgctgacaggatgagg
caaggaaatcactgccttgctcctagcagcatgaagatcaaggtggttgctcctccagaa
aggaagtacagtgtctggattggaggatccatcttggcatctctcagcacattccagcag
#ZMU60507
gctggctttgctggtgatgat---gcgcccagagcagtgttccctagtatagtcggccgc
cctccggacacgggtgtgatggttggaatgggccagaaggacgcctgtgtaggtgacgag
gcacag---tcaaaaagaggtatcttgaccttgaagtaccccattgagcacggtatcgtg
aacaactgggatgatatggagaaaatctgg------------------gaactgcgtgtt
gctcctgaagagcacccagttctgctgacagaagcacctctgaacccaaaggcaaacaga
gagaagatgacccaaattatgttcgagacattc------aatgcaccagcaatgtatgtt
gctatccaagctgtcctttccctgtatgccagcggtcgcactacaggtattgtgctcgat
tctggtgatggtgtgacccacaccgtgccaatctacgagggatacgcgctccctcatgcc
attcttaggctggatcttgctggtcgtgatctgactgactgcctaatgaagatcctcacg
gaaaggggctattccttcaccacgacggcagaacgggaaatcgtgagggacataaaggag
aagctggcctttgtcgccctagactatgagcaggagctggagaccgctaagagaagctcc
tccgtcgagaagagctacgagctgcccgatgcgcaggtcatcacgatcggcgcggagagg
ttcagatgcccagaggtgcttttccagccgtcgctgatcgggatggaagctcccggcatc
cacgagaccacctacaactcgatcatgaaatgtgacgttgatatcaggaaggacctgtac
gggaacatcgtcctcagtggagggacgaccatgttccctggcatcgctgacaggatgagc
aaggagattactgccctcgcgccgagcagcatgaagatcaaggtcgtggcgcctcctgag
agaaaatacagtgtttggattggtggctcgatccttgcgtcgctcagtacgttccagcag
#ZMU60508
gcgggtttcgctggtgacgac---gcaccgagagctgtctttcctagcattgtaggcagg
ccacgccacactggtgtgatggtgggcatgggccaaaaggatgcatatgtgggcgatgaa
gctcag---tccaaaagaggtattctgacactgaagtacccaattgagcacggcattgtc
ggcaactgggatgacatggagaagatctggcaccacaccttctacaatgagcttcgtgtg
gcacctgaggagcaccctacactgctgaccgaggctcctctgaaccccaaggcaaacagg
gagaagatgacccagattatgttcgagacattc------aactgcccagcaatgtatgtg
gccatccaggctgttctttccctgtacgccagtggtcgaacaacgggtattgtgctcgac
tctggtgatggtgtgagccacaccgtccctatctacgaagggtacacgcttcctcatgct
attcttcgattggaccttgctggtcgtgaccttaccgacaacctgatgaagatccttact
gagaggggttactccttcactacgactgccgagcgagaaattgtcagggacatcaaggaa
aaacttgcctacgttgcccttgattatgaacaggagctggagactgccaggaccagctct
agtgttgagaagagctacgagctgcccgatggccaggttatcacaatcggtgcagaaagg
tttaggtgccctgaggttctattccagccatccttcattggcatggaatctgctggcatc
catgaagccacgtacaactccatcatgaagtgtgacgtcgatatcagaaaggatctgtac
ggtaatgttgtcctcagtggtggctccactatgttccctggtattggtgaccgcatgagc
aaggagattactgcacttgcccccagcagcatgaaggtgaaggtggttgctccgccggag
aggaagtacagtgtttggattggtggttccattctggcctccctcagtacctttcagcag
#ZMU60509
gctggttttgccggcgatgat---gcaccaagggctgtattccctagcatcgttgggcgt
cctcgtcacaccggtgtcatggtagggatggggcagaaggatgcatatgttggtgatgag
gcacag---tccaagagaggtattctcacgctcaagtacccgattgagcacggtattgta
agcaactgggatgacatggagaaaatctggcatcacactttctacaatgagctccgtgtt
gccccggaggagcaccctgtgttgcttactgaggctcctttgaacccaaaggccaacagg
gagaagatgacccagattatgttcgagactttc------aatgttcctgccatgtacgtt
gcaattcaagcagtcctgtcactctatgctagtggccgtactactggtattgttctcgat
tctggtgatggtgtgagccatactgtgcccatttatgaaggatatgcccttcctcatgct
attctacgtctggatcttgctggtcgggacctcaccgactcgctcacgaaaattctcact
gagaggggctattccttcacaacctccgccgagcgagaaattgtaagggacatcaaggag
aagcttgcgtatatagctcttgactacgagcaagagttggagactgccaagaacagctcc
tcagttgaaaagagctatgagctacctgatggccaagaatacaccatcggtgcagagaga
ttcaggtgccccgaggtcctcttccagccatccatgattggtatggaggctgctggaatc
catgagacaacatacaattcaatcatgaagtgtgatgtggatatcaggaaggacctctac
ggcaacattgtgctcaatggaggttcgactatgttccccggtatcgctgatcgtatgagc
aaggagatcacttcccttgcaccaagcagcatgaagatcaaggtcgtcgcaccacctgag
aggaagtacagtgtctggataggagggtcgatcctagcctcgctcagcactttccaacag
\ No newline at end of file
diff --git a/Examples/MoreComplexModels/ExonIntron.bf b/Examples/MoreComplexModels/ExonIntron.bf
new file mode 100644
index 0000000..a9d1d07
--- /dev/null
+++ b/Examples/MoreComplexModels/ExonIntron.bf
@@ -0,0 +1 @@
+/* This is an example HY-PHY Batch File.



   It reads in a '#' nucleotide dataset data/ubiq.flt and estimates

   maximum ln-likelihood based on a (hypothetic) partition of the

   data into 2 exons and 1 intron. MG94 codon model is applied to

   coding regions, whereas HKY85 is used for non-coding regions.

   

   Output is printed out as a Newick Style tree with branch lengths

   representing the number of expected substitutions per branch (which

   is the default setting for nucleotide models w/o rate variation).

   

   

   Sergei L. Kosakovsky Pond and Spencer V. Muse 

   December 1999. 

*/



/* 1. Read in the data and store the result in a DataSet variable.*/



DataSet 		sequences = ReadDataFile ("data/ubiq.flt");

   

/* 2. Filter the data. We create two coding partitions, 1-99 and 199-end, treated as codons in std genetic code; and one non-coding partition, 100-198.

*/

	  

DataSetFilter	exon1 = CreateFilter (sequences,3,"0-98", "","TAA,TAG,TGA");

DataSetFilter	intron = CreateFilter(sequences,1,"99-197");

DataSetFilter	exon2 = CreateFilter (sequences,3,siteIndex>197,"","TAA,TAG,TGA");



/* 5. Collect observed nucleotide frequencies from the filtered data. observedFreq will store the vector of frequencies. Since MG94 used nucleotide frequencies, we collect those. */



HarvestFrequencies (observedFreq1, exon1, 1, 1, 1);

HarvestFrequencies (observedFreq2, exon2, 1, 1, 1);

HarvestFrequencies (intronFreqs, intron, 1, 1, 1);



/* 3. Include the model definition file. The file defines the model 2 MG94 models (one for each exon) and the function BuildCodonFrequencies which estimates equilibrium codon frequencies given nucleotide frequencies. The reason each exon needs its own version of MG94 is that observed nucleotide frequencies are intergrated into the rate matrix in a fairly irregular way, so different obs. freqs. for each exon give rise two 2 rate matrices. The way the models defined the _require_ the nucl.  [...]


#include "Models/MG94x2.mdl";



/*7.  Build codon frequencies for each exon*/



codonFreqs1 = BuildCodonFrequencies (observedFreq1);

codonFreqs2 = BuildCodonFrequencies (observedFreq2);



/*8.	Define the models for each exon. */

Model MG94model1 = (MG94_1,codonFreqs1,0);

Model MG94model2 = (MG94_2,codonFreqs2,0);



/* 4  define the HKY85 model */



HKY85RateMatrix = 

		{{*,trvs,trst,trvs}

		 {trvs,*,trvs,trst}

		 {trst,trvs,*,trvs}

		 {trvs,trst,trvs,*}};

		 

Model HKY85	 = (HKY85RateMatrix, intronFreqs);





/*6. 	We will need a separate tree for each partition. */



UseModel (MG94model1);	  
Tree	exon1Tree = (BLYMUB1,(BLYMUB2,(RICRMA630,(ZMUBIS27F,(ZMU29160,ZMU29161)))));
UseModel (MG94model2);	  
Tree	exon2Tree = (BLYMUB1,(BLYMUB2,(RICRMA630,(ZMUBIS27F,(ZMU29160,ZMU29161)))));
UseModel (HKY85);	  
Tree	intronTree = (BLYMUB1,(BLYMUB2,(RICRMA630,(ZMUBIS27F,(ZMU29160,ZMU29161)))));



/*9.  Since all the likelihood function ingredients (data, tree, equilibrium frequencies) have been defined we are ready to construct the likelihood function. */

	  

LikelihoodFunction  theLnLik = (exon1, exon1Tree,
				        		exon2, exon2Tree,	                         
				        		intron,intronTree);

/*8.  Maximize the likelihood function, storing parameter values in the matrix paramValues.
	  This will take a few minutes! */

Optimize (paramValues, theLnLik);

/*9.  Print the tree with optimal branch lengths to the console. */

fprintf  (stdout, theLnLik);

\ No newline at end of file
diff --git a/Examples/MoreComplexModels/Models/EI.mdl b/Examples/MoreComplexModels/Models/EI.mdl
new file mode 100644
index 0000000..649d8c3
--- /dev/null
+++ b/Examples/MoreComplexModels/Models/EI.mdl
@@ -0,0 +1 @@
+NICETY_LEVEL = 2;

EEAA = {20,20};

for (i=0; i<19;i=i+1)
{
	for (j=i+1; j<20; j=j+1)
	{
		EEAA[i][j]:=a;
		EEAA[j][i]:=a;			
	}
}

Model EqualInputModel = (EEAA, USE_FUNCTION_FREQUENCIES);
\ No newline at end of file
diff --git a/Examples/MoreComplexModels/Models/MG94x2.mdl b/Examples/MoreComplexModels/Models/MG94x2.mdl
new file mode 100644
index 0000000..ec8daee
--- /dev/null
+++ b/Examples/MoreComplexModels/Models/MG94x2.mdl
@@ -0,0 +1 @@
+/* define the standard genetic code */



/* AAA,AAC,AAG....TTA,TTC,TTG,TTT - 64 all in all*/



_Genetic_Code = {

					 {14,13,14,13,7,7,7,7,19, 5,19, 5,2,2,3,2,

					  12,11,12,11,6,6,6,6,19,19,19,19,1,1,1,1,

					  16,15,16,15,8,8,8,8,20,20,20,20,4,4,4,4,

					  10,9, 10,9, 5,5,5,5,10,17,18,17,1,0,1,0}

				};



/*

 

 	here's how codes translate to aminoacids

 	

 	0 == Phe

 	1 == Leu

 	2 == Ile

 	3 == Met

 	4 == Val

 	5 == Ser

 	6 == Pro

 	7 == Thr

 	8 == Ala

 	9 == Tyr

 	10 == Stop

 	11 == His

 	12 == Gln

 	13 == Asn

 	14 == Lys

 	15 == Asp

 	16 == Glu

 	17 == Cys

 	18 == Trp

 	19 == Arg

 	20 == Gly

 	

*/



MG94_1 = {61,61}; 

MG94_2 = {61,61}; 



NICETY_LEVEL = 3;

/* a flag to control Mac version responsiveness */

		

/* defines a sparse transition probabilities matrix 

 now we'll go through the matrix and assign the elements based on syn/non-syn status*/



hshift = 0;





for (h=0; h<64; h=h+1)

{

	if ((h==56)||(h==50)||(h==48)) 

	{

		hshift = hshift+1;

		continue; 

	}

	vshift = hshift;

	for (v = h+1; v<64; v=v+1)

	{

		/*first check to see if the transition is one step*/

		diff = v-h;

		/*if the diff is less than 4 then there is a change in the 3rd slot only

		  if the diff is divisible by 4 but not by 16 then there is a change in the 2nd slot only

		  if the diff is divisible by 16  then there is a change in the 1st slot only

		 */

		if ((v==56)||(v==50)||(v==48)) 

		{

			vshift = vshift+1;

			continue; 

		}

	  	if ((h$4==v$4)||((diff%4==0)&&(h$16==v$16))||(diff%16==0))

	  	/* the transition is one-step and now we will determine whether it is syn or non-syn */

	  	{

	  		if (h$4==v$4)

	  		{

	  			transition = v%4;

	  			transition2= h%4;

	  		}

	  		else

	  		{

	  			if(diff%16==0)

	  			{

	  				transition = v$16;

	  				transition2= h$16;

	  			}

	  			else

	  			{

	  				transition = v%16$4;

	  				transition2= h%16$4;

	  			}

	  		}

	  		if (_Genetic_Code[0][h]==_Genetic_Code[0][v]) 

	  		{

	  			MG94_1[h-hshift][v-vshift] := synRate*observedFreq1__[transition__][0];

	  			MG94_1[v-vshift][h-hshift] := synRate*observedFreq1__[transition2__][0];

	  			MG94_2[h-hshift][v-vshift] := synRate*observedFreq2__[transition__][0];

	  			MG94_2[v-vshift][h-hshift] := synRate*observedFreq2__[transition2__][0];

		  	}

	  		else

	  		{

		  		MG94_1[h-hshift][v-vshift] := nonSynRate*observedFreq1__[transition__][0];

	  			MG94_1[v-vshift][h-hshift] := nonSynRate*observedFreq1__[transition2__][0];

		  		MG94_2[h-hshift][v-vshift] := nonSynRate*observedFreq2__[transition__][0];

	  			MG94_2[v-vshift][h-hshift] := nonSynRate*observedFreq2__[transition2__][0];

  			}

	  	}

	  }

}



/* the following function compute equil. codon frequencies */



function BuildCodonFrequencies (obsF)

{

	PIStop = 1-obsF[3][0]*obsF[0][0]*obsF[2][0]-obsF[3][0]*obsF[2][0]*obsF[0][0]-obsF[3][0]*obsF[0][0]*obsF[0][0];



	result = {61,1};

	hshift = 0;



	for (h=0; h<64; h=h+1)

	{

		if ((h==56)||(h==50)||(h==48)) 

		{

			hshift = hshift+1;

			continue; 

		}

		first = h$16;

		second = h%16$4;

		third = h%4;

		result[h-hshift][0]=obsF[first][0]*obsF[second][0]*obsF[third][0]/PIStop;

	}

	return result;

}	





\ No newline at end of file
diff --git a/Examples/MoreComplexModels/aa.bf b/Examples/MoreComplexModels/aa.bf
new file mode 100644
index 0000000..257caec
--- /dev/null
+++ b/Examples/MoreComplexModels/aa.bf
@@ -0,0 +1 @@
+/* This is an example HY-PHY Batch File.



   It reads in a PHYLIP amino-acid dataset data/stewart.aa and estimates

   maximum ln-likelihood based on the tree contained in the data file,

   using Equal Input (proportional) model for amino-acids.

   

   Output is printed out as a Newick Style tree with branch lengths

   representing the number of expected substitutions per branch (which

   is the default setting for nucleotide models w/o rate variation).

   

   

   Sergei L. Kosakovsky Pond and Spencer V. Muse 

   December 1999. 

*/



/* 1. Read in the data and store the result in a DataSet variable.*/



DataSet 		aaSequences = ReadDataFile ("data/stewart.aa");

   

/* 2. Filter the data, specifying that all of the data is to be used

	  and that it is to be treated as amino-acids.*/

	  

DataSetFilter	filteredData = CreateFilter (aaSequences,1);



/* 3. Collect observed frequencies from the filtered data. observedFreq will store the vector of amino-acid frequencies. */



HarvestFrequencies (observedFreqs, filteredData, 1, 1, 1);



/* 4. Defines the rate matrix for the equal input model. */



EEAA = {20,20};  /* Create an empty 20x20 matrix named EEAA */



for (i=0; i<19;i=i+1)

{

	for (j=i+1; j<20; j=j+1)

	{

		EEAA[i][j]:=a;

		EEAA[j][i]:=a;			

	}

}



Model EqualInputModel = (EEAA, observedFreqs);



/*5.  Define the tree variable, using the tree from the data */

	  

Tree	theTree = DATAFILE_TREE;



/*6.  Since all the likelihood function ingredients (data, tree, equilibrium frequencies) have been defined we are ready to construct the likelihood function. */

	  

LikelihoodFunction  theLnLik = (filteredData, theTree);



/*7.  Maximize the likelihood function, storing parameter values in the matrix paramValues */



Optimize (paramValues, theLnLik);



/*8.  Print the tree with optimal branch lengths to the console. */



fprintf  (stdout, theLnLik);

		 

   

\ No newline at end of file
diff --git a/Examples/MoreComplexModels/data/3.seq b/Examples/MoreComplexModels/data/3.seq
new file mode 100644
index 0000000..fe7c6e1
--- /dev/null
+++ b/Examples/MoreComplexModels/data/3.seq
@@ -0,0 +1 @@
+#a
ATGATTCAACCTCAGACCCTTTTAAATGTAGCAGATAACAGTGGAGCTCGAAAATTGATG
TGTATTCGAGTCATAGGAGCTAGTAATCAGCGATATGCTCGTATTGGTGATGTTATT
GTTGCTGTAATCAAAGACGCAGTGCCCCAAATGCCTCTAGAAAGATCCGAAGTAATTCGA
GCTGTAATTGTACGTACATGTAAAGAGTTCAAATGCGAAGACGGTATAATAATACGCTAT
GACGACAATGCAGCGGTTATCATTGATCAAAAAGGAAATCCAAAAGGAACTCGCGTTTTT
GGCGCGATCGCCGAGGAATTGAGAGAATTGAATTTTACTAAAATAGTTTCATTAGCTCCT
GAAGTATTATAA
#b
ATGATTCAACCTCAGACCCATTTAAATGTAGCGGATAACAGCGGGGCTCGAGAATTGATG
TGTATTCGAATCATAGGAGCTAGCAATCGTCGATATGCTCATATTGGTGACGTTATT
GTTGCTGTGATCAAAGAAGCCGTACCAAATATGCCCCTAGAAAGATCAGAAGTAGTCAGA
GCTGTAATTGTGCGGACCTGTAAAGAACTCAAACGTGACAACGGGATGATAATACGATAT
GATGACAATGCTGCAGTTGTTATTGATCAAGAAGGAAAATCAAAAGGAACTCGAATTTTT
GGTGCAATCGCCCGGGAATTGAGAGAATTAAATTTTACTAAAATAGTTTCATTAGCTCCC
GAGGTATTATAA
#og
ATGATTCAACCTCAAACTTATTTAAATGTTGCAGATAATAGTGGAGCTCGAAAACTAATG
TGCATTCGAGTTATAGGAACGAGTAATCGAAAATATGCAAATATTGGTGATATTATT
ATTGCTGTTGTTAAAGAAGCAGTGCCAAATATGCCTATTAAAAAATCCGAAATTGTAAGA
GCTGTAATTGTACGTACGTGTAAAGAATTTAAACGAAATAATGGATCCATAATAAAATTT
GATGATAATGCAGCAGTTGTTATTAATCAAGAAGGAAATCCAAAAGGAACTCGAGTTTTT
GGTCCAATTGCTAGAGAATTAAGAGAATCTAATTTTACTAAAATAGTTTCGTTAGCTCCA
GAAGTTTTATAA
(a,b,og);
\ No newline at end of file
diff --git a/Examples/MoreComplexModels/data/stewart.aa b/Examples/MoreComplexModels/data/stewart.aa
new file mode 100644
index 0000000..d54f832
--- /dev/null
+++ b/Examples/MoreComplexModels/data/stewart.aa
@@ -0,0 +1 @@
+#Langur
    KIFERCELAR TLKKLGLDGY KGVSLANWVC LAKWESGYNT EATNYNPGDE STDYGIFQIN SRYWCNNGKT PGAVDACHIS CSALLQNNIA DAVACAKRVV SDPQGIRAWV AWRNHCQNKD VSQYVKGCGV
#Baboon
 	.......... ...R...... R.I....... ......D... Q........Q .......... .H....D... ....N..... .N....D..T .......... .......... ........R. .....Q....
#Human  	  
    .V........ ...R..M... R.I.....M. .......... R.....A..R .......... ......D... ....N...L. ......D... .......... R......... ....R...R. .R...Q....
#Rat  
  	.TY....F.. ...RN.MS.. Y.....D... ..QH..N... Q.R..D...Q .......... ......D... .R.KN..G.P ......DD.T Q.IQ...... R......... ..QR..K.R. L.G.IRN...
#Cow
    .V........ .......... ........L. .T....S... K......SS. .......... .KW...D... .N...G..V. ..E.ME.D.. K......KI. .E-...T... ..KS..RDH. ..S..E..TL
#Horse
  	.V.SK....H K..AQEM..F G.Y....... M.EY..NF.. R.F.GKNANG .S...L..L. NKW..KDN.- RSSSN..N.M ..K..DE..D .DIS...... R..K.MS..K ..VK..KD.. L.E.LAS.NL

(((Langur,Baboon),Human),Rat,(Cow,Horse));
\ No newline at end of file
diff --git a/Examples/MoreComplexModels/data/ubiq.flt b/Examples/MoreComplexModels/data/ubiq.flt
new file mode 100644
index 0000000..0823987
--- /dev/null
+++ b/Examples/MoreComplexModels/data/ubiq.flt
@@ -0,0 +1 @@
+#BLYMUB1
atgcagatcttcgtgaagaccctgacgggcaagaccatcacgctggaggtggagtcgtcg
gacaccatcgacaacgtcaaggccaagatccaggacaaggagggcatcccgccggaccag
cagcgcctcatcttcgccggcaagcagctcgaggacggccgcaccctcgccgactacaac
atccagaaggagtccaccctccacctggtgctccgactccgcggtggcgccaagaagcgc
aagaagaagacgtacaccaagcccaagaagcaaaagcacaagcacaagaaggtgaagctc
gccgtcctccagttctacaaggtcgacgacgccaccggcaaggtaaccaggctcaggaag
gagtgccccaacgccgactgcggtgccgggaccttcatggccaaccacttcgaccgccac
tactgcggcaagtgcggactcacctatgtctacaaccagaaggcttag
#BLYMUB2
atgcagatcttcgtgaagaccctgacgggcaagaccatcacgctggaggtggagtcctcg
gacaccatcgacaacgtcaaggccaagatccaggacaaggagggcatcccgccggaccag
caacgcctcatcttcgccggcaagcagctcgaggatggccgtactctcgccgactacaac
atccagaaggagtccaccctccacctggtgctccgccttcgtggtggtgccaagaagcgc
aagaagaagacgtacaccaagcccaagaagcaaaagcacaagcacaagaaggtgaagctc
gccgtcctccagttctacaaggtcgacgattccaccggcaaggtaacccggctcaggaag
gagtgccccaacgccgactgcggtgccgggaccttcatggccaaccacttcgaccgtcac
tactgcggcaagtgcggcctcacctacgtctacaaccagaaggcctag
#RICRMA630
atgcagatcttcgtgaagaccctgacggggaagaccatcacgctggaggtggagtctcgg
cacaccatcgacaacgtgaaggccaagatccaggacaaggaagggatccccccggaccag
cagcgcttcatcttcgccggcaagcagctcgaggatggccgcaccctcgccgactacaac
atccagaaggagtccaccctccaccacgtgctccgcctccgcggtggcgccaagaagcgc
aagaagaagacgtacaccaagcccaagaagatcaagcacaagcacaagaaggtgaagctc
gccgtgctccagttctacaaggtggacgacgccaccggcaaggtcaccaggctcaggaag
gagtgccccaaccacgactgcggtgccgggaccttcatggccaaccacttcgatcgccac
tactgccgcaagtgccgcctcacctacgtctacaaccagaaggcctag
#ZMU29160
atgcagatctttgtgaagactctgacggggaagaccatcactttggaggtggagtcctcg
gacaccatcgacaatgtgaaggccaagatccaggacaaggagggcatccccccggaccag
cagcggctcatcttcgccggcaagcagctcgaggacggtcgcaccctcgccgactacaac
atccagaaggagtccaccctccacctggtgctgcgtcttcgcggcggcgccaagaagcgt
aagaagaagacgtacaccaagcccaagaagactaagcacaagcacaagaaggtgaagctc
tccgtgctgcagttctataaggtggacgacaccactagcaaggtgacccgcctccgcaag
gagtgccccaactcagagtgcggcgcgggcgtcttcatggccaaccacttcgaccgccac
tactgcggcaagtgcggcctcacctatgtctacaaccagaaggcgtaa
#ZMU29161
atgcagatcttcgtgaagaccctgacggggaaaacgatcacgttggaggtggagtcctcg
gacaccatcgacaacgtgaaggccaagatacaggacaaggagggcatcccgccggaccag
cagcggctaatcttcgccggcaagcagctcgaggacggccgcaccctcgccgactacaac
atccagaaggagtccaccctccacctggtgctccgcctccgaggtggcgccaagaagcgc
aagaagaagacgtacaccaagcccaagaagatcaagcacaagcacaagaaggtaaagctc
gcagtgctgcagttctacaaggtggacgacgccaccggcaaggtgacccgcctccgcaag
gagtgccccaacaccgagtgcggtgcgggtgtcttcatggccaaccacttcgaccgccac
tactgcggcaagtgcggcctcacctacgtctacaatcagaaggcgtaa
#ZMUBIS27F
atgcagatcttcgtgaagaccctgacggggaagaccatcacgctggaggtggagtcctcg
gacaccatcgacaacgtgaaggccaagatccaggacaaggagggcatcccgccggaccag
cagcgcctcatcttcgccggcaagcagctcgaggatggccgcaccctcgccgactacaac
atccagaaggagtcgacgctgcacctggtcgtccgcctcaggggaggcgccaagaagccg
aagaagaagacgtacaccaagcccaagaagatcaagcacaagcacaagaaggtgaagctc
gccgtgctccagttctacaaggttgacgacgccaccggcaaggtcacccgcctccgcaag
gattgccccaacgccgagtgccatgcgggggtcttcatggccaaccacttcgaccgccac
tactgcggtaagtgtggcctcacctacgtctacaaccagcaggcgtag

(BLYMUB1,(BLYMUB2,(RICRMA630,(ZMUBIS27F,(ZMU29160,ZMU29161)))));
\ No newline at end of file
diff --git a/Examples/SimpleAnalyses/F81.bf b/Examples/SimpleAnalyses/F81.bf
new file mode 100644
index 0000000..362c4c6
--- /dev/null
+++ b/Examples/SimpleAnalyses/F81.bf
@@ -0,0 +1 @@
+/* This is an example HY-PHY Batch File.



   It reads in a '#' nucleotide dataset data/hiv.nuc and estimates

   maximum ln-likelihood based on the tree contained in the data file,

   using Felsenstein 81 model.

   

   Output is printed out as a Newick Style tree with branch lengths

   representing the number of expected substitutions per branch (which

   is the default setting for nucleotide models w/o rate variation).

   

   

   Sergei L. Kosakovsky Pond and Spencer V. Muse 

   December 1999. 

*/

/* 1. Read in the data and store the result in a DataSet variable.*/

DataSet 		nucleotideSequences = ReadDataFile ("data/hiv.nuc");


/* 2. Filter the data, specifying that all of the data is to be used
	  and that it is to be treated as nucleotides.*/
	 
DataSetFilter	filteredData = CreateFilter (nucleotideSequences,1);

/* 3. Collect observed nucleotide frequencies from the filtered data. observedFreqs will
	  store the vector of frequencies. */

HarvestFrequencies (observedFreqs, filteredData, 1, 1, 1);

/* 4. Define the F81 substitution matrix. '*' is defined to be -(sum of off-diag row elements) */

F81RateMatrix = 
		{{*,mu,mu,mu}
		 {mu,*,mu,mu}
		 {mu,mu,*,mu}
		 {mu,mu,mu,*}};

/*5.  Define the F81 models, by combining the substitution matrix with the vector of observed (equilibrium)
	  frequencies. */
	  

Model 	F81 = (F81RateMatrix, observedFreqs);

/*6.  Now we can define the tree variable, using the tree string read from the data file,
	  and, by default, assigning the last defined model (F81) to all tree branches. */

Tree	givenTree = DATAFILE_TREE;


/*7.  Since all the likelihood function ingredients (data, tree, equilibrium frequencies)
	  have been defined we are ready to construct the likelihood function. */

LikelihoodFunction  theLnLik = (filteredData, givenTree);

/*8.  Maximize the likelihood function, storing parameter values in the matrix paramValues */

Optimize (paramValues, theLnLik);

/*9.  Print the tree with optimal branch lengths to the console. */

fprintf  (stdout, theLnLik);

\ No newline at end of file
diff --git a/Examples/SimpleAnalyses/HKY85.bf b/Examples/SimpleAnalyses/HKY85.bf
new file mode 100644
index 0000000..4ee31d2
--- /dev/null
+++ b/Examples/SimpleAnalyses/HKY85.bf
@@ -0,0 +1 @@
+/* This is an example HY-PHY Batch File.

   It reads in a '#' nucleotide dataset data/hiv.nuc and estimates
   maximum ln-likelihood based on the tree contained in the data file,
   using Hasegawa et all 85 (HKY 85) model with transition/transversion ratio
   estimated independently for all branches.

   

   Output is printed out as a Newick Style tree with branch lengths
   representing the number of expected substitutions per branch (which
   is the default setting for nucleotide models w/o rate variation).

   Sergei L. Kosakovsky Pond and Spencer V. Muse 
   December 1999. 
*/


/* 1. Read in the data and store the result in a DataSet variable.*/

DataSet 		nucleotideSequences = ReadDataFile ("data/hiv.nuc");

/* 2. Filter the data, specifying that all of the data is to be used
	  and that it is to be treated as nucleotides.*/

DataSetFilter	filteredData = CreateFilter (nucleotideSequences,1);

/* 3. Collect observed nucleotide frequencies from the filtered data. observedFreqs will
	  store the vector of frequencies. */

HarvestFrequencies (observedFreqs, filteredData, 1, 1, 1);

/* 4. Define the KHY substitution matrix. '*' is defined to be -(sum of off-diag row elements) */

HKY85RateMatrix = 

		{{*,trvs,trst,trvs}
		 {trvs,*,trvs,trst}
		 {trst,trvs,*,trvs}
		 {trvs,trst,trvs,*}};

/*5.  Define the HKY85 model, by combining the substitution matrix with the vector of observed (equilibrium)
	  frequencies. */

Model HKY85	 = (HKY85RateMatrix, observedFreqs);

/*6.  Now we can define the tree variable, using the tree string read from the data file,
	  and, by default, assigning the last defined model (HKY85) to all tree branches. */

Tree	givenTree = DATAFILE_TREE;

/*7.  Since all the likelihood function ingredients (data, tree, equilibrium frequencies)
	  have been defined we are ready to construct the likelihood function. */

LikelihoodFunction  theLnLik = (filteredData, givenTree);

/*8.  Maximize the likelihood function, storing parameter values in the matrix paramValues */

Optimize (paramValues, theLnLik);

/*9.  Print the tree with optimal branch lengths to the console. */

fprintf  (stdout, theLnLik);


   

\ No newline at end of file
diff --git a/Examples/SimpleAnalyses/HKY85shared.bf b/Examples/SimpleAnalyses/HKY85shared.bf
new file mode 100644
index 0000000..c1ec5fe
--- /dev/null
+++ b/Examples/SimpleAnalyses/HKY85shared.bf
@@ -0,0 +1 @@
+/* This is an example HY-PHY Batch File.



   It reads in a '#' nucleotide dataset data/hiv.nuc and estimates

   maximum ln-likelihood based on the tree contained in the data file,

   using Hasegawa et all 85 (HKY 85) model with transition/transversion ratio

   shared by all branches.

   

   Output is printed out as a Newick Style tree with branch lengths

   representing the number of expected substitutions per branch (which

   is the default setting for nucleotide models w/o rate variation).

   

   

   Sergei L. Kosakovsky Pond and Spencer V. Muse 

   December 1999. 

*/



/* 1. Read in the data and store the result in a DataSet variable.*/



DataSet 		nucleotideSequences = ReadDataFile ("data/hiv.nuc");

   

/* 2. Filter the data, specifying that all of the data is to be used

	  and that it is to be treated as nucleotides.*/

	  

DataSetFilter	filteredData = CreateFilter (nucleotideSequences,1);



/* 3. Collect observed nucleotide frequencies from the filtered data. observedFreqs will

	  store the vector of frequencies. */



HarvestFrequencies (observedFreqs, filteredData, 1, 1, 1);



/* 4. Define the KHY substitution matrix. '*' is defined to be -(sum of off-diag row elements).

	  The variable R is the global transition/transversion ratio.  */



global   R;



HKY85RateMatrix = 

		{{*,trvs,R*trvs,trvs}

		 {trvs,*,trvs,R*trvs}

		 {R*trvs,trvs,*,trvs}

		 {trvs,R*trvs,trvs,*}};

		 

/*5.  Define the HKY85 model, by combining the substitution matrix with the vector of observed (equilibrium)

	  frequencies. */

	  

Model HKY85	 = (HKY85RateMatrix, observedFreqs);



/*6.  Now we can define the tree variable, using the tree string read from the data file,

	  and, by default, assigning the last defined model (HKY85) to all tree branches. */

	  

Tree	givenTree = DATAFILE_TREE;



/*7.  Since all the likelihood function ingredients (data, tree, equilibrium frequencies)

	  have been defined we are ready to construct the likelihood function. */

	  

LikelihoodFunction  theLnLik = (filteredData, givenTree);



/*8.  Maximize the likelihood function, storing parameter values in the matrix paramValues */



Optimize (paramValues, theLnLik);



/*9.  Print the tree with optimal branch lengths to the console. */



fprintf  (stdout, theLnLik);

		 

   

\ No newline at end of file
diff --git a/Examples/SimpleAnalyses/JC69.bf b/Examples/SimpleAnalyses/JC69.bf
new file mode 100644
index 0000000..c587bf2
--- /dev/null
+++ b/Examples/SimpleAnalyses/JC69.bf
@@ -0,0 +1 @@
+/* This is an example HY-PHY Batch File.



   It reads in a '#' nucleotide dataset data/hiv.nuc and estimates

   maximum ln-likelihood based on the tree contained in the data file,

   using Jukes Cantor 69 model.

   

   Output is printed out as a Newick Style tree with branch lengths

   representing the number of expected substitutions per branch (which

   is the default setting for nucleotide models w/o rate variation).

   

   

   Sergei L. Kosakovsky Pond and Spencer V. Muse 

   December 1999. 

*/



/* 1. Read in the data and store the result in a DataSet variable.*/



DataSet 		nucleotideSequences = ReadDataFile ("data/hiv.nuc");

   

/* 2. Filter the data, specifying that all of the data is to be used

	  and that it is to be treated as nucleotides.*/

	  

DataSetFilter	filteredData = CreateFilter (nucleotideSequences,1);



/* 3. Define the F81 substitution matrix. '*' is defined to be -(sum of off-diag row elements) */



JC69RateMatrix = 

		{{*,mu,mu,mu}

		 {mu,*,mu,mu}

		 {mu,mu,*,mu}

		 {mu,mu,mu,*}};

		 

/*4.  Define the F81 models, by combining the substitution matrix with the vector of equal equilibrim

	  frequencies. */



equalFreqs = {{.25}{.25}{.25}{.25}};



Model 	F81 = (JC69RateMatrix, equalFreqs);



/*5.  Now we can define the tree variable, using the tree string read from the data file,

	  and, by default, assigning the last defined model (JC69) to all tree branches. */

	  

Tree	givenTree = DATAFILE_TREE;



/*6.  Since all the likelihood function ingredients (data, tree, equilibrium frequencies)

	  have been defined we are ready to construct the likelihood function. */

	  

LikelihoodFunction  theLnLik = (filteredData, givenTree);



/*7.  Maximize the likelihood function, storing parameter values in the matrix paramValues */



Optimize (paramValues, theLnLik);



/*8.  Print the tree with optimal branch lengths to the console. */



fprintf  (stdout, theLnLik);

		 

   

\ No newline at end of file
diff --git a/Examples/SimpleAnalyses/K2P.bf b/Examples/SimpleAnalyses/K2P.bf
new file mode 100644
index 0000000..a47115d
--- /dev/null
+++ b/Examples/SimpleAnalyses/K2P.bf
@@ -0,0 +1 @@
+/* This is an example HY-PHY Batch File.



   It reads in a '#' nucleotide dataset data/hiv.nuc and estimates

   maximum ln-likelihood based on the tree contained in the data file,

   using Kimura 2 parameter model with transition/transversion ratio

   estimated independently for all branches.

   

   Output is printed out as a Newick Style tree with branch lengths

   representing the number of expected substitutions per branch (which

   is the default setting for nucleotide models w/o rate variation).

   

   

   Sergei L. Kosakovsky Pond and Spencer V. Muse 

   December 1999. 

*/



/* 1. Read in the data and store the result in a DataSet variable.*/



DataSet 		nucleotideSequences = ReadDataFile ("data/hiv.nuc");

   

/* 2. Filter the data, specifying that all of the data is to be used

	  and that it is to be treated as nucleotides.*/

	  

DataSetFilter	filteredData = CreateFilter (nucleotideSequences,1);



/* 3. Define the K2P substitution matrix. '*' is defined to be -(sum of off-diag row elements) */



K2PRateMatrix = 

		{{*,trvs,trst,trvs}

		 {trvs,*,trvs,trst}

		 {trst,trvs,*,trvs}

		 {trvs,trst,trvs,*}};

		 

/*4.  Define the K2P model, by combining the substitution matrix with the vector of equal equilibrium

	  frequencies. */

	  

equalFreqs = {{.25}{.25}{.25}{.25}}; 



Model K2P	 = (K2PRateMatrix, equalFreqs);



/*5.  Now we can define the tree variable, using the tree string read from the data file,

	  and, by default, assigning the last defined model (K2P) to all tree branches. */

	  

Tree	givenTree = DATAFILE_TREE;



/*6.  Since all the likelihood function ingredients (data, tree, equilibrium frequencies)

	  have been defined we are ready to construct the likelihood function. */

	  

LikelihoodFunction  theLnLik = (filteredData, givenTree);



/*7.  Maximize the likelihood function, storing parameter values in the matrix paramValues */



Optimize (paramValues, theLnLik);



/*8.  Print the tree with optimal branch lengths to the console. */



fprintf  (stdout, theLnLik);

		 

   

\ No newline at end of file
diff --git a/Examples/SimpleAnalyses/K2Pshared.bf b/Examples/SimpleAnalyses/K2Pshared.bf
new file mode 100644
index 0000000..ea72b14
--- /dev/null
+++ b/Examples/SimpleAnalyses/K2Pshared.bf
@@ -0,0 +1 @@
+/* This is an example HY-PHY Batch File.



   It reads in a '#' nucleotide dataset data/hiv.nuc and estimates

   maximum ln-likelihood based on the tree contained in the data file,

   using Kimura 2 parameter model with shared transition/transversion ratio

   accross all branches.

   

   Output is printed out as a Newick Style tree with branch lengths

   representing the number of expected substitutions per branch (which

   is the default setting for nucleotide models w/o rate variation).

   

   

   Sergei L. Kosakovsky Pond and Spencer V. Muse 

   December 1999. 

*/



/* 1. Read in the data and store the result in a DataSet variable.*/



DataSet 		nucleotideSequences = ReadDataFile ("data/hiv.nuc");

   

/* 2. Filter the data, specifying that all of the data is to be used

	  and that it is to be treated as nucleotides.*/

	  

DataSetFilter	filteredData = CreateFilter (nucleotideSequences,1);



/* 3. Define the K2P substitution matrix. '*' is defined to be -(sum of off-diag row elements)

	  The variable R is the global transition/transversion ratio.  */



global	R;



K2PRateMatrix = 

		{{*,mu,R*mu,mu}

		 {mu,*,mu,R*mu}

		 {R*mu,mu,*,mu}

		 {mu,R*mu,mu,*}};

		 

/*4.  Define the K2P model, by combining the substitution matrix with the vector of equal equilibrium

	  frequencies. */

	  

equalFreqs = {{.25}{.25}{.25}{.25}}; 



Model K2P	 = (K2PRateMatrix, equalFreqs);



/*5.  Now we can define the tree variable, using the tree string read from the data file,

	  and, by default, assigning the last defined model (K2P) to all tree branches. */

	  

Tree	givenTree = DATAFILE_TREE;



/*6.  Since all the likelihood function ingredients (data, tree, equilibrium frequencies)

	  have been defined we are ready to construct the likelihood function. */

	  

LikelihoodFunction  theLnLik = (filteredData, givenTree);



/*7.  Maximize the likelihood function, storing parameter values in the matrix paramValues */



Optimize (paramValues, theLnLik);



/*8.  Print the tree with optimal branch lengths to the console. */



fprintf  (stdout, theLnLik);

		 

   

\ No newline at end of file
diff --git a/Examples/SimpleAnalyses/Non-Rev.bf b/Examples/SimpleAnalyses/Non-Rev.bf
new file mode 100644
index 0000000..e709439
--- /dev/null
+++ b/Examples/SimpleAnalyses/Non-Rev.bf
@@ -0,0 +1 @@
+/* This is an example HY-PHY Batch File.



   It reads in a '#' nucleotide dataset data/hiv.nuc and estimates
   maximum ln-likelihood based on the tree contained in the data file,
   using the general non-reversible 12 parameter (with 3 constraints)
   model. The tree from the data file is unrooted. 

   

   Output is printed out as a Newick Style tree with branch lengths
   representing the number of expected substitutions per branch (which
   is the default setting for nucleotide models w/o rate variation).


   Sergei L. Kosakovsky Pond and Spencer V. Muse 

   November 2002. 

*/

/* 1. Read in the data and store the result in a DataSet variable.*/

DataSet 		nucleotideSequences = ReadDataFile ("data/hiv.nuc");

/* 2. Filter the data, specifying that all of the data is to be used
	  and that it is to be treated as nucleotides.*/
	 
DataSetFilter	filteredData = CreateFilter (nucleotideSequences,1);

/* 3. Collect observed nucleotide frequencies from the filtered data. observedFreqs will
	  store the vector of frequencies. */

HarvestFrequencies (observedFreqs, filteredData, 1, 1, 1);

/* 4. Define the 12 parameter non-reversible substitution matrix. 
The constraints on some of the substitution rates are necessary to
ensure that observed nucleotide frequencies are equilibrium 
frequencies for the model.

'*' is defined to be -(sum of off-diag row elements) */

/* frequency ratios */
	 
r0 = observedFreqs[0]/observedFreqs[3];
r1 = observedFreqs[1]/observedFreqs[3];
r2 = observedFreqs[2]/observedFreqs[3];

/* All the global rate parameters are defined relative to 
the rate for A->C. For instance, CG represents the ratio
of the rates C->G/A->C. */

global AG;
global AT;
global CA;
global CG;
global CT;
global GA;
global GC;
global GT;

/* note that these constraints are 
satisfied if we restrict the model to the
general reversible case */

global TA:=AT+(1-CA)*r1__+(AG-GA)*r2__;
global TC:=CT+(CA-1)*r0__+(CG-GC)*r2__;
global TG:=GT+(GA-AG)*r0__+(GC-CG)*r1__;


NRRateMatrix = 
		{{*,t,t*AG,t*AT}
		 {t*CA,*,t*CG,t*CT}
		 {t*GA,t*GC,*,t*GT}
		 {t*TA,t*TC,t*TG,*}};

/*5.  Define the Non-Rev model, by combining the substitution matrix with the vector of observed (equilibrium)
	  frequencies. */
	  
Model 	NRM = (NRRateMatrix, observedFreqs);

/*6.  Now we can define the tree variable, using the tree string read from the data file,
	  and, by default, assigning the last defined model (NRM) to all tree branches. */

Tree	givenTree = DATAFILE_TREE;

/*7.  Since all the likelihood function ingredients (data, tree, equilibrium frequencies)
	  have been defined we are ready to construct the likelihood function. */

LikelihoodFunction  theLnLik = (filteredData, givenTree);

/*8.  Maximize the likelihood function, storing parameter values in the matrix paramValues */

Optimize (paramValues, theLnLik);

/*9.  Print the tree with optimal branch lengths to the console. */

fprintf  (stdout, theLnLik);

\ No newline at end of file
diff --git a/Examples/SimpleAnalyses/REV.bf b/Examples/SimpleAnalyses/REV.bf
new file mode 100644
index 0000000..965a682
--- /dev/null
+++ b/Examples/SimpleAnalyses/REV.bf
@@ -0,0 +1 @@
+/* This is an example HY-PHY Batch File.



   It reads in a '#' nucleotide dataset data/hiv.nuc and estimates

   maximum ln-likelihood based on the tree contained in the data file,

   using the General Reversible model with all 6 parameters

   estimated independently for all branches.

   

   Output is printed out as a Newick Style tree with branch lengths

   representing the number of expected substitutions per branch (which

   is the default setting for nucleotide models w/o rate variation).

   

   

   Sergei L. Kosakovsky Pond and Spencer V. Muse 

   December 1999. 

*/



/* 1. Read in the data and store the result in a DataSet variable.*/



DataSet 		nucleotideSequences = ReadDataFile ("data/hiv.nuc");

   

/* 2. Filter the data, specifying that all of the data is to be used

	  and that it is to be treated as nucleotides.*/

	  

DataSetFilter	filteredData = CreateFilter (nucleotideSequences,1);



/* 3. Collect observed nucleotide frequencies from the filtered data. observedFreqs will

	  store the vector of frequencies. */



HarvestFrequencies (observedFreqs, filteredData, 1, 1, 1);



/* 4. Define the KHY substitution matrix. '*' is defined to be -(sum of off-diag row elements) */



REVRateMatrix = 

		{{*,a,b,c}

		 {a,*,d,e}

		 {b,d,*,f}

		 {c,e,f,*}};

		 

/*5.  Define the REV model, by combining the substitution matrix with the vector of observed (equilibrium)

	  frequencies. */

	  

Model REV	 = (REVRateMatrix, observedFreqs);



/*6.  Now we can define the tree variable, using the tree string read from the data file,

	  and, by default, assigning the last defined model (REV) to all tree branches. */

	  

Tree	givenTree = DATAFILE_TREE;



/*7.  Since all the likelihood function ingredients (data, tree, equilibrium frequencies)

	  have been defined we are ready to construct the likelihood function. */

	  

LikelihoodFunction  theLnLik = (filteredData, givenTree);



/*8.  Maximize the likelihood function, storing parameter values in the matrix paramValues */



Optimize (paramValues, theLnLik);



/*9.  Print the tree with optimal branch lengths to the console. */



fprintf  (stdout, theLnLik);

		 

   

\ No newline at end of file
diff --git a/Examples/SimpleAnalyses/REVshared.bf b/Examples/SimpleAnalyses/REVshared.bf
new file mode 100644
index 0000000..39fdfa8
--- /dev/null
+++ b/Examples/SimpleAnalyses/REVshared.bf
@@ -0,0 +1 @@
+/* This is an example HY-PHY Batch File.



   It reads in a '#' nucleotide dataset data/hiv.nuc and estimates

   maximum ln-likelihood based on the tree contained in the data file,

   using the General Reversible model with the parameters

   shared by all branches.

   

   Output is printed out as a Newick Style tree with branch lengths

   representing the number of expected substitutions per branch (which

   is the default setting for nucleotide models w/o rate variation).

   

   

   Sergei L. Kosakovsky Pond and Spencer V. Muse 

   December 1999. 

*/



/* 1. Read in the data and store the result in a DataSet variable.*/



DataSet 		nucleotideSequences = ReadDataFile ("data/hiv.nuc");

   

/* 2. Filter the data, specifying that all of the data is to be used

	  and that it is to be treated as nucleotides.*/

	  

DataSetFilter	filteredData = CreateFilter (nucleotideSequences,1);



/* 3. Collect observed nucleotide frequencies from the filtered data. observedFreqs will

	  store the vector of frequencies. */



HarvestFrequencies (observedFreqs, filteredData, 1, 1, 1);



/* 4. Define the KHY substitution matrix. '*' is defined to be -(sum of off-diag row elements).

	  AG,AT,CG,CT,GT are the shared parameters, representing the ratio
	  of corresponding substitution rates to the AC rate.
	  t is the "branch length"*/



global AG;

global AT;

global CG;

global CT;

global GT;



REVRateMatrix = 

		{{*,t,AG*t,AT*t}

		 {t,*,CG*t,CT*t}

		 {AG*t,CG*t,*,GT*t}

		 {AT*t,CT*t,GT*t,*}};

		 

/*5.  Define the REV model, by combining the substitution matrix with the vector of observed (equilibrium)

	  frequencies. */

	  

Model REV	 = (REVRateMatrix, observedFreqs);



/*6.  Now we can define the tree variable, using the tree string read from the data file,

	  and, by default, assigning the last defined model (REV) to all tree branches. */

	  

Tree	givenTree = DATAFILE_TREE;



/*7.  Since all the likelihood function ingredients (data, tree, equilibrium frequencies)

	  have been defined we are ready to construct the likelihood function. */

	  

LikelihoodFunction  theLnLik = (filteredData, givenTree);



/*8.  Maximize the likelihood function, storing parameter values in the matrix paramValues */



Optimize (paramValues, theLnLik);



/*9.  Print the tree with optimal branch lengths to the console. */



fprintf  (stdout, theLnLik);

		 

   

\ No newline at end of file
diff --git a/Examples/SimpleAnalyses/data/hiv.nuc b/Examples/SimpleAnalyses/data/hiv.nuc
new file mode 100644
index 0000000..ef9f921
--- /dev/null
+++ b/Examples/SimpleAnalyses/data/hiv.nuc
@@ -0,0 +1 @@
+#719
ATAGTAATTAGATCTGAAAACTTCTCGAACAATGCTAAAACCATAATAGTACAGCTAAAT
AAATCTGTAGAAATTAATTGTACAAGACCCAACAACAATACAAGAAGAAGTATACAT
TTCGGACCAGGGAAAGCATTTTATGCAGGAGAAATAATAGGAGATATAAGACAAGCA
TATTGTACTCTTAATGGAGCAGAATGGAATAACACTGTAAAACAGGTAGCTGCAAAATTA
AGAGAAAAATTTAATAAAACAATAATCTTTAATCAATCC
#136
GTAGTAATTAGATCTGAAAACTTCTCGAACAATGCTAAAACCATAATAGTACAGCTAAAT
AAATCTGTAGAAATTAATTGTACAAGACCCAACAACAATACAAGAAGAAGTATACAT
TTTGGACCAGGGAAAGCATTTTATGCAGGAGAAATAATAGGAGATATAAGACAAGCA
TATTGTACCCTTAATGGAACAGAATGGAATAACACTTTAAAACAGGTAGCTGAAAAATTA
AGAGAACAATTTATTAAAACAATAGTTTTTAATCAATCC
#135
GTAGTAATTAGATCTGAAAACTTCACGAACAATGCTAAAACCATAATAGTACAGCTAAAT
AAATCTGTAGAAATTAATTGTGTAAGACCCGGCAACAATACAAGAAGAAGTATACAT
ATAGGACCAGGGAGAGCATATTATACAGGAGAAGTAATAGGAGATATAAGACAAGCA
CATTGTAACCTTAGTAGAACAGACTGGAATAAAACTTTAAAACAGGTAGCTGAAAAATTA
AGAGAACAATTTAATACAACAATAGTCTTTAATCAATCC
#105r
ATAGTAATTAGATCTGAAAACTTCACGAACAATGCTAAAACCATAATAGTACAGCTAAAT
AAATCTGTAGAAATTAAGTGTGAAAGACCCAACAACAATACAAGAAAAAGTGTACAT
ATAGGACCAGGGAAAGCATATTATACAGGAGAAATAATAGGAGATATAAGACAAGCA
CATTGTAACCTTAGTGGAACAGAATGGAGGGAAACTTTAAAACAGGTAGCTGAAAAATTA
AGAGAACAATTTAATAAAACAATAGTCTTTAATCAATCC
#529
ATAGTAATTAGATCTGAAAACTTCACGAACAATGCTAAAACCATAATAGTACATCTAAAT
GAATCTGTAGAAATTATTTGTGAAAGACCCAACAACAATACAAGAAAAAGTGTACAT
ATGGGACCAGGGAGAGCATATTACACAGGAGAAATAATAGGAGATATAAGACAAGCA
CATTGTAACATTAGTAGAACAAATTGGACGGAAACTTTAAAACAGGTAGCTGAAAAATTA
AGAGAACAATTTAATAAAACAATAGTCTTTAATCAATCC
#317
GTAGTAATTAGATCTGAAAACTTCACGAACAATGCTAAGACCATAATAGTACAGCTAAAT
AAACCTGTAAAAATTAATTGTACAAGACCCAACAACAATGCAAAAATAAGAATACAT
ATAGGACCAGGGAGACCATTTTATACAGCAGGAGAAATAGGAAATATAAGACAAGCA
CATTGTAACCTTAGTAGAACAGACTGGAATAACACTTTAAAACTGGTAGCTGAAAAATTA
AGAGAACAATTTAATAAAACAATAGTCTTTAATCAATCC
#6767
GTAGTAATTAGATCTGAAAACTTCACGAACAATGCTAAGACCATAATAGTACAGCTAAAT
AACTCTGTAACAATTAAGTGTGAAAGACCCAACAACAATACAAGAAAAAGTATACCT
ATAGGACCAGGGAGAGCCTTTTATACAACAGGAGACATAGGAGATATAAGACAAGCA
CATTGTAACCTTAGTAGAAAAGACTGGAATGACACTTTAAGACAGGTAGTTGGAAAGTTA
AGAGAACAATTTGGAAGAACAATAATCTTTAATCAATCC
#6760
ATAGTAATTAGATCTGAAAACTTCACGAACAATGCTAAAACCATAATAGTACAGCTAAAG
GAACCTGTAAACATTACTTGTGAAAGACCCAGCAACAATACAAGAAAAAGTATACAT
ATAGGACCAGGAAAAGCATTTTATGCAACAGGAGAAATAGGAGATATAAGACGAGCA
CATTGTAACCTTAATAGAACAGCATGGAATAAAACTTTAAAACAGGTAGTTGAAAAATTA
AGAGAACAATTTAAGAAAACAATAACCTTTAACCAATCC
#9939
ATAGTAATCAGATCTGAAAACTTCTCGGACAATGCTAAAACCATAATAGTACAGCTAAAC
AACACTGTAAACATTACTTGTGAAAGACCCAACAACAATACAAGAAAAAGGATACAT
ATAGGACCAGGGAGAGCAGTTTATACAACAGGACAAATAGGAGATATAAGAAAAGCA
CATTGTAACCTTAGTAGAACAAATTGGACTGAAACTTTAAGACAAGTAGCTGAAAAATTA
AAAGAACAATTTAATAAAACAATAATCTTTAATAATTCC
#113
GTAGTAATTCGATCTGAAAACTTCACGGACAATGCTAAAACCATAATAGTACAGCTAAAC
AAATCTGTAGAAATTACTTGTGTAAGACCCAACAACAATACAAGAAAAAGTATAAAT
ATAAGACCAGGGAGAGCATTTTATACAACAGGAGAAATAGGAGATATAAGACAAGCA
CATTGTAACCTTAGTAGAACAGCATGGAATGAAGCTTTAAGACAAGTAGCTAAAAAATTA
AAAGAACAATTTAATAGAACAATAGTCTTTAATCAATCC
#822
ATAGTAATTAGATCTGAAAACTTCACAGACAATGCTAAAACCATAATAGTACAGCTAAAC
AAATCTGTAGAAATTAATTGTATAAGACCCAACAACAATACAAGAAAAAGTATACAT
ATAGGACCAGGGAGAGCATTTTATACAACAGGAGACATAGGAGATATAAGACAAGCA
TATTGTAACCTTAGTAGAACAGCATGGAATGAAACTTTAAGACAAGTAGCTCAAAAATTA
AAAGAACAATTTAATAGAACAATAGTCTTTAATCAATCC
#159
ATAGTAATTAGATCTGAAAACTTCACAGACAATGCTAAAACCATAATAGTACAGCTAAAT
AAATCTGTAGAAATTAATTGTACAAGACCCAACAACAATACAAGAAAAAGTATACAT
ATAGGACCAGGGAGAGCTTTTTATACAACAGGTGAAATAGGAGATTTAAGACAAGCA
CATTGTAACCTTAGTAGAACAGCATGGAATGAAACTTTAAGACAAGTAGCTAAAAAATTA
AAAGAACAATTTAATAGAACAATAGTTTTTAATCAATCC
#256
ATAGTAATTAGATCTGAAAACTTCACGGACAATGCTAAAACCATAATAGTACAGCTAAAT
AAATCTGTAGAAATTAATTGTACAAGACCCAACAACAATACAAGAAAAAGTATAAAT
ATAGGACCAGGGAGAGCATTTTATACAACAGGTGAAATAGGAAATTTAAGACAAGCA
CATTGTAACCTTAGTAGAACAGCATGGAATGAAACTTTAAGACAAGTAGCTAAAAAACTA
AAAGAACAATTTAATAGAACAATAGTTTTTAATCAATCC

(((317,6767),((135,(529,105r)),(719,136))),6760,((113,9939),(256,(822,159))))
\ No newline at end of file
diff --git a/Examples/SimpleConstraints/F81K81uf_relratio.bf b/Examples/SimpleConstraints/F81K81uf_relratio.bf
new file mode 100644
index 0000000..a3ce0fa
--- /dev/null
+++ b/Examples/SimpleConstraints/F81K81uf_relratio.bf
@@ -0,0 +1 @@
+/* This is an example HY-PHY Batch File.

   It reads in two  nucleotide datasets (assumed to share the same tree)
   and performs the relative ratio test on a tree, using F81 model on the
   first partition and K81uf on the second. The likelihood ratio statistic 
   is evaluated and the P-value for the test is reported.
  
   Sergei L. Kosakovsky Pond
   September 2005 

*/



/* 1. Read in the data and store the result in  DataSet variables. Also prompt the user 
for a tree (assumed to be in the first data file), by including a stanard queryTree.bf module*/


SetDialogPrompt ("Locate the first nucleotide sequence file:");
DataSet 		nucleotideSequence1 = ReadDataFile (PROMPT_FOR_FILE);

incFileName = HYPHY_BASE_DIRECTORY+"TemplateBatchFiles"+DIRECTORY_SEPARATOR+"queryTree.bf";
ExecuteCommands  ("#include \""+incFileName+"\";");

SetDialogPrompt ("Locate the second nucleotide sequence file:");
DataSet 		nucleotideSequence2 = ReadDataFile (PROMPT_FOR_FILE);

if (nucleotideSequence1.species != nucleotideSequence2.species)
{
	fprintf (stdout, "\nERROR: Both data sets must have the same number of sequences\n");
	return 0;
}

/* 2. Filter the data, specifying that all of the data is to be used
	  and that it is to be treated as nucleotides. */

	  

DataSetFilter	filteredData1 = CreateFilter (nucleotideSequence1,1);
DataSetFilter	filteredData2 = CreateFilter (nucleotideSequence2,1);



/* 3. Collect observed nucleotide frequencies from the filtered data. observedFreqs will
	  store the vector of frequencies. */



HarvestFrequencies (observedFreqs1, filteredData1, 1, 1, 1);
HarvestFrequencies (observedFreqs2, filteredData2, 1, 1, 1);

/* 4. Define the F81 and K81uf substitution matrix. '*' is defined to be -(sum of off-diag row elements) */

F81RateMatrix    =  {{*,t,t,t}{t,*,t,t}{t,t,*,t}{t,t,t,*}};

global			 R_AC = 1; /* Relative to R_AG = 1*/
global			 R_AT = 1;

K81ufRateMatrix  =  {{*,R_AC*t,t,R_AT*t}{R_AC*t,*,R_AT*t,t}{t,R_AT*t,*,R_AC*t}{R_AT*t,t,R_AC*t,*}};

		 
/*5.  Define the models models, by combining the substitution matrix with the vector of observed 
	  (equilibrium) frequencies. */


Model 	F81_Model   = (F81RateMatrix , observedFreqs1);
Model   K81uf_Model = (K81ufRateMatrix , observedFreqs2);


/*6.  Now we can define 2 trees - one for each data block. We use appropriate models for each one.
	  treeString is defined by 'queryTree.bf' */

TRY_NUMERIC_SEQUENCE_MATCH = 1;

UseModel (F81_Model);
Tree	tree_1 = treeString;

UseModel (K81uf_Model);
Tree	tree_2 = treeString;



/*7.  Since all the likelihood function ingredients (data, tree, equilibrium frequencies)
	  have been defined we are ready to construct the likelihood function. We
	  combine both datasets into one likelihood function. */

LikelihoodFunction  theLnLik = (filteredData1, tree_1,filteredData2, tree_2);



/*8.  Maximize the likelihood function, storing parameter values in the matrix paramValues. 
	  We also store the resulting ln-lik and the number of model parameters. */


Optimize (paramValues, theLnLik);
unconstrainedLnLik = paramValues[1][0];
paramCount = paramValues[1][1] + 6	;


/*9.  Print the tree with optimal branch lengths to the console. */
/*    also print the ratio in branch lengths between matching branches */

fprintf  (stdout, "\n1). UNCONSTRAINED MODEL:", theLnLik);

bl1 = BranchLength (tree_1, -1);
bl2 = BranchLength (tree_2, -1);
bn  = BranchName   (tree_1, -1);

fprintf (stdout, "\n\nBranch lengths report\n\nLength in Tree 1, Length in Tree 2, Ratio, Branch Name\n");

for (k=0; k<Columns (bn)-1; k=k+1)
{
	fprintf (stdout, Format (bl1[k], 16, 6), "," , Format (bl2[k], 17, 6), ", ", Format(bl1[k]/bl2[k],6,3), ", ", bn[k], "\n");
}

/*10. We now constrain the rate of evolution along each branch to be proportional in both trees. 
	  R will represent the ratio. We use ReplicateConstraint to automatically
	  attach the same constraint to all branches of the tree. 
	  F*/

global REL_R = 1;
ReplicateConstraint ("this1.?.t:=REL_R*this2.?.t", tree_2, tree_1);
Optimize (paramValues, theLnLik);


/*11. Now we compute the ln-lik ratio statistic and the P-Value, using the Chi^2 dist'n 
	  with an appropriate degree of freedom. */

lnlikDelta = 2 (unconstrainedLnLik-paramValues[1][0]);
pValue = 1-CChi2 (lnlikDelta, paramCount - paramValues[1][1]);

fprintf (stdout, "\n\n1). Relative ratio constraint\n\nLikelihood Ratio Statistic = ", lnLikDelte, "\nP-value = ", pValue, "\n", theLnLik);

bl1 = BranchLength (tree_1, -1);
bl2 = BranchLength (tree_2, -1);
bn  = BranchName   (tree_1, -1);

fprintf (stdout, "\n\nBranch lengths report\n\nLength in Tree 1, Length in Tree 2, Ratio, Branch Name\n");

for (k=0; k<Columns (bn)-1; k=k+1)
{
	fprintf (stdout, Format (bl1[k], 16, 6), "," , Format (bl2[k], 17, 6), ", ", Format(bl1[k]/bl2[k],6,3), ", ", bn[k], "\n");
}
\ No newline at end of file
diff --git a/Examples/SimpleConstraints/F81relrate.bf b/Examples/SimpleConstraints/F81relrate.bf
new file mode 100644
index 0000000..2f06003
--- /dev/null
+++ b/Examples/SimpleConstraints/F81relrate.bf
@@ -0,0 +1 @@
+/* This is an example HY-PHY Batch File.



   It reads in a PHYLIP nucleotide dataset data/3.seq and performs

   the relative rate test on the 3-taxa tree, using F81 model.

   

   Output is printed out as a Newick Style tree with branch lengths

   representing the number of expected substitutions per branch (which

   is the default setting for nucleotide models w/o rate variation).

   Also, the likelihood ratio statistic is evaluated and the P-value

   for the test is reported.

   

   

   Sergei L. Kosakovsky Pond and Spencer V. Muse 

   December 1999. 

*/



/* 1. Read in the data and store the result in a DataSet variable.*/



DataSet 		nucleotideSequences = ReadDataFile ("data/3.seq");

   

/* 2. Filter the data, specifying that all of the data is to be used

	  and that it is to be treated as nucleotides. */

	  

DataSetFilter	filteredData = CreateFilter (nucleotideSequences,1);



/* 3. Collect observed nucleotide frequencies from the filtered data. observedFreqs will

	  store the vector of frequencies. */



HarvestFrequencies (observedFreqs, filteredData, 1, 1, 1);



/* 4. Define the F81 substitution matrix. '*' is defined to be -(sum of off-diag row elements) */



F81RateMatrix = 

		{{*,mu,mu,mu}

		 {mu,*,mu,mu}

		 {mu,mu,*,mu}

		 {mu,mu,mu,*}};

		 

/*5.  Define the F81 models, by combining the substitution matrix with the vector of observed 

	  (equilibrium) frequencies. */



Model 	F81 = (F81RateMatrix, observedFreqs);



/*6.  Now we can define the simple three taxa tree.
	  Since there is only 1 three sequence tree, we turn on
	  ALLOW_SEQUENCE_MISMATCH to tell hyphy to map the first
	  sequence in the data to leaf 'a', the 2nd - to leaf 'b' 
	  and the third - leaf 'c'. */

ALLOW_SEQUENCE_MISMATCH = 1;	  

Tree	threeTaxaTree = (a,b,c);


/*7.  Since all the likelihood function ingredients (data, tree, equilibrium frequencies)

	  have been defined we are ready to construct the likelihood function. */

	  

LikelihoodFunction  theLnLik = (filteredData, threeTaxaTree);



/*8.  Maximize the likelihood function, storing parameter values in the matrix paramValues. 

	  We also store the resulting ln-lik. */



Optimize (paramValues, theLnLik);

unconstrainedLnLik = paramValues[1][0];



/*9.  Print the tree with optimal branch lengths to the console. */



fprintf  (stdout, "\n0).UNCONSTRAINED MODEL:", theLnLik);



/*10. We now constrain the rate of evolution to be equal along the branches leading 

	  to c and b and repeat the optimization. */

	  

threeTaxaTree.b.mu := threeTaxaTree.c.mu;

Optimize (paramValues, theLnLik);



/*11. Now we compute the ln-lik ratio statistic and the P-Value, using the Chi^2 dist'n 

	  with 1 degree of freedom. */

	  

lnlikDelta = 2 (unconstrainedLnLik-paramValues[1][0]);

pValue = 1-CChi2 (lnlikDelta, 1);



fprintf (stdout, "\n\n1). With the outgroup at taxon #1, the P-value is:", pValue, "\n", theLnLik);



/*12. Clear the constraints on the tree and repeat the previous steps for other outgroups. */



ClearConstraints (threeTaxaTree);

threeTaxaTree.a.mu := threeTaxaTree.c.mu;

Optimize (paramValues, theLnLik);

lnlikDelta = 2 (unconstrainedLnLik-paramValues[1][0]);

pValue = 1-CChi2 (lnlikDelta, 1);

fprintf (stdout, "\n\n2). With the outgroup at taxon #2, the P-value is:", pValue, "\n", theLnLik);


ClearConstraints (threeTaxaTree);

threeTaxaTree.b.mu := threeTaxaTree.a.mu;

Optimize (paramValues, theLnLik);

lnlikDelta = 2 (unconstrainedLnLik-paramValues[1][0]);

pValue = 1-CChi2 (lnlikDelta, 1);

fprintf (stdout, "\n\n3). With the outgroup at taxon #3, the P-value is:", pValue, "\n", theLnLik);







		 

   

\ No newline at end of file
diff --git a/Examples/SimpleConstraints/F81relratio.bf b/Examples/SimpleConstraints/F81relratio.bf
new file mode 100644
index 0000000..ef021d8
--- /dev/null
+++ b/Examples/SimpleConstraints/F81relratio.bf
@@ -0,0 +1 @@
+/* This is an example HY-PHY Batch File.



   It reads in two NEXUS nucleotide dataset data/aspectrin1.nuc

   and data/aspectrin2.nuc and performs

   the relative ratio test on the 4-taxa tree, using F81 model.

   

   Output is printed out as a Newick Style tree with branch lengths

   representing the number of expected substitutions per branch (which

   is the default setting for nucleotide models w/o rate variation).

   Also, the likelihood ratio statistic is evaluated and the P-value

   for the test is reported.

   

   

   Sergei L. Kosakovsky Pond and Spencer V. Muse 

   December 1999. 

*/



/* 1. Read in the data and store the result in  DataSet variables.*/



DataSet 		nucleotideSequence1 = ReadDataFile ("data/aspectrin1.nuc");

DataSet 		nucleotideSequence2 = ReadDataFile ("data/aspectrin2.nuc");

   

/* 2. Filter the data, specifying that all of the data is to be used

	  and that it is to be treated as nucleotides. */

	  

DataSetFilter	filteredData1 = CreateFilter (nucleotideSequence1,1);

DataSetFilter	filteredData2 = CreateFilter (nucleotideSequence2,1);



/* 3. Collect observed nucleotide frequencies from the filtered data. observedFreqs will

	  store the vector of frequencies. */



HarvestFrequencies (observedFreqs1, filteredData1, 1, 1, 1);

HarvestFrequencies (observedFreqs2, filteredData2, 1, 1, 1);



/* 4. Define the F81 substitution matrix. '*' is defined to be -(sum of off-diag row elements) */



F81RateMatrix = 

		{{*,mu,mu,mu}

		 {mu,*,mu,mu}

		 {mu,mu,*,mu}

		 {mu,mu,mu,*}};

		 

/*5.  Define the F81 models, by combining the substitution matrix with the vector of observed 

	  (equilibrium) frequencies. We define one for each block, since the equilibrium 

	  frequencies will differ. */



Model 	F81Block1 = (F81RateMatrix, observedFreqs1);

Model 	F81Block2 = (F81RateMatrix, observedFreqs2);



/*6.  Now we can define 2 4-taxa trees - one for each data block. We use appropriate models for each one.
	  Note the use of TRY_NUMERIC_SEQUENCE_MATCH constant to instruct HyPhy to map sequence numbers to 
	  tree leaves (by default, HyPhy expects sequence names and leaf names to match).*/

TRY_NUMERIC_SEQUENCE_MATCH = 1;	  

UseModel (F81Block1);

Tree	fourTaxaTree1 = ((1,2),3,4);

UseModel (F81Block2);

Tree	fourTaxaTree2 = ((1,2),3,4);



/*7.  Since all the likelihood function ingredients (data, tree, equilibrium frequencies)

	  have been defined we are ready to construct the likelihood function. We

	  combine both datasets into one likelihood function. */

	  

LikelihoodFunction  theLnLik = (filteredData1, fourTaxaTree1, filteredData2, fourTaxaTree2);



/*8.  Maximize the likelihood function, storing parameter values in the matrix paramValues. 

	  We also store the resulting ln-lik and the number of model parameters. */



Optimize (paramValues, theLnLik);

unconstrainedLnLik = paramValues[1][0];

paramCount = paramValues[1][1];



/*9.  Print the tree with optimal branch lengths to the console. */

fprintf  (stdout, "\n0). UNCONSTRAINED MODEL:", theLnLik);



/*10. We now constrain the rate of evolution along each branch to be proportional in both trees. 

	  R will represent the ratio. We use ReplicateConstraint to automatically

	  attach the same constraint to all branches of the tree. */

	  

global R;

ReplicateConstraint ("this1.?.mu:=R*this2.?.mu", fourTaxaTree2, fourTaxaTree1);

Optimize (paramValues, theLnLik);



/*11. Now we compute the ln-lik ratio statistic and the P-Value, using the Chi^2 dist'n 

	  with an appropriate degree of freedom. */

	  

lnlikDelta = 2 (unconstrainedLnLik-paramValues[1][0]);

pValue = 1-CChi2 (lnlikDelta, paramCount - paramValues[1][1]);



fprintf (stdout, "\n\n1). Relative ratio constraint; the P-value is:", pValue, "\n", theLnLik);

\ No newline at end of file
diff --git a/Examples/SimpleConstraints/HKY85relrate.bf b/Examples/SimpleConstraints/HKY85relrate.bf
new file mode 100644
index 0000000..be23596
--- /dev/null
+++ b/Examples/SimpleConstraints/HKY85relrate.bf
@@ -0,0 +1 @@
+/* This is an example HY-PHY Batch File.



   It reads in a PHYLIP nucleotide dataset data/3.seq and performs

   the relative rate test on the 3-taxa tree, using HKY85 model.

   

   Output is printed out as a Newick Style tree with branch lengths

   representing the number of expected substitutions per branch (which

   is the default setting for nucleotide models w/o rate variation).

   Also, the likelihood ratio statistic is evaluated and the P-value

   for the test is reported.

   

   

   Sergei L. Kosakovsky Pond and Spencer V. Muse 

   December 1999. 

*/



/* 1. Read in the data and store the result in a DataSet variable.*/



DataSet 		nucleotideSequences = ReadDataFile ("data/3.seq");

   

/* 2. Filter the data, specifying that all of the data is to be used

	  and that it is to be treated as nucleotides. */

	  

DataSetFilter	filteredData = CreateFilter (nucleotideSequences,1);



/* 3. Collect observed nucleotide frequencies from the filtered data. observedFreqs will

	  store the vector of frequencies. */



HarvestFrequencies (observedFreqs, filteredData, 1, 1, 1);



/* 4. Define the HKY substitution matrix. '*' is defined to be -(sum of off-diag row elements) */



HKY85RateMatrix  = 

		{{*,trvs,trst,trvs}

		 {trvs,*,trvs,trst}

		 {trst,trvs,*,trvs}

		 {trvs,trst,trvs,*}};

		 

/*5.  Define the HKY85 model, by combining the substitution matrix with the vector of observed (equilibrium)

	  frequencies. */

	  

Model HKY85	 = (HKY85RateMatrix , observedFreqs);



/*6.  Now we can define the simple three taxa tree.
	  Since there is only 1 three sequence tree, we turn on
	  ALLOW_SEQUENCE_MISMATCH to tell hyphy to map the first
	  sequence in the data to leaf 'a', the 2nd - to leaf 'b' 
	  and the third - leaf 'c'. */

ALLOW_SEQUENCE_MISMATCH = 1;	  

Tree	threeTaxaTree = (a,b,c);



/*7.  Since all the likelihood function ingredients (data, tree, equilibrium frequencies)

	  have been defined we are ready to construct the likelihood function. */

	  

LikelihoodFunction  theLnLik = (filteredData, threeTaxaTree);



/*8.  Maximize the likelihood function, storing parameter values in the matrix paramValues. 

	  We also store the resulting ln-lik. */



Optimize (paramValues, theLnLik);

unconstrainedLnLik = paramValues[1][0];



/*9.  Print the tree with optimal branch lengths to the console. */



fprintf  (stdout, "\n 0).UNCONSTRAINED MODEL:", theLnLik);



/*10. We now constrain the rate of evolution to be equal along the branches leading 

	  to c and b and repeat the optimization. We will impose 3 types of constraints:

	  - transition rates are equal

	  - transversion rates are equal 

	  - both rates are equal.

	  We also compute the ln-lik ratio statistic and the P-Value, using the Chi^2 dist'n 

	  with 1(or 2) degree of freedom.

*/

	  

threeTaxaTree.b.trst := threeTaxaTree.c.trst;

Optimize (paramValues, theLnLik);

	  

lnlikDelta = 2 (unconstrainedLnLik-paramValues[1][0]);

pValue = 1-CChi2 (lnlikDelta, 1);



fprintf (stdout, "\n\n1). Outgroup at taxon #1");

fprintf (stdout, "\n\t a). Transition rate test. P-Value = ", pValue,"\n", theLnLik);



ClearConstraints (threeTaxaTree.b.trst);



threeTaxaTree.b.trvs := threeTaxaTree.c.trvs;

Optimize (paramValues, theLnLik);

	  

lnlikDelta = 2 (unconstrainedLnLik-paramValues[1][0]);

pValue = 1-CChi2 (lnlikDelta, 1);



fprintf (stdout, "\n\t b). Transversion rate test. P-Value = ", pValue,"\n", theLnLik);



threeTaxaTree.b.trst := threeTaxaTree.c.trst;

Optimize (paramValues, theLnLik);

	  

lnlikDelta = 2 (unconstrainedLnLik-paramValues[1][0]);

pValue = 1-CChi2 (lnlikDelta, 2);



fprintf (stdout, "\n\t c). Both rates test. P-Value = ", pValue,"\n", theLnLik);





/*11. Clear the constraints on the tree and repeat the previous steps for other outgroups. */



/* Repeat for taxon #2 */



ClearConstraints (threeTaxaTree);



threeTaxaTree.a.trst := threeTaxaTree.c.trst;

Optimize (paramValues, theLnLik);

	  

lnlikDelta = 2 (unconstrainedLnLik-paramValues[1][0]);

pValue = 1-CChi2 (lnlikDelta, 1);



fprintf (stdout, "\n\n2). Outgroup at taxon #2");

fprintf (stdout, "\n\t a). Transition rate test. P-Value = ", pValue,"\n", theLnLik);



ClearConstraints (threeTaxaTree);



threeTaxaTree.a.trvs := threeTaxaTree.c.trvs;

Optimize (paramValues, theLnLik);

	  

lnlikDelta = 2 (unconstrainedLnLik-paramValues[1][0]);

pValue = 1-CChi2 (lnlikDelta, 1);



fprintf (stdout, "\n\t b). Transversion rate test. P-Value = ", pValue,"\n", theLnLik);



threeTaxaTree.a.trst := threeTaxaTree.c.trst;

Optimize (paramValues, theLnLik);

	  

lnlikDelta = 2 (unconstrainedLnLik-paramValues[1][0]);

pValue = 1-CChi2 (lnlikDelta, 2);



fprintf (stdout, "\n\t c). Both rates test. P-Value = ", pValue,"\n", theLnLik);



/* Repeat for taxon #3 */



ClearConstraints (threeTaxaTree);



threeTaxaTree.a.trst := threeTaxaTree.b.trst;



Optimize (paramValues, theLnLik);

lnlikDelta = 2 (unconstrainedLnLik-paramValues[1][0]);

pValue = 1-CChi2 (lnlikDelta, 1);



fprintf (stdout, "\n\n3). Outgroup at taxon #3");

fprintf (stdout, "\n\t a). Transition rate test. P-Value = ", pValue,"\n", theLnLik);



ClearConstraints (threeTaxaTree);

threeTaxaTree.a.trvs := threeTaxaTree.b.trvs;



Optimize (paramValues, theLnLik);

	  lnlikDelta = 2 (unconstrainedLnLik-paramValues[1][0]);

pValue = 1-CChi2 (lnlikDelta, 1);



fprintf (stdout, "\n\t b). Transversion rate test. P-Value = ", pValue,"\n", theLnLik);



threeTaxaTree.a.trst := threeTaxaTree.b.trst;



Optimize (paramValues, theLnLik);

lnlikDelta = 2 (unconstrainedLnLik-paramValues[1][0]);

pValue = 1-CChi2 (lnlikDelta, 2);



fprintf (stdout, "\n\t c). Both rates test. P-Value = ", pValue,"\n", theLnLik);

   

\ No newline at end of file
diff --git a/Examples/SimpleConstraints/HKY85relratio.bf b/Examples/SimpleConstraints/HKY85relratio.bf
new file mode 100644
index 0000000..4e1812e
--- /dev/null
+++ b/Examples/SimpleConstraints/HKY85relratio.bf
@@ -0,0 +1 @@
+/* This is an example HY-PHY Batch File.



   It reads in two NEXUS nucleotide dataset data/aspectrin1.nuc

   and data/aspectrin2.nuc and performs

   the relative ratio test on the 4-taxa tree, using HKY85 model.

   

   Output is printed out as a Newick Style tree with branch lengths

   representing the number of expected substitutions per branch (which

   is the default setting for nucleotide models w/o rate variation).

   Also, the likelihood ratio statistic is evaluated and the P-value

   for the test is reported.

   

   

   Sergei L. Kosakovsky Pond and Spencer V. Muse 

   December 1999. 

*/



/* 1. Read in the data and store the result in  DataSet variables.*/



DataSet 		nucleotideSequence1 = ReadDataFile ("data/aspectrin1.nuc");

DataSet 		nucleotideSequence2 = ReadDataFile ("data/aspectrin2.nuc");

   

/* 2. Filter the data, specifying that all of the data is to be used

	  and that it is to be treated as nucleotides. */

	  

DataSetFilter	filteredData1 = CreateFilter (nucleotideSequence1,1);

DataSetFilter	filteredData2 = CreateFilter (nucleotideSequence2,1);



/* 3. Collect observed nucleotide frequencies from the filtered data. observedFreqs will

	  store the vector of frequencies. */



HarvestFrequencies (observedFreqs1, filteredData1, 1, 1, 1);

HarvestFrequencies (observedFreqs2, filteredData2, 1, 1, 1);



/* 4. Define the HKY85 substitution matrix. '*' is defined to be -(sum of off-diag row elements) */



HKY85RateMatrix  = 

		{{*,trvs,trst,trvs}

		 {trvs,*,trvs,trst}

		 {trst,trvs,*,trvs}

		 {trvs,trst,trvs,*}};

		 

/*5.  Define the HKY85 models, by combining the substitution matrix with the vector of observed 

	  (equilibrium) frequencies. We define one for each block, since the equilibrium 

	  frequencies will differ. */



Model 	HKY85Block1 = (HKY85RateMatrix , observedFreqs1);

Model 	HKY85Block2 = (HKY85RateMatrix , observedFreqs2);



/*6.  Now we can define 2 4-taxa trees - one for each data block. We use appropriate models for each one.
	  Note the use of TRY_NUMERIC_SEQUENCE_MATCH constant to instruct HyPhy to map sequence numbers to 
	  tree leaves (by default, HyPhy expects sequence names and leaf names to match).*/

TRY_NUMERIC_SEQUENCE_MATCH = 1;	  

UseModel (HKY85Block1);

Tree	fourTaxaTree1 = ((1,2),3,4);

UseModel (HKY85Block2);

Tree	fourTaxaTree2 = ((1,2),3,4);



/*7.  Since all the likelihood function ingredients (data, tree, equilibrium frequencies)

	  have been defined we are ready to construct the likelihood function. We

	  combine both datasets into one likelihood function. */

	  

LikelihoodFunction  theLnLik = (filteredData1, fourTaxaTree1,filteredData2, fourTaxaTree2);



/*8.  Maximize the likelihood function, storing parameter values in the matrix paramValues. 

	  We also store the resulting ln-lik and the number of model parameters. */



Optimize (paramValues, theLnLik);

unconstrainedLnLik = paramValues[1][0];

paramCount = paramValues[1][1];



/*9.  Print the tree with optimal branch lengths to the console. */

fprintf  (stdout, "\n0). UNCONSTRAINED MODEL:", theLnLik);



/*10. We now constrain the rate of evolution along each branch to be proportional in both trees. 

	  R will represent the ratio. We use ReplicateConstraint to automatically

	  attach the same constraint to all branches of the tree. 

	  First we constrain only transition rates.*/

	  

global R;

ReplicateConstraint ("this1.?.trst:=R*this2.?.trst", fourTaxaTree2, fourTaxaTree1);

Optimize (paramValues, theLnLik);



/*11. Now we compute the ln-lik ratio statistic and the P-Value, using the Chi^2 dist'n 

	  with an appropriate degree of freedom. */

	  

lnlikDelta = 2 (unconstrainedLnLik-paramValues[1][0]);

pValue = 1-CChi2 (lnlikDelta, paramCount - paramValues[1][1]);



fprintf (stdout, "\n\n1). Relative ratio constraint on transitions; the P-value is:", pValue, "\n", theLnLik);



/*12.  We now constrain only transversion rates.*/

	  

ClearConstraints(fourTaxaTree2);

ReplicateConstraint ("this1.?.trst:=R*this2.?.trst", fourTaxaTree2, fourTaxaTree1);

Optimize (paramValues, theLnLik);

	  

lnlikDelta = 2 (unconstrainedLnLik-paramValues[1][0]);

pValue = 1-CChi2 (lnlikDelta, paramCount - paramValues[1][1]);



fprintf (stdout, "\n\n2). Relative ratio constraint on transversions; the P-value is:", pValue, "\n", theLnLik);



/*12.  We now constrain both rates.*/

	  

ClearConstraints(fourTaxaTree2);

ReplicateConstraint ("this1.?.?:=R*this2.?.?", fourTaxaTree2, fourTaxaTree1);

Optimize (paramValues, theLnLik);

	  

lnlikDelta = 2 (unconstrainedLnLik-paramValues[1][0]);

pValue = 1-CChi2 (lnlikDelta, paramCount - paramValues[1][1]);



fprintf (stdout, "\n\n3). Relative ratio constraint on both rates; the P-value is:", pValue, "\n", theLnLik);

\ No newline at end of file
diff --git a/Examples/SimpleConstraints/MolecularClockF81.bf b/Examples/SimpleConstraints/MolecularClockF81.bf
new file mode 100644
index 0000000..498f186
--- /dev/null
+++ b/Examples/SimpleConstraints/MolecularClockF81.bf
@@ -0,0 +1 @@
+/* This is an example HY-PHY Batch File.



   It reads in a '#' nucleotide dataset data/molclock.seq and performs

   a series of molecular clock tests on the data using the F81 model.

   

   Output is printed out as a Newick Style tree with branch lengths

   representing the number of expected substitutions per branch (which

   is the default setting for nucleotide models w/o rate variation).

   Also, the likelihood ratio statistic is evaluated and the P-values

   for the tests are reported.

   

   

   Sergei L. Kosakovsky Pond and Spencer V. Muse 

   December 1999. 

*/



/* 1. Read in the data and store the result in a DataSet variable.*/



DataSet 		nucleotideSequences = ReadDataFile ("data/molclock.seq");

   

/* 2. Filter the data, specifying that all of the data is to be used

	  and that it is to be treated as nucleotides. */

	  

DataSetFilter	filteredData = CreateFilter (nucleotideSequences,1);



/* 3. Collect observed nucleotide frequencies from the filtered data. observedFreqs will

	  store the vector of frequencies. */



HarvestFrequencies (observedFreqs, filteredData, 1, 1, 1);



F81RateMatrix = 

		{{*,mu,mu,mu}

		 {mu,*,mu,mu}

		 {mu,mu,*,mu}

		 {mu,mu,mu,*}};

		 

/*5.  Define the F81 models, by combining the substitution matrix with the vector of observed 

	  (equilibrium) frequencies. We define one for each block, since the equilibrium 

	  frequencies will differ. */



Model 	F81 = (F81RateMatrix, observedFreqs);



/*6.  Now we can define the tree for the data just read taxa. Notice that 

	  some of the internal nodes are named for later use.*/

	  

Tree  theTree = (TAAJ153,(HVRNASS,(RICRSS3,((ZMSUCS1,(OSRSS1A,(TASUCSYN1,HVSSYNMR)Internal1)),(MZESUS1,ORRSS2)Internal2))));

	  			

/*7.  Since all the likelihood function ingredients (data, tree, equilibrium frequencies)

	  have been defined we are ready to construct the likelihood function. */

	  

LikelihoodFunction  theLnLik = (filteredData, theTree);



/*8.  Maximize the likelihood function, storing parameter values in the matrix paramValues. 

	  We also store the resulting ln-lik and the number of model parameters. */



Optimize (paramValues, theLnLik);

unconstrainedLnLik = paramValues[1][0];

paramCount = paramValues[1][1];



/*9.  Print the tree with optimal branch lengths to the console. */



fprintf  (stdout, "\n 0).UNCONSTRAINED MODEL:", theLnLik);



/*10. Now we impose the molecular clock constraint on the entire tree, 

	  enforcing the clock on parameter mu.*/

	  

MolecularClock (theTree, mu);



/*11. We maximize the tree with molecular clock constraints and report the results.*/



Optimize (paramValues, theLnLik);



lnlikDelta = 2 (unconstrainedLnLik-paramValues[1][0]);

pValue = 1-CChi2 (lnlikDelta, paramCount - paramValues[1][1]);



fprintf (stdout, "\n\n1). Global Molecular Clock; the P-value is:", pValue, "\n", theLnLik);

/*12. We can now try to impose molecular clock only on a subtree of the original tree.

	  First we do that for the subtree starting at the node Internal1 */

	  

ClearConstraints (theTree);

MolecularClock (theTree.Internal1, mu);

Optimize (paramValues, theLnLik);



lnlikDelta = 2 (unconstrainedLnLik-paramValues[1][0]);

pValue = 1-CChi2 (lnlikDelta, paramCount - paramValues[1][1]);



fprintf (stdout, "\n\n2). Molecular Clock starting at Internal1; the P-value is:", pValue, "\n", theLnLik);



/*12. Secondly, we apply the clock for the subtree starting at the node Internal2, 

	  in addition to the clock imposed in Step 11. */

	  

MolecularClock (theTree.Internal2, mu);

Optimize (paramValues, theLnLik);

lnlikDelta = 2 (unconstrainedLnLik-paramValues[1][0]);

pValue = 1-CChi2 (lnlikDelta, paramCount - paramValues[1][1]);



fprintf (stdout, "\n\n3). Molecular Clock starting at Internal1 and Internal2; the P-value is:", pValue, "\n", theLnLik);



\ No newline at end of file
diff --git a/Examples/SimpleConstraints/MolecularClockHKY85.bf b/Examples/SimpleConstraints/MolecularClockHKY85.bf
new file mode 100644
index 0000000..b8b5bfa
--- /dev/null
+++ b/Examples/SimpleConstraints/MolecularClockHKY85.bf
@@ -0,0 +1 @@
+/* This is an example HY-PHY Batch File.


   It reads in a '#' nucleotide dataset data/molclock.seq and performs
   a series of molecular clock tests on the data using the HKY85 model.

   

   Output is printed out as a Newick Style tree with branch lengths
   representing the number of expected substitutions per branch (which
   is the default setting for nucleotide models w/o rate variation).
   Also, the likelihood ratio statistic is evaluated and the P-values
   for the tests are reported.

   Sergei L. Kosakovsky Pond and Spencer V. Muse 

   December 1999. 

*/



/* 1. Read in the data and store the result in a DataSet variable.*/

DataSet 		nucleotideSequences = ReadDataFile ("data/molclock.seq");

/* 2. Filter the data, specifying that all of the data is to be used
  and that it is to be treated as nucleotides. */

DataSetFilter	filteredData = CreateFilter (nucleotideSequences,1);

/* 3. Collect observed nucleotide frequencies from the filtered data. observedFreqs will
	  store the vector of frequencies. */

HarvestFrequencies (observedFreqs, filteredData, 1, 1, 1);

/* 4. Define the HKY substitution matrix. '*' is defined to be -(sum of off-diag row elements) */

HKY85RateMatrix = 

		{{*,trvs,trst,trvs}
		 {trvs,*,trvs,trst}
		 {trst,trvs,*,trvs}
		 {trvs,trst,trvs,*}};

		 
/*5.  Define the HKY85 model, by combining the substitution matrix with the vector of observed (equilibrium)
	  frequencies. */

Model HKY85	 = (HKY85RateMatrix, observedFreqs);

/*6.  Now we can define the tree for the data just read.*/

Tree  theTree = (TAAJ153,(HVRNASS,(RICRSS3,((ZMSUCS1,(OSRSS1A,(TASUCSYN1,HVSSYNMR))),(MZESUS1,ORRSS2)))));

/*7.  Since all the likelihood function ingredients (data, tree, equilibrium frequencies)
	  have been defined we are ready to construct the likelihood function. */

LikelihoodFunction  theLnLik = (filteredData, theTree);

/*8.  Maximize the likelihood function, storing parameter values in the matrix paramValues. 
	  We also store the resulting ln-lik and the number of model parameters. */

Optimize (paramValues, theLnLik);

unconstrainedLnLik = paramValues[1][0];
paramCount = paramValues[1][1];


/*9.  Print the tree with optimal branch lengths to the console. */


fprintf  (stdout, "\n 0).UNCONSTRAINED MODEL:", theLnLik);

/*10. Now we impose the molecular clock constraint on the entire tree, 
	  enforcing the clock on transition rates only.*/

MolecularClock (theTree, trst);

/*11. We maximize the tree with molecular clock constraints and report the results.*/

Optimize (paramValues, theLnLik);
lnlikDelta = 2 (unconstrainedLnLik-paramValues[1][0]);
pValue = 1-CChi2 (lnlikDelta, paramCount - paramValues[1][1]);
fprintf (stdout, "\n\n1). Global Molecular Clock on transition rates; the P-value is:", pValue, "\n", theLnLik);

/*12. Now we enforce the clock on transversion rates only. */

ClearConstraints (theTree);
MolecularClock (theTree, trvs);
Optimize (paramValues, theLnLik);
lnlikDelta = 2 (unconstrainedLnLik-paramValues[1][0]);
pValue = 1-CChi2 (lnlikDelta, paramCount - paramValues[1][1]);

fprintf (stdout, "\n\n2). Global Molecular Clock on transversion rates; the P-value is:", pValue, "\n", theLnLik);

/*13. Finally, enforce the clock on both rates */

MolecularClock (theTree, trst);
Optimize (paramValues, theLnLik);
lnlikDelta = 2 (unconstrainedLnLik-paramValues[1][0]);
pValue = 1-CChi2 (lnlikDelta, paramCount - paramValues[1][1]);
fprintf (stdout, "\n\n3). Global Molecular Clock on both rates; the P-value is:", pValue, "\n", theLnLik);

\ No newline at end of file
diff --git a/Examples/SimpleConstraints/data/3.seq b/Examples/SimpleConstraints/data/3.seq
new file mode 100644
index 0000000..432408c
--- /dev/null
+++ b/Examples/SimpleConstraints/data/3.seq
@@ -0,0 +1 @@
+3	375
a          ATGATTCAACCTCAGACCCTTTTAAATGTAGCAGATAACAGTGGAGCTCG
           AAAATTGATGTGTATTCGAGTCATAGGAGCTGCTAGTAATCAGCGATATG
           CTCGTATTGGTGATGTTATTGTTGCTGTAATCAAAGACGCAGTGCCCCAA
           ATGCCTCTAGAAAGATCCGAAGTAATTCGAGCTGTAATTGTACGTACATG
           TAAAGAGTTCAAATGCGAAGACGGTATAATAATACGCTATGACGACAATG
           CAGCGGTTATCATTGATCAAAAAGGA---AATCCAAAAGGAACTCGCGTT
           TTTGGCGCGATCGCCGAGGAATTGAGAGAATTGAATTTTACTAAAATAGT
           TTCATTAGCTCCTGAAGTATTATAA

b          ATGATTCAACCTCAGACCCATTTAAATGTAGCGGATAACAGCGGGGCTCG
           AGAATTGATGTGTATTCGAATCATAGGAGCT---AGCAATCGTCGATATG
           CTCATATTGGTGACGTTATTGTTGCTGTGATCAAAGAAGCCGTACCAAAT
           ATGCCCCTAGAAAGATCAGAAGTAGTCAGAGCTGTAATTGTGCGGACCTG
           TAAAGAACTCAAACGTGACAACGGGATGATAATACGATATGATGACAATG
           CTGCAGTTGTTATTGATCAAGAAGGAAGGAAATCAAAAGGAACTCGAATT
           TTTGGTGCAATCGCCCGGGAATTGAGAGAATTAAATTTTACTAAAATAGT
           TTCATTAGCTCCCGAGGTATTATAA

og         ATGATTCAACCTCAAACTTATTTAAATGTTGCAGATAATAGTGGAGCTCG
           AAAACTAATGTGCATTCGAGTTATAGGAACG---AGTAATCGAAAATATG
           CAAATATTGGTGATATTATTATTGCTGTTGTTAAAGAAGCAGTGCCAAAT
           ATGCCTATTAAAAAATCCGAAATTGTAAGAGCTGTAATTGTACGTACGTG
           TAAAGAATTTAAACGAAATAATGGATCCATAATAAAATTTGATGATAATG
           CAGCAGTTGTTATTAATCAAGAAGGA---AATCCAAAAGGAACTCGAGTT
           TTTGGTCCAATTGCTAGAGAATTAAGAGAATCTAATTTTACTAAAATAGT
           TTCGTTAGCTCCAGAAGTTTTATAA


1
((a,b),og);
\ No newline at end of file
diff --git a/Examples/SimpleConstraints/data/aspectrin1.nuc b/Examples/SimpleConstraints/data/aspectrin1.nuc
new file mode 100644
index 0000000..adec52b
--- /dev/null
+++ b/Examples/SimpleConstraints/data/aspectrin1.nuc
@@ -0,0 +1 @@
+#NEXUS

BEGIN TAXA;
	DIMENSIONS NTAX = 4;
	TAXLABELS
		'humnal01' 'chikal01' 'flyal01' 'humeal01' ;
END;

BEGIN CHARACTERS;
	DIMENSIONS NCHAR = 324;
	FORMAT
		DATATYPE = DNA
		GAP=-
		MISSING=?
	;

MATRIX
	'humnal01'  TCCTATCGATTCCAGTTCTTTCAAAGAGATGCTGAAGAGCTGGAGAAATGGATACAGGAAAAACTTCAGATTGCATCTGATGAGAATTAT---AAAGACCCAACCAACTTGCAGGGAAAGCTTCAGAAGCATCAAGCATTTGAAGCTGAAGTGCAGGCCAACTCAGGAGCCATTGTTAAGCTGGATGAAACTGGAAACCTGATGATCTCAGAAGGGCATTTTGCATCTGAAACC------ATACGGACCCGTTTGATGGAGCTGCACCGCCAGTGGGAATTACTTTTGGAGAAGATGCGAGAAAAAGGAATCAAATTGCTGCAG
	'chikal01'  TCCTATCGGTTCCAGTTCTTCCAGCGTGATGCAGATGAGCTGGGAAAATGGATCCAAGAGAAACTCCAGATAGCATCTGATGAAAATTAC---AAAGACCCAAGCAATTTACAGGGGAAGCTGCAGAAGCACCAGGCCTTTGAAGCTGAGGTGCAGGCCAATTCAGGGGCTATCGTTAAGCTGGATGAGACTGGAAATCAGATGATCAATGAAGGCCATTTTGCATCTGAAACC------ATAAGAACTCGTCTACAGGAGCTGCACCGACTATGGGAGTTACTGCTGGAAAAAATGAGAGAGAAGGGAGTGAAGCTGTTGCAA
	'flyal01'   TCGCGCCGCTTCCAGTACTTCAAGCGCGATGCCGACGAGTTGGAGTCGTGGATCCACGAGAAGCTGCAGGCAGCCAGCGAGGAGAGCTAC---CGCGATCCGACCAACCTGCAGGCCAAAATCCAGAAACATCAGGCGTTCGAGGCGGAGGTGTCGGCGCACAGCAACGCCATTGTCTCGCTGGACAACACTGGCCAGGAGATGATCAACCAGCAACATTTTGCCTCCGAGTCG------ATTCAGGTCCGCCTCGACGAGCTGCACAAGCTGTGGGAGCTGCTTCTTAGCCGTCTGGCCGAGAAGGGTCTAAAGCTGCAGCAG
	'humeal01'  TCCTATCACTTACAAGTTTTCAAGCGAGATGCAGATGATCTGGGGAAGTGGATCATGGAGAAAGTCAATATCTTAACCGATAAGAGCTAT---GAAGACCCAACTAATATACAGGGGAAATATCAGAAGCATCAATCCCTTGAAGCAGAGGTGCAAACGAAATCAAGACTCATGTCTGAACTGGAAAAAACAAGGGAAGAACGATTTACCATGGGTCATTCTGCCCACGAAGAA------ACGAAGGCCCATATAGAGGAGCTACGCCACCTGTGGGACCTGCTGTTAGAGCTGACCCTGGAGAAGGGTGACCAGTTGCTGCGG;
END;

BEGIN TREES;
	TREE tree = ((1,2),3,4);
END;
\ No newline at end of file
diff --git a/Examples/SimpleConstraints/data/aspectrin2.nuc b/Examples/SimpleConstraints/data/aspectrin2.nuc
new file mode 100644
index 0000000..5bd13fe
--- /dev/null
+++ b/Examples/SimpleConstraints/data/aspectrin2.nuc
@@ -0,0 +1 @@
+#NEXUS

BEGIN TAXA;
	DIMENSIONS NTAX = 4;
	TAXLABELS
		'humnal02' 'chikal02' 'flyal02' 'humeal02' ;
END;

BEGIN CHARACTERS;
	DIMENSIONS NCHAR = 348;
	FORMAT
		DATATYPE = DNA
		GAP=-
		MISSING=?
		INTERLEAVED
	;

MATRIX
	'humnal02'  GCCCAGAACTTGGTGCAGTACTTACGAGAATGTGAGGACGTGATGGACTG
	'chikal02'  GCACAGAAGCTGGTGCAATTCTTACGGGAATGTGAAGATGTCATGGACTG
	'flyal02'   GCTCTCGTCCTGGTGCAGTTCCTGCGCCAGTGCGAGGAGGTGATGTTCTG
	'humeal02'  GCCCTGAAGTTCCAGCAGTATGTACAGGAGTGTGCTGACATCTTAGAGTG


	'humnal02'  GATCAATGACAAGGAAGCAATTGTTACTTCTGAAGAGCTGGGCCAGGATC
	'chikal02'  GATCAATGACAAGGAAGCAATAGTGACCTCAGAAGAGCTTGGACAGGACT
	'flyal02'   GATTAAGGACAAGGAGACCTTTGTCACCGCCGACGAGTTCGGCCAAGACC
	'humeal02'  GATTGGAGACAAGGAGGCTATAGCGACATCAGTGGAGCTAGGTGAAGACT


	'humnal02'  TGGAGCATGTAGAGGTTTTACAGAAGAAATTTGAAGAGTTTCAAACAGAT
	'chikal02'  TAGAGCATGTTGAGGTTTTGCAGAAGAAATTTGAAGAGTTCCAAACAGAT
	'flyal02'   TGGAACATGTAGAGGTTCTGCAGCGCAAGTTCGATGAGTTCCAGAAGGAC
	'humeal02'  GGGAGCGCACCGAAGTTCTGCATAAGAAATTTGAAGACTTCCAAGTGGAG


	'humnal02'  ATGGCTGCTCATGAAGAAAGAGTTAATGAAGTGAACCAGTTTGCTGCCAA
	'chikal02'  CTGGCAGCTCATGAGGAGAGAGTGAATGAAGTGAACCAGTTCGCTGGGAA
	'flyal02'   ATGGCCTCCCAGGAGTATCGCGTGACTGAGGTCAACCAGTTGGCCGATAA
	'humeal02'  CTGGTAGCTAAAGAAGGGAGAGTTGTTGAAGTGAACCAATATGCCAATGA


	'humnal02'  ACTCATACAGGAGCAGCACCCTGAGGAGGAACTG------ATCAAGACTA
	'chikal02'  ACTTATCCAGGAACAGCACCCTGAGGAGGAACTT------ATAAAGTCCA
	'flyal02'   GTTGGTGCAAGATGGTCATCCCGAGCGCGATACG------ATTACCAAGC
	'humeal02'  GTGTGCCGAGGAAAACCATCCTGACCTACCCTTA------ATTCAGTCTA


	'humnal02'  AGCAGGATGAAGTCAATGCAGCCTGGCAGCGGCTGAAGGGCCTGGCTCTG
	'chikal02'  AACAGGATGAAGTAAATGCAAGCTGGCAGCGTCTTAAGGGGCTTGCCCAA
	'flyal02'   GCAAGGAGGAGCTAAACGAGGCTTGGCAGCGACTTAAGCAGTTAGCCATT
	'humeal02'  AGCAAAATGAGGTGAATGCTGCCTGGGAGCGCCTTCGTGGTTTGGCTCTC


	'humnal02'  CAGAGGCAGGGGAAGCTCTTTGGG------------------------
	'chikal02'  CAGAGGCAAGGAAAACTCTTTGGG------------------------
	'flyal02'   GTGCGCCAAGAGAAGCTATTCGGT------------------------
	'humeal02'  CAGAGACAGAAAGCTCTGTCCAAT------------------------

;
END;

BEGIN TREES;
	TREE tree = ((1,2),3,4);
END;
\ No newline at end of file
diff --git a/Examples/SimpleConstraints/data/molclock.seq b/Examples/SimpleConstraints/data/molclock.seq
new file mode 100644
index 0000000..efbb6a5
--- /dev/null
+++ b/Examples/SimpleConstraints/data/molclock.seq
@@ -0,0 +1 @@
+#TAAJ153
atgggggagactgctggagggcgcgccctgagccgcatccacagcgtgagggagcgcatc
ggtgattccctctctgcgcacaccaatgagctcgtcgccgtcttctcaaggcttgttaac
caaggaaaggggatgctgcagccccatcagatcactgctgagtacaat---gccgcgatc
cctgaggccgagcgcgagaagctcaaggacaccgcctttgaggatctcctaaggggcgca
caggaggcaattgtcatccctccatgggttgctctcgccatccggccaaggcccggcgtc
tgggagtatgtgagggtcaatgtgagcgaacttggtgttgaagaattgaacgtcctgaat
tatttgcagttcaaggaacaactggcgaatggaagcatcgataacaactttgtgcttgag
ctggactttgagccattcaacgcctccttcccgcgcccatcgctgtcgaagtccattggc
aacggtgtgcagttcctgaacaggcacttgtcatcgaagctgttccatgacaaggagagc
atgtacccattgctcaacttccttcgcgcgcacaactacaaggggatgaccatgatgttg
aacgacaggattcgcagtctcggtaccctccaaggtgcactcaggaaggcagagacacat
ctgtcaggccttccagctgacaccccttactcagagttccaccaccggttccaggaactt
ggtttggagaaaggttggggcgactgtgctcagcgtgcgagcgagactatccaccttctc
ttggaccttctcgaggcccctgatccatcctccttggagaagttcctcgggacaatccca
atggtgttcaatgtcgttatcctctctcctcatggttactttgctcaggccaatgtcttg
gggtaccctgatactggtggacaggttgtttacattttggaccaagtccgtgctatggag
aatgagatgctgttgagaatcaagcagcaaggtcttgacattacaccaaagattctaata
gtcaccaggttgctccctgatgcacatggcaccacctgtggccagcgccttgagaaggtc
cttggcaccgagcacacccacatcctgcgtgtgccattcaaaacagaagatggtattgtt
cgcaaatggatctcccgctttgaagtctggccttacctggaagcttacactgatgatgtg
gcacacgagatcgccggagagctgcaggccactcctgacctgatcattggaaactacagt
gatggcaacctagtcgcgtgttcgttggctcacaagttgggagttactcattgt---att
gcgcatgcactcgagaaaaccaagtatcccaactccgacctttactggaagaaatttgag
gatcactaccacttctcctgccagttcacagctgacctgattgcaatgaatcatgctgac
ttcatcatcaccagtactttccaagagattgccggaaacaaggacaccgtagggcagtac
gagtcgcacatggcattcacaatgccaagcctctatcgtgttgtccatggtattgatgtc
ttcgaccccaagttcaacatcgtctcccctggtgctgacatgtccatctacttcccatac
actgaacagcagaagaggcttacctccctccatactgagattgaggagctactcttcagt
gatgttgagaatgctgagcacaaatttgtgctgaaggacaagaagaagccgatcatcttc
tcgatggctaggctggaccgtgtcaagaatatgactggcctagtagaaatgtatgggcgg
aatcctcgcctacaggagctggtaaacctagtggttgtttgtggtgaccatggaaaggtg
tccaaggacaaggaggagcaggcagagttcaaaaagatgtttgatcttatcgaacagtac
aacctgattggtcacatccgctggatctctgctcagatgaaccgtgtccgcaatggtgag
ctctaccgctacatctgcgacatgaagggagcctttgtgcagcctgctttctatgaggct
ttcggtcttaccgtgatagaggccatgacatgtggccttccaacattcgccactgcatat
ggtggtccagctgagatcattgtgcacggtgtgtccggctaccacatcgatccttaccag
aatgacaaggcctccgcactgcttgtggacttctttgggaagtgccaggaagacccgagc
cactggaacaagatctcgcagggaggactccagcgcatcgaggagaagtacacctggaag
ctgtactctgagaggctgatgaccctttctggtgtctatcgtttctggaagtatgtctcc
aacctcgacaggcgcgagactcgtcgctaccttgaaatgctctacgccctcaagtaccgc
aaaatggctgcaactgtcccattggctgttgag
#TASUCSYN1
atg------gctgcc---aagctgacc------cgcctccacagcctcagggagcgcctt
ggtgccaccttctcctcccatcccaatgagctcattgcactcttttccaggtatgttcac
cagggcaagggcatgcttcagcgccaccagctgcttgctgagtttgac------gccctg
ttcgaatccgacaaggagaag------tatgcaccgtttgaggacatcctccgtgctgcg
caggaagcaattgtgctgcccccatgggttgcacttgccatcaggcccaggcctggtgtc
tgggactacattcgggtgaatgttagtgagctcgctgtggaagaactgactgtttctgaa
tacttagcattcaaggagcagcttgtcgacgaacatgccagcagcaagtttgtgctagag
cttgattttgagcctttcaatgcctccttcccgcgcccttccatgtccaactccatcgga
aaacgggtgcagttccttaaccgtcacctgtcttcccagttgttccaggacaaggagagc
ctctacccactgctcaacttcctgaaagcccattactacaagggcacgacaatgatgttg
aacgacagaattcagagccttcgcggtctccagtcagcccttaggaaggcagaagagtat
ctagtcagcattcctgaagacactcccagctctgaattcaaccacaggttccaagagctt
ggcttggagaagggttggggtgacaccgcaaagcgtgtacacgacaccatccatttgctt
ctggaccttcttgaggcccctgatccggccagcttggagaagttccttggaaccattcca
atgatgttcaatgttgtcatcctgtctccccatggatactttgctcaatccaatgtgttg
ggataccctgataccggtggccaggttgtgtacatcttggatcaagtccgtgctttggag
aatgagatgcttctgaggattaagcagcaaggccttgatataactcccaagatcctcatt
gtaaccaggttgttgcctgatgctgttggaaccacatgtggccagcggctggagaaagtc
attggaactgagcacactgacattctccgtgttccattcagaactgataatgggatcctt
cgtaagtggatctcgcgttttgatgtctggccatacctggagacatacaccgaggatgtt
gcaaacgaactcatgagggaaatgcagaccaagcctgatttcatcattggtaacaacagt
gatggtaaccttgtggccactctgcttgcacataaattgggagttacccagtgcaccatt
gcccatgccttggagaaaaccaagtaccccaactcagacatatatttggacaaatttgac
agccagtaccacttttcatgccaattcacagctgacctgattgccatgaaccacactgat
ttcatcattaccagcacattccaggaaatcgctggaagcaaggatagcgtgggccaatat
gagtctcacattgctttcacccttcctgatctgtaccgggttgtccatgggattgatgtg
tttgatcctaagttcaacatcgtc---cctggagcagacatgactgtctacttcccatac
accgagactgacaagaggctcactgccttccactctgaaattgaggagctcctgtacagc
gatgttgagaacgatgaacacaaatttgtgttgaaggacaggaacaagccaatcatcttt
tcaatggcccgtcttgaccgtgtgaagaacatgactggcttggttgagatgtacggcaag
aatgctcatctgaagggatttggcaaacttgtgattgttgctggcgaccatggcaaggag
tccaaggatagggaggagcaggctgagttcaagaggatgtacagtctcattgaggagtac
aagctgaagggccatatccgttggatctctgctcagatgaaccgtgttcgcaatggtgag
ctgtaccgctacatctgtgacaccaagggagcatttgtgcagcctgcattctatgaagca
tttggcctgactgtcattgaggtccatgaatgtggtttgccgacaattgcgacatgccac
ggtggccctgctgaaatcattgtgaacggggtgtctggcctgcacattgatccttaccac
agcgacaaggccgcagatatccttgtcaacttctttgagaagtgcagcgaggatccaagc
tactgggacaaaatgtctgaaggaggcctgaagagaatttatgagaagtacacctggaag
ctgtactcagagaggctgatgaccctgaccggcgtgtatgggttctggaagtacgtgagc
aacctggagaggcgcgagactcgccgttacctggagatgttctacgctctgaagtaccgc
agcctggctgctgcagttccattggcagttgat
#MZESUS1
atgggggaaggtgcaggtgaccgtgtcctgagccgcctccacagcgtcagggagcgcatt
ggcgactcactctctgcccaccccaatgagcttgtcgccgtcttcaccaggctgaaaaac
cttggaaagggtatgctgcagccccaccagatcattgccgagtacaacaat---gcgatc
cctgaggctgagcgcgagaagctcaaggatggtgcttttgaggatgtcctgagggcagct
caggaggcgattgtcatccccccatgggttgcacttgccatccgccctaggcctggtgtc
tgggagtatgtgagggtcaacgtcagtgagctcgctgttgaggagctgagagttcctgag
tacctgcagttcaaggaacagcttgtggaagaaggccccaacaacaactttgttcttgag
ctggactttgagccattcaatgcctccttcccccgtccttctctgtcaaagtccattggc
aatggcgtgcagttcctcaacaggcacctgtcatcaaagctcttccatgacaaggagagc
atgtaccccttgctcaacttccttcgcgcccacaactacaaggggatgaccatgatgttg
aacgacagaatccgcagtctcagtgctctgcaaggtgcgctgaggaaggctgaggagcac
ctgtccaccctacaagctgataccccatactctgaatttcaccacaggttccaggaactt
ggtctggagaagggttggggtgattgcgctaagcgtgcacaggagactatccacctcctc
ttggacctcctggaggccccagatccgtccaccctggagaagttccttggaacgatcccc
atggtgttcaatgtcgttatcctctcccctcatggttacttcgctcaagctaatgtcttg
ggttaccctgacaccggaggccaggttgtctacatcttggatcaagtgcgcgctatggag
aacgaaatgctgctgaggatcaagcagtgtggtcttgacatcacgccgaagatccttatt
gtcaccaggttgctccctgatgcaactggcaccacctgtggccagcgccttgagaaggtc
cttggcaccgagcactgccatatccttcgcgtgccattcagaacagaaaacggaatcgtt
cgcaagtggatctcgcgatttgaagtctggccgtacctggagacttacactgatgacgtg
gcgcatgagattgctggagagcttcaggccaatcctgacctgatcatcggaaactacagt
gacggaaaccttgttgcgtgtttgctcgcccacaagatgggtgttactcactgtaccatt
gcccatgcgcttgagaaaactaagtaccctaactccgacctctactggaagaagtttgag
gatcactaccacttctcgtgccagttcaccactgacttgattgcaatgaaccatgccgac
ttcatcatcaccagtaccttccaagagatcgccggaaacaaggacaccgtcggccagtac
gagtcacacatggcgttcacaatgcctggcctgtaccgcgttgtccacggcattgatgtg
ttcgaccccaagttcaacatcgtgtctcctggcgcggacctgtccatctacttcccgtac
accgagtcgcacaagaggctgacctcccttcacccggagattgaggagctcctgtacagc
caaaccgagaacacggagcacaagttcgttctgaacgacaggaacaagccaatcatcttc
tccatggctcgtctcgaccgtgtgaagaacttgactgggctggtggagctgtacggccgg
aacaagcggctgcaggagctggtgaacctcgtggtcgtctgcggcgaccatggcaaccct
tccaaggacaaggaggagcaggccgagttcaagaagatgtttgacctcatcgagcagtac
aacctgaacgggcacatccgctggatctccgcccagatgaaccgcgtccgcaacggcgag
ctgtaccgctacatctgcgacaccaagggcgccttcgtgcagcctgctttctacgaggct
ttcgggctgacggtggttgaggccatgacctgcggcctgcccacgttcgccaccgcctac
ggcggtccggccgagatcatcgtgcacggcgtgtctggctaccacatcgacccttaccag
ggcgacaaggcgtcggccctgctcgtggacttcttcgacaagtgccaggcggagccgagc
cactggagcaagatctcccagggcgggctccagcgtatcgaggagaagtacacctggaag
ctgtactcggagaggctgatgaccctcaccggcgtgtacgggttctggaagtacgtgtcc
aacctggagaggcgcgagacccggcggtacctggagatgctgtacgcgctcaagtaccgc
accatggcgagcaccgtgcccgtggccgtggag
#HVRNASS
atgggggagactgcaggagagcgcgccctgagccgtgtccacagcgtgagggagcgcatc
gggcattccctctctgcacacaccaatgagctcgtcgccgtcttctcaaggcttgttaac
caaggaaaggggatgctgcagccccatcagatcactgctgagtacaat---gccgcgatc
cctgaggcagagcgcgagaagctgaagaacaccccctttgaggatctcctaaggggcgca
caggaggcaattgtcatccctccatgggttgctctcgccatccggccaaggcctggcgtc
tgggagtatgtgagggtcaatgtgagcgagcttggtgttgaggagttaagcgtcctgagg
tatctgcagttcaaggaacaactggcgaatggaagcaccgataacaactttgtgcttgag
ctggactttgggccattcaacgcctccttcccacgcccatcgctgtcgaagtccattggc
aacggtgtgcagtttctgaacaggcacttgtcgtcgaagctgttccatgataaggagagc
atgtacccattgcttaacttccttcgcgcgcacaactacaaggggatgaccatgatgctg
aatgacagaattcgcagtctcggtaccctccaaggtgcactcaggaaggcagagacacat
ctgtcaggccttccagctgacaccccttacaccgagttccaccaccggttccaggaactt
ggtttggagaaaggctggggcgactgtgctcagcgtgcgagcgagactatccaccttctc
ttggaccttctcgaggcccctgatccatcctccttggagaagttcctcggaacaatccca
atggtgctcaatgttgttatcctctctcctcatggttacttcgctcaggccaatgtcttg
gggtaccctgatactggcggacaggttgtctacattttggaccaagtccgtgctatggaa
aatgagatgctgttgagaatcaagcagcaaggtctcgacattactccaaagattctaata
gtcaccaggatgctccctgatgcacatggcaccacctgtggccagcgccttgagaaggtc
cttggcaccgagcacacccacatcctgcgtgtgccattcaaaacagaagatggtattgtt
cggaaatggatctcccgttttgaagtctggccttacctggaagcttacaccgatgatgtg
gcacatgagatcgccggagagctgcaggccaaccctgacctgatcattggaaactacagt
gacggtaaccttgtcgcgtgtttgttggcacacaagttgggagttactcattgtaccatt
gctcatgcgctcgagaaaaccaagtatcccaattccgacctttactggaagaaatttgag
gatcactaccacttctcatgccagttcaccgccgacctgattgcaatgaaccatgctgac
ttcatcatcaccagtaccttccaagagattgccggaaacaaggacaccgtagggcagtac
gagtcgcacatggcattcacaatgccaggcctctatcgtgttgtccatggtatcgatgtc
ttcgaccccaagttcaacatcgtgtctcctggtgctgacatgtccatctacttcccatac
actgaacagcagaagaggcttacctccctccatactgagattgaggagctactattcagt
gatgttgagaatgctgagcacaaatttgtgttgaaggacaagaagaagccgatcatcttc
tcgatggctaggctggaccgtgtcaagaatatgactggcctggtagaaatgtatgggcgg
aatcctcgcctacaggagctggtaaacctggtggttgtctgtggtgaccatggaaaggtg
tccaaggacaaggaggagcaagtagagttcaagaagatgtttgatcttatagaaaagtac
aacctgagtggtcacatccgctggatctctgctcagatgaaccgcgtccgcaacggtgag
ctctaccgctacatctgtgacatgaagggagcctttgtgcagcctgctttctatgaggct
ttcggtcttacagtgatagaggccatgacatgtggtcttccaacattcgccactgcatac
ggtggtccagctgagatcattgtgaatggtgtgtccggctaccacatcgatccttatcag
aatgacaaggcctccgcactgcttgtgggcttctttgggaagtgccaagaagacccgagc
cactggaacaagatctcacagggaggactccagcgcattgaggagaagtacacctggaag
ctgtactctgagaggctgatgaccctttctggtgtctatggtttctggaagtacgtctcc
aacctcgacaggcgcgagactcgtcgctaccttgaaatgctctatgccctcaagtaccgc
aaaatggctgcaactgtcccattggctgttgag
#ORRSS2
atgggggaagctgccggcgaccgcgtcctgagccgcctccacagcgtcagggagcgcatc
ggcgactccctctccgcccaccccaatgagctcgtcgccgtcttcaccaggctggttaac
ctcggaaagggaatgcttcaggcccaccagatcattgctgagtacaacaac---gcaatc
tctgaggctgatcgtgagaagctgaaggacggtgcttttgaggatgtcctgaggagtgca
caggaggggattgttatctccccatgggttgcccttgccatccgcccgaggcccggtgtc
tgggagtatgtgagggtcaatgtgagcgagctcgctgttgagttgctgacagtccccgag
tacttgcagttcaaggaacagcttgtggaagaaggcaccaacaacaactttgtgcttgag
ctggatttcgagccattcaatgcctccttccctcgtccttctctgtcgaagtccattggc
aatggtgtgcagttcctcaacaggcatctgtcatcgaagctcttccatgacaaggagagc
atgtacccactgctcaacttccttcgtgcacacaactacaagggcatgaccatgatgttg
aatgacagaatccgcagtctcagtgctctccaaggtgctctgaggaaggctgaggagcat
ctttctggtctttcagcagacaccccttactcagaattccaccacaggttccaggaactt
ggtctggagaagggttggggtgactgtgccaagcgttcccaggagaccattcacctcctt
ttggaccttcttgaggcccctgatccgtccaccctcgagaagttccttggaacaatccca
atggtgttcaatgttgtcattatgtccccacacggttacttcgcgcaagccaatgtcttg
ggttaccctgacactggagggcaggttgtctacattttggaccaagtccgtgctatggag
aatgagatgcttctgaggatcaagcagcaaggtctcaacattacaccacgcatccttatt
gtcaccaggttgctccctgatgcaactggcaccacctgcggtcagcgtcttgagaaggtc
cttggcaccgagcacacccacatcctacgtgtgcctttcagaactgaaaatggaattgtt
cgcaagtggatctcacgttttgaagtctggccgtacctggaaacattcactgatgatgtc
gcgcacgaaattgctggagagctccaggccaatcctgacttgatcatcggaaactacagt
gacggaaaccttgttgcatgcttgcttgcacacaagatgggtgttacccattgtaccatt
gcccatgcgcttgagaaaaccaagtaccccaactctgacctctactggaagaagtttgag
gatcactaccacttctcatgccagttcacaactgacttgattgcgatgaaccacgctgac
ttcatcatcaccagtaccttccaagagattgccggaaacaaggacactgttggtcagtat
gagtctcacatggcattcaccatgcctggtctgtaccgtgttgtccacggtattgatgtt
tttgacccgaagtttaacattgtctcgcctggtgcggacatgtccatctacttcccttac
tctgagtctcgtaagaggctcacctccctccacccagagattgaggagttgctctacagc
gaagttgacaacaacgagcacaagtttatgctgaaggacaggaacaagccaatcatcttc
tccatggctcgtcttgaccgtgtcaagaacttgactggtctggttgagctgtatggtcgc
aaccctcgcctgcaagagctggttaaccttgtggttgtctgtggtgaccatggcaaccca
tctaaggacaaggaggagcaggctgagttcaagaagatgtttgaccttattgagcaatac
aacttgaatggccacatccgctggatctccgcgcagatgaaccgtgtccgcaacggtgag
ctctaccgttacatctgcgacaccaagggtgcttttgtgcagcccgctttctacgaggca
ttcggtctcactgttgttgagtccatgacctgtggtctcccgacattcgcaaccgcctat
ggtggtccagctgagatcatcgtgaacggagtgtctggcttccacattgacccataccag
ggtgacaaggcctcggcgctgctcgttgagttctttgagaagtgccaggaagaccccagc
cactggaccaagatctcgcagggcggtcttcagcgtatcgaggagaaatacacctggaag
ctctactctgagaggctgatgaccctgaccggcgtctacggattctggaagtacgtctcg
aacctggagaggcgtgaaacccgccgctaccttgagatgctgtatgccctcaagtaccgc
accatggctagcaccgtcccgttggccgtcgag
#RICRSS3
atgggggaaactactggagaacgtgccctgaaccgtctccacagcatgagggagcgcatc
ggcgattccctctccgcgcacaccaatgagcttgtggctgtcttctcaaggcttgtgaac
caaggaaagggaatgctacagccccaccagatcattgctgagtacaac---gccgcaatc
cctgagggcgagcgtgagaagctgaaggactctgccttagaggatgtcctgaggggagca
caggaggcgattgtcatccctccatggattgcccttgccattcgcccaaggcctggtgtc
tgggagtatctgaggatcaatgtaagccagcttggtgttgaggagctgagtgtccctgaa
tacttgcagttcaaggagcagcttgtggatggaagcacccagaacaactttgtgcttgag
ctggactttgagccattcaatgcctccttccctcgcccatcgttgtcgaagtctattggc
aatggggtgcagttcttgaacaggcacctgtcgtcaaagctgttccatgacaaagagagc
atgtaccccctgctcaactttcttcgtgcgcacaactacaaagggatgaccatgatgttg
aacgacaggattcgcagtctcgatgctctccaaggtgcattgaggaaggcagaaaaacat
cttgcaggcattacagctgacaccccatattcagagttccatcacaggttccaagagctt
ggtttggagaagggttggggtgactgcgctcagcgagtgcgtgagactattcaccttctc
ttggaccttcttgaggcccctgagccgtccgccttggagaagttccttggaacaatccca
atggtgttcaatgttgttatcctctccccgcatggttactttgcacaggctaatgtcttg
gggtaccctgataccggtgggcaggttgtctacattttggatcaagtccgtgctatggag
aatgagatgctgctgaggatcaagcaacaaggtctaaacatcacaccaaggattctcatt
gtgaccaggttgctacctgatgcgcatggcaccacatgtggccagcgccttgagaaggtc
ctaggcactgagcacactcatatcctgcgtgtgccattccgaacagaaaatgggactgtt
cgcaaatggatctcgcgttttgaagtctggccttacctggaaacttacaccgatgatgtg
gcacacgagatttctggagagctgcaggccacccctgacctgatcattgggaactacagt
gatggcaaccttgttcgatgtttgctggcacacaagttgggtgtcactcattgtacaatc
gcccatgcacttgagaaaaccaagtaccccaactccgacctttactggaagaagtttgag
gatcactatcacttctcctgccagttcacagctgacctgattgcaatgaaccatgctgac
ttcatcatcacaagtaccttccaggagattgctggaaacaaggaaactgtggggcagtat
gagtctcacatggcattcacaatgcctggcctttatcgtgttgtccatggtatcgatgtc
tttgaccccaagttcaacatcgtctctcctggtgctgacatgtccatctacttcccattc
accgaatcacagaagaggctcacctctctccatttagagatagaggagctactcttcagt
gatgttgaaaacactgagcacaagtttgttctgaaggacaagaagaagccaatcatcttc
tcgatggctaggctagaccatgtcaagaatttgactggtctggttgagttgtatggtcgg
aaccctcgcctgcaagagctagtaaaccttgtggttgtctgtggtgaccatggcaaggaa
tccaaggacaaagaagagcaggctgagttcaagaagatgtttaatctgatcgagcagtac
aatttgaatggccacatccgctggatctccgctcagatgaaccgtgtccgcaatggtgag
ctctaccgctacatctgcgacatgaggggagcctttgtgcagcccgctctctatgaggcc
tttgggctaactgtgattgaggccatgacctgtggtcttccaacatttgcaactgcctat
ggtggtccagccgagatcatcgtgcacggcgtgtctggctaccacattgatccttaccag
aacgacaaggcctcggcgctgctcgtggagttctttgagaagtgtcaggaagacccaaac
cactggatcaagatctcgcagggtggacttcagcgcatcgaggagaagtacacatggaag
ctctactctgagaggctgatgactctctccggtgtctacggtttctggaagtatgtcacc
aacctcgacaggcgtgagacacgccgctacctggagatgctgtacgccctcaagtaccgc
aagatggctaccaccgttccattggccattgag
#ZMSUCS1
atg------gctgcc---aagctgact------cgccttcacagtcttcgcgaacgcctt
ggtgccaccttctcctcccatcccaatgaactgatagcactcttttccaggtatgttcac
cagggcaagggaatgcttcagcgccatcagctgcttgcggagtttgat------gccctg
tttgatagtgacaaggagaag------tatgcaccatttgaagacattcttcgtgctgct
caggaagcaattgtgctccccccatgggttgcacttgctatcaggccaaggcctggtgtc
tgggattacattcgggtgaatgtaagtgagctggctgtggaggagctgagtgtttctgag
tacttggcattcaaggaacagctggtggatggacaatccaacagcaactttgtgcttgag
cttgattttgagcccttcaatgcctcctttcctcgtccttccatgtcgaagtccatcgga
aatggagtgcaattccttaaccgacacctgtcgtccaagttgttccaggacaaggagagt
ttgtaccccttgctgaacttcctcaaggctcataactacaagggcacgacgatgatgttg
aatgacagaatccaaagccttcgtggtctccaatcatccctgagaaaggcagaggagtat
ctactgagtgttcctcaagacactccctactcggagttcaaccataggttccaagagctt
ggcttggagaagggttggggtgacactgcgaagcgtgttctcgacacactccacttgctt
ctcgaccttcttgaggcccctgatcctgccaacttggagaagttccttggaactatacca
atgatgttcaacgttgttatcctgtctcctcatggctacttcgcccagtccaatgtgctt
ggataccctgacactggcggtcaggttgtgtacattctggatcaagtccgtgctttggag
aatgagatgcttctgaggattaagcagcaaggccttgatatcactccgaagatcctcatt
gttaccaggctgttgcctgatgctgctgggactacgtgcggtcagcggctggagaaggtc
attggtactgagcacacagacatcattcgcgttcccttcagaaatgagaatggcatcctc
cgcaagtggatctctcgttttgatgtctggccatacctggagacatacactgaggatgtt
tccagtgaaataatgaaagaaatgcaggccaagcctgaccttatcattggcaactacagc
gatggcaacctagtcgccactctgctcgcgcacaagttgggagtcactcagtgtaccatc
gctcatgccttggagaaaaccaaataccccaactcggacatctacttggacaaattcgac
agccagtaccacttctcttgccagttcacagctgaccttattgccatgaaccacaccgat
ttcatcatcaccagcacattccaagaaatcgcgggaagcaaggacaccgtggggcagtac
gagtcccatatcgcgttcactcttcctgggctctaccgtgtcgtccatggcatcgatgtt
ttcgatcccaagttcaacattgtctctcctggagcagacatgagtgtttactacccttat
acggaaaccgacaagagactcactgccttccatcctgaaatcgaggagctcatctacagc
gacgtcgagaactccgagcacaagttcgtgctgaaggacaagaagaagccgatcatcttc
tcgatggcgcgtctcgaccgcgtgaagaacatgacaggcctggtcgagatgtacggcaag
aacgcgcgcctgagggagctggcgaacctcgtgatcgttgccggtgaccacggcaaggag
tccaaggacagggaggagcaggcggagttcaagaagatgtacagcctcatcgacgagtac
aagttgaagggccatatccggtggatctcggcgcagatgaaccgtgtccgcaacggggag
ctgtaccgctacatttgcgataccaagggcgcattcgtgcagcctgcgttctacgaagcg
ttcggcctgactgtgatcgagtccatgacgtgcggtctgccaacgatcgcgacctgccat
ggcggccctgctgagatcatcgtggacggggtatctggcctgcacattgacccttaccac
agcgacaaggccgcggatatcctggtcaacttctttgacaaatgcaaggcagatccgagc
tactgggacgagatctcacagggcggcctgcagagaatttatgagaagtacacctggaag
ctctactccgagaggctgatgaccctgaccggcgtgtacgggttctggaagtacgtgagc
aacctggagaggcgcgagacccgccgctacatcgagatgttctacgccctgaagtaccgt
agcctggcaagccaggttccgctgtccttcgat
#HVSSYNMR
atg------gctgcc---aagctgact------cgcctccacagcctcagggagcgcctt
ggtgccaccttctcctcccatcccaatgagctcattgctctcttttccaggtatgttcac
cagggcaaaggcatgcttcagcgccaccagctgctcgctgagtttgac------gccctg
ttcgaatccgacaaggagaag------tatgctccttttgaagacatcctccgtgctgcc
caggaagcaattgtgctgcccccatgggttgcacttgccatcaggcccaggactggtgtc
tgggactacattcgggtgaatgttagcgagttggctgtggaagagctgactgtttctgag
tacttggcattcaaggagcagcttgttgatgagcatgccagcaggaaatttgtgcttgag
cttgattttgagcctttcaatgcctcgttcccacgcccttccatgtccaagtcctacgga
aaaggggtgcagttccttaaccgtcacctgtcttccaagttgttccaggacaaggagagc
ctctacccactgctcaacttcctgaaagcccataactacaagggcacgacaatgatattg
aacgacagaattcagagccttcgtggtctccagtcagcccttaggaaggcagaagagtat
ctagttagcatccctgaagacactcccagctctgaattcaaccacaggttccaagagctt
ggtttggagaagggttggggtgacaccgcaaagcgtgtacacgacaccatccatttgctt
ctggaccttcttgaggcccctgaccctgccagcttggagaagttccttggaactattccg
atgatgttcaatgttgtcatcctgtctccccatggatactttgctcaatccaatgtgttg
ggataccctgataccggtggccaggttgtgtacatcttggatcaagtccgtgctttggag
aatgagatgcttctgaggattaagcagcaaggccttgacataactcctaagatcctcatt
gtaaccaggttgttgcctgatgctgttggaactacatgtggccagcggctggagaaggtc
attggaactgagcacactgacattctccgtgttccctttagaaccgagaatgggatc---
cgtaagtggatctcgcgtttcgatgtctggccatacctggagacatacaccgaggatgtt
gcaaacgaactcatgagggaaatgcagaccaagcctgatttgatcattggcaactacagt
gatggtaaccttgtggccactctgcttgcccataaattgggtgttacccagtgcaccatt
gcccatgccttggagaaaaccaagtaccccaactcagacatatacttggacaaattcgac
agccagtatcacttttcatgccagttcacagctgacctgattgccatgaaccacactgat
ttcatcattaccagcacattccaggaaattgctggaagcaaggatagcgtgggtcaatat
gagtctcacattgctttcaccctccctgatctgtaccgggttgtccatgggattgacgtg
tttgatcctaagttcaacattgtctctcctggagcagacatgactgtctacttcccatat
accgagactgacaagaggctcaccgccttccactctgaaattgaggagctcctgtacagc
gatgttgagaacgatgaacacaaatttgtgttgaaggacaggaacaagccaatcatcttt
tcaatggctcgtcttgaccgcgtgaagaacatgactggcttggttgagatgtacggaaag
aacgcacatctgaaggacttggcaaaccttgtgattgttgctggtgaccatggcaaggag
tccaaggatagggaggagcaggctgagttcaagaggatgtacagcctcattgaggagtac
aagctgaaaggccatatccgttggatctcagctcagatgaaccgtgttcgcaatggcgag
ctgtaccgctacatctgcgacaccaagggagcatttgtgcagcctgcattctatgaagct
tttggcctgactgtcattgaggccatgacatgtggtctgccgacaattgcgacatgccac
ggtggccctgctgagatcatcgtggatggagtgtctggtctgcacattgatccttaccac
agcgacaaggccgcagatatcttggtcaacttctttgagaagagcacggcggatccaagc
tactgggacaaaatctcccagggaggcctgaagagaatttatgagaagtacacctggaag
ctctactcagagaggctgatgaccctgaccggtgtgtatgggttctggaagtacgtgagc
aacctggagaggcgcgagactcgccgttacctggagatgttctacgctctcaagtaccgt
agcctggctgctgcagttccattggcggtcgac
#OSRSS1A
atg------gctgcc---aagctagct------cgcctccacagtctccgcgaacgcctc
ggtgccaccttctcgtctcatcccaatgagttgattgcactcttctctaggtatgttaac
cagggaaagggaatgctccagcgtcaccagctgcttgcggagttcgat------gccttg
atcgaagctgacaaagagaaa------tatgctccctttgaagacattctccgggctgct
caggaagccattgtgctgccgccctgggttgcactggccatcaggccaaggcctggtgtc
tgggactacattcgggtgaatgtaagtgagttggcagtggaagagctgagtgtttctgag
tacttggcattcaaggaacagcttgttgatggacacaccaacagcaactttgttcttgag
cttgattttgagcccttcaatgcctccttcccgcgcccgtccatgtccaagtccatcgga
aatggggtgcagttccttaaccgtcacctgtcgtccaagttgttccaggacaaggagagc
ctctaccccttgctgaacttcctgaaagcccataaccacaagggcacgacaatgatgctg
aatgacagaattcagagccttcgtgggctccaatcatcccttagaaaggcagaagaatat
ctgatgggcattcctcaagacacgccctactcggagttcaaccacaggttccaagagctc
ggtttggagaagggttggggtgactgtgcaaagcgtgtgcttgacaccatccacttgctt
cttgaccttcttgaggcccctgatccggccaacttggagaagttccttggaactattcca
atgatgttcaatgttgttatcctgtctccgcatggatactttgcccaatccaatgtgttg
ggataccctgatactggtggtcaggttgtgtacattttggaccaagtccgcgctttggag
aatgagatgcttttgaggatcaagcagcaaggccttgatatcacacctaagatcctcatt
gtaaccaggctgttgcctgatgctgttggtactacatgcggccagcgtgtggagaaggtt
attggaactgagcacactgacattcttcgtgttccattcaggagtgagaatggtatcctc
cgcaagtggatctcccgttttgatgtctggccattcctggaaacatacactgaggatgtt
gcaaacgaaattatgagggaaatgcaagccaaacctgatctcatcattggcaattacagt
gatggaaaccttgttgccactctgctggctcacaaattaggagttacccagtgtaccatt
gctcatgccttggagaaaaccaaataccccaactcagacatatacttggacaagtttgac
agccagtaccacttctcatgccaattcactgctgatcttatcgccatgaatcacactgat
ttcatcatcaccagtacattccaagaaattgctggaagcaaggacactgtggggcagtat
gaatcacacattgcattcacccttcctgggctttaccgagttgtgcatggcatagatgtt
tttgatcccaagttcaacattgtctctcctggagctgacatgagtgtctacttcccgtac
accgaggctgacaagaggctcactgctttccaccctgaaattgaggagcttctctacagt
gaagtcgagaacgatgaacacaagtttgtattgaaggacaagaacaagccaatcatcttc
tccatggctcgtcttgaccgagtgaagaacatgacaggtctggttgagatgtatggtaag
aatgcacatctcagggatttggcaaaccttgtgattgtttgtggtgaccacggcaatcag
tccaaggacagggaggagcaggctgagttcaagaagatgtacggtctcattgaccagtac
aagttgaaggggcatatccgctggatctcagctcagatgaaccgtgttcgtaacggggag
ttgtaccgatacatttgtgacaccaagggagtctttgtccagcctgcattctatgaagcg
tttggtctgactgtcatcgaagccatgacatgtggtttgccaacaatcgcaacatgccat
ggtggccctgctgagattattgttgatggggtgtctggtctgcacattgatccttaccac
agtgacaaggctgctgatatcttggtcaacttctttgagaagtgcaagcaggattcaacc
tactgggacaatatttcacagggaggtctgcagaggatttacgagaagtacacctggaag
ctgtactctgagaggctgatgaccttgactggtgtatacggattctggaagtacgtaagc
aaccttgagaggcgcgagactcgccgttacattgagatgttctatgctctgaaataccgc
agcctggccagcgccgtcccattggctgtcgat
\ No newline at end of file
diff --git a/Examples/Simulation/PBootstrapHetRates.bf b/Examples/Simulation/PBootstrapHetRates.bf
new file mode 100644
index 0000000..53d012e
--- /dev/null
+++ b/Examples/Simulation/PBootstrapHetRates.bf
@@ -0,0 +1 @@
+/* This is an example HY-PHY Batch File.

   It reads a 13 taxa dataset "data/hiv.nuc", performs
   an HKY85 with gamma rate heterogeneity ML analysis on the data using the tree from the file.
   Having finished that, the code simulates a data set with rate heterogeneity and
   demonstrates how to access simulated rate distribution at sites.

   Sergei L. Kosakovsky Pond and Spencer V. Muse 

   May 2002. 

*/



/* 1. Read in the data and store the result in a DataSet variable.*/

DataSet 		nucleotideSequences = ReadDataFile ("data/hiv.nuc");

   

/* 2. Filter the data, specifying that all of the data is to be used
	  and that it is to be treated as nucleotides.*/

DataSetFilter	filteredData = CreateFilter (nucleotideSequences,1);



/* 3. Collect observed nucleotide frequencies from the filtered data. observedFreqs will
	  store the vector of frequencies. */

HarvestFrequencies (observedFreqs, filteredData, 1, 1, 1);



/* 4. Define the HKY+Gamma substitution matrix. '*' is defined to be -(sum of off-diag row elements).
*/


global alpha = .5;
alpha:>0.01;alpha:<100;
category c = (4, EQUAL, MEAN, 
				GammaDist(_x_,alpha,alpha), 
				CGammaDist(_x_,alpha,alpha), 
				0 , 
		  	    1e25,
		  	    CGammaDist(_x_,alpha+1,alpha)
		  	 );
		  	 
global		kappa = 1; /* transversion/transition ratio */

HKY85RateMatrix = 

		{{*,c*t*kappa,c*t,c*t*kappa}

		 {c*t*kappa,*,c*t*kappa,c*t}

		 {c*t,c*t*kappa,*,c*t*kappa}

		 {c*t*kappa,c*t,c*t*kappa,*}};

		 

/*5.  Define the HKY85 model, by combining the substitution matrix with the vector of observed (equilibrium)

	  frequencies. */

Model HKY85	 = (HKY85RateMatrix, observedFreqs);



/*6.  Now we can define the tree variable, using the tree string read from the data file,

	  and, by default, assigning the last defined model (HKY85) to all tree branches. */

	  

Tree	givenTree = DATAFILE_TREE;



/*7.  Since all the likelihood function ingredients (data, tree, equilibrium frequencies)

	  have been defined we are ready to construct the likelihood function. */

	  

LikelihoodFunction  theLnLik = (filteredData, givenTree);



/*8.  Maximize the likelihood function, storing parameter values in the matrix paramValues */



Optimize (paramValues, theLnLik);



/*9.  Print the tree with optimal branch lengths to the console. */



fprintf  (stdout, "\n----ORIGINAL DATA----\n",theLnLik);

		 

/*10. Now we set up the simulation loop.

	  First, we create another copy of the tree which will

	  serve as the tree for simulated data sets */

	  

Tree	simulatedTree = DATAFILE_TREE;





/*12. By default, the random generator is reset every time the program is run.

	  The value of the seed is stored in RANDOM_SEED.

	  If you wish to use a particular seed, say the repeat a simulation,

	  call the function SetParameter (RANDOM_SEED,value,0).

*/


/*SetParameter (RANDOM_SEED,12345,0);*/

fprintf (stdout, "\nUsing the seed:\n", Format(RANDOM_SEED,10,0));


/*12. Simulating the dataset and storing category (c) variable
	  values in the row vector ratesAtSites, and the name of the category
	  variable in the column vector namesOfRateVars. This is useful
	  if several category variables are present so that we know which 
	  row of ratesAtSites the values of a particular variable go.*/


DataSet		simulatedData = SimulateDataSet (theLnLik,"",ratesAtSites,namesOfRateVars);

/*13. We are just going to print out the rates and report their mean
which should be close to 1 and the variance, which should be close to 1/alpha */

fprintf (stdout, "\nCategory variable name: ", namesOfRateVars[0],
                 "\n      Site       Rate\n");
                 
sum  = 0;
sum2 = 0;

for (k=0; k<Columns (ratesAtSites); k=k+1)
{
	term = ratesAtSites[k];
	fprintf (stdout, Format (k,10,0), " ", Format (term,10,5),"\n");
	sum = sum+term;
	sum2 = sum2+term*term;
}	

fprintf (stdout, "\nMean = ", sum/Columns (ratesAtSites),
				 "\nVar  = ",(sum2-sum^2/Columns (ratesAtSites))/(Columns(ratesAtSites)-1)," (1/alpha) = ", 1/alpha, "\n");


   

\ No newline at end of file
diff --git a/Examples/Simulation/ParametricBootstrap.bf b/Examples/Simulation/ParametricBootstrap.bf
new file mode 100644
index 0000000..c238c50
--- /dev/null
+++ b/Examples/Simulation/ParametricBootstrap.bf
@@ -0,0 +1 @@
+/* This is an example HY-PHY Batch File.



   It reads a 4 taxa dataset "data/hiv.nuc", performs

   an HKY85 ML analysis on the data using the tree from the file.

   Having finished that, the code simulates 100 replicates of the data

   using MLE of the parameters, conducts an HKY ML analysis on each of the 

   replicates and then tabulates the distribution of resulting ln-likelihoods.

   

   

   Sergei L. Kosakovsky Pond and Spencer V. Muse 

   December 1999. 

*/



/* 1. Read in the data and store the result in a DataSet variable.*/



DataSet 		nucleotideSequences = ReadDataFile ("data/hiv.nuc");

   

/* 2. Filter the data, specifying that all of the data is to be used

	  and that it is to be treated as nucleotides.*/

	  

DataSetFilter	filteredData = CreateFilter (nucleotideSequences,1);



/* 3. Collect observed nucleotide frequencies from the filtered data. observedFreqs will

	  store the vector of frequencies. */



HarvestFrequencies (observedFreqs, filteredData, 1, 1, 1);



/* 4. Define the KHY substitution matrix. '*' is defined to be -(sum of off-diag row elements) */



HKY85RateMatrix = 

		{{*,trvs,trst,trvs}

		 {trvs,*,trvs,trst}

		 {trst,trvs,*,trvs}

		 {trvs,trst,trvs,*}};

		 

/*5.  Define the HKY85 model, by combining the substitution matrix with the vector of observed (equilibrium)

	  frequencies. */

	  

Model HKY85	 = (HKY85RateMatrix, observedFreqs);



/*6.  Now we can define the tree variable, using the tree string read from the data file,

	  and, by default, assigning the last defined model (HKY85) to all tree branches. */

	  

Tree	givenTree = DATAFILE_TREE;



/*7.  Since all the likelihood function ingredients (data, tree, equilibrium frequencies)

	  have been defined we are ready to construct the likelihood function. */

	  

LikelihoodFunction  theLnLik = (filteredData, givenTree);



/*8.  Maximize the likelihood function, storing parameter values in the matrix paramValues */



Optimize (paramValues, theLnLik);



/*9.  Print the tree with optimal branch lengths to the console. */



fprintf  (stdout, "\n----ORIGINAL DATA----\n",theLnLik,"\n\n----SIMULATIONS----\n\n");

		 

/*10. Now we set up the simulation loop.

	  First, we create another copy of the tree which will

	  serve as the tree for simulated data sets */

	  

Tree	simulatedTree = DATAFILE_TREE;





/*12. By default, the random generator is reset every time the program is run.

	  The value of the seed is stored in RANDOM_SEED.

	  If you wish to use a particular seed, say the repeat a simulation,

	  set ASSIGNED_SEED to the value that you want to use.

*/


fprintf (stdout, "\nUsing the seed:\n", Format(RANDOM_SEED,10,0));


/*12. This is a formatting stepm which sets print width for all numbers to 10

	  and prints the table header */



PRINT_DIGITS = 10;



fprintf (stdout, "\n|----------|----------|\n| Simul. # |  Ln lik  |\n|----------|----------|");



for (simCounter = 1; simCounter<=10; simCounter = simCounter+1)

{

	/*13. Simulate a data set of the same size as the original set using

		  the MLE of all the parameters */

	DataSet		simulatedData = SimulateDataSet (theLnLik);

	/*14. Repeat the same steps as for the original data to obtain simulated 

		  ln-likelihood */

		  

	DataSetFilter	filteredSimData = CreateFilter (simulatedData,1);



	/*15. Collect observed nucleotide frequencies from the filtered data. observedFreqs will

		  store the vector of frequencies. */



	HarvestFrequencies (simFreqs, filteredSimData, 1, 1, 1);

	LikelihoodFunction simLik = (filteredSimData, simulatedTree);

	Optimize (simParamValues, simLik);

	/* print out the log-likelihood of the simulation */

	fprintf (stdout, "\n|", simCounter,"|", simParamValues[1][0],"|");



}



fprintf (stdout, "\n|----------|----------|");



   

\ No newline at end of file
diff --git a/Examples/Simulation/RelativeRatePBS.bf b/Examples/Simulation/RelativeRatePBS.bf
new file mode 100644
index 0000000..29b6107
--- /dev/null
+++ b/Examples/Simulation/RelativeRatePBS.bf
@@ -0,0 +1 @@
+VERBOSITY_LEVEL = -1;
/* This is an example HY-PHY Batch File.



   It reads a 3 taxa dataset "data/3.seq", performs

   an HKY85 relative rate analysis on the data.

   Having finished that, the code simulates 100 replicates of the data

   using MLE of the parameters under the null hypothesis of equal  

   rates, conducts an HKY relative rate analysis on each of the 

   replicates and then tabulates the distribution of resulting

   likelihood ratio statistic.

   

   

   Sergei L. Kosakovsky Pond and Spencer V. Muse 

   December 1999. 

*/



/* 1. Read in the data and store the result in a DataSet variable.*/



DataSet 		nucleotideSequences = ReadDataFile ("data/3.seq");

   

/* 2. Filter the data, specifying that all of the data is to be used

	  and that it is to be treated as nucleotides. */

	  

DataSetFilter	filteredData = CreateFilter (nucleotideSequences,1);



/* 3. Collect observed nucleotide frequencies from the filtered data. observedFreqs will

	  store the vector of frequencies. */



HarvestFrequencies (observedFreqs, filteredData, 1, 1, 1);



/* 4. Define the HKY substitution matrix. '*' is defined to be -(sum of off-diag row elements) */



HKY85RateMatrix  = 

		{{*,trvs,trst,trvs}

		 {trvs,*,trvs,trst}

		 {trst,trvs,*,trvs}

		 {trvs,trst,trvs,*}};

		 

/*5.  Define the HKY85 model, by combining the substitution matrix with the vector of observed (equilibrium)

	  frequencies. */

	  

Model HKY85	 = (HKY85RateMatrix, observedFreqs);



/*6.  Now we can define the simple three taxa tree. */

	  

Tree	threeTaxaTree = (a,b,og);



/*7.  Since all the likelihood function ingredients (data, tree, equilibrium frequencies) have been defined we are ready to construct the likelihood function. */

	  

LikelihoodFunction  theLnLik = (filteredData, threeTaxaTree);



/*8.  Maximize the likelihood function, storing parameter values in the matrix paramValues. We also store the resulting ln-lik. */



Optimize (paramValues, theLnLik);

unconstrainedLnLik = paramValues[1][0];



fprintf  (stdout, "\n----ORIGINAL DATA----");

		 

fprintf  (stdout, "\n 0).UNCONSTRAINED MODEL:", theLnLik);



/*10. We now constrain the rate of evolution to be equal along the branches leading to a and b and repeat the optimization. We will impose the constraint: both rates are equal.

*/

	  

threeTaxaTree.b.trst := threeTaxaTree.a.trst;

threeTaxaTree.b.trvs := threeTaxaTree.a.trvs;

Optimize (paramValues, theLnLik);

obslnlikDelta = 2 (unconstrainedLnLik-paramValues[1][0]);

/* 2df test since we constrain ts and tv rates.... */

obsPval = 1-CChi2 (obslnlikDelta, 2); 



fprintf (stdout, "\n\t 1). Both rates test. LR Statistic = ", obslnlikDelta,"\n", theLnLik,"\n  p-val (Chi-2) = ",obsPval,"\n\n");







/*11. Now we set up the simulation loop.

      First, we create another copy of the tree which will

	serve as the tree for simulated data sets. Since we will also use 	observed frequencies from the simulated data sets in our 	substitution model, we create a new Model. We will create a 	vector simFreqs to store the frequencies (the values will be 	saved in simFreqs inside the sim loop. We will count the number 	of significant LR tests using sigtests.*/

	

simFreqs = {{0.25,0.25,0.25,0.25}}; /* Just needed to create simFreqs*/

Model simHKY85	 = (HKY85RateMatrix, simFreqs);

Tree	simulatedTree = (a,b,og);

sigtests = 0;



/*12. This is a formatting stepm which sets print width for all numbers to 12 and prints the table header */



PRINT_DIGITS = 12;



fprintf (stdout, 

"\n|------------|------------|\n|  Simul. #  |LR Test Stat|\n|------------|------------|");



for (simCounter = 1; simCounter<=100; simCounter = simCounter+1)

{

/*13. Simulate a data set of the same size as the original set using the constrained MLE (the current values are still attached to theLnLik)of all the parameters */



	DataSet	simulatedData = SimulateDataSet (theLnLik);



/*14. Repeat the same steps as for the original data to obtain simulated ln-likelihood ratios*/

		  

	DataSetFilter    filteredSimData = CreateFilter(simulatedData,1);



/*15. Collect observed nucleotide frequencies from the filtered data. observedFreqs will store the vector of frequencies. */



	HarvestFrequencies (simFreqs, filteredSimData, 1, 1, 1);

	LikelihoodFunction simLik = (filteredSimData, simulatedTree);

	Optimize (simParamValues, simLik);

	unconstrainedLnLik = simParamValues[1][0];

	fprintf (stdout, "\n|", simCounter);

	/* Rate test */

	simulatedTree.b.trst := simulatedTree.a.trst;

	simulatedTree.b.trvs := simulatedTree.a.trvs;

	Optimize (paramValues, simLik);

	lnlikDelta = 2 (unconstrainedLnLik-paramValues[1][0]);

      if (lnlikDelta > obslnlikDelta) 

	{

		sigtests = sigtests + 1;

	}

	fprintf (stdout, "|", lnlikDelta,"|");

	ClearConstraints (simulatedTree);



}



fprintf (stdout, "\n|------------|------------|");

fprintf (stdout, "\n|Chi2 P-val= |",obsPval,"|");

fprintf (stdout, "\n| PBS P-val= |",sigtests/100,"|");

fprintf (stdout, "\n|------------|------------|");



   

\ No newline at end of file
diff --git a/Examples/Simulation/data/3.seq b/Examples/Simulation/data/3.seq
new file mode 100644
index 0000000..432408c
--- /dev/null
+++ b/Examples/Simulation/data/3.seq
@@ -0,0 +1 @@
+3	375
a          ATGATTCAACCTCAGACCCTTTTAAATGTAGCAGATAACAGTGGAGCTCG
           AAAATTGATGTGTATTCGAGTCATAGGAGCTGCTAGTAATCAGCGATATG
           CTCGTATTGGTGATGTTATTGTTGCTGTAATCAAAGACGCAGTGCCCCAA
           ATGCCTCTAGAAAGATCCGAAGTAATTCGAGCTGTAATTGTACGTACATG
           TAAAGAGTTCAAATGCGAAGACGGTATAATAATACGCTATGACGACAATG
           CAGCGGTTATCATTGATCAAAAAGGA---AATCCAAAAGGAACTCGCGTT
           TTTGGCGCGATCGCCGAGGAATTGAGAGAATTGAATTTTACTAAAATAGT
           TTCATTAGCTCCTGAAGTATTATAA

b          ATGATTCAACCTCAGACCCATTTAAATGTAGCGGATAACAGCGGGGCTCG
           AGAATTGATGTGTATTCGAATCATAGGAGCT---AGCAATCGTCGATATG
           CTCATATTGGTGACGTTATTGTTGCTGTGATCAAAGAAGCCGTACCAAAT
           ATGCCCCTAGAAAGATCAGAAGTAGTCAGAGCTGTAATTGTGCGGACCTG
           TAAAGAACTCAAACGTGACAACGGGATGATAATACGATATGATGACAATG
           CTGCAGTTGTTATTGATCAAGAAGGAAGGAAATCAAAAGGAACTCGAATT
           TTTGGTGCAATCGCCCGGGAATTGAGAGAATTAAATTTTACTAAAATAGT
           TTCATTAGCTCCCGAGGTATTATAA

og         ATGATTCAACCTCAAACTTATTTAAATGTTGCAGATAATAGTGGAGCTCG
           AAAACTAATGTGCATTCGAGTTATAGGAACG---AGTAATCGAAAATATG
           CAAATATTGGTGATATTATTATTGCTGTTGTTAAAGAAGCAGTGCCAAAT
           ATGCCTATTAAAAAATCCGAAATTGTAAGAGCTGTAATTGTACGTACGTG
           TAAAGAATTTAAACGAAATAATGGATCCATAATAAAATTTGATGATAATG
           CAGCAGTTGTTATTAATCAAGAAGGA---AATCCAAAAGGAACTCGAGTT
           TTTGGTCCAATTGCTAGAGAATTAAGAGAATCTAATTTTACTAAAATAGT
           TTCGTTAGCTCCAGAAGTTTTATAA


1
((a,b),og);
\ No newline at end of file
diff --git a/Examples/Simulation/data/hiv.nuc b/Examples/Simulation/data/hiv.nuc
new file mode 100644
index 0000000..8573be9
--- /dev/null
+++ b/Examples/Simulation/data/hiv.nuc
@@ -0,0 +1 @@
+#719
ATAGTAATTAGATCTGAAAACTTCTCGAACAATGCTAAAACCATAATAGTACAGCTAAAT
AAATCTGTAGAAATTAATTGTACAAGACCCAACAACAATACAAGAAGAAGTATACAT
TTCGGACCAGGGAAAGCATTTTATGCAGGAGAAATAATAGGAGATATAAGACAAGCA
TATTGTACTCTTAATGGAGCAGAATGGAATAACACTGTAAAACAGGTAGCTGCAAAATTA
AGAGAAAAATTTAATAAAACAATAATCTTTAATCAATCC
#136
GTAGTAATTAGATCTGAAAACTTCTCGAACAATGCTAAAACCATAATAGTACAGCTAAAT
AAATCTGTAGAAATTAATTGTACAAGACCCAACAACAATACAAGAAGAAGTATACAT
TTTGGACCAGGGAAAGCATTTTATGCAGGAGAAATAATAGGAGATATAAGACAAGCA
TATTGTACCCTTAATGGAACAGAATGGAATAACACTTTAAAACAGGTAGCTGAAAAATTA
AGAGAACAATTTATTAAAACAATAGTTTTTAATCAATCC
#135
GTAGTAATTAGATCTGAAAACTTCACGAACAATGCTAAAACCATAATAGTACAGCTAAAT
AAATCTGTAGAAATTAATTGTGTAAGACCCGGCAACAATACAAGAAGAAGTATACAT
ATAGGACCAGGGAGAGCATATTATACAGGAGAAGTAATAGGAGATATAAGACAAGCA
CATTGTAACCTTAGTAGAACAGACTGGAATAAAACTTTAAAACAGGTAGCTGAAAAATTA
AGAGAACAATTTAATACAACAATAGTCTTTAATCAATCC
#105r
ATAGTAATTAGATCTGAAAACTTCACGAACAATGCTAAAACCATAATAGTACAGCTAAAT
AAATCTGTAGAAATTAAGTGTGAAAGACCCAACAACAATACAAGAAAAAGTGTACAT
ATAGGACCAGGGAAAGCATATTATACAGGAGAAATAATAGGAGATATAAGACAAGCA
CATTGTAACCTTAGTGGAACAGAATGGAGGGAAACTTTAAAACAGGTAGCTGAAAAATTA
AGAGAACAATTTAATAAAACAATAGTCTTTAATCAATCC
#529
ATAGTAATTAGATCTGAAAACTTCACGAACAATGCTAAAACCATAATAGTACATCTAAAT
GAATCTGTAGAAATTATTTGTGAAAGACCCAACAACAATACAAGAAAAAGTGTACAT
ATGGGACCAGGGAGAGCATATTACACAGGAGAAATAATAGGAGATATAAGACAAGCA
CATTGTAACATTAGTAGAACAAATTGGACGGAAACTTTAAAACAGGTAGCTGAAAAATTA
AGAGAACAATTTAATAAAACAATAGTCTTTAATCAATCC
#317
GTAGTAATTAGATCTGAAAACTTCACGAACAATGCTAAGACCATAATAGTACAGCTAAAT
AAACCTGTAAAAATTAATTGTACAAGACCCAACAACAATGCAAAAATAAGAATACAT
ATAGGACCAGGGAGACCATTTTATACAGCAGGAGAAATAGGAAATATAAGACAAGCA
CATTGTAACCTTAGTAGAACAGACTGGAATAACACTTTAAAACTGGTAGCTGAAAAATTA
AGAGAACAATTTAATAAAACAATAGTCTTTAATCAATCC
#6767
GTAGTAATTAGATCTGAAAACTTCACGAACAATGCTAAGACCATAATAGTACAGCTAAAT
AACTCTGTAACAATTAAGTGTGAAAGACCCAACAACAATACAAGAAAAAGTATACCT
ATAGGACCAGGGAGAGCCTTTTATACAACAGGAGACATAGGAGATATAAGACAAGCA
CATTGTAACCTTAGTAGAAAAGACTGGAATGACACTTTAAGACAGGTAGTTGGAAAGTTA
AGAGAACAATTTGGAAGAACAATAATCTTTAATCAATCC
#6760
ATAGTAATTAGATCTGAAAACTTCACGAACAATGCTAAAACCATAATAGTACAGCTAAAG
GAACCTGTAAACATTACTTGTGAAAGACCCAGCAACAATACAAGAAAAAGTATACAT
ATAGGACCAGGAAAAGCATTTTATGCAACAGGAGAAATAGGAGATATAAGACGAGCA
CATTGTAACCTTAATAGAACAGCATGGAATAAAACTTTAAAACAGGTAGTTGAAAAATTA
AGAGAACAATTTAAGAAAACAATAACCTTTAACCAATCC
#9939
ATAGTAATCAGATCTGAAAACTTCTCGGACAATGCTAAAACCATAATAGTACAGCTAAAC
AACACTGTAAACATTACTTGTGAAAGACCCAACAACAATACAAGAAAAAGGATACAT
ATAGGACCAGGGAGAGCAGTTTATACAACAGGACAAATAGGAGATATAAGAAAAGCA
CATTGTAACCTTAGTAGAACAAATTGGACTGAAACTTTAAGACAAGTAGCTGAAAAATTA
AAAGAACAATTTAATAAAACAATAATCTTTAATAATTCC
#113
GTAGTAATTCGATCTGAAAACTTCACGGACAATGCTAAAACCATAATAGTACAGCTAAAC
AAATCTGTAGAAATTACTTGTGTAAGACCCAACAACAATACAAGAAAAAGTATAAAT
ATAAGACCAGGGAGAGCATTTTATACAACAGGAGAAATAGGAGATATAAGACAAGCA
CATTGTAACCTTAGTAGAACAGCATGGAATGAAGCTTTAAGACAAGTAGCTAAAAAATTA
AAAGAACAATTTAATAGAACAATAGTCTTTAATCAATCC
#822
ATAGTAATTAGATCTGAAAACTTCACAGACAATGCTAAAACCATAATAGTACAGCTAAAC
AAATCTGTAGAAATTAATTGTATAAGACCCAACAACAATACAAGAAAAAGTATACAT
ATAGGACCAGGGAGAGCATTTTATACAACAGGAGACATAGGAGATATAAGACAAGCA
TATTGTAACCTTAGTAGAACAGCATGGAATGAAACTTTAAGACAAGTAGCTCAAAAATTA
AAAGAACAATTTAATAGAACAATAGTCTTTAATCAATCC
#159
ATAGTAATTAGATCTGAAAACTTCACAGACAATGCTAAAACCATAATAGTACAGCTAAAT
AAATCTGTAGAAATTAATTGTACAAGACCCAACAACAATACAAGAAAAAGTATACAT
ATAGGACCAGGGAGAGCTTTTTATACAACAGGTGAAATAGGAGATTTAAGACAAGCA
CATTGTAACCTTAGTAGAACAGCATGGAATGAAACTTTAAGACAAGTAGCTAAAAAATTA
AAAGAACAATTTAATAGAACAATAGTTTTTAATCAATCC
#256
ATAGTAATTAGATCTGAAAACTTCACGGACAATGCTAAAACCATAATAGTACAGCTAAAT
AAATCTGTAGAAATTAATTGTACAAGACCCAACAACAATACAAGAAAAAGTATAAAT
ATAGGACCAGGGAGAGCATTTTATACAACAGGTGAAATAGGAAATTTAAGACAAGCA
CATTGTAACCTTAGTAGAACAGCATGGAATGAAACTTTAAGACAAGTAGCTAAAAAACTA
AAAGAACAATTTAATAGAACAATAGTTTTTAATCAATCC

(256,(822,159),((113,9939),(6760,((317,6767),((135,(529,105r)),(719,136))))))
\ No newline at end of file
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..ce3055a
--- /dev/null
+++ b/README.md
@@ -0,0 +1,54 @@
+HyPhy - Hypothesis testing using Phylogenies
+============================================
+
+Installation
+------------
+
+HyPhy now uses CMake for its build system.
+To install, make sure you have CMake installed,
+then configure the project from the source directory using
+`cmake .`
+By default, CMake produces Makefiles (I think),
+so if you prefer other build systems, such as Xcode,
+configure using the -G switch, e.g.
+`cmake -G Xcode .`
+CMake has a number of build system generators,
+feel free to peruse these and use them if you wish.
+
+One should also be aware, HyPhy requires development libraries
+for libcurl, its requirements, and libpthread.
+Additionally, libcurl requires development libraries for
+crypto++ and openssl (or gnutls, if your packages are so configured).
+On Ubuntu, these are libcurl-dev, libcrypto++-dev, and libssl-dev.
+
+By default, HyPhy installs into /usr/local,
+but can be made to install anywhere by passing
+`-DINSTALL_PREFIX=/wherever/you/want`
+to cmake during the configuration, e.g.
+`cmake -DINSTALL_PREFIX=/opt/hyphy .`.
+
+Occasionally, you may have to specify which OSX SDK you are using. e.g.
+`cmake -DCMAKE_OSX_SYSROOT=/Developer/SDKs/MacOSX10.9.sdk/ .`.
+
+If you're on a UNIX-compatible system,
+and you're comfortable with GNU make,
+then just `make` away with one of the following targets:
+
++   MAC - build a Mac Carbon application
++   HYPHYGTK - HYPHY with GTK
++   SP - build a HyPhy executable (HYPHYSP) without multiprocessing
++   MP2 - build a HyPhy executable (HYPHYMP) using pthreads to do multiprocessing
++   MPI - build a HyPhy executable (HYPHYMPI) using MPI to do multiprocessing
++   LIB - build a HyPhy library (libhyphy_mp) using pthreads to do multiprocessing
+-   GTEST - build HyPhy's gtest testing executable (HYPHYGTEST)
+
+A subsequent `make install` should put everything where they belong:
+
++   HYPHYMP(I) goes into /installation/prefix/bin
++   libhyphy_mp.(so/dylib/dll) goes into /installation/prefix/lib
++   HyPhy's standard library of batchfiles goes into /installation/prefix/lib/hyphy
+
+HYPHYGTEST isn't installed normally,
+as it serves no utility outside of testing.
+To test HyPhy,
+build the GTEST target and run ./HYPHYGTEST from the source directory.
diff --git a/cmake/FindOpenCL.cmake b/cmake/FindOpenCL.cmake
new file mode 100644
index 0000000..561fbb1
--- /dev/null
+++ b/cmake/FindOpenCL.cmake
@@ -0,0 +1,76 @@
+# - Try to find an OpenCL library
+# Once done this will define
+#
+#  OPENCL_FOUND - System has OPENCL
+#  OPENCL_INCLUDE_DIR - The OPENCL include directory
+#  OPENCL_LIBRARIES - The libraries needed to use OPENCL
+#
+
+# Copyright (c) 2010 Matthieu Volat. All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions and the following disclaimer in the
+#    documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+#
+# The views and conclusions contained in the software and documentation are
+# those of the authors and should not be interpreted as representing
+# official policies, either expressed or implied, of Matthieu Volat.
+
+IF(OPENCL_LIBRARIES)
+   SET(OpenCL_FIND_QUIETLY TRUE)
+ENDIF(OPENCL_LIBRARIES)
+
+IF(APPLE)
+  SET(CL_DIR OpenCL)
+ELSE(APPLE)
+  SET(CL_DIR CL)
+ENDIF(APPLE)
+FIND_PATH(OPENCL_INCLUDE_DIR ${CL_DIR}/opencl.h 
+    PATHS 
+        /usr/local/cuda/include
+        $ENV{AMDAPPSDKROOT}/include
+        /System/Library/Frameworks/OpenCL.framework/Headers
+    PATH_SUFFIXES nvidia nvidia-current)
+
+IF(CMAKE_SIZEOF_VOID_P EQUAL 8)
+  SET(AMD_ARCH_LIBDIR x86_64)
+ELSE(CMAKE_SIZEOF_VOID_P EQUAL 8)
+  SET(AMD_ARCH_LIBDIR x86)
+ENDIF(CMAKE_SIZEOF_VOID_P EQUAL 8)
+FIND_LIBRARY(OPENCL_LIBRARIES 
+    NAMES OpenCL 
+    PATH
+        $ENV{AMDAPPSDKROOT}/lib/${AMD_ARCH_LIBDIR}
+    PATH_SUFFIXES nvidia nvidia-current)
+
+IF(OPENCL_INCLUDE_DIR AND OPENCL_LIBRARIES)
+   SET(OPENCL_FOUND TRUE)
+ELSE(OPENCL_INCLUDE_DIR AND OPENCL_LIBRARIES)
+   SET(OPENCL_FOUND FALSE)
+ENDIF (OPENCL_INCLUDE_DIR AND OPENCL_LIBRARIES)
+
+INCLUDE(FindPackageHandleStandardArgs)
+FIND_PACKAGE_HANDLE_STANDARD_ARGS(OpenCL DEFAULT_MSG
+  OPENCL_LIBRARIES 
+  OPENCL_INCLUDE_DIR
+)
+
+MARK_AS_ADVANCED(OPENCL_INCLUDE_DIR OPENCL_LIBRARIES)
+
diff --git a/cmake/cmake_uninstall.cmake.in b/cmake/cmake_uninstall.cmake.in
new file mode 100644
index 0000000..83be952
--- /dev/null
+++ b/cmake/cmake_uninstall.cmake.in
@@ -0,0 +1,24 @@
+if (NOT EXISTS "@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt")
+    message(FATAL_ERROR "Cannot find install manifest: \"@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt\"")
+endif(NOT EXISTS "@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt")
+
+# suppress nauseating output
+cmake_policy(SET CMP0007 OLD)
+file(READ "@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt" files)
+string(REGEX REPLACE "\n" ";" files "${files}")
+list(REVERSE files)
+foreach (file ${files})
+    message(STATUS "Uninstalling \"$ENV{DESTDIR}${file}\"")
+    if (EXISTS "$ENV{DESTDIR}${file}")
+        execute_process(
+            COMMAND @CMAKE_COMMAND@ -E remove "$ENV{DESTDIR}${file}"
+            OUTPUT_VARIABLE rm_out
+            RESULT_VARIABLE rm_retval
+        )
+        if(NOT ${rm_retval} EQUAL 0)
+            message(FATAL_ERROR "Problem when removing \"$ENV{DESTDIR}${file}\"")
+        endif (NOT ${rm_retval} EQUAL 0)
+    else (EXISTS "$ENV{DESTDIR}${file}")
+        message(STATUS "File \"$ENV{DESTDIR}${file}\" does not exist.")
+    endif (EXISTS "$ENV{DESTDIR}${file}")
+endforeach(file)
diff --git a/contrib/cl2hdr.c b/contrib/cl2hdr.c
new file mode 100644
index 0000000..b1a176f
--- /dev/null
+++ b/contrib/cl2hdr.c
@@ -0,0 +1,126 @@
+#include <stdio.h>
+#include <string.h>
+
+int main(int argc, char * argv[])
+{
+    FILE *fpi, *fpo;
+    unsigned i = 0, j = 0;
+    // is_line_start is true to start out with
+    unsigned is_line_start = 1, is_slc = 0, is_mlc = 0;
+    unsigned last_is_slash = 0, last_is_star = 0;
+    char ibuf[1024], obuf[2048];
+
+    if(argc != 3) {
+        printf("usage: cl2hdr <CLFILE> <HEADERFILE>\n");
+        return -1;
+    }
+
+    fpi = fopen(argv[1], "r");
+    if(fpi < 0) {
+        printf("Unable to open %s for reading.\n", argv[1]);
+        return -1;
+    }
+
+    fpo = fopen(argv[2], "w");
+    if(fpo < 0) {
+        printf("Unable to open %s for writing.\n", argv[2]);
+        return -1;
+    }
+
+    fprintf(fpo, "%s", "#define KERNEL_STRING \"");
+
+    memset(&ibuf, 0, sizeof(ibuf));
+
+    while(fread(&ibuf, sizeof(char), 1024, fpi) > 0) {
+        j = 0;
+        memset(&obuf, '\0', sizeof(obuf));
+        for(i = 0; i < 1024 && ibuf[i] != '\0'; ++i) {
+            // if we're a single-line comment
+            if(last_is_slash && ibuf[i] == '/') {
+                is_slc = 1;
+                // only can be true if we're not a comment, which we are now
+                last_is_slash = 0;
+                continue;
+            }
+
+            // if we're a multi-line comment
+            if(last_is_slash && ibuf[i] == '*') {
+                is_mlc = 1;
+                // only can be true if we're not a comment, which we are now
+                last_is_slash = 0;
+                continue;
+            }
+
+            if(last_is_slash && !(is_mlc || is_slc)) {
+                obuf[j++] = '/';
+            }
+
+            /* last_is_star must also include is_mlc because
+               it can only be turned on during is_mlc,
+               and we don't print a '*' for last_is_star
+               because of just this fact. */
+            if(last_is_star && ibuf[i] == '/') {
+                is_mlc = 0;
+                continue;
+            }
+
+            // check this corner-case, if the last of the buf is a slash
+            if(!(is_mlc || is_slc) && ibuf[i] == '/') {
+                last_is_slash = 1;
+                continue;
+                // we'll print the slash if it's not a comment
+            } else {
+                last_is_slash = 0;
+            }
+
+            /* if we're a multi-line comment
+               we need to check for the terminal part */
+            if(is_mlc && ibuf[i] == '*') {
+                last_is_star = 1;
+                continue;
+                // we'll print the star if it's not a comment
+            } else {
+                last_is_star = 0;
+            }
+
+            if(is_line_start && (ibuf[i] == '\t' || ibuf[i] == ' ')) {
+                continue;
+            }
+
+            /* if it's a newline, escape it, add it, and continue
+               ignoring comments, because we want to preserve line numbers */
+            if (ibuf[i] == '\n') {
+                // get rid of trailing whitespace
+                for(; j > 1 && (obuf[j-1] == ' ' || obuf[j-1] == '\t'); --j);
+                obuf[j++] = '\\';
+                obuf[j++] = 'n';
+                is_line_start = 1;
+                is_slc = 0;
+                continue;
+            } else {
+                is_line_start = 0;
+            }
+
+            // if it's a comment or we're at the start of a line
+            // and we have whitespace
+            if(is_slc || is_mlc) {
+                continue;
+            }
+
+            // if it's a double-quote or backslash, escape it
+            if(ibuf[i] == '"' || ibuf[i] == '\\') {
+                obuf[j++] = '\\';
+            }
+
+            obuf[j++] = ibuf[i];
+        }
+        // make sure we terminate the output buffer properly
+        obuf[j] = '\0';
+        fprintf(fpo, "%s", obuf);
+        memset(&ibuf, '\0', sizeof(ibuf));
+    }
+
+    fprintf(fpo, "%s", "\\n\"\n\n");
+
+    return 0;
+}
diff --git a/contrib/gtest-1.7.0/CHANGES b/contrib/gtest-1.7.0/CHANGES
new file mode 100644
index 0000000..0552132
--- /dev/null
+++ b/contrib/gtest-1.7.0/CHANGES
@@ -0,0 +1,157 @@
+Changes for 1.7.0:
+
+* New feature: death tests are supported on OpenBSD and in iOS
+  simulator now.
+* New feature: Google Test now implements a protocol to allow
+  a test runner to detect that a test program has exited
+  prematurely and report it as a failure (before it would be
+  falsely reported as a success if the exit code is 0).
+* New feature: Test::RecordProperty() can now be used outside of the
+  lifespan of a test method, in which case it will be attributed to
+  the current test case or the test program in the XML report.
+* New feature (potentially breaking): --gtest_list_tests now prints
+  the type parameters and value parameters for each test.
+* Improvement: char pointers and char arrays are now escaped properly
+  in failure messages.
+* Improvement: failure summary in XML reports now includes file and
+  line information.
+* Improvement: the <testsuites> XML element now has a timestamp attribute.
+* Improvement: When --gtest_filter is specified, XML report now doesn't
+  contain information about tests that are filtered out.
+* Fixed the bug where long --gtest_filter flag values are truncated in
+  death tests.
+* Potentially breaking change: RUN_ALL_TESTS() is now implemented as a
+  function instead of a macro in order to work better with Clang.
+* Compatibility fixes with C++ 11 and various platforms.
+* Bug/warning fixes.
+
+Changes for 1.6.0:
+
+* New feature: ADD_FAILURE_AT() for reporting a test failure at the
+  given source location -- useful for writing testing utilities.
+* New feature: the universal value printer is moved from Google Mock
+  to Google Test.
+* New feature: type parameters and value parameters are reported in
+  the XML report now.
+* A gtest_disable_pthreads CMake option.
+* Colored output works in GNU Screen sessions now.
+* Parameters of value-parameterized tests are now printed in the
+  textual output.
+* Failures from ad hoc test assertions run before RUN_ALL_TESTS() are
+  now correctly reported.
+* Arguments of ASSERT_XY and EXPECT_XY no longer need to support << to
+  ostream.
+* More complete handling of exceptions.
+* GTEST_ASSERT_XY can be used instead of ASSERT_XY in case the latter
+  name is already used by another library.
+* --gtest_catch_exceptions is now true by default, allowing a test
+  program to continue after an exception is thrown.
+* Value-parameterized test fixtures can now derive from Test and
+  WithParamInterface<T> separately, easing conversion of legacy tests.
+* Death test messages are clearly marked to make them more
+  distinguishable from other messages.
+* Compatibility fixes for Android, Google Native Client, MinGW, HP UX,
+  PowerPC, Lucid autotools, libCStd, Sun C++, Borland C++ Builder (Code Gear),
+  IBM XL C++ (Visual Age C++), and C++0x.
+* Bug fixes and implementation clean-ups.
+* Potentially incompatible changes: disables the harmful 'make install'
+  command in autotools.
+
+Changes for 1.5.0:
+
+ * New feature: assertions can be safely called in multiple threads
+   where the pthreads library is available.
+ * New feature: predicates used inside EXPECT_TRUE() and friends
+   can now generate custom failure messages.
+ * New feature: Google Test can now be compiled as a DLL.
+ * New feature: fused source files are included.
+ * New feature: prints help when encountering unrecognized Google Test flags.
+ * Experimental feature: CMake build script (requires CMake 2.6.4+).
+ * Experimental feature: the Pump script for meta programming.
+ * double values streamed to an assertion are printed with enough precision
+   to differentiate any two different values.
+ * Google Test now works on Solaris and AIX.
+ * Build and test script improvements.
+ * Bug fixes and implementation clean-ups.
+
+ Potentially breaking changes:
+
+ * Stopped supporting VC++ 7.1 with exceptions disabled.
+ * Dropped support for 'make install'.
+
+Changes for 1.4.0:
+
+ * New feature: the event listener API
+ * New feature: test shuffling
+ * New feature: the XML report format is closer to junitreport and can
+   be parsed by Hudson now.
+ * New feature: when a test runs under Visual Studio, its failures are
+   integrated in the IDE.
+ * New feature: /MD(d) versions of VC++ projects.
+ * New feature: elapsed time for the tests is printed by default.
+ * New feature: comes with a TR1 tuple implementation such that Boost
+   is no longer needed for Combine().
+ * New feature: EXPECT_DEATH_IF_SUPPORTED macro and friends.
+ * New feature: the Xcode project can now produce static gtest
+   libraries in addition to a framework.
+ * Compatibility fixes for Solaris, Cygwin, minGW, Windows Mobile,
+   Symbian, gcc, and C++Builder.
+ * Bug fixes and implementation clean-ups.
+
+Changes for 1.3.0:
+
+ * New feature: death tests on Windows, Cygwin, and Mac.
+ * New feature: ability to use Google Test assertions in other testing
+   frameworks.
+ * New feature: ability to run disabled test via
+   --gtest_also_run_disabled_tests.
+ * New feature: the --help flag for printing the usage.
+ * New feature: access to Google Test flag values in user code.
+ * New feature: a script that packs Google Test into one .h and one
+   .cc file for easy deployment.
+ * New feature: support for distributing test functions to multiple
+   machines (requires support from the test runner).
+ * Bug fixes and implementation clean-ups.
+
+Changes for 1.2.1:
+
+ * Compatibility fixes for Linux IA-64 and IBM z/OS.
+ * Added support for using Boost and other TR1 implementations.
+ * Changes to the build scripts to support upcoming release of Google C++
+   Mocking Framework.
+ * Added Makefile to the distribution package.
+ * Improved build instructions in README.
+
+Changes for 1.2.0:
+
+ * New feature: value-parameterized tests.
+ * New feature: the ASSERT/EXPECT_(NON)FATAL_FAILURE(_ON_ALL_THREADS)
+   macros.
+ * Changed the XML report format to match JUnit/Ant's.
+ * Added tests to the Xcode project.
+ * Added scons/SConscript for building with SCons.
+ * Added src/gtest-all.cc for building Google Test from a single file.
+ * Fixed compatibility with Solaris and z/OS.
+ * Enabled running Python tests on systems with python 2.3 installed,
+   e.g. Mac OS X 10.4.
+ * Bug fixes.
+
+Changes for 1.1.0:
+
+ * New feature: type-parameterized tests.
+ * New feature: exception assertions.
+ * New feature: printing elapsed time of tests.
+ * Improved the robustness of death tests.
+ * Added an Xcode project and samples.
+ * Adjusted the output format on Windows to be understandable by Visual Studio.
+ * Minor bug fixes.
+
+Changes for 1.0.1:
+
+ * Added project files for Visual Studio 7.1.
+ * Fixed issues with compiling on Mac OS X.
+ * Fixed issues with compiling on Cygwin.
+
+Changes for 1.0.0:
+
+ * Initial Open Source release of Google Test
diff --git a/contrib/gtest-1.7.0/CMakeLists.txt b/contrib/gtest-1.7.0/CMakeLists.txt
new file mode 100644
index 0000000..57470c8
--- /dev/null
+++ b/contrib/gtest-1.7.0/CMakeLists.txt
@@ -0,0 +1,252 @@
+########################################################################
+# CMake build script for Google Test.
+#
+# To run the tests for Google Test itself on Linux, use 'make test' or
+# ctest.  You can select which tests to run using 'ctest -R regex'.
+# For more options, run 'ctest --help'.
+
+# BUILD_SHARED_LIBS is a standard CMake variable, but we declare it here to
+# make it prominent in the GUI.
+option(BUILD_SHARED_LIBS "Build shared libraries (DLLs)." OFF)
+
+# When other libraries are using a shared version of runtime libraries,
+# Google Test also has to use one.
+option(
+  gtest_force_shared_crt
+  "Use shared (DLL) run-time lib even when Google Test is built as static lib."
+  OFF)
+
+option(gtest_build_tests "Build all of gtest's own tests." OFF)
+
+option(gtest_build_samples "Build gtest's sample programs." OFF)
+
+option(gtest_disable_pthreads "Disable uses of pthreads in gtest." OFF)
+
+# Defines pre_project_set_up_hermetic_build() and set_up_hermetic_build().
+include(cmake/hermetic_build.cmake OPTIONAL)
+
+if (COMMAND pre_project_set_up_hermetic_build)
+  pre_project_set_up_hermetic_build()
+endif()
+
+########################################################################
+#
+# Project-wide settings
+
+# Name of the project.
+#
+# CMake files in this project can refer to the root source directory
+# as ${gtest_SOURCE_DIR} and to the root binary directory as
+# ${gtest_BINARY_DIR}.
+# Language "C" is required for find_package(Threads).
+project(gtest CXX C)
+cmake_minimum_required(VERSION 2.6.2)
+
+if (COMMAND set_up_hermetic_build)
+  set_up_hermetic_build()
+endif()
+
+# Define helper functions and macros used by Google Test.
+include(cmake/internal_utils.cmake)
+
+config_compiler_and_linker()  # Defined in internal_utils.cmake.
+
+# Where Google Test's .h files can be found.
+include_directories(
+  ${gtest_SOURCE_DIR}/include
+  ${gtest_SOURCE_DIR})
+
+# Where Google Test's libraries can be found.
+link_directories(${gtest_BINARY_DIR}/src)
+
+########################################################################
+#
+# Defines the gtest & gtest_main libraries.  User tests should link
+# with one of them.
+
+# Google Test libraries.  We build them using more strict warnings than what
+# are used for other targets, to ensure that gtest can be compiled by a user
+# aggressive about warnings.
+cxx_library(gtest "${cxx_strict}" src/gtest-all.cc)
+cxx_library(gtest_main "${cxx_strict}" src/gtest_main.cc)
+target_link_libraries(gtest_main gtest)
+
+########################################################################
+#
+# Samples on how to link user tests with gtest or gtest_main.
+#
+# They are not built by default.  To build them, set the
+# gtest_build_samples option to ON.  You can do it by running ccmake
+# or specifying the -Dgtest_build_samples=ON flag when running cmake.
+
+if (gtest_build_samples)
+  cxx_executable(sample1_unittest samples gtest_main samples/sample1.cc)
+  cxx_executable(sample2_unittest samples gtest_main samples/sample2.cc)
+  cxx_executable(sample3_unittest samples gtest_main)
+  cxx_executable(sample4_unittest samples gtest_main samples/sample4.cc)
+  cxx_executable(sample5_unittest samples gtest_main samples/sample1.cc)
+  cxx_executable(sample6_unittest samples gtest_main)
+  cxx_executable(sample7_unittest samples gtest_main)
+  cxx_executable(sample8_unittest samples gtest_main)
+  cxx_executable(sample9_unittest samples gtest)
+  cxx_executable(sample10_unittest samples gtest)
+endif()
+
+########################################################################
+#
+# Google Test's own tests.
+#
+# You can skip this section if you aren't interested in testing
+# Google Test itself.
+#
+# The tests are not built by default.  To build them, set the
+# gtest_build_tests option to ON.  You can do it by running ccmake
+# or specifying the -Dgtest_build_tests=ON flag when running cmake.
+
+if (gtest_build_tests)
+  # This must be set in the root directory for the tests to be run by
+  # 'make test' or ctest.
+  enable_testing()
+
+  ############################################################
+  # C++ tests built with standard compiler flags.
+
+  cxx_test(gtest-death-test_test gtest_main)
+  cxx_test(gtest_environment_test gtest)
+  cxx_test(gtest-filepath_test gtest_main)
+  cxx_test(gtest-linked_ptr_test gtest_main)
+  cxx_test(gtest-listener_test gtest_main)
+  cxx_test(gtest_main_unittest gtest_main)
+  cxx_test(gtest-message_test gtest_main)
+  cxx_test(gtest_no_test_unittest gtest)
+  cxx_test(gtest-options_test gtest_main)
+  cxx_test(gtest-param-test_test gtest
+    test/gtest-param-test2_test.cc)
+  cxx_test(gtest-port_test gtest_main)
+  cxx_test(gtest_pred_impl_unittest gtest_main)
+  cxx_test(gtest_premature_exit_test gtest
+    test/gtest_premature_exit_test.cc)
+  cxx_test(gtest-printers_test gtest_main)
+  cxx_test(gtest_prod_test gtest_main
+    test/production.cc)
+  cxx_test(gtest_repeat_test gtest)
+  cxx_test(gtest_sole_header_test gtest_main)
+  cxx_test(gtest_stress_test gtest)
+  cxx_test(gtest-test-part_test gtest_main)
+  cxx_test(gtest_throw_on_failure_ex_test gtest)
+  cxx_test(gtest-typed-test_test gtest_main
+    test/gtest-typed-test2_test.cc)
+  cxx_test(gtest_unittest gtest_main)
+  cxx_test(gtest-unittest-api_test gtest)
+
+  ############################################################
+  # C++ tests built with non-standard compiler flags.
+
+  # MSVC 7.1 does not support STL with exceptions disabled.
+  if (NOT MSVC OR MSVC_VERSION GREATER 1310)
+    cxx_library(gtest_no_exception "${cxx_no_exception}"
+      src/gtest-all.cc)
+    cxx_library(gtest_main_no_exception "${cxx_no_exception}"
+      src/gtest-all.cc src/gtest_main.cc)
+  endif()
+  cxx_library(gtest_main_no_rtti "${cxx_no_rtti}"
+    src/gtest-all.cc src/gtest_main.cc)
+
+  cxx_test_with_flags(gtest-death-test_ex_nocatch_test
+    "${cxx_exception} -DGTEST_ENABLE_CATCH_EXCEPTIONS_=0"
+    gtest test/gtest-death-test_ex_test.cc)
+  cxx_test_with_flags(gtest-death-test_ex_catch_test
+    "${cxx_exception} -DGTEST_ENABLE_CATCH_EXCEPTIONS_=1"
+    gtest test/gtest-death-test_ex_test.cc)
+
+  cxx_test_with_flags(gtest_no_rtti_unittest "${cxx_no_rtti}"
+    gtest_main_no_rtti test/gtest_unittest.cc)
+
+  cxx_shared_library(gtest_dll "${cxx_default}"
+    src/gtest-all.cc src/gtest_main.cc)
+
+  cxx_executable_with_flags(gtest_dll_test_ "${cxx_default}"
+    gtest_dll test/gtest_all_test.cc)
+  set_target_properties(gtest_dll_test_
+                        PROPERTIES
+                        COMPILE_DEFINITIONS "GTEST_LINKED_AS_SHARED_LIBRARY=1")
+
+  if (NOT MSVC OR NOT MSVC_VERSION EQUAL 1600)
+    # The C++ Standard specifies tuple_element<int, class>.
+    # Yet MSVC 10's <utility> declares tuple_element<size_t, class>.
+    # That declaration conflicts with our own standard-conforming
+    # tuple implementation.  Therefore using our own tuple with
+    # MSVC 10 doesn't compile.
+    cxx_library(gtest_main_use_own_tuple "${cxx_use_own_tuple}"
+      src/gtest-all.cc src/gtest_main.cc)
+
+    cxx_test_with_flags(gtest-tuple_test "${cxx_use_own_tuple}"
+      gtest_main_use_own_tuple test/gtest-tuple_test.cc)
+
+    cxx_test_with_flags(gtest_use_own_tuple_test "${cxx_use_own_tuple}"
+      gtest_main_use_own_tuple
+      test/gtest-param-test_test.cc test/gtest-param-test2_test.cc)
+  endif()
+
+  ############################################################
+  # Python tests.
+
+  cxx_executable(gtest_break_on_failure_unittest_ test gtest)
+  py_test(gtest_break_on_failure_unittest)
+
+  # MSVC 7.1 does not support STL with exceptions disabled.
+  if (NOT MSVC OR MSVC_VERSION GREATER 1310)
+    cxx_executable_with_flags(
+      gtest_catch_exceptions_no_ex_test_
+      "${cxx_no_exception}"
+      gtest_main_no_exception
+      test/gtest_catch_exceptions_test_.cc)
+  endif()
+
+  cxx_executable_with_flags(
+    gtest_catch_exceptions_ex_test_
+    "${cxx_exception}"
+    gtest_main
+    test/gtest_catch_exceptions_test_.cc)
+  py_test(gtest_catch_exceptions_test)
+
+  cxx_executable(gtest_color_test_ test gtest)
+  py_test(gtest_color_test)
+
+  cxx_executable(gtest_env_var_test_ test gtest)
+  py_test(gtest_env_var_test)
+
+  cxx_executable(gtest_filter_unittest_ test gtest)
+  py_test(gtest_filter_unittest)
+
+  cxx_executable(gtest_help_test_ test gtest_main)
+  py_test(gtest_help_test)
+
+  cxx_executable(gtest_list_tests_unittest_ test gtest)
+  py_test(gtest_list_tests_unittest)
+
+  cxx_executable(gtest_output_test_ test gtest)
+  py_test(gtest_output_test)
+
+  cxx_executable(gtest_shuffle_test_ test gtest)
+  py_test(gtest_shuffle_test)
+
+  # MSVC 7.1 does not support STL with exceptions disabled.
+  if (NOT MSVC OR MSVC_VERSION GREATER 1310)
+    cxx_executable(gtest_throw_on_failure_test_ test gtest_no_exception)
+    set_target_properties(gtest_throw_on_failure_test_
+      PROPERTIES
+      COMPILE_FLAGS "${cxx_no_exception}")
+    py_test(gtest_throw_on_failure_test)
+  endif()
+
+  cxx_executable(gtest_uninitialized_test_ test gtest)
+  py_test(gtest_uninitialized_test)
+
+  cxx_executable(gtest_xml_outfile1_test_ test gtest_main)
+  cxx_executable(gtest_xml_outfile2_test_ test gtest_main)
+  py_test(gtest_xml_outfiles_test)
+
+  cxx_executable(gtest_xml_output_unittest_ test gtest)
+  py_test(gtest_xml_output_unittest)
+endif()
diff --git a/contrib/gtest-1.7.0/CONTRIBUTORS b/contrib/gtest-1.7.0/CONTRIBUTORS
new file mode 100644
index 0000000..feae2fc
--- /dev/null
+++ b/contrib/gtest-1.7.0/CONTRIBUTORS
@@ -0,0 +1,37 @@
+# This file contains a list of people who've made non-trivial
+# contribution to the Google C++ Testing Framework project.  People
+# who commit code to the project are encouraged to add their names
+# here.  Please keep the list sorted by first names.
+
+Ajay Joshi <jaj at google.com>
+Balázs Dán <balazs.dan at gmail.com>
+Bharat Mediratta <bharat at menalto.com>
+Chandler Carruth <chandlerc at google.com>
+Chris Prince <cprince at google.com>
+Chris Taylor <taylorc at google.com>
+Dan Egnor <egnor at google.com>
+Eric Roman <eroman at chromium.org>
+Hady Zalek <hady.zalek at gmail.com>
+Jeffrey Yasskin <jyasskin at google.com>
+Jói Sigurðsson <joi at google.com>
+Keir Mierle <mierle at gmail.com>
+Keith Ray <keith.ray at gmail.com>
+Kenton Varda <kenton at google.com>
+Manuel Klimek <klimek at google.com>
+Markus Heule <markus.heule at gmail.com>
+Mika Raento <mikie at iki.fi>
+Miklós Fazekas <mfazekas at szemafor.com>
+Pasi Valminen <pasi.valminen at gmail.com>
+Patrick Hanna <phanna at google.com>
+Patrick Riley <pfr at google.com>
+Peter Kaminski <piotrk at google.com>
+Preston Jackson <preston.a.jackson at gmail.com>
+Rainer Klaffenboeck <rainer.klaffenboeck at dynatrace.com>
+Russ Cox <rsc at google.com>
+Russ Rufer <russ at pentad.com>
+Sean Mcafee <eefacm at gmail.com>
+Sigurður Ásgeirsson <siggi at google.com>
+Tracy Bialik <tracy at pentad.com>
+Vadim Berman <vadimb at google.com>
+Vlad Losev <vladl at google.com>
+Zhanyong Wan <wan at google.com>
diff --git a/contrib/gtest-1.7.0/LICENSE b/contrib/gtest-1.7.0/LICENSE
new file mode 100644
index 0000000..1941a11
--- /dev/null
+++ b/contrib/gtest-1.7.0/LICENSE
@@ -0,0 +1,28 @@
+Copyright 2008, Google Inc.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+    * Redistributions of source code must retain the above copyright
+notice, this list of conditions and the following disclaimer.
+    * Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the following disclaimer
+in the documentation and/or other materials provided with the
+distribution.
+    * Neither the name of Google Inc. nor the names of its
+contributors may be used to endorse or promote products derived from
+this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/contrib/gtest-1.7.0/Makefile.am b/contrib/gtest-1.7.0/Makefile.am
new file mode 100644
index 0000000..9c96b42
--- /dev/null
+++ b/contrib/gtest-1.7.0/Makefile.am
@@ -0,0 +1,306 @@
+# Automake file
+
+ACLOCAL_AMFLAGS = -I m4
+
+# Nonstandard package files for distribution
+EXTRA_DIST = \
+  CHANGES \
+  CONTRIBUTORS \
+  LICENSE \
+  include/gtest/gtest-param-test.h.pump \
+  include/gtest/internal/gtest-param-util-generated.h.pump \
+  include/gtest/internal/gtest-tuple.h.pump \
+  include/gtest/internal/gtest-type-util.h.pump \
+  make/Makefile \
+  scripts/fuse_gtest_files.py \
+  scripts/gen_gtest_pred_impl.py \
+  scripts/pump.py \
+  scripts/test/Makefile
+
+# gtest source files that we don't compile directly.  They are
+# #included by gtest-all.cc.
+GTEST_SRC = \
+  src/gtest-death-test.cc \
+  src/gtest-filepath.cc \
+  src/gtest-internal-inl.h \
+  src/gtest-port.cc \
+  src/gtest-printers.cc \
+  src/gtest-test-part.cc \
+  src/gtest-typed-test.cc \
+  src/gtest.cc
+
+EXTRA_DIST += $(GTEST_SRC)
+
+# Sample files that we don't compile.
+EXTRA_DIST += \
+  samples/prime_tables.h \
+  samples/sample2_unittest.cc \
+  samples/sample3_unittest.cc \
+  samples/sample4_unittest.cc \
+  samples/sample5_unittest.cc \
+  samples/sample6_unittest.cc \
+  samples/sample7_unittest.cc \
+  samples/sample8_unittest.cc \
+  samples/sample9_unittest.cc
+
+# C++ test files that we don't compile directly.
+EXTRA_DIST += \
+  test/gtest-death-test_ex_test.cc \
+  test/gtest-death-test_test.cc \
+  test/gtest-filepath_test.cc \
+  test/gtest-linked_ptr_test.cc \
+  test/gtest-listener_test.cc \
+  test/gtest-message_test.cc \
+  test/gtest-options_test.cc \
+  test/gtest-param-test2_test.cc \
+  test/gtest-param-test2_test.cc \
+  test/gtest-param-test_test.cc \
+  test/gtest-param-test_test.cc \
+  test/gtest-param-test_test.h \
+  test/gtest-port_test.cc \
+  test/gtest_premature_exit_test.cc \
+  test/gtest-printers_test.cc \
+  test/gtest-test-part_test.cc \
+  test/gtest-tuple_test.cc \
+  test/gtest-typed-test2_test.cc \
+  test/gtest-typed-test_test.cc \
+  test/gtest-typed-test_test.h \
+  test/gtest-unittest-api_test.cc \
+  test/gtest_break_on_failure_unittest_.cc \
+  test/gtest_catch_exceptions_test_.cc \
+  test/gtest_color_test_.cc \
+  test/gtest_env_var_test_.cc \
+  test/gtest_environment_test.cc \
+  test/gtest_filter_unittest_.cc \
+  test/gtest_help_test_.cc \
+  test/gtest_list_tests_unittest_.cc \
+  test/gtest_main_unittest.cc \
+  test/gtest_no_test_unittest.cc \
+  test/gtest_output_test_.cc \
+  test/gtest_pred_impl_unittest.cc \
+  test/gtest_prod_test.cc \
+  test/gtest_repeat_test.cc \
+  test/gtest_shuffle_test_.cc \
+  test/gtest_sole_header_test.cc \
+  test/gtest_stress_test.cc \
+  test/gtest_throw_on_failure_ex_test.cc \
+  test/gtest_throw_on_failure_test_.cc \
+  test/gtest_uninitialized_test_.cc \
+  test/gtest_unittest.cc \
+  test/gtest_unittest.cc \
+  test/gtest_xml_outfile1_test_.cc \
+  test/gtest_xml_outfile2_test_.cc \
+  test/gtest_xml_output_unittest_.cc \
+  test/production.cc \
+  test/production.h
+
+# Python tests that we don't run.
+EXTRA_DIST += \
+  test/gtest_break_on_failure_unittest.py \
+  test/gtest_catch_exceptions_test.py \
+  test/gtest_color_test.py \
+  test/gtest_env_var_test.py \
+  test/gtest_filter_unittest.py \
+  test/gtest_help_test.py \
+  test/gtest_list_tests_unittest.py \
+  test/gtest_output_test.py \
+  test/gtest_output_test_golden_lin.txt \
+  test/gtest_shuffle_test.py \
+  test/gtest_test_utils.py \
+  test/gtest_throw_on_failure_test.py \
+  test/gtest_uninitialized_test.py \
+  test/gtest_xml_outfiles_test.py \
+  test/gtest_xml_output_unittest.py \
+  test/gtest_xml_test_utils.py
+
+# CMake script
+EXTRA_DIST += \
+  CMakeLists.txt \
+  cmake/internal_utils.cmake
+
+# MSVC project files
+EXTRA_DIST += \
+  msvc/gtest-md.sln \
+  msvc/gtest-md.vcproj \
+  msvc/gtest.sln \
+  msvc/gtest.vcproj \
+  msvc/gtest_main-md.vcproj \
+  msvc/gtest_main.vcproj \
+  msvc/gtest_prod_test-md.vcproj \
+  msvc/gtest_prod_test.vcproj \
+  msvc/gtest_unittest-md.vcproj \
+  msvc/gtest_unittest.vcproj
+
+# xcode project files
+EXTRA_DIST += \
+  xcode/Config/DebugProject.xcconfig \
+  xcode/Config/FrameworkTarget.xcconfig \
+  xcode/Config/General.xcconfig \
+  xcode/Config/ReleaseProject.xcconfig \
+  xcode/Config/StaticLibraryTarget.xcconfig \
+  xcode/Config/TestTarget.xcconfig \
+  xcode/Resources/Info.plist \
+  xcode/Scripts/runtests.sh \
+  xcode/Scripts/versiongenerate.py \
+  xcode/gtest.xcodeproj/project.pbxproj
+
+# xcode sample files
+EXTRA_DIST += \
+  xcode/Samples/FrameworkSample/Info.plist \
+  xcode/Samples/FrameworkSample/WidgetFramework.xcodeproj/project.pbxproj \
+  xcode/Samples/FrameworkSample/runtests.sh \
+  xcode/Samples/FrameworkSample/widget.cc \
+  xcode/Samples/FrameworkSample/widget.h \
+  xcode/Samples/FrameworkSample/widget_test.cc
+
+# C++Builder project files
+EXTRA_DIST += \
+  codegear/gtest.cbproj \
+  codegear/gtest.groupproj \
+  codegear/gtest_all.cc \
+  codegear/gtest_link.cc \
+  codegear/gtest_main.cbproj \
+  codegear/gtest_unittest.cbproj
+
+# Distribute and install M4 macro
+m4datadir = $(datadir)/aclocal
+m4data_DATA = m4/gtest.m4
+EXTRA_DIST += $(m4data_DATA)
+
+# We define the global AM_CPPFLAGS as everything we compile includes from these
+# directories.
+AM_CPPFLAGS = -I$(srcdir) -I$(srcdir)/include
+
+# Modifies compiler and linker flags for pthreads compatibility.
+if HAVE_PTHREADS
+  AM_CXXFLAGS = @PTHREAD_CFLAGS@ -DGTEST_HAS_PTHREAD=1
+  AM_LIBS = @PTHREAD_LIBS@
+else
+  AM_CXXFLAGS = -DGTEST_HAS_PTHREAD=0
+endif
+
+# Build rules for libraries.
+lib_LTLIBRARIES = lib/libgtest.la lib/libgtest_main.la
+
+lib_libgtest_la_SOURCES = src/gtest-all.cc
+
+pkginclude_HEADERS = \
+  include/gtest/gtest-death-test.h \
+  include/gtest/gtest-message.h \
+  include/gtest/gtest-param-test.h \
+  include/gtest/gtest-printers.h \
+  include/gtest/gtest-spi.h \
+  include/gtest/gtest-test-part.h \
+  include/gtest/gtest-typed-test.h \
+  include/gtest/gtest.h \
+  include/gtest/gtest_pred_impl.h \
+  include/gtest/gtest_prod.h
+
+pkginclude_internaldir = $(pkgincludedir)/internal
+pkginclude_internal_HEADERS = \
+  include/gtest/internal/gtest-death-test-internal.h \
+  include/gtest/internal/gtest-filepath.h \
+  include/gtest/internal/gtest-internal.h \
+  include/gtest/internal/gtest-linked_ptr.h \
+  include/gtest/internal/gtest-param-util-generated.h \
+  include/gtest/internal/gtest-param-util.h \
+  include/gtest/internal/gtest-port.h \
+  include/gtest/internal/gtest-string.h \
+  include/gtest/internal/gtest-tuple.h \
+  include/gtest/internal/gtest-type-util.h
+
+lib_libgtest_main_la_SOURCES = src/gtest_main.cc
+lib_libgtest_main_la_LIBADD = lib/libgtest.la
+
+# Bulid rules for samples and tests. Automake's naming for some of
+# these variables isn't terribly obvious, so this is a brief
+# reference:
+#
+# TESTS -- Programs run automatically by "make check"
+# check_PROGRAMS -- Programs built by "make check" but not necessarily run
+
+noinst_LTLIBRARIES = samples/libsamples.la
+
+samples_libsamples_la_SOURCES = \
+  samples/sample1.cc \
+  samples/sample1.h \
+  samples/sample2.cc \
+  samples/sample2.h \
+  samples/sample3-inl.h \
+  samples/sample4.cc \
+  samples/sample4.h
+
+TESTS=
+TESTS_ENVIRONMENT = GTEST_SOURCE_DIR="$(srcdir)/test" \
+                    GTEST_BUILD_DIR="$(top_builddir)/test"
+check_PROGRAMS=
+
+# A simple sample on using gtest.
+TESTS += samples/sample1_unittest
+check_PROGRAMS += samples/sample1_unittest
+samples_sample1_unittest_SOURCES = samples/sample1_unittest.cc
+samples_sample1_unittest_LDADD = lib/libgtest_main.la \
+                                 lib/libgtest.la \
+                                 samples/libsamples.la
+
+# Another sample.  It also verifies that libgtest works.
+TESTS += samples/sample10_unittest
+check_PROGRAMS += samples/sample10_unittest
+samples_sample10_unittest_SOURCES = samples/sample10_unittest.cc
+samples_sample10_unittest_LDADD = lib/libgtest.la
+
+# This tests most constructs of gtest and verifies that libgtest_main
+# and libgtest work.
+TESTS += test/gtest_all_test
+check_PROGRAMS += test/gtest_all_test
+test_gtest_all_test_SOURCES = test/gtest_all_test.cc
+test_gtest_all_test_LDADD = lib/libgtest_main.la \
+                            lib/libgtest.la
+
+# Tests that fused gtest files compile and work.
+FUSED_GTEST_SRC = \
+  fused-src/gtest/gtest-all.cc \
+  fused-src/gtest/gtest.h \
+  fused-src/gtest/gtest_main.cc
+
+if HAVE_PYTHON
+TESTS += test/fused_gtest_test
+check_PROGRAMS += test/fused_gtest_test
+test_fused_gtest_test_SOURCES = $(FUSED_GTEST_SRC) \
+                                samples/sample1.cc samples/sample1_unittest.cc
+test_fused_gtest_test_CPPFLAGS = -I"$(srcdir)/fused-src"
+
+# Build rules for putting fused Google Test files into the distribution
+# package. The user can also create those files by manually running
+# scripts/fuse_gtest_files.py.
+$(test_fused_gtest_test_SOURCES): fused-gtest
+
+fused-gtest: $(pkginclude_HEADERS) $(pkginclude_internal_HEADERS) \
+             $(GTEST_SRC) src/gtest-all.cc src/gtest_main.cc \
+             scripts/fuse_gtest_files.py
+	mkdir -p "$(srcdir)/fused-src"
+	chmod -R u+w "$(srcdir)/fused-src"
+	rm -f "$(srcdir)/fused-src/gtest/gtest-all.cc"
+	rm -f "$(srcdir)/fused-src/gtest/gtest.h"
+	"$(srcdir)/scripts/fuse_gtest_files.py" "$(srcdir)/fused-src"
+	cp -f "$(srcdir)/src/gtest_main.cc" "$(srcdir)/fused-src/gtest/"
+
+maintainer-clean-local:
+	rm -rf "$(srcdir)/fused-src"
+endif
+
+# Death tests may produce core dumps in the build directory. In case
+# this happens, clean them to keep distcleancheck happy.
+CLEANFILES = core
+
+# Disables 'make install' as installing a compiled version of Google
+# Test can lead to undefined behavior due to violation of the
+# One-Definition Rule.
+
+install-exec-local:
+	echo "'make install' is dangerous and not supported. Instead, see README for how to integrate Google Test into your build system."
+	false
+
+install-data-local:
+	echo "'make install' is dangerous and not supported. Instead, see README for how to integrate Google Test into your build system."
+	false
diff --git a/contrib/gtest-1.7.0/Makefile.in b/contrib/gtest-1.7.0/Makefile.in
new file mode 100644
index 0000000..874de74
--- /dev/null
+++ b/contrib/gtest-1.7.0/Makefile.in
@@ -0,0 +1,1360 @@
+# Makefile.in generated by automake 1.11.3 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
+# 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 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.
+
+ at SET_MAKE@
+
+# Automake file
+
+
+
+VPATH = @srcdir@
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+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 = :
+build_triplet = @build@
+host_triplet = @host@
+TESTS = samples/sample1_unittest$(EXEEXT) \
+	samples/sample10_unittest$(EXEEXT) \
+	test/gtest_all_test$(EXEEXT) $(am__EXEEXT_1)
+check_PROGRAMS = samples/sample1_unittest$(EXEEXT) \
+	samples/sample10_unittest$(EXEEXT) \
+	test/gtest_all_test$(EXEEXT) $(am__EXEEXT_1)
+ at HAVE_PYTHON_TRUE@am__append_1 = test/fused_gtest_test
+ at HAVE_PYTHON_TRUE@am__append_2 = test/fused_gtest_test
+subdir = .
+DIST_COMMON = README $(am__configure_deps) $(pkginclude_HEADERS) \
+	$(pkginclude_internal_HEADERS) $(srcdir)/Makefile.am \
+	$(srcdir)/Makefile.in $(top_srcdir)/build-aux/config.h.in \
+	$(top_srcdir)/configure $(top_srcdir)/scripts/gtest-config.in \
+	build-aux/config.guess build-aux/config.sub build-aux/depcomp \
+	build-aux/install-sh build-aux/ltmain.sh build-aux/missing
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \
+	$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
+	$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
+	$(top_srcdir)/m4/acx_pthread.m4 $(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \
+ configure.lineno config.status.lineno
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/build-aux/config.h
+CONFIG_CLEAN_FILES = scripts/gtest-config
+CONFIG_CLEAN_VPATH_FILES =
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+  for p in $$list; do echo "$$p $$p"; done | \
+  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+    if (++n[$$2] == $(am__install_max)) \
+      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+    END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+  test -z "$$files" \
+    || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+    || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+         $(am__cd) "$$dir" && rm -f $$files; }; \
+  }
+am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(m4datadir)" \
+	"$(DESTDIR)$(pkgincludedir)" \
+	"$(DESTDIR)$(pkginclude_internaldir)"
+LTLIBRARIES = $(lib_LTLIBRARIES) $(noinst_LTLIBRARIES)
+lib_libgtest_la_LIBADD =
+am__dirstamp = $(am__leading_dot)dirstamp
+am_lib_libgtest_la_OBJECTS = src/gtest-all.lo
+lib_libgtest_la_OBJECTS = $(am_lib_libgtest_la_OBJECTS)
+lib_libgtest_main_la_DEPENDENCIES = lib/libgtest.la
+am_lib_libgtest_main_la_OBJECTS = src/gtest_main.lo
+lib_libgtest_main_la_OBJECTS = $(am_lib_libgtest_main_la_OBJECTS)
+samples_libsamples_la_LIBADD =
+am_samples_libsamples_la_OBJECTS = samples/sample1.lo \
+	samples/sample2.lo samples/sample4.lo
+samples_libsamples_la_OBJECTS = $(am_samples_libsamples_la_OBJECTS)
+ at HAVE_PYTHON_TRUE@am__EXEEXT_1 = test/fused_gtest_test$(EXEEXT)
+am_samples_sample10_unittest_OBJECTS =  \
+	samples/sample10_unittest.$(OBJEXT)
+samples_sample10_unittest_OBJECTS =  \
+	$(am_samples_sample10_unittest_OBJECTS)
+samples_sample10_unittest_DEPENDENCIES = lib/libgtest.la
+am_samples_sample1_unittest_OBJECTS =  \
+	samples/sample1_unittest.$(OBJEXT)
+samples_sample1_unittest_OBJECTS =  \
+	$(am_samples_sample1_unittest_OBJECTS)
+samples_sample1_unittest_DEPENDENCIES = lib/libgtest_main.la \
+	lib/libgtest.la samples/libsamples.la
+am__test_fused_gtest_test_SOURCES_DIST = fused-src/gtest/gtest-all.cc \
+	fused-src/gtest/gtest.h fused-src/gtest/gtest_main.cc \
+	samples/sample1.cc samples/sample1_unittest.cc
+am__objects_1 =  \
+	fused-src/gtest/test_fused_gtest_test-gtest-all.$(OBJEXT) \
+	fused-src/gtest/test_fused_gtest_test-gtest_main.$(OBJEXT)
+ at HAVE_PYTHON_TRUE@am_test_fused_gtest_test_OBJECTS = $(am__objects_1) \
+ at HAVE_PYTHON_TRUE@	samples/test_fused_gtest_test-sample1.$(OBJEXT) \
+ at HAVE_PYTHON_TRUE@	samples/test_fused_gtest_test-sample1_unittest.$(OBJEXT)
+test_fused_gtest_test_OBJECTS = $(am_test_fused_gtest_test_OBJECTS)
+test_fused_gtest_test_LDADD = $(LDADD)
+am_test_gtest_all_test_OBJECTS = test/gtest_all_test.$(OBJEXT)
+test_gtest_all_test_OBJECTS = $(am_test_gtest_all_test_OBJECTS)
+test_gtest_all_test_DEPENDENCIES = lib/libgtest_main.la \
+	lib/libgtest.la
+DEFAULT_INCLUDES = -I. at am__isrc@ -I$(top_builddir)/build-aux
+depcomp = $(SHELL) $(top_srcdir)/build-aux/depcomp
+am__depfiles_maybe = depfiles
+am__mv = mv -f
+CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+LTCXXCOMPILE = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
+	--mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
+CXXLD = $(CXX)
+CXXLINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
+	--mode=link $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) \
+	$(LDFLAGS) -o $@
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+	$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
+	--mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
+	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+CCLD = $(CC)
+LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
+	--mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \
+	$(LDFLAGS) -o $@
+SOURCES = $(lib_libgtest_la_SOURCES) $(lib_libgtest_main_la_SOURCES) \
+	$(samples_libsamples_la_SOURCES) \
+	$(samples_sample10_unittest_SOURCES) \
+	$(samples_sample1_unittest_SOURCES) \
+	$(test_fused_gtest_test_SOURCES) \
+	$(test_gtest_all_test_SOURCES)
+DIST_SOURCES = $(lib_libgtest_la_SOURCES) \
+	$(lib_libgtest_main_la_SOURCES) \
+	$(samples_libsamples_la_SOURCES) \
+	$(samples_sample10_unittest_SOURCES) \
+	$(samples_sample1_unittest_SOURCES) \
+	$(am__test_fused_gtest_test_SOURCES_DIST) \
+	$(test_gtest_all_test_SOURCES)
+DATA = $(m4data_DATA)
+HEADERS = $(pkginclude_HEADERS) $(pkginclude_internal_HEADERS)
+ETAGS = etags
+CTAGS = ctags
+am__tty_colors = \
+red=; grn=; lgn=; blu=; std=
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+distdir = $(PACKAGE)-$(VERSION)
+top_distdir = $(distdir)
+am__remove_distdir = \
+  if test -d "$(distdir)"; then \
+    find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \
+      && rm -rf "$(distdir)" \
+      || { sleep 5 && rm -rf "$(distdir)"; }; \
+  else :; fi
+DIST_ARCHIVES = $(distdir).tar.gz $(distdir).tar.bz2 $(distdir).zip
+GZIP_ENV = --best
+distuninstallcheck_listfiles = find . -type f -print
+am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \
+  | sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$'
+distcleancheck_listfiles = find . -type f -print
+ACLOCAL = @ACLOCAL@
+AMTAR = @AMTAR@
+AR = @AR@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+CC = @CC@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DUMPBIN = @DUMPBIN@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGREP = @EGREP@
+EXEEXT = @EXEEXT@
+FGREP = @FGREP@
+GREP = @GREP@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBOBJS = @LIBOBJS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LTLIBOBJS = @LTLIBOBJS@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MKDIR_P = @MKDIR_P@
+NM = @NM@
+NMEDIT = @NMEDIT@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PTHREAD_CC = @PTHREAD_CC@
+PTHREAD_CFLAGS = @PTHREAD_CFLAGS@
+PTHREAD_LIBS = @PTHREAD_LIBS@
+PYTHON = @PYTHON@
+RANLIB = @RANLIB@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+STRIP = @STRIP@
+VERSION = @VERSION@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+acx_pthread_config = @acx_pthread_config@
+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 = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+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@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target_alias = @target_alias@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+ACLOCAL_AMFLAGS = -I m4
+
+# Nonstandard package files for distribution
+
+# Sample files that we don't compile.
+
+# C++ test files that we don't compile directly.
+
+# Python tests that we don't run.
+
+# CMake script
+
+# MSVC project files
+
+# xcode project files
+
+# xcode sample files
+
+# C++Builder project files
+EXTRA_DIST = CHANGES CONTRIBUTORS LICENSE \
+	include/gtest/gtest-param-test.h.pump \
+	include/gtest/internal/gtest-param-util-generated.h.pump \
+	include/gtest/internal/gtest-tuple.h.pump \
+	include/gtest/internal/gtest-type-util.h.pump make/Makefile \
+	scripts/fuse_gtest_files.py scripts/gen_gtest_pred_impl.py \
+	scripts/pump.py scripts/test/Makefile $(GTEST_SRC) \
+	samples/prime_tables.h samples/sample2_unittest.cc \
+	samples/sample3_unittest.cc samples/sample4_unittest.cc \
+	samples/sample5_unittest.cc samples/sample6_unittest.cc \
+	samples/sample7_unittest.cc samples/sample8_unittest.cc \
+	samples/sample9_unittest.cc test/gtest-death-test_ex_test.cc \
+	test/gtest-death-test_test.cc test/gtest-filepath_test.cc \
+	test/gtest-linked_ptr_test.cc test/gtest-listener_test.cc \
+	test/gtest-message_test.cc test/gtest-options_test.cc \
+	test/gtest-param-test2_test.cc test/gtest-param-test2_test.cc \
+	test/gtest-param-test_test.cc test/gtest-param-test_test.cc \
+	test/gtest-param-test_test.h test/gtest-port_test.cc \
+	test/gtest_premature_exit_test.cc test/gtest-printers_test.cc \
+	test/gtest-test-part_test.cc test/gtest-tuple_test.cc \
+	test/gtest-typed-test2_test.cc test/gtest-typed-test_test.cc \
+	test/gtest-typed-test_test.h test/gtest-unittest-api_test.cc \
+	test/gtest_break_on_failure_unittest_.cc \
+	test/gtest_catch_exceptions_test_.cc test/gtest_color_test_.cc \
+	test/gtest_env_var_test_.cc test/gtest_environment_test.cc \
+	test/gtest_filter_unittest_.cc test/gtest_help_test_.cc \
+	test/gtest_list_tests_unittest_.cc test/gtest_main_unittest.cc \
+	test/gtest_no_test_unittest.cc test/gtest_output_test_.cc \
+	test/gtest_pred_impl_unittest.cc test/gtest_prod_test.cc \
+	test/gtest_repeat_test.cc test/gtest_shuffle_test_.cc \
+	test/gtest_sole_header_test.cc test/gtest_stress_test.cc \
+	test/gtest_throw_on_failure_ex_test.cc \
+	test/gtest_throw_on_failure_test_.cc \
+	test/gtest_uninitialized_test_.cc test/gtest_unittest.cc \
+	test/gtest_unittest.cc test/gtest_xml_outfile1_test_.cc \
+	test/gtest_xml_outfile2_test_.cc \
+	test/gtest_xml_output_unittest_.cc test/production.cc \
+	test/production.h test/gtest_break_on_failure_unittest.py \
+	test/gtest_catch_exceptions_test.py test/gtest_color_test.py \
+	test/gtest_env_var_test.py test/gtest_filter_unittest.py \
+	test/gtest_help_test.py test/gtest_list_tests_unittest.py \
+	test/gtest_output_test.py \
+	test/gtest_output_test_golden_lin.txt \
+	test/gtest_shuffle_test.py test/gtest_test_utils.py \
+	test/gtest_throw_on_failure_test.py \
+	test/gtest_uninitialized_test.py \
+	test/gtest_xml_outfiles_test.py \
+	test/gtest_xml_output_unittest.py test/gtest_xml_test_utils.py \
+	CMakeLists.txt cmake/internal_utils.cmake msvc/gtest-md.sln \
+	msvc/gtest-md.vcproj msvc/gtest.sln msvc/gtest.vcproj \
+	msvc/gtest_main-md.vcproj msvc/gtest_main.vcproj \
+	msvc/gtest_prod_test-md.vcproj msvc/gtest_prod_test.vcproj \
+	msvc/gtest_unittest-md.vcproj msvc/gtest_unittest.vcproj \
+	xcode/Config/DebugProject.xcconfig \
+	xcode/Config/FrameworkTarget.xcconfig \
+	xcode/Config/General.xcconfig \
+	xcode/Config/ReleaseProject.xcconfig \
+	xcode/Config/StaticLibraryTarget.xcconfig \
+	xcode/Config/TestTarget.xcconfig xcode/Resources/Info.plist \
+	xcode/Scripts/runtests.sh xcode/Scripts/versiongenerate.py \
+	xcode/gtest.xcodeproj/project.pbxproj \
+	xcode/Samples/FrameworkSample/Info.plist \
+	xcode/Samples/FrameworkSample/WidgetFramework.xcodeproj/project.pbxproj \
+	xcode/Samples/FrameworkSample/runtests.sh \
+	xcode/Samples/FrameworkSample/widget.cc \
+	xcode/Samples/FrameworkSample/widget.h \
+	xcode/Samples/FrameworkSample/widget_test.cc \
+	codegear/gtest.cbproj codegear/gtest.groupproj \
+	codegear/gtest_all.cc codegear/gtest_link.cc \
+	codegear/gtest_main.cbproj codegear/gtest_unittest.cbproj \
+	$(m4data_DATA)
+
+# gtest source files that we don't compile directly.  They are
+# #included by gtest-all.cc.
+GTEST_SRC = \
+  src/gtest-death-test.cc \
+  src/gtest-filepath.cc \
+  src/gtest-internal-inl.h \
+  src/gtest-port.cc \
+  src/gtest-printers.cc \
+  src/gtest-test-part.cc \
+  src/gtest-typed-test.cc \
+  src/gtest.cc
+
+
+# Distribute and install M4 macro
+m4datadir = $(datadir)/aclocal
+m4data_DATA = m4/gtest.m4
+
+# We define the global AM_CPPFLAGS as everything we compile includes from these
+# directories.
+AM_CPPFLAGS = -I$(srcdir) -I$(srcdir)/include
+ at HAVE_PTHREADS_FALSE@AM_CXXFLAGS = -DGTEST_HAS_PTHREAD=0
+
+# Modifies compiler and linker flags for pthreads compatibility.
+ at HAVE_PTHREADS_TRUE@AM_CXXFLAGS = @PTHREAD_CFLAGS@ -DGTEST_HAS_PTHREAD=1
+ at HAVE_PTHREADS_TRUE@AM_LIBS = @PTHREAD_LIBS@
+
+# Build rules for libraries.
+lib_LTLIBRARIES = lib/libgtest.la lib/libgtest_main.la
+lib_libgtest_la_SOURCES = src/gtest-all.cc
+pkginclude_HEADERS = \
+  include/gtest/gtest-death-test.h \
+  include/gtest/gtest-message.h \
+  include/gtest/gtest-param-test.h \
+  include/gtest/gtest-printers.h \
+  include/gtest/gtest-spi.h \
+  include/gtest/gtest-test-part.h \
+  include/gtest/gtest-typed-test.h \
+  include/gtest/gtest.h \
+  include/gtest/gtest_pred_impl.h \
+  include/gtest/gtest_prod.h
+
+pkginclude_internaldir = $(pkgincludedir)/internal
+pkginclude_internal_HEADERS = \
+  include/gtest/internal/gtest-death-test-internal.h \
+  include/gtest/internal/gtest-filepath.h \
+  include/gtest/internal/gtest-internal.h \
+  include/gtest/internal/gtest-linked_ptr.h \
+  include/gtest/internal/gtest-param-util-generated.h \
+  include/gtest/internal/gtest-param-util.h \
+  include/gtest/internal/gtest-port.h \
+  include/gtest/internal/gtest-string.h \
+  include/gtest/internal/gtest-tuple.h \
+  include/gtest/internal/gtest-type-util.h
+
+lib_libgtest_main_la_SOURCES = src/gtest_main.cc
+lib_libgtest_main_la_LIBADD = lib/libgtest.la
+
+# Bulid rules for samples and tests. Automake's naming for some of
+# these variables isn't terribly obvious, so this is a brief
+# reference:
+#
+# TESTS -- Programs run automatically by "make check"
+# check_PROGRAMS -- Programs built by "make check" but not necessarily run
+noinst_LTLIBRARIES = samples/libsamples.la
+samples_libsamples_la_SOURCES = \
+  samples/sample1.cc \
+  samples/sample1.h \
+  samples/sample2.cc \
+  samples/sample2.h \
+  samples/sample3-inl.h \
+  samples/sample4.cc \
+  samples/sample4.h
+
+TESTS_ENVIRONMENT = GTEST_SOURCE_DIR="$(srcdir)/test" \
+                    GTEST_BUILD_DIR="$(top_builddir)/test"
+
+samples_sample1_unittest_SOURCES = samples/sample1_unittest.cc
+samples_sample1_unittest_LDADD = lib/libgtest_main.la \
+                                 lib/libgtest.la \
+                                 samples/libsamples.la
+
+samples_sample10_unittest_SOURCES = samples/sample10_unittest.cc
+samples_sample10_unittest_LDADD = lib/libgtest.la
+test_gtest_all_test_SOURCES = test/gtest_all_test.cc
+test_gtest_all_test_LDADD = lib/libgtest_main.la \
+                            lib/libgtest.la
+
+
+# Tests that fused gtest files compile and work.
+FUSED_GTEST_SRC = \
+  fused-src/gtest/gtest-all.cc \
+  fused-src/gtest/gtest.h \
+  fused-src/gtest/gtest_main.cc
+
+ at HAVE_PYTHON_TRUE@test_fused_gtest_test_SOURCES = $(FUSED_GTEST_SRC) \
+ at HAVE_PYTHON_TRUE@                                samples/sample1.cc samples/sample1_unittest.cc
+
+ at HAVE_PYTHON_TRUE@test_fused_gtest_test_CPPFLAGS = -I"$(srcdir)/fused-src"
+
+# Death tests may produce core dumps in the build directory. In case
+# this happens, clean them to keep distcleancheck happy.
+CLEANFILES = core
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .cc .lo .o .obj
+am--refresh: Makefile
+	@:
+$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      echo ' cd $(srcdir) && $(AUTOMAKE) --foreign'; \
+	      $(am__cd) $(srcdir) && $(AUTOMAKE) --foreign \
+		&& exit 0; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --foreign 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:  $(am__configure_deps)
+	$(am__cd) $(srcdir) && $(AUTOCONF)
+$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
+	$(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS)
+$(am__aclocal_m4_deps):
+
+build-aux/config.h: build-aux/stamp-h1
+	@if test ! -f $@; then rm -f build-aux/stamp-h1; else :; fi
+	@if test ! -f $@; then $(MAKE) $(AM_MAKEFLAGS) build-aux/stamp-h1; else :; fi
+
+build-aux/stamp-h1: $(top_srcdir)/build-aux/config.h.in $(top_builddir)/config.status
+	@rm -f build-aux/stamp-h1
+	cd $(top_builddir) && $(SHELL) ./config.status build-aux/config.h
+$(top_srcdir)/build-aux/config.h.in:  $(am__configure_deps) 
+	($(am__cd) $(top_srcdir) && $(AUTOHEADER))
+	rm -f build-aux/stamp-h1
+	touch $@
+
+distclean-hdr:
+	-rm -f build-aux/config.h build-aux/stamp-h1
+scripts/gtest-config: $(top_builddir)/config.status $(top_srcdir)/scripts/gtest-config.in
+	cd $(top_builddir) && $(SHELL) ./config.status $@
+install-libLTLIBRARIES: $(lib_LTLIBRARIES)
+	@$(NORMAL_INSTALL)
+	test -z "$(libdir)" || $(MKDIR_P) "$(DESTDIR)$(libdir)"
+	@list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \
+	list2=; for p in $$list; do \
+	  if test -f $$p; then \
+	    list2="$$list2 $$p"; \
+	  else :; fi; \
+	done; \
+	test -z "$$list2" || { \
+	  echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \
+	  $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \
+	}
+
+uninstall-libLTLIBRARIES:
+	@$(NORMAL_UNINSTALL)
+	@list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \
+	for p in $$list; do \
+	  $(am__strip_dir) \
+	  echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \
+	  $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \
+	done
+
+clean-libLTLIBRARIES:
+	-test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES)
+	@list='$(lib_LTLIBRARIES)'; for p in $$list; do \
+	  dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
+	  test "$$dir" != "$$p" || dir=.; \
+	  echo "rm -f \"$${dir}/so_locations\""; \
+	  rm -f "$${dir}/so_locations"; \
+	done
+
+clean-noinstLTLIBRARIES:
+	-test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES)
+	@list='$(noinst_LTLIBRARIES)'; for p in $$list; do \
+	  dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
+	  test "$$dir" != "$$p" || dir=.; \
+	  echo "rm -f \"$${dir}/so_locations\""; \
+	  rm -f "$${dir}/so_locations"; \
+	done
+src/$(am__dirstamp):
+	@$(MKDIR_P) src
+	@: > src/$(am__dirstamp)
+src/$(DEPDIR)/$(am__dirstamp):
+	@$(MKDIR_P) src/$(DEPDIR)
+	@: > src/$(DEPDIR)/$(am__dirstamp)
+src/gtest-all.lo: src/$(am__dirstamp) src/$(DEPDIR)/$(am__dirstamp)
+lib/$(am__dirstamp):
+	@$(MKDIR_P) lib
+	@: > lib/$(am__dirstamp)
+lib/libgtest.la: $(lib_libgtest_la_OBJECTS) $(lib_libgtest_la_DEPENDENCIES) $(EXTRA_lib_libgtest_la_DEPENDENCIES) lib/$(am__dirstamp)
+	$(CXXLINK) -rpath $(libdir) $(lib_libgtest_la_OBJECTS) $(lib_libgtest_la_LIBADD) $(LIBS)
+src/gtest_main.lo: src/$(am__dirstamp) src/$(DEPDIR)/$(am__dirstamp)
+lib/libgtest_main.la: $(lib_libgtest_main_la_OBJECTS) $(lib_libgtest_main_la_DEPENDENCIES) $(EXTRA_lib_libgtest_main_la_DEPENDENCIES) lib/$(am__dirstamp)
+	$(CXXLINK) -rpath $(libdir) $(lib_libgtest_main_la_OBJECTS) $(lib_libgtest_main_la_LIBADD) $(LIBS)
+samples/$(am__dirstamp):
+	@$(MKDIR_P) samples
+	@: > samples/$(am__dirstamp)
+samples/$(DEPDIR)/$(am__dirstamp):
+	@$(MKDIR_P) samples/$(DEPDIR)
+	@: > samples/$(DEPDIR)/$(am__dirstamp)
+samples/sample1.lo: samples/$(am__dirstamp) \
+	samples/$(DEPDIR)/$(am__dirstamp)
+samples/sample2.lo: samples/$(am__dirstamp) \
+	samples/$(DEPDIR)/$(am__dirstamp)
+samples/sample4.lo: samples/$(am__dirstamp) \
+	samples/$(DEPDIR)/$(am__dirstamp)
+samples/libsamples.la: $(samples_libsamples_la_OBJECTS) $(samples_libsamples_la_DEPENDENCIES) $(EXTRA_samples_libsamples_la_DEPENDENCIES) samples/$(am__dirstamp)
+	$(CXXLINK)  $(samples_libsamples_la_OBJECTS) $(samples_libsamples_la_LIBADD) $(LIBS)
+
+clean-checkPROGRAMS:
+	@list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \
+	echo " rm -f" $$list; \
+	rm -f $$list || exit $$?; \
+	test -n "$(EXEEXT)" || exit 0; \
+	list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
+	echo " rm -f" $$list; \
+	rm -f $$list
+samples/sample10_unittest.$(OBJEXT): samples/$(am__dirstamp) \
+	samples/$(DEPDIR)/$(am__dirstamp)
+samples/sample10_unittest$(EXEEXT): $(samples_sample10_unittest_OBJECTS) $(samples_sample10_unittest_DEPENDENCIES) $(EXTRA_samples_sample10_unittest_DEPENDENCIES) samples/$(am__dirstamp)
+	@rm -f samples/sample10_unittest$(EXEEXT)
+	$(CXXLINK) $(samples_sample10_unittest_OBJECTS) $(samples_sample10_unittest_LDADD) $(LIBS)
+samples/sample1_unittest.$(OBJEXT): samples/$(am__dirstamp) \
+	samples/$(DEPDIR)/$(am__dirstamp)
+samples/sample1_unittest$(EXEEXT): $(samples_sample1_unittest_OBJECTS) $(samples_sample1_unittest_DEPENDENCIES) $(EXTRA_samples_sample1_unittest_DEPENDENCIES) samples/$(am__dirstamp)
+	@rm -f samples/sample1_unittest$(EXEEXT)
+	$(CXXLINK) $(samples_sample1_unittest_OBJECTS) $(samples_sample1_unittest_LDADD) $(LIBS)
+fused-src/gtest/$(am__dirstamp):
+	@$(MKDIR_P) fused-src/gtest
+	@: > fused-src/gtest/$(am__dirstamp)
+fused-src/gtest/$(DEPDIR)/$(am__dirstamp):
+	@$(MKDIR_P) fused-src/gtest/$(DEPDIR)
+	@: > fused-src/gtest/$(DEPDIR)/$(am__dirstamp)
+fused-src/gtest/test_fused_gtest_test-gtest-all.$(OBJEXT):  \
+	fused-src/gtest/$(am__dirstamp) \
+	fused-src/gtest/$(DEPDIR)/$(am__dirstamp)
+fused-src/gtest/test_fused_gtest_test-gtest_main.$(OBJEXT):  \
+	fused-src/gtest/$(am__dirstamp) \
+	fused-src/gtest/$(DEPDIR)/$(am__dirstamp)
+samples/test_fused_gtest_test-sample1.$(OBJEXT):  \
+	samples/$(am__dirstamp) samples/$(DEPDIR)/$(am__dirstamp)
+samples/test_fused_gtest_test-sample1_unittest.$(OBJEXT):  \
+	samples/$(am__dirstamp) samples/$(DEPDIR)/$(am__dirstamp)
+test/$(am__dirstamp):
+	@$(MKDIR_P) test
+	@: > test/$(am__dirstamp)
+test/fused_gtest_test$(EXEEXT): $(test_fused_gtest_test_OBJECTS) $(test_fused_gtest_test_DEPENDENCIES) $(EXTRA_test_fused_gtest_test_DEPENDENCIES) test/$(am__dirstamp)
+	@rm -f test/fused_gtest_test$(EXEEXT)
+	$(CXXLINK) $(test_fused_gtest_test_OBJECTS) $(test_fused_gtest_test_LDADD) $(LIBS)
+test/$(DEPDIR)/$(am__dirstamp):
+	@$(MKDIR_P) test/$(DEPDIR)
+	@: > test/$(DEPDIR)/$(am__dirstamp)
+test/gtest_all_test.$(OBJEXT): test/$(am__dirstamp) \
+	test/$(DEPDIR)/$(am__dirstamp)
+test/gtest_all_test$(EXEEXT): $(test_gtest_all_test_OBJECTS) $(test_gtest_all_test_DEPENDENCIES) $(EXTRA_test_gtest_all_test_DEPENDENCIES) test/$(am__dirstamp)
+	@rm -f test/gtest_all_test$(EXEEXT)
+	$(CXXLINK) $(test_gtest_all_test_OBJECTS) $(test_gtest_all_test_LDADD) $(LIBS)
+
+mostlyclean-compile:
+	-rm -f *.$(OBJEXT)
+	-rm -f fused-src/gtest/test_fused_gtest_test-gtest-all.$(OBJEXT)
+	-rm -f fused-src/gtest/test_fused_gtest_test-gtest_main.$(OBJEXT)
+	-rm -f samples/sample1.$(OBJEXT)
+	-rm -f samples/sample1.lo
+	-rm -f samples/sample10_unittest.$(OBJEXT)
+	-rm -f samples/sample1_unittest.$(OBJEXT)
+	-rm -f samples/sample2.$(OBJEXT)
+	-rm -f samples/sample2.lo
+	-rm -f samples/sample4.$(OBJEXT)
+	-rm -f samples/sample4.lo
+	-rm -f samples/test_fused_gtest_test-sample1.$(OBJEXT)
+	-rm -f samples/test_fused_gtest_test-sample1_unittest.$(OBJEXT)
+	-rm -f src/gtest-all.$(OBJEXT)
+	-rm -f src/gtest-all.lo
+	-rm -f src/gtest_main.$(OBJEXT)
+	-rm -f src/gtest_main.lo
+	-rm -f test/gtest_all_test.$(OBJEXT)
+
+distclean-compile:
+	-rm -f *.tab.c
+
+ at AMDEP_TRUE@@am__include@ @am__quote at fused-src/gtest/$(DEPDIR)/test_fused_gtest_test-gtest-all.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at fused-src/gtest/$(DEPDIR)/test_fused_gtest_test-gtest_main.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at samples/$(DEPDIR)/sample1.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at samples/$(DEPDIR)/sample10_unittest.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at samples/$(DEPDIR)/sample1_unittest.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at samples/$(DEPDIR)/sample2.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at samples/$(DEPDIR)/sample4.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at samples/$(DEPDIR)/test_fused_gtest_test-sample1.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at samples/$(DEPDIR)/test_fused_gtest_test-sample1_unittest.Po at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at src/$(DEPDIR)/gtest-all.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at src/$(DEPDIR)/gtest_main.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at test/$(DEPDIR)/gtest_all_test.Po at am__quote@
+
+.cc.o:
+ at am__fastdepCXX_TRUE@	depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\
+ at am__fastdepCXX_TRUE@	$(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+ at am__fastdepCXX_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXXCOMPILE) -c -o $@ $<
+
+.cc.obj:
+ at am__fastdepCXX_TRUE@	depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\
+ at am__fastdepCXX_TRUE@	$(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\
+ at am__fastdepCXX_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.cc.lo:
+ at am__fastdepCXX_TRUE@	depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\
+ at am__fastdepCXX_TRUE@	$(LTCXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+ at am__fastdepCXX_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.Plo
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(LTCXXCOMPILE) -c -o $@ $<
+
+fused-src/gtest/test_fused_gtest_test-gtest-all.o: fused-src/gtest/gtest-all.cc
+ at am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_fused_gtest_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT fused-src/gtest/test_fused_gtest_test-gtest-all.o -MD -MP -MF fused-src/gtest/$(DEPDIR)/test_fused_gtest_test-gtest-all.Tpo -c -o fused-src/gtest/test_fused_gtest_test-gtest-all.o `test -f 'fused-src/gtest/gtest-all.cc' || echo '$(srcdir)/'`fused-src/gtest/gtest-all.cc
+ at am__fastdepCXX_TRUE@	$(am__mv) fused-src/gtest/$(DEPDIR)/test_fused_gtest_test-gtest-all.Tpo fused-src/gtest/$(DEPDIR)/test_fused_gtest_test-gtest-all.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='fused-src/gtest/gtest-all.cc' object='fused-src/gtest/test_fused_gtest_test-gtest-all.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_fused_gtest_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o fused-src/gtest/test_fused_gtest_test-gtest-all.o `test -f 'fused-src/gtest/gtest-all.cc' || echo '$(srcdir)/'`fused-src/gtest/gtest-all.cc
+
+fused-src/gtest/test_fused_gtest_test-gtest-all.obj: fused-src/gtest/gtest-all.cc
+ at am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_fused_gtest_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT fused-src/gtest/test_fused_gtest_test-gtest-all.obj -MD -MP -MF fused-src/gtest/$(DEPDIR)/test_fused_gtest_test-gtest-all.Tpo -c -o fused-src/gtest/test_fused_gtest_test-gtest-all.obj `if test -f 'fused-src/gtest/gtest-all.cc'; then $(CYGPATH_W) 'fused-src/gtest/gtest-all.cc'; else $(CYGPATH_W) '$(srcdir)/fused-src/gtest/gtest-all.cc'; fi`
+ at am__fastdepCXX_TRUE@	$(am__mv) fused-src/gtest/$(DEPDIR)/test_fused_gtest_test-gtest-all.Tpo fused-src/gtest/$(DEPDIR)/test_fused_gtest_test-gtest-all.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='fused-src/gtest/gtest-all.cc' object='fused-src/gtest/test_fused_gtest_test-gtest-all.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_fused_gtest_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o fused-src/gtest/test_fused_gtest_test-gtest-all.obj `if test -f 'fused-src/gtest/gtest-all.cc'; then $(CYGPATH_W) 'fused-src/gtest/gtest-all.cc'; else $(CYGPATH_W) '$(srcdir)/fused-src/gtest/gtest-all.cc'; fi`
+
+fused-src/gtest/test_fused_gtest_test-gtest_main.o: fused-src/gtest/gtest_main.cc
+ at am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_fused_gtest_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT fused-src/gtest/test_fused_gtest_test-gtest_main.o -MD -MP -MF fused-src/gtest/$(DEPDIR)/test_fused_gtest_test-gtest_main.Tpo -c -o fused-src/gtest/test_fused_gtest_test-gtest_main.o `test -f 'fused-src/gtest/gtest_main.cc' || echo '$(srcdir)/'`fused-src/gtest/gtest_main.cc
+ at am__fastdepCXX_TRUE@	$(am__mv) fused-src/gtest/$(DEPDIR)/test_fused_gtest_test-gtest_main.Tpo fused-src/gtest/$(DEPDIR)/test_fused_gtest_test-gtest_main.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='fused-src/gtest/gtest_main.cc' object='fused-src/gtest/test_fused_gtest_test-gtest_main.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_fused_gtest_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o fused-src/gtest/test_fused_gtest_test-gtest_main.o `test -f 'fused-src/gtest/gtest_main.cc' || echo '$(srcdir)/'`fused-src/gtest/gtest_main.cc
+
+fused-src/gtest/test_fused_gtest_test-gtest_main.obj: fused-src/gtest/gtest_main.cc
+ at am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_fused_gtest_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT fused-src/gtest/test_fused_gtest_test-gtest_main.obj -MD -MP -MF fused-src/gtest/$(DEPDIR)/test_fused_gtest_test-gtest_main.Tpo -c -o fused-src/gtest/test_fused_gtest_test-gtest_main.obj `if test -f 'fused-src/gtest/gtest_main.cc'; then $(CYGPATH_W) 'fused-src/gtest/gtest_main.cc'; else $(CYGPATH_W) '$(srcdir)/fused-src/gtest/gtest_main.cc'; fi`
+ at am__fastdepCXX_TRUE@	$(am__mv) fused-src/gtest/$(DEPDIR)/test_fused_gtest_test-gtest_main.Tpo fused-src/gtest/$(DEPDIR)/test_fused_gtest_test-gtest_main.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='fused-src/gtest/gtest_main.cc' object='fused-src/gtest/test_fused_gtest_test-gtest_main.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_fused_gtest_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o fused-src/gtest/test_fused_gtest_test-gtest_main.obj `if test -f 'fused-src/gtest/gtest_main.cc'; then $(CYGPATH_W) 'fused-src/gtest/gtest_main.cc'; else $(CYGPATH_W) '$(srcdir)/fused-src/gtest/gtest_main.cc'; fi`
+
+samples/test_fused_gtest_test-sample1.o: samples/sample1.cc
+ at am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_fused_gtest_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT samples/test_fused_gtest_test-sample1.o -MD -MP -MF samples/$(DEPDIR)/test_fused_gtest_test-sample1.Tpo -c -o samples/test_fused_gtest_test-sample1.o `test -f 'samples/sample1.cc' || echo '$(srcdir)/'`samples/sample1.cc
+ at am__fastdepCXX_TRUE@	$(am__mv) samples/$(DEPDIR)/test_fused_gtest_test-sample1.Tpo samples/$(DEPDIR)/test_fused_gtest_test-sample1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='samples/sample1.cc' object='samples/test_fused_gtest_test-sample1.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_fused_gtest_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o samples/test_fused_gtest_test-sample1.o `test -f 'samples/sample1.cc' || echo '$(srcdir)/'`samples/sample1.cc
+
+samples/test_fused_gtest_test-sample1.obj: samples/sample1.cc
+ at am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_fused_gtest_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT samples/test_fused_gtest_test-sample1.obj -MD -MP -MF samples/$(DEPDIR)/test_fused_gtest_test-sample1.Tpo -c -o samples/test_fused_gtest_test-sample1.obj `if test -f 'samples/sample1.cc'; then $(CYGPATH_W) 'samples/sample1.cc'; else $(CYGPATH_W) '$(srcdir)/samples/sample1.cc'; fi`
+ at am__fastdepCXX_TRUE@	$(am__mv) samples/$(DEPDIR)/test_fused_gtest_test-sample1.Tpo samples/$(DEPDIR)/test_fused_gtest_test-sample1.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='samples/sample1.cc' object='samples/test_fused_gtest_test-sample1.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_fused_gtest_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o samples/test_fused_gtest_test-sample1.obj `if test -f 'samples/sample1.cc'; then $(CYGPATH_W) 'samples/sample1.cc'; else $(CYGPATH_W) '$(srcdir)/samples/sample1.cc'; fi`
+
+samples/test_fused_gtest_test-sample1_unittest.o: samples/sample1_unittest.cc
+ at am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_fused_gtest_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT samples/test_fused_gtest_test-sample1_unittest.o -MD -MP -MF samples/$(DEPDIR)/test_fused_gtest_test-sample1_unittest.Tpo -c -o samples/test_fused_gtest_test-sample1_unittest.o `test -f 'samples/sample1_unittest.cc' || echo '$(srcdir)/'`samples/sample1_unittest.cc
+ at am__fastdepCXX_TRUE@	$(am__mv) samples/$(DEPDIR)/test_fused_gtest_test-sample1_unittest.Tpo samples/$(DEPDIR)/test_fused_gtest_test-sample1_unittest.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='samples/sample1_unittest.cc' object='samples/test_fused_gtest_test-sample1_unittest.o' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_fused_gtest_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o samples/test_fused_gtest_test-sample1_unittest.o `test -f 'samples/sample1_unittest.cc' || echo '$(srcdir)/'`samples/sample1_unittest.cc
+
+samples/test_fused_gtest_test-sample1_unittest.obj: samples/sample1_unittest.cc
+ at am__fastdepCXX_TRUE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_fused_gtest_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT samples/test_fused_gtest_test-sample1_unittest.obj -MD -MP -MF samples/$(DEPDIR)/test_fused_gtest_test-sample1_unittest.Tpo -c -o samples/test_fused_gtest_test-sample1_unittest.obj `if test -f 'samples/sample1_unittest.cc'; then $(CYGPATH_W) 'samples/sample1_unittest.cc'; else $(CYGPATH_W) '$(srcdir)/samples/sample1_unittest.cc'; fi`
+ at am__fastdepCXX_TRUE@	$(am__mv) samples/$(DEPDIR)/test_fused_gtest_test-sample1_unittest.Tpo samples/$(DEPDIR)/test_fused_gtest_test-sample1_unittest.Po
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	source='samples/sample1_unittest.cc' object='samples/test_fused_gtest_test-sample1_unittest.obj' libtool=no @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCXX_FALSE@	$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(test_fused_gtest_test_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o samples/test_fused_gtest_test-sample1_unittest.obj `if test -f 'samples/sample1_unittest.cc'; then $(CYGPATH_W) 'samples/sample1_unittest.cc'; else $(CYGPATH_W) '$(srcdir)/samples/sample1_unittest.cc'; fi`
+
+mostlyclean-libtool:
+	-rm -f *.lo
+
+clean-libtool:
+	-rm -rf .libs _libs
+	-rm -rf lib/.libs lib/_libs
+	-rm -rf samples/.libs samples/_libs
+	-rm -rf src/.libs src/_libs
+	-rm -rf test/.libs test/_libs
+
+distclean-libtool:
+	-rm -f libtool config.lt
+install-m4dataDATA: $(m4data_DATA)
+	@$(NORMAL_INSTALL)
+	test -z "$(m4datadir)" || $(MKDIR_P) "$(DESTDIR)$(m4datadir)"
+	@list='$(m4data_DATA)'; test -n "$(m4datadir)" || list=; \
+	for p in $$list; do \
+	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+	  echo "$$d$$p"; \
+	done | $(am__base_list) | \
+	while read files; do \
+	  echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(m4datadir)'"; \
+	  $(INSTALL_DATA) $$files "$(DESTDIR)$(m4datadir)" || exit $$?; \
+	done
+
+uninstall-m4dataDATA:
+	@$(NORMAL_UNINSTALL)
+	@list='$(m4data_DATA)'; test -n "$(m4datadir)" || list=; \
+	files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+	dir='$(DESTDIR)$(m4datadir)'; $(am__uninstall_files_from_dir)
+install-pkgincludeHEADERS: $(pkginclude_HEADERS)
+	@$(NORMAL_INSTALL)
+	test -z "$(pkgincludedir)" || $(MKDIR_P) "$(DESTDIR)$(pkgincludedir)"
+	@list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \
+	for p in $$list; do \
+	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+	  echo "$$d$$p"; \
+	done | $(am__base_list) | \
+	while read files; do \
+	  echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(pkgincludedir)'"; \
+	  $(INSTALL_HEADER) $$files "$(DESTDIR)$(pkgincludedir)" || exit $$?; \
+	done
+
+uninstall-pkgincludeHEADERS:
+	@$(NORMAL_UNINSTALL)
+	@list='$(pkginclude_HEADERS)'; test -n "$(pkgincludedir)" || list=; \
+	files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+	dir='$(DESTDIR)$(pkgincludedir)'; $(am__uninstall_files_from_dir)
+install-pkginclude_internalHEADERS: $(pkginclude_internal_HEADERS)
+	@$(NORMAL_INSTALL)
+	test -z "$(pkginclude_internaldir)" || $(MKDIR_P) "$(DESTDIR)$(pkginclude_internaldir)"
+	@list='$(pkginclude_internal_HEADERS)'; test -n "$(pkginclude_internaldir)" || list=; \
+	for p in $$list; do \
+	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+	  echo "$$d$$p"; \
+	done | $(am__base_list) | \
+	while read files; do \
+	  echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(pkginclude_internaldir)'"; \
+	  $(INSTALL_HEADER) $$files "$(DESTDIR)$(pkginclude_internaldir)" || exit $$?; \
+	done
+
+uninstall-pkginclude_internalHEADERS:
+	@$(NORMAL_UNINSTALL)
+	@list='$(pkginclude_internal_HEADERS)'; test -n "$(pkginclude_internaldir)" || list=; \
+	files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+	dir='$(DESTDIR)$(pkginclude_internaldir)'; $(am__uninstall_files_from_dir)
+
+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; nonempty = 1; } \
+	      END { if (nonempty) { for (i in files) print i; }; }'`; \
+	mkid -fID $$unique
+tags: TAGS
+
+TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+		$(TAGS_FILES) $(LISP)
+	set x; \
+	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; nonempty = 1; } \
+	      END { if (nonempty) { for (i in files) print i; }; }'`; \
+	shift; \
+	if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+	  test -n "$$unique" || unique=$$empty_fix; \
+	  if test $$# -gt 0; then \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      "$$@" $$unique; \
+	  else \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      $$unique; \
+	  fi; \
+	fi
+ctags: CTAGS
+CTAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
+		$(TAGS_FILES) $(LISP)
+	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; nonempty = 1; } \
+	      END { if (nonempty) { for (i in files) print i; }; }'`; \
+	test -z "$(CTAGS_ARGS)$$unique" \
+	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+	     $$unique
+
+GTAGS:
+	here=`$(am__cd) $(top_builddir) && pwd` \
+	  && $(am__cd) $(top_srcdir) \
+	  && gtags -i $(GTAGS_ARGS) "$$here"
+
+distclean-tags:
+	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+check-TESTS: $(TESTS)
+	@failed=0; all=0; xfail=0; xpass=0; skip=0; \
+	srcdir=$(srcdir); export srcdir; \
+	list=' $(TESTS) '; \
+	$(am__tty_colors); \
+	if test -n "$$list"; then \
+	  for tst in $$list; do \
+	    if test -f ./$$tst; then dir=./; \
+	    elif test -f $$tst; then dir=; \
+	    else dir="$(srcdir)/"; fi; \
+	    if $(TESTS_ENVIRONMENT) $${dir}$$tst; then \
+	      all=`expr $$all + 1`; \
+	      case " $(XFAIL_TESTS) " in \
+	      *[\ \	]$$tst[\ \	]*) \
+		xpass=`expr $$xpass + 1`; \
+		failed=`expr $$failed + 1`; \
+		col=$$red; res=XPASS; \
+	      ;; \
+	      *) \
+		col=$$grn; res=PASS; \
+	      ;; \
+	      esac; \
+	    elif test $$? -ne 77; then \
+	      all=`expr $$all + 1`; \
+	      case " $(XFAIL_TESTS) " in \
+	      *[\ \	]$$tst[\ \	]*) \
+		xfail=`expr $$xfail + 1`; \
+		col=$$lgn; res=XFAIL; \
+	      ;; \
+	      *) \
+		failed=`expr $$failed + 1`; \
+		col=$$red; res=FAIL; \
+	      ;; \
+	      esac; \
+	    else \
+	      skip=`expr $$skip + 1`; \
+	      col=$$blu; res=SKIP; \
+	    fi; \
+	    echo "$${col}$$res$${std}: $$tst"; \
+	  done; \
+	  if test "$$all" -eq 1; then \
+	    tests="test"; \
+	    All=""; \
+	  else \
+	    tests="tests"; \
+	    All="All "; \
+	  fi; \
+	  if test "$$failed" -eq 0; then \
+	    if test "$$xfail" -eq 0; then \
+	      banner="$$All$$all $$tests passed"; \
+	    else \
+	      if test "$$xfail" -eq 1; then failures=failure; else failures=failures; fi; \
+	      banner="$$All$$all $$tests behaved as expected ($$xfail expected $$failures)"; \
+	    fi; \
+	  else \
+	    if test "$$xpass" -eq 0; then \
+	      banner="$$failed of $$all $$tests failed"; \
+	    else \
+	      if test "$$xpass" -eq 1; then passes=pass; else passes=passes; fi; \
+	      banner="$$failed of $$all $$tests did not behave as expected ($$xpass unexpected $$passes)"; \
+	    fi; \
+	  fi; \
+	  dashes="$$banner"; \
+	  skipped=""; \
+	  if test "$$skip" -ne 0; then \
+	    if test "$$skip" -eq 1; then \
+	      skipped="($$skip test was not run)"; \
+	    else \
+	      skipped="($$skip tests were not run)"; \
+	    fi; \
+	    test `echo "$$skipped" | wc -c` -le `echo "$$banner" | wc -c` || \
+	      dashes="$$skipped"; \
+	  fi; \
+	  report=""; \
+	  if test "$$failed" -ne 0 && test -n "$(PACKAGE_BUGREPORT)"; then \
+	    report="Please report to $(PACKAGE_BUGREPORT)"; \
+	    test `echo "$$report" | wc -c` -le `echo "$$banner" | wc -c` || \
+	      dashes="$$report"; \
+	  fi; \
+	  dashes=`echo "$$dashes" | sed s/./=/g`; \
+	  if test "$$failed" -eq 0; then \
+	    col="$$grn"; \
+	  else \
+	    col="$$red"; \
+	  fi; \
+	  echo "$${col}$$dashes$${std}"; \
+	  echo "$${col}$$banner$${std}"; \
+	  test -z "$$skipped" || echo "$${col}$$skipped$${std}"; \
+	  test -z "$$report" || echo "$${col}$$report$${std}"; \
+	  echo "$${col}$$dashes$${std}"; \
+	  test "$$failed" -eq 0; \
+	else :; fi
+
+distdir: $(DISTFILES)
+	$(am__remove_distdir)
+	test -d "$(distdir)" || mkdir "$(distdir)"
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+	  else \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
+	    || exit 1; \
+	  fi; \
+	done
+	-test -n "$(am__skip_mode_fix)" \
+	|| find "$(distdir)" -type d ! -perm -755 \
+		-exec chmod u+rwx,go+rx {} \; -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 $(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=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2
+	$(am__remove_distdir)
+
+dist-lzip: distdir
+	tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz
+	$(am__remove_distdir)
+
+dist-lzma: distdir
+	tardir=$(distdir) && $(am__tar) | lzma -9 -c >$(distdir).tar.lzma
+	$(am__remove_distdir)
+
+dist-xz: distdir
+	tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz
+	$(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
+	tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2
+	-rm -f $(distdir).zip
+	zip -rq $(distdir).zip $(distdir)
+	$(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) gzip -dc $(distdir).tar.gz | $(am__untar) ;;\
+	*.tar.bz2*) \
+	  bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\
+	*.tar.lzma*) \
+	  lzma -dc $(distdir).tar.lzma | $(am__untar) ;;\
+	*.tar.lz*) \
+	  lzip -dc $(distdir).tar.lz | $(am__untar) ;;\
+	*.tar.xz*) \
+	  xz -dc $(distdir).tar.xz | $(am__untar) ;;\
+	*.tar.Z*) \
+	  uncompress -c $(distdir).tar.Z | $(am__untar) ;;\
+	*.shar.gz*) \
+	  GZIP=$(GZIP_ENV) gzip -dc $(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)
+	test -d $(distdir)/_build || exit 0; \
+	dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \
+	  && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \
+	  && am__cwd=`pwd` \
+	  && $(am__cd) $(distdir)/_build \
+	  && ../configure --srcdir=.. --prefix="$$dc_install_base" \
+	    $(AM_DISTCHECK_CONFIGURE_FLAGS) \
+	    $(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 \
+	  && cd "$$am__cwd" \
+	  || exit 1
+	$(am__remove_distdir)
+	@(echo "$(distdir) archives ready for distribution: "; \
+	  list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \
+	  sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x'
+distuninstallcheck:
+	@test -n '$(distuninstallcheck_dir)' || { \
+	  echo 'ERROR: trying to run $@ with an empty' \
+	       '$$(distuninstallcheck_dir)' >&2; \
+	  exit 1; \
+	}; \
+	$(am__cd) '$(distuninstallcheck_dir)' || { \
+	  echo 'ERROR: cannot chdir into $(distuninstallcheck_dir)' >&2; \
+	  exit 1; \
+	}; \
+	test `$(am__distuninstallcheck_listfiles) | wc -l` -eq 0 \
+	   || { 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
+	$(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS)
+	$(MAKE) $(AM_MAKEFLAGS) check-TESTS
+check: check-am
+all-am: Makefile $(LTLIBRARIES) $(DATA) $(HEADERS)
+installdirs:
+	for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(m4datadir)" "$(DESTDIR)$(pkgincludedir)" "$(DESTDIR)$(pkginclude_internaldir)"; 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:
+	if test -z '$(STRIP)'; then \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	      install; \
+	else \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	    "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+	fi
+mostlyclean-generic:
+
+clean-generic:
+	-test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+	-rm -f fused-src/gtest/$(DEPDIR)/$(am__dirstamp)
+	-rm -f fused-src/gtest/$(am__dirstamp)
+	-rm -f lib/$(am__dirstamp)
+	-rm -f samples/$(DEPDIR)/$(am__dirstamp)
+	-rm -f samples/$(am__dirstamp)
+	-rm -f src/$(DEPDIR)/$(am__dirstamp)
+	-rm -f src/$(am__dirstamp)
+	-rm -f test/$(DEPDIR)/$(am__dirstamp)
+	-rm -f test/$(am__dirstamp)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+ at HAVE_PYTHON_FALSE@maintainer-clean-local:
+clean: clean-am
+
+clean-am: clean-checkPROGRAMS clean-generic clean-libLTLIBRARIES \
+	clean-libtool clean-noinstLTLIBRARIES mostlyclean-am
+
+distclean: distclean-am
+	-rm -f $(am__CONFIG_DISTCLEAN_FILES)
+	-rm -rf fused-src/gtest/$(DEPDIR) samples/$(DEPDIR) src/$(DEPDIR) test/$(DEPDIR)
+	-rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+	distclean-hdr distclean-libtool distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am: install-data-local install-m4dataDATA \
+	install-pkgincludeHEADERS install-pkginclude_internalHEADERS
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am: install-exec-local install-libLTLIBRARIES
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+	-rm -f $(am__CONFIG_DISTCLEAN_FILES)
+	-rm -rf $(top_srcdir)/autom4te.cache
+	-rm -rf fused-src/gtest/$(DEPDIR) samples/$(DEPDIR) src/$(DEPDIR) test/$(DEPDIR)
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic \
+	maintainer-clean-local
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+	mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-libLTLIBRARIES uninstall-m4dataDATA \
+	uninstall-pkgincludeHEADERS \
+	uninstall-pkginclude_internalHEADERS
+
+.MAKE: check-am install-am install-strip
+
+.PHONY: CTAGS GTAGS all all-am am--refresh check check-TESTS check-am \
+	clean clean-checkPROGRAMS clean-generic clean-libLTLIBRARIES \
+	clean-libtool clean-noinstLTLIBRARIES ctags dist dist-all \
+	dist-bzip2 dist-gzip dist-lzip dist-lzma dist-shar dist-tarZ \
+	dist-xz dist-zip distcheck distclean distclean-compile \
+	distclean-generic distclean-hdr distclean-libtool \
+	distclean-tags distcleancheck distdir distuninstallcheck dvi \
+	dvi-am html html-am info info-am install install-am \
+	install-data install-data-am install-data-local install-dvi \
+	install-dvi-am install-exec install-exec-am install-exec-local \
+	install-html install-html-am install-info install-info-am \
+	install-libLTLIBRARIES install-m4dataDATA install-man \
+	install-pdf install-pdf-am install-pkgincludeHEADERS \
+	install-pkginclude_internalHEADERS install-ps install-ps-am \
+	install-strip installcheck installcheck-am installdirs \
+	maintainer-clean maintainer-clean-generic \
+	maintainer-clean-local mostlyclean mostlyclean-compile \
+	mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+	tags uninstall uninstall-am uninstall-libLTLIBRARIES \
+	uninstall-m4dataDATA uninstall-pkgincludeHEADERS \
+	uninstall-pkginclude_internalHEADERS
+
+
+# Build rules for putting fused Google Test files into the distribution
+# package. The user can also create those files by manually running
+# scripts/fuse_gtest_files.py.
+ at HAVE_PYTHON_TRUE@$(test_fused_gtest_test_SOURCES): fused-gtest
+
+ at HAVE_PYTHON_TRUE@fused-gtest: $(pkginclude_HEADERS) $(pkginclude_internal_HEADERS) \
+ at HAVE_PYTHON_TRUE@             $(GTEST_SRC) src/gtest-all.cc src/gtest_main.cc \
+ at HAVE_PYTHON_TRUE@             scripts/fuse_gtest_files.py
+ at HAVE_PYTHON_TRUE@	mkdir -p "$(srcdir)/fused-src"
+ at HAVE_PYTHON_TRUE@	chmod -R u+w "$(srcdir)/fused-src"
+ at HAVE_PYTHON_TRUE@	rm -f "$(srcdir)/fused-src/gtest/gtest-all.cc"
+ at HAVE_PYTHON_TRUE@	rm -f "$(srcdir)/fused-src/gtest/gtest.h"
+ at HAVE_PYTHON_TRUE@	"$(srcdir)/scripts/fuse_gtest_files.py" "$(srcdir)/fused-src"
+ at HAVE_PYTHON_TRUE@	cp -f "$(srcdir)/src/gtest_main.cc" "$(srcdir)/fused-src/gtest/"
+
+ at HAVE_PYTHON_TRUE@maintainer-clean-local:
+ at HAVE_PYTHON_TRUE@	rm -rf "$(srcdir)/fused-src"
+
+# Disables 'make install' as installing a compiled version of Google
+# Test can lead to undefined behavior due to violation of the
+# One-Definition Rule.
+
+install-exec-local:
+	echo "'make install' is dangerous and not supported. Instead, see README for how to integrate Google Test into your build system."
+	false
+
+install-data-local:
+	echo "'make install' is dangerous and not supported. Instead, see README for how to integrate Google Test into your build system."
+	false
+
+# 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/contrib/gtest-1.7.0/README b/contrib/gtest-1.7.0/README
new file mode 100644
index 0000000..26f35a8
--- /dev/null
+++ b/contrib/gtest-1.7.0/README
@@ -0,0 +1,435 @@
+Google C++ Testing Framework
+============================
+
+http://code.google.com/p/googletest/
+
+Overview
+--------
+
+Google's framework for writing C++ tests on a variety of platforms
+(Linux, Mac OS X, Windows, Windows CE, Symbian, etc).  Based on the
+xUnit architecture.  Supports automatic test discovery, a rich set of
+assertions, user-defined assertions, death tests, fatal and non-fatal
+failures, various options for running the tests, and XML test report
+generation.
+
+Please see the project page above for more information as well as the
+mailing list for questions, discussions, and development.  There is
+also an IRC channel on OFTC (irc.oftc.net) #gtest available.  Please
+join us!
+
+Requirements for End Users
+--------------------------
+
+Google Test is designed to have fairly minimal requirements to build
+and use with your projects, but there are some.  Currently, we support
+Linux, Windows, Mac OS X, and Cygwin.  We will also make our best
+effort to support other platforms (e.g. Solaris, AIX, and z/OS).
+However, since core members of the Google Test project have no access
+to these platforms, Google Test may have outstanding issues there.  If
+you notice any problems on your platform, please notify
+googletestframework at googlegroups.com.  Patches for fixing them are
+even more welcome!
+
+### Linux Requirements ###
+
+These are the base requirements to build and use Google Test from a source
+package (as described below):
+  * GNU-compatible Make or gmake
+  * POSIX-standard shell
+  * POSIX(-2) Regular Expressions (regex.h)
+  * A C++98-standard-compliant compiler
+
+### Windows Requirements ###
+
+  * Microsoft Visual C++ 7.1 or newer
+
+### Cygwin Requirements ###
+
+  * Cygwin 1.5.25-14 or newer
+
+### Mac OS X Requirements ###
+
+  * Mac OS X 10.4 Tiger or newer
+  * Developer Tools Installed
+
+Also, you'll need CMake 2.6.4 or higher if you want to build the
+samples using the provided CMake script, regardless of the platform.
+
+Requirements for Contributors
+-----------------------------
+
+We welcome patches.  If you plan to contribute a patch, you need to
+build Google Test and its own tests from an SVN checkout (described
+below), which has further requirements:
+
+  * Python version 2.3 or newer (for running some of the tests and
+    re-generating certain source files from templates)
+  * CMake 2.6.4 or newer
+
+Getting the Source
+------------------
+
+There are two primary ways of getting Google Test's source code: you
+can download a stable source release in your preferred archive format,
+or directly check out the source from our Subversion (SVN) repositary.
+The SVN checkout requires a few extra steps and some extra software
+packages on your system, but lets you track the latest development and
+make patches much more easily, so we highly encourage it.
+
+### Source Package ###
+
+Google Test is released in versioned source packages which can be
+downloaded from the download page [1].  Several different archive
+formats are provided, but the only difference is the tools used to
+manipulate them, and the size of the resulting file.  Download
+whichever you are most comfortable with.
+
+  [1] http://code.google.com/p/googletest/downloads/list
+
+Once the package is downloaded, expand it using whichever tools you
+prefer for that type.  This will result in a new directory with the
+name "gtest-X.Y.Z" which contains all of the source code.  Here are
+some examples on Linux:
+
+  tar -xvzf gtest-X.Y.Z.tar.gz
+  tar -xvjf gtest-X.Y.Z.tar.bz2
+  unzip gtest-X.Y.Z.zip
+
+### SVN Checkout ###
+
+To check out the main branch (also known as the "trunk") of Google
+Test, run the following Subversion command:
+
+  svn checkout http://googletest.googlecode.com/svn/trunk/ gtest-svn
+
+Setting up the Build
+--------------------
+
+To build Google Test and your tests that use it, you need to tell your
+build system where to find its headers and source files.  The exact
+way to do it depends on which build system you use, and is usually
+straightforward.
+
+### Generic Build Instructions ###
+
+Suppose you put Google Test in directory ${GTEST_DIR}.  To build it,
+create a library build target (or a project as called by Visual Studio
+and Xcode) to compile
+
+  ${GTEST_DIR}/src/gtest-all.cc
+
+with ${GTEST_DIR}/include in the system header search path and ${GTEST_DIR}
+in the normal header search path.  Assuming a Linux-like system and gcc,
+something like the following will do:
+
+  g++ -isystem ${GTEST_DIR}/include -I${GTEST_DIR} \
+      -pthread -c ${GTEST_DIR}/src/gtest-all.cc
+  ar -rv libgtest.a gtest-all.o
+
+(We need -pthread as Google Test uses threads.)
+
+Next, you should compile your test source file with
+${GTEST_DIR}/include in the system header search path, and link it
+with gtest and any other necessary libraries:
+
+  g++ -isystem ${GTEST_DIR}/include -pthread path/to/your_test.cc libgtest.a \
+      -o your_test
+
+As an example, the make/ directory contains a Makefile that you can
+use to build Google Test on systems where GNU make is available
+(e.g. Linux, Mac OS X, and Cygwin).  It doesn't try to build Google
+Test's own tests.  Instead, it just builds the Google Test library and
+a sample test.  You can use it as a starting point for your own build
+script.
+
+If the default settings are correct for your environment, the
+following commands should succeed:
+
+  cd ${GTEST_DIR}/make
+  make
+  ./sample1_unittest
+
+If you see errors, try to tweak the contents of make/Makefile to make
+them go away.  There are instructions in make/Makefile on how to do
+it.
+
+### Using CMake ###
+
+Google Test comes with a CMake build script (CMakeLists.txt) that can
+be used on a wide range of platforms ("C" stands for cross-platofrm.).
+If you don't have CMake installed already, you can download it for
+free from http://www.cmake.org/.
+
+CMake works by generating native makefiles or build projects that can
+be used in the compiler environment of your choice.  The typical
+workflow starts with:
+
+  mkdir mybuild       # Create a directory to hold the build output.
+  cd mybuild
+  cmake ${GTEST_DIR}  # Generate native build scripts.
+
+If you want to build Google Test's samples, you should replace the
+last command with
+
+  cmake -Dgtest_build_samples=ON ${GTEST_DIR}
+
+If you are on a *nix system, you should now see a Makefile in the
+current directory.  Just type 'make' to build gtest.
+
+If you use Windows and have Vistual Studio installed, a gtest.sln file
+and several .vcproj files will be created.  You can then build them
+using Visual Studio.
+
+On Mac OS X with Xcode installed, a .xcodeproj file will be generated.
+
+### Legacy Build Scripts ###
+
+Before settling on CMake, we have been providing hand-maintained build
+projects/scripts for Visual Studio, Xcode, and Autotools.  While we
+continue to provide them for convenience, they are not actively
+maintained any more.  We highly recommend that you follow the
+instructions in the previous two sections to integrate Google Test
+with your existing build system.
+
+If you still need to use the legacy build scripts, here's how:
+
+The msvc\ folder contains two solutions with Visual C++ projects.
+Open the gtest.sln or gtest-md.sln file using Visual Studio, and you
+are ready to build Google Test the same way you build any Visual
+Studio project.  Files that have names ending with -md use DLL
+versions of Microsoft runtime libraries (the /MD or the /MDd compiler
+option).  Files without that suffix use static versions of the runtime
+libraries (the /MT or the /MTd option).  Please note that one must use
+the same option to compile both gtest and the test code.  If you use
+Visual Studio 2005 or above, we recommend the -md version as /MD is
+the default for new projects in these versions of Visual Studio.
+
+On Mac OS X, open the gtest.xcodeproj in the xcode/ folder using
+Xcode.  Build the "gtest" target.  The universal binary framework will
+end up in your selected build directory (selected in the Xcode
+"Preferences..." -> "Building" pane and defaults to xcode/build).
+Alternatively, at the command line, enter:
+
+  xcodebuild
+
+This will build the "Release" configuration of gtest.framework in your
+default build location.  See the "xcodebuild" man page for more
+information about building different configurations and building in
+different locations.
+
+If you wish to use the Google Test Xcode project with Xcode 4.x and
+above, you need to either:
+ * update the SDK configuration options in xcode/Config/General.xconfig.
+   Comment options SDKROOT, MACOS_DEPLOYMENT_TARGET, and GCC_VERSION. If
+   you choose this route you lose the ability to target earlier versions
+   of MacOS X.
+ * Install an SDK for an earlier version. This doesn't appear to be
+   supported by Apple, but has been reported to work
+   (http://stackoverflow.com/questions/5378518).
+
+Tweaking Google Test
+--------------------
+
+Google Test can be used in diverse environments.  The default
+configuration may not work (or may not work well) out of the box in
+some environments.  However, you can easily tweak Google Test by
+defining control macros on the compiler command line.  Generally,
+these macros are named like GTEST_XYZ and you define them to either 1
+or 0 to enable or disable a certain feature.
+
+We list the most frequently used macros below.  For a complete list,
+see file include/gtest/internal/gtest-port.h.
+
+### Choosing a TR1 Tuple Library ###
+
+Some Google Test features require the C++ Technical Report 1 (TR1)
+tuple library, which is not yet available with all compilers.  The
+good news is that Google Test implements a subset of TR1 tuple that's
+enough for its own need, and will automatically use this when the
+compiler doesn't provide TR1 tuple.
+
+Usually you don't need to care about which tuple library Google Test
+uses.  However, if your project already uses TR1 tuple, you need to
+tell Google Test to use the same TR1 tuple library the rest of your
+project uses, or the two tuple implementations will clash.  To do
+that, add
+
+  -DGTEST_USE_OWN_TR1_TUPLE=0
+
+to the compiler flags while compiling Google Test and your tests.  If
+you want to force Google Test to use its own tuple library, just add
+
+  -DGTEST_USE_OWN_TR1_TUPLE=1
+
+to the compiler flags instead.
+
+If you don't want Google Test to use tuple at all, add
+
+  -DGTEST_HAS_TR1_TUPLE=0
+
+and all features using tuple will be disabled.
+
+### Multi-threaded Tests ###
+
+Google Test is thread-safe where the pthread library is available.
+After #include "gtest/gtest.h", you can check the GTEST_IS_THREADSAFE
+macro to see whether this is the case (yes if the macro is #defined to
+1, no if it's undefined.).
+
+If Google Test doesn't correctly detect whether pthread is available
+in your environment, you can force it with
+
+  -DGTEST_HAS_PTHREAD=1
+
+or
+
+  -DGTEST_HAS_PTHREAD=0
+
+When Google Test uses pthread, you may need to add flags to your
+compiler and/or linker to select the pthread library, or you'll get
+link errors.  If you use the CMake script or the deprecated Autotools
+script, this is taken care of for you.  If you use your own build
+script, you'll need to read your compiler and linker's manual to
+figure out what flags to add.
+
+### As a Shared Library (DLL) ###
+
+Google Test is compact, so most users can build and link it as a
+static library for the simplicity.  You can choose to use Google Test
+as a shared library (known as a DLL on Windows) if you prefer.
+
+To compile *gtest* as a shared library, add
+
+  -DGTEST_CREATE_SHARED_LIBRARY=1
+
+to the compiler flags.  You'll also need to tell the linker to produce
+a shared library instead - consult your linker's manual for how to do
+it.
+
+To compile your *tests* that use the gtest shared library, add
+
+  -DGTEST_LINKED_AS_SHARED_LIBRARY=1
+
+to the compiler flags.
+
+Note: while the above steps aren't technically necessary today when
+using some compilers (e.g. GCC), they may become necessary in the
+future, if we decide to improve the speed of loading the library (see
+http://gcc.gnu.org/wiki/Visibility for details).  Therefore you are
+recommended to always add the above flags when using Google Test as a
+shared library.  Otherwise a future release of Google Test may break
+your build script.
+
+### Avoiding Macro Name Clashes ###
+
+In C++, macros don't obey namespaces.  Therefore two libraries that
+both define a macro of the same name will clash if you #include both
+definitions.  In case a Google Test macro clashes with another
+library, you can force Google Test to rename its macro to avoid the
+conflict.
+
+Specifically, if both Google Test and some other code define macro
+FOO, you can add
+
+  -DGTEST_DONT_DEFINE_FOO=1
+
+to the compiler flags to tell Google Test to change the macro's name
+from FOO to GTEST_FOO.  Currently FOO can be FAIL, SUCCEED, or TEST.
+For example, with -DGTEST_DONT_DEFINE_TEST=1, you'll need to write
+
+  GTEST_TEST(SomeTest, DoesThis) { ... }
+
+instead of
+
+  TEST(SomeTest, DoesThis) { ... }
+
+in order to define a test.
+
+Upgrating from an Earlier Version
+---------------------------------
+
+We strive to keep Google Test releases backward compatible.
+Sometimes, though, we have to make some breaking changes for the
+users' long-term benefits.  This section describes what you'll need to
+do if you are upgrading from an earlier version of Google Test.
+
+### Upgrading from 1.3.0 or Earlier ###
+
+You may need to explicitly enable or disable Google Test's own TR1
+tuple library.  See the instructions in section "Choosing a TR1 Tuple
+Library".
+
+### Upgrading from 1.4.0 or Earlier ###
+
+The Autotools build script (configure + make) is no longer officially
+supportted.  You are encouraged to migrate to your own build system or
+use CMake.  If you still need to use Autotools, you can find
+instructions in the README file from Google Test 1.4.0.
+
+On platforms where the pthread library is available, Google Test uses
+it in order to be thread-safe.  See the "Multi-threaded Tests" section
+for what this means to your build script.
+
+If you use Microsoft Visual C++ 7.1 with exceptions disabled, Google
+Test will no longer compile.  This should affect very few people, as a
+large portion of STL (including <string>) doesn't compile in this mode
+anyway.  We decided to stop supporting it in order to greatly simplify
+Google Test's implementation.
+
+Developing Google Test
+----------------------
+
+This section discusses how to make your own changes to Google Test.
+
+### Testing Google Test Itself ###
+
+To make sure your changes work as intended and don't break existing
+functionality, you'll want to compile and run Google Test's own tests.
+For that you can use CMake:
+
+  mkdir mybuild
+  cd mybuild
+  cmake -Dgtest_build_tests=ON ${GTEST_DIR}
+
+Make sure you have Python installed, as some of Google Test's tests
+are written in Python.  If the cmake command complains about not being
+able to find Python ("Could NOT find PythonInterp (missing:
+PYTHON_EXECUTABLE)"), try telling it explicitly where your Python
+executable can be found:
+
+  cmake -DPYTHON_EXECUTABLE=path/to/python -Dgtest_build_tests=ON ${GTEST_DIR}
+
+Next, you can build Google Test and all of its own tests.  On *nix,
+this is usually done by 'make'.  To run the tests, do
+
+  make test
+
+All tests should pass.
+
+### Regenerating Source Files ###
+
+Some of Google Test's source files are generated from templates (not
+in the C++ sense) using a script.  A template file is named FOO.pump,
+where FOO is the name of the file it will generate.  For example, the
+file include/gtest/internal/gtest-type-util.h.pump is used to generate
+gtest-type-util.h in the same directory.
+
+Normally you don't need to worry about regenerating the source files,
+unless you need to modify them.  In that case, you should modify the
+corresponding .pump files instead and run the pump.py Python script to
+regenerate them.  You can find pump.py in the scripts/ directory.
+Read the Pump manual [2] for how to use it.
+
+  [2] http://code.google.com/p/googletest/wiki/PumpManual
+
+### Contributing a Patch ###
+
+We welcome patches.  Please read the Google Test developer's guide [3]
+for how you can contribute.  In particular, make sure you have signed
+the Contributor License Agreement, or we won't be able to accept the
+patch.
+
+  [3] http://code.google.com/p/googletest/wiki/GoogleTestDevGuide
+
+Happy testing!
diff --git a/contrib/gtest-1.7.0/aclocal.m4 b/contrib/gtest-1.7.0/aclocal.m4
new file mode 100644
index 0000000..e7df9fe
--- /dev/null
+++ b/contrib/gtest-1.7.0/aclocal.m4
@@ -0,0 +1,1198 @@
+# generated automatically by aclocal 1.11.3 -*- Autoconf -*-
+
+# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
+# 2005, 2006, 2007, 2008, 2009, 2010, 2011 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.
+
+m4_ifndef([AC_AUTOCONF_VERSION],
+  [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
+m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.68],,
+[m4_warning([this file was generated for autoconf 2.68.
+You have another version of autoconf.  It may work, but is not guaranteed to.
+If you have problems, you may need to regenerate the build system entirely.
+To do so, use the procedure documented by the package, typically `autoreconf'.])])
+
+# Copyright (C) 2002, 2003, 2005, 2006, 2007, 2008, 2011 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 1
+
+# 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.
+# (This private macro should not be called outside this file.)
+AC_DEFUN([AM_AUTOMAKE_VERSION],
+[am__api_version='1.11'
+dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to
+dnl require some minimum version.  Point them to the right macro.
+m4_if([$1], [1.11.3], [],
+      [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl
+])
+
+# _AM_AUTOCONF_VERSION(VERSION)
+# -----------------------------
+# aclocal traces this macro to find the Autoconf version.
+# This is a private macro too.  Using m4_define simplifies
+# the logic in aclocal, which can simply ignore this definition.
+m4_define([_AM_AUTOCONF_VERSION], [])
+
+# AM_SET_CURRENT_AUTOMAKE_VERSION
+# -------------------------------
+# Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced.
+# This function is AC_REQUIREd by AM_INIT_AUTOMAKE.
+AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION],
+[AM_AUTOMAKE_VERSION([1.11.3])dnl
+m4_ifndef([AC_AUTOCONF_VERSION],
+  [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
+_AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))])
+
+# AM_AUX_DIR_EXPAND                                         -*- Autoconf -*-
+
+# Copyright (C) 2001, 2003, 2005, 2011 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 1
+
+# 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, 2006, 2008
+# 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 9
+
+# 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])dnl
+AC_SUBST([$1_FALSE])dnl
+_AM_SUBST_NOTMAKE([$1_TRUE])dnl
+_AM_SUBST_NOTMAKE([$1_FALSE])dnl
+m4_define([_AM_COND_VALUE_$1], [$2])dnl
+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, 2006, 2009,
+# 2010, 2011 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
+
+# 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], UPC,  [depcc="$UPC"  am_compiler_list=],
+       [$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'.
+  rm -rf conftest.dir
+  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
+  am__universal=false
+  m4_case([$1], [CC],
+    [case " $depcc " in #(
+     *\ -arch\ *\ -arch\ *) am__universal=true ;;
+     esac],
+    [CXX],
+    [case " $depcc " in #(
+     *\ -arch\ *\ -arch\ *) am__universal=true ;;
+     esac])
+
+  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
+
+    # 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.  Also, some Intel
+    # versions had trouble with output in subdirs
+    am__obj=sub/conftest.${OBJEXT-o}
+    am__minus_obj="-o $am__obj"
+    case $depmode in
+    gcc)
+      # This depmode causes a compiler race in universal mode.
+      test "$am__universal" = false || continue
+      ;;
+    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
+      ;;
+    msvc7 | msvc7msys | msvisualcpp | msvcmsys)
+      # This compiler won't grok `-c -o', but also, the minuso test has
+      # not run yet.  These depmodes are late enough in the game, and
+      # so weak that their functioning should not be impacted.
+      am__obj=conftest.${OBJEXT-o}
+      am__minus_obj=
+      ;;
+    none) break ;;
+    esac
+    if depmode=$depmode \
+       source=sub/conftest.c object=$am__obj \
+       depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+       $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \
+         >/dev/null 2>conftest.err &&
+       grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep $am__obj 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='\'
+  am__nodep='_no'
+fi
+AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno])
+AC_SUBST([AMDEPBACKSLASH])dnl
+_AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl
+AC_SUBST([am__nodep])dnl
+_AM_SUBST_NOTMAKE([am__nodep])dnl
+])
+
+# Generate code to set up dependency tracking.              -*- Autoconf -*-
+
+# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2008
+# 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 5
+
+# _AM_OUTPUT_DEPENDENCY_COMMANDS
+# ------------------------------
+AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS],
+[{
+  # Autoconf 2.62 quotes --file arguments for eval, but not when files
+  # are listed without --file.  Let's play safe and only enable the eval
+  # if we detect the quoting.
+  case $CONFIG_FILES in
+  *\'*) eval set x "$CONFIG_FILES" ;;
+  *)   set x $CONFIG_FILES ;;
+  esac
+  shift
+  for mf
+  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.
+    # Grep'ing the whole file is not good either: AIX grep has a line
+    # limit of 2048, but all sed's we know have understand at least 4000.
+    if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/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"])
+])
+
+# Do all the work for Automake.                             -*- Autoconf -*-
+
+# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
+# 2005, 2006, 2008, 2009 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 16
+
+# 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.62])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
+if test "`cd $srcdir && pwd`" != "`pwd`"; then
+  # Use -I$(srcdir) only when $(srcdir) != ., so that make's output
+  # is not polluted with repeated "-I."
+  AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl
+  # test to see if srcdir already configured
+  if test -f $srcdir/config.status; then
+    AC_MSG_ERROR([source directory already configured; run "make distclean" there first])
+  fi
+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
+dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT.
+m4_if(m4_ifdef([AC_PACKAGE_NAME], 1)m4_ifdef([AC_PACKAGE_VERSION], 1), 11,,
+  [m4_fatal([AC_INIT should be called with package and version arguments])])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)
+AC_REQUIRE([AM_PROG_INSTALL_SH])dnl
+AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl
+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
+AC_PROVIDE_IFELSE([AC_PROG_OBJC],
+		  [_AM_DEPENDENCIES(OBJC)],
+		  [define([AC_PROG_OBJC],
+			  defn([AC_PROG_OBJC])[_AM_DEPENDENCIES(OBJC)])])dnl
+])
+_AM_IF_OPTION([silent-rules], [AC_REQUIRE([AM_SILENT_RULES])])dnl
+dnl The `parallel-tests' driver may need to know about EXEEXT, so add the
+dnl `am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen.  This macro
+dnl is hooked onto _AC_COMPILER_EXEEXT early, see below.
+AC_CONFIG_COMMANDS_PRE(dnl
+[m4_provide_if([_AM_COMPILER_EXEEXT],
+  [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl
+])
+
+dnl Hook into `_AC_COMPILER_EXEEXT' early to learn its expansion.  Do not
+dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further
+dnl mangled by Autoconf and run in a shell conditional statement.
+m4_define([_AC_COMPILER_EXEEXT],
+m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])])
+
+
+# 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_arg=$1
+_am_stamp_count=1
+for _am_header in $config_headers :; do
+  case $_am_header in
+    $_am_arg | $_am_arg:* )
+      break ;;
+    * )
+      _am_stamp_count=`expr $_am_stamp_count + 1` ;;
+  esac
+done
+echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count])
+
+# Copyright (C) 2001, 2003, 2005, 2008, 2011 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 1
+
+# AM_PROG_INSTALL_SH
+# ------------------
+# Define $install_sh.
+AC_DEFUN([AM_PROG_INSTALL_SH],
+[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
+if test x"${install_sh}" != xset; then
+  case $am_aux_dir in
+  *\ * | *\	*)
+    install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;;
+  *)
+    install_sh="\${SHELL} $am_aux_dir/install-sh"
+  esac
+fi
+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])])
+
+# Check to see how 'make' treats includes.	            -*- Autoconf -*-
+
+# Copyright (C) 2001, 2002, 2003, 2005, 2009  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_MAKE_INCLUDE()
+# -----------------
+# Check to see how make treats includes.
+AC_DEFUN([AM_MAKE_INCLUDE],
+[am_make=${MAKE-make}
+cat > confinc << 'END'
+am__doit:
+	@echo this is the am__doit target
+.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
+# Ignore all kinds of additional output from `make'.
+case `$am_make -s -f confmf 2> /dev/null` in #(
+*the\ am__doit\ target*)
+  am__include=include
+  am__quote=
+  _am_result=GNU
+  ;;
+esac
+# Now try BSD make style include.
+if test "$am__include" = "#"; then
+   echo '.include "confinc"' > confmf
+   case `$am_make -s -f confmf 2> /dev/null` in #(
+   *the\ am__doit\ target*)
+     am__include=.include
+     am__quote="\""
+     _am_result=BSD
+     ;;
+   esac
+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, 2004, 2005, 2008
+# 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 6
+
+# 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
+AC_REQUIRE_AUX_FILE([missing])dnl
+if test x"${MISSING+set}" != xset; then
+  case $am_aux_dir in
+  *\ * | *\	*)
+    MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;;
+  *)
+    MISSING="\${SHELL} $am_aux_dir/missing" ;;
+  esac
+fi
+# 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, 2006, 2011 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 1
+
+# AM_PROG_MKDIR_P
+# ---------------
+# Check for `mkdir -p'.
+AC_DEFUN([AM_PROG_MKDIR_P],
+[AC_PREREQ([2.60])dnl
+AC_REQUIRE([AC_PROG_MKDIR_P])dnl
+dnl Automake 1.8 to 1.9.6 used to define mkdir_p.  We now use MKDIR_P,
+dnl while keeping a definition of mkdir_p for backward compatibility.
+dnl @MKDIR_P@ is magic: AC_OUTPUT adjusts its value for each Makefile.
+dnl However we cannot define mkdir_p as $(MKDIR_P) for the sake of
+dnl Makefile.ins that do not define MKDIR_P, so we do our own
+dnl adjustment using top_builddir (which is defined more often than
+dnl MKDIR_P).
+AC_SUBST([mkdir_p], ["$MKDIR_P"])dnl
+case $mkdir_p in
+  [[\\/$]]* | ?:[[\\/]]*) ;;
+  */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;;
+esac
+])
+
+# Helper functions for option handling.                     -*- Autoconf -*-
+
+# Copyright (C) 2001, 2002, 2003, 2005, 2008, 2010 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 5
+
+# _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],
+[m4_foreach_w([_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])])
+
+# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2008, 2009,
+# 2011 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_PATH_PYTHON([MINIMUM-VERSION], [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND])
+# ---------------------------------------------------------------------------
+# Adds support for distributing Python modules and packages.  To
+# install modules, copy them to $(pythondir), using the python_PYTHON
+# automake variable.  To install a package with the same name as the
+# automake package, install to $(pkgpythondir), or use the
+# pkgpython_PYTHON automake variable.
+#
+# The variables $(pyexecdir) and $(pkgpyexecdir) are provided as
+# locations to install python extension modules (shared libraries).
+# Another macro is required to find the appropriate flags to compile
+# extension modules.
+#
+# If your package is configured with a different prefix to python,
+# users will have to add the install directory to the PYTHONPATH
+# environment variable, or create a .pth file (see the python
+# documentation for details).
+#
+# If the MINIMUM-VERSION argument is passed, AM_PATH_PYTHON will
+# cause an error if the version of python installed on the system
+# doesn't meet the requirement.  MINIMUM-VERSION should consist of
+# numbers and dots only.
+AC_DEFUN([AM_PATH_PYTHON],
+ [
+  dnl Find a Python interpreter.  Python versions prior to 2.0 are not
+  dnl supported. (2.0 was released on October 16, 2000).
+  m4_define_default([_AM_PYTHON_INTERPRETER_LIST],
+[python python2 python3 python3.2 python3.1 python3.0 python2.7 dnl
+ python2.6 python2.5 python2.4 python2.3 python2.2 python2.1 python2.0])
+
+  AC_ARG_VAR([PYTHON], [the Python interpreter])
+
+  m4_if([$1],[],[
+    dnl No version check is needed.
+    # Find any Python interpreter.
+    if test -z "$PYTHON"; then
+      AC_PATH_PROGS([PYTHON], _AM_PYTHON_INTERPRETER_LIST, :)
+    fi
+    am_display_PYTHON=python
+  ], [
+    dnl A version check is needed.
+    if test -n "$PYTHON"; then
+      # If the user set $PYTHON, use it and don't search something else.
+      AC_MSG_CHECKING([whether $PYTHON version >= $1])
+      AM_PYTHON_CHECK_VERSION([$PYTHON], [$1],
+			      [AC_MSG_RESULT(yes)],
+			      [AC_MSG_ERROR(too old)])
+      am_display_PYTHON=$PYTHON
+    else
+      # Otherwise, try each interpreter until we find one that satisfies
+      # VERSION.
+      AC_CACHE_CHECK([for a Python interpreter with version >= $1],
+	[am_cv_pathless_PYTHON],[
+	for am_cv_pathless_PYTHON in _AM_PYTHON_INTERPRETER_LIST none; do
+	  test "$am_cv_pathless_PYTHON" = none && break
+	  AM_PYTHON_CHECK_VERSION([$am_cv_pathless_PYTHON], [$1], [break])
+	done])
+      # Set $PYTHON to the absolute path of $am_cv_pathless_PYTHON.
+      if test "$am_cv_pathless_PYTHON" = none; then
+	PYTHON=:
+      else
+        AC_PATH_PROG([PYTHON], [$am_cv_pathless_PYTHON])
+      fi
+      am_display_PYTHON=$am_cv_pathless_PYTHON
+    fi
+  ])
+
+  if test "$PYTHON" = :; then
+  dnl Run any user-specified action, or abort.
+    m4_default([$3], [AC_MSG_ERROR([no suitable Python interpreter found])])
+  else
+
+  dnl Query Python for its version number.  Getting [:3] seems to be
+  dnl the best way to do this; it's what "site.py" does in the standard
+  dnl library.
+
+  AC_CACHE_CHECK([for $am_display_PYTHON version], [am_cv_python_version],
+    [am_cv_python_version=`$PYTHON -c "import sys; sys.stdout.write(sys.version[[:3]])"`])
+  AC_SUBST([PYTHON_VERSION], [$am_cv_python_version])
+
+  dnl Use the values of $prefix and $exec_prefix for the corresponding
+  dnl values of PYTHON_PREFIX and PYTHON_EXEC_PREFIX.  These are made
+  dnl distinct variables so they can be overridden if need be.  However,
+  dnl general consensus is that you shouldn't need this ability.
+
+  AC_SUBST([PYTHON_PREFIX], ['${prefix}'])
+  AC_SUBST([PYTHON_EXEC_PREFIX], ['${exec_prefix}'])
+
+  dnl At times (like when building shared libraries) you may want
+  dnl to know which OS platform Python thinks this is.
+
+  AC_CACHE_CHECK([for $am_display_PYTHON platform], [am_cv_python_platform],
+    [am_cv_python_platform=`$PYTHON -c "import sys; sys.stdout.write(sys.platform)"`])
+  AC_SUBST([PYTHON_PLATFORM], [$am_cv_python_platform])
+
+
+  dnl Set up 4 directories:
+
+  dnl pythondir -- where to install python scripts.  This is the
+  dnl   site-packages directory, not the python standard library
+  dnl   directory like in previous automake betas.  This behavior
+  dnl   is more consistent with lispdir.m4 for example.
+  dnl Query distutils for this directory.
+  AC_CACHE_CHECK([for $am_display_PYTHON script directory],
+    [am_cv_python_pythondir],
+    [if test "x$prefix" = xNONE
+     then
+       am_py_prefix=$ac_default_prefix
+     else
+       am_py_prefix=$prefix
+     fi
+     am_cv_python_pythondir=`$PYTHON -c "import sys; from distutils import sysconfig; sys.stdout.write(sysconfig.get_python_lib(0,0,prefix='$am_py_prefix'))" 2>/dev/null`
+     case $am_cv_python_pythondir in
+     $am_py_prefix*)
+       am__strip_prefix=`echo "$am_py_prefix" | sed 's|.|.|g'`
+       am_cv_python_pythondir=`echo "$am_cv_python_pythondir" | sed "s,^$am__strip_prefix,$PYTHON_PREFIX,"`
+       ;;
+     *)
+       case $am_py_prefix in
+         /usr|/System*) ;;
+         *)
+	  am_cv_python_pythondir=$PYTHON_PREFIX/lib/python$PYTHON_VERSION/site-packages
+	  ;;
+       esac
+       ;;
+     esac
+    ])
+  AC_SUBST([pythondir], [$am_cv_python_pythondir])
+
+  dnl pkgpythondir -- $PACKAGE directory under pythondir.  Was
+  dnl   PYTHON_SITE_PACKAGE in previous betas, but this naming is
+  dnl   more consistent with the rest of automake.
+
+  AC_SUBST([pkgpythondir], [\${pythondir}/$PACKAGE])
+
+  dnl pyexecdir -- directory for installing python extension modules
+  dnl   (shared libraries)
+  dnl Query distutils for this directory.
+  AC_CACHE_CHECK([for $am_display_PYTHON extension module directory],
+    [am_cv_python_pyexecdir],
+    [if test "x$exec_prefix" = xNONE
+     then
+       am_py_exec_prefix=$am_py_prefix
+     else
+       am_py_exec_prefix=$exec_prefix
+     fi
+     am_cv_python_pyexecdir=`$PYTHON -c "import sys; from distutils import sysconfig; sys.stdout.write(sysconfig.get_python_lib(1,0,prefix='$am_py_exec_prefix'))" 2>/dev/null`
+     case $am_cv_python_pyexecdir in
+     $am_py_exec_prefix*)
+       am__strip_prefix=`echo "$am_py_exec_prefix" | sed 's|.|.|g'`
+       am_cv_python_pyexecdir=`echo "$am_cv_python_pyexecdir" | sed "s,^$am__strip_prefix,$PYTHON_EXEC_PREFIX,"`
+       ;;
+     *)
+       case $am_py_exec_prefix in
+         /usr|/System*) ;;
+         *)
+	   am_cv_python_pyexecdir=$PYTHON_EXEC_PREFIX/lib/python$PYTHON_VERSION/site-packages
+	   ;;
+       esac
+       ;;
+     esac
+    ])
+  AC_SUBST([pyexecdir], [$am_cv_python_pyexecdir])
+
+  dnl pkgpyexecdir -- $(pyexecdir)/$(PACKAGE)
+
+  AC_SUBST([pkgpyexecdir], [\${pyexecdir}/$PACKAGE])
+
+  dnl Run any user-specified action.
+  $2
+  fi
+
+])
+
+
+# AM_PYTHON_CHECK_VERSION(PROG, VERSION, [ACTION-IF-TRUE], [ACTION-IF-FALSE])
+# ---------------------------------------------------------------------------
+# Run ACTION-IF-TRUE if the Python interpreter PROG has version >= VERSION.
+# Run ACTION-IF-FALSE otherwise.
+# This test uses sys.hexversion instead of the string equivalent (first
+# word of sys.version), in order to cope with versions such as 2.2c1.
+# This supports Python 2.0 or higher. (2.0 was released on October 16, 2000).
+AC_DEFUN([AM_PYTHON_CHECK_VERSION],
+ [prog="import sys
+# split strings by '.' and convert to numeric.  Append some zeros
+# because we need at least 4 digits for the hex conversion.
+# map returns an iterator in Python 3.0 and a list in 2.x
+minver = list(map(int, '$2'.split('.'))) + [[0, 0, 0]]
+minverhex = 0
+# xrange is not present in Python 3.0 and range returns an iterator
+for i in list(range(0, 4)): minverhex = (minverhex << 8) + minver[[i]]
+sys.exit(sys.hexversion < minverhex)"
+  AS_IF([AM_RUN_LOG([$1 -c "$prog"])], [$3], [$4])])
+
+# Copyright (C) 2001, 2003, 2005, 2011 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 1
+
+# AM_RUN_LOG(COMMAND)
+# -------------------
+# Run COMMAND, save the exit status in ac_status, and log it.
+# (This has been adapted from Autoconf's _AC_RUN_LOG macro.)
+AC_DEFUN([AM_RUN_LOG],
+[{ echo "$as_me:$LINENO: $1" >&AS_MESSAGE_LOG_FD
+   ($1) >&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD
+   ac_status=$?
+   echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD
+   (exit $ac_status); }])
+
+# Check to make sure that the build environment is sane.    -*- Autoconf -*-
+
+# Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005, 2008
+# 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 5
+
+# 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
+# Reject unsafe characters in $srcdir or the absolute working directory
+# name.  Accept space and tab only in the latter.
+am_lf='
+'
+case `pwd` in
+  *[[\\\"\#\$\&\'\`$am_lf]]*)
+    AC_MSG_ERROR([unsafe absolute working directory name]);;
+esac
+case $srcdir in
+  *[[\\\"\#\$\&\'\`$am_lf\ \	]]*)
+    AC_MSG_ERROR([unsafe srcdir value: `$srcdir']);;
+esac
+
+# 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, 2011 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 1
+
+# 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="\$(install_sh) -c -s"
+AC_SUBST([INSTALL_STRIP_PROGRAM])])
+
+# Copyright (C) 2006, 2008, 2010 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_SUBST_NOTMAKE(VARIABLE)
+# ---------------------------
+# Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in.
+# This macro is traced by Automake.
+AC_DEFUN([_AM_SUBST_NOTMAKE])
+
+# AM_SUBST_NOTMAKE(VARIABLE)
+# --------------------------
+# Public sister of _AM_SUBST_NOTMAKE.
+AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)])
+
+# Check how to create a tarball.                            -*- Autoconf -*-
+
+# Copyright (C) 2004, 2005, 2012 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.  Yes, it's still used
+# in the wild :-(  We should find a proper way to deprecate it ...
+AC_SUBST([AMTAR], ['$${TAR-tar}'])
+m4_if([$1], [v7],
+     [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} 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
+
+m4_include([m4/libtool.m4])
+m4_include([m4/ltoptions.m4])
+m4_include([m4/ltsugar.m4])
+m4_include([m4/ltversion.m4])
+m4_include([m4/lt~obsolete.m4])
diff --git a/contrib/gtest-1.7.0/build-aux/config.guess b/contrib/gtest-1.7.0/build-aux/config.guess
new file mode 100755
index 0000000..d622a44
--- /dev/null
+++ b/contrib/gtest-1.7.0/build-aux/config.guess
@@ -0,0 +1,1530 @@
+#! /bin/sh
+# Attempt to guess a canonical system name.
+#   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
+#   2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010,
+#   2011, 2012 Free Software Foundation, Inc.
+
+timestamp='2012-02-10'
+
+# This 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 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, see <http://www.gnu.org/licenses/>.
+#
+# 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 Per Bothner.  Please send patches (context
+# diff format) to <config-patches at gnu.org> and include a ChangeLog
+# entry.
+#
+# This script attempts to guess a canonical system name similar to
+# config.sub.  If it succeeds, it prints the system name on stdout, and
+# exits with 0.  Otherwise, it exits with 1.
+#
+# You can get the latest version of this script from:
+# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD
+
+me=`echo "$0" | sed -e 's,.*/,,'`
+
+usage="\
+Usage: $0 [OPTION]
+
+Output the configuration name of the system \`$me' is run on.
+
+Operation modes:
+  -h, --help         print this help, then exit
+  -t, --time-stamp   print date of last modification, then exit
+  -v, --version      print version number, then exit
+
+Report bugs and patches to <config-patches at gnu.org>."
+
+version="\
+GNU config.guess ($timestamp)
+
+Originally written by Per Bothner.
+Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
+2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012
+Free Software Foundation, Inc.
+
+This is free software; see the source for copying conditions.  There is NO
+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
+
+help="
+Try \`$me --help' for more information."
+
+# Parse command line
+while test $# -gt 0 ; do
+  case $1 in
+    --time-stamp | --time* | -t )
+       echo "$timestamp" ; exit ;;
+    --version | -v )
+       echo "$version" ; exit ;;
+    --help | --h* | -h )
+       echo "$usage"; exit ;;
+    -- )     # Stop option processing
+       shift; break ;;
+    - )	# Use stdin as input.
+       break ;;
+    -* )
+       echo "$me: invalid option $1$help" >&2
+       exit 1 ;;
+    * )
+       break ;;
+  esac
+done
+
+if test $# != 0; then
+  echo "$me: too many arguments$help" >&2
+  exit 1
+fi
+
+trap 'exit 1' 1 2 15
+
+# CC_FOR_BUILD -- compiler used by this script. Note that the use of a
+# compiler to aid in system detection is discouraged as it requires
+# temporary files to be created and, as you can see below, it is a
+# headache to deal with in a portable fashion.
+
+# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still
+# use `HOST_CC' if defined, but it is deprecated.
+
+# Portable tmp directory creation inspired by the Autoconf team.
+
+set_cc_for_build='
+trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ;
+trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ;
+: ${TMPDIR=/tmp} ;
+ { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } ||
+ { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } ||
+ { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } ||
+ { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ;
+dummy=$tmp/dummy ;
+tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ;
+case $CC_FOR_BUILD,$HOST_CC,$CC in
+ ,,)    echo "int x;" > $dummy.c ;
+	for c in cc gcc c89 c99 ; do
+	  if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then
+	     CC_FOR_BUILD="$c"; break ;
+	  fi ;
+	done ;
+	if test x"$CC_FOR_BUILD" = x ; then
+	  CC_FOR_BUILD=no_compiler_found ;
+	fi
+	;;
+ ,,*)   CC_FOR_BUILD=$CC ;;
+ ,*,*)  CC_FOR_BUILD=$HOST_CC ;;
+esac ; set_cc_for_build= ;'
+
+# This is needed to find uname on a Pyramid OSx when run in the BSD universe.
+# (ghazi at noc.rutgers.edu 1994-08-24)
+if (test -f /.attbin/uname) >/dev/null 2>&1 ; then
+	PATH=$PATH:/.attbin ; export PATH
+fi
+
+UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown
+UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown
+UNAME_SYSTEM=`(uname -s) 2>/dev/null`  || UNAME_SYSTEM=unknown
+UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown
+
+# Note: order is significant - the case branches are not exclusive.
+
+case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
+    *:NetBSD:*:*)
+	# NetBSD (nbsd) targets should (where applicable) match one or
+	# more of the tuples: *-*-netbsdelf*, *-*-netbsdaout*,
+	# *-*-netbsdecoff* and *-*-netbsd*.  For targets that recently
+	# switched to ELF, *-*-netbsd* would select the old
+	# object file format.  This provides both forward
+	# compatibility and a consistent mechanism for selecting the
+	# object file format.
+	#
+	# Note: NetBSD doesn't particularly care about the vendor
+	# portion of the name.  We always set it to "unknown".
+	sysctl="sysctl -n hw.machine_arch"
+	UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \
+	    /usr/sbin/$sysctl 2>/dev/null || echo unknown)`
+	case "${UNAME_MACHINE_ARCH}" in
+	    armeb) machine=armeb-unknown ;;
+	    arm*) machine=arm-unknown ;;
+	    sh3el) machine=shl-unknown ;;
+	    sh3eb) machine=sh-unknown ;;
+	    sh5el) machine=sh5le-unknown ;;
+	    *) machine=${UNAME_MACHINE_ARCH}-unknown ;;
+	esac
+	# The Operating System including object format, if it has switched
+	# to ELF recently, or will in the future.
+	case "${UNAME_MACHINE_ARCH}" in
+	    arm*|i386|m68k|ns32k|sh3*|sparc|vax)
+		eval $set_cc_for_build
+		if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \
+			| grep -q __ELF__
+		then
+		    # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout).
+		    # Return netbsd for either.  FIX?
+		    os=netbsd
+		else
+		    os=netbsdelf
+		fi
+		;;
+	    *)
+		os=netbsd
+		;;
+	esac
+	# The OS release
+	# Debian GNU/NetBSD machines have a different userland, and
+	# thus, need a distinct triplet. However, they do not need
+	# kernel version information, so it can be replaced with a
+	# suitable tag, in the style of linux-gnu.
+	case "${UNAME_VERSION}" in
+	    Debian*)
+		release='-gnu'
+		;;
+	    *)
+		release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
+		;;
+	esac
+	# Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM:
+	# contains redundant information, the shorter form:
+	# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used.
+	echo "${machine}-${os}${release}"
+	exit ;;
+    *:OpenBSD:*:*)
+	UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'`
+	echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE}
+	exit ;;
+    *:ekkoBSD:*:*)
+	echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE}
+	exit ;;
+    *:SolidBSD:*:*)
+	echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE}
+	exit ;;
+    macppc:MirBSD:*:*)
+	echo powerpc-unknown-mirbsd${UNAME_RELEASE}
+	exit ;;
+    *:MirBSD:*:*)
+	echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE}
+	exit ;;
+    alpha:OSF1:*:*)
+	case $UNAME_RELEASE in
+	*4.0)
+		UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'`
+		;;
+	*5.*)
+		UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'`
+		;;
+	esac
+	# According to Compaq, /usr/sbin/psrinfo has been available on
+	# OSF/1 and Tru64 systems produced since 1995.  I hope that
+	# covers most systems running today.  This code pipes the CPU
+	# types through head -n 1, so we only detect the type of CPU 0.
+	ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^  The alpha \(.*\) processor.*$/\1/p' | head -n 1`
+	case "$ALPHA_CPU_TYPE" in
+	    "EV4 (21064)")
+		UNAME_MACHINE="alpha" ;;
+	    "EV4.5 (21064)")
+		UNAME_MACHINE="alpha" ;;
+	    "LCA4 (21066/21068)")
+		UNAME_MACHINE="alpha" ;;
+	    "EV5 (21164)")
+		UNAME_MACHINE="alphaev5" ;;
+	    "EV5.6 (21164A)")
+		UNAME_MACHINE="alphaev56" ;;
+	    "EV5.6 (21164PC)")
+		UNAME_MACHINE="alphapca56" ;;
+	    "EV5.7 (21164PC)")
+		UNAME_MACHINE="alphapca57" ;;
+	    "EV6 (21264)")
+		UNAME_MACHINE="alphaev6" ;;
+	    "EV6.7 (21264A)")
+		UNAME_MACHINE="alphaev67" ;;
+	    "EV6.8CB (21264C)")
+		UNAME_MACHINE="alphaev68" ;;
+	    "EV6.8AL (21264B)")
+		UNAME_MACHINE="alphaev68" ;;
+	    "EV6.8CX (21264D)")
+		UNAME_MACHINE="alphaev68" ;;
+	    "EV6.9A (21264/EV69A)")
+		UNAME_MACHINE="alphaev69" ;;
+	    "EV7 (21364)")
+		UNAME_MACHINE="alphaev7" ;;
+	    "EV7.9 (21364A)")
+		UNAME_MACHINE="alphaev79" ;;
+	esac
+	# A Pn.n version is a patched version.
+	# A Vn.n version is a released version.
+	# A Tn.n version is a released field test version.
+	# A Xn.n version is an unreleased experimental baselevel.
+	# 1.2 uses "1.2" for uname -r.
+	echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
+	# Reset EXIT trap before exiting to avoid spurious non-zero exit code.
+	exitcode=$?
+	trap '' 0
+	exit $exitcode ;;
+    Alpha\ *:Windows_NT*:*)
+	# How do we know it's Interix rather than the generic POSIX subsystem?
+	# Should we change UNAME_MACHINE based on the output of uname instead
+	# of the specific Alpha model?
+	echo alpha-pc-interix
+	exit ;;
+    21064:Windows_NT:50:3)
+	echo alpha-dec-winnt3.5
+	exit ;;
+    Amiga*:UNIX_System_V:4.0:*)
+	echo m68k-unknown-sysv4
+	exit ;;
+    *:[Aa]miga[Oo][Ss]:*:*)
+	echo ${UNAME_MACHINE}-unknown-amigaos
+	exit ;;
+    *:[Mm]orph[Oo][Ss]:*:*)
+	echo ${UNAME_MACHINE}-unknown-morphos
+	exit ;;
+    *:OS/390:*:*)
+	echo i370-ibm-openedition
+	exit ;;
+    *:z/VM:*:*)
+	echo s390-ibm-zvmoe
+	exit ;;
+    *:OS400:*:*)
+	echo powerpc-ibm-os400
+	exit ;;
+    arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*)
+	echo arm-acorn-riscix${UNAME_RELEASE}
+	exit ;;
+    arm:riscos:*:*|arm:RISCOS:*:*)
+	echo arm-unknown-riscos
+	exit ;;
+    SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*)
+	echo hppa1.1-hitachi-hiuxmpp
+	exit ;;
+    Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*)
+	# akee at wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE.
+	if test "`(/bin/universe) 2>/dev/null`" = att ; then
+		echo pyramid-pyramid-sysv3
+	else
+		echo pyramid-pyramid-bsd
+	fi
+	exit ;;
+    NILE*:*:*:dcosx)
+	echo pyramid-pyramid-svr4
+	exit ;;
+    DRS?6000:unix:4.0:6*)
+	echo sparc-icl-nx6
+	exit ;;
+    DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*)
+	case `/usr/bin/uname -p` in
+	    sparc) echo sparc-icl-nx7; exit ;;
+	esac ;;
+    s390x:SunOS:*:*)
+	echo ${UNAME_MACHINE}-ibm-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit ;;
+    sun4H:SunOS:5.*:*)
+	echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit ;;
+    sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*)
+	echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit ;;
+    i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*)
+	echo i386-pc-auroraux${UNAME_RELEASE}
+	exit ;;
+    i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*)
+	eval $set_cc_for_build
+	SUN_ARCH="i386"
+	# If there is a compiler, see if it is configured for 64-bit objects.
+	# Note that the Sun cc does not turn __LP64__ into 1 like gcc does.
+	# This test works for both compilers.
+	if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then
+	    if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \
+		(CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \
+		grep IS_64BIT_ARCH >/dev/null
+	    then
+		SUN_ARCH="x86_64"
+	    fi
+	fi
+	echo ${SUN_ARCH}-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit ;;
+    sun4*:SunOS:6*:*)
+	# According to config.sub, this is the proper way to canonicalize
+	# SunOS6.  Hard to guess exactly what SunOS6 will be like, but
+	# it's likely to be more like Solaris than SunOS4.
+	echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit ;;
+    sun4*:SunOS:*:*)
+	case "`/usr/bin/arch -k`" in
+	    Series*|S4*)
+		UNAME_RELEASE=`uname -v`
+		;;
+	esac
+	# Japanese Language versions have a version number like `4.1.3-JL'.
+	echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'`
+	exit ;;
+    sun3*:SunOS:*:*)
+	echo m68k-sun-sunos${UNAME_RELEASE}
+	exit ;;
+    sun*:*:4.2BSD:*)
+	UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null`
+	test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3
+	case "`/bin/arch`" in
+	    sun3)
+		echo m68k-sun-sunos${UNAME_RELEASE}
+		;;
+	    sun4)
+		echo sparc-sun-sunos${UNAME_RELEASE}
+		;;
+	esac
+	exit ;;
+    aushp:SunOS:*:*)
+	echo sparc-auspex-sunos${UNAME_RELEASE}
+	exit ;;
+    # The situation for MiNT is a little confusing.  The machine name
+    # can be virtually everything (everything which is not
+    # "atarist" or "atariste" at least should have a processor
+    # > m68000).  The system name ranges from "MiNT" over "FreeMiNT"
+    # to the lowercase version "mint" (or "freemint").  Finally
+    # the system name "TOS" denotes a system which is actually not
+    # MiNT.  But MiNT is downward compatible to TOS, so this should
+    # be no problem.
+    atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*)
+	echo m68k-atari-mint${UNAME_RELEASE}
+	exit ;;
+    atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*)
+	echo m68k-atari-mint${UNAME_RELEASE}
+	exit ;;
+    *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*)
+	echo m68k-atari-mint${UNAME_RELEASE}
+	exit ;;
+    milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*)
+	echo m68k-milan-mint${UNAME_RELEASE}
+	exit ;;
+    hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*)
+	echo m68k-hades-mint${UNAME_RELEASE}
+	exit ;;
+    *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*)
+	echo m68k-unknown-mint${UNAME_RELEASE}
+	exit ;;
+    m68k:machten:*:*)
+	echo m68k-apple-machten${UNAME_RELEASE}
+	exit ;;
+    powerpc:machten:*:*)
+	echo powerpc-apple-machten${UNAME_RELEASE}
+	exit ;;
+    RISC*:Mach:*:*)
+	echo mips-dec-mach_bsd4.3
+	exit ;;
+    RISC*:ULTRIX:*:*)
+	echo mips-dec-ultrix${UNAME_RELEASE}
+	exit ;;
+    VAX*:ULTRIX*:*:*)
+	echo vax-dec-ultrix${UNAME_RELEASE}
+	exit ;;
+    2020:CLIX:*:* | 2430:CLIX:*:*)
+	echo clipper-intergraph-clix${UNAME_RELEASE}
+	exit ;;
+    mips:*:*:UMIPS | mips:*:*:RISCos)
+	eval $set_cc_for_build
+	sed 's/^	//' << EOF >$dummy.c
+#ifdef __cplusplus
+#include <stdio.h>  /* for printf() prototype */
+	int main (int argc, char *argv[]) {
+#else
+	int main (argc, argv) int argc; char *argv[]; {
+#endif
+	#if defined (host_mips) && defined (MIPSEB)
+	#if defined (SYSTYPE_SYSV)
+	  printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0);
+	#endif
+	#if defined (SYSTYPE_SVR4)
+	  printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0);
+	#endif
+	#if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD)
+	  printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0);
+	#endif
+	#endif
+	  exit (-1);
+	}
+EOF
+	$CC_FOR_BUILD -o $dummy $dummy.c &&
+	  dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` &&
+	  SYSTEM_NAME=`$dummy $dummyarg` &&
+	    { echo "$SYSTEM_NAME"; exit; }
+	echo mips-mips-riscos${UNAME_RELEASE}
+	exit ;;
+    Motorola:PowerMAX_OS:*:*)
+	echo powerpc-motorola-powermax
+	exit ;;
+    Motorola:*:4.3:PL8-*)
+	echo powerpc-harris-powermax
+	exit ;;
+    Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*)
+	echo powerpc-harris-powermax
+	exit ;;
+    Night_Hawk:Power_UNIX:*:*)
+	echo powerpc-harris-powerunix
+	exit ;;
+    m88k:CX/UX:7*:*)
+	echo m88k-harris-cxux7
+	exit ;;
+    m88k:*:4*:R4*)
+	echo m88k-motorola-sysv4
+	exit ;;
+    m88k:*:3*:R3*)
+	echo m88k-motorola-sysv3
+	exit ;;
+    AViiON:dgux:*:*)
+	# DG/UX returns AViiON for all architectures
+	UNAME_PROCESSOR=`/usr/bin/uname -p`
+	if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ]
+	then
+	    if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \
+	       [ ${TARGET_BINARY_INTERFACE}x = x ]
+	    then
+		echo m88k-dg-dgux${UNAME_RELEASE}
+	    else
+		echo m88k-dg-dguxbcs${UNAME_RELEASE}
+	    fi
+	else
+	    echo i586-dg-dgux${UNAME_RELEASE}
+	fi
+	exit ;;
+    M88*:DolphinOS:*:*)	# DolphinOS (SVR3)
+	echo m88k-dolphin-sysv3
+	exit ;;
+    M88*:*:R3*:*)
+	# Delta 88k system running SVR3
+	echo m88k-motorola-sysv3
+	exit ;;
+    XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3)
+	echo m88k-tektronix-sysv3
+	exit ;;
+    Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD)
+	echo m68k-tektronix-bsd
+	exit ;;
+    *:IRIX*:*:*)
+	echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'`
+	exit ;;
+    ????????:AIX?:[12].1:2)   # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX.
+	echo romp-ibm-aix     # uname -m gives an 8 hex-code CPU id
+	exit ;;               # Note that: echo "'`uname -s`'" gives 'AIX '
+    i*86:AIX:*:*)
+	echo i386-ibm-aix
+	exit ;;
+    ia64:AIX:*:*)
+	if [ -x /usr/bin/oslevel ] ; then
+		IBM_REV=`/usr/bin/oslevel`
+	else
+		IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
+	fi
+	echo ${UNAME_MACHINE}-ibm-aix${IBM_REV}
+	exit ;;
+    *:AIX:2:3)
+	if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then
+		eval $set_cc_for_build
+		sed 's/^		//' << EOF >$dummy.c
+		#include <sys/systemcfg.h>
+
+		main()
+			{
+			if (!__power_pc())
+				exit(1);
+			puts("powerpc-ibm-aix3.2.5");
+			exit(0);
+			}
+EOF
+		if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy`
+		then
+			echo "$SYSTEM_NAME"
+		else
+			echo rs6000-ibm-aix3.2.5
+		fi
+	elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then
+		echo rs6000-ibm-aix3.2.4
+	else
+		echo rs6000-ibm-aix3.2
+	fi
+	exit ;;
+    *:AIX:*:[4567])
+	IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'`
+	if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then
+		IBM_ARCH=rs6000
+	else
+		IBM_ARCH=powerpc
+	fi
+	if [ -x /usr/bin/oslevel ] ; then
+		IBM_REV=`/usr/bin/oslevel`
+	else
+		IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
+	fi
+	echo ${IBM_ARCH}-ibm-aix${IBM_REV}
+	exit ;;
+    *:AIX:*:*)
+	echo rs6000-ibm-aix
+	exit ;;
+    ibmrt:4.4BSD:*|romp-ibm:BSD:*)
+	echo romp-ibm-bsd4.4
+	exit ;;
+    ibmrt:*BSD:*|romp-ibm:BSD:*)            # covers RT/PC BSD and
+	echo romp-ibm-bsd${UNAME_RELEASE}   # 4.3 with uname added to
+	exit ;;                             # report: romp-ibm BSD 4.3
+    *:BOSX:*:*)
+	echo rs6000-bull-bosx
+	exit ;;
+    DPX/2?00:B.O.S.:*:*)
+	echo m68k-bull-sysv3
+	exit ;;
+    9000/[34]??:4.3bsd:1.*:*)
+	echo m68k-hp-bsd
+	exit ;;
+    hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*)
+	echo m68k-hp-bsd4.4
+	exit ;;
+    9000/[34678]??:HP-UX:*:*)
+	HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
+	case "${UNAME_MACHINE}" in
+	    9000/31? )            HP_ARCH=m68000 ;;
+	    9000/[34]?? )         HP_ARCH=m68k ;;
+	    9000/[678][0-9][0-9])
+		if [ -x /usr/bin/getconf ]; then
+		    sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null`
+		    sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null`
+		    case "${sc_cpu_version}" in
+		      523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0
+		      528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1
+		      532)                      # CPU_PA_RISC2_0
+			case "${sc_kernel_bits}" in
+			  32) HP_ARCH="hppa2.0n" ;;
+			  64) HP_ARCH="hppa2.0w" ;;
+			  '') HP_ARCH="hppa2.0" ;;   # HP-UX 10.20
+			esac ;;
+		    esac
+		fi
+		if [ "${HP_ARCH}" = "" ]; then
+		    eval $set_cc_for_build
+		    sed 's/^		//' << EOF >$dummy.c
+
+		#define _HPUX_SOURCE
+		#include <stdlib.h>
+		#include <unistd.h>
+
+		int main ()
+		{
+		#if defined(_SC_KERNEL_BITS)
+		    long bits = sysconf(_SC_KERNEL_BITS);
+		#endif
+		    long cpu  = sysconf (_SC_CPU_VERSION);
+
+		    switch (cpu)
+			{
+			case CPU_PA_RISC1_0: puts ("hppa1.0"); break;
+			case CPU_PA_RISC1_1: puts ("hppa1.1"); break;
+			case CPU_PA_RISC2_0:
+		#if defined(_SC_KERNEL_BITS)
+			    switch (bits)
+				{
+				case 64: puts ("hppa2.0w"); break;
+				case 32: puts ("hppa2.0n"); break;
+				default: puts ("hppa2.0"); break;
+				} break;
+		#else  /* !defined(_SC_KERNEL_BITS) */
+			    puts ("hppa2.0"); break;
+		#endif
+			default: puts ("hppa1.0"); break;
+			}
+		    exit (0);
+		}
+EOF
+		    (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy`
+		    test -z "$HP_ARCH" && HP_ARCH=hppa
+		fi ;;
+	esac
+	if [ ${HP_ARCH} = "hppa2.0w" ]
+	then
+	    eval $set_cc_for_build
+
+	    # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating
+	    # 32-bit code.  hppa64-hp-hpux* has the same kernel and a compiler
+	    # generating 64-bit code.  GNU and HP use different nomenclature:
+	    #
+	    # $ CC_FOR_BUILD=cc ./config.guess
+	    # => hppa2.0w-hp-hpux11.23
+	    # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess
+	    # => hppa64-hp-hpux11.23
+
+	    if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) |
+		grep -q __LP64__
+	    then
+		HP_ARCH="hppa2.0w"
+	    else
+		HP_ARCH="hppa64"
+	    fi
+	fi
+	echo ${HP_ARCH}-hp-hpux${HPUX_REV}
+	exit ;;
+    ia64:HP-UX:*:*)
+	HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
+	echo ia64-hp-hpux${HPUX_REV}
+	exit ;;
+    3050*:HI-UX:*:*)
+	eval $set_cc_for_build
+	sed 's/^	//' << EOF >$dummy.c
+	#include <unistd.h>
+	int
+	main ()
+	{
+	  long cpu = sysconf (_SC_CPU_VERSION);
+	  /* The order matters, because CPU_IS_HP_MC68K erroneously returns
+	     true for CPU_PA_RISC1_0.  CPU_IS_PA_RISC returns correct
+	     results, however.  */
+	  if (CPU_IS_PA_RISC (cpu))
+	    {
+	      switch (cpu)
+		{
+		  case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break;
+		  case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break;
+		  case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break;
+		  default: puts ("hppa-hitachi-hiuxwe2"); break;
+		}
+	    }
+	  else if (CPU_IS_HP_MC68K (cpu))
+	    puts ("m68k-hitachi-hiuxwe2");
+	  else puts ("unknown-hitachi-hiuxwe2");
+	  exit (0);
+	}
+EOF
+	$CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` &&
+		{ echo "$SYSTEM_NAME"; exit; }
+	echo unknown-hitachi-hiuxwe2
+	exit ;;
+    9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* )
+	echo hppa1.1-hp-bsd
+	exit ;;
+    9000/8??:4.3bsd:*:*)
+	echo hppa1.0-hp-bsd
+	exit ;;
+    *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*)
+	echo hppa1.0-hp-mpeix
+	exit ;;
+    hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* )
+	echo hppa1.1-hp-osf
+	exit ;;
+    hp8??:OSF1:*:*)
+	echo hppa1.0-hp-osf
+	exit ;;
+    i*86:OSF1:*:*)
+	if [ -x /usr/sbin/sysversion ] ; then
+	    echo ${UNAME_MACHINE}-unknown-osf1mk
+	else
+	    echo ${UNAME_MACHINE}-unknown-osf1
+	fi
+	exit ;;
+    parisc*:Lites*:*:*)
+	echo hppa1.1-hp-lites
+	exit ;;
+    C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*)
+	echo c1-convex-bsd
+	exit ;;
+    C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*)
+	if getsysinfo -f scalar_acc
+	then echo c32-convex-bsd
+	else echo c2-convex-bsd
+	fi
+	exit ;;
+    C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*)
+	echo c34-convex-bsd
+	exit ;;
+    C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*)
+	echo c38-convex-bsd
+	exit ;;
+    C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*)
+	echo c4-convex-bsd
+	exit ;;
+    CRAY*Y-MP:*:*:*)
+	echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+	exit ;;
+    CRAY*[A-Z]90:*:*:*)
+	echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \
+	| sed -e 's/CRAY.*\([A-Z]90\)/\1/' \
+	      -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \
+	      -e 's/\.[^.]*$/.X/'
+	exit ;;
+    CRAY*TS:*:*:*)
+	echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+	exit ;;
+    CRAY*T3E:*:*:*)
+	echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+	exit ;;
+    CRAY*SV1:*:*:*)
+	echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+	exit ;;
+    *:UNICOS/mp:*:*)
+	echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
+	exit ;;
+    F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*)
+	FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
+	FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
+	FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'`
+	echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
+	exit ;;
+    5000:UNIX_System_V:4.*:*)
+	FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
+	FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'`
+	echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
+	exit ;;
+    i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*)
+	echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE}
+	exit ;;
+    sparc*:BSD/OS:*:*)
+	echo sparc-unknown-bsdi${UNAME_RELEASE}
+	exit ;;
+    *:BSD/OS:*:*)
+	echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE}
+	exit ;;
+    *:FreeBSD:*:*)
+	UNAME_PROCESSOR=`/usr/bin/uname -p`
+	case ${UNAME_PROCESSOR} in
+	    amd64)
+		echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
+	    *)
+		echo ${UNAME_PROCESSOR}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
+	esac
+	exit ;;
+    i*:CYGWIN*:*)
+	echo ${UNAME_MACHINE}-pc-cygwin
+	exit ;;
+    *:MINGW*:*)
+	echo ${UNAME_MACHINE}-pc-mingw32
+	exit ;;
+    i*:MSYS*:*)
+	echo ${UNAME_MACHINE}-pc-msys
+	exit ;;
+    i*:windows32*:*)
+	# uname -m includes "-pc" on this system.
+	echo ${UNAME_MACHINE}-mingw32
+	exit ;;
+    i*:PW*:*)
+	echo ${UNAME_MACHINE}-pc-pw32
+	exit ;;
+    *:Interix*:*)
+	case ${UNAME_MACHINE} in
+	    x86)
+		echo i586-pc-interix${UNAME_RELEASE}
+		exit ;;
+	    authenticamd | genuineintel | EM64T)
+		echo x86_64-unknown-interix${UNAME_RELEASE}
+		exit ;;
+	    IA64)
+		echo ia64-unknown-interix${UNAME_RELEASE}
+		exit ;;
+	esac ;;
+    [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*)
+	echo i${UNAME_MACHINE}-pc-mks
+	exit ;;
+    8664:Windows_NT:*)
+	echo x86_64-pc-mks
+	exit ;;
+    i*:Windows_NT*:* | Pentium*:Windows_NT*:*)
+	# How do we know it's Interix rather than the generic POSIX subsystem?
+	# It also conflicts with pre-2.0 versions of AT&T UWIN. Should we
+	# UNAME_MACHINE based on the output of uname instead of i386?
+	echo i586-pc-interix
+	exit ;;
+    i*:UWIN*:*)
+	echo ${UNAME_MACHINE}-pc-uwin
+	exit ;;
+    amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*)
+	echo x86_64-unknown-cygwin
+	exit ;;
+    p*:CYGWIN*:*)
+	echo powerpcle-unknown-cygwin
+	exit ;;
+    prep*:SunOS:5.*:*)
+	echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+	exit ;;
+    *:GNU:*:*)
+	# the GNU system
+	echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'`
+	exit ;;
+    *:GNU/*:*:*)
+	# other systems with GNU libc and userland
+	echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu
+	exit ;;
+    i*86:Minix:*:*)
+	echo ${UNAME_MACHINE}-pc-minix
+	exit ;;
+    aarch64:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit ;;
+    aarch64_be:Linux:*:*)
+	UNAME_MACHINE=aarch64_be
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit ;;
+    alpha:Linux:*:*)
+	case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in
+	  EV5)   UNAME_MACHINE=alphaev5 ;;
+	  EV56)  UNAME_MACHINE=alphaev56 ;;
+	  PCA56) UNAME_MACHINE=alphapca56 ;;
+	  PCA57) UNAME_MACHINE=alphapca56 ;;
+	  EV6)   UNAME_MACHINE=alphaev6 ;;
+	  EV67)  UNAME_MACHINE=alphaev67 ;;
+	  EV68*) UNAME_MACHINE=alphaev68 ;;
+	esac
+	objdump --private-headers /bin/sh | grep -q ld.so.1
+	if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi
+	echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC}
+	exit ;;
+    arm*:Linux:*:*)
+	eval $set_cc_for_build
+	if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \
+	    | grep -q __ARM_EABI__
+	then
+	    echo ${UNAME_MACHINE}-unknown-linux-gnu
+	else
+	    if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \
+		| grep -q __ARM_PCS_VFP
+	    then
+		echo ${UNAME_MACHINE}-unknown-linux-gnueabi
+	    else
+		echo ${UNAME_MACHINE}-unknown-linux-gnueabihf
+	    fi
+	fi
+	exit ;;
+    avr32*:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit ;;
+    cris:Linux:*:*)
+	echo ${UNAME_MACHINE}-axis-linux-gnu
+	exit ;;
+    crisv32:Linux:*:*)
+	echo ${UNAME_MACHINE}-axis-linux-gnu
+	exit ;;
+    frv:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit ;;
+    hexagon:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit ;;
+    i*86:Linux:*:*)
+	LIBC=gnu
+	eval $set_cc_for_build
+	sed 's/^	//' << EOF >$dummy.c
+	#ifdef __dietlibc__
+	LIBC=dietlibc
+	#endif
+EOF
+	eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC'`
+	echo "${UNAME_MACHINE}-pc-linux-${LIBC}"
+	exit ;;
+    ia64:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit ;;
+    m32r*:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit ;;
+    m68*:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit ;;
+    mips:Linux:*:* | mips64:Linux:*:*)
+	eval $set_cc_for_build
+	sed 's/^	//' << EOF >$dummy.c
+	#undef CPU
+	#undef ${UNAME_MACHINE}
+	#undef ${UNAME_MACHINE}el
+	#if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL)
+	CPU=${UNAME_MACHINE}el
+	#else
+	#if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB)
+	CPU=${UNAME_MACHINE}
+	#else
+	CPU=
+	#endif
+	#endif
+EOF
+	eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'`
+	test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; }
+	;;
+    or32:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit ;;
+    padre:Linux:*:*)
+	echo sparc-unknown-linux-gnu
+	exit ;;
+    parisc64:Linux:*:* | hppa64:Linux:*:*)
+	echo hppa64-unknown-linux-gnu
+	exit ;;
+    parisc:Linux:*:* | hppa:Linux:*:*)
+	# Look for CPU level
+	case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in
+	  PA7*) echo hppa1.1-unknown-linux-gnu ;;
+	  PA8*) echo hppa2.0-unknown-linux-gnu ;;
+	  *)    echo hppa-unknown-linux-gnu ;;
+	esac
+	exit ;;
+    ppc64:Linux:*:*)
+	echo powerpc64-unknown-linux-gnu
+	exit ;;
+    ppc:Linux:*:*)
+	echo powerpc-unknown-linux-gnu
+	exit ;;
+    s390:Linux:*:* | s390x:Linux:*:*)
+	echo ${UNAME_MACHINE}-ibm-linux
+	exit ;;
+    sh64*:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit ;;
+    sh*:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit ;;
+    sparc:Linux:*:* | sparc64:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit ;;
+    tile*:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit ;;
+    vax:Linux:*:*)
+	echo ${UNAME_MACHINE}-dec-linux-gnu
+	exit ;;
+    x86_64:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit ;;
+    xtensa*:Linux:*:*)
+	echo ${UNAME_MACHINE}-unknown-linux-gnu
+	exit ;;
+    i*86:DYNIX/ptx:4*:*)
+	# ptx 4.0 does uname -s correctly, with DYNIX/ptx in there.
+	# earlier versions are messed up and put the nodename in both
+	# sysname and nodename.
+	echo i386-sequent-sysv4
+	exit ;;
+    i*86:UNIX_SV:4.2MP:2.*)
+	# Unixware is an offshoot of SVR4, but it has its own version
+	# number series starting with 2...
+	# I am not positive that other SVR4 systems won't match this,
+	# I just have to hope.  -- rms.
+	# Use sysv4.2uw... so that sysv4* matches it.
+	echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION}
+	exit ;;
+    i*86:OS/2:*:*)
+	# If we were able to find `uname', then EMX Unix compatibility
+	# is probably installed.
+	echo ${UNAME_MACHINE}-pc-os2-emx
+	exit ;;
+    i*86:XTS-300:*:STOP)
+	echo ${UNAME_MACHINE}-unknown-stop
+	exit ;;
+    i*86:atheos:*:*)
+	echo ${UNAME_MACHINE}-unknown-atheos
+	exit ;;
+    i*86:syllable:*:*)
+	echo ${UNAME_MACHINE}-pc-syllable
+	exit ;;
+    i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*)
+	echo i386-unknown-lynxos${UNAME_RELEASE}
+	exit ;;
+    i*86:*DOS:*:*)
+	echo ${UNAME_MACHINE}-pc-msdosdjgpp
+	exit ;;
+    i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*)
+	UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'`
+	if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then
+		echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL}
+	else
+		echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL}
+	fi
+	exit ;;
+    i*86:*:5:[678]*)
+	# UnixWare 7.x, OpenUNIX and OpenServer 6.
+	case `/bin/uname -X | grep "^Machine"` in
+	    *486*)	     UNAME_MACHINE=i486 ;;
+	    *Pentium)	     UNAME_MACHINE=i586 ;;
+	    *Pent*|*Celeron) UNAME_MACHINE=i686 ;;
+	esac
+	echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION}
+	exit ;;
+    i*86:*:3.2:*)
+	if test -f /usr/options/cb.name; then
+		UNAME_REL=`sed -n 's/.*Version //p' </usr/options/cb.name`
+		echo ${UNAME_MACHINE}-pc-isc$UNAME_REL
+	elif /bin/uname -X 2>/dev/null >/dev/null ; then
+		UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')`
+		(/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486
+		(/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \
+			&& UNAME_MACHINE=i586
+		(/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \
+			&& UNAME_MACHINE=i686
+		(/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \
+			&& UNAME_MACHINE=i686
+		echo ${UNAME_MACHINE}-pc-sco$UNAME_REL
+	else
+		echo ${UNAME_MACHINE}-pc-sysv32
+	fi
+	exit ;;
+    pc:*:*:*)
+	# Left here for compatibility:
+	# uname -m prints for DJGPP always 'pc', but it prints nothing about
+	# the processor, so we play safe by assuming i586.
+	# Note: whatever this is, it MUST be the same as what config.sub
+	# prints for the "djgpp" host, or else GDB configury will decide that
+	# this is a cross-build.
+	echo i586-pc-msdosdjgpp
+	exit ;;
+    Intel:Mach:3*:*)
+	echo i386-pc-mach3
+	exit ;;
+    paragon:*:*:*)
+	echo i860-intel-osf1
+	exit ;;
+    i860:*:4.*:*) # i860-SVR4
+	if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then
+	  echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4
+	else # Add other i860-SVR4 vendors below as they are discovered.
+	  echo i860-unknown-sysv${UNAME_RELEASE}  # Unknown i860-SVR4
+	fi
+	exit ;;
+    mini*:CTIX:SYS*5:*)
+	# "miniframe"
+	echo m68010-convergent-sysv
+	exit ;;
+    mc68k:UNIX:SYSTEM5:3.51m)
+	echo m68k-convergent-sysv
+	exit ;;
+    M680?0:D-NIX:5.3:*)
+	echo m68k-diab-dnix
+	exit ;;
+    M68*:*:R3V[5678]*:*)
+	test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;;
+    3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0)
+	OS_REL=''
+	test -r /etc/.relid \
+	&& OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`
+	/bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+	  && { echo i486-ncr-sysv4.3${OS_REL}; exit; }
+	/bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
+	  && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;;
+    3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*)
+	/bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+	  && { echo i486-ncr-sysv4; exit; } ;;
+    NCR*:*:4.2:* | MPRAS*:*:4.2:*)
+	OS_REL='.3'
+	test -r /etc/.relid \
+	    && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`
+	/bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+	    && { echo i486-ncr-sysv4.3${OS_REL}; exit; }
+	/bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
+	    && { echo i586-ncr-sysv4.3${OS_REL}; exit; }
+	/bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \
+	    && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;;
+    m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*)
+	echo m68k-unknown-lynxos${UNAME_RELEASE}
+	exit ;;
+    mc68030:UNIX_System_V:4.*:*)
+	echo m68k-atari-sysv4
+	exit ;;
+    TSUNAMI:LynxOS:2.*:*)
+	echo sparc-unknown-lynxos${UNAME_RELEASE}
+	exit ;;
+    rs6000:LynxOS:2.*:*)
+	echo rs6000-unknown-lynxos${UNAME_RELEASE}
+	exit ;;
+    PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*)
+	echo powerpc-unknown-lynxos${UNAME_RELEASE}
+	exit ;;
+    SM[BE]S:UNIX_SV:*:*)
+	echo mips-dde-sysv${UNAME_RELEASE}
+	exit ;;
+    RM*:ReliantUNIX-*:*:*)
+	echo mips-sni-sysv4
+	exit ;;
+    RM*:SINIX-*:*:*)
+	echo mips-sni-sysv4
+	exit ;;
+    *:SINIX-*:*:*)
+	if uname -p 2>/dev/null >/dev/null ; then
+		UNAME_MACHINE=`(uname -p) 2>/dev/null`
+		echo ${UNAME_MACHINE}-sni-sysv4
+	else
+		echo ns32k-sni-sysv
+	fi
+	exit ;;
+    PENTIUM:*:4.0*:*)	# Unisys `ClearPath HMP IX 4000' SVR4/MP effort
+			# says <Richard.M.Bartel at ccMail.Census.GOV>
+	echo i586-unisys-sysv4
+	exit ;;
+    *:UNIX_System_V:4*:FTX*)
+	# From Gerald Hewes <hewes at openmarket.com>.
+	# How about differentiating between stratus architectures? -djm
+	echo hppa1.1-stratus-sysv4
+	exit ;;
+    *:*:*:FTX*)
+	# From seanf at swdc.stratus.com.
+	echo i860-stratus-sysv4
+	exit ;;
+    i*86:VOS:*:*)
+	# From Paul.Green at stratus.com.
+	echo ${UNAME_MACHINE}-stratus-vos
+	exit ;;
+    *:VOS:*:*)
+	# From Paul.Green at stratus.com.
+	echo hppa1.1-stratus-vos
+	exit ;;
+    mc68*:A/UX:*:*)
+	echo m68k-apple-aux${UNAME_RELEASE}
+	exit ;;
+    news*:NEWS-OS:6*:*)
+	echo mips-sony-newsos6
+	exit ;;
+    R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*)
+	if [ -d /usr/nec ]; then
+		echo mips-nec-sysv${UNAME_RELEASE}
+	else
+		echo mips-unknown-sysv${UNAME_RELEASE}
+	fi
+	exit ;;
+    BeBox:BeOS:*:*)	# BeOS running on hardware made by Be, PPC only.
+	echo powerpc-be-beos
+	exit ;;
+    BeMac:BeOS:*:*)	# BeOS running on Mac or Mac clone, PPC only.
+	echo powerpc-apple-beos
+	exit ;;
+    BePC:BeOS:*:*)	# BeOS running on Intel PC compatible.
+	echo i586-pc-beos
+	exit ;;
+    BePC:Haiku:*:*)	# Haiku running on Intel PC compatible.
+	echo i586-pc-haiku
+	exit ;;
+    SX-4:SUPER-UX:*:*)
+	echo sx4-nec-superux${UNAME_RELEASE}
+	exit ;;
+    SX-5:SUPER-UX:*:*)
+	echo sx5-nec-superux${UNAME_RELEASE}
+	exit ;;
+    SX-6:SUPER-UX:*:*)
+	echo sx6-nec-superux${UNAME_RELEASE}
+	exit ;;
+    SX-7:SUPER-UX:*:*)
+	echo sx7-nec-superux${UNAME_RELEASE}
+	exit ;;
+    SX-8:SUPER-UX:*:*)
+	echo sx8-nec-superux${UNAME_RELEASE}
+	exit ;;
+    SX-8R:SUPER-UX:*:*)
+	echo sx8r-nec-superux${UNAME_RELEASE}
+	exit ;;
+    Power*:Rhapsody:*:*)
+	echo powerpc-apple-rhapsody${UNAME_RELEASE}
+	exit ;;
+    *:Rhapsody:*:*)
+	echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE}
+	exit ;;
+    *:Darwin:*:*)
+	UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown
+	case $UNAME_PROCESSOR in
+	    i386)
+		eval $set_cc_for_build
+		if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then
+		  if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \
+		      (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \
+		      grep IS_64BIT_ARCH >/dev/null
+		  then
+		      UNAME_PROCESSOR="x86_64"
+		  fi
+		fi ;;
+	    unknown) UNAME_PROCESSOR=powerpc ;;
+	esac
+	echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE}
+	exit ;;
+    *:procnto*:*:* | *:QNX:[0123456789]*:*)
+	UNAME_PROCESSOR=`uname -p`
+	if test "$UNAME_PROCESSOR" = "x86"; then
+		UNAME_PROCESSOR=i386
+		UNAME_MACHINE=pc
+	fi
+	echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE}
+	exit ;;
+    *:QNX:*:4*)
+	echo i386-pc-qnx
+	exit ;;
+    NEO-?:NONSTOP_KERNEL:*:*)
+	echo neo-tandem-nsk${UNAME_RELEASE}
+	exit ;;
+    NSE-?:NONSTOP_KERNEL:*:*)
+	echo nse-tandem-nsk${UNAME_RELEASE}
+	exit ;;
+    NSR-?:NONSTOP_KERNEL:*:*)
+	echo nsr-tandem-nsk${UNAME_RELEASE}
+	exit ;;
+    *:NonStop-UX:*:*)
+	echo mips-compaq-nonstopux
+	exit ;;
+    BS2000:POSIX*:*:*)
+	echo bs2000-siemens-sysv
+	exit ;;
+    DS/*:UNIX_System_V:*:*)
+	echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE}
+	exit ;;
+    *:Plan9:*:*)
+	# "uname -m" is not consistent, so use $cputype instead. 386
+	# is converted to i386 for consistency with other x86
+	# operating systems.
+	if test "$cputype" = "386"; then
+	    UNAME_MACHINE=i386
+	else
+	    UNAME_MACHINE="$cputype"
+	fi
+	echo ${UNAME_MACHINE}-unknown-plan9
+	exit ;;
+    *:TOPS-10:*:*)
+	echo pdp10-unknown-tops10
+	exit ;;
+    *:TENEX:*:*)
+	echo pdp10-unknown-tenex
+	exit ;;
+    KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*)
+	echo pdp10-dec-tops20
+	exit ;;
+    XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*)
+	echo pdp10-xkl-tops20
+	exit ;;
+    *:TOPS-20:*:*)
+	echo pdp10-unknown-tops20
+	exit ;;
+    *:ITS:*:*)
+	echo pdp10-unknown-its
+	exit ;;
+    SEI:*:*:SEIUX)
+	echo mips-sei-seiux${UNAME_RELEASE}
+	exit ;;
+    *:DragonFly:*:*)
+	echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`
+	exit ;;
+    *:*VMS:*:*)
+	UNAME_MACHINE=`(uname -p) 2>/dev/null`
+	case "${UNAME_MACHINE}" in
+	    A*) echo alpha-dec-vms ; exit ;;
+	    I*) echo ia64-dec-vms ; exit ;;
+	    V*) echo vax-dec-vms ; exit ;;
+	esac ;;
+    *:XENIX:*:SysV)
+	echo i386-pc-xenix
+	exit ;;
+    i*86:skyos:*:*)
+	echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//'
+	exit ;;
+    i*86:rdos:*:*)
+	echo ${UNAME_MACHINE}-pc-rdos
+	exit ;;
+    i*86:AROS:*:*)
+	echo ${UNAME_MACHINE}-pc-aros
+	exit ;;
+    x86_64:VMkernel:*:*)
+	echo ${UNAME_MACHINE}-unknown-esx
+	exit ;;
+esac
+
+#echo '(No uname command or uname output not recognized.)' 1>&2
+#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2
+
+eval $set_cc_for_build
+cat >$dummy.c <<EOF
+#ifdef _SEQUENT_
+# include <sys/types.h>
+# include <sys/utsname.h>
+#endif
+main ()
+{
+#if defined (sony)
+#if defined (MIPSEB)
+  /* BFD wants "bsd" instead of "newsos".  Perhaps BFD should be changed,
+     I don't know....  */
+  printf ("mips-sony-bsd\n"); exit (0);
+#else
+#include <sys/param.h>
+  printf ("m68k-sony-newsos%s\n",
+#ifdef NEWSOS4
+	"4"
+#else
+	""
+#endif
+	); exit (0);
+#endif
+#endif
+
+#if defined (__arm) && defined (__acorn) && defined (__unix)
+  printf ("arm-acorn-riscix\n"); exit (0);
+#endif
+
+#if defined (hp300) && !defined (hpux)
+  printf ("m68k-hp-bsd\n"); exit (0);
+#endif
+
+#if defined (NeXT)
+#if !defined (__ARCHITECTURE__)
+#define __ARCHITECTURE__ "m68k"
+#endif
+  int version;
+  version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`;
+  if (version < 4)
+    printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version);
+  else
+    printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version);
+  exit (0);
+#endif
+
+#if defined (MULTIMAX) || defined (n16)
+#if defined (UMAXV)
+  printf ("ns32k-encore-sysv\n"); exit (0);
+#else
+#if defined (CMU)
+  printf ("ns32k-encore-mach\n"); exit (0);
+#else
+  printf ("ns32k-encore-bsd\n"); exit (0);
+#endif
+#endif
+#endif
+
+#if defined (__386BSD__)
+  printf ("i386-pc-bsd\n"); exit (0);
+#endif
+
+#if defined (sequent)
+#if defined (i386)
+  printf ("i386-sequent-dynix\n"); exit (0);
+#endif
+#if defined (ns32000)
+  printf ("ns32k-sequent-dynix\n"); exit (0);
+#endif
+#endif
+
+#if defined (_SEQUENT_)
+    struct utsname un;
+
+    uname(&un);
+
+    if (strncmp(un.version, "V2", 2) == 0) {
+	printf ("i386-sequent-ptx2\n"); exit (0);
+    }
+    if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */
+	printf ("i386-sequent-ptx1\n"); exit (0);
+    }
+    printf ("i386-sequent-ptx\n"); exit (0);
+
+#endif
+
+#if defined (vax)
+# if !defined (ultrix)
+#  include <sys/param.h>
+#  if defined (BSD)
+#   if BSD == 43
+      printf ("vax-dec-bsd4.3\n"); exit (0);
+#   else
+#    if BSD == 199006
+      printf ("vax-dec-bsd4.3reno\n"); exit (0);
+#    else
+      printf ("vax-dec-bsd\n"); exit (0);
+#    endif
+#   endif
+#  else
+    printf ("vax-dec-bsd\n"); exit (0);
+#  endif
+# else
+    printf ("vax-dec-ultrix\n"); exit (0);
+# endif
+#endif
+
+#if defined (alliant) && defined (i860)
+  printf ("i860-alliant-bsd\n"); exit (0);
+#endif
+
+  exit (1);
+}
+EOF
+
+$CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` &&
+	{ echo "$SYSTEM_NAME"; exit; }
+
+# Apollos put the system type in the environment.
+
+test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; }
+
+# Convex versions that predate uname can use getsysinfo(1)
+
+if [ -x /usr/convex/getsysinfo ]
+then
+    case `getsysinfo -f cpu_type` in
+    c1*)
+	echo c1-convex-bsd
+	exit ;;
+    c2*)
+	if getsysinfo -f scalar_acc
+	then echo c32-convex-bsd
+	else echo c2-convex-bsd
+	fi
+	exit ;;
+    c34*)
+	echo c34-convex-bsd
+	exit ;;
+    c38*)
+	echo c38-convex-bsd
+	exit ;;
+    c4*)
+	echo c4-convex-bsd
+	exit ;;
+    esac
+fi
+
+cat >&2 <<EOF
+$0: unable to guess system type
+
+This script, last modified $timestamp, has failed to recognize
+the operating system you are using. It is advised that you
+download the most up to date version of the config scripts from
+
+  http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD
+and
+  http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD
+
+If the version you run ($0) is already up to date, please
+send the following data and any information you think might be
+pertinent to <config-patches at gnu.org> in order to provide the needed
+information to handle your system.
+
+config.guess timestamp = $timestamp
+
+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`
+/bin/uname -X     = `(/bin/uname -X) 2>/dev/null`
+
+hostinfo               = `(hostinfo) 2>/dev/null`
+/bin/universe          = `(/bin/universe) 2>/dev/null`
+/usr/bin/arch -k       = `(/usr/bin/arch -k) 2>/dev/null`
+/bin/arch              = `(/bin/arch) 2>/dev/null`
+/usr/bin/oslevel       = `(/usr/bin/oslevel) 2>/dev/null`
+/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null`
+
+UNAME_MACHINE = ${UNAME_MACHINE}
+UNAME_RELEASE = ${UNAME_RELEASE}
+UNAME_SYSTEM  = ${UNAME_SYSTEM}
+UNAME_VERSION = ${UNAME_VERSION}
+EOF
+
+exit 1
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "timestamp='"
+# time-stamp-format: "%:y-%02m-%02d"
+# time-stamp-end: "'"
+# End:
diff --git a/contrib/gtest-1.7.0/build-aux/config.h.in b/contrib/gtest-1.7.0/build-aux/config.h.in
new file mode 100644
index 0000000..843b5b1
--- /dev/null
+++ b/contrib/gtest-1.7.0/build-aux/config.h.in
@@ -0,0 +1,69 @@
+/* build-aux/config.h.in.  Generated from configure.ac by autoheader.  */
+
+/* Define to 1 if you have the <dlfcn.h> header file. */
+#undef HAVE_DLFCN_H
+
+/* 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 if you have POSIX threads libraries and header files. */
+#undef HAVE_PTHREAD
+
+/* 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/types.h> header file. */
+#undef HAVE_SYS_TYPES_H
+
+/* Define to 1 if you have the <unistd.h> header file. */
+#undef HAVE_UNISTD_H
+
+/* Define to the sub-directory in which libtool stores uninstalled libraries.
+   */
+#undef LT_OBJDIR
+
+/* 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 home page for this package. */
+#undef PACKAGE_URL
+
+/* Define to the version of this package. */
+#undef PACKAGE_VERSION
+
+/* Define to necessary symbol if this constant uses a non-standard name on
+   your system. */
+#undef PTHREAD_CREATE_JOINABLE
+
+/* Define to 1 if you have the ANSI C header files. */
+#undef STDC_HEADERS
+
+/* Version number of package */
+#undef VERSION
diff --git a/contrib/gtest-1.7.0/build-aux/config.sub b/contrib/gtest-1.7.0/build-aux/config.sub
new file mode 100755
index 0000000..c894da4
--- /dev/null
+++ b/contrib/gtest-1.7.0/build-aux/config.sub
@@ -0,0 +1,1773 @@
+#! /bin/sh
+# Configuration validation subroutine script.
+#   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
+#   2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010,
+#   2011, 2012 Free Software Foundation, Inc.
+
+timestamp='2012-02-10'
+
+# This file is (in principle) common to ALL GNU software.
+# The presence of a machine in this file suggests that SOME GNU software
+# can handle that machine.  It does not imply ALL GNU software can.
+#
+# This 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 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, see <http://www.gnu.org/licenses/>.
+#
+# 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.
+
+
+# Please send patches to <config-patches at gnu.org>.  Submit a context
+# diff and a properly formatted GNU ChangeLog entry.
+#
+# Configuration subroutine to validate and canonicalize a configuration type.
+# Supply the specified configuration type as an argument.
+# If it is invalid, we print an error message on stderr and exit with code 1.
+# Otherwise, we print the canonical config type on stdout and succeed.
+
+# You can get the latest version of this script from:
+# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD
+
+# This file is supposed to be the same for all GNU packages
+# and recognize all the CPU types, system types and aliases
+# that are meaningful with *any* GNU software.
+# Each package is responsible for reporting which valid configurations
+# it does not support.  The user should be able to distinguish
+# a failure to support a valid configuration from a meaningless
+# configuration.
+
+# The goal of this file is to map all the various variations of a given
+# machine specification into a single specification in the form:
+#	CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM
+# or in some cases, the newer four-part form:
+#	CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM
+# It is wrong to echo any other type of specification.
+
+me=`echo "$0" | sed -e 's,.*/,,'`
+
+usage="\
+Usage: $0 [OPTION] CPU-MFR-OPSYS
+       $0 [OPTION] ALIAS
+
+Canonicalize a configuration name.
+
+Operation modes:
+  -h, --help         print this help, then exit
+  -t, --time-stamp   print date of last modification, then exit
+  -v, --version      print version number, then exit
+
+Report bugs and patches to <config-patches at gnu.org>."
+
+version="\
+GNU config.sub ($timestamp)
+
+Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
+2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012
+Free Software Foundation, Inc.
+
+This is free software; see the source for copying conditions.  There is NO
+warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
+
+help="
+Try \`$me --help' for more information."
+
+# Parse command line
+while test $# -gt 0 ; do
+  case $1 in
+    --time-stamp | --time* | -t )
+       echo "$timestamp" ; exit ;;
+    --version | -v )
+       echo "$version" ; exit ;;
+    --help | --h* | -h )
+       echo "$usage"; exit ;;
+    -- )     # Stop option processing
+       shift; break ;;
+    - )	# Use stdin as input.
+       break ;;
+    -* )
+       echo "$me: invalid option $1$help"
+       exit 1 ;;
+
+    *local*)
+       # First pass through any local machine types.
+       echo $1
+       exit ;;
+
+    * )
+       break ;;
+  esac
+done
+
+case $# in
+ 0) echo "$me: missing argument$help" >&2
+    exit 1;;
+ 1) ;;
+ *) echo "$me: too many arguments$help" >&2
+    exit 1;;
+esac
+
+# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any).
+# Here we must recognize all the valid KERNEL-OS combinations.
+maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'`
+case $maybe_os in
+  nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \
+  linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \
+  knetbsd*-gnu* | netbsd*-gnu* | \
+  kopensolaris*-gnu* | \
+  storm-chaos* | os2-emx* | rtmk-nova*)
+    os=-$maybe_os
+    basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`
+    ;;
+  android-linux)
+    os=-linux-android
+    basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`-unknown
+    ;;
+  *)
+    basic_machine=`echo $1 | sed 's/-[^-]*$//'`
+    if [ $basic_machine != $1 ]
+    then os=`echo $1 | sed 's/.*-/-/'`
+    else os=; fi
+    ;;
+esac
+
+### Let's recognize common machines as not being operating systems so
+### that things like config.sub decstation-3100 work.  We also
+### recognize some manufacturers as not being operating systems, so we
+### can provide default operating systems below.
+case $os in
+	-sun*os*)
+		# Prevent following clause from handling this invalid input.
+		;;
+	-dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \
+	-att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \
+	-unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \
+	-convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\
+	-c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \
+	-harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \
+	-apple | -axis | -knuth | -cray | -microblaze)
+		os=
+		basic_machine=$1
+		;;
+	-bluegene*)
+		os=-cnk
+		;;
+	-sim | -cisco | -oki | -wec | -winbond)
+		os=
+		basic_machine=$1
+		;;
+	-scout)
+		;;
+	-wrs)
+		os=-vxworks
+		basic_machine=$1
+		;;
+	-chorusos*)
+		os=-chorusos
+		basic_machine=$1
+		;;
+	-chorusrdb)
+		os=-chorusrdb
+		basic_machine=$1
+		;;
+	-hiux*)
+		os=-hiuxwe2
+		;;
+	-sco6)
+		os=-sco5v6
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-sco5)
+		os=-sco3.2v5
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-sco4)
+		os=-sco3.2v4
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-sco3.2.[4-9]*)
+		os=`echo $os | sed -e 's/sco3.2./sco3.2v/'`
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-sco3.2v[4-9]*)
+		# Don't forget version if it is 3.2v4 or newer.
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-sco5v6*)
+		# Don't forget version if it is 3.2v4 or newer.
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-sco*)
+		os=-sco3.2v2
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-udk*)
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-isc)
+		os=-isc2.2
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-clix*)
+		basic_machine=clipper-intergraph
+		;;
+	-isc*)
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+		;;
+	-lynx*)
+		os=-lynxos
+		;;
+	-ptx*)
+		basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'`
+		;;
+	-windowsnt*)
+		os=`echo $os | sed -e 's/windowsnt/winnt/'`
+		;;
+	-psos*)
+		os=-psos
+		;;
+	-mint | -mint[0-9]*)
+		basic_machine=m68k-atari
+		os=-mint
+		;;
+esac
+
+# Decode aliases for certain CPU-COMPANY combinations.
+case $basic_machine in
+	# Recognize the basic CPU types without company name.
+	# Some are omitted here because they have special meanings below.
+	1750a | 580 \
+	| a29k \
+	| aarch64 | aarch64_be \
+	| alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \
+	| alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \
+	| am33_2.0 \
+	| arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr | avr32 \
+        | be32 | be64 \
+	| bfin \
+	| c4x | clipper \
+	| d10v | d30v | dlx | dsp16xx \
+	| epiphany \
+	| fido | fr30 | frv \
+	| h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \
+	| hexagon \
+	| i370 | i860 | i960 | ia64 \
+	| ip2k | iq2000 \
+	| le32 | le64 \
+	| lm32 \
+	| m32c | m32r | m32rle | m68000 | m68k | m88k \
+	| maxq | mb | microblaze | mcore | mep | metag \
+	| mips | mipsbe | mipseb | mipsel | mipsle \
+	| mips16 \
+	| mips64 | mips64el \
+	| mips64octeon | mips64octeonel \
+	| mips64orion | mips64orionel \
+	| mips64r5900 | mips64r5900el \
+	| mips64vr | mips64vrel \
+	| mips64vr4100 | mips64vr4100el \
+	| mips64vr4300 | mips64vr4300el \
+	| mips64vr5000 | mips64vr5000el \
+	| mips64vr5900 | mips64vr5900el \
+	| mipsisa32 | mipsisa32el \
+	| mipsisa32r2 | mipsisa32r2el \
+	| mipsisa64 | mipsisa64el \
+	| mipsisa64r2 | mipsisa64r2el \
+	| mipsisa64sb1 | mipsisa64sb1el \
+	| mipsisa64sr71k | mipsisa64sr71kel \
+	| mipstx39 | mipstx39el \
+	| mn10200 | mn10300 \
+	| moxie \
+	| mt \
+	| msp430 \
+	| nds32 | nds32le | nds32be \
+	| nios | nios2 \
+	| ns16k | ns32k \
+	| open8 \
+	| or32 \
+	| pdp10 | pdp11 | pj | pjl \
+	| powerpc | powerpc64 | powerpc64le | powerpcle \
+	| pyramid \
+	| rl78 | rx \
+	| score \
+	| sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \
+	| sh64 | sh64le \
+	| sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \
+	| sparcv8 | sparcv9 | sparcv9b | sparcv9v \
+	| spu \
+	| tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \
+	| ubicom32 \
+	| v850 | v850e | v850e1 | v850e2 | v850es | v850e2v3 \
+	| we32k \
+	| x86 | xc16x | xstormy16 | xtensa \
+	| z8k | z80)
+		basic_machine=$basic_machine-unknown
+		;;
+	c54x)
+		basic_machine=tic54x-unknown
+		;;
+	c55x)
+		basic_machine=tic55x-unknown
+		;;
+	c6x)
+		basic_machine=tic6x-unknown
+		;;
+	m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | picochip)
+		basic_machine=$basic_machine-unknown
+		os=-none
+		;;
+	m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k)
+		;;
+	ms1)
+		basic_machine=mt-unknown
+		;;
+
+	strongarm | thumb | xscale)
+		basic_machine=arm-unknown
+		;;
+	xgate)
+		basic_machine=$basic_machine-unknown
+		os=-none
+		;;
+	xscaleeb)
+		basic_machine=armeb-unknown
+		;;
+
+	xscaleel)
+		basic_machine=armel-unknown
+		;;
+
+	# We use `pc' rather than `unknown'
+	# because (1) that's what they normally are, and
+	# (2) the word "unknown" tends to confuse beginning users.
+	i*86 | x86_64)
+	  basic_machine=$basic_machine-pc
+	  ;;
+	# Object if more than one company name word.
+	*-*-*)
+		echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
+		exit 1
+		;;
+	# Recognize the basic CPU types with company name.
+	580-* \
+	| a29k-* \
+	| aarch64-* | aarch64_be-* \
+	| alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \
+	| alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \
+	| alphapca5[67]-* | alpha64pca5[67]-* | arc-* \
+	| arm-*  | armbe-* | armle-* | armeb-* | armv*-* \
+	| avr-* | avr32-* \
+	| be32-* | be64-* \
+	| bfin-* | bs2000-* \
+	| c[123]* | c30-* | [cjt]90-* | c4x-* \
+	| clipper-* | craynv-* | cydra-* \
+	| d10v-* | d30v-* | dlx-* \
+	| elxsi-* \
+	| f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \
+	| h8300-* | h8500-* \
+	| hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \
+	| hexagon-* \
+	| i*86-* | i860-* | i960-* | ia64-* \
+	| ip2k-* | iq2000-* \
+	| le32-* | le64-* \
+	| lm32-* \
+	| m32c-* | m32r-* | m32rle-* \
+	| m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \
+	| m88110-* | m88k-* | maxq-* | mcore-* | metag-* | microblaze-* \
+	| mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \
+	| mips16-* \
+	| mips64-* | mips64el-* \
+	| mips64octeon-* | mips64octeonel-* \
+	| mips64orion-* | mips64orionel-* \
+	| mips64r5900-* | mips64r5900el-* \
+	| mips64vr-* | mips64vrel-* \
+	| mips64vr4100-* | mips64vr4100el-* \
+	| mips64vr4300-* | mips64vr4300el-* \
+	| mips64vr5000-* | mips64vr5000el-* \
+	| mips64vr5900-* | mips64vr5900el-* \
+	| mipsisa32-* | mipsisa32el-* \
+	| mipsisa32r2-* | mipsisa32r2el-* \
+	| mipsisa64-* | mipsisa64el-* \
+	| mipsisa64r2-* | mipsisa64r2el-* \
+	| mipsisa64sb1-* | mipsisa64sb1el-* \
+	| mipsisa64sr71k-* | mipsisa64sr71kel-* \
+	| mipstx39-* | mipstx39el-* \
+	| mmix-* \
+	| mt-* \
+	| msp430-* \
+	| nds32-* | nds32le-* | nds32be-* \
+	| nios-* | nios2-* \
+	| none-* | np1-* | ns16k-* | ns32k-* \
+	| open8-* \
+	| orion-* \
+	| pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \
+	| powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \
+	| pyramid-* \
+	| rl78-* | romp-* | rs6000-* | rx-* \
+	| sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \
+	| shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \
+	| sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \
+	| sparclite-* \
+	| sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx?-* \
+	| tahoe-* \
+	| tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \
+	| tile*-* \
+	| tron-* \
+	| ubicom32-* \
+	| v850-* | v850e-* | v850e1-* | v850es-* | v850e2-* | v850e2v3-* \
+	| vax-* \
+	| we32k-* \
+	| x86-* | x86_64-* | xc16x-* | xps100-* \
+	| xstormy16-* | xtensa*-* \
+	| ymp-* \
+	| z8k-* | z80-*)
+		;;
+	# Recognize the basic CPU types without company name, with glob match.
+	xtensa*)
+		basic_machine=$basic_machine-unknown
+		;;
+	# Recognize the various machine names and aliases which stand
+	# for a CPU type and a company and sometimes even an OS.
+	386bsd)
+		basic_machine=i386-unknown
+		os=-bsd
+		;;
+	3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc)
+		basic_machine=m68000-att
+		;;
+	3b*)
+		basic_machine=we32k-att
+		;;
+	a29khif)
+		basic_machine=a29k-amd
+		os=-udi
+		;;
+	abacus)
+		basic_machine=abacus-unknown
+		;;
+	adobe68k)
+		basic_machine=m68010-adobe
+		os=-scout
+		;;
+	alliant | fx80)
+		basic_machine=fx80-alliant
+		;;
+	altos | altos3068)
+		basic_machine=m68k-altos
+		;;
+	am29k)
+		basic_machine=a29k-none
+		os=-bsd
+		;;
+	amd64)
+		basic_machine=x86_64-pc
+		;;
+	amd64-*)
+		basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	amdahl)
+		basic_machine=580-amdahl
+		os=-sysv
+		;;
+	amiga | amiga-*)
+		basic_machine=m68k-unknown
+		;;
+	amigaos | amigados)
+		basic_machine=m68k-unknown
+		os=-amigaos
+		;;
+	amigaunix | amix)
+		basic_machine=m68k-unknown
+		os=-sysv4
+		;;
+	apollo68)
+		basic_machine=m68k-apollo
+		os=-sysv
+		;;
+	apollo68bsd)
+		basic_machine=m68k-apollo
+		os=-bsd
+		;;
+	aros)
+		basic_machine=i386-pc
+		os=-aros
+		;;
+	aux)
+		basic_machine=m68k-apple
+		os=-aux
+		;;
+	balance)
+		basic_machine=ns32k-sequent
+		os=-dynix
+		;;
+	blackfin)
+		basic_machine=bfin-unknown
+		os=-linux
+		;;
+	blackfin-*)
+		basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'`
+		os=-linux
+		;;
+	bluegene*)
+		basic_machine=powerpc-ibm
+		os=-cnk
+		;;
+	c54x-*)
+		basic_machine=tic54x-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	c55x-*)
+		basic_machine=tic55x-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	c6x-*)
+		basic_machine=tic6x-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	c90)
+		basic_machine=c90-cray
+		os=-unicos
+		;;
+	cegcc)
+		basic_machine=arm-unknown
+		os=-cegcc
+		;;
+	convex-c1)
+		basic_machine=c1-convex
+		os=-bsd
+		;;
+	convex-c2)
+		basic_machine=c2-convex
+		os=-bsd
+		;;
+	convex-c32)
+		basic_machine=c32-convex
+		os=-bsd
+		;;
+	convex-c34)
+		basic_machine=c34-convex
+		os=-bsd
+		;;
+	convex-c38)
+		basic_machine=c38-convex
+		os=-bsd
+		;;
+	cray | j90)
+		basic_machine=j90-cray
+		os=-unicos
+		;;
+	craynv)
+		basic_machine=craynv-cray
+		os=-unicosmp
+		;;
+	cr16 | cr16-*)
+		basic_machine=cr16-unknown
+		os=-elf
+		;;
+	crds | unos)
+		basic_machine=m68k-crds
+		;;
+	crisv32 | crisv32-* | etraxfs*)
+		basic_machine=crisv32-axis
+		;;
+	cris | cris-* | etrax*)
+		basic_machine=cris-axis
+		;;
+	crx)
+		basic_machine=crx-unknown
+		os=-elf
+		;;
+	da30 | da30-*)
+		basic_machine=m68k-da30
+		;;
+	decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn)
+		basic_machine=mips-dec
+		;;
+	decsystem10* | dec10*)
+		basic_machine=pdp10-dec
+		os=-tops10
+		;;
+	decsystem20* | dec20*)
+		basic_machine=pdp10-dec
+		os=-tops20
+		;;
+	delta | 3300 | motorola-3300 | motorola-delta \
+	      | 3300-motorola | delta-motorola)
+		basic_machine=m68k-motorola
+		;;
+	delta88)
+		basic_machine=m88k-motorola
+		os=-sysv3
+		;;
+	dicos)
+		basic_machine=i686-pc
+		os=-dicos
+		;;
+	djgpp)
+		basic_machine=i586-pc
+		os=-msdosdjgpp
+		;;
+	dpx20 | dpx20-*)
+		basic_machine=rs6000-bull
+		os=-bosx
+		;;
+	dpx2* | dpx2*-bull)
+		basic_machine=m68k-bull
+		os=-sysv3
+		;;
+	ebmon29k)
+		basic_machine=a29k-amd
+		os=-ebmon
+		;;
+	elxsi)
+		basic_machine=elxsi-elxsi
+		os=-bsd
+		;;
+	encore | umax | mmax)
+		basic_machine=ns32k-encore
+		;;
+	es1800 | OSE68k | ose68k | ose | OSE)
+		basic_machine=m68k-ericsson
+		os=-ose
+		;;
+	fx2800)
+		basic_machine=i860-alliant
+		;;
+	genix)
+		basic_machine=ns32k-ns
+		;;
+	gmicro)
+		basic_machine=tron-gmicro
+		os=-sysv
+		;;
+	go32)
+		basic_machine=i386-pc
+		os=-go32
+		;;
+	h3050r* | hiux*)
+		basic_machine=hppa1.1-hitachi
+		os=-hiuxwe2
+		;;
+	h8300hms)
+		basic_machine=h8300-hitachi
+		os=-hms
+		;;
+	h8300xray)
+		basic_machine=h8300-hitachi
+		os=-xray
+		;;
+	h8500hms)
+		basic_machine=h8500-hitachi
+		os=-hms
+		;;
+	harris)
+		basic_machine=m88k-harris
+		os=-sysv3
+		;;
+	hp300-*)
+		basic_machine=m68k-hp
+		;;
+	hp300bsd)
+		basic_machine=m68k-hp
+		os=-bsd
+		;;
+	hp300hpux)
+		basic_machine=m68k-hp
+		os=-hpux
+		;;
+	hp3k9[0-9][0-9] | hp9[0-9][0-9])
+		basic_machine=hppa1.0-hp
+		;;
+	hp9k2[0-9][0-9] | hp9k31[0-9])
+		basic_machine=m68000-hp
+		;;
+	hp9k3[2-9][0-9])
+		basic_machine=m68k-hp
+		;;
+	hp9k6[0-9][0-9] | hp6[0-9][0-9])
+		basic_machine=hppa1.0-hp
+		;;
+	hp9k7[0-79][0-9] | hp7[0-79][0-9])
+		basic_machine=hppa1.1-hp
+		;;
+	hp9k78[0-9] | hp78[0-9])
+		# FIXME: really hppa2.0-hp
+		basic_machine=hppa1.1-hp
+		;;
+	hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893)
+		# FIXME: really hppa2.0-hp
+		basic_machine=hppa1.1-hp
+		;;
+	hp9k8[0-9][13679] | hp8[0-9][13679])
+		basic_machine=hppa1.1-hp
+		;;
+	hp9k8[0-9][0-9] | hp8[0-9][0-9])
+		basic_machine=hppa1.0-hp
+		;;
+	hppa-next)
+		os=-nextstep3
+		;;
+	hppaosf)
+		basic_machine=hppa1.1-hp
+		os=-osf
+		;;
+	hppro)
+		basic_machine=hppa1.1-hp
+		os=-proelf
+		;;
+	i370-ibm* | ibm*)
+		basic_machine=i370-ibm
+		;;
+	i*86v32)
+		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+		os=-sysv32
+		;;
+	i*86v4*)
+		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+		os=-sysv4
+		;;
+	i*86v)
+		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+		os=-sysv
+		;;
+	i*86sol2)
+		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+		os=-solaris2
+		;;
+	i386mach)
+		basic_machine=i386-mach
+		os=-mach
+		;;
+	i386-vsta | vsta)
+		basic_machine=i386-unknown
+		os=-vsta
+		;;
+	iris | iris4d)
+		basic_machine=mips-sgi
+		case $os in
+		    -irix*)
+			;;
+		    *)
+			os=-irix4
+			;;
+		esac
+		;;
+	isi68 | isi)
+		basic_machine=m68k-isi
+		os=-sysv
+		;;
+	m68knommu)
+		basic_machine=m68k-unknown
+		os=-linux
+		;;
+	m68knommu-*)
+		basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'`
+		os=-linux
+		;;
+	m88k-omron*)
+		basic_machine=m88k-omron
+		;;
+	magnum | m3230)
+		basic_machine=mips-mips
+		os=-sysv
+		;;
+	merlin)
+		basic_machine=ns32k-utek
+		os=-sysv
+		;;
+	microblaze)
+		basic_machine=microblaze-xilinx
+		;;
+	mingw32)
+		basic_machine=i386-pc
+		os=-mingw32
+		;;
+	mingw32ce)
+		basic_machine=arm-unknown
+		os=-mingw32ce
+		;;
+	miniframe)
+		basic_machine=m68000-convergent
+		;;
+	*mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*)
+		basic_machine=m68k-atari
+		os=-mint
+		;;
+	mips3*-*)
+		basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`
+		;;
+	mips3*)
+		basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown
+		;;
+	monitor)
+		basic_machine=m68k-rom68k
+		os=-coff
+		;;
+	morphos)
+		basic_machine=powerpc-unknown
+		os=-morphos
+		;;
+	msdos)
+		basic_machine=i386-pc
+		os=-msdos
+		;;
+	ms1-*)
+		basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'`
+		;;
+	msys)
+		basic_machine=i386-pc
+		os=-msys
+		;;
+	mvs)
+		basic_machine=i370-ibm
+		os=-mvs
+		;;
+	nacl)
+		basic_machine=le32-unknown
+		os=-nacl
+		;;
+	ncr3000)
+		basic_machine=i486-ncr
+		os=-sysv4
+		;;
+	netbsd386)
+		basic_machine=i386-unknown
+		os=-netbsd
+		;;
+	netwinder)
+		basic_machine=armv4l-rebel
+		os=-linux
+		;;
+	news | news700 | news800 | news900)
+		basic_machine=m68k-sony
+		os=-newsos
+		;;
+	news1000)
+		basic_machine=m68030-sony
+		os=-newsos
+		;;
+	news-3600 | risc-news)
+		basic_machine=mips-sony
+		os=-newsos
+		;;
+	necv70)
+		basic_machine=v70-nec
+		os=-sysv
+		;;
+	next | m*-next )
+		basic_machine=m68k-next
+		case $os in
+		    -nextstep* )
+			;;
+		    -ns2*)
+		      os=-nextstep2
+			;;
+		    *)
+		      os=-nextstep3
+			;;
+		esac
+		;;
+	nh3000)
+		basic_machine=m68k-harris
+		os=-cxux
+		;;
+	nh[45]000)
+		basic_machine=m88k-harris
+		os=-cxux
+		;;
+	nindy960)
+		basic_machine=i960-intel
+		os=-nindy
+		;;
+	mon960)
+		basic_machine=i960-intel
+		os=-mon960
+		;;
+	nonstopux)
+		basic_machine=mips-compaq
+		os=-nonstopux
+		;;
+	np1)
+		basic_machine=np1-gould
+		;;
+	neo-tandem)
+		basic_machine=neo-tandem
+		;;
+	nse-tandem)
+		basic_machine=nse-tandem
+		;;
+	nsr-tandem)
+		basic_machine=nsr-tandem
+		;;
+	op50n-* | op60c-*)
+		basic_machine=hppa1.1-oki
+		os=-proelf
+		;;
+	openrisc | openrisc-*)
+		basic_machine=or32-unknown
+		;;
+	os400)
+		basic_machine=powerpc-ibm
+		os=-os400
+		;;
+	OSE68000 | ose68000)
+		basic_machine=m68000-ericsson
+		os=-ose
+		;;
+	os68k)
+		basic_machine=m68k-none
+		os=-os68k
+		;;
+	pa-hitachi)
+		basic_machine=hppa1.1-hitachi
+		os=-hiuxwe2
+		;;
+	paragon)
+		basic_machine=i860-intel
+		os=-osf
+		;;
+	parisc)
+		basic_machine=hppa-unknown
+		os=-linux
+		;;
+	parisc-*)
+		basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'`
+		os=-linux
+		;;
+	pbd)
+		basic_machine=sparc-tti
+		;;
+	pbb)
+		basic_machine=m68k-tti
+		;;
+	pc532 | pc532-*)
+		basic_machine=ns32k-pc532
+		;;
+	pc98)
+		basic_machine=i386-pc
+		;;
+	pc98-*)
+		basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	pentium | p5 | k5 | k6 | nexgen | viac3)
+		basic_machine=i586-pc
+		;;
+	pentiumpro | p6 | 6x86 | athlon | athlon_*)
+		basic_machine=i686-pc
+		;;
+	pentiumii | pentium2 | pentiumiii | pentium3)
+		basic_machine=i686-pc
+		;;
+	pentium4)
+		basic_machine=i786-pc
+		;;
+	pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*)
+		basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	pentiumpro-* | p6-* | 6x86-* | athlon-*)
+		basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*)
+		basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	pentium4-*)
+		basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	pn)
+		basic_machine=pn-gould
+		;;
+	power)	basic_machine=power-ibm
+		;;
+	ppc | ppcbe)	basic_machine=powerpc-unknown
+		;;
+	ppc-* | ppcbe-*)
+		basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	ppcle | powerpclittle | ppc-le | powerpc-little)
+		basic_machine=powerpcle-unknown
+		;;
+	ppcle-* | powerpclittle-*)
+		basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	ppc64)	basic_machine=powerpc64-unknown
+		;;
+	ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	ppc64le | powerpc64little | ppc64-le | powerpc64-little)
+		basic_machine=powerpc64le-unknown
+		;;
+	ppc64le-* | powerpc64little-*)
+		basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	ps2)
+		basic_machine=i386-ibm
+		;;
+	pw32)
+		basic_machine=i586-unknown
+		os=-pw32
+		;;
+	rdos)
+		basic_machine=i386-pc
+		os=-rdos
+		;;
+	rom68k)
+		basic_machine=m68k-rom68k
+		os=-coff
+		;;
+	rm[46]00)
+		basic_machine=mips-siemens
+		;;
+	rtpc | rtpc-*)
+		basic_machine=romp-ibm
+		;;
+	s390 | s390-*)
+		basic_machine=s390-ibm
+		;;
+	s390x | s390x-*)
+		basic_machine=s390x-ibm
+		;;
+	sa29200)
+		basic_machine=a29k-amd
+		os=-udi
+		;;
+	sb1)
+		basic_machine=mipsisa64sb1-unknown
+		;;
+	sb1el)
+		basic_machine=mipsisa64sb1el-unknown
+		;;
+	sde)
+		basic_machine=mipsisa32-sde
+		os=-elf
+		;;
+	sei)
+		basic_machine=mips-sei
+		os=-seiux
+		;;
+	sequent)
+		basic_machine=i386-sequent
+		;;
+	sh)
+		basic_machine=sh-hitachi
+		os=-hms
+		;;
+	sh5el)
+		basic_machine=sh5le-unknown
+		;;
+	sh64)
+		basic_machine=sh64-unknown
+		;;
+	sparclite-wrs | simso-wrs)
+		basic_machine=sparclite-wrs
+		os=-vxworks
+		;;
+	sps7)
+		basic_machine=m68k-bull
+		os=-sysv2
+		;;
+	spur)
+		basic_machine=spur-unknown
+		;;
+	st2000)
+		basic_machine=m68k-tandem
+		;;
+	stratus)
+		basic_machine=i860-stratus
+		os=-sysv4
+		;;
+	strongarm-* | thumb-*)
+		basic_machine=arm-`echo $basic_machine | sed 's/^[^-]*-//'`
+		;;
+	sun2)
+		basic_machine=m68000-sun
+		;;
+	sun2os3)
+		basic_machine=m68000-sun
+		os=-sunos3
+		;;
+	sun2os4)
+		basic_machine=m68000-sun
+		os=-sunos4
+		;;
+	sun3os3)
+		basic_machine=m68k-sun
+		os=-sunos3
+		;;
+	sun3os4)
+		basic_machine=m68k-sun
+		os=-sunos4
+		;;
+	sun4os3)
+		basic_machine=sparc-sun
+		os=-sunos3
+		;;
+	sun4os4)
+		basic_machine=sparc-sun
+		os=-sunos4
+		;;
+	sun4sol2)
+		basic_machine=sparc-sun
+		os=-solaris2
+		;;
+	sun3 | sun3-*)
+		basic_machine=m68k-sun
+		;;
+	sun4)
+		basic_machine=sparc-sun
+		;;
+	sun386 | sun386i | roadrunner)
+		basic_machine=i386-sun
+		;;
+	sv1)
+		basic_machine=sv1-cray
+		os=-unicos
+		;;
+	symmetry)
+		basic_machine=i386-sequent
+		os=-dynix
+		;;
+	t3e)
+		basic_machine=alphaev5-cray
+		os=-unicos
+		;;
+	t90)
+		basic_machine=t90-cray
+		os=-unicos
+		;;
+	tile*)
+		basic_machine=$basic_machine-unknown
+		os=-linux-gnu
+		;;
+	tx39)
+		basic_machine=mipstx39-unknown
+		;;
+	tx39el)
+		basic_machine=mipstx39el-unknown
+		;;
+	toad1)
+		basic_machine=pdp10-xkl
+		os=-tops20
+		;;
+	tower | tower-32)
+		basic_machine=m68k-ncr
+		;;
+	tpf)
+		basic_machine=s390x-ibm
+		os=-tpf
+		;;
+	udi29k)
+		basic_machine=a29k-amd
+		os=-udi
+		;;
+	ultra3)
+		basic_machine=a29k-nyu
+		os=-sym1
+		;;
+	v810 | necv810)
+		basic_machine=v810-nec
+		os=-none
+		;;
+	vaxv)
+		basic_machine=vax-dec
+		os=-sysv
+		;;
+	vms)
+		basic_machine=vax-dec
+		os=-vms
+		;;
+	vpp*|vx|vx-*)
+		basic_machine=f301-fujitsu
+		;;
+	vxworks960)
+		basic_machine=i960-wrs
+		os=-vxworks
+		;;
+	vxworks68)
+		basic_machine=m68k-wrs
+		os=-vxworks
+		;;
+	vxworks29k)
+		basic_machine=a29k-wrs
+		os=-vxworks
+		;;
+	w65*)
+		basic_machine=w65-wdc
+		os=-none
+		;;
+	w89k-*)
+		basic_machine=hppa1.1-winbond
+		os=-proelf
+		;;
+	xbox)
+		basic_machine=i686-pc
+		os=-mingw32
+		;;
+	xps | xps100)
+		basic_machine=xps100-honeywell
+		;;
+	xscale-* | xscalee[bl]-*)
+		basic_machine=`echo $basic_machine | sed 's/^xscale/arm/'`
+		;;
+	ymp)
+		basic_machine=ymp-cray
+		os=-unicos
+		;;
+	z8k-*-coff)
+		basic_machine=z8k-unknown
+		os=-sim
+		;;
+	z80-*-coff)
+		basic_machine=z80-unknown
+		os=-sim
+		;;
+	none)
+		basic_machine=none-none
+		os=-none
+		;;
+
+# Here we handle the default manufacturer of certain CPU types.  It is in
+# some cases the only manufacturer, in others, it is the most popular.
+	w89k)
+		basic_machine=hppa1.1-winbond
+		;;
+	op50n)
+		basic_machine=hppa1.1-oki
+		;;
+	op60c)
+		basic_machine=hppa1.1-oki
+		;;
+	romp)
+		basic_machine=romp-ibm
+		;;
+	mmix)
+		basic_machine=mmix-knuth
+		;;
+	rs6000)
+		basic_machine=rs6000-ibm
+		;;
+	vax)
+		basic_machine=vax-dec
+		;;
+	pdp10)
+		# there are many clones, so DEC is not a safe bet
+		basic_machine=pdp10-unknown
+		;;
+	pdp11)
+		basic_machine=pdp11-dec
+		;;
+	we32k)
+		basic_machine=we32k-att
+		;;
+	sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele)
+		basic_machine=sh-unknown
+		;;
+	sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v)
+		basic_machine=sparc-sun
+		;;
+	cydra)
+		basic_machine=cydra-cydrome
+		;;
+	orion)
+		basic_machine=orion-highlevel
+		;;
+	orion105)
+		basic_machine=clipper-highlevel
+		;;
+	mac | mpw | mac-mpw)
+		basic_machine=m68k-apple
+		;;
+	pmac | pmac-mpw)
+		basic_machine=powerpc-apple
+		;;
+	*-unknown)
+		# Make sure to match an already-canonicalized machine name.
+		;;
+	*)
+		echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
+		exit 1
+		;;
+esac
+
+# Here we canonicalize certain aliases for manufacturers.
+case $basic_machine in
+	*-digital*)
+		basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'`
+		;;
+	*-commodore*)
+		basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'`
+		;;
+	*)
+		;;
+esac
+
+# Decode manufacturer-specific aliases for certain operating systems.
+
+if [ x"$os" != x"" ]
+then
+case $os in
+	# First match some system type aliases
+	# that might get confused with valid system types.
+	# -solaris* is a basic system type, with this one exception.
+	-auroraux)
+		os=-auroraux
+		;;
+	-solaris1 | -solaris1.*)
+		os=`echo $os | sed -e 's|solaris1|sunos4|'`
+		;;
+	-solaris)
+		os=-solaris2
+		;;
+	-svr4*)
+		os=-sysv4
+		;;
+	-unixware*)
+		os=-sysv4.2uw
+		;;
+	-gnu/linux*)
+		os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'`
+		;;
+	# First accept the basic system types.
+	# The portable systems comes first.
+	# Each alternative MUST END IN A *, to match a version number.
+	# -sysv* is not here because it comes later, after sysvr4.
+	-gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \
+	      | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\
+	      | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \
+	      | -sym* | -kopensolaris* \
+	      | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \
+	      | -aos* | -aros* \
+	      | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \
+	      | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \
+	      | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \
+	      | -openbsd* | -solidbsd* \
+	      | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \
+	      | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \
+	      | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \
+	      | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \
+	      | -chorusos* | -chorusrdb* | -cegcc* \
+	      | -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
+	      | -mingw32* | -linux-gnu* | -linux-android* \
+	      | -linux-newlib* | -linux-uclibc* \
+	      | -uxpv* | -beos* | -mpeix* | -udk* \
+	      | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \
+	      | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \
+	      | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \
+	      | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \
+	      | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \
+	      | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \
+	      | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es*)
+	# Remember, each alternative MUST END IN *, to match a version number.
+		;;
+	-qnx*)
+		case $basic_machine in
+		    x86-* | i*86-*)
+			;;
+		    *)
+			os=-nto$os
+			;;
+		esac
+		;;
+	-nto-qnx*)
+		;;
+	-nto*)
+		os=`echo $os | sed -e 's|nto|nto-qnx|'`
+		;;
+	-sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \
+	      | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \
+	      | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*)
+		;;
+	-mac*)
+		os=`echo $os | sed -e 's|mac|macos|'`
+		;;
+	-linux-dietlibc)
+		os=-linux-dietlibc
+		;;
+	-linux*)
+		os=`echo $os | sed -e 's|linux|linux-gnu|'`
+		;;
+	-sunos5*)
+		os=`echo $os | sed -e 's|sunos5|solaris2|'`
+		;;
+	-sunos6*)
+		os=`echo $os | sed -e 's|sunos6|solaris3|'`
+		;;
+	-opened*)
+		os=-openedition
+		;;
+	-os400*)
+		os=-os400
+		;;
+	-wince*)
+		os=-wince
+		;;
+	-osfrose*)
+		os=-osfrose
+		;;
+	-osf*)
+		os=-osf
+		;;
+	-utek*)
+		os=-bsd
+		;;
+	-dynix*)
+		os=-bsd
+		;;
+	-acis*)
+		os=-aos
+		;;
+	-atheos*)
+		os=-atheos
+		;;
+	-syllable*)
+		os=-syllable
+		;;
+	-386bsd)
+		os=-bsd
+		;;
+	-ctix* | -uts*)
+		os=-sysv
+		;;
+	-nova*)
+		os=-rtmk-nova
+		;;
+	-ns2 )
+		os=-nextstep2
+		;;
+	-nsk*)
+		os=-nsk
+		;;
+	# Preserve the version number of sinix5.
+	-sinix5.*)
+		os=`echo $os | sed -e 's|sinix|sysv|'`
+		;;
+	-sinix*)
+		os=-sysv4
+		;;
+	-tpf*)
+		os=-tpf
+		;;
+	-triton*)
+		os=-sysv3
+		;;
+	-oss*)
+		os=-sysv3
+		;;
+	-svr4)
+		os=-sysv4
+		;;
+	-svr3)
+		os=-sysv3
+		;;
+	-sysvr4)
+		os=-sysv4
+		;;
+	# This must come after -sysvr4.
+	-sysv*)
+		;;
+	-ose*)
+		os=-ose
+		;;
+	-es1800*)
+		os=-ose
+		;;
+	-xenix)
+		os=-xenix
+		;;
+	-*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
+		os=-mint
+		;;
+	-aros*)
+		os=-aros
+		;;
+	-kaos*)
+		os=-kaos
+		;;
+	-zvmoe)
+		os=-zvmoe
+		;;
+	-dicos*)
+		os=-dicos
+		;;
+	-nacl*)
+		;;
+	-none)
+		;;
+	*)
+		# Get rid of the `-' at the beginning of $os.
+		os=`echo $os | sed 's/[^-]*-//'`
+		echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2
+		exit 1
+		;;
+esac
+else
+
+# Here we handle the default operating systems that come with various machines.
+# The value should be what the vendor currently ships out the door with their
+# machine or put another way, the most popular os provided with the machine.
+
+# Note that if you're going to try to match "-MANUFACTURER" here (say,
+# "-sun"), then you have to tell the case statement up towards the top
+# that MANUFACTURER isn't an operating system.  Otherwise, code above
+# will signal an error saying that MANUFACTURER isn't an operating
+# system, and we'll never get to this point.
+
+case $basic_machine in
+	score-*)
+		os=-elf
+		;;
+	spu-*)
+		os=-elf
+		;;
+	*-acorn)
+		os=-riscix1.2
+		;;
+	arm*-rebel)
+		os=-linux
+		;;
+	arm*-semi)
+		os=-aout
+		;;
+	c4x-* | tic4x-*)
+		os=-coff
+		;;
+	tic54x-*)
+		os=-coff
+		;;
+	tic55x-*)
+		os=-coff
+		;;
+	tic6x-*)
+		os=-coff
+		;;
+	# This must come before the *-dec entry.
+	pdp10-*)
+		os=-tops20
+		;;
+	pdp11-*)
+		os=-none
+		;;
+	*-dec | vax-*)
+		os=-ultrix4.2
+		;;
+	m68*-apollo)
+		os=-domain
+		;;
+	i386-sun)
+		os=-sunos4.0.2
+		;;
+	m68000-sun)
+		os=-sunos3
+		;;
+	m68*-cisco)
+		os=-aout
+		;;
+	mep-*)
+		os=-elf
+		;;
+	mips*-cisco)
+		os=-elf
+		;;
+	mips*-*)
+		os=-elf
+		;;
+	or32-*)
+		os=-coff
+		;;
+	*-tti)	# must be before sparc entry or we get the wrong os.
+		os=-sysv3
+		;;
+	sparc-* | *-sun)
+		os=-sunos4.1.1
+		;;
+	*-be)
+		os=-beos
+		;;
+	*-haiku)
+		os=-haiku
+		;;
+	*-ibm)
+		os=-aix
+		;;
+	*-knuth)
+		os=-mmixware
+		;;
+	*-wec)
+		os=-proelf
+		;;
+	*-winbond)
+		os=-proelf
+		;;
+	*-oki)
+		os=-proelf
+		;;
+	*-hp)
+		os=-hpux
+		;;
+	*-hitachi)
+		os=-hiux
+		;;
+	i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent)
+		os=-sysv
+		;;
+	*-cbm)
+		os=-amigaos
+		;;
+	*-dg)
+		os=-dgux
+		;;
+	*-dolphin)
+		os=-sysv3
+		;;
+	m68k-ccur)
+		os=-rtu
+		;;
+	m88k-omron*)
+		os=-luna
+		;;
+	*-next )
+		os=-nextstep
+		;;
+	*-sequent)
+		os=-ptx
+		;;
+	*-crds)
+		os=-unos
+		;;
+	*-ns)
+		os=-genix
+		;;
+	i370-*)
+		os=-mvs
+		;;
+	*-next)
+		os=-nextstep3
+		;;
+	*-gould)
+		os=-sysv
+		;;
+	*-highlevel)
+		os=-bsd
+		;;
+	*-encore)
+		os=-bsd
+		;;
+	*-sgi)
+		os=-irix
+		;;
+	*-siemens)
+		os=-sysv4
+		;;
+	*-masscomp)
+		os=-rtu
+		;;
+	f30[01]-fujitsu | f700-fujitsu)
+		os=-uxpv
+		;;
+	*-rom68k)
+		os=-coff
+		;;
+	*-*bug)
+		os=-coff
+		;;
+	*-apple)
+		os=-macos
+		;;
+	*-atari*)
+		os=-mint
+		;;
+	*)
+		os=-none
+		;;
+esac
+fi
+
+# Here we handle the case where we know the os, and the CPU type, but not the
+# manufacturer.  We pick the logical manufacturer.
+vendor=unknown
+case $basic_machine in
+	*-unknown)
+		case $os in
+			-riscix*)
+				vendor=acorn
+				;;
+			-sunos*)
+				vendor=sun
+				;;
+			-cnk*|-aix*)
+				vendor=ibm
+				;;
+			-beos*)
+				vendor=be
+				;;
+			-hpux*)
+				vendor=hp
+				;;
+			-mpeix*)
+				vendor=hp
+				;;
+			-hiux*)
+				vendor=hitachi
+				;;
+			-unos*)
+				vendor=crds
+				;;
+			-dgux*)
+				vendor=dg
+				;;
+			-luna*)
+				vendor=omron
+				;;
+			-genix*)
+				vendor=ns
+				;;
+			-mvs* | -opened*)
+				vendor=ibm
+				;;
+			-os400*)
+				vendor=ibm
+				;;
+			-ptx*)
+				vendor=sequent
+				;;
+			-tpf*)
+				vendor=ibm
+				;;
+			-vxsim* | -vxworks* | -windiss*)
+				vendor=wrs
+				;;
+			-aux*)
+				vendor=apple
+				;;
+			-hms*)
+				vendor=hitachi
+				;;
+			-mpw* | -macos*)
+				vendor=apple
+				;;
+			-*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
+				vendor=atari
+				;;
+			-vos*)
+				vendor=stratus
+				;;
+		esac
+		basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"`
+		;;
+esac
+
+echo $basic_machine$os
+exit
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "timestamp='"
+# time-stamp-format: "%:y-%02m-%02d"
+# time-stamp-end: "'"
+# End:
diff --git a/contrib/gtest-1.7.0/build-aux/depcomp b/contrib/gtest-1.7.0/build-aux/depcomp
new file mode 100755
index 0000000..bd0ac08
--- /dev/null
+++ b/contrib/gtest-1.7.0/build-aux/depcomp
@@ -0,0 +1,688 @@
+#! /bin/sh
+# depcomp - compile a program generating dependencies as side-effects
+
+scriptversion=2011-12-04.11; # UTC
+
+# Copyright (C) 1999, 2000, 2003, 2004, 2005, 2006, 2007, 2009, 2010,
+# 2011 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 2, 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/>.
+
+# 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 at dcc.unicamp.br>.
+
+case $1 in
+  '')
+     echo "$0: No command.  Try \`$0 --help' for more information." 1>&2
+     exit 1;
+     ;;
+  -h | --h*)
+    cat <<\EOF
+Usage: depcomp [--help] [--version] PROGRAM [ARGS]
+
+Run PROGRAMS ARGS to compile a file, generating dependencies
+as side-effects.
+
+Environment variables:
+  depmode     Dependency tracking mode.
+  source      Source file read by `PROGRAMS ARGS'.
+  object      Object file output by `PROGRAMS ARGS'.
+  DEPDIR      directory where to store dependencies.
+  depfile     Dependency file to output.
+  tmpdepfile  Temporary file to use when outputting dependencies.
+  libtool     Whether libtool is used (yes/no).
+
+Report bugs to <bug-automake at gnu.org>.
+EOF
+    exit $?
+    ;;
+  -v | --v*)
+    echo "depcomp $scriptversion"
+    exit $?
+    ;;
+esac
+
+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
+
+# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po.
+depfile=${depfile-`echo "$object" |
+  sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`}
+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
+
+cygpath_u="cygpath -u -f -"
+if test "$depmode" = msvcmsys; then
+   # This is just like msvisualcpp but w/o cygpath translation.
+   # Just convert the backslash-escaped backslashes to single forward
+   # slashes to satisfy depend.m4
+   cygpath_u='sed s,\\\\,/,g'
+   depmode=msvisualcpp
+fi
+
+if test "$depmode" = msvc7msys; then
+   # This is just like msvc7 but w/o cygpath translation.
+   # Just convert the backslash-escaped backslashes to single forward
+   # slashes to satisfy depend.m4
+   cygpath_u='sed s,\\\\,/,g'
+   depmode=msvc7
+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.
+## Unfortunately, FreeBSD c89 acceptance of flags depends upon
+## the command line argument order; so add the flags where they
+## appear in depend2.am.  Note that the slowdown incurred here
+## affects only configure: in makefiles, %FASTDEP% shortcuts this.
+  for arg
+  do
+    case $arg in
+    -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;;
+    *)  set fnord "$@" "$arg" ;;
+    esac
+    shift # fnord
+    shift # $arg
+  done
+  "$@"
+  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.  hp depmode also adds that space, but also prefixes the VPATH
+## to the object.  Take care to not repeat it in the output.
+## 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 "s|.*$object$||" -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.  In older versions, 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.
+  # Version 6 uses the directory in both cases.
+  dir=`echo "$object" | sed -e 's|/[^/]*$|/|'`
+  test "x$dir" = "x$object" && dir=
+  base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'`
+  if test "$libtool" = yes; then
+    tmpdepfile1=$dir$base.u
+    tmpdepfile2=$base.u
+    tmpdepfile3=$dir.libs/$base.u
+    "$@" -Wc,-M
+  else
+    tmpdepfile1=$dir$base.u
+    tmpdepfile2=$dir$base.u
+    tmpdepfile3=$dir$base.u
+    "$@" -M
+  fi
+  stat=$?
+
+  if test $stat -eq 0; then :
+  else
+    rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
+    exit $stat
+  fi
+
+  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
+  do
+    test -f "$tmpdepfile" && break
+  done
+  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,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile"
+    # That's a tab and a space in the [].
+    sed -e 's,^.*\.[a-z]*:[	 ]*,,' -e 's,$,:,' < "$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"
+  ;;
+
+icc)
+  # Intel's C compiler understands `-MD -MF file'.  However on
+  #    icc -MD -MF foo.d -c -o sub/foo.o sub/foo.c
+  # ICC 7.0 will fill foo.d with something like
+  #    foo.o: sub/foo.c
+  #    foo.o: sub/foo.h
+  # which is wrong.  We want:
+  #    sub/foo.o: sub/foo.c
+  #    sub/foo.o: sub/foo.h
+  #    sub/foo.c:
+  #    sub/foo.h:
+  # ICC 7.1 will output
+  #    foo.o: sub/foo.c sub/foo.h
+  # and will wrap long lines using \ :
+  #    foo.o: sub/foo.c ... \
+  #     sub/foo.h ... \
+  #     ...
+
+  "$@" -MD -MF "$tmpdepfile"
+  stat=$?
+  if test $stat -eq 0; then :
+  else
+    rm -f "$tmpdepfile"
+    exit $stat
+  fi
+  rm -f "$depfile"
+  # Each line is of the form `foo.o: dependent.h',
+  # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'.
+  # Do two passes, one to just change these to
+  # `$object: dependent.h' and one to simply `dependent.h:'.
+  sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile"
+  # Some versions of the HPUX 10.20 sed can't process this invocation
+  # correctly.  Breaking it into two sed invocations is a workaround.
+  sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" |
+    sed -e 's/$/ :/' >> "$depfile"
+  rm -f "$tmpdepfile"
+  ;;
+
+hp2)
+  # The "hp" stanza above does not work with aCC (C++) and HP's ia64
+  # compilers, which have integrated preprocessors.  The correct option
+  # to use with these is +Maked; it writes dependencies to a file named
+  # 'foo.d', which lands next to the object file, wherever that
+  # happens to be.
+  # Much of this is similar to the tru64 case; see comments there.
+  dir=`echo "$object" | sed -e 's|/[^/]*$|/|'`
+  test "x$dir" = "x$object" && dir=
+  base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'`
+  if test "$libtool" = yes; then
+    tmpdepfile1=$dir$base.d
+    tmpdepfile2=$dir.libs/$base.d
+    "$@" -Wc,+Maked
+  else
+    tmpdepfile1=$dir$base.d
+    tmpdepfile2=$dir$base.d
+    "$@" +Maked
+  fi
+  stat=$?
+  if test $stat -eq 0; then :
+  else
+     rm -f "$tmpdepfile1" "$tmpdepfile2"
+     exit $stat
+  fi
+
+  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2"
+  do
+    test -f "$tmpdepfile" && break
+  done
+  if test -f "$tmpdepfile"; then
+    sed -e "s,^.*\.[a-z]*:,$object:," "$tmpdepfile" > "$depfile"
+    # Add `dependent.h:' lines.
+    sed -ne '2,${
+	       s/^ *//
+	       s/ \\*$//
+	       s/$/:/
+	       p
+	     }' "$tmpdepfile" >> "$depfile"
+  else
+    echo "#dummy" > "$depfile"
+  fi
+  rm -f "$tmpdepfile" "$tmpdepfile2"
+  ;;
+
+tru64)
+   # The Tru64 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.
+   dir=`echo "$object" | sed -e 's|/[^/]*$|/|'`
+   test "x$dir" = "x$object" && dir=
+   base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'`
+
+   if test "$libtool" = yes; then
+      # With Tru64 cc, shared objects can also be used to make a
+      # static library.  This mechanism is used in libtool 1.4 series to
+      # handle both shared and static libraries in a single compilation.
+      # With libtool 1.4, dependencies were output in $dir.libs/$base.lo.d.
+      #
+      # With libtool 1.5 this exception was removed, and libtool now
+      # generates 2 separate objects for the 2 libraries.  These two
+      # compilations output dependencies in $dir.libs/$base.o.d and
+      # in $dir$base.o.d.  We have to check for both files, because
+      # one of the two compilations can be disabled.  We should prefer
+      # $dir$base.o.d over $dir.libs/$base.o.d because the latter is
+      # automatically cleaned when .libs/ is deleted, while ignoring
+      # the former would cause a distcleancheck panic.
+      tmpdepfile1=$dir.libs/$base.lo.d   # libtool 1.4
+      tmpdepfile2=$dir$base.o.d          # libtool 1.5
+      tmpdepfile3=$dir.libs/$base.o.d    # libtool 1.5
+      tmpdepfile4=$dir.libs/$base.d      # Compaq CCC V6.2-504
+      "$@" -Wc,-MD
+   else
+      tmpdepfile1=$dir$base.o.d
+      tmpdepfile2=$dir$base.d
+      tmpdepfile3=$dir$base.d
+      tmpdepfile4=$dir$base.d
+      "$@" -MD
+   fi
+
+   stat=$?
+   if test $stat -eq 0; then :
+   else
+      rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4"
+      exit $stat
+   fi
+
+   for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4"
+   do
+     test -f "$tmpdepfile" && break
+   done
+   if test -f "$tmpdepfile"; then
+      sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile"
+      # That's a tab and a space in the [].
+      sed -e 's,^.*\.[a-z]*:[	 ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile"
+   else
+      echo "#dummy" > "$depfile"
+   fi
+   rm -f "$tmpdepfile"
+   ;;
+
+msvc7)
+  if test "$libtool" = yes; then
+    showIncludes=-Wc,-showIncludes
+  else
+    showIncludes=-showIncludes
+  fi
+  "$@" $showIncludes > "$tmpdepfile"
+  stat=$?
+  grep -v '^Note: including file: ' "$tmpdepfile"
+  if test "$stat" = 0; then :
+  else
+    rm -f "$tmpdepfile"
+    exit $stat
+  fi
+  rm -f "$depfile"
+  echo "$object : \\" > "$depfile"
+  # The first sed program below extracts the file names and escapes
+  # backslashes for cygpath.  The second sed program outputs the file
+  # name when reading, but also accumulates all include files in the
+  # hold buffer in order to output them again at the end.  This only
+  # works with sed implementations that can handle large buffers.
+  sed < "$tmpdepfile" -n '
+/^Note: including file:  *\(.*\)/ {
+  s//\1/
+  s/\\/\\\\/g
+  p
+}' | $cygpath_u | sort -u | sed -n '
+s/ /\\ /g
+s/\(.*\)/	\1 \\/p
+s/.\(.*\) \\/\1:/
+H
+$ {
+  s/.*/	/
+  G
+  p
+}' >> "$depfile"
+  rm -f "$tmpdepfile"
+  ;;
+
+msvc7msys)
+  # 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
+  ;;
+
+#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 preprocessed file to stdout, regardless of -o.
+  "$@" || exit $?
+
+  # Remove the call to Libtool.
+  if test "$libtool" = yes; then
+    while test "X$1" != 'X--mode=compile'; do
+      shift
+    done
+    shift
+  fi
+
+  # Remove `-o $object'.
+  IFS=" "
+  for arg
+  do
+    case $arg in
+    -o)
+      shift
+      ;;
+    $object)
+      shift
+      ;;
+    *)
+      set fnord "$@" "$arg"
+      shift # fnord
+      shift # $arg
+      ;;
+    esac
+  done
+
+  test -z "$dashmflag" && dashmflag=-M
+  # Require at least two characters before searching for `:'
+  # in the target name.  This is to cope with DOS-style filenames:
+  # a dependency such as `c:/foo/bar' could be seen as target `c' otherwise.
+  "$@" $dashmflag |
+    sed 's:^[  ]*[^: ][^:][^:]*\:[    ]*:'"$object"'\: :' > "$tmpdepfile"
+  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)
+  "$@" || exit $?
+  # Remove any Libtool call
+  if test "$libtool" = yes; then
+    while test "X$1" != 'X--mode=compile'; do
+      shift
+    done
+    shift
+  fi
+  # X makedepend
+  shift
+  cleared=no eat=no
+  for arg
+  do
+    case $cleared in
+    no)
+      set ""; shift
+      cleared=yes ;;
+    esac
+    if test $eat = yes; then
+      eat=no
+      continue
+    fi
+    case "$arg" in
+    -D*|-I*)
+      set fnord "$@" "$arg"; shift ;;
+    # Strip any option that makedepend may not understand.  Remove
+    # the object too, otherwise makedepend will parse it as a source file.
+    -arch)
+      eat=yes ;;
+    -*|$object)
+      ;;
+    *)
+      set fnord "$@" "$arg"; shift ;;
+    esac
+  done
+  obj_suffix=`echo "$object" | sed 's/^.*\././'`
+  touch "$tmpdepfile"
+  ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@"
+  rm -f "$depfile"
+  # makedepend may prepend the VPATH from the source file name to the object.
+  # No need to regex-escape $object, excess matching of '.' is harmless.
+  sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile"
+  sed '1,2d' "$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 preprocessed file to stdout.
+  "$@" || exit $?
+
+  # Remove the call to Libtool.
+  if test "$libtool" = yes; then
+    while test "X$1" != 'X--mode=compile'; do
+      shift
+    done
+    shift
+  fi
+
+  # Remove `-o $object'.
+  IFS=" "
+  for arg
+  do
+    case $arg in
+    -o)
+      shift
+      ;;
+    $object)
+      shift
+      ;;
+    *)
+      set fnord "$@" "$arg"
+      shift # fnord
+      shift # $arg
+      ;;
+    esac
+  done
+
+  "$@" -E |
+    sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
+       -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' |
+    sed '$ s: \\$::' > "$tmpdepfile"
+  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 preprocessed file to stdout.
+  "$@" || exit $?
+
+  # Remove the call to Libtool.
+  if test "$libtool" = yes; then
+    while test "X$1" != 'X--mode=compile'; do
+      shift
+    done
+    shift
+  fi
+
+  IFS=" "
+  for arg
+  do
+    case "$arg" in
+    -o)
+      shift
+      ;;
+    $object)
+      shift
+      ;;
+    "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI")
+	set fnord "$@"
+	shift
+	shift
+	;;
+    *)
+	set fnord "$@" "$arg"
+	shift
+	shift
+	;;
+    esac
+  done
+  "$@" -E 2>/dev/null |
+  sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile"
+  rm -f "$depfile"
+  echo "$object : \\" > "$depfile"
+  sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::	\1 \\:p' >> "$depfile"
+  echo "	" >> "$depfile"
+  sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile"
+  rm -f "$tmpdepfile"
+  ;;
+
+msvcmsys)
+  # 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
+  ;;
+
+none)
+  exec "$@"
+  ;;
+
+*)
+  echo "Unknown depmode $depmode" 1>&2
+  exit 1
+  ;;
+esac
+
+exit 0
+
+# Local Variables:
+# mode: shell-script
+# sh-indentation: 2
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-time-zone: "UTC"
+# time-stamp-end: "; # UTC"
+# End:
diff --git a/contrib/gtest-1.7.0/build-aux/install-sh b/contrib/gtest-1.7.0/build-aux/install-sh
new file mode 100755
index 0000000..a9244eb
--- /dev/null
+++ b/contrib/gtest-1.7.0/build-aux/install-sh
@@ -0,0 +1,527 @@
+#!/bin/sh
+# install - install a program, script, or datafile
+
+scriptversion=2011-01-19.21; # UTC
+
+# This originates from X11R5 (mit/util/scripts/install.sh), which was
+# later released in X11R6 (xc/config/util/install.sh) with the
+# following copyright and license.
+#
+# Copyright (C) 1994 X Consortium
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to
+# deal in the Software without restriction, including without limitation the
+# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+# sell copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+#
+# 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.  IN NO EVENT SHALL THE
+# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC-
+# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+#
+# Except as contained in this notice, the name of the X Consortium shall not
+# be used in advertising or otherwise to promote the sale, use or other deal-
+# ings in this Software without prior written authorization from the X Consor-
+# tium.
+#
+#
+# FSF changes to this file are in the public domain.
+#
+# 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.
+
+nl='
+'
+IFS=" ""	$nl"
+
+# set DOITPROG to echo to test this script
+
+# Don't use :- since 4.3BSD and earlier shells don't like it.
+doit=${DOITPROG-}
+if test -z "$doit"; then
+  doit_exec=exec
+else
+  doit_exec=$doit
+fi
+
+# Put in absolute file names if you don't have them in your path;
+# or use environment vars.
+
+chgrpprog=${CHGRPPROG-chgrp}
+chmodprog=${CHMODPROG-chmod}
+chownprog=${CHOWNPROG-chown}
+cmpprog=${CMPPROG-cmp}
+cpprog=${CPPROG-cp}
+mkdirprog=${MKDIRPROG-mkdir}
+mvprog=${MVPROG-mv}
+rmprog=${RMPROG-rm}
+stripprog=${STRIPPROG-strip}
+
+posix_glob='?'
+initialize_posix_glob='
+  test "$posix_glob" != "?" || {
+    if (set -f) 2>/dev/null; then
+      posix_glob=
+    else
+      posix_glob=:
+    fi
+  }
+'
+
+posix_mkdir=
+
+# Desired mode of installed file.
+mode=0755
+
+chgrpcmd=
+chmodcmd=$chmodprog
+chowncmd=
+mvcmd=$mvprog
+rmcmd="$rmprog -f"
+stripcmd=
+
+src=
+dst=
+dir_arg=
+dst_arg=
+
+copy_on_change=false
+no_target_directory=
+
+usage="\
+Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE
+   or: $0 [OPTION]... SRCFILES... DIRECTORY
+   or: $0 [OPTION]... -t DIRECTORY SRCFILES...
+   or: $0 [OPTION]... -d DIRECTORIES...
+
+In the 1st form, copy SRCFILE to DSTFILE.
+In the 2nd and 3rd, copy all SRCFILES to DIRECTORY.
+In the 4th, create DIRECTORIES.
+
+Options:
+     --help     display this help and exit.
+     --version  display version info and exit.
+
+  -c            (ignored)
+  -C            install only if different (preserve the last data modification time)
+  -d            create directories instead of installing files.
+  -g GROUP      $chgrpprog installed files to GROUP.
+  -m MODE       $chmodprog installed files to MODE.
+  -o USER       $chownprog installed files to USER.
+  -s            $stripprog installed files.
+  -t DIRECTORY  install into DIRECTORY.
+  -T            report an error if DSTFILE is a directory.
+
+Environment variables override the default commands:
+  CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG
+  RMPROG STRIPPROG
+"
+
+while test $# -ne 0; do
+  case $1 in
+    -c) ;;
+
+    -C) copy_on_change=true;;
+
+    -d) dir_arg=true;;
+
+    -g) chgrpcmd="$chgrpprog $2"
+	shift;;
+
+    --help) echo "$usage"; exit $?;;
+
+    -m) mode=$2
+	case $mode in
+	  *' '* | *'	'* | *'
+'*	  | *'*'* | *'?'* | *'['*)
+	    echo "$0: invalid mode: $mode" >&2
+	    exit 1;;
+	esac
+	shift;;
+
+    -o) chowncmd="$chownprog $2"
+	shift;;
+
+    -s) stripcmd=$stripprog;;
+
+    -t) dst_arg=$2
+	# Protect names problematic for `test' and other utilities.
+	case $dst_arg in
+	  -* | [=\(\)!]) dst_arg=./$dst_arg;;
+	esac
+	shift;;
+
+    -T) no_target_directory=true;;
+
+    --version) echo "$0 $scriptversion"; exit $?;;
+
+    --)	shift
+	break;;
+
+    -*)	echo "$0: invalid option: $1" >&2
+	exit 1;;
+
+    *)  break;;
+  esac
+  shift
+done
+
+if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then
+  # When -d is used, all remaining arguments are directories to create.
+  # When -t is used, the destination is already specified.
+  # Otherwise, the last argument is the destination.  Remove it from $@.
+  for arg
+  do
+    if test -n "$dst_arg"; then
+      # $@ is not empty: it contains at least $arg.
+      set fnord "$@" "$dst_arg"
+      shift # fnord
+    fi
+    shift # arg
+    dst_arg=$arg
+    # Protect names problematic for `test' and other utilities.
+    case $dst_arg in
+      -* | [=\(\)!]) dst_arg=./$dst_arg;;
+    esac
+  done
+fi
+
+if test $# -eq 0; then
+  if test -z "$dir_arg"; then
+    echo "$0: no input file specified." >&2
+    exit 1
+  fi
+  # It's OK to call `install-sh -d' without argument.
+  # This can happen when creating conditional directories.
+  exit 0
+fi
+
+if test -z "$dir_arg"; then
+  do_exit='(exit $ret); exit $ret'
+  trap "ret=129; $do_exit" 1
+  trap "ret=130; $do_exit" 2
+  trap "ret=141; $do_exit" 13
+  trap "ret=143; $do_exit" 15
+
+  # Set umask so as not to create temps with too-generous modes.
+  # However, 'strip' requires both read and write access to temps.
+  case $mode in
+    # Optimize common cases.
+    *644) cp_umask=133;;
+    *755) cp_umask=22;;
+
+    *[0-7])
+      if test -z "$stripcmd"; then
+	u_plus_rw=
+      else
+	u_plus_rw='% 200'
+      fi
+      cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;;
+    *)
+      if test -z "$stripcmd"; then
+	u_plus_rw=
+      else
+	u_plus_rw=,u+rw
+      fi
+      cp_umask=$mode$u_plus_rw;;
+  esac
+fi
+
+for src
+do
+  # Protect names problematic for `test' and other utilities.
+  case $src in
+    -* | [=\(\)!]) src=./$src;;
+  esac
+
+  if test -n "$dir_arg"; then
+    dst=$src
+    dstdir=$dst
+    test -d "$dstdir"
+    dstdir_status=$?
+  else
+
+    # Waiting for this to be detected by the "$cpprog $src $dsttmp" command
+    # might cause directories to be created, which would be especially bad
+    # if $src (and thus $dsttmp) contains '*'.
+    if test ! -f "$src" && test ! -d "$src"; then
+      echo "$0: $src does not exist." >&2
+      exit 1
+    fi
+
+    if test -z "$dst_arg"; then
+      echo "$0: no destination specified." >&2
+      exit 1
+    fi
+    dst=$dst_arg
+
+    # If destination is a directory, append the input filename; won't work
+    # if double slashes aren't ignored.
+    if test -d "$dst"; then
+      if test -n "$no_target_directory"; then
+	echo "$0: $dst_arg: Is a directory" >&2
+	exit 1
+      fi
+      dstdir=$dst
+      dst=$dstdir/`basename "$src"`
+      dstdir_status=0
+    else
+      # Prefer dirname, but fall back on a substitute if dirname fails.
+      dstdir=`
+	(dirname "$dst") 2>/dev/null ||
+	expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	     X"$dst" : 'X\(//\)[^/]' \| \
+	     X"$dst" : 'X\(//\)$' \| \
+	     X"$dst" : 'X\(/\)' \| . 2>/dev/null ||
+	echo X"$dst" |
+	    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
+		   s//\1/
+		   q
+		 }
+		 /^X\(\/\/\)[^/].*/{
+		   s//\1/
+		   q
+		 }
+		 /^X\(\/\/\)$/{
+		   s//\1/
+		   q
+		 }
+		 /^X\(\/\).*/{
+		   s//\1/
+		   q
+		 }
+		 s/.*/./; q'
+      `
+
+      test -d "$dstdir"
+      dstdir_status=$?
+    fi
+  fi
+
+  obsolete_mkdir_used=false
+
+  if test $dstdir_status != 0; then
+    case $posix_mkdir in
+      '')
+	# Create intermediate dirs using mode 755 as modified by the umask.
+	# This is like FreeBSD 'install' as of 1997-10-28.
+	umask=`umask`
+	case $stripcmd.$umask in
+	  # Optimize common cases.
+	  *[2367][2367]) mkdir_umask=$umask;;
+	  .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;;
+
+	  *[0-7])
+	    mkdir_umask=`expr $umask + 22 \
+	      - $umask % 100 % 40 + $umask % 20 \
+	      - $umask % 10 % 4 + $umask % 2
+	    `;;
+	  *) mkdir_umask=$umask,go-w;;
+	esac
+
+	# With -d, create the new directory with the user-specified mode.
+	# Otherwise, rely on $mkdir_umask.
+	if test -n "$dir_arg"; then
+	  mkdir_mode=-m$mode
+	else
+	  mkdir_mode=
+	fi
+
+	posix_mkdir=false
+	case $umask in
+	  *[123567][0-7][0-7])
+	    # POSIX mkdir -p sets u+wx bits regardless of umask, which
+	    # is incompatible with FreeBSD 'install' when (umask & 300) != 0.
+	    ;;
+	  *)
+	    tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$
+	    trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0
+
+	    if (umask $mkdir_umask &&
+		exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1
+	    then
+	      if test -z "$dir_arg" || {
+		   # Check for POSIX incompatibilities with -m.
+		   # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or
+		   # other-writeable bit of parent directory when it shouldn't.
+		   # FreeBSD 6.1 mkdir -m -p sets mode of existing directory.
+		   ls_ld_tmpdir=`ls -ld "$tmpdir"`
+		   case $ls_ld_tmpdir in
+		     d????-?r-*) different_mode=700;;
+		     d????-?--*) different_mode=755;;
+		     *) false;;
+		   esac &&
+		   $mkdirprog -m$different_mode -p -- "$tmpdir" && {
+		     ls_ld_tmpdir_1=`ls -ld "$tmpdir"`
+		     test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1"
+		   }
+		 }
+	      then posix_mkdir=:
+	      fi
+	      rmdir "$tmpdir/d" "$tmpdir"
+	    else
+	      # Remove any dirs left behind by ancient mkdir implementations.
+	      rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null
+	    fi
+	    trap '' 0;;
+	esac;;
+    esac
+
+    if
+      $posix_mkdir && (
+	umask $mkdir_umask &&
+	$doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir"
+      )
+    then :
+    else
+
+      # The umask is ridiculous, or mkdir does not conform to POSIX,
+      # or it failed possibly due to a race condition.  Create the
+      # directory the slow way, step by step, checking for races as we go.
+
+      case $dstdir in
+	/*) prefix='/';;
+	[-=\(\)!]*) prefix='./';;
+	*)  prefix='';;
+      esac
+
+      eval "$initialize_posix_glob"
+
+      oIFS=$IFS
+      IFS=/
+      $posix_glob set -f
+      set fnord $dstdir
+      shift
+      $posix_glob set +f
+      IFS=$oIFS
+
+      prefixes=
+
+      for d
+      do
+	test X"$d" = X && continue
+
+	prefix=$prefix$d
+	if test -d "$prefix"; then
+	  prefixes=
+	else
+	  if $posix_mkdir; then
+	    (umask=$mkdir_umask &&
+	     $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break
+	    # Don't fail if two instances are running concurrently.
+	    test -d "$prefix" || exit 1
+	  else
+	    case $prefix in
+	      *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;;
+	      *) qprefix=$prefix;;
+	    esac
+	    prefixes="$prefixes '$qprefix'"
+	  fi
+	fi
+	prefix=$prefix/
+      done
+
+      if test -n "$prefixes"; then
+	# Don't fail if two instances are running concurrently.
+	(umask $mkdir_umask &&
+	 eval "\$doit_exec \$mkdirprog $prefixes") ||
+	  test -d "$dstdir" || exit 1
+	obsolete_mkdir_used=true
+      fi
+    fi
+  fi
+
+  if test -n "$dir_arg"; then
+    { test -z "$chowncmd" || $doit $chowncmd "$dst"; } &&
+    { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } &&
+    { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false ||
+      test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1
+  else
+
+    # Make a couple of temp file names in the proper directory.
+    dsttmp=$dstdir/_inst.$$_
+    rmtmp=$dstdir/_rm.$$_
+
+    # Trap to clean up those temp files at exit.
+    trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0
+
+    # Copy the file name to the temp name.
+    (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") &&
+
+    # 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 $cpprog $src $dsttmp" command.
+    #
+    { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } &&
+    { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } &&
+    { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } &&
+    { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } &&
+
+    # If -C, don't bother to copy if it wouldn't change the file.
+    if $copy_on_change &&
+       old=`LC_ALL=C ls -dlL "$dst"	2>/dev/null` &&
+       new=`LC_ALL=C ls -dlL "$dsttmp"	2>/dev/null` &&
+
+       eval "$initialize_posix_glob" &&
+       $posix_glob set -f &&
+       set X $old && old=:$2:$4:$5:$6 &&
+       set X $new && new=:$2:$4:$5:$6 &&
+       $posix_glob set +f &&
+
+       test "$old" = "$new" &&
+       $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1
+    then
+      rm -f "$dsttmp"
+    else
+      # Rename the file to the real destination.
+      $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null ||
+
+      # The rename failed, perhaps because mv can't rename something else
+      # to itself, or perhaps because mv is so ancient that it does not
+      # support -f.
+      {
+	# Now remove or move aside any old file at destination location.
+	# We try this two ways since rm can't unlink itself on some
+	# systems and the destination file might be busy for other
+	# reasons.  In this case, the final cleanup might fail but the new
+	# file should still install successfully.
+	{
+	  test ! -f "$dst" ||
+	  $doit $rmcmd -f "$dst" 2>/dev/null ||
+	  { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null &&
+	    { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; }
+	  } ||
+	  { echo "$0: cannot unlink or rename $dst" >&2
+	    (exit 1); exit 1
+	  }
+	} &&
+
+	# Now rename the file to the real destination.
+	$doit $mvcmd "$dsttmp" "$dst"
+      }
+    fi || exit 1
+
+    trap '' 0
+  fi
+done
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-time-zone: "UTC"
+# time-stamp-end: "; # UTC"
+# End:
diff --git a/contrib/gtest-1.7.0/build-aux/ltmain.sh b/contrib/gtest-1.7.0/build-aux/ltmain.sh
new file mode 100644
index 0000000..c2852d8
--- /dev/null
+++ b/contrib/gtest-1.7.0/build-aux/ltmain.sh
@@ -0,0 +1,9661 @@
+
+# libtool (GNU libtool) 2.4.2
+# Written by Gordon Matzigkeit <gord at gnu.ai.mit.edu>, 1996
+
+# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006,
+# 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc.
+# This is free software; see the source for copying conditions.  There is NO
+# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+# GNU Libtool is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# As a special exception to the GNU General Public License,
+# if you distribute this file as part of a program or library that
+# is built using GNU Libtool, you may include this file under the
+# same distribution terms that you use for the rest of that program.
+#
+# GNU Libtool 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 GNU Libtool; see the file COPYING.  If not, a copy
+# can be downloaded from http://www.gnu.org/licenses/gpl.html,
+# or obtained by writing to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+# Usage: $progname [OPTION]... [MODE-ARG]...
+#
+# Provide generalized library-building support services.
+#
+#       --config             show all configuration variables
+#       --debug              enable verbose shell tracing
+#   -n, --dry-run            display commands without modifying any files
+#       --features           display basic configuration information and exit
+#       --mode=MODE          use operation mode MODE
+#       --preserve-dup-deps  don't remove duplicate dependency libraries
+#       --quiet, --silent    don't print informational messages
+#       --no-quiet, --no-silent
+#                            print informational messages (default)
+#       --no-warn            don't display warning messages
+#       --tag=TAG            use configuration variables from tag TAG
+#   -v, --verbose            print more informational messages than default
+#       --no-verbose         don't print the extra informational messages
+#       --version            print version information
+#   -h, --help, --help-all   print short, long, or detailed help message
+#
+# MODE must be one of the following:
+#
+#         clean              remove files from the build directory
+#         compile            compile a source file into a libtool object
+#         execute            automatically set library path, then run a program
+#         finish             complete the installation of libtool libraries
+#         install            install libraries or executables
+#         link               create a library or an executable
+#         uninstall          remove libraries from an installed directory
+#
+# MODE-ARGS vary depending on the MODE.  When passed as first option,
+# `--mode=MODE' may be abbreviated as `MODE' or a unique abbreviation of that.
+# Try `$progname --help --mode=MODE' for a more detailed description of MODE.
+#
+# When reporting a bug, please describe a test case to reproduce it and
+# include the following information:
+#
+#         host-triplet:	$host
+#         shell:		$SHELL
+#         compiler:		$LTCC
+#         compiler flags:		$LTCFLAGS
+#         linker:		$LD (gnu? $with_gnu_ld)
+#         $progname:	(GNU libtool) 2.4.2 Debian-2.4.2-1ubuntu1
+#         automake:	$automake_version
+#         autoconf:	$autoconf_version
+#
+# Report bugs to <bug-libtool at gnu.org>.
+# GNU libtool home page: <http://www.gnu.org/software/libtool/>.
+# General help using GNU software: <http://www.gnu.org/gethelp/>.
+
+PROGRAM=libtool
+PACKAGE=libtool
+VERSION="2.4.2 Debian-2.4.2-1ubuntu1"
+TIMESTAMP=""
+package_revision=1.3337
+
+# Be Bourne compatible
+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
+BIN_SH=xpg4; export BIN_SH # for Tru64
+DUALCASE=1; export DUALCASE # for MKS sh
+
+# A function that is used when there is no print builtin or printf.
+func_fallback_echo ()
+{
+  eval 'cat <<_LTECHO_EOF
+$1
+_LTECHO_EOF'
+}
+
+# NLS nuisances: We save the old values to restore during execute mode.
+lt_user_locale=
+lt_safe_locale=
+for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES
+do
+  eval "if test \"\${$lt_var+set}\" = set; then
+          save_$lt_var=\$$lt_var
+          $lt_var=C
+	  export $lt_var
+	  lt_user_locale=\"$lt_var=\\\$save_\$lt_var; \$lt_user_locale\"
+	  lt_safe_locale=\"$lt_var=C; \$lt_safe_locale\"
+	fi"
+done
+LC_ALL=C
+LANGUAGE=C
+export LANGUAGE LC_ALL
+
+$lt_unset CDPATH
+
+
+# Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh
+# is ksh but when the shell is invoked as "sh" and the current value of
+# the _XPG environment variable is not equal to 1 (one), the special
+# positional parameter $0, within a function call, is the name of the
+# function.
+progpath="$0"
+
+
+
+: ${CP="cp -f"}
+test "${ECHO+set}" = set || ECHO=${as_echo-'printf %s\n'}
+: ${MAKE="make"}
+: ${MKDIR="mkdir"}
+: ${MV="mv -f"}
+: ${RM="rm -f"}
+: ${SHELL="${CONFIG_SHELL-/bin/sh}"}
+: ${Xsed="$SED -e 1s/^X//"}
+
+# Global variables:
+EXIT_SUCCESS=0
+EXIT_FAILURE=1
+EXIT_MISMATCH=63  # $? = 63 is used to indicate version mismatch to missing.
+EXIT_SKIP=77	  # $? = 77 is used to indicate a skipped test to automake.
+
+exit_status=$EXIT_SUCCESS
+
+# Make sure IFS has a sensible default
+lt_nl='
+'
+IFS=" 	$lt_nl"
+
+dirname="s,/[^/]*$,,"
+basename="s,^.*/,,"
+
+# func_dirname file append nondir_replacement
+# Compute the dirname of FILE.  If nonempty, add APPEND to the result,
+# otherwise set result to NONDIR_REPLACEMENT.
+func_dirname ()
+{
+    func_dirname_result=`$ECHO "${1}" | $SED "$dirname"`
+    if test "X$func_dirname_result" = "X${1}"; then
+      func_dirname_result="${3}"
+    else
+      func_dirname_result="$func_dirname_result${2}"
+    fi
+} # func_dirname may be replaced by extended shell implementation
+
+
+# func_basename file
+func_basename ()
+{
+    func_basename_result=`$ECHO "${1}" | $SED "$basename"`
+} # func_basename may be replaced by extended shell implementation
+
+
+# func_dirname_and_basename file append nondir_replacement
+# perform func_basename and func_dirname in a single function
+# call:
+#   dirname:  Compute the dirname of FILE.  If nonempty,
+#             add APPEND to the result, otherwise set result
+#             to NONDIR_REPLACEMENT.
+#             value returned in "$func_dirname_result"
+#   basename: Compute filename of FILE.
+#             value retuned in "$func_basename_result"
+# Implementation must be kept synchronized with func_dirname
+# and func_basename. For efficiency, we do not delegate to
+# those functions but instead duplicate the functionality here.
+func_dirname_and_basename ()
+{
+    # Extract subdirectory from the argument.
+    func_dirname_result=`$ECHO "${1}" | $SED -e "$dirname"`
+    if test "X$func_dirname_result" = "X${1}"; then
+      func_dirname_result="${3}"
+    else
+      func_dirname_result="$func_dirname_result${2}"
+    fi
+    func_basename_result=`$ECHO "${1}" | $SED -e "$basename"`
+} # func_dirname_and_basename may be replaced by extended shell implementation
+
+
+# func_stripname prefix suffix name
+# strip PREFIX and SUFFIX off of NAME.
+# PREFIX and SUFFIX must not contain globbing or regex special
+# characters, hashes, percent signs, but SUFFIX may contain a leading
+# dot (in which case that matches only a dot).
+# func_strip_suffix prefix name
+func_stripname ()
+{
+    case ${2} in
+      .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;;
+      *)  func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;;
+    esac
+} # func_stripname may be replaced by extended shell implementation
+
+
+# These SED scripts presuppose an absolute path with a trailing slash.
+pathcar='s,^/\([^/]*\).*$,\1,'
+pathcdr='s,^/[^/]*,,'
+removedotparts=':dotsl
+		s@/\./@/@g
+		t dotsl
+		s,/\.$,/,'
+collapseslashes='s@/\{1,\}@/@g'
+finalslash='s,/*$,/,'
+
+# func_normal_abspath PATH
+# Remove doubled-up and trailing slashes, "." path components,
+# and cancel out any ".." path components in PATH after making
+# it an absolute path.
+#             value returned in "$func_normal_abspath_result"
+func_normal_abspath ()
+{
+  # Start from root dir and reassemble the path.
+  func_normal_abspath_result=
+  func_normal_abspath_tpath=$1
+  func_normal_abspath_altnamespace=
+  case $func_normal_abspath_tpath in
+    "")
+      # Empty path, that just means $cwd.
+      func_stripname '' '/' "`pwd`"
+      func_normal_abspath_result=$func_stripname_result
+      return
+    ;;
+    # The next three entries are used to spot a run of precisely
+    # two leading slashes without using negated character classes;
+    # we take advantage of case's first-match behaviour.
+    ///*)
+      # Unusual form of absolute path, do nothing.
+    ;;
+    //*)
+      # Not necessarily an ordinary path; POSIX reserves leading '//'
+      # and for example Cygwin uses it to access remote file shares
+      # over CIFS/SMB, so we conserve a leading double slash if found.
+      func_normal_abspath_altnamespace=/
+    ;;
+    /*)
+      # Absolute path, do nothing.
+    ;;
+    *)
+      # Relative path, prepend $cwd.
+      func_normal_abspath_tpath=`pwd`/$func_normal_abspath_tpath
+    ;;
+  esac
+  # Cancel out all the simple stuff to save iterations.  We also want
+  # the path to end with a slash for ease of parsing, so make sure
+  # there is one (and only one) here.
+  func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \
+        -e "$removedotparts" -e "$collapseslashes" -e "$finalslash"`
+  while :; do
+    # Processed it all yet?
+    if test "$func_normal_abspath_tpath" = / ; then
+      # If we ascended to the root using ".." the result may be empty now.
+      if test -z "$func_normal_abspath_result" ; then
+        func_normal_abspath_result=/
+      fi
+      break
+    fi
+    func_normal_abspath_tcomponent=`$ECHO "$func_normal_abspath_tpath" | $SED \
+        -e "$pathcar"`
+    func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \
+        -e "$pathcdr"`
+    # Figure out what to do with it
+    case $func_normal_abspath_tcomponent in
+      "")
+        # Trailing empty path component, ignore it.
+      ;;
+      ..)
+        # Parent dir; strip last assembled component from result.
+        func_dirname "$func_normal_abspath_result"
+        func_normal_abspath_result=$func_dirname_result
+      ;;
+      *)
+        # Actual path component, append it.
+        func_normal_abspath_result=$func_normal_abspath_result/$func_normal_abspath_tcomponent
+      ;;
+    esac
+  done
+  # Restore leading double-slash if one was found on entry.
+  func_normal_abspath_result=$func_normal_abspath_altnamespace$func_normal_abspath_result
+}
+
+# func_relative_path SRCDIR DSTDIR
+# generates a relative path from SRCDIR to DSTDIR, with a trailing
+# slash if non-empty, suitable for immediately appending a filename
+# without needing to append a separator.
+#             value returned in "$func_relative_path_result"
+func_relative_path ()
+{
+  func_relative_path_result=
+  func_normal_abspath "$1"
+  func_relative_path_tlibdir=$func_normal_abspath_result
+  func_normal_abspath "$2"
+  func_relative_path_tbindir=$func_normal_abspath_result
+
+  # Ascend the tree starting from libdir
+  while :; do
+    # check if we have found a prefix of bindir
+    case $func_relative_path_tbindir in
+      $func_relative_path_tlibdir)
+        # found an exact match
+        func_relative_path_tcancelled=
+        break
+        ;;
+      $func_relative_path_tlibdir*)
+        # found a matching prefix
+        func_stripname "$func_relative_path_tlibdir" '' "$func_relative_path_tbindir"
+        func_relative_path_tcancelled=$func_stripname_result
+        if test -z "$func_relative_path_result"; then
+          func_relative_path_result=.
+        fi
+        break
+        ;;
+      *)
+        func_dirname $func_relative_path_tlibdir
+        func_relative_path_tlibdir=${func_dirname_result}
+        if test "x$func_relative_path_tlibdir" = x ; then
+          # Have to descend all the way to the root!
+          func_relative_path_result=../$func_relative_path_result
+          func_relative_path_tcancelled=$func_relative_path_tbindir
+          break
+        fi
+        func_relative_path_result=../$func_relative_path_result
+        ;;
+    esac
+  done
+
+  # Now calculate path; take care to avoid doubling-up slashes.
+  func_stripname '' '/' "$func_relative_path_result"
+  func_relative_path_result=$func_stripname_result
+  func_stripname '/' '/' "$func_relative_path_tcancelled"
+  if test "x$func_stripname_result" != x ; then
+    func_relative_path_result=${func_relative_path_result}/${func_stripname_result}
+  fi
+
+  # Normalisation. If bindir is libdir, return empty string,
+  # else relative path ending with a slash; either way, target
+  # file name can be directly appended.
+  if test ! -z "$func_relative_path_result"; then
+    func_stripname './' '' "$func_relative_path_result/"
+    func_relative_path_result=$func_stripname_result
+  fi
+}
+
+# The name of this program:
+func_dirname_and_basename "$progpath"
+progname=$func_basename_result
+
+# Make sure we have an absolute path for reexecution:
+case $progpath in
+  [\\/]*|[A-Za-z]:\\*) ;;
+  *[\\/]*)
+     progdir=$func_dirname_result
+     progdir=`cd "$progdir" && pwd`
+     progpath="$progdir/$progname"
+     ;;
+  *)
+     save_IFS="$IFS"
+     IFS=${PATH_SEPARATOR-:}
+     for progdir in $PATH; do
+       IFS="$save_IFS"
+       test -x "$progdir/$progname" && break
+     done
+     IFS="$save_IFS"
+     test -n "$progdir" || progdir=`pwd`
+     progpath="$progdir/$progname"
+     ;;
+esac
+
+# Sed substitution that helps us do robust quoting.  It backslashifies
+# metacharacters that are still active within double-quoted strings.
+Xsed="${SED}"' -e 1s/^X//'
+sed_quote_subst='s/\([`"$\\]\)/\\\1/g'
+
+# Same as above, but do not quote variable references.
+double_quote_subst='s/\(["`\\]\)/\\\1/g'
+
+# Sed substitution that turns a string into a regex matching for the
+# string literally.
+sed_make_literal_regex='s,[].[^$\\*\/],\\&,g'
+
+# Sed substitution that converts a w32 file name or path
+# which contains forward slashes, into one that contains
+# (escaped) backslashes.  A very naive implementation.
+lt_sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g'
+
+# Re-`\' parameter expansions in output of double_quote_subst that were
+# `\'-ed in input to the same.  If an odd number of `\' preceded a '$'
+# in input to double_quote_subst, that '$' was protected from expansion.
+# Since each input `\' is now two `\'s, look for any number of runs of
+# four `\'s followed by two `\'s and then a '$'.  `\' that '$'.
+bs='\\'
+bs2='\\\\'
+bs4='\\\\\\\\'
+dollar='\$'
+sed_double_backslash="\
+  s/$bs4/&\\
+/g
+  s/^$bs2$dollar/$bs&/
+  s/\\([^$bs]\\)$bs2$dollar/\\1$bs2$bs$dollar/g
+  s/\n//g"
+
+# Standard options:
+opt_dry_run=false
+opt_help=false
+opt_quiet=false
+opt_verbose=false
+opt_warning=:
+
+# func_echo arg...
+# Echo program name prefixed message, along with the current mode
+# name if it has been set yet.
+func_echo ()
+{
+    $ECHO "$progname: ${opt_mode+$opt_mode: }$*"
+}
+
+# func_verbose arg...
+# Echo program name prefixed message in verbose mode only.
+func_verbose ()
+{
+    $opt_verbose && func_echo ${1+"$@"}
+
+    # A bug in bash halts the script if the last line of a function
+    # fails when set -e is in force, so we need another command to
+    # work around that:
+    :
+}
+
+# func_echo_all arg...
+# Invoke $ECHO with all args, space-separated.
+func_echo_all ()
+{
+    $ECHO "$*"
+}
+
+# func_error arg...
+# Echo program name prefixed message to standard error.
+func_error ()
+{
+    $ECHO "$progname: ${opt_mode+$opt_mode: }"${1+"$@"} 1>&2
+}
+
+# func_warning arg...
+# Echo program name prefixed warning message to standard error.
+func_warning ()
+{
+    $opt_warning && $ECHO "$progname: ${opt_mode+$opt_mode: }warning: "${1+"$@"} 1>&2
+
+    # bash bug again:
+    :
+}
+
+# func_fatal_error arg...
+# Echo program name prefixed message to standard error, and exit.
+func_fatal_error ()
+{
+    func_error ${1+"$@"}
+    exit $EXIT_FAILURE
+}
+
+# func_fatal_help arg...
+# Echo program name prefixed message to standard error, followed by
+# a help hint, and exit.
+func_fatal_help ()
+{
+    func_error ${1+"$@"}
+    func_fatal_error "$help"
+}
+help="Try \`$progname --help' for more information."  ## default
+
+
+# func_grep expression filename
+# Check whether EXPRESSION matches any line of FILENAME, without output.
+func_grep ()
+{
+    $GREP "$1" "$2" >/dev/null 2>&1
+}
+
+
+# func_mkdir_p directory-path
+# Make sure the entire path to DIRECTORY-PATH is available.
+func_mkdir_p ()
+{
+    my_directory_path="$1"
+    my_dir_list=
+
+    if test -n "$my_directory_path" && test "$opt_dry_run" != ":"; then
+
+      # Protect directory names starting with `-'
+      case $my_directory_path in
+        -*) my_directory_path="./$my_directory_path" ;;
+      esac
+
+      # While some portion of DIR does not yet exist...
+      while test ! -d "$my_directory_path"; do
+        # ...make a list in topmost first order.  Use a colon delimited
+	# list incase some portion of path contains whitespace.
+        my_dir_list="$my_directory_path:$my_dir_list"
+
+        # If the last portion added has no slash in it, the list is done
+        case $my_directory_path in */*) ;; *) break ;; esac
+
+        # ...otherwise throw away the child directory and loop
+        my_directory_path=`$ECHO "$my_directory_path" | $SED -e "$dirname"`
+      done
+      my_dir_list=`$ECHO "$my_dir_list" | $SED 's,:*$,,'`
+
+      save_mkdir_p_IFS="$IFS"; IFS=':'
+      for my_dir in $my_dir_list; do
+	IFS="$save_mkdir_p_IFS"
+        # mkdir can fail with a `File exist' error if two processes
+        # try to create one of the directories concurrently.  Don't
+        # stop in that case!
+        $MKDIR "$my_dir" 2>/dev/null || :
+      done
+      IFS="$save_mkdir_p_IFS"
+
+      # Bail out if we (or some other process) failed to create a directory.
+      test -d "$my_directory_path" || \
+        func_fatal_error "Failed to create \`$1'"
+    fi
+}
+
+
+# func_mktempdir [string]
+# Make a temporary directory that won't clash with other running
+# libtool processes, and avoids race conditions if possible.  If
+# given, STRING is the basename for that directory.
+func_mktempdir ()
+{
+    my_template="${TMPDIR-/tmp}/${1-$progname}"
+
+    if test "$opt_dry_run" = ":"; then
+      # Return a directory name, but don't create it in dry-run mode
+      my_tmpdir="${my_template}-$$"
+    else
+
+      # If mktemp works, use that first and foremost
+      my_tmpdir=`mktemp -d "${my_template}-XXXXXXXX" 2>/dev/null`
+
+      if test ! -d "$my_tmpdir"; then
+        # Failing that, at least try and use $RANDOM to avoid a race
+        my_tmpdir="${my_template}-${RANDOM-0}$$"
+
+        save_mktempdir_umask=`umask`
+        umask 0077
+        $MKDIR "$my_tmpdir"
+        umask $save_mktempdir_umask
+      fi
+
+      # If we're not in dry-run mode, bomb out on failure
+      test -d "$my_tmpdir" || \
+        func_fatal_error "cannot create temporary directory \`$my_tmpdir'"
+    fi
+
+    $ECHO "$my_tmpdir"
+}
+
+
+# func_quote_for_eval arg
+# Aesthetically quote ARG to be evaled later.
+# This function returns two values: FUNC_QUOTE_FOR_EVAL_RESULT
+# is double-quoted, suitable for a subsequent eval, whereas
+# FUNC_QUOTE_FOR_EVAL_UNQUOTED_RESULT has merely all characters
+# which are still active within double quotes backslashified.
+func_quote_for_eval ()
+{
+    case $1 in
+      *[\\\`\"\$]*)
+	func_quote_for_eval_unquoted_result=`$ECHO "$1" | $SED "$sed_quote_subst"` ;;
+      *)
+        func_quote_for_eval_unquoted_result="$1" ;;
+    esac
+
+    case $func_quote_for_eval_unquoted_result in
+      # Double-quote args containing shell metacharacters to delay
+      # word splitting, command substitution and and variable
+      # expansion for a subsequent eval.
+      # Many Bourne shells cannot handle close brackets correctly
+      # in scan sets, so we specify it separately.
+      *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
+        func_quote_for_eval_result="\"$func_quote_for_eval_unquoted_result\""
+        ;;
+      *)
+        func_quote_for_eval_result="$func_quote_for_eval_unquoted_result"
+    esac
+}
+
+
+# func_quote_for_expand arg
+# Aesthetically quote ARG to be evaled later; same as above,
+# but do not quote variable references.
+func_quote_for_expand ()
+{
+    case $1 in
+      *[\\\`\"]*)
+	my_arg=`$ECHO "$1" | $SED \
+	    -e "$double_quote_subst" -e "$sed_double_backslash"` ;;
+      *)
+        my_arg="$1" ;;
+    esac
+
+    case $my_arg in
+      # Double-quote args containing shell metacharacters to delay
+      # word splitting and command substitution for a subsequent eval.
+      # Many Bourne shells cannot handle close brackets correctly
+      # in scan sets, so we specify it separately.
+      *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \	]*|*]*|"")
+        my_arg="\"$my_arg\""
+        ;;
+    esac
+
+    func_quote_for_expand_result="$my_arg"
+}
+
+
+# func_show_eval cmd [fail_exp]
+# Unless opt_silent is true, then output CMD.  Then, if opt_dryrun is
+# not true, evaluate CMD.  If the evaluation of CMD fails, and FAIL_EXP
+# is given, then evaluate it.
+func_show_eval ()
+{
+    my_cmd="$1"
+    my_fail_exp="${2-:}"
+
+    ${opt_silent-false} || {
+      func_quote_for_expand "$my_cmd"
+      eval "func_echo $func_quote_for_expand_result"
+    }
+
+    if ${opt_dry_run-false}; then :; else
+      eval "$my_cmd"
+      my_status=$?
+      if test "$my_status" -eq 0; then :; else
+	eval "(exit $my_status); $my_fail_exp"
+      fi
+    fi
+}
+
+
+# func_show_eval_locale cmd [fail_exp]
+# Unless opt_silent is true, then output CMD.  Then, if opt_dryrun is
+# not true, evaluate CMD.  If the evaluation of CMD fails, and FAIL_EXP
+# is given, then evaluate it.  Use the saved locale for evaluation.
+func_show_eval_locale ()
+{
+    my_cmd="$1"
+    my_fail_exp="${2-:}"
+
+    ${opt_silent-false} || {
+      func_quote_for_expand "$my_cmd"
+      eval "func_echo $func_quote_for_expand_result"
+    }
+
+    if ${opt_dry_run-false}; then :; else
+      eval "$lt_user_locale
+	    $my_cmd"
+      my_status=$?
+      eval "$lt_safe_locale"
+      if test "$my_status" -eq 0; then :; else
+	eval "(exit $my_status); $my_fail_exp"
+      fi
+    fi
+}
+
+# func_tr_sh
+# Turn $1 into a string suitable for a shell variable name.
+# Result is stored in $func_tr_sh_result.  All characters
+# not in the set a-zA-Z0-9_ are replaced with '_'. Further,
+# if $1 begins with a digit, a '_' is prepended as well.
+func_tr_sh ()
+{
+  case $1 in
+  [0-9]* | *[!a-zA-Z0-9_]*)
+    func_tr_sh_result=`$ECHO "$1" | $SED 's/^\([0-9]\)/_\1/; s/[^a-zA-Z0-9_]/_/g'`
+    ;;
+  * )
+    func_tr_sh_result=$1
+    ;;
+  esac
+}
+
+
+# func_version
+# Echo version message to standard output and exit.
+func_version ()
+{
+    $opt_debug
+
+    $SED -n '/(C)/!b go
+	:more
+	/\./!{
+	  N
+	  s/\n# / /
+	  b more
+	}
+	:go
+	/^# '$PROGRAM' (GNU /,/# warranty; / {
+        s/^# //
+	s/^# *$//
+        s/\((C)\)[ 0-9,-]*\( [1-9][0-9]*\)/\1\2/
+        p
+     }' < "$progpath"
+     exit $?
+}
+
+# func_usage
+# Echo short help message to standard output and exit.
+func_usage ()
+{
+    $opt_debug
+
+    $SED -n '/^# Usage:/,/^#  *.*--help/ {
+        s/^# //
+	s/^# *$//
+	s/\$progname/'$progname'/
+	p
+    }' < "$progpath"
+    echo
+    $ECHO "run \`$progname --help | more' for full usage"
+    exit $?
+}
+
+# func_help [NOEXIT]
+# Echo long help message to standard output and exit,
+# unless 'noexit' is passed as argument.
+func_help ()
+{
+    $opt_debug
+
+    $SED -n '/^# Usage:/,/# Report bugs to/ {
+	:print
+        s/^# //
+	s/^# *$//
+	s*\$progname*'$progname'*
+	s*\$host*'"$host"'*
+	s*\$SHELL*'"$SHELL"'*
+	s*\$LTCC*'"$LTCC"'*
+	s*\$LTCFLAGS*'"$LTCFLAGS"'*
+	s*\$LD*'"$LD"'*
+	s/\$with_gnu_ld/'"$with_gnu_ld"'/
+	s/\$automake_version/'"`(${AUTOMAKE-automake} --version) 2>/dev/null |$SED 1q`"'/
+	s/\$autoconf_version/'"`(${AUTOCONF-autoconf} --version) 2>/dev/null |$SED 1q`"'/
+	p
+	d
+     }
+     /^# .* home page:/b print
+     /^# General help using/b print
+     ' < "$progpath"
+    ret=$?
+    if test -z "$1"; then
+      exit $ret
+    fi
+}
+
+# func_missing_arg argname
+# Echo program name prefixed message to standard error and set global
+# exit_cmd.
+func_missing_arg ()
+{
+    $opt_debug
+
+    func_error "missing argument for $1."
+    exit_cmd=exit
+}
+
+
+# func_split_short_opt shortopt
+# Set func_split_short_opt_name and func_split_short_opt_arg shell
+# variables after splitting SHORTOPT after the 2nd character.
+func_split_short_opt ()
+{
+    my_sed_short_opt='1s/^\(..\).*$/\1/;q'
+    my_sed_short_rest='1s/^..\(.*\)$/\1/;q'
+
+    func_split_short_opt_name=`$ECHO "$1" | $SED "$my_sed_short_opt"`
+    func_split_short_opt_arg=`$ECHO "$1" | $SED "$my_sed_short_rest"`
+} # func_split_short_opt may be replaced by extended shell implementation
+
+
+# func_split_long_opt longopt
+# Set func_split_long_opt_name and func_split_long_opt_arg shell
+# variables after splitting LONGOPT at the `=' sign.
+func_split_long_opt ()
+{
+    my_sed_long_opt='1s/^\(--[^=]*\)=.*/\1/;q'
+    my_sed_long_arg='1s/^--[^=]*=//'
+
+    func_split_long_opt_name=`$ECHO "$1" | $SED "$my_sed_long_opt"`
+    func_split_long_opt_arg=`$ECHO "$1" | $SED "$my_sed_long_arg"`
+} # func_split_long_opt may be replaced by extended shell implementation
+
+exit_cmd=:
+
+
+
+
+
+magic="%%%MAGIC variable%%%"
+magic_exe="%%%MAGIC EXE variable%%%"
+
+# Global variables.
+nonopt=
+preserve_args=
+lo2o="s/\\.lo\$/.${objext}/"
+o2lo="s/\\.${objext}\$/.lo/"
+extracted_archives=
+extracted_serial=0
+
+# If this variable is set in any of the actions, the command in it
+# will be execed at the end.  This prevents here-documents from being
+# left over by shells.
+exec_cmd=
+
+# func_append var value
+# Append VALUE to the end of shell variable VAR.
+func_append ()
+{
+    eval "${1}=\$${1}\${2}"
+} # func_append may be replaced by extended shell implementation
+
+# func_append_quoted var value
+# Quote VALUE and append to the end of shell variable VAR, separated
+# by a space.
+func_append_quoted ()
+{
+    func_quote_for_eval "${2}"
+    eval "${1}=\$${1}\\ \$func_quote_for_eval_result"
+} # func_append_quoted may be replaced by extended shell implementation
+
+
+# func_arith arithmetic-term...
+func_arith ()
+{
+    func_arith_result=`expr "${@}"`
+} # func_arith may be replaced by extended shell implementation
+
+
+# func_len string
+# STRING may not start with a hyphen.
+func_len ()
+{
+    func_len_result=`expr "${1}" : ".*" 2>/dev/null || echo $max_cmd_len`
+} # func_len may be replaced by extended shell implementation
+
+
+# func_lo2o object
+func_lo2o ()
+{
+    func_lo2o_result=`$ECHO "${1}" | $SED "$lo2o"`
+} # func_lo2o may be replaced by extended shell implementation
+
+
+# func_xform libobj-or-source
+func_xform ()
+{
+    func_xform_result=`$ECHO "${1}" | $SED 's/\.[^.]*$/.lo/'`
+} # func_xform may be replaced by extended shell implementation
+
+
+# func_fatal_configuration arg...
+# Echo program name prefixed message to standard error, followed by
+# a configuration failure hint, and exit.
+func_fatal_configuration ()
+{
+    func_error ${1+"$@"}
+    func_error "See the $PACKAGE documentation for more information."
+    func_fatal_error "Fatal configuration error."
+}
+
+
+# func_config
+# Display the configuration for all the tags in this script.
+func_config ()
+{
+    re_begincf='^# ### BEGIN LIBTOOL'
+    re_endcf='^# ### END LIBTOOL'
+
+    # Default configuration.
+    $SED "1,/$re_begincf CONFIG/d;/$re_endcf CONFIG/,\$d" < "$progpath"
+
+    # Now print the configurations for the tags.
+    for tagname in $taglist; do
+      $SED -n "/$re_begincf TAG CONFIG: $tagname\$/,/$re_endcf TAG CONFIG: $tagname\$/p" < "$progpath"
+    done
+
+    exit $?
+}
+
+# func_features
+# Display the features supported by this script.
+func_features ()
+{
+    echo "host: $host"
+    if test "$build_libtool_libs" = yes; then
+      echo "enable shared libraries"
+    else
+      echo "disable shared libraries"
+    fi
+    if test "$build_old_libs" = yes; then
+      echo "enable static libraries"
+    else
+      echo "disable static libraries"
+    fi
+
+    exit $?
+}
+
+# func_enable_tag tagname
+# Verify that TAGNAME is valid, and either flag an error and exit, or
+# enable the TAGNAME tag.  We also add TAGNAME to the global $taglist
+# variable here.
+func_enable_tag ()
+{
+  # Global variable:
+  tagname="$1"
+
+  re_begincf="^# ### BEGIN LIBTOOL TAG CONFIG: $tagname\$"
+  re_endcf="^# ### END LIBTOOL TAG CONFIG: $tagname\$"
+  sed_extractcf="/$re_begincf/,/$re_endcf/p"
+
+  # Validate tagname.
+  case $tagname in
+    *[!-_A-Za-z0-9,/]*)
+      func_fatal_error "invalid tag name: $tagname"
+      ;;
+  esac
+
+  # Don't test for the "default" C tag, as we know it's
+  # there but not specially marked.
+  case $tagname in
+    CC) ;;
+    *)
+      if $GREP "$re_begincf" "$progpath" >/dev/null 2>&1; then
+	taglist="$taglist $tagname"
+
+	# Evaluate the configuration.  Be careful to quote the path
+	# and the sed script, to avoid splitting on whitespace, but
+	# also don't use non-portable quotes within backquotes within
+	# quotes we have to do it in 2 steps:
+	extractedcf=`$SED -n -e "$sed_extractcf" < "$progpath"`
+	eval "$extractedcf"
+      else
+	func_error "ignoring unknown tag $tagname"
+      fi
+      ;;
+  esac
+}
+
+# func_check_version_match
+# Ensure that we are using m4 macros, and libtool script from the same
+# release of libtool.
+func_check_version_match ()
+{
+  if test "$package_revision" != "$macro_revision"; then
+    if test "$VERSION" != "$macro_version"; then
+      if test -z "$macro_version"; then
+        cat >&2 <<_LT_EOF
+$progname: Version mismatch error.  This is $PACKAGE $VERSION, but the
+$progname: definition of this LT_INIT comes from an older release.
+$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION
+$progname: and run autoconf again.
+_LT_EOF
+      else
+        cat >&2 <<_LT_EOF
+$progname: Version mismatch error.  This is $PACKAGE $VERSION, but the
+$progname: definition of this LT_INIT comes from $PACKAGE $macro_version.
+$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION
+$progname: and run autoconf again.
+_LT_EOF
+      fi
+    else
+      cat >&2 <<_LT_EOF
+$progname: Version mismatch error.  This is $PACKAGE $VERSION, revision $package_revision,
+$progname: but the definition of this LT_INIT comes from revision $macro_revision.
+$progname: You should recreate aclocal.m4 with macros from revision $package_revision
+$progname: of $PACKAGE $VERSION and run autoconf again.
+_LT_EOF
+    fi
+
+    exit $EXIT_MISMATCH
+  fi
+}
+
+
+# Shorthand for --mode=foo, only valid as the first argument
+case $1 in
+clean|clea|cle|cl)
+  shift; set dummy --mode clean ${1+"$@"}; shift
+  ;;
+compile|compil|compi|comp|com|co|c)
+  shift; set dummy --mode compile ${1+"$@"}; shift
+  ;;
+execute|execut|execu|exec|exe|ex|e)
+  shift; set dummy --mode execute ${1+"$@"}; shift
+  ;;
+finish|finis|fini|fin|fi|f)
+  shift; set dummy --mode finish ${1+"$@"}; shift
+  ;;
+install|instal|insta|inst|ins|in|i)
+  shift; set dummy --mode install ${1+"$@"}; shift
+  ;;
+link|lin|li|l)
+  shift; set dummy --mode link ${1+"$@"}; shift
+  ;;
+uninstall|uninstal|uninsta|uninst|unins|unin|uni|un|u)
+  shift; set dummy --mode uninstall ${1+"$@"}; shift
+  ;;
+esac
+
+
+
+# Option defaults:
+opt_debug=:
+opt_dry_run=false
+opt_config=false
+opt_preserve_dup_deps=false
+opt_features=false
+opt_finish=false
+opt_help=false
+opt_help_all=false
+opt_silent=:
+opt_warning=:
+opt_verbose=:
+opt_silent=false
+opt_verbose=false
+
+
+# Parse options once, thoroughly.  This comes as soon as possible in the
+# script to make things like `--version' happen as quickly as we can.
+{
+  # this just eases exit handling
+  while test $# -gt 0; do
+    opt="$1"
+    shift
+    case $opt in
+      --debug|-x)	opt_debug='set -x'
+			func_echo "enabling shell trace mode"
+			$opt_debug
+			;;
+      --dry-run|--dryrun|-n)
+			opt_dry_run=:
+			;;
+      --config)
+			opt_config=:
+func_config
+			;;
+      --dlopen|-dlopen)
+			optarg="$1"
+			opt_dlopen="${opt_dlopen+$opt_dlopen
+}$optarg"
+			shift
+			;;
+      --preserve-dup-deps)
+			opt_preserve_dup_deps=:
+			;;
+      --features)
+			opt_features=:
+func_features
+			;;
+      --finish)
+			opt_finish=:
+set dummy --mode finish ${1+"$@"}; shift
+			;;
+      --help)
+			opt_help=:
+			;;
+      --help-all)
+			opt_help_all=:
+opt_help=': help-all'
+			;;
+      --mode)
+			test $# = 0 && func_missing_arg $opt && break
+			optarg="$1"
+			opt_mode="$optarg"
+case $optarg in
+  # Valid mode arguments:
+  clean|compile|execute|finish|install|link|relink|uninstall) ;;
+
+  # Catch anything else as an error
+  *) func_error "invalid argument for $opt"
+     exit_cmd=exit
+     break
+     ;;
+esac
+			shift
+			;;
+      --no-silent|--no-quiet)
+			opt_silent=false
+func_append preserve_args " $opt"
+			;;
+      --no-warning|--no-warn)
+			opt_warning=false
+func_append preserve_args " $opt"
+			;;
+      --no-verbose)
+			opt_verbose=false
+func_append preserve_args " $opt"
+			;;
+      --silent|--quiet)
+			opt_silent=:
+func_append preserve_args " $opt"
+        opt_verbose=false
+			;;
+      --verbose|-v)
+			opt_verbose=:
+func_append preserve_args " $opt"
+opt_silent=false
+			;;
+      --tag)
+			test $# = 0 && func_missing_arg $opt && break
+			optarg="$1"
+			opt_tag="$optarg"
+func_append preserve_args " $opt $optarg"
+func_enable_tag "$optarg"
+			shift
+			;;
+
+      -\?|-h)		func_usage				;;
+      --help)		func_help				;;
+      --version)	func_version				;;
+
+      # Separate optargs to long options:
+      --*=*)
+			func_split_long_opt "$opt"
+			set dummy "$func_split_long_opt_name" "$func_split_long_opt_arg" ${1+"$@"}
+			shift
+			;;
+
+      # Separate non-argument short options:
+      -\?*|-h*|-n*|-v*)
+			func_split_short_opt "$opt"
+			set dummy "$func_split_short_opt_name" "-$func_split_short_opt_arg" ${1+"$@"}
+			shift
+			;;
+
+      --)		break					;;
+      -*)		func_fatal_help "unrecognized option \`$opt'" ;;
+      *)		set dummy "$opt" ${1+"$@"};	shift; break  ;;
+    esac
+  done
+
+  # Validate options:
+
+  # save first non-option argument
+  if test "$#" -gt 0; then
+    nonopt="$opt"
+    shift
+  fi
+
+  # preserve --debug
+  test "$opt_debug" = : || func_append preserve_args " --debug"
+
+  case $host in
+    *cygwin* | *mingw* | *pw32* | *cegcc*)
+      # don't eliminate duplications in $postdeps and $predeps
+      opt_duplicate_compiler_generated_deps=:
+      ;;
+    *)
+      opt_duplicate_compiler_generated_deps=$opt_preserve_dup_deps
+      ;;
+  esac
+
+  $opt_help || {
+    # Sanity checks first:
+    func_check_version_match
+
+    if test "$build_libtool_libs" != yes && test "$build_old_libs" != yes; then
+      func_fatal_configuration "not configured to build any kind of library"
+    fi
+
+    # Darwin sucks
+    eval std_shrext=\"$shrext_cmds\"
+
+    # Only execute mode is allowed to have -dlopen flags.
+    if test -n "$opt_dlopen" && test "$opt_mode" != execute; then
+      func_error "unrecognized option \`-dlopen'"
+      $ECHO "$help" 1>&2
+      exit $EXIT_FAILURE
+    fi
+
+    # Change the help message to a mode-specific one.
+    generic_help="$help"
+    help="Try \`$progname --help --mode=$opt_mode' for more information."
+  }
+
+
+  # Bail if the options were screwed
+  $exit_cmd $EXIT_FAILURE
+}
+
+
+
+
+## ----------- ##
+##    Main.    ##
+## ----------- ##
+
+# func_lalib_p file
+# True iff FILE is a libtool `.la' library or `.lo' object file.
+# This function is only a basic sanity check; it will hardly flush out
+# determined imposters.
+func_lalib_p ()
+{
+    test -f "$1" &&
+      $SED -e 4q "$1" 2>/dev/null \
+        | $GREP "^# Generated by .*$PACKAGE" > /dev/null 2>&1
+}
+
+# func_lalib_unsafe_p file
+# True iff FILE is a libtool `.la' library or `.lo' object file.
+# This function implements the same check as func_lalib_p without
+# resorting to external programs.  To this end, it redirects stdin and
+# closes it afterwards, without saving the original file descriptor.
+# As a safety measure, use it only where a negative result would be
+# fatal anyway.  Works if `file' does not exist.
+func_lalib_unsafe_p ()
+{
+    lalib_p=no
+    if test -f "$1" && test -r "$1" && exec 5<&0 <"$1"; then
+	for lalib_p_l in 1 2 3 4
+	do
+	    read lalib_p_line
+	    case "$lalib_p_line" in
+		\#\ Generated\ by\ *$PACKAGE* ) lalib_p=yes; break;;
+	    esac
+	done
+	exec 0<&5 5<&-
+    fi
+    test "$lalib_p" = yes
+}
+
+# func_ltwrapper_script_p file
+# True iff FILE is a libtool wrapper script
+# This function is only a basic sanity check; it will hardly flush out
+# determined imposters.
+func_ltwrapper_script_p ()
+{
+    func_lalib_p "$1"
+}
+
+# func_ltwrapper_executable_p file
+# True iff FILE is a libtool wrapper executable
+# This function is only a basic sanity check; it will hardly flush out
+# determined imposters.
+func_ltwrapper_executable_p ()
+{
+    func_ltwrapper_exec_suffix=
+    case $1 in
+    *.exe) ;;
+    *) func_ltwrapper_exec_suffix=.exe ;;
+    esac
+    $GREP "$magic_exe" "$1$func_ltwrapper_exec_suffix" >/dev/null 2>&1
+}
+
+# func_ltwrapper_scriptname file
+# Assumes file is an ltwrapper_executable
+# uses $file to determine the appropriate filename for a
+# temporary ltwrapper_script.
+func_ltwrapper_scriptname ()
+{
+    func_dirname_and_basename "$1" "" "."
+    func_stripname '' '.exe' "$func_basename_result"
+    func_ltwrapper_scriptname_result="$func_dirname_result/$objdir/${func_stripname_result}_ltshwrapper"
+}
+
+# func_ltwrapper_p file
+# True iff FILE is a libtool wrapper script or wrapper executable
+# This function is only a basic sanity check; it will hardly flush out
+# determined imposters.
+func_ltwrapper_p ()
+{
+    func_ltwrapper_script_p "$1" || func_ltwrapper_executable_p "$1"
+}
+
+
+# func_execute_cmds commands fail_cmd
+# Execute tilde-delimited COMMANDS.
+# If FAIL_CMD is given, eval that upon failure.
+# FAIL_CMD may read-access the current command in variable CMD!
+func_execute_cmds ()
+{
+    $opt_debug
+    save_ifs=$IFS; IFS='~'
+    for cmd in $1; do
+      IFS=$save_ifs
+      eval cmd=\"$cmd\"
+      func_show_eval "$cmd" "${2-:}"
+    done
+    IFS=$save_ifs
+}
+
+
+# func_source file
+# Source FILE, adding directory component if necessary.
+# Note that it is not necessary on cygwin/mingw to append a dot to
+# FILE even if both FILE and FILE.exe exist: automatic-append-.exe
+# behavior happens only for exec(3), not for open(2)!  Also, sourcing
+# `FILE.' does not work on cygwin managed mounts.
+func_source ()
+{
+    $opt_debug
+    case $1 in
+    */* | *\\*)	. "$1" ;;
+    *)		. "./$1" ;;
+    esac
+}
+
+
+# func_resolve_sysroot PATH
+# Replace a leading = in PATH with a sysroot.  Store the result into
+# func_resolve_sysroot_result
+func_resolve_sysroot ()
+{
+  func_resolve_sysroot_result=$1
+  case $func_resolve_sysroot_result in
+  =*)
+    func_stripname '=' '' "$func_resolve_sysroot_result"
+    func_resolve_sysroot_result=$lt_sysroot$func_stripname_result
+    ;;
+  esac
+}
+
+# func_replace_sysroot PATH
+# If PATH begins with the sysroot, replace it with = and
+# store the result into func_replace_sysroot_result.
+func_replace_sysroot ()
+{
+  case "$lt_sysroot:$1" in
+  ?*:"$lt_sysroot"*)
+    func_stripname "$lt_sysroot" '' "$1"
+    func_replace_sysroot_result="=$func_stripname_result"
+    ;;
+  *)
+    # Including no sysroot.
+    func_replace_sysroot_result=$1
+    ;;
+  esac
+}
+
+# func_infer_tag arg
+# Infer tagged configuration to use if any are available and
+# if one wasn't chosen via the "--tag" command line option.
+# Only attempt this if the compiler in the base compile
+# command doesn't match the default compiler.
+# arg is usually of the form 'gcc ...'
+func_infer_tag ()
+{
+    $opt_debug
+    if test -n "$available_tags" && test -z "$tagname"; then
+      CC_quoted=
+      for arg in $CC; do
+	func_append_quoted CC_quoted "$arg"
+      done
+      CC_expanded=`func_echo_all $CC`
+      CC_quoted_expanded=`func_echo_all $CC_quoted`
+      case $@ in
+      # Blanks in the command may have been stripped by the calling shell,
+      # but not from the CC environment variable when configure was run.
+      " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \
+      " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*) ;;
+      # Blanks at the start of $base_compile will cause this to fail
+      # if we don't check for them as well.
+      *)
+	for z in $available_tags; do
+	  if $GREP "^# ### BEGIN LIBTOOL TAG CONFIG: $z$" < "$progpath" > /dev/null; then
+	    # Evaluate the configuration.
+	    eval "`${SED} -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$z'$/,/^# ### END LIBTOOL TAG CONFIG: '$z'$/p' < $progpath`"
+	    CC_quoted=
+	    for arg in $CC; do
+	      # Double-quote args containing other shell metacharacters.
+	      func_append_quoted CC_quoted "$arg"
+	    done
+	    CC_expanded=`func_echo_all $CC`
+	    CC_quoted_expanded=`func_echo_all $CC_quoted`
+	    case "$@ " in
+	    " $CC "* | "$CC "* | " $CC_expanded "* | "$CC_expanded "* | \
+	    " $CC_quoted"* | "$CC_quoted "* | " $CC_quoted_expanded "* | "$CC_quoted_expanded "*)
+	      # The compiler in the base compile command matches
+	      # the one in the tagged configuration.
+	      # Assume this is the tagged configuration we want.
+	      tagname=$z
+	      break
+	      ;;
+	    esac
+	  fi
+	done
+	# If $tagname still isn't set, then no tagged configuration
+	# was found and let the user know that the "--tag" command
+	# line option must be used.
+	if test -z "$tagname"; then
+	  func_echo "unable to infer tagged configuration"
+	  func_fatal_error "specify a tag with \`--tag'"
+#	else
+#	  func_verbose "using $tagname tagged configuration"
+	fi
+	;;
+      esac
+    fi
+}
+
+
+
+# func_write_libtool_object output_name pic_name nonpic_name
+# Create a libtool object file (analogous to a ".la" file),
+# but don't create it if we're doing a dry run.
+func_write_libtool_object ()
+{
+    write_libobj=${1}
+    if test "$build_libtool_libs" = yes; then
+      write_lobj=\'${2}\'
+    else
+      write_lobj=none
+    fi
+
+    if test "$build_old_libs" = yes; then
+      write_oldobj=\'${3}\'
+    else
+      write_oldobj=none
+    fi
+
+    $opt_dry_run || {
+      cat >${write_libobj}T <<EOF
+# $write_libobj - a libtool object file
+# Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# Name of the PIC object.
+pic_object=$write_lobj
+
+# Name of the non-PIC object
+non_pic_object=$write_oldobj
+
+EOF
+      $MV "${write_libobj}T" "${write_libobj}"
+    }
+}
+
+
+##################################################
+# FILE NAME AND PATH CONVERSION HELPER FUNCTIONS #
+##################################################
+
+# func_convert_core_file_wine_to_w32 ARG
+# Helper function used by file name conversion functions when $build is *nix,
+# and $host is mingw, cygwin, or some other w32 environment. Relies on a
+# correctly configured wine environment available, with the winepath program
+# in $build's $PATH.
+#
+# ARG is the $build file name to be converted to w32 format.
+# Result is available in $func_convert_core_file_wine_to_w32_result, and will
+# be empty on error (or when ARG is empty)
+func_convert_core_file_wine_to_w32 ()
+{
+  $opt_debug
+  func_convert_core_file_wine_to_w32_result="$1"
+  if test -n "$1"; then
+    # Unfortunately, winepath does not exit with a non-zero error code, so we
+    # are forced to check the contents of stdout. On the other hand, if the
+    # command is not found, the shell will set an exit code of 127 and print
+    # *an error message* to stdout. So we must check for both error code of
+    # zero AND non-empty stdout, which explains the odd construction:
+    func_convert_core_file_wine_to_w32_tmp=`winepath -w "$1" 2>/dev/null`
+    if test "$?" -eq 0 && test -n "${func_convert_core_file_wine_to_w32_tmp}"; then
+      func_convert_core_file_wine_to_w32_result=`$ECHO "$func_convert_core_file_wine_to_w32_tmp" |
+        $SED -e "$lt_sed_naive_backslashify"`
+    else
+      func_convert_core_file_wine_to_w32_result=
+    fi
+  fi
+}
+# end: func_convert_core_file_wine_to_w32
+
+
+# func_convert_core_path_wine_to_w32 ARG
+# Helper function used by path conversion functions when $build is *nix, and
+# $host is mingw, cygwin, or some other w32 environment. Relies on a correctly
+# configured wine environment available, with the winepath program in $build's
+# $PATH. Assumes ARG has no leading or trailing path separator characters.
+#
+# ARG is path to be converted from $build format to win32.
+# Result is available in $func_convert_core_path_wine_to_w32_result.
+# Unconvertible file (directory) names in ARG are skipped; if no directory names
+# are convertible, then the result may be empty.
+func_convert_core_path_wine_to_w32 ()
+{
+  $opt_debug
+  # unfortunately, winepath doesn't convert paths, only file names
+  func_convert_core_path_wine_to_w32_result=""
+  if test -n "$1"; then
+    oldIFS=$IFS
+    IFS=:
+    for func_convert_core_path_wine_to_w32_f in $1; do
+      IFS=$oldIFS
+      func_convert_core_file_wine_to_w32 "$func_convert_core_path_wine_to_w32_f"
+      if test -n "$func_convert_core_file_wine_to_w32_result" ; then
+        if test -z "$func_convert_core_path_wine_to_w32_result"; then
+          func_convert_core_path_wine_to_w32_result="$func_convert_core_file_wine_to_w32_result"
+        else
+          func_append func_convert_core_path_wine_to_w32_result ";$func_convert_core_file_wine_to_w32_result"
+        fi
+      fi
+    done
+    IFS=$oldIFS
+  fi
+}
+# end: func_convert_core_path_wine_to_w32
+
+
+# func_cygpath ARGS...
+# Wrapper around calling the cygpath program via LT_CYGPATH. This is used when
+# when (1) $build is *nix and Cygwin is hosted via a wine environment; or (2)
+# $build is MSYS and $host is Cygwin, or (3) $build is Cygwin. In case (1) or
+# (2), returns the Cygwin file name or path in func_cygpath_result (input
+# file name or path is assumed to be in w32 format, as previously converted
+# from $build's *nix or MSYS format). In case (3), returns the w32 file name
+# or path in func_cygpath_result (input file name or path is assumed to be in
+# Cygwin format). Returns an empty string on error.
+#
+# ARGS are passed to cygpath, with the last one being the file name or path to
+# be converted.
+#
+# Specify the absolute *nix (or w32) name to cygpath in the LT_CYGPATH
+# environment variable; do not put it in $PATH.
+func_cygpath ()
+{
+  $opt_debug
+  if test -n "$LT_CYGPATH" && test -f "$LT_CYGPATH"; then
+    func_cygpath_result=`$LT_CYGPATH "$@" 2>/dev/null`
+    if test "$?" -ne 0; then
+      # on failure, ensure result is empty
+      func_cygpath_result=
+    fi
+  else
+    func_cygpath_result=
+    func_error "LT_CYGPATH is empty or specifies non-existent file: \`$LT_CYGPATH'"
+  fi
+}
+#end: func_cygpath
+
+
+# func_convert_core_msys_to_w32 ARG
+# Convert file name or path ARG from MSYS format to w32 format.  Return
+# result in func_convert_core_msys_to_w32_result.
+func_convert_core_msys_to_w32 ()
+{
+  $opt_debug
+  # awkward: cmd appends spaces to result
+  func_convert_core_msys_to_w32_result=`( cmd //c echo "$1" ) 2>/dev/null |
+    $SED -e 's/[ ]*$//' -e "$lt_sed_naive_backslashify"`
+}
+#end: func_convert_core_msys_to_w32
+
+
+# func_convert_file_check ARG1 ARG2
+# Verify that ARG1 (a file name in $build format) was converted to $host
+# format in ARG2. Otherwise, emit an error message, but continue (resetting
+# func_to_host_file_result to ARG1).
+func_convert_file_check ()
+{
+  $opt_debug
+  if test -z "$2" && test -n "$1" ; then
+    func_error "Could not determine host file name corresponding to"
+    func_error "  \`$1'"
+    func_error "Continuing, but uninstalled executables may not work."
+    # Fallback:
+    func_to_host_file_result="$1"
+  fi
+}
+# end func_convert_file_check
+
+
+# func_convert_path_check FROM_PATHSEP TO_PATHSEP FROM_PATH TO_PATH
+# Verify that FROM_PATH (a path in $build format) was converted to $host
+# format in TO_PATH. Otherwise, emit an error message, but continue, resetting
+# func_to_host_file_result to a simplistic fallback value (see below).
+func_convert_path_check ()
+{
+  $opt_debug
+  if test -z "$4" && test -n "$3"; then
+    func_error "Could not determine the host path corresponding to"
+    func_error "  \`$3'"
+    func_error "Continuing, but uninstalled executables may not work."
+    # Fallback.  This is a deliberately simplistic "conversion" and
+    # should not be "improved".  See libtool.info.
+    if test "x$1" != "x$2"; then
+      lt_replace_pathsep_chars="s|$1|$2|g"
+      func_to_host_path_result=`echo "$3" |
+        $SED -e "$lt_replace_pathsep_chars"`
+    else
+      func_to_host_path_result="$3"
+    fi
+  fi
+}
+# end func_convert_path_check
+
+
+# func_convert_path_front_back_pathsep FRONTPAT BACKPAT REPL ORIG
+# Modifies func_to_host_path_result by prepending REPL if ORIG matches FRONTPAT
+# and appending REPL if ORIG matches BACKPAT.
+func_convert_path_front_back_pathsep ()
+{
+  $opt_debug
+  case $4 in
+  $1 ) func_to_host_path_result="$3$func_to_host_path_result"
+    ;;
+  esac
+  case $4 in
+  $2 ) func_append func_to_host_path_result "$3"
+    ;;
+  esac
+}
+# end func_convert_path_front_back_pathsep
+
+
+##################################################
+# $build to $host FILE NAME CONVERSION FUNCTIONS #
+##################################################
+# invoked via `$to_host_file_cmd ARG'
+#
+# In each case, ARG is the path to be converted from $build to $host format.
+# Result will be available in $func_to_host_file_result.
+
+
+# func_to_host_file ARG
+# Converts the file name ARG from $build format to $host format. Return result
+# in func_to_host_file_result.
+func_to_host_file ()
+{
+  $opt_debug
+  $to_host_file_cmd "$1"
+}
+# end func_to_host_file
+
+
+# func_to_tool_file ARG LAZY
+# converts the file name ARG from $build format to toolchain format. Return
+# result in func_to_tool_file_result.  If the conversion in use is listed
+# in (the comma separated) LAZY, no conversion takes place.
+func_to_tool_file ()
+{
+  $opt_debug
+  case ,$2, in
+    *,"$to_tool_file_cmd",*)
+      func_to_tool_file_result=$1
+      ;;
+    *)
+      $to_tool_file_cmd "$1"
+      func_to_tool_file_result=$func_to_host_file_result
+      ;;
+  esac
+}
+# end func_to_tool_file
+
+
+# func_convert_file_noop ARG
+# Copy ARG to func_to_host_file_result.
+func_convert_file_noop ()
+{
+  func_to_host_file_result="$1"
+}
+# end func_convert_file_noop
+
+
+# func_convert_file_msys_to_w32 ARG
+# Convert file name ARG from (mingw) MSYS to (mingw) w32 format; automatic
+# conversion to w32 is not available inside the cwrapper.  Returns result in
+# func_to_host_file_result.
+func_convert_file_msys_to_w32 ()
+{
+  $opt_debug
+  func_to_host_file_result="$1"
+  if test -n "$1"; then
+    func_convert_core_msys_to_w32 "$1"
+    func_to_host_file_result="$func_convert_core_msys_to_w32_result"
+  fi
+  func_convert_file_check "$1" "$func_to_host_file_result"
+}
+# end func_convert_file_msys_to_w32
+
+
+# func_convert_file_cygwin_to_w32 ARG
+# Convert file name ARG from Cygwin to w32 format.  Returns result in
+# func_to_host_file_result.
+func_convert_file_cygwin_to_w32 ()
+{
+  $opt_debug
+  func_to_host_file_result="$1"
+  if test -n "$1"; then
+    # because $build is cygwin, we call "the" cygpath in $PATH; no need to use
+    # LT_CYGPATH in this case.
+    func_to_host_file_result=`cygpath -m "$1"`
+  fi
+  func_convert_file_check "$1" "$func_to_host_file_result"
+}
+# end func_convert_file_cygwin_to_w32
+
+
+# func_convert_file_nix_to_w32 ARG
+# Convert file name ARG from *nix to w32 format.  Requires a wine environment
+# and a working winepath. Returns result in func_to_host_file_result.
+func_convert_file_nix_to_w32 ()
+{
+  $opt_debug
+  func_to_host_file_result="$1"
+  if test -n "$1"; then
+    func_convert_core_file_wine_to_w32 "$1"
+    func_to_host_file_result="$func_convert_core_file_wine_to_w32_result"
+  fi
+  func_convert_file_check "$1" "$func_to_host_file_result"
+}
+# end func_convert_file_nix_to_w32
+
+
+# func_convert_file_msys_to_cygwin ARG
+# Convert file name ARG from MSYS to Cygwin format.  Requires LT_CYGPATH set.
+# Returns result in func_to_host_file_result.
+func_convert_file_msys_to_cygwin ()
+{
+  $opt_debug
+  func_to_host_file_result="$1"
+  if test -n "$1"; then
+    func_convert_core_msys_to_w32 "$1"
+    func_cygpath -u "$func_convert_core_msys_to_w32_result"
+    func_to_host_file_result="$func_cygpath_result"
+  fi
+  func_convert_file_check "$1" "$func_to_host_file_result"
+}
+# end func_convert_file_msys_to_cygwin
+
+
+# func_convert_file_nix_to_cygwin ARG
+# Convert file name ARG from *nix to Cygwin format.  Requires Cygwin installed
+# in a wine environment, working winepath, and LT_CYGPATH set.  Returns result
+# in func_to_host_file_result.
+func_convert_file_nix_to_cygwin ()
+{
+  $opt_debug
+  func_to_host_file_result="$1"
+  if test -n "$1"; then
+    # convert from *nix to w32, then use cygpath to convert from w32 to cygwin.
+    func_convert_core_file_wine_to_w32 "$1"
+    func_cygpath -u "$func_convert_core_file_wine_to_w32_result"
+    func_to_host_file_result="$func_cygpath_result"
+  fi
+  func_convert_file_check "$1" "$func_to_host_file_result"
+}
+# end func_convert_file_nix_to_cygwin
+
+
+#############################################
+# $build to $host PATH CONVERSION FUNCTIONS #
+#############################################
+# invoked via `$to_host_path_cmd ARG'
+#
+# In each case, ARG is the path to be converted from $build to $host format.
+# The result will be available in $func_to_host_path_result.
+#
+# Path separators are also converted from $build format to $host format.  If
+# ARG begins or ends with a path separator character, it is preserved (but
+# converted to $host format) on output.
+#
+# All path conversion functions are named using the following convention:
+#   file name conversion function    : func_convert_file_X_to_Y ()
+#   path conversion function         : func_convert_path_X_to_Y ()
+# where, for any given $build/$host combination the 'X_to_Y' value is the
+# same.  If conversion functions are added for new $build/$host combinations,
+# the two new functions must follow this pattern, or func_init_to_host_path_cmd
+# will break.
+
+
+# func_init_to_host_path_cmd
+# Ensures that function "pointer" variable $to_host_path_cmd is set to the
+# appropriate value, based on the value of $to_host_file_cmd.
+to_host_path_cmd=
+func_init_to_host_path_cmd ()
+{
+  $opt_debug
+  if test -z "$to_host_path_cmd"; then
+    func_stripname 'func_convert_file_' '' "$to_host_file_cmd"
+    to_host_path_cmd="func_convert_path_${func_stripname_result}"
+  fi
+}
+
+
+# func_to_host_path ARG
+# Converts the path ARG from $build format to $host format. Return result
+# in func_to_host_path_result.
+func_to_host_path ()
+{
+  $opt_debug
+  func_init_to_host_path_cmd
+  $to_host_path_cmd "$1"
+}
+# end func_to_host_path
+
+
+# func_convert_path_noop ARG
+# Copy ARG to func_to_host_path_result.
+func_convert_path_noop ()
+{
+  func_to_host_path_result="$1"
+}
+# end func_convert_path_noop
+
+
+# func_convert_path_msys_to_w32 ARG
+# Convert path ARG from (mingw) MSYS to (mingw) w32 format; automatic
+# conversion to w32 is not available inside the cwrapper.  Returns result in
+# func_to_host_path_result.
+func_convert_path_msys_to_w32 ()
+{
+  $opt_debug
+  func_to_host_path_result="$1"
+  if test -n "$1"; then
+    # Remove leading and trailing path separator characters from ARG.  MSYS
+    # behavior is inconsistent here; cygpath turns them into '.;' and ';.';
+    # and winepath ignores them completely.
+    func_stripname : : "$1"
+    func_to_host_path_tmp1=$func_stripname_result
+    func_convert_core_msys_to_w32 "$func_to_host_path_tmp1"
+    func_to_host_path_result="$func_convert_core_msys_to_w32_result"
+    func_convert_path_check : ";" \
+      "$func_to_host_path_tmp1" "$func_to_host_path_result"
+    func_convert_path_front_back_pathsep ":*" "*:" ";" "$1"
+  fi
+}
+# end func_convert_path_msys_to_w32
+
+
+# func_convert_path_cygwin_to_w32 ARG
+# Convert path ARG from Cygwin to w32 format.  Returns result in
+# func_to_host_file_result.
+func_convert_path_cygwin_to_w32 ()
+{
+  $opt_debug
+  func_to_host_path_result="$1"
+  if test -n "$1"; then
+    # See func_convert_path_msys_to_w32:
+    func_stripname : : "$1"
+    func_to_host_path_tmp1=$func_stripname_result
+    func_to_host_path_result=`cygpath -m -p "$func_to_host_path_tmp1"`
+    func_convert_path_check : ";" \
+      "$func_to_host_path_tmp1" "$func_to_host_path_result"
+    func_convert_path_front_back_pathsep ":*" "*:" ";" "$1"
+  fi
+}
+# end func_convert_path_cygwin_to_w32
+
+
+# func_convert_path_nix_to_w32 ARG
+# Convert path ARG from *nix to w32 format.  Requires a wine environment and
+# a working winepath.  Returns result in func_to_host_file_result.
+func_convert_path_nix_to_w32 ()
+{
+  $opt_debug
+  func_to_host_path_result="$1"
+  if test -n "$1"; then
+    # See func_convert_path_msys_to_w32:
+    func_stripname : : "$1"
+    func_to_host_path_tmp1=$func_stripname_result
+    func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1"
+    func_to_host_path_result="$func_convert_core_path_wine_to_w32_result"
+    func_convert_path_check : ";" \
+      "$func_to_host_path_tmp1" "$func_to_host_path_result"
+    func_convert_path_front_back_pathsep ":*" "*:" ";" "$1"
+  fi
+}
+# end func_convert_path_nix_to_w32
+
+
+# func_convert_path_msys_to_cygwin ARG
+# Convert path ARG from MSYS to Cygwin format.  Requires LT_CYGPATH set.
+# Returns result in func_to_host_file_result.
+func_convert_path_msys_to_cygwin ()
+{
+  $opt_debug
+  func_to_host_path_result="$1"
+  if test -n "$1"; then
+    # See func_convert_path_msys_to_w32:
+    func_stripname : : "$1"
+    func_to_host_path_tmp1=$func_stripname_result
+    func_convert_core_msys_to_w32 "$func_to_host_path_tmp1"
+    func_cygpath -u -p "$func_convert_core_msys_to_w32_result"
+    func_to_host_path_result="$func_cygpath_result"
+    func_convert_path_check : : \
+      "$func_to_host_path_tmp1" "$func_to_host_path_result"
+    func_convert_path_front_back_pathsep ":*" "*:" : "$1"
+  fi
+}
+# end func_convert_path_msys_to_cygwin
+
+
+# func_convert_path_nix_to_cygwin ARG
+# Convert path ARG from *nix to Cygwin format.  Requires Cygwin installed in a
+# a wine environment, working winepath, and LT_CYGPATH set.  Returns result in
+# func_to_host_file_result.
+func_convert_path_nix_to_cygwin ()
+{
+  $opt_debug
+  func_to_host_path_result="$1"
+  if test -n "$1"; then
+    # Remove leading and trailing path separator characters from
+    # ARG. msys behavior is inconsistent here, cygpath turns them
+    # into '.;' and ';.', and winepath ignores them completely.
+    func_stripname : : "$1"
+    func_to_host_path_tmp1=$func_stripname_result
+    func_convert_core_path_wine_to_w32 "$func_to_host_path_tmp1"
+    func_cygpath -u -p "$func_convert_core_path_wine_to_w32_result"
+    func_to_host_path_result="$func_cygpath_result"
+    func_convert_path_check : : \
+      "$func_to_host_path_tmp1" "$func_to_host_path_result"
+    func_convert_path_front_back_pathsep ":*" "*:" : "$1"
+  fi
+}
+# end func_convert_path_nix_to_cygwin
+
+
+# func_mode_compile arg...
+func_mode_compile ()
+{
+    $opt_debug
+    # Get the compilation command and the source file.
+    base_compile=
+    srcfile="$nonopt"  #  always keep a non-empty value in "srcfile"
+    suppress_opt=yes
+    suppress_output=
+    arg_mode=normal
+    libobj=
+    later=
+    pie_flag=
+
+    for arg
+    do
+      case $arg_mode in
+      arg  )
+	# do not "continue".  Instead, add this to base_compile
+	lastarg="$arg"
+	arg_mode=normal
+	;;
+
+      target )
+	libobj="$arg"
+	arg_mode=normal
+	continue
+	;;
+
+      normal )
+	# Accept any command-line options.
+	case $arg in
+	-o)
+	  test -n "$libobj" && \
+	    func_fatal_error "you cannot specify \`-o' more than once"
+	  arg_mode=target
+	  continue
+	  ;;
+
+	-pie | -fpie | -fPIE)
+          func_append pie_flag " $arg"
+	  continue
+	  ;;
+
+	-shared | -static | -prefer-pic | -prefer-non-pic)
+	  func_append later " $arg"
+	  continue
+	  ;;
+
+	-no-suppress)
+	  suppress_opt=no
+	  continue
+	  ;;
+
+	-Xcompiler)
+	  arg_mode=arg  #  the next one goes into the "base_compile" arg list
+	  continue      #  The current "srcfile" will either be retained or
+	  ;;            #  replaced later.  I would guess that would be a bug.
+
+	-Wc,*)
+	  func_stripname '-Wc,' '' "$arg"
+	  args=$func_stripname_result
+	  lastarg=
+	  save_ifs="$IFS"; IFS=','
+	  for arg in $args; do
+	    IFS="$save_ifs"
+	    func_append_quoted lastarg "$arg"
+	  done
+	  IFS="$save_ifs"
+	  func_stripname ' ' '' "$lastarg"
+	  lastarg=$func_stripname_result
+
+	  # Add the arguments to base_compile.
+	  func_append base_compile " $lastarg"
+	  continue
+	  ;;
+
+	*)
+	  # Accept the current argument as the source file.
+	  # The previous "srcfile" becomes the current argument.
+	  #
+	  lastarg="$srcfile"
+	  srcfile="$arg"
+	  ;;
+	esac  #  case $arg
+	;;
+      esac    #  case $arg_mode
+
+      # Aesthetically quote the previous argument.
+      func_append_quoted base_compile "$lastarg"
+    done # for arg
+
+    case $arg_mode in
+    arg)
+      func_fatal_error "you must specify an argument for -Xcompile"
+      ;;
+    target)
+      func_fatal_error "you must specify a target with \`-o'"
+      ;;
+    *)
+      # Get the name of the library object.
+      test -z "$libobj" && {
+	func_basename "$srcfile"
+	libobj="$func_basename_result"
+      }
+      ;;
+    esac
+
+    # Recognize several different file suffixes.
+    # If the user specifies -o file.o, it is replaced with file.lo
+    case $libobj in
+    *.[cCFSifmso] | \
+    *.ada | *.adb | *.ads | *.asm | \
+    *.c++ | *.cc | *.ii | *.class | *.cpp | *.cxx | \
+    *.[fF][09]? | *.for | *.java | *.go | *.obj | *.sx | *.cu | *.cup)
+      func_xform "$libobj"
+      libobj=$func_xform_result
+      ;;
+    esac
+
+    case $libobj in
+    *.lo) func_lo2o "$libobj"; obj=$func_lo2o_result ;;
+    *)
+      func_fatal_error "cannot determine name of library object from \`$libobj'"
+      ;;
+    esac
+
+    func_infer_tag $base_compile
+
+    for arg in $later; do
+      case $arg in
+      -shared)
+	test "$build_libtool_libs" != yes && \
+	  func_fatal_configuration "can not build a shared library"
+	build_old_libs=no
+	continue
+	;;
+
+      -static)
+	build_libtool_libs=no
+	build_old_libs=yes
+	continue
+	;;
+
+      -prefer-pic)
+	pic_mode=yes
+	continue
+	;;
+
+      -prefer-non-pic)
+	pic_mode=no
+	continue
+	;;
+      esac
+    done
+
+    func_quote_for_eval "$libobj"
+    test "X$libobj" != "X$func_quote_for_eval_result" \
+      && $ECHO "X$libobj" | $GREP '[]~#^*{};<>?"'"'"'	 &()|`$[]' \
+      && func_warning "libobj name \`$libobj' may not contain shell special characters."
+    func_dirname_and_basename "$obj" "/" ""
+    objname="$func_basename_result"
+    xdir="$func_dirname_result"
+    lobj=${xdir}$objdir/$objname
+
+    test -z "$base_compile" && \
+      func_fatal_help "you must specify a compilation command"
+
+    # Delete any leftover library objects.
+    if test "$build_old_libs" = yes; then
+      removelist="$obj $lobj $libobj ${libobj}T"
+    else
+      removelist="$lobj $libobj ${libobj}T"
+    fi
+
+    # On Cygwin there's no "real" PIC flag so we must build both object types
+    case $host_os in
+    cygwin* | mingw* | pw32* | os2* | cegcc*)
+      pic_mode=default
+      ;;
+    esac
+    if test "$pic_mode" = no && test "$deplibs_check_method" != pass_all; then
+      # non-PIC code in shared libraries is not supported
+      pic_mode=default
+    fi
+
+    # Calculate the filename of the output object if compiler does
+    # not support -o with -c
+    if test "$compiler_c_o" = no; then
+      output_obj=`$ECHO "$srcfile" | $SED 's%^.*/%%; s%\.[^.]*$%%'`.${objext}
+      lockfile="$output_obj.lock"
+    else
+      output_obj=
+      need_locks=no
+      lockfile=
+    fi
+
+    # Lock this critical section if it is needed
+    # We use this script file to make the link, it avoids creating a new file
+    if test "$need_locks" = yes; then
+      until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do
+	func_echo "Waiting for $lockfile to be removed"
+	sleep 2
+      done
+    elif test "$need_locks" = warn; then
+      if test -f "$lockfile"; then
+	$ECHO "\
+*** ERROR, $lockfile exists and contains:
+`cat $lockfile 2>/dev/null`
+
+This indicates that another process is trying to use the same
+temporary object file, and libtool could not work around it because
+your compiler does not support \`-c' and \`-o' together.  If you
+repeat this compilation, it may succeed, by chance, but you had better
+avoid parallel builds (make -j) in this platform, or get a better
+compiler."
+
+	$opt_dry_run || $RM $removelist
+	exit $EXIT_FAILURE
+      fi
+      func_append removelist " $output_obj"
+      $ECHO "$srcfile" > "$lockfile"
+    fi
+
+    $opt_dry_run || $RM $removelist
+    func_append removelist " $lockfile"
+    trap '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' 1 2 15
+
+    func_to_tool_file "$srcfile" func_convert_file_msys_to_w32
+    srcfile=$func_to_tool_file_result
+    func_quote_for_eval "$srcfile"
+    qsrcfile=$func_quote_for_eval_result
+
+    # Only build a PIC object if we are building libtool libraries.
+    if test "$build_libtool_libs" = yes; then
+      # Without this assignment, base_compile gets emptied.
+      fbsd_hideous_sh_bug=$base_compile
+
+      if test "$pic_mode" != no; then
+	command="$base_compile $qsrcfile $pic_flag"
+      else
+	# Don't build PIC code
+	command="$base_compile $qsrcfile"
+      fi
+
+      func_mkdir_p "$xdir$objdir"
+
+      if test -z "$output_obj"; then
+	# Place PIC objects in $objdir
+	func_append command " -o $lobj"
+      fi
+
+      func_show_eval_locale "$command"	\
+          'test -n "$output_obj" && $RM $removelist; exit $EXIT_FAILURE'
+
+      if test "$need_locks" = warn &&
+	 test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then
+	$ECHO "\
+*** ERROR, $lockfile contains:
+`cat $lockfile 2>/dev/null`
+
+but it should contain:
+$srcfile
+
+This indicates that another process is trying to use the same
+temporary object file, and libtool could not work around it because
+your compiler does not support \`-c' and \`-o' together.  If you
+repeat this compilation, it may succeed, by chance, but you had better
+avoid parallel builds (make -j) in this platform, or get a better
+compiler."
+
+	$opt_dry_run || $RM $removelist
+	exit $EXIT_FAILURE
+      fi
+
+      # Just move the object if needed, then go on to compile the next one
+      if test -n "$output_obj" && test "X$output_obj" != "X$lobj"; then
+	func_show_eval '$MV "$output_obj" "$lobj"' \
+	  'error=$?; $opt_dry_run || $RM $removelist; exit $error'
+      fi
+
+      # Allow error messages only from the first compilation.
+      if test "$suppress_opt" = yes; then
+	suppress_output=' >/dev/null 2>&1'
+      fi
+    fi
+
+    # Only build a position-dependent object if we build old libraries.
+    if test "$build_old_libs" = yes; then
+      if test "$pic_mode" != yes; then
+	# Don't build PIC code
+	command="$base_compile $qsrcfile$pie_flag"
+      else
+	command="$base_compile $qsrcfile $pic_flag"
+      fi
+      if test "$compiler_c_o" = yes; then
+	func_append command " -o $obj"
+      fi
+
+      # Suppress compiler output if we already did a PIC compilation.
+      func_append command "$suppress_output"
+      func_show_eval_locale "$command" \
+        '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE'
+
+      if test "$need_locks" = warn &&
+	 test "X`cat $lockfile 2>/dev/null`" != "X$srcfile"; then
+	$ECHO "\
+*** ERROR, $lockfile contains:
+`cat $lockfile 2>/dev/null`
+
+but it should contain:
+$srcfile
+
+This indicates that another process is trying to use the same
+temporary object file, and libtool could not work around it because
+your compiler does not support \`-c' and \`-o' together.  If you
+repeat this compilation, it may succeed, by chance, but you had better
+avoid parallel builds (make -j) in this platform, or get a better
+compiler."
+
+	$opt_dry_run || $RM $removelist
+	exit $EXIT_FAILURE
+      fi
+
+      # Just move the object if needed
+      if test -n "$output_obj" && test "X$output_obj" != "X$obj"; then
+	func_show_eval '$MV "$output_obj" "$obj"' \
+	  'error=$?; $opt_dry_run || $RM $removelist; exit $error'
+      fi
+    fi
+
+    $opt_dry_run || {
+      func_write_libtool_object "$libobj" "$objdir/$objname" "$objname"
+
+      # Unlock the critical section if it was locked
+      if test "$need_locks" != no; then
+	removelist=$lockfile
+        $RM "$lockfile"
+      fi
+    }
+
+    exit $EXIT_SUCCESS
+}
+
+$opt_help || {
+  test "$opt_mode" = compile && func_mode_compile ${1+"$@"}
+}
+
+func_mode_help ()
+{
+    # We need to display help for each of the modes.
+    case $opt_mode in
+      "")
+        # Generic help is extracted from the usage comments
+        # at the start of this file.
+        func_help
+        ;;
+
+      clean)
+        $ECHO \
+"Usage: $progname [OPTION]... --mode=clean RM [RM-OPTION]... FILE...
+
+Remove files from the build directory.
+
+RM is the name of the program to use to delete files associated with each FILE
+(typically \`/bin/rm').  RM-OPTIONS are options (such as \`-f') to be passed
+to RM.
+
+If FILE is a libtool library, object or program, all the files associated
+with it are deleted. Otherwise, only FILE itself is deleted using RM."
+        ;;
+
+      compile)
+      $ECHO \
+"Usage: $progname [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE
+
+Compile a source file into a libtool library object.
+
+This mode accepts the following additional options:
+
+  -o OUTPUT-FILE    set the output file name to OUTPUT-FILE
+  -no-suppress      do not suppress compiler output for multiple passes
+  -prefer-pic       try to build PIC objects only
+  -prefer-non-pic   try to build non-PIC objects only
+  -shared           do not build a \`.o' file suitable for static linking
+  -static           only build a \`.o' file suitable for static linking
+  -Wc,FLAG          pass FLAG directly to the compiler
+
+COMPILE-COMMAND is a command to be used in creating a \`standard' object file
+from the given SOURCEFILE.
+
+The output file name is determined by removing the directory component from
+SOURCEFILE, then substituting the C source code suffix \`.c' with the
+library object suffix, \`.lo'."
+        ;;
+
+      execute)
+        $ECHO \
+"Usage: $progname [OPTION]... --mode=execute COMMAND [ARGS]...
+
+Automatically set library path, then run a program.
+
+This mode accepts the following additional options:
+
+  -dlopen FILE      add the directory containing FILE to the library path
+
+This mode sets the library path environment variable according to \`-dlopen'
+flags.
+
+If any of the ARGS are libtool executable wrappers, then they are translated
+into their corresponding uninstalled binary, and any of their required library
+directories are added to the library path.
+
+Then, COMMAND is executed, with ARGS as arguments."
+        ;;
+
+      finish)
+        $ECHO \
+"Usage: $progname [OPTION]... --mode=finish [LIBDIR]...
+
+Complete the installation of libtool libraries.
+
+Each LIBDIR is a directory that contains libtool libraries.
+
+The commands that this mode executes may require superuser privileges.  Use
+the \`--dry-run' option if you just want to see what would be executed."
+        ;;
+
+      install)
+        $ECHO \
+"Usage: $progname [OPTION]... --mode=install INSTALL-COMMAND...
+
+Install executables or libraries.
+
+INSTALL-COMMAND is the installation command.  The first component should be
+either the \`install' or \`cp' program.
+
+The following components of INSTALL-COMMAND are treated specially:
+
+  -inst-prefix-dir PREFIX-DIR  Use PREFIX-DIR as a staging area for installation
+
+The rest of the components are interpreted as arguments to that command (only
+BSD-compatible install options are recognized)."
+        ;;
+
+      link)
+        $ECHO \
+"Usage: $progname [OPTION]... --mode=link LINK-COMMAND...
+
+Link object files or libraries together to form another library, or to
+create an executable program.
+
+LINK-COMMAND is a command using the C compiler that you would use to create
+a program from several object files.
+
+The following components of LINK-COMMAND are treated specially:
+
+  -all-static       do not do any dynamic linking at all
+  -avoid-version    do not add a version suffix if possible
+  -bindir BINDIR    specify path to binaries directory (for systems where
+                    libraries must be found in the PATH setting at runtime)
+  -dlopen FILE      \`-dlpreopen' FILE if it cannot be dlopened at runtime
+  -dlpreopen FILE   link in FILE and add its symbols to lt_preloaded_symbols
+  -export-dynamic   allow symbols from OUTPUT-FILE to be resolved with dlsym(3)
+  -export-symbols SYMFILE
+                    try to export only the symbols listed in SYMFILE
+  -export-symbols-regex REGEX
+                    try to export only the symbols matching REGEX
+  -LLIBDIR          search LIBDIR for required installed libraries
+  -lNAME            OUTPUT-FILE requires the installed library libNAME
+  -module           build a library that can dlopened
+  -no-fast-install  disable the fast-install mode
+  -no-install       link a not-installable executable
+  -no-undefined     declare that a library does not refer to external symbols
+  -o OUTPUT-FILE    create OUTPUT-FILE from the specified objects
+  -objectlist FILE  Use a list of object files found in FILE to specify objects
+  -precious-files-regex REGEX
+                    don't remove output files matching REGEX
+  -release RELEASE  specify package release information
+  -rpath LIBDIR     the created library will eventually be installed in LIBDIR
+  -R[ ]LIBDIR       add LIBDIR to the runtime path of programs and libraries
+  -shared           only do dynamic linking of libtool libraries
+  -shrext SUFFIX    override the standard shared library file extension
+  -static           do not do any dynamic linking of uninstalled libtool libraries
+  -static-libtool-libs
+                    do not do any dynamic linking of libtool libraries
+  -version-info CURRENT[:REVISION[:AGE]]
+                    specify library version info [each variable defaults to 0]
+  -weak LIBNAME     declare that the target provides the LIBNAME interface
+  -Wc,FLAG
+  -Xcompiler FLAG   pass linker-specific FLAG directly to the compiler
+  -Wl,FLAG
+  -Xlinker FLAG     pass linker-specific FLAG directly to the linker
+  -XCClinker FLAG   pass link-specific FLAG to the compiler driver (CC)
+
+All other options (arguments beginning with \`-') are ignored.
+
+Every other argument is treated as a filename.  Files ending in \`.la' are
+treated as uninstalled libtool libraries, other files are standard or library
+object files.
+
+If the OUTPUT-FILE ends in \`.la', then a libtool library is created,
+only library objects (\`.lo' files) may be specified, and \`-rpath' is
+required, except when creating a convenience library.
+
+If OUTPUT-FILE ends in \`.a' or \`.lib', then a standard library is created
+using \`ar' and \`ranlib', or on Windows using \`lib'.
+
+If OUTPUT-FILE ends in \`.lo' or \`.${objext}', then a reloadable object file
+is created, otherwise an executable program is created."
+        ;;
+
+      uninstall)
+        $ECHO \
+"Usage: $progname [OPTION]... --mode=uninstall RM [RM-OPTION]... FILE...
+
+Remove libraries from an installation directory.
+
+RM is the name of the program to use to delete files associated with each FILE
+(typically \`/bin/rm').  RM-OPTIONS are options (such as \`-f') to be passed
+to RM.
+
+If FILE is a libtool library, all the files associated with it are deleted.
+Otherwise, only FILE itself is deleted using RM."
+        ;;
+
+      *)
+        func_fatal_help "invalid operation mode \`$opt_mode'"
+        ;;
+    esac
+
+    echo
+    $ECHO "Try \`$progname --help' for more information about other modes."
+}
+
+# Now that we've collected a possible --mode arg, show help if necessary
+if $opt_help; then
+  if test "$opt_help" = :; then
+    func_mode_help
+  else
+    {
+      func_help noexit
+      for opt_mode in compile link execute install finish uninstall clean; do
+	func_mode_help
+      done
+    } | sed -n '1p; 2,$s/^Usage:/  or: /p'
+    {
+      func_help noexit
+      for opt_mode in compile link execute install finish uninstall clean; do
+	echo
+	func_mode_help
+      done
+    } |
+    sed '1d
+      /^When reporting/,/^Report/{
+	H
+	d
+      }
+      $x
+      /information about other modes/d
+      /more detailed .*MODE/d
+      s/^Usage:.*--mode=\([^ ]*\) .*/Description of \1 mode:/'
+  fi
+  exit $?
+fi
+
+
+# func_mode_execute arg...
+func_mode_execute ()
+{
+    $opt_debug
+    # The first argument is the command name.
+    cmd="$nonopt"
+    test -z "$cmd" && \
+      func_fatal_help "you must specify a COMMAND"
+
+    # Handle -dlopen flags immediately.
+    for file in $opt_dlopen; do
+      test -f "$file" \
+	|| func_fatal_help "\`$file' is not a file"
+
+      dir=
+      case $file in
+      *.la)
+	func_resolve_sysroot "$file"
+	file=$func_resolve_sysroot_result
+
+	# Check to see that this really is a libtool archive.
+	func_lalib_unsafe_p "$file" \
+	  || func_fatal_help "\`$lib' is not a valid libtool archive"
+
+	# Read the libtool library.
+	dlname=
+	library_names=
+	func_source "$file"
+
+	# Skip this library if it cannot be dlopened.
+	if test -z "$dlname"; then
+	  # Warn if it was a shared library.
+	  test -n "$library_names" && \
+	    func_warning "\`$file' was not linked with \`-export-dynamic'"
+	  continue
+	fi
+
+	func_dirname "$file" "" "."
+	dir="$func_dirname_result"
+
+	if test -f "$dir/$objdir/$dlname"; then
+	  func_append dir "/$objdir"
+	else
+	  if test ! -f "$dir/$dlname"; then
+	    func_fatal_error "cannot find \`$dlname' in \`$dir' or \`$dir/$objdir'"
+	  fi
+	fi
+	;;
+
+      *.lo)
+	# Just add the directory containing the .lo file.
+	func_dirname "$file" "" "."
+	dir="$func_dirname_result"
+	;;
+
+      *)
+	func_warning "\`-dlopen' is ignored for non-libtool libraries and objects"
+	continue
+	;;
+      esac
+
+      # Get the absolute pathname.
+      absdir=`cd "$dir" && pwd`
+      test -n "$absdir" && dir="$absdir"
+
+      # Now add the directory to shlibpath_var.
+      if eval "test -z \"\$$shlibpath_var\""; then
+	eval "$shlibpath_var=\"\$dir\""
+      else
+	eval "$shlibpath_var=\"\$dir:\$$shlibpath_var\""
+      fi
+    done
+
+    # This variable tells wrapper scripts just to set shlibpath_var
+    # rather than running their programs.
+    libtool_execute_magic="$magic"
+
+    # Check if any of the arguments is a wrapper script.
+    args=
+    for file
+    do
+      case $file in
+      -* | *.la | *.lo ) ;;
+      *)
+	# Do a test to see if this is really a libtool program.
+	if func_ltwrapper_script_p "$file"; then
+	  func_source "$file"
+	  # Transform arg to wrapped name.
+	  file="$progdir/$program"
+	elif func_ltwrapper_executable_p "$file"; then
+	  func_ltwrapper_scriptname "$file"
+	  func_source "$func_ltwrapper_scriptname_result"
+	  # Transform arg to wrapped name.
+	  file="$progdir/$program"
+	fi
+	;;
+      esac
+      # Quote arguments (to preserve shell metacharacters).
+      func_append_quoted args "$file"
+    done
+
+    if test "X$opt_dry_run" = Xfalse; then
+      if test -n "$shlibpath_var"; then
+	# Export the shlibpath_var.
+	eval "export $shlibpath_var"
+      fi
+
+      # Restore saved environment variables
+      for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES
+      do
+	eval "if test \"\${save_$lt_var+set}\" = set; then
+                $lt_var=\$save_$lt_var; export $lt_var
+	      else
+		$lt_unset $lt_var
+	      fi"
+      done
+
+      # Now prepare to actually exec the command.
+      exec_cmd="\$cmd$args"
+    else
+      # Display what would be done.
+      if test -n "$shlibpath_var"; then
+	eval "\$ECHO \"\$shlibpath_var=\$$shlibpath_var\""
+	echo "export $shlibpath_var"
+      fi
+      $ECHO "$cmd$args"
+      exit $EXIT_SUCCESS
+    fi
+}
+
+test "$opt_mode" = execute && func_mode_execute ${1+"$@"}
+
+
+# func_mode_finish arg...
+func_mode_finish ()
+{
+    $opt_debug
+    libs=
+    libdirs=
+    admincmds=
+
+    for opt in "$nonopt" ${1+"$@"}
+    do
+      if test -d "$opt"; then
+	func_append libdirs " $opt"
+
+      elif test -f "$opt"; then
+	if func_lalib_unsafe_p "$opt"; then
+	  func_append libs " $opt"
+	else
+	  func_warning "\`$opt' is not a valid libtool archive"
+	fi
+
+      else
+	func_fatal_error "invalid argument \`$opt'"
+      fi
+    done
+
+    if test -n "$libs"; then
+      if test -n "$lt_sysroot"; then
+        sysroot_regex=`$ECHO "$lt_sysroot" | $SED "$sed_make_literal_regex"`
+        sysroot_cmd="s/\([ ']\)$sysroot_regex/\1/g;"
+      else
+        sysroot_cmd=
+      fi
+
+      # Remove sysroot references
+      if $opt_dry_run; then
+        for lib in $libs; do
+          echo "removing references to $lt_sysroot and \`=' prefixes from $lib"
+        done
+      else
+        tmpdir=`func_mktempdir`
+        for lib in $libs; do
+	  sed -e "${sysroot_cmd} s/\([ ']-[LR]\)=/\1/g; s/\([ ']\)=/\1/g" $lib \
+	    > $tmpdir/tmp-la
+	  mv -f $tmpdir/tmp-la $lib
+	done
+        ${RM}r "$tmpdir"
+      fi
+    fi
+
+    if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then
+      for libdir in $libdirs; do
+	if test -n "$finish_cmds"; then
+	  # Do each command in the finish commands.
+	  func_execute_cmds "$finish_cmds" 'admincmds="$admincmds
+'"$cmd"'"'
+	fi
+	if test -n "$finish_eval"; then
+	  # Do the single finish_eval.
+	  eval cmds=\"$finish_eval\"
+	  $opt_dry_run || eval "$cmds" || func_append admincmds "
+       $cmds"
+	fi
+      done
+    fi
+
+    # Exit here if they wanted silent mode.
+    $opt_silent && exit $EXIT_SUCCESS
+
+    if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then
+      echo "----------------------------------------------------------------------"
+      echo "Libraries have been installed in:"
+      for libdir in $libdirs; do
+	$ECHO "   $libdir"
+      done
+      echo
+      echo "If you ever happen to want to link against installed libraries"
+      echo "in a given directory, LIBDIR, you must either use libtool, and"
+      echo "specify the full pathname of the library, or use the \`-LLIBDIR'"
+      echo "flag during linking and do at least one of the following:"
+      if test -n "$shlibpath_var"; then
+	echo "   - add LIBDIR to the \`$shlibpath_var' environment variable"
+	echo "     during execution"
+      fi
+      if test -n "$runpath_var"; then
+	echo "   - add LIBDIR to the \`$runpath_var' environment variable"
+	echo "     during linking"
+      fi
+      if test -n "$hardcode_libdir_flag_spec"; then
+	libdir=LIBDIR
+	eval flag=\"$hardcode_libdir_flag_spec\"
+
+	$ECHO "   - use the \`$flag' linker flag"
+      fi
+      if test -n "$admincmds"; then
+	$ECHO "   - have your system administrator run these commands:$admincmds"
+      fi
+      if test -f /etc/ld.so.conf; then
+	echo "   - have your system administrator add LIBDIR to \`/etc/ld.so.conf'"
+      fi
+      echo
+
+      echo "See any operating system documentation about shared libraries for"
+      case $host in
+	solaris2.[6789]|solaris2.1[0-9])
+	  echo "more information, such as the ld(1), crle(1) and ld.so(8) manual"
+	  echo "pages."
+	  ;;
+	*)
+	  echo "more information, such as the ld(1) and ld.so(8) manual pages."
+	  ;;
+      esac
+      echo "----------------------------------------------------------------------"
+    fi
+    exit $EXIT_SUCCESS
+}
+
+test "$opt_mode" = finish && func_mode_finish ${1+"$@"}
+
+
+# func_mode_install arg...
+func_mode_install ()
+{
+    $opt_debug
+    # There may be an optional sh(1) argument at the beginning of
+    # install_prog (especially on Windows NT).
+    if test "$nonopt" = "$SHELL" || test "$nonopt" = /bin/sh ||
+       # Allow the use of GNU shtool's install command.
+       case $nonopt in *shtool*) :;; *) false;; esac; then
+      # Aesthetically quote it.
+      func_quote_for_eval "$nonopt"
+      install_prog="$func_quote_for_eval_result "
+      arg=$1
+      shift
+    else
+      install_prog=
+      arg=$nonopt
+    fi
+
+    # The real first argument should be the name of the installation program.
+    # Aesthetically quote it.
+    func_quote_for_eval "$arg"
+    func_append install_prog "$func_quote_for_eval_result"
+    install_shared_prog=$install_prog
+    case " $install_prog " in
+      *[\\\ /]cp\ *) install_cp=: ;;
+      *) install_cp=false ;;
+    esac
+
+    # We need to accept at least all the BSD install flags.
+    dest=
+    files=
+    opts=
+    prev=
+    install_type=
+    isdir=no
+    stripme=
+    no_mode=:
+    for arg
+    do
+      arg2=
+      if test -n "$dest"; then
+	func_append files " $dest"
+	dest=$arg
+	continue
+      fi
+
+      case $arg in
+      -d) isdir=yes ;;
+      -f)
+	if $install_cp; then :; else
+	  prev=$arg
+	fi
+	;;
+      -g | -m | -o)
+	prev=$arg
+	;;
+      -s)
+	stripme=" -s"
+	continue
+	;;
+      -*)
+	;;
+      *)
+	# If the previous option needed an argument, then skip it.
+	if test -n "$prev"; then
+	  if test "x$prev" = x-m && test -n "$install_override_mode"; then
+	    arg2=$install_override_mode
+	    no_mode=false
+	  fi
+	  prev=
+	else
+	  dest=$arg
+	  continue
+	fi
+	;;
+      esac
+
+      # Aesthetically quote the argument.
+      func_quote_for_eval "$arg"
+      func_append install_prog " $func_quote_for_eval_result"
+      if test -n "$arg2"; then
+	func_quote_for_eval "$arg2"
+      fi
+      func_append install_shared_prog " $func_quote_for_eval_result"
+    done
+
+    test -z "$install_prog" && \
+      func_fatal_help "you must specify an install program"
+
+    test -n "$prev" && \
+      func_fatal_help "the \`$prev' option requires an argument"
+
+    if test -n "$install_override_mode" && $no_mode; then
+      if $install_cp; then :; else
+	func_quote_for_eval "$install_override_mode"
+	func_append install_shared_prog " -m $func_quote_for_eval_result"
+      fi
+    fi
+
+    if test -z "$files"; then
+      if test -z "$dest"; then
+	func_fatal_help "no file or destination specified"
+      else
+	func_fatal_help "you must specify a destination"
+      fi
+    fi
+
+    # Strip any trailing slash from the destination.
+    func_stripname '' '/' "$dest"
+    dest=$func_stripname_result
+
+    # Check to see that the destination is a directory.
+    test -d "$dest" && isdir=yes
+    if test "$isdir" = yes; then
+      destdir="$dest"
+      destname=
+    else
+      func_dirname_and_basename "$dest" "" "."
+      destdir="$func_dirname_result"
+      destname="$func_basename_result"
+
+      # Not a directory, so check to see that there is only one file specified.
+      set dummy $files; shift
+      test "$#" -gt 1 && \
+	func_fatal_help "\`$dest' is not a directory"
+    fi
+    case $destdir in
+    [\\/]* | [A-Za-z]:[\\/]*) ;;
+    *)
+      for file in $files; do
+	case $file in
+	*.lo) ;;
+	*)
+	  func_fatal_help "\`$destdir' must be an absolute directory name"
+	  ;;
+	esac
+      done
+      ;;
+    esac
+
+    # This variable tells wrapper scripts just to set variables rather
+    # than running their programs.
+    libtool_install_magic="$magic"
+
+    staticlibs=
+    future_libdirs=
+    current_libdirs=
+    for file in $files; do
+
+      # Do each installation.
+      case $file in
+      *.$libext)
+	# Do the static libraries later.
+	func_append staticlibs " $file"
+	;;
+
+      *.la)
+	func_resolve_sysroot "$file"
+	file=$func_resolve_sysroot_result
+
+	# Check to see that this really is a libtool archive.
+	func_lalib_unsafe_p "$file" \
+	  || func_fatal_help "\`$file' is not a valid libtool archive"
+
+	library_names=
+	old_library=
+	relink_command=
+	func_source "$file"
+
+	# Add the libdir to current_libdirs if it is the destination.
+	if test "X$destdir" = "X$libdir"; then
+	  case "$current_libdirs " in
+	  *" $libdir "*) ;;
+	  *) func_append current_libdirs " $libdir" ;;
+	  esac
+	else
+	  # Note the libdir as a future libdir.
+	  case "$future_libdirs " in
+	  *" $libdir "*) ;;
+	  *) func_append future_libdirs " $libdir" ;;
+	  esac
+	fi
+
+	func_dirname "$file" "/" ""
+	dir="$func_dirname_result"
+	func_append dir "$objdir"
+
+	if test -n "$relink_command"; then
+	  # Determine the prefix the user has applied to our future dir.
+	  inst_prefix_dir=`$ECHO "$destdir" | $SED -e "s%$libdir\$%%"`
+
+	  # Don't allow the user to place us outside of our expected
+	  # location b/c this prevents finding dependent libraries that
+	  # are installed to the same prefix.
+	  # At present, this check doesn't affect windows .dll's that
+	  # are installed into $libdir/../bin (currently, that works fine)
+	  # but it's something to keep an eye on.
+	  test "$inst_prefix_dir" = "$destdir" && \
+	    func_fatal_error "error: cannot install \`$file' to a directory not ending in $libdir"
+
+	  if test -n "$inst_prefix_dir"; then
+	    # Stick the inst_prefix_dir data into the link command.
+	    relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%"`
+	  else
+	    relink_command=`$ECHO "$relink_command" | $SED "s%@inst_prefix_dir@%%"`
+	  fi
+
+	  func_warning "relinking \`$file'"
+	  func_show_eval "$relink_command" \
+	    'func_fatal_error "error: relink \`$file'\'' with the above command before installing it"'
+	fi
+
+	# See the names of the shared library.
+	set dummy $library_names; shift
+	if test -n "$1"; then
+	  realname="$1"
+	  shift
+
+	  srcname="$realname"
+	  test -n "$relink_command" && srcname="$realname"T
+
+	  # Install the shared library and build the symlinks.
+	  func_show_eval "$install_shared_prog $dir/$srcname $destdir/$realname" \
+	      'exit $?'
+	  tstripme="$stripme"
+	  case $host_os in
+	  cygwin* | mingw* | pw32* | cegcc*)
+	    case $realname in
+	    *.dll.a)
+	      tstripme=""
+	      ;;
+	    esac
+	    ;;
+	  esac
+	  if test -n "$tstripme" && test -n "$striplib"; then
+	    func_show_eval "$striplib $destdir/$realname" 'exit $?'
+	  fi
+
+	  if test "$#" -gt 0; then
+	    # Delete the old symlinks, and create new ones.
+	    # Try `ln -sf' first, because the `ln' binary might depend on
+	    # the symlink we replace!  Solaris /bin/ln does not understand -f,
+	    # so we also need to try rm && ln -s.
+	    for linkname
+	    do
+	      test "$linkname" != "$realname" \
+		&& func_show_eval "(cd $destdir && { $LN_S -f $realname $linkname || { $RM $linkname && $LN_S $realname $linkname; }; })"
+	    done
+	  fi
+
+	  # Do each command in the postinstall commands.
+	  lib="$destdir/$realname"
+	  func_execute_cmds "$postinstall_cmds" 'exit $?'
+	fi
+
+	# Install the pseudo-library for information purposes.
+	func_basename "$file"
+	name="$func_basename_result"
+	instname="$dir/$name"i
+	func_show_eval "$install_prog $instname $destdir/$name" 'exit $?'
+
+	# Maybe install the static library, too.
+	test -n "$old_library" && func_append staticlibs " $dir/$old_library"
+	;;
+
+      *.lo)
+	# Install (i.e. copy) a libtool object.
+
+	# Figure out destination file name, if it wasn't already specified.
+	if test -n "$destname"; then
+	  destfile="$destdir/$destname"
+	else
+	  func_basename "$file"
+	  destfile="$func_basename_result"
+	  destfile="$destdir/$destfile"
+	fi
+
+	# Deduce the name of the destination old-style object file.
+	case $destfile in
+	*.lo)
+	  func_lo2o "$destfile"
+	  staticdest=$func_lo2o_result
+	  ;;
+	*.$objext)
+	  staticdest="$destfile"
+	  destfile=
+	  ;;
+	*)
+	  func_fatal_help "cannot copy a libtool object to \`$destfile'"
+	  ;;
+	esac
+
+	# Install the libtool object if requested.
+	test -n "$destfile" && \
+	  func_show_eval "$install_prog $file $destfile" 'exit $?'
+
+	# Install the old object if enabled.
+	if test "$build_old_libs" = yes; then
+	  # Deduce the name of the old-style object file.
+	  func_lo2o "$file"
+	  staticobj=$func_lo2o_result
+	  func_show_eval "$install_prog \$staticobj \$staticdest" 'exit $?'
+	fi
+	exit $EXIT_SUCCESS
+	;;
+
+      *)
+	# Figure out destination file name, if it wasn't already specified.
+	if test -n "$destname"; then
+	  destfile="$destdir/$destname"
+	else
+	  func_basename "$file"
+	  destfile="$func_basename_result"
+	  destfile="$destdir/$destfile"
+	fi
+
+	# If the file is missing, and there is a .exe on the end, strip it
+	# because it is most likely a libtool script we actually want to
+	# install
+	stripped_ext=""
+	case $file in
+	  *.exe)
+	    if test ! -f "$file"; then
+	      func_stripname '' '.exe' "$file"
+	      file=$func_stripname_result
+	      stripped_ext=".exe"
+	    fi
+	    ;;
+	esac
+
+	# Do a test to see if this is really a libtool program.
+	case $host in
+	*cygwin* | *mingw*)
+	    if func_ltwrapper_executable_p "$file"; then
+	      func_ltwrapper_scriptname "$file"
+	      wrapper=$func_ltwrapper_scriptname_result
+	    else
+	      func_stripname '' '.exe' "$file"
+	      wrapper=$func_stripname_result
+	    fi
+	    ;;
+	*)
+	    wrapper=$file
+	    ;;
+	esac
+	if func_ltwrapper_script_p "$wrapper"; then
+	  notinst_deplibs=
+	  relink_command=
+
+	  func_source "$wrapper"
+
+	  # Check the variables that should have been set.
+	  test -z "$generated_by_libtool_version" && \
+	    func_fatal_error "invalid libtool wrapper script \`$wrapper'"
+
+	  finalize=yes
+	  for lib in $notinst_deplibs; do
+	    # Check to see that each library is installed.
+	    libdir=
+	    if test -f "$lib"; then
+	      func_source "$lib"
+	    fi
+	    libfile="$libdir/"`$ECHO "$lib" | $SED 's%^.*/%%g'` ### testsuite: skip nested quoting test
+	    if test -n "$libdir" && test ! -f "$libfile"; then
+	      func_warning "\`$lib' has not been installed in \`$libdir'"
+	      finalize=no
+	    fi
+	  done
+
+	  relink_command=
+	  func_source "$wrapper"
+
+	  outputname=
+	  if test "$fast_install" = no && test -n "$relink_command"; then
+	    $opt_dry_run || {
+	      if test "$finalize" = yes; then
+	        tmpdir=`func_mktempdir`
+		func_basename "$file$stripped_ext"
+		file="$func_basename_result"
+	        outputname="$tmpdir/$file"
+	        # Replace the output file specification.
+	        relink_command=`$ECHO "$relink_command" | $SED 's%@OUTPUT@%'"$outputname"'%g'`
+
+	        $opt_silent || {
+	          func_quote_for_expand "$relink_command"
+		  eval "func_echo $func_quote_for_expand_result"
+	        }
+	        if eval "$relink_command"; then :
+	          else
+		  func_error "error: relink \`$file' with the above command before installing it"
+		  $opt_dry_run || ${RM}r "$tmpdir"
+		  continue
+	        fi
+	        file="$outputname"
+	      else
+	        func_warning "cannot relink \`$file'"
+	      fi
+	    }
+	  else
+	    # Install the binary that we compiled earlier.
+	    file=`$ECHO "$file$stripped_ext" | $SED "s%\([^/]*\)$%$objdir/\1%"`
+	  fi
+	fi
+
+	# remove .exe since cygwin /usr/bin/install will append another
+	# one anyway
+	case $install_prog,$host in
+	*/usr/bin/install*,*cygwin*)
+	  case $file:$destfile in
+	  *.exe:*.exe)
+	    # this is ok
+	    ;;
+	  *.exe:*)
+	    destfile=$destfile.exe
+	    ;;
+	  *:*.exe)
+	    func_stripname '' '.exe' "$destfile"
+	    destfile=$func_stripname_result
+	    ;;
+	  esac
+	  ;;
+	esac
+	func_show_eval "$install_prog\$stripme \$file \$destfile" 'exit $?'
+	$opt_dry_run || if test -n "$outputname"; then
+	  ${RM}r "$tmpdir"
+	fi
+	;;
+      esac
+    done
+
+    for file in $staticlibs; do
+      func_basename "$file"
+      name="$func_basename_result"
+
+      # Set up the ranlib parameters.
+      oldlib="$destdir/$name"
+      func_to_tool_file "$oldlib" func_convert_file_msys_to_w32
+      tool_oldlib=$func_to_tool_file_result
+
+      func_show_eval "$install_prog \$file \$oldlib" 'exit $?'
+
+      if test -n "$stripme" && test -n "$old_striplib"; then
+	func_show_eval "$old_striplib $tool_oldlib" 'exit $?'
+      fi
+
+      # Do each command in the postinstall commands.
+      func_execute_cmds "$old_postinstall_cmds" 'exit $?'
+    done
+
+    test -n "$future_libdirs" && \
+      func_warning "remember to run \`$progname --finish$future_libdirs'"
+
+    if test -n "$current_libdirs"; then
+      # Maybe just do a dry run.
+      $opt_dry_run && current_libdirs=" -n$current_libdirs"
+      exec_cmd='$SHELL $progpath $preserve_args --finish$current_libdirs'
+    else
+      exit $EXIT_SUCCESS
+    fi
+}
+
+test "$opt_mode" = install && func_mode_install ${1+"$@"}
+
+
+# func_generate_dlsyms outputname originator pic_p
+# Extract symbols from dlprefiles and create ${outputname}S.o with
+# a dlpreopen symbol table.
+func_generate_dlsyms ()
+{
+    $opt_debug
+    my_outputname="$1"
+    my_originator="$2"
+    my_pic_p="${3-no}"
+    my_prefix=`$ECHO "$my_originator" | sed 's%[^a-zA-Z0-9]%_%g'`
+    my_dlsyms=
+
+    if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then
+      if test -n "$NM" && test -n "$global_symbol_pipe"; then
+	my_dlsyms="${my_outputname}S.c"
+      else
+	func_error "not configured to extract global symbols from dlpreopened files"
+      fi
+    fi
+
+    if test -n "$my_dlsyms"; then
+      case $my_dlsyms in
+      "") ;;
+      *.c)
+	# Discover the nlist of each of the dlfiles.
+	nlist="$output_objdir/${my_outputname}.nm"
+
+	func_show_eval "$RM $nlist ${nlist}S ${nlist}T"
+
+	# Parse the name list into a source file.
+	func_verbose "creating $output_objdir/$my_dlsyms"
+
+	$opt_dry_run || $ECHO > "$output_objdir/$my_dlsyms" "\
+/* $my_dlsyms - symbol resolution table for \`$my_outputname' dlsym emulation. */
+/* Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION */
+
+#ifdef __cplusplus
+extern \"C\" {
+#endif
+
+#if defined(__GNUC__) && (((__GNUC__ == 4) && (__GNUC_MINOR__ >= 4)) || (__GNUC__ > 4))
+#pragma GCC diagnostic ignored \"-Wstrict-prototypes\"
+#endif
+
+/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests.  */
+#if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE)
+/* DATA imports from DLLs on WIN32 con't be const, because runtime
+   relocations are performed -- see ld's documentation on pseudo-relocs.  */
+# define LT_DLSYM_CONST
+#elif defined(__osf__)
+/* This system does not cope well with relocations in const data.  */
+# define LT_DLSYM_CONST
+#else
+# define LT_DLSYM_CONST const
+#endif
+
+/* External symbol declarations for the compiler. */\
+"
+
+	if test "$dlself" = yes; then
+	  func_verbose "generating symbol list for \`$output'"
+
+	  $opt_dry_run || echo ': @PROGRAM@ ' > "$nlist"
+
+	  # Add our own program objects to the symbol list.
+	  progfiles=`$ECHO "$objs$old_deplibs" | $SP2NL | $SED "$lo2o" | $NL2SP`
+	  for progfile in $progfiles; do
+	    func_to_tool_file "$progfile" func_convert_file_msys_to_w32
+	    func_verbose "extracting global C symbols from \`$func_to_tool_file_result'"
+	    $opt_dry_run || eval "$NM $func_to_tool_file_result | $global_symbol_pipe >> '$nlist'"
+	  done
+
+	  if test -n "$exclude_expsyms"; then
+	    $opt_dry_run || {
+	      eval '$EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T'
+	      eval '$MV "$nlist"T "$nlist"'
+	    }
+	  fi
+
+	  if test -n "$export_symbols_regex"; then
+	    $opt_dry_run || {
+	      eval '$EGREP -e "$export_symbols_regex" "$nlist" > "$nlist"T'
+	      eval '$MV "$nlist"T "$nlist"'
+	    }
+	  fi
+
+	  # Prepare the list of exported symbols
+	  if test -z "$export_symbols"; then
+	    export_symbols="$output_objdir/$outputname.exp"
+	    $opt_dry_run || {
+	      $RM $export_symbols
+	      eval "${SED} -n -e '/^: @PROGRAM@ $/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"'
+	      case $host in
+	      *cygwin* | *mingw* | *cegcc* )
+                eval "echo EXPORTS "'> "$output_objdir/$outputname.def"'
+                eval 'cat "$export_symbols" >> "$output_objdir/$outputname.def"'
+	        ;;
+	      esac
+	    }
+	  else
+	    $opt_dry_run || {
+	      eval "${SED} -e 's/\([].[*^$]\)/\\\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$outputname.exp"'
+	      eval '$GREP -f "$output_objdir/$outputname.exp" < "$nlist" > "$nlist"T'
+	      eval '$MV "$nlist"T "$nlist"'
+	      case $host in
+	        *cygwin* | *mingw* | *cegcc* )
+	          eval "echo EXPORTS "'> "$output_objdir/$outputname.def"'
+	          eval 'cat "$nlist" >> "$output_objdir/$outputname.def"'
+	          ;;
+	      esac
+	    }
+	  fi
+	fi
+
+	for dlprefile in $dlprefiles; do
+	  func_verbose "extracting global C symbols from \`$dlprefile'"
+	  func_basename "$dlprefile"
+	  name="$func_basename_result"
+          case $host in
+	    *cygwin* | *mingw* | *cegcc* )
+	      # if an import library, we need to obtain dlname
+	      if func_win32_import_lib_p "$dlprefile"; then
+	        func_tr_sh "$dlprefile"
+	        eval "curr_lafile=\$libfile_$func_tr_sh_result"
+	        dlprefile_dlbasename=""
+	        if test -n "$curr_lafile" && func_lalib_p "$curr_lafile"; then
+	          # Use subshell, to avoid clobbering current variable values
+	          dlprefile_dlname=`source "$curr_lafile" && echo "$dlname"`
+	          if test -n "$dlprefile_dlname" ; then
+	            func_basename "$dlprefile_dlname"
+	            dlprefile_dlbasename="$func_basename_result"
+	          else
+	            # no lafile. user explicitly requested -dlpreopen <import library>.
+	            $sharedlib_from_linklib_cmd "$dlprefile"
+	            dlprefile_dlbasename=$sharedlib_from_linklib_result
+	          fi
+	        fi
+	        $opt_dry_run || {
+	          if test -n "$dlprefile_dlbasename" ; then
+	            eval '$ECHO ": $dlprefile_dlbasename" >> "$nlist"'
+	          else
+	            func_warning "Could not compute DLL name from $name"
+	            eval '$ECHO ": $name " >> "$nlist"'
+	          fi
+	          func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32
+	          eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe |
+	            $SED -e '/I __imp/d' -e 's/I __nm_/D /;s/_nm__//' >> '$nlist'"
+	        }
+	      else # not an import lib
+	        $opt_dry_run || {
+	          eval '$ECHO ": $name " >> "$nlist"'
+	          func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32
+	          eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'"
+	        }
+	      fi
+	    ;;
+	    *)
+	      $opt_dry_run || {
+	        eval '$ECHO ": $name " >> "$nlist"'
+	        func_to_tool_file "$dlprefile" func_convert_file_msys_to_w32
+	        eval "$NM \"$func_to_tool_file_result\" 2>/dev/null | $global_symbol_pipe >> '$nlist'"
+	      }
+	    ;;
+          esac
+	done
+
+	$opt_dry_run || {
+	  # Make sure we have at least an empty file.
+	  test -f "$nlist" || : > "$nlist"
+
+	  if test -n "$exclude_expsyms"; then
+	    $EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T
+	    $MV "$nlist"T "$nlist"
+	  fi
+
+	  # Try sorting and uniquifying the output.
+	  if $GREP -v "^: " < "$nlist" |
+	      if sort -k 3 </dev/null >/dev/null 2>&1; then
+		sort -k 3
+	      else
+		sort +2
+	      fi |
+	      uniq > "$nlist"S; then
+	    :
+	  else
+	    $GREP -v "^: " < "$nlist" > "$nlist"S
+	  fi
+
+	  if test -f "$nlist"S; then
+	    eval "$global_symbol_to_cdecl"' < "$nlist"S >> "$output_objdir/$my_dlsyms"'
+	  else
+	    echo '/* NONE */' >> "$output_objdir/$my_dlsyms"
+	  fi
+
+	  echo >> "$output_objdir/$my_dlsyms" "\
+
+/* The mapping between symbol names and symbols.  */
+typedef struct {
+  const char *name;
+  void *address;
+} lt_dlsymlist;
+extern LT_DLSYM_CONST lt_dlsymlist
+lt_${my_prefix}_LTX_preloaded_symbols[];
+LT_DLSYM_CONST lt_dlsymlist
+lt_${my_prefix}_LTX_preloaded_symbols[] =
+{\
+  { \"$my_originator\", (void *) 0 },"
+
+	  case $need_lib_prefix in
+	  no)
+	    eval "$global_symbol_to_c_name_address" < "$nlist" >> "$output_objdir/$my_dlsyms"
+	    ;;
+	  *)
+	    eval "$global_symbol_to_c_name_address_lib_prefix" < "$nlist" >> "$output_objdir/$my_dlsyms"
+	    ;;
+	  esac
+	  echo >> "$output_objdir/$my_dlsyms" "\
+  {0, (void *) 0}
+};
+
+/* This works around a problem in FreeBSD linker */
+#ifdef FREEBSD_WORKAROUND
+static const void *lt_preloaded_setup() {
+  return lt_${my_prefix}_LTX_preloaded_symbols;
+}
+#endif
+
+#ifdef __cplusplus
+}
+#endif\
+"
+	} # !$opt_dry_run
+
+	pic_flag_for_symtable=
+	case "$compile_command " in
+	*" -static "*) ;;
+	*)
+	  case $host in
+	  # compiling the symbol table file with pic_flag works around
+	  # a FreeBSD bug that causes programs to crash when -lm is
+	  # linked before any other PIC object.  But we must not use
+	  # pic_flag when linking with -static.  The problem exists in
+	  # FreeBSD 2.2.6 and is fixed in FreeBSD 3.1.
+	  *-*-freebsd2.*|*-*-freebsd3.0*|*-*-freebsdelf3.0*)
+	    pic_flag_for_symtable=" $pic_flag -DFREEBSD_WORKAROUND" ;;
+	  *-*-hpux*)
+	    pic_flag_for_symtable=" $pic_flag"  ;;
+	  *)
+	    if test "X$my_pic_p" != Xno; then
+	      pic_flag_for_symtable=" $pic_flag"
+	    fi
+	    ;;
+	  esac
+	  ;;
+	esac
+	symtab_cflags=
+	for arg in $LTCFLAGS; do
+	  case $arg in
+	  -pie | -fpie | -fPIE) ;;
+	  *) func_append symtab_cflags " $arg" ;;
+	  esac
+	done
+
+	# Now compile the dynamic symbol file.
+	func_show_eval '(cd $output_objdir && $LTCC$symtab_cflags -c$no_builtin_flag$pic_flag_for_symtable "$my_dlsyms")' 'exit $?'
+
+	# Clean up the generated files.
+	func_show_eval '$RM "$output_objdir/$my_dlsyms" "$nlist" "${nlist}S" "${nlist}T"'
+
+	# Transform the symbol file into the correct name.
+	symfileobj="$output_objdir/${my_outputname}S.$objext"
+	case $host in
+	*cygwin* | *mingw* | *cegcc* )
+	  if test -f "$output_objdir/$my_outputname.def"; then
+	    compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"`
+	    finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%"`
+	  else
+	    compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"`
+	    finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"`
+	  fi
+	  ;;
+	*)
+	  compile_command=`$ECHO "$compile_command" | $SED "s%@SYMFILE@%$symfileobj%"`
+	  finalize_command=`$ECHO "$finalize_command" | $SED "s%@SYMFILE@%$symfileobj%"`
+	  ;;
+	esac
+	;;
+      *)
+	func_fatal_error "unknown suffix for \`$my_dlsyms'"
+	;;
+      esac
+    else
+      # We keep going just in case the user didn't refer to
+      # lt_preloaded_symbols.  The linker will fail if global_symbol_pipe
+      # really was required.
+
+      # Nullify the symbol file.
+      compile_command=`$ECHO "$compile_command" | $SED "s% @SYMFILE@%%"`
+      finalize_command=`$ECHO "$finalize_command" | $SED "s% @SYMFILE@%%"`
+    fi
+}
+
+# func_win32_libid arg
+# return the library type of file 'arg'
+#
+# Need a lot of goo to handle *both* DLLs and import libs
+# Has to be a shell function in order to 'eat' the argument
+# that is supplied when $file_magic_command is called.
+# Despite the name, also deal with 64 bit binaries.
+func_win32_libid ()
+{
+  $opt_debug
+  win32_libid_type="unknown"
+  win32_fileres=`file -L $1 2>/dev/null`
+  case $win32_fileres in
+  *ar\ archive\ import\ library*) # definitely import
+    win32_libid_type="x86 archive import"
+    ;;
+  *ar\ archive*) # could be an import, or static
+    # Keep the egrep pattern in sync with the one in _LT_CHECK_MAGIC_METHOD.
+    if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null |
+       $EGREP 'file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' >/dev/null; then
+      func_to_tool_file "$1" func_convert_file_msys_to_w32
+      win32_nmres=`eval $NM -f posix -A \"$func_to_tool_file_result\" |
+	$SED -n -e '
+	    1,100{
+		/ I /{
+		    s,.*,import,
+		    p
+		    q
+		}
+	    }'`
+      case $win32_nmres in
+      import*)  win32_libid_type="x86 archive import";;
+      *)        win32_libid_type="x86 archive static";;
+      esac
+    fi
+    ;;
+  *DLL*)
+    win32_libid_type="x86 DLL"
+    ;;
+  *executable*) # but shell scripts are "executable" too...
+    case $win32_fileres in
+    *MS\ Windows\ PE\ Intel*)
+      win32_libid_type="x86 DLL"
+      ;;
+    esac
+    ;;
+  esac
+  $ECHO "$win32_libid_type"
+}
+
+# func_cygming_dll_for_implib ARG
+#
+# Platform-specific function to extract the
+# name of the DLL associated with the specified
+# import library ARG.
+# Invoked by eval'ing the libtool variable
+#    $sharedlib_from_linklib_cmd
+# Result is available in the variable
+#    $sharedlib_from_linklib_result
+func_cygming_dll_for_implib ()
+{
+  $opt_debug
+  sharedlib_from_linklib_result=`$DLLTOOL --identify-strict --identify "$1"`
+}
+
+# func_cygming_dll_for_implib_fallback_core SECTION_NAME LIBNAMEs
+#
+# The is the core of a fallback implementation of a
+# platform-specific function to extract the name of the
+# DLL associated with the specified import library LIBNAME.
+#
+# SECTION_NAME is either .idata$6 or .idata$7, depending
+# on the platform and compiler that created the implib.
+#
+# Echos the name of the DLL associated with the
+# specified import library.
+func_cygming_dll_for_implib_fallback_core ()
+{
+  $opt_debug
+  match_literal=`$ECHO "$1" | $SED "$sed_make_literal_regex"`
+  $OBJDUMP -s --section "$1" "$2" 2>/dev/null |
+    $SED '/^Contents of section '"$match_literal"':/{
+      # Place marker at beginning of archive member dllname section
+      s/.*/====MARK====/
+      p
+      d
+    }
+    # These lines can sometimes be longer than 43 characters, but
+    # are always uninteresting
+    /:[	 ]*file format pe[i]\{,1\}-/d
+    /^In archive [^:]*:/d
+    # Ensure marker is printed
+    /^====MARK====/p
+    # Remove all lines with less than 43 characters
+    /^.\{43\}/!d
+    # From remaining lines, remove first 43 characters
+    s/^.\{43\}//' |
+    $SED -n '
+      # Join marker and all lines until next marker into a single line
+      /^====MARK====/ b para
+      H
+      $ b para
+      b
+      :para
+      x
+      s/\n//g
+      # Remove the marker
+      s/^====MARK====//
+      # Remove trailing dots and whitespace
+      s/[\. \t]*$//
+      # Print
+      /./p' |
+    # we now have a list, one entry per line, of the stringified
+    # contents of the appropriate section of all members of the
+    # archive which possess that section. Heuristic: eliminate
+    # all those which have a first or second character that is
+    # a '.' (that is, objdump's representation of an unprintable
+    # character.) This should work for all archives with less than
+    # 0x302f exports -- but will fail for DLLs whose name actually
+    # begins with a literal '.' or a single character followed by
+    # a '.'.
+    #
+    # Of those that remain, print the first one.
+    $SED -e '/^\./d;/^.\./d;q'
+}
+
+# func_cygming_gnu_implib_p ARG
+# This predicate returns with zero status (TRUE) if
+# ARG is a GNU/binutils-style import library. Returns
+# with nonzero status (FALSE) otherwise.
+func_cygming_gnu_implib_p ()
+{
+  $opt_debug
+  func_to_tool_file "$1" func_convert_file_msys_to_w32
+  func_cygming_gnu_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $EGREP ' (_head_[A-Za-z0-9_]+_[ad]l*|[A-Za-z0-9_]+_[ad]l*_iname)$'`
+  test -n "$func_cygming_gnu_implib_tmp"
+}
+
+# func_cygming_ms_implib_p ARG
+# This predicate returns with zero status (TRUE) if
+# ARG is an MS-style import library. Returns
+# with nonzero status (FALSE) otherwise.
+func_cygming_ms_implib_p ()
+{
+  $opt_debug
+  func_to_tool_file "$1" func_convert_file_msys_to_w32
+  func_cygming_ms_implib_tmp=`$NM "$func_to_tool_file_result" | eval "$global_symbol_pipe" | $GREP '_NULL_IMPORT_DESCRIPTOR'`
+  test -n "$func_cygming_ms_implib_tmp"
+}
+
+# func_cygming_dll_for_implib_fallback ARG
+# Platform-specific function to extract the
+# name of the DLL associated with the specified
+# import library ARG.
+#
+# This fallback implementation is for use when $DLLTOOL
+# does not support the --identify-strict option.
+# Invoked by eval'ing the libtool variable
+#    $sharedlib_from_linklib_cmd
+# Result is available in the variable
+#    $sharedlib_from_linklib_result
+func_cygming_dll_for_implib_fallback ()
+{
+  $opt_debug
+  if func_cygming_gnu_implib_p "$1" ; then
+    # binutils import library
+    sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$7' "$1"`
+  elif func_cygming_ms_implib_p "$1" ; then
+    # ms-generated import library
+    sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$6' "$1"`
+  else
+    # unknown
+    sharedlib_from_linklib_result=""
+  fi
+}
+
+
+# func_extract_an_archive dir oldlib
+func_extract_an_archive ()
+{
+    $opt_debug
+    f_ex_an_ar_dir="$1"; shift
+    f_ex_an_ar_oldlib="$1"
+    if test "$lock_old_archive_extraction" = yes; then
+      lockfile=$f_ex_an_ar_oldlib.lock
+      until $opt_dry_run || ln "$progpath" "$lockfile" 2>/dev/null; do
+	func_echo "Waiting for $lockfile to be removed"
+	sleep 2
+      done
+    fi
+    func_show_eval "(cd \$f_ex_an_ar_dir && $AR x \"\$f_ex_an_ar_oldlib\")" \
+		   'stat=$?; rm -f "$lockfile"; exit $stat'
+    if test "$lock_old_archive_extraction" = yes; then
+      $opt_dry_run || rm -f "$lockfile"
+    fi
+    if ($AR t "$f_ex_an_ar_oldlib" | sort | sort -uc >/dev/null 2>&1); then
+     :
+    else
+      func_fatal_error "object name conflicts in archive: $f_ex_an_ar_dir/$f_ex_an_ar_oldlib"
+    fi
+}
+
+
+# func_extract_archives gentop oldlib ...
+func_extract_archives ()
+{
+    $opt_debug
+    my_gentop="$1"; shift
+    my_oldlibs=${1+"$@"}
+    my_oldobjs=""
+    my_xlib=""
+    my_xabs=""
+    my_xdir=""
+
+    for my_xlib in $my_oldlibs; do
+      # Extract the objects.
+      case $my_xlib in
+	[\\/]* | [A-Za-z]:[\\/]*) my_xabs="$my_xlib" ;;
+	*) my_xabs=`pwd`"/$my_xlib" ;;
+      esac
+      func_basename "$my_xlib"
+      my_xlib="$func_basename_result"
+      my_xlib_u=$my_xlib
+      while :; do
+        case " $extracted_archives " in
+	*" $my_xlib_u "*)
+	  func_arith $extracted_serial + 1
+	  extracted_serial=$func_arith_result
+	  my_xlib_u=lt$extracted_serial-$my_xlib ;;
+	*) break ;;
+	esac
+      done
+      extracted_archives="$extracted_archives $my_xlib_u"
+      my_xdir="$my_gentop/$my_xlib_u"
+
+      func_mkdir_p "$my_xdir"
+
+      case $host in
+      *-darwin*)
+	func_verbose "Extracting $my_xabs"
+	# Do not bother doing anything if just a dry run
+	$opt_dry_run || {
+	  darwin_orig_dir=`pwd`
+	  cd $my_xdir || exit $?
+	  darwin_archive=$my_xabs
+	  darwin_curdir=`pwd`
+	  darwin_base_archive=`basename "$darwin_archive"`
+	  darwin_arches=`$LIPO -info "$darwin_archive" 2>/dev/null | $GREP Architectures 2>/dev/null || true`
+	  if test -n "$darwin_arches"; then
+	    darwin_arches=`$ECHO "$darwin_arches" | $SED -e 's/.*are://'`
+	    darwin_arch=
+	    func_verbose "$darwin_base_archive has multiple architectures $darwin_arches"
+	    for darwin_arch in  $darwin_arches ; do
+	      func_mkdir_p "unfat-$$/${darwin_base_archive}-${darwin_arch}"
+	      $LIPO -thin $darwin_arch -output "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}" "${darwin_archive}"
+	      cd "unfat-$$/${darwin_base_archive}-${darwin_arch}"
+	      func_extract_an_archive "`pwd`" "${darwin_base_archive}"
+	      cd "$darwin_curdir"
+	      $RM "unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}"
+	    done # $darwin_arches
+            ## Okay now we've a bunch of thin objects, gotta fatten them up :)
+	    darwin_filelist=`find unfat-$$ -type f -name \*.o -print -o -name \*.lo -print | $SED -e "$basename" | sort -u`
+	    darwin_file=
+	    darwin_files=
+	    for darwin_file in $darwin_filelist; do
+	      darwin_files=`find unfat-$$ -name $darwin_file -print | sort | $NL2SP`
+	      $LIPO -create -output "$darwin_file" $darwin_files
+	    done # $darwin_filelist
+	    $RM -rf unfat-$$
+	    cd "$darwin_orig_dir"
+	  else
+	    cd $darwin_orig_dir
+	    func_extract_an_archive "$my_xdir" "$my_xabs"
+	  fi # $darwin_arches
+	} # !$opt_dry_run
+	;;
+      *)
+        func_extract_an_archive "$my_xdir" "$my_xabs"
+	;;
+      esac
+      my_oldobjs="$my_oldobjs "`find $my_xdir -name \*.$objext -print -o -name \*.lo -print | sort | $NL2SP`
+    done
+
+    func_extract_archives_result="$my_oldobjs"
+}
+
+
+# func_emit_wrapper [arg=no]
+#
+# Emit a libtool wrapper script on stdout.
+# Don't directly open a file because we may want to
+# incorporate the script contents within a cygwin/mingw
+# wrapper executable.  Must ONLY be called from within
+# func_mode_link because it depends on a number of variables
+# set therein.
+#
+# ARG is the value that the WRAPPER_SCRIPT_BELONGS_IN_OBJDIR
+# variable will take.  If 'yes', then the emitted script
+# will assume that the directory in which it is stored is
+# the $objdir directory.  This is a cygwin/mingw-specific
+# behavior.
+func_emit_wrapper ()
+{
+	func_emit_wrapper_arg1=${1-no}
+
+	$ECHO "\
+#! $SHELL
+
+# $output - temporary wrapper script for $objdir/$outputname
+# Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION
+#
+# The $output program cannot be directly executed until all the libtool
+# libraries that it depends on are installed.
+#
+# This wrapper script should never be moved out of the build directory.
+# If it is, it will not operate correctly.
+
+# Sed substitution that helps us do robust quoting.  It backslashifies
+# metacharacters that are still active within double-quoted strings.
+sed_quote_subst='$sed_quote_subst'
+
+# Be Bourne compatible
+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
+BIN_SH=xpg4; export BIN_SH # for Tru64
+DUALCASE=1; export DUALCASE # for MKS sh
+
+# The HP-UX ksh and POSIX shell print the target directory to stdout
+# if CDPATH is set.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+relink_command=\"$relink_command\"
+
+# This environment variable determines our operation mode.
+if test \"\$libtool_install_magic\" = \"$magic\"; then
+  # install mode needs the following variables:
+  generated_by_libtool_version='$macro_version'
+  notinst_deplibs='$notinst_deplibs'
+else
+  # When we are sourced in execute mode, \$file and \$ECHO are already set.
+  if test \"\$libtool_execute_magic\" != \"$magic\"; then
+    file=\"\$0\""
+
+    qECHO=`$ECHO "$ECHO" | $SED "$sed_quote_subst"`
+    $ECHO "\
+
+# A function that is used when there is no print builtin or printf.
+func_fallback_echo ()
+{
+  eval 'cat <<_LTECHO_EOF
+\$1
+_LTECHO_EOF'
+}
+    ECHO=\"$qECHO\"
+  fi
+
+# Very basic option parsing. These options are (a) specific to
+# the libtool wrapper, (b) are identical between the wrapper
+# /script/ and the wrapper /executable/ which is used only on
+# windows platforms, and (c) all begin with the string "--lt-"
+# (application programs are unlikely to have options which match
+# this pattern).
+#
+# There are only two supported options: --lt-debug and
+# --lt-dump-script. There is, deliberately, no --lt-help.
+#
+# The first argument to this parsing function should be the
+# script's $0 value, followed by "$@".
+lt_option_debug=
+func_parse_lt_options ()
+{
+  lt_script_arg0=\$0
+  shift
+  for lt_opt
+  do
+    case \"\$lt_opt\" in
+    --lt-debug) lt_option_debug=1 ;;
+    --lt-dump-script)
+        lt_dump_D=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%/[^/]*$%%'\`
+        test \"X\$lt_dump_D\" = \"X\$lt_script_arg0\" && lt_dump_D=.
+        lt_dump_F=\`\$ECHO \"X\$lt_script_arg0\" | $SED -e 's/^X//' -e 's%^.*/%%'\`
+        cat \"\$lt_dump_D/\$lt_dump_F\"
+        exit 0
+      ;;
+    --lt-*)
+        \$ECHO \"Unrecognized --lt- option: '\$lt_opt'\" 1>&2
+        exit 1
+      ;;
+    esac
+  done
+
+  # Print the debug banner immediately:
+  if test -n \"\$lt_option_debug\"; then
+    echo \"${outputname}:${output}:\${LINENO}: libtool wrapper (GNU $PACKAGE$TIMESTAMP) $VERSION\" 1>&2
+  fi
+}
+
+# Used when --lt-debug. Prints its arguments to stdout
+# (redirection is the responsibility of the caller)
+func_lt_dump_args ()
+{
+  lt_dump_args_N=1;
+  for lt_arg
+  do
+    \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[\$lt_dump_args_N]: \$lt_arg\"
+    lt_dump_args_N=\`expr \$lt_dump_args_N + 1\`
+  done
+}
+
+# Core function for launching the target application
+func_exec_program_core ()
+{
+"
+  case $host in
+  # Backslashes separate directories on plain windows
+  *-*-mingw | *-*-os2* | *-cegcc*)
+    $ECHO "\
+      if test -n \"\$lt_option_debug\"; then
+        \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[0]: \$progdir\\\\\$program\" 1>&2
+        func_lt_dump_args \${1+\"\$@\"} 1>&2
+      fi
+      exec \"\$progdir\\\\\$program\" \${1+\"\$@\"}
+"
+    ;;
+
+  *)
+    $ECHO "\
+      if test -n \"\$lt_option_debug\"; then
+        \$ECHO \"${outputname}:${output}:\${LINENO}: newargv[0]: \$progdir/\$program\" 1>&2
+        func_lt_dump_args \${1+\"\$@\"} 1>&2
+      fi
+      exec \"\$progdir/\$program\" \${1+\"\$@\"}
+"
+    ;;
+  esac
+  $ECHO "\
+      \$ECHO \"\$0: cannot exec \$program \$*\" 1>&2
+      exit 1
+}
+
+# A function to encapsulate launching the target application
+# Strips options in the --lt-* namespace from \$@ and
+# launches target application with the remaining arguments.
+func_exec_program ()
+{
+  case \" \$* \" in
+  *\\ --lt-*)
+    for lt_wr_arg
+    do
+      case \$lt_wr_arg in
+      --lt-*) ;;
+      *) set x \"\$@\" \"\$lt_wr_arg\"; shift;;
+      esac
+      shift
+    done ;;
+  esac
+  func_exec_program_core \${1+\"\$@\"}
+}
+
+  # Parse options
+  func_parse_lt_options \"\$0\" \${1+\"\$@\"}
+
+  # Find the directory that this script lives in.
+  thisdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*$%%'\`
+  test \"x\$thisdir\" = \"x\$file\" && thisdir=.
+
+  # Follow symbolic links until we get to the real thisdir.
+  file=\`ls -ld \"\$file\" | $SED -n 's/.*-> //p'\`
+  while test -n \"\$file\"; do
+    destdir=\`\$ECHO \"\$file\" | $SED 's%/[^/]*\$%%'\`
+
+    # If there was a directory component, then change thisdir.
+    if test \"x\$destdir\" != \"x\$file\"; then
+      case \"\$destdir\" in
+      [\\\\/]* | [A-Za-z]:[\\\\/]*) thisdir=\"\$destdir\" ;;
+      *) thisdir=\"\$thisdir/\$destdir\" ;;
+      esac
+    fi
+
+    file=\`\$ECHO \"\$file\" | $SED 's%^.*/%%'\`
+    file=\`ls -ld \"\$thisdir/\$file\" | $SED -n 's/.*-> //p'\`
+  done
+
+  # Usually 'no', except on cygwin/mingw when embedded into
+  # the cwrapper.
+  WRAPPER_SCRIPT_BELONGS_IN_OBJDIR=$func_emit_wrapper_arg1
+  if test \"\$WRAPPER_SCRIPT_BELONGS_IN_OBJDIR\" = \"yes\"; then
+    # special case for '.'
+    if test \"\$thisdir\" = \".\"; then
+      thisdir=\`pwd\`
+    fi
+    # remove .libs from thisdir
+    case \"\$thisdir\" in
+    *[\\\\/]$objdir ) thisdir=\`\$ECHO \"\$thisdir\" | $SED 's%[\\\\/][^\\\\/]*$%%'\` ;;
+    $objdir )   thisdir=. ;;
+    esac
+  fi
+
+  # Try to get the absolute directory name.
+  absdir=\`cd \"\$thisdir\" && pwd\`
+  test -n \"\$absdir\" && thisdir=\"\$absdir\"
+"
+
+	if test "$fast_install" = yes; then
+	  $ECHO "\
+  program=lt-'$outputname'$exeext
+  progdir=\"\$thisdir/$objdir\"
+
+  if test ! -f \"\$progdir/\$program\" ||
+     { file=\`ls -1dt \"\$progdir/\$program\" \"\$progdir/../\$program\" 2>/dev/null | ${SED} 1q\`; \\
+       test \"X\$file\" != \"X\$progdir/\$program\"; }; then
+
+    file=\"\$\$-\$program\"
+
+    if test ! -d \"\$progdir\"; then
+      $MKDIR \"\$progdir\"
+    else
+      $RM \"\$progdir/\$file\"
+    fi"
+
+	  $ECHO "\
+
+    # relink executable if necessary
+    if test -n \"\$relink_command\"; then
+      if relink_command_output=\`eval \$relink_command 2>&1\`; then :
+      else
+	$ECHO \"\$relink_command_output\" >&2
+	$RM \"\$progdir/\$file\"
+	exit 1
+      fi
+    fi
+
+    $MV \"\$progdir/\$file\" \"\$progdir/\$program\" 2>/dev/null ||
+    { $RM \"\$progdir/\$program\";
+      $MV \"\$progdir/\$file\" \"\$progdir/\$program\"; }
+    $RM \"\$progdir/\$file\"
+  fi"
+	else
+	  $ECHO "\
+  program='$outputname'
+  progdir=\"\$thisdir/$objdir\"
+"
+	fi
+
+	$ECHO "\
+
+  if test -f \"\$progdir/\$program\"; then"
+
+	# fixup the dll searchpath if we need to.
+	#
+	# Fix the DLL searchpath if we need to.  Do this before prepending
+	# to shlibpath, because on Windows, both are PATH and uninstalled
+	# libraries must come first.
+	if test -n "$dllsearchpath"; then
+	  $ECHO "\
+    # Add the dll search path components to the executable PATH
+    PATH=$dllsearchpath:\$PATH
+"
+	fi
+
+	# Export our shlibpath_var if we have one.
+	if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then
+	  $ECHO "\
+    # Add our own library path to $shlibpath_var
+    $shlibpath_var=\"$temp_rpath\$$shlibpath_var\"
+
+    # Some systems cannot cope with colon-terminated $shlibpath_var
+    # The second colon is a workaround for a bug in BeOS R4 sed
+    $shlibpath_var=\`\$ECHO \"\$$shlibpath_var\" | $SED 's/::*\$//'\`
+
+    export $shlibpath_var
+"
+	fi
+
+	$ECHO "\
+    if test \"\$libtool_execute_magic\" != \"$magic\"; then
+      # Run the actual program with our arguments.
+      func_exec_program \${1+\"\$@\"}
+    fi
+  else
+    # The program doesn't exist.
+    \$ECHO \"\$0: error: \\\`\$progdir/\$program' does not exist\" 1>&2
+    \$ECHO \"This script is just a wrapper for \$program.\" 1>&2
+    \$ECHO \"See the $PACKAGE documentation for more information.\" 1>&2
+    exit 1
+  fi
+fi\
+"
+}
+
+
+# func_emit_cwrapperexe_src
+# emit the source code for a wrapper executable on stdout
+# Must ONLY be called from within func_mode_link because
+# it depends on a number of variable set therein.
+func_emit_cwrapperexe_src ()
+{
+	cat <<EOF
+
+/* $cwrappersource - temporary wrapper executable for $objdir/$outputname
+   Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION
+
+   The $output program cannot be directly executed until all the libtool
+   libraries that it depends on are installed.
+
+   This wrapper executable should never be moved out of the build directory.
+   If it is, it will not operate correctly.
+*/
+EOF
+	    cat <<"EOF"
+#ifdef _MSC_VER
+# define _CRT_SECURE_NO_DEPRECATE 1
+#endif
+#include <stdio.h>
+#include <stdlib.h>
+#ifdef _MSC_VER
+# include <direct.h>
+# include <process.h>
+# include <io.h>
+#else
+# include <unistd.h>
+# include <stdint.h>
+# ifdef __CYGWIN__
+#  include <io.h>
+# endif
+#endif
+#include <malloc.h>
+#include <stdarg.h>
+#include <assert.h>
+#include <string.h>
+#include <ctype.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <sys/stat.h>
+
+/* declarations of non-ANSI functions */
+#if defined(__MINGW32__)
+# ifdef __STRICT_ANSI__
+int _putenv (const char *);
+# endif
+#elif defined(__CYGWIN__)
+# ifdef __STRICT_ANSI__
+char *realpath (const char *, char *);
+int putenv (char *);
+int setenv (const char *, const char *, int);
+# endif
+/* #elif defined (other platforms) ... */
+#endif
+
+/* portability defines, excluding path handling macros */
+#if defined(_MSC_VER)
+# define setmode _setmode
+# define stat    _stat
+# define chmod   _chmod
+# define getcwd  _getcwd
+# define putenv  _putenv
+# define S_IXUSR _S_IEXEC
+# ifndef _INTPTR_T_DEFINED
+#  define _INTPTR_T_DEFINED
+#  define intptr_t int
+# endif
+#elif defined(__MINGW32__)
+# define setmode _setmode
+# define stat    _stat
+# define chmod   _chmod
+# define getcwd  _getcwd
+# define putenv  _putenv
+#elif defined(__CYGWIN__)
+# define HAVE_SETENV
+# define FOPEN_WB "wb"
+/* #elif defined (other platforms) ... */
+#endif
+
+#if defined(PATH_MAX)
+# define LT_PATHMAX PATH_MAX
+#elif defined(MAXPATHLEN)
+# define LT_PATHMAX MAXPATHLEN
+#else
+# define LT_PATHMAX 1024
+#endif
+
+#ifndef S_IXOTH
+# define S_IXOTH 0
+#endif
+#ifndef S_IXGRP
+# define S_IXGRP 0
+#endif
+
+/* path handling portability macros */
+#ifndef DIR_SEPARATOR
+# define DIR_SEPARATOR '/'
+# define PATH_SEPARATOR ':'
+#endif
+
+#if defined (_WIN32) || defined (__MSDOS__) || defined (__DJGPP__) || \
+  defined (__OS2__)
+# define HAVE_DOS_BASED_FILE_SYSTEM
+# define FOPEN_WB "wb"
+# ifndef DIR_SEPARATOR_2
+#  define DIR_SEPARATOR_2 '\\'
+# endif
+# ifndef PATH_SEPARATOR_2
+#  define PATH_SEPARATOR_2 ';'
+# endif
+#endif
+
+#ifndef DIR_SEPARATOR_2
+# define IS_DIR_SEPARATOR(ch) ((ch) == DIR_SEPARATOR)
+#else /* DIR_SEPARATOR_2 */
+# define IS_DIR_SEPARATOR(ch) \
+	(((ch) == DIR_SEPARATOR) || ((ch) == DIR_SEPARATOR_2))
+#endif /* DIR_SEPARATOR_2 */
+
+#ifndef PATH_SEPARATOR_2
+# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR)
+#else /* PATH_SEPARATOR_2 */
+# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR_2)
+#endif /* PATH_SEPARATOR_2 */
+
+#ifndef FOPEN_WB
+# define FOPEN_WB "w"
+#endif
+#ifndef _O_BINARY
+# define _O_BINARY 0
+#endif
+
+#define XMALLOC(type, num)      ((type *) xmalloc ((num) * sizeof(type)))
+#define XFREE(stale) do { \
+  if (stale) { free ((void *) stale); stale = 0; } \
+} while (0)
+
+#if defined(LT_DEBUGWRAPPER)
+static int lt_debug = 1;
+#else
+static int lt_debug = 0;
+#endif
+
+const char *program_name = "libtool-wrapper"; /* in case xstrdup fails */
+
+void *xmalloc (size_t num);
+char *xstrdup (const char *string);
+const char *base_name (const char *name);
+char *find_executable (const char *wrapper);
+char *chase_symlinks (const char *pathspec);
+int make_executable (const char *path);
+int check_executable (const char *path);
+char *strendzap (char *str, const char *pat);
+void lt_debugprintf (const char *file, int line, const char *fmt, ...);
+void lt_fatal (const char *file, int line, const char *message, ...);
+static const char *nonnull (const char *s);
+static const char *nonempty (const char *s);
+void lt_setenv (const char *name, const char *value);
+char *lt_extend_str (const char *orig_value, const char *add, int to_end);
+void lt_update_exe_path (const char *name, const char *value);
+void lt_update_lib_path (const char *name, const char *value);
+char **prepare_spawn (char **argv);
+void lt_dump_script (FILE *f);
+EOF
+
+	    cat <<EOF
+volatile const char * MAGIC_EXE = "$magic_exe";
+const char * LIB_PATH_VARNAME = "$shlibpath_var";
+EOF
+
+	    if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then
+              func_to_host_path "$temp_rpath"
+	      cat <<EOF
+const char * LIB_PATH_VALUE   = "$func_to_host_path_result";
+EOF
+	    else
+	      cat <<"EOF"
+const char * LIB_PATH_VALUE   = "";
+EOF
+	    fi
+
+	    if test -n "$dllsearchpath"; then
+              func_to_host_path "$dllsearchpath:"
+	      cat <<EOF
+const char * EXE_PATH_VARNAME = "PATH";
+const char * EXE_PATH_VALUE   = "$func_to_host_path_result";
+EOF
+	    else
+	      cat <<"EOF"
+const char * EXE_PATH_VARNAME = "";
+const char * EXE_PATH_VALUE   = "";
+EOF
+	    fi
+
+	    if test "$fast_install" = yes; then
+	      cat <<EOF
+const char * TARGET_PROGRAM_NAME = "lt-$outputname"; /* hopefully, no .exe */
+EOF
+	    else
+	      cat <<EOF
+const char * TARGET_PROGRAM_NAME = "$outputname"; /* hopefully, no .exe */
+EOF
+	    fi
+
+
+	    cat <<"EOF"
+
+#define LTWRAPPER_OPTION_PREFIX         "--lt-"
+
+static const char *ltwrapper_option_prefix = LTWRAPPER_OPTION_PREFIX;
+static const char *dumpscript_opt       = LTWRAPPER_OPTION_PREFIX "dump-script";
+static const char *debug_opt            = LTWRAPPER_OPTION_PREFIX "debug";
+
+int
+main (int argc, char *argv[])
+{
+  char **newargz;
+  int  newargc;
+  char *tmp_pathspec;
+  char *actual_cwrapper_path;
+  char *actual_cwrapper_name;
+  char *target_name;
+  char *lt_argv_zero;
+  intptr_t rval = 127;
+
+  int i;
+
+  program_name = (char *) xstrdup (base_name (argv[0]));
+  newargz = XMALLOC (char *, argc + 1);
+
+  /* very simple arg parsing; don't want to rely on getopt
+   * also, copy all non cwrapper options to newargz, except
+   * argz[0], which is handled differently
+   */
+  newargc=0;
+  for (i = 1; i < argc; i++)
+    {
+      if (strcmp (argv[i], dumpscript_opt) == 0)
+	{
+EOF
+	    case "$host" in
+	      *mingw* | *cygwin* )
+		# make stdout use "unix" line endings
+		echo "          setmode(1,_O_BINARY);"
+		;;
+	      esac
+
+	    cat <<"EOF"
+	  lt_dump_script (stdout);
+	  return 0;
+	}
+      if (strcmp (argv[i], debug_opt) == 0)
+	{
+          lt_debug = 1;
+          continue;
+	}
+      if (strcmp (argv[i], ltwrapper_option_prefix) == 0)
+        {
+          /* however, if there is an option in the LTWRAPPER_OPTION_PREFIX
+             namespace, but it is not one of the ones we know about and
+             have already dealt with, above (inluding dump-script), then
+             report an error. Otherwise, targets might begin to believe
+             they are allowed to use options in the LTWRAPPER_OPTION_PREFIX
+             namespace. The first time any user complains about this, we'll
+             need to make LTWRAPPER_OPTION_PREFIX a configure-time option
+             or a configure.ac-settable value.
+           */
+          lt_fatal (__FILE__, __LINE__,
+		    "unrecognized %s option: '%s'",
+                    ltwrapper_option_prefix, argv[i]);
+        }
+      /* otherwise ... */
+      newargz[++newargc] = xstrdup (argv[i]);
+    }
+  newargz[++newargc] = NULL;
+
+EOF
+	    cat <<EOF
+  /* The GNU banner must be the first non-error debug message */
+  lt_debugprintf (__FILE__, __LINE__, "libtool wrapper (GNU $PACKAGE$TIMESTAMP) $VERSION\n");
+EOF
+	    cat <<"EOF"
+  lt_debugprintf (__FILE__, __LINE__, "(main) argv[0]: %s\n", argv[0]);
+  lt_debugprintf (__FILE__, __LINE__, "(main) program_name: %s\n", program_name);
+
+  tmp_pathspec = find_executable (argv[0]);
+  if (tmp_pathspec == NULL)
+    lt_fatal (__FILE__, __LINE__, "couldn't find %s", argv[0]);
+  lt_debugprintf (__FILE__, __LINE__,
+                  "(main) found exe (before symlink chase) at: %s\n",
+		  tmp_pathspec);
+
+  actual_cwrapper_path = chase_symlinks (tmp_pathspec);
+  lt_debugprintf (__FILE__, __LINE__,
+                  "(main) found exe (after symlink chase) at: %s\n",
+		  actual_cwrapper_path);
+  XFREE (tmp_pathspec);
+
+  actual_cwrapper_name = xstrdup (base_name (actual_cwrapper_path));
+  strendzap (actual_cwrapper_path, actual_cwrapper_name);
+
+  /* wrapper name transforms */
+  strendzap (actual_cwrapper_name, ".exe");
+  tmp_pathspec = lt_extend_str (actual_cwrapper_name, ".exe", 1);
+  XFREE (actual_cwrapper_name);
+  actual_cwrapper_name = tmp_pathspec;
+  tmp_pathspec = 0;
+
+  /* target_name transforms -- use actual target program name; might have lt- prefix */
+  target_name = xstrdup (base_name (TARGET_PROGRAM_NAME));
+  strendzap (target_name, ".exe");
+  tmp_pathspec = lt_extend_str (target_name, ".exe", 1);
+  XFREE (target_name);
+  target_name = tmp_pathspec;
+  tmp_pathspec = 0;
+
+  lt_debugprintf (__FILE__, __LINE__,
+		  "(main) libtool target name: %s\n",
+		  target_name);
+EOF
+
+	    cat <<EOF
+  newargz[0] =
+    XMALLOC (char, (strlen (actual_cwrapper_path) +
+		    strlen ("$objdir") + 1 + strlen (actual_cwrapper_name) + 1));
+  strcpy (newargz[0], actual_cwrapper_path);
+  strcat (newargz[0], "$objdir");
+  strcat (newargz[0], "/");
+EOF
+
+	    cat <<"EOF"
+  /* stop here, and copy so we don't have to do this twice */
+  tmp_pathspec = xstrdup (newargz[0]);
+
+  /* do NOT want the lt- prefix here, so use actual_cwrapper_name */
+  strcat (newargz[0], actual_cwrapper_name);
+
+  /* DO want the lt- prefix here if it exists, so use target_name */
+  lt_argv_zero = lt_extend_str (tmp_pathspec, target_name, 1);
+  XFREE (tmp_pathspec);
+  tmp_pathspec = NULL;
+EOF
+
+	    case $host_os in
+	      mingw*)
+	    cat <<"EOF"
+  {
+    char* p;
+    while ((p = strchr (newargz[0], '\\')) != NULL)
+      {
+	*p = '/';
+      }
+    while ((p = strchr (lt_argv_zero, '\\')) != NULL)
+      {
+	*p = '/';
+      }
+  }
+EOF
+	    ;;
+	    esac
+
+	    cat <<"EOF"
+  XFREE (target_name);
+  XFREE (actual_cwrapper_path);
+  XFREE (actual_cwrapper_name);
+
+  lt_setenv ("BIN_SH", "xpg4"); /* for Tru64 */
+  lt_setenv ("DUALCASE", "1");  /* for MSK sh */
+  /* Update the DLL searchpath.  EXE_PATH_VALUE ($dllsearchpath) must
+     be prepended before (that is, appear after) LIB_PATH_VALUE ($temp_rpath)
+     because on Windows, both *_VARNAMEs are PATH but uninstalled
+     libraries must come first. */
+  lt_update_exe_path (EXE_PATH_VARNAME, EXE_PATH_VALUE);
+  lt_update_lib_path (LIB_PATH_VARNAME, LIB_PATH_VALUE);
+
+  lt_debugprintf (__FILE__, __LINE__, "(main) lt_argv_zero: %s\n",
+		  nonnull (lt_argv_zero));
+  for (i = 0; i < newargc; i++)
+    {
+      lt_debugprintf (__FILE__, __LINE__, "(main) newargz[%d]: %s\n",
+		      i, nonnull (newargz[i]));
+    }
+
+EOF
+
+	    case $host_os in
+	      mingw*)
+		cat <<"EOF"
+  /* execv doesn't actually work on mingw as expected on unix */
+  newargz = prepare_spawn (newargz);
+  rval = _spawnv (_P_WAIT, lt_argv_zero, (const char * const *) newargz);
+  if (rval == -1)
+    {
+      /* failed to start process */
+      lt_debugprintf (__FILE__, __LINE__,
+		      "(main) failed to launch target \"%s\": %s\n",
+		      lt_argv_zero, nonnull (strerror (errno)));
+      return 127;
+    }
+  return rval;
+EOF
+		;;
+	      *)
+		cat <<"EOF"
+  execv (lt_argv_zero, newargz);
+  return rval; /* =127, but avoids unused variable warning */
+EOF
+		;;
+	    esac
+
+	    cat <<"EOF"
+}
+
+void *
+xmalloc (size_t num)
+{
+  void *p = (void *) malloc (num);
+  if (!p)
+    lt_fatal (__FILE__, __LINE__, "memory exhausted");
+
+  return p;
+}
+
+char *
+xstrdup (const char *string)
+{
+  return string ? strcpy ((char *) xmalloc (strlen (string) + 1),
+			  string) : NULL;
+}
+
+const char *
+base_name (const char *name)
+{
+  const char *base;
+
+#if defined (HAVE_DOS_BASED_FILE_SYSTEM)
+  /* Skip over the disk name in MSDOS pathnames. */
+  if (isalpha ((unsigned char) name[0]) && name[1] == ':')
+    name += 2;
+#endif
+
+  for (base = name; *name; name++)
+    if (IS_DIR_SEPARATOR (*name))
+      base = name + 1;
+  return base;
+}
+
+int
+check_executable (const char *path)
+{
+  struct stat st;
+
+  lt_debugprintf (__FILE__, __LINE__, "(check_executable): %s\n",
+                  nonempty (path));
+  if ((!path) || (!*path))
+    return 0;
+
+  if ((stat (path, &st) >= 0)
+      && (st.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH)))
+    return 1;
+  else
+    return 0;
+}
+
+int
+make_executable (const char *path)
+{
+  int rval = 0;
+  struct stat st;
+
+  lt_debugprintf (__FILE__, __LINE__, "(make_executable): %s\n",
+                  nonempty (path));
+  if ((!path) || (!*path))
+    return 0;
+
+  if (stat (path, &st) >= 0)
+    {
+      rval = chmod (path, st.st_mode | S_IXOTH | S_IXGRP | S_IXUSR);
+    }
+  return rval;
+}
+
+/* Searches for the full path of the wrapper.  Returns
+   newly allocated full path name if found, NULL otherwise
+   Does not chase symlinks, even on platforms that support them.
+*/
+char *
+find_executable (const char *wrapper)
+{
+  int has_slash = 0;
+  const char *p;
+  const char *p_next;
+  /* static buffer for getcwd */
+  char tmp[LT_PATHMAX + 1];
+  int tmp_len;
+  char *concat_name;
+
+  lt_debugprintf (__FILE__, __LINE__, "(find_executable): %s\n",
+                  nonempty (wrapper));
+
+  if ((wrapper == NULL) || (*wrapper == '\0'))
+    return NULL;
+
+  /* Absolute path? */
+#if defined (HAVE_DOS_BASED_FILE_SYSTEM)
+  if (isalpha ((unsigned char) wrapper[0]) && wrapper[1] == ':')
+    {
+      concat_name = xstrdup (wrapper);
+      if (check_executable (concat_name))
+	return concat_name;
+      XFREE (concat_name);
+    }
+  else
+    {
+#endif
+      if (IS_DIR_SEPARATOR (wrapper[0]))
+	{
+	  concat_name = xstrdup (wrapper);
+	  if (check_executable (concat_name))
+	    return concat_name;
+	  XFREE (concat_name);
+	}
+#if defined (HAVE_DOS_BASED_FILE_SYSTEM)
+    }
+#endif
+
+  for (p = wrapper; *p; p++)
+    if (*p == '/')
+      {
+	has_slash = 1;
+	break;
+      }
+  if (!has_slash)
+    {
+      /* no slashes; search PATH */
+      const char *path = getenv ("PATH");
+      if (path != NULL)
+	{
+	  for (p = path; *p; p = p_next)
+	    {
+	      const char *q;
+	      size_t p_len;
+	      for (q = p; *q; q++)
+		if (IS_PATH_SEPARATOR (*q))
+		  break;
+	      p_len = q - p;
+	      p_next = (*q == '\0' ? q : q + 1);
+	      if (p_len == 0)
+		{
+		  /* empty path: current directory */
+		  if (getcwd (tmp, LT_PATHMAX) == NULL)
+		    lt_fatal (__FILE__, __LINE__, "getcwd failed: %s",
+                              nonnull (strerror (errno)));
+		  tmp_len = strlen (tmp);
+		  concat_name =
+		    XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1);
+		  memcpy (concat_name, tmp, tmp_len);
+		  concat_name[tmp_len] = '/';
+		  strcpy (concat_name + tmp_len + 1, wrapper);
+		}
+	      else
+		{
+		  concat_name =
+		    XMALLOC (char, p_len + 1 + strlen (wrapper) + 1);
+		  memcpy (concat_name, p, p_len);
+		  concat_name[p_len] = '/';
+		  strcpy (concat_name + p_len + 1, wrapper);
+		}
+	      if (check_executable (concat_name))
+		return concat_name;
+	      XFREE (concat_name);
+	    }
+	}
+      /* not found in PATH; assume curdir */
+    }
+  /* Relative path | not found in path: prepend cwd */
+  if (getcwd (tmp, LT_PATHMAX) == NULL)
+    lt_fatal (__FILE__, __LINE__, "getcwd failed: %s",
+              nonnull (strerror (errno)));
+  tmp_len = strlen (tmp);
+  concat_name = XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1);
+  memcpy (concat_name, tmp, tmp_len);
+  concat_name[tmp_len] = '/';
+  strcpy (concat_name + tmp_len + 1, wrapper);
+
+  if (check_executable (concat_name))
+    return concat_name;
+  XFREE (concat_name);
+  return NULL;
+}
+
+char *
+chase_symlinks (const char *pathspec)
+{
+#ifndef S_ISLNK
+  return xstrdup (pathspec);
+#else
+  char buf[LT_PATHMAX];
+  struct stat s;
+  char *tmp_pathspec = xstrdup (pathspec);
+  char *p;
+  int has_symlinks = 0;
+  while (strlen (tmp_pathspec) && !has_symlinks)
+    {
+      lt_debugprintf (__FILE__, __LINE__,
+		      "checking path component for symlinks: %s\n",
+		      tmp_pathspec);
+      if (lstat (tmp_pathspec, &s) == 0)
+	{
+	  if (S_ISLNK (s.st_mode) != 0)
+	    {
+	      has_symlinks = 1;
+	      break;
+	    }
+
+	  /* search backwards for last DIR_SEPARATOR */
+	  p = tmp_pathspec + strlen (tmp_pathspec) - 1;
+	  while ((p > tmp_pathspec) && (!IS_DIR_SEPARATOR (*p)))
+	    p--;
+	  if ((p == tmp_pathspec) && (!IS_DIR_SEPARATOR (*p)))
+	    {
+	      /* no more DIR_SEPARATORS left */
+	      break;
+	    }
+	  *p = '\0';
+	}
+      else
+	{
+	  lt_fatal (__FILE__, __LINE__,
+		    "error accessing file \"%s\": %s",
+		    tmp_pathspec, nonnull (strerror (errno)));
+	}
+    }
+  XFREE (tmp_pathspec);
+
+  if (!has_symlinks)
+    {
+      return xstrdup (pathspec);
+    }
+
+  tmp_pathspec = realpath (pathspec, buf);
+  if (tmp_pathspec == 0)
+    {
+      lt_fatal (__FILE__, __LINE__,
+		"could not follow symlinks for %s", pathspec);
+    }
+  return xstrdup (tmp_pathspec);
+#endif
+}
+
+char *
+strendzap (char *str, const char *pat)
+{
+  size_t len, patlen;
+
+  assert (str != NULL);
+  assert (pat != NULL);
+
+  len = strlen (str);
+  patlen = strlen (pat);
+
+  if (patlen <= len)
+    {
+      str += len - patlen;
+      if (strcmp (str, pat) == 0)
+	*str = '\0';
+    }
+  return str;
+}
+
+void
+lt_debugprintf (const char *file, int line, const char *fmt, ...)
+{
+  va_list args;
+  if (lt_debug)
+    {
+      (void) fprintf (stderr, "%s:%s:%d: ", program_name, file, line);
+      va_start (args, fmt);
+      (void) vfprintf (stderr, fmt, args);
+      va_end (args);
+    }
+}
+
+static void
+lt_error_core (int exit_status, const char *file,
+	       int line, const char *mode,
+	       const char *message, va_list ap)
+{
+  fprintf (stderr, "%s:%s:%d: %s: ", program_name, file, line, mode);
+  vfprintf (stderr, message, ap);
+  fprintf (stderr, ".\n");
+
+  if (exit_status >= 0)
+    exit (exit_status);
+}
+
+void
+lt_fatal (const char *file, int line, const char *message, ...)
+{
+  va_list ap;
+  va_start (ap, message);
+  lt_error_core (EXIT_FAILURE, file, line, "FATAL", message, ap);
+  va_end (ap);
+}
+
+static const char *
+nonnull (const char *s)
+{
+  return s ? s : "(null)";
+}
+
+static const char *
+nonempty (const char *s)
+{
+  return (s && !*s) ? "(empty)" : nonnull (s);
+}
+
+void
+lt_setenv (const char *name, const char *value)
+{
+  lt_debugprintf (__FILE__, __LINE__,
+		  "(lt_setenv) setting '%s' to '%s'\n",
+                  nonnull (name), nonnull (value));
+  {
+#ifdef HAVE_SETENV
+    /* always make a copy, for consistency with !HAVE_SETENV */
+    char *str = xstrdup (value);
+    setenv (name, str, 1);
+#else
+    int len = strlen (name) + 1 + strlen (value) + 1;
+    char *str = XMALLOC (char, len);
+    sprintf (str, "%s=%s", name, value);
+    if (putenv (str) != EXIT_SUCCESS)
+      {
+        XFREE (str);
+      }
+#endif
+  }
+}
+
+char *
+lt_extend_str (const char *orig_value, const char *add, int to_end)
+{
+  char *new_value;
+  if (orig_value && *orig_value)
+    {
+      int orig_value_len = strlen (orig_value);
+      int add_len = strlen (add);
+      new_value = XMALLOC (char, add_len + orig_value_len + 1);
+      if (to_end)
+        {
+          strcpy (new_value, orig_value);
+          strcpy (new_value + orig_value_len, add);
+        }
+      else
+        {
+          strcpy (new_value, add);
+          strcpy (new_value + add_len, orig_value);
+        }
+    }
+  else
+    {
+      new_value = xstrdup (add);
+    }
+  return new_value;
+}
+
+void
+lt_update_exe_path (const char *name, const char *value)
+{
+  lt_debugprintf (__FILE__, __LINE__,
+		  "(lt_update_exe_path) modifying '%s' by prepending '%s'\n",
+                  nonnull (name), nonnull (value));
+
+  if (name && *name && value && *value)
+    {
+      char *new_value = lt_extend_str (getenv (name), value, 0);
+      /* some systems can't cope with a ':'-terminated path #' */
+      int len = strlen (new_value);
+      while (((len = strlen (new_value)) > 0) && IS_PATH_SEPARATOR (new_value[len-1]))
+        {
+          new_value[len-1] = '\0';
+        }
+      lt_setenv (name, new_value);
+      XFREE (new_value);
+    }
+}
+
+void
+lt_update_lib_path (const char *name, const char *value)
+{
+  lt_debugprintf (__FILE__, __LINE__,
+		  "(lt_update_lib_path) modifying '%s' by prepending '%s'\n",
+                  nonnull (name), nonnull (value));
+
+  if (name && *name && value && *value)
+    {
+      char *new_value = lt_extend_str (getenv (name), value, 0);
+      lt_setenv (name, new_value);
+      XFREE (new_value);
+    }
+}
+
+EOF
+	    case $host_os in
+	      mingw*)
+		cat <<"EOF"
+
+/* Prepares an argument vector before calling spawn().
+   Note that spawn() does not by itself call the command interpreter
+     (getenv ("COMSPEC") != NULL ? getenv ("COMSPEC") :
+      ({ OSVERSIONINFO v; v.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
+         GetVersionEx(&v);
+         v.dwPlatformId == VER_PLATFORM_WIN32_NT;
+      }) ? "cmd.exe" : "command.com").
+   Instead it simply concatenates the arguments, separated by ' ', and calls
+   CreateProcess().  We must quote the arguments since Win32 CreateProcess()
+   interprets characters like ' ', '\t', '\\', '"' (but not '<' and '>') in a
+   special way:
+   - Space and tab are interpreted as delimiters. They are not treated as
+     delimiters if they are surrounded by double quotes: "...".
+   - Unescaped double quotes are removed from the input. Their only effect is
+     that within double quotes, space and tab are treated like normal
+     characters.
+   - Backslashes not followed by double quotes are not special.
+   - But 2*n+1 backslashes followed by a double quote become
+     n backslashes followed by a double quote (n >= 0):
+       \" -> "
+       \\\" -> \"
+       \\\\\" -> \\"
+ */
+#define SHELL_SPECIAL_CHARS "\"\\ \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037"
+#define SHELL_SPACE_CHARS " \001\002\003\004\005\006\007\010\011\012\013\014\015\016\017\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037"
+char **
+prepare_spawn (char **argv)
+{
+  size_t argc;
+  char **new_argv;
+  size_t i;
+
+  /* Count number of arguments.  */
+  for (argc = 0; argv[argc] != NULL; argc++)
+    ;
+
+  /* Allocate new argument vector.  */
+  new_argv = XMALLOC (char *, argc + 1);
+
+  /* Put quoted arguments into the new argument vector.  */
+  for (i = 0; i < argc; i++)
+    {
+      const char *string = argv[i];
+
+      if (string[0] == '\0')
+	new_argv[i] = xstrdup ("\"\"");
+      else if (strpbrk (string, SHELL_SPECIAL_CHARS) != NULL)
+	{
+	  int quote_around = (strpbrk (string, SHELL_SPACE_CHARS) != NULL);
+	  size_t length;
+	  unsigned int backslashes;
+	  const char *s;
+	  char *quoted_string;
+	  char *p;
+
+	  length = 0;
+	  backslashes = 0;
+	  if (quote_around)
+	    length++;
+	  for (s = string; *s != '\0'; s++)
+	    {
+	      char c = *s;
+	      if (c == '"')
+		length += backslashes + 1;
+	      length++;
+	      if (c == '\\')
+		backslashes++;
+	      else
+		backslashes = 0;
+	    }
+	  if (quote_around)
+	    length += backslashes + 1;
+
+	  quoted_string = XMALLOC (char, length + 1);
+
+	  p = quoted_string;
+	  backslashes = 0;
+	  if (quote_around)
+	    *p++ = '"';
+	  for (s = string; *s != '\0'; s++)
+	    {
+	      char c = *s;
+	      if (c == '"')
+		{
+		  unsigned int j;
+		  for (j = backslashes + 1; j > 0; j--)
+		    *p++ = '\\';
+		}
+	      *p++ = c;
+	      if (c == '\\')
+		backslashes++;
+	      else
+		backslashes = 0;
+	    }
+	  if (quote_around)
+	    {
+	      unsigned int j;
+	      for (j = backslashes; j > 0; j--)
+		*p++ = '\\';
+	      *p++ = '"';
+	    }
+	  *p = '\0';
+
+	  new_argv[i] = quoted_string;
+	}
+      else
+	new_argv[i] = (char *) string;
+    }
+  new_argv[argc] = NULL;
+
+  return new_argv;
+}
+EOF
+		;;
+	    esac
+
+            cat <<"EOF"
+void lt_dump_script (FILE* f)
+{
+EOF
+	    func_emit_wrapper yes |
+	      $SED -n -e '
+s/^\(.\{79\}\)\(..*\)/\1\
+\2/
+h
+s/\([\\"]\)/\\\1/g
+s/$/\\n/
+s/\([^\n]*\).*/  fputs ("\1", f);/p
+g
+D'
+            cat <<"EOF"
+}
+EOF
+}
+# end: func_emit_cwrapperexe_src
+
+# func_win32_import_lib_p ARG
+# True if ARG is an import lib, as indicated by $file_magic_cmd
+func_win32_import_lib_p ()
+{
+    $opt_debug
+    case `eval $file_magic_cmd \"\$1\" 2>/dev/null | $SED -e 10q` in
+    *import*) : ;;
+    *) false ;;
+    esac
+}
+
+# func_mode_link arg...
+func_mode_link ()
+{
+    $opt_debug
+    case $host in
+    *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*)
+      # It is impossible to link a dll without this setting, and
+      # we shouldn't force the makefile maintainer to figure out
+      # which system we are compiling for in order to pass an extra
+      # flag for every libtool invocation.
+      # allow_undefined=no
+
+      # FIXME: Unfortunately, there are problems with the above when trying
+      # to make a dll which has undefined symbols, in which case not
+      # even a static library is built.  For now, we need to specify
+      # -no-undefined on the libtool link line when we can be certain
+      # that all symbols are satisfied, otherwise we get a static library.
+      allow_undefined=yes
+      ;;
+    *)
+      allow_undefined=yes
+      ;;
+    esac
+    libtool_args=$nonopt
+    base_compile="$nonopt $@"
+    compile_command=$nonopt
+    finalize_command=$nonopt
+
+    compile_rpath=
+    finalize_rpath=
+    compile_shlibpath=
+    finalize_shlibpath=
+    convenience=
+    old_convenience=
+    deplibs=
+    old_deplibs=
+    compiler_flags=
+    linker_flags=
+    dllsearchpath=
+    lib_search_path=`pwd`
+    inst_prefix_dir=
+    new_inherited_linker_flags=
+
+    avoid_version=no
+    bindir=
+    dlfiles=
+    dlprefiles=
+    dlself=no
+    export_dynamic=no
+    export_symbols=
+    export_symbols_regex=
+    generated=
+    libobjs=
+    ltlibs=
+    module=no
+    no_install=no
+    objs=
+    non_pic_objects=
+    precious_files_regex=
+    prefer_static_libs=no
+    preload=no
+    prev=
+    prevarg=
+    release=
+    rpath=
+    xrpath=
+    perm_rpath=
+    temp_rpath=
+    thread_safe=no
+    vinfo=
+    vinfo_number=no
+    weak_libs=
+    single_module="${wl}-single_module"
+    func_infer_tag $base_compile
+
+    # We need to know -static, to get the right output filenames.
+    for arg
+    do
+      case $arg in
+      -shared)
+	test "$build_libtool_libs" != yes && \
+	  func_fatal_configuration "can not build a shared library"
+	build_old_libs=no
+	break
+	;;
+      -all-static | -static | -static-libtool-libs)
+	case $arg in
+	-all-static)
+	  if test "$build_libtool_libs" = yes && test -z "$link_static_flag"; then
+	    func_warning "complete static linking is impossible in this configuration"
+	  fi
+	  if test -n "$link_static_flag"; then
+	    dlopen_self=$dlopen_self_static
+	  fi
+	  prefer_static_libs=yes
+	  ;;
+	-static)
+	  if test -z "$pic_flag" && test -n "$link_static_flag"; then
+	    dlopen_self=$dlopen_self_static
+	  fi
+	  prefer_static_libs=built
+	  ;;
+	-static-libtool-libs)
+	  if test -z "$pic_flag" && test -n "$link_static_flag"; then
+	    dlopen_self=$dlopen_self_static
+	  fi
+	  prefer_static_libs=yes
+	  ;;
+	esac
+	build_libtool_libs=no
+	build_old_libs=yes
+	break
+	;;
+      esac
+    done
+
+    # See if our shared archives depend on static archives.
+    test -n "$old_archive_from_new_cmds" && build_old_libs=yes
+
+    # Go through the arguments, transforming them on the way.
+    while test "$#" -gt 0; do
+      arg="$1"
+      shift
+      func_quote_for_eval "$arg"
+      qarg=$func_quote_for_eval_unquoted_result
+      func_append libtool_args " $func_quote_for_eval_result"
+
+      # If the previous option needs an argument, assign it.
+      if test -n "$prev"; then
+	case $prev in
+	output)
+	  func_append compile_command " @OUTPUT@"
+	  func_append finalize_command " @OUTPUT@"
+	  ;;
+	esac
+
+	case $prev in
+	bindir)
+	  bindir="$arg"
+	  prev=
+	  continue
+	  ;;
+	dlfiles|dlprefiles)
+	  if test "$preload" = no; then
+	    # Add the symbol object into the linking commands.
+	    func_append compile_command " @SYMFILE@"
+	    func_append finalize_command " @SYMFILE@"
+	    preload=yes
+	  fi
+	  case $arg in
+	  *.la | *.lo) ;;  # We handle these cases below.
+	  force)
+	    if test "$dlself" = no; then
+	      dlself=needless
+	      export_dynamic=yes
+	    fi
+	    prev=
+	    continue
+	    ;;
+	  self)
+	    if test "$prev" = dlprefiles; then
+	      dlself=yes
+	    elif test "$prev" = dlfiles && test "$dlopen_self" != yes; then
+	      dlself=yes
+	    else
+	      dlself=needless
+	      export_dynamic=yes
+	    fi
+	    prev=
+	    continue
+	    ;;
+	  *)
+	    if test "$prev" = dlfiles; then
+	      func_append dlfiles " $arg"
+	    else
+	      func_append dlprefiles " $arg"
+	    fi
+	    prev=
+	    continue
+	    ;;
+	  esac
+	  ;;
+	expsyms)
+	  export_symbols="$arg"
+	  test -f "$arg" \
+	    || func_fatal_error "symbol file \`$arg' does not exist"
+	  prev=
+	  continue
+	  ;;
+	expsyms_regex)
+	  export_symbols_regex="$arg"
+	  prev=
+	  continue
+	  ;;
+	framework)
+	  case $host in
+	    *-*-darwin*)
+	      case "$deplibs " in
+		*" $qarg.ltframework "*) ;;
+		*) func_append deplibs " $qarg.ltframework" # this is fixed later
+		   ;;
+	      esac
+	      ;;
+	  esac
+	  prev=
+	  continue
+	  ;;
+	inst_prefix)
+	  inst_prefix_dir="$arg"
+	  prev=
+	  continue
+	  ;;
+	objectlist)
+	  if test -f "$arg"; then
+	    save_arg=$arg
+	    moreargs=
+	    for fil in `cat "$save_arg"`
+	    do
+#	      func_append moreargs " $fil"
+	      arg=$fil
+	      # A libtool-controlled object.
+
+	      # Check to see that this really is a libtool object.
+	      if func_lalib_unsafe_p "$arg"; then
+		pic_object=
+		non_pic_object=
+
+		# Read the .lo file
+		func_source "$arg"
+
+		if test -z "$pic_object" ||
+		   test -z "$non_pic_object" ||
+		   test "$pic_object" = none &&
+		   test "$non_pic_object" = none; then
+		  func_fatal_error "cannot find name of object for \`$arg'"
+		fi
+
+		# Extract subdirectory from the argument.
+		func_dirname "$arg" "/" ""
+		xdir="$func_dirname_result"
+
+		if test "$pic_object" != none; then
+		  # Prepend the subdirectory the object is found in.
+		  pic_object="$xdir$pic_object"
+
+		  if test "$prev" = dlfiles; then
+		    if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then
+		      func_append dlfiles " $pic_object"
+		      prev=
+		      continue
+		    else
+		      # If libtool objects are unsupported, then we need to preload.
+		      prev=dlprefiles
+		    fi
+		  fi
+
+		  # CHECK ME:  I think I busted this.  -Ossama
+		  if test "$prev" = dlprefiles; then
+		    # Preload the old-style object.
+		    func_append dlprefiles " $pic_object"
+		    prev=
+		  fi
+
+		  # A PIC object.
+		  func_append libobjs " $pic_object"
+		  arg="$pic_object"
+		fi
+
+		# Non-PIC object.
+		if test "$non_pic_object" != none; then
+		  # Prepend the subdirectory the object is found in.
+		  non_pic_object="$xdir$non_pic_object"
+
+		  # A standard non-PIC object
+		  func_append non_pic_objects " $non_pic_object"
+		  if test -z "$pic_object" || test "$pic_object" = none ; then
+		    arg="$non_pic_object"
+		  fi
+		else
+		  # If the PIC object exists, use it instead.
+		  # $xdir was prepended to $pic_object above.
+		  non_pic_object="$pic_object"
+		  func_append non_pic_objects " $non_pic_object"
+		fi
+	      else
+		# Only an error if not doing a dry-run.
+		if $opt_dry_run; then
+		  # Extract subdirectory from the argument.
+		  func_dirname "$arg" "/" ""
+		  xdir="$func_dirname_result"
+
+		  func_lo2o "$arg"
+		  pic_object=$xdir$objdir/$func_lo2o_result
+		  non_pic_object=$xdir$func_lo2o_result
+		  func_append libobjs " $pic_object"
+		  func_append non_pic_objects " $non_pic_object"
+	        else
+		  func_fatal_error "\`$arg' is not a valid libtool object"
+		fi
+	      fi
+	    done
+	  else
+	    func_fatal_error "link input file \`$arg' does not exist"
+	  fi
+	  arg=$save_arg
+	  prev=
+	  continue
+	  ;;
+	precious_regex)
+	  precious_files_regex="$arg"
+	  prev=
+	  continue
+	  ;;
+	release)
+	  release="-$arg"
+	  prev=
+	  continue
+	  ;;
+	rpath | xrpath)
+	  # We need an absolute path.
+	  case $arg in
+	  [\\/]* | [A-Za-z]:[\\/]*) ;;
+	  *)
+	    func_fatal_error "only absolute run-paths are allowed"
+	    ;;
+	  esac
+	  if test "$prev" = rpath; then
+	    case "$rpath " in
+	    *" $arg "*) ;;
+	    *) func_append rpath " $arg" ;;
+	    esac
+	  else
+	    case "$xrpath " in
+	    *" $arg "*) ;;
+	    *) func_append xrpath " $arg" ;;
+	    esac
+	  fi
+	  prev=
+	  continue
+	  ;;
+	shrext)
+	  shrext_cmds="$arg"
+	  prev=
+	  continue
+	  ;;
+	weak)
+	  func_append weak_libs " $arg"
+	  prev=
+	  continue
+	  ;;
+	xcclinker)
+	  func_append linker_flags " $qarg"
+	  func_append compiler_flags " $qarg"
+	  prev=
+	  func_append compile_command " $qarg"
+	  func_append finalize_command " $qarg"
+	  continue
+	  ;;
+	xcompiler)
+	  func_append compiler_flags " $qarg"
+	  prev=
+	  func_append compile_command " $qarg"
+	  func_append finalize_command " $qarg"
+	  continue
+	  ;;
+	xlinker)
+	  func_append linker_flags " $qarg"
+	  func_append compiler_flags " $wl$qarg"
+	  prev=
+	  func_append compile_command " $wl$qarg"
+	  func_append finalize_command " $wl$qarg"
+	  continue
+	  ;;
+	*)
+	  eval "$prev=\"\$arg\""
+	  prev=
+	  continue
+	  ;;
+	esac
+      fi # test -n "$prev"
+
+      prevarg="$arg"
+
+      case $arg in
+      -all-static)
+	if test -n "$link_static_flag"; then
+	  # See comment for -static flag below, for more details.
+	  func_append compile_command " $link_static_flag"
+	  func_append finalize_command " $link_static_flag"
+	fi
+	continue
+	;;
+
+      -allow-undefined)
+	# FIXME: remove this flag sometime in the future.
+	func_fatal_error "\`-allow-undefined' must not be used because it is the default"
+	;;
+
+      -avoid-version)
+	avoid_version=yes
+	continue
+	;;
+
+      -bindir)
+	prev=bindir
+	continue
+	;;
+
+      -dlopen)
+	prev=dlfiles
+	continue
+	;;
+
+      -dlpreopen)
+	prev=dlprefiles
+	continue
+	;;
+
+      -export-dynamic)
+	export_dynamic=yes
+	continue
+	;;
+
+      -export-symbols | -export-symbols-regex)
+	if test -n "$export_symbols" || test -n "$export_symbols_regex"; then
+	  func_fatal_error "more than one -exported-symbols argument is not allowed"
+	fi
+	if test "X$arg" = "X-export-symbols"; then
+	  prev=expsyms
+	else
+	  prev=expsyms_regex
+	fi
+	continue
+	;;
+
+      -framework)
+	prev=framework
+	continue
+	;;
+
+      -inst-prefix-dir)
+	prev=inst_prefix
+	continue
+	;;
+
+      # The native IRIX linker understands -LANG:*, -LIST:* and -LNO:*
+      # so, if we see these flags be careful not to treat them like -L
+      -L[A-Z][A-Z]*:*)
+	case $with_gcc/$host in
+	no/*-*-irix* | /*-*-irix*)
+	  func_append compile_command " $arg"
+	  func_append finalize_command " $arg"
+	  ;;
+	esac
+	continue
+	;;
+
+      -L*)
+	func_stripname "-L" '' "$arg"
+	if test -z "$func_stripname_result"; then
+	  if test "$#" -gt 0; then
+	    func_fatal_error "require no space between \`-L' and \`$1'"
+	  else
+	    func_fatal_error "need path for \`-L' option"
+	  fi
+	fi
+	func_resolve_sysroot "$func_stripname_result"
+	dir=$func_resolve_sysroot_result
+	# We need an absolute path.
+	case $dir in
+	[\\/]* | [A-Za-z]:[\\/]*) ;;
+	*)
+	  absdir=`cd "$dir" && pwd`
+	  test -z "$absdir" && \
+	    func_fatal_error "cannot determine absolute directory name of \`$dir'"
+	  dir="$absdir"
+	  ;;
+	esac
+	case "$deplibs " in
+	*" -L$dir "* | *" $arg "*)
+	  # Will only happen for absolute or sysroot arguments
+	  ;;
+	*)
+	  # Preserve sysroot, but never include relative directories
+	  case $dir in
+	    [\\/]* | [A-Za-z]:[\\/]* | =*) func_append deplibs " $arg" ;;
+	    *) func_append deplibs " -L$dir" ;;
+	  esac
+	  func_append lib_search_path " $dir"
+	  ;;
+	esac
+	case $host in
+	*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*)
+	  testbindir=`$ECHO "$dir" | $SED 's*/lib$*/bin*'`
+	  case :$dllsearchpath: in
+	  *":$dir:"*) ;;
+	  ::) dllsearchpath=$dir;;
+	  *) func_append dllsearchpath ":$dir";;
+	  esac
+	  case :$dllsearchpath: in
+	  *":$testbindir:"*) ;;
+	  ::) dllsearchpath=$testbindir;;
+	  *) func_append dllsearchpath ":$testbindir";;
+	  esac
+	  ;;
+	esac
+	continue
+	;;
+
+      -l*)
+	if test "X$arg" = "X-lc" || test "X$arg" = "X-lm"; then
+	  case $host in
+	  *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-beos* | *-cegcc* | *-*-haiku*)
+	    # These systems don't actually have a C or math library (as such)
+	    continue
+	    ;;
+	  *-*-os2*)
+	    # These systems don't actually have a C library (as such)
+	    test "X$arg" = "X-lc" && continue
+	    ;;
+	  *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*)
+	    # Do not include libc due to us having libc/libc_r.
+	    test "X$arg" = "X-lc" && continue
+	    ;;
+	  *-*-rhapsody* | *-*-darwin1.[012])
+	    # Rhapsody C and math libraries are in the System framework
+	    func_append deplibs " System.ltframework"
+	    continue
+	    ;;
+	  *-*-sco3.2v5* | *-*-sco5v6*)
+	    # Causes problems with __ctype
+	    test "X$arg" = "X-lc" && continue
+	    ;;
+	  *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*)
+	    # Compiler inserts libc in the correct place for threads to work
+	    test "X$arg" = "X-lc" && continue
+	    ;;
+	  esac
+	elif test "X$arg" = "X-lc_r"; then
+	 case $host in
+	 *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*)
+	   # Do not include libc_r directly, use -pthread flag.
+	   continue
+	   ;;
+	 esac
+	fi
+	func_append deplibs " $arg"
+	continue
+	;;
+
+      -module)
+	module=yes
+	continue
+	;;
+
+      # Tru64 UNIX uses -model [arg] to determine the layout of C++
+      # classes, name mangling, and exception handling.
+      # Darwin uses the -arch flag to determine output architecture.
+      -model|-arch|-isysroot|--sysroot)
+	func_append compiler_flags " $arg"
+	func_append compile_command " $arg"
+	func_append finalize_command " $arg"
+	prev=xcompiler
+	continue
+	;;
+
+      -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \
+      |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*)
+	func_append compiler_flags " $arg"
+	func_append compile_command " $arg"
+	func_append finalize_command " $arg"
+	case "$new_inherited_linker_flags " in
+	    *" $arg "*) ;;
+	    * ) func_append new_inherited_linker_flags " $arg" ;;
+	esac
+	continue
+	;;
+
+      -multi_module)
+	single_module="${wl}-multi_module"
+	continue
+	;;
+
+      -no-fast-install)
+	fast_install=no
+	continue
+	;;
+
+      -no-install)
+	case $host in
+	*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-darwin* | *-cegcc*)
+	  # The PATH hackery in wrapper scripts is required on Windows
+	  # and Darwin in order for the loader to find any dlls it needs.
+	  func_warning "\`-no-install' is ignored for $host"
+	  func_warning "assuming \`-no-fast-install' instead"
+	  fast_install=no
+	  ;;
+	*) no_install=yes ;;
+	esac
+	continue
+	;;
+
+      -no-undefined)
+	allow_undefined=no
+	continue
+	;;
+
+      -objectlist)
+	prev=objectlist
+	continue
+	;;
+
+      -o) prev=output ;;
+
+      -precious-files-regex)
+	prev=precious_regex
+	continue
+	;;
+
+      -release)
+	prev=release
+	continue
+	;;
+
+      -rpath)
+	prev=rpath
+	continue
+	;;
+
+      -R)
+	prev=xrpath
+	continue
+	;;
+
+      -R*)
+	func_stripname '-R' '' "$arg"
+	dir=$func_stripname_result
+	# We need an absolute path.
+	case $dir in
+	[\\/]* | [A-Za-z]:[\\/]*) ;;
+	=*)
+	  func_stripname '=' '' "$dir"
+	  dir=$lt_sysroot$func_stripname_result
+	  ;;
+	*)
+	  func_fatal_error "only absolute run-paths are allowed"
+	  ;;
+	esac
+	case "$xrpath " in
+	*" $dir "*) ;;
+	*) func_append xrpath " $dir" ;;
+	esac
+	continue
+	;;
+
+      -shared)
+	# The effects of -shared are defined in a previous loop.
+	continue
+	;;
+
+      -shrext)
+	prev=shrext
+	continue
+	;;
+
+      -static | -static-libtool-libs)
+	# The effects of -static are defined in a previous loop.
+	# We used to do the same as -all-static on platforms that
+	# didn't have a PIC flag, but the assumption that the effects
+	# would be equivalent was wrong.  It would break on at least
+	# Digital Unix and AIX.
+	continue
+	;;
+
+      -thread-safe)
+	thread_safe=yes
+	continue
+	;;
+
+      -version-info)
+	prev=vinfo
+	continue
+	;;
+
+      -version-number)
+	prev=vinfo
+	vinfo_number=yes
+	continue
+	;;
+
+      -weak)
+        prev=weak
+	continue
+	;;
+
+      -Wc,*)
+	func_stripname '-Wc,' '' "$arg"
+	args=$func_stripname_result
+	arg=
+	save_ifs="$IFS"; IFS=','
+	for flag in $args; do
+	  IFS="$save_ifs"
+          func_quote_for_eval "$flag"
+	  func_append arg " $func_quote_for_eval_result"
+	  func_append compiler_flags " $func_quote_for_eval_result"
+	done
+	IFS="$save_ifs"
+	func_stripname ' ' '' "$arg"
+	arg=$func_stripname_result
+	;;
+
+      -Wl,*)
+	func_stripname '-Wl,' '' "$arg"
+	args=$func_stripname_result
+	arg=
+	save_ifs="$IFS"; IFS=','
+	for flag in $args; do
+	  IFS="$save_ifs"
+          func_quote_for_eval "$flag"
+	  func_append arg " $wl$func_quote_for_eval_result"
+	  func_append compiler_flags " $wl$func_quote_for_eval_result"
+	  func_append linker_flags " $func_quote_for_eval_result"
+	done
+	IFS="$save_ifs"
+	func_stripname ' ' '' "$arg"
+	arg=$func_stripname_result
+	;;
+
+      -Xcompiler)
+	prev=xcompiler
+	continue
+	;;
+
+      -Xlinker)
+	prev=xlinker
+	continue
+	;;
+
+      -XCClinker)
+	prev=xcclinker
+	continue
+	;;
+
+      # -msg_* for osf cc
+      -msg_*)
+	func_quote_for_eval "$arg"
+	arg="$func_quote_for_eval_result"
+	;;
+
+      # Flags to be passed through unchanged, with rationale:
+      # -64, -mips[0-9]      enable 64-bit mode for the SGI compiler
+      # -r[0-9][0-9]*        specify processor for the SGI compiler
+      # -xarch=*, -xtarget=* enable 64-bit mode for the Sun compiler
+      # +DA*, +DD*           enable 64-bit mode for the HP compiler
+      # -q*                  compiler args for the IBM compiler
+      # -m*, -t[45]*, -txscale* architecture-specific flags for GCC
+      # -F/path              path to uninstalled frameworks, gcc on darwin
+      # -p, -pg, --coverage, -fprofile-*  profiling flags for GCC
+      # @file                GCC response files
+      # -tp=*                Portland pgcc target processor selection
+      # --sysroot=*          for sysroot support
+      # -O*, -flto*, -fwhopr*, -fuse-linker-plugin GCC link-time optimization
+      -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*| \
+      -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*|-tp=*|--sysroot=*| \
+      -O*|-flto*|-fwhopr*|-fuse-linker-plugin)
+        func_quote_for_eval "$arg"
+	arg="$func_quote_for_eval_result"
+        func_append compile_command " $arg"
+        func_append finalize_command " $arg"
+        func_append compiler_flags " $arg"
+        continue
+        ;;
+
+      # Some other compiler flag.
+      -* | +*)
+        func_quote_for_eval "$arg"
+	arg="$func_quote_for_eval_result"
+	;;
+
+      *.$objext)
+	# A standard object.
+	func_append objs " $arg"
+	;;
+
+      *.lo)
+	# A libtool-controlled object.
+
+	# Check to see that this really is a libtool object.
+	if func_lalib_unsafe_p "$arg"; then
+	  pic_object=
+	  non_pic_object=
+
+	  # Read the .lo file
+	  func_source "$arg"
+
+	  if test -z "$pic_object" ||
+	     test -z "$non_pic_object" ||
+	     test "$pic_object" = none &&
+	     test "$non_pic_object" = none; then
+	    func_fatal_error "cannot find name of object for \`$arg'"
+	  fi
+
+	  # Extract subdirectory from the argument.
+	  func_dirname "$arg" "/" ""
+	  xdir="$func_dirname_result"
+
+	  if test "$pic_object" != none; then
+	    # Prepend the subdirectory the object is found in.
+	    pic_object="$xdir$pic_object"
+
+	    if test "$prev" = dlfiles; then
+	      if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then
+		func_append dlfiles " $pic_object"
+		prev=
+		continue
+	      else
+		# If libtool objects are unsupported, then we need to preload.
+		prev=dlprefiles
+	      fi
+	    fi
+
+	    # CHECK ME:  I think I busted this.  -Ossama
+	    if test "$prev" = dlprefiles; then
+	      # Preload the old-style object.
+	      func_append dlprefiles " $pic_object"
+	      prev=
+	    fi
+
+	    # A PIC object.
+	    func_append libobjs " $pic_object"
+	    arg="$pic_object"
+	  fi
+
+	  # Non-PIC object.
+	  if test "$non_pic_object" != none; then
+	    # Prepend the subdirectory the object is found in.
+	    non_pic_object="$xdir$non_pic_object"
+
+	    # A standard non-PIC object
+	    func_append non_pic_objects " $non_pic_object"
+	    if test -z "$pic_object" || test "$pic_object" = none ; then
+	      arg="$non_pic_object"
+	    fi
+	  else
+	    # If the PIC object exists, use it instead.
+	    # $xdir was prepended to $pic_object above.
+	    non_pic_object="$pic_object"
+	    func_append non_pic_objects " $non_pic_object"
+	  fi
+	else
+	  # Only an error if not doing a dry-run.
+	  if $opt_dry_run; then
+	    # Extract subdirectory from the argument.
+	    func_dirname "$arg" "/" ""
+	    xdir="$func_dirname_result"
+
+	    func_lo2o "$arg"
+	    pic_object=$xdir$objdir/$func_lo2o_result
+	    non_pic_object=$xdir$func_lo2o_result
+	    func_append libobjs " $pic_object"
+	    func_append non_pic_objects " $non_pic_object"
+	  else
+	    func_fatal_error "\`$arg' is not a valid libtool object"
+	  fi
+	fi
+	;;
+
+      *.$libext)
+	# An archive.
+	func_append deplibs " $arg"
+	func_append old_deplibs " $arg"
+	continue
+	;;
+
+      *.la)
+	# A libtool-controlled library.
+
+	func_resolve_sysroot "$arg"
+	if test "$prev" = dlfiles; then
+	  # This library was specified with -dlopen.
+	  func_append dlfiles " $func_resolve_sysroot_result"
+	  prev=
+	elif test "$prev" = dlprefiles; then
+	  # The library was specified with -dlpreopen.
+	  func_append dlprefiles " $func_resolve_sysroot_result"
+	  prev=
+	else
+	  func_append deplibs " $func_resolve_sysroot_result"
+	fi
+	continue
+	;;
+
+      # Some other compiler argument.
+      *)
+	# Unknown arguments in both finalize_command and compile_command need
+	# to be aesthetically quoted because they are evaled later.
+	func_quote_for_eval "$arg"
+	arg="$func_quote_for_eval_result"
+	;;
+      esac # arg
+
+      # Now actually substitute the argument into the commands.
+      if test -n "$arg"; then
+	func_append compile_command " $arg"
+	func_append finalize_command " $arg"
+      fi
+    done # argument parsing loop
+
+    test -n "$prev" && \
+      func_fatal_help "the \`$prevarg' option requires an argument"
+
+    if test "$export_dynamic" = yes && test -n "$export_dynamic_flag_spec"; then
+      eval arg=\"$export_dynamic_flag_spec\"
+      func_append compile_command " $arg"
+      func_append finalize_command " $arg"
+    fi
+
+    oldlibs=
+    # calculate the name of the file, without its directory
+    func_basename "$output"
+    outputname="$func_basename_result"
+    libobjs_save="$libobjs"
+
+    if test -n "$shlibpath_var"; then
+      # get the directories listed in $shlibpath_var
+      eval shlib_search_path=\`\$ECHO \"\${$shlibpath_var}\" \| \$SED \'s/:/ /g\'\`
+    else
+      shlib_search_path=
+    fi
+    eval sys_lib_search_path=\"$sys_lib_search_path_spec\"
+    eval sys_lib_dlsearch_path=\"$sys_lib_dlsearch_path_spec\"
+
+    func_dirname "$output" "/" ""
+    output_objdir="$func_dirname_result$objdir"
+    func_to_tool_file "$output_objdir/"
+    tool_output_objdir=$func_to_tool_file_result
+    # Create the object directory.
+    func_mkdir_p "$output_objdir"
+
+    # Determine the type of output
+    case $output in
+    "")
+      func_fatal_help "you must specify an output file"
+      ;;
+    *.$libext) linkmode=oldlib ;;
+    *.lo | *.$objext) linkmode=obj ;;
+    *.la) linkmode=lib ;;
+    *) linkmode=prog ;; # Anything else should be a program.
+    esac
+
+    specialdeplibs=
+
+    libs=
+    # Find all interdependent deplibs by searching for libraries
+    # that are linked more than once (e.g. -la -lb -la)
+    for deplib in $deplibs; do
+      if $opt_preserve_dup_deps ; then
+	case "$libs " in
+	*" $deplib "*) func_append specialdeplibs " $deplib" ;;
+	esac
+      fi
+      func_append libs " $deplib"
+    done
+
+    if test "$linkmode" = lib; then
+      libs="$predeps $libs $compiler_lib_search_path $postdeps"
+
+      # Compute libraries that are listed more than once in $predeps
+      # $postdeps and mark them as special (i.e., whose duplicates are
+      # not to be eliminated).
+      pre_post_deps=
+      if $opt_duplicate_compiler_generated_deps; then
+	for pre_post_dep in $predeps $postdeps; do
+	  case "$pre_post_deps " in
+	  *" $pre_post_dep "*) func_append specialdeplibs " $pre_post_deps" ;;
+	  esac
+	  func_append pre_post_deps " $pre_post_dep"
+	done
+      fi
+      pre_post_deps=
+    fi
+
+    deplibs=
+    newdependency_libs=
+    newlib_search_path=
+    need_relink=no # whether we're linking any uninstalled libtool libraries
+    notinst_deplibs= # not-installed libtool libraries
+    notinst_path= # paths that contain not-installed libtool libraries
+
+    case $linkmode in
+    lib)
+	passes="conv dlpreopen link"
+	for file in $dlfiles $dlprefiles; do
+	  case $file in
+	  *.la) ;;
+	  *)
+	    func_fatal_help "libraries can \`-dlopen' only libtool libraries: $file"
+	    ;;
+	  esac
+	done
+	;;
+    prog)
+	compile_deplibs=
+	finalize_deplibs=
+	alldeplibs=no
+	newdlfiles=
+	newdlprefiles=
+	passes="conv scan dlopen dlpreopen link"
+	;;
+    *)  passes="conv"
+	;;
+    esac
+
+    for pass in $passes; do
+      # The preopen pass in lib mode reverses $deplibs; put it back here
+      # so that -L comes before libs that need it for instance...
+      if test "$linkmode,$pass" = "lib,link"; then
+	## FIXME: Find the place where the list is rebuilt in the wrong
+	##        order, and fix it there properly
+        tmp_deplibs=
+	for deplib in $deplibs; do
+	  tmp_deplibs="$deplib $tmp_deplibs"
+	done
+	deplibs="$tmp_deplibs"
+      fi
+
+      if test "$linkmode,$pass" = "lib,link" ||
+	 test "$linkmode,$pass" = "prog,scan"; then
+	libs="$deplibs"
+	deplibs=
+      fi
+      if test "$linkmode" = prog; then
+	case $pass in
+	dlopen) libs="$dlfiles" ;;
+	dlpreopen) libs="$dlprefiles" ;;
+	link)
+	  libs="$deplibs %DEPLIBS%"
+	  test "X$link_all_deplibs" != Xno && libs="$libs $dependency_libs"
+	  ;;
+	esac
+      fi
+      if test "$linkmode,$pass" = "lib,dlpreopen"; then
+	# Collect and forward deplibs of preopened libtool libs
+	for lib in $dlprefiles; do
+	  # Ignore non-libtool-libs
+	  dependency_libs=
+	  func_resolve_sysroot "$lib"
+	  case $lib in
+	  *.la)	func_source "$func_resolve_sysroot_result" ;;
+	  esac
+
+	  # Collect preopened libtool deplibs, except any this library
+	  # has declared as weak libs
+	  for deplib in $dependency_libs; do
+	    func_basename "$deplib"
+            deplib_base=$func_basename_result
+	    case " $weak_libs " in
+	    *" $deplib_base "*) ;;
+	    *) func_append deplibs " $deplib" ;;
+	    esac
+	  done
+	done
+	libs="$dlprefiles"
+      fi
+      if test "$pass" = dlopen; then
+	# Collect dlpreopened libraries
+	save_deplibs="$deplibs"
+	deplibs=
+      fi
+
+      for deplib in $libs; do
+	lib=
+	found=no
+	case $deplib in
+	-mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \
+        |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*)
+	  if test "$linkmode,$pass" = "prog,link"; then
+	    compile_deplibs="$deplib $compile_deplibs"
+	    finalize_deplibs="$deplib $finalize_deplibs"
+	  else
+	    func_append compiler_flags " $deplib"
+	    if test "$linkmode" = lib ; then
+		case "$new_inherited_linker_flags " in
+		    *" $deplib "*) ;;
+		    * ) func_append new_inherited_linker_flags " $deplib" ;;
+		esac
+	    fi
+	  fi
+	  continue
+	  ;;
+	-l*)
+	  if test "$linkmode" != lib && test "$linkmode" != prog; then
+	    func_warning "\`-l' is ignored for archives/objects"
+	    continue
+	  fi
+	  func_stripname '-l' '' "$deplib"
+	  name=$func_stripname_result
+	  if test "$linkmode" = lib; then
+	    searchdirs="$newlib_search_path $lib_search_path $compiler_lib_search_dirs $sys_lib_search_path $shlib_search_path"
+	  else
+	    searchdirs="$newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path"
+	  fi
+	  for searchdir in $searchdirs; do
+	    for search_ext in .la $std_shrext .so .a; do
+	      # Search the libtool library
+	      lib="$searchdir/lib${name}${search_ext}"
+	      if test -f "$lib"; then
+		if test "$search_ext" = ".la"; then
+		  found=yes
+		else
+		  found=no
+		fi
+		break 2
+	      fi
+	    done
+	  done
+	  if test "$found" != yes; then
+	    # deplib doesn't seem to be a libtool library
+	    if test "$linkmode,$pass" = "prog,link"; then
+	      compile_deplibs="$deplib $compile_deplibs"
+	      finalize_deplibs="$deplib $finalize_deplibs"
+	    else
+	      deplibs="$deplib $deplibs"
+	      test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs"
+	    fi
+	    continue
+	  else # deplib is a libtool library
+	    # If $allow_libtool_libs_with_static_runtimes && $deplib is a stdlib,
+	    # We need to do some special things here, and not later.
+	    if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
+	      case " $predeps $postdeps " in
+	      *" $deplib "*)
+		if func_lalib_p "$lib"; then
+		  library_names=
+		  old_library=
+		  func_source "$lib"
+		  for l in $old_library $library_names; do
+		    ll="$l"
+		  done
+		  if test "X$ll" = "X$old_library" ; then # only static version available
+		    found=no
+		    func_dirname "$lib" "" "."
+		    ladir="$func_dirname_result"
+		    lib=$ladir/$old_library
+		    if test "$linkmode,$pass" = "prog,link"; then
+		      compile_deplibs="$deplib $compile_deplibs"
+		      finalize_deplibs="$deplib $finalize_deplibs"
+		    else
+		      deplibs="$deplib $deplibs"
+		      test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs"
+		    fi
+		    continue
+		  fi
+		fi
+		;;
+	      *) ;;
+	      esac
+	    fi
+	  fi
+	  ;; # -l
+	*.ltframework)
+	  if test "$linkmode,$pass" = "prog,link"; then
+	    compile_deplibs="$deplib $compile_deplibs"
+	    finalize_deplibs="$deplib $finalize_deplibs"
+	  else
+	    deplibs="$deplib $deplibs"
+	    if test "$linkmode" = lib ; then
+		case "$new_inherited_linker_flags " in
+		    *" $deplib "*) ;;
+		    * ) func_append new_inherited_linker_flags " $deplib" ;;
+		esac
+	    fi
+	  fi
+	  continue
+	  ;;
+	-L*)
+	  case $linkmode in
+	  lib)
+	    deplibs="$deplib $deplibs"
+	    test "$pass" = conv && continue
+	    newdependency_libs="$deplib $newdependency_libs"
+	    func_stripname '-L' '' "$deplib"
+	    func_resolve_sysroot "$func_stripname_result"
+	    func_append newlib_search_path " $func_resolve_sysroot_result"
+	    ;;
+	  prog)
+	    if test "$pass" = conv; then
+	      deplibs="$deplib $deplibs"
+	      continue
+	    fi
+	    if test "$pass" = scan; then
+	      deplibs="$deplib $deplibs"
+	    else
+	      compile_deplibs="$deplib $compile_deplibs"
+	      finalize_deplibs="$deplib $finalize_deplibs"
+	    fi
+	    func_stripname '-L' '' "$deplib"
+	    func_resolve_sysroot "$func_stripname_result"
+	    func_append newlib_search_path " $func_resolve_sysroot_result"
+	    ;;
+	  *)
+	    func_warning "\`-L' is ignored for archives/objects"
+	    ;;
+	  esac # linkmode
+	  continue
+	  ;; # -L
+	-R*)
+	  if test "$pass" = link; then
+	    func_stripname '-R' '' "$deplib"
+	    func_resolve_sysroot "$func_stripname_result"
+	    dir=$func_resolve_sysroot_result
+	    # Make sure the xrpath contains only unique directories.
+	    case "$xrpath " in
+	    *" $dir "*) ;;
+	    *) func_append xrpath " $dir" ;;
+	    esac
+	  fi
+	  deplibs="$deplib $deplibs"
+	  continue
+	  ;;
+	*.la)
+	  func_resolve_sysroot "$deplib"
+	  lib=$func_resolve_sysroot_result
+	  ;;
+	*.$libext)
+	  if test "$pass" = conv; then
+	    deplibs="$deplib $deplibs"
+	    continue
+	  fi
+	  case $linkmode in
+	  lib)
+	    # Linking convenience modules into shared libraries is allowed,
+	    # but linking other static libraries is non-portable.
+	    case " $dlpreconveniencelibs " in
+	    *" $deplib "*) ;;
+	    *)
+	      valid_a_lib=no
+	      case $deplibs_check_method in
+		match_pattern*)
+		  set dummy $deplibs_check_method; shift
+		  match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"`
+		  if eval "\$ECHO \"$deplib\"" 2>/dev/null | $SED 10q \
+		    | $EGREP "$match_pattern_regex" > /dev/null; then
+		    valid_a_lib=yes
+		  fi
+		;;
+		pass_all)
+		  valid_a_lib=yes
+		;;
+	      esac
+	      if test "$valid_a_lib" != yes; then
+		echo
+		$ECHO "*** Warning: Trying to link with static lib archive $deplib."
+		echo "*** I have the capability to make that library automatically link in when"
+		echo "*** you link to this library.  But I can only do this if you have a"
+		echo "*** shared version of the library, which you do not appear to have"
+		echo "*** because the file extensions .$libext of this argument makes me believe"
+		echo "*** that it is just a static archive that I should not use here."
+	      else
+		echo
+		$ECHO "*** Warning: Linking the shared library $output against the"
+		$ECHO "*** static library $deplib is not portable!"
+		deplibs="$deplib $deplibs"
+	      fi
+	      ;;
+	    esac
+	    continue
+	    ;;
+	  prog)
+	    if test "$pass" != link; then
+	      deplibs="$deplib $deplibs"
+	    else
+	      compile_deplibs="$deplib $compile_deplibs"
+	      finalize_deplibs="$deplib $finalize_deplibs"
+	    fi
+	    continue
+	    ;;
+	  esac # linkmode
+	  ;; # *.$libext
+	*.lo | *.$objext)
+	  if test "$pass" = conv; then
+	    deplibs="$deplib $deplibs"
+	  elif test "$linkmode" = prog; then
+	    if test "$pass" = dlpreopen || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then
+	      # If there is no dlopen support or we're linking statically,
+	      # we need to preload.
+	      func_append newdlprefiles " $deplib"
+	      compile_deplibs="$deplib $compile_deplibs"
+	      finalize_deplibs="$deplib $finalize_deplibs"
+	    else
+	      func_append newdlfiles " $deplib"
+	    fi
+	  fi
+	  continue
+	  ;;
+	%DEPLIBS%)
+	  alldeplibs=yes
+	  continue
+	  ;;
+	esac # case $deplib
+
+	if test "$found" = yes || test -f "$lib"; then :
+	else
+	  func_fatal_error "cannot find the library \`$lib' or unhandled argument \`$deplib'"
+	fi
+
+	# Check to see that this really is a libtool archive.
+	func_lalib_unsafe_p "$lib" \
+	  || func_fatal_error "\`$lib' is not a valid libtool archive"
+
+	func_dirname "$lib" "" "."
+	ladir="$func_dirname_result"
+
+	dlname=
+	dlopen=
+	dlpreopen=
+	libdir=
+	library_names=
+	old_library=
+	inherited_linker_flags=
+	# If the library was installed with an old release of libtool,
+	# it will not redefine variables installed, or shouldnotlink
+	installed=yes
+	shouldnotlink=no
+	avoidtemprpath=
+
+
+	# Read the .la file
+	func_source "$lib"
+
+	# Convert "-framework foo" to "foo.ltframework"
+	if test -n "$inherited_linker_flags"; then
+	  tmp_inherited_linker_flags=`$ECHO "$inherited_linker_flags" | $SED 's/-framework \([^ $]*\)/\1.ltframework/g'`
+	  for tmp_inherited_linker_flag in $tmp_inherited_linker_flags; do
+	    case " $new_inherited_linker_flags " in
+	      *" $tmp_inherited_linker_flag "*) ;;
+	      *) func_append new_inherited_linker_flags " $tmp_inherited_linker_flag";;
+	    esac
+	  done
+	fi
+	dependency_libs=`$ECHO " $dependency_libs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
+	if test "$linkmode,$pass" = "lib,link" ||
+	   test "$linkmode,$pass" = "prog,scan" ||
+	   { test "$linkmode" != prog && test "$linkmode" != lib; }; then
+	  test -n "$dlopen" && func_append dlfiles " $dlopen"
+	  test -n "$dlpreopen" && func_append dlprefiles " $dlpreopen"
+	fi
+
+	if test "$pass" = conv; then
+	  # Only check for convenience libraries
+	  deplibs="$lib $deplibs"
+	  if test -z "$libdir"; then
+	    if test -z "$old_library"; then
+	      func_fatal_error "cannot find name of link library for \`$lib'"
+	    fi
+	    # It is a libtool convenience library, so add in its objects.
+	    func_append convenience " $ladir/$objdir/$old_library"
+	    func_append old_convenience " $ladir/$objdir/$old_library"
+	    tmp_libs=
+	    for deplib in $dependency_libs; do
+	      deplibs="$deplib $deplibs"
+	      if $opt_preserve_dup_deps ; then
+		case "$tmp_libs " in
+		*" $deplib "*) func_append specialdeplibs " $deplib" ;;
+		esac
+	      fi
+	      func_append tmp_libs " $deplib"
+	    done
+	  elif test "$linkmode" != prog && test "$linkmode" != lib; then
+	    func_fatal_error "\`$lib' is not a convenience library"
+	  fi
+	  continue
+	fi # $pass = conv
+
+
+	# Get the name of the library we link against.
+	linklib=
+	if test -n "$old_library" &&
+	   { test "$prefer_static_libs" = yes ||
+	     test "$prefer_static_libs,$installed" = "built,no"; }; then
+	  linklib=$old_library
+	else
+	  for l in $old_library $library_names; do
+	    linklib="$l"
+	  done
+	fi
+	if test -z "$linklib"; then
+	  func_fatal_error "cannot find name of link library for \`$lib'"
+	fi
+
+	# This library was specified with -dlopen.
+	if test "$pass" = dlopen; then
+	  if test -z "$libdir"; then
+	    func_fatal_error "cannot -dlopen a convenience library: \`$lib'"
+	  fi
+	  if test -z "$dlname" ||
+	     test "$dlopen_support" != yes ||
+	     test "$build_libtool_libs" = no; then
+	    # If there is no dlname, no dlopen support or we're linking
+	    # statically, we need to preload.  We also need to preload any
+	    # dependent libraries so libltdl's deplib preloader doesn't
+	    # bomb out in the load deplibs phase.
+	    func_append dlprefiles " $lib $dependency_libs"
+	  else
+	    func_append newdlfiles " $lib"
+	  fi
+	  continue
+	fi # $pass = dlopen
+
+	# We need an absolute path.
+	case $ladir in
+	[\\/]* | [A-Za-z]:[\\/]*) abs_ladir="$ladir" ;;
+	*)
+	  abs_ladir=`cd "$ladir" && pwd`
+	  if test -z "$abs_ladir"; then
+	    func_warning "cannot determine absolute directory name of \`$ladir'"
+	    func_warning "passing it literally to the linker, although it might fail"
+	    abs_ladir="$ladir"
+	  fi
+	  ;;
+	esac
+	func_basename "$lib"
+	laname="$func_basename_result"
+
+	# Find the relevant object directory and library name.
+	if test "X$installed" = Xyes; then
+	  if test ! -f "$lt_sysroot$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then
+	    func_warning "library \`$lib' was moved."
+	    dir="$ladir"
+	    absdir="$abs_ladir"
+	    libdir="$abs_ladir"
+	  else
+	    dir="$lt_sysroot$libdir"
+	    absdir="$lt_sysroot$libdir"
+	  fi
+	  test "X$hardcode_automatic" = Xyes && avoidtemprpath=yes
+	else
+	  if test ! -f "$ladir/$objdir/$linklib" && test -f "$abs_ladir/$linklib"; then
+	    dir="$ladir"
+	    absdir="$abs_ladir"
+	    # Remove this search path later
+	    func_append notinst_path " $abs_ladir"
+	  else
+	    dir="$ladir/$objdir"
+	    absdir="$abs_ladir/$objdir"
+	    # Remove this search path later
+	    func_append notinst_path " $abs_ladir"
+	  fi
+	fi # $installed = yes
+	func_stripname 'lib' '.la' "$laname"
+	name=$func_stripname_result
+
+	# This library was specified with -dlpreopen.
+	if test "$pass" = dlpreopen; then
+	  if test -z "$libdir" && test "$linkmode" = prog; then
+	    func_fatal_error "only libraries may -dlpreopen a convenience library: \`$lib'"
+	  fi
+	  case "$host" in
+	    # special handling for platforms with PE-DLLs.
+	    *cygwin* | *mingw* | *cegcc* )
+	      # Linker will automatically link against shared library if both
+	      # static and shared are present.  Therefore, ensure we extract
+	      # symbols from the import library if a shared library is present
+	      # (otherwise, the dlopen module name will be incorrect).  We do
+	      # this by putting the import library name into $newdlprefiles.
+	      # We recover the dlopen module name by 'saving' the la file
+	      # name in a special purpose variable, and (later) extracting the
+	      # dlname from the la file.
+	      if test -n "$dlname"; then
+	        func_tr_sh "$dir/$linklib"
+	        eval "libfile_$func_tr_sh_result=\$abs_ladir/\$laname"
+	        func_append newdlprefiles " $dir/$linklib"
+	      else
+	        func_append newdlprefiles " $dir/$old_library"
+	        # Keep a list of preopened convenience libraries to check
+	        # that they are being used correctly in the link pass.
+	        test -z "$libdir" && \
+	          func_append dlpreconveniencelibs " $dir/$old_library"
+	      fi
+	    ;;
+	    * )
+	      # Prefer using a static library (so that no silly _DYNAMIC symbols
+	      # are required to link).
+	      if test -n "$old_library"; then
+	        func_append newdlprefiles " $dir/$old_library"
+	        # Keep a list of preopened convenience libraries to check
+	        # that they are being used correctly in the link pass.
+	        test -z "$libdir" && \
+	          func_append dlpreconveniencelibs " $dir/$old_library"
+	      # Otherwise, use the dlname, so that lt_dlopen finds it.
+	      elif test -n "$dlname"; then
+	        func_append newdlprefiles " $dir/$dlname"
+	      else
+	        func_append newdlprefiles " $dir/$linklib"
+	      fi
+	    ;;
+	  esac
+	fi # $pass = dlpreopen
+
+	if test -z "$libdir"; then
+	  # Link the convenience library
+	  if test "$linkmode" = lib; then
+	    deplibs="$dir/$old_library $deplibs"
+	  elif test "$linkmode,$pass" = "prog,link"; then
+	    compile_deplibs="$dir/$old_library $compile_deplibs"
+	    finalize_deplibs="$dir/$old_library $finalize_deplibs"
+	  else
+	    deplibs="$lib $deplibs" # used for prog,scan pass
+	  fi
+	  continue
+	fi
+
+
+	if test "$linkmode" = prog && test "$pass" != link; then
+	  func_append newlib_search_path " $ladir"
+	  deplibs="$lib $deplibs"
+
+	  linkalldeplibs=no
+	  if test "$link_all_deplibs" != no || test -z "$library_names" ||
+	     test "$build_libtool_libs" = no; then
+	    linkalldeplibs=yes
+	  fi
+
+	  tmp_libs=
+	  for deplib in $dependency_libs; do
+	    case $deplib in
+	    -L*) func_stripname '-L' '' "$deplib"
+	         func_resolve_sysroot "$func_stripname_result"
+	         func_append newlib_search_path " $func_resolve_sysroot_result"
+		 ;;
+	    esac
+	    # Need to link against all dependency_libs?
+	    if test "$linkalldeplibs" = yes; then
+	      deplibs="$deplib $deplibs"
+	    else
+	      # Need to hardcode shared library paths
+	      # or/and link against static libraries
+	      newdependency_libs="$deplib $newdependency_libs"
+	    fi
+	    if $opt_preserve_dup_deps ; then
+	      case "$tmp_libs " in
+	      *" $deplib "*) func_append specialdeplibs " $deplib" ;;
+	      esac
+	    fi
+	    func_append tmp_libs " $deplib"
+	  done # for deplib
+	  continue
+	fi # $linkmode = prog...
+
+	if test "$linkmode,$pass" = "prog,link"; then
+	  if test -n "$library_names" &&
+	     { { test "$prefer_static_libs" = no ||
+	         test "$prefer_static_libs,$installed" = "built,yes"; } ||
+	       test -z "$old_library"; }; then
+	    # We need to hardcode the library path
+	    if test -n "$shlibpath_var" && test -z "$avoidtemprpath" ; then
+	      # Make sure the rpath contains only unique directories.
+	      case "$temp_rpath:" in
+	      *"$absdir:"*) ;;
+	      *) func_append temp_rpath "$absdir:" ;;
+	      esac
+	    fi
+
+	    # Hardcode the library path.
+	    # Skip directories that are in the system default run-time
+	    # search path.
+	    case " $sys_lib_dlsearch_path " in
+	    *" $absdir "*) ;;
+	    *)
+	      case "$compile_rpath " in
+	      *" $absdir "*) ;;
+	      *) func_append compile_rpath " $absdir" ;;
+	      esac
+	      ;;
+	    esac
+	    case " $sys_lib_dlsearch_path " in
+	    *" $libdir "*) ;;
+	    *)
+	      case "$finalize_rpath " in
+	      *" $libdir "*) ;;
+	      *) func_append finalize_rpath " $libdir" ;;
+	      esac
+	      ;;
+	    esac
+	  fi # $linkmode,$pass = prog,link...
+
+	  if test "$alldeplibs" = yes &&
+	     { test "$deplibs_check_method" = pass_all ||
+	       { test "$build_libtool_libs" = yes &&
+		 test -n "$library_names"; }; }; then
+	    # We only need to search for static libraries
+	    continue
+	  fi
+	fi
+
+	link_static=no # Whether the deplib will be linked statically
+	use_static_libs=$prefer_static_libs
+	if test "$use_static_libs" = built && test "$installed" = yes; then
+	  use_static_libs=no
+	fi
+	if test -n "$library_names" &&
+	   { test "$use_static_libs" = no || test -z "$old_library"; }; then
+	  case $host in
+	  *cygwin* | *mingw* | *cegcc*)
+	      # No point in relinking DLLs because paths are not encoded
+	      func_append notinst_deplibs " $lib"
+	      need_relink=no
+	    ;;
+	  *)
+	    if test "$installed" = no; then
+	      func_append notinst_deplibs " $lib"
+	      need_relink=yes
+	    fi
+	    ;;
+	  esac
+	  # This is a shared library
+
+	  # Warn about portability, can't link against -module's on some
+	  # systems (darwin).  Don't bleat about dlopened modules though!
+	  dlopenmodule=""
+	  for dlpremoduletest in $dlprefiles; do
+	    if test "X$dlpremoduletest" = "X$lib"; then
+	      dlopenmodule="$dlpremoduletest"
+	      break
+	    fi
+	  done
+	  if test -z "$dlopenmodule" && test "$shouldnotlink" = yes && test "$pass" = link; then
+	    echo
+	    if test "$linkmode" = prog; then
+	      $ECHO "*** Warning: Linking the executable $output against the loadable module"
+	    else
+	      $ECHO "*** Warning: Linking the shared library $output against the loadable module"
+	    fi
+	    $ECHO "*** $linklib is not portable!"
+	  fi
+	  if test "$linkmode" = lib &&
+	     test "$hardcode_into_libs" = yes; then
+	    # Hardcode the library path.
+	    # Skip directories that are in the system default run-time
+	    # search path.
+	    case " $sys_lib_dlsearch_path " in
+	    *" $absdir "*) ;;
+	    *)
+	      case "$compile_rpath " in
+	      *" $absdir "*) ;;
+	      *) func_append compile_rpath " $absdir" ;;
+	      esac
+	      ;;
+	    esac
+	    case " $sys_lib_dlsearch_path " in
+	    *" $libdir "*) ;;
+	    *)
+	      case "$finalize_rpath " in
+	      *" $libdir "*) ;;
+	      *) func_append finalize_rpath " $libdir" ;;
+	      esac
+	      ;;
+	    esac
+	  fi
+
+	  if test -n "$old_archive_from_expsyms_cmds"; then
+	    # figure out the soname
+	    set dummy $library_names
+	    shift
+	    realname="$1"
+	    shift
+	    libname=`eval "\\$ECHO \"$libname_spec\""`
+	    # use dlname if we got it. it's perfectly good, no?
+	    if test -n "$dlname"; then
+	      soname="$dlname"
+	    elif test -n "$soname_spec"; then
+	      # bleh windows
+	      case $host in
+	      *cygwin* | mingw* | *cegcc*)
+	        func_arith $current - $age
+		major=$func_arith_result
+		versuffix="-$major"
+		;;
+	      esac
+	      eval soname=\"$soname_spec\"
+	    else
+	      soname="$realname"
+	    fi
+
+	    # Make a new name for the extract_expsyms_cmds to use
+	    soroot="$soname"
+	    func_basename "$soroot"
+	    soname="$func_basename_result"
+	    func_stripname 'lib' '.dll' "$soname"
+	    newlib=libimp-$func_stripname_result.a
+
+	    # If the library has no export list, then create one now
+	    if test -f "$output_objdir/$soname-def"; then :
+	    else
+	      func_verbose "extracting exported symbol list from \`$soname'"
+	      func_execute_cmds "$extract_expsyms_cmds" 'exit $?'
+	    fi
+
+	    # Create $newlib
+	    if test -f "$output_objdir/$newlib"; then :; else
+	      func_verbose "generating import library for \`$soname'"
+	      func_execute_cmds "$old_archive_from_expsyms_cmds" 'exit $?'
+	    fi
+	    # make sure the library variables are pointing to the new library
+	    dir=$output_objdir
+	    linklib=$newlib
+	  fi # test -n "$old_archive_from_expsyms_cmds"
+
+	  if test "$linkmode" = prog || test "$opt_mode" != relink; then
+	    add_shlibpath=
+	    add_dir=
+	    add=
+	    lib_linked=yes
+	    case $hardcode_action in
+	    immediate | unsupported)
+	      if test "$hardcode_direct" = no; then
+		add="$dir/$linklib"
+		case $host in
+		  *-*-sco3.2v5.0.[024]*) add_dir="-L$dir" ;;
+		  *-*-sysv4*uw2*) add_dir="-L$dir" ;;
+		  *-*-sysv5OpenUNIX* | *-*-sysv5UnixWare7.[01].[10]* | \
+		    *-*-unixware7*) add_dir="-L$dir" ;;
+		  *-*-darwin* )
+		    # if the lib is a (non-dlopened) module then we can not
+		    # link against it, someone is ignoring the earlier warnings
+		    if /usr/bin/file -L $add 2> /dev/null |
+			 $GREP ": [^:]* bundle" >/dev/null ; then
+		      if test "X$dlopenmodule" != "X$lib"; then
+			$ECHO "*** Warning: lib $linklib is a module, not a shared library"
+			if test -z "$old_library" ; then
+			  echo
+			  echo "*** And there doesn't seem to be a static archive available"
+			  echo "*** The link will probably fail, sorry"
+			else
+			  add="$dir/$old_library"
+			fi
+		      elif test -n "$old_library"; then
+			add="$dir/$old_library"
+		      fi
+		    fi
+		esac
+	      elif test "$hardcode_minus_L" = no; then
+		case $host in
+		*-*-sunos*) add_shlibpath="$dir" ;;
+		esac
+		add_dir="-L$dir"
+		add="-l$name"
+	      elif test "$hardcode_shlibpath_var" = no; then
+		add_shlibpath="$dir"
+		add="-l$name"
+	      else
+		lib_linked=no
+	      fi
+	      ;;
+	    relink)
+	      if test "$hardcode_direct" = yes &&
+	         test "$hardcode_direct_absolute" = no; then
+		add="$dir/$linklib"
+	      elif test "$hardcode_minus_L" = yes; then
+		add_dir="-L$absdir"
+		# Try looking first in the location we're being installed to.
+		if test -n "$inst_prefix_dir"; then
+		  case $libdir in
+		    [\\/]*)
+		      func_append add_dir " -L$inst_prefix_dir$libdir"
+		      ;;
+		  esac
+		fi
+		add="-l$name"
+	      elif test "$hardcode_shlibpath_var" = yes; then
+		add_shlibpath="$dir"
+		add="-l$name"
+	      else
+		lib_linked=no
+	      fi
+	      ;;
+	    *) lib_linked=no ;;
+	    esac
+
+	    if test "$lib_linked" != yes; then
+	      func_fatal_configuration "unsupported hardcode properties"
+	    fi
+
+	    if test -n "$add_shlibpath"; then
+	      case :$compile_shlibpath: in
+	      *":$add_shlibpath:"*) ;;
+	      *) func_append compile_shlibpath "$add_shlibpath:" ;;
+	      esac
+	    fi
+	    if test "$linkmode" = prog; then
+	      test -n "$add_dir" && compile_deplibs="$add_dir $compile_deplibs"
+	      test -n "$add" && compile_deplibs="$add $compile_deplibs"
+	    else
+	      test -n "$add_dir" && deplibs="$add_dir $deplibs"
+	      test -n "$add" && deplibs="$add $deplibs"
+	      if test "$hardcode_direct" != yes &&
+		 test "$hardcode_minus_L" != yes &&
+		 test "$hardcode_shlibpath_var" = yes; then
+		case :$finalize_shlibpath: in
+		*":$libdir:"*) ;;
+		*) func_append finalize_shlibpath "$libdir:" ;;
+		esac
+	      fi
+	    fi
+	  fi
+
+	  if test "$linkmode" = prog || test "$opt_mode" = relink; then
+	    add_shlibpath=
+	    add_dir=
+	    add=
+	    # Finalize command for both is simple: just hardcode it.
+	    if test "$hardcode_direct" = yes &&
+	       test "$hardcode_direct_absolute" = no; then
+	      add="$libdir/$linklib"
+	    elif test "$hardcode_minus_L" = yes; then
+	      add_dir="-L$libdir"
+	      add="-l$name"
+	    elif test "$hardcode_shlibpath_var" = yes; then
+	      case :$finalize_shlibpath: in
+	      *":$libdir:"*) ;;
+	      *) func_append finalize_shlibpath "$libdir:" ;;
+	      esac
+	      add="-l$name"
+	    elif test "$hardcode_automatic" = yes; then
+	      if test -n "$inst_prefix_dir" &&
+		 test -f "$inst_prefix_dir$libdir/$linklib" ; then
+		add="$inst_prefix_dir$libdir/$linklib"
+	      else
+		add="$libdir/$linklib"
+	      fi
+	    else
+	      # We cannot seem to hardcode it, guess we'll fake it.
+	      add_dir="-L$libdir"
+	      # Try looking first in the location we're being installed to.
+	      if test -n "$inst_prefix_dir"; then
+		case $libdir in
+		  [\\/]*)
+		    func_append add_dir " -L$inst_prefix_dir$libdir"
+		    ;;
+		esac
+	      fi
+	      add="-l$name"
+	    fi
+
+	    if test "$linkmode" = prog; then
+	      test -n "$add_dir" && finalize_deplibs="$add_dir $finalize_deplibs"
+	      test -n "$add" && finalize_deplibs="$add $finalize_deplibs"
+	    else
+	      test -n "$add_dir" && deplibs="$add_dir $deplibs"
+	      test -n "$add" && deplibs="$add $deplibs"
+	    fi
+	  fi
+	elif test "$linkmode" = prog; then
+	  # Here we assume that one of hardcode_direct or hardcode_minus_L
+	  # is not unsupported.  This is valid on all known static and
+	  # shared platforms.
+	  if test "$hardcode_direct" != unsupported; then
+	    test -n "$old_library" && linklib="$old_library"
+	    compile_deplibs="$dir/$linklib $compile_deplibs"
+	    finalize_deplibs="$dir/$linklib $finalize_deplibs"
+	  else
+	    compile_deplibs="-l$name -L$dir $compile_deplibs"
+	    finalize_deplibs="-l$name -L$dir $finalize_deplibs"
+	  fi
+	elif test "$build_libtool_libs" = yes; then
+	  # Not a shared library
+	  if test "$deplibs_check_method" != pass_all; then
+	    # We're trying link a shared library against a static one
+	    # but the system doesn't support it.
+
+	    # Just print a warning and add the library to dependency_libs so
+	    # that the program can be linked against the static library.
+	    echo
+	    $ECHO "*** Warning: This system can not link to static lib archive $lib."
+	    echo "*** I have the capability to make that library automatically link in when"
+	    echo "*** you link to this library.  But I can only do this if you have a"
+	    echo "*** shared version of the library, which you do not appear to have."
+	    if test "$module" = yes; then
+	      echo "*** But as you try to build a module library, libtool will still create "
+	      echo "*** a static module, that should work as long as the dlopening application"
+	      echo "*** is linked with the -dlopen flag to resolve symbols at runtime."
+	      if test -z "$global_symbol_pipe"; then
+		echo
+		echo "*** However, this would only work if libtool was able to extract symbol"
+		echo "*** lists from a program, using \`nm' or equivalent, but libtool could"
+		echo "*** not find such a program.  So, this module is probably useless."
+		echo "*** \`nm' from GNU binutils and a full rebuild may help."
+	      fi
+	      if test "$build_old_libs" = no; then
+		build_libtool_libs=module
+		build_old_libs=yes
+	      else
+		build_libtool_libs=no
+	      fi
+	    fi
+	  else
+	    deplibs="$dir/$old_library $deplibs"
+	    link_static=yes
+	  fi
+	fi # link shared/static library?
+
+	if test "$linkmode" = lib; then
+	  if test -n "$dependency_libs" &&
+	     { test "$hardcode_into_libs" != yes ||
+	       test "$build_old_libs" = yes ||
+	       test "$link_static" = yes; }; then
+	    # Extract -R from dependency_libs
+	    temp_deplibs=
+	    for libdir in $dependency_libs; do
+	      case $libdir in
+	      -R*) func_stripname '-R' '' "$libdir"
+	           temp_xrpath=$func_stripname_result
+		   case " $xrpath " in
+		   *" $temp_xrpath "*) ;;
+		   *) func_append xrpath " $temp_xrpath";;
+		   esac;;
+	      *) func_append temp_deplibs " $libdir";;
+	      esac
+	    done
+	    dependency_libs="$temp_deplibs"
+	  fi
+
+	  func_append newlib_search_path " $absdir"
+	  # Link against this library
+	  test "$link_static" = no && newdependency_libs="$abs_ladir/$laname $newdependency_libs"
+	  # ... and its dependency_libs
+	  tmp_libs=
+	  for deplib in $dependency_libs; do
+	    newdependency_libs="$deplib $newdependency_libs"
+	    case $deplib in
+              -L*) func_stripname '-L' '' "$deplib"
+                   func_resolve_sysroot "$func_stripname_result";;
+              *) func_resolve_sysroot "$deplib" ;;
+            esac
+	    if $opt_preserve_dup_deps ; then
+	      case "$tmp_libs " in
+	      *" $func_resolve_sysroot_result "*)
+                func_append specialdeplibs " $func_resolve_sysroot_result" ;;
+	      esac
+	    fi
+	    func_append tmp_libs " $func_resolve_sysroot_result"
+	  done
+
+	  if test "$link_all_deplibs" != no; then
+	    # Add the search paths of all dependency libraries
+	    for deplib in $dependency_libs; do
+	      path=
+	      case $deplib in
+	      -L*) path="$deplib" ;;
+	      *.la)
+	        func_resolve_sysroot "$deplib"
+	        deplib=$func_resolve_sysroot_result
+	        func_dirname "$deplib" "" "."
+		dir=$func_dirname_result
+		# We need an absolute path.
+		case $dir in
+		[\\/]* | [A-Za-z]:[\\/]*) absdir="$dir" ;;
+		*)
+		  absdir=`cd "$dir" && pwd`
+		  if test -z "$absdir"; then
+		    func_warning "cannot determine absolute directory name of \`$dir'"
+		    absdir="$dir"
+		  fi
+		  ;;
+		esac
+		if $GREP "^installed=no" $deplib > /dev/null; then
+		case $host in
+		*-*-darwin*)
+		  depdepl=
+		  eval deplibrary_names=`${SED} -n -e 's/^library_names=\(.*\)$/\1/p' $deplib`
+		  if test -n "$deplibrary_names" ; then
+		    for tmp in $deplibrary_names ; do
+		      depdepl=$tmp
+		    done
+		    if test -f "$absdir/$objdir/$depdepl" ; then
+		      depdepl="$absdir/$objdir/$depdepl"
+		      darwin_install_name=`${OTOOL} -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'`
+                      if test -z "$darwin_install_name"; then
+                          darwin_install_name=`${OTOOL64} -L $depdepl  | awk '{if (NR == 2) {print $1;exit}}'`
+                      fi
+		      func_append compiler_flags " ${wl}-dylib_file ${wl}${darwin_install_name}:${depdepl}"
+		      func_append linker_flags " -dylib_file ${darwin_install_name}:${depdepl}"
+		      path=
+		    fi
+		  fi
+		  ;;
+		*)
+		  path="-L$absdir/$objdir"
+		  ;;
+		esac
+		else
+		  eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib`
+		  test -z "$libdir" && \
+		    func_fatal_error "\`$deplib' is not a valid libtool archive"
+		  test "$absdir" != "$libdir" && \
+		    func_warning "\`$deplib' seems to be moved"
+
+		  path="-L$absdir"
+		fi
+		;;
+	      esac
+	      case " $deplibs " in
+	      *" $path "*) ;;
+	      *) deplibs="$path $deplibs" ;;
+	      esac
+	    done
+	  fi # link_all_deplibs != no
+	fi # linkmode = lib
+      done # for deplib in $libs
+      if test "$pass" = link; then
+	if test "$linkmode" = "prog"; then
+	  compile_deplibs="$new_inherited_linker_flags $compile_deplibs"
+	  finalize_deplibs="$new_inherited_linker_flags $finalize_deplibs"
+	else
+	  compiler_flags="$compiler_flags "`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
+	fi
+      fi
+      dependency_libs="$newdependency_libs"
+      if test "$pass" = dlpreopen; then
+	# Link the dlpreopened libraries before other libraries
+	for deplib in $save_deplibs; do
+	  deplibs="$deplib $deplibs"
+	done
+      fi
+      if test "$pass" != dlopen; then
+	if test "$pass" != conv; then
+	  # Make sure lib_search_path contains only unique directories.
+	  lib_search_path=
+	  for dir in $newlib_search_path; do
+	    case "$lib_search_path " in
+	    *" $dir "*) ;;
+	    *) func_append lib_search_path " $dir" ;;
+	    esac
+	  done
+	  newlib_search_path=
+	fi
+
+	if test "$linkmode,$pass" != "prog,link"; then
+	  vars="deplibs"
+	else
+	  vars="compile_deplibs finalize_deplibs"
+	fi
+	for var in $vars dependency_libs; do
+	  # Add libraries to $var in reverse order
+	  eval tmp_libs=\"\$$var\"
+	  new_libs=
+	  for deplib in $tmp_libs; do
+	    # FIXME: Pedantically, this is the right thing to do, so
+	    #        that some nasty dependency loop isn't accidentally
+	    #        broken:
+	    #new_libs="$deplib $new_libs"
+	    # Pragmatically, this seems to cause very few problems in
+	    # practice:
+	    case $deplib in
+	    -L*) new_libs="$deplib $new_libs" ;;
+	    -R*) ;;
+	    *)
+	      # And here is the reason: when a library appears more
+	      # than once as an explicit dependence of a library, or
+	      # is implicitly linked in more than once by the
+	      # compiler, it is considered special, and multiple
+	      # occurrences thereof are not removed.  Compare this
+	      # with having the same library being listed as a
+	      # dependency of multiple other libraries: in this case,
+	      # we know (pedantically, we assume) the library does not
+	      # need to be listed more than once, so we keep only the
+	      # last copy.  This is not always right, but it is rare
+	      # enough that we require users that really mean to play
+	      # such unportable linking tricks to link the library
+	      # using -Wl,-lname, so that libtool does not consider it
+	      # for duplicate removal.
+	      case " $specialdeplibs " in
+	      *" $deplib "*) new_libs="$deplib $new_libs" ;;
+	      *)
+		case " $new_libs " in
+		*" $deplib "*) ;;
+		*) new_libs="$deplib $new_libs" ;;
+		esac
+		;;
+	      esac
+	      ;;
+	    esac
+	  done
+	  tmp_libs=
+	  for deplib in $new_libs; do
+	    case $deplib in
+	    -L*)
+	      case " $tmp_libs " in
+	      *" $deplib "*) ;;
+	      *) func_append tmp_libs " $deplib" ;;
+	      esac
+	      ;;
+	    *) func_append tmp_libs " $deplib" ;;
+	    esac
+	  done
+	  eval $var=\"$tmp_libs\"
+	done # for var
+      fi
+      # Last step: remove runtime libs from dependency_libs
+      # (they stay in deplibs)
+      tmp_libs=
+      for i in $dependency_libs ; do
+	case " $predeps $postdeps $compiler_lib_search_path " in
+	*" $i "*)
+	  i=""
+	  ;;
+	esac
+	if test -n "$i" ; then
+	  func_append tmp_libs " $i"
+	fi
+      done
+      dependency_libs=$tmp_libs
+    done # for pass
+    if test "$linkmode" = prog; then
+      dlfiles="$newdlfiles"
+    fi
+    if test "$linkmode" = prog || test "$linkmode" = lib; then
+      dlprefiles="$newdlprefiles"
+    fi
+
+    case $linkmode in
+    oldlib)
+      if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then
+	func_warning "\`-dlopen' is ignored for archives"
+      fi
+
+      case " $deplibs" in
+      *\ -l* | *\ -L*)
+	func_warning "\`-l' and \`-L' are ignored for archives" ;;
+      esac
+
+      test -n "$rpath" && \
+	func_warning "\`-rpath' is ignored for archives"
+
+      test -n "$xrpath" && \
+	func_warning "\`-R' is ignored for archives"
+
+      test -n "$vinfo" && \
+	func_warning "\`-version-info/-version-number' is ignored for archives"
+
+      test -n "$release" && \
+	func_warning "\`-release' is ignored for archives"
+
+      test -n "$export_symbols$export_symbols_regex" && \
+	func_warning "\`-export-symbols' is ignored for archives"
+
+      # Now set the variables for building old libraries.
+      build_libtool_libs=no
+      oldlibs="$output"
+      func_append objs "$old_deplibs"
+      ;;
+
+    lib)
+      # Make sure we only generate libraries of the form `libNAME.la'.
+      case $outputname in
+      lib*)
+	func_stripname 'lib' '.la' "$outputname"
+	name=$func_stripname_result
+	eval shared_ext=\"$shrext_cmds\"
+	eval libname=\"$libname_spec\"
+	;;
+      *)
+	test "$module" = no && \
+	  func_fatal_help "libtool library \`$output' must begin with \`lib'"
+
+	if test "$need_lib_prefix" != no; then
+	  # Add the "lib" prefix for modules if required
+	  func_stripname '' '.la' "$outputname"
+	  name=$func_stripname_result
+	  eval shared_ext=\"$shrext_cmds\"
+	  eval libname=\"$libname_spec\"
+	else
+	  func_stripname '' '.la' "$outputname"
+	  libname=$func_stripname_result
+	fi
+	;;
+      esac
+
+      if test -n "$objs"; then
+	if test "$deplibs_check_method" != pass_all; then
+	  func_fatal_error "cannot build libtool library \`$output' from non-libtool objects on this host:$objs"
+	else
+	  echo
+	  $ECHO "*** Warning: Linking the shared library $output against the non-libtool"
+	  $ECHO "*** objects $objs is not portable!"
+	  func_append libobjs " $objs"
+	fi
+      fi
+
+      test "$dlself" != no && \
+	func_warning "\`-dlopen self' is ignored for libtool libraries"
+
+      set dummy $rpath
+      shift
+      test "$#" -gt 1 && \
+	func_warning "ignoring multiple \`-rpath's for a libtool library"
+
+      install_libdir="$1"
+
+      oldlibs=
+      if test -z "$rpath"; then
+	if test "$build_libtool_libs" = yes; then
+	  # Building a libtool convenience library.
+	  # Some compilers have problems with a `.al' extension so
+	  # convenience libraries should have the same extension an
+	  # archive normally would.
+	  oldlibs="$output_objdir/$libname.$libext $oldlibs"
+	  build_libtool_libs=convenience
+	  build_old_libs=yes
+	fi
+
+	test -n "$vinfo" && \
+	  func_warning "\`-version-info/-version-number' is ignored for convenience libraries"
+
+	test -n "$release" && \
+	  func_warning "\`-release' is ignored for convenience libraries"
+      else
+
+	# Parse the version information argument.
+	save_ifs="$IFS"; IFS=':'
+	set dummy $vinfo 0 0 0
+	shift
+	IFS="$save_ifs"
+
+	test -n "$7" && \
+	  func_fatal_help "too many parameters to \`-version-info'"
+
+	# convert absolute version numbers to libtool ages
+	# this retains compatibility with .la files and attempts
+	# to make the code below a bit more comprehensible
+
+	case $vinfo_number in
+	yes)
+	  number_major="$1"
+	  number_minor="$2"
+	  number_revision="$3"
+	  #
+	  # There are really only two kinds -- those that
+	  # use the current revision as the major version
+	  # and those that subtract age and use age as
+	  # a minor version.  But, then there is irix
+	  # which has an extra 1 added just for fun
+	  #
+	  case $version_type in
+	  # correct linux to gnu/linux during the next big refactor
+	  darwin|linux|osf|windows|none)
+	    func_arith $number_major + $number_minor
+	    current=$func_arith_result
+	    age="$number_minor"
+	    revision="$number_revision"
+	    ;;
+	  freebsd-aout|freebsd-elf|qnx|sunos)
+	    current="$number_major"
+	    revision="$number_minor"
+	    age="0"
+	    ;;
+	  irix|nonstopux)
+	    func_arith $number_major + $number_minor
+	    current=$func_arith_result
+	    age="$number_minor"
+	    revision="$number_minor"
+	    lt_irix_increment=no
+	    ;;
+	  *)
+	    func_fatal_configuration "$modename: unknown library version type \`$version_type'"
+	    ;;
+	  esac
+	  ;;
+	no)
+	  current="$1"
+	  revision="$2"
+	  age="$3"
+	  ;;
+	esac
+
+	# Check that each of the things are valid numbers.
+	case $current in
+	0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;;
+	*)
+	  func_error "CURRENT \`$current' must be a nonnegative integer"
+	  func_fatal_error "\`$vinfo' is not valid version information"
+	  ;;
+	esac
+
+	case $revision in
+	0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;;
+	*)
+	  func_error "REVISION \`$revision' must be a nonnegative integer"
+	  func_fatal_error "\`$vinfo' is not valid version information"
+	  ;;
+	esac
+
+	case $age in
+	0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;;
+	*)
+	  func_error "AGE \`$age' must be a nonnegative integer"
+	  func_fatal_error "\`$vinfo' is not valid version information"
+	  ;;
+	esac
+
+	if test "$age" -gt "$current"; then
+	  func_error "AGE \`$age' is greater than the current interface number \`$current'"
+	  func_fatal_error "\`$vinfo' is not valid version information"
+	fi
+
+	# Calculate the version variables.
+	major=
+	versuffix=
+	verstring=
+	case $version_type in
+	none) ;;
+
+	darwin)
+	  # Like Linux, but with the current version available in
+	  # verstring for coding it into the library header
+	  func_arith $current - $age
+	  major=.$func_arith_result
+	  versuffix="$major.$age.$revision"
+	  # Darwin ld doesn't like 0 for these options...
+	  func_arith $current + 1
+	  minor_current=$func_arith_result
+	  xlcverstring="${wl}-compatibility_version ${wl}$minor_current ${wl}-current_version ${wl}$minor_current.$revision"
+	  verstring="-compatibility_version $minor_current -current_version $minor_current.$revision"
+	  ;;
+
+	freebsd-aout)
+	  major=".$current"
+	  versuffix=".$current.$revision";
+	  ;;
+
+	freebsd-elf)
+	  major=".$current"
+	  versuffix=".$current"
+	  ;;
+
+	irix | nonstopux)
+	  if test "X$lt_irix_increment" = "Xno"; then
+	    func_arith $current - $age
+	  else
+	    func_arith $current - $age + 1
+	  fi
+	  major=$func_arith_result
+
+	  case $version_type in
+	    nonstopux) verstring_prefix=nonstopux ;;
+	    *)         verstring_prefix=sgi ;;
+	  esac
+	  verstring="$verstring_prefix$major.$revision"
+
+	  # Add in all the interfaces that we are compatible with.
+	  loop=$revision
+	  while test "$loop" -ne 0; do
+	    func_arith $revision - $loop
+	    iface=$func_arith_result
+	    func_arith $loop - 1
+	    loop=$func_arith_result
+	    verstring="$verstring_prefix$major.$iface:$verstring"
+	  done
+
+	  # Before this point, $major must not contain `.'.
+	  major=.$major
+	  versuffix="$major.$revision"
+	  ;;
+
+	linux) # correct to gnu/linux during the next big refactor
+	  func_arith $current - $age
+	  major=.$func_arith_result
+	  versuffix="$major.$age.$revision"
+	  ;;
+
+	osf)
+	  func_arith $current - $age
+	  major=.$func_arith_result
+	  versuffix=".$current.$age.$revision"
+	  verstring="$current.$age.$revision"
+
+	  # Add in all the interfaces that we are compatible with.
+	  loop=$age
+	  while test "$loop" -ne 0; do
+	    func_arith $current - $loop
+	    iface=$func_arith_result
+	    func_arith $loop - 1
+	    loop=$func_arith_result
+	    verstring="$verstring:${iface}.0"
+	  done
+
+	  # Make executables depend on our current version.
+	  func_append verstring ":${current}.0"
+	  ;;
+
+	qnx)
+	  major=".$current"
+	  versuffix=".$current"
+	  ;;
+
+	sunos)
+	  major=".$current"
+	  versuffix=".$current.$revision"
+	  ;;
+
+	windows)
+	  # Use '-' rather than '.', since we only want one
+	  # extension on DOS 8.3 filesystems.
+	  func_arith $current - $age
+	  major=$func_arith_result
+	  versuffix="-$major"
+	  ;;
+
+	*)
+	  func_fatal_configuration "unknown library version type \`$version_type'"
+	  ;;
+	esac
+
+	# Clear the version info if we defaulted, and they specified a release.
+	if test -z "$vinfo" && test -n "$release"; then
+	  major=
+	  case $version_type in
+	  darwin)
+	    # we can't check for "0.0" in archive_cmds due to quoting
+	    # problems, so we reset it completely
+	    verstring=
+	    ;;
+	  *)
+	    verstring="0.0"
+	    ;;
+	  esac
+	  if test "$need_version" = no; then
+	    versuffix=
+	  else
+	    versuffix=".0.0"
+	  fi
+	fi
+
+	# Remove version info from name if versioning should be avoided
+	if test "$avoid_version" = yes && test "$need_version" = no; then
+	  major=
+	  versuffix=
+	  verstring=""
+	fi
+
+	# Check to see if the archive will have undefined symbols.
+	if test "$allow_undefined" = yes; then
+	  if test "$allow_undefined_flag" = unsupported; then
+	    func_warning "undefined symbols not allowed in $host shared libraries"
+	    build_libtool_libs=no
+	    build_old_libs=yes
+	  fi
+	else
+	  # Don't allow undefined symbols.
+	  allow_undefined_flag="$no_undefined_flag"
+	fi
+
+      fi
+
+      func_generate_dlsyms "$libname" "$libname" "yes"
+      func_append libobjs " $symfileobj"
+      test "X$libobjs" = "X " && libobjs=
+
+      if test "$opt_mode" != relink; then
+	# Remove our outputs, but don't remove object files since they
+	# may have been created when compiling PIC objects.
+	removelist=
+	tempremovelist=`$ECHO "$output_objdir/*"`
+	for p in $tempremovelist; do
+	  case $p in
+	    *.$objext | *.gcno)
+	       ;;
+	    $output_objdir/$outputname | $output_objdir/$libname.* | $output_objdir/${libname}${release}.*)
+	       if test "X$precious_files_regex" != "X"; then
+		 if $ECHO "$p" | $EGREP -e "$precious_files_regex" >/dev/null 2>&1
+		 then
+		   continue
+		 fi
+	       fi
+	       func_append removelist " $p"
+	       ;;
+	    *) ;;
+	  esac
+	done
+	test -n "$removelist" && \
+	  func_show_eval "${RM}r \$removelist"
+      fi
+
+      # Now set the variables for building old libraries.
+      if test "$build_old_libs" = yes && test "$build_libtool_libs" != convenience ; then
+	func_append oldlibs " $output_objdir/$libname.$libext"
+
+	# Transform .lo files to .o files.
+	oldobjs="$objs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.${libext}$/d; $lo2o" | $NL2SP`
+      fi
+
+      # Eliminate all temporary directories.
+      #for path in $notinst_path; do
+      #	lib_search_path=`$ECHO "$lib_search_path " | $SED "s% $path % %g"`
+      #	deplibs=`$ECHO "$deplibs " | $SED "s% -L$path % %g"`
+      #	dependency_libs=`$ECHO "$dependency_libs " | $SED "s% -L$path % %g"`
+      #done
+
+      if test -n "$xrpath"; then
+	# If the user specified any rpath flags, then add them.
+	temp_xrpath=
+	for libdir in $xrpath; do
+	  func_replace_sysroot "$libdir"
+	  func_append temp_xrpath " -R$func_replace_sysroot_result"
+	  case "$finalize_rpath " in
+	  *" $libdir "*) ;;
+	  *) func_append finalize_rpath " $libdir" ;;
+	  esac
+	done
+	if test "$hardcode_into_libs" != yes || test "$build_old_libs" = yes; then
+	  dependency_libs="$temp_xrpath $dependency_libs"
+	fi
+      fi
+
+      # Make sure dlfiles contains only unique files that won't be dlpreopened
+      old_dlfiles="$dlfiles"
+      dlfiles=
+      for lib in $old_dlfiles; do
+	case " $dlprefiles $dlfiles " in
+	*" $lib "*) ;;
+	*) func_append dlfiles " $lib" ;;
+	esac
+      done
+
+      # Make sure dlprefiles contains only unique files
+      old_dlprefiles="$dlprefiles"
+      dlprefiles=
+      for lib in $old_dlprefiles; do
+	case "$dlprefiles " in
+	*" $lib "*) ;;
+	*) func_append dlprefiles " $lib" ;;
+	esac
+      done
+
+      if test "$build_libtool_libs" = yes; then
+	if test -n "$rpath"; then
+	  case $host in
+	  *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos* | *-cegcc* | *-*-haiku*)
+	    # these systems don't actually have a c library (as such)!
+	    ;;
+	  *-*-rhapsody* | *-*-darwin1.[012])
+	    # Rhapsody C library is in the System framework
+	    func_append deplibs " System.ltframework"
+	    ;;
+	  *-*-netbsd*)
+	    # Don't link with libc until the a.out ld.so is fixed.
+	    ;;
+	  *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*)
+	    # Do not include libc due to us having libc/libc_r.
+	    ;;
+	  *-*-sco3.2v5* | *-*-sco5v6*)
+	    # Causes problems with __ctype
+	    ;;
+	  *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*)
+	    # Compiler inserts libc in the correct place for threads to work
+	    ;;
+	  *)
+	    # Add libc to deplibs on all other systems if necessary.
+	    if test "$build_libtool_need_lc" = "yes"; then
+	      func_append deplibs " -lc"
+	    fi
+	    ;;
+	  esac
+	fi
+
+	# Transform deplibs into only deplibs that can be linked in shared.
+	name_save=$name
+	libname_save=$libname
+	release_save=$release
+	versuffix_save=$versuffix
+	major_save=$major
+	# I'm not sure if I'm treating the release correctly.  I think
+	# release should show up in the -l (ie -lgmp5) so we don't want to
+	# add it in twice.  Is that correct?
+	release=""
+	versuffix=""
+	major=""
+	newdeplibs=
+	droppeddeps=no
+	case $deplibs_check_method in
+	pass_all)
+	  # Don't check for shared/static.  Everything works.
+	  # This might be a little naive.  We might want to check
+	  # whether the library exists or not.  But this is on
+	  # osf3 & osf4 and I'm not really sure... Just
+	  # implementing what was already the behavior.
+	  newdeplibs=$deplibs
+	  ;;
+	test_compile)
+	  # This code stresses the "libraries are programs" paradigm to its
+	  # limits. Maybe even breaks it.  We compile a program, linking it
+	  # against the deplibs as a proxy for the library.  Then we can check
+	  # whether they linked in statically or dynamically with ldd.
+	  $opt_dry_run || $RM conftest.c
+	  cat > conftest.c <<EOF
+	  int main() { return 0; }
+EOF
+	  $opt_dry_run || $RM conftest
+	  if $LTCC $LTCFLAGS -o conftest conftest.c $deplibs; then
+	    ldd_output=`ldd conftest`
+	    for i in $deplibs; do
+	      case $i in
+	      -l*)
+		func_stripname -l '' "$i"
+		name=$func_stripname_result
+		if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
+		  case " $predeps $postdeps " in
+		  *" $i "*)
+		    func_append newdeplibs " $i"
+		    i=""
+		    ;;
+		  esac
+		fi
+		if test -n "$i" ; then
+		  libname=`eval "\\$ECHO \"$libname_spec\""`
+		  deplib_matches=`eval "\\$ECHO \"$library_names_spec\""`
+		  set dummy $deplib_matches; shift
+		  deplib_match=$1
+		  if test `expr "$ldd_output" : ".*$deplib_match"` -ne 0 ; then
+		    func_append newdeplibs " $i"
+		  else
+		    droppeddeps=yes
+		    echo
+		    $ECHO "*** Warning: dynamic linker does not accept needed library $i."
+		    echo "*** I have the capability to make that library automatically link in when"
+		    echo "*** you link to this library.  But I can only do this if you have a"
+		    echo "*** shared version of the library, which I believe you do not have"
+		    echo "*** because a test_compile did reveal that the linker did not use it for"
+		    echo "*** its dynamic dependency list that programs get resolved with at runtime."
+		  fi
+		fi
+		;;
+	      *)
+		func_append newdeplibs " $i"
+		;;
+	      esac
+	    done
+	  else
+	    # Error occurred in the first compile.  Let's try to salvage
+	    # the situation: Compile a separate program for each library.
+	    for i in $deplibs; do
+	      case $i in
+	      -l*)
+		func_stripname -l '' "$i"
+		name=$func_stripname_result
+		$opt_dry_run || $RM conftest
+		if $LTCC $LTCFLAGS -o conftest conftest.c $i; then
+		  ldd_output=`ldd conftest`
+		  if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
+		    case " $predeps $postdeps " in
+		    *" $i "*)
+		      func_append newdeplibs " $i"
+		      i=""
+		      ;;
+		    esac
+		  fi
+		  if test -n "$i" ; then
+		    libname=`eval "\\$ECHO \"$libname_spec\""`
+		    deplib_matches=`eval "\\$ECHO \"$library_names_spec\""`
+		    set dummy $deplib_matches; shift
+		    deplib_match=$1
+		    if test `expr "$ldd_output" : ".*$deplib_match"` -ne 0 ; then
+		      func_append newdeplibs " $i"
+		    else
+		      droppeddeps=yes
+		      echo
+		      $ECHO "*** Warning: dynamic linker does not accept needed library $i."
+		      echo "*** I have the capability to make that library automatically link in when"
+		      echo "*** you link to this library.  But I can only do this if you have a"
+		      echo "*** shared version of the library, which you do not appear to have"
+		      echo "*** because a test_compile did reveal that the linker did not use this one"
+		      echo "*** as a dynamic dependency that programs can get resolved with at runtime."
+		    fi
+		  fi
+		else
+		  droppeddeps=yes
+		  echo
+		  $ECHO "*** Warning!  Library $i is needed by this library but I was not able to"
+		  echo "*** make it link in!  You will probably need to install it or some"
+		  echo "*** library that it depends on before this library will be fully"
+		  echo "*** functional.  Installing it before continuing would be even better."
+		fi
+		;;
+	      *)
+		func_append newdeplibs " $i"
+		;;
+	      esac
+	    done
+	  fi
+	  ;;
+	file_magic*)
+	  set dummy $deplibs_check_method; shift
+	  file_magic_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"`
+	  for a_deplib in $deplibs; do
+	    case $a_deplib in
+	    -l*)
+	      func_stripname -l '' "$a_deplib"
+	      name=$func_stripname_result
+	      if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
+		case " $predeps $postdeps " in
+		*" $a_deplib "*)
+		  func_append newdeplibs " $a_deplib"
+		  a_deplib=""
+		  ;;
+		esac
+	      fi
+	      if test -n "$a_deplib" ; then
+		libname=`eval "\\$ECHO \"$libname_spec\""`
+		if test -n "$file_magic_glob"; then
+		  libnameglob=`func_echo_all "$libname" | $SED -e $file_magic_glob`
+		else
+		  libnameglob=$libname
+		fi
+		test "$want_nocaseglob" = yes && nocaseglob=`shopt -p nocaseglob`
+		for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do
+		  if test "$want_nocaseglob" = yes; then
+		    shopt -s nocaseglob
+		    potential_libs=`ls $i/$libnameglob[.-]* 2>/dev/null`
+		    $nocaseglob
+		  else
+		    potential_libs=`ls $i/$libnameglob[.-]* 2>/dev/null`
+		  fi
+		  for potent_lib in $potential_libs; do
+		      # Follow soft links.
+		      if ls -lLd "$potent_lib" 2>/dev/null |
+			 $GREP " -> " >/dev/null; then
+			continue
+		      fi
+		      # The statement above tries to avoid entering an
+		      # endless loop below, in case of cyclic links.
+		      # We might still enter an endless loop, since a link
+		      # loop can be closed while we follow links,
+		      # but so what?
+		      potlib="$potent_lib"
+		      while test -h "$potlib" 2>/dev/null; do
+			potliblink=`ls -ld $potlib | ${SED} 's/.* -> //'`
+			case $potliblink in
+			[\\/]* | [A-Za-z]:[\\/]*) potlib="$potliblink";;
+			*) potlib=`$ECHO "$potlib" | $SED 's,[^/]*$,,'`"$potliblink";;
+			esac
+		      done
+		      if eval $file_magic_cmd \"\$potlib\" 2>/dev/null |
+			 $SED -e 10q |
+			 $EGREP "$file_magic_regex" > /dev/null; then
+			func_append newdeplibs " $a_deplib"
+			a_deplib=""
+			break 2
+		      fi
+		  done
+		done
+	      fi
+	      if test -n "$a_deplib" ; then
+		droppeddeps=yes
+		echo
+		$ECHO "*** Warning: linker path does not have real file for library $a_deplib."
+		echo "*** I have the capability to make that library automatically link in when"
+		echo "*** you link to this library.  But I can only do this if you have a"
+		echo "*** shared version of the library, which you do not appear to have"
+		echo "*** because I did check the linker path looking for a file starting"
+		if test -z "$potlib" ; then
+		  $ECHO "*** with $libname but no candidates were found. (...for file magic test)"
+		else
+		  $ECHO "*** with $libname and none of the candidates passed a file format test"
+		  $ECHO "*** using a file magic. Last file checked: $potlib"
+		fi
+	      fi
+	      ;;
+	    *)
+	      # Add a -L argument.
+	      func_append newdeplibs " $a_deplib"
+	      ;;
+	    esac
+	  done # Gone through all deplibs.
+	  ;;
+	match_pattern*)
+	  set dummy $deplibs_check_method; shift
+	  match_pattern_regex=`expr "$deplibs_check_method" : "$1 \(.*\)"`
+	  for a_deplib in $deplibs; do
+	    case $a_deplib in
+	    -l*)
+	      func_stripname -l '' "$a_deplib"
+	      name=$func_stripname_result
+	      if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
+		case " $predeps $postdeps " in
+		*" $a_deplib "*)
+		  func_append newdeplibs " $a_deplib"
+		  a_deplib=""
+		  ;;
+		esac
+	      fi
+	      if test -n "$a_deplib" ; then
+		libname=`eval "\\$ECHO \"$libname_spec\""`
+		for i in $lib_search_path $sys_lib_search_path $shlib_search_path; do
+		  potential_libs=`ls $i/$libname[.-]* 2>/dev/null`
+		  for potent_lib in $potential_libs; do
+		    potlib="$potent_lib" # see symlink-check above in file_magic test
+		    if eval "\$ECHO \"$potent_lib\"" 2>/dev/null | $SED 10q | \
+		       $EGREP "$match_pattern_regex" > /dev/null; then
+		      func_append newdeplibs " $a_deplib"
+		      a_deplib=""
+		      break 2
+		    fi
+		  done
+		done
+	      fi
+	      if test -n "$a_deplib" ; then
+		droppeddeps=yes
+		echo
+		$ECHO "*** Warning: linker path does not have real file for library $a_deplib."
+		echo "*** I have the capability to make that library automatically link in when"
+		echo "*** you link to this library.  But I can only do this if you have a"
+		echo "*** shared version of the library, which you do not appear to have"
+		echo "*** because I did check the linker path looking for a file starting"
+		if test -z "$potlib" ; then
+		  $ECHO "*** with $libname but no candidates were found. (...for regex pattern test)"
+		else
+		  $ECHO "*** with $libname and none of the candidates passed a file format test"
+		  $ECHO "*** using a regex pattern. Last file checked: $potlib"
+		fi
+	      fi
+	      ;;
+	    *)
+	      # Add a -L argument.
+	      func_append newdeplibs " $a_deplib"
+	      ;;
+	    esac
+	  done # Gone through all deplibs.
+	  ;;
+	none | unknown | *)
+	  newdeplibs=""
+	  tmp_deplibs=`$ECHO " $deplibs" | $SED 's/ -lc$//; s/ -[LR][^ ]*//g'`
+	  if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then
+	    for i in $predeps $postdeps ; do
+	      # can't use Xsed below, because $i might contain '/'
+	      tmp_deplibs=`$ECHO " $tmp_deplibs" | $SED "s,$i,,"`
+	    done
+	  fi
+	  case $tmp_deplibs in
+	  *[!\	\ ]*)
+	    echo
+	    if test "X$deplibs_check_method" = "Xnone"; then
+	      echo "*** Warning: inter-library dependencies are not supported in this platform."
+	    else
+	      echo "*** Warning: inter-library dependencies are not known to be supported."
+	    fi
+	    echo "*** All declared inter-library dependencies are being dropped."
+	    droppeddeps=yes
+	    ;;
+	  esac
+	  ;;
+	esac
+	versuffix=$versuffix_save
+	major=$major_save
+	release=$release_save
+	libname=$libname_save
+	name=$name_save
+
+	case $host in
+	*-*-rhapsody* | *-*-darwin1.[012])
+	  # On Rhapsody replace the C library with the System framework
+	  newdeplibs=`$ECHO " $newdeplibs" | $SED 's/ -lc / System.ltframework /'`
+	  ;;
+	esac
+
+	if test "$droppeddeps" = yes; then
+	  if test "$module" = yes; then
+	    echo
+	    echo "*** Warning: libtool could not satisfy all declared inter-library"
+	    $ECHO "*** dependencies of module $libname.  Therefore, libtool will create"
+	    echo "*** a static module, that should work as long as the dlopening"
+	    echo "*** application is linked with the -dlopen flag."
+	    if test -z "$global_symbol_pipe"; then
+	      echo
+	      echo "*** However, this would only work if libtool was able to extract symbol"
+	      echo "*** lists from a program, using \`nm' or equivalent, but libtool could"
+	      echo "*** not find such a program.  So, this module is probably useless."
+	      echo "*** \`nm' from GNU binutils and a full rebuild may help."
+	    fi
+	    if test "$build_old_libs" = no; then
+	      oldlibs="$output_objdir/$libname.$libext"
+	      build_libtool_libs=module
+	      build_old_libs=yes
+	    else
+	      build_libtool_libs=no
+	    fi
+	  else
+	    echo "*** The inter-library dependencies that have been dropped here will be"
+	    echo "*** automatically added whenever a program is linked with this library"
+	    echo "*** or is declared to -dlopen it."
+
+	    if test "$allow_undefined" = no; then
+	      echo
+	      echo "*** Since this library must not contain undefined symbols,"
+	      echo "*** because either the platform does not support them or"
+	      echo "*** it was explicitly requested with -no-undefined,"
+	      echo "*** libtool will only create a static version of it."
+	      if test "$build_old_libs" = no; then
+		oldlibs="$output_objdir/$libname.$libext"
+		build_libtool_libs=module
+		build_old_libs=yes
+	      else
+		build_libtool_libs=no
+	      fi
+	    fi
+	  fi
+	fi
+	# Done checking deplibs!
+	deplibs=$newdeplibs
+      fi
+      # Time to change all our "foo.ltframework" stuff back to "-framework foo"
+      case $host in
+	*-*-darwin*)
+	  newdeplibs=`$ECHO " $newdeplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
+	  new_inherited_linker_flags=`$ECHO " $new_inherited_linker_flags" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
+	  deplibs=`$ECHO " $deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
+	  ;;
+      esac
+
+      # move library search paths that coincide with paths to not yet
+      # installed libraries to the beginning of the library search list
+      new_libs=
+      for path in $notinst_path; do
+	case " $new_libs " in
+	*" -L$path/$objdir "*) ;;
+	*)
+	  case " $deplibs " in
+	  *" -L$path/$objdir "*)
+	    func_append new_libs " -L$path/$objdir" ;;
+	  esac
+	  ;;
+	esac
+      done
+      for deplib in $deplibs; do
+	case $deplib in
+	-L*)
+	  case " $new_libs " in
+	  *" $deplib "*) ;;
+	  *) func_append new_libs " $deplib" ;;
+	  esac
+	  ;;
+	*) func_append new_libs " $deplib" ;;
+	esac
+      done
+      deplibs="$new_libs"
+
+      # All the library-specific variables (install_libdir is set above).
+      library_names=
+      old_library=
+      dlname=
+
+      # Test again, we may have decided not to build it any more
+      if test "$build_libtool_libs" = yes; then
+	# Remove ${wl} instances when linking with ld.
+	# FIXME: should test the right _cmds variable.
+	case $archive_cmds in
+	  *\$LD\ *) wl= ;;
+        esac
+	if test "$hardcode_into_libs" = yes; then
+	  # Hardcode the library paths
+	  hardcode_libdirs=
+	  dep_rpath=
+	  rpath="$finalize_rpath"
+	  test "$opt_mode" != relink && rpath="$compile_rpath$rpath"
+	  for libdir in $rpath; do
+	    if test -n "$hardcode_libdir_flag_spec"; then
+	      if test -n "$hardcode_libdir_separator"; then
+		func_replace_sysroot "$libdir"
+		libdir=$func_replace_sysroot_result
+		if test -z "$hardcode_libdirs"; then
+		  hardcode_libdirs="$libdir"
+		else
+		  # Just accumulate the unique libdirs.
+		  case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in
+		  *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*)
+		    ;;
+		  *)
+		    func_append hardcode_libdirs "$hardcode_libdir_separator$libdir"
+		    ;;
+		  esac
+		fi
+	      else
+		eval flag=\"$hardcode_libdir_flag_spec\"
+		func_append dep_rpath " $flag"
+	      fi
+	    elif test -n "$runpath_var"; then
+	      case "$perm_rpath " in
+	      *" $libdir "*) ;;
+	      *) func_append perm_rpath " $libdir" ;;
+	      esac
+	    fi
+	  done
+	  # Substitute the hardcoded libdirs into the rpath.
+	  if test -n "$hardcode_libdir_separator" &&
+	     test -n "$hardcode_libdirs"; then
+	    libdir="$hardcode_libdirs"
+	    eval "dep_rpath=\"$hardcode_libdir_flag_spec\""
+	  fi
+	  if test -n "$runpath_var" && test -n "$perm_rpath"; then
+	    # We should set the runpath_var.
+	    rpath=
+	    for dir in $perm_rpath; do
+	      func_append rpath "$dir:"
+	    done
+	    eval "$runpath_var='$rpath\$$runpath_var'; export $runpath_var"
+	  fi
+	  test -n "$dep_rpath" && deplibs="$dep_rpath $deplibs"
+	fi
+
+	shlibpath="$finalize_shlibpath"
+	test "$opt_mode" != relink && shlibpath="$compile_shlibpath$shlibpath"
+	if test -n "$shlibpath"; then
+	  eval "$shlibpath_var='$shlibpath\$$shlibpath_var'; export $shlibpath_var"
+	fi
+
+	# Get the real and link names of the library.
+	eval shared_ext=\"$shrext_cmds\"
+	eval library_names=\"$library_names_spec\"
+	set dummy $library_names
+	shift
+	realname="$1"
+	shift
+
+	if test -n "$soname_spec"; then
+	  eval soname=\"$soname_spec\"
+	else
+	  soname="$realname"
+	fi
+	if test -z "$dlname"; then
+	  dlname=$soname
+	fi
+
+	lib="$output_objdir/$realname"
+	linknames=
+	for link
+	do
+	  func_append linknames " $link"
+	done
+
+	# Use standard objects if they are pic
+	test -z "$pic_flag" && libobjs=`$ECHO "$libobjs" | $SP2NL | $SED "$lo2o" | $NL2SP`
+	test "X$libobjs" = "X " && libobjs=
+
+	delfiles=
+	if test -n "$export_symbols" && test -n "$include_expsyms"; then
+	  $opt_dry_run || cp "$export_symbols" "$output_objdir/$libname.uexp"
+	  export_symbols="$output_objdir/$libname.uexp"
+	  func_append delfiles " $export_symbols"
+	fi
+
+	orig_export_symbols=
+	case $host_os in
+	cygwin* | mingw* | cegcc*)
+	  if test -n "$export_symbols" && test -z "$export_symbols_regex"; then
+	    # exporting using user supplied symfile
+	    if test "x`$SED 1q $export_symbols`" != xEXPORTS; then
+	      # and it's NOT already a .def file. Must figure out
+	      # which of the given symbols are data symbols and tag
+	      # them as such. So, trigger use of export_symbols_cmds.
+	      # export_symbols gets reassigned inside the "prepare
+	      # the list of exported symbols" if statement, so the
+	      # include_expsyms logic still works.
+	      orig_export_symbols="$export_symbols"
+	      export_symbols=
+	      always_export_symbols=yes
+	    fi
+	  fi
+	  ;;
+	esac
+
+	# Prepare the list of exported symbols
+	if test -z "$export_symbols"; then
+	  if test "$always_export_symbols" = yes || test -n "$export_symbols_regex"; then
+	    func_verbose "generating symbol list for \`$libname.la'"
+	    export_symbols="$output_objdir/$libname.exp"
+	    $opt_dry_run || $RM $export_symbols
+	    cmds=$export_symbols_cmds
+	    save_ifs="$IFS"; IFS='~'
+	    for cmd1 in $cmds; do
+	      IFS="$save_ifs"
+	      # Take the normal branch if the nm_file_list_spec branch
+	      # doesn't work or if tool conversion is not needed.
+	      case $nm_file_list_spec~$to_tool_file_cmd in
+		*~func_convert_file_noop | *~func_convert_file_msys_to_w32 | ~*)
+		  try_normal_branch=yes
+		  eval cmd=\"$cmd1\"
+		  func_len " $cmd"
+		  len=$func_len_result
+		  ;;
+		*)
+		  try_normal_branch=no
+		  ;;
+	      esac
+	      if test "$try_normal_branch" = yes \
+		 && { test "$len" -lt "$max_cmd_len" \
+		      || test "$max_cmd_len" -le -1; }
+	      then
+		func_show_eval "$cmd" 'exit $?'
+		skipped_export=false
+	      elif test -n "$nm_file_list_spec"; then
+		func_basename "$output"
+		output_la=$func_basename_result
+		save_libobjs=$libobjs
+		save_output=$output
+		output=${output_objdir}/${output_la}.nm
+		func_to_tool_file "$output"
+		libobjs=$nm_file_list_spec$func_to_tool_file_result
+		func_append delfiles " $output"
+		func_verbose "creating $NM input file list: $output"
+		for obj in $save_libobjs; do
+		  func_to_tool_file "$obj"
+		  $ECHO "$func_to_tool_file_result"
+		done > "$output"
+		eval cmd=\"$cmd1\"
+		func_show_eval "$cmd" 'exit $?'
+		output=$save_output
+		libobjs=$save_libobjs
+		skipped_export=false
+	      else
+		# The command line is too long to execute in one step.
+		func_verbose "using reloadable object file for export list..."
+		skipped_export=:
+		# Break out early, otherwise skipped_export may be
+		# set to false by a later but shorter cmd.
+		break
+	      fi
+	    done
+	    IFS="$save_ifs"
+	    if test -n "$export_symbols_regex" && test "X$skipped_export" != "X:"; then
+	      func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"'
+	      func_show_eval '$MV "${export_symbols}T" "$export_symbols"'
+	    fi
+	  fi
+	fi
+
+	if test -n "$export_symbols" && test -n "$include_expsyms"; then
+	  tmp_export_symbols="$export_symbols"
+	  test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols"
+	  $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"'
+	fi
+
+	if test "X$skipped_export" != "X:" && test -n "$orig_export_symbols"; then
+	  # The given exports_symbols file has to be filtered, so filter it.
+	  func_verbose "filter symbol list for \`$libname.la' to tag DATA exports"
+	  # FIXME: $output_objdir/$libname.filter potentially contains lots of
+	  # 's' commands which not all seds can handle. GNU sed should be fine
+	  # though. Also, the filter scales superlinearly with the number of
+	  # global variables. join(1) would be nice here, but unfortunately
+	  # isn't a blessed tool.
+	  $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter
+	  func_append delfiles " $export_symbols $output_objdir/$libname.filter"
+	  export_symbols=$output_objdir/$libname.def
+	  $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols
+	fi
+
+	tmp_deplibs=
+	for test_deplib in $deplibs; do
+	  case " $convenience " in
+	  *" $test_deplib "*) ;;
+	  *)
+	    func_append tmp_deplibs " $test_deplib"
+	    ;;
+	  esac
+	done
+	deplibs="$tmp_deplibs"
+
+	if test -n "$convenience"; then
+	  if test -n "$whole_archive_flag_spec" &&
+	    test "$compiler_needs_object" = yes &&
+	    test -z "$libobjs"; then
+	    # extract the archives, so we have objects to list.
+	    # TODO: could optimize this to just extract one archive.
+	    whole_archive_flag_spec=
+	  fi
+	  if test -n "$whole_archive_flag_spec"; then
+	    save_libobjs=$libobjs
+	    eval libobjs=\"\$libobjs $whole_archive_flag_spec\"
+	    test "X$libobjs" = "X " && libobjs=
+	  else
+	    gentop="$output_objdir/${outputname}x"
+	    func_append generated " $gentop"
+
+	    func_extract_archives $gentop $convenience
+	    func_append libobjs " $func_extract_archives_result"
+	    test "X$libobjs" = "X " && libobjs=
+	  fi
+	fi
+
+	if test "$thread_safe" = yes && test -n "$thread_safe_flag_spec"; then
+	  eval flag=\"$thread_safe_flag_spec\"
+	  func_append linker_flags " $flag"
+	fi
+
+	# Make a backup of the uninstalled library when relinking
+	if test "$opt_mode" = relink; then
+	  $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}U && $MV $realname ${realname}U)' || exit $?
+	fi
+
+	# Do each of the archive commands.
+	if test "$module" = yes && test -n "$module_cmds" ; then
+	  if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then
+	    eval test_cmds=\"$module_expsym_cmds\"
+	    cmds=$module_expsym_cmds
+	  else
+	    eval test_cmds=\"$module_cmds\"
+	    cmds=$module_cmds
+	  fi
+	else
+	  if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then
+	    eval test_cmds=\"$archive_expsym_cmds\"
+	    cmds=$archive_expsym_cmds
+	  else
+	    eval test_cmds=\"$archive_cmds\"
+	    cmds=$archive_cmds
+	  fi
+	fi
+
+	if test "X$skipped_export" != "X:" &&
+	   func_len " $test_cmds" &&
+	   len=$func_len_result &&
+	   test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then
+	  :
+	else
+	  # The command line is too long to link in one step, link piecewise
+	  # or, if using GNU ld and skipped_export is not :, use a linker
+	  # script.
+
+	  # Save the value of $output and $libobjs because we want to
+	  # use them later.  If we have whole_archive_flag_spec, we
+	  # want to use save_libobjs as it was before
+	  # whole_archive_flag_spec was expanded, because we can't
+	  # assume the linker understands whole_archive_flag_spec.
+	  # This may have to be revisited, in case too many
+	  # convenience libraries get linked in and end up exceeding
+	  # the spec.
+	  if test -z "$convenience" || test -z "$whole_archive_flag_spec"; then
+	    save_libobjs=$libobjs
+	  fi
+	  save_output=$output
+	  func_basename "$output"
+	  output_la=$func_basename_result
+
+	  # Clear the reloadable object creation command queue and
+	  # initialize k to one.
+	  test_cmds=
+	  concat_cmds=
+	  objlist=
+	  last_robj=
+	  k=1
+
+	  if test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "$with_gnu_ld" = yes; then
+	    output=${output_objdir}/${output_la}.lnkscript
+	    func_verbose "creating GNU ld script: $output"
+	    echo 'INPUT (' > $output
+	    for obj in $save_libobjs
+	    do
+	      func_to_tool_file "$obj"
+	      $ECHO "$func_to_tool_file_result" >> $output
+	    done
+	    echo ')' >> $output
+	    func_append delfiles " $output"
+	    func_to_tool_file "$output"
+	    output=$func_to_tool_file_result
+	  elif test -n "$save_libobjs" && test "X$skipped_export" != "X:" && test "X$file_list_spec" != X; then
+	    output=${output_objdir}/${output_la}.lnk
+	    func_verbose "creating linker input file list: $output"
+	    : > $output
+	    set x $save_libobjs
+	    shift
+	    firstobj=
+	    if test "$compiler_needs_object" = yes; then
+	      firstobj="$1 "
+	      shift
+	    fi
+	    for obj
+	    do
+	      func_to_tool_file "$obj"
+	      $ECHO "$func_to_tool_file_result" >> $output
+	    done
+	    func_append delfiles " $output"
+	    func_to_tool_file "$output"
+	    output=$firstobj\"$file_list_spec$func_to_tool_file_result\"
+	  else
+	    if test -n "$save_libobjs"; then
+	      func_verbose "creating reloadable object files..."
+	      output=$output_objdir/$output_la-${k}.$objext
+	      eval test_cmds=\"$reload_cmds\"
+	      func_len " $test_cmds"
+	      len0=$func_len_result
+	      len=$len0
+
+	      # Loop over the list of objects to be linked.
+	      for obj in $save_libobjs
+	      do
+		func_len " $obj"
+		func_arith $len + $func_len_result
+		len=$func_arith_result
+		if test "X$objlist" = X ||
+		   test "$len" -lt "$max_cmd_len"; then
+		  func_append objlist " $obj"
+		else
+		  # The command $test_cmds is almost too long, add a
+		  # command to the queue.
+		  if test "$k" -eq 1 ; then
+		    # The first file doesn't have a previous command to add.
+		    reload_objs=$objlist
+		    eval concat_cmds=\"$reload_cmds\"
+		  else
+		    # All subsequent reloadable object files will link in
+		    # the last one created.
+		    reload_objs="$objlist $last_robj"
+		    eval concat_cmds=\"\$concat_cmds~$reload_cmds~\$RM $last_robj\"
+		  fi
+		  last_robj=$output_objdir/$output_la-${k}.$objext
+		  func_arith $k + 1
+		  k=$func_arith_result
+		  output=$output_objdir/$output_la-${k}.$objext
+		  objlist=" $obj"
+		  func_len " $last_robj"
+		  func_arith $len0 + $func_len_result
+		  len=$func_arith_result
+		fi
+	      done
+	      # Handle the remaining objects by creating one last
+	      # reloadable object file.  All subsequent reloadable object
+	      # files will link in the last one created.
+	      test -z "$concat_cmds" || concat_cmds=$concat_cmds~
+	      reload_objs="$objlist $last_robj"
+	      eval concat_cmds=\"\${concat_cmds}$reload_cmds\"
+	      if test -n "$last_robj"; then
+	        eval concat_cmds=\"\${concat_cmds}~\$RM $last_robj\"
+	      fi
+	      func_append delfiles " $output"
+
+	    else
+	      output=
+	    fi
+
+	    if ${skipped_export-false}; then
+	      func_verbose "generating symbol list for \`$libname.la'"
+	      export_symbols="$output_objdir/$libname.exp"
+	      $opt_dry_run || $RM $export_symbols
+	      libobjs=$output
+	      # Append the command to create the export file.
+	      test -z "$concat_cmds" || concat_cmds=$concat_cmds~
+	      eval concat_cmds=\"\$concat_cmds$export_symbols_cmds\"
+	      if test -n "$last_robj"; then
+		eval concat_cmds=\"\$concat_cmds~\$RM $last_robj\"
+	      fi
+	    fi
+
+	    test -n "$save_libobjs" &&
+	      func_verbose "creating a temporary reloadable object file: $output"
+
+	    # Loop through the commands generated above and execute them.
+	    save_ifs="$IFS"; IFS='~'
+	    for cmd in $concat_cmds; do
+	      IFS="$save_ifs"
+	      $opt_silent || {
+		  func_quote_for_expand "$cmd"
+		  eval "func_echo $func_quote_for_expand_result"
+	      }
+	      $opt_dry_run || eval "$cmd" || {
+		lt_exit=$?
+
+		# Restore the uninstalled library and exit
+		if test "$opt_mode" = relink; then
+		  ( cd "$output_objdir" && \
+		    $RM "${realname}T" && \
+		    $MV "${realname}U" "$realname" )
+		fi
+
+		exit $lt_exit
+	      }
+	    done
+	    IFS="$save_ifs"
+
+	    if test -n "$export_symbols_regex" && ${skipped_export-false}; then
+	      func_show_eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"'
+	      func_show_eval '$MV "${export_symbols}T" "$export_symbols"'
+	    fi
+	  fi
+
+          if ${skipped_export-false}; then
+	    if test -n "$export_symbols" && test -n "$include_expsyms"; then
+	      tmp_export_symbols="$export_symbols"
+	      test -n "$orig_export_symbols" && tmp_export_symbols="$orig_export_symbols"
+	      $opt_dry_run || eval '$ECHO "$include_expsyms" | $SP2NL >> "$tmp_export_symbols"'
+	    fi
+
+	    if test -n "$orig_export_symbols"; then
+	      # The given exports_symbols file has to be filtered, so filter it.
+	      func_verbose "filter symbol list for \`$libname.la' to tag DATA exports"
+	      # FIXME: $output_objdir/$libname.filter potentially contains lots of
+	      # 's' commands which not all seds can handle. GNU sed should be fine
+	      # though. Also, the filter scales superlinearly with the number of
+	      # global variables. join(1) would be nice here, but unfortunately
+	      # isn't a blessed tool.
+	      $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\(.*\)\([ \,].*\),s|^\1$|\1\2|,' < $export_symbols > $output_objdir/$libname.filter
+	      func_append delfiles " $export_symbols $output_objdir/$libname.filter"
+	      export_symbols=$output_objdir/$libname.def
+	      $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols
+	    fi
+	  fi
+
+	  libobjs=$output
+	  # Restore the value of output.
+	  output=$save_output
+
+	  if test -n "$convenience" && test -n "$whole_archive_flag_spec"; then
+	    eval libobjs=\"\$libobjs $whole_archive_flag_spec\"
+	    test "X$libobjs" = "X " && libobjs=
+	  fi
+	  # Expand the library linking commands again to reset the
+	  # value of $libobjs for piecewise linking.
+
+	  # Do each of the archive commands.
+	  if test "$module" = yes && test -n "$module_cmds" ; then
+	    if test -n "$export_symbols" && test -n "$module_expsym_cmds"; then
+	      cmds=$module_expsym_cmds
+	    else
+	      cmds=$module_cmds
+	    fi
+	  else
+	    if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then
+	      cmds=$archive_expsym_cmds
+	    else
+	      cmds=$archive_cmds
+	    fi
+	  fi
+	fi
+
+	if test -n "$delfiles"; then
+	  # Append the command to remove temporary files to $cmds.
+	  eval cmds=\"\$cmds~\$RM $delfiles\"
+	fi
+
+	# Add any objects from preloaded convenience libraries
+	if test -n "$dlprefiles"; then
+	  gentop="$output_objdir/${outputname}x"
+	  func_append generated " $gentop"
+
+	  func_extract_archives $gentop $dlprefiles
+	  func_append libobjs " $func_extract_archives_result"
+	  test "X$libobjs" = "X " && libobjs=
+	fi
+
+	save_ifs="$IFS"; IFS='~'
+	for cmd in $cmds; do
+	  IFS="$save_ifs"
+	  eval cmd=\"$cmd\"
+	  $opt_silent || {
+	    func_quote_for_expand "$cmd"
+	    eval "func_echo $func_quote_for_expand_result"
+	  }
+	  $opt_dry_run || eval "$cmd" || {
+	    lt_exit=$?
+
+	    # Restore the uninstalled library and exit
+	    if test "$opt_mode" = relink; then
+	      ( cd "$output_objdir" && \
+	        $RM "${realname}T" && \
+		$MV "${realname}U" "$realname" )
+	    fi
+
+	    exit $lt_exit
+	  }
+	done
+	IFS="$save_ifs"
+
+	# Restore the uninstalled library and exit
+	if test "$opt_mode" = relink; then
+	  $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}T && $MV $realname ${realname}T && $MV ${realname}U $realname)' || exit $?
+
+	  if test -n "$convenience"; then
+	    if test -z "$whole_archive_flag_spec"; then
+	      func_show_eval '${RM}r "$gentop"'
+	    fi
+	  fi
+
+	  exit $EXIT_SUCCESS
+	fi
+
+	# Create links to the real library.
+	for linkname in $linknames; do
+	  if test "$realname" != "$linkname"; then
+	    func_show_eval '(cd "$output_objdir" && $RM "$linkname" && $LN_S "$realname" "$linkname")' 'exit $?'
+	  fi
+	done
+
+	# If -module or -export-dynamic was specified, set the dlname.
+	if test "$module" = yes || test "$export_dynamic" = yes; then
+	  # On all known operating systems, these are identical.
+	  dlname="$soname"
+	fi
+      fi
+      ;;
+
+    obj)
+      if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then
+	func_warning "\`-dlopen' is ignored for objects"
+      fi
+
+      case " $deplibs" in
+      *\ -l* | *\ -L*)
+	func_warning "\`-l' and \`-L' are ignored for objects" ;;
+      esac
+
+      test -n "$rpath" && \
+	func_warning "\`-rpath' is ignored for objects"
+
+      test -n "$xrpath" && \
+	func_warning "\`-R' is ignored for objects"
+
+      test -n "$vinfo" && \
+	func_warning "\`-version-info' is ignored for objects"
+
+      test -n "$release" && \
+	func_warning "\`-release' is ignored for objects"
+
+      case $output in
+      *.lo)
+	test -n "$objs$old_deplibs" && \
+	  func_fatal_error "cannot build library object \`$output' from non-libtool objects"
+
+	libobj=$output
+	func_lo2o "$libobj"
+	obj=$func_lo2o_result
+	;;
+      *)
+	libobj=
+	obj="$output"
+	;;
+      esac
+
+      # Delete the old objects.
+      $opt_dry_run || $RM $obj $libobj
+
+      # Objects from convenience libraries.  This assumes
+      # single-version convenience libraries.  Whenever we create
+      # different ones for PIC/non-PIC, this we'll have to duplicate
+      # the extraction.
+      reload_conv_objs=
+      gentop=
+      # reload_cmds runs $LD directly, so let us get rid of
+      # -Wl from whole_archive_flag_spec and hope we can get by with
+      # turning comma into space..
+      wl=
+
+      if test -n "$convenience"; then
+	if test -n "$whole_archive_flag_spec"; then
+	  eval tmp_whole_archive_flags=\"$whole_archive_flag_spec\"
+	  reload_conv_objs=$reload_objs\ `$ECHO "$tmp_whole_archive_flags" | $SED 's|,| |g'`
+	else
+	  gentop="$output_objdir/${obj}x"
+	  func_append generated " $gentop"
+
+	  func_extract_archives $gentop $convenience
+	  reload_conv_objs="$reload_objs $func_extract_archives_result"
+	fi
+      fi
+
+      # If we're not building shared, we need to use non_pic_objs
+      test "$build_libtool_libs" != yes && libobjs="$non_pic_objects"
+
+      # Create the old-style object.
+      reload_objs="$objs$old_deplibs "`$ECHO "$libobjs" | $SP2NL | $SED "/\.${libext}$/d; /\.lib$/d; $lo2o" | $NL2SP`" $reload_conv_objs" ### testsuite: skip nested quoting test
+
+      output="$obj"
+      func_execute_cmds "$reload_cmds" 'exit $?'
+
+      # Exit if we aren't doing a library object file.
+      if test -z "$libobj"; then
+	if test -n "$gentop"; then
+	  func_show_eval '${RM}r "$gentop"'
+	fi
+
+	exit $EXIT_SUCCESS
+      fi
+
+      if test "$build_libtool_libs" != yes; then
+	if test -n "$gentop"; then
+	  func_show_eval '${RM}r "$gentop"'
+	fi
+
+	# Create an invalid libtool object if no PIC, so that we don't
+	# accidentally link it into a program.
+	# $show "echo timestamp > $libobj"
+	# $opt_dry_run || eval "echo timestamp > $libobj" || exit $?
+	exit $EXIT_SUCCESS
+      fi
+
+      if test -n "$pic_flag" || test "$pic_mode" != default; then
+	# Only do commands if we really have different PIC objects.
+	reload_objs="$libobjs $reload_conv_objs"
+	output="$libobj"
+	func_execute_cmds "$reload_cmds" 'exit $?'
+      fi
+
+      if test -n "$gentop"; then
+	func_show_eval '${RM}r "$gentop"'
+      fi
+
+      exit $EXIT_SUCCESS
+      ;;
+
+    prog)
+      case $host in
+	*cygwin*) func_stripname '' '.exe' "$output"
+	          output=$func_stripname_result.exe;;
+      esac
+      test -n "$vinfo" && \
+	func_warning "\`-version-info' is ignored for programs"
+
+      test -n "$release" && \
+	func_warning "\`-release' is ignored for programs"
+
+      test "$preload" = yes \
+        && test "$dlopen_support" = unknown \
+	&& test "$dlopen_self" = unknown \
+	&& test "$dlopen_self_static" = unknown && \
+	  func_warning "\`LT_INIT([dlopen])' not used. Assuming no dlopen support."
+
+      case $host in
+      *-*-rhapsody* | *-*-darwin1.[012])
+	# On Rhapsody replace the C library is the System framework
+	compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's/ -lc / System.ltframework /'`
+	finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's/ -lc / System.ltframework /'`
+	;;
+      esac
+
+      case $host in
+      *-*-darwin*)
+	# Don't allow lazy linking, it breaks C++ global constructors
+	# But is supposedly fixed on 10.4 or later (yay!).
+	if test "$tagname" = CXX ; then
+	  case ${MACOSX_DEPLOYMENT_TARGET-10.0} in
+	    10.[0123])
+	      func_append compile_command " ${wl}-bind_at_load"
+	      func_append finalize_command " ${wl}-bind_at_load"
+	    ;;
+	  esac
+	fi
+	# Time to change all our "foo.ltframework" stuff back to "-framework foo"
+	compile_deplibs=`$ECHO " $compile_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
+	finalize_deplibs=`$ECHO " $finalize_deplibs" | $SED 's% \([^ $]*\).ltframework% -framework \1%g'`
+	;;
+      esac
+
+
+      # move library search paths that coincide with paths to not yet
+      # installed libraries to the beginning of the library search list
+      new_libs=
+      for path in $notinst_path; do
+	case " $new_libs " in
+	*" -L$path/$objdir "*) ;;
+	*)
+	  case " $compile_deplibs " in
+	  *" -L$path/$objdir "*)
+	    func_append new_libs " -L$path/$objdir" ;;
+	  esac
+	  ;;
+	esac
+      done
+      for deplib in $compile_deplibs; do
+	case $deplib in
+	-L*)
+	  case " $new_libs " in
+	  *" $deplib "*) ;;
+	  *) func_append new_libs " $deplib" ;;
+	  esac
+	  ;;
+	*) func_append new_libs " $deplib" ;;
+	esac
+      done
+      compile_deplibs="$new_libs"
+
+
+      func_append compile_command " $compile_deplibs"
+      func_append finalize_command " $finalize_deplibs"
+
+      if test -n "$rpath$xrpath"; then
+	# If the user specified any rpath flags, then add them.
+	for libdir in $rpath $xrpath; do
+	  # This is the magic to use -rpath.
+	  case "$finalize_rpath " in
+	  *" $libdir "*) ;;
+	  *) func_append finalize_rpath " $libdir" ;;
+	  esac
+	done
+      fi
+
+      # Now hardcode the library paths
+      rpath=
+      hardcode_libdirs=
+      for libdir in $compile_rpath $finalize_rpath; do
+	if test -n "$hardcode_libdir_flag_spec"; then
+	  if test -n "$hardcode_libdir_separator"; then
+	    if test -z "$hardcode_libdirs"; then
+	      hardcode_libdirs="$libdir"
+	    else
+	      # Just accumulate the unique libdirs.
+	      case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in
+	      *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*)
+		;;
+	      *)
+		func_append hardcode_libdirs "$hardcode_libdir_separator$libdir"
+		;;
+	      esac
+	    fi
+	  else
+	    eval flag=\"$hardcode_libdir_flag_spec\"
+	    func_append rpath " $flag"
+	  fi
+	elif test -n "$runpath_var"; then
+	  case "$perm_rpath " in
+	  *" $libdir "*) ;;
+	  *) func_append perm_rpath " $libdir" ;;
+	  esac
+	fi
+	case $host in
+	*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*)
+	  testbindir=`${ECHO} "$libdir" | ${SED} -e 's*/lib$*/bin*'`
+	  case :$dllsearchpath: in
+	  *":$libdir:"*) ;;
+	  ::) dllsearchpath=$libdir;;
+	  *) func_append dllsearchpath ":$libdir";;
+	  esac
+	  case :$dllsearchpath: in
+	  *":$testbindir:"*) ;;
+	  ::) dllsearchpath=$testbindir;;
+	  *) func_append dllsearchpath ":$testbindir";;
+	  esac
+	  ;;
+	esac
+      done
+      # Substitute the hardcoded libdirs into the rpath.
+      if test -n "$hardcode_libdir_separator" &&
+	 test -n "$hardcode_libdirs"; then
+	libdir="$hardcode_libdirs"
+	eval rpath=\" $hardcode_libdir_flag_spec\"
+      fi
+      compile_rpath="$rpath"
+
+      rpath=
+      hardcode_libdirs=
+      for libdir in $finalize_rpath; do
+	if test -n "$hardcode_libdir_flag_spec"; then
+	  if test -n "$hardcode_libdir_separator"; then
+	    if test -z "$hardcode_libdirs"; then
+	      hardcode_libdirs="$libdir"
+	    else
+	      # Just accumulate the unique libdirs.
+	      case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in
+	      *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*)
+		;;
+	      *)
+		func_append hardcode_libdirs "$hardcode_libdir_separator$libdir"
+		;;
+	      esac
+	    fi
+	  else
+	    eval flag=\"$hardcode_libdir_flag_spec\"
+	    func_append rpath " $flag"
+	  fi
+	elif test -n "$runpath_var"; then
+	  case "$finalize_perm_rpath " in
+	  *" $libdir "*) ;;
+	  *) func_append finalize_perm_rpath " $libdir" ;;
+	  esac
+	fi
+      done
+      # Substitute the hardcoded libdirs into the rpath.
+      if test -n "$hardcode_libdir_separator" &&
+	 test -n "$hardcode_libdirs"; then
+	libdir="$hardcode_libdirs"
+	eval rpath=\" $hardcode_libdir_flag_spec\"
+      fi
+      finalize_rpath="$rpath"
+
+      if test -n "$libobjs" && test "$build_old_libs" = yes; then
+	# Transform all the library objects into standard objects.
+	compile_command=`$ECHO "$compile_command" | $SP2NL | $SED "$lo2o" | $NL2SP`
+	finalize_command=`$ECHO "$finalize_command" | $SP2NL | $SED "$lo2o" | $NL2SP`
+      fi
+
+      func_generate_dlsyms "$outputname" "@PROGRAM@" "no"
+
+      # template prelinking step
+      if test -n "$prelink_cmds"; then
+	func_execute_cmds "$prelink_cmds" 'exit $?'
+      fi
+
+      wrappers_required=yes
+      case $host in
+      *cegcc* | *mingw32ce*)
+        # Disable wrappers for cegcc and mingw32ce hosts, we are cross compiling anyway.
+        wrappers_required=no
+        ;;
+      *cygwin* | *mingw* )
+        if test "$build_libtool_libs" != yes; then
+          wrappers_required=no
+        fi
+        ;;
+      *)
+        if test "$need_relink" = no || test "$build_libtool_libs" != yes; then
+          wrappers_required=no
+        fi
+        ;;
+      esac
+      if test "$wrappers_required" = no; then
+	# Replace the output file specification.
+	compile_command=`$ECHO "$compile_command" | $SED 's%@OUTPUT@%'"$output"'%g'`
+	link_command="$compile_command$compile_rpath"
+
+	# We have no uninstalled library dependencies, so finalize right now.
+	exit_status=0
+	func_show_eval "$link_command" 'exit_status=$?'
+
+	if test -n "$postlink_cmds"; then
+	  func_to_tool_file "$output"
+	  postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'`
+	  func_execute_cmds "$postlink_cmds" 'exit $?'
+	fi
+
+	# Delete the generated files.
+	if test -f "$output_objdir/${outputname}S.${objext}"; then
+	  func_show_eval '$RM "$output_objdir/${outputname}S.${objext}"'
+	fi
+
+	exit $exit_status
+      fi
+
+      if test -n "$compile_shlibpath$finalize_shlibpath"; then
+	compile_command="$shlibpath_var=\"$compile_shlibpath$finalize_shlibpath\$$shlibpath_var\" $compile_command"
+      fi
+      if test -n "$finalize_shlibpath"; then
+	finalize_command="$shlibpath_var=\"$finalize_shlibpath\$$shlibpath_var\" $finalize_command"
+      fi
+
+      compile_var=
+      finalize_var=
+      if test -n "$runpath_var"; then
+	if test -n "$perm_rpath"; then
+	  # We should set the runpath_var.
+	  rpath=
+	  for dir in $perm_rpath; do
+	    func_append rpath "$dir:"
+	  done
+	  compile_var="$runpath_var=\"$rpath\$$runpath_var\" "
+	fi
+	if test -n "$finalize_perm_rpath"; then
+	  # We should set the runpath_var.
+	  rpath=
+	  for dir in $finalize_perm_rpath; do
+	    func_append rpath "$dir:"
+	  done
+	  finalize_var="$runpath_var=\"$rpath\$$runpath_var\" "
+	fi
+      fi
+
+      if test "$no_install" = yes; then
+	# We don't need to create a wrapper script.
+	link_command="$compile_var$compile_command$compile_rpath"
+	# Replace the output file specification.
+	link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output"'%g'`
+	# Delete the old output file.
+	$opt_dry_run || $RM $output
+	# Link the executable and exit
+	func_show_eval "$link_command" 'exit $?'
+
+	if test -n "$postlink_cmds"; then
+	  func_to_tool_file "$output"
+	  postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'`
+	  func_execute_cmds "$postlink_cmds" 'exit $?'
+	fi
+
+	exit $EXIT_SUCCESS
+      fi
+
+      if test "$hardcode_action" = relink; then
+	# Fast installation is not supported
+	link_command="$compile_var$compile_command$compile_rpath"
+	relink_command="$finalize_var$finalize_command$finalize_rpath"
+
+	func_warning "this platform does not like uninstalled shared libraries"
+	func_warning "\`$output' will be relinked during installation"
+      else
+	if test "$fast_install" != no; then
+	  link_command="$finalize_var$compile_command$finalize_rpath"
+	  if test "$fast_install" = yes; then
+	    relink_command=`$ECHO "$compile_var$compile_command$compile_rpath" | $SED 's%@OUTPUT@%\$progdir/\$file%g'`
+	  else
+	    # fast_install is set to needless
+	    relink_command=
+	  fi
+	else
+	  link_command="$compile_var$compile_command$compile_rpath"
+	  relink_command="$finalize_var$finalize_command$finalize_rpath"
+	fi
+      fi
+
+      # Replace the output file specification.
+      link_command=`$ECHO "$link_command" | $SED 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'`
+
+      # Delete the old output files.
+      $opt_dry_run || $RM $output $output_objdir/$outputname $output_objdir/lt-$outputname
+
+      func_show_eval "$link_command" 'exit $?'
+
+      if test -n "$postlink_cmds"; then
+	func_to_tool_file "$output_objdir/$outputname"
+	postlink_cmds=`func_echo_all "$postlink_cmds" | $SED -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g' -e 's%@TOOL_OUTPUT@%'"$func_to_tool_file_result"'%g'`
+	func_execute_cmds "$postlink_cmds" 'exit $?'
+      fi
+
+      # Now create the wrapper script.
+      func_verbose "creating $output"
+
+      # Quote the relink command for shipping.
+      if test -n "$relink_command"; then
+	# Preserve any variables that may affect compiler behavior
+	for var in $variables_saved_for_relink; do
+	  if eval test -z \"\${$var+set}\"; then
+	    relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command"
+	  elif eval var_value=\$$var; test -z "$var_value"; then
+	    relink_command="$var=; export $var; $relink_command"
+	  else
+	    func_quote_for_eval "$var_value"
+	    relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command"
+	  fi
+	done
+	relink_command="(cd `pwd`; $relink_command)"
+	relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"`
+      fi
+
+      # Only actually do things if not in dry run mode.
+      $opt_dry_run || {
+	# win32 will think the script is a binary if it has
+	# a .exe suffix, so we strip it off here.
+	case $output in
+	  *.exe) func_stripname '' '.exe' "$output"
+	         output=$func_stripname_result ;;
+	esac
+	# test for cygwin because mv fails w/o .exe extensions
+	case $host in
+	  *cygwin*)
+	    exeext=.exe
+	    func_stripname '' '.exe' "$outputname"
+	    outputname=$func_stripname_result ;;
+	  *) exeext= ;;
+	esac
+	case $host in
+	  *cygwin* | *mingw* )
+	    func_dirname_and_basename "$output" "" "."
+	    output_name=$func_basename_result
+	    output_path=$func_dirname_result
+	    cwrappersource="$output_path/$objdir/lt-$output_name.c"
+	    cwrapper="$output_path/$output_name.exe"
+	    $RM $cwrappersource $cwrapper
+	    trap "$RM $cwrappersource $cwrapper; exit $EXIT_FAILURE" 1 2 15
+
+	    func_emit_cwrapperexe_src > $cwrappersource
+
+	    # The wrapper executable is built using the $host compiler,
+	    # because it contains $host paths and files. If cross-
+	    # compiling, it, like the target executable, must be
+	    # executed on the $host or under an emulation environment.
+	    $opt_dry_run || {
+	      $LTCC $LTCFLAGS -o $cwrapper $cwrappersource
+	      $STRIP $cwrapper
+	    }
+
+	    # Now, create the wrapper script for func_source use:
+	    func_ltwrapper_scriptname $cwrapper
+	    $RM $func_ltwrapper_scriptname_result
+	    trap "$RM $func_ltwrapper_scriptname_result; exit $EXIT_FAILURE" 1 2 15
+	    $opt_dry_run || {
+	      # note: this script will not be executed, so do not chmod.
+	      if test "x$build" = "x$host" ; then
+		$cwrapper --lt-dump-script > $func_ltwrapper_scriptname_result
+	      else
+		func_emit_wrapper no > $func_ltwrapper_scriptname_result
+	      fi
+	    }
+	  ;;
+	  * )
+	    $RM $output
+	    trap "$RM $output; exit $EXIT_FAILURE" 1 2 15
+
+	    func_emit_wrapper no > $output
+	    chmod +x $output
+	  ;;
+	esac
+      }
+      exit $EXIT_SUCCESS
+      ;;
+    esac
+
+    # See if we need to build an old-fashioned archive.
+    for oldlib in $oldlibs; do
+
+      if test "$build_libtool_libs" = convenience; then
+	oldobjs="$libobjs_save $symfileobj"
+	addlibs="$convenience"
+	build_libtool_libs=no
+      else
+	if test "$build_libtool_libs" = module; then
+	  oldobjs="$libobjs_save"
+	  build_libtool_libs=no
+	else
+	  oldobjs="$old_deplibs $non_pic_objects"
+	  if test "$preload" = yes && test -f "$symfileobj"; then
+	    func_append oldobjs " $symfileobj"
+	  fi
+	fi
+	addlibs="$old_convenience"
+      fi
+
+      if test -n "$addlibs"; then
+	gentop="$output_objdir/${outputname}x"
+	func_append generated " $gentop"
+
+	func_extract_archives $gentop $addlibs
+	func_append oldobjs " $func_extract_archives_result"
+      fi
+
+      # Do each command in the archive commands.
+      if test -n "$old_archive_from_new_cmds" && test "$build_libtool_libs" = yes; then
+	cmds=$old_archive_from_new_cmds
+      else
+
+	# Add any objects from preloaded convenience libraries
+	if test -n "$dlprefiles"; then
+	  gentop="$output_objdir/${outputname}x"
+	  func_append generated " $gentop"
+
+	  func_extract_archives $gentop $dlprefiles
+	  func_append oldobjs " $func_extract_archives_result"
+	fi
+
+	# POSIX demands no paths to be encoded in archives.  We have
+	# to avoid creating archives with duplicate basenames if we
+	# might have to extract them afterwards, e.g., when creating a
+	# static archive out of a convenience library, or when linking
+	# the entirety of a libtool archive into another (currently
+	# not supported by libtool).
+	if (for obj in $oldobjs
+	    do
+	      func_basename "$obj"
+	      $ECHO "$func_basename_result"
+	    done | sort | sort -uc >/dev/null 2>&1); then
+	  :
+	else
+	  echo "copying selected object files to avoid basename conflicts..."
+	  gentop="$output_objdir/${outputname}x"
+	  func_append generated " $gentop"
+	  func_mkdir_p "$gentop"
+	  save_oldobjs=$oldobjs
+	  oldobjs=
+	  counter=1
+	  for obj in $save_oldobjs
+	  do
+	    func_basename "$obj"
+	    objbase="$func_basename_result"
+	    case " $oldobjs " in
+	    " ") oldobjs=$obj ;;
+	    *[\ /]"$objbase "*)
+	      while :; do
+		# Make sure we don't pick an alternate name that also
+		# overlaps.
+		newobj=lt$counter-$objbase
+		func_arith $counter + 1
+		counter=$func_arith_result
+		case " $oldobjs " in
+		*[\ /]"$newobj "*) ;;
+		*) if test ! -f "$gentop/$newobj"; then break; fi ;;
+		esac
+	      done
+	      func_show_eval "ln $obj $gentop/$newobj || cp $obj $gentop/$newobj"
+	      func_append oldobjs " $gentop/$newobj"
+	      ;;
+	    *) func_append oldobjs " $obj" ;;
+	    esac
+	  done
+	fi
+	func_to_tool_file "$oldlib" func_convert_file_msys_to_w32
+	tool_oldlib=$func_to_tool_file_result
+	eval cmds=\"$old_archive_cmds\"
+
+	func_len " $cmds"
+	len=$func_len_result
+	if test "$len" -lt "$max_cmd_len" || test "$max_cmd_len" -le -1; then
+	  cmds=$old_archive_cmds
+	elif test -n "$archiver_list_spec"; then
+	  func_verbose "using command file archive linking..."
+	  for obj in $oldobjs
+	  do
+	    func_to_tool_file "$obj"
+	    $ECHO "$func_to_tool_file_result"
+	  done > $output_objdir/$libname.libcmd
+	  func_to_tool_file "$output_objdir/$libname.libcmd"
+	  oldobjs=" $archiver_list_spec$func_to_tool_file_result"
+	  cmds=$old_archive_cmds
+	else
+	  # the command line is too long to link in one step, link in parts
+	  func_verbose "using piecewise archive linking..."
+	  save_RANLIB=$RANLIB
+	  RANLIB=:
+	  objlist=
+	  concat_cmds=
+	  save_oldobjs=$oldobjs
+	  oldobjs=
+	  # Is there a better way of finding the last object in the list?
+	  for obj in $save_oldobjs
+	  do
+	    last_oldobj=$obj
+	  done
+	  eval test_cmds=\"$old_archive_cmds\"
+	  func_len " $test_cmds"
+	  len0=$func_len_result
+	  len=$len0
+	  for obj in $save_oldobjs
+	  do
+	    func_len " $obj"
+	    func_arith $len + $func_len_result
+	    len=$func_arith_result
+	    func_append objlist " $obj"
+	    if test "$len" -lt "$max_cmd_len"; then
+	      :
+	    else
+	      # the above command should be used before it gets too long
+	      oldobjs=$objlist
+	      if test "$obj" = "$last_oldobj" ; then
+		RANLIB=$save_RANLIB
+	      fi
+	      test -z "$concat_cmds" || concat_cmds=$concat_cmds~
+	      eval concat_cmds=\"\${concat_cmds}$old_archive_cmds\"
+	      objlist=
+	      len=$len0
+	    fi
+	  done
+	  RANLIB=$save_RANLIB
+	  oldobjs=$objlist
+	  if test "X$oldobjs" = "X" ; then
+	    eval cmds=\"\$concat_cmds\"
+	  else
+	    eval cmds=\"\$concat_cmds~\$old_archive_cmds\"
+	  fi
+	fi
+      fi
+      func_execute_cmds "$cmds" 'exit $?'
+    done
+
+    test -n "$generated" && \
+      func_show_eval "${RM}r$generated"
+
+    # Now create the libtool archive.
+    case $output in
+    *.la)
+      old_library=
+      test "$build_old_libs" = yes && old_library="$libname.$libext"
+      func_verbose "creating $output"
+
+      # Preserve any variables that may affect compiler behavior
+      for var in $variables_saved_for_relink; do
+	if eval test -z \"\${$var+set}\"; then
+	  relink_command="{ test -z \"\${$var+set}\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command"
+	elif eval var_value=\$$var; test -z "$var_value"; then
+	  relink_command="$var=; export $var; $relink_command"
+	else
+	  func_quote_for_eval "$var_value"
+	  relink_command="$var=$func_quote_for_eval_result; export $var; $relink_command"
+	fi
+      done
+      # Quote the link command for shipping.
+      relink_command="(cd `pwd`; $SHELL $progpath $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)"
+      relink_command=`$ECHO "$relink_command" | $SED "$sed_quote_subst"`
+      if test "$hardcode_automatic" = yes ; then
+	relink_command=
+      fi
+
+      # Only create the output if not a dry run.
+      $opt_dry_run || {
+	for installed in no yes; do
+	  if test "$installed" = yes; then
+	    if test -z "$install_libdir"; then
+	      break
+	    fi
+	    output="$output_objdir/$outputname"i
+	    # Replace all uninstalled libtool libraries with the installed ones
+	    newdependency_libs=
+	    for deplib in $dependency_libs; do
+	      case $deplib in
+	      *.la)
+		func_basename "$deplib"
+		name="$func_basename_result"
+		func_resolve_sysroot "$deplib"
+		eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $func_resolve_sysroot_result`
+		test -z "$libdir" && \
+		  func_fatal_error "\`$deplib' is not a valid libtool archive"
+		func_append newdependency_libs " ${lt_sysroot:+=}$libdir/$name"
+		;;
+	      -L*)
+		func_stripname -L '' "$deplib"
+		func_replace_sysroot "$func_stripname_result"
+		func_append newdependency_libs " -L$func_replace_sysroot_result"
+		;;
+	      -R*)
+		func_stripname -R '' "$deplib"
+		func_replace_sysroot "$func_stripname_result"
+		func_append newdependency_libs " -R$func_replace_sysroot_result"
+		;;
+	      *) func_append newdependency_libs " $deplib" ;;
+	      esac
+	    done
+	    dependency_libs="$newdependency_libs"
+	    newdlfiles=
+
+	    for lib in $dlfiles; do
+	      case $lib in
+	      *.la)
+	        func_basename "$lib"
+		name="$func_basename_result"
+		eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib`
+		test -z "$libdir" && \
+		  func_fatal_error "\`$lib' is not a valid libtool archive"
+		func_append newdlfiles " ${lt_sysroot:+=}$libdir/$name"
+		;;
+	      *) func_append newdlfiles " $lib" ;;
+	      esac
+	    done
+	    dlfiles="$newdlfiles"
+	    newdlprefiles=
+	    for lib in $dlprefiles; do
+	      case $lib in
+	      *.la)
+		# Only pass preopened files to the pseudo-archive (for
+		# eventual linking with the app. that links it) if we
+		# didn't already link the preopened objects directly into
+		# the library:
+		func_basename "$lib"
+		name="$func_basename_result"
+		eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib`
+		test -z "$libdir" && \
+		  func_fatal_error "\`$lib' is not a valid libtool archive"
+		func_append newdlprefiles " ${lt_sysroot:+=}$libdir/$name"
+		;;
+	      esac
+	    done
+	    dlprefiles="$newdlprefiles"
+	  else
+	    newdlfiles=
+	    for lib in $dlfiles; do
+	      case $lib in
+		[\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;;
+		*) abs=`pwd`"/$lib" ;;
+	      esac
+	      func_append newdlfiles " $abs"
+	    done
+	    dlfiles="$newdlfiles"
+	    newdlprefiles=
+	    for lib in $dlprefiles; do
+	      case $lib in
+		[\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;;
+		*) abs=`pwd`"/$lib" ;;
+	      esac
+	      func_append newdlprefiles " $abs"
+	    done
+	    dlprefiles="$newdlprefiles"
+	  fi
+	  $RM $output
+	  # place dlname in correct position for cygwin
+	  # In fact, it would be nice if we could use this code for all target
+	  # systems that can't hard-code library paths into their executables
+	  # and that have no shared library path variable independent of PATH,
+	  # but it turns out we can't easily determine that from inspecting
+	  # libtool variables, so we have to hard-code the OSs to which it
+	  # applies here; at the moment, that means platforms that use the PE
+	  # object format with DLL files.  See the long comment at the top of
+	  # tests/bindir.at for full details.
+	  tdlname=$dlname
+	  case $host,$output,$installed,$module,$dlname in
+	    *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll | *cegcc*,*lai,yes,no,*.dll)
+	      # If a -bindir argument was supplied, place the dll there.
+	      if test "x$bindir" != x ;
+	      then
+		func_relative_path "$install_libdir" "$bindir"
+		tdlname=$func_relative_path_result$dlname
+	      else
+		# Otherwise fall back on heuristic.
+		tdlname=../bin/$dlname
+	      fi
+	      ;;
+	  esac
+	  $ECHO > $output "\
+# $outputname - a libtool library file
+# Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION
+#
+# Please DO NOT delete this file!
+# It is necessary for linking the library.
+
+# The name that we can dlopen(3).
+dlname='$tdlname'
+
+# Names of this library.
+library_names='$library_names'
+
+# The name of the static archive.
+old_library='$old_library'
+
+# Linker flags that can not go in dependency_libs.
+inherited_linker_flags='$new_inherited_linker_flags'
+
+# Libraries that this one depends upon.
+dependency_libs='$dependency_libs'
+
+# Names of additional weak libraries provided by this library
+weak_library_names='$weak_libs'
+
+# Version information for $libname.
+current=$current
+age=$age
+revision=$revision
+
+# Is this an already installed library?
+installed=$installed
+
+# Should we warn about portability when linking against -modules?
+shouldnotlink=$module
+
+# Files to dlopen/dlpreopen
+dlopen='$dlfiles'
+dlpreopen='$dlprefiles'
+
+# Directory that this library needs to be installed in:
+libdir='$install_libdir'"
+	  if test "$installed" = no && test "$need_relink" = yes; then
+	    $ECHO >> $output "\
+relink_command=\"$relink_command\""
+	  fi
+	done
+      }
+
+      # Do a symbolic link so that the libtool archive can be found in
+      # LD_LIBRARY_PATH before the program is installed.
+      func_show_eval '( cd "$output_objdir" && $RM "$outputname" && $LN_S "../$outputname" "$outputname" )' 'exit $?'
+      ;;
+    esac
+    exit $EXIT_SUCCESS
+}
+
+{ test "$opt_mode" = link || test "$opt_mode" = relink; } &&
+    func_mode_link ${1+"$@"}
+
+
+# func_mode_uninstall arg...
+func_mode_uninstall ()
+{
+    $opt_debug
+    RM="$nonopt"
+    files=
+    rmforce=
+    exit_status=0
+
+    # This variable tells wrapper scripts just to set variables rather
+    # than running their programs.
+    libtool_install_magic="$magic"
+
+    for arg
+    do
+      case $arg in
+      -f) func_append RM " $arg"; rmforce=yes ;;
+      -*) func_append RM " $arg" ;;
+      *) func_append files " $arg" ;;
+      esac
+    done
+
+    test -z "$RM" && \
+      func_fatal_help "you must specify an RM program"
+
+    rmdirs=
+
+    for file in $files; do
+      func_dirname "$file" "" "."
+      dir="$func_dirname_result"
+      if test "X$dir" = X.; then
+	odir="$objdir"
+      else
+	odir="$dir/$objdir"
+      fi
+      func_basename "$file"
+      name="$func_basename_result"
+      test "$opt_mode" = uninstall && odir="$dir"
+
+      # Remember odir for removal later, being careful to avoid duplicates
+      if test "$opt_mode" = clean; then
+	case " $rmdirs " in
+	  *" $odir "*) ;;
+	  *) func_append rmdirs " $odir" ;;
+	esac
+      fi
+
+      # Don't error if the file doesn't exist and rm -f was used.
+      if { test -L "$file"; } >/dev/null 2>&1 ||
+	 { test -h "$file"; } >/dev/null 2>&1 ||
+	 test -f "$file"; then
+	:
+      elif test -d "$file"; then
+	exit_status=1
+	continue
+      elif test "$rmforce" = yes; then
+	continue
+      fi
+
+      rmfiles="$file"
+
+      case $name in
+      *.la)
+	# Possibly a libtool archive, so verify it.
+	if func_lalib_p "$file"; then
+	  func_source $dir/$name
+
+	  # Delete the libtool libraries and symlinks.
+	  for n in $library_names; do
+	    func_append rmfiles " $odir/$n"
+	  done
+	  test -n "$old_library" && func_append rmfiles " $odir/$old_library"
+
+	  case "$opt_mode" in
+	  clean)
+	    case " $library_names " in
+	    *" $dlname "*) ;;
+	    *) test -n "$dlname" && func_append rmfiles " $odir/$dlname" ;;
+	    esac
+	    test -n "$libdir" && func_append rmfiles " $odir/$name $odir/${name}i"
+	    ;;
+	  uninstall)
+	    if test -n "$library_names"; then
+	      # Do each command in the postuninstall commands.
+	      func_execute_cmds "$postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1'
+	    fi
+
+	    if test -n "$old_library"; then
+	      # Do each command in the old_postuninstall commands.
+	      func_execute_cmds "$old_postuninstall_cmds" 'test "$rmforce" = yes || exit_status=1'
+	    fi
+	    # FIXME: should reinstall the best remaining shared library.
+	    ;;
+	  esac
+	fi
+	;;
+
+      *.lo)
+	# Possibly a libtool object, so verify it.
+	if func_lalib_p "$file"; then
+
+	  # Read the .lo file
+	  func_source $dir/$name
+
+	  # Add PIC object to the list of files to remove.
+	  if test -n "$pic_object" &&
+	     test "$pic_object" != none; then
+	    func_append rmfiles " $dir/$pic_object"
+	  fi
+
+	  # Add non-PIC object to the list of files to remove.
+	  if test -n "$non_pic_object" &&
+	     test "$non_pic_object" != none; then
+	    func_append rmfiles " $dir/$non_pic_object"
+	  fi
+	fi
+	;;
+
+      *)
+	if test "$opt_mode" = clean ; then
+	  noexename=$name
+	  case $file in
+	  *.exe)
+	    func_stripname '' '.exe' "$file"
+	    file=$func_stripname_result
+	    func_stripname '' '.exe' "$name"
+	    noexename=$func_stripname_result
+	    # $file with .exe has already been added to rmfiles,
+	    # add $file without .exe
+	    func_append rmfiles " $file"
+	    ;;
+	  esac
+	  # Do a test to see if this is a libtool program.
+	  if func_ltwrapper_p "$file"; then
+	    if func_ltwrapper_executable_p "$file"; then
+	      func_ltwrapper_scriptname "$file"
+	      relink_command=
+	      func_source $func_ltwrapper_scriptname_result
+	      func_append rmfiles " $func_ltwrapper_scriptname_result"
+	    else
+	      relink_command=
+	      func_source $dir/$noexename
+	    fi
+
+	    # note $name still contains .exe if it was in $file originally
+	    # as does the version of $file that was added into $rmfiles
+	    func_append rmfiles " $odir/$name $odir/${name}S.${objext}"
+	    if test "$fast_install" = yes && test -n "$relink_command"; then
+	      func_append rmfiles " $odir/lt-$name"
+	    fi
+	    if test "X$noexename" != "X$name" ; then
+	      func_append rmfiles " $odir/lt-${noexename}.c"
+	    fi
+	  fi
+	fi
+	;;
+      esac
+      func_show_eval "$RM $rmfiles" 'exit_status=1'
+    done
+
+    # Try to remove the ${objdir}s in the directories where we deleted files
+    for dir in $rmdirs; do
+      if test -d "$dir"; then
+	func_show_eval "rmdir $dir >/dev/null 2>&1"
+      fi
+    done
+
+    exit $exit_status
+}
+
+{ test "$opt_mode" = uninstall || test "$opt_mode" = clean; } &&
+    func_mode_uninstall ${1+"$@"}
+
+test -z "$opt_mode" && {
+  help="$generic_help"
+  func_fatal_help "you must specify a MODE"
+}
+
+test -z "$exec_cmd" && \
+  func_fatal_help "invalid operation mode \`$opt_mode'"
+
+if test -n "$exec_cmd"; then
+  eval exec "$exec_cmd"
+  exit $EXIT_FAILURE
+fi
+
+exit $exit_status
+
+
+# The TAGs below are defined such that we never get into a situation
+# in which we disable both kinds of libraries.  Given conflicting
+# choices, we go for a static library, that is the most portable,
+# since we can't tell whether shared libraries were disabled because
+# the user asked for that or because the platform doesn't support
+# them.  This is particularly important on AIX, because we don't
+# support having both static and shared libraries enabled at the same
+# time on that platform, so we default to a shared-only configuration.
+# If a disable-shared tag is given, we'll fallback to a static-only
+# configuration.  But we'll never go from static-only to shared-only.
+
+# ### BEGIN LIBTOOL TAG CONFIG: disable-shared
+build_libtool_libs=no
+build_old_libs=yes
+# ### END LIBTOOL TAG CONFIG: disable-shared
+
+# ### BEGIN LIBTOOL TAG CONFIG: disable-static
+build_old_libs=`case $build_libtool_libs in yes) echo no;; *) echo yes;; esac`
+# ### END LIBTOOL TAG CONFIG: disable-static
+
+# Local Variables:
+# mode:shell-script
+# sh-indentation:2
+# End:
+# vi:sw=2
+
diff --git a/contrib/gtest-1.7.0/build-aux/missing b/contrib/gtest-1.7.0/build-aux/missing
new file mode 100755
index 0000000..86a8fc3
--- /dev/null
+++ b/contrib/gtest-1.7.0/build-aux/missing
@@ -0,0 +1,331 @@
+#! /bin/sh
+# Common stub for a few missing GNU programs while installing.
+
+scriptversion=2012-01-06.13; # UTC
+
+# Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003, 2004, 2005, 2006,
+# 2008, 2009, 2010, 2011, 2012 Free Software Foundation, Inc.
+# Originally by Fran,cois Pinard <pinard at 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 2, 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/>.
+
+# 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=:
+sed_output='s/.* --output[ =]\([^ ]*\).*/\1/p'
+sed_minuso='s/.* -o \([^ ]*\).*/\1/p'
+
+# 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
+
+msg="missing on your system"
+
+case $1 in
+--run)
+  # Try to run requested program, and just exit if it succeeds.
+  run=
+  shift
+  "$@" && exit 0
+  # Exit code 63 means version mismatch.  This often happens
+  # when the user try to use an ancient version of a tool on
+  # a file that requires a minimum version.  In this case we
+  # we should proceed has if the program had been absent, or
+  # if --run hadn't been passed.
+  if test $? = 63; then
+    run=:
+    msg="probably too old"
+  fi
+  ;;
+
+  -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'
+  autom4te     touch the output file, or create a stub one
+  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
+  yacc         create \`y.tab.[ch]', if possible, from existing .[ch]
+
+Version suffixes to PROGRAM as well as the prefixes \`gnu-', \`gnu', and
+\`g' are ignored when checking the name.
+
+Send bug reports to <bug-automake at gnu.org>."
+    exit $?
+    ;;
+
+  -v|--v|--ve|--ver|--vers|--versi|--versio|--version)
+    echo "missing $scriptversion (GNU Automake)"
+    exit $?
+    ;;
+
+  -*)
+    echo 1>&2 "$0: Unknown \`$1' option"
+    echo 1>&2 "Try \`$0 --help' for more information"
+    exit 1
+    ;;
+
+esac
+
+# normalize program name to check for.
+program=`echo "$1" | sed '
+  s/^gnu-//; t
+  s/^gnu//; t
+  s/^g//; t'`
+
+# Now exit if we have it, but it failed.  Also exit now if we
+# don't have it and --version was passed (most likely to detect
+# the program).  This is about non-GNU programs, so use $1 not
+# $program.
+case $1 in
+  lex*|yacc*)
+    # Not GNU programs, they don't have --version.
+    ;;
+
+  *)
+    if test -z "$run" && ($1 --version) > /dev/null 2>&1; then
+       # We have it, but it failed.
+       exit 1
+    elif test "x$2" = "x--version" || test "x$2" = "x--help"; then
+       # Could not run --version or --help.  This is probably someone
+       # running `$TOOL --version' or `$TOOL --help' to check whether
+       # $TOOL exists and not knowing $TOOL uses missing.
+       exit 1
+    fi
+    ;;
+esac
+
+# If it does not exist, or fails to run (possibly an outdated version),
+# try to emulate it.
+case $program in
+  aclocal*)
+    echo 1>&2 "\
+WARNING: \`$1' is $msg.  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 $msg.  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 $msg.  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 $msg.  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
+    ;;
+
+  autom4te*)
+    echo 1>&2 "\
+WARNING: \`$1' is needed, but is $msg.
+         You might have modified some files without having the
+         proper tools for further handling them.
+         You can get \`$1' as part of \`Autoconf' from any GNU
+         archive site."
+
+    file=`echo "$*" | sed -n "$sed_output"`
+    test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"`
+    if test -f "$file"; then
+	touch $file
+    else
+	test -z "$file" || exec >$file
+	echo "#! /bin/sh"
+	echo "# Created by GNU Automake missing as a replacement of"
+	echo "#  $ $@"
+	echo "exit 0"
+	chmod +x $file
+	exit 1
+    fi
+    ;;
+
+  bison*|yacc*)
+    echo 1>&2 "\
+WARNING: \`$1' $msg.  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 test $# -ne 1; then
+        eval LASTARG=\${$#}
+	case $LASTARG in
+	*.y)
+	    SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'`
+	    if test -f "$SRCFILE"; then
+	         cp "$SRCFILE" y.tab.c
+	    fi
+	    SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'`
+	    if test -f "$SRCFILE"; then
+	         cp "$SRCFILE" y.tab.h
+	    fi
+	  ;;
+	esac
+    fi
+    if test ! -f y.tab.h; then
+	echo >y.tab.h
+    fi
+    if test ! -f y.tab.c; then
+	echo 'main() { return 0; }' >y.tab.c
+    fi
+    ;;
+
+  lex*|flex*)
+    echo 1>&2 "\
+WARNING: \`$1' is $msg.  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 test $# -ne 1; then
+        eval LASTARG=\${$#}
+	case $LASTARG in
+	*.l)
+	    SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'`
+	    if test -f "$SRCFILE"; then
+	         cp "$SRCFILE" lex.yy.c
+	    fi
+	  ;;
+	esac
+    fi
+    if test ! -f lex.yy.c; then
+	echo 'main() { return 0; }' >lex.yy.c
+    fi
+    ;;
+
+  help2man*)
+    echo 1>&2 "\
+WARNING: \`$1' is $msg.  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 "$sed_output"`
+    test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"`
+    if test -f "$file"; then
+	touch $file
+    else
+	test -z "$file" || exec >$file
+	echo ".ab help2man is required to generate this page"
+	exit $?
+    fi
+    ;;
+
+  makeinfo*)
+    echo 1>&2 "\
+WARNING: \`$1' is $msg.  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."
+    # The file to touch is that specified with -o ...
+    file=`echo "$*" | sed -n "$sed_output"`
+    test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"`
+    if test -z "$file"; then
+      # ... or it is the one specified with @setfilename ...
+      infile=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'`
+      file=`sed -n '
+	/^@setfilename/{
+	  s/.* \([^ ]*\) *$/\1/
+	  p
+	  q
+	}' $infile`
+      # ... or it is derived from the source name (dir/f.texi becomes f.info)
+      test -z "$file" && file=`echo "$infile" | sed 's,.*/,,;s,.[^.]*$,,'`.info
+    fi
+    # If the file does not exist, the user really needs makeinfo;
+    # let's fail without touching anything.
+    test -f $file || exit 1
+    touch $file
+    ;;
+
+  *)
+    echo 1>&2 "\
+WARNING: \`$1' is needed, and is $msg.
+         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 prerequisites 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
+
+# Local variables:
+# eval: (add-hook 'write-file-hooks 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-time-zone: "UTC"
+# time-stamp-end: "; # UTC"
+# End:
diff --git a/contrib/gtest-1.7.0/cmake/internal_utils.cmake b/contrib/gtest-1.7.0/cmake/internal_utils.cmake
new file mode 100644
index 0000000..8cb2189
--- /dev/null
+++ b/contrib/gtest-1.7.0/cmake/internal_utils.cmake
@@ -0,0 +1,227 @@
+# Defines functions and macros useful for building Google Test and
+# Google Mock.
+#
+# Note:
+#
+# - This file will be run twice when building Google Mock (once via
+#   Google Test's CMakeLists.txt, and once via Google Mock's).
+#   Therefore it shouldn't have any side effects other than defining
+#   the functions and macros.
+#
+# - The functions/macros defined in this file may depend on Google
+#   Test and Google Mock's option() definitions, and thus must be
+#   called *after* the options have been defined.
+
+# Tweaks CMake's default compiler/linker settings to suit Google Test's needs.
+#
+# This must be a macro(), as inside a function string() can only
+# update variables in the function scope.
+macro(fix_default_compiler_settings_)
+  if (MSVC)
+    # For MSVC, CMake sets certain flags to defaults we want to override.
+    # This replacement code is taken from sample in the CMake Wiki at
+    # http://www.cmake.org/Wiki/CMake_FAQ#Dynamic_Replace.
+    foreach (flag_var
+             CMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_DEBUG CMAKE_CXX_FLAGS_RELEASE
+             CMAKE_CXX_FLAGS_MINSIZEREL CMAKE_CXX_FLAGS_RELWITHDEBINFO)
+      if (NOT BUILD_SHARED_LIBS AND NOT gtest_force_shared_crt)
+        # When Google Test is built as a shared library, it should also use
+        # shared runtime libraries.  Otherwise, it may end up with multiple
+        # copies of runtime library data in different modules, resulting in
+        # hard-to-find crashes. When it is built as a static library, it is
+        # preferable to use CRT as static libraries, as we don't have to rely
+        # on CRT DLLs being available. CMake always defaults to using shared
+        # CRT libraries, so we override that default here.
+        string(REPLACE "/MD" "-MT" ${flag_var} "${${flag_var}}")
+      endif()
+
+      # We prefer more strict warning checking for building Google Test.
+      # Replaces /W3 with /W4 in defaults.
+      string(REPLACE "/W3" "-W4" ${flag_var} "${${flag_var}}")
+    endforeach()
+  endif()
+endmacro()
+
+# Defines the compiler/linker flags used to build Google Test and
+# Google Mock.  You can tweak these definitions to suit your need.  A
+# variable's value is empty before it's explicitly assigned to.
+macro(config_compiler_and_linker)
+  if (NOT gtest_disable_pthreads)
+    # Defines CMAKE_USE_PTHREADS_INIT and CMAKE_THREAD_LIBS_INIT.
+    find_package(Threads)
+  endif()
+
+  fix_default_compiler_settings_()
+  if (MSVC)
+    # Newlines inside flags variables break CMake's NMake generator.
+    # TODO(vladl at google.com): Add -RTCs and -RTCu to debug builds.
+    set(cxx_base_flags "-GS -W4 -WX -wd4127 -wd4251 -wd4275 -nologo -J -Zi")
+    if (MSVC_VERSION LESS 1400)
+      # Suppress spurious warnings MSVC 7.1 sometimes issues.
+      # Forcing value to bool.
+      set(cxx_base_flags "${cxx_base_flags} -wd4800")
+      # Copy constructor and assignment operator could not be generated.
+      set(cxx_base_flags "${cxx_base_flags} -wd4511 -wd4512")
+      # Compatibility warnings not applicable to Google Test.
+      # Resolved overload was found by argument-dependent lookup.
+      set(cxx_base_flags "${cxx_base_flags} -wd4675")
+    endif()
+    set(cxx_base_flags "${cxx_base_flags} -D_UNICODE -DUNICODE -DWIN32 -D_WIN32")
+    set(cxx_base_flags "${cxx_base_flags} -DSTRICT -DWIN32_LEAN_AND_MEAN")
+    set(cxx_exception_flags "-EHsc -D_HAS_EXCEPTIONS=1")
+    set(cxx_no_exception_flags "-D_HAS_EXCEPTIONS=0")
+    set(cxx_no_rtti_flags "-GR-")
+  elseif (CMAKE_COMPILER_IS_GNUCXX)
+    set(cxx_base_flags "-Wall -Wshadow")
+    set(cxx_exception_flags "-fexceptions")
+    set(cxx_no_exception_flags "-fno-exceptions")
+    # Until version 4.3.2, GCC doesn't define a macro to indicate
+    # whether RTTI is enabled.  Therefore we define GTEST_HAS_RTTI
+    # explicitly.
+    set(cxx_no_rtti_flags "-fno-rtti -DGTEST_HAS_RTTI=0")
+    set(cxx_strict_flags
+      "-Wextra -Wno-unused-parameter -Wno-missing-field-initializers")
+  elseif (CMAKE_CXX_COMPILER_ID STREQUAL "SunPro")
+    set(cxx_exception_flags "-features=except")
+    # Sun Pro doesn't provide macros to indicate whether exceptions and
+    # RTTI are enabled, so we define GTEST_HAS_* explicitly.
+    set(cxx_no_exception_flags "-features=no%except -DGTEST_HAS_EXCEPTIONS=0")
+    set(cxx_no_rtti_flags "-features=no%rtti -DGTEST_HAS_RTTI=0")
+  elseif (CMAKE_CXX_COMPILER_ID STREQUAL "VisualAge" OR
+      CMAKE_CXX_COMPILER_ID STREQUAL "XL")
+    # CMake 2.8 changes Visual Age's compiler ID to "XL".
+    set(cxx_exception_flags "-qeh")
+    set(cxx_no_exception_flags "-qnoeh")
+    # Until version 9.0, Visual Age doesn't define a macro to indicate
+    # whether RTTI is enabled.  Therefore we define GTEST_HAS_RTTI
+    # explicitly.
+    set(cxx_no_rtti_flags "-qnortti -DGTEST_HAS_RTTI=0")
+  elseif (CMAKE_CXX_COMPILER_ID STREQUAL "HP")
+    set(cxx_base_flags "-AA -mt")
+    set(cxx_exception_flags "-DGTEST_HAS_EXCEPTIONS=1")
+    set(cxx_no_exception_flags "+noeh -DGTEST_HAS_EXCEPTIONS=0")
+    # RTTI can not be disabled in HP aCC compiler.
+    set(cxx_no_rtti_flags "")
+  endif()
+
+  if (CMAKE_USE_PTHREADS_INIT)  # The pthreads library is available and allowed.
+    set(cxx_base_flags "${cxx_base_flags} -DGTEST_HAS_PTHREAD=1")
+  else()
+    set(cxx_base_flags "${cxx_base_flags} -DGTEST_HAS_PTHREAD=0")
+  endif()
+
+  # For building gtest's own tests and samples.
+  set(cxx_exception "${CMAKE_CXX_FLAGS} ${cxx_base_flags} ${cxx_exception_flags}")
+  set(cxx_no_exception
+    "${CMAKE_CXX_FLAGS} ${cxx_base_flags} ${cxx_no_exception_flags}")
+  set(cxx_default "${cxx_exception}")
+  set(cxx_no_rtti "${cxx_default} ${cxx_no_rtti_flags}")
+  set(cxx_use_own_tuple "${cxx_default} -DGTEST_USE_OWN_TR1_TUPLE=1")
+
+  # For building the gtest libraries.
+  set(cxx_strict "${cxx_default} ${cxx_strict_flags}")
+endmacro()
+
+# Defines the gtest & gtest_main libraries.  User tests should link
+# with one of them.
+function(cxx_library_with_type name type cxx_flags)
+  # type can be either STATIC or SHARED to denote a static or shared library.
+  # ARGN refers to additional arguments after 'cxx_flags'.
+  add_library(${name} ${type} ${ARGN})
+  set_target_properties(${name}
+    PROPERTIES
+    COMPILE_FLAGS "${cxx_flags}")
+  if (BUILD_SHARED_LIBS OR type STREQUAL "SHARED")
+    set_target_properties(${name}
+      PROPERTIES
+      COMPILE_DEFINITIONS "GTEST_CREATE_SHARED_LIBRARY=1")
+  endif()
+  if (CMAKE_USE_PTHREADS_INIT)
+    target_link_libraries(${name} ${CMAKE_THREAD_LIBS_INIT})
+  endif()
+endfunction()
+
+########################################################################
+#
+# Helper functions for creating build targets.
+
+function(cxx_shared_library name cxx_flags)
+  cxx_library_with_type(${name} SHARED "${cxx_flags}" ${ARGN})
+endfunction()
+
+function(cxx_library name cxx_flags)
+  cxx_library_with_type(${name} "" "${cxx_flags}" ${ARGN})
+endfunction()
+
+# cxx_executable_with_flags(name cxx_flags libs srcs...)
+#
+# creates a named C++ executable that depends on the given libraries and
+# is built from the given source files with the given compiler flags.
+function(cxx_executable_with_flags name cxx_flags libs)
+  add_executable(${name} ${ARGN})
+  if (cxx_flags)
+    set_target_properties(${name}
+      PROPERTIES
+      COMPILE_FLAGS "${cxx_flags}")
+  endif()
+  if (BUILD_SHARED_LIBS)
+    set_target_properties(${name}
+      PROPERTIES
+      COMPILE_DEFINITIONS "GTEST_LINKED_AS_SHARED_LIBRARY=1")
+  endif()
+  # To support mixing linking in static and dynamic libraries, link each
+  # library in with an extra call to target_link_libraries.
+  foreach (lib "${libs}")
+    target_link_libraries(${name} ${lib})
+  endforeach()
+endfunction()
+
+# cxx_executable(name dir lib srcs...)
+#
+# creates a named target that depends on the given libs and is built
+# from the given source files.  dir/name.cc is implicitly included in
+# the source file list.
+function(cxx_executable name dir libs)
+  cxx_executable_with_flags(
+    ${name} "${cxx_default}" "${libs}" "${dir}/${name}.cc" ${ARGN})
+endfunction()
+
+# Sets PYTHONINTERP_FOUND and PYTHON_EXECUTABLE.
+find_package(PythonInterp)
+
+# cxx_test_with_flags(name cxx_flags libs srcs...)
+#
+# creates a named C++ test that depends on the given libs and is built
+# from the given source files with the given compiler flags.
+function(cxx_test_with_flags name cxx_flags libs)
+  cxx_executable_with_flags(${name} "${cxx_flags}" "${libs}" ${ARGN})
+  add_test(${name} ${name})
+endfunction()
+
+# cxx_test(name libs srcs...)
+#
+# creates a named test target that depends on the given libs and is
+# built from the given source files.  Unlike cxx_test_with_flags,
+# test/name.cc is already implicitly included in the source file list.
+function(cxx_test name libs)
+  cxx_test_with_flags("${name}" "${cxx_default}" "${libs}"
+    "test/${name}.cc" ${ARGN})
+endfunction()
+
+# py_test(name)
+#
+# creates a Python test with the given name whose main module is in
+# test/name.py.  It does nothing if Python is not installed.
+function(py_test name)
+  # We are not supporting Python tests on Linux yet as they consider
+  # all Linux environments to be google3 and try to use google3 features.
+  if (PYTHONINTERP_FOUND)
+    # ${CMAKE_BINARY_DIR} is known at configuration time, so we can
+    # directly bind it from cmake. ${CTEST_CONFIGURATION_TYPE} is known
+    # only at ctest runtime (by calling ctest -c <Configuration>), so
+    # we have to escape $ to delay variable substitution here.
+    add_test(${name}
+      ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/test/${name}.py
+          --build_dir=${CMAKE_CURRENT_BINARY_DIR}/\${CTEST_CONFIGURATION_TYPE})
+  endif()
+endfunction()
diff --git a/contrib/gtest-1.7.0/codegear/gtest.cbproj b/contrib/gtest-1.7.0/codegear/gtest.cbproj
new file mode 100644
index 0000000..285bb2a
--- /dev/null
+++ b/contrib/gtest-1.7.0/codegear/gtest.cbproj
@@ -0,0 +1,138 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <ProjectGuid>{bca37a72-5b07-46cf-b44e-89f8e06451a2}</ProjectGuid>
+    <Config Condition="'$(Config)'==''">Release</Config>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Config)'=='Base' or '$(Base)'!=''">
+    <Base>true</Base>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Config)'=='Debug' or '$(Cfg_1)'!=''">
+    <Base>true</Base>
+    <Cfg_1>true</Cfg_1>
+    <CfgParent>Base</CfgParent>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Config)'=='Release' or '$(Cfg_2)'!=''">
+    <Base>true</Base>
+    <Cfg_2>true</Cfg_2>
+    <CfgParent>Base</CfgParent>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Base)'!=''">
+    <BCC_OptimizeForSpeed>true</BCC_OptimizeForSpeed>
+    <OutputExt>lib</OutputExt>
+    <DCC_CBuilderOutput>JPHNE</DCC_CBuilderOutput>
+    <Defines>NO_STRICT</Defines>
+    <DynamicRTL>true</DynamicRTL>
+    <UsePackages>true</UsePackages>
+    <ProjectType>CppStaticLibrary</ProjectType>
+    <BCC_CPPCompileAlways>true</BCC_CPPCompileAlways>
+    <PackageImports>rtl.bpi;vcl.bpi;bcbie.bpi;vclx.bpi;vclactnband.bpi;xmlrtl.bpi;bcbsmp.bpi;dbrtl.bpi;vcldb.bpi;bdertl.bpi;vcldbx.bpi;dsnap.bpi;dsnapcon.bpi;vclib.bpi;ibxpress.bpi;adortl.bpi;dbxcds.bpi;dbexpress.bpi;DbxCommonDriver.bpi;websnap.bpi;vclie.bpi;webdsnap.bpi;inet.bpi;inetdbbde.bpi;inetdbxpress.bpi;soaprtl.bpi;Rave75VCL.bpi;teeUI.bpi;tee.bpi;teedb.bpi;IndyCore.bpi;IndySystem.bpi;IndyProtocols.bpi;IntrawebDB_90_100.bpi;Intraweb_90_100.bpi;dclZipForged11.bpi;vclZipForged11.bpi; [...]
+    <BCC_wpar>false</BCC_wpar>
+    <IncludePath>$(BDS)\include;$(BDS)\include\dinkumware;$(BDS)\include\vcl;..\src;..\include;..</IncludePath>
+    <AllPackageLibs>rtl.lib;vcl.lib</AllPackageLibs>
+    <TLIB_PageSize>32</TLIB_PageSize>
+    <ILINK_LibraryPath>$(BDS)\lib;$(BDS)\lib\obj;$(BDS)\lib\psdk</ILINK_LibraryPath>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Cfg_1)'!=''">
+    <BCC_OptimizeForSpeed>false</BCC_OptimizeForSpeed>
+    <DCC_Optimize>false</DCC_Optimize>
+    <DCC_DebugInfoInExe>true</DCC_DebugInfoInExe>
+    <Defines>_DEBUG;$(Defines)</Defines>
+    <ILINK_FullDebugInfo>true</ILINK_FullDebugInfo>
+    <BCC_InlineFunctionExpansion>false</BCC_InlineFunctionExpansion>
+    <ILINK_DisableIncrementalLinking>true</ILINK_DisableIncrementalLinking>
+    <BCC_UseRegisterVariables>None</BCC_UseRegisterVariables>
+    <DCC_Define>DEBUG</DCC_Define>
+    <BCC_DebugLineNumbers>true</BCC_DebugLineNumbers>
+    <IntermediateOutputDir>Debug</IntermediateOutputDir>
+    <TASM_DisplaySourceLines>true</TASM_DisplaySourceLines>
+    <BCC_StackFrames>true</BCC_StackFrames>
+    <BCC_DisableOptimizations>true</BCC_DisableOptimizations>
+    <ILINK_LibraryPath>$(BDS)\lib\debug;$(ILINK_LibraryPath)</ILINK_LibraryPath>
+    <TASM_Debugging>Full</TASM_Debugging>
+    <BCC_SourceDebuggingOn>true</BCC_SourceDebuggingOn>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Cfg_2)'!=''">
+    <Defines>NDEBUG;$(Defines)</Defines>
+    <IntermediateOutputDir>Release</IntermediateOutputDir>
+    <ILINK_LibraryPath>$(BDS)\lib\release;$(ILINK_LibraryPath)</ILINK_LibraryPath>
+    <TASM_Debugging>None</TASM_Debugging>
+  </PropertyGroup>
+  <ProjectExtensions>
+    <Borland.Personality>CPlusPlusBuilder.Personality</Borland.Personality>
+    <Borland.ProjectType>CppStaticLibrary</Borland.ProjectType>
+    <BorlandProject>
+<BorlandProject><CPlusPlusBuilder.Personality><VersionInfo><VersionInfo Name="IncludeVerInfo">False</VersionInfo><VersionInfo Name="AutoIncBuild">False</VersionInfo><VersionInfo Name="MajorVer">1</VersionInfo><VersionInfo Name="MinorVer">0</VersionInfo><VersionInfo Name="Release">0</VersionInfo><VersionInfo Name="Build">0</VersionInfo><VersionInfo Name="Debug">False</VersionInfo><VersionInfo Name="PreRelease">False</VersionInfo><VersionInfo Name="Special">False</VersionInfo><VersionInfo  [...]
+      
+      
+      <Excluded_Packages Name="$(BDS)\bin\bcboffice2k100.bpl">CodeGear C++Builder Office 2000 Servers Package</Excluded_Packages>
+      <Excluded_Packages Name="$(BDS)\bin\bcbofficexp100.bpl">CodeGear C++Builder Office XP Servers Package</Excluded_Packages>
+    </Excluded_Packages><Linker><Linker Name="LibPrefix"></Linker><Linker Name="LibSuffix"></Linker><Linker Name="LibVersion"></Linker></Linker><ProjectProperties><ProjectProperties Name="AutoShowDeps">False</ProjectProperties><ProjectProperties Name="ManagePaths">True</ProjectProperties><ProjectProperties Name="VerifyPackages">True</ProjectProperties></ProjectProperties><HistoryLists_hlIncludePath><HistoryLists_hlIncludePath Name="Count">3</HistoryLists_hlIncludePath><HistoryLists_hlInc [...]
+  </ProjectExtensions>
+  <Import Project="$(MSBuildBinPath)\Borland.Cpp.Targets" />
+  <ItemGroup>
+    <None Include="..\include\gtest\gtest-death-test.h">
+      <BuildOrder>3</BuildOrder>
+    </None>
+    <None Include="..\include\gtest\gtest-message.h">
+      <BuildOrder>4</BuildOrder>
+    </None>
+    <None Include="..\include\gtest\gtest-param-test.h">
+      <BuildOrder>5</BuildOrder>
+    </None>
+    <None Include="..\include\gtest\gtest-spi.h">
+      <BuildOrder>6</BuildOrder>
+    </None>
+    <None Include="..\include\gtest\gtest-test-part.h">
+      <BuildOrder>7</BuildOrder>
+    </None>
+    <None Include="..\include\gtest\gtest-typed-test.h">
+      <BuildOrder>8</BuildOrder>
+    </None>
+    <None Include="..\include\gtest\gtest.h">
+      <BuildOrder>0</BuildOrder>
+    </None>
+    <None Include="..\include\gtest\gtest_pred_impl.h">
+      <BuildOrder>1</BuildOrder>
+    </None>
+    <None Include="..\include\gtest\gtest_prod.h">
+      <BuildOrder>2</BuildOrder>
+    </None>
+    <None Include="..\include\gtest\internal\gtest-death-test-internal.h">
+      <BuildOrder>9</BuildOrder>
+    </None>
+    <None Include="..\include\gtest\internal\gtest-filepath.h">
+      <BuildOrder>10</BuildOrder>
+    </None>
+    <None Include="..\include\gtest\internal\gtest-internal.h">
+      <BuildOrder>11</BuildOrder>
+    </None>
+    <None Include="..\include\gtest\internal\gtest-linked_ptr.h">
+      <BuildOrder>12</BuildOrder>
+    </None>
+    <None Include="..\include\gtest\internal\gtest-param-util-generated.h">
+      <BuildOrder>14</BuildOrder>
+    </None>
+    <None Include="..\include\gtest\internal\gtest-param-util.h">
+      <BuildOrder>13</BuildOrder>
+    </None>
+    <None Include="..\include\gtest\internal\gtest-port.h">
+      <BuildOrder>15</BuildOrder>
+    </None>
+    <None Include="..\include\gtest\internal\gtest-string.h">
+      <BuildOrder>16</BuildOrder>
+    </None>
+    <None Include="..\include\gtest\internal\gtest-type-util.h">
+      <BuildOrder>17</BuildOrder>
+    </None>
+    <CppCompile Include="gtest_all.cc">
+      <BuildOrder>18</BuildOrder>
+    </CppCompile>
+    <BuildConfiguration Include="Debug">
+      <Key>Cfg_1</Key>
+    </BuildConfiguration>
+    <BuildConfiguration Include="Release">
+      <Key>Cfg_2</Key>
+    </BuildConfiguration>
+  </ItemGroup>
+</Project>
\ No newline at end of file
diff --git a/contrib/gtest-1.7.0/codegear/gtest.groupproj b/contrib/gtest-1.7.0/codegear/gtest.groupproj
new file mode 100644
index 0000000..849f4c4
--- /dev/null
+++ b/contrib/gtest-1.7.0/codegear/gtest.groupproj
@@ -0,0 +1,54 @@
+<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <ProjectGuid>{c1d923e0-6cba-4332-9b6f-3420acbf5091}</ProjectGuid>
+  </PropertyGroup>
+  <ItemGroup />
+  <ItemGroup>
+    <Projects Include="gtest.cbproj" />
+    <Projects Include="gtest_main.cbproj" />
+    <Projects Include="gtest_unittest.cbproj" />
+  </ItemGroup>
+  <ProjectExtensions>
+    <Borland.Personality>Default.Personality</Borland.Personality>
+    <Borland.ProjectType />
+    <BorlandProject>
+<BorlandProject xmlns=""><Default.Personality></Default.Personality></BorlandProject></BorlandProject>
+  </ProjectExtensions>
+  <Target Name="gtest">
+    <MSBuild Projects="gtest.cbproj" Targets="" />
+  </Target>
+  <Target Name="gtest:Clean">
+    <MSBuild Projects="gtest.cbproj" Targets="Clean" />
+  </Target>
+  <Target Name="gtest:Make">
+    <MSBuild Projects="gtest.cbproj" Targets="Make" />
+  </Target>
+  <Target Name="gtest_main">
+    <MSBuild Projects="gtest_main.cbproj" Targets="" />
+  </Target>
+  <Target Name="gtest_main:Clean">
+    <MSBuild Projects="gtest_main.cbproj" Targets="Clean" />
+  </Target>
+  <Target Name="gtest_main:Make">
+    <MSBuild Projects="gtest_main.cbproj" Targets="Make" />
+  </Target>
+  <Target Name="gtest_unittest">
+    <MSBuild Projects="gtest_unittest.cbproj" Targets="" />
+  </Target>
+  <Target Name="gtest_unittest:Clean">
+    <MSBuild Projects="gtest_unittest.cbproj" Targets="Clean" />
+  </Target>
+  <Target Name="gtest_unittest:Make">
+    <MSBuild Projects="gtest_unittest.cbproj" Targets="Make" />
+  </Target>
+  <Target Name="Build">
+    <CallTarget Targets="gtest;gtest_main;gtest_unittest" />
+  </Target>
+  <Target Name="Clean">
+    <CallTarget Targets="gtest:Clean;gtest_main:Clean;gtest_unittest:Clean" />
+  </Target>
+  <Target Name="Make">
+    <CallTarget Targets="gtest:Make;gtest_main:Make;gtest_unittest:Make" />
+  </Target>
+  <Import Condition="Exists('$(MSBuildBinPath)\Borland.Group.Targets')" Project="$(MSBuildBinPath)\Borland.Group.Targets" />
+</Project>
\ No newline at end of file
diff --git a/contrib/gtest-1.7.0/codegear/gtest_all.cc b/contrib/gtest-1.7.0/codegear/gtest_all.cc
new file mode 100644
index 0000000..ba7ad68
--- /dev/null
+++ b/contrib/gtest-1.7.0/codegear/gtest_all.cc
@@ -0,0 +1,38 @@
+// Copyright 2009, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: Josh Kelley (joshkel at gmail.com)
+//
+// Google C++ Testing Framework (Google Test)
+//
+// C++Builder's IDE cannot build a static library from files with hyphens
+// in their name.  See http://qc.codegear.com/wc/qcmain.aspx?d=70977 .
+// This file serves as a workaround.
+
+#include "src/gtest-all.cc"
diff --git a/contrib/gtest-1.7.0/codegear/gtest_link.cc b/contrib/gtest-1.7.0/codegear/gtest_link.cc
new file mode 100644
index 0000000..b955ebf
--- /dev/null
+++ b/contrib/gtest-1.7.0/codegear/gtest_link.cc
@@ -0,0 +1,40 @@
+// Copyright 2009, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: Josh Kelley (joshkel at gmail.com)
+//
+// Google C++ Testing Framework (Google Test)
+//
+// Links gtest.lib and gtest_main.lib into the current project in C++Builder.
+// This means that these libraries can't be renamed, but it's the only way to
+// ensure that Debug versus Release test builds are linked against the
+// appropriate Debug or Release build of the libraries.
+
+#pragma link "gtest.lib"
+#pragma link "gtest_main.lib"
diff --git a/contrib/gtest-1.7.0/codegear/gtest_main.cbproj b/contrib/gtest-1.7.0/codegear/gtest_main.cbproj
new file mode 100644
index 0000000..fae32cb
--- /dev/null
+++ b/contrib/gtest-1.7.0/codegear/gtest_main.cbproj
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <ProjectGuid>{bca37a72-5b07-46cf-b44e-89f8e06451a2}</ProjectGuid>
+    <Config Condition="'$(Config)'==''">Release</Config>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Config)'=='Base' or '$(Base)'!=''">
+    <Base>true</Base>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Config)'=='Debug' or '$(Cfg_1)'!=''">
+    <Base>true</Base>
+    <Cfg_1>true</Cfg_1>
+    <CfgParent>Base</CfgParent>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Config)'=='Release' or '$(Cfg_2)'!=''">
+    <Base>true</Base>
+    <Cfg_2>true</Cfg_2>
+    <CfgParent>Base</CfgParent>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Base)'!=''">
+    <BCC_OptimizeForSpeed>true</BCC_OptimizeForSpeed>
+    <OutputExt>lib</OutputExt>
+    <DCC_CBuilderOutput>JPHNE</DCC_CBuilderOutput>
+    <Defines>NO_STRICT</Defines>
+    <DynamicRTL>true</DynamicRTL>
+    <UsePackages>true</UsePackages>
+    <ProjectType>CppStaticLibrary</ProjectType>
+    <BCC_CPPCompileAlways>true</BCC_CPPCompileAlways>
+    <PackageImports>rtl.bpi;vcl.bpi;bcbie.bpi;vclx.bpi;vclactnband.bpi;xmlrtl.bpi;bcbsmp.bpi;dbrtl.bpi;vcldb.bpi;bdertl.bpi;vcldbx.bpi;dsnap.bpi;dsnapcon.bpi;vclib.bpi;ibxpress.bpi;adortl.bpi;dbxcds.bpi;dbexpress.bpi;DbxCommonDriver.bpi;websnap.bpi;vclie.bpi;webdsnap.bpi;inet.bpi;inetdbbde.bpi;inetdbxpress.bpi;soaprtl.bpi;Rave75VCL.bpi;teeUI.bpi;tee.bpi;teedb.bpi;IndyCore.bpi;IndySystem.bpi;IndyProtocols.bpi;IntrawebDB_90_100.bpi;Intraweb_90_100.bpi;dclZipForged11.bpi;vclZipForged11.bpi; [...]
+    <BCC_wpar>false</BCC_wpar>
+    <IncludePath>$(BDS)\include;$(BDS)\include\dinkumware;$(BDS)\include\vcl;..\src;..\include;..</IncludePath>
+    <AllPackageLibs>rtl.lib;vcl.lib</AllPackageLibs>
+    <TLIB_PageSize>32</TLIB_PageSize>
+    <ILINK_LibraryPath>$(BDS)\lib;$(BDS)\lib\obj;$(BDS)\lib\psdk</ILINK_LibraryPath>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Cfg_1)'!=''">
+    <BCC_OptimizeForSpeed>false</BCC_OptimizeForSpeed>
+    <DCC_Optimize>false</DCC_Optimize>
+    <DCC_DebugInfoInExe>true</DCC_DebugInfoInExe>
+    <Defines>_DEBUG;$(Defines)</Defines>
+    <ILINK_FullDebugInfo>true</ILINK_FullDebugInfo>
+    <BCC_InlineFunctionExpansion>false</BCC_InlineFunctionExpansion>
+    <ILINK_DisableIncrementalLinking>true</ILINK_DisableIncrementalLinking>
+    <BCC_UseRegisterVariables>None</BCC_UseRegisterVariables>
+    <DCC_Define>DEBUG</DCC_Define>
+    <BCC_DebugLineNumbers>true</BCC_DebugLineNumbers>
+    <IntermediateOutputDir>Debug</IntermediateOutputDir>
+    <TASM_DisplaySourceLines>true</TASM_DisplaySourceLines>
+    <BCC_StackFrames>true</BCC_StackFrames>
+    <BCC_DisableOptimizations>true</BCC_DisableOptimizations>
+    <ILINK_LibraryPath>$(BDS)\lib\debug;$(ILINK_LibraryPath)</ILINK_LibraryPath>
+    <TASM_Debugging>Full</TASM_Debugging>
+    <BCC_SourceDebuggingOn>true</BCC_SourceDebuggingOn>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Cfg_2)'!=''">
+    <Defines>NDEBUG;$(Defines)</Defines>
+    <IntermediateOutputDir>Release</IntermediateOutputDir>
+    <ILINK_LibraryPath>$(BDS)\lib\release;$(ILINK_LibraryPath)</ILINK_LibraryPath>
+    <TASM_Debugging>None</TASM_Debugging>
+  </PropertyGroup>
+  <ProjectExtensions>
+    <Borland.Personality>CPlusPlusBuilder.Personality</Borland.Personality>
+    <Borland.ProjectType>CppStaticLibrary</Borland.ProjectType>
+    <BorlandProject>
+<BorlandProject><CPlusPlusBuilder.Personality><VersionInfo><VersionInfo Name="IncludeVerInfo">False</VersionInfo><VersionInfo Name="AutoIncBuild">False</VersionInfo><VersionInfo Name="MajorVer">1</VersionInfo><VersionInfo Name="MinorVer">0</VersionInfo><VersionInfo Name="Release">0</VersionInfo><VersionInfo Name="Build">0</VersionInfo><VersionInfo Name="Debug">False</VersionInfo><VersionInfo Name="PreRelease">False</VersionInfo><VersionInfo Name="Special">False</VersionInfo><VersionInfo  [...]
+      <Excluded_Packages Name="$(BDS)\bin\bcboffice2k100.bpl">CodeGear C++Builder Office 2000 Servers Package</Excluded_Packages>
+      <Excluded_Packages Name="$(BDS)\bin\bcbofficexp100.bpl">CodeGear C++Builder Office XP Servers Package</Excluded_Packages>
+    </Excluded_Packages><Linker><Linker Name="LibPrefix"></Linker><Linker Name="LibSuffix"></Linker><Linker Name="LibVersion"></Linker></Linker><ProjectProperties><ProjectProperties Name="AutoShowDeps">False</ProjectProperties><ProjectProperties Name="ManagePaths">True</ProjectProperties><ProjectProperties Name="VerifyPackages">True</ProjectProperties></ProjectProperties><HistoryLists_hlIncludePath><HistoryLists_hlIncludePath Name="Count">3</HistoryLists_hlIncludePath><HistoryLists_hlInc [...]
+  </ProjectExtensions>
+  <Import Project="$(MSBuildBinPath)\Borland.Cpp.Targets" />
+  <ItemGroup>
+    <CppCompile Include="..\src\gtest_main.cc">
+      <BuildOrder>0</BuildOrder>
+    </CppCompile>
+    <BuildConfiguration Include="Debug">
+      <Key>Cfg_1</Key>
+    </BuildConfiguration>
+    <BuildConfiguration Include="Release">
+      <Key>Cfg_2</Key>
+    </BuildConfiguration>
+  </ItemGroup>
+</Project>
diff --git a/contrib/gtest-1.7.0/codegear/gtest_unittest.cbproj b/contrib/gtest-1.7.0/codegear/gtest_unittest.cbproj
new file mode 100644
index 0000000..33f7056
--- /dev/null
+++ b/contrib/gtest-1.7.0/codegear/gtest_unittest.cbproj
@@ -0,0 +1,88 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <ProjectGuid>{eea63393-5ac5-4b9c-8909-d75fef2daa41}</ProjectGuid>
+    <Config Condition="'$(Config)'==''">Release</Config>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Config)'=='Base' or '$(Base)'!=''">
+    <Base>true</Base>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Config)'=='Debug' or '$(Cfg_1)'!=''">
+    <Base>true</Base>
+    <Cfg_1>true</Cfg_1>
+    <CfgParent>Base</CfgParent>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Config)'=='Release' or '$(Cfg_2)'!=''">
+    <Base>true</Base>
+    <Cfg_2>true</Cfg_2>
+    <CfgParent>Base</CfgParent>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Base)'!=''">
+    <OutputExt>exe</OutputExt>
+    <BCC_OptimizeForSpeed>true</BCC_OptimizeForSpeed>
+    <Defines>NO_STRICT</Defines>
+    <DCC_CBuilderOutput>JPHNE</DCC_CBuilderOutput>
+    <DynamicRTL>true</DynamicRTL>
+    <ILINK_ObjectSearchPath>..\test</ILINK_ObjectSearchPath>
+    <UsePackages>true</UsePackages>
+    <ProjectType>CppConsoleApplication</ProjectType>
+    <NoVCL>true</NoVCL>
+    <BCC_CPPCompileAlways>true</BCC_CPPCompileAlways>
+    <PackageImports>rtl.bpi;vcl.bpi;bcbie.bpi;vclx.bpi;vclactnband.bpi;xmlrtl.bpi;bcbsmp.bpi;dbrtl.bpi;vcldb.bpi;bdertl.bpi;vcldbx.bpi;dsnap.bpi;dsnapcon.bpi;vclib.bpi;ibxpress.bpi;adortl.bpi;dbxcds.bpi;dbexpress.bpi;DbxCommonDriver.bpi;websnap.bpi;vclie.bpi;webdsnap.bpi;inet.bpi;inetdbbde.bpi;inetdbxpress.bpi;soaprtl.bpi;Rave75VCL.bpi;teeUI.bpi;tee.bpi;teedb.bpi;IndyCore.bpi;IndySystem.bpi;IndyProtocols.bpi;IntrawebDB_90_100.bpi;Intraweb_90_100.bpi;Jcl.bpi;JclVcl.bpi;JvCoreD11R.bpi;JvSy [...]
+    <BCC_wpar>false</BCC_wpar>
+    <IncludePath>$(BDS)\include;$(BDS)\include\dinkumware;$(BDS)\include\vcl;..\include;..\test;..</IncludePath>
+    <ILINK_LibraryPath>$(BDS)\lib;$(BDS)\lib\obj;$(BDS)\lib\psdk;..\test</ILINK_LibraryPath>
+    <Multithreaded>true</Multithreaded>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Cfg_1)'!=''">
+    <BCC_OptimizeForSpeed>false</BCC_OptimizeForSpeed>
+    <DCC_Optimize>false</DCC_Optimize>
+    <DCC_DebugInfoInExe>true</DCC_DebugInfoInExe>
+    <Defines>_DEBUG;$(Defines)</Defines>
+    <ILINK_FullDebugInfo>true</ILINK_FullDebugInfo>
+    <BCC_InlineFunctionExpansion>false</BCC_InlineFunctionExpansion>
+    <ILINK_DisableIncrementalLinking>true</ILINK_DisableIncrementalLinking>
+    <BCC_UseRegisterVariables>None</BCC_UseRegisterVariables>
+    <DCC_Define>DEBUG</DCC_Define>
+    <BCC_DebugLineNumbers>true</BCC_DebugLineNumbers>
+    <IntermediateOutputDir>Debug</IntermediateOutputDir>
+    <TASM_DisplaySourceLines>true</TASM_DisplaySourceLines>
+    <BCC_StackFrames>true</BCC_StackFrames>
+    <BCC_DisableOptimizations>true</BCC_DisableOptimizations>
+    <ILINK_LibraryPath>$(BDS)\lib\debug;$(ILINK_LibraryPath)</ILINK_LibraryPath>
+    <TASM_Debugging>Full</TASM_Debugging>
+    <BCC_SourceDebuggingOn>true</BCC_SourceDebuggingOn>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Cfg_2)'!=''">
+    <Defines>NDEBUG;$(Defines)</Defines>
+    <IntermediateOutputDir>Release</IntermediateOutputDir>
+    <ILINK_LibraryPath>$(BDS)\lib\release;$(ILINK_LibraryPath)</ILINK_LibraryPath>
+    <TASM_Debugging>None</TASM_Debugging>
+  </PropertyGroup>
+  <ProjectExtensions>
+    <Borland.Personality>CPlusPlusBuilder.Personality</Borland.Personality>
+    <Borland.ProjectType>CppConsoleApplication</Borland.ProjectType>
+    <BorlandProject>
+<BorlandProject><CPlusPlusBuilder.Personality><VersionInfo><VersionInfo Name="IncludeVerInfo">False</VersionInfo><VersionInfo Name="AutoIncBuild">False</VersionInfo><VersionInfo Name="MajorVer">1</VersionInfo><VersionInfo Name="MinorVer">0</VersionInfo><VersionInfo Name="Release">0</VersionInfo><VersionInfo Name="Build">0</VersionInfo><VersionInfo Name="Debug">False</VersionInfo><VersionInfo Name="PreRelease">False</VersionInfo><VersionInfo Name="Special">False</VersionInfo><VersionInfo  [...]
+      
+      
+      <Excluded_Packages Name="$(BDS)\bin\bcboffice2k100.bpl">CodeGear C++Builder Office 2000 Servers Package</Excluded_Packages>
+      <Excluded_Packages Name="$(BDS)\bin\bcbofficexp100.bpl">CodeGear C++Builder Office XP Servers Package</Excluded_Packages>
+    </Excluded_Packages><Linker><Linker Name="LibPrefix"></Linker><Linker Name="LibSuffix"></Linker><Linker Name="LibVersion"></Linker></Linker><ProjectProperties><ProjectProperties Name="AutoShowDeps">False</ProjectProperties><ProjectProperties Name="ManagePaths">True</ProjectProperties><ProjectProperties Name="VerifyPackages">True</ProjectProperties></ProjectProperties><HistoryLists_hlIncludePath><HistoryLists_hlIncludePath Name="Count">3</HistoryLists_hlIncludePath><HistoryLists_hlInc [...]
+  </ProjectExtensions>
+  <Import Project="$(MSBuildBinPath)\Borland.Cpp.Targets" />
+  <ItemGroup>
+    <CppCompile Include="..\test\gtest_unittest.cc">
+      <BuildOrder>0</BuildOrder>
+    </CppCompile>
+    <CppCompile Include="gtest_link.cc">
+      <BuildOrder>1</BuildOrder>
+    </CppCompile>
+    <BuildConfiguration Include="Debug">
+      <Key>Cfg_1</Key>
+    </BuildConfiguration>
+    <BuildConfiguration Include="Release">
+      <Key>Cfg_2</Key>
+    </BuildConfiguration>
+  </ItemGroup>
+</Project>
\ No newline at end of file
diff --git a/contrib/gtest-1.7.0/configure b/contrib/gtest-1.7.0/configure
new file mode 100755
index 0000000..582a9a0
--- /dev/null
+++ b/contrib/gtest-1.7.0/configure
@@ -0,0 +1,18222 @@
+#! /bin/sh
+# Guess values for system-dependent variables and create Makefiles.
+# Generated by GNU Autoconf 2.68 for Google C++ Testing Framework 1.7.0.
+#
+# Report bugs to <googletestframework at googlegroups.com>.
+#
+#
+# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
+# 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 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=:
+  # Pre-4.2 versions of Zsh do 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_nl='
+'
+export as_nl
+# Printing a long string crashes Solaris 7 /usr/bin/printf.
+as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo
+# Prefer a ksh shell builtin over an external printf program on Solaris,
+# but without wasting forks for bash or zsh.
+if test -z "$BASH_VERSION$ZSH_VERSION" \
+    && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then
+  as_echo='print -r --'
+  as_echo_n='print -rn --'
+elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then
+  as_echo='printf %s\n'
+  as_echo_n='printf %s'
+else
+  if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then
+    as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"'
+    as_echo_n='/usr/ucb/echo -n'
+  else
+    as_echo_body='eval expr "X$1" : "X\\(.*\\)"'
+    as_echo_n_body='eval
+      arg=$1;
+      case $arg in #(
+      *"$as_nl"*)
+	expr "X$arg" : "X\\(.*\\)$as_nl";
+	arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;;
+      esac;
+      expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl"
+    '
+    export as_echo_n_body
+    as_echo_n='sh -c $as_echo_n_body as_echo'
+  fi
+  export as_echo_body
+  as_echo='sh -c $as_echo_body as_echo'
+fi
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+  PATH_SEPARATOR=:
+  (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
+    (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
+      PATH_SEPARATOR=';'
+  }
+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.)
+IFS=" ""	$as_nl"
+
+# Find who we are.  Look in the path if we contain no directory separator.
+as_myself=
+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
+  $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+  exit 1
+fi
+
+# Unset variables that we do not need and which cause bugs (e.g. in
+# pre-3.0 UWIN ksh).  But do not cause bugs in bash 2.01; the "|| exit 1"
+# suppresses any "Segmentation fault" message there.  '((' could
+# trigger a bug in pdksh 5.2.14.
+for as_var in BASH_ENV ENV MAIL MAILPATH
+do eval test x\${$as_var+set} = xset \
+  && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
+done
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+LC_ALL=C
+export LC_ALL
+LANGUAGE=C
+export LANGUAGE
+
+# CDPATH.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+if test "x$CONFIG_SHELL" = x; then
+  as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then :
+  emulate sh
+  NULLCMD=:
+  # Pre-4.2 versions of Zsh do 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_required="as_fn_return () { (exit \$1); }
+as_fn_success () { as_fn_return 0; }
+as_fn_failure () { as_fn_return 1; }
+as_fn_ret_success () { return 0; }
+as_fn_ret_failure () { return 1; }
+
+exitcode=0
+as_fn_success || { exitcode=1; echo as_fn_success failed.; }
+as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; }
+as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; }
+as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; }
+if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then :
+
+else
+  exitcode=1; echo positional parameters were not saved.
+fi
+test x\$exitcode = x0 || exit 1"
+  as_suggested="  as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO
+  as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO
+  eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" &&
+  test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1
+
+  test -n \"\${ZSH_VERSION+set}\${BASH_VERSION+set}\" || (
+    ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+    ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO
+    ECHO=\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO\$ECHO
+    PATH=/empty FPATH=/empty; export PATH FPATH
+    test \"X\`printf %s \$ECHO\`\" = \"X\$ECHO\" \\
+      || test \"X\`print -r -- \$ECHO\`\" = \"X\$ECHO\" ) || exit 1
+test \$(( 1 + 1 )) = 2 || exit 1"
+  if (eval "$as_required") 2>/dev/null; then :
+  as_have_required=yes
+else
+  as_have_required=no
+fi
+  if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then :
+
+else
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+as_found=false
+for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  as_found=:
+  case $as_dir in #(
+	 /*)
+	   for as_base in sh bash ksh sh5; do
+	     # Try only shells that exist, to save several forks.
+	     as_shell=$as_dir/$as_base
+	     if { test -f "$as_shell" || test -f "$as_shell.exe"; } &&
+		    { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then :
+  CONFIG_SHELL=$as_shell as_have_required=yes
+		   if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then :
+  break 2
+fi
+fi
+	   done;;
+       esac
+  as_found=false
+done
+$as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } &&
+	      { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then :
+  CONFIG_SHELL=$SHELL as_have_required=yes
+fi; }
+IFS=$as_save_IFS
+
+
+      if test "x$CONFIG_SHELL" != x; then :
+  # We cannot yet assume a decent shell, so we have to provide a
+	# neutralization value for shells without unset; and this also
+	# works around shells that cannot unset nonexistent variables.
+	# Preserve -v and -x to the replacement shell.
+	BASH_ENV=/dev/null
+	ENV=/dev/null
+	(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV
+	export CONFIG_SHELL
+	case $- in # ((((
+	  *v*x* | *x*v* ) as_opts=-vx ;;
+	  *v* ) as_opts=-v ;;
+	  *x* ) as_opts=-x ;;
+	  * ) as_opts= ;;
+	esac
+	exec "$CONFIG_SHELL" $as_opts "$as_myself" ${1+"$@"}
+fi
+
+    if test x$as_have_required = xno; then :
+  $as_echo "$0: This script requires a shell more modern than all"
+  $as_echo "$0: the shells that I found on your system."
+  if test x${ZSH_VERSION+set} = xset ; then
+    $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should"
+    $as_echo "$0: be upgraded to zsh 4.3.4 or later."
+  else
+    $as_echo "$0: Please tell bug-autoconf at gnu.org and
+$0: googletestframework at googlegroups.com about your system,
+$0: including any error possibly output before this
+$0: message. Then install a modern shell, or manually run
+$0: the script under such a shell if you do have one."
+  fi
+  exit 1
+fi
+fi
+fi
+SHELL=${CONFIG_SHELL-/bin/sh}
+export SHELL
+# Unset more variables known to interfere with behavior of common tools.
+CLICOLOR_FORCE= GREP_OPTIONS=
+unset CLICOLOR_FORCE GREP_OPTIONS
+
+## --------------------- ##
+## M4sh Shell Functions. ##
+## --------------------- ##
+# as_fn_unset VAR
+# ---------------
+# Portably unset VAR.
+as_fn_unset ()
+{
+  { eval $1=; unset $1;}
+}
+as_unset=as_fn_unset
+
+# as_fn_set_status STATUS
+# -----------------------
+# Set $? to STATUS, without forking.
+as_fn_set_status ()
+{
+  return $1
+} # as_fn_set_status
+
+# as_fn_exit STATUS
+# -----------------
+# Exit the shell with STATUS, even in a "trap 0" or "set -e" context.
+as_fn_exit ()
+{
+  set +e
+  as_fn_set_status $1
+  exit $1
+} # as_fn_exit
+
+# as_fn_mkdir_p
+# -------------
+# Create "$as_dir" as a directory, including parents if necessary.
+as_fn_mkdir_p ()
+{
+
+  case $as_dir in #(
+  -*) as_dir=./$as_dir;;
+  esac
+  test -d "$as_dir" || eval $as_mkdir_p || {
+    as_dirs=
+    while :; do
+      case $as_dir in #(
+      *\'*) as_qdir=`$as_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 ||
+$as_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" || as_fn_error $? "cannot create directory $as_dir"
+
+
+} # as_fn_mkdir_p
+# as_fn_append VAR VALUE
+# ----------------------
+# Append the text in VALUE to the end of the definition contained in VAR. Take
+# advantage of any shell optimizations that allow amortized linear growth over
+# repeated appends, instead of the typical quadratic growth present in naive
+# implementations.
+if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then :
+  eval 'as_fn_append ()
+  {
+    eval $1+=\$2
+  }'
+else
+  as_fn_append ()
+  {
+    eval $1=\$$1\$2
+  }
+fi # as_fn_append
+
+# as_fn_arith ARG...
+# ------------------
+# Perform arithmetic evaluation on the ARGs, and store the result in the
+# global $as_val. Take advantage of shells that can avoid forks. The arguments
+# must be portable across $(()) and expr.
+if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then :
+  eval 'as_fn_arith ()
+  {
+    as_val=$(( $* ))
+  }'
+else
+  as_fn_arith ()
+  {
+    as_val=`expr "$@" || test $? -eq 1`
+  }
+fi # as_fn_arith
+
+
+# as_fn_error STATUS ERROR [LINENO LOG_FD]
+# ----------------------------------------
+# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are
+# provided, also output the error to LOG_FD, referencing LINENO. Then exit the
+# script with STATUS, using 1 if that was 0.
+as_fn_error ()
+{
+  as_status=$1; test $as_status -eq 0 && as_status=1
+  if test "$4"; then
+    as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+    $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
+  fi
+  $as_echo "$as_me: error: $2" >&2
+  as_fn_exit $as_status
+} # as_fn_error
+
+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
+
+if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
+  as_dirname=dirname
+else
+  as_dirname=false
+fi
+
+as_me=`$as_basename -- "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+	 X"$0" : 'X\(//\)$' \| \
+	 X"$0" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X/"$0" |
+    sed '/^.*\/\([^/][^/]*\)\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\/\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\/\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+
+# 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
+
+
+  as_lineno_1=$LINENO as_lineno_1a=$LINENO
+  as_lineno_2=$LINENO as_lineno_2a=$LINENO
+  eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" &&
+  test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || {
+  # 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" ||
+    { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_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
+}
+
+ECHO_C= ECHO_N= ECHO_T=
+case `echo -n x` in #(((((
+-n*)
+  case `echo 'xy\c'` in
+  *c*) ECHO_T='	';;	# ECHO_T is single tab character.
+  xy)  ECHO_C='\c';;
+  *)   echo `echo ksh88 bug on AIX 6.1` > /dev/null
+       ECHO_T='	';;
+  esac;;
+*)
+  ECHO_N='-n';;
+esac
+
+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 2>/dev/null
+fi
+if (echo >conf$$.file) 2>/dev/null; then
+  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
+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='mkdir -p "$as_dir"'
+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'"
+
+SHELL=${CONFIG_SHELL-/bin/sh}
+
+
+test -n "$DJDIR" || exec 7<&0 </dev/null
+exec 6>&1
+
+# Name of the host.
+# hostname on some systems (SVR3.2, old GNU/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=
+
+# Identity of this package.
+PACKAGE_NAME='Google C++ Testing Framework'
+PACKAGE_TARNAME='gtest'
+PACKAGE_VERSION='1.7.0'
+PACKAGE_STRING='Google C++ Testing Framework 1.7.0'
+PACKAGE_BUGREPORT='googletestframework at googlegroups.com'
+PACKAGE_URL=''
+
+ac_unique_file="./LICENSE"
+# 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='am__EXEEXT_FALSE
+am__EXEEXT_TRUE
+LTLIBOBJS
+LIBOBJS
+HAVE_PTHREADS_FALSE
+HAVE_PTHREADS_TRUE
+PTHREAD_CFLAGS
+PTHREAD_LIBS
+PTHREAD_CC
+acx_pthread_config
+HAVE_PYTHON_FALSE
+HAVE_PYTHON_TRUE
+PYTHON
+CXXCPP
+CPP
+OTOOL64
+OTOOL
+LIPO
+NMEDIT
+DSYMUTIL
+MANIFEST_TOOL
+RANLIB
+ac_ct_AR
+AR
+DLLTOOL
+OBJDUMP
+LN_S
+NM
+ac_ct_DUMPBIN
+DUMPBIN
+LD
+FGREP
+EGREP
+GREP
+SED
+host_os
+host_vendor
+host_cpu
+host
+build_os
+build_vendor
+build_cpu
+build
+LIBTOOL
+am__fastdepCXX_FALSE
+am__fastdepCXX_TRUE
+CXXDEPMODE
+ac_ct_CXX
+CXXFLAGS
+CXX
+am__fastdepCC_FALSE
+am__fastdepCC_TRUE
+CCDEPMODE
+am__nodep
+AMDEPBACKSLASH
+AMDEP_FALSE
+AMDEP_TRUE
+am__quote
+am__include
+DEPDIR
+OBJEXT
+EXEEXT
+ac_ct_CC
+CPPFLAGS
+LDFLAGS
+CFLAGS
+CC
+am__untar
+am__tar
+AMTAR
+am__leading_dot
+SET_MAKE
+AWK
+mkdir_p
+MKDIR_P
+INSTALL_STRIP_PROGRAM
+STRIP
+install_sh
+MAKEINFO
+AUTOHEADER
+AUTOMAKE
+AUTOCONF
+ACLOCAL
+VERSION
+PACKAGE
+CYGPATH_W
+am__isrc
+INSTALL_DATA
+INSTALL_SCRIPT
+INSTALL_PROGRAM
+target_alias
+host_alias
+build_alias
+LIBS
+ECHO_T
+ECHO_N
+ECHO_C
+DEFS
+mandir
+localedir
+libdir
+psdir
+pdfdir
+dvidir
+htmldir
+infodir
+docdir
+oldincludedir
+includedir
+localstatedir
+sharedstatedir
+sysconfdir
+datadir
+datarootdir
+libexecdir
+sbindir
+bindir
+program_transform_name
+prefix
+exec_prefix
+PACKAGE_URL
+PACKAGE_BUGREPORT
+PACKAGE_STRING
+PACKAGE_VERSION
+PACKAGE_TARNAME
+PACKAGE_NAME
+PATH_SEPARATOR
+SHELL'
+ac_subst_files=''
+ac_user_opts='
+enable_option_checking
+enable_dependency_tracking
+enable_shared
+enable_static
+with_pic
+enable_fast_install
+with_gnu_ld
+with_sysroot
+enable_libtool_lock
+with_pthreads
+'
+      ac_precious_vars='build_alias
+host_alias
+target_alias
+CC
+CFLAGS
+LDFLAGS
+LIBS
+CPPFLAGS
+CXX
+CXXFLAGS
+CCC
+CPP
+CXXCPP'
+
+
+# Initialize some variables set by options.
+ac_init_help=
+ac_init_version=false
+ac_unrecognized_opts=
+ac_unrecognized_sep=
+# 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= ;;
+  *)    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_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+      as_fn_error $? "invalid feature name: $ac_useropt"
+    ac_useropt_orig=$ac_useropt
+    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+    case $ac_user_opts in
+      *"
+"enable_$ac_useropt"
+"*) ;;
+      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig"
+	 ac_unrecognized_sep=', ';;
+    esac
+    eval enable_$ac_useropt=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_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+      as_fn_error $? "invalid feature name: $ac_useropt"
+    ac_useropt_orig=$ac_useropt
+    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+    case $ac_user_opts in
+      *"
+"enable_$ac_useropt"
+"*) ;;
+      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig"
+	 ac_unrecognized_sep=', ';;
+    esac
+    eval enable_$ac_useropt=\$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_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+      as_fn_error $? "invalid package name: $ac_useropt"
+    ac_useropt_orig=$ac_useropt
+    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+    case $ac_user_opts in
+      *"
+"with_$ac_useropt"
+"*) ;;
+      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig"
+	 ac_unrecognized_sep=', ';;
+    esac
+    eval with_$ac_useropt=\$ac_optarg ;;
+
+  -without-* | --without-*)
+    ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'`
+    # Reject names that are not valid shell variable names.
+    expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
+      as_fn_error $? "invalid package name: $ac_useropt"
+    ac_useropt_orig=$ac_useropt
+    ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
+    case $ac_user_opts in
+      *"
+"with_$ac_useropt"
+"*) ;;
+      *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig"
+	 ac_unrecognized_sep=', ';;
+    esac
+    eval with_$ac_useropt=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 ;;
+
+  -*) as_fn_error $? "unrecognized option: \`$ac_option'
+Try \`$0 --help' for more information"
+    ;;
+
+  *=*)
+    ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='`
+    # Reject names that are not valid shell variable names.
+    case $ac_envvar in #(
+      '' | [0-9]* | *[!_$as_cr_alnum]* )
+      as_fn_error $? "invalid variable name: \`$ac_envvar'" ;;
+    esac
+    eval $ac_envvar=\$ac_optarg
+    export $ac_envvar ;;
+
+  *)
+    # FIXME: should be removed in autoconf 3.0.
+    $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2
+    expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null &&
+      $as_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'`
+  as_fn_error $? "missing argument to $ac_option"
+fi
+
+if test -n "$ac_unrecognized_opts"; then
+  case $enable_option_checking in
+    no) ;;
+    fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;;
+    *)     $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;;
+  esac
+fi
+
+# Check all directory arguments for consistency.
+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
+  # Remove trailing slashes.
+  case $ac_val in
+    */ )
+      ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'`
+      eval $ac_var=\$ac_val;;
+  esac
+  # Be sure to have absolute directory names.
+  case $ac_val in
+    [\\/$]* | ?:[\\/]* )  continue;;
+    NONE | '' ) case $ac_var in *prefix ) continue;; esac;;
+  esac
+  as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val"
+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
+    $as_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 .` ||
+  as_fn_error $? "working directory cannot be determined"
+test "X$ac_ls_di" = "X$ac_pwd_ls_di" ||
+  as_fn_error $? "pwd does not report name of working directory"
+
+
+# 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 -- "$as_myself" ||
+$as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$as_myself" : 'X\(//\)[^/]' \| \
+	 X"$as_myself" : 'X\(//\)$' \| \
+	 X"$as_myself" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$as_myself" |
+    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 .."
+  as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir"
+fi
+ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work"
+ac_abs_confdir=`(
+	cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg"
+	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 Google C++ Testing Framework 1.7.0 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/gtest]
+  --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
+
+System types:
+  --build=BUILD     configure for building on BUILD [guessed]
+  --host=HOST       cross-compile to build programs to run on HOST [BUILD]
+_ACEOF
+fi
+
+if test -n "$ac_init_help"; then
+  case $ac_init_help in
+     short | recursive ) echo "Configuration of Google C++ Testing Framework 1.7.0:";;
+   esac
+  cat <<\_ACEOF
+
+Optional Features:
+  --disable-option-checking  ignore unrecognized --enable/--with options
+  --disable-FEATURE       do not include FEATURE (same as --enable-FEATURE=no)
+  --enable-FEATURE[=ARG]  include FEATURE [ARG=yes]
+  --disable-dependency-tracking  speeds up one-time build
+  --enable-dependency-tracking   do not reject slow dependency extractors
+  --enable-shared[=PKGS]  build shared libraries [default=yes]
+  --enable-static[=PKGS]  build static libraries [default=yes]
+  --enable-fast-install[=PKGS]
+                          optimize for fast installation [default=yes]
+  --disable-libtool-lock  avoid locking (might break parallel builds)
+
+Optional Packages:
+  --with-PACKAGE[=ARG]    use PACKAGE [ARG=yes]
+  --without-PACKAGE       do not use PACKAGE (same as --with-PACKAGE=no)
+  --with-pic[=PKGS]       try to use only PIC/non-PIC objects [default=use
+                          both]
+  --with-gnu-ld           assume the C compiler uses GNU ld [default=no]
+  --with-sysroot=DIR Search for dependent libraries within DIR
+                        (or the compiler's sysroot if not specified).
+  --with-pthreads         use pthreads (default is yes)
+
+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    (Objective) C/C++ preprocessor flags, e.g. -I<include dir> if
+              you have headers in a nonstandard directory <include dir>
+  CXX         C++ compiler command
+  CXXFLAGS    C++ compiler flags
+  CPP         C preprocessor
+  CXXCPP      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.
+
+Report bugs to <googletestframework at googlegroups.com>.
+_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" ||
+      { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && 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=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'`
+  # A ".." for each directory in $ac_dir_suffix.
+  ac_top_builddir_sub=`$as_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
+      $as_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
+Google C++ Testing Framework configure 1.7.0
+generated by GNU Autoconf 2.68
+
+Copyright (C) 2010 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
+
+## ------------------------ ##
+## Autoconf initialization. ##
+## ------------------------ ##
+
+# ac_fn_c_try_compile LINENO
+# --------------------------
+# Try to compile conftest.$ac_ext, and return whether this succeeded.
+ac_fn_c_try_compile ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  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 ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_compile") 2>conftest.err
+  ac_status=$?
+  if test -s conftest.err; then
+    grep -v '^ *+' conftest.err >conftest.er1
+    cat conftest.er1 >&5
+    mv -f conftest.er1 conftest.err
+  fi
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then :
+  ac_retval=0
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+	ac_retval=1
+fi
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+  as_fn_set_status $ac_retval
+
+} # ac_fn_c_try_compile
+
+# ac_fn_cxx_try_compile LINENO
+# ----------------------------
+# Try to compile conftest.$ac_ext, and return whether this succeeded.
+ac_fn_cxx_try_compile ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  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 ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_compile") 2>conftest.err
+  ac_status=$?
+  if test -s conftest.err; then
+    grep -v '^ *+' conftest.err >conftest.er1
+    cat conftest.er1 >&5
+    mv -f conftest.er1 conftest.err
+  fi
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && {
+	 test -z "$ac_cxx_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest.$ac_objext; then :
+  ac_retval=0
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+	ac_retval=1
+fi
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+  as_fn_set_status $ac_retval
+
+} # ac_fn_cxx_try_compile
+
+# ac_fn_c_try_link LINENO
+# -----------------------
+# Try to link conftest.$ac_ext, and return whether this succeeded.
+ac_fn_c_try_link ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  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 ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_link") 2>conftest.err
+  ac_status=$?
+  if test -s conftest.err; then
+    grep -v '^ *+' conftest.err >conftest.er1
+    cat conftest.er1 >&5
+    mv -f conftest.er1 conftest.err
+  fi
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && {
+	 test -z "$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest$ac_exeext && {
+	 test "$cross_compiling" = yes ||
+	 $as_test_x conftest$ac_exeext
+       }; then :
+  ac_retval=0
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+	ac_retval=1
+fi
+  # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information
+  # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would
+  # interfere with the next link command; also delete a directory that is
+  # left behind by Apple's compiler.  We do this before executing the actions.
+  rm -rf conftest.dSYM conftest_ipa8_conftest.oo
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+  as_fn_set_status $ac_retval
+
+} # ac_fn_c_try_link
+
+# ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES
+# -------------------------------------------------------
+# Tests whether HEADER exists and can be compiled using the include files in
+# INCLUDES, setting the cache variable VAR accordingly.
+ac_fn_c_check_header_compile ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+$as_echo_n "checking for $2... " >&6; }
+if eval \${$3+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$4
+#include <$2>
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  eval "$3=yes"
+else
+  eval "$3=no"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+eval ac_res=\$$3
+	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+
+} # ac_fn_c_check_header_compile
+
+# ac_fn_c_try_cpp LINENO
+# ----------------------
+# Try to preprocess conftest.$ac_ext, and return whether this succeeded.
+ac_fn_c_try_cpp ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  if { { ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err
+  ac_status=$?
+  if test -s conftest.err; then
+    grep -v '^ *+' conftest.err >conftest.er1
+    cat conftest.er1 >&5
+    mv -f conftest.er1 conftest.err
+  fi
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } > conftest.i && {
+	 test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
+	 test ! -s conftest.err
+       }; then :
+  ac_retval=0
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+    ac_retval=1
+fi
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+  as_fn_set_status $ac_retval
+
+} # ac_fn_c_try_cpp
+
+# ac_fn_c_try_run LINENO
+# ----------------------
+# Try to link conftest.$ac_ext, and return whether this succeeded. Assumes
+# that executables *can* be run.
+ac_fn_c_try_run ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  if { { ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_link") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && { ac_try='./conftest$ac_exeext'
+  { { case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; }; then :
+  ac_retval=0
+else
+  $as_echo "$as_me: program exited with status $ac_status" >&5
+       $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+       ac_retval=$ac_status
+fi
+  rm -rf conftest.dSYM conftest_ipa8_conftest.oo
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+  as_fn_set_status $ac_retval
+
+} # ac_fn_c_try_run
+
+# ac_fn_c_check_func LINENO FUNC VAR
+# ----------------------------------
+# Tests whether FUNC exists, setting the cache variable VAR accordingly
+ac_fn_c_check_func ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+$as_echo_n "checking for $2... " >&6; }
+if eval \${$3+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+/* Define $2 to an innocuous variant, in case <limits.h> declares $2.
+   For example, HP-UX 11i <limits.h> declares gettimeofday.  */
+#define $2 innocuous_$2
+
+/* System header to define __stub macros and hopefully few prototypes,
+    which can conflict with char $2 (); 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 $2
+
+/* 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 $2 ();
+/* 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_$2 || defined __stub___$2
+choke me
+#endif
+
+int
+main ()
+{
+return $2 ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  eval "$3=yes"
+else
+  eval "$3=no"
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+fi
+eval ac_res=\$$3
+	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+
+} # ac_fn_c_check_func
+
+# ac_fn_cxx_try_cpp LINENO
+# ------------------------
+# Try to preprocess conftest.$ac_ext, and return whether this succeeded.
+ac_fn_cxx_try_cpp ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  if { { ac_try="$ac_cpp conftest.$ac_ext"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err
+  ac_status=$?
+  if test -s conftest.err; then
+    grep -v '^ *+' conftest.err >conftest.er1
+    cat conftest.er1 >&5
+    mv -f conftest.er1 conftest.err
+  fi
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } > conftest.i && {
+	 test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" ||
+	 test ! -s conftest.err
+       }; then :
+  ac_retval=0
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+    ac_retval=1
+fi
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+  as_fn_set_status $ac_retval
+
+} # ac_fn_cxx_try_cpp
+
+# ac_fn_cxx_try_link LINENO
+# -------------------------
+# Try to link conftest.$ac_ext, and return whether this succeeded.
+ac_fn_cxx_try_link ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  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 ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_link") 2>conftest.err
+  ac_status=$?
+  if test -s conftest.err; then
+    grep -v '^ *+' conftest.err >conftest.er1
+    cat conftest.er1 >&5
+    mv -f conftest.er1 conftest.err
+  fi
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && {
+	 test -z "$ac_cxx_werror_flag" ||
+	 test ! -s conftest.err
+       } && test -s conftest$ac_exeext && {
+	 test "$cross_compiling" = yes ||
+	 $as_test_x conftest$ac_exeext
+       }; then :
+  ac_retval=0
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+	ac_retval=1
+fi
+  # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information
+  # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would
+  # interfere with the next link command; also delete a directory that is
+  # left behind by Apple's compiler.  We do this before executing the actions.
+  rm -rf conftest.dSYM conftest_ipa8_conftest.oo
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+  as_fn_set_status $ac_retval
+
+} # ac_fn_cxx_try_link
+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 Google C++ Testing Framework $as_me 1.7.0, which was
+generated by GNU Autoconf 2.68.  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=.
+    $as_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=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
+    esac
+    case $ac_pass in
+    1) as_fn_append ac_configure_args0 " '$ac_arg'" ;;
+    2)
+      as_fn_append 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
+      as_fn_append ac_configure_args " '$ac_arg'"
+      ;;
+    esac
+  done
+done
+{ ac_configure_args0=; unset ac_configure_args0;}
+{ ac_configure_args1=; unset 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
+
+    $as_echo "## ---------------- ##
+## Cache variables. ##
+## ---------------- ##"
+    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_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
+$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
+      esac
+      case $ac_var in #(
+      _ | IFS | as_nl) ;; #(
+      BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(
+      *) { eval $ac_var=; 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
+
+    $as_echo "## ----------------- ##
+## Output variables. ##
+## ----------------- ##"
+    echo
+    for ac_var in $ac_subst_vars
+    do
+      eval ac_val=\$$ac_var
+      case $ac_val in
+      *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+      esac
+      $as_echo "$ac_var='\''$ac_val'\''"
+    done | sort
+    echo
+
+    if test -n "$ac_subst_files"; then
+      $as_echo "## ------------------- ##
+## File substitutions. ##
+## ------------------- ##"
+      echo
+      for ac_var in $ac_subst_files
+      do
+	eval ac_val=\$$ac_var
+	case $ac_val in
+	*\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
+	esac
+	$as_echo "$ac_var='\''$ac_val'\''"
+      done | sort
+      echo
+    fi
+
+    if test -s confdefs.h; then
+      $as_echo "## ----------- ##
+## confdefs.h. ##
+## ----------- ##"
+      echo
+      cat confdefs.h
+      echo
+    fi
+    test "$ac_signal" != 0 &&
+      $as_echo "$as_me: caught signal $ac_signal"
+    $as_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'; as_fn_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
+
+$as_echo "/* confdefs.h */" > 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
+
+cat >>confdefs.h <<_ACEOF
+#define PACKAGE_URL "$PACKAGE_URL"
+_ACEOF
+
+
+# Let the site file select an alternate cache file if it wants to.
+# Prefer an explicitly selected file to automatically selected ones.
+ac_site_file1=NONE
+ac_site_file2=NONE
+if test -n "$CONFIG_SITE"; then
+  # We do not want a PATH search for config.site.
+  case $CONFIG_SITE in #((
+    -*)  ac_site_file1=./$CONFIG_SITE;;
+    */*) ac_site_file1=$CONFIG_SITE;;
+    *)   ac_site_file1=./$CONFIG_SITE;;
+  esac
+elif test "x$prefix" != xNONE; then
+  ac_site_file1=$prefix/share/config.site
+  ac_site_file2=$prefix/etc/config.site
+else
+  ac_site_file1=$ac_default_prefix/share/config.site
+  ac_site_file2=$ac_default_prefix/etc/config.site
+fi
+for ac_site_file in "$ac_site_file1" "$ac_site_file2"
+do
+  test "x$ac_site_file" = xNONE && continue
+  if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5
+$as_echo "$as_me: loading site script $ac_site_file" >&6;}
+    sed 's/^/| /' "$ac_site_file" >&5
+    . "$ac_site_file" \
+      || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "failed to load site script $ac_site_file
+See \`config.log' for more details" "$LINENO" 5; }
+  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.  DJGPP emulates it as a regular file.
+  if test /dev/null != "$cache_file" && test -f "$cache_file"; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5
+$as_echo "$as_me: loading cache $cache_file" >&6;}
+    case $cache_file in
+      [\\/]* | ?:[\\/]* ) . "$cache_file";;
+      *)                      . "./$cache_file";;
+    esac
+  fi
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5
+$as_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,)
+      { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5
+$as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;}
+      ac_cache_corrupted=: ;;
+    ,set)
+      { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5
+$as_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
+	# differences in whitespace do not lead to failure.
+	ac_old_val_w=`echo x $ac_old_val`
+	ac_new_val_w=`echo x $ac_new_val`
+	if test "$ac_old_val_w" != "$ac_new_val_w"; then
+	  { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5
+$as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;}
+	  ac_cache_corrupted=:
+	else
+	  { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5
+$as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;}
+	  eval $ac_var=\$ac_old_val
+	fi
+	{ $as_echo "$as_me:${as_lineno-$LINENO}:   former value:  \`$ac_old_val'" >&5
+$as_echo "$as_me:   former value:  \`$ac_old_val'" >&2;}
+	{ $as_echo "$as_me:${as_lineno-$LINENO}:   current value: \`$ac_new_val'" >&5
+$as_echo "$as_me:   current value: \`$ac_new_val'" >&2;}
+      fi;;
+  esac
+  # Pass precious variables to config.status.
+  if test "$ac_new_set" = set; then
+    case $ac_new_val in
+    *\'*) ac_arg=$ac_var=`$as_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.
+      *) as_fn_append ac_configure_args " '$ac_arg'" ;;
+    esac
+  fi
+done
+if $ac_cache_corrupted; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+  { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5
+$as_echo "$as_me: error: changes in the environment can compromise the build" >&2;}
+  as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5
+fi
+## -------------------- ##
+## Main body of script. ##
+## -------------------- ##
+
+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
+
+
+
+# Provide various options to initialize the Autoconf and configure processes.
+
+
+
+ac_aux_dir=
+for ac_dir in build-aux "$srcdir"/build-aux; 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
+  as_fn_error $? "cannot find install-sh, install.sh, or shtool in build-aux \"$srcdir\"/build-aux" "$LINENO" 5
+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.
+
+
+ac_config_headers="$ac_config_headers build-aux/config.h"
+
+ac_config_files="$ac_config_files Makefile"
+
+ac_config_files="$ac_config_files scripts/gtest-config"
+
+
+# Initialize Automake with various options. We require at least v1.9, prevent
+# pedantic complaints about package files, and enable various distribution
+# targets.
+am__api_version='1.11'
+
+# 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.
+# Reject install programs that cannot install multiple files.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5
+$as_echo_n "checking for a BSD-compatible install... " >&6; }
+if test -z "$INSTALL"; then
+if ${ac_cv_path_install+:} false; then :
+  $as_echo_n "(cached) " >&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
+	    rm -rf conftest.one conftest.two conftest.dir
+	    echo one > conftest.one
+	    echo two > conftest.two
+	    mkdir conftest.dir
+	    if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" &&
+	      test -s conftest.one && test -s conftest.two &&
+	      test -s conftest.dir/conftest.one &&
+	      test -s conftest.dir/conftest.two
+	    then
+	      ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c"
+	      break 3
+	    fi
+	  fi
+	fi
+      done
+    done
+    ;;
+esac
+
+  done
+IFS=$as_save_IFS
+
+rm -rf conftest.one conftest.two conftest.dir
+
+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
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5
+$as_echo "$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'
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5
+$as_echo_n "checking whether build environment is sane... " >&6; }
+# Just in case
+sleep 1
+echo timestamp > conftest.file
+# Reject unsafe characters in $srcdir or the absolute working directory
+# name.  Accept space and tab only in the latter.
+am_lf='
+'
+case `pwd` in
+  *[\\\"\#\$\&\'\`$am_lf]*)
+    as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;;
+esac
+case $srcdir in
+  *[\\\"\#\$\&\'\`$am_lf\ \	]*)
+    as_fn_error $? "unsafe srcdir value: \`$srcdir'" "$LINENO" 5;;
+esac
+
+# 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".
+      as_fn_error $? "ls -t appears to fail.  Make sure there is not a broken
+alias in your environment" "$LINENO" 5
+   fi
+
+   test "$2" = conftest.file
+   )
+then
+   # Ok.
+   :
+else
+   as_fn_error $? "newly created file is older than distributed files!
+Check your system clock" "$LINENO" 5
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "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 $.
+# By default was `s,x,x', remove it if useless.
+ac_script='s/[\\$]/&&/g;s/;s,x,x,$//'
+program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"`
+
+# expand $ac_aux_dir to an absolute path
+am_aux_dir=`cd $ac_aux_dir && pwd`
+
+if test x"${MISSING+set}" != xset; then
+  case $am_aux_dir in
+  *\ * | *\	*)
+    MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;;
+  *)
+    MISSING="\${SHELL} $am_aux_dir/missing" ;;
+  esac
+fi
+# Use eval to expand $SHELL
+if eval "$MISSING --run true"; then
+  am_missing_run="$MISSING --run "
+else
+  am_missing_run=
+  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`missing' script is too old or missing" >&5
+$as_echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;}
+fi
+
+if test x"${install_sh}" != xset; then
+  case $am_aux_dir in
+  *\ * | *\	*)
+    install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;;
+  *)
+    install_sh="\${SHELL} $am_aux_dir/install-sh"
+  esac
+fi
+
+# 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
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_STRIP+:} false; then :
+  $as_echo_n "(cached) " >&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"
+    $as_echo "$as_me:${as_lineno-$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
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5
+$as_echo "$STRIP" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "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
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_STRIP+:} false; then :
+  $as_echo_n "(cached) " >&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"
+    $as_echo "$as_me:${as_lineno-$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
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5
+$as_echo "$ac_ct_STRIP" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_STRIP" = x; then
+    STRIP=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    STRIP=$ac_ct_STRIP
+  fi
+else
+  STRIP="$ac_cv_prog_STRIP"
+fi
+
+fi
+INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s"
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5
+$as_echo_n "checking for a thread-safe mkdir -p... " >&6; }
+if test -z "$MKDIR_P"; then
+  if ${ac_cv_path_mkdir+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_prog in mkdir gmkdir; do
+	 for ac_exec_ext in '' $ac_executable_extensions; do
+	   { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; } || continue
+	   case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #(
+	     'mkdir (GNU coreutils) '* | \
+	     'mkdir (coreutils) '* | \
+	     'mkdir (fileutils) '4.1*)
+	       ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext
+	       break 3;;
+	   esac
+	 done
+       done
+  done
+IFS=$as_save_IFS
+
+fi
+
+  test -d ./--version && rmdir ./--version
+  if test "${ac_cv_path_mkdir+set}" = set; then
+    MKDIR_P="$ac_cv_path_mkdir -p"
+  else
+    # As a last resort, use the slow shell script.  Don't cache a
+    # value for MKDIR_P 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.
+    MKDIR_P="$ac_install_sh -d"
+  fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5
+$as_echo "$MKDIR_P" >&6; }
+
+mkdir_p="$MKDIR_P"
+case $mkdir_p in
+  [\\/$]* | ?:[\\/]*) ;;
+  */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;;
+esac
+
+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
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_AWK+:} false; then :
+  $as_echo_n "(cached) " >&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"
+    $as_echo "$as_me:${as_lineno-$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
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5
+$as_echo "$AWK" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  test -n "$AWK" && break
+done
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5
+$as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; }
+set x ${MAKE-make}
+ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'`
+if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then :
+  $as_echo_n "(cached) " >&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
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+  SET_MAKE=
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "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
+
+if test "`cd $srcdir && pwd`" != "`pwd`"; then
+  # Use -I$(srcdir) only when $(srcdir) != ., so that make's output
+  # is not polluted with repeated "-I."
+  am__isrc=' -I$(srcdir)'
+  # test to see if srcdir already configured
+  if test -f $srcdir/config.status; then
+    as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5
+  fi
+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='gtest'
+ VERSION='1.7.0'
+
+
+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"}
+
+# We need awk for the "check" target.  The system "awk" is bad on
+# some platforms.
+# Always define AMTAR for backward compatibility.  Yes, it's still used
+# in the wild :-(  We should find a proper way to deprecate it ...
+AMTAR='$${TAR-tar}'
+
+am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'
+
+
+
+
+
+
+# Check for programs used in building Google Test.
+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
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CC+:} false; then :
+  $as_echo_n "(cached) " >&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"
+    $as_echo "$as_me:${as_lineno-$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
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "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
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_CC+:} false; then :
+  $as_echo_n "(cached) " >&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"
+    $as_echo "$as_me:${as_lineno-$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
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
+$as_echo "$ac_ct_CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_CC" = x; then
+    CC=""
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&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
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CC+:} false; then :
+  $as_echo_n "(cached) " >&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"
+    $as_echo "$as_me:${as_lineno-$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
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "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
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CC+:} false; then :
+  $as_echo_n "(cached) " >&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"
+    $as_echo "$as_me:${as_lineno-$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
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "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
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CC+:} false; then :
+  $as_echo_n "(cached) " >&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"
+    $as_echo "$as_me:${as_lineno-$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
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5
+$as_echo "$CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "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
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_CC+:} false; then :
+  $as_echo_n "(cached) " >&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"
+    $as_echo "$as_me:${as_lineno-$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
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5
+$as_echo "$ac_ct_CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "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:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    CC=$ac_ct_CC
+  fi
+fi
+
+fi
+
+
+test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "no acceptable C compiler found in \$PATH
+See \`config.log' for more details" "$LINENO" 5; }
+
+# Provide some information about the compiler.
+$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5
+set X $ac_compile
+ac_compiler=$2
+for ac_option in --version -v -V -qversion; do
+  { { ac_try="$ac_compiler $ac_option >&5"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_compiler $ac_option >&5") 2>conftest.err
+  ac_status=$?
+  if test -s conftest.err; then
+    sed '10a\
+... rest of stderr output deleted ...
+         10q' conftest.err >conftest.er1
+    cat conftest.er1 >&5
+  fi
+  rm -f conftest.er1 conftest.err
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }
+done
+
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files a.out a.out.dSYM 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.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5
+$as_echo_n "checking whether the C compiler works... " >&6; }
+ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'`
+
+# The possible output files:
+ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*"
+
+ac_rmfiles=
+for ac_file in $ac_files
+do
+  case $ac_file in
+    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.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 ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_link_default") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; 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 | *.dSYM | *.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
+if test -z "$ac_file"; then :
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+$as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error 77 "C compiler cannot create executables
+See \`config.log' for more details" "$LINENO" 5; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5
+$as_echo_n "checking for C compiler default output file name... " >&6; }
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5
+$as_echo "$ac_file" >&6; }
+ac_exeext=$ac_cv_exeext
+
+rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out
+ac_clean_files=$ac_clean_files_save
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5
+$as_echo_n "checking for suffix of executables... " >&6; }
+if { { ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_link") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; 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 | *.dSYM | *.o | *.obj ) ;;
+    *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+	  break;;
+    * ) break;;
+  esac
+done
+else
+  { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "cannot compute suffix of executables: cannot compile and link
+See \`config.log' for more details" "$LINENO" 5; }
+fi
+rm -f conftest conftest$ac_cv_exeext
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5
+$as_echo "$ac_cv_exeext" >&6; }
+
+rm -f conftest.$ac_ext
+EXEEXT=$ac_cv_exeext
+ac_exeext=$EXEEXT
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <stdio.h>
+int
+main ()
+{
+FILE *f = fopen ("conftest.out", "w");
+ return ferror (f) || fclose (f) != 0;
+
+  ;
+  return 0;
+}
+_ACEOF
+ac_clean_files="$ac_clean_files conftest.out"
+# Check that the compiler produces executables we can run.  If not, either
+# the compiler is broken, or we cross compile.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5
+$as_echo_n "checking whether we are cross compiling... " >&6; }
+if test "$cross_compiling" != yes; then
+  { { ac_try="$ac_link"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_link") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }
+  if { ac_try='./conftest$ac_cv_exeext'
+  { { case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_try") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; }; then
+    cross_compiling=no
+  else
+    if test "$cross_compiling" = maybe; then
+	cross_compiling=yes
+    else
+	{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "cannot run C compiled programs.
+If you meant to cross compile, use \`--host'.
+See \`config.log' for more details" "$LINENO" 5; }
+    fi
+  fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5
+$as_echo "$cross_compiling" >&6; }
+
+rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out
+ac_clean_files=$ac_clean_files_save
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5
+$as_echo_n "checking for suffix of object files... " >&6; }
+if ${ac_cv_objext+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* 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 ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_compile") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; 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 | *.dSYM ) ;;
+    *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'`
+       break;;
+  esac
+done
+else
+  $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "cannot compute suffix of object files: cannot compile
+See \`config.log' for more details" "$LINENO" 5; }
+fi
+rm -f conftest.$ac_cv_objext conftest.$ac_ext
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5
+$as_echo "$ac_cv_objext" >&6; }
+OBJEXT=$ac_cv_objext
+ac_objext=$OBJEXT
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5
+$as_echo_n "checking whether we are using the GNU C compiler... " >&6; }
+if ${ac_cv_c_compiler_gnu+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+#ifndef __GNUC__
+       choke me
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_compiler_gnu=yes
+else
+  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
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5
+$as_echo "$ac_cv_c_compiler_gnu" >&6; }
+if test $ac_compiler_gnu = yes; then
+  GCC=yes
+else
+  GCC=
+fi
+ac_test_CFLAGS=${CFLAGS+set}
+ac_save_CFLAGS=$CFLAGS
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5
+$as_echo_n "checking whether $CC accepts -g... " >&6; }
+if ${ac_cv_prog_cc_g+:} false; then :
+  $as_echo_n "(cached) " >&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 confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_prog_cc_g=yes
+else
+  CFLAGS=""
+      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+
+else
+  ac_c_werror_flag=$ac_save_c_werror_flag
+	 CFLAGS="-g"
+	 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_prog_cc_g=yes
+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
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5
+$as_echo "$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
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5
+$as_echo_n "checking for $CC option to accept ISO C89... " >&6; }
+if ${ac_cv_prog_cc_c89+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_cv_prog_cc_c89=no
+ac_save_CC=$CC
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* 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"
+  if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_prog_cc_c89=$ac_arg
+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)
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5
+$as_echo "none needed" >&6; } ;;
+  xno)
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5
+$as_echo "unsupported" >&6; } ;;
+  *)
+    CC="$CC $ac_cv_prog_cc_c89"
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5
+$as_echo "$ac_cv_prog_cc_c89" >&6; } ;;
+esac
+if test "x$ac_cv_prog_cc_c89" != xno; then :
+
+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
+DEPDIR="${am__leading_dot}deps"
+
+ac_config_commands="$ac_config_commands depfiles"
+
+
+am_make=${MAKE-make}
+cat > confinc << 'END'
+am__doit:
+	@echo this is the am__doit target
+.PHONY: am__doit
+END
+# If we don't find an include directive, just comment out the code.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make" >&5
+$as_echo_n "checking for style of include used by $am_make... " >&6; }
+am__include="#"
+am__quote=
+_am_result=none
+# First try GNU make style include.
+echo "include confinc" > confmf
+# Ignore all kinds of additional output from `make'.
+case `$am_make -s -f confmf 2> /dev/null` in #(
+*the\ am__doit\ target*)
+  am__include=include
+  am__quote=
+  _am_result=GNU
+  ;;
+esac
+# Now try BSD make style include.
+if test "$am__include" = "#"; then
+   echo '.include "confinc"' > confmf
+   case `$am_make -s -f confmf 2> /dev/null` in #(
+   *the\ am__doit\ target*)
+     am__include=.include
+     am__quote="\""
+     _am_result=BSD
+     ;;
+   esac
+fi
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $_am_result" >&5
+$as_echo "$_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='\'
+  am__nodep='_no'
+fi
+ if test "x$enable_dependency_tracking" != xno; then
+  AMDEP_TRUE=
+  AMDEP_FALSE='#'
+else
+  AMDEP_TRUE='#'
+  AMDEP_FALSE=
+fi
+
+
+
+depcc="$CC"   am_compiler_list=
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5
+$as_echo_n "checking dependency style of $depcc... " >&6; }
+if ${am_cv_CC_dependencies_compiler_type+:} false; then :
+  $as_echo_n "(cached) " >&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'.
+  rm -rf conftest.dir
+  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
+  am__universal=false
+  case " $depcc " in #(
+     *\ -arch\ *\ -arch\ *) am__universal=true ;;
+     esac
+
+  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
+
+    # 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.  Also, some Intel
+    # versions had trouble with output in subdirs
+    am__obj=sub/conftest.${OBJEXT-o}
+    am__minus_obj="-o $am__obj"
+    case $depmode in
+    gcc)
+      # This depmode causes a compiler race in universal mode.
+      test "$am__universal" = false || continue
+      ;;
+    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
+      ;;
+    msvc7 | msvc7msys | msvisualcpp | msvcmsys)
+      # This compiler won't grok `-c -o', but also, the minuso test has
+      # not run yet.  These depmodes are late enough in the game, and
+      # so weak that their functioning should not be impacted.
+      am__obj=conftest.${OBJEXT-o}
+      am__minus_obj=
+      ;;
+    none) break ;;
+    esac
+    if depmode=$depmode \
+       source=sub/conftest.c object=$am__obj \
+       depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+       $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \
+         >/dev/null 2>conftest.err &&
+       grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep $am__obj 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
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5
+$as_echo "$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
+
+
+ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+if test -z "$CXX"; then
+  if test -n "$CCC"; then
+    CXX=$CCC
+  else
+    if test -n "$ac_tool_prefix"; then
+  for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC
+  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
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_CXX+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$CXX"; then
+  ac_cv_prog_CXX="$CXX" # 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_CXX="$ac_tool_prefix$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+CXX=$ac_cv_prog_CXX
+if test -n "$CXX"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5
+$as_echo "$CXX" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+    test -n "$CXX" && break
+  done
+fi
+if test -z "$CXX"; then
+  ac_ct_CXX=$CXX
+  for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_CXX+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_CXX"; then
+  ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # 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_CXX="$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_CXX=$ac_cv_prog_ac_ct_CXX
+if test -n "$ac_ct_CXX"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5
+$as_echo "$ac_ct_CXX" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  test -n "$ac_ct_CXX" && break
+done
+
+  if test "x$ac_ct_CXX" = x; then
+    CXX="g++"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    CXX=$ac_ct_CXX
+  fi
+fi
+
+  fi
+fi
+# Provide some information about the compiler.
+$as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5
+set X $ac_compile
+ac_compiler=$2
+for ac_option in --version -v -V -qversion; do
+  { { ac_try="$ac_compiler $ac_option >&5"
+case "(($ac_try" in
+  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+  *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+  (eval "$ac_compiler $ac_option >&5") 2>conftest.err
+  ac_status=$?
+  if test -s conftest.err; then
+    sed '10a\
+... rest of stderr output deleted ...
+         10q' conftest.err >conftest.er1
+    cat conftest.er1 >&5
+  fi
+  rm -f conftest.er1 conftest.err
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }
+done
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C++ compiler" >&5
+$as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; }
+if ${ac_cv_cxx_compiler_gnu+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+#ifndef __GNUC__
+       choke me
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"; then :
+  ac_compiler_gnu=yes
+else
+  ac_compiler_gnu=no
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+ac_cv_cxx_compiler_gnu=$ac_compiler_gnu
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5
+$as_echo "$ac_cv_cxx_compiler_gnu" >&6; }
+if test $ac_compiler_gnu = yes; then
+  GXX=yes
+else
+  GXX=
+fi
+ac_test_CXXFLAGS=${CXXFLAGS+set}
+ac_save_CXXFLAGS=$CXXFLAGS
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5
+$as_echo_n "checking whether $CXX accepts -g... " >&6; }
+if ${ac_cv_prog_cxx_g+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_save_cxx_werror_flag=$ac_cxx_werror_flag
+   ac_cxx_werror_flag=yes
+   ac_cv_prog_cxx_g=no
+   CXXFLAGS="-g"
+   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"; then :
+  ac_cv_prog_cxx_g=yes
+else
+  CXXFLAGS=""
+      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"; then :
+
+else
+  ac_cxx_werror_flag=$ac_save_cxx_werror_flag
+	 CXXFLAGS="-g"
+	 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"; then :
+  ac_cv_prog_cxx_g=yes
+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_cxx_werror_flag=$ac_save_cxx_werror_flag
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5
+$as_echo "$ac_cv_prog_cxx_g" >&6; }
+if test "$ac_test_CXXFLAGS" = set; then
+  CXXFLAGS=$ac_save_CXXFLAGS
+elif test $ac_cv_prog_cxx_g = yes; then
+  if test "$GXX" = yes; then
+    CXXFLAGS="-g -O2"
+  else
+    CXXFLAGS="-g"
+  fi
+else
+  if test "$GXX" = yes; then
+    CXXFLAGS="-O2"
+  else
+    CXXFLAGS=
+  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
+
+depcc="$CXX"  am_compiler_list=
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5
+$as_echo_n "checking dependency style of $depcc... " >&6; }
+if ${am_cv_CXX_dependencies_compiler_type+:} false; then :
+  $as_echo_n "(cached) " >&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'.
+  rm -rf conftest.dir
+  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_CXX_dependencies_compiler_type=none
+  if test "$am_compiler_list" = ""; then
+     am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp`
+  fi
+  am__universal=false
+  case " $depcc " in #(
+     *\ -arch\ *\ -arch\ *) am__universal=true ;;
+     esac
+
+  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
+
+    # 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.  Also, some Intel
+    # versions had trouble with output in subdirs
+    am__obj=sub/conftest.${OBJEXT-o}
+    am__minus_obj="-o $am__obj"
+    case $depmode in
+    gcc)
+      # This depmode causes a compiler race in universal mode.
+      test "$am__universal" = false || continue
+      ;;
+    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
+      ;;
+    msvc7 | msvc7msys | msvisualcpp | msvcmsys)
+      # This compiler won't grok `-c -o', but also, the minuso test has
+      # not run yet.  These depmodes are late enough in the game, and
+      # so weak that their functioning should not be impacted.
+      am__obj=conftest.${OBJEXT-o}
+      am__minus_obj=
+      ;;
+    none) break ;;
+    esac
+    if depmode=$depmode \
+       source=sub/conftest.c object=$am__obj \
+       depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+       $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \
+         >/dev/null 2>conftest.err &&
+       grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+       grep $am__obj 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_CXX_dependencies_compiler_type=$depmode
+        break
+      fi
+    fi
+  done
+
+  cd ..
+  rm -rf conftest.dir
+else
+  am_cv_CXX_dependencies_compiler_type=none
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CXX_dependencies_compiler_type" >&5
+$as_echo "$am_cv_CXX_dependencies_compiler_type" >&6; }
+CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type
+
+ if
+  test "x$enable_dependency_tracking" != xno \
+  && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then
+  am__fastdepCXX_TRUE=
+  am__fastdepCXX_FALSE='#'
+else
+  am__fastdepCXX_TRUE='#'
+  am__fastdepCXX_FALSE=
+fi
+
+
+ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+case `pwd` in
+  *\ * | *\	*)
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&5
+$as_echo "$as_me: WARNING: Libtool does not cope well with whitespace in \`pwd\`" >&2;} ;;
+esac
+
+
+
+macro_version='2.4.2'
+macro_revision='1.3337'
+
+
+
+
+
+
+
+
+
+
+
+
+
+ltmain="$ac_aux_dir/ltmain.sh"
+
+# Make sure we can run config.sub.
+$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 ||
+  as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5
+$as_echo_n "checking build system type... " >&6; }
+if ${ac_cv_build+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_build_alias=$build_alias
+test "x$ac_build_alias" = x &&
+  ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"`
+test "x$ac_build_alias" = x &&
+  as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5
+ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` ||
+  as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5
+$as_echo "$ac_cv_build" >&6; }
+case $ac_cv_build in
+*-*-*) ;;
+*) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;;
+esac
+build=$ac_cv_build
+ac_save_IFS=$IFS; IFS='-'
+set x $ac_cv_build
+shift
+build_cpu=$1
+build_vendor=$2
+shift; shift
+# Remember, the first character of IFS is used to create $*,
+# except with old shells:
+build_os=$*
+IFS=$ac_save_IFS
+case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5
+$as_echo_n "checking host system type... " >&6; }
+if ${ac_cv_host+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test "x$host_alias" = x; then
+  ac_cv_host=$ac_cv_build
+else
+  ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` ||
+    as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5
+$as_echo "$ac_cv_host" >&6; }
+case $ac_cv_host in
+*-*-*) ;;
+*) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;;
+esac
+host=$ac_cv_host
+ac_save_IFS=$IFS; IFS='-'
+set x $ac_cv_host
+shift
+host_cpu=$1
+host_vendor=$2
+shift; shift
+# Remember, the first character of IFS is used to create $*,
+# except with old shells:
+host_os=$*
+IFS=$ac_save_IFS
+case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac
+
+
+# Backslashify metacharacters that are still active within
+# double-quoted strings.
+sed_quote_subst='s/\(["`$\\]\)/\\\1/g'
+
+# Same as above, but do not quote variable references.
+double_quote_subst='s/\(["`\\]\)/\\\1/g'
+
+# Sed substitution to delay expansion of an escaped shell variable in a
+# double_quote_subst'ed string.
+delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g'
+
+# Sed substitution to delay expansion of an escaped single quote.
+delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g'
+
+# Sed substitution to avoid accidental globbing in evaled expressions
+no_glob_subst='s/\*/\\\*/g'
+
+ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO
+ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to print strings" >&5
+$as_echo_n "checking how to print strings... " >&6; }
+# Test print first, because it will be a builtin if present.
+if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \
+   test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then
+  ECHO='print -r --'
+elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then
+  ECHO='printf %s\n'
+else
+  # Use this function as a fallback that always works.
+  func_fallback_echo ()
+  {
+    eval 'cat <<_LTECHO_EOF
+$1
+_LTECHO_EOF'
+  }
+  ECHO='func_fallback_echo'
+fi
+
+# func_echo_all arg...
+# Invoke $ECHO with all args, space-separated.
+func_echo_all ()
+{
+    $ECHO ""
+}
+
+case "$ECHO" in
+  printf*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: printf" >&5
+$as_echo "printf" >&6; } ;;
+  print*) { $as_echo "$as_me:${as_lineno-$LINENO}: result: print -r" >&5
+$as_echo "print -r" >&6; } ;;
+  *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: cat" >&5
+$as_echo "cat" >&6; } ;;
+esac
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output" >&5
+$as_echo_n "checking for a sed that does not truncate output... " >&6; }
+if ${ac_cv_path_SED+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+            ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/
+     for ac_i in 1 2 3 4 5 6 7; do
+       ac_script="$ac_script$as_nl$ac_script"
+     done
+     echo "$ac_script" 2>/dev/null | sed 99q >conftest.sed
+     { ac_script=; unset ac_script;}
+     if test -z "$SED"; then
+  ac_path_SED_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
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_prog in sed gsed; do
+    for ac_exec_ext in '' $ac_executable_extensions; do
+      ac_path_SED="$as_dir/$ac_prog$ac_exec_ext"
+      { test -f "$ac_path_SED" && $as_test_x "$ac_path_SED"; } || continue
+# Check for GNU ac_path_SED and select it if it is found.
+  # Check for GNU $ac_path_SED
+case `"$ac_path_SED" --version 2>&1` in
+*GNU*)
+  ac_cv_path_SED="$ac_path_SED" ac_path_SED_found=:;;
+*)
+  ac_count=0
+  $as_echo_n 0123456789 >"conftest.in"
+  while :
+  do
+    cat "conftest.in" "conftest.in" >"conftest.tmp"
+    mv "conftest.tmp" "conftest.in"
+    cp "conftest.in" "conftest.nl"
+    $as_echo '' >> "conftest.nl"
+    "$ac_path_SED" -f conftest.sed < "conftest.nl" >"conftest.out" 2>/dev/null || break
+    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+    as_fn_arith $ac_count + 1 && ac_count=$as_val
+    if test $ac_count -gt ${ac_path_SED_max-0}; then
+      # Best one so far, save it but keep looking for a better one
+      ac_cv_path_SED="$ac_path_SED"
+      ac_path_SED_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_SED_found && break 3
+    done
+  done
+  done
+IFS=$as_save_IFS
+  if test -z "$ac_cv_path_SED"; then
+    as_fn_error $? "no acceptable sed could be found in \$PATH" "$LINENO" 5
+  fi
+else
+  ac_cv_path_SED=$SED
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED" >&5
+$as_echo "$ac_cv_path_SED" >&6; }
+ SED="$ac_cv_path_SED"
+  rm -f conftest.sed
+
+test -z "$SED" && SED=sed
+Xsed="$SED -e 1s/^X//"
+
+
+
+
+
+
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5
+$as_echo_n "checking for grep that handles long lines and -e... " >&6; }
+if ${ac_cv_path_GREP+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -z "$GREP"; then
+  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
+  $as_echo_n 0123456789 >"conftest.in"
+  while :
+  do
+    cat "conftest.in" "conftest.in" >"conftest.tmp"
+    mv "conftest.tmp" "conftest.in"
+    cp "conftest.in" "conftest.nl"
+    $as_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
+    as_fn_arith $ac_count + 1 && ac_count=$as_val
+    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
+  if test -z "$ac_cv_path_GREP"; then
+    as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
+  fi
+else
+  ac_cv_path_GREP=$GREP
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5
+$as_echo "$ac_cv_path_GREP" >&6; }
+ GREP="$ac_cv_path_GREP"
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5
+$as_echo_n "checking for egrep... " >&6; }
+if ${ac_cv_path_EGREP+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if echo a | $GREP -E '(a|b)' >/dev/null 2>&1
+   then ac_cv_path_EGREP="$GREP -E"
+   else
+     if test -z "$EGREP"; then
+  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
+  $as_echo_n 0123456789 >"conftest.in"
+  while :
+  do
+    cat "conftest.in" "conftest.in" >"conftest.tmp"
+    mv "conftest.tmp" "conftest.in"
+    cp "conftest.in" "conftest.nl"
+    $as_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
+    as_fn_arith $ac_count + 1 && ac_count=$as_val
+    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
+  if test -z "$ac_cv_path_EGREP"; then
+    as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
+  fi
+else
+  ac_cv_path_EGREP=$EGREP
+fi
+
+   fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5
+$as_echo "$ac_cv_path_EGREP" >&6; }
+ EGREP="$ac_cv_path_EGREP"
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for fgrep" >&5
+$as_echo_n "checking for fgrep... " >&6; }
+if ${ac_cv_path_FGREP+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1
+   then ac_cv_path_FGREP="$GREP -F"
+   else
+     if test -z "$FGREP"; then
+  ac_path_FGREP_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 fgrep; do
+    for ac_exec_ext in '' $ac_executable_extensions; do
+      ac_path_FGREP="$as_dir/$ac_prog$ac_exec_ext"
+      { test -f "$ac_path_FGREP" && $as_test_x "$ac_path_FGREP"; } || continue
+# Check for GNU ac_path_FGREP and select it if it is found.
+  # Check for GNU $ac_path_FGREP
+case `"$ac_path_FGREP" --version 2>&1` in
+*GNU*)
+  ac_cv_path_FGREP="$ac_path_FGREP" ac_path_FGREP_found=:;;
+*)
+  ac_count=0
+  $as_echo_n 0123456789 >"conftest.in"
+  while :
+  do
+    cat "conftest.in" "conftest.in" >"conftest.tmp"
+    mv "conftest.tmp" "conftest.in"
+    cp "conftest.in" "conftest.nl"
+    $as_echo 'FGREP' >> "conftest.nl"
+    "$ac_path_FGREP" FGREP < "conftest.nl" >"conftest.out" 2>/dev/null || break
+    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
+    as_fn_arith $ac_count + 1 && ac_count=$as_val
+    if test $ac_count -gt ${ac_path_FGREP_max-0}; then
+      # Best one so far, save it but keep looking for a better one
+      ac_cv_path_FGREP="$ac_path_FGREP"
+      ac_path_FGREP_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_FGREP_found && break 3
+    done
+  done
+  done
+IFS=$as_save_IFS
+  if test -z "$ac_cv_path_FGREP"; then
+    as_fn_error $? "no acceptable fgrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5
+  fi
+else
+  ac_cv_path_FGREP=$FGREP
+fi
+
+   fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_FGREP" >&5
+$as_echo "$ac_cv_path_FGREP" >&6; }
+ FGREP="$ac_cv_path_FGREP"
+
+
+test -z "$GREP" && GREP=grep
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+# Check whether --with-gnu-ld was given.
+if test "${with_gnu_ld+set}" = set; then :
+  withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes
+else
+  with_gnu_ld=no
+fi
+
+ac_prog=ld
+if test "$GCC" = yes; then
+  # Check if gcc -print-prog-name=ld gives a path.
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5
+$as_echo_n "checking for ld used by $CC... " >&6; }
+  case $host in
+  *-*-mingw*)
+    # gcc leaves a trailing carriage return which upsets mingw
+    ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
+  *)
+    ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
+  esac
+  case $ac_prog in
+    # Accept absolute paths.
+    [\\/]* | ?:[\\/]*)
+      re_direlt='/[^/][^/]*/\.\./'
+      # Canonicalize the pathname of ld
+      ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'`
+      while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do
+	ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"`
+      done
+      test -z "$LD" && LD="$ac_prog"
+      ;;
+  "")
+    # If it fails, then pretend we aren't using GCC.
+    ac_prog=ld
+    ;;
+  *)
+    # If it is relative, then search for the first ld in PATH.
+    with_gnu_ld=unknown
+    ;;
+  esac
+elif test "$with_gnu_ld" = yes; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5
+$as_echo_n "checking for GNU ld... " >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5
+$as_echo_n "checking for non-GNU ld... " >&6; }
+fi
+if ${lt_cv_path_LD+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -z "$LD"; then
+  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+  for ac_dir in $PATH; do
+    IFS="$lt_save_ifs"
+    test -z "$ac_dir" && ac_dir=.
+    if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
+      lt_cv_path_LD="$ac_dir/$ac_prog"
+      # Check to see if the program is GNU ld.  I'd rather use --version,
+      # but apparently some variants of GNU ld only accept -v.
+      # Break only if it was the GNU/non-GNU ld that we prefer.
+      case `"$lt_cv_path_LD" -v 2>&1 </dev/null` in
+      *GNU* | *'with BFD'*)
+	test "$with_gnu_ld" != no && break
+	;;
+      *)
+	test "$with_gnu_ld" != yes && break
+	;;
+      esac
+    fi
+  done
+  IFS="$lt_save_ifs"
+else
+  lt_cv_path_LD="$LD" # Let the user override the test with a path.
+fi
+fi
+
+LD="$lt_cv_path_LD"
+if test -n "$LD"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LD" >&5
+$as_echo "$LD" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5
+$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; }
+if ${lt_cv_prog_gnu_ld+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  # I'd rather use --version here, but apparently some GNU lds only accept -v.
+case `$LD -v 2>&1 </dev/null` in
+*GNU* | *'with BFD'*)
+  lt_cv_prog_gnu_ld=yes
+  ;;
+*)
+  lt_cv_prog_gnu_ld=no
+  ;;
+esac
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_gnu_ld" >&5
+$as_echo "$lt_cv_prog_gnu_ld" >&6; }
+with_gnu_ld=$lt_cv_prog_gnu_ld
+
+
+
+
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for BSD- or MS-compatible name lister (nm)" >&5
+$as_echo_n "checking for BSD- or MS-compatible name lister (nm)... " >&6; }
+if ${lt_cv_path_NM+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$NM"; then
+  # Let the user override the test.
+  lt_cv_path_NM="$NM"
+else
+  lt_nm_to_check="${ac_tool_prefix}nm"
+  if test -n "$ac_tool_prefix" && test "$build" = "$host"; then
+    lt_nm_to_check="$lt_nm_to_check nm"
+  fi
+  for lt_tmp_nm in $lt_nm_to_check; do
+    lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+    for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do
+      IFS="$lt_save_ifs"
+      test -z "$ac_dir" && ac_dir=.
+      tmp_nm="$ac_dir/$lt_tmp_nm"
+      if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then
+	# Check to see if the nm accepts a BSD-compat flag.
+	# Adding the `sed 1q' prevents false positives on HP-UX, which says:
+	#   nm: unknown option "B" ignored
+	# Tru64's nm complains that /dev/null is an invalid object file
+	case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in
+	*/dev/null* | *'Invalid file or object type'*)
+	  lt_cv_path_NM="$tmp_nm -B"
+	  break
+	  ;;
+	*)
+	  case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in
+	  */dev/null*)
+	    lt_cv_path_NM="$tmp_nm -p"
+	    break
+	    ;;
+	  *)
+	    lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but
+	    continue # so that we can try to find one that supports BSD flags
+	    ;;
+	  esac
+	  ;;
+	esac
+      fi
+    done
+    IFS="$lt_save_ifs"
+  done
+  : ${lt_cv_path_NM=no}
+fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_NM" >&5
+$as_echo "$lt_cv_path_NM" >&6; }
+if test "$lt_cv_path_NM" != "no"; then
+  NM="$lt_cv_path_NM"
+else
+  # Didn't find any BSD compatible name lister, look for dumpbin.
+  if test -n "$DUMPBIN"; then :
+    # Let the user override the test.
+  else
+    if test -n "$ac_tool_prefix"; then
+  for ac_prog in dumpbin "link -dump"
+  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
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_DUMPBIN+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$DUMPBIN"; then
+  ac_cv_prog_DUMPBIN="$DUMPBIN" # 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_DUMPBIN="$ac_tool_prefix$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+DUMPBIN=$ac_cv_prog_DUMPBIN
+if test -n "$DUMPBIN"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DUMPBIN" >&5
+$as_echo "$DUMPBIN" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+    test -n "$DUMPBIN" && break
+  done
+fi
+if test -z "$DUMPBIN"; then
+  ac_ct_DUMPBIN=$DUMPBIN
+  for ac_prog in dumpbin "link -dump"
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_DUMPBIN+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_DUMPBIN"; then
+  ac_cv_prog_ac_ct_DUMPBIN="$ac_ct_DUMPBIN" # 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_DUMPBIN="$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_DUMPBIN=$ac_cv_prog_ac_ct_DUMPBIN
+if test -n "$ac_ct_DUMPBIN"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DUMPBIN" >&5
+$as_echo "$ac_ct_DUMPBIN" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  test -n "$ac_ct_DUMPBIN" && break
+done
+
+  if test "x$ac_ct_DUMPBIN" = x; then
+    DUMPBIN=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    DUMPBIN=$ac_ct_DUMPBIN
+  fi
+fi
+
+    case `$DUMPBIN -symbols /dev/null 2>&1 | sed '1q'` in
+    *COFF*)
+      DUMPBIN="$DUMPBIN -symbols"
+      ;;
+    *)
+      DUMPBIN=:
+      ;;
+    esac
+  fi
+
+  if test "$DUMPBIN" != ":"; then
+    NM="$DUMPBIN"
+  fi
+fi
+test -z "$NM" && NM=nm
+
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the name lister ($NM) interface" >&5
+$as_echo_n "checking the name lister ($NM) interface... " >&6; }
+if ${lt_cv_nm_interface+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_nm_interface="BSD nm"
+  echo "int some_variable = 0;" > conftest.$ac_ext
+  (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&5)
+  (eval "$ac_compile" 2>conftest.err)
+  cat conftest.err >&5
+  (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&5)
+  (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out)
+  cat conftest.err >&5
+  (eval echo "\"\$as_me:$LINENO: output\"" >&5)
+  cat conftest.out >&5
+  if $GREP 'External.*some_variable' conftest.out > /dev/null; then
+    lt_cv_nm_interface="MS dumpbin"
+  fi
+  rm -f conftest*
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_nm_interface" >&5
+$as_echo "$lt_cv_nm_interface" >&6; }
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5
+$as_echo_n "checking whether ln -s works... " >&6; }
+LN_S=$as_ln_s
+if test "$LN_S" = "ln -s"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5
+$as_echo "no, using $LN_S" >&6; }
+fi
+
+# find the maximum length of command line arguments
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking the maximum length of command line arguments" >&5
+$as_echo_n "checking the maximum length of command line arguments... " >&6; }
+if ${lt_cv_sys_max_cmd_len+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+    i=0
+  teststring="ABCD"
+
+  case $build_os in
+  msdosdjgpp*)
+    # On DJGPP, this test can blow up pretty badly due to problems in libc
+    # (any single argument exceeding 2000 bytes causes a buffer overrun
+    # during glob expansion).  Even if it were fixed, the result of this
+    # check would be larger than it should be.
+    lt_cv_sys_max_cmd_len=12288;    # 12K is about right
+    ;;
+
+  gnu*)
+    # Under GNU Hurd, this test is not required because there is
+    # no limit to the length of command line arguments.
+    # Libtool will interpret -1 as no limit whatsoever
+    lt_cv_sys_max_cmd_len=-1;
+    ;;
+
+  cygwin* | mingw* | cegcc*)
+    # On Win9x/ME, this test blows up -- it succeeds, but takes
+    # about 5 minutes as the teststring grows exponentially.
+    # Worse, since 9x/ME are not pre-emptively multitasking,
+    # you end up with a "frozen" computer, even though with patience
+    # the test eventually succeeds (with a max line length of 256k).
+    # Instead, let's just punt: use the minimum linelength reported by
+    # all of the supported platforms: 8192 (on NT/2K/XP).
+    lt_cv_sys_max_cmd_len=8192;
+    ;;
+
+  mint*)
+    # On MiNT this can take a long time and run out of memory.
+    lt_cv_sys_max_cmd_len=8192;
+    ;;
+
+  amigaos*)
+    # On AmigaOS with pdksh, this test takes hours, literally.
+    # So we just punt and use a minimum line length of 8192.
+    lt_cv_sys_max_cmd_len=8192;
+    ;;
+
+  netbsd* | freebsd* | openbsd* | darwin* | dragonfly*)
+    # This has been around since 386BSD, at least.  Likely further.
+    if test -x /sbin/sysctl; then
+      lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax`
+    elif test -x /usr/sbin/sysctl; then
+      lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax`
+    else
+      lt_cv_sys_max_cmd_len=65536	# usable default for all BSDs
+    fi
+    # And add a safety zone
+    lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
+    lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
+    ;;
+
+  interix*)
+    # We know the value 262144 and hardcode it with a safety zone (like BSD)
+    lt_cv_sys_max_cmd_len=196608
+    ;;
+
+  os2*)
+    # The test takes a long time on OS/2.
+    lt_cv_sys_max_cmd_len=8192
+    ;;
+
+  osf*)
+    # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure
+    # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not
+    # nice to cause kernel panics so lets avoid the loop below.
+    # First set a reasonable default.
+    lt_cv_sys_max_cmd_len=16384
+    #
+    if test -x /sbin/sysconfig; then
+      case `/sbin/sysconfig -q proc exec_disable_arg_limit` in
+        *1*) lt_cv_sys_max_cmd_len=-1 ;;
+      esac
+    fi
+    ;;
+  sco3.2v5*)
+    lt_cv_sys_max_cmd_len=102400
+    ;;
+  sysv5* | sco5v6* | sysv4.2uw2*)
+    kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null`
+    if test -n "$kargmax"; then
+      lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[	 ]//'`
+    else
+      lt_cv_sys_max_cmd_len=32768
+    fi
+    ;;
+  *)
+    lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null`
+    if test -n "$lt_cv_sys_max_cmd_len"; then
+      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
+      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
+    else
+      # Make teststring a little bigger before we do anything with it.
+      # a 1K string should be a reasonable start.
+      for i in 1 2 3 4 5 6 7 8 ; do
+        teststring=$teststring$teststring
+      done
+      SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}}
+      # If test is not a shell built-in, we'll probably end up computing a
+      # maximum length that is only half of the actual maximum length, but
+      # we can't tell.
+      while { test "X"`env echo "$teststring$teststring" 2>/dev/null` \
+	         = "X$teststring$teststring"; } >/dev/null 2>&1 &&
+	      test $i != 17 # 1/2 MB should be enough
+      do
+        i=`expr $i + 1`
+        teststring=$teststring$teststring
+      done
+      # Only check the string length outside the loop.
+      lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1`
+      teststring=
+      # Add a significant safety factor because C++ compilers can tack on
+      # massive amounts of additional arguments before passing them to the
+      # linker.  It appears as though 1/2 is a usable value.
+      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2`
+    fi
+    ;;
+  esac
+
+fi
+
+if test -n $lt_cv_sys_max_cmd_len ; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sys_max_cmd_len" >&5
+$as_echo "$lt_cv_sys_max_cmd_len" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: none" >&5
+$as_echo "none" >&6; }
+fi
+max_cmd_len=$lt_cv_sys_max_cmd_len
+
+
+
+
+
+
+: ${CP="cp -f"}
+: ${MV="mv -f"}
+: ${RM="rm -f"}
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands some XSI constructs" >&5
+$as_echo_n "checking whether the shell understands some XSI constructs... " >&6; }
+# Try some XSI features
+xsi_shell=no
+( _lt_dummy="a/b/c"
+  test "${_lt_dummy##*/},${_lt_dummy%/*},${_lt_dummy#??}"${_lt_dummy%"$_lt_dummy"}, \
+      = c,a/b,b/c, \
+    && eval 'test $(( 1 + 1 )) -eq 2 \
+    && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \
+  && xsi_shell=yes
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $xsi_shell" >&5
+$as_echo "$xsi_shell" >&6; }
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the shell understands \"+=\"" >&5
+$as_echo_n "checking whether the shell understands \"+=\"... " >&6; }
+lt_shell_append=no
+( foo=bar; set foo baz; eval "$1+=\$2" && test "$foo" = barbaz ) \
+    >/dev/null 2>&1 \
+  && lt_shell_append=yes
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_shell_append" >&5
+$as_echo "$lt_shell_append" >&6; }
+
+
+if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
+  lt_unset=unset
+else
+  lt_unset=false
+fi
+
+
+
+
+
+# test EBCDIC or ASCII
+case `echo X|tr X '\101'` in
+ A) # ASCII based system
+    # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr
+  lt_SP2NL='tr \040 \012'
+  lt_NL2SP='tr \015\012 \040\040'
+  ;;
+ *) # EBCDIC based system
+  lt_SP2NL='tr \100 \n'
+  lt_NL2SP='tr \r\n \100\100'
+  ;;
+esac
+
+
+
+
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to $host format" >&5
+$as_echo_n "checking how to convert $build file names to $host format... " >&6; }
+if ${lt_cv_to_host_file_cmd+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  case $host in
+  *-*-mingw* )
+    case $build in
+      *-*-mingw* ) # actually msys
+        lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32
+        ;;
+      *-*-cygwin* )
+        lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32
+        ;;
+      * ) # otherwise, assume *nix
+        lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32
+        ;;
+    esac
+    ;;
+  *-*-cygwin* )
+    case $build in
+      *-*-mingw* ) # actually msys
+        lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin
+        ;;
+      *-*-cygwin* )
+        lt_cv_to_host_file_cmd=func_convert_file_noop
+        ;;
+      * ) # otherwise, assume *nix
+        lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin
+        ;;
+    esac
+    ;;
+  * ) # unhandled hosts (and "normal" native builds)
+    lt_cv_to_host_file_cmd=func_convert_file_noop
+    ;;
+esac
+
+fi
+
+to_host_file_cmd=$lt_cv_to_host_file_cmd
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_host_file_cmd" >&5
+$as_echo "$lt_cv_to_host_file_cmd" >&6; }
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to toolchain format" >&5
+$as_echo_n "checking how to convert $build file names to toolchain format... " >&6; }
+if ${lt_cv_to_tool_file_cmd+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  #assume ordinary cross tools, or native build.
+lt_cv_to_tool_file_cmd=func_convert_file_noop
+case $host in
+  *-*-mingw* )
+    case $build in
+      *-*-mingw* ) # actually msys
+        lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32
+        ;;
+    esac
+    ;;
+esac
+
+fi
+
+to_tool_file_cmd=$lt_cv_to_tool_file_cmd
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_tool_file_cmd" >&5
+$as_echo "$lt_cv_to_tool_file_cmd" >&6; }
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $LD option to reload object files" >&5
+$as_echo_n "checking for $LD option to reload object files... " >&6; }
+if ${lt_cv_ld_reload_flag+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_ld_reload_flag='-r'
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_reload_flag" >&5
+$as_echo "$lt_cv_ld_reload_flag" >&6; }
+reload_flag=$lt_cv_ld_reload_flag
+case $reload_flag in
+"" | " "*) ;;
+*) reload_flag=" $reload_flag" ;;
+esac
+reload_cmds='$LD$reload_flag -o $output$reload_objs'
+case $host_os in
+  cygwin* | mingw* | pw32* | cegcc*)
+    if test "$GCC" != yes; then
+      reload_cmds=false
+    fi
+    ;;
+  darwin*)
+    if test "$GCC" = yes; then
+      reload_cmds='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs'
+    else
+      reload_cmds='$LD$reload_flag -o $output$reload_objs'
+    fi
+    ;;
+esac
+
+
+
+
+
+
+
+
+
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args.
+set dummy ${ac_tool_prefix}objdump; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_OBJDUMP+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$OBJDUMP"; then
+  ac_cv_prog_OBJDUMP="$OBJDUMP" # 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_OBJDUMP="${ac_tool_prefix}objdump"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+OBJDUMP=$ac_cv_prog_OBJDUMP
+if test -n "$OBJDUMP"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5
+$as_echo "$OBJDUMP" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_OBJDUMP"; then
+  ac_ct_OBJDUMP=$OBJDUMP
+  # Extract the first word of "objdump", so it can be a program name with args.
+set dummy objdump; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_OBJDUMP+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_OBJDUMP"; then
+  ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # 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_OBJDUMP="objdump"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP
+if test -n "$ac_ct_OBJDUMP"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5
+$as_echo "$ac_ct_OBJDUMP" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_OBJDUMP" = x; then
+    OBJDUMP="false"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    OBJDUMP=$ac_ct_OBJDUMP
+  fi
+else
+  OBJDUMP="$ac_cv_prog_OBJDUMP"
+fi
+
+test -z "$OBJDUMP" && OBJDUMP=objdump
+
+
+
+
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to recognize dependent libraries" >&5
+$as_echo_n "checking how to recognize dependent libraries... " >&6; }
+if ${lt_cv_deplibs_check_method+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_file_magic_cmd='$MAGIC_CMD'
+lt_cv_file_magic_test_file=
+lt_cv_deplibs_check_method='unknown'
+# Need to set the preceding variable on all platforms that support
+# interlibrary dependencies.
+# 'none' -- dependencies not supported.
+# `unknown' -- same as none, but documents that we really don't know.
+# 'pass_all' -- all dependencies passed with no checks.
+# 'test_compile' -- check by making test program.
+# 'file_magic [[regex]]' -- check by looking for files in library path
+# which responds to the $file_magic_cmd with a given extended regex.
+# If you have `file' or equivalent on your system and you're not sure
+# whether `pass_all' will *always* work, you probably want this one.
+
+case $host_os in
+aix[4-9]*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+beos*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+bsdi[45]*)
+  lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)'
+  lt_cv_file_magic_cmd='/usr/bin/file -L'
+  lt_cv_file_magic_test_file=/shlib/libc.so
+  ;;
+
+cygwin*)
+  # func_win32_libid is a shell function defined in ltmain.sh
+  lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
+  lt_cv_file_magic_cmd='func_win32_libid'
+  ;;
+
+mingw* | pw32*)
+  # Base MSYS/MinGW do not provide the 'file' command needed by
+  # func_win32_libid shell function, so use a weaker test based on 'objdump',
+  # unless we find 'file', for example because we are cross-compiling.
+  # func_win32_libid assumes BSD nm, so disallow it if using MS dumpbin.
+  if ( test "$lt_cv_nm_interface" = "BSD nm" && file / ) >/dev/null 2>&1; then
+    lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
+    lt_cv_file_magic_cmd='func_win32_libid'
+  else
+    # Keep this pattern in sync with the one in func_win32_libid.
+    lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)'
+    lt_cv_file_magic_cmd='$OBJDUMP -f'
+  fi
+  ;;
+
+cegcc*)
+  # use the weaker test based on 'objdump'. See mingw*.
+  lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?'
+  lt_cv_file_magic_cmd='$OBJDUMP -f'
+  ;;
+
+darwin* | rhapsody*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+freebsd* | dragonfly*)
+  if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then
+    case $host_cpu in
+    i*86 )
+      # Not sure whether the presence of OpenBSD here was a mistake.
+      # Let's accept both of them until this is cleared up.
+      lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[3-9]86 (compact )?demand paged shared library'
+      lt_cv_file_magic_cmd=/usr/bin/file
+      lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*`
+      ;;
+    esac
+  else
+    lt_cv_deplibs_check_method=pass_all
+  fi
+  ;;
+
+gnu*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+haiku*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+hpux10.20* | hpux11*)
+  lt_cv_file_magic_cmd=/usr/bin/file
+  case $host_cpu in
+  ia64*)
+    lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64'
+    lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so
+    ;;
+  hppa*64*)
+    lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]'
+    lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl
+    ;;
+  *)
+    lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9]\.[0-9]) shared library'
+    lt_cv_file_magic_test_file=/usr/lib/libc.sl
+    ;;
+  esac
+  ;;
+
+interix[3-9]*)
+  # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here
+  lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|\.a)$'
+  ;;
+
+irix5* | irix6* | nonstopux*)
+  case $LD in
+  *-32|*"-32 ") libmagic=32-bit;;
+  *-n32|*"-n32 ") libmagic=N32;;
+  *-64|*"-64 ") libmagic=64-bit;;
+  *) libmagic=never-match;;
+  esac
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+# This must be glibc/ELF.
+linux* | k*bsd*-gnu | kopensolaris*-gnu)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+netbsd* | netbsdelf*-gnu)
+  if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then
+    lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$'
+  else
+    lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|_pic\.a)$'
+  fi
+  ;;
+
+newos6*)
+  lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (executable|dynamic lib)'
+  lt_cv_file_magic_cmd=/usr/bin/file
+  lt_cv_file_magic_test_file=/usr/lib/libnls.so
+  ;;
+
+*nto* | *qnx*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+openbsd*)
+  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+    lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|\.so|_pic\.a)$'
+  else
+    lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$'
+  fi
+  ;;
+
+osf3* | osf4* | osf5*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+rdos*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+solaris*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+sysv4 | sysv4.3*)
+  case $host_vendor in
+  motorola)
+    lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]'
+    lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*`
+    ;;
+  ncr)
+    lt_cv_deplibs_check_method=pass_all
+    ;;
+  sequent)
+    lt_cv_file_magic_cmd='/bin/file'
+    lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )'
+    ;;
+  sni)
+    lt_cv_file_magic_cmd='/bin/file'
+    lt_cv_deplibs_check_method="file_magic ELF [0-9][0-9]*-bit [LM]SB dynamic lib"
+    lt_cv_file_magic_test_file=/lib/libc.so
+    ;;
+  siemens)
+    lt_cv_deplibs_check_method=pass_all
+    ;;
+  pc)
+    lt_cv_deplibs_check_method=pass_all
+    ;;
+  esac
+  ;;
+
+tpf*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+esac
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_deplibs_check_method" >&5
+$as_echo "$lt_cv_deplibs_check_method" >&6; }
+
+file_magic_glob=
+want_nocaseglob=no
+if test "$build" = "$host"; then
+  case $host_os in
+  mingw* | pw32*)
+    if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then
+      want_nocaseglob=yes
+    else
+      file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[\1]\/[\1]\/g;/g"`
+    fi
+    ;;
+  esac
+fi
+
+file_magic_cmd=$lt_cv_file_magic_cmd
+deplibs_check_method=$lt_cv_deplibs_check_method
+test -z "$deplibs_check_method" && deplibs_check_method=unknown
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args.
+set dummy ${ac_tool_prefix}dlltool; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_DLLTOOL+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$DLLTOOL"; then
+  ac_cv_prog_DLLTOOL="$DLLTOOL" # 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_DLLTOOL="${ac_tool_prefix}dlltool"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+DLLTOOL=$ac_cv_prog_DLLTOOL
+if test -n "$DLLTOOL"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DLLTOOL" >&5
+$as_echo "$DLLTOOL" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_DLLTOOL"; then
+  ac_ct_DLLTOOL=$DLLTOOL
+  # Extract the first word of "dlltool", so it can be a program name with args.
+set dummy dlltool; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_DLLTOOL+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_DLLTOOL"; then
+  ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # 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_DLLTOOL="dlltool"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL
+if test -n "$ac_ct_DLLTOOL"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL" >&5
+$as_echo "$ac_ct_DLLTOOL" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_DLLTOOL" = x; then
+    DLLTOOL="false"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    DLLTOOL=$ac_ct_DLLTOOL
+  fi
+else
+  DLLTOOL="$ac_cv_prog_DLLTOOL"
+fi
+
+test -z "$DLLTOOL" && DLLTOOL=dlltool
+
+
+
+
+
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to associate runtime and link libraries" >&5
+$as_echo_n "checking how to associate runtime and link libraries... " >&6; }
+if ${lt_cv_sharedlib_from_linklib_cmd+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_sharedlib_from_linklib_cmd='unknown'
+
+case $host_os in
+cygwin* | mingw* | pw32* | cegcc*)
+  # two different shell functions defined in ltmain.sh
+  # decide which to use based on capabilities of $DLLTOOL
+  case `$DLLTOOL --help 2>&1` in
+  *--identify-strict*)
+    lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib
+    ;;
+  *)
+    lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback
+    ;;
+  esac
+  ;;
+*)
+  # fallback: assume linklib IS sharedlib
+  lt_cv_sharedlib_from_linklib_cmd="$ECHO"
+  ;;
+esac
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_sharedlib_from_linklib_cmd" >&5
+$as_echo "$lt_cv_sharedlib_from_linklib_cmd" >&6; }
+sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd
+test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO
+
+
+
+
+
+
+
+
+if test -n "$ac_tool_prefix"; then
+  for ac_prog in ar
+  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
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_AR+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$AR"; then
+  ac_cv_prog_AR="$AR" # 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_AR="$ac_tool_prefix$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+AR=$ac_cv_prog_AR
+if test -n "$AR"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AR" >&5
+$as_echo "$AR" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+    test -n "$AR" && break
+  done
+fi
+if test -z "$AR"; then
+  ac_ct_AR=$AR
+  for ac_prog in ar
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_AR+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_AR"; then
+  ac_cv_prog_ac_ct_AR="$ac_ct_AR" # 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_AR="$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_AR=$ac_cv_prog_ac_ct_AR
+if test -n "$ac_ct_AR"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5
+$as_echo "$ac_ct_AR" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  test -n "$ac_ct_AR" && break
+done
+
+  if test "x$ac_ct_AR" = x; then
+    AR="false"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    AR=$ac_ct_AR
+  fi
+fi
+
+: ${AR=ar}
+: ${AR_FLAGS=cru}
+
+
+
+
+
+
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for archiver @FILE support" >&5
+$as_echo_n "checking for archiver @FILE support... " >&6; }
+if ${lt_cv_ar_at_file+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_ar_at_file=no
+   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"; then :
+  echo conftest.$ac_objext > conftest.lst
+      lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&5'
+      { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5
+  (eval $lt_ar_try) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }
+      if test "$ac_status" -eq 0; then
+	# Ensure the archiver fails upon bogus file names.
+	rm -f conftest.$ac_objext libconftest.a
+	{ { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$lt_ar_try\""; } >&5
+  (eval $lt_ar_try) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }
+	if test "$ac_status" -ne 0; then
+          lt_cv_ar_at_file=@
+        fi
+      fi
+      rm -f conftest.* libconftest.a
+
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ar_at_file" >&5
+$as_echo "$lt_cv_ar_at_file" >&6; }
+
+if test "x$lt_cv_ar_at_file" = xno; then
+  archiver_list_spec=
+else
+  archiver_list_spec=$lt_cv_ar_at_file
+fi
+
+
+
+
+
+
+
+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
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_STRIP+:} false; then :
+  $as_echo_n "(cached) " >&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"
+    $as_echo "$as_me:${as_lineno-$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
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5
+$as_echo "$STRIP" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "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
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_STRIP+:} false; then :
+  $as_echo_n "(cached) " >&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"
+    $as_echo "$as_me:${as_lineno-$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
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5
+$as_echo "$ac_ct_STRIP" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_STRIP" = x; then
+    STRIP=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    STRIP=$ac_ct_STRIP
+  fi
+else
+  STRIP="$ac_cv_prog_STRIP"
+fi
+
+test -z "$STRIP" && STRIP=:
+
+
+
+
+
+
+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
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_RANLIB+:} false; then :
+  $as_echo_n "(cached) " >&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"
+    $as_echo "$as_me:${as_lineno-$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
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5
+$as_echo "$RANLIB" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "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
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_RANLIB+:} false; then :
+  $as_echo_n "(cached) " >&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"
+    $as_echo "$as_me:${as_lineno-$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
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5
+$as_echo "$ac_ct_RANLIB" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_RANLIB" = x; then
+    RANLIB=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    RANLIB=$ac_ct_RANLIB
+  fi
+else
+  RANLIB="$ac_cv_prog_RANLIB"
+fi
+
+test -z "$RANLIB" && RANLIB=:
+
+
+
+
+
+
+# Determine commands to create old-style static archives.
+old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs'
+old_postinstall_cmds='chmod 644 $oldlib'
+old_postuninstall_cmds=
+
+if test -n "$RANLIB"; then
+  case $host_os in
+  openbsd*)
+    old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib"
+    ;;
+  *)
+    old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib"
+    ;;
+  esac
+  old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib"
+fi
+
+case $host_os in
+  darwin*)
+    lock_old_archive_extraction=yes ;;
+  *)
+    lock_old_archive_extraction=no ;;
+esac
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+# If no C compiler was specified, use CC.
+LTCC=${LTCC-"$CC"}
+
+# If no C compiler flags were specified, use CFLAGS.
+LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
+
+# Allow CC to be a program name with arguments.
+compiler=$CC
+
+
+# Check for command to grab the raw symbol name followed by C symbol from nm.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking command to parse $NM output from $compiler object" >&5
+$as_echo_n "checking command to parse $NM output from $compiler object... " >&6; }
+if ${lt_cv_sys_global_symbol_pipe+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+
+# These are sane defaults that work on at least a few old systems.
+# [They come from Ultrix.  What could be older than Ultrix?!! ;)]
+
+# Character class describing NM global symbol codes.
+symcode='[BCDEGRST]'
+
+# Regexp to match symbols that can be accessed directly from C.
+sympat='\([_A-Za-z][_A-Za-z0-9]*\)'
+
+# Define system-specific variables.
+case $host_os in
+aix*)
+  symcode='[BCDT]'
+  ;;
+cygwin* | mingw* | pw32* | cegcc*)
+  symcode='[ABCDGISTW]'
+  ;;
+hpux*)
+  if test "$host_cpu" = ia64; then
+    symcode='[ABCDEGRST]'
+  fi
+  ;;
+irix* | nonstopux*)
+  symcode='[BCDEGRST]'
+  ;;
+osf*)
+  symcode='[BCDEGQRST]'
+  ;;
+solaris*)
+  symcode='[BDRT]'
+  ;;
+sco3.2v5*)
+  symcode='[DT]'
+  ;;
+sysv4.2uw2*)
+  symcode='[DT]'
+  ;;
+sysv5* | sco5v6* | unixware* | OpenUNIX*)
+  symcode='[ABDT]'
+  ;;
+sysv4)
+  symcode='[DFNSTU]'
+  ;;
+esac
+
+# If we're using GNU nm, then use its standard symbol codes.
+case `$NM -V 2>&1` in
+*GNU* | *'with BFD'*)
+  symcode='[ABCDGIRSTW]' ;;
+esac
+
+# Transform an extracted symbol line into a proper C declaration.
+# Some systems (esp. on ia64) link data and code symbols differently,
+# so use this general approach.
+lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'"
+
+# Transform an extracted symbol line into symbol name and symbol address
+lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\)[ ]*$/  {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/  {\"\2\", (void *) \&\2},/p'"
+lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([^ ]*\)[ ]*$/  {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([^ ]*\) \(lib[^ ]*\)$/  {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/  {\"lib\2\", (void *) \&\2},/p'"
+
+# Handle CRLF in mingw tool chain
+opt_cr=
+case $build_os in
+mingw*)
+  opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp
+  ;;
+esac
+
+# Try without a prefix underscore, then with it.
+for ac_symprfx in "" "_"; do
+
+  # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol.
+  symxfrm="\\1 $ac_symprfx\\2 \\2"
+
+  # Write the raw and C identifiers.
+  if test "$lt_cv_nm_interface" = "MS dumpbin"; then
+    # Fake it for dumpbin and say T for any non-static function
+    # and D for any global variable.
+    # Also find C++ and __fastcall symbols from MSVC++,
+    # which start with @ or ?.
+    lt_cv_sys_global_symbol_pipe="$AWK '"\
+"     {last_section=section; section=\$ 3};"\
+"     /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\
+"     /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\
+"     \$ 0!~/External *\|/{next};"\
+"     / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\
+"     {if(hide[section]) next};"\
+"     {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\
+"     {split(\$ 0, a, /\||\r/); split(a[2], s)};"\
+"     s[1]~/^[@?]/{print s[1], s[1]; next};"\
+"     s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\
+"     ' prfx=^$ac_symprfx"
+  else
+    lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[	 ]\($symcode$symcode*\)[	 ][	 ]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'"
+  fi
+  lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'"
+
+  # Check to see that the pipe works correctly.
+  pipe_works=no
+
+  rm -f conftest*
+  cat > conftest.$ac_ext <<_LT_EOF
+#ifdef __cplusplus
+extern "C" {
+#endif
+char nm_test_var;
+void nm_test_func(void);
+void nm_test_func(void){}
+#ifdef __cplusplus
+}
+#endif
+int main(){nm_test_var='a';nm_test_func();return(0);}
+_LT_EOF
+
+  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+    # Now try to grab the symbols.
+    nlist=conftest.nm
+    if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist\""; } >&5
+  (eval $NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && test -s "$nlist"; then
+      # Try sorting and uniquifying the output.
+      if sort "$nlist" | uniq > "$nlist"T; then
+	mv -f "$nlist"T "$nlist"
+      else
+	rm -f "$nlist"T
+      fi
+
+      # Make sure that we snagged all the symbols we need.
+      if $GREP ' nm_test_var$' "$nlist" >/dev/null; then
+	if $GREP ' nm_test_func$' "$nlist" >/dev/null; then
+	  cat <<_LT_EOF > conftest.$ac_ext
+/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests.  */
+#if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE)
+/* DATA imports from DLLs on WIN32 con't be const, because runtime
+   relocations are performed -- see ld's documentation on pseudo-relocs.  */
+# define LT_DLSYM_CONST
+#elif defined(__osf__)
+/* This system does not cope well with relocations in const data.  */
+# define LT_DLSYM_CONST
+#else
+# define LT_DLSYM_CONST const
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+_LT_EOF
+	  # Now generate the symbol file.
+	  eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext'
+
+	  cat <<_LT_EOF >> conftest.$ac_ext
+
+/* The mapping between symbol names and symbols.  */
+LT_DLSYM_CONST struct {
+  const char *name;
+  void       *address;
+}
+lt__PROGRAM__LTX_preloaded_symbols[] =
+{
+  { "@PROGRAM@", (void *) 0 },
+_LT_EOF
+	  $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/  {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext
+	  cat <<\_LT_EOF >> conftest.$ac_ext
+  {0, (void *) 0}
+};
+
+/* This works around a problem in FreeBSD linker */
+#ifdef FREEBSD_WORKAROUND
+static const void *lt_preloaded_setup() {
+  return lt__PROGRAM__LTX_preloaded_symbols;
+}
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+_LT_EOF
+	  # Now try linking the two files.
+	  mv conftest.$ac_objext conftstm.$ac_objext
+	  lt_globsym_save_LIBS=$LIBS
+	  lt_globsym_save_CFLAGS=$CFLAGS
+	  LIBS="conftstm.$ac_objext"
+	  CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag"
+	  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && test -s conftest${ac_exeext}; then
+	    pipe_works=yes
+	  fi
+	  LIBS=$lt_globsym_save_LIBS
+	  CFLAGS=$lt_globsym_save_CFLAGS
+	else
+	  echo "cannot find nm_test_func in $nlist" >&5
+	fi
+      else
+	echo "cannot find nm_test_var in $nlist" >&5
+      fi
+    else
+      echo "cannot run $lt_cv_sys_global_symbol_pipe" >&5
+    fi
+  else
+    echo "$progname: failed program was:" >&5
+    cat conftest.$ac_ext >&5
+  fi
+  rm -rf conftest* conftst*
+
+  # Do not use the global_symbol_pipe unless it works.
+  if test "$pipe_works" = yes; then
+    break
+  else
+    lt_cv_sys_global_symbol_pipe=
+  fi
+done
+
+fi
+
+if test -z "$lt_cv_sys_global_symbol_pipe"; then
+  lt_cv_sys_global_symbol_to_cdecl=
+fi
+if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: failed" >&5
+$as_echo "failed" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5
+$as_echo "ok" >&6; }
+fi
+
+# Response file support.
+if test "$lt_cv_nm_interface" = "MS dumpbin"; then
+  nm_file_list_spec='@'
+elif $NM --help 2>/dev/null | grep '[@]FILE' >/dev/null; then
+  nm_file_list_spec='@'
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for sysroot" >&5
+$as_echo_n "checking for sysroot... " >&6; }
+
+# Check whether --with-sysroot was given.
+if test "${with_sysroot+set}" = set; then :
+  withval=$with_sysroot;
+else
+  with_sysroot=no
+fi
+
+
+lt_sysroot=
+case ${with_sysroot} in #(
+ yes)
+   if test "$GCC" = yes; then
+     lt_sysroot=`$CC --print-sysroot 2>/dev/null`
+   fi
+   ;; #(
+ /*)
+   lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"`
+   ;; #(
+ no|'')
+   ;; #(
+ *)
+   { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${with_sysroot}" >&5
+$as_echo "${with_sysroot}" >&6; }
+   as_fn_error $? "The sysroot must be an absolute path." "$LINENO" 5
+   ;;
+esac
+
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${lt_sysroot:-no}" >&5
+$as_echo "${lt_sysroot:-no}" >&6; }
+
+
+
+
+
+
+# Check whether --enable-libtool-lock was given.
+if test "${enable_libtool_lock+set}" = set; then :
+  enableval=$enable_libtool_lock;
+fi
+
+test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes
+
+# Some flags need to be propagated to the compiler or linker for good
+# libtool support.
+case $host in
+ia64-*-hpux*)
+  # Find out which ABI we are using.
+  echo 'int i;' > conftest.$ac_ext
+  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+    case `/usr/bin/file conftest.$ac_objext` in
+      *ELF-32*)
+	HPUX_IA64_MODE="32"
+	;;
+      *ELF-64*)
+	HPUX_IA64_MODE="64"
+	;;
+    esac
+  fi
+  rm -rf conftest*
+  ;;
+*-*-irix6*)
+  # Find out which ABI we are using.
+  echo '#line '$LINENO' "configure"' > conftest.$ac_ext
+  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+    if test "$lt_cv_prog_gnu_ld" = yes; then
+      case `/usr/bin/file conftest.$ac_objext` in
+	*32-bit*)
+	  LD="${LD-ld} -melf32bsmip"
+	  ;;
+	*N32*)
+	  LD="${LD-ld} -melf32bmipn32"
+	  ;;
+	*64-bit*)
+	  LD="${LD-ld} -melf64bmip"
+	;;
+      esac
+    else
+      case `/usr/bin/file conftest.$ac_objext` in
+	*32-bit*)
+	  LD="${LD-ld} -32"
+	  ;;
+	*N32*)
+	  LD="${LD-ld} -n32"
+	  ;;
+	*64-bit*)
+	  LD="${LD-ld} -64"
+	  ;;
+      esac
+    fi
+  fi
+  rm -rf conftest*
+  ;;
+
+x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \
+s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
+  # Find out which ABI we are using.
+  echo 'int i;' > conftest.$ac_ext
+  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+    case `/usr/bin/file conftest.o` in
+      *32-bit*)
+	case $host in
+	  x86_64-*kfreebsd*-gnu)
+	    LD="${LD-ld} -m elf_i386_fbsd"
+	    ;;
+	  x86_64-*linux*)
+	    LD="${LD-ld} -m elf_i386"
+	    ;;
+	  ppc64-*linux*|powerpc64-*linux*)
+	    LD="${LD-ld} -m elf32ppclinux"
+	    ;;
+	  s390x-*linux*)
+	    LD="${LD-ld} -m elf_s390"
+	    ;;
+	  sparc64-*linux*)
+	    LD="${LD-ld} -m elf32_sparc"
+	    ;;
+	esac
+	;;
+      *64-bit*)
+	case $host in
+	  x86_64-*kfreebsd*-gnu)
+	    LD="${LD-ld} -m elf_x86_64_fbsd"
+	    ;;
+	  x86_64-*linux*)
+	    LD="${LD-ld} -m elf_x86_64"
+	    ;;
+	  ppc*-*linux*|powerpc*-*linux*)
+	    LD="${LD-ld} -m elf64ppc"
+	    ;;
+	  s390*-*linux*|s390*-*tpf*)
+	    LD="${LD-ld} -m elf64_s390"
+	    ;;
+	  sparc*-*linux*)
+	    LD="${LD-ld} -m elf64_sparc"
+	    ;;
+	esac
+	;;
+    esac
+  fi
+  rm -rf conftest*
+  ;;
+
+*-*-sco3.2v5*)
+  # On SCO OpenServer 5, we need -belf to get full-featured binaries.
+  SAVE_CFLAGS="$CFLAGS"
+  CFLAGS="$CFLAGS -belf"
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler needs -belf" >&5
+$as_echo_n "checking whether the C compiler needs -belf... " >&6; }
+if ${lt_cv_cc_needs_belf+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  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
+
+     cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  lt_cv_cc_needs_belf=yes
+else
+  lt_cv_cc_needs_belf=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+     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
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_cc_needs_belf" >&5
+$as_echo "$lt_cv_cc_needs_belf" >&6; }
+  if test x"$lt_cv_cc_needs_belf" != x"yes"; then
+    # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf
+    CFLAGS="$SAVE_CFLAGS"
+  fi
+  ;;
+*-*solaris*)
+  # Find out which ABI we are using.
+  echo 'int i;' > conftest.$ac_ext
+  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+    case `/usr/bin/file conftest.o` in
+    *64-bit*)
+      case $lt_cv_prog_gnu_ld in
+      yes*)
+        case $host in
+        i?86-*-solaris*)
+          LD="${LD-ld} -m elf_x86_64"
+          ;;
+        sparc*-*-solaris*)
+          LD="${LD-ld} -m elf64_sparc"
+          ;;
+        esac
+        # GNU ld 2.21 introduced _sol2 emulations.  Use them if available.
+        if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then
+          LD="${LD-ld}_sol2"
+        fi
+        ;;
+      *)
+	if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then
+	  LD="${LD-ld} -64"
+	fi
+	;;
+      esac
+      ;;
+    esac
+  fi
+  rm -rf conftest*
+  ;;
+esac
+
+need_locks="$enable_libtool_lock"
+
+if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}mt", so it can be a program name with args.
+set dummy ${ac_tool_prefix}mt; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_MANIFEST_TOOL+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$MANIFEST_TOOL"; then
+  ac_cv_prog_MANIFEST_TOOL="$MANIFEST_TOOL" # 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_MANIFEST_TOOL="${ac_tool_prefix}mt"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+MANIFEST_TOOL=$ac_cv_prog_MANIFEST_TOOL
+if test -n "$MANIFEST_TOOL"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MANIFEST_TOOL" >&5
+$as_echo "$MANIFEST_TOOL" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_MANIFEST_TOOL"; then
+  ac_ct_MANIFEST_TOOL=$MANIFEST_TOOL
+  # Extract the first word of "mt", so it can be a program name with args.
+set dummy mt; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_MANIFEST_TOOL+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_MANIFEST_TOOL"; then
+  ac_cv_prog_ac_ct_MANIFEST_TOOL="$ac_ct_MANIFEST_TOOL" # 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_MANIFEST_TOOL="mt"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_MANIFEST_TOOL=$ac_cv_prog_ac_ct_MANIFEST_TOOL
+if test -n "$ac_ct_MANIFEST_TOOL"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_MANIFEST_TOOL" >&5
+$as_echo "$ac_ct_MANIFEST_TOOL" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_MANIFEST_TOOL" = x; then
+    MANIFEST_TOOL=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    MANIFEST_TOOL=$ac_ct_MANIFEST_TOOL
+  fi
+else
+  MANIFEST_TOOL="$ac_cv_prog_MANIFEST_TOOL"
+fi
+
+test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $MANIFEST_TOOL is a manifest tool" >&5
+$as_echo_n "checking if $MANIFEST_TOOL is a manifest tool... " >&6; }
+if ${lt_cv_path_mainfest_tool+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_path_mainfest_tool=no
+  echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&5
+  $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out
+  cat conftest.err >&5
+  if $GREP 'Manifest Tool' conftest.out > /dev/null; then
+    lt_cv_path_mainfest_tool=yes
+  fi
+  rm -f conftest*
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_mainfest_tool" >&5
+$as_echo "$lt_cv_path_mainfest_tool" >&6; }
+if test "x$lt_cv_path_mainfest_tool" != xyes; then
+  MANIFEST_TOOL=:
+fi
+
+
+
+
+
+
+  case $host_os in
+    rhapsody* | darwin*)
+    if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}dsymutil", so it can be a program name with args.
+set dummy ${ac_tool_prefix}dsymutil; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_DSYMUTIL+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$DSYMUTIL"; then
+  ac_cv_prog_DSYMUTIL="$DSYMUTIL" # 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_DSYMUTIL="${ac_tool_prefix}dsymutil"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+DSYMUTIL=$ac_cv_prog_DSYMUTIL
+if test -n "$DSYMUTIL"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DSYMUTIL" >&5
+$as_echo "$DSYMUTIL" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_DSYMUTIL"; then
+  ac_ct_DSYMUTIL=$DSYMUTIL
+  # Extract the first word of "dsymutil", so it can be a program name with args.
+set dummy dsymutil; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_DSYMUTIL+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_DSYMUTIL"; then
+  ac_cv_prog_ac_ct_DSYMUTIL="$ac_ct_DSYMUTIL" # 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_DSYMUTIL="dsymutil"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_DSYMUTIL=$ac_cv_prog_ac_ct_DSYMUTIL
+if test -n "$ac_ct_DSYMUTIL"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_DSYMUTIL" >&5
+$as_echo "$ac_ct_DSYMUTIL" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_DSYMUTIL" = x; then
+    DSYMUTIL=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    DSYMUTIL=$ac_ct_DSYMUTIL
+  fi
+else
+  DSYMUTIL="$ac_cv_prog_DSYMUTIL"
+fi
+
+    if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}nmedit", so it can be a program name with args.
+set dummy ${ac_tool_prefix}nmedit; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_NMEDIT+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$NMEDIT"; then
+  ac_cv_prog_NMEDIT="$NMEDIT" # 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_NMEDIT="${ac_tool_prefix}nmedit"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+NMEDIT=$ac_cv_prog_NMEDIT
+if test -n "$NMEDIT"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $NMEDIT" >&5
+$as_echo "$NMEDIT" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_NMEDIT"; then
+  ac_ct_NMEDIT=$NMEDIT
+  # Extract the first word of "nmedit", so it can be a program name with args.
+set dummy nmedit; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_NMEDIT+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_NMEDIT"; then
+  ac_cv_prog_ac_ct_NMEDIT="$ac_ct_NMEDIT" # 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_NMEDIT="nmedit"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_NMEDIT=$ac_cv_prog_ac_ct_NMEDIT
+if test -n "$ac_ct_NMEDIT"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_NMEDIT" >&5
+$as_echo "$ac_ct_NMEDIT" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_NMEDIT" = x; then
+    NMEDIT=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    NMEDIT=$ac_ct_NMEDIT
+  fi
+else
+  NMEDIT="$ac_cv_prog_NMEDIT"
+fi
+
+    if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}lipo", so it can be a program name with args.
+set dummy ${ac_tool_prefix}lipo; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_LIPO+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$LIPO"; then
+  ac_cv_prog_LIPO="$LIPO" # 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_LIPO="${ac_tool_prefix}lipo"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+LIPO=$ac_cv_prog_LIPO
+if test -n "$LIPO"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIPO" >&5
+$as_echo "$LIPO" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_LIPO"; then
+  ac_ct_LIPO=$LIPO
+  # Extract the first word of "lipo", so it can be a program name with args.
+set dummy lipo; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_LIPO+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_LIPO"; then
+  ac_cv_prog_ac_ct_LIPO="$ac_ct_LIPO" # 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_LIPO="lipo"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_LIPO=$ac_cv_prog_ac_ct_LIPO
+if test -n "$ac_ct_LIPO"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_LIPO" >&5
+$as_echo "$ac_ct_LIPO" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_LIPO" = x; then
+    LIPO=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    LIPO=$ac_ct_LIPO
+  fi
+else
+  LIPO="$ac_cv_prog_LIPO"
+fi
+
+    if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}otool", so it can be a program name with args.
+set dummy ${ac_tool_prefix}otool; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_OTOOL+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$OTOOL"; then
+  ac_cv_prog_OTOOL="$OTOOL" # 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_OTOOL="${ac_tool_prefix}otool"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+OTOOL=$ac_cv_prog_OTOOL
+if test -n "$OTOOL"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL" >&5
+$as_echo "$OTOOL" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_OTOOL"; then
+  ac_ct_OTOOL=$OTOOL
+  # Extract the first word of "otool", so it can be a program name with args.
+set dummy otool; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_OTOOL+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_OTOOL"; then
+  ac_cv_prog_ac_ct_OTOOL="$ac_ct_OTOOL" # 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_OTOOL="otool"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_OTOOL=$ac_cv_prog_ac_ct_OTOOL
+if test -n "$ac_ct_OTOOL"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL" >&5
+$as_echo "$ac_ct_OTOOL" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_OTOOL" = x; then
+    OTOOL=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    OTOOL=$ac_ct_OTOOL
+  fi
+else
+  OTOOL="$ac_cv_prog_OTOOL"
+fi
+
+    if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}otool64", so it can be a program name with args.
+set dummy ${ac_tool_prefix}otool64; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_OTOOL64+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$OTOOL64"; then
+  ac_cv_prog_OTOOL64="$OTOOL64" # 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_OTOOL64="${ac_tool_prefix}otool64"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+OTOOL64=$ac_cv_prog_OTOOL64
+if test -n "$OTOOL64"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL64" >&5
+$as_echo "$OTOOL64" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_prog_OTOOL64"; then
+  ac_ct_OTOOL64=$OTOOL64
+  # Extract the first word of "otool64", so it can be a program name with args.
+set dummy otool64; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_ac_ct_OTOOL64+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$ac_ct_OTOOL64"; then
+  ac_cv_prog_ac_ct_OTOOL64="$ac_ct_OTOOL64" # 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_OTOOL64="otool64"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+ac_ct_OTOOL64=$ac_cv_prog_ac_ct_OTOOL64
+if test -n "$ac_ct_OTOOL64"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL64" >&5
+$as_echo "$ac_ct_OTOOL64" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_ct_OTOOL64" = x; then
+    OTOOL64=":"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    OTOOL64=$ac_ct_OTOOL64
+  fi
+else
+  OTOOL64="$ac_cv_prog_OTOOL64"
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -single_module linker flag" >&5
+$as_echo_n "checking for -single_module linker flag... " >&6; }
+if ${lt_cv_apple_cc_single_mod+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_apple_cc_single_mod=no
+      if test -z "${LT_MULTI_MODULE}"; then
+	# By default we will add the -single_module flag. You can override
+	# by either setting the environment variable LT_MULTI_MODULE
+	# non-empty at configure time, or by adding -multi_module to the
+	# link flags.
+	rm -rf libconftest.dylib*
+	echo "int foo(void){return 1;}" > conftest.c
+	echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \
+-dynamiclib -Wl,-single_module conftest.c" >&5
+	$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \
+	  -dynamiclib -Wl,-single_module conftest.c 2>conftest.err
+        _lt_result=$?
+	# If there is a non-empty error log, and "single_module"
+	# appears in it, assume the flag caused a linker warning
+        if test -s conftest.err && $GREP single_module conftest.err; then
+	  cat conftest.err >&5
+	# Otherwise, if the output was created with a 0 exit code from
+	# the compiler, it worked.
+	elif test -f libconftest.dylib && test $_lt_result -eq 0; then
+	  lt_cv_apple_cc_single_mod=yes
+	else
+	  cat conftest.err >&5
+	fi
+	rm -rf libconftest.dylib*
+	rm -f conftest.*
+      fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_apple_cc_single_mod" >&5
+$as_echo "$lt_cv_apple_cc_single_mod" >&6; }
+
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -exported_symbols_list linker flag" >&5
+$as_echo_n "checking for -exported_symbols_list linker flag... " >&6; }
+if ${lt_cv_ld_exported_symbols_list+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_ld_exported_symbols_list=no
+      save_LDFLAGS=$LDFLAGS
+      echo "_main" > conftest.sym
+      LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym"
+      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  lt_cv_ld_exported_symbols_list=yes
+else
+  lt_cv_ld_exported_symbols_list=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+	LDFLAGS="$save_LDFLAGS"
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_exported_symbols_list" >&5
+$as_echo "$lt_cv_ld_exported_symbols_list" >&6; }
+
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -force_load linker flag" >&5
+$as_echo_n "checking for -force_load linker flag... " >&6; }
+if ${lt_cv_ld_force_load+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_ld_force_load=no
+      cat > conftest.c << _LT_EOF
+int forced_loaded() { return 2;}
+_LT_EOF
+      echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&5
+      $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&5
+      echo "$AR cru libconftest.a conftest.o" >&5
+      $AR cru libconftest.a conftest.o 2>&5
+      echo "$RANLIB libconftest.a" >&5
+      $RANLIB libconftest.a 2>&5
+      cat > conftest.c << _LT_EOF
+int main() { return 0;}
+_LT_EOF
+      echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&5
+      $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err
+      _lt_result=$?
+      if test -s conftest.err && $GREP force_load conftest.err; then
+	cat conftest.err >&5
+      elif test -f conftest && test $_lt_result -eq 0 && $GREP forced_load conftest >/dev/null 2>&1 ; then
+	lt_cv_ld_force_load=yes
+      else
+	cat conftest.err >&5
+      fi
+        rm -f conftest.err libconftest.a conftest conftest.c
+        rm -rf conftest.dSYM
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_force_load" >&5
+$as_echo "$lt_cv_ld_force_load" >&6; }
+    case $host_os in
+    rhapsody* | darwin1.[012])
+      _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;;
+    darwin1.*)
+      _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;;
+    darwin*) # darwin 5.x on
+      # if running on 10.5 or later, the deployment target defaults
+      # to the OS version, if on x86, and 10.4, the deployment
+      # target defaults to 10.4. Don't you love it?
+      case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in
+	10.0,*86*-darwin8*|10.0,*-darwin[91]*)
+	  _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;;
+	10.[012]*)
+	  _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;;
+	10.*)
+	  _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;;
+      esac
+    ;;
+  esac
+    if test "$lt_cv_apple_cc_single_mod" = "yes"; then
+      _lt_dar_single_mod='$single_module'
+    fi
+    if test "$lt_cv_ld_exported_symbols_list" = "yes"; then
+      _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym'
+    else
+      _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}'
+    fi
+    if test "$DSYMUTIL" != ":" && test "$lt_cv_ld_force_load" = "no"; then
+      _lt_dsymutil='~$DSYMUTIL $lib || :'
+    else
+      _lt_dsymutil=
+    fi
+    ;;
+  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
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5
+$as_echo_n "checking how to run the C preprocessor... " >&6; }
+# On Suns, sometimes $CPP names a directory.
+if test -n "$CPP" && test -d "$CPP"; then
+  CPP=
+fi
+if test -z "$CPP"; then
+  if ${ac_cv_prog_CPP+:} false; then :
+  $as_echo_n "(cached) " >&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 confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+		     Syntax error
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+
+else
+  # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+  # OK, works on sane cases.  Now check whether nonexistent headers
+  # can be detected and how.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <ac_nonexistent.h>
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+  # Broken: success on invalid input.
+continue
+else
+  # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.i 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
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5
+$as_echo "$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 confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+		     Syntax error
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+
+else
+  # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+  # OK, works on sane cases.  Now check whether nonexistent headers
+  # can be detected and how.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <ac_nonexistent.h>
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+  # Broken: success on invalid input.
+continue
+else
+  # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.i conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then :
+
+else
+  { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "C preprocessor \"$CPP\" fails sanity check
+See \`config.log' for more details" "$LINENO" 5; }
+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
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5
+$as_echo_n "checking for ANSI C header files... " >&6; }
+if ${ac_cv_header_stdc+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <stdlib.h>
+#include <stdarg.h>
+#include <string.h>
+#include <float.h>
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+  ac_cv_header_stdc=yes
+else
+  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 confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* 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 confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* 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 confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* 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
+if ac_fn_c_try_run "$LINENO"; then :
+
+else
+  ac_cv_header_stdc=no
+fi
+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
+  conftest.$ac_objext conftest.beam conftest.$ac_ext
+fi
+
+fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5
+$as_echo "$ac_cv_header_stdc" >&6; }
+if test $ac_cv_header_stdc = yes; then
+
+$as_echo "#define STDC_HEADERS 1" >>confdefs.h
+
+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=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
+ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default
+"
+if eval test \"x\$"$as_ac_Header"\" = x"yes"; then :
+  cat >>confdefs.h <<_ACEOF
+#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1
+_ACEOF
+
+fi
+
+done
+
+
+for ac_header in dlfcn.h
+do :
+  ac_fn_c_check_header_compile "$LINENO" "dlfcn.h" "ac_cv_header_dlfcn_h" "$ac_includes_default
+"
+if test "x$ac_cv_header_dlfcn_h" = xyes; then :
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_DLFCN_H 1
+_ACEOF
+
+fi
+
+done
+
+
+
+func_stripname_cnf ()
+{
+  case ${2} in
+  .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;;
+  *)  func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;;
+  esac
+} # func_stripname_cnf
+
+
+
+
+
+# Set options
+
+
+
+        enable_dlopen=no
+
+
+  enable_win32_dll=no
+
+
+            # Check whether --enable-shared was given.
+if test "${enable_shared+set}" = set; then :
+  enableval=$enable_shared; p=${PACKAGE-default}
+    case $enableval in
+    yes) enable_shared=yes ;;
+    no) enable_shared=no ;;
+    *)
+      enable_shared=no
+      # Look at the argument we got.  We use all the common list separators.
+      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+      for pkg in $enableval; do
+	IFS="$lt_save_ifs"
+	if test "X$pkg" = "X$p"; then
+	  enable_shared=yes
+	fi
+      done
+      IFS="$lt_save_ifs"
+      ;;
+    esac
+else
+  enable_shared=yes
+fi
+
+
+
+
+
+
+
+
+
+  # Check whether --enable-static was given.
+if test "${enable_static+set}" = set; then :
+  enableval=$enable_static; p=${PACKAGE-default}
+    case $enableval in
+    yes) enable_static=yes ;;
+    no) enable_static=no ;;
+    *)
+     enable_static=no
+      # Look at the argument we got.  We use all the common list separators.
+      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+      for pkg in $enableval; do
+	IFS="$lt_save_ifs"
+	if test "X$pkg" = "X$p"; then
+	  enable_static=yes
+	fi
+      done
+      IFS="$lt_save_ifs"
+      ;;
+    esac
+else
+  enable_static=yes
+fi
+
+
+
+
+
+
+
+
+
+
+# Check whether --with-pic was given.
+if test "${with_pic+set}" = set; then :
+  withval=$with_pic; lt_p=${PACKAGE-default}
+    case $withval in
+    yes|no) pic_mode=$withval ;;
+    *)
+      pic_mode=default
+      # Look at the argument we got.  We use all the common list separators.
+      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+      for lt_pkg in $withval; do
+	IFS="$lt_save_ifs"
+	if test "X$lt_pkg" = "X$lt_p"; then
+	  pic_mode=yes
+	fi
+      done
+      IFS="$lt_save_ifs"
+      ;;
+    esac
+else
+  pic_mode=default
+fi
+
+
+test -z "$pic_mode" && pic_mode=default
+
+
+
+
+
+
+
+  # Check whether --enable-fast-install was given.
+if test "${enable_fast_install+set}" = set; then :
+  enableval=$enable_fast_install; p=${PACKAGE-default}
+    case $enableval in
+    yes) enable_fast_install=yes ;;
+    no) enable_fast_install=no ;;
+    *)
+      enable_fast_install=no
+      # Look at the argument we got.  We use all the common list separators.
+      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+      for pkg in $enableval; do
+	IFS="$lt_save_ifs"
+	if test "X$pkg" = "X$p"; then
+	  enable_fast_install=yes
+	fi
+      done
+      IFS="$lt_save_ifs"
+      ;;
+    esac
+else
+  enable_fast_install=yes
+fi
+
+
+
+
+
+
+
+
+
+
+
+# This can be used to rebuild libtool when needed
+LIBTOOL_DEPS="$ltmain"
+
+# Always use our own libtool.
+LIBTOOL='$(SHELL) $(top_builddir)/libtool'
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+test -z "$LN_S" && LN_S="ln -s"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+if test -n "${ZSH_VERSION+set}" ; then
+   setopt NO_GLOB_SUBST
+fi
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for objdir" >&5
+$as_echo_n "checking for objdir... " >&6; }
+if ${lt_cv_objdir+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  rm -f .libs 2>/dev/null
+mkdir .libs 2>/dev/null
+if test -d .libs; then
+  lt_cv_objdir=.libs
+else
+  # MS-DOS does not allow filenames that begin with a dot.
+  lt_cv_objdir=_libs
+fi
+rmdir .libs 2>/dev/null
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_objdir" >&5
+$as_echo "$lt_cv_objdir" >&6; }
+objdir=$lt_cv_objdir
+
+
+
+
+
+cat >>confdefs.h <<_ACEOF
+#define LT_OBJDIR "$lt_cv_objdir/"
+_ACEOF
+
+
+
+
+case $host_os in
+aix3*)
+  # AIX sometimes has problems with the GCC collect2 program.  For some
+  # reason, if we set the COLLECT_NAMES environment variable, the problems
+  # vanish in a puff of smoke.
+  if test "X${COLLECT_NAMES+set}" != Xset; then
+    COLLECT_NAMES=
+    export COLLECT_NAMES
+  fi
+  ;;
+esac
+
+# Global variables:
+ofile=libtool
+can_build_shared=yes
+
+# All known linkers require a `.a' archive for static linking (except MSVC,
+# which needs '.lib').
+libext=a
+
+with_gnu_ld="$lt_cv_prog_gnu_ld"
+
+old_CC="$CC"
+old_CFLAGS="$CFLAGS"
+
+# Set sane defaults for various variables
+test -z "$CC" && CC=cc
+test -z "$LTCC" && LTCC=$CC
+test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS
+test -z "$LD" && LD=ld
+test -z "$ac_objext" && ac_objext=o
+
+for cc_temp in $compiler""; do
+  case $cc_temp in
+    compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
+    distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
+    \-*) ;;
+    *) break;;
+  esac
+done
+cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"`
+
+
+# Only perform the check for file, if the check method requires it
+test -z "$MAGIC_CMD" && MAGIC_CMD=file
+case $deplibs_check_method in
+file_magic*)
+  if test "$file_magic_cmd" = '$MAGIC_CMD'; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ${ac_tool_prefix}file" >&5
+$as_echo_n "checking for ${ac_tool_prefix}file... " >&6; }
+if ${lt_cv_path_MAGIC_CMD+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  case $MAGIC_CMD in
+[\\/*] |  ?:[\\/]*)
+  lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path.
+  ;;
+*)
+  lt_save_MAGIC_CMD="$MAGIC_CMD"
+  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+  ac_dummy="/usr/bin$PATH_SEPARATOR$PATH"
+  for ac_dir in $ac_dummy; do
+    IFS="$lt_save_ifs"
+    test -z "$ac_dir" && ac_dir=.
+    if test -f $ac_dir/${ac_tool_prefix}file; then
+      lt_cv_path_MAGIC_CMD="$ac_dir/${ac_tool_prefix}file"
+      if test -n "$file_magic_test_file"; then
+	case $deplibs_check_method in
+	"file_magic "*)
+	  file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"`
+	  MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+	  if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
+	    $EGREP "$file_magic_regex" > /dev/null; then
+	    :
+	  else
+	    cat <<_LT_EOF 1>&2
+
+*** Warning: the command libtool uses to detect shared libraries,
+*** $file_magic_cmd, produces output that libtool cannot recognize.
+*** The result is that libtool may fail to recognize shared libraries
+*** as such.  This will affect the creation of libtool libraries that
+*** depend on shared libraries, but programs linked with such libtool
+*** libraries will work regardless of this problem.  Nevertheless, you
+*** may want to report the problem to your system manager and/or to
+*** bug-libtool at gnu.org
+
+_LT_EOF
+	  fi ;;
+	esac
+      fi
+      break
+    fi
+  done
+  IFS="$lt_save_ifs"
+  MAGIC_CMD="$lt_save_MAGIC_CMD"
+  ;;
+esac
+fi
+
+MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+if test -n "$MAGIC_CMD"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5
+$as_echo "$MAGIC_CMD" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+
+
+
+if test -z "$lt_cv_path_MAGIC_CMD"; then
+  if test -n "$ac_tool_prefix"; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for file" >&5
+$as_echo_n "checking for file... " >&6; }
+if ${lt_cv_path_MAGIC_CMD+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  case $MAGIC_CMD in
+[\\/*] |  ?:[\\/]*)
+  lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path.
+  ;;
+*)
+  lt_save_MAGIC_CMD="$MAGIC_CMD"
+  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+  ac_dummy="/usr/bin$PATH_SEPARATOR$PATH"
+  for ac_dir in $ac_dummy; do
+    IFS="$lt_save_ifs"
+    test -z "$ac_dir" && ac_dir=.
+    if test -f $ac_dir/file; then
+      lt_cv_path_MAGIC_CMD="$ac_dir/file"
+      if test -n "$file_magic_test_file"; then
+	case $deplibs_check_method in
+	"file_magic "*)
+	  file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"`
+	  MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+	  if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
+	    $EGREP "$file_magic_regex" > /dev/null; then
+	    :
+	  else
+	    cat <<_LT_EOF 1>&2
+
+*** Warning: the command libtool uses to detect shared libraries,
+*** $file_magic_cmd, produces output that libtool cannot recognize.
+*** The result is that libtool may fail to recognize shared libraries
+*** as such.  This will affect the creation of libtool libraries that
+*** depend on shared libraries, but programs linked with such libtool
+*** libraries will work regardless of this problem.  Nevertheless, you
+*** may want to report the problem to your system manager and/or to
+*** bug-libtool at gnu.org
+
+_LT_EOF
+	  fi ;;
+	esac
+      fi
+      break
+    fi
+  done
+  IFS="$lt_save_ifs"
+  MAGIC_CMD="$lt_save_MAGIC_CMD"
+  ;;
+esac
+fi
+
+MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+if test -n "$MAGIC_CMD"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD" >&5
+$as_echo "$MAGIC_CMD" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  else
+    MAGIC_CMD=:
+  fi
+fi
+
+  fi
+  ;;
+esac
+
+# Use C for the default configuration in the libtool script
+
+lt_save_CC="$CC"
+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
+
+
+# Source file extension for C test sources.
+ac_ext=c
+
+# Object file extension for compiled C test sources.
+objext=o
+objext=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code="int some_variable = 0;"
+
+# Code to be used in simple link tests
+lt_simple_link_test_code='int main(){return(0);}'
+
+
+
+
+
+
+
+# If no C compiler was specified, use CC.
+LTCC=${LTCC-"$CC"}
+
+# If no C compiler flags were specified, use CFLAGS.
+LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
+
+# Allow CC to be a program name with arguments.
+compiler=$CC
+
+# Save the default compiler, since it gets overwritten when the other
+# tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP.
+compiler_DEFAULT=$CC
+
+# save warnings/boilerplate of simple test code
+ac_outfile=conftest.$ac_objext
+echo "$lt_simple_compile_test_code" >conftest.$ac_ext
+eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_compiler_boilerplate=`cat conftest.err`
+$RM conftest*
+
+ac_outfile=conftest.$ac_objext
+echo "$lt_simple_link_test_code" >conftest.$ac_ext
+eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_linker_boilerplate=`cat conftest.err`
+$RM -r conftest*
+
+
+## CAVEAT EMPTOR:
+## There is no encapsulation within the following macros, do not change
+## the running order or otherwise move them around unless you know exactly
+## what you are doing...
+if test -n "$compiler"; then
+
+lt_prog_compiler_no_builtin_flag=
+
+if test "$GCC" = yes; then
+  case $cc_basename in
+  nvcc*)
+    lt_prog_compiler_no_builtin_flag=' -Xcompiler -fno-builtin' ;;
+  *)
+    lt_prog_compiler_no_builtin_flag=' -fno-builtin' ;;
+  esac
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -fno-rtti -fno-exceptions" >&5
+$as_echo_n "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; }
+if ${lt_cv_prog_compiler_rtti_exceptions+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_prog_compiler_rtti_exceptions=no
+   ac_outfile=conftest.$ac_objext
+   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+   lt_compiler_flag="-fno-rtti -fno-exceptions"
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   # The option is referenced via a variable to avoid confusing sed.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
+   (eval "$lt_compile" 2>conftest.err)
+   ac_status=$?
+   cat conftest.err >&5
+   echo "$as_me:$LINENO: \$? = $ac_status" >&5
+   if (exit $ac_status) && test -s "$ac_outfile"; then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings other than the usual output.
+     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp
+     $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+     if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
+       lt_cv_prog_compiler_rtti_exceptions=yes
+     fi
+   fi
+   $RM conftest*
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_rtti_exceptions" >&5
+$as_echo "$lt_cv_prog_compiler_rtti_exceptions" >&6; }
+
+if test x"$lt_cv_prog_compiler_rtti_exceptions" = xyes; then
+    lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions"
+else
+    :
+fi
+
+fi
+
+
+
+
+
+
+  lt_prog_compiler_wl=
+lt_prog_compiler_pic=
+lt_prog_compiler_static=
+
+
+  if test "$GCC" = yes; then
+    lt_prog_compiler_wl='-Wl,'
+    lt_prog_compiler_static='-static'
+
+    case $host_os in
+      aix*)
+      # All AIX code is PIC.
+      if test "$host_cpu" = ia64; then
+	# AIX 5 now supports IA64 processor
+	lt_prog_compiler_static='-Bstatic'
+      fi
+      ;;
+
+    amigaos*)
+      case $host_cpu in
+      powerpc)
+            # see comment about AmigaOS4 .so support
+            lt_prog_compiler_pic='-fPIC'
+        ;;
+      m68k)
+            # FIXME: we need at least 68020 code to build shared libraries, but
+            # adding the `-m68020' flag to GCC prevents building anything better,
+            # like `-m68040'.
+            lt_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4'
+        ;;
+      esac
+      ;;
+
+    beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
+      # PIC is the default for these OSes.
+      ;;
+
+    mingw* | cygwin* | pw32* | os2* | cegcc*)
+      # This hack is so that the source file can tell whether it is being
+      # built for inclusion in a dll (and should export symbols for example).
+      # Although the cygwin gcc ignores -fPIC, still need this for old-style
+      # (--disable-auto-import) libraries
+      lt_prog_compiler_pic='-DDLL_EXPORT'
+      ;;
+
+    darwin* | rhapsody*)
+      # PIC is the default on this platform
+      # Common symbols not allowed in MH_DYLIB files
+      lt_prog_compiler_pic='-fno-common'
+      ;;
+
+    haiku*)
+      # PIC is the default for Haiku.
+      # The "-static" flag exists, but is broken.
+      lt_prog_compiler_static=
+      ;;
+
+    hpux*)
+      # PIC is the default for 64-bit PA HP-UX, but not for 32-bit
+      # PA HP-UX.  On IA64 HP-UX, PIC is the default but the pic flag
+      # sets the default TLS model and affects inlining.
+      case $host_cpu in
+      hppa*64*)
+	# +Z the default
+	;;
+      *)
+	lt_prog_compiler_pic='-fPIC'
+	;;
+      esac
+      ;;
+
+    interix[3-9]*)
+      # Interix 3.x gcc -fpic/-fPIC options generate broken code.
+      # Instead, we relocate shared libraries at runtime.
+      ;;
+
+    msdosdjgpp*)
+      # Just because we use GCC doesn't mean we suddenly get shared libraries
+      # on systems that don't support them.
+      lt_prog_compiler_can_build_shared=no
+      enable_shared=no
+      ;;
+
+    *nto* | *qnx*)
+      # QNX uses GNU C++, but need to define -shared option too, otherwise
+      # it will coredump.
+      lt_prog_compiler_pic='-fPIC -shared'
+      ;;
+
+    sysv4*MP*)
+      if test -d /usr/nec; then
+	lt_prog_compiler_pic=-Kconform_pic
+      fi
+      ;;
+
+    *)
+      lt_prog_compiler_pic='-fPIC'
+      ;;
+    esac
+
+    case $cc_basename in
+    nvcc*) # Cuda Compiler Driver 2.2
+      lt_prog_compiler_wl='-Xlinker '
+      if test -n "$lt_prog_compiler_pic"; then
+        lt_prog_compiler_pic="-Xcompiler $lt_prog_compiler_pic"
+      fi
+      ;;
+    esac
+  else
+    # PORTME Check for flag to pass linker flags through the system compiler.
+    case $host_os in
+    aix*)
+      lt_prog_compiler_wl='-Wl,'
+      if test "$host_cpu" = ia64; then
+	# AIX 5 now supports IA64 processor
+	lt_prog_compiler_static='-Bstatic'
+      else
+	lt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp'
+      fi
+      ;;
+
+    mingw* | cygwin* | pw32* | os2* | cegcc*)
+      # This hack is so that the source file can tell whether it is being
+      # built for inclusion in a dll (and should export symbols for example).
+      lt_prog_compiler_pic='-DDLL_EXPORT'
+      ;;
+
+    hpux9* | hpux10* | hpux11*)
+      lt_prog_compiler_wl='-Wl,'
+      # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but
+      # not for PA HP-UX.
+      case $host_cpu in
+      hppa*64*|ia64*)
+	# +Z the default
+	;;
+      *)
+	lt_prog_compiler_pic='+Z'
+	;;
+      esac
+      # Is there a better lt_prog_compiler_static that works with the bundled CC?
+      lt_prog_compiler_static='${wl}-a ${wl}archive'
+      ;;
+
+    irix5* | irix6* | nonstopux*)
+      lt_prog_compiler_wl='-Wl,'
+      # PIC (with -KPIC) is the default.
+      lt_prog_compiler_static='-non_shared'
+      ;;
+
+    linux* | k*bsd*-gnu | kopensolaris*-gnu)
+      case $cc_basename in
+      # old Intel for x86_64 which still supported -KPIC.
+      ecc*)
+	lt_prog_compiler_wl='-Wl,'
+	lt_prog_compiler_pic='-KPIC'
+	lt_prog_compiler_static='-static'
+        ;;
+      # icc used to be incompatible with GCC.
+      # ICC 10 doesn't accept -KPIC any more.
+      icc* | ifort*)
+	lt_prog_compiler_wl='-Wl,'
+	lt_prog_compiler_pic='-fPIC'
+	lt_prog_compiler_static='-static'
+        ;;
+      # Lahey Fortran 8.1.
+      lf95*)
+	lt_prog_compiler_wl='-Wl,'
+	lt_prog_compiler_pic='--shared'
+	lt_prog_compiler_static='--static'
+	;;
+      nagfor*)
+	# NAG Fortran compiler
+	lt_prog_compiler_wl='-Wl,-Wl,,'
+	lt_prog_compiler_pic='-PIC'
+	lt_prog_compiler_static='-Bstatic'
+	;;
+      pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*)
+        # Portland Group compilers (*not* the Pentium gcc compiler,
+	# which looks to be a dead project)
+	lt_prog_compiler_wl='-Wl,'
+	lt_prog_compiler_pic='-fpic'
+	lt_prog_compiler_static='-Bstatic'
+        ;;
+      ccc*)
+        lt_prog_compiler_wl='-Wl,'
+        # All Alpha code is PIC.
+        lt_prog_compiler_static='-non_shared'
+        ;;
+      xl* | bgxl* | bgf* | mpixl*)
+	# IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene
+	lt_prog_compiler_wl='-Wl,'
+	lt_prog_compiler_pic='-qpic'
+	lt_prog_compiler_static='-qstaticlink'
+	;;
+      *)
+	case `$CC -V 2>&1 | sed 5q` in
+	*Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [1-7].* | *Sun*Fortran*\ 8.[0-3]*)
+	  # Sun Fortran 8.3 passes all unrecognized flags to the linker
+	  lt_prog_compiler_pic='-KPIC'
+	  lt_prog_compiler_static='-Bstatic'
+	  lt_prog_compiler_wl=''
+	  ;;
+	*Sun\ F* | *Sun*Fortran*)
+	  lt_prog_compiler_pic='-KPIC'
+	  lt_prog_compiler_static='-Bstatic'
+	  lt_prog_compiler_wl='-Qoption ld '
+	  ;;
+	*Sun\ C*)
+	  # Sun C 5.9
+	  lt_prog_compiler_pic='-KPIC'
+	  lt_prog_compiler_static='-Bstatic'
+	  lt_prog_compiler_wl='-Wl,'
+	  ;;
+        *Intel*\ [CF]*Compiler*)
+	  lt_prog_compiler_wl='-Wl,'
+	  lt_prog_compiler_pic='-fPIC'
+	  lt_prog_compiler_static='-static'
+	  ;;
+	*Portland\ Group*)
+	  lt_prog_compiler_wl='-Wl,'
+	  lt_prog_compiler_pic='-fpic'
+	  lt_prog_compiler_static='-Bstatic'
+	  ;;
+	esac
+	;;
+      esac
+      ;;
+
+    newsos6)
+      lt_prog_compiler_pic='-KPIC'
+      lt_prog_compiler_static='-Bstatic'
+      ;;
+
+    *nto* | *qnx*)
+      # QNX uses GNU C++, but need to define -shared option too, otherwise
+      # it will coredump.
+      lt_prog_compiler_pic='-fPIC -shared'
+      ;;
+
+    osf3* | osf4* | osf5*)
+      lt_prog_compiler_wl='-Wl,'
+      # All OSF/1 code is PIC.
+      lt_prog_compiler_static='-non_shared'
+      ;;
+
+    rdos*)
+      lt_prog_compiler_static='-non_shared'
+      ;;
+
+    solaris*)
+      lt_prog_compiler_pic='-KPIC'
+      lt_prog_compiler_static='-Bstatic'
+      case $cc_basename in
+      f77* | f90* | f95* | sunf77* | sunf90* | sunf95*)
+	lt_prog_compiler_wl='-Qoption ld ';;
+      *)
+	lt_prog_compiler_wl='-Wl,';;
+      esac
+      ;;
+
+    sunos4*)
+      lt_prog_compiler_wl='-Qoption ld '
+      lt_prog_compiler_pic='-PIC'
+      lt_prog_compiler_static='-Bstatic'
+      ;;
+
+    sysv4 | sysv4.2uw2* | sysv4.3*)
+      lt_prog_compiler_wl='-Wl,'
+      lt_prog_compiler_pic='-KPIC'
+      lt_prog_compiler_static='-Bstatic'
+      ;;
+
+    sysv4*MP*)
+      if test -d /usr/nec ;then
+	lt_prog_compiler_pic='-Kconform_pic'
+	lt_prog_compiler_static='-Bstatic'
+      fi
+      ;;
+
+    sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
+      lt_prog_compiler_wl='-Wl,'
+      lt_prog_compiler_pic='-KPIC'
+      lt_prog_compiler_static='-Bstatic'
+      ;;
+
+    unicos*)
+      lt_prog_compiler_wl='-Wl,'
+      lt_prog_compiler_can_build_shared=no
+      ;;
+
+    uts4*)
+      lt_prog_compiler_pic='-pic'
+      lt_prog_compiler_static='-Bstatic'
+      ;;
+
+    *)
+      lt_prog_compiler_can_build_shared=no
+      ;;
+    esac
+  fi
+
+case $host_os in
+  # For platforms which do not support PIC, -DPIC is meaningless:
+  *djgpp*)
+    lt_prog_compiler_pic=
+    ;;
+  *)
+    lt_prog_compiler_pic="$lt_prog_compiler_pic -DPIC"
+    ;;
+esac
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5
+$as_echo_n "checking for $compiler option to produce PIC... " >&6; }
+if ${lt_cv_prog_compiler_pic+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_prog_compiler_pic=$lt_prog_compiler_pic
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic" >&5
+$as_echo "$lt_cv_prog_compiler_pic" >&6; }
+lt_prog_compiler_pic=$lt_cv_prog_compiler_pic
+
+#
+# Check to make sure the PIC flag actually works.
+#
+if test -n "$lt_prog_compiler_pic"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5
+$as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic works... " >&6; }
+if ${lt_cv_prog_compiler_pic_works+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_prog_compiler_pic_works=no
+   ac_outfile=conftest.$ac_objext
+   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+   lt_compiler_flag="$lt_prog_compiler_pic -DPIC"
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   # The option is referenced via a variable to avoid confusing sed.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
+   (eval "$lt_compile" 2>conftest.err)
+   ac_status=$?
+   cat conftest.err >&5
+   echo "$as_me:$LINENO: \$? = $ac_status" >&5
+   if (exit $ac_status) && test -s "$ac_outfile"; then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings other than the usual output.
+     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp
+     $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+     if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
+       lt_cv_prog_compiler_pic_works=yes
+     fi
+   fi
+   $RM conftest*
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works" >&5
+$as_echo "$lt_cv_prog_compiler_pic_works" >&6; }
+
+if test x"$lt_cv_prog_compiler_pic_works" = xyes; then
+    case $lt_prog_compiler_pic in
+     "" | " "*) ;;
+     *) lt_prog_compiler_pic=" $lt_prog_compiler_pic" ;;
+     esac
+else
+    lt_prog_compiler_pic=
+     lt_prog_compiler_can_build_shared=no
+fi
+
+fi
+
+
+
+
+
+
+
+
+
+
+
+#
+# Check to make sure the static flag actually works.
+#
+wl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\"$lt_prog_compiler_static\"
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5
+$as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; }
+if ${lt_cv_prog_compiler_static_works+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_prog_compiler_static_works=no
+   save_LDFLAGS="$LDFLAGS"
+   LDFLAGS="$LDFLAGS $lt_tmp_static_flag"
+   echo "$lt_simple_link_test_code" > conftest.$ac_ext
+   if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
+     # The linker can only warn and ignore the option if not recognized
+     # So say no if there are warnings
+     if test -s conftest.err; then
+       # Append any errors to the config.log.
+       cat conftest.err 1>&5
+       $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp
+       $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+       if diff conftest.exp conftest.er2 >/dev/null; then
+         lt_cv_prog_compiler_static_works=yes
+       fi
+     else
+       lt_cv_prog_compiler_static_works=yes
+     fi
+   fi
+   $RM -r conftest*
+   LDFLAGS="$save_LDFLAGS"
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works" >&5
+$as_echo "$lt_cv_prog_compiler_static_works" >&6; }
+
+if test x"$lt_cv_prog_compiler_static_works" = xyes; then
+    :
+else
+    lt_prog_compiler_static=
+fi
+
+
+
+
+
+
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5
+$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; }
+if ${lt_cv_prog_compiler_c_o+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_prog_compiler_c_o=no
+   $RM -r conftest 2>/dev/null
+   mkdir conftest
+   cd conftest
+   mkdir out
+   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+   lt_compiler_flag="-o out/conftest2.$ac_objext"
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
+   (eval "$lt_compile" 2>out/conftest.err)
+   ac_status=$?
+   cat out/conftest.err >&5
+   echo "$as_me:$LINENO: \$? = $ac_status" >&5
+   if (exit $ac_status) && test -s out/conftest2.$ac_objext
+   then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings
+     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp
+     $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
+     if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
+       lt_cv_prog_compiler_c_o=yes
+     fi
+   fi
+   chmod u+w . 2>&5
+   $RM conftest*
+   # SGI C++ compiler will create directory out/ii_files/ for
+   # template instantiation
+   test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files
+   $RM out/* && rmdir out
+   cd ..
+   $RM -r conftest
+   $RM conftest*
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5
+$as_echo "$lt_cv_prog_compiler_c_o" >&6; }
+
+
+
+
+
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5
+$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; }
+if ${lt_cv_prog_compiler_c_o+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_prog_compiler_c_o=no
+   $RM -r conftest 2>/dev/null
+   mkdir conftest
+   cd conftest
+   mkdir out
+   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+   lt_compiler_flag="-o out/conftest2.$ac_objext"
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
+   (eval "$lt_compile" 2>out/conftest.err)
+   ac_status=$?
+   cat out/conftest.err >&5
+   echo "$as_me:$LINENO: \$? = $ac_status" >&5
+   if (exit $ac_status) && test -s out/conftest2.$ac_objext
+   then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings
+     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp
+     $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
+     if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
+       lt_cv_prog_compiler_c_o=yes
+     fi
+   fi
+   chmod u+w . 2>&5
+   $RM conftest*
+   # SGI C++ compiler will create directory out/ii_files/ for
+   # template instantiation
+   test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files
+   $RM out/* && rmdir out
+   cd ..
+   $RM -r conftest
+   $RM conftest*
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o" >&5
+$as_echo "$lt_cv_prog_compiler_c_o" >&6; }
+
+
+
+
+hard_links="nottested"
+if test "$lt_cv_prog_compiler_c_o" = no && test "$need_locks" != no; then
+  # do not overwrite the value of need_locks provided by the user
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5
+$as_echo_n "checking if we can lock with hard links... " >&6; }
+  hard_links=yes
+  $RM conftest*
+  ln conftest.a conftest.b 2>/dev/null && hard_links=no
+  touch conftest.a
+  ln conftest.a conftest.b 2>&5 || hard_links=no
+  ln conftest.a conftest.b 2>/dev/null && hard_links=no
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5
+$as_echo "$hard_links" >&6; }
+  if test "$hard_links" = no; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5
+$as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;}
+    need_locks=warn
+  fi
+else
+  need_locks=no
+fi
+
+
+
+
+
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5
+$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; }
+
+  runpath_var=
+  allow_undefined_flag=
+  always_export_symbols=no
+  archive_cmds=
+  archive_expsym_cmds=
+  compiler_needs_object=no
+  enable_shared_with_static_runtimes=no
+  export_dynamic_flag_spec=
+  export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+  hardcode_automatic=no
+  hardcode_direct=no
+  hardcode_direct_absolute=no
+  hardcode_libdir_flag_spec=
+  hardcode_libdir_separator=
+  hardcode_minus_L=no
+  hardcode_shlibpath_var=unsupported
+  inherit_rpath=no
+  link_all_deplibs=unknown
+  module_cmds=
+  module_expsym_cmds=
+  old_archive_from_new_cmds=
+  old_archive_from_expsyms_cmds=
+  thread_safe_flag_spec=
+  whole_archive_flag_spec=
+  # include_expsyms should be a list of space-separated symbols to be *always*
+  # included in the symbol list
+  include_expsyms=
+  # exclude_expsyms can be an extended regexp of symbols to exclude
+  # it will be wrapped by ` (' and `)$', so one must not match beginning or
+  # end of line.  Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc',
+  # as well as any symbol that contains `d'.
+  exclude_expsyms='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'
+  # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out
+  # platforms (ab)use it in PIC code, but their linkers get confused if
+  # the symbol is explicitly referenced.  Since portable code cannot
+  # rely on this symbol name, it's probably fine to never include it in
+  # preloaded symbol tables.
+  # Exclude shared library initialization/finalization symbols.
+  extract_expsyms_cmds=
+
+  case $host_os in
+  cygwin* | mingw* | pw32* | cegcc*)
+    # FIXME: the MSVC++ port hasn't been tested in a loooong time
+    # When not using gcc, we currently assume that we are using
+    # Microsoft Visual C++.
+    if test "$GCC" != yes; then
+      with_gnu_ld=no
+    fi
+    ;;
+  interix*)
+    # we just hope/assume this is gcc and not c89 (= MSVC++)
+    with_gnu_ld=yes
+    ;;
+  openbsd*)
+    with_gnu_ld=no
+    ;;
+  linux* | k*bsd*-gnu | gnu*)
+    link_all_deplibs=no
+    ;;
+  esac
+
+  ld_shlibs=yes
+
+  # On some targets, GNU ld is compatible enough with the native linker
+  # that we're better off using the native interface for both.
+  lt_use_gnu_ld_interface=no
+  if test "$with_gnu_ld" = yes; then
+    case $host_os in
+      aix*)
+	# The AIX port of GNU ld has always aspired to compatibility
+	# with the native linker.  However, as the warning in the GNU ld
+	# block says, versions before 2.19.5* couldn't really create working
+	# shared libraries, regardless of the interface used.
+	case `$LD -v 2>&1` in
+	  *\ \(GNU\ Binutils\)\ 2.19.5*) ;;
+	  *\ \(GNU\ Binutils\)\ 2.[2-9]*) ;;
+	  *\ \(GNU\ Binutils\)\ [3-9]*) ;;
+	  *)
+	    lt_use_gnu_ld_interface=yes
+	    ;;
+	esac
+	;;
+      *)
+	lt_use_gnu_ld_interface=yes
+	;;
+    esac
+  fi
+
+  if test "$lt_use_gnu_ld_interface" = yes; then
+    # If archive_cmds runs LD, not CC, wlarc should be empty
+    wlarc='${wl}'
+
+    # Set some defaults for GNU ld with shared library support. These
+    # are reset later if shared libraries are not supported. Putting them
+    # here allows them to be overridden if necessary.
+    runpath_var=LD_RUN_PATH
+    hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+    export_dynamic_flag_spec='${wl}--export-dynamic'
+    # ancient GNU ld didn't support --whole-archive et. al.
+    if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then
+      whole_archive_flag_spec="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+    else
+      whole_archive_flag_spec=
+    fi
+    supports_anon_versioning=no
+    case `$LD -v 2>&1` in
+      *GNU\ gold*) supports_anon_versioning=yes ;;
+      *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11
+      *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ...
+      *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ...
+      *\ 2.11.*) ;; # other 2.11 versions
+      *) supports_anon_versioning=yes ;;
+    esac
+
+    # See if GNU ld supports shared libraries.
+    case $host_os in
+    aix[3-9]*)
+      # On AIX/PPC, the GNU linker is very broken
+      if test "$host_cpu" != ia64; then
+	ld_shlibs=no
+	cat <<_LT_EOF 1>&2
+
+*** Warning: the GNU linker, at least up to release 2.19, is reported
+*** to be unable to reliably create shared libraries on AIX.
+*** Therefore, libtool is disabling shared libraries support.  If you
+*** really care for shared libraries, you may want to install binutils
+*** 2.20 or above, or modify your PATH so that a non-GNU linker is found.
+*** You will then need to restart the configuration process.
+
+_LT_EOF
+      fi
+      ;;
+
+    amigaos*)
+      case $host_cpu in
+      powerpc)
+            # see comment about AmigaOS4 .so support
+            archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+            archive_expsym_cmds=''
+        ;;
+      m68k)
+            archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
+            hardcode_libdir_flag_spec='-L$libdir'
+            hardcode_minus_L=yes
+        ;;
+      esac
+      ;;
+
+    beos*)
+      if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+	allow_undefined_flag=unsupported
+	# Joseph Beckenbach <jrb3 at best.com> says some releases of gcc
+	# support --undefined.  This deserves some investigation.  FIXME
+	archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+      else
+	ld_shlibs=no
+      fi
+      ;;
+
+    cygwin* | mingw* | pw32* | cegcc*)
+      # _LT_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless,
+      # as there is no search path for DLLs.
+      hardcode_libdir_flag_spec='-L$libdir'
+      export_dynamic_flag_spec='${wl}--export-all-symbols'
+      allow_undefined_flag=unsupported
+      always_export_symbols=no
+      enable_shared_with_static_runtimes=yes
+      export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols'
+      exclude_expsyms='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'
+
+      if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then
+        archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+	# If the export-symbols file already is a .def file (1st line
+	# is EXPORTS), use it as is; otherwise, prepend...
+	archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
+	  cp $export_symbols $output_objdir/$soname.def;
+	else
+	  echo EXPORTS > $output_objdir/$soname.def;
+	  cat $export_symbols >> $output_objdir/$soname.def;
+	fi~
+	$CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+      else
+	ld_shlibs=no
+      fi
+      ;;
+
+    haiku*)
+      archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+      link_all_deplibs=yes
+      ;;
+
+    interix[3-9]*)
+      hardcode_direct=no
+      hardcode_shlibpath_var=no
+      hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
+      export_dynamic_flag_spec='${wl}-E'
+      # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
+      # Instead, shared libraries are loaded at an image base (0x10000000 by
+      # default) and relocated if they conflict, which is a slow very memory
+      # consuming and fragmenting process.  To avoid this, we pick a random,
+      # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
+      # time.  Moving up from 0x10000000 also allows more sbrk(2) space.
+      archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+      archive_expsym_cmds='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+      ;;
+
+    gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu)
+      tmp_diet=no
+      if test "$host_os" = linux-dietlibc; then
+	case $cc_basename in
+	  diet\ *) tmp_diet=yes;;	# linux-dietlibc with static linking (!diet-dyn)
+	esac
+      fi
+      if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \
+	 && test "$tmp_diet" = no
+      then
+	tmp_addflag=' $pic_flag'
+	tmp_sharedflag='-shared'
+	case $cc_basename,$host_cpu in
+        pgcc*)				# Portland Group C compiler
+	  whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+	  tmp_addflag=' $pic_flag'
+	  ;;
+	pgf77* | pgf90* | pgf95* | pgfortran*)
+					# Portland Group f77 and f90 compilers
+	  whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+	  tmp_addflag=' $pic_flag -Mnomain' ;;
+	ecc*,ia64* | icc*,ia64*)	# Intel C compiler on ia64
+	  tmp_addflag=' -i_dynamic' ;;
+	efc*,ia64* | ifort*,ia64*)	# Intel Fortran compiler on ia64
+	  tmp_addflag=' -i_dynamic -nofor_main' ;;
+	ifc* | ifort*)			# Intel Fortran compiler
+	  tmp_addflag=' -nofor_main' ;;
+	lf95*)				# Lahey Fortran 8.1
+	  whole_archive_flag_spec=
+	  tmp_sharedflag='--shared' ;;
+	xl[cC]* | bgxl[cC]* | mpixl[cC]*) # IBM XL C 8.0 on PPC (deal with xlf below)
+	  tmp_sharedflag='-qmkshrobj'
+	  tmp_addflag= ;;
+	nvcc*)	# Cuda Compiler Driver 2.2
+	  whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+	  compiler_needs_object=yes
+	  ;;
+	esac
+	case `$CC -V 2>&1 | sed 5q` in
+	*Sun\ C*)			# Sun C 5.9
+	  whole_archive_flag_spec='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+	  compiler_needs_object=yes
+	  tmp_sharedflag='-G' ;;
+	*Sun\ F*)			# Sun Fortran 8.3
+	  tmp_sharedflag='-G' ;;
+	esac
+	archive_cmds='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+
+        if test "x$supports_anon_versioning" = xyes; then
+          archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~
+	    cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+	    echo "local: *; };" >> $output_objdir/$libname.ver~
+	    $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'
+        fi
+
+	case $cc_basename in
+	xlf* | bgf* | bgxlf* | mpixlf*)
+	  # IBM XL Fortran 10.1 on PPC cannot create shared libs itself
+	  whole_archive_flag_spec='--whole-archive$convenience --no-whole-archive'
+	  hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+	  archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib'
+	  if test "x$supports_anon_versioning" = xyes; then
+	    archive_expsym_cmds='echo "{ global:" > $output_objdir/$libname.ver~
+	      cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+	      echo "local: *; };" >> $output_objdir/$libname.ver~
+	      $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib'
+	  fi
+	  ;;
+	esac
+      else
+        ld_shlibs=no
+      fi
+      ;;
+
+    netbsd* | netbsdelf*-gnu)
+      if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+	archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib'
+	wlarc=
+      else
+	archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+      fi
+      ;;
+
+    solaris*)
+      if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then
+	ld_shlibs=no
+	cat <<_LT_EOF 1>&2
+
+*** Warning: The releases 2.8.* of the GNU linker cannot reliably
+*** create shared libraries on Solaris systems.  Therefore, libtool
+*** is disabling shared libraries support.  We urge you to upgrade GNU
+*** binutils to release 2.9.1 or newer.  Another option is to modify
+*** your PATH or compiler configuration so that the native linker is
+*** used, and then restart.
+
+_LT_EOF
+      elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+	archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+      else
+	ld_shlibs=no
+      fi
+      ;;
+
+    sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*)
+      case `$LD -v 2>&1` in
+        *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*)
+	ld_shlibs=no
+	cat <<_LT_EOF 1>&2
+
+*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not
+*** reliably create shared libraries on SCO systems.  Therefore, libtool
+*** is disabling shared libraries support.  We urge you to upgrade GNU
+*** binutils to release 2.16.91.0.3 or newer.  Another option is to modify
+*** your PATH or compiler configuration so that the native linker is
+*** used, and then restart.
+
+_LT_EOF
+	;;
+	*)
+	  # For security reasons, it is highly recommended that you always
+	  # use absolute paths for naming shared libraries, and exclude the
+	  # DT_RUNPATH tag from executables and libraries.  But doing so
+	  # requires that you compile everything twice, which is a pain.
+	  if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+	    hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+	    archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	    archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+	  else
+	    ld_shlibs=no
+	  fi
+	;;
+      esac
+      ;;
+
+    sunos4*)
+      archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+      wlarc=
+      hardcode_direct=yes
+      hardcode_shlibpath_var=no
+      ;;
+
+    *)
+      if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+	archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+      else
+	ld_shlibs=no
+      fi
+      ;;
+    esac
+
+    if test "$ld_shlibs" = no; then
+      runpath_var=
+      hardcode_libdir_flag_spec=
+      export_dynamic_flag_spec=
+      whole_archive_flag_spec=
+    fi
+  else
+    # PORTME fill in a description of your system's linker (not GNU ld)
+    case $host_os in
+    aix3*)
+      allow_undefined_flag=unsupported
+      always_export_symbols=yes
+      archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname'
+      # Note: this linker hardcodes the directories in LIBPATH if there
+      # are no directories specified by -L.
+      hardcode_minus_L=yes
+      if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then
+	# Neither direct hardcoding nor static linking is supported with a
+	# broken collect2.
+	hardcode_direct=unsupported
+      fi
+      ;;
+
+    aix[4-9]*)
+      if test "$host_cpu" = ia64; then
+	# On IA64, the linker does run time linking by default, so we don't
+	# have to do anything special.
+	aix_use_runtimelinking=no
+	exp_sym_flag='-Bexport'
+	no_entry_flag=""
+      else
+	# If we're using GNU nm, then we don't want the "-C" option.
+	# -C means demangle to AIX nm, but means don't demangle with GNU nm
+	# Also, AIX nm treats weak defined symbols like other global
+	# defined symbols, whereas GNU nm marks them as "W".
+	if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then
+	  export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
+	else
+	  export_symbols_cmds='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
+	fi
+	aix_use_runtimelinking=no
+
+	# Test if we are trying to use run time linking or normal
+	# AIX style linking. If -brtl is somewhere in LDFLAGS, we
+	# need to do runtime linking.
+	case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*)
+	  for ld_flag in $LDFLAGS; do
+	  if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then
+	    aix_use_runtimelinking=yes
+	    break
+	  fi
+	  done
+	  ;;
+	esac
+
+	exp_sym_flag='-bexport'
+	no_entry_flag='-bnoentry'
+      fi
+
+      # When large executables or shared objects are built, AIX ld can
+      # have problems creating the table of contents.  If linking a library
+      # or program results in "error TOC overflow" add -mminimal-toc to
+      # CXXFLAGS/CFLAGS for g++/gcc.  In the cases where that is not
+      # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
+
+      archive_cmds=''
+      hardcode_direct=yes
+      hardcode_direct_absolute=yes
+      hardcode_libdir_separator=':'
+      link_all_deplibs=yes
+      file_list_spec='${wl}-f,'
+
+      if test "$GCC" = yes; then
+	case $host_os in aix4.[012]|aix4.[012].*)
+	# We only want to do this on AIX 4.2 and lower, the check
+	# below for broken collect2 doesn't work under 4.3+
+	  collect2name=`${CC} -print-prog-name=collect2`
+	  if test -f "$collect2name" &&
+	   strings "$collect2name" | $GREP resolve_lib_name >/dev/null
+	  then
+	  # We have reworked collect2
+	  :
+	  else
+	  # We have old collect2
+	  hardcode_direct=unsupported
+	  # It fails to find uninstalled libraries when the uninstalled
+	  # path is not listed in the libpath.  Setting hardcode_minus_L
+	  # to unsupported forces relinking
+	  hardcode_minus_L=yes
+	  hardcode_libdir_flag_spec='-L$libdir'
+	  hardcode_libdir_separator=
+	  fi
+	  ;;
+	esac
+	shared_flag='-shared'
+	if test "$aix_use_runtimelinking" = yes; then
+	  shared_flag="$shared_flag "'${wl}-G'
+	fi
+	link_all_deplibs=no
+      else
+	# not using gcc
+	if test "$host_cpu" = ia64; then
+	# VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
+	# chokes on -Wl,-G. The following line is correct:
+	  shared_flag='-G'
+	else
+	  if test "$aix_use_runtimelinking" = yes; then
+	    shared_flag='${wl}-G'
+	  else
+	    shared_flag='${wl}-bM:SRE'
+	  fi
+	fi
+      fi
+
+      export_dynamic_flag_spec='${wl}-bexpall'
+      # It seems that -bexpall does not export symbols beginning with
+      # underscore (_), so it is better to generate a list of symbols to export.
+      always_export_symbols=yes
+      if test "$aix_use_runtimelinking" = yes; then
+	# Warning - without using the other runtime loading flags (-brtl),
+	# -berok will link without error, but may produce a broken library.
+	allow_undefined_flag='-berok'
+        # Determine the default libpath from the value encoded in an
+        # empty executable.
+        if test "${lt_cv_aix_libpath+set}" = set; then
+  aix_libpath=$lt_cv_aix_libpath
+else
+  if ${lt_cv_aix_libpath_+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+
+  lt_aix_libpath_sed='
+      /Import File Strings/,/^$/ {
+	  /^0/ {
+	      s/^0  *\([^ ]*\) *$/\1/
+	      p
+	  }
+      }'
+  lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+  # Check for a 64-bit object if we didn't find anything.
+  if test -z "$lt_cv_aix_libpath_"; then
+    lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+  fi
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+  if test -z "$lt_cv_aix_libpath_"; then
+    lt_cv_aix_libpath_="/usr/lib:/lib"
+  fi
+
+fi
+
+  aix_libpath=$lt_cv_aix_libpath_
+fi
+
+        hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath"
+        archive_expsym_cmds='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
+      else
+	if test "$host_cpu" = ia64; then
+	  hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib'
+	  allow_undefined_flag="-z nodefs"
+	  archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols"
+	else
+	 # Determine the default libpath from the value encoded in an
+	 # empty executable.
+	 if test "${lt_cv_aix_libpath+set}" = set; then
+  aix_libpath=$lt_cv_aix_libpath
+else
+  if ${lt_cv_aix_libpath_+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+
+  lt_aix_libpath_sed='
+      /Import File Strings/,/^$/ {
+	  /^0/ {
+	      s/^0  *\([^ ]*\) *$/\1/
+	      p
+	  }
+      }'
+  lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+  # Check for a 64-bit object if we didn't find anything.
+  if test -z "$lt_cv_aix_libpath_"; then
+    lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+  fi
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+  if test -z "$lt_cv_aix_libpath_"; then
+    lt_cv_aix_libpath_="/usr/lib:/lib"
+  fi
+
+fi
+
+  aix_libpath=$lt_cv_aix_libpath_
+fi
+
+	 hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath"
+	  # Warning - without using the other run time loading flags,
+	  # -berok will link without error, but may produce a broken library.
+	  no_undefined_flag=' ${wl}-bernotok'
+	  allow_undefined_flag=' ${wl}-berok'
+	  if test "$with_gnu_ld" = yes; then
+	    # We only use this code for GNU lds that support --whole-archive.
+	    whole_archive_flag_spec='${wl}--whole-archive$convenience ${wl}--no-whole-archive'
+	  else
+	    # Exported symbols can be pulled into shared objects from archives
+	    whole_archive_flag_spec='$convenience'
+	  fi
+	  archive_cmds_need_lc=yes
+	  # This is similar to how AIX traditionally builds its shared libraries.
+	  archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
+	fi
+      fi
+      ;;
+
+    amigaos*)
+      case $host_cpu in
+      powerpc)
+            # see comment about AmigaOS4 .so support
+            archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+            archive_expsym_cmds=''
+        ;;
+      m68k)
+            archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
+            hardcode_libdir_flag_spec='-L$libdir'
+            hardcode_minus_L=yes
+        ;;
+      esac
+      ;;
+
+    bsdi[45]*)
+      export_dynamic_flag_spec=-rdynamic
+      ;;
+
+    cygwin* | mingw* | pw32* | cegcc*)
+      # When not using gcc, we currently assume that we are using
+      # Microsoft Visual C++.
+      # hardcode_libdir_flag_spec is actually meaningless, as there is
+      # no search path for DLLs.
+      case $cc_basename in
+      cl*)
+	# Native MSVC
+	hardcode_libdir_flag_spec=' '
+	allow_undefined_flag=unsupported
+	always_export_symbols=yes
+	file_list_spec='@'
+	# Tell ltmain to make .lib files, not .a files.
+	libext=lib
+	# Tell ltmain to make .dll files, not .so files.
+	shrext_cmds=".dll"
+	# FIXME: Setting linknames here is a bad hack.
+	archive_cmds='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames='
+	archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
+	    sed -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp;
+	  else
+	    sed -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp;
+	  fi~
+	  $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~
+	  linknames='
+	# The linker will not automatically build a static lib if we build a DLL.
+	# _LT_TAGVAR(old_archive_from_new_cmds, )='true'
+	enable_shared_with_static_runtimes=yes
+	exclude_expsyms='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*'
+	export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1,DATA/'\'' | $SED -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols'
+	# Don't use ranlib
+	old_postinstall_cmds='chmod 644 $oldlib'
+	postlink_cmds='lt_outputfile="@OUTPUT@"~
+	  lt_tool_outputfile="@TOOL_OUTPUT@"~
+	  case $lt_outputfile in
+	    *.exe|*.EXE) ;;
+	    *)
+	      lt_outputfile="$lt_outputfile.exe"
+	      lt_tool_outputfile="$lt_tool_outputfile.exe"
+	      ;;
+	  esac~
+	  if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then
+	    $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1;
+	    $RM "$lt_outputfile.manifest";
+	  fi'
+	;;
+      *)
+	# Assume MSVC wrapper
+	hardcode_libdir_flag_spec=' '
+	allow_undefined_flag=unsupported
+	# Tell ltmain to make .lib files, not .a files.
+	libext=lib
+	# Tell ltmain to make .dll files, not .so files.
+	shrext_cmds=".dll"
+	# FIXME: Setting linknames here is a bad hack.
+	archive_cmds='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames='
+	# The linker will automatically build a .lib file if we build a DLL.
+	old_archive_from_new_cmds='true'
+	# FIXME: Should let the user specify the lib program.
+	old_archive_cmds='lib -OUT:$oldlib$oldobjs$old_deplibs'
+	enable_shared_with_static_runtimes=yes
+	;;
+      esac
+      ;;
+
+    darwin* | rhapsody*)
+
+
+  archive_cmds_need_lc=no
+  hardcode_direct=no
+  hardcode_automatic=yes
+  hardcode_shlibpath_var=unsupported
+  if test "$lt_cv_ld_force_load" = "yes"; then
+    whole_archive_flag_spec='`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`'
+
+  else
+    whole_archive_flag_spec=''
+  fi
+  link_all_deplibs=yes
+  allow_undefined_flag="$_lt_dar_allow_undefined"
+  case $cc_basename in
+     ifort*) _lt_dar_can_shared=yes ;;
+     *) _lt_dar_can_shared=$GCC ;;
+  esac
+  if test "$_lt_dar_can_shared" = "yes"; then
+    output_verbose_link_cmd=func_echo_all
+    archive_cmds="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}"
+    module_cmds="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}"
+    archive_expsym_cmds="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}"
+    module_expsym_cmds="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}"
+
+  else
+  ld_shlibs=no
+  fi
+
+      ;;
+
+    dgux*)
+      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      hardcode_libdir_flag_spec='-L$libdir'
+      hardcode_shlibpath_var=no
+      ;;
+
+    # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor
+    # support.  Future versions do this automatically, but an explicit c++rt0.o
+    # does not break anything, and helps significantly (at the cost of a little
+    # extra space).
+    freebsd2.2*)
+      archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o'
+      hardcode_libdir_flag_spec='-R$libdir'
+      hardcode_direct=yes
+      hardcode_shlibpath_var=no
+      ;;
+
+    # Unfortunately, older versions of FreeBSD 2 do not have this feature.
+    freebsd2.*)
+      archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+      hardcode_direct=yes
+      hardcode_minus_L=yes
+      hardcode_shlibpath_var=no
+      ;;
+
+    # FreeBSD 3 and greater uses gcc -shared to do shared libraries.
+    freebsd* | dragonfly*)
+      archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+      hardcode_libdir_flag_spec='-R$libdir'
+      hardcode_direct=yes
+      hardcode_shlibpath_var=no
+      ;;
+
+    hpux9*)
+      if test "$GCC" = yes; then
+	archive_cmds='$RM $output_objdir/$soname~$CC -shared $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+      else
+	archive_cmds='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+      fi
+      hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
+      hardcode_libdir_separator=:
+      hardcode_direct=yes
+
+      # hardcode_minus_L: Not really in the search PATH,
+      # but as the default location of the library.
+      hardcode_minus_L=yes
+      export_dynamic_flag_spec='${wl}-E'
+      ;;
+
+    hpux10*)
+      if test "$GCC" = yes && test "$with_gnu_ld" = no; then
+	archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'
+      fi
+      if test "$with_gnu_ld" = no; then
+	hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
+	hardcode_libdir_separator=:
+	hardcode_direct=yes
+	hardcode_direct_absolute=yes
+	export_dynamic_flag_spec='${wl}-E'
+	# hardcode_minus_L: Not really in the search PATH,
+	# but as the default location of the library.
+	hardcode_minus_L=yes
+      fi
+      ;;
+
+    hpux11*)
+      if test "$GCC" = yes && test "$with_gnu_ld" = no; then
+	case $host_cpu in
+	hppa*64*)
+	  archive_cmds='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	ia64*)
+	  archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	*)
+	  archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	esac
+      else
+	case $host_cpu in
+	hppa*64*)
+	  archive_cmds='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	ia64*)
+	  archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	*)
+
+	  # Older versions of the 11.00 compiler do not understand -b yet
+	  # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does)
+	  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC understands -b" >&5
+$as_echo_n "checking if $CC understands -b... " >&6; }
+if ${lt_cv_prog_compiler__b+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_prog_compiler__b=no
+   save_LDFLAGS="$LDFLAGS"
+   LDFLAGS="$LDFLAGS -b"
+   echo "$lt_simple_link_test_code" > conftest.$ac_ext
+   if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
+     # The linker can only warn and ignore the option if not recognized
+     # So say no if there are warnings
+     if test -s conftest.err; then
+       # Append any errors to the config.log.
+       cat conftest.err 1>&5
+       $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp
+       $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+       if diff conftest.exp conftest.er2 >/dev/null; then
+         lt_cv_prog_compiler__b=yes
+       fi
+     else
+       lt_cv_prog_compiler__b=yes
+     fi
+   fi
+   $RM -r conftest*
+   LDFLAGS="$save_LDFLAGS"
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler__b" >&5
+$as_echo "$lt_cv_prog_compiler__b" >&6; }
+
+if test x"$lt_cv_prog_compiler__b" = xyes; then
+    archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+else
+    archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'
+fi
+
+	  ;;
+	esac
+      fi
+      if test "$with_gnu_ld" = no; then
+	hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
+	hardcode_libdir_separator=:
+
+	case $host_cpu in
+	hppa*64*|ia64*)
+	  hardcode_direct=no
+	  hardcode_shlibpath_var=no
+	  ;;
+	*)
+	  hardcode_direct=yes
+	  hardcode_direct_absolute=yes
+	  export_dynamic_flag_spec='${wl}-E'
+
+	  # hardcode_minus_L: Not really in the search PATH,
+	  # but as the default location of the library.
+	  hardcode_minus_L=yes
+	  ;;
+	esac
+      fi
+      ;;
+
+    irix5* | irix6* | nonstopux*)
+      if test "$GCC" = yes; then
+	archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+	# Try to use the -exported_symbol ld option, if it does not
+	# work, assume that -exports_file does not work either and
+	# implicitly export all symbols.
+	# This should be the same for all languages, so no per-tag cache variable.
+	{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $host_os linker accepts -exported_symbol" >&5
+$as_echo_n "checking whether the $host_os linker accepts -exported_symbol... " >&6; }
+if ${lt_cv_irix_exported_symbol+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  save_LDFLAGS="$LDFLAGS"
+	   LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null"
+	   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+int foo (void) { return 0; }
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  lt_cv_irix_exported_symbol=yes
+else
+  lt_cv_irix_exported_symbol=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+           LDFLAGS="$save_LDFLAGS"
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_irix_exported_symbol" >&5
+$as_echo "$lt_cv_irix_exported_symbol" >&6; }
+	if test "$lt_cv_irix_exported_symbol" = yes; then
+          archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib'
+	fi
+      else
+	archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
+	archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib'
+      fi
+      archive_cmds_need_lc='no'
+      hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+      hardcode_libdir_separator=:
+      inherit_rpath=yes
+      link_all_deplibs=yes
+      ;;
+
+    netbsd* | netbsdelf*-gnu)
+      if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+	archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'  # a.out
+      else
+	archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags'      # ELF
+      fi
+      hardcode_libdir_flag_spec='-R$libdir'
+      hardcode_direct=yes
+      hardcode_shlibpath_var=no
+      ;;
+
+    newsos6)
+      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      hardcode_direct=yes
+      hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+      hardcode_libdir_separator=:
+      hardcode_shlibpath_var=no
+      ;;
+
+    *nto* | *qnx*)
+      ;;
+
+    openbsd*)
+      if test -f /usr/libexec/ld.so; then
+	hardcode_direct=yes
+	hardcode_shlibpath_var=no
+	hardcode_direct_absolute=yes
+	if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+	  archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+	  archive_expsym_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols'
+	  hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
+	  export_dynamic_flag_spec='${wl}-E'
+	else
+	  case $host_os in
+	   openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*)
+	     archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+	     hardcode_libdir_flag_spec='-R$libdir'
+	     ;;
+	   *)
+	     archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+	     hardcode_libdir_flag_spec='${wl}-rpath,$libdir'
+	     ;;
+	  esac
+	fi
+      else
+	ld_shlibs=no
+      fi
+      ;;
+
+    os2*)
+      hardcode_libdir_flag_spec='-L$libdir'
+      hardcode_minus_L=yes
+      allow_undefined_flag=unsupported
+      archive_cmds='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~echo DATA >> $output_objdir/$libname.def~echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def'
+      old_archive_from_new_cmds='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def'
+      ;;
+
+    osf3*)
+      if test "$GCC" = yes; then
+	allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*'
+	archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+      else
+	allow_undefined_flag=' -expect_unresolved \*'
+	archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
+      fi
+      archive_cmds_need_lc='no'
+      hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+      hardcode_libdir_separator=:
+      ;;
+
+    osf4* | osf5*)	# as osf3* with the addition of -msym flag
+      if test "$GCC" = yes; then
+	allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*'
+	archive_cmds='$CC -shared${allow_undefined_flag} $pic_flag $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+	hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'
+      else
+	allow_undefined_flag=' -expect_unresolved \*'
+	archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
+	archive_expsym_cmds='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~
+	$CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp'
+
+	# Both c and cxx compiler support -rpath directly
+	hardcode_libdir_flag_spec='-rpath $libdir'
+      fi
+      archive_cmds_need_lc='no'
+      hardcode_libdir_separator=:
+      ;;
+
+    solaris*)
+      no_undefined_flag=' -z defs'
+      if test "$GCC" = yes; then
+	wlarc='${wl}'
+	archive_cmds='$CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+	  $CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
+      else
+	case `$CC -V 2>&1` in
+	*"Compilers 5.0"*)
+	  wlarc=''
+	  archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	  archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+	  $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp'
+	  ;;
+	*)
+	  wlarc='${wl}'
+	  archive_cmds='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags'
+	  archive_expsym_cmds='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+	  $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
+	  ;;
+	esac
+      fi
+      hardcode_libdir_flag_spec='-R$libdir'
+      hardcode_shlibpath_var=no
+      case $host_os in
+      solaris2.[0-5] | solaris2.[0-5].*) ;;
+      *)
+	# The compiler driver will combine and reorder linker options,
+	# but understands `-z linker_flag'.  GCC discards it without `$wl',
+	# but is careful enough not to reorder.
+	# Supported since Solaris 2.6 (maybe 2.5.1?)
+	if test "$GCC" = yes; then
+	  whole_archive_flag_spec='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract'
+	else
+	  whole_archive_flag_spec='-z allextract$convenience -z defaultextract'
+	fi
+	;;
+      esac
+      link_all_deplibs=yes
+      ;;
+
+    sunos4*)
+      if test "x$host_vendor" = xsequent; then
+	# Use $CC to link under sequent, because it throws in some extra .o
+	# files that make .init and .fini sections work.
+	archive_cmds='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags'
+      fi
+      hardcode_libdir_flag_spec='-L$libdir'
+      hardcode_direct=yes
+      hardcode_minus_L=yes
+      hardcode_shlibpath_var=no
+      ;;
+
+    sysv4)
+      case $host_vendor in
+	sni)
+	  archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	  hardcode_direct=yes # is this really true???
+	;;
+	siemens)
+	  ## LD is ld it makes a PLAMLIB
+	  ## CC just makes a GrossModule.
+	  archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags'
+	  reload_cmds='$CC -r -o $output$reload_objs'
+	  hardcode_direct=no
+        ;;
+	motorola)
+	  archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	  hardcode_direct=no #Motorola manual says yes, but my tests say they lie
+	;;
+      esac
+      runpath_var='LD_RUN_PATH'
+      hardcode_shlibpath_var=no
+      ;;
+
+    sysv4.3*)
+      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      hardcode_shlibpath_var=no
+      export_dynamic_flag_spec='-Bexport'
+      ;;
+
+    sysv4*MP*)
+      if test -d /usr/nec; then
+	archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	hardcode_shlibpath_var=no
+	runpath_var=LD_RUN_PATH
+	hardcode_runpath_var=yes
+	ld_shlibs=yes
+      fi
+      ;;
+
+    sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*)
+      no_undefined_flag='${wl}-z,text'
+      archive_cmds_need_lc=no
+      hardcode_shlibpath_var=no
+      runpath_var='LD_RUN_PATH'
+
+      if test "$GCC" = yes; then
+	archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      fi
+      ;;
+
+    sysv5* | sco3.2v5* | sco5v6*)
+      # Note: We can NOT use -z defs as we might desire, because we do not
+      # link with -lc, and that would cause any symbols used from libc to
+      # always be unresolved, which means just about no library would
+      # ever link correctly.  If we're not using GNU ld we use -z text
+      # though, which does catch some bad symbols but isn't as heavy-handed
+      # as -z defs.
+      no_undefined_flag='${wl}-z,text'
+      allow_undefined_flag='${wl}-z,nodefs'
+      archive_cmds_need_lc=no
+      hardcode_shlibpath_var=no
+      hardcode_libdir_flag_spec='${wl}-R,$libdir'
+      hardcode_libdir_separator=':'
+      link_all_deplibs=yes
+      export_dynamic_flag_spec='${wl}-Bexport'
+      runpath_var='LD_RUN_PATH'
+
+      if test "$GCC" = yes; then
+	archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      fi
+      ;;
+
+    uts4*)
+      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      hardcode_libdir_flag_spec='-L$libdir'
+      hardcode_shlibpath_var=no
+      ;;
+
+    *)
+      ld_shlibs=no
+      ;;
+    esac
+
+    if test x$host_vendor = xsni; then
+      case $host in
+      sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)
+	export_dynamic_flag_spec='${wl}-Blargedynsym'
+	;;
+      esac
+    fi
+  fi
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs" >&5
+$as_echo "$ld_shlibs" >&6; }
+test "$ld_shlibs" = no && can_build_shared=no
+
+with_gnu_ld=$with_gnu_ld
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#
+# Do we need to explicitly link libc?
+#
+case "x$archive_cmds_need_lc" in
+x|xyes)
+  # Assume -lc should be added
+  archive_cmds_need_lc=yes
+
+  if test "$enable_shared" = yes && test "$GCC" = yes; then
+    case $archive_cmds in
+    *'~'*)
+      # FIXME: we may have to deal with multi-command sequences.
+      ;;
+    '$CC '*)
+      # Test whether the compiler implicitly links with -lc since on some
+      # systems, -lgcc has to come before -lc. If gcc already passes -lc
+      # to ld, don't add -lc before -lgcc.
+      { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5
+$as_echo_n "checking whether -lc should be explicitly linked in... " >&6; }
+if ${lt_cv_archive_cmds_need_lc+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  $RM conftest*
+	echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+	if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } 2>conftest.err; then
+	  soname=conftest
+	  lib=conftest
+	  libobjs=conftest.$ac_objext
+	  deplibs=
+	  wl=$lt_prog_compiler_wl
+	  pic_flag=$lt_prog_compiler_pic
+	  compiler_flags=-v
+	  linker_flags=-v
+	  verstring=
+	  output_objdir=.
+	  libname=conftest
+	  lt_save_allow_undefined_flag=$allow_undefined_flag
+	  allow_undefined_flag=
+	  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5
+  (eval $archive_cmds 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }
+	  then
+	    lt_cv_archive_cmds_need_lc=no
+	  else
+	    lt_cv_archive_cmds_need_lc=yes
+	  fi
+	  allow_undefined_flag=$lt_save_allow_undefined_flag
+	else
+	  cat conftest.err 1>&5
+	fi
+	$RM conftest*
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc" >&5
+$as_echo "$lt_cv_archive_cmds_need_lc" >&6; }
+      archive_cmds_need_lc=$lt_cv_archive_cmds_need_lc
+      ;;
+    esac
+  fi
+  ;;
+esac
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5
+$as_echo_n "checking dynamic linker characteristics... " >&6; }
+
+if test "$GCC" = yes; then
+  case $host_os in
+    darwin*) lt_awk_arg="/^libraries:/,/LR/" ;;
+    *) lt_awk_arg="/^libraries:/" ;;
+  esac
+  case $host_os in
+    mingw* | cegcc*) lt_sed_strip_eq="s,=\([A-Za-z]:\),\1,g" ;;
+    *) lt_sed_strip_eq="s,=/,/,g" ;;
+  esac
+  lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq`
+  case $lt_search_path_spec in
+  *\;*)
+    # if the path contains ";" then we assume it to be the separator
+    # otherwise default to the standard path separator (i.e. ":") - it is
+    # assumed that no part of a normal pathname contains ";" but that should
+    # okay in the real world where ";" in dirpaths is itself problematic.
+    lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'`
+    ;;
+  *)
+    lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"`
+    ;;
+  esac
+  # Ok, now we have the path, separated by spaces, we can step through it
+  # and add multilib dir if necessary.
+  lt_tmp_lt_search_path_spec=
+  lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null`
+  for lt_sys_path in $lt_search_path_spec; do
+    if test -d "$lt_sys_path/$lt_multi_os_dir"; then
+      lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir"
+    else
+      test -d "$lt_sys_path" && \
+	lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path"
+    fi
+  done
+  lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk '
+BEGIN {RS=" "; FS="/|\n";} {
+  lt_foo="";
+  lt_count=0;
+  for (lt_i = NF; lt_i > 0; lt_i--) {
+    if ($lt_i != "" && $lt_i != ".") {
+      if ($lt_i == "..") {
+        lt_count++;
+      } else {
+        if (lt_count == 0) {
+          lt_foo="/" $lt_i lt_foo;
+        } else {
+          lt_count--;
+        }
+      }
+    }
+  }
+  if (lt_foo != "") { lt_freq[lt_foo]++; }
+  if (lt_freq[lt_foo] == 1) { print lt_foo; }
+}'`
+  # AWK program above erroneously prepends '/' to C:/dos/paths
+  # for these hosts.
+  case $host_os in
+    mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\
+      $SED 's,/\([A-Za-z]:\),\1,g'` ;;
+  esac
+  sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP`
+else
+  sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
+fi
+library_names_spec=
+libname_spec='lib$name'
+soname_spec=
+shrext_cmds=".so"
+postinstall_cmds=
+postuninstall_cmds=
+finish_cmds=
+finish_eval=
+shlibpath_var=
+shlibpath_overrides_runpath=unknown
+version_type=none
+dynamic_linker="$host_os ld.so"
+sys_lib_dlsearch_path_spec="/lib /usr/lib"
+need_lib_prefix=unknown
+hardcode_into_libs=no
+
+# when you set need_version to no, make sure it does not cause -set_version
+# flags to be left without arguments
+need_version=unknown
+
+case $host_os in
+aix3*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a'
+  shlibpath_var=LIBPATH
+
+  # AIX 3 has no versioning support, so we append a major version to the name.
+  soname_spec='${libname}${release}${shared_ext}$major'
+  ;;
+
+aix[4-9]*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  hardcode_into_libs=yes
+  if test "$host_cpu" = ia64; then
+    # AIX 5 supports IA64
+    library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}'
+    shlibpath_var=LD_LIBRARY_PATH
+  else
+    # With GCC up to 2.95.x, collect2 would create an import file
+    # for dependence libraries.  The import file would start with
+    # the line `#! .'.  This would cause the generated library to
+    # depend on `.', always an invalid library.  This was fixed in
+    # development snapshots of GCC prior to 3.0.
+    case $host_os in
+      aix4 | aix4.[01] | aix4.[01].*)
+      if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'
+	   echo ' yes '
+	   echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then
+	:
+      else
+	can_build_shared=no
+      fi
+      ;;
+    esac
+    # AIX (on Power*) has no versioning support, so currently we can not hardcode correct
+    # soname into executable. Probably we can add versioning support to
+    # collect2, so additional links can be useful in future.
+    if test "$aix_use_runtimelinking" = yes; then
+      # If using run time linking (on AIX 4.2 or later) use lib<name>.so
+      # instead of lib<name>.a to let people know that these are not
+      # typical AIX shared libraries.
+      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    else
+      # We preserve .a as extension for shared libraries through AIX4.2
+      # and later when we are not doing run time linking.
+      library_names_spec='${libname}${release}.a $libname.a'
+      soname_spec='${libname}${release}${shared_ext}$major'
+    fi
+    shlibpath_var=LIBPATH
+  fi
+  ;;
+
+amigaos*)
+  case $host_cpu in
+  powerpc)
+    # Since July 2007 AmigaOS4 officially supports .so libraries.
+    # When compiling the executable, add -use-dynld -Lsobjs: to the compileline.
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    ;;
+  m68k)
+    library_names_spec='$libname.ixlibrary $libname.a'
+    # Create ${libname}_ixlibrary.a entries in /sys/libs.
+    finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
+    ;;
+  esac
+  ;;
+
+beos*)
+  library_names_spec='${libname}${shared_ext}'
+  dynamic_linker="$host_os ld.so"
+  shlibpath_var=LIBRARY_PATH
+  ;;
+
+bsdi[45]*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib"
+  sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib"
+  # the default ld.so.conf also contains /usr/contrib/lib and
+  # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow
+  # libtool to hard-code these into programs
+  ;;
+
+cygwin* | mingw* | pw32* | cegcc*)
+  version_type=windows
+  shrext_cmds=".dll"
+  need_version=no
+  need_lib_prefix=no
+
+  case $GCC,$cc_basename in
+  yes,*)
+    # gcc
+    library_names_spec='$libname.dll.a'
+    # DLL is installed to $(libdir)/../bin by postinstall_cmds
+    postinstall_cmds='base_file=`basename \${file}`~
+      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~
+      dldir=$destdir/`dirname \$dlpath`~
+      test -d \$dldir || mkdir -p \$dldir~
+      $install_prog $dir/$dlname \$dldir/$dlname~
+      chmod a+x \$dldir/$dlname~
+      if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then
+        eval '\''$striplib \$dldir/$dlname'\'' || exit \$?;
+      fi'
+    postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
+      dlpath=$dir/\$dldll~
+       $RM \$dlpath'
+    shlibpath_overrides_runpath=yes
+
+    case $host_os in
+    cygwin*)
+      # Cygwin DLLs use 'cyg' prefix rather than 'lib'
+      soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+
+      sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api"
+      ;;
+    mingw* | cegcc*)
+      # MinGW DLLs use traditional 'lib' prefix
+      soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+      ;;
+    pw32*)
+      # pw32 DLLs use 'pw' prefix rather than 'lib'
+      library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+      ;;
+    esac
+    dynamic_linker='Win32 ld.exe'
+    ;;
+
+  *,cl*)
+    # Native MSVC
+    libname_spec='$name'
+    soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+    library_names_spec='${libname}.dll.lib'
+
+    case $build_os in
+    mingw*)
+      sys_lib_search_path_spec=
+      lt_save_ifs=$IFS
+      IFS=';'
+      for lt_path in $LIB
+      do
+        IFS=$lt_save_ifs
+        # Let DOS variable expansion print the short 8.3 style file name.
+        lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"`
+        sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path"
+      done
+      IFS=$lt_save_ifs
+      # Convert to MSYS style.
+      sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'`
+      ;;
+    cygwin*)
+      # Convert to unix form, then to dos form, then back to unix form
+      # but this time dos style (no spaces!) so that the unix form looks
+      # like /cygdrive/c/PROGRA~1:/cygdr...
+      sys_lib_search_path_spec=`cygpath --path --unix "$LIB"`
+      sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null`
+      sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
+      ;;
+    *)
+      sys_lib_search_path_spec="$LIB"
+      if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then
+        # It is most probably a Windows format PATH.
+        sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
+      else
+        sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
+      fi
+      # FIXME: find the short name or the path components, as spaces are
+      # common. (e.g. "Program Files" -> "PROGRA~1")
+      ;;
+    esac
+
+    # DLL is installed to $(libdir)/../bin by postinstall_cmds
+    postinstall_cmds='base_file=`basename \${file}`~
+      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~
+      dldir=$destdir/`dirname \$dlpath`~
+      test -d \$dldir || mkdir -p \$dldir~
+      $install_prog $dir/$dlname \$dldir/$dlname'
+    postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
+      dlpath=$dir/\$dldll~
+       $RM \$dlpath'
+    shlibpath_overrides_runpath=yes
+    dynamic_linker='Win32 link.exe'
+    ;;
+
+  *)
+    # Assume MSVC wrapper
+    library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib'
+    dynamic_linker='Win32 ld.exe'
+    ;;
+  esac
+  # FIXME: first we should search . and the directory the executable is in
+  shlibpath_var=PATH
+  ;;
+
+darwin* | rhapsody*)
+  dynamic_linker="$host_os dyld"
+  version_type=darwin
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext'
+  soname_spec='${libname}${release}${major}$shared_ext'
+  shlibpath_overrides_runpath=yes
+  shlibpath_var=DYLD_LIBRARY_PATH
+  shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`'
+
+  sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib"
+  sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib'
+  ;;
+
+dgux*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  ;;
+
+freebsd* | dragonfly*)
+  # DragonFly does not have aout.  When/if they implement a new
+  # versioning mechanism, adjust this.
+  if test -x /usr/bin/objformat; then
+    objformat=`/usr/bin/objformat`
+  else
+    case $host_os in
+    freebsd[23].*) objformat=aout ;;
+    *) objformat=elf ;;
+    esac
+  fi
+  version_type=freebsd-$objformat
+  case $version_type in
+    freebsd-elf*)
+      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
+      need_version=no
+      need_lib_prefix=no
+      ;;
+    freebsd-*)
+      library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix'
+      need_version=yes
+      ;;
+  esac
+  shlibpath_var=LD_LIBRARY_PATH
+  case $host_os in
+  freebsd2.*)
+    shlibpath_overrides_runpath=yes
+    ;;
+  freebsd3.[01]* | freebsdelf3.[01]*)
+    shlibpath_overrides_runpath=yes
+    hardcode_into_libs=yes
+    ;;
+  freebsd3.[2-9]* | freebsdelf3.[2-9]* | \
+  freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1)
+    shlibpath_overrides_runpath=no
+    hardcode_into_libs=yes
+    ;;
+  *) # from 4.6 on, and DragonFly
+    shlibpath_overrides_runpath=yes
+    hardcode_into_libs=yes
+    ;;
+  esac
+  ;;
+
+gnu*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  ;;
+
+haiku*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  dynamic_linker="$host_os runtime_loader"
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib'
+  hardcode_into_libs=yes
+  ;;
+
+hpux9* | hpux10* | hpux11*)
+  # Give a soname corresponding to the major version so that dld.sl refuses to
+  # link against other versions.
+  version_type=sunos
+  need_lib_prefix=no
+  need_version=no
+  case $host_cpu in
+  ia64*)
+    shrext_cmds='.so'
+    hardcode_into_libs=yes
+    dynamic_linker="$host_os dld.so"
+    shlibpath_var=LD_LIBRARY_PATH
+    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    if test "X$HPUX_IA64_MODE" = X32; then
+      sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib"
+    else
+      sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64"
+    fi
+    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+    ;;
+  hppa*64*)
+    shrext_cmds='.sl'
+    hardcode_into_libs=yes
+    dynamic_linker="$host_os dld.sl"
+    shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH
+    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64"
+    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+    ;;
+  *)
+    shrext_cmds='.sl'
+    dynamic_linker="$host_os dld.sl"
+    shlibpath_var=SHLIB_PATH
+    shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    ;;
+  esac
+  # HP-UX runs *really* slowly unless shared libraries are mode 555, ...
+  postinstall_cmds='chmod 555 $lib'
+  # or fails outright, so override atomically:
+  install_override_mode=555
+  ;;
+
+interix[3-9]*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  ;;
+
+irix5* | irix6* | nonstopux*)
+  case $host_os in
+    nonstopux*) version_type=nonstopux ;;
+    *)
+	if test "$lt_cv_prog_gnu_ld" = yes; then
+		version_type=linux # correct to gnu/linux during the next big refactor
+	else
+		version_type=irix
+	fi ;;
+  esac
+  need_lib_prefix=no
+  need_version=no
+  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}'
+  case $host_os in
+  irix5* | nonstopux*)
+    libsuff= shlibsuff=
+    ;;
+  *)
+    case $LD in # libtool.m4 will add one of these switches to LD
+    *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ")
+      libsuff= shlibsuff= libmagic=32-bit;;
+    *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ")
+      libsuff=32 shlibsuff=N32 libmagic=N32;;
+    *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ")
+      libsuff=64 shlibsuff=64 libmagic=64-bit;;
+    *) libsuff= shlibsuff= libmagic=never-match;;
+    esac
+    ;;
+  esac
+  shlibpath_var=LD_LIBRARY${shlibsuff}_PATH
+  shlibpath_overrides_runpath=no
+  sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}"
+  sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}"
+  hardcode_into_libs=yes
+  ;;
+
+# No shared lib support for Linux oldld, aout, or coff.
+linux*oldld* | linux*aout* | linux*coff*)
+  dynamic_linker=no
+  ;;
+
+# This must be glibc/ELF.
+linux* | k*bsd*-gnu | kopensolaris*-gnu)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+
+  # Some binutils ld are patched to set DT_RUNPATH
+  if ${lt_cv_shlibpath_overrides_runpath+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_shlibpath_overrides_runpath=no
+    save_LDFLAGS=$LDFLAGS
+    save_libdir=$libdir
+    eval "libdir=/foo; wl=\"$lt_prog_compiler_wl\"; \
+	 LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec\""
+    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  if  ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then :
+  lt_cv_shlibpath_overrides_runpath=yes
+fi
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+    LDFLAGS=$save_LDFLAGS
+    libdir=$save_libdir
+
+fi
+
+  shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath
+
+  # This implies no fast_install, which is unacceptable.
+  # Some rework will be needed to allow for fast_install
+  # before this can be enabled.
+  hardcode_into_libs=yes
+
+  # Append ld.so.conf contents to the search path
+  if test -f /etc/ld.so.conf; then
+    lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[	 ]*hwcap[	 ]/d;s/[:,	]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '`
+    sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra"
+  fi
+
+  # We used to test for /lib/ld.so.1 and disable shared libraries on
+  # powerpc, because MkLinux only supported shared libraries with the
+  # GNU dynamic linker.  Since this was broken with cross compilers,
+  # most powerpc-linux boxes support dynamic linking these days and
+  # people can always --disable-shared, the test was removed, and we
+  # assume the GNU/Linux dynamic linker is in use.
+  dynamic_linker='GNU/Linux ld.so'
+  ;;
+
+netbsdelf*-gnu)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  dynamic_linker='NetBSD ld.elf_so'
+  ;;
+
+netbsd*)
+  version_type=sunos
+  need_lib_prefix=no
+  need_version=no
+  if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+    finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+    dynamic_linker='NetBSD (a.out) ld.so'
+  else
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    dynamic_linker='NetBSD ld.elf_so'
+  fi
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  ;;
+
+newsos6)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  ;;
+
+*nto* | *qnx*)
+  version_type=qnx
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  dynamic_linker='ldqnx.so'
+  ;;
+
+openbsd*)
+  version_type=sunos
+  sys_lib_dlsearch_path_spec="/usr/lib"
+  need_lib_prefix=no
+  # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs.
+  case $host_os in
+    openbsd3.3 | openbsd3.3.*)	need_version=yes ;;
+    *)				need_version=no  ;;
+  esac
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+    case $host_os in
+      openbsd2.[89] | openbsd2.[89].*)
+	shlibpath_overrides_runpath=no
+	;;
+      *)
+	shlibpath_overrides_runpath=yes
+	;;
+      esac
+  else
+    shlibpath_overrides_runpath=yes
+  fi
+  ;;
+
+os2*)
+  libname_spec='$name'
+  shrext_cmds=".dll"
+  need_lib_prefix=no
+  library_names_spec='$libname${shared_ext} $libname.a'
+  dynamic_linker='OS/2 ld.exe'
+  shlibpath_var=LIBPATH
+  ;;
+
+osf3* | osf4* | osf5*)
+  version_type=osf
+  need_lib_prefix=no
+  need_version=no
+  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  shlibpath_var=LD_LIBRARY_PATH
+  sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib"
+  sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec"
+  ;;
+
+rdos*)
+  dynamic_linker=no
+  ;;
+
+solaris*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  # ldd complains unless libraries are executable
+  postinstall_cmds='chmod +x $lib'
+  ;;
+
+sunos4*)
+  version_type=sunos
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+  finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  if test "$with_gnu_ld" = yes; then
+    need_lib_prefix=no
+  fi
+  need_version=yes
+  ;;
+
+sysv4 | sysv4.3*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  case $host_vendor in
+    sni)
+      shlibpath_overrides_runpath=no
+      need_lib_prefix=no
+      runpath_var=LD_RUN_PATH
+      ;;
+    siemens)
+      need_lib_prefix=no
+      ;;
+    motorola)
+      need_lib_prefix=no
+      need_version=no
+      shlibpath_overrides_runpath=no
+      sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib'
+      ;;
+  esac
+  ;;
+
+sysv4*MP*)
+  if test -d /usr/nec ;then
+    version_type=linux # correct to gnu/linux during the next big refactor
+    library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}'
+    soname_spec='$libname${shared_ext}.$major'
+    shlibpath_var=LD_LIBRARY_PATH
+  fi
+  ;;
+
+sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
+  version_type=freebsd-elf
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  if test "$with_gnu_ld" = yes; then
+    sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib'
+  else
+    sys_lib_search_path_spec='/usr/ccs/lib /usr/lib'
+    case $host_os in
+      sco3.2v5*)
+        sys_lib_search_path_spec="$sys_lib_search_path_spec /lib"
+	;;
+    esac
+  fi
+  sys_lib_dlsearch_path_spec='/usr/lib'
+  ;;
+
+tpf*)
+  # TPF is a cross-target only.  Preferred cross-host = GNU/Linux.
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  ;;
+
+uts4*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  ;;
+
+*)
+  dynamic_linker=no
+  ;;
+esac
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5
+$as_echo "$dynamic_linker" >&6; }
+test "$dynamic_linker" = no && can_build_shared=no
+
+variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
+if test "$GCC" = yes; then
+  variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"
+fi
+
+if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then
+  sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec"
+fi
+if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then
+  sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec"
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5
+$as_echo_n "checking how to hardcode library paths into programs... " >&6; }
+hardcode_action=
+if test -n "$hardcode_libdir_flag_spec" ||
+   test -n "$runpath_var" ||
+   test "X$hardcode_automatic" = "Xyes" ; then
+
+  # We can hardcode non-existent directories.
+  if test "$hardcode_direct" != no &&
+     # If the only mechanism to avoid hardcoding is shlibpath_var, we
+     # have to relink, otherwise we might link with an installed library
+     # when we should be linking with a yet-to-be-installed one
+     ## test "$_LT_TAGVAR(hardcode_shlibpath_var, )" != no &&
+     test "$hardcode_minus_L" != no; then
+    # Linking always hardcodes the temporary library directory.
+    hardcode_action=relink
+  else
+    # We can link without hardcoding, and we can hardcode nonexisting dirs.
+    hardcode_action=immediate
+  fi
+else
+  # We cannot hardcode anything, or else we can only hardcode existing
+  # directories.
+  hardcode_action=unsupported
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action" >&5
+$as_echo "$hardcode_action" >&6; }
+
+if test "$hardcode_action" = relink ||
+   test "$inherit_rpath" = yes; then
+  # Fast installation is not supported
+  enable_fast_install=no
+elif test "$shlibpath_overrides_runpath" = yes ||
+     test "$enable_shared" = no; then
+  # Fast installation is not necessary
+  enable_fast_install=needless
+fi
+
+
+
+
+
+
+  if test "x$enable_dlopen" != xyes; then
+  enable_dlopen=unknown
+  enable_dlopen_self=unknown
+  enable_dlopen_self_static=unknown
+else
+  lt_cv_dlopen=no
+  lt_cv_dlopen_libs=
+
+  case $host_os in
+  beos*)
+    lt_cv_dlopen="load_add_on"
+    lt_cv_dlopen_libs=
+    lt_cv_dlopen_self=yes
+    ;;
+
+  mingw* | pw32* | cegcc*)
+    lt_cv_dlopen="LoadLibrary"
+    lt_cv_dlopen_libs=
+    ;;
+
+  cygwin*)
+    lt_cv_dlopen="dlopen"
+    lt_cv_dlopen_libs=
+    ;;
+
+  darwin*)
+  # if libdl is installed we need to link against it
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5
+$as_echo_n "checking for dlopen in -ldl... " >&6; }
+if ${ac_cv_lib_dl_dlopen+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldl  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* 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 dlopen ();
+int
+main ()
+{
+return dlopen ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_lib_dl_dlopen=yes
+else
+  ac_cv_lib_dl_dlopen=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5
+$as_echo "$ac_cv_lib_dl_dlopen" >&6; }
+if test "x$ac_cv_lib_dl_dlopen" = xyes; then :
+  lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"
+else
+
+    lt_cv_dlopen="dyld"
+    lt_cv_dlopen_libs=
+    lt_cv_dlopen_self=yes
+
+fi
+
+    ;;
+
+  *)
+    ac_fn_c_check_func "$LINENO" "shl_load" "ac_cv_func_shl_load"
+if test "x$ac_cv_func_shl_load" = xyes; then :
+  lt_cv_dlopen="shl_load"
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld" >&5
+$as_echo_n "checking for shl_load in -ldld... " >&6; }
+if ${ac_cv_lib_dld_shl_load+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldld  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* 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 shl_load ();
+int
+main ()
+{
+return shl_load ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_lib_dld_shl_load=yes
+else
+  ac_cv_lib_dld_shl_load=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load" >&5
+$as_echo "$ac_cv_lib_dld_shl_load" >&6; }
+if test "x$ac_cv_lib_dld_shl_load" = xyes; then :
+  lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld"
+else
+  ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen"
+if test "x$ac_cv_func_dlopen" = xyes; then :
+  lt_cv_dlopen="dlopen"
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl" >&5
+$as_echo_n "checking for dlopen in -ldl... " >&6; }
+if ${ac_cv_lib_dl_dlopen+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldl  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* 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 dlopen ();
+int
+main ()
+{
+return dlopen ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_lib_dl_dlopen=yes
+else
+  ac_cv_lib_dl_dlopen=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen" >&5
+$as_echo "$ac_cv_lib_dl_dlopen" >&6; }
+if test "x$ac_cv_lib_dl_dlopen" = xyes; then :
+  lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld" >&5
+$as_echo_n "checking for dlopen in -lsvld... " >&6; }
+if ${ac_cv_lib_svld_dlopen+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lsvld  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* 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 dlopen ();
+int
+main ()
+{
+return dlopen ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_lib_svld_dlopen=yes
+else
+  ac_cv_lib_svld_dlopen=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_svld_dlopen" >&5
+$as_echo "$ac_cv_lib_svld_dlopen" >&6; }
+if test "x$ac_cv_lib_svld_dlopen" = xyes; then :
+  lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld" >&5
+$as_echo_n "checking for dld_link in -ldld... " >&6; }
+if ${ac_cv_lib_dld_dld_link+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-ldld  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* 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 dld_link ();
+int
+main ()
+{
+return dld_link ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_lib_dld_dld_link=yes
+else
+  ac_cv_lib_dld_dld_link=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_dld_link" >&5
+$as_echo "$ac_cv_lib_dld_dld_link" >&6; }
+if test "x$ac_cv_lib_dld_dld_link" = xyes; then :
+  lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld"
+fi
+
+
+fi
+
+
+fi
+
+
+fi
+
+
+fi
+
+
+fi
+
+    ;;
+  esac
+
+  if test "x$lt_cv_dlopen" != xno; then
+    enable_dlopen=yes
+  else
+    enable_dlopen=no
+  fi
+
+  case $lt_cv_dlopen in
+  dlopen)
+    save_CPPFLAGS="$CPPFLAGS"
+    test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H"
+
+    save_LDFLAGS="$LDFLAGS"
+    wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\"
+
+    save_LIBS="$LIBS"
+    LIBS="$lt_cv_dlopen_libs $LIBS"
+
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a program can dlopen itself" >&5
+$as_echo_n "checking whether a program can dlopen itself... " >&6; }
+if ${lt_cv_dlopen_self+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  	  if test "$cross_compiling" = yes; then :
+  lt_cv_dlopen_self=cross
+else
+  lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
+  lt_status=$lt_dlunknown
+  cat > conftest.$ac_ext <<_LT_EOF
+#line $LINENO "configure"
+#include "confdefs.h"
+
+#if HAVE_DLFCN_H
+#include <dlfcn.h>
+#endif
+
+#include <stdio.h>
+
+#ifdef RTLD_GLOBAL
+#  define LT_DLGLOBAL		RTLD_GLOBAL
+#else
+#  ifdef DL_GLOBAL
+#    define LT_DLGLOBAL		DL_GLOBAL
+#  else
+#    define LT_DLGLOBAL		0
+#  endif
+#endif
+
+/* We may have to define LT_DLLAZY_OR_NOW in the command line if we
+   find out it does not work in some platform. */
+#ifndef LT_DLLAZY_OR_NOW
+#  ifdef RTLD_LAZY
+#    define LT_DLLAZY_OR_NOW		RTLD_LAZY
+#  else
+#    ifdef DL_LAZY
+#      define LT_DLLAZY_OR_NOW		DL_LAZY
+#    else
+#      ifdef RTLD_NOW
+#        define LT_DLLAZY_OR_NOW	RTLD_NOW
+#      else
+#        ifdef DL_NOW
+#          define LT_DLLAZY_OR_NOW	DL_NOW
+#        else
+#          define LT_DLLAZY_OR_NOW	0
+#        endif
+#      endif
+#    endif
+#  endif
+#endif
+
+/* When -fvisbility=hidden is used, assume the code has been annotated
+   correspondingly for the symbols needed.  */
+#if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3))
+int fnord () __attribute__((visibility("default")));
+#endif
+
+int fnord () { return 42; }
+int main ()
+{
+  void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);
+  int status = $lt_dlunknown;
+
+  if (self)
+    {
+      if (dlsym (self,"fnord"))       status = $lt_dlno_uscore;
+      else
+        {
+	  if (dlsym( self,"_fnord"))  status = $lt_dlneed_uscore;
+          else puts (dlerror ());
+	}
+      /* dlclose (self); */
+    }
+  else
+    puts (dlerror ());
+
+  return status;
+}
+_LT_EOF
+  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then
+    (./conftest; exit; ) >&5 2>/dev/null
+    lt_status=$?
+    case x$lt_status in
+      x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;;
+      x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;;
+      x$lt_dlunknown|x*) lt_cv_dlopen_self=no ;;
+    esac
+  else :
+    # compilation failed
+    lt_cv_dlopen_self=no
+  fi
+fi
+rm -fr conftest*
+
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self" >&5
+$as_echo "$lt_cv_dlopen_self" >&6; }
+
+    if test "x$lt_cv_dlopen_self" = xyes; then
+      wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\"
+      { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether a statically linked program can dlopen itself" >&5
+$as_echo_n "checking whether a statically linked program can dlopen itself... " >&6; }
+if ${lt_cv_dlopen_self_static+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  	  if test "$cross_compiling" = yes; then :
+  lt_cv_dlopen_self_static=cross
+else
+  lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
+  lt_status=$lt_dlunknown
+  cat > conftest.$ac_ext <<_LT_EOF
+#line $LINENO "configure"
+#include "confdefs.h"
+
+#if HAVE_DLFCN_H
+#include <dlfcn.h>
+#endif
+
+#include <stdio.h>
+
+#ifdef RTLD_GLOBAL
+#  define LT_DLGLOBAL		RTLD_GLOBAL
+#else
+#  ifdef DL_GLOBAL
+#    define LT_DLGLOBAL		DL_GLOBAL
+#  else
+#    define LT_DLGLOBAL		0
+#  endif
+#endif
+
+/* We may have to define LT_DLLAZY_OR_NOW in the command line if we
+   find out it does not work in some platform. */
+#ifndef LT_DLLAZY_OR_NOW
+#  ifdef RTLD_LAZY
+#    define LT_DLLAZY_OR_NOW		RTLD_LAZY
+#  else
+#    ifdef DL_LAZY
+#      define LT_DLLAZY_OR_NOW		DL_LAZY
+#    else
+#      ifdef RTLD_NOW
+#        define LT_DLLAZY_OR_NOW	RTLD_NOW
+#      else
+#        ifdef DL_NOW
+#          define LT_DLLAZY_OR_NOW	DL_NOW
+#        else
+#          define LT_DLLAZY_OR_NOW	0
+#        endif
+#      endif
+#    endif
+#  endif
+#endif
+
+/* When -fvisbility=hidden is used, assume the code has been annotated
+   correspondingly for the symbols needed.  */
+#if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3))
+int fnord () __attribute__((visibility("default")));
+#endif
+
+int fnord () { return 42; }
+int main ()
+{
+  void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);
+  int status = $lt_dlunknown;
+
+  if (self)
+    {
+      if (dlsym (self,"fnord"))       status = $lt_dlno_uscore;
+      else
+        {
+	  if (dlsym( self,"_fnord"))  status = $lt_dlneed_uscore;
+          else puts (dlerror ());
+	}
+      /* dlclose (self); */
+    }
+  else
+    puts (dlerror ());
+
+  return status;
+}
+_LT_EOF
+  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_link\""; } >&5
+  (eval $ac_link) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then
+    (./conftest; exit; ) >&5 2>/dev/null
+    lt_status=$?
+    case x$lt_status in
+      x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;;
+      x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;;
+      x$lt_dlunknown|x*) lt_cv_dlopen_self_static=no ;;
+    esac
+  else :
+    # compilation failed
+    lt_cv_dlopen_self_static=no
+  fi
+fi
+rm -fr conftest*
+
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self_static" >&5
+$as_echo "$lt_cv_dlopen_self_static" >&6; }
+    fi
+
+    CPPFLAGS="$save_CPPFLAGS"
+    LDFLAGS="$save_LDFLAGS"
+    LIBS="$save_LIBS"
+    ;;
+  esac
+
+  case $lt_cv_dlopen_self in
+  yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;;
+  *) enable_dlopen_self=unknown ;;
+  esac
+
+  case $lt_cv_dlopen_self_static in
+  yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;;
+  *) enable_dlopen_self_static=unknown ;;
+  esac
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+striplib=
+old_striplib=
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether stripping libraries is possible" >&5
+$as_echo_n "checking whether stripping libraries is possible... " >&6; }
+if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then
+  test -z "$old_striplib" && old_striplib="$STRIP --strip-debug"
+  test -z "$striplib" && striplib="$STRIP --strip-unneeded"
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+else
+# FIXME - insert some real tests, host_os isn't really good enough
+  case $host_os in
+  darwin*)
+    if test -n "$STRIP" ; then
+      striplib="$STRIP -x"
+      old_striplib="$STRIP -S"
+      { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+    else
+      { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+    fi
+    ;;
+  *)
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+    ;;
+  esac
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+  # Report which library types will actually be built
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries" >&5
+$as_echo_n "checking if libtool supports shared libraries... " >&6; }
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $can_build_shared" >&5
+$as_echo "$can_build_shared" >&6; }
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries" >&5
+$as_echo_n "checking whether to build shared libraries... " >&6; }
+  test "$can_build_shared" = "no" && enable_shared=no
+
+  # On AIX, shared libraries and static libraries use the same namespace, and
+  # are all built from PIC.
+  case $host_os in
+  aix3*)
+    test "$enable_shared" = yes && enable_static=no
+    if test -n "$RANLIB"; then
+      archive_cmds="$archive_cmds~\$RANLIB \$lib"
+      postinstall_cmds='$RANLIB $lib'
+    fi
+    ;;
+
+  aix[4-9]*)
+    if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then
+      test "$enable_shared" = yes && enable_static=no
+    fi
+    ;;
+  esac
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_shared" >&5
+$as_echo "$enable_shared" >&6; }
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build static libraries" >&5
+$as_echo_n "checking whether to build static libraries... " >&6; }
+  # Make sure either enable_shared or enable_static is yes.
+  test "$enable_shared" = yes || enable_static=yes
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $enable_static" >&5
+$as_echo "$enable_static" >&6; }
+
+
+
+
+fi
+ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+CC="$lt_save_CC"
+
+      if test -n "$CXX" && ( test "X$CXX" != "Xno" &&
+    ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) ||
+    (test "X$CXX" != "Xg++"))) ; then
+  ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C++ preprocessor" >&5
+$as_echo_n "checking how to run the C++ preprocessor... " >&6; }
+if test -z "$CXXCPP"; then
+  if ${ac_cv_prog_CXXCPP+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+      # Double quotes because CXXCPP needs to be expanded
+    for CXXCPP in "$CXX -E" "/lib/cpp"
+    do
+      ac_preproc_ok=false
+for ac_cxx_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 confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+		     Syntax error
+_ACEOF
+if ac_fn_cxx_try_cpp "$LINENO"; then :
+
+else
+  # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+  # OK, works on sane cases.  Now check whether nonexistent headers
+  # can be detected and how.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <ac_nonexistent.h>
+_ACEOF
+if ac_fn_cxx_try_cpp "$LINENO"; then :
+  # Broken: success on invalid input.
+continue
+else
+  # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.i conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then :
+  break
+fi
+
+    done
+    ac_cv_prog_CXXCPP=$CXXCPP
+
+fi
+  CXXCPP=$ac_cv_prog_CXXCPP
+else
+  ac_cv_prog_CXXCPP=$CXXCPP
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXXCPP" >&5
+$as_echo "$CXXCPP" >&6; }
+ac_preproc_ok=false
+for ac_cxx_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 confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#ifdef __STDC__
+# include <limits.h>
+#else
+# include <assert.h>
+#endif
+		     Syntax error
+_ACEOF
+if ac_fn_cxx_try_cpp "$LINENO"; then :
+
+else
+  # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+  # OK, works on sane cases.  Now check whether nonexistent headers
+  # can be detected and how.
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <ac_nonexistent.h>
+_ACEOF
+if ac_fn_cxx_try_cpp "$LINENO"; then :
+  # Broken: success on invalid input.
+continue
+else
+  # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.i conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then :
+
+else
+  { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "C++ preprocessor \"$CXXCPP\" fails sanity check
+See \`config.log' for more details" "$LINENO" 5; }
+fi
+
+ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+else
+  _lt_caught_CXX_error=yes
+fi
+
+ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+archive_cmds_need_lc_CXX=no
+allow_undefined_flag_CXX=
+always_export_symbols_CXX=no
+archive_expsym_cmds_CXX=
+compiler_needs_object_CXX=no
+export_dynamic_flag_spec_CXX=
+hardcode_direct_CXX=no
+hardcode_direct_absolute_CXX=no
+hardcode_libdir_flag_spec_CXX=
+hardcode_libdir_separator_CXX=
+hardcode_minus_L_CXX=no
+hardcode_shlibpath_var_CXX=unsupported
+hardcode_automatic_CXX=no
+inherit_rpath_CXX=no
+module_cmds_CXX=
+module_expsym_cmds_CXX=
+link_all_deplibs_CXX=unknown
+old_archive_cmds_CXX=$old_archive_cmds
+reload_flag_CXX=$reload_flag
+reload_cmds_CXX=$reload_cmds
+no_undefined_flag_CXX=
+whole_archive_flag_spec_CXX=
+enable_shared_with_static_runtimes_CXX=no
+
+# Source file extension for C++ test sources.
+ac_ext=cpp
+
+# Object file extension for compiled C++ test sources.
+objext=o
+objext_CXX=$objext
+
+# No sense in running all these tests if we already determined that
+# the CXX compiler isn't working.  Some variables (like enable_shared)
+# are currently assumed to apply to all compilers on this platform,
+# and will be corrupted by setting them based on a non-working compiler.
+if test "$_lt_caught_CXX_error" != yes; then
+  # Code to be used in simple compile tests
+  lt_simple_compile_test_code="int some_variable = 0;"
+
+  # Code to be used in simple link tests
+  lt_simple_link_test_code='int main(int, char *[]) { return(0); }'
+
+  # ltmain only uses $CC for tagged configurations so make sure $CC is set.
+
+
+
+
+
+
+# If no C compiler was specified, use CC.
+LTCC=${LTCC-"$CC"}
+
+# If no C compiler flags were specified, use CFLAGS.
+LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
+
+# Allow CC to be a program name with arguments.
+compiler=$CC
+
+
+  # save warnings/boilerplate of simple test code
+  ac_outfile=conftest.$ac_objext
+echo "$lt_simple_compile_test_code" >conftest.$ac_ext
+eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_compiler_boilerplate=`cat conftest.err`
+$RM conftest*
+
+  ac_outfile=conftest.$ac_objext
+echo "$lt_simple_link_test_code" >conftest.$ac_ext
+eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_linker_boilerplate=`cat conftest.err`
+$RM -r conftest*
+
+
+  # Allow CC to be a program name with arguments.
+  lt_save_CC=$CC
+  lt_save_CFLAGS=$CFLAGS
+  lt_save_LD=$LD
+  lt_save_GCC=$GCC
+  GCC=$GXX
+  lt_save_with_gnu_ld=$with_gnu_ld
+  lt_save_path_LD=$lt_cv_path_LD
+  if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then
+    lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx
+  else
+    $as_unset lt_cv_prog_gnu_ld
+  fi
+  if test -n "${lt_cv_path_LDCXX+set}"; then
+    lt_cv_path_LD=$lt_cv_path_LDCXX
+  else
+    $as_unset lt_cv_path_LD
+  fi
+  test -z "${LDCXX+set}" || LD=$LDCXX
+  CC=${CXX-"c++"}
+  CFLAGS=$CXXFLAGS
+  compiler=$CC
+  compiler_CXX=$CC
+  for cc_temp in $compiler""; do
+  case $cc_temp in
+    compile | *[\\/]compile | ccache | *[\\/]ccache ) ;;
+    distcc | *[\\/]distcc | purify | *[\\/]purify ) ;;
+    \-*) ;;
+    *) break;;
+  esac
+done
+cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"`
+
+
+  if test -n "$compiler"; then
+    # We don't want -fno-exception when compiling C++ code, so set the
+    # no_builtin_flag separately
+    if test "$GXX" = yes; then
+      lt_prog_compiler_no_builtin_flag_CXX=' -fno-builtin'
+    else
+      lt_prog_compiler_no_builtin_flag_CXX=
+    fi
+
+    if test "$GXX" = yes; then
+      # Set up default GNU C++ configuration
+
+
+
+# Check whether --with-gnu-ld was given.
+if test "${with_gnu_ld+set}" = set; then :
+  withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes
+else
+  with_gnu_ld=no
+fi
+
+ac_prog=ld
+if test "$GCC" = yes; then
+  # Check if gcc -print-prog-name=ld gives a path.
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ld used by $CC" >&5
+$as_echo_n "checking for ld used by $CC... " >&6; }
+  case $host in
+  *-*-mingw*)
+    # gcc leaves a trailing carriage return which upsets mingw
+    ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
+  *)
+    ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
+  esac
+  case $ac_prog in
+    # Accept absolute paths.
+    [\\/]* | ?:[\\/]*)
+      re_direlt='/[^/][^/]*/\.\./'
+      # Canonicalize the pathname of ld
+      ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'`
+      while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do
+	ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"`
+      done
+      test -z "$LD" && LD="$ac_prog"
+      ;;
+  "")
+    # If it fails, then pretend we aren't using GCC.
+    ac_prog=ld
+    ;;
+  *)
+    # If it is relative, then search for the first ld in PATH.
+    with_gnu_ld=unknown
+    ;;
+  esac
+elif test "$with_gnu_ld" = yes; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU ld" >&5
+$as_echo_n "checking for GNU ld... " >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for non-GNU ld" >&5
+$as_echo_n "checking for non-GNU ld... " >&6; }
+fi
+if ${lt_cv_path_LD+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -z "$LD"; then
+  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+  for ac_dir in $PATH; do
+    IFS="$lt_save_ifs"
+    test -z "$ac_dir" && ac_dir=.
+    if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
+      lt_cv_path_LD="$ac_dir/$ac_prog"
+      # Check to see if the program is GNU ld.  I'd rather use --version,
+      # but apparently some variants of GNU ld only accept -v.
+      # Break only if it was the GNU/non-GNU ld that we prefer.
+      case `"$lt_cv_path_LD" -v 2>&1 </dev/null` in
+      *GNU* | *'with BFD'*)
+	test "$with_gnu_ld" != no && break
+	;;
+      *)
+	test "$with_gnu_ld" != yes && break
+	;;
+      esac
+    fi
+  done
+  IFS="$lt_save_ifs"
+else
+  lt_cv_path_LD="$LD" # Let the user override the test with a path.
+fi
+fi
+
+LD="$lt_cv_path_LD"
+if test -n "$LD"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LD" >&5
+$as_echo "$LD" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+test -z "$LD" && as_fn_error $? "no acceptable ld found in \$PATH" "$LINENO" 5
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld" >&5
+$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; }
+if ${lt_cv_prog_gnu_ld+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  # I'd rather use --version here, but apparently some GNU lds only accept -v.
+case `$LD -v 2>&1 </dev/null` in
+*GNU* | *'with BFD'*)
+  lt_cv_prog_gnu_ld=yes
+  ;;
+*)
+  lt_cv_prog_gnu_ld=no
+  ;;
+esac
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_gnu_ld" >&5
+$as_echo "$lt_cv_prog_gnu_ld" >&6; }
+with_gnu_ld=$lt_cv_prog_gnu_ld
+
+
+
+
+
+
+
+      # Check if GNU C++ uses GNU ld as the underlying linker, since the
+      # archiving commands below assume that GNU ld is being used.
+      if test "$with_gnu_ld" = yes; then
+        archive_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
+        archive_expsym_cmds_CXX='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+
+        hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir'
+        export_dynamic_flag_spec_CXX='${wl}--export-dynamic'
+
+        # If archive_cmds runs LD, not CC, wlarc should be empty
+        # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to
+        #     investigate it a little bit more. (MM)
+        wlarc='${wl}'
+
+        # ancient GNU ld didn't support --whole-archive et. al.
+        if eval "`$CC -print-prog-name=ld` --help 2>&1" |
+	  $GREP 'no-whole-archive' > /dev/null; then
+          whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+        else
+          whole_archive_flag_spec_CXX=
+        fi
+      else
+        with_gnu_ld=no
+        wlarc=
+
+        # A generic and very simple default shared library creation
+        # command for GNU C++ for the case where it uses the native
+        # linker, instead of GNU ld.  If possible, this setting should
+        # overridden to take advantage of the native linker features on
+        # the platform it is being used on.
+        archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'
+      fi
+
+      # Commands to make compiler produce verbose output that lists
+      # what "hidden" libraries, object files and flags are used when
+      # linking a shared library.
+      output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
+
+    else
+      GXX=no
+      with_gnu_ld=no
+      wlarc=
+    fi
+
+    # PORTME: fill in a description of your system's C++ link characteristics
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5
+$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; }
+    ld_shlibs_CXX=yes
+    case $host_os in
+      aix3*)
+        # FIXME: insert proper C++ library support
+        ld_shlibs_CXX=no
+        ;;
+      aix[4-9]*)
+        if test "$host_cpu" = ia64; then
+          # On IA64, the linker does run time linking by default, so we don't
+          # have to do anything special.
+          aix_use_runtimelinking=no
+          exp_sym_flag='-Bexport'
+          no_entry_flag=""
+        else
+          aix_use_runtimelinking=no
+
+          # Test if we are trying to use run time linking or normal
+          # AIX style linking. If -brtl is somewhere in LDFLAGS, we
+          # need to do runtime linking.
+          case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*)
+	    for ld_flag in $LDFLAGS; do
+	      case $ld_flag in
+	      *-brtl*)
+	        aix_use_runtimelinking=yes
+	        break
+	        ;;
+	      esac
+	    done
+	    ;;
+          esac
+
+          exp_sym_flag='-bexport'
+          no_entry_flag='-bnoentry'
+        fi
+
+        # When large executables or shared objects are built, AIX ld can
+        # have problems creating the table of contents.  If linking a library
+        # or program results in "error TOC overflow" add -mminimal-toc to
+        # CXXFLAGS/CFLAGS for g++/gcc.  In the cases where that is not
+        # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
+
+        archive_cmds_CXX=''
+        hardcode_direct_CXX=yes
+        hardcode_direct_absolute_CXX=yes
+        hardcode_libdir_separator_CXX=':'
+        link_all_deplibs_CXX=yes
+        file_list_spec_CXX='${wl}-f,'
+
+        if test "$GXX" = yes; then
+          case $host_os in aix4.[012]|aix4.[012].*)
+          # We only want to do this on AIX 4.2 and lower, the check
+          # below for broken collect2 doesn't work under 4.3+
+	  collect2name=`${CC} -print-prog-name=collect2`
+	  if test -f "$collect2name" &&
+	     strings "$collect2name" | $GREP resolve_lib_name >/dev/null
+	  then
+	    # We have reworked collect2
+	    :
+	  else
+	    # We have old collect2
+	    hardcode_direct_CXX=unsupported
+	    # It fails to find uninstalled libraries when the uninstalled
+	    # path is not listed in the libpath.  Setting hardcode_minus_L
+	    # to unsupported forces relinking
+	    hardcode_minus_L_CXX=yes
+	    hardcode_libdir_flag_spec_CXX='-L$libdir'
+	    hardcode_libdir_separator_CXX=
+	  fi
+          esac
+          shared_flag='-shared'
+	  if test "$aix_use_runtimelinking" = yes; then
+	    shared_flag="$shared_flag "'${wl}-G'
+	  fi
+        else
+          # not using gcc
+          if test "$host_cpu" = ia64; then
+	  # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
+	  # chokes on -Wl,-G. The following line is correct:
+	  shared_flag='-G'
+          else
+	    if test "$aix_use_runtimelinking" = yes; then
+	      shared_flag='${wl}-G'
+	    else
+	      shared_flag='${wl}-bM:SRE'
+	    fi
+          fi
+        fi
+
+        export_dynamic_flag_spec_CXX='${wl}-bexpall'
+        # It seems that -bexpall does not export symbols beginning with
+        # underscore (_), so it is better to generate a list of symbols to
+	# export.
+        always_export_symbols_CXX=yes
+        if test "$aix_use_runtimelinking" = yes; then
+          # Warning - without using the other runtime loading flags (-brtl),
+          # -berok will link without error, but may produce a broken library.
+          allow_undefined_flag_CXX='-berok'
+          # Determine the default libpath from the value encoded in an empty
+          # executable.
+          if test "${lt_cv_aix_libpath+set}" = set; then
+  aix_libpath=$lt_cv_aix_libpath
+else
+  if ${lt_cv_aix_libpath__CXX+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_link "$LINENO"; then :
+
+  lt_aix_libpath_sed='
+      /Import File Strings/,/^$/ {
+	  /^0/ {
+	      s/^0  *\([^ ]*\) *$/\1/
+	      p
+	  }
+      }'
+  lt_cv_aix_libpath__CXX=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+  # Check for a 64-bit object if we didn't find anything.
+  if test -z "$lt_cv_aix_libpath__CXX"; then
+    lt_cv_aix_libpath__CXX=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+  fi
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+  if test -z "$lt_cv_aix_libpath__CXX"; then
+    lt_cv_aix_libpath__CXX="/usr/lib:/lib"
+  fi
+
+fi
+
+  aix_libpath=$lt_cv_aix_libpath__CXX
+fi
+
+          hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath"
+
+          archive_expsym_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
+        else
+          if test "$host_cpu" = ia64; then
+	    hardcode_libdir_flag_spec_CXX='${wl}-R $libdir:/usr/lib:/lib'
+	    allow_undefined_flag_CXX="-z nodefs"
+	    archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols"
+          else
+	    # Determine the default libpath from the value encoded in an
+	    # empty executable.
+	    if test "${lt_cv_aix_libpath+set}" = set; then
+  aix_libpath=$lt_cv_aix_libpath
+else
+  if ${lt_cv_aix_libpath__CXX+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_link "$LINENO"; then :
+
+  lt_aix_libpath_sed='
+      /Import File Strings/,/^$/ {
+	  /^0/ {
+	      s/^0  *\([^ ]*\) *$/\1/
+	      p
+	  }
+      }'
+  lt_cv_aix_libpath__CXX=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+  # Check for a 64-bit object if we didn't find anything.
+  if test -z "$lt_cv_aix_libpath__CXX"; then
+    lt_cv_aix_libpath__CXX=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+  fi
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+  if test -z "$lt_cv_aix_libpath__CXX"; then
+    lt_cv_aix_libpath__CXX="/usr/lib:/lib"
+  fi
+
+fi
+
+  aix_libpath=$lt_cv_aix_libpath__CXX
+fi
+
+	    hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath"
+	    # Warning - without using the other run time loading flags,
+	    # -berok will link without error, but may produce a broken library.
+	    no_undefined_flag_CXX=' ${wl}-bernotok'
+	    allow_undefined_flag_CXX=' ${wl}-berok'
+	    if test "$with_gnu_ld" = yes; then
+	      # We only use this code for GNU lds that support --whole-archive.
+	      whole_archive_flag_spec_CXX='${wl}--whole-archive$convenience ${wl}--no-whole-archive'
+	    else
+	      # Exported symbols can be pulled into shared objects from archives
+	      whole_archive_flag_spec_CXX='$convenience'
+	    fi
+	    archive_cmds_need_lc_CXX=yes
+	    # This is similar to how AIX traditionally builds its shared
+	    # libraries.
+	    archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
+          fi
+        fi
+        ;;
+
+      beos*)
+	if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+	  allow_undefined_flag_CXX=unsupported
+	  # Joseph Beckenbach <jrb3 at best.com> says some releases of gcc
+	  # support --undefined.  This deserves some investigation.  FIXME
+	  archive_cmds_CXX='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	else
+	  ld_shlibs_CXX=no
+	fi
+	;;
+
+      chorus*)
+        case $cc_basename in
+          *)
+	  # FIXME: insert proper C++ library support
+	  ld_shlibs_CXX=no
+	  ;;
+        esac
+        ;;
+
+      cygwin* | mingw* | pw32* | cegcc*)
+	case $GXX,$cc_basename in
+	,cl* | no,cl*)
+	  # Native MSVC
+	  # hardcode_libdir_flag_spec is actually meaningless, as there is
+	  # no search path for DLLs.
+	  hardcode_libdir_flag_spec_CXX=' '
+	  allow_undefined_flag_CXX=unsupported
+	  always_export_symbols_CXX=yes
+	  file_list_spec_CXX='@'
+	  # Tell ltmain to make .lib files, not .a files.
+	  libext=lib
+	  # Tell ltmain to make .dll files, not .so files.
+	  shrext_cmds=".dll"
+	  # FIXME: Setting linknames here is a bad hack.
+	  archive_cmds_CXX='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames='
+	  archive_expsym_cmds_CXX='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
+	      $SED -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp;
+	    else
+	      $SED -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp;
+	    fi~
+	    $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~
+	    linknames='
+	  # The linker will not automatically build a static lib if we build a DLL.
+	  # _LT_TAGVAR(old_archive_from_new_cmds, CXX)='true'
+	  enable_shared_with_static_runtimes_CXX=yes
+	  # Don't use ranlib
+	  old_postinstall_cmds_CXX='chmod 644 $oldlib'
+	  postlink_cmds_CXX='lt_outputfile="@OUTPUT@"~
+	    lt_tool_outputfile="@TOOL_OUTPUT@"~
+	    case $lt_outputfile in
+	      *.exe|*.EXE) ;;
+	      *)
+		lt_outputfile="$lt_outputfile.exe"
+		lt_tool_outputfile="$lt_tool_outputfile.exe"
+		;;
+	    esac~
+	    func_to_tool_file "$lt_outputfile"~
+	    if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then
+	      $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1;
+	      $RM "$lt_outputfile.manifest";
+	    fi'
+	  ;;
+	*)
+	  # g++
+	  # _LT_TAGVAR(hardcode_libdir_flag_spec, CXX) is actually meaningless,
+	  # as there is no search path for DLLs.
+	  hardcode_libdir_flag_spec_CXX='-L$libdir'
+	  export_dynamic_flag_spec_CXX='${wl}--export-all-symbols'
+	  allow_undefined_flag_CXX=unsupported
+	  always_export_symbols_CXX=no
+	  enable_shared_with_static_runtimes_CXX=yes
+
+	  if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then
+	    archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+	    # If the export-symbols file already is a .def file (1st line
+	    # is EXPORTS), use it as is; otherwise, prepend...
+	    archive_expsym_cmds_CXX='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
+	      cp $export_symbols $output_objdir/$soname.def;
+	    else
+	      echo EXPORTS > $output_objdir/$soname.def;
+	      cat $export_symbols >> $output_objdir/$soname.def;
+	    fi~
+	    $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+	  else
+	    ld_shlibs_CXX=no
+	  fi
+	  ;;
+	esac
+	;;
+      darwin* | rhapsody*)
+
+
+  archive_cmds_need_lc_CXX=no
+  hardcode_direct_CXX=no
+  hardcode_automatic_CXX=yes
+  hardcode_shlibpath_var_CXX=unsupported
+  if test "$lt_cv_ld_force_load" = "yes"; then
+    whole_archive_flag_spec_CXX='`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`'
+
+  else
+    whole_archive_flag_spec_CXX=''
+  fi
+  link_all_deplibs_CXX=yes
+  allow_undefined_flag_CXX="$_lt_dar_allow_undefined"
+  case $cc_basename in
+     ifort*) _lt_dar_can_shared=yes ;;
+     *) _lt_dar_can_shared=$GCC ;;
+  esac
+  if test "$_lt_dar_can_shared" = "yes"; then
+    output_verbose_link_cmd=func_echo_all
+    archive_cmds_CXX="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}"
+    module_cmds_CXX="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}"
+    archive_expsym_cmds_CXX="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}"
+    module_expsym_cmds_CXX="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}"
+       if test "$lt_cv_apple_cc_single_mod" != "yes"; then
+      archive_cmds_CXX="\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dsymutil}"
+      archive_expsym_cmds_CXX="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dar_export_syms}${_lt_dsymutil}"
+    fi
+
+  else
+  ld_shlibs_CXX=no
+  fi
+
+	;;
+
+      dgux*)
+        case $cc_basename in
+          ec++*)
+	    # FIXME: insert proper C++ library support
+	    ld_shlibs_CXX=no
+	    ;;
+          ghcx*)
+	    # Green Hills C++ Compiler
+	    # FIXME: insert proper C++ library support
+	    ld_shlibs_CXX=no
+	    ;;
+          *)
+	    # FIXME: insert proper C++ library support
+	    ld_shlibs_CXX=no
+	    ;;
+        esac
+        ;;
+
+      freebsd2.*)
+        # C++ shared libraries reported to be fairly broken before
+	# switch to ELF
+        ld_shlibs_CXX=no
+        ;;
+
+      freebsd-elf*)
+        archive_cmds_need_lc_CXX=no
+        ;;
+
+      freebsd* | dragonfly*)
+        # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF
+        # conventions
+        ld_shlibs_CXX=yes
+        ;;
+
+      gnu*)
+        ;;
+
+      haiku*)
+        archive_cmds_CXX='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+        link_all_deplibs_CXX=yes
+        ;;
+
+      hpux9*)
+        hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir'
+        hardcode_libdir_separator_CXX=:
+        export_dynamic_flag_spec_CXX='${wl}-E'
+        hardcode_direct_CXX=yes
+        hardcode_minus_L_CXX=yes # Not in the search PATH,
+				             # but as the default
+				             # location of the library.
+
+        case $cc_basename in
+          CC*)
+            # FIXME: insert proper C++ library support
+            ld_shlibs_CXX=no
+            ;;
+          aCC*)
+            archive_cmds_CXX='$RM $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+            # Commands to make compiler produce verbose output that lists
+            # what "hidden" libraries, object files and flags are used when
+            # linking a shared library.
+            #
+            # There doesn't appear to be a way to prevent this compiler from
+            # explicitly linking system object files so we need to strip them
+            # from the output so that they don't get included in the library
+            # dependencies.
+            output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
+            ;;
+          *)
+            if test "$GXX" = yes; then
+              archive_cmds_CXX='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+            else
+              # FIXME: insert proper C++ library support
+              ld_shlibs_CXX=no
+            fi
+            ;;
+        esac
+        ;;
+
+      hpux10*|hpux11*)
+        if test $with_gnu_ld = no; then
+	  hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir'
+	  hardcode_libdir_separator_CXX=:
+
+          case $host_cpu in
+            hppa*64*|ia64*)
+              ;;
+            *)
+	      export_dynamic_flag_spec_CXX='${wl}-E'
+              ;;
+          esac
+        fi
+        case $host_cpu in
+          hppa*64*|ia64*)
+            hardcode_direct_CXX=no
+            hardcode_shlibpath_var_CXX=no
+            ;;
+          *)
+            hardcode_direct_CXX=yes
+            hardcode_direct_absolute_CXX=yes
+            hardcode_minus_L_CXX=yes # Not in the search PATH,
+					         # but as the default
+					         # location of the library.
+            ;;
+        esac
+
+        case $cc_basename in
+          CC*)
+	    # FIXME: insert proper C++ library support
+	    ld_shlibs_CXX=no
+	    ;;
+          aCC*)
+	    case $host_cpu in
+	      hppa*64*)
+	        archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	        ;;
+	      ia64*)
+	        archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	        ;;
+	      *)
+	        archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	        ;;
+	    esac
+	    # Commands to make compiler produce verbose output that lists
+	    # what "hidden" libraries, object files and flags are used when
+	    # linking a shared library.
+	    #
+	    # There doesn't appear to be a way to prevent this compiler from
+	    # explicitly linking system object files so we need to strip them
+	    # from the output so that they don't get included in the library
+	    # dependencies.
+	    output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
+	    ;;
+          *)
+	    if test "$GXX" = yes; then
+	      if test $with_gnu_ld = no; then
+	        case $host_cpu in
+	          hppa*64*)
+	            archive_cmds_CXX='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	            ;;
+	          ia64*)
+	            archive_cmds_CXX='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	            ;;
+	          *)
+	            archive_cmds_CXX='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	            ;;
+	        esac
+	      fi
+	    else
+	      # FIXME: insert proper C++ library support
+	      ld_shlibs_CXX=no
+	    fi
+	    ;;
+        esac
+        ;;
+
+      interix[3-9]*)
+	hardcode_direct_CXX=no
+	hardcode_shlibpath_var_CXX=no
+	hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir'
+	export_dynamic_flag_spec_CXX='${wl}-E'
+	# Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
+	# Instead, shared libraries are loaded at an image base (0x10000000 by
+	# default) and relocated if they conflict, which is a slow very memory
+	# consuming and fragmenting process.  To avoid this, we pick a random,
+	# 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
+	# time.  Moving up from 0x10000000 also allows more sbrk(2) space.
+	archive_cmds_CXX='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+	archive_expsym_cmds_CXX='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+	;;
+      irix5* | irix6*)
+        case $cc_basename in
+          CC*)
+	    # SGI C++
+	    archive_cmds_CXX='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
+
+	    # Archives containing C++ object files must be created using
+	    # "CC -ar", where "CC" is the IRIX C++ compiler.  This is
+	    # necessary to make sure instantiated templates are included
+	    # in the archive.
+	    old_archive_cmds_CXX='$CC -ar -WR,-u -o $oldlib $oldobjs'
+	    ;;
+          *)
+	    if test "$GXX" = yes; then
+	      if test "$with_gnu_ld" = no; then
+	        archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+	      else
+	        archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` -o $lib'
+	      fi
+	    fi
+	    link_all_deplibs_CXX=yes
+	    ;;
+        esac
+        hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir'
+        hardcode_libdir_separator_CXX=:
+        inherit_rpath_CXX=yes
+        ;;
+
+      linux* | k*bsd*-gnu | kopensolaris*-gnu)
+        case $cc_basename in
+          KCC*)
+	    # Kuck and Associates, Inc. (KAI) C++ Compiler
+
+	    # KCC will only create a shared library if the output file
+	    # ends with ".so" (or ".sl" for HP-UX), so rename the library
+	    # to its proper name (with version) after linking.
+	    archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
+	    archive_expsym_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib'
+	    # Commands to make compiler produce verbose output that lists
+	    # what "hidden" libraries, object files and flags are used when
+	    # linking a shared library.
+	    #
+	    # There doesn't appear to be a way to prevent this compiler from
+	    # explicitly linking system object files so we need to strip them
+	    # from the output so that they don't get included in the library
+	    # dependencies.
+	    output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
+
+	    hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir'
+	    export_dynamic_flag_spec_CXX='${wl}--export-dynamic'
+
+	    # Archives containing C++ object files must be created using
+	    # "CC -Bstatic", where "CC" is the KAI C++ compiler.
+	    old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs'
+	    ;;
+	  icpc* | ecpc* )
+	    # Intel C++
+	    with_gnu_ld=yes
+	    # version 8.0 and above of icpc choke on multiply defined symbols
+	    # if we add $predep_objects and $postdep_objects, however 7.1 and
+	    # earlier do not add the objects themselves.
+	    case `$CC -V 2>&1` in
+	      *"Version 7."*)
+	        archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
+		archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+		;;
+	      *)  # Version 8.0 or newer
+	        tmp_idyn=
+	        case $host_cpu in
+		  ia64*) tmp_idyn=' -i_dynamic';;
+		esac
+	        archive_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+		archive_expsym_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+		;;
+	    esac
+	    archive_cmds_need_lc_CXX=no
+	    hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir'
+	    export_dynamic_flag_spec_CXX='${wl}--export-dynamic'
+	    whole_archive_flag_spec_CXX='${wl}--whole-archive$convenience ${wl}--no-whole-archive'
+	    ;;
+          pgCC* | pgcpp*)
+            # Portland Group C++ compiler
+	    case `$CC -V` in
+	    *pgCC\ [1-5].* | *pgcpp\ [1-5].*)
+	      prelink_cmds_CXX='tpldir=Template.dir~
+		rm -rf $tpldir~
+		$CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~
+		compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"'
+	      old_archive_cmds_CXX='tpldir=Template.dir~
+		rm -rf $tpldir~
+		$CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~
+		$AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~
+		$RANLIB $oldlib'
+	      archive_cmds_CXX='tpldir=Template.dir~
+		rm -rf $tpldir~
+		$CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~
+		$CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib'
+	      archive_expsym_cmds_CXX='tpldir=Template.dir~
+		rm -rf $tpldir~
+		$CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~
+		$CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib'
+	      ;;
+	    *) # Version 6 and above use weak symbols
+	      archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib'
+	      archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib'
+	      ;;
+	    esac
+
+	    hardcode_libdir_flag_spec_CXX='${wl}--rpath ${wl}$libdir'
+	    export_dynamic_flag_spec_CXX='${wl}--export-dynamic'
+	    whole_archive_flag_spec_CXX='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+            ;;
+	  cxx*)
+	    # Compaq C++
+	    archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	    archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname  -o $lib ${wl}-retain-symbols-file $wl$export_symbols'
+
+	    runpath_var=LD_RUN_PATH
+	    hardcode_libdir_flag_spec_CXX='-rpath $libdir'
+	    hardcode_libdir_separator_CXX=:
+
+	    # Commands to make compiler produce verbose output that lists
+	    # what "hidden" libraries, object files and flags are used when
+	    # linking a shared library.
+	    #
+	    # There doesn't appear to be a way to prevent this compiler from
+	    # explicitly linking system object files so we need to strip them
+	    # from the output so that they don't get included in the library
+	    # dependencies.
+	    output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed'
+	    ;;
+	  xl* | mpixl* | bgxl*)
+	    # IBM XL 8.0 on PPC, with GNU ld
+	    hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir'
+	    export_dynamic_flag_spec_CXX='${wl}--export-dynamic'
+	    archive_cmds_CXX='$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	    if test "x$supports_anon_versioning" = xyes; then
+	      archive_expsym_cmds_CXX='echo "{ global:" > $output_objdir/$libname.ver~
+		cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+		echo "local: *; };" >> $output_objdir/$libname.ver~
+		$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'
+	    fi
+	    ;;
+	  *)
+	    case `$CC -V 2>&1 | sed 5q` in
+	    *Sun\ C*)
+	      # Sun C++ 5.9
+	      no_undefined_flag_CXX=' -zdefs'
+	      archive_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	      archive_expsym_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols'
+	      hardcode_libdir_flag_spec_CXX='-R$libdir'
+	      whole_archive_flag_spec_CXX='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+	      compiler_needs_object_CXX=yes
+
+	      # Not sure whether something based on
+	      # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1
+	      # would be better.
+	      output_verbose_link_cmd='func_echo_all'
+
+	      # Archives containing C++ object files must be created using
+	      # "CC -xar", where "CC" is the Sun C++ compiler.  This is
+	      # necessary to make sure instantiated templates are included
+	      # in the archive.
+	      old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs'
+	      ;;
+	    esac
+	    ;;
+	esac
+	;;
+
+      lynxos*)
+        # FIXME: insert proper C++ library support
+	ld_shlibs_CXX=no
+	;;
+
+      m88k*)
+        # FIXME: insert proper C++ library support
+        ld_shlibs_CXX=no
+	;;
+
+      mvs*)
+        case $cc_basename in
+          cxx*)
+	    # FIXME: insert proper C++ library support
+	    ld_shlibs_CXX=no
+	    ;;
+	  *)
+	    # FIXME: insert proper C++ library support
+	    ld_shlibs_CXX=no
+	    ;;
+	esac
+	;;
+
+      netbsd*)
+        if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+	  archive_cmds_CXX='$LD -Bshareable  -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags'
+	  wlarc=
+	  hardcode_libdir_flag_spec_CXX='-R$libdir'
+	  hardcode_direct_CXX=yes
+	  hardcode_shlibpath_var_CXX=no
+	fi
+	# Workaround some broken pre-1.5 toolchains
+	output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"'
+	;;
+
+      *nto* | *qnx*)
+        ld_shlibs_CXX=yes
+	;;
+
+      openbsd2*)
+        # C++ shared libraries are fairly broken
+	ld_shlibs_CXX=no
+	;;
+
+      openbsd*)
+	if test -f /usr/libexec/ld.so; then
+	  hardcode_direct_CXX=yes
+	  hardcode_shlibpath_var_CXX=no
+	  hardcode_direct_absolute_CXX=yes
+	  archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'
+	  hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir'
+	  if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+	    archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib'
+	    export_dynamic_flag_spec_CXX='${wl}-E'
+	    whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+	  fi
+	  output_verbose_link_cmd=func_echo_all
+	else
+	  ld_shlibs_CXX=no
+	fi
+	;;
+
+      osf3* | osf4* | osf5*)
+        case $cc_basename in
+          KCC*)
+	    # Kuck and Associates, Inc. (KAI) C++ Compiler
+
+	    # KCC will only create a shared library if the output file
+	    # ends with ".so" (or ".sl" for HP-UX), so rename the library
+	    # to its proper name (with version) after linking.
+	    archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
+
+	    hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir'
+	    hardcode_libdir_separator_CXX=:
+
+	    # Archives containing C++ object files must be created using
+	    # the KAI C++ compiler.
+	    case $host in
+	      osf3*) old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' ;;
+	      *) old_archive_cmds_CXX='$CC -o $oldlib $oldobjs' ;;
+	    esac
+	    ;;
+          RCC*)
+	    # Rational C++ 2.4.1
+	    # FIXME: insert proper C++ library support
+	    ld_shlibs_CXX=no
+	    ;;
+          cxx*)
+	    case $host in
+	      osf3*)
+	        allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*'
+	        archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && func_echo_all "${wl}-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
+	        hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir'
+		;;
+	      *)
+	        allow_undefined_flag_CXX=' -expect_unresolved \*'
+	        archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
+	        archive_expsym_cmds_CXX='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~
+	          echo "-hidden">> $lib.exp~
+	          $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname ${wl}-input ${wl}$lib.exp  `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~
+	          $RM $lib.exp'
+	        hardcode_libdir_flag_spec_CXX='-rpath $libdir'
+		;;
+	    esac
+
+	    hardcode_libdir_separator_CXX=:
+
+	    # Commands to make compiler produce verbose output that lists
+	    # what "hidden" libraries, object files and flags are used when
+	    # linking a shared library.
+	    #
+	    # There doesn't appear to be a way to prevent this compiler from
+	    # explicitly linking system object files so we need to strip them
+	    # from the output so that they don't get included in the library
+	    # dependencies.
+	    output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
+	    ;;
+	  *)
+	    if test "$GXX" = yes && test "$with_gnu_ld" = no; then
+	      allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*'
+	      case $host in
+	        osf3*)
+	          archive_cmds_CXX='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+		  ;;
+	        *)
+	          archive_cmds_CXX='$CC -shared $pic_flag -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+		  ;;
+	      esac
+
+	      hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir'
+	      hardcode_libdir_separator_CXX=:
+
+	      # Commands to make compiler produce verbose output that lists
+	      # what "hidden" libraries, object files and flags are used when
+	      # linking a shared library.
+	      output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
+
+	    else
+	      # FIXME: insert proper C++ library support
+	      ld_shlibs_CXX=no
+	    fi
+	    ;;
+        esac
+        ;;
+
+      psos*)
+        # FIXME: insert proper C++ library support
+        ld_shlibs_CXX=no
+        ;;
+
+      sunos4*)
+        case $cc_basename in
+          CC*)
+	    # Sun C++ 4.x
+	    # FIXME: insert proper C++ library support
+	    ld_shlibs_CXX=no
+	    ;;
+          lcc*)
+	    # Lucid
+	    # FIXME: insert proper C++ library support
+	    ld_shlibs_CXX=no
+	    ;;
+          *)
+	    # FIXME: insert proper C++ library support
+	    ld_shlibs_CXX=no
+	    ;;
+        esac
+        ;;
+
+      solaris*)
+        case $cc_basename in
+          CC* | sunCC*)
+	    # Sun C++ 4.2, 5.x and Centerline C++
+            archive_cmds_need_lc_CXX=yes
+	    no_undefined_flag_CXX=' -zdefs'
+	    archive_cmds_CXX='$CC -G${allow_undefined_flag}  -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	    archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+	      $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
+
+	    hardcode_libdir_flag_spec_CXX='-R$libdir'
+	    hardcode_shlibpath_var_CXX=no
+	    case $host_os in
+	      solaris2.[0-5] | solaris2.[0-5].*) ;;
+	      *)
+		# The compiler driver will combine and reorder linker options,
+		# but understands `-z linker_flag'.
+	        # Supported since Solaris 2.6 (maybe 2.5.1?)
+		whole_archive_flag_spec_CXX='-z allextract$convenience -z defaultextract'
+	        ;;
+	    esac
+	    link_all_deplibs_CXX=yes
+
+	    output_verbose_link_cmd='func_echo_all'
+
+	    # Archives containing C++ object files must be created using
+	    # "CC -xar", where "CC" is the Sun C++ compiler.  This is
+	    # necessary to make sure instantiated templates are included
+	    # in the archive.
+	    old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs'
+	    ;;
+          gcx*)
+	    # Green Hills C++ Compiler
+	    archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
+
+	    # The C++ compiler must be used to create the archive.
+	    old_archive_cmds_CXX='$CC $LDFLAGS -archive -o $oldlib $oldobjs'
+	    ;;
+          *)
+	    # GNU C++ compiler with Solaris linker
+	    if test "$GXX" = yes && test "$with_gnu_ld" = no; then
+	      no_undefined_flag_CXX=' ${wl}-z ${wl}defs'
+	      if $CC --version | $GREP -v '^2\.7' > /dev/null; then
+	        archive_cmds_CXX='$CC -shared $pic_flag -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
+	        archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+		  $CC -shared $pic_flag -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
+
+	        # Commands to make compiler produce verbose output that lists
+	        # what "hidden" libraries, object files and flags are used when
+	        # linking a shared library.
+	        output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
+	      else
+	        # g++ 2.7 appears to require `-G' NOT `-shared' on this
+	        # platform.
+	        archive_cmds_CXX='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
+	        archive_expsym_cmds_CXX='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+		  $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
+
+	        # Commands to make compiler produce verbose output that lists
+	        # what "hidden" libraries, object files and flags are used when
+	        # linking a shared library.
+	        output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
+	      fi
+
+	      hardcode_libdir_flag_spec_CXX='${wl}-R $wl$libdir'
+	      case $host_os in
+		solaris2.[0-5] | solaris2.[0-5].*) ;;
+		*)
+		  whole_archive_flag_spec_CXX='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract'
+		  ;;
+	      esac
+	    fi
+	    ;;
+        esac
+        ;;
+
+    sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*)
+      no_undefined_flag_CXX='${wl}-z,text'
+      archive_cmds_need_lc_CXX=no
+      hardcode_shlibpath_var_CXX=no
+      runpath_var='LD_RUN_PATH'
+
+      case $cc_basename in
+        CC*)
+	  archive_cmds_CXX='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  archive_expsym_cmds_CXX='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	*)
+	  archive_cmds_CXX='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  archive_expsym_cmds_CXX='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+      esac
+      ;;
+
+      sysv5* | sco3.2v5* | sco5v6*)
+	# Note: We can NOT use -z defs as we might desire, because we do not
+	# link with -lc, and that would cause any symbols used from libc to
+	# always be unresolved, which means just about no library would
+	# ever link correctly.  If we're not using GNU ld we use -z text
+	# though, which does catch some bad symbols but isn't as heavy-handed
+	# as -z defs.
+	no_undefined_flag_CXX='${wl}-z,text'
+	allow_undefined_flag_CXX='${wl}-z,nodefs'
+	archive_cmds_need_lc_CXX=no
+	hardcode_shlibpath_var_CXX=no
+	hardcode_libdir_flag_spec_CXX='${wl}-R,$libdir'
+	hardcode_libdir_separator_CXX=':'
+	link_all_deplibs_CXX=yes
+	export_dynamic_flag_spec_CXX='${wl}-Bexport'
+	runpath_var='LD_RUN_PATH'
+
+	case $cc_basename in
+          CC*)
+	    archive_cmds_CXX='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	    archive_expsym_cmds_CXX='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	    old_archive_cmds_CXX='$CC -Tprelink_objects $oldobjs~
+	      '"$old_archive_cmds_CXX"
+	    reload_cmds_CXX='$CC -Tprelink_objects $reload_objs~
+	      '"$reload_cmds_CXX"
+	    ;;
+	  *)
+	    archive_cmds_CXX='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	    archive_expsym_cmds_CXX='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	    ;;
+	esac
+      ;;
+
+      tandem*)
+        case $cc_basename in
+          NCC*)
+	    # NonStop-UX NCC 3.20
+	    # FIXME: insert proper C++ library support
+	    ld_shlibs_CXX=no
+	    ;;
+          *)
+	    # FIXME: insert proper C++ library support
+	    ld_shlibs_CXX=no
+	    ;;
+        esac
+        ;;
+
+      vxworks*)
+        # FIXME: insert proper C++ library support
+        ld_shlibs_CXX=no
+        ;;
+
+      *)
+        # FIXME: insert proper C++ library support
+        ld_shlibs_CXX=no
+        ;;
+    esac
+
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5
+$as_echo "$ld_shlibs_CXX" >&6; }
+    test "$ld_shlibs_CXX" = no && can_build_shared=no
+
+    GCC_CXX="$GXX"
+    LD_CXX="$LD"
+
+    ## CAVEAT EMPTOR:
+    ## There is no encapsulation within the following macros, do not change
+    ## the running order or otherwise move them around unless you know exactly
+    ## what you are doing...
+    # Dependencies to place before and after the object being linked:
+predep_objects_CXX=
+postdep_objects_CXX=
+predeps_CXX=
+postdeps_CXX=
+compiler_lib_search_path_CXX=
+
+cat > conftest.$ac_ext <<_LT_EOF
+class Foo
+{
+public:
+  Foo (void) { a = 0; }
+private:
+  int a;
+};
+_LT_EOF
+
+
+_lt_libdeps_save_CFLAGS=$CFLAGS
+case "$CC $CFLAGS " in #(
+*\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;;
+*\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;;
+*\ -fuse-linker-plugin*\ *) CFLAGS="$CFLAGS -fno-use-linker-plugin" ;;
+esac
+
+if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+  # Parse the compiler output and extract the necessary
+  # objects, libraries and library flags.
+
+  # Sentinel used to keep track of whether or not we are before
+  # the conftest object file.
+  pre_test_object_deps_done=no
+
+  for p in `eval "$output_verbose_link_cmd"`; do
+    case ${prev}${p} in
+
+    -L* | -R* | -l*)
+       # Some compilers place space between "-{L,R}" and the path.
+       # Remove the space.
+       if test $p = "-L" ||
+          test $p = "-R"; then
+	 prev=$p
+	 continue
+       fi
+
+       # Expand the sysroot to ease extracting the directories later.
+       if test -z "$prev"; then
+         case $p in
+         -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;;
+         -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;;
+         -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;;
+         esac
+       fi
+       case $p in
+       =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;;
+       esac
+       if test "$pre_test_object_deps_done" = no; then
+	 case ${prev} in
+	 -L | -R)
+	   # Internal compiler library paths should come after those
+	   # provided the user.  The postdeps already come after the
+	   # user supplied libs so there is no need to process them.
+	   if test -z "$compiler_lib_search_path_CXX"; then
+	     compiler_lib_search_path_CXX="${prev}${p}"
+	   else
+	     compiler_lib_search_path_CXX="${compiler_lib_search_path_CXX} ${prev}${p}"
+	   fi
+	   ;;
+	 # The "-l" case would never come before the object being
+	 # linked, so don't bother handling this case.
+	 esac
+       else
+	 if test -z "$postdeps_CXX"; then
+	   postdeps_CXX="${prev}${p}"
+	 else
+	   postdeps_CXX="${postdeps_CXX} ${prev}${p}"
+	 fi
+       fi
+       prev=
+       ;;
+
+    *.lto.$objext) ;; # Ignore GCC LTO objects
+    *.$objext)
+       # This assumes that the test object file only shows up
+       # once in the compiler output.
+       if test "$p" = "conftest.$objext"; then
+	 pre_test_object_deps_done=yes
+	 continue
+       fi
+
+       if test "$pre_test_object_deps_done" = no; then
+	 if test -z "$predep_objects_CXX"; then
+	   predep_objects_CXX="$p"
+	 else
+	   predep_objects_CXX="$predep_objects_CXX $p"
+	 fi
+       else
+	 if test -z "$postdep_objects_CXX"; then
+	   postdep_objects_CXX="$p"
+	 else
+	   postdep_objects_CXX="$postdep_objects_CXX $p"
+	 fi
+       fi
+       ;;
+
+    *) ;; # Ignore the rest.
+
+    esac
+  done
+
+  # Clean up.
+  rm -f a.out a.exe
+else
+  echo "libtool.m4: error: problem compiling CXX test program"
+fi
+
+$RM -f confest.$objext
+CFLAGS=$_lt_libdeps_save_CFLAGS
+
+# PORTME: override above test on systems where it is broken
+case $host_os in
+interix[3-9]*)
+  # Interix 3.5 installs completely hosed .la files for C++, so rather than
+  # hack all around it, let's just trust "g++" to DTRT.
+  predep_objects_CXX=
+  postdep_objects_CXX=
+  postdeps_CXX=
+  ;;
+
+linux*)
+  case `$CC -V 2>&1 | sed 5q` in
+  *Sun\ C*)
+    # Sun C++ 5.9
+
+    # The more standards-conforming stlport4 library is
+    # incompatible with the Cstd library. Avoid specifying
+    # it if it's in CXXFLAGS. Ignore libCrun as
+    # -library=stlport4 depends on it.
+    case " $CXX $CXXFLAGS " in
+    *" -library=stlport4 "*)
+      solaris_use_stlport4=yes
+      ;;
+    esac
+
+    if test "$solaris_use_stlport4" != yes; then
+      postdeps_CXX='-library=Cstd -library=Crun'
+    fi
+    ;;
+  esac
+  ;;
+
+solaris*)
+  case $cc_basename in
+  CC* | sunCC*)
+    # The more standards-conforming stlport4 library is
+    # incompatible with the Cstd library. Avoid specifying
+    # it if it's in CXXFLAGS. Ignore libCrun as
+    # -library=stlport4 depends on it.
+    case " $CXX $CXXFLAGS " in
+    *" -library=stlport4 "*)
+      solaris_use_stlport4=yes
+      ;;
+    esac
+
+    # Adding this requires a known-good setup of shared libraries for
+    # Sun compiler versions before 5.6, else PIC objects from an old
+    # archive will be linked into the output, leading to subtle bugs.
+    if test "$solaris_use_stlport4" != yes; then
+      postdeps_CXX='-library=Cstd -library=Crun'
+    fi
+    ;;
+  esac
+  ;;
+esac
+
+
+case " $postdeps_CXX " in
+*" -lc "*) archive_cmds_need_lc_CXX=no ;;
+esac
+ compiler_lib_search_dirs_CXX=
+if test -n "${compiler_lib_search_path_CXX}"; then
+ compiler_lib_search_dirs_CXX=`echo " ${compiler_lib_search_path_CXX}" | ${SED} -e 's! -L! !g' -e 's!^ !!'`
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+    lt_prog_compiler_wl_CXX=
+lt_prog_compiler_pic_CXX=
+lt_prog_compiler_static_CXX=
+
+
+  # C++ specific cases for pic, static, wl, etc.
+  if test "$GXX" = yes; then
+    lt_prog_compiler_wl_CXX='-Wl,'
+    lt_prog_compiler_static_CXX='-static'
+
+    case $host_os in
+    aix*)
+      # All AIX code is PIC.
+      if test "$host_cpu" = ia64; then
+	# AIX 5 now supports IA64 processor
+	lt_prog_compiler_static_CXX='-Bstatic'
+      fi
+      ;;
+
+    amigaos*)
+      case $host_cpu in
+      powerpc)
+            # see comment about AmigaOS4 .so support
+            lt_prog_compiler_pic_CXX='-fPIC'
+        ;;
+      m68k)
+            # FIXME: we need at least 68020 code to build shared libraries, but
+            # adding the `-m68020' flag to GCC prevents building anything better,
+            # like `-m68040'.
+            lt_prog_compiler_pic_CXX='-m68020 -resident32 -malways-restore-a4'
+        ;;
+      esac
+      ;;
+
+    beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
+      # PIC is the default for these OSes.
+      ;;
+    mingw* | cygwin* | os2* | pw32* | cegcc*)
+      # This hack is so that the source file can tell whether it is being
+      # built for inclusion in a dll (and should export symbols for example).
+      # Although the cygwin gcc ignores -fPIC, still need this for old-style
+      # (--disable-auto-import) libraries
+      lt_prog_compiler_pic_CXX='-DDLL_EXPORT'
+      ;;
+    darwin* | rhapsody*)
+      # PIC is the default on this platform
+      # Common symbols not allowed in MH_DYLIB files
+      lt_prog_compiler_pic_CXX='-fno-common'
+      ;;
+    *djgpp*)
+      # DJGPP does not support shared libraries at all
+      lt_prog_compiler_pic_CXX=
+      ;;
+    haiku*)
+      # PIC is the default for Haiku.
+      # The "-static" flag exists, but is broken.
+      lt_prog_compiler_static_CXX=
+      ;;
+    interix[3-9]*)
+      # Interix 3.x gcc -fpic/-fPIC options generate broken code.
+      # Instead, we relocate shared libraries at runtime.
+      ;;
+    sysv4*MP*)
+      if test -d /usr/nec; then
+	lt_prog_compiler_pic_CXX=-Kconform_pic
+      fi
+      ;;
+    hpux*)
+      # PIC is the default for 64-bit PA HP-UX, but not for 32-bit
+      # PA HP-UX.  On IA64 HP-UX, PIC is the default but the pic flag
+      # sets the default TLS model and affects inlining.
+      case $host_cpu in
+      hppa*64*)
+	;;
+      *)
+	lt_prog_compiler_pic_CXX='-fPIC'
+	;;
+      esac
+      ;;
+    *qnx* | *nto*)
+      # QNX uses GNU C++, but need to define -shared option too, otherwise
+      # it will coredump.
+      lt_prog_compiler_pic_CXX='-fPIC -shared'
+      ;;
+    *)
+      lt_prog_compiler_pic_CXX='-fPIC'
+      ;;
+    esac
+  else
+    case $host_os in
+      aix[4-9]*)
+	# All AIX code is PIC.
+	if test "$host_cpu" = ia64; then
+	  # AIX 5 now supports IA64 processor
+	  lt_prog_compiler_static_CXX='-Bstatic'
+	else
+	  lt_prog_compiler_static_CXX='-bnso -bI:/lib/syscalls.exp'
+	fi
+	;;
+      chorus*)
+	case $cc_basename in
+	cxch68*)
+	  # Green Hills C++ Compiler
+	  # _LT_TAGVAR(lt_prog_compiler_static, CXX)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a"
+	  ;;
+	esac
+	;;
+      mingw* | cygwin* | os2* | pw32* | cegcc*)
+	# This hack is so that the source file can tell whether it is being
+	# built for inclusion in a dll (and should export symbols for example).
+	lt_prog_compiler_pic_CXX='-DDLL_EXPORT'
+	;;
+      dgux*)
+	case $cc_basename in
+	  ec++*)
+	    lt_prog_compiler_pic_CXX='-KPIC'
+	    ;;
+	  ghcx*)
+	    # Green Hills C++ Compiler
+	    lt_prog_compiler_pic_CXX='-pic'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      freebsd* | dragonfly*)
+	# FreeBSD uses GNU C++
+	;;
+      hpux9* | hpux10* | hpux11*)
+	case $cc_basename in
+	  CC*)
+	    lt_prog_compiler_wl_CXX='-Wl,'
+	    lt_prog_compiler_static_CXX='${wl}-a ${wl}archive'
+	    if test "$host_cpu" != ia64; then
+	      lt_prog_compiler_pic_CXX='+Z'
+	    fi
+	    ;;
+	  aCC*)
+	    lt_prog_compiler_wl_CXX='-Wl,'
+	    lt_prog_compiler_static_CXX='${wl}-a ${wl}archive'
+	    case $host_cpu in
+	    hppa*64*|ia64*)
+	      # +Z the default
+	      ;;
+	    *)
+	      lt_prog_compiler_pic_CXX='+Z'
+	      ;;
+	    esac
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      interix*)
+	# This is c89, which is MS Visual C++ (no shared libs)
+	# Anyone wants to do a port?
+	;;
+      irix5* | irix6* | nonstopux*)
+	case $cc_basename in
+	  CC*)
+	    lt_prog_compiler_wl_CXX='-Wl,'
+	    lt_prog_compiler_static_CXX='-non_shared'
+	    # CC pic flag -KPIC is the default.
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      linux* | k*bsd*-gnu | kopensolaris*-gnu)
+	case $cc_basename in
+	  KCC*)
+	    # KAI C++ Compiler
+	    lt_prog_compiler_wl_CXX='--backend -Wl,'
+	    lt_prog_compiler_pic_CXX='-fPIC'
+	    ;;
+	  ecpc* )
+	    # old Intel C++ for x86_64 which still supported -KPIC.
+	    lt_prog_compiler_wl_CXX='-Wl,'
+	    lt_prog_compiler_pic_CXX='-KPIC'
+	    lt_prog_compiler_static_CXX='-static'
+	    ;;
+	  icpc* )
+	    # Intel C++, used to be incompatible with GCC.
+	    # ICC 10 doesn't accept -KPIC any more.
+	    lt_prog_compiler_wl_CXX='-Wl,'
+	    lt_prog_compiler_pic_CXX='-fPIC'
+	    lt_prog_compiler_static_CXX='-static'
+	    ;;
+	  pgCC* | pgcpp*)
+	    # Portland Group C++ compiler
+	    lt_prog_compiler_wl_CXX='-Wl,'
+	    lt_prog_compiler_pic_CXX='-fpic'
+	    lt_prog_compiler_static_CXX='-Bstatic'
+	    ;;
+	  cxx*)
+	    # Compaq C++
+	    # Make sure the PIC flag is empty.  It appears that all Alpha
+	    # Linux and Compaq Tru64 Unix objects are PIC.
+	    lt_prog_compiler_pic_CXX=
+	    lt_prog_compiler_static_CXX='-non_shared'
+	    ;;
+	  xlc* | xlC* | bgxl[cC]* | mpixl[cC]*)
+	    # IBM XL 8.0, 9.0 on PPC and BlueGene
+	    lt_prog_compiler_wl_CXX='-Wl,'
+	    lt_prog_compiler_pic_CXX='-qpic'
+	    lt_prog_compiler_static_CXX='-qstaticlink'
+	    ;;
+	  *)
+	    case `$CC -V 2>&1 | sed 5q` in
+	    *Sun\ C*)
+	      # Sun C++ 5.9
+	      lt_prog_compiler_pic_CXX='-KPIC'
+	      lt_prog_compiler_static_CXX='-Bstatic'
+	      lt_prog_compiler_wl_CXX='-Qoption ld '
+	      ;;
+	    esac
+	    ;;
+	esac
+	;;
+      lynxos*)
+	;;
+      m88k*)
+	;;
+      mvs*)
+	case $cc_basename in
+	  cxx*)
+	    lt_prog_compiler_pic_CXX='-W c,exportall'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      netbsd* | netbsdelf*-gnu)
+	;;
+      *qnx* | *nto*)
+        # QNX uses GNU C++, but need to define -shared option too, otherwise
+        # it will coredump.
+        lt_prog_compiler_pic_CXX='-fPIC -shared'
+        ;;
+      osf3* | osf4* | osf5*)
+	case $cc_basename in
+	  KCC*)
+	    lt_prog_compiler_wl_CXX='--backend -Wl,'
+	    ;;
+	  RCC*)
+	    # Rational C++ 2.4.1
+	    lt_prog_compiler_pic_CXX='-pic'
+	    ;;
+	  cxx*)
+	    # Digital/Compaq C++
+	    lt_prog_compiler_wl_CXX='-Wl,'
+	    # Make sure the PIC flag is empty.  It appears that all Alpha
+	    # Linux and Compaq Tru64 Unix objects are PIC.
+	    lt_prog_compiler_pic_CXX=
+	    lt_prog_compiler_static_CXX='-non_shared'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      psos*)
+	;;
+      solaris*)
+	case $cc_basename in
+	  CC* | sunCC*)
+	    # Sun C++ 4.2, 5.x and Centerline C++
+	    lt_prog_compiler_pic_CXX='-KPIC'
+	    lt_prog_compiler_static_CXX='-Bstatic'
+	    lt_prog_compiler_wl_CXX='-Qoption ld '
+	    ;;
+	  gcx*)
+	    # Green Hills C++ Compiler
+	    lt_prog_compiler_pic_CXX='-PIC'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      sunos4*)
+	case $cc_basename in
+	  CC*)
+	    # Sun C++ 4.x
+	    lt_prog_compiler_pic_CXX='-pic'
+	    lt_prog_compiler_static_CXX='-Bstatic'
+	    ;;
+	  lcc*)
+	    # Lucid
+	    lt_prog_compiler_pic_CXX='-pic'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
+	case $cc_basename in
+	  CC*)
+	    lt_prog_compiler_wl_CXX='-Wl,'
+	    lt_prog_compiler_pic_CXX='-KPIC'
+	    lt_prog_compiler_static_CXX='-Bstatic'
+	    ;;
+	esac
+	;;
+      tandem*)
+	case $cc_basename in
+	  NCC*)
+	    # NonStop-UX NCC 3.20
+	    lt_prog_compiler_pic_CXX='-KPIC'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      vxworks*)
+	;;
+      *)
+	lt_prog_compiler_can_build_shared_CXX=no
+	;;
+    esac
+  fi
+
+case $host_os in
+  # For platforms which do not support PIC, -DPIC is meaningless:
+  *djgpp*)
+    lt_prog_compiler_pic_CXX=
+    ;;
+  *)
+    lt_prog_compiler_pic_CXX="$lt_prog_compiler_pic_CXX -DPIC"
+    ;;
+esac
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC" >&5
+$as_echo_n "checking for $compiler option to produce PIC... " >&6; }
+if ${lt_cv_prog_compiler_pic_CXX+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_prog_compiler_pic_CXX=$lt_prog_compiler_pic_CXX
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_CXX" >&5
+$as_echo "$lt_cv_prog_compiler_pic_CXX" >&6; }
+lt_prog_compiler_pic_CXX=$lt_cv_prog_compiler_pic_CXX
+
+#
+# Check to make sure the PIC flag actually works.
+#
+if test -n "$lt_prog_compiler_pic_CXX"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works" >&5
+$as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works... " >&6; }
+if ${lt_cv_prog_compiler_pic_works_CXX+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_prog_compiler_pic_works_CXX=no
+   ac_outfile=conftest.$ac_objext
+   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+   lt_compiler_flag="$lt_prog_compiler_pic_CXX -DPIC"
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   # The option is referenced via a variable to avoid confusing sed.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
+   (eval "$lt_compile" 2>conftest.err)
+   ac_status=$?
+   cat conftest.err >&5
+   echo "$as_me:$LINENO: \$? = $ac_status" >&5
+   if (exit $ac_status) && test -s "$ac_outfile"; then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings other than the usual output.
+     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp
+     $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+     if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
+       lt_cv_prog_compiler_pic_works_CXX=yes
+     fi
+   fi
+   $RM conftest*
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works_CXX" >&5
+$as_echo "$lt_cv_prog_compiler_pic_works_CXX" >&6; }
+
+if test x"$lt_cv_prog_compiler_pic_works_CXX" = xyes; then
+    case $lt_prog_compiler_pic_CXX in
+     "" | " "*) ;;
+     *) lt_prog_compiler_pic_CXX=" $lt_prog_compiler_pic_CXX" ;;
+     esac
+else
+    lt_prog_compiler_pic_CXX=
+     lt_prog_compiler_can_build_shared_CXX=no
+fi
+
+fi
+
+
+
+
+
+#
+# Check to make sure the static flag actually works.
+#
+wl=$lt_prog_compiler_wl_CXX eval lt_tmp_static_flag=\"$lt_prog_compiler_static_CXX\"
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works" >&5
+$as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; }
+if ${lt_cv_prog_compiler_static_works_CXX+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_prog_compiler_static_works_CXX=no
+   save_LDFLAGS="$LDFLAGS"
+   LDFLAGS="$LDFLAGS $lt_tmp_static_flag"
+   echo "$lt_simple_link_test_code" > conftest.$ac_ext
+   if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
+     # The linker can only warn and ignore the option if not recognized
+     # So say no if there are warnings
+     if test -s conftest.err; then
+       # Append any errors to the config.log.
+       cat conftest.err 1>&5
+       $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp
+       $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+       if diff conftest.exp conftest.er2 >/dev/null; then
+         lt_cv_prog_compiler_static_works_CXX=yes
+       fi
+     else
+       lt_cv_prog_compiler_static_works_CXX=yes
+     fi
+   fi
+   $RM -r conftest*
+   LDFLAGS="$save_LDFLAGS"
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works_CXX" >&5
+$as_echo "$lt_cv_prog_compiler_static_works_CXX" >&6; }
+
+if test x"$lt_cv_prog_compiler_static_works_CXX" = xyes; then
+    :
+else
+    lt_prog_compiler_static_CXX=
+fi
+
+
+
+
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5
+$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; }
+if ${lt_cv_prog_compiler_c_o_CXX+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_prog_compiler_c_o_CXX=no
+   $RM -r conftest 2>/dev/null
+   mkdir conftest
+   cd conftest
+   mkdir out
+   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+   lt_compiler_flag="-o out/conftest2.$ac_objext"
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
+   (eval "$lt_compile" 2>out/conftest.err)
+   ac_status=$?
+   cat out/conftest.err >&5
+   echo "$as_me:$LINENO: \$? = $ac_status" >&5
+   if (exit $ac_status) && test -s out/conftest2.$ac_objext
+   then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings
+     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp
+     $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
+     if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
+       lt_cv_prog_compiler_c_o_CXX=yes
+     fi
+   fi
+   chmod u+w . 2>&5
+   $RM conftest*
+   # SGI C++ compiler will create directory out/ii_files/ for
+   # template instantiation
+   test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files
+   $RM out/* && rmdir out
+   cd ..
+   $RM -r conftest
+   $RM conftest*
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5
+$as_echo "$lt_cv_prog_compiler_c_o_CXX" >&6; }
+
+
+
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext" >&5
+$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; }
+if ${lt_cv_prog_compiler_c_o_CXX+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_prog_compiler_c_o_CXX=no
+   $RM -r conftest 2>/dev/null
+   mkdir conftest
+   cd conftest
+   mkdir out
+   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+   lt_compiler_flag="-o out/conftest2.$ac_objext"
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&5)
+   (eval "$lt_compile" 2>out/conftest.err)
+   ac_status=$?
+   cat out/conftest.err >&5
+   echo "$as_me:$LINENO: \$? = $ac_status" >&5
+   if (exit $ac_status) && test -s out/conftest2.$ac_objext
+   then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings
+     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp
+     $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
+     if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
+       lt_cv_prog_compiler_c_o_CXX=yes
+     fi
+   fi
+   chmod u+w . 2>&5
+   $RM conftest*
+   # SGI C++ compiler will create directory out/ii_files/ for
+   # template instantiation
+   test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files
+   $RM out/* && rmdir out
+   cd ..
+   $RM -r conftest
+   $RM conftest*
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o_CXX" >&5
+$as_echo "$lt_cv_prog_compiler_c_o_CXX" >&6; }
+
+
+
+
+hard_links="nottested"
+if test "$lt_cv_prog_compiler_c_o_CXX" = no && test "$need_locks" != no; then
+  # do not overwrite the value of need_locks provided by the user
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links" >&5
+$as_echo_n "checking if we can lock with hard links... " >&6; }
+  hard_links=yes
+  $RM conftest*
+  ln conftest.a conftest.b 2>/dev/null && hard_links=no
+  touch conftest.a
+  ln conftest.a conftest.b 2>&5 || hard_links=no
+  ln conftest.a conftest.b 2>/dev/null && hard_links=no
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $hard_links" >&5
+$as_echo "$hard_links" >&6; }
+  if test "$hard_links" = no; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5
+$as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;}
+    need_locks=warn
+  fi
+else
+  need_locks=no
+fi
+
+
+
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries" >&5
+$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; }
+
+  export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+  exclude_expsyms_CXX='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'
+  case $host_os in
+  aix[4-9]*)
+    # If we're using GNU nm, then we don't want the "-C" option.
+    # -C means demangle to AIX nm, but means don't demangle with GNU nm
+    # Also, AIX nm treats weak defined symbols like other global defined
+    # symbols, whereas GNU nm marks them as "W".
+    if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then
+      export_symbols_cmds_CXX='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
+    else
+      export_symbols_cmds_CXX='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && (substr(\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
+    fi
+    ;;
+  pw32*)
+    export_symbols_cmds_CXX="$ltdll_cmds"
+    ;;
+  cygwin* | mingw* | cegcc*)
+    case $cc_basename in
+    cl*)
+      exclude_expsyms_CXX='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*'
+      ;;
+    *)
+      export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\'' | sort | uniq > $export_symbols'
+      exclude_expsyms_CXX='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'
+      ;;
+    esac
+    ;;
+  linux* | k*bsd*-gnu | gnu*)
+    link_all_deplibs_CXX=no
+    ;;
+  *)
+    export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+    ;;
+  esac
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ld_shlibs_CXX" >&5
+$as_echo "$ld_shlibs_CXX" >&6; }
+test "$ld_shlibs_CXX" = no && can_build_shared=no
+
+with_gnu_ld_CXX=$with_gnu_ld
+
+
+
+
+
+
+#
+# Do we need to explicitly link libc?
+#
+case "x$archive_cmds_need_lc_CXX" in
+x|xyes)
+  # Assume -lc should be added
+  archive_cmds_need_lc_CXX=yes
+
+  if test "$enable_shared" = yes && test "$GCC" = yes; then
+    case $archive_cmds_CXX in
+    *'~'*)
+      # FIXME: we may have to deal with multi-command sequences.
+      ;;
+    '$CC '*)
+      # Test whether the compiler implicitly links with -lc since on some
+      # systems, -lgcc has to come before -lc. If gcc already passes -lc
+      # to ld, don't add -lc before -lgcc.
+      { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in" >&5
+$as_echo_n "checking whether -lc should be explicitly linked in... " >&6; }
+if ${lt_cv_archive_cmds_need_lc_CXX+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  $RM conftest*
+	echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+	if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
+  (eval $ac_compile) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; } 2>conftest.err; then
+	  soname=conftest
+	  lib=conftest
+	  libobjs=conftest.$ac_objext
+	  deplibs=
+	  wl=$lt_prog_compiler_wl_CXX
+	  pic_flag=$lt_prog_compiler_pic_CXX
+	  compiler_flags=-v
+	  linker_flags=-v
+	  verstring=
+	  output_objdir=.
+	  libname=conftest
+	  lt_save_allow_undefined_flag=$allow_undefined_flag_CXX
+	  allow_undefined_flag_CXX=
+	  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1\""; } >&5
+  (eval $archive_cmds_CXX 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1) 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }
+	  then
+	    lt_cv_archive_cmds_need_lc_CXX=no
+	  else
+	    lt_cv_archive_cmds_need_lc_CXX=yes
+	  fi
+	  allow_undefined_flag_CXX=$lt_save_allow_undefined_flag
+	else
+	  cat conftest.err 1>&5
+	fi
+	$RM conftest*
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc_CXX" >&5
+$as_echo "$lt_cv_archive_cmds_need_lc_CXX" >&6; }
+      archive_cmds_need_lc_CXX=$lt_cv_archive_cmds_need_lc_CXX
+      ;;
+    esac
+  fi
+  ;;
+esac
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics" >&5
+$as_echo_n "checking dynamic linker characteristics... " >&6; }
+
+library_names_spec=
+libname_spec='lib$name'
+soname_spec=
+shrext_cmds=".so"
+postinstall_cmds=
+postuninstall_cmds=
+finish_cmds=
+finish_eval=
+shlibpath_var=
+shlibpath_overrides_runpath=unknown
+version_type=none
+dynamic_linker="$host_os ld.so"
+sys_lib_dlsearch_path_spec="/lib /usr/lib"
+need_lib_prefix=unknown
+hardcode_into_libs=no
+
+# when you set need_version to no, make sure it does not cause -set_version
+# flags to be left without arguments
+need_version=unknown
+
+case $host_os in
+aix3*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a'
+  shlibpath_var=LIBPATH
+
+  # AIX 3 has no versioning support, so we append a major version to the name.
+  soname_spec='${libname}${release}${shared_ext}$major'
+  ;;
+
+aix[4-9]*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  hardcode_into_libs=yes
+  if test "$host_cpu" = ia64; then
+    # AIX 5 supports IA64
+    library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}'
+    shlibpath_var=LD_LIBRARY_PATH
+  else
+    # With GCC up to 2.95.x, collect2 would create an import file
+    # for dependence libraries.  The import file would start with
+    # the line `#! .'.  This would cause the generated library to
+    # depend on `.', always an invalid library.  This was fixed in
+    # development snapshots of GCC prior to 3.0.
+    case $host_os in
+      aix4 | aix4.[01] | aix4.[01].*)
+      if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'
+	   echo ' yes '
+	   echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then
+	:
+      else
+	can_build_shared=no
+      fi
+      ;;
+    esac
+    # AIX (on Power*) has no versioning support, so currently we can not hardcode correct
+    # soname into executable. Probably we can add versioning support to
+    # collect2, so additional links can be useful in future.
+    if test "$aix_use_runtimelinking" = yes; then
+      # If using run time linking (on AIX 4.2 or later) use lib<name>.so
+      # instead of lib<name>.a to let people know that these are not
+      # typical AIX shared libraries.
+      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    else
+      # We preserve .a as extension for shared libraries through AIX4.2
+      # and later when we are not doing run time linking.
+      library_names_spec='${libname}${release}.a $libname.a'
+      soname_spec='${libname}${release}${shared_ext}$major'
+    fi
+    shlibpath_var=LIBPATH
+  fi
+  ;;
+
+amigaos*)
+  case $host_cpu in
+  powerpc)
+    # Since July 2007 AmigaOS4 officially supports .so libraries.
+    # When compiling the executable, add -use-dynld -Lsobjs: to the compileline.
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    ;;
+  m68k)
+    library_names_spec='$libname.ixlibrary $libname.a'
+    # Create ${libname}_ixlibrary.a entries in /sys/libs.
+    finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
+    ;;
+  esac
+  ;;
+
+beos*)
+  library_names_spec='${libname}${shared_ext}'
+  dynamic_linker="$host_os ld.so"
+  shlibpath_var=LIBRARY_PATH
+  ;;
+
+bsdi[45]*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib"
+  sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib"
+  # the default ld.so.conf also contains /usr/contrib/lib and
+  # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow
+  # libtool to hard-code these into programs
+  ;;
+
+cygwin* | mingw* | pw32* | cegcc*)
+  version_type=windows
+  shrext_cmds=".dll"
+  need_version=no
+  need_lib_prefix=no
+
+  case $GCC,$cc_basename in
+  yes,*)
+    # gcc
+    library_names_spec='$libname.dll.a'
+    # DLL is installed to $(libdir)/../bin by postinstall_cmds
+    postinstall_cmds='base_file=`basename \${file}`~
+      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~
+      dldir=$destdir/`dirname \$dlpath`~
+      test -d \$dldir || mkdir -p \$dldir~
+      $install_prog $dir/$dlname \$dldir/$dlname~
+      chmod a+x \$dldir/$dlname~
+      if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then
+        eval '\''$striplib \$dldir/$dlname'\'' || exit \$?;
+      fi'
+    postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
+      dlpath=$dir/\$dldll~
+       $RM \$dlpath'
+    shlibpath_overrides_runpath=yes
+
+    case $host_os in
+    cygwin*)
+      # Cygwin DLLs use 'cyg' prefix rather than 'lib'
+      soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+
+      ;;
+    mingw* | cegcc*)
+      # MinGW DLLs use traditional 'lib' prefix
+      soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+      ;;
+    pw32*)
+      # pw32 DLLs use 'pw' prefix rather than 'lib'
+      library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+      ;;
+    esac
+    dynamic_linker='Win32 ld.exe'
+    ;;
+
+  *,cl*)
+    # Native MSVC
+    libname_spec='$name'
+    soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'
+    library_names_spec='${libname}.dll.lib'
+
+    case $build_os in
+    mingw*)
+      sys_lib_search_path_spec=
+      lt_save_ifs=$IFS
+      IFS=';'
+      for lt_path in $LIB
+      do
+        IFS=$lt_save_ifs
+        # Let DOS variable expansion print the short 8.3 style file name.
+        lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"`
+        sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path"
+      done
+      IFS=$lt_save_ifs
+      # Convert to MSYS style.
+      sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([a-zA-Z]\\):| /\\1|g' -e 's|^ ||'`
+      ;;
+    cygwin*)
+      # Convert to unix form, then to dos form, then back to unix form
+      # but this time dos style (no spaces!) so that the unix form looks
+      # like /cygdrive/c/PROGRA~1:/cygdr...
+      sys_lib_search_path_spec=`cygpath --path --unix "$LIB"`
+      sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null`
+      sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
+      ;;
+    *)
+      sys_lib_search_path_spec="$LIB"
+      if $ECHO "$sys_lib_search_path_spec" | $GREP ';[c-zC-Z]:/' >/dev/null; then
+        # It is most probably a Windows format PATH.
+        sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
+      else
+        sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
+      fi
+      # FIXME: find the short name or the path components, as spaces are
+      # common. (e.g. "Program Files" -> "PROGRA~1")
+      ;;
+    esac
+
+    # DLL is installed to $(libdir)/../bin by postinstall_cmds
+    postinstall_cmds='base_file=`basename \${file}`~
+      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~
+      dldir=$destdir/`dirname \$dlpath`~
+      test -d \$dldir || mkdir -p \$dldir~
+      $install_prog $dir/$dlname \$dldir/$dlname'
+    postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
+      dlpath=$dir/\$dldll~
+       $RM \$dlpath'
+    shlibpath_overrides_runpath=yes
+    dynamic_linker='Win32 link.exe'
+    ;;
+
+  *)
+    # Assume MSVC wrapper
+    library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib'
+    dynamic_linker='Win32 ld.exe'
+    ;;
+  esac
+  # FIXME: first we should search . and the directory the executable is in
+  shlibpath_var=PATH
+  ;;
+
+darwin* | rhapsody*)
+  dynamic_linker="$host_os dyld"
+  version_type=darwin
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext'
+  soname_spec='${libname}${release}${major}$shared_ext'
+  shlibpath_overrides_runpath=yes
+  shlibpath_var=DYLD_LIBRARY_PATH
+  shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`'
+
+  sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib'
+  ;;
+
+dgux*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  ;;
+
+freebsd* | dragonfly*)
+  # DragonFly does not have aout.  When/if they implement a new
+  # versioning mechanism, adjust this.
+  if test -x /usr/bin/objformat; then
+    objformat=`/usr/bin/objformat`
+  else
+    case $host_os in
+    freebsd[23].*) objformat=aout ;;
+    *) objformat=elf ;;
+    esac
+  fi
+  version_type=freebsd-$objformat
+  case $version_type in
+    freebsd-elf*)
+      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
+      need_version=no
+      need_lib_prefix=no
+      ;;
+    freebsd-*)
+      library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix'
+      need_version=yes
+      ;;
+  esac
+  shlibpath_var=LD_LIBRARY_PATH
+  case $host_os in
+  freebsd2.*)
+    shlibpath_overrides_runpath=yes
+    ;;
+  freebsd3.[01]* | freebsdelf3.[01]*)
+    shlibpath_overrides_runpath=yes
+    hardcode_into_libs=yes
+    ;;
+  freebsd3.[2-9]* | freebsdelf3.[2-9]* | \
+  freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1)
+    shlibpath_overrides_runpath=no
+    hardcode_into_libs=yes
+    ;;
+  *) # from 4.6 on, and DragonFly
+    shlibpath_overrides_runpath=yes
+    hardcode_into_libs=yes
+    ;;
+  esac
+  ;;
+
+gnu*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  ;;
+
+haiku*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  dynamic_linker="$host_os runtime_loader"
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib'
+  hardcode_into_libs=yes
+  ;;
+
+hpux9* | hpux10* | hpux11*)
+  # Give a soname corresponding to the major version so that dld.sl refuses to
+  # link against other versions.
+  version_type=sunos
+  need_lib_prefix=no
+  need_version=no
+  case $host_cpu in
+  ia64*)
+    shrext_cmds='.so'
+    hardcode_into_libs=yes
+    dynamic_linker="$host_os dld.so"
+    shlibpath_var=LD_LIBRARY_PATH
+    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    if test "X$HPUX_IA64_MODE" = X32; then
+      sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib"
+    else
+      sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64"
+    fi
+    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+    ;;
+  hppa*64*)
+    shrext_cmds='.sl'
+    hardcode_into_libs=yes
+    dynamic_linker="$host_os dld.sl"
+    shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH
+    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64"
+    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+    ;;
+  *)
+    shrext_cmds='.sl'
+    dynamic_linker="$host_os dld.sl"
+    shlibpath_var=SHLIB_PATH
+    shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    ;;
+  esac
+  # HP-UX runs *really* slowly unless shared libraries are mode 555, ...
+  postinstall_cmds='chmod 555 $lib'
+  # or fails outright, so override atomically:
+  install_override_mode=555
+  ;;
+
+interix[3-9]*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  ;;
+
+irix5* | irix6* | nonstopux*)
+  case $host_os in
+    nonstopux*) version_type=nonstopux ;;
+    *)
+	if test "$lt_cv_prog_gnu_ld" = yes; then
+		version_type=linux # correct to gnu/linux during the next big refactor
+	else
+		version_type=irix
+	fi ;;
+  esac
+  need_lib_prefix=no
+  need_version=no
+  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}'
+  case $host_os in
+  irix5* | nonstopux*)
+    libsuff= shlibsuff=
+    ;;
+  *)
+    case $LD in # libtool.m4 will add one of these switches to LD
+    *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ")
+      libsuff= shlibsuff= libmagic=32-bit;;
+    *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ")
+      libsuff=32 shlibsuff=N32 libmagic=N32;;
+    *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ")
+      libsuff=64 shlibsuff=64 libmagic=64-bit;;
+    *) libsuff= shlibsuff= libmagic=never-match;;
+    esac
+    ;;
+  esac
+  shlibpath_var=LD_LIBRARY${shlibsuff}_PATH
+  shlibpath_overrides_runpath=no
+  sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}"
+  sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}"
+  hardcode_into_libs=yes
+  ;;
+
+# No shared lib support for Linux oldld, aout, or coff.
+linux*oldld* | linux*aout* | linux*coff*)
+  dynamic_linker=no
+  ;;
+
+# This must be glibc/ELF.
+linux* | k*bsd*-gnu | kopensolaris*-gnu)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+
+  # Some binutils ld are patched to set DT_RUNPATH
+  if ${lt_cv_shlibpath_overrides_runpath+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  lt_cv_shlibpath_overrides_runpath=no
+    save_LDFLAGS=$LDFLAGS
+    save_libdir=$libdir
+    eval "libdir=/foo; wl=\"$lt_prog_compiler_wl_CXX\"; \
+	 LDFLAGS=\"\$LDFLAGS $hardcode_libdir_flag_spec_CXX\""
+    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_link "$LINENO"; then :
+  if  ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null; then :
+  lt_cv_shlibpath_overrides_runpath=yes
+fi
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+    LDFLAGS=$save_LDFLAGS
+    libdir=$save_libdir
+
+fi
+
+  shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath
+
+  # This implies no fast_install, which is unacceptable.
+  # Some rework will be needed to allow for fast_install
+  # before this can be enabled.
+  hardcode_into_libs=yes
+
+  # Append ld.so.conf contents to the search path
+  if test -f /etc/ld.so.conf; then
+    lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[	 ]*hwcap[	 ]/d;s/[:,	]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '`
+    sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra"
+  fi
+
+  # We used to test for /lib/ld.so.1 and disable shared libraries on
+  # powerpc, because MkLinux only supported shared libraries with the
+  # GNU dynamic linker.  Since this was broken with cross compilers,
+  # most powerpc-linux boxes support dynamic linking these days and
+  # people can always --disable-shared, the test was removed, and we
+  # assume the GNU/Linux dynamic linker is in use.
+  dynamic_linker='GNU/Linux ld.so'
+  ;;
+
+netbsdelf*-gnu)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  dynamic_linker='NetBSD ld.elf_so'
+  ;;
+
+netbsd*)
+  version_type=sunos
+  need_lib_prefix=no
+  need_version=no
+  if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+    finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+    dynamic_linker='NetBSD (a.out) ld.so'
+  else
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    dynamic_linker='NetBSD ld.elf_so'
+  fi
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  ;;
+
+newsos6)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  ;;
+
+*nto* | *qnx*)
+  version_type=qnx
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  dynamic_linker='ldqnx.so'
+  ;;
+
+openbsd*)
+  version_type=sunos
+  sys_lib_dlsearch_path_spec="/usr/lib"
+  need_lib_prefix=no
+  # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs.
+  case $host_os in
+    openbsd3.3 | openbsd3.3.*)	need_version=yes ;;
+    *)				need_version=no  ;;
+  esac
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+    case $host_os in
+      openbsd2.[89] | openbsd2.[89].*)
+	shlibpath_overrides_runpath=no
+	;;
+      *)
+	shlibpath_overrides_runpath=yes
+	;;
+      esac
+  else
+    shlibpath_overrides_runpath=yes
+  fi
+  ;;
+
+os2*)
+  libname_spec='$name'
+  shrext_cmds=".dll"
+  need_lib_prefix=no
+  library_names_spec='$libname${shared_ext} $libname.a'
+  dynamic_linker='OS/2 ld.exe'
+  shlibpath_var=LIBPATH
+  ;;
+
+osf3* | osf4* | osf5*)
+  version_type=osf
+  need_lib_prefix=no
+  need_version=no
+  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  shlibpath_var=LD_LIBRARY_PATH
+  sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib"
+  sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec"
+  ;;
+
+rdos*)
+  dynamic_linker=no
+  ;;
+
+solaris*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  # ldd complains unless libraries are executable
+  postinstall_cmds='chmod +x $lib'
+  ;;
+
+sunos4*)
+  version_type=sunos
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+  finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  if test "$with_gnu_ld" = yes; then
+    need_lib_prefix=no
+  fi
+  need_version=yes
+  ;;
+
+sysv4 | sysv4.3*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  case $host_vendor in
+    sni)
+      shlibpath_overrides_runpath=no
+      need_lib_prefix=no
+      runpath_var=LD_RUN_PATH
+      ;;
+    siemens)
+      need_lib_prefix=no
+      ;;
+    motorola)
+      need_lib_prefix=no
+      need_version=no
+      shlibpath_overrides_runpath=no
+      sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib'
+      ;;
+  esac
+  ;;
+
+sysv4*MP*)
+  if test -d /usr/nec ;then
+    version_type=linux # correct to gnu/linux during the next big refactor
+    library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}'
+    soname_spec='$libname${shared_ext}.$major'
+    shlibpath_var=LD_LIBRARY_PATH
+  fi
+  ;;
+
+sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
+  version_type=freebsd-elf
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  if test "$with_gnu_ld" = yes; then
+    sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib'
+  else
+    sys_lib_search_path_spec='/usr/ccs/lib /usr/lib'
+    case $host_os in
+      sco3.2v5*)
+        sys_lib_search_path_spec="$sys_lib_search_path_spec /lib"
+	;;
+    esac
+  fi
+  sys_lib_dlsearch_path_spec='/usr/lib'
+  ;;
+
+tpf*)
+  # TPF is a cross-target only.  Preferred cross-host = GNU/Linux.
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  ;;
+
+uts4*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  ;;
+
+*)
+  dynamic_linker=no
+  ;;
+esac
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $dynamic_linker" >&5
+$as_echo "$dynamic_linker" >&6; }
+test "$dynamic_linker" = no && can_build_shared=no
+
+variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
+if test "$GCC" = yes; then
+  variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"
+fi
+
+if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then
+  sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec"
+fi
+if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then
+  sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec"
+fi
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs" >&5
+$as_echo_n "checking how to hardcode library paths into programs... " >&6; }
+hardcode_action_CXX=
+if test -n "$hardcode_libdir_flag_spec_CXX" ||
+   test -n "$runpath_var_CXX" ||
+   test "X$hardcode_automatic_CXX" = "Xyes" ; then
+
+  # We can hardcode non-existent directories.
+  if test "$hardcode_direct_CXX" != no &&
+     # If the only mechanism to avoid hardcoding is shlibpath_var, we
+     # have to relink, otherwise we might link with an installed library
+     # when we should be linking with a yet-to-be-installed one
+     ## test "$_LT_TAGVAR(hardcode_shlibpath_var, CXX)" != no &&
+     test "$hardcode_minus_L_CXX" != no; then
+    # Linking always hardcodes the temporary library directory.
+    hardcode_action_CXX=relink
+  else
+    # We can link without hardcoding, and we can hardcode nonexisting dirs.
+    hardcode_action_CXX=immediate
+  fi
+else
+  # We cannot hardcode anything, or else we can only hardcode existing
+  # directories.
+  hardcode_action_CXX=unsupported
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $hardcode_action_CXX" >&5
+$as_echo "$hardcode_action_CXX" >&6; }
+
+if test "$hardcode_action_CXX" = relink ||
+   test "$inherit_rpath_CXX" = yes; then
+  # Fast installation is not supported
+  enable_fast_install=no
+elif test "$shlibpath_overrides_runpath" = yes ||
+     test "$enable_shared" = no; then
+  # Fast installation is not necessary
+  enable_fast_install=needless
+fi
+
+
+
+
+
+
+
+  fi # test -n "$compiler"
+
+  CC=$lt_save_CC
+  CFLAGS=$lt_save_CFLAGS
+  LDCXX=$LD
+  LD=$lt_save_LD
+  GCC=$lt_save_GCC
+  with_gnu_ld=$lt_save_with_gnu_ld
+  lt_cv_path_LDCXX=$lt_cv_path_LD
+  lt_cv_path_LD=$lt_save_path_LD
+  lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld
+  lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld
+fi # test "$_lt_caught_CXX_error" != yes
+
+ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+        ac_config_commands="$ac_config_commands libtool"
+
+
+
+
+# Only expand once:
+
+
+
+# TODO(chandlerc at google.com): Currently we aren't running the Python tests
+# against the interpreter detected by AM_PATH_PYTHON, and so we condition
+# HAVE_PYTHON by requiring "python" to be in the PATH, and that interpreter's
+# version to be >= 2.3. This will allow the scripts to use a "/usr/bin/env"
+# hashbang.
+PYTHON=  # We *do not* allow the user to specify a python interpreter
+# Extract the first word of "python", so it can be a program name with args.
+set dummy python; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_PYTHON+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  case $PYTHON in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_PYTHON="$PYTHON" # Let the user override the test with a path.
+  ;;
+  *)
+  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_path_PYTHON="$as_dir/$ac_word$ac_exec_ext"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+  test -z "$ac_cv_path_PYTHON" && ac_cv_path_PYTHON=":"
+  ;;
+esac
+fi
+PYTHON=$ac_cv_path_PYTHON
+if test -n "$PYTHON"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PYTHON" >&5
+$as_echo "$PYTHON" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+if test "$PYTHON" != ":"; then :
+  prog="import sys
+# split strings by '.' and convert to numeric.  Append some zeros
+# because we need at least 4 digits for the hex conversion.
+# map returns an iterator in Python 3.0 and a list in 2.x
+minver = list(map(int, '2.3'.split('.'))) + [0, 0, 0]
+minverhex = 0
+# xrange is not present in Python 3.0 and range returns an iterator
+for i in list(range(0, 4)): minverhex = (minverhex << 8) + minver[i]
+sys.exit(sys.hexversion < minverhex)"
+  if { echo "$as_me:$LINENO: $PYTHON -c "$prog"" >&5
+   ($PYTHON -c "$prog") >&5 2>&5
+   ac_status=$?
+   echo "$as_me:$LINENO: \$? = $ac_status" >&5
+   (exit $ac_status); }; then :
+  :
+else
+  PYTHON=":"
+fi
+fi
+ if test "$PYTHON" != ":"; then
+  HAVE_PYTHON_TRUE=
+  HAVE_PYTHON_FALSE='#'
+else
+  HAVE_PYTHON_TRUE='#'
+  HAVE_PYTHON_FALSE=
+fi
+
+
+# Configure pthreads.
+
+# Check whether --with-pthreads was given.
+if test "${with_pthreads+set}" = set; then :
+  withval=$with_pthreads; with_pthreads=$withval
+else
+  with_pthreads=check
+fi
+
+
+have_pthreads=no
+if test "x$with_pthreads" != "xno"; then :
+
+
+
+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
+
+acx_pthread_ok=no
+
+# We used to check for pthread.h first, but this fails if pthread.h
+# requires special compiler flags (e.g. on True64 or Sequent).
+# It gets checked for in the link test anyway.
+
+# First of all, check if the user has set any of the PTHREAD_LIBS,
+# etcetera environment variables, and if threads linking works using
+# them:
+if test x"$PTHREAD_LIBS$PTHREAD_CFLAGS" != x; then
+        save_CFLAGS="$CFLAGS"
+        CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
+        save_LIBS="$LIBS"
+        LIBS="$PTHREAD_LIBS $LIBS"
+        { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pthread_join in LIBS=$PTHREAD_LIBS with CFLAGS=$PTHREAD_CFLAGS" >&5
+$as_echo_n "checking for pthread_join in LIBS=$PTHREAD_LIBS with CFLAGS=$PTHREAD_CFLAGS... " >&6; }
+        cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* 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 pthread_join ();
+int
+main ()
+{
+return pthread_join ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  acx_pthread_ok=yes
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+        { $as_echo "$as_me:${as_lineno-$LINENO}: result: $acx_pthread_ok" >&5
+$as_echo "$acx_pthread_ok" >&6; }
+        if test x"$acx_pthread_ok" = xno; then
+                PTHREAD_LIBS=""
+                PTHREAD_CFLAGS=""
+        fi
+        LIBS="$save_LIBS"
+        CFLAGS="$save_CFLAGS"
+fi
+
+# We must check for the threads library under a number of different
+# names; the ordering is very important because some systems
+# (e.g. DEC) have both -lpthread and -lpthreads, where one of the
+# libraries is broken (non-POSIX).
+
+# Create a list of thread flags to try.  Items starting with a "-" are
+# C compiler flags, and other items are library names, except for "none"
+# which indicates that we try without any flags at all, and "pthread-config"
+# which is a program returning the flags for the Pth emulation library.
+
+acx_pthread_flags="pthreads none -Kthread -kthread lthread -pthread -pthreads -mthreads pthread --thread-safe -mt pthread-config"
+
+# The ordering *is* (sometimes) important.  Some notes on the
+# individual items follow:
+
+# pthreads: AIX (must check this before -lpthread)
+# none: in case threads are in libc; should be tried before -Kthread and
+#       other compiler flags to prevent continual compiler warnings
+# -Kthread: Sequent (threads in libc, but -Kthread needed for pthread.h)
+# -kthread: FreeBSD kernel threads (preferred to -pthread since SMP-able)
+# lthread: LinuxThreads port on FreeBSD (also preferred to -pthread)
+# -pthread: Linux/gcc (kernel threads), BSD/gcc (userland threads)
+# -pthreads: Solaris/gcc
+# -mthreads: Mingw32/gcc, Lynx/gcc
+# -mt: Sun Workshop C (may only link SunOS threads [-lthread], but it
+#      doesn't hurt to check since this sometimes defines pthreads too;
+#      also defines -D_REENTRANT)
+#      ... -mt is also the pthreads flag for HP/aCC
+# pthread: Linux, etcetera
+# --thread-safe: KAI C++
+# pthread-config: use pthread-config program (for GNU Pth library)
+
+case "${host_cpu}-${host_os}" in
+        *solaris*)
+
+        # On Solaris (at least, for some versions), libc contains stubbed
+        # (non-functional) versions of the pthreads routines, so link-based
+        # tests will erroneously succeed.  (We need to link with -pthreads/-mt/
+        # -lpthread.)  (The stubs are missing pthread_cleanup_push, or rather
+        # a function called by this macro, so we could check for that, but
+        # who knows whether they'll stub that too in a future libc.)  So,
+        # we'll just look for -pthreads and -lpthread first:
+
+        acx_pthread_flags="-pthreads pthread -mt -pthread $acx_pthread_flags"
+        ;;
+esac
+
+if test x"$acx_pthread_ok" = xno; then
+for flag in $acx_pthread_flags; do
+
+        case $flag in
+                none)
+                { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether pthreads work without any flags" >&5
+$as_echo_n "checking whether pthreads work without any flags... " >&6; }
+                ;;
+
+                -*)
+                { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether pthreads work with $flag" >&5
+$as_echo_n "checking whether pthreads work with $flag... " >&6; }
+                PTHREAD_CFLAGS="$flag"
+                ;;
+
+		pthread-config)
+		# Extract the first word of "pthread-config", so it can be a program name with args.
+set dummy pthread-config; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_acx_pthread_config+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$acx_pthread_config"; then
+  ac_cv_prog_acx_pthread_config="$acx_pthread_config" # 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_acx_pthread_config="yes"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+  test -z "$ac_cv_prog_acx_pthread_config" && ac_cv_prog_acx_pthread_config="no"
+fi
+fi
+acx_pthread_config=$ac_cv_prog_acx_pthread_config
+if test -n "$acx_pthread_config"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $acx_pthread_config" >&5
+$as_echo "$acx_pthread_config" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+		if test x"$acx_pthread_config" = xno; then continue; fi
+		PTHREAD_CFLAGS="`pthread-config --cflags`"
+		PTHREAD_LIBS="`pthread-config --ldflags` `pthread-config --libs`"
+		;;
+
+                *)
+                { $as_echo "$as_me:${as_lineno-$LINENO}: checking for the pthreads library -l$flag" >&5
+$as_echo_n "checking for the pthreads library -l$flag... " >&6; }
+                PTHREAD_LIBS="-l$flag"
+                ;;
+        esac
+
+        save_LIBS="$LIBS"
+        save_CFLAGS="$CFLAGS"
+        LIBS="$PTHREAD_LIBS $LIBS"
+        CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
+
+        # Check for various functions.  We must include pthread.h,
+        # since some functions may be macros.  (On the Sequent, we
+        # need a special flag -Kthread to make this header compile.)
+        # We check for pthread_join because it is in -lpthread on IRIX
+        # while pthread_create is in libc.  We check for pthread_attr_init
+        # due to DEC craziness with -lpthreads.  We check for
+        # pthread_cleanup_push because it is one of the few pthread
+        # functions on Solaris that doesn't have a non-functional libc stub.
+        # We try pthread_create on general principles.
+        cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <pthread.h>
+int
+main ()
+{
+pthread_t th; pthread_join(th, 0);
+                     pthread_attr_init(0); pthread_cleanup_push(0, 0);
+                     pthread_create(0,0,0,0); pthread_cleanup_pop(0);
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  acx_pthread_ok=yes
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+
+        LIBS="$save_LIBS"
+        CFLAGS="$save_CFLAGS"
+
+        { $as_echo "$as_me:${as_lineno-$LINENO}: result: $acx_pthread_ok" >&5
+$as_echo "$acx_pthread_ok" >&6; }
+        if test "x$acx_pthread_ok" = xyes; then
+                break;
+        fi
+
+        PTHREAD_LIBS=""
+        PTHREAD_CFLAGS=""
+done
+fi
+
+# Various other checks:
+if test "x$acx_pthread_ok" = xyes; then
+        save_LIBS="$LIBS"
+        LIBS="$PTHREAD_LIBS $LIBS"
+        save_CFLAGS="$CFLAGS"
+        CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
+
+        # Detect AIX lossage: JOINABLE attribute is called UNDETACHED.
+	{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for joinable pthread attribute" >&5
+$as_echo_n "checking for joinable pthread attribute... " >&6; }
+	attr_name=unknown
+	for attr in PTHREAD_CREATE_JOINABLE PTHREAD_CREATE_UNDETACHED; do
+	    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <pthread.h>
+int
+main ()
+{
+int attr=$attr; return attr;
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  attr_name=$attr; break
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+	done
+        { $as_echo "$as_me:${as_lineno-$LINENO}: result: $attr_name" >&5
+$as_echo "$attr_name" >&6; }
+        if test "$attr_name" != PTHREAD_CREATE_JOINABLE; then
+
+cat >>confdefs.h <<_ACEOF
+#define PTHREAD_CREATE_JOINABLE $attr_name
+_ACEOF
+
+        fi
+
+        { $as_echo "$as_me:${as_lineno-$LINENO}: checking if more special flags are required for pthreads" >&5
+$as_echo_n "checking if more special flags are required for pthreads... " >&6; }
+        flag=no
+        case "${host_cpu}-${host_os}" in
+            *-aix* | *-freebsd* | *-darwin*) flag="-D_THREAD_SAFE";;
+            *solaris* | *-osf* | *-hpux*) flag="-D_REENTRANT";;
+        esac
+        { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${flag}" >&5
+$as_echo "${flag}" >&6; }
+        if test "x$flag" != xno; then
+            PTHREAD_CFLAGS="$flag $PTHREAD_CFLAGS"
+        fi
+
+        LIBS="$save_LIBS"
+        CFLAGS="$save_CFLAGS"
+        # More AIX lossage: must compile with xlc_r or cc_r
+	if test x"$GCC" != xyes; then
+          for ac_prog in xlc_r cc_r
+do
+  # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_prog_PTHREAD_CC+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if test -n "$PTHREAD_CC"; then
+  ac_cv_prog_PTHREAD_CC="$PTHREAD_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_PTHREAD_CC="$ac_prog"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+fi
+fi
+PTHREAD_CC=$ac_cv_prog_PTHREAD_CC
+if test -n "$PTHREAD_CC"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PTHREAD_CC" >&5
+$as_echo "$PTHREAD_CC" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  test -n "$PTHREAD_CC" && break
+done
+test -n "$PTHREAD_CC" || PTHREAD_CC="${CC}"
+
+        else
+          PTHREAD_CC=$CC
+	fi
+
+	# The next part tries to detect GCC inconsistency with -shared on some
+	# architectures and systems. The problem is that in certain
+	# configurations, when -shared is specified, GCC "forgets" to
+	# internally use various flags which are still necessary.
+
+	#
+	# Prepare the flags
+	#
+	save_CFLAGS="$CFLAGS"
+	save_LIBS="$LIBS"
+	save_CC="$CC"
+
+	# Try with the flags determined by the earlier checks.
+	#
+	# -Wl,-z,defs forces link-time symbol resolution, so that the
+	# linking checks with -shared actually have any value
+	#
+	# FIXME: -fPIC is required for -shared on many architectures,
+	# so we specify it here, but the right way would probably be to
+	# properly detect whether it is actually required.
+	CFLAGS="-shared -fPIC -Wl,-z,defs $CFLAGS $PTHREAD_CFLAGS"
+	LIBS="$PTHREAD_LIBS $LIBS"
+	CC="$PTHREAD_CC"
+
+	# In order not to create several levels of indentation, we test
+	# the value of "$done" until we find the cure or run out of ideas.
+	done="no"
+
+	# First, make sure the CFLAGS we added are actually accepted by our
+	# compiler.  If not (and OS X's ld, for instance, does not accept -z),
+	# then we can't do this test.
+	if test x"$done" = xno; then
+	   { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to check for GCC pthread/shared inconsistencies" >&5
+$as_echo_n "checking whether to check for GCC pthread/shared inconsistencies... " >&6; }
+	   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+
+else
+  done=yes
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+
+	   if test "x$done" = xyes ; then
+	      { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+	   else
+	      { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+	   fi
+	fi
+
+	if test x"$done" = xno; then
+	   { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -pthread is sufficient with -shared" >&5
+$as_echo_n "checking whether -pthread is sufficient with -shared... " >&6; }
+	   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <pthread.h>
+int
+main ()
+{
+pthread_t th; pthread_join(th, 0);
+	      pthread_attr_init(0); pthread_cleanup_push(0, 0);
+	      pthread_create(0,0,0,0); pthread_cleanup_pop(0);
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  done=yes
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+
+	   if test "x$done" = xyes; then
+	      { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+	   else
+	      { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+	   fi
+	fi
+
+	#
+	# Linux gcc on some architectures such as mips/mipsel forgets
+	# about -lpthread
+	#
+	if test x"$done" = xno; then
+	   { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lpthread fixes that" >&5
+$as_echo_n "checking whether -lpthread fixes that... " >&6; }
+	   LIBS="-lpthread $PTHREAD_LIBS $save_LIBS"
+	   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <pthread.h>
+int
+main ()
+{
+pthread_t th; pthread_join(th, 0);
+	      pthread_attr_init(0); pthread_cleanup_push(0, 0);
+	      pthread_create(0,0,0,0); pthread_cleanup_pop(0);
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  done=yes
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+
+	   if test "x$done" = xyes; then
+	      { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+	      PTHREAD_LIBS="-lpthread $PTHREAD_LIBS"
+	   else
+	      { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+	   fi
+	fi
+	#
+	# FreeBSD 4.10 gcc forgets to use -lc_r instead of -lc
+	#
+	if test x"$done" = xno; then
+	   { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -lc_r fixes that" >&5
+$as_echo_n "checking whether -lc_r fixes that... " >&6; }
+	   LIBS="-lc_r $PTHREAD_LIBS $save_LIBS"
+	   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <pthread.h>
+int
+main ()
+{
+pthread_t th; pthread_join(th, 0);
+	        pthread_attr_init(0); pthread_cleanup_push(0, 0);
+	        pthread_create(0,0,0,0); pthread_cleanup_pop(0);
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  done=yes
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+
+	   if test "x$done" = xyes; then
+	      { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+	      PTHREAD_LIBS="-lc_r $PTHREAD_LIBS"
+	   else
+	      { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+	   fi
+	fi
+	if test x"$done" = xno; then
+	   # OK, we have run out of ideas
+	   { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Impossible to determine how to use pthreads with shared libraries" >&5
+$as_echo "$as_me: WARNING: Impossible to determine how to use pthreads with shared libraries" >&2;}
+
+	   # so it's not safe to assume that we may use pthreads
+	   acx_pthread_ok=no
+	fi
+
+	CFLAGS="$save_CFLAGS"
+	LIBS="$save_LIBS"
+	CC="$save_CC"
+else
+        PTHREAD_CC="$CC"
+fi
+
+
+
+
+
+# Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND:
+if test x"$acx_pthread_ok" = xyes; then
+
+$as_echo "#define HAVE_PTHREAD 1" >>confdefs.h
+
+        :
+else
+        acx_pthread_ok=no
+        if test "x$with_pthreads" != "xcheck"; then :
+  { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "--with-pthreads was specified, but unable to be used
+See \`config.log' for more details" "$LINENO" 5; }
+fi
+fi
+ac_ext=cpp
+ac_cpp='$CXXCPP $CPPFLAGS'
+ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
+
+
+       have_pthreads="$acx_pthread_ok"
+fi
+ if test "x$have_pthreads" = "xyes"; then
+  HAVE_PTHREADS_TRUE=
+  HAVE_PTHREADS_FALSE='#'
+else
+  HAVE_PTHREADS_TRUE='#'
+  HAVE_PTHREADS_FALSE=
+fi
+
+
+
+
+# TODO(chandlerc at google.com) Check for the necessary system headers.
+
+# TODO(chandlerc at google.com) Check the types, structures, and other compiler
+# and architecture characteristics.
+
+# Output the generated files. No further autoconf macros may be used.
+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_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5
+$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;;
+      esac
+      case $ac_var in #(
+      _ | IFS | as_nl) ;; #(
+      BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(
+      *) { eval $ac_var=; 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
+    if test "x$cache_file" != "x/dev/null"; then
+      { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5
+$as_echo "$as_me: updating cache $cache_file" >&6;}
+      if test ! -f "$cache_file" || test -h "$cache_file"; then
+	cat confcache >"$cache_file"
+      else
+        case $cache_file in #(
+        */* | ?:*)
+	  mv -f confcache "$cache_file"$$ &&
+	  mv -f "$cache_file"$$ "$cache_file" ;; #(
+        *)
+	  mv -f confcache "$cache_file" ;;
+	esac
+      fi
+    fi
+  else
+    { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5
+$as_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=
+U=
+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=`$as_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.
+  as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext"
+  as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo'
+done
+LIBOBJS=$ac_libobjs
+
+LTLIBOBJS=$ac_ltlibobjs
+
+
+ if test -n "$EXEEXT"; then
+  am__EXEEXT_TRUE=
+  am__EXEEXT_FALSE='#'
+else
+  am__EXEEXT_TRUE='#'
+  am__EXEEXT_FALSE=
+fi
+
+if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then
+  as_fn_error $? "conditional \"AMDEP\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then
+  as_fn_error $? "conditional \"am__fastdepCC\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then
+  as_fn_error $? "conditional \"am__fastdepCXX\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${HAVE_PYTHON_TRUE}" && test -z "${HAVE_PYTHON_FALSE}"; then
+  as_fn_error $? "conditional \"HAVE_PYTHON\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${HAVE_PTHREADS_TRUE}" && test -z "${HAVE_PTHREADS_FALSE}"; then
+  as_fn_error $? "conditional \"HAVE_PTHREADS\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+
+: "${CONFIG_STATUS=./config.status}"
+ac_write_fail=0
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files $CONFIG_STATUS"
+{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5
+$as_echo "$as_me: creating $CONFIG_STATUS" >&6;}
+as_write_fail=0
+cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1
+#! $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}
+export SHELL
+_ASEOF
+cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1
+## -------------------- ##
+## 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=:
+  # Pre-4.2 versions of Zsh do 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_nl='
+'
+export as_nl
+# Printing a long string crashes Solaris 7 /usr/bin/printf.
+as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo
+as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo
+# Prefer a ksh shell builtin over an external printf program on Solaris,
+# but without wasting forks for bash or zsh.
+if test -z "$BASH_VERSION$ZSH_VERSION" \
+    && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then
+  as_echo='print -r --'
+  as_echo_n='print -rn --'
+elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then
+  as_echo='printf %s\n'
+  as_echo_n='printf %s'
+else
+  if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then
+    as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"'
+    as_echo_n='/usr/ucb/echo -n'
+  else
+    as_echo_body='eval expr "X$1" : "X\\(.*\\)"'
+    as_echo_n_body='eval
+      arg=$1;
+      case $arg in #(
+      *"$as_nl"*)
+	expr "X$arg" : "X\\(.*\\)$as_nl";
+	arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;;
+      esac;
+      expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl"
+    '
+    export as_echo_n_body
+    as_echo_n='sh -c $as_echo_n_body as_echo'
+  fi
+  export as_echo_body
+  as_echo='sh -c $as_echo_body as_echo'
+fi
+
+# The user is always right.
+if test "${PATH_SEPARATOR+set}" != set; then
+  PATH_SEPARATOR=:
+  (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
+    (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
+      PATH_SEPARATOR=';'
+  }
+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.)
+IFS=" ""	$as_nl"
+
+# Find who we are.  Look in the path if we contain no directory separator.
+as_myself=
+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
+  $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
+  exit 1
+fi
+
+# Unset variables that we do not need and which cause bugs (e.g. in
+# pre-3.0 UWIN ksh).  But do not cause bugs in bash 2.01; the "|| exit 1"
+# suppresses any "Segmentation fault" message there.  '((' could
+# trigger a bug in pdksh 5.2.14.
+for as_var in BASH_ENV ENV MAIL MAILPATH
+do eval test x\${$as_var+set} = xset \
+  && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
+done
+PS1='$ '
+PS2='> '
+PS4='+ '
+
+# NLS nuisances.
+LC_ALL=C
+export LC_ALL
+LANGUAGE=C
+export LANGUAGE
+
+# CDPATH.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+
+# as_fn_error STATUS ERROR [LINENO LOG_FD]
+# ----------------------------------------
+# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are
+# provided, also output the error to LOG_FD, referencing LINENO. Then exit the
+# script with STATUS, using 1 if that was 0.
+as_fn_error ()
+{
+  as_status=$1; test $as_status -eq 0 && as_status=1
+  if test "$4"; then
+    as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+    $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
+  fi
+  $as_echo "$as_me: error: $2" >&2
+  as_fn_exit $as_status
+} # as_fn_error
+
+
+# as_fn_set_status STATUS
+# -----------------------
+# Set $? to STATUS, without forking.
+as_fn_set_status ()
+{
+  return $1
+} # as_fn_set_status
+
+# as_fn_exit STATUS
+# -----------------
+# Exit the shell with STATUS, even in a "trap 0" or "set -e" context.
+as_fn_exit ()
+{
+  set +e
+  as_fn_set_status $1
+  exit $1
+} # as_fn_exit
+
+# as_fn_unset VAR
+# ---------------
+# Portably unset VAR.
+as_fn_unset ()
+{
+  { eval $1=; unset $1;}
+}
+as_unset=as_fn_unset
+# as_fn_append VAR VALUE
+# ----------------------
+# Append the text in VALUE to the end of the definition contained in VAR. Take
+# advantage of any shell optimizations that allow amortized linear growth over
+# repeated appends, instead of the typical quadratic growth present in naive
+# implementations.
+if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then :
+  eval 'as_fn_append ()
+  {
+    eval $1+=\$2
+  }'
+else
+  as_fn_append ()
+  {
+    eval $1=\$$1\$2
+  }
+fi # as_fn_append
+
+# as_fn_arith ARG...
+# ------------------
+# Perform arithmetic evaluation on the ARGs, and store the result in the
+# global $as_val. Take advantage of shells that can avoid forks. The arguments
+# must be portable across $(()) and expr.
+if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then :
+  eval 'as_fn_arith ()
+  {
+    as_val=$(( $* ))
+  }'
+else
+  as_fn_arith ()
+  {
+    as_val=`expr "$@" || test $? -eq 1`
+  }
+fi # as_fn_arith
+
+
+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
+
+if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
+  as_dirname=dirname
+else
+  as_dirname=false
+fi
+
+as_me=`$as_basename -- "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+	 X"$0" : 'X\(//\)$' \| \
+	 X"$0" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X/"$0" |
+    sed '/^.*\/\([^/][^/]*\)\/*$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\/\(\/\/\)$/{
+	    s//\1/
+	    q
+	  }
+	  /^X\/\(\/\).*/{
+	    s//\1/
+	    q
+	  }
+	  s/.*/./; q'`
+
+# 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
+
+ECHO_C= ECHO_N= ECHO_T=
+case `echo -n x` in #(((((
+-n*)
+  case `echo 'xy\c'` in
+  *c*) ECHO_T='	';;	# ECHO_T is single tab character.
+  xy)  ECHO_C='\c';;
+  *)   echo `echo ksh88 bug on AIX 6.1` > /dev/null
+       ECHO_T='	';;
+  esac;;
+*)
+  ECHO_N='-n';;
+esac
+
+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 2>/dev/null
+fi
+if (echo >conf$$.file) 2>/dev/null; then
+  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
+else
+  as_ln_s='cp -p'
+fi
+rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
+rmdir conf$$.dir 2>/dev/null
+
+
+# as_fn_mkdir_p
+# -------------
+# Create "$as_dir" as a directory, including parents if necessary.
+as_fn_mkdir_p ()
+{
+
+  case $as_dir in #(
+  -*) as_dir=./$as_dir;;
+  esac
+  test -d "$as_dir" || eval $as_mkdir_p || {
+    as_dirs=
+    while :; do
+      case $as_dir in #(
+      *\'*) as_qdir=`$as_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 ||
+$as_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" || as_fn_error $? "cannot create directory $as_dir"
+
+
+} # as_fn_mkdir_p
+if mkdir -p . 2>/dev/null; then
+  as_mkdir_p='mkdir -p "$as_dir"'
+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
+## ----------------------------------- ##
+## Main body of $CONFIG_STATUS script. ##
+## ----------------------------------- ##
+_ASEOF
+test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=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 Google C++ Testing Framework $as_me 1.7.0, which was
+generated by GNU Autoconf 2.68.  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
+
+case $ac_config_files in *"
+"*) set x $ac_config_files; shift; ac_config_files=$*;;
+esac
+
+case $ac_config_headers in *"
+"*) set x $ac_config_headers; shift; ac_config_headers=$*;;
+esac
+
+
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+# 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_write_fail=1
+ac_cs_usage="\
+\`$as_me' instantiates files and other configuration actions
+from templates according to the current configuration.  Unless the files
+and actions are specified as TAGs, all are instantiated by default.
+
+Usage: $0 [OPTION]... [TAG]...
+
+  -h, --help       print this help, then exit
+  -V, --version    print version number and configuration settings, then exit
+      --config     print configuration, then exit
+  -q, --quiet, --silent
+                   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 <googletestframework at googlegroups.com>."
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
+ac_cs_version="\\
+Google C++ Testing Framework config.status 1.7.0
+configured by $0, generated by GNU Autoconf 2.68,
+  with options \\"\$ac_cs_config\\"
+
+Copyright (C) 2010 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'
+MKDIR_P='$MKDIR_P'
+AWK='$AWK'
+test -n "\$AWK" || AWK=awk
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+# The default lists apply if the user does not specify any file.
+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=`expr "X$1" : 'X\([^=]*\)='`
+    ac_optarg=
+    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 )
+    $as_echo "$ac_cs_version"; exit ;;
+  --config | --confi | --conf | --con | --co | --c )
+    $as_echo "$ac_cs_config"; exit ;;
+  --debug | --debu | --deb | --de | --d | -d )
+    debug=: ;;
+  --file | --fil | --fi | --f )
+    $ac_shift
+    case $ac_optarg in
+    *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
+    '') as_fn_error $? "missing file argument" ;;
+    esac
+    as_fn_append CONFIG_FILES " '$ac_optarg'"
+    ac_need_defaults=false;;
+  --header | --heade | --head | --hea )
+    $ac_shift
+    case $ac_optarg in
+    *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
+    esac
+    as_fn_append CONFIG_HEADERS " '$ac_optarg'"
+    ac_need_defaults=false;;
+  --he | --h)
+    # Conflict between --help and --header
+    as_fn_error $? "ambiguous option: \`$1'
+Try \`$0 --help' for more information.";;
+  --help | --hel | -h )
+    $as_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.
+  -*) as_fn_error $? "unrecognized option: \`$1'
+Try \`$0 --help' for more information." ;;
+
+  *) as_fn_append 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 || ac_write_fail=1
+if \$ac_cs_recheck; then
+  set X '$SHELL' '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion
+  shift
+  \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6
+  CONFIG_SHELL='$SHELL'
+  export CONFIG_SHELL
+  exec "\$@"
+fi
+
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+exec 5>>config.log
+{
+  echo
+  sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX
+## Running $as_me. ##
+_ASBOX
+  $as_echo "$ac_log"
+} >&5
+
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+#
+# INIT-COMMANDS
+#
+AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"
+
+
+# The HP-UX ksh and POSIX shell print the target directory to stdout
+# if CDPATH is set.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+sed_quote_subst='$sed_quote_subst'
+double_quote_subst='$double_quote_subst'
+delay_variable_subst='$delay_variable_subst'
+macro_version='`$ECHO "$macro_version" | $SED "$delay_single_quote_subst"`'
+macro_revision='`$ECHO "$macro_revision" | $SED "$delay_single_quote_subst"`'
+enable_shared='`$ECHO "$enable_shared" | $SED "$delay_single_quote_subst"`'
+enable_static='`$ECHO "$enable_static" | $SED "$delay_single_quote_subst"`'
+pic_mode='`$ECHO "$pic_mode" | $SED "$delay_single_quote_subst"`'
+enable_fast_install='`$ECHO "$enable_fast_install" | $SED "$delay_single_quote_subst"`'
+SHELL='`$ECHO "$SHELL" | $SED "$delay_single_quote_subst"`'
+ECHO='`$ECHO "$ECHO" | $SED "$delay_single_quote_subst"`'
+PATH_SEPARATOR='`$ECHO "$PATH_SEPARATOR" | $SED "$delay_single_quote_subst"`'
+host_alias='`$ECHO "$host_alias" | $SED "$delay_single_quote_subst"`'
+host='`$ECHO "$host" | $SED "$delay_single_quote_subst"`'
+host_os='`$ECHO "$host_os" | $SED "$delay_single_quote_subst"`'
+build_alias='`$ECHO "$build_alias" | $SED "$delay_single_quote_subst"`'
+build='`$ECHO "$build" | $SED "$delay_single_quote_subst"`'
+build_os='`$ECHO "$build_os" | $SED "$delay_single_quote_subst"`'
+SED='`$ECHO "$SED" | $SED "$delay_single_quote_subst"`'
+Xsed='`$ECHO "$Xsed" | $SED "$delay_single_quote_subst"`'
+GREP='`$ECHO "$GREP" | $SED "$delay_single_quote_subst"`'
+EGREP='`$ECHO "$EGREP" | $SED "$delay_single_quote_subst"`'
+FGREP='`$ECHO "$FGREP" | $SED "$delay_single_quote_subst"`'
+LD='`$ECHO "$LD" | $SED "$delay_single_quote_subst"`'
+NM='`$ECHO "$NM" | $SED "$delay_single_quote_subst"`'
+LN_S='`$ECHO "$LN_S" | $SED "$delay_single_quote_subst"`'
+max_cmd_len='`$ECHO "$max_cmd_len" | $SED "$delay_single_quote_subst"`'
+ac_objext='`$ECHO "$ac_objext" | $SED "$delay_single_quote_subst"`'
+exeext='`$ECHO "$exeext" | $SED "$delay_single_quote_subst"`'
+lt_unset='`$ECHO "$lt_unset" | $SED "$delay_single_quote_subst"`'
+lt_SP2NL='`$ECHO "$lt_SP2NL" | $SED "$delay_single_quote_subst"`'
+lt_NL2SP='`$ECHO "$lt_NL2SP" | $SED "$delay_single_quote_subst"`'
+lt_cv_to_host_file_cmd='`$ECHO "$lt_cv_to_host_file_cmd" | $SED "$delay_single_quote_subst"`'
+lt_cv_to_tool_file_cmd='`$ECHO "$lt_cv_to_tool_file_cmd" | $SED "$delay_single_quote_subst"`'
+reload_flag='`$ECHO "$reload_flag" | $SED "$delay_single_quote_subst"`'
+reload_cmds='`$ECHO "$reload_cmds" | $SED "$delay_single_quote_subst"`'
+OBJDUMP='`$ECHO "$OBJDUMP" | $SED "$delay_single_quote_subst"`'
+deplibs_check_method='`$ECHO "$deplibs_check_method" | $SED "$delay_single_quote_subst"`'
+file_magic_cmd='`$ECHO "$file_magic_cmd" | $SED "$delay_single_quote_subst"`'
+file_magic_glob='`$ECHO "$file_magic_glob" | $SED "$delay_single_quote_subst"`'
+want_nocaseglob='`$ECHO "$want_nocaseglob" | $SED "$delay_single_quote_subst"`'
+DLLTOOL='`$ECHO "$DLLTOOL" | $SED "$delay_single_quote_subst"`'
+sharedlib_from_linklib_cmd='`$ECHO "$sharedlib_from_linklib_cmd" | $SED "$delay_single_quote_subst"`'
+AR='`$ECHO "$AR" | $SED "$delay_single_quote_subst"`'
+AR_FLAGS='`$ECHO "$AR_FLAGS" | $SED "$delay_single_quote_subst"`'
+archiver_list_spec='`$ECHO "$archiver_list_spec" | $SED "$delay_single_quote_subst"`'
+STRIP='`$ECHO "$STRIP" | $SED "$delay_single_quote_subst"`'
+RANLIB='`$ECHO "$RANLIB" | $SED "$delay_single_quote_subst"`'
+old_postinstall_cmds='`$ECHO "$old_postinstall_cmds" | $SED "$delay_single_quote_subst"`'
+old_postuninstall_cmds='`$ECHO "$old_postuninstall_cmds" | $SED "$delay_single_quote_subst"`'
+old_archive_cmds='`$ECHO "$old_archive_cmds" | $SED "$delay_single_quote_subst"`'
+lock_old_archive_extraction='`$ECHO "$lock_old_archive_extraction" | $SED "$delay_single_quote_subst"`'
+CC='`$ECHO "$CC" | $SED "$delay_single_quote_subst"`'
+CFLAGS='`$ECHO "$CFLAGS" | $SED "$delay_single_quote_subst"`'
+compiler='`$ECHO "$compiler" | $SED "$delay_single_quote_subst"`'
+GCC='`$ECHO "$GCC" | $SED "$delay_single_quote_subst"`'
+lt_cv_sys_global_symbol_pipe='`$ECHO "$lt_cv_sys_global_symbol_pipe" | $SED "$delay_single_quote_subst"`'
+lt_cv_sys_global_symbol_to_cdecl='`$ECHO "$lt_cv_sys_global_symbol_to_cdecl" | $SED "$delay_single_quote_subst"`'
+lt_cv_sys_global_symbol_to_c_name_address='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address" | $SED "$delay_single_quote_subst"`'
+lt_cv_sys_global_symbol_to_c_name_address_lib_prefix='`$ECHO "$lt_cv_sys_global_symbol_to_c_name_address_lib_prefix" | $SED "$delay_single_quote_subst"`'
+nm_file_list_spec='`$ECHO "$nm_file_list_spec" | $SED "$delay_single_quote_subst"`'
+lt_sysroot='`$ECHO "$lt_sysroot" | $SED "$delay_single_quote_subst"`'
+objdir='`$ECHO "$objdir" | $SED "$delay_single_quote_subst"`'
+MAGIC_CMD='`$ECHO "$MAGIC_CMD" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_no_builtin_flag='`$ECHO "$lt_prog_compiler_no_builtin_flag" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_pic='`$ECHO "$lt_prog_compiler_pic" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_wl='`$ECHO "$lt_prog_compiler_wl" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_static='`$ECHO "$lt_prog_compiler_static" | $SED "$delay_single_quote_subst"`'
+lt_cv_prog_compiler_c_o='`$ECHO "$lt_cv_prog_compiler_c_o" | $SED "$delay_single_quote_subst"`'
+need_locks='`$ECHO "$need_locks" | $SED "$delay_single_quote_subst"`'
+MANIFEST_TOOL='`$ECHO "$MANIFEST_TOOL" | $SED "$delay_single_quote_subst"`'
+DSYMUTIL='`$ECHO "$DSYMUTIL" | $SED "$delay_single_quote_subst"`'
+NMEDIT='`$ECHO "$NMEDIT" | $SED "$delay_single_quote_subst"`'
+LIPO='`$ECHO "$LIPO" | $SED "$delay_single_quote_subst"`'
+OTOOL='`$ECHO "$OTOOL" | $SED "$delay_single_quote_subst"`'
+OTOOL64='`$ECHO "$OTOOL64" | $SED "$delay_single_quote_subst"`'
+libext='`$ECHO "$libext" | $SED "$delay_single_quote_subst"`'
+shrext_cmds='`$ECHO "$shrext_cmds" | $SED "$delay_single_quote_subst"`'
+extract_expsyms_cmds='`$ECHO "$extract_expsyms_cmds" | $SED "$delay_single_quote_subst"`'
+archive_cmds_need_lc='`$ECHO "$archive_cmds_need_lc" | $SED "$delay_single_quote_subst"`'
+enable_shared_with_static_runtimes='`$ECHO "$enable_shared_with_static_runtimes" | $SED "$delay_single_quote_subst"`'
+export_dynamic_flag_spec='`$ECHO "$export_dynamic_flag_spec" | $SED "$delay_single_quote_subst"`'
+whole_archive_flag_spec='`$ECHO "$whole_archive_flag_spec" | $SED "$delay_single_quote_subst"`'
+compiler_needs_object='`$ECHO "$compiler_needs_object" | $SED "$delay_single_quote_subst"`'
+old_archive_from_new_cmds='`$ECHO "$old_archive_from_new_cmds" | $SED "$delay_single_quote_subst"`'
+old_archive_from_expsyms_cmds='`$ECHO "$old_archive_from_expsyms_cmds" | $SED "$delay_single_quote_subst"`'
+archive_cmds='`$ECHO "$archive_cmds" | $SED "$delay_single_quote_subst"`'
+archive_expsym_cmds='`$ECHO "$archive_expsym_cmds" | $SED "$delay_single_quote_subst"`'
+module_cmds='`$ECHO "$module_cmds" | $SED "$delay_single_quote_subst"`'
+module_expsym_cmds='`$ECHO "$module_expsym_cmds" | $SED "$delay_single_quote_subst"`'
+with_gnu_ld='`$ECHO "$with_gnu_ld" | $SED "$delay_single_quote_subst"`'
+allow_undefined_flag='`$ECHO "$allow_undefined_flag" | $SED "$delay_single_quote_subst"`'
+no_undefined_flag='`$ECHO "$no_undefined_flag" | $SED "$delay_single_quote_subst"`'
+hardcode_libdir_flag_spec='`$ECHO "$hardcode_libdir_flag_spec" | $SED "$delay_single_quote_subst"`'
+hardcode_libdir_separator='`$ECHO "$hardcode_libdir_separator" | $SED "$delay_single_quote_subst"`'
+hardcode_direct='`$ECHO "$hardcode_direct" | $SED "$delay_single_quote_subst"`'
+hardcode_direct_absolute='`$ECHO "$hardcode_direct_absolute" | $SED "$delay_single_quote_subst"`'
+hardcode_minus_L='`$ECHO "$hardcode_minus_L" | $SED "$delay_single_quote_subst"`'
+hardcode_shlibpath_var='`$ECHO "$hardcode_shlibpath_var" | $SED "$delay_single_quote_subst"`'
+hardcode_automatic='`$ECHO "$hardcode_automatic" | $SED "$delay_single_quote_subst"`'
+inherit_rpath='`$ECHO "$inherit_rpath" | $SED "$delay_single_quote_subst"`'
+link_all_deplibs='`$ECHO "$link_all_deplibs" | $SED "$delay_single_quote_subst"`'
+always_export_symbols='`$ECHO "$always_export_symbols" | $SED "$delay_single_quote_subst"`'
+export_symbols_cmds='`$ECHO "$export_symbols_cmds" | $SED "$delay_single_quote_subst"`'
+exclude_expsyms='`$ECHO "$exclude_expsyms" | $SED "$delay_single_quote_subst"`'
+include_expsyms='`$ECHO "$include_expsyms" | $SED "$delay_single_quote_subst"`'
+prelink_cmds='`$ECHO "$prelink_cmds" | $SED "$delay_single_quote_subst"`'
+postlink_cmds='`$ECHO "$postlink_cmds" | $SED "$delay_single_quote_subst"`'
+file_list_spec='`$ECHO "$file_list_spec" | $SED "$delay_single_quote_subst"`'
+variables_saved_for_relink='`$ECHO "$variables_saved_for_relink" | $SED "$delay_single_quote_subst"`'
+need_lib_prefix='`$ECHO "$need_lib_prefix" | $SED "$delay_single_quote_subst"`'
+need_version='`$ECHO "$need_version" | $SED "$delay_single_quote_subst"`'
+version_type='`$ECHO "$version_type" | $SED "$delay_single_quote_subst"`'
+runpath_var='`$ECHO "$runpath_var" | $SED "$delay_single_quote_subst"`'
+shlibpath_var='`$ECHO "$shlibpath_var" | $SED "$delay_single_quote_subst"`'
+shlibpath_overrides_runpath='`$ECHO "$shlibpath_overrides_runpath" | $SED "$delay_single_quote_subst"`'
+libname_spec='`$ECHO "$libname_spec" | $SED "$delay_single_quote_subst"`'
+library_names_spec='`$ECHO "$library_names_spec" | $SED "$delay_single_quote_subst"`'
+soname_spec='`$ECHO "$soname_spec" | $SED "$delay_single_quote_subst"`'
+install_override_mode='`$ECHO "$install_override_mode" | $SED "$delay_single_quote_subst"`'
+postinstall_cmds='`$ECHO "$postinstall_cmds" | $SED "$delay_single_quote_subst"`'
+postuninstall_cmds='`$ECHO "$postuninstall_cmds" | $SED "$delay_single_quote_subst"`'
+finish_cmds='`$ECHO "$finish_cmds" | $SED "$delay_single_quote_subst"`'
+finish_eval='`$ECHO "$finish_eval" | $SED "$delay_single_quote_subst"`'
+hardcode_into_libs='`$ECHO "$hardcode_into_libs" | $SED "$delay_single_quote_subst"`'
+sys_lib_search_path_spec='`$ECHO "$sys_lib_search_path_spec" | $SED "$delay_single_quote_subst"`'
+sys_lib_dlsearch_path_spec='`$ECHO "$sys_lib_dlsearch_path_spec" | $SED "$delay_single_quote_subst"`'
+hardcode_action='`$ECHO "$hardcode_action" | $SED "$delay_single_quote_subst"`'
+enable_dlopen='`$ECHO "$enable_dlopen" | $SED "$delay_single_quote_subst"`'
+enable_dlopen_self='`$ECHO "$enable_dlopen_self" | $SED "$delay_single_quote_subst"`'
+enable_dlopen_self_static='`$ECHO "$enable_dlopen_self_static" | $SED "$delay_single_quote_subst"`'
+old_striplib='`$ECHO "$old_striplib" | $SED "$delay_single_quote_subst"`'
+striplib='`$ECHO "$striplib" | $SED "$delay_single_quote_subst"`'
+compiler_lib_search_dirs='`$ECHO "$compiler_lib_search_dirs" | $SED "$delay_single_quote_subst"`'
+predep_objects='`$ECHO "$predep_objects" | $SED "$delay_single_quote_subst"`'
+postdep_objects='`$ECHO "$postdep_objects" | $SED "$delay_single_quote_subst"`'
+predeps='`$ECHO "$predeps" | $SED "$delay_single_quote_subst"`'
+postdeps='`$ECHO "$postdeps" | $SED "$delay_single_quote_subst"`'
+compiler_lib_search_path='`$ECHO "$compiler_lib_search_path" | $SED "$delay_single_quote_subst"`'
+LD_CXX='`$ECHO "$LD_CXX" | $SED "$delay_single_quote_subst"`'
+reload_flag_CXX='`$ECHO "$reload_flag_CXX" | $SED "$delay_single_quote_subst"`'
+reload_cmds_CXX='`$ECHO "$reload_cmds_CXX" | $SED "$delay_single_quote_subst"`'
+old_archive_cmds_CXX='`$ECHO "$old_archive_cmds_CXX" | $SED "$delay_single_quote_subst"`'
+compiler_CXX='`$ECHO "$compiler_CXX" | $SED "$delay_single_quote_subst"`'
+GCC_CXX='`$ECHO "$GCC_CXX" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_no_builtin_flag_CXX='`$ECHO "$lt_prog_compiler_no_builtin_flag_CXX" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_pic_CXX='`$ECHO "$lt_prog_compiler_pic_CXX" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_wl_CXX='`$ECHO "$lt_prog_compiler_wl_CXX" | $SED "$delay_single_quote_subst"`'
+lt_prog_compiler_static_CXX='`$ECHO "$lt_prog_compiler_static_CXX" | $SED "$delay_single_quote_subst"`'
+lt_cv_prog_compiler_c_o_CXX='`$ECHO "$lt_cv_prog_compiler_c_o_CXX" | $SED "$delay_single_quote_subst"`'
+archive_cmds_need_lc_CXX='`$ECHO "$archive_cmds_need_lc_CXX" | $SED "$delay_single_quote_subst"`'
+enable_shared_with_static_runtimes_CXX='`$ECHO "$enable_shared_with_static_runtimes_CXX" | $SED "$delay_single_quote_subst"`'
+export_dynamic_flag_spec_CXX='`$ECHO "$export_dynamic_flag_spec_CXX" | $SED "$delay_single_quote_subst"`'
+whole_archive_flag_spec_CXX='`$ECHO "$whole_archive_flag_spec_CXX" | $SED "$delay_single_quote_subst"`'
+compiler_needs_object_CXX='`$ECHO "$compiler_needs_object_CXX" | $SED "$delay_single_quote_subst"`'
+old_archive_from_new_cmds_CXX='`$ECHO "$old_archive_from_new_cmds_CXX" | $SED "$delay_single_quote_subst"`'
+old_archive_from_expsyms_cmds_CXX='`$ECHO "$old_archive_from_expsyms_cmds_CXX" | $SED "$delay_single_quote_subst"`'
+archive_cmds_CXX='`$ECHO "$archive_cmds_CXX" | $SED "$delay_single_quote_subst"`'
+archive_expsym_cmds_CXX='`$ECHO "$archive_expsym_cmds_CXX" | $SED "$delay_single_quote_subst"`'
+module_cmds_CXX='`$ECHO "$module_cmds_CXX" | $SED "$delay_single_quote_subst"`'
+module_expsym_cmds_CXX='`$ECHO "$module_expsym_cmds_CXX" | $SED "$delay_single_quote_subst"`'
+with_gnu_ld_CXX='`$ECHO "$with_gnu_ld_CXX" | $SED "$delay_single_quote_subst"`'
+allow_undefined_flag_CXX='`$ECHO "$allow_undefined_flag_CXX" | $SED "$delay_single_quote_subst"`'
+no_undefined_flag_CXX='`$ECHO "$no_undefined_flag_CXX" | $SED "$delay_single_quote_subst"`'
+hardcode_libdir_flag_spec_CXX='`$ECHO "$hardcode_libdir_flag_spec_CXX" | $SED "$delay_single_quote_subst"`'
+hardcode_libdir_separator_CXX='`$ECHO "$hardcode_libdir_separator_CXX" | $SED "$delay_single_quote_subst"`'
+hardcode_direct_CXX='`$ECHO "$hardcode_direct_CXX" | $SED "$delay_single_quote_subst"`'
+hardcode_direct_absolute_CXX='`$ECHO "$hardcode_direct_absolute_CXX" | $SED "$delay_single_quote_subst"`'
+hardcode_minus_L_CXX='`$ECHO "$hardcode_minus_L_CXX" | $SED "$delay_single_quote_subst"`'
+hardcode_shlibpath_var_CXX='`$ECHO "$hardcode_shlibpath_var_CXX" | $SED "$delay_single_quote_subst"`'
+hardcode_automatic_CXX='`$ECHO "$hardcode_automatic_CXX" | $SED "$delay_single_quote_subst"`'
+inherit_rpath_CXX='`$ECHO "$inherit_rpath_CXX" | $SED "$delay_single_quote_subst"`'
+link_all_deplibs_CXX='`$ECHO "$link_all_deplibs_CXX" | $SED "$delay_single_quote_subst"`'
+always_export_symbols_CXX='`$ECHO "$always_export_symbols_CXX" | $SED "$delay_single_quote_subst"`'
+export_symbols_cmds_CXX='`$ECHO "$export_symbols_cmds_CXX" | $SED "$delay_single_quote_subst"`'
+exclude_expsyms_CXX='`$ECHO "$exclude_expsyms_CXX" | $SED "$delay_single_quote_subst"`'
+include_expsyms_CXX='`$ECHO "$include_expsyms_CXX" | $SED "$delay_single_quote_subst"`'
+prelink_cmds_CXX='`$ECHO "$prelink_cmds_CXX" | $SED "$delay_single_quote_subst"`'
+postlink_cmds_CXX='`$ECHO "$postlink_cmds_CXX" | $SED "$delay_single_quote_subst"`'
+file_list_spec_CXX='`$ECHO "$file_list_spec_CXX" | $SED "$delay_single_quote_subst"`'
+hardcode_action_CXX='`$ECHO "$hardcode_action_CXX" | $SED "$delay_single_quote_subst"`'
+compiler_lib_search_dirs_CXX='`$ECHO "$compiler_lib_search_dirs_CXX" | $SED "$delay_single_quote_subst"`'
+predep_objects_CXX='`$ECHO "$predep_objects_CXX" | $SED "$delay_single_quote_subst"`'
+postdep_objects_CXX='`$ECHO "$postdep_objects_CXX" | $SED "$delay_single_quote_subst"`'
+predeps_CXX='`$ECHO "$predeps_CXX" | $SED "$delay_single_quote_subst"`'
+postdeps_CXX='`$ECHO "$postdeps_CXX" | $SED "$delay_single_quote_subst"`'
+compiler_lib_search_path_CXX='`$ECHO "$compiler_lib_search_path_CXX" | $SED "$delay_single_quote_subst"`'
+
+LTCC='$LTCC'
+LTCFLAGS='$LTCFLAGS'
+compiler='$compiler_DEFAULT'
+
+# A function that is used when there is no print builtin or printf.
+func_fallback_echo ()
+{
+  eval 'cat <<_LTECHO_EOF
+\$1
+_LTECHO_EOF'
+}
+
+# Quote evaled strings.
+for var in SHELL \
+ECHO \
+PATH_SEPARATOR \
+SED \
+GREP \
+EGREP \
+FGREP \
+LD \
+NM \
+LN_S \
+lt_SP2NL \
+lt_NL2SP \
+reload_flag \
+OBJDUMP \
+deplibs_check_method \
+file_magic_cmd \
+file_magic_glob \
+want_nocaseglob \
+DLLTOOL \
+sharedlib_from_linklib_cmd \
+AR \
+AR_FLAGS \
+archiver_list_spec \
+STRIP \
+RANLIB \
+CC \
+CFLAGS \
+compiler \
+lt_cv_sys_global_symbol_pipe \
+lt_cv_sys_global_symbol_to_cdecl \
+lt_cv_sys_global_symbol_to_c_name_address \
+lt_cv_sys_global_symbol_to_c_name_address_lib_prefix \
+nm_file_list_spec \
+lt_prog_compiler_no_builtin_flag \
+lt_prog_compiler_pic \
+lt_prog_compiler_wl \
+lt_prog_compiler_static \
+lt_cv_prog_compiler_c_o \
+need_locks \
+MANIFEST_TOOL \
+DSYMUTIL \
+NMEDIT \
+LIPO \
+OTOOL \
+OTOOL64 \
+shrext_cmds \
+export_dynamic_flag_spec \
+whole_archive_flag_spec \
+compiler_needs_object \
+with_gnu_ld \
+allow_undefined_flag \
+no_undefined_flag \
+hardcode_libdir_flag_spec \
+hardcode_libdir_separator \
+exclude_expsyms \
+include_expsyms \
+file_list_spec \
+variables_saved_for_relink \
+libname_spec \
+library_names_spec \
+soname_spec \
+install_override_mode \
+finish_eval \
+old_striplib \
+striplib \
+compiler_lib_search_dirs \
+predep_objects \
+postdep_objects \
+predeps \
+postdeps \
+compiler_lib_search_path \
+LD_CXX \
+reload_flag_CXX \
+compiler_CXX \
+lt_prog_compiler_no_builtin_flag_CXX \
+lt_prog_compiler_pic_CXX \
+lt_prog_compiler_wl_CXX \
+lt_prog_compiler_static_CXX \
+lt_cv_prog_compiler_c_o_CXX \
+export_dynamic_flag_spec_CXX \
+whole_archive_flag_spec_CXX \
+compiler_needs_object_CXX \
+with_gnu_ld_CXX \
+allow_undefined_flag_CXX \
+no_undefined_flag_CXX \
+hardcode_libdir_flag_spec_CXX \
+hardcode_libdir_separator_CXX \
+exclude_expsyms_CXX \
+include_expsyms_CXX \
+file_list_spec_CXX \
+compiler_lib_search_dirs_CXX \
+predep_objects_CXX \
+postdep_objects_CXX \
+predeps_CXX \
+postdeps_CXX \
+compiler_lib_search_path_CXX; do
+    case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in
+    *[\\\\\\\`\\"\\\$]*)
+      eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\""
+      ;;
+    *)
+      eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
+      ;;
+    esac
+done
+
+# Double-quote double-evaled strings.
+for var in reload_cmds \
+old_postinstall_cmds \
+old_postuninstall_cmds \
+old_archive_cmds \
+extract_expsyms_cmds \
+old_archive_from_new_cmds \
+old_archive_from_expsyms_cmds \
+archive_cmds \
+archive_expsym_cmds \
+module_cmds \
+module_expsym_cmds \
+export_symbols_cmds \
+prelink_cmds \
+postlink_cmds \
+postinstall_cmds \
+postuninstall_cmds \
+finish_cmds \
+sys_lib_search_path_spec \
+sys_lib_dlsearch_path_spec \
+reload_cmds_CXX \
+old_archive_cmds_CXX \
+old_archive_from_new_cmds_CXX \
+old_archive_from_expsyms_cmds_CXX \
+archive_cmds_CXX \
+archive_expsym_cmds_CXX \
+module_cmds_CXX \
+module_expsym_cmds_CXX \
+export_symbols_cmds_CXX \
+prelink_cmds_CXX \
+postlink_cmds_CXX; do
+    case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in
+    *[\\\\\\\`\\"\\\$]*)
+      eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\""
+      ;;
+    *)
+      eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
+      ;;
+    esac
+done
+
+ac_aux_dir='$ac_aux_dir'
+xsi_shell='$xsi_shell'
+lt_shell_append='$lt_shell_append'
+
+# See if we are running on zsh, and set the options which allow our
+# commands through without removal of \ escapes INIT.
+if test -n "\${ZSH_VERSION+set}" ; then
+   setopt NO_GLOB_SUBST
+fi
+
+
+    PACKAGE='$PACKAGE'
+    VERSION='$VERSION'
+    TIMESTAMP='$TIMESTAMP'
+    RM='$RM'
+    ofile='$ofile'
+
+
+
+
+
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+
+# Handling of arguments.
+for ac_config_target in $ac_config_targets
+do
+  case $ac_config_target in
+    "build-aux/config.h") CONFIG_HEADERS="$CONFIG_HEADERS build-aux/config.h" ;;
+    "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;;
+    "scripts/gtest-config") CONFIG_FILES="$CONFIG_FILES scripts/gtest-config" ;;
+    "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;;
+    "libtool") CONFIG_COMMANDS="$CONFIG_COMMANDS libtool" ;;
+
+  *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;;
+  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= ac_tmp=
+  trap 'exit_status=$?
+  : "${ac_tmp:=$tmp}"
+  { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status
+' 0
+  trap 'as_fn_exit 1' 1 2 13 15
+}
+# Create a (secure) tmp directory for tmp files.
+
+{
+  tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` &&
+  test -d "$tmp"
+}  ||
+{
+  tmp=./conf$$-$RANDOM
+  (umask 077 && mkdir "$tmp")
+} || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5
+ac_tmp=$tmp
+
+# Set up the scripts for CONFIG_FILES section.
+# No need to generate them if there are no CONFIG_FILES.
+# This happens for instance with `./config.status config.h'.
+if test -n "$CONFIG_FILES"; then
+
+
+ac_cr=`echo X | tr X '\015'`
+# On cygwin, bash can eat \r inside `` if the user requested igncr.
+# But we know of no other shell where ac_cr would be empty at this
+# point, so we can use a bashism as a fallback.
+if test "x$ac_cr" = x; then
+  eval ac_cr=\$\'\\r\'
+fi
+ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' </dev/null 2>/dev/null`
+if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then
+  ac_cs_awk_cr='\\r'
+else
+  ac_cs_awk_cr=$ac_cr
+fi
+
+echo 'BEGIN {' >"$ac_tmp/subs1.awk" &&
+_ACEOF
+
+
+{
+  echo "cat >conf$$subs.awk <<_ACEOF" &&
+  echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' &&
+  echo "_ACEOF"
+} >conf$$subs.sh ||
+  as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
+ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'`
+ac_delim='%!_!# '
+for ac_last_try in false false false false false :; do
+  . ./conf$$subs.sh ||
+    as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
+
+  ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X`
+  if test $ac_delim_n = $ac_delim_num; then
+    break
+  elif $ac_last_try; then
+    as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
+  else
+    ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
+  fi
+done
+rm -f conf$$subs.sh
+
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK &&
+_ACEOF
+sed -n '
+h
+s/^/S["/; s/!.*/"]=/
+p
+g
+s/^[^!]*!//
+:repl
+t repl
+s/'"$ac_delim"'$//
+t delim
+:nl
+h
+s/\(.\{148\}\)..*/\1/
+t more1
+s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/
+p
+n
+b repl
+:more1
+s/["\\]/\\&/g; s/^/"/; s/$/"\\/
+p
+g
+s/.\{148\}//
+t nl
+:delim
+h
+s/\(.\{148\}\)..*/\1/
+t more2
+s/["\\]/\\&/g; s/^/"/; s/$/"/
+p
+b
+:more2
+s/["\\]/\\&/g; s/^/"/; s/$/"\\/
+p
+g
+s/.\{148\}//
+t delim
+' <conf$$subs.awk | sed '
+/^[^""]/{
+  N
+  s/\n//
+}
+' >>$CONFIG_STATUS || ac_write_fail=1
+rm -f conf$$subs.awk
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+_ACAWK
+cat >>"\$ac_tmp/subs1.awk" <<_ACAWK &&
+  for (key in S) S_is_set[key] = 1
+  FS = ""
+
+}
+{
+  line = $ 0
+  nfields = split(line, field, "@")
+  substed = 0
+  len = length(field[1])
+  for (i = 2; i < nfields; i++) {
+    key = field[i]
+    keylen = length(key)
+    if (S_is_set[key]) {
+      value = S[key]
+      line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3)
+      len += length(value) + length(field[++i])
+      substed = 1
+    } else
+      len += 1 + keylen
+  }
+
+  print line
+}
+
+_ACAWK
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then
+  sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g"
+else
+  cat
+fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \
+  || as_fn_error $? "could not setup config files machinery" "$LINENO" 5
+_ACEOF
+
+# VPATH may cause trouble with some makes, so we remove sole $(srcdir),
+# ${srcdir} and @srcdir@ entries 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[	 ]*=[	 ]*/{
+h
+s///
+s/^/:/
+s/[	 ]*$/:/
+s/:\$(srcdir):/:/g
+s/:\${srcdir}:/:/g
+s/:@srcdir@:/:/g
+s/^:*//
+s/:*$//
+x
+s/\(=[	 ]*\).*/\1/
+G
+s/\n//
+s/^[^=]*=[	 ]*$//
+}'
+fi
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+fi # test -n "$CONFIG_FILES"
+
+# Set up the scripts for CONFIG_HEADERS section.
+# No need to generate them if there are no CONFIG_HEADERS.
+# This happens for instance with `./config.status Makefile'.
+if test -n "$CONFIG_HEADERS"; then
+cat >"$ac_tmp/defines.awk" <<\_ACAWK ||
+BEGIN {
+_ACEOF
+
+# Transform confdefs.h into an awk script `defines.awk', embedded as
+# here-document in config.status, that substitutes the proper values into
+# config.h.in to produce config.h.
+
+# Create a delimiter string that does not exist in confdefs.h, to ease
+# handling of long lines.
+ac_delim='%!_!# '
+for ac_last_try in false false :; do
+  ac_tt=`sed -n "/$ac_delim/p" confdefs.h`
+  if test -z "$ac_tt"; then
+    break
+  elif $ac_last_try; then
+    as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5
+  else
+    ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
+  fi
+done
+
+# For the awk script, D is an array of macro values keyed by name,
+# likewise P contains macro parameters if any.  Preserve backslash
+# newline sequences.
+
+ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]*
+sed -n '
+s/.\{148\}/&'"$ac_delim"'/g
+t rset
+:rset
+s/^[	 ]*#[	 ]*define[	 ][	 ]*/ /
+t def
+d
+:def
+s/\\$//
+t bsnl
+s/["\\]/\\&/g
+s/^ \('"$ac_word_re"'\)\(([^()]*)\)[	 ]*\(.*\)/P["\1"]="\2"\
+D["\1"]=" \3"/p
+s/^ \('"$ac_word_re"'\)[	 ]*\(.*\)/D["\1"]=" \2"/p
+d
+:bsnl
+s/["\\]/\\&/g
+s/^ \('"$ac_word_re"'\)\(([^()]*)\)[	 ]*\(.*\)/P["\1"]="\2"\
+D["\1"]=" \3\\\\\\n"\\/p
+t cont
+s/^ \('"$ac_word_re"'\)[	 ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p
+t cont
+d
+:cont
+n
+s/.\{148\}/&'"$ac_delim"'/g
+t clear
+:clear
+s/\\$//
+t bsnlc
+s/["\\]/\\&/g; s/^/"/; s/$/"/p
+d
+:bsnlc
+s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p
+b cont
+' <confdefs.h | sed '
+s/'"$ac_delim"'/"\\\
+"/g' >>$CONFIG_STATUS || ac_write_fail=1
+
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+  for (key in D) D_is_set[key] = 1
+  FS = ""
+}
+/^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ {
+  line = \$ 0
+  split(line, arg, " ")
+  if (arg[1] == "#") {
+    defundef = arg[2]
+    mac1 = arg[3]
+  } else {
+    defundef = substr(arg[1], 2)
+    mac1 = arg[2]
+  }
+  split(mac1, mac2, "(") #)
+  macro = mac2[1]
+  prefix = substr(line, 1, index(line, defundef) - 1)
+  if (D_is_set[macro]) {
+    # Preserve the white space surrounding the "#".
+    print prefix "define", macro P[macro] D[macro]
+    next
+  } else {
+    # 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.
+    if (defundef == "undef") {
+      print "/*", prefix defundef, macro, "*/"
+      next
+    }
+  }
+}
+{ print }
+_ACAWK
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+  as_fn_error $? "could not setup config headers machinery" "$LINENO" 5
+fi # test -n "$CONFIG_HEADERS"
+
+
+eval set X "  :F $CONFIG_FILES  :H $CONFIG_HEADERS    :C $CONFIG_COMMANDS"
+shift
+for ac_tag
+do
+  case $ac_tag in
+  :[FHLC]) ac_mode=$ac_tag; continue;;
+  esac
+  case $ac_mode$ac_tag in
+  :[FHL]*:*);;
+  :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;;
+  :[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="$ac_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 ||
+	   as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;;
+      esac
+      case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac
+      as_fn_append 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 '`
+	  $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g'
+	`' by configure.'
+    if test x"$ac_file" != x-; then
+      configure_input="$ac_file.  $configure_input"
+      { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5
+$as_echo "$as_me: creating $ac_file" >&6;}
+    fi
+    # Neutralize special characters interpreted by sed in replacement strings.
+    case $configure_input in #(
+    *\&* | *\|* | *\\* )
+       ac_sed_conf_input=`$as_echo "$configure_input" |
+       sed 's/[\\\\&|]/\\\\&/g'`;; #(
+    *) ac_sed_conf_input=$configure_input;;
+    esac
+
+    case $ac_tag in
+    *:-:* | *:-) cat >"$ac_tmp/stdin" \
+      || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;;
+    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 ||
+$as_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"; as_fn_mkdir_p
+  ac_builddir=.
+
+case "$ac_dir" in
+.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
+*)
+  ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'`
+  # A ".." for each directory in $ac_dir_suffix.
+  ac_top_builddir_sub=`$as_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
+  ac_MKDIR_P=$MKDIR_P
+  case $MKDIR_P in
+  [\\/$]* | ?:[\\/]* ) ;;
+  */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;;
+  esac
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+# 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=
+ac_sed_dataroot='
+/datarootdir/ {
+  p
+  q
+}
+/@datadir@/p
+/@docdir@/p
+/@infodir@/p
+/@localedir@/p
+/@mandir@/p'
+case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in
+*datarootdir*) ac_datarootdir_seen=yes;;
+*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*)
+  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5
+$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;}
+_ACEOF
+cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
+  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 || ac_write_fail=1
+ac_sed_extra="$ac_vpsub
+$extrasub
+_ACEOF
+cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
+:t
+/@[a-zA-Z_][a-zA-Z_0-9]*@/!b
+s|@configure_input@|$ac_sed_conf_input|;t t
+s&@top_builddir@&$ac_top_builddir_sub&;t t
+s&@top_build_prefix@&$ac_top_build_prefix&;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
+s&@MKDIR_P@&$ac_MKDIR_P&;t t
+$ac_datarootdir_hack
+"
+eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \
+  >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5
+
+test -z "$ac_datarootdir_hack$ac_datarootdir_seen" &&
+  { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } &&
+  { ac_out=`sed -n '/^[	 ]*datarootdir[	 ]*:*=/p' \
+      "$ac_tmp/out"`; test -z "$ac_out"; } &&
+  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir'
+which seems to be undefined.  Please make sure it is defined" >&5
+$as_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 "$ac_tmp/stdin"
+  case $ac_file in
+  -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";;
+  *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";;
+  esac \
+  || as_fn_error $? "could not create $ac_file" "$LINENO" 5
+ ;;
+  :H)
+  #
+  # CONFIG_HEADER
+  #
+  if test x"$ac_file" != x-; then
+    {
+      $as_echo "/* $configure_input  */" \
+      && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs"
+    } >"$ac_tmp/config.h" \
+      || as_fn_error $? "could not create $ac_file" "$LINENO" 5
+    if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then
+      { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5
+$as_echo "$as_me: $ac_file is unchanged" >&6;}
+    else
+      rm -f "$ac_file"
+      mv "$ac_tmp/config.h" "$ac_file" \
+	|| as_fn_error $? "could not create $ac_file" "$LINENO" 5
+    fi
+  else
+    $as_echo "/* $configure_input  */" \
+      && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \
+      || as_fn_error $? "could not create -" "$LINENO" 5
+  fi
+# Compute "$ac_file"'s index in $config_headers.
+_am_arg="$ac_file"
+_am_stamp_count=1
+for _am_header in $config_headers :; do
+  case $_am_header in
+    $_am_arg | $_am_arg:* )
+      break ;;
+    * )
+      _am_stamp_count=`expr $_am_stamp_count + 1` ;;
+  esac
+done
+echo "timestamp for $_am_arg" >`$as_dirname -- "$_am_arg" ||
+$as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+	 X"$_am_arg" : 'X\(//\)[^/]' \| \
+	 X"$_am_arg" : 'X\(//\)$' \| \
+	 X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X"$_am_arg" |
+    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)  { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5
+$as_echo "$as_me: executing $ac_file commands" >&6;}
+ ;;
+  esac
+
+
+  case $ac_file$ac_mode in
+    "scripts/gtest-config":F) chmod +x scripts/gtest-config ;;
+    "depfiles":C) test x"$AMDEP_TRUE" != x"" || {
+  # Autoconf 2.62 quotes --file arguments for eval, but not when files
+  # are listed without --file.  Let's play safe and only enable the eval
+  # if we detect the quoting.
+  case $CONFIG_FILES in
+  *\'*) eval set x "$CONFIG_FILES" ;;
+  *)   set x $CONFIG_FILES ;;
+  esac
+  shift
+  for mf
+  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.
+    # Grep'ing the whole file is not good either: AIX grep has a line
+    # limit of 2048, but all sed's we know have understand at least 4000.
+    if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/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 ||
+$as_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 ||
+$as_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; as_fn_mkdir_p
+      # echo "creating $dirpart/$file"
+      echo '# dummy' > "$dirpart/$file"
+    done
+  done
+}
+ ;;
+    "libtool":C)
+
+    # See if we are running on zsh, and set the options which allow our
+    # commands through without removal of \ escapes.
+    if test -n "${ZSH_VERSION+set}" ; then
+      setopt NO_GLOB_SUBST
+    fi
+
+    cfgfile="${ofile}T"
+    trap "$RM \"$cfgfile\"; exit 1" 1 2 15
+    $RM "$cfgfile"
+
+    cat <<_LT_EOF >> "$cfgfile"
+#! $SHELL
+
+# `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services.
+# Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION
+# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
+# NOTE: Changes made to this file will be lost: look at ltmain.sh.
+#
+#   Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005,
+#                 2006, 2007, 2008, 2009, 2010, 2011 Free Software
+#                 Foundation, Inc.
+#   Written by Gordon Matzigkeit, 1996
+#
+#   This file is part of GNU Libtool.
+#
+# GNU Libtool is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License as
+# published by the Free Software Foundation; either version 2 of
+# the License, or (at your option) any later version.
+#
+# As a special exception to the GNU General Public License,
+# if you distribute this file as part of a program or library that
+# is built using GNU Libtool, you may include this file under the
+# same distribution terms that you use for the rest of that program.
+#
+# GNU Libtool 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 GNU Libtool; see the file COPYING.  If not, a copy
+# can be downloaded from http://www.gnu.org/licenses/gpl.html, or
+# obtained by writing to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+
+# The names of the tagged configurations supported by this script.
+available_tags="CXX "
+
+# ### BEGIN LIBTOOL CONFIG
+
+# Which release of libtool.m4 was used?
+macro_version=$macro_version
+macro_revision=$macro_revision
+
+# Whether or not to build shared libraries.
+build_libtool_libs=$enable_shared
+
+# Whether or not to build static libraries.
+build_old_libs=$enable_static
+
+# What type of objects to build.
+pic_mode=$pic_mode
+
+# Whether or not to optimize for fast installation.
+fast_install=$enable_fast_install
+
+# Shell to use when invoking shell scripts.
+SHELL=$lt_SHELL
+
+# An echo program that protects backslashes.
+ECHO=$lt_ECHO
+
+# The PATH separator for the build system.
+PATH_SEPARATOR=$lt_PATH_SEPARATOR
+
+# The host system.
+host_alias=$host_alias
+host=$host
+host_os=$host_os
+
+# The build system.
+build_alias=$build_alias
+build=$build
+build_os=$build_os
+
+# A sed program that does not truncate output.
+SED=$lt_SED
+
+# Sed that helps us avoid accidentally triggering echo(1) options like -n.
+Xsed="\$SED -e 1s/^X//"
+
+# A grep program that handles long lines.
+GREP=$lt_GREP
+
+# An ERE matcher.
+EGREP=$lt_EGREP
+
+# A literal string matcher.
+FGREP=$lt_FGREP
+
+# A BSD- or MS-compatible name lister.
+NM=$lt_NM
+
+# Whether we need soft or hard links.
+LN_S=$lt_LN_S
+
+# What is the maximum length of a command?
+max_cmd_len=$max_cmd_len
+
+# Object file suffix (normally "o").
+objext=$ac_objext
+
+# Executable file suffix (normally "").
+exeext=$exeext
+
+# whether the shell understands "unset".
+lt_unset=$lt_unset
+
+# turn spaces into newlines.
+SP2NL=$lt_lt_SP2NL
+
+# turn newlines into spaces.
+NL2SP=$lt_lt_NL2SP
+
+# convert \$build file names to \$host format.
+to_host_file_cmd=$lt_cv_to_host_file_cmd
+
+# convert \$build files to toolchain format.
+to_tool_file_cmd=$lt_cv_to_tool_file_cmd
+
+# An object symbol dumper.
+OBJDUMP=$lt_OBJDUMP
+
+# Method to check whether dependent libraries are shared objects.
+deplibs_check_method=$lt_deplibs_check_method
+
+# Command to use when deplibs_check_method = "file_magic".
+file_magic_cmd=$lt_file_magic_cmd
+
+# How to find potential files when deplibs_check_method = "file_magic".
+file_magic_glob=$lt_file_magic_glob
+
+# Find potential files using nocaseglob when deplibs_check_method = "file_magic".
+want_nocaseglob=$lt_want_nocaseglob
+
+# DLL creation program.
+DLLTOOL=$lt_DLLTOOL
+
+# Command to associate shared and link libraries.
+sharedlib_from_linklib_cmd=$lt_sharedlib_from_linklib_cmd
+
+# The archiver.
+AR=$lt_AR
+
+# Flags to create an archive.
+AR_FLAGS=$lt_AR_FLAGS
+
+# How to feed a file listing to the archiver.
+archiver_list_spec=$lt_archiver_list_spec
+
+# A symbol stripping program.
+STRIP=$lt_STRIP
+
+# Commands used to install an old-style archive.
+RANLIB=$lt_RANLIB
+old_postinstall_cmds=$lt_old_postinstall_cmds
+old_postuninstall_cmds=$lt_old_postuninstall_cmds
+
+# Whether to use a lock for old archive extraction.
+lock_old_archive_extraction=$lock_old_archive_extraction
+
+# A C compiler.
+LTCC=$lt_CC
+
+# LTCC compiler flags.
+LTCFLAGS=$lt_CFLAGS
+
+# Take the output of nm and produce a listing of raw symbols and C names.
+global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe
+
+# Transform the output of nm in a proper C declaration.
+global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl
+
+# Transform the output of nm in a C name address pair.
+global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address
+
+# Transform the output of nm in a C name address pair when lib prefix is needed.
+global_symbol_to_c_name_address_lib_prefix=$lt_lt_cv_sys_global_symbol_to_c_name_address_lib_prefix
+
+# Specify filename containing input files for \$NM.
+nm_file_list_spec=$lt_nm_file_list_spec
+
+# The root where to search for dependent libraries,and in which our libraries should be installed.
+lt_sysroot=$lt_sysroot
+
+# The name of the directory that contains temporary libtool files.
+objdir=$objdir
+
+# Used to examine libraries when file_magic_cmd begins with "file".
+MAGIC_CMD=$MAGIC_CMD
+
+# Must we lock files when doing compilation?
+need_locks=$lt_need_locks
+
+# Manifest tool.
+MANIFEST_TOOL=$lt_MANIFEST_TOOL
+
+# Tool to manipulate archived DWARF debug symbol files on Mac OS X.
+DSYMUTIL=$lt_DSYMUTIL
+
+# Tool to change global to local symbols on Mac OS X.
+NMEDIT=$lt_NMEDIT
+
+# Tool to manipulate fat objects and archives on Mac OS X.
+LIPO=$lt_LIPO
+
+# ldd/readelf like tool for Mach-O binaries on Mac OS X.
+OTOOL=$lt_OTOOL
+
+# ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4.
+OTOOL64=$lt_OTOOL64
+
+# Old archive suffix (normally "a").
+libext=$libext
+
+# Shared library suffix (normally ".so").
+shrext_cmds=$lt_shrext_cmds
+
+# The commands to extract the exported symbol list from a shared archive.
+extract_expsyms_cmds=$lt_extract_expsyms_cmds
+
+# Variables whose values should be saved in libtool wrapper scripts and
+# restored at link time.
+variables_saved_for_relink=$lt_variables_saved_for_relink
+
+# Do we need the "lib" prefix for modules?
+need_lib_prefix=$need_lib_prefix
+
+# Do we need a version for libraries?
+need_version=$need_version
+
+# Library versioning type.
+version_type=$version_type
+
+# Shared library runtime path variable.
+runpath_var=$runpath_var
+
+# Shared library path variable.
+shlibpath_var=$shlibpath_var
+
+# Is shlibpath searched before the hard-coded library search path?
+shlibpath_overrides_runpath=$shlibpath_overrides_runpath
+
+# Format of library name prefix.
+libname_spec=$lt_libname_spec
+
+# List of archive names.  First name is the real one, the rest are links.
+# The last name is the one that the linker finds with -lNAME
+library_names_spec=$lt_library_names_spec
+
+# The coded name of the library, if different from the real name.
+soname_spec=$lt_soname_spec
+
+# Permission mode override for installation of shared libraries.
+install_override_mode=$lt_install_override_mode
+
+# Command to use after installation of a shared archive.
+postinstall_cmds=$lt_postinstall_cmds
+
+# Command to use after uninstallation of a shared archive.
+postuninstall_cmds=$lt_postuninstall_cmds
+
+# Commands used to finish a libtool library installation in a directory.
+finish_cmds=$lt_finish_cmds
+
+# As "finish_cmds", except a single script fragment to be evaled but
+# not shown.
+finish_eval=$lt_finish_eval
+
+# Whether we should hardcode library paths into libraries.
+hardcode_into_libs=$hardcode_into_libs
+
+# Compile-time system search path for libraries.
+sys_lib_search_path_spec=$lt_sys_lib_search_path_spec
+
+# Run-time system search path for libraries.
+sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec
+
+# Whether dlopen is supported.
+dlopen_support=$enable_dlopen
+
+# Whether dlopen of programs is supported.
+dlopen_self=$enable_dlopen_self
+
+# Whether dlopen of statically linked programs is supported.
+dlopen_self_static=$enable_dlopen_self_static
+
+# Commands to strip libraries.
+old_striplib=$lt_old_striplib
+striplib=$lt_striplib
+
+
+# The linker used to build libraries.
+LD=$lt_LD
+
+# How to create reloadable object files.
+reload_flag=$lt_reload_flag
+reload_cmds=$lt_reload_cmds
+
+# Commands used to build an old-style archive.
+old_archive_cmds=$lt_old_archive_cmds
+
+# A language specific compiler.
+CC=$lt_compiler
+
+# Is the compiler the GNU compiler?
+with_gcc=$GCC
+
+# Compiler flag to turn off builtin functions.
+no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag
+
+# Additional compiler flags for building library objects.
+pic_flag=$lt_lt_prog_compiler_pic
+
+# How to pass a linker flag through the compiler.
+wl=$lt_lt_prog_compiler_wl
+
+# Compiler flag to prevent dynamic linking.
+link_static_flag=$lt_lt_prog_compiler_static
+
+# Does compiler simultaneously support -c and -o options?
+compiler_c_o=$lt_lt_cv_prog_compiler_c_o
+
+# Whether or not to add -lc for building shared libraries.
+build_libtool_need_lc=$archive_cmds_need_lc
+
+# Whether or not to disallow shared libs when runtime libs are static.
+allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes
+
+# Compiler flag to allow reflexive dlopens.
+export_dynamic_flag_spec=$lt_export_dynamic_flag_spec
+
+# Compiler flag to generate shared objects directly from archives.
+whole_archive_flag_spec=$lt_whole_archive_flag_spec
+
+# Whether the compiler copes with passing no objects directly.
+compiler_needs_object=$lt_compiler_needs_object
+
+# Create an old-style archive from a shared archive.
+old_archive_from_new_cmds=$lt_old_archive_from_new_cmds
+
+# Create a temporary old-style archive to link instead of a shared archive.
+old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds
+
+# Commands used to build a shared archive.
+archive_cmds=$lt_archive_cmds
+archive_expsym_cmds=$lt_archive_expsym_cmds
+
+# Commands used to build a loadable module if different from building
+# a shared archive.
+module_cmds=$lt_module_cmds
+module_expsym_cmds=$lt_module_expsym_cmds
+
+# Whether we are building with GNU ld or not.
+with_gnu_ld=$lt_with_gnu_ld
+
+# Flag that allows shared libraries with undefined symbols to be built.
+allow_undefined_flag=$lt_allow_undefined_flag
+
+# Flag that enforces no undefined symbols.
+no_undefined_flag=$lt_no_undefined_flag
+
+# Flag to hardcode \$libdir into a binary during linking.
+# This must work even if \$libdir does not exist
+hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec
+
+# Whether we need a single "-rpath" flag with a separated argument.
+hardcode_libdir_separator=$lt_hardcode_libdir_separator
+
+# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes
+# DIR into the resulting binary.
+hardcode_direct=$hardcode_direct
+
+# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes
+# DIR into the resulting binary and the resulting library dependency is
+# "absolute",i.e impossible to change by setting \${shlibpath_var} if the
+# library is relocated.
+hardcode_direct_absolute=$hardcode_direct_absolute
+
+# Set to "yes" if using the -LDIR flag during linking hardcodes DIR
+# into the resulting binary.
+hardcode_minus_L=$hardcode_minus_L
+
+# Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR
+# into the resulting binary.
+hardcode_shlibpath_var=$hardcode_shlibpath_var
+
+# Set to "yes" if building a shared library automatically hardcodes DIR
+# into the library and all subsequent libraries and executables linked
+# against it.
+hardcode_automatic=$hardcode_automatic
+
+# Set to yes if linker adds runtime paths of dependent libraries
+# to runtime path list.
+inherit_rpath=$inherit_rpath
+
+# Whether libtool must link a program against all its dependency libraries.
+link_all_deplibs=$link_all_deplibs
+
+# Set to "yes" if exported symbols are required.
+always_export_symbols=$always_export_symbols
+
+# The commands to list exported symbols.
+export_symbols_cmds=$lt_export_symbols_cmds
+
+# Symbols that should not be listed in the preloaded symbols.
+exclude_expsyms=$lt_exclude_expsyms
+
+# Symbols that must always be exported.
+include_expsyms=$lt_include_expsyms
+
+# Commands necessary for linking programs (against libraries) with templates.
+prelink_cmds=$lt_prelink_cmds
+
+# Commands necessary for finishing linking programs.
+postlink_cmds=$lt_postlink_cmds
+
+# Specify filename containing input files.
+file_list_spec=$lt_file_list_spec
+
+# How to hardcode a shared library path into an executable.
+hardcode_action=$hardcode_action
+
+# The directories searched by this compiler when creating a shared library.
+compiler_lib_search_dirs=$lt_compiler_lib_search_dirs
+
+# Dependencies to place before and after the objects being linked to
+# create a shared library.
+predep_objects=$lt_predep_objects
+postdep_objects=$lt_postdep_objects
+predeps=$lt_predeps
+postdeps=$lt_postdeps
+
+# The library search path used internally by the compiler when linking
+# a shared library.
+compiler_lib_search_path=$lt_compiler_lib_search_path
+
+# ### END LIBTOOL CONFIG
+
+_LT_EOF
+
+  case $host_os in
+  aix3*)
+    cat <<\_LT_EOF >> "$cfgfile"
+# AIX sometimes has problems with the GCC collect2 program.  For some
+# reason, if we set the COLLECT_NAMES environment variable, the problems
+# vanish in a puff of smoke.
+if test "X${COLLECT_NAMES+set}" != Xset; then
+  COLLECT_NAMES=
+  export COLLECT_NAMES
+fi
+_LT_EOF
+    ;;
+  esac
+
+
+ltmain="$ac_aux_dir/ltmain.sh"
+
+
+  # We use sed instead of cat because bash on DJGPP gets confused if
+  # if finds mixed CR/LF and LF-only lines.  Since sed operates in
+  # text mode, it properly converts lines to CR/LF.  This bash problem
+  # is reportedly fixed, but why not run on old versions too?
+  sed '$q' "$ltmain" >> "$cfgfile" \
+     || (rm -f "$cfgfile"; exit 1)
+
+  if test x"$xsi_shell" = xyes; then
+  sed -e '/^func_dirname ()$/,/^} # func_dirname /c\
+func_dirname ()\
+{\
+\    case ${1} in\
+\      */*) func_dirname_result="${1%/*}${2}" ;;\
+\      *  ) func_dirname_result="${3}" ;;\
+\    esac\
+} # Extended-shell func_dirname implementation' "$cfgfile" > $cfgfile.tmp \
+  && mv -f "$cfgfile.tmp" "$cfgfile" \
+    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+test 0 -eq $? || _lt_function_replace_fail=:
+
+
+  sed -e '/^func_basename ()$/,/^} # func_basename /c\
+func_basename ()\
+{\
+\    func_basename_result="${1##*/}"\
+} # Extended-shell func_basename implementation' "$cfgfile" > $cfgfile.tmp \
+  && mv -f "$cfgfile.tmp" "$cfgfile" \
+    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+test 0 -eq $? || _lt_function_replace_fail=:
+
+
+  sed -e '/^func_dirname_and_basename ()$/,/^} # func_dirname_and_basename /c\
+func_dirname_and_basename ()\
+{\
+\    case ${1} in\
+\      */*) func_dirname_result="${1%/*}${2}" ;;\
+\      *  ) func_dirname_result="${3}" ;;\
+\    esac\
+\    func_basename_result="${1##*/}"\
+} # Extended-shell func_dirname_and_basename implementation' "$cfgfile" > $cfgfile.tmp \
+  && mv -f "$cfgfile.tmp" "$cfgfile" \
+    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+test 0 -eq $? || _lt_function_replace_fail=:
+
+
+  sed -e '/^func_stripname ()$/,/^} # func_stripname /c\
+func_stripname ()\
+{\
+\    # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are\
+\    # positional parameters, so assign one to ordinary parameter first.\
+\    func_stripname_result=${3}\
+\    func_stripname_result=${func_stripname_result#"${1}"}\
+\    func_stripname_result=${func_stripname_result%"${2}"}\
+} # Extended-shell func_stripname implementation' "$cfgfile" > $cfgfile.tmp \
+  && mv -f "$cfgfile.tmp" "$cfgfile" \
+    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+test 0 -eq $? || _lt_function_replace_fail=:
+
+
+  sed -e '/^func_split_long_opt ()$/,/^} # func_split_long_opt /c\
+func_split_long_opt ()\
+{\
+\    func_split_long_opt_name=${1%%=*}\
+\    func_split_long_opt_arg=${1#*=}\
+} # Extended-shell func_split_long_opt implementation' "$cfgfile" > $cfgfile.tmp \
+  && mv -f "$cfgfile.tmp" "$cfgfile" \
+    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+test 0 -eq $? || _lt_function_replace_fail=:
+
+
+  sed -e '/^func_split_short_opt ()$/,/^} # func_split_short_opt /c\
+func_split_short_opt ()\
+{\
+\    func_split_short_opt_arg=${1#??}\
+\    func_split_short_opt_name=${1%"$func_split_short_opt_arg"}\
+} # Extended-shell func_split_short_opt implementation' "$cfgfile" > $cfgfile.tmp \
+  && mv -f "$cfgfile.tmp" "$cfgfile" \
+    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+test 0 -eq $? || _lt_function_replace_fail=:
+
+
+  sed -e '/^func_lo2o ()$/,/^} # func_lo2o /c\
+func_lo2o ()\
+{\
+\    case ${1} in\
+\      *.lo) func_lo2o_result=${1%.lo}.${objext} ;;\
+\      *)    func_lo2o_result=${1} ;;\
+\    esac\
+} # Extended-shell func_lo2o implementation' "$cfgfile" > $cfgfile.tmp \
+  && mv -f "$cfgfile.tmp" "$cfgfile" \
+    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+test 0 -eq $? || _lt_function_replace_fail=:
+
+
+  sed -e '/^func_xform ()$/,/^} # func_xform /c\
+func_xform ()\
+{\
+    func_xform_result=${1%.*}.lo\
+} # Extended-shell func_xform implementation' "$cfgfile" > $cfgfile.tmp \
+  && mv -f "$cfgfile.tmp" "$cfgfile" \
+    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+test 0 -eq $? || _lt_function_replace_fail=:
+
+
+  sed -e '/^func_arith ()$/,/^} # func_arith /c\
+func_arith ()\
+{\
+    func_arith_result=$(( $* ))\
+} # Extended-shell func_arith implementation' "$cfgfile" > $cfgfile.tmp \
+  && mv -f "$cfgfile.tmp" "$cfgfile" \
+    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+test 0 -eq $? || _lt_function_replace_fail=:
+
+
+  sed -e '/^func_len ()$/,/^} # func_len /c\
+func_len ()\
+{\
+    func_len_result=${#1}\
+} # Extended-shell func_len implementation' "$cfgfile" > $cfgfile.tmp \
+  && mv -f "$cfgfile.tmp" "$cfgfile" \
+    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+test 0 -eq $? || _lt_function_replace_fail=:
+
+fi
+
+if test x"$lt_shell_append" = xyes; then
+  sed -e '/^func_append ()$/,/^} # func_append /c\
+func_append ()\
+{\
+    eval "${1}+=\\${2}"\
+} # Extended-shell func_append implementation' "$cfgfile" > $cfgfile.tmp \
+  && mv -f "$cfgfile.tmp" "$cfgfile" \
+    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+test 0 -eq $? || _lt_function_replace_fail=:
+
+
+  sed -e '/^func_append_quoted ()$/,/^} # func_append_quoted /c\
+func_append_quoted ()\
+{\
+\    func_quote_for_eval "${2}"\
+\    eval "${1}+=\\\\ \\$func_quote_for_eval_result"\
+} # Extended-shell func_append_quoted implementation' "$cfgfile" > $cfgfile.tmp \
+  && mv -f "$cfgfile.tmp" "$cfgfile" \
+    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+test 0 -eq $? || _lt_function_replace_fail=:
+
+
+  # Save a `func_append' function call where possible by direct use of '+='
+  sed -e 's%func_append \([a-zA-Z_]\{1,\}\) "%\1+="%g' $cfgfile > $cfgfile.tmp \
+    && mv -f "$cfgfile.tmp" "$cfgfile" \
+      || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+  test 0 -eq $? || _lt_function_replace_fail=:
+else
+  # Save a `func_append' function call even when '+=' is not available
+  sed -e 's%func_append \([a-zA-Z_]\{1,\}\) "%\1="$\1%g' $cfgfile > $cfgfile.tmp \
+    && mv -f "$cfgfile.tmp" "$cfgfile" \
+      || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+  test 0 -eq $? || _lt_function_replace_fail=:
+fi
+
+if test x"$_lt_function_replace_fail" = x":"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Unable to substitute extended shell functions in $ofile" >&5
+$as_echo "$as_me: WARNING: Unable to substitute extended shell functions in $ofile" >&2;}
+fi
+
+
+   mv -f "$cfgfile" "$ofile" ||
+    (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile")
+  chmod +x "$ofile"
+
+
+    cat <<_LT_EOF >> "$ofile"
+
+# ### BEGIN LIBTOOL TAG CONFIG: CXX
+
+# The linker used to build libraries.
+LD=$lt_LD_CXX
+
+# How to create reloadable object files.
+reload_flag=$lt_reload_flag_CXX
+reload_cmds=$lt_reload_cmds_CXX
+
+# Commands used to build an old-style archive.
+old_archive_cmds=$lt_old_archive_cmds_CXX
+
+# A language specific compiler.
+CC=$lt_compiler_CXX
+
+# Is the compiler the GNU compiler?
+with_gcc=$GCC_CXX
+
+# Compiler flag to turn off builtin functions.
+no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_CXX
+
+# Additional compiler flags for building library objects.
+pic_flag=$lt_lt_prog_compiler_pic_CXX
+
+# How to pass a linker flag through the compiler.
+wl=$lt_lt_prog_compiler_wl_CXX
+
+# Compiler flag to prevent dynamic linking.
+link_static_flag=$lt_lt_prog_compiler_static_CXX
+
+# Does compiler simultaneously support -c and -o options?
+compiler_c_o=$lt_lt_cv_prog_compiler_c_o_CXX
+
+# Whether or not to add -lc for building shared libraries.
+build_libtool_need_lc=$archive_cmds_need_lc_CXX
+
+# Whether or not to disallow shared libs when runtime libs are static.
+allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_CXX
+
+# Compiler flag to allow reflexive dlopens.
+export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_CXX
+
+# Compiler flag to generate shared objects directly from archives.
+whole_archive_flag_spec=$lt_whole_archive_flag_spec_CXX
+
+# Whether the compiler copes with passing no objects directly.
+compiler_needs_object=$lt_compiler_needs_object_CXX
+
+# Create an old-style archive from a shared archive.
+old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_CXX
+
+# Create a temporary old-style archive to link instead of a shared archive.
+old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_CXX
+
+# Commands used to build a shared archive.
+archive_cmds=$lt_archive_cmds_CXX
+archive_expsym_cmds=$lt_archive_expsym_cmds_CXX
+
+# Commands used to build a loadable module if different from building
+# a shared archive.
+module_cmds=$lt_module_cmds_CXX
+module_expsym_cmds=$lt_module_expsym_cmds_CXX
+
+# Whether we are building with GNU ld or not.
+with_gnu_ld=$lt_with_gnu_ld_CXX
+
+# Flag that allows shared libraries with undefined symbols to be built.
+allow_undefined_flag=$lt_allow_undefined_flag_CXX
+
+# Flag that enforces no undefined symbols.
+no_undefined_flag=$lt_no_undefined_flag_CXX
+
+# Flag to hardcode \$libdir into a binary during linking.
+# This must work even if \$libdir does not exist
+hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_CXX
+
+# Whether we need a single "-rpath" flag with a separated argument.
+hardcode_libdir_separator=$lt_hardcode_libdir_separator_CXX
+
+# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes
+# DIR into the resulting binary.
+hardcode_direct=$hardcode_direct_CXX
+
+# Set to "yes" if using DIR/libNAME\${shared_ext} during linking hardcodes
+# DIR into the resulting binary and the resulting library dependency is
+# "absolute",i.e impossible to change by setting \${shlibpath_var} if the
+# library is relocated.
+hardcode_direct_absolute=$hardcode_direct_absolute_CXX
+
+# Set to "yes" if using the -LDIR flag during linking hardcodes DIR
+# into the resulting binary.
+hardcode_minus_L=$hardcode_minus_L_CXX
+
+# Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR
+# into the resulting binary.
+hardcode_shlibpath_var=$hardcode_shlibpath_var_CXX
+
+# Set to "yes" if building a shared library automatically hardcodes DIR
+# into the library and all subsequent libraries and executables linked
+# against it.
+hardcode_automatic=$hardcode_automatic_CXX
+
+# Set to yes if linker adds runtime paths of dependent libraries
+# to runtime path list.
+inherit_rpath=$inherit_rpath_CXX
+
+# Whether libtool must link a program against all its dependency libraries.
+link_all_deplibs=$link_all_deplibs_CXX
+
+# Set to "yes" if exported symbols are required.
+always_export_symbols=$always_export_symbols_CXX
+
+# The commands to list exported symbols.
+export_symbols_cmds=$lt_export_symbols_cmds_CXX
+
+# Symbols that should not be listed in the preloaded symbols.
+exclude_expsyms=$lt_exclude_expsyms_CXX
+
+# Symbols that must always be exported.
+include_expsyms=$lt_include_expsyms_CXX
+
+# Commands necessary for linking programs (against libraries) with templates.
+prelink_cmds=$lt_prelink_cmds_CXX
+
+# Commands necessary for finishing linking programs.
+postlink_cmds=$lt_postlink_cmds_CXX
+
+# Specify filename containing input files.
+file_list_spec=$lt_file_list_spec_CXX
+
+# How to hardcode a shared library path into an executable.
+hardcode_action=$hardcode_action_CXX
+
+# The directories searched by this compiler when creating a shared library.
+compiler_lib_search_dirs=$lt_compiler_lib_search_dirs_CXX
+
+# Dependencies to place before and after the objects being linked to
+# create a shared library.
+predep_objects=$lt_predep_objects_CXX
+postdep_objects=$lt_postdep_objects_CXX
+predeps=$lt_predeps_CXX
+postdeps=$lt_postdeps_CXX
+
+# The library search path used internally by the compiler when linking
+# a shared library.
+compiler_lib_search_path=$lt_compiler_lib_search_path_CXX
+
+# ### END LIBTOOL TAG CONFIG: CXX
+_LT_EOF
+
+ ;;
+
+  esac
+done # for ac_tag
+
+
+as_fn_exit 0
+_ACEOF
+ac_clean_files=$ac_clean_files_save
+
+test $ac_write_fail = 0 ||
+  as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5
+
+
+# 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 || as_fn_exit 1
+fi
+if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5
+$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;}
+fi
+
diff --git a/contrib/gtest-1.7.0/configure.ac b/contrib/gtest-1.7.0/configure.ac
new file mode 100644
index 0000000..cc592e1
--- /dev/null
+++ b/contrib/gtest-1.7.0/configure.ac
@@ -0,0 +1,68 @@
+m4_include(m4/acx_pthread.m4)
+
+# At this point, the Xcode project assumes the version string will be three
+# integers separated by periods and surrounded by square brackets (e.g.
+# "[1.0.1]"). It also asumes that there won't be any closing parenthesis
+# between "AC_INIT(" and the closing ")" including comments and strings.
+AC_INIT([Google C++ Testing Framework],
+        [1.7.0],
+        [googletestframework at googlegroups.com],
+        [gtest])
+
+# Provide various options to initialize the Autoconf and configure processes.
+AC_PREREQ([2.59])
+AC_CONFIG_SRCDIR([./LICENSE])
+AC_CONFIG_MACRO_DIR([m4])
+AC_CONFIG_AUX_DIR([build-aux])
+AC_CONFIG_HEADERS([build-aux/config.h])
+AC_CONFIG_FILES([Makefile])
+AC_CONFIG_FILES([scripts/gtest-config], [chmod +x scripts/gtest-config])
+
+# Initialize Automake with various options. We require at least v1.9, prevent
+# pedantic complaints about package files, and enable various distribution
+# targets.
+AM_INIT_AUTOMAKE([1.9 dist-bzip2 dist-zip foreign subdir-objects])
+
+# Check for programs used in building Google Test.
+AC_PROG_CC
+AC_PROG_CXX
+AC_LANG([C++])
+AC_PROG_LIBTOOL
+
+# TODO(chandlerc at google.com): Currently we aren't running the Python tests
+# against the interpreter detected by AM_PATH_PYTHON, and so we condition
+# HAVE_PYTHON by requiring "python" to be in the PATH, and that interpreter's
+# version to be >= 2.3. This will allow the scripts to use a "/usr/bin/env"
+# hashbang.
+PYTHON=  # We *do not* allow the user to specify a python interpreter
+AC_PATH_PROG([PYTHON],[python],[:])
+AS_IF([test "$PYTHON" != ":"],
+      [AM_PYTHON_CHECK_VERSION([$PYTHON],[2.3],[:],[PYTHON=":"])])
+AM_CONDITIONAL([HAVE_PYTHON],[test "$PYTHON" != ":"])
+
+# Configure pthreads.
+AC_ARG_WITH([pthreads],
+            [AS_HELP_STRING([--with-pthreads],
+               [use pthreads (default is yes)])],
+            [with_pthreads=$withval],
+            [with_pthreads=check])
+
+have_pthreads=no
+AS_IF([test "x$with_pthreads" != "xno"],
+      [ACX_PTHREAD(
+        [],
+        [AS_IF([test "x$with_pthreads" != "xcheck"],
+               [AC_MSG_FAILURE(
+                 [--with-pthreads was specified, but unable to be used])])])
+       have_pthreads="$acx_pthread_ok"])
+AM_CONDITIONAL([HAVE_PTHREADS],[test "x$have_pthreads" = "xyes"])
+AC_SUBST(PTHREAD_CFLAGS)
+AC_SUBST(PTHREAD_LIBS)
+
+# TODO(chandlerc at google.com) Check for the necessary system headers.
+
+# TODO(chandlerc at google.com) Check the types, structures, and other compiler
+# and architecture characteristics.
+
+# Output the generated files. No further autoconf macros may be used.
+AC_OUTPUT
diff --git a/contrib/gtest-1.7.0/fused-src/gtest/gtest-all.cc b/contrib/gtest-1.7.0/fused-src/gtest/gtest-all.cc
new file mode 100644
index 0000000..a9a03b2
--- /dev/null
+++ b/contrib/gtest-1.7.0/fused-src/gtest/gtest-all.cc
@@ -0,0 +1,9592 @@
+// Copyright 2008, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: mheule at google.com (Markus Heule)
+//
+// Google C++ Testing Framework (Google Test)
+//
+// Sometimes it's desirable to build Google Test by compiling a single file.
+// This file serves this purpose.
+
+// This line ensures that gtest.h can be compiled on its own, even
+// when it's fused.
+#include "gtest/gtest.h"
+
+// The following lines pull in the real gtest *.cc files.
+// Copyright 2005, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+//
+// The Google C++ Testing Framework (Google Test)
+
+// Copyright 2007, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+//
+// Utilities for testing Google Test itself and code that uses Google Test
+// (e.g. frameworks built on top of Google Test).
+
+#ifndef GTEST_INCLUDE_GTEST_GTEST_SPI_H_
+#define GTEST_INCLUDE_GTEST_GTEST_SPI_H_
+
+
+namespace testing {
+
+// This helper class can be used to mock out Google Test failure reporting
+// so that we can test Google Test or code that builds on Google Test.
+//
+// An object of this class appends a TestPartResult object to the
+// TestPartResultArray object given in the constructor whenever a Google Test
+// failure is reported. It can either intercept only failures that are
+// generated in the same thread that created this object or it can intercept
+// all generated failures. The scope of this mock object can be controlled with
+// the second argument to the two arguments constructor.
+class GTEST_API_ ScopedFakeTestPartResultReporter
+    : public TestPartResultReporterInterface {
+ public:
+  // The two possible mocking modes of this object.
+  enum InterceptMode {
+    INTERCEPT_ONLY_CURRENT_THREAD,  // Intercepts only thread local failures.
+    INTERCEPT_ALL_THREADS           // Intercepts all failures.
+  };
+
+  // The c'tor sets this object as the test part result reporter used
+  // by Google Test.  The 'result' parameter specifies where to report the
+  // results. This reporter will only catch failures generated in the current
+  // thread. DEPRECATED
+  explicit ScopedFakeTestPartResultReporter(TestPartResultArray* result);
+
+  // Same as above, but you can choose the interception scope of this object.
+  ScopedFakeTestPartResultReporter(InterceptMode intercept_mode,
+                                   TestPartResultArray* result);
+
+  // The d'tor restores the previous test part result reporter.
+  virtual ~ScopedFakeTestPartResultReporter();
+
+  // Appends the TestPartResult object to the TestPartResultArray
+  // received in the constructor.
+  //
+  // This method is from the TestPartResultReporterInterface
+  // interface.
+  virtual void ReportTestPartResult(const TestPartResult& result);
+ private:
+  void Init();
+
+  const InterceptMode intercept_mode_;
+  TestPartResultReporterInterface* old_reporter_;
+  TestPartResultArray* const result_;
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(ScopedFakeTestPartResultReporter);
+};
+
+namespace internal {
+
+// A helper class for implementing EXPECT_FATAL_FAILURE() and
+// EXPECT_NONFATAL_FAILURE().  Its destructor verifies that the given
+// TestPartResultArray contains exactly one failure that has the given
+// type and contains the given substring.  If that's not the case, a
+// non-fatal failure will be generated.
+class GTEST_API_ SingleFailureChecker {
+ public:
+  // The constructor remembers the arguments.
+  SingleFailureChecker(const TestPartResultArray* results,
+                       TestPartResult::Type type,
+                       const string& substr);
+  ~SingleFailureChecker();
+ private:
+  const TestPartResultArray* const results_;
+  const TestPartResult::Type type_;
+  const string substr_;
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(SingleFailureChecker);
+};
+
+}  // namespace internal
+
+}  // namespace testing
+
+// A set of macros for testing Google Test assertions or code that's expected
+// to generate Google Test fatal failures.  It verifies that the given
+// statement will cause exactly one fatal Google Test failure with 'substr'
+// being part of the failure message.
+//
+// There are two different versions of this macro. EXPECT_FATAL_FAILURE only
+// affects and considers failures generated in the current thread and
+// EXPECT_FATAL_FAILURE_ON_ALL_THREADS does the same but for all threads.
+//
+// The verification of the assertion is done correctly even when the statement
+// throws an exception or aborts the current function.
+//
+// Known restrictions:
+//   - 'statement' cannot reference local non-static variables or
+//     non-static members of the current object.
+//   - 'statement' cannot return a value.
+//   - You cannot stream a failure message to this macro.
+//
+// Note that even though the implementations of the following two
+// macros are much alike, we cannot refactor them to use a common
+// helper macro, due to some peculiarity in how the preprocessor
+// works.  The AcceptsMacroThatExpandsToUnprotectedComma test in
+// gtest_unittest.cc will fail to compile if we do that.
+#define EXPECT_FATAL_FAILURE(statement, substr) \
+  do { \
+    class GTestExpectFatalFailureHelper {\
+     public:\
+      static void Execute() { statement; }\
+    };\
+    ::testing::TestPartResultArray gtest_failures;\
+    ::testing::internal::SingleFailureChecker gtest_checker(\
+        &gtest_failures, ::testing::TestPartResult::kFatalFailure, (substr));\
+    {\
+      ::testing::ScopedFakeTestPartResultReporter gtest_reporter(\
+          ::testing::ScopedFakeTestPartResultReporter:: \
+          INTERCEPT_ONLY_CURRENT_THREAD, &gtest_failures);\
+      GTestExpectFatalFailureHelper::Execute();\
+    }\
+  } while (::testing::internal::AlwaysFalse())
+
+#define EXPECT_FATAL_FAILURE_ON_ALL_THREADS(statement, substr) \
+  do { \
+    class GTestExpectFatalFailureHelper {\
+     public:\
+      static void Execute() { statement; }\
+    };\
+    ::testing::TestPartResultArray gtest_failures;\
+    ::testing::internal::SingleFailureChecker gtest_checker(\
+        &gtest_failures, ::testing::TestPartResult::kFatalFailure, (substr));\
+    {\
+      ::testing::ScopedFakeTestPartResultReporter gtest_reporter(\
+          ::testing::ScopedFakeTestPartResultReporter:: \
+          INTERCEPT_ALL_THREADS, &gtest_failures);\
+      GTestExpectFatalFailureHelper::Execute();\
+    }\
+  } while (::testing::internal::AlwaysFalse())
+
+// A macro for testing Google Test assertions or code that's expected to
+// generate Google Test non-fatal failures.  It asserts that the given
+// statement will cause exactly one non-fatal Google Test failure with 'substr'
+// being part of the failure message.
+//
+// There are two different versions of this macro. EXPECT_NONFATAL_FAILURE only
+// affects and considers failures generated in the current thread and
+// EXPECT_NONFATAL_FAILURE_ON_ALL_THREADS does the same but for all threads.
+//
+// 'statement' is allowed to reference local variables and members of
+// the current object.
+//
+// The verification of the assertion is done correctly even when the statement
+// throws an exception or aborts the current function.
+//
+// Known restrictions:
+//   - You cannot stream a failure message to this macro.
+//
+// Note that even though the implementations of the following two
+// macros are much alike, we cannot refactor them to use a common
+// helper macro, due to some peculiarity in how the preprocessor
+// works.  If we do that, the code won't compile when the user gives
+// EXPECT_NONFATAL_FAILURE() a statement that contains a macro that
+// expands to code containing an unprotected comma.  The
+// AcceptsMacroThatExpandsToUnprotectedComma test in gtest_unittest.cc
+// catches that.
+//
+// For the same reason, we have to write
+//   if (::testing::internal::AlwaysTrue()) { statement; }
+// instead of
+//   GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement)
+// to avoid an MSVC warning on unreachable code.
+#define EXPECT_NONFATAL_FAILURE(statement, substr) \
+  do {\
+    ::testing::TestPartResultArray gtest_failures;\
+    ::testing::internal::SingleFailureChecker gtest_checker(\
+        &gtest_failures, ::testing::TestPartResult::kNonFatalFailure, \
+        (substr));\
+    {\
+      ::testing::ScopedFakeTestPartResultReporter gtest_reporter(\
+          ::testing::ScopedFakeTestPartResultReporter:: \
+          INTERCEPT_ONLY_CURRENT_THREAD, &gtest_failures);\
+      if (::testing::internal::AlwaysTrue()) { statement; }\
+    }\
+  } while (::testing::internal::AlwaysFalse())
+
+#define EXPECT_NONFATAL_FAILURE_ON_ALL_THREADS(statement, substr) \
+  do {\
+    ::testing::TestPartResultArray gtest_failures;\
+    ::testing::internal::SingleFailureChecker gtest_checker(\
+        &gtest_failures, ::testing::TestPartResult::kNonFatalFailure, \
+        (substr));\
+    {\
+      ::testing::ScopedFakeTestPartResultReporter gtest_reporter(\
+          ::testing::ScopedFakeTestPartResultReporter::INTERCEPT_ALL_THREADS, \
+          &gtest_failures);\
+      if (::testing::internal::AlwaysTrue()) { statement; }\
+    }\
+  } while (::testing::internal::AlwaysFalse())
+
+#endif  // GTEST_INCLUDE_GTEST_GTEST_SPI_H_
+
+#include <ctype.h>
+#include <math.h>
+#include <stdarg.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <time.h>
+#include <wchar.h>
+#include <wctype.h>
+
+#include <algorithm>
+#include <iomanip>
+#include <limits>
+#include <ostream>  // NOLINT
+#include <sstream>
+#include <vector>
+
+#if GTEST_OS_LINUX
+
+// TODO(kenton at google.com): Use autoconf to detect availability of
+// gettimeofday().
+# define GTEST_HAS_GETTIMEOFDAY_ 1
+
+# include <fcntl.h>  // NOLINT
+# include <limits.h>  // NOLINT
+# include <sched.h>  // NOLINT
+// Declares vsnprintf().  This header is not available on Windows.
+# include <strings.h>  // NOLINT
+# include <sys/mman.h>  // NOLINT
+# include <sys/time.h>  // NOLINT
+# include <unistd.h>  // NOLINT
+# include <string>
+
+#elif GTEST_OS_SYMBIAN
+# define GTEST_HAS_GETTIMEOFDAY_ 1
+# include <sys/time.h>  // NOLINT
+
+#elif GTEST_OS_ZOS
+# define GTEST_HAS_GETTIMEOFDAY_ 1
+# include <sys/time.h>  // NOLINT
+
+// On z/OS we additionally need strings.h for strcasecmp.
+# include <strings.h>  // NOLINT
+
+#elif GTEST_OS_WINDOWS_MOBILE  // We are on Windows CE.
+
+# include <windows.h>  // NOLINT
+
+#elif GTEST_OS_WINDOWS  // We are on Windows proper.
+
+# include <io.h>  // NOLINT
+# include <sys/timeb.h>  // NOLINT
+# include <sys/types.h>  // NOLINT
+# include <sys/stat.h>  // NOLINT
+
+# if GTEST_OS_WINDOWS_MINGW
+// MinGW has gettimeofday() but not _ftime64().
+// TODO(kenton at google.com): Use autoconf to detect availability of
+//   gettimeofday().
+// TODO(kenton at google.com): There are other ways to get the time on
+//   Windows, like GetTickCount() or GetSystemTimeAsFileTime().  MinGW
+//   supports these.  consider using them instead.
+#  define GTEST_HAS_GETTIMEOFDAY_ 1
+#  include <sys/time.h>  // NOLINT
+# endif  // GTEST_OS_WINDOWS_MINGW
+
+// cpplint thinks that the header is already included, so we want to
+// silence it.
+# include <windows.h>  // NOLINT
+
+#else
+
+// Assume other platforms have gettimeofday().
+// TODO(kenton at google.com): Use autoconf to detect availability of
+//   gettimeofday().
+# define GTEST_HAS_GETTIMEOFDAY_ 1
+
+// cpplint thinks that the header is already included, so we want to
+// silence it.
+# include <sys/time.h>  // NOLINT
+# include <unistd.h>  // NOLINT
+
+#endif  // GTEST_OS_LINUX
+
+#if GTEST_HAS_EXCEPTIONS
+# include <stdexcept>
+#endif
+
+#if GTEST_CAN_STREAM_RESULTS_
+# include <arpa/inet.h>  // NOLINT
+# include <netdb.h>  // NOLINT
+#endif
+
+// Indicates that this translation unit is part of Google Test's
+// implementation.  It must come before gtest-internal-inl.h is
+// included, or there will be a compiler error.  This trick is to
+// prevent a user from accidentally including gtest-internal-inl.h in
+// his code.
+#define GTEST_IMPLEMENTATION_ 1
+// Copyright 2005, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+// Utility functions and classes used by the Google C++ testing framework.
+//
+// Author: wan at google.com (Zhanyong Wan)
+//
+// This file contains purely Google Test's internal implementation.  Please
+// DO NOT #INCLUDE IT IN A USER PROGRAM.
+
+#ifndef GTEST_SRC_GTEST_INTERNAL_INL_H_
+#define GTEST_SRC_GTEST_INTERNAL_INL_H_
+
+// GTEST_IMPLEMENTATION_ is defined to 1 iff the current translation unit is
+// part of Google Test's implementation; otherwise it's undefined.
+#if !GTEST_IMPLEMENTATION_
+// A user is trying to include this from his code - just say no.
+# error "gtest-internal-inl.h is part of Google Test's internal implementation."
+# error "It must not be included except by Google Test itself."
+#endif  // GTEST_IMPLEMENTATION_
+
+#ifndef _WIN32_WCE
+# include <errno.h>
+#endif  // !_WIN32_WCE
+#include <stddef.h>
+#include <stdlib.h>  // For strtoll/_strtoul64/malloc/free.
+#include <string.h>  // For memmove.
+
+#include <algorithm>
+#include <string>
+#include <vector>
+
+
+#if GTEST_CAN_STREAM_RESULTS_
+# include <arpa/inet.h>  // NOLINT
+# include <netdb.h>  // NOLINT
+#endif
+
+#if GTEST_OS_WINDOWS
+# include <windows.h>  // NOLINT
+#endif  // GTEST_OS_WINDOWS
+
+
+namespace testing {
+
+// Declares the flags.
+//
+// We don't want the users to modify this flag in the code, but want
+// Google Test's own unit tests to be able to access it. Therefore we
+// declare it here as opposed to in gtest.h.
+GTEST_DECLARE_bool_(death_test_use_fork);
+
+namespace internal {
+
+// The value of GetTestTypeId() as seen from within the Google Test
+// library.  This is solely for testing GetTestTypeId().
+GTEST_API_ extern const TypeId kTestTypeIdInGoogleTest;
+
+// Names of the flags (needed for parsing Google Test flags).
+const char kAlsoRunDisabledTestsFlag[] = "also_run_disabled_tests";
+const char kBreakOnFailureFlag[] = "break_on_failure";
+const char kCatchExceptionsFlag[] = "catch_exceptions";
+const char kColorFlag[] = "color";
+const char kFilterFlag[] = "filter";
+const char kListTestsFlag[] = "list_tests";
+const char kOutputFlag[] = "output";
+const char kPrintTimeFlag[] = "print_time";
+const char kRandomSeedFlag[] = "random_seed";
+const char kRepeatFlag[] = "repeat";
+const char kShuffleFlag[] = "shuffle";
+const char kStackTraceDepthFlag[] = "stack_trace_depth";
+const char kStreamResultToFlag[] = "stream_result_to";
+const char kThrowOnFailureFlag[] = "throw_on_failure";
+
+// A valid random seed must be in [1, kMaxRandomSeed].
+const int kMaxRandomSeed = 99999;
+
+// g_help_flag is true iff the --help flag or an equivalent form is
+// specified on the command line.
+GTEST_API_ extern bool g_help_flag;
+
+// Returns the current time in milliseconds.
+GTEST_API_ TimeInMillis GetTimeInMillis();
+
+// Returns true iff Google Test should use colors in the output.
+GTEST_API_ bool ShouldUseColor(bool stdout_is_tty);
+
+// Formats the given time in milliseconds as seconds.
+GTEST_API_ std::string FormatTimeInMillisAsSeconds(TimeInMillis ms);
+
+// Converts the given time in milliseconds to a date string in the ISO 8601
+// format, without the timezone information.  N.B.: due to the use the
+// non-reentrant localtime() function, this function is not thread safe.  Do
+// not use it in any code that can be called from multiple threads.
+GTEST_API_ std::string FormatEpochTimeInMillisAsIso8601(TimeInMillis ms);
+
+// Parses a string for an Int32 flag, in the form of "--flag=value".
+//
+// On success, stores the value of the flag in *value, and returns
+// true.  On failure, returns false without changing *value.
+GTEST_API_ bool ParseInt32Flag(
+    const char* str, const char* flag, Int32* value);
+
+// Returns a random seed in range [1, kMaxRandomSeed] based on the
+// given --gtest_random_seed flag value.
+inline int GetRandomSeedFromFlag(Int32 random_seed_flag) {
+  const unsigned int raw_seed = (random_seed_flag == 0) ?
+      static_cast<unsigned int>(GetTimeInMillis()) :
+      static_cast<unsigned int>(random_seed_flag);
+
+  // Normalizes the actual seed to range [1, kMaxRandomSeed] such that
+  // it's easy to type.
+  const int normalized_seed =
+      static_cast<int>((raw_seed - 1U) %
+                       static_cast<unsigned int>(kMaxRandomSeed)) + 1;
+  return normalized_seed;
+}
+
+// Returns the first valid random seed after 'seed'.  The behavior is
+// undefined if 'seed' is invalid.  The seed after kMaxRandomSeed is
+// considered to be 1.
+inline int GetNextRandomSeed(int seed) {
+  GTEST_CHECK_(1 <= seed && seed <= kMaxRandomSeed)
+      << "Invalid random seed " << seed << " - must be in [1, "
+      << kMaxRandomSeed << "].";
+  const int next_seed = seed + 1;
+  return (next_seed > kMaxRandomSeed) ? 1 : next_seed;
+}
+
+// This class saves the values of all Google Test flags in its c'tor, and
+// restores them in its d'tor.
+class GTestFlagSaver {
+ public:
+  // The c'tor.
+  GTestFlagSaver() {
+    also_run_disabled_tests_ = GTEST_FLAG(also_run_disabled_tests);
+    break_on_failure_ = GTEST_FLAG(break_on_failure);
+    catch_exceptions_ = GTEST_FLAG(catch_exceptions);
+    color_ = GTEST_FLAG(color);
+    death_test_style_ = GTEST_FLAG(death_test_style);
+    death_test_use_fork_ = GTEST_FLAG(death_test_use_fork);
+    filter_ = GTEST_FLAG(filter);
+    internal_run_death_test_ = GTEST_FLAG(internal_run_death_test);
+    list_tests_ = GTEST_FLAG(list_tests);
+    output_ = GTEST_FLAG(output);
+    print_time_ = GTEST_FLAG(print_time);
+    random_seed_ = GTEST_FLAG(random_seed);
+    repeat_ = GTEST_FLAG(repeat);
+    shuffle_ = GTEST_FLAG(shuffle);
+    stack_trace_depth_ = GTEST_FLAG(stack_trace_depth);
+    stream_result_to_ = GTEST_FLAG(stream_result_to);
+    throw_on_failure_ = GTEST_FLAG(throw_on_failure);
+  }
+
+  // The d'tor is not virtual.  DO NOT INHERIT FROM THIS CLASS.
+  ~GTestFlagSaver() {
+    GTEST_FLAG(also_run_disabled_tests) = also_run_disabled_tests_;
+    GTEST_FLAG(break_on_failure) = break_on_failure_;
+    GTEST_FLAG(catch_exceptions) = catch_exceptions_;
+    GTEST_FLAG(color) = color_;
+    GTEST_FLAG(death_test_style) = death_test_style_;
+    GTEST_FLAG(death_test_use_fork) = death_test_use_fork_;
+    GTEST_FLAG(filter) = filter_;
+    GTEST_FLAG(internal_run_death_test) = internal_run_death_test_;
+    GTEST_FLAG(list_tests) = list_tests_;
+    GTEST_FLAG(output) = output_;
+    GTEST_FLAG(print_time) = print_time_;
+    GTEST_FLAG(random_seed) = random_seed_;
+    GTEST_FLAG(repeat) = repeat_;
+    GTEST_FLAG(shuffle) = shuffle_;
+    GTEST_FLAG(stack_trace_depth) = stack_trace_depth_;
+    GTEST_FLAG(stream_result_to) = stream_result_to_;
+    GTEST_FLAG(throw_on_failure) = throw_on_failure_;
+  }
+
+ private:
+  // Fields for saving the original values of flags.
+  bool also_run_disabled_tests_;
+  bool break_on_failure_;
+  bool catch_exceptions_;
+  std::string color_;
+  std::string death_test_style_;
+  bool death_test_use_fork_;
+  std::string filter_;
+  std::string internal_run_death_test_;
+  bool list_tests_;
+  std::string output_;
+  bool print_time_;
+  internal::Int32 random_seed_;
+  internal::Int32 repeat_;
+  bool shuffle_;
+  internal::Int32 stack_trace_depth_;
+  std::string stream_result_to_;
+  bool throw_on_failure_;
+} GTEST_ATTRIBUTE_UNUSED_;
+
+// Converts a Unicode code point to a narrow string in UTF-8 encoding.
+// code_point parameter is of type UInt32 because wchar_t may not be
+// wide enough to contain a code point.
+// If the code_point is not a valid Unicode code point
+// (i.e. outside of Unicode range U+0 to U+10FFFF) it will be converted
+// to "(Invalid Unicode 0xXXXXXXXX)".
+GTEST_API_ std::string CodePointToUtf8(UInt32 code_point);
+
+// Converts a wide string to a narrow string in UTF-8 encoding.
+// The wide string is assumed to have the following encoding:
+//   UTF-16 if sizeof(wchar_t) == 2 (on Windows, Cygwin, Symbian OS)
+//   UTF-32 if sizeof(wchar_t) == 4 (on Linux)
+// Parameter str points to a null-terminated wide string.
+// Parameter num_chars may additionally limit the number
+// of wchar_t characters processed. -1 is used when the entire string
+// should be processed.
+// If the string contains code points that are not valid Unicode code points
+// (i.e. outside of Unicode range U+0 to U+10FFFF) they will be output
+// as '(Invalid Unicode 0xXXXXXXXX)'. If the string is in UTF16 encoding
+// and contains invalid UTF-16 surrogate pairs, values in those pairs
+// will be encoded as individual Unicode characters from Basic Normal Plane.
+GTEST_API_ std::string WideStringToUtf8(const wchar_t* str, int num_chars);
+
+// Reads the GTEST_SHARD_STATUS_FILE environment variable, and creates the file
+// if the variable is present. If a file already exists at this location, this
+// function will write over it. If the variable is present, but the file cannot
+// be created, prints an error and exits.
+void WriteToShardStatusFileIfNeeded();
+
+// Checks whether sharding is enabled by examining the relevant
+// environment variable values. If the variables are present,
+// but inconsistent (e.g., shard_index >= total_shards), prints
+// an error and exits. If in_subprocess_for_death_test, sharding is
+// disabled because it must only be applied to the original test
+// process. Otherwise, we could filter out death tests we intended to execute.
+GTEST_API_ bool ShouldShard(const char* total_shards_str,
+                            const char* shard_index_str,
+                            bool in_subprocess_for_death_test);
+
+// Parses the environment variable var as an Int32. If it is unset,
+// returns default_val. If it is not an Int32, prints an error and
+// and aborts.
+GTEST_API_ Int32 Int32FromEnvOrDie(const char* env_var, Int32 default_val);
+
+// Given the total number of shards, the shard index, and the test id,
+// returns true iff the test should be run on this shard. The test id is
+// some arbitrary but unique non-negative integer assigned to each test
+// method. Assumes that 0 <= shard_index < total_shards.
+GTEST_API_ bool ShouldRunTestOnShard(
+    int total_shards, int shard_index, int test_id);
+
+// STL container utilities.
+
+// Returns the number of elements in the given container that satisfy
+// the given predicate.
+template <class Container, typename Predicate>
+inline int CountIf(const Container& c, Predicate predicate) {
+  // Implemented as an explicit loop since std::count_if() in libCstd on
+  // Solaris has a non-standard signature.
+  int count = 0;
+  for (typename Container::const_iterator it = c.begin(); it != c.end(); ++it) {
+    if (predicate(*it))
+      ++count;
+  }
+  return count;
+}
+
+// Applies a function/functor to each element in the container.
+template <class Container, typename Functor>
+void ForEach(const Container& c, Functor functor) {
+  std::for_each(c.begin(), c.end(), functor);
+}
+
+// Returns the i-th element of the vector, or default_value if i is not
+// in range [0, v.size()).
+template <typename E>
+inline E GetElementOr(const std::vector<E>& v, int i, E default_value) {
+  return (i < 0 || i >= static_cast<int>(v.size())) ? default_value : v[i];
+}
+
+// Performs an in-place shuffle of a range of the vector's elements.
+// 'begin' and 'end' are element indices as an STL-style range;
+// i.e. [begin, end) are shuffled, where 'end' == size() means to
+// shuffle to the end of the vector.
+template <typename E>
+void ShuffleRange(internal::Random* random, int begin, int end,
+                  std::vector<E>* v) {
+  const int size = static_cast<int>(v->size());
+  GTEST_CHECK_(0 <= begin && begin <= size)
+      << "Invalid shuffle range start " << begin << ": must be in range [0, "
+      << size << "].";
+  GTEST_CHECK_(begin <= end && end <= size)
+      << "Invalid shuffle range finish " << end << ": must be in range ["
+      << begin << ", " << size << "].";
+
+  // Fisher-Yates shuffle, from
+  // http://en.wikipedia.org/wiki/Fisher-Yates_shuffle
+  for (int range_width = end - begin; range_width >= 2; range_width--) {
+    const int last_in_range = begin + range_width - 1;
+    const int selected = begin + random->Generate(range_width);
+    std::swap((*v)[selected], (*v)[last_in_range]);
+  }
+}
+
+// Performs an in-place shuffle of the vector's elements.
+template <typename E>
+inline void Shuffle(internal::Random* random, std::vector<E>* v) {
+  ShuffleRange(random, 0, static_cast<int>(v->size()), v);
+}
+
+// A function for deleting an object.  Handy for being used as a
+// functor.
+template <typename T>
+static void Delete(T* x) {
+  delete x;
+}
+
+// A predicate that checks the key of a TestProperty against a known key.
+//
+// TestPropertyKeyIs is copyable.
+class TestPropertyKeyIs {
+ public:
+  // Constructor.
+  //
+  // TestPropertyKeyIs has NO default constructor.
+  explicit TestPropertyKeyIs(const std::string& key) : key_(key) {}
+
+  // Returns true iff the test name of test property matches on key_.
+  bool operator()(const TestProperty& test_property) const {
+    return test_property.key() == key_;
+  }
+
+ private:
+  std::string key_;
+};
+
+// Class UnitTestOptions.
+//
+// This class contains functions for processing options the user
+// specifies when running the tests.  It has only static members.
+//
+// In most cases, the user can specify an option using either an
+// environment variable or a command line flag.  E.g. you can set the
+// test filter using either GTEST_FILTER or --gtest_filter.  If both
+// the variable and the flag are present, the latter overrides the
+// former.
+class GTEST_API_ UnitTestOptions {
+ public:
+  // Functions for processing the gtest_output flag.
+
+  // Returns the output format, or "" for normal printed output.
+  static std::string GetOutputFormat();
+
+  // Returns the absolute path of the requested output file, or the
+  // default (test_detail.xml in the original working directory) if
+  // none was explicitly specified.
+  static std::string GetAbsolutePathToOutputFile();
+
+  // Functions for processing the gtest_filter flag.
+
+  // Returns true iff the wildcard pattern matches the string.  The
+  // first ':' or '\0' character in pattern marks the end of it.
+  //
+  // This recursive algorithm isn't very efficient, but is clear and
+  // works well enough for matching test names, which are short.
+  static bool PatternMatchesString(const char *pattern, const char *str);
+
+  // Returns true iff the user-specified filter matches the test case
+  // name and the test name.
+  static bool FilterMatchesTest(const std::string &test_case_name,
+                                const std::string &test_name);
+
+#if GTEST_OS_WINDOWS
+  // Function for supporting the gtest_catch_exception flag.
+
+  // Returns EXCEPTION_EXECUTE_HANDLER if Google Test should handle the
+  // given SEH exception, or EXCEPTION_CONTINUE_SEARCH otherwise.
+  // This function is useful as an __except condition.
+  static int GTestShouldProcessSEH(DWORD exception_code);
+#endif  // GTEST_OS_WINDOWS
+
+  // Returns true if "name" matches the ':' separated list of glob-style
+  // filters in "filter".
+  static bool MatchesFilter(const std::string& name, const char* filter);
+};
+
+// Returns the current application's name, removing directory path if that
+// is present.  Used by UnitTestOptions::GetOutputFile.
+GTEST_API_ FilePath GetCurrentExecutableName();
+
+// The role interface for getting the OS stack trace as a string.
+class OsStackTraceGetterInterface {
+ public:
+  OsStackTraceGetterInterface() {}
+  virtual ~OsStackTraceGetterInterface() {}
+
+  // Returns the current OS stack trace as an std::string.  Parameters:
+  //
+  //   max_depth  - the maximum number of stack frames to be included
+  //                in the trace.
+  //   skip_count - the number of top frames to be skipped; doesn't count
+  //                against max_depth.
+  virtual string CurrentStackTrace(int max_depth, int skip_count) = 0;
+
+  // UponLeavingGTest() should be called immediately before Google Test calls
+  // user code. It saves some information about the current stack that
+  // CurrentStackTrace() will use to find and hide Google Test stack frames.
+  virtual void UponLeavingGTest() = 0;
+
+ private:
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(OsStackTraceGetterInterface);
+};
+
+// A working implementation of the OsStackTraceGetterInterface interface.
+class OsStackTraceGetter : public OsStackTraceGetterInterface {
+ public:
+  OsStackTraceGetter() : caller_frame_(NULL) {}
+
+  virtual string CurrentStackTrace(int max_depth, int skip_count)
+      GTEST_LOCK_EXCLUDED_(mutex_);
+
+  virtual void UponLeavingGTest() GTEST_LOCK_EXCLUDED_(mutex_);
+
+  // This string is inserted in place of stack frames that are part of
+  // Google Test's implementation.
+  static const char* const kElidedFramesMarker;
+
+ private:
+  Mutex mutex_;  // protects all internal state
+
+  // We save the stack frame below the frame that calls user code.
+  // We do this because the address of the frame immediately below
+  // the user code changes between the call to UponLeavingGTest()
+  // and any calls to CurrentStackTrace() from within the user code.
+  void* caller_frame_;
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(OsStackTraceGetter);
+};
+
+// Information about a Google Test trace point.
+struct TraceInfo {
+  const char* file;
+  int line;
+  std::string message;
+};
+
+// This is the default global test part result reporter used in UnitTestImpl.
+// This class should only be used by UnitTestImpl.
+class DefaultGlobalTestPartResultReporter
+  : public TestPartResultReporterInterface {
+ public:
+  explicit DefaultGlobalTestPartResultReporter(UnitTestImpl* unit_test);
+  // Implements the TestPartResultReporterInterface. Reports the test part
+  // result in the current test.
+  virtual void ReportTestPartResult(const TestPartResult& result);
+
+ private:
+  UnitTestImpl* const unit_test_;
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(DefaultGlobalTestPartResultReporter);
+};
+
+// This is the default per thread test part result reporter used in
+// UnitTestImpl. This class should only be used by UnitTestImpl.
+class DefaultPerThreadTestPartResultReporter
+    : public TestPartResultReporterInterface {
+ public:
+  explicit DefaultPerThreadTestPartResultReporter(UnitTestImpl* unit_test);
+  // Implements the TestPartResultReporterInterface. The implementation just
+  // delegates to the current global test part result reporter of *unit_test_.
+  virtual void ReportTestPartResult(const TestPartResult& result);
+
+ private:
+  UnitTestImpl* const unit_test_;
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(DefaultPerThreadTestPartResultReporter);
+};
+
+// The private implementation of the UnitTest class.  We don't protect
+// the methods under a mutex, as this class is not accessible by a
+// user and the UnitTest class that delegates work to this class does
+// proper locking.
+class GTEST_API_ UnitTestImpl {
+ public:
+  explicit UnitTestImpl(UnitTest* parent);
+  virtual ~UnitTestImpl();
+
+  // There are two different ways to register your own TestPartResultReporter.
+  // You can register your own repoter to listen either only for test results
+  // from the current thread or for results from all threads.
+  // By default, each per-thread test result repoter just passes a new
+  // TestPartResult to the global test result reporter, which registers the
+  // test part result for the currently running test.
+
+  // Returns the global test part result reporter.
+  TestPartResultReporterInterface* GetGlobalTestPartResultReporter();
+
+  // Sets the global test part result reporter.
+  void SetGlobalTestPartResultReporter(
+      TestPartResultReporterInterface* reporter);
+
+  // Returns the test part result reporter for the current thread.
+  TestPartResultReporterInterface* GetTestPartResultReporterForCurrentThread();
+
+  // Sets the test part result reporter for the current thread.
+  void SetTestPartResultReporterForCurrentThread(
+      TestPartResultReporterInterface* reporter);
+
+  // Gets the number of successful test cases.
+  int successful_test_case_count() const;
+
+  // Gets the number of failed test cases.
+  int failed_test_case_count() const;
+
+  // Gets the number of all test cases.
+  int total_test_case_count() const;
+
+  // Gets the number of all test cases that contain at least one test
+  // that should run.
+  int test_case_to_run_count() const;
+
+  // Gets the number of successful tests.
+  int successful_test_count() const;
+
+  // Gets the number of failed tests.
+  int failed_test_count() const;
+
+  // Gets the number of disabled tests that will be reported in the XML report.
+  int reportable_disabled_test_count() const;
+
+  // Gets the number of disabled tests.
+  int disabled_test_count() const;
+
+  // Gets the number of tests to be printed in the XML report.
+  int reportable_test_count() const;
+
+  // Gets the number of all tests.
+  int total_test_count() const;
+
+  // Gets the number of tests that should run.
+  int test_to_run_count() const;
+
+  // Gets the time of the test program start, in ms from the start of the
+  // UNIX epoch.
+  TimeInMillis start_timestamp() const { return start_timestamp_; }
+
+  // Gets the elapsed time, in milliseconds.
+  TimeInMillis elapsed_time() const { return elapsed_time_; }
+
+  // Returns true iff the unit test passed (i.e. all test cases passed).
+  bool Passed() const { return !Failed(); }
+
+  // Returns true iff the unit test failed (i.e. some test case failed
+  // or something outside of all tests failed).
+  bool Failed() const {
+    return failed_test_case_count() > 0 || ad_hoc_test_result()->Failed();
+  }
+
+  // Gets the i-th test case among all the test cases. i can range from 0 to
+  // total_test_case_count() - 1. If i is not in that range, returns NULL.
+  const TestCase* GetTestCase(int i) const {
+    const int index = GetElementOr(test_case_indices_, i, -1);
+    return index < 0 ? NULL : test_cases_[i];
+  }
+
+  // Gets the i-th test case among all the test cases. i can range from 0 to
+  // total_test_case_count() - 1. If i is not in that range, returns NULL.
+  TestCase* GetMutableTestCase(int i) {
+    const int index = GetElementOr(test_case_indices_, i, -1);
+    return index < 0 ? NULL : test_cases_[index];
+  }
+
+  // Provides access to the event listener list.
+  TestEventListeners* listeners() { return &listeners_; }
+
+  // Returns the TestResult for the test that's currently running, or
+  // the TestResult for the ad hoc test if no test is running.
+  TestResult* current_test_result();
+
+  // Returns the TestResult for the ad hoc test.
+  const TestResult* ad_hoc_test_result() const { return &ad_hoc_test_result_; }
+
+  // Sets the OS stack trace getter.
+  //
+  // Does nothing if the input and the current OS stack trace getter
+  // are the same; otherwise, deletes the old getter and makes the
+  // input the current getter.
+  void set_os_stack_trace_getter(OsStackTraceGetterInterface* getter);
+
+  // Returns the current OS stack trace getter if it is not NULL;
+  // otherwise, creates an OsStackTraceGetter, makes it the current
+  // getter, and returns it.
+  OsStackTraceGetterInterface* os_stack_trace_getter();
+
+  // Returns the current OS stack trace as an std::string.
+  //
+  // The maximum number of stack frames to be included is specified by
+  // the gtest_stack_trace_depth flag.  The skip_count parameter
+  // specifies the number of top frames to be skipped, which doesn't
+  // count against the number of frames to be included.
+  //
+  // For example, if Foo() calls Bar(), which in turn calls
+  // CurrentOsStackTraceExceptTop(1), Foo() will be included in the
+  // trace but Bar() and CurrentOsStackTraceExceptTop() won't.
+  std::string CurrentOsStackTraceExceptTop(int skip_count) GTEST_NO_INLINE_;
+
+  // Finds and returns a TestCase with the given name.  If one doesn't
+  // exist, creates one and returns it.
+  //
+  // Arguments:
+  //
+  //   test_case_name: name of the test case
+  //   type_param:     the name of the test's type parameter, or NULL if
+  //                   this is not a typed or a type-parameterized test.
+  //   set_up_tc:      pointer to the function that sets up the test case
+  //   tear_down_tc:   pointer to the function that tears down the test case
+  TestCase* GetTestCase(const char* test_case_name,
+                        const char* type_param,
+                        Test::SetUpTestCaseFunc set_up_tc,
+                        Test::TearDownTestCaseFunc tear_down_tc);
+
+  // Adds a TestInfo to the unit test.
+  //
+  // Arguments:
+  //
+  //   set_up_tc:    pointer to the function that sets up the test case
+  //   tear_down_tc: pointer to the function that tears down the test case
+  //   test_info:    the TestInfo object
+  void AddTestInfo(Test::SetUpTestCaseFunc set_up_tc,
+                   Test::TearDownTestCaseFunc tear_down_tc,
+                   TestInfo* test_info) {
+    // In order to support thread-safe death tests, we need to
+    // remember the original working directory when the test program
+    // was first invoked.  We cannot do this in RUN_ALL_TESTS(), as
+    // the user may have changed the current directory before calling
+    // RUN_ALL_TESTS().  Therefore we capture the current directory in
+    // AddTestInfo(), which is called to register a TEST or TEST_F
+    // before main() is reached.
+    if (original_working_dir_.IsEmpty()) {
+      original_working_dir_.Set(FilePath::GetCurrentDir());
+      GTEST_CHECK_(!original_working_dir_.IsEmpty())
+          << "Failed to get the current working directory.";
+    }
+
+    GetTestCase(test_info->test_case_name(),
+                test_info->type_param(),
+                set_up_tc,
+                tear_down_tc)->AddTestInfo(test_info);
+  }
+
+#if GTEST_HAS_PARAM_TEST
+  // Returns ParameterizedTestCaseRegistry object used to keep track of
+  // value-parameterized tests and instantiate and register them.
+  internal::ParameterizedTestCaseRegistry& parameterized_test_registry() {
+    return parameterized_test_registry_;
+  }
+#endif  // GTEST_HAS_PARAM_TEST
+
+  // Sets the TestCase object for the test that's currently running.
+  void set_current_test_case(TestCase* a_current_test_case) {
+    current_test_case_ = a_current_test_case;
+  }
+
+  // Sets the TestInfo object for the test that's currently running.  If
+  // current_test_info is NULL, the assertion results will be stored in
+  // ad_hoc_test_result_.
+  void set_current_test_info(TestInfo* a_current_test_info) {
+    current_test_info_ = a_current_test_info;
+  }
+
+  // Registers all parameterized tests defined using TEST_P and
+  // INSTANTIATE_TEST_CASE_P, creating regular tests for each test/parameter
+  // combination. This method can be called more then once; it has guards
+  // protecting from registering the tests more then once.  If
+  // value-parameterized tests are disabled, RegisterParameterizedTests is
+  // present but does nothing.
+  void RegisterParameterizedTests();
+
+  // Runs all tests in this UnitTest object, prints the result, and
+  // returns true if all tests are successful.  If any exception is
+  // thrown during a test, this test is considered to be failed, but
+  // the rest of the tests will still be run.
+  bool RunAllTests();
+
+  // Clears the results of all tests, except the ad hoc tests.
+  void ClearNonAdHocTestResult() {
+    ForEach(test_cases_, TestCase::ClearTestCaseResult);
+  }
+
+  // Clears the results of ad-hoc test assertions.
+  void ClearAdHocTestResult() {
+    ad_hoc_test_result_.Clear();
+  }
+
+  // Adds a TestProperty to the current TestResult object when invoked in a
+  // context of a test or a test case, or to the global property set. If the
+  // result already contains a property with the same key, the value will be
+  // updated.
+  void RecordProperty(const TestProperty& test_property);
+
+  enum ReactionToSharding {
+    HONOR_SHARDING_PROTOCOL,
+    IGNORE_SHARDING_PROTOCOL
+  };
+
+  // Matches the full name of each test against the user-specified
+  // filter to decide whether the test should run, then records the
+  // result in each TestCase and TestInfo object.
+  // If shard_tests == HONOR_SHARDING_PROTOCOL, further filters tests
+  // based on sharding variables in the environment.
+  // Returns the number of tests that should run.
+  int FilterTests(ReactionToSharding shard_tests);
+
+  // Prints the names of the tests matching the user-specified filter flag.
+  void ListTestsMatchingFilter();
+
+  const TestCase* current_test_case() const { return current_test_case_; }
+  TestInfo* current_test_info() { return current_test_info_; }
+  const TestInfo* current_test_info() const { return current_test_info_; }
+
+  // Returns the vector of environments that need to be set-up/torn-down
+  // before/after the tests are run.
+  std::vector<Environment*>& environments() { return environments_; }
+
+  // Getters for the per-thread Google Test trace stack.
+  std::vector<TraceInfo>& gtest_trace_stack() {
+    return *(gtest_trace_stack_.pointer());
+  }
+  const std::vector<TraceInfo>& gtest_trace_stack() const {
+    return gtest_trace_stack_.get();
+  }
+
+#if GTEST_HAS_DEATH_TEST
+  void InitDeathTestSubprocessControlInfo() {
+    internal_run_death_test_flag_.reset(ParseInternalRunDeathTestFlag());
+  }
+  // Returns a pointer to the parsed --gtest_internal_run_death_test
+  // flag, or NULL if that flag was not specified.
+  // This information is useful only in a death test child process.
+  // Must not be called before a call to InitGoogleTest.
+  const InternalRunDeathTestFlag* internal_run_death_test_flag() const {
+    return internal_run_death_test_flag_.get();
+  }
+
+  // Returns a pointer to the current death test factory.
+  internal::DeathTestFactory* death_test_factory() {
+    return death_test_factory_.get();
+  }
+
+  void SuppressTestEventsIfInSubprocess();
+
+  friend class ReplaceDeathTestFactory;
+#endif  // GTEST_HAS_DEATH_TEST
+
+  // Initializes the event listener performing XML output as specified by
+  // UnitTestOptions. Must not be called before InitGoogleTest.
+  void ConfigureXmlOutput();
+
+#if GTEST_CAN_STREAM_RESULTS_
+  // Initializes the event listener for streaming test results to a socket.
+  // Must not be called before InitGoogleTest.
+  void ConfigureStreamingOutput();
+#endif
+
+  // Performs initialization dependent upon flag values obtained in
+  // ParseGoogleTestFlagsOnly.  Is called from InitGoogleTest after the call to
+  // ParseGoogleTestFlagsOnly.  In case a user neglects to call InitGoogleTest
+  // this function is also called from RunAllTests.  Since this function can be
+  // called more than once, it has to be idempotent.
+  void PostFlagParsingInit();
+
+  // Gets the random seed used at the start of the current test iteration.
+  int random_seed() const { return random_seed_; }
+
+  // Gets the random number generator.
+  internal::Random* random() { return &random_; }
+
+  // Shuffles all test cases, and the tests within each test case,
+  // making sure that death tests are still run first.
+  void ShuffleTests();
+
+  // Restores the test cases and tests to their order before the first shuffle.
+  void UnshuffleTests();
+
+  // Returns the value of GTEST_FLAG(catch_exceptions) at the moment
+  // UnitTest::Run() starts.
+  bool catch_exceptions() const { return catch_exceptions_; }
+
+ private:
+  friend class ::testing::UnitTest;
+
+  // Used by UnitTest::Run() to capture the state of
+  // GTEST_FLAG(catch_exceptions) at the moment it starts.
+  void set_catch_exceptions(bool value) { catch_exceptions_ = value; }
+
+  // The UnitTest object that owns this implementation object.
+  UnitTest* const parent_;
+
+  // The working directory when the first TEST() or TEST_F() was
+  // executed.
+  internal::FilePath original_working_dir_;
+
+  // The default test part result reporters.
+  DefaultGlobalTestPartResultReporter default_global_test_part_result_reporter_;
+  DefaultPerThreadTestPartResultReporter
+      default_per_thread_test_part_result_reporter_;
+
+  // Points to (but doesn't own) the global test part result reporter.
+  TestPartResultReporterInterface* global_test_part_result_repoter_;
+
+  // Protects read and write access to global_test_part_result_reporter_.
+  internal::Mutex global_test_part_result_reporter_mutex_;
+
+  // Points to (but doesn't own) the per-thread test part result reporter.
+  internal::ThreadLocal<TestPartResultReporterInterface*>
+      per_thread_test_part_result_reporter_;
+
+  // The vector of environments that need to be set-up/torn-down
+  // before/after the tests are run.
+  std::vector<Environment*> environments_;
+
+  // The vector of TestCases in their original order.  It owns the
+  // elements in the vector.
+  std::vector<TestCase*> test_cases_;
+
+  // Provides a level of indirection for the test case list to allow
+  // easy shuffling and restoring the test case order.  The i-th
+  // element of this vector is the index of the i-th test case in the
+  // shuffled order.
+  std::vector<int> test_case_indices_;
+
+#if GTEST_HAS_PARAM_TEST
+  // ParameterizedTestRegistry object used to register value-parameterized
+  // tests.
+  internal::ParameterizedTestCaseRegistry parameterized_test_registry_;
+
+  // Indicates whether RegisterParameterizedTests() has been called already.
+  bool parameterized_tests_registered_;
+#endif  // GTEST_HAS_PARAM_TEST
+
+  // Index of the last death test case registered.  Initially -1.
+  int last_death_test_case_;
+
+  // This points to the TestCase for the currently running test.  It
+  // changes as Google Test goes through one test case after another.
+  // When no test is running, this is set to NULL and Google Test
+  // stores assertion results in ad_hoc_test_result_.  Initially NULL.
+  TestCase* current_test_case_;
+
+  // This points to the TestInfo for the currently running test.  It
+  // changes as Google Test goes through one test after another.  When
+  // no test is running, this is set to NULL and Google Test stores
+  // assertion results in ad_hoc_test_result_.  Initially NULL.
+  TestInfo* current_test_info_;
+
+  // Normally, a user only writes assertions inside a TEST or TEST_F,
+  // or inside a function called by a TEST or TEST_F.  Since Google
+  // Test keeps track of which test is current running, it can
+  // associate such an assertion with the test it belongs to.
+  //
+  // If an assertion is encountered when no TEST or TEST_F is running,
+  // Google Test attributes the assertion result to an imaginary "ad hoc"
+  // test, and records the result in ad_hoc_test_result_.
+  TestResult ad_hoc_test_result_;
+
+  // The list of event listeners that can be used to track events inside
+  // Google Test.
+  TestEventListeners listeners_;
+
+  // The OS stack trace getter.  Will be deleted when the UnitTest
+  // object is destructed.  By default, an OsStackTraceGetter is used,
+  // but the user can set this field to use a custom getter if that is
+  // desired.
+  OsStackTraceGetterInterface* os_stack_trace_getter_;
+
+  // True iff PostFlagParsingInit() has been called.
+  bool post_flag_parse_init_performed_;
+
+  // The random number seed used at the beginning of the test run.
+  int random_seed_;
+
+  // Our random number generator.
+  internal::Random random_;
+
+  // The time of the test program start, in ms from the start of the
+  // UNIX epoch.
+  TimeInMillis start_timestamp_;
+
+  // How long the test took to run, in milliseconds.
+  TimeInMillis elapsed_time_;
+
+#if GTEST_HAS_DEATH_TEST
+  // The decomposed components of the gtest_internal_run_death_test flag,
+  // parsed when RUN_ALL_TESTS is called.
+  internal::scoped_ptr<InternalRunDeathTestFlag> internal_run_death_test_flag_;
+  internal::scoped_ptr<internal::DeathTestFactory> death_test_factory_;
+#endif  // GTEST_HAS_DEATH_TEST
+
+  // A per-thread stack of traces created by the SCOPED_TRACE() macro.
+  internal::ThreadLocal<std::vector<TraceInfo> > gtest_trace_stack_;
+
+  // The value of GTEST_FLAG(catch_exceptions) at the moment RunAllTests()
+  // starts.
+  bool catch_exceptions_;
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(UnitTestImpl);
+};  // class UnitTestImpl
+
+// Convenience function for accessing the global UnitTest
+// implementation object.
+inline UnitTestImpl* GetUnitTestImpl() {
+  return UnitTest::GetInstance()->impl();
+}
+
+#if GTEST_USES_SIMPLE_RE
+
+// Internal helper functions for implementing the simple regular
+// expression matcher.
+GTEST_API_ bool IsInSet(char ch, const char* str);
+GTEST_API_ bool IsAsciiDigit(char ch);
+GTEST_API_ bool IsAsciiPunct(char ch);
+GTEST_API_ bool IsRepeat(char ch);
+GTEST_API_ bool IsAsciiWhiteSpace(char ch);
+GTEST_API_ bool IsAsciiWordChar(char ch);
+GTEST_API_ bool IsValidEscape(char ch);
+GTEST_API_ bool AtomMatchesChar(bool escaped, char pattern, char ch);
+GTEST_API_ bool ValidateRegex(const char* regex);
+GTEST_API_ bool MatchRegexAtHead(const char* regex, const char* str);
+GTEST_API_ bool MatchRepetitionAndRegexAtHead(
+    bool escaped, char ch, char repeat, const char* regex, const char* str);
+GTEST_API_ bool MatchRegexAnywhere(const char* regex, const char* str);
+
+#endif  // GTEST_USES_SIMPLE_RE
+
+// Parses the command line for Google Test flags, without initializing
+// other parts of Google Test.
+GTEST_API_ void ParseGoogleTestFlagsOnly(int* argc, char** argv);
+GTEST_API_ void ParseGoogleTestFlagsOnly(int* argc, wchar_t** argv);
+
+#if GTEST_HAS_DEATH_TEST
+
+// Returns the message describing the last system error, regardless of the
+// platform.
+GTEST_API_ std::string GetLastErrnoDescription();
+
+# if GTEST_OS_WINDOWS
+// Provides leak-safe Windows kernel handle ownership.
+class AutoHandle {
+ public:
+  AutoHandle() : handle_(INVALID_HANDLE_VALUE) {}
+  explicit AutoHandle(HANDLE handle) : handle_(handle) {}
+
+  ~AutoHandle() { Reset(); }
+
+  HANDLE Get() const { return handle_; }
+  void Reset() { Reset(INVALID_HANDLE_VALUE); }
+  void Reset(HANDLE handle) {
+    if (handle != handle_) {
+      if (handle_ != INVALID_HANDLE_VALUE)
+        ::CloseHandle(handle_);
+      handle_ = handle;
+    }
+  }
+
+ private:
+  HANDLE handle_;
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(AutoHandle);
+};
+# endif  // GTEST_OS_WINDOWS
+
+// Attempts to parse a string into a positive integer pointed to by the
+// number parameter.  Returns true if that is possible.
+// GTEST_HAS_DEATH_TEST implies that we have ::std::string, so we can use
+// it here.
+template <typename Integer>
+bool ParseNaturalNumber(const ::std::string& str, Integer* number) {
+  // Fail fast if the given string does not begin with a digit;
+  // this bypasses strtoXXX's "optional leading whitespace and plus
+  // or minus sign" semantics, which are undesirable here.
+  if (str.empty() || !IsDigit(str[0])) {
+    return false;
+  }
+  errno = 0;
+
+  char* end;
+  // BiggestConvertible is the largest integer type that system-provided
+  // string-to-number conversion routines can return.
+
+# if GTEST_OS_WINDOWS && !defined(__GNUC__)
+
+  // MSVC and C++ Builder define __int64 instead of the standard long long.
+  typedef unsigned __int64 BiggestConvertible;
+  const BiggestConvertible parsed = _strtoui64(str.c_str(), &end, 10);
+
+# else
+
+  typedef unsigned long long BiggestConvertible;  // NOLINT
+  const BiggestConvertible parsed = strtoull(str.c_str(), &end, 10);
+
+# endif  // GTEST_OS_WINDOWS && !defined(__GNUC__)
+
+  const bool parse_success = *end == '\0' && errno == 0;
+
+  // TODO(vladl at google.com): Convert this to compile time assertion when it is
+  // available.
+  GTEST_CHECK_(sizeof(Integer) <= sizeof(parsed));
+
+  const Integer result = static_cast<Integer>(parsed);
+  if (parse_success && static_cast<BiggestConvertible>(result) == parsed) {
+    *number = result;
+    return true;
+  }
+  return false;
+}
+#endif  // GTEST_HAS_DEATH_TEST
+
+// TestResult contains some private methods that should be hidden from
+// Google Test user but are required for testing. This class allow our tests
+// to access them.
+//
+// This class is supplied only for the purpose of testing Google Test's own
+// constructs. Do not use it in user tests, either directly or indirectly.
+class TestResultAccessor {
+ public:
+  static void RecordProperty(TestResult* test_result,
+                             const std::string& xml_element,
+                             const TestProperty& property) {
+    test_result->RecordProperty(xml_element, property);
+  }
+
+  static void ClearTestPartResults(TestResult* test_result) {
+    test_result->ClearTestPartResults();
+  }
+
+  static const std::vector<testing::TestPartResult>& test_part_results(
+      const TestResult& test_result) {
+    return test_result.test_part_results();
+  }
+};
+
+#if GTEST_CAN_STREAM_RESULTS_
+
+// Streams test results to the given port on the given host machine.
+class StreamingListener : public EmptyTestEventListener {
+ public:
+  // Abstract base class for writing strings to a socket.
+  class AbstractSocketWriter {
+   public:
+    virtual ~AbstractSocketWriter() {}
+
+    // Sends a string to the socket.
+    virtual void Send(const string& message) = 0;
+
+    // Closes the socket.
+    virtual void CloseConnection() {}
+
+    // Sends a string and a newline to the socket.
+    void SendLn(const string& message) {
+      Send(message + "\n");
+    }
+  };
+
+  // Concrete class for actually writing strings to a socket.
+  class SocketWriter : public AbstractSocketWriter {
+   public:
+    SocketWriter(const string& host, const string& port)
+        : sockfd_(-1), host_name_(host), port_num_(port) {
+      MakeConnection();
+    }
+
+    virtual ~SocketWriter() {
+      if (sockfd_ != -1)
+        CloseConnection();
+    }
+
+    // Sends a string to the socket.
+    virtual void Send(const string& message) {
+      GTEST_CHECK_(sockfd_ != -1)
+          << "Send() can be called only when there is a connection.";
+
+      const int len = static_cast<int>(message.length());
+      if (write(sockfd_, message.c_str(), len) != len) {
+        GTEST_LOG_(WARNING)
+            << "stream_result_to: failed to stream to "
+            << host_name_ << ":" << port_num_;
+      }
+    }
+
+   private:
+    // Creates a client socket and connects to the server.
+    void MakeConnection();
+
+    // Closes the socket.
+    void CloseConnection() {
+      GTEST_CHECK_(sockfd_ != -1)
+          << "CloseConnection() can be called only when there is a connection.";
+
+      close(sockfd_);
+      sockfd_ = -1;
+    }
+
+    int sockfd_;  // socket file descriptor
+    const string host_name_;
+    const string port_num_;
+
+    GTEST_DISALLOW_COPY_AND_ASSIGN_(SocketWriter);
+  };  // class SocketWriter
+
+  // Escapes '=', '&', '%', and '\n' characters in str as "%xx".
+  static string UrlEncode(const char* str);
+
+  StreamingListener(const string& host, const string& port)
+      : socket_writer_(new SocketWriter(host, port)) { Start(); }
+
+  explicit StreamingListener(AbstractSocketWriter* socket_writer)
+      : socket_writer_(socket_writer) { Start(); }
+
+  void OnTestProgramStart(const UnitTest& /* unit_test */) {
+    SendLn("event=TestProgramStart");
+  }
+
+  void OnTestProgramEnd(const UnitTest& unit_test) {
+    // Note that Google Test current only report elapsed time for each
+    // test iteration, not for the entire test program.
+    SendLn("event=TestProgramEnd&passed=" + FormatBool(unit_test.Passed()));
+
+    // Notify the streaming server to stop.
+    socket_writer_->CloseConnection();
+  }
+
+  void OnTestIterationStart(const UnitTest& /* unit_test */, int iteration) {
+    SendLn("event=TestIterationStart&iteration=" +
+           StreamableToString(iteration));
+  }
+
+  void OnTestIterationEnd(const UnitTest& unit_test, int /* iteration */) {
+    SendLn("event=TestIterationEnd&passed=" +
+           FormatBool(unit_test.Passed()) + "&elapsed_time=" +
+           StreamableToString(unit_test.elapsed_time()) + "ms");
+  }
+
+  void OnTestCaseStart(const TestCase& test_case) {
+    SendLn(std::string("event=TestCaseStart&name=") + test_case.name());
+  }
+
+  void OnTestCaseEnd(const TestCase& test_case) {
+    SendLn("event=TestCaseEnd&passed=" + FormatBool(test_case.Passed())
+           + "&elapsed_time=" + StreamableToString(test_case.elapsed_time())
+           + "ms");
+  }
+
+  void OnTestStart(const TestInfo& test_info) {
+    SendLn(std::string("event=TestStart&name=") + test_info.name());
+  }
+
+  void OnTestEnd(const TestInfo& test_info) {
+    SendLn("event=TestEnd&passed=" +
+           FormatBool((test_info.result())->Passed()) +
+           "&elapsed_time=" +
+           StreamableToString((test_info.result())->elapsed_time()) + "ms");
+  }
+
+  void OnTestPartResult(const TestPartResult& test_part_result) {
+    const char* file_name = test_part_result.file_name();
+    if (file_name == NULL)
+      file_name = "";
+    SendLn("event=TestPartResult&file=" + UrlEncode(file_name) +
+           "&line=" + StreamableToString(test_part_result.line_number()) +
+           "&message=" + UrlEncode(test_part_result.message()));
+  }
+
+ private:
+  // Sends the given message and a newline to the socket.
+  void SendLn(const string& message) { socket_writer_->SendLn(message); }
+
+  // Called at the start of streaming to notify the receiver what
+  // protocol we are using.
+  void Start() { SendLn("gtest_streaming_protocol_version=1.0"); }
+
+  string FormatBool(bool value) { return value ? "1" : "0"; }
+
+  const scoped_ptr<AbstractSocketWriter> socket_writer_;
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(StreamingListener);
+};  // class StreamingListener
+
+#endif  // GTEST_CAN_STREAM_RESULTS_
+
+}  // namespace internal
+}  // namespace testing
+
+#endif  // GTEST_SRC_GTEST_INTERNAL_INL_H_
+#undef GTEST_IMPLEMENTATION_
+
+#if GTEST_OS_WINDOWS
+# define vsnprintf _vsnprintf
+#endif  // GTEST_OS_WINDOWS
+
+namespace testing {
+
+using internal::CountIf;
+using internal::ForEach;
+using internal::GetElementOr;
+using internal::Shuffle;
+
+// Constants.
+
+// A test whose test case name or test name matches this filter is
+// disabled and not run.
+static const char kDisableTestFilter[] = "DISABLED_*:*/DISABLED_*";
+
+// A test case whose name matches this filter is considered a death
+// test case and will be run before test cases whose name doesn't
+// match this filter.
+static const char kDeathTestCaseFilter[] = "*DeathTest:*DeathTest/*";
+
+// A test filter that matches everything.
+static const char kUniversalFilter[] = "*";
+
+// The default output file for XML output.
+static const char kDefaultOutputFile[] = "test_detail.xml";
+
+// The environment variable name for the test shard index.
+static const char kTestShardIndex[] = "GTEST_SHARD_INDEX";
+// The environment variable name for the total number of test shards.
+static const char kTestTotalShards[] = "GTEST_TOTAL_SHARDS";
+// The environment variable name for the test shard status file.
+static const char kTestShardStatusFile[] = "GTEST_SHARD_STATUS_FILE";
+
+namespace internal {
+
+// The text used in failure messages to indicate the start of the
+// stack trace.
+const char kStackTraceMarker[] = "\nStack trace:\n";
+
+// g_help_flag is true iff the --help flag or an equivalent form is
+// specified on the command line.
+bool g_help_flag = false;
+
+}  // namespace internal
+
+static const char* GetDefaultFilter() {
+  return kUniversalFilter;
+}
+
+GTEST_DEFINE_bool_(
+    also_run_disabled_tests,
+    internal::BoolFromGTestEnv("also_run_disabled_tests", false),
+    "Run disabled tests too, in addition to the tests normally being run.");
+
+GTEST_DEFINE_bool_(
+    break_on_failure,
+    internal::BoolFromGTestEnv("break_on_failure", false),
+    "True iff a failed assertion should be a debugger break-point.");
+
+GTEST_DEFINE_bool_(
+    catch_exceptions,
+    internal::BoolFromGTestEnv("catch_exceptions", true),
+    "True iff " GTEST_NAME_
+    " should catch exceptions and treat them as test failures.");
+
+GTEST_DEFINE_string_(
+    color,
+    internal::StringFromGTestEnv("color", "auto"),
+    "Whether to use colors in the output.  Valid values: yes, no, "
+    "and auto.  'auto' means to use colors if the output is "
+    "being sent to a terminal and the TERM environment variable "
+    "is set to a terminal type that supports colors.");
+
+GTEST_DEFINE_string_(
+    filter,
+    internal::StringFromGTestEnv("filter", GetDefaultFilter()),
+    "A colon-separated list of glob (not regex) patterns "
+    "for filtering the tests to run, optionally followed by a "
+    "'-' and a : separated list of negative patterns (tests to "
+    "exclude).  A test is run if it matches one of the positive "
+    "patterns and does not match any of the negative patterns.");
+
+GTEST_DEFINE_bool_(list_tests, false,
+                   "List all tests without running them.");
+
+GTEST_DEFINE_string_(
+    output,
+    internal::StringFromGTestEnv("output", ""),
+    "A format (currently must be \"xml\"), optionally followed "
+    "by a colon and an output file name or directory. A directory "
+    "is indicated by a trailing pathname separator. "
+    "Examples: \"xml:filename.xml\", \"xml::directoryname/\". "
+    "If a directory is specified, output files will be created "
+    "within that directory, with file-names based on the test "
+    "executable's name and, if necessary, made unique by adding "
+    "digits.");
+
+GTEST_DEFINE_bool_(
+    print_time,
+    internal::BoolFromGTestEnv("print_time", true),
+    "True iff " GTEST_NAME_
+    " should display elapsed time in text output.");
+
+GTEST_DEFINE_int32_(
+    random_seed,
+    internal::Int32FromGTestEnv("random_seed", 0),
+    "Random number seed to use when shuffling test orders.  Must be in range "
+    "[1, 99999], or 0 to use a seed based on the current time.");
+
+GTEST_DEFINE_int32_(
+    repeat,
+    internal::Int32FromGTestEnv("repeat", 1),
+    "How many times to repeat each test.  Specify a negative number "
+    "for repeating forever.  Useful for shaking out flaky tests.");
+
+GTEST_DEFINE_bool_(
+    show_internal_stack_frames, false,
+    "True iff " GTEST_NAME_ " should include internal stack frames when "
+    "printing test failure stack traces.");
+
+GTEST_DEFINE_bool_(
+    shuffle,
+    internal::BoolFromGTestEnv("shuffle", false),
+    "True iff " GTEST_NAME_
+    " should randomize tests' order on every run.");
+
+GTEST_DEFINE_int32_(
+    stack_trace_depth,
+    internal::Int32FromGTestEnv("stack_trace_depth", kMaxStackTraceDepth),
+    "The maximum number of stack frames to print when an "
+    "assertion fails.  The valid range is 0 through 100, inclusive.");
+
+GTEST_DEFINE_string_(
+    stream_result_to,
+    internal::StringFromGTestEnv("stream_result_to", ""),
+    "This flag specifies the host name and the port number on which to stream "
+    "test results. Example: \"localhost:555\". The flag is effective only on "
+    "Linux.");
+
+GTEST_DEFINE_bool_(
+    throw_on_failure,
+    internal::BoolFromGTestEnv("throw_on_failure", false),
+    "When this flag is specified, a failed assertion will throw an exception "
+    "if exceptions are enabled or exit the program with a non-zero code "
+    "otherwise.");
+
+namespace internal {
+
+// Generates a random number from [0, range), using a Linear
+// Congruential Generator (LCG).  Crashes if 'range' is 0 or greater
+// than kMaxRange.
+UInt32 Random::Generate(UInt32 range) {
+  // These constants are the same as are used in glibc's rand(3).
+  state_ = (1103515245U*state_ + 12345U) % kMaxRange;
+
+  GTEST_CHECK_(range > 0)
+      << "Cannot generate a number in the range [0, 0).";
+  GTEST_CHECK_(range <= kMaxRange)
+      << "Generation of a number in [0, " << range << ") was requested, "
+      << "but this can only generate numbers in [0, " << kMaxRange << ").";
+
+  // Converting via modulus introduces a bit of downward bias, but
+  // it's simple, and a linear congruential generator isn't too good
+  // to begin with.
+  return state_ % range;
+}
+
+// GTestIsInitialized() returns true iff the user has initialized
+// Google Test.  Useful for catching the user mistake of not initializing
+// Google Test before calling RUN_ALL_TESTS().
+//
+// A user must call testing::InitGoogleTest() to initialize Google
+// Test.  g_init_gtest_count is set to the number of times
+// InitGoogleTest() has been called.  We don't protect this variable
+// under a mutex as it is only accessed in the main thread.
+GTEST_API_ int g_init_gtest_count = 0;
+static bool GTestIsInitialized() { return g_init_gtest_count != 0; }
+
+// Iterates over a vector of TestCases, keeping a running sum of the
+// results of calling a given int-returning method on each.
+// Returns the sum.
+static int SumOverTestCaseList(const std::vector<TestCase*>& case_list,
+                               int (TestCase::*method)() const) {
+  int sum = 0;
+  for (size_t i = 0; i < case_list.size(); i++) {
+    sum += (case_list[i]->*method)();
+  }
+  return sum;
+}
+
+// Returns true iff the test case passed.
+static bool TestCasePassed(const TestCase* test_case) {
+  return test_case->should_run() && test_case->Passed();
+}
+
+// Returns true iff the test case failed.
+static bool TestCaseFailed(const TestCase* test_case) {
+  return test_case->should_run() && test_case->Failed();
+}
+
+// Returns true iff test_case contains at least one test that should
+// run.
+static bool ShouldRunTestCase(const TestCase* test_case) {
+  return test_case->should_run();
+}
+
+// AssertHelper constructor.
+AssertHelper::AssertHelper(TestPartResult::Type type,
+                           const char* file,
+                           int line,
+                           const char* message)
+    : data_(new AssertHelperData(type, file, line, message)) {
+}
+
+AssertHelper::~AssertHelper() {
+  delete data_;
+}
+
+// Message assignment, for assertion streaming support.
+void AssertHelper::operator=(const Message& message) const {
+  UnitTest::GetInstance()->
+    AddTestPartResult(data_->type, data_->file, data_->line,
+                      AppendUserMessage(data_->message, message),
+                      UnitTest::GetInstance()->impl()
+                      ->CurrentOsStackTraceExceptTop(1)
+                      // Skips the stack frame for this function itself.
+                      );  // NOLINT
+}
+
+// Mutex for linked pointers.
+GTEST_API_ GTEST_DEFINE_STATIC_MUTEX_(g_linked_ptr_mutex);
+
+// Application pathname gotten in InitGoogleTest.
+std::string g_executable_path;
+
+// Returns the current application's name, removing directory path if that
+// is present.
+FilePath GetCurrentExecutableName() {
+  FilePath result;
+
+#if GTEST_OS_WINDOWS
+  result.Set(FilePath(g_executable_path).RemoveExtension("exe"));
+#else
+  result.Set(FilePath(g_executable_path));
+#endif  // GTEST_OS_WINDOWS
+
+  return result.RemoveDirectoryName();
+}
+
+// Functions for processing the gtest_output flag.
+
+// Returns the output format, or "" for normal printed output.
+std::string UnitTestOptions::GetOutputFormat() {
+  const char* const gtest_output_flag = GTEST_FLAG(output).c_str();
+  if (gtest_output_flag == NULL) return std::string("");
+
+  const char* const colon = strchr(gtest_output_flag, ':');
+  return (colon == NULL) ?
+      std::string(gtest_output_flag) :
+      std::string(gtest_output_flag, colon - gtest_output_flag);
+}
+
+// Returns the name of the requested output file, or the default if none
+// was explicitly specified.
+std::string UnitTestOptions::GetAbsolutePathToOutputFile() {
+  const char* const gtest_output_flag = GTEST_FLAG(output).c_str();
+  if (gtest_output_flag == NULL)
+    return "";
+
+  const char* const colon = strchr(gtest_output_flag, ':');
+  if (colon == NULL)
+    return internal::FilePath::ConcatPaths(
+        internal::FilePath(
+            UnitTest::GetInstance()->original_working_dir()),
+        internal::FilePath(kDefaultOutputFile)).string();
+
+  internal::FilePath output_name(colon + 1);
+  if (!output_name.IsAbsolutePath())
+    // TODO(wan at google.com): on Windows \some\path is not an absolute
+    // path (as its meaning depends on the current drive), yet the
+    // following logic for turning it into an absolute path is wrong.
+    // Fix it.
+    output_name = internal::FilePath::ConcatPaths(
+        internal::FilePath(UnitTest::GetInstance()->original_working_dir()),
+        internal::FilePath(colon + 1));
+
+  if (!output_name.IsDirectory())
+    return output_name.string();
+
+  internal::FilePath result(internal::FilePath::GenerateUniqueFileName(
+      output_name, internal::GetCurrentExecutableName(),
+      GetOutputFormat().c_str()));
+  return result.string();
+}
+
+// Returns true iff the wildcard pattern matches the string.  The
+// first ':' or '\0' character in pattern marks the end of it.
+//
+// This recursive algorithm isn't very efficient, but is clear and
+// works well enough for matching test names, which are short.
+bool UnitTestOptions::PatternMatchesString(const char *pattern,
+                                           const char *str) {
+  switch (*pattern) {
+    case '\0':
+    case ':':  // Either ':' or '\0' marks the end of the pattern.
+      return *str == '\0';
+    case '?':  // Matches any single character.
+      return *str != '\0' && PatternMatchesString(pattern + 1, str + 1);
+    case '*':  // Matches any string (possibly empty) of characters.
+      return (*str != '\0' && PatternMatchesString(pattern, str + 1)) ||
+          PatternMatchesString(pattern + 1, str);
+    default:  // Non-special character.  Matches itself.
+      return *pattern == *str &&
+          PatternMatchesString(pattern + 1, str + 1);
+  }
+}
+
+bool UnitTestOptions::MatchesFilter(
+    const std::string& name, const char* filter) {
+  const char *cur_pattern = filter;
+  for (;;) {
+    if (PatternMatchesString(cur_pattern, name.c_str())) {
+      return true;
+    }
+
+    // Finds the next pattern in the filter.
+    cur_pattern = strchr(cur_pattern, ':');
+
+    // Returns if no more pattern can be found.
+    if (cur_pattern == NULL) {
+      return false;
+    }
+
+    // Skips the pattern separater (the ':' character).
+    cur_pattern++;
+  }
+}
+
+// Returns true iff the user-specified filter matches the test case
+// name and the test name.
+bool UnitTestOptions::FilterMatchesTest(const std::string &test_case_name,
+                                        const std::string &test_name) {
+  const std::string& full_name = test_case_name + "." + test_name.c_str();
+
+  // Split --gtest_filter at '-', if there is one, to separate into
+  // positive filter and negative filter portions
+  const char* const p = GTEST_FLAG(filter).c_str();
+  const char* const dash = strchr(p, '-');
+  std::string positive;
+  std::string negative;
+  if (dash == NULL) {
+    positive = GTEST_FLAG(filter).c_str();  // Whole string is a positive filter
+    negative = "";
+  } else {
+    positive = std::string(p, dash);   // Everything up to the dash
+    negative = std::string(dash + 1);  // Everything after the dash
+    if (positive.empty()) {
+      // Treat '-test1' as the same as '*-test1'
+      positive = kUniversalFilter;
+    }
+  }
+
+  // A filter is a colon-separated list of patterns.  It matches a
+  // test if any pattern in it matches the test.
+  return (MatchesFilter(full_name, positive.c_str()) &&
+          !MatchesFilter(full_name, negative.c_str()));
+}
+
+#if GTEST_HAS_SEH
+// Returns EXCEPTION_EXECUTE_HANDLER if Google Test should handle the
+// given SEH exception, or EXCEPTION_CONTINUE_SEARCH otherwise.
+// This function is useful as an __except condition.
+int UnitTestOptions::GTestShouldProcessSEH(DWORD exception_code) {
+  // Google Test should handle a SEH exception if:
+  //   1. the user wants it to, AND
+  //   2. this is not a breakpoint exception, AND
+  //   3. this is not a C++ exception (VC++ implements them via SEH,
+  //      apparently).
+  //
+  // SEH exception code for C++ exceptions.
+  // (see http://support.microsoft.com/kb/185294 for more information).
+  const DWORD kCxxExceptionCode = 0xe06d7363;
+
+  bool should_handle = true;
+
+  if (!GTEST_FLAG(catch_exceptions))
+    should_handle = false;
+  else if (exception_code == EXCEPTION_BREAKPOINT)
+    should_handle = false;
+  else if (exception_code == kCxxExceptionCode)
+    should_handle = false;
+
+  return should_handle ? EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH;
+}
+#endif  // GTEST_HAS_SEH
+
+}  // namespace internal
+
+// The c'tor sets this object as the test part result reporter used by
+// Google Test.  The 'result' parameter specifies where to report the
+// results. Intercepts only failures from the current thread.
+ScopedFakeTestPartResultReporter::ScopedFakeTestPartResultReporter(
+    TestPartResultArray* result)
+    : intercept_mode_(INTERCEPT_ONLY_CURRENT_THREAD),
+      result_(result) {
+  Init();
+}
+
+// The c'tor sets this object as the test part result reporter used by
+// Google Test.  The 'result' parameter specifies where to report the
+// results.
+ScopedFakeTestPartResultReporter::ScopedFakeTestPartResultReporter(
+    InterceptMode intercept_mode, TestPartResultArray* result)
+    : intercept_mode_(intercept_mode),
+      result_(result) {
+  Init();
+}
+
+void ScopedFakeTestPartResultReporter::Init() {
+  internal::UnitTestImpl* const impl = internal::GetUnitTestImpl();
+  if (intercept_mode_ == INTERCEPT_ALL_THREADS) {
+    old_reporter_ = impl->GetGlobalTestPartResultReporter();
+    impl->SetGlobalTestPartResultReporter(this);
+  } else {
+    old_reporter_ = impl->GetTestPartResultReporterForCurrentThread();
+    impl->SetTestPartResultReporterForCurrentThread(this);
+  }
+}
+
+// The d'tor restores the test part result reporter used by Google Test
+// before.
+ScopedFakeTestPartResultReporter::~ScopedFakeTestPartResultReporter() {
+  internal::UnitTestImpl* const impl = internal::GetUnitTestImpl();
+  if (intercept_mode_ == INTERCEPT_ALL_THREADS) {
+    impl->SetGlobalTestPartResultReporter(old_reporter_);
+  } else {
+    impl->SetTestPartResultReporterForCurrentThread(old_reporter_);
+  }
+}
+
+// Increments the test part result count and remembers the result.
+// This method is from the TestPartResultReporterInterface interface.
+void ScopedFakeTestPartResultReporter::ReportTestPartResult(
+    const TestPartResult& result) {
+  result_->Append(result);
+}
+
+namespace internal {
+
+// Returns the type ID of ::testing::Test.  We should always call this
+// instead of GetTypeId< ::testing::Test>() to get the type ID of
+// testing::Test.  This is to work around a suspected linker bug when
+// using Google Test as a framework on Mac OS X.  The bug causes
+// GetTypeId< ::testing::Test>() to return different values depending
+// on whether the call is from the Google Test framework itself or
+// from user test code.  GetTestTypeId() is guaranteed to always
+// return the same value, as it always calls GetTypeId<>() from the
+// gtest.cc, which is within the Google Test framework.
+TypeId GetTestTypeId() {
+  return GetTypeId<Test>();
+}
+
+// The value of GetTestTypeId() as seen from within the Google Test
+// library.  This is solely for testing GetTestTypeId().
+extern const TypeId kTestTypeIdInGoogleTest = GetTestTypeId();
+
+// This predicate-formatter checks that 'results' contains a test part
+// failure of the given type and that the failure message contains the
+// given substring.
+AssertionResult HasOneFailure(const char* /* results_expr */,
+                              const char* /* type_expr */,
+                              const char* /* substr_expr */,
+                              const TestPartResultArray& results,
+                              TestPartResult::Type type,
+                              const string& substr) {
+  const std::string expected(type == TestPartResult::kFatalFailure ?
+                        "1 fatal failure" :
+                        "1 non-fatal failure");
+  Message msg;
+  if (results.size() != 1) {
+    msg << "Expected: " << expected << "\n"
+        << "  Actual: " << results.size() << " failures";
+    for (int i = 0; i < results.size(); i++) {
+      msg << "\n" << results.GetTestPartResult(i);
+    }
+    return AssertionFailure() << msg;
+  }
+
+  const TestPartResult& r = results.GetTestPartResult(0);
+  if (r.type() != type) {
+    return AssertionFailure() << "Expected: " << expected << "\n"
+                              << "  Actual:\n"
+                              << r;
+  }
+
+  if (strstr(r.message(), substr.c_str()) == NULL) {
+    return AssertionFailure() << "Expected: " << expected << " containing \""
+                              << substr << "\"\n"
+                              << "  Actual:\n"
+                              << r;
+  }
+
+  return AssertionSuccess();
+}
+
+// The constructor of SingleFailureChecker remembers where to look up
+// test part results, what type of failure we expect, and what
+// substring the failure message should contain.
+SingleFailureChecker:: SingleFailureChecker(
+    const TestPartResultArray* results,
+    TestPartResult::Type type,
+    const string& substr)
+    : results_(results),
+      type_(type),
+      substr_(substr) {}
+
+// The destructor of SingleFailureChecker verifies that the given
+// TestPartResultArray contains exactly one failure that has the given
+// type and contains the given substring.  If that's not the case, a
+// non-fatal failure will be generated.
+SingleFailureChecker::~SingleFailureChecker() {
+  EXPECT_PRED_FORMAT3(HasOneFailure, *results_, type_, substr_);
+}
+
+DefaultGlobalTestPartResultReporter::DefaultGlobalTestPartResultReporter(
+    UnitTestImpl* unit_test) : unit_test_(unit_test) {}
+
+void DefaultGlobalTestPartResultReporter::ReportTestPartResult(
+    const TestPartResult& result) {
+  unit_test_->current_test_result()->AddTestPartResult(result);
+  unit_test_->listeners()->repeater()->OnTestPartResult(result);
+}
+
+DefaultPerThreadTestPartResultReporter::DefaultPerThreadTestPartResultReporter(
+    UnitTestImpl* unit_test) : unit_test_(unit_test) {}
+
+void DefaultPerThreadTestPartResultReporter::ReportTestPartResult(
+    const TestPartResult& result) {
+  unit_test_->GetGlobalTestPartResultReporter()->ReportTestPartResult(result);
+}
+
+// Returns the global test part result reporter.
+TestPartResultReporterInterface*
+UnitTestImpl::GetGlobalTestPartResultReporter() {
+  internal::MutexLock lock(&global_test_part_result_reporter_mutex_);
+  return global_test_part_result_repoter_;
+}
+
+// Sets the global test part result reporter.
+void UnitTestImpl::SetGlobalTestPartResultReporter(
+    TestPartResultReporterInterface* reporter) {
+  internal::MutexLock lock(&global_test_part_result_reporter_mutex_);
+  global_test_part_result_repoter_ = reporter;
+}
+
+// Returns the test part result reporter for the current thread.
+TestPartResultReporterInterface*
+UnitTestImpl::GetTestPartResultReporterForCurrentThread() {
+  return per_thread_test_part_result_reporter_.get();
+}
+
+// Sets the test part result reporter for the current thread.
+void UnitTestImpl::SetTestPartResultReporterForCurrentThread(
+    TestPartResultReporterInterface* reporter) {
+  per_thread_test_part_result_reporter_.set(reporter);
+}
+
+// Gets the number of successful test cases.
+int UnitTestImpl::successful_test_case_count() const {
+  return CountIf(test_cases_, TestCasePassed);
+}
+
+// Gets the number of failed test cases.
+int UnitTestImpl::failed_test_case_count() const {
+  return CountIf(test_cases_, TestCaseFailed);
+}
+
+// Gets the number of all test cases.
+int UnitTestImpl::total_test_case_count() const {
+  return static_cast<int>(test_cases_.size());
+}
+
+// Gets the number of all test cases that contain at least one test
+// that should run.
+int UnitTestImpl::test_case_to_run_count() const {
+  return CountIf(test_cases_, ShouldRunTestCase);
+}
+
+// Gets the number of successful tests.
+int UnitTestImpl::successful_test_count() const {
+  return SumOverTestCaseList(test_cases_, &TestCase::successful_test_count);
+}
+
+// Gets the number of failed tests.
+int UnitTestImpl::failed_test_count() const {
+  return SumOverTestCaseList(test_cases_, &TestCase::failed_test_count);
+}
+
+// Gets the number of disabled tests that will be reported in the XML report.
+int UnitTestImpl::reportable_disabled_test_count() const {
+  return SumOverTestCaseList(test_cases_,
+                             &TestCase::reportable_disabled_test_count);
+}
+
+// Gets the number of disabled tests.
+int UnitTestImpl::disabled_test_count() const {
+  return SumOverTestCaseList(test_cases_, &TestCase::disabled_test_count);
+}
+
+// Gets the number of tests to be printed in the XML report.
+int UnitTestImpl::reportable_test_count() const {
+  return SumOverTestCaseList(test_cases_, &TestCase::reportable_test_count);
+}
+
+// Gets the number of all tests.
+int UnitTestImpl::total_test_count() const {
+  return SumOverTestCaseList(test_cases_, &TestCase::total_test_count);
+}
+
+// Gets the number of tests that should run.
+int UnitTestImpl::test_to_run_count() const {
+  return SumOverTestCaseList(test_cases_, &TestCase::test_to_run_count);
+}
+
+// Returns the current OS stack trace as an std::string.
+//
+// The maximum number of stack frames to be included is specified by
+// the gtest_stack_trace_depth flag.  The skip_count parameter
+// specifies the number of top frames to be skipped, which doesn't
+// count against the number of frames to be included.
+//
+// For example, if Foo() calls Bar(), which in turn calls
+// CurrentOsStackTraceExceptTop(1), Foo() will be included in the
+// trace but Bar() and CurrentOsStackTraceExceptTop() won't.
+std::string UnitTestImpl::CurrentOsStackTraceExceptTop(int skip_count) {
+  (void)skip_count;
+  return "";
+}
+
+// Returns the current time in milliseconds.
+TimeInMillis GetTimeInMillis() {
+#if GTEST_OS_WINDOWS_MOBILE || defined(__BORLANDC__)
+  // Difference between 1970-01-01 and 1601-01-01 in milliseconds.
+  // http://analogous.blogspot.com/2005/04/epoch.html
+  const TimeInMillis kJavaEpochToWinFileTimeDelta =
+    static_cast<TimeInMillis>(116444736UL) * 100000UL;
+  const DWORD kTenthMicrosInMilliSecond = 10000;
+
+  SYSTEMTIME now_systime;
+  FILETIME now_filetime;
+  ULARGE_INTEGER now_int64;
+  // TODO(kenton at google.com): Shouldn't this just use
+  //   GetSystemTimeAsFileTime()?
+  GetSystemTime(&now_systime);
+  if (SystemTimeToFileTime(&now_systime, &now_filetime)) {
+    now_int64.LowPart = now_filetime.dwLowDateTime;
+    now_int64.HighPart = now_filetime.dwHighDateTime;
+    now_int64.QuadPart = (now_int64.QuadPart / kTenthMicrosInMilliSecond) -
+      kJavaEpochToWinFileTimeDelta;
+    return now_int64.QuadPart;
+  }
+  return 0;
+#elif GTEST_OS_WINDOWS && !GTEST_HAS_GETTIMEOFDAY_
+  __timeb64 now;
+
+# ifdef _MSC_VER
+
+  // MSVC 8 deprecates _ftime64(), so we want to suppress warning 4996
+  // (deprecated function) there.
+  // TODO(kenton at google.com): Use GetTickCount()?  Or use
+  //   SystemTimeToFileTime()
+#  pragma warning(push)          // Saves the current warning state.
+#  pragma warning(disable:4996)  // Temporarily disables warning 4996.
+  _ftime64(&now);
+#  pragma warning(pop)           // Restores the warning state.
+# else
+
+  _ftime64(&now);
+
+# endif  // _MSC_VER
+
+  return static_cast<TimeInMillis>(now.time) * 1000 + now.millitm;
+#elif GTEST_HAS_GETTIMEOFDAY_
+  struct timeval now;
+  gettimeofday(&now, NULL);
+  return static_cast<TimeInMillis>(now.tv_sec) * 1000 + now.tv_usec / 1000;
+#else
+# error "Don't know how to get the current time on your system."
+#endif
+}
+
+// Utilities
+
+// class String.
+
+#if GTEST_OS_WINDOWS_MOBILE
+// Creates a UTF-16 wide string from the given ANSI string, allocating
+// memory using new. The caller is responsible for deleting the return
+// value using delete[]. Returns the wide string, or NULL if the
+// input is NULL.
+LPCWSTR String::AnsiToUtf16(const char* ansi) {
+  if (!ansi) return NULL;
+  const int length = strlen(ansi);
+  const int unicode_length =
+      MultiByteToWideChar(CP_ACP, 0, ansi, length,
+                          NULL, 0);
+  WCHAR* unicode = new WCHAR[unicode_length + 1];
+  MultiByteToWideChar(CP_ACP, 0, ansi, length,
+                      unicode, unicode_length);
+  unicode[unicode_length] = 0;
+  return unicode;
+}
+
+// Creates an ANSI string from the given wide string, allocating
+// memory using new. The caller is responsible for deleting the return
+// value using delete[]. Returns the ANSI string, or NULL if the
+// input is NULL.
+const char* String::Utf16ToAnsi(LPCWSTR utf16_str)  {
+  if (!utf16_str) return NULL;
+  const int ansi_length =
+      WideCharToMultiByte(CP_ACP, 0, utf16_str, -1,
+                          NULL, 0, NULL, NULL);
+  char* ansi = new char[ansi_length + 1];
+  WideCharToMultiByte(CP_ACP, 0, utf16_str, -1,
+                      ansi, ansi_length, NULL, NULL);
+  ansi[ansi_length] = 0;
+  return ansi;
+}
+
+#endif  // GTEST_OS_WINDOWS_MOBILE
+
+// Compares two C strings.  Returns true iff they have the same content.
+//
+// Unlike strcmp(), this function can handle NULL argument(s).  A NULL
+// C string is considered different to any non-NULL C string,
+// including the empty string.
+bool String::CStringEquals(const char * lhs, const char * rhs) {
+  if ( lhs == NULL ) return rhs == NULL;
+
+  if ( rhs == NULL ) return false;
+
+  return strcmp(lhs, rhs) == 0;
+}
+
+#if GTEST_HAS_STD_WSTRING || GTEST_HAS_GLOBAL_WSTRING
+
+// Converts an array of wide chars to a narrow string using the UTF-8
+// encoding, and streams the result to the given Message object.
+static void StreamWideCharsToMessage(const wchar_t* wstr, size_t length,
+                                     Message* msg) {
+  for (size_t i = 0; i != length; ) {  // NOLINT
+    if (wstr[i] != L'\0') {
+      *msg << WideStringToUtf8(wstr + i, static_cast<int>(length - i));
+      while (i != length && wstr[i] != L'\0')
+        i++;
+    } else {
+      *msg << '\0';
+      i++;
+    }
+  }
+}
+
+#endif  // GTEST_HAS_STD_WSTRING || GTEST_HAS_GLOBAL_WSTRING
+
+}  // namespace internal
+
+// Constructs an empty Message.
+// We allocate the stringstream separately because otherwise each use of
+// ASSERT/EXPECT in a procedure adds over 200 bytes to the procedure's
+// stack frame leading to huge stack frames in some cases; gcc does not reuse
+// the stack space.
+Message::Message() : ss_(new ::std::stringstream) {
+  // By default, we want there to be enough precision when printing
+  // a double to a Message.
+  *ss_ << std::setprecision(std::numeric_limits<double>::digits10 + 2);
+}
+
+// These two overloads allow streaming a wide C string to a Message
+// using the UTF-8 encoding.
+Message& Message::operator <<(const wchar_t* wide_c_str) {
+  return *this << internal::String::ShowWideCString(wide_c_str);
+}
+Message& Message::operator <<(wchar_t* wide_c_str) {
+  return *this << internal::String::ShowWideCString(wide_c_str);
+}
+
+#if GTEST_HAS_STD_WSTRING
+// Converts the given wide string to a narrow string using the UTF-8
+// encoding, and streams the result to this Message object.
+Message& Message::operator <<(const ::std::wstring& wstr) {
+  internal::StreamWideCharsToMessage(wstr.c_str(), wstr.length(), this);
+  return *this;
+}
+#endif  // GTEST_HAS_STD_WSTRING
+
+#if GTEST_HAS_GLOBAL_WSTRING
+// Converts the given wide string to a narrow string using the UTF-8
+// encoding, and streams the result to this Message object.
+Message& Message::operator <<(const ::wstring& wstr) {
+  internal::StreamWideCharsToMessage(wstr.c_str(), wstr.length(), this);
+  return *this;
+}
+#endif  // GTEST_HAS_GLOBAL_WSTRING
+
+// Gets the text streamed to this object so far as an std::string.
+// Each '\0' character in the buffer is replaced with "\\0".
+std::string Message::GetString() const {
+  return internal::StringStreamToString(ss_.get());
+}
+
+// AssertionResult constructors.
+// Used in EXPECT_TRUE/FALSE(assertion_result).
+AssertionResult::AssertionResult(const AssertionResult& other)
+    : success_(other.success_),
+      message_(other.message_.get() != NULL ?
+               new ::std::string(*other.message_) :
+               static_cast< ::std::string*>(NULL)) {
+}
+
+// Returns the assertion's negation. Used with EXPECT/ASSERT_FALSE.
+AssertionResult AssertionResult::operator!() const {
+  AssertionResult negation(!success_);
+  if (message_.get() != NULL)
+    negation << *message_;
+  return negation;
+}
+
+// Makes a successful assertion result.
+AssertionResult AssertionSuccess() {
+  return AssertionResult(true);
+}
+
+// Makes a failed assertion result.
+AssertionResult AssertionFailure() {
+  return AssertionResult(false);
+}
+
+// Makes a failed assertion result with the given failure message.
+// Deprecated; use AssertionFailure() << message.
+AssertionResult AssertionFailure(const Message& message) {
+  return AssertionFailure() << message;
+}
+
+namespace internal {
+
+// Constructs and returns the message for an equality assertion
+// (e.g. ASSERT_EQ, EXPECT_STREQ, etc) failure.
+//
+// The first four parameters are the expressions used in the assertion
+// and their values, as strings.  For example, for ASSERT_EQ(foo, bar)
+// where foo is 5 and bar is 6, we have:
+//
+//   expected_expression: "foo"
+//   actual_expression:   "bar"
+//   expected_value:      "5"
+//   actual_value:        "6"
+//
+// The ignoring_case parameter is true iff the assertion is a
+// *_STRCASEEQ*.  When it's true, the string " (ignoring case)" will
+// be inserted into the message.
+AssertionResult EqFailure(const char* expected_expression,
+                          const char* actual_expression,
+                          const std::string& expected_value,
+                          const std::string& actual_value,
+                          bool ignoring_case) {
+  Message msg;
+  msg << "Value of: " << actual_expression;
+  if (actual_value != actual_expression) {
+    msg << "\n  Actual: " << actual_value;
+  }
+
+  msg << "\nExpected: " << expected_expression;
+  if (ignoring_case) {
+    msg << " (ignoring case)";
+  }
+  if (expected_value != expected_expression) {
+    msg << "\nWhich is: " << expected_value;
+  }
+
+  return AssertionFailure() << msg;
+}
+
+// Constructs a failure message for Boolean assertions such as EXPECT_TRUE.
+std::string GetBoolAssertionFailureMessage(
+    const AssertionResult& assertion_result,
+    const char* expression_text,
+    const char* actual_predicate_value,
+    const char* expected_predicate_value) {
+  const char* actual_message = assertion_result.message();
+  Message msg;
+  msg << "Value of: " << expression_text
+      << "\n  Actual: " << actual_predicate_value;
+  if (actual_message[0] != '\0')
+    msg << " (" << actual_message << ")";
+  msg << "\nExpected: " << expected_predicate_value;
+  return msg.GetString();
+}
+
+// Helper function for implementing ASSERT_NEAR.
+AssertionResult DoubleNearPredFormat(const char* expr1,
+                                     const char* expr2,
+                                     const char* abs_error_expr,
+                                     double val1,
+                                     double val2,
+                                     double abs_error) {
+  const double diff = fabs(val1 - val2);
+  if (diff <= abs_error) return AssertionSuccess();
+
+  // TODO(wan): do not print the value of an expression if it's
+  // already a literal.
+  return AssertionFailure()
+      << "The difference between " << expr1 << " and " << expr2
+      << " is " << diff << ", which exceeds " << abs_error_expr << ", where\n"
+      << expr1 << " evaluates to " << val1 << ",\n"
+      << expr2 << " evaluates to " << val2 << ", and\n"
+      << abs_error_expr << " evaluates to " << abs_error << ".";
+}
+
+
+// Helper template for implementing FloatLE() and DoubleLE().
+template <typename RawType>
+AssertionResult FloatingPointLE(const char* expr1,
+                                const char* expr2,
+                                RawType val1,
+                                RawType val2) {
+  // Returns success if val1 is less than val2,
+  if (val1 < val2) {
+    return AssertionSuccess();
+  }
+
+  // or if val1 is almost equal to val2.
+  const FloatingPoint<RawType> lhs(val1), rhs(val2);
+  if (lhs.AlmostEquals(rhs)) {
+    return AssertionSuccess();
+  }
+
+  // Note that the above two checks will both fail if either val1 or
+  // val2 is NaN, as the IEEE floating-point standard requires that
+  // any predicate involving a NaN must return false.
+
+  ::std::stringstream val1_ss;
+  val1_ss << std::setprecision(std::numeric_limits<RawType>::digits10 + 2)
+          << val1;
+
+  ::std::stringstream val2_ss;
+  val2_ss << std::setprecision(std::numeric_limits<RawType>::digits10 + 2)
+          << val2;
+
+  return AssertionFailure()
+      << "Expected: (" << expr1 << ") <= (" << expr2 << ")\n"
+      << "  Actual: " << StringStreamToString(&val1_ss) << " vs "
+      << StringStreamToString(&val2_ss);
+}
+
+}  // namespace internal
+
+// Asserts that val1 is less than, or almost equal to, val2.  Fails
+// otherwise.  In particular, it fails if either val1 or val2 is NaN.
+AssertionResult FloatLE(const char* expr1, const char* expr2,
+                        float val1, float val2) {
+  return internal::FloatingPointLE<float>(expr1, expr2, val1, val2);
+}
+
+// Asserts that val1 is less than, or almost equal to, val2.  Fails
+// otherwise.  In particular, it fails if either val1 or val2 is NaN.
+AssertionResult DoubleLE(const char* expr1, const char* expr2,
+                         double val1, double val2) {
+  return internal::FloatingPointLE<double>(expr1, expr2, val1, val2);
+}
+
+namespace internal {
+
+// The helper function for {ASSERT|EXPECT}_EQ with int or enum
+// arguments.
+AssertionResult CmpHelperEQ(const char* expected_expression,
+                            const char* actual_expression,
+                            BiggestInt expected,
+                            BiggestInt actual) {
+  if (expected == actual) {
+    return AssertionSuccess();
+  }
+
+  return EqFailure(expected_expression,
+                   actual_expression,
+                   FormatForComparisonFailureMessage(expected, actual),
+                   FormatForComparisonFailureMessage(actual, expected),
+                   false);
+}
+
+// A macro for implementing the helper functions needed to implement
+// ASSERT_?? and EXPECT_?? with integer or enum arguments.  It is here
+// just to avoid copy-and-paste of similar code.
+#define GTEST_IMPL_CMP_HELPER_(op_name, op)\
+AssertionResult CmpHelper##op_name(const char* expr1, const char* expr2, \
+                                   BiggestInt val1, BiggestInt val2) {\
+  if (val1 op val2) {\
+    return AssertionSuccess();\
+  } else {\
+    return AssertionFailure() \
+        << "Expected: (" << expr1 << ") " #op " (" << expr2\
+        << "), actual: " << FormatForComparisonFailureMessage(val1, val2)\
+        << " vs " << FormatForComparisonFailureMessage(val2, val1);\
+  }\
+}
+
+// Implements the helper function for {ASSERT|EXPECT}_NE with int or
+// enum arguments.
+GTEST_IMPL_CMP_HELPER_(NE, !=)
+// Implements the helper function for {ASSERT|EXPECT}_LE with int or
+// enum arguments.
+GTEST_IMPL_CMP_HELPER_(LE, <=)
+// Implements the helper function for {ASSERT|EXPECT}_LT with int or
+// enum arguments.
+GTEST_IMPL_CMP_HELPER_(LT, < )
+// Implements the helper function for {ASSERT|EXPECT}_GE with int or
+// enum arguments.
+GTEST_IMPL_CMP_HELPER_(GE, >=)
+// Implements the helper function for {ASSERT|EXPECT}_GT with int or
+// enum arguments.
+GTEST_IMPL_CMP_HELPER_(GT, > )
+
+#undef GTEST_IMPL_CMP_HELPER_
+
+// The helper function for {ASSERT|EXPECT}_STREQ.
+AssertionResult CmpHelperSTREQ(const char* expected_expression,
+                               const char* actual_expression,
+                               const char* expected,
+                               const char* actual) {
+  if (String::CStringEquals(expected, actual)) {
+    return AssertionSuccess();
+  }
+
+  return EqFailure(expected_expression,
+                   actual_expression,
+                   PrintToString(expected),
+                   PrintToString(actual),
+                   false);
+}
+
+// The helper function for {ASSERT|EXPECT}_STRCASEEQ.
+AssertionResult CmpHelperSTRCASEEQ(const char* expected_expression,
+                                   const char* actual_expression,
+                                   const char* expected,
+                                   const char* actual) {
+  if (String::CaseInsensitiveCStringEquals(expected, actual)) {
+    return AssertionSuccess();
+  }
+
+  return EqFailure(expected_expression,
+                   actual_expression,
+                   PrintToString(expected),
+                   PrintToString(actual),
+                   true);
+}
+
+// The helper function for {ASSERT|EXPECT}_STRNE.
+AssertionResult CmpHelperSTRNE(const char* s1_expression,
+                               const char* s2_expression,
+                               const char* s1,
+                               const char* s2) {
+  if (!String::CStringEquals(s1, s2)) {
+    return AssertionSuccess();
+  } else {
+    return AssertionFailure() << "Expected: (" << s1_expression << ") != ("
+                              << s2_expression << "), actual: \""
+                              << s1 << "\" vs \"" << s2 << "\"";
+  }
+}
+
+// The helper function for {ASSERT|EXPECT}_STRCASENE.
+AssertionResult CmpHelperSTRCASENE(const char* s1_expression,
+                                   const char* s2_expression,
+                                   const char* s1,
+                                   const char* s2) {
+  if (!String::CaseInsensitiveCStringEquals(s1, s2)) {
+    return AssertionSuccess();
+  } else {
+    return AssertionFailure()
+        << "Expected: (" << s1_expression << ") != ("
+        << s2_expression << ") (ignoring case), actual: \""
+        << s1 << "\" vs \"" << s2 << "\"";
+  }
+}
+
+}  // namespace internal
+
+namespace {
+
+// Helper functions for implementing IsSubString() and IsNotSubstring().
+
+// This group of overloaded functions return true iff needle is a
+// substring of haystack.  NULL is considered a substring of itself
+// only.
+
+bool IsSubstringPred(const char* needle, const char* haystack) {
+  if (needle == NULL || haystack == NULL)
+    return needle == haystack;
+
+  return strstr(haystack, needle) != NULL;
+}
+
+bool IsSubstringPred(const wchar_t* needle, const wchar_t* haystack) {
+  if (needle == NULL || haystack == NULL)
+    return needle == haystack;
+
+  return wcsstr(haystack, needle) != NULL;
+}
+
+// StringType here can be either ::std::string or ::std::wstring.
+template <typename StringType>
+bool IsSubstringPred(const StringType& needle,
+                     const StringType& haystack) {
+  return haystack.find(needle) != StringType::npos;
+}
+
+// This function implements either IsSubstring() or IsNotSubstring(),
+// depending on the value of the expected_to_be_substring parameter.
+// StringType here can be const char*, const wchar_t*, ::std::string,
+// or ::std::wstring.
+template <typename StringType>
+AssertionResult IsSubstringImpl(
+    bool expected_to_be_substring,
+    const char* needle_expr, const char* haystack_expr,
+    const StringType& needle, const StringType& haystack) {
+  if (IsSubstringPred(needle, haystack) == expected_to_be_substring)
+    return AssertionSuccess();
+
+  const bool is_wide_string = sizeof(needle[0]) > 1;
+  const char* const begin_string_quote = is_wide_string ? "L\"" : "\"";
+  return AssertionFailure()
+      << "Value of: " << needle_expr << "\n"
+      << "  Actual: " << begin_string_quote << needle << "\"\n"
+      << "Expected: " << (expected_to_be_substring ? "" : "not ")
+      << "a substring of " << haystack_expr << "\n"
+      << "Which is: " << begin_string_quote << haystack << "\"";
+}
+
+}  // namespace
+
+// IsSubstring() and IsNotSubstring() check whether needle is a
+// substring of haystack (NULL is considered a substring of itself
+// only), and return an appropriate error message when they fail.
+
+AssertionResult IsSubstring(
+    const char* needle_expr, const char* haystack_expr,
+    const char* needle, const char* haystack) {
+  return IsSubstringImpl(true, needle_expr, haystack_expr, needle, haystack);
+}
+
+AssertionResult IsSubstring(
+    const char* needle_expr, const char* haystack_expr,
+    const wchar_t* needle, const wchar_t* haystack) {
+  return IsSubstringImpl(true, needle_expr, haystack_expr, needle, haystack);
+}
+
+AssertionResult IsNotSubstring(
+    const char* needle_expr, const char* haystack_expr,
+    const char* needle, const char* haystack) {
+  return IsSubstringImpl(false, needle_expr, haystack_expr, needle, haystack);
+}
+
+AssertionResult IsNotSubstring(
+    const char* needle_expr, const char* haystack_expr,
+    const wchar_t* needle, const wchar_t* haystack) {
+  return IsSubstringImpl(false, needle_expr, haystack_expr, needle, haystack);
+}
+
+AssertionResult IsSubstring(
+    const char* needle_expr, const char* haystack_expr,
+    const ::std::string& needle, const ::std::string& haystack) {
+  return IsSubstringImpl(true, needle_expr, haystack_expr, needle, haystack);
+}
+
+AssertionResult IsNotSubstring(
+    const char* needle_expr, const char* haystack_expr,
+    const ::std::string& needle, const ::std::string& haystack) {
+  return IsSubstringImpl(false, needle_expr, haystack_expr, needle, haystack);
+}
+
+#if GTEST_HAS_STD_WSTRING
+AssertionResult IsSubstring(
+    const char* needle_expr, const char* haystack_expr,
+    const ::std::wstring& needle, const ::std::wstring& haystack) {
+  return IsSubstringImpl(true, needle_expr, haystack_expr, needle, haystack);
+}
+
+AssertionResult IsNotSubstring(
+    const char* needle_expr, const char* haystack_expr,
+    const ::std::wstring& needle, const ::std::wstring& haystack) {
+  return IsSubstringImpl(false, needle_expr, haystack_expr, needle, haystack);
+}
+#endif  // GTEST_HAS_STD_WSTRING
+
+namespace internal {
+
+#if GTEST_OS_WINDOWS
+
+namespace {
+
+// Helper function for IsHRESULT{SuccessFailure} predicates
+AssertionResult HRESULTFailureHelper(const char* expr,
+                                     const char* expected,
+                                     long hr) {  // NOLINT
+# if GTEST_OS_WINDOWS_MOBILE
+
+  // Windows CE doesn't support FormatMessage.
+  const char error_text[] = "";
+
+# else
+
+  // Looks up the human-readable system message for the HRESULT code
+  // and since we're not passing any params to FormatMessage, we don't
+  // want inserts expanded.
+  const DWORD kFlags = FORMAT_MESSAGE_FROM_SYSTEM |
+                       FORMAT_MESSAGE_IGNORE_INSERTS;
+  const DWORD kBufSize = 4096;
+  // Gets the system's human readable message string for this HRESULT.
+  char error_text[kBufSize] = { '\0' };
+  DWORD message_length = ::FormatMessageA(kFlags,
+                                          0,  // no source, we're asking system
+                                          hr,  // the error
+                                          0,  // no line width restrictions
+                                          error_text,  // output buffer
+                                          kBufSize,  // buf size
+                                          NULL);  // no arguments for inserts
+  // Trims tailing white space (FormatMessage leaves a trailing CR-LF)
+  for (; message_length && IsSpace(error_text[message_length - 1]);
+          --message_length) {
+    error_text[message_length - 1] = '\0';
+  }
+
+# endif  // GTEST_OS_WINDOWS_MOBILE
+
+  const std::string error_hex("0x" + String::FormatHexInt(hr));
+  return ::testing::AssertionFailure()
+      << "Expected: " << expr << " " << expected << ".\n"
+      << "  Actual: " << error_hex << " " << error_text << "\n";
+}
+
+}  // namespace
+
+AssertionResult IsHRESULTSuccess(const char* expr, long hr) {  // NOLINT
+  if (SUCCEEDED(hr)) {
+    return AssertionSuccess();
+  }
+  return HRESULTFailureHelper(expr, "succeeds", hr);
+}
+
+AssertionResult IsHRESULTFailure(const char* expr, long hr) {  // NOLINT
+  if (FAILED(hr)) {
+    return AssertionSuccess();
+  }
+  return HRESULTFailureHelper(expr, "fails", hr);
+}
+
+#endif  // GTEST_OS_WINDOWS
+
+// Utility functions for encoding Unicode text (wide strings) in
+// UTF-8.
+
+// A Unicode code-point can have upto 21 bits, and is encoded in UTF-8
+// like this:
+//
+// Code-point length   Encoding
+//   0 -  7 bits       0xxxxxxx
+//   8 - 11 bits       110xxxxx 10xxxxxx
+//  12 - 16 bits       1110xxxx 10xxxxxx 10xxxxxx
+//  17 - 21 bits       11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
+
+// The maximum code-point a one-byte UTF-8 sequence can represent.
+const UInt32 kMaxCodePoint1 = (static_cast<UInt32>(1) <<  7) - 1;
+
+// The maximum code-point a two-byte UTF-8 sequence can represent.
+const UInt32 kMaxCodePoint2 = (static_cast<UInt32>(1) << (5 + 6)) - 1;
+
+// The maximum code-point a three-byte UTF-8 sequence can represent.
+const UInt32 kMaxCodePoint3 = (static_cast<UInt32>(1) << (4 + 2*6)) - 1;
+
+// The maximum code-point a four-byte UTF-8 sequence can represent.
+const UInt32 kMaxCodePoint4 = (static_cast<UInt32>(1) << (3 + 3*6)) - 1;
+
+// Chops off the n lowest bits from a bit pattern.  Returns the n
+// lowest bits.  As a side effect, the original bit pattern will be
+// shifted to the right by n bits.
+inline UInt32 ChopLowBits(UInt32* bits, int n) {
+  const UInt32 low_bits = *bits & ((static_cast<UInt32>(1) << n) - 1);
+  *bits >>= n;
+  return low_bits;
+}
+
+// Converts a Unicode code point to a narrow string in UTF-8 encoding.
+// code_point parameter is of type UInt32 because wchar_t may not be
+// wide enough to contain a code point.
+// If the code_point is not a valid Unicode code point
+// (i.e. outside of Unicode range U+0 to U+10FFFF) it will be converted
+// to "(Invalid Unicode 0xXXXXXXXX)".
+std::string CodePointToUtf8(UInt32 code_point) {
+  if (code_point > kMaxCodePoint4) {
+    return "(Invalid Unicode 0x" + String::FormatHexInt(code_point) + ")";
+  }
+
+  char str[5];  // Big enough for the largest valid code point.
+  if (code_point <= kMaxCodePoint1) {
+    str[1] = '\0';
+    str[0] = static_cast<char>(code_point);                          // 0xxxxxxx
+  } else if (code_point <= kMaxCodePoint2) {
+    str[2] = '\0';
+    str[1] = static_cast<char>(0x80 | ChopLowBits(&code_point, 6));  // 10xxxxxx
+    str[0] = static_cast<char>(0xC0 | code_point);                   // 110xxxxx
+  } else if (code_point <= kMaxCodePoint3) {
+    str[3] = '\0';
+    str[2] = static_cast<char>(0x80 | ChopLowBits(&code_point, 6));  // 10xxxxxx
+    str[1] = static_cast<char>(0x80 | ChopLowBits(&code_point, 6));  // 10xxxxxx
+    str[0] = static_cast<char>(0xE0 | code_point);                   // 1110xxxx
+  } else {  // code_point <= kMaxCodePoint4
+    str[4] = '\0';
+    str[3] = static_cast<char>(0x80 | ChopLowBits(&code_point, 6));  // 10xxxxxx
+    str[2] = static_cast<char>(0x80 | ChopLowBits(&code_point, 6));  // 10xxxxxx
+    str[1] = static_cast<char>(0x80 | ChopLowBits(&code_point, 6));  // 10xxxxxx
+    str[0] = static_cast<char>(0xF0 | code_point);                   // 11110xxx
+  }
+  return str;
+}
+
+// The following two functions only make sense if the the system
+// uses UTF-16 for wide string encoding. All supported systems
+// with 16 bit wchar_t (Windows, Cygwin, Symbian OS) do use UTF-16.
+
+// Determines if the arguments constitute UTF-16 surrogate pair
+// and thus should be combined into a single Unicode code point
+// using CreateCodePointFromUtf16SurrogatePair.
+inline bool IsUtf16SurrogatePair(wchar_t first, wchar_t second) {
+  return sizeof(wchar_t) == 2 &&
+      (first & 0xFC00) == 0xD800 && (second & 0xFC00) == 0xDC00;
+}
+
+// Creates a Unicode code point from UTF16 surrogate pair.
+inline UInt32 CreateCodePointFromUtf16SurrogatePair(wchar_t first,
+                                                    wchar_t second) {
+  const UInt32 mask = (1 << 10) - 1;
+  return (sizeof(wchar_t) == 2) ?
+      (((first & mask) << 10) | (second & mask)) + 0x10000 :
+      // This function should not be called when the condition is
+      // false, but we provide a sensible default in case it is.
+      static_cast<UInt32>(first);
+}
+
+// Converts a wide string to a narrow string in UTF-8 encoding.
+// The wide string is assumed to have the following encoding:
+//   UTF-16 if sizeof(wchar_t) == 2 (on Windows, Cygwin, Symbian OS)
+//   UTF-32 if sizeof(wchar_t) == 4 (on Linux)
+// Parameter str points to a null-terminated wide string.
+// Parameter num_chars may additionally limit the number
+// of wchar_t characters processed. -1 is used when the entire string
+// should be processed.
+// If the string contains code points that are not valid Unicode code points
+// (i.e. outside of Unicode range U+0 to U+10FFFF) they will be output
+// as '(Invalid Unicode 0xXXXXXXXX)'. If the string is in UTF16 encoding
+// and contains invalid UTF-16 surrogate pairs, values in those pairs
+// will be encoded as individual Unicode characters from Basic Normal Plane.
+std::string WideStringToUtf8(const wchar_t* str, int num_chars) {
+  if (num_chars == -1)
+    num_chars = static_cast<int>(wcslen(str));
+
+  ::std::stringstream stream;
+  for (int i = 0; i < num_chars; ++i) {
+    UInt32 unicode_code_point;
+
+    if (str[i] == L'\0') {
+      break;
+    } else if (i + 1 < num_chars && IsUtf16SurrogatePair(str[i], str[i + 1])) {
+      unicode_code_point = CreateCodePointFromUtf16SurrogatePair(str[i],
+                                                                 str[i + 1]);
+      i++;
+    } else {
+      unicode_code_point = static_cast<UInt32>(str[i]);
+    }
+
+    stream << CodePointToUtf8(unicode_code_point);
+  }
+  return StringStreamToString(&stream);
+}
+
+// Converts a wide C string to an std::string using the UTF-8 encoding.
+// NULL will be converted to "(null)".
+std::string String::ShowWideCString(const wchar_t * wide_c_str) {
+  if (wide_c_str == NULL)  return "(null)";
+
+  return internal::WideStringToUtf8(wide_c_str, -1);
+}
+
+// Compares two wide C strings.  Returns true iff they have the same
+// content.
+//
+// Unlike wcscmp(), this function can handle NULL argument(s).  A NULL
+// C string is considered different to any non-NULL C string,
+// including the empty string.
+bool String::WideCStringEquals(const wchar_t * lhs, const wchar_t * rhs) {
+  if (lhs == NULL) return rhs == NULL;
+
+  if (rhs == NULL) return false;
+
+  return wcscmp(lhs, rhs) == 0;
+}
+
+// Helper function for *_STREQ on wide strings.
+AssertionResult CmpHelperSTREQ(const char* expected_expression,
+                               const char* actual_expression,
+                               const wchar_t* expected,
+                               const wchar_t* actual) {
+  if (String::WideCStringEquals(expected, actual)) {
+    return AssertionSuccess();
+  }
+
+  return EqFailure(expected_expression,
+                   actual_expression,
+                   PrintToString(expected),
+                   PrintToString(actual),
+                   false);
+}
+
+// Helper function for *_STRNE on wide strings.
+AssertionResult CmpHelperSTRNE(const char* s1_expression,
+                               const char* s2_expression,
+                               const wchar_t* s1,
+                               const wchar_t* s2) {
+  if (!String::WideCStringEquals(s1, s2)) {
+    return AssertionSuccess();
+  }
+
+  return AssertionFailure() << "Expected: (" << s1_expression << ") != ("
+                            << s2_expression << "), actual: "
+                            << PrintToString(s1)
+                            << " vs " << PrintToString(s2);
+}
+
+// Compares two C strings, ignoring case.  Returns true iff they have
+// the same content.
+//
+// Unlike strcasecmp(), this function can handle NULL argument(s).  A
+// NULL C string is considered different to any non-NULL C string,
+// including the empty string.
+bool String::CaseInsensitiveCStringEquals(const char * lhs, const char * rhs) {
+  if (lhs == NULL)
+    return rhs == NULL;
+  if (rhs == NULL)
+    return false;
+  return posix::StrCaseCmp(lhs, rhs) == 0;
+}
+
+  // Compares two wide C strings, ignoring case.  Returns true iff they
+  // have the same content.
+  //
+  // Unlike wcscasecmp(), this function can handle NULL argument(s).
+  // A NULL C string is considered different to any non-NULL wide C string,
+  // including the empty string.
+  // NB: The implementations on different platforms slightly differ.
+  // On windows, this method uses _wcsicmp which compares according to LC_CTYPE
+  // environment variable. On GNU platform this method uses wcscasecmp
+  // which compares according to LC_CTYPE category of the current locale.
+  // On MacOS X, it uses towlower, which also uses LC_CTYPE category of the
+  // current locale.
+bool String::CaseInsensitiveWideCStringEquals(const wchar_t* lhs,
+                                              const wchar_t* rhs) {
+  if (lhs == NULL) return rhs == NULL;
+
+  if (rhs == NULL) return false;
+
+#if GTEST_OS_WINDOWS
+  return _wcsicmp(lhs, rhs) == 0;
+#elif GTEST_OS_LINUX && !GTEST_OS_LINUX_ANDROID
+  return wcscasecmp(lhs, rhs) == 0;
+#else
+  // Android, Mac OS X and Cygwin don't define wcscasecmp.
+  // Other unknown OSes may not define it either.
+  wint_t left, right;
+  do {
+    left = towlower(*lhs++);
+    right = towlower(*rhs++);
+  } while (left && left == right);
+  return left == right;
+#endif  // OS selector
+}
+
+// Returns true iff str ends with the given suffix, ignoring case.
+// Any string is considered to end with an empty suffix.
+bool String::EndsWithCaseInsensitive(
+    const std::string& str, const std::string& suffix) {
+  const size_t str_len = str.length();
+  const size_t suffix_len = suffix.length();
+  return (str_len >= suffix_len) &&
+         CaseInsensitiveCStringEquals(str.c_str() + str_len - suffix_len,
+                                      suffix.c_str());
+}
+
+// Formats an int value as "%02d".
+std::string String::FormatIntWidth2(int value) {
+  std::stringstream ss;
+  ss << std::setfill('0') << std::setw(2) << value;
+  return ss.str();
+}
+
+// Formats an int value as "%X".
+std::string String::FormatHexInt(int value) {
+  std::stringstream ss;
+  ss << std::hex << std::uppercase << value;
+  return ss.str();
+}
+
+// Formats a byte as "%02X".
+std::string String::FormatByte(unsigned char value) {
+  std::stringstream ss;
+  ss << std::setfill('0') << std::setw(2) << std::hex << std::uppercase
+     << static_cast<unsigned int>(value);
+  return ss.str();
+}
+
+// Converts the buffer in a stringstream to an std::string, converting NUL
+// bytes to "\\0" along the way.
+std::string StringStreamToString(::std::stringstream* ss) {
+  const ::std::string& str = ss->str();
+  const char* const start = str.c_str();
+  const char* const end = start + str.length();
+
+  std::string result;
+  result.reserve(2 * (end - start));
+  for (const char* ch = start; ch != end; ++ch) {
+    if (*ch == '\0') {
+      result += "\\0";  // Replaces NUL with "\\0";
+    } else {
+      result += *ch;
+    }
+  }
+
+  return result;
+}
+
+// Appends the user-supplied message to the Google-Test-generated message.
+std::string AppendUserMessage(const std::string& gtest_msg,
+                              const Message& user_msg) {
+  // Appends the user message if it's non-empty.
+  const std::string user_msg_string = user_msg.GetString();
+  if (user_msg_string.empty()) {
+    return gtest_msg;
+  }
+
+  return gtest_msg + "\n" + user_msg_string;
+}
+
+}  // namespace internal
+
+// class TestResult
+
+// Creates an empty TestResult.
+TestResult::TestResult()
+    : death_test_count_(0),
+      elapsed_time_(0) {
+}
+
+// D'tor.
+TestResult::~TestResult() {
+}
+
+// Returns the i-th test part result among all the results. i can
+// range from 0 to total_part_count() - 1. If i is not in that range,
+// aborts the program.
+const TestPartResult& TestResult::GetTestPartResult(int i) const {
+  if (i < 0 || i >= total_part_count())
+    internal::posix::Abort();
+  return test_part_results_.at(i);
+}
+
+// Returns the i-th test property. i can range from 0 to
+// test_property_count() - 1. If i is not in that range, aborts the
+// program.
+const TestProperty& TestResult::GetTestProperty(int i) const {
+  if (i < 0 || i >= test_property_count())
+    internal::posix::Abort();
+  return test_properties_.at(i);
+}
+
+// Clears the test part results.
+void TestResult::ClearTestPartResults() {
+  test_part_results_.clear();
+}
+
+// Adds a test part result to the list.
+void TestResult::AddTestPartResult(const TestPartResult& test_part_result) {
+  test_part_results_.push_back(test_part_result);
+}
+
+// Adds a test property to the list. If a property with the same key as the
+// supplied property is already represented, the value of this test_property
+// replaces the old value for that key.
+void TestResult::RecordProperty(const std::string& xml_element,
+                                const TestProperty& test_property) {
+  if (!ValidateTestProperty(xml_element, test_property)) {
+    return;
+  }
+  internal::MutexLock lock(&test_properites_mutex_);
+  const std::vector<TestProperty>::iterator property_with_matching_key =
+      std::find_if(test_properties_.begin(), test_properties_.end(),
+                   internal::TestPropertyKeyIs(test_property.key()));
+  if (property_with_matching_key == test_properties_.end()) {
+    test_properties_.push_back(test_property);
+    return;
+  }
+  property_with_matching_key->SetValue(test_property.value());
+}
+
+// The list of reserved attributes used in the <testsuites> element of XML
+// output.
+static const char* const kReservedTestSuitesAttributes[] = {
+  "disabled",
+  "errors",
+  "failures",
+  "name",
+  "random_seed",
+  "tests",
+  "time",
+  "timestamp"
+};
+
+// The list of reserved attributes used in the <testsuite> element of XML
+// output.
+static const char* const kReservedTestSuiteAttributes[] = {
+  "disabled",
+  "errors",
+  "failures",
+  "name",
+  "tests",
+  "time"
+};
+
+// The list of reserved attributes used in the <testcase> element of XML output.
+static const char* const kReservedTestCaseAttributes[] = {
+  "classname",
+  "name",
+  "status",
+  "time",
+  "type_param",
+  "value_param"
+};
+
+template <int kSize>
+std::vector<std::string> ArrayAsVector(const char* const (&array)[kSize]) {
+  return std::vector<std::string>(array, array + kSize);
+}
+
+static std::vector<std::string> GetReservedAttributesForElement(
+    const std::string& xml_element) {
+  if (xml_element == "testsuites") {
+    return ArrayAsVector(kReservedTestSuitesAttributes);
+  } else if (xml_element == "testsuite") {
+    return ArrayAsVector(kReservedTestSuiteAttributes);
+  } else if (xml_element == "testcase") {
+    return ArrayAsVector(kReservedTestCaseAttributes);
+  } else {
+    GTEST_CHECK_(false) << "Unrecognized xml_element provided: " << xml_element;
+  }
+  // This code is unreachable but some compilers may not realizes that.
+  return std::vector<std::string>();
+}
+
+static std::string FormatWordList(const std::vector<std::string>& words) {
+  Message word_list;
+  for (size_t i = 0; i < words.size(); ++i) {
+    if (i > 0 && words.size() > 2) {
+      word_list << ", ";
+    }
+    if (i == words.size() - 1) {
+      word_list << "and ";
+    }
+    word_list << "'" << words[i] << "'";
+  }
+  return word_list.GetString();
+}
+
+bool ValidateTestPropertyName(const std::string& property_name,
+                              const std::vector<std::string>& reserved_names) {
+  if (std::find(reserved_names.begin(), reserved_names.end(), property_name) !=
+          reserved_names.end()) {
+    ADD_FAILURE() << "Reserved key used in RecordProperty(): " << property_name
+                  << " (" << FormatWordList(reserved_names)
+                  << " are reserved by " << GTEST_NAME_ << ")";
+    return false;
+  }
+  return true;
+}
+
+// Adds a failure if the key is a reserved attribute of the element named
+// xml_element.  Returns true if the property is valid.
+bool TestResult::ValidateTestProperty(const std::string& xml_element,
+                                      const TestProperty& test_property) {
+  return ValidateTestPropertyName(test_property.key(),
+                                  GetReservedAttributesForElement(xml_element));
+}
+
+// Clears the object.
+void TestResult::Clear() {
+  test_part_results_.clear();
+  test_properties_.clear();
+  death_test_count_ = 0;
+  elapsed_time_ = 0;
+}
+
+// Returns true iff the test failed.
+bool TestResult::Failed() const {
+  for (int i = 0; i < total_part_count(); ++i) {
+    if (GetTestPartResult(i).failed())
+      return true;
+  }
+  return false;
+}
+
+// Returns true iff the test part fatally failed.
+static bool TestPartFatallyFailed(const TestPartResult& result) {
+  return result.fatally_failed();
+}
+
+// Returns true iff the test fatally failed.
+bool TestResult::HasFatalFailure() const {
+  return CountIf(test_part_results_, TestPartFatallyFailed) > 0;
+}
+
+// Returns true iff the test part non-fatally failed.
+static bool TestPartNonfatallyFailed(const TestPartResult& result) {
+  return result.nonfatally_failed();
+}
+
+// Returns true iff the test has a non-fatal failure.
+bool TestResult::HasNonfatalFailure() const {
+  return CountIf(test_part_results_, TestPartNonfatallyFailed) > 0;
+}
+
+// Gets the number of all test parts.  This is the sum of the number
+// of successful test parts and the number of failed test parts.
+int TestResult::total_part_count() const {
+  return static_cast<int>(test_part_results_.size());
+}
+
+// Returns the number of the test properties.
+int TestResult::test_property_count() const {
+  return static_cast<int>(test_properties_.size());
+}
+
+// class Test
+
+// Creates a Test object.
+
+// The c'tor saves the values of all Google Test flags.
+Test::Test()
+    : gtest_flag_saver_(new internal::GTestFlagSaver) {
+}
+
+// The d'tor restores the values of all Google Test flags.
+Test::~Test() {
+  delete gtest_flag_saver_;
+}
+
+// Sets up the test fixture.
+//
+// A sub-class may override this.
+void Test::SetUp() {
+}
+
+// Tears down the test fixture.
+//
+// A sub-class may override this.
+void Test::TearDown() {
+}
+
+// Allows user supplied key value pairs to be recorded for later output.
+void Test::RecordProperty(const std::string& key, const std::string& value) {
+  UnitTest::GetInstance()->RecordProperty(key, value);
+}
+
+// Allows user supplied key value pairs to be recorded for later output.
+void Test::RecordProperty(const std::string& key, int value) {
+  Message value_message;
+  value_message << value;
+  RecordProperty(key, value_message.GetString().c_str());
+}
+
+namespace internal {
+
+void ReportFailureInUnknownLocation(TestPartResult::Type result_type,
+                                    const std::string& message) {
+  // This function is a friend of UnitTest and as such has access to
+  // AddTestPartResult.
+  UnitTest::GetInstance()->AddTestPartResult(
+      result_type,
+      NULL,  // No info about the source file where the exception occurred.
+      -1,    // We have no info on which line caused the exception.
+      message,
+      "");   // No stack trace, either.
+}
+
+}  // namespace internal
+
+// Google Test requires all tests in the same test case to use the same test
+// fixture class.  This function checks if the current test has the
+// same fixture class as the first test in the current test case.  If
+// yes, it returns true; otherwise it generates a Google Test failure and
+// returns false.
+bool Test::HasSameFixtureClass() {
+  internal::UnitTestImpl* const impl = internal::GetUnitTestImpl();
+  const TestCase* const test_case = impl->current_test_case();
+
+  // Info about the first test in the current test case.
+  const TestInfo* const first_test_info = test_case->test_info_list()[0];
+  const internal::TypeId first_fixture_id = first_test_info->fixture_class_id_;
+  const char* const first_test_name = first_test_info->name();
+
+  // Info about the current test.
+  const TestInfo* const this_test_info = impl->current_test_info();
+  const internal::TypeId this_fixture_id = this_test_info->fixture_class_id_;
+  const char* const this_test_name = this_test_info->name();
+
+  if (this_fixture_id != first_fixture_id) {
+    // Is the first test defined using TEST?
+    const bool first_is_TEST = first_fixture_id == internal::GetTestTypeId();
+    // Is this test defined using TEST?
+    const bool this_is_TEST = this_fixture_id == internal::GetTestTypeId();
+
+    if (first_is_TEST || this_is_TEST) {
+      // The user mixed TEST and TEST_F in this test case - we'll tell
+      // him/her how to fix it.
+
+      // Gets the name of the TEST and the name of the TEST_F.  Note
+      // that first_is_TEST and this_is_TEST cannot both be true, as
+      // the fixture IDs are different for the two tests.
+      const char* const TEST_name =
+          first_is_TEST ? first_test_name : this_test_name;
+      const char* const TEST_F_name =
+          first_is_TEST ? this_test_name : first_test_name;
+
+      ADD_FAILURE()
+          << "All tests in the same test case must use the same test fixture\n"
+          << "class, so mixing TEST_F and TEST in the same test case is\n"
+          << "illegal.  In test case " << this_test_info->test_case_name()
+          << ",\n"
+          << "test " << TEST_F_name << " is defined using TEST_F but\n"
+          << "test " << TEST_name << " is defined using TEST.  You probably\n"
+          << "want to change the TEST to TEST_F or move it to another test\n"
+          << "case.";
+    } else {
+      // The user defined two fixture classes with the same name in
+      // two namespaces - we'll tell him/her how to fix it.
+      ADD_FAILURE()
+          << "All tests in the same test case must use the same test fixture\n"
+          << "class.  However, in test case "
+          << this_test_info->test_case_name() << ",\n"
+          << "you defined test " << first_test_name
+          << " and test " << this_test_name << "\n"
+          << "using two different test fixture classes.  This can happen if\n"
+          << "the two classes are from different namespaces or translation\n"
+          << "units and have the same name.  You should probably rename one\n"
+          << "of the classes to put the tests into different test cases.";
+    }
+    return false;
+  }
+
+  return true;
+}
+
+#if GTEST_HAS_SEH
+
+// Adds an "exception thrown" fatal failure to the current test.  This
+// function returns its result via an output parameter pointer because VC++
+// prohibits creation of objects with destructors on stack in functions
+// using __try (see error C2712).
+static std::string* FormatSehExceptionMessage(DWORD exception_code,
+                                              const char* location) {
+  Message message;
+  message << "SEH exception with code 0x" << std::setbase(16) <<
+    exception_code << std::setbase(10) << " thrown in " << location << ".";
+
+  return new std::string(message.GetString());
+}
+
+#endif  // GTEST_HAS_SEH
+
+namespace internal {
+
+#if GTEST_HAS_EXCEPTIONS
+
+// Adds an "exception thrown" fatal failure to the current test.
+static std::string FormatCxxExceptionMessage(const char* description,
+                                             const char* location) {
+  Message message;
+  if (description != NULL) {
+    message << "C++ exception with description \"" << description << "\"";
+  } else {
+    message << "Unknown C++ exception";
+  }
+  message << " thrown in " << location << ".";
+
+  return message.GetString();
+}
+
+static std::string PrintTestPartResultToString(
+    const TestPartResult& test_part_result);
+
+GoogleTestFailureException::GoogleTestFailureException(
+    const TestPartResult& failure)
+    : ::std::runtime_error(PrintTestPartResultToString(failure).c_str()) {}
+
+#endif  // GTEST_HAS_EXCEPTIONS
+
+// We put these helper functions in the internal namespace as IBM's xlC
+// compiler rejects the code if they were declared static.
+
+// Runs the given method and handles SEH exceptions it throws, when
+// SEH is supported; returns the 0-value for type Result in case of an
+// SEH exception.  (Microsoft compilers cannot handle SEH and C++
+// exceptions in the same function.  Therefore, we provide a separate
+// wrapper function for handling SEH exceptions.)
+template <class T, typename Result>
+Result HandleSehExceptionsInMethodIfSupported(
+    T* object, Result (T::*method)(), const char* location) {
+#if GTEST_HAS_SEH
+  __try {
+    return (object->*method)();
+  } __except (internal::UnitTestOptions::GTestShouldProcessSEH(  // NOLINT
+      GetExceptionCode())) {
+    // We create the exception message on the heap because VC++ prohibits
+    // creation of objects with destructors on stack in functions using __try
+    // (see error C2712).
+    std::string* exception_message = FormatSehExceptionMessage(
+        GetExceptionCode(), location);
+    internal::ReportFailureInUnknownLocation(TestPartResult::kFatalFailure,
+                                             *exception_message);
+    delete exception_message;
+    return static_cast<Result>(0);
+  }
+#else
+  (void)location;
+  return (object->*method)();
+#endif  // GTEST_HAS_SEH
+}
+
+// Runs the given method and catches and reports C++ and/or SEH-style
+// exceptions, if they are supported; returns the 0-value for type
+// Result in case of an SEH exception.
+template <class T, typename Result>
+Result HandleExceptionsInMethodIfSupported(
+    T* object, Result (T::*method)(), const char* location) {
+  // NOTE: The user code can affect the way in which Google Test handles
+  // exceptions by setting GTEST_FLAG(catch_exceptions), but only before
+  // RUN_ALL_TESTS() starts. It is technically possible to check the flag
+  // after the exception is caught and either report or re-throw the
+  // exception based on the flag's value:
+  //
+  // try {
+  //   // Perform the test method.
+  // } catch (...) {
+  //   if (GTEST_FLAG(catch_exceptions))
+  //     // Report the exception as failure.
+  //   else
+  //     throw;  // Re-throws the original exception.
+  // }
+  //
+  // However, the purpose of this flag is to allow the program to drop into
+  // the debugger when the exception is thrown. On most platforms, once the
+  // control enters the catch block, the exception origin information is
+  // lost and the debugger will stop the program at the point of the
+  // re-throw in this function -- instead of at the point of the original
+  // throw statement in the code under test.  For this reason, we perform
+  // the check early, sacrificing the ability to affect Google Test's
+  // exception handling in the method where the exception is thrown.
+  if (internal::GetUnitTestImpl()->catch_exceptions()) {
+#if GTEST_HAS_EXCEPTIONS
+    try {
+      return HandleSehExceptionsInMethodIfSupported(object, method, location);
+    } catch (const internal::GoogleTestFailureException&) {  // NOLINT
+      // This exception type can only be thrown by a failed Google
+      // Test assertion with the intention of letting another testing
+      // framework catch it.  Therefore we just re-throw it.
+      throw;
+    } catch (const std::exception& e) {  // NOLINT
+      internal::ReportFailureInUnknownLocation(
+          TestPartResult::kFatalFailure,
+          FormatCxxExceptionMessage(e.what(), location));
+    } catch (...) {  // NOLINT
+      internal::ReportFailureInUnknownLocation(
+          TestPartResult::kFatalFailure,
+          FormatCxxExceptionMessage(NULL, location));
+    }
+    return static_cast<Result>(0);
+#else
+    return HandleSehExceptionsInMethodIfSupported(object, method, location);
+#endif  // GTEST_HAS_EXCEPTIONS
+  } else {
+    return (object->*method)();
+  }
+}
+
+}  // namespace internal
+
+// Runs the test and updates the test result.
+void Test::Run() {
+  if (!HasSameFixtureClass()) return;
+
+  internal::UnitTestImpl* const impl = internal::GetUnitTestImpl();
+  impl->os_stack_trace_getter()->UponLeavingGTest();
+  internal::HandleExceptionsInMethodIfSupported(this, &Test::SetUp, "SetUp()");
+  // We will run the test only if SetUp() was successful.
+  if (!HasFatalFailure()) {
+    impl->os_stack_trace_getter()->UponLeavingGTest();
+    internal::HandleExceptionsInMethodIfSupported(
+        this, &Test::TestBody, "the test body");
+  }
+
+  // However, we want to clean up as much as possible.  Hence we will
+  // always call TearDown(), even if SetUp() or the test body has
+  // failed.
+  impl->os_stack_trace_getter()->UponLeavingGTest();
+  internal::HandleExceptionsInMethodIfSupported(
+      this, &Test::TearDown, "TearDown()");
+}
+
+// Returns true iff the current test has a fatal failure.
+bool Test::HasFatalFailure() {
+  return internal::GetUnitTestImpl()->current_test_result()->HasFatalFailure();
+}
+
+// Returns true iff the current test has a non-fatal failure.
+bool Test::HasNonfatalFailure() {
+  return internal::GetUnitTestImpl()->current_test_result()->
+      HasNonfatalFailure();
+}
+
+// class TestInfo
+
+// Constructs a TestInfo object. It assumes ownership of the test factory
+// object.
+TestInfo::TestInfo(const std::string& a_test_case_name,
+                   const std::string& a_name,
+                   const char* a_type_param,
+                   const char* a_value_param,
+                   internal::TypeId fixture_class_id,
+                   internal::TestFactoryBase* factory)
+    : test_case_name_(a_test_case_name),
+      name_(a_name),
+      type_param_(a_type_param ? new std::string(a_type_param) : NULL),
+      value_param_(a_value_param ? new std::string(a_value_param) : NULL),
+      fixture_class_id_(fixture_class_id),
+      should_run_(false),
+      is_disabled_(false),
+      matches_filter_(false),
+      factory_(factory),
+      result_() {}
+
+// Destructs a TestInfo object.
+TestInfo::~TestInfo() { delete factory_; }
+
+namespace internal {
+
+// Creates a new TestInfo object and registers it with Google Test;
+// returns the created object.
+//
+// Arguments:
+//
+//   test_case_name:   name of the test case
+//   name:             name of the test
+//   type_param:       the name of the test's type parameter, or NULL if
+//                     this is not a typed or a type-parameterized test.
+//   value_param:      text representation of the test's value parameter,
+//                     or NULL if this is not a value-parameterized test.
+//   fixture_class_id: ID of the test fixture class
+//   set_up_tc:        pointer to the function that sets up the test case
+//   tear_down_tc:     pointer to the function that tears down the test case
+//   factory:          pointer to the factory that creates a test object.
+//                     The newly created TestInfo instance will assume
+//                     ownership of the factory object.
+TestInfo* MakeAndRegisterTestInfo(
+    const char* test_case_name,
+    const char* name,
+    const char* type_param,
+    const char* value_param,
+    TypeId fixture_class_id,
+    SetUpTestCaseFunc set_up_tc,
+    TearDownTestCaseFunc tear_down_tc,
+    TestFactoryBase* factory) {
+  TestInfo* const test_info =
+      new TestInfo(test_case_name, name, type_param, value_param,
+                   fixture_class_id, factory);
+  GetUnitTestImpl()->AddTestInfo(set_up_tc, tear_down_tc, test_info);
+  return test_info;
+}
+
+#if GTEST_HAS_PARAM_TEST
+void ReportInvalidTestCaseType(const char* test_case_name,
+                               const char* file, int line) {
+  Message errors;
+  errors
+      << "Attempted redefinition of test case " << test_case_name << ".\n"
+      << "All tests in the same test case must use the same test fixture\n"
+      << "class.  However, in test case " << test_case_name << ", you tried\n"
+      << "to define a test using a fixture class different from the one\n"
+      << "used earlier. This can happen if the two fixture classes are\n"
+      << "from different namespaces and have the same name. You should\n"
+      << "probably rename one of the classes to put the tests into different\n"
+      << "test cases.";
+
+  fprintf(stderr, "%s %s", FormatFileLocation(file, line).c_str(),
+          errors.GetString().c_str());
+}
+#endif  // GTEST_HAS_PARAM_TEST
+
+}  // namespace internal
+
+namespace {
+
+// A predicate that checks the test name of a TestInfo against a known
+// value.
+//
+// This is used for implementation of the TestCase class only.  We put
+// it in the anonymous namespace to prevent polluting the outer
+// namespace.
+//
+// TestNameIs is copyable.
+class TestNameIs {
+ public:
+  // Constructor.
+  //
+  // TestNameIs has NO default constructor.
+  explicit TestNameIs(const char* name)
+      : name_(name) {}
+
+  // Returns true iff the test name of test_info matches name_.
+  bool operator()(const TestInfo * test_info) const {
+    return test_info && test_info->name() == name_;
+  }
+
+ private:
+  std::string name_;
+};
+
+}  // namespace
+
+namespace internal {
+
+// This method expands all parameterized tests registered with macros TEST_P
+// and INSTANTIATE_TEST_CASE_P into regular tests and registers those.
+// This will be done just once during the program runtime.
+void UnitTestImpl::RegisterParameterizedTests() {
+#if GTEST_HAS_PARAM_TEST
+  if (!parameterized_tests_registered_) {
+    parameterized_test_registry_.RegisterTests();
+    parameterized_tests_registered_ = true;
+  }
+#endif
+}
+
+}  // namespace internal
+
+// Creates the test object, runs it, records its result, and then
+// deletes it.
+void TestInfo::Run() {
+  if (!should_run_) return;
+
+  // Tells UnitTest where to store test result.
+  internal::UnitTestImpl* const impl = internal::GetUnitTestImpl();
+  impl->set_current_test_info(this);
+
+  TestEventListener* repeater = UnitTest::GetInstance()->listeners().repeater();
+
+  // Notifies the unit test event listeners that a test is about to start.
+  repeater->OnTestStart(*this);
+
+  const TimeInMillis start = internal::GetTimeInMillis();
+
+  impl->os_stack_trace_getter()->UponLeavingGTest();
+
+  // Creates the test object.
+  Test* const test = internal::HandleExceptionsInMethodIfSupported(
+      factory_, &internal::TestFactoryBase::CreateTest,
+      "the test fixture's constructor");
+
+  // Runs the test only if the test object was created and its
+  // constructor didn't generate a fatal failure.
+  if ((test != NULL) && !Test::HasFatalFailure()) {
+    // This doesn't throw as all user code that can throw are wrapped into
+    // exception handling code.
+    test->Run();
+  }
+
+  // Deletes the test object.
+  impl->os_stack_trace_getter()->UponLeavingGTest();
+  internal::HandleExceptionsInMethodIfSupported(
+      test, &Test::DeleteSelf_, "the test fixture's destructor");
+
+  result_.set_elapsed_time(internal::GetTimeInMillis() - start);
+
+  // Notifies the unit test event listener that a test has just finished.
+  repeater->OnTestEnd(*this);
+
+  // Tells UnitTest to stop associating assertion results to this
+  // test.
+  impl->set_current_test_info(NULL);
+}
+
+// class TestCase
+
+// Gets the number of successful tests in this test case.
+int TestCase::successful_test_count() const {
+  return CountIf(test_info_list_, TestPassed);
+}
+
+// Gets the number of failed tests in this test case.
+int TestCase::failed_test_count() const {
+  return CountIf(test_info_list_, TestFailed);
+}
+
+// Gets the number of disabled tests that will be reported in the XML report.
+int TestCase::reportable_disabled_test_count() const {
+  return CountIf(test_info_list_, TestReportableDisabled);
+}
+
+// Gets the number of disabled tests in this test case.
+int TestCase::disabled_test_count() const {
+  return CountIf(test_info_list_, TestDisabled);
+}
+
+// Gets the number of tests to be printed in the XML report.
+int TestCase::reportable_test_count() const {
+  return CountIf(test_info_list_, TestReportable);
+}
+
+// Get the number of tests in this test case that should run.
+int TestCase::test_to_run_count() const {
+  return CountIf(test_info_list_, ShouldRunTest);
+}
+
+// Gets the number of all tests.
+int TestCase::total_test_count() const {
+  return static_cast<int>(test_info_list_.size());
+}
+
+// Creates a TestCase with the given name.
+//
+// Arguments:
+//
+//   name:         name of the test case
+//   a_type_param: the name of the test case's type parameter, or NULL if
+//                 this is not a typed or a type-parameterized test case.
+//   set_up_tc:    pointer to the function that sets up the test case
+//   tear_down_tc: pointer to the function that tears down the test case
+TestCase::TestCase(const char* a_name, const char* a_type_param,
+                   Test::SetUpTestCaseFunc set_up_tc,
+                   Test::TearDownTestCaseFunc tear_down_tc)
+    : name_(a_name),
+      type_param_(a_type_param ? new std::string(a_type_param) : NULL),
+      set_up_tc_(set_up_tc),
+      tear_down_tc_(tear_down_tc),
+      should_run_(false),
+      elapsed_time_(0) {
+}
+
+// Destructor of TestCase.
+TestCase::~TestCase() {
+  // Deletes every Test in the collection.
+  ForEach(test_info_list_, internal::Delete<TestInfo>);
+}
+
+// Returns the i-th test among all the tests. i can range from 0 to
+// total_test_count() - 1. If i is not in that range, returns NULL.
+const TestInfo* TestCase::GetTestInfo(int i) const {
+  const int index = GetElementOr(test_indices_, i, -1);
+  return index < 0 ? NULL : test_info_list_[index];
+}
+
+// Returns the i-th test among all the tests. i can range from 0 to
+// total_test_count() - 1. If i is not in that range, returns NULL.
+TestInfo* TestCase::GetMutableTestInfo(int i) {
+  const int index = GetElementOr(test_indices_, i, -1);
+  return index < 0 ? NULL : test_info_list_[index];
+}
+
+// Adds a test to this test case.  Will delete the test upon
+// destruction of the TestCase object.
+void TestCase::AddTestInfo(TestInfo * test_info) {
+  test_info_list_.push_back(test_info);
+  test_indices_.push_back(static_cast<int>(test_indices_.size()));
+}
+
+// Runs every test in this TestCase.
+void TestCase::Run() {
+  if (!should_run_) return;
+
+  internal::UnitTestImpl* const impl = internal::GetUnitTestImpl();
+  impl->set_current_test_case(this);
+
+  TestEventListener* repeater = UnitTest::GetInstance()->listeners().repeater();
+
+  repeater->OnTestCaseStart(*this);
+  impl->os_stack_trace_getter()->UponLeavingGTest();
+  internal::HandleExceptionsInMethodIfSupported(
+      this, &TestCase::RunSetUpTestCase, "SetUpTestCase()");
+
+  const internal::TimeInMillis start = internal::GetTimeInMillis();
+  for (int i = 0; i < total_test_count(); i++) {
+    GetMutableTestInfo(i)->Run();
+  }
+  elapsed_time_ = internal::GetTimeInMillis() - start;
+
+  impl->os_stack_trace_getter()->UponLeavingGTest();
+  internal::HandleExceptionsInMethodIfSupported(
+      this, &TestCase::RunTearDownTestCase, "TearDownTestCase()");
+
+  repeater->OnTestCaseEnd(*this);
+  impl->set_current_test_case(NULL);
+}
+
+// Clears the results of all tests in this test case.
+void TestCase::ClearResult() {
+  ad_hoc_test_result_.Clear();
+  ForEach(test_info_list_, TestInfo::ClearTestResult);
+}
+
+// Shuffles the tests in this test case.
+void TestCase::ShuffleTests(internal::Random* random) {
+  Shuffle(random, &test_indices_);
+}
+
+// Restores the test order to before the first shuffle.
+void TestCase::UnshuffleTests() {
+  for (size_t i = 0; i < test_indices_.size(); i++) {
+    test_indices_[i] = static_cast<int>(i);
+  }
+}
+
+// Formats a countable noun.  Depending on its quantity, either the
+// singular form or the plural form is used. e.g.
+//
+// FormatCountableNoun(1, "formula", "formuli") returns "1 formula".
+// FormatCountableNoun(5, "book", "books") returns "5 books".
+static std::string FormatCountableNoun(int count,
+                                       const char * singular_form,
+                                       const char * plural_form) {
+  return internal::StreamableToString(count) + " " +
+      (count == 1 ? singular_form : plural_form);
+}
+
+// Formats the count of tests.
+static std::string FormatTestCount(int test_count) {
+  return FormatCountableNoun(test_count, "test", "tests");
+}
+
+// Formats the count of test cases.
+static std::string FormatTestCaseCount(int test_case_count) {
+  return FormatCountableNoun(test_case_count, "test case", "test cases");
+}
+
+// Converts a TestPartResult::Type enum to human-friendly string
+// representation.  Both kNonFatalFailure and kFatalFailure are translated
+// to "Failure", as the user usually doesn't care about the difference
+// between the two when viewing the test result.
+static const char * TestPartResultTypeToString(TestPartResult::Type type) {
+  switch (type) {
+    case TestPartResult::kSuccess:
+      return "Success";
+
+    case TestPartResult::kNonFatalFailure:
+    case TestPartResult::kFatalFailure:
+#ifdef _MSC_VER
+      return "error: ";
+#else
+      return "Failure\n";
+#endif
+    default:
+      return "Unknown result type";
+  }
+}
+
+namespace internal {
+
+// Prints a TestPartResult to an std::string.
+static std::string PrintTestPartResultToString(
+    const TestPartResult& test_part_result) {
+  return (Message()
+          << internal::FormatFileLocation(test_part_result.file_name(),
+                                          test_part_result.line_number())
+          << " " << TestPartResultTypeToString(test_part_result.type())
+          << test_part_result.message()).GetString();
+}
+
+// Prints a TestPartResult.
+static void PrintTestPartResult(const TestPartResult& test_part_result) {
+  const std::string& result =
+      PrintTestPartResultToString(test_part_result);
+  printf("%s\n", result.c_str());
+  fflush(stdout);
+  // If the test program runs in Visual Studio or a debugger, the
+  // following statements add the test part result message to the Output
+  // window such that the user can double-click on it to jump to the
+  // corresponding source code location; otherwise they do nothing.
+#if GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_MOBILE
+  // We don't call OutputDebugString*() on Windows Mobile, as printing
+  // to stdout is done by OutputDebugString() there already - we don't
+  // want the same message printed twice.
+  ::OutputDebugStringA(result.c_str());
+  ::OutputDebugStringA("\n");
+#endif
+}
+
+// class PrettyUnitTestResultPrinter
+
+enum GTestColor {
+  COLOR_DEFAULT,
+  COLOR_RED,
+  COLOR_GREEN,
+  COLOR_YELLOW
+};
+
+#if GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_MOBILE
+
+// Returns the character attribute for the given color.
+WORD GetColorAttribute(GTestColor color) {
+  switch (color) {
+    case COLOR_RED:    return FOREGROUND_RED;
+    case COLOR_GREEN:  return FOREGROUND_GREEN;
+    case COLOR_YELLOW: return FOREGROUND_RED | FOREGROUND_GREEN;
+    default:           return 0;
+  }
+}
+
+#else
+
+// Returns the ANSI color code for the given color.  COLOR_DEFAULT is
+// an invalid input.
+const char* GetAnsiColorCode(GTestColor color) {
+  switch (color) {
+    case COLOR_RED:     return "1";
+    case COLOR_GREEN:   return "2";
+    case COLOR_YELLOW:  return "3";
+    default:            return NULL;
+  };
+}
+
+#endif  // GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_MOBILE
+
+// Returns true iff Google Test should use colors in the output.
+bool ShouldUseColor(bool stdout_is_tty) {
+  const char* const gtest_color = GTEST_FLAG(color).c_str();
+
+  if (String::CaseInsensitiveCStringEquals(gtest_color, "auto")) {
+#if GTEST_OS_WINDOWS
+    // On Windows the TERM variable is usually not set, but the
+    // console there does support colors.
+    return stdout_is_tty;
+#else
+    // On non-Windows platforms, we rely on the TERM variable.
+    const char* const term = posix::GetEnv("TERM");
+    const bool term_supports_color =
+        String::CStringEquals(term, "xterm") ||
+        String::CStringEquals(term, "xterm-color") ||
+        String::CStringEquals(term, "xterm-256color") ||
+        String::CStringEquals(term, "screen") ||
+        String::CStringEquals(term, "screen-256color") ||
+        String::CStringEquals(term, "linux") ||
+        String::CStringEquals(term, "cygwin");
+    return stdout_is_tty && term_supports_color;
+#endif  // GTEST_OS_WINDOWS
+  }
+
+  return String::CaseInsensitiveCStringEquals(gtest_color, "yes") ||
+      String::CaseInsensitiveCStringEquals(gtest_color, "true") ||
+      String::CaseInsensitiveCStringEquals(gtest_color, "t") ||
+      String::CStringEquals(gtest_color, "1");
+  // We take "yes", "true", "t", and "1" as meaning "yes".  If the
+  // value is neither one of these nor "auto", we treat it as "no" to
+  // be conservative.
+}
+
+// Helpers for printing colored strings to stdout. Note that on Windows, we
+// cannot simply emit special characters and have the terminal change colors.
+// This routine must actually emit the characters rather than return a string
+// that would be colored when printed, as can be done on Linux.
+void ColoredPrintf(GTestColor color, const char* fmt, ...) {
+  va_list args;
+  va_start(args, fmt);
+
+#if GTEST_OS_WINDOWS_MOBILE || GTEST_OS_SYMBIAN || GTEST_OS_ZOS || GTEST_OS_IOS
+  const bool use_color = false;
+#else
+  static const bool in_color_mode =
+      ShouldUseColor(posix::IsATTY(posix::FileNo(stdout)) != 0);
+  const bool use_color = in_color_mode && (color != COLOR_DEFAULT);
+#endif  // GTEST_OS_WINDOWS_MOBILE || GTEST_OS_SYMBIAN || GTEST_OS_ZOS
+  // The '!= 0' comparison is necessary to satisfy MSVC 7.1.
+
+  if (!use_color) {
+    vprintf(fmt, args);
+    va_end(args);
+    return;
+  }
+
+#if GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_MOBILE
+  const HANDLE stdout_handle = GetStdHandle(STD_OUTPUT_HANDLE);
+
+  // Gets the current text color.
+  CONSOLE_SCREEN_BUFFER_INFO buffer_info;
+  GetConsoleScreenBufferInfo(stdout_handle, &buffer_info);
+  const WORD old_color_attrs = buffer_info.wAttributes;
+
+  // We need to flush the stream buffers into the console before each
+  // SetConsoleTextAttribute call lest it affect the text that is already
+  // printed but has not yet reached the console.
+  fflush(stdout);
+  SetConsoleTextAttribute(stdout_handle,
+                          GetColorAttribute(color) | FOREGROUND_INTENSITY);
+  vprintf(fmt, args);
+
+  fflush(stdout);
+  // Restores the text color.
+  SetConsoleTextAttribute(stdout_handle, old_color_attrs);
+#else
+  printf("\033[0;3%sm", GetAnsiColorCode(color));
+  vprintf(fmt, args);
+  printf("\033[m");  // Resets the terminal to default.
+#endif  // GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_MOBILE
+  va_end(args);
+}
+
+// Text printed in Google Test's text output and --gunit_list_tests
+// output to label the type parameter and value parameter for a test.
+static const char kTypeParamLabel[] = "TypeParam";
+static const char kValueParamLabel[] = "GetParam()";
+
+void PrintFullTestCommentIfPresent(const TestInfo& test_info) {
+  const char* const type_param = test_info.type_param();
+  const char* const value_param = test_info.value_param();
+
+  if (type_param != NULL || value_param != NULL) {
+    printf(", where ");
+    if (type_param != NULL) {
+      printf("%s = %s", kTypeParamLabel, type_param);
+      if (value_param != NULL)
+        printf(" and ");
+    }
+    if (value_param != NULL) {
+      printf("%s = %s", kValueParamLabel, value_param);
+    }
+  }
+}
+
+// This class implements the TestEventListener interface.
+//
+// Class PrettyUnitTestResultPrinter is copyable.
+class PrettyUnitTestResultPrinter : public TestEventListener {
+ public:
+  PrettyUnitTestResultPrinter() {}
+  static void PrintTestName(const char * test_case, const char * test) {
+    printf("%s.%s", test_case, test);
+  }
+
+  // The following methods override what's in the TestEventListener class.
+  virtual void OnTestProgramStart(const UnitTest& /*unit_test*/) {}
+  virtual void OnTestIterationStart(const UnitTest& unit_test, int iteration);
+  virtual void OnEnvironmentsSetUpStart(const UnitTest& unit_test);
+  virtual void OnEnvironmentsSetUpEnd(const UnitTest& /*unit_test*/) {}
+  virtual void OnTestCaseStart(const TestCase& test_case);
+  virtual void OnTestStart(const TestInfo& test_info);
+  virtual void OnTestPartResult(const TestPartResult& result);
+  virtual void OnTestEnd(const TestInfo& test_info);
+  virtual void OnTestCaseEnd(const TestCase& test_case);
+  virtual void OnEnvironmentsTearDownStart(const UnitTest& unit_test);
+  virtual void OnEnvironmentsTearDownEnd(const UnitTest& /*unit_test*/) {}
+  virtual void OnTestIterationEnd(const UnitTest& unit_test, int iteration);
+  virtual void OnTestProgramEnd(const UnitTest& /*unit_test*/) {}
+
+ private:
+  static void PrintFailedTests(const UnitTest& unit_test);
+};
+
+  // Fired before each iteration of tests starts.
+void PrettyUnitTestResultPrinter::OnTestIterationStart(
+    const UnitTest& unit_test, int iteration) {
+  if (GTEST_FLAG(repeat) != 1)
+    printf("\nRepeating all tests (iteration %d) . . .\n\n", iteration + 1);
+
+  const char* const filter = GTEST_FLAG(filter).c_str();
+
+  // Prints the filter if it's not *.  This reminds the user that some
+  // tests may be skipped.
+  if (!String::CStringEquals(filter, kUniversalFilter)) {
+    ColoredPrintf(COLOR_YELLOW,
+                  "Note: %s filter = %s\n", GTEST_NAME_, filter);
+  }
+
+  if (internal::ShouldShard(kTestTotalShards, kTestShardIndex, false)) {
+    const Int32 shard_index = Int32FromEnvOrDie(kTestShardIndex, -1);
+    ColoredPrintf(COLOR_YELLOW,
+                  "Note: This is test shard %d of %s.\n",
+                  static_cast<int>(shard_index) + 1,
+                  internal::posix::GetEnv(kTestTotalShards));
+  }
+
+  if (GTEST_FLAG(shuffle)) {
+    ColoredPrintf(COLOR_YELLOW,
+                  "Note: Randomizing tests' orders with a seed of %d .\n",
+                  unit_test.random_seed());
+  }
+
+  ColoredPrintf(COLOR_GREEN,  "[==========] ");
+  printf("Running %s from %s.\n",
+         FormatTestCount(unit_test.test_to_run_count()).c_str(),
+         FormatTestCaseCount(unit_test.test_case_to_run_count()).c_str());
+  fflush(stdout);
+}
+
+void PrettyUnitTestResultPrinter::OnEnvironmentsSetUpStart(
+    const UnitTest& /*unit_test*/) {
+  ColoredPrintf(COLOR_GREEN,  "[----------] ");
+  printf("Global test environment set-up.\n");
+  fflush(stdout);
+}
+
+void PrettyUnitTestResultPrinter::OnTestCaseStart(const TestCase& test_case) {
+  const std::string counts =
+      FormatCountableNoun(test_case.test_to_run_count(), "test", "tests");
+  ColoredPrintf(COLOR_GREEN, "[----------] ");
+  printf("%s from %s", counts.c_str(), test_case.name());
+  if (test_case.type_param() == NULL) {
+    printf("\n");
+  } else {
+    printf(", where %s = %s\n", kTypeParamLabel, test_case.type_param());
+  }
+  fflush(stdout);
+}
+
+void PrettyUnitTestResultPrinter::OnTestStart(const TestInfo& test_info) {
+  ColoredPrintf(COLOR_GREEN,  "[ RUN      ] ");
+  PrintTestName(test_info.test_case_name(), test_info.name());
+  printf("\n");
+  fflush(stdout);
+}
+
+// Called after an assertion failure.
+void PrettyUnitTestResultPrinter::OnTestPartResult(
+    const TestPartResult& result) {
+  // If the test part succeeded, we don't need to do anything.
+  if (result.type() == TestPartResult::kSuccess)
+    return;
+
+  // Print failure message from the assertion (e.g. expected this and got that).
+  PrintTestPartResult(result);
+  fflush(stdout);
+}
+
+void PrettyUnitTestResultPrinter::OnTestEnd(const TestInfo& test_info) {
+  if (test_info.result()->Passed()) {
+    ColoredPrintf(COLOR_GREEN, "[       OK ] ");
+  } else {
+    ColoredPrintf(COLOR_RED, "[  FAILED  ] ");
+  }
+  PrintTestName(test_info.test_case_name(), test_info.name());
+  if (test_info.result()->Failed())
+    PrintFullTestCommentIfPresent(test_info);
+
+  if (GTEST_FLAG(print_time)) {
+    printf(" (%s ms)\n", internal::StreamableToString(
+           test_info.result()->elapsed_time()).c_str());
+  } else {
+    printf("\n");
+  }
+  fflush(stdout);
+}
+
+void PrettyUnitTestResultPrinter::OnTestCaseEnd(const TestCase& test_case) {
+  if (!GTEST_FLAG(print_time)) return;
+
+  const std::string counts =
+      FormatCountableNoun(test_case.test_to_run_count(), "test", "tests");
+  ColoredPrintf(COLOR_GREEN, "[----------] ");
+  printf("%s from %s (%s ms total)\n\n",
+         counts.c_str(), test_case.name(),
+         internal::StreamableToString(test_case.elapsed_time()).c_str());
+  fflush(stdout);
+}
+
+void PrettyUnitTestResultPrinter::OnEnvironmentsTearDownStart(
+    const UnitTest& /*unit_test*/) {
+  ColoredPrintf(COLOR_GREEN,  "[----------] ");
+  printf("Global test environment tear-down\n");
+  fflush(stdout);
+}
+
+// Internal helper for printing the list of failed tests.
+void PrettyUnitTestResultPrinter::PrintFailedTests(const UnitTest& unit_test) {
+  const int failed_test_count = unit_test.failed_test_count();
+  if (failed_test_count == 0) {
+    return;
+  }
+
+  for (int i = 0; i < unit_test.total_test_case_count(); ++i) {
+    const TestCase& test_case = *unit_test.GetTestCase(i);
+    if (!test_case.should_run() || (test_case.failed_test_count() == 0)) {
+      continue;
+    }
+    for (int j = 0; j < test_case.total_test_count(); ++j) {
+      const TestInfo& test_info = *test_case.GetTestInfo(j);
+      if (!test_info.should_run() || test_info.result()->Passed()) {
+        continue;
+      }
+      ColoredPrintf(COLOR_RED, "[  FAILED  ] ");
+      printf("%s.%s", test_case.name(), test_info.name());
+      PrintFullTestCommentIfPresent(test_info);
+      printf("\n");
+    }
+  }
+}
+
+void PrettyUnitTestResultPrinter::OnTestIterationEnd(const UnitTest& unit_test,
+                                                     int /*iteration*/) {
+  ColoredPrintf(COLOR_GREEN,  "[==========] ");
+  printf("%s from %s ran.",
+         FormatTestCount(unit_test.test_to_run_count()).c_str(),
+         FormatTestCaseCount(unit_test.test_case_to_run_count()).c_str());
+  if (GTEST_FLAG(print_time)) {
+    printf(" (%s ms total)",
+           internal::StreamableToString(unit_test.elapsed_time()).c_str());
+  }
+  printf("\n");
+  ColoredPrintf(COLOR_GREEN,  "[  PASSED  ] ");
+  printf("%s.\n", FormatTestCount(unit_test.successful_test_count()).c_str());
+
+  int num_failures = unit_test.failed_test_count();
+  if (!unit_test.Passed()) {
+    const int failed_test_count = unit_test.failed_test_count();
+    ColoredPrintf(COLOR_RED,  "[  FAILED  ] ");
+    printf("%s, listed below:\n", FormatTestCount(failed_test_count).c_str());
+    PrintFailedTests(unit_test);
+    printf("\n%2d FAILED %s\n", num_failures,
+                        num_failures == 1 ? "TEST" : "TESTS");
+  }
+
+  int num_disabled = unit_test.reportable_disabled_test_count();
+  if (num_disabled && !GTEST_FLAG(also_run_disabled_tests)) {
+    if (!num_failures) {
+      printf("\n");  // Add a spacer if no FAILURE banner is displayed.
+    }
+    ColoredPrintf(COLOR_YELLOW,
+                  "  YOU HAVE %d DISABLED %s\n\n",
+                  num_disabled,
+                  num_disabled == 1 ? "TEST" : "TESTS");
+  }
+  // Ensure that Google Test output is printed before, e.g., heapchecker output.
+  fflush(stdout);
+}
+
+// End PrettyUnitTestResultPrinter
+
+// class TestEventRepeater
+//
+// This class forwards events to other event listeners.
+class TestEventRepeater : public TestEventListener {
+ public:
+  TestEventRepeater() : forwarding_enabled_(true) {}
+  virtual ~TestEventRepeater();
+  void Append(TestEventListener *listener);
+  TestEventListener* Release(TestEventListener* listener);
+
+  // Controls whether events will be forwarded to listeners_. Set to false
+  // in death test child processes.
+  bool forwarding_enabled() const { return forwarding_enabled_; }
+  void set_forwarding_enabled(bool enable) { forwarding_enabled_ = enable; }
+
+  virtual void OnTestProgramStart(const UnitTest& unit_test);
+  virtual void OnTestIterationStart(const UnitTest& unit_test, int iteration);
+  virtual void OnEnvironmentsSetUpStart(const UnitTest& unit_test);
+  virtual void OnEnvironmentsSetUpEnd(const UnitTest& unit_test);
+  virtual void OnTestCaseStart(const TestCase& test_case);
+  virtual void OnTestStart(const TestInfo& test_info);
+  virtual void OnTestPartResult(const TestPartResult& result);
+  virtual void OnTestEnd(const TestInfo& test_info);
+  virtual void OnTestCaseEnd(const TestCase& test_case);
+  virtual void OnEnvironmentsTearDownStart(const UnitTest& unit_test);
+  virtual void OnEnvironmentsTearDownEnd(const UnitTest& unit_test);
+  virtual void OnTestIterationEnd(const UnitTest& unit_test, int iteration);
+  virtual void OnTestProgramEnd(const UnitTest& unit_test);
+
+ private:
+  // Controls whether events will be forwarded to listeners_. Set to false
+  // in death test child processes.
+  bool forwarding_enabled_;
+  // The list of listeners that receive events.
+  std::vector<TestEventListener*> listeners_;
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(TestEventRepeater);
+};
+
+TestEventRepeater::~TestEventRepeater() {
+  ForEach(listeners_, Delete<TestEventListener>);
+}
+
+void TestEventRepeater::Append(TestEventListener *listener) {
+  listeners_.push_back(listener);
+}
+
+// TODO(vladl at google.com): Factor the search functionality into Vector::Find.
+TestEventListener* TestEventRepeater::Release(TestEventListener *listener) {
+  for (size_t i = 0; i < listeners_.size(); ++i) {
+    if (listeners_[i] == listener) {
+      listeners_.erase(listeners_.begin() + i);
+      return listener;
+    }
+  }
+
+  return NULL;
+}
+
+// Since most methods are very similar, use macros to reduce boilerplate.
+// This defines a member that forwards the call to all listeners.
+#define GTEST_REPEATER_METHOD_(Name, Type) \
+void TestEventRepeater::Name(const Type& parameter) { \
+  if (forwarding_enabled_) { \
+    for (size_t i = 0; i < listeners_.size(); i++) { \
+      listeners_[i]->Name(parameter); \
+    } \
+  } \
+}
+// This defines a member that forwards the call to all listeners in reverse
+// order.
+#define GTEST_REVERSE_REPEATER_METHOD_(Name, Type) \
+void TestEventRepeater::Name(const Type& parameter) { \
+  if (forwarding_enabled_) { \
+    for (int i = static_cast<int>(listeners_.size()) - 1; i >= 0; i--) { \
+      listeners_[i]->Name(parameter); \
+    } \
+  } \
+}
+
+GTEST_REPEATER_METHOD_(OnTestProgramStart, UnitTest)
+GTEST_REPEATER_METHOD_(OnEnvironmentsSetUpStart, UnitTest)
+GTEST_REPEATER_METHOD_(OnTestCaseStart, TestCase)
+GTEST_REPEATER_METHOD_(OnTestStart, TestInfo)
+GTEST_REPEATER_METHOD_(OnTestPartResult, TestPartResult)
+GTEST_REPEATER_METHOD_(OnEnvironmentsTearDownStart, UnitTest)
+GTEST_REVERSE_REPEATER_METHOD_(OnEnvironmentsSetUpEnd, UnitTest)
+GTEST_REVERSE_REPEATER_METHOD_(OnEnvironmentsTearDownEnd, UnitTest)
+GTEST_REVERSE_REPEATER_METHOD_(OnTestEnd, TestInfo)
+GTEST_REVERSE_REPEATER_METHOD_(OnTestCaseEnd, TestCase)
+GTEST_REVERSE_REPEATER_METHOD_(OnTestProgramEnd, UnitTest)
+
+#undef GTEST_REPEATER_METHOD_
+#undef GTEST_REVERSE_REPEATER_METHOD_
+
+void TestEventRepeater::OnTestIterationStart(const UnitTest& unit_test,
+                                             int iteration) {
+  if (forwarding_enabled_) {
+    for (size_t i = 0; i < listeners_.size(); i++) {
+      listeners_[i]->OnTestIterationStart(unit_test, iteration);
+    }
+  }
+}
+
+void TestEventRepeater::OnTestIterationEnd(const UnitTest& unit_test,
+                                           int iteration) {
+  if (forwarding_enabled_) {
+    for (int i = static_cast<int>(listeners_.size()) - 1; i >= 0; i--) {
+      listeners_[i]->OnTestIterationEnd(unit_test, iteration);
+    }
+  }
+}
+
+// End TestEventRepeater
+
+// This class generates an XML output file.
+class XmlUnitTestResultPrinter : public EmptyTestEventListener {
+ public:
+  explicit XmlUnitTestResultPrinter(const char* output_file);
+
+  virtual void OnTestIterationEnd(const UnitTest& unit_test, int iteration);
+
+ private:
+  // Is c a whitespace character that is normalized to a space character
+  // when it appears in an XML attribute value?
+  static bool IsNormalizableWhitespace(char c) {
+    return c == 0x9 || c == 0xA || c == 0xD;
+  }
+
+  // May c appear in a well-formed XML document?
+  static bool IsValidXmlCharacter(char c) {
+    return IsNormalizableWhitespace(c) || c >= 0x20;
+  }
+
+  // Returns an XML-escaped copy of the input string str.  If
+  // is_attribute is true, the text is meant to appear as an attribute
+  // value, and normalizable whitespace is preserved by replacing it
+  // with character references.
+  static std::string EscapeXml(const std::string& str, bool is_attribute);
+
+  // Returns the given string with all characters invalid in XML removed.
+  static std::string RemoveInvalidXmlCharacters(const std::string& str);
+
+  // Convenience wrapper around EscapeXml when str is an attribute value.
+  static std::string EscapeXmlAttribute(const std::string& str) {
+    return EscapeXml(str, true);
+  }
+
+  // Convenience wrapper around EscapeXml when str is not an attribute value.
+  static std::string EscapeXmlText(const char* str) {
+    return EscapeXml(str, false);
+  }
+
+  // Verifies that the given attribute belongs to the given element and
+  // streams the attribute as XML.
+  static void OutputXmlAttribute(std::ostream* stream,
+                                 const std::string& element_name,
+                                 const std::string& name,
+                                 const std::string& value);
+
+  // Streams an XML CDATA section, escaping invalid CDATA sequences as needed.
+  static void OutputXmlCDataSection(::std::ostream* stream, const char* data);
+
+  // Streams an XML representation of a TestInfo object.
+  static void OutputXmlTestInfo(::std::ostream* stream,
+                                const char* test_case_name,
+                                const TestInfo& test_info);
+
+  // Prints an XML representation of a TestCase object
+  static void PrintXmlTestCase(::std::ostream* stream,
+                               const TestCase& test_case);
+
+  // Prints an XML summary of unit_test to output stream out.
+  static void PrintXmlUnitTest(::std::ostream* stream,
+                               const UnitTest& unit_test);
+
+  // Produces a string representing the test properties in a result as space
+  // delimited XML attributes based on the property key="value" pairs.
+  // When the std::string is not empty, it includes a space at the beginning,
+  // to delimit this attribute from prior attributes.
+  static std::string TestPropertiesAsXmlAttributes(const TestResult& result);
+
+  // The output file.
+  const std::string output_file_;
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(XmlUnitTestResultPrinter);
+};
+
+// Creates a new XmlUnitTestResultPrinter.
+XmlUnitTestResultPrinter::XmlUnitTestResultPrinter(const char* output_file)
+    : output_file_(output_file) {
+  if (output_file_.c_str() == NULL || output_file_.empty()) {
+    fprintf(stderr, "XML output file may not be null\n");
+    fflush(stderr);
+    exit(EXIT_FAILURE);
+  }
+}
+
+// Called after the unit test ends.
+void XmlUnitTestResultPrinter::OnTestIterationEnd(const UnitTest& unit_test,
+                                                  int /*iteration*/) {
+  FILE* xmlout = NULL;
+  FilePath output_file(output_file_);
+  FilePath output_dir(output_file.RemoveFileName());
+
+  if (output_dir.CreateDirectoriesRecursively()) {
+    xmlout = posix::FOpen(output_file_.c_str(), "w");
+  }
+  if (xmlout == NULL) {
+    // TODO(wan): report the reason of the failure.
+    //
+    // We don't do it for now as:
+    //
+    //   1. There is no urgent need for it.
+    //   2. It's a bit involved to make the errno variable thread-safe on
+    //      all three operating systems (Linux, Windows, and Mac OS).
+    //   3. To interpret the meaning of errno in a thread-safe way,
+    //      we need the strerror_r() function, which is not available on
+    //      Windows.
+    fprintf(stderr,
+            "Unable to open file \"%s\"\n",
+            output_file_.c_str());
+    fflush(stderr);
+    exit(EXIT_FAILURE);
+  }
+  std::stringstream stream;
+  PrintXmlUnitTest(&stream, unit_test);
+  fprintf(xmlout, "%s", StringStreamToString(&stream).c_str());
+  fclose(xmlout);
+}
+
+// Returns an XML-escaped copy of the input string str.  If is_attribute
+// is true, the text is meant to appear as an attribute value, and
+// normalizable whitespace is preserved by replacing it with character
+// references.
+//
+// Invalid XML characters in str, if any, are stripped from the output.
+// It is expected that most, if not all, of the text processed by this
+// module will consist of ordinary English text.
+// If this module is ever modified to produce version 1.1 XML output,
+// most invalid characters can be retained using character references.
+// TODO(wan): It might be nice to have a minimally invasive, human-readable
+// escaping scheme for invalid characters, rather than dropping them.
+std::string XmlUnitTestResultPrinter::EscapeXml(
+    const std::string& str, bool is_attribute) {
+  Message m;
+
+  for (size_t i = 0; i < str.size(); ++i) {
+    const char ch = str[i];
+    switch (ch) {
+      case '<':
+        m << "<";
+        break;
+      case '>':
+        m << ">";
+        break;
+      case '&':
+        m << "&";
+        break;
+      case '\'':
+        if (is_attribute)
+          m << "'";
+        else
+          m << '\'';
+        break;
+      case '"':
+        if (is_attribute)
+          m << """;
+        else
+          m << '"';
+        break;
+      default:
+        if (IsValidXmlCharacter(ch)) {
+          if (is_attribute && IsNormalizableWhitespace(ch))
+            m << "&#x" << String::FormatByte(static_cast<unsigned char>(ch))
+              << ";";
+          else
+            m << ch;
+        }
+        break;
+    }
+  }
+
+  return m.GetString();
+}
+
+// Returns the given string with all characters invalid in XML removed.
+// Currently invalid characters are dropped from the string. An
+// alternative is to replace them with certain characters such as . or ?.
+std::string XmlUnitTestResultPrinter::RemoveInvalidXmlCharacters(
+    const std::string& str) {
+  std::string output;
+  output.reserve(str.size());
+  for (std::string::const_iterator it = str.begin(); it != str.end(); ++it)
+    if (IsValidXmlCharacter(*it))
+      output.push_back(*it);
+
+  return output;
+}
+
+// The following routines generate an XML representation of a UnitTest
+// object.
+//
+// This is how Google Test concepts map to the DTD:
+//
+// <testsuites name="AllTests">        <-- corresponds to a UnitTest object
+//   <testsuite name="testcase-name">  <-- corresponds to a TestCase object
+//     <testcase name="test-name">     <-- corresponds to a TestInfo object
+//       <failure message="...">...</failure>
+//       <failure message="...">...</failure>
+//       <failure message="...">...</failure>
+//                                     <-- individual assertion failures
+//     </testcase>
+//   </testsuite>
+// </testsuites>
+
+// Formats the given time in milliseconds as seconds.
+std::string FormatTimeInMillisAsSeconds(TimeInMillis ms) {
+  ::std::stringstream ss;
+  ss << ms/1000.0;
+  return ss.str();
+}
+
+// Converts the given epoch time in milliseconds to a date string in the ISO
+// 8601 format, without the timezone information.
+std::string FormatEpochTimeInMillisAsIso8601(TimeInMillis ms) {
+  // Using non-reentrant version as localtime_r is not portable.
+  time_t seconds = static_cast<time_t>(ms / 1000);
+#ifdef _MSC_VER
+# pragma warning(push)          // Saves the current warning state.
+# pragma warning(disable:4996)  // Temporarily disables warning 4996
+                                // (function or variable may be unsafe).
+  const struct tm* const time_struct = localtime(&seconds);  // NOLINT
+# pragma warning(pop)           // Restores the warning state again.
+#else
+  const struct tm* const time_struct = localtime(&seconds);  // NOLINT
+#endif
+  if (time_struct == NULL)
+    return "";  // Invalid ms value
+
+  // YYYY-MM-DDThh:mm:ss
+  return StreamableToString(time_struct->tm_year + 1900) + "-" +
+      String::FormatIntWidth2(time_struct->tm_mon + 1) + "-" +
+      String::FormatIntWidth2(time_struct->tm_mday) + "T" +
+      String::FormatIntWidth2(time_struct->tm_hour) + ":" +
+      String::FormatIntWidth2(time_struct->tm_min) + ":" +
+      String::FormatIntWidth2(time_struct->tm_sec);
+}
+
+// Streams an XML CDATA section, escaping invalid CDATA sequences as needed.
+void XmlUnitTestResultPrinter::OutputXmlCDataSection(::std::ostream* stream,
+                                                     const char* data) {
+  const char* segment = data;
+  *stream << "<![CDATA[";
+  for (;;) {
+    const char* const next_segment = strstr(segment, "]]>");
+    if (next_segment != NULL) {
+      stream->write(
+          segment, static_cast<std::streamsize>(next_segment - segment));
+      *stream << "]]>]]><![CDATA[";
+      segment = next_segment + strlen("]]>");
+    } else {
+      *stream << segment;
+      break;
+    }
+  }
+  *stream << "]]>";
+}
+
+void XmlUnitTestResultPrinter::OutputXmlAttribute(
+    std::ostream* stream,
+    const std::string& element_name,
+    const std::string& name,
+    const std::string& value) {
+  const std::vector<std::string>& allowed_names =
+      GetReservedAttributesForElement(element_name);
+
+  GTEST_CHECK_(std::find(allowed_names.begin(), allowed_names.end(), name) !=
+                   allowed_names.end())
+      << "Attribute " << name << " is not allowed for element <" << element_name
+      << ">.";
+
+  *stream << " " << name << "=\"" << EscapeXmlAttribute(value) << "\"";
+}
+
+// Prints an XML representation of a TestInfo object.
+// TODO(wan): There is also value in printing properties with the plain printer.
+void XmlUnitTestResultPrinter::OutputXmlTestInfo(::std::ostream* stream,
+                                                 const char* test_case_name,
+                                                 const TestInfo& test_info) {
+  const TestResult& result = *test_info.result();
+  const std::string kTestcase = "testcase";
+
+  *stream << "    <testcase";
+  OutputXmlAttribute(stream, kTestcase, "name", test_info.name());
+
+  if (test_info.value_param() != NULL) {
+    OutputXmlAttribute(stream, kTestcase, "value_param",
+                       test_info.value_param());
+  }
+  if (test_info.type_param() != NULL) {
+    OutputXmlAttribute(stream, kTestcase, "type_param", test_info.type_param());
+  }
+
+  OutputXmlAttribute(stream, kTestcase, "status",
+                     test_info.should_run() ? "run" : "notrun");
+  OutputXmlAttribute(stream, kTestcase, "time",
+                     FormatTimeInMillisAsSeconds(result.elapsed_time()));
+  OutputXmlAttribute(stream, kTestcase, "classname", test_case_name);
+  *stream << TestPropertiesAsXmlAttributes(result);
+
+  int failures = 0;
+  for (int i = 0; i < result.total_part_count(); ++i) {
+    const TestPartResult& part = result.GetTestPartResult(i);
+    if (part.failed()) {
+      if (++failures == 1) {
+        *stream << ">\n";
+      }
+      const string location = internal::FormatCompilerIndependentFileLocation(
+          part.file_name(), part.line_number());
+      const string summary = location + "\n" + part.summary();
+      *stream << "      <failure message=\""
+              << EscapeXmlAttribute(summary.c_str())
+              << "\" type=\"\">";
+      const string detail = location + "\n" + part.message();
+      OutputXmlCDataSection(stream, RemoveInvalidXmlCharacters(detail).c_str());
+      *stream << "</failure>\n";
+    }
+  }
+
+  if (failures == 0)
+    *stream << " />\n";
+  else
+    *stream << "    </testcase>\n";
+}
+
+// Prints an XML representation of a TestCase object
+void XmlUnitTestResultPrinter::PrintXmlTestCase(std::ostream* stream,
+                                                const TestCase& test_case) {
+  const std::string kTestsuite = "testsuite";
+  *stream << "  <" << kTestsuite;
+  OutputXmlAttribute(stream, kTestsuite, "name", test_case.name());
+  OutputXmlAttribute(stream, kTestsuite, "tests",
+                     StreamableToString(test_case.reportable_test_count()));
+  OutputXmlAttribute(stream, kTestsuite, "failures",
+                     StreamableToString(test_case.failed_test_count()));
+  OutputXmlAttribute(
+      stream, kTestsuite, "disabled",
+      StreamableToString(test_case.reportable_disabled_test_count()));
+  OutputXmlAttribute(stream, kTestsuite, "errors", "0");
+  OutputXmlAttribute(stream, kTestsuite, "time",
+                     FormatTimeInMillisAsSeconds(test_case.elapsed_time()));
+  *stream << TestPropertiesAsXmlAttributes(test_case.ad_hoc_test_result())
+          << ">\n";
+
+  for (int i = 0; i < test_case.total_test_count(); ++i) {
+    if (test_case.GetTestInfo(i)->is_reportable())
+      OutputXmlTestInfo(stream, test_case.name(), *test_case.GetTestInfo(i));
+  }
+  *stream << "  </" << kTestsuite << ">\n";
+}
+
+// Prints an XML summary of unit_test to output stream out.
+void XmlUnitTestResultPrinter::PrintXmlUnitTest(std::ostream* stream,
+                                                const UnitTest& unit_test) {
+  const std::string kTestsuites = "testsuites";
+
+  *stream << "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
+  *stream << "<" << kTestsuites;
+
+  OutputXmlAttribute(stream, kTestsuites, "tests",
+                     StreamableToString(unit_test.reportable_test_count()));
+  OutputXmlAttribute(stream, kTestsuites, "failures",
+                     StreamableToString(unit_test.failed_test_count()));
+  OutputXmlAttribute(
+      stream, kTestsuites, "disabled",
+      StreamableToString(unit_test.reportable_disabled_test_count()));
+  OutputXmlAttribute(stream, kTestsuites, "errors", "0");
+  OutputXmlAttribute(
+      stream, kTestsuites, "timestamp",
+      FormatEpochTimeInMillisAsIso8601(unit_test.start_timestamp()));
+  OutputXmlAttribute(stream, kTestsuites, "time",
+                     FormatTimeInMillisAsSeconds(unit_test.elapsed_time()));
+
+  if (GTEST_FLAG(shuffle)) {
+    OutputXmlAttribute(stream, kTestsuites, "random_seed",
+                       StreamableToString(unit_test.random_seed()));
+  }
+
+  *stream << TestPropertiesAsXmlAttributes(unit_test.ad_hoc_test_result());
+
+  OutputXmlAttribute(stream, kTestsuites, "name", "AllTests");
+  *stream << ">\n";
+
+  for (int i = 0; i < unit_test.total_test_case_count(); ++i) {
+    if (unit_test.GetTestCase(i)->reportable_test_count() > 0)
+      PrintXmlTestCase(stream, *unit_test.GetTestCase(i));
+  }
+  *stream << "</" << kTestsuites << ">\n";
+}
+
+// Produces a string representing the test properties in a result as space
+// delimited XML attributes based on the property key="value" pairs.
+std::string XmlUnitTestResultPrinter::TestPropertiesAsXmlAttributes(
+    const TestResult& result) {
+  Message attributes;
+  for (int i = 0; i < result.test_property_count(); ++i) {
+    const TestProperty& property = result.GetTestProperty(i);
+    attributes << " " << property.key() << "="
+        << "\"" << EscapeXmlAttribute(property.value()) << "\"";
+  }
+  return attributes.GetString();
+}
+
+// End XmlUnitTestResultPrinter
+
+#if GTEST_CAN_STREAM_RESULTS_
+
+// Checks if str contains '=', '&', '%' or '\n' characters. If yes,
+// replaces them by "%xx" where xx is their hexadecimal value. For
+// example, replaces "=" with "%3D".  This algorithm is O(strlen(str))
+// in both time and space -- important as the input str may contain an
+// arbitrarily long test failure message and stack trace.
+string StreamingListener::UrlEncode(const char* str) {
+  string result;
+  result.reserve(strlen(str) + 1);
+  for (char ch = *str; ch != '\0'; ch = *++str) {
+    switch (ch) {
+      case '%':
+      case '=':
+      case '&':
+      case '\n':
+        result.append("%" + String::FormatByte(static_cast<unsigned char>(ch)));
+        break;
+      default:
+        result.push_back(ch);
+        break;
+    }
+  }
+  return result;
+}
+
+void StreamingListener::SocketWriter::MakeConnection() {
+  GTEST_CHECK_(sockfd_ == -1)
+      << "MakeConnection() can't be called when there is already a connection.";
+
+  addrinfo hints;
+  memset(&hints, 0, sizeof(hints));
+  hints.ai_family = AF_UNSPEC;    // To allow both IPv4 and IPv6 addresses.
+  hints.ai_socktype = SOCK_STREAM;
+  addrinfo* servinfo = NULL;
+
+  // Use the getaddrinfo() to get a linked list of IP addresses for
+  // the given host name.
+  const int error_num = getaddrinfo(
+      host_name_.c_str(), port_num_.c_str(), &hints, &servinfo);
+  if (error_num != 0) {
+    GTEST_LOG_(WARNING) << "stream_result_to: getaddrinfo() failed: "
+                        << gai_strerror(error_num);
+  }
+
+  // Loop through all the results and connect to the first we can.
+  for (addrinfo* cur_addr = servinfo; sockfd_ == -1 && cur_addr != NULL;
+       cur_addr = cur_addr->ai_next) {
+    sockfd_ = socket(
+        cur_addr->ai_family, cur_addr->ai_socktype, cur_addr->ai_protocol);
+    if (sockfd_ != -1) {
+      // Connect the client socket to the server socket.
+      if (connect(sockfd_, cur_addr->ai_addr, cur_addr->ai_addrlen) == -1) {
+        close(sockfd_);
+        sockfd_ = -1;
+      }
+    }
+  }
+
+  freeaddrinfo(servinfo);  // all done with this structure
+
+  if (sockfd_ == -1) {
+    GTEST_LOG_(WARNING) << "stream_result_to: failed to connect to "
+                        << host_name_ << ":" << port_num_;
+  }
+}
+
+// End of class Streaming Listener
+#endif  // GTEST_CAN_STREAM_RESULTS__
+
+// Class ScopedTrace
+
+// Pushes the given source file location and message onto a per-thread
+// trace stack maintained by Google Test.
+ScopedTrace::ScopedTrace(const char* file, int line, const Message& message)
+    GTEST_LOCK_EXCLUDED_(&UnitTest::mutex_) {
+  TraceInfo trace;
+  trace.file = file;
+  trace.line = line;
+  trace.message = message.GetString();
+
+  UnitTest::GetInstance()->PushGTestTrace(trace);
+}
+
+// Pops the info pushed by the c'tor.
+ScopedTrace::~ScopedTrace()
+    GTEST_LOCK_EXCLUDED_(&UnitTest::mutex_) {
+  UnitTest::GetInstance()->PopGTestTrace();
+}
+
+
+// class OsStackTraceGetter
+
+// Returns the current OS stack trace as an std::string.  Parameters:
+//
+//   max_depth  - the maximum number of stack frames to be included
+//                in the trace.
+//   skip_count - the number of top frames to be skipped; doesn't count
+//                against max_depth.
+//
+string OsStackTraceGetter::CurrentStackTrace(int /* max_depth */,
+                                             int /* skip_count */)
+    GTEST_LOCK_EXCLUDED_(mutex_) {
+  return "";
+}
+
+void OsStackTraceGetter::UponLeavingGTest()
+    GTEST_LOCK_EXCLUDED_(mutex_) {
+}
+
+const char* const
+OsStackTraceGetter::kElidedFramesMarker =
+    "... " GTEST_NAME_ " internal frames ...";
+
+// A helper class that creates the premature-exit file in its
+// constructor and deletes the file in its destructor.
+class ScopedPrematureExitFile {
+ public:
+  explicit ScopedPrematureExitFile(const char* premature_exit_filepath)
+      : premature_exit_filepath_(premature_exit_filepath) {
+    // If a path to the premature-exit file is specified...
+    if (premature_exit_filepath != NULL && *premature_exit_filepath != '\0') {
+      // create the file with a single "0" character in it.  I/O
+      // errors are ignored as there's nothing better we can do and we
+      // don't want to fail the test because of this.
+      FILE* pfile = posix::FOpen(premature_exit_filepath, "w");
+      fwrite("0", 1, 1, pfile);
+      fclose(pfile);
+    }
+  }
+
+  ~ScopedPrematureExitFile() {
+    if (premature_exit_filepath_ != NULL && *premature_exit_filepath_ != '\0') {
+      remove(premature_exit_filepath_);
+    }
+  }
+
+ private:
+  const char* const premature_exit_filepath_;
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(ScopedPrematureExitFile);
+};
+
+}  // namespace internal
+
+// class TestEventListeners
+
+TestEventListeners::TestEventListeners()
+    : repeater_(new internal::TestEventRepeater()),
+      default_result_printer_(NULL),
+      default_xml_generator_(NULL) {
+}
+
+TestEventListeners::~TestEventListeners() { delete repeater_; }
+
+// Returns the standard listener responsible for the default console
+// output.  Can be removed from the listeners list to shut down default
+// console output.  Note that removing this object from the listener list
+// with Release transfers its ownership to the user.
+void TestEventListeners::Append(TestEventListener* listener) {
+  repeater_->Append(listener);
+}
+
+// Removes the given event listener from the list and returns it.  It then
+// becomes the caller's responsibility to delete the listener. Returns
+// NULL if the listener is not found in the list.
+TestEventListener* TestEventListeners::Release(TestEventListener* listener) {
+  if (listener == default_result_printer_)
+    default_result_printer_ = NULL;
+  else if (listener == default_xml_generator_)
+    default_xml_generator_ = NULL;
+  return repeater_->Release(listener);
+}
+
+// Returns repeater that broadcasts the TestEventListener events to all
+// subscribers.
+TestEventListener* TestEventListeners::repeater() { return repeater_; }
+
+// Sets the default_result_printer attribute to the provided listener.
+// The listener is also added to the listener list and previous
+// default_result_printer is removed from it and deleted. The listener can
+// also be NULL in which case it will not be added to the list. Does
+// nothing if the previous and the current listener objects are the same.
+void TestEventListeners::SetDefaultResultPrinter(TestEventListener* listener) {
+  if (default_result_printer_ != listener) {
+    // It is an error to pass this method a listener that is already in the
+    // list.
+    delete Release(default_result_printer_);
+    default_result_printer_ = listener;
+    if (listener != NULL)
+      Append(listener);
+  }
+}
+
+// Sets the default_xml_generator attribute to the provided listener.  The
+// listener is also added to the listener list and previous
+// default_xml_generator is removed from it and deleted. The listener can
+// also be NULL in which case it will not be added to the list. Does
+// nothing if the previous and the current listener objects are the same.
+void TestEventListeners::SetDefaultXmlGenerator(TestEventListener* listener) {
+  if (default_xml_generator_ != listener) {
+    // It is an error to pass this method a listener that is already in the
+    // list.
+    delete Release(default_xml_generator_);
+    default_xml_generator_ = listener;
+    if (listener != NULL)
+      Append(listener);
+  }
+}
+
+// Controls whether events will be forwarded by the repeater to the
+// listeners in the list.
+bool TestEventListeners::EventForwardingEnabled() const {
+  return repeater_->forwarding_enabled();
+}
+
+void TestEventListeners::SuppressEventForwarding() {
+  repeater_->set_forwarding_enabled(false);
+}
+
+// class UnitTest
+
+// Gets the singleton UnitTest object.  The first time this method is
+// called, a UnitTest object is constructed and returned.  Consecutive
+// calls will return the same object.
+//
+// We don't protect this under mutex_ as a user is not supposed to
+// call this before main() starts, from which point on the return
+// value will never change.
+UnitTest* UnitTest::GetInstance() {
+  // When compiled with MSVC 7.1 in optimized mode, destroying the
+  // UnitTest object upon exiting the program messes up the exit code,
+  // causing successful tests to appear failed.  We have to use a
+  // different implementation in this case to bypass the compiler bug.
+  // This implementation makes the compiler happy, at the cost of
+  // leaking the UnitTest object.
+
+  // CodeGear C++Builder insists on a public destructor for the
+  // default implementation.  Use this implementation to keep good OO
+  // design with private destructor.
+
+#if (_MSC_VER == 1310 && !defined(_DEBUG)) || defined(__BORLANDC__)
+  static UnitTest* const instance = new UnitTest;
+  return instance;
+#else
+  static UnitTest instance;
+  return &instance;
+#endif  // (_MSC_VER == 1310 && !defined(_DEBUG)) || defined(__BORLANDC__)
+}
+
+// Gets the number of successful test cases.
+int UnitTest::successful_test_case_count() const {
+  return impl()->successful_test_case_count();
+}
+
+// Gets the number of failed test cases.
+int UnitTest::failed_test_case_count() const {
+  return impl()->failed_test_case_count();
+}
+
+// Gets the number of all test cases.
+int UnitTest::total_test_case_count() const {
+  return impl()->total_test_case_count();
+}
+
+// Gets the number of all test cases that contain at least one test
+// that should run.
+int UnitTest::test_case_to_run_count() const {
+  return impl()->test_case_to_run_count();
+}
+
+// Gets the number of successful tests.
+int UnitTest::successful_test_count() const {
+  return impl()->successful_test_count();
+}
+
+// Gets the number of failed tests.
+int UnitTest::failed_test_count() const { return impl()->failed_test_count(); }
+
+// Gets the number of disabled tests that will be reported in the XML report.
+int UnitTest::reportable_disabled_test_count() const {
+  return impl()->reportable_disabled_test_count();
+}
+
+// Gets the number of disabled tests.
+int UnitTest::disabled_test_count() const {
+  return impl()->disabled_test_count();
+}
+
+// Gets the number of tests to be printed in the XML report.
+int UnitTest::reportable_test_count() const {
+  return impl()->reportable_test_count();
+}
+
+// Gets the number of all tests.
+int UnitTest::total_test_count() const { return impl()->total_test_count(); }
+
+// Gets the number of tests that should run.
+int UnitTest::test_to_run_count() const { return impl()->test_to_run_count(); }
+
+// Gets the time of the test program start, in ms from the start of the
+// UNIX epoch.
+internal::TimeInMillis UnitTest::start_timestamp() const {
+    return impl()->start_timestamp();
+}
+
+// Gets the elapsed time, in milliseconds.
+internal::TimeInMillis UnitTest::elapsed_time() const {
+  return impl()->elapsed_time();
+}
+
+// Returns true iff the unit test passed (i.e. all test cases passed).
+bool UnitTest::Passed() const { return impl()->Passed(); }
+
+// Returns true iff the unit test failed (i.e. some test case failed
+// or something outside of all tests failed).
+bool UnitTest::Failed() const { return impl()->Failed(); }
+
+// Gets the i-th test case among all the test cases. i can range from 0 to
+// total_test_case_count() - 1. If i is not in that range, returns NULL.
+const TestCase* UnitTest::GetTestCase(int i) const {
+  return impl()->GetTestCase(i);
+}
+
+// Returns the TestResult containing information on test failures and
+// properties logged outside of individual test cases.
+const TestResult& UnitTest::ad_hoc_test_result() const {
+  return *impl()->ad_hoc_test_result();
+}
+
+// Gets the i-th test case among all the test cases. i can range from 0 to
+// total_test_case_count() - 1. If i is not in that range, returns NULL.
+TestCase* UnitTest::GetMutableTestCase(int i) {
+  return impl()->GetMutableTestCase(i);
+}
+
+// Returns the list of event listeners that can be used to track events
+// inside Google Test.
+TestEventListeners& UnitTest::listeners() {
+  return *impl()->listeners();
+}
+
+// Registers and returns a global test environment.  When a test
+// program is run, all global test environments will be set-up in the
+// order they were registered.  After all tests in the program have
+// finished, all global test environments will be torn-down in the
+// *reverse* order they were registered.
+//
+// The UnitTest object takes ownership of the given environment.
+//
+// We don't protect this under mutex_, as we only support calling it
+// from the main thread.
+Environment* UnitTest::AddEnvironment(Environment* env) {
+  if (env == NULL) {
+    return NULL;
+  }
+
+  impl_->environments().push_back(env);
+  return env;
+}
+
+// Adds a TestPartResult to the current TestResult object.  All Google Test
+// assertion macros (e.g. ASSERT_TRUE, EXPECT_EQ, etc) eventually call
+// this to report their results.  The user code should use the
+// assertion macros instead of calling this directly.
+void UnitTest::AddTestPartResult(
+    TestPartResult::Type result_type,
+    const char* file_name,
+    int line_number,
+    const std::string& message,
+    const std::string& os_stack_trace) GTEST_LOCK_EXCLUDED_(mutex_) {
+  Message msg;
+  msg << message;
+
+  internal::MutexLock lock(&mutex_);
+  if (impl_->gtest_trace_stack().size() > 0) {
+    msg << "\n" << GTEST_NAME_ << " trace:";
+
+    for (int i = static_cast<int>(impl_->gtest_trace_stack().size());
+         i > 0; --i) {
+      const internal::TraceInfo& trace = impl_->gtest_trace_stack()[i - 1];
+      msg << "\n" << internal::FormatFileLocation(trace.file, trace.line)
+          << " " << trace.message;
+    }
+  }
+
+  if (os_stack_trace.c_str() != NULL && !os_stack_trace.empty()) {
+    msg << internal::kStackTraceMarker << os_stack_trace;
+  }
+
+  const TestPartResult result =
+    TestPartResult(result_type, file_name, line_number,
+                   msg.GetString().c_str());
+  impl_->GetTestPartResultReporterForCurrentThread()->
+      ReportTestPartResult(result);
+
+  if (result_type != TestPartResult::kSuccess) {
+    // gtest_break_on_failure takes precedence over
+    // gtest_throw_on_failure.  This allows a user to set the latter
+    // in the code (perhaps in order to use Google Test assertions
+    // with another testing framework) and specify the former on the
+    // command line for debugging.
+    if (GTEST_FLAG(break_on_failure)) {
+#if GTEST_OS_WINDOWS
+      // Using DebugBreak on Windows allows gtest to still break into a debugger
+      // when a failure happens and both the --gtest_break_on_failure and
+      // the --gtest_catch_exceptions flags are specified.
+      DebugBreak();
+#else
+      // Dereference NULL through a volatile pointer to prevent the compiler
+      // from removing. We use this rather than abort() or __builtin_trap() for
+      // portability: Symbian doesn't implement abort() well, and some debuggers
+      // don't correctly trap abort().
+      *static_cast<volatile int*>(NULL) = 1;
+#endif  // GTEST_OS_WINDOWS
+    } else if (GTEST_FLAG(throw_on_failure)) {
+#if GTEST_HAS_EXCEPTIONS
+      throw internal::GoogleTestFailureException(result);
+#else
+      // We cannot call abort() as it generates a pop-up in debug mode
+      // that cannot be suppressed in VC 7.1 or below.
+      exit(1);
+#endif
+    }
+  }
+}
+
+// Adds a TestProperty to the current TestResult object when invoked from
+// inside a test, to current TestCase's ad_hoc_test_result_ when invoked
+// from SetUpTestCase or TearDownTestCase, or to the global property set
+// when invoked elsewhere.  If the result already contains a property with
+// the same key, the value will be updated.
+void UnitTest::RecordProperty(const std::string& key,
+                              const std::string& value) {
+  impl_->RecordProperty(TestProperty(key, value));
+}
+
+// Runs all tests in this UnitTest object and prints the result.
+// Returns 0 if successful, or 1 otherwise.
+//
+// We don't protect this under mutex_, as we only support calling it
+// from the main thread.
+int UnitTest::Run() {
+  const bool in_death_test_child_process =
+      internal::GTEST_FLAG(internal_run_death_test).length() > 0;
+
+  // Google Test implements this protocol for catching that a test
+  // program exits before returning control to Google Test:
+  //
+  //   1. Upon start, Google Test creates a file whose absolute path
+  //      is specified by the environment variable
+  //      TEST_PREMATURE_EXIT_FILE.
+  //   2. When Google Test has finished its work, it deletes the file.
+  //
+  // This allows a test runner to set TEST_PREMATURE_EXIT_FILE before
+  // running a Google-Test-based test program and check the existence
+  // of the file at the end of the test execution to see if it has
+  // exited prematurely.
+
+  // If we are in the child process of a death test, don't
+  // create/delete the premature exit file, as doing so is unnecessary
+  // and will confuse the parent process.  Otherwise, create/delete
+  // the file upon entering/leaving this function.  If the program
+  // somehow exits before this function has a chance to return, the
+  // premature-exit file will be left undeleted, causing a test runner
+  // that understands the premature-exit-file protocol to report the
+  // test as having failed.
+  const internal::ScopedPrematureExitFile premature_exit_file(
+      in_death_test_child_process ?
+      NULL : internal::posix::GetEnv("TEST_PREMATURE_EXIT_FILE"));
+
+  // Captures the value of GTEST_FLAG(catch_exceptions).  This value will be
+  // used for the duration of the program.
+  impl()->set_catch_exceptions(GTEST_FLAG(catch_exceptions));
+
+#if GTEST_HAS_SEH
+  // Either the user wants Google Test to catch exceptions thrown by the
+  // tests or this is executing in the context of death test child
+  // process. In either case the user does not want to see pop-up dialogs
+  // about crashes - they are expected.
+  if (impl()->catch_exceptions() || in_death_test_child_process) {
+# if !GTEST_OS_WINDOWS_MOBILE
+    // SetErrorMode doesn't exist on CE.
+    SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOALIGNMENTFAULTEXCEPT |
+                 SEM_NOGPFAULTERRORBOX | SEM_NOOPENFILEERRORBOX);
+# endif  // !GTEST_OS_WINDOWS_MOBILE
+
+# if (defined(_MSC_VER) || GTEST_OS_WINDOWS_MINGW) && !GTEST_OS_WINDOWS_MOBILE
+    // Death test children can be terminated with _abort().  On Windows,
+    // _abort() can show a dialog with a warning message.  This forces the
+    // abort message to go to stderr instead.
+    _set_error_mode(_OUT_TO_STDERR);
+# endif
+
+# if _MSC_VER >= 1400 && !GTEST_OS_WINDOWS_MOBILE
+    // In the debug version, Visual Studio pops up a separate dialog
+    // offering a choice to debug the aborted program. We need to suppress
+    // this dialog or it will pop up for every EXPECT/ASSERT_DEATH statement
+    // executed. Google Test will notify the user of any unexpected
+    // failure via stderr.
+    //
+    // VC++ doesn't define _set_abort_behavior() prior to the version 8.0.
+    // Users of prior VC versions shall suffer the agony and pain of
+    // clicking through the countless debug dialogs.
+    // TODO(vladl at google.com): find a way to suppress the abort dialog() in the
+    // debug mode when compiled with VC 7.1 or lower.
+    if (!GTEST_FLAG(break_on_failure))
+      _set_abort_behavior(
+          0x0,                                    // Clear the following flags:
+          _WRITE_ABORT_MSG | _CALL_REPORTFAULT);  // pop-up window, core dump.
+# endif
+  }
+#endif  // GTEST_HAS_SEH
+
+  return internal::HandleExceptionsInMethodIfSupported(
+      impl(),
+      &internal::UnitTestImpl::RunAllTests,
+      "auxiliary test code (environments or event listeners)") ? 0 : 1;
+}
+
+// Returns the working directory when the first TEST() or TEST_F() was
+// executed.
+const char* UnitTest::original_working_dir() const {
+  return impl_->original_working_dir_.c_str();
+}
+
+// Returns the TestCase object for the test that's currently running,
+// or NULL if no test is running.
+const TestCase* UnitTest::current_test_case() const
+    GTEST_LOCK_EXCLUDED_(mutex_) {
+  internal::MutexLock lock(&mutex_);
+  return impl_->current_test_case();
+}
+
+// Returns the TestInfo object for the test that's currently running,
+// or NULL if no test is running.
+const TestInfo* UnitTest::current_test_info() const
+    GTEST_LOCK_EXCLUDED_(mutex_) {
+  internal::MutexLock lock(&mutex_);
+  return impl_->current_test_info();
+}
+
+// Returns the random seed used at the start of the current test run.
+int UnitTest::random_seed() const { return impl_->random_seed(); }
+
+#if GTEST_HAS_PARAM_TEST
+// Returns ParameterizedTestCaseRegistry object used to keep track of
+// value-parameterized tests and instantiate and register them.
+internal::ParameterizedTestCaseRegistry&
+    UnitTest::parameterized_test_registry()
+        GTEST_LOCK_EXCLUDED_(mutex_) {
+  return impl_->parameterized_test_registry();
+}
+#endif  // GTEST_HAS_PARAM_TEST
+
+// Creates an empty UnitTest.
+UnitTest::UnitTest() {
+  impl_ = new internal::UnitTestImpl(this);
+}
+
+// Destructor of UnitTest.
+UnitTest::~UnitTest() {
+  delete impl_;
+}
+
+// Pushes a trace defined by SCOPED_TRACE() on to the per-thread
+// Google Test trace stack.
+void UnitTest::PushGTestTrace(const internal::TraceInfo& trace)
+    GTEST_LOCK_EXCLUDED_(mutex_) {
+  internal::MutexLock lock(&mutex_);
+  impl_->gtest_trace_stack().push_back(trace);
+}
+
+// Pops a trace from the per-thread Google Test trace stack.
+void UnitTest::PopGTestTrace()
+    GTEST_LOCK_EXCLUDED_(mutex_) {
+  internal::MutexLock lock(&mutex_);
+  impl_->gtest_trace_stack().pop_back();
+}
+
+namespace internal {
+
+UnitTestImpl::UnitTestImpl(UnitTest* parent)
+    : parent_(parent),
+#ifdef _MSC_VER
+# pragma warning(push)                    // Saves the current warning state.
+# pragma warning(disable:4355)            // Temporarily disables warning 4355
+                                         // (using this in initializer).
+      default_global_test_part_result_reporter_(this),
+      default_per_thread_test_part_result_reporter_(this),
+# pragma warning(pop)                     // Restores the warning state again.
+#else
+      default_global_test_part_result_reporter_(this),
+      default_per_thread_test_part_result_reporter_(this),
+#endif  // _MSC_VER
+      global_test_part_result_repoter_(
+          &default_global_test_part_result_reporter_),
+      per_thread_test_part_result_reporter_(
+          &default_per_thread_test_part_result_reporter_),
+#if GTEST_HAS_PARAM_TEST
+      parameterized_test_registry_(),
+      parameterized_tests_registered_(false),
+#endif  // GTEST_HAS_PARAM_TEST
+      last_death_test_case_(-1),
+      current_test_case_(NULL),
+      current_test_info_(NULL),
+      ad_hoc_test_result_(),
+      os_stack_trace_getter_(NULL),
+      post_flag_parse_init_performed_(false),
+      random_seed_(0),  // Will be overridden by the flag before first use.
+      random_(0),  // Will be reseeded before first use.
+      start_timestamp_(0),
+      elapsed_time_(0),
+#if GTEST_HAS_DEATH_TEST
+      death_test_factory_(new DefaultDeathTestFactory),
+#endif
+      // Will be overridden by the flag before first use.
+      catch_exceptions_(false) {
+  listeners()->SetDefaultResultPrinter(new PrettyUnitTestResultPrinter);
+}
+
+UnitTestImpl::~UnitTestImpl() {
+  // Deletes every TestCase.
+  ForEach(test_cases_, internal::Delete<TestCase>);
+
+  // Deletes every Environment.
+  ForEach(environments_, internal::Delete<Environment>);
+
+  delete os_stack_trace_getter_;
+}
+
+// Adds a TestProperty to the current TestResult object when invoked in a
+// context of a test, to current test case's ad_hoc_test_result when invoke
+// from SetUpTestCase/TearDownTestCase, or to the global property set
+// otherwise.  If the result already contains a property with the same key,
+// the value will be updated.
+void UnitTestImpl::RecordProperty(const TestProperty& test_property) {
+  std::string xml_element;
+  TestResult* test_result;  // TestResult appropriate for property recording.
+
+  if (current_test_info_ != NULL) {
+    xml_element = "testcase";
+    test_result = &(current_test_info_->result_);
+  } else if (current_test_case_ != NULL) {
+    xml_element = "testsuite";
+    test_result = &(current_test_case_->ad_hoc_test_result_);
+  } else {
+    xml_element = "testsuites";
+    test_result = &ad_hoc_test_result_;
+  }
+  test_result->RecordProperty(xml_element, test_property);
+}
+
+#if GTEST_HAS_DEATH_TEST
+// Disables event forwarding if the control is currently in a death test
+// subprocess. Must not be called before InitGoogleTest.
+void UnitTestImpl::SuppressTestEventsIfInSubprocess() {
+  if (internal_run_death_test_flag_.get() != NULL)
+    listeners()->SuppressEventForwarding();
+}
+#endif  // GTEST_HAS_DEATH_TEST
+
+// Initializes event listeners performing XML output as specified by
+// UnitTestOptions. Must not be called before InitGoogleTest.
+void UnitTestImpl::ConfigureXmlOutput() {
+  const std::string& output_format = UnitTestOptions::GetOutputFormat();
+  if (output_format == "xml") {
+    listeners()->SetDefaultXmlGenerator(new XmlUnitTestResultPrinter(
+        UnitTestOptions::GetAbsolutePathToOutputFile().c_str()));
+  } else if (output_format != "") {
+    printf("WARNING: unrecognized output format \"%s\" ignored.\n",
+           output_format.c_str());
+    fflush(stdout);
+  }
+}
+
+#if GTEST_CAN_STREAM_RESULTS_
+// Initializes event listeners for streaming test results in string form.
+// Must not be called before InitGoogleTest.
+void UnitTestImpl::ConfigureStreamingOutput() {
+  const std::string& target = GTEST_FLAG(stream_result_to);
+  if (!target.empty()) {
+    const size_t pos = target.find(':');
+    if (pos != std::string::npos) {
+      listeners()->Append(new StreamingListener(target.substr(0, pos),
+                                                target.substr(pos+1)));
+    } else {
+      printf("WARNING: unrecognized streaming target \"%s\" ignored.\n",
+             target.c_str());
+      fflush(stdout);
+    }
+  }
+}
+#endif  // GTEST_CAN_STREAM_RESULTS_
+
+// Performs initialization dependent upon flag values obtained in
+// ParseGoogleTestFlagsOnly.  Is called from InitGoogleTest after the call to
+// ParseGoogleTestFlagsOnly.  In case a user neglects to call InitGoogleTest
+// this function is also called from RunAllTests.  Since this function can be
+// called more than once, it has to be idempotent.
+void UnitTestImpl::PostFlagParsingInit() {
+  // Ensures that this function does not execute more than once.
+  if (!post_flag_parse_init_performed_) {
+    post_flag_parse_init_performed_ = true;
+
+#if GTEST_HAS_DEATH_TEST
+    InitDeathTestSubprocessControlInfo();
+    SuppressTestEventsIfInSubprocess();
+#endif  // GTEST_HAS_DEATH_TEST
+
+    // Registers parameterized tests. This makes parameterized tests
+    // available to the UnitTest reflection API without running
+    // RUN_ALL_TESTS.
+    RegisterParameterizedTests();
+
+    // Configures listeners for XML output. This makes it possible for users
+    // to shut down the default XML output before invoking RUN_ALL_TESTS.
+    ConfigureXmlOutput();
+
+#if GTEST_CAN_STREAM_RESULTS_
+    // Configures listeners for streaming test results to the specified server.
+    ConfigureStreamingOutput();
+#endif  // GTEST_CAN_STREAM_RESULTS_
+  }
+}
+
+// A predicate that checks the name of a TestCase against a known
+// value.
+//
+// This is used for implementation of the UnitTest class only.  We put
+// it in the anonymous namespace to prevent polluting the outer
+// namespace.
+//
+// TestCaseNameIs is copyable.
+class TestCaseNameIs {
+ public:
+  // Constructor.
+  explicit TestCaseNameIs(const std::string& name)
+      : name_(name) {}
+
+  // Returns true iff the name of test_case matches name_.
+  bool operator()(const TestCase* test_case) const {
+    return test_case != NULL && strcmp(test_case->name(), name_.c_str()) == 0;
+  }
+
+ private:
+  std::string name_;
+};
+
+// Finds and returns a TestCase with the given name.  If one doesn't
+// exist, creates one and returns it.  It's the CALLER'S
+// RESPONSIBILITY to ensure that this function is only called WHEN THE
+// TESTS ARE NOT SHUFFLED.
+//
+// Arguments:
+//
+//   test_case_name: name of the test case
+//   type_param:     the name of the test case's type parameter, or NULL if
+//                   this is not a typed or a type-parameterized test case.
+//   set_up_tc:      pointer to the function that sets up the test case
+//   tear_down_tc:   pointer to the function that tears down the test case
+TestCase* UnitTestImpl::GetTestCase(const char* test_case_name,
+                                    const char* type_param,
+                                    Test::SetUpTestCaseFunc set_up_tc,
+                                    Test::TearDownTestCaseFunc tear_down_tc) {
+  // Can we find a TestCase with the given name?
+  const std::vector<TestCase*>::const_iterator test_case =
+      std::find_if(test_cases_.begin(), test_cases_.end(),
+                   TestCaseNameIs(test_case_name));
+
+  if (test_case != test_cases_.end())
+    return *test_case;
+
+  // No.  Let's create one.
+  TestCase* const new_test_case =
+      new TestCase(test_case_name, type_param, set_up_tc, tear_down_tc);
+
+  // Is this a death test case?
+  if (internal::UnitTestOptions::MatchesFilter(test_case_name,
+                                               kDeathTestCaseFilter)) {
+    // Yes.  Inserts the test case after the last death test case
+    // defined so far.  This only works when the test cases haven't
+    // been shuffled.  Otherwise we may end up running a death test
+    // after a non-death test.
+    ++last_death_test_case_;
+    test_cases_.insert(test_cases_.begin() + last_death_test_case_,
+                       new_test_case);
+  } else {
+    // No.  Appends to the end of the list.
+    test_cases_.push_back(new_test_case);
+  }
+
+  test_case_indices_.push_back(static_cast<int>(test_case_indices_.size()));
+  return new_test_case;
+}
+
+// Helpers for setting up / tearing down the given environment.  They
+// are for use in the ForEach() function.
+static void SetUpEnvironment(Environment* env) { env->SetUp(); }
+static void TearDownEnvironment(Environment* env) { env->TearDown(); }
+
+// Runs all tests in this UnitTest object, prints the result, and
+// returns true if all tests are successful.  If any exception is
+// thrown during a test, the test is considered to be failed, but the
+// rest of the tests will still be run.
+//
+// When parameterized tests are enabled, it expands and registers
+// parameterized tests first in RegisterParameterizedTests().
+// All other functions called from RunAllTests() may safely assume that
+// parameterized tests are ready to be counted and run.
+bool UnitTestImpl::RunAllTests() {
+  // Makes sure InitGoogleTest() was called.
+  if (!GTestIsInitialized()) {
+    printf("%s",
+           "\nThis test program did NOT call ::testing::InitGoogleTest "
+           "before calling RUN_ALL_TESTS().  Please fix it.\n");
+    return false;
+  }
+
+  // Do not run any test if the --help flag was specified.
+  if (g_help_flag)
+    return true;
+
+  // Repeats the call to the post-flag parsing initialization in case the
+  // user didn't call InitGoogleTest.
+  PostFlagParsingInit();
+
+  // Even if sharding is not on, test runners may want to use the
+  // GTEST_SHARD_STATUS_FILE to query whether the test supports the sharding
+  // protocol.
+  internal::WriteToShardStatusFileIfNeeded();
+
+  // True iff we are in a subprocess for running a thread-safe-style
+  // death test.
+  bool in_subprocess_for_death_test = false;
+
+#if GTEST_HAS_DEATH_TEST
+  in_subprocess_for_death_test = (internal_run_death_test_flag_.get() != NULL);
+#endif  // GTEST_HAS_DEATH_TEST
+
+  const bool should_shard = ShouldShard(kTestTotalShards, kTestShardIndex,
+                                        in_subprocess_for_death_test);
+
+  // Compares the full test names with the filter to decide which
+  // tests to run.
+  const bool has_tests_to_run = FilterTests(should_shard
+                                              ? HONOR_SHARDING_PROTOCOL
+                                              : IGNORE_SHARDING_PROTOCOL) > 0;
+
+  // Lists the tests and exits if the --gtest_list_tests flag was specified.
+  if (GTEST_FLAG(list_tests)) {
+    // This must be called *after* FilterTests() has been called.
+    ListTestsMatchingFilter();
+    return true;
+  }
+
+  random_seed_ = GTEST_FLAG(shuffle) ?
+      GetRandomSeedFromFlag(GTEST_FLAG(random_seed)) : 0;
+
+  // True iff at least one test has failed.
+  bool failed = false;
+
+  TestEventListener* repeater = listeners()->repeater();
+
+  start_timestamp_ = GetTimeInMillis();
+  repeater->OnTestProgramStart(*parent_);
+
+  // How many times to repeat the tests?  We don't want to repeat them
+  // when we are inside the subprocess of a death test.
+  const int repeat = in_subprocess_for_death_test ? 1 : GTEST_FLAG(repeat);
+  // Repeats forever if the repeat count is negative.
+  const bool forever = repeat < 0;
+  for (int i = 0; forever || i != repeat; i++) {
+    // We want to preserve failures generated by ad-hoc test
+    // assertions executed before RUN_ALL_TESTS().
+    ClearNonAdHocTestResult();
+
+    const TimeInMillis start = GetTimeInMillis();
+
+    // Shuffles test cases and tests if requested.
+    if (has_tests_to_run && GTEST_FLAG(shuffle)) {
+      random()->Reseed(random_seed_);
+      // This should be done before calling OnTestIterationStart(),
+      // such that a test event listener can see the actual test order
+      // in the event.
+      ShuffleTests();
+    }
+
+    // Tells the unit test event listeners that the tests are about to start.
+    repeater->OnTestIterationStart(*parent_, i);
+
+    // Runs each test case if there is at least one test to run.
+    if (has_tests_to_run) {
+      // Sets up all environments beforehand.
+      repeater->OnEnvironmentsSetUpStart(*parent_);
+      ForEach(environments_, SetUpEnvironment);
+      repeater->OnEnvironmentsSetUpEnd(*parent_);
+
+      // Runs the tests only if there was no fatal failure during global
+      // set-up.
+      if (!Test::HasFatalFailure()) {
+        for (int test_index = 0; test_index < total_test_case_count();
+             test_index++) {
+          GetMutableTestCase(test_index)->Run();
+        }
+      }
+
+      // Tears down all environments in reverse order afterwards.
+      repeater->OnEnvironmentsTearDownStart(*parent_);
+      std::for_each(environments_.rbegin(), environments_.rend(),
+                    TearDownEnvironment);
+      repeater->OnEnvironmentsTearDownEnd(*parent_);
+    }
+
+    elapsed_time_ = GetTimeInMillis() - start;
+
+    // Tells the unit test event listener that the tests have just finished.
+    repeater->OnTestIterationEnd(*parent_, i);
+
+    // Gets the result and clears it.
+    if (!Passed()) {
+      failed = true;
+    }
+
+    // Restores the original test order after the iteration.  This
+    // allows the user to quickly repro a failure that happens in the
+    // N-th iteration without repeating the first (N - 1) iterations.
+    // This is not enclosed in "if (GTEST_FLAG(shuffle)) { ... }", in
+    // case the user somehow changes the value of the flag somewhere
+    // (it's always safe to unshuffle the tests).
+    UnshuffleTests();
+
+    if (GTEST_FLAG(shuffle)) {
+      // Picks a new random seed for each iteration.
+      random_seed_ = GetNextRandomSeed(random_seed_);
+    }
+  }
+
+  repeater->OnTestProgramEnd(*parent_);
+
+  return !failed;
+}
+
+// Reads the GTEST_SHARD_STATUS_FILE environment variable, and creates the file
+// if the variable is present. If a file already exists at this location, this
+// function will write over it. If the variable is present, but the file cannot
+// be created, prints an error and exits.
+void WriteToShardStatusFileIfNeeded() {
+  const char* const test_shard_file = posix::GetEnv(kTestShardStatusFile);
+  if (test_shard_file != NULL) {
+    FILE* const file = posix::FOpen(test_shard_file, "w");
+    if (file == NULL) {
+      ColoredPrintf(COLOR_RED,
+                    "Could not write to the test shard status file \"%s\" "
+                    "specified by the %s environment variable.\n",
+                    test_shard_file, kTestShardStatusFile);
+      fflush(stdout);
+      exit(EXIT_FAILURE);
+    }
+    fclose(file);
+  }
+}
+
+// Checks whether sharding is enabled by examining the relevant
+// environment variable values. If the variables are present,
+// but inconsistent (i.e., shard_index >= total_shards), prints
+// an error and exits. If in_subprocess_for_death_test, sharding is
+// disabled because it must only be applied to the original test
+// process. Otherwise, we could filter out death tests we intended to execute.
+bool ShouldShard(const char* total_shards_env,
+                 const char* shard_index_env,
+                 bool in_subprocess_for_death_test) {
+  if (in_subprocess_for_death_test) {
+    return false;
+  }
+
+  const Int32 total_shards = Int32FromEnvOrDie(total_shards_env, -1);
+  const Int32 shard_index = Int32FromEnvOrDie(shard_index_env, -1);
+
+  if (total_shards == -1 && shard_index == -1) {
+    return false;
+  } else if (total_shards == -1 && shard_index != -1) {
+    const Message msg = Message()
+      << "Invalid environment variables: you have "
+      << kTestShardIndex << " = " << shard_index
+      << ", but have left " << kTestTotalShards << " unset.\n";
+    ColoredPrintf(COLOR_RED, msg.GetString().c_str());
+    fflush(stdout);
+    exit(EXIT_FAILURE);
+  } else if (total_shards != -1 && shard_index == -1) {
+    const Message msg = Message()
+      << "Invalid environment variables: you have "
+      << kTestTotalShards << " = " << total_shards
+      << ", but have left " << kTestShardIndex << " unset.\n";
+    ColoredPrintf(COLOR_RED, msg.GetString().c_str());
+    fflush(stdout);
+    exit(EXIT_FAILURE);
+  } else if (shard_index < 0 || shard_index >= total_shards) {
+    const Message msg = Message()
+      << "Invalid environment variables: we require 0 <= "
+      << kTestShardIndex << " < " << kTestTotalShards
+      << ", but you have " << kTestShardIndex << "=" << shard_index
+      << ", " << kTestTotalShards << "=" << total_shards << ".\n";
+    ColoredPrintf(COLOR_RED, msg.GetString().c_str());
+    fflush(stdout);
+    exit(EXIT_FAILURE);
+  }
+
+  return total_shards > 1;
+}
+
+// Parses the environment variable var as an Int32. If it is unset,
+// returns default_val. If it is not an Int32, prints an error
+// and aborts.
+Int32 Int32FromEnvOrDie(const char* var, Int32 default_val) {
+  const char* str_val = posix::GetEnv(var);
+  if (str_val == NULL) {
+    return default_val;
+  }
+
+  Int32 result;
+  if (!ParseInt32(Message() << "The value of environment variable " << var,
+                  str_val, &result)) {
+    exit(EXIT_FAILURE);
+  }
+  return result;
+}
+
+// Given the total number of shards, the shard index, and the test id,
+// returns true iff the test should be run on this shard. The test id is
+// some arbitrary but unique non-negative integer assigned to each test
+// method. Assumes that 0 <= shard_index < total_shards.
+bool ShouldRunTestOnShard(int total_shards, int shard_index, int test_id) {
+  return (test_id % total_shards) == shard_index;
+}
+
+// Compares the name of each test with the user-specified filter to
+// decide whether the test should be run, then records the result in
+// each TestCase and TestInfo object.
+// If shard_tests == true, further filters tests based on sharding
+// variables in the environment - see
+// http://code.google.com/p/googletest/wiki/GoogleTestAdvancedGuide.
+// Returns the number of tests that should run.
+int UnitTestImpl::FilterTests(ReactionToSharding shard_tests) {
+  const Int32 total_shards = shard_tests == HONOR_SHARDING_PROTOCOL ?
+      Int32FromEnvOrDie(kTestTotalShards, -1) : -1;
+  const Int32 shard_index = shard_tests == HONOR_SHARDING_PROTOCOL ?
+      Int32FromEnvOrDie(kTestShardIndex, -1) : -1;
+
+  // num_runnable_tests are the number of tests that will
+  // run across all shards (i.e., match filter and are not disabled).
+  // num_selected_tests are the number of tests to be run on
+  // this shard.
+  int num_runnable_tests = 0;
+  int num_selected_tests = 0;
+  for (size_t i = 0; i < test_cases_.size(); i++) {
+    TestCase* const test_case = test_cases_[i];
+    const std::string &test_case_name = test_case->name();
+    test_case->set_should_run(false);
+
+    for (size_t j = 0; j < test_case->test_info_list().size(); j++) {
+      TestInfo* const test_info = test_case->test_info_list()[j];
+      const std::string test_name(test_info->name());
+      // A test is disabled if test case name or test name matches
+      // kDisableTestFilter.
+      const bool is_disabled =
+          internal::UnitTestOptions::MatchesFilter(test_case_name,
+                                                   kDisableTestFilter) ||
+          internal::UnitTestOptions::MatchesFilter(test_name,
+                                                   kDisableTestFilter);
+      test_info->is_disabled_ = is_disabled;
+
+      const bool matches_filter =
+          internal::UnitTestOptions::FilterMatchesTest(test_case_name,
+                                                       test_name);
+      test_info->matches_filter_ = matches_filter;
+
+      const bool is_runnable =
+          (GTEST_FLAG(also_run_disabled_tests) || !is_disabled) &&
+          matches_filter;
+
+      const bool is_selected = is_runnable &&
+          (shard_tests == IGNORE_SHARDING_PROTOCOL ||
+           ShouldRunTestOnShard(total_shards, shard_index,
+                                num_runnable_tests));
+
+      num_runnable_tests += is_runnable;
+      num_selected_tests += is_selected;
+
+      test_info->should_run_ = is_selected;
+      test_case->set_should_run(test_case->should_run() || is_selected);
+    }
+  }
+  return num_selected_tests;
+}
+
+// Prints the given C-string on a single line by replacing all '\n'
+// characters with string "\\n".  If the output takes more than
+// max_length characters, only prints the first max_length characters
+// and "...".
+static void PrintOnOneLine(const char* str, int max_length) {
+  if (str != NULL) {
+    for (int i = 0; *str != '\0'; ++str) {
+      if (i >= max_length) {
+        printf("...");
+        break;
+      }
+      if (*str == '\n') {
+        printf("\\n");
+        i += 2;
+      } else {
+        printf("%c", *str);
+        ++i;
+      }
+    }
+  }
+}
+
+// Prints the names of the tests matching the user-specified filter flag.
+void UnitTestImpl::ListTestsMatchingFilter() {
+  // Print at most this many characters for each type/value parameter.
+  const int kMaxParamLength = 250;
+
+  for (size_t i = 0; i < test_cases_.size(); i++) {
+    const TestCase* const test_case = test_cases_[i];
+    bool printed_test_case_name = false;
+
+    for (size_t j = 0; j < test_case->test_info_list().size(); j++) {
+      const TestInfo* const test_info =
+          test_case->test_info_list()[j];
+      if (test_info->matches_filter_) {
+        if (!printed_test_case_name) {
+          printed_test_case_name = true;
+          printf("%s.", test_case->name());
+          if (test_case->type_param() != NULL) {
+            printf("  # %s = ", kTypeParamLabel);
+            // We print the type parameter on a single line to make
+            // the output easy to parse by a program.
+            PrintOnOneLine(test_case->type_param(), kMaxParamLength);
+          }
+          printf("\n");
+        }
+        printf("  %s", test_info->name());
+        if (test_info->value_param() != NULL) {
+          printf("  # %s = ", kValueParamLabel);
+          // We print the value parameter on a single line to make the
+          // output easy to parse by a program.
+          PrintOnOneLine(test_info->value_param(), kMaxParamLength);
+        }
+        printf("\n");
+      }
+    }
+  }
+  fflush(stdout);
+}
+
+// Sets the OS stack trace getter.
+//
+// Does nothing if the input and the current OS stack trace getter are
+// the same; otherwise, deletes the old getter and makes the input the
+// current getter.
+void UnitTestImpl::set_os_stack_trace_getter(
+    OsStackTraceGetterInterface* getter) {
+  if (os_stack_trace_getter_ != getter) {
+    delete os_stack_trace_getter_;
+    os_stack_trace_getter_ = getter;
+  }
+}
+
+// Returns the current OS stack trace getter if it is not NULL;
+// otherwise, creates an OsStackTraceGetter, makes it the current
+// getter, and returns it.
+OsStackTraceGetterInterface* UnitTestImpl::os_stack_trace_getter() {
+  if (os_stack_trace_getter_ == NULL) {
+    os_stack_trace_getter_ = new OsStackTraceGetter;
+  }
+
+  return os_stack_trace_getter_;
+}
+
+// Returns the TestResult for the test that's currently running, or
+// the TestResult for the ad hoc test if no test is running.
+TestResult* UnitTestImpl::current_test_result() {
+  return current_test_info_ ?
+      &(current_test_info_->result_) : &ad_hoc_test_result_;
+}
+
+// Shuffles all test cases, and the tests within each test case,
+// making sure that death tests are still run first.
+void UnitTestImpl::ShuffleTests() {
+  // Shuffles the death test cases.
+  ShuffleRange(random(), 0, last_death_test_case_ + 1, &test_case_indices_);
+
+  // Shuffles the non-death test cases.
+  ShuffleRange(random(), last_death_test_case_ + 1,
+               static_cast<int>(test_cases_.size()), &test_case_indices_);
+
+  // Shuffles the tests inside each test case.
+  for (size_t i = 0; i < test_cases_.size(); i++) {
+    test_cases_[i]->ShuffleTests(random());
+  }
+}
+
+// Restores the test cases and tests to their order before the first shuffle.
+void UnitTestImpl::UnshuffleTests() {
+  for (size_t i = 0; i < test_cases_.size(); i++) {
+    // Unshuffles the tests in each test case.
+    test_cases_[i]->UnshuffleTests();
+    // Resets the index of each test case.
+    test_case_indices_[i] = static_cast<int>(i);
+  }
+}
+
+// Returns the current OS stack trace as an std::string.
+//
+// The maximum number of stack frames to be included is specified by
+// the gtest_stack_trace_depth flag.  The skip_count parameter
+// specifies the number of top frames to be skipped, which doesn't
+// count against the number of frames to be included.
+//
+// For example, if Foo() calls Bar(), which in turn calls
+// GetCurrentOsStackTraceExceptTop(..., 1), Foo() will be included in
+// the trace but Bar() and GetCurrentOsStackTraceExceptTop() won't.
+std::string GetCurrentOsStackTraceExceptTop(UnitTest* /*unit_test*/,
+                                            int skip_count) {
+  // We pass skip_count + 1 to skip this wrapper function in addition
+  // to what the user really wants to skip.
+  return GetUnitTestImpl()->CurrentOsStackTraceExceptTop(skip_count + 1);
+}
+
+// Used by the GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_ macro to
+// suppress unreachable code warnings.
+namespace {
+class ClassUniqueToAlwaysTrue {};
+}
+
+bool IsTrue(bool condition) { return condition; }
+
+bool AlwaysTrue() {
+#if GTEST_HAS_EXCEPTIONS
+  // This condition is always false so AlwaysTrue() never actually throws,
+  // but it makes the compiler think that it may throw.
+  if (IsTrue(false))
+    throw ClassUniqueToAlwaysTrue();
+#endif  // GTEST_HAS_EXCEPTIONS
+  return true;
+}
+
+// If *pstr starts with the given prefix, modifies *pstr to be right
+// past the prefix and returns true; otherwise leaves *pstr unchanged
+// and returns false.  None of pstr, *pstr, and prefix can be NULL.
+bool SkipPrefix(const char* prefix, const char** pstr) {
+  const size_t prefix_len = strlen(prefix);
+  if (strncmp(*pstr, prefix, prefix_len) == 0) {
+    *pstr += prefix_len;
+    return true;
+  }
+  return false;
+}
+
+// Parses a string as a command line flag.  The string should have
+// the format "--flag=value".  When def_optional is true, the "=value"
+// part can be omitted.
+//
+// Returns the value of the flag, or NULL if the parsing failed.
+const char* ParseFlagValue(const char* str,
+                           const char* flag,
+                           bool def_optional) {
+  // str and flag must not be NULL.
+  if (str == NULL || flag == NULL) return NULL;
+
+  // The flag must start with "--" followed by GTEST_FLAG_PREFIX_.
+  const std::string flag_str = std::string("--") + GTEST_FLAG_PREFIX_ + flag;
+  const size_t flag_len = flag_str.length();
+  if (strncmp(str, flag_str.c_str(), flag_len) != 0) return NULL;
+
+  // Skips the flag name.
+  const char* flag_end = str + flag_len;
+
+  // When def_optional is true, it's OK to not have a "=value" part.
+  if (def_optional && (flag_end[0] == '\0')) {
+    return flag_end;
+  }
+
+  // If def_optional is true and there are more characters after the
+  // flag name, or if def_optional is false, there must be a '=' after
+  // the flag name.
+  if (flag_end[0] != '=') return NULL;
+
+  // Returns the string after "=".
+  return flag_end + 1;
+}
+
+// Parses a string for a bool flag, in the form of either
+// "--flag=value" or "--flag".
+//
+// In the former case, the value is taken as true as long as it does
+// not start with '0', 'f', or 'F'.
+//
+// In the latter case, the value is taken as true.
+//
+// On success, stores the value of the flag in *value, and returns
+// true.  On failure, returns false without changing *value.
+bool ParseBoolFlag(const char* str, const char* flag, bool* value) {
+  // Gets the value of the flag as a string.
+  const char* const value_str = ParseFlagValue(str, flag, true);
+
+  // Aborts if the parsing failed.
+  if (value_str == NULL) return false;
+
+  // Converts the string value to a bool.
+  *value = !(*value_str == '0' || *value_str == 'f' || *value_str == 'F');
+  return true;
+}
+
+// Parses a string for an Int32 flag, in the form of
+// "--flag=value".
+//
+// On success, stores the value of the flag in *value, and returns
+// true.  On failure, returns false without changing *value.
+bool ParseInt32Flag(const char* str, const char* flag, Int32* value) {
+  // Gets the value of the flag as a string.
+  const char* const value_str = ParseFlagValue(str, flag, false);
+
+  // Aborts if the parsing failed.
+  if (value_str == NULL) return false;
+
+  // Sets *value to the value of the flag.
+  return ParseInt32(Message() << "The value of flag --" << flag,
+                    value_str, value);
+}
+
+// Parses a string for a string flag, in the form of
+// "--flag=value".
+//
+// On success, stores the value of the flag in *value, and returns
+// true.  On failure, returns false without changing *value.
+bool ParseStringFlag(const char* str, const char* flag, std::string* value) {
+  // Gets the value of the flag as a string.
+  const char* const value_str = ParseFlagValue(str, flag, false);
+
+  // Aborts if the parsing failed.
+  if (value_str == NULL) return false;
+
+  // Sets *value to the value of the flag.
+  *value = value_str;
+  return true;
+}
+
+// Determines whether a string has a prefix that Google Test uses for its
+// flags, i.e., starts with GTEST_FLAG_PREFIX_ or GTEST_FLAG_PREFIX_DASH_.
+// If Google Test detects that a command line flag has its prefix but is not
+// recognized, it will print its help message. Flags starting with
+// GTEST_INTERNAL_PREFIX_ followed by "internal_" are considered Google Test
+// internal flags and do not trigger the help message.
+static bool HasGoogleTestFlagPrefix(const char* str) {
+  return (SkipPrefix("--", &str) ||
+          SkipPrefix("-", &str) ||
+          SkipPrefix("/", &str)) &&
+         !SkipPrefix(GTEST_FLAG_PREFIX_ "internal_", &str) &&
+         (SkipPrefix(GTEST_FLAG_PREFIX_, &str) ||
+          SkipPrefix(GTEST_FLAG_PREFIX_DASH_, &str));
+}
+
+// Prints a string containing code-encoded text.  The following escape
+// sequences can be used in the string to control the text color:
+//
+//   @@    prints a single '@' character.
+//   @R    changes the color to red.
+//   @G    changes the color to green.
+//   @Y    changes the color to yellow.
+//   @D    changes to the default terminal text color.
+//
+// TODO(wan at google.com): Write tests for this once we add stdout
+// capturing to Google Test.
+static void PrintColorEncoded(const char* str) {
+  GTestColor color = COLOR_DEFAULT;  // The current color.
+
+  // Conceptually, we split the string into segments divided by escape
+  // sequences.  Then we print one segment at a time.  At the end of
+  // each iteration, the str pointer advances to the beginning of the
+  // next segment.
+  for (;;) {
+    const char* p = strchr(str, '@');
+    if (p == NULL) {
+      ColoredPrintf(color, "%s", str);
+      return;
+    }
+
+    ColoredPrintf(color, "%s", std::string(str, p).c_str());
+
+    const char ch = p[1];
+    str = p + 2;
+    if (ch == '@') {
+      ColoredPrintf(color, "@");
+    } else if (ch == 'D') {
+      color = COLOR_DEFAULT;
+    } else if (ch == 'R') {
+      color = COLOR_RED;
+    } else if (ch == 'G') {
+      color = COLOR_GREEN;
+    } else if (ch == 'Y') {
+      color = COLOR_YELLOW;
+    } else {
+      --str;
+    }
+  }
+}
+
+static const char kColorEncodedHelpMessage[] =
+"This program contains tests written using " GTEST_NAME_ ". You can use the\n"
+"following command line flags to control its behavior:\n"
+"\n"
+"Test Selection:\n"
+"  @G--" GTEST_FLAG_PREFIX_ "list_tests at D\n"
+"      List the names of all tests instead of running them. The name of\n"
+"      TEST(Foo, Bar) is \"Foo.Bar\".\n"
+"  @G--" GTEST_FLAG_PREFIX_ "filter=@YPOSTIVE_PATTERNS"
+    "[@G- at YNEGATIVE_PATTERNS]@D\n"
+"      Run only the tests whose name matches one of the positive patterns but\n"
+"      none of the negative patterns. '?' matches any single character; '*'\n"
+"      matches any substring; ':' separates two patterns.\n"
+"  @G--" GTEST_FLAG_PREFIX_ "also_run_disabled_tests at D\n"
+"      Run all disabled tests too.\n"
+"\n"
+"Test Execution:\n"
+"  @G--" GTEST_FLAG_PREFIX_ "repeat=@Y[COUNT]@D\n"
+"      Run the tests repeatedly; use a negative count to repeat forever.\n"
+"  @G--" GTEST_FLAG_PREFIX_ "shuffle at D\n"
+"      Randomize tests' orders on every iteration.\n"
+"  @G--" GTEST_FLAG_PREFIX_ "random_seed=@Y[NUMBER]@D\n"
+"      Random number seed to use for shuffling test orders (between 1 and\n"
+"      99999, or 0 to use a seed based on the current time).\n"
+"\n"
+"Test Output:\n"
+"  @G--" GTEST_FLAG_PREFIX_ "color=@Y(@Gyes at Y|@Gno at Y|@Gauto at Y)@D\n"
+"      Enable/disable colored output. The default is @Gauto at D.\n"
+"  - at G-" GTEST_FLAG_PREFIX_ "print_time=0 at D\n"
+"      Don't print the elapsed time of each test.\n"
+"  @G--" GTEST_FLAG_PREFIX_ "output=xml at Y[@G:@YDIRECTORY_PATH at G"
+    GTEST_PATH_SEP_ "@Y|@G:@YFILE_PATH]@D\n"
+"      Generate an XML report in the given directory or with the given file\n"
+"      name. @YFILE_PATH at D defaults to @Gtest_details.xml at D.\n"
+#if GTEST_CAN_STREAM_RESULTS_
+"  @G--" GTEST_FLAG_PREFIX_ "stream_result_to=@YHOST at G:@YPORT at D\n"
+"      Stream test results to the given server.\n"
+#endif  // GTEST_CAN_STREAM_RESULTS_
+"\n"
+"Assertion Behavior:\n"
+#if GTEST_HAS_DEATH_TEST && !GTEST_OS_WINDOWS
+"  @G--" GTEST_FLAG_PREFIX_ "death_test_style=@Y(@Gfast at Y|@Gthreadsafe at Y)@D\n"
+"      Set the default death test style.\n"
+#endif  // GTEST_HAS_DEATH_TEST && !GTEST_OS_WINDOWS
+"  @G--" GTEST_FLAG_PREFIX_ "break_on_failure at D\n"
+"      Turn assertion failures into debugger break-points.\n"
+"  @G--" GTEST_FLAG_PREFIX_ "throw_on_failure at D\n"
+"      Turn assertion failures into C++ exceptions.\n"
+"  @G--" GTEST_FLAG_PREFIX_ "catch_exceptions=0 at D\n"
+"      Do not report exceptions as test failures. Instead, allow them\n"
+"      to crash the program or throw a pop-up (on Windows).\n"
+"\n"
+"Except for @G--" GTEST_FLAG_PREFIX_ "list_tests at D, you can alternatively set "
+    "the corresponding\n"
+"environment variable of a flag (all letters in upper-case). For example, to\n"
+"disable colored text output, you can either specify @G--" GTEST_FLAG_PREFIX_
+    "color=no at D or set\n"
+"the @G" GTEST_FLAG_PREFIX_UPPER_ "COLOR at D environment variable to @Gno at D.\n"
+"\n"
+"For more information, please read the " GTEST_NAME_ " documentation at\n"
+"@G" GTEST_PROJECT_URL_ "@D. If you find a bug in " GTEST_NAME_ "\n"
+"(not one in your own code or tests), please report it to\n"
+"@G<" GTEST_DEV_EMAIL_ ">@D.\n";
+
+// Parses the command line for Google Test flags, without initializing
+// other parts of Google Test.  The type parameter CharType can be
+// instantiated to either char or wchar_t.
+template <typename CharType>
+void ParseGoogleTestFlagsOnlyImpl(int* argc, CharType** argv) {
+  for (int i = 1; i < *argc; i++) {
+    const std::string arg_string = StreamableToString(argv[i]);
+    const char* const arg = arg_string.c_str();
+
+    using internal::ParseBoolFlag;
+    using internal::ParseInt32Flag;
+    using internal::ParseStringFlag;
+
+    // Do we see a Google Test flag?
+    if (ParseBoolFlag(arg, kAlsoRunDisabledTestsFlag,
+                      &GTEST_FLAG(also_run_disabled_tests)) ||
+        ParseBoolFlag(arg, kBreakOnFailureFlag,
+                      &GTEST_FLAG(break_on_failure)) ||
+        ParseBoolFlag(arg, kCatchExceptionsFlag,
+                      &GTEST_FLAG(catch_exceptions)) ||
+        ParseStringFlag(arg, kColorFlag, &GTEST_FLAG(color)) ||
+        ParseStringFlag(arg, kDeathTestStyleFlag,
+                        &GTEST_FLAG(death_test_style)) ||
+        ParseBoolFlag(arg, kDeathTestUseFork,
+                      &GTEST_FLAG(death_test_use_fork)) ||
+        ParseStringFlag(arg, kFilterFlag, &GTEST_FLAG(filter)) ||
+        ParseStringFlag(arg, kInternalRunDeathTestFlag,
+                        &GTEST_FLAG(internal_run_death_test)) ||
+        ParseBoolFlag(arg, kListTestsFlag, &GTEST_FLAG(list_tests)) ||
+        ParseStringFlag(arg, kOutputFlag, &GTEST_FLAG(output)) ||
+        ParseBoolFlag(arg, kPrintTimeFlag, &GTEST_FLAG(print_time)) ||
+        ParseInt32Flag(arg, kRandomSeedFlag, &GTEST_FLAG(random_seed)) ||
+        ParseInt32Flag(arg, kRepeatFlag, &GTEST_FLAG(repeat)) ||
+        ParseBoolFlag(arg, kShuffleFlag, &GTEST_FLAG(shuffle)) ||
+        ParseInt32Flag(arg, kStackTraceDepthFlag,
+                       &GTEST_FLAG(stack_trace_depth)) ||
+        ParseStringFlag(arg, kStreamResultToFlag,
+                        &GTEST_FLAG(stream_result_to)) ||
+        ParseBoolFlag(arg, kThrowOnFailureFlag,
+                      &GTEST_FLAG(throw_on_failure))
+        ) {
+      // Yes.  Shift the remainder of the argv list left by one.  Note
+      // that argv has (*argc + 1) elements, the last one always being
+      // NULL.  The following loop moves the trailing NULL element as
+      // well.
+      for (int j = i; j != *argc; j++) {
+        argv[j] = argv[j + 1];
+      }
+
+      // Decrements the argument count.
+      (*argc)--;
+
+      // We also need to decrement the iterator as we just removed
+      // an element.
+      i--;
+    } else if (arg_string == "--help" || arg_string == "-h" ||
+               arg_string == "-?" || arg_string == "/?" ||
+               HasGoogleTestFlagPrefix(arg)) {
+      // Both help flag and unrecognized Google Test flags (excluding
+      // internal ones) trigger help display.
+      g_help_flag = true;
+    }
+  }
+
+  if (g_help_flag) {
+    // We print the help here instead of in RUN_ALL_TESTS(), as the
+    // latter may not be called at all if the user is using Google
+    // Test with another testing framework.
+    PrintColorEncoded(kColorEncodedHelpMessage);
+  }
+}
+
+// Parses the command line for Google Test flags, without initializing
+// other parts of Google Test.
+void ParseGoogleTestFlagsOnly(int* argc, char** argv) {
+  ParseGoogleTestFlagsOnlyImpl(argc, argv);
+}
+void ParseGoogleTestFlagsOnly(int* argc, wchar_t** argv) {
+  ParseGoogleTestFlagsOnlyImpl(argc, argv);
+}
+
+// The internal implementation of InitGoogleTest().
+//
+// The type parameter CharType can be instantiated to either char or
+// wchar_t.
+template <typename CharType>
+void InitGoogleTestImpl(int* argc, CharType** argv) {
+  g_init_gtest_count++;
+
+  // We don't want to run the initialization code twice.
+  if (g_init_gtest_count != 1) return;
+
+  if (*argc <= 0) return;
+
+  internal::g_executable_path = internal::StreamableToString(argv[0]);
+
+#if GTEST_HAS_DEATH_TEST
+
+  g_argvs.clear();
+  for (int i = 0; i != *argc; i++) {
+    g_argvs.push_back(StreamableToString(argv[i]));
+  }
+
+#endif  // GTEST_HAS_DEATH_TEST
+
+  ParseGoogleTestFlagsOnly(argc, argv);
+  GetUnitTestImpl()->PostFlagParsingInit();
+}
+
+}  // namespace internal
+
+// Initializes Google Test.  This must be called before calling
+// RUN_ALL_TESTS().  In particular, it parses a command line for the
+// flags that Google Test recognizes.  Whenever a Google Test flag is
+// seen, it is removed from argv, and *argc is decremented.
+//
+// No value is returned.  Instead, the Google Test flag variables are
+// updated.
+//
+// Calling the function for the second time has no user-visible effect.
+void InitGoogleTest(int* argc, char** argv) {
+  internal::InitGoogleTestImpl(argc, argv);
+}
+
+// This overloaded version can be used in Windows programs compiled in
+// UNICODE mode.
+void InitGoogleTest(int* argc, wchar_t** argv) {
+  internal::InitGoogleTestImpl(argc, argv);
+}
+
+}  // namespace testing
+// Copyright 2005, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan), vladl at google.com (Vlad Losev)
+//
+// This file implements death tests.
+
+
+#if GTEST_HAS_DEATH_TEST
+
+# if GTEST_OS_MAC
+#  include <crt_externs.h>
+# endif  // GTEST_OS_MAC
+
+# include <errno.h>
+# include <fcntl.h>
+# include <limits.h>
+
+# if GTEST_OS_LINUX
+#  include <signal.h>
+# endif  // GTEST_OS_LINUX
+
+# include <stdarg.h>
+
+# if GTEST_OS_WINDOWS
+#  include <windows.h>
+# else
+#  include <sys/mman.h>
+#  include <sys/wait.h>
+# endif  // GTEST_OS_WINDOWS
+
+# if GTEST_OS_QNX
+#  include <spawn.h>
+# endif  // GTEST_OS_QNX
+
+#endif  // GTEST_HAS_DEATH_TEST
+
+
+// Indicates that this translation unit is part of Google Test's
+// implementation.  It must come before gtest-internal-inl.h is
+// included, or there will be a compiler error.  This trick is to
+// prevent a user from accidentally including gtest-internal-inl.h in
+// his code.
+#define GTEST_IMPLEMENTATION_ 1
+#undef GTEST_IMPLEMENTATION_
+
+namespace testing {
+
+// Constants.
+
+// The default death test style.
+static const char kDefaultDeathTestStyle[] = "fast";
+
+GTEST_DEFINE_string_(
+    death_test_style,
+    internal::StringFromGTestEnv("death_test_style", kDefaultDeathTestStyle),
+    "Indicates how to run a death test in a forked child process: "
+    "\"threadsafe\" (child process re-executes the test binary "
+    "from the beginning, running only the specific death test) or "
+    "\"fast\" (child process runs the death test immediately "
+    "after forking).");
+
+GTEST_DEFINE_bool_(
+    death_test_use_fork,
+    internal::BoolFromGTestEnv("death_test_use_fork", false),
+    "Instructs to use fork()/_exit() instead of clone() in death tests. "
+    "Ignored and always uses fork() on POSIX systems where clone() is not "
+    "implemented. Useful when running under valgrind or similar tools if "
+    "those do not support clone(). Valgrind 3.3.1 will just fail if "
+    "it sees an unsupported combination of clone() flags. "
+    "It is not recommended to use this flag w/o valgrind though it will "
+    "work in 99% of the cases. Once valgrind is fixed, this flag will "
+    "most likely be removed.");
+
+namespace internal {
+GTEST_DEFINE_string_(
+    internal_run_death_test, "",
+    "Indicates the file, line number, temporal index of "
+    "the single death test to run, and a file descriptor to "
+    "which a success code may be sent, all separated by "
+    "the '|' characters.  This flag is specified if and only if the current "
+    "process is a sub-process launched for running a thread-safe "
+    "death test.  FOR INTERNAL USE ONLY.");
+}  // namespace internal
+
+#if GTEST_HAS_DEATH_TEST
+
+namespace internal {
+
+// Valid only for fast death tests. Indicates the code is running in the
+// child process of a fast style death test.
+static bool g_in_fast_death_test_child = false;
+
+// Returns a Boolean value indicating whether the caller is currently
+// executing in the context of the death test child process.  Tools such as
+// Valgrind heap checkers may need this to modify their behavior in death
+// tests.  IMPORTANT: This is an internal utility.  Using it may break the
+// implementation of death tests.  User code MUST NOT use it.
+bool InDeathTestChild() {
+# if GTEST_OS_WINDOWS
+
+  // On Windows, death tests are thread-safe regardless of the value of the
+  // death_test_style flag.
+  return !GTEST_FLAG(internal_run_death_test).empty();
+
+# else
+
+  if (GTEST_FLAG(death_test_style) == "threadsafe")
+    return !GTEST_FLAG(internal_run_death_test).empty();
+  else
+    return g_in_fast_death_test_child;
+#endif
+}
+
+}  // namespace internal
+
+// ExitedWithCode constructor.
+ExitedWithCode::ExitedWithCode(int exit_code) : exit_code_(exit_code) {
+}
+
+// ExitedWithCode function-call operator.
+bool ExitedWithCode::operator()(int exit_status) const {
+# if GTEST_OS_WINDOWS
+
+  return exit_status == exit_code_;
+
+# else
+
+  return WIFEXITED(exit_status) && WEXITSTATUS(exit_status) == exit_code_;
+
+# endif  // GTEST_OS_WINDOWS
+}
+
+# if !GTEST_OS_WINDOWS
+// KilledBySignal constructor.
+KilledBySignal::KilledBySignal(int signum) : signum_(signum) {
+}
+
+// KilledBySignal function-call operator.
+bool KilledBySignal::operator()(int exit_status) const {
+  return WIFSIGNALED(exit_status) && WTERMSIG(exit_status) == signum_;
+}
+# endif  // !GTEST_OS_WINDOWS
+
+namespace internal {
+
+// Utilities needed for death tests.
+
+// Generates a textual description of a given exit code, in the format
+// specified by wait(2).
+static std::string ExitSummary(int exit_code) {
+  Message m;
+
+# if GTEST_OS_WINDOWS
+
+  m << "Exited with exit status " << exit_code;
+
+# else
+
+  if (WIFEXITED(exit_code)) {
+    m << "Exited with exit status " << WEXITSTATUS(exit_code);
+  } else if (WIFSIGNALED(exit_code)) {
+    m << "Terminated by signal " << WTERMSIG(exit_code);
+  }
+#  ifdef WCOREDUMP
+  if (WCOREDUMP(exit_code)) {
+    m << " (core dumped)";
+  }
+#  endif
+# endif  // GTEST_OS_WINDOWS
+
+  return m.GetString();
+}
+
+// Returns true if exit_status describes a process that was terminated
+// by a signal, or exited normally with a nonzero exit code.
+bool ExitedUnsuccessfully(int exit_status) {
+  return !ExitedWithCode(0)(exit_status);
+}
+
+# if !GTEST_OS_WINDOWS
+// Generates a textual failure message when a death test finds more than
+// one thread running, or cannot determine the number of threads, prior
+// to executing the given statement.  It is the responsibility of the
+// caller not to pass a thread_count of 1.
+static std::string DeathTestThreadWarning(size_t thread_count) {
+  Message msg;
+  msg << "Death tests use fork(), which is unsafe particularly"
+      << " in a threaded context. For this test, " << GTEST_NAME_ << " ";
+  if (thread_count == 0)
+    msg << "couldn't detect the number of threads.";
+  else
+    msg << "detected " << thread_count << " threads.";
+  return msg.GetString();
+}
+# endif  // !GTEST_OS_WINDOWS
+
+// Flag characters for reporting a death test that did not die.
+static const char kDeathTestLived = 'L';
+static const char kDeathTestReturned = 'R';
+static const char kDeathTestThrew = 'T';
+static const char kDeathTestInternalError = 'I';
+
+// An enumeration describing all of the possible ways that a death test can
+// conclude.  DIED means that the process died while executing the test
+// code; LIVED means that process lived beyond the end of the test code;
+// RETURNED means that the test statement attempted to execute a return
+// statement, which is not allowed; THREW means that the test statement
+// returned control by throwing an exception.  IN_PROGRESS means the test
+// has not yet concluded.
+// TODO(vladl at google.com): Unify names and possibly values for
+// AbortReason, DeathTestOutcome, and flag characters above.
+enum DeathTestOutcome { IN_PROGRESS, DIED, LIVED, RETURNED, THREW };
+
+// Routine for aborting the program which is safe to call from an
+// exec-style death test child process, in which case the error
+// message is propagated back to the parent process.  Otherwise, the
+// message is simply printed to stderr.  In either case, the program
+// then exits with status 1.
+void DeathTestAbort(const std::string& message) {
+  // On a POSIX system, this function may be called from a threadsafe-style
+  // death test child process, which operates on a very small stack.  Use
+  // the heap for any additional non-minuscule memory requirements.
+  const InternalRunDeathTestFlag* const flag =
+      GetUnitTestImpl()->internal_run_death_test_flag();
+  if (flag != NULL) {
+    FILE* parent = posix::FDOpen(flag->write_fd(), "w");
+    fputc(kDeathTestInternalError, parent);
+    fprintf(parent, "%s", message.c_str());
+    fflush(parent);
+    _exit(1);
+  } else {
+    fprintf(stderr, "%s", message.c_str());
+    fflush(stderr);
+    posix::Abort();
+  }
+}
+
+// A replacement for CHECK that calls DeathTestAbort if the assertion
+// fails.
+# define GTEST_DEATH_TEST_CHECK_(expression) \
+  do { \
+    if (!::testing::internal::IsTrue(expression)) { \
+      DeathTestAbort( \
+          ::std::string("CHECK failed: File ") + __FILE__ +  ", line " \
+          + ::testing::internal::StreamableToString(__LINE__) + ": " \
+          + #expression); \
+    } \
+  } while (::testing::internal::AlwaysFalse())
+
+// This macro is similar to GTEST_DEATH_TEST_CHECK_, but it is meant for
+// evaluating any system call that fulfills two conditions: it must return
+// -1 on failure, and set errno to EINTR when it is interrupted and
+// should be tried again.  The macro expands to a loop that repeatedly
+// evaluates the expression as long as it evaluates to -1 and sets
+// errno to EINTR.  If the expression evaluates to -1 but errno is
+// something other than EINTR, DeathTestAbort is called.
+# define GTEST_DEATH_TEST_CHECK_SYSCALL_(expression) \
+  do { \
+    int gtest_retval; \
+    do { \
+      gtest_retval = (expression); \
+    } while (gtest_retval == -1 && errno == EINTR); \
+    if (gtest_retval == -1) { \
+      DeathTestAbort( \
+          ::std::string("CHECK failed: File ") + __FILE__ + ", line " \
+          + ::testing::internal::StreamableToString(__LINE__) + ": " \
+          + #expression + " != -1"); \
+    } \
+  } while (::testing::internal::AlwaysFalse())
+
+// Returns the message describing the last system error in errno.
+std::string GetLastErrnoDescription() {
+    return errno == 0 ? "" : posix::StrError(errno);
+}
+
+// This is called from a death test parent process to read a failure
+// message from the death test child process and log it with the FATAL
+// severity. On Windows, the message is read from a pipe handle. On other
+// platforms, it is read from a file descriptor.
+static void FailFromInternalError(int fd) {
+  Message error;
+  char buffer[256];
+  int num_read;
+
+  do {
+    while ((num_read = posix::Read(fd, buffer, 255)) > 0) {
+      buffer[num_read] = '\0';
+      error << buffer;
+    }
+  } while (num_read == -1 && errno == EINTR);
+
+  if (num_read == 0) {
+    GTEST_LOG_(FATAL) << error.GetString();
+  } else {
+    const int last_error = errno;
+    GTEST_LOG_(FATAL) << "Error while reading death test internal: "
+                      << GetLastErrnoDescription() << " [" << last_error << "]";
+  }
+}
+
+// Death test constructor.  Increments the running death test count
+// for the current test.
+DeathTest::DeathTest() {
+  TestInfo* const info = GetUnitTestImpl()->current_test_info();
+  if (info == NULL) {
+    DeathTestAbort("Cannot run a death test outside of a TEST or "
+                   "TEST_F construct");
+  }
+}
+
+// Creates and returns a death test by dispatching to the current
+// death test factory.
+bool DeathTest::Create(const char* statement, const RE* regex,
+                       const char* file, int line, DeathTest** test) {
+  return GetUnitTestImpl()->death_test_factory()->Create(
+      statement, regex, file, line, test);
+}
+
+const char* DeathTest::LastMessage() {
+  return last_death_test_message_.c_str();
+}
+
+void DeathTest::set_last_death_test_message(const std::string& message) {
+  last_death_test_message_ = message;
+}
+
+std::string DeathTest::last_death_test_message_;
+
+// Provides cross platform implementation for some death functionality.
+class DeathTestImpl : public DeathTest {
+ protected:
+  DeathTestImpl(const char* a_statement, const RE* a_regex)
+      : statement_(a_statement),
+        regex_(a_regex),
+        spawned_(false),
+        status_(-1),
+        outcome_(IN_PROGRESS),
+        read_fd_(-1),
+        write_fd_(-1) {}
+
+  // read_fd_ is expected to be closed and cleared by a derived class.
+  ~DeathTestImpl() { GTEST_DEATH_TEST_CHECK_(read_fd_ == -1); }
+
+  void Abort(AbortReason reason);
+  virtual bool Passed(bool status_ok);
+
+  const char* statement() const { return statement_; }
+  const RE* regex() const { return regex_; }
+  bool spawned() const { return spawned_; }
+  void set_spawned(bool is_spawned) { spawned_ = is_spawned; }
+  int status() const { return status_; }
+  void set_status(int a_status) { status_ = a_status; }
+  DeathTestOutcome outcome() const { return outcome_; }
+  void set_outcome(DeathTestOutcome an_outcome) { outcome_ = an_outcome; }
+  int read_fd() const { return read_fd_; }
+  void set_read_fd(int fd) { read_fd_ = fd; }
+  int write_fd() const { return write_fd_; }
+  void set_write_fd(int fd) { write_fd_ = fd; }
+
+  // Called in the parent process only. Reads the result code of the death
+  // test child process via a pipe, interprets it to set the outcome_
+  // member, and closes read_fd_.  Outputs diagnostics and terminates in
+  // case of unexpected codes.
+  void ReadAndInterpretStatusByte();
+
+ private:
+  // The textual content of the code this object is testing.  This class
+  // doesn't own this string and should not attempt to delete it.
+  const char* const statement_;
+  // The regular expression which test output must match.  DeathTestImpl
+  // doesn't own this object and should not attempt to delete it.
+  const RE* const regex_;
+  // True if the death test child process has been successfully spawned.
+  bool spawned_;
+  // The exit status of the child process.
+  int status_;
+  // How the death test concluded.
+  DeathTestOutcome outcome_;
+  // Descriptor to the read end of the pipe to the child process.  It is
+  // always -1 in the child process.  The child keeps its write end of the
+  // pipe in write_fd_.
+  int read_fd_;
+  // Descriptor to the child's write end of the pipe to the parent process.
+  // It is always -1 in the parent process.  The parent keeps its end of the
+  // pipe in read_fd_.
+  int write_fd_;
+};
+
+// Called in the parent process only. Reads the result code of the death
+// test child process via a pipe, interprets it to set the outcome_
+// member, and closes read_fd_.  Outputs diagnostics and terminates in
+// case of unexpected codes.
+void DeathTestImpl::ReadAndInterpretStatusByte() {
+  char flag;
+  int bytes_read;
+
+  // The read() here blocks until data is available (signifying the
+  // failure of the death test) or until the pipe is closed (signifying
+  // its success), so it's okay to call this in the parent before
+  // the child process has exited.
+  do {
+    bytes_read = posix::Read(read_fd(), &flag, 1);
+  } while (bytes_read == -1 && errno == EINTR);
+
+  if (bytes_read == 0) {
+    set_outcome(DIED);
+  } else if (bytes_read == 1) {
+    switch (flag) {
+      case kDeathTestReturned:
+        set_outcome(RETURNED);
+        break;
+      case kDeathTestThrew:
+        set_outcome(THREW);
+        break;
+      case kDeathTestLived:
+        set_outcome(LIVED);
+        break;
+      case kDeathTestInternalError:
+        FailFromInternalError(read_fd());  // Does not return.
+        break;
+      default:
+        GTEST_LOG_(FATAL) << "Death test child process reported "
+                          << "unexpected status byte ("
+                          << static_cast<unsigned int>(flag) << ")";
+    }
+  } else {
+    GTEST_LOG_(FATAL) << "Read from death test child process failed: "
+                      << GetLastErrnoDescription();
+  }
+  GTEST_DEATH_TEST_CHECK_SYSCALL_(posix::Close(read_fd()));
+  set_read_fd(-1);
+}
+
+// Signals that the death test code which should have exited, didn't.
+// Should be called only in a death test child process.
+// Writes a status byte to the child's status file descriptor, then
+// calls _exit(1).
+void DeathTestImpl::Abort(AbortReason reason) {
+  // The parent process considers the death test to be a failure if
+  // it finds any data in our pipe.  So, here we write a single flag byte
+  // to the pipe, then exit.
+  const char status_ch =
+      reason == TEST_DID_NOT_DIE ? kDeathTestLived :
+      reason == TEST_THREW_EXCEPTION ? kDeathTestThrew : kDeathTestReturned;
+
+  GTEST_DEATH_TEST_CHECK_SYSCALL_(posix::Write(write_fd(), &status_ch, 1));
+  // We are leaking the descriptor here because on some platforms (i.e.,
+  // when built as Windows DLL), destructors of global objects will still
+  // run after calling _exit(). On such systems, write_fd_ will be
+  // indirectly closed from the destructor of UnitTestImpl, causing double
+  // close if it is also closed here. On debug configurations, double close
+  // may assert. As there are no in-process buffers to flush here, we are
+  // relying on the OS to close the descriptor after the process terminates
+  // when the destructors are not run.
+  _exit(1);  // Exits w/o any normal exit hooks (we were supposed to crash)
+}
+
+// Returns an indented copy of stderr output for a death test.
+// This makes distinguishing death test output lines from regular log lines
+// much easier.
+static ::std::string FormatDeathTestOutput(const ::std::string& output) {
+  ::std::string ret;
+  for (size_t at = 0; ; ) {
+    const size_t line_end = output.find('\n', at);
+    ret += "[  DEATH   ] ";
+    if (line_end == ::std::string::npos) {
+      ret += output.substr(at);
+      break;
+    }
+    ret += output.substr(at, line_end + 1 - at);
+    at = line_end + 1;
+  }
+  return ret;
+}
+
+// Assesses the success or failure of a death test, using both private
+// members which have previously been set, and one argument:
+//
+// Private data members:
+//   outcome:  An enumeration describing how the death test
+//             concluded: DIED, LIVED, THREW, or RETURNED.  The death test
+//             fails in the latter three cases.
+//   status:   The exit status of the child process. On *nix, it is in the
+//             in the format specified by wait(2). On Windows, this is the
+//             value supplied to the ExitProcess() API or a numeric code
+//             of the exception that terminated the program.
+//   regex:    A regular expression object to be applied to
+//             the test's captured standard error output; the death test
+//             fails if it does not match.
+//
+// Argument:
+//   status_ok: true if exit_status is acceptable in the context of
+//              this particular death test, which fails if it is false
+//
+// Returns true iff all of the above conditions are met.  Otherwise, the
+// first failing condition, in the order given above, is the one that is
+// reported. Also sets the last death test message string.
+bool DeathTestImpl::Passed(bool status_ok) {
+  if (!spawned())
+    return false;
+
+  const std::string error_message = GetCapturedStderr();
+
+  bool success = false;
+  Message buffer;
+
+  buffer << "Death test: " << statement() << "\n";
+  switch (outcome()) {
+    case LIVED:
+      buffer << "    Result: failed to die.\n"
+             << " Error msg:\n" << FormatDeathTestOutput(error_message);
+      break;
+    case THREW:
+      buffer << "    Result: threw an exception.\n"
+             << " Error msg:\n" << FormatDeathTestOutput(error_message);
+      break;
+    case RETURNED:
+      buffer << "    Result: illegal return in test statement.\n"
+             << " Error msg:\n" << FormatDeathTestOutput(error_message);
+      break;
+    case DIED:
+      if (status_ok) {
+        const bool matched = RE::PartialMatch(error_message.c_str(), *regex());
+        if (matched) {
+          success = true;
+        } else {
+          buffer << "    Result: died but not with expected error.\n"
+                 << "  Expected: " << regex()->pattern() << "\n"
+                 << "Actual msg:\n" << FormatDeathTestOutput(error_message);
+        }
+      } else {
+        buffer << "    Result: died but not with expected exit code:\n"
+               << "            " << ExitSummary(status()) << "\n"
+               << "Actual msg:\n" << FormatDeathTestOutput(error_message);
+      }
+      break;
+    case IN_PROGRESS:
+    default:
+      GTEST_LOG_(FATAL)
+          << "DeathTest::Passed somehow called before conclusion of test";
+  }
+
+  DeathTest::set_last_death_test_message(buffer.GetString());
+  return success;
+}
+
+# if GTEST_OS_WINDOWS
+// WindowsDeathTest implements death tests on Windows. Due to the
+// specifics of starting new processes on Windows, death tests there are
+// always threadsafe, and Google Test considers the
+// --gtest_death_test_style=fast setting to be equivalent to
+// --gtest_death_test_style=threadsafe there.
+//
+// A few implementation notes:  Like the Linux version, the Windows
+// implementation uses pipes for child-to-parent communication. But due to
+// the specifics of pipes on Windows, some extra steps are required:
+//
+// 1. The parent creates a communication pipe and stores handles to both
+//    ends of it.
+// 2. The parent starts the child and provides it with the information
+//    necessary to acquire the handle to the write end of the pipe.
+// 3. The child acquires the write end of the pipe and signals the parent
+//    using a Windows event.
+// 4. Now the parent can release the write end of the pipe on its side. If
+//    this is done before step 3, the object's reference count goes down to
+//    0 and it is destroyed, preventing the child from acquiring it. The
+//    parent now has to release it, or read operations on the read end of
+//    the pipe will not return when the child terminates.
+// 5. The parent reads child's output through the pipe (outcome code and
+//    any possible error messages) from the pipe, and its stderr and then
+//    determines whether to fail the test.
+//
+// Note: to distinguish Win32 API calls from the local method and function
+// calls, the former are explicitly resolved in the global namespace.
+//
+class WindowsDeathTest : public DeathTestImpl {
+ public:
+  WindowsDeathTest(const char* a_statement,
+                   const RE* a_regex,
+                   const char* file,
+                   int line)
+      : DeathTestImpl(a_statement, a_regex), file_(file), line_(line) {}
+
+  // All of these virtual functions are inherited from DeathTest.
+  virtual int Wait();
+  virtual TestRole AssumeRole();
+
+ private:
+  // The name of the file in which the death test is located.
+  const char* const file_;
+  // The line number on which the death test is located.
+  const int line_;
+  // Handle to the write end of the pipe to the child process.
+  AutoHandle write_handle_;
+  // Child process handle.
+  AutoHandle child_handle_;
+  // Event the child process uses to signal the parent that it has
+  // acquired the handle to the write end of the pipe. After seeing this
+  // event the parent can release its own handles to make sure its
+  // ReadFile() calls return when the child terminates.
+  AutoHandle event_handle_;
+};
+
+// Waits for the child in a death test to exit, returning its exit
+// status, or 0 if no child process exists.  As a side effect, sets the
+// outcome data member.
+int WindowsDeathTest::Wait() {
+  if (!spawned())
+    return 0;
+
+  // Wait until the child either signals that it has acquired the write end
+  // of the pipe or it dies.
+  const HANDLE wait_handles[2] = { child_handle_.Get(), event_handle_.Get() };
+  switch (::WaitForMultipleObjects(2,
+                                   wait_handles,
+                                   FALSE,  // Waits for any of the handles.
+                                   INFINITE)) {
+    case WAIT_OBJECT_0:
+    case WAIT_OBJECT_0 + 1:
+      break;
+    default:
+      GTEST_DEATH_TEST_CHECK_(false);  // Should not get here.
+  }
+
+  // The child has acquired the write end of the pipe or exited.
+  // We release the handle on our side and continue.
+  write_handle_.Reset();
+  event_handle_.Reset();
+
+  ReadAndInterpretStatusByte();
+
+  // Waits for the child process to exit if it haven't already. This
+  // returns immediately if the child has already exited, regardless of
+  // whether previous calls to WaitForMultipleObjects synchronized on this
+  // handle or not.
+  GTEST_DEATH_TEST_CHECK_(
+      WAIT_OBJECT_0 == ::WaitForSingleObject(child_handle_.Get(),
+                                             INFINITE));
+  DWORD status_code;
+  GTEST_DEATH_TEST_CHECK_(
+      ::GetExitCodeProcess(child_handle_.Get(), &status_code) != FALSE);
+  child_handle_.Reset();
+  set_status(static_cast<int>(status_code));
+  return status();
+}
+
+// The AssumeRole process for a Windows death test.  It creates a child
+// process with the same executable as the current process to run the
+// death test.  The child process is given the --gtest_filter and
+// --gtest_internal_run_death_test flags such that it knows to run the
+// current death test only.
+DeathTest::TestRole WindowsDeathTest::AssumeRole() {
+  const UnitTestImpl* const impl = GetUnitTestImpl();
+  const InternalRunDeathTestFlag* const flag =
+      impl->internal_run_death_test_flag();
+  const TestInfo* const info = impl->current_test_info();
+  const int death_test_index = info->result()->death_test_count();
+
+  if (flag != NULL) {
+    // ParseInternalRunDeathTestFlag() has performed all the necessary
+    // processing.
+    set_write_fd(flag->write_fd());
+    return EXECUTE_TEST;
+  }
+
+  // WindowsDeathTest uses an anonymous pipe to communicate results of
+  // a death test.
+  SECURITY_ATTRIBUTES handles_are_inheritable = {
+    sizeof(SECURITY_ATTRIBUTES), NULL, TRUE };
+  HANDLE read_handle, write_handle;
+  GTEST_DEATH_TEST_CHECK_(
+      ::CreatePipe(&read_handle, &write_handle, &handles_are_inheritable,
+                   0)  // Default buffer size.
+      != FALSE);
+  set_read_fd(::_open_osfhandle(reinterpret_cast<intptr_t>(read_handle),
+                                O_RDONLY));
+  write_handle_.Reset(write_handle);
+  event_handle_.Reset(::CreateEvent(
+      &handles_are_inheritable,
+      TRUE,    // The event will automatically reset to non-signaled state.
+      FALSE,   // The initial state is non-signalled.
+      NULL));  // The even is unnamed.
+  GTEST_DEATH_TEST_CHECK_(event_handle_.Get() != NULL);
+  const std::string filter_flag =
+      std::string("--") + GTEST_FLAG_PREFIX_ + kFilterFlag + "=" +
+      info->test_case_name() + "." + info->name();
+  const std::string internal_flag =
+      std::string("--") + GTEST_FLAG_PREFIX_ + kInternalRunDeathTestFlag +
+      "=" + file_ + "|" + StreamableToString(line_) + "|" +
+      StreamableToString(death_test_index) + "|" +
+      StreamableToString(static_cast<unsigned int>(::GetCurrentProcessId())) +
+      // size_t has the same width as pointers on both 32-bit and 64-bit
+      // Windows platforms.
+      // See http://msdn.microsoft.com/en-us/library/tcxf1dw6.aspx.
+      "|" + StreamableToString(reinterpret_cast<size_t>(write_handle)) +
+      "|" + StreamableToString(reinterpret_cast<size_t>(event_handle_.Get()));
+
+  char executable_path[_MAX_PATH + 1];  // NOLINT
+  GTEST_DEATH_TEST_CHECK_(
+      _MAX_PATH + 1 != ::GetModuleFileNameA(NULL,
+                                            executable_path,
+                                            _MAX_PATH));
+
+  std::string command_line =
+      std::string(::GetCommandLineA()) + " " + filter_flag + " \"" +
+      internal_flag + "\"";
+
+  DeathTest::set_last_death_test_message("");
+
+  CaptureStderr();
+  // Flush the log buffers since the log streams are shared with the child.
+  FlushInfoLog();
+
+  // The child process will share the standard handles with the parent.
+  STARTUPINFOA startup_info;
+  memset(&startup_info, 0, sizeof(STARTUPINFO));
+  startup_info.dwFlags = STARTF_USESTDHANDLES;
+  startup_info.hStdInput = ::GetStdHandle(STD_INPUT_HANDLE);
+  startup_info.hStdOutput = ::GetStdHandle(STD_OUTPUT_HANDLE);
+  startup_info.hStdError = ::GetStdHandle(STD_ERROR_HANDLE);
+
+  PROCESS_INFORMATION process_info;
+  GTEST_DEATH_TEST_CHECK_(::CreateProcessA(
+      executable_path,
+      const_cast<char*>(command_line.c_str()),
+      NULL,   // Retuned process handle is not inheritable.
+      NULL,   // Retuned thread handle is not inheritable.
+      TRUE,   // Child inherits all inheritable handles (for write_handle_).
+      0x0,    // Default creation flags.
+      NULL,   // Inherit the parent's environment.
+      UnitTest::GetInstance()->original_working_dir(),
+      &startup_info,
+      &process_info) != FALSE);
+  child_handle_.Reset(process_info.hProcess);
+  ::CloseHandle(process_info.hThread);
+  set_spawned(true);
+  return OVERSEE_TEST;
+}
+# else  // We are not on Windows.
+
+// ForkingDeathTest provides implementations for most of the abstract
+// methods of the DeathTest interface.  Only the AssumeRole method is
+// left undefined.
+class ForkingDeathTest : public DeathTestImpl {
+ public:
+  ForkingDeathTest(const char* statement, const RE* regex);
+
+  // All of these virtual functions are inherited from DeathTest.
+  virtual int Wait();
+
+ protected:
+  void set_child_pid(pid_t child_pid) { child_pid_ = child_pid; }
+
+ private:
+  // PID of child process during death test; 0 in the child process itself.
+  pid_t child_pid_;
+};
+
+// Constructs a ForkingDeathTest.
+ForkingDeathTest::ForkingDeathTest(const char* a_statement, const RE* a_regex)
+    : DeathTestImpl(a_statement, a_regex),
+      child_pid_(-1) {}
+
+// Waits for the child in a death test to exit, returning its exit
+// status, or 0 if no child process exists.  As a side effect, sets the
+// outcome data member.
+int ForkingDeathTest::Wait() {
+  if (!spawned())
+    return 0;
+
+  ReadAndInterpretStatusByte();
+
+  int status_value;
+  GTEST_DEATH_TEST_CHECK_SYSCALL_(waitpid(child_pid_, &status_value, 0));
+  set_status(status_value);
+  return status_value;
+}
+
+// A concrete death test class that forks, then immediately runs the test
+// in the child process.
+class NoExecDeathTest : public ForkingDeathTest {
+ public:
+  NoExecDeathTest(const char* a_statement, const RE* a_regex) :
+      ForkingDeathTest(a_statement, a_regex) { }
+  virtual TestRole AssumeRole();
+};
+
+// The AssumeRole process for a fork-and-run death test.  It implements a
+// straightforward fork, with a simple pipe to transmit the status byte.
+DeathTest::TestRole NoExecDeathTest::AssumeRole() {
+  const size_t thread_count = GetThreadCount();
+  if (thread_count != 1) {
+    GTEST_LOG_(WARNING) << DeathTestThreadWarning(thread_count);
+  }
+
+  int pipe_fd[2];
+  GTEST_DEATH_TEST_CHECK_(pipe(pipe_fd) != -1);
+
+  DeathTest::set_last_death_test_message("");
+  CaptureStderr();
+  // When we fork the process below, the log file buffers are copied, but the
+  // file descriptors are shared.  We flush all log files here so that closing
+  // the file descriptors in the child process doesn't throw off the
+  // synchronization between descriptors and buffers in the parent process.
+  // This is as close to the fork as possible to avoid a race condition in case
+  // there are multiple threads running before the death test, and another
+  // thread writes to the log file.
+  FlushInfoLog();
+
+  const pid_t child_pid = fork();
+  GTEST_DEATH_TEST_CHECK_(child_pid != -1);
+  set_child_pid(child_pid);
+  if (child_pid == 0) {
+    GTEST_DEATH_TEST_CHECK_SYSCALL_(close(pipe_fd[0]));
+    set_write_fd(pipe_fd[1]);
+    // Redirects all logging to stderr in the child process to prevent
+    // concurrent writes to the log files.  We capture stderr in the parent
+    // process and append the child process' output to a log.
+    LogToStderr();
+    // Event forwarding to the listeners of event listener API mush be shut
+    // down in death test subprocesses.
+    GetUnitTestImpl()->listeners()->SuppressEventForwarding();
+    g_in_fast_death_test_child = true;
+    return EXECUTE_TEST;
+  } else {
+    GTEST_DEATH_TEST_CHECK_SYSCALL_(close(pipe_fd[1]));
+    set_read_fd(pipe_fd[0]);
+    set_spawned(true);
+    return OVERSEE_TEST;
+  }
+}
+
+// A concrete death test class that forks and re-executes the main
+// program from the beginning, with command-line flags set that cause
+// only this specific death test to be run.
+class ExecDeathTest : public ForkingDeathTest {
+ public:
+  ExecDeathTest(const char* a_statement, const RE* a_regex,
+                const char* file, int line) :
+      ForkingDeathTest(a_statement, a_regex), file_(file), line_(line) { }
+  virtual TestRole AssumeRole();
+ private:
+  static ::std::vector<testing::internal::string>
+  GetArgvsForDeathTestChildProcess() {
+    ::std::vector<testing::internal::string> args = GetInjectableArgvs();
+    return args;
+  }
+  // The name of the file in which the death test is located.
+  const char* const file_;
+  // The line number on which the death test is located.
+  const int line_;
+};
+
+// Utility class for accumulating command-line arguments.
+class Arguments {
+ public:
+  Arguments() {
+    args_.push_back(NULL);
+  }
+
+  ~Arguments() {
+    for (std::vector<char*>::iterator i = args_.begin(); i != args_.end();
+         ++i) {
+      free(*i);
+    }
+  }
+  void AddArgument(const char* argument) {
+    args_.insert(args_.end() - 1, posix::StrDup(argument));
+  }
+
+  template <typename Str>
+  void AddArguments(const ::std::vector<Str>& arguments) {
+    for (typename ::std::vector<Str>::const_iterator i = arguments.begin();
+         i != arguments.end();
+         ++i) {
+      args_.insert(args_.end() - 1, posix::StrDup(i->c_str()));
+    }
+  }
+  char* const* Argv() {
+    return &args_[0];
+  }
+
+ private:
+  std::vector<char*> args_;
+};
+
+// A struct that encompasses the arguments to the child process of a
+// threadsafe-style death test process.
+struct ExecDeathTestArgs {
+  char* const* argv;  // Command-line arguments for the child's call to exec
+  int close_fd;       // File descriptor to close; the read end of a pipe
+};
+
+#  if GTEST_OS_MAC
+inline char** GetEnviron() {
+  // When Google Test is built as a framework on MacOS X, the environ variable
+  // is unavailable. Apple's documentation (man environ) recommends using
+  // _NSGetEnviron() instead.
+  return *_NSGetEnviron();
+}
+#  else
+// Some POSIX platforms expect you to declare environ. extern "C" makes
+// it reside in the global namespace.
+extern "C" char** environ;
+inline char** GetEnviron() { return environ; }
+#  endif  // GTEST_OS_MAC
+
+#  if !GTEST_OS_QNX
+// The main function for a threadsafe-style death test child process.
+// This function is called in a clone()-ed process and thus must avoid
+// any potentially unsafe operations like malloc or libc functions.
+static int ExecDeathTestChildMain(void* child_arg) {
+  ExecDeathTestArgs* const args = static_cast<ExecDeathTestArgs*>(child_arg);
+  GTEST_DEATH_TEST_CHECK_SYSCALL_(close(args->close_fd));
+
+  // We need to execute the test program in the same environment where
+  // it was originally invoked.  Therefore we change to the original
+  // working directory first.
+  const char* const original_dir =
+      UnitTest::GetInstance()->original_working_dir();
+  // We can safely call chdir() as it's a direct system call.
+  if (chdir(original_dir) != 0) {
+    DeathTestAbort(std::string("chdir(\"") + original_dir + "\") failed: " +
+                   GetLastErrnoDescription());
+    return EXIT_FAILURE;
+  }
+
+  // We can safely call execve() as it's a direct system call.  We
+  // cannot use execvp() as it's a libc function and thus potentially
+  // unsafe.  Since execve() doesn't search the PATH, the user must
+  // invoke the test program via a valid path that contains at least
+  // one path separator.
+  execve(args->argv[0], args->argv, GetEnviron());
+  DeathTestAbort(std::string("execve(") + args->argv[0] + ", ...) in " +
+                 original_dir + " failed: " +
+                 GetLastErrnoDescription());
+  return EXIT_FAILURE;
+}
+#  endif  // !GTEST_OS_QNX
+
+// Two utility routines that together determine the direction the stack
+// grows.
+// This could be accomplished more elegantly by a single recursive
+// function, but we want to guard against the unlikely possibility of
+// a smart compiler optimizing the recursion away.
+//
+// GTEST_NO_INLINE_ is required to prevent GCC 4.6 from inlining
+// StackLowerThanAddress into StackGrowsDown, which then doesn't give
+// correct answer.
+void StackLowerThanAddress(const void* ptr, bool* result) GTEST_NO_INLINE_;
+void StackLowerThanAddress(const void* ptr, bool* result) {
+  int dummy;
+  *result = (&dummy < ptr);
+}
+
+bool StackGrowsDown() {
+  int dummy;
+  bool result;
+  StackLowerThanAddress(&dummy, &result);
+  return result;
+}
+
+// Spawns a child process with the same executable as the current process in
+// a thread-safe manner and instructs it to run the death test.  The
+// implementation uses fork(2) + exec.  On systems where clone(2) is
+// available, it is used instead, being slightly more thread-safe.  On QNX,
+// fork supports only single-threaded environments, so this function uses
+// spawn(2) there instead.  The function dies with an error message if
+// anything goes wrong.
+static pid_t ExecDeathTestSpawnChild(char* const* argv, int close_fd) {
+  ExecDeathTestArgs args = { argv, close_fd };
+  pid_t child_pid = -1;
+
+#  if GTEST_OS_QNX
+  // Obtains the current directory and sets it to be closed in the child
+  // process.
+  const int cwd_fd = open(".", O_RDONLY);
+  GTEST_DEATH_TEST_CHECK_(cwd_fd != -1);
+  GTEST_DEATH_TEST_CHECK_SYSCALL_(fcntl(cwd_fd, F_SETFD, FD_CLOEXEC));
+  // We need to execute the test program in the same environment where
+  // it was originally invoked.  Therefore we change to the original
+  // working directory first.
+  const char* const original_dir =
+      UnitTest::GetInstance()->original_working_dir();
+  // We can safely call chdir() as it's a direct system call.
+  if (chdir(original_dir) != 0) {
+    DeathTestAbort(std::string("chdir(\"") + original_dir + "\") failed: " +
+                   GetLastErrnoDescription());
+    return EXIT_FAILURE;
+  }
+
+  int fd_flags;
+  // Set close_fd to be closed after spawn.
+  GTEST_DEATH_TEST_CHECK_SYSCALL_(fd_flags = fcntl(close_fd, F_GETFD));
+  GTEST_DEATH_TEST_CHECK_SYSCALL_(fcntl(close_fd, F_SETFD,
+                                        fd_flags | FD_CLOEXEC));
+  struct inheritance inherit = {0};
+  // spawn is a system call.
+  child_pid = spawn(args.argv[0], 0, NULL, &inherit, args.argv, GetEnviron());
+  // Restores the current working directory.
+  GTEST_DEATH_TEST_CHECK_(fchdir(cwd_fd) != -1);
+  GTEST_DEATH_TEST_CHECK_SYSCALL_(close(cwd_fd));
+
+#  else   // GTEST_OS_QNX
+#   if GTEST_OS_LINUX
+  // When a SIGPROF signal is received while fork() or clone() are executing,
+  // the process may hang. To avoid this, we ignore SIGPROF here and re-enable
+  // it after the call to fork()/clone() is complete.
+  struct sigaction saved_sigprof_action;
+  struct sigaction ignore_sigprof_action;
+  memset(&ignore_sigprof_action, 0, sizeof(ignore_sigprof_action));
+  sigemptyset(&ignore_sigprof_action.sa_mask);
+  ignore_sigprof_action.sa_handler = SIG_IGN;
+  GTEST_DEATH_TEST_CHECK_SYSCALL_(sigaction(
+      SIGPROF, &ignore_sigprof_action, &saved_sigprof_action));
+#   endif  // GTEST_OS_LINUX
+
+#   if GTEST_HAS_CLONE
+  const bool use_fork = GTEST_FLAG(death_test_use_fork);
+
+  if (!use_fork) {
+    static const bool stack_grows_down = StackGrowsDown();
+    const size_t stack_size = getpagesize();
+    // MMAP_ANONYMOUS is not defined on Mac, so we use MAP_ANON instead.
+    void* const stack = mmap(NULL, stack_size, PROT_READ | PROT_WRITE,
+                             MAP_ANON | MAP_PRIVATE, -1, 0);
+    GTEST_DEATH_TEST_CHECK_(stack != MAP_FAILED);
+
+    // Maximum stack alignment in bytes:  For a downward-growing stack, this
+    // amount is subtracted from size of the stack space to get an address
+    // that is within the stack space and is aligned on all systems we care
+    // about.  As far as I know there is no ABI with stack alignment greater
+    // than 64.  We assume stack and stack_size already have alignment of
+    // kMaxStackAlignment.
+    const size_t kMaxStackAlignment = 64;
+    void* const stack_top =
+        static_cast<char*>(stack) +
+            (stack_grows_down ? stack_size - kMaxStackAlignment : 0);
+    GTEST_DEATH_TEST_CHECK_(stack_size > kMaxStackAlignment &&
+        reinterpret_cast<intptr_t>(stack_top) % kMaxStackAlignment == 0);
+
+    child_pid = clone(&ExecDeathTestChildMain, stack_top, SIGCHLD, &args);
+
+    GTEST_DEATH_TEST_CHECK_(munmap(stack, stack_size) != -1);
+  }
+#   else
+  const bool use_fork = true;
+#   endif  // GTEST_HAS_CLONE
+
+  if (use_fork && (child_pid = fork()) == 0) {
+      ExecDeathTestChildMain(&args);
+      _exit(0);
+  }
+#  endif  // GTEST_OS_QNX
+#  if GTEST_OS_LINUX
+  GTEST_DEATH_TEST_CHECK_SYSCALL_(
+      sigaction(SIGPROF, &saved_sigprof_action, NULL));
+#  endif  // GTEST_OS_LINUX
+
+  GTEST_DEATH_TEST_CHECK_(child_pid != -1);
+  return child_pid;
+}
+
+// The AssumeRole process for a fork-and-exec death test.  It re-executes the
+// main program from the beginning, setting the --gtest_filter
+// and --gtest_internal_run_death_test flags to cause only the current
+// death test to be re-run.
+DeathTest::TestRole ExecDeathTest::AssumeRole() {
+  const UnitTestImpl* const impl = GetUnitTestImpl();
+  const InternalRunDeathTestFlag* const flag =
+      impl->internal_run_death_test_flag();
+  const TestInfo* const info = impl->current_test_info();
+  const int death_test_index = info->result()->death_test_count();
+
+  if (flag != NULL) {
+    set_write_fd(flag->write_fd());
+    return EXECUTE_TEST;
+  }
+
+  int pipe_fd[2];
+  GTEST_DEATH_TEST_CHECK_(pipe(pipe_fd) != -1);
+  // Clear the close-on-exec flag on the write end of the pipe, lest
+  // it be closed when the child process does an exec:
+  GTEST_DEATH_TEST_CHECK_(fcntl(pipe_fd[1], F_SETFD, 0) != -1);
+
+  const std::string filter_flag =
+      std::string("--") + GTEST_FLAG_PREFIX_ + kFilterFlag + "="
+      + info->test_case_name() + "." + info->name();
+  const std::string internal_flag =
+      std::string("--") + GTEST_FLAG_PREFIX_ + kInternalRunDeathTestFlag + "="
+      + file_ + "|" + StreamableToString(line_) + "|"
+      + StreamableToString(death_test_index) + "|"
+      + StreamableToString(pipe_fd[1]);
+  Arguments args;
+  args.AddArguments(GetArgvsForDeathTestChildProcess());
+  args.AddArgument(filter_flag.c_str());
+  args.AddArgument(internal_flag.c_str());
+
+  DeathTest::set_last_death_test_message("");
+
+  CaptureStderr();
+  // See the comment in NoExecDeathTest::AssumeRole for why the next line
+  // is necessary.
+  FlushInfoLog();
+
+  const pid_t child_pid = ExecDeathTestSpawnChild(args.Argv(), pipe_fd[0]);
+  GTEST_DEATH_TEST_CHECK_SYSCALL_(close(pipe_fd[1]));
+  set_child_pid(child_pid);
+  set_read_fd(pipe_fd[0]);
+  set_spawned(true);
+  return OVERSEE_TEST;
+}
+
+# endif  // !GTEST_OS_WINDOWS
+
+// Creates a concrete DeathTest-derived class that depends on the
+// --gtest_death_test_style flag, and sets the pointer pointed to
+// by the "test" argument to its address.  If the test should be
+// skipped, sets that pointer to NULL.  Returns true, unless the
+// flag is set to an invalid value.
+bool DefaultDeathTestFactory::Create(const char* statement, const RE* regex,
+                                     const char* file, int line,
+                                     DeathTest** test) {
+  UnitTestImpl* const impl = GetUnitTestImpl();
+  const InternalRunDeathTestFlag* const flag =
+      impl->internal_run_death_test_flag();
+  const int death_test_index = impl->current_test_info()
+      ->increment_death_test_count();
+
+  if (flag != NULL) {
+    if (death_test_index > flag->index()) {
+      DeathTest::set_last_death_test_message(
+          "Death test count (" + StreamableToString(death_test_index)
+          + ") somehow exceeded expected maximum ("
+          + StreamableToString(flag->index()) + ")");
+      return false;
+    }
+
+    if (!(flag->file() == file && flag->line() == line &&
+          flag->index() == death_test_index)) {
+      *test = NULL;
+      return true;
+    }
+  }
+
+# if GTEST_OS_WINDOWS
+
+  if (GTEST_FLAG(death_test_style) == "threadsafe" ||
+      GTEST_FLAG(death_test_style) == "fast") {
+    *test = new WindowsDeathTest(statement, regex, file, line);
+  }
+
+# else
+
+  if (GTEST_FLAG(death_test_style) == "threadsafe") {
+    *test = new ExecDeathTest(statement, regex, file, line);
+  } else if (GTEST_FLAG(death_test_style) == "fast") {
+    *test = new NoExecDeathTest(statement, regex);
+  }
+
+# endif  // GTEST_OS_WINDOWS
+
+  else {  // NOLINT - this is more readable than unbalanced brackets inside #if.
+    DeathTest::set_last_death_test_message(
+        "Unknown death test style \"" + GTEST_FLAG(death_test_style)
+        + "\" encountered");
+    return false;
+  }
+
+  return true;
+}
+
+// Splits a given string on a given delimiter, populating a given
+// vector with the fields.  GTEST_HAS_DEATH_TEST implies that we have
+// ::std::string, so we can use it here.
+static void SplitString(const ::std::string& str, char delimiter,
+                        ::std::vector< ::std::string>* dest) {
+  ::std::vector< ::std::string> parsed;
+  ::std::string::size_type pos = 0;
+  while (::testing::internal::AlwaysTrue()) {
+    const ::std::string::size_type colon = str.find(delimiter, pos);
+    if (colon == ::std::string::npos) {
+      parsed.push_back(str.substr(pos));
+      break;
+    } else {
+      parsed.push_back(str.substr(pos, colon - pos));
+      pos = colon + 1;
+    }
+  }
+  dest->swap(parsed);
+}
+
+# if GTEST_OS_WINDOWS
+// Recreates the pipe and event handles from the provided parameters,
+// signals the event, and returns a file descriptor wrapped around the pipe
+// handle. This function is called in the child process only.
+int GetStatusFileDescriptor(unsigned int parent_process_id,
+                            size_t write_handle_as_size_t,
+                            size_t event_handle_as_size_t) {
+  AutoHandle parent_process_handle(::OpenProcess(PROCESS_DUP_HANDLE,
+                                                   FALSE,  // Non-inheritable.
+                                                   parent_process_id));
+  if (parent_process_handle.Get() == INVALID_HANDLE_VALUE) {
+    DeathTestAbort("Unable to open parent process " +
+                   StreamableToString(parent_process_id));
+  }
+
+  // TODO(vladl at google.com): Replace the following check with a
+  // compile-time assertion when available.
+  GTEST_CHECK_(sizeof(HANDLE) <= sizeof(size_t));
+
+  const HANDLE write_handle =
+      reinterpret_cast<HANDLE>(write_handle_as_size_t);
+  HANDLE dup_write_handle;
+
+  // The newly initialized handle is accessible only in in the parent
+  // process. To obtain one accessible within the child, we need to use
+  // DuplicateHandle.
+  if (!::DuplicateHandle(parent_process_handle.Get(), write_handle,
+                         ::GetCurrentProcess(), &dup_write_handle,
+                         0x0,    // Requested privileges ignored since
+                                 // DUPLICATE_SAME_ACCESS is used.
+                         FALSE,  // Request non-inheritable handler.
+                         DUPLICATE_SAME_ACCESS)) {
+    DeathTestAbort("Unable to duplicate the pipe handle " +
+                   StreamableToString(write_handle_as_size_t) +
+                   " from the parent process " +
+                   StreamableToString(parent_process_id));
+  }
+
+  const HANDLE event_handle = reinterpret_cast<HANDLE>(event_handle_as_size_t);
+  HANDLE dup_event_handle;
+
+  if (!::DuplicateHandle(parent_process_handle.Get(), event_handle,
+                         ::GetCurrentProcess(), &dup_event_handle,
+                         0x0,
+                         FALSE,
+                         DUPLICATE_SAME_ACCESS)) {
+    DeathTestAbort("Unable to duplicate the event handle " +
+                   StreamableToString(event_handle_as_size_t) +
+                   " from the parent process " +
+                   StreamableToString(parent_process_id));
+  }
+
+  const int write_fd =
+      ::_open_osfhandle(reinterpret_cast<intptr_t>(dup_write_handle), O_APPEND);
+  if (write_fd == -1) {
+    DeathTestAbort("Unable to convert pipe handle " +
+                   StreamableToString(write_handle_as_size_t) +
+                   " to a file descriptor");
+  }
+
+  // Signals the parent that the write end of the pipe has been acquired
+  // so the parent can release its own write end.
+  ::SetEvent(dup_event_handle);
+
+  return write_fd;
+}
+# endif  // GTEST_OS_WINDOWS
+
+// Returns a newly created InternalRunDeathTestFlag object with fields
+// initialized from the GTEST_FLAG(internal_run_death_test) flag if
+// the flag is specified; otherwise returns NULL.
+InternalRunDeathTestFlag* ParseInternalRunDeathTestFlag() {
+  if (GTEST_FLAG(internal_run_death_test) == "") return NULL;
+
+  // GTEST_HAS_DEATH_TEST implies that we have ::std::string, so we
+  // can use it here.
+  int line = -1;
+  int index = -1;
+  ::std::vector< ::std::string> fields;
+  SplitString(GTEST_FLAG(internal_run_death_test).c_str(), '|', &fields);
+  int write_fd = -1;
+
+# if GTEST_OS_WINDOWS
+
+  unsigned int parent_process_id = 0;
+  size_t write_handle_as_size_t = 0;
+  size_t event_handle_as_size_t = 0;
+
+  if (fields.size() != 6
+      || !ParseNaturalNumber(fields[1], &line)
+      || !ParseNaturalNumber(fields[2], &index)
+      || !ParseNaturalNumber(fields[3], &parent_process_id)
+      || !ParseNaturalNumber(fields[4], &write_handle_as_size_t)
+      || !ParseNaturalNumber(fields[5], &event_handle_as_size_t)) {
+    DeathTestAbort("Bad --gtest_internal_run_death_test flag: " +
+                   GTEST_FLAG(internal_run_death_test));
+  }
+  write_fd = GetStatusFileDescriptor(parent_process_id,
+                                     write_handle_as_size_t,
+                                     event_handle_as_size_t);
+# else
+
+  if (fields.size() != 4
+      || !ParseNaturalNumber(fields[1], &line)
+      || !ParseNaturalNumber(fields[2], &index)
+      || !ParseNaturalNumber(fields[3], &write_fd)) {
+    DeathTestAbort("Bad --gtest_internal_run_death_test flag: "
+        + GTEST_FLAG(internal_run_death_test));
+  }
+
+# endif  // GTEST_OS_WINDOWS
+
+  return new InternalRunDeathTestFlag(fields[0], line, index, write_fd);
+}
+
+}  // namespace internal
+
+#endif  // GTEST_HAS_DEATH_TEST
+
+}  // namespace testing
+// Copyright 2008, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Authors: keith.ray at gmail.com (Keith Ray)
+
+
+#include <stdlib.h>
+
+#if GTEST_OS_WINDOWS_MOBILE
+# include <windows.h>
+#elif GTEST_OS_WINDOWS
+# include <direct.h>
+# include <io.h>
+#elif GTEST_OS_SYMBIAN
+// Symbian OpenC has PATH_MAX in sys/syslimits.h
+# include <sys/syslimits.h>
+#else
+# include <limits.h>
+# include <climits>  // Some Linux distributions define PATH_MAX here.
+#endif  // GTEST_OS_WINDOWS_MOBILE
+
+#if GTEST_OS_WINDOWS
+# define GTEST_PATH_MAX_ _MAX_PATH
+#elif defined(PATH_MAX)
+# define GTEST_PATH_MAX_ PATH_MAX
+#elif defined(_XOPEN_PATH_MAX)
+# define GTEST_PATH_MAX_ _XOPEN_PATH_MAX
+#else
+# define GTEST_PATH_MAX_ _POSIX_PATH_MAX
+#endif  // GTEST_OS_WINDOWS
+
+
+namespace testing {
+namespace internal {
+
+#if GTEST_OS_WINDOWS
+// On Windows, '\\' is the standard path separator, but many tools and the
+// Windows API also accept '/' as an alternate path separator. Unless otherwise
+// noted, a file path can contain either kind of path separators, or a mixture
+// of them.
+const char kPathSeparator = '\\';
+const char kAlternatePathSeparator = '/';
+const char kPathSeparatorString[] = "\\";
+const char kAlternatePathSeparatorString[] = "/";
+# if GTEST_OS_WINDOWS_MOBILE
+// Windows CE doesn't have a current directory. You should not use
+// the current directory in tests on Windows CE, but this at least
+// provides a reasonable fallback.
+const char kCurrentDirectoryString[] = "\\";
+// Windows CE doesn't define INVALID_FILE_ATTRIBUTES
+const DWORD kInvalidFileAttributes = 0xffffffff;
+# else
+const char kCurrentDirectoryString[] = ".\\";
+# endif  // GTEST_OS_WINDOWS_MOBILE
+#else
+const char kPathSeparator = '/';
+const char kPathSeparatorString[] = "/";
+const char kCurrentDirectoryString[] = "./";
+#endif  // GTEST_OS_WINDOWS
+
+// Returns whether the given character is a valid path separator.
+static bool IsPathSeparator(char c) {
+#if GTEST_HAS_ALT_PATH_SEP_
+  return (c == kPathSeparator) || (c == kAlternatePathSeparator);
+#else
+  return c == kPathSeparator;
+#endif
+}
+
+// Returns the current working directory, or "" if unsuccessful.
+FilePath FilePath::GetCurrentDir() {
+#if GTEST_OS_WINDOWS_MOBILE
+  // Windows CE doesn't have a current directory, so we just return
+  // something reasonable.
+  return FilePath(kCurrentDirectoryString);
+#elif GTEST_OS_WINDOWS
+  char cwd[GTEST_PATH_MAX_ + 1] = { '\0' };
+  return FilePath(_getcwd(cwd, sizeof(cwd)) == NULL ? "" : cwd);
+#else
+  char cwd[GTEST_PATH_MAX_ + 1] = { '\0' };
+  return FilePath(getcwd(cwd, sizeof(cwd)) == NULL ? "" : cwd);
+#endif  // GTEST_OS_WINDOWS_MOBILE
+}
+
+// Returns a copy of the FilePath with the case-insensitive extension removed.
+// Example: FilePath("dir/file.exe").RemoveExtension("EXE") returns
+// FilePath("dir/file"). If a case-insensitive extension is not
+// found, returns a copy of the original FilePath.
+FilePath FilePath::RemoveExtension(const char* extension) const {
+  const std::string dot_extension = std::string(".") + extension;
+  if (String::EndsWithCaseInsensitive(pathname_, dot_extension)) {
+    return FilePath(pathname_.substr(
+        0, pathname_.length() - dot_extension.length()));
+  }
+  return *this;
+}
+
+// Returns a pointer to the last occurence of a valid path separator in
+// the FilePath. On Windows, for example, both '/' and '\' are valid path
+// separators. Returns NULL if no path separator was found.
+const char* FilePath::FindLastPathSeparator() const {
+  const char* const last_sep = strrchr(c_str(), kPathSeparator);
+#if GTEST_HAS_ALT_PATH_SEP_
+  const char* const last_alt_sep = strrchr(c_str(), kAlternatePathSeparator);
+  // Comparing two pointers of which only one is NULL is undefined.
+  if (last_alt_sep != NULL &&
+      (last_sep == NULL || last_alt_sep > last_sep)) {
+    return last_alt_sep;
+  }
+#endif
+  return last_sep;
+}
+
+// Returns a copy of the FilePath with the directory part removed.
+// Example: FilePath("path/to/file").RemoveDirectoryName() returns
+// FilePath("file"). If there is no directory part ("just_a_file"), it returns
+// the FilePath unmodified. If there is no file part ("just_a_dir/") it
+// returns an empty FilePath ("").
+// On Windows platform, '\' is the path separator, otherwise it is '/'.
+FilePath FilePath::RemoveDirectoryName() const {
+  const char* const last_sep = FindLastPathSeparator();
+  return last_sep ? FilePath(last_sep + 1) : *this;
+}
+
+// RemoveFileName returns the directory path with the filename removed.
+// Example: FilePath("path/to/file").RemoveFileName() returns "path/to/".
+// If the FilePath is "a_file" or "/a_file", RemoveFileName returns
+// FilePath("./") or, on Windows, FilePath(".\\"). If the filepath does
+// not have a file, like "just/a/dir/", it returns the FilePath unmodified.
+// On Windows platform, '\' is the path separator, otherwise it is '/'.
+FilePath FilePath::RemoveFileName() const {
+  const char* const last_sep = FindLastPathSeparator();
+  std::string dir;
+  if (last_sep) {
+    dir = std::string(c_str(), last_sep + 1 - c_str());
+  } else {
+    dir = kCurrentDirectoryString;
+  }
+  return FilePath(dir);
+}
+
+// Helper functions for naming files in a directory for xml output.
+
+// Given directory = "dir", base_name = "test", number = 0,
+// extension = "xml", returns "dir/test.xml". If number is greater
+// than zero (e.g., 12), returns "dir/test_12.xml".
+// On Windows platform, uses \ as the separator rather than /.
+FilePath FilePath::MakeFileName(const FilePath& directory,
+                                const FilePath& base_name,
+                                int number,
+                                const char* extension) {
+  std::string file;
+  if (number == 0) {
+    file = base_name.string() + "." + extension;
+  } else {
+    file = base_name.string() + "_" + StreamableToString(number)
+        + "." + extension;
+  }
+  return ConcatPaths(directory, FilePath(file));
+}
+
+// Given directory = "dir", relative_path = "test.xml", returns "dir/test.xml".
+// On Windows, uses \ as the separator rather than /.
+FilePath FilePath::ConcatPaths(const FilePath& directory,
+                               const FilePath& relative_path) {
+  if (directory.IsEmpty())
+    return relative_path;
+  const FilePath dir(directory.RemoveTrailingPathSeparator());
+  return FilePath(dir.string() + kPathSeparator + relative_path.string());
+}
+
+// Returns true if pathname describes something findable in the file-system,
+// either a file, directory, or whatever.
+bool FilePath::FileOrDirectoryExists() const {
+#if GTEST_OS_WINDOWS_MOBILE
+  LPCWSTR unicode = String::AnsiToUtf16(pathname_.c_str());
+  const DWORD attributes = GetFileAttributes(unicode);
+  delete [] unicode;
+  return attributes != kInvalidFileAttributes;
+#else
+  posix::StatStruct file_stat;
+  return posix::Stat(pathname_.c_str(), &file_stat) == 0;
+#endif  // GTEST_OS_WINDOWS_MOBILE
+}
+
+// Returns true if pathname describes a directory in the file-system
+// that exists.
+bool FilePath::DirectoryExists() const {
+  bool result = false;
+#if GTEST_OS_WINDOWS
+  // Don't strip off trailing separator if path is a root directory on
+  // Windows (like "C:\\").
+  const FilePath& path(IsRootDirectory() ? *this :
+                                           RemoveTrailingPathSeparator());
+#else
+  const FilePath& path(*this);
+#endif
+
+#if GTEST_OS_WINDOWS_MOBILE
+  LPCWSTR unicode = String::AnsiToUtf16(path.c_str());
+  const DWORD attributes = GetFileAttributes(unicode);
+  delete [] unicode;
+  if ((attributes != kInvalidFileAttributes) &&
+      (attributes & FILE_ATTRIBUTE_DIRECTORY)) {
+    result = true;
+  }
+#else
+  posix::StatStruct file_stat;
+  result = posix::Stat(path.c_str(), &file_stat) == 0 &&
+      posix::IsDir(file_stat);
+#endif  // GTEST_OS_WINDOWS_MOBILE
+
+  return result;
+}
+
+// Returns true if pathname describes a root directory. (Windows has one
+// root directory per disk drive.)
+bool FilePath::IsRootDirectory() const {
+#if GTEST_OS_WINDOWS
+  // TODO(wan at google.com): on Windows a network share like
+  // \\server\share can be a root directory, although it cannot be the
+  // current directory.  Handle this properly.
+  return pathname_.length() == 3 && IsAbsolutePath();
+#else
+  return pathname_.length() == 1 && IsPathSeparator(pathname_.c_str()[0]);
+#endif
+}
+
+// Returns true if pathname describes an absolute path.
+bool FilePath::IsAbsolutePath() const {
+  const char* const name = pathname_.c_str();
+#if GTEST_OS_WINDOWS
+  return pathname_.length() >= 3 &&
+     ((name[0] >= 'a' && name[0] <= 'z') ||
+      (name[0] >= 'A' && name[0] <= 'Z')) &&
+     name[1] == ':' &&
+     IsPathSeparator(name[2]);
+#else
+  return IsPathSeparator(name[0]);
+#endif
+}
+
+// Returns a pathname for a file that does not currently exist. The pathname
+// will be directory/base_name.extension or
+// directory/base_name_<number>.extension if directory/base_name.extension
+// already exists. The number will be incremented until a pathname is found
+// that does not already exist.
+// Examples: 'dir/foo_test.xml' or 'dir/foo_test_1.xml'.
+// There could be a race condition if two or more processes are calling this
+// function at the same time -- they could both pick the same filename.
+FilePath FilePath::GenerateUniqueFileName(const FilePath& directory,
+                                          const FilePath& base_name,
+                                          const char* extension) {
+  FilePath full_pathname;
+  int number = 0;
+  do {
+    full_pathname.Set(MakeFileName(directory, base_name, number++, extension));
+  } while (full_pathname.FileOrDirectoryExists());
+  return full_pathname;
+}
+
+// Returns true if FilePath ends with a path separator, which indicates that
+// it is intended to represent a directory. Returns false otherwise.
+// This does NOT check that a directory (or file) actually exists.
+bool FilePath::IsDirectory() const {
+  return !pathname_.empty() &&
+         IsPathSeparator(pathname_.c_str()[pathname_.length() - 1]);
+}
+
+// Create directories so that path exists. Returns true if successful or if
+// the directories already exist; returns false if unable to create directories
+// for any reason.
+bool FilePath::CreateDirectoriesRecursively() const {
+  if (!this->IsDirectory()) {
+    return false;
+  }
+
+  if (pathname_.length() == 0 || this->DirectoryExists()) {
+    return true;
+  }
+
+  const FilePath parent(this->RemoveTrailingPathSeparator().RemoveFileName());
+  return parent.CreateDirectoriesRecursively() && this->CreateFolder();
+}
+
+// Create the directory so that path exists. Returns true if successful or
+// if the directory already exists; returns false if unable to create the
+// directory for any reason, including if the parent directory does not
+// exist. Not named "CreateDirectory" because that's a macro on Windows.
+bool FilePath::CreateFolder() const {
+#if GTEST_OS_WINDOWS_MOBILE
+  FilePath removed_sep(this->RemoveTrailingPathSeparator());
+  LPCWSTR unicode = String::AnsiToUtf16(removed_sep.c_str());
+  int result = CreateDirectory(unicode, NULL) ? 0 : -1;
+  delete [] unicode;
+#elif GTEST_OS_WINDOWS
+  int result = _mkdir(pathname_.c_str());
+#else
+  int result = mkdir(pathname_.c_str(), 0777);
+#endif  // GTEST_OS_WINDOWS_MOBILE
+
+  if (result == -1) {
+    return this->DirectoryExists();  // An error is OK if the directory exists.
+  }
+  return true;  // No error.
+}
+
+// If input name has a trailing separator character, remove it and return the
+// name, otherwise return the name string unmodified.
+// On Windows platform, uses \ as the separator, other platforms use /.
+FilePath FilePath::RemoveTrailingPathSeparator() const {
+  return IsDirectory()
+      ? FilePath(pathname_.substr(0, pathname_.length() - 1))
+      : *this;
+}
+
+// Removes any redundant separators that might be in the pathname.
+// For example, "bar///foo" becomes "bar/foo". Does not eliminate other
+// redundancies that might be in a pathname involving "." or "..".
+// TODO(wan at google.com): handle Windows network shares (e.g. \\server\share).
+void FilePath::Normalize() {
+  if (pathname_.c_str() == NULL) {
+    pathname_ = "";
+    return;
+  }
+  const char* src = pathname_.c_str();
+  char* const dest = new char[pathname_.length() + 1];
+  char* dest_ptr = dest;
+  memset(dest_ptr, 0, pathname_.length() + 1);
+
+  while (*src != '\0') {
+    *dest_ptr = *src;
+    if (!IsPathSeparator(*src)) {
+      src++;
+    } else {
+#if GTEST_HAS_ALT_PATH_SEP_
+      if (*dest_ptr == kAlternatePathSeparator) {
+        *dest_ptr = kPathSeparator;
+      }
+#endif
+      while (IsPathSeparator(*src))
+        src++;
+    }
+    dest_ptr++;
+  }
+  *dest_ptr = '\0';
+  pathname_ = dest;
+  delete[] dest;
+}
+
+}  // namespace internal
+}  // namespace testing
+// Copyright 2008, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+
+
+#include <limits.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+#if GTEST_OS_WINDOWS_MOBILE
+# include <windows.h>  // For TerminateProcess()
+#elif GTEST_OS_WINDOWS
+# include <io.h>
+# include <sys/stat.h>
+#else
+# include <unistd.h>
+#endif  // GTEST_OS_WINDOWS_MOBILE
+
+#if GTEST_OS_MAC
+# include <mach/mach_init.h>
+# include <mach/task.h>
+# include <mach/vm_map.h>
+#endif  // GTEST_OS_MAC
+
+#if GTEST_OS_QNX
+# include <devctl.h>
+# include <sys/procfs.h>
+#endif  // GTEST_OS_QNX
+
+
+// Indicates that this translation unit is part of Google Test's
+// implementation.  It must come before gtest-internal-inl.h is
+// included, or there will be a compiler error.  This trick is to
+// prevent a user from accidentally including gtest-internal-inl.h in
+// his code.
+#define GTEST_IMPLEMENTATION_ 1
+#undef GTEST_IMPLEMENTATION_
+
+namespace testing {
+namespace internal {
+
+#if defined(_MSC_VER) || defined(__BORLANDC__)
+// MSVC and C++Builder do not provide a definition of STDERR_FILENO.
+const int kStdOutFileno = 1;
+const int kStdErrFileno = 2;
+#else
+const int kStdOutFileno = STDOUT_FILENO;
+const int kStdErrFileno = STDERR_FILENO;
+#endif  // _MSC_VER
+
+#if GTEST_OS_MAC
+
+// Returns the number of threads running in the process, or 0 to indicate that
+// we cannot detect it.
+size_t GetThreadCount() {
+  const task_t task = mach_task_self();
+  mach_msg_type_number_t thread_count;
+  thread_act_array_t thread_list;
+  const kern_return_t status = task_threads(task, &thread_list, &thread_count);
+  if (status == KERN_SUCCESS) {
+    // task_threads allocates resources in thread_list and we need to free them
+    // to avoid leaks.
+    vm_deallocate(task,
+                  reinterpret_cast<vm_address_t>(thread_list),
+                  sizeof(thread_t) * thread_count);
+    return static_cast<size_t>(thread_count);
+  } else {
+    return 0;
+  }
+}
+
+#elif GTEST_OS_QNX
+
+// Returns the number of threads running in the process, or 0 to indicate that
+// we cannot detect it.
+size_t GetThreadCount() {
+  const int fd = open("/proc/self/as", O_RDONLY);
+  if (fd < 0) {
+    return 0;
+  }
+  procfs_info process_info;
+  const int status =
+      devctl(fd, DCMD_PROC_INFO, &process_info, sizeof(process_info), NULL);
+  close(fd);
+  if (status == EOK) {
+    return static_cast<size_t>(process_info.num_threads);
+  } else {
+    return 0;
+  }
+}
+
+#else
+
+size_t GetThreadCount() {
+  // There's no portable way to detect the number of threads, so we just
+  // return 0 to indicate that we cannot detect it.
+  return 0;
+}
+
+#endif  // GTEST_OS_MAC
+
+#if GTEST_USES_POSIX_RE
+
+// Implements RE.  Currently only needed for death tests.
+
+RE::~RE() {
+  if (is_valid_) {
+    // regfree'ing an invalid regex might crash because the content
+    // of the regex is undefined. Since the regex's are essentially
+    // the same, one cannot be valid (or invalid) without the other
+    // being so too.
+    regfree(&partial_regex_);
+    regfree(&full_regex_);
+  }
+  free(const_cast<char*>(pattern_));
+}
+
+// Returns true iff regular expression re matches the entire str.
+bool RE::FullMatch(const char* str, const RE& re) {
+  if (!re.is_valid_) return false;
+
+  regmatch_t match;
+  return regexec(&re.full_regex_, str, 1, &match, 0) == 0;
+}
+
+// Returns true iff regular expression re matches a substring of str
+// (including str itself).
+bool RE::PartialMatch(const char* str, const RE& re) {
+  if (!re.is_valid_) return false;
+
+  regmatch_t match;
+  return regexec(&re.partial_regex_, str, 1, &match, 0) == 0;
+}
+
+// Initializes an RE from its string representation.
+void RE::Init(const char* regex) {
+  pattern_ = posix::StrDup(regex);
+
+  // Reserves enough bytes to hold the regular expression used for a
+  // full match.
+  const size_t full_regex_len = strlen(regex) + 10;
+  char* const full_pattern = new char[full_regex_len];
+
+  snprintf(full_pattern, full_regex_len, "^(%s)$", regex);
+  is_valid_ = regcomp(&full_regex_, full_pattern, REG_EXTENDED) == 0;
+  // We want to call regcomp(&partial_regex_, ...) even if the
+  // previous expression returns false.  Otherwise partial_regex_ may
+  // not be properly initialized can may cause trouble when it's
+  // freed.
+  //
+  // Some implementation of POSIX regex (e.g. on at least some
+  // versions of Cygwin) doesn't accept the empty string as a valid
+  // regex.  We change it to an equivalent form "()" to be safe.
+  if (is_valid_) {
+    const char* const partial_regex = (*regex == '\0') ? "()" : regex;
+    is_valid_ = regcomp(&partial_regex_, partial_regex, REG_EXTENDED) == 0;
+  }
+  EXPECT_TRUE(is_valid_)
+      << "Regular expression \"" << regex
+      << "\" is not a valid POSIX Extended regular expression.";
+
+  delete[] full_pattern;
+}
+
+#elif GTEST_USES_SIMPLE_RE
+
+// Returns true iff ch appears anywhere in str (excluding the
+// terminating '\0' character).
+bool IsInSet(char ch, const char* str) {
+  return ch != '\0' && strchr(str, ch) != NULL;
+}
+
+// Returns true iff ch belongs to the given classification.  Unlike
+// similar functions in <ctype.h>, these aren't affected by the
+// current locale.
+bool IsAsciiDigit(char ch) { return '0' <= ch && ch <= '9'; }
+bool IsAsciiPunct(char ch) {
+  return IsInSet(ch, "^-!\"#$%&'()*+,./:;<=>?@[\\]_`{|}~");
+}
+bool IsRepeat(char ch) { return IsInSet(ch, "?*+"); }
+bool IsAsciiWhiteSpace(char ch) { return IsInSet(ch, " \f\n\r\t\v"); }
+bool IsAsciiWordChar(char ch) {
+  return ('a' <= ch && ch <= 'z') || ('A' <= ch && ch <= 'Z') ||
+      ('0' <= ch && ch <= '9') || ch == '_';
+}
+
+// Returns true iff "\\c" is a supported escape sequence.
+bool IsValidEscape(char c) {
+  return (IsAsciiPunct(c) || IsInSet(c, "dDfnrsStvwW"));
+}
+
+// Returns true iff the given atom (specified by escaped and pattern)
+// matches ch.  The result is undefined if the atom is invalid.
+bool AtomMatchesChar(bool escaped, char pattern_char, char ch) {
+  if (escaped) {  // "\\p" where p is pattern_char.
+    switch (pattern_char) {
+      case 'd': return IsAsciiDigit(ch);
+      case 'D': return !IsAsciiDigit(ch);
+      case 'f': return ch == '\f';
+      case 'n': return ch == '\n';
+      case 'r': return ch == '\r';
+      case 's': return IsAsciiWhiteSpace(ch);
+      case 'S': return !IsAsciiWhiteSpace(ch);
+      case 't': return ch == '\t';
+      case 'v': return ch == '\v';
+      case 'w': return IsAsciiWordChar(ch);
+      case 'W': return !IsAsciiWordChar(ch);
+    }
+    return IsAsciiPunct(pattern_char) && pattern_char == ch;
+  }
+
+  return (pattern_char == '.' && ch != '\n') || pattern_char == ch;
+}
+
+// Helper function used by ValidateRegex() to format error messages.
+std::string FormatRegexSyntaxError(const char* regex, int index) {
+  return (Message() << "Syntax error at index " << index
+          << " in simple regular expression \"" << regex << "\": ").GetString();
+}
+
+// Generates non-fatal failures and returns false if regex is invalid;
+// otherwise returns true.
+bool ValidateRegex(const char* regex) {
+  if (regex == NULL) {
+    // TODO(wan at google.com): fix the source file location in the
+    // assertion failures to match where the regex is used in user
+    // code.
+    ADD_FAILURE() << "NULL is not a valid simple regular expression.";
+    return false;
+  }
+
+  bool is_valid = true;
+
+  // True iff ?, *, or + can follow the previous atom.
+  bool prev_repeatable = false;
+  for (int i = 0; regex[i]; i++) {
+    if (regex[i] == '\\') {  // An escape sequence
+      i++;
+      if (regex[i] == '\0') {
+        ADD_FAILURE() << FormatRegexSyntaxError(regex, i - 1)
+                      << "'\\' cannot appear at the end.";
+        return false;
+      }
+
+      if (!IsValidEscape(regex[i])) {
+        ADD_FAILURE() << FormatRegexSyntaxError(regex, i - 1)
+                      << "invalid escape sequence \"\\" << regex[i] << "\".";
+        is_valid = false;
+      }
+      prev_repeatable = true;
+    } else {  // Not an escape sequence.
+      const char ch = regex[i];
+
+      if (ch == '^' && i > 0) {
+        ADD_FAILURE() << FormatRegexSyntaxError(regex, i)
+                      << "'^' can only appear at the beginning.";
+        is_valid = false;
+      } else if (ch == '$' && regex[i + 1] != '\0') {
+        ADD_FAILURE() << FormatRegexSyntaxError(regex, i)
+                      << "'$' can only appear at the end.";
+        is_valid = false;
+      } else if (IsInSet(ch, "()[]{}|")) {
+        ADD_FAILURE() << FormatRegexSyntaxError(regex, i)
+                      << "'" << ch << "' is unsupported.";
+        is_valid = false;
+      } else if (IsRepeat(ch) && !prev_repeatable) {
+        ADD_FAILURE() << FormatRegexSyntaxError(regex, i)
+                      << "'" << ch << "' can only follow a repeatable token.";
+        is_valid = false;
+      }
+
+      prev_repeatable = !IsInSet(ch, "^$?*+");
+    }
+  }
+
+  return is_valid;
+}
+
+// Matches a repeated regex atom followed by a valid simple regular
+// expression.  The regex atom is defined as c if escaped is false,
+// or \c otherwise.  repeat is the repetition meta character (?, *,
+// or +).  The behavior is undefined if str contains too many
+// characters to be indexable by size_t, in which case the test will
+// probably time out anyway.  We are fine with this limitation as
+// std::string has it too.
+bool MatchRepetitionAndRegexAtHead(
+    bool escaped, char c, char repeat, const char* regex,
+    const char* str) {
+  const size_t min_count = (repeat == '+') ? 1 : 0;
+  const size_t max_count = (repeat == '?') ? 1 :
+      static_cast<size_t>(-1) - 1;
+  // We cannot call numeric_limits::max() as it conflicts with the
+  // max() macro on Windows.
+
+  for (size_t i = 0; i <= max_count; ++i) {
+    // We know that the atom matches each of the first i characters in str.
+    if (i >= min_count && MatchRegexAtHead(regex, str + i)) {
+      // We have enough matches at the head, and the tail matches too.
+      // Since we only care about *whether* the pattern matches str
+      // (as opposed to *how* it matches), there is no need to find a
+      // greedy match.
+      return true;
+    }
+    if (str[i] == '\0' || !AtomMatchesChar(escaped, c, str[i]))
+      return false;
+  }
+  return false;
+}
+
+// Returns true iff regex matches a prefix of str.  regex must be a
+// valid simple regular expression and not start with "^", or the
+// result is undefined.
+bool MatchRegexAtHead(const char* regex, const char* str) {
+  if (*regex == '\0')  // An empty regex matches a prefix of anything.
+    return true;
+
+  // "$" only matches the end of a string.  Note that regex being
+  // valid guarantees that there's nothing after "$" in it.
+  if (*regex == '$')
+    return *str == '\0';
+
+  // Is the first thing in regex an escape sequence?
+  const bool escaped = *regex == '\\';
+  if (escaped)
+    ++regex;
+  if (IsRepeat(regex[1])) {
+    // MatchRepetitionAndRegexAtHead() calls MatchRegexAtHead(), so
+    // here's an indirect recursion.  It terminates as the regex gets
+    // shorter in each recursion.
+    return MatchRepetitionAndRegexAtHead(
+        escaped, regex[0], regex[1], regex + 2, str);
+  } else {
+    // regex isn't empty, isn't "$", and doesn't start with a
+    // repetition.  We match the first atom of regex with the first
+    // character of str and recurse.
+    return (*str != '\0') && AtomMatchesChar(escaped, *regex, *str) &&
+        MatchRegexAtHead(regex + 1, str + 1);
+  }
+}
+
+// Returns true iff regex matches any substring of str.  regex must be
+// a valid simple regular expression, or the result is undefined.
+//
+// The algorithm is recursive, but the recursion depth doesn't exceed
+// the regex length, so we won't need to worry about running out of
+// stack space normally.  In rare cases the time complexity can be
+// exponential with respect to the regex length + the string length,
+// but usually it's must faster (often close to linear).
+bool MatchRegexAnywhere(const char* regex, const char* str) {
+  if (regex == NULL || str == NULL)
+    return false;
+
+  if (*regex == '^')
+    return MatchRegexAtHead(regex + 1, str);
+
+  // A successful match can be anywhere in str.
+  do {
+    if (MatchRegexAtHead(regex, str))
+      return true;
+  } while (*str++ != '\0');
+  return false;
+}
+
+// Implements the RE class.
+
+RE::~RE() {
+  free(const_cast<char*>(pattern_));
+  free(const_cast<char*>(full_pattern_));
+}
+
+// Returns true iff regular expression re matches the entire str.
+bool RE::FullMatch(const char* str, const RE& re) {
+  return re.is_valid_ && MatchRegexAnywhere(re.full_pattern_, str);
+}
+
+// Returns true iff regular expression re matches a substring of str
+// (including str itself).
+bool RE::PartialMatch(const char* str, const RE& re) {
+  return re.is_valid_ && MatchRegexAnywhere(re.pattern_, str);
+}
+
+// Initializes an RE from its string representation.
+void RE::Init(const char* regex) {
+  pattern_ = full_pattern_ = NULL;
+  if (regex != NULL) {
+    pattern_ = posix::StrDup(regex);
+  }
+
+  is_valid_ = ValidateRegex(regex);
+  if (!is_valid_) {
+    // No need to calculate the full pattern when the regex is invalid.
+    return;
+  }
+
+  const size_t len = strlen(regex);
+  // Reserves enough bytes to hold the regular expression used for a
+  // full match: we need space to prepend a '^', append a '$', and
+  // terminate the string with '\0'.
+  char* buffer = static_cast<char*>(malloc(len + 3));
+  full_pattern_ = buffer;
+
+  if (*regex != '^')
+    *buffer++ = '^';  // Makes sure full_pattern_ starts with '^'.
+
+  // We don't use snprintf or strncpy, as they trigger a warning when
+  // compiled with VC++ 8.0.
+  memcpy(buffer, regex, len);
+  buffer += len;
+
+  if (len == 0 || regex[len - 1] != '$')
+    *buffer++ = '$';  // Makes sure full_pattern_ ends with '$'.
+
+  *buffer = '\0';
+}
+
+#endif  // GTEST_USES_POSIX_RE
+
+const char kUnknownFile[] = "unknown file";
+
+// Formats a source file path and a line number as they would appear
+// in an error message from the compiler used to compile this code.
+GTEST_API_ ::std::string FormatFileLocation(const char* file, int line) {
+  const std::string file_name(file == NULL ? kUnknownFile : file);
+
+  if (line < 0) {
+    return file_name + ":";
+  }
+#ifdef _MSC_VER
+  return file_name + "(" + StreamableToString(line) + "):";
+#else
+  return file_name + ":" + StreamableToString(line) + ":";
+#endif  // _MSC_VER
+}
+
+// Formats a file location for compiler-independent XML output.
+// Although this function is not platform dependent, we put it next to
+// FormatFileLocation in order to contrast the two functions.
+// Note that FormatCompilerIndependentFileLocation() does NOT append colon
+// to the file location it produces, unlike FormatFileLocation().
+GTEST_API_ ::std::string FormatCompilerIndependentFileLocation(
+    const char* file, int line) {
+  const std::string file_name(file == NULL ? kUnknownFile : file);
+
+  if (line < 0)
+    return file_name;
+  else
+    return file_name + ":" + StreamableToString(line);
+}
+
+
+GTestLog::GTestLog(GTestLogSeverity severity, const char* file, int line)
+    : severity_(severity) {
+  const char* const marker =
+      severity == GTEST_INFO ?    "[  INFO ]" :
+      severity == GTEST_WARNING ? "[WARNING]" :
+      severity == GTEST_ERROR ?   "[ ERROR ]" : "[ FATAL ]";
+  GetStream() << ::std::endl << marker << " "
+              << FormatFileLocation(file, line).c_str() << ": ";
+}
+
+// Flushes the buffers and, if severity is GTEST_FATAL, aborts the program.
+GTestLog::~GTestLog() {
+  GetStream() << ::std::endl;
+  if (severity_ == GTEST_FATAL) {
+    fflush(stderr);
+    posix::Abort();
+  }
+}
+// Disable Microsoft deprecation warnings for POSIX functions called from
+// this class (creat, dup, dup2, and close)
+#ifdef _MSC_VER
+# pragma warning(push)
+# pragma warning(disable: 4996)
+#endif  // _MSC_VER
+
+#if GTEST_HAS_STREAM_REDIRECTION
+
+// Object that captures an output stream (stdout/stderr).
+class CapturedStream {
+ public:
+  // The ctor redirects the stream to a temporary file.
+  explicit CapturedStream(int fd) : fd_(fd), uncaptured_fd_(dup(fd)) {
+# if GTEST_OS_WINDOWS
+    char temp_dir_path[MAX_PATH + 1] = { '\0' };  // NOLINT
+    char temp_file_path[MAX_PATH + 1] = { '\0' };  // NOLINT
+
+    ::GetTempPathA(sizeof(temp_dir_path), temp_dir_path);
+    const UINT success = ::GetTempFileNameA(temp_dir_path,
+                                            "gtest_redir",
+                                            0,  // Generate unique file name.
+                                            temp_file_path);
+    GTEST_CHECK_(success != 0)
+        << "Unable to create a temporary file in " << temp_dir_path;
+    const int captured_fd = creat(temp_file_path, _S_IREAD | _S_IWRITE);
+    GTEST_CHECK_(captured_fd != -1) << "Unable to open temporary file "
+                                    << temp_file_path;
+    filename_ = temp_file_path;
+# else
+    // There's no guarantee that a test has write access to the current
+    // directory, so we create the temporary file in the /tmp directory
+    // instead. We use /tmp on most systems, and /sdcard on Android.
+    // That's because Android doesn't have /tmp.
+#  if GTEST_OS_LINUX_ANDROID
+    // Note: Android applications are expected to call the framework's
+    // Context.getExternalStorageDirectory() method through JNI to get
+    // the location of the world-writable SD Card directory. However,
+    // this requires a Context handle, which cannot be retrieved
+    // globally from native code. Doing so also precludes running the
+    // code as part of a regular standalone executable, which doesn't
+    // run in a Dalvik process (e.g. when running it through 'adb shell').
+    //
+    // The location /sdcard is directly accessible from native code
+    // and is the only location (unofficially) supported by the Android
+    // team. It's generally a symlink to the real SD Card mount point
+    // which can be /mnt/sdcard, /mnt/sdcard0, /system/media/sdcard, or
+    // other OEM-customized locations. Never rely on these, and always
+    // use /sdcard.
+    char name_template[] = "/sdcard/gtest_captured_stream.XXXXXX";
+#  else
+    char name_template[] = "/tmp/captured_stream.XXXXXX";
+#  endif  // GTEST_OS_LINUX_ANDROID
+    const int captured_fd = mkstemp(name_template);
+    filename_ = name_template;
+# endif  // GTEST_OS_WINDOWS
+    fflush(NULL);
+    dup2(captured_fd, fd_);
+    close(captured_fd);
+  }
+
+  ~CapturedStream() {
+    remove(filename_.c_str());
+  }
+
+  std::string GetCapturedString() {
+    if (uncaptured_fd_ != -1) {
+      // Restores the original stream.
+      fflush(NULL);
+      dup2(uncaptured_fd_, fd_);
+      close(uncaptured_fd_);
+      uncaptured_fd_ = -1;
+    }
+
+    FILE* const file = posix::FOpen(filename_.c_str(), "r");
+    const std::string content = ReadEntireFile(file);
+    posix::FClose(file);
+    return content;
+  }
+
+ private:
+  // Reads the entire content of a file as an std::string.
+  static std::string ReadEntireFile(FILE* file);
+
+  // Returns the size (in bytes) of a file.
+  static size_t GetFileSize(FILE* file);
+
+  const int fd_;  // A stream to capture.
+  int uncaptured_fd_;
+  // Name of the temporary file holding the stderr output.
+  ::std::string filename_;
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(CapturedStream);
+};
+
+// Returns the size (in bytes) of a file.
+size_t CapturedStream::GetFileSize(FILE* file) {
+  fseek(file, 0, SEEK_END);
+  return static_cast<size_t>(ftell(file));
+}
+
+// Reads the entire content of a file as a string.
+std::string CapturedStream::ReadEntireFile(FILE* file) {
+  const size_t file_size = GetFileSize(file);
+  char* const buffer = new char[file_size];
+
+  size_t bytes_last_read = 0;  // # of bytes read in the last fread()
+  size_t bytes_read = 0;       // # of bytes read so far
+
+  fseek(file, 0, SEEK_SET);
+
+  // Keeps reading the file until we cannot read further or the
+  // pre-determined file size is reached.
+  do {
+    bytes_last_read = fread(buffer+bytes_read, 1, file_size-bytes_read, file);
+    bytes_read += bytes_last_read;
+  } while (bytes_last_read > 0 && bytes_read < file_size);
+
+  const std::string content(buffer, bytes_read);
+  delete[] buffer;
+
+  return content;
+}
+
+# ifdef _MSC_VER
+#  pragma warning(pop)
+# endif  // _MSC_VER
+
+static CapturedStream* g_captured_stderr = NULL;
+static CapturedStream* g_captured_stdout = NULL;
+
+// Starts capturing an output stream (stdout/stderr).
+void CaptureStream(int fd, const char* stream_name, CapturedStream** stream) {
+  if (*stream != NULL) {
+    GTEST_LOG_(FATAL) << "Only one " << stream_name
+                      << " capturer can exist at a time.";
+  }
+  *stream = new CapturedStream(fd);
+}
+
+// Stops capturing the output stream and returns the captured string.
+std::string GetCapturedStream(CapturedStream** captured_stream) {
+  const std::string content = (*captured_stream)->GetCapturedString();
+
+  delete *captured_stream;
+  *captured_stream = NULL;
+
+  return content;
+}
+
+// Starts capturing stdout.
+void CaptureStdout() {
+  CaptureStream(kStdOutFileno, "stdout", &g_captured_stdout);
+}
+
+// Starts capturing stderr.
+void CaptureStderr() {
+  CaptureStream(kStdErrFileno, "stderr", &g_captured_stderr);
+}
+
+// Stops capturing stdout and returns the captured string.
+std::string GetCapturedStdout() {
+  return GetCapturedStream(&g_captured_stdout);
+}
+
+// Stops capturing stderr and returns the captured string.
+std::string GetCapturedStderr() {
+  return GetCapturedStream(&g_captured_stderr);
+}
+
+#endif  // GTEST_HAS_STREAM_REDIRECTION
+
+#if GTEST_HAS_DEATH_TEST
+
+// A copy of all command line arguments.  Set by InitGoogleTest().
+::std::vector<testing::internal::string> g_argvs;
+
+static const ::std::vector<testing::internal::string>* g_injected_test_argvs =
+                                        NULL;  // Owned.
+
+void SetInjectableArgvs(const ::std::vector<testing::internal::string>* argvs) {
+  if (g_injected_test_argvs != argvs)
+    delete g_injected_test_argvs;
+  g_injected_test_argvs = argvs;
+}
+
+const ::std::vector<testing::internal::string>& GetInjectableArgvs() {
+  if (g_injected_test_argvs != NULL) {
+    return *g_injected_test_argvs;
+  }
+  return g_argvs;
+}
+#endif  // GTEST_HAS_DEATH_TEST
+
+#if GTEST_OS_WINDOWS_MOBILE
+namespace posix {
+void Abort() {
+  DebugBreak();
+  TerminateProcess(GetCurrentProcess(), 1);
+}
+}  // namespace posix
+#endif  // GTEST_OS_WINDOWS_MOBILE
+
+// Returns the name of the environment variable corresponding to the
+// given flag.  For example, FlagToEnvVar("foo") will return
+// "GTEST_FOO" in the open-source version.
+static std::string FlagToEnvVar(const char* flag) {
+  const std::string full_flag =
+      (Message() << GTEST_FLAG_PREFIX_ << flag).GetString();
+
+  Message env_var;
+  for (size_t i = 0; i != full_flag.length(); i++) {
+    env_var << ToUpper(full_flag.c_str()[i]);
+  }
+
+  return env_var.GetString();
+}
+
+// Parses 'str' for a 32-bit signed integer.  If successful, writes
+// the result to *value and returns true; otherwise leaves *value
+// unchanged and returns false.
+bool ParseInt32(const Message& src_text, const char* str, Int32* value) {
+  // Parses the environment variable as a decimal integer.
+  char* end = NULL;
+  const long long_value = strtol(str, &end, 10);  // NOLINT
+
+  // Has strtol() consumed all characters in the string?
+  if (*end != '\0') {
+    // No - an invalid character was encountered.
+    Message msg;
+    msg << "WARNING: " << src_text
+        << " is expected to be a 32-bit integer, but actually"
+        << " has value \"" << str << "\".\n";
+    printf("%s", msg.GetString().c_str());
+    fflush(stdout);
+    return false;
+  }
+
+  // Is the parsed value in the range of an Int32?
+  const Int32 result = static_cast<Int32>(long_value);
+  if (long_value == LONG_MAX || long_value == LONG_MIN ||
+      // The parsed value overflows as a long.  (strtol() returns
+      // LONG_MAX or LONG_MIN when the input overflows.)
+      result != long_value
+      // The parsed value overflows as an Int32.
+      ) {
+    Message msg;
+    msg << "WARNING: " << src_text
+        << " is expected to be a 32-bit integer, but actually"
+        << " has value " << str << ", which overflows.\n";
+    printf("%s", msg.GetString().c_str());
+    fflush(stdout);
+    return false;
+  }
+
+  *value = result;
+  return true;
+}
+
+// Reads and returns the Boolean environment variable corresponding to
+// the given flag; if it's not set, returns default_value.
+//
+// The value is considered true iff it's not "0".
+bool BoolFromGTestEnv(const char* flag, bool default_value) {
+  const std::string env_var = FlagToEnvVar(flag);
+  const char* const string_value = posix::GetEnv(env_var.c_str());
+  return string_value == NULL ?
+      default_value : strcmp(string_value, "0") != 0;
+}
+
+// Reads and returns a 32-bit integer stored in the environment
+// variable corresponding to the given flag; if it isn't set or
+// doesn't represent a valid 32-bit integer, returns default_value.
+Int32 Int32FromGTestEnv(const char* flag, Int32 default_value) {
+  const std::string env_var = FlagToEnvVar(flag);
+  const char* const string_value = posix::GetEnv(env_var.c_str());
+  if (string_value == NULL) {
+    // The environment variable is not set.
+    return default_value;
+  }
+
+  Int32 result = default_value;
+  if (!ParseInt32(Message() << "Environment variable " << env_var,
+                  string_value, &result)) {
+    printf("The default value %s is used.\n",
+           (Message() << default_value).GetString().c_str());
+    fflush(stdout);
+    return default_value;
+  }
+
+  return result;
+}
+
+// Reads and returns the string environment variable corresponding to
+// the given flag; if it's not set, returns default_value.
+const char* StringFromGTestEnv(const char* flag, const char* default_value) {
+  const std::string env_var = FlagToEnvVar(flag);
+  const char* const value = posix::GetEnv(env_var.c_str());
+  return value == NULL ? default_value : value;
+}
+
+}  // namespace internal
+}  // namespace testing
+// Copyright 2007, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+
+// Google Test - The Google C++ Testing Framework
+//
+// This file implements a universal value printer that can print a
+// value of any type T:
+//
+//   void ::testing::internal::UniversalPrinter<T>::Print(value, ostream_ptr);
+//
+// It uses the << operator when possible, and prints the bytes in the
+// object otherwise.  A user can override its behavior for a class
+// type Foo by defining either operator<<(::std::ostream&, const Foo&)
+// or void PrintTo(const Foo&, ::std::ostream*) in the namespace that
+// defines Foo.
+
+#include <ctype.h>
+#include <stdio.h>
+#include <ostream>  // NOLINT
+#include <string>
+
+namespace testing {
+
+namespace {
+
+using ::std::ostream;
+
+// Prints a segment of bytes in the given object.
+void PrintByteSegmentInObjectTo(const unsigned char* obj_bytes, size_t start,
+                                size_t count, ostream* os) {
+  char text[5] = "";
+  for (size_t i = 0; i != count; i++) {
+    const size_t j = start + i;
+    if (i != 0) {
+      // Organizes the bytes into groups of 2 for easy parsing by
+      // human.
+      if ((j % 2) == 0)
+        *os << ' ';
+      else
+        *os << '-';
+    }
+    GTEST_SNPRINTF_(text, sizeof(text), "%02X", obj_bytes[j]);
+    *os << text;
+  }
+}
+
+// Prints the bytes in the given value to the given ostream.
+void PrintBytesInObjectToImpl(const unsigned char* obj_bytes, size_t count,
+                              ostream* os) {
+  // Tells the user how big the object is.
+  *os << count << "-byte object <";
+
+  const size_t kThreshold = 132;
+  const size_t kChunkSize = 64;
+  // If the object size is bigger than kThreshold, we'll have to omit
+  // some details by printing only the first and the last kChunkSize
+  // bytes.
+  // TODO(wan): let the user control the threshold using a flag.
+  if (count < kThreshold) {
+    PrintByteSegmentInObjectTo(obj_bytes, 0, count, os);
+  } else {
+    PrintByteSegmentInObjectTo(obj_bytes, 0, kChunkSize, os);
+    *os << " ... ";
+    // Rounds up to 2-byte boundary.
+    const size_t resume_pos = (count - kChunkSize + 1)/2*2;
+    PrintByteSegmentInObjectTo(obj_bytes, resume_pos, count - resume_pos, os);
+  }
+  *os << ">";
+}
+
+}  // namespace
+
+namespace internal2 {
+
+// Delegates to PrintBytesInObjectToImpl() to print the bytes in the
+// given object.  The delegation simplifies the implementation, which
+// uses the << operator and thus is easier done outside of the
+// ::testing::internal namespace, which contains a << operator that
+// sometimes conflicts with the one in STL.
+void PrintBytesInObjectTo(const unsigned char* obj_bytes, size_t count,
+                          ostream* os) {
+  PrintBytesInObjectToImpl(obj_bytes, count, os);
+}
+
+}  // namespace internal2
+
+namespace internal {
+
+// Depending on the value of a char (or wchar_t), we print it in one
+// of three formats:
+//   - as is if it's a printable ASCII (e.g. 'a', '2', ' '),
+//   - as a hexidecimal escape sequence (e.g. '\x7F'), or
+//   - as a special escape sequence (e.g. '\r', '\n').
+enum CharFormat {
+  kAsIs,
+  kHexEscape,
+  kSpecialEscape
+};
+
+// Returns true if c is a printable ASCII character.  We test the
+// value of c directly instead of calling isprint(), which is buggy on
+// Windows Mobile.
+inline bool IsPrintableAscii(wchar_t c) {
+  return 0x20 <= c && c <= 0x7E;
+}
+
+// Prints a wide or narrow char c as a character literal without the
+// quotes, escaping it when necessary; returns how c was formatted.
+// The template argument UnsignedChar is the unsigned version of Char,
+// which is the type of c.
+template <typename UnsignedChar, typename Char>
+static CharFormat PrintAsCharLiteralTo(Char c, ostream* os) {
+  switch (static_cast<wchar_t>(c)) {
+    case L'\0':
+      *os << "\\0";
+      break;
+    case L'\'':
+      *os << "\\'";
+      break;
+    case L'\\':
+      *os << "\\\\";
+      break;
+    case L'\a':
+      *os << "\\a";
+      break;
+    case L'\b':
+      *os << "\\b";
+      break;
+    case L'\f':
+      *os << "\\f";
+      break;
+    case L'\n':
+      *os << "\\n";
+      break;
+    case L'\r':
+      *os << "\\r";
+      break;
+    case L'\t':
+      *os << "\\t";
+      break;
+    case L'\v':
+      *os << "\\v";
+      break;
+    default:
+      if (IsPrintableAscii(c)) {
+        *os << static_cast<char>(c);
+        return kAsIs;
+      } else {
+        *os << "\\x" + String::FormatHexInt(static_cast<UnsignedChar>(c));
+        return kHexEscape;
+      }
+  }
+  return kSpecialEscape;
+}
+
+// Prints a wchar_t c as if it's part of a string literal, escaping it when
+// necessary; returns how c was formatted.
+static CharFormat PrintAsStringLiteralTo(wchar_t c, ostream* os) {
+  switch (c) {
+    case L'\'':
+      *os << "'";
+      return kAsIs;
+    case L'"':
+      *os << "\\\"";
+      return kSpecialEscape;
+    default:
+      return PrintAsCharLiteralTo<wchar_t>(c, os);
+  }
+}
+
+// Prints a char c as if it's part of a string literal, escaping it when
+// necessary; returns how c was formatted.
+static CharFormat PrintAsStringLiteralTo(char c, ostream* os) {
+  return PrintAsStringLiteralTo(
+      static_cast<wchar_t>(static_cast<unsigned char>(c)), os);
+}
+
+// Prints a wide or narrow character c and its code.  '\0' is printed
+// as "'\\0'", other unprintable characters are also properly escaped
+// using the standard C++ escape sequence.  The template argument
+// UnsignedChar is the unsigned version of Char, which is the type of c.
+template <typename UnsignedChar, typename Char>
+void PrintCharAndCodeTo(Char c, ostream* os) {
+  // First, print c as a literal in the most readable form we can find.
+  *os << ((sizeof(c) > 1) ? "L'" : "'");
+  const CharFormat format = PrintAsCharLiteralTo<UnsignedChar>(c, os);
+  *os << "'";
+
+  // To aid user debugging, we also print c's code in decimal, unless
+  // it's 0 (in which case c was printed as '\\0', making the code
+  // obvious).
+  if (c == 0)
+    return;
+  *os << " (" << static_cast<int>(c);
+
+  // For more convenience, we print c's code again in hexidecimal,
+  // unless c was already printed in the form '\x##' or the code is in
+  // [1, 9].
+  if (format == kHexEscape || (1 <= c && c <= 9)) {
+    // Do nothing.
+  } else {
+    *os << ", 0x" << String::FormatHexInt(static_cast<UnsignedChar>(c));
+  }
+  *os << ")";
+}
+
+void PrintTo(unsigned char c, ::std::ostream* os) {
+  PrintCharAndCodeTo<unsigned char>(c, os);
+}
+void PrintTo(signed char c, ::std::ostream* os) {
+  PrintCharAndCodeTo<unsigned char>(c, os);
+}
+
+// Prints a wchar_t as a symbol if it is printable or as its internal
+// code otherwise and also as its code.  L'\0' is printed as "L'\\0'".
+void PrintTo(wchar_t wc, ostream* os) {
+  PrintCharAndCodeTo<wchar_t>(wc, os);
+}
+
+// Prints the given array of characters to the ostream.  CharType must be either
+// char or wchar_t.
+// The array starts at begin, the length is len, it may include '\0' characters
+// and may not be NUL-terminated.
+template <typename CharType>
+static void PrintCharsAsStringTo(
+    const CharType* begin, size_t len, ostream* os) {
+  const char* const kQuoteBegin = sizeof(CharType) == 1 ? "\"" : "L\"";
+  *os << kQuoteBegin;
+  bool is_previous_hex = false;
+  for (size_t index = 0; index < len; ++index) {
+    const CharType cur = begin[index];
+    if (is_previous_hex && IsXDigit(cur)) {
+      // Previous character is of '\x..' form and this character can be
+      // interpreted as another hexadecimal digit in its number. Break string to
+      // disambiguate.
+      *os << "\" " << kQuoteBegin;
+    }
+    is_previous_hex = PrintAsStringLiteralTo(cur, os) == kHexEscape;
+  }
+  *os << "\"";
+}
+
+// Prints a (const) char/wchar_t array of 'len' elements, starting at address
+// 'begin'.  CharType must be either char or wchar_t.
+template <typename CharType>
+static void UniversalPrintCharArray(
+    const CharType* begin, size_t len, ostream* os) {
+  // The code
+  //   const char kFoo[] = "foo";
+  // generates an array of 4, not 3, elements, with the last one being '\0'.
+  //
+  // Therefore when printing a char array, we don't print the last element if
+  // it's '\0', such that the output matches the string literal as it's
+  // written in the source code.
+  if (len > 0 && begin[len - 1] == '\0') {
+    PrintCharsAsStringTo(begin, len - 1, os);
+    return;
+  }
+
+  // If, however, the last element in the array is not '\0', e.g.
+  //    const char kFoo[] = { 'f', 'o', 'o' };
+  // we must print the entire array.  We also print a message to indicate
+  // that the array is not NUL-terminated.
+  PrintCharsAsStringTo(begin, len, os);
+  *os << " (no terminating NUL)";
+}
+
+// Prints a (const) char array of 'len' elements, starting at address 'begin'.
+void UniversalPrintArray(const char* begin, size_t len, ostream* os) {
+  UniversalPrintCharArray(begin, len, os);
+}
+
+// Prints a (const) wchar_t array of 'len' elements, starting at address
+// 'begin'.
+void UniversalPrintArray(const wchar_t* begin, size_t len, ostream* os) {
+  UniversalPrintCharArray(begin, len, os);
+}
+
+// Prints the given C string to the ostream.
+void PrintTo(const char* s, ostream* os) {
+  if (s == NULL) {
+    *os << "NULL";
+  } else {
+    *os << ImplicitCast_<const void*>(s) << " pointing to ";
+    PrintCharsAsStringTo(s, strlen(s), os);
+  }
+}
+
+// MSVC compiler can be configured to define whar_t as a typedef
+// of unsigned short. Defining an overload for const wchar_t* in that case
+// would cause pointers to unsigned shorts be printed as wide strings,
+// possibly accessing more memory than intended and causing invalid
+// memory accesses. MSVC defines _NATIVE_WCHAR_T_DEFINED symbol when
+// wchar_t is implemented as a native type.
+#if !defined(_MSC_VER) || defined(_NATIVE_WCHAR_T_DEFINED)
+// Prints the given wide C string to the ostream.
+void PrintTo(const wchar_t* s, ostream* os) {
+  if (s == NULL) {
+    *os << "NULL";
+  } else {
+    *os << ImplicitCast_<const void*>(s) << " pointing to ";
+    PrintCharsAsStringTo(s, wcslen(s), os);
+  }
+}
+#endif  // wchar_t is native
+
+// Prints a ::string object.
+#if GTEST_HAS_GLOBAL_STRING
+void PrintStringTo(const ::string& s, ostream* os) {
+  PrintCharsAsStringTo(s.data(), s.size(), os);
+}
+#endif  // GTEST_HAS_GLOBAL_STRING
+
+void PrintStringTo(const ::std::string& s, ostream* os) {
+  PrintCharsAsStringTo(s.data(), s.size(), os);
+}
+
+// Prints a ::wstring object.
+#if GTEST_HAS_GLOBAL_WSTRING
+void PrintWideStringTo(const ::wstring& s, ostream* os) {
+  PrintCharsAsStringTo(s.data(), s.size(), os);
+}
+#endif  // GTEST_HAS_GLOBAL_WSTRING
+
+#if GTEST_HAS_STD_WSTRING
+void PrintWideStringTo(const ::std::wstring& s, ostream* os) {
+  PrintCharsAsStringTo(s.data(), s.size(), os);
+}
+#endif  // GTEST_HAS_STD_WSTRING
+
+}  // namespace internal
+
+}  // namespace testing
+// Copyright 2008, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: mheule at google.com (Markus Heule)
+//
+// The Google C++ Testing Framework (Google Test)
+
+
+// Indicates that this translation unit is part of Google Test's
+// implementation.  It must come before gtest-internal-inl.h is
+// included, or there will be a compiler error.  This trick is to
+// prevent a user from accidentally including gtest-internal-inl.h in
+// his code.
+#define GTEST_IMPLEMENTATION_ 1
+#undef GTEST_IMPLEMENTATION_
+
+namespace testing {
+
+using internal::GetUnitTestImpl;
+
+// Gets the summary of the failure message by omitting the stack trace
+// in it.
+std::string TestPartResult::ExtractSummary(const char* message) {
+  const char* const stack_trace = strstr(message, internal::kStackTraceMarker);
+  return stack_trace == NULL ? message :
+      std::string(message, stack_trace);
+}
+
+// Prints a TestPartResult object.
+std::ostream& operator<<(std::ostream& os, const TestPartResult& result) {
+  return os
+      << result.file_name() << ":" << result.line_number() << ": "
+      << (result.type() == TestPartResult::kSuccess ? "Success" :
+          result.type() == TestPartResult::kFatalFailure ? "Fatal failure" :
+          "Non-fatal failure") << ":\n"
+      << result.message() << std::endl;
+}
+
+// Appends a TestPartResult to the array.
+void TestPartResultArray::Append(const TestPartResult& result) {
+  array_.push_back(result);
+}
+
+// Returns the TestPartResult at the given index (0-based).
+const TestPartResult& TestPartResultArray::GetTestPartResult(int index) const {
+  if (index < 0 || index >= size()) {
+    printf("\nInvalid index (%d) into TestPartResultArray.\n", index);
+    internal::posix::Abort();
+  }
+
+  return array_[index];
+}
+
+// Returns the number of TestPartResult objects in the array.
+int TestPartResultArray::size() const {
+  return static_cast<int>(array_.size());
+}
+
+namespace internal {
+
+HasNewFatalFailureHelper::HasNewFatalFailureHelper()
+    : has_new_fatal_failure_(false),
+      original_reporter_(GetUnitTestImpl()->
+                         GetTestPartResultReporterForCurrentThread()) {
+  GetUnitTestImpl()->SetTestPartResultReporterForCurrentThread(this);
+}
+
+HasNewFatalFailureHelper::~HasNewFatalFailureHelper() {
+  GetUnitTestImpl()->SetTestPartResultReporterForCurrentThread(
+      original_reporter_);
+}
+
+void HasNewFatalFailureHelper::ReportTestPartResult(
+    const TestPartResult& result) {
+  if (result.fatally_failed())
+    has_new_fatal_failure_ = true;
+  original_reporter_->ReportTestPartResult(result);
+}
+
+}  // namespace internal
+
+}  // namespace testing
+// Copyright 2008 Google Inc.
+// All Rights Reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+
+
+namespace testing {
+namespace internal {
+
+#if GTEST_HAS_TYPED_TEST_P
+
+// Skips to the first non-space char in str. Returns an empty string if str
+// contains only whitespace characters.
+static const char* SkipSpaces(const char* str) {
+  while (IsSpace(*str))
+    str++;
+  return str;
+}
+
+// Verifies that registered_tests match the test names in
+// defined_test_names_; returns registered_tests if successful, or
+// aborts the program otherwise.
+const char* TypedTestCasePState::VerifyRegisteredTestNames(
+    const char* file, int line, const char* registered_tests) {
+  typedef ::std::set<const char*>::const_iterator DefinedTestIter;
+  registered_ = true;
+
+  // Skip initial whitespace in registered_tests since some
+  // preprocessors prefix stringizied literals with whitespace.
+  registered_tests = SkipSpaces(registered_tests);
+
+  Message errors;
+  ::std::set<std::string> tests;
+  for (const char* names = registered_tests; names != NULL;
+       names = SkipComma(names)) {
+    const std::string name = GetPrefixUntilComma(names);
+    if (tests.count(name) != 0) {
+      errors << "Test " << name << " is listed more than once.\n";
+      continue;
+    }
+
+    bool found = false;
+    for (DefinedTestIter it = defined_test_names_.begin();
+         it != defined_test_names_.end();
+         ++it) {
+      if (name == *it) {
+        found = true;
+        break;
+      }
+    }
+
+    if (found) {
+      tests.insert(name);
+    } else {
+      errors << "No test named " << name
+             << " can be found in this test case.\n";
+    }
+  }
+
+  for (DefinedTestIter it = defined_test_names_.begin();
+       it != defined_test_names_.end();
+       ++it) {
+    if (tests.count(*it) == 0) {
+      errors << "You forgot to list test " << *it << ".\n";
+    }
+  }
+
+  const std::string& errors_str = errors.GetString();
+  if (errors_str != "") {
+    fprintf(stderr, "%s %s", FormatFileLocation(file, line).c_str(),
+            errors_str.c_str());
+    fflush(stderr);
+    posix::Abort();
+  }
+
+  return registered_tests;
+}
+
+#endif  // GTEST_HAS_TYPED_TEST_P
+
+}  // namespace internal
+}  // namespace testing
diff --git a/contrib/gtest-1.7.0/fused-src/gtest/gtest.h b/contrib/gtest-1.7.0/fused-src/gtest/gtest.h
new file mode 100644
index 0000000..4f3804f
--- /dev/null
+++ b/contrib/gtest-1.7.0/fused-src/gtest/gtest.h
@@ -0,0 +1,20061 @@
+// Copyright 2005, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+//
+// The Google C++ Testing Framework (Google Test)
+//
+// This header file defines the public API for Google Test.  It should be
+// included by any test program that uses Google Test.
+//
+// IMPORTANT NOTE: Due to limitation of the C++ language, we have to
+// leave some internal implementation details in this header file.
+// They are clearly marked by comments like this:
+//
+//   // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
+//
+// Such code is NOT meant to be used by a user directly, and is subject
+// to CHANGE WITHOUT NOTICE.  Therefore DO NOT DEPEND ON IT in a user
+// program!
+//
+// Acknowledgment: Google Test borrowed the idea of automatic test
+// registration from Barthelemy Dagenais' (barthelemy at prologique.com)
+// easyUnit framework.
+
+#ifndef GTEST_INCLUDE_GTEST_GTEST_H_
+#define GTEST_INCLUDE_GTEST_GTEST_H_
+
+#include <limits>
+#include <ostream>
+#include <vector>
+
+// Copyright 2005, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Authors: wan at google.com (Zhanyong Wan), eefacm at gmail.com (Sean Mcafee)
+//
+// The Google C++ Testing Framework (Google Test)
+//
+// This header file declares functions and macros used internally by
+// Google Test.  They are subject to change without notice.
+
+#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_INTERNAL_H_
+#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_INTERNAL_H_
+
+// Copyright 2005, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Authors: wan at google.com (Zhanyong Wan)
+//
+// Low-level types and utilities for porting Google Test to various
+// platforms.  They are subject to change without notice.  DO NOT USE
+// THEM IN USER CODE.
+//
+// This file is fundamental to Google Test.  All other Google Test source
+// files are expected to #include this.  Therefore, it cannot #include
+// any other Google Test header.
+
+#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PORT_H_
+#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PORT_H_
+
+// The user can define the following macros in the build script to
+// control Google Test's behavior.  If the user doesn't define a macro
+// in this list, Google Test will define it.
+//
+//   GTEST_HAS_CLONE          - Define it to 1/0 to indicate that clone(2)
+//                              is/isn't available.
+//   GTEST_HAS_EXCEPTIONS     - Define it to 1/0 to indicate that exceptions
+//                              are enabled.
+//   GTEST_HAS_GLOBAL_STRING  - Define it to 1/0 to indicate that ::string
+//                              is/isn't available (some systems define
+//                              ::string, which is different to std::string).
+//   GTEST_HAS_GLOBAL_WSTRING - Define it to 1/0 to indicate that ::string
+//                              is/isn't available (some systems define
+//                              ::wstring, which is different to std::wstring).
+//   GTEST_HAS_POSIX_RE       - Define it to 1/0 to indicate that POSIX regular
+//                              expressions are/aren't available.
+//   GTEST_HAS_PTHREAD        - Define it to 1/0 to indicate that <pthread.h>
+//                              is/isn't available.
+//   GTEST_HAS_RTTI           - Define it to 1/0 to indicate that RTTI is/isn't
+//                              enabled.
+//   GTEST_HAS_STD_WSTRING    - Define it to 1/0 to indicate that
+//                              std::wstring does/doesn't work (Google Test can
+//                              be used where std::wstring is unavailable).
+//   GTEST_HAS_TR1_TUPLE      - Define it to 1/0 to indicate tr1::tuple
+//                              is/isn't available.
+//   GTEST_HAS_SEH            - Define it to 1/0 to indicate whether the
+//                              compiler supports Microsoft's "Structured
+//                              Exception Handling".
+//   GTEST_HAS_STREAM_REDIRECTION
+//                            - Define it to 1/0 to indicate whether the
+//                              platform supports I/O stream redirection using
+//                              dup() and dup2().
+//   GTEST_USE_OWN_TR1_TUPLE  - Define it to 1/0 to indicate whether Google
+//                              Test's own tr1 tuple implementation should be
+//                              used.  Unused when the user sets
+//                              GTEST_HAS_TR1_TUPLE to 0.
+//   GTEST_LANG_CXX11         - Define it to 1/0 to indicate that Google Test
+//                              is building in C++11/C++98 mode.
+//   GTEST_LINKED_AS_SHARED_LIBRARY
+//                            - Define to 1 when compiling tests that use
+//                              Google Test as a shared library (known as
+//                              DLL on Windows).
+//   GTEST_CREATE_SHARED_LIBRARY
+//                            - Define to 1 when compiling Google Test itself
+//                              as a shared library.
+
+// This header defines the following utilities:
+//
+// Macros indicating the current platform (defined to 1 if compiled on
+// the given platform; otherwise undefined):
+//   GTEST_OS_AIX      - IBM AIX
+//   GTEST_OS_CYGWIN   - Cygwin
+//   GTEST_OS_HPUX     - HP-UX
+//   GTEST_OS_LINUX    - Linux
+//     GTEST_OS_LINUX_ANDROID - Google Android
+//   GTEST_OS_MAC      - Mac OS X
+//     GTEST_OS_IOS    - iOS
+//       GTEST_OS_IOS_SIMULATOR - iOS simulator
+//   GTEST_OS_NACL     - Google Native Client (NaCl)
+//   GTEST_OS_OPENBSD  - OpenBSD
+//   GTEST_OS_QNX      - QNX
+//   GTEST_OS_SOLARIS  - Sun Solaris
+//   GTEST_OS_SYMBIAN  - Symbian
+//   GTEST_OS_WINDOWS  - Windows (Desktop, MinGW, or Mobile)
+//     GTEST_OS_WINDOWS_DESKTOP  - Windows Desktop
+//     GTEST_OS_WINDOWS_MINGW    - MinGW
+//     GTEST_OS_WINDOWS_MOBILE   - Windows Mobile
+//   GTEST_OS_ZOS      - z/OS
+//
+// Among the platforms, Cygwin, Linux, Max OS X, and Windows have the
+// most stable support.  Since core members of the Google Test project
+// don't have access to other platforms, support for them may be less
+// stable.  If you notice any problems on your platform, please notify
+// googletestframework at googlegroups.com (patches for fixing them are
+// even more welcome!).
+//
+// Note that it is possible that none of the GTEST_OS_* macros are defined.
+//
+// Macros indicating available Google Test features (defined to 1 if
+// the corresponding feature is supported; otherwise undefined):
+//   GTEST_HAS_COMBINE      - the Combine() function (for value-parameterized
+//                            tests)
+//   GTEST_HAS_DEATH_TEST   - death tests
+//   GTEST_HAS_PARAM_TEST   - value-parameterized tests
+//   GTEST_HAS_TYPED_TEST   - typed tests
+//   GTEST_HAS_TYPED_TEST_P - type-parameterized tests
+//   GTEST_USES_POSIX_RE    - enhanced POSIX regex is used. Do not confuse with
+//                            GTEST_HAS_POSIX_RE (see above) which users can
+//                            define themselves.
+//   GTEST_USES_SIMPLE_RE   - our own simple regex is used;
+//                            the above two are mutually exclusive.
+//   GTEST_CAN_COMPARE_NULL - accepts untyped NULL in EXPECT_EQ().
+//
+// Macros for basic C++ coding:
+//   GTEST_AMBIGUOUS_ELSE_BLOCKER_ - for disabling a gcc warning.
+//   GTEST_ATTRIBUTE_UNUSED_  - declares that a class' instances or a
+//                              variable don't have to be used.
+//   GTEST_DISALLOW_ASSIGN_   - disables operator=.
+//   GTEST_DISALLOW_COPY_AND_ASSIGN_ - disables copy ctor and operator=.
+//   GTEST_MUST_USE_RESULT_   - declares that a function's result must be used.
+//
+// Synchronization:
+//   Mutex, MutexLock, ThreadLocal, GetThreadCount()
+//                  - synchronization primitives.
+//   GTEST_IS_THREADSAFE - defined to 1 to indicate that the above
+//                         synchronization primitives have real implementations
+//                         and Google Test is thread-safe; or 0 otherwise.
+//
+// Template meta programming:
+//   is_pointer     - as in TR1; needed on Symbian and IBM XL C/C++ only.
+//   IteratorTraits - partial implementation of std::iterator_traits, which
+//                    is not available in libCstd when compiled with Sun C++.
+//
+// Smart pointers:
+//   scoped_ptr     - as in TR2.
+//
+// Regular expressions:
+//   RE             - a simple regular expression class using the POSIX
+//                    Extended Regular Expression syntax on UNIX-like
+//                    platforms, or a reduced regular exception syntax on
+//                    other platforms, including Windows.
+//
+// Logging:
+//   GTEST_LOG_()   - logs messages at the specified severity level.
+//   LogToStderr()  - directs all log messages to stderr.
+//   FlushInfoLog() - flushes informational log messages.
+//
+// Stdout and stderr capturing:
+//   CaptureStdout()     - starts capturing stdout.
+//   GetCapturedStdout() - stops capturing stdout and returns the captured
+//                         string.
+//   CaptureStderr()     - starts capturing stderr.
+//   GetCapturedStderr() - stops capturing stderr and returns the captured
+//                         string.
+//
+// Integer types:
+//   TypeWithSize   - maps an integer to a int type.
+//   Int32, UInt32, Int64, UInt64, TimeInMillis
+//                  - integers of known sizes.
+//   BiggestInt     - the biggest signed integer type.
+//
+// Command-line utilities:
+//   GTEST_FLAG()       - references a flag.
+//   GTEST_DECLARE_*()  - declares a flag.
+//   GTEST_DEFINE_*()   - defines a flag.
+//   GetInjectableArgvs() - returns the command line as a vector of strings.
+//
+// Environment variable utilities:
+//   GetEnv()             - gets the value of an environment variable.
+//   BoolFromGTestEnv()   - parses a bool environment variable.
+//   Int32FromGTestEnv()  - parses an Int32 environment variable.
+//   StringFromGTestEnv() - parses a string environment variable.
+
+#include <ctype.h>   // for isspace, etc
+#include <stddef.h>  // for ptrdiff_t
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#ifndef _WIN32_WCE
+# include <sys/types.h>
+# include <sys/stat.h>
+#endif  // !_WIN32_WCE
+
+#if defined __APPLE__
+# include <AvailabilityMacros.h>
+# include <TargetConditionals.h>
+#endif
+
+#include <iostream>  // NOLINT
+#include <sstream>  // NOLINT
+#include <string>  // NOLINT
+
+#define GTEST_DEV_EMAIL_ "googletestframework@@googlegroups.com"
+#define GTEST_FLAG_PREFIX_ "gtest_"
+#define GTEST_FLAG_PREFIX_DASH_ "gtest-"
+#define GTEST_FLAG_PREFIX_UPPER_ "GTEST_"
+#define GTEST_NAME_ "Google Test"
+#define GTEST_PROJECT_URL_ "http://code.google.com/p/googletest/"
+
+// Determines the version of gcc that is used to compile this.
+#ifdef __GNUC__
+// 40302 means version 4.3.2.
+# define GTEST_GCC_VER_ \
+    (__GNUC__*10000 + __GNUC_MINOR__*100 + __GNUC_PATCHLEVEL__)
+#endif  // __GNUC__
+
+// Determines the platform on which Google Test is compiled.
+#ifdef __CYGWIN__
+# define GTEST_OS_CYGWIN 1
+#elif defined __SYMBIAN32__
+# define GTEST_OS_SYMBIAN 1
+#elif defined _WIN32
+# define GTEST_OS_WINDOWS 1
+# ifdef _WIN32_WCE
+#  define GTEST_OS_WINDOWS_MOBILE 1
+# elif defined(__MINGW__) || defined(__MINGW32__)
+#  define GTEST_OS_WINDOWS_MINGW 1
+# else
+#  define GTEST_OS_WINDOWS_DESKTOP 1
+# endif  // _WIN32_WCE
+#elif defined __APPLE__
+# define GTEST_OS_MAC 1
+# if TARGET_OS_IPHONE
+#  define GTEST_OS_IOS 1
+#  if TARGET_IPHONE_SIMULATOR
+#   define GTEST_OS_IOS_SIMULATOR 1
+#  endif
+# endif
+#elif defined __linux__
+# define GTEST_OS_LINUX 1
+# if defined __ANDROID__
+#  define GTEST_OS_LINUX_ANDROID 1
+# endif
+#elif defined __MVS__
+# define GTEST_OS_ZOS 1
+#elif defined(__sun) && defined(__SVR4)
+# define GTEST_OS_SOLARIS 1
+#elif defined(_AIX)
+# define GTEST_OS_AIX 1
+#elif defined(__hpux)
+# define GTEST_OS_HPUX 1
+#elif defined __native_client__
+# define GTEST_OS_NACL 1
+#elif defined __OpenBSD__
+# define GTEST_OS_OPENBSD 1
+#elif defined __QNX__
+# define GTEST_OS_QNX 1
+#endif  // __CYGWIN__
+
+#ifndef GTEST_LANG_CXX11
+// gcc and clang define __GXX_EXPERIMENTAL_CXX0X__ when
+// -std={c,gnu}++{0x,11} is passed.  The C++11 standard specifies a
+// value for __cplusplus, and recent versions of clang, gcc, and
+// probably other compilers set that too in C++11 mode.
+# if __GXX_EXPERIMENTAL_CXX0X__ || __cplusplus >= 201103L
+// Compiling in at least C++11 mode.
+#  define GTEST_LANG_CXX11 1
+# else
+#  define GTEST_LANG_CXX11 0
+# endif
+#endif
+
+// Brings in definitions for functions used in the testing::internal::posix
+// namespace (read, write, close, chdir, isatty, stat). We do not currently
+// use them on Windows Mobile.
+#if !GTEST_OS_WINDOWS
+// This assumes that non-Windows OSes provide unistd.h. For OSes where this
+// is not the case, we need to include headers that provide the functions
+// mentioned above.
+# include <unistd.h>
+# include <strings.h>
+#elif !GTEST_OS_WINDOWS_MOBILE
+# include <direct.h>
+# include <io.h>
+#endif
+
+#if GTEST_OS_LINUX_ANDROID
+// Used to define __ANDROID_API__ matching the target NDK API level.
+#  include <android/api-level.h>  // NOLINT
+#endif
+
+// Defines this to true iff Google Test can use POSIX regular expressions.
+#ifndef GTEST_HAS_POSIX_RE
+# if GTEST_OS_LINUX_ANDROID
+// On Android, <regex.h> is only available starting with Gingerbread.
+#  define GTEST_HAS_POSIX_RE (__ANDROID_API__ >= 9)
+# else
+#  define GTEST_HAS_POSIX_RE (!GTEST_OS_WINDOWS)
+# endif
+#endif
+
+#if GTEST_HAS_POSIX_RE
+
+// On some platforms, <regex.h> needs someone to define size_t, and
+// won't compile otherwise.  We can #include it here as we already
+// included <stdlib.h>, which is guaranteed to define size_t through
+// <stddef.h>.
+# include <regex.h>  // NOLINT
+
+# define GTEST_USES_POSIX_RE 1
+
+#elif GTEST_OS_WINDOWS
+
+// <regex.h> is not available on Windows.  Use our own simple regex
+// implementation instead.
+# define GTEST_USES_SIMPLE_RE 1
+
+#else
+
+// <regex.h> may not be available on this platform.  Use our own
+// simple regex implementation instead.
+# define GTEST_USES_SIMPLE_RE 1
+
+#endif  // GTEST_HAS_POSIX_RE
+
+#ifndef GTEST_HAS_EXCEPTIONS
+// The user didn't tell us whether exceptions are enabled, so we need
+// to figure it out.
+# if defined(_MSC_VER) || defined(__BORLANDC__)
+// MSVC's and C++Builder's implementations of the STL use the _HAS_EXCEPTIONS
+// macro to enable exceptions, so we'll do the same.
+// Assumes that exceptions are enabled by default.
+#  ifndef _HAS_EXCEPTIONS
+#   define _HAS_EXCEPTIONS 1
+#  endif  // _HAS_EXCEPTIONS
+#  define GTEST_HAS_EXCEPTIONS _HAS_EXCEPTIONS
+# elif defined(__GNUC__) && __EXCEPTIONS
+// gcc defines __EXCEPTIONS to 1 iff exceptions are enabled.
+#  define GTEST_HAS_EXCEPTIONS 1
+# elif defined(__SUNPRO_CC)
+// Sun Pro CC supports exceptions.  However, there is no compile-time way of
+// detecting whether they are enabled or not.  Therefore, we assume that
+// they are enabled unless the user tells us otherwise.
+#  define GTEST_HAS_EXCEPTIONS 1
+# elif defined(__IBMCPP__) && __EXCEPTIONS
+// xlC defines __EXCEPTIONS to 1 iff exceptions are enabled.
+#  define GTEST_HAS_EXCEPTIONS 1
+# elif defined(__HP_aCC)
+// Exception handling is in effect by default in HP aCC compiler. It has to
+// be turned of by +noeh compiler option if desired.
+#  define GTEST_HAS_EXCEPTIONS 1
+# else
+// For other compilers, we assume exceptions are disabled to be
+// conservative.
+#  define GTEST_HAS_EXCEPTIONS 0
+# endif  // defined(_MSC_VER) || defined(__BORLANDC__)
+#endif  // GTEST_HAS_EXCEPTIONS
+
+#if !defined(GTEST_HAS_STD_STRING)
+// Even though we don't use this macro any longer, we keep it in case
+// some clients still depend on it.
+# define GTEST_HAS_STD_STRING 1
+#elif !GTEST_HAS_STD_STRING
+// The user told us that ::std::string isn't available.
+# error "Google Test cannot be used where ::std::string isn't available."
+#endif  // !defined(GTEST_HAS_STD_STRING)
+
+#ifndef GTEST_HAS_GLOBAL_STRING
+// The user didn't tell us whether ::string is available, so we need
+// to figure it out.
+
+# define GTEST_HAS_GLOBAL_STRING 0
+
+#endif  // GTEST_HAS_GLOBAL_STRING
+
+#ifndef GTEST_HAS_STD_WSTRING
+// The user didn't tell us whether ::std::wstring is available, so we need
+// to figure it out.
+// TODO(wan at google.com): uses autoconf to detect whether ::std::wstring
+//   is available.
+
+// Cygwin 1.7 and below doesn't support ::std::wstring.
+// Solaris' libc++ doesn't support it either.  Android has
+// no support for it at least as recent as Froyo (2.2).
+# define GTEST_HAS_STD_WSTRING \
+    (!(GTEST_OS_LINUX_ANDROID || GTEST_OS_CYGWIN || GTEST_OS_SOLARIS))
+
+#endif  // GTEST_HAS_STD_WSTRING
+
+#ifndef GTEST_HAS_GLOBAL_WSTRING
+// The user didn't tell us whether ::wstring is available, so we need
+// to figure it out.
+# define GTEST_HAS_GLOBAL_WSTRING \
+    (GTEST_HAS_STD_WSTRING && GTEST_HAS_GLOBAL_STRING)
+#endif  // GTEST_HAS_GLOBAL_WSTRING
+
+// Determines whether RTTI is available.
+#ifndef GTEST_HAS_RTTI
+// The user didn't tell us whether RTTI is enabled, so we need to
+// figure it out.
+
+# ifdef _MSC_VER
+
+#  ifdef _CPPRTTI  // MSVC defines this macro iff RTTI is enabled.
+#   define GTEST_HAS_RTTI 1
+#  else
+#   define GTEST_HAS_RTTI 0
+#  endif
+
+// Starting with version 4.3.2, gcc defines __GXX_RTTI iff RTTI is enabled.
+# elif defined(__GNUC__) && (GTEST_GCC_VER_ >= 40302)
+
+#  ifdef __GXX_RTTI
+// When building against STLport with the Android NDK and with
+// -frtti -fno-exceptions, the build fails at link time with undefined
+// references to __cxa_bad_typeid. Note sure if STL or toolchain bug,
+// so disable RTTI when detected.
+#   if GTEST_OS_LINUX_ANDROID && defined(_STLPORT_MAJOR) && \
+       !defined(__EXCEPTIONS)
+#    define GTEST_HAS_RTTI 0
+#   else
+#    define GTEST_HAS_RTTI 1
+#   endif  // GTEST_OS_LINUX_ANDROID && __STLPORT_MAJOR && !__EXCEPTIONS
+#  else
+#   define GTEST_HAS_RTTI 0
+#  endif  // __GXX_RTTI
+
+// Clang defines __GXX_RTTI starting with version 3.0, but its manual recommends
+// using has_feature instead. has_feature(cxx_rtti) is supported since 2.7, the
+// first version with C++ support.
+# elif defined(__clang__)
+
+#  define GTEST_HAS_RTTI __has_feature(cxx_rtti)
+
+// Starting with version 9.0 IBM Visual Age defines __RTTI_ALL__ to 1 if
+// both the typeid and dynamic_cast features are present.
+# elif defined(__IBMCPP__) && (__IBMCPP__ >= 900)
+
+#  ifdef __RTTI_ALL__
+#   define GTEST_HAS_RTTI 1
+#  else
+#   define GTEST_HAS_RTTI 0
+#  endif
+
+# else
+
+// For all other compilers, we assume RTTI is enabled.
+#  define GTEST_HAS_RTTI 1
+
+# endif  // _MSC_VER
+
+#endif  // GTEST_HAS_RTTI
+
+// It's this header's responsibility to #include <typeinfo> when RTTI
+// is enabled.
+#if GTEST_HAS_RTTI
+# include <typeinfo>
+#endif
+
+// Determines whether Google Test can use the pthreads library.
+#ifndef GTEST_HAS_PTHREAD
+// The user didn't tell us explicitly, so we assume pthreads support is
+// available on Linux and Mac.
+//
+// To disable threading support in Google Test, add -DGTEST_HAS_PTHREAD=0
+// to your compiler flags.
+# define GTEST_HAS_PTHREAD (GTEST_OS_LINUX || GTEST_OS_MAC || GTEST_OS_HPUX \
+    || GTEST_OS_QNX)
+#endif  // GTEST_HAS_PTHREAD
+
+#if GTEST_HAS_PTHREAD
+// gtest-port.h guarantees to #include <pthread.h> when GTEST_HAS_PTHREAD is
+// true.
+# include <pthread.h>  // NOLINT
+
+// For timespec and nanosleep, used below.
+# include <time.h>  // NOLINT
+#endif
+
+// Determines whether Google Test can use tr1/tuple.  You can define
+// this macro to 0 to prevent Google Test from using tuple (any
+// feature depending on tuple with be disabled in this mode).
+#ifndef GTEST_HAS_TR1_TUPLE
+# if GTEST_OS_LINUX_ANDROID && defined(_STLPORT_MAJOR)
+// STLport, provided with the Android NDK, has neither <tr1/tuple> or <tuple>.
+#  define GTEST_HAS_TR1_TUPLE 0
+# else
+// The user didn't tell us not to do it, so we assume it's OK.
+#  define GTEST_HAS_TR1_TUPLE 1
+# endif
+#endif  // GTEST_HAS_TR1_TUPLE
+
+// Determines whether Google Test's own tr1 tuple implementation
+// should be used.
+#ifndef GTEST_USE_OWN_TR1_TUPLE
+// The user didn't tell us, so we need to figure it out.
+
+// We use our own TR1 tuple if we aren't sure the user has an
+// implementation of it already.  At this time, libstdc++ 4.0.0+ and
+// MSVC 2010 are the only mainstream standard libraries that come
+// with a TR1 tuple implementation.  NVIDIA's CUDA NVCC compiler
+// pretends to be GCC by defining __GNUC__ and friends, but cannot
+// compile GCC's tuple implementation.  MSVC 2008 (9.0) provides TR1
+// tuple in a 323 MB Feature Pack download, which we cannot assume the
+// user has.  QNX's QCC compiler is a modified GCC but it doesn't
+// support TR1 tuple.  libc++ only provides std::tuple, in C++11 mode,
+// and it can be used with some compilers that define __GNUC__.
+# if (defined(__GNUC__) && !defined(__CUDACC__) && (GTEST_GCC_VER_ >= 40000) \
+      && !GTEST_OS_QNX && !defined(_LIBCPP_VERSION)) || _MSC_VER >= 1600
+#  define GTEST_ENV_HAS_TR1_TUPLE_ 1
+# endif
+
+// C++11 specifies that <tuple> provides std::tuple. Use that if gtest is used
+// in C++11 mode and libstdc++ isn't very old (binaries targeting OS X 10.6
+// can build with clang but need to use gcc4.2's libstdc++).
+# if GTEST_LANG_CXX11 && (!defined(__GLIBCXX__) || __GLIBCXX__ > 20110325)
+#  define GTEST_ENV_HAS_STD_TUPLE_ 1
+# endif
+
+# if GTEST_ENV_HAS_TR1_TUPLE_ || GTEST_ENV_HAS_STD_TUPLE_
+#  define GTEST_USE_OWN_TR1_TUPLE 0
+# else
+#  define GTEST_USE_OWN_TR1_TUPLE 1
+# endif
+
+#endif  // GTEST_USE_OWN_TR1_TUPLE
+
+// To avoid conditional compilation everywhere, we make it
+// gtest-port.h's responsibility to #include the header implementing
+// tr1/tuple.
+#if GTEST_HAS_TR1_TUPLE
+
+# if GTEST_USE_OWN_TR1_TUPLE
+// This file was GENERATED by command:
+//     pump.py gtest-tuple.h.pump
+// DO NOT EDIT BY HAND!!!
+
+// Copyright 2009 Google Inc.
+// All Rights Reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+
+// Implements a subset of TR1 tuple needed by Google Test and Google Mock.
+
+#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TUPLE_H_
+#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TUPLE_H_
+
+#include <utility>  // For ::std::pair.
+
+// The compiler used in Symbian has a bug that prevents us from declaring the
+// tuple template as a friend (it complains that tuple is redefined).  This
+// hack bypasses the bug by declaring the members that should otherwise be
+// private as public.
+// Sun Studio versions < 12 also have the above bug.
+#if defined(__SYMBIAN32__) || (defined(__SUNPRO_CC) && __SUNPRO_CC < 0x590)
+# define GTEST_DECLARE_TUPLE_AS_FRIEND_ public:
+#else
+# define GTEST_DECLARE_TUPLE_AS_FRIEND_ \
+    template <GTEST_10_TYPENAMES_(U)> friend class tuple; \
+   private:
+#endif
+
+// GTEST_n_TUPLE_(T) is the type of an n-tuple.
+#define GTEST_0_TUPLE_(T) tuple<>
+#define GTEST_1_TUPLE_(T) tuple<T##0, void, void, void, void, void, void, \
+    void, void, void>
+#define GTEST_2_TUPLE_(T) tuple<T##0, T##1, void, void, void, void, void, \
+    void, void, void>
+#define GTEST_3_TUPLE_(T) tuple<T##0, T##1, T##2, void, void, void, void, \
+    void, void, void>
+#define GTEST_4_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, void, void, void, \
+    void, void, void>
+#define GTEST_5_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, T##4, void, void, \
+    void, void, void>
+#define GTEST_6_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, T##4, T##5, void, \
+    void, void, void>
+#define GTEST_7_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, T##4, T##5, T##6, \
+    void, void, void>
+#define GTEST_8_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, T##4, T##5, T##6, \
+    T##7, void, void>
+#define GTEST_9_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, T##4, T##5, T##6, \
+    T##7, T##8, void>
+#define GTEST_10_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, T##4, T##5, T##6, \
+    T##7, T##8, T##9>
+
+// GTEST_n_TYPENAMES_(T) declares a list of n typenames.
+#define GTEST_0_TYPENAMES_(T)
+#define GTEST_1_TYPENAMES_(T) typename T##0
+#define GTEST_2_TYPENAMES_(T) typename T##0, typename T##1
+#define GTEST_3_TYPENAMES_(T) typename T##0, typename T##1, typename T##2
+#define GTEST_4_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \
+    typename T##3
+#define GTEST_5_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \
+    typename T##3, typename T##4
+#define GTEST_6_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \
+    typename T##3, typename T##4, typename T##5
+#define GTEST_7_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \
+    typename T##3, typename T##4, typename T##5, typename T##6
+#define GTEST_8_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \
+    typename T##3, typename T##4, typename T##5, typename T##6, typename T##7
+#define GTEST_9_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \
+    typename T##3, typename T##4, typename T##5, typename T##6, \
+    typename T##7, typename T##8
+#define GTEST_10_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \
+    typename T##3, typename T##4, typename T##5, typename T##6, \
+    typename T##7, typename T##8, typename T##9
+
+// In theory, defining stuff in the ::std namespace is undefined
+// behavior.  We can do this as we are playing the role of a standard
+// library vendor.
+namespace std {
+namespace tr1 {
+
+template <typename T0 = void, typename T1 = void, typename T2 = void,
+    typename T3 = void, typename T4 = void, typename T5 = void,
+    typename T6 = void, typename T7 = void, typename T8 = void,
+    typename T9 = void>
+class tuple;
+
+// Anything in namespace gtest_internal is Google Test's INTERNAL
+// IMPLEMENTATION DETAIL and MUST NOT BE USED DIRECTLY in user code.
+namespace gtest_internal {
+
+// ByRef<T>::type is T if T is a reference; otherwise it's const T&.
+template <typename T>
+struct ByRef { typedef const T& type; };  // NOLINT
+template <typename T>
+struct ByRef<T&> { typedef T& type; };  // NOLINT
+
+// A handy wrapper for ByRef.
+#define GTEST_BY_REF_(T) typename ::std::tr1::gtest_internal::ByRef<T>::type
+
+// AddRef<T>::type is T if T is a reference; otherwise it's T&.  This
+// is the same as tr1::add_reference<T>::type.
+template <typename T>
+struct AddRef { typedef T& type; };  // NOLINT
+template <typename T>
+struct AddRef<T&> { typedef T& type; };  // NOLINT
+
+// A handy wrapper for AddRef.
+#define GTEST_ADD_REF_(T) typename ::std::tr1::gtest_internal::AddRef<T>::type
+
+// A helper for implementing get<k>().
+template <int k> class Get;
+
+// A helper for implementing tuple_element<k, T>.  kIndexValid is true
+// iff k < the number of fields in tuple type T.
+template <bool kIndexValid, int kIndex, class Tuple>
+struct TupleElement;
+
+template <GTEST_10_TYPENAMES_(T)>
+struct TupleElement<true, 0, GTEST_10_TUPLE_(T) > {
+  typedef T0 type;
+};
+
+template <GTEST_10_TYPENAMES_(T)>
+struct TupleElement<true, 1, GTEST_10_TUPLE_(T) > {
+  typedef T1 type;
+};
+
+template <GTEST_10_TYPENAMES_(T)>
+struct TupleElement<true, 2, GTEST_10_TUPLE_(T) > {
+  typedef T2 type;
+};
+
+template <GTEST_10_TYPENAMES_(T)>
+struct TupleElement<true, 3, GTEST_10_TUPLE_(T) > {
+  typedef T3 type;
+};
+
+template <GTEST_10_TYPENAMES_(T)>
+struct TupleElement<true, 4, GTEST_10_TUPLE_(T) > {
+  typedef T4 type;
+};
+
+template <GTEST_10_TYPENAMES_(T)>
+struct TupleElement<true, 5, GTEST_10_TUPLE_(T) > {
+  typedef T5 type;
+};
+
+template <GTEST_10_TYPENAMES_(T)>
+struct TupleElement<true, 6, GTEST_10_TUPLE_(T) > {
+  typedef T6 type;
+};
+
+template <GTEST_10_TYPENAMES_(T)>
+struct TupleElement<true, 7, GTEST_10_TUPLE_(T) > {
+  typedef T7 type;
+};
+
+template <GTEST_10_TYPENAMES_(T)>
+struct TupleElement<true, 8, GTEST_10_TUPLE_(T) > {
+  typedef T8 type;
+};
+
+template <GTEST_10_TYPENAMES_(T)>
+struct TupleElement<true, 9, GTEST_10_TUPLE_(T) > {
+  typedef T9 type;
+};
+
+}  // namespace gtest_internal
+
+template <>
+class tuple<> {
+ public:
+  tuple() {}
+  tuple(const tuple& /* t */)  {}
+  tuple& operator=(const tuple& /* t */) { return *this; }
+};
+
+template <GTEST_1_TYPENAMES_(T)>
+class GTEST_1_TUPLE_(T) {
+ public:
+  template <int k> friend class gtest_internal::Get;
+
+  tuple() : f0_() {}
+
+  explicit tuple(GTEST_BY_REF_(T0) f0) : f0_(f0) {}
+
+  tuple(const tuple& t) : f0_(t.f0_) {}
+
+  template <GTEST_1_TYPENAMES_(U)>
+  tuple(const GTEST_1_TUPLE_(U)& t) : f0_(t.f0_) {}
+
+  tuple& operator=(const tuple& t) { return CopyFrom(t); }
+
+  template <GTEST_1_TYPENAMES_(U)>
+  tuple& operator=(const GTEST_1_TUPLE_(U)& t) {
+    return CopyFrom(t);
+  }
+
+  GTEST_DECLARE_TUPLE_AS_FRIEND_
+
+  template <GTEST_1_TYPENAMES_(U)>
+  tuple& CopyFrom(const GTEST_1_TUPLE_(U)& t) {
+    f0_ = t.f0_;
+    return *this;
+  }
+
+  T0 f0_;
+};
+
+template <GTEST_2_TYPENAMES_(T)>
+class GTEST_2_TUPLE_(T) {
+ public:
+  template <int k> friend class gtest_internal::Get;
+
+  tuple() : f0_(), f1_() {}
+
+  explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1) : f0_(f0),
+      f1_(f1) {}
+
+  tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_) {}
+
+  template <GTEST_2_TYPENAMES_(U)>
+  tuple(const GTEST_2_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_) {}
+  template <typename U0, typename U1>
+  tuple(const ::std::pair<U0, U1>& p) : f0_(p.first), f1_(p.second) {}
+
+  tuple& operator=(const tuple& t) { return CopyFrom(t); }
+
+  template <GTEST_2_TYPENAMES_(U)>
+  tuple& operator=(const GTEST_2_TUPLE_(U)& t) {
+    return CopyFrom(t);
+  }
+  template <typename U0, typename U1>
+  tuple& operator=(const ::std::pair<U0, U1>& p) {
+    f0_ = p.first;
+    f1_ = p.second;
+    return *this;
+  }
+
+  GTEST_DECLARE_TUPLE_AS_FRIEND_
+
+  template <GTEST_2_TYPENAMES_(U)>
+  tuple& CopyFrom(const GTEST_2_TUPLE_(U)& t) {
+    f0_ = t.f0_;
+    f1_ = t.f1_;
+    return *this;
+  }
+
+  T0 f0_;
+  T1 f1_;
+};
+
+template <GTEST_3_TYPENAMES_(T)>
+class GTEST_3_TUPLE_(T) {
+ public:
+  template <int k> friend class gtest_internal::Get;
+
+  tuple() : f0_(), f1_(), f2_() {}
+
+  explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,
+      GTEST_BY_REF_(T2) f2) : f0_(f0), f1_(f1), f2_(f2) {}
+
+  tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_) {}
+
+  template <GTEST_3_TYPENAMES_(U)>
+  tuple(const GTEST_3_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_) {}
+
+  tuple& operator=(const tuple& t) { return CopyFrom(t); }
+
+  template <GTEST_3_TYPENAMES_(U)>
+  tuple& operator=(const GTEST_3_TUPLE_(U)& t) {
+    return CopyFrom(t);
+  }
+
+  GTEST_DECLARE_TUPLE_AS_FRIEND_
+
+  template <GTEST_3_TYPENAMES_(U)>
+  tuple& CopyFrom(const GTEST_3_TUPLE_(U)& t) {
+    f0_ = t.f0_;
+    f1_ = t.f1_;
+    f2_ = t.f2_;
+    return *this;
+  }
+
+  T0 f0_;
+  T1 f1_;
+  T2 f2_;
+};
+
+template <GTEST_4_TYPENAMES_(T)>
+class GTEST_4_TUPLE_(T) {
+ public:
+  template <int k> friend class gtest_internal::Get;
+
+  tuple() : f0_(), f1_(), f2_(), f3_() {}
+
+  explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,
+      GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3) : f0_(f0), f1_(f1), f2_(f2),
+      f3_(f3) {}
+
+  tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_) {}
+
+  template <GTEST_4_TYPENAMES_(U)>
+  tuple(const GTEST_4_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_),
+      f3_(t.f3_) {}
+
+  tuple& operator=(const tuple& t) { return CopyFrom(t); }
+
+  template <GTEST_4_TYPENAMES_(U)>
+  tuple& operator=(const GTEST_4_TUPLE_(U)& t) {
+    return CopyFrom(t);
+  }
+
+  GTEST_DECLARE_TUPLE_AS_FRIEND_
+
+  template <GTEST_4_TYPENAMES_(U)>
+  tuple& CopyFrom(const GTEST_4_TUPLE_(U)& t) {
+    f0_ = t.f0_;
+    f1_ = t.f1_;
+    f2_ = t.f2_;
+    f3_ = t.f3_;
+    return *this;
+  }
+
+  T0 f0_;
+  T1 f1_;
+  T2 f2_;
+  T3 f3_;
+};
+
+template <GTEST_5_TYPENAMES_(T)>
+class GTEST_5_TUPLE_(T) {
+ public:
+  template <int k> friend class gtest_internal::Get;
+
+  tuple() : f0_(), f1_(), f2_(), f3_(), f4_() {}
+
+  explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,
+      GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3,
+      GTEST_BY_REF_(T4) f4) : f0_(f0), f1_(f1), f2_(f2), f3_(f3), f4_(f4) {}
+
+  tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_),
+      f4_(t.f4_) {}
+
+  template <GTEST_5_TYPENAMES_(U)>
+  tuple(const GTEST_5_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_),
+      f3_(t.f3_), f4_(t.f4_) {}
+
+  tuple& operator=(const tuple& t) { return CopyFrom(t); }
+
+  template <GTEST_5_TYPENAMES_(U)>
+  tuple& operator=(const GTEST_5_TUPLE_(U)& t) {
+    return CopyFrom(t);
+  }
+
+  GTEST_DECLARE_TUPLE_AS_FRIEND_
+
+  template <GTEST_5_TYPENAMES_(U)>
+  tuple& CopyFrom(const GTEST_5_TUPLE_(U)& t) {
+    f0_ = t.f0_;
+    f1_ = t.f1_;
+    f2_ = t.f2_;
+    f3_ = t.f3_;
+    f4_ = t.f4_;
+    return *this;
+  }
+
+  T0 f0_;
+  T1 f1_;
+  T2 f2_;
+  T3 f3_;
+  T4 f4_;
+};
+
+template <GTEST_6_TYPENAMES_(T)>
+class GTEST_6_TUPLE_(T) {
+ public:
+  template <int k> friend class gtest_internal::Get;
+
+  tuple() : f0_(), f1_(), f2_(), f3_(), f4_(), f5_() {}
+
+  explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,
+      GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3, GTEST_BY_REF_(T4) f4,
+      GTEST_BY_REF_(T5) f5) : f0_(f0), f1_(f1), f2_(f2), f3_(f3), f4_(f4),
+      f5_(f5) {}
+
+  tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_),
+      f4_(t.f4_), f5_(t.f5_) {}
+
+  template <GTEST_6_TYPENAMES_(U)>
+  tuple(const GTEST_6_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_),
+      f3_(t.f3_), f4_(t.f4_), f5_(t.f5_) {}
+
+  tuple& operator=(const tuple& t) { return CopyFrom(t); }
+
+  template <GTEST_6_TYPENAMES_(U)>
+  tuple& operator=(const GTEST_6_TUPLE_(U)& t) {
+    return CopyFrom(t);
+  }
+
+  GTEST_DECLARE_TUPLE_AS_FRIEND_
+
+  template <GTEST_6_TYPENAMES_(U)>
+  tuple& CopyFrom(const GTEST_6_TUPLE_(U)& t) {
+    f0_ = t.f0_;
+    f1_ = t.f1_;
+    f2_ = t.f2_;
+    f3_ = t.f3_;
+    f4_ = t.f4_;
+    f5_ = t.f5_;
+    return *this;
+  }
+
+  T0 f0_;
+  T1 f1_;
+  T2 f2_;
+  T3 f3_;
+  T4 f4_;
+  T5 f5_;
+};
+
+template <GTEST_7_TYPENAMES_(T)>
+class GTEST_7_TUPLE_(T) {
+ public:
+  template <int k> friend class gtest_internal::Get;
+
+  tuple() : f0_(), f1_(), f2_(), f3_(), f4_(), f5_(), f6_() {}
+
+  explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,
+      GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3, GTEST_BY_REF_(T4) f4,
+      GTEST_BY_REF_(T5) f5, GTEST_BY_REF_(T6) f6) : f0_(f0), f1_(f1), f2_(f2),
+      f3_(f3), f4_(f4), f5_(f5), f6_(f6) {}
+
+  tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_),
+      f4_(t.f4_), f5_(t.f5_), f6_(t.f6_) {}
+
+  template <GTEST_7_TYPENAMES_(U)>
+  tuple(const GTEST_7_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_),
+      f3_(t.f3_), f4_(t.f4_), f5_(t.f5_), f6_(t.f6_) {}
+
+  tuple& operator=(const tuple& t) { return CopyFrom(t); }
+
+  template <GTEST_7_TYPENAMES_(U)>
+  tuple& operator=(const GTEST_7_TUPLE_(U)& t) {
+    return CopyFrom(t);
+  }
+
+  GTEST_DECLARE_TUPLE_AS_FRIEND_
+
+  template <GTEST_7_TYPENAMES_(U)>
+  tuple& CopyFrom(const GTEST_7_TUPLE_(U)& t) {
+    f0_ = t.f0_;
+    f1_ = t.f1_;
+    f2_ = t.f2_;
+    f3_ = t.f3_;
+    f4_ = t.f4_;
+    f5_ = t.f5_;
+    f6_ = t.f6_;
+    return *this;
+  }
+
+  T0 f0_;
+  T1 f1_;
+  T2 f2_;
+  T3 f3_;
+  T4 f4_;
+  T5 f5_;
+  T6 f6_;
+};
+
+template <GTEST_8_TYPENAMES_(T)>
+class GTEST_8_TUPLE_(T) {
+ public:
+  template <int k> friend class gtest_internal::Get;
+
+  tuple() : f0_(), f1_(), f2_(), f3_(), f4_(), f5_(), f6_(), f7_() {}
+
+  explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,
+      GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3, GTEST_BY_REF_(T4) f4,
+      GTEST_BY_REF_(T5) f5, GTEST_BY_REF_(T6) f6,
+      GTEST_BY_REF_(T7) f7) : f0_(f0), f1_(f1), f2_(f2), f3_(f3), f4_(f4),
+      f5_(f5), f6_(f6), f7_(f7) {}
+
+  tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_),
+      f4_(t.f4_), f5_(t.f5_), f6_(t.f6_), f7_(t.f7_) {}
+
+  template <GTEST_8_TYPENAMES_(U)>
+  tuple(const GTEST_8_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_),
+      f3_(t.f3_), f4_(t.f4_), f5_(t.f5_), f6_(t.f6_), f7_(t.f7_) {}
+
+  tuple& operator=(const tuple& t) { return CopyFrom(t); }
+
+  template <GTEST_8_TYPENAMES_(U)>
+  tuple& operator=(const GTEST_8_TUPLE_(U)& t) {
+    return CopyFrom(t);
+  }
+
+  GTEST_DECLARE_TUPLE_AS_FRIEND_
+
+  template <GTEST_8_TYPENAMES_(U)>
+  tuple& CopyFrom(const GTEST_8_TUPLE_(U)& t) {
+    f0_ = t.f0_;
+    f1_ = t.f1_;
+    f2_ = t.f2_;
+    f3_ = t.f3_;
+    f4_ = t.f4_;
+    f5_ = t.f5_;
+    f6_ = t.f6_;
+    f7_ = t.f7_;
+    return *this;
+  }
+
+  T0 f0_;
+  T1 f1_;
+  T2 f2_;
+  T3 f3_;
+  T4 f4_;
+  T5 f5_;
+  T6 f6_;
+  T7 f7_;
+};
+
+template <GTEST_9_TYPENAMES_(T)>
+class GTEST_9_TUPLE_(T) {
+ public:
+  template <int k> friend class gtest_internal::Get;
+
+  tuple() : f0_(), f1_(), f2_(), f3_(), f4_(), f5_(), f6_(), f7_(), f8_() {}
+
+  explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,
+      GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3, GTEST_BY_REF_(T4) f4,
+      GTEST_BY_REF_(T5) f5, GTEST_BY_REF_(T6) f6, GTEST_BY_REF_(T7) f7,
+      GTEST_BY_REF_(T8) f8) : f0_(f0), f1_(f1), f2_(f2), f3_(f3), f4_(f4),
+      f5_(f5), f6_(f6), f7_(f7), f8_(f8) {}
+
+  tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_),
+      f4_(t.f4_), f5_(t.f5_), f6_(t.f6_), f7_(t.f7_), f8_(t.f8_) {}
+
+  template <GTEST_9_TYPENAMES_(U)>
+  tuple(const GTEST_9_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_),
+      f3_(t.f3_), f4_(t.f4_), f5_(t.f5_), f6_(t.f6_), f7_(t.f7_), f8_(t.f8_) {}
+
+  tuple& operator=(const tuple& t) { return CopyFrom(t); }
+
+  template <GTEST_9_TYPENAMES_(U)>
+  tuple& operator=(const GTEST_9_TUPLE_(U)& t) {
+    return CopyFrom(t);
+  }
+
+  GTEST_DECLARE_TUPLE_AS_FRIEND_
+
+  template <GTEST_9_TYPENAMES_(U)>
+  tuple& CopyFrom(const GTEST_9_TUPLE_(U)& t) {
+    f0_ = t.f0_;
+    f1_ = t.f1_;
+    f2_ = t.f2_;
+    f3_ = t.f3_;
+    f4_ = t.f4_;
+    f5_ = t.f5_;
+    f6_ = t.f6_;
+    f7_ = t.f7_;
+    f8_ = t.f8_;
+    return *this;
+  }
+
+  T0 f0_;
+  T1 f1_;
+  T2 f2_;
+  T3 f3_;
+  T4 f4_;
+  T5 f5_;
+  T6 f6_;
+  T7 f7_;
+  T8 f8_;
+};
+
+template <GTEST_10_TYPENAMES_(T)>
+class tuple {
+ public:
+  template <int k> friend class gtest_internal::Get;
+
+  tuple() : f0_(), f1_(), f2_(), f3_(), f4_(), f5_(), f6_(), f7_(), f8_(),
+      f9_() {}
+
+  explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,
+      GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3, GTEST_BY_REF_(T4) f4,
+      GTEST_BY_REF_(T5) f5, GTEST_BY_REF_(T6) f6, GTEST_BY_REF_(T7) f7,
+      GTEST_BY_REF_(T8) f8, GTEST_BY_REF_(T9) f9) : f0_(f0), f1_(f1), f2_(f2),
+      f3_(f3), f4_(f4), f5_(f5), f6_(f6), f7_(f7), f8_(f8), f9_(f9) {}
+
+  tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_),
+      f4_(t.f4_), f5_(t.f5_), f6_(t.f6_), f7_(t.f7_), f8_(t.f8_), f9_(t.f9_) {}
+
+  template <GTEST_10_TYPENAMES_(U)>
+  tuple(const GTEST_10_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_),
+      f3_(t.f3_), f4_(t.f4_), f5_(t.f5_), f6_(t.f6_), f7_(t.f7_), f8_(t.f8_),
+      f9_(t.f9_) {}
+
+  tuple& operator=(const tuple& t) { return CopyFrom(t); }
+
+  template <GTEST_10_TYPENAMES_(U)>
+  tuple& operator=(const GTEST_10_TUPLE_(U)& t) {
+    return CopyFrom(t);
+  }
+
+  GTEST_DECLARE_TUPLE_AS_FRIEND_
+
+  template <GTEST_10_TYPENAMES_(U)>
+  tuple& CopyFrom(const GTEST_10_TUPLE_(U)& t) {
+    f0_ = t.f0_;
+    f1_ = t.f1_;
+    f2_ = t.f2_;
+    f3_ = t.f3_;
+    f4_ = t.f4_;
+    f5_ = t.f5_;
+    f6_ = t.f6_;
+    f7_ = t.f7_;
+    f8_ = t.f8_;
+    f9_ = t.f9_;
+    return *this;
+  }
+
+  T0 f0_;
+  T1 f1_;
+  T2 f2_;
+  T3 f3_;
+  T4 f4_;
+  T5 f5_;
+  T6 f6_;
+  T7 f7_;
+  T8 f8_;
+  T9 f9_;
+};
+
+// 6.1.3.2 Tuple creation functions.
+
+// Known limitations: we don't support passing an
+// std::tr1::reference_wrapper<T> to make_tuple().  And we don't
+// implement tie().
+
+inline tuple<> make_tuple() { return tuple<>(); }
+
+template <GTEST_1_TYPENAMES_(T)>
+inline GTEST_1_TUPLE_(T) make_tuple(const T0& f0) {
+  return GTEST_1_TUPLE_(T)(f0);
+}
+
+template <GTEST_2_TYPENAMES_(T)>
+inline GTEST_2_TUPLE_(T) make_tuple(const T0& f0, const T1& f1) {
+  return GTEST_2_TUPLE_(T)(f0, f1);
+}
+
+template <GTEST_3_TYPENAMES_(T)>
+inline GTEST_3_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2) {
+  return GTEST_3_TUPLE_(T)(f0, f1, f2);
+}
+
+template <GTEST_4_TYPENAMES_(T)>
+inline GTEST_4_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2,
+    const T3& f3) {
+  return GTEST_4_TUPLE_(T)(f0, f1, f2, f3);
+}
+
+template <GTEST_5_TYPENAMES_(T)>
+inline GTEST_5_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2,
+    const T3& f3, const T4& f4) {
+  return GTEST_5_TUPLE_(T)(f0, f1, f2, f3, f4);
+}
+
+template <GTEST_6_TYPENAMES_(T)>
+inline GTEST_6_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2,
+    const T3& f3, const T4& f4, const T5& f5) {
+  return GTEST_6_TUPLE_(T)(f0, f1, f2, f3, f4, f5);
+}
+
+template <GTEST_7_TYPENAMES_(T)>
+inline GTEST_7_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2,
+    const T3& f3, const T4& f4, const T5& f5, const T6& f6) {
+  return GTEST_7_TUPLE_(T)(f0, f1, f2, f3, f4, f5, f6);
+}
+
+template <GTEST_8_TYPENAMES_(T)>
+inline GTEST_8_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2,
+    const T3& f3, const T4& f4, const T5& f5, const T6& f6, const T7& f7) {
+  return GTEST_8_TUPLE_(T)(f0, f1, f2, f3, f4, f5, f6, f7);
+}
+
+template <GTEST_9_TYPENAMES_(T)>
+inline GTEST_9_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2,
+    const T3& f3, const T4& f4, const T5& f5, const T6& f6, const T7& f7,
+    const T8& f8) {
+  return GTEST_9_TUPLE_(T)(f0, f1, f2, f3, f4, f5, f6, f7, f8);
+}
+
+template <GTEST_10_TYPENAMES_(T)>
+inline GTEST_10_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2,
+    const T3& f3, const T4& f4, const T5& f5, const T6& f6, const T7& f7,
+    const T8& f8, const T9& f9) {
+  return GTEST_10_TUPLE_(T)(f0, f1, f2, f3, f4, f5, f6, f7, f8, f9);
+}
+
+// 6.1.3.3 Tuple helper classes.
+
+template <typename Tuple> struct tuple_size;
+
+template <GTEST_0_TYPENAMES_(T)>
+struct tuple_size<GTEST_0_TUPLE_(T) > {
+  static const int value = 0;
+};
+
+template <GTEST_1_TYPENAMES_(T)>
+struct tuple_size<GTEST_1_TUPLE_(T) > {
+  static const int value = 1;
+};
+
+template <GTEST_2_TYPENAMES_(T)>
+struct tuple_size<GTEST_2_TUPLE_(T) > {
+  static const int value = 2;
+};
+
+template <GTEST_3_TYPENAMES_(T)>
+struct tuple_size<GTEST_3_TUPLE_(T) > {
+  static const int value = 3;
+};
+
+template <GTEST_4_TYPENAMES_(T)>
+struct tuple_size<GTEST_4_TUPLE_(T) > {
+  static const int value = 4;
+};
+
+template <GTEST_5_TYPENAMES_(T)>
+struct tuple_size<GTEST_5_TUPLE_(T) > {
+  static const int value = 5;
+};
+
+template <GTEST_6_TYPENAMES_(T)>
+struct tuple_size<GTEST_6_TUPLE_(T) > {
+  static const int value = 6;
+};
+
+template <GTEST_7_TYPENAMES_(T)>
+struct tuple_size<GTEST_7_TUPLE_(T) > {
+  static const int value = 7;
+};
+
+template <GTEST_8_TYPENAMES_(T)>
+struct tuple_size<GTEST_8_TUPLE_(T) > {
+  static const int value = 8;
+};
+
+template <GTEST_9_TYPENAMES_(T)>
+struct tuple_size<GTEST_9_TUPLE_(T) > {
+  static const int value = 9;
+};
+
+template <GTEST_10_TYPENAMES_(T)>
+struct tuple_size<GTEST_10_TUPLE_(T) > {
+  static const int value = 10;
+};
+
+template <int k, class Tuple>
+struct tuple_element {
+  typedef typename gtest_internal::TupleElement<
+      k < (tuple_size<Tuple>::value), k, Tuple>::type type;
+};
+
+#define GTEST_TUPLE_ELEMENT_(k, Tuple) typename tuple_element<k, Tuple >::type
+
+// 6.1.3.4 Element access.
+
+namespace gtest_internal {
+
+template <>
+class Get<0> {
+ public:
+  template <class Tuple>
+  static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(0, Tuple))
+  Field(Tuple& t) { return t.f0_; }  // NOLINT
+
+  template <class Tuple>
+  static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(0, Tuple))
+  ConstField(const Tuple& t) { return t.f0_; }
+};
+
+template <>
+class Get<1> {
+ public:
+  template <class Tuple>
+  static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(1, Tuple))
+  Field(Tuple& t) { return t.f1_; }  // NOLINT
+
+  template <class Tuple>
+  static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(1, Tuple))
+  ConstField(const Tuple& t) { return t.f1_; }
+};
+
+template <>
+class Get<2> {
+ public:
+  template <class Tuple>
+  static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(2, Tuple))
+  Field(Tuple& t) { return t.f2_; }  // NOLINT
+
+  template <class Tuple>
+  static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(2, Tuple))
+  ConstField(const Tuple& t) { return t.f2_; }
+};
+
+template <>
+class Get<3> {
+ public:
+  template <class Tuple>
+  static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(3, Tuple))
+  Field(Tuple& t) { return t.f3_; }  // NOLINT
+
+  template <class Tuple>
+  static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(3, Tuple))
+  ConstField(const Tuple& t) { return t.f3_; }
+};
+
+template <>
+class Get<4> {
+ public:
+  template <class Tuple>
+  static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(4, Tuple))
+  Field(Tuple& t) { return t.f4_; }  // NOLINT
+
+  template <class Tuple>
+  static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(4, Tuple))
+  ConstField(const Tuple& t) { return t.f4_; }
+};
+
+template <>
+class Get<5> {
+ public:
+  template <class Tuple>
+  static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(5, Tuple))
+  Field(Tuple& t) { return t.f5_; }  // NOLINT
+
+  template <class Tuple>
+  static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(5, Tuple))
+  ConstField(const Tuple& t) { return t.f5_; }
+};
+
+template <>
+class Get<6> {
+ public:
+  template <class Tuple>
+  static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(6, Tuple))
+  Field(Tuple& t) { return t.f6_; }  // NOLINT
+
+  template <class Tuple>
+  static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(6, Tuple))
+  ConstField(const Tuple& t) { return t.f6_; }
+};
+
+template <>
+class Get<7> {
+ public:
+  template <class Tuple>
+  static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(7, Tuple))
+  Field(Tuple& t) { return t.f7_; }  // NOLINT
+
+  template <class Tuple>
+  static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(7, Tuple))
+  ConstField(const Tuple& t) { return t.f7_; }
+};
+
+template <>
+class Get<8> {
+ public:
+  template <class Tuple>
+  static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(8, Tuple))
+  Field(Tuple& t) { return t.f8_; }  // NOLINT
+
+  template <class Tuple>
+  static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(8, Tuple))
+  ConstField(const Tuple& t) { return t.f8_; }
+};
+
+template <>
+class Get<9> {
+ public:
+  template <class Tuple>
+  static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(9, Tuple))
+  Field(Tuple& t) { return t.f9_; }  // NOLINT
+
+  template <class Tuple>
+  static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(9, Tuple))
+  ConstField(const Tuple& t) { return t.f9_; }
+};
+
+}  // namespace gtest_internal
+
+template <int k, GTEST_10_TYPENAMES_(T)>
+GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(k, GTEST_10_TUPLE_(T)))
+get(GTEST_10_TUPLE_(T)& t) {
+  return gtest_internal::Get<k>::Field(t);
+}
+
+template <int k, GTEST_10_TYPENAMES_(T)>
+GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(k,  GTEST_10_TUPLE_(T)))
+get(const GTEST_10_TUPLE_(T)& t) {
+  return gtest_internal::Get<k>::ConstField(t);
+}
+
+// 6.1.3.5 Relational operators
+
+// We only implement == and !=, as we don't have a need for the rest yet.
+
+namespace gtest_internal {
+
+// SameSizeTuplePrefixComparator<k, k>::Eq(t1, t2) returns true if the
+// first k fields of t1 equals the first k fields of t2.
+// SameSizeTuplePrefixComparator(k1, k2) would be a compiler error if
+// k1 != k2.
+template <int kSize1, int kSize2>
+struct SameSizeTuplePrefixComparator;
+
+template <>
+struct SameSizeTuplePrefixComparator<0, 0> {
+  template <class Tuple1, class Tuple2>
+  static bool Eq(const Tuple1& /* t1 */, const Tuple2& /* t2 */) {
+    return true;
+  }
+};
+
+template <int k>
+struct SameSizeTuplePrefixComparator<k, k> {
+  template <class Tuple1, class Tuple2>
+  static bool Eq(const Tuple1& t1, const Tuple2& t2) {
+    return SameSizeTuplePrefixComparator<k - 1, k - 1>::Eq(t1, t2) &&
+        ::std::tr1::get<k - 1>(t1) == ::std::tr1::get<k - 1>(t2);
+  }
+};
+
+}  // namespace gtest_internal
+
+template <GTEST_10_TYPENAMES_(T), GTEST_10_TYPENAMES_(U)>
+inline bool operator==(const GTEST_10_TUPLE_(T)& t,
+                       const GTEST_10_TUPLE_(U)& u) {
+  return gtest_internal::SameSizeTuplePrefixComparator<
+      tuple_size<GTEST_10_TUPLE_(T) >::value,
+      tuple_size<GTEST_10_TUPLE_(U) >::value>::Eq(t, u);
+}
+
+template <GTEST_10_TYPENAMES_(T), GTEST_10_TYPENAMES_(U)>
+inline bool operator!=(const GTEST_10_TUPLE_(T)& t,
+                       const GTEST_10_TUPLE_(U)& u) { return !(t == u); }
+
+// 6.1.4 Pairs.
+// Unimplemented.
+
+}  // namespace tr1
+}  // namespace std
+
+#undef GTEST_0_TUPLE_
+#undef GTEST_1_TUPLE_
+#undef GTEST_2_TUPLE_
+#undef GTEST_3_TUPLE_
+#undef GTEST_4_TUPLE_
+#undef GTEST_5_TUPLE_
+#undef GTEST_6_TUPLE_
+#undef GTEST_7_TUPLE_
+#undef GTEST_8_TUPLE_
+#undef GTEST_9_TUPLE_
+#undef GTEST_10_TUPLE_
+
+#undef GTEST_0_TYPENAMES_
+#undef GTEST_1_TYPENAMES_
+#undef GTEST_2_TYPENAMES_
+#undef GTEST_3_TYPENAMES_
+#undef GTEST_4_TYPENAMES_
+#undef GTEST_5_TYPENAMES_
+#undef GTEST_6_TYPENAMES_
+#undef GTEST_7_TYPENAMES_
+#undef GTEST_8_TYPENAMES_
+#undef GTEST_9_TYPENAMES_
+#undef GTEST_10_TYPENAMES_
+
+#undef GTEST_DECLARE_TUPLE_AS_FRIEND_
+#undef GTEST_BY_REF_
+#undef GTEST_ADD_REF_
+#undef GTEST_TUPLE_ELEMENT_
+
+#endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TUPLE_H_
+# elif GTEST_ENV_HAS_STD_TUPLE_
+#  include <tuple>
+// C++11 puts its tuple into the ::std namespace rather than
+// ::std::tr1.  gtest expects tuple to live in ::std::tr1, so put it there.
+// This causes undefined behavior, but supported compilers react in
+// the way we intend.
+namespace std {
+namespace tr1 {
+using ::std::get;
+using ::std::make_tuple;
+using ::std::tuple;
+using ::std::tuple_element;
+using ::std::tuple_size;
+}
+}
+
+# elif GTEST_OS_SYMBIAN
+
+// On Symbian, BOOST_HAS_TR1_TUPLE causes Boost's TR1 tuple library to
+// use STLport's tuple implementation, which unfortunately doesn't
+// work as the copy of STLport distributed with Symbian is incomplete.
+// By making sure BOOST_HAS_TR1_TUPLE is undefined, we force Boost to
+// use its own tuple implementation.
+#  ifdef BOOST_HAS_TR1_TUPLE
+#   undef BOOST_HAS_TR1_TUPLE
+#  endif  // BOOST_HAS_TR1_TUPLE
+
+// This prevents <boost/tr1/detail/config.hpp>, which defines
+// BOOST_HAS_TR1_TUPLE, from being #included by Boost's <tuple>.
+#  define BOOST_TR1_DETAIL_CONFIG_HPP_INCLUDED
+#  include <tuple>
+
+# elif defined(__GNUC__) && (GTEST_GCC_VER_ >= 40000)
+// GCC 4.0+ implements tr1/tuple in the <tr1/tuple> header.  This does
+// not conform to the TR1 spec, which requires the header to be <tuple>.
+
+#  if !GTEST_HAS_RTTI && GTEST_GCC_VER_ < 40302
+// Until version 4.3.2, gcc has a bug that causes <tr1/functional>,
+// which is #included by <tr1/tuple>, to not compile when RTTI is
+// disabled.  _TR1_FUNCTIONAL is the header guard for
+// <tr1/functional>.  Hence the following #define is a hack to prevent
+// <tr1/functional> from being included.
+#   define _TR1_FUNCTIONAL 1
+#   include <tr1/tuple>
+#   undef _TR1_FUNCTIONAL  // Allows the user to #include
+                        // <tr1/functional> if he chooses to.
+#  else
+#   include <tr1/tuple>  // NOLINT
+#  endif  // !GTEST_HAS_RTTI && GTEST_GCC_VER_ < 40302
+
+# else
+// If the compiler is not GCC 4.0+, we assume the user is using a
+// spec-conforming TR1 implementation.
+#  include <tuple>  // NOLINT
+# endif  // GTEST_USE_OWN_TR1_TUPLE
+
+#endif  // GTEST_HAS_TR1_TUPLE
+
+// Determines whether clone(2) is supported.
+// Usually it will only be available on Linux, excluding
+// Linux on the Itanium architecture.
+// Also see http://linux.die.net/man/2/clone.
+#ifndef GTEST_HAS_CLONE
+// The user didn't tell us, so we need to figure it out.
+
+# if GTEST_OS_LINUX && !defined(__ia64__)
+#  if GTEST_OS_LINUX_ANDROID
+// On Android, clone() is only available on ARM starting with Gingerbread.
+#    if defined(__arm__) && __ANDROID_API__ >= 9
+#     define GTEST_HAS_CLONE 1
+#    else
+#     define GTEST_HAS_CLONE 0
+#    endif
+#  else
+#   define GTEST_HAS_CLONE 1
+#  endif
+# else
+#  define GTEST_HAS_CLONE 0
+# endif  // GTEST_OS_LINUX && !defined(__ia64__)
+
+#endif  // GTEST_HAS_CLONE
+
+// Determines whether to support stream redirection. This is used to test
+// output correctness and to implement death tests.
+#ifndef GTEST_HAS_STREAM_REDIRECTION
+// By default, we assume that stream redirection is supported on all
+// platforms except known mobile ones.
+# if GTEST_OS_WINDOWS_MOBILE || GTEST_OS_SYMBIAN
+#  define GTEST_HAS_STREAM_REDIRECTION 0
+# else
+#  define GTEST_HAS_STREAM_REDIRECTION 1
+# endif  // !GTEST_OS_WINDOWS_MOBILE && !GTEST_OS_SYMBIAN
+#endif  // GTEST_HAS_STREAM_REDIRECTION
+
+// Determines whether to support death tests.
+// Google Test does not support death tests for VC 7.1 and earlier as
+// abort() in a VC 7.1 application compiled as GUI in debug config
+// pops up a dialog window that cannot be suppressed programmatically.
+#if (GTEST_OS_LINUX || GTEST_OS_CYGWIN || GTEST_OS_SOLARIS || \
+     (GTEST_OS_MAC && !GTEST_OS_IOS) || GTEST_OS_IOS_SIMULATOR || \
+     (GTEST_OS_WINDOWS_DESKTOP && _MSC_VER >= 1400) || \
+     GTEST_OS_WINDOWS_MINGW || GTEST_OS_AIX || GTEST_OS_HPUX || \
+     GTEST_OS_OPENBSD || GTEST_OS_QNX)
+# define GTEST_HAS_DEATH_TEST 1
+# include <vector>  // NOLINT
+#endif
+
+// We don't support MSVC 7.1 with exceptions disabled now.  Therefore
+// all the compilers we care about are adequate for supporting
+// value-parameterized tests.
+#define GTEST_HAS_PARAM_TEST 1
+
+// Determines whether to support type-driven tests.
+
+// Typed tests need <typeinfo> and variadic macros, which GCC, VC++ 8.0,
+// Sun Pro CC, IBM Visual Age, and HP aCC support.
+#if defined(__GNUC__) || (_MSC_VER >= 1400) || defined(__SUNPRO_CC) || \
+    defined(__IBMCPP__) || defined(__HP_aCC)
+# define GTEST_HAS_TYPED_TEST 1
+# define GTEST_HAS_TYPED_TEST_P 1
+#endif
+
+// Determines whether to support Combine(). This only makes sense when
+// value-parameterized tests are enabled.  The implementation doesn't
+// work on Sun Studio since it doesn't understand templated conversion
+// operators.
+#if GTEST_HAS_PARAM_TEST && GTEST_HAS_TR1_TUPLE && !defined(__SUNPRO_CC)
+# define GTEST_HAS_COMBINE 1
+#endif
+
+// Determines whether the system compiler uses UTF-16 for encoding wide strings.
+#define GTEST_WIDE_STRING_USES_UTF16_ \
+    (GTEST_OS_WINDOWS || GTEST_OS_CYGWIN || GTEST_OS_SYMBIAN || GTEST_OS_AIX)
+
+// Determines whether test results can be streamed to a socket.
+#if GTEST_OS_LINUX
+# define GTEST_CAN_STREAM_RESULTS_ 1
+#endif
+
+// Defines some utility macros.
+
+// The GNU compiler emits a warning if nested "if" statements are followed by
+// an "else" statement and braces are not used to explicitly disambiguate the
+// "else" binding.  This leads to problems with code like:
+//
+//   if (gate)
+//     ASSERT_*(condition) << "Some message";
+//
+// The "switch (0) case 0:" idiom is used to suppress this.
+#ifdef __INTEL_COMPILER
+# define GTEST_AMBIGUOUS_ELSE_BLOCKER_
+#else
+# define GTEST_AMBIGUOUS_ELSE_BLOCKER_ switch (0) case 0: default:  // NOLINT
+#endif
+
+// Use this annotation at the end of a struct/class definition to
+// prevent the compiler from optimizing away instances that are never
+// used.  This is useful when all interesting logic happens inside the
+// c'tor and / or d'tor.  Example:
+//
+//   struct Foo {
+//     Foo() { ... }
+//   } GTEST_ATTRIBUTE_UNUSED_;
+//
+// Also use it after a variable or parameter declaration to tell the
+// compiler the variable/parameter does not have to be used.
+#if defined(__GNUC__) && !defined(COMPILER_ICC)
+# define GTEST_ATTRIBUTE_UNUSED_ __attribute__ ((unused))
+#else
+# define GTEST_ATTRIBUTE_UNUSED_
+#endif
+
+// A macro to disallow operator=
+// This should be used in the private: declarations for a class.
+#define GTEST_DISALLOW_ASSIGN_(type)\
+  void operator=(type const &)
+
+// A macro to disallow copy constructor and operator=
+// This should be used in the private: declarations for a class.
+#define GTEST_DISALLOW_COPY_AND_ASSIGN_(type)\
+  type(type const &);\
+  GTEST_DISALLOW_ASSIGN_(type)
+
+// Tell the compiler to warn about unused return values for functions declared
+// with this macro.  The macro should be used on function declarations
+// following the argument list:
+//
+//   Sprocket* AllocateSprocket() GTEST_MUST_USE_RESULT_;
+#if defined(__GNUC__) && (GTEST_GCC_VER_ >= 30400) && !defined(COMPILER_ICC)
+# define GTEST_MUST_USE_RESULT_ __attribute__ ((warn_unused_result))
+#else
+# define GTEST_MUST_USE_RESULT_
+#endif  // __GNUC__ && (GTEST_GCC_VER_ >= 30400) && !COMPILER_ICC
+
+// Determine whether the compiler supports Microsoft's Structured Exception
+// Handling.  This is supported by several Windows compilers but generally
+// does not exist on any other system.
+#ifndef GTEST_HAS_SEH
+// The user didn't tell us, so we need to figure it out.
+
+# if defined(_MSC_VER) || defined(__BORLANDC__)
+// These two compilers are known to support SEH.
+#  define GTEST_HAS_SEH 1
+# else
+// Assume no SEH.
+#  define GTEST_HAS_SEH 0
+# endif
+
+#endif  // GTEST_HAS_SEH
+
+#ifdef _MSC_VER
+
+# if GTEST_LINKED_AS_SHARED_LIBRARY
+#  define GTEST_API_ __declspec(dllimport)
+# elif GTEST_CREATE_SHARED_LIBRARY
+#  define GTEST_API_ __declspec(dllexport)
+# endif
+
+#endif  // _MSC_VER
+
+#ifndef GTEST_API_
+# define GTEST_API_
+#endif
+
+#ifdef __GNUC__
+// Ask the compiler to never inline a given function.
+# define GTEST_NO_INLINE_ __attribute__((noinline))
+#else
+# define GTEST_NO_INLINE_
+#endif
+
+// _LIBCPP_VERSION is defined by the libc++ library from the LLVM project.
+#if defined(__GLIBCXX__) || defined(_LIBCPP_VERSION)
+# define GTEST_HAS_CXXABI_H_ 1
+#else
+# define GTEST_HAS_CXXABI_H_ 0
+#endif
+
+namespace testing {
+
+class Message;
+
+namespace internal {
+
+// A secret type that Google Test users don't know about.  It has no
+// definition on purpose.  Therefore it's impossible to create a
+// Secret object, which is what we want.
+class Secret;
+
+// The GTEST_COMPILE_ASSERT_ macro can be used to verify that a compile time
+// expression is true. For example, you could use it to verify the
+// size of a static array:
+//
+//   GTEST_COMPILE_ASSERT_(ARRAYSIZE(content_type_names) == CONTENT_NUM_TYPES,
+//                         content_type_names_incorrect_size);
+//
+// or to make sure a struct is smaller than a certain size:
+//
+//   GTEST_COMPILE_ASSERT_(sizeof(foo) < 128, foo_too_large);
+//
+// The second argument to the macro is the name of the variable. If
+// the expression is false, most compilers will issue a warning/error
+// containing the name of the variable.
+
+template <bool>
+struct CompileAssert {
+};
+
+#define GTEST_COMPILE_ASSERT_(expr, msg) \
+  typedef ::testing::internal::CompileAssert<(static_cast<bool>(expr))> \
+      msg[static_cast<bool>(expr) ? 1 : -1] GTEST_ATTRIBUTE_UNUSED_
+
+// Implementation details of GTEST_COMPILE_ASSERT_:
+//
+// - GTEST_COMPILE_ASSERT_ works by defining an array type that has -1
+//   elements (and thus is invalid) when the expression is false.
+//
+// - The simpler definition
+//
+//    #define GTEST_COMPILE_ASSERT_(expr, msg) typedef char msg[(expr) ? 1 : -1]
+//
+//   does not work, as gcc supports variable-length arrays whose sizes
+//   are determined at run-time (this is gcc's extension and not part
+//   of the C++ standard).  As a result, gcc fails to reject the
+//   following code with the simple definition:
+//
+//     int foo;
+//     GTEST_COMPILE_ASSERT_(foo, msg); // not supposed to compile as foo is
+//                                      // not a compile-time constant.
+//
+// - By using the type CompileAssert<(bool(expr))>, we ensures that
+//   expr is a compile-time constant.  (Template arguments must be
+//   determined at compile-time.)
+//
+// - The outter parentheses in CompileAssert<(bool(expr))> are necessary
+//   to work around a bug in gcc 3.4.4 and 4.0.1.  If we had written
+//
+//     CompileAssert<bool(expr)>
+//
+//   instead, these compilers will refuse to compile
+//
+//     GTEST_COMPILE_ASSERT_(5 > 0, some_message);
+//
+//   (They seem to think the ">" in "5 > 0" marks the end of the
+//   template argument list.)
+//
+// - The array size is (bool(expr) ? 1 : -1), instead of simply
+//
+//     ((expr) ? 1 : -1).
+//
+//   This is to avoid running into a bug in MS VC 7.1, which
+//   causes ((0.0) ? 1 : -1) to incorrectly evaluate to 1.
+
+// StaticAssertTypeEqHelper is used by StaticAssertTypeEq defined in gtest.h.
+//
+// This template is declared, but intentionally undefined.
+template <typename T1, typename T2>
+struct StaticAssertTypeEqHelper;
+
+template <typename T>
+struct StaticAssertTypeEqHelper<T, T> {};
+
+#if GTEST_HAS_GLOBAL_STRING
+typedef ::string string;
+#else
+typedef ::std::string string;
+#endif  // GTEST_HAS_GLOBAL_STRING
+
+#if GTEST_HAS_GLOBAL_WSTRING
+typedef ::wstring wstring;
+#elif GTEST_HAS_STD_WSTRING
+typedef ::std::wstring wstring;
+#endif  // GTEST_HAS_GLOBAL_WSTRING
+
+// A helper for suppressing warnings on constant condition.  It just
+// returns 'condition'.
+GTEST_API_ bool IsTrue(bool condition);
+
+// Defines scoped_ptr.
+
+// This implementation of scoped_ptr is PARTIAL - it only contains
+// enough stuff to satisfy Google Test's need.
+template <typename T>
+class scoped_ptr {
+ public:
+  typedef T element_type;
+
+  explicit scoped_ptr(T* p = NULL) : ptr_(p) {}
+  ~scoped_ptr() { reset(); }
+
+  T& operator*() const { return *ptr_; }
+  T* operator->() const { return ptr_; }
+  T* get() const { return ptr_; }
+
+  T* release() {
+    T* const ptr = ptr_;
+    ptr_ = NULL;
+    return ptr;
+  }
+
+  void reset(T* p = NULL) {
+    if (p != ptr_) {
+      if (IsTrue(sizeof(T) > 0)) {  // Makes sure T is a complete type.
+        delete ptr_;
+      }
+      ptr_ = p;
+    }
+  }
+
+ private:
+  T* ptr_;
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(scoped_ptr);
+};
+
+// Defines RE.
+
+// A simple C++ wrapper for <regex.h>.  It uses the POSIX Extended
+// Regular Expression syntax.
+class GTEST_API_ RE {
+ public:
+  // A copy constructor is required by the Standard to initialize object
+  // references from r-values.
+  RE(const RE& other) { Init(other.pattern()); }
+
+  // Constructs an RE from a string.
+  RE(const ::std::string& regex) { Init(regex.c_str()); }  // NOLINT
+
+#if GTEST_HAS_GLOBAL_STRING
+
+  RE(const ::string& regex) { Init(regex.c_str()); }  // NOLINT
+
+#endif  // GTEST_HAS_GLOBAL_STRING
+
+  RE(const char* regex) { Init(regex); }  // NOLINT
+  ~RE();
+
+  // Returns the string representation of the regex.
+  const char* pattern() const { return pattern_; }
+
+  // FullMatch(str, re) returns true iff regular expression re matches
+  // the entire str.
+  // PartialMatch(str, re) returns true iff regular expression re
+  // matches a substring of str (including str itself).
+  //
+  // TODO(wan at google.com): make FullMatch() and PartialMatch() work
+  // when str contains NUL characters.
+  static bool FullMatch(const ::std::string& str, const RE& re) {
+    return FullMatch(str.c_str(), re);
+  }
+  static bool PartialMatch(const ::std::string& str, const RE& re) {
+    return PartialMatch(str.c_str(), re);
+  }
+
+#if GTEST_HAS_GLOBAL_STRING
+
+  static bool FullMatch(const ::string& str, const RE& re) {
+    return FullMatch(str.c_str(), re);
+  }
+  static bool PartialMatch(const ::string& str, const RE& re) {
+    return PartialMatch(str.c_str(), re);
+  }
+
+#endif  // GTEST_HAS_GLOBAL_STRING
+
+  static bool FullMatch(const char* str, const RE& re);
+  static bool PartialMatch(const char* str, const RE& re);
+
+ private:
+  void Init(const char* regex);
+
+  // We use a const char* instead of an std::string, as Google Test used to be
+  // used where std::string is not available.  TODO(wan at google.com): change to
+  // std::string.
+  const char* pattern_;
+  bool is_valid_;
+
+#if GTEST_USES_POSIX_RE
+
+  regex_t full_regex_;     // For FullMatch().
+  regex_t partial_regex_;  // For PartialMatch().
+
+#else  // GTEST_USES_SIMPLE_RE
+
+  const char* full_pattern_;  // For FullMatch();
+
+#endif
+
+  GTEST_DISALLOW_ASSIGN_(RE);
+};
+
+// Formats a source file path and a line number as they would appear
+// in an error message from the compiler used to compile this code.
+GTEST_API_ ::std::string FormatFileLocation(const char* file, int line);
+
+// Formats a file location for compiler-independent XML output.
+// Although this function is not platform dependent, we put it next to
+// FormatFileLocation in order to contrast the two functions.
+GTEST_API_ ::std::string FormatCompilerIndependentFileLocation(const char* file,
+                                                               int line);
+
+// Defines logging utilities:
+//   GTEST_LOG_(severity) - logs messages at the specified severity level. The
+//                          message itself is streamed into the macro.
+//   LogToStderr()  - directs all log messages to stderr.
+//   FlushInfoLog() - flushes informational log messages.
+
+enum GTestLogSeverity {
+  GTEST_INFO,
+  GTEST_WARNING,
+  GTEST_ERROR,
+  GTEST_FATAL
+};
+
+// Formats log entry severity, provides a stream object for streaming the
+// log message, and terminates the message with a newline when going out of
+// scope.
+class GTEST_API_ GTestLog {
+ public:
+  GTestLog(GTestLogSeverity severity, const char* file, int line);
+
+  // Flushes the buffers and, if severity is GTEST_FATAL, aborts the program.
+  ~GTestLog();
+
+  ::std::ostream& GetStream() { return ::std::cerr; }
+
+ private:
+  const GTestLogSeverity severity_;
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(GTestLog);
+};
+
+#define GTEST_LOG_(severity) \
+    ::testing::internal::GTestLog(::testing::internal::GTEST_##severity, \
+                                  __FILE__, __LINE__).GetStream()
+
+inline void LogToStderr() {}
+inline void FlushInfoLog() { fflush(NULL); }
+
+// INTERNAL IMPLEMENTATION - DO NOT USE.
+//
+// GTEST_CHECK_ is an all-mode assert. It aborts the program if the condition
+// is not satisfied.
+//  Synopsys:
+//    GTEST_CHECK_(boolean_condition);
+//     or
+//    GTEST_CHECK_(boolean_condition) << "Additional message";
+//
+//    This checks the condition and if the condition is not satisfied
+//    it prints message about the condition violation, including the
+//    condition itself, plus additional message streamed into it, if any,
+//    and then it aborts the program. It aborts the program irrespective of
+//    whether it is built in the debug mode or not.
+#define GTEST_CHECK_(condition) \
+    GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
+    if (::testing::internal::IsTrue(condition)) \
+      ; \
+    else \
+      GTEST_LOG_(FATAL) << "Condition " #condition " failed. "
+
+// An all-mode assert to verify that the given POSIX-style function
+// call returns 0 (indicating success).  Known limitation: this
+// doesn't expand to a balanced 'if' statement, so enclose the macro
+// in {} if you need to use it as the only statement in an 'if'
+// branch.
+#define GTEST_CHECK_POSIX_SUCCESS_(posix_call) \
+  if (const int gtest_error = (posix_call)) \
+    GTEST_LOG_(FATAL) << #posix_call << "failed with error " \
+                      << gtest_error
+
+// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
+//
+// Use ImplicitCast_ as a safe version of static_cast for upcasting in
+// the type hierarchy (e.g. casting a Foo* to a SuperclassOfFoo* or a
+// const Foo*).  When you use ImplicitCast_, the compiler checks that
+// the cast is safe.  Such explicit ImplicitCast_s are necessary in
+// surprisingly many situations where C++ demands an exact type match
+// instead of an argument type convertable to a target type.
+//
+// The syntax for using ImplicitCast_ is the same as for static_cast:
+//
+//   ImplicitCast_<ToType>(expr)
+//
+// ImplicitCast_ would have been part of the C++ standard library,
+// but the proposal was submitted too late.  It will probably make
+// its way into the language in the future.
+//
+// This relatively ugly name is intentional. It prevents clashes with
+// similar functions users may have (e.g., implicit_cast). The internal
+// namespace alone is not enough because the function can be found by ADL.
+template<typename To>
+inline To ImplicitCast_(To x) { return x; }
+
+// When you upcast (that is, cast a pointer from type Foo to type
+// SuperclassOfFoo), it's fine to use ImplicitCast_<>, since upcasts
+// always succeed.  When you downcast (that is, cast a pointer from
+// type Foo to type SubclassOfFoo), static_cast<> isn't safe, because
+// how do you know the pointer is really of type SubclassOfFoo?  It
+// could be a bare Foo, or of type DifferentSubclassOfFoo.  Thus,
+// when you downcast, you should use this macro.  In debug mode, we
+// use dynamic_cast<> to double-check the downcast is legal (we die
+// if it's not).  In normal mode, we do the efficient static_cast<>
+// instead.  Thus, it's important to test in debug mode to make sure
+// the cast is legal!
+//    This is the only place in the code we should use dynamic_cast<>.
+// In particular, you SHOULDN'T be using dynamic_cast<> in order to
+// do RTTI (eg code like this:
+//    if (dynamic_cast<Subclass1>(foo)) HandleASubclass1Object(foo);
+//    if (dynamic_cast<Subclass2>(foo)) HandleASubclass2Object(foo);
+// You should design the code some other way not to need this.
+//
+// This relatively ugly name is intentional. It prevents clashes with
+// similar functions users may have (e.g., down_cast). The internal
+// namespace alone is not enough because the function can be found by ADL.
+template<typename To, typename From>  // use like this: DownCast_<T*>(foo);
+inline To DownCast_(From* f) {  // so we only accept pointers
+  // Ensures that To is a sub-type of From *.  This test is here only
+  // for compile-time type checking, and has no overhead in an
+  // optimized build at run-time, as it will be optimized away
+  // completely.
+  if (false) {
+    const To to = NULL;
+    ::testing::internal::ImplicitCast_<From*>(to);
+  }
+
+#if GTEST_HAS_RTTI
+  // RTTI: debug mode only!
+  GTEST_CHECK_(f == NULL || dynamic_cast<To>(f) != NULL);
+#endif
+  return static_cast<To>(f);
+}
+
+// Downcasts the pointer of type Base to Derived.
+// Derived must be a subclass of Base. The parameter MUST
+// point to a class of type Derived, not any subclass of it.
+// When RTTI is available, the function performs a runtime
+// check to enforce this.
+template <class Derived, class Base>
+Derived* CheckedDowncastToActualType(Base* base) {
+#if GTEST_HAS_RTTI
+  GTEST_CHECK_(typeid(*base) == typeid(Derived));
+  return dynamic_cast<Derived*>(base);  // NOLINT
+#else
+  return static_cast<Derived*>(base);  // Poor man's downcast.
+#endif
+}
+
+#if GTEST_HAS_STREAM_REDIRECTION
+
+// Defines the stderr capturer:
+//   CaptureStdout     - starts capturing stdout.
+//   GetCapturedStdout - stops capturing stdout and returns the captured string.
+//   CaptureStderr     - starts capturing stderr.
+//   GetCapturedStderr - stops capturing stderr and returns the captured string.
+//
+GTEST_API_ void CaptureStdout();
+GTEST_API_ std::string GetCapturedStdout();
+GTEST_API_ void CaptureStderr();
+GTEST_API_ std::string GetCapturedStderr();
+
+#endif  // GTEST_HAS_STREAM_REDIRECTION
+
+
+#if GTEST_HAS_DEATH_TEST
+
+const ::std::vector<testing::internal::string>& GetInjectableArgvs();
+void SetInjectableArgvs(const ::std::vector<testing::internal::string>*
+                             new_argvs);
+
+// A copy of all command line arguments.  Set by InitGoogleTest().
+extern ::std::vector<testing::internal::string> g_argvs;
+
+#endif  // GTEST_HAS_DEATH_TEST
+
+// Defines synchronization primitives.
+
+#if GTEST_HAS_PTHREAD
+
+// Sleeps for (roughly) n milli-seconds.  This function is only for
+// testing Google Test's own constructs.  Don't use it in user tests,
+// either directly or indirectly.
+inline void SleepMilliseconds(int n) {
+  const timespec time = {
+    0,                  // 0 seconds.
+    n * 1000L * 1000L,  // And n ms.
+  };
+  nanosleep(&time, NULL);
+}
+
+// Allows a controller thread to pause execution of newly created
+// threads until notified.  Instances of this class must be created
+// and destroyed in the controller thread.
+//
+// This class is only for testing Google Test's own constructs. Do not
+// use it in user tests, either directly or indirectly.
+class Notification {
+ public:
+  Notification() : notified_(false) {
+    GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_init(&mutex_, NULL));
+  }
+  ~Notification() {
+    pthread_mutex_destroy(&mutex_);
+  }
+
+  // Notifies all threads created with this notification to start. Must
+  // be called from the controller thread.
+  void Notify() {
+    pthread_mutex_lock(&mutex_);
+    notified_ = true;
+    pthread_mutex_unlock(&mutex_);
+  }
+
+  // Blocks until the controller thread notifies. Must be called from a test
+  // thread.
+  void WaitForNotification() {
+    for (;;) {
+      pthread_mutex_lock(&mutex_);
+      const bool notified = notified_;
+      pthread_mutex_unlock(&mutex_);
+      if (notified)
+        break;
+      SleepMilliseconds(10);
+    }
+  }
+
+ private:
+  pthread_mutex_t mutex_;
+  bool notified_;
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(Notification);
+};
+
+// As a C-function, ThreadFuncWithCLinkage cannot be templated itself.
+// Consequently, it cannot select a correct instantiation of ThreadWithParam
+// in order to call its Run(). Introducing ThreadWithParamBase as a
+// non-templated base class for ThreadWithParam allows us to bypass this
+// problem.
+class ThreadWithParamBase {
+ public:
+  virtual ~ThreadWithParamBase() {}
+  virtual void Run() = 0;
+};
+
+// pthread_create() accepts a pointer to a function type with the C linkage.
+// According to the Standard (7.5/1), function types with different linkages
+// are different even if they are otherwise identical.  Some compilers (for
+// example, SunStudio) treat them as different types.  Since class methods
+// cannot be defined with C-linkage we need to define a free C-function to
+// pass into pthread_create().
+extern "C" inline void* ThreadFuncWithCLinkage(void* thread) {
+  static_cast<ThreadWithParamBase*>(thread)->Run();
+  return NULL;
+}
+
+// Helper class for testing Google Test's multi-threading constructs.
+// To use it, write:
+//
+//   void ThreadFunc(int param) { /* Do things with param */ }
+//   Notification thread_can_start;
+//   ...
+//   // The thread_can_start parameter is optional; you can supply NULL.
+//   ThreadWithParam<int> thread(&ThreadFunc, 5, &thread_can_start);
+//   thread_can_start.Notify();
+//
+// These classes are only for testing Google Test's own constructs. Do
+// not use them in user tests, either directly or indirectly.
+template <typename T>
+class ThreadWithParam : public ThreadWithParamBase {
+ public:
+  typedef void (*UserThreadFunc)(T);
+
+  ThreadWithParam(
+      UserThreadFunc func, T param, Notification* thread_can_start)
+      : func_(func),
+        param_(param),
+        thread_can_start_(thread_can_start),
+        finished_(false) {
+    ThreadWithParamBase* const base = this;
+    // The thread can be created only after all fields except thread_
+    // have been initialized.
+    GTEST_CHECK_POSIX_SUCCESS_(
+        pthread_create(&thread_, 0, &ThreadFuncWithCLinkage, base));
+  }
+  ~ThreadWithParam() { Join(); }
+
+  void Join() {
+    if (!finished_) {
+      GTEST_CHECK_POSIX_SUCCESS_(pthread_join(thread_, 0));
+      finished_ = true;
+    }
+  }
+
+  virtual void Run() {
+    if (thread_can_start_ != NULL)
+      thread_can_start_->WaitForNotification();
+    func_(param_);
+  }
+
+ private:
+  const UserThreadFunc func_;  // User-supplied thread function.
+  const T param_;  // User-supplied parameter to the thread function.
+  // When non-NULL, used to block execution until the controller thread
+  // notifies.
+  Notification* const thread_can_start_;
+  bool finished_;  // true iff we know that the thread function has finished.
+  pthread_t thread_;  // The native thread object.
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(ThreadWithParam);
+};
+
+// MutexBase and Mutex implement mutex on pthreads-based platforms. They
+// are used in conjunction with class MutexLock:
+//
+//   Mutex mutex;
+//   ...
+//   MutexLock lock(&mutex);  // Acquires the mutex and releases it at the end
+//                            // of the current scope.
+//
+// MutexBase implements behavior for both statically and dynamically
+// allocated mutexes.  Do not use MutexBase directly.  Instead, write
+// the following to define a static mutex:
+//
+//   GTEST_DEFINE_STATIC_MUTEX_(g_some_mutex);
+//
+// You can forward declare a static mutex like this:
+//
+//   GTEST_DECLARE_STATIC_MUTEX_(g_some_mutex);
+//
+// To create a dynamic mutex, just define an object of type Mutex.
+class MutexBase {
+ public:
+  // Acquires this mutex.
+  void Lock() {
+    GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_lock(&mutex_));
+    owner_ = pthread_self();
+    has_owner_ = true;
+  }
+
+  // Releases this mutex.
+  void Unlock() {
+    // Since the lock is being released the owner_ field should no longer be
+    // considered valid. We don't protect writing to has_owner_ here, as it's
+    // the caller's responsibility to ensure that the current thread holds the
+    // mutex when this is called.
+    has_owner_ = false;
+    GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_unlock(&mutex_));
+  }
+
+  // Does nothing if the current thread holds the mutex. Otherwise, crashes
+  // with high probability.
+  void AssertHeld() const {
+    GTEST_CHECK_(has_owner_ && pthread_equal(owner_, pthread_self()))
+        << "The current thread is not holding the mutex @" << this;
+  }
+
+  // A static mutex may be used before main() is entered.  It may even
+  // be used before the dynamic initialization stage.  Therefore we
+  // must be able to initialize a static mutex object at link time.
+  // This means MutexBase has to be a POD and its member variables
+  // have to be public.
+ public:
+  pthread_mutex_t mutex_;  // The underlying pthread mutex.
+  // has_owner_ indicates whether the owner_ field below contains a valid thread
+  // ID and is therefore safe to inspect (e.g., to use in pthread_equal()). All
+  // accesses to the owner_ field should be protected by a check of this field.
+  // An alternative might be to memset() owner_ to all zeros, but there's no
+  // guarantee that a zero'd pthread_t is necessarily invalid or even different
+  // from pthread_self().
+  bool has_owner_;
+  pthread_t owner_;  // The thread holding the mutex.
+};
+
+// Forward-declares a static mutex.
+# define GTEST_DECLARE_STATIC_MUTEX_(mutex) \
+    extern ::testing::internal::MutexBase mutex
+
+// Defines and statically (i.e. at link time) initializes a static mutex.
+// The initialization list here does not explicitly initialize each field,
+// instead relying on default initialization for the unspecified fields. In
+// particular, the owner_ field (a pthread_t) is not explicitly initialized.
+// This allows initialization to work whether pthread_t is a scalar or struct.
+// The flag -Wmissing-field-initializers must not be specified for this to work.
+# define GTEST_DEFINE_STATIC_MUTEX_(mutex) \
+    ::testing::internal::MutexBase mutex = { PTHREAD_MUTEX_INITIALIZER, false }
+
+// The Mutex class can only be used for mutexes created at runtime. It
+// shares its API with MutexBase otherwise.
+class Mutex : public MutexBase {
+ public:
+  Mutex() {
+    GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_init(&mutex_, NULL));
+    has_owner_ = false;
+  }
+  ~Mutex() {
+    GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_destroy(&mutex_));
+  }
+
+ private:
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(Mutex);
+};
+
+// We cannot name this class MutexLock as the ctor declaration would
+// conflict with a macro named MutexLock, which is defined on some
+// platforms.  Hence the typedef trick below.
+class GTestMutexLock {
+ public:
+  explicit GTestMutexLock(MutexBase* mutex)
+      : mutex_(mutex) { mutex_->Lock(); }
+
+  ~GTestMutexLock() { mutex_->Unlock(); }
+
+ private:
+  MutexBase* const mutex_;
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(GTestMutexLock);
+};
+
+typedef GTestMutexLock MutexLock;
+
+// Helpers for ThreadLocal.
+
+// pthread_key_create() requires DeleteThreadLocalValue() to have
+// C-linkage.  Therefore it cannot be templatized to access
+// ThreadLocal<T>.  Hence the need for class
+// ThreadLocalValueHolderBase.
+class ThreadLocalValueHolderBase {
+ public:
+  virtual ~ThreadLocalValueHolderBase() {}
+};
+
+// Called by pthread to delete thread-local data stored by
+// pthread_setspecific().
+extern "C" inline void DeleteThreadLocalValue(void* value_holder) {
+  delete static_cast<ThreadLocalValueHolderBase*>(value_holder);
+}
+
+// Implements thread-local storage on pthreads-based systems.
+//
+//   // Thread 1
+//   ThreadLocal<int> tl(100);  // 100 is the default value for each thread.
+//
+//   // Thread 2
+//   tl.set(150);  // Changes the value for thread 2 only.
+//   EXPECT_EQ(150, tl.get());
+//
+//   // Thread 1
+//   EXPECT_EQ(100, tl.get());  // In thread 1, tl has the original value.
+//   tl.set(200);
+//   EXPECT_EQ(200, tl.get());
+//
+// The template type argument T must have a public copy constructor.
+// In addition, the default ThreadLocal constructor requires T to have
+// a public default constructor.
+//
+// An object managed for a thread by a ThreadLocal instance is deleted
+// when the thread exits.  Or, if the ThreadLocal instance dies in
+// that thread, when the ThreadLocal dies.  It's the user's
+// responsibility to ensure that all other threads using a ThreadLocal
+// have exited when it dies, or the per-thread objects for those
+// threads will not be deleted.
+//
+// Google Test only uses global ThreadLocal objects.  That means they
+// will die after main() has returned.  Therefore, no per-thread
+// object managed by Google Test will be leaked as long as all threads
+// using Google Test have exited when main() returns.
+template <typename T>
+class ThreadLocal {
+ public:
+  ThreadLocal() : key_(CreateKey()),
+                  default_() {}
+  explicit ThreadLocal(const T& value) : key_(CreateKey()),
+                                         default_(value) {}
+
+  ~ThreadLocal() {
+    // Destroys the managed object for the current thread, if any.
+    DeleteThreadLocalValue(pthread_getspecific(key_));
+
+    // Releases resources associated with the key.  This will *not*
+    // delete managed objects for other threads.
+    GTEST_CHECK_POSIX_SUCCESS_(pthread_key_delete(key_));
+  }
+
+  T* pointer() { return GetOrCreateValue(); }
+  const T* pointer() const { return GetOrCreateValue(); }
+  const T& get() const { return *pointer(); }
+  void set(const T& value) { *pointer() = value; }
+
+ private:
+  // Holds a value of type T.
+  class ValueHolder : public ThreadLocalValueHolderBase {
+   public:
+    explicit ValueHolder(const T& value) : value_(value) {}
+
+    T* pointer() { return &value_; }
+
+   private:
+    T value_;
+    GTEST_DISALLOW_COPY_AND_ASSIGN_(ValueHolder);
+  };
+
+  static pthread_key_t CreateKey() {
+    pthread_key_t key;
+    // When a thread exits, DeleteThreadLocalValue() will be called on
+    // the object managed for that thread.
+    GTEST_CHECK_POSIX_SUCCESS_(
+        pthread_key_create(&key, &DeleteThreadLocalValue));
+    return key;
+  }
+
+  T* GetOrCreateValue() const {
+    ThreadLocalValueHolderBase* const holder =
+        static_cast<ThreadLocalValueHolderBase*>(pthread_getspecific(key_));
+    if (holder != NULL) {
+      return CheckedDowncastToActualType<ValueHolder>(holder)->pointer();
+    }
+
+    ValueHolder* const new_holder = new ValueHolder(default_);
+    ThreadLocalValueHolderBase* const holder_base = new_holder;
+    GTEST_CHECK_POSIX_SUCCESS_(pthread_setspecific(key_, holder_base));
+    return new_holder->pointer();
+  }
+
+  // A key pthreads uses for looking up per-thread values.
+  const pthread_key_t key_;
+  const T default_;  // The default value for each thread.
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(ThreadLocal);
+};
+
+# define GTEST_IS_THREADSAFE 1
+
+#else  // GTEST_HAS_PTHREAD
+
+// A dummy implementation of synchronization primitives (mutex, lock,
+// and thread-local variable).  Necessary for compiling Google Test where
+// mutex is not supported - using Google Test in multiple threads is not
+// supported on such platforms.
+
+class Mutex {
+ public:
+  Mutex() {}
+  void Lock() {}
+  void Unlock() {}
+  void AssertHeld() const {}
+};
+
+# define GTEST_DECLARE_STATIC_MUTEX_(mutex) \
+  extern ::testing::internal::Mutex mutex
+
+# define GTEST_DEFINE_STATIC_MUTEX_(mutex) ::testing::internal::Mutex mutex
+
+class GTestMutexLock {
+ public:
+  explicit GTestMutexLock(Mutex*) {}  // NOLINT
+};
+
+typedef GTestMutexLock MutexLock;
+
+template <typename T>
+class ThreadLocal {
+ public:
+  ThreadLocal() : value_() {}
+  explicit ThreadLocal(const T& value) : value_(value) {}
+  T* pointer() { return &value_; }
+  const T* pointer() const { return &value_; }
+  const T& get() const { return value_; }
+  void set(const T& value) { value_ = value; }
+ private:
+  T value_;
+};
+
+// The above synchronization primitives have dummy implementations.
+// Therefore Google Test is not thread-safe.
+# define GTEST_IS_THREADSAFE 0
+
+#endif  // GTEST_HAS_PTHREAD
+
+// Returns the number of threads running in the process, or 0 to indicate that
+// we cannot detect it.
+GTEST_API_ size_t GetThreadCount();
+
+// Passing non-POD classes through ellipsis (...) crashes the ARM
+// compiler and generates a warning in Sun Studio.  The Nokia Symbian
+// and the IBM XL C/C++ compiler try to instantiate a copy constructor
+// for objects passed through ellipsis (...), failing for uncopyable
+// objects.  We define this to ensure that only POD is passed through
+// ellipsis on these systems.
+#if defined(__SYMBIAN32__) || defined(__IBMCPP__) || defined(__SUNPRO_CC)
+// We lose support for NULL detection where the compiler doesn't like
+// passing non-POD classes through ellipsis (...).
+# define GTEST_ELLIPSIS_NEEDS_POD_ 1
+#else
+# define GTEST_CAN_COMPARE_NULL 1
+#endif
+
+// The Nokia Symbian and IBM XL C/C++ compilers cannot decide between
+// const T& and const T* in a function template.  These compilers
+// _can_ decide between class template specializations for T and T*,
+// so a tr1::type_traits-like is_pointer works.
+#if defined(__SYMBIAN32__) || defined(__IBMCPP__)
+# define GTEST_NEEDS_IS_POINTER_ 1
+#endif
+
+template <bool bool_value>
+struct bool_constant {
+  typedef bool_constant<bool_value> type;
+  static const bool value = bool_value;
+};
+template <bool bool_value> const bool bool_constant<bool_value>::value;
+
+typedef bool_constant<false> false_type;
+typedef bool_constant<true> true_type;
+
+template <typename T>
+struct is_pointer : public false_type {};
+
+template <typename T>
+struct is_pointer<T*> : public true_type {};
+
+template <typename Iterator>
+struct IteratorTraits {
+  typedef typename Iterator::value_type value_type;
+};
+
+template <typename T>
+struct IteratorTraits<T*> {
+  typedef T value_type;
+};
+
+template <typename T>
+struct IteratorTraits<const T*> {
+  typedef T value_type;
+};
+
+#if GTEST_OS_WINDOWS
+# define GTEST_PATH_SEP_ "\\"
+# define GTEST_HAS_ALT_PATH_SEP_ 1
+// The biggest signed integer type the compiler supports.
+typedef __int64 BiggestInt;
+#else
+# define GTEST_PATH_SEP_ "/"
+# define GTEST_HAS_ALT_PATH_SEP_ 0
+typedef long long BiggestInt;  // NOLINT
+#endif  // GTEST_OS_WINDOWS
+
+// Utilities for char.
+
+// isspace(int ch) and friends accept an unsigned char or EOF.  char
+// may be signed, depending on the compiler (or compiler flags).
+// Therefore we need to cast a char to unsigned char before calling
+// isspace(), etc.
+
+inline bool IsAlpha(char ch) {
+  return isalpha(static_cast<unsigned char>(ch)) != 0;
+}
+inline bool IsAlNum(char ch) {
+  return isalnum(static_cast<unsigned char>(ch)) != 0;
+}
+inline bool IsDigit(char ch) {
+  return isdigit(static_cast<unsigned char>(ch)) != 0;
+}
+inline bool IsLower(char ch) {
+  return islower(static_cast<unsigned char>(ch)) != 0;
+}
+inline bool IsSpace(char ch) {
+  return isspace(static_cast<unsigned char>(ch)) != 0;
+}
+inline bool IsUpper(char ch) {
+  return isupper(static_cast<unsigned char>(ch)) != 0;
+}
+inline bool IsXDigit(char ch) {
+  return isxdigit(static_cast<unsigned char>(ch)) != 0;
+}
+inline bool IsXDigit(wchar_t ch) {
+  const unsigned char low_byte = static_cast<unsigned char>(ch);
+  return ch == low_byte && isxdigit(low_byte) != 0;
+}
+
+inline char ToLower(char ch) {
+  return static_cast<char>(tolower(static_cast<unsigned char>(ch)));
+}
+inline char ToUpper(char ch) {
+  return static_cast<char>(toupper(static_cast<unsigned char>(ch)));
+}
+
+// The testing::internal::posix namespace holds wrappers for common
+// POSIX functions.  These wrappers hide the differences between
+// Windows/MSVC and POSIX systems.  Since some compilers define these
+// standard functions as macros, the wrapper cannot have the same name
+// as the wrapped function.
+
+namespace posix {
+
+// Functions with a different name on Windows.
+
+#if GTEST_OS_WINDOWS
+
+typedef struct _stat StatStruct;
+
+# ifdef __BORLANDC__
+inline int IsATTY(int fd) { return isatty(fd); }
+inline int StrCaseCmp(const char* s1, const char* s2) {
+  return stricmp(s1, s2);
+}
+inline char* StrDup(const char* src) { return strdup(src); }
+# else  // !__BORLANDC__
+#  if GTEST_OS_WINDOWS_MOBILE
+inline int IsATTY(int /* fd */) { return 0; }
+#  else
+inline int IsATTY(int fd) { return _isatty(fd); }
+#  endif  // GTEST_OS_WINDOWS_MOBILE
+inline int StrCaseCmp(const char* s1, const char* s2) {
+  return _stricmp(s1, s2);
+}
+inline char* StrDup(const char* src) { return _strdup(src); }
+# endif  // __BORLANDC__
+
+# if GTEST_OS_WINDOWS_MOBILE
+inline int FileNo(FILE* file) { return reinterpret_cast<int>(_fileno(file)); }
+// Stat(), RmDir(), and IsDir() are not needed on Windows CE at this
+// time and thus not defined there.
+# else
+inline int FileNo(FILE* file) { return _fileno(file); }
+inline int Stat(const char* path, StatStruct* buf) { return _stat(path, buf); }
+inline int RmDir(const char* dir) { return _rmdir(dir); }
+inline bool IsDir(const StatStruct& st) {
+  return (_S_IFDIR & st.st_mode) != 0;
+}
+# endif  // GTEST_OS_WINDOWS_MOBILE
+
+#else
+
+typedef struct stat StatStruct;
+
+inline int FileNo(FILE* file) { return fileno(file); }
+inline int IsATTY(int fd) { return isatty(fd); }
+inline int Stat(const char* path, StatStruct* buf) { return stat(path, buf); }
+inline int StrCaseCmp(const char* s1, const char* s2) {
+  return strcasecmp(s1, s2);
+}
+inline char* StrDup(const char* src) { return strdup(src); }
+inline int RmDir(const char* dir) { return rmdir(dir); }
+inline bool IsDir(const StatStruct& st) { return S_ISDIR(st.st_mode); }
+
+#endif  // GTEST_OS_WINDOWS
+
+// Functions deprecated by MSVC 8.0.
+
+#ifdef _MSC_VER
+// Temporarily disable warning 4996 (deprecated function).
+# pragma warning(push)
+# pragma warning(disable:4996)
+#endif
+
+inline const char* StrNCpy(char* dest, const char* src, size_t n) {
+  return strncpy(dest, src, n);
+}
+
+// ChDir(), FReopen(), FDOpen(), Read(), Write(), Close(), and
+// StrError() aren't needed on Windows CE at this time and thus not
+// defined there.
+
+#if !GTEST_OS_WINDOWS_MOBILE
+inline int ChDir(const char* dir) { return chdir(dir); }
+#endif
+inline FILE* FOpen(const char* path, const char* mode) {
+  return fopen(path, mode);
+}
+#if !GTEST_OS_WINDOWS_MOBILE
+inline FILE *FReopen(const char* path, const char* mode, FILE* stream) {
+  return freopen(path, mode, stream);
+}
+inline FILE* FDOpen(int fd, const char* mode) { return fdopen(fd, mode); }
+#endif
+inline int FClose(FILE* fp) { return fclose(fp); }
+#if !GTEST_OS_WINDOWS_MOBILE
+inline int Read(int fd, void* buf, unsigned int count) {
+  return static_cast<int>(read(fd, buf, count));
+}
+inline int Write(int fd, const void* buf, unsigned int count) {
+  return static_cast<int>(write(fd, buf, count));
+}
+inline int Close(int fd) { return close(fd); }
+inline const char* StrError(int errnum) { return strerror(errnum); }
+#endif
+inline const char* GetEnv(const char* name) {
+#if GTEST_OS_WINDOWS_MOBILE
+  // We are on Windows CE, which has no environment variables.
+  return NULL;
+#elif defined(__BORLANDC__) || defined(__SunOS_5_8) || defined(__SunOS_5_9)
+  // Environment variables which we programmatically clear will be set to the
+  // empty string rather than unset (NULL).  Handle that case.
+  const char* const env = getenv(name);
+  return (env != NULL && env[0] != '\0') ? env : NULL;
+#else
+  return getenv(name);
+#endif
+}
+
+#ifdef _MSC_VER
+# pragma warning(pop)  // Restores the warning state.
+#endif
+
+#if GTEST_OS_WINDOWS_MOBILE
+// Windows CE has no C library. The abort() function is used in
+// several places in Google Test. This implementation provides a reasonable
+// imitation of standard behaviour.
+void Abort();
+#else
+inline void Abort() { abort(); }
+#endif  // GTEST_OS_WINDOWS_MOBILE
+
+}  // namespace posix
+
+// MSVC "deprecates" snprintf and issues warnings wherever it is used.  In
+// order to avoid these warnings, we need to use _snprintf or _snprintf_s on
+// MSVC-based platforms.  We map the GTEST_SNPRINTF_ macro to the appropriate
+// function in order to achieve that.  We use macro definition here because
+// snprintf is a variadic function.
+#if _MSC_VER >= 1400 && !GTEST_OS_WINDOWS_MOBILE
+// MSVC 2005 and above support variadic macros.
+# define GTEST_SNPRINTF_(buffer, size, format, ...) \
+     _snprintf_s(buffer, size, size, format, __VA_ARGS__)
+#elif defined(_MSC_VER)
+// Windows CE does not define _snprintf_s and MSVC prior to 2005 doesn't
+// complain about _snprintf.
+# define GTEST_SNPRINTF_ _snprintf
+#else
+# define GTEST_SNPRINTF_ snprintf
+#endif
+
+// The maximum number a BiggestInt can represent.  This definition
+// works no matter BiggestInt is represented in one's complement or
+// two's complement.
+//
+// We cannot rely on numeric_limits in STL, as __int64 and long long
+// are not part of standard C++ and numeric_limits doesn't need to be
+// defined for them.
+const BiggestInt kMaxBiggestInt =
+    ~(static_cast<BiggestInt>(1) << (8*sizeof(BiggestInt) - 1));
+
+// This template class serves as a compile-time function from size to
+// type.  It maps a size in bytes to a primitive type with that
+// size. e.g.
+//
+//   TypeWithSize<4>::UInt
+//
+// is typedef-ed to be unsigned int (unsigned integer made up of 4
+// bytes).
+//
+// Such functionality should belong to STL, but I cannot find it
+// there.
+//
+// Google Test uses this class in the implementation of floating-point
+// comparison.
+//
+// For now it only handles UInt (unsigned int) as that's all Google Test
+// needs.  Other types can be easily added in the future if need
+// arises.
+template <size_t size>
+class TypeWithSize {
+ public:
+  // This prevents the user from using TypeWithSize<N> with incorrect
+  // values of N.
+  typedef void UInt;
+};
+
+// The specialization for size 4.
+template <>
+class TypeWithSize<4> {
+ public:
+  // unsigned int has size 4 in both gcc and MSVC.
+  //
+  // As base/basictypes.h doesn't compile on Windows, we cannot use
+  // uint32, uint64, and etc here.
+  typedef int Int;
+  typedef unsigned int UInt;
+};
+
+// The specialization for size 8.
+template <>
+class TypeWithSize<8> {
+ public:
+#if GTEST_OS_WINDOWS
+  typedef __int64 Int;
+  typedef unsigned __int64 UInt;
+#else
+  typedef long long Int;  // NOLINT
+  typedef unsigned long long UInt;  // NOLINT
+#endif  // GTEST_OS_WINDOWS
+};
+
+// Integer types of known sizes.
+typedef TypeWithSize<4>::Int Int32;
+typedef TypeWithSize<4>::UInt UInt32;
+typedef TypeWithSize<8>::Int Int64;
+typedef TypeWithSize<8>::UInt UInt64;
+typedef TypeWithSize<8>::Int TimeInMillis;  // Represents time in milliseconds.
+
+// Utilities for command line flags and environment variables.
+
+// Macro for referencing flags.
+#define GTEST_FLAG(name) FLAGS_gtest_##name
+
+// Macros for declaring flags.
+#define GTEST_DECLARE_bool_(name) GTEST_API_ extern bool GTEST_FLAG(name)
+#define GTEST_DECLARE_int32_(name) \
+    GTEST_API_ extern ::testing::internal::Int32 GTEST_FLAG(name)
+#define GTEST_DECLARE_string_(name) \
+    GTEST_API_ extern ::std::string GTEST_FLAG(name)
+
+// Macros for defining flags.
+#define GTEST_DEFINE_bool_(name, default_val, doc) \
+    GTEST_API_ bool GTEST_FLAG(name) = (default_val)
+#define GTEST_DEFINE_int32_(name, default_val, doc) \
+    GTEST_API_ ::testing::internal::Int32 GTEST_FLAG(name) = (default_val)
+#define GTEST_DEFINE_string_(name, default_val, doc) \
+    GTEST_API_ ::std::string GTEST_FLAG(name) = (default_val)
+
+// Thread annotations
+#define GTEST_EXCLUSIVE_LOCK_REQUIRED_(locks)
+#define GTEST_LOCK_EXCLUDED_(locks)
+
+// Parses 'str' for a 32-bit signed integer.  If successful, writes the result
+// to *value and returns true; otherwise leaves *value unchanged and returns
+// false.
+// TODO(chandlerc): Find a better way to refactor flag and environment parsing
+// out of both gtest-port.cc and gtest.cc to avoid exporting this utility
+// function.
+bool ParseInt32(const Message& src_text, const char* str, Int32* value);
+
+// Parses a bool/Int32/string from the environment variable
+// corresponding to the given Google Test flag.
+bool BoolFromGTestEnv(const char* flag, bool default_val);
+GTEST_API_ Int32 Int32FromGTestEnv(const char* flag, Int32 default_val);
+const char* StringFromGTestEnv(const char* flag, const char* default_val);
+
+}  // namespace internal
+}  // namespace testing
+
+#endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PORT_H_
+
+#if GTEST_OS_LINUX
+# include <stdlib.h>
+# include <sys/types.h>
+# include <sys/wait.h>
+# include <unistd.h>
+#endif  // GTEST_OS_LINUX
+
+#if GTEST_HAS_EXCEPTIONS
+# include <stdexcept>
+#endif
+
+#include <ctype.h>
+#include <float.h>
+#include <string.h>
+#include <iomanip>
+#include <limits>
+#include <set>
+
+// Copyright 2005, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+//
+// The Google C++ Testing Framework (Google Test)
+//
+// This header file defines the Message class.
+//
+// IMPORTANT NOTE: Due to limitation of the C++ language, we have to
+// leave some internal implementation details in this header file.
+// They are clearly marked by comments like this:
+//
+//   // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
+//
+// Such code is NOT meant to be used by a user directly, and is subject
+// to CHANGE WITHOUT NOTICE.  Therefore DO NOT DEPEND ON IT in a user
+// program!
+
+#ifndef GTEST_INCLUDE_GTEST_GTEST_MESSAGE_H_
+#define GTEST_INCLUDE_GTEST_GTEST_MESSAGE_H_
+
+#include <limits>
+
+
+// Ensures that there is at least one operator<< in the global namespace.
+// See Message& operator<<(...) below for why.
+void operator<<(const testing::internal::Secret&, int);
+
+namespace testing {
+
+// The Message class works like an ostream repeater.
+//
+// Typical usage:
+//
+//   1. You stream a bunch of values to a Message object.
+//      It will remember the text in a stringstream.
+//   2. Then you stream the Message object to an ostream.
+//      This causes the text in the Message to be streamed
+//      to the ostream.
+//
+// For example;
+//
+//   testing::Message foo;
+//   foo << 1 << " != " << 2;
+//   std::cout << foo;
+//
+// will print "1 != 2".
+//
+// Message is not intended to be inherited from.  In particular, its
+// destructor is not virtual.
+//
+// Note that stringstream behaves differently in gcc and in MSVC.  You
+// can stream a NULL char pointer to it in the former, but not in the
+// latter (it causes an access violation if you do).  The Message
+// class hides this difference by treating a NULL char pointer as
+// "(null)".
+class GTEST_API_ Message {
+ private:
+  // The type of basic IO manipulators (endl, ends, and flush) for
+  // narrow streams.
+  typedef std::ostream& (*BasicNarrowIoManip)(std::ostream&);
+
+ public:
+  // Constructs an empty Message.
+  Message();
+
+  // Copy constructor.
+  Message(const Message& msg) : ss_(new ::std::stringstream) {  // NOLINT
+    *ss_ << msg.GetString();
+  }
+
+  // Constructs a Message from a C-string.
+  explicit Message(const char* str) : ss_(new ::std::stringstream) {
+    *ss_ << str;
+  }
+
+#if GTEST_OS_SYMBIAN
+  // Streams a value (either a pointer or not) to this object.
+  template <typename T>
+  inline Message& operator <<(const T& value) {
+    StreamHelper(typename internal::is_pointer<T>::type(), value);
+    return *this;
+  }
+#else
+  // Streams a non-pointer value to this object.
+  template <typename T>
+  inline Message& operator <<(const T& val) {
+    // Some libraries overload << for STL containers.  These
+    // overloads are defined in the global namespace instead of ::std.
+    //
+    // C++'s symbol lookup rule (i.e. Koenig lookup) says that these
+    // overloads are visible in either the std namespace or the global
+    // namespace, but not other namespaces, including the testing
+    // namespace which Google Test's Message class is in.
+    //
+    // To allow STL containers (and other types that has a << operator
+    // defined in the global namespace) to be used in Google Test
+    // assertions, testing::Message must access the custom << operator
+    // from the global namespace.  With this using declaration,
+    // overloads of << defined in the global namespace and those
+    // visible via Koenig lookup are both exposed in this function.
+    using ::operator <<;
+    *ss_ << val;
+    return *this;
+  }
+
+  // Streams a pointer value to this object.
+  //
+  // This function is an overload of the previous one.  When you
+  // stream a pointer to a Message, this definition will be used as it
+  // is more specialized.  (The C++ Standard, section
+  // [temp.func.order].)  If you stream a non-pointer, then the
+  // previous definition will be used.
+  //
+  // The reason for this overload is that streaming a NULL pointer to
+  // ostream is undefined behavior.  Depending on the compiler, you
+  // may get "0", "(nil)", "(null)", or an access violation.  To
+  // ensure consistent result across compilers, we always treat NULL
+  // as "(null)".
+  template <typename T>
+  inline Message& operator <<(T* const& pointer) {  // NOLINT
+    if (pointer == NULL) {
+      *ss_ << "(null)";
+    } else {
+      *ss_ << pointer;
+    }
+    return *this;
+  }
+#endif  // GTEST_OS_SYMBIAN
+
+  // Since the basic IO manipulators are overloaded for both narrow
+  // and wide streams, we have to provide this specialized definition
+  // of operator <<, even though its body is the same as the
+  // templatized version above.  Without this definition, streaming
+  // endl or other basic IO manipulators to Message will confuse the
+  // compiler.
+  Message& operator <<(BasicNarrowIoManip val) {
+    *ss_ << val;
+    return *this;
+  }
+
+  // Instead of 1/0, we want to see true/false for bool values.
+  Message& operator <<(bool b) {
+    return *this << (b ? "true" : "false");
+  }
+
+  // These two overloads allow streaming a wide C string to a Message
+  // using the UTF-8 encoding.
+  Message& operator <<(const wchar_t* wide_c_str);
+  Message& operator <<(wchar_t* wide_c_str);
+
+#if GTEST_HAS_STD_WSTRING
+  // Converts the given wide string to a narrow string using the UTF-8
+  // encoding, and streams the result to this Message object.
+  Message& operator <<(const ::std::wstring& wstr);
+#endif  // GTEST_HAS_STD_WSTRING
+
+#if GTEST_HAS_GLOBAL_WSTRING
+  // Converts the given wide string to a narrow string using the UTF-8
+  // encoding, and streams the result to this Message object.
+  Message& operator <<(const ::wstring& wstr);
+#endif  // GTEST_HAS_GLOBAL_WSTRING
+
+  // Gets the text streamed to this object so far as an std::string.
+  // Each '\0' character in the buffer is replaced with "\\0".
+  //
+  // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
+  std::string GetString() const;
+
+ private:
+
+#if GTEST_OS_SYMBIAN
+  // These are needed as the Nokia Symbian Compiler cannot decide between
+  // const T& and const T* in a function template. The Nokia compiler _can_
+  // decide between class template specializations for T and T*, so a
+  // tr1::type_traits-like is_pointer works, and we can overload on that.
+  template <typename T>
+  inline void StreamHelper(internal::true_type /*is_pointer*/, T* pointer) {
+    if (pointer == NULL) {
+      *ss_ << "(null)";
+    } else {
+      *ss_ << pointer;
+    }
+  }
+  template <typename T>
+  inline void StreamHelper(internal::false_type /*is_pointer*/,
+                           const T& value) {
+    // See the comments in Message& operator <<(const T&) above for why
+    // we need this using statement.
+    using ::operator <<;
+    *ss_ << value;
+  }
+#endif  // GTEST_OS_SYMBIAN
+
+  // We'll hold the text streamed to this object here.
+  const internal::scoped_ptr< ::std::stringstream> ss_;
+
+  // We declare (but don't implement) this to prevent the compiler
+  // from implementing the assignment operator.
+  void operator=(const Message&);
+};
+
+// Streams a Message to an ostream.
+inline std::ostream& operator <<(std::ostream& os, const Message& sb) {
+  return os << sb.GetString();
+}
+
+namespace internal {
+
+// Converts a streamable value to an std::string.  A NULL pointer is
+// converted to "(null)".  When the input value is a ::string,
+// ::std::string, ::wstring, or ::std::wstring object, each NUL
+// character in it is replaced with "\\0".
+template <typename T>
+std::string StreamableToString(const T& streamable) {
+  return (Message() << streamable).GetString();
+}
+
+}  // namespace internal
+}  // namespace testing
+
+#endif  // GTEST_INCLUDE_GTEST_GTEST_MESSAGE_H_
+// Copyright 2005, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Authors: wan at google.com (Zhanyong Wan), eefacm at gmail.com (Sean Mcafee)
+//
+// The Google C++ Testing Framework (Google Test)
+//
+// This header file declares the String class and functions used internally by
+// Google Test.  They are subject to change without notice. They should not used
+// by code external to Google Test.
+//
+// This header file is #included by <gtest/internal/gtest-internal.h>.
+// It should not be #included by other files.
+
+#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_STRING_H_
+#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_STRING_H_
+
+#ifdef __BORLANDC__
+// string.h is not guaranteed to provide strcpy on C++ Builder.
+# include <mem.h>
+#endif
+
+#include <string.h>
+#include <string>
+
+
+namespace testing {
+namespace internal {
+
+// String - an abstract class holding static string utilities.
+class GTEST_API_ String {
+ public:
+  // Static utility methods
+
+  // Clones a 0-terminated C string, allocating memory using new.  The
+  // caller is responsible for deleting the return value using
+  // delete[].  Returns the cloned string, or NULL if the input is
+  // NULL.
+  //
+  // This is different from strdup() in string.h, which allocates
+  // memory using malloc().
+  static const char* CloneCString(const char* c_str);
+
+#if GTEST_OS_WINDOWS_MOBILE
+  // Windows CE does not have the 'ANSI' versions of Win32 APIs. To be
+  // able to pass strings to Win32 APIs on CE we need to convert them
+  // to 'Unicode', UTF-16.
+
+  // Creates a UTF-16 wide string from the given ANSI string, allocating
+  // memory using new. The caller is responsible for deleting the return
+  // value using delete[]. Returns the wide string, or NULL if the
+  // input is NULL.
+  //
+  // The wide string is created using the ANSI codepage (CP_ACP) to
+  // match the behaviour of the ANSI versions of Win32 calls and the
+  // C runtime.
+  static LPCWSTR AnsiToUtf16(const char* c_str);
+
+  // Creates an ANSI string from the given wide string, allocating
+  // memory using new. The caller is responsible for deleting the return
+  // value using delete[]. Returns the ANSI string, or NULL if the
+  // input is NULL.
+  //
+  // The returned string is created using the ANSI codepage (CP_ACP) to
+  // match the behaviour of the ANSI versions of Win32 calls and the
+  // C runtime.
+  static const char* Utf16ToAnsi(LPCWSTR utf16_str);
+#endif
+
+  // Compares two C strings.  Returns true iff they have the same content.
+  //
+  // Unlike strcmp(), this function can handle NULL argument(s).  A
+  // NULL C string is considered different to any non-NULL C string,
+  // including the empty string.
+  static bool CStringEquals(const char* lhs, const char* rhs);
+
+  // Converts a wide C string to a String using the UTF-8 encoding.
+  // NULL will be converted to "(null)".  If an error occurred during
+  // the conversion, "(failed to convert from wide string)" is
+  // returned.
+  static std::string ShowWideCString(const wchar_t* wide_c_str);
+
+  // Compares two wide C strings.  Returns true iff they have the same
+  // content.
+  //
+  // Unlike wcscmp(), this function can handle NULL argument(s).  A
+  // NULL C string is considered different to any non-NULL C string,
+  // including the empty string.
+  static bool WideCStringEquals(const wchar_t* lhs, const wchar_t* rhs);
+
+  // Compares two C strings, ignoring case.  Returns true iff they
+  // have the same content.
+  //
+  // Unlike strcasecmp(), this function can handle NULL argument(s).
+  // A NULL C string is considered different to any non-NULL C string,
+  // including the empty string.
+  static bool CaseInsensitiveCStringEquals(const char* lhs,
+                                           const char* rhs);
+
+  // Compares two wide C strings, ignoring case.  Returns true iff they
+  // have the same content.
+  //
+  // Unlike wcscasecmp(), this function can handle NULL argument(s).
+  // A NULL C string is considered different to any non-NULL wide C string,
+  // including the empty string.
+  // NB: The implementations on different platforms slightly differ.
+  // On windows, this method uses _wcsicmp which compares according to LC_CTYPE
+  // environment variable. On GNU platform this method uses wcscasecmp
+  // which compares according to LC_CTYPE category of the current locale.
+  // On MacOS X, it uses towlower, which also uses LC_CTYPE category of the
+  // current locale.
+  static bool CaseInsensitiveWideCStringEquals(const wchar_t* lhs,
+                                               const wchar_t* rhs);
+
+  // Returns true iff the given string ends with the given suffix, ignoring
+  // case. Any string is considered to end with an empty suffix.
+  static bool EndsWithCaseInsensitive(
+      const std::string& str, const std::string& suffix);
+
+  // Formats an int value as "%02d".
+  static std::string FormatIntWidth2(int value);  // "%02d" for width == 2
+
+  // Formats an int value as "%X".
+  static std::string FormatHexInt(int value);
+
+  // Formats a byte as "%02X".
+  static std::string FormatByte(unsigned char value);
+
+ private:
+  String();  // Not meant to be instantiated.
+};  // class String
+
+// Gets the content of the stringstream's buffer as an std::string.  Each '\0'
+// character in the buffer is replaced with "\\0".
+GTEST_API_ std::string StringStreamToString(::std::stringstream* stream);
+
+}  // namespace internal
+}  // namespace testing
+
+#endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_STRING_H_
+// Copyright 2008, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: keith.ray at gmail.com (Keith Ray)
+//
+// Google Test filepath utilities
+//
+// This header file declares classes and functions used internally by
+// Google Test.  They are subject to change without notice.
+//
+// This file is #included in <gtest/internal/gtest-internal.h>.
+// Do not include this header file separately!
+
+#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_FILEPATH_H_
+#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_FILEPATH_H_
+
+
+namespace testing {
+namespace internal {
+
+// FilePath - a class for file and directory pathname manipulation which
+// handles platform-specific conventions (like the pathname separator).
+// Used for helper functions for naming files in a directory for xml output.
+// Except for Set methods, all methods are const or static, which provides an
+// "immutable value object" -- useful for peace of mind.
+// A FilePath with a value ending in a path separator ("like/this/") represents
+// a directory, otherwise it is assumed to represent a file. In either case,
+// it may or may not represent an actual file or directory in the file system.
+// Names are NOT checked for syntax correctness -- no checking for illegal
+// characters, malformed paths, etc.
+
+class GTEST_API_ FilePath {
+ public:
+  FilePath() : pathname_("") { }
+  FilePath(const FilePath& rhs) : pathname_(rhs.pathname_) { }
+
+  explicit FilePath(const std::string& pathname) : pathname_(pathname) {
+    Normalize();
+  }
+
+  FilePath& operator=(const FilePath& rhs) {
+    Set(rhs);
+    return *this;
+  }
+
+  void Set(const FilePath& rhs) {
+    pathname_ = rhs.pathname_;
+  }
+
+  const std::string& string() const { return pathname_; }
+  const char* c_str() const { return pathname_.c_str(); }
+
+  // Returns the current working directory, or "" if unsuccessful.
+  static FilePath GetCurrentDir();
+
+  // Given directory = "dir", base_name = "test", number = 0,
+  // extension = "xml", returns "dir/test.xml". If number is greater
+  // than zero (e.g., 12), returns "dir/test_12.xml".
+  // On Windows platform, uses \ as the separator rather than /.
+  static FilePath MakeFileName(const FilePath& directory,
+                               const FilePath& base_name,
+                               int number,
+                               const char* extension);
+
+  // Given directory = "dir", relative_path = "test.xml",
+  // returns "dir/test.xml".
+  // On Windows, uses \ as the separator rather than /.
+  static FilePath ConcatPaths(const FilePath& directory,
+                              const FilePath& relative_path);
+
+  // Returns a pathname for a file that does not currently exist. The pathname
+  // will be directory/base_name.extension or
+  // directory/base_name_<number>.extension if directory/base_name.extension
+  // already exists. The number will be incremented until a pathname is found
+  // that does not already exist.
+  // Examples: 'dir/foo_test.xml' or 'dir/foo_test_1.xml'.
+  // There could be a race condition if two or more processes are calling this
+  // function at the same time -- they could both pick the same filename.
+  static FilePath GenerateUniqueFileName(const FilePath& directory,
+                                         const FilePath& base_name,
+                                         const char* extension);
+
+  // Returns true iff the path is "".
+  bool IsEmpty() const { return pathname_.empty(); }
+
+  // If input name has a trailing separator character, removes it and returns
+  // the name, otherwise return the name string unmodified.
+  // On Windows platform, uses \ as the separator, other platforms use /.
+  FilePath RemoveTrailingPathSeparator() const;
+
+  // Returns a copy of the FilePath with the directory part removed.
+  // Example: FilePath("path/to/file").RemoveDirectoryName() returns
+  // FilePath("file"). If there is no directory part ("just_a_file"), it returns
+  // the FilePath unmodified. If there is no file part ("just_a_dir/") it
+  // returns an empty FilePath ("").
+  // On Windows platform, '\' is the path separator, otherwise it is '/'.
+  FilePath RemoveDirectoryName() const;
+
+  // RemoveFileName returns the directory path with the filename removed.
+  // Example: FilePath("path/to/file").RemoveFileName() returns "path/to/".
+  // If the FilePath is "a_file" or "/a_file", RemoveFileName returns
+  // FilePath("./") or, on Windows, FilePath(".\\"). If the filepath does
+  // not have a file, like "just/a/dir/", it returns the FilePath unmodified.
+  // On Windows platform, '\' is the path separator, otherwise it is '/'.
+  FilePath RemoveFileName() const;
+
+  // Returns a copy of the FilePath with the case-insensitive extension removed.
+  // Example: FilePath("dir/file.exe").RemoveExtension("EXE") returns
+  // FilePath("dir/file"). If a case-insensitive extension is not
+  // found, returns a copy of the original FilePath.
+  FilePath RemoveExtension(const char* extension) const;
+
+  // Creates directories so that path exists. Returns true if successful or if
+  // the directories already exist; returns false if unable to create
+  // directories for any reason. Will also return false if the FilePath does
+  // not represent a directory (that is, it doesn't end with a path separator).
+  bool CreateDirectoriesRecursively() const;
+
+  // Create the directory so that path exists. Returns true if successful or
+  // if the directory already exists; returns false if unable to create the
+  // directory for any reason, including if the parent directory does not
+  // exist. Not named "CreateDirectory" because that's a macro on Windows.
+  bool CreateFolder() const;
+
+  // Returns true if FilePath describes something in the file-system,
+  // either a file, directory, or whatever, and that something exists.
+  bool FileOrDirectoryExists() const;
+
+  // Returns true if pathname describes a directory in the file-system
+  // that exists.
+  bool DirectoryExists() const;
+
+  // Returns true if FilePath ends with a path separator, which indicates that
+  // it is intended to represent a directory. Returns false otherwise.
+  // This does NOT check that a directory (or file) actually exists.
+  bool IsDirectory() const;
+
+  // Returns true if pathname describes a root directory. (Windows has one
+  // root directory per disk drive.)
+  bool IsRootDirectory() const;
+
+  // Returns true if pathname describes an absolute path.
+  bool IsAbsolutePath() const;
+
+ private:
+  // Replaces multiple consecutive separators with a single separator.
+  // For example, "bar///foo" becomes "bar/foo". Does not eliminate other
+  // redundancies that might be in a pathname involving "." or "..".
+  //
+  // A pathname with multiple consecutive separators may occur either through
+  // user error or as a result of some scripts or APIs that generate a pathname
+  // with a trailing separator. On other platforms the same API or script
+  // may NOT generate a pathname with a trailing "/". Then elsewhere that
+  // pathname may have another "/" and pathname components added to it,
+  // without checking for the separator already being there.
+  // The script language and operating system may allow paths like "foo//bar"
+  // but some of the functions in FilePath will not handle that correctly. In
+  // particular, RemoveTrailingPathSeparator() only removes one separator, and
+  // it is called in CreateDirectoriesRecursively() assuming that it will change
+  // a pathname from directory syntax (trailing separator) to filename syntax.
+  //
+  // On Windows this method also replaces the alternate path separator '/' with
+  // the primary path separator '\\', so that for example "bar\\/\\foo" becomes
+  // "bar\\foo".
+
+  void Normalize();
+
+  // Returns a pointer to the last occurence of a valid path separator in
+  // the FilePath. On Windows, for example, both '/' and '\' are valid path
+  // separators. Returns NULL if no path separator was found.
+  const char* FindLastPathSeparator() const;
+
+  std::string pathname_;
+};  // class FilePath
+
+}  // namespace internal
+}  // namespace testing
+
+#endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_FILEPATH_H_
+// This file was GENERATED by command:
+//     pump.py gtest-type-util.h.pump
+// DO NOT EDIT BY HAND!!!
+
+// Copyright 2008 Google Inc.
+// All Rights Reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+
+// Type utilities needed for implementing typed and type-parameterized
+// tests.  This file is generated by a SCRIPT.  DO NOT EDIT BY HAND!
+//
+// Currently we support at most 50 types in a list, and at most 50
+// type-parameterized tests in one type-parameterized test case.
+// Please contact googletestframework at googlegroups.com if you need
+// more.
+
+#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TYPE_UTIL_H_
+#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TYPE_UTIL_H_
+
+
+// #ifdef __GNUC__ is too general here.  It is possible to use gcc without using
+// libstdc++ (which is where cxxabi.h comes from).
+# if GTEST_HAS_CXXABI_H_
+#  include <cxxabi.h>
+# elif defined(__HP_aCC)
+#  include <acxx_demangle.h>
+# endif  // GTEST_HASH_CXXABI_H_
+
+namespace testing {
+namespace internal {
+
+// GetTypeName<T>() returns a human-readable name of type T.
+// NB: This function is also used in Google Mock, so don't move it inside of
+// the typed-test-only section below.
+template <typename T>
+std::string GetTypeName() {
+# if GTEST_HAS_RTTI
+
+  const char* const name = typeid(T).name();
+#  if GTEST_HAS_CXXABI_H_ || defined(__HP_aCC)
+  int status = 0;
+  // gcc's implementation of typeid(T).name() mangles the type name,
+  // so we have to demangle it.
+#   if GTEST_HAS_CXXABI_H_
+  using abi::__cxa_demangle;
+#   endif  // GTEST_HAS_CXXABI_H_
+  char* const readable_name = __cxa_demangle(name, 0, 0, &status);
+  const std::string name_str(status == 0 ? readable_name : name);
+  free(readable_name);
+  return name_str;
+#  else
+  return name;
+#  endif  // GTEST_HAS_CXXABI_H_ || __HP_aCC
+
+# else
+
+  return "<type>";
+
+# endif  // GTEST_HAS_RTTI
+}
+
+#if GTEST_HAS_TYPED_TEST || GTEST_HAS_TYPED_TEST_P
+
+// AssertyTypeEq<T1, T2>::type is defined iff T1 and T2 are the same
+// type.  This can be used as a compile-time assertion to ensure that
+// two types are equal.
+
+template <typename T1, typename T2>
+struct AssertTypeEq;
+
+template <typename T>
+struct AssertTypeEq<T, T> {
+  typedef bool type;
+};
+
+// A unique type used as the default value for the arguments of class
+// template Types.  This allows us to simulate variadic templates
+// (e.g. Types<int>, Type<int, double>, and etc), which C++ doesn't
+// support directly.
+struct None {};
+
+// The following family of struct and struct templates are used to
+// represent type lists.  In particular, TypesN<T1, T2, ..., TN>
+// represents a type list with N types (T1, T2, ..., and TN) in it.
+// Except for Types0, every struct in the family has two member types:
+// Head for the first type in the list, and Tail for the rest of the
+// list.
+
+// The empty type list.
+struct Types0 {};
+
+// Type lists of length 1, 2, 3, and so on.
+
+template <typename T1>
+struct Types1 {
+  typedef T1 Head;
+  typedef Types0 Tail;
+};
+template <typename T1, typename T2>
+struct Types2 {
+  typedef T1 Head;
+  typedef Types1<T2> Tail;
+};
+
+template <typename T1, typename T2, typename T3>
+struct Types3 {
+  typedef T1 Head;
+  typedef Types2<T2, T3> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4>
+struct Types4 {
+  typedef T1 Head;
+  typedef Types3<T2, T3, T4> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5>
+struct Types5 {
+  typedef T1 Head;
+  typedef Types4<T2, T3, T4, T5> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6>
+struct Types6 {
+  typedef T1 Head;
+  typedef Types5<T2, T3, T4, T5, T6> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7>
+struct Types7 {
+  typedef T1 Head;
+  typedef Types6<T2, T3, T4, T5, T6, T7> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8>
+struct Types8 {
+  typedef T1 Head;
+  typedef Types7<T2, T3, T4, T5, T6, T7, T8> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9>
+struct Types9 {
+  typedef T1 Head;
+  typedef Types8<T2, T3, T4, T5, T6, T7, T8, T9> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10>
+struct Types10 {
+  typedef T1 Head;
+  typedef Types9<T2, T3, T4, T5, T6, T7, T8, T9, T10> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11>
+struct Types11 {
+  typedef T1 Head;
+  typedef Types10<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12>
+struct Types12 {
+  typedef T1 Head;
+  typedef Types11<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13>
+struct Types13 {
+  typedef T1 Head;
+  typedef Types12<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14>
+struct Types14 {
+  typedef T1 Head;
+  typedef Types13<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15>
+struct Types15 {
+  typedef T1 Head;
+  typedef Types14<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16>
+struct Types16 {
+  typedef T1 Head;
+  typedef Types15<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17>
+struct Types17 {
+  typedef T1 Head;
+  typedef Types16<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18>
+struct Types18 {
+  typedef T1 Head;
+  typedef Types17<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19>
+struct Types19 {
+  typedef T1 Head;
+  typedef Types18<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20>
+struct Types20 {
+  typedef T1 Head;
+  typedef Types19<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21>
+struct Types21 {
+  typedef T1 Head;
+  typedef Types20<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22>
+struct Types22 {
+  typedef T1 Head;
+  typedef Types21<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23>
+struct Types23 {
+  typedef T1 Head;
+  typedef Types22<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22, T23> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24>
+struct Types24 {
+  typedef T1 Head;
+  typedef Types23<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22, T23, T24> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25>
+struct Types25 {
+  typedef T1 Head;
+  typedef Types24<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26>
+struct Types26 {
+  typedef T1 Head;
+  typedef Types25<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27>
+struct Types27 {
+  typedef T1 Head;
+  typedef Types26<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28>
+struct Types28 {
+  typedef T1 Head;
+  typedef Types27<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29>
+struct Types29 {
+  typedef T1 Head;
+  typedef Types28<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+      T29> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30>
+struct Types30 {
+  typedef T1 Head;
+  typedef Types29<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+      T30> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31>
+struct Types31 {
+  typedef T1 Head;
+  typedef Types30<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+      T30, T31> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32>
+struct Types32 {
+  typedef T1 Head;
+  typedef Types31<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+      T30, T31, T32> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33>
+struct Types33 {
+  typedef T1 Head;
+  typedef Types32<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+      T30, T31, T32, T33> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34>
+struct Types34 {
+  typedef T1 Head;
+  typedef Types33<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+      T30, T31, T32, T33, T34> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35>
+struct Types35 {
+  typedef T1 Head;
+  typedef Types34<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+      T30, T31, T32, T33, T34, T35> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36>
+struct Types36 {
+  typedef T1 Head;
+  typedef Types35<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+      T30, T31, T32, T33, T34, T35, T36> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37>
+struct Types37 {
+  typedef T1 Head;
+  typedef Types36<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+      T30, T31, T32, T33, T34, T35, T36, T37> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38>
+struct Types38 {
+  typedef T1 Head;
+  typedef Types37<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+      T30, T31, T32, T33, T34, T35, T36, T37, T38> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39>
+struct Types39 {
+  typedef T1 Head;
+  typedef Types38<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+      T30, T31, T32, T33, T34, T35, T36, T37, T38, T39> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40>
+struct Types40 {
+  typedef T1 Head;
+  typedef Types39<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+      T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41>
+struct Types41 {
+  typedef T1 Head;
+  typedef Types40<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+      T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42>
+struct Types42 {
+  typedef T1 Head;
+  typedef Types41<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+      T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43>
+struct Types43 {
+  typedef T1 Head;
+  typedef Types42<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+      T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
+      T43> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43, typename T44>
+struct Types44 {
+  typedef T1 Head;
+  typedef Types43<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+      T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
+      T44> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43, typename T44, typename T45>
+struct Types45 {
+  typedef T1 Head;
+  typedef Types44<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+      T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
+      T44, T45> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43, typename T44, typename T45,
+    typename T46>
+struct Types46 {
+  typedef T1 Head;
+  typedef Types45<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+      T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
+      T44, T45, T46> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43, typename T44, typename T45,
+    typename T46, typename T47>
+struct Types47 {
+  typedef T1 Head;
+  typedef Types46<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+      T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
+      T44, T45, T46, T47> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43, typename T44, typename T45,
+    typename T46, typename T47, typename T48>
+struct Types48 {
+  typedef T1 Head;
+  typedef Types47<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+      T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
+      T44, T45, T46, T47, T48> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43, typename T44, typename T45,
+    typename T46, typename T47, typename T48, typename T49>
+struct Types49 {
+  typedef T1 Head;
+  typedef Types48<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+      T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
+      T44, T45, T46, T47, T48, T49> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43, typename T44, typename T45,
+    typename T46, typename T47, typename T48, typename T49, typename T50>
+struct Types50 {
+  typedef T1 Head;
+  typedef Types49<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+      T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
+      T44, T45, T46, T47, T48, T49, T50> Tail;
+};
+
+
+}  // namespace internal
+
+// We don't want to require the users to write TypesN<...> directly,
+// as that would require them to count the length.  Types<...> is much
+// easier to write, but generates horrible messages when there is a
+// compiler error, as gcc insists on printing out each template
+// argument, even if it has the default value (this means Types<int>
+// will appear as Types<int, None, None, ..., None> in the compiler
+// errors).
+//
+// Our solution is to combine the best part of the two approaches: a
+// user would write Types<T1, ..., TN>, and Google Test will translate
+// that to TypesN<T1, ..., TN> internally to make error messages
+// readable.  The translation is done by the 'type' member of the
+// Types template.
+template <typename T1 = internal::None, typename T2 = internal::None,
+    typename T3 = internal::None, typename T4 = internal::None,
+    typename T5 = internal::None, typename T6 = internal::None,
+    typename T7 = internal::None, typename T8 = internal::None,
+    typename T9 = internal::None, typename T10 = internal::None,
+    typename T11 = internal::None, typename T12 = internal::None,
+    typename T13 = internal::None, typename T14 = internal::None,
+    typename T15 = internal::None, typename T16 = internal::None,
+    typename T17 = internal::None, typename T18 = internal::None,
+    typename T19 = internal::None, typename T20 = internal::None,
+    typename T21 = internal::None, typename T22 = internal::None,
+    typename T23 = internal::None, typename T24 = internal::None,
+    typename T25 = internal::None, typename T26 = internal::None,
+    typename T27 = internal::None, typename T28 = internal::None,
+    typename T29 = internal::None, typename T30 = internal::None,
+    typename T31 = internal::None, typename T32 = internal::None,
+    typename T33 = internal::None, typename T34 = internal::None,
+    typename T35 = internal::None, typename T36 = internal::None,
+    typename T37 = internal::None, typename T38 = internal::None,
+    typename T39 = internal::None, typename T40 = internal::None,
+    typename T41 = internal::None, typename T42 = internal::None,
+    typename T43 = internal::None, typename T44 = internal::None,
+    typename T45 = internal::None, typename T46 = internal::None,
+    typename T47 = internal::None, typename T48 = internal::None,
+    typename T49 = internal::None, typename T50 = internal::None>
+struct Types {
+  typedef internal::Types50<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
+      T41, T42, T43, T44, T45, T46, T47, T48, T49, T50> type;
+};
+
+template <>
+struct Types<internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None> {
+  typedef internal::Types0 type;
+};
+template <typename T1>
+struct Types<T1, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None> {
+  typedef internal::Types1<T1> type;
+};
+template <typename T1, typename T2>
+struct Types<T1, T2, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None> {
+  typedef internal::Types2<T1, T2> type;
+};
+template <typename T1, typename T2, typename T3>
+struct Types<T1, T2, T3, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None> {
+  typedef internal::Types3<T1, T2, T3> type;
+};
+template <typename T1, typename T2, typename T3, typename T4>
+struct Types<T1, T2, T3, T4, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None> {
+  typedef internal::Types4<T1, T2, T3, T4> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5>
+struct Types<T1, T2, T3, T4, T5, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None> {
+  typedef internal::Types5<T1, T2, T3, T4, T5> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6>
+struct Types<T1, T2, T3, T4, T5, T6, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None> {
+  typedef internal::Types6<T1, T2, T3, T4, T5, T6> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7>
+struct Types<T1, T2, T3, T4, T5, T6, T7, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None> {
+  typedef internal::Types7<T1, T2, T3, T4, T5, T6, T7> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None> {
+  typedef internal::Types8<T1, T2, T3, T4, T5, T6, T7, T8> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None> {
+  typedef internal::Types9<T1, T2, T3, T4, T5, T6, T7, T8, T9> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None> {
+  typedef internal::Types10<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None> {
+  typedef internal::Types11<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None> {
+  typedef internal::Types12<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None> {
+  typedef internal::Types13<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None> {
+  typedef internal::Types14<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None> {
+  typedef internal::Types15<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None> {
+  typedef internal::Types16<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None> {
+  typedef internal::Types17<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None> {
+  typedef internal::Types18<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None> {
+  typedef internal::Types19<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None> {
+  typedef internal::Types20<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None> {
+  typedef internal::Types21<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, T22, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None> {
+  typedef internal::Types22<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, T22, T23, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None> {
+  typedef internal::Types23<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, T22, T23, T24, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None> {
+  typedef internal::Types24<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None> {
+  typedef internal::Types25<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None> {
+  typedef internal::Types26<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+      T26> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None> {
+  typedef internal::Types27<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+      T27> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None> {
+  typedef internal::Types28<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+      T27, T28> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None> {
+  typedef internal::Types29<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+      T27, T28, T29> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None> {
+  typedef internal::Types30<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+      T27, T28, T29, T30> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
+    T31, internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None> {
+  typedef internal::Types31<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+      T27, T28, T29, T30, T31> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
+    T31, T32, internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None> {
+  typedef internal::Types32<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+      T27, T28, T29, T30, T31, T32> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
+    T31, T32, T33, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None> {
+  typedef internal::Types33<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+      T27, T28, T29, T30, T31, T32, T33> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
+    T31, T32, T33, T34, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None> {
+  typedef internal::Types34<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+      T27, T28, T29, T30, T31, T32, T33, T34> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
+    T31, T32, T33, T34, T35, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None> {
+  typedef internal::Types35<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+      T27, T28, T29, T30, T31, T32, T33, T34, T35> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
+    T31, T32, T33, T34, T35, T36, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None> {
+  typedef internal::Types36<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
+    T31, T32, T33, T34, T35, T36, T37, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None> {
+  typedef internal::Types37<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
+    T31, T32, T33, T34, T35, T36, T37, T38, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None> {
+  typedef internal::Types38<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
+    T31, T32, T33, T34, T35, T36, T37, T38, T39, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None> {
+  typedef internal::Types39<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
+    T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None> {
+  typedef internal::Types40<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
+      T40> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
+    T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None> {
+  typedef internal::Types41<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
+      T41> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
+    T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None> {
+  typedef internal::Types42<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
+      T41, T42> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
+    T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None> {
+  typedef internal::Types43<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
+      T41, T42, T43> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43, typename T44>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
+    T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None> {
+  typedef internal::Types44<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
+      T41, T42, T43, T44> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43, typename T44, typename T45>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
+    T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44, T45,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None> {
+  typedef internal::Types45<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
+      T41, T42, T43, T44, T45> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43, typename T44, typename T45,
+    typename T46>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
+    T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44, T45,
+    T46, internal::None, internal::None, internal::None, internal::None> {
+  typedef internal::Types46<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
+      T41, T42, T43, T44, T45, T46> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43, typename T44, typename T45,
+    typename T46, typename T47>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
+    T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44, T45,
+    T46, T47, internal::None, internal::None, internal::None> {
+  typedef internal::Types47<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
+      T41, T42, T43, T44, T45, T46, T47> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43, typename T44, typename T45,
+    typename T46, typename T47, typename T48>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
+    T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44, T45,
+    T46, T47, T48, internal::None, internal::None> {
+  typedef internal::Types48<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
+      T41, T42, T43, T44, T45, T46, T47, T48> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43, typename T44, typename T45,
+    typename T46, typename T47, typename T48, typename T49>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
+    T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44, T45,
+    T46, T47, T48, T49, internal::None> {
+  typedef internal::Types49<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
+      T41, T42, T43, T44, T45, T46, T47, T48, T49> type;
+};
+
+namespace internal {
+
+# define GTEST_TEMPLATE_ template <typename T> class
+
+// The template "selector" struct TemplateSel<Tmpl> is used to
+// represent Tmpl, which must be a class template with one type
+// parameter, as a type.  TemplateSel<Tmpl>::Bind<T>::type is defined
+// as the type Tmpl<T>.  This allows us to actually instantiate the
+// template "selected" by TemplateSel<Tmpl>.
+//
+// This trick is necessary for simulating typedef for class templates,
+// which C++ doesn't support directly.
+template <GTEST_TEMPLATE_ Tmpl>
+struct TemplateSel {
+  template <typename T>
+  struct Bind {
+    typedef Tmpl<T> type;
+  };
+};
+
+# define GTEST_BIND_(TmplSel, T) \
+  TmplSel::template Bind<T>::type
+
+// A unique struct template used as the default value for the
+// arguments of class template Templates.  This allows us to simulate
+// variadic templates (e.g. Templates<int>, Templates<int, double>,
+// and etc), which C++ doesn't support directly.
+template <typename T>
+struct NoneT {};
+
+// The following family of struct and struct templates are used to
+// represent template lists.  In particular, TemplatesN<T1, T2, ...,
+// TN> represents a list of N templates (T1, T2, ..., and TN).  Except
+// for Templates0, every struct in the family has two member types:
+// Head for the selector of the first template in the list, and Tail
+// for the rest of the list.
+
+// The empty template list.
+struct Templates0 {};
+
+// Template lists of length 1, 2, 3, and so on.
+
+template <GTEST_TEMPLATE_ T1>
+struct Templates1 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates0 Tail;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2>
+struct Templates2 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates1<T2> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3>
+struct Templates3 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates2<T2, T3> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4>
+struct Templates4 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates3<T2, T3, T4> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5>
+struct Templates5 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates4<T2, T3, T4, T5> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6>
+struct Templates6 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates5<T2, T3, T4, T5, T6> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7>
+struct Templates7 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates6<T2, T3, T4, T5, T6, T7> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8>
+struct Templates8 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates7<T2, T3, T4, T5, T6, T7, T8> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9>
+struct Templates9 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates8<T2, T3, T4, T5, T6, T7, T8, T9> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10>
+struct Templates10 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates9<T2, T3, T4, T5, T6, T7, T8, T9, T10> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11>
+struct Templates11 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates10<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12>
+struct Templates12 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates11<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13>
+struct Templates13 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates12<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14>
+struct Templates14 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates13<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15>
+struct Templates15 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates14<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16>
+struct Templates16 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates15<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17>
+struct Templates17 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates16<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18>
+struct Templates18 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates17<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19>
+struct Templates19 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates18<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20>
+struct Templates20 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates19<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21>
+struct Templates21 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates20<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22>
+struct Templates22 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates21<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23>
+struct Templates23 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates22<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22, T23> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24>
+struct Templates24 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates23<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25>
+struct Templates25 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates24<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26>
+struct Templates26 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates25<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27>
+struct Templates27 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates26<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28>
+struct Templates28 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates27<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+      T28> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29>
+struct Templates29 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates28<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+      T29> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30>
+struct Templates30 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates29<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+      T29, T30> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31>
+struct Templates31 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates30<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+      T29, T30, T31> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32>
+struct Templates32 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates31<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+      T29, T30, T31, T32> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33>
+struct Templates33 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates32<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+      T29, T30, T31, T32, T33> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34>
+struct Templates34 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates33<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+      T29, T30, T31, T32, T33, T34> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35>
+struct Templates35 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates34<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+      T29, T30, T31, T32, T33, T34, T35> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36>
+struct Templates36 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates35<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+      T29, T30, T31, T32, T33, T34, T35, T36> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+    GTEST_TEMPLATE_ T37>
+struct Templates37 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates36<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+      T29, T30, T31, T32, T33, T34, T35, T36, T37> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38>
+struct Templates38 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates37<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+      T29, T30, T31, T32, T33, T34, T35, T36, T37, T38> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39>
+struct Templates39 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates38<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+      T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
+    GTEST_TEMPLATE_ T40>
+struct Templates40 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates39<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+      T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
+    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41>
+struct Templates41 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates40<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+      T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
+    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42>
+struct Templates42 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates41<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+      T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
+      T42> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
+    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
+    GTEST_TEMPLATE_ T43>
+struct Templates43 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates42<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+      T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
+      T43> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
+    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
+    GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44>
+struct Templates44 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates43<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+      T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
+      T43, T44> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
+    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
+    GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45>
+struct Templates45 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates44<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+      T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
+      T43, T44, T45> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
+    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
+    GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,
+    GTEST_TEMPLATE_ T46>
+struct Templates46 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates45<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+      T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
+      T43, T44, T45, T46> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
+    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
+    GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,
+    GTEST_TEMPLATE_ T46, GTEST_TEMPLATE_ T47>
+struct Templates47 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates46<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+      T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
+      T43, T44, T45, T46, T47> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
+    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
+    GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,
+    GTEST_TEMPLATE_ T46, GTEST_TEMPLATE_ T47, GTEST_TEMPLATE_ T48>
+struct Templates48 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates47<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+      T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
+      T43, T44, T45, T46, T47, T48> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
+    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
+    GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,
+    GTEST_TEMPLATE_ T46, GTEST_TEMPLATE_ T47, GTEST_TEMPLATE_ T48,
+    GTEST_TEMPLATE_ T49>
+struct Templates49 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates48<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+      T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
+      T43, T44, T45, T46, T47, T48, T49> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
+    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
+    GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,
+    GTEST_TEMPLATE_ T46, GTEST_TEMPLATE_ T47, GTEST_TEMPLATE_ T48,
+    GTEST_TEMPLATE_ T49, GTEST_TEMPLATE_ T50>
+struct Templates50 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates49<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+      T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
+      T43, T44, T45, T46, T47, T48, T49, T50> Tail;
+};
+
+
+// We don't want to require the users to write TemplatesN<...> directly,
+// as that would require them to count the length.  Templates<...> is much
+// easier to write, but generates horrible messages when there is a
+// compiler error, as gcc insists on printing out each template
+// argument, even if it has the default value (this means Templates<list>
+// will appear as Templates<list, NoneT, NoneT, ..., NoneT> in the compiler
+// errors).
+//
+// Our solution is to combine the best part of the two approaches: a
+// user would write Templates<T1, ..., TN>, and Google Test will translate
+// that to TemplatesN<T1, ..., TN> internally to make error messages
+// readable.  The translation is done by the 'type' member of the
+// Templates template.
+template <GTEST_TEMPLATE_ T1 = NoneT, GTEST_TEMPLATE_ T2 = NoneT,
+    GTEST_TEMPLATE_ T3 = NoneT, GTEST_TEMPLATE_ T4 = NoneT,
+    GTEST_TEMPLATE_ T5 = NoneT, GTEST_TEMPLATE_ T6 = NoneT,
+    GTEST_TEMPLATE_ T7 = NoneT, GTEST_TEMPLATE_ T8 = NoneT,
+    GTEST_TEMPLATE_ T9 = NoneT, GTEST_TEMPLATE_ T10 = NoneT,
+    GTEST_TEMPLATE_ T11 = NoneT, GTEST_TEMPLATE_ T12 = NoneT,
+    GTEST_TEMPLATE_ T13 = NoneT, GTEST_TEMPLATE_ T14 = NoneT,
+    GTEST_TEMPLATE_ T15 = NoneT, GTEST_TEMPLATE_ T16 = NoneT,
+    GTEST_TEMPLATE_ T17 = NoneT, GTEST_TEMPLATE_ T18 = NoneT,
+    GTEST_TEMPLATE_ T19 = NoneT, GTEST_TEMPLATE_ T20 = NoneT,
+    GTEST_TEMPLATE_ T21 = NoneT, GTEST_TEMPLATE_ T22 = NoneT,
+    GTEST_TEMPLATE_ T23 = NoneT, GTEST_TEMPLATE_ T24 = NoneT,
+    GTEST_TEMPLATE_ T25 = NoneT, GTEST_TEMPLATE_ T26 = NoneT,
+    GTEST_TEMPLATE_ T27 = NoneT, GTEST_TEMPLATE_ T28 = NoneT,
+    GTEST_TEMPLATE_ T29 = NoneT, GTEST_TEMPLATE_ T30 = NoneT,
+    GTEST_TEMPLATE_ T31 = NoneT, GTEST_TEMPLATE_ T32 = NoneT,
+    GTEST_TEMPLATE_ T33 = NoneT, GTEST_TEMPLATE_ T34 = NoneT,
+    GTEST_TEMPLATE_ T35 = NoneT, GTEST_TEMPLATE_ T36 = NoneT,
+    GTEST_TEMPLATE_ T37 = NoneT, GTEST_TEMPLATE_ T38 = NoneT,
+    GTEST_TEMPLATE_ T39 = NoneT, GTEST_TEMPLATE_ T40 = NoneT,
+    GTEST_TEMPLATE_ T41 = NoneT, GTEST_TEMPLATE_ T42 = NoneT,
+    GTEST_TEMPLATE_ T43 = NoneT, GTEST_TEMPLATE_ T44 = NoneT,
+    GTEST_TEMPLATE_ T45 = NoneT, GTEST_TEMPLATE_ T46 = NoneT,
+    GTEST_TEMPLATE_ T47 = NoneT, GTEST_TEMPLATE_ T48 = NoneT,
+    GTEST_TEMPLATE_ T49 = NoneT, GTEST_TEMPLATE_ T50 = NoneT>
+struct Templates {
+  typedef Templates50<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+      T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
+      T42, T43, T44, T45, T46, T47, T48, T49, T50> type;
+};
+
+template <>
+struct Templates<NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT> {
+  typedef Templates0 type;
+};
+template <GTEST_TEMPLATE_ T1>
+struct Templates<T1, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT> {
+  typedef Templates1<T1> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2>
+struct Templates<T1, T2, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT> {
+  typedef Templates2<T1, T2> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3>
+struct Templates<T1, T2, T3, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates3<T1, T2, T3> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4>
+struct Templates<T1, T2, T3, T4, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates4<T1, T2, T3, T4> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5>
+struct Templates<T1, T2, T3, T4, T5, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates5<T1, T2, T3, T4, T5> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6>
+struct Templates<T1, T2, T3, T4, T5, T6, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates6<T1, T2, T3, T4, T5, T6> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates7<T1, T2, T3, T4, T5, T6, T7> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates8<T1, T2, T3, T4, T5, T6, T7, T8> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates9<T1, T2, T3, T4, T5, T6, T7, T8, T9> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates10<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates11<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates12<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates13<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates14<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates15<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates16<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates17<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates18<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates19<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates20<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates21<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, T22, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT> {
+  typedef Templates22<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, T22, T23, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT> {
+  typedef Templates23<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT> {
+  typedef Templates24<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT> {
+  typedef Templates25<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT> {
+  typedef Templates26<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT> {
+  typedef Templates27<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+      T27> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT> {
+  typedef Templates28<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+      T28> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT> {
+  typedef Templates29<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+      T28, T29> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+    T30, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates30<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+      T28, T29, T30> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+    T30, T31, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates31<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+      T28, T29, T30, T31> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+    T30, T31, T32, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates32<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+      T28, T29, T30, T31, T32> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+    T30, T31, T32, T33, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates33<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+      T28, T29, T30, T31, T32, T33> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+    T30, T31, T32, T33, T34, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates34<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+      T28, T29, T30, T31, T32, T33, T34> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+    T30, T31, T32, T33, T34, T35, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates35<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+      T28, T29, T30, T31, T32, T33, T34, T35> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+    T30, T31, T32, T33, T34, T35, T36, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates36<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+      T28, T29, T30, T31, T32, T33, T34, T35, T36> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+    GTEST_TEMPLATE_ T37>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+    T30, T31, T32, T33, T34, T35, T36, T37, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates37<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+      T28, T29, T30, T31, T32, T33, T34, T35, T36, T37> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+    T30, T31, T32, T33, T34, T35, T36, T37, T38, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates38<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+      T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+    T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates39<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+      T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
+    GTEST_TEMPLATE_ T40>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+    T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates40<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+      T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
+    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+    T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates41<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+      T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
+      T41> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
+    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+    T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates42<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+      T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
+      T42> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
+    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
+    GTEST_TEMPLATE_ T43>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+    T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates43<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+      T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
+      T42, T43> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
+    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
+    GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+    T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates44<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+      T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
+      T42, T43, T44> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
+    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
+    GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+    T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44,
+    T45, NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates45<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+      T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
+      T42, T43, T44, T45> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
+    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
+    GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,
+    GTEST_TEMPLATE_ T46>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+    T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44,
+    T45, T46, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates46<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+      T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
+      T42, T43, T44, T45, T46> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
+    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
+    GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,
+    GTEST_TEMPLATE_ T46, GTEST_TEMPLATE_ T47>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+    T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44,
+    T45, T46, T47, NoneT, NoneT, NoneT> {
+  typedef Templates47<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+      T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
+      T42, T43, T44, T45, T46, T47> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
+    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
+    GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,
+    GTEST_TEMPLATE_ T46, GTEST_TEMPLATE_ T47, GTEST_TEMPLATE_ T48>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+    T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44,
+    T45, T46, T47, T48, NoneT, NoneT> {
+  typedef Templates48<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+      T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
+      T42, T43, T44, T45, T46, T47, T48> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
+    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
+    GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,
+    GTEST_TEMPLATE_ T46, GTEST_TEMPLATE_ T47, GTEST_TEMPLATE_ T48,
+    GTEST_TEMPLATE_ T49>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+    T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44,
+    T45, T46, T47, T48, T49, NoneT> {
+  typedef Templates49<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+      T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
+      T42, T43, T44, T45, T46, T47, T48, T49> type;
+};
+
+// The TypeList template makes it possible to use either a single type
+// or a Types<...> list in TYPED_TEST_CASE() and
+// INSTANTIATE_TYPED_TEST_CASE_P().
+
+template <typename T>
+struct TypeList {
+  typedef Types1<T> type;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43, typename T44, typename T45,
+    typename T46, typename T47, typename T48, typename T49, typename T50>
+struct TypeList<Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
+    T44, T45, T46, T47, T48, T49, T50> > {
+  typedef typename Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
+      T41, T42, T43, T44, T45, T46, T47, T48, T49, T50>::type type;
+};
+
+#endif  // GTEST_HAS_TYPED_TEST || GTEST_HAS_TYPED_TEST_P
+
+}  // namespace internal
+}  // namespace testing
+
+#endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TYPE_UTIL_H_
+
+// Due to C++ preprocessor weirdness, we need double indirection to
+// concatenate two tokens when one of them is __LINE__.  Writing
+//
+//   foo ## __LINE__
+//
+// will result in the token foo__LINE__, instead of foo followed by
+// the current line number.  For more details, see
+// http://www.parashift.com/c++-faq-lite/misc-technical-issues.html#faq-39.6
+#define GTEST_CONCAT_TOKEN_(foo, bar) GTEST_CONCAT_TOKEN_IMPL_(foo, bar)
+#define GTEST_CONCAT_TOKEN_IMPL_(foo, bar) foo ## bar
+
+class ProtocolMessage;
+namespace proto2 { class Message; }
+
+namespace testing {
+
+// Forward declarations.
+
+class AssertionResult;                 // Result of an assertion.
+class Message;                         // Represents a failure message.
+class Test;                            // Represents a test.
+class TestInfo;                        // Information about a test.
+class TestPartResult;                  // Result of a test part.
+class UnitTest;                        // A collection of test cases.
+
+template <typename T>
+::std::string PrintToString(const T& value);
+
+namespace internal {
+
+struct TraceInfo;                      // Information about a trace point.
+class ScopedTrace;                     // Implements scoped trace.
+class TestInfoImpl;                    // Opaque implementation of TestInfo
+class UnitTestImpl;                    // Opaque implementation of UnitTest
+
+// How many times InitGoogleTest() has been called.
+GTEST_API_ extern int g_init_gtest_count;
+
+// The text used in failure messages to indicate the start of the
+// stack trace.
+GTEST_API_ extern const char kStackTraceMarker[];
+
+// Two overloaded helpers for checking at compile time whether an
+// expression is a null pointer literal (i.e. NULL or any 0-valued
+// compile-time integral constant).  Their return values have
+// different sizes, so we can use sizeof() to test which version is
+// picked by the compiler.  These helpers have no implementations, as
+// we only need their signatures.
+//
+// Given IsNullLiteralHelper(x), the compiler will pick the first
+// version if x can be implicitly converted to Secret*, and pick the
+// second version otherwise.  Since Secret is a secret and incomplete
+// type, the only expression a user can write that has type Secret* is
+// a null pointer literal.  Therefore, we know that x is a null
+// pointer literal if and only if the first version is picked by the
+// compiler.
+char IsNullLiteralHelper(Secret* p);
+char (&IsNullLiteralHelper(...))[2];  // NOLINT
+
+// A compile-time bool constant that is true if and only if x is a
+// null pointer literal (i.e. NULL or any 0-valued compile-time
+// integral constant).
+#ifdef GTEST_ELLIPSIS_NEEDS_POD_
+// We lose support for NULL detection where the compiler doesn't like
+// passing non-POD classes through ellipsis (...).
+# define GTEST_IS_NULL_LITERAL_(x) false
+#else
+# define GTEST_IS_NULL_LITERAL_(x) \
+    (sizeof(::testing::internal::IsNullLiteralHelper(x)) == 1)
+#endif  // GTEST_ELLIPSIS_NEEDS_POD_
+
+// Appends the user-supplied message to the Google-Test-generated message.
+GTEST_API_ std::string AppendUserMessage(
+    const std::string& gtest_msg, const Message& user_msg);
+
+#if GTEST_HAS_EXCEPTIONS
+
+// This exception is thrown by (and only by) a failed Google Test
+// assertion when GTEST_FLAG(throw_on_failure) is true (if exceptions
+// are enabled).  We derive it from std::runtime_error, which is for
+// errors presumably detectable only at run time.  Since
+// std::runtime_error inherits from std::exception, many testing
+// frameworks know how to extract and print the message inside it.
+class GTEST_API_ GoogleTestFailureException : public ::std::runtime_error {
+ public:
+  explicit GoogleTestFailureException(const TestPartResult& failure);
+};
+
+#endif  // GTEST_HAS_EXCEPTIONS
+
+// A helper class for creating scoped traces in user programs.
+class GTEST_API_ ScopedTrace {
+ public:
+  // The c'tor pushes the given source file location and message onto
+  // a trace stack maintained by Google Test.
+  ScopedTrace(const char* file, int line, const Message& message);
+
+  // The d'tor pops the info pushed by the c'tor.
+  //
+  // Note that the d'tor is not virtual in order to be efficient.
+  // Don't inherit from ScopedTrace!
+  ~ScopedTrace();
+
+ private:
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(ScopedTrace);
+} GTEST_ATTRIBUTE_UNUSED_;  // A ScopedTrace object does its job in its
+                            // c'tor and d'tor.  Therefore it doesn't
+                            // need to be used otherwise.
+
+// Constructs and returns the message for an equality assertion
+// (e.g. ASSERT_EQ, EXPECT_STREQ, etc) failure.
+//
+// The first four parameters are the expressions used in the assertion
+// and their values, as strings.  For example, for ASSERT_EQ(foo, bar)
+// where foo is 5 and bar is 6, we have:
+//
+//   expected_expression: "foo"
+//   actual_expression:   "bar"
+//   expected_value:      "5"
+//   actual_value:        "6"
+//
+// The ignoring_case parameter is true iff the assertion is a
+// *_STRCASEEQ*.  When it's true, the string " (ignoring case)" will
+// be inserted into the message.
+GTEST_API_ AssertionResult EqFailure(const char* expected_expression,
+                                     const char* actual_expression,
+                                     const std::string& expected_value,
+                                     const std::string& actual_value,
+                                     bool ignoring_case);
+
+// Constructs a failure message for Boolean assertions such as EXPECT_TRUE.
+GTEST_API_ std::string GetBoolAssertionFailureMessage(
+    const AssertionResult& assertion_result,
+    const char* expression_text,
+    const char* actual_predicate_value,
+    const char* expected_predicate_value);
+
+// This template class represents an IEEE floating-point number
+// (either single-precision or double-precision, depending on the
+// template parameters).
+//
+// The purpose of this class is to do more sophisticated number
+// comparison.  (Due to round-off error, etc, it's very unlikely that
+// two floating-points will be equal exactly.  Hence a naive
+// comparison by the == operation often doesn't work.)
+//
+// Format of IEEE floating-point:
+//
+//   The most-significant bit being the leftmost, an IEEE
+//   floating-point looks like
+//
+//     sign_bit exponent_bits fraction_bits
+//
+//   Here, sign_bit is a single bit that designates the sign of the
+//   number.
+//
+//   For float, there are 8 exponent bits and 23 fraction bits.
+//
+//   For double, there are 11 exponent bits and 52 fraction bits.
+//
+//   More details can be found at
+//   http://en.wikipedia.org/wiki/IEEE_floating-point_standard.
+//
+// Template parameter:
+//
+//   RawType: the raw floating-point type (either float or double)
+template <typename RawType>
+class FloatingPoint {
+ public:
+  // Defines the unsigned integer type that has the same size as the
+  // floating point number.
+  typedef typename TypeWithSize<sizeof(RawType)>::UInt Bits;
+
+  // Constants.
+
+  // # of bits in a number.
+  static const size_t kBitCount = 8*sizeof(RawType);
+
+  // # of fraction bits in a number.
+  static const size_t kFractionBitCount =
+    std::numeric_limits<RawType>::digits - 1;
+
+  // # of exponent bits in a number.
+  static const size_t kExponentBitCount = kBitCount - 1 - kFractionBitCount;
+
+  // The mask for the sign bit.
+  static const Bits kSignBitMask = static_cast<Bits>(1) << (kBitCount - 1);
+
+  // The mask for the fraction bits.
+  static const Bits kFractionBitMask =
+    ~static_cast<Bits>(0) >> (kExponentBitCount + 1);
+
+  // The mask for the exponent bits.
+  static const Bits kExponentBitMask = ~(kSignBitMask | kFractionBitMask);
+
+  // How many ULP's (Units in the Last Place) we want to tolerate when
+  // comparing two numbers.  The larger the value, the more error we
+  // allow.  A 0 value means that two numbers must be exactly the same
+  // to be considered equal.
+  //
+  // The maximum error of a single floating-point operation is 0.5
+  // units in the last place.  On Intel CPU's, all floating-point
+  // calculations are done with 80-bit precision, while double has 64
+  // bits.  Therefore, 4 should be enough for ordinary use.
+  //
+  // See the following article for more details on ULP:
+  // http://randomascii.wordpress.com/2012/02/25/comparing-floating-point-numbers-2012-edition/
+  static const size_t kMaxUlps = 4;
+
+  // Constructs a FloatingPoint from a raw floating-point number.
+  //
+  // On an Intel CPU, passing a non-normalized NAN (Not a Number)
+  // around may change its bits, although the new value is guaranteed
+  // to be also a NAN.  Therefore, don't expect this constructor to
+  // preserve the bits in x when x is a NAN.
+  explicit FloatingPoint(const RawType& x) { u_.value_ = x; }
+
+  // Static methods
+
+  // Reinterprets a bit pattern as a floating-point number.
+  //
+  // This function is needed to test the AlmostEquals() method.
+  static RawType ReinterpretBits(const Bits bits) {
+    FloatingPoint fp(0);
+    fp.u_.bits_ = bits;
+    return fp.u_.value_;
+  }
+
+  // Returns the floating-point number that represent positive infinity.
+  static RawType Infinity() {
+    return ReinterpretBits(kExponentBitMask);
+  }
+
+  // Returns the maximum representable finite floating-point number.
+  static RawType Max();
+
+  // Non-static methods
+
+  // Returns the bits that represents this number.
+  const Bits &bits() const { return u_.bits_; }
+
+  // Returns the exponent bits of this number.
+  Bits exponent_bits() const { return kExponentBitMask & u_.bits_; }
+
+  // Returns the fraction bits of this number.
+  Bits fraction_bits() const { return kFractionBitMask & u_.bits_; }
+
+  // Returns the sign bit of this number.
+  Bits sign_bit() const { return kSignBitMask & u_.bits_; }
+
+  // Returns true iff this is NAN (not a number).
+  bool is_nan() const {
+    // It's a NAN if the exponent bits are all ones and the fraction
+    // bits are not entirely zeros.
+    return (exponent_bits() == kExponentBitMask) && (fraction_bits() != 0);
+  }
+
+  // Returns true iff this number is at most kMaxUlps ULP's away from
+  // rhs.  In particular, this function:
+  //
+  //   - returns false if either number is (or both are) NAN.
+  //   - treats really large numbers as almost equal to infinity.
+  //   - thinks +0.0 and -0.0 are 0 DLP's apart.
+  bool AlmostEquals(const FloatingPoint& rhs) const {
+    // The IEEE standard says that any comparison operation involving
+    // a NAN must return false.
+    if (is_nan() || rhs.is_nan()) return false;
+
+    return DistanceBetweenSignAndMagnitudeNumbers(u_.bits_, rhs.u_.bits_)
+        <= kMaxUlps;
+  }
+
+ private:
+  // The data type used to store the actual floating-point number.
+  union FloatingPointUnion {
+    RawType value_;  // The raw floating-point number.
+    Bits bits_;      // The bits that represent the number.
+  };
+
+  // Converts an integer from the sign-and-magnitude representation to
+  // the biased representation.  More precisely, let N be 2 to the
+  // power of (kBitCount - 1), an integer x is represented by the
+  // unsigned number x + N.
+  //
+  // For instance,
+  //
+  //   -N + 1 (the most negative number representable using
+  //          sign-and-magnitude) is represented by 1;
+  //   0      is represented by N; and
+  //   N - 1  (the biggest number representable using
+  //          sign-and-magnitude) is represented by 2N - 1.
+  //
+  // Read http://en.wikipedia.org/wiki/Signed_number_representations
+  // for more details on signed number representations.
+  static Bits SignAndMagnitudeToBiased(const Bits &sam) {
+    if (kSignBitMask & sam) {
+      // sam represents a negative number.
+      return ~sam + 1;
+    } else {
+      // sam represents a positive number.
+      return kSignBitMask | sam;
+    }
+  }
+
+  // Given two numbers in the sign-and-magnitude representation,
+  // returns the distance between them as an unsigned number.
+  static Bits DistanceBetweenSignAndMagnitudeNumbers(const Bits &sam1,
+                                                     const Bits &sam2) {
+    const Bits biased1 = SignAndMagnitudeToBiased(sam1);
+    const Bits biased2 = SignAndMagnitudeToBiased(sam2);
+    return (biased1 >= biased2) ? (biased1 - biased2) : (biased2 - biased1);
+  }
+
+  FloatingPointUnion u_;
+};
+
+// We cannot use std::numeric_limits<T>::max() as it clashes with the max()
+// macro defined by <windows.h>.
+template <>
+inline float FloatingPoint<float>::Max() { return FLT_MAX; }
+template <>
+inline double FloatingPoint<double>::Max() { return DBL_MAX; }
+
+// Typedefs the instances of the FloatingPoint template class that we
+// care to use.
+typedef FloatingPoint<float> Float;
+typedef FloatingPoint<double> Double;
+
+// In order to catch the mistake of putting tests that use different
+// test fixture classes in the same test case, we need to assign
+// unique IDs to fixture classes and compare them.  The TypeId type is
+// used to hold such IDs.  The user should treat TypeId as an opaque
+// type: the only operation allowed on TypeId values is to compare
+// them for equality using the == operator.
+typedef const void* TypeId;
+
+template <typename T>
+class TypeIdHelper {
+ public:
+  // dummy_ must not have a const type.  Otherwise an overly eager
+  // compiler (e.g. MSVC 7.1 & 8.0) may try to merge
+  // TypeIdHelper<T>::dummy_ for different Ts as an "optimization".
+  static bool dummy_;
+};
+
+template <typename T>
+bool TypeIdHelper<T>::dummy_ = false;
+
+// GetTypeId<T>() returns the ID of type T.  Different values will be
+// returned for different types.  Calling the function twice with the
+// same type argument is guaranteed to return the same ID.
+template <typename T>
+TypeId GetTypeId() {
+  // The compiler is required to allocate a different
+  // TypeIdHelper<T>::dummy_ variable for each T used to instantiate
+  // the template.  Therefore, the address of dummy_ is guaranteed to
+  // be unique.
+  return &(TypeIdHelper<T>::dummy_);
+}
+
+// Returns the type ID of ::testing::Test.  Always call this instead
+// of GetTypeId< ::testing::Test>() to get the type ID of
+// ::testing::Test, as the latter may give the wrong result due to a
+// suspected linker bug when compiling Google Test as a Mac OS X
+// framework.
+GTEST_API_ TypeId GetTestTypeId();
+
+// Defines the abstract factory interface that creates instances
+// of a Test object.
+class TestFactoryBase {
+ public:
+  virtual ~TestFactoryBase() {}
+
+  // Creates a test instance to run. The instance is both created and destroyed
+  // within TestInfoImpl::Run()
+  virtual Test* CreateTest() = 0;
+
+ protected:
+  TestFactoryBase() {}
+
+ private:
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(TestFactoryBase);
+};
+
+// This class provides implementation of TeastFactoryBase interface.
+// It is used in TEST and TEST_F macros.
+template <class TestClass>
+class TestFactoryImpl : public TestFactoryBase {
+ public:
+  virtual Test* CreateTest() { return new TestClass; }
+};
+
+#if GTEST_OS_WINDOWS
+
+// Predicate-formatters for implementing the HRESULT checking macros
+// {ASSERT|EXPECT}_HRESULT_{SUCCEEDED|FAILED}
+// We pass a long instead of HRESULT to avoid causing an
+// include dependency for the HRESULT type.
+GTEST_API_ AssertionResult IsHRESULTSuccess(const char* expr,
+                                            long hr);  // NOLINT
+GTEST_API_ AssertionResult IsHRESULTFailure(const char* expr,
+                                            long hr);  // NOLINT
+
+#endif  // GTEST_OS_WINDOWS
+
+// Types of SetUpTestCase() and TearDownTestCase() functions.
+typedef void (*SetUpTestCaseFunc)();
+typedef void (*TearDownTestCaseFunc)();
+
+// Creates a new TestInfo object and registers it with Google Test;
+// returns the created object.
+//
+// Arguments:
+//
+//   test_case_name:   name of the test case
+//   name:             name of the test
+//   type_param        the name of the test's type parameter, or NULL if
+//                     this is not a typed or a type-parameterized test.
+//   value_param       text representation of the test's value parameter,
+//                     or NULL if this is not a type-parameterized test.
+//   fixture_class_id: ID of the test fixture class
+//   set_up_tc:        pointer to the function that sets up the test case
+//   tear_down_tc:     pointer to the function that tears down the test case
+//   factory:          pointer to the factory that creates a test object.
+//                     The newly created TestInfo instance will assume
+//                     ownership of the factory object.
+GTEST_API_ TestInfo* MakeAndRegisterTestInfo(
+    const char* test_case_name,
+    const char* name,
+    const char* type_param,
+    const char* value_param,
+    TypeId fixture_class_id,
+    SetUpTestCaseFunc set_up_tc,
+    TearDownTestCaseFunc tear_down_tc,
+    TestFactoryBase* factory);
+
+// If *pstr starts with the given prefix, modifies *pstr to be right
+// past the prefix and returns true; otherwise leaves *pstr unchanged
+// and returns false.  None of pstr, *pstr, and prefix can be NULL.
+GTEST_API_ bool SkipPrefix(const char* prefix, const char** pstr);
+
+#if GTEST_HAS_TYPED_TEST || GTEST_HAS_TYPED_TEST_P
+
+// State of the definition of a type-parameterized test case.
+class GTEST_API_ TypedTestCasePState {
+ public:
+  TypedTestCasePState() : registered_(false) {}
+
+  // Adds the given test name to defined_test_names_ and return true
+  // if the test case hasn't been registered; otherwise aborts the
+  // program.
+  bool AddTestName(const char* file, int line, const char* case_name,
+                   const char* test_name) {
+    if (registered_) {
+      fprintf(stderr, "%s Test %s must be defined before "
+              "REGISTER_TYPED_TEST_CASE_P(%s, ...).\n",
+              FormatFileLocation(file, line).c_str(), test_name, case_name);
+      fflush(stderr);
+      posix::Abort();
+    }
+    defined_test_names_.insert(test_name);
+    return true;
+  }
+
+  // Verifies that registered_tests match the test names in
+  // defined_test_names_; returns registered_tests if successful, or
+  // aborts the program otherwise.
+  const char* VerifyRegisteredTestNames(
+      const char* file, int line, const char* registered_tests);
+
+ private:
+  bool registered_;
+  ::std::set<const char*> defined_test_names_;
+};
+
+// Skips to the first non-space char after the first comma in 'str';
+// returns NULL if no comma is found in 'str'.
+inline const char* SkipComma(const char* str) {
+  const char* comma = strchr(str, ',');
+  if (comma == NULL) {
+    return NULL;
+  }
+  while (IsSpace(*(++comma))) {}
+  return comma;
+}
+
+// Returns the prefix of 'str' before the first comma in it; returns
+// the entire string if it contains no comma.
+inline std::string GetPrefixUntilComma(const char* str) {
+  const char* comma = strchr(str, ',');
+  return comma == NULL ? str : std::string(str, comma);
+}
+
+// TypeParameterizedTest<Fixture, TestSel, Types>::Register()
+// registers a list of type-parameterized tests with Google Test.  The
+// return value is insignificant - we just need to return something
+// such that we can call this function in a namespace scope.
+//
+// Implementation note: The GTEST_TEMPLATE_ macro declares a template
+// template parameter.  It's defined in gtest-type-util.h.
+template <GTEST_TEMPLATE_ Fixture, class TestSel, typename Types>
+class TypeParameterizedTest {
+ public:
+  // 'index' is the index of the test in the type list 'Types'
+  // specified in INSTANTIATE_TYPED_TEST_CASE_P(Prefix, TestCase,
+  // Types).  Valid values for 'index' are [0, N - 1] where N is the
+  // length of Types.
+  static bool Register(const char* prefix, const char* case_name,
+                       const char* test_names, int index) {
+    typedef typename Types::Head Type;
+    typedef Fixture<Type> FixtureClass;
+    typedef typename GTEST_BIND_(TestSel, Type) TestClass;
+
+    // First, registers the first type-parameterized test in the type
+    // list.
+    MakeAndRegisterTestInfo(
+        (std::string(prefix) + (prefix[0] == '\0' ? "" : "/") + case_name + "/"
+         + StreamableToString(index)).c_str(),
+        GetPrefixUntilComma(test_names).c_str(),
+        GetTypeName<Type>().c_str(),
+        NULL,  // No value parameter.
+        GetTypeId<FixtureClass>(),
+        TestClass::SetUpTestCase,
+        TestClass::TearDownTestCase,
+        new TestFactoryImpl<TestClass>);
+
+    // Next, recurses (at compile time) with the tail of the type list.
+    return TypeParameterizedTest<Fixture, TestSel, typename Types::Tail>
+        ::Register(prefix, case_name, test_names, index + 1);
+  }
+};
+
+// The base case for the compile time recursion.
+template <GTEST_TEMPLATE_ Fixture, class TestSel>
+class TypeParameterizedTest<Fixture, TestSel, Types0> {
+ public:
+  static bool Register(const char* /*prefix*/, const char* /*case_name*/,
+                       const char* /*test_names*/, int /*index*/) {
+    return true;
+  }
+};
+
+// TypeParameterizedTestCase<Fixture, Tests, Types>::Register()
+// registers *all combinations* of 'Tests' and 'Types' with Google
+// Test.  The return value is insignificant - we just need to return
+// something such that we can call this function in a namespace scope.
+template <GTEST_TEMPLATE_ Fixture, typename Tests, typename Types>
+class TypeParameterizedTestCase {
+ public:
+  static bool Register(const char* prefix, const char* case_name,
+                       const char* test_names) {
+    typedef typename Tests::Head Head;
+
+    // First, register the first test in 'Test' for each type in 'Types'.
+    TypeParameterizedTest<Fixture, Head, Types>::Register(
+        prefix, case_name, test_names, 0);
+
+    // Next, recurses (at compile time) with the tail of the test list.
+    return TypeParameterizedTestCase<Fixture, typename Tests::Tail, Types>
+        ::Register(prefix, case_name, SkipComma(test_names));
+  }
+};
+
+// The base case for the compile time recursion.
+template <GTEST_TEMPLATE_ Fixture, typename Types>
+class TypeParameterizedTestCase<Fixture, Templates0, Types> {
+ public:
+  static bool Register(const char* /*prefix*/, const char* /*case_name*/,
+                       const char* /*test_names*/) {
+    return true;
+  }
+};
+
+#endif  // GTEST_HAS_TYPED_TEST || GTEST_HAS_TYPED_TEST_P
+
+// Returns the current OS stack trace as an std::string.
+//
+// The maximum number of stack frames to be included is specified by
+// the gtest_stack_trace_depth flag.  The skip_count parameter
+// specifies the number of top frames to be skipped, which doesn't
+// count against the number of frames to be included.
+//
+// For example, if Foo() calls Bar(), which in turn calls
+// GetCurrentOsStackTraceExceptTop(..., 1), Foo() will be included in
+// the trace but Bar() and GetCurrentOsStackTraceExceptTop() won't.
+GTEST_API_ std::string GetCurrentOsStackTraceExceptTop(
+    UnitTest* unit_test, int skip_count);
+
+// Helpers for suppressing warnings on unreachable code or constant
+// condition.
+
+// Always returns true.
+GTEST_API_ bool AlwaysTrue();
+
+// Always returns false.
+inline bool AlwaysFalse() { return !AlwaysTrue(); }
+
+// Helper for suppressing false warning from Clang on a const char*
+// variable declared in a conditional expression always being NULL in
+// the else branch.
+struct GTEST_API_ ConstCharPtr {
+  ConstCharPtr(const char* str) : value(str) {}
+  operator bool() const { return true; }
+  const char* value;
+};
+
+// A simple Linear Congruential Generator for generating random
+// numbers with a uniform distribution.  Unlike rand() and srand(), it
+// doesn't use global state (and therefore can't interfere with user
+// code).  Unlike rand_r(), it's portable.  An LCG isn't very random,
+// but it's good enough for our purposes.
+class GTEST_API_ Random {
+ public:
+  static const UInt32 kMaxRange = 1u << 31;
+
+  explicit Random(UInt32 seed) : state_(seed) {}
+
+  void Reseed(UInt32 seed) { state_ = seed; }
+
+  // Generates a random number from [0, range).  Crashes if 'range' is
+  // 0 or greater than kMaxRange.
+  UInt32 Generate(UInt32 range);
+
+ private:
+  UInt32 state_;
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(Random);
+};
+
+// Defining a variable of type CompileAssertTypesEqual<T1, T2> will cause a
+// compiler error iff T1 and T2 are different types.
+template <typename T1, typename T2>
+struct CompileAssertTypesEqual;
+
+template <typename T>
+struct CompileAssertTypesEqual<T, T> {
+};
+
+// Removes the reference from a type if it is a reference type,
+// otherwise leaves it unchanged.  This is the same as
+// tr1::remove_reference, which is not widely available yet.
+template <typename T>
+struct RemoveReference { typedef T type; };  // NOLINT
+template <typename T>
+struct RemoveReference<T&> { typedef T type; };  // NOLINT
+
+// A handy wrapper around RemoveReference that works when the argument
+// T depends on template parameters.
+#define GTEST_REMOVE_REFERENCE_(T) \
+    typename ::testing::internal::RemoveReference<T>::type
+
+// Removes const from a type if it is a const type, otherwise leaves
+// it unchanged.  This is the same as tr1::remove_const, which is not
+// widely available yet.
+template <typename T>
+struct RemoveConst { typedef T type; };  // NOLINT
+template <typename T>
+struct RemoveConst<const T> { typedef T type; };  // NOLINT
+
+// MSVC 8.0, Sun C++, and IBM XL C++ have a bug which causes the above
+// definition to fail to remove the const in 'const int[3]' and 'const
+// char[3][4]'.  The following specialization works around the bug.
+template <typename T, size_t N>
+struct RemoveConst<const T[N]> {
+  typedef typename RemoveConst<T>::type type[N];
+};
+
+#if defined(_MSC_VER) && _MSC_VER < 1400
+// This is the only specialization that allows VC++ 7.1 to remove const in
+// 'const int[3] and 'const int[3][4]'.  However, it causes trouble with GCC
+// and thus needs to be conditionally compiled.
+template <typename T, size_t N>
+struct RemoveConst<T[N]> {
+  typedef typename RemoveConst<T>::type type[N];
+};
+#endif
+
+// A handy wrapper around RemoveConst that works when the argument
+// T depends on template parameters.
+#define GTEST_REMOVE_CONST_(T) \
+    typename ::testing::internal::RemoveConst<T>::type
+
+// Turns const U&, U&, const U, and U all into U.
+#define GTEST_REMOVE_REFERENCE_AND_CONST_(T) \
+    GTEST_REMOVE_CONST_(GTEST_REMOVE_REFERENCE_(T))
+
+// Adds reference to a type if it is not a reference type,
+// otherwise leaves it unchanged.  This is the same as
+// tr1::add_reference, which is not widely available yet.
+template <typename T>
+struct AddReference { typedef T& type; };  // NOLINT
+template <typename T>
+struct AddReference<T&> { typedef T& type; };  // NOLINT
+
+// A handy wrapper around AddReference that works when the argument T
+// depends on template parameters.
+#define GTEST_ADD_REFERENCE_(T) \
+    typename ::testing::internal::AddReference<T>::type
+
+// Adds a reference to const on top of T as necessary.  For example,
+// it transforms
+//
+//   char         ==> const char&
+//   const char   ==> const char&
+//   char&        ==> const char&
+//   const char&  ==> const char&
+//
+// The argument T must depend on some template parameters.
+#define GTEST_REFERENCE_TO_CONST_(T) \
+    GTEST_ADD_REFERENCE_(const GTEST_REMOVE_REFERENCE_(T))
+
+// ImplicitlyConvertible<From, To>::value is a compile-time bool
+// constant that's true iff type From can be implicitly converted to
+// type To.
+template <typename From, typename To>
+class ImplicitlyConvertible {
+ private:
+  // We need the following helper functions only for their types.
+  // They have no implementations.
+
+  // MakeFrom() is an expression whose type is From.  We cannot simply
+  // use From(), as the type From may not have a public default
+  // constructor.
+  static From MakeFrom();
+
+  // These two functions are overloaded.  Given an expression
+  // Helper(x), the compiler will pick the first version if x can be
+  // implicitly converted to type To; otherwise it will pick the
+  // second version.
+  //
+  // The first version returns a value of size 1, and the second
+  // version returns a value of size 2.  Therefore, by checking the
+  // size of Helper(x), which can be done at compile time, we can tell
+  // which version of Helper() is used, and hence whether x can be
+  // implicitly converted to type To.
+  static char Helper(To);
+  static char (&Helper(...))[2];  // NOLINT
+
+  // We have to put the 'public' section after the 'private' section,
+  // or MSVC refuses to compile the code.
+ public:
+  // MSVC warns about implicitly converting from double to int for
+  // possible loss of data, so we need to temporarily disable the
+  // warning.
+#ifdef _MSC_VER
+# pragma warning(push)          // Saves the current warning state.
+# pragma warning(disable:4244)  // Temporarily disables warning 4244.
+
+  static const bool value =
+      sizeof(Helper(ImplicitlyConvertible::MakeFrom())) == 1;
+# pragma warning(pop)           // Restores the warning state.
+#elif defined(__BORLANDC__)
+  // C++Builder cannot use member overload resolution during template
+  // instantiation.  The simplest workaround is to use its C++0x type traits
+  // functions (C++Builder 2009 and above only).
+  static const bool value = __is_convertible(From, To);
+#else
+  static const bool value =
+      sizeof(Helper(ImplicitlyConvertible::MakeFrom())) == 1;
+#endif  // _MSV_VER
+};
+template <typename From, typename To>
+const bool ImplicitlyConvertible<From, To>::value;
+
+// IsAProtocolMessage<T>::value is a compile-time bool constant that's
+// true iff T is type ProtocolMessage, proto2::Message, or a subclass
+// of those.
+template <typename T>
+struct IsAProtocolMessage
+    : public bool_constant<
+  ImplicitlyConvertible<const T*, const ::ProtocolMessage*>::value ||
+  ImplicitlyConvertible<const T*, const ::proto2::Message*>::value> {
+};
+
+// When the compiler sees expression IsContainerTest<C>(0), if C is an
+// STL-style container class, the first overload of IsContainerTest
+// will be viable (since both C::iterator* and C::const_iterator* are
+// valid types and NULL can be implicitly converted to them).  It will
+// be picked over the second overload as 'int' is a perfect match for
+// the type of argument 0.  If C::iterator or C::const_iterator is not
+// a valid type, the first overload is not viable, and the second
+// overload will be picked.  Therefore, we can determine whether C is
+// a container class by checking the type of IsContainerTest<C>(0).
+// The value of the expression is insignificant.
+//
+// Note that we look for both C::iterator and C::const_iterator.  The
+// reason is that C++ injects the name of a class as a member of the
+// class itself (e.g. you can refer to class iterator as either
+// 'iterator' or 'iterator::iterator').  If we look for C::iterator
+// only, for example, we would mistakenly think that a class named
+// iterator is an STL container.
+//
+// Also note that the simpler approach of overloading
+// IsContainerTest(typename C::const_iterator*) and
+// IsContainerTest(...) doesn't work with Visual Age C++ and Sun C++.
+typedef int IsContainer;
+template <class C>
+IsContainer IsContainerTest(int /* dummy */,
+                            typename C::iterator* /* it */ = NULL,
+                            typename C::const_iterator* /* const_it */ = NULL) {
+  return 0;
+}
+
+typedef char IsNotContainer;
+template <class C>
+IsNotContainer IsContainerTest(long /* dummy */) { return '\0'; }
+
+// EnableIf<condition>::type is void when 'Cond' is true, and
+// undefined when 'Cond' is false.  To use SFINAE to make a function
+// overload only apply when a particular expression is true, add
+// "typename EnableIf<expression>::type* = 0" as the last parameter.
+template<bool> struct EnableIf;
+template<> struct EnableIf<true> { typedef void type; };  // NOLINT
+
+// Utilities for native arrays.
+
+// ArrayEq() compares two k-dimensional native arrays using the
+// elements' operator==, where k can be any integer >= 0.  When k is
+// 0, ArrayEq() degenerates into comparing a single pair of values.
+
+template <typename T, typename U>
+bool ArrayEq(const T* lhs, size_t size, const U* rhs);
+
+// This generic version is used when k is 0.
+template <typename T, typename U>
+inline bool ArrayEq(const T& lhs, const U& rhs) { return lhs == rhs; }
+
+// This overload is used when k >= 1.
+template <typename T, typename U, size_t N>
+inline bool ArrayEq(const T(&lhs)[N], const U(&rhs)[N]) {
+  return internal::ArrayEq(lhs, N, rhs);
+}
+
+// This helper reduces code bloat.  If we instead put its logic inside
+// the previous ArrayEq() function, arrays with different sizes would
+// lead to different copies of the template code.
+template <typename T, typename U>
+bool ArrayEq(const T* lhs, size_t size, const U* rhs) {
+  for (size_t i = 0; i != size; i++) {
+    if (!internal::ArrayEq(lhs[i], rhs[i]))
+      return false;
+  }
+  return true;
+}
+
+// Finds the first element in the iterator range [begin, end) that
+// equals elem.  Element may be a native array type itself.
+template <typename Iter, typename Element>
+Iter ArrayAwareFind(Iter begin, Iter end, const Element& elem) {
+  for (Iter it = begin; it != end; ++it) {
+    if (internal::ArrayEq(*it, elem))
+      return it;
+  }
+  return end;
+}
+
+// CopyArray() copies a k-dimensional native array using the elements'
+// operator=, where k can be any integer >= 0.  When k is 0,
+// CopyArray() degenerates into copying a single value.
+
+template <typename T, typename U>
+void CopyArray(const T* from, size_t size, U* to);
+
+// This generic version is used when k is 0.
+template <typename T, typename U>
+inline void CopyArray(const T& from, U* to) { *to = from; }
+
+// This overload is used when k >= 1.
+template <typename T, typename U, size_t N>
+inline void CopyArray(const T(&from)[N], U(*to)[N]) {
+  internal::CopyArray(from, N, *to);
+}
+
+// This helper reduces code bloat.  If we instead put its logic inside
+// the previous CopyArray() function, arrays with different sizes
+// would lead to different copies of the template code.
+template <typename T, typename U>
+void CopyArray(const T* from, size_t size, U* to) {
+  for (size_t i = 0; i != size; i++) {
+    internal::CopyArray(from[i], to + i);
+  }
+}
+
+// The relation between an NativeArray object (see below) and the
+// native array it represents.
+enum RelationToSource {
+  kReference,  // The NativeArray references the native array.
+  kCopy        // The NativeArray makes a copy of the native array and
+               // owns the copy.
+};
+
+// Adapts a native array to a read-only STL-style container.  Instead
+// of the complete STL container concept, this adaptor only implements
+// members useful for Google Mock's container matchers.  New members
+// should be added as needed.  To simplify the implementation, we only
+// support Element being a raw type (i.e. having no top-level const or
+// reference modifier).  It's the client's responsibility to satisfy
+// this requirement.  Element can be an array type itself (hence
+// multi-dimensional arrays are supported).
+template <typename Element>
+class NativeArray {
+ public:
+  // STL-style container typedefs.
+  typedef Element value_type;
+  typedef Element* iterator;
+  typedef const Element* const_iterator;
+
+  // Constructs from a native array.
+  NativeArray(const Element* array, size_t count, RelationToSource relation) {
+    Init(array, count, relation);
+  }
+
+  // Copy constructor.
+  NativeArray(const NativeArray& rhs) {
+    Init(rhs.array_, rhs.size_, rhs.relation_to_source_);
+  }
+
+  ~NativeArray() {
+    // Ensures that the user doesn't instantiate NativeArray with a
+    // const or reference type.
+    static_cast<void>(StaticAssertTypeEqHelper<Element,
+        GTEST_REMOVE_REFERENCE_AND_CONST_(Element)>());
+    if (relation_to_source_ == kCopy)
+      delete[] array_;
+  }
+
+  // STL-style container methods.
+  size_t size() const { return size_; }
+  const_iterator begin() const { return array_; }
+  const_iterator end() const { return array_ + size_; }
+  bool operator==(const NativeArray& rhs) const {
+    return size() == rhs.size() &&
+        ArrayEq(begin(), size(), rhs.begin());
+  }
+
+ private:
+  // Initializes this object; makes a copy of the input array if
+  // 'relation' is kCopy.
+  void Init(const Element* array, size_t a_size, RelationToSource relation) {
+    if (relation == kReference) {
+      array_ = array;
+    } else {
+      Element* const copy = new Element[a_size];
+      CopyArray(array, a_size, copy);
+      array_ = copy;
+    }
+    size_ = a_size;
+    relation_to_source_ = relation;
+  }
+
+  const Element* array_;
+  size_t size_;
+  RelationToSource relation_to_source_;
+
+  GTEST_DISALLOW_ASSIGN_(NativeArray);
+};
+
+}  // namespace internal
+}  // namespace testing
+
+#define GTEST_MESSAGE_AT_(file, line, message, result_type) \
+  ::testing::internal::AssertHelper(result_type, file, line, message) \
+    = ::testing::Message()
+
+#define GTEST_MESSAGE_(message, result_type) \
+  GTEST_MESSAGE_AT_(__FILE__, __LINE__, message, result_type)
+
+#define GTEST_FATAL_FAILURE_(message) \
+  return GTEST_MESSAGE_(message, ::testing::TestPartResult::kFatalFailure)
+
+#define GTEST_NONFATAL_FAILURE_(message) \
+  GTEST_MESSAGE_(message, ::testing::TestPartResult::kNonFatalFailure)
+
+#define GTEST_SUCCESS_(message) \
+  GTEST_MESSAGE_(message, ::testing::TestPartResult::kSuccess)
+
+// Suppresses MSVC warnings 4072 (unreachable code) for the code following
+// statement if it returns or throws (or doesn't return or throw in some
+// situations).
+#define GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement) \
+  if (::testing::internal::AlwaysTrue()) { statement; }
+
+#define GTEST_TEST_THROW_(statement, expected_exception, fail) \
+  GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
+  if (::testing::internal::ConstCharPtr gtest_msg = "") { \
+    bool gtest_caught_expected = false; \
+    try { \
+      GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \
+    } \
+    catch (expected_exception const&) { \
+      gtest_caught_expected = true; \
+    } \
+    catch (...) { \
+      gtest_msg.value = \
+          "Expected: " #statement " throws an exception of type " \
+          #expected_exception ".\n  Actual: it throws a different type."; \
+      goto GTEST_CONCAT_TOKEN_(gtest_label_testthrow_, __LINE__); \
+    } \
+    if (!gtest_caught_expected) { \
+      gtest_msg.value = \
+          "Expected: " #statement " throws an exception of type " \
+          #expected_exception ".\n  Actual: it throws nothing."; \
+      goto GTEST_CONCAT_TOKEN_(gtest_label_testthrow_, __LINE__); \
+    } \
+  } else \
+    GTEST_CONCAT_TOKEN_(gtest_label_testthrow_, __LINE__): \
+      fail(gtest_msg.value)
+
+#define GTEST_TEST_NO_THROW_(statement, fail) \
+  GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
+  if (::testing::internal::AlwaysTrue()) { \
+    try { \
+      GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \
+    } \
+    catch (...) { \
+      goto GTEST_CONCAT_TOKEN_(gtest_label_testnothrow_, __LINE__); \
+    } \
+  } else \
+    GTEST_CONCAT_TOKEN_(gtest_label_testnothrow_, __LINE__): \
+      fail("Expected: " #statement " doesn't throw an exception.\n" \
+           "  Actual: it throws.")
+
+#define GTEST_TEST_ANY_THROW_(statement, fail) \
+  GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
+  if (::testing::internal::AlwaysTrue()) { \
+    bool gtest_caught_any = false; \
+    try { \
+      GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \
+    } \
+    catch (...) { \
+      gtest_caught_any = true; \
+    } \
+    if (!gtest_caught_any) { \
+      goto GTEST_CONCAT_TOKEN_(gtest_label_testanythrow_, __LINE__); \
+    } \
+  } else \
+    GTEST_CONCAT_TOKEN_(gtest_label_testanythrow_, __LINE__): \
+      fail("Expected: " #statement " throws an exception.\n" \
+           "  Actual: it doesn't.")
+
+
+// Implements Boolean test assertions such as EXPECT_TRUE. expression can be
+// either a boolean expression or an AssertionResult. text is a textual
+// represenation of expression as it was passed into the EXPECT_TRUE.
+#define GTEST_TEST_BOOLEAN_(expression, text, actual, expected, fail) \
+  GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
+  if (const ::testing::AssertionResult gtest_ar_ = \
+      ::testing::AssertionResult(expression)) \
+    ; \
+  else \
+    fail(::testing::internal::GetBoolAssertionFailureMessage(\
+        gtest_ar_, text, #actual, #expected).c_str())
+
+#define GTEST_TEST_NO_FATAL_FAILURE_(statement, fail) \
+  GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
+  if (::testing::internal::AlwaysTrue()) { \
+    ::testing::internal::HasNewFatalFailureHelper gtest_fatal_failure_checker; \
+    GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \
+    if (gtest_fatal_failure_checker.has_new_fatal_failure()) { \
+      goto GTEST_CONCAT_TOKEN_(gtest_label_testnofatal_, __LINE__); \
+    } \
+  } else \
+    GTEST_CONCAT_TOKEN_(gtest_label_testnofatal_, __LINE__): \
+      fail("Expected: " #statement " doesn't generate new fatal " \
+           "failures in the current thread.\n" \
+           "  Actual: it does.")
+
+// Expands to the name of the class that implements the given test.
+#define GTEST_TEST_CLASS_NAME_(test_case_name, test_name) \
+  test_case_name##_##test_name##_Test
+
+// Helper macro for defining tests.
+#define GTEST_TEST_(test_case_name, test_name, parent_class, parent_id)\
+class GTEST_TEST_CLASS_NAME_(test_case_name, test_name) : public parent_class {\
+ public:\
+  GTEST_TEST_CLASS_NAME_(test_case_name, test_name)() {}\
+ private:\
+  virtual void TestBody();\
+  static ::testing::TestInfo* const test_info_ GTEST_ATTRIBUTE_UNUSED_;\
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(\
+      GTEST_TEST_CLASS_NAME_(test_case_name, test_name));\
+};\
+\
+::testing::TestInfo* const GTEST_TEST_CLASS_NAME_(test_case_name, test_name)\
+  ::test_info_ =\
+    ::testing::internal::MakeAndRegisterTestInfo(\
+        #test_case_name, #test_name, NULL, NULL, \
+        (parent_id), \
+        parent_class::SetUpTestCase, \
+        parent_class::TearDownTestCase, \
+        new ::testing::internal::TestFactoryImpl<\
+            GTEST_TEST_CLASS_NAME_(test_case_name, test_name)>);\
+void GTEST_TEST_CLASS_NAME_(test_case_name, test_name)::TestBody()
+
+#endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_INTERNAL_H_
+// Copyright 2005, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+//
+// The Google C++ Testing Framework (Google Test)
+//
+// This header file defines the public API for death tests.  It is
+// #included by gtest.h so a user doesn't need to include this
+// directly.
+
+#ifndef GTEST_INCLUDE_GTEST_GTEST_DEATH_TEST_H_
+#define GTEST_INCLUDE_GTEST_GTEST_DEATH_TEST_H_
+
+// Copyright 2005, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Authors: wan at google.com (Zhanyong Wan), eefacm at gmail.com (Sean Mcafee)
+//
+// The Google C++ Testing Framework (Google Test)
+//
+// This header file defines internal utilities needed for implementing
+// death tests.  They are subject to change without notice.
+
+#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_DEATH_TEST_INTERNAL_H_
+#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_DEATH_TEST_INTERNAL_H_
+
+
+#include <stdio.h>
+
+namespace testing {
+namespace internal {
+
+GTEST_DECLARE_string_(internal_run_death_test);
+
+// Names of the flags (needed for parsing Google Test flags).
+const char kDeathTestStyleFlag[] = "death_test_style";
+const char kDeathTestUseFork[] = "death_test_use_fork";
+const char kInternalRunDeathTestFlag[] = "internal_run_death_test";
+
+#if GTEST_HAS_DEATH_TEST
+
+// DeathTest is a class that hides much of the complexity of the
+// GTEST_DEATH_TEST_ macro.  It is abstract; its static Create method
+// returns a concrete class that depends on the prevailing death test
+// style, as defined by the --gtest_death_test_style and/or
+// --gtest_internal_run_death_test flags.
+
+// In describing the results of death tests, these terms are used with
+// the corresponding definitions:
+//
+// exit status:  The integer exit information in the format specified
+//               by wait(2)
+// exit code:    The integer code passed to exit(3), _exit(2), or
+//               returned from main()
+class GTEST_API_ DeathTest {
+ public:
+  // Create returns false if there was an error determining the
+  // appropriate action to take for the current death test; for example,
+  // if the gtest_death_test_style flag is set to an invalid value.
+  // The LastMessage method will return a more detailed message in that
+  // case.  Otherwise, the DeathTest pointer pointed to by the "test"
+  // argument is set.  If the death test should be skipped, the pointer
+  // is set to NULL; otherwise, it is set to the address of a new concrete
+  // DeathTest object that controls the execution of the current test.
+  static bool Create(const char* statement, const RE* regex,
+                     const char* file, int line, DeathTest** test);
+  DeathTest();
+  virtual ~DeathTest() { }
+
+  // A helper class that aborts a death test when it's deleted.
+  class ReturnSentinel {
+   public:
+    explicit ReturnSentinel(DeathTest* test) : test_(test) { }
+    ~ReturnSentinel() { test_->Abort(TEST_ENCOUNTERED_RETURN_STATEMENT); }
+   private:
+    DeathTest* const test_;
+    GTEST_DISALLOW_COPY_AND_ASSIGN_(ReturnSentinel);
+  } GTEST_ATTRIBUTE_UNUSED_;
+
+  // An enumeration of possible roles that may be taken when a death
+  // test is encountered.  EXECUTE means that the death test logic should
+  // be executed immediately.  OVERSEE means that the program should prepare
+  // the appropriate environment for a child process to execute the death
+  // test, then wait for it to complete.
+  enum TestRole { OVERSEE_TEST, EXECUTE_TEST };
+
+  // An enumeration of the three reasons that a test might be aborted.
+  enum AbortReason {
+    TEST_ENCOUNTERED_RETURN_STATEMENT,
+    TEST_THREW_EXCEPTION,
+    TEST_DID_NOT_DIE
+  };
+
+  // Assumes one of the above roles.
+  virtual TestRole AssumeRole() = 0;
+
+  // Waits for the death test to finish and returns its status.
+  virtual int Wait() = 0;
+
+  // Returns true if the death test passed; that is, the test process
+  // exited during the test, its exit status matches a user-supplied
+  // predicate, and its stderr output matches a user-supplied regular
+  // expression.
+  // The user-supplied predicate may be a macro expression rather
+  // than a function pointer or functor, or else Wait and Passed could
+  // be combined.
+  virtual bool Passed(bool exit_status_ok) = 0;
+
+  // Signals that the death test did not die as expected.
+  virtual void Abort(AbortReason reason) = 0;
+
+  // Returns a human-readable outcome message regarding the outcome of
+  // the last death test.
+  static const char* LastMessage();
+
+  static void set_last_death_test_message(const std::string& message);
+
+ private:
+  // A string containing a description of the outcome of the last death test.
+  static std::string last_death_test_message_;
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(DeathTest);
+};
+
+// Factory interface for death tests.  May be mocked out for testing.
+class DeathTestFactory {
+ public:
+  virtual ~DeathTestFactory() { }
+  virtual bool Create(const char* statement, const RE* regex,
+                      const char* file, int line, DeathTest** test) = 0;
+};
+
+// A concrete DeathTestFactory implementation for normal use.
+class DefaultDeathTestFactory : public DeathTestFactory {
+ public:
+  virtual bool Create(const char* statement, const RE* regex,
+                      const char* file, int line, DeathTest** test);
+};
+
+// Returns true if exit_status describes a process that was terminated
+// by a signal, or exited normally with a nonzero exit code.
+GTEST_API_ bool ExitedUnsuccessfully(int exit_status);
+
+// Traps C++ exceptions escaping statement and reports them as test
+// failures. Note that trapping SEH exceptions is not implemented here.
+# if GTEST_HAS_EXCEPTIONS
+#  define GTEST_EXECUTE_DEATH_TEST_STATEMENT_(statement, death_test) \
+  try { \
+    GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \
+  } catch (const ::std::exception& gtest_exception) { \
+    fprintf(\
+        stderr, \
+        "\n%s: Caught std::exception-derived exception escaping the " \
+        "death test statement. Exception message: %s\n", \
+        ::testing::internal::FormatFileLocation(__FILE__, __LINE__).c_str(), \
+        gtest_exception.what()); \
+    fflush(stderr); \
+    death_test->Abort(::testing::internal::DeathTest::TEST_THREW_EXCEPTION); \
+  } catch (...) { \
+    death_test->Abort(::testing::internal::DeathTest::TEST_THREW_EXCEPTION); \
+  }
+
+# else
+#  define GTEST_EXECUTE_DEATH_TEST_STATEMENT_(statement, death_test) \
+  GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement)
+
+# endif
+
+// This macro is for implementing ASSERT_DEATH*, EXPECT_DEATH*,
+// ASSERT_EXIT*, and EXPECT_EXIT*.
+# define GTEST_DEATH_TEST_(statement, predicate, regex, fail) \
+  GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
+  if (::testing::internal::AlwaysTrue()) { \
+    const ::testing::internal::RE& gtest_regex = (regex); \
+    ::testing::internal::DeathTest* gtest_dt; \
+    if (!::testing::internal::DeathTest::Create(#statement, &gtest_regex, \
+        __FILE__, __LINE__, &gtest_dt)) { \
+      goto GTEST_CONCAT_TOKEN_(gtest_label_, __LINE__); \
+    } \
+    if (gtest_dt != NULL) { \
+      ::testing::internal::scoped_ptr< ::testing::internal::DeathTest> \
+          gtest_dt_ptr(gtest_dt); \
+      switch (gtest_dt->AssumeRole()) { \
+        case ::testing::internal::DeathTest::OVERSEE_TEST: \
+          if (!gtest_dt->Passed(predicate(gtest_dt->Wait()))) { \
+            goto GTEST_CONCAT_TOKEN_(gtest_label_, __LINE__); \
+          } \
+          break; \
+        case ::testing::internal::DeathTest::EXECUTE_TEST: { \
+          ::testing::internal::DeathTest::ReturnSentinel \
+              gtest_sentinel(gtest_dt); \
+          GTEST_EXECUTE_DEATH_TEST_STATEMENT_(statement, gtest_dt); \
+          gtest_dt->Abort(::testing::internal::DeathTest::TEST_DID_NOT_DIE); \
+          break; \
+        } \
+        default: \
+          break; \
+      } \
+    } \
+  } else \
+    GTEST_CONCAT_TOKEN_(gtest_label_, __LINE__): \
+      fail(::testing::internal::DeathTest::LastMessage())
+// The symbol "fail" here expands to something into which a message
+// can be streamed.
+
+// This macro is for implementing ASSERT/EXPECT_DEBUG_DEATH when compiled in
+// NDEBUG mode. In this case we need the statements to be executed, the regex is
+// ignored, and the macro must accept a streamed message even though the message
+// is never printed.
+# define GTEST_EXECUTE_STATEMENT_(statement, regex) \
+  GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
+  if (::testing::internal::AlwaysTrue()) { \
+     GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \
+  } else \
+    ::testing::Message()
+
+// A class representing the parsed contents of the
+// --gtest_internal_run_death_test flag, as it existed when
+// RUN_ALL_TESTS was called.
+class InternalRunDeathTestFlag {
+ public:
+  InternalRunDeathTestFlag(const std::string& a_file,
+                           int a_line,
+                           int an_index,
+                           int a_write_fd)
+      : file_(a_file), line_(a_line), index_(an_index),
+        write_fd_(a_write_fd) {}
+
+  ~InternalRunDeathTestFlag() {
+    if (write_fd_ >= 0)
+      posix::Close(write_fd_);
+  }
+
+  const std::string& file() const { return file_; }
+  int line() const { return line_; }
+  int index() const { return index_; }
+  int write_fd() const { return write_fd_; }
+
+ private:
+  std::string file_;
+  int line_;
+  int index_;
+  int write_fd_;
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(InternalRunDeathTestFlag);
+};
+
+// Returns a newly created InternalRunDeathTestFlag object with fields
+// initialized from the GTEST_FLAG(internal_run_death_test) flag if
+// the flag is specified; otherwise returns NULL.
+InternalRunDeathTestFlag* ParseInternalRunDeathTestFlag();
+
+#else  // GTEST_HAS_DEATH_TEST
+
+// This macro is used for implementing macros such as
+// EXPECT_DEATH_IF_SUPPORTED and ASSERT_DEATH_IF_SUPPORTED on systems where
+// death tests are not supported. Those macros must compile on such systems
+// iff EXPECT_DEATH and ASSERT_DEATH compile with the same parameters on
+// systems that support death tests. This allows one to write such a macro
+// on a system that does not support death tests and be sure that it will
+// compile on a death-test supporting system.
+//
+// Parameters:
+//   statement -  A statement that a macro such as EXPECT_DEATH would test
+//                for program termination. This macro has to make sure this
+//                statement is compiled but not executed, to ensure that
+//                EXPECT_DEATH_IF_SUPPORTED compiles with a certain
+//                parameter iff EXPECT_DEATH compiles with it.
+//   regex     -  A regex that a macro such as EXPECT_DEATH would use to test
+//                the output of statement.  This parameter has to be
+//                compiled but not evaluated by this macro, to ensure that
+//                this macro only accepts expressions that a macro such as
+//                EXPECT_DEATH would accept.
+//   terminator - Must be an empty statement for EXPECT_DEATH_IF_SUPPORTED
+//                and a return statement for ASSERT_DEATH_IF_SUPPORTED.
+//                This ensures that ASSERT_DEATH_IF_SUPPORTED will not
+//                compile inside functions where ASSERT_DEATH doesn't
+//                compile.
+//
+//  The branch that has an always false condition is used to ensure that
+//  statement and regex are compiled (and thus syntactically correct) but
+//  never executed. The unreachable code macro protects the terminator
+//  statement from generating an 'unreachable code' warning in case
+//  statement unconditionally returns or throws. The Message constructor at
+//  the end allows the syntax of streaming additional messages into the
+//  macro, for compilational compatibility with EXPECT_DEATH/ASSERT_DEATH.
+# define GTEST_UNSUPPORTED_DEATH_TEST_(statement, regex, terminator) \
+    GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
+    if (::testing::internal::AlwaysTrue()) { \
+      GTEST_LOG_(WARNING) \
+          << "Death tests are not supported on this platform.\n" \
+          << "Statement '" #statement "' cannot be verified."; \
+    } else if (::testing::internal::AlwaysFalse()) { \
+      ::testing::internal::RE::PartialMatch(".*", (regex)); \
+      GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \
+      terminator; \
+    } else \
+      ::testing::Message()
+
+#endif  // GTEST_HAS_DEATH_TEST
+
+}  // namespace internal
+}  // namespace testing
+
+#endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_DEATH_TEST_INTERNAL_H_
+
+namespace testing {
+
+// This flag controls the style of death tests.  Valid values are "threadsafe",
+// meaning that the death test child process will re-execute the test binary
+// from the start, running only a single death test, or "fast",
+// meaning that the child process will execute the test logic immediately
+// after forking.
+GTEST_DECLARE_string_(death_test_style);
+
+#if GTEST_HAS_DEATH_TEST
+
+namespace internal {
+
+// Returns a Boolean value indicating whether the caller is currently
+// executing in the context of the death test child process.  Tools such as
+// Valgrind heap checkers may need this to modify their behavior in death
+// tests.  IMPORTANT: This is an internal utility.  Using it may break the
+// implementation of death tests.  User code MUST NOT use it.
+GTEST_API_ bool InDeathTestChild();
+
+}  // namespace internal
+
+// The following macros are useful for writing death tests.
+
+// Here's what happens when an ASSERT_DEATH* or EXPECT_DEATH* is
+// executed:
+//
+//   1. It generates a warning if there is more than one active
+//   thread.  This is because it's safe to fork() or clone() only
+//   when there is a single thread.
+//
+//   2. The parent process clone()s a sub-process and runs the death
+//   test in it; the sub-process exits with code 0 at the end of the
+//   death test, if it hasn't exited already.
+//
+//   3. The parent process waits for the sub-process to terminate.
+//
+//   4. The parent process checks the exit code and error message of
+//   the sub-process.
+//
+// Examples:
+//
+//   ASSERT_DEATH(server.SendMessage(56, "Hello"), "Invalid port number");
+//   for (int i = 0; i < 5; i++) {
+//     EXPECT_DEATH(server.ProcessRequest(i),
+//                  "Invalid request .* in ProcessRequest()")
+//                  << "Failed to die on request " << i;
+//   }
+//
+//   ASSERT_EXIT(server.ExitNow(), ::testing::ExitedWithCode(0), "Exiting");
+//
+//   bool KilledBySIGHUP(int exit_code) {
+//     return WIFSIGNALED(exit_code) && WTERMSIG(exit_code) == SIGHUP;
+//   }
+//
+//   ASSERT_EXIT(client.HangUpServer(), KilledBySIGHUP, "Hanging up!");
+//
+// On the regular expressions used in death tests:
+//
+//   On POSIX-compliant systems (*nix), we use the <regex.h> library,
+//   which uses the POSIX extended regex syntax.
+//
+//   On other platforms (e.g. Windows), we only support a simple regex
+//   syntax implemented as part of Google Test.  This limited
+//   implementation should be enough most of the time when writing
+//   death tests; though it lacks many features you can find in PCRE
+//   or POSIX extended regex syntax.  For example, we don't support
+//   union ("x|y"), grouping ("(xy)"), brackets ("[xy]"), and
+//   repetition count ("x{5,7}"), among others.
+//
+//   Below is the syntax that we do support.  We chose it to be a
+//   subset of both PCRE and POSIX extended regex, so it's easy to
+//   learn wherever you come from.  In the following: 'A' denotes a
+//   literal character, period (.), or a single \\ escape sequence;
+//   'x' and 'y' denote regular expressions; 'm' and 'n' are for
+//   natural numbers.
+//
+//     c     matches any literal character c
+//     \\d   matches any decimal digit
+//     \\D   matches any character that's not a decimal digit
+//     \\f   matches \f
+//     \\n   matches \n
+//     \\r   matches \r
+//     \\s   matches any ASCII whitespace, including \n
+//     \\S   matches any character that's not a whitespace
+//     \\t   matches \t
+//     \\v   matches \v
+//     \\w   matches any letter, _, or decimal digit
+//     \\W   matches any character that \\w doesn't match
+//     \\c   matches any literal character c, which must be a punctuation
+//     .     matches any single character except \n
+//     A?    matches 0 or 1 occurrences of A
+//     A*    matches 0 or many occurrences of A
+//     A+    matches 1 or many occurrences of A
+//     ^     matches the beginning of a string (not that of each line)
+//     $     matches the end of a string (not that of each line)
+//     xy    matches x followed by y
+//
+//   If you accidentally use PCRE or POSIX extended regex features
+//   not implemented by us, you will get a run-time failure.  In that
+//   case, please try to rewrite your regular expression within the
+//   above syntax.
+//
+//   This implementation is *not* meant to be as highly tuned or robust
+//   as a compiled regex library, but should perform well enough for a
+//   death test, which already incurs significant overhead by launching
+//   a child process.
+//
+// Known caveats:
+//
+//   A "threadsafe" style death test obtains the path to the test
+//   program from argv[0] and re-executes it in the sub-process.  For
+//   simplicity, the current implementation doesn't search the PATH
+//   when launching the sub-process.  This means that the user must
+//   invoke the test program via a path that contains at least one
+//   path separator (e.g. path/to/foo_test and
+//   /absolute/path/to/bar_test are fine, but foo_test is not).  This
+//   is rarely a problem as people usually don't put the test binary
+//   directory in PATH.
+//
+// TODO(wan at google.com): make thread-safe death tests search the PATH.
+
+// Asserts that a given statement causes the program to exit, with an
+// integer exit status that satisfies predicate, and emitting error output
+// that matches regex.
+# define ASSERT_EXIT(statement, predicate, regex) \
+    GTEST_DEATH_TEST_(statement, predicate, regex, GTEST_FATAL_FAILURE_)
+
+// Like ASSERT_EXIT, but continues on to successive tests in the
+// test case, if any:
+# define EXPECT_EXIT(statement, predicate, regex) \
+    GTEST_DEATH_TEST_(statement, predicate, regex, GTEST_NONFATAL_FAILURE_)
+
+// Asserts that a given statement causes the program to exit, either by
+// explicitly exiting with a nonzero exit code or being killed by a
+// signal, and emitting error output that matches regex.
+# define ASSERT_DEATH(statement, regex) \
+    ASSERT_EXIT(statement, ::testing::internal::ExitedUnsuccessfully, regex)
+
+// Like ASSERT_DEATH, but continues on to successive tests in the
+// test case, if any:
+# define EXPECT_DEATH(statement, regex) \
+    EXPECT_EXIT(statement, ::testing::internal::ExitedUnsuccessfully, regex)
+
+// Two predicate classes that can be used in {ASSERT,EXPECT}_EXIT*:
+
+// Tests that an exit code describes a normal exit with a given exit code.
+class GTEST_API_ ExitedWithCode {
+ public:
+  explicit ExitedWithCode(int exit_code);
+  bool operator()(int exit_status) const;
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ExitedWithCode& other);
+
+  const int exit_code_;
+};
+
+# if !GTEST_OS_WINDOWS
+// Tests that an exit code describes an exit due to termination by a
+// given signal.
+class GTEST_API_ KilledBySignal {
+ public:
+  explicit KilledBySignal(int signum);
+  bool operator()(int exit_status) const;
+ private:
+  const int signum_;
+};
+# endif  // !GTEST_OS_WINDOWS
+
+// EXPECT_DEBUG_DEATH asserts that the given statements die in debug mode.
+// The death testing framework causes this to have interesting semantics,
+// since the sideeffects of the call are only visible in opt mode, and not
+// in debug mode.
+//
+// In practice, this can be used to test functions that utilize the
+// LOG(DFATAL) macro using the following style:
+//
+// int DieInDebugOr12(int* sideeffect) {
+//   if (sideeffect) {
+//     *sideeffect = 12;
+//   }
+//   LOG(DFATAL) << "death";
+//   return 12;
+// }
+//
+// TEST(TestCase, TestDieOr12WorksInDgbAndOpt) {
+//   int sideeffect = 0;
+//   // Only asserts in dbg.
+//   EXPECT_DEBUG_DEATH(DieInDebugOr12(&sideeffect), "death");
+//
+// #ifdef NDEBUG
+//   // opt-mode has sideeffect visible.
+//   EXPECT_EQ(12, sideeffect);
+// #else
+//   // dbg-mode no visible sideeffect.
+//   EXPECT_EQ(0, sideeffect);
+// #endif
+// }
+//
+// This will assert that DieInDebugReturn12InOpt() crashes in debug
+// mode, usually due to a DCHECK or LOG(DFATAL), but returns the
+// appropriate fallback value (12 in this case) in opt mode. If you
+// need to test that a function has appropriate side-effects in opt
+// mode, include assertions against the side-effects.  A general
+// pattern for this is:
+//
+// EXPECT_DEBUG_DEATH({
+//   // Side-effects here will have an effect after this statement in
+//   // opt mode, but none in debug mode.
+//   EXPECT_EQ(12, DieInDebugOr12(&sideeffect));
+// }, "death");
+//
+# ifdef NDEBUG
+
+#  define EXPECT_DEBUG_DEATH(statement, regex) \
+  GTEST_EXECUTE_STATEMENT_(statement, regex)
+
+#  define ASSERT_DEBUG_DEATH(statement, regex) \
+  GTEST_EXECUTE_STATEMENT_(statement, regex)
+
+# else
+
+#  define EXPECT_DEBUG_DEATH(statement, regex) \
+  EXPECT_DEATH(statement, regex)
+
+#  define ASSERT_DEBUG_DEATH(statement, regex) \
+  ASSERT_DEATH(statement, regex)
+
+# endif  // NDEBUG for EXPECT_DEBUG_DEATH
+#endif  // GTEST_HAS_DEATH_TEST
+
+// EXPECT_DEATH_IF_SUPPORTED(statement, regex) and
+// ASSERT_DEATH_IF_SUPPORTED(statement, regex) expand to real death tests if
+// death tests are supported; otherwise they just issue a warning.  This is
+// useful when you are combining death test assertions with normal test
+// assertions in one test.
+#if GTEST_HAS_DEATH_TEST
+# define EXPECT_DEATH_IF_SUPPORTED(statement, regex) \
+    EXPECT_DEATH(statement, regex)
+# define ASSERT_DEATH_IF_SUPPORTED(statement, regex) \
+    ASSERT_DEATH(statement, regex)
+#else
+# define EXPECT_DEATH_IF_SUPPORTED(statement, regex) \
+    GTEST_UNSUPPORTED_DEATH_TEST_(statement, regex, )
+# define ASSERT_DEATH_IF_SUPPORTED(statement, regex) \
+    GTEST_UNSUPPORTED_DEATH_TEST_(statement, regex, return)
+#endif
+
+}  // namespace testing
+
+#endif  // GTEST_INCLUDE_GTEST_GTEST_DEATH_TEST_H_
+// This file was GENERATED by command:
+//     pump.py gtest-param-test.h.pump
+// DO NOT EDIT BY HAND!!!
+
+// Copyright 2008, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Authors: vladl at google.com (Vlad Losev)
+//
+// Macros and functions for implementing parameterized tests
+// in Google C++ Testing Framework (Google Test)
+//
+// This file is generated by a SCRIPT.  DO NOT EDIT BY HAND!
+//
+#ifndef GTEST_INCLUDE_GTEST_GTEST_PARAM_TEST_H_
+#define GTEST_INCLUDE_GTEST_GTEST_PARAM_TEST_H_
+
+
+// Value-parameterized tests allow you to test your code with different
+// parameters without writing multiple copies of the same test.
+//
+// Here is how you use value-parameterized tests:
+
+#if 0
+
+// To write value-parameterized tests, first you should define a fixture
+// class. It is usually derived from testing::TestWithParam<T> (see below for
+// another inheritance scheme that's sometimes useful in more complicated
+// class hierarchies), where the type of your parameter values.
+// TestWithParam<T> is itself derived from testing::Test. T can be any
+// copyable type. If it's a raw pointer, you are responsible for managing the
+// lifespan of the pointed values.
+
+class FooTest : public ::testing::TestWithParam<const char*> {
+  // You can implement all the usual class fixture members here.
+};
+
+// Then, use the TEST_P macro to define as many parameterized tests
+// for this fixture as you want. The _P suffix is for "parameterized"
+// or "pattern", whichever you prefer to think.
+
+TEST_P(FooTest, DoesBlah) {
+  // Inside a test, access the test parameter with the GetParam() method
+  // of the TestWithParam<T> class:
+  EXPECT_TRUE(foo.Blah(GetParam()));
+  ...
+}
+
+TEST_P(FooTest, HasBlahBlah) {
+  ...
+}
+
+// Finally, you can use INSTANTIATE_TEST_CASE_P to instantiate the test
+// case with any set of parameters you want. Google Test defines a number
+// of functions for generating test parameters. They return what we call
+// (surprise!) parameter generators. Here is a  summary of them, which
+// are all in the testing namespace:
+//
+//
+//  Range(begin, end [, step]) - Yields values {begin, begin+step,
+//                               begin+step+step, ...}. The values do not
+//                               include end. step defaults to 1.
+//  Values(v1, v2, ..., vN)    - Yields values {v1, v2, ..., vN}.
+//  ValuesIn(container)        - Yields values from a C-style array, an STL
+//  ValuesIn(begin,end)          container, or an iterator range [begin, end).
+//  Bool()                     - Yields sequence {false, true}.
+//  Combine(g1, g2, ..., gN)   - Yields all combinations (the Cartesian product
+//                               for the math savvy) of the values generated
+//                               by the N generators.
+//
+// For more details, see comments at the definitions of these functions below
+// in this file.
+//
+// The following statement will instantiate tests from the FooTest test case
+// each with parameter values "meeny", "miny", and "moe".
+
+INSTANTIATE_TEST_CASE_P(InstantiationName,
+                        FooTest,
+                        Values("meeny", "miny", "moe"));
+
+// To distinguish different instances of the pattern, (yes, you
+// can instantiate it more then once) the first argument to the
+// INSTANTIATE_TEST_CASE_P macro is a prefix that will be added to the
+// actual test case name. Remember to pick unique prefixes for different
+// instantiations. The tests from the instantiation above will have
+// these names:
+//
+//    * InstantiationName/FooTest.DoesBlah/0 for "meeny"
+//    * InstantiationName/FooTest.DoesBlah/1 for "miny"
+//    * InstantiationName/FooTest.DoesBlah/2 for "moe"
+//    * InstantiationName/FooTest.HasBlahBlah/0 for "meeny"
+//    * InstantiationName/FooTest.HasBlahBlah/1 for "miny"
+//    * InstantiationName/FooTest.HasBlahBlah/2 for "moe"
+//
+// You can use these names in --gtest_filter.
+//
+// This statement will instantiate all tests from FooTest again, each
+// with parameter values "cat" and "dog":
+
+const char* pets[] = {"cat", "dog"};
+INSTANTIATE_TEST_CASE_P(AnotherInstantiationName, FooTest, ValuesIn(pets));
+
+// The tests from the instantiation above will have these names:
+//
+//    * AnotherInstantiationName/FooTest.DoesBlah/0 for "cat"
+//    * AnotherInstantiationName/FooTest.DoesBlah/1 for "dog"
+//    * AnotherInstantiationName/FooTest.HasBlahBlah/0 for "cat"
+//    * AnotherInstantiationName/FooTest.HasBlahBlah/1 for "dog"
+//
+// Please note that INSTANTIATE_TEST_CASE_P will instantiate all tests
+// in the given test case, whether their definitions come before or
+// AFTER the INSTANTIATE_TEST_CASE_P statement.
+//
+// Please also note that generator expressions (including parameters to the
+// generators) are evaluated in InitGoogleTest(), after main() has started.
+// This allows the user on one hand, to adjust generator parameters in order
+// to dynamically determine a set of tests to run and on the other hand,
+// give the user a chance to inspect the generated tests with Google Test
+// reflection API before RUN_ALL_TESTS() is executed.
+//
+// You can see samples/sample7_unittest.cc and samples/sample8_unittest.cc
+// for more examples.
+//
+// In the future, we plan to publish the API for defining new parameter
+// generators. But for now this interface remains part of the internal
+// implementation and is subject to change.
+//
+//
+// A parameterized test fixture must be derived from testing::Test and from
+// testing::WithParamInterface<T>, where T is the type of the parameter
+// values. Inheriting from TestWithParam<T> satisfies that requirement because
+// TestWithParam<T> inherits from both Test and WithParamInterface. In more
+// complicated hierarchies, however, it is occasionally useful to inherit
+// separately from Test and WithParamInterface. For example:
+
+class BaseTest : public ::testing::Test {
+  // You can inherit all the usual members for a non-parameterized test
+  // fixture here.
+};
+
+class DerivedTest : public BaseTest, public ::testing::WithParamInterface<int> {
+  // The usual test fixture members go here too.
+};
+
+TEST_F(BaseTest, HasFoo) {
+  // This is an ordinary non-parameterized test.
+}
+
+TEST_P(DerivedTest, DoesBlah) {
+  // GetParam works just the same here as if you inherit from TestWithParam.
+  EXPECT_TRUE(foo.Blah(GetParam()));
+}
+
+#endif  // 0
+
+
+#if !GTEST_OS_SYMBIAN
+# include <utility>
+#endif
+
+// scripts/fuse_gtest.py depends on gtest's own header being #included
+// *unconditionally*.  Therefore these #includes cannot be moved
+// inside #if GTEST_HAS_PARAM_TEST.
+// Copyright 2008 Google Inc.
+// All Rights Reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: vladl at google.com (Vlad Losev)
+
+// Type and function utilities for implementing parameterized tests.
+
+#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_H_
+#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_H_
+
+#include <iterator>
+#include <utility>
+#include <vector>
+
+// scripts/fuse_gtest.py depends on gtest's own header being #included
+// *unconditionally*.  Therefore these #includes cannot be moved
+// inside #if GTEST_HAS_PARAM_TEST.
+// Copyright 2003 Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Authors: Dan Egnor (egnor at google.com)
+//
+// A "smart" pointer type with reference tracking.  Every pointer to a
+// particular object is kept on a circular linked list.  When the last pointer
+// to an object is destroyed or reassigned, the object is deleted.
+//
+// Used properly, this deletes the object when the last reference goes away.
+// There are several caveats:
+// - Like all reference counting schemes, cycles lead to leaks.
+// - Each smart pointer is actually two pointers (8 bytes instead of 4).
+// - Every time a pointer is assigned, the entire list of pointers to that
+//   object is traversed.  This class is therefore NOT SUITABLE when there
+//   will often be more than two or three pointers to a particular object.
+// - References are only tracked as long as linked_ptr<> objects are copied.
+//   If a linked_ptr<> is converted to a raw pointer and back, BAD THINGS
+//   will happen (double deletion).
+//
+// A good use of this class is storing object references in STL containers.
+// You can safely put linked_ptr<> in a vector<>.
+// Other uses may not be as good.
+//
+// Note: If you use an incomplete type with linked_ptr<>, the class
+// *containing* linked_ptr<> must have a constructor and destructor (even
+// if they do nothing!).
+//
+// Bill Gibbons suggested we use something like this.
+//
+// Thread Safety:
+//   Unlike other linked_ptr implementations, in this implementation
+//   a linked_ptr object is thread-safe in the sense that:
+//     - it's safe to copy linked_ptr objects concurrently,
+//     - it's safe to copy *from* a linked_ptr and read its underlying
+//       raw pointer (e.g. via get()) concurrently, and
+//     - it's safe to write to two linked_ptrs that point to the same
+//       shared object concurrently.
+// TODO(wan at google.com): rename this to safe_linked_ptr to avoid
+// confusion with normal linked_ptr.
+
+#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_LINKED_PTR_H_
+#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_LINKED_PTR_H_
+
+#include <stdlib.h>
+#include <assert.h>
+
+
+namespace testing {
+namespace internal {
+
+// Protects copying of all linked_ptr objects.
+GTEST_API_ GTEST_DECLARE_STATIC_MUTEX_(g_linked_ptr_mutex);
+
+// This is used internally by all instances of linked_ptr<>.  It needs to be
+// a non-template class because different types of linked_ptr<> can refer to
+// the same object (linked_ptr<Superclass>(obj) vs linked_ptr<Subclass>(obj)).
+// So, it needs to be possible for different types of linked_ptr to participate
+// in the same circular linked list, so we need a single class type here.
+//
+// DO NOT USE THIS CLASS DIRECTLY YOURSELF.  Use linked_ptr<T>.
+class linked_ptr_internal {
+ public:
+  // Create a new circle that includes only this instance.
+  void join_new() {
+    next_ = this;
+  }
+
+  // Many linked_ptr operations may change p.link_ for some linked_ptr
+  // variable p in the same circle as this object.  Therefore we need
+  // to prevent two such operations from occurring concurrently.
+  //
+  // Note that different types of linked_ptr objects can coexist in a
+  // circle (e.g. linked_ptr<Base>, linked_ptr<Derived1>, and
+  // linked_ptr<Derived2>).  Therefore we must use a single mutex to
+  // protect all linked_ptr objects.  This can create serious
+  // contention in production code, but is acceptable in a testing
+  // framework.
+
+  // Join an existing circle.
+  void join(linked_ptr_internal const* ptr)
+      GTEST_LOCK_EXCLUDED_(g_linked_ptr_mutex) {
+    MutexLock lock(&g_linked_ptr_mutex);
+
+    linked_ptr_internal const* p = ptr;
+    while (p->next_ != ptr) p = p->next_;
+    p->next_ = this;
+    next_ = ptr;
+  }
+
+  // Leave whatever circle we're part of.  Returns true if we were the
+  // last member of the circle.  Once this is done, you can join() another.
+  bool depart()
+      GTEST_LOCK_EXCLUDED_(g_linked_ptr_mutex) {
+    MutexLock lock(&g_linked_ptr_mutex);
+
+    if (next_ == this) return true;
+    linked_ptr_internal const* p = next_;
+    while (p->next_ != this) p = p->next_;
+    p->next_ = next_;
+    return false;
+  }
+
+ private:
+  mutable linked_ptr_internal const* next_;
+};
+
+template <typename T>
+class linked_ptr {
+ public:
+  typedef T element_type;
+
+  // Take over ownership of a raw pointer.  This should happen as soon as
+  // possible after the object is created.
+  explicit linked_ptr(T* ptr = NULL) { capture(ptr); }
+  ~linked_ptr() { depart(); }
+
+  // Copy an existing linked_ptr<>, adding ourselves to the list of references.
+  template <typename U> linked_ptr(linked_ptr<U> const& ptr) { copy(&ptr); }
+  linked_ptr(linked_ptr const& ptr) {  // NOLINT
+    assert(&ptr != this);
+    copy(&ptr);
+  }
+
+  // Assignment releases the old value and acquires the new.
+  template <typename U> linked_ptr& operator=(linked_ptr<U> const& ptr) {
+    depart();
+    copy(&ptr);
+    return *this;
+  }
+
+  linked_ptr& operator=(linked_ptr const& ptr) {
+    if (&ptr != this) {
+      depart();
+      copy(&ptr);
+    }
+    return *this;
+  }
+
+  // Smart pointer members.
+  void reset(T* ptr = NULL) {
+    depart();
+    capture(ptr);
+  }
+  T* get() const { return value_; }
+  T* operator->() const { return value_; }
+  T& operator*() const { return *value_; }
+
+  bool operator==(T* p) const { return value_ == p; }
+  bool operator!=(T* p) const { return value_ != p; }
+  template <typename U>
+  bool operator==(linked_ptr<U> const& ptr) const {
+    return value_ == ptr.get();
+  }
+  template <typename U>
+  bool operator!=(linked_ptr<U> const& ptr) const {
+    return value_ != ptr.get();
+  }
+
+ private:
+  template <typename U>
+  friend class linked_ptr;
+
+  T* value_;
+  linked_ptr_internal link_;
+
+  void depart() {
+    if (link_.depart()) delete value_;
+  }
+
+  void capture(T* ptr) {
+    value_ = ptr;
+    link_.join_new();
+  }
+
+  template <typename U> void copy(linked_ptr<U> const* ptr) {
+    value_ = ptr->get();
+    if (value_)
+      link_.join(&ptr->link_);
+    else
+      link_.join_new();
+  }
+};
+
+template<typename T> inline
+bool operator==(T* ptr, const linked_ptr<T>& x) {
+  return ptr == x.get();
+}
+
+template<typename T> inline
+bool operator!=(T* ptr, const linked_ptr<T>& x) {
+  return ptr != x.get();
+}
+
+// A function to convert T* into linked_ptr<T>
+// Doing e.g. make_linked_ptr(new FooBarBaz<type>(arg)) is a shorter notation
+// for linked_ptr<FooBarBaz<type> >(new FooBarBaz<type>(arg))
+template <typename T>
+linked_ptr<T> make_linked_ptr(T* ptr) {
+  return linked_ptr<T>(ptr);
+}
+
+}  // namespace internal
+}  // namespace testing
+
+#endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_LINKED_PTR_H_
+// Copyright 2007, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+
+// Google Test - The Google C++ Testing Framework
+//
+// This file implements a universal value printer that can print a
+// value of any type T:
+//
+//   void ::testing::internal::UniversalPrinter<T>::Print(value, ostream_ptr);
+//
+// A user can teach this function how to print a class type T by
+// defining either operator<<() or PrintTo() in the namespace that
+// defines T.  More specifically, the FIRST defined function in the
+// following list will be used (assuming T is defined in namespace
+// foo):
+//
+//   1. foo::PrintTo(const T&, ostream*)
+//   2. operator<<(ostream&, const T&) defined in either foo or the
+//      global namespace.
+//
+// If none of the above is defined, it will print the debug string of
+// the value if it is a protocol buffer, or print the raw bytes in the
+// value otherwise.
+//
+// To aid debugging: when T is a reference type, the address of the
+// value is also printed; when T is a (const) char pointer, both the
+// pointer value and the NUL-terminated string it points to are
+// printed.
+//
+// We also provide some convenient wrappers:
+//
+//   // Prints a value to a string.  For a (const or not) char
+//   // pointer, the NUL-terminated string (but not the pointer) is
+//   // printed.
+//   std::string ::testing::PrintToString(const T& value);
+//
+//   // Prints a value tersely: for a reference type, the referenced
+//   // value (but not the address) is printed; for a (const or not) char
+//   // pointer, the NUL-terminated string (but not the pointer) is
+//   // printed.
+//   void ::testing::internal::UniversalTersePrint(const T& value, ostream*);
+//
+//   // Prints value using the type inferred by the compiler.  The difference
+//   // from UniversalTersePrint() is that this function prints both the
+//   // pointer and the NUL-terminated string for a (const or not) char pointer.
+//   void ::testing::internal::UniversalPrint(const T& value, ostream*);
+//
+//   // Prints the fields of a tuple tersely to a string vector, one
+//   // element for each field. Tuple support must be enabled in
+//   // gtest-port.h.
+//   std::vector<string> UniversalTersePrintTupleFieldsToStrings(
+//       const Tuple& value);
+//
+// Known limitation:
+//
+// The print primitives print the elements of an STL-style container
+// using the compiler-inferred type of *iter where iter is a
+// const_iterator of the container.  When const_iterator is an input
+// iterator but not a forward iterator, this inferred type may not
+// match value_type, and the print output may be incorrect.  In
+// practice, this is rarely a problem as for most containers
+// const_iterator is a forward iterator.  We'll fix this if there's an
+// actual need for it.  Note that this fix cannot rely on value_type
+// being defined as many user-defined container types don't have
+// value_type.
+
+#ifndef GTEST_INCLUDE_GTEST_GTEST_PRINTERS_H_
+#define GTEST_INCLUDE_GTEST_GTEST_PRINTERS_H_
+
+#include <ostream>  // NOLINT
+#include <sstream>
+#include <string>
+#include <utility>
+#include <vector>
+
+namespace testing {
+
+// Definitions in the 'internal' and 'internal2' name spaces are
+// subject to change without notice.  DO NOT USE THEM IN USER CODE!
+namespace internal2 {
+
+// Prints the given number of bytes in the given object to the given
+// ostream.
+GTEST_API_ void PrintBytesInObjectTo(const unsigned char* obj_bytes,
+                                     size_t count,
+                                     ::std::ostream* os);
+
+// For selecting which printer to use when a given type has neither <<
+// nor PrintTo().
+enum TypeKind {
+  kProtobuf,              // a protobuf type
+  kConvertibleToInteger,  // a type implicitly convertible to BiggestInt
+                          // (e.g. a named or unnamed enum type)
+  kOtherType              // anything else
+};
+
+// TypeWithoutFormatter<T, kTypeKind>::PrintValue(value, os) is called
+// by the universal printer to print a value of type T when neither
+// operator<< nor PrintTo() is defined for T, where kTypeKind is the
+// "kind" of T as defined by enum TypeKind.
+template <typename T, TypeKind kTypeKind>
+class TypeWithoutFormatter {
+ public:
+  // This default version is called when kTypeKind is kOtherType.
+  static void PrintValue(const T& value, ::std::ostream* os) {
+    PrintBytesInObjectTo(reinterpret_cast<const unsigned char*>(&value),
+                         sizeof(value), os);
+  }
+};
+
+// We print a protobuf using its ShortDebugString() when the string
+// doesn't exceed this many characters; otherwise we print it using
+// DebugString() for better readability.
+const size_t kProtobufOneLinerMaxLength = 50;
+
+template <typename T>
+class TypeWithoutFormatter<T, kProtobuf> {
+ public:
+  static void PrintValue(const T& value, ::std::ostream* os) {
+    const ::testing::internal::string short_str = value.ShortDebugString();
+    const ::testing::internal::string pretty_str =
+        short_str.length() <= kProtobufOneLinerMaxLength ?
+        short_str : ("\n" + value.DebugString());
+    *os << ("<" + pretty_str + ">");
+  }
+};
+
+template <typename T>
+class TypeWithoutFormatter<T, kConvertibleToInteger> {
+ public:
+  // Since T has no << operator or PrintTo() but can be implicitly
+  // converted to BiggestInt, we print it as a BiggestInt.
+  //
+  // Most likely T is an enum type (either named or unnamed), in which
+  // case printing it as an integer is the desired behavior.  In case
+  // T is not an enum, printing it as an integer is the best we can do
+  // given that it has no user-defined printer.
+  static void PrintValue(const T& value, ::std::ostream* os) {
+    const internal::BiggestInt kBigInt = value;
+    *os << kBigInt;
+  }
+};
+
+// Prints the given value to the given ostream.  If the value is a
+// protocol message, its debug string is printed; if it's an enum or
+// of a type implicitly convertible to BiggestInt, it's printed as an
+// integer; otherwise the bytes in the value are printed.  This is
+// what UniversalPrinter<T>::Print() does when it knows nothing about
+// type T and T has neither << operator nor PrintTo().
+//
+// A user can override this behavior for a class type Foo by defining
+// a << operator in the namespace where Foo is defined.
+//
+// We put this operator in namespace 'internal2' instead of 'internal'
+// to simplify the implementation, as much code in 'internal' needs to
+// use << in STL, which would conflict with our own << were it defined
+// in 'internal'.
+//
+// Note that this operator<< takes a generic std::basic_ostream<Char,
+// CharTraits> type instead of the more restricted std::ostream.  If
+// we define it to take an std::ostream instead, we'll get an
+// "ambiguous overloads" compiler error when trying to print a type
+// Foo that supports streaming to std::basic_ostream<Char,
+// CharTraits>, as the compiler cannot tell whether
+// operator<<(std::ostream&, const T&) or
+// operator<<(std::basic_stream<Char, CharTraits>, const Foo&) is more
+// specific.
+template <typename Char, typename CharTraits, typename T>
+::std::basic_ostream<Char, CharTraits>& operator<<(
+    ::std::basic_ostream<Char, CharTraits>& os, const T& x) {
+  TypeWithoutFormatter<T,
+      (internal::IsAProtocolMessage<T>::value ? kProtobuf :
+       internal::ImplicitlyConvertible<const T&, internal::BiggestInt>::value ?
+       kConvertibleToInteger : kOtherType)>::PrintValue(x, &os);
+  return os;
+}
+
+}  // namespace internal2
+}  // namespace testing
+
+// This namespace MUST NOT BE NESTED IN ::testing, or the name look-up
+// magic needed for implementing UniversalPrinter won't work.
+namespace testing_internal {
+
+// Used to print a value that is not an STL-style container when the
+// user doesn't define PrintTo() for it.
+template <typename T>
+void DefaultPrintNonContainerTo(const T& value, ::std::ostream* os) {
+  // With the following statement, during unqualified name lookup,
+  // testing::internal2::operator<< appears as if it was declared in
+  // the nearest enclosing namespace that contains both
+  // ::testing_internal and ::testing::internal2, i.e. the global
+  // namespace.  For more details, refer to the C++ Standard section
+  // 7.3.4-1 [namespace.udir].  This allows us to fall back onto
+  // testing::internal2::operator<< in case T doesn't come with a <<
+  // operator.
+  //
+  // We cannot write 'using ::testing::internal2::operator<<;', which
+  // gcc 3.3 fails to compile due to a compiler bug.
+  using namespace ::testing::internal2;  // NOLINT
+
+  // Assuming T is defined in namespace foo, in the next statement,
+  // the compiler will consider all of:
+  //
+  //   1. foo::operator<< (thanks to Koenig look-up),
+  //   2. ::operator<< (as the current namespace is enclosed in ::),
+  //   3. testing::internal2::operator<< (thanks to the using statement above).
+  //
+  // The operator<< whose type matches T best will be picked.
+  //
+  // We deliberately allow #2 to be a candidate, as sometimes it's
+  // impossible to define #1 (e.g. when foo is ::std, defining
+  // anything in it is undefined behavior unless you are a compiler
+  // vendor.).
+  *os << value;
+}
+
+}  // namespace testing_internal
+
+namespace testing {
+namespace internal {
+
+// UniversalPrinter<T>::Print(value, ostream_ptr) prints the given
+// value to the given ostream.  The caller must ensure that
+// 'ostream_ptr' is not NULL, or the behavior is undefined.
+//
+// We define UniversalPrinter as a class template (as opposed to a
+// function template), as we need to partially specialize it for
+// reference types, which cannot be done with function templates.
+template <typename T>
+class UniversalPrinter;
+
+template <typename T>
+void UniversalPrint(const T& value, ::std::ostream* os);
+
+// Used to print an STL-style container when the user doesn't define
+// a PrintTo() for it.
+template <typename C>
+void DefaultPrintTo(IsContainer /* dummy */,
+                    false_type /* is not a pointer */,
+                    const C& container, ::std::ostream* os) {
+  const size_t kMaxCount = 32;  // The maximum number of elements to print.
+  *os << '{';
+  size_t count = 0;
+  for (typename C::const_iterator it = container.begin();
+       it != container.end(); ++it, ++count) {
+    if (count > 0) {
+      *os << ',';
+      if (count == kMaxCount) {  // Enough has been printed.
+        *os << " ...";
+        break;
+      }
+    }
+    *os << ' ';
+    // We cannot call PrintTo(*it, os) here as PrintTo() doesn't
+    // handle *it being a native array.
+    internal::UniversalPrint(*it, os);
+  }
+
+  if (count > 0) {
+    *os << ' ';
+  }
+  *os << '}';
+}
+
+// Used to print a pointer that is neither a char pointer nor a member
+// pointer, when the user doesn't define PrintTo() for it.  (A member
+// variable pointer or member function pointer doesn't really point to
+// a location in the address space.  Their representation is
+// implementation-defined.  Therefore they will be printed as raw
+// bytes.)
+template <typename T>
+void DefaultPrintTo(IsNotContainer /* dummy */,
+                    true_type /* is a pointer */,
+                    T* p, ::std::ostream* os) {
+  if (p == NULL) {
+    *os << "NULL";
+  } else {
+    // C++ doesn't allow casting from a function pointer to any object
+    // pointer.
+    //
+    // IsTrue() silences warnings: "Condition is always true",
+    // "unreachable code".
+    if (IsTrue(ImplicitlyConvertible<T*, const void*>::value)) {
+      // T is not a function type.  We just call << to print p,
+      // relying on ADL to pick up user-defined << for their pointer
+      // types, if any.
+      *os << p;
+    } else {
+      // T is a function type, so '*os << p' doesn't do what we want
+      // (it just prints p as bool).  We want to print p as a const
+      // void*.  However, we cannot cast it to const void* directly,
+      // even using reinterpret_cast, as earlier versions of gcc
+      // (e.g. 3.4.5) cannot compile the cast when p is a function
+      // pointer.  Casting to UInt64 first solves the problem.
+      *os << reinterpret_cast<const void*>(
+          reinterpret_cast<internal::UInt64>(p));
+    }
+  }
+}
+
+// Used to print a non-container, non-pointer value when the user
+// doesn't define PrintTo() for it.
+template <typename T>
+void DefaultPrintTo(IsNotContainer /* dummy */,
+                    false_type /* is not a pointer */,
+                    const T& value, ::std::ostream* os) {
+  ::testing_internal::DefaultPrintNonContainerTo(value, os);
+}
+
+// Prints the given value using the << operator if it has one;
+// otherwise prints the bytes in it.  This is what
+// UniversalPrinter<T>::Print() does when PrintTo() is not specialized
+// or overloaded for type T.
+//
+// A user can override this behavior for a class type Foo by defining
+// an overload of PrintTo() in the namespace where Foo is defined.  We
+// give the user this option as sometimes defining a << operator for
+// Foo is not desirable (e.g. the coding style may prevent doing it,
+// or there is already a << operator but it doesn't do what the user
+// wants).
+template <typename T>
+void PrintTo(const T& value, ::std::ostream* os) {
+  // DefaultPrintTo() is overloaded.  The type of its first two
+  // arguments determine which version will be picked.  If T is an
+  // STL-style container, the version for container will be called; if
+  // T is a pointer, the pointer version will be called; otherwise the
+  // generic version will be called.
+  //
+  // Note that we check for container types here, prior to we check
+  // for protocol message types in our operator<<.  The rationale is:
+  //
+  // For protocol messages, we want to give people a chance to
+  // override Google Mock's format by defining a PrintTo() or
+  // operator<<.  For STL containers, other formats can be
+  // incompatible with Google Mock's format for the container
+  // elements; therefore we check for container types here to ensure
+  // that our format is used.
+  //
+  // The second argument of DefaultPrintTo() is needed to bypass a bug
+  // in Symbian's C++ compiler that prevents it from picking the right
+  // overload between:
+  //
+  //   PrintTo(const T& x, ...);
+  //   PrintTo(T* x, ...);
+  DefaultPrintTo(IsContainerTest<T>(0), is_pointer<T>(), value, os);
+}
+
+// The following list of PrintTo() overloads tells
+// UniversalPrinter<T>::Print() how to print standard types (built-in
+// types, strings, plain arrays, and pointers).
+
+// Overloads for various char types.
+GTEST_API_ void PrintTo(unsigned char c, ::std::ostream* os);
+GTEST_API_ void PrintTo(signed char c, ::std::ostream* os);
+inline void PrintTo(char c, ::std::ostream* os) {
+  // When printing a plain char, we always treat it as unsigned.  This
+  // way, the output won't be affected by whether the compiler thinks
+  // char is signed or not.
+  PrintTo(static_cast<unsigned char>(c), os);
+}
+
+// Overloads for other simple built-in types.
+inline void PrintTo(bool x, ::std::ostream* os) {
+  *os << (x ? "true" : "false");
+}
+
+// Overload for wchar_t type.
+// Prints a wchar_t as a symbol if it is printable or as its internal
+// code otherwise and also as its decimal code (except for L'\0').
+// The L'\0' char is printed as "L'\\0'". The decimal code is printed
+// as signed integer when wchar_t is implemented by the compiler
+// as a signed type and is printed as an unsigned integer when wchar_t
+// is implemented as an unsigned type.
+GTEST_API_ void PrintTo(wchar_t wc, ::std::ostream* os);
+
+// Overloads for C strings.
+GTEST_API_ void PrintTo(const char* s, ::std::ostream* os);
+inline void PrintTo(char* s, ::std::ostream* os) {
+  PrintTo(ImplicitCast_<const char*>(s), os);
+}
+
+// signed/unsigned char is often used for representing binary data, so
+// we print pointers to it as void* to be safe.
+inline void PrintTo(const signed char* s, ::std::ostream* os) {
+  PrintTo(ImplicitCast_<const void*>(s), os);
+}
+inline void PrintTo(signed char* s, ::std::ostream* os) {
+  PrintTo(ImplicitCast_<const void*>(s), os);
+}
+inline void PrintTo(const unsigned char* s, ::std::ostream* os) {
+  PrintTo(ImplicitCast_<const void*>(s), os);
+}
+inline void PrintTo(unsigned char* s, ::std::ostream* os) {
+  PrintTo(ImplicitCast_<const void*>(s), os);
+}
+
+// MSVC can be configured to define wchar_t as a typedef of unsigned
+// short.  It defines _NATIVE_WCHAR_T_DEFINED when wchar_t is a native
+// type.  When wchar_t is a typedef, defining an overload for const
+// wchar_t* would cause unsigned short* be printed as a wide string,
+// possibly causing invalid memory accesses.
+#if !defined(_MSC_VER) || defined(_NATIVE_WCHAR_T_DEFINED)
+// Overloads for wide C strings
+GTEST_API_ void PrintTo(const wchar_t* s, ::std::ostream* os);
+inline void PrintTo(wchar_t* s, ::std::ostream* os) {
+  PrintTo(ImplicitCast_<const wchar_t*>(s), os);
+}
+#endif
+
+// Overload for C arrays.  Multi-dimensional arrays are printed
+// properly.
+
+// Prints the given number of elements in an array, without printing
+// the curly braces.
+template <typename T>
+void PrintRawArrayTo(const T a[], size_t count, ::std::ostream* os) {
+  UniversalPrint(a[0], os);
+  for (size_t i = 1; i != count; i++) {
+    *os << ", ";
+    UniversalPrint(a[i], os);
+  }
+}
+
+// Overloads for ::string and ::std::string.
+#if GTEST_HAS_GLOBAL_STRING
+GTEST_API_ void PrintStringTo(const ::string&s, ::std::ostream* os);
+inline void PrintTo(const ::string& s, ::std::ostream* os) {
+  PrintStringTo(s, os);
+}
+#endif  // GTEST_HAS_GLOBAL_STRING
+
+GTEST_API_ void PrintStringTo(const ::std::string&s, ::std::ostream* os);
+inline void PrintTo(const ::std::string& s, ::std::ostream* os) {
+  PrintStringTo(s, os);
+}
+
+// Overloads for ::wstring and ::std::wstring.
+#if GTEST_HAS_GLOBAL_WSTRING
+GTEST_API_ void PrintWideStringTo(const ::wstring&s, ::std::ostream* os);
+inline void PrintTo(const ::wstring& s, ::std::ostream* os) {
+  PrintWideStringTo(s, os);
+}
+#endif  // GTEST_HAS_GLOBAL_WSTRING
+
+#if GTEST_HAS_STD_WSTRING
+GTEST_API_ void PrintWideStringTo(const ::std::wstring&s, ::std::ostream* os);
+inline void PrintTo(const ::std::wstring& s, ::std::ostream* os) {
+  PrintWideStringTo(s, os);
+}
+#endif  // GTEST_HAS_STD_WSTRING
+
+#if GTEST_HAS_TR1_TUPLE
+// Overload for ::std::tr1::tuple.  Needed for printing function arguments,
+// which are packed as tuples.
+
+// Helper function for printing a tuple.  T must be instantiated with
+// a tuple type.
+template <typename T>
+void PrintTupleTo(const T& t, ::std::ostream* os);
+
+// Overloaded PrintTo() for tuples of various arities.  We support
+// tuples of up-to 10 fields.  The following implementation works
+// regardless of whether tr1::tuple is implemented using the
+// non-standard variadic template feature or not.
+
+inline void PrintTo(const ::std::tr1::tuple<>& t, ::std::ostream* os) {
+  PrintTupleTo(t, os);
+}
+
+template <typename T1>
+void PrintTo(const ::std::tr1::tuple<T1>& t, ::std::ostream* os) {
+  PrintTupleTo(t, os);
+}
+
+template <typename T1, typename T2>
+void PrintTo(const ::std::tr1::tuple<T1, T2>& t, ::std::ostream* os) {
+  PrintTupleTo(t, os);
+}
+
+template <typename T1, typename T2, typename T3>
+void PrintTo(const ::std::tr1::tuple<T1, T2, T3>& t, ::std::ostream* os) {
+  PrintTupleTo(t, os);
+}
+
+template <typename T1, typename T2, typename T3, typename T4>
+void PrintTo(const ::std::tr1::tuple<T1, T2, T3, T4>& t, ::std::ostream* os) {
+  PrintTupleTo(t, os);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5>
+void PrintTo(const ::std::tr1::tuple<T1, T2, T3, T4, T5>& t,
+             ::std::ostream* os) {
+  PrintTupleTo(t, os);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+          typename T6>
+void PrintTo(const ::std::tr1::tuple<T1, T2, T3, T4, T5, T6>& t,
+             ::std::ostream* os) {
+  PrintTupleTo(t, os);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+          typename T6, typename T7>
+void PrintTo(const ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7>& t,
+             ::std::ostream* os) {
+  PrintTupleTo(t, os);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+          typename T6, typename T7, typename T8>
+void PrintTo(const ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8>& t,
+             ::std::ostream* os) {
+  PrintTupleTo(t, os);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+          typename T6, typename T7, typename T8, typename T9>
+void PrintTo(const ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8, T9>& t,
+             ::std::ostream* os) {
+  PrintTupleTo(t, os);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+          typename T6, typename T7, typename T8, typename T9, typename T10>
+void PrintTo(
+    const ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>& t,
+    ::std::ostream* os) {
+  PrintTupleTo(t, os);
+}
+#endif  // GTEST_HAS_TR1_TUPLE
+
+// Overload for std::pair.
+template <typename T1, typename T2>
+void PrintTo(const ::std::pair<T1, T2>& value, ::std::ostream* os) {
+  *os << '(';
+  // We cannot use UniversalPrint(value.first, os) here, as T1 may be
+  // a reference type.  The same for printing value.second.
+  UniversalPrinter<T1>::Print(value.first, os);
+  *os << ", ";
+  UniversalPrinter<T2>::Print(value.second, os);
+  *os << ')';
+}
+
+// Implements printing a non-reference type T by letting the compiler
+// pick the right overload of PrintTo() for T.
+template <typename T>
+class UniversalPrinter {
+ public:
+  // MSVC warns about adding const to a function type, so we want to
+  // disable the warning.
+#ifdef _MSC_VER
+# pragma warning(push)          // Saves the current warning state.
+# pragma warning(disable:4180)  // Temporarily disables warning 4180.
+#endif  // _MSC_VER
+
+  // Note: we deliberately don't call this PrintTo(), as that name
+  // conflicts with ::testing::internal::PrintTo in the body of the
+  // function.
+  static void Print(const T& value, ::std::ostream* os) {
+    // By default, ::testing::internal::PrintTo() is used for printing
+    // the value.
+    //
+    // Thanks to Koenig look-up, if T is a class and has its own
+    // PrintTo() function defined in its namespace, that function will
+    // be visible here.  Since it is more specific than the generic ones
+    // in ::testing::internal, it will be picked by the compiler in the
+    // following statement - exactly what we want.
+    PrintTo(value, os);
+  }
+
+#ifdef _MSC_VER
+# pragma warning(pop)           // Restores the warning state.
+#endif  // _MSC_VER
+};
+
+// UniversalPrintArray(begin, len, os) prints an array of 'len'
+// elements, starting at address 'begin'.
+template <typename T>
+void UniversalPrintArray(const T* begin, size_t len, ::std::ostream* os) {
+  if (len == 0) {
+    *os << "{}";
+  } else {
+    *os << "{ ";
+    const size_t kThreshold = 18;
+    const size_t kChunkSize = 8;
+    // If the array has more than kThreshold elements, we'll have to
+    // omit some details by printing only the first and the last
+    // kChunkSize elements.
+    // TODO(wan at google.com): let the user control the threshold using a flag.
+    if (len <= kThreshold) {
+      PrintRawArrayTo(begin, len, os);
+    } else {
+      PrintRawArrayTo(begin, kChunkSize, os);
+      *os << ", ..., ";
+      PrintRawArrayTo(begin + len - kChunkSize, kChunkSize, os);
+    }
+    *os << " }";
+  }
+}
+// This overload prints a (const) char array compactly.
+GTEST_API_ void UniversalPrintArray(
+    const char* begin, size_t len, ::std::ostream* os);
+
+// This overload prints a (const) wchar_t array compactly.
+GTEST_API_ void UniversalPrintArray(
+    const wchar_t* begin, size_t len, ::std::ostream* os);
+
+// Implements printing an array type T[N].
+template <typename T, size_t N>
+class UniversalPrinter<T[N]> {
+ public:
+  // Prints the given array, omitting some elements when there are too
+  // many.
+  static void Print(const T (&a)[N], ::std::ostream* os) {
+    UniversalPrintArray(a, N, os);
+  }
+};
+
+// Implements printing a reference type T&.
+template <typename T>
+class UniversalPrinter<T&> {
+ public:
+  // MSVC warns about adding const to a function type, so we want to
+  // disable the warning.
+#ifdef _MSC_VER
+# pragma warning(push)          // Saves the current warning state.
+# pragma warning(disable:4180)  // Temporarily disables warning 4180.
+#endif  // _MSC_VER
+
+  static void Print(const T& value, ::std::ostream* os) {
+    // Prints the address of the value.  We use reinterpret_cast here
+    // as static_cast doesn't compile when T is a function type.
+    *os << "@" << reinterpret_cast<const void*>(&value) << " ";
+
+    // Then prints the value itself.
+    UniversalPrint(value, os);
+  }
+
+#ifdef _MSC_VER
+# pragma warning(pop)           // Restores the warning state.
+#endif  // _MSC_VER
+};
+
+// Prints a value tersely: for a reference type, the referenced value
+// (but not the address) is printed; for a (const) char pointer, the
+// NUL-terminated string (but not the pointer) is printed.
+
+template <typename T>
+class UniversalTersePrinter {
+ public:
+  static void Print(const T& value, ::std::ostream* os) {
+    UniversalPrint(value, os);
+  }
+};
+template <typename T>
+class UniversalTersePrinter<T&> {
+ public:
+  static void Print(const T& value, ::std::ostream* os) {
+    UniversalPrint(value, os);
+  }
+};
+template <typename T, size_t N>
+class UniversalTersePrinter<T[N]> {
+ public:
+  static void Print(const T (&value)[N], ::std::ostream* os) {
+    UniversalPrinter<T[N]>::Print(value, os);
+  }
+};
+template <>
+class UniversalTersePrinter<const char*> {
+ public:
+  static void Print(const char* str, ::std::ostream* os) {
+    if (str == NULL) {
+      *os << "NULL";
+    } else {
+      UniversalPrint(string(str), os);
+    }
+  }
+};
+template <>
+class UniversalTersePrinter<char*> {
+ public:
+  static void Print(char* str, ::std::ostream* os) {
+    UniversalTersePrinter<const char*>::Print(str, os);
+  }
+};
+
+#if GTEST_HAS_STD_WSTRING
+template <>
+class UniversalTersePrinter<const wchar_t*> {
+ public:
+  static void Print(const wchar_t* str, ::std::ostream* os) {
+    if (str == NULL) {
+      *os << "NULL";
+    } else {
+      UniversalPrint(::std::wstring(str), os);
+    }
+  }
+};
+#endif
+
+template <>
+class UniversalTersePrinter<wchar_t*> {
+ public:
+  static void Print(wchar_t* str, ::std::ostream* os) {
+    UniversalTersePrinter<const wchar_t*>::Print(str, os);
+  }
+};
+
+template <typename T>
+void UniversalTersePrint(const T& value, ::std::ostream* os) {
+  UniversalTersePrinter<T>::Print(value, os);
+}
+
+// Prints a value using the type inferred by the compiler.  The
+// difference between this and UniversalTersePrint() is that for a
+// (const) char pointer, this prints both the pointer and the
+// NUL-terminated string.
+template <typename T>
+void UniversalPrint(const T& value, ::std::ostream* os) {
+  // A workarond for the bug in VC++ 7.1 that prevents us from instantiating
+  // UniversalPrinter with T directly.
+  typedef T T1;
+  UniversalPrinter<T1>::Print(value, os);
+}
+
+#if GTEST_HAS_TR1_TUPLE
+typedef ::std::vector<string> Strings;
+
+// This helper template allows PrintTo() for tuples and
+// UniversalTersePrintTupleFieldsToStrings() to be defined by
+// induction on the number of tuple fields.  The idea is that
+// TuplePrefixPrinter<N>::PrintPrefixTo(t, os) prints the first N
+// fields in tuple t, and can be defined in terms of
+// TuplePrefixPrinter<N - 1>.
+
+// The inductive case.
+template <size_t N>
+struct TuplePrefixPrinter {
+  // Prints the first N fields of a tuple.
+  template <typename Tuple>
+  static void PrintPrefixTo(const Tuple& t, ::std::ostream* os) {
+    TuplePrefixPrinter<N - 1>::PrintPrefixTo(t, os);
+    *os << ", ";
+    UniversalPrinter<typename ::std::tr1::tuple_element<N - 1, Tuple>::type>
+        ::Print(::std::tr1::get<N - 1>(t), os);
+  }
+
+  // Tersely prints the first N fields of a tuple to a string vector,
+  // one element for each field.
+  template <typename Tuple>
+  static void TersePrintPrefixToStrings(const Tuple& t, Strings* strings) {
+    TuplePrefixPrinter<N - 1>::TersePrintPrefixToStrings(t, strings);
+    ::std::stringstream ss;
+    UniversalTersePrint(::std::tr1::get<N - 1>(t), &ss);
+    strings->push_back(ss.str());
+  }
+};
+
+// Base cases.
+template <>
+struct TuplePrefixPrinter<0> {
+  template <typename Tuple>
+  static void PrintPrefixTo(const Tuple&, ::std::ostream*) {}
+
+  template <typename Tuple>
+  static void TersePrintPrefixToStrings(const Tuple&, Strings*) {}
+};
+// We have to specialize the entire TuplePrefixPrinter<> class
+// template here, even though the definition of
+// TersePrintPrefixToStrings() is the same as the generic version, as
+// Embarcadero (formerly CodeGear, formerly Borland) C++ doesn't
+// support specializing a method template of a class template.
+template <>
+struct TuplePrefixPrinter<1> {
+  template <typename Tuple>
+  static void PrintPrefixTo(const Tuple& t, ::std::ostream* os) {
+    UniversalPrinter<typename ::std::tr1::tuple_element<0, Tuple>::type>::
+        Print(::std::tr1::get<0>(t), os);
+  }
+
+  template <typename Tuple>
+  static void TersePrintPrefixToStrings(const Tuple& t, Strings* strings) {
+    ::std::stringstream ss;
+    UniversalTersePrint(::std::tr1::get<0>(t), &ss);
+    strings->push_back(ss.str());
+  }
+};
+
+// Helper function for printing a tuple.  T must be instantiated with
+// a tuple type.
+template <typename T>
+void PrintTupleTo(const T& t, ::std::ostream* os) {
+  *os << "(";
+  TuplePrefixPrinter< ::std::tr1::tuple_size<T>::value>::
+      PrintPrefixTo(t, os);
+  *os << ")";
+}
+
+// Prints the fields of a tuple tersely to a string vector, one
+// element for each field.  See the comment before
+// UniversalTersePrint() for how we define "tersely".
+template <typename Tuple>
+Strings UniversalTersePrintTupleFieldsToStrings(const Tuple& value) {
+  Strings result;
+  TuplePrefixPrinter< ::std::tr1::tuple_size<Tuple>::value>::
+      TersePrintPrefixToStrings(value, &result);
+  return result;
+}
+#endif  // GTEST_HAS_TR1_TUPLE
+
+}  // namespace internal
+
+template <typename T>
+::std::string PrintToString(const T& value) {
+  ::std::stringstream ss;
+  internal::UniversalTersePrinter<T>::Print(value, &ss);
+  return ss.str();
+}
+
+}  // namespace testing
+
+#endif  // GTEST_INCLUDE_GTEST_GTEST_PRINTERS_H_
+
+#if GTEST_HAS_PARAM_TEST
+
+namespace testing {
+namespace internal {
+
+// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
+//
+// Outputs a message explaining invalid registration of different
+// fixture class for the same test case. This may happen when
+// TEST_P macro is used to define two tests with the same name
+// but in different namespaces.
+GTEST_API_ void ReportInvalidTestCaseType(const char* test_case_name,
+                                          const char* file, int line);
+
+template <typename> class ParamGeneratorInterface;
+template <typename> class ParamGenerator;
+
+// Interface for iterating over elements provided by an implementation
+// of ParamGeneratorInterface<T>.
+template <typename T>
+class ParamIteratorInterface {
+ public:
+  virtual ~ParamIteratorInterface() {}
+  // A pointer to the base generator instance.
+  // Used only for the purposes of iterator comparison
+  // to make sure that two iterators belong to the same generator.
+  virtual const ParamGeneratorInterface<T>* BaseGenerator() const = 0;
+  // Advances iterator to point to the next element
+  // provided by the generator. The caller is responsible
+  // for not calling Advance() on an iterator equal to
+  // BaseGenerator()->End().
+  virtual void Advance() = 0;
+  // Clones the iterator object. Used for implementing copy semantics
+  // of ParamIterator<T>.
+  virtual ParamIteratorInterface* Clone() const = 0;
+  // Dereferences the current iterator and provides (read-only) access
+  // to the pointed value. It is the caller's responsibility not to call
+  // Current() on an iterator equal to BaseGenerator()->End().
+  // Used for implementing ParamGenerator<T>::operator*().
+  virtual const T* Current() const = 0;
+  // Determines whether the given iterator and other point to the same
+  // element in the sequence generated by the generator.
+  // Used for implementing ParamGenerator<T>::operator==().
+  virtual bool Equals(const ParamIteratorInterface& other) const = 0;
+};
+
+// Class iterating over elements provided by an implementation of
+// ParamGeneratorInterface<T>. It wraps ParamIteratorInterface<T>
+// and implements the const forward iterator concept.
+template <typename T>
+class ParamIterator {
+ public:
+  typedef T value_type;
+  typedef const T& reference;
+  typedef ptrdiff_t difference_type;
+
+  // ParamIterator assumes ownership of the impl_ pointer.
+  ParamIterator(const ParamIterator& other) : impl_(other.impl_->Clone()) {}
+  ParamIterator& operator=(const ParamIterator& other) {
+    if (this != &other)
+      impl_.reset(other.impl_->Clone());
+    return *this;
+  }
+
+  const T& operator*() const { return *impl_->Current(); }
+  const T* operator->() const { return impl_->Current(); }
+  // Prefix version of operator++.
+  ParamIterator& operator++() {
+    impl_->Advance();
+    return *this;
+  }
+  // Postfix version of operator++.
+  ParamIterator operator++(int /*unused*/) {
+    ParamIteratorInterface<T>* clone = impl_->Clone();
+    impl_->Advance();
+    return ParamIterator(clone);
+  }
+  bool operator==(const ParamIterator& other) const {
+    return impl_.get() == other.impl_.get() || impl_->Equals(*other.impl_);
+  }
+  bool operator!=(const ParamIterator& other) const {
+    return !(*this == other);
+  }
+
+ private:
+  friend class ParamGenerator<T>;
+  explicit ParamIterator(ParamIteratorInterface<T>* impl) : impl_(impl) {}
+  scoped_ptr<ParamIteratorInterface<T> > impl_;
+};
+
+// ParamGeneratorInterface<T> is the binary interface to access generators
+// defined in other translation units.
+template <typename T>
+class ParamGeneratorInterface {
+ public:
+  typedef T ParamType;
+
+  virtual ~ParamGeneratorInterface() {}
+
+  // Generator interface definition
+  virtual ParamIteratorInterface<T>* Begin() const = 0;
+  virtual ParamIteratorInterface<T>* End() const = 0;
+};
+
+// Wraps ParamGeneratorInterface<T> and provides general generator syntax
+// compatible with the STL Container concept.
+// This class implements copy initialization semantics and the contained
+// ParamGeneratorInterface<T> instance is shared among all copies
+// of the original object. This is possible because that instance is immutable.
+template<typename T>
+class ParamGenerator {
+ public:
+  typedef ParamIterator<T> iterator;
+
+  explicit ParamGenerator(ParamGeneratorInterface<T>* impl) : impl_(impl) {}
+  ParamGenerator(const ParamGenerator& other) : impl_(other.impl_) {}
+
+  ParamGenerator& operator=(const ParamGenerator& other) {
+    impl_ = other.impl_;
+    return *this;
+  }
+
+  iterator begin() const { return iterator(impl_->Begin()); }
+  iterator end() const { return iterator(impl_->End()); }
+
+ private:
+  linked_ptr<const ParamGeneratorInterface<T> > impl_;
+};
+
+// Generates values from a range of two comparable values. Can be used to
+// generate sequences of user-defined types that implement operator+() and
+// operator<().
+// This class is used in the Range() function.
+template <typename T, typename IncrementT>
+class RangeGenerator : public ParamGeneratorInterface<T> {
+ public:
+  RangeGenerator(T begin, T end, IncrementT step)
+      : begin_(begin), end_(end),
+        step_(step), end_index_(CalculateEndIndex(begin, end, step)) {}
+  virtual ~RangeGenerator() {}
+
+  virtual ParamIteratorInterface<T>* Begin() const {
+    return new Iterator(this, begin_, 0, step_);
+  }
+  virtual ParamIteratorInterface<T>* End() const {
+    return new Iterator(this, end_, end_index_, step_);
+  }
+
+ private:
+  class Iterator : public ParamIteratorInterface<T> {
+   public:
+    Iterator(const ParamGeneratorInterface<T>* base, T value, int index,
+             IncrementT step)
+        : base_(base), value_(value), index_(index), step_(step) {}
+    virtual ~Iterator() {}
+
+    virtual const ParamGeneratorInterface<T>* BaseGenerator() const {
+      return base_;
+    }
+    virtual void Advance() {
+      value_ = value_ + step_;
+      index_++;
+    }
+    virtual ParamIteratorInterface<T>* Clone() const {
+      return new Iterator(*this);
+    }
+    virtual const T* Current() const { return &value_; }
+    virtual bool Equals(const ParamIteratorInterface<T>& other) const {
+      // Having the same base generator guarantees that the other
+      // iterator is of the same type and we can downcast.
+      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
+          << "The program attempted to compare iterators "
+          << "from different generators." << std::endl;
+      const int other_index =
+          CheckedDowncastToActualType<const Iterator>(&other)->index_;
+      return index_ == other_index;
+    }
+
+   private:
+    Iterator(const Iterator& other)
+        : ParamIteratorInterface<T>(),
+          base_(other.base_), value_(other.value_), index_(other.index_),
+          step_(other.step_) {}
+
+    // No implementation - assignment is unsupported.
+    void operator=(const Iterator& other);
+
+    const ParamGeneratorInterface<T>* const base_;
+    T value_;
+    int index_;
+    const IncrementT step_;
+  };  // class RangeGenerator::Iterator
+
+  static int CalculateEndIndex(const T& begin,
+                               const T& end,
+                               const IncrementT& step) {
+    int end_index = 0;
+    for (T i = begin; i < end; i = i + step)
+      end_index++;
+    return end_index;
+  }
+
+  // No implementation - assignment is unsupported.
+  void operator=(const RangeGenerator& other);
+
+  const T begin_;
+  const T end_;
+  const IncrementT step_;
+  // The index for the end() iterator. All the elements in the generated
+  // sequence are indexed (0-based) to aid iterator comparison.
+  const int end_index_;
+};  // class RangeGenerator
+
+
+// Generates values from a pair of STL-style iterators. Used in the
+// ValuesIn() function. The elements are copied from the source range
+// since the source can be located on the stack, and the generator
+// is likely to persist beyond that stack frame.
+template <typename T>
+class ValuesInIteratorRangeGenerator : public ParamGeneratorInterface<T> {
+ public:
+  template <typename ForwardIterator>
+  ValuesInIteratorRangeGenerator(ForwardIterator begin, ForwardIterator end)
+      : container_(begin, end) {}
+  virtual ~ValuesInIteratorRangeGenerator() {}
+
+  virtual ParamIteratorInterface<T>* Begin() const {
+    return new Iterator(this, container_.begin());
+  }
+  virtual ParamIteratorInterface<T>* End() const {
+    return new Iterator(this, container_.end());
+  }
+
+ private:
+  typedef typename ::std::vector<T> ContainerType;
+
+  class Iterator : public ParamIteratorInterface<T> {
+   public:
+    Iterator(const ParamGeneratorInterface<T>* base,
+             typename ContainerType::const_iterator iterator)
+        : base_(base), iterator_(iterator) {}
+    virtual ~Iterator() {}
+
+    virtual const ParamGeneratorInterface<T>* BaseGenerator() const {
+      return base_;
+    }
+    virtual void Advance() {
+      ++iterator_;
+      value_.reset();
+    }
+    virtual ParamIteratorInterface<T>* Clone() const {
+      return new Iterator(*this);
+    }
+    // We need to use cached value referenced by iterator_ because *iterator_
+    // can return a temporary object (and of type other then T), so just
+    // having "return &*iterator_;" doesn't work.
+    // value_ is updated here and not in Advance() because Advance()
+    // can advance iterator_ beyond the end of the range, and we cannot
+    // detect that fact. The client code, on the other hand, is
+    // responsible for not calling Current() on an out-of-range iterator.
+    virtual const T* Current() const {
+      if (value_.get() == NULL)
+        value_.reset(new T(*iterator_));
+      return value_.get();
+    }
+    virtual bool Equals(const ParamIteratorInterface<T>& other) const {
+      // Having the same base generator guarantees that the other
+      // iterator is of the same type and we can downcast.
+      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
+          << "The program attempted to compare iterators "
+          << "from different generators." << std::endl;
+      return iterator_ ==
+          CheckedDowncastToActualType<const Iterator>(&other)->iterator_;
+    }
+
+   private:
+    Iterator(const Iterator& other)
+          // The explicit constructor call suppresses a false warning
+          // emitted by gcc when supplied with the -Wextra option.
+        : ParamIteratorInterface<T>(),
+          base_(other.base_),
+          iterator_(other.iterator_) {}
+
+    const ParamGeneratorInterface<T>* const base_;
+    typename ContainerType::const_iterator iterator_;
+    // A cached value of *iterator_. We keep it here to allow access by
+    // pointer in the wrapping iterator's operator->().
+    // value_ needs to be mutable to be accessed in Current().
+    // Use of scoped_ptr helps manage cached value's lifetime,
+    // which is bound by the lifespan of the iterator itself.
+    mutable scoped_ptr<const T> value_;
+  };  // class ValuesInIteratorRangeGenerator::Iterator
+
+  // No implementation - assignment is unsupported.
+  void operator=(const ValuesInIteratorRangeGenerator& other);
+
+  const ContainerType container_;
+};  // class ValuesInIteratorRangeGenerator
+
+// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
+//
+// Stores a parameter value and later creates tests parameterized with that
+// value.
+template <class TestClass>
+class ParameterizedTestFactory : public TestFactoryBase {
+ public:
+  typedef typename TestClass::ParamType ParamType;
+  explicit ParameterizedTestFactory(ParamType parameter) :
+      parameter_(parameter) {}
+  virtual Test* CreateTest() {
+    TestClass::SetParam(&parameter_);
+    return new TestClass();
+  }
+
+ private:
+  const ParamType parameter_;
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(ParameterizedTestFactory);
+};
+
+// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
+//
+// TestMetaFactoryBase is a base class for meta-factories that create
+// test factories for passing into MakeAndRegisterTestInfo function.
+template <class ParamType>
+class TestMetaFactoryBase {
+ public:
+  virtual ~TestMetaFactoryBase() {}
+
+  virtual TestFactoryBase* CreateTestFactory(ParamType parameter) = 0;
+};
+
+// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
+//
+// TestMetaFactory creates test factories for passing into
+// MakeAndRegisterTestInfo function. Since MakeAndRegisterTestInfo receives
+// ownership of test factory pointer, same factory object cannot be passed
+// into that method twice. But ParameterizedTestCaseInfo is going to call
+// it for each Test/Parameter value combination. Thus it needs meta factory
+// creator class.
+template <class TestCase>
+class TestMetaFactory
+    : public TestMetaFactoryBase<typename TestCase::ParamType> {
+ public:
+  typedef typename TestCase::ParamType ParamType;
+
+  TestMetaFactory() {}
+
+  virtual TestFactoryBase* CreateTestFactory(ParamType parameter) {
+    return new ParameterizedTestFactory<TestCase>(parameter);
+  }
+
+ private:
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(TestMetaFactory);
+};
+
+// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
+//
+// ParameterizedTestCaseInfoBase is a generic interface
+// to ParameterizedTestCaseInfo classes. ParameterizedTestCaseInfoBase
+// accumulates test information provided by TEST_P macro invocations
+// and generators provided by INSTANTIATE_TEST_CASE_P macro invocations
+// and uses that information to register all resulting test instances
+// in RegisterTests method. The ParameterizeTestCaseRegistry class holds
+// a collection of pointers to the ParameterizedTestCaseInfo objects
+// and calls RegisterTests() on each of them when asked.
+class ParameterizedTestCaseInfoBase {
+ public:
+  virtual ~ParameterizedTestCaseInfoBase() {}
+
+  // Base part of test case name for display purposes.
+  virtual const string& GetTestCaseName() const = 0;
+  // Test case id to verify identity.
+  virtual TypeId GetTestCaseTypeId() const = 0;
+  // UnitTest class invokes this method to register tests in this
+  // test case right before running them in RUN_ALL_TESTS macro.
+  // This method should not be called more then once on any single
+  // instance of a ParameterizedTestCaseInfoBase derived class.
+  virtual void RegisterTests() = 0;
+
+ protected:
+  ParameterizedTestCaseInfoBase() {}
+
+ private:
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(ParameterizedTestCaseInfoBase);
+};
+
+// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
+//
+// ParameterizedTestCaseInfo accumulates tests obtained from TEST_P
+// macro invocations for a particular test case and generators
+// obtained from INSTANTIATE_TEST_CASE_P macro invocations for that
+// test case. It registers tests with all values generated by all
+// generators when asked.
+template <class TestCase>
+class ParameterizedTestCaseInfo : public ParameterizedTestCaseInfoBase {
+ public:
+  // ParamType and GeneratorCreationFunc are private types but are required
+  // for declarations of public methods AddTestPattern() and
+  // AddTestCaseInstantiation().
+  typedef typename TestCase::ParamType ParamType;
+  // A function that returns an instance of appropriate generator type.
+  typedef ParamGenerator<ParamType>(GeneratorCreationFunc)();
+
+  explicit ParameterizedTestCaseInfo(const char* name)
+      : test_case_name_(name) {}
+
+  // Test case base name for display purposes.
+  virtual const string& GetTestCaseName() const { return test_case_name_; }
+  // Test case id to verify identity.
+  virtual TypeId GetTestCaseTypeId() const { return GetTypeId<TestCase>(); }
+  // TEST_P macro uses AddTestPattern() to record information
+  // about a single test in a LocalTestInfo structure.
+  // test_case_name is the base name of the test case (without invocation
+  // prefix). test_base_name is the name of an individual test without
+  // parameter index. For the test SequenceA/FooTest.DoBar/1 FooTest is
+  // test case base name and DoBar is test base name.
+  void AddTestPattern(const char* test_case_name,
+                      const char* test_base_name,
+                      TestMetaFactoryBase<ParamType>* meta_factory) {
+    tests_.push_back(linked_ptr<TestInfo>(new TestInfo(test_case_name,
+                                                       test_base_name,
+                                                       meta_factory)));
+  }
+  // INSTANTIATE_TEST_CASE_P macro uses AddGenerator() to record information
+  // about a generator.
+  int AddTestCaseInstantiation(const string& instantiation_name,
+                               GeneratorCreationFunc* func,
+                               const char* /* file */,
+                               int /* line */) {
+    instantiations_.push_back(::std::make_pair(instantiation_name, func));
+    return 0;  // Return value used only to run this method in namespace scope.
+  }
+  // UnitTest class invokes this method to register tests in this test case
+  // test cases right before running tests in RUN_ALL_TESTS macro.
+  // This method should not be called more then once on any single
+  // instance of a ParameterizedTestCaseInfoBase derived class.
+  // UnitTest has a guard to prevent from calling this method more then once.
+  virtual void RegisterTests() {
+    for (typename TestInfoContainer::iterator test_it = tests_.begin();
+         test_it != tests_.end(); ++test_it) {
+      linked_ptr<TestInfo> test_info = *test_it;
+      for (typename InstantiationContainer::iterator gen_it =
+               instantiations_.begin(); gen_it != instantiations_.end();
+               ++gen_it) {
+        const string& instantiation_name = gen_it->first;
+        ParamGenerator<ParamType> generator((*gen_it->second)());
+
+        string test_case_name;
+        if ( !instantiation_name.empty() )
+          test_case_name = instantiation_name + "/";
+        test_case_name += test_info->test_case_base_name;
+
+        int i = 0;
+        for (typename ParamGenerator<ParamType>::iterator param_it =
+                 generator.begin();
+             param_it != generator.end(); ++param_it, ++i) {
+          Message test_name_stream;
+          test_name_stream << test_info->test_base_name << "/" << i;
+          MakeAndRegisterTestInfo(
+              test_case_name.c_str(),
+              test_name_stream.GetString().c_str(),
+              NULL,  // No type parameter.
+              PrintToString(*param_it).c_str(),
+              GetTestCaseTypeId(),
+              TestCase::SetUpTestCase,
+              TestCase::TearDownTestCase,
+              test_info->test_meta_factory->CreateTestFactory(*param_it));
+        }  // for param_it
+      }  // for gen_it
+    }  // for test_it
+  }  // RegisterTests
+
+ private:
+  // LocalTestInfo structure keeps information about a single test registered
+  // with TEST_P macro.
+  struct TestInfo {
+    TestInfo(const char* a_test_case_base_name,
+             const char* a_test_base_name,
+             TestMetaFactoryBase<ParamType>* a_test_meta_factory) :
+        test_case_base_name(a_test_case_base_name),
+        test_base_name(a_test_base_name),
+        test_meta_factory(a_test_meta_factory) {}
+
+    const string test_case_base_name;
+    const string test_base_name;
+    const scoped_ptr<TestMetaFactoryBase<ParamType> > test_meta_factory;
+  };
+  typedef ::std::vector<linked_ptr<TestInfo> > TestInfoContainer;
+  // Keeps pairs of <Instantiation name, Sequence generator creation function>
+  // received from INSTANTIATE_TEST_CASE_P macros.
+  typedef ::std::vector<std::pair<string, GeneratorCreationFunc*> >
+      InstantiationContainer;
+
+  const string test_case_name_;
+  TestInfoContainer tests_;
+  InstantiationContainer instantiations_;
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(ParameterizedTestCaseInfo);
+};  // class ParameterizedTestCaseInfo
+
+// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
+//
+// ParameterizedTestCaseRegistry contains a map of ParameterizedTestCaseInfoBase
+// classes accessed by test case names. TEST_P and INSTANTIATE_TEST_CASE_P
+// macros use it to locate their corresponding ParameterizedTestCaseInfo
+// descriptors.
+class ParameterizedTestCaseRegistry {
+ public:
+  ParameterizedTestCaseRegistry() {}
+  ~ParameterizedTestCaseRegistry() {
+    for (TestCaseInfoContainer::iterator it = test_case_infos_.begin();
+         it != test_case_infos_.end(); ++it) {
+      delete *it;
+    }
+  }
+
+  // Looks up or creates and returns a structure containing information about
+  // tests and instantiations of a particular test case.
+  template <class TestCase>
+  ParameterizedTestCaseInfo<TestCase>* GetTestCasePatternHolder(
+      const char* test_case_name,
+      const char* file,
+      int line) {
+    ParameterizedTestCaseInfo<TestCase>* typed_test_info = NULL;
+    for (TestCaseInfoContainer::iterator it = test_case_infos_.begin();
+         it != test_case_infos_.end(); ++it) {
+      if ((*it)->GetTestCaseName() == test_case_name) {
+        if ((*it)->GetTestCaseTypeId() != GetTypeId<TestCase>()) {
+          // Complain about incorrect usage of Google Test facilities
+          // and terminate the program since we cannot guaranty correct
+          // test case setup and tear-down in this case.
+          ReportInvalidTestCaseType(test_case_name,  file, line);
+          posix::Abort();
+        } else {
+          // At this point we are sure that the object we found is of the same
+          // type we are looking for, so we downcast it to that type
+          // without further checks.
+          typed_test_info = CheckedDowncastToActualType<
+              ParameterizedTestCaseInfo<TestCase> >(*it);
+        }
+        break;
+      }
+    }
+    if (typed_test_info == NULL) {
+      typed_test_info = new ParameterizedTestCaseInfo<TestCase>(test_case_name);
+      test_case_infos_.push_back(typed_test_info);
+    }
+    return typed_test_info;
+  }
+  void RegisterTests() {
+    for (TestCaseInfoContainer::iterator it = test_case_infos_.begin();
+         it != test_case_infos_.end(); ++it) {
+      (*it)->RegisterTests();
+    }
+  }
+
+ private:
+  typedef ::std::vector<ParameterizedTestCaseInfoBase*> TestCaseInfoContainer;
+
+  TestCaseInfoContainer test_case_infos_;
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(ParameterizedTestCaseRegistry);
+};
+
+}  // namespace internal
+}  // namespace testing
+
+#endif  //  GTEST_HAS_PARAM_TEST
+
+#endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_H_
+// This file was GENERATED by command:
+//     pump.py gtest-param-util-generated.h.pump
+// DO NOT EDIT BY HAND!!!
+
+// Copyright 2008 Google Inc.
+// All Rights Reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: vladl at google.com (Vlad Losev)
+
+// Type and function utilities for implementing parameterized tests.
+// This file is generated by a SCRIPT.  DO NOT EDIT BY HAND!
+//
+// Currently Google Test supports at most 50 arguments in Values,
+// and at most 10 arguments in Combine. Please contact
+// googletestframework at googlegroups.com if you need more.
+// Please note that the number of arguments to Combine is limited
+// by the maximum arity of the implementation of tr1::tuple which is
+// currently set at 10.
+
+#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_GENERATED_H_
+#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_GENERATED_H_
+
+// scripts/fuse_gtest.py depends on gtest's own header being #included
+// *unconditionally*.  Therefore these #includes cannot be moved
+// inside #if GTEST_HAS_PARAM_TEST.
+
+#if GTEST_HAS_PARAM_TEST
+
+namespace testing {
+
+// Forward declarations of ValuesIn(), which is implemented in
+// include/gtest/gtest-param-test.h.
+template <typename ForwardIterator>
+internal::ParamGenerator<
+  typename ::testing::internal::IteratorTraits<ForwardIterator>::value_type>
+ValuesIn(ForwardIterator begin, ForwardIterator end);
+
+template <typename T, size_t N>
+internal::ParamGenerator<T> ValuesIn(const T (&array)[N]);
+
+template <class Container>
+internal::ParamGenerator<typename Container::value_type> ValuesIn(
+    const Container& container);
+
+namespace internal {
+
+// Used in the Values() function to provide polymorphic capabilities.
+template <typename T1>
+class ValueArray1 {
+ public:
+  explicit ValueArray1(T1 v1) : v1_(v1) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const { return ValuesIn(&v1_, &v1_ + 1); }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray1& other);
+
+  const T1 v1_;
+};
+
+template <typename T1, typename T2>
+class ValueArray2 {
+ public:
+  ValueArray2(T1 v1, T2 v2) : v1_(v1), v2_(v2) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray2& other);
+
+  const T1 v1_;
+  const T2 v2_;
+};
+
+template <typename T1, typename T2, typename T3>
+class ValueArray3 {
+ public:
+  ValueArray3(T1 v1, T2 v2, T3 v3) : v1_(v1), v2_(v2), v3_(v3) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray3& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4>
+class ValueArray4 {
+ public:
+  ValueArray4(T1 v1, T2 v2, T3 v3, T4 v4) : v1_(v1), v2_(v2), v3_(v3),
+      v4_(v4) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray4& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5>
+class ValueArray5 {
+ public:
+  ValueArray5(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5) : v1_(v1), v2_(v2), v3_(v3),
+      v4_(v4), v5_(v5) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray5& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6>
+class ValueArray6 {
+ public:
+  ValueArray6(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6) : v1_(v1), v2_(v2),
+      v3_(v3), v4_(v4), v5_(v5), v6_(v6) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray6& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7>
+class ValueArray7 {
+ public:
+  ValueArray7(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7) : v1_(v1),
+      v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray7& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8>
+class ValueArray8 {
+ public:
+  ValueArray8(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,
+      T8 v8) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
+      v8_(v8) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray8& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9>
+class ValueArray9 {
+ public:
+  ValueArray9(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8,
+      T9 v9) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
+      v8_(v8), v9_(v9) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray9& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10>
+class ValueArray10 {
+ public:
+  ValueArray10(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
+      v8_(v8), v9_(v9), v10_(v10) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray10& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11>
+class ValueArray11 {
+ public:
+  ValueArray11(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6),
+      v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray11& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12>
+class ValueArray12 {
+ public:
+  ValueArray12(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5),
+      v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray12& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13>
+class ValueArray13 {
+ public:
+  ValueArray13(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13) : v1_(v1), v2_(v2), v3_(v3), v4_(v4),
+      v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11),
+      v12_(v12), v13_(v13) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray13& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14>
+class ValueArray14 {
+ public:
+  ValueArray14(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14) : v1_(v1), v2_(v2), v3_(v3),
+      v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
+      v11_(v11), v12_(v12), v13_(v13), v14_(v14) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray14& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15>
+class ValueArray15 {
+ public:
+  ValueArray15(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15) : v1_(v1), v2_(v2),
+      v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
+      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray15& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16>
+class ValueArray16 {
+ public:
+  ValueArray16(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16) : v1_(v1),
+      v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9),
+      v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15),
+      v16_(v16) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray16& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17>
+class ValueArray17 {
+ public:
+  ValueArray17(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16,
+      T17 v17) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
+      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
+      v15_(v15), v16_(v16), v17_(v17) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray17& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18>
+class ValueArray18 {
+ public:
+  ValueArray18(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
+      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
+      v15_(v15), v16_(v16), v17_(v17), v18_(v18) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray18& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19>
+class ValueArray19 {
+ public:
+  ValueArray19(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6),
+      v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13),
+      v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray19& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20>
+class ValueArray20 {
+ public:
+  ValueArray20(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5),
+      v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12),
+      v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18),
+      v19_(v19), v20_(v20) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray20& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21>
+class ValueArray21 {
+ public:
+  ValueArray21(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21) : v1_(v1), v2_(v2), v3_(v3), v4_(v4),
+      v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11),
+      v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17),
+      v18_(v18), v19_(v19), v20_(v20), v21_(v21) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray21& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22>
+class ValueArray22 {
+ public:
+  ValueArray22(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22) : v1_(v1), v2_(v2), v3_(v3),
+      v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
+      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
+      v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray22& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23>
+class ValueArray23 {
+ public:
+  ValueArray23(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23) : v1_(v1), v2_(v2),
+      v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
+      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
+      v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),
+      v23_(v23) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray23& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+  const T23 v23_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24>
+class ValueArray24 {
+ public:
+  ValueArray24(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24) : v1_(v1),
+      v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9),
+      v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15),
+      v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21),
+      v22_(v22), v23_(v23), v24_(v24) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray24& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+  const T23 v23_;
+  const T24 v24_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25>
+class ValueArray25 {
+ public:
+  ValueArray25(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24,
+      T25 v25) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
+      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
+      v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
+      v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray25& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+  const T23 v23_;
+  const T24 v24_;
+  const T25 v25_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26>
+class ValueArray26 {
+ public:
+  ValueArray26(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+      T26 v26) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
+      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
+      v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
+      v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray26& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+  const T23 v23_;
+  const T24 v24_;
+  const T25 v25_;
+  const T26 v26_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27>
+class ValueArray27 {
+ public:
+  ValueArray27(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+      T26 v26, T27 v27) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6),
+      v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13),
+      v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19),
+      v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25),
+      v26_(v26), v27_(v27) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+        static_cast<T>(v27_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray27& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+  const T23 v23_;
+  const T24 v24_;
+  const T25 v25_;
+  const T26 v26_;
+  const T27 v27_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28>
+class ValueArray28 {
+ public:
+  ValueArray28(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+      T26 v26, T27 v27, T28 v28) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5),
+      v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12),
+      v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18),
+      v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24),
+      v25_(v25), v26_(v26), v27_(v27), v28_(v28) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+        static_cast<T>(v27_), static_cast<T>(v28_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray28& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+  const T23 v23_;
+  const T24 v24_;
+  const T25 v25_;
+  const T26 v26_;
+  const T27 v27_;
+  const T28 v28_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29>
+class ValueArray29 {
+ public:
+  ValueArray29(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+      T26 v26, T27 v27, T28 v28, T29 v29) : v1_(v1), v2_(v2), v3_(v3), v4_(v4),
+      v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11),
+      v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17),
+      v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23),
+      v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray29& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+  const T23 v23_;
+  const T24 v24_;
+  const T25 v25_;
+  const T26 v26_;
+  const T27 v27_;
+  const T28 v28_;
+  const T29 v29_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30>
+class ValueArray30 {
+ public:
+  ValueArray30(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30) : v1_(v1), v2_(v2), v3_(v3),
+      v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
+      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
+      v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),
+      v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28),
+      v29_(v29), v30_(v30) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+        static_cast<T>(v30_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray30& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+  const T23 v23_;
+  const T24 v24_;
+  const T25 v25_;
+  const T26 v26_;
+  const T27 v27_;
+  const T28 v28_;
+  const T29 v29_;
+  const T30 v30_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31>
+class ValueArray31 {
+ public:
+  ValueArray31(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31) : v1_(v1), v2_(v2),
+      v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
+      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
+      v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),
+      v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28),
+      v29_(v29), v30_(v30), v31_(v31) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+        static_cast<T>(v30_), static_cast<T>(v31_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray31& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+  const T23 v23_;
+  const T24 v24_;
+  const T25 v25_;
+  const T26 v26_;
+  const T27 v27_;
+  const T28 v28_;
+  const T29 v29_;
+  const T30 v30_;
+  const T31 v31_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32>
+class ValueArray32 {
+ public:
+  ValueArray32(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32) : v1_(v1),
+      v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9),
+      v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15),
+      v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21),
+      v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27),
+      v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray32& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+  const T23 v23_;
+  const T24 v24_;
+  const T25 v25_;
+  const T26 v26_;
+  const T27 v27_;
+  const T28 v28_;
+  const T29 v29_;
+  const T30 v30_;
+  const T31 v31_;
+  const T32 v32_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33>
+class ValueArray33 {
+ public:
+  ValueArray33(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32,
+      T33 v33) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
+      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
+      v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
+      v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26),
+      v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32),
+      v33_(v33) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
+        static_cast<T>(v33_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray33& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+  const T23 v23_;
+  const T24 v24_;
+  const T25 v25_;
+  const T26 v26_;
+  const T27 v27_;
+  const T28 v28_;
+  const T29 v29_;
+  const T30 v30_;
+  const T31 v31_;
+  const T32 v32_;
+  const T33 v33_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34>
+class ValueArray34 {
+ public:
+  ValueArray34(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
+      T34 v34) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
+      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
+      v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
+      v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26),
+      v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32),
+      v33_(v33), v34_(v34) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
+        static_cast<T>(v33_), static_cast<T>(v34_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray34& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+  const T23 v23_;
+  const T24 v24_;
+  const T25 v25_;
+  const T26 v26_;
+  const T27 v27_;
+  const T28 v28_;
+  const T29 v29_;
+  const T30 v30_;
+  const T31 v31_;
+  const T32 v32_;
+  const T33 v33_;
+  const T34 v34_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35>
+class ValueArray35 {
+ public:
+  ValueArray35(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
+      T34 v34, T35 v35) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6),
+      v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13),
+      v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19),
+      v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25),
+      v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31),
+      v32_(v32), v33_(v33), v34_(v34), v35_(v35) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
+        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray35& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+  const T23 v23_;
+  const T24 v24_;
+  const T25 v25_;
+  const T26 v26_;
+  const T27 v27_;
+  const T28 v28_;
+  const T29 v29_;
+  const T30 v30_;
+  const T31 v31_;
+  const T32 v32_;
+  const T33 v33_;
+  const T34 v34_;
+  const T35 v35_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36>
+class ValueArray36 {
+ public:
+  ValueArray36(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
+      T34 v34, T35 v35, T36 v36) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5),
+      v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12),
+      v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18),
+      v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24),
+      v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30),
+      v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35), v36_(v36) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
+        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
+        static_cast<T>(v36_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray36& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+  const T23 v23_;
+  const T24 v24_;
+  const T25 v25_;
+  const T26 v26_;
+  const T27 v27_;
+  const T28 v28_;
+  const T29 v29_;
+  const T30 v30_;
+  const T31 v31_;
+  const T32 v32_;
+  const T33 v33_;
+  const T34 v34_;
+  const T35 v35_;
+  const T36 v36_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37>
+class ValueArray37 {
+ public:
+  ValueArray37(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
+      T34 v34, T35 v35, T36 v36, T37 v37) : v1_(v1), v2_(v2), v3_(v3), v4_(v4),
+      v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11),
+      v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17),
+      v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23),
+      v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29),
+      v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35),
+      v36_(v36), v37_(v37) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
+        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
+        static_cast<T>(v36_), static_cast<T>(v37_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray37& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+  const T23 v23_;
+  const T24 v24_;
+  const T25 v25_;
+  const T26 v26_;
+  const T27 v27_;
+  const T28 v28_;
+  const T29 v29_;
+  const T30 v30_;
+  const T31 v31_;
+  const T32 v32_;
+  const T33 v33_;
+  const T34 v34_;
+  const T35 v35_;
+  const T36 v36_;
+  const T37 v37_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38>
+class ValueArray38 {
+ public:
+  ValueArray38(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
+      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38) : v1_(v1), v2_(v2), v3_(v3),
+      v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
+      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
+      v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),
+      v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28),
+      v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34),
+      v35_(v35), v36_(v36), v37_(v37), v38_(v38) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
+        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
+        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray38& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+  const T23 v23_;
+  const T24 v24_;
+  const T25 v25_;
+  const T26 v26_;
+  const T27 v27_;
+  const T28 v28_;
+  const T29 v29_;
+  const T30 v30_;
+  const T31 v31_;
+  const T32 v32_;
+  const T33 v33_;
+  const T34 v34_;
+  const T35 v35_;
+  const T36 v36_;
+  const T37 v37_;
+  const T38 v38_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39>
+class ValueArray39 {
+ public:
+  ValueArray39(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
+      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39) : v1_(v1), v2_(v2),
+      v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
+      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
+      v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),
+      v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28),
+      v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34),
+      v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
+        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
+        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
+        static_cast<T>(v39_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray39& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+  const T23 v23_;
+  const T24 v24_;
+  const T25 v25_;
+  const T26 v26_;
+  const T27 v27_;
+  const T28 v28_;
+  const T29 v29_;
+  const T30 v30_;
+  const T31 v31_;
+  const T32 v32_;
+  const T33 v33_;
+  const T34 v34_;
+  const T35 v35_;
+  const T36 v36_;
+  const T37 v37_;
+  const T38 v38_;
+  const T39 v39_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40>
+class ValueArray40 {
+ public:
+  ValueArray40(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
+      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40) : v1_(v1),
+      v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9),
+      v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15),
+      v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21),
+      v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27),
+      v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33),
+      v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39),
+      v40_(v40) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
+        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
+        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
+        static_cast<T>(v39_), static_cast<T>(v40_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray40& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+  const T23 v23_;
+  const T24 v24_;
+  const T25 v25_;
+  const T26 v26_;
+  const T27 v27_;
+  const T28 v28_;
+  const T29 v29_;
+  const T30 v30_;
+  const T31 v31_;
+  const T32 v32_;
+  const T33 v33_;
+  const T34 v34_;
+  const T35 v35_;
+  const T36 v36_;
+  const T37 v37_;
+  const T38 v38_;
+  const T39 v39_;
+  const T40 v40_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41>
+class ValueArray41 {
+ public:
+  ValueArray41(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
+      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40,
+      T41 v41) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
+      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
+      v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
+      v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26),
+      v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32),
+      v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38),
+      v39_(v39), v40_(v40), v41_(v41) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
+        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
+        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
+        static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray41& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+  const T23 v23_;
+  const T24 v24_;
+  const T25 v25_;
+  const T26 v26_;
+  const T27 v27_;
+  const T28 v28_;
+  const T29 v29_;
+  const T30 v30_;
+  const T31 v31_;
+  const T32 v32_;
+  const T33 v33_;
+  const T34 v34_;
+  const T35 v35_;
+  const T36 v36_;
+  const T37 v37_;
+  const T38 v38_;
+  const T39 v39_;
+  const T40 v40_;
+  const T41 v41_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42>
+class ValueArray42 {
+ public:
+  ValueArray42(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
+      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
+      T42 v42) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
+      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
+      v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
+      v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26),
+      v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32),
+      v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38),
+      v39_(v39), v40_(v40), v41_(v41), v42_(v42) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
+        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
+        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
+        static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),
+        static_cast<T>(v42_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray42& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+  const T23 v23_;
+  const T24 v24_;
+  const T25 v25_;
+  const T26 v26_;
+  const T27 v27_;
+  const T28 v28_;
+  const T29 v29_;
+  const T30 v30_;
+  const T31 v31_;
+  const T32 v32_;
+  const T33 v33_;
+  const T34 v34_;
+  const T35 v35_;
+  const T36 v36_;
+  const T37 v37_;
+  const T38 v38_;
+  const T39 v39_;
+  const T40 v40_;
+  const T41 v41_;
+  const T42 v42_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43>
+class ValueArray43 {
+ public:
+  ValueArray43(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
+      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
+      T42 v42, T43 v43) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6),
+      v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13),
+      v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19),
+      v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25),
+      v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31),
+      v32_(v32), v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37),
+      v38_(v38), v39_(v39), v40_(v40), v41_(v41), v42_(v42), v43_(v43) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
+        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
+        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
+        static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),
+        static_cast<T>(v42_), static_cast<T>(v43_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray43& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+  const T23 v23_;
+  const T24 v24_;
+  const T25 v25_;
+  const T26 v26_;
+  const T27 v27_;
+  const T28 v28_;
+  const T29 v29_;
+  const T30 v30_;
+  const T31 v31_;
+  const T32 v32_;
+  const T33 v33_;
+  const T34 v34_;
+  const T35 v35_;
+  const T36 v36_;
+  const T37 v37_;
+  const T38 v38_;
+  const T39 v39_;
+  const T40 v40_;
+  const T41 v41_;
+  const T42 v42_;
+  const T43 v43_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43, typename T44>
+class ValueArray44 {
+ public:
+  ValueArray44(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
+      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
+      T42 v42, T43 v43, T44 v44) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5),
+      v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12),
+      v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18),
+      v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24),
+      v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30),
+      v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35), v36_(v36),
+      v37_(v37), v38_(v38), v39_(v39), v40_(v40), v41_(v41), v42_(v42),
+      v43_(v43), v44_(v44) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
+        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
+        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
+        static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),
+        static_cast<T>(v42_), static_cast<T>(v43_), static_cast<T>(v44_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray44& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+  const T23 v23_;
+  const T24 v24_;
+  const T25 v25_;
+  const T26 v26_;
+  const T27 v27_;
+  const T28 v28_;
+  const T29 v29_;
+  const T30 v30_;
+  const T31 v31_;
+  const T32 v32_;
+  const T33 v33_;
+  const T34 v34_;
+  const T35 v35_;
+  const T36 v36_;
+  const T37 v37_;
+  const T38 v38_;
+  const T39 v39_;
+  const T40 v40_;
+  const T41 v41_;
+  const T42 v42_;
+  const T43 v43_;
+  const T44 v44_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43, typename T44, typename T45>
+class ValueArray45 {
+ public:
+  ValueArray45(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
+      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
+      T42 v42, T43 v43, T44 v44, T45 v45) : v1_(v1), v2_(v2), v3_(v3), v4_(v4),
+      v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11),
+      v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17),
+      v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23),
+      v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29),
+      v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35),
+      v36_(v36), v37_(v37), v38_(v38), v39_(v39), v40_(v40), v41_(v41),
+      v42_(v42), v43_(v43), v44_(v44), v45_(v45) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
+        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
+        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
+        static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),
+        static_cast<T>(v42_), static_cast<T>(v43_), static_cast<T>(v44_),
+        static_cast<T>(v45_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray45& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+  const T23 v23_;
+  const T24 v24_;
+  const T25 v25_;
+  const T26 v26_;
+  const T27 v27_;
+  const T28 v28_;
+  const T29 v29_;
+  const T30 v30_;
+  const T31 v31_;
+  const T32 v32_;
+  const T33 v33_;
+  const T34 v34_;
+  const T35 v35_;
+  const T36 v36_;
+  const T37 v37_;
+  const T38 v38_;
+  const T39 v39_;
+  const T40 v40_;
+  const T41 v41_;
+  const T42 v42_;
+  const T43 v43_;
+  const T44 v44_;
+  const T45 v45_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43, typename T44, typename T45,
+    typename T46>
+class ValueArray46 {
+ public:
+  ValueArray46(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
+      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
+      T42 v42, T43 v43, T44 v44, T45 v45, T46 v46) : v1_(v1), v2_(v2), v3_(v3),
+      v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
+      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
+      v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),
+      v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28),
+      v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34),
+      v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39), v40_(v40),
+      v41_(v41), v42_(v42), v43_(v43), v44_(v44), v45_(v45), v46_(v46) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
+        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
+        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
+        static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),
+        static_cast<T>(v42_), static_cast<T>(v43_), static_cast<T>(v44_),
+        static_cast<T>(v45_), static_cast<T>(v46_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray46& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+  const T23 v23_;
+  const T24 v24_;
+  const T25 v25_;
+  const T26 v26_;
+  const T27 v27_;
+  const T28 v28_;
+  const T29 v29_;
+  const T30 v30_;
+  const T31 v31_;
+  const T32 v32_;
+  const T33 v33_;
+  const T34 v34_;
+  const T35 v35_;
+  const T36 v36_;
+  const T37 v37_;
+  const T38 v38_;
+  const T39 v39_;
+  const T40 v40_;
+  const T41 v41_;
+  const T42 v42_;
+  const T43 v43_;
+  const T44 v44_;
+  const T45 v45_;
+  const T46 v46_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43, typename T44, typename T45,
+    typename T46, typename T47>
+class ValueArray47 {
+ public:
+  ValueArray47(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
+      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
+      T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47) : v1_(v1), v2_(v2),
+      v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
+      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
+      v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),
+      v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28),
+      v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34),
+      v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39), v40_(v40),
+      v41_(v41), v42_(v42), v43_(v43), v44_(v44), v45_(v45), v46_(v46),
+      v47_(v47) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
+        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
+        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
+        static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),
+        static_cast<T>(v42_), static_cast<T>(v43_), static_cast<T>(v44_),
+        static_cast<T>(v45_), static_cast<T>(v46_), static_cast<T>(v47_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray47& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+  const T23 v23_;
+  const T24 v24_;
+  const T25 v25_;
+  const T26 v26_;
+  const T27 v27_;
+  const T28 v28_;
+  const T29 v29_;
+  const T30 v30_;
+  const T31 v31_;
+  const T32 v32_;
+  const T33 v33_;
+  const T34 v34_;
+  const T35 v35_;
+  const T36 v36_;
+  const T37 v37_;
+  const T38 v38_;
+  const T39 v39_;
+  const T40 v40_;
+  const T41 v41_;
+  const T42 v42_;
+  const T43 v43_;
+  const T44 v44_;
+  const T45 v45_;
+  const T46 v46_;
+  const T47 v47_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43, typename T44, typename T45,
+    typename T46, typename T47, typename T48>
+class ValueArray48 {
+ public:
+  ValueArray48(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
+      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
+      T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47, T48 v48) : v1_(v1),
+      v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9),
+      v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15),
+      v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21),
+      v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27),
+      v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33),
+      v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39),
+      v40_(v40), v41_(v41), v42_(v42), v43_(v43), v44_(v44), v45_(v45),
+      v46_(v46), v47_(v47), v48_(v48) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
+        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
+        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
+        static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),
+        static_cast<T>(v42_), static_cast<T>(v43_), static_cast<T>(v44_),
+        static_cast<T>(v45_), static_cast<T>(v46_), static_cast<T>(v47_),
+        static_cast<T>(v48_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray48& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+  const T23 v23_;
+  const T24 v24_;
+  const T25 v25_;
+  const T26 v26_;
+  const T27 v27_;
+  const T28 v28_;
+  const T29 v29_;
+  const T30 v30_;
+  const T31 v31_;
+  const T32 v32_;
+  const T33 v33_;
+  const T34 v34_;
+  const T35 v35_;
+  const T36 v36_;
+  const T37 v37_;
+  const T38 v38_;
+  const T39 v39_;
+  const T40 v40_;
+  const T41 v41_;
+  const T42 v42_;
+  const T43 v43_;
+  const T44 v44_;
+  const T45 v45_;
+  const T46 v46_;
+  const T47 v47_;
+  const T48 v48_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43, typename T44, typename T45,
+    typename T46, typename T47, typename T48, typename T49>
+class ValueArray49 {
+ public:
+  ValueArray49(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
+      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
+      T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47, T48 v48,
+      T49 v49) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
+      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
+      v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
+      v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26),
+      v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32),
+      v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38),
+      v39_(v39), v40_(v40), v41_(v41), v42_(v42), v43_(v43), v44_(v44),
+      v45_(v45), v46_(v46), v47_(v47), v48_(v48), v49_(v49) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
+        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
+        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
+        static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),
+        static_cast<T>(v42_), static_cast<T>(v43_), static_cast<T>(v44_),
+        static_cast<T>(v45_), static_cast<T>(v46_), static_cast<T>(v47_),
+        static_cast<T>(v48_), static_cast<T>(v49_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray49& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+  const T23 v23_;
+  const T24 v24_;
+  const T25 v25_;
+  const T26 v26_;
+  const T27 v27_;
+  const T28 v28_;
+  const T29 v29_;
+  const T30 v30_;
+  const T31 v31_;
+  const T32 v32_;
+  const T33 v33_;
+  const T34 v34_;
+  const T35 v35_;
+  const T36 v36_;
+  const T37 v37_;
+  const T38 v38_;
+  const T39 v39_;
+  const T40 v40_;
+  const T41 v41_;
+  const T42 v42_;
+  const T43 v43_;
+  const T44 v44_;
+  const T45 v45_;
+  const T46 v46_;
+  const T47 v47_;
+  const T48 v48_;
+  const T49 v49_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43, typename T44, typename T45,
+    typename T46, typename T47, typename T48, typename T49, typename T50>
+class ValueArray50 {
+ public:
+  ValueArray50(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
+      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
+      T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47, T48 v48, T49 v49,
+      T50 v50) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
+      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
+      v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
+      v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26),
+      v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32),
+      v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38),
+      v39_(v39), v40_(v40), v41_(v41), v42_(v42), v43_(v43), v44_(v44),
+      v45_(v45), v46_(v46), v47_(v47), v48_(v48), v49_(v49), v50_(v50) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
+        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
+        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
+        static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),
+        static_cast<T>(v42_), static_cast<T>(v43_), static_cast<T>(v44_),
+        static_cast<T>(v45_), static_cast<T>(v46_), static_cast<T>(v47_),
+        static_cast<T>(v48_), static_cast<T>(v49_), static_cast<T>(v50_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray50& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+  const T23 v23_;
+  const T24 v24_;
+  const T25 v25_;
+  const T26 v26_;
+  const T27 v27_;
+  const T28 v28_;
+  const T29 v29_;
+  const T30 v30_;
+  const T31 v31_;
+  const T32 v32_;
+  const T33 v33_;
+  const T34 v34_;
+  const T35 v35_;
+  const T36 v36_;
+  const T37 v37_;
+  const T38 v38_;
+  const T39 v39_;
+  const T40 v40_;
+  const T41 v41_;
+  const T42 v42_;
+  const T43 v43_;
+  const T44 v44_;
+  const T45 v45_;
+  const T46 v46_;
+  const T47 v47_;
+  const T48 v48_;
+  const T49 v49_;
+  const T50 v50_;
+};
+
+# if GTEST_HAS_COMBINE
+// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
+//
+// Generates values from the Cartesian product of values produced
+// by the argument generators.
+//
+template <typename T1, typename T2>
+class CartesianProductGenerator2
+    : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2> > {
+ public:
+  typedef ::std::tr1::tuple<T1, T2> ParamType;
+
+  CartesianProductGenerator2(const ParamGenerator<T1>& g1,
+      const ParamGenerator<T2>& g2)
+      : g1_(g1), g2_(g2) {}
+  virtual ~CartesianProductGenerator2() {}
+
+  virtual ParamIteratorInterface<ParamType>* Begin() const {
+    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin());
+  }
+  virtual ParamIteratorInterface<ParamType>* End() const {
+    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end());
+  }
+
+ private:
+  class Iterator : public ParamIteratorInterface<ParamType> {
+   public:
+    Iterator(const ParamGeneratorInterface<ParamType>* base,
+      const ParamGenerator<T1>& g1,
+      const typename ParamGenerator<T1>::iterator& current1,
+      const ParamGenerator<T2>& g2,
+      const typename ParamGenerator<T2>::iterator& current2)
+        : base_(base),
+          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
+          begin2_(g2.begin()), end2_(g2.end()), current2_(current2)    {
+      ComputeCurrentValue();
+    }
+    virtual ~Iterator() {}
+
+    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
+      return base_;
+    }
+    // Advance should not be called on beyond-of-range iterators
+    // so no component iterators must be beyond end of range, either.
+    virtual void Advance() {
+      assert(!AtEnd());
+      ++current2_;
+      if (current2_ == end2_) {
+        current2_ = begin2_;
+        ++current1_;
+      }
+      ComputeCurrentValue();
+    }
+    virtual ParamIteratorInterface<ParamType>* Clone() const {
+      return new Iterator(*this);
+    }
+    virtual const ParamType* Current() const { return &current_value_; }
+    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
+      // Having the same base generator guarantees that the other
+      // iterator is of the same type and we can downcast.
+      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
+          << "The program attempted to compare iterators "
+          << "from different generators." << std::endl;
+      const Iterator* typed_other =
+          CheckedDowncastToActualType<const Iterator>(&other);
+      // We must report iterators equal if they both point beyond their
+      // respective ranges. That can happen in a variety of fashions,
+      // so we have to consult AtEnd().
+      return (AtEnd() && typed_other->AtEnd()) ||
+         (
+          current1_ == typed_other->current1_ &&
+          current2_ == typed_other->current2_);
+    }
+
+   private:
+    Iterator(const Iterator& other)
+        : base_(other.base_),
+        begin1_(other.begin1_),
+        end1_(other.end1_),
+        current1_(other.current1_),
+        begin2_(other.begin2_),
+        end2_(other.end2_),
+        current2_(other.current2_) {
+      ComputeCurrentValue();
+    }
+
+    void ComputeCurrentValue() {
+      if (!AtEnd())
+        current_value_ = ParamType(*current1_, *current2_);
+    }
+    bool AtEnd() const {
+      // We must report iterator past the end of the range when either of the
+      // component iterators has reached the end of its range.
+      return
+          current1_ == end1_ ||
+          current2_ == end2_;
+    }
+
+    // No implementation - assignment is unsupported.
+    void operator=(const Iterator& other);
+
+    const ParamGeneratorInterface<ParamType>* const base_;
+    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
+    // current[i]_ is the actual traversing iterator.
+    const typename ParamGenerator<T1>::iterator begin1_;
+    const typename ParamGenerator<T1>::iterator end1_;
+    typename ParamGenerator<T1>::iterator current1_;
+    const typename ParamGenerator<T2>::iterator begin2_;
+    const typename ParamGenerator<T2>::iterator end2_;
+    typename ParamGenerator<T2>::iterator current2_;
+    ParamType current_value_;
+  };  // class CartesianProductGenerator2::Iterator
+
+  // No implementation - assignment is unsupported.
+  void operator=(const CartesianProductGenerator2& other);
+
+  const ParamGenerator<T1> g1_;
+  const ParamGenerator<T2> g2_;
+};  // class CartesianProductGenerator2
+
+
+template <typename T1, typename T2, typename T3>
+class CartesianProductGenerator3
+    : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3> > {
+ public:
+  typedef ::std::tr1::tuple<T1, T2, T3> ParamType;
+
+  CartesianProductGenerator3(const ParamGenerator<T1>& g1,
+      const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3)
+      : g1_(g1), g2_(g2), g3_(g3) {}
+  virtual ~CartesianProductGenerator3() {}
+
+  virtual ParamIteratorInterface<ParamType>* Begin() const {
+    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
+        g3_.begin());
+  }
+  virtual ParamIteratorInterface<ParamType>* End() const {
+    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end());
+  }
+
+ private:
+  class Iterator : public ParamIteratorInterface<ParamType> {
+   public:
+    Iterator(const ParamGeneratorInterface<ParamType>* base,
+      const ParamGenerator<T1>& g1,
+      const typename ParamGenerator<T1>::iterator& current1,
+      const ParamGenerator<T2>& g2,
+      const typename ParamGenerator<T2>::iterator& current2,
+      const ParamGenerator<T3>& g3,
+      const typename ParamGenerator<T3>::iterator& current3)
+        : base_(base),
+          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
+          begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
+          begin3_(g3.begin()), end3_(g3.end()), current3_(current3)    {
+      ComputeCurrentValue();
+    }
+    virtual ~Iterator() {}
+
+    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
+      return base_;
+    }
+    // Advance should not be called on beyond-of-range iterators
+    // so no component iterators must be beyond end of range, either.
+    virtual void Advance() {
+      assert(!AtEnd());
+      ++current3_;
+      if (current3_ == end3_) {
+        current3_ = begin3_;
+        ++current2_;
+      }
+      if (current2_ == end2_) {
+        current2_ = begin2_;
+        ++current1_;
+      }
+      ComputeCurrentValue();
+    }
+    virtual ParamIteratorInterface<ParamType>* Clone() const {
+      return new Iterator(*this);
+    }
+    virtual const ParamType* Current() const { return &current_value_; }
+    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
+      // Having the same base generator guarantees that the other
+      // iterator is of the same type and we can downcast.
+      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
+          << "The program attempted to compare iterators "
+          << "from different generators." << std::endl;
+      const Iterator* typed_other =
+          CheckedDowncastToActualType<const Iterator>(&other);
+      // We must report iterators equal if they both point beyond their
+      // respective ranges. That can happen in a variety of fashions,
+      // so we have to consult AtEnd().
+      return (AtEnd() && typed_other->AtEnd()) ||
+         (
+          current1_ == typed_other->current1_ &&
+          current2_ == typed_other->current2_ &&
+          current3_ == typed_other->current3_);
+    }
+
+   private:
+    Iterator(const Iterator& other)
+        : base_(other.base_),
+        begin1_(other.begin1_),
+        end1_(other.end1_),
+        current1_(other.current1_),
+        begin2_(other.begin2_),
+        end2_(other.end2_),
+        current2_(other.current2_),
+        begin3_(other.begin3_),
+        end3_(other.end3_),
+        current3_(other.current3_) {
+      ComputeCurrentValue();
+    }
+
+    void ComputeCurrentValue() {
+      if (!AtEnd())
+        current_value_ = ParamType(*current1_, *current2_, *current3_);
+    }
+    bool AtEnd() const {
+      // We must report iterator past the end of the range when either of the
+      // component iterators has reached the end of its range.
+      return
+          current1_ == end1_ ||
+          current2_ == end2_ ||
+          current3_ == end3_;
+    }
+
+    // No implementation - assignment is unsupported.
+    void operator=(const Iterator& other);
+
+    const ParamGeneratorInterface<ParamType>* const base_;
+    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
+    // current[i]_ is the actual traversing iterator.
+    const typename ParamGenerator<T1>::iterator begin1_;
+    const typename ParamGenerator<T1>::iterator end1_;
+    typename ParamGenerator<T1>::iterator current1_;
+    const typename ParamGenerator<T2>::iterator begin2_;
+    const typename ParamGenerator<T2>::iterator end2_;
+    typename ParamGenerator<T2>::iterator current2_;
+    const typename ParamGenerator<T3>::iterator begin3_;
+    const typename ParamGenerator<T3>::iterator end3_;
+    typename ParamGenerator<T3>::iterator current3_;
+    ParamType current_value_;
+  };  // class CartesianProductGenerator3::Iterator
+
+  // No implementation - assignment is unsupported.
+  void operator=(const CartesianProductGenerator3& other);
+
+  const ParamGenerator<T1> g1_;
+  const ParamGenerator<T2> g2_;
+  const ParamGenerator<T3> g3_;
+};  // class CartesianProductGenerator3
+
+
+template <typename T1, typename T2, typename T3, typename T4>
+class CartesianProductGenerator4
+    : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3, T4> > {
+ public:
+  typedef ::std::tr1::tuple<T1, T2, T3, T4> ParamType;
+
+  CartesianProductGenerator4(const ParamGenerator<T1>& g1,
+      const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,
+      const ParamGenerator<T4>& g4)
+      : g1_(g1), g2_(g2), g3_(g3), g4_(g4) {}
+  virtual ~CartesianProductGenerator4() {}
+
+  virtual ParamIteratorInterface<ParamType>* Begin() const {
+    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
+        g3_.begin(), g4_, g4_.begin());
+  }
+  virtual ParamIteratorInterface<ParamType>* End() const {
+    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),
+        g4_, g4_.end());
+  }
+
+ private:
+  class Iterator : public ParamIteratorInterface<ParamType> {
+   public:
+    Iterator(const ParamGeneratorInterface<ParamType>* base,
+      const ParamGenerator<T1>& g1,
+      const typename ParamGenerator<T1>::iterator& current1,
+      const ParamGenerator<T2>& g2,
+      const typename ParamGenerator<T2>::iterator& current2,
+      const ParamGenerator<T3>& g3,
+      const typename ParamGenerator<T3>::iterator& current3,
+      const ParamGenerator<T4>& g4,
+      const typename ParamGenerator<T4>::iterator& current4)
+        : base_(base),
+          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
+          begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
+          begin3_(g3.begin()), end3_(g3.end()), current3_(current3),
+          begin4_(g4.begin()), end4_(g4.end()), current4_(current4)    {
+      ComputeCurrentValue();
+    }
+    virtual ~Iterator() {}
+
+    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
+      return base_;
+    }
+    // Advance should not be called on beyond-of-range iterators
+    // so no component iterators must be beyond end of range, either.
+    virtual void Advance() {
+      assert(!AtEnd());
+      ++current4_;
+      if (current4_ == end4_) {
+        current4_ = begin4_;
+        ++current3_;
+      }
+      if (current3_ == end3_) {
+        current3_ = begin3_;
+        ++current2_;
+      }
+      if (current2_ == end2_) {
+        current2_ = begin2_;
+        ++current1_;
+      }
+      ComputeCurrentValue();
+    }
+    virtual ParamIteratorInterface<ParamType>* Clone() const {
+      return new Iterator(*this);
+    }
+    virtual const ParamType* Current() const { return &current_value_; }
+    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
+      // Having the same base generator guarantees that the other
+      // iterator is of the same type and we can downcast.
+      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
+          << "The program attempted to compare iterators "
+          << "from different generators." << std::endl;
+      const Iterator* typed_other =
+          CheckedDowncastToActualType<const Iterator>(&other);
+      // We must report iterators equal if they both point beyond their
+      // respective ranges. That can happen in a variety of fashions,
+      // so we have to consult AtEnd().
+      return (AtEnd() && typed_other->AtEnd()) ||
+         (
+          current1_ == typed_other->current1_ &&
+          current2_ == typed_other->current2_ &&
+          current3_ == typed_other->current3_ &&
+          current4_ == typed_other->current4_);
+    }
+
+   private:
+    Iterator(const Iterator& other)
+        : base_(other.base_),
+        begin1_(other.begin1_),
+        end1_(other.end1_),
+        current1_(other.current1_),
+        begin2_(other.begin2_),
+        end2_(other.end2_),
+        current2_(other.current2_),
+        begin3_(other.begin3_),
+        end3_(other.end3_),
+        current3_(other.current3_),
+        begin4_(other.begin4_),
+        end4_(other.end4_),
+        current4_(other.current4_) {
+      ComputeCurrentValue();
+    }
+
+    void ComputeCurrentValue() {
+      if (!AtEnd())
+        current_value_ = ParamType(*current1_, *current2_, *current3_,
+            *current4_);
+    }
+    bool AtEnd() const {
+      // We must report iterator past the end of the range when either of the
+      // component iterators has reached the end of its range.
+      return
+          current1_ == end1_ ||
+          current2_ == end2_ ||
+          current3_ == end3_ ||
+          current4_ == end4_;
+    }
+
+    // No implementation - assignment is unsupported.
+    void operator=(const Iterator& other);
+
+    const ParamGeneratorInterface<ParamType>* const base_;
+    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
+    // current[i]_ is the actual traversing iterator.
+    const typename ParamGenerator<T1>::iterator begin1_;
+    const typename ParamGenerator<T1>::iterator end1_;
+    typename ParamGenerator<T1>::iterator current1_;
+    const typename ParamGenerator<T2>::iterator begin2_;
+    const typename ParamGenerator<T2>::iterator end2_;
+    typename ParamGenerator<T2>::iterator current2_;
+    const typename ParamGenerator<T3>::iterator begin3_;
+    const typename ParamGenerator<T3>::iterator end3_;
+    typename ParamGenerator<T3>::iterator current3_;
+    const typename ParamGenerator<T4>::iterator begin4_;
+    const typename ParamGenerator<T4>::iterator end4_;
+    typename ParamGenerator<T4>::iterator current4_;
+    ParamType current_value_;
+  };  // class CartesianProductGenerator4::Iterator
+
+  // No implementation - assignment is unsupported.
+  void operator=(const CartesianProductGenerator4& other);
+
+  const ParamGenerator<T1> g1_;
+  const ParamGenerator<T2> g2_;
+  const ParamGenerator<T3> g3_;
+  const ParamGenerator<T4> g4_;
+};  // class CartesianProductGenerator4
+
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5>
+class CartesianProductGenerator5
+    : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3, T4, T5> > {
+ public:
+  typedef ::std::tr1::tuple<T1, T2, T3, T4, T5> ParamType;
+
+  CartesianProductGenerator5(const ParamGenerator<T1>& g1,
+      const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,
+      const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5)
+      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5) {}
+  virtual ~CartesianProductGenerator5() {}
+
+  virtual ParamIteratorInterface<ParamType>* Begin() const {
+    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
+        g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin());
+  }
+  virtual ParamIteratorInterface<ParamType>* End() const {
+    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),
+        g4_, g4_.end(), g5_, g5_.end());
+  }
+
+ private:
+  class Iterator : public ParamIteratorInterface<ParamType> {
+   public:
+    Iterator(const ParamGeneratorInterface<ParamType>* base,
+      const ParamGenerator<T1>& g1,
+      const typename ParamGenerator<T1>::iterator& current1,
+      const ParamGenerator<T2>& g2,
+      const typename ParamGenerator<T2>::iterator& current2,
+      const ParamGenerator<T3>& g3,
+      const typename ParamGenerator<T3>::iterator& current3,
+      const ParamGenerator<T4>& g4,
+      const typename ParamGenerator<T4>::iterator& current4,
+      const ParamGenerator<T5>& g5,
+      const typename ParamGenerator<T5>::iterator& current5)
+        : base_(base),
+          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
+          begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
+          begin3_(g3.begin()), end3_(g3.end()), current3_(current3),
+          begin4_(g4.begin()), end4_(g4.end()), current4_(current4),
+          begin5_(g5.begin()), end5_(g5.end()), current5_(current5)    {
+      ComputeCurrentValue();
+    }
+    virtual ~Iterator() {}
+
+    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
+      return base_;
+    }
+    // Advance should not be called on beyond-of-range iterators
+    // so no component iterators must be beyond end of range, either.
+    virtual void Advance() {
+      assert(!AtEnd());
+      ++current5_;
+      if (current5_ == end5_) {
+        current5_ = begin5_;
+        ++current4_;
+      }
+      if (current4_ == end4_) {
+        current4_ = begin4_;
+        ++current3_;
+      }
+      if (current3_ == end3_) {
+        current3_ = begin3_;
+        ++current2_;
+      }
+      if (current2_ == end2_) {
+        current2_ = begin2_;
+        ++current1_;
+      }
+      ComputeCurrentValue();
+    }
+    virtual ParamIteratorInterface<ParamType>* Clone() const {
+      return new Iterator(*this);
+    }
+    virtual const ParamType* Current() const { return &current_value_; }
+    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
+      // Having the same base generator guarantees that the other
+      // iterator is of the same type and we can downcast.
+      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
+          << "The program attempted to compare iterators "
+          << "from different generators." << std::endl;
+      const Iterator* typed_other =
+          CheckedDowncastToActualType<const Iterator>(&other);
+      // We must report iterators equal if they both point beyond their
+      // respective ranges. That can happen in a variety of fashions,
+      // so we have to consult AtEnd().
+      return (AtEnd() && typed_other->AtEnd()) ||
+         (
+          current1_ == typed_other->current1_ &&
+          current2_ == typed_other->current2_ &&
+          current3_ == typed_other->current3_ &&
+          current4_ == typed_other->current4_ &&
+          current5_ == typed_other->current5_);
+    }
+
+   private:
+    Iterator(const Iterator& other)
+        : base_(other.base_),
+        begin1_(other.begin1_),
+        end1_(other.end1_),
+        current1_(other.current1_),
+        begin2_(other.begin2_),
+        end2_(other.end2_),
+        current2_(other.current2_),
+        begin3_(other.begin3_),
+        end3_(other.end3_),
+        current3_(other.current3_),
+        begin4_(other.begin4_),
+        end4_(other.end4_),
+        current4_(other.current4_),
+        begin5_(other.begin5_),
+        end5_(other.end5_),
+        current5_(other.current5_) {
+      ComputeCurrentValue();
+    }
+
+    void ComputeCurrentValue() {
+      if (!AtEnd())
+        current_value_ = ParamType(*current1_, *current2_, *current3_,
+            *current4_, *current5_);
+    }
+    bool AtEnd() const {
+      // We must report iterator past the end of the range when either of the
+      // component iterators has reached the end of its range.
+      return
+          current1_ == end1_ ||
+          current2_ == end2_ ||
+          current3_ == end3_ ||
+          current4_ == end4_ ||
+          current5_ == end5_;
+    }
+
+    // No implementation - assignment is unsupported.
+    void operator=(const Iterator& other);
+
+    const ParamGeneratorInterface<ParamType>* const base_;
+    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
+    // current[i]_ is the actual traversing iterator.
+    const typename ParamGenerator<T1>::iterator begin1_;
+    const typename ParamGenerator<T1>::iterator end1_;
+    typename ParamGenerator<T1>::iterator current1_;
+    const typename ParamGenerator<T2>::iterator begin2_;
+    const typename ParamGenerator<T2>::iterator end2_;
+    typename ParamGenerator<T2>::iterator current2_;
+    const typename ParamGenerator<T3>::iterator begin3_;
+    const typename ParamGenerator<T3>::iterator end3_;
+    typename ParamGenerator<T3>::iterator current3_;
+    const typename ParamGenerator<T4>::iterator begin4_;
+    const typename ParamGenerator<T4>::iterator end4_;
+    typename ParamGenerator<T4>::iterator current4_;
+    const typename ParamGenerator<T5>::iterator begin5_;
+    const typename ParamGenerator<T5>::iterator end5_;
+    typename ParamGenerator<T5>::iterator current5_;
+    ParamType current_value_;
+  };  // class CartesianProductGenerator5::Iterator
+
+  // No implementation - assignment is unsupported.
+  void operator=(const CartesianProductGenerator5& other);
+
+  const ParamGenerator<T1> g1_;
+  const ParamGenerator<T2> g2_;
+  const ParamGenerator<T3> g3_;
+  const ParamGenerator<T4> g4_;
+  const ParamGenerator<T5> g5_;
+};  // class CartesianProductGenerator5
+
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6>
+class CartesianProductGenerator6
+    : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3, T4, T5,
+        T6> > {
+ public:
+  typedef ::std::tr1::tuple<T1, T2, T3, T4, T5, T6> ParamType;
+
+  CartesianProductGenerator6(const ParamGenerator<T1>& g1,
+      const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,
+      const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5,
+      const ParamGenerator<T6>& g6)
+      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6) {}
+  virtual ~CartesianProductGenerator6() {}
+
+  virtual ParamIteratorInterface<ParamType>* Begin() const {
+    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
+        g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin(), g6_, g6_.begin());
+  }
+  virtual ParamIteratorInterface<ParamType>* End() const {
+    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),
+        g4_, g4_.end(), g5_, g5_.end(), g6_, g6_.end());
+  }
+
+ private:
+  class Iterator : public ParamIteratorInterface<ParamType> {
+   public:
+    Iterator(const ParamGeneratorInterface<ParamType>* base,
+      const ParamGenerator<T1>& g1,
+      const typename ParamGenerator<T1>::iterator& current1,
+      const ParamGenerator<T2>& g2,
+      const typename ParamGenerator<T2>::iterator& current2,
+      const ParamGenerator<T3>& g3,
+      const typename ParamGenerator<T3>::iterator& current3,
+      const ParamGenerator<T4>& g4,
+      const typename ParamGenerator<T4>::iterator& current4,
+      const ParamGenerator<T5>& g5,
+      const typename ParamGenerator<T5>::iterator& current5,
+      const ParamGenerator<T6>& g6,
+      const typename ParamGenerator<T6>::iterator& current6)
+        : base_(base),
+          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
+          begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
+          begin3_(g3.begin()), end3_(g3.end()), current3_(current3),
+          begin4_(g4.begin()), end4_(g4.end()), current4_(current4),
+          begin5_(g5.begin()), end5_(g5.end()), current5_(current5),
+          begin6_(g6.begin()), end6_(g6.end()), current6_(current6)    {
+      ComputeCurrentValue();
+    }
+    virtual ~Iterator() {}
+
+    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
+      return base_;
+    }
+    // Advance should not be called on beyond-of-range iterators
+    // so no component iterators must be beyond end of range, either.
+    virtual void Advance() {
+      assert(!AtEnd());
+      ++current6_;
+      if (current6_ == end6_) {
+        current6_ = begin6_;
+        ++current5_;
+      }
+      if (current5_ == end5_) {
+        current5_ = begin5_;
+        ++current4_;
+      }
+      if (current4_ == end4_) {
+        current4_ = begin4_;
+        ++current3_;
+      }
+      if (current3_ == end3_) {
+        current3_ = begin3_;
+        ++current2_;
+      }
+      if (current2_ == end2_) {
+        current2_ = begin2_;
+        ++current1_;
+      }
+      ComputeCurrentValue();
+    }
+    virtual ParamIteratorInterface<ParamType>* Clone() const {
+      return new Iterator(*this);
+    }
+    virtual const ParamType* Current() const { return &current_value_; }
+    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
+      // Having the same base generator guarantees that the other
+      // iterator is of the same type and we can downcast.
+      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
+          << "The program attempted to compare iterators "
+          << "from different generators." << std::endl;
+      const Iterator* typed_other =
+          CheckedDowncastToActualType<const Iterator>(&other);
+      // We must report iterators equal if they both point beyond their
+      // respective ranges. That can happen in a variety of fashions,
+      // so we have to consult AtEnd().
+      return (AtEnd() && typed_other->AtEnd()) ||
+         (
+          current1_ == typed_other->current1_ &&
+          current2_ == typed_other->current2_ &&
+          current3_ == typed_other->current3_ &&
+          current4_ == typed_other->current4_ &&
+          current5_ == typed_other->current5_ &&
+          current6_ == typed_other->current6_);
+    }
+
+   private:
+    Iterator(const Iterator& other)
+        : base_(other.base_),
+        begin1_(other.begin1_),
+        end1_(other.end1_),
+        current1_(other.current1_),
+        begin2_(other.begin2_),
+        end2_(other.end2_),
+        current2_(other.current2_),
+        begin3_(other.begin3_),
+        end3_(other.end3_),
+        current3_(other.current3_),
+        begin4_(other.begin4_),
+        end4_(other.end4_),
+        current4_(other.current4_),
+        begin5_(other.begin5_),
+        end5_(other.end5_),
+        current5_(other.current5_),
+        begin6_(other.begin6_),
+        end6_(other.end6_),
+        current6_(other.current6_) {
+      ComputeCurrentValue();
+    }
+
+    void ComputeCurrentValue() {
+      if (!AtEnd())
+        current_value_ = ParamType(*current1_, *current2_, *current3_,
+            *current4_, *current5_, *current6_);
+    }
+    bool AtEnd() const {
+      // We must report iterator past the end of the range when either of the
+      // component iterators has reached the end of its range.
+      return
+          current1_ == end1_ ||
+          current2_ == end2_ ||
+          current3_ == end3_ ||
+          current4_ == end4_ ||
+          current5_ == end5_ ||
+          current6_ == end6_;
+    }
+
+    // No implementation - assignment is unsupported.
+    void operator=(const Iterator& other);
+
+    const ParamGeneratorInterface<ParamType>* const base_;
+    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
+    // current[i]_ is the actual traversing iterator.
+    const typename ParamGenerator<T1>::iterator begin1_;
+    const typename ParamGenerator<T1>::iterator end1_;
+    typename ParamGenerator<T1>::iterator current1_;
+    const typename ParamGenerator<T2>::iterator begin2_;
+    const typename ParamGenerator<T2>::iterator end2_;
+    typename ParamGenerator<T2>::iterator current2_;
+    const typename ParamGenerator<T3>::iterator begin3_;
+    const typename ParamGenerator<T3>::iterator end3_;
+    typename ParamGenerator<T3>::iterator current3_;
+    const typename ParamGenerator<T4>::iterator begin4_;
+    const typename ParamGenerator<T4>::iterator end4_;
+    typename ParamGenerator<T4>::iterator current4_;
+    const typename ParamGenerator<T5>::iterator begin5_;
+    const typename ParamGenerator<T5>::iterator end5_;
+    typename ParamGenerator<T5>::iterator current5_;
+    const typename ParamGenerator<T6>::iterator begin6_;
+    const typename ParamGenerator<T6>::iterator end6_;
+    typename ParamGenerator<T6>::iterator current6_;
+    ParamType current_value_;
+  };  // class CartesianProductGenerator6::Iterator
+
+  // No implementation - assignment is unsupported.
+  void operator=(const CartesianProductGenerator6& other);
+
+  const ParamGenerator<T1> g1_;
+  const ParamGenerator<T2> g2_;
+  const ParamGenerator<T3> g3_;
+  const ParamGenerator<T4> g4_;
+  const ParamGenerator<T5> g5_;
+  const ParamGenerator<T6> g6_;
+};  // class CartesianProductGenerator6
+
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7>
+class CartesianProductGenerator7
+    : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6,
+        T7> > {
+ public:
+  typedef ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7> ParamType;
+
+  CartesianProductGenerator7(const ParamGenerator<T1>& g1,
+      const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,
+      const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5,
+      const ParamGenerator<T6>& g6, const ParamGenerator<T7>& g7)
+      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7) {}
+  virtual ~CartesianProductGenerator7() {}
+
+  virtual ParamIteratorInterface<ParamType>* Begin() const {
+    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
+        g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin(), g6_, g6_.begin(), g7_,
+        g7_.begin());
+  }
+  virtual ParamIteratorInterface<ParamType>* End() const {
+    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),
+        g4_, g4_.end(), g5_, g5_.end(), g6_, g6_.end(), g7_, g7_.end());
+  }
+
+ private:
+  class Iterator : public ParamIteratorInterface<ParamType> {
+   public:
+    Iterator(const ParamGeneratorInterface<ParamType>* base,
+      const ParamGenerator<T1>& g1,
+      const typename ParamGenerator<T1>::iterator& current1,
+      const ParamGenerator<T2>& g2,
+      const typename ParamGenerator<T2>::iterator& current2,
+      const ParamGenerator<T3>& g3,
+      const typename ParamGenerator<T3>::iterator& current3,
+      const ParamGenerator<T4>& g4,
+      const typename ParamGenerator<T4>::iterator& current4,
+      const ParamGenerator<T5>& g5,
+      const typename ParamGenerator<T5>::iterator& current5,
+      const ParamGenerator<T6>& g6,
+      const typename ParamGenerator<T6>::iterator& current6,
+      const ParamGenerator<T7>& g7,
+      const typename ParamGenerator<T7>::iterator& current7)
+        : base_(base),
+          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
+          begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
+          begin3_(g3.begin()), end3_(g3.end()), current3_(current3),
+          begin4_(g4.begin()), end4_(g4.end()), current4_(current4),
+          begin5_(g5.begin()), end5_(g5.end()), current5_(current5),
+          begin6_(g6.begin()), end6_(g6.end()), current6_(current6),
+          begin7_(g7.begin()), end7_(g7.end()), current7_(current7)    {
+      ComputeCurrentValue();
+    }
+    virtual ~Iterator() {}
+
+    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
+      return base_;
+    }
+    // Advance should not be called on beyond-of-range iterators
+    // so no component iterators must be beyond end of range, either.
+    virtual void Advance() {
+      assert(!AtEnd());
+      ++current7_;
+      if (current7_ == end7_) {
+        current7_ = begin7_;
+        ++current6_;
+      }
+      if (current6_ == end6_) {
+        current6_ = begin6_;
+        ++current5_;
+      }
+      if (current5_ == end5_) {
+        current5_ = begin5_;
+        ++current4_;
+      }
+      if (current4_ == end4_) {
+        current4_ = begin4_;
+        ++current3_;
+      }
+      if (current3_ == end3_) {
+        current3_ = begin3_;
+        ++current2_;
+      }
+      if (current2_ == end2_) {
+        current2_ = begin2_;
+        ++current1_;
+      }
+      ComputeCurrentValue();
+    }
+    virtual ParamIteratorInterface<ParamType>* Clone() const {
+      return new Iterator(*this);
+    }
+    virtual const ParamType* Current() const { return &current_value_; }
+    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
+      // Having the same base generator guarantees that the other
+      // iterator is of the same type and we can downcast.
+      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
+          << "The program attempted to compare iterators "
+          << "from different generators." << std::endl;
+      const Iterator* typed_other =
+          CheckedDowncastToActualType<const Iterator>(&other);
+      // We must report iterators equal if they both point beyond their
+      // respective ranges. That can happen in a variety of fashions,
+      // so we have to consult AtEnd().
+      return (AtEnd() && typed_other->AtEnd()) ||
+         (
+          current1_ == typed_other->current1_ &&
+          current2_ == typed_other->current2_ &&
+          current3_ == typed_other->current3_ &&
+          current4_ == typed_other->current4_ &&
+          current5_ == typed_other->current5_ &&
+          current6_ == typed_other->current6_ &&
+          current7_ == typed_other->current7_);
+    }
+
+   private:
+    Iterator(const Iterator& other)
+        : base_(other.base_),
+        begin1_(other.begin1_),
+        end1_(other.end1_),
+        current1_(other.current1_),
+        begin2_(other.begin2_),
+        end2_(other.end2_),
+        current2_(other.current2_),
+        begin3_(other.begin3_),
+        end3_(other.end3_),
+        current3_(other.current3_),
+        begin4_(other.begin4_),
+        end4_(other.end4_),
+        current4_(other.current4_),
+        begin5_(other.begin5_),
+        end5_(other.end5_),
+        current5_(other.current5_),
+        begin6_(other.begin6_),
+        end6_(other.end6_),
+        current6_(other.current6_),
+        begin7_(other.begin7_),
+        end7_(other.end7_),
+        current7_(other.current7_) {
+      ComputeCurrentValue();
+    }
+
+    void ComputeCurrentValue() {
+      if (!AtEnd())
+        current_value_ = ParamType(*current1_, *current2_, *current3_,
+            *current4_, *current5_, *current6_, *current7_);
+    }
+    bool AtEnd() const {
+      // We must report iterator past the end of the range when either of the
+      // component iterators has reached the end of its range.
+      return
+          current1_ == end1_ ||
+          current2_ == end2_ ||
+          current3_ == end3_ ||
+          current4_ == end4_ ||
+          current5_ == end5_ ||
+          current6_ == end6_ ||
+          current7_ == end7_;
+    }
+
+    // No implementation - assignment is unsupported.
+    void operator=(const Iterator& other);
+
+    const ParamGeneratorInterface<ParamType>* const base_;
+    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
+    // current[i]_ is the actual traversing iterator.
+    const typename ParamGenerator<T1>::iterator begin1_;
+    const typename ParamGenerator<T1>::iterator end1_;
+    typename ParamGenerator<T1>::iterator current1_;
+    const typename ParamGenerator<T2>::iterator begin2_;
+    const typename ParamGenerator<T2>::iterator end2_;
+    typename ParamGenerator<T2>::iterator current2_;
+    const typename ParamGenerator<T3>::iterator begin3_;
+    const typename ParamGenerator<T3>::iterator end3_;
+    typename ParamGenerator<T3>::iterator current3_;
+    const typename ParamGenerator<T4>::iterator begin4_;
+    const typename ParamGenerator<T4>::iterator end4_;
+    typename ParamGenerator<T4>::iterator current4_;
+    const typename ParamGenerator<T5>::iterator begin5_;
+    const typename ParamGenerator<T5>::iterator end5_;
+    typename ParamGenerator<T5>::iterator current5_;
+    const typename ParamGenerator<T6>::iterator begin6_;
+    const typename ParamGenerator<T6>::iterator end6_;
+    typename ParamGenerator<T6>::iterator current6_;
+    const typename ParamGenerator<T7>::iterator begin7_;
+    const typename ParamGenerator<T7>::iterator end7_;
+    typename ParamGenerator<T7>::iterator current7_;
+    ParamType current_value_;
+  };  // class CartesianProductGenerator7::Iterator
+
+  // No implementation - assignment is unsupported.
+  void operator=(const CartesianProductGenerator7& other);
+
+  const ParamGenerator<T1> g1_;
+  const ParamGenerator<T2> g2_;
+  const ParamGenerator<T3> g3_;
+  const ParamGenerator<T4> g4_;
+  const ParamGenerator<T5> g5_;
+  const ParamGenerator<T6> g6_;
+  const ParamGenerator<T7> g7_;
+};  // class CartesianProductGenerator7
+
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8>
+class CartesianProductGenerator8
+    : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6,
+        T7, T8> > {
+ public:
+  typedef ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8> ParamType;
+
+  CartesianProductGenerator8(const ParamGenerator<T1>& g1,
+      const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,
+      const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5,
+      const ParamGenerator<T6>& g6, const ParamGenerator<T7>& g7,
+      const ParamGenerator<T8>& g8)
+      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7),
+          g8_(g8) {}
+  virtual ~CartesianProductGenerator8() {}
+
+  virtual ParamIteratorInterface<ParamType>* Begin() const {
+    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
+        g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin(), g6_, g6_.begin(), g7_,
+        g7_.begin(), g8_, g8_.begin());
+  }
+  virtual ParamIteratorInterface<ParamType>* End() const {
+    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),
+        g4_, g4_.end(), g5_, g5_.end(), g6_, g6_.end(), g7_, g7_.end(), g8_,
+        g8_.end());
+  }
+
+ private:
+  class Iterator : public ParamIteratorInterface<ParamType> {
+   public:
+    Iterator(const ParamGeneratorInterface<ParamType>* base,
+      const ParamGenerator<T1>& g1,
+      const typename ParamGenerator<T1>::iterator& current1,
+      const ParamGenerator<T2>& g2,
+      const typename ParamGenerator<T2>::iterator& current2,
+      const ParamGenerator<T3>& g3,
+      const typename ParamGenerator<T3>::iterator& current3,
+      const ParamGenerator<T4>& g4,
+      const typename ParamGenerator<T4>::iterator& current4,
+      const ParamGenerator<T5>& g5,
+      const typename ParamGenerator<T5>::iterator& current5,
+      const ParamGenerator<T6>& g6,
+      const typename ParamGenerator<T6>::iterator& current6,
+      const ParamGenerator<T7>& g7,
+      const typename ParamGenerator<T7>::iterator& current7,
+      const ParamGenerator<T8>& g8,
+      const typename ParamGenerator<T8>::iterator& current8)
+        : base_(base),
+          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
+          begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
+          begin3_(g3.begin()), end3_(g3.end()), current3_(current3),
+          begin4_(g4.begin()), end4_(g4.end()), current4_(current4),
+          begin5_(g5.begin()), end5_(g5.end()), current5_(current5),
+          begin6_(g6.begin()), end6_(g6.end()), current6_(current6),
+          begin7_(g7.begin()), end7_(g7.end()), current7_(current7),
+          begin8_(g8.begin()), end8_(g8.end()), current8_(current8)    {
+      ComputeCurrentValue();
+    }
+    virtual ~Iterator() {}
+
+    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
+      return base_;
+    }
+    // Advance should not be called on beyond-of-range iterators
+    // so no component iterators must be beyond end of range, either.
+    virtual void Advance() {
+      assert(!AtEnd());
+      ++current8_;
+      if (current8_ == end8_) {
+        current8_ = begin8_;
+        ++current7_;
+      }
+      if (current7_ == end7_) {
+        current7_ = begin7_;
+        ++current6_;
+      }
+      if (current6_ == end6_) {
+        current6_ = begin6_;
+        ++current5_;
+      }
+      if (current5_ == end5_) {
+        current5_ = begin5_;
+        ++current4_;
+      }
+      if (current4_ == end4_) {
+        current4_ = begin4_;
+        ++current3_;
+      }
+      if (current3_ == end3_) {
+        current3_ = begin3_;
+        ++current2_;
+      }
+      if (current2_ == end2_) {
+        current2_ = begin2_;
+        ++current1_;
+      }
+      ComputeCurrentValue();
+    }
+    virtual ParamIteratorInterface<ParamType>* Clone() const {
+      return new Iterator(*this);
+    }
+    virtual const ParamType* Current() const { return &current_value_; }
+    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
+      // Having the same base generator guarantees that the other
+      // iterator is of the same type and we can downcast.
+      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
+          << "The program attempted to compare iterators "
+          << "from different generators." << std::endl;
+      const Iterator* typed_other =
+          CheckedDowncastToActualType<const Iterator>(&other);
+      // We must report iterators equal if they both point beyond their
+      // respective ranges. That can happen in a variety of fashions,
+      // so we have to consult AtEnd().
+      return (AtEnd() && typed_other->AtEnd()) ||
+         (
+          current1_ == typed_other->current1_ &&
+          current2_ == typed_other->current2_ &&
+          current3_ == typed_other->current3_ &&
+          current4_ == typed_other->current4_ &&
+          current5_ == typed_other->current5_ &&
+          current6_ == typed_other->current6_ &&
+          current7_ == typed_other->current7_ &&
+          current8_ == typed_other->current8_);
+    }
+
+   private:
+    Iterator(const Iterator& other)
+        : base_(other.base_),
+        begin1_(other.begin1_),
+        end1_(other.end1_),
+        current1_(other.current1_),
+        begin2_(other.begin2_),
+        end2_(other.end2_),
+        current2_(other.current2_),
+        begin3_(other.begin3_),
+        end3_(other.end3_),
+        current3_(other.current3_),
+        begin4_(other.begin4_),
+        end4_(other.end4_),
+        current4_(other.current4_),
+        begin5_(other.begin5_),
+        end5_(other.end5_),
+        current5_(other.current5_),
+        begin6_(other.begin6_),
+        end6_(other.end6_),
+        current6_(other.current6_),
+        begin7_(other.begin7_),
+        end7_(other.end7_),
+        current7_(other.current7_),
+        begin8_(other.begin8_),
+        end8_(other.end8_),
+        current8_(other.current8_) {
+      ComputeCurrentValue();
+    }
+
+    void ComputeCurrentValue() {
+      if (!AtEnd())
+        current_value_ = ParamType(*current1_, *current2_, *current3_,
+            *current4_, *current5_, *current6_, *current7_, *current8_);
+    }
+    bool AtEnd() const {
+      // We must report iterator past the end of the range when either of the
+      // component iterators has reached the end of its range.
+      return
+          current1_ == end1_ ||
+          current2_ == end2_ ||
+          current3_ == end3_ ||
+          current4_ == end4_ ||
+          current5_ == end5_ ||
+          current6_ == end6_ ||
+          current7_ == end7_ ||
+          current8_ == end8_;
+    }
+
+    // No implementation - assignment is unsupported.
+    void operator=(const Iterator& other);
+
+    const ParamGeneratorInterface<ParamType>* const base_;
+    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
+    // current[i]_ is the actual traversing iterator.
+    const typename ParamGenerator<T1>::iterator begin1_;
+    const typename ParamGenerator<T1>::iterator end1_;
+    typename ParamGenerator<T1>::iterator current1_;
+    const typename ParamGenerator<T2>::iterator begin2_;
+    const typename ParamGenerator<T2>::iterator end2_;
+    typename ParamGenerator<T2>::iterator current2_;
+    const typename ParamGenerator<T3>::iterator begin3_;
+    const typename ParamGenerator<T3>::iterator end3_;
+    typename ParamGenerator<T3>::iterator current3_;
+    const typename ParamGenerator<T4>::iterator begin4_;
+    const typename ParamGenerator<T4>::iterator end4_;
+    typename ParamGenerator<T4>::iterator current4_;
+    const typename ParamGenerator<T5>::iterator begin5_;
+    const typename ParamGenerator<T5>::iterator end5_;
+    typename ParamGenerator<T5>::iterator current5_;
+    const typename ParamGenerator<T6>::iterator begin6_;
+    const typename ParamGenerator<T6>::iterator end6_;
+    typename ParamGenerator<T6>::iterator current6_;
+    const typename ParamGenerator<T7>::iterator begin7_;
+    const typename ParamGenerator<T7>::iterator end7_;
+    typename ParamGenerator<T7>::iterator current7_;
+    const typename ParamGenerator<T8>::iterator begin8_;
+    const typename ParamGenerator<T8>::iterator end8_;
+    typename ParamGenerator<T8>::iterator current8_;
+    ParamType current_value_;
+  };  // class CartesianProductGenerator8::Iterator
+
+  // No implementation - assignment is unsupported.
+  void operator=(const CartesianProductGenerator8& other);
+
+  const ParamGenerator<T1> g1_;
+  const ParamGenerator<T2> g2_;
+  const ParamGenerator<T3> g3_;
+  const ParamGenerator<T4> g4_;
+  const ParamGenerator<T5> g5_;
+  const ParamGenerator<T6> g6_;
+  const ParamGenerator<T7> g7_;
+  const ParamGenerator<T8> g8_;
+};  // class CartesianProductGenerator8
+
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9>
+class CartesianProductGenerator9
+    : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6,
+        T7, T8, T9> > {
+ public:
+  typedef ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8, T9> ParamType;
+
+  CartesianProductGenerator9(const ParamGenerator<T1>& g1,
+      const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,
+      const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5,
+      const ParamGenerator<T6>& g6, const ParamGenerator<T7>& g7,
+      const ParamGenerator<T8>& g8, const ParamGenerator<T9>& g9)
+      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7), g8_(g8),
+          g9_(g9) {}
+  virtual ~CartesianProductGenerator9() {}
+
+  virtual ParamIteratorInterface<ParamType>* Begin() const {
+    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
+        g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin(), g6_, g6_.begin(), g7_,
+        g7_.begin(), g8_, g8_.begin(), g9_, g9_.begin());
+  }
+  virtual ParamIteratorInterface<ParamType>* End() const {
+    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),
+        g4_, g4_.end(), g5_, g5_.end(), g6_, g6_.end(), g7_, g7_.end(), g8_,
+        g8_.end(), g9_, g9_.end());
+  }
+
+ private:
+  class Iterator : public ParamIteratorInterface<ParamType> {
+   public:
+    Iterator(const ParamGeneratorInterface<ParamType>* base,
+      const ParamGenerator<T1>& g1,
+      const typename ParamGenerator<T1>::iterator& current1,
+      const ParamGenerator<T2>& g2,
+      const typename ParamGenerator<T2>::iterator& current2,
+      const ParamGenerator<T3>& g3,
+      const typename ParamGenerator<T3>::iterator& current3,
+      const ParamGenerator<T4>& g4,
+      const typename ParamGenerator<T4>::iterator& current4,
+      const ParamGenerator<T5>& g5,
+      const typename ParamGenerator<T5>::iterator& current5,
+      const ParamGenerator<T6>& g6,
+      const typename ParamGenerator<T6>::iterator& current6,
+      const ParamGenerator<T7>& g7,
+      const typename ParamGenerator<T7>::iterator& current7,
+      const ParamGenerator<T8>& g8,
+      const typename ParamGenerator<T8>::iterator& current8,
+      const ParamGenerator<T9>& g9,
+      const typename ParamGenerator<T9>::iterator& current9)
+        : base_(base),
+          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
+          begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
+          begin3_(g3.begin()), end3_(g3.end()), current3_(current3),
+          begin4_(g4.begin()), end4_(g4.end()), current4_(current4),
+          begin5_(g5.begin()), end5_(g5.end()), current5_(current5),
+          begin6_(g6.begin()), end6_(g6.end()), current6_(current6),
+          begin7_(g7.begin()), end7_(g7.end()), current7_(current7),
+          begin8_(g8.begin()), end8_(g8.end()), current8_(current8),
+          begin9_(g9.begin()), end9_(g9.end()), current9_(current9)    {
+      ComputeCurrentValue();
+    }
+    virtual ~Iterator() {}
+
+    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
+      return base_;
+    }
+    // Advance should not be called on beyond-of-range iterators
+    // so no component iterators must be beyond end of range, either.
+    virtual void Advance() {
+      assert(!AtEnd());
+      ++current9_;
+      if (current9_ == end9_) {
+        current9_ = begin9_;
+        ++current8_;
+      }
+      if (current8_ == end8_) {
+        current8_ = begin8_;
+        ++current7_;
+      }
+      if (current7_ == end7_) {
+        current7_ = begin7_;
+        ++current6_;
+      }
+      if (current6_ == end6_) {
+        current6_ = begin6_;
+        ++current5_;
+      }
+      if (current5_ == end5_) {
+        current5_ = begin5_;
+        ++current4_;
+      }
+      if (current4_ == end4_) {
+        current4_ = begin4_;
+        ++current3_;
+      }
+      if (current3_ == end3_) {
+        current3_ = begin3_;
+        ++current2_;
+      }
+      if (current2_ == end2_) {
+        current2_ = begin2_;
+        ++current1_;
+      }
+      ComputeCurrentValue();
+    }
+    virtual ParamIteratorInterface<ParamType>* Clone() const {
+      return new Iterator(*this);
+    }
+    virtual const ParamType* Current() const { return &current_value_; }
+    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
+      // Having the same base generator guarantees that the other
+      // iterator is of the same type and we can downcast.
+      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
+          << "The program attempted to compare iterators "
+          << "from different generators." << std::endl;
+      const Iterator* typed_other =
+          CheckedDowncastToActualType<const Iterator>(&other);
+      // We must report iterators equal if they both point beyond their
+      // respective ranges. That can happen in a variety of fashions,
+      // so we have to consult AtEnd().
+      return (AtEnd() && typed_other->AtEnd()) ||
+         (
+          current1_ == typed_other->current1_ &&
+          current2_ == typed_other->current2_ &&
+          current3_ == typed_other->current3_ &&
+          current4_ == typed_other->current4_ &&
+          current5_ == typed_other->current5_ &&
+          current6_ == typed_other->current6_ &&
+          current7_ == typed_other->current7_ &&
+          current8_ == typed_other->current8_ &&
+          current9_ == typed_other->current9_);
+    }
+
+   private:
+    Iterator(const Iterator& other)
+        : base_(other.base_),
+        begin1_(other.begin1_),
+        end1_(other.end1_),
+        current1_(other.current1_),
+        begin2_(other.begin2_),
+        end2_(other.end2_),
+        current2_(other.current2_),
+        begin3_(other.begin3_),
+        end3_(other.end3_),
+        current3_(other.current3_),
+        begin4_(other.begin4_),
+        end4_(other.end4_),
+        current4_(other.current4_),
+        begin5_(other.begin5_),
+        end5_(other.end5_),
+        current5_(other.current5_),
+        begin6_(other.begin6_),
+        end6_(other.end6_),
+        current6_(other.current6_),
+        begin7_(other.begin7_),
+        end7_(other.end7_),
+        current7_(other.current7_),
+        begin8_(other.begin8_),
+        end8_(other.end8_),
+        current8_(other.current8_),
+        begin9_(other.begin9_),
+        end9_(other.end9_),
+        current9_(other.current9_) {
+      ComputeCurrentValue();
+    }
+
+    void ComputeCurrentValue() {
+      if (!AtEnd())
+        current_value_ = ParamType(*current1_, *current2_, *current3_,
+            *current4_, *current5_, *current6_, *current7_, *current8_,
+            *current9_);
+    }
+    bool AtEnd() const {
+      // We must report iterator past the end of the range when either of the
+      // component iterators has reached the end of its range.
+      return
+          current1_ == end1_ ||
+          current2_ == end2_ ||
+          current3_ == end3_ ||
+          current4_ == end4_ ||
+          current5_ == end5_ ||
+          current6_ == end6_ ||
+          current7_ == end7_ ||
+          current8_ == end8_ ||
+          current9_ == end9_;
+    }
+
+    // No implementation - assignment is unsupported.
+    void operator=(const Iterator& other);
+
+    const ParamGeneratorInterface<ParamType>* const base_;
+    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
+    // current[i]_ is the actual traversing iterator.
+    const typename ParamGenerator<T1>::iterator begin1_;
+    const typename ParamGenerator<T1>::iterator end1_;
+    typename ParamGenerator<T1>::iterator current1_;
+    const typename ParamGenerator<T2>::iterator begin2_;
+    const typename ParamGenerator<T2>::iterator end2_;
+    typename ParamGenerator<T2>::iterator current2_;
+    const typename ParamGenerator<T3>::iterator begin3_;
+    const typename ParamGenerator<T3>::iterator end3_;
+    typename ParamGenerator<T3>::iterator current3_;
+    const typename ParamGenerator<T4>::iterator begin4_;
+    const typename ParamGenerator<T4>::iterator end4_;
+    typename ParamGenerator<T4>::iterator current4_;
+    const typename ParamGenerator<T5>::iterator begin5_;
+    const typename ParamGenerator<T5>::iterator end5_;
+    typename ParamGenerator<T5>::iterator current5_;
+    const typename ParamGenerator<T6>::iterator begin6_;
+    const typename ParamGenerator<T6>::iterator end6_;
+    typename ParamGenerator<T6>::iterator current6_;
+    const typename ParamGenerator<T7>::iterator begin7_;
+    const typename ParamGenerator<T7>::iterator end7_;
+    typename ParamGenerator<T7>::iterator current7_;
+    const typename ParamGenerator<T8>::iterator begin8_;
+    const typename ParamGenerator<T8>::iterator end8_;
+    typename ParamGenerator<T8>::iterator current8_;
+    const typename ParamGenerator<T9>::iterator begin9_;
+    const typename ParamGenerator<T9>::iterator end9_;
+    typename ParamGenerator<T9>::iterator current9_;
+    ParamType current_value_;
+  };  // class CartesianProductGenerator9::Iterator
+
+  // No implementation - assignment is unsupported.
+  void operator=(const CartesianProductGenerator9& other);
+
+  const ParamGenerator<T1> g1_;
+  const ParamGenerator<T2> g2_;
+  const ParamGenerator<T3> g3_;
+  const ParamGenerator<T4> g4_;
+  const ParamGenerator<T5> g5_;
+  const ParamGenerator<T6> g6_;
+  const ParamGenerator<T7> g7_;
+  const ParamGenerator<T8> g8_;
+  const ParamGenerator<T9> g9_;
+};  // class CartesianProductGenerator9
+
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10>
+class CartesianProductGenerator10
+    : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6,
+        T7, T8, T9, T10> > {
+ public:
+  typedef ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> ParamType;
+
+  CartesianProductGenerator10(const ParamGenerator<T1>& g1,
+      const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,
+      const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5,
+      const ParamGenerator<T6>& g6, const ParamGenerator<T7>& g7,
+      const ParamGenerator<T8>& g8, const ParamGenerator<T9>& g9,
+      const ParamGenerator<T10>& g10)
+      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7), g8_(g8),
+          g9_(g9), g10_(g10) {}
+  virtual ~CartesianProductGenerator10() {}
+
+  virtual ParamIteratorInterface<ParamType>* Begin() const {
+    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
+        g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin(), g6_, g6_.begin(), g7_,
+        g7_.begin(), g8_, g8_.begin(), g9_, g9_.begin(), g10_, g10_.begin());
+  }
+  virtual ParamIteratorInterface<ParamType>* End() const {
+    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),
+        g4_, g4_.end(), g5_, g5_.end(), g6_, g6_.end(), g7_, g7_.end(), g8_,
+        g8_.end(), g9_, g9_.end(), g10_, g10_.end());
+  }
+
+ private:
+  class Iterator : public ParamIteratorInterface<ParamType> {
+   public:
+    Iterator(const ParamGeneratorInterface<ParamType>* base,
+      const ParamGenerator<T1>& g1,
+      const typename ParamGenerator<T1>::iterator& current1,
+      const ParamGenerator<T2>& g2,
+      const typename ParamGenerator<T2>::iterator& current2,
+      const ParamGenerator<T3>& g3,
+      const typename ParamGenerator<T3>::iterator& current3,
+      const ParamGenerator<T4>& g4,
+      const typename ParamGenerator<T4>::iterator& current4,
+      const ParamGenerator<T5>& g5,
+      const typename ParamGenerator<T5>::iterator& current5,
+      const ParamGenerator<T6>& g6,
+      const typename ParamGenerator<T6>::iterator& current6,
+      const ParamGenerator<T7>& g7,
+      const typename ParamGenerator<T7>::iterator& current7,
+      const ParamGenerator<T8>& g8,
+      const typename ParamGenerator<T8>::iterator& current8,
+      const ParamGenerator<T9>& g9,
+      const typename ParamGenerator<T9>::iterator& current9,
+      const ParamGenerator<T10>& g10,
+      const typename ParamGenerator<T10>::iterator& current10)
+        : base_(base),
+          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
+          begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
+          begin3_(g3.begin()), end3_(g3.end()), current3_(current3),
+          begin4_(g4.begin()), end4_(g4.end()), current4_(current4),
+          begin5_(g5.begin()), end5_(g5.end()), current5_(current5),
+          begin6_(g6.begin()), end6_(g6.end()), current6_(current6),
+          begin7_(g7.begin()), end7_(g7.end()), current7_(current7),
+          begin8_(g8.begin()), end8_(g8.end()), current8_(current8),
+          begin9_(g9.begin()), end9_(g9.end()), current9_(current9),
+          begin10_(g10.begin()), end10_(g10.end()), current10_(current10)    {
+      ComputeCurrentValue();
+    }
+    virtual ~Iterator() {}
+
+    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
+      return base_;
+    }
+    // Advance should not be called on beyond-of-range iterators
+    // so no component iterators must be beyond end of range, either.
+    virtual void Advance() {
+      assert(!AtEnd());
+      ++current10_;
+      if (current10_ == end10_) {
+        current10_ = begin10_;
+        ++current9_;
+      }
+      if (current9_ == end9_) {
+        current9_ = begin9_;
+        ++current8_;
+      }
+      if (current8_ == end8_) {
+        current8_ = begin8_;
+        ++current7_;
+      }
+      if (current7_ == end7_) {
+        current7_ = begin7_;
+        ++current6_;
+      }
+      if (current6_ == end6_) {
+        current6_ = begin6_;
+        ++current5_;
+      }
+      if (current5_ == end5_) {
+        current5_ = begin5_;
+        ++current4_;
+      }
+      if (current4_ == end4_) {
+        current4_ = begin4_;
+        ++current3_;
+      }
+      if (current3_ == end3_) {
+        current3_ = begin3_;
+        ++current2_;
+      }
+      if (current2_ == end2_) {
+        current2_ = begin2_;
+        ++current1_;
+      }
+      ComputeCurrentValue();
+    }
+    virtual ParamIteratorInterface<ParamType>* Clone() const {
+      return new Iterator(*this);
+    }
+    virtual const ParamType* Current() const { return &current_value_; }
+    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
+      // Having the same base generator guarantees that the other
+      // iterator is of the same type and we can downcast.
+      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
+          << "The program attempted to compare iterators "
+          << "from different generators." << std::endl;
+      const Iterator* typed_other =
+          CheckedDowncastToActualType<const Iterator>(&other);
+      // We must report iterators equal if they both point beyond their
+      // respective ranges. That can happen in a variety of fashions,
+      // so we have to consult AtEnd().
+      return (AtEnd() && typed_other->AtEnd()) ||
+         (
+          current1_ == typed_other->current1_ &&
+          current2_ == typed_other->current2_ &&
+          current3_ == typed_other->current3_ &&
+          current4_ == typed_other->current4_ &&
+          current5_ == typed_other->current5_ &&
+          current6_ == typed_other->current6_ &&
+          current7_ == typed_other->current7_ &&
+          current8_ == typed_other->current8_ &&
+          current9_ == typed_other->current9_ &&
+          current10_ == typed_other->current10_);
+    }
+
+   private:
+    Iterator(const Iterator& other)
+        : base_(other.base_),
+        begin1_(other.begin1_),
+        end1_(other.end1_),
+        current1_(other.current1_),
+        begin2_(other.begin2_),
+        end2_(other.end2_),
+        current2_(other.current2_),
+        begin3_(other.begin3_),
+        end3_(other.end3_),
+        current3_(other.current3_),
+        begin4_(other.begin4_),
+        end4_(other.end4_),
+        current4_(other.current4_),
+        begin5_(other.begin5_),
+        end5_(other.end5_),
+        current5_(other.current5_),
+        begin6_(other.begin6_),
+        end6_(other.end6_),
+        current6_(other.current6_),
+        begin7_(other.begin7_),
+        end7_(other.end7_),
+        current7_(other.current7_),
+        begin8_(other.begin8_),
+        end8_(other.end8_),
+        current8_(other.current8_),
+        begin9_(other.begin9_),
+        end9_(other.end9_),
+        current9_(other.current9_),
+        begin10_(other.begin10_),
+        end10_(other.end10_),
+        current10_(other.current10_) {
+      ComputeCurrentValue();
+    }
+
+    void ComputeCurrentValue() {
+      if (!AtEnd())
+        current_value_ = ParamType(*current1_, *current2_, *current3_,
+            *current4_, *current5_, *current6_, *current7_, *current8_,
+            *current9_, *current10_);
+    }
+    bool AtEnd() const {
+      // We must report iterator past the end of the range when either of the
+      // component iterators has reached the end of its range.
+      return
+          current1_ == end1_ ||
+          current2_ == end2_ ||
+          current3_ == end3_ ||
+          current4_ == end4_ ||
+          current5_ == end5_ ||
+          current6_ == end6_ ||
+          current7_ == end7_ ||
+          current8_ == end8_ ||
+          current9_ == end9_ ||
+          current10_ == end10_;
+    }
+
+    // No implementation - assignment is unsupported.
+    void operator=(const Iterator& other);
+
+    const ParamGeneratorInterface<ParamType>* const base_;
+    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
+    // current[i]_ is the actual traversing iterator.
+    const typename ParamGenerator<T1>::iterator begin1_;
+    const typename ParamGenerator<T1>::iterator end1_;
+    typename ParamGenerator<T1>::iterator current1_;
+    const typename ParamGenerator<T2>::iterator begin2_;
+    const typename ParamGenerator<T2>::iterator end2_;
+    typename ParamGenerator<T2>::iterator current2_;
+    const typename ParamGenerator<T3>::iterator begin3_;
+    const typename ParamGenerator<T3>::iterator end3_;
+    typename ParamGenerator<T3>::iterator current3_;
+    const typename ParamGenerator<T4>::iterator begin4_;
+    const typename ParamGenerator<T4>::iterator end4_;
+    typename ParamGenerator<T4>::iterator current4_;
+    const typename ParamGenerator<T5>::iterator begin5_;
+    const typename ParamGenerator<T5>::iterator end5_;
+    typename ParamGenerator<T5>::iterator current5_;
+    const typename ParamGenerator<T6>::iterator begin6_;
+    const typename ParamGenerator<T6>::iterator end6_;
+    typename ParamGenerator<T6>::iterator current6_;
+    const typename ParamGenerator<T7>::iterator begin7_;
+    const typename ParamGenerator<T7>::iterator end7_;
+    typename ParamGenerator<T7>::iterator current7_;
+    const typename ParamGenerator<T8>::iterator begin8_;
+    const typename ParamGenerator<T8>::iterator end8_;
+    typename ParamGenerator<T8>::iterator current8_;
+    const typename ParamGenerator<T9>::iterator begin9_;
+    const typename ParamGenerator<T9>::iterator end9_;
+    typename ParamGenerator<T9>::iterator current9_;
+    const typename ParamGenerator<T10>::iterator begin10_;
+    const typename ParamGenerator<T10>::iterator end10_;
+    typename ParamGenerator<T10>::iterator current10_;
+    ParamType current_value_;
+  };  // class CartesianProductGenerator10::Iterator
+
+  // No implementation - assignment is unsupported.
+  void operator=(const CartesianProductGenerator10& other);
+
+  const ParamGenerator<T1> g1_;
+  const ParamGenerator<T2> g2_;
+  const ParamGenerator<T3> g3_;
+  const ParamGenerator<T4> g4_;
+  const ParamGenerator<T5> g5_;
+  const ParamGenerator<T6> g6_;
+  const ParamGenerator<T7> g7_;
+  const ParamGenerator<T8> g8_;
+  const ParamGenerator<T9> g9_;
+  const ParamGenerator<T10> g10_;
+};  // class CartesianProductGenerator10
+
+
+// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
+//
+// Helper classes providing Combine() with polymorphic features. They allow
+// casting CartesianProductGeneratorN<T> to ParamGenerator<U> if T is
+// convertible to U.
+//
+template <class Generator1, class Generator2>
+class CartesianProductHolder2 {
+ public:
+CartesianProductHolder2(const Generator1& g1, const Generator2& g2)
+      : g1_(g1), g2_(g2) {}
+  template <typename T1, typename T2>
+  operator ParamGenerator< ::std::tr1::tuple<T1, T2> >() const {
+    return ParamGenerator< ::std::tr1::tuple<T1, T2> >(
+        new CartesianProductGenerator2<T1, T2>(
+        static_cast<ParamGenerator<T1> >(g1_),
+        static_cast<ParamGenerator<T2> >(g2_)));
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const CartesianProductHolder2& other);
+
+  const Generator1 g1_;
+  const Generator2 g2_;
+};  // class CartesianProductHolder2
+
+template <class Generator1, class Generator2, class Generator3>
+class CartesianProductHolder3 {
+ public:
+CartesianProductHolder3(const Generator1& g1, const Generator2& g2,
+    const Generator3& g3)
+      : g1_(g1), g2_(g2), g3_(g3) {}
+  template <typename T1, typename T2, typename T3>
+  operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3> >() const {
+    return ParamGenerator< ::std::tr1::tuple<T1, T2, T3> >(
+        new CartesianProductGenerator3<T1, T2, T3>(
+        static_cast<ParamGenerator<T1> >(g1_),
+        static_cast<ParamGenerator<T2> >(g2_),
+        static_cast<ParamGenerator<T3> >(g3_)));
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const CartesianProductHolder3& other);
+
+  const Generator1 g1_;
+  const Generator2 g2_;
+  const Generator3 g3_;
+};  // class CartesianProductHolder3
+
+template <class Generator1, class Generator2, class Generator3,
+    class Generator4>
+class CartesianProductHolder4 {
+ public:
+CartesianProductHolder4(const Generator1& g1, const Generator2& g2,
+    const Generator3& g3, const Generator4& g4)
+      : g1_(g1), g2_(g2), g3_(g3), g4_(g4) {}
+  template <typename T1, typename T2, typename T3, typename T4>
+  operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4> >() const {
+    return ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4> >(
+        new CartesianProductGenerator4<T1, T2, T3, T4>(
+        static_cast<ParamGenerator<T1> >(g1_),
+        static_cast<ParamGenerator<T2> >(g2_),
+        static_cast<ParamGenerator<T3> >(g3_),
+        static_cast<ParamGenerator<T4> >(g4_)));
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const CartesianProductHolder4& other);
+
+  const Generator1 g1_;
+  const Generator2 g2_;
+  const Generator3 g3_;
+  const Generator4 g4_;
+};  // class CartesianProductHolder4
+
+template <class Generator1, class Generator2, class Generator3,
+    class Generator4, class Generator5>
+class CartesianProductHolder5 {
+ public:
+CartesianProductHolder5(const Generator1& g1, const Generator2& g2,
+    const Generator3& g3, const Generator4& g4, const Generator5& g5)
+      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5) {}
+  template <typename T1, typename T2, typename T3, typename T4, typename T5>
+  operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5> >() const {
+    return ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5> >(
+        new CartesianProductGenerator5<T1, T2, T3, T4, T5>(
+        static_cast<ParamGenerator<T1> >(g1_),
+        static_cast<ParamGenerator<T2> >(g2_),
+        static_cast<ParamGenerator<T3> >(g3_),
+        static_cast<ParamGenerator<T4> >(g4_),
+        static_cast<ParamGenerator<T5> >(g5_)));
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const CartesianProductHolder5& other);
+
+  const Generator1 g1_;
+  const Generator2 g2_;
+  const Generator3 g3_;
+  const Generator4 g4_;
+  const Generator5 g5_;
+};  // class CartesianProductHolder5
+
+template <class Generator1, class Generator2, class Generator3,
+    class Generator4, class Generator5, class Generator6>
+class CartesianProductHolder6 {
+ public:
+CartesianProductHolder6(const Generator1& g1, const Generator2& g2,
+    const Generator3& g3, const Generator4& g4, const Generator5& g5,
+    const Generator6& g6)
+      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6) {}
+  template <typename T1, typename T2, typename T3, typename T4, typename T5,
+      typename T6>
+  operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6> >() const {
+    return ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6> >(
+        new CartesianProductGenerator6<T1, T2, T3, T4, T5, T6>(
+        static_cast<ParamGenerator<T1> >(g1_),
+        static_cast<ParamGenerator<T2> >(g2_),
+        static_cast<ParamGenerator<T3> >(g3_),
+        static_cast<ParamGenerator<T4> >(g4_),
+        static_cast<ParamGenerator<T5> >(g5_),
+        static_cast<ParamGenerator<T6> >(g6_)));
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const CartesianProductHolder6& other);
+
+  const Generator1 g1_;
+  const Generator2 g2_;
+  const Generator3 g3_;
+  const Generator4 g4_;
+  const Generator5 g5_;
+  const Generator6 g6_;
+};  // class CartesianProductHolder6
+
+template <class Generator1, class Generator2, class Generator3,
+    class Generator4, class Generator5, class Generator6, class Generator7>
+class CartesianProductHolder7 {
+ public:
+CartesianProductHolder7(const Generator1& g1, const Generator2& g2,
+    const Generator3& g3, const Generator4& g4, const Generator5& g5,
+    const Generator6& g6, const Generator7& g7)
+      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7) {}
+  template <typename T1, typename T2, typename T3, typename T4, typename T5,
+      typename T6, typename T7>
+  operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6,
+      T7> >() const {
+    return ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7> >(
+        new CartesianProductGenerator7<T1, T2, T3, T4, T5, T6, T7>(
+        static_cast<ParamGenerator<T1> >(g1_),
+        static_cast<ParamGenerator<T2> >(g2_),
+        static_cast<ParamGenerator<T3> >(g3_),
+        static_cast<ParamGenerator<T4> >(g4_),
+        static_cast<ParamGenerator<T5> >(g5_),
+        static_cast<ParamGenerator<T6> >(g6_),
+        static_cast<ParamGenerator<T7> >(g7_)));
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const CartesianProductHolder7& other);
+
+  const Generator1 g1_;
+  const Generator2 g2_;
+  const Generator3 g3_;
+  const Generator4 g4_;
+  const Generator5 g5_;
+  const Generator6 g6_;
+  const Generator7 g7_;
+};  // class CartesianProductHolder7
+
+template <class Generator1, class Generator2, class Generator3,
+    class Generator4, class Generator5, class Generator6, class Generator7,
+    class Generator8>
+class CartesianProductHolder8 {
+ public:
+CartesianProductHolder8(const Generator1& g1, const Generator2& g2,
+    const Generator3& g3, const Generator4& g4, const Generator5& g5,
+    const Generator6& g6, const Generator7& g7, const Generator8& g8)
+      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7),
+          g8_(g8) {}
+  template <typename T1, typename T2, typename T3, typename T4, typename T5,
+      typename T6, typename T7, typename T8>
+  operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7,
+      T8> >() const {
+    return ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8> >(
+        new CartesianProductGenerator8<T1, T2, T3, T4, T5, T6, T7, T8>(
+        static_cast<ParamGenerator<T1> >(g1_),
+        static_cast<ParamGenerator<T2> >(g2_),
+        static_cast<ParamGenerator<T3> >(g3_),
+        static_cast<ParamGenerator<T4> >(g4_),
+        static_cast<ParamGenerator<T5> >(g5_),
+        static_cast<ParamGenerator<T6> >(g6_),
+        static_cast<ParamGenerator<T7> >(g7_),
+        static_cast<ParamGenerator<T8> >(g8_)));
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const CartesianProductHolder8& other);
+
+  const Generator1 g1_;
+  const Generator2 g2_;
+  const Generator3 g3_;
+  const Generator4 g4_;
+  const Generator5 g5_;
+  const Generator6 g6_;
+  const Generator7 g7_;
+  const Generator8 g8_;
+};  // class CartesianProductHolder8
+
+template <class Generator1, class Generator2, class Generator3,
+    class Generator4, class Generator5, class Generator6, class Generator7,
+    class Generator8, class Generator9>
+class CartesianProductHolder9 {
+ public:
+CartesianProductHolder9(const Generator1& g1, const Generator2& g2,
+    const Generator3& g3, const Generator4& g4, const Generator5& g5,
+    const Generator6& g6, const Generator7& g7, const Generator8& g8,
+    const Generator9& g9)
+      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7), g8_(g8),
+          g9_(g9) {}
+  template <typename T1, typename T2, typename T3, typename T4, typename T5,
+      typename T6, typename T7, typename T8, typename T9>
+  operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8,
+      T9> >() const {
+    return ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8,
+        T9> >(
+        new CartesianProductGenerator9<T1, T2, T3, T4, T5, T6, T7, T8, T9>(
+        static_cast<ParamGenerator<T1> >(g1_),
+        static_cast<ParamGenerator<T2> >(g2_),
+        static_cast<ParamGenerator<T3> >(g3_),
+        static_cast<ParamGenerator<T4> >(g4_),
+        static_cast<ParamGenerator<T5> >(g5_),
+        static_cast<ParamGenerator<T6> >(g6_),
+        static_cast<ParamGenerator<T7> >(g7_),
+        static_cast<ParamGenerator<T8> >(g8_),
+        static_cast<ParamGenerator<T9> >(g9_)));
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const CartesianProductHolder9& other);
+
+  const Generator1 g1_;
+  const Generator2 g2_;
+  const Generator3 g3_;
+  const Generator4 g4_;
+  const Generator5 g5_;
+  const Generator6 g6_;
+  const Generator7 g7_;
+  const Generator8 g8_;
+  const Generator9 g9_;
+};  // class CartesianProductHolder9
+
+template <class Generator1, class Generator2, class Generator3,
+    class Generator4, class Generator5, class Generator6, class Generator7,
+    class Generator8, class Generator9, class Generator10>
+class CartesianProductHolder10 {
+ public:
+CartesianProductHolder10(const Generator1& g1, const Generator2& g2,
+    const Generator3& g3, const Generator4& g4, const Generator5& g5,
+    const Generator6& g6, const Generator7& g7, const Generator8& g8,
+    const Generator9& g9, const Generator10& g10)
+      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7), g8_(g8),
+          g9_(g9), g10_(g10) {}
+  template <typename T1, typename T2, typename T3, typename T4, typename T5,
+      typename T6, typename T7, typename T8, typename T9, typename T10>
+  operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8,
+      T9, T10> >() const {
+    return ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8,
+        T9, T10> >(
+        new CartesianProductGenerator10<T1, T2, T3, T4, T5, T6, T7, T8, T9,
+            T10>(
+        static_cast<ParamGenerator<T1> >(g1_),
+        static_cast<ParamGenerator<T2> >(g2_),
+        static_cast<ParamGenerator<T3> >(g3_),
+        static_cast<ParamGenerator<T4> >(g4_),
+        static_cast<ParamGenerator<T5> >(g5_),
+        static_cast<ParamGenerator<T6> >(g6_),
+        static_cast<ParamGenerator<T7> >(g7_),
+        static_cast<ParamGenerator<T8> >(g8_),
+        static_cast<ParamGenerator<T9> >(g9_),
+        static_cast<ParamGenerator<T10> >(g10_)));
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const CartesianProductHolder10& other);
+
+  const Generator1 g1_;
+  const Generator2 g2_;
+  const Generator3 g3_;
+  const Generator4 g4_;
+  const Generator5 g5_;
+  const Generator6 g6_;
+  const Generator7 g7_;
+  const Generator8 g8_;
+  const Generator9 g9_;
+  const Generator10 g10_;
+};  // class CartesianProductHolder10
+
+# endif  // GTEST_HAS_COMBINE
+
+}  // namespace internal
+}  // namespace testing
+
+#endif  //  GTEST_HAS_PARAM_TEST
+
+#endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_GENERATED_H_
+
+#if GTEST_HAS_PARAM_TEST
+
+namespace testing {
+
+// Functions producing parameter generators.
+//
+// Google Test uses these generators to produce parameters for value-
+// parameterized tests. When a parameterized test case is instantiated
+// with a particular generator, Google Test creates and runs tests
+// for each element in the sequence produced by the generator.
+//
+// In the following sample, tests from test case FooTest are instantiated
+// each three times with parameter values 3, 5, and 8:
+//
+// class FooTest : public TestWithParam<int> { ... };
+//
+// TEST_P(FooTest, TestThis) {
+// }
+// TEST_P(FooTest, TestThat) {
+// }
+// INSTANTIATE_TEST_CASE_P(TestSequence, FooTest, Values(3, 5, 8));
+//
+
+// Range() returns generators providing sequences of values in a range.
+//
+// Synopsis:
+// Range(start, end)
+//   - returns a generator producing a sequence of values {start, start+1,
+//     start+2, ..., }.
+// Range(start, end, step)
+//   - returns a generator producing a sequence of values {start, start+step,
+//     start+step+step, ..., }.
+// Notes:
+//   * The generated sequences never include end. For example, Range(1, 5)
+//     returns a generator producing a sequence {1, 2, 3, 4}. Range(1, 9, 2)
+//     returns a generator producing {1, 3, 5, 7}.
+//   * start and end must have the same type. That type may be any integral or
+//     floating-point type or a user defined type satisfying these conditions:
+//     * It must be assignable (have operator=() defined).
+//     * It must have operator+() (operator+(int-compatible type) for
+//       two-operand version).
+//     * It must have operator<() defined.
+//     Elements in the resulting sequences will also have that type.
+//   * Condition start < end must be satisfied in order for resulting sequences
+//     to contain any elements.
+//
+template <typename T, typename IncrementT>
+internal::ParamGenerator<T> Range(T start, T end, IncrementT step) {
+  return internal::ParamGenerator<T>(
+      new internal::RangeGenerator<T, IncrementT>(start, end, step));
+}
+
+template <typename T>
+internal::ParamGenerator<T> Range(T start, T end) {
+  return Range(start, end, 1);
+}
+
+// ValuesIn() function allows generation of tests with parameters coming from
+// a container.
+//
+// Synopsis:
+// ValuesIn(const T (&array)[N])
+//   - returns a generator producing sequences with elements from
+//     a C-style array.
+// ValuesIn(const Container& container)
+//   - returns a generator producing sequences with elements from
+//     an STL-style container.
+// ValuesIn(Iterator begin, Iterator end)
+//   - returns a generator producing sequences with elements from
+//     a range [begin, end) defined by a pair of STL-style iterators. These
+//     iterators can also be plain C pointers.
+//
+// Please note that ValuesIn copies the values from the containers
+// passed in and keeps them to generate tests in RUN_ALL_TESTS().
+//
+// Examples:
+//
+// This instantiates tests from test case StringTest
+// each with C-string values of "foo", "bar", and "baz":
+//
+// const char* strings[] = {"foo", "bar", "baz"};
+// INSTANTIATE_TEST_CASE_P(StringSequence, SrtingTest, ValuesIn(strings));
+//
+// This instantiates tests from test case StlStringTest
+// each with STL strings with values "a" and "b":
+//
+// ::std::vector< ::std::string> GetParameterStrings() {
+//   ::std::vector< ::std::string> v;
+//   v.push_back("a");
+//   v.push_back("b");
+//   return v;
+// }
+//
+// INSTANTIATE_TEST_CASE_P(CharSequence,
+//                         StlStringTest,
+//                         ValuesIn(GetParameterStrings()));
+//
+//
+// This will also instantiate tests from CharTest
+// each with parameter values 'a' and 'b':
+//
+// ::std::list<char> GetParameterChars() {
+//   ::std::list<char> list;
+//   list.push_back('a');
+//   list.push_back('b');
+//   return list;
+// }
+// ::std::list<char> l = GetParameterChars();
+// INSTANTIATE_TEST_CASE_P(CharSequence2,
+//                         CharTest,
+//                         ValuesIn(l.begin(), l.end()));
+//
+template <typename ForwardIterator>
+internal::ParamGenerator<
+  typename ::testing::internal::IteratorTraits<ForwardIterator>::value_type>
+ValuesIn(ForwardIterator begin, ForwardIterator end) {
+  typedef typename ::testing::internal::IteratorTraits<ForwardIterator>
+      ::value_type ParamType;
+  return internal::ParamGenerator<ParamType>(
+      new internal::ValuesInIteratorRangeGenerator<ParamType>(begin, end));
+}
+
+template <typename T, size_t N>
+internal::ParamGenerator<T> ValuesIn(const T (&array)[N]) {
+  return ValuesIn(array, array + N);
+}
+
+template <class Container>
+internal::ParamGenerator<typename Container::value_type> ValuesIn(
+    const Container& container) {
+  return ValuesIn(container.begin(), container.end());
+}
+
+// Values() allows generating tests from explicitly specified list of
+// parameters.
+//
+// Synopsis:
+// Values(T v1, T v2, ..., T vN)
+//   - returns a generator producing sequences with elements v1, v2, ..., vN.
+//
+// For example, this instantiates tests from test case BarTest each
+// with values "one", "two", and "three":
+//
+// INSTANTIATE_TEST_CASE_P(NumSequence, BarTest, Values("one", "two", "three"));
+//
+// This instantiates tests from test case BazTest each with values 1, 2, 3.5.
+// The exact type of values will depend on the type of parameter in BazTest.
+//
+// INSTANTIATE_TEST_CASE_P(FloatingNumbers, BazTest, Values(1, 2, 3.5));
+//
+// Currently, Values() supports from 1 to 50 parameters.
+//
+template <typename T1>
+internal::ValueArray1<T1> Values(T1 v1) {
+  return internal::ValueArray1<T1>(v1);
+}
+
+template <typename T1, typename T2>
+internal::ValueArray2<T1, T2> Values(T1 v1, T2 v2) {
+  return internal::ValueArray2<T1, T2>(v1, v2);
+}
+
+template <typename T1, typename T2, typename T3>
+internal::ValueArray3<T1, T2, T3> Values(T1 v1, T2 v2, T3 v3) {
+  return internal::ValueArray3<T1, T2, T3>(v1, v2, v3);
+}
+
+template <typename T1, typename T2, typename T3, typename T4>
+internal::ValueArray4<T1, T2, T3, T4> Values(T1 v1, T2 v2, T3 v3, T4 v4) {
+  return internal::ValueArray4<T1, T2, T3, T4>(v1, v2, v3, v4);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5>
+internal::ValueArray5<T1, T2, T3, T4, T5> Values(T1 v1, T2 v2, T3 v3, T4 v4,
+    T5 v5) {
+  return internal::ValueArray5<T1, T2, T3, T4, T5>(v1, v2, v3, v4, v5);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6>
+internal::ValueArray6<T1, T2, T3, T4, T5, T6> Values(T1 v1, T2 v2, T3 v3,
+    T4 v4, T5 v5, T6 v6) {
+  return internal::ValueArray6<T1, T2, T3, T4, T5, T6>(v1, v2, v3, v4, v5, v6);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7>
+internal::ValueArray7<T1, T2, T3, T4, T5, T6, T7> Values(T1 v1, T2 v2, T3 v3,
+    T4 v4, T5 v5, T6 v6, T7 v7) {
+  return internal::ValueArray7<T1, T2, T3, T4, T5, T6, T7>(v1, v2, v3, v4, v5,
+      v6, v7);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8>
+internal::ValueArray8<T1, T2, T3, T4, T5, T6, T7, T8> Values(T1 v1, T2 v2,
+    T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8) {
+  return internal::ValueArray8<T1, T2, T3, T4, T5, T6, T7, T8>(v1, v2, v3, v4,
+      v5, v6, v7, v8);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9>
+internal::ValueArray9<T1, T2, T3, T4, T5, T6, T7, T8, T9> Values(T1 v1, T2 v2,
+    T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9) {
+  return internal::ValueArray9<T1, T2, T3, T4, T5, T6, T7, T8, T9>(v1, v2, v3,
+      v4, v5, v6, v7, v8, v9);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10>
+internal::ValueArray10<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> Values(T1 v1,
+    T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10) {
+  return internal::ValueArray10<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>(v1,
+      v2, v3, v4, v5, v6, v7, v8, v9, v10);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11>
+internal::ValueArray11<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10,
+    T11> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+    T10 v10, T11 v11) {
+  return internal::ValueArray11<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10,
+      T11>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12>
+internal::ValueArray12<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+    T12> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+    T10 v10, T11 v11, T12 v12) {
+  return internal::ValueArray12<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13>
+internal::ValueArray13<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+    T13> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+    T10 v10, T11 v11, T12 v12, T13 v13) {
+  return internal::ValueArray13<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14>
+internal::ValueArray14<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14) {
+  return internal::ValueArray14<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13,
+      v14);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15>
+internal::ValueArray15<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8,
+    T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15) {
+  return internal::ValueArray15<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12,
+      v13, v14, v15);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16>
+internal::ValueArray16<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,
+    T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
+    T16 v16) {
+  return internal::ValueArray16<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11,
+      v12, v13, v14, v15, v16);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17>
+internal::ValueArray17<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,
+    T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
+    T16 v16, T17 v17) {
+  return internal::ValueArray17<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10,
+      v11, v12, v13, v14, v15, v16, v17);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18>
+internal::ValueArray18<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6,
+    T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
+    T16 v16, T17 v17, T18 v18) {
+  return internal::ValueArray18<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18>(v1, v2, v3, v4, v5, v6, v7, v8, v9,
+      v10, v11, v12, v13, v14, v15, v16, v17, v18);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19>
+internal::ValueArray19<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5,
+    T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14,
+    T15 v15, T16 v16, T17 v17, T18 v18, T19 v19) {
+  return internal::ValueArray19<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19>(v1, v2, v3, v4, v5, v6, v7, v8,
+      v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20>
+internal::ValueArray20<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20> Values(T1 v1, T2 v2, T3 v3, T4 v4,
+    T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13,
+    T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20) {
+  return internal::ValueArray20<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20>(v1, v2, v3, v4, v5, v6, v7,
+      v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21>
+internal::ValueArray21<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21> Values(T1 v1, T2 v2, T3 v3, T4 v4,
+    T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13,
+    T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21) {
+  return internal::ValueArray21<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21>(v1, v2, v3, v4, v5, v6,
+      v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22>
+internal::ValueArray22<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22> Values(T1 v1, T2 v2, T3 v3,
+    T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12,
+    T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20,
+    T21 v21, T22 v22) {
+  return internal::ValueArray22<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22>(v1, v2, v3, v4,
+      v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19,
+      v20, v21, v22);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23>
+internal::ValueArray23<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23> Values(T1 v1, T2 v2,
+    T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12,
+    T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20,
+    T21 v21, T22 v22, T23 v23) {
+  return internal::ValueArray23<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23>(v1, v2, v3,
+      v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19,
+      v20, v21, v22, v23);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24>
+internal::ValueArray24<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24> Values(T1 v1, T2 v2,
+    T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12,
+    T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20,
+    T21 v21, T22 v22, T23 v23, T24 v24) {
+  return internal::ValueArray24<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24>(v1, v2,
+      v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18,
+      v19, v20, v21, v22, v23, v24);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25>
+internal::ValueArray25<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25> Values(T1 v1,
+    T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11,
+    T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19,
+    T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25) {
+  return internal::ValueArray25<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25>(v1,
+      v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17,
+      v18, v19, v20, v21, v22, v23, v24, v25);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26>
+internal::ValueArray26<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+    T26> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+    T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+    T26 v26) {
+  return internal::ValueArray26<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+      T26>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15,
+      v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27>
+internal::ValueArray27<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+    T27> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+    T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+    T26 v26, T27 v27) {
+  return internal::ValueArray27<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+      T26, T27>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14,
+      v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28>
+internal::ValueArray28<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+    T28> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+    T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+    T26 v26, T27 v27, T28 v28) {
+  return internal::ValueArray28<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+      T26, T27, T28>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13,
+      v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27,
+      v28);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29>
+internal::ValueArray29<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+    T29> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+    T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+    T26 v26, T27 v27, T28 v28, T29 v29) {
+  return internal::ValueArray29<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+      T26, T27, T28, T29>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12,
+      v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26,
+      v27, v28, v29);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30>
+internal::ValueArray30<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+    T29, T30> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8,
+    T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16,
+    T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24,
+    T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30) {
+  return internal::ValueArray30<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+      T26, T27, T28, T29, T30>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11,
+      v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25,
+      v26, v27, v28, v29, v30);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31>
+internal::ValueArray31<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+    T29, T30, T31> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,
+    T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
+    T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23,
+    T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31) {
+  return internal::ValueArray31<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+      T26, T27, T28, T29, T30, T31>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10,
+      v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24,
+      v25, v26, v27, v28, v29, v30, v31);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32>
+internal::ValueArray32<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+    T29, T30, T31, T32> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,
+    T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
+    T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23,
+    T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31,
+    T32 v32) {
+  return internal::ValueArray32<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+      T26, T27, T28, T29, T30, T31, T32>(v1, v2, v3, v4, v5, v6, v7, v8, v9,
+      v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23,
+      v24, v25, v26, v27, v28, v29, v30, v31, v32);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33>
+internal::ValueArray33<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+    T29, T30, T31, T32, T33> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6,
+    T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
+    T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23,
+    T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31,
+    T32 v32, T33 v33) {
+  return internal::ValueArray33<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+      T26, T27, T28, T29, T30, T31, T32, T33>(v1, v2, v3, v4, v5, v6, v7, v8,
+      v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23,
+      v24, v25, v26, v27, v28, v29, v30, v31, v32, v33);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34>
+internal::ValueArray34<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+    T29, T30, T31, T32, T33, T34> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5,
+    T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14,
+    T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22,
+    T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30,
+    T31 v31, T32 v32, T33 v33, T34 v34) {
+  return internal::ValueArray34<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+      T26, T27, T28, T29, T30, T31, T32, T33, T34>(v1, v2, v3, v4, v5, v6, v7,
+      v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22,
+      v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35>
+internal::ValueArray35<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+    T29, T30, T31, T32, T33, T34, T35> Values(T1 v1, T2 v2, T3 v3, T4 v4,
+    T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13,
+    T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21,
+    T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29,
+    T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35) {
+  return internal::ValueArray35<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35>(v1, v2, v3, v4, v5, v6,
+      v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21,
+      v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36>
+internal::ValueArray36<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+    T29, T30, T31, T32, T33, T34, T35, T36> Values(T1 v1, T2 v2, T3 v3, T4 v4,
+    T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13,
+    T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21,
+    T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29,
+    T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36) {
+  return internal::ValueArray36<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36>(v1, v2, v3, v4,
+      v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19,
+      v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33,
+      v34, v35, v36);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37>
+internal::ValueArray37<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+    T29, T30, T31, T32, T33, T34, T35, T36, T37> Values(T1 v1, T2 v2, T3 v3,
+    T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12,
+    T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20,
+    T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28,
+    T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36,
+    T37 v37) {
+  return internal::ValueArray37<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37>(v1, v2, v3,
+      v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19,
+      v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33,
+      v34, v35, v36, v37);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38>
+internal::ValueArray38<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38> Values(T1 v1, T2 v2,
+    T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12,
+    T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20,
+    T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28,
+    T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36,
+    T37 v37, T38 v38) {
+  return internal::ValueArray38<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38>(v1, v2,
+      v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18,
+      v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32,
+      v33, v34, v35, v36, v37, v38);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39>
+internal::ValueArray39<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39> Values(T1 v1, T2 v2,
+    T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12,
+    T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20,
+    T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28,
+    T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36,
+    T37 v37, T38 v38, T39 v39) {
+  return internal::ValueArray39<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39>(v1,
+      v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17,
+      v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31,
+      v32, v33, v34, v35, v36, v37, v38, v39);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40>
+internal::ValueArray40<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40> Values(T1 v1,
+    T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11,
+    T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19,
+    T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27,
+    T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35,
+    T36 v36, T37 v37, T38 v38, T39 v39, T40 v40) {
+  return internal::ValueArray40<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
+      T40>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15,
+      v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29,
+      v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41>
+internal::ValueArray41<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
+    T41> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+    T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+    T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
+    T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41) {
+  return internal::ValueArray41<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
+      T40, T41>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14,
+      v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28,
+      v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42>
+internal::ValueArray42<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
+    T42> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+    T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+    T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
+    T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
+    T42 v42) {
+  return internal::ValueArray42<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
+      T40, T41, T42>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13,
+      v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27,
+      v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41,
+      v42);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43>
+internal::ValueArray43<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
+    T43> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+    T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+    T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
+    T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
+    T42 v42, T43 v43) {
+  return internal::ValueArray43<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
+      T40, T41, T42, T43>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12,
+      v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26,
+      v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40,
+      v41, v42, v43);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43, typename T44>
+internal::ValueArray44<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
+    T44> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+    T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+    T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
+    T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
+    T42 v42, T43 v43, T44 v44) {
+  return internal::ValueArray44<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
+      T40, T41, T42, T43, T44>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11,
+      v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25,
+      v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39,
+      v40, v41, v42, v43, v44);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43, typename T44, typename T45>
+internal::ValueArray45<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
+    T44, T45> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8,
+    T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16,
+    T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24,
+    T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32,
+    T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40,
+    T41 v41, T42 v42, T43 v43, T44 v44, T45 v45) {
+  return internal::ValueArray45<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
+      T40, T41, T42, T43, T44, T45>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10,
+      v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24,
+      v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38,
+      v39, v40, v41, v42, v43, v44, v45);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43, typename T44, typename T45,
+    typename T46>
+internal::ValueArray46<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
+    T44, T45, T46> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,
+    T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
+    T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23,
+    T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31,
+    T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39,
+    T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45, T46 v46) {
+  return internal::ValueArray46<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
+      T40, T41, T42, T43, T44, T45, T46>(v1, v2, v3, v4, v5, v6, v7, v8, v9,
+      v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23,
+      v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37,
+      v38, v39, v40, v41, v42, v43, v44, v45, v46);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43, typename T44, typename T45,
+    typename T46, typename T47>
+internal::ValueArray47<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
+    T44, T45, T46, T47> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,
+    T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
+    T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23,
+    T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31,
+    T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39,
+    T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47) {
+  return internal::ValueArray47<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
+      T40, T41, T42, T43, T44, T45, T46, T47>(v1, v2, v3, v4, v5, v6, v7, v8,
+      v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23,
+      v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37,
+      v38, v39, v40, v41, v42, v43, v44, v45, v46, v47);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43, typename T44, typename T45,
+    typename T46, typename T47, typename T48>
+internal::ValueArray48<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
+    T44, T45, T46, T47, T48> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6,
+    T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
+    T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23,
+    T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31,
+    T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39,
+    T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47,
+    T48 v48) {
+  return internal::ValueArray48<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
+      T40, T41, T42, T43, T44, T45, T46, T47, T48>(v1, v2, v3, v4, v5, v6, v7,
+      v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22,
+      v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36,
+      v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43, typename T44, typename T45,
+    typename T46, typename T47, typename T48, typename T49>
+internal::ValueArray49<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
+    T44, T45, T46, T47, T48, T49> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5,
+    T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14,
+    T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22,
+    T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30,
+    T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38,
+    T39 v39, T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45, T46 v46,
+    T47 v47, T48 v48, T49 v49) {
+  return internal::ValueArray49<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
+      T40, T41, T42, T43, T44, T45, T46, T47, T48, T49>(v1, v2, v3, v4, v5, v6,
+      v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21,
+      v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35,
+      v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43, typename T44, typename T45,
+    typename T46, typename T47, typename T48, typename T49, typename T50>
+internal::ValueArray50<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
+    T44, T45, T46, T47, T48, T49, T50> Values(T1 v1, T2 v2, T3 v3, T4 v4,
+    T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13,
+    T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21,
+    T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29,
+    T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37,
+    T38 v38, T39 v39, T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45,
+    T46 v46, T47 v47, T48 v48, T49 v49, T50 v50) {
+  return internal::ValueArray50<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
+      T40, T41, T42, T43, T44, T45, T46, T47, T48, T49, T50>(v1, v2, v3, v4,
+      v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19,
+      v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33,
+      v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47,
+      v48, v49, v50);
+}
+
+// Bool() allows generating tests with parameters in a set of (false, true).
+//
+// Synopsis:
+// Bool()
+//   - returns a generator producing sequences with elements {false, true}.
+//
+// It is useful when testing code that depends on Boolean flags. Combinations
+// of multiple flags can be tested when several Bool()'s are combined using
+// Combine() function.
+//
+// In the following example all tests in the test case FlagDependentTest
+// will be instantiated twice with parameters false and true.
+//
+// class FlagDependentTest : public testing::TestWithParam<bool> {
+//   virtual void SetUp() {
+//     external_flag = GetParam();
+//   }
+// }
+// INSTANTIATE_TEST_CASE_P(BoolSequence, FlagDependentTest, Bool());
+//
+inline internal::ParamGenerator<bool> Bool() {
+  return Values(false, true);
+}
+
+# if GTEST_HAS_COMBINE
+// Combine() allows the user to combine two or more sequences to produce
+// values of a Cartesian product of those sequences' elements.
+//
+// Synopsis:
+// Combine(gen1, gen2, ..., genN)
+//   - returns a generator producing sequences with elements coming from
+//     the Cartesian product of elements from the sequences generated by
+//     gen1, gen2, ..., genN. The sequence elements will have a type of
+//     tuple<T1, T2, ..., TN> where T1, T2, ..., TN are the types
+//     of elements from sequences produces by gen1, gen2, ..., genN.
+//
+// Combine can have up to 10 arguments. This number is currently limited
+// by the maximum number of elements in the tuple implementation used by Google
+// Test.
+//
+// Example:
+//
+// This will instantiate tests in test case AnimalTest each one with
+// the parameter values tuple("cat", BLACK), tuple("cat", WHITE),
+// tuple("dog", BLACK), and tuple("dog", WHITE):
+//
+// enum Color { BLACK, GRAY, WHITE };
+// class AnimalTest
+//     : public testing::TestWithParam<tuple<const char*, Color> > {...};
+//
+// TEST_P(AnimalTest, AnimalLooksNice) {...}
+//
+// INSTANTIATE_TEST_CASE_P(AnimalVariations, AnimalTest,
+//                         Combine(Values("cat", "dog"),
+//                                 Values(BLACK, WHITE)));
+//
+// This will instantiate tests in FlagDependentTest with all variations of two
+// Boolean flags:
+//
+// class FlagDependentTest
+//     : public testing::TestWithParam<tuple<bool, bool> > {
+//   virtual void SetUp() {
+//     // Assigns external_flag_1 and external_flag_2 values from the tuple.
+//     tie(external_flag_1, external_flag_2) = GetParam();
+//   }
+// };
+//
+// TEST_P(FlagDependentTest, TestFeature1) {
+//   // Test your code using external_flag_1 and external_flag_2 here.
+// }
+// INSTANTIATE_TEST_CASE_P(TwoBoolSequence, FlagDependentTest,
+//                         Combine(Bool(), Bool()));
+//
+template <typename Generator1, typename Generator2>
+internal::CartesianProductHolder2<Generator1, Generator2> Combine(
+    const Generator1& g1, const Generator2& g2) {
+  return internal::CartesianProductHolder2<Generator1, Generator2>(
+      g1, g2);
+}
+
+template <typename Generator1, typename Generator2, typename Generator3>
+internal::CartesianProductHolder3<Generator1, Generator2, Generator3> Combine(
+    const Generator1& g1, const Generator2& g2, const Generator3& g3) {
+  return internal::CartesianProductHolder3<Generator1, Generator2, Generator3>(
+      g1, g2, g3);
+}
+
+template <typename Generator1, typename Generator2, typename Generator3,
+    typename Generator4>
+internal::CartesianProductHolder4<Generator1, Generator2, Generator3,
+    Generator4> Combine(
+    const Generator1& g1, const Generator2& g2, const Generator3& g3,
+        const Generator4& g4) {
+  return internal::CartesianProductHolder4<Generator1, Generator2, Generator3,
+      Generator4>(
+      g1, g2, g3, g4);
+}
+
+template <typename Generator1, typename Generator2, typename Generator3,
+    typename Generator4, typename Generator5>
+internal::CartesianProductHolder5<Generator1, Generator2, Generator3,
+    Generator4, Generator5> Combine(
+    const Generator1& g1, const Generator2& g2, const Generator3& g3,
+        const Generator4& g4, const Generator5& g5) {
+  return internal::CartesianProductHolder5<Generator1, Generator2, Generator3,
+      Generator4, Generator5>(
+      g1, g2, g3, g4, g5);
+}
+
+template <typename Generator1, typename Generator2, typename Generator3,
+    typename Generator4, typename Generator5, typename Generator6>
+internal::CartesianProductHolder6<Generator1, Generator2, Generator3,
+    Generator4, Generator5, Generator6> Combine(
+    const Generator1& g1, const Generator2& g2, const Generator3& g3,
+        const Generator4& g4, const Generator5& g5, const Generator6& g6) {
+  return internal::CartesianProductHolder6<Generator1, Generator2, Generator3,
+      Generator4, Generator5, Generator6>(
+      g1, g2, g3, g4, g5, g6);
+}
+
+template <typename Generator1, typename Generator2, typename Generator3,
+    typename Generator4, typename Generator5, typename Generator6,
+    typename Generator7>
+internal::CartesianProductHolder7<Generator1, Generator2, Generator3,
+    Generator4, Generator5, Generator6, Generator7> Combine(
+    const Generator1& g1, const Generator2& g2, const Generator3& g3,
+        const Generator4& g4, const Generator5& g5, const Generator6& g6,
+        const Generator7& g7) {
+  return internal::CartesianProductHolder7<Generator1, Generator2, Generator3,
+      Generator4, Generator5, Generator6, Generator7>(
+      g1, g2, g3, g4, g5, g6, g7);
+}
+
+template <typename Generator1, typename Generator2, typename Generator3,
+    typename Generator4, typename Generator5, typename Generator6,
+    typename Generator7, typename Generator8>
+internal::CartesianProductHolder8<Generator1, Generator2, Generator3,
+    Generator4, Generator5, Generator6, Generator7, Generator8> Combine(
+    const Generator1& g1, const Generator2& g2, const Generator3& g3,
+        const Generator4& g4, const Generator5& g5, const Generator6& g6,
+        const Generator7& g7, const Generator8& g8) {
+  return internal::CartesianProductHolder8<Generator1, Generator2, Generator3,
+      Generator4, Generator5, Generator6, Generator7, Generator8>(
+      g1, g2, g3, g4, g5, g6, g7, g8);
+}
+
+template <typename Generator1, typename Generator2, typename Generator3,
+    typename Generator4, typename Generator5, typename Generator6,
+    typename Generator7, typename Generator8, typename Generator9>
+internal::CartesianProductHolder9<Generator1, Generator2, Generator3,
+    Generator4, Generator5, Generator6, Generator7, Generator8,
+    Generator9> Combine(
+    const Generator1& g1, const Generator2& g2, const Generator3& g3,
+        const Generator4& g4, const Generator5& g5, const Generator6& g6,
+        const Generator7& g7, const Generator8& g8, const Generator9& g9) {
+  return internal::CartesianProductHolder9<Generator1, Generator2, Generator3,
+      Generator4, Generator5, Generator6, Generator7, Generator8, Generator9>(
+      g1, g2, g3, g4, g5, g6, g7, g8, g9);
+}
+
+template <typename Generator1, typename Generator2, typename Generator3,
+    typename Generator4, typename Generator5, typename Generator6,
+    typename Generator7, typename Generator8, typename Generator9,
+    typename Generator10>
+internal::CartesianProductHolder10<Generator1, Generator2, Generator3,
+    Generator4, Generator5, Generator6, Generator7, Generator8, Generator9,
+    Generator10> Combine(
+    const Generator1& g1, const Generator2& g2, const Generator3& g3,
+        const Generator4& g4, const Generator5& g5, const Generator6& g6,
+        const Generator7& g7, const Generator8& g8, const Generator9& g9,
+        const Generator10& g10) {
+  return internal::CartesianProductHolder10<Generator1, Generator2, Generator3,
+      Generator4, Generator5, Generator6, Generator7, Generator8, Generator9,
+      Generator10>(
+      g1, g2, g3, g4, g5, g6, g7, g8, g9, g10);
+}
+# endif  // GTEST_HAS_COMBINE
+
+
+
+# define TEST_P(test_case_name, test_name) \
+  class GTEST_TEST_CLASS_NAME_(test_case_name, test_name) \
+      : public test_case_name { \
+   public: \
+    GTEST_TEST_CLASS_NAME_(test_case_name, test_name)() {} \
+    virtual void TestBody(); \
+   private: \
+    static int AddToRegistry() { \
+      ::testing::UnitTest::GetInstance()->parameterized_test_registry(). \
+          GetTestCasePatternHolder<test_case_name>(\
+              #test_case_name, __FILE__, __LINE__)->AddTestPattern(\
+                  #test_case_name, \
+                  #test_name, \
+                  new ::testing::internal::TestMetaFactory< \
+                      GTEST_TEST_CLASS_NAME_(test_case_name, test_name)>()); \
+      return 0; \
+    } \
+    static int gtest_registering_dummy_; \
+    GTEST_DISALLOW_COPY_AND_ASSIGN_(\
+        GTEST_TEST_CLASS_NAME_(test_case_name, test_name)); \
+  }; \
+  int GTEST_TEST_CLASS_NAME_(test_case_name, \
+                             test_name)::gtest_registering_dummy_ = \
+      GTEST_TEST_CLASS_NAME_(test_case_name, test_name)::AddToRegistry(); \
+  void GTEST_TEST_CLASS_NAME_(test_case_name, test_name)::TestBody()
+
+# define INSTANTIATE_TEST_CASE_P(prefix, test_case_name, generator) \
+  ::testing::internal::ParamGenerator<test_case_name::ParamType> \
+      gtest_##prefix##test_case_name##_EvalGenerator_() { return generator; } \
+  int gtest_##prefix##test_case_name##_dummy_ = \
+      ::testing::UnitTest::GetInstance()->parameterized_test_registry(). \
+          GetTestCasePatternHolder<test_case_name>(\
+              #test_case_name, __FILE__, __LINE__)->AddTestCaseInstantiation(\
+                  #prefix, \
+                  &gtest_##prefix##test_case_name##_EvalGenerator_, \
+                  __FILE__, __LINE__)
+
+}  // namespace testing
+
+#endif  // GTEST_HAS_PARAM_TEST
+
+#endif  // GTEST_INCLUDE_GTEST_GTEST_PARAM_TEST_H_
+// Copyright 2006, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+//
+// Google C++ Testing Framework definitions useful in production code.
+
+#ifndef GTEST_INCLUDE_GTEST_GTEST_PROD_H_
+#define GTEST_INCLUDE_GTEST_GTEST_PROD_H_
+
+// When you need to test the private or protected members of a class,
+// use the FRIEND_TEST macro to declare your tests as friends of the
+// class.  For example:
+//
+// class MyClass {
+//  private:
+//   void MyMethod();
+//   FRIEND_TEST(MyClassTest, MyMethod);
+// };
+//
+// class MyClassTest : public testing::Test {
+//   // ...
+// };
+//
+// TEST_F(MyClassTest, MyMethod) {
+//   // Can call MyClass::MyMethod() here.
+// }
+
+#define FRIEND_TEST(test_case_name, test_name)\
+friend class test_case_name##_##test_name##_Test
+
+#endif  // GTEST_INCLUDE_GTEST_GTEST_PROD_H_
+// Copyright 2008, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: mheule at google.com (Markus Heule)
+//
+
+#ifndef GTEST_INCLUDE_GTEST_GTEST_TEST_PART_H_
+#define GTEST_INCLUDE_GTEST_GTEST_TEST_PART_H_
+
+#include <iosfwd>
+#include <vector>
+
+namespace testing {
+
+// A copyable object representing the result of a test part (i.e. an
+// assertion or an explicit FAIL(), ADD_FAILURE(), or SUCCESS()).
+//
+// Don't inherit from TestPartResult as its destructor is not virtual.
+class GTEST_API_ TestPartResult {
+ public:
+  // The possible outcomes of a test part (i.e. an assertion or an
+  // explicit SUCCEED(), FAIL(), or ADD_FAILURE()).
+  enum Type {
+    kSuccess,          // Succeeded.
+    kNonFatalFailure,  // Failed but the test can continue.
+    kFatalFailure      // Failed and the test should be terminated.
+  };
+
+  // C'tor.  TestPartResult does NOT have a default constructor.
+  // Always use this constructor (with parameters) to create a
+  // TestPartResult object.
+  TestPartResult(Type a_type,
+                 const char* a_file_name,
+                 int a_line_number,
+                 const char* a_message)
+      : type_(a_type),
+        file_name_(a_file_name == NULL ? "" : a_file_name),
+        line_number_(a_line_number),
+        summary_(ExtractSummary(a_message)),
+        message_(a_message) {
+  }
+
+  // Gets the outcome of the test part.
+  Type type() const { return type_; }
+
+  // Gets the name of the source file where the test part took place, or
+  // NULL if it's unknown.
+  const char* file_name() const {
+    return file_name_.empty() ? NULL : file_name_.c_str();
+  }
+
+  // Gets the line in the source file where the test part took place,
+  // or -1 if it's unknown.
+  int line_number() const { return line_number_; }
+
+  // Gets the summary of the failure message.
+  const char* summary() const { return summary_.c_str(); }
+
+  // Gets the message associated with the test part.
+  const char* message() const { return message_.c_str(); }
+
+  // Returns true iff the test part passed.
+  bool passed() const { return type_ == kSuccess; }
+
+  // Returns true iff the test part failed.
+  bool failed() const { return type_ != kSuccess; }
+
+  // Returns true iff the test part non-fatally failed.
+  bool nonfatally_failed() const { return type_ == kNonFatalFailure; }
+
+  // Returns true iff the test part fatally failed.
+  bool fatally_failed() const { return type_ == kFatalFailure; }
+
+ private:
+  Type type_;
+
+  // Gets the summary of the failure message by omitting the stack
+  // trace in it.
+  static std::string ExtractSummary(const char* message);
+
+  // The name of the source file where the test part took place, or
+  // "" if the source file is unknown.
+  std::string file_name_;
+  // The line in the source file where the test part took place, or -1
+  // if the line number is unknown.
+  int line_number_;
+  std::string summary_;  // The test failure summary.
+  std::string message_;  // The test failure message.
+};
+
+// Prints a TestPartResult object.
+std::ostream& operator<<(std::ostream& os, const TestPartResult& result);
+
+// An array of TestPartResult objects.
+//
+// Don't inherit from TestPartResultArray as its destructor is not
+// virtual.
+class GTEST_API_ TestPartResultArray {
+ public:
+  TestPartResultArray() {}
+
+  // Appends the given TestPartResult to the array.
+  void Append(const TestPartResult& result);
+
+  // Returns the TestPartResult at the given index (0-based).
+  const TestPartResult& GetTestPartResult(int index) const;
+
+  // Returns the number of TestPartResult objects in the array.
+  int size() const;
+
+ private:
+  std::vector<TestPartResult> array_;
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(TestPartResultArray);
+};
+
+// This interface knows how to report a test part result.
+class TestPartResultReporterInterface {
+ public:
+  virtual ~TestPartResultReporterInterface() {}
+
+  virtual void ReportTestPartResult(const TestPartResult& result) = 0;
+};
+
+namespace internal {
+
+// This helper class is used by {ASSERT|EXPECT}_NO_FATAL_FAILURE to check if a
+// statement generates new fatal failures. To do so it registers itself as the
+// current test part result reporter. Besides checking if fatal failures were
+// reported, it only delegates the reporting to the former result reporter.
+// The original result reporter is restored in the destructor.
+// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
+class GTEST_API_ HasNewFatalFailureHelper
+    : public TestPartResultReporterInterface {
+ public:
+  HasNewFatalFailureHelper();
+  virtual ~HasNewFatalFailureHelper();
+  virtual void ReportTestPartResult(const TestPartResult& result);
+  bool has_new_fatal_failure() const { return has_new_fatal_failure_; }
+ private:
+  bool has_new_fatal_failure_;
+  TestPartResultReporterInterface* original_reporter_;
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(HasNewFatalFailureHelper);
+};
+
+}  // namespace internal
+
+}  // namespace testing
+
+#endif  // GTEST_INCLUDE_GTEST_GTEST_TEST_PART_H_
+// Copyright 2008 Google Inc.
+// All Rights Reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+
+#ifndef GTEST_INCLUDE_GTEST_GTEST_TYPED_TEST_H_
+#define GTEST_INCLUDE_GTEST_GTEST_TYPED_TEST_H_
+
+// This header implements typed tests and type-parameterized tests.
+
+// Typed (aka type-driven) tests repeat the same test for types in a
+// list.  You must know which types you want to test with when writing
+// typed tests. Here's how you do it:
+
+#if 0
+
+// First, define a fixture class template.  It should be parameterized
+// by a type.  Remember to derive it from testing::Test.
+template <typename T>
+class FooTest : public testing::Test {
+ public:
+  ...
+  typedef std::list<T> List;
+  static T shared_;
+  T value_;
+};
+
+// Next, associate a list of types with the test case, which will be
+// repeated for each type in the list.  The typedef is necessary for
+// the macro to parse correctly.
+typedef testing::Types<char, int, unsigned int> MyTypes;
+TYPED_TEST_CASE(FooTest, MyTypes);
+
+// If the type list contains only one type, you can write that type
+// directly without Types<...>:
+//   TYPED_TEST_CASE(FooTest, int);
+
+// Then, use TYPED_TEST() instead of TEST_F() to define as many typed
+// tests for this test case as you want.
+TYPED_TEST(FooTest, DoesBlah) {
+  // Inside a test, refer to TypeParam to get the type parameter.
+  // Since we are inside a derived class template, C++ requires use to
+  // visit the members of FooTest via 'this'.
+  TypeParam n = this->value_;
+
+  // To visit static members of the fixture, add the TestFixture::
+  // prefix.
+  n += TestFixture::shared_;
+
+  // To refer to typedefs in the fixture, add the "typename
+  // TestFixture::" prefix.
+  typename TestFixture::List values;
+  values.push_back(n);
+  ...
+}
+
+TYPED_TEST(FooTest, HasPropertyA) { ... }
+
+#endif  // 0
+
+// Type-parameterized tests are abstract test patterns parameterized
+// by a type.  Compared with typed tests, type-parameterized tests
+// allow you to define the test pattern without knowing what the type
+// parameters are.  The defined pattern can be instantiated with
+// different types any number of times, in any number of translation
+// units.
+//
+// If you are designing an interface or concept, you can define a
+// suite of type-parameterized tests to verify properties that any
+// valid implementation of the interface/concept should have.  Then,
+// each implementation can easily instantiate the test suite to verify
+// that it conforms to the requirements, without having to write
+// similar tests repeatedly.  Here's an example:
+
+#if 0
+
+// First, define a fixture class template.  It should be parameterized
+// by a type.  Remember to derive it from testing::Test.
+template <typename T>
+class FooTest : public testing::Test {
+  ...
+};
+
+// Next, declare that you will define a type-parameterized test case
+// (the _P suffix is for "parameterized" or "pattern", whichever you
+// prefer):
+TYPED_TEST_CASE_P(FooTest);
+
+// Then, use TYPED_TEST_P() to define as many type-parameterized tests
+// for this type-parameterized test case as you want.
+TYPED_TEST_P(FooTest, DoesBlah) {
+  // Inside a test, refer to TypeParam to get the type parameter.
+  TypeParam n = 0;
+  ...
+}
+
+TYPED_TEST_P(FooTest, HasPropertyA) { ... }
+
+// Now the tricky part: you need to register all test patterns before
+// you can instantiate them.  The first argument of the macro is the
+// test case name; the rest are the names of the tests in this test
+// case.
+REGISTER_TYPED_TEST_CASE_P(FooTest,
+                           DoesBlah, HasPropertyA);
+
+// Finally, you are free to instantiate the pattern with the types you
+// want.  If you put the above code in a header file, you can #include
+// it in multiple C++ source files and instantiate it multiple times.
+//
+// To distinguish different instances of the pattern, the first
+// argument to the INSTANTIATE_* macro is a prefix that will be added
+// to the actual test case name.  Remember to pick unique prefixes for
+// different instances.
+typedef testing::Types<char, int, unsigned int> MyTypes;
+INSTANTIATE_TYPED_TEST_CASE_P(My, FooTest, MyTypes);
+
+// If the type list contains only one type, you can write that type
+// directly without Types<...>:
+//   INSTANTIATE_TYPED_TEST_CASE_P(My, FooTest, int);
+
+#endif  // 0
+
+
+// Implements typed tests.
+
+#if GTEST_HAS_TYPED_TEST
+
+// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
+//
+// Expands to the name of the typedef for the type parameters of the
+// given test case.
+# define GTEST_TYPE_PARAMS_(TestCaseName) gtest_type_params_##TestCaseName##_
+
+// The 'Types' template argument below must have spaces around it
+// since some compilers may choke on '>>' when passing a template
+// instance (e.g. Types<int>)
+# define TYPED_TEST_CASE(CaseName, Types) \
+  typedef ::testing::internal::TypeList< Types >::type \
+      GTEST_TYPE_PARAMS_(CaseName)
+
+# define TYPED_TEST(CaseName, TestName) \
+  template <typename gtest_TypeParam_> \
+  class GTEST_TEST_CLASS_NAME_(CaseName, TestName) \
+      : public CaseName<gtest_TypeParam_> { \
+   private: \
+    typedef CaseName<gtest_TypeParam_> TestFixture; \
+    typedef gtest_TypeParam_ TypeParam; \
+    virtual void TestBody(); \
+  }; \
+  bool gtest_##CaseName##_##TestName##_registered_ GTEST_ATTRIBUTE_UNUSED_ = \
+      ::testing::internal::TypeParameterizedTest< \
+          CaseName, \
+          ::testing::internal::TemplateSel< \
+              GTEST_TEST_CLASS_NAME_(CaseName, TestName)>, \
+          GTEST_TYPE_PARAMS_(CaseName)>::Register(\
+              "", #CaseName, #TestName, 0); \
+  template <typename gtest_TypeParam_> \
+  void GTEST_TEST_CLASS_NAME_(CaseName, TestName)<gtest_TypeParam_>::TestBody()
+
+#endif  // GTEST_HAS_TYPED_TEST
+
+// Implements type-parameterized tests.
+
+#if GTEST_HAS_TYPED_TEST_P
+
+// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
+//
+// Expands to the namespace name that the type-parameterized tests for
+// the given type-parameterized test case are defined in.  The exact
+// name of the namespace is subject to change without notice.
+# define GTEST_CASE_NAMESPACE_(TestCaseName) \
+  gtest_case_##TestCaseName##_
+
+// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
+//
+// Expands to the name of the variable used to remember the names of
+// the defined tests in the given test case.
+# define GTEST_TYPED_TEST_CASE_P_STATE_(TestCaseName) \
+  gtest_typed_test_case_p_state_##TestCaseName##_
+
+// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE DIRECTLY.
+//
+// Expands to the name of the variable used to remember the names of
+// the registered tests in the given test case.
+# define GTEST_REGISTERED_TEST_NAMES_(TestCaseName) \
+  gtest_registered_test_names_##TestCaseName##_
+
+// The variables defined in the type-parameterized test macros are
+// static as typically these macros are used in a .h file that can be
+// #included in multiple translation units linked together.
+# define TYPED_TEST_CASE_P(CaseName) \
+  static ::testing::internal::TypedTestCasePState \
+      GTEST_TYPED_TEST_CASE_P_STATE_(CaseName)
+
+# define TYPED_TEST_P(CaseName, TestName) \
+  namespace GTEST_CASE_NAMESPACE_(CaseName) { \
+  template <typename gtest_TypeParam_> \
+  class TestName : public CaseName<gtest_TypeParam_> { \
+   private: \
+    typedef CaseName<gtest_TypeParam_> TestFixture; \
+    typedef gtest_TypeParam_ TypeParam; \
+    virtual void TestBody(); \
+  }; \
+  static bool gtest_##TestName##_defined_ GTEST_ATTRIBUTE_UNUSED_ = \
+      GTEST_TYPED_TEST_CASE_P_STATE_(CaseName).AddTestName(\
+          __FILE__, __LINE__, #CaseName, #TestName); \
+  } \
+  template <typename gtest_TypeParam_> \
+  void GTEST_CASE_NAMESPACE_(CaseName)::TestName<gtest_TypeParam_>::TestBody()
+
+# define REGISTER_TYPED_TEST_CASE_P(CaseName, ...) \
+  namespace GTEST_CASE_NAMESPACE_(CaseName) { \
+  typedef ::testing::internal::Templates<__VA_ARGS__>::type gtest_AllTests_; \
+  } \
+  static const char* const GTEST_REGISTERED_TEST_NAMES_(CaseName) = \
+      GTEST_TYPED_TEST_CASE_P_STATE_(CaseName).VerifyRegisteredTestNames(\
+          __FILE__, __LINE__, #__VA_ARGS__)
+
+// The 'Types' template argument below must have spaces around it
+// since some compilers may choke on '>>' when passing a template
+// instance (e.g. Types<int>)
+# define INSTANTIATE_TYPED_TEST_CASE_P(Prefix, CaseName, Types) \
+  bool gtest_##Prefix##_##CaseName GTEST_ATTRIBUTE_UNUSED_ = \
+      ::testing::internal::TypeParameterizedTestCase<CaseName, \
+          GTEST_CASE_NAMESPACE_(CaseName)::gtest_AllTests_, \
+          ::testing::internal::TypeList< Types >::type>::Register(\
+              #Prefix, #CaseName, GTEST_REGISTERED_TEST_NAMES_(CaseName))
+
+#endif  // GTEST_HAS_TYPED_TEST_P
+
+#endif  // GTEST_INCLUDE_GTEST_GTEST_TYPED_TEST_H_
+
+// Depending on the platform, different string classes are available.
+// On Linux, in addition to ::std::string, Google also makes use of
+// class ::string, which has the same interface as ::std::string, but
+// has a different implementation.
+//
+// The user can define GTEST_HAS_GLOBAL_STRING to 1 to indicate that
+// ::string is available AND is a distinct type to ::std::string, or
+// define it to 0 to indicate otherwise.
+//
+// If the user's ::std::string and ::string are the same class due to
+// aliasing, he should define GTEST_HAS_GLOBAL_STRING to 0.
+//
+// If the user doesn't define GTEST_HAS_GLOBAL_STRING, it is defined
+// heuristically.
+
+namespace testing {
+
+// Declares the flags.
+
+// This flag temporary enables the disabled tests.
+GTEST_DECLARE_bool_(also_run_disabled_tests);
+
+// This flag brings the debugger on an assertion failure.
+GTEST_DECLARE_bool_(break_on_failure);
+
+// This flag controls whether Google Test catches all test-thrown exceptions
+// and logs them as failures.
+GTEST_DECLARE_bool_(catch_exceptions);
+
+// This flag enables using colors in terminal output. Available values are
+// "yes" to enable colors, "no" (disable colors), or "auto" (the default)
+// to let Google Test decide.
+GTEST_DECLARE_string_(color);
+
+// This flag sets up the filter to select by name using a glob pattern
+// the tests to run. If the filter is not given all tests are executed.
+GTEST_DECLARE_string_(filter);
+
+// This flag causes the Google Test to list tests. None of the tests listed
+// are actually run if the flag is provided.
+GTEST_DECLARE_bool_(list_tests);
+
+// This flag controls whether Google Test emits a detailed XML report to a file
+// in addition to its normal textual output.
+GTEST_DECLARE_string_(output);
+
+// This flags control whether Google Test prints the elapsed time for each
+// test.
+GTEST_DECLARE_bool_(print_time);
+
+// This flag specifies the random number seed.
+GTEST_DECLARE_int32_(random_seed);
+
+// This flag sets how many times the tests are repeated. The default value
+// is 1. If the value is -1 the tests are repeating forever.
+GTEST_DECLARE_int32_(repeat);
+
+// This flag controls whether Google Test includes Google Test internal
+// stack frames in failure stack traces.
+GTEST_DECLARE_bool_(show_internal_stack_frames);
+
+// When this flag is specified, tests' order is randomized on every iteration.
+GTEST_DECLARE_bool_(shuffle);
+
+// This flag specifies the maximum number of stack frames to be
+// printed in a failure message.
+GTEST_DECLARE_int32_(stack_trace_depth);
+
+// When this flag is specified, a failed assertion will throw an
+// exception if exceptions are enabled, or exit the program with a
+// non-zero code otherwise.
+GTEST_DECLARE_bool_(throw_on_failure);
+
+// When this flag is set with a "host:port" string, on supported
+// platforms test results are streamed to the specified port on
+// the specified host machine.
+GTEST_DECLARE_string_(stream_result_to);
+
+// The upper limit for valid stack trace depths.
+const int kMaxStackTraceDepth = 100;
+
+namespace internal {
+
+class AssertHelper;
+class DefaultGlobalTestPartResultReporter;
+class ExecDeathTest;
+class NoExecDeathTest;
+class FinalSuccessChecker;
+class GTestFlagSaver;
+class StreamingListenerTest;
+class TestResultAccessor;
+class TestEventListenersAccessor;
+class TestEventRepeater;
+class UnitTestRecordPropertyTestHelper;
+class WindowsDeathTest;
+class UnitTestImpl* GetUnitTestImpl();
+void ReportFailureInUnknownLocation(TestPartResult::Type result_type,
+                                    const std::string& message);
+
+}  // namespace internal
+
+// The friend relationship of some of these classes is cyclic.
+// If we don't forward declare them the compiler might confuse the classes
+// in friendship clauses with same named classes on the scope.
+class Test;
+class TestCase;
+class TestInfo;
+class UnitTest;
+
+// A class for indicating whether an assertion was successful.  When
+// the assertion wasn't successful, the AssertionResult object
+// remembers a non-empty message that describes how it failed.
+//
+// To create an instance of this class, use one of the factory functions
+// (AssertionSuccess() and AssertionFailure()).
+//
+// This class is useful for two purposes:
+//   1. Defining predicate functions to be used with Boolean test assertions
+//      EXPECT_TRUE/EXPECT_FALSE and their ASSERT_ counterparts
+//   2. Defining predicate-format functions to be
+//      used with predicate assertions (ASSERT_PRED_FORMAT*, etc).
+//
+// For example, if you define IsEven predicate:
+//
+//   testing::AssertionResult IsEven(int n) {
+//     if ((n % 2) == 0)
+//       return testing::AssertionSuccess();
+//     else
+//       return testing::AssertionFailure() << n << " is odd";
+//   }
+//
+// Then the failed expectation EXPECT_TRUE(IsEven(Fib(5)))
+// will print the message
+//
+//   Value of: IsEven(Fib(5))
+//     Actual: false (5 is odd)
+//   Expected: true
+//
+// instead of a more opaque
+//
+//   Value of: IsEven(Fib(5))
+//     Actual: false
+//   Expected: true
+//
+// in case IsEven is a simple Boolean predicate.
+//
+// If you expect your predicate to be reused and want to support informative
+// messages in EXPECT_FALSE and ASSERT_FALSE (negative assertions show up
+// about half as often as positive ones in our tests), supply messages for
+// both success and failure cases:
+//
+//   testing::AssertionResult IsEven(int n) {
+//     if ((n % 2) == 0)
+//       return testing::AssertionSuccess() << n << " is even";
+//     else
+//       return testing::AssertionFailure() << n << " is odd";
+//   }
+//
+// Then a statement EXPECT_FALSE(IsEven(Fib(6))) will print
+//
+//   Value of: IsEven(Fib(6))
+//     Actual: true (8 is even)
+//   Expected: false
+//
+// NB: Predicates that support negative Boolean assertions have reduced
+// performance in positive ones so be careful not to use them in tests
+// that have lots (tens of thousands) of positive Boolean assertions.
+//
+// To use this class with EXPECT_PRED_FORMAT assertions such as:
+//
+//   // Verifies that Foo() returns an even number.
+//   EXPECT_PRED_FORMAT1(IsEven, Foo());
+//
+// you need to define:
+//
+//   testing::AssertionResult IsEven(const char* expr, int n) {
+//     if ((n % 2) == 0)
+//       return testing::AssertionSuccess();
+//     else
+//       return testing::AssertionFailure()
+//         << "Expected: " << expr << " is even\n  Actual: it's " << n;
+//   }
+//
+// If Foo() returns 5, you will see the following message:
+//
+//   Expected: Foo() is even
+//     Actual: it's 5
+//
+class GTEST_API_ AssertionResult {
+ public:
+  // Copy constructor.
+  // Used in EXPECT_TRUE/FALSE(assertion_result).
+  AssertionResult(const AssertionResult& other);
+  // Used in the EXPECT_TRUE/FALSE(bool_expression).
+  explicit AssertionResult(bool success) : success_(success) {}
+
+  // Returns true iff the assertion succeeded.
+  operator bool() const { return success_; }  // NOLINT
+
+  // Returns the assertion's negation. Used with EXPECT/ASSERT_FALSE.
+  AssertionResult operator!() const;
+
+  // Returns the text streamed into this AssertionResult. Test assertions
+  // use it when they fail (i.e., the predicate's outcome doesn't match the
+  // assertion's expectation). When nothing has been streamed into the
+  // object, returns an empty string.
+  const char* message() const {
+    return message_.get() != NULL ?  message_->c_str() : "";
+  }
+  // TODO(vladl at google.com): Remove this after making sure no clients use it.
+  // Deprecated; please use message() instead.
+  const char* failure_message() const { return message(); }
+
+  // Streams a custom failure message into this object.
+  template <typename T> AssertionResult& operator<<(const T& value) {
+    AppendMessage(Message() << value);
+    return *this;
+  }
+
+  // Allows streaming basic output manipulators such as endl or flush into
+  // this object.
+  AssertionResult& operator<<(
+      ::std::ostream& (*basic_manipulator)(::std::ostream& stream)) {
+    AppendMessage(Message() << basic_manipulator);
+    return *this;
+  }
+
+ private:
+  // Appends the contents of message to message_.
+  void AppendMessage(const Message& a_message) {
+    if (message_.get() == NULL)
+      message_.reset(new ::std::string);
+    message_->append(a_message.GetString().c_str());
+  }
+
+  // Stores result of the assertion predicate.
+  bool success_;
+  // Stores the message describing the condition in case the expectation
+  // construct is not satisfied with the predicate's outcome.
+  // Referenced via a pointer to avoid taking too much stack frame space
+  // with test assertions.
+  internal::scoped_ptr< ::std::string> message_;
+
+  GTEST_DISALLOW_ASSIGN_(AssertionResult);
+};
+
+// Makes a successful assertion result.
+GTEST_API_ AssertionResult AssertionSuccess();
+
+// Makes a failed assertion result.
+GTEST_API_ AssertionResult AssertionFailure();
+
+// Makes a failed assertion result with the given failure message.
+// Deprecated; use AssertionFailure() << msg.
+GTEST_API_ AssertionResult AssertionFailure(const Message& msg);
+
+// The abstract class that all tests inherit from.
+//
+// In Google Test, a unit test program contains one or many TestCases, and
+// each TestCase contains one or many Tests.
+//
+// When you define a test using the TEST macro, you don't need to
+// explicitly derive from Test - the TEST macro automatically does
+// this for you.
+//
+// The only time you derive from Test is when defining a test fixture
+// to be used a TEST_F.  For example:
+//
+//   class FooTest : public testing::Test {
+//    protected:
+//     virtual void SetUp() { ... }
+//     virtual void TearDown() { ... }
+//     ...
+//   };
+//
+//   TEST_F(FooTest, Bar) { ... }
+//   TEST_F(FooTest, Baz) { ... }
+//
+// Test is not copyable.
+class GTEST_API_ Test {
+ public:
+  friend class TestInfo;
+
+  // Defines types for pointers to functions that set up and tear down
+  // a test case.
+  typedef internal::SetUpTestCaseFunc SetUpTestCaseFunc;
+  typedef internal::TearDownTestCaseFunc TearDownTestCaseFunc;
+
+  // The d'tor is virtual as we intend to inherit from Test.
+  virtual ~Test();
+
+  // Sets up the stuff shared by all tests in this test case.
+  //
+  // Google Test will call Foo::SetUpTestCase() before running the first
+  // test in test case Foo.  Hence a sub-class can define its own
+  // SetUpTestCase() method to shadow the one defined in the super
+  // class.
+  static void SetUpTestCase() {}
+
+  // Tears down the stuff shared by all tests in this test case.
+  //
+  // Google Test will call Foo::TearDownTestCase() after running the last
+  // test in test case Foo.  Hence a sub-class can define its own
+  // TearDownTestCase() method to shadow the one defined in the super
+  // class.
+  static void TearDownTestCase() {}
+
+  // Returns true iff the current test has a fatal failure.
+  static bool HasFatalFailure();
+
+  // Returns true iff the current test has a non-fatal failure.
+  static bool HasNonfatalFailure();
+
+  // Returns true iff the current test has a (either fatal or
+  // non-fatal) failure.
+  static bool HasFailure() { return HasFatalFailure() || HasNonfatalFailure(); }
+
+  // Logs a property for the current test, test case, or for the entire
+  // invocation of the test program when used outside of the context of a
+  // test case.  Only the last value for a given key is remembered.  These
+  // are public static so they can be called from utility functions that are
+  // not members of the test fixture.  Calls to RecordProperty made during
+  // lifespan of the test (from the moment its constructor starts to the
+  // moment its destructor finishes) will be output in XML as attributes of
+  // the <testcase> element.  Properties recorded from fixture's
+  // SetUpTestCase or TearDownTestCase are logged as attributes of the
+  // corresponding <testsuite> element.  Calls to RecordProperty made in the
+  // global context (before or after invocation of RUN_ALL_TESTS and from
+  // SetUp/TearDown method of Environment objects registered with Google
+  // Test) will be output as attributes of the <testsuites> element.
+  static void RecordProperty(const std::string& key, const std::string& value);
+  static void RecordProperty(const std::string& key, int value);
+
+ protected:
+  // Creates a Test object.
+  Test();
+
+  // Sets up the test fixture.
+  virtual void SetUp();
+
+  // Tears down the test fixture.
+  virtual void TearDown();
+
+ private:
+  // Returns true iff the current test has the same fixture class as
+  // the first test in the current test case.
+  static bool HasSameFixtureClass();
+
+  // Runs the test after the test fixture has been set up.
+  //
+  // A sub-class must implement this to define the test logic.
+  //
+  // DO NOT OVERRIDE THIS FUNCTION DIRECTLY IN A USER PROGRAM.
+  // Instead, use the TEST or TEST_F macro.
+  virtual void TestBody() = 0;
+
+  // Sets up, executes, and tears down the test.
+  void Run();
+
+  // Deletes self.  We deliberately pick an unusual name for this
+  // internal method to avoid clashing with names used in user TESTs.
+  void DeleteSelf_() { delete this; }
+
+  // Uses a GTestFlagSaver to save and restore all Google Test flags.
+  const internal::GTestFlagSaver* const gtest_flag_saver_;
+
+  // Often a user mis-spells SetUp() as Setup() and spends a long time
+  // wondering why it is never called by Google Test.  The declaration of
+  // the following method is solely for catching such an error at
+  // compile time:
+  //
+  //   - The return type is deliberately chosen to be not void, so it
+  //   will be a conflict if a user declares void Setup() in his test
+  //   fixture.
+  //
+  //   - This method is private, so it will be another compiler error
+  //   if a user calls it from his test fixture.
+  //
+  // DO NOT OVERRIDE THIS FUNCTION.
+  //
+  // If you see an error about overriding the following function or
+  // about it being private, you have mis-spelled SetUp() as Setup().
+  struct Setup_should_be_spelled_SetUp {};
+  virtual Setup_should_be_spelled_SetUp* Setup() { return NULL; }
+
+  // We disallow copying Tests.
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(Test);
+};
+
+typedef internal::TimeInMillis TimeInMillis;
+
+// A copyable object representing a user specified test property which can be
+// output as a key/value string pair.
+//
+// Don't inherit from TestProperty as its destructor is not virtual.
+class TestProperty {
+ public:
+  // C'tor.  TestProperty does NOT have a default constructor.
+  // Always use this constructor (with parameters) to create a
+  // TestProperty object.
+  TestProperty(const std::string& a_key, const std::string& a_value) :
+    key_(a_key), value_(a_value) {
+  }
+
+  // Gets the user supplied key.
+  const char* key() const {
+    return key_.c_str();
+  }
+
+  // Gets the user supplied value.
+  const char* value() const {
+    return value_.c_str();
+  }
+
+  // Sets a new value, overriding the one supplied in the constructor.
+  void SetValue(const std::string& new_value) {
+    value_ = new_value;
+  }
+
+ private:
+  // The key supplied by the user.
+  std::string key_;
+  // The value supplied by the user.
+  std::string value_;
+};
+
+// The result of a single Test.  This includes a list of
+// TestPartResults, a list of TestProperties, a count of how many
+// death tests there are in the Test, and how much time it took to run
+// the Test.
+//
+// TestResult is not copyable.
+class GTEST_API_ TestResult {
+ public:
+  // Creates an empty TestResult.
+  TestResult();
+
+  // D'tor.  Do not inherit from TestResult.
+  ~TestResult();
+
+  // Gets the number of all test parts.  This is the sum of the number
+  // of successful test parts and the number of failed test parts.
+  int total_part_count() const;
+
+  // Returns the number of the test properties.
+  int test_property_count() const;
+
+  // Returns true iff the test passed (i.e. no test part failed).
+  bool Passed() const { return !Failed(); }
+
+  // Returns true iff the test failed.
+  bool Failed() const;
+
+  // Returns true iff the test fatally failed.
+  bool HasFatalFailure() const;
+
+  // Returns true iff the test has a non-fatal failure.
+  bool HasNonfatalFailure() const;
+
+  // Returns the elapsed time, in milliseconds.
+  TimeInMillis elapsed_time() const { return elapsed_time_; }
+
+  // Returns the i-th test part result among all the results. i can range
+  // from 0 to test_property_count() - 1. If i is not in that range, aborts
+  // the program.
+  const TestPartResult& GetTestPartResult(int i) const;
+
+  // Returns the i-th test property. i can range from 0 to
+  // test_property_count() - 1. If i is not in that range, aborts the
+  // program.
+  const TestProperty& GetTestProperty(int i) const;
+
+ private:
+  friend class TestInfo;
+  friend class TestCase;
+  friend class UnitTest;
+  friend class internal::DefaultGlobalTestPartResultReporter;
+  friend class internal::ExecDeathTest;
+  friend class internal::TestResultAccessor;
+  friend class internal::UnitTestImpl;
+  friend class internal::WindowsDeathTest;
+
+  // Gets the vector of TestPartResults.
+  const std::vector<TestPartResult>& test_part_results() const {
+    return test_part_results_;
+  }
+
+  // Gets the vector of TestProperties.
+  const std::vector<TestProperty>& test_properties() const {
+    return test_properties_;
+  }
+
+  // Sets the elapsed time.
+  void set_elapsed_time(TimeInMillis elapsed) { elapsed_time_ = elapsed; }
+
+  // Adds a test property to the list. The property is validated and may add
+  // a non-fatal failure if invalid (e.g., if it conflicts with reserved
+  // key names). If a property is already recorded for the same key, the
+  // value will be updated, rather than storing multiple values for the same
+  // key.  xml_element specifies the element for which the property is being
+  // recorded and is used for validation.
+  void RecordProperty(const std::string& xml_element,
+                      const TestProperty& test_property);
+
+  // Adds a failure if the key is a reserved attribute of Google Test
+  // testcase tags.  Returns true if the property is valid.
+  // TODO(russr): Validate attribute names are legal and human readable.
+  static bool ValidateTestProperty(const std::string& xml_element,
+                                   const TestProperty& test_property);
+
+  // Adds a test part result to the list.
+  void AddTestPartResult(const TestPartResult& test_part_result);
+
+  // Returns the death test count.
+  int death_test_count() const { return death_test_count_; }
+
+  // Increments the death test count, returning the new count.
+  int increment_death_test_count() { return ++death_test_count_; }
+
+  // Clears the test part results.
+  void ClearTestPartResults();
+
+  // Clears the object.
+  void Clear();
+
+  // Protects mutable state of the property vector and of owned
+  // properties, whose values may be updated.
+  internal::Mutex test_properites_mutex_;
+
+  // The vector of TestPartResults
+  std::vector<TestPartResult> test_part_results_;
+  // The vector of TestProperties
+  std::vector<TestProperty> test_properties_;
+  // Running count of death tests.
+  int death_test_count_;
+  // The elapsed time, in milliseconds.
+  TimeInMillis elapsed_time_;
+
+  // We disallow copying TestResult.
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(TestResult);
+};  // class TestResult
+
+// A TestInfo object stores the following information about a test:
+//
+//   Test case name
+//   Test name
+//   Whether the test should be run
+//   A function pointer that creates the test object when invoked
+//   Test result
+//
+// The constructor of TestInfo registers itself with the UnitTest
+// singleton such that the RUN_ALL_TESTS() macro knows which tests to
+// run.
+class GTEST_API_ TestInfo {
+ public:
+  // Destructs a TestInfo object.  This function is not virtual, so
+  // don't inherit from TestInfo.
+  ~TestInfo();
+
+  // Returns the test case name.
+  const char* test_case_name() const { return test_case_name_.c_str(); }
+
+  // Returns the test name.
+  const char* name() const { return name_.c_str(); }
+
+  // Returns the name of the parameter type, or NULL if this is not a typed
+  // or a type-parameterized test.
+  const char* type_param() const {
+    if (type_param_.get() != NULL)
+      return type_param_->c_str();
+    return NULL;
+  }
+
+  // Returns the text representation of the value parameter, or NULL if this
+  // is not a value-parameterized test.
+  const char* value_param() const {
+    if (value_param_.get() != NULL)
+      return value_param_->c_str();
+    return NULL;
+  }
+
+  // Returns true if this test should run, that is if the test is not
+  // disabled (or it is disabled but the also_run_disabled_tests flag has
+  // been specified) and its full name matches the user-specified filter.
+  //
+  // Google Test allows the user to filter the tests by their full names.
+  // The full name of a test Bar in test case Foo is defined as
+  // "Foo.Bar".  Only the tests that match the filter will run.
+  //
+  // A filter is a colon-separated list of glob (not regex) patterns,
+  // optionally followed by a '-' and a colon-separated list of
+  // negative patterns (tests to exclude).  A test is run if it
+  // matches one of the positive patterns and does not match any of
+  // the negative patterns.
+  //
+  // For example, *A*:Foo.* is a filter that matches any string that
+  // contains the character 'A' or starts with "Foo.".
+  bool should_run() const { return should_run_; }
+
+  // Returns true iff this test will appear in the XML report.
+  bool is_reportable() const {
+    // For now, the XML report includes all tests matching the filter.
+    // In the future, we may trim tests that are excluded because of
+    // sharding.
+    return matches_filter_;
+  }
+
+  // Returns the result of the test.
+  const TestResult* result() const { return &result_; }
+
+ private:
+#if GTEST_HAS_DEATH_TEST
+  friend class internal::DefaultDeathTestFactory;
+#endif  // GTEST_HAS_DEATH_TEST
+  friend class Test;
+  friend class TestCase;
+  friend class internal::UnitTestImpl;
+  friend class internal::StreamingListenerTest;
+  friend TestInfo* internal::MakeAndRegisterTestInfo(
+      const char* test_case_name,
+      const char* name,
+      const char* type_param,
+      const char* value_param,
+      internal::TypeId fixture_class_id,
+      Test::SetUpTestCaseFunc set_up_tc,
+      Test::TearDownTestCaseFunc tear_down_tc,
+      internal::TestFactoryBase* factory);
+
+  // Constructs a TestInfo object. The newly constructed instance assumes
+  // ownership of the factory object.
+  TestInfo(const std::string& test_case_name,
+           const std::string& name,
+           const char* a_type_param,   // NULL if not a type-parameterized test
+           const char* a_value_param,  // NULL if not a value-parameterized test
+           internal::TypeId fixture_class_id,
+           internal::TestFactoryBase* factory);
+
+  // Increments the number of death tests encountered in this test so
+  // far.
+  int increment_death_test_count() {
+    return result_.increment_death_test_count();
+  }
+
+  // Creates the test object, runs it, records its result, and then
+  // deletes it.
+  void Run();
+
+  static void ClearTestResult(TestInfo* test_info) {
+    test_info->result_.Clear();
+  }
+
+  // These fields are immutable properties of the test.
+  const std::string test_case_name_;     // Test case name
+  const std::string name_;               // Test name
+  // Name of the parameter type, or NULL if this is not a typed or a
+  // type-parameterized test.
+  const internal::scoped_ptr<const ::std::string> type_param_;
+  // Text representation of the value parameter, or NULL if this is not a
+  // value-parameterized test.
+  const internal::scoped_ptr<const ::std::string> value_param_;
+  const internal::TypeId fixture_class_id_;   // ID of the test fixture class
+  bool should_run_;                 // True iff this test should run
+  bool is_disabled_;                // True iff this test is disabled
+  bool matches_filter_;             // True if this test matches the
+                                    // user-specified filter.
+  internal::TestFactoryBase* const factory_;  // The factory that creates
+                                              // the test object
+
+  // This field is mutable and needs to be reset before running the
+  // test for the second time.
+  TestResult result_;
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(TestInfo);
+};
+
+// A test case, which consists of a vector of TestInfos.
+//
+// TestCase is not copyable.
+class GTEST_API_ TestCase {
+ public:
+  // Creates a TestCase with the given name.
+  //
+  // TestCase does NOT have a default constructor.  Always use this
+  // constructor to create a TestCase object.
+  //
+  // Arguments:
+  //
+  //   name:         name of the test case
+  //   a_type_param: the name of the test's type parameter, or NULL if
+  //                 this is not a type-parameterized test.
+  //   set_up_tc:    pointer to the function that sets up the test case
+  //   tear_down_tc: pointer to the function that tears down the test case
+  TestCase(const char* name, const char* a_type_param,
+           Test::SetUpTestCaseFunc set_up_tc,
+           Test::TearDownTestCaseFunc tear_down_tc);
+
+  // Destructor of TestCase.
+  virtual ~TestCase();
+
+  // Gets the name of the TestCase.
+  const char* name() const { return name_.c_str(); }
+
+  // Returns the name of the parameter type, or NULL if this is not a
+  // type-parameterized test case.
+  const char* type_param() const {
+    if (type_param_.get() != NULL)
+      return type_param_->c_str();
+    return NULL;
+  }
+
+  // Returns true if any test in this test case should run.
+  bool should_run() const { return should_run_; }
+
+  // Gets the number of successful tests in this test case.
+  int successful_test_count() const;
+
+  // Gets the number of failed tests in this test case.
+  int failed_test_count() const;
+
+  // Gets the number of disabled tests that will be reported in the XML report.
+  int reportable_disabled_test_count() const;
+
+  // Gets the number of disabled tests in this test case.
+  int disabled_test_count() const;
+
+  // Gets the number of tests to be printed in the XML report.
+  int reportable_test_count() const;
+
+  // Get the number of tests in this test case that should run.
+  int test_to_run_count() const;
+
+  // Gets the number of all tests in this test case.
+  int total_test_count() const;
+
+  // Returns true iff the test case passed.
+  bool Passed() const { return !Failed(); }
+
+  // Returns true iff the test case failed.
+  bool Failed() const { return failed_test_count() > 0; }
+
+  // Returns the elapsed time, in milliseconds.
+  TimeInMillis elapsed_time() const { return elapsed_time_; }
+
+  // Returns the i-th test among all the tests. i can range from 0 to
+  // total_test_count() - 1. If i is not in that range, returns NULL.
+  const TestInfo* GetTestInfo(int i) const;
+
+  // Returns the TestResult that holds test properties recorded during
+  // execution of SetUpTestCase and TearDownTestCase.
+  const TestResult& ad_hoc_test_result() const { return ad_hoc_test_result_; }
+
+ private:
+  friend class Test;
+  friend class internal::UnitTestImpl;
+
+  // Gets the (mutable) vector of TestInfos in this TestCase.
+  std::vector<TestInfo*>& test_info_list() { return test_info_list_; }
+
+  // Gets the (immutable) vector of TestInfos in this TestCase.
+  const std::vector<TestInfo*>& test_info_list() const {
+    return test_info_list_;
+  }
+
+  // Returns the i-th test among all the tests. i can range from 0 to
+  // total_test_count() - 1. If i is not in that range, returns NULL.
+  TestInfo* GetMutableTestInfo(int i);
+
+  // Sets the should_run member.
+  void set_should_run(bool should) { should_run_ = should; }
+
+  // Adds a TestInfo to this test case.  Will delete the TestInfo upon
+  // destruction of the TestCase object.
+  void AddTestInfo(TestInfo * test_info);
+
+  // Clears the results of all tests in this test case.
+  void ClearResult();
+
+  // Clears the results of all tests in the given test case.
+  static void ClearTestCaseResult(TestCase* test_case) {
+    test_case->ClearResult();
+  }
+
+  // Runs every test in this TestCase.
+  void Run();
+
+  // Runs SetUpTestCase() for this TestCase.  This wrapper is needed
+  // for catching exceptions thrown from SetUpTestCase().
+  void RunSetUpTestCase() { (*set_up_tc_)(); }
+
+  // Runs TearDownTestCase() for this TestCase.  This wrapper is
+  // needed for catching exceptions thrown from TearDownTestCase().
+  void RunTearDownTestCase() { (*tear_down_tc_)(); }
+
+  // Returns true iff test passed.
+  static bool TestPassed(const TestInfo* test_info) {
+    return test_info->should_run() && test_info->result()->Passed();
+  }
+
+  // Returns true iff test failed.
+  static bool TestFailed(const TestInfo* test_info) {
+    return test_info->should_run() && test_info->result()->Failed();
+  }
+
+  // Returns true iff the test is disabled and will be reported in the XML
+  // report.
+  static bool TestReportableDisabled(const TestInfo* test_info) {
+    return test_info->is_reportable() && test_info->is_disabled_;
+  }
+
+  // Returns true iff test is disabled.
+  static bool TestDisabled(const TestInfo* test_info) {
+    return test_info->is_disabled_;
+  }
+
+  // Returns true iff this test will appear in the XML report.
+  static bool TestReportable(const TestInfo* test_info) {
+    return test_info->is_reportable();
+  }
+
+  // Returns true if the given test should run.
+  static bool ShouldRunTest(const TestInfo* test_info) {
+    return test_info->should_run();
+  }
+
+  // Shuffles the tests in this test case.
+  void ShuffleTests(internal::Random* random);
+
+  // Restores the test order to before the first shuffle.
+  void UnshuffleTests();
+
+  // Name of the test case.
+  std::string name_;
+  // Name of the parameter type, or NULL if this is not a typed or a
+  // type-parameterized test.
+  const internal::scoped_ptr<const ::std::string> type_param_;
+  // The vector of TestInfos in their original order.  It owns the
+  // elements in the vector.
+  std::vector<TestInfo*> test_info_list_;
+  // Provides a level of indirection for the test list to allow easy
+  // shuffling and restoring the test order.  The i-th element in this
+  // vector is the index of the i-th test in the shuffled test list.
+  std::vector<int> test_indices_;
+  // Pointer to the function that sets up the test case.
+  Test::SetUpTestCaseFunc set_up_tc_;
+  // Pointer to the function that tears down the test case.
+  Test::TearDownTestCaseFunc tear_down_tc_;
+  // True iff any test in this test case should run.
+  bool should_run_;
+  // Elapsed time, in milliseconds.
+  TimeInMillis elapsed_time_;
+  // Holds test properties recorded during execution of SetUpTestCase and
+  // TearDownTestCase.
+  TestResult ad_hoc_test_result_;
+
+  // We disallow copying TestCases.
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(TestCase);
+};
+
+// An Environment object is capable of setting up and tearing down an
+// environment.  The user should subclass this to define his own
+// environment(s).
+//
+// An Environment object does the set-up and tear-down in virtual
+// methods SetUp() and TearDown() instead of the constructor and the
+// destructor, as:
+//
+//   1. You cannot safely throw from a destructor.  This is a problem
+//      as in some cases Google Test is used where exceptions are enabled, and
+//      we may want to implement ASSERT_* using exceptions where they are
+//      available.
+//   2. You cannot use ASSERT_* directly in a constructor or
+//      destructor.
+class Environment {
+ public:
+  // The d'tor is virtual as we need to subclass Environment.
+  virtual ~Environment() {}
+
+  // Override this to define how to set up the environment.
+  virtual void SetUp() {}
+
+  // Override this to define how to tear down the environment.
+  virtual void TearDown() {}
+ private:
+  // If you see an error about overriding the following function or
+  // about it being private, you have mis-spelled SetUp() as Setup().
+  struct Setup_should_be_spelled_SetUp {};
+  virtual Setup_should_be_spelled_SetUp* Setup() { return NULL; }
+};
+
+// The interface for tracing execution of tests. The methods are organized in
+// the order the corresponding events are fired.
+class TestEventListener {
+ public:
+  virtual ~TestEventListener() {}
+
+  // Fired before any test activity starts.
+  virtual void OnTestProgramStart(const UnitTest& unit_test) = 0;
+
+  // Fired before each iteration of tests starts.  There may be more than
+  // one iteration if GTEST_FLAG(repeat) is set. iteration is the iteration
+  // index, starting from 0.
+  virtual void OnTestIterationStart(const UnitTest& unit_test,
+                                    int iteration) = 0;
+
+  // Fired before environment set-up for each iteration of tests starts.
+  virtual void OnEnvironmentsSetUpStart(const UnitTest& unit_test) = 0;
+
+  // Fired after environment set-up for each iteration of tests ends.
+  virtual void OnEnvironmentsSetUpEnd(const UnitTest& unit_test) = 0;
+
+  // Fired before the test case starts.
+  virtual void OnTestCaseStart(const TestCase& test_case) = 0;
+
+  // Fired before the test starts.
+  virtual void OnTestStart(const TestInfo& test_info) = 0;
+
+  // Fired after a failed assertion or a SUCCEED() invocation.
+  virtual void OnTestPartResult(const TestPartResult& test_part_result) = 0;
+
+  // Fired after the test ends.
+  virtual void OnTestEnd(const TestInfo& test_info) = 0;
+
+  // Fired after the test case ends.
+  virtual void OnTestCaseEnd(const TestCase& test_case) = 0;
+
+  // Fired before environment tear-down for each iteration of tests starts.
+  virtual void OnEnvironmentsTearDownStart(const UnitTest& unit_test) = 0;
+
+  // Fired after environment tear-down for each iteration of tests ends.
+  virtual void OnEnvironmentsTearDownEnd(const UnitTest& unit_test) = 0;
+
+  // Fired after each iteration of tests finishes.
+  virtual void OnTestIterationEnd(const UnitTest& unit_test,
+                                  int iteration) = 0;
+
+  // Fired after all test activities have ended.
+  virtual void OnTestProgramEnd(const UnitTest& unit_test) = 0;
+};
+
+// The convenience class for users who need to override just one or two
+// methods and are not concerned that a possible change to a signature of
+// the methods they override will not be caught during the build.  For
+// comments about each method please see the definition of TestEventListener
+// above.
+class EmptyTestEventListener : public TestEventListener {
+ public:
+  virtual void OnTestProgramStart(const UnitTest& /*unit_test*/) {}
+  virtual void OnTestIterationStart(const UnitTest& /*unit_test*/,
+                                    int /*iteration*/) {}
+  virtual void OnEnvironmentsSetUpStart(const UnitTest& /*unit_test*/) {}
+  virtual void OnEnvironmentsSetUpEnd(const UnitTest& /*unit_test*/) {}
+  virtual void OnTestCaseStart(const TestCase& /*test_case*/) {}
+  virtual void OnTestStart(const TestInfo& /*test_info*/) {}
+  virtual void OnTestPartResult(const TestPartResult& /*test_part_result*/) {}
+  virtual void OnTestEnd(const TestInfo& /*test_info*/) {}
+  virtual void OnTestCaseEnd(const TestCase& /*test_case*/) {}
+  virtual void OnEnvironmentsTearDownStart(const UnitTest& /*unit_test*/) {}
+  virtual void OnEnvironmentsTearDownEnd(const UnitTest& /*unit_test*/) {}
+  virtual void OnTestIterationEnd(const UnitTest& /*unit_test*/,
+                                  int /*iteration*/) {}
+  virtual void OnTestProgramEnd(const UnitTest& /*unit_test*/) {}
+};
+
+// TestEventListeners lets users add listeners to track events in Google Test.
+class GTEST_API_ TestEventListeners {
+ public:
+  TestEventListeners();
+  ~TestEventListeners();
+
+  // Appends an event listener to the end of the list. Google Test assumes
+  // the ownership of the listener (i.e. it will delete the listener when
+  // the test program finishes).
+  void Append(TestEventListener* listener);
+
+  // Removes the given event listener from the list and returns it.  It then
+  // becomes the caller's responsibility to delete the listener. Returns
+  // NULL if the listener is not found in the list.
+  TestEventListener* Release(TestEventListener* listener);
+
+  // Returns the standard listener responsible for the default console
+  // output.  Can be removed from the listeners list to shut down default
+  // console output.  Note that removing this object from the listener list
+  // with Release transfers its ownership to the caller and makes this
+  // function return NULL the next time.
+  TestEventListener* default_result_printer() const {
+    return default_result_printer_;
+  }
+
+  // Returns the standard listener responsible for the default XML output
+  // controlled by the --gtest_output=xml flag.  Can be removed from the
+  // listeners list by users who want to shut down the default XML output
+  // controlled by this flag and substitute it with custom one.  Note that
+  // removing this object from the listener list with Release transfers its
+  // ownership to the caller and makes this function return NULL the next
+  // time.
+  TestEventListener* default_xml_generator() const {
+    return default_xml_generator_;
+  }
+
+ private:
+  friend class TestCase;
+  friend class TestInfo;
+  friend class internal::DefaultGlobalTestPartResultReporter;
+  friend class internal::NoExecDeathTest;
+  friend class internal::TestEventListenersAccessor;
+  friend class internal::UnitTestImpl;
+
+  // Returns repeater that broadcasts the TestEventListener events to all
+  // subscribers.
+  TestEventListener* repeater();
+
+  // Sets the default_result_printer attribute to the provided listener.
+  // The listener is also added to the listener list and previous
+  // default_result_printer is removed from it and deleted. The listener can
+  // also be NULL in which case it will not be added to the list. Does
+  // nothing if the previous and the current listener objects are the same.
+  void SetDefaultResultPrinter(TestEventListener* listener);
+
+  // Sets the default_xml_generator attribute to the provided listener.  The
+  // listener is also added to the listener list and previous
+  // default_xml_generator is removed from it and deleted. The listener can
+  // also be NULL in which case it will not be added to the list. Does
+  // nothing if the previous and the current listener objects are the same.
+  void SetDefaultXmlGenerator(TestEventListener* listener);
+
+  // Controls whether events will be forwarded by the repeater to the
+  // listeners in the list.
+  bool EventForwardingEnabled() const;
+  void SuppressEventForwarding();
+
+  // The actual list of listeners.
+  internal::TestEventRepeater* repeater_;
+  // Listener responsible for the standard result output.
+  TestEventListener* default_result_printer_;
+  // Listener responsible for the creation of the XML output file.
+  TestEventListener* default_xml_generator_;
+
+  // We disallow copying TestEventListeners.
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(TestEventListeners);
+};
+
+// A UnitTest consists of a vector of TestCases.
+//
+// This is a singleton class.  The only instance of UnitTest is
+// created when UnitTest::GetInstance() is first called.  This
+// instance is never deleted.
+//
+// UnitTest is not copyable.
+//
+// This class is thread-safe as long as the methods are called
+// according to their specification.
+class GTEST_API_ UnitTest {
+ public:
+  // Gets the singleton UnitTest object.  The first time this method
+  // is called, a UnitTest object is constructed and returned.
+  // Consecutive calls will return the same object.
+  static UnitTest* GetInstance();
+
+  // Runs all tests in this UnitTest object and prints the result.
+  // Returns 0 if successful, or 1 otherwise.
+  //
+  // This method can only be called from the main thread.
+  //
+  // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
+  int Run() GTEST_MUST_USE_RESULT_;
+
+  // Returns the working directory when the first TEST() or TEST_F()
+  // was executed.  The UnitTest object owns the string.
+  const char* original_working_dir() const;
+
+  // Returns the TestCase object for the test that's currently running,
+  // or NULL if no test is running.
+  const TestCase* current_test_case() const
+      GTEST_LOCK_EXCLUDED_(mutex_);
+
+  // Returns the TestInfo object for the test that's currently running,
+  // or NULL if no test is running.
+  const TestInfo* current_test_info() const
+      GTEST_LOCK_EXCLUDED_(mutex_);
+
+  // Returns the random seed used at the start of the current test run.
+  int random_seed() const;
+
+#if GTEST_HAS_PARAM_TEST
+  // Returns the ParameterizedTestCaseRegistry object used to keep track of
+  // value-parameterized tests and instantiate and register them.
+  //
+  // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
+  internal::ParameterizedTestCaseRegistry& parameterized_test_registry()
+      GTEST_LOCK_EXCLUDED_(mutex_);
+#endif  // GTEST_HAS_PARAM_TEST
+
+  // Gets the number of successful test cases.
+  int successful_test_case_count() const;
+
+  // Gets the number of failed test cases.
+  int failed_test_case_count() const;
+
+  // Gets the number of all test cases.
+  int total_test_case_count() const;
+
+  // Gets the number of all test cases that contain at least one test
+  // that should run.
+  int test_case_to_run_count() const;
+
+  // Gets the number of successful tests.
+  int successful_test_count() const;
+
+  // Gets the number of failed tests.
+  int failed_test_count() const;
+
+  // Gets the number of disabled tests that will be reported in the XML report.
+  int reportable_disabled_test_count() const;
+
+  // Gets the number of disabled tests.
+  int disabled_test_count() const;
+
+  // Gets the number of tests to be printed in the XML report.
+  int reportable_test_count() const;
+
+  // Gets the number of all tests.
+  int total_test_count() const;
+
+  // Gets the number of tests that should run.
+  int test_to_run_count() const;
+
+  // Gets the time of the test program start, in ms from the start of the
+  // UNIX epoch.
+  TimeInMillis start_timestamp() const;
+
+  // Gets the elapsed time, in milliseconds.
+  TimeInMillis elapsed_time() const;
+
+  // Returns true iff the unit test passed (i.e. all test cases passed).
+  bool Passed() const;
+
+  // Returns true iff the unit test failed (i.e. some test case failed
+  // or something outside of all tests failed).
+  bool Failed() const;
+
+  // Gets the i-th test case among all the test cases. i can range from 0 to
+  // total_test_case_count() - 1. If i is not in that range, returns NULL.
+  const TestCase* GetTestCase(int i) const;
+
+  // Returns the TestResult containing information on test failures and
+  // properties logged outside of individual test cases.
+  const TestResult& ad_hoc_test_result() const;
+
+  // Returns the list of event listeners that can be used to track events
+  // inside Google Test.
+  TestEventListeners& listeners();
+
+ private:
+  // Registers and returns a global test environment.  When a test
+  // program is run, all global test environments will be set-up in
+  // the order they were registered.  After all tests in the program
+  // have finished, all global test environments will be torn-down in
+  // the *reverse* order they were registered.
+  //
+  // The UnitTest object takes ownership of the given environment.
+  //
+  // This method can only be called from the main thread.
+  Environment* AddEnvironment(Environment* env);
+
+  // Adds a TestPartResult to the current TestResult object.  All
+  // Google Test assertion macros (e.g. ASSERT_TRUE, EXPECT_EQ, etc)
+  // eventually call this to report their results.  The user code
+  // should use the assertion macros instead of calling this directly.
+  void AddTestPartResult(TestPartResult::Type result_type,
+                         const char* file_name,
+                         int line_number,
+                         const std::string& message,
+                         const std::string& os_stack_trace)
+      GTEST_LOCK_EXCLUDED_(mutex_);
+
+  // Adds a TestProperty to the current TestResult object when invoked from
+  // inside a test, to current TestCase's ad_hoc_test_result_ when invoked
+  // from SetUpTestCase or TearDownTestCase, or to the global property set
+  // when invoked elsewhere.  If the result already contains a property with
+  // the same key, the value will be updated.
+  void RecordProperty(const std::string& key, const std::string& value);
+
+  // Gets the i-th test case among all the test cases. i can range from 0 to
+  // total_test_case_count() - 1. If i is not in that range, returns NULL.
+  TestCase* GetMutableTestCase(int i);
+
+  // Accessors for the implementation object.
+  internal::UnitTestImpl* impl() { return impl_; }
+  const internal::UnitTestImpl* impl() const { return impl_; }
+
+  // These classes and funcions are friends as they need to access private
+  // members of UnitTest.
+  friend class Test;
+  friend class internal::AssertHelper;
+  friend class internal::ScopedTrace;
+  friend class internal::StreamingListenerTest;
+  friend class internal::UnitTestRecordPropertyTestHelper;
+  friend Environment* AddGlobalTestEnvironment(Environment* env);
+  friend internal::UnitTestImpl* internal::GetUnitTestImpl();
+  friend void internal::ReportFailureInUnknownLocation(
+      TestPartResult::Type result_type,
+      const std::string& message);
+
+  // Creates an empty UnitTest.
+  UnitTest();
+
+  // D'tor
+  virtual ~UnitTest();
+
+  // Pushes a trace defined by SCOPED_TRACE() on to the per-thread
+  // Google Test trace stack.
+  void PushGTestTrace(const internal::TraceInfo& trace)
+      GTEST_LOCK_EXCLUDED_(mutex_);
+
+  // Pops a trace from the per-thread Google Test trace stack.
+  void PopGTestTrace()
+      GTEST_LOCK_EXCLUDED_(mutex_);
+
+  // Protects mutable state in *impl_.  This is mutable as some const
+  // methods need to lock it too.
+  mutable internal::Mutex mutex_;
+
+  // Opaque implementation object.  This field is never changed once
+  // the object is constructed.  We don't mark it as const here, as
+  // doing so will cause a warning in the constructor of UnitTest.
+  // Mutable state in *impl_ is protected by mutex_.
+  internal::UnitTestImpl* impl_;
+
+  // We disallow copying UnitTest.
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(UnitTest);
+};
+
+// A convenient wrapper for adding an environment for the test
+// program.
+//
+// You should call this before RUN_ALL_TESTS() is called, probably in
+// main().  If you use gtest_main, you need to call this before main()
+// starts for it to take effect.  For example, you can define a global
+// variable like this:
+//
+//   testing::Environment* const foo_env =
+//       testing::AddGlobalTestEnvironment(new FooEnvironment);
+//
+// However, we strongly recommend you to write your own main() and
+// call AddGlobalTestEnvironment() there, as relying on initialization
+// of global variables makes the code harder to read and may cause
+// problems when you register multiple environments from different
+// translation units and the environments have dependencies among them
+// (remember that the compiler doesn't guarantee the order in which
+// global variables from different translation units are initialized).
+inline Environment* AddGlobalTestEnvironment(Environment* env) {
+  return UnitTest::GetInstance()->AddEnvironment(env);
+}
+
+// Initializes Google Test.  This must be called before calling
+// RUN_ALL_TESTS().  In particular, it parses a command line for the
+// flags that Google Test recognizes.  Whenever a Google Test flag is
+// seen, it is removed from argv, and *argc is decremented.
+//
+// No value is returned.  Instead, the Google Test flag variables are
+// updated.
+//
+// Calling the function for the second time has no user-visible effect.
+GTEST_API_ void InitGoogleTest(int* argc, char** argv);
+
+// This overloaded version can be used in Windows programs compiled in
+// UNICODE mode.
+GTEST_API_ void InitGoogleTest(int* argc, wchar_t** argv);
+
+namespace internal {
+
+// FormatForComparison<ToPrint, OtherOperand>::Format(value) formats a
+// value of type ToPrint that is an operand of a comparison assertion
+// (e.g. ASSERT_EQ).  OtherOperand is the type of the other operand in
+// the comparison, and is used to help determine the best way to
+// format the value.  In particular, when the value is a C string
+// (char pointer) and the other operand is an STL string object, we
+// want to format the C string as a string, since we know it is
+// compared by value with the string object.  If the value is a char
+// pointer but the other operand is not an STL string object, we don't
+// know whether the pointer is supposed to point to a NUL-terminated
+// string, and thus want to print it as a pointer to be safe.
+//
+// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
+
+// The default case.
+template <typename ToPrint, typename OtherOperand>
+class FormatForComparison {
+ public:
+  static ::std::string Format(const ToPrint& value) {
+    return ::testing::PrintToString(value);
+  }
+};
+
+// Array.
+template <typename ToPrint, size_t N, typename OtherOperand>
+class FormatForComparison<ToPrint[N], OtherOperand> {
+ public:
+  static ::std::string Format(const ToPrint* value) {
+    return FormatForComparison<const ToPrint*, OtherOperand>::Format(value);
+  }
+};
+
+// By default, print C string as pointers to be safe, as we don't know
+// whether they actually point to a NUL-terminated string.
+
+#define GTEST_IMPL_FORMAT_C_STRING_AS_POINTER_(CharType)                \
+  template <typename OtherOperand>                                      \
+  class FormatForComparison<CharType*, OtherOperand> {                  \
+   public:                                                              \
+    static ::std::string Format(CharType* value) {                      \
+      return ::testing::PrintToString(static_cast<const void*>(value)); \
+    }                                                                   \
+  }
+
+GTEST_IMPL_FORMAT_C_STRING_AS_POINTER_(char);
+GTEST_IMPL_FORMAT_C_STRING_AS_POINTER_(const char);
+GTEST_IMPL_FORMAT_C_STRING_AS_POINTER_(wchar_t);
+GTEST_IMPL_FORMAT_C_STRING_AS_POINTER_(const wchar_t);
+
+#undef GTEST_IMPL_FORMAT_C_STRING_AS_POINTER_
+
+// If a C string is compared with an STL string object, we know it's meant
+// to point to a NUL-terminated string, and thus can print it as a string.
+
+#define GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(CharType, OtherStringType) \
+  template <>                                                           \
+  class FormatForComparison<CharType*, OtherStringType> {               \
+   public:                                                              \
+    static ::std::string Format(CharType* value) {                      \
+      return ::testing::PrintToString(value);                           \
+    }                                                                   \
+  }
+
+GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(char, ::std::string);
+GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(const char, ::std::string);
+
+#if GTEST_HAS_GLOBAL_STRING
+GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(char, ::string);
+GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(const char, ::string);
+#endif
+
+#if GTEST_HAS_GLOBAL_WSTRING
+GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(wchar_t, ::wstring);
+GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(const wchar_t, ::wstring);
+#endif
+
+#if GTEST_HAS_STD_WSTRING
+GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(wchar_t, ::std::wstring);
+GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(const wchar_t, ::std::wstring);
+#endif
+
+#undef GTEST_IMPL_FORMAT_C_STRING_AS_STRING_
+
+// Formats a comparison assertion (e.g. ASSERT_EQ, EXPECT_LT, and etc)
+// operand to be used in a failure message.  The type (but not value)
+// of the other operand may affect the format.  This allows us to
+// print a char* as a raw pointer when it is compared against another
+// char* or void*, and print it as a C string when it is compared
+// against an std::string object, for example.
+//
+// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
+template <typename T1, typename T2>
+std::string FormatForComparisonFailureMessage(
+    const T1& value, const T2& /* other_operand */) {
+  return FormatForComparison<T1, T2>::Format(value);
+}
+
+// The helper function for {ASSERT|EXPECT}_EQ.
+template <typename T1, typename T2>
+AssertionResult CmpHelperEQ(const char* expected_expression,
+                            const char* actual_expression,
+                            const T1& expected,
+                            const T2& actual) {
+#ifdef _MSC_VER
+# pragma warning(push)          // Saves the current warning state.
+# pragma warning(disable:4389)  // Temporarily disables warning on
+                                // signed/unsigned mismatch.
+#endif
+
+  if (expected == actual) {
+    return AssertionSuccess();
+  }
+
+#ifdef _MSC_VER
+# pragma warning(pop)          // Restores the warning state.
+#endif
+
+  return EqFailure(expected_expression,
+                   actual_expression,
+                   FormatForComparisonFailureMessage(expected, actual),
+                   FormatForComparisonFailureMessage(actual, expected),
+                   false);
+}
+
+// With this overloaded version, we allow anonymous enums to be used
+// in {ASSERT|EXPECT}_EQ when compiled with gcc 4, as anonymous enums
+// can be implicitly cast to BiggestInt.
+GTEST_API_ AssertionResult CmpHelperEQ(const char* expected_expression,
+                                       const char* actual_expression,
+                                       BiggestInt expected,
+                                       BiggestInt actual);
+
+// The helper class for {ASSERT|EXPECT}_EQ.  The template argument
+// lhs_is_null_literal is true iff the first argument to ASSERT_EQ()
+// is a null pointer literal.  The following default implementation is
+// for lhs_is_null_literal being false.
+template <bool lhs_is_null_literal>
+class EqHelper {
+ public:
+  // This templatized version is for the general case.
+  template <typename T1, typename T2>
+  static AssertionResult Compare(const char* expected_expression,
+                                 const char* actual_expression,
+                                 const T1& expected,
+                                 const T2& actual) {
+    return CmpHelperEQ(expected_expression, actual_expression, expected,
+                       actual);
+  }
+
+  // With this overloaded version, we allow anonymous enums to be used
+  // in {ASSERT|EXPECT}_EQ when compiled with gcc 4, as anonymous
+  // enums can be implicitly cast to BiggestInt.
+  //
+  // Even though its body looks the same as the above version, we
+  // cannot merge the two, as it will make anonymous enums unhappy.
+  static AssertionResult Compare(const char* expected_expression,
+                                 const char* actual_expression,
+                                 BiggestInt expected,
+                                 BiggestInt actual) {
+    return CmpHelperEQ(expected_expression, actual_expression, expected,
+                       actual);
+  }
+};
+
+// This specialization is used when the first argument to ASSERT_EQ()
+// is a null pointer literal, like NULL, false, or 0.
+template <>
+class EqHelper<true> {
+ public:
+  // We define two overloaded versions of Compare().  The first
+  // version will be picked when the second argument to ASSERT_EQ() is
+  // NOT a pointer, e.g. ASSERT_EQ(0, AnIntFunction()) or
+  // EXPECT_EQ(false, a_bool).
+  template <typename T1, typename T2>
+  static AssertionResult Compare(
+      const char* expected_expression,
+      const char* actual_expression,
+      const T1& expected,
+      const T2& actual,
+      // The following line prevents this overload from being considered if T2
+      // is not a pointer type.  We need this because ASSERT_EQ(NULL, my_ptr)
+      // expands to Compare("", "", NULL, my_ptr), which requires a conversion
+      // to match the Secret* in the other overload, which would otherwise make
+      // this template match better.
+      typename EnableIf<!is_pointer<T2>::value>::type* = 0) {
+    return CmpHelperEQ(expected_expression, actual_expression, expected,
+                       actual);
+  }
+
+  // This version will be picked when the second argument to ASSERT_EQ() is a
+  // pointer, e.g. ASSERT_EQ(NULL, a_pointer).
+  template <typename T>
+  static AssertionResult Compare(
+      const char* expected_expression,
+      const char* actual_expression,
+      // We used to have a second template parameter instead of Secret*.  That
+      // template parameter would deduce to 'long', making this a better match
+      // than the first overload even without the first overload's EnableIf.
+      // Unfortunately, gcc with -Wconversion-null warns when "passing NULL to
+      // non-pointer argument" (even a deduced integral argument), so the old
+      // implementation caused warnings in user code.
+      Secret* /* expected (NULL) */,
+      T* actual) {
+    // We already know that 'expected' is a null pointer.
+    return CmpHelperEQ(expected_expression, actual_expression,
+                       static_cast<T*>(NULL), actual);
+  }
+};
+
+// A macro for implementing the helper functions needed to implement
+// ASSERT_?? and EXPECT_??.  It is here just to avoid copy-and-paste
+// of similar code.
+//
+// For each templatized helper function, we also define an overloaded
+// version for BiggestInt in order to reduce code bloat and allow
+// anonymous enums to be used with {ASSERT|EXPECT}_?? when compiled
+// with gcc 4.
+//
+// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
+#define GTEST_IMPL_CMP_HELPER_(op_name, op)\
+template <typename T1, typename T2>\
+AssertionResult CmpHelper##op_name(const char* expr1, const char* expr2, \
+                                   const T1& val1, const T2& val2) {\
+  if (val1 op val2) {\
+    return AssertionSuccess();\
+  } else {\
+    return AssertionFailure() \
+        << "Expected: (" << expr1 << ") " #op " (" << expr2\
+        << "), actual: " << FormatForComparisonFailureMessage(val1, val2)\
+        << " vs " << FormatForComparisonFailureMessage(val2, val1);\
+  }\
+}\
+GTEST_API_ AssertionResult CmpHelper##op_name(\
+    const char* expr1, const char* expr2, BiggestInt val1, BiggestInt val2)
+
+// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
+
+// Implements the helper function for {ASSERT|EXPECT}_NE
+GTEST_IMPL_CMP_HELPER_(NE, !=);
+// Implements the helper function for {ASSERT|EXPECT}_LE
+GTEST_IMPL_CMP_HELPER_(LE, <=);
+// Implements the helper function for {ASSERT|EXPECT}_LT
+GTEST_IMPL_CMP_HELPER_(LT, <);
+// Implements the helper function for {ASSERT|EXPECT}_GE
+GTEST_IMPL_CMP_HELPER_(GE, >=);
+// Implements the helper function for {ASSERT|EXPECT}_GT
+GTEST_IMPL_CMP_HELPER_(GT, >);
+
+#undef GTEST_IMPL_CMP_HELPER_
+
+// The helper function for {ASSERT|EXPECT}_STREQ.
+//
+// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
+GTEST_API_ AssertionResult CmpHelperSTREQ(const char* expected_expression,
+                                          const char* actual_expression,
+                                          const char* expected,
+                                          const char* actual);
+
+// The helper function for {ASSERT|EXPECT}_STRCASEEQ.
+//
+// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
+GTEST_API_ AssertionResult CmpHelperSTRCASEEQ(const char* expected_expression,
+                                              const char* actual_expression,
+                                              const char* expected,
+                                              const char* actual);
+
+// The helper function for {ASSERT|EXPECT}_STRNE.
+//
+// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
+GTEST_API_ AssertionResult CmpHelperSTRNE(const char* s1_expression,
+                                          const char* s2_expression,
+                                          const char* s1,
+                                          const char* s2);
+
+// The helper function for {ASSERT|EXPECT}_STRCASENE.
+//
+// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
+GTEST_API_ AssertionResult CmpHelperSTRCASENE(const char* s1_expression,
+                                              const char* s2_expression,
+                                              const char* s1,
+                                              const char* s2);
+
+
+// Helper function for *_STREQ on wide strings.
+//
+// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
+GTEST_API_ AssertionResult CmpHelperSTREQ(const char* expected_expression,
+                                          const char* actual_expression,
+                                          const wchar_t* expected,
+                                          const wchar_t* actual);
+
+// Helper function for *_STRNE on wide strings.
+//
+// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
+GTEST_API_ AssertionResult CmpHelperSTRNE(const char* s1_expression,
+                                          const char* s2_expression,
+                                          const wchar_t* s1,
+                                          const wchar_t* s2);
+
+}  // namespace internal
+
+// IsSubstring() and IsNotSubstring() are intended to be used as the
+// first argument to {EXPECT,ASSERT}_PRED_FORMAT2(), not by
+// themselves.  They check whether needle is a substring of haystack
+// (NULL is considered a substring of itself only), and return an
+// appropriate error message when they fail.
+//
+// The {needle,haystack}_expr arguments are the stringified
+// expressions that generated the two real arguments.
+GTEST_API_ AssertionResult IsSubstring(
+    const char* needle_expr, const char* haystack_expr,
+    const char* needle, const char* haystack);
+GTEST_API_ AssertionResult IsSubstring(
+    const char* needle_expr, const char* haystack_expr,
+    const wchar_t* needle, const wchar_t* haystack);
+GTEST_API_ AssertionResult IsNotSubstring(
+    const char* needle_expr, const char* haystack_expr,
+    const char* needle, const char* haystack);
+GTEST_API_ AssertionResult IsNotSubstring(
+    const char* needle_expr, const char* haystack_expr,
+    const wchar_t* needle, const wchar_t* haystack);
+GTEST_API_ AssertionResult IsSubstring(
+    const char* needle_expr, const char* haystack_expr,
+    const ::std::string& needle, const ::std::string& haystack);
+GTEST_API_ AssertionResult IsNotSubstring(
+    const char* needle_expr, const char* haystack_expr,
+    const ::std::string& needle, const ::std::string& haystack);
+
+#if GTEST_HAS_STD_WSTRING
+GTEST_API_ AssertionResult IsSubstring(
+    const char* needle_expr, const char* haystack_expr,
+    const ::std::wstring& needle, const ::std::wstring& haystack);
+GTEST_API_ AssertionResult IsNotSubstring(
+    const char* needle_expr, const char* haystack_expr,
+    const ::std::wstring& needle, const ::std::wstring& haystack);
+#endif  // GTEST_HAS_STD_WSTRING
+
+namespace internal {
+
+// Helper template function for comparing floating-points.
+//
+// Template parameter:
+//
+//   RawType: the raw floating-point type (either float or double)
+//
+// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
+template <typename RawType>
+AssertionResult CmpHelperFloatingPointEQ(const char* expected_expression,
+                                         const char* actual_expression,
+                                         RawType expected,
+                                         RawType actual) {
+  const FloatingPoint<RawType> lhs(expected), rhs(actual);
+
+  if (lhs.AlmostEquals(rhs)) {
+    return AssertionSuccess();
+  }
+
+  ::std::stringstream expected_ss;
+  expected_ss << std::setprecision(std::numeric_limits<RawType>::digits10 + 2)
+              << expected;
+
+  ::std::stringstream actual_ss;
+  actual_ss << std::setprecision(std::numeric_limits<RawType>::digits10 + 2)
+            << actual;
+
+  return EqFailure(expected_expression,
+                   actual_expression,
+                   StringStreamToString(&expected_ss),
+                   StringStreamToString(&actual_ss),
+                   false);
+}
+
+// Helper function for implementing ASSERT_NEAR.
+//
+// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
+GTEST_API_ AssertionResult DoubleNearPredFormat(const char* expr1,
+                                                const char* expr2,
+                                                const char* abs_error_expr,
+                                                double val1,
+                                                double val2,
+                                                double abs_error);
+
+// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
+// A class that enables one to stream messages to assertion macros
+class GTEST_API_ AssertHelper {
+ public:
+  // Constructor.
+  AssertHelper(TestPartResult::Type type,
+               const char* file,
+               int line,
+               const char* message);
+  ~AssertHelper();
+
+  // Message assignment is a semantic trick to enable assertion
+  // streaming; see the GTEST_MESSAGE_ macro below.
+  void operator=(const Message& message) const;
+
+ private:
+  // We put our data in a struct so that the size of the AssertHelper class can
+  // be as small as possible.  This is important because gcc is incapable of
+  // re-using stack space even for temporary variables, so every EXPECT_EQ
+  // reserves stack space for another AssertHelper.
+  struct AssertHelperData {
+    AssertHelperData(TestPartResult::Type t,
+                     const char* srcfile,
+                     int line_num,
+                     const char* msg)
+        : type(t), file(srcfile), line(line_num), message(msg) { }
+
+    TestPartResult::Type const type;
+    const char* const file;
+    int const line;
+    std::string const message;
+
+   private:
+    GTEST_DISALLOW_COPY_AND_ASSIGN_(AssertHelperData);
+  };
+
+  AssertHelperData* const data_;
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(AssertHelper);
+};
+
+}  // namespace internal
+
+#if GTEST_HAS_PARAM_TEST
+// The pure interface class that all value-parameterized tests inherit from.
+// A value-parameterized class must inherit from both ::testing::Test and
+// ::testing::WithParamInterface. In most cases that just means inheriting
+// from ::testing::TestWithParam, but more complicated test hierarchies
+// may need to inherit from Test and WithParamInterface at different levels.
+//
+// This interface has support for accessing the test parameter value via
+// the GetParam() method.
+//
+// Use it with one of the parameter generator defining functions, like Range(),
+// Values(), ValuesIn(), Bool(), and Combine().
+//
+// class FooTest : public ::testing::TestWithParam<int> {
+//  protected:
+//   FooTest() {
+//     // Can use GetParam() here.
+//   }
+//   virtual ~FooTest() {
+//     // Can use GetParam() here.
+//   }
+//   virtual void SetUp() {
+//     // Can use GetParam() here.
+//   }
+//   virtual void TearDown {
+//     // Can use GetParam() here.
+//   }
+// };
+// TEST_P(FooTest, DoesBar) {
+//   // Can use GetParam() method here.
+//   Foo foo;
+//   ASSERT_TRUE(foo.DoesBar(GetParam()));
+// }
+// INSTANTIATE_TEST_CASE_P(OneToTenRange, FooTest, ::testing::Range(1, 10));
+
+template <typename T>
+class WithParamInterface {
+ public:
+  typedef T ParamType;
+  virtual ~WithParamInterface() {}
+
+  // The current parameter value. Is also available in the test fixture's
+  // constructor. This member function is non-static, even though it only
+  // references static data, to reduce the opportunity for incorrect uses
+  // like writing 'WithParamInterface<bool>::GetParam()' for a test that
+  // uses a fixture whose parameter type is int.
+  const ParamType& GetParam() const {
+    GTEST_CHECK_(parameter_ != NULL)
+        << "GetParam() can only be called inside a value-parameterized test "
+        << "-- did you intend to write TEST_P instead of TEST_F?";
+    return *parameter_;
+  }
+
+ private:
+  // Sets parameter value. The caller is responsible for making sure the value
+  // remains alive and unchanged throughout the current test.
+  static void SetParam(const ParamType* parameter) {
+    parameter_ = parameter;
+  }
+
+  // Static value used for accessing parameter during a test lifetime.
+  static const ParamType* parameter_;
+
+  // TestClass must be a subclass of WithParamInterface<T> and Test.
+  template <class TestClass> friend class internal::ParameterizedTestFactory;
+};
+
+template <typename T>
+const T* WithParamInterface<T>::parameter_ = NULL;
+
+// Most value-parameterized classes can ignore the existence of
+// WithParamInterface, and can just inherit from ::testing::TestWithParam.
+
+template <typename T>
+class TestWithParam : public Test, public WithParamInterface<T> {
+};
+
+#endif  // GTEST_HAS_PARAM_TEST
+
+// Macros for indicating success/failure in test code.
+
+// ADD_FAILURE unconditionally adds a failure to the current test.
+// SUCCEED generates a success - it doesn't automatically make the
+// current test successful, as a test is only successful when it has
+// no failure.
+//
+// EXPECT_* verifies that a certain condition is satisfied.  If not,
+// it behaves like ADD_FAILURE.  In particular:
+//
+//   EXPECT_TRUE  verifies that a Boolean condition is true.
+//   EXPECT_FALSE verifies that a Boolean condition is false.
+//
+// FAIL and ASSERT_* are similar to ADD_FAILURE and EXPECT_*, except
+// that they will also abort the current function on failure.  People
+// usually want the fail-fast behavior of FAIL and ASSERT_*, but those
+// writing data-driven tests often find themselves using ADD_FAILURE
+// and EXPECT_* more.
+
+// Generates a nonfatal failure with a generic message.
+#define ADD_FAILURE() GTEST_NONFATAL_FAILURE_("Failed")
+
+// Generates a nonfatal failure at the given source file location with
+// a generic message.
+#define ADD_FAILURE_AT(file, line) \
+  GTEST_MESSAGE_AT_(file, line, "Failed", \
+                    ::testing::TestPartResult::kNonFatalFailure)
+
+// Generates a fatal failure with a generic message.
+#define GTEST_FAIL() GTEST_FATAL_FAILURE_("Failed")
+
+// Define this macro to 1 to omit the definition of FAIL(), which is a
+// generic name and clashes with some other libraries.
+#if !GTEST_DONT_DEFINE_FAIL
+# define FAIL() GTEST_FAIL()
+#endif
+
+// Generates a success with a generic message.
+#define GTEST_SUCCEED() GTEST_SUCCESS_("Succeeded")
+
+// Define this macro to 1 to omit the definition of SUCCEED(), which
+// is a generic name and clashes with some other libraries.
+#if !GTEST_DONT_DEFINE_SUCCEED
+# define SUCCEED() GTEST_SUCCEED()
+#endif
+
+// Macros for testing exceptions.
+//
+//    * {ASSERT|EXPECT}_THROW(statement, expected_exception):
+//         Tests that the statement throws the expected exception.
+//    * {ASSERT|EXPECT}_NO_THROW(statement):
+//         Tests that the statement doesn't throw any exception.
+//    * {ASSERT|EXPECT}_ANY_THROW(statement):
+//         Tests that the statement throws an exception.
+
+#define EXPECT_THROW(statement, expected_exception) \
+  GTEST_TEST_THROW_(statement, expected_exception, GTEST_NONFATAL_FAILURE_)
+#define EXPECT_NO_THROW(statement) \
+  GTEST_TEST_NO_THROW_(statement, GTEST_NONFATAL_FAILURE_)
+#define EXPECT_ANY_THROW(statement) \
+  GTEST_TEST_ANY_THROW_(statement, GTEST_NONFATAL_FAILURE_)
+#define ASSERT_THROW(statement, expected_exception) \
+  GTEST_TEST_THROW_(statement, expected_exception, GTEST_FATAL_FAILURE_)
+#define ASSERT_NO_THROW(statement) \
+  GTEST_TEST_NO_THROW_(statement, GTEST_FATAL_FAILURE_)
+#define ASSERT_ANY_THROW(statement) \
+  GTEST_TEST_ANY_THROW_(statement, GTEST_FATAL_FAILURE_)
+
+// Boolean assertions. Condition can be either a Boolean expression or an
+// AssertionResult. For more information on how to use AssertionResult with
+// these macros see comments on that class.
+#define EXPECT_TRUE(condition) \
+  GTEST_TEST_BOOLEAN_(condition, #condition, false, true, \
+                      GTEST_NONFATAL_FAILURE_)
+#define EXPECT_FALSE(condition) \
+  GTEST_TEST_BOOLEAN_(!(condition), #condition, true, false, \
+                      GTEST_NONFATAL_FAILURE_)
+#define ASSERT_TRUE(condition) \
+  GTEST_TEST_BOOLEAN_(condition, #condition, false, true, \
+                      GTEST_FATAL_FAILURE_)
+#define ASSERT_FALSE(condition) \
+  GTEST_TEST_BOOLEAN_(!(condition), #condition, true, false, \
+                      GTEST_FATAL_FAILURE_)
+
+// Includes the auto-generated header that implements a family of
+// generic predicate assertion macros.
+// Copyright 2006, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+// This file is AUTOMATICALLY GENERATED on 10/31/2011 by command
+// 'gen_gtest_pred_impl.py 5'.  DO NOT EDIT BY HAND!
+//
+// Implements a family of generic predicate assertion macros.
+
+#ifndef GTEST_INCLUDE_GTEST_GTEST_PRED_IMPL_H_
+#define GTEST_INCLUDE_GTEST_GTEST_PRED_IMPL_H_
+
+// Makes sure this header is not included before gtest.h.
+#ifndef GTEST_INCLUDE_GTEST_GTEST_H_
+# error Do not include gtest_pred_impl.h directly.  Include gtest.h instead.
+#endif  // GTEST_INCLUDE_GTEST_GTEST_H_
+
+// This header implements a family of generic predicate assertion
+// macros:
+//
+//   ASSERT_PRED_FORMAT1(pred_format, v1)
+//   ASSERT_PRED_FORMAT2(pred_format, v1, v2)
+//   ...
+//
+// where pred_format is a function or functor that takes n (in the
+// case of ASSERT_PRED_FORMATn) values and their source expression
+// text, and returns a testing::AssertionResult.  See the definition
+// of ASSERT_EQ in gtest.h for an example.
+//
+// If you don't care about formatting, you can use the more
+// restrictive version:
+//
+//   ASSERT_PRED1(pred, v1)
+//   ASSERT_PRED2(pred, v1, v2)
+//   ...
+//
+// where pred is an n-ary function or functor that returns bool,
+// and the values v1, v2, ..., must support the << operator for
+// streaming to std::ostream.
+//
+// We also define the EXPECT_* variations.
+//
+// For now we only support predicates whose arity is at most 5.
+// Please email googletestframework at googlegroups.com if you need
+// support for higher arities.
+
+// GTEST_ASSERT_ is the basic statement to which all of the assertions
+// in this file reduce.  Don't use this in your code.
+
+#define GTEST_ASSERT_(expression, on_failure) \
+  GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
+  if (const ::testing::AssertionResult gtest_ar = (expression)) \
+    ; \
+  else \
+    on_failure(gtest_ar.failure_message())
+
+
+// Helper function for implementing {EXPECT|ASSERT}_PRED1.  Don't use
+// this in your code.
+template <typename Pred,
+          typename T1>
+AssertionResult AssertPred1Helper(const char* pred_text,
+                                  const char* e1,
+                                  Pred pred,
+                                  const T1& v1) {
+  if (pred(v1)) return AssertionSuccess();
+
+  return AssertionFailure() << pred_text << "("
+                            << e1 << ") evaluates to false, where"
+                            << "\n" << e1 << " evaluates to " << v1;
+}
+
+// Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT1.
+// Don't use this in your code.
+#define GTEST_PRED_FORMAT1_(pred_format, v1, on_failure)\
+  GTEST_ASSERT_(pred_format(#v1, v1), \
+                on_failure)
+
+// Internal macro for implementing {EXPECT|ASSERT}_PRED1.  Don't use
+// this in your code.
+#define GTEST_PRED1_(pred, v1, on_failure)\
+  GTEST_ASSERT_(::testing::AssertPred1Helper(#pred, \
+                                             #v1, \
+                                             pred, \
+                                             v1), on_failure)
+
+// Unary predicate assertion macros.
+#define EXPECT_PRED_FORMAT1(pred_format, v1) \
+  GTEST_PRED_FORMAT1_(pred_format, v1, GTEST_NONFATAL_FAILURE_)
+#define EXPECT_PRED1(pred, v1) \
+  GTEST_PRED1_(pred, v1, GTEST_NONFATAL_FAILURE_)
+#define ASSERT_PRED_FORMAT1(pred_format, v1) \
+  GTEST_PRED_FORMAT1_(pred_format, v1, GTEST_FATAL_FAILURE_)
+#define ASSERT_PRED1(pred, v1) \
+  GTEST_PRED1_(pred, v1, GTEST_FATAL_FAILURE_)
+
+
+
+// Helper function for implementing {EXPECT|ASSERT}_PRED2.  Don't use
+// this in your code.
+template <typename Pred,
+          typename T1,
+          typename T2>
+AssertionResult AssertPred2Helper(const char* pred_text,
+                                  const char* e1,
+                                  const char* e2,
+                                  Pred pred,
+                                  const T1& v1,
+                                  const T2& v2) {
+  if (pred(v1, v2)) return AssertionSuccess();
+
+  return AssertionFailure() << pred_text << "("
+                            << e1 << ", "
+                            << e2 << ") evaluates to false, where"
+                            << "\n" << e1 << " evaluates to " << v1
+                            << "\n" << e2 << " evaluates to " << v2;
+}
+
+// Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT2.
+// Don't use this in your code.
+#define GTEST_PRED_FORMAT2_(pred_format, v1, v2, on_failure)\
+  GTEST_ASSERT_(pred_format(#v1, #v2, v1, v2), \
+                on_failure)
+
+// Internal macro for implementing {EXPECT|ASSERT}_PRED2.  Don't use
+// this in your code.
+#define GTEST_PRED2_(pred, v1, v2, on_failure)\
+  GTEST_ASSERT_(::testing::AssertPred2Helper(#pred, \
+                                             #v1, \
+                                             #v2, \
+                                             pred, \
+                                             v1, \
+                                             v2), on_failure)
+
+// Binary predicate assertion macros.
+#define EXPECT_PRED_FORMAT2(pred_format, v1, v2) \
+  GTEST_PRED_FORMAT2_(pred_format, v1, v2, GTEST_NONFATAL_FAILURE_)
+#define EXPECT_PRED2(pred, v1, v2) \
+  GTEST_PRED2_(pred, v1, v2, GTEST_NONFATAL_FAILURE_)
+#define ASSERT_PRED_FORMAT2(pred_format, v1, v2) \
+  GTEST_PRED_FORMAT2_(pred_format, v1, v2, GTEST_FATAL_FAILURE_)
+#define ASSERT_PRED2(pred, v1, v2) \
+  GTEST_PRED2_(pred, v1, v2, GTEST_FATAL_FAILURE_)
+
+
+
+// Helper function for implementing {EXPECT|ASSERT}_PRED3.  Don't use
+// this in your code.
+template <typename Pred,
+          typename T1,
+          typename T2,
+          typename T3>
+AssertionResult AssertPred3Helper(const char* pred_text,
+                                  const char* e1,
+                                  const char* e2,
+                                  const char* e3,
+                                  Pred pred,
+                                  const T1& v1,
+                                  const T2& v2,
+                                  const T3& v3) {
+  if (pred(v1, v2, v3)) return AssertionSuccess();
+
+  return AssertionFailure() << pred_text << "("
+                            << e1 << ", "
+                            << e2 << ", "
+                            << e3 << ") evaluates to false, where"
+                            << "\n" << e1 << " evaluates to " << v1
+                            << "\n" << e2 << " evaluates to " << v2
+                            << "\n" << e3 << " evaluates to " << v3;
+}
+
+// Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT3.
+// Don't use this in your code.
+#define GTEST_PRED_FORMAT3_(pred_format, v1, v2, v3, on_failure)\
+  GTEST_ASSERT_(pred_format(#v1, #v2, #v3, v1, v2, v3), \
+                on_failure)
+
+// Internal macro for implementing {EXPECT|ASSERT}_PRED3.  Don't use
+// this in your code.
+#define GTEST_PRED3_(pred, v1, v2, v3, on_failure)\
+  GTEST_ASSERT_(::testing::AssertPred3Helper(#pred, \
+                                             #v1, \
+                                             #v2, \
+                                             #v3, \
+                                             pred, \
+                                             v1, \
+                                             v2, \
+                                             v3), on_failure)
+
+// Ternary predicate assertion macros.
+#define EXPECT_PRED_FORMAT3(pred_format, v1, v2, v3) \
+  GTEST_PRED_FORMAT3_(pred_format, v1, v2, v3, GTEST_NONFATAL_FAILURE_)
+#define EXPECT_PRED3(pred, v1, v2, v3) \
+  GTEST_PRED3_(pred, v1, v2, v3, GTEST_NONFATAL_FAILURE_)
+#define ASSERT_PRED_FORMAT3(pred_format, v1, v2, v3) \
+  GTEST_PRED_FORMAT3_(pred_format, v1, v2, v3, GTEST_FATAL_FAILURE_)
+#define ASSERT_PRED3(pred, v1, v2, v3) \
+  GTEST_PRED3_(pred, v1, v2, v3, GTEST_FATAL_FAILURE_)
+
+
+
+// Helper function for implementing {EXPECT|ASSERT}_PRED4.  Don't use
+// this in your code.
+template <typename Pred,
+          typename T1,
+          typename T2,
+          typename T3,
+          typename T4>
+AssertionResult AssertPred4Helper(const char* pred_text,
+                                  const char* e1,
+                                  const char* e2,
+                                  const char* e3,
+                                  const char* e4,
+                                  Pred pred,
+                                  const T1& v1,
+                                  const T2& v2,
+                                  const T3& v3,
+                                  const T4& v4) {
+  if (pred(v1, v2, v3, v4)) return AssertionSuccess();
+
+  return AssertionFailure() << pred_text << "("
+                            << e1 << ", "
+                            << e2 << ", "
+                            << e3 << ", "
+                            << e4 << ") evaluates to false, where"
+                            << "\n" << e1 << " evaluates to " << v1
+                            << "\n" << e2 << " evaluates to " << v2
+                            << "\n" << e3 << " evaluates to " << v3
+                            << "\n" << e4 << " evaluates to " << v4;
+}
+
+// Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT4.
+// Don't use this in your code.
+#define GTEST_PRED_FORMAT4_(pred_format, v1, v2, v3, v4, on_failure)\
+  GTEST_ASSERT_(pred_format(#v1, #v2, #v3, #v4, v1, v2, v3, v4), \
+                on_failure)
+
+// Internal macro for implementing {EXPECT|ASSERT}_PRED4.  Don't use
+// this in your code.
+#define GTEST_PRED4_(pred, v1, v2, v3, v4, on_failure)\
+  GTEST_ASSERT_(::testing::AssertPred4Helper(#pred, \
+                                             #v1, \
+                                             #v2, \
+                                             #v3, \
+                                             #v4, \
+                                             pred, \
+                                             v1, \
+                                             v2, \
+                                             v3, \
+                                             v4), on_failure)
+
+// 4-ary predicate assertion macros.
+#define EXPECT_PRED_FORMAT4(pred_format, v1, v2, v3, v4) \
+  GTEST_PRED_FORMAT4_(pred_format, v1, v2, v3, v4, GTEST_NONFATAL_FAILURE_)
+#define EXPECT_PRED4(pred, v1, v2, v3, v4) \
+  GTEST_PRED4_(pred, v1, v2, v3, v4, GTEST_NONFATAL_FAILURE_)
+#define ASSERT_PRED_FORMAT4(pred_format, v1, v2, v3, v4) \
+  GTEST_PRED_FORMAT4_(pred_format, v1, v2, v3, v4, GTEST_FATAL_FAILURE_)
+#define ASSERT_PRED4(pred, v1, v2, v3, v4) \
+  GTEST_PRED4_(pred, v1, v2, v3, v4, GTEST_FATAL_FAILURE_)
+
+
+
+// Helper function for implementing {EXPECT|ASSERT}_PRED5.  Don't use
+// this in your code.
+template <typename Pred,
+          typename T1,
+          typename T2,
+          typename T3,
+          typename T4,
+          typename T5>
+AssertionResult AssertPred5Helper(const char* pred_text,
+                                  const char* e1,
+                                  const char* e2,
+                                  const char* e3,
+                                  const char* e4,
+                                  const char* e5,
+                                  Pred pred,
+                                  const T1& v1,
+                                  const T2& v2,
+                                  const T3& v3,
+                                  const T4& v4,
+                                  const T5& v5) {
+  if (pred(v1, v2, v3, v4, v5)) return AssertionSuccess();
+
+  return AssertionFailure() << pred_text << "("
+                            << e1 << ", "
+                            << e2 << ", "
+                            << e3 << ", "
+                            << e4 << ", "
+                            << e5 << ") evaluates to false, where"
+                            << "\n" << e1 << " evaluates to " << v1
+                            << "\n" << e2 << " evaluates to " << v2
+                            << "\n" << e3 << " evaluates to " << v3
+                            << "\n" << e4 << " evaluates to " << v4
+                            << "\n" << e5 << " evaluates to " << v5;
+}
+
+// Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT5.
+// Don't use this in your code.
+#define GTEST_PRED_FORMAT5_(pred_format, v1, v2, v3, v4, v5, on_failure)\
+  GTEST_ASSERT_(pred_format(#v1, #v2, #v3, #v4, #v5, v1, v2, v3, v4, v5), \
+                on_failure)
+
+// Internal macro for implementing {EXPECT|ASSERT}_PRED5.  Don't use
+// this in your code.
+#define GTEST_PRED5_(pred, v1, v2, v3, v4, v5, on_failure)\
+  GTEST_ASSERT_(::testing::AssertPred5Helper(#pred, \
+                                             #v1, \
+                                             #v2, \
+                                             #v3, \
+                                             #v4, \
+                                             #v5, \
+                                             pred, \
+                                             v1, \
+                                             v2, \
+                                             v3, \
+                                             v4, \
+                                             v5), on_failure)
+
+// 5-ary predicate assertion macros.
+#define EXPECT_PRED_FORMAT5(pred_format, v1, v2, v3, v4, v5) \
+  GTEST_PRED_FORMAT5_(pred_format, v1, v2, v3, v4, v5, GTEST_NONFATAL_FAILURE_)
+#define EXPECT_PRED5(pred, v1, v2, v3, v4, v5) \
+  GTEST_PRED5_(pred, v1, v2, v3, v4, v5, GTEST_NONFATAL_FAILURE_)
+#define ASSERT_PRED_FORMAT5(pred_format, v1, v2, v3, v4, v5) \
+  GTEST_PRED_FORMAT5_(pred_format, v1, v2, v3, v4, v5, GTEST_FATAL_FAILURE_)
+#define ASSERT_PRED5(pred, v1, v2, v3, v4, v5) \
+  GTEST_PRED5_(pred, v1, v2, v3, v4, v5, GTEST_FATAL_FAILURE_)
+
+
+
+#endif  // GTEST_INCLUDE_GTEST_GTEST_PRED_IMPL_H_
+
+// Macros for testing equalities and inequalities.
+//
+//    * {ASSERT|EXPECT}_EQ(expected, actual): Tests that expected == actual
+//    * {ASSERT|EXPECT}_NE(v1, v2):           Tests that v1 != v2
+//    * {ASSERT|EXPECT}_LT(v1, v2):           Tests that v1 < v2
+//    * {ASSERT|EXPECT}_LE(v1, v2):           Tests that v1 <= v2
+//    * {ASSERT|EXPECT}_GT(v1, v2):           Tests that v1 > v2
+//    * {ASSERT|EXPECT}_GE(v1, v2):           Tests that v1 >= v2
+//
+// When they are not, Google Test prints both the tested expressions and
+// their actual values.  The values must be compatible built-in types,
+// or you will get a compiler error.  By "compatible" we mean that the
+// values can be compared by the respective operator.
+//
+// Note:
+//
+//   1. It is possible to make a user-defined type work with
+//   {ASSERT|EXPECT}_??(), but that requires overloading the
+//   comparison operators and is thus discouraged by the Google C++
+//   Usage Guide.  Therefore, you are advised to use the
+//   {ASSERT|EXPECT}_TRUE() macro to assert that two objects are
+//   equal.
+//
+//   2. The {ASSERT|EXPECT}_??() macros do pointer comparisons on
+//   pointers (in particular, C strings).  Therefore, if you use it
+//   with two C strings, you are testing how their locations in memory
+//   are related, not how their content is related.  To compare two C
+//   strings by content, use {ASSERT|EXPECT}_STR*().
+//
+//   3. {ASSERT|EXPECT}_EQ(expected, actual) is preferred to
+//   {ASSERT|EXPECT}_TRUE(expected == actual), as the former tells you
+//   what the actual value is when it fails, and similarly for the
+//   other comparisons.
+//
+//   4. Do not depend on the order in which {ASSERT|EXPECT}_??()
+//   evaluate their arguments, which is undefined.
+//
+//   5. These macros evaluate their arguments exactly once.
+//
+// Examples:
+//
+//   EXPECT_NE(5, Foo());
+//   EXPECT_EQ(NULL, a_pointer);
+//   ASSERT_LT(i, array_size);
+//   ASSERT_GT(records.size(), 0) << "There is no record left.";
+
+#define EXPECT_EQ(expected, actual) \
+  EXPECT_PRED_FORMAT2(::testing::internal:: \
+                      EqHelper<GTEST_IS_NULL_LITERAL_(expected)>::Compare, \
+                      expected, actual)
+#define EXPECT_NE(expected, actual) \
+  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperNE, expected, actual)
+#define EXPECT_LE(val1, val2) \
+  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperLE, val1, val2)
+#define EXPECT_LT(val1, val2) \
+  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperLT, val1, val2)
+#define EXPECT_GE(val1, val2) \
+  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperGE, val1, val2)
+#define EXPECT_GT(val1, val2) \
+  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperGT, val1, val2)
+
+#define GTEST_ASSERT_EQ(expected, actual) \
+  ASSERT_PRED_FORMAT2(::testing::internal:: \
+                      EqHelper<GTEST_IS_NULL_LITERAL_(expected)>::Compare, \
+                      expected, actual)
+#define GTEST_ASSERT_NE(val1, val2) \
+  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperNE, val1, val2)
+#define GTEST_ASSERT_LE(val1, val2) \
+  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperLE, val1, val2)
+#define GTEST_ASSERT_LT(val1, val2) \
+  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperLT, val1, val2)
+#define GTEST_ASSERT_GE(val1, val2) \
+  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperGE, val1, val2)
+#define GTEST_ASSERT_GT(val1, val2) \
+  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperGT, val1, val2)
+
+// Define macro GTEST_DONT_DEFINE_ASSERT_XY to 1 to omit the definition of
+// ASSERT_XY(), which clashes with some users' own code.
+
+#if !GTEST_DONT_DEFINE_ASSERT_EQ
+# define ASSERT_EQ(val1, val2) GTEST_ASSERT_EQ(val1, val2)
+#endif
+
+#if !GTEST_DONT_DEFINE_ASSERT_NE
+# define ASSERT_NE(val1, val2) GTEST_ASSERT_NE(val1, val2)
+#endif
+
+#if !GTEST_DONT_DEFINE_ASSERT_LE
+# define ASSERT_LE(val1, val2) GTEST_ASSERT_LE(val1, val2)
+#endif
+
+#if !GTEST_DONT_DEFINE_ASSERT_LT
+# define ASSERT_LT(val1, val2) GTEST_ASSERT_LT(val1, val2)
+#endif
+
+#if !GTEST_DONT_DEFINE_ASSERT_GE
+# define ASSERT_GE(val1, val2) GTEST_ASSERT_GE(val1, val2)
+#endif
+
+#if !GTEST_DONT_DEFINE_ASSERT_GT
+# define ASSERT_GT(val1, val2) GTEST_ASSERT_GT(val1, val2)
+#endif
+
+// C-string Comparisons.  All tests treat NULL and any non-NULL string
+// as different.  Two NULLs are equal.
+//
+//    * {ASSERT|EXPECT}_STREQ(s1, s2):     Tests that s1 == s2
+//    * {ASSERT|EXPECT}_STRNE(s1, s2):     Tests that s1 != s2
+//    * {ASSERT|EXPECT}_STRCASEEQ(s1, s2): Tests that s1 == s2, ignoring case
+//    * {ASSERT|EXPECT}_STRCASENE(s1, s2): Tests that s1 != s2, ignoring case
+//
+// For wide or narrow string objects, you can use the
+// {ASSERT|EXPECT}_??() macros.
+//
+// Don't depend on the order in which the arguments are evaluated,
+// which is undefined.
+//
+// These macros evaluate their arguments exactly once.
+
+#define EXPECT_STREQ(expected, actual) \
+  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperSTREQ, expected, actual)
+#define EXPECT_STRNE(s1, s2) \
+  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperSTRNE, s1, s2)
+#define EXPECT_STRCASEEQ(expected, actual) \
+  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperSTRCASEEQ, expected, actual)
+#define EXPECT_STRCASENE(s1, s2)\
+  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperSTRCASENE, s1, s2)
+
+#define ASSERT_STREQ(expected, actual) \
+  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperSTREQ, expected, actual)
+#define ASSERT_STRNE(s1, s2) \
+  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperSTRNE, s1, s2)
+#define ASSERT_STRCASEEQ(expected, actual) \
+  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperSTRCASEEQ, expected, actual)
+#define ASSERT_STRCASENE(s1, s2)\
+  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperSTRCASENE, s1, s2)
+
+// Macros for comparing floating-point numbers.
+//
+//    * {ASSERT|EXPECT}_FLOAT_EQ(expected, actual):
+//         Tests that two float values are almost equal.
+//    * {ASSERT|EXPECT}_DOUBLE_EQ(expected, actual):
+//         Tests that two double values are almost equal.
+//    * {ASSERT|EXPECT}_NEAR(v1, v2, abs_error):
+//         Tests that v1 and v2 are within the given distance to each other.
+//
+// Google Test uses ULP-based comparison to automatically pick a default
+// error bound that is appropriate for the operands.  See the
+// FloatingPoint template class in gtest-internal.h if you are
+// interested in the implementation details.
+
+#define EXPECT_FLOAT_EQ(expected, actual)\
+  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperFloatingPointEQ<float>, \
+                      expected, actual)
+
+#define EXPECT_DOUBLE_EQ(expected, actual)\
+  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperFloatingPointEQ<double>, \
+                      expected, actual)
+
+#define ASSERT_FLOAT_EQ(expected, actual)\
+  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperFloatingPointEQ<float>, \
+                      expected, actual)
+
+#define ASSERT_DOUBLE_EQ(expected, actual)\
+  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperFloatingPointEQ<double>, \
+                      expected, actual)
+
+#define EXPECT_NEAR(val1, val2, abs_error)\
+  EXPECT_PRED_FORMAT3(::testing::internal::DoubleNearPredFormat, \
+                      val1, val2, abs_error)
+
+#define ASSERT_NEAR(val1, val2, abs_error)\
+  ASSERT_PRED_FORMAT3(::testing::internal::DoubleNearPredFormat, \
+                      val1, val2, abs_error)
+
+// These predicate format functions work on floating-point values, and
+// can be used in {ASSERT|EXPECT}_PRED_FORMAT2*(), e.g.
+//
+//   EXPECT_PRED_FORMAT2(testing::DoubleLE, Foo(), 5.0);
+
+// Asserts that val1 is less than, or almost equal to, val2.  Fails
+// otherwise.  In particular, it fails if either val1 or val2 is NaN.
+GTEST_API_ AssertionResult FloatLE(const char* expr1, const char* expr2,
+                                   float val1, float val2);
+GTEST_API_ AssertionResult DoubleLE(const char* expr1, const char* expr2,
+                                    double val1, double val2);
+
+
+#if GTEST_OS_WINDOWS
+
+// Macros that test for HRESULT failure and success, these are only useful
+// on Windows, and rely on Windows SDK macros and APIs to compile.
+//
+//    * {ASSERT|EXPECT}_HRESULT_{SUCCEEDED|FAILED}(expr)
+//
+// When expr unexpectedly fails or succeeds, Google Test prints the
+// expected result and the actual result with both a human-readable
+// string representation of the error, if available, as well as the
+// hex result code.
+# define EXPECT_HRESULT_SUCCEEDED(expr) \
+    EXPECT_PRED_FORMAT1(::testing::internal::IsHRESULTSuccess, (expr))
+
+# define ASSERT_HRESULT_SUCCEEDED(expr) \
+    ASSERT_PRED_FORMAT1(::testing::internal::IsHRESULTSuccess, (expr))
+
+# define EXPECT_HRESULT_FAILED(expr) \
+    EXPECT_PRED_FORMAT1(::testing::internal::IsHRESULTFailure, (expr))
+
+# define ASSERT_HRESULT_FAILED(expr) \
+    ASSERT_PRED_FORMAT1(::testing::internal::IsHRESULTFailure, (expr))
+
+#endif  // GTEST_OS_WINDOWS
+
+// Macros that execute statement and check that it doesn't generate new fatal
+// failures in the current thread.
+//
+//   * {ASSERT|EXPECT}_NO_FATAL_FAILURE(statement);
+//
+// Examples:
+//
+//   EXPECT_NO_FATAL_FAILURE(Process());
+//   ASSERT_NO_FATAL_FAILURE(Process()) << "Process() failed";
+//
+#define ASSERT_NO_FATAL_FAILURE(statement) \
+    GTEST_TEST_NO_FATAL_FAILURE_(statement, GTEST_FATAL_FAILURE_)
+#define EXPECT_NO_FATAL_FAILURE(statement) \
+    GTEST_TEST_NO_FATAL_FAILURE_(statement, GTEST_NONFATAL_FAILURE_)
+
+// Causes a trace (including the source file path, the current line
+// number, and the given message) to be included in every test failure
+// message generated by code in the current scope.  The effect is
+// undone when the control leaves the current scope.
+//
+// The message argument can be anything streamable to std::ostream.
+//
+// In the implementation, we include the current line number as part
+// of the dummy variable name, thus allowing multiple SCOPED_TRACE()s
+// to appear in the same block - as long as they are on different
+// lines.
+#define SCOPED_TRACE(message) \
+  ::testing::internal::ScopedTrace GTEST_CONCAT_TOKEN_(gtest_trace_, __LINE__)(\
+    __FILE__, __LINE__, ::testing::Message() << (message))
+
+// Compile-time assertion for type equality.
+// StaticAssertTypeEq<type1, type2>() compiles iff type1 and type2 are
+// the same type.  The value it returns is not interesting.
+//
+// Instead of making StaticAssertTypeEq a class template, we make it a
+// function template that invokes a helper class template.  This
+// prevents a user from misusing StaticAssertTypeEq<T1, T2> by
+// defining objects of that type.
+//
+// CAVEAT:
+//
+// When used inside a method of a class template,
+// StaticAssertTypeEq<T1, T2>() is effective ONLY IF the method is
+// instantiated.  For example, given:
+//
+//   template <typename T> class Foo {
+//    public:
+//     void Bar() { testing::StaticAssertTypeEq<int, T>(); }
+//   };
+//
+// the code:
+//
+//   void Test1() { Foo<bool> foo; }
+//
+// will NOT generate a compiler error, as Foo<bool>::Bar() is never
+// actually instantiated.  Instead, you need:
+//
+//   void Test2() { Foo<bool> foo; foo.Bar(); }
+//
+// to cause a compiler error.
+template <typename T1, typename T2>
+bool StaticAssertTypeEq() {
+  (void)internal::StaticAssertTypeEqHelper<T1, T2>();
+  return true;
+}
+
+// Defines a test.
+//
+// The first parameter is the name of the test case, and the second
+// parameter is the name of the test within the test case.
+//
+// The convention is to end the test case name with "Test".  For
+// example, a test case for the Foo class can be named FooTest.
+//
+// The user should put his test code between braces after using this
+// macro.  Example:
+//
+//   TEST(FooTest, InitializesCorrectly) {
+//     Foo foo;
+//     EXPECT_TRUE(foo.StatusIsOK());
+//   }
+
+// Note that we call GetTestTypeId() instead of GetTypeId<
+// ::testing::Test>() here to get the type ID of testing::Test.  This
+// is to work around a suspected linker bug when using Google Test as
+// a framework on Mac OS X.  The bug causes GetTypeId<
+// ::testing::Test>() to return different values depending on whether
+// the call is from the Google Test framework itself or from user test
+// code.  GetTestTypeId() is guaranteed to always return the same
+// value, as it always calls GetTypeId<>() from the Google Test
+// framework.
+#define GTEST_TEST(test_case_name, test_name)\
+  GTEST_TEST_(test_case_name, test_name, \
+              ::testing::Test, ::testing::internal::GetTestTypeId())
+
+// Define this macro to 1 to omit the definition of TEST(), which
+// is a generic name and clashes with some other libraries.
+#if !GTEST_DONT_DEFINE_TEST
+# define TEST(test_case_name, test_name) GTEST_TEST(test_case_name, test_name)
+#endif
+
+// Defines a test that uses a test fixture.
+//
+// The first parameter is the name of the test fixture class, which
+// also doubles as the test case name.  The second parameter is the
+// name of the test within the test case.
+//
+// A test fixture class must be declared earlier.  The user should put
+// his test code between braces after using this macro.  Example:
+//
+//   class FooTest : public testing::Test {
+//    protected:
+//     virtual void SetUp() { b_.AddElement(3); }
+//
+//     Foo a_;
+//     Foo b_;
+//   };
+//
+//   TEST_F(FooTest, InitializesCorrectly) {
+//     EXPECT_TRUE(a_.StatusIsOK());
+//   }
+//
+//   TEST_F(FooTest, ReturnsElementCountCorrectly) {
+//     EXPECT_EQ(0, a_.size());
+//     EXPECT_EQ(1, b_.size());
+//   }
+
+#define TEST_F(test_fixture, test_name)\
+  GTEST_TEST_(test_fixture, test_name, test_fixture, \
+              ::testing::internal::GetTypeId<test_fixture>())
+
+}  // namespace testing
+
+// Use this function in main() to run all tests.  It returns 0 if all
+// tests are successful, or 1 otherwise.
+//
+// RUN_ALL_TESTS() should be invoked after the command line has been
+// parsed by InitGoogleTest().
+//
+// This function was formerly a macro; thus, it is in the global
+// namespace and has an all-caps name.
+int RUN_ALL_TESTS() GTEST_MUST_USE_RESULT_;
+
+inline int RUN_ALL_TESTS() {
+  return ::testing::UnitTest::GetInstance()->Run();
+}
+
+#endif  // GTEST_INCLUDE_GTEST_GTEST_H_
diff --git a/contrib/gtest-1.7.0/fused-src/gtest/gtest_main.cc b/contrib/gtest-1.7.0/fused-src/gtest/gtest_main.cc
new file mode 100644
index 0000000..f302822
--- /dev/null
+++ b/contrib/gtest-1.7.0/fused-src/gtest/gtest_main.cc
@@ -0,0 +1,38 @@
+// Copyright 2006, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#include <stdio.h>
+
+#include "gtest/gtest.h"
+
+GTEST_API_ int main(int argc, char **argv) {
+  printf("Running main() from gtest_main.cc\n");
+  testing::InitGoogleTest(&argc, argv);
+  return RUN_ALL_TESTS();
+}
diff --git a/contrib/gtest-1.7.0/include/gtest/gtest-death-test.h b/contrib/gtest-1.7.0/include/gtest/gtest-death-test.h
new file mode 100644
index 0000000..957a69c
--- /dev/null
+++ b/contrib/gtest-1.7.0/include/gtest/gtest-death-test.h
@@ -0,0 +1,294 @@
+// Copyright 2005, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+//
+// The Google C++ Testing Framework (Google Test)
+//
+// This header file defines the public API for death tests.  It is
+// #included by gtest.h so a user doesn't need to include this
+// directly.
+
+#ifndef GTEST_INCLUDE_GTEST_GTEST_DEATH_TEST_H_
+#define GTEST_INCLUDE_GTEST_GTEST_DEATH_TEST_H_
+
+#include "gtest/internal/gtest-death-test-internal.h"
+
+namespace testing {
+
+// This flag controls the style of death tests.  Valid values are "threadsafe",
+// meaning that the death test child process will re-execute the test binary
+// from the start, running only a single death test, or "fast",
+// meaning that the child process will execute the test logic immediately
+// after forking.
+GTEST_DECLARE_string_(death_test_style);
+
+#if GTEST_HAS_DEATH_TEST
+
+namespace internal {
+
+// Returns a Boolean value indicating whether the caller is currently
+// executing in the context of the death test child process.  Tools such as
+// Valgrind heap checkers may need this to modify their behavior in death
+// tests.  IMPORTANT: This is an internal utility.  Using it may break the
+// implementation of death tests.  User code MUST NOT use it.
+GTEST_API_ bool InDeathTestChild();
+
+}  // namespace internal
+
+// The following macros are useful for writing death tests.
+
+// Here's what happens when an ASSERT_DEATH* or EXPECT_DEATH* is
+// executed:
+//
+//   1. It generates a warning if there is more than one active
+//   thread.  This is because it's safe to fork() or clone() only
+//   when there is a single thread.
+//
+//   2. The parent process clone()s a sub-process and runs the death
+//   test in it; the sub-process exits with code 0 at the end of the
+//   death test, if it hasn't exited already.
+//
+//   3. The parent process waits for the sub-process to terminate.
+//
+//   4. The parent process checks the exit code and error message of
+//   the sub-process.
+//
+// Examples:
+//
+//   ASSERT_DEATH(server.SendMessage(56, "Hello"), "Invalid port number");
+//   for (int i = 0; i < 5; i++) {
+//     EXPECT_DEATH(server.ProcessRequest(i),
+//                  "Invalid request .* in ProcessRequest()")
+//                  << "Failed to die on request " << i;
+//   }
+//
+//   ASSERT_EXIT(server.ExitNow(), ::testing::ExitedWithCode(0), "Exiting");
+//
+//   bool KilledBySIGHUP(int exit_code) {
+//     return WIFSIGNALED(exit_code) && WTERMSIG(exit_code) == SIGHUP;
+//   }
+//
+//   ASSERT_EXIT(client.HangUpServer(), KilledBySIGHUP, "Hanging up!");
+//
+// On the regular expressions used in death tests:
+//
+//   On POSIX-compliant systems (*nix), we use the <regex.h> library,
+//   which uses the POSIX extended regex syntax.
+//
+//   On other platforms (e.g. Windows), we only support a simple regex
+//   syntax implemented as part of Google Test.  This limited
+//   implementation should be enough most of the time when writing
+//   death tests; though it lacks many features you can find in PCRE
+//   or POSIX extended regex syntax.  For example, we don't support
+//   union ("x|y"), grouping ("(xy)"), brackets ("[xy]"), and
+//   repetition count ("x{5,7}"), among others.
+//
+//   Below is the syntax that we do support.  We chose it to be a
+//   subset of both PCRE and POSIX extended regex, so it's easy to
+//   learn wherever you come from.  In the following: 'A' denotes a
+//   literal character, period (.), or a single \\ escape sequence;
+//   'x' and 'y' denote regular expressions; 'm' and 'n' are for
+//   natural numbers.
+//
+//     c     matches any literal character c
+//     \\d   matches any decimal digit
+//     \\D   matches any character that's not a decimal digit
+//     \\f   matches \f
+//     \\n   matches \n
+//     \\r   matches \r
+//     \\s   matches any ASCII whitespace, including \n
+//     \\S   matches any character that's not a whitespace
+//     \\t   matches \t
+//     \\v   matches \v
+//     \\w   matches any letter, _, or decimal digit
+//     \\W   matches any character that \\w doesn't match
+//     \\c   matches any literal character c, which must be a punctuation
+//     .     matches any single character except \n
+//     A?    matches 0 or 1 occurrences of A
+//     A*    matches 0 or many occurrences of A
+//     A+    matches 1 or many occurrences of A
+//     ^     matches the beginning of a string (not that of each line)
+//     $     matches the end of a string (not that of each line)
+//     xy    matches x followed by y
+//
+//   If you accidentally use PCRE or POSIX extended regex features
+//   not implemented by us, you will get a run-time failure.  In that
+//   case, please try to rewrite your regular expression within the
+//   above syntax.
+//
+//   This implementation is *not* meant to be as highly tuned or robust
+//   as a compiled regex library, but should perform well enough for a
+//   death test, which already incurs significant overhead by launching
+//   a child process.
+//
+// Known caveats:
+//
+//   A "threadsafe" style death test obtains the path to the test
+//   program from argv[0] and re-executes it in the sub-process.  For
+//   simplicity, the current implementation doesn't search the PATH
+//   when launching the sub-process.  This means that the user must
+//   invoke the test program via a path that contains at least one
+//   path separator (e.g. path/to/foo_test and
+//   /absolute/path/to/bar_test are fine, but foo_test is not).  This
+//   is rarely a problem as people usually don't put the test binary
+//   directory in PATH.
+//
+// TODO(wan at google.com): make thread-safe death tests search the PATH.
+
+// Asserts that a given statement causes the program to exit, with an
+// integer exit status that satisfies predicate, and emitting error output
+// that matches regex.
+# define ASSERT_EXIT(statement, predicate, regex) \
+    GTEST_DEATH_TEST_(statement, predicate, regex, GTEST_FATAL_FAILURE_)
+
+// Like ASSERT_EXIT, but continues on to successive tests in the
+// test case, if any:
+# define EXPECT_EXIT(statement, predicate, regex) \
+    GTEST_DEATH_TEST_(statement, predicate, regex, GTEST_NONFATAL_FAILURE_)
+
+// Asserts that a given statement causes the program to exit, either by
+// explicitly exiting with a nonzero exit code or being killed by a
+// signal, and emitting error output that matches regex.
+# define ASSERT_DEATH(statement, regex) \
+    ASSERT_EXIT(statement, ::testing::internal::ExitedUnsuccessfully, regex)
+
+// Like ASSERT_DEATH, but continues on to successive tests in the
+// test case, if any:
+# define EXPECT_DEATH(statement, regex) \
+    EXPECT_EXIT(statement, ::testing::internal::ExitedUnsuccessfully, regex)
+
+// Two predicate classes that can be used in {ASSERT,EXPECT}_EXIT*:
+
+// Tests that an exit code describes a normal exit with a given exit code.
+class GTEST_API_ ExitedWithCode {
+ public:
+  explicit ExitedWithCode(int exit_code);
+  bool operator()(int exit_status) const;
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ExitedWithCode& other);
+
+  const int exit_code_;
+};
+
+# if !GTEST_OS_WINDOWS
+// Tests that an exit code describes an exit due to termination by a
+// given signal.
+class GTEST_API_ KilledBySignal {
+ public:
+  explicit KilledBySignal(int signum);
+  bool operator()(int exit_status) const;
+ private:
+  const int signum_;
+};
+# endif  // !GTEST_OS_WINDOWS
+
+// EXPECT_DEBUG_DEATH asserts that the given statements die in debug mode.
+// The death testing framework causes this to have interesting semantics,
+// since the sideeffects of the call are only visible in opt mode, and not
+// in debug mode.
+//
+// In practice, this can be used to test functions that utilize the
+// LOG(DFATAL) macro using the following style:
+//
+// int DieInDebugOr12(int* sideeffect) {
+//   if (sideeffect) {
+//     *sideeffect = 12;
+//   }
+//   LOG(DFATAL) << "death";
+//   return 12;
+// }
+//
+// TEST(TestCase, TestDieOr12WorksInDgbAndOpt) {
+//   int sideeffect = 0;
+//   // Only asserts in dbg.
+//   EXPECT_DEBUG_DEATH(DieInDebugOr12(&sideeffect), "death");
+//
+// #ifdef NDEBUG
+//   // opt-mode has sideeffect visible.
+//   EXPECT_EQ(12, sideeffect);
+// #else
+//   // dbg-mode no visible sideeffect.
+//   EXPECT_EQ(0, sideeffect);
+// #endif
+// }
+//
+// This will assert that DieInDebugReturn12InOpt() crashes in debug
+// mode, usually due to a DCHECK or LOG(DFATAL), but returns the
+// appropriate fallback value (12 in this case) in opt mode. If you
+// need to test that a function has appropriate side-effects in opt
+// mode, include assertions against the side-effects.  A general
+// pattern for this is:
+//
+// EXPECT_DEBUG_DEATH({
+//   // Side-effects here will have an effect after this statement in
+//   // opt mode, but none in debug mode.
+//   EXPECT_EQ(12, DieInDebugOr12(&sideeffect));
+// }, "death");
+//
+# ifdef NDEBUG
+
+#  define EXPECT_DEBUG_DEATH(statement, regex) \
+  GTEST_EXECUTE_STATEMENT_(statement, regex)
+
+#  define ASSERT_DEBUG_DEATH(statement, regex) \
+  GTEST_EXECUTE_STATEMENT_(statement, regex)
+
+# else
+
+#  define EXPECT_DEBUG_DEATH(statement, regex) \
+  EXPECT_DEATH(statement, regex)
+
+#  define ASSERT_DEBUG_DEATH(statement, regex) \
+  ASSERT_DEATH(statement, regex)
+
+# endif  // NDEBUG for EXPECT_DEBUG_DEATH
+#endif  // GTEST_HAS_DEATH_TEST
+
+// EXPECT_DEATH_IF_SUPPORTED(statement, regex) and
+// ASSERT_DEATH_IF_SUPPORTED(statement, regex) expand to real death tests if
+// death tests are supported; otherwise they just issue a warning.  This is
+// useful when you are combining death test assertions with normal test
+// assertions in one test.
+#if GTEST_HAS_DEATH_TEST
+# define EXPECT_DEATH_IF_SUPPORTED(statement, regex) \
+    EXPECT_DEATH(statement, regex)
+# define ASSERT_DEATH_IF_SUPPORTED(statement, regex) \
+    ASSERT_DEATH(statement, regex)
+#else
+# define EXPECT_DEATH_IF_SUPPORTED(statement, regex) \
+    GTEST_UNSUPPORTED_DEATH_TEST_(statement, regex, )
+# define ASSERT_DEATH_IF_SUPPORTED(statement, regex) \
+    GTEST_UNSUPPORTED_DEATH_TEST_(statement, regex, return)
+#endif
+
+}  // namespace testing
+
+#endif  // GTEST_INCLUDE_GTEST_GTEST_DEATH_TEST_H_
diff --git a/contrib/gtest-1.7.0/include/gtest/gtest-message.h b/contrib/gtest-1.7.0/include/gtest/gtest-message.h
new file mode 100644
index 0000000..fe879bc
--- /dev/null
+++ b/contrib/gtest-1.7.0/include/gtest/gtest-message.h
@@ -0,0 +1,250 @@
+// Copyright 2005, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+//
+// The Google C++ Testing Framework (Google Test)
+//
+// This header file defines the Message class.
+//
+// IMPORTANT NOTE: Due to limitation of the C++ language, we have to
+// leave some internal implementation details in this header file.
+// They are clearly marked by comments like this:
+//
+//   // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
+//
+// Such code is NOT meant to be used by a user directly, and is subject
+// to CHANGE WITHOUT NOTICE.  Therefore DO NOT DEPEND ON IT in a user
+// program!
+
+#ifndef GTEST_INCLUDE_GTEST_GTEST_MESSAGE_H_
+#define GTEST_INCLUDE_GTEST_GTEST_MESSAGE_H_
+
+#include <limits>
+
+#include "gtest/internal/gtest-port.h"
+
+// Ensures that there is at least one operator<< in the global namespace.
+// See Message& operator<<(...) below for why.
+void operator<<(const testing::internal::Secret&, int);
+
+namespace testing {
+
+// The Message class works like an ostream repeater.
+//
+// Typical usage:
+//
+//   1. You stream a bunch of values to a Message object.
+//      It will remember the text in a stringstream.
+//   2. Then you stream the Message object to an ostream.
+//      This causes the text in the Message to be streamed
+//      to the ostream.
+//
+// For example;
+//
+//   testing::Message foo;
+//   foo << 1 << " != " << 2;
+//   std::cout << foo;
+//
+// will print "1 != 2".
+//
+// Message is not intended to be inherited from.  In particular, its
+// destructor is not virtual.
+//
+// Note that stringstream behaves differently in gcc and in MSVC.  You
+// can stream a NULL char pointer to it in the former, but not in the
+// latter (it causes an access violation if you do).  The Message
+// class hides this difference by treating a NULL char pointer as
+// "(null)".
+class GTEST_API_ Message {
+ private:
+  // The type of basic IO manipulators (endl, ends, and flush) for
+  // narrow streams.
+  typedef std::ostream& (*BasicNarrowIoManip)(std::ostream&);
+
+ public:
+  // Constructs an empty Message.
+  Message();
+
+  // Copy constructor.
+  Message(const Message& msg) : ss_(new ::std::stringstream) {  // NOLINT
+    *ss_ << msg.GetString();
+  }
+
+  // Constructs a Message from a C-string.
+  explicit Message(const char* str) : ss_(new ::std::stringstream) {
+    *ss_ << str;
+  }
+
+#if GTEST_OS_SYMBIAN
+  // Streams a value (either a pointer or not) to this object.
+  template <typename T>
+  inline Message& operator <<(const T& value) {
+    StreamHelper(typename internal::is_pointer<T>::type(), value);
+    return *this;
+  }
+#else
+  // Streams a non-pointer value to this object.
+  template <typename T>
+  inline Message& operator <<(const T& val) {
+    // Some libraries overload << for STL containers.  These
+    // overloads are defined in the global namespace instead of ::std.
+    //
+    // C++'s symbol lookup rule (i.e. Koenig lookup) says that these
+    // overloads are visible in either the std namespace or the global
+    // namespace, but not other namespaces, including the testing
+    // namespace which Google Test's Message class is in.
+    //
+    // To allow STL containers (and other types that has a << operator
+    // defined in the global namespace) to be used in Google Test
+    // assertions, testing::Message must access the custom << operator
+    // from the global namespace.  With this using declaration,
+    // overloads of << defined in the global namespace and those
+    // visible via Koenig lookup are both exposed in this function.
+    using ::operator <<;
+    *ss_ << val;
+    return *this;
+  }
+
+  // Streams a pointer value to this object.
+  //
+  // This function is an overload of the previous one.  When you
+  // stream a pointer to a Message, this definition will be used as it
+  // is more specialized.  (The C++ Standard, section
+  // [temp.func.order].)  If you stream a non-pointer, then the
+  // previous definition will be used.
+  //
+  // The reason for this overload is that streaming a NULL pointer to
+  // ostream is undefined behavior.  Depending on the compiler, you
+  // may get "0", "(nil)", "(null)", or an access violation.  To
+  // ensure consistent result across compilers, we always treat NULL
+  // as "(null)".
+  template <typename T>
+  inline Message& operator <<(T* const& pointer) {  // NOLINT
+    if (pointer == NULL) {
+      *ss_ << "(null)";
+    } else {
+      *ss_ << pointer;
+    }
+    return *this;
+  }
+#endif  // GTEST_OS_SYMBIAN
+
+  // Since the basic IO manipulators are overloaded for both narrow
+  // and wide streams, we have to provide this specialized definition
+  // of operator <<, even though its body is the same as the
+  // templatized version above.  Without this definition, streaming
+  // endl or other basic IO manipulators to Message will confuse the
+  // compiler.
+  Message& operator <<(BasicNarrowIoManip val) {
+    *ss_ << val;
+    return *this;
+  }
+
+  // Instead of 1/0, we want to see true/false for bool values.
+  Message& operator <<(bool b) {
+    return *this << (b ? "true" : "false");
+  }
+
+  // These two overloads allow streaming a wide C string to a Message
+  // using the UTF-8 encoding.
+  Message& operator <<(const wchar_t* wide_c_str);
+  Message& operator <<(wchar_t* wide_c_str);
+
+#if GTEST_HAS_STD_WSTRING
+  // Converts the given wide string to a narrow string using the UTF-8
+  // encoding, and streams the result to this Message object.
+  Message& operator <<(const ::std::wstring& wstr);
+#endif  // GTEST_HAS_STD_WSTRING
+
+#if GTEST_HAS_GLOBAL_WSTRING
+  // Converts the given wide string to a narrow string using the UTF-8
+  // encoding, and streams the result to this Message object.
+  Message& operator <<(const ::wstring& wstr);
+#endif  // GTEST_HAS_GLOBAL_WSTRING
+
+  // Gets the text streamed to this object so far as an std::string.
+  // Each '\0' character in the buffer is replaced with "\\0".
+  //
+  // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
+  std::string GetString() const;
+
+ private:
+
+#if GTEST_OS_SYMBIAN
+  // These are needed as the Nokia Symbian Compiler cannot decide between
+  // const T& and const T* in a function template. The Nokia compiler _can_
+  // decide between class template specializations for T and T*, so a
+  // tr1::type_traits-like is_pointer works, and we can overload on that.
+  template <typename T>
+  inline void StreamHelper(internal::true_type /*is_pointer*/, T* pointer) {
+    if (pointer == NULL) {
+      *ss_ << "(null)";
+    } else {
+      *ss_ << pointer;
+    }
+  }
+  template <typename T>
+  inline void StreamHelper(internal::false_type /*is_pointer*/,
+                           const T& value) {
+    // See the comments in Message& operator <<(const T&) above for why
+    // we need this using statement.
+    using ::operator <<;
+    *ss_ << value;
+  }
+#endif  // GTEST_OS_SYMBIAN
+
+  // We'll hold the text streamed to this object here.
+  const internal::scoped_ptr< ::std::stringstream> ss_;
+
+  // We declare (but don't implement) this to prevent the compiler
+  // from implementing the assignment operator.
+  void operator=(const Message&);
+};
+
+// Streams a Message to an ostream.
+inline std::ostream& operator <<(std::ostream& os, const Message& sb) {
+  return os << sb.GetString();
+}
+
+namespace internal {
+
+// Converts a streamable value to an std::string.  A NULL pointer is
+// converted to "(null)".  When the input value is a ::string,
+// ::std::string, ::wstring, or ::std::wstring object, each NUL
+// character in it is replaced with "\\0".
+template <typename T>
+std::string StreamableToString(const T& streamable) {
+  return (Message() << streamable).GetString();
+}
+
+}  // namespace internal
+}  // namespace testing
+
+#endif  // GTEST_INCLUDE_GTEST_GTEST_MESSAGE_H_
diff --git a/contrib/gtest-1.7.0/include/gtest/gtest-param-test.h b/contrib/gtest-1.7.0/include/gtest/gtest-param-test.h
new file mode 100644
index 0000000..d6702c8
--- /dev/null
+++ b/contrib/gtest-1.7.0/include/gtest/gtest-param-test.h
@@ -0,0 +1,1421 @@
+// This file was GENERATED by command:
+//     pump.py gtest-param-test.h.pump
+// DO NOT EDIT BY HAND!!!
+
+// Copyright 2008, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Authors: vladl at google.com (Vlad Losev)
+//
+// Macros and functions for implementing parameterized tests
+// in Google C++ Testing Framework (Google Test)
+//
+// This file is generated by a SCRIPT.  DO NOT EDIT BY HAND!
+//
+#ifndef GTEST_INCLUDE_GTEST_GTEST_PARAM_TEST_H_
+#define GTEST_INCLUDE_GTEST_GTEST_PARAM_TEST_H_
+
+
+// Value-parameterized tests allow you to test your code with different
+// parameters without writing multiple copies of the same test.
+//
+// Here is how you use value-parameterized tests:
+
+#if 0
+
+// To write value-parameterized tests, first you should define a fixture
+// class. It is usually derived from testing::TestWithParam<T> (see below for
+// another inheritance scheme that's sometimes useful in more complicated
+// class hierarchies), where the type of your parameter values.
+// TestWithParam<T> is itself derived from testing::Test. T can be any
+// copyable type. If it's a raw pointer, you are responsible for managing the
+// lifespan of the pointed values.
+
+class FooTest : public ::testing::TestWithParam<const char*> {
+  // You can implement all the usual class fixture members here.
+};
+
+// Then, use the TEST_P macro to define as many parameterized tests
+// for this fixture as you want. The _P suffix is for "parameterized"
+// or "pattern", whichever you prefer to think.
+
+TEST_P(FooTest, DoesBlah) {
+  // Inside a test, access the test parameter with the GetParam() method
+  // of the TestWithParam<T> class:
+  EXPECT_TRUE(foo.Blah(GetParam()));
+  ...
+}
+
+TEST_P(FooTest, HasBlahBlah) {
+  ...
+}
+
+// Finally, you can use INSTANTIATE_TEST_CASE_P to instantiate the test
+// case with any set of parameters you want. Google Test defines a number
+// of functions for generating test parameters. They return what we call
+// (surprise!) parameter generators. Here is a  summary of them, which
+// are all in the testing namespace:
+//
+//
+//  Range(begin, end [, step]) - Yields values {begin, begin+step,
+//                               begin+step+step, ...}. The values do not
+//                               include end. step defaults to 1.
+//  Values(v1, v2, ..., vN)    - Yields values {v1, v2, ..., vN}.
+//  ValuesIn(container)        - Yields values from a C-style array, an STL
+//  ValuesIn(begin,end)          container, or an iterator range [begin, end).
+//  Bool()                     - Yields sequence {false, true}.
+//  Combine(g1, g2, ..., gN)   - Yields all combinations (the Cartesian product
+//                               for the math savvy) of the values generated
+//                               by the N generators.
+//
+// For more details, see comments at the definitions of these functions below
+// in this file.
+//
+// The following statement will instantiate tests from the FooTest test case
+// each with parameter values "meeny", "miny", and "moe".
+
+INSTANTIATE_TEST_CASE_P(InstantiationName,
+                        FooTest,
+                        Values("meeny", "miny", "moe"));
+
+// To distinguish different instances of the pattern, (yes, you
+// can instantiate it more then once) the first argument to the
+// INSTANTIATE_TEST_CASE_P macro is a prefix that will be added to the
+// actual test case name. Remember to pick unique prefixes for different
+// instantiations. The tests from the instantiation above will have
+// these names:
+//
+//    * InstantiationName/FooTest.DoesBlah/0 for "meeny"
+//    * InstantiationName/FooTest.DoesBlah/1 for "miny"
+//    * InstantiationName/FooTest.DoesBlah/2 for "moe"
+//    * InstantiationName/FooTest.HasBlahBlah/0 for "meeny"
+//    * InstantiationName/FooTest.HasBlahBlah/1 for "miny"
+//    * InstantiationName/FooTest.HasBlahBlah/2 for "moe"
+//
+// You can use these names in --gtest_filter.
+//
+// This statement will instantiate all tests from FooTest again, each
+// with parameter values "cat" and "dog":
+
+const char* pets[] = {"cat", "dog"};
+INSTANTIATE_TEST_CASE_P(AnotherInstantiationName, FooTest, ValuesIn(pets));
+
+// The tests from the instantiation above will have these names:
+//
+//    * AnotherInstantiationName/FooTest.DoesBlah/0 for "cat"
+//    * AnotherInstantiationName/FooTest.DoesBlah/1 for "dog"
+//    * AnotherInstantiationName/FooTest.HasBlahBlah/0 for "cat"
+//    * AnotherInstantiationName/FooTest.HasBlahBlah/1 for "dog"
+//
+// Please note that INSTANTIATE_TEST_CASE_P will instantiate all tests
+// in the given test case, whether their definitions come before or
+// AFTER the INSTANTIATE_TEST_CASE_P statement.
+//
+// Please also note that generator expressions (including parameters to the
+// generators) are evaluated in InitGoogleTest(), after main() has started.
+// This allows the user on one hand, to adjust generator parameters in order
+// to dynamically determine a set of tests to run and on the other hand,
+// give the user a chance to inspect the generated tests with Google Test
+// reflection API before RUN_ALL_TESTS() is executed.
+//
+// You can see samples/sample7_unittest.cc and samples/sample8_unittest.cc
+// for more examples.
+//
+// In the future, we plan to publish the API for defining new parameter
+// generators. But for now this interface remains part of the internal
+// implementation and is subject to change.
+//
+//
+// A parameterized test fixture must be derived from testing::Test and from
+// testing::WithParamInterface<T>, where T is the type of the parameter
+// values. Inheriting from TestWithParam<T> satisfies that requirement because
+// TestWithParam<T> inherits from both Test and WithParamInterface. In more
+// complicated hierarchies, however, it is occasionally useful to inherit
+// separately from Test and WithParamInterface. For example:
+
+class BaseTest : public ::testing::Test {
+  // You can inherit all the usual members for a non-parameterized test
+  // fixture here.
+};
+
+class DerivedTest : public BaseTest, public ::testing::WithParamInterface<int> {
+  // The usual test fixture members go here too.
+};
+
+TEST_F(BaseTest, HasFoo) {
+  // This is an ordinary non-parameterized test.
+}
+
+TEST_P(DerivedTest, DoesBlah) {
+  // GetParam works just the same here as if you inherit from TestWithParam.
+  EXPECT_TRUE(foo.Blah(GetParam()));
+}
+
+#endif  // 0
+
+#include "gtest/internal/gtest-port.h"
+
+#if !GTEST_OS_SYMBIAN
+# include <utility>
+#endif
+
+// scripts/fuse_gtest.py depends on gtest's own header being #included
+// *unconditionally*.  Therefore these #includes cannot be moved
+// inside #if GTEST_HAS_PARAM_TEST.
+#include "gtest/internal/gtest-internal.h"
+#include "gtest/internal/gtest-param-util.h"
+#include "gtest/internal/gtest-param-util-generated.h"
+
+#if GTEST_HAS_PARAM_TEST
+
+namespace testing {
+
+// Functions producing parameter generators.
+//
+// Google Test uses these generators to produce parameters for value-
+// parameterized tests. When a parameterized test case is instantiated
+// with a particular generator, Google Test creates and runs tests
+// for each element in the sequence produced by the generator.
+//
+// In the following sample, tests from test case FooTest are instantiated
+// each three times with parameter values 3, 5, and 8:
+//
+// class FooTest : public TestWithParam<int> { ... };
+//
+// TEST_P(FooTest, TestThis) {
+// }
+// TEST_P(FooTest, TestThat) {
+// }
+// INSTANTIATE_TEST_CASE_P(TestSequence, FooTest, Values(3, 5, 8));
+//
+
+// Range() returns generators providing sequences of values in a range.
+//
+// Synopsis:
+// Range(start, end)
+//   - returns a generator producing a sequence of values {start, start+1,
+//     start+2, ..., }.
+// Range(start, end, step)
+//   - returns a generator producing a sequence of values {start, start+step,
+//     start+step+step, ..., }.
+// Notes:
+//   * The generated sequences never include end. For example, Range(1, 5)
+//     returns a generator producing a sequence {1, 2, 3, 4}. Range(1, 9, 2)
+//     returns a generator producing {1, 3, 5, 7}.
+//   * start and end must have the same type. That type may be any integral or
+//     floating-point type or a user defined type satisfying these conditions:
+//     * It must be assignable (have operator=() defined).
+//     * It must have operator+() (operator+(int-compatible type) for
+//       two-operand version).
+//     * It must have operator<() defined.
+//     Elements in the resulting sequences will also have that type.
+//   * Condition start < end must be satisfied in order for resulting sequences
+//     to contain any elements.
+//
+template <typename T, typename IncrementT>
+internal::ParamGenerator<T> Range(T start, T end, IncrementT step) {
+  return internal::ParamGenerator<T>(
+      new internal::RangeGenerator<T, IncrementT>(start, end, step));
+}
+
+template <typename T>
+internal::ParamGenerator<T> Range(T start, T end) {
+  return Range(start, end, 1);
+}
+
+// ValuesIn() function allows generation of tests with parameters coming from
+// a container.
+//
+// Synopsis:
+// ValuesIn(const T (&array)[N])
+//   - returns a generator producing sequences with elements from
+//     a C-style array.
+// ValuesIn(const Container& container)
+//   - returns a generator producing sequences with elements from
+//     an STL-style container.
+// ValuesIn(Iterator begin, Iterator end)
+//   - returns a generator producing sequences with elements from
+//     a range [begin, end) defined by a pair of STL-style iterators. These
+//     iterators can also be plain C pointers.
+//
+// Please note that ValuesIn copies the values from the containers
+// passed in and keeps them to generate tests in RUN_ALL_TESTS().
+//
+// Examples:
+//
+// This instantiates tests from test case StringTest
+// each with C-string values of "foo", "bar", and "baz":
+//
+// const char* strings[] = {"foo", "bar", "baz"};
+// INSTANTIATE_TEST_CASE_P(StringSequence, SrtingTest, ValuesIn(strings));
+//
+// This instantiates tests from test case StlStringTest
+// each with STL strings with values "a" and "b":
+//
+// ::std::vector< ::std::string> GetParameterStrings() {
+//   ::std::vector< ::std::string> v;
+//   v.push_back("a");
+//   v.push_back("b");
+//   return v;
+// }
+//
+// INSTANTIATE_TEST_CASE_P(CharSequence,
+//                         StlStringTest,
+//                         ValuesIn(GetParameterStrings()));
+//
+//
+// This will also instantiate tests from CharTest
+// each with parameter values 'a' and 'b':
+//
+// ::std::list<char> GetParameterChars() {
+//   ::std::list<char> list;
+//   list.push_back('a');
+//   list.push_back('b');
+//   return list;
+// }
+// ::std::list<char> l = GetParameterChars();
+// INSTANTIATE_TEST_CASE_P(CharSequence2,
+//                         CharTest,
+//                         ValuesIn(l.begin(), l.end()));
+//
+template <typename ForwardIterator>
+internal::ParamGenerator<
+  typename ::testing::internal::IteratorTraits<ForwardIterator>::value_type>
+ValuesIn(ForwardIterator begin, ForwardIterator end) {
+  typedef typename ::testing::internal::IteratorTraits<ForwardIterator>
+      ::value_type ParamType;
+  return internal::ParamGenerator<ParamType>(
+      new internal::ValuesInIteratorRangeGenerator<ParamType>(begin, end));
+}
+
+template <typename T, size_t N>
+internal::ParamGenerator<T> ValuesIn(const T (&array)[N]) {
+  return ValuesIn(array, array + N);
+}
+
+template <class Container>
+internal::ParamGenerator<typename Container::value_type> ValuesIn(
+    const Container& container) {
+  return ValuesIn(container.begin(), container.end());
+}
+
+// Values() allows generating tests from explicitly specified list of
+// parameters.
+//
+// Synopsis:
+// Values(T v1, T v2, ..., T vN)
+//   - returns a generator producing sequences with elements v1, v2, ..., vN.
+//
+// For example, this instantiates tests from test case BarTest each
+// with values "one", "two", and "three":
+//
+// INSTANTIATE_TEST_CASE_P(NumSequence, BarTest, Values("one", "two", "three"));
+//
+// This instantiates tests from test case BazTest each with values 1, 2, 3.5.
+// The exact type of values will depend on the type of parameter in BazTest.
+//
+// INSTANTIATE_TEST_CASE_P(FloatingNumbers, BazTest, Values(1, 2, 3.5));
+//
+// Currently, Values() supports from 1 to 50 parameters.
+//
+template <typename T1>
+internal::ValueArray1<T1> Values(T1 v1) {
+  return internal::ValueArray1<T1>(v1);
+}
+
+template <typename T1, typename T2>
+internal::ValueArray2<T1, T2> Values(T1 v1, T2 v2) {
+  return internal::ValueArray2<T1, T2>(v1, v2);
+}
+
+template <typename T1, typename T2, typename T3>
+internal::ValueArray3<T1, T2, T3> Values(T1 v1, T2 v2, T3 v3) {
+  return internal::ValueArray3<T1, T2, T3>(v1, v2, v3);
+}
+
+template <typename T1, typename T2, typename T3, typename T4>
+internal::ValueArray4<T1, T2, T3, T4> Values(T1 v1, T2 v2, T3 v3, T4 v4) {
+  return internal::ValueArray4<T1, T2, T3, T4>(v1, v2, v3, v4);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5>
+internal::ValueArray5<T1, T2, T3, T4, T5> Values(T1 v1, T2 v2, T3 v3, T4 v4,
+    T5 v5) {
+  return internal::ValueArray5<T1, T2, T3, T4, T5>(v1, v2, v3, v4, v5);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6>
+internal::ValueArray6<T1, T2, T3, T4, T5, T6> Values(T1 v1, T2 v2, T3 v3,
+    T4 v4, T5 v5, T6 v6) {
+  return internal::ValueArray6<T1, T2, T3, T4, T5, T6>(v1, v2, v3, v4, v5, v6);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7>
+internal::ValueArray7<T1, T2, T3, T4, T5, T6, T7> Values(T1 v1, T2 v2, T3 v3,
+    T4 v4, T5 v5, T6 v6, T7 v7) {
+  return internal::ValueArray7<T1, T2, T3, T4, T5, T6, T7>(v1, v2, v3, v4, v5,
+      v6, v7);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8>
+internal::ValueArray8<T1, T2, T3, T4, T5, T6, T7, T8> Values(T1 v1, T2 v2,
+    T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8) {
+  return internal::ValueArray8<T1, T2, T3, T4, T5, T6, T7, T8>(v1, v2, v3, v4,
+      v5, v6, v7, v8);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9>
+internal::ValueArray9<T1, T2, T3, T4, T5, T6, T7, T8, T9> Values(T1 v1, T2 v2,
+    T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9) {
+  return internal::ValueArray9<T1, T2, T3, T4, T5, T6, T7, T8, T9>(v1, v2, v3,
+      v4, v5, v6, v7, v8, v9);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10>
+internal::ValueArray10<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> Values(T1 v1,
+    T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10) {
+  return internal::ValueArray10<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>(v1,
+      v2, v3, v4, v5, v6, v7, v8, v9, v10);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11>
+internal::ValueArray11<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10,
+    T11> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+    T10 v10, T11 v11) {
+  return internal::ValueArray11<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10,
+      T11>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12>
+internal::ValueArray12<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+    T12> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+    T10 v10, T11 v11, T12 v12) {
+  return internal::ValueArray12<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13>
+internal::ValueArray13<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+    T13> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+    T10 v10, T11 v11, T12 v12, T13 v13) {
+  return internal::ValueArray13<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14>
+internal::ValueArray14<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14) {
+  return internal::ValueArray14<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13,
+      v14);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15>
+internal::ValueArray15<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8,
+    T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15) {
+  return internal::ValueArray15<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12,
+      v13, v14, v15);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16>
+internal::ValueArray16<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,
+    T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
+    T16 v16) {
+  return internal::ValueArray16<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11,
+      v12, v13, v14, v15, v16);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17>
+internal::ValueArray17<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,
+    T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
+    T16 v16, T17 v17) {
+  return internal::ValueArray17<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10,
+      v11, v12, v13, v14, v15, v16, v17);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18>
+internal::ValueArray18<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6,
+    T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
+    T16 v16, T17 v17, T18 v18) {
+  return internal::ValueArray18<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18>(v1, v2, v3, v4, v5, v6, v7, v8, v9,
+      v10, v11, v12, v13, v14, v15, v16, v17, v18);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19>
+internal::ValueArray19<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5,
+    T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14,
+    T15 v15, T16 v16, T17 v17, T18 v18, T19 v19) {
+  return internal::ValueArray19<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19>(v1, v2, v3, v4, v5, v6, v7, v8,
+      v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20>
+internal::ValueArray20<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20> Values(T1 v1, T2 v2, T3 v3, T4 v4,
+    T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13,
+    T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20) {
+  return internal::ValueArray20<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20>(v1, v2, v3, v4, v5, v6, v7,
+      v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21>
+internal::ValueArray21<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21> Values(T1 v1, T2 v2, T3 v3, T4 v4,
+    T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13,
+    T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21) {
+  return internal::ValueArray21<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21>(v1, v2, v3, v4, v5, v6,
+      v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22>
+internal::ValueArray22<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22> Values(T1 v1, T2 v2, T3 v3,
+    T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12,
+    T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20,
+    T21 v21, T22 v22) {
+  return internal::ValueArray22<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22>(v1, v2, v3, v4,
+      v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19,
+      v20, v21, v22);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23>
+internal::ValueArray23<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23> Values(T1 v1, T2 v2,
+    T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12,
+    T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20,
+    T21 v21, T22 v22, T23 v23) {
+  return internal::ValueArray23<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23>(v1, v2, v3,
+      v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19,
+      v20, v21, v22, v23);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24>
+internal::ValueArray24<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24> Values(T1 v1, T2 v2,
+    T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12,
+    T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20,
+    T21 v21, T22 v22, T23 v23, T24 v24) {
+  return internal::ValueArray24<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24>(v1, v2,
+      v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18,
+      v19, v20, v21, v22, v23, v24);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25>
+internal::ValueArray25<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25> Values(T1 v1,
+    T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11,
+    T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19,
+    T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25) {
+  return internal::ValueArray25<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25>(v1,
+      v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17,
+      v18, v19, v20, v21, v22, v23, v24, v25);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26>
+internal::ValueArray26<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+    T26> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+    T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+    T26 v26) {
+  return internal::ValueArray26<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+      T26>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15,
+      v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27>
+internal::ValueArray27<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+    T27> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+    T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+    T26 v26, T27 v27) {
+  return internal::ValueArray27<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+      T26, T27>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14,
+      v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28>
+internal::ValueArray28<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+    T28> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+    T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+    T26 v26, T27 v27, T28 v28) {
+  return internal::ValueArray28<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+      T26, T27, T28>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13,
+      v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27,
+      v28);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29>
+internal::ValueArray29<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+    T29> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+    T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+    T26 v26, T27 v27, T28 v28, T29 v29) {
+  return internal::ValueArray29<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+      T26, T27, T28, T29>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12,
+      v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26,
+      v27, v28, v29);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30>
+internal::ValueArray30<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+    T29, T30> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8,
+    T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16,
+    T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24,
+    T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30) {
+  return internal::ValueArray30<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+      T26, T27, T28, T29, T30>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11,
+      v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25,
+      v26, v27, v28, v29, v30);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31>
+internal::ValueArray31<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+    T29, T30, T31> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,
+    T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
+    T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23,
+    T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31) {
+  return internal::ValueArray31<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+      T26, T27, T28, T29, T30, T31>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10,
+      v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24,
+      v25, v26, v27, v28, v29, v30, v31);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32>
+internal::ValueArray32<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+    T29, T30, T31, T32> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,
+    T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
+    T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23,
+    T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31,
+    T32 v32) {
+  return internal::ValueArray32<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+      T26, T27, T28, T29, T30, T31, T32>(v1, v2, v3, v4, v5, v6, v7, v8, v9,
+      v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23,
+      v24, v25, v26, v27, v28, v29, v30, v31, v32);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33>
+internal::ValueArray33<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+    T29, T30, T31, T32, T33> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6,
+    T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
+    T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23,
+    T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31,
+    T32 v32, T33 v33) {
+  return internal::ValueArray33<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+      T26, T27, T28, T29, T30, T31, T32, T33>(v1, v2, v3, v4, v5, v6, v7, v8,
+      v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23,
+      v24, v25, v26, v27, v28, v29, v30, v31, v32, v33);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34>
+internal::ValueArray34<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+    T29, T30, T31, T32, T33, T34> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5,
+    T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14,
+    T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22,
+    T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30,
+    T31 v31, T32 v32, T33 v33, T34 v34) {
+  return internal::ValueArray34<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+      T26, T27, T28, T29, T30, T31, T32, T33, T34>(v1, v2, v3, v4, v5, v6, v7,
+      v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22,
+      v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35>
+internal::ValueArray35<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+    T29, T30, T31, T32, T33, T34, T35> Values(T1 v1, T2 v2, T3 v3, T4 v4,
+    T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13,
+    T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21,
+    T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29,
+    T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35) {
+  return internal::ValueArray35<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35>(v1, v2, v3, v4, v5, v6,
+      v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21,
+      v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36>
+internal::ValueArray36<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+    T29, T30, T31, T32, T33, T34, T35, T36> Values(T1 v1, T2 v2, T3 v3, T4 v4,
+    T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13,
+    T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21,
+    T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29,
+    T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36) {
+  return internal::ValueArray36<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36>(v1, v2, v3, v4,
+      v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19,
+      v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33,
+      v34, v35, v36);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37>
+internal::ValueArray37<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+    T29, T30, T31, T32, T33, T34, T35, T36, T37> Values(T1 v1, T2 v2, T3 v3,
+    T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12,
+    T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20,
+    T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28,
+    T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36,
+    T37 v37) {
+  return internal::ValueArray37<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37>(v1, v2, v3,
+      v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19,
+      v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33,
+      v34, v35, v36, v37);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38>
+internal::ValueArray38<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38> Values(T1 v1, T2 v2,
+    T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12,
+    T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20,
+    T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28,
+    T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36,
+    T37 v37, T38 v38) {
+  return internal::ValueArray38<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38>(v1, v2,
+      v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18,
+      v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32,
+      v33, v34, v35, v36, v37, v38);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39>
+internal::ValueArray39<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39> Values(T1 v1, T2 v2,
+    T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12,
+    T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20,
+    T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28,
+    T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36,
+    T37 v37, T38 v38, T39 v39) {
+  return internal::ValueArray39<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39>(v1,
+      v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17,
+      v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31,
+      v32, v33, v34, v35, v36, v37, v38, v39);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40>
+internal::ValueArray40<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40> Values(T1 v1,
+    T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11,
+    T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19,
+    T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27,
+    T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35,
+    T36 v36, T37 v37, T38 v38, T39 v39, T40 v40) {
+  return internal::ValueArray40<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
+      T40>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15,
+      v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29,
+      v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41>
+internal::ValueArray41<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
+    T41> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+    T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+    T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
+    T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41) {
+  return internal::ValueArray41<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
+      T40, T41>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14,
+      v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28,
+      v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42>
+internal::ValueArray42<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
+    T42> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+    T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+    T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
+    T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
+    T42 v42) {
+  return internal::ValueArray42<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
+      T40, T41, T42>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13,
+      v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27,
+      v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41,
+      v42);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43>
+internal::ValueArray43<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
+    T43> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+    T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+    T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
+    T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
+    T42 v42, T43 v43) {
+  return internal::ValueArray43<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
+      T40, T41, T42, T43>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12,
+      v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26,
+      v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40,
+      v41, v42, v43);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43, typename T44>
+internal::ValueArray44<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
+    T44> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+    T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+    T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
+    T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
+    T42 v42, T43 v43, T44 v44) {
+  return internal::ValueArray44<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
+      T40, T41, T42, T43, T44>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11,
+      v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25,
+      v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39,
+      v40, v41, v42, v43, v44);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43, typename T44, typename T45>
+internal::ValueArray45<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
+    T44, T45> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8,
+    T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16,
+    T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24,
+    T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32,
+    T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40,
+    T41 v41, T42 v42, T43 v43, T44 v44, T45 v45) {
+  return internal::ValueArray45<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
+      T40, T41, T42, T43, T44, T45>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10,
+      v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24,
+      v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38,
+      v39, v40, v41, v42, v43, v44, v45);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43, typename T44, typename T45,
+    typename T46>
+internal::ValueArray46<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
+    T44, T45, T46> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,
+    T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
+    T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23,
+    T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31,
+    T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39,
+    T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45, T46 v46) {
+  return internal::ValueArray46<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
+      T40, T41, T42, T43, T44, T45, T46>(v1, v2, v3, v4, v5, v6, v7, v8, v9,
+      v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23,
+      v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37,
+      v38, v39, v40, v41, v42, v43, v44, v45, v46);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43, typename T44, typename T45,
+    typename T46, typename T47>
+internal::ValueArray47<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
+    T44, T45, T46, T47> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,
+    T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
+    T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23,
+    T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31,
+    T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39,
+    T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47) {
+  return internal::ValueArray47<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
+      T40, T41, T42, T43, T44, T45, T46, T47>(v1, v2, v3, v4, v5, v6, v7, v8,
+      v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23,
+      v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37,
+      v38, v39, v40, v41, v42, v43, v44, v45, v46, v47);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43, typename T44, typename T45,
+    typename T46, typename T47, typename T48>
+internal::ValueArray48<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
+    T44, T45, T46, T47, T48> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6,
+    T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,
+    T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23,
+    T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31,
+    T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39,
+    T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47,
+    T48 v48) {
+  return internal::ValueArray48<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
+      T40, T41, T42, T43, T44, T45, T46, T47, T48>(v1, v2, v3, v4, v5, v6, v7,
+      v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22,
+      v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36,
+      v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43, typename T44, typename T45,
+    typename T46, typename T47, typename T48, typename T49>
+internal::ValueArray49<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
+    T44, T45, T46, T47, T48, T49> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5,
+    T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14,
+    T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22,
+    T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30,
+    T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38,
+    T39 v39, T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45, T46 v46,
+    T47 v47, T48 v48, T49 v49) {
+  return internal::ValueArray49<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
+      T40, T41, T42, T43, T44, T45, T46, T47, T48, T49>(v1, v2, v3, v4, v5, v6,
+      v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21,
+      v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35,
+      v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43, typename T44, typename T45,
+    typename T46, typename T47, typename T48, typename T49, typename T50>
+internal::ValueArray50<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
+    T44, T45, T46, T47, T48, T49, T50> Values(T1 v1, T2 v2, T3 v3, T4 v4,
+    T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13,
+    T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21,
+    T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29,
+    T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37,
+    T38 v38, T39 v39, T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45,
+    T46 v46, T47 v47, T48 v48, T49 v49, T50 v50) {
+  return internal::ValueArray50<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
+      T40, T41, T42, T43, T44, T45, T46, T47, T48, T49, T50>(v1, v2, v3, v4,
+      v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19,
+      v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33,
+      v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47,
+      v48, v49, v50);
+}
+
+// Bool() allows generating tests with parameters in a set of (false, true).
+//
+// Synopsis:
+// Bool()
+//   - returns a generator producing sequences with elements {false, true}.
+//
+// It is useful when testing code that depends on Boolean flags. Combinations
+// of multiple flags can be tested when several Bool()'s are combined using
+// Combine() function.
+//
+// In the following example all tests in the test case FlagDependentTest
+// will be instantiated twice with parameters false and true.
+//
+// class FlagDependentTest : public testing::TestWithParam<bool> {
+//   virtual void SetUp() {
+//     external_flag = GetParam();
+//   }
+// }
+// INSTANTIATE_TEST_CASE_P(BoolSequence, FlagDependentTest, Bool());
+//
+inline internal::ParamGenerator<bool> Bool() {
+  return Values(false, true);
+}
+
+# if GTEST_HAS_COMBINE
+// Combine() allows the user to combine two or more sequences to produce
+// values of a Cartesian product of those sequences' elements.
+//
+// Synopsis:
+// Combine(gen1, gen2, ..., genN)
+//   - returns a generator producing sequences with elements coming from
+//     the Cartesian product of elements from the sequences generated by
+//     gen1, gen2, ..., genN. The sequence elements will have a type of
+//     tuple<T1, T2, ..., TN> where T1, T2, ..., TN are the types
+//     of elements from sequences produces by gen1, gen2, ..., genN.
+//
+// Combine can have up to 10 arguments. This number is currently limited
+// by the maximum number of elements in the tuple implementation used by Google
+// Test.
+//
+// Example:
+//
+// This will instantiate tests in test case AnimalTest each one with
+// the parameter values tuple("cat", BLACK), tuple("cat", WHITE),
+// tuple("dog", BLACK), and tuple("dog", WHITE):
+//
+// enum Color { BLACK, GRAY, WHITE };
+// class AnimalTest
+//     : public testing::TestWithParam<tuple<const char*, Color> > {...};
+//
+// TEST_P(AnimalTest, AnimalLooksNice) {...}
+//
+// INSTANTIATE_TEST_CASE_P(AnimalVariations, AnimalTest,
+//                         Combine(Values("cat", "dog"),
+//                                 Values(BLACK, WHITE)));
+//
+// This will instantiate tests in FlagDependentTest with all variations of two
+// Boolean flags:
+//
+// class FlagDependentTest
+//     : public testing::TestWithParam<tuple<bool, bool> > {
+//   virtual void SetUp() {
+//     // Assigns external_flag_1 and external_flag_2 values from the tuple.
+//     tie(external_flag_1, external_flag_2) = GetParam();
+//   }
+// };
+//
+// TEST_P(FlagDependentTest, TestFeature1) {
+//   // Test your code using external_flag_1 and external_flag_2 here.
+// }
+// INSTANTIATE_TEST_CASE_P(TwoBoolSequence, FlagDependentTest,
+//                         Combine(Bool(), Bool()));
+//
+template <typename Generator1, typename Generator2>
+internal::CartesianProductHolder2<Generator1, Generator2> Combine(
+    const Generator1& g1, const Generator2& g2) {
+  return internal::CartesianProductHolder2<Generator1, Generator2>(
+      g1, g2);
+}
+
+template <typename Generator1, typename Generator2, typename Generator3>
+internal::CartesianProductHolder3<Generator1, Generator2, Generator3> Combine(
+    const Generator1& g1, const Generator2& g2, const Generator3& g3) {
+  return internal::CartesianProductHolder3<Generator1, Generator2, Generator3>(
+      g1, g2, g3);
+}
+
+template <typename Generator1, typename Generator2, typename Generator3,
+    typename Generator4>
+internal::CartesianProductHolder4<Generator1, Generator2, Generator3,
+    Generator4> Combine(
+    const Generator1& g1, const Generator2& g2, const Generator3& g3,
+        const Generator4& g4) {
+  return internal::CartesianProductHolder4<Generator1, Generator2, Generator3,
+      Generator4>(
+      g1, g2, g3, g4);
+}
+
+template <typename Generator1, typename Generator2, typename Generator3,
+    typename Generator4, typename Generator5>
+internal::CartesianProductHolder5<Generator1, Generator2, Generator3,
+    Generator4, Generator5> Combine(
+    const Generator1& g1, const Generator2& g2, const Generator3& g3,
+        const Generator4& g4, const Generator5& g5) {
+  return internal::CartesianProductHolder5<Generator1, Generator2, Generator3,
+      Generator4, Generator5>(
+      g1, g2, g3, g4, g5);
+}
+
+template <typename Generator1, typename Generator2, typename Generator3,
+    typename Generator4, typename Generator5, typename Generator6>
+internal::CartesianProductHolder6<Generator1, Generator2, Generator3,
+    Generator4, Generator5, Generator6> Combine(
+    const Generator1& g1, const Generator2& g2, const Generator3& g3,
+        const Generator4& g4, const Generator5& g5, const Generator6& g6) {
+  return internal::CartesianProductHolder6<Generator1, Generator2, Generator3,
+      Generator4, Generator5, Generator6>(
+      g1, g2, g3, g4, g5, g6);
+}
+
+template <typename Generator1, typename Generator2, typename Generator3,
+    typename Generator4, typename Generator5, typename Generator6,
+    typename Generator7>
+internal::CartesianProductHolder7<Generator1, Generator2, Generator3,
+    Generator4, Generator5, Generator6, Generator7> Combine(
+    const Generator1& g1, const Generator2& g2, const Generator3& g3,
+        const Generator4& g4, const Generator5& g5, const Generator6& g6,
+        const Generator7& g7) {
+  return internal::CartesianProductHolder7<Generator1, Generator2, Generator3,
+      Generator4, Generator5, Generator6, Generator7>(
+      g1, g2, g3, g4, g5, g6, g7);
+}
+
+template <typename Generator1, typename Generator2, typename Generator3,
+    typename Generator4, typename Generator5, typename Generator6,
+    typename Generator7, typename Generator8>
+internal::CartesianProductHolder8<Generator1, Generator2, Generator3,
+    Generator4, Generator5, Generator6, Generator7, Generator8> Combine(
+    const Generator1& g1, const Generator2& g2, const Generator3& g3,
+        const Generator4& g4, const Generator5& g5, const Generator6& g6,
+        const Generator7& g7, const Generator8& g8) {
+  return internal::CartesianProductHolder8<Generator1, Generator2, Generator3,
+      Generator4, Generator5, Generator6, Generator7, Generator8>(
+      g1, g2, g3, g4, g5, g6, g7, g8);
+}
+
+template <typename Generator1, typename Generator2, typename Generator3,
+    typename Generator4, typename Generator5, typename Generator6,
+    typename Generator7, typename Generator8, typename Generator9>
+internal::CartesianProductHolder9<Generator1, Generator2, Generator3,
+    Generator4, Generator5, Generator6, Generator7, Generator8,
+    Generator9> Combine(
+    const Generator1& g1, const Generator2& g2, const Generator3& g3,
+        const Generator4& g4, const Generator5& g5, const Generator6& g6,
+        const Generator7& g7, const Generator8& g8, const Generator9& g9) {
+  return internal::CartesianProductHolder9<Generator1, Generator2, Generator3,
+      Generator4, Generator5, Generator6, Generator7, Generator8, Generator9>(
+      g1, g2, g3, g4, g5, g6, g7, g8, g9);
+}
+
+template <typename Generator1, typename Generator2, typename Generator3,
+    typename Generator4, typename Generator5, typename Generator6,
+    typename Generator7, typename Generator8, typename Generator9,
+    typename Generator10>
+internal::CartesianProductHolder10<Generator1, Generator2, Generator3,
+    Generator4, Generator5, Generator6, Generator7, Generator8, Generator9,
+    Generator10> Combine(
+    const Generator1& g1, const Generator2& g2, const Generator3& g3,
+        const Generator4& g4, const Generator5& g5, const Generator6& g6,
+        const Generator7& g7, const Generator8& g8, const Generator9& g9,
+        const Generator10& g10) {
+  return internal::CartesianProductHolder10<Generator1, Generator2, Generator3,
+      Generator4, Generator5, Generator6, Generator7, Generator8, Generator9,
+      Generator10>(
+      g1, g2, g3, g4, g5, g6, g7, g8, g9, g10);
+}
+# endif  // GTEST_HAS_COMBINE
+
+
+
+# define TEST_P(test_case_name, test_name) \
+  class GTEST_TEST_CLASS_NAME_(test_case_name, test_name) \
+      : public test_case_name { \
+   public: \
+    GTEST_TEST_CLASS_NAME_(test_case_name, test_name)() {} \
+    virtual void TestBody(); \
+   private: \
+    static int AddToRegistry() { \
+      ::testing::UnitTest::GetInstance()->parameterized_test_registry(). \
+          GetTestCasePatternHolder<test_case_name>(\
+              #test_case_name, __FILE__, __LINE__)->AddTestPattern(\
+                  #test_case_name, \
+                  #test_name, \
+                  new ::testing::internal::TestMetaFactory< \
+                      GTEST_TEST_CLASS_NAME_(test_case_name, test_name)>()); \
+      return 0; \
+    } \
+    static int gtest_registering_dummy_; \
+    GTEST_DISALLOW_COPY_AND_ASSIGN_(\
+        GTEST_TEST_CLASS_NAME_(test_case_name, test_name)); \
+  }; \
+  int GTEST_TEST_CLASS_NAME_(test_case_name, \
+                             test_name)::gtest_registering_dummy_ = \
+      GTEST_TEST_CLASS_NAME_(test_case_name, test_name)::AddToRegistry(); \
+  void GTEST_TEST_CLASS_NAME_(test_case_name, test_name)::TestBody()
+
+# define INSTANTIATE_TEST_CASE_P(prefix, test_case_name, generator) \
+  ::testing::internal::ParamGenerator<test_case_name::ParamType> \
+      gtest_##prefix##test_case_name##_EvalGenerator_() { return generator; } \
+  int gtest_##prefix##test_case_name##_dummy_ = \
+      ::testing::UnitTest::GetInstance()->parameterized_test_registry(). \
+          GetTestCasePatternHolder<test_case_name>(\
+              #test_case_name, __FILE__, __LINE__)->AddTestCaseInstantiation(\
+                  #prefix, \
+                  &gtest_##prefix##test_case_name##_EvalGenerator_, \
+                  __FILE__, __LINE__)
+
+}  // namespace testing
+
+#endif  // GTEST_HAS_PARAM_TEST
+
+#endif  // GTEST_INCLUDE_GTEST_GTEST_PARAM_TEST_H_
diff --git a/contrib/gtest-1.7.0/include/gtest/gtest-param-test.h.pump b/contrib/gtest-1.7.0/include/gtest/gtest-param-test.h.pump
new file mode 100644
index 0000000..2dc9303
--- /dev/null
+++ b/contrib/gtest-1.7.0/include/gtest/gtest-param-test.h.pump
@@ -0,0 +1,487 @@
+$$ -*- mode: c++; -*-
+$var n = 50  $$ Maximum length of Values arguments we want to support.
+$var maxtuple = 10  $$ Maximum number of Combine arguments we want to support.
+// Copyright 2008, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Authors: vladl at google.com (Vlad Losev)
+//
+// Macros and functions for implementing parameterized tests
+// in Google C++ Testing Framework (Google Test)
+//
+// This file is generated by a SCRIPT.  DO NOT EDIT BY HAND!
+//
+#ifndef GTEST_INCLUDE_GTEST_GTEST_PARAM_TEST_H_
+#define GTEST_INCLUDE_GTEST_GTEST_PARAM_TEST_H_
+
+
+// Value-parameterized tests allow you to test your code with different
+// parameters without writing multiple copies of the same test.
+//
+// Here is how you use value-parameterized tests:
+
+#if 0
+
+// To write value-parameterized tests, first you should define a fixture
+// class. It is usually derived from testing::TestWithParam<T> (see below for
+// another inheritance scheme that's sometimes useful in more complicated
+// class hierarchies), where the type of your parameter values.
+// TestWithParam<T> is itself derived from testing::Test. T can be any
+// copyable type. If it's a raw pointer, you are responsible for managing the
+// lifespan of the pointed values.
+
+class FooTest : public ::testing::TestWithParam<const char*> {
+  // You can implement all the usual class fixture members here.
+};
+
+// Then, use the TEST_P macro to define as many parameterized tests
+// for this fixture as you want. The _P suffix is for "parameterized"
+// or "pattern", whichever you prefer to think.
+
+TEST_P(FooTest, DoesBlah) {
+  // Inside a test, access the test parameter with the GetParam() method
+  // of the TestWithParam<T> class:
+  EXPECT_TRUE(foo.Blah(GetParam()));
+  ...
+}
+
+TEST_P(FooTest, HasBlahBlah) {
+  ...
+}
+
+// Finally, you can use INSTANTIATE_TEST_CASE_P to instantiate the test
+// case with any set of parameters you want. Google Test defines a number
+// of functions for generating test parameters. They return what we call
+// (surprise!) parameter generators. Here is a  summary of them, which
+// are all in the testing namespace:
+//
+//
+//  Range(begin, end [, step]) - Yields values {begin, begin+step,
+//                               begin+step+step, ...}. The values do not
+//                               include end. step defaults to 1.
+//  Values(v1, v2, ..., vN)    - Yields values {v1, v2, ..., vN}.
+//  ValuesIn(container)        - Yields values from a C-style array, an STL
+//  ValuesIn(begin,end)          container, or an iterator range [begin, end).
+//  Bool()                     - Yields sequence {false, true}.
+//  Combine(g1, g2, ..., gN)   - Yields all combinations (the Cartesian product
+//                               for the math savvy) of the values generated
+//                               by the N generators.
+//
+// For more details, see comments at the definitions of these functions below
+// in this file.
+//
+// The following statement will instantiate tests from the FooTest test case
+// each with parameter values "meeny", "miny", and "moe".
+
+INSTANTIATE_TEST_CASE_P(InstantiationName,
+                        FooTest,
+                        Values("meeny", "miny", "moe"));
+
+// To distinguish different instances of the pattern, (yes, you
+// can instantiate it more then once) the first argument to the
+// INSTANTIATE_TEST_CASE_P macro is a prefix that will be added to the
+// actual test case name. Remember to pick unique prefixes for different
+// instantiations. The tests from the instantiation above will have
+// these names:
+//
+//    * InstantiationName/FooTest.DoesBlah/0 for "meeny"
+//    * InstantiationName/FooTest.DoesBlah/1 for "miny"
+//    * InstantiationName/FooTest.DoesBlah/2 for "moe"
+//    * InstantiationName/FooTest.HasBlahBlah/0 for "meeny"
+//    * InstantiationName/FooTest.HasBlahBlah/1 for "miny"
+//    * InstantiationName/FooTest.HasBlahBlah/2 for "moe"
+//
+// You can use these names in --gtest_filter.
+//
+// This statement will instantiate all tests from FooTest again, each
+// with parameter values "cat" and "dog":
+
+const char* pets[] = {"cat", "dog"};
+INSTANTIATE_TEST_CASE_P(AnotherInstantiationName, FooTest, ValuesIn(pets));
+
+// The tests from the instantiation above will have these names:
+//
+//    * AnotherInstantiationName/FooTest.DoesBlah/0 for "cat"
+//    * AnotherInstantiationName/FooTest.DoesBlah/1 for "dog"
+//    * AnotherInstantiationName/FooTest.HasBlahBlah/0 for "cat"
+//    * AnotherInstantiationName/FooTest.HasBlahBlah/1 for "dog"
+//
+// Please note that INSTANTIATE_TEST_CASE_P will instantiate all tests
+// in the given test case, whether their definitions come before or
+// AFTER the INSTANTIATE_TEST_CASE_P statement.
+//
+// Please also note that generator expressions (including parameters to the
+// generators) are evaluated in InitGoogleTest(), after main() has started.
+// This allows the user on one hand, to adjust generator parameters in order
+// to dynamically determine a set of tests to run and on the other hand,
+// give the user a chance to inspect the generated tests with Google Test
+// reflection API before RUN_ALL_TESTS() is executed.
+//
+// You can see samples/sample7_unittest.cc and samples/sample8_unittest.cc
+// for more examples.
+//
+// In the future, we plan to publish the API for defining new parameter
+// generators. But for now this interface remains part of the internal
+// implementation and is subject to change.
+//
+//
+// A parameterized test fixture must be derived from testing::Test and from
+// testing::WithParamInterface<T>, where T is the type of the parameter
+// values. Inheriting from TestWithParam<T> satisfies that requirement because
+// TestWithParam<T> inherits from both Test and WithParamInterface. In more
+// complicated hierarchies, however, it is occasionally useful to inherit
+// separately from Test and WithParamInterface. For example:
+
+class BaseTest : public ::testing::Test {
+  // You can inherit all the usual members for a non-parameterized test
+  // fixture here.
+};
+
+class DerivedTest : public BaseTest, public ::testing::WithParamInterface<int> {
+  // The usual test fixture members go here too.
+};
+
+TEST_F(BaseTest, HasFoo) {
+  // This is an ordinary non-parameterized test.
+}
+
+TEST_P(DerivedTest, DoesBlah) {
+  // GetParam works just the same here as if you inherit from TestWithParam.
+  EXPECT_TRUE(foo.Blah(GetParam()));
+}
+
+#endif  // 0
+
+#include "gtest/internal/gtest-port.h"
+
+#if !GTEST_OS_SYMBIAN
+# include <utility>
+#endif
+
+// scripts/fuse_gtest.py depends on gtest's own header being #included
+// *unconditionally*.  Therefore these #includes cannot be moved
+// inside #if GTEST_HAS_PARAM_TEST.
+#include "gtest/internal/gtest-internal.h"
+#include "gtest/internal/gtest-param-util.h"
+#include "gtest/internal/gtest-param-util-generated.h"
+
+#if GTEST_HAS_PARAM_TEST
+
+namespace testing {
+
+// Functions producing parameter generators.
+//
+// Google Test uses these generators to produce parameters for value-
+// parameterized tests. When a parameterized test case is instantiated
+// with a particular generator, Google Test creates and runs tests
+// for each element in the sequence produced by the generator.
+//
+// In the following sample, tests from test case FooTest are instantiated
+// each three times with parameter values 3, 5, and 8:
+//
+// class FooTest : public TestWithParam<int> { ... };
+//
+// TEST_P(FooTest, TestThis) {
+// }
+// TEST_P(FooTest, TestThat) {
+// }
+// INSTANTIATE_TEST_CASE_P(TestSequence, FooTest, Values(3, 5, 8));
+//
+
+// Range() returns generators providing sequences of values in a range.
+//
+// Synopsis:
+// Range(start, end)
+//   - returns a generator producing a sequence of values {start, start+1,
+//     start+2, ..., }.
+// Range(start, end, step)
+//   - returns a generator producing a sequence of values {start, start+step,
+//     start+step+step, ..., }.
+// Notes:
+//   * The generated sequences never include end. For example, Range(1, 5)
+//     returns a generator producing a sequence {1, 2, 3, 4}. Range(1, 9, 2)
+//     returns a generator producing {1, 3, 5, 7}.
+//   * start and end must have the same type. That type may be any integral or
+//     floating-point type or a user defined type satisfying these conditions:
+//     * It must be assignable (have operator=() defined).
+//     * It must have operator+() (operator+(int-compatible type) for
+//       two-operand version).
+//     * It must have operator<() defined.
+//     Elements in the resulting sequences will also have that type.
+//   * Condition start < end must be satisfied in order for resulting sequences
+//     to contain any elements.
+//
+template <typename T, typename IncrementT>
+internal::ParamGenerator<T> Range(T start, T end, IncrementT step) {
+  return internal::ParamGenerator<T>(
+      new internal::RangeGenerator<T, IncrementT>(start, end, step));
+}
+
+template <typename T>
+internal::ParamGenerator<T> Range(T start, T end) {
+  return Range(start, end, 1);
+}
+
+// ValuesIn() function allows generation of tests with parameters coming from
+// a container.
+//
+// Synopsis:
+// ValuesIn(const T (&array)[N])
+//   - returns a generator producing sequences with elements from
+//     a C-style array.
+// ValuesIn(const Container& container)
+//   - returns a generator producing sequences with elements from
+//     an STL-style container.
+// ValuesIn(Iterator begin, Iterator end)
+//   - returns a generator producing sequences with elements from
+//     a range [begin, end) defined by a pair of STL-style iterators. These
+//     iterators can also be plain C pointers.
+//
+// Please note that ValuesIn copies the values from the containers
+// passed in and keeps them to generate tests in RUN_ALL_TESTS().
+//
+// Examples:
+//
+// This instantiates tests from test case StringTest
+// each with C-string values of "foo", "bar", and "baz":
+//
+// const char* strings[] = {"foo", "bar", "baz"};
+// INSTANTIATE_TEST_CASE_P(StringSequence, SrtingTest, ValuesIn(strings));
+//
+// This instantiates tests from test case StlStringTest
+// each with STL strings with values "a" and "b":
+//
+// ::std::vector< ::std::string> GetParameterStrings() {
+//   ::std::vector< ::std::string> v;
+//   v.push_back("a");
+//   v.push_back("b");
+//   return v;
+// }
+//
+// INSTANTIATE_TEST_CASE_P(CharSequence,
+//                         StlStringTest,
+//                         ValuesIn(GetParameterStrings()));
+//
+//
+// This will also instantiate tests from CharTest
+// each with parameter values 'a' and 'b':
+//
+// ::std::list<char> GetParameterChars() {
+//   ::std::list<char> list;
+//   list.push_back('a');
+//   list.push_back('b');
+//   return list;
+// }
+// ::std::list<char> l = GetParameterChars();
+// INSTANTIATE_TEST_CASE_P(CharSequence2,
+//                         CharTest,
+//                         ValuesIn(l.begin(), l.end()));
+//
+template <typename ForwardIterator>
+internal::ParamGenerator<
+  typename ::testing::internal::IteratorTraits<ForwardIterator>::value_type>
+ValuesIn(ForwardIterator begin, ForwardIterator end) {
+  typedef typename ::testing::internal::IteratorTraits<ForwardIterator>
+      ::value_type ParamType;
+  return internal::ParamGenerator<ParamType>(
+      new internal::ValuesInIteratorRangeGenerator<ParamType>(begin, end));
+}
+
+template <typename T, size_t N>
+internal::ParamGenerator<T> ValuesIn(const T (&array)[N]) {
+  return ValuesIn(array, array + N);
+}
+
+template <class Container>
+internal::ParamGenerator<typename Container::value_type> ValuesIn(
+    const Container& container) {
+  return ValuesIn(container.begin(), container.end());
+}
+
+// Values() allows generating tests from explicitly specified list of
+// parameters.
+//
+// Synopsis:
+// Values(T v1, T v2, ..., T vN)
+//   - returns a generator producing sequences with elements v1, v2, ..., vN.
+//
+// For example, this instantiates tests from test case BarTest each
+// with values "one", "two", and "three":
+//
+// INSTANTIATE_TEST_CASE_P(NumSequence, BarTest, Values("one", "two", "three"));
+//
+// This instantiates tests from test case BazTest each with values 1, 2, 3.5.
+// The exact type of values will depend on the type of parameter in BazTest.
+//
+// INSTANTIATE_TEST_CASE_P(FloatingNumbers, BazTest, Values(1, 2, 3.5));
+//
+// Currently, Values() supports from 1 to $n parameters.
+//
+$range i 1..n
+$for i [[
+$range j 1..i
+
+template <$for j, [[typename T$j]]>
+internal::ValueArray$i<$for j, [[T$j]]> Values($for j, [[T$j v$j]]) {
+  return internal::ValueArray$i<$for j, [[T$j]]>($for j, [[v$j]]);
+}
+
+]]
+
+// Bool() allows generating tests with parameters in a set of (false, true).
+//
+// Synopsis:
+// Bool()
+//   - returns a generator producing sequences with elements {false, true}.
+//
+// It is useful when testing code that depends on Boolean flags. Combinations
+// of multiple flags can be tested when several Bool()'s are combined using
+// Combine() function.
+//
+// In the following example all tests in the test case FlagDependentTest
+// will be instantiated twice with parameters false and true.
+//
+// class FlagDependentTest : public testing::TestWithParam<bool> {
+//   virtual void SetUp() {
+//     external_flag = GetParam();
+//   }
+// }
+// INSTANTIATE_TEST_CASE_P(BoolSequence, FlagDependentTest, Bool());
+//
+inline internal::ParamGenerator<bool> Bool() {
+  return Values(false, true);
+}
+
+# if GTEST_HAS_COMBINE
+// Combine() allows the user to combine two or more sequences to produce
+// values of a Cartesian product of those sequences' elements.
+//
+// Synopsis:
+// Combine(gen1, gen2, ..., genN)
+//   - returns a generator producing sequences with elements coming from
+//     the Cartesian product of elements from the sequences generated by
+//     gen1, gen2, ..., genN. The sequence elements will have a type of
+//     tuple<T1, T2, ..., TN> where T1, T2, ..., TN are the types
+//     of elements from sequences produces by gen1, gen2, ..., genN.
+//
+// Combine can have up to $maxtuple arguments. This number is currently limited
+// by the maximum number of elements in the tuple implementation used by Google
+// Test.
+//
+// Example:
+//
+// This will instantiate tests in test case AnimalTest each one with
+// the parameter values tuple("cat", BLACK), tuple("cat", WHITE),
+// tuple("dog", BLACK), and tuple("dog", WHITE):
+//
+// enum Color { BLACK, GRAY, WHITE };
+// class AnimalTest
+//     : public testing::TestWithParam<tuple<const char*, Color> > {...};
+//
+// TEST_P(AnimalTest, AnimalLooksNice) {...}
+//
+// INSTANTIATE_TEST_CASE_P(AnimalVariations, AnimalTest,
+//                         Combine(Values("cat", "dog"),
+//                                 Values(BLACK, WHITE)));
+//
+// This will instantiate tests in FlagDependentTest with all variations of two
+// Boolean flags:
+//
+// class FlagDependentTest
+//     : public testing::TestWithParam<tuple<bool, bool> > {
+//   virtual void SetUp() {
+//     // Assigns external_flag_1 and external_flag_2 values from the tuple.
+//     tie(external_flag_1, external_flag_2) = GetParam();
+//   }
+// };
+//
+// TEST_P(FlagDependentTest, TestFeature1) {
+//   // Test your code using external_flag_1 and external_flag_2 here.
+// }
+// INSTANTIATE_TEST_CASE_P(TwoBoolSequence, FlagDependentTest,
+//                         Combine(Bool(), Bool()));
+//
+$range i 2..maxtuple
+$for i [[
+$range j 1..i
+
+template <$for j, [[typename Generator$j]]>
+internal::CartesianProductHolder$i<$for j, [[Generator$j]]> Combine(
+    $for j, [[const Generator$j& g$j]]) {
+  return internal::CartesianProductHolder$i<$for j, [[Generator$j]]>(
+      $for j, [[g$j]]);
+}
+
+]]
+# endif  // GTEST_HAS_COMBINE
+
+
+
+# define TEST_P(test_case_name, test_name) \
+  class GTEST_TEST_CLASS_NAME_(test_case_name, test_name) \
+      : public test_case_name { \
+   public: \
+    GTEST_TEST_CLASS_NAME_(test_case_name, test_name)() {} \
+    virtual void TestBody(); \
+   private: \
+    static int AddToRegistry() { \
+      ::testing::UnitTest::GetInstance()->parameterized_test_registry(). \
+          GetTestCasePatternHolder<test_case_name>(\
+              #test_case_name, __FILE__, __LINE__)->AddTestPattern(\
+                  #test_case_name, \
+                  #test_name, \
+                  new ::testing::internal::TestMetaFactory< \
+                      GTEST_TEST_CLASS_NAME_(test_case_name, test_name)>()); \
+      return 0; \
+    } \
+    static int gtest_registering_dummy_; \
+    GTEST_DISALLOW_COPY_AND_ASSIGN_(\
+        GTEST_TEST_CLASS_NAME_(test_case_name, test_name)); \
+  }; \
+  int GTEST_TEST_CLASS_NAME_(test_case_name, \
+                             test_name)::gtest_registering_dummy_ = \
+      GTEST_TEST_CLASS_NAME_(test_case_name, test_name)::AddToRegistry(); \
+  void GTEST_TEST_CLASS_NAME_(test_case_name, test_name)::TestBody()
+
+# define INSTANTIATE_TEST_CASE_P(prefix, test_case_name, generator) \
+  ::testing::internal::ParamGenerator<test_case_name::ParamType> \
+      gtest_##prefix##test_case_name##_EvalGenerator_() { return generator; } \
+  int gtest_##prefix##test_case_name##_dummy_ = \
+      ::testing::UnitTest::GetInstance()->parameterized_test_registry(). \
+          GetTestCasePatternHolder<test_case_name>(\
+              #test_case_name, __FILE__, __LINE__)->AddTestCaseInstantiation(\
+                  #prefix, \
+                  &gtest_##prefix##test_case_name##_EvalGenerator_, \
+                  __FILE__, __LINE__)
+
+}  // namespace testing
+
+#endif  // GTEST_HAS_PARAM_TEST
+
+#endif  // GTEST_INCLUDE_GTEST_GTEST_PARAM_TEST_H_
diff --git a/contrib/gtest-1.7.0/include/gtest/gtest-printers.h b/contrib/gtest-1.7.0/include/gtest/gtest-printers.h
new file mode 100644
index 0000000..0639d9f
--- /dev/null
+++ b/contrib/gtest-1.7.0/include/gtest/gtest-printers.h
@@ -0,0 +1,855 @@
+// Copyright 2007, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+
+// Google Test - The Google C++ Testing Framework
+//
+// This file implements a universal value printer that can print a
+// value of any type T:
+//
+//   void ::testing::internal::UniversalPrinter<T>::Print(value, ostream_ptr);
+//
+// A user can teach this function how to print a class type T by
+// defining either operator<<() or PrintTo() in the namespace that
+// defines T.  More specifically, the FIRST defined function in the
+// following list will be used (assuming T is defined in namespace
+// foo):
+//
+//   1. foo::PrintTo(const T&, ostream*)
+//   2. operator<<(ostream&, const T&) defined in either foo or the
+//      global namespace.
+//
+// If none of the above is defined, it will print the debug string of
+// the value if it is a protocol buffer, or print the raw bytes in the
+// value otherwise.
+//
+// To aid debugging: when T is a reference type, the address of the
+// value is also printed; when T is a (const) char pointer, both the
+// pointer value and the NUL-terminated string it points to are
+// printed.
+//
+// We also provide some convenient wrappers:
+//
+//   // Prints a value to a string.  For a (const or not) char
+//   // pointer, the NUL-terminated string (but not the pointer) is
+//   // printed.
+//   std::string ::testing::PrintToString(const T& value);
+//
+//   // Prints a value tersely: for a reference type, the referenced
+//   // value (but not the address) is printed; for a (const or not) char
+//   // pointer, the NUL-terminated string (but not the pointer) is
+//   // printed.
+//   void ::testing::internal::UniversalTersePrint(const T& value, ostream*);
+//
+//   // Prints value using the type inferred by the compiler.  The difference
+//   // from UniversalTersePrint() is that this function prints both the
+//   // pointer and the NUL-terminated string for a (const or not) char pointer.
+//   void ::testing::internal::UniversalPrint(const T& value, ostream*);
+//
+//   // Prints the fields of a tuple tersely to a string vector, one
+//   // element for each field. Tuple support must be enabled in
+//   // gtest-port.h.
+//   std::vector<string> UniversalTersePrintTupleFieldsToStrings(
+//       const Tuple& value);
+//
+// Known limitation:
+//
+// The print primitives print the elements of an STL-style container
+// using the compiler-inferred type of *iter where iter is a
+// const_iterator of the container.  When const_iterator is an input
+// iterator but not a forward iterator, this inferred type may not
+// match value_type, and the print output may be incorrect.  In
+// practice, this is rarely a problem as for most containers
+// const_iterator is a forward iterator.  We'll fix this if there's an
+// actual need for it.  Note that this fix cannot rely on value_type
+// being defined as many user-defined container types don't have
+// value_type.
+
+#ifndef GTEST_INCLUDE_GTEST_GTEST_PRINTERS_H_
+#define GTEST_INCLUDE_GTEST_GTEST_PRINTERS_H_
+
+#include <ostream>  // NOLINT
+#include <sstream>
+#include <string>
+#include <utility>
+#include <vector>
+#include "gtest/internal/gtest-port.h"
+#include "gtest/internal/gtest-internal.h"
+
+namespace testing {
+
+// Definitions in the 'internal' and 'internal2' name spaces are
+// subject to change without notice.  DO NOT USE THEM IN USER CODE!
+namespace internal2 {
+
+// Prints the given number of bytes in the given object to the given
+// ostream.
+GTEST_API_ void PrintBytesInObjectTo(const unsigned char* obj_bytes,
+                                     size_t count,
+                                     ::std::ostream* os);
+
+// For selecting which printer to use when a given type has neither <<
+// nor PrintTo().
+enum TypeKind {
+  kProtobuf,              // a protobuf type
+  kConvertibleToInteger,  // a type implicitly convertible to BiggestInt
+                          // (e.g. a named or unnamed enum type)
+  kOtherType              // anything else
+};
+
+// TypeWithoutFormatter<T, kTypeKind>::PrintValue(value, os) is called
+// by the universal printer to print a value of type T when neither
+// operator<< nor PrintTo() is defined for T, where kTypeKind is the
+// "kind" of T as defined by enum TypeKind.
+template <typename T, TypeKind kTypeKind>
+class TypeWithoutFormatter {
+ public:
+  // This default version is called when kTypeKind is kOtherType.
+  static void PrintValue(const T& value, ::std::ostream* os) {
+    PrintBytesInObjectTo(reinterpret_cast<const unsigned char*>(&value),
+                         sizeof(value), os);
+  }
+};
+
+// We print a protobuf using its ShortDebugString() when the string
+// doesn't exceed this many characters; otherwise we print it using
+// DebugString() for better readability.
+const size_t kProtobufOneLinerMaxLength = 50;
+
+template <typename T>
+class TypeWithoutFormatter<T, kProtobuf> {
+ public:
+  static void PrintValue(const T& value, ::std::ostream* os) {
+    const ::testing::internal::string short_str = value.ShortDebugString();
+    const ::testing::internal::string pretty_str =
+        short_str.length() <= kProtobufOneLinerMaxLength ?
+        short_str : ("\n" + value.DebugString());
+    *os << ("<" + pretty_str + ">");
+  }
+};
+
+template <typename T>
+class TypeWithoutFormatter<T, kConvertibleToInteger> {
+ public:
+  // Since T has no << operator or PrintTo() but can be implicitly
+  // converted to BiggestInt, we print it as a BiggestInt.
+  //
+  // Most likely T is an enum type (either named or unnamed), in which
+  // case printing it as an integer is the desired behavior.  In case
+  // T is not an enum, printing it as an integer is the best we can do
+  // given that it has no user-defined printer.
+  static void PrintValue(const T& value, ::std::ostream* os) {
+    const internal::BiggestInt kBigInt = value;
+    *os << kBigInt;
+  }
+};
+
+// Prints the given value to the given ostream.  If the value is a
+// protocol message, its debug string is printed; if it's an enum or
+// of a type implicitly convertible to BiggestInt, it's printed as an
+// integer; otherwise the bytes in the value are printed.  This is
+// what UniversalPrinter<T>::Print() does when it knows nothing about
+// type T and T has neither << operator nor PrintTo().
+//
+// A user can override this behavior for a class type Foo by defining
+// a << operator in the namespace where Foo is defined.
+//
+// We put this operator in namespace 'internal2' instead of 'internal'
+// to simplify the implementation, as much code in 'internal' needs to
+// use << in STL, which would conflict with our own << were it defined
+// in 'internal'.
+//
+// Note that this operator<< takes a generic std::basic_ostream<Char,
+// CharTraits> type instead of the more restricted std::ostream.  If
+// we define it to take an std::ostream instead, we'll get an
+// "ambiguous overloads" compiler error when trying to print a type
+// Foo that supports streaming to std::basic_ostream<Char,
+// CharTraits>, as the compiler cannot tell whether
+// operator<<(std::ostream&, const T&) or
+// operator<<(std::basic_stream<Char, CharTraits>, const Foo&) is more
+// specific.
+template <typename Char, typename CharTraits, typename T>
+::std::basic_ostream<Char, CharTraits>& operator<<(
+    ::std::basic_ostream<Char, CharTraits>& os, const T& x) {
+  TypeWithoutFormatter<T,
+      (internal::IsAProtocolMessage<T>::value ? kProtobuf :
+       internal::ImplicitlyConvertible<const T&, internal::BiggestInt>::value ?
+       kConvertibleToInteger : kOtherType)>::PrintValue(x, &os);
+  return os;
+}
+
+}  // namespace internal2
+}  // namespace testing
+
+// This namespace MUST NOT BE NESTED IN ::testing, or the name look-up
+// magic needed for implementing UniversalPrinter won't work.
+namespace testing_internal {
+
+// Used to print a value that is not an STL-style container when the
+// user doesn't define PrintTo() for it.
+template <typename T>
+void DefaultPrintNonContainerTo(const T& value, ::std::ostream* os) {
+  // With the following statement, during unqualified name lookup,
+  // testing::internal2::operator<< appears as if it was declared in
+  // the nearest enclosing namespace that contains both
+  // ::testing_internal and ::testing::internal2, i.e. the global
+  // namespace.  For more details, refer to the C++ Standard section
+  // 7.3.4-1 [namespace.udir].  This allows us to fall back onto
+  // testing::internal2::operator<< in case T doesn't come with a <<
+  // operator.
+  //
+  // We cannot write 'using ::testing::internal2::operator<<;', which
+  // gcc 3.3 fails to compile due to a compiler bug.
+  using namespace ::testing::internal2;  // NOLINT
+
+  // Assuming T is defined in namespace foo, in the next statement,
+  // the compiler will consider all of:
+  //
+  //   1. foo::operator<< (thanks to Koenig look-up),
+  //   2. ::operator<< (as the current namespace is enclosed in ::),
+  //   3. testing::internal2::operator<< (thanks to the using statement above).
+  //
+  // The operator<< whose type matches T best will be picked.
+  //
+  // We deliberately allow #2 to be a candidate, as sometimes it's
+  // impossible to define #1 (e.g. when foo is ::std, defining
+  // anything in it is undefined behavior unless you are a compiler
+  // vendor.).
+  *os << value;
+}
+
+}  // namespace testing_internal
+
+namespace testing {
+namespace internal {
+
+// UniversalPrinter<T>::Print(value, ostream_ptr) prints the given
+// value to the given ostream.  The caller must ensure that
+// 'ostream_ptr' is not NULL, or the behavior is undefined.
+//
+// We define UniversalPrinter as a class template (as opposed to a
+// function template), as we need to partially specialize it for
+// reference types, which cannot be done with function templates.
+template <typename T>
+class UniversalPrinter;
+
+template <typename T>
+void UniversalPrint(const T& value, ::std::ostream* os);
+
+// Used to print an STL-style container when the user doesn't define
+// a PrintTo() for it.
+template <typename C>
+void DefaultPrintTo(IsContainer /* dummy */,
+                    false_type /* is not a pointer */,
+                    const C& container, ::std::ostream* os) {
+  const size_t kMaxCount = 32;  // The maximum number of elements to print.
+  *os << '{';
+  size_t count = 0;
+  for (typename C::const_iterator it = container.begin();
+       it != container.end(); ++it, ++count) {
+    if (count > 0) {
+      *os << ',';
+      if (count == kMaxCount) {  // Enough has been printed.
+        *os << " ...";
+        break;
+      }
+    }
+    *os << ' ';
+    // We cannot call PrintTo(*it, os) here as PrintTo() doesn't
+    // handle *it being a native array.
+    internal::UniversalPrint(*it, os);
+  }
+
+  if (count > 0) {
+    *os << ' ';
+  }
+  *os << '}';
+}
+
+// Used to print a pointer that is neither a char pointer nor a member
+// pointer, when the user doesn't define PrintTo() for it.  (A member
+// variable pointer or member function pointer doesn't really point to
+// a location in the address space.  Their representation is
+// implementation-defined.  Therefore they will be printed as raw
+// bytes.)
+template <typename T>
+void DefaultPrintTo(IsNotContainer /* dummy */,
+                    true_type /* is a pointer */,
+                    T* p, ::std::ostream* os) {
+  if (p == NULL) {
+    *os << "NULL";
+  } else {
+    // C++ doesn't allow casting from a function pointer to any object
+    // pointer.
+    //
+    // IsTrue() silences warnings: "Condition is always true",
+    // "unreachable code".
+    if (IsTrue(ImplicitlyConvertible<T*, const void*>::value)) {
+      // T is not a function type.  We just call << to print p,
+      // relying on ADL to pick up user-defined << for their pointer
+      // types, if any.
+      *os << p;
+    } else {
+      // T is a function type, so '*os << p' doesn't do what we want
+      // (it just prints p as bool).  We want to print p as a const
+      // void*.  However, we cannot cast it to const void* directly,
+      // even using reinterpret_cast, as earlier versions of gcc
+      // (e.g. 3.4.5) cannot compile the cast when p is a function
+      // pointer.  Casting to UInt64 first solves the problem.
+      *os << reinterpret_cast<const void*>(
+          reinterpret_cast<internal::UInt64>(p));
+    }
+  }
+}
+
+// Used to print a non-container, non-pointer value when the user
+// doesn't define PrintTo() for it.
+template <typename T>
+void DefaultPrintTo(IsNotContainer /* dummy */,
+                    false_type /* is not a pointer */,
+                    const T& value, ::std::ostream* os) {
+  ::testing_internal::DefaultPrintNonContainerTo(value, os);
+}
+
+// Prints the given value using the << operator if it has one;
+// otherwise prints the bytes in it.  This is what
+// UniversalPrinter<T>::Print() does when PrintTo() is not specialized
+// or overloaded for type T.
+//
+// A user can override this behavior for a class type Foo by defining
+// an overload of PrintTo() in the namespace where Foo is defined.  We
+// give the user this option as sometimes defining a << operator for
+// Foo is not desirable (e.g. the coding style may prevent doing it,
+// or there is already a << operator but it doesn't do what the user
+// wants).
+template <typename T>
+void PrintTo(const T& value, ::std::ostream* os) {
+  // DefaultPrintTo() is overloaded.  The type of its first two
+  // arguments determine which version will be picked.  If T is an
+  // STL-style container, the version for container will be called; if
+  // T is a pointer, the pointer version will be called; otherwise the
+  // generic version will be called.
+  //
+  // Note that we check for container types here, prior to we check
+  // for protocol message types in our operator<<.  The rationale is:
+  //
+  // For protocol messages, we want to give people a chance to
+  // override Google Mock's format by defining a PrintTo() or
+  // operator<<.  For STL containers, other formats can be
+  // incompatible with Google Mock's format for the container
+  // elements; therefore we check for container types here to ensure
+  // that our format is used.
+  //
+  // The second argument of DefaultPrintTo() is needed to bypass a bug
+  // in Symbian's C++ compiler that prevents it from picking the right
+  // overload between:
+  //
+  //   PrintTo(const T& x, ...);
+  //   PrintTo(T* x, ...);
+  DefaultPrintTo(IsContainerTest<T>(0), is_pointer<T>(), value, os);
+}
+
+// The following list of PrintTo() overloads tells
+// UniversalPrinter<T>::Print() how to print standard types (built-in
+// types, strings, plain arrays, and pointers).
+
+// Overloads for various char types.
+GTEST_API_ void PrintTo(unsigned char c, ::std::ostream* os);
+GTEST_API_ void PrintTo(signed char c, ::std::ostream* os);
+inline void PrintTo(char c, ::std::ostream* os) {
+  // When printing a plain char, we always treat it as unsigned.  This
+  // way, the output won't be affected by whether the compiler thinks
+  // char is signed or not.
+  PrintTo(static_cast<unsigned char>(c), os);
+}
+
+// Overloads for other simple built-in types.
+inline void PrintTo(bool x, ::std::ostream* os) {
+  *os << (x ? "true" : "false");
+}
+
+// Overload for wchar_t type.
+// Prints a wchar_t as a symbol if it is printable or as its internal
+// code otherwise and also as its decimal code (except for L'\0').
+// The L'\0' char is printed as "L'\\0'". The decimal code is printed
+// as signed integer when wchar_t is implemented by the compiler
+// as a signed type and is printed as an unsigned integer when wchar_t
+// is implemented as an unsigned type.
+GTEST_API_ void PrintTo(wchar_t wc, ::std::ostream* os);
+
+// Overloads for C strings.
+GTEST_API_ void PrintTo(const char* s, ::std::ostream* os);
+inline void PrintTo(char* s, ::std::ostream* os) {
+  PrintTo(ImplicitCast_<const char*>(s), os);
+}
+
+// signed/unsigned char is often used for representing binary data, so
+// we print pointers to it as void* to be safe.
+inline void PrintTo(const signed char* s, ::std::ostream* os) {
+  PrintTo(ImplicitCast_<const void*>(s), os);
+}
+inline void PrintTo(signed char* s, ::std::ostream* os) {
+  PrintTo(ImplicitCast_<const void*>(s), os);
+}
+inline void PrintTo(const unsigned char* s, ::std::ostream* os) {
+  PrintTo(ImplicitCast_<const void*>(s), os);
+}
+inline void PrintTo(unsigned char* s, ::std::ostream* os) {
+  PrintTo(ImplicitCast_<const void*>(s), os);
+}
+
+// MSVC can be configured to define wchar_t as a typedef of unsigned
+// short.  It defines _NATIVE_WCHAR_T_DEFINED when wchar_t is a native
+// type.  When wchar_t is a typedef, defining an overload for const
+// wchar_t* would cause unsigned short* be printed as a wide string,
+// possibly causing invalid memory accesses.
+#if !defined(_MSC_VER) || defined(_NATIVE_WCHAR_T_DEFINED)
+// Overloads for wide C strings
+GTEST_API_ void PrintTo(const wchar_t* s, ::std::ostream* os);
+inline void PrintTo(wchar_t* s, ::std::ostream* os) {
+  PrintTo(ImplicitCast_<const wchar_t*>(s), os);
+}
+#endif
+
+// Overload for C arrays.  Multi-dimensional arrays are printed
+// properly.
+
+// Prints the given number of elements in an array, without printing
+// the curly braces.
+template <typename T>
+void PrintRawArrayTo(const T a[], size_t count, ::std::ostream* os) {
+  UniversalPrint(a[0], os);
+  for (size_t i = 1; i != count; i++) {
+    *os << ", ";
+    UniversalPrint(a[i], os);
+  }
+}
+
+// Overloads for ::string and ::std::string.
+#if GTEST_HAS_GLOBAL_STRING
+GTEST_API_ void PrintStringTo(const ::string&s, ::std::ostream* os);
+inline void PrintTo(const ::string& s, ::std::ostream* os) {
+  PrintStringTo(s, os);
+}
+#endif  // GTEST_HAS_GLOBAL_STRING
+
+GTEST_API_ void PrintStringTo(const ::std::string&s, ::std::ostream* os);
+inline void PrintTo(const ::std::string& s, ::std::ostream* os) {
+  PrintStringTo(s, os);
+}
+
+// Overloads for ::wstring and ::std::wstring.
+#if GTEST_HAS_GLOBAL_WSTRING
+GTEST_API_ void PrintWideStringTo(const ::wstring&s, ::std::ostream* os);
+inline void PrintTo(const ::wstring& s, ::std::ostream* os) {
+  PrintWideStringTo(s, os);
+}
+#endif  // GTEST_HAS_GLOBAL_WSTRING
+
+#if GTEST_HAS_STD_WSTRING
+GTEST_API_ void PrintWideStringTo(const ::std::wstring&s, ::std::ostream* os);
+inline void PrintTo(const ::std::wstring& s, ::std::ostream* os) {
+  PrintWideStringTo(s, os);
+}
+#endif  // GTEST_HAS_STD_WSTRING
+
+#if GTEST_HAS_TR1_TUPLE
+// Overload for ::std::tr1::tuple.  Needed for printing function arguments,
+// which are packed as tuples.
+
+// Helper function for printing a tuple.  T must be instantiated with
+// a tuple type.
+template <typename T>
+void PrintTupleTo(const T& t, ::std::ostream* os);
+
+// Overloaded PrintTo() for tuples of various arities.  We support
+// tuples of up-to 10 fields.  The following implementation works
+// regardless of whether tr1::tuple is implemented using the
+// non-standard variadic template feature or not.
+
+inline void PrintTo(const ::std::tr1::tuple<>& t, ::std::ostream* os) {
+  PrintTupleTo(t, os);
+}
+
+template <typename T1>
+void PrintTo(const ::std::tr1::tuple<T1>& t, ::std::ostream* os) {
+  PrintTupleTo(t, os);
+}
+
+template <typename T1, typename T2>
+void PrintTo(const ::std::tr1::tuple<T1, T2>& t, ::std::ostream* os) {
+  PrintTupleTo(t, os);
+}
+
+template <typename T1, typename T2, typename T3>
+void PrintTo(const ::std::tr1::tuple<T1, T2, T3>& t, ::std::ostream* os) {
+  PrintTupleTo(t, os);
+}
+
+template <typename T1, typename T2, typename T3, typename T4>
+void PrintTo(const ::std::tr1::tuple<T1, T2, T3, T4>& t, ::std::ostream* os) {
+  PrintTupleTo(t, os);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5>
+void PrintTo(const ::std::tr1::tuple<T1, T2, T3, T4, T5>& t,
+             ::std::ostream* os) {
+  PrintTupleTo(t, os);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+          typename T6>
+void PrintTo(const ::std::tr1::tuple<T1, T2, T3, T4, T5, T6>& t,
+             ::std::ostream* os) {
+  PrintTupleTo(t, os);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+          typename T6, typename T7>
+void PrintTo(const ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7>& t,
+             ::std::ostream* os) {
+  PrintTupleTo(t, os);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+          typename T6, typename T7, typename T8>
+void PrintTo(const ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8>& t,
+             ::std::ostream* os) {
+  PrintTupleTo(t, os);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+          typename T6, typename T7, typename T8, typename T9>
+void PrintTo(const ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8, T9>& t,
+             ::std::ostream* os) {
+  PrintTupleTo(t, os);
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+          typename T6, typename T7, typename T8, typename T9, typename T10>
+void PrintTo(
+    const ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>& t,
+    ::std::ostream* os) {
+  PrintTupleTo(t, os);
+}
+#endif  // GTEST_HAS_TR1_TUPLE
+
+// Overload for std::pair.
+template <typename T1, typename T2>
+void PrintTo(const ::std::pair<T1, T2>& value, ::std::ostream* os) {
+  *os << '(';
+  // We cannot use UniversalPrint(value.first, os) here, as T1 may be
+  // a reference type.  The same for printing value.second.
+  UniversalPrinter<T1>::Print(value.first, os);
+  *os << ", ";
+  UniversalPrinter<T2>::Print(value.second, os);
+  *os << ')';
+}
+
+// Implements printing a non-reference type T by letting the compiler
+// pick the right overload of PrintTo() for T.
+template <typename T>
+class UniversalPrinter {
+ public:
+  // MSVC warns about adding const to a function type, so we want to
+  // disable the warning.
+#ifdef _MSC_VER
+# pragma warning(push)          // Saves the current warning state.
+# pragma warning(disable:4180)  // Temporarily disables warning 4180.
+#endif  // _MSC_VER
+
+  // Note: we deliberately don't call this PrintTo(), as that name
+  // conflicts with ::testing::internal::PrintTo in the body of the
+  // function.
+  static void Print(const T& value, ::std::ostream* os) {
+    // By default, ::testing::internal::PrintTo() is used for printing
+    // the value.
+    //
+    // Thanks to Koenig look-up, if T is a class and has its own
+    // PrintTo() function defined in its namespace, that function will
+    // be visible here.  Since it is more specific than the generic ones
+    // in ::testing::internal, it will be picked by the compiler in the
+    // following statement - exactly what we want.
+    PrintTo(value, os);
+  }
+
+#ifdef _MSC_VER
+# pragma warning(pop)           // Restores the warning state.
+#endif  // _MSC_VER
+};
+
+// UniversalPrintArray(begin, len, os) prints an array of 'len'
+// elements, starting at address 'begin'.
+template <typename T>
+void UniversalPrintArray(const T* begin, size_t len, ::std::ostream* os) {
+  if (len == 0) {
+    *os << "{}";
+  } else {
+    *os << "{ ";
+    const size_t kThreshold = 18;
+    const size_t kChunkSize = 8;
+    // If the array has more than kThreshold elements, we'll have to
+    // omit some details by printing only the first and the last
+    // kChunkSize elements.
+    // TODO(wan at google.com): let the user control the threshold using a flag.
+    if (len <= kThreshold) {
+      PrintRawArrayTo(begin, len, os);
+    } else {
+      PrintRawArrayTo(begin, kChunkSize, os);
+      *os << ", ..., ";
+      PrintRawArrayTo(begin + len - kChunkSize, kChunkSize, os);
+    }
+    *os << " }";
+  }
+}
+// This overload prints a (const) char array compactly.
+GTEST_API_ void UniversalPrintArray(
+    const char* begin, size_t len, ::std::ostream* os);
+
+// This overload prints a (const) wchar_t array compactly.
+GTEST_API_ void UniversalPrintArray(
+    const wchar_t* begin, size_t len, ::std::ostream* os);
+
+// Implements printing an array type T[N].
+template <typename T, size_t N>
+class UniversalPrinter<T[N]> {
+ public:
+  // Prints the given array, omitting some elements when there are too
+  // many.
+  static void Print(const T (&a)[N], ::std::ostream* os) {
+    UniversalPrintArray(a, N, os);
+  }
+};
+
+// Implements printing a reference type T&.
+template <typename T>
+class UniversalPrinter<T&> {
+ public:
+  // MSVC warns about adding const to a function type, so we want to
+  // disable the warning.
+#ifdef _MSC_VER
+# pragma warning(push)          // Saves the current warning state.
+# pragma warning(disable:4180)  // Temporarily disables warning 4180.
+#endif  // _MSC_VER
+
+  static void Print(const T& value, ::std::ostream* os) {
+    // Prints the address of the value.  We use reinterpret_cast here
+    // as static_cast doesn't compile when T is a function type.
+    *os << "@" << reinterpret_cast<const void*>(&value) << " ";
+
+    // Then prints the value itself.
+    UniversalPrint(value, os);
+  }
+
+#ifdef _MSC_VER
+# pragma warning(pop)           // Restores the warning state.
+#endif  // _MSC_VER
+};
+
+// Prints a value tersely: for a reference type, the referenced value
+// (but not the address) is printed; for a (const) char pointer, the
+// NUL-terminated string (but not the pointer) is printed.
+
+template <typename T>
+class UniversalTersePrinter {
+ public:
+  static void Print(const T& value, ::std::ostream* os) {
+    UniversalPrint(value, os);
+  }
+};
+template <typename T>
+class UniversalTersePrinter<T&> {
+ public:
+  static void Print(const T& value, ::std::ostream* os) {
+    UniversalPrint(value, os);
+  }
+};
+template <typename T, size_t N>
+class UniversalTersePrinter<T[N]> {
+ public:
+  static void Print(const T (&value)[N], ::std::ostream* os) {
+    UniversalPrinter<T[N]>::Print(value, os);
+  }
+};
+template <>
+class UniversalTersePrinter<const char*> {
+ public:
+  static void Print(const char* str, ::std::ostream* os) {
+    if (str == NULL) {
+      *os << "NULL";
+    } else {
+      UniversalPrint(string(str), os);
+    }
+  }
+};
+template <>
+class UniversalTersePrinter<char*> {
+ public:
+  static void Print(char* str, ::std::ostream* os) {
+    UniversalTersePrinter<const char*>::Print(str, os);
+  }
+};
+
+#if GTEST_HAS_STD_WSTRING
+template <>
+class UniversalTersePrinter<const wchar_t*> {
+ public:
+  static void Print(const wchar_t* str, ::std::ostream* os) {
+    if (str == NULL) {
+      *os << "NULL";
+    } else {
+      UniversalPrint(::std::wstring(str), os);
+    }
+  }
+};
+#endif
+
+template <>
+class UniversalTersePrinter<wchar_t*> {
+ public:
+  static void Print(wchar_t* str, ::std::ostream* os) {
+    UniversalTersePrinter<const wchar_t*>::Print(str, os);
+  }
+};
+
+template <typename T>
+void UniversalTersePrint(const T& value, ::std::ostream* os) {
+  UniversalTersePrinter<T>::Print(value, os);
+}
+
+// Prints a value using the type inferred by the compiler.  The
+// difference between this and UniversalTersePrint() is that for a
+// (const) char pointer, this prints both the pointer and the
+// NUL-terminated string.
+template <typename T>
+void UniversalPrint(const T& value, ::std::ostream* os) {
+  // A workarond for the bug in VC++ 7.1 that prevents us from instantiating
+  // UniversalPrinter with T directly.
+  typedef T T1;
+  UniversalPrinter<T1>::Print(value, os);
+}
+
+#if GTEST_HAS_TR1_TUPLE
+typedef ::std::vector<string> Strings;
+
+// This helper template allows PrintTo() for tuples and
+// UniversalTersePrintTupleFieldsToStrings() to be defined by
+// induction on the number of tuple fields.  The idea is that
+// TuplePrefixPrinter<N>::PrintPrefixTo(t, os) prints the first N
+// fields in tuple t, and can be defined in terms of
+// TuplePrefixPrinter<N - 1>.
+
+// The inductive case.
+template <size_t N>
+struct TuplePrefixPrinter {
+  // Prints the first N fields of a tuple.
+  template <typename Tuple>
+  static void PrintPrefixTo(const Tuple& t, ::std::ostream* os) {
+    TuplePrefixPrinter<N - 1>::PrintPrefixTo(t, os);
+    *os << ", ";
+    UniversalPrinter<typename ::std::tr1::tuple_element<N - 1, Tuple>::type>
+        ::Print(::std::tr1::get<N - 1>(t), os);
+  }
+
+  // Tersely prints the first N fields of a tuple to a string vector,
+  // one element for each field.
+  template <typename Tuple>
+  static void TersePrintPrefixToStrings(const Tuple& t, Strings* strings) {
+    TuplePrefixPrinter<N - 1>::TersePrintPrefixToStrings(t, strings);
+    ::std::stringstream ss;
+    UniversalTersePrint(::std::tr1::get<N - 1>(t), &ss);
+    strings->push_back(ss.str());
+  }
+};
+
+// Base cases.
+template <>
+struct TuplePrefixPrinter<0> {
+  template <typename Tuple>
+  static void PrintPrefixTo(const Tuple&, ::std::ostream*) {}
+
+  template <typename Tuple>
+  static void TersePrintPrefixToStrings(const Tuple&, Strings*) {}
+};
+// We have to specialize the entire TuplePrefixPrinter<> class
+// template here, even though the definition of
+// TersePrintPrefixToStrings() is the same as the generic version, as
+// Embarcadero (formerly CodeGear, formerly Borland) C++ doesn't
+// support specializing a method template of a class template.
+template <>
+struct TuplePrefixPrinter<1> {
+  template <typename Tuple>
+  static void PrintPrefixTo(const Tuple& t, ::std::ostream* os) {
+    UniversalPrinter<typename ::std::tr1::tuple_element<0, Tuple>::type>::
+        Print(::std::tr1::get<0>(t), os);
+  }
+
+  template <typename Tuple>
+  static void TersePrintPrefixToStrings(const Tuple& t, Strings* strings) {
+    ::std::stringstream ss;
+    UniversalTersePrint(::std::tr1::get<0>(t), &ss);
+    strings->push_back(ss.str());
+  }
+};
+
+// Helper function for printing a tuple.  T must be instantiated with
+// a tuple type.
+template <typename T>
+void PrintTupleTo(const T& t, ::std::ostream* os) {
+  *os << "(";
+  TuplePrefixPrinter< ::std::tr1::tuple_size<T>::value>::
+      PrintPrefixTo(t, os);
+  *os << ")";
+}
+
+// Prints the fields of a tuple tersely to a string vector, one
+// element for each field.  See the comment before
+// UniversalTersePrint() for how we define "tersely".
+template <typename Tuple>
+Strings UniversalTersePrintTupleFieldsToStrings(const Tuple& value) {
+  Strings result;
+  TuplePrefixPrinter< ::std::tr1::tuple_size<Tuple>::value>::
+      TersePrintPrefixToStrings(value, &result);
+  return result;
+}
+#endif  // GTEST_HAS_TR1_TUPLE
+
+}  // namespace internal
+
+template <typename T>
+::std::string PrintToString(const T& value) {
+  ::std::stringstream ss;
+  internal::UniversalTersePrinter<T>::Print(value, &ss);
+  return ss.str();
+}
+
+}  // namespace testing
+
+#endif  // GTEST_INCLUDE_GTEST_GTEST_PRINTERS_H_
diff --git a/contrib/gtest-1.7.0/include/gtest/gtest-spi.h b/contrib/gtest-1.7.0/include/gtest/gtest-spi.h
new file mode 100644
index 0000000..f63fa9a
--- /dev/null
+++ b/contrib/gtest-1.7.0/include/gtest/gtest-spi.h
@@ -0,0 +1,232 @@
+// Copyright 2007, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+//
+// Utilities for testing Google Test itself and code that uses Google Test
+// (e.g. frameworks built on top of Google Test).
+
+#ifndef GTEST_INCLUDE_GTEST_GTEST_SPI_H_
+#define GTEST_INCLUDE_GTEST_GTEST_SPI_H_
+
+#include "gtest/gtest.h"
+
+namespace testing {
+
+// This helper class can be used to mock out Google Test failure reporting
+// so that we can test Google Test or code that builds on Google Test.
+//
+// An object of this class appends a TestPartResult object to the
+// TestPartResultArray object given in the constructor whenever a Google Test
+// failure is reported. It can either intercept only failures that are
+// generated in the same thread that created this object or it can intercept
+// all generated failures. The scope of this mock object can be controlled with
+// the second argument to the two arguments constructor.
+class GTEST_API_ ScopedFakeTestPartResultReporter
+    : public TestPartResultReporterInterface {
+ public:
+  // The two possible mocking modes of this object.
+  enum InterceptMode {
+    INTERCEPT_ONLY_CURRENT_THREAD,  // Intercepts only thread local failures.
+    INTERCEPT_ALL_THREADS           // Intercepts all failures.
+  };
+
+  // The c'tor sets this object as the test part result reporter used
+  // by Google Test.  The 'result' parameter specifies where to report the
+  // results. This reporter will only catch failures generated in the current
+  // thread. DEPRECATED
+  explicit ScopedFakeTestPartResultReporter(TestPartResultArray* result);
+
+  // Same as above, but you can choose the interception scope of this object.
+  ScopedFakeTestPartResultReporter(InterceptMode intercept_mode,
+                                   TestPartResultArray* result);
+
+  // The d'tor restores the previous test part result reporter.
+  virtual ~ScopedFakeTestPartResultReporter();
+
+  // Appends the TestPartResult object to the TestPartResultArray
+  // received in the constructor.
+  //
+  // This method is from the TestPartResultReporterInterface
+  // interface.
+  virtual void ReportTestPartResult(const TestPartResult& result);
+ private:
+  void Init();
+
+  const InterceptMode intercept_mode_;
+  TestPartResultReporterInterface* old_reporter_;
+  TestPartResultArray* const result_;
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(ScopedFakeTestPartResultReporter);
+};
+
+namespace internal {
+
+// A helper class for implementing EXPECT_FATAL_FAILURE() and
+// EXPECT_NONFATAL_FAILURE().  Its destructor verifies that the given
+// TestPartResultArray contains exactly one failure that has the given
+// type and contains the given substring.  If that's not the case, a
+// non-fatal failure will be generated.
+class GTEST_API_ SingleFailureChecker {
+ public:
+  // The constructor remembers the arguments.
+  SingleFailureChecker(const TestPartResultArray* results,
+                       TestPartResult::Type type,
+                       const string& substr);
+  ~SingleFailureChecker();
+ private:
+  const TestPartResultArray* const results_;
+  const TestPartResult::Type type_;
+  const string substr_;
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(SingleFailureChecker);
+};
+
+}  // namespace internal
+
+}  // namespace testing
+
+// A set of macros for testing Google Test assertions or code that's expected
+// to generate Google Test fatal failures.  It verifies that the given
+// statement will cause exactly one fatal Google Test failure with 'substr'
+// being part of the failure message.
+//
+// There are two different versions of this macro. EXPECT_FATAL_FAILURE only
+// affects and considers failures generated in the current thread and
+// EXPECT_FATAL_FAILURE_ON_ALL_THREADS does the same but for all threads.
+//
+// The verification of the assertion is done correctly even when the statement
+// throws an exception or aborts the current function.
+//
+// Known restrictions:
+//   - 'statement' cannot reference local non-static variables or
+//     non-static members of the current object.
+//   - 'statement' cannot return a value.
+//   - You cannot stream a failure message to this macro.
+//
+// Note that even though the implementations of the following two
+// macros are much alike, we cannot refactor them to use a common
+// helper macro, due to some peculiarity in how the preprocessor
+// works.  The AcceptsMacroThatExpandsToUnprotectedComma test in
+// gtest_unittest.cc will fail to compile if we do that.
+#define EXPECT_FATAL_FAILURE(statement, substr) \
+  do { \
+    class GTestExpectFatalFailureHelper {\
+     public:\
+      static void Execute() { statement; }\
+    };\
+    ::testing::TestPartResultArray gtest_failures;\
+    ::testing::internal::SingleFailureChecker gtest_checker(\
+        &gtest_failures, ::testing::TestPartResult::kFatalFailure, (substr));\
+    {\
+      ::testing::ScopedFakeTestPartResultReporter gtest_reporter(\
+          ::testing::ScopedFakeTestPartResultReporter:: \
+          INTERCEPT_ONLY_CURRENT_THREAD, &gtest_failures);\
+      GTestExpectFatalFailureHelper::Execute();\
+    }\
+  } while (::testing::internal::AlwaysFalse())
+
+#define EXPECT_FATAL_FAILURE_ON_ALL_THREADS(statement, substr) \
+  do { \
+    class GTestExpectFatalFailureHelper {\
+     public:\
+      static void Execute() { statement; }\
+    };\
+    ::testing::TestPartResultArray gtest_failures;\
+    ::testing::internal::SingleFailureChecker gtest_checker(\
+        &gtest_failures, ::testing::TestPartResult::kFatalFailure, (substr));\
+    {\
+      ::testing::ScopedFakeTestPartResultReporter gtest_reporter(\
+          ::testing::ScopedFakeTestPartResultReporter:: \
+          INTERCEPT_ALL_THREADS, &gtest_failures);\
+      GTestExpectFatalFailureHelper::Execute();\
+    }\
+  } while (::testing::internal::AlwaysFalse())
+
+// A macro for testing Google Test assertions or code that's expected to
+// generate Google Test non-fatal failures.  It asserts that the given
+// statement will cause exactly one non-fatal Google Test failure with 'substr'
+// being part of the failure message.
+//
+// There are two different versions of this macro. EXPECT_NONFATAL_FAILURE only
+// affects and considers failures generated in the current thread and
+// EXPECT_NONFATAL_FAILURE_ON_ALL_THREADS does the same but for all threads.
+//
+// 'statement' is allowed to reference local variables and members of
+// the current object.
+//
+// The verification of the assertion is done correctly even when the statement
+// throws an exception or aborts the current function.
+//
+// Known restrictions:
+//   - You cannot stream a failure message to this macro.
+//
+// Note that even though the implementations of the following two
+// macros are much alike, we cannot refactor them to use a common
+// helper macro, due to some peculiarity in how the preprocessor
+// works.  If we do that, the code won't compile when the user gives
+// EXPECT_NONFATAL_FAILURE() a statement that contains a macro that
+// expands to code containing an unprotected comma.  The
+// AcceptsMacroThatExpandsToUnprotectedComma test in gtest_unittest.cc
+// catches that.
+//
+// For the same reason, we have to write
+//   if (::testing::internal::AlwaysTrue()) { statement; }
+// instead of
+//   GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement)
+// to avoid an MSVC warning on unreachable code.
+#define EXPECT_NONFATAL_FAILURE(statement, substr) \
+  do {\
+    ::testing::TestPartResultArray gtest_failures;\
+    ::testing::internal::SingleFailureChecker gtest_checker(\
+        &gtest_failures, ::testing::TestPartResult::kNonFatalFailure, \
+        (substr));\
+    {\
+      ::testing::ScopedFakeTestPartResultReporter gtest_reporter(\
+          ::testing::ScopedFakeTestPartResultReporter:: \
+          INTERCEPT_ONLY_CURRENT_THREAD, &gtest_failures);\
+      if (::testing::internal::AlwaysTrue()) { statement; }\
+    }\
+  } while (::testing::internal::AlwaysFalse())
+
+#define EXPECT_NONFATAL_FAILURE_ON_ALL_THREADS(statement, substr) \
+  do {\
+    ::testing::TestPartResultArray gtest_failures;\
+    ::testing::internal::SingleFailureChecker gtest_checker(\
+        &gtest_failures, ::testing::TestPartResult::kNonFatalFailure, \
+        (substr));\
+    {\
+      ::testing::ScopedFakeTestPartResultReporter gtest_reporter(\
+          ::testing::ScopedFakeTestPartResultReporter::INTERCEPT_ALL_THREADS, \
+          &gtest_failures);\
+      if (::testing::internal::AlwaysTrue()) { statement; }\
+    }\
+  } while (::testing::internal::AlwaysFalse())
+
+#endif  // GTEST_INCLUDE_GTEST_GTEST_SPI_H_
diff --git a/contrib/gtest-1.7.0/include/gtest/gtest-test-part.h b/contrib/gtest-1.7.0/include/gtest/gtest-test-part.h
new file mode 100644
index 0000000..77eb844
--- /dev/null
+++ b/contrib/gtest-1.7.0/include/gtest/gtest-test-part.h
@@ -0,0 +1,179 @@
+// Copyright 2008, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: mheule at google.com (Markus Heule)
+//
+
+#ifndef GTEST_INCLUDE_GTEST_GTEST_TEST_PART_H_
+#define GTEST_INCLUDE_GTEST_GTEST_TEST_PART_H_
+
+#include <iosfwd>
+#include <vector>
+#include "gtest/internal/gtest-internal.h"
+#include "gtest/internal/gtest-string.h"
+
+namespace testing {
+
+// A copyable object representing the result of a test part (i.e. an
+// assertion or an explicit FAIL(), ADD_FAILURE(), or SUCCESS()).
+//
+// Don't inherit from TestPartResult as its destructor is not virtual.
+class GTEST_API_ TestPartResult {
+ public:
+  // The possible outcomes of a test part (i.e. an assertion or an
+  // explicit SUCCEED(), FAIL(), or ADD_FAILURE()).
+  enum Type {
+    kSuccess,          // Succeeded.
+    kNonFatalFailure,  // Failed but the test can continue.
+    kFatalFailure      // Failed and the test should be terminated.
+  };
+
+  // C'tor.  TestPartResult does NOT have a default constructor.
+  // Always use this constructor (with parameters) to create a
+  // TestPartResult object.
+  TestPartResult(Type a_type,
+                 const char* a_file_name,
+                 int a_line_number,
+                 const char* a_message)
+      : type_(a_type),
+        file_name_(a_file_name == NULL ? "" : a_file_name),
+        line_number_(a_line_number),
+        summary_(ExtractSummary(a_message)),
+        message_(a_message) {
+  }
+
+  // Gets the outcome of the test part.
+  Type type() const { return type_; }
+
+  // Gets the name of the source file where the test part took place, or
+  // NULL if it's unknown.
+  const char* file_name() const {
+    return file_name_.empty() ? NULL : file_name_.c_str();
+  }
+
+  // Gets the line in the source file where the test part took place,
+  // or -1 if it's unknown.
+  int line_number() const { return line_number_; }
+
+  // Gets the summary of the failure message.
+  const char* summary() const { return summary_.c_str(); }
+
+  // Gets the message associated with the test part.
+  const char* message() const { return message_.c_str(); }
+
+  // Returns true iff the test part passed.
+  bool passed() const { return type_ == kSuccess; }
+
+  // Returns true iff the test part failed.
+  bool failed() const { return type_ != kSuccess; }
+
+  // Returns true iff the test part non-fatally failed.
+  bool nonfatally_failed() const { return type_ == kNonFatalFailure; }
+
+  // Returns true iff the test part fatally failed.
+  bool fatally_failed() const { return type_ == kFatalFailure; }
+
+ private:
+  Type type_;
+
+  // Gets the summary of the failure message by omitting the stack
+  // trace in it.
+  static std::string ExtractSummary(const char* message);
+
+  // The name of the source file where the test part took place, or
+  // "" if the source file is unknown.
+  std::string file_name_;
+  // The line in the source file where the test part took place, or -1
+  // if the line number is unknown.
+  int line_number_;
+  std::string summary_;  // The test failure summary.
+  std::string message_;  // The test failure message.
+};
+
+// Prints a TestPartResult object.
+std::ostream& operator<<(std::ostream& os, const TestPartResult& result);
+
+// An array of TestPartResult objects.
+//
+// Don't inherit from TestPartResultArray as its destructor is not
+// virtual.
+class GTEST_API_ TestPartResultArray {
+ public:
+  TestPartResultArray() {}
+
+  // Appends the given TestPartResult to the array.
+  void Append(const TestPartResult& result);
+
+  // Returns the TestPartResult at the given index (0-based).
+  const TestPartResult& GetTestPartResult(int index) const;
+
+  // Returns the number of TestPartResult objects in the array.
+  int size() const;
+
+ private:
+  std::vector<TestPartResult> array_;
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(TestPartResultArray);
+};
+
+// This interface knows how to report a test part result.
+class TestPartResultReporterInterface {
+ public:
+  virtual ~TestPartResultReporterInterface() {}
+
+  virtual void ReportTestPartResult(const TestPartResult& result) = 0;
+};
+
+namespace internal {
+
+// This helper class is used by {ASSERT|EXPECT}_NO_FATAL_FAILURE to check if a
+// statement generates new fatal failures. To do so it registers itself as the
+// current test part result reporter. Besides checking if fatal failures were
+// reported, it only delegates the reporting to the former result reporter.
+// The original result reporter is restored in the destructor.
+// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
+class GTEST_API_ HasNewFatalFailureHelper
+    : public TestPartResultReporterInterface {
+ public:
+  HasNewFatalFailureHelper();
+  virtual ~HasNewFatalFailureHelper();
+  virtual void ReportTestPartResult(const TestPartResult& result);
+  bool has_new_fatal_failure() const { return has_new_fatal_failure_; }
+ private:
+  bool has_new_fatal_failure_;
+  TestPartResultReporterInterface* original_reporter_;
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(HasNewFatalFailureHelper);
+};
+
+}  // namespace internal
+
+}  // namespace testing
+
+#endif  // GTEST_INCLUDE_GTEST_GTEST_TEST_PART_H_
diff --git a/contrib/gtest-1.7.0/include/gtest/gtest-typed-test.h b/contrib/gtest-1.7.0/include/gtest/gtest-typed-test.h
new file mode 100644
index 0000000..fe1e83b
--- /dev/null
+++ b/contrib/gtest-1.7.0/include/gtest/gtest-typed-test.h
@@ -0,0 +1,259 @@
+// Copyright 2008 Google Inc.
+// All Rights Reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+
+#ifndef GTEST_INCLUDE_GTEST_GTEST_TYPED_TEST_H_
+#define GTEST_INCLUDE_GTEST_GTEST_TYPED_TEST_H_
+
+// This header implements typed tests and type-parameterized tests.
+
+// Typed (aka type-driven) tests repeat the same test for types in a
+// list.  You must know which types you want to test with when writing
+// typed tests. Here's how you do it:
+
+#if 0
+
+// First, define a fixture class template.  It should be parameterized
+// by a type.  Remember to derive it from testing::Test.
+template <typename T>
+class FooTest : public testing::Test {
+ public:
+  ...
+  typedef std::list<T> List;
+  static T shared_;
+  T value_;
+};
+
+// Next, associate a list of types with the test case, which will be
+// repeated for each type in the list.  The typedef is necessary for
+// the macro to parse correctly.
+typedef testing::Types<char, int, unsigned int> MyTypes;
+TYPED_TEST_CASE(FooTest, MyTypes);
+
+// If the type list contains only one type, you can write that type
+// directly without Types<...>:
+//   TYPED_TEST_CASE(FooTest, int);
+
+// Then, use TYPED_TEST() instead of TEST_F() to define as many typed
+// tests for this test case as you want.
+TYPED_TEST(FooTest, DoesBlah) {
+  // Inside a test, refer to TypeParam to get the type parameter.
+  // Since we are inside a derived class template, C++ requires use to
+  // visit the members of FooTest via 'this'.
+  TypeParam n = this->value_;
+
+  // To visit static members of the fixture, add the TestFixture::
+  // prefix.
+  n += TestFixture::shared_;
+
+  // To refer to typedefs in the fixture, add the "typename
+  // TestFixture::" prefix.
+  typename TestFixture::List values;
+  values.push_back(n);
+  ...
+}
+
+TYPED_TEST(FooTest, HasPropertyA) { ... }
+
+#endif  // 0
+
+// Type-parameterized tests are abstract test patterns parameterized
+// by a type.  Compared with typed tests, type-parameterized tests
+// allow you to define the test pattern without knowing what the type
+// parameters are.  The defined pattern can be instantiated with
+// different types any number of times, in any number of translation
+// units.
+//
+// If you are designing an interface or concept, you can define a
+// suite of type-parameterized tests to verify properties that any
+// valid implementation of the interface/concept should have.  Then,
+// each implementation can easily instantiate the test suite to verify
+// that it conforms to the requirements, without having to write
+// similar tests repeatedly.  Here's an example:
+
+#if 0
+
+// First, define a fixture class template.  It should be parameterized
+// by a type.  Remember to derive it from testing::Test.
+template <typename T>
+class FooTest : public testing::Test {
+  ...
+};
+
+// Next, declare that you will define a type-parameterized test case
+// (the _P suffix is for "parameterized" or "pattern", whichever you
+// prefer):
+TYPED_TEST_CASE_P(FooTest);
+
+// Then, use TYPED_TEST_P() to define as many type-parameterized tests
+// for this type-parameterized test case as you want.
+TYPED_TEST_P(FooTest, DoesBlah) {
+  // Inside a test, refer to TypeParam to get the type parameter.
+  TypeParam n = 0;
+  ...
+}
+
+TYPED_TEST_P(FooTest, HasPropertyA) { ... }
+
+// Now the tricky part: you need to register all test patterns before
+// you can instantiate them.  The first argument of the macro is the
+// test case name; the rest are the names of the tests in this test
+// case.
+REGISTER_TYPED_TEST_CASE_P(FooTest,
+                           DoesBlah, HasPropertyA);
+
+// Finally, you are free to instantiate the pattern with the types you
+// want.  If you put the above code in a header file, you can #include
+// it in multiple C++ source files and instantiate it multiple times.
+//
+// To distinguish different instances of the pattern, the first
+// argument to the INSTANTIATE_* macro is a prefix that will be added
+// to the actual test case name.  Remember to pick unique prefixes for
+// different instances.
+typedef testing::Types<char, int, unsigned int> MyTypes;
+INSTANTIATE_TYPED_TEST_CASE_P(My, FooTest, MyTypes);
+
+// If the type list contains only one type, you can write that type
+// directly without Types<...>:
+//   INSTANTIATE_TYPED_TEST_CASE_P(My, FooTest, int);
+
+#endif  // 0
+
+#include "gtest/internal/gtest-port.h"
+#include "gtest/internal/gtest-type-util.h"
+
+// Implements typed tests.
+
+#if GTEST_HAS_TYPED_TEST
+
+// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
+//
+// Expands to the name of the typedef for the type parameters of the
+// given test case.
+# define GTEST_TYPE_PARAMS_(TestCaseName) gtest_type_params_##TestCaseName##_
+
+// The 'Types' template argument below must have spaces around it
+// since some compilers may choke on '>>' when passing a template
+// instance (e.g. Types<int>)
+# define TYPED_TEST_CASE(CaseName, Types) \
+  typedef ::testing::internal::TypeList< Types >::type \
+      GTEST_TYPE_PARAMS_(CaseName)
+
+# define TYPED_TEST(CaseName, TestName) \
+  template <typename gtest_TypeParam_> \
+  class GTEST_TEST_CLASS_NAME_(CaseName, TestName) \
+      : public CaseName<gtest_TypeParam_> { \
+   private: \
+    typedef CaseName<gtest_TypeParam_> TestFixture; \
+    typedef gtest_TypeParam_ TypeParam; \
+    virtual void TestBody(); \
+  }; \
+  bool gtest_##CaseName##_##TestName##_registered_ GTEST_ATTRIBUTE_UNUSED_ = \
+      ::testing::internal::TypeParameterizedTest< \
+          CaseName, \
+          ::testing::internal::TemplateSel< \
+              GTEST_TEST_CLASS_NAME_(CaseName, TestName)>, \
+          GTEST_TYPE_PARAMS_(CaseName)>::Register(\
+              "", #CaseName, #TestName, 0); \
+  template <typename gtest_TypeParam_> \
+  void GTEST_TEST_CLASS_NAME_(CaseName, TestName)<gtest_TypeParam_>::TestBody()
+
+#endif  // GTEST_HAS_TYPED_TEST
+
+// Implements type-parameterized tests.
+
+#if GTEST_HAS_TYPED_TEST_P
+
+// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
+//
+// Expands to the namespace name that the type-parameterized tests for
+// the given type-parameterized test case are defined in.  The exact
+// name of the namespace is subject to change without notice.
+# define GTEST_CASE_NAMESPACE_(TestCaseName) \
+  gtest_case_##TestCaseName##_
+
+// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
+//
+// Expands to the name of the variable used to remember the names of
+// the defined tests in the given test case.
+# define GTEST_TYPED_TEST_CASE_P_STATE_(TestCaseName) \
+  gtest_typed_test_case_p_state_##TestCaseName##_
+
+// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE DIRECTLY.
+//
+// Expands to the name of the variable used to remember the names of
+// the registered tests in the given test case.
+# define GTEST_REGISTERED_TEST_NAMES_(TestCaseName) \
+  gtest_registered_test_names_##TestCaseName##_
+
+// The variables defined in the type-parameterized test macros are
+// static as typically these macros are used in a .h file that can be
+// #included in multiple translation units linked together.
+# define TYPED_TEST_CASE_P(CaseName) \
+  static ::testing::internal::TypedTestCasePState \
+      GTEST_TYPED_TEST_CASE_P_STATE_(CaseName)
+
+# define TYPED_TEST_P(CaseName, TestName) \
+  namespace GTEST_CASE_NAMESPACE_(CaseName) { \
+  template <typename gtest_TypeParam_> \
+  class TestName : public CaseName<gtest_TypeParam_> { \
+   private: \
+    typedef CaseName<gtest_TypeParam_> TestFixture; \
+    typedef gtest_TypeParam_ TypeParam; \
+    virtual void TestBody(); \
+  }; \
+  static bool gtest_##TestName##_defined_ GTEST_ATTRIBUTE_UNUSED_ = \
+      GTEST_TYPED_TEST_CASE_P_STATE_(CaseName).AddTestName(\
+          __FILE__, __LINE__, #CaseName, #TestName); \
+  } \
+  template <typename gtest_TypeParam_> \
+  void GTEST_CASE_NAMESPACE_(CaseName)::TestName<gtest_TypeParam_>::TestBody()
+
+# define REGISTER_TYPED_TEST_CASE_P(CaseName, ...) \
+  namespace GTEST_CASE_NAMESPACE_(CaseName) { \
+  typedef ::testing::internal::Templates<__VA_ARGS__>::type gtest_AllTests_; \
+  } \
+  static const char* const GTEST_REGISTERED_TEST_NAMES_(CaseName) = \
+      GTEST_TYPED_TEST_CASE_P_STATE_(CaseName).VerifyRegisteredTestNames(\
+          __FILE__, __LINE__, #__VA_ARGS__)
+
+// The 'Types' template argument below must have spaces around it
+// since some compilers may choke on '>>' when passing a template
+// instance (e.g. Types<int>)
+# define INSTANTIATE_TYPED_TEST_CASE_P(Prefix, CaseName, Types) \
+  bool gtest_##Prefix##_##CaseName GTEST_ATTRIBUTE_UNUSED_ = \
+      ::testing::internal::TypeParameterizedTestCase<CaseName, \
+          GTEST_CASE_NAMESPACE_(CaseName)::gtest_AllTests_, \
+          ::testing::internal::TypeList< Types >::type>::Register(\
+              #Prefix, #CaseName, GTEST_REGISTERED_TEST_NAMES_(CaseName))
+
+#endif  // GTEST_HAS_TYPED_TEST_P
+
+#endif  // GTEST_INCLUDE_GTEST_GTEST_TYPED_TEST_H_
diff --git a/contrib/gtest-1.7.0/include/gtest/gtest.h b/contrib/gtest-1.7.0/include/gtest/gtest.h
new file mode 100644
index 0000000..6fa0a39
--- /dev/null
+++ b/contrib/gtest-1.7.0/include/gtest/gtest.h
@@ -0,0 +1,2291 @@
+// Copyright 2005, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+//
+// The Google C++ Testing Framework (Google Test)
+//
+// This header file defines the public API for Google Test.  It should be
+// included by any test program that uses Google Test.
+//
+// IMPORTANT NOTE: Due to limitation of the C++ language, we have to
+// leave some internal implementation details in this header file.
+// They are clearly marked by comments like this:
+//
+//   // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
+//
+// Such code is NOT meant to be used by a user directly, and is subject
+// to CHANGE WITHOUT NOTICE.  Therefore DO NOT DEPEND ON IT in a user
+// program!
+//
+// Acknowledgment: Google Test borrowed the idea of automatic test
+// registration from Barthelemy Dagenais' (barthelemy at prologique.com)
+// easyUnit framework.
+
+#ifndef GTEST_INCLUDE_GTEST_GTEST_H_
+#define GTEST_INCLUDE_GTEST_GTEST_H_
+
+#include <limits>
+#include <ostream>
+#include <vector>
+
+#include "gtest/internal/gtest-internal.h"
+#include "gtest/internal/gtest-string.h"
+#include "gtest/gtest-death-test.h"
+#include "gtest/gtest-message.h"
+#include "gtest/gtest-param-test.h"
+#include "gtest/gtest-printers.h"
+#include "gtest/gtest_prod.h"
+#include "gtest/gtest-test-part.h"
+#include "gtest/gtest-typed-test.h"
+
+// Depending on the platform, different string classes are available.
+// On Linux, in addition to ::std::string, Google also makes use of
+// class ::string, which has the same interface as ::std::string, but
+// has a different implementation.
+//
+// The user can define GTEST_HAS_GLOBAL_STRING to 1 to indicate that
+// ::string is available AND is a distinct type to ::std::string, or
+// define it to 0 to indicate otherwise.
+//
+// If the user's ::std::string and ::string are the same class due to
+// aliasing, he should define GTEST_HAS_GLOBAL_STRING to 0.
+//
+// If the user doesn't define GTEST_HAS_GLOBAL_STRING, it is defined
+// heuristically.
+
+namespace testing {
+
+// Declares the flags.
+
+// This flag temporary enables the disabled tests.
+GTEST_DECLARE_bool_(also_run_disabled_tests);
+
+// This flag brings the debugger on an assertion failure.
+GTEST_DECLARE_bool_(break_on_failure);
+
+// This flag controls whether Google Test catches all test-thrown exceptions
+// and logs them as failures.
+GTEST_DECLARE_bool_(catch_exceptions);
+
+// This flag enables using colors in terminal output. Available values are
+// "yes" to enable colors, "no" (disable colors), or "auto" (the default)
+// to let Google Test decide.
+GTEST_DECLARE_string_(color);
+
+// This flag sets up the filter to select by name using a glob pattern
+// the tests to run. If the filter is not given all tests are executed.
+GTEST_DECLARE_string_(filter);
+
+// This flag causes the Google Test to list tests. None of the tests listed
+// are actually run if the flag is provided.
+GTEST_DECLARE_bool_(list_tests);
+
+// This flag controls whether Google Test emits a detailed XML report to a file
+// in addition to its normal textual output.
+GTEST_DECLARE_string_(output);
+
+// This flags control whether Google Test prints the elapsed time for each
+// test.
+GTEST_DECLARE_bool_(print_time);
+
+// This flag specifies the random number seed.
+GTEST_DECLARE_int32_(random_seed);
+
+// This flag sets how many times the tests are repeated. The default value
+// is 1. If the value is -1 the tests are repeating forever.
+GTEST_DECLARE_int32_(repeat);
+
+// This flag controls whether Google Test includes Google Test internal
+// stack frames in failure stack traces.
+GTEST_DECLARE_bool_(show_internal_stack_frames);
+
+// When this flag is specified, tests' order is randomized on every iteration.
+GTEST_DECLARE_bool_(shuffle);
+
+// This flag specifies the maximum number of stack frames to be
+// printed in a failure message.
+GTEST_DECLARE_int32_(stack_trace_depth);
+
+// When this flag is specified, a failed assertion will throw an
+// exception if exceptions are enabled, or exit the program with a
+// non-zero code otherwise.
+GTEST_DECLARE_bool_(throw_on_failure);
+
+// When this flag is set with a "host:port" string, on supported
+// platforms test results are streamed to the specified port on
+// the specified host machine.
+GTEST_DECLARE_string_(stream_result_to);
+
+// The upper limit for valid stack trace depths.
+const int kMaxStackTraceDepth = 100;
+
+namespace internal {
+
+class AssertHelper;
+class DefaultGlobalTestPartResultReporter;
+class ExecDeathTest;
+class NoExecDeathTest;
+class FinalSuccessChecker;
+class GTestFlagSaver;
+class StreamingListenerTest;
+class TestResultAccessor;
+class TestEventListenersAccessor;
+class TestEventRepeater;
+class UnitTestRecordPropertyTestHelper;
+class WindowsDeathTest;
+class UnitTestImpl* GetUnitTestImpl();
+void ReportFailureInUnknownLocation(TestPartResult::Type result_type,
+                                    const std::string& message);
+
+}  // namespace internal
+
+// The friend relationship of some of these classes is cyclic.
+// If we don't forward declare them the compiler might confuse the classes
+// in friendship clauses with same named classes on the scope.
+class Test;
+class TestCase;
+class TestInfo;
+class UnitTest;
+
+// A class for indicating whether an assertion was successful.  When
+// the assertion wasn't successful, the AssertionResult object
+// remembers a non-empty message that describes how it failed.
+//
+// To create an instance of this class, use one of the factory functions
+// (AssertionSuccess() and AssertionFailure()).
+//
+// This class is useful for two purposes:
+//   1. Defining predicate functions to be used with Boolean test assertions
+//      EXPECT_TRUE/EXPECT_FALSE and their ASSERT_ counterparts
+//   2. Defining predicate-format functions to be
+//      used with predicate assertions (ASSERT_PRED_FORMAT*, etc).
+//
+// For example, if you define IsEven predicate:
+//
+//   testing::AssertionResult IsEven(int n) {
+//     if ((n % 2) == 0)
+//       return testing::AssertionSuccess();
+//     else
+//       return testing::AssertionFailure() << n << " is odd";
+//   }
+//
+// Then the failed expectation EXPECT_TRUE(IsEven(Fib(5)))
+// will print the message
+//
+//   Value of: IsEven(Fib(5))
+//     Actual: false (5 is odd)
+//   Expected: true
+//
+// instead of a more opaque
+//
+//   Value of: IsEven(Fib(5))
+//     Actual: false
+//   Expected: true
+//
+// in case IsEven is a simple Boolean predicate.
+//
+// If you expect your predicate to be reused and want to support informative
+// messages in EXPECT_FALSE and ASSERT_FALSE (negative assertions show up
+// about half as often as positive ones in our tests), supply messages for
+// both success and failure cases:
+//
+//   testing::AssertionResult IsEven(int n) {
+//     if ((n % 2) == 0)
+//       return testing::AssertionSuccess() << n << " is even";
+//     else
+//       return testing::AssertionFailure() << n << " is odd";
+//   }
+//
+// Then a statement EXPECT_FALSE(IsEven(Fib(6))) will print
+//
+//   Value of: IsEven(Fib(6))
+//     Actual: true (8 is even)
+//   Expected: false
+//
+// NB: Predicates that support negative Boolean assertions have reduced
+// performance in positive ones so be careful not to use them in tests
+// that have lots (tens of thousands) of positive Boolean assertions.
+//
+// To use this class with EXPECT_PRED_FORMAT assertions such as:
+//
+//   // Verifies that Foo() returns an even number.
+//   EXPECT_PRED_FORMAT1(IsEven, Foo());
+//
+// you need to define:
+//
+//   testing::AssertionResult IsEven(const char* expr, int n) {
+//     if ((n % 2) == 0)
+//       return testing::AssertionSuccess();
+//     else
+//       return testing::AssertionFailure()
+//         << "Expected: " << expr << " is even\n  Actual: it's " << n;
+//   }
+//
+// If Foo() returns 5, you will see the following message:
+//
+//   Expected: Foo() is even
+//     Actual: it's 5
+//
+class GTEST_API_ AssertionResult {
+ public:
+  // Copy constructor.
+  // Used in EXPECT_TRUE/FALSE(assertion_result).
+  AssertionResult(const AssertionResult& other);
+  // Used in the EXPECT_TRUE/FALSE(bool_expression).
+  explicit AssertionResult(bool success) : success_(success) {}
+
+  // Returns true iff the assertion succeeded.
+  operator bool() const { return success_; }  // NOLINT
+
+  // Returns the assertion's negation. Used with EXPECT/ASSERT_FALSE.
+  AssertionResult operator!() const;
+
+  // Returns the text streamed into this AssertionResult. Test assertions
+  // use it when they fail (i.e., the predicate's outcome doesn't match the
+  // assertion's expectation). When nothing has been streamed into the
+  // object, returns an empty string.
+  const char* message() const {
+    return message_.get() != NULL ?  message_->c_str() : "";
+  }
+  // TODO(vladl at google.com): Remove this after making sure no clients use it.
+  // Deprecated; please use message() instead.
+  const char* failure_message() const { return message(); }
+
+  // Streams a custom failure message into this object.
+  template <typename T> AssertionResult& operator<<(const T& value) {
+    AppendMessage(Message() << value);
+    return *this;
+  }
+
+  // Allows streaming basic output manipulators such as endl or flush into
+  // this object.
+  AssertionResult& operator<<(
+      ::std::ostream& (*basic_manipulator)(::std::ostream& stream)) {
+    AppendMessage(Message() << basic_manipulator);
+    return *this;
+  }
+
+ private:
+  // Appends the contents of message to message_.
+  void AppendMessage(const Message& a_message) {
+    if (message_.get() == NULL)
+      message_.reset(new ::std::string);
+    message_->append(a_message.GetString().c_str());
+  }
+
+  // Stores result of the assertion predicate.
+  bool success_;
+  // Stores the message describing the condition in case the expectation
+  // construct is not satisfied with the predicate's outcome.
+  // Referenced via a pointer to avoid taking too much stack frame space
+  // with test assertions.
+  internal::scoped_ptr< ::std::string> message_;
+
+  GTEST_DISALLOW_ASSIGN_(AssertionResult);
+};
+
+// Makes a successful assertion result.
+GTEST_API_ AssertionResult AssertionSuccess();
+
+// Makes a failed assertion result.
+GTEST_API_ AssertionResult AssertionFailure();
+
+// Makes a failed assertion result with the given failure message.
+// Deprecated; use AssertionFailure() << msg.
+GTEST_API_ AssertionResult AssertionFailure(const Message& msg);
+
+// The abstract class that all tests inherit from.
+//
+// In Google Test, a unit test program contains one or many TestCases, and
+// each TestCase contains one or many Tests.
+//
+// When you define a test using the TEST macro, you don't need to
+// explicitly derive from Test - the TEST macro automatically does
+// this for you.
+//
+// The only time you derive from Test is when defining a test fixture
+// to be used a TEST_F.  For example:
+//
+//   class FooTest : public testing::Test {
+//    protected:
+//     virtual void SetUp() { ... }
+//     virtual void TearDown() { ... }
+//     ...
+//   };
+//
+//   TEST_F(FooTest, Bar) { ... }
+//   TEST_F(FooTest, Baz) { ... }
+//
+// Test is not copyable.
+class GTEST_API_ Test {
+ public:
+  friend class TestInfo;
+
+  // Defines types for pointers to functions that set up and tear down
+  // a test case.
+  typedef internal::SetUpTestCaseFunc SetUpTestCaseFunc;
+  typedef internal::TearDownTestCaseFunc TearDownTestCaseFunc;
+
+  // The d'tor is virtual as we intend to inherit from Test.
+  virtual ~Test();
+
+  // Sets up the stuff shared by all tests in this test case.
+  //
+  // Google Test will call Foo::SetUpTestCase() before running the first
+  // test in test case Foo.  Hence a sub-class can define its own
+  // SetUpTestCase() method to shadow the one defined in the super
+  // class.
+  static void SetUpTestCase() {}
+
+  // Tears down the stuff shared by all tests in this test case.
+  //
+  // Google Test will call Foo::TearDownTestCase() after running the last
+  // test in test case Foo.  Hence a sub-class can define its own
+  // TearDownTestCase() method to shadow the one defined in the super
+  // class.
+  static void TearDownTestCase() {}
+
+  // Returns true iff the current test has a fatal failure.
+  static bool HasFatalFailure();
+
+  // Returns true iff the current test has a non-fatal failure.
+  static bool HasNonfatalFailure();
+
+  // Returns true iff the current test has a (either fatal or
+  // non-fatal) failure.
+  static bool HasFailure() { return HasFatalFailure() || HasNonfatalFailure(); }
+
+  // Logs a property for the current test, test case, or for the entire
+  // invocation of the test program when used outside of the context of a
+  // test case.  Only the last value for a given key is remembered.  These
+  // are public static so they can be called from utility functions that are
+  // not members of the test fixture.  Calls to RecordProperty made during
+  // lifespan of the test (from the moment its constructor starts to the
+  // moment its destructor finishes) will be output in XML as attributes of
+  // the <testcase> element.  Properties recorded from fixture's
+  // SetUpTestCase or TearDownTestCase are logged as attributes of the
+  // corresponding <testsuite> element.  Calls to RecordProperty made in the
+  // global context (before or after invocation of RUN_ALL_TESTS and from
+  // SetUp/TearDown method of Environment objects registered with Google
+  // Test) will be output as attributes of the <testsuites> element.
+  static void RecordProperty(const std::string& key, const std::string& value);
+  static void RecordProperty(const std::string& key, int value);
+
+ protected:
+  // Creates a Test object.
+  Test();
+
+  // Sets up the test fixture.
+  virtual void SetUp();
+
+  // Tears down the test fixture.
+  virtual void TearDown();
+
+ private:
+  // Returns true iff the current test has the same fixture class as
+  // the first test in the current test case.
+  static bool HasSameFixtureClass();
+
+  // Runs the test after the test fixture has been set up.
+  //
+  // A sub-class must implement this to define the test logic.
+  //
+  // DO NOT OVERRIDE THIS FUNCTION DIRECTLY IN A USER PROGRAM.
+  // Instead, use the TEST or TEST_F macro.
+  virtual void TestBody() = 0;
+
+  // Sets up, executes, and tears down the test.
+  void Run();
+
+  // Deletes self.  We deliberately pick an unusual name for this
+  // internal method to avoid clashing with names used in user TESTs.
+  void DeleteSelf_() { delete this; }
+
+  // Uses a GTestFlagSaver to save and restore all Google Test flags.
+  const internal::GTestFlagSaver* const gtest_flag_saver_;
+
+  // Often a user mis-spells SetUp() as Setup() and spends a long time
+  // wondering why it is never called by Google Test.  The declaration of
+  // the following method is solely for catching such an error at
+  // compile time:
+  //
+  //   - The return type is deliberately chosen to be not void, so it
+  //   will be a conflict if a user declares void Setup() in his test
+  //   fixture.
+  //
+  //   - This method is private, so it will be another compiler error
+  //   if a user calls it from his test fixture.
+  //
+  // DO NOT OVERRIDE THIS FUNCTION.
+  //
+  // If you see an error about overriding the following function or
+  // about it being private, you have mis-spelled SetUp() as Setup().
+  struct Setup_should_be_spelled_SetUp {};
+  virtual Setup_should_be_spelled_SetUp* Setup() { return NULL; }
+
+  // We disallow copying Tests.
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(Test);
+};
+
+typedef internal::TimeInMillis TimeInMillis;
+
+// A copyable object representing a user specified test property which can be
+// output as a key/value string pair.
+//
+// Don't inherit from TestProperty as its destructor is not virtual.
+class TestProperty {
+ public:
+  // C'tor.  TestProperty does NOT have a default constructor.
+  // Always use this constructor (with parameters) to create a
+  // TestProperty object.
+  TestProperty(const std::string& a_key, const std::string& a_value) :
+    key_(a_key), value_(a_value) {
+  }
+
+  // Gets the user supplied key.
+  const char* key() const {
+    return key_.c_str();
+  }
+
+  // Gets the user supplied value.
+  const char* value() const {
+    return value_.c_str();
+  }
+
+  // Sets a new value, overriding the one supplied in the constructor.
+  void SetValue(const std::string& new_value) {
+    value_ = new_value;
+  }
+
+ private:
+  // The key supplied by the user.
+  std::string key_;
+  // The value supplied by the user.
+  std::string value_;
+};
+
+// The result of a single Test.  This includes a list of
+// TestPartResults, a list of TestProperties, a count of how many
+// death tests there are in the Test, and how much time it took to run
+// the Test.
+//
+// TestResult is not copyable.
+class GTEST_API_ TestResult {
+ public:
+  // Creates an empty TestResult.
+  TestResult();
+
+  // D'tor.  Do not inherit from TestResult.
+  ~TestResult();
+
+  // Gets the number of all test parts.  This is the sum of the number
+  // of successful test parts and the number of failed test parts.
+  int total_part_count() const;
+
+  // Returns the number of the test properties.
+  int test_property_count() const;
+
+  // Returns true iff the test passed (i.e. no test part failed).
+  bool Passed() const { return !Failed(); }
+
+  // Returns true iff the test failed.
+  bool Failed() const;
+
+  // Returns true iff the test fatally failed.
+  bool HasFatalFailure() const;
+
+  // Returns true iff the test has a non-fatal failure.
+  bool HasNonfatalFailure() const;
+
+  // Returns the elapsed time, in milliseconds.
+  TimeInMillis elapsed_time() const { return elapsed_time_; }
+
+  // Returns the i-th test part result among all the results. i can range
+  // from 0 to test_property_count() - 1. If i is not in that range, aborts
+  // the program.
+  const TestPartResult& GetTestPartResult(int i) const;
+
+  // Returns the i-th test property. i can range from 0 to
+  // test_property_count() - 1. If i is not in that range, aborts the
+  // program.
+  const TestProperty& GetTestProperty(int i) const;
+
+ private:
+  friend class TestInfo;
+  friend class TestCase;
+  friend class UnitTest;
+  friend class internal::DefaultGlobalTestPartResultReporter;
+  friend class internal::ExecDeathTest;
+  friend class internal::TestResultAccessor;
+  friend class internal::UnitTestImpl;
+  friend class internal::WindowsDeathTest;
+
+  // Gets the vector of TestPartResults.
+  const std::vector<TestPartResult>& test_part_results() const {
+    return test_part_results_;
+  }
+
+  // Gets the vector of TestProperties.
+  const std::vector<TestProperty>& test_properties() const {
+    return test_properties_;
+  }
+
+  // Sets the elapsed time.
+  void set_elapsed_time(TimeInMillis elapsed) { elapsed_time_ = elapsed; }
+
+  // Adds a test property to the list. The property is validated and may add
+  // a non-fatal failure if invalid (e.g., if it conflicts with reserved
+  // key names). If a property is already recorded for the same key, the
+  // value will be updated, rather than storing multiple values for the same
+  // key.  xml_element specifies the element for which the property is being
+  // recorded and is used for validation.
+  void RecordProperty(const std::string& xml_element,
+                      const TestProperty& test_property);
+
+  // Adds a failure if the key is a reserved attribute of Google Test
+  // testcase tags.  Returns true if the property is valid.
+  // TODO(russr): Validate attribute names are legal and human readable.
+  static bool ValidateTestProperty(const std::string& xml_element,
+                                   const TestProperty& test_property);
+
+  // Adds a test part result to the list.
+  void AddTestPartResult(const TestPartResult& test_part_result);
+
+  // Returns the death test count.
+  int death_test_count() const { return death_test_count_; }
+
+  // Increments the death test count, returning the new count.
+  int increment_death_test_count() { return ++death_test_count_; }
+
+  // Clears the test part results.
+  void ClearTestPartResults();
+
+  // Clears the object.
+  void Clear();
+
+  // Protects mutable state of the property vector and of owned
+  // properties, whose values may be updated.
+  internal::Mutex test_properites_mutex_;
+
+  // The vector of TestPartResults
+  std::vector<TestPartResult> test_part_results_;
+  // The vector of TestProperties
+  std::vector<TestProperty> test_properties_;
+  // Running count of death tests.
+  int death_test_count_;
+  // The elapsed time, in milliseconds.
+  TimeInMillis elapsed_time_;
+
+  // We disallow copying TestResult.
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(TestResult);
+};  // class TestResult
+
+// A TestInfo object stores the following information about a test:
+//
+//   Test case name
+//   Test name
+//   Whether the test should be run
+//   A function pointer that creates the test object when invoked
+//   Test result
+//
+// The constructor of TestInfo registers itself with the UnitTest
+// singleton such that the RUN_ALL_TESTS() macro knows which tests to
+// run.
+class GTEST_API_ TestInfo {
+ public:
+  // Destructs a TestInfo object.  This function is not virtual, so
+  // don't inherit from TestInfo.
+  ~TestInfo();
+
+  // Returns the test case name.
+  const char* test_case_name() const { return test_case_name_.c_str(); }
+
+  // Returns the test name.
+  const char* name() const { return name_.c_str(); }
+
+  // Returns the name of the parameter type, or NULL if this is not a typed
+  // or a type-parameterized test.
+  const char* type_param() const {
+    if (type_param_.get() != NULL)
+      return type_param_->c_str();
+    return NULL;
+  }
+
+  // Returns the text representation of the value parameter, or NULL if this
+  // is not a value-parameterized test.
+  const char* value_param() const {
+    if (value_param_.get() != NULL)
+      return value_param_->c_str();
+    return NULL;
+  }
+
+  // Returns true if this test should run, that is if the test is not
+  // disabled (or it is disabled but the also_run_disabled_tests flag has
+  // been specified) and its full name matches the user-specified filter.
+  //
+  // Google Test allows the user to filter the tests by their full names.
+  // The full name of a test Bar in test case Foo is defined as
+  // "Foo.Bar".  Only the tests that match the filter will run.
+  //
+  // A filter is a colon-separated list of glob (not regex) patterns,
+  // optionally followed by a '-' and a colon-separated list of
+  // negative patterns (tests to exclude).  A test is run if it
+  // matches one of the positive patterns and does not match any of
+  // the negative patterns.
+  //
+  // For example, *A*:Foo.* is a filter that matches any string that
+  // contains the character 'A' or starts with "Foo.".
+  bool should_run() const { return should_run_; }
+
+  // Returns true iff this test will appear in the XML report.
+  bool is_reportable() const {
+    // For now, the XML report includes all tests matching the filter.
+    // In the future, we may trim tests that are excluded because of
+    // sharding.
+    return matches_filter_;
+  }
+
+  // Returns the result of the test.
+  const TestResult* result() const { return &result_; }
+
+ private:
+#if GTEST_HAS_DEATH_TEST
+  friend class internal::DefaultDeathTestFactory;
+#endif  // GTEST_HAS_DEATH_TEST
+  friend class Test;
+  friend class TestCase;
+  friend class internal::UnitTestImpl;
+  friend class internal::StreamingListenerTest;
+  friend TestInfo* internal::MakeAndRegisterTestInfo(
+      const char* test_case_name,
+      const char* name,
+      const char* type_param,
+      const char* value_param,
+      internal::TypeId fixture_class_id,
+      Test::SetUpTestCaseFunc set_up_tc,
+      Test::TearDownTestCaseFunc tear_down_tc,
+      internal::TestFactoryBase* factory);
+
+  // Constructs a TestInfo object. The newly constructed instance assumes
+  // ownership of the factory object.
+  TestInfo(const std::string& test_case_name,
+           const std::string& name,
+           const char* a_type_param,   // NULL if not a type-parameterized test
+           const char* a_value_param,  // NULL if not a value-parameterized test
+           internal::TypeId fixture_class_id,
+           internal::TestFactoryBase* factory);
+
+  // Increments the number of death tests encountered in this test so
+  // far.
+  int increment_death_test_count() {
+    return result_.increment_death_test_count();
+  }
+
+  // Creates the test object, runs it, records its result, and then
+  // deletes it.
+  void Run();
+
+  static void ClearTestResult(TestInfo* test_info) {
+    test_info->result_.Clear();
+  }
+
+  // These fields are immutable properties of the test.
+  const std::string test_case_name_;     // Test case name
+  const std::string name_;               // Test name
+  // Name of the parameter type, or NULL if this is not a typed or a
+  // type-parameterized test.
+  const internal::scoped_ptr<const ::std::string> type_param_;
+  // Text representation of the value parameter, or NULL if this is not a
+  // value-parameterized test.
+  const internal::scoped_ptr<const ::std::string> value_param_;
+  const internal::TypeId fixture_class_id_;   // ID of the test fixture class
+  bool should_run_;                 // True iff this test should run
+  bool is_disabled_;                // True iff this test is disabled
+  bool matches_filter_;             // True if this test matches the
+                                    // user-specified filter.
+  internal::TestFactoryBase* const factory_;  // The factory that creates
+                                              // the test object
+
+  // This field is mutable and needs to be reset before running the
+  // test for the second time.
+  TestResult result_;
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(TestInfo);
+};
+
+// A test case, which consists of a vector of TestInfos.
+//
+// TestCase is not copyable.
+class GTEST_API_ TestCase {
+ public:
+  // Creates a TestCase with the given name.
+  //
+  // TestCase does NOT have a default constructor.  Always use this
+  // constructor to create a TestCase object.
+  //
+  // Arguments:
+  //
+  //   name:         name of the test case
+  //   a_type_param: the name of the test's type parameter, or NULL if
+  //                 this is not a type-parameterized test.
+  //   set_up_tc:    pointer to the function that sets up the test case
+  //   tear_down_tc: pointer to the function that tears down the test case
+  TestCase(const char* name, const char* a_type_param,
+           Test::SetUpTestCaseFunc set_up_tc,
+           Test::TearDownTestCaseFunc tear_down_tc);
+
+  // Destructor of TestCase.
+  virtual ~TestCase();
+
+  // Gets the name of the TestCase.
+  const char* name() const { return name_.c_str(); }
+
+  // Returns the name of the parameter type, or NULL if this is not a
+  // type-parameterized test case.
+  const char* type_param() const {
+    if (type_param_.get() != NULL)
+      return type_param_->c_str();
+    return NULL;
+  }
+
+  // Returns true if any test in this test case should run.
+  bool should_run() const { return should_run_; }
+
+  // Gets the number of successful tests in this test case.
+  int successful_test_count() const;
+
+  // Gets the number of failed tests in this test case.
+  int failed_test_count() const;
+
+  // Gets the number of disabled tests that will be reported in the XML report.
+  int reportable_disabled_test_count() const;
+
+  // Gets the number of disabled tests in this test case.
+  int disabled_test_count() const;
+
+  // Gets the number of tests to be printed in the XML report.
+  int reportable_test_count() const;
+
+  // Get the number of tests in this test case that should run.
+  int test_to_run_count() const;
+
+  // Gets the number of all tests in this test case.
+  int total_test_count() const;
+
+  // Returns true iff the test case passed.
+  bool Passed() const { return !Failed(); }
+
+  // Returns true iff the test case failed.
+  bool Failed() const { return failed_test_count() > 0; }
+
+  // Returns the elapsed time, in milliseconds.
+  TimeInMillis elapsed_time() const { return elapsed_time_; }
+
+  // Returns the i-th test among all the tests. i can range from 0 to
+  // total_test_count() - 1. If i is not in that range, returns NULL.
+  const TestInfo* GetTestInfo(int i) const;
+
+  // Returns the TestResult that holds test properties recorded during
+  // execution of SetUpTestCase and TearDownTestCase.
+  const TestResult& ad_hoc_test_result() const { return ad_hoc_test_result_; }
+
+ private:
+  friend class Test;
+  friend class internal::UnitTestImpl;
+
+  // Gets the (mutable) vector of TestInfos in this TestCase.
+  std::vector<TestInfo*>& test_info_list() { return test_info_list_; }
+
+  // Gets the (immutable) vector of TestInfos in this TestCase.
+  const std::vector<TestInfo*>& test_info_list() const {
+    return test_info_list_;
+  }
+
+  // Returns the i-th test among all the tests. i can range from 0 to
+  // total_test_count() - 1. If i is not in that range, returns NULL.
+  TestInfo* GetMutableTestInfo(int i);
+
+  // Sets the should_run member.
+  void set_should_run(bool should) { should_run_ = should; }
+
+  // Adds a TestInfo to this test case.  Will delete the TestInfo upon
+  // destruction of the TestCase object.
+  void AddTestInfo(TestInfo * test_info);
+
+  // Clears the results of all tests in this test case.
+  void ClearResult();
+
+  // Clears the results of all tests in the given test case.
+  static void ClearTestCaseResult(TestCase* test_case) {
+    test_case->ClearResult();
+  }
+
+  // Runs every test in this TestCase.
+  void Run();
+
+  // Runs SetUpTestCase() for this TestCase.  This wrapper is needed
+  // for catching exceptions thrown from SetUpTestCase().
+  void RunSetUpTestCase() { (*set_up_tc_)(); }
+
+  // Runs TearDownTestCase() for this TestCase.  This wrapper is
+  // needed for catching exceptions thrown from TearDownTestCase().
+  void RunTearDownTestCase() { (*tear_down_tc_)(); }
+
+  // Returns true iff test passed.
+  static bool TestPassed(const TestInfo* test_info) {
+    return test_info->should_run() && test_info->result()->Passed();
+  }
+
+  // Returns true iff test failed.
+  static bool TestFailed(const TestInfo* test_info) {
+    return test_info->should_run() && test_info->result()->Failed();
+  }
+
+  // Returns true iff the test is disabled and will be reported in the XML
+  // report.
+  static bool TestReportableDisabled(const TestInfo* test_info) {
+    return test_info->is_reportable() && test_info->is_disabled_;
+  }
+
+  // Returns true iff test is disabled.
+  static bool TestDisabled(const TestInfo* test_info) {
+    return test_info->is_disabled_;
+  }
+
+  // Returns true iff this test will appear in the XML report.
+  static bool TestReportable(const TestInfo* test_info) {
+    return test_info->is_reportable();
+  }
+
+  // Returns true if the given test should run.
+  static bool ShouldRunTest(const TestInfo* test_info) {
+    return test_info->should_run();
+  }
+
+  // Shuffles the tests in this test case.
+  void ShuffleTests(internal::Random* random);
+
+  // Restores the test order to before the first shuffle.
+  void UnshuffleTests();
+
+  // Name of the test case.
+  std::string name_;
+  // Name of the parameter type, or NULL if this is not a typed or a
+  // type-parameterized test.
+  const internal::scoped_ptr<const ::std::string> type_param_;
+  // The vector of TestInfos in their original order.  It owns the
+  // elements in the vector.
+  std::vector<TestInfo*> test_info_list_;
+  // Provides a level of indirection for the test list to allow easy
+  // shuffling and restoring the test order.  The i-th element in this
+  // vector is the index of the i-th test in the shuffled test list.
+  std::vector<int> test_indices_;
+  // Pointer to the function that sets up the test case.
+  Test::SetUpTestCaseFunc set_up_tc_;
+  // Pointer to the function that tears down the test case.
+  Test::TearDownTestCaseFunc tear_down_tc_;
+  // True iff any test in this test case should run.
+  bool should_run_;
+  // Elapsed time, in milliseconds.
+  TimeInMillis elapsed_time_;
+  // Holds test properties recorded during execution of SetUpTestCase and
+  // TearDownTestCase.
+  TestResult ad_hoc_test_result_;
+
+  // We disallow copying TestCases.
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(TestCase);
+};
+
+// An Environment object is capable of setting up and tearing down an
+// environment.  The user should subclass this to define his own
+// environment(s).
+//
+// An Environment object does the set-up and tear-down in virtual
+// methods SetUp() and TearDown() instead of the constructor and the
+// destructor, as:
+//
+//   1. You cannot safely throw from a destructor.  This is a problem
+//      as in some cases Google Test is used where exceptions are enabled, and
+//      we may want to implement ASSERT_* using exceptions where they are
+//      available.
+//   2. You cannot use ASSERT_* directly in a constructor or
+//      destructor.
+class Environment {
+ public:
+  // The d'tor is virtual as we need to subclass Environment.
+  virtual ~Environment() {}
+
+  // Override this to define how to set up the environment.
+  virtual void SetUp() {}
+
+  // Override this to define how to tear down the environment.
+  virtual void TearDown() {}
+ private:
+  // If you see an error about overriding the following function or
+  // about it being private, you have mis-spelled SetUp() as Setup().
+  struct Setup_should_be_spelled_SetUp {};
+  virtual Setup_should_be_spelled_SetUp* Setup() { return NULL; }
+};
+
+// The interface for tracing execution of tests. The methods are organized in
+// the order the corresponding events are fired.
+class TestEventListener {
+ public:
+  virtual ~TestEventListener() {}
+
+  // Fired before any test activity starts.
+  virtual void OnTestProgramStart(const UnitTest& unit_test) = 0;
+
+  // Fired before each iteration of tests starts.  There may be more than
+  // one iteration if GTEST_FLAG(repeat) is set. iteration is the iteration
+  // index, starting from 0.
+  virtual void OnTestIterationStart(const UnitTest& unit_test,
+                                    int iteration) = 0;
+
+  // Fired before environment set-up for each iteration of tests starts.
+  virtual void OnEnvironmentsSetUpStart(const UnitTest& unit_test) = 0;
+
+  // Fired after environment set-up for each iteration of tests ends.
+  virtual void OnEnvironmentsSetUpEnd(const UnitTest& unit_test) = 0;
+
+  // Fired before the test case starts.
+  virtual void OnTestCaseStart(const TestCase& test_case) = 0;
+
+  // Fired before the test starts.
+  virtual void OnTestStart(const TestInfo& test_info) = 0;
+
+  // Fired after a failed assertion or a SUCCEED() invocation.
+  virtual void OnTestPartResult(const TestPartResult& test_part_result) = 0;
+
+  // Fired after the test ends.
+  virtual void OnTestEnd(const TestInfo& test_info) = 0;
+
+  // Fired after the test case ends.
+  virtual void OnTestCaseEnd(const TestCase& test_case) = 0;
+
+  // Fired before environment tear-down for each iteration of tests starts.
+  virtual void OnEnvironmentsTearDownStart(const UnitTest& unit_test) = 0;
+
+  // Fired after environment tear-down for each iteration of tests ends.
+  virtual void OnEnvironmentsTearDownEnd(const UnitTest& unit_test) = 0;
+
+  // Fired after each iteration of tests finishes.
+  virtual void OnTestIterationEnd(const UnitTest& unit_test,
+                                  int iteration) = 0;
+
+  // Fired after all test activities have ended.
+  virtual void OnTestProgramEnd(const UnitTest& unit_test) = 0;
+};
+
+// The convenience class for users who need to override just one or two
+// methods and are not concerned that a possible change to a signature of
+// the methods they override will not be caught during the build.  For
+// comments about each method please see the definition of TestEventListener
+// above.
+class EmptyTestEventListener : public TestEventListener {
+ public:
+  virtual void OnTestProgramStart(const UnitTest& /*unit_test*/) {}
+  virtual void OnTestIterationStart(const UnitTest& /*unit_test*/,
+                                    int /*iteration*/) {}
+  virtual void OnEnvironmentsSetUpStart(const UnitTest& /*unit_test*/) {}
+  virtual void OnEnvironmentsSetUpEnd(const UnitTest& /*unit_test*/) {}
+  virtual void OnTestCaseStart(const TestCase& /*test_case*/) {}
+  virtual void OnTestStart(const TestInfo& /*test_info*/) {}
+  virtual void OnTestPartResult(const TestPartResult& /*test_part_result*/) {}
+  virtual void OnTestEnd(const TestInfo& /*test_info*/) {}
+  virtual void OnTestCaseEnd(const TestCase& /*test_case*/) {}
+  virtual void OnEnvironmentsTearDownStart(const UnitTest& /*unit_test*/) {}
+  virtual void OnEnvironmentsTearDownEnd(const UnitTest& /*unit_test*/) {}
+  virtual void OnTestIterationEnd(const UnitTest& /*unit_test*/,
+                                  int /*iteration*/) {}
+  virtual void OnTestProgramEnd(const UnitTest& /*unit_test*/) {}
+};
+
+// TestEventListeners lets users add listeners to track events in Google Test.
+class GTEST_API_ TestEventListeners {
+ public:
+  TestEventListeners();
+  ~TestEventListeners();
+
+  // Appends an event listener to the end of the list. Google Test assumes
+  // the ownership of the listener (i.e. it will delete the listener when
+  // the test program finishes).
+  void Append(TestEventListener* listener);
+
+  // Removes the given event listener from the list and returns it.  It then
+  // becomes the caller's responsibility to delete the listener. Returns
+  // NULL if the listener is not found in the list.
+  TestEventListener* Release(TestEventListener* listener);
+
+  // Returns the standard listener responsible for the default console
+  // output.  Can be removed from the listeners list to shut down default
+  // console output.  Note that removing this object from the listener list
+  // with Release transfers its ownership to the caller and makes this
+  // function return NULL the next time.
+  TestEventListener* default_result_printer() const {
+    return default_result_printer_;
+  }
+
+  // Returns the standard listener responsible for the default XML output
+  // controlled by the --gtest_output=xml flag.  Can be removed from the
+  // listeners list by users who want to shut down the default XML output
+  // controlled by this flag and substitute it with custom one.  Note that
+  // removing this object from the listener list with Release transfers its
+  // ownership to the caller and makes this function return NULL the next
+  // time.
+  TestEventListener* default_xml_generator() const {
+    return default_xml_generator_;
+  }
+
+ private:
+  friend class TestCase;
+  friend class TestInfo;
+  friend class internal::DefaultGlobalTestPartResultReporter;
+  friend class internal::NoExecDeathTest;
+  friend class internal::TestEventListenersAccessor;
+  friend class internal::UnitTestImpl;
+
+  // Returns repeater that broadcasts the TestEventListener events to all
+  // subscribers.
+  TestEventListener* repeater();
+
+  // Sets the default_result_printer attribute to the provided listener.
+  // The listener is also added to the listener list and previous
+  // default_result_printer is removed from it and deleted. The listener can
+  // also be NULL in which case it will not be added to the list. Does
+  // nothing if the previous and the current listener objects are the same.
+  void SetDefaultResultPrinter(TestEventListener* listener);
+
+  // Sets the default_xml_generator attribute to the provided listener.  The
+  // listener is also added to the listener list and previous
+  // default_xml_generator is removed from it and deleted. The listener can
+  // also be NULL in which case it will not be added to the list. Does
+  // nothing if the previous and the current listener objects are the same.
+  void SetDefaultXmlGenerator(TestEventListener* listener);
+
+  // Controls whether events will be forwarded by the repeater to the
+  // listeners in the list.
+  bool EventForwardingEnabled() const;
+  void SuppressEventForwarding();
+
+  // The actual list of listeners.
+  internal::TestEventRepeater* repeater_;
+  // Listener responsible for the standard result output.
+  TestEventListener* default_result_printer_;
+  // Listener responsible for the creation of the XML output file.
+  TestEventListener* default_xml_generator_;
+
+  // We disallow copying TestEventListeners.
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(TestEventListeners);
+};
+
+// A UnitTest consists of a vector of TestCases.
+//
+// This is a singleton class.  The only instance of UnitTest is
+// created when UnitTest::GetInstance() is first called.  This
+// instance is never deleted.
+//
+// UnitTest is not copyable.
+//
+// This class is thread-safe as long as the methods are called
+// according to their specification.
+class GTEST_API_ UnitTest {
+ public:
+  // Gets the singleton UnitTest object.  The first time this method
+  // is called, a UnitTest object is constructed and returned.
+  // Consecutive calls will return the same object.
+  static UnitTest* GetInstance();
+
+  // Runs all tests in this UnitTest object and prints the result.
+  // Returns 0 if successful, or 1 otherwise.
+  //
+  // This method can only be called from the main thread.
+  //
+  // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
+  int Run() GTEST_MUST_USE_RESULT_;
+
+  // Returns the working directory when the first TEST() or TEST_F()
+  // was executed.  The UnitTest object owns the string.
+  const char* original_working_dir() const;
+
+  // Returns the TestCase object for the test that's currently running,
+  // or NULL if no test is running.
+  const TestCase* current_test_case() const
+      GTEST_LOCK_EXCLUDED_(mutex_);
+
+  // Returns the TestInfo object for the test that's currently running,
+  // or NULL if no test is running.
+  const TestInfo* current_test_info() const
+      GTEST_LOCK_EXCLUDED_(mutex_);
+
+  // Returns the random seed used at the start of the current test run.
+  int random_seed() const;
+
+#if GTEST_HAS_PARAM_TEST
+  // Returns the ParameterizedTestCaseRegistry object used to keep track of
+  // value-parameterized tests and instantiate and register them.
+  //
+  // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
+  internal::ParameterizedTestCaseRegistry& parameterized_test_registry()
+      GTEST_LOCK_EXCLUDED_(mutex_);
+#endif  // GTEST_HAS_PARAM_TEST
+
+  // Gets the number of successful test cases.
+  int successful_test_case_count() const;
+
+  // Gets the number of failed test cases.
+  int failed_test_case_count() const;
+
+  // Gets the number of all test cases.
+  int total_test_case_count() const;
+
+  // Gets the number of all test cases that contain at least one test
+  // that should run.
+  int test_case_to_run_count() const;
+
+  // Gets the number of successful tests.
+  int successful_test_count() const;
+
+  // Gets the number of failed tests.
+  int failed_test_count() const;
+
+  // Gets the number of disabled tests that will be reported in the XML report.
+  int reportable_disabled_test_count() const;
+
+  // Gets the number of disabled tests.
+  int disabled_test_count() const;
+
+  // Gets the number of tests to be printed in the XML report.
+  int reportable_test_count() const;
+
+  // Gets the number of all tests.
+  int total_test_count() const;
+
+  // Gets the number of tests that should run.
+  int test_to_run_count() const;
+
+  // Gets the time of the test program start, in ms from the start of the
+  // UNIX epoch.
+  TimeInMillis start_timestamp() const;
+
+  // Gets the elapsed time, in milliseconds.
+  TimeInMillis elapsed_time() const;
+
+  // Returns true iff the unit test passed (i.e. all test cases passed).
+  bool Passed() const;
+
+  // Returns true iff the unit test failed (i.e. some test case failed
+  // or something outside of all tests failed).
+  bool Failed() const;
+
+  // Gets the i-th test case among all the test cases. i can range from 0 to
+  // total_test_case_count() - 1. If i is not in that range, returns NULL.
+  const TestCase* GetTestCase(int i) const;
+
+  // Returns the TestResult containing information on test failures and
+  // properties logged outside of individual test cases.
+  const TestResult& ad_hoc_test_result() const;
+
+  // Returns the list of event listeners that can be used to track events
+  // inside Google Test.
+  TestEventListeners& listeners();
+
+ private:
+  // Registers and returns a global test environment.  When a test
+  // program is run, all global test environments will be set-up in
+  // the order they were registered.  After all tests in the program
+  // have finished, all global test environments will be torn-down in
+  // the *reverse* order they were registered.
+  //
+  // The UnitTest object takes ownership of the given environment.
+  //
+  // This method can only be called from the main thread.
+  Environment* AddEnvironment(Environment* env);
+
+  // Adds a TestPartResult to the current TestResult object.  All
+  // Google Test assertion macros (e.g. ASSERT_TRUE, EXPECT_EQ, etc)
+  // eventually call this to report their results.  The user code
+  // should use the assertion macros instead of calling this directly.
+  void AddTestPartResult(TestPartResult::Type result_type,
+                         const char* file_name,
+                         int line_number,
+                         const std::string& message,
+                         const std::string& os_stack_trace)
+      GTEST_LOCK_EXCLUDED_(mutex_);
+
+  // Adds a TestProperty to the current TestResult object when invoked from
+  // inside a test, to current TestCase's ad_hoc_test_result_ when invoked
+  // from SetUpTestCase or TearDownTestCase, or to the global property set
+  // when invoked elsewhere.  If the result already contains a property with
+  // the same key, the value will be updated.
+  void RecordProperty(const std::string& key, const std::string& value);
+
+  // Gets the i-th test case among all the test cases. i can range from 0 to
+  // total_test_case_count() - 1. If i is not in that range, returns NULL.
+  TestCase* GetMutableTestCase(int i);
+
+  // Accessors for the implementation object.
+  internal::UnitTestImpl* impl() { return impl_; }
+  const internal::UnitTestImpl* impl() const { return impl_; }
+
+  // These classes and funcions are friends as they need to access private
+  // members of UnitTest.
+  friend class Test;
+  friend class internal::AssertHelper;
+  friend class internal::ScopedTrace;
+  friend class internal::StreamingListenerTest;
+  friend class internal::UnitTestRecordPropertyTestHelper;
+  friend Environment* AddGlobalTestEnvironment(Environment* env);
+  friend internal::UnitTestImpl* internal::GetUnitTestImpl();
+  friend void internal::ReportFailureInUnknownLocation(
+      TestPartResult::Type result_type,
+      const std::string& message);
+
+  // Creates an empty UnitTest.
+  UnitTest();
+
+  // D'tor
+  virtual ~UnitTest();
+
+  // Pushes a trace defined by SCOPED_TRACE() on to the per-thread
+  // Google Test trace stack.
+  void PushGTestTrace(const internal::TraceInfo& trace)
+      GTEST_LOCK_EXCLUDED_(mutex_);
+
+  // Pops a trace from the per-thread Google Test trace stack.
+  void PopGTestTrace()
+      GTEST_LOCK_EXCLUDED_(mutex_);
+
+  // Protects mutable state in *impl_.  This is mutable as some const
+  // methods need to lock it too.
+  mutable internal::Mutex mutex_;
+
+  // Opaque implementation object.  This field is never changed once
+  // the object is constructed.  We don't mark it as const here, as
+  // doing so will cause a warning in the constructor of UnitTest.
+  // Mutable state in *impl_ is protected by mutex_.
+  internal::UnitTestImpl* impl_;
+
+  // We disallow copying UnitTest.
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(UnitTest);
+};
+
+// A convenient wrapper for adding an environment for the test
+// program.
+//
+// You should call this before RUN_ALL_TESTS() is called, probably in
+// main().  If you use gtest_main, you need to call this before main()
+// starts for it to take effect.  For example, you can define a global
+// variable like this:
+//
+//   testing::Environment* const foo_env =
+//       testing::AddGlobalTestEnvironment(new FooEnvironment);
+//
+// However, we strongly recommend you to write your own main() and
+// call AddGlobalTestEnvironment() there, as relying on initialization
+// of global variables makes the code harder to read and may cause
+// problems when you register multiple environments from different
+// translation units and the environments have dependencies among them
+// (remember that the compiler doesn't guarantee the order in which
+// global variables from different translation units are initialized).
+inline Environment* AddGlobalTestEnvironment(Environment* env) {
+  return UnitTest::GetInstance()->AddEnvironment(env);
+}
+
+// Initializes Google Test.  This must be called before calling
+// RUN_ALL_TESTS().  In particular, it parses a command line for the
+// flags that Google Test recognizes.  Whenever a Google Test flag is
+// seen, it is removed from argv, and *argc is decremented.
+//
+// No value is returned.  Instead, the Google Test flag variables are
+// updated.
+//
+// Calling the function for the second time has no user-visible effect.
+GTEST_API_ void InitGoogleTest(int* argc, char** argv);
+
+// This overloaded version can be used in Windows programs compiled in
+// UNICODE mode.
+GTEST_API_ void InitGoogleTest(int* argc, wchar_t** argv);
+
+namespace internal {
+
+// FormatForComparison<ToPrint, OtherOperand>::Format(value) formats a
+// value of type ToPrint that is an operand of a comparison assertion
+// (e.g. ASSERT_EQ).  OtherOperand is the type of the other operand in
+// the comparison, and is used to help determine the best way to
+// format the value.  In particular, when the value is a C string
+// (char pointer) and the other operand is an STL string object, we
+// want to format the C string as a string, since we know it is
+// compared by value with the string object.  If the value is a char
+// pointer but the other operand is not an STL string object, we don't
+// know whether the pointer is supposed to point to a NUL-terminated
+// string, and thus want to print it as a pointer to be safe.
+//
+// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
+
+// The default case.
+template <typename ToPrint, typename OtherOperand>
+class FormatForComparison {
+ public:
+  static ::std::string Format(const ToPrint& value) {
+    return ::testing::PrintToString(value);
+  }
+};
+
+// Array.
+template <typename ToPrint, size_t N, typename OtherOperand>
+class FormatForComparison<ToPrint[N], OtherOperand> {
+ public:
+  static ::std::string Format(const ToPrint* value) {
+    return FormatForComparison<const ToPrint*, OtherOperand>::Format(value);
+  }
+};
+
+// By default, print C string as pointers to be safe, as we don't know
+// whether they actually point to a NUL-terminated string.
+
+#define GTEST_IMPL_FORMAT_C_STRING_AS_POINTER_(CharType)                \
+  template <typename OtherOperand>                                      \
+  class FormatForComparison<CharType*, OtherOperand> {                  \
+   public:                                                              \
+    static ::std::string Format(CharType* value) {                      \
+      return ::testing::PrintToString(static_cast<const void*>(value)); \
+    }                                                                   \
+  }
+
+GTEST_IMPL_FORMAT_C_STRING_AS_POINTER_(char);
+GTEST_IMPL_FORMAT_C_STRING_AS_POINTER_(const char);
+GTEST_IMPL_FORMAT_C_STRING_AS_POINTER_(wchar_t);
+GTEST_IMPL_FORMAT_C_STRING_AS_POINTER_(const wchar_t);
+
+#undef GTEST_IMPL_FORMAT_C_STRING_AS_POINTER_
+
+// If a C string is compared with an STL string object, we know it's meant
+// to point to a NUL-terminated string, and thus can print it as a string.
+
+#define GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(CharType, OtherStringType) \
+  template <>                                                           \
+  class FormatForComparison<CharType*, OtherStringType> {               \
+   public:                                                              \
+    static ::std::string Format(CharType* value) {                      \
+      return ::testing::PrintToString(value);                           \
+    }                                                                   \
+  }
+
+GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(char, ::std::string);
+GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(const char, ::std::string);
+
+#if GTEST_HAS_GLOBAL_STRING
+GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(char, ::string);
+GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(const char, ::string);
+#endif
+
+#if GTEST_HAS_GLOBAL_WSTRING
+GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(wchar_t, ::wstring);
+GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(const wchar_t, ::wstring);
+#endif
+
+#if GTEST_HAS_STD_WSTRING
+GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(wchar_t, ::std::wstring);
+GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(const wchar_t, ::std::wstring);
+#endif
+
+#undef GTEST_IMPL_FORMAT_C_STRING_AS_STRING_
+
+// Formats a comparison assertion (e.g. ASSERT_EQ, EXPECT_LT, and etc)
+// operand to be used in a failure message.  The type (but not value)
+// of the other operand may affect the format.  This allows us to
+// print a char* as a raw pointer when it is compared against another
+// char* or void*, and print it as a C string when it is compared
+// against an std::string object, for example.
+//
+// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
+template <typename T1, typename T2>
+std::string FormatForComparisonFailureMessage(
+    const T1& value, const T2& /* other_operand */) {
+  return FormatForComparison<T1, T2>::Format(value);
+}
+
+// The helper function for {ASSERT|EXPECT}_EQ.
+template <typename T1, typename T2>
+AssertionResult CmpHelperEQ(const char* expected_expression,
+                            const char* actual_expression,
+                            const T1& expected,
+                            const T2& actual) {
+#ifdef _MSC_VER
+# pragma warning(push)          // Saves the current warning state.
+# pragma warning(disable:4389)  // Temporarily disables warning on
+                                // signed/unsigned mismatch.
+#endif
+
+  if (expected == actual) {
+    return AssertionSuccess();
+  }
+
+#ifdef _MSC_VER
+# pragma warning(pop)          // Restores the warning state.
+#endif
+
+  return EqFailure(expected_expression,
+                   actual_expression,
+                   FormatForComparisonFailureMessage(expected, actual),
+                   FormatForComparisonFailureMessage(actual, expected),
+                   false);
+}
+
+// With this overloaded version, we allow anonymous enums to be used
+// in {ASSERT|EXPECT}_EQ when compiled with gcc 4, as anonymous enums
+// can be implicitly cast to BiggestInt.
+GTEST_API_ AssertionResult CmpHelperEQ(const char* expected_expression,
+                                       const char* actual_expression,
+                                       BiggestInt expected,
+                                       BiggestInt actual);
+
+// The helper class for {ASSERT|EXPECT}_EQ.  The template argument
+// lhs_is_null_literal is true iff the first argument to ASSERT_EQ()
+// is a null pointer literal.  The following default implementation is
+// for lhs_is_null_literal being false.
+template <bool lhs_is_null_literal>
+class EqHelper {
+ public:
+  // This templatized version is for the general case.
+  template <typename T1, typename T2>
+  static AssertionResult Compare(const char* expected_expression,
+                                 const char* actual_expression,
+                                 const T1& expected,
+                                 const T2& actual) {
+    return CmpHelperEQ(expected_expression, actual_expression, expected,
+                       actual);
+  }
+
+  // With this overloaded version, we allow anonymous enums to be used
+  // in {ASSERT|EXPECT}_EQ when compiled with gcc 4, as anonymous
+  // enums can be implicitly cast to BiggestInt.
+  //
+  // Even though its body looks the same as the above version, we
+  // cannot merge the two, as it will make anonymous enums unhappy.
+  static AssertionResult Compare(const char* expected_expression,
+                                 const char* actual_expression,
+                                 BiggestInt expected,
+                                 BiggestInt actual) {
+    return CmpHelperEQ(expected_expression, actual_expression, expected,
+                       actual);
+  }
+};
+
+// This specialization is used when the first argument to ASSERT_EQ()
+// is a null pointer literal, like NULL, false, or 0.
+template <>
+class EqHelper<true> {
+ public:
+  // We define two overloaded versions of Compare().  The first
+  // version will be picked when the second argument to ASSERT_EQ() is
+  // NOT a pointer, e.g. ASSERT_EQ(0, AnIntFunction()) or
+  // EXPECT_EQ(false, a_bool).
+  template <typename T1, typename T2>
+  static AssertionResult Compare(
+      const char* expected_expression,
+      const char* actual_expression,
+      const T1& expected,
+      const T2& actual,
+      // The following line prevents this overload from being considered if T2
+      // is not a pointer type.  We need this because ASSERT_EQ(NULL, my_ptr)
+      // expands to Compare("", "", NULL, my_ptr), which requires a conversion
+      // to match the Secret* in the other overload, which would otherwise make
+      // this template match better.
+      typename EnableIf<!is_pointer<T2>::value>::type* = 0) {
+    return CmpHelperEQ(expected_expression, actual_expression, expected,
+                       actual);
+  }
+
+  // This version will be picked when the second argument to ASSERT_EQ() is a
+  // pointer, e.g. ASSERT_EQ(NULL, a_pointer).
+  template <typename T>
+  static AssertionResult Compare(
+      const char* expected_expression,
+      const char* actual_expression,
+      // We used to have a second template parameter instead of Secret*.  That
+      // template parameter would deduce to 'long', making this a better match
+      // than the first overload even without the first overload's EnableIf.
+      // Unfortunately, gcc with -Wconversion-null warns when "passing NULL to
+      // non-pointer argument" (even a deduced integral argument), so the old
+      // implementation caused warnings in user code.
+      Secret* /* expected (NULL) */,
+      T* actual) {
+    // We already know that 'expected' is a null pointer.
+    return CmpHelperEQ(expected_expression, actual_expression,
+                       static_cast<T*>(NULL), actual);
+  }
+};
+
+// A macro for implementing the helper functions needed to implement
+// ASSERT_?? and EXPECT_??.  It is here just to avoid copy-and-paste
+// of similar code.
+//
+// For each templatized helper function, we also define an overloaded
+// version for BiggestInt in order to reduce code bloat and allow
+// anonymous enums to be used with {ASSERT|EXPECT}_?? when compiled
+// with gcc 4.
+//
+// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
+#define GTEST_IMPL_CMP_HELPER_(op_name, op)\
+template <typename T1, typename T2>\
+AssertionResult CmpHelper##op_name(const char* expr1, const char* expr2, \
+                                   const T1& val1, const T2& val2) {\
+  if (val1 op val2) {\
+    return AssertionSuccess();\
+  } else {\
+    return AssertionFailure() \
+        << "Expected: (" << expr1 << ") " #op " (" << expr2\
+        << "), actual: " << FormatForComparisonFailureMessage(val1, val2)\
+        << " vs " << FormatForComparisonFailureMessage(val2, val1);\
+  }\
+}\
+GTEST_API_ AssertionResult CmpHelper##op_name(\
+    const char* expr1, const char* expr2, BiggestInt val1, BiggestInt val2)
+
+// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
+
+// Implements the helper function for {ASSERT|EXPECT}_NE
+GTEST_IMPL_CMP_HELPER_(NE, !=);
+// Implements the helper function for {ASSERT|EXPECT}_LE
+GTEST_IMPL_CMP_HELPER_(LE, <=);
+// Implements the helper function for {ASSERT|EXPECT}_LT
+GTEST_IMPL_CMP_HELPER_(LT, <);
+// Implements the helper function for {ASSERT|EXPECT}_GE
+GTEST_IMPL_CMP_HELPER_(GE, >=);
+// Implements the helper function for {ASSERT|EXPECT}_GT
+GTEST_IMPL_CMP_HELPER_(GT, >);
+
+#undef GTEST_IMPL_CMP_HELPER_
+
+// The helper function for {ASSERT|EXPECT}_STREQ.
+//
+// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
+GTEST_API_ AssertionResult CmpHelperSTREQ(const char* expected_expression,
+                                          const char* actual_expression,
+                                          const char* expected,
+                                          const char* actual);
+
+// The helper function for {ASSERT|EXPECT}_STRCASEEQ.
+//
+// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
+GTEST_API_ AssertionResult CmpHelperSTRCASEEQ(const char* expected_expression,
+                                              const char* actual_expression,
+                                              const char* expected,
+                                              const char* actual);
+
+// The helper function for {ASSERT|EXPECT}_STRNE.
+//
+// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
+GTEST_API_ AssertionResult CmpHelperSTRNE(const char* s1_expression,
+                                          const char* s2_expression,
+                                          const char* s1,
+                                          const char* s2);
+
+// The helper function for {ASSERT|EXPECT}_STRCASENE.
+//
+// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
+GTEST_API_ AssertionResult CmpHelperSTRCASENE(const char* s1_expression,
+                                              const char* s2_expression,
+                                              const char* s1,
+                                              const char* s2);
+
+
+// Helper function for *_STREQ on wide strings.
+//
+// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
+GTEST_API_ AssertionResult CmpHelperSTREQ(const char* expected_expression,
+                                          const char* actual_expression,
+                                          const wchar_t* expected,
+                                          const wchar_t* actual);
+
+// Helper function for *_STRNE on wide strings.
+//
+// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
+GTEST_API_ AssertionResult CmpHelperSTRNE(const char* s1_expression,
+                                          const char* s2_expression,
+                                          const wchar_t* s1,
+                                          const wchar_t* s2);
+
+}  // namespace internal
+
+// IsSubstring() and IsNotSubstring() are intended to be used as the
+// first argument to {EXPECT,ASSERT}_PRED_FORMAT2(), not by
+// themselves.  They check whether needle is a substring of haystack
+// (NULL is considered a substring of itself only), and return an
+// appropriate error message when they fail.
+//
+// The {needle,haystack}_expr arguments are the stringified
+// expressions that generated the two real arguments.
+GTEST_API_ AssertionResult IsSubstring(
+    const char* needle_expr, const char* haystack_expr,
+    const char* needle, const char* haystack);
+GTEST_API_ AssertionResult IsSubstring(
+    const char* needle_expr, const char* haystack_expr,
+    const wchar_t* needle, const wchar_t* haystack);
+GTEST_API_ AssertionResult IsNotSubstring(
+    const char* needle_expr, const char* haystack_expr,
+    const char* needle, const char* haystack);
+GTEST_API_ AssertionResult IsNotSubstring(
+    const char* needle_expr, const char* haystack_expr,
+    const wchar_t* needle, const wchar_t* haystack);
+GTEST_API_ AssertionResult IsSubstring(
+    const char* needle_expr, const char* haystack_expr,
+    const ::std::string& needle, const ::std::string& haystack);
+GTEST_API_ AssertionResult IsNotSubstring(
+    const char* needle_expr, const char* haystack_expr,
+    const ::std::string& needle, const ::std::string& haystack);
+
+#if GTEST_HAS_STD_WSTRING
+GTEST_API_ AssertionResult IsSubstring(
+    const char* needle_expr, const char* haystack_expr,
+    const ::std::wstring& needle, const ::std::wstring& haystack);
+GTEST_API_ AssertionResult IsNotSubstring(
+    const char* needle_expr, const char* haystack_expr,
+    const ::std::wstring& needle, const ::std::wstring& haystack);
+#endif  // GTEST_HAS_STD_WSTRING
+
+namespace internal {
+
+// Helper template function for comparing floating-points.
+//
+// Template parameter:
+//
+//   RawType: the raw floating-point type (either float or double)
+//
+// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
+template <typename RawType>
+AssertionResult CmpHelperFloatingPointEQ(const char* expected_expression,
+                                         const char* actual_expression,
+                                         RawType expected,
+                                         RawType actual) {
+  const FloatingPoint<RawType> lhs(expected), rhs(actual);
+
+  if (lhs.AlmostEquals(rhs)) {
+    return AssertionSuccess();
+  }
+
+  ::std::stringstream expected_ss;
+  expected_ss << std::setprecision(std::numeric_limits<RawType>::digits10 + 2)
+              << expected;
+
+  ::std::stringstream actual_ss;
+  actual_ss << std::setprecision(std::numeric_limits<RawType>::digits10 + 2)
+            << actual;
+
+  return EqFailure(expected_expression,
+                   actual_expression,
+                   StringStreamToString(&expected_ss),
+                   StringStreamToString(&actual_ss),
+                   false);
+}
+
+// Helper function for implementing ASSERT_NEAR.
+//
+// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.
+GTEST_API_ AssertionResult DoubleNearPredFormat(const char* expr1,
+                                                const char* expr2,
+                                                const char* abs_error_expr,
+                                                double val1,
+                                                double val2,
+                                                double abs_error);
+
+// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
+// A class that enables one to stream messages to assertion macros
+class GTEST_API_ AssertHelper {
+ public:
+  // Constructor.
+  AssertHelper(TestPartResult::Type type,
+               const char* file,
+               int line,
+               const char* message);
+  ~AssertHelper();
+
+  // Message assignment is a semantic trick to enable assertion
+  // streaming; see the GTEST_MESSAGE_ macro below.
+  void operator=(const Message& message) const;
+
+ private:
+  // We put our data in a struct so that the size of the AssertHelper class can
+  // be as small as possible.  This is important because gcc is incapable of
+  // re-using stack space even for temporary variables, so every EXPECT_EQ
+  // reserves stack space for another AssertHelper.
+  struct AssertHelperData {
+    AssertHelperData(TestPartResult::Type t,
+                     const char* srcfile,
+                     int line_num,
+                     const char* msg)
+        : type(t), file(srcfile), line(line_num), message(msg) { }
+
+    TestPartResult::Type const type;
+    const char* const file;
+    int const line;
+    std::string const message;
+
+   private:
+    GTEST_DISALLOW_COPY_AND_ASSIGN_(AssertHelperData);
+  };
+
+  AssertHelperData* const data_;
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(AssertHelper);
+};
+
+}  // namespace internal
+
+#if GTEST_HAS_PARAM_TEST
+// The pure interface class that all value-parameterized tests inherit from.
+// A value-parameterized class must inherit from both ::testing::Test and
+// ::testing::WithParamInterface. In most cases that just means inheriting
+// from ::testing::TestWithParam, but more complicated test hierarchies
+// may need to inherit from Test and WithParamInterface at different levels.
+//
+// This interface has support for accessing the test parameter value via
+// the GetParam() method.
+//
+// Use it with one of the parameter generator defining functions, like Range(),
+// Values(), ValuesIn(), Bool(), and Combine().
+//
+// class FooTest : public ::testing::TestWithParam<int> {
+//  protected:
+//   FooTest() {
+//     // Can use GetParam() here.
+//   }
+//   virtual ~FooTest() {
+//     // Can use GetParam() here.
+//   }
+//   virtual void SetUp() {
+//     // Can use GetParam() here.
+//   }
+//   virtual void TearDown {
+//     // Can use GetParam() here.
+//   }
+// };
+// TEST_P(FooTest, DoesBar) {
+//   // Can use GetParam() method here.
+//   Foo foo;
+//   ASSERT_TRUE(foo.DoesBar(GetParam()));
+// }
+// INSTANTIATE_TEST_CASE_P(OneToTenRange, FooTest, ::testing::Range(1, 10));
+
+template <typename T>
+class WithParamInterface {
+ public:
+  typedef T ParamType;
+  virtual ~WithParamInterface() {}
+
+  // The current parameter value. Is also available in the test fixture's
+  // constructor. This member function is non-static, even though it only
+  // references static data, to reduce the opportunity for incorrect uses
+  // like writing 'WithParamInterface<bool>::GetParam()' for a test that
+  // uses a fixture whose parameter type is int.
+  const ParamType& GetParam() const {
+    GTEST_CHECK_(parameter_ != NULL)
+        << "GetParam() can only be called inside a value-parameterized test "
+        << "-- did you intend to write TEST_P instead of TEST_F?";
+    return *parameter_;
+  }
+
+ private:
+  // Sets parameter value. The caller is responsible for making sure the value
+  // remains alive and unchanged throughout the current test.
+  static void SetParam(const ParamType* parameter) {
+    parameter_ = parameter;
+  }
+
+  // Static value used for accessing parameter during a test lifetime.
+  static const ParamType* parameter_;
+
+  // TestClass must be a subclass of WithParamInterface<T> and Test.
+  template <class TestClass> friend class internal::ParameterizedTestFactory;
+};
+
+template <typename T>
+const T* WithParamInterface<T>::parameter_ = NULL;
+
+// Most value-parameterized classes can ignore the existence of
+// WithParamInterface, and can just inherit from ::testing::TestWithParam.
+
+template <typename T>
+class TestWithParam : public Test, public WithParamInterface<T> {
+};
+
+#endif  // GTEST_HAS_PARAM_TEST
+
+// Macros for indicating success/failure in test code.
+
+// ADD_FAILURE unconditionally adds a failure to the current test.
+// SUCCEED generates a success - it doesn't automatically make the
+// current test successful, as a test is only successful when it has
+// no failure.
+//
+// EXPECT_* verifies that a certain condition is satisfied.  If not,
+// it behaves like ADD_FAILURE.  In particular:
+//
+//   EXPECT_TRUE  verifies that a Boolean condition is true.
+//   EXPECT_FALSE verifies that a Boolean condition is false.
+//
+// FAIL and ASSERT_* are similar to ADD_FAILURE and EXPECT_*, except
+// that they will also abort the current function on failure.  People
+// usually want the fail-fast behavior of FAIL and ASSERT_*, but those
+// writing data-driven tests often find themselves using ADD_FAILURE
+// and EXPECT_* more.
+
+// Generates a nonfatal failure with a generic message.
+#define ADD_FAILURE() GTEST_NONFATAL_FAILURE_("Failed")
+
+// Generates a nonfatal failure at the given source file location with
+// a generic message.
+#define ADD_FAILURE_AT(file, line) \
+  GTEST_MESSAGE_AT_(file, line, "Failed", \
+                    ::testing::TestPartResult::kNonFatalFailure)
+
+// Generates a fatal failure with a generic message.
+#define GTEST_FAIL() GTEST_FATAL_FAILURE_("Failed")
+
+// Define this macro to 1 to omit the definition of FAIL(), which is a
+// generic name and clashes with some other libraries.
+#if !GTEST_DONT_DEFINE_FAIL
+# define FAIL() GTEST_FAIL()
+#endif
+
+// Generates a success with a generic message.
+#define GTEST_SUCCEED() GTEST_SUCCESS_("Succeeded")
+
+// Define this macro to 1 to omit the definition of SUCCEED(), which
+// is a generic name and clashes with some other libraries.
+#if !GTEST_DONT_DEFINE_SUCCEED
+# define SUCCEED() GTEST_SUCCEED()
+#endif
+
+// Macros for testing exceptions.
+//
+//    * {ASSERT|EXPECT}_THROW(statement, expected_exception):
+//         Tests that the statement throws the expected exception.
+//    * {ASSERT|EXPECT}_NO_THROW(statement):
+//         Tests that the statement doesn't throw any exception.
+//    * {ASSERT|EXPECT}_ANY_THROW(statement):
+//         Tests that the statement throws an exception.
+
+#define EXPECT_THROW(statement, expected_exception) \
+  GTEST_TEST_THROW_(statement, expected_exception, GTEST_NONFATAL_FAILURE_)
+#define EXPECT_NO_THROW(statement) \
+  GTEST_TEST_NO_THROW_(statement, GTEST_NONFATAL_FAILURE_)
+#define EXPECT_ANY_THROW(statement) \
+  GTEST_TEST_ANY_THROW_(statement, GTEST_NONFATAL_FAILURE_)
+#define ASSERT_THROW(statement, expected_exception) \
+  GTEST_TEST_THROW_(statement, expected_exception, GTEST_FATAL_FAILURE_)
+#define ASSERT_NO_THROW(statement) \
+  GTEST_TEST_NO_THROW_(statement, GTEST_FATAL_FAILURE_)
+#define ASSERT_ANY_THROW(statement) \
+  GTEST_TEST_ANY_THROW_(statement, GTEST_FATAL_FAILURE_)
+
+// Boolean assertions. Condition can be either a Boolean expression or an
+// AssertionResult. For more information on how to use AssertionResult with
+// these macros see comments on that class.
+#define EXPECT_TRUE(condition) \
+  GTEST_TEST_BOOLEAN_(condition, #condition, false, true, \
+                      GTEST_NONFATAL_FAILURE_)
+#define EXPECT_FALSE(condition) \
+  GTEST_TEST_BOOLEAN_(!(condition), #condition, true, false, \
+                      GTEST_NONFATAL_FAILURE_)
+#define ASSERT_TRUE(condition) \
+  GTEST_TEST_BOOLEAN_(condition, #condition, false, true, \
+                      GTEST_FATAL_FAILURE_)
+#define ASSERT_FALSE(condition) \
+  GTEST_TEST_BOOLEAN_(!(condition), #condition, true, false, \
+                      GTEST_FATAL_FAILURE_)
+
+// Includes the auto-generated header that implements a family of
+// generic predicate assertion macros.
+#include "gtest/gtest_pred_impl.h"
+
+// Macros for testing equalities and inequalities.
+//
+//    * {ASSERT|EXPECT}_EQ(expected, actual): Tests that expected == actual
+//    * {ASSERT|EXPECT}_NE(v1, v2):           Tests that v1 != v2
+//    * {ASSERT|EXPECT}_LT(v1, v2):           Tests that v1 < v2
+//    * {ASSERT|EXPECT}_LE(v1, v2):           Tests that v1 <= v2
+//    * {ASSERT|EXPECT}_GT(v1, v2):           Tests that v1 > v2
+//    * {ASSERT|EXPECT}_GE(v1, v2):           Tests that v1 >= v2
+//
+// When they are not, Google Test prints both the tested expressions and
+// their actual values.  The values must be compatible built-in types,
+// or you will get a compiler error.  By "compatible" we mean that the
+// values can be compared by the respective operator.
+//
+// Note:
+//
+//   1. It is possible to make a user-defined type work with
+//   {ASSERT|EXPECT}_??(), but that requires overloading the
+//   comparison operators and is thus discouraged by the Google C++
+//   Usage Guide.  Therefore, you are advised to use the
+//   {ASSERT|EXPECT}_TRUE() macro to assert that two objects are
+//   equal.
+//
+//   2. The {ASSERT|EXPECT}_??() macros do pointer comparisons on
+//   pointers (in particular, C strings).  Therefore, if you use it
+//   with two C strings, you are testing how their locations in memory
+//   are related, not how their content is related.  To compare two C
+//   strings by content, use {ASSERT|EXPECT}_STR*().
+//
+//   3. {ASSERT|EXPECT}_EQ(expected, actual) is preferred to
+//   {ASSERT|EXPECT}_TRUE(expected == actual), as the former tells you
+//   what the actual value is when it fails, and similarly for the
+//   other comparisons.
+//
+//   4. Do not depend on the order in which {ASSERT|EXPECT}_??()
+//   evaluate their arguments, which is undefined.
+//
+//   5. These macros evaluate their arguments exactly once.
+//
+// Examples:
+//
+//   EXPECT_NE(5, Foo());
+//   EXPECT_EQ(NULL, a_pointer);
+//   ASSERT_LT(i, array_size);
+//   ASSERT_GT(records.size(), 0) << "There is no record left.";
+
+#define EXPECT_EQ(expected, actual) \
+  EXPECT_PRED_FORMAT2(::testing::internal:: \
+                      EqHelper<GTEST_IS_NULL_LITERAL_(expected)>::Compare, \
+                      expected, actual)
+#define EXPECT_NE(expected, actual) \
+  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperNE, expected, actual)
+#define EXPECT_LE(val1, val2) \
+  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperLE, val1, val2)
+#define EXPECT_LT(val1, val2) \
+  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperLT, val1, val2)
+#define EXPECT_GE(val1, val2) \
+  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperGE, val1, val2)
+#define EXPECT_GT(val1, val2) \
+  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperGT, val1, val2)
+
+#define GTEST_ASSERT_EQ(expected, actual) \
+  ASSERT_PRED_FORMAT2(::testing::internal:: \
+                      EqHelper<GTEST_IS_NULL_LITERAL_(expected)>::Compare, \
+                      expected, actual)
+#define GTEST_ASSERT_NE(val1, val2) \
+  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperNE, val1, val2)
+#define GTEST_ASSERT_LE(val1, val2) \
+  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperLE, val1, val2)
+#define GTEST_ASSERT_LT(val1, val2) \
+  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperLT, val1, val2)
+#define GTEST_ASSERT_GE(val1, val2) \
+  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperGE, val1, val2)
+#define GTEST_ASSERT_GT(val1, val2) \
+  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperGT, val1, val2)
+
+// Define macro GTEST_DONT_DEFINE_ASSERT_XY to 1 to omit the definition of
+// ASSERT_XY(), which clashes with some users' own code.
+
+#if !GTEST_DONT_DEFINE_ASSERT_EQ
+# define ASSERT_EQ(val1, val2) GTEST_ASSERT_EQ(val1, val2)
+#endif
+
+#if !GTEST_DONT_DEFINE_ASSERT_NE
+# define ASSERT_NE(val1, val2) GTEST_ASSERT_NE(val1, val2)
+#endif
+
+#if !GTEST_DONT_DEFINE_ASSERT_LE
+# define ASSERT_LE(val1, val2) GTEST_ASSERT_LE(val1, val2)
+#endif
+
+#if !GTEST_DONT_DEFINE_ASSERT_LT
+# define ASSERT_LT(val1, val2) GTEST_ASSERT_LT(val1, val2)
+#endif
+
+#if !GTEST_DONT_DEFINE_ASSERT_GE
+# define ASSERT_GE(val1, val2) GTEST_ASSERT_GE(val1, val2)
+#endif
+
+#if !GTEST_DONT_DEFINE_ASSERT_GT
+# define ASSERT_GT(val1, val2) GTEST_ASSERT_GT(val1, val2)
+#endif
+
+// C-string Comparisons.  All tests treat NULL and any non-NULL string
+// as different.  Two NULLs are equal.
+//
+//    * {ASSERT|EXPECT}_STREQ(s1, s2):     Tests that s1 == s2
+//    * {ASSERT|EXPECT}_STRNE(s1, s2):     Tests that s1 != s2
+//    * {ASSERT|EXPECT}_STRCASEEQ(s1, s2): Tests that s1 == s2, ignoring case
+//    * {ASSERT|EXPECT}_STRCASENE(s1, s2): Tests that s1 != s2, ignoring case
+//
+// For wide or narrow string objects, you can use the
+// {ASSERT|EXPECT}_??() macros.
+//
+// Don't depend on the order in which the arguments are evaluated,
+// which is undefined.
+//
+// These macros evaluate their arguments exactly once.
+
+#define EXPECT_STREQ(expected, actual) \
+  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperSTREQ, expected, actual)
+#define EXPECT_STRNE(s1, s2) \
+  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperSTRNE, s1, s2)
+#define EXPECT_STRCASEEQ(expected, actual) \
+  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperSTRCASEEQ, expected, actual)
+#define EXPECT_STRCASENE(s1, s2)\
+  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperSTRCASENE, s1, s2)
+
+#define ASSERT_STREQ(expected, actual) \
+  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperSTREQ, expected, actual)
+#define ASSERT_STRNE(s1, s2) \
+  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperSTRNE, s1, s2)
+#define ASSERT_STRCASEEQ(expected, actual) \
+  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperSTRCASEEQ, expected, actual)
+#define ASSERT_STRCASENE(s1, s2)\
+  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperSTRCASENE, s1, s2)
+
+// Macros for comparing floating-point numbers.
+//
+//    * {ASSERT|EXPECT}_FLOAT_EQ(expected, actual):
+//         Tests that two float values are almost equal.
+//    * {ASSERT|EXPECT}_DOUBLE_EQ(expected, actual):
+//         Tests that two double values are almost equal.
+//    * {ASSERT|EXPECT}_NEAR(v1, v2, abs_error):
+//         Tests that v1 and v2 are within the given distance to each other.
+//
+// Google Test uses ULP-based comparison to automatically pick a default
+// error bound that is appropriate for the operands.  See the
+// FloatingPoint template class in gtest-internal.h if you are
+// interested in the implementation details.
+
+#define EXPECT_FLOAT_EQ(expected, actual)\
+  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperFloatingPointEQ<float>, \
+                      expected, actual)
+
+#define EXPECT_DOUBLE_EQ(expected, actual)\
+  EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperFloatingPointEQ<double>, \
+                      expected, actual)
+
+#define ASSERT_FLOAT_EQ(expected, actual)\
+  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperFloatingPointEQ<float>, \
+                      expected, actual)
+
+#define ASSERT_DOUBLE_EQ(expected, actual)\
+  ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperFloatingPointEQ<double>, \
+                      expected, actual)
+
+#define EXPECT_NEAR(val1, val2, abs_error)\
+  EXPECT_PRED_FORMAT3(::testing::internal::DoubleNearPredFormat, \
+                      val1, val2, abs_error)
+
+#define ASSERT_NEAR(val1, val2, abs_error)\
+  ASSERT_PRED_FORMAT3(::testing::internal::DoubleNearPredFormat, \
+                      val1, val2, abs_error)
+
+// These predicate format functions work on floating-point values, and
+// can be used in {ASSERT|EXPECT}_PRED_FORMAT2*(), e.g.
+//
+//   EXPECT_PRED_FORMAT2(testing::DoubleLE, Foo(), 5.0);
+
+// Asserts that val1 is less than, or almost equal to, val2.  Fails
+// otherwise.  In particular, it fails if either val1 or val2 is NaN.
+GTEST_API_ AssertionResult FloatLE(const char* expr1, const char* expr2,
+                                   float val1, float val2);
+GTEST_API_ AssertionResult DoubleLE(const char* expr1, const char* expr2,
+                                    double val1, double val2);
+
+
+#if GTEST_OS_WINDOWS
+
+// Macros that test for HRESULT failure and success, these are only useful
+// on Windows, and rely on Windows SDK macros and APIs to compile.
+//
+//    * {ASSERT|EXPECT}_HRESULT_{SUCCEEDED|FAILED}(expr)
+//
+// When expr unexpectedly fails or succeeds, Google Test prints the
+// expected result and the actual result with both a human-readable
+// string representation of the error, if available, as well as the
+// hex result code.
+# define EXPECT_HRESULT_SUCCEEDED(expr) \
+    EXPECT_PRED_FORMAT1(::testing::internal::IsHRESULTSuccess, (expr))
+
+# define ASSERT_HRESULT_SUCCEEDED(expr) \
+    ASSERT_PRED_FORMAT1(::testing::internal::IsHRESULTSuccess, (expr))
+
+# define EXPECT_HRESULT_FAILED(expr) \
+    EXPECT_PRED_FORMAT1(::testing::internal::IsHRESULTFailure, (expr))
+
+# define ASSERT_HRESULT_FAILED(expr) \
+    ASSERT_PRED_FORMAT1(::testing::internal::IsHRESULTFailure, (expr))
+
+#endif  // GTEST_OS_WINDOWS
+
+// Macros that execute statement and check that it doesn't generate new fatal
+// failures in the current thread.
+//
+//   * {ASSERT|EXPECT}_NO_FATAL_FAILURE(statement);
+//
+// Examples:
+//
+//   EXPECT_NO_FATAL_FAILURE(Process());
+//   ASSERT_NO_FATAL_FAILURE(Process()) << "Process() failed";
+//
+#define ASSERT_NO_FATAL_FAILURE(statement) \
+    GTEST_TEST_NO_FATAL_FAILURE_(statement, GTEST_FATAL_FAILURE_)
+#define EXPECT_NO_FATAL_FAILURE(statement) \
+    GTEST_TEST_NO_FATAL_FAILURE_(statement, GTEST_NONFATAL_FAILURE_)
+
+// Causes a trace (including the source file path, the current line
+// number, and the given message) to be included in every test failure
+// message generated by code in the current scope.  The effect is
+// undone when the control leaves the current scope.
+//
+// The message argument can be anything streamable to std::ostream.
+//
+// In the implementation, we include the current line number as part
+// of the dummy variable name, thus allowing multiple SCOPED_TRACE()s
+// to appear in the same block - as long as they are on different
+// lines.
+#define SCOPED_TRACE(message) \
+  ::testing::internal::ScopedTrace GTEST_CONCAT_TOKEN_(gtest_trace_, __LINE__)(\
+    __FILE__, __LINE__, ::testing::Message() << (message))
+
+// Compile-time assertion for type equality.
+// StaticAssertTypeEq<type1, type2>() compiles iff type1 and type2 are
+// the same type.  The value it returns is not interesting.
+//
+// Instead of making StaticAssertTypeEq a class template, we make it a
+// function template that invokes a helper class template.  This
+// prevents a user from misusing StaticAssertTypeEq<T1, T2> by
+// defining objects of that type.
+//
+// CAVEAT:
+//
+// When used inside a method of a class template,
+// StaticAssertTypeEq<T1, T2>() is effective ONLY IF the method is
+// instantiated.  For example, given:
+//
+//   template <typename T> class Foo {
+//    public:
+//     void Bar() { testing::StaticAssertTypeEq<int, T>(); }
+//   };
+//
+// the code:
+//
+//   void Test1() { Foo<bool> foo; }
+//
+// will NOT generate a compiler error, as Foo<bool>::Bar() is never
+// actually instantiated.  Instead, you need:
+//
+//   void Test2() { Foo<bool> foo; foo.Bar(); }
+//
+// to cause a compiler error.
+template <typename T1, typename T2>
+bool StaticAssertTypeEq() {
+  (void)internal::StaticAssertTypeEqHelper<T1, T2>();
+  return true;
+}
+
+// Defines a test.
+//
+// The first parameter is the name of the test case, and the second
+// parameter is the name of the test within the test case.
+//
+// The convention is to end the test case name with "Test".  For
+// example, a test case for the Foo class can be named FooTest.
+//
+// The user should put his test code between braces after using this
+// macro.  Example:
+//
+//   TEST(FooTest, InitializesCorrectly) {
+//     Foo foo;
+//     EXPECT_TRUE(foo.StatusIsOK());
+//   }
+
+// Note that we call GetTestTypeId() instead of GetTypeId<
+// ::testing::Test>() here to get the type ID of testing::Test.  This
+// is to work around a suspected linker bug when using Google Test as
+// a framework on Mac OS X.  The bug causes GetTypeId<
+// ::testing::Test>() to return different values depending on whether
+// the call is from the Google Test framework itself or from user test
+// code.  GetTestTypeId() is guaranteed to always return the same
+// value, as it always calls GetTypeId<>() from the Google Test
+// framework.
+#define GTEST_TEST(test_case_name, test_name)\
+  GTEST_TEST_(test_case_name, test_name, \
+              ::testing::Test, ::testing::internal::GetTestTypeId())
+
+// Define this macro to 1 to omit the definition of TEST(), which
+// is a generic name and clashes with some other libraries.
+#if !GTEST_DONT_DEFINE_TEST
+# define TEST(test_case_name, test_name) GTEST_TEST(test_case_name, test_name)
+#endif
+
+// Defines a test that uses a test fixture.
+//
+// The first parameter is the name of the test fixture class, which
+// also doubles as the test case name.  The second parameter is the
+// name of the test within the test case.
+//
+// A test fixture class must be declared earlier.  The user should put
+// his test code between braces after using this macro.  Example:
+//
+//   class FooTest : public testing::Test {
+//    protected:
+//     virtual void SetUp() { b_.AddElement(3); }
+//
+//     Foo a_;
+//     Foo b_;
+//   };
+//
+//   TEST_F(FooTest, InitializesCorrectly) {
+//     EXPECT_TRUE(a_.StatusIsOK());
+//   }
+//
+//   TEST_F(FooTest, ReturnsElementCountCorrectly) {
+//     EXPECT_EQ(0, a_.size());
+//     EXPECT_EQ(1, b_.size());
+//   }
+
+#define TEST_F(test_fixture, test_name)\
+  GTEST_TEST_(test_fixture, test_name, test_fixture, \
+              ::testing::internal::GetTypeId<test_fixture>())
+
+}  // namespace testing
+
+// Use this function in main() to run all tests.  It returns 0 if all
+// tests are successful, or 1 otherwise.
+//
+// RUN_ALL_TESTS() should be invoked after the command line has been
+// parsed by InitGoogleTest().
+//
+// This function was formerly a macro; thus, it is in the global
+// namespace and has an all-caps name.
+int RUN_ALL_TESTS() GTEST_MUST_USE_RESULT_;
+
+inline int RUN_ALL_TESTS() {
+  return ::testing::UnitTest::GetInstance()->Run();
+}
+
+#endif  // GTEST_INCLUDE_GTEST_GTEST_H_
diff --git a/contrib/gtest-1.7.0/include/gtest/gtest_pred_impl.h b/contrib/gtest-1.7.0/include/gtest/gtest_pred_impl.h
new file mode 100644
index 0000000..30ae712
--- /dev/null
+++ b/contrib/gtest-1.7.0/include/gtest/gtest_pred_impl.h
@@ -0,0 +1,358 @@
+// Copyright 2006, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+// This file is AUTOMATICALLY GENERATED on 10/31/2011 by command
+// 'gen_gtest_pred_impl.py 5'.  DO NOT EDIT BY HAND!
+//
+// Implements a family of generic predicate assertion macros.
+
+#ifndef GTEST_INCLUDE_GTEST_GTEST_PRED_IMPL_H_
+#define GTEST_INCLUDE_GTEST_GTEST_PRED_IMPL_H_
+
+// Makes sure this header is not included before gtest.h.
+#ifndef GTEST_INCLUDE_GTEST_GTEST_H_
+# error Do not include gtest_pred_impl.h directly.  Include gtest.h instead.
+#endif  // GTEST_INCLUDE_GTEST_GTEST_H_
+
+// This header implements a family of generic predicate assertion
+// macros:
+//
+//   ASSERT_PRED_FORMAT1(pred_format, v1)
+//   ASSERT_PRED_FORMAT2(pred_format, v1, v2)
+//   ...
+//
+// where pred_format is a function or functor that takes n (in the
+// case of ASSERT_PRED_FORMATn) values and their source expression
+// text, and returns a testing::AssertionResult.  See the definition
+// of ASSERT_EQ in gtest.h for an example.
+//
+// If you don't care about formatting, you can use the more
+// restrictive version:
+//
+//   ASSERT_PRED1(pred, v1)
+//   ASSERT_PRED2(pred, v1, v2)
+//   ...
+//
+// where pred is an n-ary function or functor that returns bool,
+// and the values v1, v2, ..., must support the << operator for
+// streaming to std::ostream.
+//
+// We also define the EXPECT_* variations.
+//
+// For now we only support predicates whose arity is at most 5.
+// Please email googletestframework at googlegroups.com if you need
+// support for higher arities.
+
+// GTEST_ASSERT_ is the basic statement to which all of the assertions
+// in this file reduce.  Don't use this in your code.
+
+#define GTEST_ASSERT_(expression, on_failure) \
+  GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
+  if (const ::testing::AssertionResult gtest_ar = (expression)) \
+    ; \
+  else \
+    on_failure(gtest_ar.failure_message())
+
+
+// Helper function for implementing {EXPECT|ASSERT}_PRED1.  Don't use
+// this in your code.
+template <typename Pred,
+          typename T1>
+AssertionResult AssertPred1Helper(const char* pred_text,
+                                  const char* e1,
+                                  Pred pred,
+                                  const T1& v1) {
+  if (pred(v1)) return AssertionSuccess();
+
+  return AssertionFailure() << pred_text << "("
+                            << e1 << ") evaluates to false, where"
+                            << "\n" << e1 << " evaluates to " << v1;
+}
+
+// Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT1.
+// Don't use this in your code.
+#define GTEST_PRED_FORMAT1_(pred_format, v1, on_failure)\
+  GTEST_ASSERT_(pred_format(#v1, v1), \
+                on_failure)
+
+// Internal macro for implementing {EXPECT|ASSERT}_PRED1.  Don't use
+// this in your code.
+#define GTEST_PRED1_(pred, v1, on_failure)\
+  GTEST_ASSERT_(::testing::AssertPred1Helper(#pred, \
+                                             #v1, \
+                                             pred, \
+                                             v1), on_failure)
+
+// Unary predicate assertion macros.
+#define EXPECT_PRED_FORMAT1(pred_format, v1) \
+  GTEST_PRED_FORMAT1_(pred_format, v1, GTEST_NONFATAL_FAILURE_)
+#define EXPECT_PRED1(pred, v1) \
+  GTEST_PRED1_(pred, v1, GTEST_NONFATAL_FAILURE_)
+#define ASSERT_PRED_FORMAT1(pred_format, v1) \
+  GTEST_PRED_FORMAT1_(pred_format, v1, GTEST_FATAL_FAILURE_)
+#define ASSERT_PRED1(pred, v1) \
+  GTEST_PRED1_(pred, v1, GTEST_FATAL_FAILURE_)
+
+
+
+// Helper function for implementing {EXPECT|ASSERT}_PRED2.  Don't use
+// this in your code.
+template <typename Pred,
+          typename T1,
+          typename T2>
+AssertionResult AssertPred2Helper(const char* pred_text,
+                                  const char* e1,
+                                  const char* e2,
+                                  Pred pred,
+                                  const T1& v1,
+                                  const T2& v2) {
+  if (pred(v1, v2)) return AssertionSuccess();
+
+  return AssertionFailure() << pred_text << "("
+                            << e1 << ", "
+                            << e2 << ") evaluates to false, where"
+                            << "\n" << e1 << " evaluates to " << v1
+                            << "\n" << e2 << " evaluates to " << v2;
+}
+
+// Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT2.
+// Don't use this in your code.
+#define GTEST_PRED_FORMAT2_(pred_format, v1, v2, on_failure)\
+  GTEST_ASSERT_(pred_format(#v1, #v2, v1, v2), \
+                on_failure)
+
+// Internal macro for implementing {EXPECT|ASSERT}_PRED2.  Don't use
+// this in your code.
+#define GTEST_PRED2_(pred, v1, v2, on_failure)\
+  GTEST_ASSERT_(::testing::AssertPred2Helper(#pred, \
+                                             #v1, \
+                                             #v2, \
+                                             pred, \
+                                             v1, \
+                                             v2), on_failure)
+
+// Binary predicate assertion macros.
+#define EXPECT_PRED_FORMAT2(pred_format, v1, v2) \
+  GTEST_PRED_FORMAT2_(pred_format, v1, v2, GTEST_NONFATAL_FAILURE_)
+#define EXPECT_PRED2(pred, v1, v2) \
+  GTEST_PRED2_(pred, v1, v2, GTEST_NONFATAL_FAILURE_)
+#define ASSERT_PRED_FORMAT2(pred_format, v1, v2) \
+  GTEST_PRED_FORMAT2_(pred_format, v1, v2, GTEST_FATAL_FAILURE_)
+#define ASSERT_PRED2(pred, v1, v2) \
+  GTEST_PRED2_(pred, v1, v2, GTEST_FATAL_FAILURE_)
+
+
+
+// Helper function for implementing {EXPECT|ASSERT}_PRED3.  Don't use
+// this in your code.
+template <typename Pred,
+          typename T1,
+          typename T2,
+          typename T3>
+AssertionResult AssertPred3Helper(const char* pred_text,
+                                  const char* e1,
+                                  const char* e2,
+                                  const char* e3,
+                                  Pred pred,
+                                  const T1& v1,
+                                  const T2& v2,
+                                  const T3& v3) {
+  if (pred(v1, v2, v3)) return AssertionSuccess();
+
+  return AssertionFailure() << pred_text << "("
+                            << e1 << ", "
+                            << e2 << ", "
+                            << e3 << ") evaluates to false, where"
+                            << "\n" << e1 << " evaluates to " << v1
+                            << "\n" << e2 << " evaluates to " << v2
+                            << "\n" << e3 << " evaluates to " << v3;
+}
+
+// Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT3.
+// Don't use this in your code.
+#define GTEST_PRED_FORMAT3_(pred_format, v1, v2, v3, on_failure)\
+  GTEST_ASSERT_(pred_format(#v1, #v2, #v3, v1, v2, v3), \
+                on_failure)
+
+// Internal macro for implementing {EXPECT|ASSERT}_PRED3.  Don't use
+// this in your code.
+#define GTEST_PRED3_(pred, v1, v2, v3, on_failure)\
+  GTEST_ASSERT_(::testing::AssertPred3Helper(#pred, \
+                                             #v1, \
+                                             #v2, \
+                                             #v3, \
+                                             pred, \
+                                             v1, \
+                                             v2, \
+                                             v3), on_failure)
+
+// Ternary predicate assertion macros.
+#define EXPECT_PRED_FORMAT3(pred_format, v1, v2, v3) \
+  GTEST_PRED_FORMAT3_(pred_format, v1, v2, v3, GTEST_NONFATAL_FAILURE_)
+#define EXPECT_PRED3(pred, v1, v2, v3) \
+  GTEST_PRED3_(pred, v1, v2, v3, GTEST_NONFATAL_FAILURE_)
+#define ASSERT_PRED_FORMAT3(pred_format, v1, v2, v3) \
+  GTEST_PRED_FORMAT3_(pred_format, v1, v2, v3, GTEST_FATAL_FAILURE_)
+#define ASSERT_PRED3(pred, v1, v2, v3) \
+  GTEST_PRED3_(pred, v1, v2, v3, GTEST_FATAL_FAILURE_)
+
+
+
+// Helper function for implementing {EXPECT|ASSERT}_PRED4.  Don't use
+// this in your code.
+template <typename Pred,
+          typename T1,
+          typename T2,
+          typename T3,
+          typename T4>
+AssertionResult AssertPred4Helper(const char* pred_text,
+                                  const char* e1,
+                                  const char* e2,
+                                  const char* e3,
+                                  const char* e4,
+                                  Pred pred,
+                                  const T1& v1,
+                                  const T2& v2,
+                                  const T3& v3,
+                                  const T4& v4) {
+  if (pred(v1, v2, v3, v4)) return AssertionSuccess();
+
+  return AssertionFailure() << pred_text << "("
+                            << e1 << ", "
+                            << e2 << ", "
+                            << e3 << ", "
+                            << e4 << ") evaluates to false, where"
+                            << "\n" << e1 << " evaluates to " << v1
+                            << "\n" << e2 << " evaluates to " << v2
+                            << "\n" << e3 << " evaluates to " << v3
+                            << "\n" << e4 << " evaluates to " << v4;
+}
+
+// Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT4.
+// Don't use this in your code.
+#define GTEST_PRED_FORMAT4_(pred_format, v1, v2, v3, v4, on_failure)\
+  GTEST_ASSERT_(pred_format(#v1, #v2, #v3, #v4, v1, v2, v3, v4), \
+                on_failure)
+
+// Internal macro for implementing {EXPECT|ASSERT}_PRED4.  Don't use
+// this in your code.
+#define GTEST_PRED4_(pred, v1, v2, v3, v4, on_failure)\
+  GTEST_ASSERT_(::testing::AssertPred4Helper(#pred, \
+                                             #v1, \
+                                             #v2, \
+                                             #v3, \
+                                             #v4, \
+                                             pred, \
+                                             v1, \
+                                             v2, \
+                                             v3, \
+                                             v4), on_failure)
+
+// 4-ary predicate assertion macros.
+#define EXPECT_PRED_FORMAT4(pred_format, v1, v2, v3, v4) \
+  GTEST_PRED_FORMAT4_(pred_format, v1, v2, v3, v4, GTEST_NONFATAL_FAILURE_)
+#define EXPECT_PRED4(pred, v1, v2, v3, v4) \
+  GTEST_PRED4_(pred, v1, v2, v3, v4, GTEST_NONFATAL_FAILURE_)
+#define ASSERT_PRED_FORMAT4(pred_format, v1, v2, v3, v4) \
+  GTEST_PRED_FORMAT4_(pred_format, v1, v2, v3, v4, GTEST_FATAL_FAILURE_)
+#define ASSERT_PRED4(pred, v1, v2, v3, v4) \
+  GTEST_PRED4_(pred, v1, v2, v3, v4, GTEST_FATAL_FAILURE_)
+
+
+
+// Helper function for implementing {EXPECT|ASSERT}_PRED5.  Don't use
+// this in your code.
+template <typename Pred,
+          typename T1,
+          typename T2,
+          typename T3,
+          typename T4,
+          typename T5>
+AssertionResult AssertPred5Helper(const char* pred_text,
+                                  const char* e1,
+                                  const char* e2,
+                                  const char* e3,
+                                  const char* e4,
+                                  const char* e5,
+                                  Pred pred,
+                                  const T1& v1,
+                                  const T2& v2,
+                                  const T3& v3,
+                                  const T4& v4,
+                                  const T5& v5) {
+  if (pred(v1, v2, v3, v4, v5)) return AssertionSuccess();
+
+  return AssertionFailure() << pred_text << "("
+                            << e1 << ", "
+                            << e2 << ", "
+                            << e3 << ", "
+                            << e4 << ", "
+                            << e5 << ") evaluates to false, where"
+                            << "\n" << e1 << " evaluates to " << v1
+                            << "\n" << e2 << " evaluates to " << v2
+                            << "\n" << e3 << " evaluates to " << v3
+                            << "\n" << e4 << " evaluates to " << v4
+                            << "\n" << e5 << " evaluates to " << v5;
+}
+
+// Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT5.
+// Don't use this in your code.
+#define GTEST_PRED_FORMAT5_(pred_format, v1, v2, v3, v4, v5, on_failure)\
+  GTEST_ASSERT_(pred_format(#v1, #v2, #v3, #v4, #v5, v1, v2, v3, v4, v5), \
+                on_failure)
+
+// Internal macro for implementing {EXPECT|ASSERT}_PRED5.  Don't use
+// this in your code.
+#define GTEST_PRED5_(pred, v1, v2, v3, v4, v5, on_failure)\
+  GTEST_ASSERT_(::testing::AssertPred5Helper(#pred, \
+                                             #v1, \
+                                             #v2, \
+                                             #v3, \
+                                             #v4, \
+                                             #v5, \
+                                             pred, \
+                                             v1, \
+                                             v2, \
+                                             v3, \
+                                             v4, \
+                                             v5), on_failure)
+
+// 5-ary predicate assertion macros.
+#define EXPECT_PRED_FORMAT5(pred_format, v1, v2, v3, v4, v5) \
+  GTEST_PRED_FORMAT5_(pred_format, v1, v2, v3, v4, v5, GTEST_NONFATAL_FAILURE_)
+#define EXPECT_PRED5(pred, v1, v2, v3, v4, v5) \
+  GTEST_PRED5_(pred, v1, v2, v3, v4, v5, GTEST_NONFATAL_FAILURE_)
+#define ASSERT_PRED_FORMAT5(pred_format, v1, v2, v3, v4, v5) \
+  GTEST_PRED_FORMAT5_(pred_format, v1, v2, v3, v4, v5, GTEST_FATAL_FAILURE_)
+#define ASSERT_PRED5(pred, v1, v2, v3, v4, v5) \
+  GTEST_PRED5_(pred, v1, v2, v3, v4, v5, GTEST_FATAL_FAILURE_)
+
+
+
+#endif  // GTEST_INCLUDE_GTEST_GTEST_PRED_IMPL_H_
diff --git a/contrib/gtest-1.7.0/include/gtest/gtest_prod.h b/contrib/gtest-1.7.0/include/gtest/gtest_prod.h
new file mode 100644
index 0000000..da80ddc
--- /dev/null
+++ b/contrib/gtest-1.7.0/include/gtest/gtest_prod.h
@@ -0,0 +1,58 @@
+// Copyright 2006, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+//
+// Google C++ Testing Framework definitions useful in production code.
+
+#ifndef GTEST_INCLUDE_GTEST_GTEST_PROD_H_
+#define GTEST_INCLUDE_GTEST_GTEST_PROD_H_
+
+// When you need to test the private or protected members of a class,
+// use the FRIEND_TEST macro to declare your tests as friends of the
+// class.  For example:
+//
+// class MyClass {
+//  private:
+//   void MyMethod();
+//   FRIEND_TEST(MyClassTest, MyMethod);
+// };
+//
+// class MyClassTest : public testing::Test {
+//   // ...
+// };
+//
+// TEST_F(MyClassTest, MyMethod) {
+//   // Can call MyClass::MyMethod() here.
+// }
+
+#define FRIEND_TEST(test_case_name, test_name)\
+friend class test_case_name##_##test_name##_Test
+
+#endif  // GTEST_INCLUDE_GTEST_GTEST_PROD_H_
diff --git a/contrib/gtest-1.7.0/include/gtest/internal/gtest-death-test-internal.h b/contrib/gtest-1.7.0/include/gtest/internal/gtest-death-test-internal.h
new file mode 100644
index 0000000..2b3a78f
--- /dev/null
+++ b/contrib/gtest-1.7.0/include/gtest/internal/gtest-death-test-internal.h
@@ -0,0 +1,319 @@
+// Copyright 2005, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Authors: wan at google.com (Zhanyong Wan), eefacm at gmail.com (Sean Mcafee)
+//
+// The Google C++ Testing Framework (Google Test)
+//
+// This header file defines internal utilities needed for implementing
+// death tests.  They are subject to change without notice.
+
+#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_DEATH_TEST_INTERNAL_H_
+#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_DEATH_TEST_INTERNAL_H_
+
+#include "gtest/internal/gtest-internal.h"
+
+#include <stdio.h>
+
+namespace testing {
+namespace internal {
+
+GTEST_DECLARE_string_(internal_run_death_test);
+
+// Names of the flags (needed for parsing Google Test flags).
+const char kDeathTestStyleFlag[] = "death_test_style";
+const char kDeathTestUseFork[] = "death_test_use_fork";
+const char kInternalRunDeathTestFlag[] = "internal_run_death_test";
+
+#if GTEST_HAS_DEATH_TEST
+
+// DeathTest is a class that hides much of the complexity of the
+// GTEST_DEATH_TEST_ macro.  It is abstract; its static Create method
+// returns a concrete class that depends on the prevailing death test
+// style, as defined by the --gtest_death_test_style and/or
+// --gtest_internal_run_death_test flags.
+
+// In describing the results of death tests, these terms are used with
+// the corresponding definitions:
+//
+// exit status:  The integer exit information in the format specified
+//               by wait(2)
+// exit code:    The integer code passed to exit(3), _exit(2), or
+//               returned from main()
+class GTEST_API_ DeathTest {
+ public:
+  // Create returns false if there was an error determining the
+  // appropriate action to take for the current death test; for example,
+  // if the gtest_death_test_style flag is set to an invalid value.
+  // The LastMessage method will return a more detailed message in that
+  // case.  Otherwise, the DeathTest pointer pointed to by the "test"
+  // argument is set.  If the death test should be skipped, the pointer
+  // is set to NULL; otherwise, it is set to the address of a new concrete
+  // DeathTest object that controls the execution of the current test.
+  static bool Create(const char* statement, const RE* regex,
+                     const char* file, int line, DeathTest** test);
+  DeathTest();
+  virtual ~DeathTest() { }
+
+  // A helper class that aborts a death test when it's deleted.
+  class ReturnSentinel {
+   public:
+    explicit ReturnSentinel(DeathTest* test) : test_(test) { }
+    ~ReturnSentinel() { test_->Abort(TEST_ENCOUNTERED_RETURN_STATEMENT); }
+   private:
+    DeathTest* const test_;
+    GTEST_DISALLOW_COPY_AND_ASSIGN_(ReturnSentinel);
+  } GTEST_ATTRIBUTE_UNUSED_;
+
+  // An enumeration of possible roles that may be taken when a death
+  // test is encountered.  EXECUTE means that the death test logic should
+  // be executed immediately.  OVERSEE means that the program should prepare
+  // the appropriate environment for a child process to execute the death
+  // test, then wait for it to complete.
+  enum TestRole { OVERSEE_TEST, EXECUTE_TEST };
+
+  // An enumeration of the three reasons that a test might be aborted.
+  enum AbortReason {
+    TEST_ENCOUNTERED_RETURN_STATEMENT,
+    TEST_THREW_EXCEPTION,
+    TEST_DID_NOT_DIE
+  };
+
+  // Assumes one of the above roles.
+  virtual TestRole AssumeRole() = 0;
+
+  // Waits for the death test to finish and returns its status.
+  virtual int Wait() = 0;
+
+  // Returns true if the death test passed; that is, the test process
+  // exited during the test, its exit status matches a user-supplied
+  // predicate, and its stderr output matches a user-supplied regular
+  // expression.
+  // The user-supplied predicate may be a macro expression rather
+  // than a function pointer or functor, or else Wait and Passed could
+  // be combined.
+  virtual bool Passed(bool exit_status_ok) = 0;
+
+  // Signals that the death test did not die as expected.
+  virtual void Abort(AbortReason reason) = 0;
+
+  // Returns a human-readable outcome message regarding the outcome of
+  // the last death test.
+  static const char* LastMessage();
+
+  static void set_last_death_test_message(const std::string& message);
+
+ private:
+  // A string containing a description of the outcome of the last death test.
+  static std::string last_death_test_message_;
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(DeathTest);
+};
+
+// Factory interface for death tests.  May be mocked out for testing.
+class DeathTestFactory {
+ public:
+  virtual ~DeathTestFactory() { }
+  virtual bool Create(const char* statement, const RE* regex,
+                      const char* file, int line, DeathTest** test) = 0;
+};
+
+// A concrete DeathTestFactory implementation for normal use.
+class DefaultDeathTestFactory : public DeathTestFactory {
+ public:
+  virtual bool Create(const char* statement, const RE* regex,
+                      const char* file, int line, DeathTest** test);
+};
+
+// Returns true if exit_status describes a process that was terminated
+// by a signal, or exited normally with a nonzero exit code.
+GTEST_API_ bool ExitedUnsuccessfully(int exit_status);
+
+// Traps C++ exceptions escaping statement and reports them as test
+// failures. Note that trapping SEH exceptions is not implemented here.
+# if GTEST_HAS_EXCEPTIONS
+#  define GTEST_EXECUTE_DEATH_TEST_STATEMENT_(statement, death_test) \
+  try { \
+    GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \
+  } catch (const ::std::exception& gtest_exception) { \
+    fprintf(\
+        stderr, \
+        "\n%s: Caught std::exception-derived exception escaping the " \
+        "death test statement. Exception message: %s\n", \
+        ::testing::internal::FormatFileLocation(__FILE__, __LINE__).c_str(), \
+        gtest_exception.what()); \
+    fflush(stderr); \
+    death_test->Abort(::testing::internal::DeathTest::TEST_THREW_EXCEPTION); \
+  } catch (...) { \
+    death_test->Abort(::testing::internal::DeathTest::TEST_THREW_EXCEPTION); \
+  }
+
+# else
+#  define GTEST_EXECUTE_DEATH_TEST_STATEMENT_(statement, death_test) \
+  GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement)
+
+# endif
+
+// This macro is for implementing ASSERT_DEATH*, EXPECT_DEATH*,
+// ASSERT_EXIT*, and EXPECT_EXIT*.
+# define GTEST_DEATH_TEST_(statement, predicate, regex, fail) \
+  GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
+  if (::testing::internal::AlwaysTrue()) { \
+    const ::testing::internal::RE& gtest_regex = (regex); \
+    ::testing::internal::DeathTest* gtest_dt; \
+    if (!::testing::internal::DeathTest::Create(#statement, &gtest_regex, \
+        __FILE__, __LINE__, &gtest_dt)) { \
+      goto GTEST_CONCAT_TOKEN_(gtest_label_, __LINE__); \
+    } \
+    if (gtest_dt != NULL) { \
+      ::testing::internal::scoped_ptr< ::testing::internal::DeathTest> \
+          gtest_dt_ptr(gtest_dt); \
+      switch (gtest_dt->AssumeRole()) { \
+        case ::testing::internal::DeathTest::OVERSEE_TEST: \
+          if (!gtest_dt->Passed(predicate(gtest_dt->Wait()))) { \
+            goto GTEST_CONCAT_TOKEN_(gtest_label_, __LINE__); \
+          } \
+          break; \
+        case ::testing::internal::DeathTest::EXECUTE_TEST: { \
+          ::testing::internal::DeathTest::ReturnSentinel \
+              gtest_sentinel(gtest_dt); \
+          GTEST_EXECUTE_DEATH_TEST_STATEMENT_(statement, gtest_dt); \
+          gtest_dt->Abort(::testing::internal::DeathTest::TEST_DID_NOT_DIE); \
+          break; \
+        } \
+        default: \
+          break; \
+      } \
+    } \
+  } else \
+    GTEST_CONCAT_TOKEN_(gtest_label_, __LINE__): \
+      fail(::testing::internal::DeathTest::LastMessage())
+// The symbol "fail" here expands to something into which a message
+// can be streamed.
+
+// This macro is for implementing ASSERT/EXPECT_DEBUG_DEATH when compiled in
+// NDEBUG mode. In this case we need the statements to be executed, the regex is
+// ignored, and the macro must accept a streamed message even though the message
+// is never printed.
+# define GTEST_EXECUTE_STATEMENT_(statement, regex) \
+  GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
+  if (::testing::internal::AlwaysTrue()) { \
+     GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \
+  } else \
+    ::testing::Message()
+
+// A class representing the parsed contents of the
+// --gtest_internal_run_death_test flag, as it existed when
+// RUN_ALL_TESTS was called.
+class InternalRunDeathTestFlag {
+ public:
+  InternalRunDeathTestFlag(const std::string& a_file,
+                           int a_line,
+                           int an_index,
+                           int a_write_fd)
+      : file_(a_file), line_(a_line), index_(an_index),
+        write_fd_(a_write_fd) {}
+
+  ~InternalRunDeathTestFlag() {
+    if (write_fd_ >= 0)
+      posix::Close(write_fd_);
+  }
+
+  const std::string& file() const { return file_; }
+  int line() const { return line_; }
+  int index() const { return index_; }
+  int write_fd() const { return write_fd_; }
+
+ private:
+  std::string file_;
+  int line_;
+  int index_;
+  int write_fd_;
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(InternalRunDeathTestFlag);
+};
+
+// Returns a newly created InternalRunDeathTestFlag object with fields
+// initialized from the GTEST_FLAG(internal_run_death_test) flag if
+// the flag is specified; otherwise returns NULL.
+InternalRunDeathTestFlag* ParseInternalRunDeathTestFlag();
+
+#else  // GTEST_HAS_DEATH_TEST
+
+// This macro is used for implementing macros such as
+// EXPECT_DEATH_IF_SUPPORTED and ASSERT_DEATH_IF_SUPPORTED on systems where
+// death tests are not supported. Those macros must compile on such systems
+// iff EXPECT_DEATH and ASSERT_DEATH compile with the same parameters on
+// systems that support death tests. This allows one to write such a macro
+// on a system that does not support death tests and be sure that it will
+// compile on a death-test supporting system.
+//
+// Parameters:
+//   statement -  A statement that a macro such as EXPECT_DEATH would test
+//                for program termination. This macro has to make sure this
+//                statement is compiled but not executed, to ensure that
+//                EXPECT_DEATH_IF_SUPPORTED compiles with a certain
+//                parameter iff EXPECT_DEATH compiles with it.
+//   regex     -  A regex that a macro such as EXPECT_DEATH would use to test
+//                the output of statement.  This parameter has to be
+//                compiled but not evaluated by this macro, to ensure that
+//                this macro only accepts expressions that a macro such as
+//                EXPECT_DEATH would accept.
+//   terminator - Must be an empty statement for EXPECT_DEATH_IF_SUPPORTED
+//                and a return statement for ASSERT_DEATH_IF_SUPPORTED.
+//                This ensures that ASSERT_DEATH_IF_SUPPORTED will not
+//                compile inside functions where ASSERT_DEATH doesn't
+//                compile.
+//
+//  The branch that has an always false condition is used to ensure that
+//  statement and regex are compiled (and thus syntactically correct) but
+//  never executed. The unreachable code macro protects the terminator
+//  statement from generating an 'unreachable code' warning in case
+//  statement unconditionally returns or throws. The Message constructor at
+//  the end allows the syntax of streaming additional messages into the
+//  macro, for compilational compatibility with EXPECT_DEATH/ASSERT_DEATH.
+# define GTEST_UNSUPPORTED_DEATH_TEST_(statement, regex, terminator) \
+    GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
+    if (::testing::internal::AlwaysTrue()) { \
+      GTEST_LOG_(WARNING) \
+          << "Death tests are not supported on this platform.\n" \
+          << "Statement '" #statement "' cannot be verified."; \
+    } else if (::testing::internal::AlwaysFalse()) { \
+      ::testing::internal::RE::PartialMatch(".*", (regex)); \
+      GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \
+      terminator; \
+    } else \
+      ::testing::Message()
+
+#endif  // GTEST_HAS_DEATH_TEST
+
+}  // namespace internal
+}  // namespace testing
+
+#endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_DEATH_TEST_INTERNAL_H_
diff --git a/contrib/gtest-1.7.0/include/gtest/internal/gtest-filepath.h b/contrib/gtest-1.7.0/include/gtest/internal/gtest-filepath.h
new file mode 100644
index 0000000..7a13b4b
--- /dev/null
+++ b/contrib/gtest-1.7.0/include/gtest/internal/gtest-filepath.h
@@ -0,0 +1,206 @@
+// Copyright 2008, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: keith.ray at gmail.com (Keith Ray)
+//
+// Google Test filepath utilities
+//
+// This header file declares classes and functions used internally by
+// Google Test.  They are subject to change without notice.
+//
+// This file is #included in <gtest/internal/gtest-internal.h>.
+// Do not include this header file separately!
+
+#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_FILEPATH_H_
+#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_FILEPATH_H_
+
+#include "gtest/internal/gtest-string.h"
+
+namespace testing {
+namespace internal {
+
+// FilePath - a class for file and directory pathname manipulation which
+// handles platform-specific conventions (like the pathname separator).
+// Used for helper functions for naming files in a directory for xml output.
+// Except for Set methods, all methods are const or static, which provides an
+// "immutable value object" -- useful for peace of mind.
+// A FilePath with a value ending in a path separator ("like/this/") represents
+// a directory, otherwise it is assumed to represent a file. In either case,
+// it may or may not represent an actual file or directory in the file system.
+// Names are NOT checked for syntax correctness -- no checking for illegal
+// characters, malformed paths, etc.
+
+class GTEST_API_ FilePath {
+ public:
+  FilePath() : pathname_("") { }
+  FilePath(const FilePath& rhs) : pathname_(rhs.pathname_) { }
+
+  explicit FilePath(const std::string& pathname) : pathname_(pathname) {
+    Normalize();
+  }
+
+  FilePath& operator=(const FilePath& rhs) {
+    Set(rhs);
+    return *this;
+  }
+
+  void Set(const FilePath& rhs) {
+    pathname_ = rhs.pathname_;
+  }
+
+  const std::string& string() const { return pathname_; }
+  const char* c_str() const { return pathname_.c_str(); }
+
+  // Returns the current working directory, or "" if unsuccessful.
+  static FilePath GetCurrentDir();
+
+  // Given directory = "dir", base_name = "test", number = 0,
+  // extension = "xml", returns "dir/test.xml". If number is greater
+  // than zero (e.g., 12), returns "dir/test_12.xml".
+  // On Windows platform, uses \ as the separator rather than /.
+  static FilePath MakeFileName(const FilePath& directory,
+                               const FilePath& base_name,
+                               int number,
+                               const char* extension);
+
+  // Given directory = "dir", relative_path = "test.xml",
+  // returns "dir/test.xml".
+  // On Windows, uses \ as the separator rather than /.
+  static FilePath ConcatPaths(const FilePath& directory,
+                              const FilePath& relative_path);
+
+  // Returns a pathname for a file that does not currently exist. The pathname
+  // will be directory/base_name.extension or
+  // directory/base_name_<number>.extension if directory/base_name.extension
+  // already exists. The number will be incremented until a pathname is found
+  // that does not already exist.
+  // Examples: 'dir/foo_test.xml' or 'dir/foo_test_1.xml'.
+  // There could be a race condition if two or more processes are calling this
+  // function at the same time -- they could both pick the same filename.
+  static FilePath GenerateUniqueFileName(const FilePath& directory,
+                                         const FilePath& base_name,
+                                         const char* extension);
+
+  // Returns true iff the path is "".
+  bool IsEmpty() const { return pathname_.empty(); }
+
+  // If input name has a trailing separator character, removes it and returns
+  // the name, otherwise return the name string unmodified.
+  // On Windows platform, uses \ as the separator, other platforms use /.
+  FilePath RemoveTrailingPathSeparator() const;
+
+  // Returns a copy of the FilePath with the directory part removed.
+  // Example: FilePath("path/to/file").RemoveDirectoryName() returns
+  // FilePath("file"). If there is no directory part ("just_a_file"), it returns
+  // the FilePath unmodified. If there is no file part ("just_a_dir/") it
+  // returns an empty FilePath ("").
+  // On Windows platform, '\' is the path separator, otherwise it is '/'.
+  FilePath RemoveDirectoryName() const;
+
+  // RemoveFileName returns the directory path with the filename removed.
+  // Example: FilePath("path/to/file").RemoveFileName() returns "path/to/".
+  // If the FilePath is "a_file" or "/a_file", RemoveFileName returns
+  // FilePath("./") or, on Windows, FilePath(".\\"). If the filepath does
+  // not have a file, like "just/a/dir/", it returns the FilePath unmodified.
+  // On Windows platform, '\' is the path separator, otherwise it is '/'.
+  FilePath RemoveFileName() const;
+
+  // Returns a copy of the FilePath with the case-insensitive extension removed.
+  // Example: FilePath("dir/file.exe").RemoveExtension("EXE") returns
+  // FilePath("dir/file"). If a case-insensitive extension is not
+  // found, returns a copy of the original FilePath.
+  FilePath RemoveExtension(const char* extension) const;
+
+  // Creates directories so that path exists. Returns true if successful or if
+  // the directories already exist; returns false if unable to create
+  // directories for any reason. Will also return false if the FilePath does
+  // not represent a directory (that is, it doesn't end with a path separator).
+  bool CreateDirectoriesRecursively() const;
+
+  // Create the directory so that path exists. Returns true if successful or
+  // if the directory already exists; returns false if unable to create the
+  // directory for any reason, including if the parent directory does not
+  // exist. Not named "CreateDirectory" because that's a macro on Windows.
+  bool CreateFolder() const;
+
+  // Returns true if FilePath describes something in the file-system,
+  // either a file, directory, or whatever, and that something exists.
+  bool FileOrDirectoryExists() const;
+
+  // Returns true if pathname describes a directory in the file-system
+  // that exists.
+  bool DirectoryExists() const;
+
+  // Returns true if FilePath ends with a path separator, which indicates that
+  // it is intended to represent a directory. Returns false otherwise.
+  // This does NOT check that a directory (or file) actually exists.
+  bool IsDirectory() const;
+
+  // Returns true if pathname describes a root directory. (Windows has one
+  // root directory per disk drive.)
+  bool IsRootDirectory() const;
+
+  // Returns true if pathname describes an absolute path.
+  bool IsAbsolutePath() const;
+
+ private:
+  // Replaces multiple consecutive separators with a single separator.
+  // For example, "bar///foo" becomes "bar/foo". Does not eliminate other
+  // redundancies that might be in a pathname involving "." or "..".
+  //
+  // A pathname with multiple consecutive separators may occur either through
+  // user error or as a result of some scripts or APIs that generate a pathname
+  // with a trailing separator. On other platforms the same API or script
+  // may NOT generate a pathname with a trailing "/". Then elsewhere that
+  // pathname may have another "/" and pathname components added to it,
+  // without checking for the separator already being there.
+  // The script language and operating system may allow paths like "foo//bar"
+  // but some of the functions in FilePath will not handle that correctly. In
+  // particular, RemoveTrailingPathSeparator() only removes one separator, and
+  // it is called in CreateDirectoriesRecursively() assuming that it will change
+  // a pathname from directory syntax (trailing separator) to filename syntax.
+  //
+  // On Windows this method also replaces the alternate path separator '/' with
+  // the primary path separator '\\', so that for example "bar\\/\\foo" becomes
+  // "bar\\foo".
+
+  void Normalize();
+
+  // Returns a pointer to the last occurence of a valid path separator in
+  // the FilePath. On Windows, for example, both '/' and '\' are valid path
+  // separators. Returns NULL if no path separator was found.
+  const char* FindLastPathSeparator() const;
+
+  std::string pathname_;
+};  // class FilePath
+
+}  // namespace internal
+}  // namespace testing
+
+#endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_FILEPATH_H_
diff --git a/contrib/gtest-1.7.0/include/gtest/internal/gtest-internal.h b/contrib/gtest-1.7.0/include/gtest/internal/gtest-internal.h
new file mode 100644
index 0000000..0dcc3a3
--- /dev/null
+++ b/contrib/gtest-1.7.0/include/gtest/internal/gtest-internal.h
@@ -0,0 +1,1158 @@
+// Copyright 2005, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Authors: wan at google.com (Zhanyong Wan), eefacm at gmail.com (Sean Mcafee)
+//
+// The Google C++ Testing Framework (Google Test)
+//
+// This header file declares functions and macros used internally by
+// Google Test.  They are subject to change without notice.
+
+#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_INTERNAL_H_
+#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_INTERNAL_H_
+
+#include "gtest/internal/gtest-port.h"
+
+#if GTEST_OS_LINUX
+# include <stdlib.h>
+# include <sys/types.h>
+# include <sys/wait.h>
+# include <unistd.h>
+#endif  // GTEST_OS_LINUX
+
+#if GTEST_HAS_EXCEPTIONS
+# include <stdexcept>
+#endif
+
+#include <ctype.h>
+#include <float.h>
+#include <string.h>
+#include <iomanip>
+#include <limits>
+#include <set>
+
+#include "gtest/gtest-message.h"
+#include "gtest/internal/gtest-string.h"
+#include "gtest/internal/gtest-filepath.h"
+#include "gtest/internal/gtest-type-util.h"
+
+// Due to C++ preprocessor weirdness, we need double indirection to
+// concatenate two tokens when one of them is __LINE__.  Writing
+//
+//   foo ## __LINE__
+//
+// will result in the token foo__LINE__, instead of foo followed by
+// the current line number.  For more details, see
+// http://www.parashift.com/c++-faq-lite/misc-technical-issues.html#faq-39.6
+#define GTEST_CONCAT_TOKEN_(foo, bar) GTEST_CONCAT_TOKEN_IMPL_(foo, bar)
+#define GTEST_CONCAT_TOKEN_IMPL_(foo, bar) foo ## bar
+
+class ProtocolMessage;
+namespace proto2 { class Message; }
+
+namespace testing {
+
+// Forward declarations.
+
+class AssertionResult;                 // Result of an assertion.
+class Message;                         // Represents a failure message.
+class Test;                            // Represents a test.
+class TestInfo;                        // Information about a test.
+class TestPartResult;                  // Result of a test part.
+class UnitTest;                        // A collection of test cases.
+
+template <typename T>
+::std::string PrintToString(const T& value);
+
+namespace internal {
+
+struct TraceInfo;                      // Information about a trace point.
+class ScopedTrace;                     // Implements scoped trace.
+class TestInfoImpl;                    // Opaque implementation of TestInfo
+class UnitTestImpl;                    // Opaque implementation of UnitTest
+
+// How many times InitGoogleTest() has been called.
+GTEST_API_ extern int g_init_gtest_count;
+
+// The text used in failure messages to indicate the start of the
+// stack trace.
+GTEST_API_ extern const char kStackTraceMarker[];
+
+// Two overloaded helpers for checking at compile time whether an
+// expression is a null pointer literal (i.e. NULL or any 0-valued
+// compile-time integral constant).  Their return values have
+// different sizes, so we can use sizeof() to test which version is
+// picked by the compiler.  These helpers have no implementations, as
+// we only need their signatures.
+//
+// Given IsNullLiteralHelper(x), the compiler will pick the first
+// version if x can be implicitly converted to Secret*, and pick the
+// second version otherwise.  Since Secret is a secret and incomplete
+// type, the only expression a user can write that has type Secret* is
+// a null pointer literal.  Therefore, we know that x is a null
+// pointer literal if and only if the first version is picked by the
+// compiler.
+char IsNullLiteralHelper(Secret* p);
+char (&IsNullLiteralHelper(...))[2];  // NOLINT
+
+// A compile-time bool constant that is true if and only if x is a
+// null pointer literal (i.e. NULL or any 0-valued compile-time
+// integral constant).
+#ifdef GTEST_ELLIPSIS_NEEDS_POD_
+// We lose support for NULL detection where the compiler doesn't like
+// passing non-POD classes through ellipsis (...).
+# define GTEST_IS_NULL_LITERAL_(x) false
+#else
+# define GTEST_IS_NULL_LITERAL_(x) \
+    (sizeof(::testing::internal::IsNullLiteralHelper(x)) == 1)
+#endif  // GTEST_ELLIPSIS_NEEDS_POD_
+
+// Appends the user-supplied message to the Google-Test-generated message.
+GTEST_API_ std::string AppendUserMessage(
+    const std::string& gtest_msg, const Message& user_msg);
+
+#if GTEST_HAS_EXCEPTIONS
+
+// This exception is thrown by (and only by) a failed Google Test
+// assertion when GTEST_FLAG(throw_on_failure) is true (if exceptions
+// are enabled).  We derive it from std::runtime_error, which is for
+// errors presumably detectable only at run time.  Since
+// std::runtime_error inherits from std::exception, many testing
+// frameworks know how to extract and print the message inside it.
+class GTEST_API_ GoogleTestFailureException : public ::std::runtime_error {
+ public:
+  explicit GoogleTestFailureException(const TestPartResult& failure);
+};
+
+#endif  // GTEST_HAS_EXCEPTIONS
+
+// A helper class for creating scoped traces in user programs.
+class GTEST_API_ ScopedTrace {
+ public:
+  // The c'tor pushes the given source file location and message onto
+  // a trace stack maintained by Google Test.
+  ScopedTrace(const char* file, int line, const Message& message);
+
+  // The d'tor pops the info pushed by the c'tor.
+  //
+  // Note that the d'tor is not virtual in order to be efficient.
+  // Don't inherit from ScopedTrace!
+  ~ScopedTrace();
+
+ private:
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(ScopedTrace);
+} GTEST_ATTRIBUTE_UNUSED_;  // A ScopedTrace object does its job in its
+                            // c'tor and d'tor.  Therefore it doesn't
+                            // need to be used otherwise.
+
+// Constructs and returns the message for an equality assertion
+// (e.g. ASSERT_EQ, EXPECT_STREQ, etc) failure.
+//
+// The first four parameters are the expressions used in the assertion
+// and their values, as strings.  For example, for ASSERT_EQ(foo, bar)
+// where foo is 5 and bar is 6, we have:
+//
+//   expected_expression: "foo"
+//   actual_expression:   "bar"
+//   expected_value:      "5"
+//   actual_value:        "6"
+//
+// The ignoring_case parameter is true iff the assertion is a
+// *_STRCASEEQ*.  When it's true, the string " (ignoring case)" will
+// be inserted into the message.
+GTEST_API_ AssertionResult EqFailure(const char* expected_expression,
+                                     const char* actual_expression,
+                                     const std::string& expected_value,
+                                     const std::string& actual_value,
+                                     bool ignoring_case);
+
+// Constructs a failure message for Boolean assertions such as EXPECT_TRUE.
+GTEST_API_ std::string GetBoolAssertionFailureMessage(
+    const AssertionResult& assertion_result,
+    const char* expression_text,
+    const char* actual_predicate_value,
+    const char* expected_predicate_value);
+
+// This template class represents an IEEE floating-point number
+// (either single-precision or double-precision, depending on the
+// template parameters).
+//
+// The purpose of this class is to do more sophisticated number
+// comparison.  (Due to round-off error, etc, it's very unlikely that
+// two floating-points will be equal exactly.  Hence a naive
+// comparison by the == operation often doesn't work.)
+//
+// Format of IEEE floating-point:
+//
+//   The most-significant bit being the leftmost, an IEEE
+//   floating-point looks like
+//
+//     sign_bit exponent_bits fraction_bits
+//
+//   Here, sign_bit is a single bit that designates the sign of the
+//   number.
+//
+//   For float, there are 8 exponent bits and 23 fraction bits.
+//
+//   For double, there are 11 exponent bits and 52 fraction bits.
+//
+//   More details can be found at
+//   http://en.wikipedia.org/wiki/IEEE_floating-point_standard.
+//
+// Template parameter:
+//
+//   RawType: the raw floating-point type (either float or double)
+template <typename RawType>
+class FloatingPoint {
+ public:
+  // Defines the unsigned integer type that has the same size as the
+  // floating point number.
+  typedef typename TypeWithSize<sizeof(RawType)>::UInt Bits;
+
+  // Constants.
+
+  // # of bits in a number.
+  static const size_t kBitCount = 8*sizeof(RawType);
+
+  // # of fraction bits in a number.
+  static const size_t kFractionBitCount =
+    std::numeric_limits<RawType>::digits - 1;
+
+  // # of exponent bits in a number.
+  static const size_t kExponentBitCount = kBitCount - 1 - kFractionBitCount;
+
+  // The mask for the sign bit.
+  static const Bits kSignBitMask = static_cast<Bits>(1) << (kBitCount - 1);
+
+  // The mask for the fraction bits.
+  static const Bits kFractionBitMask =
+    ~static_cast<Bits>(0) >> (kExponentBitCount + 1);
+
+  // The mask for the exponent bits.
+  static const Bits kExponentBitMask = ~(kSignBitMask | kFractionBitMask);
+
+  // How many ULP's (Units in the Last Place) we want to tolerate when
+  // comparing two numbers.  The larger the value, the more error we
+  // allow.  A 0 value means that two numbers must be exactly the same
+  // to be considered equal.
+  //
+  // The maximum error of a single floating-point operation is 0.5
+  // units in the last place.  On Intel CPU's, all floating-point
+  // calculations are done with 80-bit precision, while double has 64
+  // bits.  Therefore, 4 should be enough for ordinary use.
+  //
+  // See the following article for more details on ULP:
+  // http://randomascii.wordpress.com/2012/02/25/comparing-floating-point-numbers-2012-edition/
+  static const size_t kMaxUlps = 4;
+
+  // Constructs a FloatingPoint from a raw floating-point number.
+  //
+  // On an Intel CPU, passing a non-normalized NAN (Not a Number)
+  // around may change its bits, although the new value is guaranteed
+  // to be also a NAN.  Therefore, don't expect this constructor to
+  // preserve the bits in x when x is a NAN.
+  explicit FloatingPoint(const RawType& x) { u_.value_ = x; }
+
+  // Static methods
+
+  // Reinterprets a bit pattern as a floating-point number.
+  //
+  // This function is needed to test the AlmostEquals() method.
+  static RawType ReinterpretBits(const Bits bits) {
+    FloatingPoint fp(0);
+    fp.u_.bits_ = bits;
+    return fp.u_.value_;
+  }
+
+  // Returns the floating-point number that represent positive infinity.
+  static RawType Infinity() {
+    return ReinterpretBits(kExponentBitMask);
+  }
+
+  // Returns the maximum representable finite floating-point number.
+  static RawType Max();
+
+  // Non-static methods
+
+  // Returns the bits that represents this number.
+  const Bits &bits() const { return u_.bits_; }
+
+  // Returns the exponent bits of this number.
+  Bits exponent_bits() const { return kExponentBitMask & u_.bits_; }
+
+  // Returns the fraction bits of this number.
+  Bits fraction_bits() const { return kFractionBitMask & u_.bits_; }
+
+  // Returns the sign bit of this number.
+  Bits sign_bit() const { return kSignBitMask & u_.bits_; }
+
+  // Returns true iff this is NAN (not a number).
+  bool is_nan() const {
+    // It's a NAN if the exponent bits are all ones and the fraction
+    // bits are not entirely zeros.
+    return (exponent_bits() == kExponentBitMask) && (fraction_bits() != 0);
+  }
+
+  // Returns true iff this number is at most kMaxUlps ULP's away from
+  // rhs.  In particular, this function:
+  //
+  //   - returns false if either number is (or both are) NAN.
+  //   - treats really large numbers as almost equal to infinity.
+  //   - thinks +0.0 and -0.0 are 0 DLP's apart.
+  bool AlmostEquals(const FloatingPoint& rhs) const {
+    // The IEEE standard says that any comparison operation involving
+    // a NAN must return false.
+    if (is_nan() || rhs.is_nan()) return false;
+
+    return DistanceBetweenSignAndMagnitudeNumbers(u_.bits_, rhs.u_.bits_)
+        <= kMaxUlps;
+  }
+
+ private:
+  // The data type used to store the actual floating-point number.
+  union FloatingPointUnion {
+    RawType value_;  // The raw floating-point number.
+    Bits bits_;      // The bits that represent the number.
+  };
+
+  // Converts an integer from the sign-and-magnitude representation to
+  // the biased representation.  More precisely, let N be 2 to the
+  // power of (kBitCount - 1), an integer x is represented by the
+  // unsigned number x + N.
+  //
+  // For instance,
+  //
+  //   -N + 1 (the most negative number representable using
+  //          sign-and-magnitude) is represented by 1;
+  //   0      is represented by N; and
+  //   N - 1  (the biggest number representable using
+  //          sign-and-magnitude) is represented by 2N - 1.
+  //
+  // Read http://en.wikipedia.org/wiki/Signed_number_representations
+  // for more details on signed number representations.
+  static Bits SignAndMagnitudeToBiased(const Bits &sam) {
+    if (kSignBitMask & sam) {
+      // sam represents a negative number.
+      return ~sam + 1;
+    } else {
+      // sam represents a positive number.
+      return kSignBitMask | sam;
+    }
+  }
+
+  // Given two numbers in the sign-and-magnitude representation,
+  // returns the distance between them as an unsigned number.
+  static Bits DistanceBetweenSignAndMagnitudeNumbers(const Bits &sam1,
+                                                     const Bits &sam2) {
+    const Bits biased1 = SignAndMagnitudeToBiased(sam1);
+    const Bits biased2 = SignAndMagnitudeToBiased(sam2);
+    return (biased1 >= biased2) ? (biased1 - biased2) : (biased2 - biased1);
+  }
+
+  FloatingPointUnion u_;
+};
+
+// We cannot use std::numeric_limits<T>::max() as it clashes with the max()
+// macro defined by <windows.h>.
+template <>
+inline float FloatingPoint<float>::Max() { return FLT_MAX; }
+template <>
+inline double FloatingPoint<double>::Max() { return DBL_MAX; }
+
+// Typedefs the instances of the FloatingPoint template class that we
+// care to use.
+typedef FloatingPoint<float> Float;
+typedef FloatingPoint<double> Double;
+
+// In order to catch the mistake of putting tests that use different
+// test fixture classes in the same test case, we need to assign
+// unique IDs to fixture classes and compare them.  The TypeId type is
+// used to hold such IDs.  The user should treat TypeId as an opaque
+// type: the only operation allowed on TypeId values is to compare
+// them for equality using the == operator.
+typedef const void* TypeId;
+
+template <typename T>
+class TypeIdHelper {
+ public:
+  // dummy_ must not have a const type.  Otherwise an overly eager
+  // compiler (e.g. MSVC 7.1 & 8.0) may try to merge
+  // TypeIdHelper<T>::dummy_ for different Ts as an "optimization".
+  static bool dummy_;
+};
+
+template <typename T>
+bool TypeIdHelper<T>::dummy_ = false;
+
+// GetTypeId<T>() returns the ID of type T.  Different values will be
+// returned for different types.  Calling the function twice with the
+// same type argument is guaranteed to return the same ID.
+template <typename T>
+TypeId GetTypeId() {
+  // The compiler is required to allocate a different
+  // TypeIdHelper<T>::dummy_ variable for each T used to instantiate
+  // the template.  Therefore, the address of dummy_ is guaranteed to
+  // be unique.
+  return &(TypeIdHelper<T>::dummy_);
+}
+
+// Returns the type ID of ::testing::Test.  Always call this instead
+// of GetTypeId< ::testing::Test>() to get the type ID of
+// ::testing::Test, as the latter may give the wrong result due to a
+// suspected linker bug when compiling Google Test as a Mac OS X
+// framework.
+GTEST_API_ TypeId GetTestTypeId();
+
+// Defines the abstract factory interface that creates instances
+// of a Test object.
+class TestFactoryBase {
+ public:
+  virtual ~TestFactoryBase() {}
+
+  // Creates a test instance to run. The instance is both created and destroyed
+  // within TestInfoImpl::Run()
+  virtual Test* CreateTest() = 0;
+
+ protected:
+  TestFactoryBase() {}
+
+ private:
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(TestFactoryBase);
+};
+
+// This class provides implementation of TeastFactoryBase interface.
+// It is used in TEST and TEST_F macros.
+template <class TestClass>
+class TestFactoryImpl : public TestFactoryBase {
+ public:
+  virtual Test* CreateTest() { return new TestClass; }
+};
+
+#if GTEST_OS_WINDOWS
+
+// Predicate-formatters for implementing the HRESULT checking macros
+// {ASSERT|EXPECT}_HRESULT_{SUCCEEDED|FAILED}
+// We pass a long instead of HRESULT to avoid causing an
+// include dependency for the HRESULT type.
+GTEST_API_ AssertionResult IsHRESULTSuccess(const char* expr,
+                                            long hr);  // NOLINT
+GTEST_API_ AssertionResult IsHRESULTFailure(const char* expr,
+                                            long hr);  // NOLINT
+
+#endif  // GTEST_OS_WINDOWS
+
+// Types of SetUpTestCase() and TearDownTestCase() functions.
+typedef void (*SetUpTestCaseFunc)();
+typedef void (*TearDownTestCaseFunc)();
+
+// Creates a new TestInfo object and registers it with Google Test;
+// returns the created object.
+//
+// Arguments:
+//
+//   test_case_name:   name of the test case
+//   name:             name of the test
+//   type_param        the name of the test's type parameter, or NULL if
+//                     this is not a typed or a type-parameterized test.
+//   value_param       text representation of the test's value parameter,
+//                     or NULL if this is not a type-parameterized test.
+//   fixture_class_id: ID of the test fixture class
+//   set_up_tc:        pointer to the function that sets up the test case
+//   tear_down_tc:     pointer to the function that tears down the test case
+//   factory:          pointer to the factory that creates a test object.
+//                     The newly created TestInfo instance will assume
+//                     ownership of the factory object.
+GTEST_API_ TestInfo* MakeAndRegisterTestInfo(
+    const char* test_case_name,
+    const char* name,
+    const char* type_param,
+    const char* value_param,
+    TypeId fixture_class_id,
+    SetUpTestCaseFunc set_up_tc,
+    TearDownTestCaseFunc tear_down_tc,
+    TestFactoryBase* factory);
+
+// If *pstr starts with the given prefix, modifies *pstr to be right
+// past the prefix and returns true; otherwise leaves *pstr unchanged
+// and returns false.  None of pstr, *pstr, and prefix can be NULL.
+GTEST_API_ bool SkipPrefix(const char* prefix, const char** pstr);
+
+#if GTEST_HAS_TYPED_TEST || GTEST_HAS_TYPED_TEST_P
+
+// State of the definition of a type-parameterized test case.
+class GTEST_API_ TypedTestCasePState {
+ public:
+  TypedTestCasePState() : registered_(false) {}
+
+  // Adds the given test name to defined_test_names_ and return true
+  // if the test case hasn't been registered; otherwise aborts the
+  // program.
+  bool AddTestName(const char* file, int line, const char* case_name,
+                   const char* test_name) {
+    if (registered_) {
+      fprintf(stderr, "%s Test %s must be defined before "
+              "REGISTER_TYPED_TEST_CASE_P(%s, ...).\n",
+              FormatFileLocation(file, line).c_str(), test_name, case_name);
+      fflush(stderr);
+      posix::Abort();
+    }
+    defined_test_names_.insert(test_name);
+    return true;
+  }
+
+  // Verifies that registered_tests match the test names in
+  // defined_test_names_; returns registered_tests if successful, or
+  // aborts the program otherwise.
+  const char* VerifyRegisteredTestNames(
+      const char* file, int line, const char* registered_tests);
+
+ private:
+  bool registered_;
+  ::std::set<const char*> defined_test_names_;
+};
+
+// Skips to the first non-space char after the first comma in 'str';
+// returns NULL if no comma is found in 'str'.
+inline const char* SkipComma(const char* str) {
+  const char* comma = strchr(str, ',');
+  if (comma == NULL) {
+    return NULL;
+  }
+  while (IsSpace(*(++comma))) {}
+  return comma;
+}
+
+// Returns the prefix of 'str' before the first comma in it; returns
+// the entire string if it contains no comma.
+inline std::string GetPrefixUntilComma(const char* str) {
+  const char* comma = strchr(str, ',');
+  return comma == NULL ? str : std::string(str, comma);
+}
+
+// TypeParameterizedTest<Fixture, TestSel, Types>::Register()
+// registers a list of type-parameterized tests with Google Test.  The
+// return value is insignificant - we just need to return something
+// such that we can call this function in a namespace scope.
+//
+// Implementation note: The GTEST_TEMPLATE_ macro declares a template
+// template parameter.  It's defined in gtest-type-util.h.
+template <GTEST_TEMPLATE_ Fixture, class TestSel, typename Types>
+class TypeParameterizedTest {
+ public:
+  // 'index' is the index of the test in the type list 'Types'
+  // specified in INSTANTIATE_TYPED_TEST_CASE_P(Prefix, TestCase,
+  // Types).  Valid values for 'index' are [0, N - 1] where N is the
+  // length of Types.
+  static bool Register(const char* prefix, const char* case_name,
+                       const char* test_names, int index) {
+    typedef typename Types::Head Type;
+    typedef Fixture<Type> FixtureClass;
+    typedef typename GTEST_BIND_(TestSel, Type) TestClass;
+
+    // First, registers the first type-parameterized test in the type
+    // list.
+    MakeAndRegisterTestInfo(
+        (std::string(prefix) + (prefix[0] == '\0' ? "" : "/") + case_name + "/"
+         + StreamableToString(index)).c_str(),
+        GetPrefixUntilComma(test_names).c_str(),
+        GetTypeName<Type>().c_str(),
+        NULL,  // No value parameter.
+        GetTypeId<FixtureClass>(),
+        TestClass::SetUpTestCase,
+        TestClass::TearDownTestCase,
+        new TestFactoryImpl<TestClass>);
+
+    // Next, recurses (at compile time) with the tail of the type list.
+    return TypeParameterizedTest<Fixture, TestSel, typename Types::Tail>
+        ::Register(prefix, case_name, test_names, index + 1);
+  }
+};
+
+// The base case for the compile time recursion.
+template <GTEST_TEMPLATE_ Fixture, class TestSel>
+class TypeParameterizedTest<Fixture, TestSel, Types0> {
+ public:
+  static bool Register(const char* /*prefix*/, const char* /*case_name*/,
+                       const char* /*test_names*/, int /*index*/) {
+    return true;
+  }
+};
+
+// TypeParameterizedTestCase<Fixture, Tests, Types>::Register()
+// registers *all combinations* of 'Tests' and 'Types' with Google
+// Test.  The return value is insignificant - we just need to return
+// something such that we can call this function in a namespace scope.
+template <GTEST_TEMPLATE_ Fixture, typename Tests, typename Types>
+class TypeParameterizedTestCase {
+ public:
+  static bool Register(const char* prefix, const char* case_name,
+                       const char* test_names) {
+    typedef typename Tests::Head Head;
+
+    // First, register the first test in 'Test' for each type in 'Types'.
+    TypeParameterizedTest<Fixture, Head, Types>::Register(
+        prefix, case_name, test_names, 0);
+
+    // Next, recurses (at compile time) with the tail of the test list.
+    return TypeParameterizedTestCase<Fixture, typename Tests::Tail, Types>
+        ::Register(prefix, case_name, SkipComma(test_names));
+  }
+};
+
+// The base case for the compile time recursion.
+template <GTEST_TEMPLATE_ Fixture, typename Types>
+class TypeParameterizedTestCase<Fixture, Templates0, Types> {
+ public:
+  static bool Register(const char* /*prefix*/, const char* /*case_name*/,
+                       const char* /*test_names*/) {
+    return true;
+  }
+};
+
+#endif  // GTEST_HAS_TYPED_TEST || GTEST_HAS_TYPED_TEST_P
+
+// Returns the current OS stack trace as an std::string.
+//
+// The maximum number of stack frames to be included is specified by
+// the gtest_stack_trace_depth flag.  The skip_count parameter
+// specifies the number of top frames to be skipped, which doesn't
+// count against the number of frames to be included.
+//
+// For example, if Foo() calls Bar(), which in turn calls
+// GetCurrentOsStackTraceExceptTop(..., 1), Foo() will be included in
+// the trace but Bar() and GetCurrentOsStackTraceExceptTop() won't.
+GTEST_API_ std::string GetCurrentOsStackTraceExceptTop(
+    UnitTest* unit_test, int skip_count);
+
+// Helpers for suppressing warnings on unreachable code or constant
+// condition.
+
+// Always returns true.
+GTEST_API_ bool AlwaysTrue();
+
+// Always returns false.
+inline bool AlwaysFalse() { return !AlwaysTrue(); }
+
+// Helper for suppressing false warning from Clang on a const char*
+// variable declared in a conditional expression always being NULL in
+// the else branch.
+struct GTEST_API_ ConstCharPtr {
+  ConstCharPtr(const char* str) : value(str) {}
+  operator bool() const { return true; }
+  const char* value;
+};
+
+// A simple Linear Congruential Generator for generating random
+// numbers with a uniform distribution.  Unlike rand() and srand(), it
+// doesn't use global state (and therefore can't interfere with user
+// code).  Unlike rand_r(), it's portable.  An LCG isn't very random,
+// but it's good enough for our purposes.
+class GTEST_API_ Random {
+ public:
+  static const UInt32 kMaxRange = 1u << 31;
+
+  explicit Random(UInt32 seed) : state_(seed) {}
+
+  void Reseed(UInt32 seed) { state_ = seed; }
+
+  // Generates a random number from [0, range).  Crashes if 'range' is
+  // 0 or greater than kMaxRange.
+  UInt32 Generate(UInt32 range);
+
+ private:
+  UInt32 state_;
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(Random);
+};
+
+// Defining a variable of type CompileAssertTypesEqual<T1, T2> will cause a
+// compiler error iff T1 and T2 are different types.
+template <typename T1, typename T2>
+struct CompileAssertTypesEqual;
+
+template <typename T>
+struct CompileAssertTypesEqual<T, T> {
+};
+
+// Removes the reference from a type if it is a reference type,
+// otherwise leaves it unchanged.  This is the same as
+// tr1::remove_reference, which is not widely available yet.
+template <typename T>
+struct RemoveReference { typedef T type; };  // NOLINT
+template <typename T>
+struct RemoveReference<T&> { typedef T type; };  // NOLINT
+
+// A handy wrapper around RemoveReference that works when the argument
+// T depends on template parameters.
+#define GTEST_REMOVE_REFERENCE_(T) \
+    typename ::testing::internal::RemoveReference<T>::type
+
+// Removes const from a type if it is a const type, otherwise leaves
+// it unchanged.  This is the same as tr1::remove_const, which is not
+// widely available yet.
+template <typename T>
+struct RemoveConst { typedef T type; };  // NOLINT
+template <typename T>
+struct RemoveConst<const T> { typedef T type; };  // NOLINT
+
+// MSVC 8.0, Sun C++, and IBM XL C++ have a bug which causes the above
+// definition to fail to remove the const in 'const int[3]' and 'const
+// char[3][4]'.  The following specialization works around the bug.
+template <typename T, size_t N>
+struct RemoveConst<const T[N]> {
+  typedef typename RemoveConst<T>::type type[N];
+};
+
+#if defined(_MSC_VER) && _MSC_VER < 1400
+// This is the only specialization that allows VC++ 7.1 to remove const in
+// 'const int[3] and 'const int[3][4]'.  However, it causes trouble with GCC
+// and thus needs to be conditionally compiled.
+template <typename T, size_t N>
+struct RemoveConst<T[N]> {
+  typedef typename RemoveConst<T>::type type[N];
+};
+#endif
+
+// A handy wrapper around RemoveConst that works when the argument
+// T depends on template parameters.
+#define GTEST_REMOVE_CONST_(T) \
+    typename ::testing::internal::RemoveConst<T>::type
+
+// Turns const U&, U&, const U, and U all into U.
+#define GTEST_REMOVE_REFERENCE_AND_CONST_(T) \
+    GTEST_REMOVE_CONST_(GTEST_REMOVE_REFERENCE_(T))
+
+// Adds reference to a type if it is not a reference type,
+// otherwise leaves it unchanged.  This is the same as
+// tr1::add_reference, which is not widely available yet.
+template <typename T>
+struct AddReference { typedef T& type; };  // NOLINT
+template <typename T>
+struct AddReference<T&> { typedef T& type; };  // NOLINT
+
+// A handy wrapper around AddReference that works when the argument T
+// depends on template parameters.
+#define GTEST_ADD_REFERENCE_(T) \
+    typename ::testing::internal::AddReference<T>::type
+
+// Adds a reference to const on top of T as necessary.  For example,
+// it transforms
+//
+//   char         ==> const char&
+//   const char   ==> const char&
+//   char&        ==> const char&
+//   const char&  ==> const char&
+//
+// The argument T must depend on some template parameters.
+#define GTEST_REFERENCE_TO_CONST_(T) \
+    GTEST_ADD_REFERENCE_(const GTEST_REMOVE_REFERENCE_(T))
+
+// ImplicitlyConvertible<From, To>::value is a compile-time bool
+// constant that's true iff type From can be implicitly converted to
+// type To.
+template <typename From, typename To>
+class ImplicitlyConvertible {
+ private:
+  // We need the following helper functions only for their types.
+  // They have no implementations.
+
+  // MakeFrom() is an expression whose type is From.  We cannot simply
+  // use From(), as the type From may not have a public default
+  // constructor.
+  static From MakeFrom();
+
+  // These two functions are overloaded.  Given an expression
+  // Helper(x), the compiler will pick the first version if x can be
+  // implicitly converted to type To; otherwise it will pick the
+  // second version.
+  //
+  // The first version returns a value of size 1, and the second
+  // version returns a value of size 2.  Therefore, by checking the
+  // size of Helper(x), which can be done at compile time, we can tell
+  // which version of Helper() is used, and hence whether x can be
+  // implicitly converted to type To.
+  static char Helper(To);
+  static char (&Helper(...))[2];  // NOLINT
+
+  // We have to put the 'public' section after the 'private' section,
+  // or MSVC refuses to compile the code.
+ public:
+  // MSVC warns about implicitly converting from double to int for
+  // possible loss of data, so we need to temporarily disable the
+  // warning.
+#ifdef _MSC_VER
+# pragma warning(push)          // Saves the current warning state.
+# pragma warning(disable:4244)  // Temporarily disables warning 4244.
+
+  static const bool value =
+      sizeof(Helper(ImplicitlyConvertible::MakeFrom())) == 1;
+# pragma warning(pop)           // Restores the warning state.
+#elif defined(__BORLANDC__)
+  // C++Builder cannot use member overload resolution during template
+  // instantiation.  The simplest workaround is to use its C++0x type traits
+  // functions (C++Builder 2009 and above only).
+  static const bool value = __is_convertible(From, To);
+#else
+  static const bool value =
+      sizeof(Helper(ImplicitlyConvertible::MakeFrom())) == 1;
+#endif  // _MSV_VER
+};
+template <typename From, typename To>
+const bool ImplicitlyConvertible<From, To>::value;
+
+// IsAProtocolMessage<T>::value is a compile-time bool constant that's
+// true iff T is type ProtocolMessage, proto2::Message, or a subclass
+// of those.
+template <typename T>
+struct IsAProtocolMessage
+    : public bool_constant<
+  ImplicitlyConvertible<const T*, const ::ProtocolMessage*>::value ||
+  ImplicitlyConvertible<const T*, const ::proto2::Message*>::value> {
+};
+
+// When the compiler sees expression IsContainerTest<C>(0), if C is an
+// STL-style container class, the first overload of IsContainerTest
+// will be viable (since both C::iterator* and C::const_iterator* are
+// valid types and NULL can be implicitly converted to them).  It will
+// be picked over the second overload as 'int' is a perfect match for
+// the type of argument 0.  If C::iterator or C::const_iterator is not
+// a valid type, the first overload is not viable, and the second
+// overload will be picked.  Therefore, we can determine whether C is
+// a container class by checking the type of IsContainerTest<C>(0).
+// The value of the expression is insignificant.
+//
+// Note that we look for both C::iterator and C::const_iterator.  The
+// reason is that C++ injects the name of a class as a member of the
+// class itself (e.g. you can refer to class iterator as either
+// 'iterator' or 'iterator::iterator').  If we look for C::iterator
+// only, for example, we would mistakenly think that a class named
+// iterator is an STL container.
+//
+// Also note that the simpler approach of overloading
+// IsContainerTest(typename C::const_iterator*) and
+// IsContainerTest(...) doesn't work with Visual Age C++ and Sun C++.
+typedef int IsContainer;
+template <class C>
+IsContainer IsContainerTest(int /* dummy */,
+                            typename C::iterator* /* it */ = NULL,
+                            typename C::const_iterator* /* const_it */ = NULL) {
+  return 0;
+}
+
+typedef char IsNotContainer;
+template <class C>
+IsNotContainer IsContainerTest(long /* dummy */) { return '\0'; }
+
+// EnableIf<condition>::type is void when 'Cond' is true, and
+// undefined when 'Cond' is false.  To use SFINAE to make a function
+// overload only apply when a particular expression is true, add
+// "typename EnableIf<expression>::type* = 0" as the last parameter.
+template<bool> struct EnableIf;
+template<> struct EnableIf<true> { typedef void type; };  // NOLINT
+
+// Utilities for native arrays.
+
+// ArrayEq() compares two k-dimensional native arrays using the
+// elements' operator==, where k can be any integer >= 0.  When k is
+// 0, ArrayEq() degenerates into comparing a single pair of values.
+
+template <typename T, typename U>
+bool ArrayEq(const T* lhs, size_t size, const U* rhs);
+
+// This generic version is used when k is 0.
+template <typename T, typename U>
+inline bool ArrayEq(const T& lhs, const U& rhs) { return lhs == rhs; }
+
+// This overload is used when k >= 1.
+template <typename T, typename U, size_t N>
+inline bool ArrayEq(const T(&lhs)[N], const U(&rhs)[N]) {
+  return internal::ArrayEq(lhs, N, rhs);
+}
+
+// This helper reduces code bloat.  If we instead put its logic inside
+// the previous ArrayEq() function, arrays with different sizes would
+// lead to different copies of the template code.
+template <typename T, typename U>
+bool ArrayEq(const T* lhs, size_t size, const U* rhs) {
+  for (size_t i = 0; i != size; i++) {
+    if (!internal::ArrayEq(lhs[i], rhs[i]))
+      return false;
+  }
+  return true;
+}
+
+// Finds the first element in the iterator range [begin, end) that
+// equals elem.  Element may be a native array type itself.
+template <typename Iter, typename Element>
+Iter ArrayAwareFind(Iter begin, Iter end, const Element& elem) {
+  for (Iter it = begin; it != end; ++it) {
+    if (internal::ArrayEq(*it, elem))
+      return it;
+  }
+  return end;
+}
+
+// CopyArray() copies a k-dimensional native array using the elements'
+// operator=, where k can be any integer >= 0.  When k is 0,
+// CopyArray() degenerates into copying a single value.
+
+template <typename T, typename U>
+void CopyArray(const T* from, size_t size, U* to);
+
+// This generic version is used when k is 0.
+template <typename T, typename U>
+inline void CopyArray(const T& from, U* to) { *to = from; }
+
+// This overload is used when k >= 1.
+template <typename T, typename U, size_t N>
+inline void CopyArray(const T(&from)[N], U(*to)[N]) {
+  internal::CopyArray(from, N, *to);
+}
+
+// This helper reduces code bloat.  If we instead put its logic inside
+// the previous CopyArray() function, arrays with different sizes
+// would lead to different copies of the template code.
+template <typename T, typename U>
+void CopyArray(const T* from, size_t size, U* to) {
+  for (size_t i = 0; i != size; i++) {
+    internal::CopyArray(from[i], to + i);
+  }
+}
+
+// The relation between an NativeArray object (see below) and the
+// native array it represents.
+enum RelationToSource {
+  kReference,  // The NativeArray references the native array.
+  kCopy        // The NativeArray makes a copy of the native array and
+               // owns the copy.
+};
+
+// Adapts a native array to a read-only STL-style container.  Instead
+// of the complete STL container concept, this adaptor only implements
+// members useful for Google Mock's container matchers.  New members
+// should be added as needed.  To simplify the implementation, we only
+// support Element being a raw type (i.e. having no top-level const or
+// reference modifier).  It's the client's responsibility to satisfy
+// this requirement.  Element can be an array type itself (hence
+// multi-dimensional arrays are supported).
+template <typename Element>
+class NativeArray {
+ public:
+  // STL-style container typedefs.
+  typedef Element value_type;
+  typedef Element* iterator;
+  typedef const Element* const_iterator;
+
+  // Constructs from a native array.
+  NativeArray(const Element* array, size_t count, RelationToSource relation) {
+    Init(array, count, relation);
+  }
+
+  // Copy constructor.
+  NativeArray(const NativeArray& rhs) {
+    Init(rhs.array_, rhs.size_, rhs.relation_to_source_);
+  }
+
+  ~NativeArray() {
+    // Ensures that the user doesn't instantiate NativeArray with a
+    // const or reference type.
+    static_cast<void>(StaticAssertTypeEqHelper<Element,
+        GTEST_REMOVE_REFERENCE_AND_CONST_(Element)>());
+    if (relation_to_source_ == kCopy)
+      delete[] array_;
+  }
+
+  // STL-style container methods.
+  size_t size() const { return size_; }
+  const_iterator begin() const { return array_; }
+  const_iterator end() const { return array_ + size_; }
+  bool operator==(const NativeArray& rhs) const {
+    return size() == rhs.size() &&
+        ArrayEq(begin(), size(), rhs.begin());
+  }
+
+ private:
+  // Initializes this object; makes a copy of the input array if
+  // 'relation' is kCopy.
+  void Init(const Element* array, size_t a_size, RelationToSource relation) {
+    if (relation == kReference) {
+      array_ = array;
+    } else {
+      Element* const copy = new Element[a_size];
+      CopyArray(array, a_size, copy);
+      array_ = copy;
+    }
+    size_ = a_size;
+    relation_to_source_ = relation;
+  }
+
+  const Element* array_;
+  size_t size_;
+  RelationToSource relation_to_source_;
+
+  GTEST_DISALLOW_ASSIGN_(NativeArray);
+};
+
+}  // namespace internal
+}  // namespace testing
+
+#define GTEST_MESSAGE_AT_(file, line, message, result_type) \
+  ::testing::internal::AssertHelper(result_type, file, line, message) \
+    = ::testing::Message()
+
+#define GTEST_MESSAGE_(message, result_type) \
+  GTEST_MESSAGE_AT_(__FILE__, __LINE__, message, result_type)
+
+#define GTEST_FATAL_FAILURE_(message) \
+  return GTEST_MESSAGE_(message, ::testing::TestPartResult::kFatalFailure)
+
+#define GTEST_NONFATAL_FAILURE_(message) \
+  GTEST_MESSAGE_(message, ::testing::TestPartResult::kNonFatalFailure)
+
+#define GTEST_SUCCESS_(message) \
+  GTEST_MESSAGE_(message, ::testing::TestPartResult::kSuccess)
+
+// Suppresses MSVC warnings 4072 (unreachable code) for the code following
+// statement if it returns or throws (or doesn't return or throw in some
+// situations).
+#define GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement) \
+  if (::testing::internal::AlwaysTrue()) { statement; }
+
+#define GTEST_TEST_THROW_(statement, expected_exception, fail) \
+  GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
+  if (::testing::internal::ConstCharPtr gtest_msg = "") { \
+    bool gtest_caught_expected = false; \
+    try { \
+      GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \
+    } \
+    catch (expected_exception const&) { \
+      gtest_caught_expected = true; \
+    } \
+    catch (...) { \
+      gtest_msg.value = \
+          "Expected: " #statement " throws an exception of type " \
+          #expected_exception ".\n  Actual: it throws a different type."; \
+      goto GTEST_CONCAT_TOKEN_(gtest_label_testthrow_, __LINE__); \
+    } \
+    if (!gtest_caught_expected) { \
+      gtest_msg.value = \
+          "Expected: " #statement " throws an exception of type " \
+          #expected_exception ".\n  Actual: it throws nothing."; \
+      goto GTEST_CONCAT_TOKEN_(gtest_label_testthrow_, __LINE__); \
+    } \
+  } else \
+    GTEST_CONCAT_TOKEN_(gtest_label_testthrow_, __LINE__): \
+      fail(gtest_msg.value)
+
+#define GTEST_TEST_NO_THROW_(statement, fail) \
+  GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
+  if (::testing::internal::AlwaysTrue()) { \
+    try { \
+      GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \
+    } \
+    catch (...) { \
+      goto GTEST_CONCAT_TOKEN_(gtest_label_testnothrow_, __LINE__); \
+    } \
+  } else \
+    GTEST_CONCAT_TOKEN_(gtest_label_testnothrow_, __LINE__): \
+      fail("Expected: " #statement " doesn't throw an exception.\n" \
+           "  Actual: it throws.")
+
+#define GTEST_TEST_ANY_THROW_(statement, fail) \
+  GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
+  if (::testing::internal::AlwaysTrue()) { \
+    bool gtest_caught_any = false; \
+    try { \
+      GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \
+    } \
+    catch (...) { \
+      gtest_caught_any = true; \
+    } \
+    if (!gtest_caught_any) { \
+      goto GTEST_CONCAT_TOKEN_(gtest_label_testanythrow_, __LINE__); \
+    } \
+  } else \
+    GTEST_CONCAT_TOKEN_(gtest_label_testanythrow_, __LINE__): \
+      fail("Expected: " #statement " throws an exception.\n" \
+           "  Actual: it doesn't.")
+
+
+// Implements Boolean test assertions such as EXPECT_TRUE. expression can be
+// either a boolean expression or an AssertionResult. text is a textual
+// represenation of expression as it was passed into the EXPECT_TRUE.
+#define GTEST_TEST_BOOLEAN_(expression, text, actual, expected, fail) \
+  GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
+  if (const ::testing::AssertionResult gtest_ar_ = \
+      ::testing::AssertionResult(expression)) \
+    ; \
+  else \
+    fail(::testing::internal::GetBoolAssertionFailureMessage(\
+        gtest_ar_, text, #actual, #expected).c_str())
+
+#define GTEST_TEST_NO_FATAL_FAILURE_(statement, fail) \
+  GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
+  if (::testing::internal::AlwaysTrue()) { \
+    ::testing::internal::HasNewFatalFailureHelper gtest_fatal_failure_checker; \
+    GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \
+    if (gtest_fatal_failure_checker.has_new_fatal_failure()) { \
+      goto GTEST_CONCAT_TOKEN_(gtest_label_testnofatal_, __LINE__); \
+    } \
+  } else \
+    GTEST_CONCAT_TOKEN_(gtest_label_testnofatal_, __LINE__): \
+      fail("Expected: " #statement " doesn't generate new fatal " \
+           "failures in the current thread.\n" \
+           "  Actual: it does.")
+
+// Expands to the name of the class that implements the given test.
+#define GTEST_TEST_CLASS_NAME_(test_case_name, test_name) \
+  test_case_name##_##test_name##_Test
+
+// Helper macro for defining tests.
+#define GTEST_TEST_(test_case_name, test_name, parent_class, parent_id)\
+class GTEST_TEST_CLASS_NAME_(test_case_name, test_name) : public parent_class {\
+ public:\
+  GTEST_TEST_CLASS_NAME_(test_case_name, test_name)() {}\
+ private:\
+  virtual void TestBody();\
+  static ::testing::TestInfo* const test_info_ GTEST_ATTRIBUTE_UNUSED_;\
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(\
+      GTEST_TEST_CLASS_NAME_(test_case_name, test_name));\
+};\
+\
+::testing::TestInfo* const GTEST_TEST_CLASS_NAME_(test_case_name, test_name)\
+  ::test_info_ =\
+    ::testing::internal::MakeAndRegisterTestInfo(\
+        #test_case_name, #test_name, NULL, NULL, \
+        (parent_id), \
+        parent_class::SetUpTestCase, \
+        parent_class::TearDownTestCase, \
+        new ::testing::internal::TestFactoryImpl<\
+            GTEST_TEST_CLASS_NAME_(test_case_name, test_name)>);\
+void GTEST_TEST_CLASS_NAME_(test_case_name, test_name)::TestBody()
+
+#endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_INTERNAL_H_
diff --git a/contrib/gtest-1.7.0/include/gtest/internal/gtest-linked_ptr.h b/contrib/gtest-1.7.0/include/gtest/internal/gtest-linked_ptr.h
new file mode 100644
index 0000000..b1362cd
--- /dev/null
+++ b/contrib/gtest-1.7.0/include/gtest/internal/gtest-linked_ptr.h
@@ -0,0 +1,233 @@
+// Copyright 2003 Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Authors: Dan Egnor (egnor at google.com)
+//
+// A "smart" pointer type with reference tracking.  Every pointer to a
+// particular object is kept on a circular linked list.  When the last pointer
+// to an object is destroyed or reassigned, the object is deleted.
+//
+// Used properly, this deletes the object when the last reference goes away.
+// There are several caveats:
+// - Like all reference counting schemes, cycles lead to leaks.
+// - Each smart pointer is actually two pointers (8 bytes instead of 4).
+// - Every time a pointer is assigned, the entire list of pointers to that
+//   object is traversed.  This class is therefore NOT SUITABLE when there
+//   will often be more than two or three pointers to a particular object.
+// - References are only tracked as long as linked_ptr<> objects are copied.
+//   If a linked_ptr<> is converted to a raw pointer and back, BAD THINGS
+//   will happen (double deletion).
+//
+// A good use of this class is storing object references in STL containers.
+// You can safely put linked_ptr<> in a vector<>.
+// Other uses may not be as good.
+//
+// Note: If you use an incomplete type with linked_ptr<>, the class
+// *containing* linked_ptr<> must have a constructor and destructor (even
+// if they do nothing!).
+//
+// Bill Gibbons suggested we use something like this.
+//
+// Thread Safety:
+//   Unlike other linked_ptr implementations, in this implementation
+//   a linked_ptr object is thread-safe in the sense that:
+//     - it's safe to copy linked_ptr objects concurrently,
+//     - it's safe to copy *from* a linked_ptr and read its underlying
+//       raw pointer (e.g. via get()) concurrently, and
+//     - it's safe to write to two linked_ptrs that point to the same
+//       shared object concurrently.
+// TODO(wan at google.com): rename this to safe_linked_ptr to avoid
+// confusion with normal linked_ptr.
+
+#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_LINKED_PTR_H_
+#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_LINKED_PTR_H_
+
+#include <stdlib.h>
+#include <assert.h>
+
+#include "gtest/internal/gtest-port.h"
+
+namespace testing {
+namespace internal {
+
+// Protects copying of all linked_ptr objects.
+GTEST_API_ GTEST_DECLARE_STATIC_MUTEX_(g_linked_ptr_mutex);
+
+// This is used internally by all instances of linked_ptr<>.  It needs to be
+// a non-template class because different types of linked_ptr<> can refer to
+// the same object (linked_ptr<Superclass>(obj) vs linked_ptr<Subclass>(obj)).
+// So, it needs to be possible for different types of linked_ptr to participate
+// in the same circular linked list, so we need a single class type here.
+//
+// DO NOT USE THIS CLASS DIRECTLY YOURSELF.  Use linked_ptr<T>.
+class linked_ptr_internal {
+ public:
+  // Create a new circle that includes only this instance.
+  void join_new() {
+    next_ = this;
+  }
+
+  // Many linked_ptr operations may change p.link_ for some linked_ptr
+  // variable p in the same circle as this object.  Therefore we need
+  // to prevent two such operations from occurring concurrently.
+  //
+  // Note that different types of linked_ptr objects can coexist in a
+  // circle (e.g. linked_ptr<Base>, linked_ptr<Derived1>, and
+  // linked_ptr<Derived2>).  Therefore we must use a single mutex to
+  // protect all linked_ptr objects.  This can create serious
+  // contention in production code, but is acceptable in a testing
+  // framework.
+
+  // Join an existing circle.
+  void join(linked_ptr_internal const* ptr)
+      GTEST_LOCK_EXCLUDED_(g_linked_ptr_mutex) {
+    MutexLock lock(&g_linked_ptr_mutex);
+
+    linked_ptr_internal const* p = ptr;
+    while (p->next_ != ptr) p = p->next_;
+    p->next_ = this;
+    next_ = ptr;
+  }
+
+  // Leave whatever circle we're part of.  Returns true if we were the
+  // last member of the circle.  Once this is done, you can join() another.
+  bool depart()
+      GTEST_LOCK_EXCLUDED_(g_linked_ptr_mutex) {
+    MutexLock lock(&g_linked_ptr_mutex);
+
+    if (next_ == this) return true;
+    linked_ptr_internal const* p = next_;
+    while (p->next_ != this) p = p->next_;
+    p->next_ = next_;
+    return false;
+  }
+
+ private:
+  mutable linked_ptr_internal const* next_;
+};
+
+template <typename T>
+class linked_ptr {
+ public:
+  typedef T element_type;
+
+  // Take over ownership of a raw pointer.  This should happen as soon as
+  // possible after the object is created.
+  explicit linked_ptr(T* ptr = NULL) { capture(ptr); }
+  ~linked_ptr() { depart(); }
+
+  // Copy an existing linked_ptr<>, adding ourselves to the list of references.
+  template <typename U> linked_ptr(linked_ptr<U> const& ptr) { copy(&ptr); }
+  linked_ptr(linked_ptr const& ptr) {  // NOLINT
+    assert(&ptr != this);
+    copy(&ptr);
+  }
+
+  // Assignment releases the old value and acquires the new.
+  template <typename U> linked_ptr& operator=(linked_ptr<U> const& ptr) {
+    depart();
+    copy(&ptr);
+    return *this;
+  }
+
+  linked_ptr& operator=(linked_ptr const& ptr) {
+    if (&ptr != this) {
+      depart();
+      copy(&ptr);
+    }
+    return *this;
+  }
+
+  // Smart pointer members.
+  void reset(T* ptr = NULL) {
+    depart();
+    capture(ptr);
+  }
+  T* get() const { return value_; }
+  T* operator->() const { return value_; }
+  T& operator*() const { return *value_; }
+
+  bool operator==(T* p) const { return value_ == p; }
+  bool operator!=(T* p) const { return value_ != p; }
+  template <typename U>
+  bool operator==(linked_ptr<U> const& ptr) const {
+    return value_ == ptr.get();
+  }
+  template <typename U>
+  bool operator!=(linked_ptr<U> const& ptr) const {
+    return value_ != ptr.get();
+  }
+
+ private:
+  template <typename U>
+  friend class linked_ptr;
+
+  T* value_;
+  linked_ptr_internal link_;
+
+  void depart() {
+    if (link_.depart()) delete value_;
+  }
+
+  void capture(T* ptr) {
+    value_ = ptr;
+    link_.join_new();
+  }
+
+  template <typename U> void copy(linked_ptr<U> const* ptr) {
+    value_ = ptr->get();
+    if (value_)
+      link_.join(&ptr->link_);
+    else
+      link_.join_new();
+  }
+};
+
+template<typename T> inline
+bool operator==(T* ptr, const linked_ptr<T>& x) {
+  return ptr == x.get();
+}
+
+template<typename T> inline
+bool operator!=(T* ptr, const linked_ptr<T>& x) {
+  return ptr != x.get();
+}
+
+// A function to convert T* into linked_ptr<T>
+// Doing e.g. make_linked_ptr(new FooBarBaz<type>(arg)) is a shorter notation
+// for linked_ptr<FooBarBaz<type> >(new FooBarBaz<type>(arg))
+template <typename T>
+linked_ptr<T> make_linked_ptr(T* ptr) {
+  return linked_ptr<T>(ptr);
+}
+
+}  // namespace internal
+}  // namespace testing
+
+#endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_LINKED_PTR_H_
diff --git a/contrib/gtest-1.7.0/include/gtest/internal/gtest-param-util-generated.h b/contrib/gtest-1.7.0/include/gtest/internal/gtest-param-util-generated.h
new file mode 100644
index 0000000..e805485
--- /dev/null
+++ b/contrib/gtest-1.7.0/include/gtest/internal/gtest-param-util-generated.h
@@ -0,0 +1,5143 @@
+// This file was GENERATED by command:
+//     pump.py gtest-param-util-generated.h.pump
+// DO NOT EDIT BY HAND!!!
+
+// Copyright 2008 Google Inc.
+// All Rights Reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: vladl at google.com (Vlad Losev)
+
+// Type and function utilities for implementing parameterized tests.
+// This file is generated by a SCRIPT.  DO NOT EDIT BY HAND!
+//
+// Currently Google Test supports at most 50 arguments in Values,
+// and at most 10 arguments in Combine. Please contact
+// googletestframework at googlegroups.com if you need more.
+// Please note that the number of arguments to Combine is limited
+// by the maximum arity of the implementation of tr1::tuple which is
+// currently set at 10.
+
+#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_GENERATED_H_
+#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_GENERATED_H_
+
+// scripts/fuse_gtest.py depends on gtest's own header being #included
+// *unconditionally*.  Therefore these #includes cannot be moved
+// inside #if GTEST_HAS_PARAM_TEST.
+#include "gtest/internal/gtest-param-util.h"
+#include "gtest/internal/gtest-port.h"
+
+#if GTEST_HAS_PARAM_TEST
+
+namespace testing {
+
+// Forward declarations of ValuesIn(), which is implemented in
+// include/gtest/gtest-param-test.h.
+template <typename ForwardIterator>
+internal::ParamGenerator<
+  typename ::testing::internal::IteratorTraits<ForwardIterator>::value_type>
+ValuesIn(ForwardIterator begin, ForwardIterator end);
+
+template <typename T, size_t N>
+internal::ParamGenerator<T> ValuesIn(const T (&array)[N]);
+
+template <class Container>
+internal::ParamGenerator<typename Container::value_type> ValuesIn(
+    const Container& container);
+
+namespace internal {
+
+// Used in the Values() function to provide polymorphic capabilities.
+template <typename T1>
+class ValueArray1 {
+ public:
+  explicit ValueArray1(T1 v1) : v1_(v1) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const { return ValuesIn(&v1_, &v1_ + 1); }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray1& other);
+
+  const T1 v1_;
+};
+
+template <typename T1, typename T2>
+class ValueArray2 {
+ public:
+  ValueArray2(T1 v1, T2 v2) : v1_(v1), v2_(v2) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray2& other);
+
+  const T1 v1_;
+  const T2 v2_;
+};
+
+template <typename T1, typename T2, typename T3>
+class ValueArray3 {
+ public:
+  ValueArray3(T1 v1, T2 v2, T3 v3) : v1_(v1), v2_(v2), v3_(v3) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray3& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4>
+class ValueArray4 {
+ public:
+  ValueArray4(T1 v1, T2 v2, T3 v3, T4 v4) : v1_(v1), v2_(v2), v3_(v3),
+      v4_(v4) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray4& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5>
+class ValueArray5 {
+ public:
+  ValueArray5(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5) : v1_(v1), v2_(v2), v3_(v3),
+      v4_(v4), v5_(v5) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray5& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6>
+class ValueArray6 {
+ public:
+  ValueArray6(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6) : v1_(v1), v2_(v2),
+      v3_(v3), v4_(v4), v5_(v5), v6_(v6) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray6& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7>
+class ValueArray7 {
+ public:
+  ValueArray7(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7) : v1_(v1),
+      v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray7& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8>
+class ValueArray8 {
+ public:
+  ValueArray8(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,
+      T8 v8) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
+      v8_(v8) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray8& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9>
+class ValueArray9 {
+ public:
+  ValueArray9(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8,
+      T9 v9) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
+      v8_(v8), v9_(v9) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray9& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10>
+class ValueArray10 {
+ public:
+  ValueArray10(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
+      v8_(v8), v9_(v9), v10_(v10) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray10& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11>
+class ValueArray11 {
+ public:
+  ValueArray11(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6),
+      v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray11& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12>
+class ValueArray12 {
+ public:
+  ValueArray12(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5),
+      v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray12& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13>
+class ValueArray13 {
+ public:
+  ValueArray13(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13) : v1_(v1), v2_(v2), v3_(v3), v4_(v4),
+      v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11),
+      v12_(v12), v13_(v13) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray13& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14>
+class ValueArray14 {
+ public:
+  ValueArray14(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14) : v1_(v1), v2_(v2), v3_(v3),
+      v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
+      v11_(v11), v12_(v12), v13_(v13), v14_(v14) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray14& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15>
+class ValueArray15 {
+ public:
+  ValueArray15(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15) : v1_(v1), v2_(v2),
+      v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
+      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray15& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16>
+class ValueArray16 {
+ public:
+  ValueArray16(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16) : v1_(v1),
+      v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9),
+      v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15),
+      v16_(v16) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray16& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17>
+class ValueArray17 {
+ public:
+  ValueArray17(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16,
+      T17 v17) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
+      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
+      v15_(v15), v16_(v16), v17_(v17) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray17& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18>
+class ValueArray18 {
+ public:
+  ValueArray18(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
+      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
+      v15_(v15), v16_(v16), v17_(v17), v18_(v18) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray18& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19>
+class ValueArray19 {
+ public:
+  ValueArray19(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6),
+      v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13),
+      v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray19& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20>
+class ValueArray20 {
+ public:
+  ValueArray20(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5),
+      v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12),
+      v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18),
+      v19_(v19), v20_(v20) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray20& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21>
+class ValueArray21 {
+ public:
+  ValueArray21(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21) : v1_(v1), v2_(v2), v3_(v3), v4_(v4),
+      v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11),
+      v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17),
+      v18_(v18), v19_(v19), v20_(v20), v21_(v21) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray21& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22>
+class ValueArray22 {
+ public:
+  ValueArray22(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22) : v1_(v1), v2_(v2), v3_(v3),
+      v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
+      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
+      v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray22& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23>
+class ValueArray23 {
+ public:
+  ValueArray23(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23) : v1_(v1), v2_(v2),
+      v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
+      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
+      v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),
+      v23_(v23) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray23& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+  const T23 v23_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24>
+class ValueArray24 {
+ public:
+  ValueArray24(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24) : v1_(v1),
+      v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9),
+      v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15),
+      v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21),
+      v22_(v22), v23_(v23), v24_(v24) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray24& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+  const T23 v23_;
+  const T24 v24_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25>
+class ValueArray25 {
+ public:
+  ValueArray25(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24,
+      T25 v25) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
+      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
+      v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
+      v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray25& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+  const T23 v23_;
+  const T24 v24_;
+  const T25 v25_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26>
+class ValueArray26 {
+ public:
+  ValueArray26(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+      T26 v26) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
+      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
+      v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
+      v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray26& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+  const T23 v23_;
+  const T24 v24_;
+  const T25 v25_;
+  const T26 v26_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27>
+class ValueArray27 {
+ public:
+  ValueArray27(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+      T26 v26, T27 v27) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6),
+      v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13),
+      v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19),
+      v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25),
+      v26_(v26), v27_(v27) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+        static_cast<T>(v27_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray27& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+  const T23 v23_;
+  const T24 v24_;
+  const T25 v25_;
+  const T26 v26_;
+  const T27 v27_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28>
+class ValueArray28 {
+ public:
+  ValueArray28(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+      T26 v26, T27 v27, T28 v28) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5),
+      v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12),
+      v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18),
+      v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24),
+      v25_(v25), v26_(v26), v27_(v27), v28_(v28) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+        static_cast<T>(v27_), static_cast<T>(v28_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray28& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+  const T23 v23_;
+  const T24 v24_;
+  const T25 v25_;
+  const T26 v26_;
+  const T27 v27_;
+  const T28 v28_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29>
+class ValueArray29 {
+ public:
+  ValueArray29(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+      T26 v26, T27 v27, T28 v28, T29 v29) : v1_(v1), v2_(v2), v3_(v3), v4_(v4),
+      v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11),
+      v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17),
+      v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23),
+      v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray29& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+  const T23 v23_;
+  const T24 v24_;
+  const T25 v25_;
+  const T26 v26_;
+  const T27 v27_;
+  const T28 v28_;
+  const T29 v29_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30>
+class ValueArray30 {
+ public:
+  ValueArray30(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30) : v1_(v1), v2_(v2), v3_(v3),
+      v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
+      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
+      v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),
+      v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28),
+      v29_(v29), v30_(v30) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+        static_cast<T>(v30_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray30& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+  const T23 v23_;
+  const T24 v24_;
+  const T25 v25_;
+  const T26 v26_;
+  const T27 v27_;
+  const T28 v28_;
+  const T29 v29_;
+  const T30 v30_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31>
+class ValueArray31 {
+ public:
+  ValueArray31(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31) : v1_(v1), v2_(v2),
+      v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
+      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
+      v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),
+      v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28),
+      v29_(v29), v30_(v30), v31_(v31) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+        static_cast<T>(v30_), static_cast<T>(v31_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray31& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+  const T23 v23_;
+  const T24 v24_;
+  const T25 v25_;
+  const T26 v26_;
+  const T27 v27_;
+  const T28 v28_;
+  const T29 v29_;
+  const T30 v30_;
+  const T31 v31_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32>
+class ValueArray32 {
+ public:
+  ValueArray32(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32) : v1_(v1),
+      v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9),
+      v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15),
+      v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21),
+      v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27),
+      v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray32& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+  const T23 v23_;
+  const T24 v24_;
+  const T25 v25_;
+  const T26 v26_;
+  const T27 v27_;
+  const T28 v28_;
+  const T29 v29_;
+  const T30 v30_;
+  const T31 v31_;
+  const T32 v32_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33>
+class ValueArray33 {
+ public:
+  ValueArray33(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32,
+      T33 v33) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
+      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
+      v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
+      v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26),
+      v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32),
+      v33_(v33) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
+        static_cast<T>(v33_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray33& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+  const T23 v23_;
+  const T24 v24_;
+  const T25 v25_;
+  const T26 v26_;
+  const T27 v27_;
+  const T28 v28_;
+  const T29 v29_;
+  const T30 v30_;
+  const T31 v31_;
+  const T32 v32_;
+  const T33 v33_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34>
+class ValueArray34 {
+ public:
+  ValueArray34(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
+      T34 v34) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
+      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
+      v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
+      v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26),
+      v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32),
+      v33_(v33), v34_(v34) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
+        static_cast<T>(v33_), static_cast<T>(v34_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray34& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+  const T23 v23_;
+  const T24 v24_;
+  const T25 v25_;
+  const T26 v26_;
+  const T27 v27_;
+  const T28 v28_;
+  const T29 v29_;
+  const T30 v30_;
+  const T31 v31_;
+  const T32 v32_;
+  const T33 v33_;
+  const T34 v34_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35>
+class ValueArray35 {
+ public:
+  ValueArray35(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
+      T34 v34, T35 v35) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6),
+      v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13),
+      v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19),
+      v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25),
+      v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31),
+      v32_(v32), v33_(v33), v34_(v34), v35_(v35) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
+        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray35& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+  const T23 v23_;
+  const T24 v24_;
+  const T25 v25_;
+  const T26 v26_;
+  const T27 v27_;
+  const T28 v28_;
+  const T29 v29_;
+  const T30 v30_;
+  const T31 v31_;
+  const T32 v32_;
+  const T33 v33_;
+  const T34 v34_;
+  const T35 v35_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36>
+class ValueArray36 {
+ public:
+  ValueArray36(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
+      T34 v34, T35 v35, T36 v36) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5),
+      v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12),
+      v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18),
+      v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24),
+      v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30),
+      v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35), v36_(v36) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
+        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
+        static_cast<T>(v36_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray36& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+  const T23 v23_;
+  const T24 v24_;
+  const T25 v25_;
+  const T26 v26_;
+  const T27 v27_;
+  const T28 v28_;
+  const T29 v29_;
+  const T30 v30_;
+  const T31 v31_;
+  const T32 v32_;
+  const T33 v33_;
+  const T34 v34_;
+  const T35 v35_;
+  const T36 v36_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37>
+class ValueArray37 {
+ public:
+  ValueArray37(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
+      T34 v34, T35 v35, T36 v36, T37 v37) : v1_(v1), v2_(v2), v3_(v3), v4_(v4),
+      v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11),
+      v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17),
+      v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23),
+      v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29),
+      v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35),
+      v36_(v36), v37_(v37) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
+        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
+        static_cast<T>(v36_), static_cast<T>(v37_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray37& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+  const T23 v23_;
+  const T24 v24_;
+  const T25 v25_;
+  const T26 v26_;
+  const T27 v27_;
+  const T28 v28_;
+  const T29 v29_;
+  const T30 v30_;
+  const T31 v31_;
+  const T32 v32_;
+  const T33 v33_;
+  const T34 v34_;
+  const T35 v35_;
+  const T36 v36_;
+  const T37 v37_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38>
+class ValueArray38 {
+ public:
+  ValueArray38(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
+      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38) : v1_(v1), v2_(v2), v3_(v3),
+      v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
+      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
+      v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),
+      v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28),
+      v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34),
+      v35_(v35), v36_(v36), v37_(v37), v38_(v38) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
+        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
+        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray38& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+  const T23 v23_;
+  const T24 v24_;
+  const T25 v25_;
+  const T26 v26_;
+  const T27 v27_;
+  const T28 v28_;
+  const T29 v29_;
+  const T30 v30_;
+  const T31 v31_;
+  const T32 v32_;
+  const T33 v33_;
+  const T34 v34_;
+  const T35 v35_;
+  const T36 v36_;
+  const T37 v37_;
+  const T38 v38_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39>
+class ValueArray39 {
+ public:
+  ValueArray39(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
+      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39) : v1_(v1), v2_(v2),
+      v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
+      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
+      v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),
+      v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28),
+      v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34),
+      v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
+        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
+        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
+        static_cast<T>(v39_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray39& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+  const T23 v23_;
+  const T24 v24_;
+  const T25 v25_;
+  const T26 v26_;
+  const T27 v27_;
+  const T28 v28_;
+  const T29 v29_;
+  const T30 v30_;
+  const T31 v31_;
+  const T32 v32_;
+  const T33 v33_;
+  const T34 v34_;
+  const T35 v35_;
+  const T36 v36_;
+  const T37 v37_;
+  const T38 v38_;
+  const T39 v39_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40>
+class ValueArray40 {
+ public:
+  ValueArray40(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
+      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40) : v1_(v1),
+      v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9),
+      v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15),
+      v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21),
+      v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27),
+      v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33),
+      v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39),
+      v40_(v40) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
+        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
+        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
+        static_cast<T>(v39_), static_cast<T>(v40_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray40& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+  const T23 v23_;
+  const T24 v24_;
+  const T25 v25_;
+  const T26 v26_;
+  const T27 v27_;
+  const T28 v28_;
+  const T29 v29_;
+  const T30 v30_;
+  const T31 v31_;
+  const T32 v32_;
+  const T33 v33_;
+  const T34 v34_;
+  const T35 v35_;
+  const T36 v36_;
+  const T37 v37_;
+  const T38 v38_;
+  const T39 v39_;
+  const T40 v40_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41>
+class ValueArray41 {
+ public:
+  ValueArray41(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
+      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40,
+      T41 v41) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
+      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
+      v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
+      v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26),
+      v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32),
+      v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38),
+      v39_(v39), v40_(v40), v41_(v41) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
+        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
+        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
+        static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray41& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+  const T23 v23_;
+  const T24 v24_;
+  const T25 v25_;
+  const T26 v26_;
+  const T27 v27_;
+  const T28 v28_;
+  const T29 v29_;
+  const T30 v30_;
+  const T31 v31_;
+  const T32 v32_;
+  const T33 v33_;
+  const T34 v34_;
+  const T35 v35_;
+  const T36 v36_;
+  const T37 v37_;
+  const T38 v38_;
+  const T39 v39_;
+  const T40 v40_;
+  const T41 v41_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42>
+class ValueArray42 {
+ public:
+  ValueArray42(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
+      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
+      T42 v42) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
+      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
+      v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
+      v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26),
+      v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32),
+      v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38),
+      v39_(v39), v40_(v40), v41_(v41), v42_(v42) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
+        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
+        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
+        static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),
+        static_cast<T>(v42_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray42& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+  const T23 v23_;
+  const T24 v24_;
+  const T25 v25_;
+  const T26 v26_;
+  const T27 v27_;
+  const T28 v28_;
+  const T29 v29_;
+  const T30 v30_;
+  const T31 v31_;
+  const T32 v32_;
+  const T33 v33_;
+  const T34 v34_;
+  const T35 v35_;
+  const T36 v36_;
+  const T37 v37_;
+  const T38 v38_;
+  const T39 v39_;
+  const T40 v40_;
+  const T41 v41_;
+  const T42 v42_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43>
+class ValueArray43 {
+ public:
+  ValueArray43(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
+      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
+      T42 v42, T43 v43) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6),
+      v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13),
+      v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19),
+      v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25),
+      v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31),
+      v32_(v32), v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37),
+      v38_(v38), v39_(v39), v40_(v40), v41_(v41), v42_(v42), v43_(v43) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
+        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
+        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
+        static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),
+        static_cast<T>(v42_), static_cast<T>(v43_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray43& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+  const T23 v23_;
+  const T24 v24_;
+  const T25 v25_;
+  const T26 v26_;
+  const T27 v27_;
+  const T28 v28_;
+  const T29 v29_;
+  const T30 v30_;
+  const T31 v31_;
+  const T32 v32_;
+  const T33 v33_;
+  const T34 v34_;
+  const T35 v35_;
+  const T36 v36_;
+  const T37 v37_;
+  const T38 v38_;
+  const T39 v39_;
+  const T40 v40_;
+  const T41 v41_;
+  const T42 v42_;
+  const T43 v43_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43, typename T44>
+class ValueArray44 {
+ public:
+  ValueArray44(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
+      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
+      T42 v42, T43 v43, T44 v44) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5),
+      v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12),
+      v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18),
+      v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24),
+      v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30),
+      v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35), v36_(v36),
+      v37_(v37), v38_(v38), v39_(v39), v40_(v40), v41_(v41), v42_(v42),
+      v43_(v43), v44_(v44) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
+        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
+        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
+        static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),
+        static_cast<T>(v42_), static_cast<T>(v43_), static_cast<T>(v44_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray44& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+  const T23 v23_;
+  const T24 v24_;
+  const T25 v25_;
+  const T26 v26_;
+  const T27 v27_;
+  const T28 v28_;
+  const T29 v29_;
+  const T30 v30_;
+  const T31 v31_;
+  const T32 v32_;
+  const T33 v33_;
+  const T34 v34_;
+  const T35 v35_;
+  const T36 v36_;
+  const T37 v37_;
+  const T38 v38_;
+  const T39 v39_;
+  const T40 v40_;
+  const T41 v41_;
+  const T42 v42_;
+  const T43 v43_;
+  const T44 v44_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43, typename T44, typename T45>
+class ValueArray45 {
+ public:
+  ValueArray45(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
+      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
+      T42 v42, T43 v43, T44 v44, T45 v45) : v1_(v1), v2_(v2), v3_(v3), v4_(v4),
+      v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11),
+      v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17),
+      v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23),
+      v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29),
+      v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35),
+      v36_(v36), v37_(v37), v38_(v38), v39_(v39), v40_(v40), v41_(v41),
+      v42_(v42), v43_(v43), v44_(v44), v45_(v45) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
+        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
+        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
+        static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),
+        static_cast<T>(v42_), static_cast<T>(v43_), static_cast<T>(v44_),
+        static_cast<T>(v45_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray45& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+  const T23 v23_;
+  const T24 v24_;
+  const T25 v25_;
+  const T26 v26_;
+  const T27 v27_;
+  const T28 v28_;
+  const T29 v29_;
+  const T30 v30_;
+  const T31 v31_;
+  const T32 v32_;
+  const T33 v33_;
+  const T34 v34_;
+  const T35 v35_;
+  const T36 v36_;
+  const T37 v37_;
+  const T38 v38_;
+  const T39 v39_;
+  const T40 v40_;
+  const T41 v41_;
+  const T42 v42_;
+  const T43 v43_;
+  const T44 v44_;
+  const T45 v45_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43, typename T44, typename T45,
+    typename T46>
+class ValueArray46 {
+ public:
+  ValueArray46(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
+      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
+      T42 v42, T43 v43, T44 v44, T45 v45, T46 v46) : v1_(v1), v2_(v2), v3_(v3),
+      v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
+      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
+      v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),
+      v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28),
+      v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34),
+      v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39), v40_(v40),
+      v41_(v41), v42_(v42), v43_(v43), v44_(v44), v45_(v45), v46_(v46) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
+        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
+        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
+        static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),
+        static_cast<T>(v42_), static_cast<T>(v43_), static_cast<T>(v44_),
+        static_cast<T>(v45_), static_cast<T>(v46_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray46& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+  const T23 v23_;
+  const T24 v24_;
+  const T25 v25_;
+  const T26 v26_;
+  const T27 v27_;
+  const T28 v28_;
+  const T29 v29_;
+  const T30 v30_;
+  const T31 v31_;
+  const T32 v32_;
+  const T33 v33_;
+  const T34 v34_;
+  const T35 v35_;
+  const T36 v36_;
+  const T37 v37_;
+  const T38 v38_;
+  const T39 v39_;
+  const T40 v40_;
+  const T41 v41_;
+  const T42 v42_;
+  const T43 v43_;
+  const T44 v44_;
+  const T45 v45_;
+  const T46 v46_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43, typename T44, typename T45,
+    typename T46, typename T47>
+class ValueArray47 {
+ public:
+  ValueArray47(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
+      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
+      T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47) : v1_(v1), v2_(v2),
+      v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),
+      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),
+      v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),
+      v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28),
+      v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34),
+      v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39), v40_(v40),
+      v41_(v41), v42_(v42), v43_(v43), v44_(v44), v45_(v45), v46_(v46),
+      v47_(v47) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
+        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
+        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
+        static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),
+        static_cast<T>(v42_), static_cast<T>(v43_), static_cast<T>(v44_),
+        static_cast<T>(v45_), static_cast<T>(v46_), static_cast<T>(v47_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray47& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+  const T23 v23_;
+  const T24 v24_;
+  const T25 v25_;
+  const T26 v26_;
+  const T27 v27_;
+  const T28 v28_;
+  const T29 v29_;
+  const T30 v30_;
+  const T31 v31_;
+  const T32 v32_;
+  const T33 v33_;
+  const T34 v34_;
+  const T35 v35_;
+  const T36 v36_;
+  const T37 v37_;
+  const T38 v38_;
+  const T39 v39_;
+  const T40 v40_;
+  const T41 v41_;
+  const T42 v42_;
+  const T43 v43_;
+  const T44 v44_;
+  const T45 v45_;
+  const T46 v46_;
+  const T47 v47_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43, typename T44, typename T45,
+    typename T46, typename T47, typename T48>
+class ValueArray48 {
+ public:
+  ValueArray48(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
+      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
+      T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47, T48 v48) : v1_(v1),
+      v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9),
+      v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15),
+      v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21),
+      v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27),
+      v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33),
+      v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39),
+      v40_(v40), v41_(v41), v42_(v42), v43_(v43), v44_(v44), v45_(v45),
+      v46_(v46), v47_(v47), v48_(v48) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
+        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
+        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
+        static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),
+        static_cast<T>(v42_), static_cast<T>(v43_), static_cast<T>(v44_),
+        static_cast<T>(v45_), static_cast<T>(v46_), static_cast<T>(v47_),
+        static_cast<T>(v48_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray48& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+  const T23 v23_;
+  const T24 v24_;
+  const T25 v25_;
+  const T26 v26_;
+  const T27 v27_;
+  const T28 v28_;
+  const T29 v29_;
+  const T30 v30_;
+  const T31 v31_;
+  const T32 v32_;
+  const T33 v33_;
+  const T34 v34_;
+  const T35 v35_;
+  const T36 v36_;
+  const T37 v37_;
+  const T38 v38_;
+  const T39 v39_;
+  const T40 v40_;
+  const T41 v41_;
+  const T42 v42_;
+  const T43 v43_;
+  const T44 v44_;
+  const T45 v45_;
+  const T46 v46_;
+  const T47 v47_;
+  const T48 v48_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43, typename T44, typename T45,
+    typename T46, typename T47, typename T48, typename T49>
+class ValueArray49 {
+ public:
+  ValueArray49(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
+      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
+      T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47, T48 v48,
+      T49 v49) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
+      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
+      v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
+      v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26),
+      v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32),
+      v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38),
+      v39_(v39), v40_(v40), v41_(v41), v42_(v42), v43_(v43), v44_(v44),
+      v45_(v45), v46_(v46), v47_(v47), v48_(v48), v49_(v49) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
+        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
+        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
+        static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),
+        static_cast<T>(v42_), static_cast<T>(v43_), static_cast<T>(v44_),
+        static_cast<T>(v45_), static_cast<T>(v46_), static_cast<T>(v47_),
+        static_cast<T>(v48_), static_cast<T>(v49_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray49& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+  const T23 v23_;
+  const T24 v24_;
+  const T25 v25_;
+  const T26 v26_;
+  const T27 v27_;
+  const T28 v28_;
+  const T29 v29_;
+  const T30 v30_;
+  const T31 v31_;
+  const T32 v32_;
+  const T33 v33_;
+  const T34 v34_;
+  const T35 v35_;
+  const T36 v36_;
+  const T37 v37_;
+  const T38 v38_;
+  const T39 v39_;
+  const T40 v40_;
+  const T41 v41_;
+  const T42 v42_;
+  const T43 v43_;
+  const T44 v44_;
+  const T45 v45_;
+  const T46 v46_;
+  const T47 v47_;
+  const T48 v48_;
+  const T49 v49_;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43, typename T44, typename T45,
+    typename T46, typename T47, typename T48, typename T49, typename T50>
+class ValueArray50 {
+ public:
+  ValueArray50(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,
+      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,
+      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,
+      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,
+      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,
+      T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47, T48 v48, T49 v49,
+      T50 v50) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),
+      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),
+      v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),
+      v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26),
+      v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32),
+      v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38),
+      v39_(v39), v40_(v40), v41_(v41), v42_(v42), v43_(v43), v44_(v44),
+      v45_(v45), v46_(v46), v47_(v47), v48_(v48), v49_(v49), v50_(v50) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),
+        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),
+        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),
+        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),
+        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),
+        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),
+        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),
+        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),
+        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),
+        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),
+        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),
+        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),
+        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),
+        static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),
+        static_cast<T>(v42_), static_cast<T>(v43_), static_cast<T>(v44_),
+        static_cast<T>(v45_), static_cast<T>(v46_), static_cast<T>(v47_),
+        static_cast<T>(v48_), static_cast<T>(v49_), static_cast<T>(v50_)};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray50& other);
+
+  const T1 v1_;
+  const T2 v2_;
+  const T3 v3_;
+  const T4 v4_;
+  const T5 v5_;
+  const T6 v6_;
+  const T7 v7_;
+  const T8 v8_;
+  const T9 v9_;
+  const T10 v10_;
+  const T11 v11_;
+  const T12 v12_;
+  const T13 v13_;
+  const T14 v14_;
+  const T15 v15_;
+  const T16 v16_;
+  const T17 v17_;
+  const T18 v18_;
+  const T19 v19_;
+  const T20 v20_;
+  const T21 v21_;
+  const T22 v22_;
+  const T23 v23_;
+  const T24 v24_;
+  const T25 v25_;
+  const T26 v26_;
+  const T27 v27_;
+  const T28 v28_;
+  const T29 v29_;
+  const T30 v30_;
+  const T31 v31_;
+  const T32 v32_;
+  const T33 v33_;
+  const T34 v34_;
+  const T35 v35_;
+  const T36 v36_;
+  const T37 v37_;
+  const T38 v38_;
+  const T39 v39_;
+  const T40 v40_;
+  const T41 v41_;
+  const T42 v42_;
+  const T43 v43_;
+  const T44 v44_;
+  const T45 v45_;
+  const T46 v46_;
+  const T47 v47_;
+  const T48 v48_;
+  const T49 v49_;
+  const T50 v50_;
+};
+
+# if GTEST_HAS_COMBINE
+// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
+//
+// Generates values from the Cartesian product of values produced
+// by the argument generators.
+//
+template <typename T1, typename T2>
+class CartesianProductGenerator2
+    : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2> > {
+ public:
+  typedef ::std::tr1::tuple<T1, T2> ParamType;
+
+  CartesianProductGenerator2(const ParamGenerator<T1>& g1,
+      const ParamGenerator<T2>& g2)
+      : g1_(g1), g2_(g2) {}
+  virtual ~CartesianProductGenerator2() {}
+
+  virtual ParamIteratorInterface<ParamType>* Begin() const {
+    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin());
+  }
+  virtual ParamIteratorInterface<ParamType>* End() const {
+    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end());
+  }
+
+ private:
+  class Iterator : public ParamIteratorInterface<ParamType> {
+   public:
+    Iterator(const ParamGeneratorInterface<ParamType>* base,
+      const ParamGenerator<T1>& g1,
+      const typename ParamGenerator<T1>::iterator& current1,
+      const ParamGenerator<T2>& g2,
+      const typename ParamGenerator<T2>::iterator& current2)
+        : base_(base),
+          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
+          begin2_(g2.begin()), end2_(g2.end()), current2_(current2)    {
+      ComputeCurrentValue();
+    }
+    virtual ~Iterator() {}
+
+    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
+      return base_;
+    }
+    // Advance should not be called on beyond-of-range iterators
+    // so no component iterators must be beyond end of range, either.
+    virtual void Advance() {
+      assert(!AtEnd());
+      ++current2_;
+      if (current2_ == end2_) {
+        current2_ = begin2_;
+        ++current1_;
+      }
+      ComputeCurrentValue();
+    }
+    virtual ParamIteratorInterface<ParamType>* Clone() const {
+      return new Iterator(*this);
+    }
+    virtual const ParamType* Current() const { return &current_value_; }
+    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
+      // Having the same base generator guarantees that the other
+      // iterator is of the same type and we can downcast.
+      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
+          << "The program attempted to compare iterators "
+          << "from different generators." << std::endl;
+      const Iterator* typed_other =
+          CheckedDowncastToActualType<const Iterator>(&other);
+      // We must report iterators equal if they both point beyond their
+      // respective ranges. That can happen in a variety of fashions,
+      // so we have to consult AtEnd().
+      return (AtEnd() && typed_other->AtEnd()) ||
+         (
+          current1_ == typed_other->current1_ &&
+          current2_ == typed_other->current2_);
+    }
+
+   private:
+    Iterator(const Iterator& other)
+        : base_(other.base_),
+        begin1_(other.begin1_),
+        end1_(other.end1_),
+        current1_(other.current1_),
+        begin2_(other.begin2_),
+        end2_(other.end2_),
+        current2_(other.current2_) {
+      ComputeCurrentValue();
+    }
+
+    void ComputeCurrentValue() {
+      if (!AtEnd())
+        current_value_ = ParamType(*current1_, *current2_);
+    }
+    bool AtEnd() const {
+      // We must report iterator past the end of the range when either of the
+      // component iterators has reached the end of its range.
+      return
+          current1_ == end1_ ||
+          current2_ == end2_;
+    }
+
+    // No implementation - assignment is unsupported.
+    void operator=(const Iterator& other);
+
+    const ParamGeneratorInterface<ParamType>* const base_;
+    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
+    // current[i]_ is the actual traversing iterator.
+    const typename ParamGenerator<T1>::iterator begin1_;
+    const typename ParamGenerator<T1>::iterator end1_;
+    typename ParamGenerator<T1>::iterator current1_;
+    const typename ParamGenerator<T2>::iterator begin2_;
+    const typename ParamGenerator<T2>::iterator end2_;
+    typename ParamGenerator<T2>::iterator current2_;
+    ParamType current_value_;
+  };  // class CartesianProductGenerator2::Iterator
+
+  // No implementation - assignment is unsupported.
+  void operator=(const CartesianProductGenerator2& other);
+
+  const ParamGenerator<T1> g1_;
+  const ParamGenerator<T2> g2_;
+};  // class CartesianProductGenerator2
+
+
+template <typename T1, typename T2, typename T3>
+class CartesianProductGenerator3
+    : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3> > {
+ public:
+  typedef ::std::tr1::tuple<T1, T2, T3> ParamType;
+
+  CartesianProductGenerator3(const ParamGenerator<T1>& g1,
+      const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3)
+      : g1_(g1), g2_(g2), g3_(g3) {}
+  virtual ~CartesianProductGenerator3() {}
+
+  virtual ParamIteratorInterface<ParamType>* Begin() const {
+    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
+        g3_.begin());
+  }
+  virtual ParamIteratorInterface<ParamType>* End() const {
+    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end());
+  }
+
+ private:
+  class Iterator : public ParamIteratorInterface<ParamType> {
+   public:
+    Iterator(const ParamGeneratorInterface<ParamType>* base,
+      const ParamGenerator<T1>& g1,
+      const typename ParamGenerator<T1>::iterator& current1,
+      const ParamGenerator<T2>& g2,
+      const typename ParamGenerator<T2>::iterator& current2,
+      const ParamGenerator<T3>& g3,
+      const typename ParamGenerator<T3>::iterator& current3)
+        : base_(base),
+          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
+          begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
+          begin3_(g3.begin()), end3_(g3.end()), current3_(current3)    {
+      ComputeCurrentValue();
+    }
+    virtual ~Iterator() {}
+
+    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
+      return base_;
+    }
+    // Advance should not be called on beyond-of-range iterators
+    // so no component iterators must be beyond end of range, either.
+    virtual void Advance() {
+      assert(!AtEnd());
+      ++current3_;
+      if (current3_ == end3_) {
+        current3_ = begin3_;
+        ++current2_;
+      }
+      if (current2_ == end2_) {
+        current2_ = begin2_;
+        ++current1_;
+      }
+      ComputeCurrentValue();
+    }
+    virtual ParamIteratorInterface<ParamType>* Clone() const {
+      return new Iterator(*this);
+    }
+    virtual const ParamType* Current() const { return &current_value_; }
+    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
+      // Having the same base generator guarantees that the other
+      // iterator is of the same type and we can downcast.
+      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
+          << "The program attempted to compare iterators "
+          << "from different generators." << std::endl;
+      const Iterator* typed_other =
+          CheckedDowncastToActualType<const Iterator>(&other);
+      // We must report iterators equal if they both point beyond their
+      // respective ranges. That can happen in a variety of fashions,
+      // so we have to consult AtEnd().
+      return (AtEnd() && typed_other->AtEnd()) ||
+         (
+          current1_ == typed_other->current1_ &&
+          current2_ == typed_other->current2_ &&
+          current3_ == typed_other->current3_);
+    }
+
+   private:
+    Iterator(const Iterator& other)
+        : base_(other.base_),
+        begin1_(other.begin1_),
+        end1_(other.end1_),
+        current1_(other.current1_),
+        begin2_(other.begin2_),
+        end2_(other.end2_),
+        current2_(other.current2_),
+        begin3_(other.begin3_),
+        end3_(other.end3_),
+        current3_(other.current3_) {
+      ComputeCurrentValue();
+    }
+
+    void ComputeCurrentValue() {
+      if (!AtEnd())
+        current_value_ = ParamType(*current1_, *current2_, *current3_);
+    }
+    bool AtEnd() const {
+      // We must report iterator past the end of the range when either of the
+      // component iterators has reached the end of its range.
+      return
+          current1_ == end1_ ||
+          current2_ == end2_ ||
+          current3_ == end3_;
+    }
+
+    // No implementation - assignment is unsupported.
+    void operator=(const Iterator& other);
+
+    const ParamGeneratorInterface<ParamType>* const base_;
+    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
+    // current[i]_ is the actual traversing iterator.
+    const typename ParamGenerator<T1>::iterator begin1_;
+    const typename ParamGenerator<T1>::iterator end1_;
+    typename ParamGenerator<T1>::iterator current1_;
+    const typename ParamGenerator<T2>::iterator begin2_;
+    const typename ParamGenerator<T2>::iterator end2_;
+    typename ParamGenerator<T2>::iterator current2_;
+    const typename ParamGenerator<T3>::iterator begin3_;
+    const typename ParamGenerator<T3>::iterator end3_;
+    typename ParamGenerator<T3>::iterator current3_;
+    ParamType current_value_;
+  };  // class CartesianProductGenerator3::Iterator
+
+  // No implementation - assignment is unsupported.
+  void operator=(const CartesianProductGenerator3& other);
+
+  const ParamGenerator<T1> g1_;
+  const ParamGenerator<T2> g2_;
+  const ParamGenerator<T3> g3_;
+};  // class CartesianProductGenerator3
+
+
+template <typename T1, typename T2, typename T3, typename T4>
+class CartesianProductGenerator4
+    : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3, T4> > {
+ public:
+  typedef ::std::tr1::tuple<T1, T2, T3, T4> ParamType;
+
+  CartesianProductGenerator4(const ParamGenerator<T1>& g1,
+      const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,
+      const ParamGenerator<T4>& g4)
+      : g1_(g1), g2_(g2), g3_(g3), g4_(g4) {}
+  virtual ~CartesianProductGenerator4() {}
+
+  virtual ParamIteratorInterface<ParamType>* Begin() const {
+    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
+        g3_.begin(), g4_, g4_.begin());
+  }
+  virtual ParamIteratorInterface<ParamType>* End() const {
+    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),
+        g4_, g4_.end());
+  }
+
+ private:
+  class Iterator : public ParamIteratorInterface<ParamType> {
+   public:
+    Iterator(const ParamGeneratorInterface<ParamType>* base,
+      const ParamGenerator<T1>& g1,
+      const typename ParamGenerator<T1>::iterator& current1,
+      const ParamGenerator<T2>& g2,
+      const typename ParamGenerator<T2>::iterator& current2,
+      const ParamGenerator<T3>& g3,
+      const typename ParamGenerator<T3>::iterator& current3,
+      const ParamGenerator<T4>& g4,
+      const typename ParamGenerator<T4>::iterator& current4)
+        : base_(base),
+          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
+          begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
+          begin3_(g3.begin()), end3_(g3.end()), current3_(current3),
+          begin4_(g4.begin()), end4_(g4.end()), current4_(current4)    {
+      ComputeCurrentValue();
+    }
+    virtual ~Iterator() {}
+
+    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
+      return base_;
+    }
+    // Advance should not be called on beyond-of-range iterators
+    // so no component iterators must be beyond end of range, either.
+    virtual void Advance() {
+      assert(!AtEnd());
+      ++current4_;
+      if (current4_ == end4_) {
+        current4_ = begin4_;
+        ++current3_;
+      }
+      if (current3_ == end3_) {
+        current3_ = begin3_;
+        ++current2_;
+      }
+      if (current2_ == end2_) {
+        current2_ = begin2_;
+        ++current1_;
+      }
+      ComputeCurrentValue();
+    }
+    virtual ParamIteratorInterface<ParamType>* Clone() const {
+      return new Iterator(*this);
+    }
+    virtual const ParamType* Current() const { return &current_value_; }
+    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
+      // Having the same base generator guarantees that the other
+      // iterator is of the same type and we can downcast.
+      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
+          << "The program attempted to compare iterators "
+          << "from different generators." << std::endl;
+      const Iterator* typed_other =
+          CheckedDowncastToActualType<const Iterator>(&other);
+      // We must report iterators equal if they both point beyond their
+      // respective ranges. That can happen in a variety of fashions,
+      // so we have to consult AtEnd().
+      return (AtEnd() && typed_other->AtEnd()) ||
+         (
+          current1_ == typed_other->current1_ &&
+          current2_ == typed_other->current2_ &&
+          current3_ == typed_other->current3_ &&
+          current4_ == typed_other->current4_);
+    }
+
+   private:
+    Iterator(const Iterator& other)
+        : base_(other.base_),
+        begin1_(other.begin1_),
+        end1_(other.end1_),
+        current1_(other.current1_),
+        begin2_(other.begin2_),
+        end2_(other.end2_),
+        current2_(other.current2_),
+        begin3_(other.begin3_),
+        end3_(other.end3_),
+        current3_(other.current3_),
+        begin4_(other.begin4_),
+        end4_(other.end4_),
+        current4_(other.current4_) {
+      ComputeCurrentValue();
+    }
+
+    void ComputeCurrentValue() {
+      if (!AtEnd())
+        current_value_ = ParamType(*current1_, *current2_, *current3_,
+            *current4_);
+    }
+    bool AtEnd() const {
+      // We must report iterator past the end of the range when either of the
+      // component iterators has reached the end of its range.
+      return
+          current1_ == end1_ ||
+          current2_ == end2_ ||
+          current3_ == end3_ ||
+          current4_ == end4_;
+    }
+
+    // No implementation - assignment is unsupported.
+    void operator=(const Iterator& other);
+
+    const ParamGeneratorInterface<ParamType>* const base_;
+    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
+    // current[i]_ is the actual traversing iterator.
+    const typename ParamGenerator<T1>::iterator begin1_;
+    const typename ParamGenerator<T1>::iterator end1_;
+    typename ParamGenerator<T1>::iterator current1_;
+    const typename ParamGenerator<T2>::iterator begin2_;
+    const typename ParamGenerator<T2>::iterator end2_;
+    typename ParamGenerator<T2>::iterator current2_;
+    const typename ParamGenerator<T3>::iterator begin3_;
+    const typename ParamGenerator<T3>::iterator end3_;
+    typename ParamGenerator<T3>::iterator current3_;
+    const typename ParamGenerator<T4>::iterator begin4_;
+    const typename ParamGenerator<T4>::iterator end4_;
+    typename ParamGenerator<T4>::iterator current4_;
+    ParamType current_value_;
+  };  // class CartesianProductGenerator4::Iterator
+
+  // No implementation - assignment is unsupported.
+  void operator=(const CartesianProductGenerator4& other);
+
+  const ParamGenerator<T1> g1_;
+  const ParamGenerator<T2> g2_;
+  const ParamGenerator<T3> g3_;
+  const ParamGenerator<T4> g4_;
+};  // class CartesianProductGenerator4
+
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5>
+class CartesianProductGenerator5
+    : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3, T4, T5> > {
+ public:
+  typedef ::std::tr1::tuple<T1, T2, T3, T4, T5> ParamType;
+
+  CartesianProductGenerator5(const ParamGenerator<T1>& g1,
+      const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,
+      const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5)
+      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5) {}
+  virtual ~CartesianProductGenerator5() {}
+
+  virtual ParamIteratorInterface<ParamType>* Begin() const {
+    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
+        g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin());
+  }
+  virtual ParamIteratorInterface<ParamType>* End() const {
+    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),
+        g4_, g4_.end(), g5_, g5_.end());
+  }
+
+ private:
+  class Iterator : public ParamIteratorInterface<ParamType> {
+   public:
+    Iterator(const ParamGeneratorInterface<ParamType>* base,
+      const ParamGenerator<T1>& g1,
+      const typename ParamGenerator<T1>::iterator& current1,
+      const ParamGenerator<T2>& g2,
+      const typename ParamGenerator<T2>::iterator& current2,
+      const ParamGenerator<T3>& g3,
+      const typename ParamGenerator<T3>::iterator& current3,
+      const ParamGenerator<T4>& g4,
+      const typename ParamGenerator<T4>::iterator& current4,
+      const ParamGenerator<T5>& g5,
+      const typename ParamGenerator<T5>::iterator& current5)
+        : base_(base),
+          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
+          begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
+          begin3_(g3.begin()), end3_(g3.end()), current3_(current3),
+          begin4_(g4.begin()), end4_(g4.end()), current4_(current4),
+          begin5_(g5.begin()), end5_(g5.end()), current5_(current5)    {
+      ComputeCurrentValue();
+    }
+    virtual ~Iterator() {}
+
+    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
+      return base_;
+    }
+    // Advance should not be called on beyond-of-range iterators
+    // so no component iterators must be beyond end of range, either.
+    virtual void Advance() {
+      assert(!AtEnd());
+      ++current5_;
+      if (current5_ == end5_) {
+        current5_ = begin5_;
+        ++current4_;
+      }
+      if (current4_ == end4_) {
+        current4_ = begin4_;
+        ++current3_;
+      }
+      if (current3_ == end3_) {
+        current3_ = begin3_;
+        ++current2_;
+      }
+      if (current2_ == end2_) {
+        current2_ = begin2_;
+        ++current1_;
+      }
+      ComputeCurrentValue();
+    }
+    virtual ParamIteratorInterface<ParamType>* Clone() const {
+      return new Iterator(*this);
+    }
+    virtual const ParamType* Current() const { return &current_value_; }
+    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
+      // Having the same base generator guarantees that the other
+      // iterator is of the same type and we can downcast.
+      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
+          << "The program attempted to compare iterators "
+          << "from different generators." << std::endl;
+      const Iterator* typed_other =
+          CheckedDowncastToActualType<const Iterator>(&other);
+      // We must report iterators equal if they both point beyond their
+      // respective ranges. That can happen in a variety of fashions,
+      // so we have to consult AtEnd().
+      return (AtEnd() && typed_other->AtEnd()) ||
+         (
+          current1_ == typed_other->current1_ &&
+          current2_ == typed_other->current2_ &&
+          current3_ == typed_other->current3_ &&
+          current4_ == typed_other->current4_ &&
+          current5_ == typed_other->current5_);
+    }
+
+   private:
+    Iterator(const Iterator& other)
+        : base_(other.base_),
+        begin1_(other.begin1_),
+        end1_(other.end1_),
+        current1_(other.current1_),
+        begin2_(other.begin2_),
+        end2_(other.end2_),
+        current2_(other.current2_),
+        begin3_(other.begin3_),
+        end3_(other.end3_),
+        current3_(other.current3_),
+        begin4_(other.begin4_),
+        end4_(other.end4_),
+        current4_(other.current4_),
+        begin5_(other.begin5_),
+        end5_(other.end5_),
+        current5_(other.current5_) {
+      ComputeCurrentValue();
+    }
+
+    void ComputeCurrentValue() {
+      if (!AtEnd())
+        current_value_ = ParamType(*current1_, *current2_, *current3_,
+            *current4_, *current5_);
+    }
+    bool AtEnd() const {
+      // We must report iterator past the end of the range when either of the
+      // component iterators has reached the end of its range.
+      return
+          current1_ == end1_ ||
+          current2_ == end2_ ||
+          current3_ == end3_ ||
+          current4_ == end4_ ||
+          current5_ == end5_;
+    }
+
+    // No implementation - assignment is unsupported.
+    void operator=(const Iterator& other);
+
+    const ParamGeneratorInterface<ParamType>* const base_;
+    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
+    // current[i]_ is the actual traversing iterator.
+    const typename ParamGenerator<T1>::iterator begin1_;
+    const typename ParamGenerator<T1>::iterator end1_;
+    typename ParamGenerator<T1>::iterator current1_;
+    const typename ParamGenerator<T2>::iterator begin2_;
+    const typename ParamGenerator<T2>::iterator end2_;
+    typename ParamGenerator<T2>::iterator current2_;
+    const typename ParamGenerator<T3>::iterator begin3_;
+    const typename ParamGenerator<T3>::iterator end3_;
+    typename ParamGenerator<T3>::iterator current3_;
+    const typename ParamGenerator<T4>::iterator begin4_;
+    const typename ParamGenerator<T4>::iterator end4_;
+    typename ParamGenerator<T4>::iterator current4_;
+    const typename ParamGenerator<T5>::iterator begin5_;
+    const typename ParamGenerator<T5>::iterator end5_;
+    typename ParamGenerator<T5>::iterator current5_;
+    ParamType current_value_;
+  };  // class CartesianProductGenerator5::Iterator
+
+  // No implementation - assignment is unsupported.
+  void operator=(const CartesianProductGenerator5& other);
+
+  const ParamGenerator<T1> g1_;
+  const ParamGenerator<T2> g2_;
+  const ParamGenerator<T3> g3_;
+  const ParamGenerator<T4> g4_;
+  const ParamGenerator<T5> g5_;
+};  // class CartesianProductGenerator5
+
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6>
+class CartesianProductGenerator6
+    : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3, T4, T5,
+        T6> > {
+ public:
+  typedef ::std::tr1::tuple<T1, T2, T3, T4, T5, T6> ParamType;
+
+  CartesianProductGenerator6(const ParamGenerator<T1>& g1,
+      const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,
+      const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5,
+      const ParamGenerator<T6>& g6)
+      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6) {}
+  virtual ~CartesianProductGenerator6() {}
+
+  virtual ParamIteratorInterface<ParamType>* Begin() const {
+    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
+        g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin(), g6_, g6_.begin());
+  }
+  virtual ParamIteratorInterface<ParamType>* End() const {
+    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),
+        g4_, g4_.end(), g5_, g5_.end(), g6_, g6_.end());
+  }
+
+ private:
+  class Iterator : public ParamIteratorInterface<ParamType> {
+   public:
+    Iterator(const ParamGeneratorInterface<ParamType>* base,
+      const ParamGenerator<T1>& g1,
+      const typename ParamGenerator<T1>::iterator& current1,
+      const ParamGenerator<T2>& g2,
+      const typename ParamGenerator<T2>::iterator& current2,
+      const ParamGenerator<T3>& g3,
+      const typename ParamGenerator<T3>::iterator& current3,
+      const ParamGenerator<T4>& g4,
+      const typename ParamGenerator<T4>::iterator& current4,
+      const ParamGenerator<T5>& g5,
+      const typename ParamGenerator<T5>::iterator& current5,
+      const ParamGenerator<T6>& g6,
+      const typename ParamGenerator<T6>::iterator& current6)
+        : base_(base),
+          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
+          begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
+          begin3_(g3.begin()), end3_(g3.end()), current3_(current3),
+          begin4_(g4.begin()), end4_(g4.end()), current4_(current4),
+          begin5_(g5.begin()), end5_(g5.end()), current5_(current5),
+          begin6_(g6.begin()), end6_(g6.end()), current6_(current6)    {
+      ComputeCurrentValue();
+    }
+    virtual ~Iterator() {}
+
+    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
+      return base_;
+    }
+    // Advance should not be called on beyond-of-range iterators
+    // so no component iterators must be beyond end of range, either.
+    virtual void Advance() {
+      assert(!AtEnd());
+      ++current6_;
+      if (current6_ == end6_) {
+        current6_ = begin6_;
+        ++current5_;
+      }
+      if (current5_ == end5_) {
+        current5_ = begin5_;
+        ++current4_;
+      }
+      if (current4_ == end4_) {
+        current4_ = begin4_;
+        ++current3_;
+      }
+      if (current3_ == end3_) {
+        current3_ = begin3_;
+        ++current2_;
+      }
+      if (current2_ == end2_) {
+        current2_ = begin2_;
+        ++current1_;
+      }
+      ComputeCurrentValue();
+    }
+    virtual ParamIteratorInterface<ParamType>* Clone() const {
+      return new Iterator(*this);
+    }
+    virtual const ParamType* Current() const { return &current_value_; }
+    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
+      // Having the same base generator guarantees that the other
+      // iterator is of the same type and we can downcast.
+      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
+          << "The program attempted to compare iterators "
+          << "from different generators." << std::endl;
+      const Iterator* typed_other =
+          CheckedDowncastToActualType<const Iterator>(&other);
+      // We must report iterators equal if they both point beyond their
+      // respective ranges. That can happen in a variety of fashions,
+      // so we have to consult AtEnd().
+      return (AtEnd() && typed_other->AtEnd()) ||
+         (
+          current1_ == typed_other->current1_ &&
+          current2_ == typed_other->current2_ &&
+          current3_ == typed_other->current3_ &&
+          current4_ == typed_other->current4_ &&
+          current5_ == typed_other->current5_ &&
+          current6_ == typed_other->current6_);
+    }
+
+   private:
+    Iterator(const Iterator& other)
+        : base_(other.base_),
+        begin1_(other.begin1_),
+        end1_(other.end1_),
+        current1_(other.current1_),
+        begin2_(other.begin2_),
+        end2_(other.end2_),
+        current2_(other.current2_),
+        begin3_(other.begin3_),
+        end3_(other.end3_),
+        current3_(other.current3_),
+        begin4_(other.begin4_),
+        end4_(other.end4_),
+        current4_(other.current4_),
+        begin5_(other.begin5_),
+        end5_(other.end5_),
+        current5_(other.current5_),
+        begin6_(other.begin6_),
+        end6_(other.end6_),
+        current6_(other.current6_) {
+      ComputeCurrentValue();
+    }
+
+    void ComputeCurrentValue() {
+      if (!AtEnd())
+        current_value_ = ParamType(*current1_, *current2_, *current3_,
+            *current4_, *current5_, *current6_);
+    }
+    bool AtEnd() const {
+      // We must report iterator past the end of the range when either of the
+      // component iterators has reached the end of its range.
+      return
+          current1_ == end1_ ||
+          current2_ == end2_ ||
+          current3_ == end3_ ||
+          current4_ == end4_ ||
+          current5_ == end5_ ||
+          current6_ == end6_;
+    }
+
+    // No implementation - assignment is unsupported.
+    void operator=(const Iterator& other);
+
+    const ParamGeneratorInterface<ParamType>* const base_;
+    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
+    // current[i]_ is the actual traversing iterator.
+    const typename ParamGenerator<T1>::iterator begin1_;
+    const typename ParamGenerator<T1>::iterator end1_;
+    typename ParamGenerator<T1>::iterator current1_;
+    const typename ParamGenerator<T2>::iterator begin2_;
+    const typename ParamGenerator<T2>::iterator end2_;
+    typename ParamGenerator<T2>::iterator current2_;
+    const typename ParamGenerator<T3>::iterator begin3_;
+    const typename ParamGenerator<T3>::iterator end3_;
+    typename ParamGenerator<T3>::iterator current3_;
+    const typename ParamGenerator<T4>::iterator begin4_;
+    const typename ParamGenerator<T4>::iterator end4_;
+    typename ParamGenerator<T4>::iterator current4_;
+    const typename ParamGenerator<T5>::iterator begin5_;
+    const typename ParamGenerator<T5>::iterator end5_;
+    typename ParamGenerator<T5>::iterator current5_;
+    const typename ParamGenerator<T6>::iterator begin6_;
+    const typename ParamGenerator<T6>::iterator end6_;
+    typename ParamGenerator<T6>::iterator current6_;
+    ParamType current_value_;
+  };  // class CartesianProductGenerator6::Iterator
+
+  // No implementation - assignment is unsupported.
+  void operator=(const CartesianProductGenerator6& other);
+
+  const ParamGenerator<T1> g1_;
+  const ParamGenerator<T2> g2_;
+  const ParamGenerator<T3> g3_;
+  const ParamGenerator<T4> g4_;
+  const ParamGenerator<T5> g5_;
+  const ParamGenerator<T6> g6_;
+};  // class CartesianProductGenerator6
+
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7>
+class CartesianProductGenerator7
+    : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6,
+        T7> > {
+ public:
+  typedef ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7> ParamType;
+
+  CartesianProductGenerator7(const ParamGenerator<T1>& g1,
+      const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,
+      const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5,
+      const ParamGenerator<T6>& g6, const ParamGenerator<T7>& g7)
+      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7) {}
+  virtual ~CartesianProductGenerator7() {}
+
+  virtual ParamIteratorInterface<ParamType>* Begin() const {
+    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
+        g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin(), g6_, g6_.begin(), g7_,
+        g7_.begin());
+  }
+  virtual ParamIteratorInterface<ParamType>* End() const {
+    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),
+        g4_, g4_.end(), g5_, g5_.end(), g6_, g6_.end(), g7_, g7_.end());
+  }
+
+ private:
+  class Iterator : public ParamIteratorInterface<ParamType> {
+   public:
+    Iterator(const ParamGeneratorInterface<ParamType>* base,
+      const ParamGenerator<T1>& g1,
+      const typename ParamGenerator<T1>::iterator& current1,
+      const ParamGenerator<T2>& g2,
+      const typename ParamGenerator<T2>::iterator& current2,
+      const ParamGenerator<T3>& g3,
+      const typename ParamGenerator<T3>::iterator& current3,
+      const ParamGenerator<T4>& g4,
+      const typename ParamGenerator<T4>::iterator& current4,
+      const ParamGenerator<T5>& g5,
+      const typename ParamGenerator<T5>::iterator& current5,
+      const ParamGenerator<T6>& g6,
+      const typename ParamGenerator<T6>::iterator& current6,
+      const ParamGenerator<T7>& g7,
+      const typename ParamGenerator<T7>::iterator& current7)
+        : base_(base),
+          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
+          begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
+          begin3_(g3.begin()), end3_(g3.end()), current3_(current3),
+          begin4_(g4.begin()), end4_(g4.end()), current4_(current4),
+          begin5_(g5.begin()), end5_(g5.end()), current5_(current5),
+          begin6_(g6.begin()), end6_(g6.end()), current6_(current6),
+          begin7_(g7.begin()), end7_(g7.end()), current7_(current7)    {
+      ComputeCurrentValue();
+    }
+    virtual ~Iterator() {}
+
+    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
+      return base_;
+    }
+    // Advance should not be called on beyond-of-range iterators
+    // so no component iterators must be beyond end of range, either.
+    virtual void Advance() {
+      assert(!AtEnd());
+      ++current7_;
+      if (current7_ == end7_) {
+        current7_ = begin7_;
+        ++current6_;
+      }
+      if (current6_ == end6_) {
+        current6_ = begin6_;
+        ++current5_;
+      }
+      if (current5_ == end5_) {
+        current5_ = begin5_;
+        ++current4_;
+      }
+      if (current4_ == end4_) {
+        current4_ = begin4_;
+        ++current3_;
+      }
+      if (current3_ == end3_) {
+        current3_ = begin3_;
+        ++current2_;
+      }
+      if (current2_ == end2_) {
+        current2_ = begin2_;
+        ++current1_;
+      }
+      ComputeCurrentValue();
+    }
+    virtual ParamIteratorInterface<ParamType>* Clone() const {
+      return new Iterator(*this);
+    }
+    virtual const ParamType* Current() const { return &current_value_; }
+    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
+      // Having the same base generator guarantees that the other
+      // iterator is of the same type and we can downcast.
+      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
+          << "The program attempted to compare iterators "
+          << "from different generators." << std::endl;
+      const Iterator* typed_other =
+          CheckedDowncastToActualType<const Iterator>(&other);
+      // We must report iterators equal if they both point beyond their
+      // respective ranges. That can happen in a variety of fashions,
+      // so we have to consult AtEnd().
+      return (AtEnd() && typed_other->AtEnd()) ||
+         (
+          current1_ == typed_other->current1_ &&
+          current2_ == typed_other->current2_ &&
+          current3_ == typed_other->current3_ &&
+          current4_ == typed_other->current4_ &&
+          current5_ == typed_other->current5_ &&
+          current6_ == typed_other->current6_ &&
+          current7_ == typed_other->current7_);
+    }
+
+   private:
+    Iterator(const Iterator& other)
+        : base_(other.base_),
+        begin1_(other.begin1_),
+        end1_(other.end1_),
+        current1_(other.current1_),
+        begin2_(other.begin2_),
+        end2_(other.end2_),
+        current2_(other.current2_),
+        begin3_(other.begin3_),
+        end3_(other.end3_),
+        current3_(other.current3_),
+        begin4_(other.begin4_),
+        end4_(other.end4_),
+        current4_(other.current4_),
+        begin5_(other.begin5_),
+        end5_(other.end5_),
+        current5_(other.current5_),
+        begin6_(other.begin6_),
+        end6_(other.end6_),
+        current6_(other.current6_),
+        begin7_(other.begin7_),
+        end7_(other.end7_),
+        current7_(other.current7_) {
+      ComputeCurrentValue();
+    }
+
+    void ComputeCurrentValue() {
+      if (!AtEnd())
+        current_value_ = ParamType(*current1_, *current2_, *current3_,
+            *current4_, *current5_, *current6_, *current7_);
+    }
+    bool AtEnd() const {
+      // We must report iterator past the end of the range when either of the
+      // component iterators has reached the end of its range.
+      return
+          current1_ == end1_ ||
+          current2_ == end2_ ||
+          current3_ == end3_ ||
+          current4_ == end4_ ||
+          current5_ == end5_ ||
+          current6_ == end6_ ||
+          current7_ == end7_;
+    }
+
+    // No implementation - assignment is unsupported.
+    void operator=(const Iterator& other);
+
+    const ParamGeneratorInterface<ParamType>* const base_;
+    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
+    // current[i]_ is the actual traversing iterator.
+    const typename ParamGenerator<T1>::iterator begin1_;
+    const typename ParamGenerator<T1>::iterator end1_;
+    typename ParamGenerator<T1>::iterator current1_;
+    const typename ParamGenerator<T2>::iterator begin2_;
+    const typename ParamGenerator<T2>::iterator end2_;
+    typename ParamGenerator<T2>::iterator current2_;
+    const typename ParamGenerator<T3>::iterator begin3_;
+    const typename ParamGenerator<T3>::iterator end3_;
+    typename ParamGenerator<T3>::iterator current3_;
+    const typename ParamGenerator<T4>::iterator begin4_;
+    const typename ParamGenerator<T4>::iterator end4_;
+    typename ParamGenerator<T4>::iterator current4_;
+    const typename ParamGenerator<T5>::iterator begin5_;
+    const typename ParamGenerator<T5>::iterator end5_;
+    typename ParamGenerator<T5>::iterator current5_;
+    const typename ParamGenerator<T6>::iterator begin6_;
+    const typename ParamGenerator<T6>::iterator end6_;
+    typename ParamGenerator<T6>::iterator current6_;
+    const typename ParamGenerator<T7>::iterator begin7_;
+    const typename ParamGenerator<T7>::iterator end7_;
+    typename ParamGenerator<T7>::iterator current7_;
+    ParamType current_value_;
+  };  // class CartesianProductGenerator7::Iterator
+
+  // No implementation - assignment is unsupported.
+  void operator=(const CartesianProductGenerator7& other);
+
+  const ParamGenerator<T1> g1_;
+  const ParamGenerator<T2> g2_;
+  const ParamGenerator<T3> g3_;
+  const ParamGenerator<T4> g4_;
+  const ParamGenerator<T5> g5_;
+  const ParamGenerator<T6> g6_;
+  const ParamGenerator<T7> g7_;
+};  // class CartesianProductGenerator7
+
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8>
+class CartesianProductGenerator8
+    : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6,
+        T7, T8> > {
+ public:
+  typedef ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8> ParamType;
+
+  CartesianProductGenerator8(const ParamGenerator<T1>& g1,
+      const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,
+      const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5,
+      const ParamGenerator<T6>& g6, const ParamGenerator<T7>& g7,
+      const ParamGenerator<T8>& g8)
+      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7),
+          g8_(g8) {}
+  virtual ~CartesianProductGenerator8() {}
+
+  virtual ParamIteratorInterface<ParamType>* Begin() const {
+    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
+        g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin(), g6_, g6_.begin(), g7_,
+        g7_.begin(), g8_, g8_.begin());
+  }
+  virtual ParamIteratorInterface<ParamType>* End() const {
+    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),
+        g4_, g4_.end(), g5_, g5_.end(), g6_, g6_.end(), g7_, g7_.end(), g8_,
+        g8_.end());
+  }
+
+ private:
+  class Iterator : public ParamIteratorInterface<ParamType> {
+   public:
+    Iterator(const ParamGeneratorInterface<ParamType>* base,
+      const ParamGenerator<T1>& g1,
+      const typename ParamGenerator<T1>::iterator& current1,
+      const ParamGenerator<T2>& g2,
+      const typename ParamGenerator<T2>::iterator& current2,
+      const ParamGenerator<T3>& g3,
+      const typename ParamGenerator<T3>::iterator& current3,
+      const ParamGenerator<T4>& g4,
+      const typename ParamGenerator<T4>::iterator& current4,
+      const ParamGenerator<T5>& g5,
+      const typename ParamGenerator<T5>::iterator& current5,
+      const ParamGenerator<T6>& g6,
+      const typename ParamGenerator<T6>::iterator& current6,
+      const ParamGenerator<T7>& g7,
+      const typename ParamGenerator<T7>::iterator& current7,
+      const ParamGenerator<T8>& g8,
+      const typename ParamGenerator<T8>::iterator& current8)
+        : base_(base),
+          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
+          begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
+          begin3_(g3.begin()), end3_(g3.end()), current3_(current3),
+          begin4_(g4.begin()), end4_(g4.end()), current4_(current4),
+          begin5_(g5.begin()), end5_(g5.end()), current5_(current5),
+          begin6_(g6.begin()), end6_(g6.end()), current6_(current6),
+          begin7_(g7.begin()), end7_(g7.end()), current7_(current7),
+          begin8_(g8.begin()), end8_(g8.end()), current8_(current8)    {
+      ComputeCurrentValue();
+    }
+    virtual ~Iterator() {}
+
+    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
+      return base_;
+    }
+    // Advance should not be called on beyond-of-range iterators
+    // so no component iterators must be beyond end of range, either.
+    virtual void Advance() {
+      assert(!AtEnd());
+      ++current8_;
+      if (current8_ == end8_) {
+        current8_ = begin8_;
+        ++current7_;
+      }
+      if (current7_ == end7_) {
+        current7_ = begin7_;
+        ++current6_;
+      }
+      if (current6_ == end6_) {
+        current6_ = begin6_;
+        ++current5_;
+      }
+      if (current5_ == end5_) {
+        current5_ = begin5_;
+        ++current4_;
+      }
+      if (current4_ == end4_) {
+        current4_ = begin4_;
+        ++current3_;
+      }
+      if (current3_ == end3_) {
+        current3_ = begin3_;
+        ++current2_;
+      }
+      if (current2_ == end2_) {
+        current2_ = begin2_;
+        ++current1_;
+      }
+      ComputeCurrentValue();
+    }
+    virtual ParamIteratorInterface<ParamType>* Clone() const {
+      return new Iterator(*this);
+    }
+    virtual const ParamType* Current() const { return &current_value_; }
+    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
+      // Having the same base generator guarantees that the other
+      // iterator is of the same type and we can downcast.
+      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
+          << "The program attempted to compare iterators "
+          << "from different generators." << std::endl;
+      const Iterator* typed_other =
+          CheckedDowncastToActualType<const Iterator>(&other);
+      // We must report iterators equal if they both point beyond their
+      // respective ranges. That can happen in a variety of fashions,
+      // so we have to consult AtEnd().
+      return (AtEnd() && typed_other->AtEnd()) ||
+         (
+          current1_ == typed_other->current1_ &&
+          current2_ == typed_other->current2_ &&
+          current3_ == typed_other->current3_ &&
+          current4_ == typed_other->current4_ &&
+          current5_ == typed_other->current5_ &&
+          current6_ == typed_other->current6_ &&
+          current7_ == typed_other->current7_ &&
+          current8_ == typed_other->current8_);
+    }
+
+   private:
+    Iterator(const Iterator& other)
+        : base_(other.base_),
+        begin1_(other.begin1_),
+        end1_(other.end1_),
+        current1_(other.current1_),
+        begin2_(other.begin2_),
+        end2_(other.end2_),
+        current2_(other.current2_),
+        begin3_(other.begin3_),
+        end3_(other.end3_),
+        current3_(other.current3_),
+        begin4_(other.begin4_),
+        end4_(other.end4_),
+        current4_(other.current4_),
+        begin5_(other.begin5_),
+        end5_(other.end5_),
+        current5_(other.current5_),
+        begin6_(other.begin6_),
+        end6_(other.end6_),
+        current6_(other.current6_),
+        begin7_(other.begin7_),
+        end7_(other.end7_),
+        current7_(other.current7_),
+        begin8_(other.begin8_),
+        end8_(other.end8_),
+        current8_(other.current8_) {
+      ComputeCurrentValue();
+    }
+
+    void ComputeCurrentValue() {
+      if (!AtEnd())
+        current_value_ = ParamType(*current1_, *current2_, *current3_,
+            *current4_, *current5_, *current6_, *current7_, *current8_);
+    }
+    bool AtEnd() const {
+      // We must report iterator past the end of the range when either of the
+      // component iterators has reached the end of its range.
+      return
+          current1_ == end1_ ||
+          current2_ == end2_ ||
+          current3_ == end3_ ||
+          current4_ == end4_ ||
+          current5_ == end5_ ||
+          current6_ == end6_ ||
+          current7_ == end7_ ||
+          current8_ == end8_;
+    }
+
+    // No implementation - assignment is unsupported.
+    void operator=(const Iterator& other);
+
+    const ParamGeneratorInterface<ParamType>* const base_;
+    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
+    // current[i]_ is the actual traversing iterator.
+    const typename ParamGenerator<T1>::iterator begin1_;
+    const typename ParamGenerator<T1>::iterator end1_;
+    typename ParamGenerator<T1>::iterator current1_;
+    const typename ParamGenerator<T2>::iterator begin2_;
+    const typename ParamGenerator<T2>::iterator end2_;
+    typename ParamGenerator<T2>::iterator current2_;
+    const typename ParamGenerator<T3>::iterator begin3_;
+    const typename ParamGenerator<T3>::iterator end3_;
+    typename ParamGenerator<T3>::iterator current3_;
+    const typename ParamGenerator<T4>::iterator begin4_;
+    const typename ParamGenerator<T4>::iterator end4_;
+    typename ParamGenerator<T4>::iterator current4_;
+    const typename ParamGenerator<T5>::iterator begin5_;
+    const typename ParamGenerator<T5>::iterator end5_;
+    typename ParamGenerator<T5>::iterator current5_;
+    const typename ParamGenerator<T6>::iterator begin6_;
+    const typename ParamGenerator<T6>::iterator end6_;
+    typename ParamGenerator<T6>::iterator current6_;
+    const typename ParamGenerator<T7>::iterator begin7_;
+    const typename ParamGenerator<T7>::iterator end7_;
+    typename ParamGenerator<T7>::iterator current7_;
+    const typename ParamGenerator<T8>::iterator begin8_;
+    const typename ParamGenerator<T8>::iterator end8_;
+    typename ParamGenerator<T8>::iterator current8_;
+    ParamType current_value_;
+  };  // class CartesianProductGenerator8::Iterator
+
+  // No implementation - assignment is unsupported.
+  void operator=(const CartesianProductGenerator8& other);
+
+  const ParamGenerator<T1> g1_;
+  const ParamGenerator<T2> g2_;
+  const ParamGenerator<T3> g3_;
+  const ParamGenerator<T4> g4_;
+  const ParamGenerator<T5> g5_;
+  const ParamGenerator<T6> g6_;
+  const ParamGenerator<T7> g7_;
+  const ParamGenerator<T8> g8_;
+};  // class CartesianProductGenerator8
+
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9>
+class CartesianProductGenerator9
+    : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6,
+        T7, T8, T9> > {
+ public:
+  typedef ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8, T9> ParamType;
+
+  CartesianProductGenerator9(const ParamGenerator<T1>& g1,
+      const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,
+      const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5,
+      const ParamGenerator<T6>& g6, const ParamGenerator<T7>& g7,
+      const ParamGenerator<T8>& g8, const ParamGenerator<T9>& g9)
+      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7), g8_(g8),
+          g9_(g9) {}
+  virtual ~CartesianProductGenerator9() {}
+
+  virtual ParamIteratorInterface<ParamType>* Begin() const {
+    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
+        g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin(), g6_, g6_.begin(), g7_,
+        g7_.begin(), g8_, g8_.begin(), g9_, g9_.begin());
+  }
+  virtual ParamIteratorInterface<ParamType>* End() const {
+    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),
+        g4_, g4_.end(), g5_, g5_.end(), g6_, g6_.end(), g7_, g7_.end(), g8_,
+        g8_.end(), g9_, g9_.end());
+  }
+
+ private:
+  class Iterator : public ParamIteratorInterface<ParamType> {
+   public:
+    Iterator(const ParamGeneratorInterface<ParamType>* base,
+      const ParamGenerator<T1>& g1,
+      const typename ParamGenerator<T1>::iterator& current1,
+      const ParamGenerator<T2>& g2,
+      const typename ParamGenerator<T2>::iterator& current2,
+      const ParamGenerator<T3>& g3,
+      const typename ParamGenerator<T3>::iterator& current3,
+      const ParamGenerator<T4>& g4,
+      const typename ParamGenerator<T4>::iterator& current4,
+      const ParamGenerator<T5>& g5,
+      const typename ParamGenerator<T5>::iterator& current5,
+      const ParamGenerator<T6>& g6,
+      const typename ParamGenerator<T6>::iterator& current6,
+      const ParamGenerator<T7>& g7,
+      const typename ParamGenerator<T7>::iterator& current7,
+      const ParamGenerator<T8>& g8,
+      const typename ParamGenerator<T8>::iterator& current8,
+      const ParamGenerator<T9>& g9,
+      const typename ParamGenerator<T9>::iterator& current9)
+        : base_(base),
+          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
+          begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
+          begin3_(g3.begin()), end3_(g3.end()), current3_(current3),
+          begin4_(g4.begin()), end4_(g4.end()), current4_(current4),
+          begin5_(g5.begin()), end5_(g5.end()), current5_(current5),
+          begin6_(g6.begin()), end6_(g6.end()), current6_(current6),
+          begin7_(g7.begin()), end7_(g7.end()), current7_(current7),
+          begin8_(g8.begin()), end8_(g8.end()), current8_(current8),
+          begin9_(g9.begin()), end9_(g9.end()), current9_(current9)    {
+      ComputeCurrentValue();
+    }
+    virtual ~Iterator() {}
+
+    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
+      return base_;
+    }
+    // Advance should not be called on beyond-of-range iterators
+    // so no component iterators must be beyond end of range, either.
+    virtual void Advance() {
+      assert(!AtEnd());
+      ++current9_;
+      if (current9_ == end9_) {
+        current9_ = begin9_;
+        ++current8_;
+      }
+      if (current8_ == end8_) {
+        current8_ = begin8_;
+        ++current7_;
+      }
+      if (current7_ == end7_) {
+        current7_ = begin7_;
+        ++current6_;
+      }
+      if (current6_ == end6_) {
+        current6_ = begin6_;
+        ++current5_;
+      }
+      if (current5_ == end5_) {
+        current5_ = begin5_;
+        ++current4_;
+      }
+      if (current4_ == end4_) {
+        current4_ = begin4_;
+        ++current3_;
+      }
+      if (current3_ == end3_) {
+        current3_ = begin3_;
+        ++current2_;
+      }
+      if (current2_ == end2_) {
+        current2_ = begin2_;
+        ++current1_;
+      }
+      ComputeCurrentValue();
+    }
+    virtual ParamIteratorInterface<ParamType>* Clone() const {
+      return new Iterator(*this);
+    }
+    virtual const ParamType* Current() const { return &current_value_; }
+    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
+      // Having the same base generator guarantees that the other
+      // iterator is of the same type and we can downcast.
+      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
+          << "The program attempted to compare iterators "
+          << "from different generators." << std::endl;
+      const Iterator* typed_other =
+          CheckedDowncastToActualType<const Iterator>(&other);
+      // We must report iterators equal if they both point beyond their
+      // respective ranges. That can happen in a variety of fashions,
+      // so we have to consult AtEnd().
+      return (AtEnd() && typed_other->AtEnd()) ||
+         (
+          current1_ == typed_other->current1_ &&
+          current2_ == typed_other->current2_ &&
+          current3_ == typed_other->current3_ &&
+          current4_ == typed_other->current4_ &&
+          current5_ == typed_other->current5_ &&
+          current6_ == typed_other->current6_ &&
+          current7_ == typed_other->current7_ &&
+          current8_ == typed_other->current8_ &&
+          current9_ == typed_other->current9_);
+    }
+
+   private:
+    Iterator(const Iterator& other)
+        : base_(other.base_),
+        begin1_(other.begin1_),
+        end1_(other.end1_),
+        current1_(other.current1_),
+        begin2_(other.begin2_),
+        end2_(other.end2_),
+        current2_(other.current2_),
+        begin3_(other.begin3_),
+        end3_(other.end3_),
+        current3_(other.current3_),
+        begin4_(other.begin4_),
+        end4_(other.end4_),
+        current4_(other.current4_),
+        begin5_(other.begin5_),
+        end5_(other.end5_),
+        current5_(other.current5_),
+        begin6_(other.begin6_),
+        end6_(other.end6_),
+        current6_(other.current6_),
+        begin7_(other.begin7_),
+        end7_(other.end7_),
+        current7_(other.current7_),
+        begin8_(other.begin8_),
+        end8_(other.end8_),
+        current8_(other.current8_),
+        begin9_(other.begin9_),
+        end9_(other.end9_),
+        current9_(other.current9_) {
+      ComputeCurrentValue();
+    }
+
+    void ComputeCurrentValue() {
+      if (!AtEnd())
+        current_value_ = ParamType(*current1_, *current2_, *current3_,
+            *current4_, *current5_, *current6_, *current7_, *current8_,
+            *current9_);
+    }
+    bool AtEnd() const {
+      // We must report iterator past the end of the range when either of the
+      // component iterators has reached the end of its range.
+      return
+          current1_ == end1_ ||
+          current2_ == end2_ ||
+          current3_ == end3_ ||
+          current4_ == end4_ ||
+          current5_ == end5_ ||
+          current6_ == end6_ ||
+          current7_ == end7_ ||
+          current8_ == end8_ ||
+          current9_ == end9_;
+    }
+
+    // No implementation - assignment is unsupported.
+    void operator=(const Iterator& other);
+
+    const ParamGeneratorInterface<ParamType>* const base_;
+    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
+    // current[i]_ is the actual traversing iterator.
+    const typename ParamGenerator<T1>::iterator begin1_;
+    const typename ParamGenerator<T1>::iterator end1_;
+    typename ParamGenerator<T1>::iterator current1_;
+    const typename ParamGenerator<T2>::iterator begin2_;
+    const typename ParamGenerator<T2>::iterator end2_;
+    typename ParamGenerator<T2>::iterator current2_;
+    const typename ParamGenerator<T3>::iterator begin3_;
+    const typename ParamGenerator<T3>::iterator end3_;
+    typename ParamGenerator<T3>::iterator current3_;
+    const typename ParamGenerator<T4>::iterator begin4_;
+    const typename ParamGenerator<T4>::iterator end4_;
+    typename ParamGenerator<T4>::iterator current4_;
+    const typename ParamGenerator<T5>::iterator begin5_;
+    const typename ParamGenerator<T5>::iterator end5_;
+    typename ParamGenerator<T5>::iterator current5_;
+    const typename ParamGenerator<T6>::iterator begin6_;
+    const typename ParamGenerator<T6>::iterator end6_;
+    typename ParamGenerator<T6>::iterator current6_;
+    const typename ParamGenerator<T7>::iterator begin7_;
+    const typename ParamGenerator<T7>::iterator end7_;
+    typename ParamGenerator<T7>::iterator current7_;
+    const typename ParamGenerator<T8>::iterator begin8_;
+    const typename ParamGenerator<T8>::iterator end8_;
+    typename ParamGenerator<T8>::iterator current8_;
+    const typename ParamGenerator<T9>::iterator begin9_;
+    const typename ParamGenerator<T9>::iterator end9_;
+    typename ParamGenerator<T9>::iterator current9_;
+    ParamType current_value_;
+  };  // class CartesianProductGenerator9::Iterator
+
+  // No implementation - assignment is unsupported.
+  void operator=(const CartesianProductGenerator9& other);
+
+  const ParamGenerator<T1> g1_;
+  const ParamGenerator<T2> g2_;
+  const ParamGenerator<T3> g3_;
+  const ParamGenerator<T4> g4_;
+  const ParamGenerator<T5> g5_;
+  const ParamGenerator<T6> g6_;
+  const ParamGenerator<T7> g7_;
+  const ParamGenerator<T8> g8_;
+  const ParamGenerator<T9> g9_;
+};  // class CartesianProductGenerator9
+
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10>
+class CartesianProductGenerator10
+    : public ParamGeneratorInterface< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6,
+        T7, T8, T9, T10> > {
+ public:
+  typedef ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> ParamType;
+
+  CartesianProductGenerator10(const ParamGenerator<T1>& g1,
+      const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,
+      const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5,
+      const ParamGenerator<T6>& g6, const ParamGenerator<T7>& g7,
+      const ParamGenerator<T8>& g8, const ParamGenerator<T9>& g9,
+      const ParamGenerator<T10>& g10)
+      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7), g8_(g8),
+          g9_(g9), g10_(g10) {}
+  virtual ~CartesianProductGenerator10() {}
+
+  virtual ParamIteratorInterface<ParamType>* Begin() const {
+    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,
+        g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin(), g6_, g6_.begin(), g7_,
+        g7_.begin(), g8_, g8_.begin(), g9_, g9_.begin(), g10_, g10_.begin());
+  }
+  virtual ParamIteratorInterface<ParamType>* End() const {
+    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),
+        g4_, g4_.end(), g5_, g5_.end(), g6_, g6_.end(), g7_, g7_.end(), g8_,
+        g8_.end(), g9_, g9_.end(), g10_, g10_.end());
+  }
+
+ private:
+  class Iterator : public ParamIteratorInterface<ParamType> {
+   public:
+    Iterator(const ParamGeneratorInterface<ParamType>* base,
+      const ParamGenerator<T1>& g1,
+      const typename ParamGenerator<T1>::iterator& current1,
+      const ParamGenerator<T2>& g2,
+      const typename ParamGenerator<T2>::iterator& current2,
+      const ParamGenerator<T3>& g3,
+      const typename ParamGenerator<T3>::iterator& current3,
+      const ParamGenerator<T4>& g4,
+      const typename ParamGenerator<T4>::iterator& current4,
+      const ParamGenerator<T5>& g5,
+      const typename ParamGenerator<T5>::iterator& current5,
+      const ParamGenerator<T6>& g6,
+      const typename ParamGenerator<T6>::iterator& current6,
+      const ParamGenerator<T7>& g7,
+      const typename ParamGenerator<T7>::iterator& current7,
+      const ParamGenerator<T8>& g8,
+      const typename ParamGenerator<T8>::iterator& current8,
+      const ParamGenerator<T9>& g9,
+      const typename ParamGenerator<T9>::iterator& current9,
+      const ParamGenerator<T10>& g10,
+      const typename ParamGenerator<T10>::iterator& current10)
+        : base_(base),
+          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),
+          begin2_(g2.begin()), end2_(g2.end()), current2_(current2),
+          begin3_(g3.begin()), end3_(g3.end()), current3_(current3),
+          begin4_(g4.begin()), end4_(g4.end()), current4_(current4),
+          begin5_(g5.begin()), end5_(g5.end()), current5_(current5),
+          begin6_(g6.begin()), end6_(g6.end()), current6_(current6),
+          begin7_(g7.begin()), end7_(g7.end()), current7_(current7),
+          begin8_(g8.begin()), end8_(g8.end()), current8_(current8),
+          begin9_(g9.begin()), end9_(g9.end()), current9_(current9),
+          begin10_(g10.begin()), end10_(g10.end()), current10_(current10)    {
+      ComputeCurrentValue();
+    }
+    virtual ~Iterator() {}
+
+    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
+      return base_;
+    }
+    // Advance should not be called on beyond-of-range iterators
+    // so no component iterators must be beyond end of range, either.
+    virtual void Advance() {
+      assert(!AtEnd());
+      ++current10_;
+      if (current10_ == end10_) {
+        current10_ = begin10_;
+        ++current9_;
+      }
+      if (current9_ == end9_) {
+        current9_ = begin9_;
+        ++current8_;
+      }
+      if (current8_ == end8_) {
+        current8_ = begin8_;
+        ++current7_;
+      }
+      if (current7_ == end7_) {
+        current7_ = begin7_;
+        ++current6_;
+      }
+      if (current6_ == end6_) {
+        current6_ = begin6_;
+        ++current5_;
+      }
+      if (current5_ == end5_) {
+        current5_ = begin5_;
+        ++current4_;
+      }
+      if (current4_ == end4_) {
+        current4_ = begin4_;
+        ++current3_;
+      }
+      if (current3_ == end3_) {
+        current3_ = begin3_;
+        ++current2_;
+      }
+      if (current2_ == end2_) {
+        current2_ = begin2_;
+        ++current1_;
+      }
+      ComputeCurrentValue();
+    }
+    virtual ParamIteratorInterface<ParamType>* Clone() const {
+      return new Iterator(*this);
+    }
+    virtual const ParamType* Current() const { return &current_value_; }
+    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
+      // Having the same base generator guarantees that the other
+      // iterator is of the same type and we can downcast.
+      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
+          << "The program attempted to compare iterators "
+          << "from different generators." << std::endl;
+      const Iterator* typed_other =
+          CheckedDowncastToActualType<const Iterator>(&other);
+      // We must report iterators equal if they both point beyond their
+      // respective ranges. That can happen in a variety of fashions,
+      // so we have to consult AtEnd().
+      return (AtEnd() && typed_other->AtEnd()) ||
+         (
+          current1_ == typed_other->current1_ &&
+          current2_ == typed_other->current2_ &&
+          current3_ == typed_other->current3_ &&
+          current4_ == typed_other->current4_ &&
+          current5_ == typed_other->current5_ &&
+          current6_ == typed_other->current6_ &&
+          current7_ == typed_other->current7_ &&
+          current8_ == typed_other->current8_ &&
+          current9_ == typed_other->current9_ &&
+          current10_ == typed_other->current10_);
+    }
+
+   private:
+    Iterator(const Iterator& other)
+        : base_(other.base_),
+        begin1_(other.begin1_),
+        end1_(other.end1_),
+        current1_(other.current1_),
+        begin2_(other.begin2_),
+        end2_(other.end2_),
+        current2_(other.current2_),
+        begin3_(other.begin3_),
+        end3_(other.end3_),
+        current3_(other.current3_),
+        begin4_(other.begin4_),
+        end4_(other.end4_),
+        current4_(other.current4_),
+        begin5_(other.begin5_),
+        end5_(other.end5_),
+        current5_(other.current5_),
+        begin6_(other.begin6_),
+        end6_(other.end6_),
+        current6_(other.current6_),
+        begin7_(other.begin7_),
+        end7_(other.end7_),
+        current7_(other.current7_),
+        begin8_(other.begin8_),
+        end8_(other.end8_),
+        current8_(other.current8_),
+        begin9_(other.begin9_),
+        end9_(other.end9_),
+        current9_(other.current9_),
+        begin10_(other.begin10_),
+        end10_(other.end10_),
+        current10_(other.current10_) {
+      ComputeCurrentValue();
+    }
+
+    void ComputeCurrentValue() {
+      if (!AtEnd())
+        current_value_ = ParamType(*current1_, *current2_, *current3_,
+            *current4_, *current5_, *current6_, *current7_, *current8_,
+            *current9_, *current10_);
+    }
+    bool AtEnd() const {
+      // We must report iterator past the end of the range when either of the
+      // component iterators has reached the end of its range.
+      return
+          current1_ == end1_ ||
+          current2_ == end2_ ||
+          current3_ == end3_ ||
+          current4_ == end4_ ||
+          current5_ == end5_ ||
+          current6_ == end6_ ||
+          current7_ == end7_ ||
+          current8_ == end8_ ||
+          current9_ == end9_ ||
+          current10_ == end10_;
+    }
+
+    // No implementation - assignment is unsupported.
+    void operator=(const Iterator& other);
+
+    const ParamGeneratorInterface<ParamType>* const base_;
+    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
+    // current[i]_ is the actual traversing iterator.
+    const typename ParamGenerator<T1>::iterator begin1_;
+    const typename ParamGenerator<T1>::iterator end1_;
+    typename ParamGenerator<T1>::iterator current1_;
+    const typename ParamGenerator<T2>::iterator begin2_;
+    const typename ParamGenerator<T2>::iterator end2_;
+    typename ParamGenerator<T2>::iterator current2_;
+    const typename ParamGenerator<T3>::iterator begin3_;
+    const typename ParamGenerator<T3>::iterator end3_;
+    typename ParamGenerator<T3>::iterator current3_;
+    const typename ParamGenerator<T4>::iterator begin4_;
+    const typename ParamGenerator<T4>::iterator end4_;
+    typename ParamGenerator<T4>::iterator current4_;
+    const typename ParamGenerator<T5>::iterator begin5_;
+    const typename ParamGenerator<T5>::iterator end5_;
+    typename ParamGenerator<T5>::iterator current5_;
+    const typename ParamGenerator<T6>::iterator begin6_;
+    const typename ParamGenerator<T6>::iterator end6_;
+    typename ParamGenerator<T6>::iterator current6_;
+    const typename ParamGenerator<T7>::iterator begin7_;
+    const typename ParamGenerator<T7>::iterator end7_;
+    typename ParamGenerator<T7>::iterator current7_;
+    const typename ParamGenerator<T8>::iterator begin8_;
+    const typename ParamGenerator<T8>::iterator end8_;
+    typename ParamGenerator<T8>::iterator current8_;
+    const typename ParamGenerator<T9>::iterator begin9_;
+    const typename ParamGenerator<T9>::iterator end9_;
+    typename ParamGenerator<T9>::iterator current9_;
+    const typename ParamGenerator<T10>::iterator begin10_;
+    const typename ParamGenerator<T10>::iterator end10_;
+    typename ParamGenerator<T10>::iterator current10_;
+    ParamType current_value_;
+  };  // class CartesianProductGenerator10::Iterator
+
+  // No implementation - assignment is unsupported.
+  void operator=(const CartesianProductGenerator10& other);
+
+  const ParamGenerator<T1> g1_;
+  const ParamGenerator<T2> g2_;
+  const ParamGenerator<T3> g3_;
+  const ParamGenerator<T4> g4_;
+  const ParamGenerator<T5> g5_;
+  const ParamGenerator<T6> g6_;
+  const ParamGenerator<T7> g7_;
+  const ParamGenerator<T8> g8_;
+  const ParamGenerator<T9> g9_;
+  const ParamGenerator<T10> g10_;
+};  // class CartesianProductGenerator10
+
+
+// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
+//
+// Helper classes providing Combine() with polymorphic features. They allow
+// casting CartesianProductGeneratorN<T> to ParamGenerator<U> if T is
+// convertible to U.
+//
+template <class Generator1, class Generator2>
+class CartesianProductHolder2 {
+ public:
+CartesianProductHolder2(const Generator1& g1, const Generator2& g2)
+      : g1_(g1), g2_(g2) {}
+  template <typename T1, typename T2>
+  operator ParamGenerator< ::std::tr1::tuple<T1, T2> >() const {
+    return ParamGenerator< ::std::tr1::tuple<T1, T2> >(
+        new CartesianProductGenerator2<T1, T2>(
+        static_cast<ParamGenerator<T1> >(g1_),
+        static_cast<ParamGenerator<T2> >(g2_)));
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const CartesianProductHolder2& other);
+
+  const Generator1 g1_;
+  const Generator2 g2_;
+};  // class CartesianProductHolder2
+
+template <class Generator1, class Generator2, class Generator3>
+class CartesianProductHolder3 {
+ public:
+CartesianProductHolder3(const Generator1& g1, const Generator2& g2,
+    const Generator3& g3)
+      : g1_(g1), g2_(g2), g3_(g3) {}
+  template <typename T1, typename T2, typename T3>
+  operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3> >() const {
+    return ParamGenerator< ::std::tr1::tuple<T1, T2, T3> >(
+        new CartesianProductGenerator3<T1, T2, T3>(
+        static_cast<ParamGenerator<T1> >(g1_),
+        static_cast<ParamGenerator<T2> >(g2_),
+        static_cast<ParamGenerator<T3> >(g3_)));
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const CartesianProductHolder3& other);
+
+  const Generator1 g1_;
+  const Generator2 g2_;
+  const Generator3 g3_;
+};  // class CartesianProductHolder3
+
+template <class Generator1, class Generator2, class Generator3,
+    class Generator4>
+class CartesianProductHolder4 {
+ public:
+CartesianProductHolder4(const Generator1& g1, const Generator2& g2,
+    const Generator3& g3, const Generator4& g4)
+      : g1_(g1), g2_(g2), g3_(g3), g4_(g4) {}
+  template <typename T1, typename T2, typename T3, typename T4>
+  operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4> >() const {
+    return ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4> >(
+        new CartesianProductGenerator4<T1, T2, T3, T4>(
+        static_cast<ParamGenerator<T1> >(g1_),
+        static_cast<ParamGenerator<T2> >(g2_),
+        static_cast<ParamGenerator<T3> >(g3_),
+        static_cast<ParamGenerator<T4> >(g4_)));
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const CartesianProductHolder4& other);
+
+  const Generator1 g1_;
+  const Generator2 g2_;
+  const Generator3 g3_;
+  const Generator4 g4_;
+};  // class CartesianProductHolder4
+
+template <class Generator1, class Generator2, class Generator3,
+    class Generator4, class Generator5>
+class CartesianProductHolder5 {
+ public:
+CartesianProductHolder5(const Generator1& g1, const Generator2& g2,
+    const Generator3& g3, const Generator4& g4, const Generator5& g5)
+      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5) {}
+  template <typename T1, typename T2, typename T3, typename T4, typename T5>
+  operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5> >() const {
+    return ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5> >(
+        new CartesianProductGenerator5<T1, T2, T3, T4, T5>(
+        static_cast<ParamGenerator<T1> >(g1_),
+        static_cast<ParamGenerator<T2> >(g2_),
+        static_cast<ParamGenerator<T3> >(g3_),
+        static_cast<ParamGenerator<T4> >(g4_),
+        static_cast<ParamGenerator<T5> >(g5_)));
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const CartesianProductHolder5& other);
+
+  const Generator1 g1_;
+  const Generator2 g2_;
+  const Generator3 g3_;
+  const Generator4 g4_;
+  const Generator5 g5_;
+};  // class CartesianProductHolder5
+
+template <class Generator1, class Generator2, class Generator3,
+    class Generator4, class Generator5, class Generator6>
+class CartesianProductHolder6 {
+ public:
+CartesianProductHolder6(const Generator1& g1, const Generator2& g2,
+    const Generator3& g3, const Generator4& g4, const Generator5& g5,
+    const Generator6& g6)
+      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6) {}
+  template <typename T1, typename T2, typename T3, typename T4, typename T5,
+      typename T6>
+  operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6> >() const {
+    return ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6> >(
+        new CartesianProductGenerator6<T1, T2, T3, T4, T5, T6>(
+        static_cast<ParamGenerator<T1> >(g1_),
+        static_cast<ParamGenerator<T2> >(g2_),
+        static_cast<ParamGenerator<T3> >(g3_),
+        static_cast<ParamGenerator<T4> >(g4_),
+        static_cast<ParamGenerator<T5> >(g5_),
+        static_cast<ParamGenerator<T6> >(g6_)));
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const CartesianProductHolder6& other);
+
+  const Generator1 g1_;
+  const Generator2 g2_;
+  const Generator3 g3_;
+  const Generator4 g4_;
+  const Generator5 g5_;
+  const Generator6 g6_;
+};  // class CartesianProductHolder6
+
+template <class Generator1, class Generator2, class Generator3,
+    class Generator4, class Generator5, class Generator6, class Generator7>
+class CartesianProductHolder7 {
+ public:
+CartesianProductHolder7(const Generator1& g1, const Generator2& g2,
+    const Generator3& g3, const Generator4& g4, const Generator5& g5,
+    const Generator6& g6, const Generator7& g7)
+      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7) {}
+  template <typename T1, typename T2, typename T3, typename T4, typename T5,
+      typename T6, typename T7>
+  operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6,
+      T7> >() const {
+    return ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7> >(
+        new CartesianProductGenerator7<T1, T2, T3, T4, T5, T6, T7>(
+        static_cast<ParamGenerator<T1> >(g1_),
+        static_cast<ParamGenerator<T2> >(g2_),
+        static_cast<ParamGenerator<T3> >(g3_),
+        static_cast<ParamGenerator<T4> >(g4_),
+        static_cast<ParamGenerator<T5> >(g5_),
+        static_cast<ParamGenerator<T6> >(g6_),
+        static_cast<ParamGenerator<T7> >(g7_)));
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const CartesianProductHolder7& other);
+
+  const Generator1 g1_;
+  const Generator2 g2_;
+  const Generator3 g3_;
+  const Generator4 g4_;
+  const Generator5 g5_;
+  const Generator6 g6_;
+  const Generator7 g7_;
+};  // class CartesianProductHolder7
+
+template <class Generator1, class Generator2, class Generator3,
+    class Generator4, class Generator5, class Generator6, class Generator7,
+    class Generator8>
+class CartesianProductHolder8 {
+ public:
+CartesianProductHolder8(const Generator1& g1, const Generator2& g2,
+    const Generator3& g3, const Generator4& g4, const Generator5& g5,
+    const Generator6& g6, const Generator7& g7, const Generator8& g8)
+      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7),
+          g8_(g8) {}
+  template <typename T1, typename T2, typename T3, typename T4, typename T5,
+      typename T6, typename T7, typename T8>
+  operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7,
+      T8> >() const {
+    return ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8> >(
+        new CartesianProductGenerator8<T1, T2, T3, T4, T5, T6, T7, T8>(
+        static_cast<ParamGenerator<T1> >(g1_),
+        static_cast<ParamGenerator<T2> >(g2_),
+        static_cast<ParamGenerator<T3> >(g3_),
+        static_cast<ParamGenerator<T4> >(g4_),
+        static_cast<ParamGenerator<T5> >(g5_),
+        static_cast<ParamGenerator<T6> >(g6_),
+        static_cast<ParamGenerator<T7> >(g7_),
+        static_cast<ParamGenerator<T8> >(g8_)));
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const CartesianProductHolder8& other);
+
+  const Generator1 g1_;
+  const Generator2 g2_;
+  const Generator3 g3_;
+  const Generator4 g4_;
+  const Generator5 g5_;
+  const Generator6 g6_;
+  const Generator7 g7_;
+  const Generator8 g8_;
+};  // class CartesianProductHolder8
+
+template <class Generator1, class Generator2, class Generator3,
+    class Generator4, class Generator5, class Generator6, class Generator7,
+    class Generator8, class Generator9>
+class CartesianProductHolder9 {
+ public:
+CartesianProductHolder9(const Generator1& g1, const Generator2& g2,
+    const Generator3& g3, const Generator4& g4, const Generator5& g5,
+    const Generator6& g6, const Generator7& g7, const Generator8& g8,
+    const Generator9& g9)
+      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7), g8_(g8),
+          g9_(g9) {}
+  template <typename T1, typename T2, typename T3, typename T4, typename T5,
+      typename T6, typename T7, typename T8, typename T9>
+  operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8,
+      T9> >() const {
+    return ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8,
+        T9> >(
+        new CartesianProductGenerator9<T1, T2, T3, T4, T5, T6, T7, T8, T9>(
+        static_cast<ParamGenerator<T1> >(g1_),
+        static_cast<ParamGenerator<T2> >(g2_),
+        static_cast<ParamGenerator<T3> >(g3_),
+        static_cast<ParamGenerator<T4> >(g4_),
+        static_cast<ParamGenerator<T5> >(g5_),
+        static_cast<ParamGenerator<T6> >(g6_),
+        static_cast<ParamGenerator<T7> >(g7_),
+        static_cast<ParamGenerator<T8> >(g8_),
+        static_cast<ParamGenerator<T9> >(g9_)));
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const CartesianProductHolder9& other);
+
+  const Generator1 g1_;
+  const Generator2 g2_;
+  const Generator3 g3_;
+  const Generator4 g4_;
+  const Generator5 g5_;
+  const Generator6 g6_;
+  const Generator7 g7_;
+  const Generator8 g8_;
+  const Generator9 g9_;
+};  // class CartesianProductHolder9
+
+template <class Generator1, class Generator2, class Generator3,
+    class Generator4, class Generator5, class Generator6, class Generator7,
+    class Generator8, class Generator9, class Generator10>
+class CartesianProductHolder10 {
+ public:
+CartesianProductHolder10(const Generator1& g1, const Generator2& g2,
+    const Generator3& g3, const Generator4& g4, const Generator5& g5,
+    const Generator6& g6, const Generator7& g7, const Generator8& g8,
+    const Generator9& g9, const Generator10& g10)
+      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7), g8_(g8),
+          g9_(g9), g10_(g10) {}
+  template <typename T1, typename T2, typename T3, typename T4, typename T5,
+      typename T6, typename T7, typename T8, typename T9, typename T10>
+  operator ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8,
+      T9, T10> >() const {
+    return ParamGenerator< ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8,
+        T9, T10> >(
+        new CartesianProductGenerator10<T1, T2, T3, T4, T5, T6, T7, T8, T9,
+            T10>(
+        static_cast<ParamGenerator<T1> >(g1_),
+        static_cast<ParamGenerator<T2> >(g2_),
+        static_cast<ParamGenerator<T3> >(g3_),
+        static_cast<ParamGenerator<T4> >(g4_),
+        static_cast<ParamGenerator<T5> >(g5_),
+        static_cast<ParamGenerator<T6> >(g6_),
+        static_cast<ParamGenerator<T7> >(g7_),
+        static_cast<ParamGenerator<T8> >(g8_),
+        static_cast<ParamGenerator<T9> >(g9_),
+        static_cast<ParamGenerator<T10> >(g10_)));
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const CartesianProductHolder10& other);
+
+  const Generator1 g1_;
+  const Generator2 g2_;
+  const Generator3 g3_;
+  const Generator4 g4_;
+  const Generator5 g5_;
+  const Generator6 g6_;
+  const Generator7 g7_;
+  const Generator8 g8_;
+  const Generator9 g9_;
+  const Generator10 g10_;
+};  // class CartesianProductHolder10
+
+# endif  // GTEST_HAS_COMBINE
+
+}  // namespace internal
+}  // namespace testing
+
+#endif  //  GTEST_HAS_PARAM_TEST
+
+#endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_GENERATED_H_
diff --git a/contrib/gtest-1.7.0/include/gtest/internal/gtest-param-util-generated.h.pump b/contrib/gtest-1.7.0/include/gtest/internal/gtest-param-util-generated.h.pump
new file mode 100644
index 0000000..009206f
--- /dev/null
+++ b/contrib/gtest-1.7.0/include/gtest/internal/gtest-param-util-generated.h.pump
@@ -0,0 +1,301 @@
+$$ -*- mode: c++; -*-
+$var n = 50  $$ Maximum length of Values arguments we want to support.
+$var maxtuple = 10  $$ Maximum number of Combine arguments we want to support.
+// Copyright 2008 Google Inc.
+// All Rights Reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: vladl at google.com (Vlad Losev)
+
+// Type and function utilities for implementing parameterized tests.
+// This file is generated by a SCRIPT.  DO NOT EDIT BY HAND!
+//
+// Currently Google Test supports at most $n arguments in Values,
+// and at most $maxtuple arguments in Combine. Please contact
+// googletestframework at googlegroups.com if you need more.
+// Please note that the number of arguments to Combine is limited
+// by the maximum arity of the implementation of tr1::tuple which is
+// currently set at $maxtuple.
+
+#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_GENERATED_H_
+#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_GENERATED_H_
+
+// scripts/fuse_gtest.py depends on gtest's own header being #included
+// *unconditionally*.  Therefore these #includes cannot be moved
+// inside #if GTEST_HAS_PARAM_TEST.
+#include "gtest/internal/gtest-param-util.h"
+#include "gtest/internal/gtest-port.h"
+
+#if GTEST_HAS_PARAM_TEST
+
+namespace testing {
+
+// Forward declarations of ValuesIn(), which is implemented in
+// include/gtest/gtest-param-test.h.
+template <typename ForwardIterator>
+internal::ParamGenerator<
+  typename ::testing::internal::IteratorTraits<ForwardIterator>::value_type>
+ValuesIn(ForwardIterator begin, ForwardIterator end);
+
+template <typename T, size_t N>
+internal::ParamGenerator<T> ValuesIn(const T (&array)[N]);
+
+template <class Container>
+internal::ParamGenerator<typename Container::value_type> ValuesIn(
+    const Container& container);
+
+namespace internal {
+
+// Used in the Values() function to provide polymorphic capabilities.
+template <typename T1>
+class ValueArray1 {
+ public:
+  explicit ValueArray1(T1 v1) : v1_(v1) {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const { return ValuesIn(&v1_, &v1_ + 1); }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray1& other);
+
+  const T1 v1_;
+};
+
+$range i 2..n
+$for i [[
+$range j 1..i
+
+template <$for j, [[typename T$j]]>
+class ValueArray$i {
+ public:
+  ValueArray$i($for j, [[T$j v$j]]) : $for j, [[v$(j)_(v$j)]] {}
+
+  template <typename T>
+  operator ParamGenerator<T>() const {
+    const T array[] = {$for j, [[static_cast<T>(v$(j)_)]]};
+    return ValuesIn(array);
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const ValueArray$i& other);
+
+$for j [[
+
+  const T$j v$(j)_;
+]]
+
+};
+
+]]
+
+# if GTEST_HAS_COMBINE
+// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
+//
+// Generates values from the Cartesian product of values produced
+// by the argument generators.
+//
+$range i 2..maxtuple
+$for i [[
+$range j 1..i
+$range k 2..i
+
+template <$for j, [[typename T$j]]>
+class CartesianProductGenerator$i
+    : public ParamGeneratorInterface< ::std::tr1::tuple<$for j, [[T$j]]> > {
+ public:
+  typedef ::std::tr1::tuple<$for j, [[T$j]]> ParamType;
+
+  CartesianProductGenerator$i($for j, [[const ParamGenerator<T$j>& g$j]])
+      : $for j, [[g$(j)_(g$j)]] {}
+  virtual ~CartesianProductGenerator$i() {}
+
+  virtual ParamIteratorInterface<ParamType>* Begin() const {
+    return new Iterator(this, $for j, [[g$(j)_, g$(j)_.begin()]]);
+  }
+  virtual ParamIteratorInterface<ParamType>* End() const {
+    return new Iterator(this, $for j, [[g$(j)_, g$(j)_.end()]]);
+  }
+
+ private:
+  class Iterator : public ParamIteratorInterface<ParamType> {
+   public:
+    Iterator(const ParamGeneratorInterface<ParamType>* base, $for j, [[
+
+      const ParamGenerator<T$j>& g$j,
+      const typename ParamGenerator<T$j>::iterator& current$(j)]])
+        : base_(base),
+$for j, [[
+
+          begin$(j)_(g$j.begin()), end$(j)_(g$j.end()), current$(j)_(current$j)
+]]    {
+      ComputeCurrentValue();
+    }
+    virtual ~Iterator() {}
+
+    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {
+      return base_;
+    }
+    // Advance should not be called on beyond-of-range iterators
+    // so no component iterators must be beyond end of range, either.
+    virtual void Advance() {
+      assert(!AtEnd());
+      ++current$(i)_;
+
+$for k [[
+      if (current$(i+2-k)_ == end$(i+2-k)_) {
+        current$(i+2-k)_ = begin$(i+2-k)_;
+        ++current$(i+2-k-1)_;
+      }
+
+]]
+      ComputeCurrentValue();
+    }
+    virtual ParamIteratorInterface<ParamType>* Clone() const {
+      return new Iterator(*this);
+    }
+    virtual const ParamType* Current() const { return &current_value_; }
+    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {
+      // Having the same base generator guarantees that the other
+      // iterator is of the same type and we can downcast.
+      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
+          << "The program attempted to compare iterators "
+          << "from different generators." << std::endl;
+      const Iterator* typed_other =
+          CheckedDowncastToActualType<const Iterator>(&other);
+      // We must report iterators equal if they both point beyond their
+      // respective ranges. That can happen in a variety of fashions,
+      // so we have to consult AtEnd().
+      return (AtEnd() && typed_other->AtEnd()) ||
+         ($for j  && [[
+
+          current$(j)_ == typed_other->current$(j)_
+]]);
+    }
+
+   private:
+    Iterator(const Iterator& other)
+        : base_(other.base_), $for j, [[
+
+        begin$(j)_(other.begin$(j)_),
+        end$(j)_(other.end$(j)_),
+        current$(j)_(other.current$(j)_)
+]] {
+      ComputeCurrentValue();
+    }
+
+    void ComputeCurrentValue() {
+      if (!AtEnd())
+        current_value_ = ParamType($for j, [[*current$(j)_]]);
+    }
+    bool AtEnd() const {
+      // We must report iterator past the end of the range when either of the
+      // component iterators has reached the end of its range.
+      return
+$for j  || [[
+
+          current$(j)_ == end$(j)_
+]];
+    }
+
+    // No implementation - assignment is unsupported.
+    void operator=(const Iterator& other);
+
+    const ParamGeneratorInterface<ParamType>* const base_;
+    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.
+    // current[i]_ is the actual traversing iterator.
+$for j [[
+
+    const typename ParamGenerator<T$j>::iterator begin$(j)_;
+    const typename ParamGenerator<T$j>::iterator end$(j)_;
+    typename ParamGenerator<T$j>::iterator current$(j)_;
+]]
+
+    ParamType current_value_;
+  };  // class CartesianProductGenerator$i::Iterator
+
+  // No implementation - assignment is unsupported.
+  void operator=(const CartesianProductGenerator$i& other);
+
+
+$for j [[
+  const ParamGenerator<T$j> g$(j)_;
+
+]]
+};  // class CartesianProductGenerator$i
+
+
+]]
+
+// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
+//
+// Helper classes providing Combine() with polymorphic features. They allow
+// casting CartesianProductGeneratorN<T> to ParamGenerator<U> if T is
+// convertible to U.
+//
+$range i 2..maxtuple
+$for i [[
+$range j 1..i
+
+template <$for j, [[class Generator$j]]>
+class CartesianProductHolder$i {
+ public:
+CartesianProductHolder$i($for j, [[const Generator$j& g$j]])
+      : $for j, [[g$(j)_(g$j)]] {}
+  template <$for j, [[typename T$j]]>
+  operator ParamGenerator< ::std::tr1::tuple<$for j, [[T$j]]> >() const {
+    return ParamGenerator< ::std::tr1::tuple<$for j, [[T$j]]> >(
+        new CartesianProductGenerator$i<$for j, [[T$j]]>(
+$for j,[[
+
+        static_cast<ParamGenerator<T$j> >(g$(j)_)
+]]));
+  }
+
+ private:
+  // No implementation - assignment is unsupported.
+  void operator=(const CartesianProductHolder$i& other);
+
+
+$for j [[
+  const Generator$j g$(j)_;
+
+]]
+};  // class CartesianProductHolder$i
+
+]]
+
+# endif  // GTEST_HAS_COMBINE
+
+}  // namespace internal
+}  // namespace testing
+
+#endif  //  GTEST_HAS_PARAM_TEST
+
+#endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_GENERATED_H_
diff --git a/contrib/gtest-1.7.0/include/gtest/internal/gtest-param-util.h b/contrib/gtest-1.7.0/include/gtest/internal/gtest-param-util.h
new file mode 100644
index 0000000..d5e1028
--- /dev/null
+++ b/contrib/gtest-1.7.0/include/gtest/internal/gtest-param-util.h
@@ -0,0 +1,619 @@
+// Copyright 2008 Google Inc.
+// All Rights Reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: vladl at google.com (Vlad Losev)
+
+// Type and function utilities for implementing parameterized tests.
+
+#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_H_
+#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_H_
+
+#include <iterator>
+#include <utility>
+#include <vector>
+
+// scripts/fuse_gtest.py depends on gtest's own header being #included
+// *unconditionally*.  Therefore these #includes cannot be moved
+// inside #if GTEST_HAS_PARAM_TEST.
+#include "gtest/internal/gtest-internal.h"
+#include "gtest/internal/gtest-linked_ptr.h"
+#include "gtest/internal/gtest-port.h"
+#include "gtest/gtest-printers.h"
+
+#if GTEST_HAS_PARAM_TEST
+
+namespace testing {
+namespace internal {
+
+// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
+//
+// Outputs a message explaining invalid registration of different
+// fixture class for the same test case. This may happen when
+// TEST_P macro is used to define two tests with the same name
+// but in different namespaces.
+GTEST_API_ void ReportInvalidTestCaseType(const char* test_case_name,
+                                          const char* file, int line);
+
+template <typename> class ParamGeneratorInterface;
+template <typename> class ParamGenerator;
+
+// Interface for iterating over elements provided by an implementation
+// of ParamGeneratorInterface<T>.
+template <typename T>
+class ParamIteratorInterface {
+ public:
+  virtual ~ParamIteratorInterface() {}
+  // A pointer to the base generator instance.
+  // Used only for the purposes of iterator comparison
+  // to make sure that two iterators belong to the same generator.
+  virtual const ParamGeneratorInterface<T>* BaseGenerator() const = 0;
+  // Advances iterator to point to the next element
+  // provided by the generator. The caller is responsible
+  // for not calling Advance() on an iterator equal to
+  // BaseGenerator()->End().
+  virtual void Advance() = 0;
+  // Clones the iterator object. Used for implementing copy semantics
+  // of ParamIterator<T>.
+  virtual ParamIteratorInterface* Clone() const = 0;
+  // Dereferences the current iterator and provides (read-only) access
+  // to the pointed value. It is the caller's responsibility not to call
+  // Current() on an iterator equal to BaseGenerator()->End().
+  // Used for implementing ParamGenerator<T>::operator*().
+  virtual const T* Current() const = 0;
+  // Determines whether the given iterator and other point to the same
+  // element in the sequence generated by the generator.
+  // Used for implementing ParamGenerator<T>::operator==().
+  virtual bool Equals(const ParamIteratorInterface& other) const = 0;
+};
+
+// Class iterating over elements provided by an implementation of
+// ParamGeneratorInterface<T>. It wraps ParamIteratorInterface<T>
+// and implements the const forward iterator concept.
+template <typename T>
+class ParamIterator {
+ public:
+  typedef T value_type;
+  typedef const T& reference;
+  typedef ptrdiff_t difference_type;
+
+  // ParamIterator assumes ownership of the impl_ pointer.
+  ParamIterator(const ParamIterator& other) : impl_(other.impl_->Clone()) {}
+  ParamIterator& operator=(const ParamIterator& other) {
+    if (this != &other)
+      impl_.reset(other.impl_->Clone());
+    return *this;
+  }
+
+  const T& operator*() const { return *impl_->Current(); }
+  const T* operator->() const { return impl_->Current(); }
+  // Prefix version of operator++.
+  ParamIterator& operator++() {
+    impl_->Advance();
+    return *this;
+  }
+  // Postfix version of operator++.
+  ParamIterator operator++(int /*unused*/) {
+    ParamIteratorInterface<T>* clone = impl_->Clone();
+    impl_->Advance();
+    return ParamIterator(clone);
+  }
+  bool operator==(const ParamIterator& other) const {
+    return impl_.get() == other.impl_.get() || impl_->Equals(*other.impl_);
+  }
+  bool operator!=(const ParamIterator& other) const {
+    return !(*this == other);
+  }
+
+ private:
+  friend class ParamGenerator<T>;
+  explicit ParamIterator(ParamIteratorInterface<T>* impl) : impl_(impl) {}
+  scoped_ptr<ParamIteratorInterface<T> > impl_;
+};
+
+// ParamGeneratorInterface<T> is the binary interface to access generators
+// defined in other translation units.
+template <typename T>
+class ParamGeneratorInterface {
+ public:
+  typedef T ParamType;
+
+  virtual ~ParamGeneratorInterface() {}
+
+  // Generator interface definition
+  virtual ParamIteratorInterface<T>* Begin() const = 0;
+  virtual ParamIteratorInterface<T>* End() const = 0;
+};
+
+// Wraps ParamGeneratorInterface<T> and provides general generator syntax
+// compatible with the STL Container concept.
+// This class implements copy initialization semantics and the contained
+// ParamGeneratorInterface<T> instance is shared among all copies
+// of the original object. This is possible because that instance is immutable.
+template<typename T>
+class ParamGenerator {
+ public:
+  typedef ParamIterator<T> iterator;
+
+  explicit ParamGenerator(ParamGeneratorInterface<T>* impl) : impl_(impl) {}
+  ParamGenerator(const ParamGenerator& other) : impl_(other.impl_) {}
+
+  ParamGenerator& operator=(const ParamGenerator& other) {
+    impl_ = other.impl_;
+    return *this;
+  }
+
+  iterator begin() const { return iterator(impl_->Begin()); }
+  iterator end() const { return iterator(impl_->End()); }
+
+ private:
+  linked_ptr<const ParamGeneratorInterface<T> > impl_;
+};
+
+// Generates values from a range of two comparable values. Can be used to
+// generate sequences of user-defined types that implement operator+() and
+// operator<().
+// This class is used in the Range() function.
+template <typename T, typename IncrementT>
+class RangeGenerator : public ParamGeneratorInterface<T> {
+ public:
+  RangeGenerator(T begin, T end, IncrementT step)
+      : begin_(begin), end_(end),
+        step_(step), end_index_(CalculateEndIndex(begin, end, step)) {}
+  virtual ~RangeGenerator() {}
+
+  virtual ParamIteratorInterface<T>* Begin() const {
+    return new Iterator(this, begin_, 0, step_);
+  }
+  virtual ParamIteratorInterface<T>* End() const {
+    return new Iterator(this, end_, end_index_, step_);
+  }
+
+ private:
+  class Iterator : public ParamIteratorInterface<T> {
+   public:
+    Iterator(const ParamGeneratorInterface<T>* base, T value, int index,
+             IncrementT step)
+        : base_(base), value_(value), index_(index), step_(step) {}
+    virtual ~Iterator() {}
+
+    virtual const ParamGeneratorInterface<T>* BaseGenerator() const {
+      return base_;
+    }
+    virtual void Advance() {
+      value_ = value_ + step_;
+      index_++;
+    }
+    virtual ParamIteratorInterface<T>* Clone() const {
+      return new Iterator(*this);
+    }
+    virtual const T* Current() const { return &value_; }
+    virtual bool Equals(const ParamIteratorInterface<T>& other) const {
+      // Having the same base generator guarantees that the other
+      // iterator is of the same type and we can downcast.
+      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
+          << "The program attempted to compare iterators "
+          << "from different generators." << std::endl;
+      const int other_index =
+          CheckedDowncastToActualType<const Iterator>(&other)->index_;
+      return index_ == other_index;
+    }
+
+   private:
+    Iterator(const Iterator& other)
+        : ParamIteratorInterface<T>(),
+          base_(other.base_), value_(other.value_), index_(other.index_),
+          step_(other.step_) {}
+
+    // No implementation - assignment is unsupported.
+    void operator=(const Iterator& other);
+
+    const ParamGeneratorInterface<T>* const base_;
+    T value_;
+    int index_;
+    const IncrementT step_;
+  };  // class RangeGenerator::Iterator
+
+  static int CalculateEndIndex(const T& begin,
+                               const T& end,
+                               const IncrementT& step) {
+    int end_index = 0;
+    for (T i = begin; i < end; i = i + step)
+      end_index++;
+    return end_index;
+  }
+
+  // No implementation - assignment is unsupported.
+  void operator=(const RangeGenerator& other);
+
+  const T begin_;
+  const T end_;
+  const IncrementT step_;
+  // The index for the end() iterator. All the elements in the generated
+  // sequence are indexed (0-based) to aid iterator comparison.
+  const int end_index_;
+};  // class RangeGenerator
+
+
+// Generates values from a pair of STL-style iterators. Used in the
+// ValuesIn() function. The elements are copied from the source range
+// since the source can be located on the stack, and the generator
+// is likely to persist beyond that stack frame.
+template <typename T>
+class ValuesInIteratorRangeGenerator : public ParamGeneratorInterface<T> {
+ public:
+  template <typename ForwardIterator>
+  ValuesInIteratorRangeGenerator(ForwardIterator begin, ForwardIterator end)
+      : container_(begin, end) {}
+  virtual ~ValuesInIteratorRangeGenerator() {}
+
+  virtual ParamIteratorInterface<T>* Begin() const {
+    return new Iterator(this, container_.begin());
+  }
+  virtual ParamIteratorInterface<T>* End() const {
+    return new Iterator(this, container_.end());
+  }
+
+ private:
+  typedef typename ::std::vector<T> ContainerType;
+
+  class Iterator : public ParamIteratorInterface<T> {
+   public:
+    Iterator(const ParamGeneratorInterface<T>* base,
+             typename ContainerType::const_iterator iterator)
+        : base_(base), iterator_(iterator) {}
+    virtual ~Iterator() {}
+
+    virtual const ParamGeneratorInterface<T>* BaseGenerator() const {
+      return base_;
+    }
+    virtual void Advance() {
+      ++iterator_;
+      value_.reset();
+    }
+    virtual ParamIteratorInterface<T>* Clone() const {
+      return new Iterator(*this);
+    }
+    // We need to use cached value referenced by iterator_ because *iterator_
+    // can return a temporary object (and of type other then T), so just
+    // having "return &*iterator_;" doesn't work.
+    // value_ is updated here and not in Advance() because Advance()
+    // can advance iterator_ beyond the end of the range, and we cannot
+    // detect that fact. The client code, on the other hand, is
+    // responsible for not calling Current() on an out-of-range iterator.
+    virtual const T* Current() const {
+      if (value_.get() == NULL)
+        value_.reset(new T(*iterator_));
+      return value_.get();
+    }
+    virtual bool Equals(const ParamIteratorInterface<T>& other) const {
+      // Having the same base generator guarantees that the other
+      // iterator is of the same type and we can downcast.
+      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())
+          << "The program attempted to compare iterators "
+          << "from different generators." << std::endl;
+      return iterator_ ==
+          CheckedDowncastToActualType<const Iterator>(&other)->iterator_;
+    }
+
+   private:
+    Iterator(const Iterator& other)
+          // The explicit constructor call suppresses a false warning
+          // emitted by gcc when supplied with the -Wextra option.
+        : ParamIteratorInterface<T>(),
+          base_(other.base_),
+          iterator_(other.iterator_) {}
+
+    const ParamGeneratorInterface<T>* const base_;
+    typename ContainerType::const_iterator iterator_;
+    // A cached value of *iterator_. We keep it here to allow access by
+    // pointer in the wrapping iterator's operator->().
+    // value_ needs to be mutable to be accessed in Current().
+    // Use of scoped_ptr helps manage cached value's lifetime,
+    // which is bound by the lifespan of the iterator itself.
+    mutable scoped_ptr<const T> value_;
+  };  // class ValuesInIteratorRangeGenerator::Iterator
+
+  // No implementation - assignment is unsupported.
+  void operator=(const ValuesInIteratorRangeGenerator& other);
+
+  const ContainerType container_;
+};  // class ValuesInIteratorRangeGenerator
+
+// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
+//
+// Stores a parameter value and later creates tests parameterized with that
+// value.
+template <class TestClass>
+class ParameterizedTestFactory : public TestFactoryBase {
+ public:
+  typedef typename TestClass::ParamType ParamType;
+  explicit ParameterizedTestFactory(ParamType parameter) :
+      parameter_(parameter) {}
+  virtual Test* CreateTest() {
+    TestClass::SetParam(&parameter_);
+    return new TestClass();
+  }
+
+ private:
+  const ParamType parameter_;
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(ParameterizedTestFactory);
+};
+
+// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
+//
+// TestMetaFactoryBase is a base class for meta-factories that create
+// test factories for passing into MakeAndRegisterTestInfo function.
+template <class ParamType>
+class TestMetaFactoryBase {
+ public:
+  virtual ~TestMetaFactoryBase() {}
+
+  virtual TestFactoryBase* CreateTestFactory(ParamType parameter) = 0;
+};
+
+// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
+//
+// TestMetaFactory creates test factories for passing into
+// MakeAndRegisterTestInfo function. Since MakeAndRegisterTestInfo receives
+// ownership of test factory pointer, same factory object cannot be passed
+// into that method twice. But ParameterizedTestCaseInfo is going to call
+// it for each Test/Parameter value combination. Thus it needs meta factory
+// creator class.
+template <class TestCase>
+class TestMetaFactory
+    : public TestMetaFactoryBase<typename TestCase::ParamType> {
+ public:
+  typedef typename TestCase::ParamType ParamType;
+
+  TestMetaFactory() {}
+
+  virtual TestFactoryBase* CreateTestFactory(ParamType parameter) {
+    return new ParameterizedTestFactory<TestCase>(parameter);
+  }
+
+ private:
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(TestMetaFactory);
+};
+
+// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
+//
+// ParameterizedTestCaseInfoBase is a generic interface
+// to ParameterizedTestCaseInfo classes. ParameterizedTestCaseInfoBase
+// accumulates test information provided by TEST_P macro invocations
+// and generators provided by INSTANTIATE_TEST_CASE_P macro invocations
+// and uses that information to register all resulting test instances
+// in RegisterTests method. The ParameterizeTestCaseRegistry class holds
+// a collection of pointers to the ParameterizedTestCaseInfo objects
+// and calls RegisterTests() on each of them when asked.
+class ParameterizedTestCaseInfoBase {
+ public:
+  virtual ~ParameterizedTestCaseInfoBase() {}
+
+  // Base part of test case name for display purposes.
+  virtual const string& GetTestCaseName() const = 0;
+  // Test case id to verify identity.
+  virtual TypeId GetTestCaseTypeId() const = 0;
+  // UnitTest class invokes this method to register tests in this
+  // test case right before running them in RUN_ALL_TESTS macro.
+  // This method should not be called more then once on any single
+  // instance of a ParameterizedTestCaseInfoBase derived class.
+  virtual void RegisterTests() = 0;
+
+ protected:
+  ParameterizedTestCaseInfoBase() {}
+
+ private:
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(ParameterizedTestCaseInfoBase);
+};
+
+// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
+//
+// ParameterizedTestCaseInfo accumulates tests obtained from TEST_P
+// macro invocations for a particular test case and generators
+// obtained from INSTANTIATE_TEST_CASE_P macro invocations for that
+// test case. It registers tests with all values generated by all
+// generators when asked.
+template <class TestCase>
+class ParameterizedTestCaseInfo : public ParameterizedTestCaseInfoBase {
+ public:
+  // ParamType and GeneratorCreationFunc are private types but are required
+  // for declarations of public methods AddTestPattern() and
+  // AddTestCaseInstantiation().
+  typedef typename TestCase::ParamType ParamType;
+  // A function that returns an instance of appropriate generator type.
+  typedef ParamGenerator<ParamType>(GeneratorCreationFunc)();
+
+  explicit ParameterizedTestCaseInfo(const char* name)
+      : test_case_name_(name) {}
+
+  // Test case base name for display purposes.
+  virtual const string& GetTestCaseName() const { return test_case_name_; }
+  // Test case id to verify identity.
+  virtual TypeId GetTestCaseTypeId() const { return GetTypeId<TestCase>(); }
+  // TEST_P macro uses AddTestPattern() to record information
+  // about a single test in a LocalTestInfo structure.
+  // test_case_name is the base name of the test case (without invocation
+  // prefix). test_base_name is the name of an individual test without
+  // parameter index. For the test SequenceA/FooTest.DoBar/1 FooTest is
+  // test case base name and DoBar is test base name.
+  void AddTestPattern(const char* test_case_name,
+                      const char* test_base_name,
+                      TestMetaFactoryBase<ParamType>* meta_factory) {
+    tests_.push_back(linked_ptr<TestInfo>(new TestInfo(test_case_name,
+                                                       test_base_name,
+                                                       meta_factory)));
+  }
+  // INSTANTIATE_TEST_CASE_P macro uses AddGenerator() to record information
+  // about a generator.
+  int AddTestCaseInstantiation(const string& instantiation_name,
+                               GeneratorCreationFunc* func,
+                               const char* /* file */,
+                               int /* line */) {
+    instantiations_.push_back(::std::make_pair(instantiation_name, func));
+    return 0;  // Return value used only to run this method in namespace scope.
+  }
+  // UnitTest class invokes this method to register tests in this test case
+  // test cases right before running tests in RUN_ALL_TESTS macro.
+  // This method should not be called more then once on any single
+  // instance of a ParameterizedTestCaseInfoBase derived class.
+  // UnitTest has a guard to prevent from calling this method more then once.
+  virtual void RegisterTests() {
+    for (typename TestInfoContainer::iterator test_it = tests_.begin();
+         test_it != tests_.end(); ++test_it) {
+      linked_ptr<TestInfo> test_info = *test_it;
+      for (typename InstantiationContainer::iterator gen_it =
+               instantiations_.begin(); gen_it != instantiations_.end();
+               ++gen_it) {
+        const string& instantiation_name = gen_it->first;
+        ParamGenerator<ParamType> generator((*gen_it->second)());
+
+        string test_case_name;
+        if ( !instantiation_name.empty() )
+          test_case_name = instantiation_name + "/";
+        test_case_name += test_info->test_case_base_name;
+
+        int i = 0;
+        for (typename ParamGenerator<ParamType>::iterator param_it =
+                 generator.begin();
+             param_it != generator.end(); ++param_it, ++i) {
+          Message test_name_stream;
+          test_name_stream << test_info->test_base_name << "/" << i;
+          MakeAndRegisterTestInfo(
+              test_case_name.c_str(),
+              test_name_stream.GetString().c_str(),
+              NULL,  // No type parameter.
+              PrintToString(*param_it).c_str(),
+              GetTestCaseTypeId(),
+              TestCase::SetUpTestCase,
+              TestCase::TearDownTestCase,
+              test_info->test_meta_factory->CreateTestFactory(*param_it));
+        }  // for param_it
+      }  // for gen_it
+    }  // for test_it
+  }  // RegisterTests
+
+ private:
+  // LocalTestInfo structure keeps information about a single test registered
+  // with TEST_P macro.
+  struct TestInfo {
+    TestInfo(const char* a_test_case_base_name,
+             const char* a_test_base_name,
+             TestMetaFactoryBase<ParamType>* a_test_meta_factory) :
+        test_case_base_name(a_test_case_base_name),
+        test_base_name(a_test_base_name),
+        test_meta_factory(a_test_meta_factory) {}
+
+    const string test_case_base_name;
+    const string test_base_name;
+    const scoped_ptr<TestMetaFactoryBase<ParamType> > test_meta_factory;
+  };
+  typedef ::std::vector<linked_ptr<TestInfo> > TestInfoContainer;
+  // Keeps pairs of <Instantiation name, Sequence generator creation function>
+  // received from INSTANTIATE_TEST_CASE_P macros.
+  typedef ::std::vector<std::pair<string, GeneratorCreationFunc*> >
+      InstantiationContainer;
+
+  const string test_case_name_;
+  TestInfoContainer tests_;
+  InstantiationContainer instantiations_;
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(ParameterizedTestCaseInfo);
+};  // class ParameterizedTestCaseInfo
+
+// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
+//
+// ParameterizedTestCaseRegistry contains a map of ParameterizedTestCaseInfoBase
+// classes accessed by test case names. TEST_P and INSTANTIATE_TEST_CASE_P
+// macros use it to locate their corresponding ParameterizedTestCaseInfo
+// descriptors.
+class ParameterizedTestCaseRegistry {
+ public:
+  ParameterizedTestCaseRegistry() {}
+  ~ParameterizedTestCaseRegistry() {
+    for (TestCaseInfoContainer::iterator it = test_case_infos_.begin();
+         it != test_case_infos_.end(); ++it) {
+      delete *it;
+    }
+  }
+
+  // Looks up or creates and returns a structure containing information about
+  // tests and instantiations of a particular test case.
+  template <class TestCase>
+  ParameterizedTestCaseInfo<TestCase>* GetTestCasePatternHolder(
+      const char* test_case_name,
+      const char* file,
+      int line) {
+    ParameterizedTestCaseInfo<TestCase>* typed_test_info = NULL;
+    for (TestCaseInfoContainer::iterator it = test_case_infos_.begin();
+         it != test_case_infos_.end(); ++it) {
+      if ((*it)->GetTestCaseName() == test_case_name) {
+        if ((*it)->GetTestCaseTypeId() != GetTypeId<TestCase>()) {
+          // Complain about incorrect usage of Google Test facilities
+          // and terminate the program since we cannot guaranty correct
+          // test case setup and tear-down in this case.
+          ReportInvalidTestCaseType(test_case_name,  file, line);
+          posix::Abort();
+        } else {
+          // At this point we are sure that the object we found is of the same
+          // type we are looking for, so we downcast it to that type
+          // without further checks.
+          typed_test_info = CheckedDowncastToActualType<
+              ParameterizedTestCaseInfo<TestCase> >(*it);
+        }
+        break;
+      }
+    }
+    if (typed_test_info == NULL) {
+      typed_test_info = new ParameterizedTestCaseInfo<TestCase>(test_case_name);
+      test_case_infos_.push_back(typed_test_info);
+    }
+    return typed_test_info;
+  }
+  void RegisterTests() {
+    for (TestCaseInfoContainer::iterator it = test_case_infos_.begin();
+         it != test_case_infos_.end(); ++it) {
+      (*it)->RegisterTests();
+    }
+  }
+
+ private:
+  typedef ::std::vector<ParameterizedTestCaseInfoBase*> TestCaseInfoContainer;
+
+  TestCaseInfoContainer test_case_infos_;
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(ParameterizedTestCaseRegistry);
+};
+
+}  // namespace internal
+}  // namespace testing
+
+#endif  //  GTEST_HAS_PARAM_TEST
+
+#endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_H_
diff --git a/contrib/gtest-1.7.0/include/gtest/internal/gtest-port.h b/contrib/gtest-1.7.0/include/gtest/internal/gtest-port.h
new file mode 100644
index 0000000..dc4fe0c
--- /dev/null
+++ b/contrib/gtest-1.7.0/include/gtest/internal/gtest-port.h
@@ -0,0 +1,1947 @@
+// Copyright 2005, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Authors: wan at google.com (Zhanyong Wan)
+//
+// Low-level types and utilities for porting Google Test to various
+// platforms.  They are subject to change without notice.  DO NOT USE
+// THEM IN USER CODE.
+//
+// This file is fundamental to Google Test.  All other Google Test source
+// files are expected to #include this.  Therefore, it cannot #include
+// any other Google Test header.
+
+#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PORT_H_
+#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PORT_H_
+
+// The user can define the following macros in the build script to
+// control Google Test's behavior.  If the user doesn't define a macro
+// in this list, Google Test will define it.
+//
+//   GTEST_HAS_CLONE          - Define it to 1/0 to indicate that clone(2)
+//                              is/isn't available.
+//   GTEST_HAS_EXCEPTIONS     - Define it to 1/0 to indicate that exceptions
+//                              are enabled.
+//   GTEST_HAS_GLOBAL_STRING  - Define it to 1/0 to indicate that ::string
+//                              is/isn't available (some systems define
+//                              ::string, which is different to std::string).
+//   GTEST_HAS_GLOBAL_WSTRING - Define it to 1/0 to indicate that ::string
+//                              is/isn't available (some systems define
+//                              ::wstring, which is different to std::wstring).
+//   GTEST_HAS_POSIX_RE       - Define it to 1/0 to indicate that POSIX regular
+//                              expressions are/aren't available.
+//   GTEST_HAS_PTHREAD        - Define it to 1/0 to indicate that <pthread.h>
+//                              is/isn't available.
+//   GTEST_HAS_RTTI           - Define it to 1/0 to indicate that RTTI is/isn't
+//                              enabled.
+//   GTEST_HAS_STD_WSTRING    - Define it to 1/0 to indicate that
+//                              std::wstring does/doesn't work (Google Test can
+//                              be used where std::wstring is unavailable).
+//   GTEST_HAS_TR1_TUPLE      - Define it to 1/0 to indicate tr1::tuple
+//                              is/isn't available.
+//   GTEST_HAS_SEH            - Define it to 1/0 to indicate whether the
+//                              compiler supports Microsoft's "Structured
+//                              Exception Handling".
+//   GTEST_HAS_STREAM_REDIRECTION
+//                            - Define it to 1/0 to indicate whether the
+//                              platform supports I/O stream redirection using
+//                              dup() and dup2().
+//   GTEST_USE_OWN_TR1_TUPLE  - Define it to 1/0 to indicate whether Google
+//                              Test's own tr1 tuple implementation should be
+//                              used.  Unused when the user sets
+//                              GTEST_HAS_TR1_TUPLE to 0.
+//   GTEST_LANG_CXX11         - Define it to 1/0 to indicate that Google Test
+//                              is building in C++11/C++98 mode.
+//   GTEST_LINKED_AS_SHARED_LIBRARY
+//                            - Define to 1 when compiling tests that use
+//                              Google Test as a shared library (known as
+//                              DLL on Windows).
+//   GTEST_CREATE_SHARED_LIBRARY
+//                            - Define to 1 when compiling Google Test itself
+//                              as a shared library.
+
+// This header defines the following utilities:
+//
+// Macros indicating the current platform (defined to 1 if compiled on
+// the given platform; otherwise undefined):
+//   GTEST_OS_AIX      - IBM AIX
+//   GTEST_OS_CYGWIN   - Cygwin
+//   GTEST_OS_HPUX     - HP-UX
+//   GTEST_OS_LINUX    - Linux
+//     GTEST_OS_LINUX_ANDROID - Google Android
+//   GTEST_OS_MAC      - Mac OS X
+//     GTEST_OS_IOS    - iOS
+//       GTEST_OS_IOS_SIMULATOR - iOS simulator
+//   GTEST_OS_NACL     - Google Native Client (NaCl)
+//   GTEST_OS_OPENBSD  - OpenBSD
+//   GTEST_OS_QNX      - QNX
+//   GTEST_OS_SOLARIS  - Sun Solaris
+//   GTEST_OS_SYMBIAN  - Symbian
+//   GTEST_OS_WINDOWS  - Windows (Desktop, MinGW, or Mobile)
+//     GTEST_OS_WINDOWS_DESKTOP  - Windows Desktop
+//     GTEST_OS_WINDOWS_MINGW    - MinGW
+//     GTEST_OS_WINDOWS_MOBILE   - Windows Mobile
+//   GTEST_OS_ZOS      - z/OS
+//
+// Among the platforms, Cygwin, Linux, Max OS X, and Windows have the
+// most stable support.  Since core members of the Google Test project
+// don't have access to other platforms, support for them may be less
+// stable.  If you notice any problems on your platform, please notify
+// googletestframework at googlegroups.com (patches for fixing them are
+// even more welcome!).
+//
+// Note that it is possible that none of the GTEST_OS_* macros are defined.
+//
+// Macros indicating available Google Test features (defined to 1 if
+// the corresponding feature is supported; otherwise undefined):
+//   GTEST_HAS_COMBINE      - the Combine() function (for value-parameterized
+//                            tests)
+//   GTEST_HAS_DEATH_TEST   - death tests
+//   GTEST_HAS_PARAM_TEST   - value-parameterized tests
+//   GTEST_HAS_TYPED_TEST   - typed tests
+//   GTEST_HAS_TYPED_TEST_P - type-parameterized tests
+//   GTEST_USES_POSIX_RE    - enhanced POSIX regex is used. Do not confuse with
+//                            GTEST_HAS_POSIX_RE (see above) which users can
+//                            define themselves.
+//   GTEST_USES_SIMPLE_RE   - our own simple regex is used;
+//                            the above two are mutually exclusive.
+//   GTEST_CAN_COMPARE_NULL - accepts untyped NULL in EXPECT_EQ().
+//
+// Macros for basic C++ coding:
+//   GTEST_AMBIGUOUS_ELSE_BLOCKER_ - for disabling a gcc warning.
+//   GTEST_ATTRIBUTE_UNUSED_  - declares that a class' instances or a
+//                              variable don't have to be used.
+//   GTEST_DISALLOW_ASSIGN_   - disables operator=.
+//   GTEST_DISALLOW_COPY_AND_ASSIGN_ - disables copy ctor and operator=.
+//   GTEST_MUST_USE_RESULT_   - declares that a function's result must be used.
+//
+// Synchronization:
+//   Mutex, MutexLock, ThreadLocal, GetThreadCount()
+//                  - synchronization primitives.
+//   GTEST_IS_THREADSAFE - defined to 1 to indicate that the above
+//                         synchronization primitives have real implementations
+//                         and Google Test is thread-safe; or 0 otherwise.
+//
+// Template meta programming:
+//   is_pointer     - as in TR1; needed on Symbian and IBM XL C/C++ only.
+//   IteratorTraits - partial implementation of std::iterator_traits, which
+//                    is not available in libCstd when compiled with Sun C++.
+//
+// Smart pointers:
+//   scoped_ptr     - as in TR2.
+//
+// Regular expressions:
+//   RE             - a simple regular expression class using the POSIX
+//                    Extended Regular Expression syntax on UNIX-like
+//                    platforms, or a reduced regular exception syntax on
+//                    other platforms, including Windows.
+//
+// Logging:
+//   GTEST_LOG_()   - logs messages at the specified severity level.
+//   LogToStderr()  - directs all log messages to stderr.
+//   FlushInfoLog() - flushes informational log messages.
+//
+// Stdout and stderr capturing:
+//   CaptureStdout()     - starts capturing stdout.
+//   GetCapturedStdout() - stops capturing stdout and returns the captured
+//                         string.
+//   CaptureStderr()     - starts capturing stderr.
+//   GetCapturedStderr() - stops capturing stderr and returns the captured
+//                         string.
+//
+// Integer types:
+//   TypeWithSize   - maps an integer to a int type.
+//   Int32, UInt32, Int64, UInt64, TimeInMillis
+//                  - integers of known sizes.
+//   BiggestInt     - the biggest signed integer type.
+//
+// Command-line utilities:
+//   GTEST_FLAG()       - references a flag.
+//   GTEST_DECLARE_*()  - declares a flag.
+//   GTEST_DEFINE_*()   - defines a flag.
+//   GetInjectableArgvs() - returns the command line as a vector of strings.
+//
+// Environment variable utilities:
+//   GetEnv()             - gets the value of an environment variable.
+//   BoolFromGTestEnv()   - parses a bool environment variable.
+//   Int32FromGTestEnv()  - parses an Int32 environment variable.
+//   StringFromGTestEnv() - parses a string environment variable.
+
+#include <ctype.h>   // for isspace, etc
+#include <stddef.h>  // for ptrdiff_t
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#ifndef _WIN32_WCE
+# include <sys/types.h>
+# include <sys/stat.h>
+#endif  // !_WIN32_WCE
+
+#if defined __APPLE__
+# include <AvailabilityMacros.h>
+# include <TargetConditionals.h>
+#endif
+
+#include <iostream>  // NOLINT
+#include <sstream>  // NOLINT
+#include <string>  // NOLINT
+
+#define GTEST_DEV_EMAIL_ "googletestframework@@googlegroups.com"
+#define GTEST_FLAG_PREFIX_ "gtest_"
+#define GTEST_FLAG_PREFIX_DASH_ "gtest-"
+#define GTEST_FLAG_PREFIX_UPPER_ "GTEST_"
+#define GTEST_NAME_ "Google Test"
+#define GTEST_PROJECT_URL_ "http://code.google.com/p/googletest/"
+
+// Determines the version of gcc that is used to compile this.
+#ifdef __GNUC__
+// 40302 means version 4.3.2.
+# define GTEST_GCC_VER_ \
+    (__GNUC__*10000 + __GNUC_MINOR__*100 + __GNUC_PATCHLEVEL__)
+#endif  // __GNUC__
+
+// Determines the platform on which Google Test is compiled.
+#ifdef __CYGWIN__
+# define GTEST_OS_CYGWIN 1
+#elif defined __SYMBIAN32__
+# define GTEST_OS_SYMBIAN 1
+#elif defined _WIN32
+# define GTEST_OS_WINDOWS 1
+# ifdef _WIN32_WCE
+#  define GTEST_OS_WINDOWS_MOBILE 1
+# elif defined(__MINGW__) || defined(__MINGW32__)
+#  define GTEST_OS_WINDOWS_MINGW 1
+# else
+#  define GTEST_OS_WINDOWS_DESKTOP 1
+# endif  // _WIN32_WCE
+#elif defined __APPLE__
+# define GTEST_OS_MAC 1
+# if TARGET_OS_IPHONE
+#  define GTEST_OS_IOS 1
+#  if TARGET_IPHONE_SIMULATOR
+#   define GTEST_OS_IOS_SIMULATOR 1
+#  endif
+# endif
+#elif defined __linux__
+# define GTEST_OS_LINUX 1
+# if defined __ANDROID__
+#  define GTEST_OS_LINUX_ANDROID 1
+# endif
+#elif defined __MVS__
+# define GTEST_OS_ZOS 1
+#elif defined(__sun) && defined(__SVR4)
+# define GTEST_OS_SOLARIS 1
+#elif defined(_AIX)
+# define GTEST_OS_AIX 1
+#elif defined(__hpux)
+# define GTEST_OS_HPUX 1
+#elif defined __native_client__
+# define GTEST_OS_NACL 1
+#elif defined __OpenBSD__
+# define GTEST_OS_OPENBSD 1
+#elif defined __QNX__
+# define GTEST_OS_QNX 1
+#endif  // __CYGWIN__
+
+#ifndef GTEST_LANG_CXX11
+// gcc and clang define __GXX_EXPERIMENTAL_CXX0X__ when
+// -std={c,gnu}++{0x,11} is passed.  The C++11 standard specifies a
+// value for __cplusplus, and recent versions of clang, gcc, and
+// probably other compilers set that too in C++11 mode.
+# if __GXX_EXPERIMENTAL_CXX0X__ || __cplusplus >= 201103L
+// Compiling in at least C++11 mode.
+#  define GTEST_LANG_CXX11 1
+# else
+#  define GTEST_LANG_CXX11 0
+# endif
+#endif
+
+// Brings in definitions for functions used in the testing::internal::posix
+// namespace (read, write, close, chdir, isatty, stat). We do not currently
+// use them on Windows Mobile.
+#if !GTEST_OS_WINDOWS
+// This assumes that non-Windows OSes provide unistd.h. For OSes where this
+// is not the case, we need to include headers that provide the functions
+// mentioned above.
+# include <unistd.h>
+# include <strings.h>
+#elif !GTEST_OS_WINDOWS_MOBILE
+# include <direct.h>
+# include <io.h>
+#endif
+
+#if GTEST_OS_LINUX_ANDROID
+// Used to define __ANDROID_API__ matching the target NDK API level.
+#  include <android/api-level.h>  // NOLINT
+#endif
+
+// Defines this to true iff Google Test can use POSIX regular expressions.
+#ifndef GTEST_HAS_POSIX_RE
+# if GTEST_OS_LINUX_ANDROID
+// On Android, <regex.h> is only available starting with Gingerbread.
+#  define GTEST_HAS_POSIX_RE (__ANDROID_API__ >= 9)
+# else
+#  define GTEST_HAS_POSIX_RE (!GTEST_OS_WINDOWS)
+# endif
+#endif
+
+#if GTEST_HAS_POSIX_RE
+
+// On some platforms, <regex.h> needs someone to define size_t, and
+// won't compile otherwise.  We can #include it here as we already
+// included <stdlib.h>, which is guaranteed to define size_t through
+// <stddef.h>.
+# include <regex.h>  // NOLINT
+
+# define GTEST_USES_POSIX_RE 1
+
+#elif GTEST_OS_WINDOWS
+
+// <regex.h> is not available on Windows.  Use our own simple regex
+// implementation instead.
+# define GTEST_USES_SIMPLE_RE 1
+
+#else
+
+// <regex.h> may not be available on this platform.  Use our own
+// simple regex implementation instead.
+# define GTEST_USES_SIMPLE_RE 1
+
+#endif  // GTEST_HAS_POSIX_RE
+
+#ifndef GTEST_HAS_EXCEPTIONS
+// The user didn't tell us whether exceptions are enabled, so we need
+// to figure it out.
+# if defined(_MSC_VER) || defined(__BORLANDC__)
+// MSVC's and C++Builder's implementations of the STL use the _HAS_EXCEPTIONS
+// macro to enable exceptions, so we'll do the same.
+// Assumes that exceptions are enabled by default.
+#  ifndef _HAS_EXCEPTIONS
+#   define _HAS_EXCEPTIONS 1
+#  endif  // _HAS_EXCEPTIONS
+#  define GTEST_HAS_EXCEPTIONS _HAS_EXCEPTIONS
+# elif defined(__GNUC__) && __EXCEPTIONS
+// gcc defines __EXCEPTIONS to 1 iff exceptions are enabled.
+#  define GTEST_HAS_EXCEPTIONS 1
+# elif defined(__SUNPRO_CC)
+// Sun Pro CC supports exceptions.  However, there is no compile-time way of
+// detecting whether they are enabled or not.  Therefore, we assume that
+// they are enabled unless the user tells us otherwise.
+#  define GTEST_HAS_EXCEPTIONS 1
+# elif defined(__IBMCPP__) && __EXCEPTIONS
+// xlC defines __EXCEPTIONS to 1 iff exceptions are enabled.
+#  define GTEST_HAS_EXCEPTIONS 1
+# elif defined(__HP_aCC)
+// Exception handling is in effect by default in HP aCC compiler. It has to
+// be turned of by +noeh compiler option if desired.
+#  define GTEST_HAS_EXCEPTIONS 1
+# else
+// For other compilers, we assume exceptions are disabled to be
+// conservative.
+#  define GTEST_HAS_EXCEPTIONS 0
+# endif  // defined(_MSC_VER) || defined(__BORLANDC__)
+#endif  // GTEST_HAS_EXCEPTIONS
+
+#if !defined(GTEST_HAS_STD_STRING)
+// Even though we don't use this macro any longer, we keep it in case
+// some clients still depend on it.
+# define GTEST_HAS_STD_STRING 1
+#elif !GTEST_HAS_STD_STRING
+// The user told us that ::std::string isn't available.
+# error "Google Test cannot be used where ::std::string isn't available."
+#endif  // !defined(GTEST_HAS_STD_STRING)
+
+#ifndef GTEST_HAS_GLOBAL_STRING
+// The user didn't tell us whether ::string is available, so we need
+// to figure it out.
+
+# define GTEST_HAS_GLOBAL_STRING 0
+
+#endif  // GTEST_HAS_GLOBAL_STRING
+
+#ifndef GTEST_HAS_STD_WSTRING
+// The user didn't tell us whether ::std::wstring is available, so we need
+// to figure it out.
+// TODO(wan at google.com): uses autoconf to detect whether ::std::wstring
+//   is available.
+
+// Cygwin 1.7 and below doesn't support ::std::wstring.
+// Solaris' libc++ doesn't support it either.  Android has
+// no support for it at least as recent as Froyo (2.2).
+# define GTEST_HAS_STD_WSTRING \
+    (!(GTEST_OS_LINUX_ANDROID || GTEST_OS_CYGWIN || GTEST_OS_SOLARIS))
+
+#endif  // GTEST_HAS_STD_WSTRING
+
+#ifndef GTEST_HAS_GLOBAL_WSTRING
+// The user didn't tell us whether ::wstring is available, so we need
+// to figure it out.
+# define GTEST_HAS_GLOBAL_WSTRING \
+    (GTEST_HAS_STD_WSTRING && GTEST_HAS_GLOBAL_STRING)
+#endif  // GTEST_HAS_GLOBAL_WSTRING
+
+// Determines whether RTTI is available.
+#ifndef GTEST_HAS_RTTI
+// The user didn't tell us whether RTTI is enabled, so we need to
+// figure it out.
+
+# ifdef _MSC_VER
+
+#  ifdef _CPPRTTI  // MSVC defines this macro iff RTTI is enabled.
+#   define GTEST_HAS_RTTI 1
+#  else
+#   define GTEST_HAS_RTTI 0
+#  endif
+
+// Starting with version 4.3.2, gcc defines __GXX_RTTI iff RTTI is enabled.
+# elif defined(__GNUC__) && (GTEST_GCC_VER_ >= 40302)
+
+#  ifdef __GXX_RTTI
+// When building against STLport with the Android NDK and with
+// -frtti -fno-exceptions, the build fails at link time with undefined
+// references to __cxa_bad_typeid. Note sure if STL or toolchain bug,
+// so disable RTTI when detected.
+#   if GTEST_OS_LINUX_ANDROID && defined(_STLPORT_MAJOR) && \
+       !defined(__EXCEPTIONS)
+#    define GTEST_HAS_RTTI 0
+#   else
+#    define GTEST_HAS_RTTI 1
+#   endif  // GTEST_OS_LINUX_ANDROID && __STLPORT_MAJOR && !__EXCEPTIONS
+#  else
+#   define GTEST_HAS_RTTI 0
+#  endif  // __GXX_RTTI
+
+// Clang defines __GXX_RTTI starting with version 3.0, but its manual recommends
+// using has_feature instead. has_feature(cxx_rtti) is supported since 2.7, the
+// first version with C++ support.
+# elif defined(__clang__)
+
+#  define GTEST_HAS_RTTI __has_feature(cxx_rtti)
+
+// Starting with version 9.0 IBM Visual Age defines __RTTI_ALL__ to 1 if
+// both the typeid and dynamic_cast features are present.
+# elif defined(__IBMCPP__) && (__IBMCPP__ >= 900)
+
+#  ifdef __RTTI_ALL__
+#   define GTEST_HAS_RTTI 1
+#  else
+#   define GTEST_HAS_RTTI 0
+#  endif
+
+# else
+
+// For all other compilers, we assume RTTI is enabled.
+#  define GTEST_HAS_RTTI 1
+
+# endif  // _MSC_VER
+
+#endif  // GTEST_HAS_RTTI
+
+// It's this header's responsibility to #include <typeinfo> when RTTI
+// is enabled.
+#if GTEST_HAS_RTTI
+# include <typeinfo>
+#endif
+
+// Determines whether Google Test can use the pthreads library.
+#ifndef GTEST_HAS_PTHREAD
+// The user didn't tell us explicitly, so we assume pthreads support is
+// available on Linux and Mac.
+//
+// To disable threading support in Google Test, add -DGTEST_HAS_PTHREAD=0
+// to your compiler flags.
+# define GTEST_HAS_PTHREAD (GTEST_OS_LINUX || GTEST_OS_MAC || GTEST_OS_HPUX \
+    || GTEST_OS_QNX)
+#endif  // GTEST_HAS_PTHREAD
+
+#if GTEST_HAS_PTHREAD
+// gtest-port.h guarantees to #include <pthread.h> when GTEST_HAS_PTHREAD is
+// true.
+# include <pthread.h>  // NOLINT
+
+// For timespec and nanosleep, used below.
+# include <time.h>  // NOLINT
+#endif
+
+// Determines whether Google Test can use tr1/tuple.  You can define
+// this macro to 0 to prevent Google Test from using tuple (any
+// feature depending on tuple with be disabled in this mode).
+#ifndef GTEST_HAS_TR1_TUPLE
+# if GTEST_OS_LINUX_ANDROID && defined(_STLPORT_MAJOR)
+// STLport, provided with the Android NDK, has neither <tr1/tuple> or <tuple>.
+#  define GTEST_HAS_TR1_TUPLE 0
+# else
+// The user didn't tell us not to do it, so we assume it's OK.
+#  define GTEST_HAS_TR1_TUPLE 1
+# endif
+#endif  // GTEST_HAS_TR1_TUPLE
+
+// Determines whether Google Test's own tr1 tuple implementation
+// should be used.
+#ifndef GTEST_USE_OWN_TR1_TUPLE
+// The user didn't tell us, so we need to figure it out.
+
+// We use our own TR1 tuple if we aren't sure the user has an
+// implementation of it already.  At this time, libstdc++ 4.0.0+ and
+// MSVC 2010 are the only mainstream standard libraries that come
+// with a TR1 tuple implementation.  NVIDIA's CUDA NVCC compiler
+// pretends to be GCC by defining __GNUC__ and friends, but cannot
+// compile GCC's tuple implementation.  MSVC 2008 (9.0) provides TR1
+// tuple in a 323 MB Feature Pack download, which we cannot assume the
+// user has.  QNX's QCC compiler is a modified GCC but it doesn't
+// support TR1 tuple.  libc++ only provides std::tuple, in C++11 mode,
+// and it can be used with some compilers that define __GNUC__.
+# if (defined(__GNUC__) && !defined(__CUDACC__) && (GTEST_GCC_VER_ >= 40000) \
+      && !GTEST_OS_QNX && !defined(_LIBCPP_VERSION)) || _MSC_VER >= 1600
+#  define GTEST_ENV_HAS_TR1_TUPLE_ 1
+# endif
+
+// C++11 specifies that <tuple> provides std::tuple. Use that if gtest is used
+// in C++11 mode and libstdc++ isn't very old (binaries targeting OS X 10.6
+// can build with clang but need to use gcc4.2's libstdc++).
+# if GTEST_LANG_CXX11 && (!defined(__GLIBCXX__) || __GLIBCXX__ > 20110325)
+#  define GTEST_ENV_HAS_STD_TUPLE_ 1
+# endif
+
+# if GTEST_ENV_HAS_TR1_TUPLE_ || GTEST_ENV_HAS_STD_TUPLE_
+#  define GTEST_USE_OWN_TR1_TUPLE 0
+# else
+#  define GTEST_USE_OWN_TR1_TUPLE 1
+# endif
+
+#endif  // GTEST_USE_OWN_TR1_TUPLE
+
+// To avoid conditional compilation everywhere, we make it
+// gtest-port.h's responsibility to #include the header implementing
+// tr1/tuple.
+#if GTEST_HAS_TR1_TUPLE
+
+# if GTEST_USE_OWN_TR1_TUPLE
+#  include "gtest/internal/gtest-tuple.h"
+# elif GTEST_ENV_HAS_STD_TUPLE_
+#  include <tuple>
+// C++11 puts its tuple into the ::std namespace rather than
+// ::std::tr1.  gtest expects tuple to live in ::std::tr1, so put it there.
+// This causes undefined behavior, but supported compilers react in
+// the way we intend.
+namespace std {
+namespace tr1 {
+using ::std::get;
+using ::std::make_tuple;
+using ::std::tuple;
+using ::std::tuple_element;
+using ::std::tuple_size;
+}
+}
+
+# elif GTEST_OS_SYMBIAN
+
+// On Symbian, BOOST_HAS_TR1_TUPLE causes Boost's TR1 tuple library to
+// use STLport's tuple implementation, which unfortunately doesn't
+// work as the copy of STLport distributed with Symbian is incomplete.
+// By making sure BOOST_HAS_TR1_TUPLE is undefined, we force Boost to
+// use its own tuple implementation.
+#  ifdef BOOST_HAS_TR1_TUPLE
+#   undef BOOST_HAS_TR1_TUPLE
+#  endif  // BOOST_HAS_TR1_TUPLE
+
+// This prevents <boost/tr1/detail/config.hpp>, which defines
+// BOOST_HAS_TR1_TUPLE, from being #included by Boost's <tuple>.
+#  define BOOST_TR1_DETAIL_CONFIG_HPP_INCLUDED
+#  include <tuple>
+
+# elif defined(__GNUC__) && (GTEST_GCC_VER_ >= 40000)
+// GCC 4.0+ implements tr1/tuple in the <tr1/tuple> header.  This does
+// not conform to the TR1 spec, which requires the header to be <tuple>.
+
+#  if !GTEST_HAS_RTTI && GTEST_GCC_VER_ < 40302
+// Until version 4.3.2, gcc has a bug that causes <tr1/functional>,
+// which is #included by <tr1/tuple>, to not compile when RTTI is
+// disabled.  _TR1_FUNCTIONAL is the header guard for
+// <tr1/functional>.  Hence the following #define is a hack to prevent
+// <tr1/functional> from being included.
+#   define _TR1_FUNCTIONAL 1
+#   include <tr1/tuple>
+#   undef _TR1_FUNCTIONAL  // Allows the user to #include
+                        // <tr1/functional> if he chooses to.
+#  else
+#   include <tr1/tuple>  // NOLINT
+#  endif  // !GTEST_HAS_RTTI && GTEST_GCC_VER_ < 40302
+
+# else
+// If the compiler is not GCC 4.0+, we assume the user is using a
+// spec-conforming TR1 implementation.
+#  include <tuple>  // NOLINT
+# endif  // GTEST_USE_OWN_TR1_TUPLE
+
+#endif  // GTEST_HAS_TR1_TUPLE
+
+// Determines whether clone(2) is supported.
+// Usually it will only be available on Linux, excluding
+// Linux on the Itanium architecture.
+// Also see http://linux.die.net/man/2/clone.
+#ifndef GTEST_HAS_CLONE
+// The user didn't tell us, so we need to figure it out.
+
+# if GTEST_OS_LINUX && !defined(__ia64__)
+#  if GTEST_OS_LINUX_ANDROID
+// On Android, clone() is only available on ARM starting with Gingerbread.
+#    if defined(__arm__) && __ANDROID_API__ >= 9
+#     define GTEST_HAS_CLONE 1
+#    else
+#     define GTEST_HAS_CLONE 0
+#    endif
+#  else
+#   define GTEST_HAS_CLONE 1
+#  endif
+# else
+#  define GTEST_HAS_CLONE 0
+# endif  // GTEST_OS_LINUX && !defined(__ia64__)
+
+#endif  // GTEST_HAS_CLONE
+
+// Determines whether to support stream redirection. This is used to test
+// output correctness and to implement death tests.
+#ifndef GTEST_HAS_STREAM_REDIRECTION
+// By default, we assume that stream redirection is supported on all
+// platforms except known mobile ones.
+# if GTEST_OS_WINDOWS_MOBILE || GTEST_OS_SYMBIAN
+#  define GTEST_HAS_STREAM_REDIRECTION 0
+# else
+#  define GTEST_HAS_STREAM_REDIRECTION 1
+# endif  // !GTEST_OS_WINDOWS_MOBILE && !GTEST_OS_SYMBIAN
+#endif  // GTEST_HAS_STREAM_REDIRECTION
+
+// Determines whether to support death tests.
+// Google Test does not support death tests for VC 7.1 and earlier as
+// abort() in a VC 7.1 application compiled as GUI in debug config
+// pops up a dialog window that cannot be suppressed programmatically.
+#if (GTEST_OS_LINUX || GTEST_OS_CYGWIN || GTEST_OS_SOLARIS || \
+     (GTEST_OS_MAC && !GTEST_OS_IOS) || GTEST_OS_IOS_SIMULATOR || \
+     (GTEST_OS_WINDOWS_DESKTOP && _MSC_VER >= 1400) || \
+     GTEST_OS_WINDOWS_MINGW || GTEST_OS_AIX || GTEST_OS_HPUX || \
+     GTEST_OS_OPENBSD || GTEST_OS_QNX)
+# define GTEST_HAS_DEATH_TEST 1
+# include <vector>  // NOLINT
+#endif
+
+// We don't support MSVC 7.1 with exceptions disabled now.  Therefore
+// all the compilers we care about are adequate for supporting
+// value-parameterized tests.
+#define GTEST_HAS_PARAM_TEST 1
+
+// Determines whether to support type-driven tests.
+
+// Typed tests need <typeinfo> and variadic macros, which GCC, VC++ 8.0,
+// Sun Pro CC, IBM Visual Age, and HP aCC support.
+#if defined(__GNUC__) || (_MSC_VER >= 1400) || defined(__SUNPRO_CC) || \
+    defined(__IBMCPP__) || defined(__HP_aCC)
+# define GTEST_HAS_TYPED_TEST 1
+# define GTEST_HAS_TYPED_TEST_P 1
+#endif
+
+// Determines whether to support Combine(). This only makes sense when
+// value-parameterized tests are enabled.  The implementation doesn't
+// work on Sun Studio since it doesn't understand templated conversion
+// operators.
+#if GTEST_HAS_PARAM_TEST && GTEST_HAS_TR1_TUPLE && !defined(__SUNPRO_CC)
+# define GTEST_HAS_COMBINE 1
+#endif
+
+// Determines whether the system compiler uses UTF-16 for encoding wide strings.
+#define GTEST_WIDE_STRING_USES_UTF16_ \
+    (GTEST_OS_WINDOWS || GTEST_OS_CYGWIN || GTEST_OS_SYMBIAN || GTEST_OS_AIX)
+
+// Determines whether test results can be streamed to a socket.
+#if GTEST_OS_LINUX
+# define GTEST_CAN_STREAM_RESULTS_ 1
+#endif
+
+// Defines some utility macros.
+
+// The GNU compiler emits a warning if nested "if" statements are followed by
+// an "else" statement and braces are not used to explicitly disambiguate the
+// "else" binding.  This leads to problems with code like:
+//
+//   if (gate)
+//     ASSERT_*(condition) << "Some message";
+//
+// The "switch (0) case 0:" idiom is used to suppress this.
+#ifdef __INTEL_COMPILER
+# define GTEST_AMBIGUOUS_ELSE_BLOCKER_
+#else
+# define GTEST_AMBIGUOUS_ELSE_BLOCKER_ switch (0) case 0: default:  // NOLINT
+#endif
+
+// Use this annotation at the end of a struct/class definition to
+// prevent the compiler from optimizing away instances that are never
+// used.  This is useful when all interesting logic happens inside the
+// c'tor and / or d'tor.  Example:
+//
+//   struct Foo {
+//     Foo() { ... }
+//   } GTEST_ATTRIBUTE_UNUSED_;
+//
+// Also use it after a variable or parameter declaration to tell the
+// compiler the variable/parameter does not have to be used.
+#if defined(__GNUC__) && !defined(COMPILER_ICC)
+# define GTEST_ATTRIBUTE_UNUSED_ __attribute__ ((unused))
+#else
+# define GTEST_ATTRIBUTE_UNUSED_
+#endif
+
+// A macro to disallow operator=
+// This should be used in the private: declarations for a class.
+#define GTEST_DISALLOW_ASSIGN_(type)\
+  void operator=(type const &)
+
+// A macro to disallow copy constructor and operator=
+// This should be used in the private: declarations for a class.
+#define GTEST_DISALLOW_COPY_AND_ASSIGN_(type)\
+  type(type const &);\
+  GTEST_DISALLOW_ASSIGN_(type)
+
+// Tell the compiler to warn about unused return values for functions declared
+// with this macro.  The macro should be used on function declarations
+// following the argument list:
+//
+//   Sprocket* AllocateSprocket() GTEST_MUST_USE_RESULT_;
+#if defined(__GNUC__) && (GTEST_GCC_VER_ >= 30400) && !defined(COMPILER_ICC)
+# define GTEST_MUST_USE_RESULT_ __attribute__ ((warn_unused_result))
+#else
+# define GTEST_MUST_USE_RESULT_
+#endif  // __GNUC__ && (GTEST_GCC_VER_ >= 30400) && !COMPILER_ICC
+
+// Determine whether the compiler supports Microsoft's Structured Exception
+// Handling.  This is supported by several Windows compilers but generally
+// does not exist on any other system.
+#ifndef GTEST_HAS_SEH
+// The user didn't tell us, so we need to figure it out.
+
+# if defined(_MSC_VER) || defined(__BORLANDC__)
+// These two compilers are known to support SEH.
+#  define GTEST_HAS_SEH 1
+# else
+// Assume no SEH.
+#  define GTEST_HAS_SEH 0
+# endif
+
+#endif  // GTEST_HAS_SEH
+
+#ifdef _MSC_VER
+
+# if GTEST_LINKED_AS_SHARED_LIBRARY
+#  define GTEST_API_ __declspec(dllimport)
+# elif GTEST_CREATE_SHARED_LIBRARY
+#  define GTEST_API_ __declspec(dllexport)
+# endif
+
+#endif  // _MSC_VER
+
+#ifndef GTEST_API_
+# define GTEST_API_
+#endif
+
+#ifdef __GNUC__
+// Ask the compiler to never inline a given function.
+# define GTEST_NO_INLINE_ __attribute__((noinline))
+#else
+# define GTEST_NO_INLINE_
+#endif
+
+// _LIBCPP_VERSION is defined by the libc++ library from the LLVM project.
+#if defined(__GLIBCXX__) || defined(_LIBCPP_VERSION)
+# define GTEST_HAS_CXXABI_H_ 1
+#else
+# define GTEST_HAS_CXXABI_H_ 0
+#endif
+
+namespace testing {
+
+class Message;
+
+namespace internal {
+
+// A secret type that Google Test users don't know about.  It has no
+// definition on purpose.  Therefore it's impossible to create a
+// Secret object, which is what we want.
+class Secret;
+
+// The GTEST_COMPILE_ASSERT_ macro can be used to verify that a compile time
+// expression is true. For example, you could use it to verify the
+// size of a static array:
+//
+//   GTEST_COMPILE_ASSERT_(ARRAYSIZE(content_type_names) == CONTENT_NUM_TYPES,
+//                         content_type_names_incorrect_size);
+//
+// or to make sure a struct is smaller than a certain size:
+//
+//   GTEST_COMPILE_ASSERT_(sizeof(foo) < 128, foo_too_large);
+//
+// The second argument to the macro is the name of the variable. If
+// the expression is false, most compilers will issue a warning/error
+// containing the name of the variable.
+
+template <bool>
+struct CompileAssert {
+};
+
+#define GTEST_COMPILE_ASSERT_(expr, msg) \
+  typedef ::testing::internal::CompileAssert<(static_cast<bool>(expr))> \
+      msg[static_cast<bool>(expr) ? 1 : -1] GTEST_ATTRIBUTE_UNUSED_
+
+// Implementation details of GTEST_COMPILE_ASSERT_:
+//
+// - GTEST_COMPILE_ASSERT_ works by defining an array type that has -1
+//   elements (and thus is invalid) when the expression is false.
+//
+// - The simpler definition
+//
+//    #define GTEST_COMPILE_ASSERT_(expr, msg) typedef char msg[(expr) ? 1 : -1]
+//
+//   does not work, as gcc supports variable-length arrays whose sizes
+//   are determined at run-time (this is gcc's extension and not part
+//   of the C++ standard).  As a result, gcc fails to reject the
+//   following code with the simple definition:
+//
+//     int foo;
+//     GTEST_COMPILE_ASSERT_(foo, msg); // not supposed to compile as foo is
+//                                      // not a compile-time constant.
+//
+// - By using the type CompileAssert<(bool(expr))>, we ensures that
+//   expr is a compile-time constant.  (Template arguments must be
+//   determined at compile-time.)
+//
+// - The outter parentheses in CompileAssert<(bool(expr))> are necessary
+//   to work around a bug in gcc 3.4.4 and 4.0.1.  If we had written
+//
+//     CompileAssert<bool(expr)>
+//
+//   instead, these compilers will refuse to compile
+//
+//     GTEST_COMPILE_ASSERT_(5 > 0, some_message);
+//
+//   (They seem to think the ">" in "5 > 0" marks the end of the
+//   template argument list.)
+//
+// - The array size is (bool(expr) ? 1 : -1), instead of simply
+//
+//     ((expr) ? 1 : -1).
+//
+//   This is to avoid running into a bug in MS VC 7.1, which
+//   causes ((0.0) ? 1 : -1) to incorrectly evaluate to 1.
+
+// StaticAssertTypeEqHelper is used by StaticAssertTypeEq defined in gtest.h.
+//
+// This template is declared, but intentionally undefined.
+template <typename T1, typename T2>
+struct StaticAssertTypeEqHelper;
+
+template <typename T>
+struct StaticAssertTypeEqHelper<T, T> {};
+
+#if GTEST_HAS_GLOBAL_STRING
+typedef ::string string;
+#else
+typedef ::std::string string;
+#endif  // GTEST_HAS_GLOBAL_STRING
+
+#if GTEST_HAS_GLOBAL_WSTRING
+typedef ::wstring wstring;
+#elif GTEST_HAS_STD_WSTRING
+typedef ::std::wstring wstring;
+#endif  // GTEST_HAS_GLOBAL_WSTRING
+
+// A helper for suppressing warnings on constant condition.  It just
+// returns 'condition'.
+GTEST_API_ bool IsTrue(bool condition);
+
+// Defines scoped_ptr.
+
+// This implementation of scoped_ptr is PARTIAL - it only contains
+// enough stuff to satisfy Google Test's need.
+template <typename T>
+class scoped_ptr {
+ public:
+  typedef T element_type;
+
+  explicit scoped_ptr(T* p = NULL) : ptr_(p) {}
+  ~scoped_ptr() { reset(); }
+
+  T& operator*() const { return *ptr_; }
+  T* operator->() const { return ptr_; }
+  T* get() const { return ptr_; }
+
+  T* release() {
+    T* const ptr = ptr_;
+    ptr_ = NULL;
+    return ptr;
+  }
+
+  void reset(T* p = NULL) {
+    if (p != ptr_) {
+      if (IsTrue(sizeof(T) > 0)) {  // Makes sure T is a complete type.
+        delete ptr_;
+      }
+      ptr_ = p;
+    }
+  }
+
+ private:
+  T* ptr_;
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(scoped_ptr);
+};
+
+// Defines RE.
+
+// A simple C++ wrapper for <regex.h>.  It uses the POSIX Extended
+// Regular Expression syntax.
+class GTEST_API_ RE {
+ public:
+  // A copy constructor is required by the Standard to initialize object
+  // references from r-values.
+  RE(const RE& other) { Init(other.pattern()); }
+
+  // Constructs an RE from a string.
+  RE(const ::std::string& regex) { Init(regex.c_str()); }  // NOLINT
+
+#if GTEST_HAS_GLOBAL_STRING
+
+  RE(const ::string& regex) { Init(regex.c_str()); }  // NOLINT
+
+#endif  // GTEST_HAS_GLOBAL_STRING
+
+  RE(const char* regex) { Init(regex); }  // NOLINT
+  ~RE();
+
+  // Returns the string representation of the regex.
+  const char* pattern() const { return pattern_; }
+
+  // FullMatch(str, re) returns true iff regular expression re matches
+  // the entire str.
+  // PartialMatch(str, re) returns true iff regular expression re
+  // matches a substring of str (including str itself).
+  //
+  // TODO(wan at google.com): make FullMatch() and PartialMatch() work
+  // when str contains NUL characters.
+  static bool FullMatch(const ::std::string& str, const RE& re) {
+    return FullMatch(str.c_str(), re);
+  }
+  static bool PartialMatch(const ::std::string& str, const RE& re) {
+    return PartialMatch(str.c_str(), re);
+  }
+
+#if GTEST_HAS_GLOBAL_STRING
+
+  static bool FullMatch(const ::string& str, const RE& re) {
+    return FullMatch(str.c_str(), re);
+  }
+  static bool PartialMatch(const ::string& str, const RE& re) {
+    return PartialMatch(str.c_str(), re);
+  }
+
+#endif  // GTEST_HAS_GLOBAL_STRING
+
+  static bool FullMatch(const char* str, const RE& re);
+  static bool PartialMatch(const char* str, const RE& re);
+
+ private:
+  void Init(const char* regex);
+
+  // We use a const char* instead of an std::string, as Google Test used to be
+  // used where std::string is not available.  TODO(wan at google.com): change to
+  // std::string.
+  const char* pattern_;
+  bool is_valid_;
+
+#if GTEST_USES_POSIX_RE
+
+  regex_t full_regex_;     // For FullMatch().
+  regex_t partial_regex_;  // For PartialMatch().
+
+#else  // GTEST_USES_SIMPLE_RE
+
+  const char* full_pattern_;  // For FullMatch();
+
+#endif
+
+  GTEST_DISALLOW_ASSIGN_(RE);
+};
+
+// Formats a source file path and a line number as they would appear
+// in an error message from the compiler used to compile this code.
+GTEST_API_ ::std::string FormatFileLocation(const char* file, int line);
+
+// Formats a file location for compiler-independent XML output.
+// Although this function is not platform dependent, we put it next to
+// FormatFileLocation in order to contrast the two functions.
+GTEST_API_ ::std::string FormatCompilerIndependentFileLocation(const char* file,
+                                                               int line);
+
+// Defines logging utilities:
+//   GTEST_LOG_(severity) - logs messages at the specified severity level. The
+//                          message itself is streamed into the macro.
+//   LogToStderr()  - directs all log messages to stderr.
+//   FlushInfoLog() - flushes informational log messages.
+
+enum GTestLogSeverity {
+  GTEST_INFO,
+  GTEST_WARNING,
+  GTEST_ERROR,
+  GTEST_FATAL
+};
+
+// Formats log entry severity, provides a stream object for streaming the
+// log message, and terminates the message with a newline when going out of
+// scope.
+class GTEST_API_ GTestLog {
+ public:
+  GTestLog(GTestLogSeverity severity, const char* file, int line);
+
+  // Flushes the buffers and, if severity is GTEST_FATAL, aborts the program.
+  ~GTestLog();
+
+  ::std::ostream& GetStream() { return ::std::cerr; }
+
+ private:
+  const GTestLogSeverity severity_;
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(GTestLog);
+};
+
+#define GTEST_LOG_(severity) \
+    ::testing::internal::GTestLog(::testing::internal::GTEST_##severity, \
+                                  __FILE__, __LINE__).GetStream()
+
+inline void LogToStderr() {}
+inline void FlushInfoLog() { fflush(NULL); }
+
+// INTERNAL IMPLEMENTATION - DO NOT USE.
+//
+// GTEST_CHECK_ is an all-mode assert. It aborts the program if the condition
+// is not satisfied.
+//  Synopsys:
+//    GTEST_CHECK_(boolean_condition);
+//     or
+//    GTEST_CHECK_(boolean_condition) << "Additional message";
+//
+//    This checks the condition and if the condition is not satisfied
+//    it prints message about the condition violation, including the
+//    condition itself, plus additional message streamed into it, if any,
+//    and then it aborts the program. It aborts the program irrespective of
+//    whether it is built in the debug mode or not.
+#define GTEST_CHECK_(condition) \
+    GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
+    if (::testing::internal::IsTrue(condition)) \
+      ; \
+    else \
+      GTEST_LOG_(FATAL) << "Condition " #condition " failed. "
+
+// An all-mode assert to verify that the given POSIX-style function
+// call returns 0 (indicating success).  Known limitation: this
+// doesn't expand to a balanced 'if' statement, so enclose the macro
+// in {} if you need to use it as the only statement in an 'if'
+// branch.
+#define GTEST_CHECK_POSIX_SUCCESS_(posix_call) \
+  if (const int gtest_error = (posix_call)) \
+    GTEST_LOG_(FATAL) << #posix_call << "failed with error " \
+                      << gtest_error
+
+// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.
+//
+// Use ImplicitCast_ as a safe version of static_cast for upcasting in
+// the type hierarchy (e.g. casting a Foo* to a SuperclassOfFoo* or a
+// const Foo*).  When you use ImplicitCast_, the compiler checks that
+// the cast is safe.  Such explicit ImplicitCast_s are necessary in
+// surprisingly many situations where C++ demands an exact type match
+// instead of an argument type convertable to a target type.
+//
+// The syntax for using ImplicitCast_ is the same as for static_cast:
+//
+//   ImplicitCast_<ToType>(expr)
+//
+// ImplicitCast_ would have been part of the C++ standard library,
+// but the proposal was submitted too late.  It will probably make
+// its way into the language in the future.
+//
+// This relatively ugly name is intentional. It prevents clashes with
+// similar functions users may have (e.g., implicit_cast). The internal
+// namespace alone is not enough because the function can be found by ADL.
+template<typename To>
+inline To ImplicitCast_(To x) { return x; }
+
+// When you upcast (that is, cast a pointer from type Foo to type
+// SuperclassOfFoo), it's fine to use ImplicitCast_<>, since upcasts
+// always succeed.  When you downcast (that is, cast a pointer from
+// type Foo to type SubclassOfFoo), static_cast<> isn't safe, because
+// how do you know the pointer is really of type SubclassOfFoo?  It
+// could be a bare Foo, or of type DifferentSubclassOfFoo.  Thus,
+// when you downcast, you should use this macro.  In debug mode, we
+// use dynamic_cast<> to double-check the downcast is legal (we die
+// if it's not).  In normal mode, we do the efficient static_cast<>
+// instead.  Thus, it's important to test in debug mode to make sure
+// the cast is legal!
+//    This is the only place in the code we should use dynamic_cast<>.
+// In particular, you SHOULDN'T be using dynamic_cast<> in order to
+// do RTTI (eg code like this:
+//    if (dynamic_cast<Subclass1>(foo)) HandleASubclass1Object(foo);
+//    if (dynamic_cast<Subclass2>(foo)) HandleASubclass2Object(foo);
+// You should design the code some other way not to need this.
+//
+// This relatively ugly name is intentional. It prevents clashes with
+// similar functions users may have (e.g., down_cast). The internal
+// namespace alone is not enough because the function can be found by ADL.
+template<typename To, typename From>  // use like this: DownCast_<T*>(foo);
+inline To DownCast_(From* f) {  // so we only accept pointers
+  // Ensures that To is a sub-type of From *.  This test is here only
+  // for compile-time type checking, and has no overhead in an
+  // optimized build at run-time, as it will be optimized away
+  // completely.
+  if (false) {
+    const To to = NULL;
+    ::testing::internal::ImplicitCast_<From*>(to);
+  }
+
+#if GTEST_HAS_RTTI
+  // RTTI: debug mode only!
+  GTEST_CHECK_(f == NULL || dynamic_cast<To>(f) != NULL);
+#endif
+  return static_cast<To>(f);
+}
+
+// Downcasts the pointer of type Base to Derived.
+// Derived must be a subclass of Base. The parameter MUST
+// point to a class of type Derived, not any subclass of it.
+// When RTTI is available, the function performs a runtime
+// check to enforce this.
+template <class Derived, class Base>
+Derived* CheckedDowncastToActualType(Base* base) {
+#if GTEST_HAS_RTTI
+  GTEST_CHECK_(typeid(*base) == typeid(Derived));
+  return dynamic_cast<Derived*>(base);  // NOLINT
+#else
+  return static_cast<Derived*>(base);  // Poor man's downcast.
+#endif
+}
+
+#if GTEST_HAS_STREAM_REDIRECTION
+
+// Defines the stderr capturer:
+//   CaptureStdout     - starts capturing stdout.
+//   GetCapturedStdout - stops capturing stdout and returns the captured string.
+//   CaptureStderr     - starts capturing stderr.
+//   GetCapturedStderr - stops capturing stderr and returns the captured string.
+//
+GTEST_API_ void CaptureStdout();
+GTEST_API_ std::string GetCapturedStdout();
+GTEST_API_ void CaptureStderr();
+GTEST_API_ std::string GetCapturedStderr();
+
+#endif  // GTEST_HAS_STREAM_REDIRECTION
+
+
+#if GTEST_HAS_DEATH_TEST
+
+const ::std::vector<testing::internal::string>& GetInjectableArgvs();
+void SetInjectableArgvs(const ::std::vector<testing::internal::string>*
+                             new_argvs);
+
+// A copy of all command line arguments.  Set by InitGoogleTest().
+extern ::std::vector<testing::internal::string> g_argvs;
+
+#endif  // GTEST_HAS_DEATH_TEST
+
+// Defines synchronization primitives.
+
+#if GTEST_HAS_PTHREAD
+
+// Sleeps for (roughly) n milli-seconds.  This function is only for
+// testing Google Test's own constructs.  Don't use it in user tests,
+// either directly or indirectly.
+inline void SleepMilliseconds(int n) {
+  const timespec time = {
+    0,                  // 0 seconds.
+    n * 1000L * 1000L,  // And n ms.
+  };
+  nanosleep(&time, NULL);
+}
+
+// Allows a controller thread to pause execution of newly created
+// threads until notified.  Instances of this class must be created
+// and destroyed in the controller thread.
+//
+// This class is only for testing Google Test's own constructs. Do not
+// use it in user tests, either directly or indirectly.
+class Notification {
+ public:
+  Notification() : notified_(false) {
+    GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_init(&mutex_, NULL));
+  }
+  ~Notification() {
+    pthread_mutex_destroy(&mutex_);
+  }
+
+  // Notifies all threads created with this notification to start. Must
+  // be called from the controller thread.
+  void Notify() {
+    pthread_mutex_lock(&mutex_);
+    notified_ = true;
+    pthread_mutex_unlock(&mutex_);
+  }
+
+  // Blocks until the controller thread notifies. Must be called from a test
+  // thread.
+  void WaitForNotification() {
+    for (;;) {
+      pthread_mutex_lock(&mutex_);
+      const bool notified = notified_;
+      pthread_mutex_unlock(&mutex_);
+      if (notified)
+        break;
+      SleepMilliseconds(10);
+    }
+  }
+
+ private:
+  pthread_mutex_t mutex_;
+  bool notified_;
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(Notification);
+};
+
+// As a C-function, ThreadFuncWithCLinkage cannot be templated itself.
+// Consequently, it cannot select a correct instantiation of ThreadWithParam
+// in order to call its Run(). Introducing ThreadWithParamBase as a
+// non-templated base class for ThreadWithParam allows us to bypass this
+// problem.
+class ThreadWithParamBase {
+ public:
+  virtual ~ThreadWithParamBase() {}
+  virtual void Run() = 0;
+};
+
+// pthread_create() accepts a pointer to a function type with the C linkage.
+// According to the Standard (7.5/1), function types with different linkages
+// are different even if they are otherwise identical.  Some compilers (for
+// example, SunStudio) treat them as different types.  Since class methods
+// cannot be defined with C-linkage we need to define a free C-function to
+// pass into pthread_create().
+extern "C" inline void* ThreadFuncWithCLinkage(void* thread) {
+  static_cast<ThreadWithParamBase*>(thread)->Run();
+  return NULL;
+}
+
+// Helper class for testing Google Test's multi-threading constructs.
+// To use it, write:
+//
+//   void ThreadFunc(int param) { /* Do things with param */ }
+//   Notification thread_can_start;
+//   ...
+//   // The thread_can_start parameter is optional; you can supply NULL.
+//   ThreadWithParam<int> thread(&ThreadFunc, 5, &thread_can_start);
+//   thread_can_start.Notify();
+//
+// These classes are only for testing Google Test's own constructs. Do
+// not use them in user tests, either directly or indirectly.
+template <typename T>
+class ThreadWithParam : public ThreadWithParamBase {
+ public:
+  typedef void (*UserThreadFunc)(T);
+
+  ThreadWithParam(
+      UserThreadFunc func, T param, Notification* thread_can_start)
+      : func_(func),
+        param_(param),
+        thread_can_start_(thread_can_start),
+        finished_(false) {
+    ThreadWithParamBase* const base = this;
+    // The thread can be created only after all fields except thread_
+    // have been initialized.
+    GTEST_CHECK_POSIX_SUCCESS_(
+        pthread_create(&thread_, 0, &ThreadFuncWithCLinkage, base));
+  }
+  ~ThreadWithParam() { Join(); }
+
+  void Join() {
+    if (!finished_) {
+      GTEST_CHECK_POSIX_SUCCESS_(pthread_join(thread_, 0));
+      finished_ = true;
+    }
+  }
+
+  virtual void Run() {
+    if (thread_can_start_ != NULL)
+      thread_can_start_->WaitForNotification();
+    func_(param_);
+  }
+
+ private:
+  const UserThreadFunc func_;  // User-supplied thread function.
+  const T param_;  // User-supplied parameter to the thread function.
+  // When non-NULL, used to block execution until the controller thread
+  // notifies.
+  Notification* const thread_can_start_;
+  bool finished_;  // true iff we know that the thread function has finished.
+  pthread_t thread_;  // The native thread object.
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(ThreadWithParam);
+};
+
+// MutexBase and Mutex implement mutex on pthreads-based platforms. They
+// are used in conjunction with class MutexLock:
+//
+//   Mutex mutex;
+//   ...
+//   MutexLock lock(&mutex);  // Acquires the mutex and releases it at the end
+//                            // of the current scope.
+//
+// MutexBase implements behavior for both statically and dynamically
+// allocated mutexes.  Do not use MutexBase directly.  Instead, write
+// the following to define a static mutex:
+//
+//   GTEST_DEFINE_STATIC_MUTEX_(g_some_mutex);
+//
+// You can forward declare a static mutex like this:
+//
+//   GTEST_DECLARE_STATIC_MUTEX_(g_some_mutex);
+//
+// To create a dynamic mutex, just define an object of type Mutex.
+class MutexBase {
+ public:
+  // Acquires this mutex.
+  void Lock() {
+    GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_lock(&mutex_));
+    owner_ = pthread_self();
+    has_owner_ = true;
+  }
+
+  // Releases this mutex.
+  void Unlock() {
+    // Since the lock is being released the owner_ field should no longer be
+    // considered valid. We don't protect writing to has_owner_ here, as it's
+    // the caller's responsibility to ensure that the current thread holds the
+    // mutex when this is called.
+    has_owner_ = false;
+    GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_unlock(&mutex_));
+  }
+
+  // Does nothing if the current thread holds the mutex. Otherwise, crashes
+  // with high probability.
+  void AssertHeld() const {
+    GTEST_CHECK_(has_owner_ && pthread_equal(owner_, pthread_self()))
+        << "The current thread is not holding the mutex @" << this;
+  }
+
+  // A static mutex may be used before main() is entered.  It may even
+  // be used before the dynamic initialization stage.  Therefore we
+  // must be able to initialize a static mutex object at link time.
+  // This means MutexBase has to be a POD and its member variables
+  // have to be public.
+ public:
+  pthread_mutex_t mutex_;  // The underlying pthread mutex.
+  // has_owner_ indicates whether the owner_ field below contains a valid thread
+  // ID and is therefore safe to inspect (e.g., to use in pthread_equal()). All
+  // accesses to the owner_ field should be protected by a check of this field.
+  // An alternative might be to memset() owner_ to all zeros, but there's no
+  // guarantee that a zero'd pthread_t is necessarily invalid or even different
+  // from pthread_self().
+  bool has_owner_;
+  pthread_t owner_;  // The thread holding the mutex.
+};
+
+// Forward-declares a static mutex.
+# define GTEST_DECLARE_STATIC_MUTEX_(mutex) \
+    extern ::testing::internal::MutexBase mutex
+
+// Defines and statically (i.e. at link time) initializes a static mutex.
+// The initialization list here does not explicitly initialize each field,
+// instead relying on default initialization for the unspecified fields. In
+// particular, the owner_ field (a pthread_t) is not explicitly initialized.
+// This allows initialization to work whether pthread_t is a scalar or struct.
+// The flag -Wmissing-field-initializers must not be specified for this to work.
+# define GTEST_DEFINE_STATIC_MUTEX_(mutex) \
+    ::testing::internal::MutexBase mutex = { PTHREAD_MUTEX_INITIALIZER, false }
+
+// The Mutex class can only be used for mutexes created at runtime. It
+// shares its API with MutexBase otherwise.
+class Mutex : public MutexBase {
+ public:
+  Mutex() {
+    GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_init(&mutex_, NULL));
+    has_owner_ = false;
+  }
+  ~Mutex() {
+    GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_destroy(&mutex_));
+  }
+
+ private:
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(Mutex);
+};
+
+// We cannot name this class MutexLock as the ctor declaration would
+// conflict with a macro named MutexLock, which is defined on some
+// platforms.  Hence the typedef trick below.
+class GTestMutexLock {
+ public:
+  explicit GTestMutexLock(MutexBase* mutex)
+      : mutex_(mutex) { mutex_->Lock(); }
+
+  ~GTestMutexLock() { mutex_->Unlock(); }
+
+ private:
+  MutexBase* const mutex_;
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(GTestMutexLock);
+};
+
+typedef GTestMutexLock MutexLock;
+
+// Helpers for ThreadLocal.
+
+// pthread_key_create() requires DeleteThreadLocalValue() to have
+// C-linkage.  Therefore it cannot be templatized to access
+// ThreadLocal<T>.  Hence the need for class
+// ThreadLocalValueHolderBase.
+class ThreadLocalValueHolderBase {
+ public:
+  virtual ~ThreadLocalValueHolderBase() {}
+};
+
+// Called by pthread to delete thread-local data stored by
+// pthread_setspecific().
+extern "C" inline void DeleteThreadLocalValue(void* value_holder) {
+  delete static_cast<ThreadLocalValueHolderBase*>(value_holder);
+}
+
+// Implements thread-local storage on pthreads-based systems.
+//
+//   // Thread 1
+//   ThreadLocal<int> tl(100);  // 100 is the default value for each thread.
+//
+//   // Thread 2
+//   tl.set(150);  // Changes the value for thread 2 only.
+//   EXPECT_EQ(150, tl.get());
+//
+//   // Thread 1
+//   EXPECT_EQ(100, tl.get());  // In thread 1, tl has the original value.
+//   tl.set(200);
+//   EXPECT_EQ(200, tl.get());
+//
+// The template type argument T must have a public copy constructor.
+// In addition, the default ThreadLocal constructor requires T to have
+// a public default constructor.
+//
+// An object managed for a thread by a ThreadLocal instance is deleted
+// when the thread exits.  Or, if the ThreadLocal instance dies in
+// that thread, when the ThreadLocal dies.  It's the user's
+// responsibility to ensure that all other threads using a ThreadLocal
+// have exited when it dies, or the per-thread objects for those
+// threads will not be deleted.
+//
+// Google Test only uses global ThreadLocal objects.  That means they
+// will die after main() has returned.  Therefore, no per-thread
+// object managed by Google Test will be leaked as long as all threads
+// using Google Test have exited when main() returns.
+template <typename T>
+class ThreadLocal {
+ public:
+  ThreadLocal() : key_(CreateKey()),
+                  default_() {}
+  explicit ThreadLocal(const T& value) : key_(CreateKey()),
+                                         default_(value) {}
+
+  ~ThreadLocal() {
+    // Destroys the managed object for the current thread, if any.
+    DeleteThreadLocalValue(pthread_getspecific(key_));
+
+    // Releases resources associated with the key.  This will *not*
+    // delete managed objects for other threads.
+    GTEST_CHECK_POSIX_SUCCESS_(pthread_key_delete(key_));
+  }
+
+  T* pointer() { return GetOrCreateValue(); }
+  const T* pointer() const { return GetOrCreateValue(); }
+  const T& get() const { return *pointer(); }
+  void set(const T& value) { *pointer() = value; }
+
+ private:
+  // Holds a value of type T.
+  class ValueHolder : public ThreadLocalValueHolderBase {
+   public:
+    explicit ValueHolder(const T& value) : value_(value) {}
+
+    T* pointer() { return &value_; }
+
+   private:
+    T value_;
+    GTEST_DISALLOW_COPY_AND_ASSIGN_(ValueHolder);
+  };
+
+  static pthread_key_t CreateKey() {
+    pthread_key_t key;
+    // When a thread exits, DeleteThreadLocalValue() will be called on
+    // the object managed for that thread.
+    GTEST_CHECK_POSIX_SUCCESS_(
+        pthread_key_create(&key, &DeleteThreadLocalValue));
+    return key;
+  }
+
+  T* GetOrCreateValue() const {
+    ThreadLocalValueHolderBase* const holder =
+        static_cast<ThreadLocalValueHolderBase*>(pthread_getspecific(key_));
+    if (holder != NULL) {
+      return CheckedDowncastToActualType<ValueHolder>(holder)->pointer();
+    }
+
+    ValueHolder* const new_holder = new ValueHolder(default_);
+    ThreadLocalValueHolderBase* const holder_base = new_holder;
+    GTEST_CHECK_POSIX_SUCCESS_(pthread_setspecific(key_, holder_base));
+    return new_holder->pointer();
+  }
+
+  // A key pthreads uses for looking up per-thread values.
+  const pthread_key_t key_;
+  const T default_;  // The default value for each thread.
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(ThreadLocal);
+};
+
+# define GTEST_IS_THREADSAFE 1
+
+#else  // GTEST_HAS_PTHREAD
+
+// A dummy implementation of synchronization primitives (mutex, lock,
+// and thread-local variable).  Necessary for compiling Google Test where
+// mutex is not supported - using Google Test in multiple threads is not
+// supported on such platforms.
+
+class Mutex {
+ public:
+  Mutex() {}
+  void Lock() {}
+  void Unlock() {}
+  void AssertHeld() const {}
+};
+
+# define GTEST_DECLARE_STATIC_MUTEX_(mutex) \
+  extern ::testing::internal::Mutex mutex
+
+# define GTEST_DEFINE_STATIC_MUTEX_(mutex) ::testing::internal::Mutex mutex
+
+class GTestMutexLock {
+ public:
+  explicit GTestMutexLock(Mutex*) {}  // NOLINT
+};
+
+typedef GTestMutexLock MutexLock;
+
+template <typename T>
+class ThreadLocal {
+ public:
+  ThreadLocal() : value_() {}
+  explicit ThreadLocal(const T& value) : value_(value) {}
+  T* pointer() { return &value_; }
+  const T* pointer() const { return &value_; }
+  const T& get() const { return value_; }
+  void set(const T& value) { value_ = value; }
+ private:
+  T value_;
+};
+
+// The above synchronization primitives have dummy implementations.
+// Therefore Google Test is not thread-safe.
+# define GTEST_IS_THREADSAFE 0
+
+#endif  // GTEST_HAS_PTHREAD
+
+// Returns the number of threads running in the process, or 0 to indicate that
+// we cannot detect it.
+GTEST_API_ size_t GetThreadCount();
+
+// Passing non-POD classes through ellipsis (...) crashes the ARM
+// compiler and generates a warning in Sun Studio.  The Nokia Symbian
+// and the IBM XL C/C++ compiler try to instantiate a copy constructor
+// for objects passed through ellipsis (...), failing for uncopyable
+// objects.  We define this to ensure that only POD is passed through
+// ellipsis on these systems.
+#if defined(__SYMBIAN32__) || defined(__IBMCPP__) || defined(__SUNPRO_CC)
+// We lose support for NULL detection where the compiler doesn't like
+// passing non-POD classes through ellipsis (...).
+# define GTEST_ELLIPSIS_NEEDS_POD_ 1
+#else
+# define GTEST_CAN_COMPARE_NULL 1
+#endif
+
+// The Nokia Symbian and IBM XL C/C++ compilers cannot decide between
+// const T& and const T* in a function template.  These compilers
+// _can_ decide between class template specializations for T and T*,
+// so a tr1::type_traits-like is_pointer works.
+#if defined(__SYMBIAN32__) || defined(__IBMCPP__)
+# define GTEST_NEEDS_IS_POINTER_ 1
+#endif
+
+template <bool bool_value>
+struct bool_constant {
+  typedef bool_constant<bool_value> type;
+  static const bool value = bool_value;
+};
+template <bool bool_value> const bool bool_constant<bool_value>::value;
+
+typedef bool_constant<false> false_type;
+typedef bool_constant<true> true_type;
+
+template <typename T>
+struct is_pointer : public false_type {};
+
+template <typename T>
+struct is_pointer<T*> : public true_type {};
+
+template <typename Iterator>
+struct IteratorTraits {
+  typedef typename Iterator::value_type value_type;
+};
+
+template <typename T>
+struct IteratorTraits<T*> {
+  typedef T value_type;
+};
+
+template <typename T>
+struct IteratorTraits<const T*> {
+  typedef T value_type;
+};
+
+#if GTEST_OS_WINDOWS
+# define GTEST_PATH_SEP_ "\\"
+# define GTEST_HAS_ALT_PATH_SEP_ 1
+// The biggest signed integer type the compiler supports.
+typedef __int64 BiggestInt;
+#else
+# define GTEST_PATH_SEP_ "/"
+# define GTEST_HAS_ALT_PATH_SEP_ 0
+typedef long long BiggestInt;  // NOLINT
+#endif  // GTEST_OS_WINDOWS
+
+// Utilities for char.
+
+// isspace(int ch) and friends accept an unsigned char or EOF.  char
+// may be signed, depending on the compiler (or compiler flags).
+// Therefore we need to cast a char to unsigned char before calling
+// isspace(), etc.
+
+inline bool IsAlpha(char ch) {
+  return isalpha(static_cast<unsigned char>(ch)) != 0;
+}
+inline bool IsAlNum(char ch) {
+  return isalnum(static_cast<unsigned char>(ch)) != 0;
+}
+inline bool IsDigit(char ch) {
+  return isdigit(static_cast<unsigned char>(ch)) != 0;
+}
+inline bool IsLower(char ch) {
+  return islower(static_cast<unsigned char>(ch)) != 0;
+}
+inline bool IsSpace(char ch) {
+  return isspace(static_cast<unsigned char>(ch)) != 0;
+}
+inline bool IsUpper(char ch) {
+  return isupper(static_cast<unsigned char>(ch)) != 0;
+}
+inline bool IsXDigit(char ch) {
+  return isxdigit(static_cast<unsigned char>(ch)) != 0;
+}
+inline bool IsXDigit(wchar_t ch) {
+  const unsigned char low_byte = static_cast<unsigned char>(ch);
+  return ch == low_byte && isxdigit(low_byte) != 0;
+}
+
+inline char ToLower(char ch) {
+  return static_cast<char>(tolower(static_cast<unsigned char>(ch)));
+}
+inline char ToUpper(char ch) {
+  return static_cast<char>(toupper(static_cast<unsigned char>(ch)));
+}
+
+// The testing::internal::posix namespace holds wrappers for common
+// POSIX functions.  These wrappers hide the differences between
+// Windows/MSVC and POSIX systems.  Since some compilers define these
+// standard functions as macros, the wrapper cannot have the same name
+// as the wrapped function.
+
+namespace posix {
+
+// Functions with a different name on Windows.
+
+#if GTEST_OS_WINDOWS
+
+typedef struct _stat StatStruct;
+
+# ifdef __BORLANDC__
+inline int IsATTY(int fd) { return isatty(fd); }
+inline int StrCaseCmp(const char* s1, const char* s2) {
+  return stricmp(s1, s2);
+}
+inline char* StrDup(const char* src) { return strdup(src); }
+# else  // !__BORLANDC__
+#  if GTEST_OS_WINDOWS_MOBILE
+inline int IsATTY(int /* fd */) { return 0; }
+#  else
+inline int IsATTY(int fd) { return _isatty(fd); }
+#  endif  // GTEST_OS_WINDOWS_MOBILE
+inline int StrCaseCmp(const char* s1, const char* s2) {
+  return _stricmp(s1, s2);
+}
+inline char* StrDup(const char* src) { return _strdup(src); }
+# endif  // __BORLANDC__
+
+# if GTEST_OS_WINDOWS_MOBILE
+inline int FileNo(FILE* file) { return reinterpret_cast<int>(_fileno(file)); }
+// Stat(), RmDir(), and IsDir() are not needed on Windows CE at this
+// time and thus not defined there.
+# else
+inline int FileNo(FILE* file) { return _fileno(file); }
+inline int Stat(const char* path, StatStruct* buf) { return _stat(path, buf); }
+inline int RmDir(const char* dir) { return _rmdir(dir); }
+inline bool IsDir(const StatStruct& st) {
+  return (_S_IFDIR & st.st_mode) != 0;
+}
+# endif  // GTEST_OS_WINDOWS_MOBILE
+
+#else
+
+typedef struct stat StatStruct;
+
+inline int FileNo(FILE* file) { return fileno(file); }
+inline int IsATTY(int fd) { return isatty(fd); }
+inline int Stat(const char* path, StatStruct* buf) { return stat(path, buf); }
+inline int StrCaseCmp(const char* s1, const char* s2) {
+  return strcasecmp(s1, s2);
+}
+inline char* StrDup(const char* src) { return strdup(src); }
+inline int RmDir(const char* dir) { return rmdir(dir); }
+inline bool IsDir(const StatStruct& st) { return S_ISDIR(st.st_mode); }
+
+#endif  // GTEST_OS_WINDOWS
+
+// Functions deprecated by MSVC 8.0.
+
+#ifdef _MSC_VER
+// Temporarily disable warning 4996 (deprecated function).
+# pragma warning(push)
+# pragma warning(disable:4996)
+#endif
+
+inline const char* StrNCpy(char* dest, const char* src, size_t n) {
+  return strncpy(dest, src, n);
+}
+
+// ChDir(), FReopen(), FDOpen(), Read(), Write(), Close(), and
+// StrError() aren't needed on Windows CE at this time and thus not
+// defined there.
+
+#if !GTEST_OS_WINDOWS_MOBILE
+inline int ChDir(const char* dir) { return chdir(dir); }
+#endif
+inline FILE* FOpen(const char* path, const char* mode) {
+  return fopen(path, mode);
+}
+#if !GTEST_OS_WINDOWS_MOBILE
+inline FILE *FReopen(const char* path, const char* mode, FILE* stream) {
+  return freopen(path, mode, stream);
+}
+inline FILE* FDOpen(int fd, const char* mode) { return fdopen(fd, mode); }
+#endif
+inline int FClose(FILE* fp) { return fclose(fp); }
+#if !GTEST_OS_WINDOWS_MOBILE
+inline int Read(int fd, void* buf, unsigned int count) {
+  return static_cast<int>(read(fd, buf, count));
+}
+inline int Write(int fd, const void* buf, unsigned int count) {
+  return static_cast<int>(write(fd, buf, count));
+}
+inline int Close(int fd) { return close(fd); }
+inline const char* StrError(int errnum) { return strerror(errnum); }
+#endif
+inline const char* GetEnv(const char* name) {
+#if GTEST_OS_WINDOWS_MOBILE
+  // We are on Windows CE, which has no environment variables.
+  return NULL;
+#elif defined(__BORLANDC__) || defined(__SunOS_5_8) || defined(__SunOS_5_9)
+  // Environment variables which we programmatically clear will be set to the
+  // empty string rather than unset (NULL).  Handle that case.
+  const char* const env = getenv(name);
+  return (env != NULL && env[0] != '\0') ? env : NULL;
+#else
+  return getenv(name);
+#endif
+}
+
+#ifdef _MSC_VER
+# pragma warning(pop)  // Restores the warning state.
+#endif
+
+#if GTEST_OS_WINDOWS_MOBILE
+// Windows CE has no C library. The abort() function is used in
+// several places in Google Test. This implementation provides a reasonable
+// imitation of standard behaviour.
+void Abort();
+#else
+inline void Abort() { abort(); }
+#endif  // GTEST_OS_WINDOWS_MOBILE
+
+}  // namespace posix
+
+// MSVC "deprecates" snprintf and issues warnings wherever it is used.  In
+// order to avoid these warnings, we need to use _snprintf or _snprintf_s on
+// MSVC-based platforms.  We map the GTEST_SNPRINTF_ macro to the appropriate
+// function in order to achieve that.  We use macro definition here because
+// snprintf is a variadic function.
+#if _MSC_VER >= 1400 && !GTEST_OS_WINDOWS_MOBILE
+// MSVC 2005 and above support variadic macros.
+# define GTEST_SNPRINTF_(buffer, size, format, ...) \
+     _snprintf_s(buffer, size, size, format, __VA_ARGS__)
+#elif defined(_MSC_VER)
+// Windows CE does not define _snprintf_s and MSVC prior to 2005 doesn't
+// complain about _snprintf.
+# define GTEST_SNPRINTF_ _snprintf
+#else
+# define GTEST_SNPRINTF_ snprintf
+#endif
+
+// The maximum number a BiggestInt can represent.  This definition
+// works no matter BiggestInt is represented in one's complement or
+// two's complement.
+//
+// We cannot rely on numeric_limits in STL, as __int64 and long long
+// are not part of standard C++ and numeric_limits doesn't need to be
+// defined for them.
+const BiggestInt kMaxBiggestInt =
+    ~(static_cast<BiggestInt>(1) << (8*sizeof(BiggestInt) - 1));
+
+// This template class serves as a compile-time function from size to
+// type.  It maps a size in bytes to a primitive type with that
+// size. e.g.
+//
+//   TypeWithSize<4>::UInt
+//
+// is typedef-ed to be unsigned int (unsigned integer made up of 4
+// bytes).
+//
+// Such functionality should belong to STL, but I cannot find it
+// there.
+//
+// Google Test uses this class in the implementation of floating-point
+// comparison.
+//
+// For now it only handles UInt (unsigned int) as that's all Google Test
+// needs.  Other types can be easily added in the future if need
+// arises.
+template <size_t size>
+class TypeWithSize {
+ public:
+  // This prevents the user from using TypeWithSize<N> with incorrect
+  // values of N.
+  typedef void UInt;
+};
+
+// The specialization for size 4.
+template <>
+class TypeWithSize<4> {
+ public:
+  // unsigned int has size 4 in both gcc and MSVC.
+  //
+  // As base/basictypes.h doesn't compile on Windows, we cannot use
+  // uint32, uint64, and etc here.
+  typedef int Int;
+  typedef unsigned int UInt;
+};
+
+// The specialization for size 8.
+template <>
+class TypeWithSize<8> {
+ public:
+#if GTEST_OS_WINDOWS
+  typedef __int64 Int;
+  typedef unsigned __int64 UInt;
+#else
+  typedef long long Int;  // NOLINT
+  typedef unsigned long long UInt;  // NOLINT
+#endif  // GTEST_OS_WINDOWS
+};
+
+// Integer types of known sizes.
+typedef TypeWithSize<4>::Int Int32;
+typedef TypeWithSize<4>::UInt UInt32;
+typedef TypeWithSize<8>::Int Int64;
+typedef TypeWithSize<8>::UInt UInt64;
+typedef TypeWithSize<8>::Int TimeInMillis;  // Represents time in milliseconds.
+
+// Utilities for command line flags and environment variables.
+
+// Macro for referencing flags.
+#define GTEST_FLAG(name) FLAGS_gtest_##name
+
+// Macros for declaring flags.
+#define GTEST_DECLARE_bool_(name) GTEST_API_ extern bool GTEST_FLAG(name)
+#define GTEST_DECLARE_int32_(name) \
+    GTEST_API_ extern ::testing::internal::Int32 GTEST_FLAG(name)
+#define GTEST_DECLARE_string_(name) \
+    GTEST_API_ extern ::std::string GTEST_FLAG(name)
+
+// Macros for defining flags.
+#define GTEST_DEFINE_bool_(name, default_val, doc) \
+    GTEST_API_ bool GTEST_FLAG(name) = (default_val)
+#define GTEST_DEFINE_int32_(name, default_val, doc) \
+    GTEST_API_ ::testing::internal::Int32 GTEST_FLAG(name) = (default_val)
+#define GTEST_DEFINE_string_(name, default_val, doc) \
+    GTEST_API_ ::std::string GTEST_FLAG(name) = (default_val)
+
+// Thread annotations
+#define GTEST_EXCLUSIVE_LOCK_REQUIRED_(locks)
+#define GTEST_LOCK_EXCLUDED_(locks)
+
+// Parses 'str' for a 32-bit signed integer.  If successful, writes the result
+// to *value and returns true; otherwise leaves *value unchanged and returns
+// false.
+// TODO(chandlerc): Find a better way to refactor flag and environment parsing
+// out of both gtest-port.cc and gtest.cc to avoid exporting this utility
+// function.
+bool ParseInt32(const Message& src_text, const char* str, Int32* value);
+
+// Parses a bool/Int32/string from the environment variable
+// corresponding to the given Google Test flag.
+bool BoolFromGTestEnv(const char* flag, bool default_val);
+GTEST_API_ Int32 Int32FromGTestEnv(const char* flag, Int32 default_val);
+const char* StringFromGTestEnv(const char* flag, const char* default_val);
+
+}  // namespace internal
+}  // namespace testing
+
+#endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PORT_H_
diff --git a/contrib/gtest-1.7.0/include/gtest/internal/gtest-string.h b/contrib/gtest-1.7.0/include/gtest/internal/gtest-string.h
new file mode 100644
index 0000000..97f1a7f
--- /dev/null
+++ b/contrib/gtest-1.7.0/include/gtest/internal/gtest-string.h
@@ -0,0 +1,167 @@
+// Copyright 2005, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Authors: wan at google.com (Zhanyong Wan), eefacm at gmail.com (Sean Mcafee)
+//
+// The Google C++ Testing Framework (Google Test)
+//
+// This header file declares the String class and functions used internally by
+// Google Test.  They are subject to change without notice. They should not used
+// by code external to Google Test.
+//
+// This header file is #included by <gtest/internal/gtest-internal.h>.
+// It should not be #included by other files.
+
+#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_STRING_H_
+#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_STRING_H_
+
+#ifdef __BORLANDC__
+// string.h is not guaranteed to provide strcpy on C++ Builder.
+# include <mem.h>
+#endif
+
+#include <string.h>
+#include <string>
+
+#include "gtest/internal/gtest-port.h"
+
+namespace testing {
+namespace internal {
+
+// String - an abstract class holding static string utilities.
+class GTEST_API_ String {
+ public:
+  // Static utility methods
+
+  // Clones a 0-terminated C string, allocating memory using new.  The
+  // caller is responsible for deleting the return value using
+  // delete[].  Returns the cloned string, or NULL if the input is
+  // NULL.
+  //
+  // This is different from strdup() in string.h, which allocates
+  // memory using malloc().
+  static const char* CloneCString(const char* c_str);
+
+#if GTEST_OS_WINDOWS_MOBILE
+  // Windows CE does not have the 'ANSI' versions of Win32 APIs. To be
+  // able to pass strings to Win32 APIs on CE we need to convert them
+  // to 'Unicode', UTF-16.
+
+  // Creates a UTF-16 wide string from the given ANSI string, allocating
+  // memory using new. The caller is responsible for deleting the return
+  // value using delete[]. Returns the wide string, or NULL if the
+  // input is NULL.
+  //
+  // The wide string is created using the ANSI codepage (CP_ACP) to
+  // match the behaviour of the ANSI versions of Win32 calls and the
+  // C runtime.
+  static LPCWSTR AnsiToUtf16(const char* c_str);
+
+  // Creates an ANSI string from the given wide string, allocating
+  // memory using new. The caller is responsible for deleting the return
+  // value using delete[]. Returns the ANSI string, or NULL if the
+  // input is NULL.
+  //
+  // The returned string is created using the ANSI codepage (CP_ACP) to
+  // match the behaviour of the ANSI versions of Win32 calls and the
+  // C runtime.
+  static const char* Utf16ToAnsi(LPCWSTR utf16_str);
+#endif
+
+  // Compares two C strings.  Returns true iff they have the same content.
+  //
+  // Unlike strcmp(), this function can handle NULL argument(s).  A
+  // NULL C string is considered different to any non-NULL C string,
+  // including the empty string.
+  static bool CStringEquals(const char* lhs, const char* rhs);
+
+  // Converts a wide C string to a String using the UTF-8 encoding.
+  // NULL will be converted to "(null)".  If an error occurred during
+  // the conversion, "(failed to convert from wide string)" is
+  // returned.
+  static std::string ShowWideCString(const wchar_t* wide_c_str);
+
+  // Compares two wide C strings.  Returns true iff they have the same
+  // content.
+  //
+  // Unlike wcscmp(), this function can handle NULL argument(s).  A
+  // NULL C string is considered different to any non-NULL C string,
+  // including the empty string.
+  static bool WideCStringEquals(const wchar_t* lhs, const wchar_t* rhs);
+
+  // Compares two C strings, ignoring case.  Returns true iff they
+  // have the same content.
+  //
+  // Unlike strcasecmp(), this function can handle NULL argument(s).
+  // A NULL C string is considered different to any non-NULL C string,
+  // including the empty string.
+  static bool CaseInsensitiveCStringEquals(const char* lhs,
+                                           const char* rhs);
+
+  // Compares two wide C strings, ignoring case.  Returns true iff they
+  // have the same content.
+  //
+  // Unlike wcscasecmp(), this function can handle NULL argument(s).
+  // A NULL C string is considered different to any non-NULL wide C string,
+  // including the empty string.
+  // NB: The implementations on different platforms slightly differ.
+  // On windows, this method uses _wcsicmp which compares according to LC_CTYPE
+  // environment variable. On GNU platform this method uses wcscasecmp
+  // which compares according to LC_CTYPE category of the current locale.
+  // On MacOS X, it uses towlower, which also uses LC_CTYPE category of the
+  // current locale.
+  static bool CaseInsensitiveWideCStringEquals(const wchar_t* lhs,
+                                               const wchar_t* rhs);
+
+  // Returns true iff the given string ends with the given suffix, ignoring
+  // case. Any string is considered to end with an empty suffix.
+  static bool EndsWithCaseInsensitive(
+      const std::string& str, const std::string& suffix);
+
+  // Formats an int value as "%02d".
+  static std::string FormatIntWidth2(int value);  // "%02d" for width == 2
+
+  // Formats an int value as "%X".
+  static std::string FormatHexInt(int value);
+
+  // Formats a byte as "%02X".
+  static std::string FormatByte(unsigned char value);
+
+ private:
+  String();  // Not meant to be instantiated.
+};  // class String
+
+// Gets the content of the stringstream's buffer as an std::string.  Each '\0'
+// character in the buffer is replaced with "\\0".
+GTEST_API_ std::string StringStreamToString(::std::stringstream* stream);
+
+}  // namespace internal
+}  // namespace testing
+
+#endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_STRING_H_
diff --git a/contrib/gtest-1.7.0/include/gtest/internal/gtest-tuple.h b/contrib/gtest-1.7.0/include/gtest/internal/gtest-tuple.h
new file mode 100644
index 0000000..7b3dfc3
--- /dev/null
+++ b/contrib/gtest-1.7.0/include/gtest/internal/gtest-tuple.h
@@ -0,0 +1,1012 @@
+// This file was GENERATED by command:
+//     pump.py gtest-tuple.h.pump
+// DO NOT EDIT BY HAND!!!
+
+// Copyright 2009 Google Inc.
+// All Rights Reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+
+// Implements a subset of TR1 tuple needed by Google Test and Google Mock.
+
+#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TUPLE_H_
+#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TUPLE_H_
+
+#include <utility>  // For ::std::pair.
+
+// The compiler used in Symbian has a bug that prevents us from declaring the
+// tuple template as a friend (it complains that tuple is redefined).  This
+// hack bypasses the bug by declaring the members that should otherwise be
+// private as public.
+// Sun Studio versions < 12 also have the above bug.
+#if defined(__SYMBIAN32__) || (defined(__SUNPRO_CC) && __SUNPRO_CC < 0x590)
+# define GTEST_DECLARE_TUPLE_AS_FRIEND_ public:
+#else
+# define GTEST_DECLARE_TUPLE_AS_FRIEND_ \
+    template <GTEST_10_TYPENAMES_(U)> friend class tuple; \
+   private:
+#endif
+
+// GTEST_n_TUPLE_(T) is the type of an n-tuple.
+#define GTEST_0_TUPLE_(T) tuple<>
+#define GTEST_1_TUPLE_(T) tuple<T##0, void, void, void, void, void, void, \
+    void, void, void>
+#define GTEST_2_TUPLE_(T) tuple<T##0, T##1, void, void, void, void, void, \
+    void, void, void>
+#define GTEST_3_TUPLE_(T) tuple<T##0, T##1, T##2, void, void, void, void, \
+    void, void, void>
+#define GTEST_4_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, void, void, void, \
+    void, void, void>
+#define GTEST_5_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, T##4, void, void, \
+    void, void, void>
+#define GTEST_6_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, T##4, T##5, void, \
+    void, void, void>
+#define GTEST_7_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, T##4, T##5, T##6, \
+    void, void, void>
+#define GTEST_8_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, T##4, T##5, T##6, \
+    T##7, void, void>
+#define GTEST_9_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, T##4, T##5, T##6, \
+    T##7, T##8, void>
+#define GTEST_10_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, T##4, T##5, T##6, \
+    T##7, T##8, T##9>
+
+// GTEST_n_TYPENAMES_(T) declares a list of n typenames.
+#define GTEST_0_TYPENAMES_(T)
+#define GTEST_1_TYPENAMES_(T) typename T##0
+#define GTEST_2_TYPENAMES_(T) typename T##0, typename T##1
+#define GTEST_3_TYPENAMES_(T) typename T##0, typename T##1, typename T##2
+#define GTEST_4_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \
+    typename T##3
+#define GTEST_5_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \
+    typename T##3, typename T##4
+#define GTEST_6_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \
+    typename T##3, typename T##4, typename T##5
+#define GTEST_7_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \
+    typename T##3, typename T##4, typename T##5, typename T##6
+#define GTEST_8_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \
+    typename T##3, typename T##4, typename T##5, typename T##6, typename T##7
+#define GTEST_9_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \
+    typename T##3, typename T##4, typename T##5, typename T##6, \
+    typename T##7, typename T##8
+#define GTEST_10_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \
+    typename T##3, typename T##4, typename T##5, typename T##6, \
+    typename T##7, typename T##8, typename T##9
+
+// In theory, defining stuff in the ::std namespace is undefined
+// behavior.  We can do this as we are playing the role of a standard
+// library vendor.
+namespace std {
+namespace tr1 {
+
+template <typename T0 = void, typename T1 = void, typename T2 = void,
+    typename T3 = void, typename T4 = void, typename T5 = void,
+    typename T6 = void, typename T7 = void, typename T8 = void,
+    typename T9 = void>
+class tuple;
+
+// Anything in namespace gtest_internal is Google Test's INTERNAL
+// IMPLEMENTATION DETAIL and MUST NOT BE USED DIRECTLY in user code.
+namespace gtest_internal {
+
+// ByRef<T>::type is T if T is a reference; otherwise it's const T&.
+template <typename T>
+struct ByRef { typedef const T& type; };  // NOLINT
+template <typename T>
+struct ByRef<T&> { typedef T& type; };  // NOLINT
+
+// A handy wrapper for ByRef.
+#define GTEST_BY_REF_(T) typename ::std::tr1::gtest_internal::ByRef<T>::type
+
+// AddRef<T>::type is T if T is a reference; otherwise it's T&.  This
+// is the same as tr1::add_reference<T>::type.
+template <typename T>
+struct AddRef { typedef T& type; };  // NOLINT
+template <typename T>
+struct AddRef<T&> { typedef T& type; };  // NOLINT
+
+// A handy wrapper for AddRef.
+#define GTEST_ADD_REF_(T) typename ::std::tr1::gtest_internal::AddRef<T>::type
+
+// A helper for implementing get<k>().
+template <int k> class Get;
+
+// A helper for implementing tuple_element<k, T>.  kIndexValid is true
+// iff k < the number of fields in tuple type T.
+template <bool kIndexValid, int kIndex, class Tuple>
+struct TupleElement;
+
+template <GTEST_10_TYPENAMES_(T)>
+struct TupleElement<true, 0, GTEST_10_TUPLE_(T) > {
+  typedef T0 type;
+};
+
+template <GTEST_10_TYPENAMES_(T)>
+struct TupleElement<true, 1, GTEST_10_TUPLE_(T) > {
+  typedef T1 type;
+};
+
+template <GTEST_10_TYPENAMES_(T)>
+struct TupleElement<true, 2, GTEST_10_TUPLE_(T) > {
+  typedef T2 type;
+};
+
+template <GTEST_10_TYPENAMES_(T)>
+struct TupleElement<true, 3, GTEST_10_TUPLE_(T) > {
+  typedef T3 type;
+};
+
+template <GTEST_10_TYPENAMES_(T)>
+struct TupleElement<true, 4, GTEST_10_TUPLE_(T) > {
+  typedef T4 type;
+};
+
+template <GTEST_10_TYPENAMES_(T)>
+struct TupleElement<true, 5, GTEST_10_TUPLE_(T) > {
+  typedef T5 type;
+};
+
+template <GTEST_10_TYPENAMES_(T)>
+struct TupleElement<true, 6, GTEST_10_TUPLE_(T) > {
+  typedef T6 type;
+};
+
+template <GTEST_10_TYPENAMES_(T)>
+struct TupleElement<true, 7, GTEST_10_TUPLE_(T) > {
+  typedef T7 type;
+};
+
+template <GTEST_10_TYPENAMES_(T)>
+struct TupleElement<true, 8, GTEST_10_TUPLE_(T) > {
+  typedef T8 type;
+};
+
+template <GTEST_10_TYPENAMES_(T)>
+struct TupleElement<true, 9, GTEST_10_TUPLE_(T) > {
+  typedef T9 type;
+};
+
+}  // namespace gtest_internal
+
+template <>
+class tuple<> {
+ public:
+  tuple() {}
+  tuple(const tuple& /* t */)  {}
+  tuple& operator=(const tuple& /* t */) { return *this; }
+};
+
+template <GTEST_1_TYPENAMES_(T)>
+class GTEST_1_TUPLE_(T) {
+ public:
+  template <int k> friend class gtest_internal::Get;
+
+  tuple() : f0_() {}
+
+  explicit tuple(GTEST_BY_REF_(T0) f0) : f0_(f0) {}
+
+  tuple(const tuple& t) : f0_(t.f0_) {}
+
+  template <GTEST_1_TYPENAMES_(U)>
+  tuple(const GTEST_1_TUPLE_(U)& t) : f0_(t.f0_) {}
+
+  tuple& operator=(const tuple& t) { return CopyFrom(t); }
+
+  template <GTEST_1_TYPENAMES_(U)>
+  tuple& operator=(const GTEST_1_TUPLE_(U)& t) {
+    return CopyFrom(t);
+  }
+
+  GTEST_DECLARE_TUPLE_AS_FRIEND_
+
+  template <GTEST_1_TYPENAMES_(U)>
+  tuple& CopyFrom(const GTEST_1_TUPLE_(U)& t) {
+    f0_ = t.f0_;
+    return *this;
+  }
+
+  T0 f0_;
+};
+
+template <GTEST_2_TYPENAMES_(T)>
+class GTEST_2_TUPLE_(T) {
+ public:
+  template <int k> friend class gtest_internal::Get;
+
+  tuple() : f0_(), f1_() {}
+
+  explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1) : f0_(f0),
+      f1_(f1) {}
+
+  tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_) {}
+
+  template <GTEST_2_TYPENAMES_(U)>
+  tuple(const GTEST_2_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_) {}
+  template <typename U0, typename U1>
+  tuple(const ::std::pair<U0, U1>& p) : f0_(p.first), f1_(p.second) {}
+
+  tuple& operator=(const tuple& t) { return CopyFrom(t); }
+
+  template <GTEST_2_TYPENAMES_(U)>
+  tuple& operator=(const GTEST_2_TUPLE_(U)& t) {
+    return CopyFrom(t);
+  }
+  template <typename U0, typename U1>
+  tuple& operator=(const ::std::pair<U0, U1>& p) {
+    f0_ = p.first;
+    f1_ = p.second;
+    return *this;
+  }
+
+  GTEST_DECLARE_TUPLE_AS_FRIEND_
+
+  template <GTEST_2_TYPENAMES_(U)>
+  tuple& CopyFrom(const GTEST_2_TUPLE_(U)& t) {
+    f0_ = t.f0_;
+    f1_ = t.f1_;
+    return *this;
+  }
+
+  T0 f0_;
+  T1 f1_;
+};
+
+template <GTEST_3_TYPENAMES_(T)>
+class GTEST_3_TUPLE_(T) {
+ public:
+  template <int k> friend class gtest_internal::Get;
+
+  tuple() : f0_(), f1_(), f2_() {}
+
+  explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,
+      GTEST_BY_REF_(T2) f2) : f0_(f0), f1_(f1), f2_(f2) {}
+
+  tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_) {}
+
+  template <GTEST_3_TYPENAMES_(U)>
+  tuple(const GTEST_3_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_) {}
+
+  tuple& operator=(const tuple& t) { return CopyFrom(t); }
+
+  template <GTEST_3_TYPENAMES_(U)>
+  tuple& operator=(const GTEST_3_TUPLE_(U)& t) {
+    return CopyFrom(t);
+  }
+
+  GTEST_DECLARE_TUPLE_AS_FRIEND_
+
+  template <GTEST_3_TYPENAMES_(U)>
+  tuple& CopyFrom(const GTEST_3_TUPLE_(U)& t) {
+    f0_ = t.f0_;
+    f1_ = t.f1_;
+    f2_ = t.f2_;
+    return *this;
+  }
+
+  T0 f0_;
+  T1 f1_;
+  T2 f2_;
+};
+
+template <GTEST_4_TYPENAMES_(T)>
+class GTEST_4_TUPLE_(T) {
+ public:
+  template <int k> friend class gtest_internal::Get;
+
+  tuple() : f0_(), f1_(), f2_(), f3_() {}
+
+  explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,
+      GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3) : f0_(f0), f1_(f1), f2_(f2),
+      f3_(f3) {}
+
+  tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_) {}
+
+  template <GTEST_4_TYPENAMES_(U)>
+  tuple(const GTEST_4_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_),
+      f3_(t.f3_) {}
+
+  tuple& operator=(const tuple& t) { return CopyFrom(t); }
+
+  template <GTEST_4_TYPENAMES_(U)>
+  tuple& operator=(const GTEST_4_TUPLE_(U)& t) {
+    return CopyFrom(t);
+  }
+
+  GTEST_DECLARE_TUPLE_AS_FRIEND_
+
+  template <GTEST_4_TYPENAMES_(U)>
+  tuple& CopyFrom(const GTEST_4_TUPLE_(U)& t) {
+    f0_ = t.f0_;
+    f1_ = t.f1_;
+    f2_ = t.f2_;
+    f3_ = t.f3_;
+    return *this;
+  }
+
+  T0 f0_;
+  T1 f1_;
+  T2 f2_;
+  T3 f3_;
+};
+
+template <GTEST_5_TYPENAMES_(T)>
+class GTEST_5_TUPLE_(T) {
+ public:
+  template <int k> friend class gtest_internal::Get;
+
+  tuple() : f0_(), f1_(), f2_(), f3_(), f4_() {}
+
+  explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,
+      GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3,
+      GTEST_BY_REF_(T4) f4) : f0_(f0), f1_(f1), f2_(f2), f3_(f3), f4_(f4) {}
+
+  tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_),
+      f4_(t.f4_) {}
+
+  template <GTEST_5_TYPENAMES_(U)>
+  tuple(const GTEST_5_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_),
+      f3_(t.f3_), f4_(t.f4_) {}
+
+  tuple& operator=(const tuple& t) { return CopyFrom(t); }
+
+  template <GTEST_5_TYPENAMES_(U)>
+  tuple& operator=(const GTEST_5_TUPLE_(U)& t) {
+    return CopyFrom(t);
+  }
+
+  GTEST_DECLARE_TUPLE_AS_FRIEND_
+
+  template <GTEST_5_TYPENAMES_(U)>
+  tuple& CopyFrom(const GTEST_5_TUPLE_(U)& t) {
+    f0_ = t.f0_;
+    f1_ = t.f1_;
+    f2_ = t.f2_;
+    f3_ = t.f3_;
+    f4_ = t.f4_;
+    return *this;
+  }
+
+  T0 f0_;
+  T1 f1_;
+  T2 f2_;
+  T3 f3_;
+  T4 f4_;
+};
+
+template <GTEST_6_TYPENAMES_(T)>
+class GTEST_6_TUPLE_(T) {
+ public:
+  template <int k> friend class gtest_internal::Get;
+
+  tuple() : f0_(), f1_(), f2_(), f3_(), f4_(), f5_() {}
+
+  explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,
+      GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3, GTEST_BY_REF_(T4) f4,
+      GTEST_BY_REF_(T5) f5) : f0_(f0), f1_(f1), f2_(f2), f3_(f3), f4_(f4),
+      f5_(f5) {}
+
+  tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_),
+      f4_(t.f4_), f5_(t.f5_) {}
+
+  template <GTEST_6_TYPENAMES_(U)>
+  tuple(const GTEST_6_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_),
+      f3_(t.f3_), f4_(t.f4_), f5_(t.f5_) {}
+
+  tuple& operator=(const tuple& t) { return CopyFrom(t); }
+
+  template <GTEST_6_TYPENAMES_(U)>
+  tuple& operator=(const GTEST_6_TUPLE_(U)& t) {
+    return CopyFrom(t);
+  }
+
+  GTEST_DECLARE_TUPLE_AS_FRIEND_
+
+  template <GTEST_6_TYPENAMES_(U)>
+  tuple& CopyFrom(const GTEST_6_TUPLE_(U)& t) {
+    f0_ = t.f0_;
+    f1_ = t.f1_;
+    f2_ = t.f2_;
+    f3_ = t.f3_;
+    f4_ = t.f4_;
+    f5_ = t.f5_;
+    return *this;
+  }
+
+  T0 f0_;
+  T1 f1_;
+  T2 f2_;
+  T3 f3_;
+  T4 f4_;
+  T5 f5_;
+};
+
+template <GTEST_7_TYPENAMES_(T)>
+class GTEST_7_TUPLE_(T) {
+ public:
+  template <int k> friend class gtest_internal::Get;
+
+  tuple() : f0_(), f1_(), f2_(), f3_(), f4_(), f5_(), f6_() {}
+
+  explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,
+      GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3, GTEST_BY_REF_(T4) f4,
+      GTEST_BY_REF_(T5) f5, GTEST_BY_REF_(T6) f6) : f0_(f0), f1_(f1), f2_(f2),
+      f3_(f3), f4_(f4), f5_(f5), f6_(f6) {}
+
+  tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_),
+      f4_(t.f4_), f5_(t.f5_), f6_(t.f6_) {}
+
+  template <GTEST_7_TYPENAMES_(U)>
+  tuple(const GTEST_7_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_),
+      f3_(t.f3_), f4_(t.f4_), f5_(t.f5_), f6_(t.f6_) {}
+
+  tuple& operator=(const tuple& t) { return CopyFrom(t); }
+
+  template <GTEST_7_TYPENAMES_(U)>
+  tuple& operator=(const GTEST_7_TUPLE_(U)& t) {
+    return CopyFrom(t);
+  }
+
+  GTEST_DECLARE_TUPLE_AS_FRIEND_
+
+  template <GTEST_7_TYPENAMES_(U)>
+  tuple& CopyFrom(const GTEST_7_TUPLE_(U)& t) {
+    f0_ = t.f0_;
+    f1_ = t.f1_;
+    f2_ = t.f2_;
+    f3_ = t.f3_;
+    f4_ = t.f4_;
+    f5_ = t.f5_;
+    f6_ = t.f6_;
+    return *this;
+  }
+
+  T0 f0_;
+  T1 f1_;
+  T2 f2_;
+  T3 f3_;
+  T4 f4_;
+  T5 f5_;
+  T6 f6_;
+};
+
+template <GTEST_8_TYPENAMES_(T)>
+class GTEST_8_TUPLE_(T) {
+ public:
+  template <int k> friend class gtest_internal::Get;
+
+  tuple() : f0_(), f1_(), f2_(), f3_(), f4_(), f5_(), f6_(), f7_() {}
+
+  explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,
+      GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3, GTEST_BY_REF_(T4) f4,
+      GTEST_BY_REF_(T5) f5, GTEST_BY_REF_(T6) f6,
+      GTEST_BY_REF_(T7) f7) : f0_(f0), f1_(f1), f2_(f2), f3_(f3), f4_(f4),
+      f5_(f5), f6_(f6), f7_(f7) {}
+
+  tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_),
+      f4_(t.f4_), f5_(t.f5_), f6_(t.f6_), f7_(t.f7_) {}
+
+  template <GTEST_8_TYPENAMES_(U)>
+  tuple(const GTEST_8_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_),
+      f3_(t.f3_), f4_(t.f4_), f5_(t.f5_), f6_(t.f6_), f7_(t.f7_) {}
+
+  tuple& operator=(const tuple& t) { return CopyFrom(t); }
+
+  template <GTEST_8_TYPENAMES_(U)>
+  tuple& operator=(const GTEST_8_TUPLE_(U)& t) {
+    return CopyFrom(t);
+  }
+
+  GTEST_DECLARE_TUPLE_AS_FRIEND_
+
+  template <GTEST_8_TYPENAMES_(U)>
+  tuple& CopyFrom(const GTEST_8_TUPLE_(U)& t) {
+    f0_ = t.f0_;
+    f1_ = t.f1_;
+    f2_ = t.f2_;
+    f3_ = t.f3_;
+    f4_ = t.f4_;
+    f5_ = t.f5_;
+    f6_ = t.f6_;
+    f7_ = t.f7_;
+    return *this;
+  }
+
+  T0 f0_;
+  T1 f1_;
+  T2 f2_;
+  T3 f3_;
+  T4 f4_;
+  T5 f5_;
+  T6 f6_;
+  T7 f7_;
+};
+
+template <GTEST_9_TYPENAMES_(T)>
+class GTEST_9_TUPLE_(T) {
+ public:
+  template <int k> friend class gtest_internal::Get;
+
+  tuple() : f0_(), f1_(), f2_(), f3_(), f4_(), f5_(), f6_(), f7_(), f8_() {}
+
+  explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,
+      GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3, GTEST_BY_REF_(T4) f4,
+      GTEST_BY_REF_(T5) f5, GTEST_BY_REF_(T6) f6, GTEST_BY_REF_(T7) f7,
+      GTEST_BY_REF_(T8) f8) : f0_(f0), f1_(f1), f2_(f2), f3_(f3), f4_(f4),
+      f5_(f5), f6_(f6), f7_(f7), f8_(f8) {}
+
+  tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_),
+      f4_(t.f4_), f5_(t.f5_), f6_(t.f6_), f7_(t.f7_), f8_(t.f8_) {}
+
+  template <GTEST_9_TYPENAMES_(U)>
+  tuple(const GTEST_9_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_),
+      f3_(t.f3_), f4_(t.f4_), f5_(t.f5_), f6_(t.f6_), f7_(t.f7_), f8_(t.f8_) {}
+
+  tuple& operator=(const tuple& t) { return CopyFrom(t); }
+
+  template <GTEST_9_TYPENAMES_(U)>
+  tuple& operator=(const GTEST_9_TUPLE_(U)& t) {
+    return CopyFrom(t);
+  }
+
+  GTEST_DECLARE_TUPLE_AS_FRIEND_
+
+  template <GTEST_9_TYPENAMES_(U)>
+  tuple& CopyFrom(const GTEST_9_TUPLE_(U)& t) {
+    f0_ = t.f0_;
+    f1_ = t.f1_;
+    f2_ = t.f2_;
+    f3_ = t.f3_;
+    f4_ = t.f4_;
+    f5_ = t.f5_;
+    f6_ = t.f6_;
+    f7_ = t.f7_;
+    f8_ = t.f8_;
+    return *this;
+  }
+
+  T0 f0_;
+  T1 f1_;
+  T2 f2_;
+  T3 f3_;
+  T4 f4_;
+  T5 f5_;
+  T6 f6_;
+  T7 f7_;
+  T8 f8_;
+};
+
+template <GTEST_10_TYPENAMES_(T)>
+class tuple {
+ public:
+  template <int k> friend class gtest_internal::Get;
+
+  tuple() : f0_(), f1_(), f2_(), f3_(), f4_(), f5_(), f6_(), f7_(), f8_(),
+      f9_() {}
+
+  explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,
+      GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3, GTEST_BY_REF_(T4) f4,
+      GTEST_BY_REF_(T5) f5, GTEST_BY_REF_(T6) f6, GTEST_BY_REF_(T7) f7,
+      GTEST_BY_REF_(T8) f8, GTEST_BY_REF_(T9) f9) : f0_(f0), f1_(f1), f2_(f2),
+      f3_(f3), f4_(f4), f5_(f5), f6_(f6), f7_(f7), f8_(f8), f9_(f9) {}
+
+  tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_),
+      f4_(t.f4_), f5_(t.f5_), f6_(t.f6_), f7_(t.f7_), f8_(t.f8_), f9_(t.f9_) {}
+
+  template <GTEST_10_TYPENAMES_(U)>
+  tuple(const GTEST_10_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_),
+      f3_(t.f3_), f4_(t.f4_), f5_(t.f5_), f6_(t.f6_), f7_(t.f7_), f8_(t.f8_),
+      f9_(t.f9_) {}
+
+  tuple& operator=(const tuple& t) { return CopyFrom(t); }
+
+  template <GTEST_10_TYPENAMES_(U)>
+  tuple& operator=(const GTEST_10_TUPLE_(U)& t) {
+    return CopyFrom(t);
+  }
+
+  GTEST_DECLARE_TUPLE_AS_FRIEND_
+
+  template <GTEST_10_TYPENAMES_(U)>
+  tuple& CopyFrom(const GTEST_10_TUPLE_(U)& t) {
+    f0_ = t.f0_;
+    f1_ = t.f1_;
+    f2_ = t.f2_;
+    f3_ = t.f3_;
+    f4_ = t.f4_;
+    f5_ = t.f5_;
+    f6_ = t.f6_;
+    f7_ = t.f7_;
+    f8_ = t.f8_;
+    f9_ = t.f9_;
+    return *this;
+  }
+
+  T0 f0_;
+  T1 f1_;
+  T2 f2_;
+  T3 f3_;
+  T4 f4_;
+  T5 f5_;
+  T6 f6_;
+  T7 f7_;
+  T8 f8_;
+  T9 f9_;
+};
+
+// 6.1.3.2 Tuple creation functions.
+
+// Known limitations: we don't support passing an
+// std::tr1::reference_wrapper<T> to make_tuple().  And we don't
+// implement tie().
+
+inline tuple<> make_tuple() { return tuple<>(); }
+
+template <GTEST_1_TYPENAMES_(T)>
+inline GTEST_1_TUPLE_(T) make_tuple(const T0& f0) {
+  return GTEST_1_TUPLE_(T)(f0);
+}
+
+template <GTEST_2_TYPENAMES_(T)>
+inline GTEST_2_TUPLE_(T) make_tuple(const T0& f0, const T1& f1) {
+  return GTEST_2_TUPLE_(T)(f0, f1);
+}
+
+template <GTEST_3_TYPENAMES_(T)>
+inline GTEST_3_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2) {
+  return GTEST_3_TUPLE_(T)(f0, f1, f2);
+}
+
+template <GTEST_4_TYPENAMES_(T)>
+inline GTEST_4_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2,
+    const T3& f3) {
+  return GTEST_4_TUPLE_(T)(f0, f1, f2, f3);
+}
+
+template <GTEST_5_TYPENAMES_(T)>
+inline GTEST_5_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2,
+    const T3& f3, const T4& f4) {
+  return GTEST_5_TUPLE_(T)(f0, f1, f2, f3, f4);
+}
+
+template <GTEST_6_TYPENAMES_(T)>
+inline GTEST_6_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2,
+    const T3& f3, const T4& f4, const T5& f5) {
+  return GTEST_6_TUPLE_(T)(f0, f1, f2, f3, f4, f5);
+}
+
+template <GTEST_7_TYPENAMES_(T)>
+inline GTEST_7_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2,
+    const T3& f3, const T4& f4, const T5& f5, const T6& f6) {
+  return GTEST_7_TUPLE_(T)(f0, f1, f2, f3, f4, f5, f6);
+}
+
+template <GTEST_8_TYPENAMES_(T)>
+inline GTEST_8_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2,
+    const T3& f3, const T4& f4, const T5& f5, const T6& f6, const T7& f7) {
+  return GTEST_8_TUPLE_(T)(f0, f1, f2, f3, f4, f5, f6, f7);
+}
+
+template <GTEST_9_TYPENAMES_(T)>
+inline GTEST_9_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2,
+    const T3& f3, const T4& f4, const T5& f5, const T6& f6, const T7& f7,
+    const T8& f8) {
+  return GTEST_9_TUPLE_(T)(f0, f1, f2, f3, f4, f5, f6, f7, f8);
+}
+
+template <GTEST_10_TYPENAMES_(T)>
+inline GTEST_10_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2,
+    const T3& f3, const T4& f4, const T5& f5, const T6& f6, const T7& f7,
+    const T8& f8, const T9& f9) {
+  return GTEST_10_TUPLE_(T)(f0, f1, f2, f3, f4, f5, f6, f7, f8, f9);
+}
+
+// 6.1.3.3 Tuple helper classes.
+
+template <typename Tuple> struct tuple_size;
+
+template <GTEST_0_TYPENAMES_(T)>
+struct tuple_size<GTEST_0_TUPLE_(T) > {
+  static const int value = 0;
+};
+
+template <GTEST_1_TYPENAMES_(T)>
+struct tuple_size<GTEST_1_TUPLE_(T) > {
+  static const int value = 1;
+};
+
+template <GTEST_2_TYPENAMES_(T)>
+struct tuple_size<GTEST_2_TUPLE_(T) > {
+  static const int value = 2;
+};
+
+template <GTEST_3_TYPENAMES_(T)>
+struct tuple_size<GTEST_3_TUPLE_(T) > {
+  static const int value = 3;
+};
+
+template <GTEST_4_TYPENAMES_(T)>
+struct tuple_size<GTEST_4_TUPLE_(T) > {
+  static const int value = 4;
+};
+
+template <GTEST_5_TYPENAMES_(T)>
+struct tuple_size<GTEST_5_TUPLE_(T) > {
+  static const int value = 5;
+};
+
+template <GTEST_6_TYPENAMES_(T)>
+struct tuple_size<GTEST_6_TUPLE_(T) > {
+  static const int value = 6;
+};
+
+template <GTEST_7_TYPENAMES_(T)>
+struct tuple_size<GTEST_7_TUPLE_(T) > {
+  static const int value = 7;
+};
+
+template <GTEST_8_TYPENAMES_(T)>
+struct tuple_size<GTEST_8_TUPLE_(T) > {
+  static const int value = 8;
+};
+
+template <GTEST_9_TYPENAMES_(T)>
+struct tuple_size<GTEST_9_TUPLE_(T) > {
+  static const int value = 9;
+};
+
+template <GTEST_10_TYPENAMES_(T)>
+struct tuple_size<GTEST_10_TUPLE_(T) > {
+  static const int value = 10;
+};
+
+template <int k, class Tuple>
+struct tuple_element {
+  typedef typename gtest_internal::TupleElement<
+      k < (tuple_size<Tuple>::value), k, Tuple>::type type;
+};
+
+#define GTEST_TUPLE_ELEMENT_(k, Tuple) typename tuple_element<k, Tuple >::type
+
+// 6.1.3.4 Element access.
+
+namespace gtest_internal {
+
+template <>
+class Get<0> {
+ public:
+  template <class Tuple>
+  static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(0, Tuple))
+  Field(Tuple& t) { return t.f0_; }  // NOLINT
+
+  template <class Tuple>
+  static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(0, Tuple))
+  ConstField(const Tuple& t) { return t.f0_; }
+};
+
+template <>
+class Get<1> {
+ public:
+  template <class Tuple>
+  static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(1, Tuple))
+  Field(Tuple& t) { return t.f1_; }  // NOLINT
+
+  template <class Tuple>
+  static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(1, Tuple))
+  ConstField(const Tuple& t) { return t.f1_; }
+};
+
+template <>
+class Get<2> {
+ public:
+  template <class Tuple>
+  static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(2, Tuple))
+  Field(Tuple& t) { return t.f2_; }  // NOLINT
+
+  template <class Tuple>
+  static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(2, Tuple))
+  ConstField(const Tuple& t) { return t.f2_; }
+};
+
+template <>
+class Get<3> {
+ public:
+  template <class Tuple>
+  static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(3, Tuple))
+  Field(Tuple& t) { return t.f3_; }  // NOLINT
+
+  template <class Tuple>
+  static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(3, Tuple))
+  ConstField(const Tuple& t) { return t.f3_; }
+};
+
+template <>
+class Get<4> {
+ public:
+  template <class Tuple>
+  static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(4, Tuple))
+  Field(Tuple& t) { return t.f4_; }  // NOLINT
+
+  template <class Tuple>
+  static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(4, Tuple))
+  ConstField(const Tuple& t) { return t.f4_; }
+};
+
+template <>
+class Get<5> {
+ public:
+  template <class Tuple>
+  static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(5, Tuple))
+  Field(Tuple& t) { return t.f5_; }  // NOLINT
+
+  template <class Tuple>
+  static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(5, Tuple))
+  ConstField(const Tuple& t) { return t.f5_; }
+};
+
+template <>
+class Get<6> {
+ public:
+  template <class Tuple>
+  static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(6, Tuple))
+  Field(Tuple& t) { return t.f6_; }  // NOLINT
+
+  template <class Tuple>
+  static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(6, Tuple))
+  ConstField(const Tuple& t) { return t.f6_; }
+};
+
+template <>
+class Get<7> {
+ public:
+  template <class Tuple>
+  static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(7, Tuple))
+  Field(Tuple& t) { return t.f7_; }  // NOLINT
+
+  template <class Tuple>
+  static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(7, Tuple))
+  ConstField(const Tuple& t) { return t.f7_; }
+};
+
+template <>
+class Get<8> {
+ public:
+  template <class Tuple>
+  static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(8, Tuple))
+  Field(Tuple& t) { return t.f8_; }  // NOLINT
+
+  template <class Tuple>
+  static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(8, Tuple))
+  ConstField(const Tuple& t) { return t.f8_; }
+};
+
+template <>
+class Get<9> {
+ public:
+  template <class Tuple>
+  static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(9, Tuple))
+  Field(Tuple& t) { return t.f9_; }  // NOLINT
+
+  template <class Tuple>
+  static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(9, Tuple))
+  ConstField(const Tuple& t) { return t.f9_; }
+};
+
+}  // namespace gtest_internal
+
+template <int k, GTEST_10_TYPENAMES_(T)>
+GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(k, GTEST_10_TUPLE_(T)))
+get(GTEST_10_TUPLE_(T)& t) {
+  return gtest_internal::Get<k>::Field(t);
+}
+
+template <int k, GTEST_10_TYPENAMES_(T)>
+GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(k,  GTEST_10_TUPLE_(T)))
+get(const GTEST_10_TUPLE_(T)& t) {
+  return gtest_internal::Get<k>::ConstField(t);
+}
+
+// 6.1.3.5 Relational operators
+
+// We only implement == and !=, as we don't have a need for the rest yet.
+
+namespace gtest_internal {
+
+// SameSizeTuplePrefixComparator<k, k>::Eq(t1, t2) returns true if the
+// first k fields of t1 equals the first k fields of t2.
+// SameSizeTuplePrefixComparator(k1, k2) would be a compiler error if
+// k1 != k2.
+template <int kSize1, int kSize2>
+struct SameSizeTuplePrefixComparator;
+
+template <>
+struct SameSizeTuplePrefixComparator<0, 0> {
+  template <class Tuple1, class Tuple2>
+  static bool Eq(const Tuple1& /* t1 */, const Tuple2& /* t2 */) {
+    return true;
+  }
+};
+
+template <int k>
+struct SameSizeTuplePrefixComparator<k, k> {
+  template <class Tuple1, class Tuple2>
+  static bool Eq(const Tuple1& t1, const Tuple2& t2) {
+    return SameSizeTuplePrefixComparator<k - 1, k - 1>::Eq(t1, t2) &&
+        ::std::tr1::get<k - 1>(t1) == ::std::tr1::get<k - 1>(t2);
+  }
+};
+
+}  // namespace gtest_internal
+
+template <GTEST_10_TYPENAMES_(T), GTEST_10_TYPENAMES_(U)>
+inline bool operator==(const GTEST_10_TUPLE_(T)& t,
+                       const GTEST_10_TUPLE_(U)& u) {
+  return gtest_internal::SameSizeTuplePrefixComparator<
+      tuple_size<GTEST_10_TUPLE_(T) >::value,
+      tuple_size<GTEST_10_TUPLE_(U) >::value>::Eq(t, u);
+}
+
+template <GTEST_10_TYPENAMES_(T), GTEST_10_TYPENAMES_(U)>
+inline bool operator!=(const GTEST_10_TUPLE_(T)& t,
+                       const GTEST_10_TUPLE_(U)& u) { return !(t == u); }
+
+// 6.1.4 Pairs.
+// Unimplemented.
+
+}  // namespace tr1
+}  // namespace std
+
+#undef GTEST_0_TUPLE_
+#undef GTEST_1_TUPLE_
+#undef GTEST_2_TUPLE_
+#undef GTEST_3_TUPLE_
+#undef GTEST_4_TUPLE_
+#undef GTEST_5_TUPLE_
+#undef GTEST_6_TUPLE_
+#undef GTEST_7_TUPLE_
+#undef GTEST_8_TUPLE_
+#undef GTEST_9_TUPLE_
+#undef GTEST_10_TUPLE_
+
+#undef GTEST_0_TYPENAMES_
+#undef GTEST_1_TYPENAMES_
+#undef GTEST_2_TYPENAMES_
+#undef GTEST_3_TYPENAMES_
+#undef GTEST_4_TYPENAMES_
+#undef GTEST_5_TYPENAMES_
+#undef GTEST_6_TYPENAMES_
+#undef GTEST_7_TYPENAMES_
+#undef GTEST_8_TYPENAMES_
+#undef GTEST_9_TYPENAMES_
+#undef GTEST_10_TYPENAMES_
+
+#undef GTEST_DECLARE_TUPLE_AS_FRIEND_
+#undef GTEST_BY_REF_
+#undef GTEST_ADD_REF_
+#undef GTEST_TUPLE_ELEMENT_
+
+#endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TUPLE_H_
diff --git a/contrib/gtest-1.7.0/include/gtest/internal/gtest-tuple.h.pump b/contrib/gtest-1.7.0/include/gtest/internal/gtest-tuple.h.pump
new file mode 100644
index 0000000..c7d9e03
--- /dev/null
+++ b/contrib/gtest-1.7.0/include/gtest/internal/gtest-tuple.h.pump
@@ -0,0 +1,339 @@
+$$ -*- mode: c++; -*-
+$var n = 10  $$ Maximum number of tuple fields we want to support.
+$$ This meta comment fixes auto-indentation in Emacs. }}
+// Copyright 2009 Google Inc.
+// All Rights Reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+
+// Implements a subset of TR1 tuple needed by Google Test and Google Mock.
+
+#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TUPLE_H_
+#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TUPLE_H_
+
+#include <utility>  // For ::std::pair.
+
+// The compiler used in Symbian has a bug that prevents us from declaring the
+// tuple template as a friend (it complains that tuple is redefined).  This
+// hack bypasses the bug by declaring the members that should otherwise be
+// private as public.
+// Sun Studio versions < 12 also have the above bug.
+#if defined(__SYMBIAN32__) || (defined(__SUNPRO_CC) && __SUNPRO_CC < 0x590)
+# define GTEST_DECLARE_TUPLE_AS_FRIEND_ public:
+#else
+# define GTEST_DECLARE_TUPLE_AS_FRIEND_ \
+    template <GTEST_$(n)_TYPENAMES_(U)> friend class tuple; \
+   private:
+#endif
+
+
+$range i 0..n-1
+$range j 0..n
+$range k 1..n
+// GTEST_n_TUPLE_(T) is the type of an n-tuple.
+#define GTEST_0_TUPLE_(T) tuple<>
+
+$for k [[
+$range m 0..k-1
+$range m2 k..n-1
+#define GTEST_$(k)_TUPLE_(T) tuple<$for m, [[T##$m]]$for m2 [[, void]]>
+
+]]
+
+// GTEST_n_TYPENAMES_(T) declares a list of n typenames.
+
+$for j [[
+$range m 0..j-1
+#define GTEST_$(j)_TYPENAMES_(T) $for m, [[typename T##$m]]
+
+
+]]
+
+// In theory, defining stuff in the ::std namespace is undefined
+// behavior.  We can do this as we are playing the role of a standard
+// library vendor.
+namespace std {
+namespace tr1 {
+
+template <$for i, [[typename T$i = void]]>
+class tuple;
+
+// Anything in namespace gtest_internal is Google Test's INTERNAL
+// IMPLEMENTATION DETAIL and MUST NOT BE USED DIRECTLY in user code.
+namespace gtest_internal {
+
+// ByRef<T>::type is T if T is a reference; otherwise it's const T&.
+template <typename T>
+struct ByRef { typedef const T& type; };  // NOLINT
+template <typename T>
+struct ByRef<T&> { typedef T& type; };  // NOLINT
+
+// A handy wrapper for ByRef.
+#define GTEST_BY_REF_(T) typename ::std::tr1::gtest_internal::ByRef<T>::type
+
+// AddRef<T>::type is T if T is a reference; otherwise it's T&.  This
+// is the same as tr1::add_reference<T>::type.
+template <typename T>
+struct AddRef { typedef T& type; };  // NOLINT
+template <typename T>
+struct AddRef<T&> { typedef T& type; };  // NOLINT
+
+// A handy wrapper for AddRef.
+#define GTEST_ADD_REF_(T) typename ::std::tr1::gtest_internal::AddRef<T>::type
+
+// A helper for implementing get<k>().
+template <int k> class Get;
+
+// A helper for implementing tuple_element<k, T>.  kIndexValid is true
+// iff k < the number of fields in tuple type T.
+template <bool kIndexValid, int kIndex, class Tuple>
+struct TupleElement;
+
+
+$for i [[
+template <GTEST_$(n)_TYPENAMES_(T)>
+struct TupleElement<true, $i, GTEST_$(n)_TUPLE_(T) > {
+  typedef T$i type;
+};
+
+
+]]
+}  // namespace gtest_internal
+
+template <>
+class tuple<> {
+ public:
+  tuple() {}
+  tuple(const tuple& /* t */)  {}
+  tuple& operator=(const tuple& /* t */) { return *this; }
+};
+
+
+$for k [[
+$range m 0..k-1
+template <GTEST_$(k)_TYPENAMES_(T)>
+class $if k < n [[GTEST_$(k)_TUPLE_(T)]] $else [[tuple]] {
+ public:
+  template <int k> friend class gtest_internal::Get;
+
+  tuple() : $for m, [[f$(m)_()]] {}
+
+  explicit tuple($for m, [[GTEST_BY_REF_(T$m) f$m]]) : [[]]
+$for m, [[f$(m)_(f$m)]] {}
+
+  tuple(const tuple& t) : $for m, [[f$(m)_(t.f$(m)_)]] {}
+
+  template <GTEST_$(k)_TYPENAMES_(U)>
+  tuple(const GTEST_$(k)_TUPLE_(U)& t) : $for m, [[f$(m)_(t.f$(m)_)]] {}
+
+$if k == 2 [[
+  template <typename U0, typename U1>
+  tuple(const ::std::pair<U0, U1>& p) : f0_(p.first), f1_(p.second) {}
+
+]]
+
+  tuple& operator=(const tuple& t) { return CopyFrom(t); }
+
+  template <GTEST_$(k)_TYPENAMES_(U)>
+  tuple& operator=(const GTEST_$(k)_TUPLE_(U)& t) {
+    return CopyFrom(t);
+  }
+
+$if k == 2 [[
+  template <typename U0, typename U1>
+  tuple& operator=(const ::std::pair<U0, U1>& p) {
+    f0_ = p.first;
+    f1_ = p.second;
+    return *this;
+  }
+
+]]
+
+  GTEST_DECLARE_TUPLE_AS_FRIEND_
+
+  template <GTEST_$(k)_TYPENAMES_(U)>
+  tuple& CopyFrom(const GTEST_$(k)_TUPLE_(U)& t) {
+
+$for m [[
+    f$(m)_ = t.f$(m)_;
+
+]]
+    return *this;
+  }
+
+
+$for m [[
+  T$m f$(m)_;
+
+]]
+};
+
+
+]]
+// 6.1.3.2 Tuple creation functions.
+
+// Known limitations: we don't support passing an
+// std::tr1::reference_wrapper<T> to make_tuple().  And we don't
+// implement tie().
+
+inline tuple<> make_tuple() { return tuple<>(); }
+
+$for k [[
+$range m 0..k-1
+
+template <GTEST_$(k)_TYPENAMES_(T)>
+inline GTEST_$(k)_TUPLE_(T) make_tuple($for m, [[const T$m& f$m]]) {
+  return GTEST_$(k)_TUPLE_(T)($for m, [[f$m]]);
+}
+
+]]
+
+// 6.1.3.3 Tuple helper classes.
+
+template <typename Tuple> struct tuple_size;
+
+
+$for j [[
+template <GTEST_$(j)_TYPENAMES_(T)>
+struct tuple_size<GTEST_$(j)_TUPLE_(T) > {
+  static const int value = $j;
+};
+
+
+]]
+template <int k, class Tuple>
+struct tuple_element {
+  typedef typename gtest_internal::TupleElement<
+      k < (tuple_size<Tuple>::value), k, Tuple>::type type;
+};
+
+#define GTEST_TUPLE_ELEMENT_(k, Tuple) typename tuple_element<k, Tuple >::type
+
+// 6.1.3.4 Element access.
+
+namespace gtest_internal {
+
+
+$for i [[
+template <>
+class Get<$i> {
+ public:
+  template <class Tuple>
+  static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_($i, Tuple))
+  Field(Tuple& t) { return t.f$(i)_; }  // NOLINT
+
+  template <class Tuple>
+  static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_($i, Tuple))
+  ConstField(const Tuple& t) { return t.f$(i)_; }
+};
+
+
+]]
+}  // namespace gtest_internal
+
+template <int k, GTEST_$(n)_TYPENAMES_(T)>
+GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(k, GTEST_$(n)_TUPLE_(T)))
+get(GTEST_$(n)_TUPLE_(T)& t) {
+  return gtest_internal::Get<k>::Field(t);
+}
+
+template <int k, GTEST_$(n)_TYPENAMES_(T)>
+GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(k,  GTEST_$(n)_TUPLE_(T)))
+get(const GTEST_$(n)_TUPLE_(T)& t) {
+  return gtest_internal::Get<k>::ConstField(t);
+}
+
+// 6.1.3.5 Relational operators
+
+// We only implement == and !=, as we don't have a need for the rest yet.
+
+namespace gtest_internal {
+
+// SameSizeTuplePrefixComparator<k, k>::Eq(t1, t2) returns true if the
+// first k fields of t1 equals the first k fields of t2.
+// SameSizeTuplePrefixComparator(k1, k2) would be a compiler error if
+// k1 != k2.
+template <int kSize1, int kSize2>
+struct SameSizeTuplePrefixComparator;
+
+template <>
+struct SameSizeTuplePrefixComparator<0, 0> {
+  template <class Tuple1, class Tuple2>
+  static bool Eq(const Tuple1& /* t1 */, const Tuple2& /* t2 */) {
+    return true;
+  }
+};
+
+template <int k>
+struct SameSizeTuplePrefixComparator<k, k> {
+  template <class Tuple1, class Tuple2>
+  static bool Eq(const Tuple1& t1, const Tuple2& t2) {
+    return SameSizeTuplePrefixComparator<k - 1, k - 1>::Eq(t1, t2) &&
+        ::std::tr1::get<k - 1>(t1) == ::std::tr1::get<k - 1>(t2);
+  }
+};
+
+}  // namespace gtest_internal
+
+template <GTEST_$(n)_TYPENAMES_(T), GTEST_$(n)_TYPENAMES_(U)>
+inline bool operator==(const GTEST_$(n)_TUPLE_(T)& t,
+                       const GTEST_$(n)_TUPLE_(U)& u) {
+  return gtest_internal::SameSizeTuplePrefixComparator<
+      tuple_size<GTEST_$(n)_TUPLE_(T) >::value,
+      tuple_size<GTEST_$(n)_TUPLE_(U) >::value>::Eq(t, u);
+}
+
+template <GTEST_$(n)_TYPENAMES_(T), GTEST_$(n)_TYPENAMES_(U)>
+inline bool operator!=(const GTEST_$(n)_TUPLE_(T)& t,
+                       const GTEST_$(n)_TUPLE_(U)& u) { return !(t == u); }
+
+// 6.1.4 Pairs.
+// Unimplemented.
+
+}  // namespace tr1
+}  // namespace std
+
+
+$for j [[
+#undef GTEST_$(j)_TUPLE_
+
+]]
+
+
+$for j [[
+#undef GTEST_$(j)_TYPENAMES_
+
+]]
+
+#undef GTEST_DECLARE_TUPLE_AS_FRIEND_
+#undef GTEST_BY_REF_
+#undef GTEST_ADD_REF_
+#undef GTEST_TUPLE_ELEMENT_
+
+#endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TUPLE_H_
diff --git a/contrib/gtest-1.7.0/include/gtest/internal/gtest-type-util.h b/contrib/gtest-1.7.0/include/gtest/internal/gtest-type-util.h
new file mode 100644
index 0000000..e46f7cf
--- /dev/null
+++ b/contrib/gtest-1.7.0/include/gtest/internal/gtest-type-util.h
@@ -0,0 +1,3331 @@
+// This file was GENERATED by command:
+//     pump.py gtest-type-util.h.pump
+// DO NOT EDIT BY HAND!!!
+
+// Copyright 2008 Google Inc.
+// All Rights Reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+
+// Type utilities needed for implementing typed and type-parameterized
+// tests.  This file is generated by a SCRIPT.  DO NOT EDIT BY HAND!
+//
+// Currently we support at most 50 types in a list, and at most 50
+// type-parameterized tests in one type-parameterized test case.
+// Please contact googletestframework at googlegroups.com if you need
+// more.
+
+#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TYPE_UTIL_H_
+#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TYPE_UTIL_H_
+
+#include "gtest/internal/gtest-port.h"
+
+// #ifdef __GNUC__ is too general here.  It is possible to use gcc without using
+// libstdc++ (which is where cxxabi.h comes from).
+# if GTEST_HAS_CXXABI_H_
+#  include <cxxabi.h>
+# elif defined(__HP_aCC)
+#  include <acxx_demangle.h>
+# endif  // GTEST_HASH_CXXABI_H_
+
+namespace testing {
+namespace internal {
+
+// GetTypeName<T>() returns a human-readable name of type T.
+// NB: This function is also used in Google Mock, so don't move it inside of
+// the typed-test-only section below.
+template <typename T>
+std::string GetTypeName() {
+# if GTEST_HAS_RTTI
+
+  const char* const name = typeid(T).name();
+#  if GTEST_HAS_CXXABI_H_ || defined(__HP_aCC)
+  int status = 0;
+  // gcc's implementation of typeid(T).name() mangles the type name,
+  // so we have to demangle it.
+#   if GTEST_HAS_CXXABI_H_
+  using abi::__cxa_demangle;
+#   endif  // GTEST_HAS_CXXABI_H_
+  char* const readable_name = __cxa_demangle(name, 0, 0, &status);
+  const std::string name_str(status == 0 ? readable_name : name);
+  free(readable_name);
+  return name_str;
+#  else
+  return name;
+#  endif  // GTEST_HAS_CXXABI_H_ || __HP_aCC
+
+# else
+
+  return "<type>";
+
+# endif  // GTEST_HAS_RTTI
+}
+
+#if GTEST_HAS_TYPED_TEST || GTEST_HAS_TYPED_TEST_P
+
+// AssertyTypeEq<T1, T2>::type is defined iff T1 and T2 are the same
+// type.  This can be used as a compile-time assertion to ensure that
+// two types are equal.
+
+template <typename T1, typename T2>
+struct AssertTypeEq;
+
+template <typename T>
+struct AssertTypeEq<T, T> {
+  typedef bool type;
+};
+
+// A unique type used as the default value for the arguments of class
+// template Types.  This allows us to simulate variadic templates
+// (e.g. Types<int>, Type<int, double>, and etc), which C++ doesn't
+// support directly.
+struct None {};
+
+// The following family of struct and struct templates are used to
+// represent type lists.  In particular, TypesN<T1, T2, ..., TN>
+// represents a type list with N types (T1, T2, ..., and TN) in it.
+// Except for Types0, every struct in the family has two member types:
+// Head for the first type in the list, and Tail for the rest of the
+// list.
+
+// The empty type list.
+struct Types0 {};
+
+// Type lists of length 1, 2, 3, and so on.
+
+template <typename T1>
+struct Types1 {
+  typedef T1 Head;
+  typedef Types0 Tail;
+};
+template <typename T1, typename T2>
+struct Types2 {
+  typedef T1 Head;
+  typedef Types1<T2> Tail;
+};
+
+template <typename T1, typename T2, typename T3>
+struct Types3 {
+  typedef T1 Head;
+  typedef Types2<T2, T3> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4>
+struct Types4 {
+  typedef T1 Head;
+  typedef Types3<T2, T3, T4> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5>
+struct Types5 {
+  typedef T1 Head;
+  typedef Types4<T2, T3, T4, T5> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6>
+struct Types6 {
+  typedef T1 Head;
+  typedef Types5<T2, T3, T4, T5, T6> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7>
+struct Types7 {
+  typedef T1 Head;
+  typedef Types6<T2, T3, T4, T5, T6, T7> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8>
+struct Types8 {
+  typedef T1 Head;
+  typedef Types7<T2, T3, T4, T5, T6, T7, T8> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9>
+struct Types9 {
+  typedef T1 Head;
+  typedef Types8<T2, T3, T4, T5, T6, T7, T8, T9> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10>
+struct Types10 {
+  typedef T1 Head;
+  typedef Types9<T2, T3, T4, T5, T6, T7, T8, T9, T10> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11>
+struct Types11 {
+  typedef T1 Head;
+  typedef Types10<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12>
+struct Types12 {
+  typedef T1 Head;
+  typedef Types11<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13>
+struct Types13 {
+  typedef T1 Head;
+  typedef Types12<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14>
+struct Types14 {
+  typedef T1 Head;
+  typedef Types13<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15>
+struct Types15 {
+  typedef T1 Head;
+  typedef Types14<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16>
+struct Types16 {
+  typedef T1 Head;
+  typedef Types15<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17>
+struct Types17 {
+  typedef T1 Head;
+  typedef Types16<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18>
+struct Types18 {
+  typedef T1 Head;
+  typedef Types17<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19>
+struct Types19 {
+  typedef T1 Head;
+  typedef Types18<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20>
+struct Types20 {
+  typedef T1 Head;
+  typedef Types19<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21>
+struct Types21 {
+  typedef T1 Head;
+  typedef Types20<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22>
+struct Types22 {
+  typedef T1 Head;
+  typedef Types21<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23>
+struct Types23 {
+  typedef T1 Head;
+  typedef Types22<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22, T23> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24>
+struct Types24 {
+  typedef T1 Head;
+  typedef Types23<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22, T23, T24> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25>
+struct Types25 {
+  typedef T1 Head;
+  typedef Types24<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26>
+struct Types26 {
+  typedef T1 Head;
+  typedef Types25<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27>
+struct Types27 {
+  typedef T1 Head;
+  typedef Types26<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28>
+struct Types28 {
+  typedef T1 Head;
+  typedef Types27<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29>
+struct Types29 {
+  typedef T1 Head;
+  typedef Types28<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+      T29> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30>
+struct Types30 {
+  typedef T1 Head;
+  typedef Types29<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+      T30> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31>
+struct Types31 {
+  typedef T1 Head;
+  typedef Types30<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+      T30, T31> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32>
+struct Types32 {
+  typedef T1 Head;
+  typedef Types31<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+      T30, T31, T32> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33>
+struct Types33 {
+  typedef T1 Head;
+  typedef Types32<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+      T30, T31, T32, T33> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34>
+struct Types34 {
+  typedef T1 Head;
+  typedef Types33<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+      T30, T31, T32, T33, T34> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35>
+struct Types35 {
+  typedef T1 Head;
+  typedef Types34<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+      T30, T31, T32, T33, T34, T35> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36>
+struct Types36 {
+  typedef T1 Head;
+  typedef Types35<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+      T30, T31, T32, T33, T34, T35, T36> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37>
+struct Types37 {
+  typedef T1 Head;
+  typedef Types36<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+      T30, T31, T32, T33, T34, T35, T36, T37> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38>
+struct Types38 {
+  typedef T1 Head;
+  typedef Types37<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+      T30, T31, T32, T33, T34, T35, T36, T37, T38> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39>
+struct Types39 {
+  typedef T1 Head;
+  typedef Types38<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+      T30, T31, T32, T33, T34, T35, T36, T37, T38, T39> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40>
+struct Types40 {
+  typedef T1 Head;
+  typedef Types39<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+      T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41>
+struct Types41 {
+  typedef T1 Head;
+  typedef Types40<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+      T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42>
+struct Types42 {
+  typedef T1 Head;
+  typedef Types41<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+      T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43>
+struct Types43 {
+  typedef T1 Head;
+  typedef Types42<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+      T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
+      T43> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43, typename T44>
+struct Types44 {
+  typedef T1 Head;
+  typedef Types43<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+      T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
+      T44> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43, typename T44, typename T45>
+struct Types45 {
+  typedef T1 Head;
+  typedef Types44<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+      T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
+      T44, T45> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43, typename T44, typename T45,
+    typename T46>
+struct Types46 {
+  typedef T1 Head;
+  typedef Types45<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+      T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
+      T44, T45, T46> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43, typename T44, typename T45,
+    typename T46, typename T47>
+struct Types47 {
+  typedef T1 Head;
+  typedef Types46<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+      T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
+      T44, T45, T46, T47> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43, typename T44, typename T45,
+    typename T46, typename T47, typename T48>
+struct Types48 {
+  typedef T1 Head;
+  typedef Types47<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+      T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
+      T44, T45, T46, T47, T48> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43, typename T44, typename T45,
+    typename T46, typename T47, typename T48, typename T49>
+struct Types49 {
+  typedef T1 Head;
+  typedef Types48<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+      T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
+      T44, T45, T46, T47, T48, T49> Tail;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43, typename T44, typename T45,
+    typename T46, typename T47, typename T48, typename T49, typename T50>
+struct Types50 {
+  typedef T1 Head;
+  typedef Types49<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+      T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+      T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
+      T44, T45, T46, T47, T48, T49, T50> Tail;
+};
+
+
+}  // namespace internal
+
+// We don't want to require the users to write TypesN<...> directly,
+// as that would require them to count the length.  Types<...> is much
+// easier to write, but generates horrible messages when there is a
+// compiler error, as gcc insists on printing out each template
+// argument, even if it has the default value (this means Types<int>
+// will appear as Types<int, None, None, ..., None> in the compiler
+// errors).
+//
+// Our solution is to combine the best part of the two approaches: a
+// user would write Types<T1, ..., TN>, and Google Test will translate
+// that to TypesN<T1, ..., TN> internally to make error messages
+// readable.  The translation is done by the 'type' member of the
+// Types template.
+template <typename T1 = internal::None, typename T2 = internal::None,
+    typename T3 = internal::None, typename T4 = internal::None,
+    typename T5 = internal::None, typename T6 = internal::None,
+    typename T7 = internal::None, typename T8 = internal::None,
+    typename T9 = internal::None, typename T10 = internal::None,
+    typename T11 = internal::None, typename T12 = internal::None,
+    typename T13 = internal::None, typename T14 = internal::None,
+    typename T15 = internal::None, typename T16 = internal::None,
+    typename T17 = internal::None, typename T18 = internal::None,
+    typename T19 = internal::None, typename T20 = internal::None,
+    typename T21 = internal::None, typename T22 = internal::None,
+    typename T23 = internal::None, typename T24 = internal::None,
+    typename T25 = internal::None, typename T26 = internal::None,
+    typename T27 = internal::None, typename T28 = internal::None,
+    typename T29 = internal::None, typename T30 = internal::None,
+    typename T31 = internal::None, typename T32 = internal::None,
+    typename T33 = internal::None, typename T34 = internal::None,
+    typename T35 = internal::None, typename T36 = internal::None,
+    typename T37 = internal::None, typename T38 = internal::None,
+    typename T39 = internal::None, typename T40 = internal::None,
+    typename T41 = internal::None, typename T42 = internal::None,
+    typename T43 = internal::None, typename T44 = internal::None,
+    typename T45 = internal::None, typename T46 = internal::None,
+    typename T47 = internal::None, typename T48 = internal::None,
+    typename T49 = internal::None, typename T50 = internal::None>
+struct Types {
+  typedef internal::Types50<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
+      T41, T42, T43, T44, T45, T46, T47, T48, T49, T50> type;
+};
+
+template <>
+struct Types<internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None> {
+  typedef internal::Types0 type;
+};
+template <typename T1>
+struct Types<T1, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None> {
+  typedef internal::Types1<T1> type;
+};
+template <typename T1, typename T2>
+struct Types<T1, T2, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None> {
+  typedef internal::Types2<T1, T2> type;
+};
+template <typename T1, typename T2, typename T3>
+struct Types<T1, T2, T3, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None> {
+  typedef internal::Types3<T1, T2, T3> type;
+};
+template <typename T1, typename T2, typename T3, typename T4>
+struct Types<T1, T2, T3, T4, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None> {
+  typedef internal::Types4<T1, T2, T3, T4> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5>
+struct Types<T1, T2, T3, T4, T5, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None> {
+  typedef internal::Types5<T1, T2, T3, T4, T5> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6>
+struct Types<T1, T2, T3, T4, T5, T6, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None> {
+  typedef internal::Types6<T1, T2, T3, T4, T5, T6> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7>
+struct Types<T1, T2, T3, T4, T5, T6, T7, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None> {
+  typedef internal::Types7<T1, T2, T3, T4, T5, T6, T7> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None> {
+  typedef internal::Types8<T1, T2, T3, T4, T5, T6, T7, T8> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None> {
+  typedef internal::Types9<T1, T2, T3, T4, T5, T6, T7, T8, T9> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None> {
+  typedef internal::Types10<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None> {
+  typedef internal::Types11<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None> {
+  typedef internal::Types12<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,
+      T12> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None> {
+  typedef internal::Types13<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None> {
+  typedef internal::Types14<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None> {
+  typedef internal::Types15<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None> {
+  typedef internal::Types16<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None> {
+  typedef internal::Types17<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None> {
+  typedef internal::Types18<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None> {
+  typedef internal::Types19<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None> {
+  typedef internal::Types20<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None> {
+  typedef internal::Types21<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, T22, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None> {
+  typedef internal::Types22<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, T22, T23, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None> {
+  typedef internal::Types23<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, T22, T23, T24, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None> {
+  typedef internal::Types24<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None> {
+  typedef internal::Types25<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None> {
+  typedef internal::Types26<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,
+      T26> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None> {
+  typedef internal::Types27<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+      T27> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None> {
+  typedef internal::Types28<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+      T27, T28> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None> {
+  typedef internal::Types29<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+      T27, T28, T29> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None> {
+  typedef internal::Types30<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+      T27, T28, T29, T30> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
+    T31, internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None> {
+  typedef internal::Types31<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+      T27, T28, T29, T30, T31> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
+    T31, T32, internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None> {
+  typedef internal::Types32<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+      T27, T28, T29, T30, T31, T32> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
+    T31, T32, T33, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None> {
+  typedef internal::Types33<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+      T27, T28, T29, T30, T31, T32, T33> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
+    T31, T32, T33, T34, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None> {
+  typedef internal::Types34<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+      T27, T28, T29, T30, T31, T32, T33, T34> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
+    T31, T32, T33, T34, T35, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None> {
+  typedef internal::Types35<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+      T27, T28, T29, T30, T31, T32, T33, T34, T35> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
+    T31, T32, T33, T34, T35, T36, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None> {
+  typedef internal::Types36<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
+    T31, T32, T33, T34, T35, T36, T37, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None> {
+  typedef internal::Types37<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
+    T31, T32, T33, T34, T35, T36, T37, T38, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None> {
+  typedef internal::Types38<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
+    T31, T32, T33, T34, T35, T36, T37, T38, T39, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None> {
+  typedef internal::Types39<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
+    T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None> {
+  typedef internal::Types40<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,
+      T40> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
+    T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None, internal::None> {
+  typedef internal::Types41<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
+      T41> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
+    T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, internal::None,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None> {
+  typedef internal::Types42<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
+      T41, T42> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
+    T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None, internal::None> {
+  typedef internal::Types43<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
+      T41, T42, T43> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43, typename T44>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
+    T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None, internal::None> {
+  typedef internal::Types44<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
+      T41, T42, T43, T44> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43, typename T44, typename T45>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
+    T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44, T45,
+    internal::None, internal::None, internal::None, internal::None,
+    internal::None> {
+  typedef internal::Types45<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
+      T41, T42, T43, T44, T45> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43, typename T44, typename T45,
+    typename T46>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
+    T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44, T45,
+    T46, internal::None, internal::None, internal::None, internal::None> {
+  typedef internal::Types46<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
+      T41, T42, T43, T44, T45, T46> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43, typename T44, typename T45,
+    typename T46, typename T47>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
+    T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44, T45,
+    T46, T47, internal::None, internal::None, internal::None> {
+  typedef internal::Types47<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
+      T41, T42, T43, T44, T45, T46, T47> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43, typename T44, typename T45,
+    typename T46, typename T47, typename T48>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
+    T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44, T45,
+    T46, T47, T48, internal::None, internal::None> {
+  typedef internal::Types48<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
+      T41, T42, T43, T44, T45, T46, T47, T48> type;
+};
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43, typename T44, typename T45,
+    typename T46, typename T47, typename T48, typename T49>
+struct Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15,
+    T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T30,
+    T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44, T45,
+    T46, T47, T48, T49, internal::None> {
+  typedef internal::Types49<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
+      T41, T42, T43, T44, T45, T46, T47, T48, T49> type;
+};
+
+namespace internal {
+
+# define GTEST_TEMPLATE_ template <typename T> class
+
+// The template "selector" struct TemplateSel<Tmpl> is used to
+// represent Tmpl, which must be a class template with one type
+// parameter, as a type.  TemplateSel<Tmpl>::Bind<T>::type is defined
+// as the type Tmpl<T>.  This allows us to actually instantiate the
+// template "selected" by TemplateSel<Tmpl>.
+//
+// This trick is necessary for simulating typedef for class templates,
+// which C++ doesn't support directly.
+template <GTEST_TEMPLATE_ Tmpl>
+struct TemplateSel {
+  template <typename T>
+  struct Bind {
+    typedef Tmpl<T> type;
+  };
+};
+
+# define GTEST_BIND_(TmplSel, T) \
+  TmplSel::template Bind<T>::type
+
+// A unique struct template used as the default value for the
+// arguments of class template Templates.  This allows us to simulate
+// variadic templates (e.g. Templates<int>, Templates<int, double>,
+// and etc), which C++ doesn't support directly.
+template <typename T>
+struct NoneT {};
+
+// The following family of struct and struct templates are used to
+// represent template lists.  In particular, TemplatesN<T1, T2, ...,
+// TN> represents a list of N templates (T1, T2, ..., and TN).  Except
+// for Templates0, every struct in the family has two member types:
+// Head for the selector of the first template in the list, and Tail
+// for the rest of the list.
+
+// The empty template list.
+struct Templates0 {};
+
+// Template lists of length 1, 2, 3, and so on.
+
+template <GTEST_TEMPLATE_ T1>
+struct Templates1 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates0 Tail;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2>
+struct Templates2 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates1<T2> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3>
+struct Templates3 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates2<T2, T3> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4>
+struct Templates4 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates3<T2, T3, T4> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5>
+struct Templates5 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates4<T2, T3, T4, T5> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6>
+struct Templates6 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates5<T2, T3, T4, T5, T6> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7>
+struct Templates7 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates6<T2, T3, T4, T5, T6, T7> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8>
+struct Templates8 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates7<T2, T3, T4, T5, T6, T7, T8> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9>
+struct Templates9 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates8<T2, T3, T4, T5, T6, T7, T8, T9> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10>
+struct Templates10 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates9<T2, T3, T4, T5, T6, T7, T8, T9, T10> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11>
+struct Templates11 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates10<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12>
+struct Templates12 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates11<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13>
+struct Templates13 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates12<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14>
+struct Templates14 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates13<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15>
+struct Templates15 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates14<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16>
+struct Templates16 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates15<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17>
+struct Templates17 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates16<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18>
+struct Templates18 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates17<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19>
+struct Templates19 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates18<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20>
+struct Templates20 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates19<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21>
+struct Templates21 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates20<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22>
+struct Templates22 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates21<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23>
+struct Templates23 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates22<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22, T23> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24>
+struct Templates24 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates23<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25>
+struct Templates25 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates24<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26>
+struct Templates26 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates25<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27>
+struct Templates27 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates26<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28>
+struct Templates28 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates27<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+      T28> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29>
+struct Templates29 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates28<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+      T29> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30>
+struct Templates30 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates29<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+      T29, T30> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31>
+struct Templates31 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates30<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+      T29, T30, T31> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32>
+struct Templates32 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates31<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+      T29, T30, T31, T32> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33>
+struct Templates33 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates32<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+      T29, T30, T31, T32, T33> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34>
+struct Templates34 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates33<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+      T29, T30, T31, T32, T33, T34> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35>
+struct Templates35 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates34<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+      T29, T30, T31, T32, T33, T34, T35> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36>
+struct Templates36 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates35<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+      T29, T30, T31, T32, T33, T34, T35, T36> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+    GTEST_TEMPLATE_ T37>
+struct Templates37 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates36<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+      T29, T30, T31, T32, T33, T34, T35, T36, T37> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38>
+struct Templates38 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates37<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+      T29, T30, T31, T32, T33, T34, T35, T36, T37, T38> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39>
+struct Templates39 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates38<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+      T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
+    GTEST_TEMPLATE_ T40>
+struct Templates40 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates39<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+      T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
+    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41>
+struct Templates41 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates40<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+      T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
+    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42>
+struct Templates42 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates41<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+      T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
+      T42> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
+    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
+    GTEST_TEMPLATE_ T43>
+struct Templates43 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates42<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+      T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
+      T43> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
+    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
+    GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44>
+struct Templates44 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates43<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+      T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
+      T43, T44> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
+    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
+    GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45>
+struct Templates45 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates44<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+      T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
+      T43, T44, T45> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
+    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
+    GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,
+    GTEST_TEMPLATE_ T46>
+struct Templates46 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates45<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+      T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
+      T43, T44, T45, T46> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
+    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
+    GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,
+    GTEST_TEMPLATE_ T46, GTEST_TEMPLATE_ T47>
+struct Templates47 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates46<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+      T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
+      T43, T44, T45, T46, T47> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
+    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
+    GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,
+    GTEST_TEMPLATE_ T46, GTEST_TEMPLATE_ T47, GTEST_TEMPLATE_ T48>
+struct Templates48 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates47<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+      T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
+      T43, T44, T45, T46, T47, T48> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
+    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
+    GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,
+    GTEST_TEMPLATE_ T46, GTEST_TEMPLATE_ T47, GTEST_TEMPLATE_ T48,
+    GTEST_TEMPLATE_ T49>
+struct Templates49 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates48<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+      T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
+      T43, T44, T45, T46, T47, T48, T49> Tail;
+};
+
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
+    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
+    GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,
+    GTEST_TEMPLATE_ T46, GTEST_TEMPLATE_ T47, GTEST_TEMPLATE_ T48,
+    GTEST_TEMPLATE_ T49, GTEST_TEMPLATE_ T50>
+struct Templates50 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates49<T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+      T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+      T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,
+      T43, T44, T45, T46, T47, T48, T49, T50> Tail;
+};
+
+
+// We don't want to require the users to write TemplatesN<...> directly,
+// as that would require them to count the length.  Templates<...> is much
+// easier to write, but generates horrible messages when there is a
+// compiler error, as gcc insists on printing out each template
+// argument, even if it has the default value (this means Templates<list>
+// will appear as Templates<list, NoneT, NoneT, ..., NoneT> in the compiler
+// errors).
+//
+// Our solution is to combine the best part of the two approaches: a
+// user would write Templates<T1, ..., TN>, and Google Test will translate
+// that to TemplatesN<T1, ..., TN> internally to make error messages
+// readable.  The translation is done by the 'type' member of the
+// Templates template.
+template <GTEST_TEMPLATE_ T1 = NoneT, GTEST_TEMPLATE_ T2 = NoneT,
+    GTEST_TEMPLATE_ T3 = NoneT, GTEST_TEMPLATE_ T4 = NoneT,
+    GTEST_TEMPLATE_ T5 = NoneT, GTEST_TEMPLATE_ T6 = NoneT,
+    GTEST_TEMPLATE_ T7 = NoneT, GTEST_TEMPLATE_ T8 = NoneT,
+    GTEST_TEMPLATE_ T9 = NoneT, GTEST_TEMPLATE_ T10 = NoneT,
+    GTEST_TEMPLATE_ T11 = NoneT, GTEST_TEMPLATE_ T12 = NoneT,
+    GTEST_TEMPLATE_ T13 = NoneT, GTEST_TEMPLATE_ T14 = NoneT,
+    GTEST_TEMPLATE_ T15 = NoneT, GTEST_TEMPLATE_ T16 = NoneT,
+    GTEST_TEMPLATE_ T17 = NoneT, GTEST_TEMPLATE_ T18 = NoneT,
+    GTEST_TEMPLATE_ T19 = NoneT, GTEST_TEMPLATE_ T20 = NoneT,
+    GTEST_TEMPLATE_ T21 = NoneT, GTEST_TEMPLATE_ T22 = NoneT,
+    GTEST_TEMPLATE_ T23 = NoneT, GTEST_TEMPLATE_ T24 = NoneT,
+    GTEST_TEMPLATE_ T25 = NoneT, GTEST_TEMPLATE_ T26 = NoneT,
+    GTEST_TEMPLATE_ T27 = NoneT, GTEST_TEMPLATE_ T28 = NoneT,
+    GTEST_TEMPLATE_ T29 = NoneT, GTEST_TEMPLATE_ T30 = NoneT,
+    GTEST_TEMPLATE_ T31 = NoneT, GTEST_TEMPLATE_ T32 = NoneT,
+    GTEST_TEMPLATE_ T33 = NoneT, GTEST_TEMPLATE_ T34 = NoneT,
+    GTEST_TEMPLATE_ T35 = NoneT, GTEST_TEMPLATE_ T36 = NoneT,
+    GTEST_TEMPLATE_ T37 = NoneT, GTEST_TEMPLATE_ T38 = NoneT,
+    GTEST_TEMPLATE_ T39 = NoneT, GTEST_TEMPLATE_ T40 = NoneT,
+    GTEST_TEMPLATE_ T41 = NoneT, GTEST_TEMPLATE_ T42 = NoneT,
+    GTEST_TEMPLATE_ T43 = NoneT, GTEST_TEMPLATE_ T44 = NoneT,
+    GTEST_TEMPLATE_ T45 = NoneT, GTEST_TEMPLATE_ T46 = NoneT,
+    GTEST_TEMPLATE_ T47 = NoneT, GTEST_TEMPLATE_ T48 = NoneT,
+    GTEST_TEMPLATE_ T49 = NoneT, GTEST_TEMPLATE_ T50 = NoneT>
+struct Templates {
+  typedef Templates50<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+      T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
+      T42, T43, T44, T45, T46, T47, T48, T49, T50> type;
+};
+
+template <>
+struct Templates<NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT> {
+  typedef Templates0 type;
+};
+template <GTEST_TEMPLATE_ T1>
+struct Templates<T1, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT> {
+  typedef Templates1<T1> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2>
+struct Templates<T1, T2, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT> {
+  typedef Templates2<T1, T2> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3>
+struct Templates<T1, T2, T3, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates3<T1, T2, T3> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4>
+struct Templates<T1, T2, T3, T4, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates4<T1, T2, T3, T4> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5>
+struct Templates<T1, T2, T3, T4, T5, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates5<T1, T2, T3, T4, T5> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6>
+struct Templates<T1, T2, T3, T4, T5, T6, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates6<T1, T2, T3, T4, T5, T6> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates7<T1, T2, T3, T4, T5, T6, T7> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates8<T1, T2, T3, T4, T5, T6, T7, T8> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates9<T1, T2, T3, T4, T5, T6, T7, T8, T9> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates10<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates11<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates12<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates13<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates14<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates15<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates16<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates17<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates18<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates19<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates20<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates21<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, T22, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT> {
+  typedef Templates22<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, T22, T23, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT> {
+  typedef Templates23<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT> {
+  typedef Templates24<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT> {
+  typedef Templates25<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT> {
+  typedef Templates26<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT> {
+  typedef Templates27<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+      T27> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT> {
+  typedef Templates28<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+      T28> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT> {
+  typedef Templates29<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+      T28, T29> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+    T30, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates30<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+      T28, T29, T30> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+    T30, T31, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates31<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+      T28, T29, T30, T31> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+    T30, T31, T32, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates32<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+      T28, T29, T30, T31, T32> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+    T30, T31, T32, T33, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates33<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+      T28, T29, T30, T31, T32, T33> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+    T30, T31, T32, T33, T34, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates34<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+      T28, T29, T30, T31, T32, T33, T34> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+    T30, T31, T32, T33, T34, T35, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates35<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+      T28, T29, T30, T31, T32, T33, T34, T35> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+    T30, T31, T32, T33, T34, T35, T36, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates36<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+      T28, T29, T30, T31, T32, T33, T34, T35, T36> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+    GTEST_TEMPLATE_ T37>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+    T30, T31, T32, T33, T34, T35, T36, T37, NoneT, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates37<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+      T28, T29, T30, T31, T32, T33, T34, T35, T36, T37> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+    T30, T31, T32, T33, T34, T35, T36, T37, T38, NoneT, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates38<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+      T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+    T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates39<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+      T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
+    GTEST_TEMPLATE_ T40>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+    T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, NoneT, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates40<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+      T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
+    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+    T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, NoneT, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates41<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+      T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
+      T41> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
+    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+    T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, NoneT,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates42<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+      T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
+      T42> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
+    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
+    GTEST_TEMPLATE_ T43>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+    T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates43<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+      T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
+      T42, T43> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
+    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
+    GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+    T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44,
+    NoneT, NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates44<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+      T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
+      T42, T43, T44> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
+    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
+    GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+    T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44,
+    T45, NoneT, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates45<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+      T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
+      T42, T43, T44, T45> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
+    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
+    GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,
+    GTEST_TEMPLATE_ T46>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+    T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44,
+    T45, T46, NoneT, NoneT, NoneT, NoneT> {
+  typedef Templates46<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+      T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
+      T42, T43, T44, T45, T46> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
+    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
+    GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,
+    GTEST_TEMPLATE_ T46, GTEST_TEMPLATE_ T47>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+    T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44,
+    T45, T46, T47, NoneT, NoneT, NoneT> {
+  typedef Templates47<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+      T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
+      T42, T43, T44, T45, T46, T47> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
+    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
+    GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,
+    GTEST_TEMPLATE_ T46, GTEST_TEMPLATE_ T47, GTEST_TEMPLATE_ T48>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+    T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44,
+    T45, T46, T47, T48, NoneT, NoneT> {
+  typedef Templates48<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+      T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
+      T42, T43, T44, T45, T46, T47, T48> type;
+};
+template <GTEST_TEMPLATE_ T1, GTEST_TEMPLATE_ T2, GTEST_TEMPLATE_ T3,
+    GTEST_TEMPLATE_ T4, GTEST_TEMPLATE_ T5, GTEST_TEMPLATE_ T6,
+    GTEST_TEMPLATE_ T7, GTEST_TEMPLATE_ T8, GTEST_TEMPLATE_ T9,
+    GTEST_TEMPLATE_ T10, GTEST_TEMPLATE_ T11, GTEST_TEMPLATE_ T12,
+    GTEST_TEMPLATE_ T13, GTEST_TEMPLATE_ T14, GTEST_TEMPLATE_ T15,
+    GTEST_TEMPLATE_ T16, GTEST_TEMPLATE_ T17, GTEST_TEMPLATE_ T18,
+    GTEST_TEMPLATE_ T19, GTEST_TEMPLATE_ T20, GTEST_TEMPLATE_ T21,
+    GTEST_TEMPLATE_ T22, GTEST_TEMPLATE_ T23, GTEST_TEMPLATE_ T24,
+    GTEST_TEMPLATE_ T25, GTEST_TEMPLATE_ T26, GTEST_TEMPLATE_ T27,
+    GTEST_TEMPLATE_ T28, GTEST_TEMPLATE_ T29, GTEST_TEMPLATE_ T30,
+    GTEST_TEMPLATE_ T31, GTEST_TEMPLATE_ T32, GTEST_TEMPLATE_ T33,
+    GTEST_TEMPLATE_ T34, GTEST_TEMPLATE_ T35, GTEST_TEMPLATE_ T36,
+    GTEST_TEMPLATE_ T37, GTEST_TEMPLATE_ T38, GTEST_TEMPLATE_ T39,
+    GTEST_TEMPLATE_ T40, GTEST_TEMPLATE_ T41, GTEST_TEMPLATE_ T42,
+    GTEST_TEMPLATE_ T43, GTEST_TEMPLATE_ T44, GTEST_TEMPLATE_ T45,
+    GTEST_TEMPLATE_ T46, GTEST_TEMPLATE_ T47, GTEST_TEMPLATE_ T48,
+    GTEST_TEMPLATE_ T49>
+struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,
+    T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29,
+    T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43, T44,
+    T45, T46, T47, T48, T49, NoneT> {
+  typedef Templates49<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+      T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,
+      T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,
+      T42, T43, T44, T45, T46, T47, T48, T49> type;
+};
+
+// The TypeList template makes it possible to use either a single type
+// or a Types<...> list in TYPED_TEST_CASE() and
+// INSTANTIATE_TYPED_TEST_CASE_P().
+
+template <typename T>
+struct TypeList {
+  typedef Types1<T> type;
+};
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+    typename T6, typename T7, typename T8, typename T9, typename T10,
+    typename T11, typename T12, typename T13, typename T14, typename T15,
+    typename T16, typename T17, typename T18, typename T19, typename T20,
+    typename T21, typename T22, typename T23, typename T24, typename T25,
+    typename T26, typename T27, typename T28, typename T29, typename T30,
+    typename T31, typename T32, typename T33, typename T34, typename T35,
+    typename T36, typename T37, typename T38, typename T39, typename T40,
+    typename T41, typename T42, typename T43, typename T44, typename T45,
+    typename T46, typename T47, typename T48, typename T49, typename T50>
+struct TypeList<Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,
+    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,
+    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,
+    T44, T45, T46, T47, T48, T49, T50> > {
+  typedef typename Types<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
+      T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,
+      T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,
+      T41, T42, T43, T44, T45, T46, T47, T48, T49, T50>::type type;
+};
+
+#endif  // GTEST_HAS_TYPED_TEST || GTEST_HAS_TYPED_TEST_P
+
+}  // namespace internal
+}  // namespace testing
+
+#endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TYPE_UTIL_H_
diff --git a/contrib/gtest-1.7.0/include/gtest/internal/gtest-type-util.h.pump b/contrib/gtest-1.7.0/include/gtest/internal/gtest-type-util.h.pump
new file mode 100644
index 0000000..251fdf0
--- /dev/null
+++ b/contrib/gtest-1.7.0/include/gtest/internal/gtest-type-util.h.pump
@@ -0,0 +1,297 @@
+$$ -*- mode: c++; -*-
+$var n = 50  $$ Maximum length of type lists we want to support.
+// Copyright 2008 Google Inc.
+// All Rights Reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+
+// Type utilities needed for implementing typed and type-parameterized
+// tests.  This file is generated by a SCRIPT.  DO NOT EDIT BY HAND!
+//
+// Currently we support at most $n types in a list, and at most $n
+// type-parameterized tests in one type-parameterized test case.
+// Please contact googletestframework at googlegroups.com if you need
+// more.
+
+#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TYPE_UTIL_H_
+#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TYPE_UTIL_H_
+
+#include "gtest/internal/gtest-port.h"
+
+// #ifdef __GNUC__ is too general here.  It is possible to use gcc without using
+// libstdc++ (which is where cxxabi.h comes from).
+# if GTEST_HAS_CXXABI_H_
+#  include <cxxabi.h>
+# elif defined(__HP_aCC)
+#  include <acxx_demangle.h>
+# endif  // GTEST_HASH_CXXABI_H_
+
+namespace testing {
+namespace internal {
+
+// GetTypeName<T>() returns a human-readable name of type T.
+// NB: This function is also used in Google Mock, so don't move it inside of
+// the typed-test-only section below.
+template <typename T>
+std::string GetTypeName() {
+# if GTEST_HAS_RTTI
+
+  const char* const name = typeid(T).name();
+#  if GTEST_HAS_CXXABI_H_ || defined(__HP_aCC)
+  int status = 0;
+  // gcc's implementation of typeid(T).name() mangles the type name,
+  // so we have to demangle it.
+#   if GTEST_HAS_CXXABI_H_
+  using abi::__cxa_demangle;
+#   endif  // GTEST_HAS_CXXABI_H_
+  char* const readable_name = __cxa_demangle(name, 0, 0, &status);
+  const std::string name_str(status == 0 ? readable_name : name);
+  free(readable_name);
+  return name_str;
+#  else
+  return name;
+#  endif  // GTEST_HAS_CXXABI_H_ || __HP_aCC
+
+# else
+
+  return "<type>";
+
+# endif  // GTEST_HAS_RTTI
+}
+
+#if GTEST_HAS_TYPED_TEST || GTEST_HAS_TYPED_TEST_P
+
+// AssertyTypeEq<T1, T2>::type is defined iff T1 and T2 are the same
+// type.  This can be used as a compile-time assertion to ensure that
+// two types are equal.
+
+template <typename T1, typename T2>
+struct AssertTypeEq;
+
+template <typename T>
+struct AssertTypeEq<T, T> {
+  typedef bool type;
+};
+
+// A unique type used as the default value for the arguments of class
+// template Types.  This allows us to simulate variadic templates
+// (e.g. Types<int>, Type<int, double>, and etc), which C++ doesn't
+// support directly.
+struct None {};
+
+// The following family of struct and struct templates are used to
+// represent type lists.  In particular, TypesN<T1, T2, ..., TN>
+// represents a type list with N types (T1, T2, ..., and TN) in it.
+// Except for Types0, every struct in the family has two member types:
+// Head for the first type in the list, and Tail for the rest of the
+// list.
+
+// The empty type list.
+struct Types0 {};
+
+// Type lists of length 1, 2, 3, and so on.
+
+template <typename T1>
+struct Types1 {
+  typedef T1 Head;
+  typedef Types0 Tail;
+};
+
+$range i 2..n
+
+$for i [[
+$range j 1..i
+$range k 2..i
+template <$for j, [[typename T$j]]>
+struct Types$i {
+  typedef T1 Head;
+  typedef Types$(i-1)<$for k, [[T$k]]> Tail;
+};
+
+
+]]
+
+}  // namespace internal
+
+// We don't want to require the users to write TypesN<...> directly,
+// as that would require them to count the length.  Types<...> is much
+// easier to write, but generates horrible messages when there is a
+// compiler error, as gcc insists on printing out each template
+// argument, even if it has the default value (this means Types<int>
+// will appear as Types<int, None, None, ..., None> in the compiler
+// errors).
+//
+// Our solution is to combine the best part of the two approaches: a
+// user would write Types<T1, ..., TN>, and Google Test will translate
+// that to TypesN<T1, ..., TN> internally to make error messages
+// readable.  The translation is done by the 'type' member of the
+// Types template.
+
+$range i 1..n
+template <$for i, [[typename T$i = internal::None]]>
+struct Types {
+  typedef internal::Types$n<$for i, [[T$i]]> type;
+};
+
+template <>
+struct Types<$for i, [[internal::None]]> {
+  typedef internal::Types0 type;
+};
+
+$range i 1..n-1
+$for i [[
+$range j 1..i
+$range k i+1..n
+template <$for j, [[typename T$j]]>
+struct Types<$for j, [[T$j]]$for k[[, internal::None]]> {
+  typedef internal::Types$i<$for j, [[T$j]]> type;
+};
+
+]]
+
+namespace internal {
+
+# define GTEST_TEMPLATE_ template <typename T> class
+
+// The template "selector" struct TemplateSel<Tmpl> is used to
+// represent Tmpl, which must be a class template with one type
+// parameter, as a type.  TemplateSel<Tmpl>::Bind<T>::type is defined
+// as the type Tmpl<T>.  This allows us to actually instantiate the
+// template "selected" by TemplateSel<Tmpl>.
+//
+// This trick is necessary for simulating typedef for class templates,
+// which C++ doesn't support directly.
+template <GTEST_TEMPLATE_ Tmpl>
+struct TemplateSel {
+  template <typename T>
+  struct Bind {
+    typedef Tmpl<T> type;
+  };
+};
+
+# define GTEST_BIND_(TmplSel, T) \
+  TmplSel::template Bind<T>::type
+
+// A unique struct template used as the default value for the
+// arguments of class template Templates.  This allows us to simulate
+// variadic templates (e.g. Templates<int>, Templates<int, double>,
+// and etc), which C++ doesn't support directly.
+template <typename T>
+struct NoneT {};
+
+// The following family of struct and struct templates are used to
+// represent template lists.  In particular, TemplatesN<T1, T2, ...,
+// TN> represents a list of N templates (T1, T2, ..., and TN).  Except
+// for Templates0, every struct in the family has two member types:
+// Head for the selector of the first template in the list, and Tail
+// for the rest of the list.
+
+// The empty template list.
+struct Templates0 {};
+
+// Template lists of length 1, 2, 3, and so on.
+
+template <GTEST_TEMPLATE_ T1>
+struct Templates1 {
+  typedef TemplateSel<T1> Head;
+  typedef Templates0 Tail;
+};
+
+$range i 2..n
+
+$for i [[
+$range j 1..i
+$range k 2..i
+template <$for j, [[GTEST_TEMPLATE_ T$j]]>
+struct Templates$i {
+  typedef TemplateSel<T1> Head;
+  typedef Templates$(i-1)<$for k, [[T$k]]> Tail;
+};
+
+
+]]
+
+// We don't want to require the users to write TemplatesN<...> directly,
+// as that would require them to count the length.  Templates<...> is much
+// easier to write, but generates horrible messages when there is a
+// compiler error, as gcc insists on printing out each template
+// argument, even if it has the default value (this means Templates<list>
+// will appear as Templates<list, NoneT, NoneT, ..., NoneT> in the compiler
+// errors).
+//
+// Our solution is to combine the best part of the two approaches: a
+// user would write Templates<T1, ..., TN>, and Google Test will translate
+// that to TemplatesN<T1, ..., TN> internally to make error messages
+// readable.  The translation is done by the 'type' member of the
+// Templates template.
+
+$range i 1..n
+template <$for i, [[GTEST_TEMPLATE_ T$i = NoneT]]>
+struct Templates {
+  typedef Templates$n<$for i, [[T$i]]> type;
+};
+
+template <>
+struct Templates<$for i, [[NoneT]]> {
+  typedef Templates0 type;
+};
+
+$range i 1..n-1
+$for i [[
+$range j 1..i
+$range k i+1..n
+template <$for j, [[GTEST_TEMPLATE_ T$j]]>
+struct Templates<$for j, [[T$j]]$for k[[, NoneT]]> {
+  typedef Templates$i<$for j, [[T$j]]> type;
+};
+
+]]
+
+// The TypeList template makes it possible to use either a single type
+// or a Types<...> list in TYPED_TEST_CASE() and
+// INSTANTIATE_TYPED_TEST_CASE_P().
+
+template <typename T>
+struct TypeList {
+  typedef Types1<T> type;
+};
+
+
+$range i 1..n
+template <$for i, [[typename T$i]]>
+struct TypeList<Types<$for i, [[T$i]]> > {
+  typedef typename Types<$for i, [[T$i]]>::type type;
+};
+
+#endif  // GTEST_HAS_TYPED_TEST || GTEST_HAS_TYPED_TEST_P
+
+}  // namespace internal
+}  // namespace testing
+
+#endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TYPE_UTIL_H_
diff --git a/contrib/gtest-1.7.0/m4/acx_pthread.m4 b/contrib/gtest-1.7.0/m4/acx_pthread.m4
new file mode 100644
index 0000000..2cf20de
--- /dev/null
+++ b/contrib/gtest-1.7.0/m4/acx_pthread.m4
@@ -0,0 +1,363 @@
+# This was retrieved from
+#    http://svn.0pointer.de/viewvc/trunk/common/acx_pthread.m4?revision=1277&root=avahi
+# See also (perhaps for new versions?)
+#    http://svn.0pointer.de/viewvc/trunk/common/acx_pthread.m4?root=avahi
+#
+# We've rewritten the inconsistency check code (from avahi), to work
+# more broadly.  In particular, it no longer assumes ld accepts -zdefs.
+# This caused a restructing of the code, but the functionality has only
+# changed a little.
+
+dnl @synopsis ACX_PTHREAD([ACTION-IF-FOUND[, ACTION-IF-NOT-FOUND]])
+dnl
+dnl @summary figure out how to build C programs using POSIX threads
+dnl
+dnl This macro figures out how to build C programs using POSIX threads.
+dnl It sets the PTHREAD_LIBS output variable to the threads library and
+dnl linker flags, and the PTHREAD_CFLAGS output variable to any special
+dnl C compiler flags that are needed. (The user can also force certain
+dnl compiler flags/libs to be tested by setting these environment
+dnl variables.)
+dnl
+dnl Also sets PTHREAD_CC to any special C compiler that is needed for
+dnl multi-threaded programs (defaults to the value of CC otherwise).
+dnl (This is necessary on AIX to use the special cc_r compiler alias.)
+dnl
+dnl NOTE: You are assumed to not only compile your program with these
+dnl flags, but also link it with them as well. e.g. you should link
+dnl with $PTHREAD_CC $CFLAGS $PTHREAD_CFLAGS $LDFLAGS ... $PTHREAD_LIBS
+dnl $LIBS
+dnl
+dnl If you are only building threads programs, you may wish to use
+dnl these variables in your default LIBS, CFLAGS, and CC:
+dnl
+dnl        LIBS="$PTHREAD_LIBS $LIBS"
+dnl        CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
+dnl        CC="$PTHREAD_CC"
+dnl
+dnl In addition, if the PTHREAD_CREATE_JOINABLE thread-attribute
+dnl constant has a nonstandard name, defines PTHREAD_CREATE_JOINABLE to
+dnl that name (e.g. PTHREAD_CREATE_UNDETACHED on AIX).
+dnl
+dnl ACTION-IF-FOUND is a list of shell commands to run if a threads
+dnl library is found, and ACTION-IF-NOT-FOUND is a list of commands to
+dnl run it if it is not found. If ACTION-IF-FOUND is not specified, the
+dnl default action will define HAVE_PTHREAD.
+dnl
+dnl Please let the authors know if this macro fails on any platform, or
+dnl if you have any other suggestions or comments. This macro was based
+dnl on work by SGJ on autoconf scripts for FFTW (www.fftw.org) (with
+dnl help from M. Frigo), as well as ac_pthread and hb_pthread macros
+dnl posted by Alejandro Forero Cuervo to the autoconf macro repository.
+dnl We are also grateful for the helpful feedback of numerous users.
+dnl
+dnl @category InstalledPackages
+dnl @author Steven G. Johnson <stevenj at alum.mit.edu>
+dnl @version 2006-05-29
+dnl @license GPLWithACException
+dnl 
+dnl Checks for GCC shared/pthread inconsistency based on work by
+dnl Marcin Owsiany <marcin at owsiany.pl>
+
+
+AC_DEFUN([ACX_PTHREAD], [
+AC_REQUIRE([AC_CANONICAL_HOST])
+AC_LANG_SAVE
+AC_LANG_C
+acx_pthread_ok=no
+
+# We used to check for pthread.h first, but this fails if pthread.h
+# requires special compiler flags (e.g. on True64 or Sequent).
+# It gets checked for in the link test anyway.
+
+# First of all, check if the user has set any of the PTHREAD_LIBS,
+# etcetera environment variables, and if threads linking works using
+# them:
+if test x"$PTHREAD_LIBS$PTHREAD_CFLAGS" != x; then
+        save_CFLAGS="$CFLAGS"
+        CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
+        save_LIBS="$LIBS"
+        LIBS="$PTHREAD_LIBS $LIBS"
+        AC_MSG_CHECKING([for pthread_join in LIBS=$PTHREAD_LIBS with CFLAGS=$PTHREAD_CFLAGS])
+        AC_TRY_LINK_FUNC(pthread_join, acx_pthread_ok=yes)
+        AC_MSG_RESULT($acx_pthread_ok)
+        if test x"$acx_pthread_ok" = xno; then
+                PTHREAD_LIBS=""
+                PTHREAD_CFLAGS=""
+        fi
+        LIBS="$save_LIBS"
+        CFLAGS="$save_CFLAGS"
+fi
+
+# We must check for the threads library under a number of different
+# names; the ordering is very important because some systems
+# (e.g. DEC) have both -lpthread and -lpthreads, where one of the
+# libraries is broken (non-POSIX).
+
+# Create a list of thread flags to try.  Items starting with a "-" are
+# C compiler flags, and other items are library names, except for "none"
+# which indicates that we try without any flags at all, and "pthread-config"
+# which is a program returning the flags for the Pth emulation library.
+
+acx_pthread_flags="pthreads none -Kthread -kthread lthread -pthread -pthreads -mthreads pthread --thread-safe -mt pthread-config"
+
+# The ordering *is* (sometimes) important.  Some notes on the
+# individual items follow:
+
+# pthreads: AIX (must check this before -lpthread)
+# none: in case threads are in libc; should be tried before -Kthread and
+#       other compiler flags to prevent continual compiler warnings
+# -Kthread: Sequent (threads in libc, but -Kthread needed for pthread.h)
+# -kthread: FreeBSD kernel threads (preferred to -pthread since SMP-able)
+# lthread: LinuxThreads port on FreeBSD (also preferred to -pthread)
+# -pthread: Linux/gcc (kernel threads), BSD/gcc (userland threads)
+# -pthreads: Solaris/gcc
+# -mthreads: Mingw32/gcc, Lynx/gcc
+# -mt: Sun Workshop C (may only link SunOS threads [-lthread], but it
+#      doesn't hurt to check since this sometimes defines pthreads too;
+#      also defines -D_REENTRANT)
+#      ... -mt is also the pthreads flag for HP/aCC
+# pthread: Linux, etcetera
+# --thread-safe: KAI C++
+# pthread-config: use pthread-config program (for GNU Pth library)
+
+case "${host_cpu}-${host_os}" in
+        *solaris*)
+
+        # On Solaris (at least, for some versions), libc contains stubbed
+        # (non-functional) versions of the pthreads routines, so link-based
+        # tests will erroneously succeed.  (We need to link with -pthreads/-mt/
+        # -lpthread.)  (The stubs are missing pthread_cleanup_push, or rather
+        # a function called by this macro, so we could check for that, but
+        # who knows whether they'll stub that too in a future libc.)  So,
+        # we'll just look for -pthreads and -lpthread first:
+
+        acx_pthread_flags="-pthreads pthread -mt -pthread $acx_pthread_flags"
+        ;;
+esac
+
+if test x"$acx_pthread_ok" = xno; then
+for flag in $acx_pthread_flags; do
+
+        case $flag in
+                none)
+                AC_MSG_CHECKING([whether pthreads work without any flags])
+                ;;
+
+                -*)
+                AC_MSG_CHECKING([whether pthreads work with $flag])
+                PTHREAD_CFLAGS="$flag"
+                ;;
+
+		pthread-config)
+		AC_CHECK_PROG(acx_pthread_config, pthread-config, yes, no)
+		if test x"$acx_pthread_config" = xno; then continue; fi
+		PTHREAD_CFLAGS="`pthread-config --cflags`"
+		PTHREAD_LIBS="`pthread-config --ldflags` `pthread-config --libs`"
+		;;
+
+                *)
+                AC_MSG_CHECKING([for the pthreads library -l$flag])
+                PTHREAD_LIBS="-l$flag"
+                ;;
+        esac
+
+        save_LIBS="$LIBS"
+        save_CFLAGS="$CFLAGS"
+        LIBS="$PTHREAD_LIBS $LIBS"
+        CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
+
+        # Check for various functions.  We must include pthread.h,
+        # since some functions may be macros.  (On the Sequent, we
+        # need a special flag -Kthread to make this header compile.)
+        # We check for pthread_join because it is in -lpthread on IRIX
+        # while pthread_create is in libc.  We check for pthread_attr_init
+        # due to DEC craziness with -lpthreads.  We check for
+        # pthread_cleanup_push because it is one of the few pthread
+        # functions on Solaris that doesn't have a non-functional libc stub.
+        # We try pthread_create on general principles.
+        AC_TRY_LINK([#include <pthread.h>],
+                    [pthread_t th; pthread_join(th, 0);
+                     pthread_attr_init(0); pthread_cleanup_push(0, 0);
+                     pthread_create(0,0,0,0); pthread_cleanup_pop(0); ],
+                    [acx_pthread_ok=yes])
+
+        LIBS="$save_LIBS"
+        CFLAGS="$save_CFLAGS"
+
+        AC_MSG_RESULT($acx_pthread_ok)
+        if test "x$acx_pthread_ok" = xyes; then
+                break;
+        fi
+
+        PTHREAD_LIBS=""
+        PTHREAD_CFLAGS=""
+done
+fi
+
+# Various other checks:
+if test "x$acx_pthread_ok" = xyes; then
+        save_LIBS="$LIBS"
+        LIBS="$PTHREAD_LIBS $LIBS"
+        save_CFLAGS="$CFLAGS"
+        CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
+
+        # Detect AIX lossage: JOINABLE attribute is called UNDETACHED.
+	AC_MSG_CHECKING([for joinable pthread attribute])
+	attr_name=unknown
+	for attr in PTHREAD_CREATE_JOINABLE PTHREAD_CREATE_UNDETACHED; do
+	    AC_TRY_LINK([#include <pthread.h>], [int attr=$attr; return attr;],
+                        [attr_name=$attr; break])
+	done
+        AC_MSG_RESULT($attr_name)
+        if test "$attr_name" != PTHREAD_CREATE_JOINABLE; then
+            AC_DEFINE_UNQUOTED(PTHREAD_CREATE_JOINABLE, $attr_name,
+                               [Define to necessary symbol if this constant
+                                uses a non-standard name on your system.])
+        fi
+
+        AC_MSG_CHECKING([if more special flags are required for pthreads])
+        flag=no
+        case "${host_cpu}-${host_os}" in
+            *-aix* | *-freebsd* | *-darwin*) flag="-D_THREAD_SAFE";;
+            *solaris* | *-osf* | *-hpux*) flag="-D_REENTRANT";;
+        esac
+        AC_MSG_RESULT(${flag})
+        if test "x$flag" != xno; then
+            PTHREAD_CFLAGS="$flag $PTHREAD_CFLAGS"
+        fi
+
+        LIBS="$save_LIBS"
+        CFLAGS="$save_CFLAGS"
+        # More AIX lossage: must compile with xlc_r or cc_r
+	if test x"$GCC" != xyes; then
+          AC_CHECK_PROGS(PTHREAD_CC, xlc_r cc_r, ${CC})
+        else
+          PTHREAD_CC=$CC
+	fi
+
+	# The next part tries to detect GCC inconsistency with -shared on some
+	# architectures and systems. The problem is that in certain
+	# configurations, when -shared is specified, GCC "forgets" to
+	# internally use various flags which are still necessary.
+	
+	#
+	# Prepare the flags
+	#
+	save_CFLAGS="$CFLAGS"
+	save_LIBS="$LIBS"
+	save_CC="$CC"
+	
+	# Try with the flags determined by the earlier checks.
+	#
+	# -Wl,-z,defs forces link-time symbol resolution, so that the
+	# linking checks with -shared actually have any value
+	#
+	# FIXME: -fPIC is required for -shared on many architectures,
+	# so we specify it here, but the right way would probably be to
+	# properly detect whether it is actually required.
+	CFLAGS="-shared -fPIC -Wl,-z,defs $CFLAGS $PTHREAD_CFLAGS"
+	LIBS="$PTHREAD_LIBS $LIBS"
+	CC="$PTHREAD_CC"
+	
+	# In order not to create several levels of indentation, we test
+	# the value of "$done" until we find the cure or run out of ideas.
+	done="no"
+	
+	# First, make sure the CFLAGS we added are actually accepted by our
+	# compiler.  If not (and OS X's ld, for instance, does not accept -z),
+	# then we can't do this test.
+	if test x"$done" = xno; then
+	   AC_MSG_CHECKING([whether to check for GCC pthread/shared inconsistencies])
+	   AC_TRY_LINK(,, , [done=yes])
+	
+	   if test "x$done" = xyes ; then
+	      AC_MSG_RESULT([no])
+	   else
+	      AC_MSG_RESULT([yes])
+	   fi
+	fi
+	
+	if test x"$done" = xno; then
+	   AC_MSG_CHECKING([whether -pthread is sufficient with -shared])
+	   AC_TRY_LINK([#include <pthread.h>],
+	      [pthread_t th; pthread_join(th, 0);
+	      pthread_attr_init(0); pthread_cleanup_push(0, 0);
+	      pthread_create(0,0,0,0); pthread_cleanup_pop(0); ],
+	      [done=yes])
+	   
+	   if test "x$done" = xyes; then
+	      AC_MSG_RESULT([yes])
+	   else
+	      AC_MSG_RESULT([no])
+	   fi
+	fi
+	
+	#
+	# Linux gcc on some architectures such as mips/mipsel forgets
+	# about -lpthread
+	#
+	if test x"$done" = xno; then
+	   AC_MSG_CHECKING([whether -lpthread fixes that])
+	   LIBS="-lpthread $PTHREAD_LIBS $save_LIBS"
+	   AC_TRY_LINK([#include <pthread.h>],
+	      [pthread_t th; pthread_join(th, 0);
+	      pthread_attr_init(0); pthread_cleanup_push(0, 0);
+	      pthread_create(0,0,0,0); pthread_cleanup_pop(0); ],
+	      [done=yes])
+	
+	   if test "x$done" = xyes; then
+	      AC_MSG_RESULT([yes])
+	      PTHREAD_LIBS="-lpthread $PTHREAD_LIBS"
+	   else
+	      AC_MSG_RESULT([no])
+	   fi
+	fi
+	#
+	# FreeBSD 4.10 gcc forgets to use -lc_r instead of -lc
+	#
+	if test x"$done" = xno; then
+	   AC_MSG_CHECKING([whether -lc_r fixes that])
+	   LIBS="-lc_r $PTHREAD_LIBS $save_LIBS"
+	   AC_TRY_LINK([#include <pthread.h>],
+	       [pthread_t th; pthread_join(th, 0);
+	        pthread_attr_init(0); pthread_cleanup_push(0, 0);
+	        pthread_create(0,0,0,0); pthread_cleanup_pop(0); ],
+	       [done=yes])
+	
+	   if test "x$done" = xyes; then
+	      AC_MSG_RESULT([yes])
+	      PTHREAD_LIBS="-lc_r $PTHREAD_LIBS"
+	   else
+	      AC_MSG_RESULT([no])
+	   fi
+	fi
+	if test x"$done" = xno; then
+	   # OK, we have run out of ideas
+	   AC_MSG_WARN([Impossible to determine how to use pthreads with shared libraries])
+	
+	   # so it's not safe to assume that we may use pthreads
+	   acx_pthread_ok=no
+	fi
+	
+	CFLAGS="$save_CFLAGS"
+	LIBS="$save_LIBS"
+	CC="$save_CC"
+else
+        PTHREAD_CC="$CC"
+fi
+
+AC_SUBST(PTHREAD_LIBS)
+AC_SUBST(PTHREAD_CFLAGS)
+AC_SUBST(PTHREAD_CC)
+
+# Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND:
+if test x"$acx_pthread_ok" = xyes; then
+        ifelse([$1],,AC_DEFINE(HAVE_PTHREAD,1,[Define if you have POSIX threads libraries and header files.]),[$1])
+        :
+else
+        acx_pthread_ok=no
+        $2
+fi
+AC_LANG_RESTORE
+])dnl ACX_PTHREAD
diff --git a/contrib/gtest-1.7.0/m4/gtest.m4 b/contrib/gtest-1.7.0/m4/gtest.m4
new file mode 100644
index 0000000..6598ba7
--- /dev/null
+++ b/contrib/gtest-1.7.0/m4/gtest.m4
@@ -0,0 +1,74 @@
+dnl GTEST_LIB_CHECK([minimum version [,
+dnl                  action if found [,action if not found]]])
+dnl
+dnl Check for the presence of the Google Test library, optionally at a minimum
+dnl version, and indicate a viable version with the HAVE_GTEST flag. It defines
+dnl standard variables for substitution including GTEST_CPPFLAGS,
+dnl GTEST_CXXFLAGS, GTEST_LDFLAGS, and GTEST_LIBS. It also defines
+dnl GTEST_VERSION as the version of Google Test found. Finally, it provides
+dnl optional custom action slots in the event GTEST is found or not.
+AC_DEFUN([GTEST_LIB_CHECK],
+[
+dnl Provide a flag to enable or disable Google Test usage.
+AC_ARG_ENABLE([gtest],
+  [AS_HELP_STRING([--enable-gtest],
+                  [Enable tests using the Google C++ Testing Framework.
+                  (Default is enabled.)])],
+  [],
+  [enable_gtest=])
+AC_ARG_VAR([GTEST_CONFIG],
+           [The exact path of Google Test's 'gtest-config' script.])
+AC_ARG_VAR([GTEST_CPPFLAGS],
+           [C-like preprocessor flags for Google Test.])
+AC_ARG_VAR([GTEST_CXXFLAGS],
+           [C++ compile flags for Google Test.])
+AC_ARG_VAR([GTEST_LDFLAGS],
+           [Linker path and option flags for Google Test.])
+AC_ARG_VAR([GTEST_LIBS],
+           [Library linking flags for Google Test.])
+AC_ARG_VAR([GTEST_VERSION],
+           [The version of Google Test available.])
+HAVE_GTEST="no"
+AS_IF([test "x${enable_gtest}" != "xno"],
+  [AC_MSG_CHECKING([for 'gtest-config'])
+   AS_IF([test "x${enable_gtest}" != "xyes"],
+     [AS_IF([test -x "${enable_gtest}/scripts/gtest-config"],
+        [GTEST_CONFIG="${enable_gtest}/scripts/gtest-config"],
+        [GTEST_CONFIG="${enable_gtest}/bin/gtest-config"])
+      AS_IF([test -x "${GTEST_CONFIG}"], [],
+        [AC_MSG_RESULT([no])
+         AC_MSG_ERROR([dnl
+Unable to locate either a built or installed Google Test.
+The specific location '${enable_gtest}' was provided for a built or installed
+Google Test, but no 'gtest-config' script could be found at this location.])
+         ])],
+     [AC_PATH_PROG([GTEST_CONFIG], [gtest-config])])
+   AS_IF([test -x "${GTEST_CONFIG}"],
+     [AC_MSG_RESULT([${GTEST_CONFIG}])
+      m4_ifval([$1],
+        [_gtest_min_version="--min-version=$1"
+         AC_MSG_CHECKING([for Google Test at least version >= $1])],
+        [_gtest_min_version="--min-version=0"
+         AC_MSG_CHECKING([for Google Test])])
+      AS_IF([${GTEST_CONFIG} ${_gtest_min_version}],
+        [AC_MSG_RESULT([yes])
+         HAVE_GTEST='yes'],
+        [AC_MSG_RESULT([no])])],
+     [AC_MSG_RESULT([no])])
+   AS_IF([test "x${HAVE_GTEST}" = "xyes"],
+     [GTEST_CPPFLAGS=`${GTEST_CONFIG} --cppflags`
+      GTEST_CXXFLAGS=`${GTEST_CONFIG} --cxxflags`
+      GTEST_LDFLAGS=`${GTEST_CONFIG} --ldflags`
+      GTEST_LIBS=`${GTEST_CONFIG} --libs`
+      GTEST_VERSION=`${GTEST_CONFIG} --version`
+      AC_DEFINE([HAVE_GTEST],[1],[Defined when Google Test is available.])],
+     [AS_IF([test "x${enable_gtest}" = "xyes"],
+        [AC_MSG_ERROR([dnl
+Google Test was enabled, but no viable version could be found.])
+         ])])])
+AC_SUBST([HAVE_GTEST])
+AM_CONDITIONAL([HAVE_GTEST],[test "x$HAVE_GTEST" = "xyes"])
+AS_IF([test "x$HAVE_GTEST" = "xyes"],
+  [m4_ifval([$2], [$2])],
+  [m4_ifval([$3], [$3])])
+])
diff --git a/contrib/gtest-1.7.0/m4/libtool.m4 b/contrib/gtest-1.7.0/m4/libtool.m4
new file mode 100644
index 0000000..828104c
--- /dev/null
+++ b/contrib/gtest-1.7.0/m4/libtool.m4
@@ -0,0 +1,8001 @@
+# libtool.m4 - Configure libtool for the host system. -*-Autoconf-*-
+#
+#   Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005,
+#                 2006, 2007, 2008, 2009, 2010, 2011 Free Software
+#                 Foundation, Inc.
+#   Written by Gordon Matzigkeit, 1996
+#
+# 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.
+
+m4_define([_LT_COPYING], [dnl
+#   Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005,
+#                 2006, 2007, 2008, 2009, 2010, 2011 Free Software
+#                 Foundation, Inc.
+#   Written by Gordon Matzigkeit, 1996
+#
+#   This file is part of GNU Libtool.
+#
+# GNU Libtool is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License as
+# published by the Free Software Foundation; either version 2 of
+# the License, or (at your option) any later version.
+#
+# As a special exception to the GNU General Public License,
+# if you distribute this file as part of a program or library that
+# is built using GNU Libtool, you may include this file under the
+# same distribution terms that you use for the rest of that program.
+#
+# GNU Libtool 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 GNU Libtool; see the file COPYING.  If not, a copy
+# can be downloaded from http://www.gnu.org/licenses/gpl.html, or
+# obtained by writing to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+])
+
+# serial 57 LT_INIT
+
+
+# LT_PREREQ(VERSION)
+# ------------------
+# Complain and exit if this libtool version is less that VERSION.
+m4_defun([LT_PREREQ],
+[m4_if(m4_version_compare(m4_defn([LT_PACKAGE_VERSION]), [$1]), -1,
+       [m4_default([$3],
+		   [m4_fatal([Libtool version $1 or higher is required],
+		             63)])],
+       [$2])])
+
+
+# _LT_CHECK_BUILDDIR
+# ------------------
+# Complain if the absolute build directory name contains unusual characters
+m4_defun([_LT_CHECK_BUILDDIR],
+[case `pwd` in
+  *\ * | *\	*)
+    AC_MSG_WARN([Libtool does not cope well with whitespace in `pwd`]) ;;
+esac
+])
+
+
+# LT_INIT([OPTIONS])
+# ------------------
+AC_DEFUN([LT_INIT],
+[AC_PREREQ([2.58])dnl We use AC_INCLUDES_DEFAULT
+AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl
+AC_BEFORE([$0], [LT_LANG])dnl
+AC_BEFORE([$0], [LT_OUTPUT])dnl
+AC_BEFORE([$0], [LTDL_INIT])dnl
+m4_require([_LT_CHECK_BUILDDIR])dnl
+
+dnl Autoconf doesn't catch unexpanded LT_ macros by default:
+m4_pattern_forbid([^_?LT_[A-Z_]+$])dnl
+m4_pattern_allow([^(_LT_EOF|LT_DLGLOBAL|LT_DLLAZY_OR_NOW|LT_MULTI_MODULE)$])dnl
+dnl aclocal doesn't pull ltoptions.m4, ltsugar.m4, or ltversion.m4
+dnl unless we require an AC_DEFUNed macro:
+AC_REQUIRE([LTOPTIONS_VERSION])dnl
+AC_REQUIRE([LTSUGAR_VERSION])dnl
+AC_REQUIRE([LTVERSION_VERSION])dnl
+AC_REQUIRE([LTOBSOLETE_VERSION])dnl
+m4_require([_LT_PROG_LTMAIN])dnl
+
+_LT_SHELL_INIT([SHELL=${CONFIG_SHELL-/bin/sh}])
+
+dnl Parse OPTIONS
+_LT_SET_OPTIONS([$0], [$1])
+
+# This can be used to rebuild libtool when needed
+LIBTOOL_DEPS="$ltmain"
+
+# Always use our own libtool.
+LIBTOOL='$(SHELL) $(top_builddir)/libtool'
+AC_SUBST(LIBTOOL)dnl
+
+_LT_SETUP
+
+# Only expand once:
+m4_define([LT_INIT])
+])# LT_INIT
+
+# Old names:
+AU_ALIAS([AC_PROG_LIBTOOL], [LT_INIT])
+AU_ALIAS([AM_PROG_LIBTOOL], [LT_INIT])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_PROG_LIBTOOL], [])
+dnl AC_DEFUN([AM_PROG_LIBTOOL], [])
+
+
+# _LT_CC_BASENAME(CC)
+# -------------------
+# Calculate cc_basename.  Skip known compiler wrappers and cross-prefix.
+m4_defun([_LT_CC_BASENAME],
+[for cc_temp in $1""; do
+  case $cc_temp in
+    compile | *[[\\/]]compile | ccache | *[[\\/]]ccache ) ;;
+    distcc | *[[\\/]]distcc | purify | *[[\\/]]purify ) ;;
+    \-*) ;;
+    *) break;;
+  esac
+done
+cc_basename=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"`
+])
+
+
+# _LT_FILEUTILS_DEFAULTS
+# ----------------------
+# It is okay to use these file commands and assume they have been set
+# sensibly after `m4_require([_LT_FILEUTILS_DEFAULTS])'.
+m4_defun([_LT_FILEUTILS_DEFAULTS],
+[: ${CP="cp -f"}
+: ${MV="mv -f"}
+: ${RM="rm -f"}
+])# _LT_FILEUTILS_DEFAULTS
+
+
+# _LT_SETUP
+# ---------
+m4_defun([_LT_SETUP],
+[AC_REQUIRE([AC_CANONICAL_HOST])dnl
+AC_REQUIRE([AC_CANONICAL_BUILD])dnl
+AC_REQUIRE([_LT_PREPARE_SED_QUOTE_VARS])dnl
+AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])dnl
+
+_LT_DECL([], [PATH_SEPARATOR], [1], [The PATH separator for the build system])dnl
+dnl
+_LT_DECL([], [host_alias], [0], [The host system])dnl
+_LT_DECL([], [host], [0])dnl
+_LT_DECL([], [host_os], [0])dnl
+dnl
+_LT_DECL([], [build_alias], [0], [The build system])dnl
+_LT_DECL([], [build], [0])dnl
+_LT_DECL([], [build_os], [0])dnl
+dnl
+AC_REQUIRE([AC_PROG_CC])dnl
+AC_REQUIRE([LT_PATH_LD])dnl
+AC_REQUIRE([LT_PATH_NM])dnl
+dnl
+AC_REQUIRE([AC_PROG_LN_S])dnl
+test -z "$LN_S" && LN_S="ln -s"
+_LT_DECL([], [LN_S], [1], [Whether we need soft or hard links])dnl
+dnl
+AC_REQUIRE([LT_CMD_MAX_LEN])dnl
+_LT_DECL([objext], [ac_objext], [0], [Object file suffix (normally "o")])dnl
+_LT_DECL([], [exeext], [0], [Executable file suffix (normally "")])dnl
+dnl
+m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+m4_require([_LT_CHECK_SHELL_FEATURES])dnl
+m4_require([_LT_PATH_CONVERSION_FUNCTIONS])dnl
+m4_require([_LT_CMD_RELOAD])dnl
+m4_require([_LT_CHECK_MAGIC_METHOD])dnl
+m4_require([_LT_CHECK_SHAREDLIB_FROM_LINKLIB])dnl
+m4_require([_LT_CMD_OLD_ARCHIVE])dnl
+m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl
+m4_require([_LT_WITH_SYSROOT])dnl
+
+_LT_CONFIG_LIBTOOL_INIT([
+# See if we are running on zsh, and set the options which allow our
+# commands through without removal of \ escapes INIT.
+if test -n "\${ZSH_VERSION+set}" ; then
+   setopt NO_GLOB_SUBST
+fi
+])
+if test -n "${ZSH_VERSION+set}" ; then
+   setopt NO_GLOB_SUBST
+fi
+
+_LT_CHECK_OBJDIR
+
+m4_require([_LT_TAG_COMPILER])dnl
+
+case $host_os in
+aix3*)
+  # AIX sometimes has problems with the GCC collect2 program.  For some
+  # reason, if we set the COLLECT_NAMES environment variable, the problems
+  # vanish in a puff of smoke.
+  if test "X${COLLECT_NAMES+set}" != Xset; then
+    COLLECT_NAMES=
+    export COLLECT_NAMES
+  fi
+  ;;
+esac
+
+# Global variables:
+ofile=libtool
+can_build_shared=yes
+
+# All known linkers require a `.a' archive for static linking (except MSVC,
+# which needs '.lib').
+libext=a
+
+with_gnu_ld="$lt_cv_prog_gnu_ld"
+
+old_CC="$CC"
+old_CFLAGS="$CFLAGS"
+
+# Set sane defaults for various variables
+test -z "$CC" && CC=cc
+test -z "$LTCC" && LTCC=$CC
+test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS
+test -z "$LD" && LD=ld
+test -z "$ac_objext" && ac_objext=o
+
+_LT_CC_BASENAME([$compiler])
+
+# Only perform the check for file, if the check method requires it
+test -z "$MAGIC_CMD" && MAGIC_CMD=file
+case $deplibs_check_method in
+file_magic*)
+  if test "$file_magic_cmd" = '$MAGIC_CMD'; then
+    _LT_PATH_MAGIC
+  fi
+  ;;
+esac
+
+# Use C for the default configuration in the libtool script
+LT_SUPPORTED_TAG([CC])
+_LT_LANG_C_CONFIG
+_LT_LANG_DEFAULT_CONFIG
+_LT_CONFIG_COMMANDS
+])# _LT_SETUP
+
+
+# _LT_PREPARE_SED_QUOTE_VARS
+# --------------------------
+# Define a few sed substitution that help us do robust quoting.
+m4_defun([_LT_PREPARE_SED_QUOTE_VARS],
+[# Backslashify metacharacters that are still active within
+# double-quoted strings.
+sed_quote_subst='s/\([["`$\\]]\)/\\\1/g'
+
+# Same as above, but do not quote variable references.
+double_quote_subst='s/\([["`\\]]\)/\\\1/g'
+
+# Sed substitution to delay expansion of an escaped shell variable in a
+# double_quote_subst'ed string.
+delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g'
+
+# Sed substitution to delay expansion of an escaped single quote.
+delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g'
+
+# Sed substitution to avoid accidental globbing in evaled expressions
+no_glob_subst='s/\*/\\\*/g'
+])
+
+# _LT_PROG_LTMAIN
+# ---------------
+# Note that this code is called both from `configure', and `config.status'
+# now that we use AC_CONFIG_COMMANDS to generate libtool.  Notably,
+# `config.status' has no value for ac_aux_dir unless we are using Automake,
+# so we pass a copy along to make sure it has a sensible value anyway.
+m4_defun([_LT_PROG_LTMAIN],
+[m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([ltmain.sh])])dnl
+_LT_CONFIG_LIBTOOL_INIT([ac_aux_dir='$ac_aux_dir'])
+ltmain="$ac_aux_dir/ltmain.sh"
+])# _LT_PROG_LTMAIN
+
+
+## ------------------------------------- ##
+## Accumulate code for creating libtool. ##
+## ------------------------------------- ##
+
+# So that we can recreate a full libtool script including additional
+# tags, we accumulate the chunks of code to send to AC_CONFIG_COMMANDS
+# in macros and then make a single call at the end using the `libtool'
+# label.
+
+
+# _LT_CONFIG_LIBTOOL_INIT([INIT-COMMANDS])
+# ----------------------------------------
+# Register INIT-COMMANDS to be passed to AC_CONFIG_COMMANDS later.
+m4_define([_LT_CONFIG_LIBTOOL_INIT],
+[m4_ifval([$1],
+          [m4_append([_LT_OUTPUT_LIBTOOL_INIT],
+                     [$1
+])])])
+
+# Initialize.
+m4_define([_LT_OUTPUT_LIBTOOL_INIT])
+
+
+# _LT_CONFIG_LIBTOOL([COMMANDS])
+# ------------------------------
+# Register COMMANDS to be passed to AC_CONFIG_COMMANDS later.
+m4_define([_LT_CONFIG_LIBTOOL],
+[m4_ifval([$1],
+          [m4_append([_LT_OUTPUT_LIBTOOL_COMMANDS],
+                     [$1
+])])])
+
+# Initialize.
+m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS])
+
+
+# _LT_CONFIG_SAVE_COMMANDS([COMMANDS], [INIT_COMMANDS])
+# -----------------------------------------------------
+m4_defun([_LT_CONFIG_SAVE_COMMANDS],
+[_LT_CONFIG_LIBTOOL([$1])
+_LT_CONFIG_LIBTOOL_INIT([$2])
+])
+
+
+# _LT_FORMAT_COMMENT([COMMENT])
+# -----------------------------
+# Add leading comment marks to the start of each line, and a trailing
+# full-stop to the whole comment if one is not present already.
+m4_define([_LT_FORMAT_COMMENT],
+[m4_ifval([$1], [
+m4_bpatsubst([m4_bpatsubst([$1], [^ *], [# ])],
+              [['`$\]], [\\\&])]m4_bmatch([$1], [[!?.]$], [], [.])
+)])
+
+
+
+## ------------------------ ##
+## FIXME: Eliminate VARNAME ##
+## ------------------------ ##
+
+
+# _LT_DECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION], [IS-TAGGED?])
+# -------------------------------------------------------------------
+# CONFIGNAME is the name given to the value in the libtool script.
+# VARNAME is the (base) name used in the configure script.
+# VALUE may be 0, 1 or 2 for a computed quote escaped value based on
+# VARNAME.  Any other value will be used directly.
+m4_define([_LT_DECL],
+[lt_if_append_uniq([lt_decl_varnames], [$2], [, ],
+    [lt_dict_add_subkey([lt_decl_dict], [$2], [libtool_name],
+	[m4_ifval([$1], [$1], [$2])])
+    lt_dict_add_subkey([lt_decl_dict], [$2], [value], [$3])
+    m4_ifval([$4],
+	[lt_dict_add_subkey([lt_decl_dict], [$2], [description], [$4])])
+    lt_dict_add_subkey([lt_decl_dict], [$2],
+	[tagged?], [m4_ifval([$5], [yes], [no])])])
+])
+
+
+# _LT_TAGDECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION])
+# --------------------------------------------------------
+m4_define([_LT_TAGDECL], [_LT_DECL([$1], [$2], [$3], [$4], [yes])])
+
+
+# lt_decl_tag_varnames([SEPARATOR], [VARNAME1...])
+# ------------------------------------------------
+m4_define([lt_decl_tag_varnames],
+[_lt_decl_filter([tagged?], [yes], $@)])
+
+
+# _lt_decl_filter(SUBKEY, VALUE, [SEPARATOR], [VARNAME1..])
+# ---------------------------------------------------------
+m4_define([_lt_decl_filter],
+[m4_case([$#],
+  [0], [m4_fatal([$0: too few arguments: $#])],
+  [1], [m4_fatal([$0: too few arguments: $#: $1])],
+  [2], [lt_dict_filter([lt_decl_dict], [$1], [$2], [], lt_decl_varnames)],
+  [3], [lt_dict_filter([lt_decl_dict], [$1], [$2], [$3], lt_decl_varnames)],
+  [lt_dict_filter([lt_decl_dict], $@)])[]dnl
+])
+
+
+# lt_decl_quote_varnames([SEPARATOR], [VARNAME1...])
+# --------------------------------------------------
+m4_define([lt_decl_quote_varnames],
+[_lt_decl_filter([value], [1], $@)])
+
+
+# lt_decl_dquote_varnames([SEPARATOR], [VARNAME1...])
+# ---------------------------------------------------
+m4_define([lt_decl_dquote_varnames],
+[_lt_decl_filter([value], [2], $@)])
+
+
+# lt_decl_varnames_tagged([SEPARATOR], [VARNAME1...])
+# ---------------------------------------------------
+m4_define([lt_decl_varnames_tagged],
+[m4_assert([$# <= 2])dnl
+_$0(m4_quote(m4_default([$1], [[, ]])),
+    m4_ifval([$2], [[$2]], [m4_dquote(lt_decl_tag_varnames)]),
+    m4_split(m4_normalize(m4_quote(_LT_TAGS)), [ ]))])
+m4_define([_lt_decl_varnames_tagged],
+[m4_ifval([$3], [lt_combine([$1], [$2], [_], $3)])])
+
+
+# lt_decl_all_varnames([SEPARATOR], [VARNAME1...])
+# ------------------------------------------------
+m4_define([lt_decl_all_varnames],
+[_$0(m4_quote(m4_default([$1], [[, ]])),
+     m4_if([$2], [],
+	   m4_quote(lt_decl_varnames),
+	m4_quote(m4_shift($@))))[]dnl
+])
+m4_define([_lt_decl_all_varnames],
+[lt_join($@, lt_decl_varnames_tagged([$1],
+			lt_decl_tag_varnames([[, ]], m4_shift($@))))dnl
+])
+
+
+# _LT_CONFIG_STATUS_DECLARE([VARNAME])
+# ------------------------------------
+# Quote a variable value, and forward it to `config.status' so that its
+# declaration there will have the same value as in `configure'.  VARNAME
+# must have a single quote delimited value for this to work.
+m4_define([_LT_CONFIG_STATUS_DECLARE],
+[$1='`$ECHO "$][$1" | $SED "$delay_single_quote_subst"`'])
+
+
+# _LT_CONFIG_STATUS_DECLARATIONS
+# ------------------------------
+# We delimit libtool config variables with single quotes, so when
+# we write them to config.status, we have to be sure to quote all
+# embedded single quotes properly.  In configure, this macro expands
+# each variable declared with _LT_DECL (and _LT_TAGDECL) into:
+#
+#    <var>='`$ECHO "$<var>" | $SED "$delay_single_quote_subst"`'
+m4_defun([_LT_CONFIG_STATUS_DECLARATIONS],
+[m4_foreach([_lt_var], m4_quote(lt_decl_all_varnames),
+    [m4_n([_LT_CONFIG_STATUS_DECLARE(_lt_var)])])])
+
+
+# _LT_LIBTOOL_TAGS
+# ----------------
+# Output comment and list of tags supported by the script
+m4_defun([_LT_LIBTOOL_TAGS],
+[_LT_FORMAT_COMMENT([The names of the tagged configurations supported by this script])dnl
+available_tags="_LT_TAGS"dnl
+])
+
+
+# _LT_LIBTOOL_DECLARE(VARNAME, [TAG])
+# -----------------------------------
+# Extract the dictionary values for VARNAME (optionally with TAG) and
+# expand to a commented shell variable setting:
+#
+#    # Some comment about what VAR is for.
+#    visible_name=$lt_internal_name
+m4_define([_LT_LIBTOOL_DECLARE],
+[_LT_FORMAT_COMMENT(m4_quote(lt_dict_fetch([lt_decl_dict], [$1],
+					   [description])))[]dnl
+m4_pushdef([_libtool_name],
+    m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [libtool_name])))[]dnl
+m4_case(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [value])),
+    [0], [_libtool_name=[$]$1],
+    [1], [_libtool_name=$lt_[]$1],
+    [2], [_libtool_name=$lt_[]$1],
+    [_libtool_name=lt_dict_fetch([lt_decl_dict], [$1], [value])])[]dnl
+m4_ifval([$2], [_$2])[]m4_popdef([_libtool_name])[]dnl
+])
+
+
+# _LT_LIBTOOL_CONFIG_VARS
+# -----------------------
+# Produce commented declarations of non-tagged libtool config variables
+# suitable for insertion in the LIBTOOL CONFIG section of the `libtool'
+# script.  Tagged libtool config variables (even for the LIBTOOL CONFIG
+# section) are produced by _LT_LIBTOOL_TAG_VARS.
+m4_defun([_LT_LIBTOOL_CONFIG_VARS],
+[m4_foreach([_lt_var],
+    m4_quote(_lt_decl_filter([tagged?], [no], [], lt_decl_varnames)),
+    [m4_n([_LT_LIBTOOL_DECLARE(_lt_var)])])])
+
+
+# _LT_LIBTOOL_TAG_VARS(TAG)
+# -------------------------
+m4_define([_LT_LIBTOOL_TAG_VARS],
+[m4_foreach([_lt_var], m4_quote(lt_decl_tag_varnames),
+    [m4_n([_LT_LIBTOOL_DECLARE(_lt_var, [$1])])])])
+
+
+# _LT_TAGVAR(VARNAME, [TAGNAME])
+# ------------------------------
+m4_define([_LT_TAGVAR], [m4_ifval([$2], [$1_$2], [$1])])
+
+
+# _LT_CONFIG_COMMANDS
+# -------------------
+# Send accumulated output to $CONFIG_STATUS.  Thanks to the lists of
+# variables for single and double quote escaping we saved from calls
+# to _LT_DECL, we can put quote escaped variables declarations
+# into `config.status', and then the shell code to quote escape them in
+# for loops in `config.status'.  Finally, any additional code accumulated
+# from calls to _LT_CONFIG_LIBTOOL_INIT is expanded.
+m4_defun([_LT_CONFIG_COMMANDS],
+[AC_PROVIDE_IFELSE([LT_OUTPUT],
+	dnl If the libtool generation code has been placed in $CONFIG_LT,
+	dnl instead of duplicating it all over again into config.status,
+	dnl then we will have config.status run $CONFIG_LT later, so it
+	dnl needs to know what name is stored there:
+        [AC_CONFIG_COMMANDS([libtool],
+            [$SHELL $CONFIG_LT || AS_EXIT(1)], [CONFIG_LT='$CONFIG_LT'])],
+    dnl If the libtool generation code is destined for config.status,
+    dnl expand the accumulated commands and init code now:
+    [AC_CONFIG_COMMANDS([libtool],
+        [_LT_OUTPUT_LIBTOOL_COMMANDS], [_LT_OUTPUT_LIBTOOL_COMMANDS_INIT])])
+])#_LT_CONFIG_COMMANDS
+
+
+# Initialize.
+m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS_INIT],
+[
+
+# The HP-UX ksh and POSIX shell print the target directory to stdout
+# if CDPATH is set.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+sed_quote_subst='$sed_quote_subst'
+double_quote_subst='$double_quote_subst'
+delay_variable_subst='$delay_variable_subst'
+_LT_CONFIG_STATUS_DECLARATIONS
+LTCC='$LTCC'
+LTCFLAGS='$LTCFLAGS'
+compiler='$compiler_DEFAULT'
+
+# A function that is used when there is no print builtin or printf.
+func_fallback_echo ()
+{
+  eval 'cat <<_LTECHO_EOF
+\$[]1
+_LTECHO_EOF'
+}
+
+# Quote evaled strings.
+for var in lt_decl_all_varnames([[ \
+]], lt_decl_quote_varnames); do
+    case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in
+    *[[\\\\\\\`\\"\\\$]]*)
+      eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\""
+      ;;
+    *)
+      eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
+      ;;
+    esac
+done
+
+# Double-quote double-evaled strings.
+for var in lt_decl_all_varnames([[ \
+]], lt_decl_dquote_varnames); do
+    case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in
+    *[[\\\\\\\`\\"\\\$]]*)
+      eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\""
+      ;;
+    *)
+      eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
+      ;;
+    esac
+done
+
+_LT_OUTPUT_LIBTOOL_INIT
+])
+
+# _LT_GENERATED_FILE_INIT(FILE, [COMMENT])
+# ------------------------------------
+# Generate a child script FILE with all initialization necessary to
+# reuse the environment learned by the parent script, and make the
+# file executable.  If COMMENT is supplied, it is inserted after the
+# `#!' sequence but before initialization text begins.  After this
+# macro, additional text can be appended to FILE to form the body of
+# the child script.  The macro ends with non-zero status if the
+# file could not be fully written (such as if the disk is full).
+m4_ifdef([AS_INIT_GENERATED],
+[m4_defun([_LT_GENERATED_FILE_INIT],[AS_INIT_GENERATED($@)])],
+[m4_defun([_LT_GENERATED_FILE_INIT],
+[m4_require([AS_PREPARE])]dnl
+[m4_pushdef([AS_MESSAGE_LOG_FD])]dnl
+[lt_write_fail=0
+cat >$1 <<_ASEOF || lt_write_fail=1
+#! $SHELL
+# Generated by $as_me.
+$2
+SHELL=\${CONFIG_SHELL-$SHELL}
+export SHELL
+_ASEOF
+cat >>$1 <<\_ASEOF || lt_write_fail=1
+AS_SHELL_SANITIZE
+_AS_PREPARE
+exec AS_MESSAGE_FD>&1
+_ASEOF
+test $lt_write_fail = 0 && chmod +x $1[]dnl
+m4_popdef([AS_MESSAGE_LOG_FD])])])# _LT_GENERATED_FILE_INIT
+
+# LT_OUTPUT
+# ---------
+# This macro allows early generation of the libtool script (before
+# AC_OUTPUT is called), incase it is used in configure for compilation
+# tests.
+AC_DEFUN([LT_OUTPUT],
+[: ${CONFIG_LT=./config.lt}
+AC_MSG_NOTICE([creating $CONFIG_LT])
+_LT_GENERATED_FILE_INIT(["$CONFIG_LT"],
+[# Run this file to recreate a libtool stub with the current configuration.])
+
+cat >>"$CONFIG_LT" <<\_LTEOF
+lt_cl_silent=false
+exec AS_MESSAGE_LOG_FD>>config.log
+{
+  echo
+  AS_BOX([Running $as_me.])
+} >&AS_MESSAGE_LOG_FD
+
+lt_cl_help="\
+\`$as_me' creates a local libtool stub from the current configuration,
+for use in further configure time tests before the real libtool is
+generated.
+
+Usage: $[0] [[OPTIONS]]
+
+  -h, --help      print this help, then exit
+  -V, --version   print version number, then exit
+  -q, --quiet     do not print progress messages
+  -d, --debug     don't remove temporary files
+
+Report bugs to <bug-libtool at gnu.org>."
+
+lt_cl_version="\
+m4_ifset([AC_PACKAGE_NAME], [AC_PACKAGE_NAME ])config.lt[]dnl
+m4_ifset([AC_PACKAGE_VERSION], [ AC_PACKAGE_VERSION])
+configured by $[0], generated by m4_PACKAGE_STRING.
+
+Copyright (C) 2011 Free Software Foundation, Inc.
+This config.lt script is free software; the Free Software Foundation
+gives unlimited permision to copy, distribute and modify it."
+
+while test $[#] != 0
+do
+  case $[1] in
+    --version | --v* | -V )
+      echo "$lt_cl_version"; exit 0 ;;
+    --help | --h* | -h )
+      echo "$lt_cl_help"; exit 0 ;;
+    --debug | --d* | -d )
+      debug=: ;;
+    --quiet | --q* | --silent | --s* | -q )
+      lt_cl_silent=: ;;
+
+    -*) AC_MSG_ERROR([unrecognized option: $[1]
+Try \`$[0] --help' for more information.]) ;;
+
+    *) AC_MSG_ERROR([unrecognized argument: $[1]
+Try \`$[0] --help' for more information.]) ;;
+  esac
+  shift
+done
+
+if $lt_cl_silent; then
+  exec AS_MESSAGE_FD>/dev/null
+fi
+_LTEOF
+
+cat >>"$CONFIG_LT" <<_LTEOF
+_LT_OUTPUT_LIBTOOL_COMMANDS_INIT
+_LTEOF
+
+cat >>"$CONFIG_LT" <<\_LTEOF
+AC_MSG_NOTICE([creating $ofile])
+_LT_OUTPUT_LIBTOOL_COMMANDS
+AS_EXIT(0)
+_LTEOF
+chmod +x "$CONFIG_LT"
+
+# configure is writing to config.log, but config.lt does its own redirection,
+# appending to config.log, which fails on DOS, as config.log is still kept
+# open by configure.  Here we exec the FD to /dev/null, effectively closing
+# config.log, so it can be properly (re)opened and appended to by config.lt.
+lt_cl_success=:
+test "$silent" = yes &&
+  lt_config_lt_args="$lt_config_lt_args --quiet"
+exec AS_MESSAGE_LOG_FD>/dev/null
+$SHELL "$CONFIG_LT" $lt_config_lt_args || lt_cl_success=false
+exec AS_MESSAGE_LOG_FD>>config.log
+$lt_cl_success || AS_EXIT(1)
+])# LT_OUTPUT
+
+
+# _LT_CONFIG(TAG)
+# ---------------
+# If TAG is the built-in tag, create an initial libtool script with a
+# default configuration from the untagged config vars.  Otherwise add code
+# to config.status for appending the configuration named by TAG from the
+# matching tagged config vars.
+m4_defun([_LT_CONFIG],
+[m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+_LT_CONFIG_SAVE_COMMANDS([
+  m4_define([_LT_TAG], m4_if([$1], [], [C], [$1]))dnl
+  m4_if(_LT_TAG, [C], [
+    # See if we are running on zsh, and set the options which allow our
+    # commands through without removal of \ escapes.
+    if test -n "${ZSH_VERSION+set}" ; then
+      setopt NO_GLOB_SUBST
+    fi
+
+    cfgfile="${ofile}T"
+    trap "$RM \"$cfgfile\"; exit 1" 1 2 15
+    $RM "$cfgfile"
+
+    cat <<_LT_EOF >> "$cfgfile"
+#! $SHELL
+
+# `$ECHO "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services.
+# Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION
+# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
+# NOTE: Changes made to this file will be lost: look at ltmain.sh.
+#
+_LT_COPYING
+_LT_LIBTOOL_TAGS
+
+# ### BEGIN LIBTOOL CONFIG
+_LT_LIBTOOL_CONFIG_VARS
+_LT_LIBTOOL_TAG_VARS
+# ### END LIBTOOL CONFIG
+
+_LT_EOF
+
+  case $host_os in
+  aix3*)
+    cat <<\_LT_EOF >> "$cfgfile"
+# AIX sometimes has problems with the GCC collect2 program.  For some
+# reason, if we set the COLLECT_NAMES environment variable, the problems
+# vanish in a puff of smoke.
+if test "X${COLLECT_NAMES+set}" != Xset; then
+  COLLECT_NAMES=
+  export COLLECT_NAMES
+fi
+_LT_EOF
+    ;;
+  esac
+
+  _LT_PROG_LTMAIN
+
+  # We use sed instead of cat because bash on DJGPP gets confused if
+  # if finds mixed CR/LF and LF-only lines.  Since sed operates in
+  # text mode, it properly converts lines to CR/LF.  This bash problem
+  # is reportedly fixed, but why not run on old versions too?
+  sed '$q' "$ltmain" >> "$cfgfile" \
+     || (rm -f "$cfgfile"; exit 1)
+
+  _LT_PROG_REPLACE_SHELLFNS
+
+   mv -f "$cfgfile" "$ofile" ||
+    (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile")
+  chmod +x "$ofile"
+],
+[cat <<_LT_EOF >> "$ofile"
+
+dnl Unfortunately we have to use $1 here, since _LT_TAG is not expanded
+dnl in a comment (ie after a #).
+# ### BEGIN LIBTOOL TAG CONFIG: $1
+_LT_LIBTOOL_TAG_VARS(_LT_TAG)
+# ### END LIBTOOL TAG CONFIG: $1
+_LT_EOF
+])dnl /m4_if
+],
+[m4_if([$1], [], [
+    PACKAGE='$PACKAGE'
+    VERSION='$VERSION'
+    TIMESTAMP='$TIMESTAMP'
+    RM='$RM'
+    ofile='$ofile'], [])
+])dnl /_LT_CONFIG_SAVE_COMMANDS
+])# _LT_CONFIG
+
+
+# LT_SUPPORTED_TAG(TAG)
+# ---------------------
+# Trace this macro to discover what tags are supported by the libtool
+# --tag option, using:
+#    autoconf --trace 'LT_SUPPORTED_TAG:$1'
+AC_DEFUN([LT_SUPPORTED_TAG], [])
+
+
+# C support is built-in for now
+m4_define([_LT_LANG_C_enabled], [])
+m4_define([_LT_TAGS], [])
+
+
+# LT_LANG(LANG)
+# -------------
+# Enable libtool support for the given language if not already enabled.
+AC_DEFUN([LT_LANG],
+[AC_BEFORE([$0], [LT_OUTPUT])dnl
+m4_case([$1],
+  [C],			[_LT_LANG(C)],
+  [C++],		[_LT_LANG(CXX)],
+  [Go],			[_LT_LANG(GO)],
+  [Java],		[_LT_LANG(GCJ)],
+  [Fortran 77],		[_LT_LANG(F77)],
+  [Fortran],		[_LT_LANG(FC)],
+  [Windows Resource],	[_LT_LANG(RC)],
+  [m4_ifdef([_LT_LANG_]$1[_CONFIG],
+    [_LT_LANG($1)],
+    [m4_fatal([$0: unsupported language: "$1"])])])dnl
+])# LT_LANG
+
+
+# _LT_LANG(LANGNAME)
+# ------------------
+m4_defun([_LT_LANG],
+[m4_ifdef([_LT_LANG_]$1[_enabled], [],
+  [LT_SUPPORTED_TAG([$1])dnl
+  m4_append([_LT_TAGS], [$1 ])dnl
+  m4_define([_LT_LANG_]$1[_enabled], [])dnl
+  _LT_LANG_$1_CONFIG($1)])dnl
+])# _LT_LANG
+
+
+m4_ifndef([AC_PROG_GO], [
+############################################################
+# NOTE: This macro has been submitted for inclusion into   #
+#  GNU Autoconf as AC_PROG_GO.  When it is available in    #
+#  a released version of Autoconf we should remove this    #
+#  macro and use it instead.                               #
+############################################################
+m4_defun([AC_PROG_GO],
+[AC_LANG_PUSH(Go)dnl
+AC_ARG_VAR([GOC],     [Go compiler command])dnl
+AC_ARG_VAR([GOFLAGS], [Go compiler flags])dnl
+_AC_ARG_VAR_LDFLAGS()dnl
+AC_CHECK_TOOL(GOC, gccgo)
+if test -z "$GOC"; then
+  if test -n "$ac_tool_prefix"; then
+    AC_CHECK_PROG(GOC, [${ac_tool_prefix}gccgo], [${ac_tool_prefix}gccgo])
+  fi
+fi
+if test -z "$GOC"; then
+  AC_CHECK_PROG(GOC, gccgo, gccgo, false)
+fi
+])#m4_defun
+])#m4_ifndef
+
+
+# _LT_LANG_DEFAULT_CONFIG
+# -----------------------
+m4_defun([_LT_LANG_DEFAULT_CONFIG],
+[AC_PROVIDE_IFELSE([AC_PROG_CXX],
+  [LT_LANG(CXX)],
+  [m4_define([AC_PROG_CXX], defn([AC_PROG_CXX])[LT_LANG(CXX)])])
+
+AC_PROVIDE_IFELSE([AC_PROG_F77],
+  [LT_LANG(F77)],
+  [m4_define([AC_PROG_F77], defn([AC_PROG_F77])[LT_LANG(F77)])])
+
+AC_PROVIDE_IFELSE([AC_PROG_FC],
+  [LT_LANG(FC)],
+  [m4_define([AC_PROG_FC], defn([AC_PROG_FC])[LT_LANG(FC)])])
+
+dnl The call to [A][M_PROG_GCJ] is quoted like that to stop aclocal
+dnl pulling things in needlessly.
+AC_PROVIDE_IFELSE([AC_PROG_GCJ],
+  [LT_LANG(GCJ)],
+  [AC_PROVIDE_IFELSE([A][M_PROG_GCJ],
+    [LT_LANG(GCJ)],
+    [AC_PROVIDE_IFELSE([LT_PROG_GCJ],
+      [LT_LANG(GCJ)],
+      [m4_ifdef([AC_PROG_GCJ],
+	[m4_define([AC_PROG_GCJ], defn([AC_PROG_GCJ])[LT_LANG(GCJ)])])
+       m4_ifdef([A][M_PROG_GCJ],
+	[m4_define([A][M_PROG_GCJ], defn([A][M_PROG_GCJ])[LT_LANG(GCJ)])])
+       m4_ifdef([LT_PROG_GCJ],
+	[m4_define([LT_PROG_GCJ], defn([LT_PROG_GCJ])[LT_LANG(GCJ)])])])])])
+
+AC_PROVIDE_IFELSE([AC_PROG_GO],
+  [LT_LANG(GO)],
+  [m4_define([AC_PROG_GO], defn([AC_PROG_GO])[LT_LANG(GO)])])
+
+AC_PROVIDE_IFELSE([LT_PROG_RC],
+  [LT_LANG(RC)],
+  [m4_define([LT_PROG_RC], defn([LT_PROG_RC])[LT_LANG(RC)])])
+])# _LT_LANG_DEFAULT_CONFIG
+
+# Obsolete macros:
+AU_DEFUN([AC_LIBTOOL_CXX], [LT_LANG(C++)])
+AU_DEFUN([AC_LIBTOOL_F77], [LT_LANG(Fortran 77)])
+AU_DEFUN([AC_LIBTOOL_FC], [LT_LANG(Fortran)])
+AU_DEFUN([AC_LIBTOOL_GCJ], [LT_LANG(Java)])
+AU_DEFUN([AC_LIBTOOL_RC], [LT_LANG(Windows Resource)])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LIBTOOL_CXX], [])
+dnl AC_DEFUN([AC_LIBTOOL_F77], [])
+dnl AC_DEFUN([AC_LIBTOOL_FC], [])
+dnl AC_DEFUN([AC_LIBTOOL_GCJ], [])
+dnl AC_DEFUN([AC_LIBTOOL_RC], [])
+
+
+# _LT_TAG_COMPILER
+# ----------------
+m4_defun([_LT_TAG_COMPILER],
+[AC_REQUIRE([AC_PROG_CC])dnl
+
+_LT_DECL([LTCC], [CC], [1], [A C compiler])dnl
+_LT_DECL([LTCFLAGS], [CFLAGS], [1], [LTCC compiler flags])dnl
+_LT_TAGDECL([CC], [compiler], [1], [A language specific compiler])dnl
+_LT_TAGDECL([with_gcc], [GCC], [0], [Is the compiler the GNU compiler?])dnl
+
+# If no C compiler was specified, use CC.
+LTCC=${LTCC-"$CC"}
+
+# If no C compiler flags were specified, use CFLAGS.
+LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
+
+# Allow CC to be a program name with arguments.
+compiler=$CC
+])# _LT_TAG_COMPILER
+
+
+# _LT_COMPILER_BOILERPLATE
+# ------------------------
+# Check for compiler boilerplate output or warnings with
+# the simple compiler test code.
+m4_defun([_LT_COMPILER_BOILERPLATE],
+[m4_require([_LT_DECL_SED])dnl
+ac_outfile=conftest.$ac_objext
+echo "$lt_simple_compile_test_code" >conftest.$ac_ext
+eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_compiler_boilerplate=`cat conftest.err`
+$RM conftest*
+])# _LT_COMPILER_BOILERPLATE
+
+
+# _LT_LINKER_BOILERPLATE
+# ----------------------
+# Check for linker boilerplate output or warnings with
+# the simple link test code.
+m4_defun([_LT_LINKER_BOILERPLATE],
+[m4_require([_LT_DECL_SED])dnl
+ac_outfile=conftest.$ac_objext
+echo "$lt_simple_link_test_code" >conftest.$ac_ext
+eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_linker_boilerplate=`cat conftest.err`
+$RM -r conftest*
+])# _LT_LINKER_BOILERPLATE
+
+# _LT_REQUIRED_DARWIN_CHECKS
+# -------------------------
+m4_defun_once([_LT_REQUIRED_DARWIN_CHECKS],[
+  case $host_os in
+    rhapsody* | darwin*)
+    AC_CHECK_TOOL([DSYMUTIL], [dsymutil], [:])
+    AC_CHECK_TOOL([NMEDIT], [nmedit], [:])
+    AC_CHECK_TOOL([LIPO], [lipo], [:])
+    AC_CHECK_TOOL([OTOOL], [otool], [:])
+    AC_CHECK_TOOL([OTOOL64], [otool64], [:])
+    _LT_DECL([], [DSYMUTIL], [1],
+      [Tool to manipulate archived DWARF debug symbol files on Mac OS X])
+    _LT_DECL([], [NMEDIT], [1],
+      [Tool to change global to local symbols on Mac OS X])
+    _LT_DECL([], [LIPO], [1],
+      [Tool to manipulate fat objects and archives on Mac OS X])
+    _LT_DECL([], [OTOOL], [1],
+      [ldd/readelf like tool for Mach-O binaries on Mac OS X])
+    _LT_DECL([], [OTOOL64], [1],
+      [ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4])
+
+    AC_CACHE_CHECK([for -single_module linker flag],[lt_cv_apple_cc_single_mod],
+      [lt_cv_apple_cc_single_mod=no
+      if test -z "${LT_MULTI_MODULE}"; then
+	# By default we will add the -single_module flag. You can override
+	# by either setting the environment variable LT_MULTI_MODULE
+	# non-empty at configure time, or by adding -multi_module to the
+	# link flags.
+	rm -rf libconftest.dylib*
+	echo "int foo(void){return 1;}" > conftest.c
+	echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \
+-dynamiclib -Wl,-single_module conftest.c" >&AS_MESSAGE_LOG_FD
+	$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \
+	  -dynamiclib -Wl,-single_module conftest.c 2>conftest.err
+        _lt_result=$?
+	# If there is a non-empty error log, and "single_module"
+	# appears in it, assume the flag caused a linker warning
+        if test -s conftest.err && $GREP single_module conftest.err; then
+	  cat conftest.err >&AS_MESSAGE_LOG_FD
+	# Otherwise, if the output was created with a 0 exit code from
+	# the compiler, it worked.
+	elif test -f libconftest.dylib && test $_lt_result -eq 0; then
+	  lt_cv_apple_cc_single_mod=yes
+	else
+	  cat conftest.err >&AS_MESSAGE_LOG_FD
+	fi
+	rm -rf libconftest.dylib*
+	rm -f conftest.*
+      fi])
+
+    AC_CACHE_CHECK([for -exported_symbols_list linker flag],
+      [lt_cv_ld_exported_symbols_list],
+      [lt_cv_ld_exported_symbols_list=no
+      save_LDFLAGS=$LDFLAGS
+      echo "_main" > conftest.sym
+      LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym"
+      AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])],
+	[lt_cv_ld_exported_symbols_list=yes],
+	[lt_cv_ld_exported_symbols_list=no])
+	LDFLAGS="$save_LDFLAGS"
+    ])
+
+    AC_CACHE_CHECK([for -force_load linker flag],[lt_cv_ld_force_load],
+      [lt_cv_ld_force_load=no
+      cat > conftest.c << _LT_EOF
+int forced_loaded() { return 2;}
+_LT_EOF
+      echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&AS_MESSAGE_LOG_FD
+      $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&AS_MESSAGE_LOG_FD
+      echo "$AR cru libconftest.a conftest.o" >&AS_MESSAGE_LOG_FD
+      $AR cru libconftest.a conftest.o 2>&AS_MESSAGE_LOG_FD
+      echo "$RANLIB libconftest.a" >&AS_MESSAGE_LOG_FD
+      $RANLIB libconftest.a 2>&AS_MESSAGE_LOG_FD
+      cat > conftest.c << _LT_EOF
+int main() { return 0;}
+_LT_EOF
+      echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&AS_MESSAGE_LOG_FD
+      $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err
+      _lt_result=$?
+      if test -s conftest.err && $GREP force_load conftest.err; then
+	cat conftest.err >&AS_MESSAGE_LOG_FD
+      elif test -f conftest && test $_lt_result -eq 0 && $GREP forced_load conftest >/dev/null 2>&1 ; then
+	lt_cv_ld_force_load=yes
+      else
+	cat conftest.err >&AS_MESSAGE_LOG_FD
+      fi
+        rm -f conftest.err libconftest.a conftest conftest.c
+        rm -rf conftest.dSYM
+    ])
+    case $host_os in
+    rhapsody* | darwin1.[[012]])
+      _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;;
+    darwin1.*)
+      _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;;
+    darwin*) # darwin 5.x on
+      # if running on 10.5 or later, the deployment target defaults
+      # to the OS version, if on x86, and 10.4, the deployment
+      # target defaults to 10.4. Don't you love it?
+      case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in
+	10.0,*86*-darwin8*|10.0,*-darwin[[91]]*)
+	  _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;;
+	10.[[012]]*)
+	  _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;;
+	10.*)
+	  _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;;
+      esac
+    ;;
+  esac
+    if test "$lt_cv_apple_cc_single_mod" = "yes"; then
+      _lt_dar_single_mod='$single_module'
+    fi
+    if test "$lt_cv_ld_exported_symbols_list" = "yes"; then
+      _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym'
+    else
+      _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}'
+    fi
+    if test "$DSYMUTIL" != ":" && test "$lt_cv_ld_force_load" = "no"; then
+      _lt_dsymutil='~$DSYMUTIL $lib || :'
+    else
+      _lt_dsymutil=
+    fi
+    ;;
+  esac
+])
+
+
+# _LT_DARWIN_LINKER_FEATURES([TAG])
+# ---------------------------------
+# Checks for linker and compiler features on darwin
+m4_defun([_LT_DARWIN_LINKER_FEATURES],
+[
+  m4_require([_LT_REQUIRED_DARWIN_CHECKS])
+  _LT_TAGVAR(archive_cmds_need_lc, $1)=no
+  _LT_TAGVAR(hardcode_direct, $1)=no
+  _LT_TAGVAR(hardcode_automatic, $1)=yes
+  _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported
+  if test "$lt_cv_ld_force_load" = "yes"; then
+    _LT_TAGVAR(whole_archive_flag_spec, $1)='`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience ${wl}-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`'
+    m4_case([$1], [F77], [_LT_TAGVAR(compiler_needs_object, $1)=yes],
+                  [FC],  [_LT_TAGVAR(compiler_needs_object, $1)=yes])
+  else
+    _LT_TAGVAR(whole_archive_flag_spec, $1)=''
+  fi
+  _LT_TAGVAR(link_all_deplibs, $1)=yes
+  _LT_TAGVAR(allow_undefined_flag, $1)="$_lt_dar_allow_undefined"
+  case $cc_basename in
+     ifort*) _lt_dar_can_shared=yes ;;
+     *) _lt_dar_can_shared=$GCC ;;
+  esac
+  if test "$_lt_dar_can_shared" = "yes"; then
+    output_verbose_link_cmd=func_echo_all
+    _LT_TAGVAR(archive_cmds, $1)="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}"
+    _LT_TAGVAR(module_cmds, $1)="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}"
+    _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}"
+    _LT_TAGVAR(module_expsym_cmds, $1)="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}"
+    m4_if([$1], [CXX],
+[   if test "$lt_cv_apple_cc_single_mod" != "yes"; then
+      _LT_TAGVAR(archive_cmds, $1)="\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dsymutil}"
+      _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dar_export_syms}${_lt_dsymutil}"
+    fi
+],[])
+  else
+  _LT_TAGVAR(ld_shlibs, $1)=no
+  fi
+])
+
+# _LT_SYS_MODULE_PATH_AIX([TAGNAME])
+# ----------------------------------
+# Links a minimal program and checks the executable
+# for the system default hardcoded library path. In most cases,
+# this is /usr/lib:/lib, but when the MPI compilers are used
+# the location of the communication and MPI libs are included too.
+# If we don't find anything, use the default library path according
+# to the aix ld manual.
+# Store the results from the different compilers for each TAGNAME.
+# Allow to override them for all tags through lt_cv_aix_libpath.
+m4_defun([_LT_SYS_MODULE_PATH_AIX],
+[m4_require([_LT_DECL_SED])dnl
+if test "${lt_cv_aix_libpath+set}" = set; then
+  aix_libpath=$lt_cv_aix_libpath
+else
+  AC_CACHE_VAL([_LT_TAGVAR([lt_cv_aix_libpath_], [$1])],
+  [AC_LINK_IFELSE([AC_LANG_PROGRAM],[
+  lt_aix_libpath_sed='[
+      /Import File Strings/,/^$/ {
+	  /^0/ {
+	      s/^0  *\([^ ]*\) *$/\1/
+	      p
+	  }
+      }]'
+  _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+  # Check for a 64-bit object if we didn't find anything.
+  if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then
+    _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+  fi],[])
+  if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then
+    _LT_TAGVAR([lt_cv_aix_libpath_], [$1])="/usr/lib:/lib"
+  fi
+  ])
+  aix_libpath=$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])
+fi
+])# _LT_SYS_MODULE_PATH_AIX
+
+
+# _LT_SHELL_INIT(ARG)
+# -------------------
+m4_define([_LT_SHELL_INIT],
+[m4_divert_text([M4SH-INIT], [$1
+])])# _LT_SHELL_INIT
+
+
+
+# _LT_PROG_ECHO_BACKSLASH
+# -----------------------
+# Find how we can fake an echo command that does not interpret backslash.
+# In particular, with Autoconf 2.60 or later we add some code to the start
+# of the generated configure script which will find a shell with a builtin
+# printf (which we can use as an echo command).
+m4_defun([_LT_PROG_ECHO_BACKSLASH],
+[ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO
+ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO
+
+AC_MSG_CHECKING([how to print strings])
+# Test print first, because it will be a builtin if present.
+if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \
+   test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then
+  ECHO='print -r --'
+elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then
+  ECHO='printf %s\n'
+else
+  # Use this function as a fallback that always works.
+  func_fallback_echo ()
+  {
+    eval 'cat <<_LTECHO_EOF
+$[]1
+_LTECHO_EOF'
+  }
+  ECHO='func_fallback_echo'
+fi
+
+# func_echo_all arg...
+# Invoke $ECHO with all args, space-separated.
+func_echo_all ()
+{
+    $ECHO "$*" 
+}
+
+case "$ECHO" in
+  printf*) AC_MSG_RESULT([printf]) ;;
+  print*) AC_MSG_RESULT([print -r]) ;;
+  *) AC_MSG_RESULT([cat]) ;;
+esac
+
+m4_ifdef([_AS_DETECT_SUGGESTED],
+[_AS_DETECT_SUGGESTED([
+  test -n "${ZSH_VERSION+set}${BASH_VERSION+set}" || (
+    ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+    ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO
+    ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO
+    PATH=/empty FPATH=/empty; export PATH FPATH
+    test "X`printf %s $ECHO`" = "X$ECHO" \
+      || test "X`print -r -- $ECHO`" = "X$ECHO" )])])
+
+_LT_DECL([], [SHELL], [1], [Shell to use when invoking shell scripts])
+_LT_DECL([], [ECHO], [1], [An echo program that protects backslashes])
+])# _LT_PROG_ECHO_BACKSLASH
+
+
+# _LT_WITH_SYSROOT
+# ----------------
+AC_DEFUN([_LT_WITH_SYSROOT],
+[AC_MSG_CHECKING([for sysroot])
+AC_ARG_WITH([sysroot],
+[  --with-sysroot[=DIR] Search for dependent libraries within DIR
+                        (or the compiler's sysroot if not specified).],
+[], [with_sysroot=no])
+
+dnl lt_sysroot will always be passed unquoted.  We quote it here
+dnl in case the user passed a directory name.
+lt_sysroot=
+case ${with_sysroot} in #(
+ yes)
+   if test "$GCC" = yes; then
+     lt_sysroot=`$CC --print-sysroot 2>/dev/null`
+   fi
+   ;; #(
+ /*)
+   lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"`
+   ;; #(
+ no|'')
+   ;; #(
+ *)
+   AC_MSG_RESULT([${with_sysroot}])
+   AC_MSG_ERROR([The sysroot must be an absolute path.])
+   ;;
+esac
+
+ AC_MSG_RESULT([${lt_sysroot:-no}])
+_LT_DECL([], [lt_sysroot], [0], [The root where to search for ]dnl
+[dependent libraries, and in which our libraries should be installed.])])
+
+# _LT_ENABLE_LOCK
+# ---------------
+m4_defun([_LT_ENABLE_LOCK],
+[AC_ARG_ENABLE([libtool-lock],
+  [AS_HELP_STRING([--disable-libtool-lock],
+    [avoid locking (might break parallel builds)])])
+test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes
+
+# Some flags need to be propagated to the compiler or linker for good
+# libtool support.
+case $host in
+ia64-*-hpux*)
+  # Find out which ABI we are using.
+  echo 'int i;' > conftest.$ac_ext
+  if AC_TRY_EVAL(ac_compile); then
+    case `/usr/bin/file conftest.$ac_objext` in
+      *ELF-32*)
+	HPUX_IA64_MODE="32"
+	;;
+      *ELF-64*)
+	HPUX_IA64_MODE="64"
+	;;
+    esac
+  fi
+  rm -rf conftest*
+  ;;
+*-*-irix6*)
+  # Find out which ABI we are using.
+  echo '[#]line '$LINENO' "configure"' > conftest.$ac_ext
+  if AC_TRY_EVAL(ac_compile); then
+    if test "$lt_cv_prog_gnu_ld" = yes; then
+      case `/usr/bin/file conftest.$ac_objext` in
+	*32-bit*)
+	  LD="${LD-ld} -melf32bsmip"
+	  ;;
+	*N32*)
+	  LD="${LD-ld} -melf32bmipn32"
+	  ;;
+	*64-bit*)
+	  LD="${LD-ld} -melf64bmip"
+	;;
+      esac
+    else
+      case `/usr/bin/file conftest.$ac_objext` in
+	*32-bit*)
+	  LD="${LD-ld} -32"
+	  ;;
+	*N32*)
+	  LD="${LD-ld} -n32"
+	  ;;
+	*64-bit*)
+	  LD="${LD-ld} -64"
+	  ;;
+      esac
+    fi
+  fi
+  rm -rf conftest*
+  ;;
+
+x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \
+s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
+  # Find out which ABI we are using.
+  echo 'int i;' > conftest.$ac_ext
+  if AC_TRY_EVAL(ac_compile); then
+    case `/usr/bin/file conftest.o` in
+      *32-bit*)
+	case $host in
+	  x86_64-*kfreebsd*-gnu)
+	    LD="${LD-ld} -m elf_i386_fbsd"
+	    ;;
+	  x86_64-*linux*)
+	    LD="${LD-ld} -m elf_i386"
+	    ;;
+	  ppc64-*linux*|powerpc64-*linux*)
+	    LD="${LD-ld} -m elf32ppclinux"
+	    ;;
+	  s390x-*linux*)
+	    LD="${LD-ld} -m elf_s390"
+	    ;;
+	  sparc64-*linux*)
+	    LD="${LD-ld} -m elf32_sparc"
+	    ;;
+	esac
+	;;
+      *64-bit*)
+	case $host in
+	  x86_64-*kfreebsd*-gnu)
+	    LD="${LD-ld} -m elf_x86_64_fbsd"
+	    ;;
+	  x86_64-*linux*)
+	    LD="${LD-ld} -m elf_x86_64"
+	    ;;
+	  ppc*-*linux*|powerpc*-*linux*)
+	    LD="${LD-ld} -m elf64ppc"
+	    ;;
+	  s390*-*linux*|s390*-*tpf*)
+	    LD="${LD-ld} -m elf64_s390"
+	    ;;
+	  sparc*-*linux*)
+	    LD="${LD-ld} -m elf64_sparc"
+	    ;;
+	esac
+	;;
+    esac
+  fi
+  rm -rf conftest*
+  ;;
+
+*-*-sco3.2v5*)
+  # On SCO OpenServer 5, we need -belf to get full-featured binaries.
+  SAVE_CFLAGS="$CFLAGS"
+  CFLAGS="$CFLAGS -belf"
+  AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf,
+    [AC_LANG_PUSH(C)
+     AC_LINK_IFELSE([AC_LANG_PROGRAM([[]],[[]])],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no])
+     AC_LANG_POP])
+  if test x"$lt_cv_cc_needs_belf" != x"yes"; then
+    # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf
+    CFLAGS="$SAVE_CFLAGS"
+  fi
+  ;;
+*-*solaris*)
+  # Find out which ABI we are using.
+  echo 'int i;' > conftest.$ac_ext
+  if AC_TRY_EVAL(ac_compile); then
+    case `/usr/bin/file conftest.o` in
+    *64-bit*)
+      case $lt_cv_prog_gnu_ld in
+      yes*)
+        case $host in
+        i?86-*-solaris*)
+          LD="${LD-ld} -m elf_x86_64"
+          ;;
+        sparc*-*-solaris*)
+          LD="${LD-ld} -m elf64_sparc"
+          ;;
+        esac
+        # GNU ld 2.21 introduced _sol2 emulations.  Use them if available.
+        if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then
+          LD="${LD-ld}_sol2"
+        fi
+        ;;
+      *)
+	if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then
+	  LD="${LD-ld} -64"
+	fi
+	;;
+      esac
+      ;;
+    esac
+  fi
+  rm -rf conftest*
+  ;;
+esac
+
+need_locks="$enable_libtool_lock"
+])# _LT_ENABLE_LOCK
+
+
+# _LT_PROG_AR
+# -----------
+m4_defun([_LT_PROG_AR],
+[AC_CHECK_TOOLS(AR, [ar], false)
+: ${AR=ar}
+: ${AR_FLAGS=cru}
+_LT_DECL([], [AR], [1], [The archiver])
+_LT_DECL([], [AR_FLAGS], [1], [Flags to create an archive])
+
+AC_CACHE_CHECK([for archiver @FILE support], [lt_cv_ar_at_file],
+  [lt_cv_ar_at_file=no
+   AC_COMPILE_IFELSE([AC_LANG_PROGRAM],
+     [echo conftest.$ac_objext > conftest.lst
+      lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&AS_MESSAGE_LOG_FD'
+      AC_TRY_EVAL([lt_ar_try])
+      if test "$ac_status" -eq 0; then
+	# Ensure the archiver fails upon bogus file names.
+	rm -f conftest.$ac_objext libconftest.a
+	AC_TRY_EVAL([lt_ar_try])
+	if test "$ac_status" -ne 0; then
+          lt_cv_ar_at_file=@
+        fi
+      fi
+      rm -f conftest.* libconftest.a
+     ])
+  ])
+
+if test "x$lt_cv_ar_at_file" = xno; then
+  archiver_list_spec=
+else
+  archiver_list_spec=$lt_cv_ar_at_file
+fi
+_LT_DECL([], [archiver_list_spec], [1],
+  [How to feed a file listing to the archiver])
+])# _LT_PROG_AR
+
+
+# _LT_CMD_OLD_ARCHIVE
+# -------------------
+m4_defun([_LT_CMD_OLD_ARCHIVE],
+[_LT_PROG_AR
+
+AC_CHECK_TOOL(STRIP, strip, :)
+test -z "$STRIP" && STRIP=:
+_LT_DECL([], [STRIP], [1], [A symbol stripping program])
+
+AC_CHECK_TOOL(RANLIB, ranlib, :)
+test -z "$RANLIB" && RANLIB=:
+_LT_DECL([], [RANLIB], [1],
+    [Commands used to install an old-style archive])
+
+# Determine commands to create old-style static archives.
+old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs'
+old_postinstall_cmds='chmod 644 $oldlib'
+old_postuninstall_cmds=
+
+if test -n "$RANLIB"; then
+  case $host_os in
+  openbsd*)
+    old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib"
+    ;;
+  *)
+    old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib"
+    ;;
+  esac
+  old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib"
+fi
+
+case $host_os in
+  darwin*)
+    lock_old_archive_extraction=yes ;;
+  *)
+    lock_old_archive_extraction=no ;;
+esac
+_LT_DECL([], [old_postinstall_cmds], [2])
+_LT_DECL([], [old_postuninstall_cmds], [2])
+_LT_TAGDECL([], [old_archive_cmds], [2],
+    [Commands used to build an old-style archive])
+_LT_DECL([], [lock_old_archive_extraction], [0],
+    [Whether to use a lock for old archive extraction])
+])# _LT_CMD_OLD_ARCHIVE
+
+
+# _LT_COMPILER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS,
+#		[OUTPUT-FILE], [ACTION-SUCCESS], [ACTION-FAILURE])
+# ----------------------------------------------------------------
+# Check whether the given compiler option works
+AC_DEFUN([_LT_COMPILER_OPTION],
+[m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+m4_require([_LT_DECL_SED])dnl
+AC_CACHE_CHECK([$1], [$2],
+  [$2=no
+   m4_if([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4])
+   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+   lt_compiler_flag="$3"
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   # The option is referenced via a variable to avoid confusing sed.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD)
+   (eval "$lt_compile" 2>conftest.err)
+   ac_status=$?
+   cat conftest.err >&AS_MESSAGE_LOG_FD
+   echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD
+   if (exit $ac_status) && test -s "$ac_outfile"; then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings other than the usual output.
+     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp
+     $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+     if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
+       $2=yes
+     fi
+   fi
+   $RM conftest*
+])
+
+if test x"[$]$2" = xyes; then
+    m4_if([$5], , :, [$5])
+else
+    m4_if([$6], , :, [$6])
+fi
+])# _LT_COMPILER_OPTION
+
+# Old name:
+AU_ALIAS([AC_LIBTOOL_COMPILER_OPTION], [_LT_COMPILER_OPTION])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION], [])
+
+
+# _LT_LINKER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS,
+#                  [ACTION-SUCCESS], [ACTION-FAILURE])
+# ----------------------------------------------------
+# Check whether the given linker option works
+AC_DEFUN([_LT_LINKER_OPTION],
+[m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+m4_require([_LT_DECL_SED])dnl
+AC_CACHE_CHECK([$1], [$2],
+  [$2=no
+   save_LDFLAGS="$LDFLAGS"
+   LDFLAGS="$LDFLAGS $3"
+   echo "$lt_simple_link_test_code" > conftest.$ac_ext
+   if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
+     # The linker can only warn and ignore the option if not recognized
+     # So say no if there are warnings
+     if test -s conftest.err; then
+       # Append any errors to the config.log.
+       cat conftest.err 1>&AS_MESSAGE_LOG_FD
+       $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp
+       $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+       if diff conftest.exp conftest.er2 >/dev/null; then
+         $2=yes
+       fi
+     else
+       $2=yes
+     fi
+   fi
+   $RM -r conftest*
+   LDFLAGS="$save_LDFLAGS"
+])
+
+if test x"[$]$2" = xyes; then
+    m4_if([$4], , :, [$4])
+else
+    m4_if([$5], , :, [$5])
+fi
+])# _LT_LINKER_OPTION
+
+# Old name:
+AU_ALIAS([AC_LIBTOOL_LINKER_OPTION], [_LT_LINKER_OPTION])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LIBTOOL_LINKER_OPTION], [])
+
+
+# LT_CMD_MAX_LEN
+#---------------
+AC_DEFUN([LT_CMD_MAX_LEN],
+[AC_REQUIRE([AC_CANONICAL_HOST])dnl
+# find the maximum length of command line arguments
+AC_MSG_CHECKING([the maximum length of command line arguments])
+AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl
+  i=0
+  teststring="ABCD"
+
+  case $build_os in
+  msdosdjgpp*)
+    # On DJGPP, this test can blow up pretty badly due to problems in libc
+    # (any single argument exceeding 2000 bytes causes a buffer overrun
+    # during glob expansion).  Even if it were fixed, the result of this
+    # check would be larger than it should be.
+    lt_cv_sys_max_cmd_len=12288;    # 12K is about right
+    ;;
+
+  gnu*)
+    # Under GNU Hurd, this test is not required because there is
+    # no limit to the length of command line arguments.
+    # Libtool will interpret -1 as no limit whatsoever
+    lt_cv_sys_max_cmd_len=-1;
+    ;;
+
+  cygwin* | mingw* | cegcc*)
+    # On Win9x/ME, this test blows up -- it succeeds, but takes
+    # about 5 minutes as the teststring grows exponentially.
+    # Worse, since 9x/ME are not pre-emptively multitasking,
+    # you end up with a "frozen" computer, even though with patience
+    # the test eventually succeeds (with a max line length of 256k).
+    # Instead, let's just punt: use the minimum linelength reported by
+    # all of the supported platforms: 8192 (on NT/2K/XP).
+    lt_cv_sys_max_cmd_len=8192;
+    ;;
+
+  mint*)
+    # On MiNT this can take a long time and run out of memory.
+    lt_cv_sys_max_cmd_len=8192;
+    ;;
+
+  amigaos*)
+    # On AmigaOS with pdksh, this test takes hours, literally.
+    # So we just punt and use a minimum line length of 8192.
+    lt_cv_sys_max_cmd_len=8192;
+    ;;
+
+  netbsd* | freebsd* | openbsd* | darwin* | dragonfly*)
+    # This has been around since 386BSD, at least.  Likely further.
+    if test -x /sbin/sysctl; then
+      lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax`
+    elif test -x /usr/sbin/sysctl; then
+      lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax`
+    else
+      lt_cv_sys_max_cmd_len=65536	# usable default for all BSDs
+    fi
+    # And add a safety zone
+    lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
+    lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
+    ;;
+
+  interix*)
+    # We know the value 262144 and hardcode it with a safety zone (like BSD)
+    lt_cv_sys_max_cmd_len=196608
+    ;;
+
+  os2*)
+    # The test takes a long time on OS/2.
+    lt_cv_sys_max_cmd_len=8192
+    ;;
+
+  osf*)
+    # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure
+    # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not
+    # nice to cause kernel panics so lets avoid the loop below.
+    # First set a reasonable default.
+    lt_cv_sys_max_cmd_len=16384
+    #
+    if test -x /sbin/sysconfig; then
+      case `/sbin/sysconfig -q proc exec_disable_arg_limit` in
+        *1*) lt_cv_sys_max_cmd_len=-1 ;;
+      esac
+    fi
+    ;;
+  sco3.2v5*)
+    lt_cv_sys_max_cmd_len=102400
+    ;;
+  sysv5* | sco5v6* | sysv4.2uw2*)
+    kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null`
+    if test -n "$kargmax"; then
+      lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[[	 ]]//'`
+    else
+      lt_cv_sys_max_cmd_len=32768
+    fi
+    ;;
+  *)
+    lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null`
+    if test -n "$lt_cv_sys_max_cmd_len"; then
+      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
+      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
+    else
+      # Make teststring a little bigger before we do anything with it.
+      # a 1K string should be a reasonable start.
+      for i in 1 2 3 4 5 6 7 8 ; do
+        teststring=$teststring$teststring
+      done
+      SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}}
+      # If test is not a shell built-in, we'll probably end up computing a
+      # maximum length that is only half of the actual maximum length, but
+      # we can't tell.
+      while { test "X"`env echo "$teststring$teststring" 2>/dev/null` \
+	         = "X$teststring$teststring"; } >/dev/null 2>&1 &&
+	      test $i != 17 # 1/2 MB should be enough
+      do
+        i=`expr $i + 1`
+        teststring=$teststring$teststring
+      done
+      # Only check the string length outside the loop.
+      lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1`
+      teststring=
+      # Add a significant safety factor because C++ compilers can tack on
+      # massive amounts of additional arguments before passing them to the
+      # linker.  It appears as though 1/2 is a usable value.
+      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2`
+    fi
+    ;;
+  esac
+])
+if test -n $lt_cv_sys_max_cmd_len ; then
+  AC_MSG_RESULT($lt_cv_sys_max_cmd_len)
+else
+  AC_MSG_RESULT(none)
+fi
+max_cmd_len=$lt_cv_sys_max_cmd_len
+_LT_DECL([], [max_cmd_len], [0],
+    [What is the maximum length of a command?])
+])# LT_CMD_MAX_LEN
+
+# Old name:
+AU_ALIAS([AC_LIBTOOL_SYS_MAX_CMD_LEN], [LT_CMD_MAX_LEN])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN], [])
+
+
+# _LT_HEADER_DLFCN
+# ----------------
+m4_defun([_LT_HEADER_DLFCN],
+[AC_CHECK_HEADERS([dlfcn.h], [], [], [AC_INCLUDES_DEFAULT])dnl
+])# _LT_HEADER_DLFCN
+
+
+# _LT_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE,
+#                      ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING)
+# ----------------------------------------------------------------
+m4_defun([_LT_TRY_DLOPEN_SELF],
+[m4_require([_LT_HEADER_DLFCN])dnl
+if test "$cross_compiling" = yes; then :
+  [$4]
+else
+  lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
+  lt_status=$lt_dlunknown
+  cat > conftest.$ac_ext <<_LT_EOF
+[#line $LINENO "configure"
+#include "confdefs.h"
+
+#if HAVE_DLFCN_H
+#include <dlfcn.h>
+#endif
+
+#include <stdio.h>
+
+#ifdef RTLD_GLOBAL
+#  define LT_DLGLOBAL		RTLD_GLOBAL
+#else
+#  ifdef DL_GLOBAL
+#    define LT_DLGLOBAL		DL_GLOBAL
+#  else
+#    define LT_DLGLOBAL		0
+#  endif
+#endif
+
+/* We may have to define LT_DLLAZY_OR_NOW in the command line if we
+   find out it does not work in some platform. */
+#ifndef LT_DLLAZY_OR_NOW
+#  ifdef RTLD_LAZY
+#    define LT_DLLAZY_OR_NOW		RTLD_LAZY
+#  else
+#    ifdef DL_LAZY
+#      define LT_DLLAZY_OR_NOW		DL_LAZY
+#    else
+#      ifdef RTLD_NOW
+#        define LT_DLLAZY_OR_NOW	RTLD_NOW
+#      else
+#        ifdef DL_NOW
+#          define LT_DLLAZY_OR_NOW	DL_NOW
+#        else
+#          define LT_DLLAZY_OR_NOW	0
+#        endif
+#      endif
+#    endif
+#  endif
+#endif
+
+/* When -fvisbility=hidden is used, assume the code has been annotated
+   correspondingly for the symbols needed.  */
+#if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3))
+int fnord () __attribute__((visibility("default")));
+#endif
+
+int fnord () { return 42; }
+int main ()
+{
+  void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);
+  int status = $lt_dlunknown;
+
+  if (self)
+    {
+      if (dlsym (self,"fnord"))       status = $lt_dlno_uscore;
+      else
+        {
+	  if (dlsym( self,"_fnord"))  status = $lt_dlneed_uscore;
+          else puts (dlerror ());
+	}
+      /* dlclose (self); */
+    }
+  else
+    puts (dlerror ());
+
+  return status;
+}]
+_LT_EOF
+  if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext} 2>/dev/null; then
+    (./conftest; exit; ) >&AS_MESSAGE_LOG_FD 2>/dev/null
+    lt_status=$?
+    case x$lt_status in
+      x$lt_dlno_uscore) $1 ;;
+      x$lt_dlneed_uscore) $2 ;;
+      x$lt_dlunknown|x*) $3 ;;
+    esac
+  else :
+    # compilation failed
+    $3
+  fi
+fi
+rm -fr conftest*
+])# _LT_TRY_DLOPEN_SELF
+
+
+# LT_SYS_DLOPEN_SELF
+# ------------------
+AC_DEFUN([LT_SYS_DLOPEN_SELF],
+[m4_require([_LT_HEADER_DLFCN])dnl
+if test "x$enable_dlopen" != xyes; then
+  enable_dlopen=unknown
+  enable_dlopen_self=unknown
+  enable_dlopen_self_static=unknown
+else
+  lt_cv_dlopen=no
+  lt_cv_dlopen_libs=
+
+  case $host_os in
+  beos*)
+    lt_cv_dlopen="load_add_on"
+    lt_cv_dlopen_libs=
+    lt_cv_dlopen_self=yes
+    ;;
+
+  mingw* | pw32* | cegcc*)
+    lt_cv_dlopen="LoadLibrary"
+    lt_cv_dlopen_libs=
+    ;;
+
+  cygwin*)
+    lt_cv_dlopen="dlopen"
+    lt_cv_dlopen_libs=
+    ;;
+
+  darwin*)
+  # if libdl is installed we need to link against it
+    AC_CHECK_LIB([dl], [dlopen],
+		[lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],[
+    lt_cv_dlopen="dyld"
+    lt_cv_dlopen_libs=
+    lt_cv_dlopen_self=yes
+    ])
+    ;;
+
+  *)
+    AC_CHECK_FUNC([shl_load],
+	  [lt_cv_dlopen="shl_load"],
+      [AC_CHECK_LIB([dld], [shl_load],
+	    [lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld"],
+	[AC_CHECK_FUNC([dlopen],
+	      [lt_cv_dlopen="dlopen"],
+	  [AC_CHECK_LIB([dl], [dlopen],
+		[lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],
+	    [AC_CHECK_LIB([svld], [dlopen],
+		  [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"],
+	      [AC_CHECK_LIB([dld], [dld_link],
+		    [lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld"])
+	      ])
+	    ])
+	  ])
+	])
+      ])
+    ;;
+  esac
+
+  if test "x$lt_cv_dlopen" != xno; then
+    enable_dlopen=yes
+  else
+    enable_dlopen=no
+  fi
+
+  case $lt_cv_dlopen in
+  dlopen)
+    save_CPPFLAGS="$CPPFLAGS"
+    test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H"
+
+    save_LDFLAGS="$LDFLAGS"
+    wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\"
+
+    save_LIBS="$LIBS"
+    LIBS="$lt_cv_dlopen_libs $LIBS"
+
+    AC_CACHE_CHECK([whether a program can dlopen itself],
+	  lt_cv_dlopen_self, [dnl
+	  _LT_TRY_DLOPEN_SELF(
+	    lt_cv_dlopen_self=yes, lt_cv_dlopen_self=yes,
+	    lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross)
+    ])
+
+    if test "x$lt_cv_dlopen_self" = xyes; then
+      wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\"
+      AC_CACHE_CHECK([whether a statically linked program can dlopen itself],
+	  lt_cv_dlopen_self_static, [dnl
+	  _LT_TRY_DLOPEN_SELF(
+	    lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=yes,
+	    lt_cv_dlopen_self_static=no,  lt_cv_dlopen_self_static=cross)
+      ])
+    fi
+
+    CPPFLAGS="$save_CPPFLAGS"
+    LDFLAGS="$save_LDFLAGS"
+    LIBS="$save_LIBS"
+    ;;
+  esac
+
+  case $lt_cv_dlopen_self in
+  yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;;
+  *) enable_dlopen_self=unknown ;;
+  esac
+
+  case $lt_cv_dlopen_self_static in
+  yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;;
+  *) enable_dlopen_self_static=unknown ;;
+  esac
+fi
+_LT_DECL([dlopen_support], [enable_dlopen], [0],
+	 [Whether dlopen is supported])
+_LT_DECL([dlopen_self], [enable_dlopen_self], [0],
+	 [Whether dlopen of programs is supported])
+_LT_DECL([dlopen_self_static], [enable_dlopen_self_static], [0],
+	 [Whether dlopen of statically linked programs is supported])
+])# LT_SYS_DLOPEN_SELF
+
+# Old name:
+AU_ALIAS([AC_LIBTOOL_DLOPEN_SELF], [LT_SYS_DLOPEN_SELF])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF], [])
+
+
+# _LT_COMPILER_C_O([TAGNAME])
+# ---------------------------
+# Check to see if options -c and -o are simultaneously supported by compiler.
+# This macro does not hard code the compiler like AC_PROG_CC_C_O.
+m4_defun([_LT_COMPILER_C_O],
+[m4_require([_LT_DECL_SED])dnl
+m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+m4_require([_LT_TAG_COMPILER])dnl
+AC_CACHE_CHECK([if $compiler supports -c -o file.$ac_objext],
+  [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)],
+  [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=no
+   $RM -r conftest 2>/dev/null
+   mkdir conftest
+   cd conftest
+   mkdir out
+   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+   lt_compiler_flag="-o out/conftest2.$ac_objext"
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD)
+   (eval "$lt_compile" 2>out/conftest.err)
+   ac_status=$?
+   cat out/conftest.err >&AS_MESSAGE_LOG_FD
+   echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD
+   if (exit $ac_status) && test -s out/conftest2.$ac_objext
+   then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings
+     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp
+     $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
+     if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
+       _LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes
+     fi
+   fi
+   chmod u+w . 2>&AS_MESSAGE_LOG_FD
+   $RM conftest*
+   # SGI C++ compiler will create directory out/ii_files/ for
+   # template instantiation
+   test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files
+   $RM out/* && rmdir out
+   cd ..
+   $RM -r conftest
+   $RM conftest*
+])
+_LT_TAGDECL([compiler_c_o], [lt_cv_prog_compiler_c_o], [1],
+	[Does compiler simultaneously support -c and -o options?])
+])# _LT_COMPILER_C_O
+
+
+# _LT_COMPILER_FILE_LOCKS([TAGNAME])
+# ----------------------------------
+# Check to see if we can do hard links to lock some files if needed
+m4_defun([_LT_COMPILER_FILE_LOCKS],
+[m4_require([_LT_ENABLE_LOCK])dnl
+m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+_LT_COMPILER_C_O([$1])
+
+hard_links="nottested"
+if test "$_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)" = no && test "$need_locks" != no; then
+  # do not overwrite the value of need_locks provided by the user
+  AC_MSG_CHECKING([if we can lock with hard links])
+  hard_links=yes
+  $RM conftest*
+  ln conftest.a conftest.b 2>/dev/null && hard_links=no
+  touch conftest.a
+  ln conftest.a conftest.b 2>&5 || hard_links=no
+  ln conftest.a conftest.b 2>/dev/null && hard_links=no
+  AC_MSG_RESULT([$hard_links])
+  if test "$hard_links" = no; then
+    AC_MSG_WARN([`$CC' does not support `-c -o', so `make -j' may be unsafe])
+    need_locks=warn
+  fi
+else
+  need_locks=no
+fi
+_LT_DECL([], [need_locks], [1], [Must we lock files when doing compilation?])
+])# _LT_COMPILER_FILE_LOCKS
+
+
+# _LT_CHECK_OBJDIR
+# ----------------
+m4_defun([_LT_CHECK_OBJDIR],
+[AC_CACHE_CHECK([for objdir], [lt_cv_objdir],
+[rm -f .libs 2>/dev/null
+mkdir .libs 2>/dev/null
+if test -d .libs; then
+  lt_cv_objdir=.libs
+else
+  # MS-DOS does not allow filenames that begin with a dot.
+  lt_cv_objdir=_libs
+fi
+rmdir .libs 2>/dev/null])
+objdir=$lt_cv_objdir
+_LT_DECL([], [objdir], [0],
+         [The name of the directory that contains temporary libtool files])dnl
+m4_pattern_allow([LT_OBJDIR])dnl
+AC_DEFINE_UNQUOTED(LT_OBJDIR, "$lt_cv_objdir/",
+  [Define to the sub-directory in which libtool stores uninstalled libraries.])
+])# _LT_CHECK_OBJDIR
+
+
+# _LT_LINKER_HARDCODE_LIBPATH([TAGNAME])
+# --------------------------------------
+# Check hardcoding attributes.
+m4_defun([_LT_LINKER_HARDCODE_LIBPATH],
+[AC_MSG_CHECKING([how to hardcode library paths into programs])
+_LT_TAGVAR(hardcode_action, $1)=
+if test -n "$_LT_TAGVAR(hardcode_libdir_flag_spec, $1)" ||
+   test -n "$_LT_TAGVAR(runpath_var, $1)" ||
+   test "X$_LT_TAGVAR(hardcode_automatic, $1)" = "Xyes" ; then
+
+  # We can hardcode non-existent directories.
+  if test "$_LT_TAGVAR(hardcode_direct, $1)" != no &&
+     # If the only mechanism to avoid hardcoding is shlibpath_var, we
+     # have to relink, otherwise we might link with an installed library
+     # when we should be linking with a yet-to-be-installed one
+     ## test "$_LT_TAGVAR(hardcode_shlibpath_var, $1)" != no &&
+     test "$_LT_TAGVAR(hardcode_minus_L, $1)" != no; then
+    # Linking always hardcodes the temporary library directory.
+    _LT_TAGVAR(hardcode_action, $1)=relink
+  else
+    # We can link without hardcoding, and we can hardcode nonexisting dirs.
+    _LT_TAGVAR(hardcode_action, $1)=immediate
+  fi
+else
+  # We cannot hardcode anything, or else we can only hardcode existing
+  # directories.
+  _LT_TAGVAR(hardcode_action, $1)=unsupported
+fi
+AC_MSG_RESULT([$_LT_TAGVAR(hardcode_action, $1)])
+
+if test "$_LT_TAGVAR(hardcode_action, $1)" = relink ||
+   test "$_LT_TAGVAR(inherit_rpath, $1)" = yes; then
+  # Fast installation is not supported
+  enable_fast_install=no
+elif test "$shlibpath_overrides_runpath" = yes ||
+     test "$enable_shared" = no; then
+  # Fast installation is not necessary
+  enable_fast_install=needless
+fi
+_LT_TAGDECL([], [hardcode_action], [0],
+    [How to hardcode a shared library path into an executable])
+])# _LT_LINKER_HARDCODE_LIBPATH
+
+
+# _LT_CMD_STRIPLIB
+# ----------------
+m4_defun([_LT_CMD_STRIPLIB],
+[m4_require([_LT_DECL_EGREP])
+striplib=
+old_striplib=
+AC_MSG_CHECKING([whether stripping libraries is possible])
+if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then
+  test -z "$old_striplib" && old_striplib="$STRIP --strip-debug"
+  test -z "$striplib" && striplib="$STRIP --strip-unneeded"
+  AC_MSG_RESULT([yes])
+else
+# FIXME - insert some real tests, host_os isn't really good enough
+  case $host_os in
+  darwin*)
+    if test -n "$STRIP" ; then
+      striplib="$STRIP -x"
+      old_striplib="$STRIP -S"
+      AC_MSG_RESULT([yes])
+    else
+      AC_MSG_RESULT([no])
+    fi
+    ;;
+  *)
+    AC_MSG_RESULT([no])
+    ;;
+  esac
+fi
+_LT_DECL([], [old_striplib], [1], [Commands to strip libraries])
+_LT_DECL([], [striplib], [1])
+])# _LT_CMD_STRIPLIB
+
+
+# _LT_SYS_DYNAMIC_LINKER([TAG])
+# -----------------------------
+# PORTME Fill in your ld.so characteristics
+m4_defun([_LT_SYS_DYNAMIC_LINKER],
+[AC_REQUIRE([AC_CANONICAL_HOST])dnl
+m4_require([_LT_DECL_EGREP])dnl
+m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+m4_require([_LT_DECL_OBJDUMP])dnl
+m4_require([_LT_DECL_SED])dnl
+m4_require([_LT_CHECK_SHELL_FEATURES])dnl
+AC_MSG_CHECKING([dynamic linker characteristics])
+m4_if([$1],
+	[], [
+if test "$GCC" = yes; then
+  case $host_os in
+    darwin*) lt_awk_arg="/^libraries:/,/LR/" ;;
+    *) lt_awk_arg="/^libraries:/" ;;
+  esac
+  case $host_os in
+    mingw* | cegcc*) lt_sed_strip_eq="s,=\([[A-Za-z]]:\),\1,g" ;;
+    *) lt_sed_strip_eq="s,=/,/,g" ;;
+  esac
+  lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq`
+  case $lt_search_path_spec in
+  *\;*)
+    # if the path contains ";" then we assume it to be the separator
+    # otherwise default to the standard path separator (i.e. ":") - it is
+    # assumed that no part of a normal pathname contains ";" but that should
+    # okay in the real world where ";" in dirpaths is itself problematic.
+    lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'`
+    ;;
+  *)
+    lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"`
+    ;;
+  esac
+  # Ok, now we have the path, separated by spaces, we can step through it
+  # and add multilib dir if necessary.
+  lt_tmp_lt_search_path_spec=
+  lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null`
+  for lt_sys_path in $lt_search_path_spec; do
+    if test -d "$lt_sys_path/$lt_multi_os_dir"; then
+      lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir"
+    else
+      test -d "$lt_sys_path" && \
+	lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path"
+    fi
+  done
+  lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk '
+BEGIN {RS=" "; FS="/|\n";} {
+  lt_foo="";
+  lt_count=0;
+  for (lt_i = NF; lt_i > 0; lt_i--) {
+    if ($lt_i != "" && $lt_i != ".") {
+      if ($lt_i == "..") {
+        lt_count++;
+      } else {
+        if (lt_count == 0) {
+          lt_foo="/" $lt_i lt_foo;
+        } else {
+          lt_count--;
+        }
+      }
+    }
+  }
+  if (lt_foo != "") { lt_freq[[lt_foo]]++; }
+  if (lt_freq[[lt_foo]] == 1) { print lt_foo; }
+}'`
+  # AWK program above erroneously prepends '/' to C:/dos/paths
+  # for these hosts.
+  case $host_os in
+    mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\
+      $SED 's,/\([[A-Za-z]]:\),\1,g'` ;;
+  esac
+  sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP`
+else
+  sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
+fi])
+library_names_spec=
+libname_spec='lib$name'
+soname_spec=
+shrext_cmds=".so"
+postinstall_cmds=
+postuninstall_cmds=
+finish_cmds=
+finish_eval=
+shlibpath_var=
+shlibpath_overrides_runpath=unknown
+version_type=none
+dynamic_linker="$host_os ld.so"
+sys_lib_dlsearch_path_spec="/lib /usr/lib"
+need_lib_prefix=unknown
+hardcode_into_libs=no
+
+# when you set need_version to no, make sure it does not cause -set_version
+# flags to be left without arguments
+need_version=unknown
+
+case $host_os in
+aix3*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a'
+  shlibpath_var=LIBPATH
+
+  # AIX 3 has no versioning support, so we append a major version to the name.
+  soname_spec='${libname}${release}${shared_ext}$major'
+  ;;
+
+aix[[4-9]]*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  hardcode_into_libs=yes
+  if test "$host_cpu" = ia64; then
+    # AIX 5 supports IA64
+    library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}'
+    shlibpath_var=LD_LIBRARY_PATH
+  else
+    # With GCC up to 2.95.x, collect2 would create an import file
+    # for dependence libraries.  The import file would start with
+    # the line `#! .'.  This would cause the generated library to
+    # depend on `.', always an invalid library.  This was fixed in
+    # development snapshots of GCC prior to 3.0.
+    case $host_os in
+      aix4 | aix4.[[01]] | aix4.[[01]].*)
+      if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'
+	   echo ' yes '
+	   echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then
+	:
+      else
+	can_build_shared=no
+      fi
+      ;;
+    esac
+    # AIX (on Power*) has no versioning support, so currently we can not hardcode correct
+    # soname into executable. Probably we can add versioning support to
+    # collect2, so additional links can be useful in future.
+    if test "$aix_use_runtimelinking" = yes; then
+      # If using run time linking (on AIX 4.2 or later) use lib<name>.so
+      # instead of lib<name>.a to let people know that these are not
+      # typical AIX shared libraries.
+      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    else
+      # We preserve .a as extension for shared libraries through AIX4.2
+      # and later when we are not doing run time linking.
+      library_names_spec='${libname}${release}.a $libname.a'
+      soname_spec='${libname}${release}${shared_ext}$major'
+    fi
+    shlibpath_var=LIBPATH
+  fi
+  ;;
+
+amigaos*)
+  case $host_cpu in
+  powerpc)
+    # Since July 2007 AmigaOS4 officially supports .so libraries.
+    # When compiling the executable, add -use-dynld -Lsobjs: to the compileline.
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    ;;
+  m68k)
+    library_names_spec='$libname.ixlibrary $libname.a'
+    # Create ${libname}_ixlibrary.a entries in /sys/libs.
+    finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
+    ;;
+  esac
+  ;;
+
+beos*)
+  library_names_spec='${libname}${shared_ext}'
+  dynamic_linker="$host_os ld.so"
+  shlibpath_var=LIBRARY_PATH
+  ;;
+
+bsdi[[45]]*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib"
+  sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib"
+  # the default ld.so.conf also contains /usr/contrib/lib and
+  # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow
+  # libtool to hard-code these into programs
+  ;;
+
+cygwin* | mingw* | pw32* | cegcc*)
+  version_type=windows
+  shrext_cmds=".dll"
+  need_version=no
+  need_lib_prefix=no
+
+  case $GCC,$cc_basename in
+  yes,*)
+    # gcc
+    library_names_spec='$libname.dll.a'
+    # DLL is installed to $(libdir)/../bin by postinstall_cmds
+    postinstall_cmds='base_file=`basename \${file}`~
+      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~
+      dldir=$destdir/`dirname \$dlpath`~
+      test -d \$dldir || mkdir -p \$dldir~
+      $install_prog $dir/$dlname \$dldir/$dlname~
+      chmod a+x \$dldir/$dlname~
+      if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then
+        eval '\''$striplib \$dldir/$dlname'\'' || exit \$?;
+      fi'
+    postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
+      dlpath=$dir/\$dldll~
+       $RM \$dlpath'
+    shlibpath_overrides_runpath=yes
+
+    case $host_os in
+    cygwin*)
+      # Cygwin DLLs use 'cyg' prefix rather than 'lib'
+      soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}'
+m4_if([$1], [],[
+      sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api"])
+      ;;
+    mingw* | cegcc*)
+      # MinGW DLLs use traditional 'lib' prefix
+      soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}'
+      ;;
+    pw32*)
+      # pw32 DLLs use 'pw' prefix rather than 'lib'
+      library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}'
+      ;;
+    esac
+    dynamic_linker='Win32 ld.exe'
+    ;;
+
+  *,cl*)
+    # Native MSVC
+    libname_spec='$name'
+    soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}'
+    library_names_spec='${libname}.dll.lib'
+
+    case $build_os in
+    mingw*)
+      sys_lib_search_path_spec=
+      lt_save_ifs=$IFS
+      IFS=';'
+      for lt_path in $LIB
+      do
+        IFS=$lt_save_ifs
+        # Let DOS variable expansion print the short 8.3 style file name.
+        lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"`
+        sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path"
+      done
+      IFS=$lt_save_ifs
+      # Convert to MSYS style.
+      sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([[a-zA-Z]]\\):| /\\1|g' -e 's|^ ||'`
+      ;;
+    cygwin*)
+      # Convert to unix form, then to dos form, then back to unix form
+      # but this time dos style (no spaces!) so that the unix form looks
+      # like /cygdrive/c/PROGRA~1:/cygdr...
+      sys_lib_search_path_spec=`cygpath --path --unix "$LIB"`
+      sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null`
+      sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
+      ;;
+    *)
+      sys_lib_search_path_spec="$LIB"
+      if $ECHO "$sys_lib_search_path_spec" | [$GREP ';[c-zC-Z]:/' >/dev/null]; then
+        # It is most probably a Windows format PATH.
+        sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
+      else
+        sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
+      fi
+      # FIXME: find the short name or the path components, as spaces are
+      # common. (e.g. "Program Files" -> "PROGRA~1")
+      ;;
+    esac
+
+    # DLL is installed to $(libdir)/../bin by postinstall_cmds
+    postinstall_cmds='base_file=`basename \${file}`~
+      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i; echo \$dlname'\''`~
+      dldir=$destdir/`dirname \$dlpath`~
+      test -d \$dldir || mkdir -p \$dldir~
+      $install_prog $dir/$dlname \$dldir/$dlname'
+    postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
+      dlpath=$dir/\$dldll~
+       $RM \$dlpath'
+    shlibpath_overrides_runpath=yes
+    dynamic_linker='Win32 link.exe'
+    ;;
+
+  *)
+    # Assume MSVC wrapper
+    library_names_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext} $libname.lib'
+    dynamic_linker='Win32 ld.exe'
+    ;;
+  esac
+  # FIXME: first we should search . and the directory the executable is in
+  shlibpath_var=PATH
+  ;;
+
+darwin* | rhapsody*)
+  dynamic_linker="$host_os dyld"
+  version_type=darwin
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext'
+  soname_spec='${libname}${release}${major}$shared_ext'
+  shlibpath_overrides_runpath=yes
+  shlibpath_var=DYLD_LIBRARY_PATH
+  shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`'
+m4_if([$1], [],[
+  sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib"])
+  sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib'
+  ;;
+
+dgux*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  ;;
+
+freebsd* | dragonfly*)
+  # DragonFly does not have aout.  When/if they implement a new
+  # versioning mechanism, adjust this.
+  if test -x /usr/bin/objformat; then
+    objformat=`/usr/bin/objformat`
+  else
+    case $host_os in
+    freebsd[[23]].*) objformat=aout ;;
+    *) objformat=elf ;;
+    esac
+  fi
+  version_type=freebsd-$objformat
+  case $version_type in
+    freebsd-elf*)
+      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
+      need_version=no
+      need_lib_prefix=no
+      ;;
+    freebsd-*)
+      library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix'
+      need_version=yes
+      ;;
+  esac
+  shlibpath_var=LD_LIBRARY_PATH
+  case $host_os in
+  freebsd2.*)
+    shlibpath_overrides_runpath=yes
+    ;;
+  freebsd3.[[01]]* | freebsdelf3.[[01]]*)
+    shlibpath_overrides_runpath=yes
+    hardcode_into_libs=yes
+    ;;
+  freebsd3.[[2-9]]* | freebsdelf3.[[2-9]]* | \
+  freebsd4.[[0-5]] | freebsdelf4.[[0-5]] | freebsd4.1.1 | freebsdelf4.1.1)
+    shlibpath_overrides_runpath=no
+    hardcode_into_libs=yes
+    ;;
+  *) # from 4.6 on, and DragonFly
+    shlibpath_overrides_runpath=yes
+    hardcode_into_libs=yes
+    ;;
+  esac
+  ;;
+
+gnu*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  ;;
+
+haiku*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  dynamic_linker="$host_os runtime_loader"
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib'
+  hardcode_into_libs=yes
+  ;;
+
+hpux9* | hpux10* | hpux11*)
+  # Give a soname corresponding to the major version so that dld.sl refuses to
+  # link against other versions.
+  version_type=sunos
+  need_lib_prefix=no
+  need_version=no
+  case $host_cpu in
+  ia64*)
+    shrext_cmds='.so'
+    hardcode_into_libs=yes
+    dynamic_linker="$host_os dld.so"
+    shlibpath_var=LD_LIBRARY_PATH
+    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    if test "X$HPUX_IA64_MODE" = X32; then
+      sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib"
+    else
+      sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64"
+    fi
+    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+    ;;
+  hppa*64*)
+    shrext_cmds='.sl'
+    hardcode_into_libs=yes
+    dynamic_linker="$host_os dld.sl"
+    shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH
+    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64"
+    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+    ;;
+  *)
+    shrext_cmds='.sl'
+    dynamic_linker="$host_os dld.sl"
+    shlibpath_var=SHLIB_PATH
+    shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    ;;
+  esac
+  # HP-UX runs *really* slowly unless shared libraries are mode 555, ...
+  postinstall_cmds='chmod 555 $lib'
+  # or fails outright, so override atomically:
+  install_override_mode=555
+  ;;
+
+interix[[3-9]]*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  ;;
+
+irix5* | irix6* | nonstopux*)
+  case $host_os in
+    nonstopux*) version_type=nonstopux ;;
+    *)
+	if test "$lt_cv_prog_gnu_ld" = yes; then
+		version_type=linux # correct to gnu/linux during the next big refactor
+	else
+		version_type=irix
+	fi ;;
+  esac
+  need_lib_prefix=no
+  need_version=no
+  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}'
+  case $host_os in
+  irix5* | nonstopux*)
+    libsuff= shlibsuff=
+    ;;
+  *)
+    case $LD in # libtool.m4 will add one of these switches to LD
+    *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ")
+      libsuff= shlibsuff= libmagic=32-bit;;
+    *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ")
+      libsuff=32 shlibsuff=N32 libmagic=N32;;
+    *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ")
+      libsuff=64 shlibsuff=64 libmagic=64-bit;;
+    *) libsuff= shlibsuff= libmagic=never-match;;
+    esac
+    ;;
+  esac
+  shlibpath_var=LD_LIBRARY${shlibsuff}_PATH
+  shlibpath_overrides_runpath=no
+  sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}"
+  sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}"
+  hardcode_into_libs=yes
+  ;;
+
+# No shared lib support for Linux oldld, aout, or coff.
+linux*oldld* | linux*aout* | linux*coff*)
+  dynamic_linker=no
+  ;;
+
+# This must be glibc/ELF.
+linux* | k*bsd*-gnu | kopensolaris*-gnu)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+
+  # Some binutils ld are patched to set DT_RUNPATH
+  AC_CACHE_VAL([lt_cv_shlibpath_overrides_runpath],
+    [lt_cv_shlibpath_overrides_runpath=no
+    save_LDFLAGS=$LDFLAGS
+    save_libdir=$libdir
+    eval "libdir=/foo; wl=\"$_LT_TAGVAR(lt_prog_compiler_wl, $1)\"; \
+	 LDFLAGS=\"\$LDFLAGS $_LT_TAGVAR(hardcode_libdir_flag_spec, $1)\""
+    AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])],
+      [AS_IF([ ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null],
+	 [lt_cv_shlibpath_overrides_runpath=yes])])
+    LDFLAGS=$save_LDFLAGS
+    libdir=$save_libdir
+    ])
+  shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath
+
+  # This implies no fast_install, which is unacceptable.
+  # Some rework will be needed to allow for fast_install
+  # before this can be enabled.
+  hardcode_into_libs=yes
+
+  # Append ld.so.conf contents to the search path
+  if test -f /etc/ld.so.conf; then
+    lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \[$]2)); skip = 1; } { if (!skip) print \[$]0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[	 ]*hwcap[	 ]/d;s/[:,	]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '`
+    sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra"
+  fi
+
+  # We used to test for /lib/ld.so.1 and disable shared libraries on
+  # powerpc, because MkLinux only supported shared libraries with the
+  # GNU dynamic linker.  Since this was broken with cross compilers,
+  # most powerpc-linux boxes support dynamic linking these days and
+  # people can always --disable-shared, the test was removed, and we
+  # assume the GNU/Linux dynamic linker is in use.
+  dynamic_linker='GNU/Linux ld.so'
+  ;;
+
+netbsdelf*-gnu)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  dynamic_linker='NetBSD ld.elf_so'
+  ;;
+
+netbsd*)
+  version_type=sunos
+  need_lib_prefix=no
+  need_version=no
+  if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+    finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+    dynamic_linker='NetBSD (a.out) ld.so'
+  else
+    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+    soname_spec='${libname}${release}${shared_ext}$major'
+    dynamic_linker='NetBSD ld.elf_so'
+  fi
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  ;;
+
+newsos6)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  ;;
+
+*nto* | *qnx*)
+  version_type=qnx
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  dynamic_linker='ldqnx.so'
+  ;;
+
+openbsd*)
+  version_type=sunos
+  sys_lib_dlsearch_path_spec="/usr/lib"
+  need_lib_prefix=no
+  # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs.
+  case $host_os in
+    openbsd3.3 | openbsd3.3.*)	need_version=yes ;;
+    *)				need_version=no  ;;
+  esac
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+    case $host_os in
+      openbsd2.[[89]] | openbsd2.[[89]].*)
+	shlibpath_overrides_runpath=no
+	;;
+      *)
+	shlibpath_overrides_runpath=yes
+	;;
+      esac
+  else
+    shlibpath_overrides_runpath=yes
+  fi
+  ;;
+
+os2*)
+  libname_spec='$name'
+  shrext_cmds=".dll"
+  need_lib_prefix=no
+  library_names_spec='$libname${shared_ext} $libname.a'
+  dynamic_linker='OS/2 ld.exe'
+  shlibpath_var=LIBPATH
+  ;;
+
+osf3* | osf4* | osf5*)
+  version_type=osf
+  need_lib_prefix=no
+  need_version=no
+  soname_spec='${libname}${release}${shared_ext}$major'
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  shlibpath_var=LD_LIBRARY_PATH
+  sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib"
+  sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec"
+  ;;
+
+rdos*)
+  dynamic_linker=no
+  ;;
+
+solaris*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  # ldd complains unless libraries are executable
+  postinstall_cmds='chmod +x $lib'
+  ;;
+
+sunos4*)
+  version_type=sunos
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+  finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  if test "$with_gnu_ld" = yes; then
+    need_lib_prefix=no
+  fi
+  need_version=yes
+  ;;
+
+sysv4 | sysv4.3*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  case $host_vendor in
+    sni)
+      shlibpath_overrides_runpath=no
+      need_lib_prefix=no
+      runpath_var=LD_RUN_PATH
+      ;;
+    siemens)
+      need_lib_prefix=no
+      ;;
+    motorola)
+      need_lib_prefix=no
+      need_version=no
+      shlibpath_overrides_runpath=no
+      sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib'
+      ;;
+  esac
+  ;;
+
+sysv4*MP*)
+  if test -d /usr/nec ;then
+    version_type=linux # correct to gnu/linux during the next big refactor
+    library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}'
+    soname_spec='$libname${shared_ext}.$major'
+    shlibpath_var=LD_LIBRARY_PATH
+  fi
+  ;;
+
+sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
+  version_type=freebsd-elf
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  if test "$with_gnu_ld" = yes; then
+    sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib'
+  else
+    sys_lib_search_path_spec='/usr/ccs/lib /usr/lib'
+    case $host_os in
+      sco3.2v5*)
+        sys_lib_search_path_spec="$sys_lib_search_path_spec /lib"
+	;;
+    esac
+  fi
+  sys_lib_dlsearch_path_spec='/usr/lib'
+  ;;
+
+tpf*)
+  # TPF is a cross-target only.  Preferred cross-host = GNU/Linux.
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  ;;
+
+uts4*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  ;;
+
+*)
+  dynamic_linker=no
+  ;;
+esac
+AC_MSG_RESULT([$dynamic_linker])
+test "$dynamic_linker" = no && can_build_shared=no
+
+variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
+if test "$GCC" = yes; then
+  variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"
+fi
+
+if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then
+  sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec"
+fi
+if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then
+  sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec"
+fi
+
+_LT_DECL([], [variables_saved_for_relink], [1],
+    [Variables whose values should be saved in libtool wrapper scripts and
+    restored at link time])
+_LT_DECL([], [need_lib_prefix], [0],
+    [Do we need the "lib" prefix for modules?])
+_LT_DECL([], [need_version], [0], [Do we need a version for libraries?])
+_LT_DECL([], [version_type], [0], [Library versioning type])
+_LT_DECL([], [runpath_var], [0],  [Shared library runtime path variable])
+_LT_DECL([], [shlibpath_var], [0],[Shared library path variable])
+_LT_DECL([], [shlibpath_overrides_runpath], [0],
+    [Is shlibpath searched before the hard-coded library search path?])
+_LT_DECL([], [libname_spec], [1], [Format of library name prefix])
+_LT_DECL([], [library_names_spec], [1],
+    [[List of archive names.  First name is the real one, the rest are links.
+    The last name is the one that the linker finds with -lNAME]])
+_LT_DECL([], [soname_spec], [1],
+    [[The coded name of the library, if different from the real name]])
+_LT_DECL([], [install_override_mode], [1],
+    [Permission mode override for installation of shared libraries])
+_LT_DECL([], [postinstall_cmds], [2],
+    [Command to use after installation of a shared archive])
+_LT_DECL([], [postuninstall_cmds], [2],
+    [Command to use after uninstallation of a shared archive])
+_LT_DECL([], [finish_cmds], [2],
+    [Commands used to finish a libtool library installation in a directory])
+_LT_DECL([], [finish_eval], [1],
+    [[As "finish_cmds", except a single script fragment to be evaled but
+    not shown]])
+_LT_DECL([], [hardcode_into_libs], [0],
+    [Whether we should hardcode library paths into libraries])
+_LT_DECL([], [sys_lib_search_path_spec], [2],
+    [Compile-time system search path for libraries])
+_LT_DECL([], [sys_lib_dlsearch_path_spec], [2],
+    [Run-time system search path for libraries])
+])# _LT_SYS_DYNAMIC_LINKER
+
+
+# _LT_PATH_TOOL_PREFIX(TOOL)
+# --------------------------
+# find a file program which can recognize shared library
+AC_DEFUN([_LT_PATH_TOOL_PREFIX],
+[m4_require([_LT_DECL_EGREP])dnl
+AC_MSG_CHECKING([for $1])
+AC_CACHE_VAL(lt_cv_path_MAGIC_CMD,
+[case $MAGIC_CMD in
+[[\\/*] |  ?:[\\/]*])
+  lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path.
+  ;;
+*)
+  lt_save_MAGIC_CMD="$MAGIC_CMD"
+  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+dnl $ac_dummy forces splitting on constant user-supplied paths.
+dnl POSIX.2 word splitting is done only on the output of word expansions,
+dnl not every word.  This closes a longstanding sh security hole.
+  ac_dummy="m4_if([$2], , $PATH, [$2])"
+  for ac_dir in $ac_dummy; do
+    IFS="$lt_save_ifs"
+    test -z "$ac_dir" && ac_dir=.
+    if test -f $ac_dir/$1; then
+      lt_cv_path_MAGIC_CMD="$ac_dir/$1"
+      if test -n "$file_magic_test_file"; then
+	case $deplibs_check_method in
+	"file_magic "*)
+	  file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"`
+	  MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+	  if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
+	    $EGREP "$file_magic_regex" > /dev/null; then
+	    :
+	  else
+	    cat <<_LT_EOF 1>&2
+
+*** Warning: the command libtool uses to detect shared libraries,
+*** $file_magic_cmd, produces output that libtool cannot recognize.
+*** The result is that libtool may fail to recognize shared libraries
+*** as such.  This will affect the creation of libtool libraries that
+*** depend on shared libraries, but programs linked with such libtool
+*** libraries will work regardless of this problem.  Nevertheless, you
+*** may want to report the problem to your system manager and/or to
+*** bug-libtool at gnu.org
+
+_LT_EOF
+	  fi ;;
+	esac
+      fi
+      break
+    fi
+  done
+  IFS="$lt_save_ifs"
+  MAGIC_CMD="$lt_save_MAGIC_CMD"
+  ;;
+esac])
+MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+if test -n "$MAGIC_CMD"; then
+  AC_MSG_RESULT($MAGIC_CMD)
+else
+  AC_MSG_RESULT(no)
+fi
+_LT_DECL([], [MAGIC_CMD], [0],
+	 [Used to examine libraries when file_magic_cmd begins with "file"])dnl
+])# _LT_PATH_TOOL_PREFIX
+
+# Old name:
+AU_ALIAS([AC_PATH_TOOL_PREFIX], [_LT_PATH_TOOL_PREFIX])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_PATH_TOOL_PREFIX], [])
+
+
+# _LT_PATH_MAGIC
+# --------------
+# find a file program which can recognize a shared library
+m4_defun([_LT_PATH_MAGIC],
+[_LT_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin$PATH_SEPARATOR$PATH)
+if test -z "$lt_cv_path_MAGIC_CMD"; then
+  if test -n "$ac_tool_prefix"; then
+    _LT_PATH_TOOL_PREFIX(file, /usr/bin$PATH_SEPARATOR$PATH)
+  else
+    MAGIC_CMD=:
+  fi
+fi
+])# _LT_PATH_MAGIC
+
+
+# LT_PATH_LD
+# ----------
+# find the pathname to the GNU or non-GNU linker
+AC_DEFUN([LT_PATH_LD],
+[AC_REQUIRE([AC_PROG_CC])dnl
+AC_REQUIRE([AC_CANONICAL_HOST])dnl
+AC_REQUIRE([AC_CANONICAL_BUILD])dnl
+m4_require([_LT_DECL_SED])dnl
+m4_require([_LT_DECL_EGREP])dnl
+m4_require([_LT_PROG_ECHO_BACKSLASH])dnl
+
+AC_ARG_WITH([gnu-ld],
+    [AS_HELP_STRING([--with-gnu-ld],
+	[assume the C compiler uses GNU ld @<:@default=no@:>@])],
+    [test "$withval" = no || with_gnu_ld=yes],
+    [with_gnu_ld=no])dnl
+
+ac_prog=ld
+if test "$GCC" = yes; then
+  # Check if gcc -print-prog-name=ld gives a path.
+  AC_MSG_CHECKING([for ld used by $CC])
+  case $host in
+  *-*-mingw*)
+    # gcc leaves a trailing carriage return which upsets mingw
+    ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
+  *)
+    ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
+  esac
+  case $ac_prog in
+    # Accept absolute paths.
+    [[\\/]]* | ?:[[\\/]]*)
+      re_direlt='/[[^/]][[^/]]*/\.\./'
+      # Canonicalize the pathname of ld
+      ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'`
+      while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do
+	ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"`
+      done
+      test -z "$LD" && LD="$ac_prog"
+      ;;
+  "")
+    # If it fails, then pretend we aren't using GCC.
+    ac_prog=ld
+    ;;
+  *)
+    # If it is relative, then search for the first ld in PATH.
+    with_gnu_ld=unknown
+    ;;
+  esac
+elif test "$with_gnu_ld" = yes; then
+  AC_MSG_CHECKING([for GNU ld])
+else
+  AC_MSG_CHECKING([for non-GNU ld])
+fi
+AC_CACHE_VAL(lt_cv_path_LD,
+[if test -z "$LD"; then
+  lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+  for ac_dir in $PATH; do
+    IFS="$lt_save_ifs"
+    test -z "$ac_dir" && ac_dir=.
+    if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
+      lt_cv_path_LD="$ac_dir/$ac_prog"
+      # Check to see if the program is GNU ld.  I'd rather use --version,
+      # but apparently some variants of GNU ld only accept -v.
+      # Break only if it was the GNU/non-GNU ld that we prefer.
+      case `"$lt_cv_path_LD" -v 2>&1 </dev/null` in
+      *GNU* | *'with BFD'*)
+	test "$with_gnu_ld" != no && break
+	;;
+      *)
+	test "$with_gnu_ld" != yes && break
+	;;
+      esac
+    fi
+  done
+  IFS="$lt_save_ifs"
+else
+  lt_cv_path_LD="$LD" # Let the user override the test with a path.
+fi])
+LD="$lt_cv_path_LD"
+if test -n "$LD"; then
+  AC_MSG_RESULT($LD)
+else
+  AC_MSG_RESULT(no)
+fi
+test -z "$LD" && AC_MSG_ERROR([no acceptable ld found in \$PATH])
+_LT_PATH_LD_GNU
+AC_SUBST([LD])
+
+_LT_TAGDECL([], [LD], [1], [The linker used to build libraries])
+])# LT_PATH_LD
+
+# Old names:
+AU_ALIAS([AM_PROG_LD], [LT_PATH_LD])
+AU_ALIAS([AC_PROG_LD], [LT_PATH_LD])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AM_PROG_LD], [])
+dnl AC_DEFUN([AC_PROG_LD], [])
+
+
+# _LT_PATH_LD_GNU
+#- --------------
+m4_defun([_LT_PATH_LD_GNU],
+[AC_CACHE_CHECK([if the linker ($LD) is GNU ld], lt_cv_prog_gnu_ld,
+[# I'd rather use --version here, but apparently some GNU lds only accept -v.
+case `$LD -v 2>&1 </dev/null` in
+*GNU* | *'with BFD'*)
+  lt_cv_prog_gnu_ld=yes
+  ;;
+*)
+  lt_cv_prog_gnu_ld=no
+  ;;
+esac])
+with_gnu_ld=$lt_cv_prog_gnu_ld
+])# _LT_PATH_LD_GNU
+
+
+# _LT_CMD_RELOAD
+# --------------
+# find reload flag for linker
+#   -- PORTME Some linkers may need a different reload flag.
+m4_defun([_LT_CMD_RELOAD],
+[AC_CACHE_CHECK([for $LD option to reload object files],
+  lt_cv_ld_reload_flag,
+  [lt_cv_ld_reload_flag='-r'])
+reload_flag=$lt_cv_ld_reload_flag
+case $reload_flag in
+"" | " "*) ;;
+*) reload_flag=" $reload_flag" ;;
+esac
+reload_cmds='$LD$reload_flag -o $output$reload_objs'
+case $host_os in
+  cygwin* | mingw* | pw32* | cegcc*)
+    if test "$GCC" != yes; then
+      reload_cmds=false
+    fi
+    ;;
+  darwin*)
+    if test "$GCC" = yes; then
+      reload_cmds='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs'
+    else
+      reload_cmds='$LD$reload_flag -o $output$reload_objs'
+    fi
+    ;;
+esac
+_LT_TAGDECL([], [reload_flag], [1], [How to create reloadable object files])dnl
+_LT_TAGDECL([], [reload_cmds], [2])dnl
+])# _LT_CMD_RELOAD
+
+
+# _LT_CHECK_MAGIC_METHOD
+# ----------------------
+# how to check for library dependencies
+#  -- PORTME fill in with the dynamic library characteristics
+m4_defun([_LT_CHECK_MAGIC_METHOD],
+[m4_require([_LT_DECL_EGREP])
+m4_require([_LT_DECL_OBJDUMP])
+AC_CACHE_CHECK([how to recognize dependent libraries],
+lt_cv_deplibs_check_method,
+[lt_cv_file_magic_cmd='$MAGIC_CMD'
+lt_cv_file_magic_test_file=
+lt_cv_deplibs_check_method='unknown'
+# Need to set the preceding variable on all platforms that support
+# interlibrary dependencies.
+# 'none' -- dependencies not supported.
+# `unknown' -- same as none, but documents that we really don't know.
+# 'pass_all' -- all dependencies passed with no checks.
+# 'test_compile' -- check by making test program.
+# 'file_magic [[regex]]' -- check by looking for files in library path
+# which responds to the $file_magic_cmd with a given extended regex.
+# If you have `file' or equivalent on your system and you're not sure
+# whether `pass_all' will *always* work, you probably want this one.
+
+case $host_os in
+aix[[4-9]]*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+beos*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+bsdi[[45]]*)
+  lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib)'
+  lt_cv_file_magic_cmd='/usr/bin/file -L'
+  lt_cv_file_magic_test_file=/shlib/libc.so
+  ;;
+
+cygwin*)
+  # func_win32_libid is a shell function defined in ltmain.sh
+  lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
+  lt_cv_file_magic_cmd='func_win32_libid'
+  ;;
+
+mingw* | pw32*)
+  # Base MSYS/MinGW do not provide the 'file' command needed by
+  # func_win32_libid shell function, so use a weaker test based on 'objdump',
+  # unless we find 'file', for example because we are cross-compiling.
+  # func_win32_libid assumes BSD nm, so disallow it if using MS dumpbin.
+  if ( test "$lt_cv_nm_interface" = "BSD nm" && file / ) >/dev/null 2>&1; then
+    lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
+    lt_cv_file_magic_cmd='func_win32_libid'
+  else
+    # Keep this pattern in sync with the one in func_win32_libid.
+    lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)'
+    lt_cv_file_magic_cmd='$OBJDUMP -f'
+  fi
+  ;;
+
+cegcc*)
+  # use the weaker test based on 'objdump'. See mingw*.
+  lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?'
+  lt_cv_file_magic_cmd='$OBJDUMP -f'
+  ;;
+
+darwin* | rhapsody*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+freebsd* | dragonfly*)
+  if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then
+    case $host_cpu in
+    i*86 )
+      # Not sure whether the presence of OpenBSD here was a mistake.
+      # Let's accept both of them until this is cleared up.
+      lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[[3-9]]86 (compact )?demand paged shared library'
+      lt_cv_file_magic_cmd=/usr/bin/file
+      lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*`
+      ;;
+    esac
+  else
+    lt_cv_deplibs_check_method=pass_all
+  fi
+  ;;
+
+gnu*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+haiku*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+hpux10.20* | hpux11*)
+  lt_cv_file_magic_cmd=/usr/bin/file
+  case $host_cpu in
+  ia64*)
+    lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|ELF-[[0-9]][[0-9]]) shared object file - IA64'
+    lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so
+    ;;
+  hppa*64*)
+    [lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]']
+    lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl
+    ;;
+  *)
+    lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|PA-RISC[[0-9]]\.[[0-9]]) shared library'
+    lt_cv_file_magic_test_file=/usr/lib/libc.sl
+    ;;
+  esac
+  ;;
+
+interix[[3-9]]*)
+  # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here
+  lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|\.a)$'
+  ;;
+
+irix5* | irix6* | nonstopux*)
+  case $LD in
+  *-32|*"-32 ") libmagic=32-bit;;
+  *-n32|*"-n32 ") libmagic=N32;;
+  *-64|*"-64 ") libmagic=64-bit;;
+  *) libmagic=never-match;;
+  esac
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+# This must be glibc/ELF.
+linux* | k*bsd*-gnu | kopensolaris*-gnu)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+netbsd* | netbsdelf*-gnu)
+  if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then
+    lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$'
+  else
+    lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|_pic\.a)$'
+  fi
+  ;;
+
+newos6*)
+  lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (executable|dynamic lib)'
+  lt_cv_file_magic_cmd=/usr/bin/file
+  lt_cv_file_magic_test_file=/usr/lib/libnls.so
+  ;;
+
+*nto* | *qnx*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+openbsd*)
+  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+    lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|\.so|_pic\.a)$'
+  else
+    lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$'
+  fi
+  ;;
+
+osf3* | osf4* | osf5*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+rdos*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+solaris*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+sysv4 | sysv4.3*)
+  case $host_vendor in
+  motorola)
+    lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib) M[[0-9]][[0-9]]* Version [[0-9]]'
+    lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*`
+    ;;
+  ncr)
+    lt_cv_deplibs_check_method=pass_all
+    ;;
+  sequent)
+    lt_cv_file_magic_cmd='/bin/file'
+    lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )'
+    ;;
+  sni)
+    lt_cv_file_magic_cmd='/bin/file'
+    lt_cv_deplibs_check_method="file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB dynamic lib"
+    lt_cv_file_magic_test_file=/lib/libc.so
+    ;;
+  siemens)
+    lt_cv_deplibs_check_method=pass_all
+    ;;
+  pc)
+    lt_cv_deplibs_check_method=pass_all
+    ;;
+  esac
+  ;;
+
+tpf*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+esac
+])
+
+file_magic_glob=
+want_nocaseglob=no
+if test "$build" = "$host"; then
+  case $host_os in
+  mingw* | pw32*)
+    if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then
+      want_nocaseglob=yes
+    else
+      file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[[\1]]\/[[\1]]\/g;/g"`
+    fi
+    ;;
+  esac
+fi
+
+file_magic_cmd=$lt_cv_file_magic_cmd
+deplibs_check_method=$lt_cv_deplibs_check_method
+test -z "$deplibs_check_method" && deplibs_check_method=unknown
+
+_LT_DECL([], [deplibs_check_method], [1],
+    [Method to check whether dependent libraries are shared objects])
+_LT_DECL([], [file_magic_cmd], [1],
+    [Command to use when deplibs_check_method = "file_magic"])
+_LT_DECL([], [file_magic_glob], [1],
+    [How to find potential files when deplibs_check_method = "file_magic"])
+_LT_DECL([], [want_nocaseglob], [1],
+    [Find potential files using nocaseglob when deplibs_check_method = "file_magic"])
+])# _LT_CHECK_MAGIC_METHOD
+
+
+# LT_PATH_NM
+# ----------
+# find the pathname to a BSD- or MS-compatible name lister
+AC_DEFUN([LT_PATH_NM],
+[AC_REQUIRE([AC_PROG_CC])dnl
+AC_CACHE_CHECK([for BSD- or MS-compatible name lister (nm)], lt_cv_path_NM,
+[if test -n "$NM"; then
+  # Let the user override the test.
+  lt_cv_path_NM="$NM"
+else
+  lt_nm_to_check="${ac_tool_prefix}nm"
+  if test -n "$ac_tool_prefix" && test "$build" = "$host"; then
+    lt_nm_to_check="$lt_nm_to_check nm"
+  fi
+  for lt_tmp_nm in $lt_nm_to_check; do
+    lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+    for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do
+      IFS="$lt_save_ifs"
+      test -z "$ac_dir" && ac_dir=.
+      tmp_nm="$ac_dir/$lt_tmp_nm"
+      if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then
+	# Check to see if the nm accepts a BSD-compat flag.
+	# Adding the `sed 1q' prevents false positives on HP-UX, which says:
+	#   nm: unknown option "B" ignored
+	# Tru64's nm complains that /dev/null is an invalid object file
+	case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in
+	*/dev/null* | *'Invalid file or object type'*)
+	  lt_cv_path_NM="$tmp_nm -B"
+	  break
+	  ;;
+	*)
+	  case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in
+	  */dev/null*)
+	    lt_cv_path_NM="$tmp_nm -p"
+	    break
+	    ;;
+	  *)
+	    lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but
+	    continue # so that we can try to find one that supports BSD flags
+	    ;;
+	  esac
+	  ;;
+	esac
+      fi
+    done
+    IFS="$lt_save_ifs"
+  done
+  : ${lt_cv_path_NM=no}
+fi])
+if test "$lt_cv_path_NM" != "no"; then
+  NM="$lt_cv_path_NM"
+else
+  # Didn't find any BSD compatible name lister, look for dumpbin.
+  if test -n "$DUMPBIN"; then :
+    # Let the user override the test.
+  else
+    AC_CHECK_TOOLS(DUMPBIN, [dumpbin "link -dump"], :)
+    case `$DUMPBIN -symbols /dev/null 2>&1 | sed '1q'` in
+    *COFF*)
+      DUMPBIN="$DUMPBIN -symbols"
+      ;;
+    *)
+      DUMPBIN=:
+      ;;
+    esac
+  fi
+  AC_SUBST([DUMPBIN])
+  if test "$DUMPBIN" != ":"; then
+    NM="$DUMPBIN"
+  fi
+fi
+test -z "$NM" && NM=nm
+AC_SUBST([NM])
+_LT_DECL([], [NM], [1], [A BSD- or MS-compatible name lister])dnl
+
+AC_CACHE_CHECK([the name lister ($NM) interface], [lt_cv_nm_interface],
+  [lt_cv_nm_interface="BSD nm"
+  echo "int some_variable = 0;" > conftest.$ac_ext
+  (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&AS_MESSAGE_LOG_FD)
+  (eval "$ac_compile" 2>conftest.err)
+  cat conftest.err >&AS_MESSAGE_LOG_FD
+  (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&AS_MESSAGE_LOG_FD)
+  (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out)
+  cat conftest.err >&AS_MESSAGE_LOG_FD
+  (eval echo "\"\$as_me:$LINENO: output\"" >&AS_MESSAGE_LOG_FD)
+  cat conftest.out >&AS_MESSAGE_LOG_FD
+  if $GREP 'External.*some_variable' conftest.out > /dev/null; then
+    lt_cv_nm_interface="MS dumpbin"
+  fi
+  rm -f conftest*])
+])# LT_PATH_NM
+
+# Old names:
+AU_ALIAS([AM_PROG_NM], [LT_PATH_NM])
+AU_ALIAS([AC_PROG_NM], [LT_PATH_NM])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AM_PROG_NM], [])
+dnl AC_DEFUN([AC_PROG_NM], [])
+
+# _LT_CHECK_SHAREDLIB_FROM_LINKLIB
+# --------------------------------
+# how to determine the name of the shared library
+# associated with a specific link library.
+#  -- PORTME fill in with the dynamic library characteristics
+m4_defun([_LT_CHECK_SHAREDLIB_FROM_LINKLIB],
+[m4_require([_LT_DECL_EGREP])
+m4_require([_LT_DECL_OBJDUMP])
+m4_require([_LT_DECL_DLLTOOL])
+AC_CACHE_CHECK([how to associate runtime and link libraries],
+lt_cv_sharedlib_from_linklib_cmd,
+[lt_cv_sharedlib_from_linklib_cmd='unknown'
+
+case $host_os in
+cygwin* | mingw* | pw32* | cegcc*)
+  # two different shell functions defined in ltmain.sh
+  # decide which to use based on capabilities of $DLLTOOL
+  case `$DLLTOOL --help 2>&1` in
+  *--identify-strict*)
+    lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib
+    ;;
+  *)
+    lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback
+    ;;
+  esac
+  ;;
+*)
+  # fallback: assume linklib IS sharedlib
+  lt_cv_sharedlib_from_linklib_cmd="$ECHO"
+  ;;
+esac
+])
+sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd
+test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO
+
+_LT_DECL([], [sharedlib_from_linklib_cmd], [1],
+    [Command to associate shared and link libraries])
+])# _LT_CHECK_SHAREDLIB_FROM_LINKLIB
+
+
+# _LT_PATH_MANIFEST_TOOL
+# ----------------------
+# locate the manifest tool
+m4_defun([_LT_PATH_MANIFEST_TOOL],
+[AC_CHECK_TOOL(MANIFEST_TOOL, mt, :)
+test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt
+AC_CACHE_CHECK([if $MANIFEST_TOOL is a manifest tool], [lt_cv_path_mainfest_tool],
+  [lt_cv_path_mainfest_tool=no
+  echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&AS_MESSAGE_LOG_FD
+  $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out
+  cat conftest.err >&AS_MESSAGE_LOG_FD
+  if $GREP 'Manifest Tool' conftest.out > /dev/null; then
+    lt_cv_path_mainfest_tool=yes
+  fi
+  rm -f conftest*])
+if test "x$lt_cv_path_mainfest_tool" != xyes; then
+  MANIFEST_TOOL=:
+fi
+_LT_DECL([], [MANIFEST_TOOL], [1], [Manifest tool])dnl
+])# _LT_PATH_MANIFEST_TOOL
+
+
+# LT_LIB_M
+# --------
+# check for math library
+AC_DEFUN([LT_LIB_M],
+[AC_REQUIRE([AC_CANONICAL_HOST])dnl
+LIBM=
+case $host in
+*-*-beos* | *-*-cegcc* | *-*-cygwin* | *-*-haiku* | *-*-pw32* | *-*-darwin*)
+  # These system don't have libm, or don't need it
+  ;;
+*-ncr-sysv4.3*)
+  AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM="-lmw")
+  AC_CHECK_LIB(m, cos, LIBM="$LIBM -lm")
+  ;;
+*)
+  AC_CHECK_LIB(m, cos, LIBM="-lm")
+  ;;
+esac
+AC_SUBST([LIBM])
+])# LT_LIB_M
+
+# Old name:
+AU_ALIAS([AC_CHECK_LIBM], [LT_LIB_M])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_CHECK_LIBM], [])
+
+
+# _LT_COMPILER_NO_RTTI([TAGNAME])
+# -------------------------------
+m4_defun([_LT_COMPILER_NO_RTTI],
+[m4_require([_LT_TAG_COMPILER])dnl
+
+_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=
+
+if test "$GCC" = yes; then
+  case $cc_basename in
+  nvcc*)
+    _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -Xcompiler -fno-builtin' ;;
+  *)
+    _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' ;;
+  esac
+
+  _LT_COMPILER_OPTION([if $compiler supports -fno-rtti -fno-exceptions],
+    lt_cv_prog_compiler_rtti_exceptions,
+    [-fno-rtti -fno-exceptions], [],
+    [_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)="$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) -fno-rtti -fno-exceptions"])
+fi
+_LT_TAGDECL([no_builtin_flag], [lt_prog_compiler_no_builtin_flag], [1],
+	[Compiler flag to turn off builtin functions])
+])# _LT_COMPILER_NO_RTTI
+
+
+# _LT_CMD_GLOBAL_SYMBOLS
+# ----------------------
+m4_defun([_LT_CMD_GLOBAL_SYMBOLS],
+[AC_REQUIRE([AC_CANONICAL_HOST])dnl
+AC_REQUIRE([AC_PROG_CC])dnl
+AC_REQUIRE([AC_PROG_AWK])dnl
+AC_REQUIRE([LT_PATH_NM])dnl
+AC_REQUIRE([LT_PATH_LD])dnl
+m4_require([_LT_DECL_SED])dnl
+m4_require([_LT_DECL_EGREP])dnl
+m4_require([_LT_TAG_COMPILER])dnl
+
+# Check for command to grab the raw symbol name followed by C symbol from nm.
+AC_MSG_CHECKING([command to parse $NM output from $compiler object])
+AC_CACHE_VAL([lt_cv_sys_global_symbol_pipe],
+[
+# These are sane defaults that work on at least a few old systems.
+# [They come from Ultrix.  What could be older than Ultrix?!! ;)]
+
+# Character class describing NM global symbol codes.
+symcode='[[BCDEGRST]]'
+
+# Regexp to match symbols that can be accessed directly from C.
+sympat='\([[_A-Za-z]][[_A-Za-z0-9]]*\)'
+
+# Define system-specific variables.
+case $host_os in
+aix*)
+  symcode='[[BCDT]]'
+  ;;
+cygwin* | mingw* | pw32* | cegcc*)
+  symcode='[[ABCDGISTW]]'
+  ;;
+hpux*)
+  if test "$host_cpu" = ia64; then
+    symcode='[[ABCDEGRST]]'
+  fi
+  ;;
+irix* | nonstopux*)
+  symcode='[[BCDEGRST]]'
+  ;;
+osf*)
+  symcode='[[BCDEGQRST]]'
+  ;;
+solaris*)
+  symcode='[[BDRT]]'
+  ;;
+sco3.2v5*)
+  symcode='[[DT]]'
+  ;;
+sysv4.2uw2*)
+  symcode='[[DT]]'
+  ;;
+sysv5* | sco5v6* | unixware* | OpenUNIX*)
+  symcode='[[ABDT]]'
+  ;;
+sysv4)
+  symcode='[[DFNSTU]]'
+  ;;
+esac
+
+# If we're using GNU nm, then use its standard symbol codes.
+case `$NM -V 2>&1` in
+*GNU* | *'with BFD'*)
+  symcode='[[ABCDGIRSTW]]' ;;
+esac
+
+# Transform an extracted symbol line into a proper C declaration.
+# Some systems (esp. on ia64) link data and code symbols differently,
+# so use this general approach.
+lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'"
+
+# Transform an extracted symbol line into symbol name and symbol address
+lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\)[[ ]]*$/  {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/  {\"\2\", (void *) \&\2},/p'"
+lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n -e 's/^: \([[^ ]]*\)[[ ]]*$/  {\\\"\1\\\", (void *) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \(lib[[^ ]]*\)$/  {\"\2\", (void *) \&\2},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/  {\"lib\2\", (void *) \&\2},/p'"
+
+# Handle CRLF in mingw tool chain
+opt_cr=
+case $build_os in
+mingw*)
+  opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp
+  ;;
+esac
+
+# Try without a prefix underscore, then with it.
+for ac_symprfx in "" "_"; do
+
+  # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol.
+  symxfrm="\\1 $ac_symprfx\\2 \\2"
+
+  # Write the raw and C identifiers.
+  if test "$lt_cv_nm_interface" = "MS dumpbin"; then
+    # Fake it for dumpbin and say T for any non-static function
+    # and D for any global variable.
+    # Also find C++ and __fastcall symbols from MSVC++,
+    # which start with @ or ?.
+    lt_cv_sys_global_symbol_pipe="$AWK ['"\
+"     {last_section=section; section=\$ 3};"\
+"     /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\
+"     /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\
+"     \$ 0!~/External *\|/{next};"\
+"     / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\
+"     {if(hide[section]) next};"\
+"     {f=0}; \$ 0~/\(\).*\|/{f=1}; {printf f ? \"T \" : \"D \"};"\
+"     {split(\$ 0, a, /\||\r/); split(a[2], s)};"\
+"     s[1]~/^[@?]/{print s[1], s[1]; next};"\
+"     s[1]~prfx {split(s[1],t,\"@\"); print t[1], substr(t[1],length(prfx))}"\
+"     ' prfx=^$ac_symprfx]"
+  else
+    lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[	 ]]\($symcode$symcode*\)[[	 ]][[	 ]]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'"
+  fi
+  lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'"
+
+  # Check to see that the pipe works correctly.
+  pipe_works=no
+
+  rm -f conftest*
+  cat > conftest.$ac_ext <<_LT_EOF
+#ifdef __cplusplus
+extern "C" {
+#endif
+char nm_test_var;
+void nm_test_func(void);
+void nm_test_func(void){}
+#ifdef __cplusplus
+}
+#endif
+int main(){nm_test_var='a';nm_test_func();return(0);}
+_LT_EOF
+
+  if AC_TRY_EVAL(ac_compile); then
+    # Now try to grab the symbols.
+    nlist=conftest.nm
+    if AC_TRY_EVAL(NM conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist) && test -s "$nlist"; then
+      # Try sorting and uniquifying the output.
+      if sort "$nlist" | uniq > "$nlist"T; then
+	mv -f "$nlist"T "$nlist"
+      else
+	rm -f "$nlist"T
+      fi
+
+      # Make sure that we snagged all the symbols we need.
+      if $GREP ' nm_test_var$' "$nlist" >/dev/null; then
+	if $GREP ' nm_test_func$' "$nlist" >/dev/null; then
+	  cat <<_LT_EOF > conftest.$ac_ext
+/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests.  */
+#if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE)
+/* DATA imports from DLLs on WIN32 con't be const, because runtime
+   relocations are performed -- see ld's documentation on pseudo-relocs.  */
+# define LT@&t at _DLSYM_CONST
+#elif defined(__osf__)
+/* This system does not cope well with relocations in const data.  */
+# define LT@&t at _DLSYM_CONST
+#else
+# define LT@&t at _DLSYM_CONST const
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+_LT_EOF
+	  # Now generate the symbol file.
+	  eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext'
+
+	  cat <<_LT_EOF >> conftest.$ac_ext
+
+/* The mapping between symbol names and symbols.  */
+LT@&t at _DLSYM_CONST struct {
+  const char *name;
+  void       *address;
+}
+lt__PROGRAM__LTX_preloaded_symbols[[]] =
+{
+  { "@PROGRAM@", (void *) 0 },
+_LT_EOF
+	  $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/  {\"\2\", (void *) \&\2},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext
+	  cat <<\_LT_EOF >> conftest.$ac_ext
+  {0, (void *) 0}
+};
+
+/* This works around a problem in FreeBSD linker */
+#ifdef FREEBSD_WORKAROUND
+static const void *lt_preloaded_setup() {
+  return lt__PROGRAM__LTX_preloaded_symbols;
+}
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+_LT_EOF
+	  # Now try linking the two files.
+	  mv conftest.$ac_objext conftstm.$ac_objext
+	  lt_globsym_save_LIBS=$LIBS
+	  lt_globsym_save_CFLAGS=$CFLAGS
+	  LIBS="conftstm.$ac_objext"
+	  CFLAGS="$CFLAGS$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)"
+	  if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext}; then
+	    pipe_works=yes
+	  fi
+	  LIBS=$lt_globsym_save_LIBS
+	  CFLAGS=$lt_globsym_save_CFLAGS
+	else
+	  echo "cannot find nm_test_func in $nlist" >&AS_MESSAGE_LOG_FD
+	fi
+      else
+	echo "cannot find nm_test_var in $nlist" >&AS_MESSAGE_LOG_FD
+      fi
+    else
+      echo "cannot run $lt_cv_sys_global_symbol_pipe" >&AS_MESSAGE_LOG_FD
+    fi
+  else
+    echo "$progname: failed program was:" >&AS_MESSAGE_LOG_FD
+    cat conftest.$ac_ext >&5
+  fi
+  rm -rf conftest* conftst*
+
+  # Do not use the global_symbol_pipe unless it works.
+  if test "$pipe_works" = yes; then
+    break
+  else
+    lt_cv_sys_global_symbol_pipe=
+  fi
+done
+])
+if test -z "$lt_cv_sys_global_symbol_pipe"; then
+  lt_cv_sys_global_symbol_to_cdecl=
+fi
+if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then
+  AC_MSG_RESULT(failed)
+else
+  AC_MSG_RESULT(ok)
+fi
+
+# Response file support.
+if test "$lt_cv_nm_interface" = "MS dumpbin"; then
+  nm_file_list_spec='@'
+elif $NM --help 2>/dev/null | grep '[[@]]FILE' >/dev/null; then
+  nm_file_list_spec='@'
+fi
+
+_LT_DECL([global_symbol_pipe], [lt_cv_sys_global_symbol_pipe], [1],
+    [Take the output of nm and produce a listing of raw symbols and C names])
+_LT_DECL([global_symbol_to_cdecl], [lt_cv_sys_global_symbol_to_cdecl], [1],
+    [Transform the output of nm in a proper C declaration])
+_LT_DECL([global_symbol_to_c_name_address],
+    [lt_cv_sys_global_symbol_to_c_name_address], [1],
+    [Transform the output of nm in a C name address pair])
+_LT_DECL([global_symbol_to_c_name_address_lib_prefix],
+    [lt_cv_sys_global_symbol_to_c_name_address_lib_prefix], [1],
+    [Transform the output of nm in a C name address pair when lib prefix is needed])
+_LT_DECL([], [nm_file_list_spec], [1],
+    [Specify filename containing input files for $NM])
+]) # _LT_CMD_GLOBAL_SYMBOLS
+
+
+# _LT_COMPILER_PIC([TAGNAME])
+# ---------------------------
+m4_defun([_LT_COMPILER_PIC],
+[m4_require([_LT_TAG_COMPILER])dnl
+_LT_TAGVAR(lt_prog_compiler_wl, $1)=
+_LT_TAGVAR(lt_prog_compiler_pic, $1)=
+_LT_TAGVAR(lt_prog_compiler_static, $1)=
+
+m4_if([$1], [CXX], [
+  # C++ specific cases for pic, static, wl, etc.
+  if test "$GXX" = yes; then
+    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+    _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
+
+    case $host_os in
+    aix*)
+      # All AIX code is PIC.
+      if test "$host_cpu" = ia64; then
+	# AIX 5 now supports IA64 processor
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      fi
+      ;;
+
+    amigaos*)
+      case $host_cpu in
+      powerpc)
+            # see comment about AmigaOS4 .so support
+            _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+        ;;
+      m68k)
+            # FIXME: we need at least 68020 code to build shared libraries, but
+            # adding the `-m68020' flag to GCC prevents building anything better,
+            # like `-m68040'.
+            _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4'
+        ;;
+      esac
+      ;;
+
+    beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
+      # PIC is the default for these OSes.
+      ;;
+    mingw* | cygwin* | os2* | pw32* | cegcc*)
+      # This hack is so that the source file can tell whether it is being
+      # built for inclusion in a dll (and should export symbols for example).
+      # Although the cygwin gcc ignores -fPIC, still need this for old-style
+      # (--disable-auto-import) libraries
+      m4_if([$1], [GCJ], [],
+	[_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'])
+      ;;
+    darwin* | rhapsody*)
+      # PIC is the default on this platform
+      # Common symbols not allowed in MH_DYLIB files
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common'
+      ;;
+    *djgpp*)
+      # DJGPP does not support shared libraries at all
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)=
+      ;;
+    haiku*)
+      # PIC is the default for Haiku.
+      # The "-static" flag exists, but is broken.
+      _LT_TAGVAR(lt_prog_compiler_static, $1)=
+      ;;
+    interix[[3-9]]*)
+      # Interix 3.x gcc -fpic/-fPIC options generate broken code.
+      # Instead, we relocate shared libraries at runtime.
+      ;;
+    sysv4*MP*)
+      if test -d /usr/nec; then
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic
+      fi
+      ;;
+    hpux*)
+      # PIC is the default for 64-bit PA HP-UX, but not for 32-bit
+      # PA HP-UX.  On IA64 HP-UX, PIC is the default but the pic flag
+      # sets the default TLS model and affects inlining.
+      case $host_cpu in
+      hppa*64*)
+	;;
+      *)
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+	;;
+      esac
+      ;;
+    *qnx* | *nto*)
+      # QNX uses GNU C++, but need to define -shared option too, otherwise
+      # it will coredump.
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared'
+      ;;
+    *)
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+      ;;
+    esac
+  else
+    case $host_os in
+      aix[[4-9]]*)
+	# All AIX code is PIC.
+	if test "$host_cpu" = ia64; then
+	  # AIX 5 now supports IA64 processor
+	  _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	else
+	  _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp'
+	fi
+	;;
+      chorus*)
+	case $cc_basename in
+	cxch68*)
+	  # Green Hills C++ Compiler
+	  # _LT_TAGVAR(lt_prog_compiler_static, $1)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a"
+	  ;;
+	esac
+	;;
+      mingw* | cygwin* | os2* | pw32* | cegcc*)
+	# This hack is so that the source file can tell whether it is being
+	# built for inclusion in a dll (and should export symbols for example).
+	m4_if([$1], [GCJ], [],
+	  [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'])
+	;;
+      dgux*)
+	case $cc_basename in
+	  ec++*)
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	    ;;
+	  ghcx*)
+	    # Green Hills C++ Compiler
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      freebsd* | dragonfly*)
+	# FreeBSD uses GNU C++
+	;;
+      hpux9* | hpux10* | hpux11*)
+	case $cc_basename in
+	  CC*)
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive'
+	    if test "$host_cpu" != ia64; then
+	      _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z'
+	    fi
+	    ;;
+	  aCC*)
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive'
+	    case $host_cpu in
+	    hppa*64*|ia64*)
+	      # +Z the default
+	      ;;
+	    *)
+	      _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z'
+	      ;;
+	    esac
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      interix*)
+	# This is c89, which is MS Visual C++ (no shared libs)
+	# Anyone wants to do a port?
+	;;
+      irix5* | irix6* | nonstopux*)
+	case $cc_basename in
+	  CC*)
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+	    # CC pic flag -KPIC is the default.
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      linux* | k*bsd*-gnu | kopensolaris*-gnu)
+	case $cc_basename in
+	  KCC*)
+	    # KAI C++ Compiler
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,'
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+	    ;;
+	  ecpc* )
+	    # old Intel C++ for x86_64 which still supported -KPIC.
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
+	    ;;
+	  icpc* )
+	    # Intel C++, used to be incompatible with GCC.
+	    # ICC 10 doesn't accept -KPIC any more.
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
+	    ;;
+	  pgCC* | pgcpp*)
+	    # Portland Group C++ compiler
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic'
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	    ;;
+	  cxx*)
+	    # Compaq C++
+	    # Make sure the PIC flag is empty.  It appears that all Alpha
+	    # Linux and Compaq Tru64 Unix objects are PIC.
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)=
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+	    ;;
+	  xlc* | xlC* | bgxl[[cC]]* | mpixl[[cC]]*)
+	    # IBM XL 8.0, 9.0 on PPC and BlueGene
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic'
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink'
+	    ;;
+	  *)
+	    case `$CC -V 2>&1 | sed 5q` in
+	    *Sun\ C*)
+	      # Sun C++ 5.9
+	      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld '
+	      ;;
+	    esac
+	    ;;
+	esac
+	;;
+      lynxos*)
+	;;
+      m88k*)
+	;;
+      mvs*)
+	case $cc_basename in
+	  cxx*)
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-W c,exportall'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      netbsd* | netbsdelf*-gnu)
+	;;
+      *qnx* | *nto*)
+        # QNX uses GNU C++, but need to define -shared option too, otherwise
+        # it will coredump.
+        _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared'
+        ;;
+      osf3* | osf4* | osf5*)
+	case $cc_basename in
+	  KCC*)
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,'
+	    ;;
+	  RCC*)
+	    # Rational C++ 2.4.1
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
+	    ;;
+	  cxx*)
+	    # Digital/Compaq C++
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	    # Make sure the PIC flag is empty.  It appears that all Alpha
+	    # Linux and Compaq Tru64 Unix objects are PIC.
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)=
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      psos*)
+	;;
+      solaris*)
+	case $cc_basename in
+	  CC* | sunCC*)
+	    # Sun C++ 4.2, 5.x and Centerline C++
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld '
+	    ;;
+	  gcx*)
+	    # Green Hills C++ Compiler
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      sunos4*)
+	case $cc_basename in
+	  CC*)
+	    # Sun C++ 4.x
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	    ;;
+	  lcc*)
+	    # Lucid
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
+	case $cc_basename in
+	  CC*)
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	    ;;
+	esac
+	;;
+      tandem*)
+	case $cc_basename in
+	  NCC*)
+	    # NonStop-UX NCC 3.20
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      vxworks*)
+	;;
+      *)
+	_LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no
+	;;
+    esac
+  fi
+],
+[
+  if test "$GCC" = yes; then
+    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+    _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
+
+    case $host_os in
+      aix*)
+      # All AIX code is PIC.
+      if test "$host_cpu" = ia64; then
+	# AIX 5 now supports IA64 processor
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      fi
+      ;;
+
+    amigaos*)
+      case $host_cpu in
+      powerpc)
+            # see comment about AmigaOS4 .so support
+            _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+        ;;
+      m68k)
+            # FIXME: we need at least 68020 code to build shared libraries, but
+            # adding the `-m68020' flag to GCC prevents building anything better,
+            # like `-m68040'.
+            _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4'
+        ;;
+      esac
+      ;;
+
+    beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
+      # PIC is the default for these OSes.
+      ;;
+
+    mingw* | cygwin* | pw32* | os2* | cegcc*)
+      # This hack is so that the source file can tell whether it is being
+      # built for inclusion in a dll (and should export symbols for example).
+      # Although the cygwin gcc ignores -fPIC, still need this for old-style
+      # (--disable-auto-import) libraries
+      m4_if([$1], [GCJ], [],
+	[_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'])
+      ;;
+
+    darwin* | rhapsody*)
+      # PIC is the default on this platform
+      # Common symbols not allowed in MH_DYLIB files
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common'
+      ;;
+
+    haiku*)
+      # PIC is the default for Haiku.
+      # The "-static" flag exists, but is broken.
+      _LT_TAGVAR(lt_prog_compiler_static, $1)=
+      ;;
+
+    hpux*)
+      # PIC is the default for 64-bit PA HP-UX, but not for 32-bit
+      # PA HP-UX.  On IA64 HP-UX, PIC is the default but the pic flag
+      # sets the default TLS model and affects inlining.
+      case $host_cpu in
+      hppa*64*)
+	# +Z the default
+	;;
+      *)
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+	;;
+      esac
+      ;;
+
+    interix[[3-9]]*)
+      # Interix 3.x gcc -fpic/-fPIC options generate broken code.
+      # Instead, we relocate shared libraries at runtime.
+      ;;
+
+    msdosdjgpp*)
+      # Just because we use GCC doesn't mean we suddenly get shared libraries
+      # on systems that don't support them.
+      _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no
+      enable_shared=no
+      ;;
+
+    *nto* | *qnx*)
+      # QNX uses GNU C++, but need to define -shared option too, otherwise
+      # it will coredump.
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared'
+      ;;
+
+    sysv4*MP*)
+      if test -d /usr/nec; then
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic
+      fi
+      ;;
+
+    *)
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+      ;;
+    esac
+
+    case $cc_basename in
+    nvcc*) # Cuda Compiler Driver 2.2
+      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Xlinker '
+      if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then
+        _LT_TAGVAR(lt_prog_compiler_pic, $1)="-Xcompiler $_LT_TAGVAR(lt_prog_compiler_pic, $1)"
+      fi
+      ;;
+    esac
+  else
+    # PORTME Check for flag to pass linker flags through the system compiler.
+    case $host_os in
+    aix*)
+      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+      if test "$host_cpu" = ia64; then
+	# AIX 5 now supports IA64 processor
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      else
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp'
+      fi
+      ;;
+
+    mingw* | cygwin* | pw32* | os2* | cegcc*)
+      # This hack is so that the source file can tell whether it is being
+      # built for inclusion in a dll (and should export symbols for example).
+      m4_if([$1], [GCJ], [],
+	[_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'])
+      ;;
+
+    hpux9* | hpux10* | hpux11*)
+      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+      # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but
+      # not for PA HP-UX.
+      case $host_cpu in
+      hppa*64*|ia64*)
+	# +Z the default
+	;;
+      *)
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z'
+	;;
+      esac
+      # Is there a better lt_prog_compiler_static that works with the bundled CC?
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive'
+      ;;
+
+    irix5* | irix6* | nonstopux*)
+      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+      # PIC (with -KPIC) is the default.
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+      ;;
+
+    linux* | k*bsd*-gnu | kopensolaris*-gnu)
+      case $cc_basename in
+      # old Intel for x86_64 which still supported -KPIC.
+      ecc*)
+	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
+        ;;
+      # icc used to be incompatible with GCC.
+      # ICC 10 doesn't accept -KPIC any more.
+      icc* | ifort*)
+	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
+        ;;
+      # Lahey Fortran 8.1.
+      lf95*)
+	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)='--shared'
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='--static'
+	;;
+      nagfor*)
+	# NAG Fortran compiler
+	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,-Wl,,'
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC'
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	;;
+      pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*)
+        # Portland Group compilers (*not* the Pentium gcc compiler,
+	# which looks to be a dead project)
+	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic'
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+        ;;
+      ccc*)
+        _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+        # All Alpha code is PIC.
+        _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+        ;;
+      xl* | bgxl* | bgf* | mpixl*)
+	# IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene
+	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic'
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink'
+	;;
+      *)
+	case `$CC -V 2>&1 | sed 5q` in
+	*Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [[1-7]].* | *Sun*Fortran*\ 8.[[0-3]]*)
+	  # Sun Fortran 8.3 passes all unrecognized flags to the linker
+	  _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	  _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	  _LT_TAGVAR(lt_prog_compiler_wl, $1)=''
+	  ;;
+	*Sun\ F* | *Sun*Fortran*)
+	  _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	  _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	  _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld '
+	  ;;
+	*Sun\ C*)
+	  # Sun C 5.9
+	  _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	  _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	  _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	  ;;
+        *Intel*\ [[CF]]*Compiler*)
+	  _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	  _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+	  _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
+	  ;;
+	*Portland\ Group*)
+	  _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	  _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic'
+	  _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	  ;;
+	esac
+	;;
+      esac
+      ;;
+
+    newsos6)
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      ;;
+
+    *nto* | *qnx*)
+      # QNX uses GNU C++, but need to define -shared option too, otherwise
+      # it will coredump.
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared'
+      ;;
+
+    osf3* | osf4* | osf5*)
+      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+      # All OSF/1 code is PIC.
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+      ;;
+
+    rdos*)
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+      ;;
+
+    solaris*)
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      case $cc_basename in
+      f77* | f90* | f95* | sunf77* | sunf90* | sunf95*)
+	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ';;
+      *)
+	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,';;
+      esac
+      ;;
+
+    sunos4*)
+      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld '
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC'
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      ;;
+
+    sysv4 | sysv4.2uw2* | sysv4.3*)
+      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      ;;
+
+    sysv4*MP*)
+      if test -d /usr/nec ;then
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-Kconform_pic'
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      fi
+      ;;
+
+    sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
+      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      ;;
+
+    unicos*)
+      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+      _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no
+      ;;
+
+    uts4*)
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      ;;
+
+    *)
+      _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no
+      ;;
+    esac
+  fi
+])
+case $host_os in
+  # For platforms which do not support PIC, -DPIC is meaningless:
+  *djgpp*)
+    _LT_TAGVAR(lt_prog_compiler_pic, $1)=
+    ;;
+  *)
+    _LT_TAGVAR(lt_prog_compiler_pic, $1)="$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t at m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])"
+    ;;
+esac
+
+AC_CACHE_CHECK([for $compiler option to produce PIC],
+  [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)],
+  [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_prog_compiler_pic, $1)])
+_LT_TAGVAR(lt_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)
+
+#
+# Check to make sure the PIC flag actually works.
+#
+if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then
+  _LT_COMPILER_OPTION([if $compiler PIC flag $_LT_TAGVAR(lt_prog_compiler_pic, $1) works],
+    [_LT_TAGVAR(lt_cv_prog_compiler_pic_works, $1)],
+    [$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t at m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])], [],
+    [case $_LT_TAGVAR(lt_prog_compiler_pic, $1) in
+     "" | " "*) ;;
+     *) _LT_TAGVAR(lt_prog_compiler_pic, $1)=" $_LT_TAGVAR(lt_prog_compiler_pic, $1)" ;;
+     esac],
+    [_LT_TAGVAR(lt_prog_compiler_pic, $1)=
+     _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no])
+fi
+_LT_TAGDECL([pic_flag], [lt_prog_compiler_pic], [1],
+	[Additional compiler flags for building library objects])
+
+_LT_TAGDECL([wl], [lt_prog_compiler_wl], [1],
+	[How to pass a linker flag through the compiler])
+#
+# Check to make sure the static flag actually works.
+#
+wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) eval lt_tmp_static_flag=\"$_LT_TAGVAR(lt_prog_compiler_static, $1)\"
+_LT_LINKER_OPTION([if $compiler static flag $lt_tmp_static_flag works],
+  _LT_TAGVAR(lt_cv_prog_compiler_static_works, $1),
+  $lt_tmp_static_flag,
+  [],
+  [_LT_TAGVAR(lt_prog_compiler_static, $1)=])
+_LT_TAGDECL([link_static_flag], [lt_prog_compiler_static], [1],
+	[Compiler flag to prevent dynamic linking])
+])# _LT_COMPILER_PIC
+
+
+# _LT_LINKER_SHLIBS([TAGNAME])
+# ----------------------------
+# See if the linker supports building shared libraries.
+m4_defun([_LT_LINKER_SHLIBS],
+[AC_REQUIRE([LT_PATH_LD])dnl
+AC_REQUIRE([LT_PATH_NM])dnl
+m4_require([_LT_PATH_MANIFEST_TOOL])dnl
+m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+m4_require([_LT_DECL_EGREP])dnl
+m4_require([_LT_DECL_SED])dnl
+m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl
+m4_require([_LT_TAG_COMPILER])dnl
+AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries])
+m4_if([$1], [CXX], [
+  _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+  _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*']
+  case $host_os in
+  aix[[4-9]]*)
+    # If we're using GNU nm, then we don't want the "-C" option.
+    # -C means demangle to AIX nm, but means don't demangle with GNU nm
+    # Also, AIX nm treats weak defined symbols like other global defined
+    # symbols, whereas GNU nm marks them as "W".
+    if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then
+      _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
+    else
+      _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
+    fi
+    ;;
+  pw32*)
+    _LT_TAGVAR(export_symbols_cmds, $1)="$ltdll_cmds"
+    ;;
+  cygwin* | mingw* | cegcc*)
+    case $cc_basename in
+    cl*)
+      _LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*'
+      ;;
+    *)
+      _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols'
+      _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname']
+      ;;
+    esac
+    ;;
+  linux* | k*bsd*-gnu | gnu*)
+    _LT_TAGVAR(link_all_deplibs, $1)=no
+    ;;
+  *)
+    _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+    ;;
+  esac
+], [
+  runpath_var=
+  _LT_TAGVAR(allow_undefined_flag, $1)=
+  _LT_TAGVAR(always_export_symbols, $1)=no
+  _LT_TAGVAR(archive_cmds, $1)=
+  _LT_TAGVAR(archive_expsym_cmds, $1)=
+  _LT_TAGVAR(compiler_needs_object, $1)=no
+  _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no
+  _LT_TAGVAR(export_dynamic_flag_spec, $1)=
+  _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+  _LT_TAGVAR(hardcode_automatic, $1)=no
+  _LT_TAGVAR(hardcode_direct, $1)=no
+  _LT_TAGVAR(hardcode_direct_absolute, $1)=no
+  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
+  _LT_TAGVAR(hardcode_libdir_separator, $1)=
+  _LT_TAGVAR(hardcode_minus_L, $1)=no
+  _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported
+  _LT_TAGVAR(inherit_rpath, $1)=no
+  _LT_TAGVAR(link_all_deplibs, $1)=unknown
+  _LT_TAGVAR(module_cmds, $1)=
+  _LT_TAGVAR(module_expsym_cmds, $1)=
+  _LT_TAGVAR(old_archive_from_new_cmds, $1)=
+  _LT_TAGVAR(old_archive_from_expsyms_cmds, $1)=
+  _LT_TAGVAR(thread_safe_flag_spec, $1)=
+  _LT_TAGVAR(whole_archive_flag_spec, $1)=
+  # include_expsyms should be a list of space-separated symbols to be *always*
+  # included in the symbol list
+  _LT_TAGVAR(include_expsyms, $1)=
+  # exclude_expsyms can be an extended regexp of symbols to exclude
+  # it will be wrapped by ` (' and `)$', so one must not match beginning or
+  # end of line.  Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc',
+  # as well as any symbol that contains `d'.
+  _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*']
+  # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out
+  # platforms (ab)use it in PIC code, but their linkers get confused if
+  # the symbol is explicitly referenced.  Since portable code cannot
+  # rely on this symbol name, it's probably fine to never include it in
+  # preloaded symbol tables.
+  # Exclude shared library initialization/finalization symbols.
+dnl Note also adjust exclude_expsyms for C++ above.
+  extract_expsyms_cmds=
+
+  case $host_os in
+  cygwin* | mingw* | pw32* | cegcc*)
+    # FIXME: the MSVC++ port hasn't been tested in a loooong time
+    # When not using gcc, we currently assume that we are using
+    # Microsoft Visual C++.
+    if test "$GCC" != yes; then
+      with_gnu_ld=no
+    fi
+    ;;
+  interix*)
+    # we just hope/assume this is gcc and not c89 (= MSVC++)
+    with_gnu_ld=yes
+    ;;
+  openbsd*)
+    with_gnu_ld=no
+    ;;
+  linux* | k*bsd*-gnu | gnu*)
+    _LT_TAGVAR(link_all_deplibs, $1)=no
+    ;;
+  esac
+
+  _LT_TAGVAR(ld_shlibs, $1)=yes
+
+  # On some targets, GNU ld is compatible enough with the native linker
+  # that we're better off using the native interface for both.
+  lt_use_gnu_ld_interface=no
+  if test "$with_gnu_ld" = yes; then
+    case $host_os in
+      aix*)
+	# The AIX port of GNU ld has always aspired to compatibility
+	# with the native linker.  However, as the warning in the GNU ld
+	# block says, versions before 2.19.5* couldn't really create working
+	# shared libraries, regardless of the interface used.
+	case `$LD -v 2>&1` in
+	  *\ \(GNU\ Binutils\)\ 2.19.5*) ;;
+	  *\ \(GNU\ Binutils\)\ 2.[[2-9]]*) ;;
+	  *\ \(GNU\ Binutils\)\ [[3-9]]*) ;;
+	  *)
+	    lt_use_gnu_ld_interface=yes
+	    ;;
+	esac
+	;;
+      *)
+	lt_use_gnu_ld_interface=yes
+	;;
+    esac
+  fi
+
+  if test "$lt_use_gnu_ld_interface" = yes; then
+    # If archive_cmds runs LD, not CC, wlarc should be empty
+    wlarc='${wl}'
+
+    # Set some defaults for GNU ld with shared library support. These
+    # are reset later if shared libraries are not supported. Putting them
+    # here allows them to be overridden if necessary.
+    runpath_var=LD_RUN_PATH
+    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
+    # ancient GNU ld didn't support --whole-archive et. al.
+    if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then
+      _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+    else
+      _LT_TAGVAR(whole_archive_flag_spec, $1)=
+    fi
+    supports_anon_versioning=no
+    case `$LD -v 2>&1` in
+      *GNU\ gold*) supports_anon_versioning=yes ;;
+      *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.10.*) ;; # catch versions < 2.11
+      *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ...
+      *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ...
+      *\ 2.11.*) ;; # other 2.11 versions
+      *) supports_anon_versioning=yes ;;
+    esac
+
+    # See if GNU ld supports shared libraries.
+    case $host_os in
+    aix[[3-9]]*)
+      # On AIX/PPC, the GNU linker is very broken
+      if test "$host_cpu" != ia64; then
+	_LT_TAGVAR(ld_shlibs, $1)=no
+	cat <<_LT_EOF 1>&2
+
+*** Warning: the GNU linker, at least up to release 2.19, is reported
+*** to be unable to reliably create shared libraries on AIX.
+*** Therefore, libtool is disabling shared libraries support.  If you
+*** really care for shared libraries, you may want to install binutils
+*** 2.20 or above, or modify your PATH so that a non-GNU linker is found.
+*** You will then need to restart the configuration process.
+
+_LT_EOF
+      fi
+      ;;
+
+    amigaos*)
+      case $host_cpu in
+      powerpc)
+            # see comment about AmigaOS4 .so support
+            _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+            _LT_TAGVAR(archive_expsym_cmds, $1)=''
+        ;;
+      m68k)
+            _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
+            _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+            _LT_TAGVAR(hardcode_minus_L, $1)=yes
+        ;;
+      esac
+      ;;
+
+    beos*)
+      if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+	_LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+	# Joseph Beckenbach <jrb3 at best.com> says some releases of gcc
+	# support --undefined.  This deserves some investigation.  FIXME
+	_LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+      else
+	_LT_TAGVAR(ld_shlibs, $1)=no
+      fi
+      ;;
+
+    cygwin* | mingw* | pw32* | cegcc*)
+      # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless,
+      # as there is no search path for DLLs.
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-all-symbols'
+      _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+      _LT_TAGVAR(always_export_symbols, $1)=no
+      _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
+      _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols'
+      _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname']
+
+      if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then
+        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+	# If the export-symbols file already is a .def file (1st line
+	# is EXPORTS), use it as is; otherwise, prepend...
+	_LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
+	  cp $export_symbols $output_objdir/$soname.def;
+	else
+	  echo EXPORTS > $output_objdir/$soname.def;
+	  cat $export_symbols >> $output_objdir/$soname.def;
+	fi~
+	$CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+      else
+	_LT_TAGVAR(ld_shlibs, $1)=no
+      fi
+      ;;
+
+    haiku*)
+      _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+      _LT_TAGVAR(link_all_deplibs, $1)=yes
+      ;;
+
+    interix[[3-9]]*)
+      _LT_TAGVAR(hardcode_direct, $1)=no
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+      # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
+      # Instead, shared libraries are loaded at an image base (0x10000000 by
+      # default) and relocated if they conflict, which is a slow very memory
+      # consuming and fragmenting process.  To avoid this, we pick a random,
+      # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
+      # time.  Moving up from 0x10000000 also allows more sbrk(2) space.
+      _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+      _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+      ;;
+
+    gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu)
+      tmp_diet=no
+      if test "$host_os" = linux-dietlibc; then
+	case $cc_basename in
+	  diet\ *) tmp_diet=yes;;	# linux-dietlibc with static linking (!diet-dyn)
+	esac
+      fi
+      if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \
+	 && test "$tmp_diet" = no
+      then
+	tmp_addflag=' $pic_flag'
+	tmp_sharedflag='-shared'
+	case $cc_basename,$host_cpu in
+        pgcc*)				# Portland Group C compiler
+	  _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+	  tmp_addflag=' $pic_flag'
+	  ;;
+	pgf77* | pgf90* | pgf95* | pgfortran*)
+					# Portland Group f77 and f90 compilers
+	  _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+	  tmp_addflag=' $pic_flag -Mnomain' ;;
+	ecc*,ia64* | icc*,ia64*)	# Intel C compiler on ia64
+	  tmp_addflag=' -i_dynamic' ;;
+	efc*,ia64* | ifort*,ia64*)	# Intel Fortran compiler on ia64
+	  tmp_addflag=' -i_dynamic -nofor_main' ;;
+	ifc* | ifort*)			# Intel Fortran compiler
+	  tmp_addflag=' -nofor_main' ;;
+	lf95*)				# Lahey Fortran 8.1
+	  _LT_TAGVAR(whole_archive_flag_spec, $1)=
+	  tmp_sharedflag='--shared' ;;
+	xl[[cC]]* | bgxl[[cC]]* | mpixl[[cC]]*) # IBM XL C 8.0 on PPC (deal with xlf below)
+	  tmp_sharedflag='-qmkshrobj'
+	  tmp_addflag= ;;
+	nvcc*)	# Cuda Compiler Driver 2.2
+	  _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+	  _LT_TAGVAR(compiler_needs_object, $1)=yes
+	  ;;
+	esac
+	case `$CC -V 2>&1 | sed 5q` in
+	*Sun\ C*)			# Sun C 5.9
+	  _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+	  _LT_TAGVAR(compiler_needs_object, $1)=yes
+	  tmp_sharedflag='-G' ;;
+	*Sun\ F*)			# Sun Fortran 8.3
+	  tmp_sharedflag='-G' ;;
+	esac
+	_LT_TAGVAR(archive_cmds, $1)='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+
+        if test "x$supports_anon_versioning" = xyes; then
+          _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~
+	    cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+	    echo "local: *; };" >> $output_objdir/$libname.ver~
+	    $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'
+        fi
+
+	case $cc_basename in
+	xlf* | bgf* | bgxlf* | mpixlf*)
+	  # IBM XL Fortran 10.1 on PPC cannot create shared libs itself
+	  _LT_TAGVAR(whole_archive_flag_spec, $1)='--whole-archive$convenience --no-whole-archive'
+	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+	  _LT_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib'
+	  if test "x$supports_anon_versioning" = xyes; then
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~
+	      cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+	      echo "local: *; };" >> $output_objdir/$libname.ver~
+	      $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib'
+	  fi
+	  ;;
+	esac
+      else
+        _LT_TAGVAR(ld_shlibs, $1)=no
+      fi
+      ;;
+
+    netbsd* | netbsdelf*-gnu)
+      if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+	_LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib'
+	wlarc=
+      else
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+      fi
+      ;;
+
+    solaris*)
+      if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then
+	_LT_TAGVAR(ld_shlibs, $1)=no
+	cat <<_LT_EOF 1>&2
+
+*** Warning: The releases 2.8.* of the GNU linker cannot reliably
+*** create shared libraries on Solaris systems.  Therefore, libtool
+*** is disabling shared libraries support.  We urge you to upgrade GNU
+*** binutils to release 2.9.1 or newer.  Another option is to modify
+*** your PATH or compiler configuration so that the native linker is
+*** used, and then restart.
+
+_LT_EOF
+      elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+      else
+	_LT_TAGVAR(ld_shlibs, $1)=no
+      fi
+      ;;
+
+    sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*)
+      case `$LD -v 2>&1` in
+        *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.1[[0-5]].*)
+	_LT_TAGVAR(ld_shlibs, $1)=no
+	cat <<_LT_EOF 1>&2
+
+*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not
+*** reliably create shared libraries on SCO systems.  Therefore, libtool
+*** is disabling shared libraries support.  We urge you to upgrade GNU
+*** binutils to release 2.16.91.0.3 or newer.  Another option is to modify
+*** your PATH or compiler configuration so that the native linker is
+*** used, and then restart.
+
+_LT_EOF
+	;;
+	*)
+	  # For security reasons, it is highly recommended that you always
+	  # use absolute paths for naming shared libraries, and exclude the
+	  # DT_RUNPATH tag from executables and libraries.  But doing so
+	  # requires that you compile everything twice, which is a pain.
+	  if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+	  else
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	  fi
+	;;
+      esac
+      ;;
+
+    sunos4*)
+      _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+      wlarc=
+      _LT_TAGVAR(hardcode_direct, $1)=yes
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    *)
+      if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+      else
+	_LT_TAGVAR(ld_shlibs, $1)=no
+      fi
+      ;;
+    esac
+
+    if test "$_LT_TAGVAR(ld_shlibs, $1)" = no; then
+      runpath_var=
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
+      _LT_TAGVAR(export_dynamic_flag_spec, $1)=
+      _LT_TAGVAR(whole_archive_flag_spec, $1)=
+    fi
+  else
+    # PORTME fill in a description of your system's linker (not GNU ld)
+    case $host_os in
+    aix3*)
+      _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+      _LT_TAGVAR(always_export_symbols, $1)=yes
+      _LT_TAGVAR(archive_expsym_cmds, $1)='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname'
+      # Note: this linker hardcodes the directories in LIBPATH if there
+      # are no directories specified by -L.
+      _LT_TAGVAR(hardcode_minus_L, $1)=yes
+      if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then
+	# Neither direct hardcoding nor static linking is supported with a
+	# broken collect2.
+	_LT_TAGVAR(hardcode_direct, $1)=unsupported
+      fi
+      ;;
+
+    aix[[4-9]]*)
+      if test "$host_cpu" = ia64; then
+	# On IA64, the linker does run time linking by default, so we don't
+	# have to do anything special.
+	aix_use_runtimelinking=no
+	exp_sym_flag='-Bexport'
+	no_entry_flag=""
+      else
+	# If we're using GNU nm, then we don't want the "-C" option.
+	# -C means demangle to AIX nm, but means don't demangle with GNU nm
+	# Also, AIX nm treats weak defined symbols like other global
+	# defined symbols, whereas GNU nm marks them as "W".
+	if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then
+	  _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
+	else
+	  _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B")) && ([substr](\$ 3,1,1) != ".")) { print \$ 3 } }'\'' | sort -u > $export_symbols'
+	fi
+	aix_use_runtimelinking=no
+
+	# Test if we are trying to use run time linking or normal
+	# AIX style linking. If -brtl is somewhere in LDFLAGS, we
+	# need to do runtime linking.
+	case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*)
+	  for ld_flag in $LDFLAGS; do
+	  if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then
+	    aix_use_runtimelinking=yes
+	    break
+	  fi
+	  done
+	  ;;
+	esac
+
+	exp_sym_flag='-bexport'
+	no_entry_flag='-bnoentry'
+      fi
+
+      # When large executables or shared objects are built, AIX ld can
+      # have problems creating the table of contents.  If linking a library
+      # or program results in "error TOC overflow" add -mminimal-toc to
+      # CXXFLAGS/CFLAGS for g++/gcc.  In the cases where that is not
+      # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
+
+      _LT_TAGVAR(archive_cmds, $1)=''
+      _LT_TAGVAR(hardcode_direct, $1)=yes
+      _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
+      _LT_TAGVAR(hardcode_libdir_separator, $1)=':'
+      _LT_TAGVAR(link_all_deplibs, $1)=yes
+      _LT_TAGVAR(file_list_spec, $1)='${wl}-f,'
+
+      if test "$GCC" = yes; then
+	case $host_os in aix4.[[012]]|aix4.[[012]].*)
+	# We only want to do this on AIX 4.2 and lower, the check
+	# below for broken collect2 doesn't work under 4.3+
+	  collect2name=`${CC} -print-prog-name=collect2`
+	  if test -f "$collect2name" &&
+	   strings "$collect2name" | $GREP resolve_lib_name >/dev/null
+	  then
+	  # We have reworked collect2
+	  :
+	  else
+	  # We have old collect2
+	  _LT_TAGVAR(hardcode_direct, $1)=unsupported
+	  # It fails to find uninstalled libraries when the uninstalled
+	  # path is not listed in the libpath.  Setting hardcode_minus_L
+	  # to unsupported forces relinking
+	  _LT_TAGVAR(hardcode_minus_L, $1)=yes
+	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+	  _LT_TAGVAR(hardcode_libdir_separator, $1)=
+	  fi
+	  ;;
+	esac
+	shared_flag='-shared'
+	if test "$aix_use_runtimelinking" = yes; then
+	  shared_flag="$shared_flag "'${wl}-G'
+	fi
+	_LT_TAGVAR(link_all_deplibs, $1)=no
+      else
+	# not using gcc
+	if test "$host_cpu" = ia64; then
+	# VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
+	# chokes on -Wl,-G. The following line is correct:
+	  shared_flag='-G'
+	else
+	  if test "$aix_use_runtimelinking" = yes; then
+	    shared_flag='${wl}-G'
+	  else
+	    shared_flag='${wl}-bM:SRE'
+	  fi
+	fi
+      fi
+
+      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall'
+      # It seems that -bexpall does not export symbols beginning with
+      # underscore (_), so it is better to generate a list of symbols to export.
+      _LT_TAGVAR(always_export_symbols, $1)=yes
+      if test "$aix_use_runtimelinking" = yes; then
+	# Warning - without using the other runtime loading flags (-brtl),
+	# -berok will link without error, but may produce a broken library.
+	_LT_TAGVAR(allow_undefined_flag, $1)='-berok'
+        # Determine the default libpath from the value encoded in an
+        # empty executable.
+        _LT_SYS_MODULE_PATH_AIX([$1])
+        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
+        _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
+      else
+	if test "$host_cpu" = ia64; then
+	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib'
+	  _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs"
+	  _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols"
+	else
+	 # Determine the default libpath from the value encoded in an
+	 # empty executable.
+	 _LT_SYS_MODULE_PATH_AIX([$1])
+	 _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
+	  # Warning - without using the other run time loading flags,
+	  # -berok will link without error, but may produce a broken library.
+	  _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok'
+	  _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok'
+	  if test "$with_gnu_ld" = yes; then
+	    # We only use this code for GNU lds that support --whole-archive.
+	    _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive'
+	  else
+	    # Exported symbols can be pulled into shared objects from archives
+	    _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience'
+	  fi
+	  _LT_TAGVAR(archive_cmds_need_lc, $1)=yes
+	  # This is similar to how AIX traditionally builds its shared libraries.
+	  _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
+	fi
+      fi
+      ;;
+
+    amigaos*)
+      case $host_cpu in
+      powerpc)
+            # see comment about AmigaOS4 .so support
+            _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+            _LT_TAGVAR(archive_expsym_cmds, $1)=''
+        ;;
+      m68k)
+            _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
+            _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+            _LT_TAGVAR(hardcode_minus_L, $1)=yes
+        ;;
+      esac
+      ;;
+
+    bsdi[[45]]*)
+      _LT_TAGVAR(export_dynamic_flag_spec, $1)=-rdynamic
+      ;;
+
+    cygwin* | mingw* | pw32* | cegcc*)
+      # When not using gcc, we currently assume that we are using
+      # Microsoft Visual C++.
+      # hardcode_libdir_flag_spec is actually meaningless, as there is
+      # no search path for DLLs.
+      case $cc_basename in
+      cl*)
+	# Native MSVC
+	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' '
+	_LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+	_LT_TAGVAR(always_export_symbols, $1)=yes
+	_LT_TAGVAR(file_list_spec, $1)='@'
+	# Tell ltmain to make .lib files, not .a files.
+	libext=lib
+	# Tell ltmain to make .dll files, not .so files.
+	shrext_cmds=".dll"
+	# FIXME: Setting linknames here is a bad hack.
+	_LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames='
+	_LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
+	    sed -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp;
+	  else
+	    sed -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp;
+	  fi~
+	  $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~
+	  linknames='
+	# The linker will not automatically build a static lib if we build a DLL.
+	# _LT_TAGVAR(old_archive_from_new_cmds, $1)='true'
+	_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
+	_LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*'
+	_LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1,DATA/'\'' | $SED -e '\''/^[[AITW]][[ ]]/s/.*[[ ]]//'\'' | sort | uniq > $export_symbols'
+	# Don't use ranlib
+	_LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib'
+	_LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~
+	  lt_tool_outputfile="@TOOL_OUTPUT@"~
+	  case $lt_outputfile in
+	    *.exe|*.EXE) ;;
+	    *)
+	      lt_outputfile="$lt_outputfile.exe"
+	      lt_tool_outputfile="$lt_tool_outputfile.exe"
+	      ;;
+	  esac~
+	  if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then
+	    $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1;
+	    $RM "$lt_outputfile.manifest";
+	  fi'
+	;;
+      *)
+	# Assume MSVC wrapper
+	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' '
+	_LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+	# Tell ltmain to make .lib files, not .a files.
+	libext=lib
+	# Tell ltmain to make .dll files, not .so files.
+	shrext_cmds=".dll"
+	# FIXME: Setting linknames here is a bad hack.
+	_LT_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames='
+	# The linker will automatically build a .lib file if we build a DLL.
+	_LT_TAGVAR(old_archive_from_new_cmds, $1)='true'
+	# FIXME: Should let the user specify the lib program.
+	_LT_TAGVAR(old_archive_cmds, $1)='lib -OUT:$oldlib$oldobjs$old_deplibs'
+	_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
+	;;
+      esac
+      ;;
+
+    darwin* | rhapsody*)
+      _LT_DARWIN_LINKER_FEATURES($1)
+      ;;
+
+    dgux*)
+      _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor
+    # support.  Future versions do this automatically, but an explicit c++rt0.o
+    # does not break anything, and helps significantly (at the cost of a little
+    # extra space).
+    freebsd2.2*)
+      _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o'
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+      _LT_TAGVAR(hardcode_direct, $1)=yes
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    # Unfortunately, older versions of FreeBSD 2 do not have this feature.
+    freebsd2.*)
+      _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+      _LT_TAGVAR(hardcode_direct, $1)=yes
+      _LT_TAGVAR(hardcode_minus_L, $1)=yes
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    # FreeBSD 3 and greater uses gcc -shared to do shared libraries.
+    freebsd* | dragonfly*)
+      _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+      _LT_TAGVAR(hardcode_direct, $1)=yes
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    hpux9*)
+      if test "$GCC" = yes; then
+	_LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+      else
+	_LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+      fi
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
+      _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+      _LT_TAGVAR(hardcode_direct, $1)=yes
+
+      # hardcode_minus_L: Not really in the search PATH,
+      # but as the default location of the library.
+      _LT_TAGVAR(hardcode_minus_L, $1)=yes
+      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+      ;;
+
+    hpux10*)
+      if test "$GCC" = yes && test "$with_gnu_ld" = no; then
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	_LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'
+      fi
+      if test "$with_gnu_ld" = no; then
+	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
+	_LT_TAGVAR(hardcode_libdir_separator, $1)=:
+	_LT_TAGVAR(hardcode_direct, $1)=yes
+	_LT_TAGVAR(hardcode_direct_absolute, $1)=yes
+	_LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+	# hardcode_minus_L: Not really in the search PATH,
+	# but as the default location of the library.
+	_LT_TAGVAR(hardcode_minus_L, $1)=yes
+      fi
+      ;;
+
+    hpux11*)
+      if test "$GCC" = yes && test "$with_gnu_ld" = no; then
+	case $host_cpu in
+	hppa*64*)
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	ia64*)
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	*)
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	esac
+      else
+	case $host_cpu in
+	hppa*64*)
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	ia64*)
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	*)
+	m4_if($1, [], [
+	  # Older versions of the 11.00 compiler do not understand -b yet
+	  # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does)
+	  _LT_LINKER_OPTION([if $CC understands -b],
+	    _LT_TAGVAR(lt_cv_prog_compiler__b, $1), [-b],
+	    [_LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'],
+	    [_LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'])],
+	  [_LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'])
+	  ;;
+	esac
+      fi
+      if test "$with_gnu_ld" = no; then
+	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
+	_LT_TAGVAR(hardcode_libdir_separator, $1)=:
+
+	case $host_cpu in
+	hppa*64*|ia64*)
+	  _LT_TAGVAR(hardcode_direct, $1)=no
+	  _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+	  ;;
+	*)
+	  _LT_TAGVAR(hardcode_direct, $1)=yes
+	  _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
+	  _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+
+	  # hardcode_minus_L: Not really in the search PATH,
+	  # but as the default location of the library.
+	  _LT_TAGVAR(hardcode_minus_L, $1)=yes
+	  ;;
+	esac
+      fi
+      ;;
+
+    irix5* | irix6* | nonstopux*)
+      if test "$GCC" = yes; then
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+	# Try to use the -exported_symbol ld option, if it does not
+	# work, assume that -exports_file does not work either and
+	# implicitly export all symbols.
+	# This should be the same for all languages, so no per-tag cache variable.
+	AC_CACHE_CHECK([whether the $host_os linker accepts -exported_symbol],
+	  [lt_cv_irix_exported_symbol],
+	  [save_LDFLAGS="$LDFLAGS"
+	   LDFLAGS="$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null"
+	   AC_LINK_IFELSE(
+	     [AC_LANG_SOURCE(
+	        [AC_LANG_CASE([C], [[int foo (void) { return 0; }]],
+			      [C++], [[int foo (void) { return 0; }]],
+			      [Fortran 77], [[
+      subroutine foo
+      end]],
+			      [Fortran], [[
+      subroutine foo
+      end]])])],
+	      [lt_cv_irix_exported_symbol=yes],
+	      [lt_cv_irix_exported_symbol=no])
+           LDFLAGS="$save_LDFLAGS"])
+	if test "$lt_cv_irix_exported_symbol" = yes; then
+          _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib'
+	fi
+      else
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib'
+      fi
+      _LT_TAGVAR(archive_cmds_need_lc, $1)='no'
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+      _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+      _LT_TAGVAR(inherit_rpath, $1)=yes
+      _LT_TAGVAR(link_all_deplibs, $1)=yes
+      ;;
+
+    netbsd* | netbsdelf*-gnu)
+      if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+	_LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'  # a.out
+      else
+	_LT_TAGVAR(archive_cmds, $1)='$LD -shared -o $lib $libobjs $deplibs $linker_flags'      # ELF
+      fi
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+      _LT_TAGVAR(hardcode_direct, $1)=yes
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    newsos6)
+      _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      _LT_TAGVAR(hardcode_direct, $1)=yes
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+      _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    *nto* | *qnx*)
+      ;;
+
+    openbsd*)
+      if test -f /usr/libexec/ld.so; then
+	_LT_TAGVAR(hardcode_direct, $1)=yes
+	_LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+	_LT_TAGVAR(hardcode_direct_absolute, $1)=yes
+	if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+	  _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols'
+	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+	  _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+	else
+	  case $host_os in
+	   openbsd[[01]].* | openbsd2.[[0-7]] | openbsd2.[[0-7]].*)
+	     _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+	     _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+	     ;;
+	   *)
+	     _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+	     _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+	     ;;
+	  esac
+	fi
+      else
+	_LT_TAGVAR(ld_shlibs, $1)=no
+      fi
+      ;;
+
+    os2*)
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+      _LT_TAGVAR(hardcode_minus_L, $1)=yes
+      _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+      _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~echo DATA >> $output_objdir/$libname.def~echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def'
+      _LT_TAGVAR(old_archive_from_new_cmds, $1)='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def'
+      ;;
+
+    osf3*)
+      if test "$GCC" = yes; then
+	_LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+      else
+	_LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*'
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
+      fi
+      _LT_TAGVAR(archive_cmds_need_lc, $1)='no'
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+      _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+      ;;
+
+    osf4* | osf5*)	# as osf3* with the addition of -msym flag
+      if test "$GCC" = yes; then
+	_LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $pic_flag $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+      else
+	_LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*'
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~
+	$CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp'
+
+	# Both c and cxx compiler support -rpath directly
+	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir'
+      fi
+      _LT_TAGVAR(archive_cmds_need_lc, $1)='no'
+      _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+      ;;
+
+    solaris*)
+      _LT_TAGVAR(no_undefined_flag, $1)=' -z defs'
+      if test "$GCC" = yes; then
+	wlarc='${wl}'
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+	  $CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
+      else
+	case `$CC -V 2>&1` in
+	*"Compilers 5.0"*)
+	  wlarc=''
+	  _LT_TAGVAR(archive_cmds, $1)='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	  _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+	  $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp'
+	  ;;
+	*)
+	  wlarc='${wl}'
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags'
+	  _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+	  $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
+	  ;;
+	esac
+      fi
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      case $host_os in
+      solaris2.[[0-5]] | solaris2.[[0-5]].*) ;;
+      *)
+	# The compiler driver will combine and reorder linker options,
+	# but understands `-z linker_flag'.  GCC discards it without `$wl',
+	# but is careful enough not to reorder.
+	# Supported since Solaris 2.6 (maybe 2.5.1?)
+	if test "$GCC" = yes; then
+	  _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract'
+	else
+	  _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract'
+	fi
+	;;
+      esac
+      _LT_TAGVAR(link_all_deplibs, $1)=yes
+      ;;
+
+    sunos4*)
+      if test "x$host_vendor" = xsequent; then
+	# Use $CC to link under sequent, because it throws in some extra .o
+	# files that make .init and .fini sections work.
+	_LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	_LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags'
+      fi
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+      _LT_TAGVAR(hardcode_direct, $1)=yes
+      _LT_TAGVAR(hardcode_minus_L, $1)=yes
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    sysv4)
+      case $host_vendor in
+	sni)
+	  _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	  _LT_TAGVAR(hardcode_direct, $1)=yes # is this really true???
+	;;
+	siemens)
+	  ## LD is ld it makes a PLAMLIB
+	  ## CC just makes a GrossModule.
+	  _LT_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags'
+	  _LT_TAGVAR(reload_cmds, $1)='$CC -r -o $output$reload_objs'
+	  _LT_TAGVAR(hardcode_direct, $1)=no
+        ;;
+	motorola)
+	  _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	  _LT_TAGVAR(hardcode_direct, $1)=no #Motorola manual says yes, but my tests say they lie
+	;;
+      esac
+      runpath_var='LD_RUN_PATH'
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    sysv4.3*)
+      _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      _LT_TAGVAR(export_dynamic_flag_spec, $1)='-Bexport'
+      ;;
+
+    sysv4*MP*)
+      if test -d /usr/nec; then
+	_LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	_LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+	runpath_var=LD_RUN_PATH
+	hardcode_runpath_var=yes
+	_LT_TAGVAR(ld_shlibs, $1)=yes
+      fi
+      ;;
+
+    sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*)
+      _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'
+      _LT_TAGVAR(archive_cmds_need_lc, $1)=no
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      runpath_var='LD_RUN_PATH'
+
+      if test "$GCC" = yes; then
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	_LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      fi
+      ;;
+
+    sysv5* | sco3.2v5* | sco5v6*)
+      # Note: We can NOT use -z defs as we might desire, because we do not
+      # link with -lc, and that would cause any symbols used from libc to
+      # always be unresolved, which means just about no library would
+      # ever link correctly.  If we're not using GNU ld we use -z text
+      # though, which does catch some bad symbols but isn't as heavy-handed
+      # as -z defs.
+      _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'
+      _LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs'
+      _LT_TAGVAR(archive_cmds_need_lc, $1)=no
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir'
+      _LT_TAGVAR(hardcode_libdir_separator, $1)=':'
+      _LT_TAGVAR(link_all_deplibs, $1)=yes
+      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport'
+      runpath_var='LD_RUN_PATH'
+
+      if test "$GCC" = yes; then
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	_LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      fi
+      ;;
+
+    uts4*)
+      _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    *)
+      _LT_TAGVAR(ld_shlibs, $1)=no
+      ;;
+    esac
+
+    if test x$host_vendor = xsni; then
+      case $host in
+      sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)
+	_LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Blargedynsym'
+	;;
+      esac
+    fi
+  fi
+])
+AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)])
+test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no
+
+_LT_TAGVAR(with_gnu_ld, $1)=$with_gnu_ld
+
+_LT_DECL([], [libext], [0], [Old archive suffix (normally "a")])dnl
+_LT_DECL([], [shrext_cmds], [1], [Shared library suffix (normally ".so")])dnl
+_LT_DECL([], [extract_expsyms_cmds], [2],
+    [The commands to extract the exported symbol list from a shared archive])
+
+#
+# Do we need to explicitly link libc?
+#
+case "x$_LT_TAGVAR(archive_cmds_need_lc, $1)" in
+x|xyes)
+  # Assume -lc should be added
+  _LT_TAGVAR(archive_cmds_need_lc, $1)=yes
+
+  if test "$enable_shared" = yes && test "$GCC" = yes; then
+    case $_LT_TAGVAR(archive_cmds, $1) in
+    *'~'*)
+      # FIXME: we may have to deal with multi-command sequences.
+      ;;
+    '$CC '*)
+      # Test whether the compiler implicitly links with -lc since on some
+      # systems, -lgcc has to come before -lc. If gcc already passes -lc
+      # to ld, don't add -lc before -lgcc.
+      AC_CACHE_CHECK([whether -lc should be explicitly linked in],
+	[lt_cv_]_LT_TAGVAR(archive_cmds_need_lc, $1),
+	[$RM conftest*
+	echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+	if AC_TRY_EVAL(ac_compile) 2>conftest.err; then
+	  soname=conftest
+	  lib=conftest
+	  libobjs=conftest.$ac_objext
+	  deplibs=
+	  wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1)
+	  pic_flag=$_LT_TAGVAR(lt_prog_compiler_pic, $1)
+	  compiler_flags=-v
+	  linker_flags=-v
+	  verstring=
+	  output_objdir=.
+	  libname=conftest
+	  lt_save_allow_undefined_flag=$_LT_TAGVAR(allow_undefined_flag, $1)
+	  _LT_TAGVAR(allow_undefined_flag, $1)=
+	  if AC_TRY_EVAL(_LT_TAGVAR(archive_cmds, $1) 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1)
+	  then
+	    lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=no
+	  else
+	    lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=yes
+	  fi
+	  _LT_TAGVAR(allow_undefined_flag, $1)=$lt_save_allow_undefined_flag
+	else
+	  cat conftest.err 1>&5
+	fi
+	$RM conftest*
+	])
+      _LT_TAGVAR(archive_cmds_need_lc, $1)=$lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)
+      ;;
+    esac
+  fi
+  ;;
+esac
+
+_LT_TAGDECL([build_libtool_need_lc], [archive_cmds_need_lc], [0],
+    [Whether or not to add -lc for building shared libraries])
+_LT_TAGDECL([allow_libtool_libs_with_static_runtimes],
+    [enable_shared_with_static_runtimes], [0],
+    [Whether or not to disallow shared libs when runtime libs are static])
+_LT_TAGDECL([], [export_dynamic_flag_spec], [1],
+    [Compiler flag to allow reflexive dlopens])
+_LT_TAGDECL([], [whole_archive_flag_spec], [1],
+    [Compiler flag to generate shared objects directly from archives])
+_LT_TAGDECL([], [compiler_needs_object], [1],
+    [Whether the compiler copes with passing no objects directly])
+_LT_TAGDECL([], [old_archive_from_new_cmds], [2],
+    [Create an old-style archive from a shared archive])
+_LT_TAGDECL([], [old_archive_from_expsyms_cmds], [2],
+    [Create a temporary old-style archive to link instead of a shared archive])
+_LT_TAGDECL([], [archive_cmds], [2], [Commands used to build a shared archive])
+_LT_TAGDECL([], [archive_expsym_cmds], [2])
+_LT_TAGDECL([], [module_cmds], [2],
+    [Commands used to build a loadable module if different from building
+    a shared archive.])
+_LT_TAGDECL([], [module_expsym_cmds], [2])
+_LT_TAGDECL([], [with_gnu_ld], [1],
+    [Whether we are building with GNU ld or not])
+_LT_TAGDECL([], [allow_undefined_flag], [1],
+    [Flag that allows shared libraries with undefined symbols to be built])
+_LT_TAGDECL([], [no_undefined_flag], [1],
+    [Flag that enforces no undefined symbols])
+_LT_TAGDECL([], [hardcode_libdir_flag_spec], [1],
+    [Flag to hardcode $libdir into a binary during linking.
+    This must work even if $libdir does not exist])
+_LT_TAGDECL([], [hardcode_libdir_separator], [1],
+    [Whether we need a single "-rpath" flag with a separated argument])
+_LT_TAGDECL([], [hardcode_direct], [0],
+    [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes
+    DIR into the resulting binary])
+_LT_TAGDECL([], [hardcode_direct_absolute], [0],
+    [Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes
+    DIR into the resulting binary and the resulting library dependency is
+    "absolute", i.e impossible to change by setting ${shlibpath_var} if the
+    library is relocated])
+_LT_TAGDECL([], [hardcode_minus_L], [0],
+    [Set to "yes" if using the -LDIR flag during linking hardcodes DIR
+    into the resulting binary])
+_LT_TAGDECL([], [hardcode_shlibpath_var], [0],
+    [Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR
+    into the resulting binary])
+_LT_TAGDECL([], [hardcode_automatic], [0],
+    [Set to "yes" if building a shared library automatically hardcodes DIR
+    into the library and all subsequent libraries and executables linked
+    against it])
+_LT_TAGDECL([], [inherit_rpath], [0],
+    [Set to yes if linker adds runtime paths of dependent libraries
+    to runtime path list])
+_LT_TAGDECL([], [link_all_deplibs], [0],
+    [Whether libtool must link a program against all its dependency libraries])
+_LT_TAGDECL([], [always_export_symbols], [0],
+    [Set to "yes" if exported symbols are required])
+_LT_TAGDECL([], [export_symbols_cmds], [2],
+    [The commands to list exported symbols])
+_LT_TAGDECL([], [exclude_expsyms], [1],
+    [Symbols that should not be listed in the preloaded symbols])
+_LT_TAGDECL([], [include_expsyms], [1],
+    [Symbols that must always be exported])
+_LT_TAGDECL([], [prelink_cmds], [2],
+    [Commands necessary for linking programs (against libraries) with templates])
+_LT_TAGDECL([], [postlink_cmds], [2],
+    [Commands necessary for finishing linking programs])
+_LT_TAGDECL([], [file_list_spec], [1],
+    [Specify filename containing input files])
+dnl FIXME: Not yet implemented
+dnl _LT_TAGDECL([], [thread_safe_flag_spec], [1],
+dnl    [Compiler flag to generate thread safe objects])
+])# _LT_LINKER_SHLIBS
+
+
+# _LT_LANG_C_CONFIG([TAG])
+# ------------------------
+# Ensure that the configuration variables for a C compiler are suitably
+# defined.  These variables are subsequently used by _LT_CONFIG to write
+# the compiler configuration to `libtool'.
+m4_defun([_LT_LANG_C_CONFIG],
+[m4_require([_LT_DECL_EGREP])dnl
+lt_save_CC="$CC"
+AC_LANG_PUSH(C)
+
+# Source file extension for C test sources.
+ac_ext=c
+
+# Object file extension for compiled C test sources.
+objext=o
+_LT_TAGVAR(objext, $1)=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code="int some_variable = 0;"
+
+# Code to be used in simple link tests
+lt_simple_link_test_code='int main(){return(0);}'
+
+_LT_TAG_COMPILER
+# Save the default compiler, since it gets overwritten when the other
+# tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP.
+compiler_DEFAULT=$CC
+
+# save warnings/boilerplate of simple test code
+_LT_COMPILER_BOILERPLATE
+_LT_LINKER_BOILERPLATE
+
+## CAVEAT EMPTOR:
+## There is no encapsulation within the following macros, do not change
+## the running order or otherwise move them around unless you know exactly
+## what you are doing...
+if test -n "$compiler"; then
+  _LT_COMPILER_NO_RTTI($1)
+  _LT_COMPILER_PIC($1)
+  _LT_COMPILER_C_O($1)
+  _LT_COMPILER_FILE_LOCKS($1)
+  _LT_LINKER_SHLIBS($1)
+  _LT_SYS_DYNAMIC_LINKER($1)
+  _LT_LINKER_HARDCODE_LIBPATH($1)
+  LT_SYS_DLOPEN_SELF
+  _LT_CMD_STRIPLIB
+
+  # Report which library types will actually be built
+  AC_MSG_CHECKING([if libtool supports shared libraries])
+  AC_MSG_RESULT([$can_build_shared])
+
+  AC_MSG_CHECKING([whether to build shared libraries])
+  test "$can_build_shared" = "no" && enable_shared=no
+
+  # On AIX, shared libraries and static libraries use the same namespace, and
+  # are all built from PIC.
+  case $host_os in
+  aix3*)
+    test "$enable_shared" = yes && enable_static=no
+    if test -n "$RANLIB"; then
+      archive_cmds="$archive_cmds~\$RANLIB \$lib"
+      postinstall_cmds='$RANLIB $lib'
+    fi
+    ;;
+
+  aix[[4-9]]*)
+    if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then
+      test "$enable_shared" = yes && enable_static=no
+    fi
+    ;;
+  esac
+  AC_MSG_RESULT([$enable_shared])
+
+  AC_MSG_CHECKING([whether to build static libraries])
+  # Make sure either enable_shared or enable_static is yes.
+  test "$enable_shared" = yes || enable_static=yes
+  AC_MSG_RESULT([$enable_static])
+
+  _LT_CONFIG($1)
+fi
+AC_LANG_POP
+CC="$lt_save_CC"
+])# _LT_LANG_C_CONFIG
+
+
+# _LT_LANG_CXX_CONFIG([TAG])
+# --------------------------
+# Ensure that the configuration variables for a C++ compiler are suitably
+# defined.  These variables are subsequently used by _LT_CONFIG to write
+# the compiler configuration to `libtool'.
+m4_defun([_LT_LANG_CXX_CONFIG],
+[m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+m4_require([_LT_DECL_EGREP])dnl
+m4_require([_LT_PATH_MANIFEST_TOOL])dnl
+if test -n "$CXX" && ( test "X$CXX" != "Xno" &&
+    ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) ||
+    (test "X$CXX" != "Xg++"))) ; then
+  AC_PROG_CXXCPP
+else
+  _lt_caught_CXX_error=yes
+fi
+
+AC_LANG_PUSH(C++)
+_LT_TAGVAR(archive_cmds_need_lc, $1)=no
+_LT_TAGVAR(allow_undefined_flag, $1)=
+_LT_TAGVAR(always_export_symbols, $1)=no
+_LT_TAGVAR(archive_expsym_cmds, $1)=
+_LT_TAGVAR(compiler_needs_object, $1)=no
+_LT_TAGVAR(export_dynamic_flag_spec, $1)=
+_LT_TAGVAR(hardcode_direct, $1)=no
+_LT_TAGVAR(hardcode_direct_absolute, $1)=no
+_LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
+_LT_TAGVAR(hardcode_libdir_separator, $1)=
+_LT_TAGVAR(hardcode_minus_L, $1)=no
+_LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported
+_LT_TAGVAR(hardcode_automatic, $1)=no
+_LT_TAGVAR(inherit_rpath, $1)=no
+_LT_TAGVAR(module_cmds, $1)=
+_LT_TAGVAR(module_expsym_cmds, $1)=
+_LT_TAGVAR(link_all_deplibs, $1)=unknown
+_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
+_LT_TAGVAR(reload_flag, $1)=$reload_flag
+_LT_TAGVAR(reload_cmds, $1)=$reload_cmds
+_LT_TAGVAR(no_undefined_flag, $1)=
+_LT_TAGVAR(whole_archive_flag_spec, $1)=
+_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no
+
+# Source file extension for C++ test sources.
+ac_ext=cpp
+
+# Object file extension for compiled C++ test sources.
+objext=o
+_LT_TAGVAR(objext, $1)=$objext
+
+# No sense in running all these tests if we already determined that
+# the CXX compiler isn't working.  Some variables (like enable_shared)
+# are currently assumed to apply to all compilers on this platform,
+# and will be corrupted by setting them based on a non-working compiler.
+if test "$_lt_caught_CXX_error" != yes; then
+  # Code to be used in simple compile tests
+  lt_simple_compile_test_code="int some_variable = 0;"
+
+  # Code to be used in simple link tests
+  lt_simple_link_test_code='int main(int, char *[[]]) { return(0); }'
+
+  # ltmain only uses $CC for tagged configurations so make sure $CC is set.
+  _LT_TAG_COMPILER
+
+  # save warnings/boilerplate of simple test code
+  _LT_COMPILER_BOILERPLATE
+  _LT_LINKER_BOILERPLATE
+
+  # Allow CC to be a program name with arguments.
+  lt_save_CC=$CC
+  lt_save_CFLAGS=$CFLAGS
+  lt_save_LD=$LD
+  lt_save_GCC=$GCC
+  GCC=$GXX
+  lt_save_with_gnu_ld=$with_gnu_ld
+  lt_save_path_LD=$lt_cv_path_LD
+  if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then
+    lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx
+  else
+    $as_unset lt_cv_prog_gnu_ld
+  fi
+  if test -n "${lt_cv_path_LDCXX+set}"; then
+    lt_cv_path_LD=$lt_cv_path_LDCXX
+  else
+    $as_unset lt_cv_path_LD
+  fi
+  test -z "${LDCXX+set}" || LD=$LDCXX
+  CC=${CXX-"c++"}
+  CFLAGS=$CXXFLAGS
+  compiler=$CC
+  _LT_TAGVAR(compiler, $1)=$CC
+  _LT_CC_BASENAME([$compiler])
+
+  if test -n "$compiler"; then
+    # We don't want -fno-exception when compiling C++ code, so set the
+    # no_builtin_flag separately
+    if test "$GXX" = yes; then
+      _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin'
+    else
+      _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=
+    fi
+
+    if test "$GXX" = yes; then
+      # Set up default GNU C++ configuration
+
+      LT_PATH_LD
+
+      # Check if GNU C++ uses GNU ld as the underlying linker, since the
+      # archiving commands below assume that GNU ld is being used.
+      if test "$with_gnu_ld" = yes; then
+        _LT_TAGVAR(archive_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
+        _LT_TAGVAR(archive_expsym_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+
+        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+        _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
+
+        # If archive_cmds runs LD, not CC, wlarc should be empty
+        # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to
+        #     investigate it a little bit more. (MM)
+        wlarc='${wl}'
+
+        # ancient GNU ld didn't support --whole-archive et. al.
+        if eval "`$CC -print-prog-name=ld` --help 2>&1" |
+	  $GREP 'no-whole-archive' > /dev/null; then
+          _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+        else
+          _LT_TAGVAR(whole_archive_flag_spec, $1)=
+        fi
+      else
+        with_gnu_ld=no
+        wlarc=
+
+        # A generic and very simple default shared library creation
+        # command for GNU C++ for the case where it uses the native
+        # linker, instead of GNU ld.  If possible, this setting should
+        # overridden to take advantage of the native linker features on
+        # the platform it is being used on.
+        _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'
+      fi
+
+      # Commands to make compiler produce verbose output that lists
+      # what "hidden" libraries, object files and flags are used when
+      # linking a shared library.
+      output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
+
+    else
+      GXX=no
+      with_gnu_ld=no
+      wlarc=
+    fi
+
+    # PORTME: fill in a description of your system's C++ link characteristics
+    AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries])
+    _LT_TAGVAR(ld_shlibs, $1)=yes
+    case $host_os in
+      aix3*)
+        # FIXME: insert proper C++ library support
+        _LT_TAGVAR(ld_shlibs, $1)=no
+        ;;
+      aix[[4-9]]*)
+        if test "$host_cpu" = ia64; then
+          # On IA64, the linker does run time linking by default, so we don't
+          # have to do anything special.
+          aix_use_runtimelinking=no
+          exp_sym_flag='-Bexport'
+          no_entry_flag=""
+        else
+          aix_use_runtimelinking=no
+
+          # Test if we are trying to use run time linking or normal
+          # AIX style linking. If -brtl is somewhere in LDFLAGS, we
+          # need to do runtime linking.
+          case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*)
+	    for ld_flag in $LDFLAGS; do
+	      case $ld_flag in
+	      *-brtl*)
+	        aix_use_runtimelinking=yes
+	        break
+	        ;;
+	      esac
+	    done
+	    ;;
+          esac
+
+          exp_sym_flag='-bexport'
+          no_entry_flag='-bnoentry'
+        fi
+
+        # When large executables or shared objects are built, AIX ld can
+        # have problems creating the table of contents.  If linking a library
+        # or program results in "error TOC overflow" add -mminimal-toc to
+        # CXXFLAGS/CFLAGS for g++/gcc.  In the cases where that is not
+        # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
+
+        _LT_TAGVAR(archive_cmds, $1)=''
+        _LT_TAGVAR(hardcode_direct, $1)=yes
+        _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
+        _LT_TAGVAR(hardcode_libdir_separator, $1)=':'
+        _LT_TAGVAR(link_all_deplibs, $1)=yes
+        _LT_TAGVAR(file_list_spec, $1)='${wl}-f,'
+
+        if test "$GXX" = yes; then
+          case $host_os in aix4.[[012]]|aix4.[[012]].*)
+          # We only want to do this on AIX 4.2 and lower, the check
+          # below for broken collect2 doesn't work under 4.3+
+	  collect2name=`${CC} -print-prog-name=collect2`
+	  if test -f "$collect2name" &&
+	     strings "$collect2name" | $GREP resolve_lib_name >/dev/null
+	  then
+	    # We have reworked collect2
+	    :
+	  else
+	    # We have old collect2
+	    _LT_TAGVAR(hardcode_direct, $1)=unsupported
+	    # It fails to find uninstalled libraries when the uninstalled
+	    # path is not listed in the libpath.  Setting hardcode_minus_L
+	    # to unsupported forces relinking
+	    _LT_TAGVAR(hardcode_minus_L, $1)=yes
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+	    _LT_TAGVAR(hardcode_libdir_separator, $1)=
+	  fi
+          esac
+          shared_flag='-shared'
+	  if test "$aix_use_runtimelinking" = yes; then
+	    shared_flag="$shared_flag "'${wl}-G'
+	  fi
+        else
+          # not using gcc
+          if test "$host_cpu" = ia64; then
+	  # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
+	  # chokes on -Wl,-G. The following line is correct:
+	  shared_flag='-G'
+          else
+	    if test "$aix_use_runtimelinking" = yes; then
+	      shared_flag='${wl}-G'
+	    else
+	      shared_flag='${wl}-bM:SRE'
+	    fi
+          fi
+        fi
+
+        _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall'
+        # It seems that -bexpall does not export symbols beginning with
+        # underscore (_), so it is better to generate a list of symbols to
+	# export.
+        _LT_TAGVAR(always_export_symbols, $1)=yes
+        if test "$aix_use_runtimelinking" = yes; then
+          # Warning - without using the other runtime loading flags (-brtl),
+          # -berok will link without error, but may produce a broken library.
+          _LT_TAGVAR(allow_undefined_flag, $1)='-berok'
+          # Determine the default libpath from the value encoded in an empty
+          # executable.
+          _LT_SYS_MODULE_PATH_AIX([$1])
+          _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
+
+          _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
+        else
+          if test "$host_cpu" = ia64; then
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib'
+	    _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs"
+	    _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols"
+          else
+	    # Determine the default libpath from the value encoded in an
+	    # empty executable.
+	    _LT_SYS_MODULE_PATH_AIX([$1])
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
+	    # Warning - without using the other run time loading flags,
+	    # -berok will link without error, but may produce a broken library.
+	    _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok'
+	    _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok'
+	    if test "$with_gnu_ld" = yes; then
+	      # We only use this code for GNU lds that support --whole-archive.
+	      _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive'
+	    else
+	      # Exported symbols can be pulled into shared objects from archives
+	      _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience'
+	    fi
+	    _LT_TAGVAR(archive_cmds_need_lc, $1)=yes
+	    # This is similar to how AIX traditionally builds its shared
+	    # libraries.
+	    _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
+          fi
+        fi
+        ;;
+
+      beos*)
+	if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+	  _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+	  # Joseph Beckenbach <jrb3 at best.com> says some releases of gcc
+	  # support --undefined.  This deserves some investigation.  FIXME
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	else
+	  _LT_TAGVAR(ld_shlibs, $1)=no
+	fi
+	;;
+
+      chorus*)
+        case $cc_basename in
+          *)
+	  # FIXME: insert proper C++ library support
+	  _LT_TAGVAR(ld_shlibs, $1)=no
+	  ;;
+        esac
+        ;;
+
+      cygwin* | mingw* | pw32* | cegcc*)
+	case $GXX,$cc_basename in
+	,cl* | no,cl*)
+	  # Native MSVC
+	  # hardcode_libdir_flag_spec is actually meaningless, as there is
+	  # no search path for DLLs.
+	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' '
+	  _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+	  _LT_TAGVAR(always_export_symbols, $1)=yes
+	  _LT_TAGVAR(file_list_spec, $1)='@'
+	  # Tell ltmain to make .lib files, not .a files.
+	  libext=lib
+	  # Tell ltmain to make .dll files, not .so files.
+	  shrext_cmds=".dll"
+	  # FIXME: Setting linknames here is a bad hack.
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames='
+	  _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
+	      $SED -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp;
+	    else
+	      $SED -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp;
+	    fi~
+	    $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~
+	    linknames='
+	  # The linker will not automatically build a static lib if we build a DLL.
+	  # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true'
+	  _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
+	  # Don't use ranlib
+	  _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib'
+	  _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~
+	    lt_tool_outputfile="@TOOL_OUTPUT@"~
+	    case $lt_outputfile in
+	      *.exe|*.EXE) ;;
+	      *)
+		lt_outputfile="$lt_outputfile.exe"
+		lt_tool_outputfile="$lt_tool_outputfile.exe"
+		;;
+	    esac~
+	    func_to_tool_file "$lt_outputfile"~
+	    if test "$MANIFEST_TOOL" != ":" && test -f "$lt_outputfile.manifest"; then
+	      $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1;
+	      $RM "$lt_outputfile.manifest";
+	    fi'
+	  ;;
+	*)
+	  # g++
+	  # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless,
+	  # as there is no search path for DLLs.
+	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+	  _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-all-symbols'
+	  _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+	  _LT_TAGVAR(always_export_symbols, $1)=no
+	  _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
+
+	  if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+	    # If the export-symbols file already is a .def file (1st line
+	    # is EXPORTS), use it as is; otherwise, prepend...
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
+	      cp $export_symbols $output_objdir/$soname.def;
+	    else
+	      echo EXPORTS > $output_objdir/$soname.def;
+	      cat $export_symbols >> $output_objdir/$soname.def;
+	    fi~
+	    $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+	  else
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	  fi
+	  ;;
+	esac
+	;;
+      darwin* | rhapsody*)
+        _LT_DARWIN_LINKER_FEATURES($1)
+	;;
+
+      dgux*)
+        case $cc_basename in
+          ec++*)
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+          ghcx*)
+	    # Green Hills C++ Compiler
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+          *)
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+        esac
+        ;;
+
+      freebsd2.*)
+        # C++ shared libraries reported to be fairly broken before
+	# switch to ELF
+        _LT_TAGVAR(ld_shlibs, $1)=no
+        ;;
+
+      freebsd-elf*)
+        _LT_TAGVAR(archive_cmds_need_lc, $1)=no
+        ;;
+
+      freebsd* | dragonfly*)
+        # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF
+        # conventions
+        _LT_TAGVAR(ld_shlibs, $1)=yes
+        ;;
+
+      gnu*)
+        ;;
+
+      haiku*)
+        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+        _LT_TAGVAR(link_all_deplibs, $1)=yes
+        ;;
+
+      hpux9*)
+        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
+        _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+        _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+        _LT_TAGVAR(hardcode_direct, $1)=yes
+        _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH,
+				             # but as the default
+				             # location of the library.
+
+        case $cc_basename in
+          CC*)
+            # FIXME: insert proper C++ library support
+            _LT_TAGVAR(ld_shlibs, $1)=no
+            ;;
+          aCC*)
+            _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+            # Commands to make compiler produce verbose output that lists
+            # what "hidden" libraries, object files and flags are used when
+            # linking a shared library.
+            #
+            # There doesn't appear to be a way to prevent this compiler from
+            # explicitly linking system object files so we need to strip them
+            # from the output so that they don't get included in the library
+            # dependencies.
+            output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
+            ;;
+          *)
+            if test "$GXX" = yes; then
+              _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+            else
+              # FIXME: insert proper C++ library support
+              _LT_TAGVAR(ld_shlibs, $1)=no
+            fi
+            ;;
+        esac
+        ;;
+
+      hpux10*|hpux11*)
+        if test $with_gnu_ld = no; then
+	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
+	  _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+
+          case $host_cpu in
+            hppa*64*|ia64*)
+              ;;
+            *)
+	      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+              ;;
+          esac
+        fi
+        case $host_cpu in
+          hppa*64*|ia64*)
+            _LT_TAGVAR(hardcode_direct, $1)=no
+            _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+            ;;
+          *)
+            _LT_TAGVAR(hardcode_direct, $1)=yes
+            _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
+            _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH,
+					         # but as the default
+					         # location of the library.
+            ;;
+        esac
+
+        case $cc_basename in
+          CC*)
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+          aCC*)
+	    case $host_cpu in
+	      hppa*64*)
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	        ;;
+	      ia64*)
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	        ;;
+	      *)
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	        ;;
+	    esac
+	    # Commands to make compiler produce verbose output that lists
+	    # what "hidden" libraries, object files and flags are used when
+	    # linking a shared library.
+	    #
+	    # There doesn't appear to be a way to prevent this compiler from
+	    # explicitly linking system object files so we need to strip them
+	    # from the output so that they don't get included in the library
+	    # dependencies.
+	    output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
+	    ;;
+          *)
+	    if test "$GXX" = yes; then
+	      if test $with_gnu_ld = no; then
+	        case $host_cpu in
+	          hppa*64*)
+	            _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	            ;;
+	          ia64*)
+	            _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	            ;;
+	          *)
+	            _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	            ;;
+	        esac
+	      fi
+	    else
+	      # FIXME: insert proper C++ library support
+	      _LT_TAGVAR(ld_shlibs, $1)=no
+	    fi
+	    ;;
+        esac
+        ;;
+
+      interix[[3-9]]*)
+	_LT_TAGVAR(hardcode_direct, $1)=no
+	_LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+	_LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+	# Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
+	# Instead, shared libraries are loaded at an image base (0x10000000 by
+	# default) and relocated if they conflict, which is a slow very memory
+	# consuming and fragmenting process.  To avoid this, we pick a random,
+	# 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
+	# time.  Moving up from 0x10000000 also allows more sbrk(2) space.
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+	;;
+      irix5* | irix6*)
+        case $cc_basename in
+          CC*)
+	    # SGI C++
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
+
+	    # Archives containing C++ object files must be created using
+	    # "CC -ar", where "CC" is the IRIX C++ compiler.  This is
+	    # necessary to make sure instantiated templates are included
+	    # in the archive.
+	    _LT_TAGVAR(old_archive_cmds, $1)='$CC -ar -WR,-u -o $oldlib $oldobjs'
+	    ;;
+          *)
+	    if test "$GXX" = yes; then
+	      if test "$with_gnu_ld" = no; then
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+	      else
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` -o $lib'
+	      fi
+	    fi
+	    _LT_TAGVAR(link_all_deplibs, $1)=yes
+	    ;;
+        esac
+        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+        _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+        _LT_TAGVAR(inherit_rpath, $1)=yes
+        ;;
+
+      linux* | k*bsd*-gnu | kopensolaris*-gnu)
+        case $cc_basename in
+          KCC*)
+	    # Kuck and Associates, Inc. (KAI) C++ Compiler
+
+	    # KCC will only create a shared library if the output file
+	    # ends with ".so" (or ".sl" for HP-UX), so rename the library
+	    # to its proper name (with version) after linking.
+	    _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib'
+	    # Commands to make compiler produce verbose output that lists
+	    # what "hidden" libraries, object files and flags are used when
+	    # linking a shared library.
+	    #
+	    # There doesn't appear to be a way to prevent this compiler from
+	    # explicitly linking system object files so we need to strip them
+	    # from the output so that they don't get included in the library
+	    # dependencies.
+	    output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
+
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+	    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
+
+	    # Archives containing C++ object files must be created using
+	    # "CC -Bstatic", where "CC" is the KAI C++ compiler.
+	    _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs'
+	    ;;
+	  icpc* | ecpc* )
+	    # Intel C++
+	    with_gnu_ld=yes
+	    # version 8.0 and above of icpc choke on multiply defined symbols
+	    # if we add $predep_objects and $postdep_objects, however 7.1 and
+	    # earlier do not add the objects themselves.
+	    case `$CC -V 2>&1` in
+	      *"Version 7."*)
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
+		_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+		;;
+	      *)  # Version 8.0 or newer
+	        tmp_idyn=
+	        case $host_cpu in
+		  ia64*) tmp_idyn=' -i_dynamic';;
+		esac
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+		_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+		;;
+	    esac
+	    _LT_TAGVAR(archive_cmds_need_lc, $1)=no
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+	    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
+	    _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive'
+	    ;;
+          pgCC* | pgcpp*)
+            # Portland Group C++ compiler
+	    case `$CC -V` in
+	    *pgCC\ [[1-5]].* | *pgcpp\ [[1-5]].*)
+	      _LT_TAGVAR(prelink_cmds, $1)='tpldir=Template.dir~
+		rm -rf $tpldir~
+		$CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~
+		compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"'
+	      _LT_TAGVAR(old_archive_cmds, $1)='tpldir=Template.dir~
+		rm -rf $tpldir~
+		$CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~
+		$AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~
+		$RANLIB $oldlib'
+	      _LT_TAGVAR(archive_cmds, $1)='tpldir=Template.dir~
+		rm -rf $tpldir~
+		$CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~
+		$CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib'
+	      _LT_TAGVAR(archive_expsym_cmds, $1)='tpldir=Template.dir~
+		rm -rf $tpldir~
+		$CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~
+		$CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib'
+	      ;;
+	    *) # Version 6 and above use weak symbols
+	      _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib'
+	      _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib'
+	      ;;
+	    esac
+
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir'
+	    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
+	    _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+            ;;
+	  cxx*)
+	    # Compaq C++
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname  -o $lib ${wl}-retain-symbols-file $wl$export_symbols'
+
+	    runpath_var=LD_RUN_PATH
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir'
+	    _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+
+	    # Commands to make compiler produce verbose output that lists
+	    # what "hidden" libraries, object files and flags are used when
+	    # linking a shared library.
+	    #
+	    # There doesn't appear to be a way to prevent this compiler from
+	    # explicitly linking system object files so we need to strip them
+	    # from the output so that they don't get included in the library
+	    # dependencies.
+	    output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed'
+	    ;;
+	  xl* | mpixl* | bgxl*)
+	    # IBM XL 8.0 on PPC, with GNU ld
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+	    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+	    if test "x$supports_anon_versioning" = xyes; then
+	      _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~
+		cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+		echo "local: *; };" >> $output_objdir/$libname.ver~
+		$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'
+	    fi
+	    ;;
+	  *)
+	    case `$CC -V 2>&1 | sed 5q` in
+	    *Sun\ C*)
+	      # Sun C++ 5.9
+	      _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs'
+	      _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	      _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols'
+	      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+	      _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
+	      _LT_TAGVAR(compiler_needs_object, $1)=yes
+
+	      # Not sure whether something based on
+	      # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1
+	      # would be better.
+	      output_verbose_link_cmd='func_echo_all'
+
+	      # Archives containing C++ object files must be created using
+	      # "CC -xar", where "CC" is the Sun C++ compiler.  This is
+	      # necessary to make sure instantiated templates are included
+	      # in the archive.
+	      _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs'
+	      ;;
+	    esac
+	    ;;
+	esac
+	;;
+
+      lynxos*)
+        # FIXME: insert proper C++ library support
+	_LT_TAGVAR(ld_shlibs, $1)=no
+	;;
+
+      m88k*)
+        # FIXME: insert proper C++ library support
+        _LT_TAGVAR(ld_shlibs, $1)=no
+	;;
+
+      mvs*)
+        case $cc_basename in
+          cxx*)
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+	  *)
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+	esac
+	;;
+
+      netbsd*)
+        if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+	  _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable  -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags'
+	  wlarc=
+	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+	  _LT_TAGVAR(hardcode_direct, $1)=yes
+	  _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+	fi
+	# Workaround some broken pre-1.5 toolchains
+	output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"'
+	;;
+
+      *nto* | *qnx*)
+        _LT_TAGVAR(ld_shlibs, $1)=yes
+	;;
+
+      openbsd2*)
+        # C++ shared libraries are fairly broken
+	_LT_TAGVAR(ld_shlibs, $1)=no
+	;;
+
+      openbsd*)
+	if test -f /usr/libexec/ld.so; then
+	  _LT_TAGVAR(hardcode_direct, $1)=yes
+	  _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+	  _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'
+	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+	  if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib'
+	    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+	    _LT_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+	  fi
+	  output_verbose_link_cmd=func_echo_all
+	else
+	  _LT_TAGVAR(ld_shlibs, $1)=no
+	fi
+	;;
+
+      osf3* | osf4* | osf5*)
+        case $cc_basename in
+          KCC*)
+	    # Kuck and Associates, Inc. (KAI) C++ Compiler
+
+	    # KCC will only create a shared library if the output file
+	    # ends with ".so" (or ".sl" for HP-UX), so rename the library
+	    # to its proper name (with version) after linking.
+	    _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
+
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+	    _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+
+	    # Archives containing C++ object files must be created using
+	    # the KAI C++ compiler.
+	    case $host in
+	      osf3*) _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;;
+	      *) _LT_TAGVAR(old_archive_cmds, $1)='$CC -o $oldlib $oldobjs' ;;
+	    esac
+	    ;;
+          RCC*)
+	    # Rational C++ 2.4.1
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+          cxx*)
+	    case $host in
+	      osf3*)
+	        _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && func_echo_all "${wl}-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
+	        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+		;;
+	      *)
+	        _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*'
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib'
+	        _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~
+	          echo "-hidden">> $lib.exp~
+	          $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname ${wl}-input ${wl}$lib.exp  `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry ${output_objdir}/so_locations -o $lib~
+	          $RM $lib.exp'
+	        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir'
+		;;
+	    esac
+
+	    _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+
+	    # Commands to make compiler produce verbose output that lists
+	    # what "hidden" libraries, object files and flags are used when
+	    # linking a shared library.
+	    #
+	    # There doesn't appear to be a way to prevent this compiler from
+	    # explicitly linking system object files so we need to strip them
+	    # from the output so that they don't get included in the library
+	    # dependencies.
+	    output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
+	    ;;
+	  *)
+	    if test "$GXX" = yes && test "$with_gnu_ld" = no; then
+	      _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
+	      case $host in
+	        osf3*)
+	          _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+		  ;;
+	        *)
+	          _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && func_echo_all "${wl}-set_version ${wl}$verstring"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+		  ;;
+	      esac
+
+	      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+	      _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+
+	      # Commands to make compiler produce verbose output that lists
+	      # what "hidden" libraries, object files and flags are used when
+	      # linking a shared library.
+	      output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
+
+	    else
+	      # FIXME: insert proper C++ library support
+	      _LT_TAGVAR(ld_shlibs, $1)=no
+	    fi
+	    ;;
+        esac
+        ;;
+
+      psos*)
+        # FIXME: insert proper C++ library support
+        _LT_TAGVAR(ld_shlibs, $1)=no
+        ;;
+
+      sunos4*)
+        case $cc_basename in
+          CC*)
+	    # Sun C++ 4.x
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+          lcc*)
+	    # Lucid
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+          *)
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+        esac
+        ;;
+
+      solaris*)
+        case $cc_basename in
+          CC* | sunCC*)
+	    # Sun C++ 4.2, 5.x and Centerline C++
+            _LT_TAGVAR(archive_cmds_need_lc,$1)=yes
+	    _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs'
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag}  -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+	      $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
+
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+	    _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+	    case $host_os in
+	      solaris2.[[0-5]] | solaris2.[[0-5]].*) ;;
+	      *)
+		# The compiler driver will combine and reorder linker options,
+		# but understands `-z linker_flag'.
+	        # Supported since Solaris 2.6 (maybe 2.5.1?)
+		_LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract'
+	        ;;
+	    esac
+	    _LT_TAGVAR(link_all_deplibs, $1)=yes
+
+	    output_verbose_link_cmd='func_echo_all'
+
+	    # Archives containing C++ object files must be created using
+	    # "CC -xar", where "CC" is the Sun C++ compiler.  This is
+	    # necessary to make sure instantiated templates are included
+	    # in the archive.
+	    _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs'
+	    ;;
+          gcx*)
+	    # Green Hills C++ Compiler
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
+
+	    # The C++ compiler must be used to create the archive.
+	    _LT_TAGVAR(old_archive_cmds, $1)='$CC $LDFLAGS -archive -o $oldlib $oldobjs'
+	    ;;
+          *)
+	    # GNU C++ compiler with Solaris linker
+	    if test "$GXX" = yes && test "$with_gnu_ld" = no; then
+	      _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-z ${wl}defs'
+	      if $CC --version | $GREP -v '^2\.7' > /dev/null; then
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
+	        _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+		  $CC -shared $pic_flag -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
+
+	        # Commands to make compiler produce verbose output that lists
+	        # what "hidden" libraries, object files and flags are used when
+	        # linking a shared library.
+	        output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
+	      else
+	        # g++ 2.7 appears to require `-G' NOT `-shared' on this
+	        # platform.
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
+	        _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+		  $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
+
+	        # Commands to make compiler produce verbose output that lists
+	        # what "hidden" libraries, object files and flags are used when
+	        # linking a shared library.
+	        output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP "\-L"'
+	      fi
+
+	      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $wl$libdir'
+	      case $host_os in
+		solaris2.[[0-5]] | solaris2.[[0-5]].*) ;;
+		*)
+		  _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract'
+		  ;;
+	      esac
+	    fi
+	    ;;
+        esac
+        ;;
+
+    sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*)
+      _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'
+      _LT_TAGVAR(archive_cmds_need_lc, $1)=no
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      runpath_var='LD_RUN_PATH'
+
+      case $cc_basename in
+        CC*)
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	*)
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+      esac
+      ;;
+
+      sysv5* | sco3.2v5* | sco5v6*)
+	# Note: We can NOT use -z defs as we might desire, because we do not
+	# link with -lc, and that would cause any symbols used from libc to
+	# always be unresolved, which means just about no library would
+	# ever link correctly.  If we're not using GNU ld we use -z text
+	# though, which does catch some bad symbols but isn't as heavy-handed
+	# as -z defs.
+	_LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'
+	_LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs'
+	_LT_TAGVAR(archive_cmds_need_lc, $1)=no
+	_LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir'
+	_LT_TAGVAR(hardcode_libdir_separator, $1)=':'
+	_LT_TAGVAR(link_all_deplibs, $1)=yes
+	_LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport'
+	runpath_var='LD_RUN_PATH'
+
+	case $cc_basename in
+          CC*)
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	    _LT_TAGVAR(old_archive_cmds, $1)='$CC -Tprelink_objects $oldobjs~
+	      '"$_LT_TAGVAR(old_archive_cmds, $1)"
+	    _LT_TAGVAR(reload_cmds, $1)='$CC -Tprelink_objects $reload_objs~
+	      '"$_LT_TAGVAR(reload_cmds, $1)"
+	    ;;
+	  *)
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	    ;;
+	esac
+      ;;
+
+      tandem*)
+        case $cc_basename in
+          NCC*)
+	    # NonStop-UX NCC 3.20
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+          *)
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+        esac
+        ;;
+
+      vxworks*)
+        # FIXME: insert proper C++ library support
+        _LT_TAGVAR(ld_shlibs, $1)=no
+        ;;
+
+      *)
+        # FIXME: insert proper C++ library support
+        _LT_TAGVAR(ld_shlibs, $1)=no
+        ;;
+    esac
+
+    AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)])
+    test "$_LT_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no
+
+    _LT_TAGVAR(GCC, $1)="$GXX"
+    _LT_TAGVAR(LD, $1)="$LD"
+
+    ## CAVEAT EMPTOR:
+    ## There is no encapsulation within the following macros, do not change
+    ## the running order or otherwise move them around unless you know exactly
+    ## what you are doing...
+    _LT_SYS_HIDDEN_LIBDEPS($1)
+    _LT_COMPILER_PIC($1)
+    _LT_COMPILER_C_O($1)
+    _LT_COMPILER_FILE_LOCKS($1)
+    _LT_LINKER_SHLIBS($1)
+    _LT_SYS_DYNAMIC_LINKER($1)
+    _LT_LINKER_HARDCODE_LIBPATH($1)
+
+    _LT_CONFIG($1)
+  fi # test -n "$compiler"
+
+  CC=$lt_save_CC
+  CFLAGS=$lt_save_CFLAGS
+  LDCXX=$LD
+  LD=$lt_save_LD
+  GCC=$lt_save_GCC
+  with_gnu_ld=$lt_save_with_gnu_ld
+  lt_cv_path_LDCXX=$lt_cv_path_LD
+  lt_cv_path_LD=$lt_save_path_LD
+  lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld
+  lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld
+fi # test "$_lt_caught_CXX_error" != yes
+
+AC_LANG_POP
+])# _LT_LANG_CXX_CONFIG
+
+
+# _LT_FUNC_STRIPNAME_CNF
+# ----------------------
+# func_stripname_cnf prefix suffix name
+# strip PREFIX and SUFFIX off of NAME.
+# PREFIX and SUFFIX must not contain globbing or regex special
+# characters, hashes, percent signs, but SUFFIX may contain a leading
+# dot (in which case that matches only a dot).
+#
+# This function is identical to the (non-XSI) version of func_stripname,
+# except this one can be used by m4 code that may be executed by configure,
+# rather than the libtool script.
+m4_defun([_LT_FUNC_STRIPNAME_CNF],[dnl
+AC_REQUIRE([_LT_DECL_SED])
+AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])
+func_stripname_cnf ()
+{
+  case ${2} in
+  .*) func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%\\\\${2}\$%%"`;;
+  *)  func_stripname_result=`$ECHO "${3}" | $SED "s%^${1}%%; s%${2}\$%%"`;;
+  esac
+} # func_stripname_cnf
+])# _LT_FUNC_STRIPNAME_CNF
+
+# _LT_SYS_HIDDEN_LIBDEPS([TAGNAME])
+# ---------------------------------
+# Figure out "hidden" library dependencies from verbose
+# compiler output when linking a shared library.
+# Parse the compiler output and extract the necessary
+# objects, libraries and library flags.
+m4_defun([_LT_SYS_HIDDEN_LIBDEPS],
+[m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+AC_REQUIRE([_LT_FUNC_STRIPNAME_CNF])dnl
+# Dependencies to place before and after the object being linked:
+_LT_TAGVAR(predep_objects, $1)=
+_LT_TAGVAR(postdep_objects, $1)=
+_LT_TAGVAR(predeps, $1)=
+_LT_TAGVAR(postdeps, $1)=
+_LT_TAGVAR(compiler_lib_search_path, $1)=
+
+dnl we can't use the lt_simple_compile_test_code here,
+dnl because it contains code intended for an executable,
+dnl not a library.  It's possible we should let each
+dnl tag define a new lt_????_link_test_code variable,
+dnl but it's only used here...
+m4_if([$1], [], [cat > conftest.$ac_ext <<_LT_EOF
+int a;
+void foo (void) { a = 0; }
+_LT_EOF
+], [$1], [CXX], [cat > conftest.$ac_ext <<_LT_EOF
+class Foo
+{
+public:
+  Foo (void) { a = 0; }
+private:
+  int a;
+};
+_LT_EOF
+], [$1], [F77], [cat > conftest.$ac_ext <<_LT_EOF
+      subroutine foo
+      implicit none
+      integer*4 a
+      a=0
+      return
+      end
+_LT_EOF
+], [$1], [FC], [cat > conftest.$ac_ext <<_LT_EOF
+      subroutine foo
+      implicit none
+      integer a
+      a=0
+      return
+      end
+_LT_EOF
+], [$1], [GCJ], [cat > conftest.$ac_ext <<_LT_EOF
+public class foo {
+  private int a;
+  public void bar (void) {
+    a = 0;
+  }
+};
+_LT_EOF
+], [$1], [GO], [cat > conftest.$ac_ext <<_LT_EOF
+package foo
+func foo() {
+}
+_LT_EOF
+])
+
+_lt_libdeps_save_CFLAGS=$CFLAGS
+case "$CC $CFLAGS " in #(
+*\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;;
+*\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;;
+*\ -fuse-linker-plugin*\ *) CFLAGS="$CFLAGS -fno-use-linker-plugin" ;;
+esac
+
+dnl Parse the compiler output and extract the necessary
+dnl objects, libraries and library flags.
+if AC_TRY_EVAL(ac_compile); then
+  # Parse the compiler output and extract the necessary
+  # objects, libraries and library flags.
+
+  # Sentinel used to keep track of whether or not we are before
+  # the conftest object file.
+  pre_test_object_deps_done=no
+
+  for p in `eval "$output_verbose_link_cmd"`; do
+    case ${prev}${p} in
+
+    -L* | -R* | -l*)
+       # Some compilers place space between "-{L,R}" and the path.
+       # Remove the space.
+       if test $p = "-L" ||
+          test $p = "-R"; then
+	 prev=$p
+	 continue
+       fi
+
+       # Expand the sysroot to ease extracting the directories later.
+       if test -z "$prev"; then
+         case $p in
+         -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;;
+         -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;;
+         -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;;
+         esac
+       fi
+       case $p in
+       =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;;
+       esac
+       if test "$pre_test_object_deps_done" = no; then
+	 case ${prev} in
+	 -L | -R)
+	   # Internal compiler library paths should come after those
+	   # provided the user.  The postdeps already come after the
+	   # user supplied libs so there is no need to process them.
+	   if test -z "$_LT_TAGVAR(compiler_lib_search_path, $1)"; then
+	     _LT_TAGVAR(compiler_lib_search_path, $1)="${prev}${p}"
+	   else
+	     _LT_TAGVAR(compiler_lib_search_path, $1)="${_LT_TAGVAR(compiler_lib_search_path, $1)} ${prev}${p}"
+	   fi
+	   ;;
+	 # The "-l" case would never come before the object being
+	 # linked, so don't bother handling this case.
+	 esac
+       else
+	 if test -z "$_LT_TAGVAR(postdeps, $1)"; then
+	   _LT_TAGVAR(postdeps, $1)="${prev}${p}"
+	 else
+	   _LT_TAGVAR(postdeps, $1)="${_LT_TAGVAR(postdeps, $1)} ${prev}${p}"
+	 fi
+       fi
+       prev=
+       ;;
+
+    *.lto.$objext) ;; # Ignore GCC LTO objects
+    *.$objext)
+       # This assumes that the test object file only shows up
+       # once in the compiler output.
+       if test "$p" = "conftest.$objext"; then
+	 pre_test_object_deps_done=yes
+	 continue
+       fi
+
+       if test "$pre_test_object_deps_done" = no; then
+	 if test -z "$_LT_TAGVAR(predep_objects, $1)"; then
+	   _LT_TAGVAR(predep_objects, $1)="$p"
+	 else
+	   _LT_TAGVAR(predep_objects, $1)="$_LT_TAGVAR(predep_objects, $1) $p"
+	 fi
+       else
+	 if test -z "$_LT_TAGVAR(postdep_objects, $1)"; then
+	   _LT_TAGVAR(postdep_objects, $1)="$p"
+	 else
+	   _LT_TAGVAR(postdep_objects, $1)="$_LT_TAGVAR(postdep_objects, $1) $p"
+	 fi
+       fi
+       ;;
+
+    *) ;; # Ignore the rest.
+
+    esac
+  done
+
+  # Clean up.
+  rm -f a.out a.exe
+else
+  echo "libtool.m4: error: problem compiling $1 test program"
+fi
+
+$RM -f confest.$objext
+CFLAGS=$_lt_libdeps_save_CFLAGS
+
+# PORTME: override above test on systems where it is broken
+m4_if([$1], [CXX],
+[case $host_os in
+interix[[3-9]]*)
+  # Interix 3.5 installs completely hosed .la files for C++, so rather than
+  # hack all around it, let's just trust "g++" to DTRT.
+  _LT_TAGVAR(predep_objects,$1)=
+  _LT_TAGVAR(postdep_objects,$1)=
+  _LT_TAGVAR(postdeps,$1)=
+  ;;
+
+linux*)
+  case `$CC -V 2>&1 | sed 5q` in
+  *Sun\ C*)
+    # Sun C++ 5.9
+
+    # The more standards-conforming stlport4 library is
+    # incompatible with the Cstd library. Avoid specifying
+    # it if it's in CXXFLAGS. Ignore libCrun as
+    # -library=stlport4 depends on it.
+    case " $CXX $CXXFLAGS " in
+    *" -library=stlport4 "*)
+      solaris_use_stlport4=yes
+      ;;
+    esac
+
+    if test "$solaris_use_stlport4" != yes; then
+      _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun'
+    fi
+    ;;
+  esac
+  ;;
+
+solaris*)
+  case $cc_basename in
+  CC* | sunCC*)
+    # The more standards-conforming stlport4 library is
+    # incompatible with the Cstd library. Avoid specifying
+    # it if it's in CXXFLAGS. Ignore libCrun as
+    # -library=stlport4 depends on it.
+    case " $CXX $CXXFLAGS " in
+    *" -library=stlport4 "*)
+      solaris_use_stlport4=yes
+      ;;
+    esac
+
+    # Adding this requires a known-good setup of shared libraries for
+    # Sun compiler versions before 5.6, else PIC objects from an old
+    # archive will be linked into the output, leading to subtle bugs.
+    if test "$solaris_use_stlport4" != yes; then
+      _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun'
+    fi
+    ;;
+  esac
+  ;;
+esac
+])
+
+case " $_LT_TAGVAR(postdeps, $1) " in
+*" -lc "*) _LT_TAGVAR(archive_cmds_need_lc, $1)=no ;;
+esac
+ _LT_TAGVAR(compiler_lib_search_dirs, $1)=
+if test -n "${_LT_TAGVAR(compiler_lib_search_path, $1)}"; then
+ _LT_TAGVAR(compiler_lib_search_dirs, $1)=`echo " ${_LT_TAGVAR(compiler_lib_search_path, $1)}" | ${SED} -e 's! -L! !g' -e 's!^ !!'`
+fi
+_LT_TAGDECL([], [compiler_lib_search_dirs], [1],
+    [The directories searched by this compiler when creating a shared library])
+_LT_TAGDECL([], [predep_objects], [1],
+    [Dependencies to place before and after the objects being linked to
+    create a shared library])
+_LT_TAGDECL([], [postdep_objects], [1])
+_LT_TAGDECL([], [predeps], [1])
+_LT_TAGDECL([], [postdeps], [1])
+_LT_TAGDECL([], [compiler_lib_search_path], [1],
+    [The library search path used internally by the compiler when linking
+    a shared library])
+])# _LT_SYS_HIDDEN_LIBDEPS
+
+
+# _LT_LANG_F77_CONFIG([TAG])
+# --------------------------
+# Ensure that the configuration variables for a Fortran 77 compiler are
+# suitably defined.  These variables are subsequently used by _LT_CONFIG
+# to write the compiler configuration to `libtool'.
+m4_defun([_LT_LANG_F77_CONFIG],
+[AC_LANG_PUSH(Fortran 77)
+if test -z "$F77" || test "X$F77" = "Xno"; then
+  _lt_disable_F77=yes
+fi
+
+_LT_TAGVAR(archive_cmds_need_lc, $1)=no
+_LT_TAGVAR(allow_undefined_flag, $1)=
+_LT_TAGVAR(always_export_symbols, $1)=no
+_LT_TAGVAR(archive_expsym_cmds, $1)=
+_LT_TAGVAR(export_dynamic_flag_spec, $1)=
+_LT_TAGVAR(hardcode_direct, $1)=no
+_LT_TAGVAR(hardcode_direct_absolute, $1)=no
+_LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
+_LT_TAGVAR(hardcode_libdir_separator, $1)=
+_LT_TAGVAR(hardcode_minus_L, $1)=no
+_LT_TAGVAR(hardcode_automatic, $1)=no
+_LT_TAGVAR(inherit_rpath, $1)=no
+_LT_TAGVAR(module_cmds, $1)=
+_LT_TAGVAR(module_expsym_cmds, $1)=
+_LT_TAGVAR(link_all_deplibs, $1)=unknown
+_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
+_LT_TAGVAR(reload_flag, $1)=$reload_flag
+_LT_TAGVAR(reload_cmds, $1)=$reload_cmds
+_LT_TAGVAR(no_undefined_flag, $1)=
+_LT_TAGVAR(whole_archive_flag_spec, $1)=
+_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no
+
+# Source file extension for f77 test sources.
+ac_ext=f
+
+# Object file extension for compiled f77 test sources.
+objext=o
+_LT_TAGVAR(objext, $1)=$objext
+
+# No sense in running all these tests if we already determined that
+# the F77 compiler isn't working.  Some variables (like enable_shared)
+# are currently assumed to apply to all compilers on this platform,
+# and will be corrupted by setting them based on a non-working compiler.
+if test "$_lt_disable_F77" != yes; then
+  # Code to be used in simple compile tests
+  lt_simple_compile_test_code="\
+      subroutine t
+      return
+      end
+"
+
+  # Code to be used in simple link tests
+  lt_simple_link_test_code="\
+      program t
+      end
+"
+
+  # ltmain only uses $CC for tagged configurations so make sure $CC is set.
+  _LT_TAG_COMPILER
+
+  # save warnings/boilerplate of simple test code
+  _LT_COMPILER_BOILERPLATE
+  _LT_LINKER_BOILERPLATE
+
+  # Allow CC to be a program name with arguments.
+  lt_save_CC="$CC"
+  lt_save_GCC=$GCC
+  lt_save_CFLAGS=$CFLAGS
+  CC=${F77-"f77"}
+  CFLAGS=$FFLAGS
+  compiler=$CC
+  _LT_TAGVAR(compiler, $1)=$CC
+  _LT_CC_BASENAME([$compiler])
+  GCC=$G77
+  if test -n "$compiler"; then
+    AC_MSG_CHECKING([if libtool supports shared libraries])
+    AC_MSG_RESULT([$can_build_shared])
+
+    AC_MSG_CHECKING([whether to build shared libraries])
+    test "$can_build_shared" = "no" && enable_shared=no
+
+    # On AIX, shared libraries and static libraries use the same namespace, and
+    # are all built from PIC.
+    case $host_os in
+      aix3*)
+        test "$enable_shared" = yes && enable_static=no
+        if test -n "$RANLIB"; then
+          archive_cmds="$archive_cmds~\$RANLIB \$lib"
+          postinstall_cmds='$RANLIB $lib'
+        fi
+        ;;
+      aix[[4-9]]*)
+	if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then
+	  test "$enable_shared" = yes && enable_static=no
+	fi
+        ;;
+    esac
+    AC_MSG_RESULT([$enable_shared])
+
+    AC_MSG_CHECKING([whether to build static libraries])
+    # Make sure either enable_shared or enable_static is yes.
+    test "$enable_shared" = yes || enable_static=yes
+    AC_MSG_RESULT([$enable_static])
+
+    _LT_TAGVAR(GCC, $1)="$G77"
+    _LT_TAGVAR(LD, $1)="$LD"
+
+    ## CAVEAT EMPTOR:
+    ## There is no encapsulation within the following macros, do not change
+    ## the running order or otherwise move them around unless you know exactly
+    ## what you are doing...
+    _LT_COMPILER_PIC($1)
+    _LT_COMPILER_C_O($1)
+    _LT_COMPILER_FILE_LOCKS($1)
+    _LT_LINKER_SHLIBS($1)
+    _LT_SYS_DYNAMIC_LINKER($1)
+    _LT_LINKER_HARDCODE_LIBPATH($1)
+
+    _LT_CONFIG($1)
+  fi # test -n "$compiler"
+
+  GCC=$lt_save_GCC
+  CC="$lt_save_CC"
+  CFLAGS="$lt_save_CFLAGS"
+fi # test "$_lt_disable_F77" != yes
+
+AC_LANG_POP
+])# _LT_LANG_F77_CONFIG
+
+
+# _LT_LANG_FC_CONFIG([TAG])
+# -------------------------
+# Ensure that the configuration variables for a Fortran compiler are
+# suitably defined.  These variables are subsequently used by _LT_CONFIG
+# to write the compiler configuration to `libtool'.
+m4_defun([_LT_LANG_FC_CONFIG],
+[AC_LANG_PUSH(Fortran)
+
+if test -z "$FC" || test "X$FC" = "Xno"; then
+  _lt_disable_FC=yes
+fi
+
+_LT_TAGVAR(archive_cmds_need_lc, $1)=no
+_LT_TAGVAR(allow_undefined_flag, $1)=
+_LT_TAGVAR(always_export_symbols, $1)=no
+_LT_TAGVAR(archive_expsym_cmds, $1)=
+_LT_TAGVAR(export_dynamic_flag_spec, $1)=
+_LT_TAGVAR(hardcode_direct, $1)=no
+_LT_TAGVAR(hardcode_direct_absolute, $1)=no
+_LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
+_LT_TAGVAR(hardcode_libdir_separator, $1)=
+_LT_TAGVAR(hardcode_minus_L, $1)=no
+_LT_TAGVAR(hardcode_automatic, $1)=no
+_LT_TAGVAR(inherit_rpath, $1)=no
+_LT_TAGVAR(module_cmds, $1)=
+_LT_TAGVAR(module_expsym_cmds, $1)=
+_LT_TAGVAR(link_all_deplibs, $1)=unknown
+_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
+_LT_TAGVAR(reload_flag, $1)=$reload_flag
+_LT_TAGVAR(reload_cmds, $1)=$reload_cmds
+_LT_TAGVAR(no_undefined_flag, $1)=
+_LT_TAGVAR(whole_archive_flag_spec, $1)=
+_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no
+
+# Source file extension for fc test sources.
+ac_ext=${ac_fc_srcext-f}
+
+# Object file extension for compiled fc test sources.
+objext=o
+_LT_TAGVAR(objext, $1)=$objext
+
+# No sense in running all these tests if we already determined that
+# the FC compiler isn't working.  Some variables (like enable_shared)
+# are currently assumed to apply to all compilers on this platform,
+# and will be corrupted by setting them based on a non-working compiler.
+if test "$_lt_disable_FC" != yes; then
+  # Code to be used in simple compile tests
+  lt_simple_compile_test_code="\
+      subroutine t
+      return
+      end
+"
+
+  # Code to be used in simple link tests
+  lt_simple_link_test_code="\
+      program t
+      end
+"
+
+  # ltmain only uses $CC for tagged configurations so make sure $CC is set.
+  _LT_TAG_COMPILER
+
+  # save warnings/boilerplate of simple test code
+  _LT_COMPILER_BOILERPLATE
+  _LT_LINKER_BOILERPLATE
+
+  # Allow CC to be a program name with arguments.
+  lt_save_CC="$CC"
+  lt_save_GCC=$GCC
+  lt_save_CFLAGS=$CFLAGS
+  CC=${FC-"f95"}
+  CFLAGS=$FCFLAGS
+  compiler=$CC
+  GCC=$ac_cv_fc_compiler_gnu
+
+  _LT_TAGVAR(compiler, $1)=$CC
+  _LT_CC_BASENAME([$compiler])
+
+  if test -n "$compiler"; then
+    AC_MSG_CHECKING([if libtool supports shared libraries])
+    AC_MSG_RESULT([$can_build_shared])
+
+    AC_MSG_CHECKING([whether to build shared libraries])
+    test "$can_build_shared" = "no" && enable_shared=no
+
+    # On AIX, shared libraries and static libraries use the same namespace, and
+    # are all built from PIC.
+    case $host_os in
+      aix3*)
+        test "$enable_shared" = yes && enable_static=no
+        if test -n "$RANLIB"; then
+          archive_cmds="$archive_cmds~\$RANLIB \$lib"
+          postinstall_cmds='$RANLIB $lib'
+        fi
+        ;;
+      aix[[4-9]]*)
+	if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then
+	  test "$enable_shared" = yes && enable_static=no
+	fi
+        ;;
+    esac
+    AC_MSG_RESULT([$enable_shared])
+
+    AC_MSG_CHECKING([whether to build static libraries])
+    # Make sure either enable_shared or enable_static is yes.
+    test "$enable_shared" = yes || enable_static=yes
+    AC_MSG_RESULT([$enable_static])
+
+    _LT_TAGVAR(GCC, $1)="$ac_cv_fc_compiler_gnu"
+    _LT_TAGVAR(LD, $1)="$LD"
+
+    ## CAVEAT EMPTOR:
+    ## There is no encapsulation within the following macros, do not change
+    ## the running order or otherwise move them around unless you know exactly
+    ## what you are doing...
+    _LT_SYS_HIDDEN_LIBDEPS($1)
+    _LT_COMPILER_PIC($1)
+    _LT_COMPILER_C_O($1)
+    _LT_COMPILER_FILE_LOCKS($1)
+    _LT_LINKER_SHLIBS($1)
+    _LT_SYS_DYNAMIC_LINKER($1)
+    _LT_LINKER_HARDCODE_LIBPATH($1)
+
+    _LT_CONFIG($1)
+  fi # test -n "$compiler"
+
+  GCC=$lt_save_GCC
+  CC=$lt_save_CC
+  CFLAGS=$lt_save_CFLAGS
+fi # test "$_lt_disable_FC" != yes
+
+AC_LANG_POP
+])# _LT_LANG_FC_CONFIG
+
+
+# _LT_LANG_GCJ_CONFIG([TAG])
+# --------------------------
+# Ensure that the configuration variables for the GNU Java Compiler compiler
+# are suitably defined.  These variables are subsequently used by _LT_CONFIG
+# to write the compiler configuration to `libtool'.
+m4_defun([_LT_LANG_GCJ_CONFIG],
+[AC_REQUIRE([LT_PROG_GCJ])dnl
+AC_LANG_SAVE
+
+# Source file extension for Java test sources.
+ac_ext=java
+
+# Object file extension for compiled Java test sources.
+objext=o
+_LT_TAGVAR(objext, $1)=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code="class foo {}"
+
+# Code to be used in simple link tests
+lt_simple_link_test_code='public class conftest { public static void main(String[[]] argv) {}; }'
+
+# ltmain only uses $CC for tagged configurations so make sure $CC is set.
+_LT_TAG_COMPILER
+
+# save warnings/boilerplate of simple test code
+_LT_COMPILER_BOILERPLATE
+_LT_LINKER_BOILERPLATE
+
+# Allow CC to be a program name with arguments.
+lt_save_CC=$CC
+lt_save_CFLAGS=$CFLAGS
+lt_save_GCC=$GCC
+GCC=yes
+CC=${GCJ-"gcj"}
+CFLAGS=$GCJFLAGS
+compiler=$CC
+_LT_TAGVAR(compiler, $1)=$CC
+_LT_TAGVAR(LD, $1)="$LD"
+_LT_CC_BASENAME([$compiler])
+
+# GCJ did not exist at the time GCC didn't implicitly link libc in.
+_LT_TAGVAR(archive_cmds_need_lc, $1)=no
+
+_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
+_LT_TAGVAR(reload_flag, $1)=$reload_flag
+_LT_TAGVAR(reload_cmds, $1)=$reload_cmds
+
+## CAVEAT EMPTOR:
+## There is no encapsulation within the following macros, do not change
+## the running order or otherwise move them around unless you know exactly
+## what you are doing...
+if test -n "$compiler"; then
+  _LT_COMPILER_NO_RTTI($1)
+  _LT_COMPILER_PIC($1)
+  _LT_COMPILER_C_O($1)
+  _LT_COMPILER_FILE_LOCKS($1)
+  _LT_LINKER_SHLIBS($1)
+  _LT_LINKER_HARDCODE_LIBPATH($1)
+
+  _LT_CONFIG($1)
+fi
+
+AC_LANG_RESTORE
+
+GCC=$lt_save_GCC
+CC=$lt_save_CC
+CFLAGS=$lt_save_CFLAGS
+])# _LT_LANG_GCJ_CONFIG
+
+
+# _LT_LANG_GO_CONFIG([TAG])
+# --------------------------
+# Ensure that the configuration variables for the GNU Go compiler
+# are suitably defined.  These variables are subsequently used by _LT_CONFIG
+# to write the compiler configuration to `libtool'.
+m4_defun([_LT_LANG_GO_CONFIG],
+[AC_REQUIRE([LT_PROG_GO])dnl
+AC_LANG_SAVE
+
+# Source file extension for Go test sources.
+ac_ext=go
+
+# Object file extension for compiled Go test sources.
+objext=o
+_LT_TAGVAR(objext, $1)=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code="package main; func main() { }"
+
+# Code to be used in simple link tests
+lt_simple_link_test_code='package main; func main() { }'
+
+# ltmain only uses $CC for tagged configurations so make sure $CC is set.
+_LT_TAG_COMPILER
+
+# save warnings/boilerplate of simple test code
+_LT_COMPILER_BOILERPLATE
+_LT_LINKER_BOILERPLATE
+
+# Allow CC to be a program name with arguments.
+lt_save_CC=$CC
+lt_save_CFLAGS=$CFLAGS
+lt_save_GCC=$GCC
+GCC=yes
+CC=${GOC-"gccgo"}
+CFLAGS=$GOFLAGS
+compiler=$CC
+_LT_TAGVAR(compiler, $1)=$CC
+_LT_TAGVAR(LD, $1)="$LD"
+_LT_CC_BASENAME([$compiler])
+
+# Go did not exist at the time GCC didn't implicitly link libc in.
+_LT_TAGVAR(archive_cmds_need_lc, $1)=no
+
+_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
+_LT_TAGVAR(reload_flag, $1)=$reload_flag
+_LT_TAGVAR(reload_cmds, $1)=$reload_cmds
+
+## CAVEAT EMPTOR:
+## There is no encapsulation within the following macros, do not change
+## the running order or otherwise move them around unless you know exactly
+## what you are doing...
+if test -n "$compiler"; then
+  _LT_COMPILER_NO_RTTI($1)
+  _LT_COMPILER_PIC($1)
+  _LT_COMPILER_C_O($1)
+  _LT_COMPILER_FILE_LOCKS($1)
+  _LT_LINKER_SHLIBS($1)
+  _LT_LINKER_HARDCODE_LIBPATH($1)
+
+  _LT_CONFIG($1)
+fi
+
+AC_LANG_RESTORE
+
+GCC=$lt_save_GCC
+CC=$lt_save_CC
+CFLAGS=$lt_save_CFLAGS
+])# _LT_LANG_GO_CONFIG
+
+
+# _LT_LANG_RC_CONFIG([TAG])
+# -------------------------
+# Ensure that the configuration variables for the Windows resource compiler
+# are suitably defined.  These variables are subsequently used by _LT_CONFIG
+# to write the compiler configuration to `libtool'.
+m4_defun([_LT_LANG_RC_CONFIG],
+[AC_REQUIRE([LT_PROG_RC])dnl
+AC_LANG_SAVE
+
+# Source file extension for RC test sources.
+ac_ext=rc
+
+# Object file extension for compiled RC test sources.
+objext=o
+_LT_TAGVAR(objext, $1)=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }'
+
+# Code to be used in simple link tests
+lt_simple_link_test_code="$lt_simple_compile_test_code"
+
+# ltmain only uses $CC for tagged configurations so make sure $CC is set.
+_LT_TAG_COMPILER
+
+# save warnings/boilerplate of simple test code
+_LT_COMPILER_BOILERPLATE
+_LT_LINKER_BOILERPLATE
+
+# Allow CC to be a program name with arguments.
+lt_save_CC="$CC"
+lt_save_CFLAGS=$CFLAGS
+lt_save_GCC=$GCC
+GCC=
+CC=${RC-"windres"}
+CFLAGS=
+compiler=$CC
+_LT_TAGVAR(compiler, $1)=$CC
+_LT_CC_BASENAME([$compiler])
+_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes
+
+if test -n "$compiler"; then
+  :
+  _LT_CONFIG($1)
+fi
+
+GCC=$lt_save_GCC
+AC_LANG_RESTORE
+CC=$lt_save_CC
+CFLAGS=$lt_save_CFLAGS
+])# _LT_LANG_RC_CONFIG
+
+
+# LT_PROG_GCJ
+# -----------
+AC_DEFUN([LT_PROG_GCJ],
+[m4_ifdef([AC_PROG_GCJ], [AC_PROG_GCJ],
+  [m4_ifdef([A][M_PROG_GCJ], [A][M_PROG_GCJ],
+    [AC_CHECK_TOOL(GCJ, gcj,)
+      test "x${GCJFLAGS+set}" = xset || GCJFLAGS="-g -O2"
+      AC_SUBST(GCJFLAGS)])])[]dnl
+])
+
+# Old name:
+AU_ALIAS([LT_AC_PROG_GCJ], [LT_PROG_GCJ])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([LT_AC_PROG_GCJ], [])
+
+
+# LT_PROG_GO
+# ----------
+AC_DEFUN([LT_PROG_GO],
+[AC_CHECK_TOOL(GOC, gccgo,)
+])
+
+
+# LT_PROG_RC
+# ----------
+AC_DEFUN([LT_PROG_RC],
+[AC_CHECK_TOOL(RC, windres,)
+])
+
+# Old name:
+AU_ALIAS([LT_AC_PROG_RC], [LT_PROG_RC])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([LT_AC_PROG_RC], [])
+
+
+# _LT_DECL_EGREP
+# --------------
+# If we don't have a new enough Autoconf to choose the best grep
+# available, choose the one first in the user's PATH.
+m4_defun([_LT_DECL_EGREP],
+[AC_REQUIRE([AC_PROG_EGREP])dnl
+AC_REQUIRE([AC_PROG_FGREP])dnl
+test -z "$GREP" && GREP=grep
+_LT_DECL([], [GREP], [1], [A grep program that handles long lines])
+_LT_DECL([], [EGREP], [1], [An ERE matcher])
+_LT_DECL([], [FGREP], [1], [A literal string matcher])
+dnl Non-bleeding-edge autoconf doesn't subst GREP, so do it here too
+AC_SUBST([GREP])
+])
+
+
+# _LT_DECL_OBJDUMP
+# --------------
+# If we don't have a new enough Autoconf to choose the best objdump
+# available, choose the one first in the user's PATH.
+m4_defun([_LT_DECL_OBJDUMP],
+[AC_CHECK_TOOL(OBJDUMP, objdump, false)
+test -z "$OBJDUMP" && OBJDUMP=objdump
+_LT_DECL([], [OBJDUMP], [1], [An object symbol dumper])
+AC_SUBST([OBJDUMP])
+])
+
+# _LT_DECL_DLLTOOL
+# ----------------
+# Ensure DLLTOOL variable is set.
+m4_defun([_LT_DECL_DLLTOOL],
+[AC_CHECK_TOOL(DLLTOOL, dlltool, false)
+test -z "$DLLTOOL" && DLLTOOL=dlltool
+_LT_DECL([], [DLLTOOL], [1], [DLL creation program])
+AC_SUBST([DLLTOOL])
+])
+
+# _LT_DECL_SED
+# ------------
+# Check for a fully-functional sed program, that truncates
+# as few characters as possible.  Prefer GNU sed if found.
+m4_defun([_LT_DECL_SED],
+[AC_PROG_SED
+test -z "$SED" && SED=sed
+Xsed="$SED -e 1s/^X//"
+_LT_DECL([], [SED], [1], [A sed program that does not truncate output])
+_LT_DECL([], [Xsed], ["\$SED -e 1s/^X//"],
+    [Sed that helps us avoid accidentally triggering echo(1) options like -n])
+])# _LT_DECL_SED
+
+m4_ifndef([AC_PROG_SED], [
+############################################################
+# NOTE: This macro has been submitted for inclusion into   #
+#  GNU Autoconf as AC_PROG_SED.  When it is available in   #
+#  a released version of Autoconf we should remove this    #
+#  macro and use it instead.                               #
+############################################################
+
+m4_defun([AC_PROG_SED],
+[AC_MSG_CHECKING([for a sed that does not truncate output])
+AC_CACHE_VAL(lt_cv_path_SED,
+[# Loop through the user's path and test for sed and gsed.
+# Then use that list of sed's as ones to test for truncation.
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for lt_ac_prog in sed gsed; do
+    for ac_exec_ext in '' $ac_executable_extensions; do
+      if $as_executable_p "$as_dir/$lt_ac_prog$ac_exec_ext"; then
+        lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext"
+      fi
+    done
+  done
+done
+IFS=$as_save_IFS
+lt_ac_max=0
+lt_ac_count=0
+# Add /usr/xpg4/bin/sed as it is typically found on Solaris
+# along with /bin/sed that truncates output.
+for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do
+  test ! -f $lt_ac_sed && continue
+  cat /dev/null > conftest.in
+  lt_ac_count=0
+  echo $ECHO_N "0123456789$ECHO_C" >conftest.in
+  # Check for GNU sed and select it if it is found.
+  if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then
+    lt_cv_path_SED=$lt_ac_sed
+    break
+  fi
+  while true; do
+    cat conftest.in conftest.in >conftest.tmp
+    mv conftest.tmp conftest.in
+    cp conftest.in conftest.nl
+    echo >>conftest.nl
+    $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break
+    cmp -s conftest.out conftest.nl || break
+    # 10000 chars as input seems more than enough
+    test $lt_ac_count -gt 10 && break
+    lt_ac_count=`expr $lt_ac_count + 1`
+    if test $lt_ac_count -gt $lt_ac_max; then
+      lt_ac_max=$lt_ac_count
+      lt_cv_path_SED=$lt_ac_sed
+    fi
+  done
+done
+])
+SED=$lt_cv_path_SED
+AC_SUBST([SED])
+AC_MSG_RESULT([$SED])
+])#AC_PROG_SED
+])#m4_ifndef
+
+# Old name:
+AU_ALIAS([LT_AC_PROG_SED], [AC_PROG_SED])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([LT_AC_PROG_SED], [])
+
+
+# _LT_CHECK_SHELL_FEATURES
+# ------------------------
+# Find out whether the shell is Bourne or XSI compatible,
+# or has some other useful features.
+m4_defun([_LT_CHECK_SHELL_FEATURES],
+[AC_MSG_CHECKING([whether the shell understands some XSI constructs])
+# Try some XSI features
+xsi_shell=no
+( _lt_dummy="a/b/c"
+  test "${_lt_dummy##*/},${_lt_dummy%/*},${_lt_dummy#??}"${_lt_dummy%"$_lt_dummy"}, \
+      = c,a/b,b/c, \
+    && eval 'test $(( 1 + 1 )) -eq 2 \
+    && test "${#_lt_dummy}" -eq 5' ) >/dev/null 2>&1 \
+  && xsi_shell=yes
+AC_MSG_RESULT([$xsi_shell])
+_LT_CONFIG_LIBTOOL_INIT([xsi_shell='$xsi_shell'])
+
+AC_MSG_CHECKING([whether the shell understands "+="])
+lt_shell_append=no
+( foo=bar; set foo baz; eval "$[1]+=\$[2]" && test "$foo" = barbaz ) \
+    >/dev/null 2>&1 \
+  && lt_shell_append=yes
+AC_MSG_RESULT([$lt_shell_append])
+_LT_CONFIG_LIBTOOL_INIT([lt_shell_append='$lt_shell_append'])
+
+if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
+  lt_unset=unset
+else
+  lt_unset=false
+fi
+_LT_DECL([], [lt_unset], [0], [whether the shell understands "unset"])dnl
+
+# test EBCDIC or ASCII
+case `echo X|tr X '\101'` in
+ A) # ASCII based system
+    # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr
+  lt_SP2NL='tr \040 \012'
+  lt_NL2SP='tr \015\012 \040\040'
+  ;;
+ *) # EBCDIC based system
+  lt_SP2NL='tr \100 \n'
+  lt_NL2SP='tr \r\n \100\100'
+  ;;
+esac
+_LT_DECL([SP2NL], [lt_SP2NL], [1], [turn spaces into newlines])dnl
+_LT_DECL([NL2SP], [lt_NL2SP], [1], [turn newlines into spaces])dnl
+])# _LT_CHECK_SHELL_FEATURES
+
+
+# _LT_PROG_FUNCTION_REPLACE (FUNCNAME, REPLACEMENT-BODY)
+# ------------------------------------------------------
+# In `$cfgfile', look for function FUNCNAME delimited by `^FUNCNAME ()$' and
+# '^} FUNCNAME ', and replace its body with REPLACEMENT-BODY.
+m4_defun([_LT_PROG_FUNCTION_REPLACE],
+[dnl {
+sed -e '/^$1 ()$/,/^} # $1 /c\
+$1 ()\
+{\
+m4_bpatsubsts([$2], [$], [\\], [^\([	 ]\)], [\\\1])
+} # Extended-shell $1 implementation' "$cfgfile" > $cfgfile.tmp \
+  && mv -f "$cfgfile.tmp" "$cfgfile" \
+    || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+test 0 -eq $? || _lt_function_replace_fail=:
+])
+
+
+# _LT_PROG_REPLACE_SHELLFNS
+# -------------------------
+# Replace existing portable implementations of several shell functions with
+# equivalent extended shell implementations where those features are available..
+m4_defun([_LT_PROG_REPLACE_SHELLFNS],
+[if test x"$xsi_shell" = xyes; then
+  _LT_PROG_FUNCTION_REPLACE([func_dirname], [dnl
+    case ${1} in
+      */*) func_dirname_result="${1%/*}${2}" ;;
+      *  ) func_dirname_result="${3}" ;;
+    esac])
+
+  _LT_PROG_FUNCTION_REPLACE([func_basename], [dnl
+    func_basename_result="${1##*/}"])
+
+  _LT_PROG_FUNCTION_REPLACE([func_dirname_and_basename], [dnl
+    case ${1} in
+      */*) func_dirname_result="${1%/*}${2}" ;;
+      *  ) func_dirname_result="${3}" ;;
+    esac
+    func_basename_result="${1##*/}"])
+
+  _LT_PROG_FUNCTION_REPLACE([func_stripname], [dnl
+    # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are
+    # positional parameters, so assign one to ordinary parameter first.
+    func_stripname_result=${3}
+    func_stripname_result=${func_stripname_result#"${1}"}
+    func_stripname_result=${func_stripname_result%"${2}"}])
+
+  _LT_PROG_FUNCTION_REPLACE([func_split_long_opt], [dnl
+    func_split_long_opt_name=${1%%=*}
+    func_split_long_opt_arg=${1#*=}])
+
+  _LT_PROG_FUNCTION_REPLACE([func_split_short_opt], [dnl
+    func_split_short_opt_arg=${1#??}
+    func_split_short_opt_name=${1%"$func_split_short_opt_arg"}])
+
+  _LT_PROG_FUNCTION_REPLACE([func_lo2o], [dnl
+    case ${1} in
+      *.lo) func_lo2o_result=${1%.lo}.${objext} ;;
+      *)    func_lo2o_result=${1} ;;
+    esac])
+
+  _LT_PROG_FUNCTION_REPLACE([func_xform], [    func_xform_result=${1%.*}.lo])
+
+  _LT_PROG_FUNCTION_REPLACE([func_arith], [    func_arith_result=$(( $[*] ))])
+
+  _LT_PROG_FUNCTION_REPLACE([func_len], [    func_len_result=${#1}])
+fi
+
+if test x"$lt_shell_append" = xyes; then
+  _LT_PROG_FUNCTION_REPLACE([func_append], [    eval "${1}+=\\${2}"])
+
+  _LT_PROG_FUNCTION_REPLACE([func_append_quoted], [dnl
+    func_quote_for_eval "${2}"
+dnl m4 expansion turns \\\\ into \\, and then the shell eval turns that into \
+    eval "${1}+=\\\\ \\$func_quote_for_eval_result"])
+
+  # Save a `func_append' function call where possible by direct use of '+='
+  sed -e 's%func_append \([[a-zA-Z_]]\{1,\}\) "%\1+="%g' $cfgfile > $cfgfile.tmp \
+    && mv -f "$cfgfile.tmp" "$cfgfile" \
+      || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+  test 0 -eq $? || _lt_function_replace_fail=:
+else
+  # Save a `func_append' function call even when '+=' is not available
+  sed -e 's%func_append \([[a-zA-Z_]]\{1,\}\) "%\1="$\1%g' $cfgfile > $cfgfile.tmp \
+    && mv -f "$cfgfile.tmp" "$cfgfile" \
+      || (rm -f "$cfgfile" && cp "$cfgfile.tmp" "$cfgfile" && rm -f "$cfgfile.tmp")
+  test 0 -eq $? || _lt_function_replace_fail=:
+fi
+
+if test x"$_lt_function_replace_fail" = x":"; then
+  AC_MSG_WARN([Unable to substitute extended shell functions in $ofile])
+fi
+])
+
+# _LT_PATH_CONVERSION_FUNCTIONS
+# -----------------------------
+# Determine which file name conversion functions should be used by
+# func_to_host_file (and, implicitly, by func_to_host_path).  These are needed
+# for certain cross-compile configurations and native mingw.
+m4_defun([_LT_PATH_CONVERSION_FUNCTIONS],
+[AC_REQUIRE([AC_CANONICAL_HOST])dnl
+AC_REQUIRE([AC_CANONICAL_BUILD])dnl
+AC_MSG_CHECKING([how to convert $build file names to $host format])
+AC_CACHE_VAL(lt_cv_to_host_file_cmd,
+[case $host in
+  *-*-mingw* )
+    case $build in
+      *-*-mingw* ) # actually msys
+        lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32
+        ;;
+      *-*-cygwin* )
+        lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32
+        ;;
+      * ) # otherwise, assume *nix
+        lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32
+        ;;
+    esac
+    ;;
+  *-*-cygwin* )
+    case $build in
+      *-*-mingw* ) # actually msys
+        lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin
+        ;;
+      *-*-cygwin* )
+        lt_cv_to_host_file_cmd=func_convert_file_noop
+        ;;
+      * ) # otherwise, assume *nix
+        lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin
+        ;;
+    esac
+    ;;
+  * ) # unhandled hosts (and "normal" native builds)
+    lt_cv_to_host_file_cmd=func_convert_file_noop
+    ;;
+esac
+])
+to_host_file_cmd=$lt_cv_to_host_file_cmd
+AC_MSG_RESULT([$lt_cv_to_host_file_cmd])
+_LT_DECL([to_host_file_cmd], [lt_cv_to_host_file_cmd],
+         [0], [convert $build file names to $host format])dnl
+
+AC_MSG_CHECKING([how to convert $build file names to toolchain format])
+AC_CACHE_VAL(lt_cv_to_tool_file_cmd,
+[#assume ordinary cross tools, or native build.
+lt_cv_to_tool_file_cmd=func_convert_file_noop
+case $host in
+  *-*-mingw* )
+    case $build in
+      *-*-mingw* ) # actually msys
+        lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32
+        ;;
+    esac
+    ;;
+esac
+])
+to_tool_file_cmd=$lt_cv_to_tool_file_cmd
+AC_MSG_RESULT([$lt_cv_to_tool_file_cmd])
+_LT_DECL([to_tool_file_cmd], [lt_cv_to_tool_file_cmd],
+         [0], [convert $build files to toolchain format])dnl
+])# _LT_PATH_CONVERSION_FUNCTIONS
diff --git a/contrib/gtest-1.7.0/m4/ltoptions.m4 b/contrib/gtest-1.7.0/m4/ltoptions.m4
new file mode 100644
index 0000000..5d9acd8
--- /dev/null
+++ b/contrib/gtest-1.7.0/m4/ltoptions.m4
@@ -0,0 +1,384 @@
+# Helper functions for option handling.                    -*- Autoconf -*-
+#
+#   Copyright (C) 2004, 2005, 2007, 2008, 2009 Free Software Foundation,
+#   Inc.
+#   Written by Gary V. Vaughan, 2004
+#
+# 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 ltoptions.m4
+
+# This is to help aclocal find these macros, as it can't see m4_define.
+AC_DEFUN([LTOPTIONS_VERSION], [m4_if([1])])
+
+
+# _LT_MANGLE_OPTION(MACRO-NAME, OPTION-NAME)
+# ------------------------------------------
+m4_define([_LT_MANGLE_OPTION],
+[[_LT_OPTION_]m4_bpatsubst($1__$2, [[^a-zA-Z0-9_]], [_])])
+
+
+# _LT_SET_OPTION(MACRO-NAME, OPTION-NAME)
+# ---------------------------------------
+# Set option OPTION-NAME for macro MACRO-NAME, and if there is a
+# matching handler defined, dispatch to it.  Other OPTION-NAMEs are
+# saved as a flag.
+m4_define([_LT_SET_OPTION],
+[m4_define(_LT_MANGLE_OPTION([$1], [$2]))dnl
+m4_ifdef(_LT_MANGLE_DEFUN([$1], [$2]),
+        _LT_MANGLE_DEFUN([$1], [$2]),
+    [m4_warning([Unknown $1 option `$2'])])[]dnl
+])
+
+
+# _LT_IF_OPTION(MACRO-NAME, OPTION-NAME, IF-SET, [IF-NOT-SET])
+# ------------------------------------------------------------
+# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise.
+m4_define([_LT_IF_OPTION],
+[m4_ifdef(_LT_MANGLE_OPTION([$1], [$2]), [$3], [$4])])
+
+
+# _LT_UNLESS_OPTIONS(MACRO-NAME, OPTION-LIST, IF-NOT-SET)
+# -------------------------------------------------------
+# Execute IF-NOT-SET unless all options in OPTION-LIST for MACRO-NAME
+# are set.
+m4_define([_LT_UNLESS_OPTIONS],
+[m4_foreach([_LT_Option], m4_split(m4_normalize([$2])),
+	    [m4_ifdef(_LT_MANGLE_OPTION([$1], _LT_Option),
+		      [m4_define([$0_found])])])[]dnl
+m4_ifdef([$0_found], [m4_undefine([$0_found])], [$3
+])[]dnl
+])
+
+
+# _LT_SET_OPTIONS(MACRO-NAME, OPTION-LIST)
+# ----------------------------------------
+# OPTION-LIST is a space-separated list of Libtool options associated
+# with MACRO-NAME.  If any OPTION has a matching handler declared with
+# LT_OPTION_DEFINE, dispatch to that macro; otherwise complain about
+# the unknown option and exit.
+m4_defun([_LT_SET_OPTIONS],
+[# Set options
+m4_foreach([_LT_Option], m4_split(m4_normalize([$2])),
+    [_LT_SET_OPTION([$1], _LT_Option)])
+
+m4_if([$1],[LT_INIT],[
+  dnl
+  dnl Simply set some default values (i.e off) if boolean options were not
+  dnl specified:
+  _LT_UNLESS_OPTIONS([LT_INIT], [dlopen], [enable_dlopen=no
+  ])
+  _LT_UNLESS_OPTIONS([LT_INIT], [win32-dll], [enable_win32_dll=no
+  ])
+  dnl
+  dnl If no reference was made to various pairs of opposing options, then
+  dnl we run the default mode handler for the pair.  For example, if neither
+  dnl `shared' nor `disable-shared' was passed, we enable building of shared
+  dnl archives by default:
+  _LT_UNLESS_OPTIONS([LT_INIT], [shared disable-shared], [_LT_ENABLE_SHARED])
+  _LT_UNLESS_OPTIONS([LT_INIT], [static disable-static], [_LT_ENABLE_STATIC])
+  _LT_UNLESS_OPTIONS([LT_INIT], [pic-only no-pic], [_LT_WITH_PIC])
+  _LT_UNLESS_OPTIONS([LT_INIT], [fast-install disable-fast-install],
+  		   [_LT_ENABLE_FAST_INSTALL])
+  ])
+])# _LT_SET_OPTIONS
+
+
+## --------------------------------- ##
+## Macros to handle LT_INIT options. ##
+## --------------------------------- ##
+
+# _LT_MANGLE_DEFUN(MACRO-NAME, OPTION-NAME)
+# -----------------------------------------
+m4_define([_LT_MANGLE_DEFUN],
+[[_LT_OPTION_DEFUN_]m4_bpatsubst(m4_toupper([$1__$2]), [[^A-Z0-9_]], [_])])
+
+
+# LT_OPTION_DEFINE(MACRO-NAME, OPTION-NAME, CODE)
+# -----------------------------------------------
+m4_define([LT_OPTION_DEFINE],
+[m4_define(_LT_MANGLE_DEFUN([$1], [$2]), [$3])[]dnl
+])# LT_OPTION_DEFINE
+
+
+# dlopen
+# ------
+LT_OPTION_DEFINE([LT_INIT], [dlopen], [enable_dlopen=yes
+])
+
+AU_DEFUN([AC_LIBTOOL_DLOPEN],
+[_LT_SET_OPTION([LT_INIT], [dlopen])
+AC_DIAGNOSE([obsolete],
+[$0: Remove this warning and the call to _LT_SET_OPTION when you
+put the `dlopen' option into LT_INIT's first parameter.])
+])
+
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LIBTOOL_DLOPEN], [])
+
+
+# win32-dll
+# ---------
+# Declare package support for building win32 dll's.
+LT_OPTION_DEFINE([LT_INIT], [win32-dll],
+[enable_win32_dll=yes
+
+case $host in
+*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-cegcc*)
+  AC_CHECK_TOOL(AS, as, false)
+  AC_CHECK_TOOL(DLLTOOL, dlltool, false)
+  AC_CHECK_TOOL(OBJDUMP, objdump, false)
+  ;;
+esac
+
+test -z "$AS" && AS=as
+_LT_DECL([], [AS],      [1], [Assembler program])dnl
+
+test -z "$DLLTOOL" && DLLTOOL=dlltool
+_LT_DECL([], [DLLTOOL], [1], [DLL creation program])dnl
+
+test -z "$OBJDUMP" && OBJDUMP=objdump
+_LT_DECL([], [OBJDUMP], [1], [Object dumper program])dnl
+])# win32-dll
+
+AU_DEFUN([AC_LIBTOOL_WIN32_DLL],
+[AC_REQUIRE([AC_CANONICAL_HOST])dnl
+_LT_SET_OPTION([LT_INIT], [win32-dll])
+AC_DIAGNOSE([obsolete],
+[$0: Remove this warning and the call to _LT_SET_OPTION when you
+put the `win32-dll' option into LT_INIT's first parameter.])
+])
+
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LIBTOOL_WIN32_DLL], [])
+
+
+# _LT_ENABLE_SHARED([DEFAULT])
+# ----------------------------
+# implement the --enable-shared flag, and supports the `shared' and
+# `disable-shared' LT_INIT options.
+# DEFAULT is either `yes' or `no'.  If omitted, it defaults to `yes'.
+m4_define([_LT_ENABLE_SHARED],
+[m4_define([_LT_ENABLE_SHARED_DEFAULT], [m4_if($1, no, no, yes)])dnl
+AC_ARG_ENABLE([shared],
+    [AS_HELP_STRING([--enable-shared@<:@=PKGS@:>@],
+	[build shared libraries @<:@default=]_LT_ENABLE_SHARED_DEFAULT[@:>@])],
+    [p=${PACKAGE-default}
+    case $enableval in
+    yes) enable_shared=yes ;;
+    no) enable_shared=no ;;
+    *)
+      enable_shared=no
+      # Look at the argument we got.  We use all the common list separators.
+      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+      for pkg in $enableval; do
+	IFS="$lt_save_ifs"
+	if test "X$pkg" = "X$p"; then
+	  enable_shared=yes
+	fi
+      done
+      IFS="$lt_save_ifs"
+      ;;
+    esac],
+    [enable_shared=]_LT_ENABLE_SHARED_DEFAULT)
+
+    _LT_DECL([build_libtool_libs], [enable_shared], [0],
+	[Whether or not to build shared libraries])
+])# _LT_ENABLE_SHARED
+
+LT_OPTION_DEFINE([LT_INIT], [shared], [_LT_ENABLE_SHARED([yes])])
+LT_OPTION_DEFINE([LT_INIT], [disable-shared], [_LT_ENABLE_SHARED([no])])
+
+# Old names:
+AC_DEFUN([AC_ENABLE_SHARED],
+[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[shared])
+])
+
+AC_DEFUN([AC_DISABLE_SHARED],
+[_LT_SET_OPTION([LT_INIT], [disable-shared])
+])
+
+AU_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)])
+AU_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)])
+
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AM_ENABLE_SHARED], [])
+dnl AC_DEFUN([AM_DISABLE_SHARED], [])
+
+
+
+# _LT_ENABLE_STATIC([DEFAULT])
+# ----------------------------
+# implement the --enable-static flag, and support the `static' and
+# `disable-static' LT_INIT options.
+# DEFAULT is either `yes' or `no'.  If omitted, it defaults to `yes'.
+m4_define([_LT_ENABLE_STATIC],
+[m4_define([_LT_ENABLE_STATIC_DEFAULT], [m4_if($1, no, no, yes)])dnl
+AC_ARG_ENABLE([static],
+    [AS_HELP_STRING([--enable-static@<:@=PKGS@:>@],
+	[build static libraries @<:@default=]_LT_ENABLE_STATIC_DEFAULT[@:>@])],
+    [p=${PACKAGE-default}
+    case $enableval in
+    yes) enable_static=yes ;;
+    no) enable_static=no ;;
+    *)
+     enable_static=no
+      # Look at the argument we got.  We use all the common list separators.
+      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+      for pkg in $enableval; do
+	IFS="$lt_save_ifs"
+	if test "X$pkg" = "X$p"; then
+	  enable_static=yes
+	fi
+      done
+      IFS="$lt_save_ifs"
+      ;;
+    esac],
+    [enable_static=]_LT_ENABLE_STATIC_DEFAULT)
+
+    _LT_DECL([build_old_libs], [enable_static], [0],
+	[Whether or not to build static libraries])
+])# _LT_ENABLE_STATIC
+
+LT_OPTION_DEFINE([LT_INIT], [static], [_LT_ENABLE_STATIC([yes])])
+LT_OPTION_DEFINE([LT_INIT], [disable-static], [_LT_ENABLE_STATIC([no])])
+
+# Old names:
+AC_DEFUN([AC_ENABLE_STATIC],
+[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[static])
+])
+
+AC_DEFUN([AC_DISABLE_STATIC],
+[_LT_SET_OPTION([LT_INIT], [disable-static])
+])
+
+AU_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)])
+AU_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)])
+
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AM_ENABLE_STATIC], [])
+dnl AC_DEFUN([AM_DISABLE_STATIC], [])
+
+
+
+# _LT_ENABLE_FAST_INSTALL([DEFAULT])
+# ----------------------------------
+# implement the --enable-fast-install flag, and support the `fast-install'
+# and `disable-fast-install' LT_INIT options.
+# DEFAULT is either `yes' or `no'.  If omitted, it defaults to `yes'.
+m4_define([_LT_ENABLE_FAST_INSTALL],
+[m4_define([_LT_ENABLE_FAST_INSTALL_DEFAULT], [m4_if($1, no, no, yes)])dnl
+AC_ARG_ENABLE([fast-install],
+    [AS_HELP_STRING([--enable-fast-install@<:@=PKGS@:>@],
+    [optimize for fast installation @<:@default=]_LT_ENABLE_FAST_INSTALL_DEFAULT[@:>@])],
+    [p=${PACKAGE-default}
+    case $enableval in
+    yes) enable_fast_install=yes ;;
+    no) enable_fast_install=no ;;
+    *)
+      enable_fast_install=no
+      # Look at the argument we got.  We use all the common list separators.
+      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+      for pkg in $enableval; do
+	IFS="$lt_save_ifs"
+	if test "X$pkg" = "X$p"; then
+	  enable_fast_install=yes
+	fi
+      done
+      IFS="$lt_save_ifs"
+      ;;
+    esac],
+    [enable_fast_install=]_LT_ENABLE_FAST_INSTALL_DEFAULT)
+
+_LT_DECL([fast_install], [enable_fast_install], [0],
+	 [Whether or not to optimize for fast installation])dnl
+])# _LT_ENABLE_FAST_INSTALL
+
+LT_OPTION_DEFINE([LT_INIT], [fast-install], [_LT_ENABLE_FAST_INSTALL([yes])])
+LT_OPTION_DEFINE([LT_INIT], [disable-fast-install], [_LT_ENABLE_FAST_INSTALL([no])])
+
+# Old names:
+AU_DEFUN([AC_ENABLE_FAST_INSTALL],
+[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[fast-install])
+AC_DIAGNOSE([obsolete],
+[$0: Remove this warning and the call to _LT_SET_OPTION when you put
+the `fast-install' option into LT_INIT's first parameter.])
+])
+
+AU_DEFUN([AC_DISABLE_FAST_INSTALL],
+[_LT_SET_OPTION([LT_INIT], [disable-fast-install])
+AC_DIAGNOSE([obsolete],
+[$0: Remove this warning and the call to _LT_SET_OPTION when you put
+the `disable-fast-install' option into LT_INIT's first parameter.])
+])
+
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_ENABLE_FAST_INSTALL], [])
+dnl AC_DEFUN([AM_DISABLE_FAST_INSTALL], [])
+
+
+# _LT_WITH_PIC([MODE])
+# --------------------
+# implement the --with-pic flag, and support the `pic-only' and `no-pic'
+# LT_INIT options.
+# MODE is either `yes' or `no'.  If omitted, it defaults to `both'.
+m4_define([_LT_WITH_PIC],
+[AC_ARG_WITH([pic],
+    [AS_HELP_STRING([--with-pic@<:@=PKGS@:>@],
+	[try to use only PIC/non-PIC objects @<:@default=use both@:>@])],
+    [lt_p=${PACKAGE-default}
+    case $withval in
+    yes|no) pic_mode=$withval ;;
+    *)
+      pic_mode=default
+      # Look at the argument we got.  We use all the common list separators.
+      lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+      for lt_pkg in $withval; do
+	IFS="$lt_save_ifs"
+	if test "X$lt_pkg" = "X$lt_p"; then
+	  pic_mode=yes
+	fi
+      done
+      IFS="$lt_save_ifs"
+      ;;
+    esac],
+    [pic_mode=default])
+
+test -z "$pic_mode" && pic_mode=m4_default([$1], [default])
+
+_LT_DECL([], [pic_mode], [0], [What type of objects to build])dnl
+])# _LT_WITH_PIC
+
+LT_OPTION_DEFINE([LT_INIT], [pic-only], [_LT_WITH_PIC([yes])])
+LT_OPTION_DEFINE([LT_INIT], [no-pic], [_LT_WITH_PIC([no])])
+
+# Old name:
+AU_DEFUN([AC_LIBTOOL_PICMODE],
+[_LT_SET_OPTION([LT_INIT], [pic-only])
+AC_DIAGNOSE([obsolete],
+[$0: Remove this warning and the call to _LT_SET_OPTION when you
+put the `pic-only' option into LT_INIT's first parameter.])
+])
+
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LIBTOOL_PICMODE], [])
+
+## ----------------- ##
+## LTDL_INIT Options ##
+## ----------------- ##
+
+m4_define([_LTDL_MODE], [])
+LT_OPTION_DEFINE([LTDL_INIT], [nonrecursive],
+		 [m4_define([_LTDL_MODE], [nonrecursive])])
+LT_OPTION_DEFINE([LTDL_INIT], [recursive],
+		 [m4_define([_LTDL_MODE], [recursive])])
+LT_OPTION_DEFINE([LTDL_INIT], [subproject],
+		 [m4_define([_LTDL_MODE], [subproject])])
+
+m4_define([_LTDL_TYPE], [])
+LT_OPTION_DEFINE([LTDL_INIT], [installable],
+		 [m4_define([_LTDL_TYPE], [installable])])
+LT_OPTION_DEFINE([LTDL_INIT], [convenience],
+		 [m4_define([_LTDL_TYPE], [convenience])])
diff --git a/contrib/gtest-1.7.0/m4/ltsugar.m4 b/contrib/gtest-1.7.0/m4/ltsugar.m4
new file mode 100644
index 0000000..9000a05
--- /dev/null
+++ b/contrib/gtest-1.7.0/m4/ltsugar.m4
@@ -0,0 +1,123 @@
+# ltsugar.m4 -- libtool m4 base layer.                         -*-Autoconf-*-
+#
+# Copyright (C) 2004, 2005, 2007, 2008 Free Software Foundation, Inc.
+# Written by Gary V. Vaughan, 2004
+#
+# 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 6 ltsugar.m4
+
+# This is to help aclocal find these macros, as it can't see m4_define.
+AC_DEFUN([LTSUGAR_VERSION], [m4_if([0.1])])
+
+
+# lt_join(SEP, ARG1, [ARG2...])
+# -----------------------------
+# Produce ARG1SEPARG2...SEPARGn, omitting [] arguments and their
+# associated separator.
+# Needed until we can rely on m4_join from Autoconf 2.62, since all earlier
+# versions in m4sugar had bugs.
+m4_define([lt_join],
+[m4_if([$#], [1], [],
+       [$#], [2], [[$2]],
+       [m4_if([$2], [], [], [[$2]_])$0([$1], m4_shift(m4_shift($@)))])])
+m4_define([_lt_join],
+[m4_if([$#$2], [2], [],
+       [m4_if([$2], [], [], [[$1$2]])$0([$1], m4_shift(m4_shift($@)))])])
+
+
+# lt_car(LIST)
+# lt_cdr(LIST)
+# ------------
+# Manipulate m4 lists.
+# These macros are necessary as long as will still need to support
+# Autoconf-2.59 which quotes differently.
+m4_define([lt_car], [[$1]])
+m4_define([lt_cdr],
+[m4_if([$#], 0, [m4_fatal([$0: cannot be called without arguments])],
+       [$#], 1, [],
+       [m4_dquote(m4_shift($@))])])
+m4_define([lt_unquote], $1)
+
+
+# lt_append(MACRO-NAME, STRING, [SEPARATOR])
+# ------------------------------------------
+# Redefine MACRO-NAME to hold its former content plus `SEPARATOR'`STRING'.
+# Note that neither SEPARATOR nor STRING are expanded; they are appended
+# to MACRO-NAME as is (leaving the expansion for when MACRO-NAME is invoked).
+# No SEPARATOR is output if MACRO-NAME was previously undefined (different
+# than defined and empty).
+#
+# This macro is needed until we can rely on Autoconf 2.62, since earlier
+# versions of m4sugar mistakenly expanded SEPARATOR but not STRING.
+m4_define([lt_append],
+[m4_define([$1],
+	   m4_ifdef([$1], [m4_defn([$1])[$3]])[$2])])
+
+
+
+# lt_combine(SEP, PREFIX-LIST, INFIX, SUFFIX1, [SUFFIX2...])
+# ----------------------------------------------------------
+# Produce a SEP delimited list of all paired combinations of elements of
+# PREFIX-LIST with SUFFIX1 through SUFFIXn.  Each element of the list
+# has the form PREFIXmINFIXSUFFIXn.
+# Needed until we can rely on m4_combine added in Autoconf 2.62.
+m4_define([lt_combine],
+[m4_if(m4_eval([$# > 3]), [1],
+       [m4_pushdef([_Lt_sep], [m4_define([_Lt_sep], m4_defn([lt_car]))])]]dnl
+[[m4_foreach([_Lt_prefix], [$2],
+	     [m4_foreach([_Lt_suffix],
+		]m4_dquote(m4_dquote(m4_shift(m4_shift(m4_shift($@)))))[,
+	[_Lt_sep([$1])[]m4_defn([_Lt_prefix])[$3]m4_defn([_Lt_suffix])])])])])
+
+
+# lt_if_append_uniq(MACRO-NAME, VARNAME, [SEPARATOR], [UNIQ], [NOT-UNIQ])
+# -----------------------------------------------------------------------
+# Iff MACRO-NAME does not yet contain VARNAME, then append it (delimited
+# by SEPARATOR if supplied) and expand UNIQ, else NOT-UNIQ.
+m4_define([lt_if_append_uniq],
+[m4_ifdef([$1],
+	  [m4_if(m4_index([$3]m4_defn([$1])[$3], [$3$2$3]), [-1],
+		 [lt_append([$1], [$2], [$3])$4],
+		 [$5])],
+	  [lt_append([$1], [$2], [$3])$4])])
+
+
+# lt_dict_add(DICT, KEY, VALUE)
+# -----------------------------
+m4_define([lt_dict_add],
+[m4_define([$1($2)], [$3])])
+
+
+# lt_dict_add_subkey(DICT, KEY, SUBKEY, VALUE)
+# --------------------------------------------
+m4_define([lt_dict_add_subkey],
+[m4_define([$1($2:$3)], [$4])])
+
+
+# lt_dict_fetch(DICT, KEY, [SUBKEY])
+# ----------------------------------
+m4_define([lt_dict_fetch],
+[m4_ifval([$3],
+	m4_ifdef([$1($2:$3)], [m4_defn([$1($2:$3)])]),
+    m4_ifdef([$1($2)], [m4_defn([$1($2)])]))])
+
+
+# lt_if_dict_fetch(DICT, KEY, [SUBKEY], VALUE, IF-TRUE, [IF-FALSE])
+# -----------------------------------------------------------------
+m4_define([lt_if_dict_fetch],
+[m4_if(lt_dict_fetch([$1], [$2], [$3]), [$4],
+	[$5],
+    [$6])])
+
+
+# lt_dict_filter(DICT, [SUBKEY], VALUE, [SEPARATOR], KEY, [...])
+# --------------------------------------------------------------
+m4_define([lt_dict_filter],
+[m4_if([$5], [], [],
+  [lt_join(m4_quote(m4_default([$4], [[, ]])),
+           lt_unquote(m4_split(m4_normalize(m4_foreach(_Lt_key, lt_car([m4_shiftn(4, $@)]),
+		      [lt_if_dict_fetch([$1], _Lt_key, [$2], [$3], [_Lt_key ])])))))])[]dnl
+])
diff --git a/contrib/gtest-1.7.0/m4/ltversion.m4 b/contrib/gtest-1.7.0/m4/ltversion.m4
new file mode 100644
index 0000000..07a8602
--- /dev/null
+++ b/contrib/gtest-1.7.0/m4/ltversion.m4
@@ -0,0 +1,23 @@
+# ltversion.m4 -- version numbers			-*- Autoconf -*-
+#
+#   Copyright (C) 2004 Free Software Foundation, Inc.
+#   Written by Scott James Remnant, 2004
+#
+# 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.
+
+# @configure_input@
+
+# serial 3337 ltversion.m4
+# This file is part of GNU Libtool
+
+m4_define([LT_PACKAGE_VERSION], [2.4.2])
+m4_define([LT_PACKAGE_REVISION], [1.3337])
+
+AC_DEFUN([LTVERSION_VERSION],
+[macro_version='2.4.2'
+macro_revision='1.3337'
+_LT_DECL(, macro_version, 0, [Which release of libtool.m4 was used?])
+_LT_DECL(, macro_revision, 0)
+])
diff --git a/contrib/gtest-1.7.0/m4/lt~obsolete.m4 b/contrib/gtest-1.7.0/m4/lt~obsolete.m4
new file mode 100644
index 0000000..c573da9
--- /dev/null
+++ b/contrib/gtest-1.7.0/m4/lt~obsolete.m4
@@ -0,0 +1,98 @@
+# lt~obsolete.m4 -- aclocal satisfying obsolete definitions.    -*-Autoconf-*-
+#
+#   Copyright (C) 2004, 2005, 2007, 2009 Free Software Foundation, Inc.
+#   Written by Scott James Remnant, 2004.
+#
+# 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 5 lt~obsolete.m4
+
+# These exist entirely to fool aclocal when bootstrapping libtool.
+#
+# In the past libtool.m4 has provided macros via AC_DEFUN (or AU_DEFUN)
+# which have later been changed to m4_define as they aren't part of the
+# exported API, or moved to Autoconf or Automake where they belong.
+#
+# The trouble is, aclocal is a bit thick.  It'll see the old AC_DEFUN
+# in /usr/share/aclocal/libtool.m4 and remember it, then when it sees us
+# using a macro with the same name in our local m4/libtool.m4 it'll
+# pull the old libtool.m4 in (it doesn't see our shiny new m4_define
+# and doesn't know about Autoconf macros at all.)
+#
+# So we provide this file, which has a silly filename so it's always
+# included after everything else.  This provides aclocal with the
+# AC_DEFUNs it wants, but when m4 processes it, it doesn't do anything
+# because those macros already exist, or will be overwritten later.
+# We use AC_DEFUN over AU_DEFUN for compatibility with aclocal-1.6. 
+#
+# Anytime we withdraw an AC_DEFUN or AU_DEFUN, remember to add it here.
+# Yes, that means every name once taken will need to remain here until
+# we give up compatibility with versions before 1.7, at which point
+# we need to keep only those names which we still refer to.
+
+# This is to help aclocal find these macros, as it can't see m4_define.
+AC_DEFUN([LTOBSOLETE_VERSION], [m4_if([1])])
+
+m4_ifndef([AC_LIBTOOL_LINKER_OPTION],	[AC_DEFUN([AC_LIBTOOL_LINKER_OPTION])])
+m4_ifndef([AC_PROG_EGREP],		[AC_DEFUN([AC_PROG_EGREP])])
+m4_ifndef([_LT_AC_PROG_ECHO_BACKSLASH],	[AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH])])
+m4_ifndef([_LT_AC_SHELL_INIT],		[AC_DEFUN([_LT_AC_SHELL_INIT])])
+m4_ifndef([_LT_AC_SYS_LIBPATH_AIX],	[AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX])])
+m4_ifndef([_LT_PROG_LTMAIN],		[AC_DEFUN([_LT_PROG_LTMAIN])])
+m4_ifndef([_LT_AC_TAGVAR],		[AC_DEFUN([_LT_AC_TAGVAR])])
+m4_ifndef([AC_LTDL_ENABLE_INSTALL],	[AC_DEFUN([AC_LTDL_ENABLE_INSTALL])])
+m4_ifndef([AC_LTDL_PREOPEN],		[AC_DEFUN([AC_LTDL_PREOPEN])])
+m4_ifndef([_LT_AC_SYS_COMPILER],	[AC_DEFUN([_LT_AC_SYS_COMPILER])])
+m4_ifndef([_LT_AC_LOCK],		[AC_DEFUN([_LT_AC_LOCK])])
+m4_ifndef([AC_LIBTOOL_SYS_OLD_ARCHIVE],	[AC_DEFUN([AC_LIBTOOL_SYS_OLD_ARCHIVE])])
+m4_ifndef([_LT_AC_TRY_DLOPEN_SELF],	[AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF])])
+m4_ifndef([AC_LIBTOOL_PROG_CC_C_O],	[AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O])])
+m4_ifndef([AC_LIBTOOL_SYS_HARD_LINK_LOCKS], [AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS])])
+m4_ifndef([AC_LIBTOOL_OBJDIR],		[AC_DEFUN([AC_LIBTOOL_OBJDIR])])
+m4_ifndef([AC_LTDL_OBJDIR],		[AC_DEFUN([AC_LTDL_OBJDIR])])
+m4_ifndef([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH], [AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH])])
+m4_ifndef([AC_LIBTOOL_SYS_LIB_STRIP],	[AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP])])
+m4_ifndef([AC_PATH_MAGIC],		[AC_DEFUN([AC_PATH_MAGIC])])
+m4_ifndef([AC_PROG_LD_GNU],		[AC_DEFUN([AC_PROG_LD_GNU])])
+m4_ifndef([AC_PROG_LD_RELOAD_FLAG],	[AC_DEFUN([AC_PROG_LD_RELOAD_FLAG])])
+m4_ifndef([AC_DEPLIBS_CHECK_METHOD],	[AC_DEFUN([AC_DEPLIBS_CHECK_METHOD])])
+m4_ifndef([AC_LIBTOOL_PROG_COMPILER_NO_RTTI], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI])])
+m4_ifndef([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE], [AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE])])
+m4_ifndef([AC_LIBTOOL_PROG_COMPILER_PIC], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC])])
+m4_ifndef([AC_LIBTOOL_PROG_LD_SHLIBS],	[AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS])])
+m4_ifndef([AC_LIBTOOL_POSTDEP_PREDEP],	[AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP])])
+m4_ifndef([LT_AC_PROG_EGREP],		[AC_DEFUN([LT_AC_PROG_EGREP])])
+m4_ifndef([LT_AC_PROG_SED],		[AC_DEFUN([LT_AC_PROG_SED])])
+m4_ifndef([_LT_CC_BASENAME],		[AC_DEFUN([_LT_CC_BASENAME])])
+m4_ifndef([_LT_COMPILER_BOILERPLATE],	[AC_DEFUN([_LT_COMPILER_BOILERPLATE])])
+m4_ifndef([_LT_LINKER_BOILERPLATE],	[AC_DEFUN([_LT_LINKER_BOILERPLATE])])
+m4_ifndef([_AC_PROG_LIBTOOL],		[AC_DEFUN([_AC_PROG_LIBTOOL])])
+m4_ifndef([AC_LIBTOOL_SETUP],		[AC_DEFUN([AC_LIBTOOL_SETUP])])
+m4_ifndef([_LT_AC_CHECK_DLFCN],		[AC_DEFUN([_LT_AC_CHECK_DLFCN])])
+m4_ifndef([AC_LIBTOOL_SYS_DYNAMIC_LINKER],	[AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER])])
+m4_ifndef([_LT_AC_TAGCONFIG],		[AC_DEFUN([_LT_AC_TAGCONFIG])])
+m4_ifndef([AC_DISABLE_FAST_INSTALL],	[AC_DEFUN([AC_DISABLE_FAST_INSTALL])])
+m4_ifndef([_LT_AC_LANG_CXX],		[AC_DEFUN([_LT_AC_LANG_CXX])])
+m4_ifndef([_LT_AC_LANG_F77],		[AC_DEFUN([_LT_AC_LANG_F77])])
+m4_ifndef([_LT_AC_LANG_GCJ],		[AC_DEFUN([_LT_AC_LANG_GCJ])])
+m4_ifndef([AC_LIBTOOL_LANG_C_CONFIG],	[AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG])])
+m4_ifndef([_LT_AC_LANG_C_CONFIG],	[AC_DEFUN([_LT_AC_LANG_C_CONFIG])])
+m4_ifndef([AC_LIBTOOL_LANG_CXX_CONFIG],	[AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG])])
+m4_ifndef([_LT_AC_LANG_CXX_CONFIG],	[AC_DEFUN([_LT_AC_LANG_CXX_CONFIG])])
+m4_ifndef([AC_LIBTOOL_LANG_F77_CONFIG],	[AC_DEFUN([AC_LIBTOOL_LANG_F77_CONFIG])])
+m4_ifndef([_LT_AC_LANG_F77_CONFIG],	[AC_DEFUN([_LT_AC_LANG_F77_CONFIG])])
+m4_ifndef([AC_LIBTOOL_LANG_GCJ_CONFIG],	[AC_DEFUN([AC_LIBTOOL_LANG_GCJ_CONFIG])])
+m4_ifndef([_LT_AC_LANG_GCJ_CONFIG],	[AC_DEFUN([_LT_AC_LANG_GCJ_CONFIG])])
+m4_ifndef([AC_LIBTOOL_LANG_RC_CONFIG],	[AC_DEFUN([AC_LIBTOOL_LANG_RC_CONFIG])])
+m4_ifndef([_LT_AC_LANG_RC_CONFIG],	[AC_DEFUN([_LT_AC_LANG_RC_CONFIG])])
+m4_ifndef([AC_LIBTOOL_CONFIG],		[AC_DEFUN([AC_LIBTOOL_CONFIG])])
+m4_ifndef([_LT_AC_FILE_LTDLL_C],	[AC_DEFUN([_LT_AC_FILE_LTDLL_C])])
+m4_ifndef([_LT_REQUIRED_DARWIN_CHECKS],	[AC_DEFUN([_LT_REQUIRED_DARWIN_CHECKS])])
+m4_ifndef([_LT_AC_PROG_CXXCPP],		[AC_DEFUN([_LT_AC_PROG_CXXCPP])])
+m4_ifndef([_LT_PREPARE_SED_QUOTE_VARS],	[AC_DEFUN([_LT_PREPARE_SED_QUOTE_VARS])])
+m4_ifndef([_LT_PROG_ECHO_BACKSLASH],	[AC_DEFUN([_LT_PROG_ECHO_BACKSLASH])])
+m4_ifndef([_LT_PROG_F77],		[AC_DEFUN([_LT_PROG_F77])])
+m4_ifndef([_LT_PROG_FC],		[AC_DEFUN([_LT_PROG_FC])])
+m4_ifndef([_LT_PROG_CXX],		[AC_DEFUN([_LT_PROG_CXX])])
diff --git a/contrib/gtest-1.7.0/make/Makefile b/contrib/gtest-1.7.0/make/Makefile
new file mode 100644
index 0000000..9ac7449
--- /dev/null
+++ b/contrib/gtest-1.7.0/make/Makefile
@@ -0,0 +1,82 @@
+# A sample Makefile for building Google Test and using it in user
+# tests.  Please tweak it to suit your environment and project.  You
+# may want to move it to your project's root directory.
+#
+# SYNOPSIS:
+#
+#   make [all]  - makes everything.
+#   make TARGET - makes the given target.
+#   make clean  - removes all files generated by make.
+
+# Please tweak the following variable definitions as needed by your
+# project, except GTEST_HEADERS, which you can use in your own targets
+# but shouldn't modify.
+
+# Points to the root of Google Test, relative to where this file is.
+# Remember to tweak this if you move this file.
+GTEST_DIR = ..
+
+# Where to find user code.
+USER_DIR = ../samples
+
+# Flags passed to the preprocessor.
+# Set Google Test's header directory as a system directory, such that
+# the compiler doesn't generate warnings in Google Test headers.
+CPPFLAGS += -isystem $(GTEST_DIR)/include
+
+# Flags passed to the C++ compiler.
+CXXFLAGS += -g -Wall -Wextra -pthread
+
+# All tests produced by this Makefile.  Remember to add new tests you
+# created to the list.
+TESTS = sample1_unittest
+
+# All Google Test headers.  Usually you shouldn't change this
+# definition.
+GTEST_HEADERS = $(GTEST_DIR)/include/gtest/*.h \
+                $(GTEST_DIR)/include/gtest/internal/*.h
+
+# House-keeping build targets.
+
+all : $(TESTS)
+
+clean :
+	rm -f $(TESTS) gtest.a gtest_main.a *.o
+
+# Builds gtest.a and gtest_main.a.
+
+# Usually you shouldn't tweak such internal variables, indicated by a
+# trailing _.
+GTEST_SRCS_ = $(GTEST_DIR)/src/*.cc $(GTEST_DIR)/src/*.h $(GTEST_HEADERS)
+
+# For simplicity and to avoid depending on Google Test's
+# implementation details, the dependencies specified below are
+# conservative and not optimized.  This is fine as Google Test
+# compiles fast and for ordinary users its source rarely changes.
+gtest-all.o : $(GTEST_SRCS_)
+	$(CXX) $(CPPFLAGS) -I$(GTEST_DIR) $(CXXFLAGS) -c \
+            $(GTEST_DIR)/src/gtest-all.cc
+
+gtest_main.o : $(GTEST_SRCS_)
+	$(CXX) $(CPPFLAGS) -I$(GTEST_DIR) $(CXXFLAGS) -c \
+            $(GTEST_DIR)/src/gtest_main.cc
+
+gtest.a : gtest-all.o
+	$(AR) $(ARFLAGS) $@ $^
+
+gtest_main.a : gtest-all.o gtest_main.o
+	$(AR) $(ARFLAGS) $@ $^
+
+# Builds a sample test.  A test should link with either gtest.a or
+# gtest_main.a, depending on whether it defines its own main()
+# function.
+
+sample1.o : $(USER_DIR)/sample1.cc $(USER_DIR)/sample1.h $(GTEST_HEADERS)
+	$(CXX) $(CPPFLAGS) $(CXXFLAGS) -c $(USER_DIR)/sample1.cc
+
+sample1_unittest.o : $(USER_DIR)/sample1_unittest.cc \
+                     $(USER_DIR)/sample1.h $(GTEST_HEADERS)
+	$(CXX) $(CPPFLAGS) $(CXXFLAGS) -c $(USER_DIR)/sample1_unittest.cc
+
+sample1_unittest : sample1.o sample1_unittest.o gtest_main.a
+	$(CXX) $(CPPFLAGS) $(CXXFLAGS) -lpthread $^ -o $@
diff --git a/contrib/gtest-1.7.0/msvc/gtest-md.sln b/contrib/gtest-1.7.0/msvc/gtest-md.sln
new file mode 100755
index 0000000..f7908da
--- /dev/null
+++ b/contrib/gtest-1.7.0/msvc/gtest-md.sln
@@ -0,0 +1,45 @@
+Microsoft Visual Studio Solution File, Format Version 8.00
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "gtest-md", "gtest-md.vcproj", "{C8F6C172-56F2-4E76-B5FA-C3B423B31BE8}"
+	ProjectSection(ProjectDependencies) = postProject
+	EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "gtest_main-md", "gtest_main-md.vcproj", "{3AF54C8A-10BF-4332-9147-F68ED9862033}"
+	ProjectSection(ProjectDependencies) = postProject
+	EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "gtest_prod_test-md", "gtest_prod_test-md.vcproj", "{24848551-EF4F-47E8-9A9D-EA4D49BC3ECB}"
+	ProjectSection(ProjectDependencies) = postProject
+	EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "gtest_unittest-md", "gtest_unittest-md.vcproj", "{4D9FDFB5-986A-4139-823C-F4EE0ED481A2}"
+	ProjectSection(ProjectDependencies) = postProject
+	EndProjectSection
+EndProject
+Global
+	GlobalSection(SolutionConfiguration) = preSolution
+		Debug = Debug
+		Release = Release
+	EndGlobalSection
+	GlobalSection(ProjectConfiguration) = postSolution
+		{C8F6C172-56F2-4E76-B5FA-C3B423B31BE8}.Debug.ActiveCfg = Debug|Win32
+		{C8F6C172-56F2-4E76-B5FA-C3B423B31BE8}.Debug.Build.0 = Debug|Win32
+		{C8F6C172-56F2-4E76-B5FA-C3B423B31BE8}.Release.ActiveCfg = Release|Win32
+		{C8F6C172-56F2-4E76-B5FA-C3B423B31BE8}.Release.Build.0 = Release|Win32
+		{3AF54C8A-10BF-4332-9147-F68ED9862033}.Debug.ActiveCfg = Debug|Win32
+		{3AF54C8A-10BF-4332-9147-F68ED9862033}.Debug.Build.0 = Debug|Win32
+		{3AF54C8A-10BF-4332-9147-F68ED9862033}.Release.ActiveCfg = Release|Win32
+		{3AF54C8A-10BF-4332-9147-F68ED9862033}.Release.Build.0 = Release|Win32
+		{24848551-EF4F-47E8-9A9D-EA4D49BC3ECB}.Debug.ActiveCfg = Debug|Win32
+		{24848551-EF4F-47E8-9A9D-EA4D49BC3ECB}.Debug.Build.0 = Debug|Win32
+		{24848551-EF4F-47E8-9A9D-EA4D49BC3ECB}.Release.ActiveCfg = Release|Win32
+		{24848551-EF4F-47E8-9A9D-EA4D49BC3ECB}.Release.Build.0 = Release|Win32
+		{4D9FDFB5-986A-4139-823C-F4EE0ED481A2}.Debug.ActiveCfg = Debug|Win32
+		{4D9FDFB5-986A-4139-823C-F4EE0ED481A2}.Debug.Build.0 = Debug|Win32
+		{4D9FDFB5-986A-4139-823C-F4EE0ED481A2}.Release.ActiveCfg = Release|Win32
+		{4D9FDFB5-986A-4139-823C-F4EE0ED481A2}.Release.Build.0 = Release|Win32
+	EndGlobalSection
+	GlobalSection(ExtensibilityGlobals) = postSolution
+	EndGlobalSection
+	GlobalSection(ExtensibilityAddIns) = postSolution
+	EndGlobalSection
+EndGlobal
diff --git a/contrib/gtest-1.7.0/msvc/gtest-md.vcproj b/contrib/gtest-1.7.0/msvc/gtest-md.vcproj
new file mode 100755
index 0000000..1c35c3a
--- /dev/null
+++ b/contrib/gtest-1.7.0/msvc/gtest-md.vcproj
@@ -0,0 +1,126 @@
+<?xml version="1.0" encoding="Windows-1252"?>
+<VisualStudioProject
+	ProjectType="Visual C++"
+	Version="7.10"
+	Name="gtest-md"
+	ProjectGUID="{C8F6C172-56F2-4E76-B5FA-C3B423B31BE8}"
+	Keyword="Win32Proj">
+	<Platforms>
+		<Platform
+			Name="Win32"/>
+	</Platforms>
+	<Configurations>
+		<Configuration
+			Name="Debug|Win32"
+			OutputDirectory="$(SolutionName)/$(ConfigurationName)"
+			IntermediateDirectory="$(OutDir)/$(ProjectName)"
+			ConfigurationType="4"
+			CharacterSet="2"
+			ReferencesPath="">
+			<Tool
+				Name="VCCLCompilerTool"
+				Optimization="0"
+				PreprocessorDefinitions="WIN32;_DEBUG;_LIB"
+				MinimalRebuild="TRUE"
+				BasicRuntimeChecks="3"
+				RuntimeLibrary="3"
+				UsePrecompiledHeader="0"
+				WarningLevel="3"
+				Detect64BitPortabilityProblems="FALSE"
+				DebugInformationFormat="4"/>
+			<Tool
+				Name="VCCustomBuildTool"/>
+			<Tool
+				Name="VCLibrarianTool"
+				OutputFile="$(OutDir)/gtestd.lib"/>
+			<Tool
+				Name="VCMIDLTool"/>
+			<Tool
+				Name="VCPostBuildEventTool"/>
+			<Tool
+				Name="VCPreBuildEventTool"/>
+			<Tool
+				Name="VCPreLinkEventTool"/>
+			<Tool
+				Name="VCResourceCompilerTool"/>
+			<Tool
+				Name="VCWebServiceProxyGeneratorTool"/>
+			<Tool
+				Name="VCXMLDataGeneratorTool"/>
+			<Tool
+				Name="VCManagedWrapperGeneratorTool"/>
+			<Tool
+				Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
+		</Configuration>
+		<Configuration
+			Name="Release|Win32"
+			OutputDirectory="$(SolutionName)/$(ConfigurationName)"
+			IntermediateDirectory="$(OutDir)/$(ProjectName)"
+			ConfigurationType="4"
+			CharacterSet="2"
+			ReferencesPath=""..\include";".."">
+			<Tool
+				Name="VCCLCompilerTool"
+				PreprocessorDefinitions="WIN32;NDEBUG;_LIB"
+				RuntimeLibrary="2"
+				UsePrecompiledHeader="0"
+				WarningLevel="3"
+				Detect64BitPortabilityProblems="FALSE"
+				DebugInformationFormat="3"/>
+			<Tool
+				Name="VCCustomBuildTool"/>
+			<Tool
+				Name="VCLibrarianTool"
+				OutputFile="$(OutDir)/gtest.lib"/>
+			<Tool
+				Name="VCMIDLTool"/>
+			<Tool
+				Name="VCPostBuildEventTool"/>
+			<Tool
+				Name="VCPreBuildEventTool"/>
+			<Tool
+				Name="VCPreLinkEventTool"/>
+			<Tool
+				Name="VCResourceCompilerTool"/>
+			<Tool
+				Name="VCWebServiceProxyGeneratorTool"/>
+			<Tool
+				Name="VCXMLDataGeneratorTool"/>
+			<Tool
+				Name="VCManagedWrapperGeneratorTool"/>
+			<Tool
+				Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
+		</Configuration>
+	</Configurations>
+	<References>
+	</References>
+	<Files>
+		<Filter
+			Name="Source Files"
+			Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
+			UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}">
+			<File
+				RelativePath="..\src\gtest-all.cc">
+				<FileConfiguration
+					Name="Debug|Win32">
+					<Tool
+						Name="VCCLCompilerTool"
+						AdditionalIncludeDirectories=""..";"..\include""/>
+				</FileConfiguration>
+				<FileConfiguration
+					Name="Release|Win32">
+					<Tool
+						Name="VCCLCompilerTool"
+						AdditionalIncludeDirectories=""..";"..\include""/>
+				</FileConfiguration>
+			</File>
+		</Filter>
+		<Filter
+			Name="Header Files"
+			Filter="h;hpp;hxx;hm;inl;inc;xsd"
+			UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}">
+		</Filter>
+	</Files>
+	<Globals>
+	</Globals>
+</VisualStudioProject>
diff --git a/contrib/gtest-1.7.0/msvc/gtest.sln b/contrib/gtest-1.7.0/msvc/gtest.sln
new file mode 100755
index 0000000..ef4b057
--- /dev/null
+++ b/contrib/gtest-1.7.0/msvc/gtest.sln
@@ -0,0 +1,45 @@
+Microsoft Visual Studio Solution File, Format Version 8.00
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "gtest", "gtest.vcproj", "{C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}"
+	ProjectSection(ProjectDependencies) = postProject
+	EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "gtest_main", "gtest_main.vcproj", "{3AF54C8A-10BF-4332-9147-F68ED9862032}"
+	ProjectSection(ProjectDependencies) = postProject
+	EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "gtest_unittest", "gtest_unittest.vcproj", "{4D9FDFB5-986A-4139-823C-F4EE0ED481A1}"
+	ProjectSection(ProjectDependencies) = postProject
+	EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "gtest_prod_test", "gtest_prod_test.vcproj", "{24848551-EF4F-47E8-9A9D-EA4D49BC3ECA}"
+	ProjectSection(ProjectDependencies) = postProject
+	EndProjectSection
+EndProject
+Global
+	GlobalSection(SolutionConfiguration) = preSolution
+		Debug = Debug
+		Release = Release
+	EndGlobalSection
+	GlobalSection(ProjectConfiguration) = postSolution
+		{C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}.Debug.ActiveCfg = Debug|Win32
+		{C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}.Debug.Build.0 = Debug|Win32
+		{C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}.Release.ActiveCfg = Release|Win32
+		{C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}.Release.Build.0 = Release|Win32
+		{3AF54C8A-10BF-4332-9147-F68ED9862032}.Debug.ActiveCfg = Debug|Win32
+		{3AF54C8A-10BF-4332-9147-F68ED9862032}.Debug.Build.0 = Debug|Win32
+		{3AF54C8A-10BF-4332-9147-F68ED9862032}.Release.ActiveCfg = Release|Win32
+		{3AF54C8A-10BF-4332-9147-F68ED9862032}.Release.Build.0 = Release|Win32
+		{4D9FDFB5-986A-4139-823C-F4EE0ED481A1}.Debug.ActiveCfg = Debug|Win32
+		{4D9FDFB5-986A-4139-823C-F4EE0ED481A1}.Debug.Build.0 = Debug|Win32
+		{4D9FDFB5-986A-4139-823C-F4EE0ED481A1}.Release.ActiveCfg = Release|Win32
+		{4D9FDFB5-986A-4139-823C-F4EE0ED481A1}.Release.Build.0 = Release|Win32
+		{24848551-EF4F-47E8-9A9D-EA4D49BC3ECA}.Debug.ActiveCfg = Debug|Win32
+		{24848551-EF4F-47E8-9A9D-EA4D49BC3ECA}.Debug.Build.0 = Debug|Win32
+		{24848551-EF4F-47E8-9A9D-EA4D49BC3ECA}.Release.ActiveCfg = Release|Win32
+		{24848551-EF4F-47E8-9A9D-EA4D49BC3ECA}.Release.Build.0 = Release|Win32
+	EndGlobalSection
+	GlobalSection(ExtensibilityGlobals) = postSolution
+	EndGlobalSection
+	GlobalSection(ExtensibilityAddIns) = postSolution
+	EndGlobalSection
+EndGlobal
diff --git a/contrib/gtest-1.7.0/msvc/gtest.vcproj b/contrib/gtest-1.7.0/msvc/gtest.vcproj
new file mode 100755
index 0000000..a8373ce
--- /dev/null
+++ b/contrib/gtest-1.7.0/msvc/gtest.vcproj
@@ -0,0 +1,126 @@
+<?xml version="1.0" encoding="Windows-1252"?>
+<VisualStudioProject
+	ProjectType="Visual C++"
+	Version="7.10"
+	Name="gtest"
+	ProjectGUID="{C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}"
+	Keyword="Win32Proj">
+	<Platforms>
+		<Platform
+			Name="Win32"/>
+	</Platforms>
+	<Configurations>
+		<Configuration
+			Name="Debug|Win32"
+			OutputDirectory="$(SolutionName)/$(ConfigurationName)"
+			IntermediateDirectory="$(OutDir)/$(ProjectName)"
+			ConfigurationType="4"
+			CharacterSet="2"
+			ReferencesPath="">
+			<Tool
+				Name="VCCLCompilerTool"
+				Optimization="0"
+				PreprocessorDefinitions="WIN32;_DEBUG;_LIB"
+				MinimalRebuild="TRUE"
+				BasicRuntimeChecks="3"
+				RuntimeLibrary="5"
+				UsePrecompiledHeader="0"
+				WarningLevel="3"
+				Detect64BitPortabilityProblems="FALSE"
+				DebugInformationFormat="4"/>
+			<Tool
+				Name="VCCustomBuildTool"/>
+			<Tool
+				Name="VCLibrarianTool"
+				OutputFile="$(OutDir)/gtestd.lib"/>
+			<Tool
+				Name="VCMIDLTool"/>
+			<Tool
+				Name="VCPostBuildEventTool"/>
+			<Tool
+				Name="VCPreBuildEventTool"/>
+			<Tool
+				Name="VCPreLinkEventTool"/>
+			<Tool
+				Name="VCResourceCompilerTool"/>
+			<Tool
+				Name="VCWebServiceProxyGeneratorTool"/>
+			<Tool
+				Name="VCXMLDataGeneratorTool"/>
+			<Tool
+				Name="VCManagedWrapperGeneratorTool"/>
+			<Tool
+				Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
+		</Configuration>
+		<Configuration
+			Name="Release|Win32"
+			OutputDirectory="$(SolutionName)/$(ConfigurationName)"
+			IntermediateDirectory="$(OutDir)/$(ProjectName)"
+			ConfigurationType="4"
+			CharacterSet="2"
+			ReferencesPath=""..\include";".."">
+			<Tool
+				Name="VCCLCompilerTool"
+				PreprocessorDefinitions="WIN32;NDEBUG;_LIB"
+				RuntimeLibrary="4"
+				UsePrecompiledHeader="0"
+				WarningLevel="3"
+				Detect64BitPortabilityProblems="FALSE"
+				DebugInformationFormat="3"/>
+			<Tool
+				Name="VCCustomBuildTool"/>
+			<Tool
+				Name="VCLibrarianTool"
+				OutputFile="$(OutDir)/gtest.lib"/>
+			<Tool
+				Name="VCMIDLTool"/>
+			<Tool
+				Name="VCPostBuildEventTool"/>
+			<Tool
+				Name="VCPreBuildEventTool"/>
+			<Tool
+				Name="VCPreLinkEventTool"/>
+			<Tool
+				Name="VCResourceCompilerTool"/>
+			<Tool
+				Name="VCWebServiceProxyGeneratorTool"/>
+			<Tool
+				Name="VCXMLDataGeneratorTool"/>
+			<Tool
+				Name="VCManagedWrapperGeneratorTool"/>
+			<Tool
+				Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
+		</Configuration>
+	</Configurations>
+	<References>
+	</References>
+	<Files>
+		<Filter
+			Name="Source Files"
+			Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
+			UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}">
+			<File
+				RelativePath="..\src\gtest-all.cc">
+				<FileConfiguration
+					Name="Debug|Win32">
+					<Tool
+						Name="VCCLCompilerTool"
+						AdditionalIncludeDirectories=""..";"..\include""/>
+				</FileConfiguration>
+				<FileConfiguration
+					Name="Release|Win32">
+					<Tool
+						Name="VCCLCompilerTool"
+						AdditionalIncludeDirectories=""..";"..\include""/>
+				</FileConfiguration>
+			</File>
+		</Filter>
+		<Filter
+			Name="Header Files"
+			Filter="h;hpp;hxx;hm;inl;inc;xsd"
+			UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}">
+		</Filter>
+	</Files>
+	<Globals>
+	</Globals>
+</VisualStudioProject>
diff --git a/contrib/gtest-1.7.0/msvc/gtest_main-md.vcproj b/contrib/gtest-1.7.0/msvc/gtest_main-md.vcproj
new file mode 100755
index 0000000..b5379fe
--- /dev/null
+++ b/contrib/gtest-1.7.0/msvc/gtest_main-md.vcproj
@@ -0,0 +1,129 @@
+<?xml version="1.0" encoding="Windows-1252"?>
+<VisualStudioProject
+	ProjectType="Visual C++"
+	Version="7.10"
+	Name="gtest_main-md"
+	ProjectGUID="{3AF54C8A-10BF-4332-9147-F68ED9862033}"
+	Keyword="Win32Proj">
+	<Platforms>
+		<Platform
+			Name="Win32"/>
+	</Platforms>
+	<Configurations>
+		<Configuration
+			Name="Debug|Win32"
+			OutputDirectory="$(SolutionName)/$(ConfigurationName)"
+			IntermediateDirectory="$(OutDir)/$(ProjectName)"
+			ConfigurationType="4"
+			CharacterSet="2"
+			ReferencesPath="">
+			<Tool
+				Name="VCCLCompilerTool"
+				Optimization="0"
+				PreprocessorDefinitions="WIN32;_DEBUG;_LIB"
+				MinimalRebuild="TRUE"
+				BasicRuntimeChecks="3"
+				RuntimeLibrary="3"
+				UsePrecompiledHeader="0"
+				WarningLevel="3"
+				Detect64BitPortabilityProblems="FALSE"
+				DebugInformationFormat="4"/>
+			<Tool
+				Name="VCCustomBuildTool"/>
+			<Tool
+				Name="VCLibrarianTool"
+				OutputFile="$(OutDir)/$(ProjectName)d.lib"/>
+			<Tool
+				Name="VCMIDLTool"/>
+			<Tool
+				Name="VCPostBuildEventTool"/>
+			<Tool
+				Name="VCPreBuildEventTool"/>
+			<Tool
+				Name="VCPreLinkEventTool"/>
+			<Tool
+				Name="VCResourceCompilerTool"/>
+			<Tool
+				Name="VCWebServiceProxyGeneratorTool"/>
+			<Tool
+				Name="VCXMLDataGeneratorTool"/>
+			<Tool
+				Name="VCManagedWrapperGeneratorTool"/>
+			<Tool
+				Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
+		</Configuration>
+		<Configuration
+			Name="Release|Win32"
+			OutputDirectory="$(SolutionName)/$(ConfigurationName)"
+			IntermediateDirectory="$(OutDir)/$(ProjectName)"
+			ConfigurationType="4"
+			CharacterSet="2"
+			ReferencesPath=""..\include";".."">
+			<Tool
+				Name="VCCLCompilerTool"
+				PreprocessorDefinitions="WIN32;NDEBUG;_LIB"
+				RuntimeLibrary="2"
+				UsePrecompiledHeader="0"
+				WarningLevel="3"
+				Detect64BitPortabilityProblems="FALSE"
+				DebugInformationFormat="3"/>
+			<Tool
+				Name="VCCustomBuildTool"/>
+			<Tool
+				Name="VCLibrarianTool"
+				OutputFile="$(OutDir)/$(ProjectName).lib"/>
+			<Tool
+				Name="VCMIDLTool"/>
+			<Tool
+				Name="VCPostBuildEventTool"/>
+			<Tool
+				Name="VCPreBuildEventTool"/>
+			<Tool
+				Name="VCPreLinkEventTool"/>
+			<Tool
+				Name="VCResourceCompilerTool"/>
+			<Tool
+				Name="VCWebServiceProxyGeneratorTool"/>
+			<Tool
+				Name="VCXMLDataGeneratorTool"/>
+			<Tool
+				Name="VCManagedWrapperGeneratorTool"/>
+			<Tool
+				Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
+		</Configuration>
+	</Configurations>
+	<References>
+		<ProjectReference
+			ReferencedProjectIdentifier="{C8F6C172-56F2-4E76-B5FA-C3B423B31BE8}"
+			Name="gtest-md"/>
+	</References>
+	<Files>
+		<Filter
+			Name="Source Files"
+			Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
+			UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}">
+			<File
+				RelativePath="..\src\gtest_main.cc">
+				<FileConfiguration
+					Name="Debug|Win32">
+					<Tool
+						Name="VCCLCompilerTool"
+						AdditionalIncludeDirectories=""..";"..\include""/>
+				</FileConfiguration>
+				<FileConfiguration
+					Name="Release|Win32">
+					<Tool
+						Name="VCCLCompilerTool"
+						AdditionalIncludeDirectories=""..";"..\include""/>
+				</FileConfiguration>
+			</File>
+		</Filter>
+		<Filter
+			Name="Header Files"
+			Filter="h;hpp;hxx;hm;inl;inc;xsd"
+			UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}">
+		</Filter>
+	</Files>
+	<Globals>
+	</Globals>
+</VisualStudioProject>
diff --git a/contrib/gtest-1.7.0/msvc/gtest_main.vcproj b/contrib/gtest-1.7.0/msvc/gtest_main.vcproj
new file mode 100755
index 0000000..e8b763c
--- /dev/null
+++ b/contrib/gtest-1.7.0/msvc/gtest_main.vcproj
@@ -0,0 +1,129 @@
+<?xml version="1.0" encoding="Windows-1252"?>
+<VisualStudioProject
+	ProjectType="Visual C++"
+	Version="7.10"
+	Name="gtest_main"
+	ProjectGUID="{3AF54C8A-10BF-4332-9147-F68ED9862032}"
+	Keyword="Win32Proj">
+	<Platforms>
+		<Platform
+			Name="Win32"/>
+	</Platforms>
+	<Configurations>
+		<Configuration
+			Name="Debug|Win32"
+			OutputDirectory="$(SolutionName)/$(ConfigurationName)"
+			IntermediateDirectory="$(OutDir)/$(ProjectName)"
+			ConfigurationType="4"
+			CharacterSet="2"
+			ReferencesPath="">
+			<Tool
+				Name="VCCLCompilerTool"
+				Optimization="0"
+				PreprocessorDefinitions="WIN32;_DEBUG;_LIB"
+				MinimalRebuild="TRUE"
+				BasicRuntimeChecks="3"
+				RuntimeLibrary="5"
+				UsePrecompiledHeader="0"
+				WarningLevel="3"
+				Detect64BitPortabilityProblems="FALSE"
+				DebugInformationFormat="4"/>
+			<Tool
+				Name="VCCustomBuildTool"/>
+			<Tool
+				Name="VCLibrarianTool"
+				OutputFile="$(OutDir)/$(ProjectName)d.lib"/>
+			<Tool
+				Name="VCMIDLTool"/>
+			<Tool
+				Name="VCPostBuildEventTool"/>
+			<Tool
+				Name="VCPreBuildEventTool"/>
+			<Tool
+				Name="VCPreLinkEventTool"/>
+			<Tool
+				Name="VCResourceCompilerTool"/>
+			<Tool
+				Name="VCWebServiceProxyGeneratorTool"/>
+			<Tool
+				Name="VCXMLDataGeneratorTool"/>
+			<Tool
+				Name="VCManagedWrapperGeneratorTool"/>
+			<Tool
+				Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
+		</Configuration>
+		<Configuration
+			Name="Release|Win32"
+			OutputDirectory="$(SolutionName)/$(ConfigurationName)"
+			IntermediateDirectory="$(OutDir)/$(ProjectName)"
+			ConfigurationType="4"
+			CharacterSet="2"
+			ReferencesPath=""..\include";".."">
+			<Tool
+				Name="VCCLCompilerTool"
+				PreprocessorDefinitions="WIN32;NDEBUG;_LIB"
+				RuntimeLibrary="4"
+				UsePrecompiledHeader="0"
+				WarningLevel="3"
+				Detect64BitPortabilityProblems="FALSE"
+				DebugInformationFormat="3"/>
+			<Tool
+				Name="VCCustomBuildTool"/>
+			<Tool
+				Name="VCLibrarianTool"
+				OutputFile="$(OutDir)/$(ProjectName).lib"/>
+			<Tool
+				Name="VCMIDLTool"/>
+			<Tool
+				Name="VCPostBuildEventTool"/>
+			<Tool
+				Name="VCPreBuildEventTool"/>
+			<Tool
+				Name="VCPreLinkEventTool"/>
+			<Tool
+				Name="VCResourceCompilerTool"/>
+			<Tool
+				Name="VCWebServiceProxyGeneratorTool"/>
+			<Tool
+				Name="VCXMLDataGeneratorTool"/>
+			<Tool
+				Name="VCManagedWrapperGeneratorTool"/>
+			<Tool
+				Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
+		</Configuration>
+	</Configurations>
+	<References>
+		<ProjectReference
+			ReferencedProjectIdentifier="{C8F6C172-56F2-4E76-B5FA-C3B423B31BE7}"
+			Name="gtest"/>
+	</References>
+	<Files>
+		<Filter
+			Name="Source Files"
+			Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
+			UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}">
+			<File
+				RelativePath="..\src\gtest_main.cc">
+				<FileConfiguration
+					Name="Debug|Win32">
+					<Tool
+						Name="VCCLCompilerTool"
+						AdditionalIncludeDirectories=""..";"..\include""/>
+				</FileConfiguration>
+				<FileConfiguration
+					Name="Release|Win32">
+					<Tool
+						Name="VCCLCompilerTool"
+						AdditionalIncludeDirectories=""..";"..\include""/>
+				</FileConfiguration>
+			</File>
+		</Filter>
+		<Filter
+			Name="Header Files"
+			Filter="h;hpp;hxx;hm;inl;inc;xsd"
+			UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}">
+		</Filter>
+	</Files>
+	<Globals>
+	</Globals>
+</VisualStudioProject>
diff --git a/contrib/gtest-1.7.0/msvc/gtest_prod_test-md.vcproj b/contrib/gtest-1.7.0/msvc/gtest_prod_test-md.vcproj
new file mode 100755
index 0000000..05b05d9
--- /dev/null
+++ b/contrib/gtest-1.7.0/msvc/gtest_prod_test-md.vcproj
@@ -0,0 +1,164 @@
+<?xml version="1.0" encoding="Windows-1252"?>
+<VisualStudioProject
+	ProjectType="Visual C++"
+	Version="7.10"
+	Name="gtest_prod_test-md"
+	ProjectGUID="{24848551-EF4F-47E8-9A9D-EA4D49BC3ECB}"
+	Keyword="Win32Proj">
+	<Platforms>
+		<Platform
+			Name="Win32"/>
+	</Platforms>
+	<Configurations>
+		<Configuration
+			Name="Debug|Win32"
+			OutputDirectory="$(SolutionName)/$(ConfigurationName)"
+			IntermediateDirectory="$(OutDir)/$(ProjectName)"
+			ConfigurationType="1"
+			CharacterSet="2">
+			<Tool
+				Name="VCCLCompilerTool"
+				Optimization="0"
+				PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE"
+				MinimalRebuild="TRUE"
+				BasicRuntimeChecks="3"
+				RuntimeLibrary="3"
+				UsePrecompiledHeader="3"
+				WarningLevel="3"
+				Detect64BitPortabilityProblems="FALSE"
+				DebugInformationFormat="4"/>
+			<Tool
+				Name="VCCustomBuildTool"/>
+			<Tool
+				Name="VCLinkerTool"
+				OutputFile="$(OutDir)/gtest_prod_test.exe"
+				LinkIncremental="2"
+				GenerateDebugInformation="TRUE"
+				ProgramDatabaseFile="$(OutDir)/gtest_prod_test.pdb"
+				SubSystem="1"
+				TargetMachine="1"/>
+			<Tool
+				Name="VCMIDLTool"/>
+			<Tool
+				Name="VCPostBuildEventTool"/>
+			<Tool
+				Name="VCPreBuildEventTool"/>
+			<Tool
+				Name="VCPreLinkEventTool"/>
+			<Tool
+				Name="VCResourceCompilerTool"/>
+			<Tool
+				Name="VCWebServiceProxyGeneratorTool"/>
+			<Tool
+				Name="VCXMLDataGeneratorTool"/>
+			<Tool
+				Name="VCWebDeploymentTool"/>
+			<Tool
+				Name="VCManagedWrapperGeneratorTool"/>
+			<Tool
+				Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
+		</Configuration>
+		<Configuration
+			Name="Release|Win32"
+			OutputDirectory="$(SolutionName)/$(ConfigurationName)"
+			IntermediateDirectory="$(OutDir)/$(ProjectName)"
+			ConfigurationType="1"
+			CharacterSet="2">
+			<Tool
+				Name="VCCLCompilerTool"
+				PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
+				RuntimeLibrary="2"
+				UsePrecompiledHeader="3"
+				WarningLevel="3"
+				Detect64BitPortabilityProblems="FALSE"
+				DebugInformationFormat="3"/>
+			<Tool
+				Name="VCCustomBuildTool"/>
+			<Tool
+				Name="VCLinkerTool"
+				OutputFile="$(OutDir)/gtest_prod_test.exe"
+				LinkIncremental="1"
+				GenerateDebugInformation="TRUE"
+				SubSystem="1"
+				OptimizeReferences="2"
+				EnableCOMDATFolding="2"
+				TargetMachine="1"/>
+			<Tool
+				Name="VCMIDLTool"/>
+			<Tool
+				Name="VCPostBuildEventTool"/>
+			<Tool
+				Name="VCPreBuildEventTool"/>
+			<Tool
+				Name="VCPreLinkEventTool"/>
+			<Tool
+				Name="VCResourceCompilerTool"/>
+			<Tool
+				Name="VCWebServiceProxyGeneratorTool"/>
+			<Tool
+				Name="VCXMLDataGeneratorTool"/>
+			<Tool
+				Name="VCWebDeploymentTool"/>
+			<Tool
+				Name="VCManagedWrapperGeneratorTool"/>
+			<Tool
+				Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
+		</Configuration>
+	</Configurations>
+	<References>
+		<ProjectReference
+			ReferencedProjectIdentifier="{3AF54C8A-10BF-4332-9147-F68ED9862033}"
+			Name="gtest_main-md"/>
+	</References>
+	<Files>
+		<Filter
+			Name="Source Files"
+			Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
+			UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}">
+			<File
+				RelativePath="..\test\gtest_prod_test.cc">
+				<FileConfiguration
+					Name="Debug|Win32">
+					<Tool
+						Name="VCCLCompilerTool"
+						AdditionalIncludeDirectories=""..";"..\include""
+						UsePrecompiledHeader="0"/>
+				</FileConfiguration>
+				<FileConfiguration
+					Name="Release|Win32">
+					<Tool
+						Name="VCCLCompilerTool"
+						AdditionalIncludeDirectories=""..";"..\include""
+						UsePrecompiledHeader="0"/>
+				</FileConfiguration>
+			</File>
+			<File
+				RelativePath="..\test\production.cc">
+				<FileConfiguration
+					Name="Debug|Win32">
+					<Tool
+						Name="VCCLCompilerTool"
+						AdditionalIncludeDirectories=""..";"..\include""
+						UsePrecompiledHeader="0"/>
+				</FileConfiguration>
+				<FileConfiguration
+					Name="Release|Win32">
+					<Tool
+						Name="VCCLCompilerTool"
+						AdditionalIncludeDirectories=""..";"..\include""
+						UsePrecompiledHeader="0"/>
+				</FileConfiguration>
+			</File>
+		</Filter>
+		<Filter
+			Name="Header Files"
+			Filter="h;hpp;hxx;hm;inl;inc;xsd"
+			UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}">
+			<File
+				RelativePath="..\test\production.h">
+			</File>
+		</Filter>
+	</Files>
+	<Globals>
+	</Globals>
+</VisualStudioProject>
diff --git a/contrib/gtest-1.7.0/msvc/gtest_prod_test.vcproj b/contrib/gtest-1.7.0/msvc/gtest_prod_test.vcproj
new file mode 100755
index 0000000..6d7a2f0
--- /dev/null
+++ b/contrib/gtest-1.7.0/msvc/gtest_prod_test.vcproj
@@ -0,0 +1,164 @@
+<?xml version="1.0" encoding="Windows-1252"?>
+<VisualStudioProject
+	ProjectType="Visual C++"
+	Version="7.10"
+	Name="gtest_prod_test"
+	ProjectGUID="{24848551-EF4F-47E8-9A9D-EA4D49BC3ECA}"
+	Keyword="Win32Proj">
+	<Platforms>
+		<Platform
+			Name="Win32"/>
+	</Platforms>
+	<Configurations>
+		<Configuration
+			Name="Debug|Win32"
+			OutputDirectory="$(SolutionName)/$(ConfigurationName)"
+			IntermediateDirectory="$(OutDir)/$(ProjectName)"
+			ConfigurationType="1"
+			CharacterSet="2">
+			<Tool
+				Name="VCCLCompilerTool"
+				Optimization="0"
+				PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE"
+				MinimalRebuild="TRUE"
+				BasicRuntimeChecks="3"
+				RuntimeLibrary="5"
+				UsePrecompiledHeader="3"
+				WarningLevel="3"
+				Detect64BitPortabilityProblems="FALSE"
+				DebugInformationFormat="4"/>
+			<Tool
+				Name="VCCustomBuildTool"/>
+			<Tool
+				Name="VCLinkerTool"
+				OutputFile="$(OutDir)/gtest_prod_test.exe"
+				LinkIncremental="2"
+				GenerateDebugInformation="TRUE"
+				ProgramDatabaseFile="$(OutDir)/gtest_prod_test.pdb"
+				SubSystem="1"
+				TargetMachine="1"/>
+			<Tool
+				Name="VCMIDLTool"/>
+			<Tool
+				Name="VCPostBuildEventTool"/>
+			<Tool
+				Name="VCPreBuildEventTool"/>
+			<Tool
+				Name="VCPreLinkEventTool"/>
+			<Tool
+				Name="VCResourceCompilerTool"/>
+			<Tool
+				Name="VCWebServiceProxyGeneratorTool"/>
+			<Tool
+				Name="VCXMLDataGeneratorTool"/>
+			<Tool
+				Name="VCWebDeploymentTool"/>
+			<Tool
+				Name="VCManagedWrapperGeneratorTool"/>
+			<Tool
+				Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
+		</Configuration>
+		<Configuration
+			Name="Release|Win32"
+			OutputDirectory="$(SolutionName)/$(ConfigurationName)"
+			IntermediateDirectory="$(OutDir)/$(ProjectName)"
+			ConfigurationType="1"
+			CharacterSet="2">
+			<Tool
+				Name="VCCLCompilerTool"
+				PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
+				RuntimeLibrary="4"
+				UsePrecompiledHeader="3"
+				WarningLevel="3"
+				Detect64BitPortabilityProblems="FALSE"
+				DebugInformationFormat="3"/>
+			<Tool
+				Name="VCCustomBuildTool"/>
+			<Tool
+				Name="VCLinkerTool"
+				OutputFile="$(OutDir)/gtest_prod_test.exe"
+				LinkIncremental="1"
+				GenerateDebugInformation="TRUE"
+				SubSystem="1"
+				OptimizeReferences="2"
+				EnableCOMDATFolding="2"
+				TargetMachine="1"/>
+			<Tool
+				Name="VCMIDLTool"/>
+			<Tool
+				Name="VCPostBuildEventTool"/>
+			<Tool
+				Name="VCPreBuildEventTool"/>
+			<Tool
+				Name="VCPreLinkEventTool"/>
+			<Tool
+				Name="VCResourceCompilerTool"/>
+			<Tool
+				Name="VCWebServiceProxyGeneratorTool"/>
+			<Tool
+				Name="VCXMLDataGeneratorTool"/>
+			<Tool
+				Name="VCWebDeploymentTool"/>
+			<Tool
+				Name="VCManagedWrapperGeneratorTool"/>
+			<Tool
+				Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
+		</Configuration>
+	</Configurations>
+	<References>
+		<ProjectReference
+			ReferencedProjectIdentifier="{3AF54C8A-10BF-4332-9147-F68ED9862032}"
+			Name="gtest_main"/>
+	</References>
+	<Files>
+		<Filter
+			Name="Source Files"
+			Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
+			UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}">
+			<File
+				RelativePath="..\test\gtest_prod_test.cc">
+				<FileConfiguration
+					Name="Debug|Win32">
+					<Tool
+						Name="VCCLCompilerTool"
+						AdditionalIncludeDirectories=""..";"..\include""
+						UsePrecompiledHeader="0"/>
+				</FileConfiguration>
+				<FileConfiguration
+					Name="Release|Win32">
+					<Tool
+						Name="VCCLCompilerTool"
+						AdditionalIncludeDirectories=""..";"..\include""
+						UsePrecompiledHeader="0"/>
+				</FileConfiguration>
+			</File>
+			<File
+				RelativePath="..\test\production.cc">
+				<FileConfiguration
+					Name="Debug|Win32">
+					<Tool
+						Name="VCCLCompilerTool"
+						AdditionalIncludeDirectories=""..";"..\include""
+						UsePrecompiledHeader="0"/>
+				</FileConfiguration>
+				<FileConfiguration
+					Name="Release|Win32">
+					<Tool
+						Name="VCCLCompilerTool"
+						AdditionalIncludeDirectories=""..";"..\include""
+						UsePrecompiledHeader="0"/>
+				</FileConfiguration>
+			</File>
+		</Filter>
+		<Filter
+			Name="Header Files"
+			Filter="h;hpp;hxx;hm;inl;inc;xsd"
+			UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}">
+			<File
+				RelativePath="..\test\production.h">
+			</File>
+		</Filter>
+	</Files>
+	<Globals>
+	</Globals>
+</VisualStudioProject>
diff --git a/contrib/gtest-1.7.0/msvc/gtest_unittest-md.vcproj b/contrib/gtest-1.7.0/msvc/gtest_unittest-md.vcproj
new file mode 100755
index 0000000..38a5e56
--- /dev/null
+++ b/contrib/gtest-1.7.0/msvc/gtest_unittest-md.vcproj
@@ -0,0 +1,147 @@
+<?xml version="1.0" encoding="Windows-1252"?>
+<VisualStudioProject
+	ProjectType="Visual C++"
+	Version="7.10"
+	Name="gtest_unittest-md"
+	ProjectGUID="{4D9FDFB5-986A-4139-823C-F4EE0ED481A2}"
+	Keyword="Win32Proj">
+	<Platforms>
+		<Platform
+			Name="Win32"/>
+	</Platforms>
+	<Configurations>
+		<Configuration
+			Name="Debug|Win32"
+			OutputDirectory="$(SolutionName)/$(ConfigurationName)"
+			IntermediateDirectory="$(OutDir)/$(ProjectName)"
+			ConfigurationType="1"
+			CharacterSet="2">
+			<Tool
+				Name="VCCLCompilerTool"
+				Optimization="0"
+				PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE"
+				MinimalRebuild="TRUE"
+				BasicRuntimeChecks="3"
+				RuntimeLibrary="3"
+				UsePrecompiledHeader="3"
+				WarningLevel="3"
+				Detect64BitPortabilityProblems="FALSE"
+				DebugInformationFormat="4"/>
+			<Tool
+				Name="VCCustomBuildTool"/>
+			<Tool
+				Name="VCLinkerTool"
+				OutputFile="$(OutDir)/gtest_unittest.exe"
+				LinkIncremental="2"
+				GenerateDebugInformation="TRUE"
+				ProgramDatabaseFile="$(OutDir)/gtest_unittest.pdb"
+				SubSystem="1"
+				TargetMachine="1"/>
+			<Tool
+				Name="VCMIDLTool"/>
+			<Tool
+				Name="VCPostBuildEventTool"/>
+			<Tool
+				Name="VCPreBuildEventTool"/>
+			<Tool
+				Name="VCPreLinkEventTool"/>
+			<Tool
+				Name="VCResourceCompilerTool"/>
+			<Tool
+				Name="VCWebServiceProxyGeneratorTool"/>
+			<Tool
+				Name="VCXMLDataGeneratorTool"/>
+			<Tool
+				Name="VCWebDeploymentTool"/>
+			<Tool
+				Name="VCManagedWrapperGeneratorTool"/>
+			<Tool
+				Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
+		</Configuration>
+		<Configuration
+			Name="Release|Win32"
+			OutputDirectory="$(SolutionName)/$(ConfigurationName)"
+			IntermediateDirectory="$(OutDir)/$(ProjectName)"
+			ConfigurationType="1"
+			CharacterSet="2">
+			<Tool
+				Name="VCCLCompilerTool"
+				PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
+				RuntimeLibrary="2"
+				UsePrecompiledHeader="3"
+				WarningLevel="3"
+				Detect64BitPortabilityProblems="FALSE"
+				DebugInformationFormat="3"/>
+			<Tool
+				Name="VCCustomBuildTool"/>
+			<Tool
+				Name="VCLinkerTool"
+				OutputFile="$(OutDir)/gtest_unittest.exe"
+				LinkIncremental="1"
+				GenerateDebugInformation="TRUE"
+				SubSystem="1"
+				OptimizeReferences="2"
+				EnableCOMDATFolding="2"
+				TargetMachine="1"/>
+			<Tool
+				Name="VCMIDLTool"/>
+			<Tool
+				Name="VCPostBuildEventTool"/>
+			<Tool
+				Name="VCPreBuildEventTool"/>
+			<Tool
+				Name="VCPreLinkEventTool"/>
+			<Tool
+				Name="VCResourceCompilerTool"/>
+			<Tool
+				Name="VCWebServiceProxyGeneratorTool"/>
+			<Tool
+				Name="VCXMLDataGeneratorTool"/>
+			<Tool
+				Name="VCWebDeploymentTool"/>
+			<Tool
+				Name="VCManagedWrapperGeneratorTool"/>
+			<Tool
+				Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
+		</Configuration>
+	</Configurations>
+	<References>
+		<ProjectReference
+			ReferencedProjectIdentifier="{3AF54C8A-10BF-4332-9147-F68ED9862033}"
+			Name="gtest_main-md"/>
+	</References>
+	<Files>
+		<Filter
+			Name="Source Files"
+			Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
+			UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}">
+			<File
+				RelativePath="..\test\gtest_unittest.cc">
+				<FileConfiguration
+					Name="Debug|Win32">
+					<Tool
+						Name="VCCLCompilerTool"
+						Optimization="1"
+						AdditionalIncludeDirectories=""..";"..\include""
+						BasicRuntimeChecks="0"
+						UsePrecompiledHeader="0"
+						DebugInformationFormat="3"/>
+				</FileConfiguration>
+				<FileConfiguration
+					Name="Release|Win32">
+					<Tool
+						Name="VCCLCompilerTool"
+						AdditionalIncludeDirectories=""..";"..\include""
+						UsePrecompiledHeader="0"/>
+				</FileConfiguration>
+			</File>
+		</Filter>
+		<Filter
+			Name="Header Files"
+			Filter="h;hpp;hxx;hm;inl;inc;xsd"
+			UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}">
+		</Filter>
+	</Files>
+	<Globals>
+	</Globals>
+</VisualStudioProject>
diff --git a/contrib/gtest-1.7.0/msvc/gtest_unittest.vcproj b/contrib/gtest-1.7.0/msvc/gtest_unittest.vcproj
new file mode 100755
index 0000000..cb1f52b
--- /dev/null
+++ b/contrib/gtest-1.7.0/msvc/gtest_unittest.vcproj
@@ -0,0 +1,147 @@
+<?xml version="1.0" encoding="Windows-1252"?>
+<VisualStudioProject
+	ProjectType="Visual C++"
+	Version="7.10"
+	Name="gtest_unittest"
+	ProjectGUID="{4D9FDFB5-986A-4139-823C-F4EE0ED481A1}"
+	Keyword="Win32Proj">
+	<Platforms>
+		<Platform
+			Name="Win32"/>
+	</Platforms>
+	<Configurations>
+		<Configuration
+			Name="Debug|Win32"
+			OutputDirectory="$(SolutionName)/$(ConfigurationName)"
+			IntermediateDirectory="$(OutDir)/$(ProjectName)"
+			ConfigurationType="1"
+			CharacterSet="2">
+			<Tool
+				Name="VCCLCompilerTool"
+				Optimization="0"
+				PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE"
+				MinimalRebuild="TRUE"
+				BasicRuntimeChecks="3"
+				RuntimeLibrary="5"
+				UsePrecompiledHeader="3"
+				WarningLevel="3"
+				Detect64BitPortabilityProblems="FALSE"
+				DebugInformationFormat="4"/>
+			<Tool
+				Name="VCCustomBuildTool"/>
+			<Tool
+				Name="VCLinkerTool"
+				OutputFile="$(OutDir)/gtest_unittest.exe"
+				LinkIncremental="2"
+				GenerateDebugInformation="TRUE"
+				ProgramDatabaseFile="$(OutDir)/gtest_unittest.pdb"
+				SubSystem="1"
+				TargetMachine="1"/>
+			<Tool
+				Name="VCMIDLTool"/>
+			<Tool
+				Name="VCPostBuildEventTool"/>
+			<Tool
+				Name="VCPreBuildEventTool"/>
+			<Tool
+				Name="VCPreLinkEventTool"/>
+			<Tool
+				Name="VCResourceCompilerTool"/>
+			<Tool
+				Name="VCWebServiceProxyGeneratorTool"/>
+			<Tool
+				Name="VCXMLDataGeneratorTool"/>
+			<Tool
+				Name="VCWebDeploymentTool"/>
+			<Tool
+				Name="VCManagedWrapperGeneratorTool"/>
+			<Tool
+				Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
+		</Configuration>
+		<Configuration
+			Name="Release|Win32"
+			OutputDirectory="$(SolutionName)/$(ConfigurationName)"
+			IntermediateDirectory="$(OutDir)/$(ProjectName)"
+			ConfigurationType="1"
+			CharacterSet="2">
+			<Tool
+				Name="VCCLCompilerTool"
+				PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
+				RuntimeLibrary="4"
+				UsePrecompiledHeader="3"
+				WarningLevel="3"
+				Detect64BitPortabilityProblems="FALSE"
+				DebugInformationFormat="3"/>
+			<Tool
+				Name="VCCustomBuildTool"/>
+			<Tool
+				Name="VCLinkerTool"
+				OutputFile="$(OutDir)/gtest_unittest.exe"
+				LinkIncremental="1"
+				GenerateDebugInformation="TRUE"
+				SubSystem="1"
+				OptimizeReferences="2"
+				EnableCOMDATFolding="2"
+				TargetMachine="1"/>
+			<Tool
+				Name="VCMIDLTool"/>
+			<Tool
+				Name="VCPostBuildEventTool"/>
+			<Tool
+				Name="VCPreBuildEventTool"/>
+			<Tool
+				Name="VCPreLinkEventTool"/>
+			<Tool
+				Name="VCResourceCompilerTool"/>
+			<Tool
+				Name="VCWebServiceProxyGeneratorTool"/>
+			<Tool
+				Name="VCXMLDataGeneratorTool"/>
+			<Tool
+				Name="VCWebDeploymentTool"/>
+			<Tool
+				Name="VCManagedWrapperGeneratorTool"/>
+			<Tool
+				Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
+		</Configuration>
+	</Configurations>
+	<References>
+		<ProjectReference
+			ReferencedProjectIdentifier="{3AF54C8A-10BF-4332-9147-F68ED9862032}"
+			Name="gtest_main"/>
+	</References>
+	<Files>
+		<Filter
+			Name="Source Files"
+			Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
+			UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}">
+			<File
+				RelativePath="..\test\gtest_unittest.cc">
+				<FileConfiguration
+					Name="Debug|Win32">
+					<Tool
+						Name="VCCLCompilerTool"
+						Optimization="1"
+						AdditionalIncludeDirectories=""..";"..\include""
+						BasicRuntimeChecks="0"
+						UsePrecompiledHeader="0"
+						DebugInformationFormat="3"/>
+				</FileConfiguration>
+				<FileConfiguration
+					Name="Release|Win32">
+					<Tool
+						Name="VCCLCompilerTool"
+						AdditionalIncludeDirectories=""..";"..\include""
+						UsePrecompiledHeader="0"/>
+				</FileConfiguration>
+			</File>
+		</Filter>
+		<Filter
+			Name="Header Files"
+			Filter="h;hpp;hxx;hm;inl;inc;xsd"
+			UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}">
+		</Filter>
+	</Files>
+	<Globals>
+	</Globals>
+</VisualStudioProject>
diff --git a/contrib/gtest-1.7.0/samples/prime_tables.h b/contrib/gtest-1.7.0/samples/prime_tables.h
new file mode 100644
index 0000000..92ce16a
--- /dev/null
+++ b/contrib/gtest-1.7.0/samples/prime_tables.h
@@ -0,0 +1,123 @@
+// Copyright 2008 Google Inc.
+// All Rights Reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+// Author: vladl at google.com (Vlad Losev)
+
+// This provides interface PrimeTable that determines whether a number is a
+// prime and determines a next prime number. This interface is used
+// in Google Test samples demonstrating use of parameterized tests.
+
+#ifndef GTEST_SAMPLES_PRIME_TABLES_H_
+#define GTEST_SAMPLES_PRIME_TABLES_H_
+
+#include <algorithm>
+
+// The prime table interface.
+class PrimeTable {
+ public:
+  virtual ~PrimeTable() {}
+
+  // Returns true iff n is a prime number.
+  virtual bool IsPrime(int n) const = 0;
+
+  // Returns the smallest prime number greater than p; or returns -1
+  // if the next prime is beyond the capacity of the table.
+  virtual int GetNextPrime(int p) const = 0;
+};
+
+// Implementation #1 calculates the primes on-the-fly.
+class OnTheFlyPrimeTable : public PrimeTable {
+ public:
+  virtual bool IsPrime(int n) const {
+    if (n <= 1) return false;
+
+    for (int i = 2; i*i <= n; i++) {
+      // n is divisible by an integer other than 1 and itself.
+      if ((n % i) == 0) return false;
+    }
+
+    return true;
+  }
+
+  virtual int GetNextPrime(int p) const {
+    for (int n = p + 1; n > 0; n++) {
+      if (IsPrime(n)) return n;
+    }
+
+    return -1;
+  }
+};
+
+// Implementation #2 pre-calculates the primes and stores the result
+// in an array.
+class PreCalculatedPrimeTable : public PrimeTable {
+ public:
+  // 'max' specifies the maximum number the prime table holds.
+  explicit PreCalculatedPrimeTable(int max)
+      : is_prime_size_(max + 1), is_prime_(new bool[max + 1]) {
+    CalculatePrimesUpTo(max);
+  }
+  virtual ~PreCalculatedPrimeTable() { delete[] is_prime_; }
+
+  virtual bool IsPrime(int n) const {
+    return 0 <= n && n < is_prime_size_ && is_prime_[n];
+  }
+
+  virtual int GetNextPrime(int p) const {
+    for (int n = p + 1; n < is_prime_size_; n++) {
+      if (is_prime_[n]) return n;
+    }
+
+    return -1;
+  }
+
+ private:
+  void CalculatePrimesUpTo(int max) {
+    ::std::fill(is_prime_, is_prime_ + is_prime_size_, true);
+    is_prime_[0] = is_prime_[1] = false;
+
+    for (int i = 2; i <= max; i++) {
+      if (!is_prime_[i]) continue;
+
+      // Marks all multiples of i (except i itself) as non-prime.
+      for (int j = 2*i; j <= max; j += i) {
+        is_prime_[j] = false;
+      }
+    }
+  }
+
+  const int is_prime_size_;
+  bool* const is_prime_;
+
+  // Disables compiler warning "assignment operator could not be generated."
+  void operator=(const PreCalculatedPrimeTable& rhs);
+};
+
+#endif  // GTEST_SAMPLES_PRIME_TABLES_H_
diff --git a/contrib/gtest-1.7.0/samples/sample1.cc b/contrib/gtest-1.7.0/samples/sample1.cc
new file mode 100644
index 0000000..f171e26
--- /dev/null
+++ b/contrib/gtest-1.7.0/samples/sample1.cc
@@ -0,0 +1,68 @@
+// Copyright 2005, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+// A sample program demonstrating using Google C++ testing framework.
+//
+// Author: wan at google.com (Zhanyong Wan)
+
+#include "sample1.h"
+
+// Returns n! (the factorial of n).  For negative n, n! is defined to be 1.
+int Factorial(int n) {
+  int result = 1;
+  for (int i = 1; i <= n; i++) {
+    result *= i;
+  }
+
+  return result;
+}
+
+// Returns true iff n is a prime number.
+bool IsPrime(int n) {
+  // Trivial case 1: small numbers
+  if (n <= 1) return false;
+
+  // Trivial case 2: even numbers
+  if (n % 2 == 0) return n == 2;
+
+  // Now, we have that n is odd and n >= 3.
+
+  // Try to divide n by every odd number i, starting from 3
+  for (int i = 3; ; i += 2) {
+    // We only have to try i up to the squre root of n
+    if (i > n/i) break;
+
+    // Now, we have i <= n/i < n.
+    // If n is divisible by i, n is not prime.
+    if (n % i == 0) return false;
+  }
+
+  // n has no integer factor in the range (1, n), and thus is prime.
+  return true;
+}
diff --git a/contrib/gtest-1.7.0/samples/sample1.h b/contrib/gtest-1.7.0/samples/sample1.h
new file mode 100644
index 0000000..3dfeb98
--- /dev/null
+++ b/contrib/gtest-1.7.0/samples/sample1.h
@@ -0,0 +1,43 @@
+// Copyright 2005, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+// A sample program demonstrating using Google C++ testing framework.
+//
+// Author: wan at google.com (Zhanyong Wan)
+
+#ifndef GTEST_SAMPLES_SAMPLE1_H_
+#define GTEST_SAMPLES_SAMPLE1_H_
+
+// Returns n! (the factorial of n).  For negative n, n! is defined to be 1.
+int Factorial(int n);
+
+// Returns true iff n is a prime number.
+bool IsPrime(int n);
+
+#endif  // GTEST_SAMPLES_SAMPLE1_H_
diff --git a/contrib/gtest-1.7.0/samples/sample10_unittest.cc b/contrib/gtest-1.7.0/samples/sample10_unittest.cc
new file mode 100644
index 0000000..0051cd5
--- /dev/null
+++ b/contrib/gtest-1.7.0/samples/sample10_unittest.cc
@@ -0,0 +1,144 @@
+// Copyright 2009 Google Inc. All Rights Reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: vladl at google.com (Vlad Losev)
+
+// This sample shows how to use Google Test listener API to implement
+// a primitive leak checker.
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#include "gtest/gtest.h"
+
+using ::testing::EmptyTestEventListener;
+using ::testing::InitGoogleTest;
+using ::testing::Test;
+using ::testing::TestCase;
+using ::testing::TestEventListeners;
+using ::testing::TestInfo;
+using ::testing::TestPartResult;
+using ::testing::UnitTest;
+
+namespace {
+
+// We will track memory used by this class.
+class Water {
+ public:
+  // Normal Water declarations go here.
+
+  // operator new and operator delete help us control water allocation.
+  void* operator new(size_t allocation_size) {
+    allocated_++;
+    return malloc(allocation_size);
+  }
+
+  void operator delete(void* block, size_t /* allocation_size */) {
+    allocated_--;
+    free(block);
+  }
+
+  static int allocated() { return allocated_; }
+
+ private:
+  static int allocated_;
+};
+
+int Water::allocated_ = 0;
+
+// This event listener monitors how many Water objects are created and
+// destroyed by each test, and reports a failure if a test leaks some Water
+// objects. It does this by comparing the number of live Water objects at
+// the beginning of a test and at the end of a test.
+class LeakChecker : public EmptyTestEventListener {
+ private:
+  // Called before a test starts.
+  virtual void OnTestStart(const TestInfo& /* test_info */) {
+    initially_allocated_ = Water::allocated();
+  }
+
+  // Called after a test ends.
+  virtual void OnTestEnd(const TestInfo& /* test_info */) {
+    int difference = Water::allocated() - initially_allocated_;
+
+    // You can generate a failure in any event handler except
+    // OnTestPartResult. Just use an appropriate Google Test assertion to do
+    // it.
+    EXPECT_LE(difference, 0) << "Leaked " << difference << " unit(s) of Water!";
+  }
+
+  int initially_allocated_;
+};
+
+TEST(ListenersTest, DoesNotLeak) {
+  Water* water = new Water;
+  delete water;
+}
+
+// This should fail when the --check_for_leaks command line flag is
+// specified.
+TEST(ListenersTest, LeaksWater) {
+  Water* water = new Water;
+  EXPECT_TRUE(water != NULL);
+}
+
+}  // namespace
+
+int main(int argc, char **argv) {
+  InitGoogleTest(&argc, argv);
+
+  bool check_for_leaks = false;
+  if (argc > 1 && strcmp(argv[1], "--check_for_leaks") == 0 )
+    check_for_leaks = true;
+  else
+    printf("%s\n", "Run this program with --check_for_leaks to enable "
+           "custom leak checking in the tests.");
+
+  // If we are given the --check_for_leaks command line flag, installs the
+  // leak checker.
+  if (check_for_leaks) {
+    TestEventListeners& listeners = UnitTest::GetInstance()->listeners();
+
+    // Adds the leak checker to the end of the test event listener list,
+    // after the default text output printer and the default XML report
+    // generator.
+    //
+    // The order is important - it ensures that failures generated in the
+    // leak checker's OnTestEnd() method are processed by the text and XML
+    // printers *before* their OnTestEnd() methods are called, such that
+    // they are attributed to the right test. Remember that a listener
+    // receives an OnXyzStart event *after* listeners preceding it in the
+    // list received that event, and receives an OnXyzEnd event *before*
+    // listeners preceding it.
+    //
+    // We don't need to worry about deleting the new listener later, as
+    // Google Test will do it.
+    listeners.Append(new LeakChecker);
+  }
+  return RUN_ALL_TESTS();
+}
diff --git a/contrib/gtest-1.7.0/samples/sample1_unittest.cc b/contrib/gtest-1.7.0/samples/sample1_unittest.cc
new file mode 100644
index 0000000..aefc4f1
--- /dev/null
+++ b/contrib/gtest-1.7.0/samples/sample1_unittest.cc
@@ -0,0 +1,153 @@
+// Copyright 2005, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+// A sample program demonstrating using Google C++ testing framework.
+//
+// Author: wan at google.com (Zhanyong Wan)
+
+
+// This sample shows how to write a simple unit test for a function,
+// using Google C++ testing framework.
+//
+// Writing a unit test using Google C++ testing framework is easy as 1-2-3:
+
+
+// Step 1. Include necessary header files such that the stuff your
+// test logic needs is declared.
+//
+// Don't forget gtest.h, which declares the testing framework.
+
+#include <limits.h>
+#include "sample1.h"
+#include "gtest/gtest.h"
+
+
+// Step 2. Use the TEST macro to define your tests.
+//
+// TEST has two parameters: the test case name and the test name.
+// After using the macro, you should define your test logic between a
+// pair of braces.  You can use a bunch of macros to indicate the
+// success or failure of a test.  EXPECT_TRUE and EXPECT_EQ are
+// examples of such macros.  For a complete list, see gtest.h.
+//
+// <TechnicalDetails>
+//
+// In Google Test, tests are grouped into test cases.  This is how we
+// keep test code organized.  You should put logically related tests
+// into the same test case.
+//
+// The test case name and the test name should both be valid C++
+// identifiers.  And you should not use underscore (_) in the names.
+//
+// Google Test guarantees that each test you define is run exactly
+// once, but it makes no guarantee on the order the tests are
+// executed.  Therefore, you should write your tests in such a way
+// that their results don't depend on their order.
+//
+// </TechnicalDetails>
+
+
+// Tests Factorial().
+
+// Tests factorial of negative numbers.
+TEST(FactorialTest, Negative) {
+  // This test is named "Negative", and belongs to the "FactorialTest"
+  // test case.
+  EXPECT_EQ(1, Factorial(-5));
+  EXPECT_EQ(1, Factorial(-1));
+  EXPECT_GT(Factorial(-10), 0);
+
+  // <TechnicalDetails>
+  //
+  // EXPECT_EQ(expected, actual) is the same as
+  //
+  //   EXPECT_TRUE((expected) == (actual))
+  //
+  // except that it will print both the expected value and the actual
+  // value when the assertion fails.  This is very helpful for
+  // debugging.  Therefore in this case EXPECT_EQ is preferred.
+  //
+  // On the other hand, EXPECT_TRUE accepts any Boolean expression,
+  // and is thus more general.
+  //
+  // </TechnicalDetails>
+}
+
+// Tests factorial of 0.
+TEST(FactorialTest, Zero) {
+  EXPECT_EQ(1, Factorial(0));
+}
+
+// Tests factorial of positive numbers.
+TEST(FactorialTest, Positive) {
+  EXPECT_EQ(1, Factorial(1));
+  EXPECT_EQ(2, Factorial(2));
+  EXPECT_EQ(6, Factorial(3));
+  EXPECT_EQ(40320, Factorial(8));
+}
+
+
+// Tests IsPrime()
+
+// Tests negative input.
+TEST(IsPrimeTest, Negative) {
+  // This test belongs to the IsPrimeTest test case.
+
+  EXPECT_FALSE(IsPrime(-1));
+  EXPECT_FALSE(IsPrime(-2));
+  EXPECT_FALSE(IsPrime(INT_MIN));
+}
+
+// Tests some trivial cases.
+TEST(IsPrimeTest, Trivial) {
+  EXPECT_FALSE(IsPrime(0));
+  EXPECT_FALSE(IsPrime(1));
+  EXPECT_TRUE(IsPrime(2));
+  EXPECT_TRUE(IsPrime(3));
+}
+
+// Tests positive input.
+TEST(IsPrimeTest, Positive) {
+  EXPECT_FALSE(IsPrime(4));
+  EXPECT_TRUE(IsPrime(5));
+  EXPECT_FALSE(IsPrime(6));
+  EXPECT_TRUE(IsPrime(23));
+}
+
+// Step 3. Call RUN_ALL_TESTS() in main().
+//
+// We do this by linking in src/gtest_main.cc file, which consists of
+// a main() function which calls RUN_ALL_TESTS() for us.
+//
+// This runs all the tests you've defined, prints the result, and
+// returns 0 if successful, or 1 otherwise.
+//
+// Did you notice that we didn't register the tests?  The
+// RUN_ALL_TESTS() macro magically knows about all the tests we
+// defined.  Isn't this convenient?
diff --git a/contrib/gtest-1.7.0/samples/sample2.cc b/contrib/gtest-1.7.0/samples/sample2.cc
new file mode 100644
index 0000000..5f763b9
--- /dev/null
+++ b/contrib/gtest-1.7.0/samples/sample2.cc
@@ -0,0 +1,56 @@
+// Copyright 2005, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+// A sample program demonstrating using Google C++ testing framework.
+//
+// Author: wan at google.com (Zhanyong Wan)
+
+#include "sample2.h"
+
+#include <string.h>
+
+// Clones a 0-terminated C string, allocating memory using new.
+const char* MyString::CloneCString(const char* a_c_string) {
+  if (a_c_string == NULL) return NULL;
+
+  const size_t len = strlen(a_c_string);
+  char* const clone = new char[ len + 1 ];
+  memcpy(clone, a_c_string, len + 1);
+
+  return clone;
+}
+
+// Sets the 0-terminated C string this MyString object
+// represents.
+void MyString::Set(const char* a_c_string) {
+  // Makes sure this works when c_string == c_string_
+  const char* const temp = MyString::CloneCString(a_c_string);
+  delete[] c_string_;
+  c_string_ = temp;
+}
diff --git a/contrib/gtest-1.7.0/samples/sample2.h b/contrib/gtest-1.7.0/samples/sample2.h
new file mode 100644
index 0000000..cb485c7
--- /dev/null
+++ b/contrib/gtest-1.7.0/samples/sample2.h
@@ -0,0 +1,85 @@
+// Copyright 2005, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+// A sample program demonstrating using Google C++ testing framework.
+//
+// Author: wan at google.com (Zhanyong Wan)
+
+#ifndef GTEST_SAMPLES_SAMPLE2_H_
+#define GTEST_SAMPLES_SAMPLE2_H_
+
+#include <string.h>
+
+
+// A simple string class.
+class MyString {
+ private:
+  const char* c_string_;
+  const MyString& operator=(const MyString& rhs);
+
+ public:
+  // Clones a 0-terminated C string, allocating memory using new.
+  static const char* CloneCString(const char* a_c_string);
+
+  ////////////////////////////////////////////////////////////
+  //
+  // C'tors
+
+  // The default c'tor constructs a NULL string.
+  MyString() : c_string_(NULL) {}
+
+  // Constructs a MyString by cloning a 0-terminated C string.
+  explicit MyString(const char* a_c_string) : c_string_(NULL) {
+    Set(a_c_string);
+  }
+
+  // Copy c'tor
+  MyString(const MyString& string) : c_string_(NULL) {
+    Set(string.c_string_);
+  }
+
+  ////////////////////////////////////////////////////////////
+  //
+  // D'tor.  MyString is intended to be a final class, so the d'tor
+  // doesn't need to be virtual.
+  ~MyString() { delete[] c_string_; }
+
+  // Gets the 0-terminated C string this MyString object represents.
+  const char* c_string() const { return c_string_; }
+
+  size_t Length() const {
+    return c_string_ == NULL ? 0 : strlen(c_string_);
+  }
+
+  // Sets the 0-terminated C string this MyString object represents.
+  void Set(const char* c_string);
+};
+
+
+#endif  // GTEST_SAMPLES_SAMPLE2_H_
diff --git a/contrib/gtest-1.7.0/samples/sample2_unittest.cc b/contrib/gtest-1.7.0/samples/sample2_unittest.cc
new file mode 100644
index 0000000..4fa19b7
--- /dev/null
+++ b/contrib/gtest-1.7.0/samples/sample2_unittest.cc
@@ -0,0 +1,109 @@
+// Copyright 2005, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+// A sample program demonstrating using Google C++ testing framework.
+//
+// Author: wan at google.com (Zhanyong Wan)
+
+
+// This sample shows how to write a more complex unit test for a class
+// that has multiple member functions.
+//
+// Usually, it's a good idea to have one test for each method in your
+// class.  You don't have to do that exactly, but it helps to keep
+// your tests organized.  You may also throw in additional tests as
+// needed.
+
+#include "sample2.h"
+#include "gtest/gtest.h"
+
+// In this example, we test the MyString class (a simple string).
+
+// Tests the default c'tor.
+TEST(MyString, DefaultConstructor) {
+  const MyString s;
+
+  // Asserts that s.c_string() returns NULL.
+  //
+  // <TechnicalDetails>
+  //
+  // If we write NULL instead of
+  //
+  //   static_cast<const char *>(NULL)
+  //
+  // in this assertion, it will generate a warning on gcc 3.4.  The
+  // reason is that EXPECT_EQ needs to know the types of its
+  // arguments in order to print them when it fails.  Since NULL is
+  // #defined as 0, the compiler will use the formatter function for
+  // int to print it.  However, gcc thinks that NULL should be used as
+  // a pointer, not an int, and therefore complains.
+  //
+  // The root of the problem is C++'s lack of distinction between the
+  // integer number 0 and the null pointer constant.  Unfortunately,
+  // we have to live with this fact.
+  //
+  // </TechnicalDetails>
+  EXPECT_STREQ(NULL, s.c_string());
+
+  EXPECT_EQ(0u, s.Length());
+}
+
+const char kHelloString[] = "Hello, world!";
+
+// Tests the c'tor that accepts a C string.
+TEST(MyString, ConstructorFromCString) {
+  const MyString s(kHelloString);
+  EXPECT_EQ(0, strcmp(s.c_string(), kHelloString));
+  EXPECT_EQ(sizeof(kHelloString)/sizeof(kHelloString[0]) - 1,
+            s.Length());
+}
+
+// Tests the copy c'tor.
+TEST(MyString, CopyConstructor) {
+  const MyString s1(kHelloString);
+  const MyString s2 = s1;
+  EXPECT_EQ(0, strcmp(s2.c_string(), kHelloString));
+}
+
+// Tests the Set method.
+TEST(MyString, Set) {
+  MyString s;
+
+  s.Set(kHelloString);
+  EXPECT_EQ(0, strcmp(s.c_string(), kHelloString));
+
+  // Set should work when the input pointer is the same as the one
+  // already in the MyString object.
+  s.Set(s.c_string());
+  EXPECT_EQ(0, strcmp(s.c_string(), kHelloString));
+
+  // Can we set the MyString to NULL?
+  s.Set(NULL);
+  EXPECT_STREQ(NULL, s.c_string());
+}
diff --git a/contrib/gtest-1.7.0/samples/sample3-inl.h b/contrib/gtest-1.7.0/samples/sample3-inl.h
new file mode 100644
index 0000000..7e3084d
--- /dev/null
+++ b/contrib/gtest-1.7.0/samples/sample3-inl.h
@@ -0,0 +1,172 @@
+// Copyright 2005, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+// A sample program demonstrating using Google C++ testing framework.
+//
+// Author: wan at google.com (Zhanyong Wan)
+
+#ifndef GTEST_SAMPLES_SAMPLE3_INL_H_
+#define GTEST_SAMPLES_SAMPLE3_INL_H_
+
+#include <stddef.h>
+
+
+// Queue is a simple queue implemented as a singled-linked list.
+//
+// The element type must support copy constructor.
+template <typename E>  // E is the element type
+class Queue;
+
+// QueueNode is a node in a Queue, which consists of an element of
+// type E and a pointer to the next node.
+template <typename E>  // E is the element type
+class QueueNode {
+  friend class Queue<E>;
+
+ public:
+  // Gets the element in this node.
+  const E& element() const { return element_; }
+
+  // Gets the next node in the queue.
+  QueueNode* next() { return next_; }
+  const QueueNode* next() const { return next_; }
+
+ private:
+  // Creates a node with a given element value.  The next pointer is
+  // set to NULL.
+  explicit QueueNode(const E& an_element) : element_(an_element), next_(NULL) {}
+
+  // We disable the default assignment operator and copy c'tor.
+  const QueueNode& operator = (const QueueNode&);
+  QueueNode(const QueueNode&);
+
+  E element_;
+  QueueNode* next_;
+};
+
+template <typename E>  // E is the element type.
+class Queue {
+ public:
+  // Creates an empty queue.
+  Queue() : head_(NULL), last_(NULL), size_(0) {}
+
+  // D'tor.  Clears the queue.
+  ~Queue() { Clear(); }
+
+  // Clears the queue.
+  void Clear() {
+    if (size_ > 0) {
+      // 1. Deletes every node.
+      QueueNode<E>* node = head_;
+      QueueNode<E>* next = node->next();
+      for (; ;) {
+        delete node;
+        node = next;
+        if (node == NULL) break;
+        next = node->next();
+      }
+
+      // 2. Resets the member variables.
+      head_ = last_ = NULL;
+      size_ = 0;
+    }
+  }
+
+  // Gets the number of elements.
+  size_t Size() const { return size_; }
+
+  // Gets the first element of the queue, or NULL if the queue is empty.
+  QueueNode<E>* Head() { return head_; }
+  const QueueNode<E>* Head() const { return head_; }
+
+  // Gets the last element of the queue, or NULL if the queue is empty.
+  QueueNode<E>* Last() { return last_; }
+  const QueueNode<E>* Last() const { return last_; }
+
+  // Adds an element to the end of the queue.  A copy of the element is
+  // created using the copy constructor, and then stored in the queue.
+  // Changes made to the element in the queue doesn't affect the source
+  // object, and vice versa.
+  void Enqueue(const E& element) {
+    QueueNode<E>* new_node = new QueueNode<E>(element);
+
+    if (size_ == 0) {
+      head_ = last_ = new_node;
+      size_ = 1;
+    } else {
+      last_->next_ = new_node;
+      last_ = new_node;
+      size_++;
+    }
+  }
+
+  // Removes the head of the queue and returns it.  Returns NULL if
+  // the queue is empty.
+  E* Dequeue() {
+    if (size_ == 0) {
+      return NULL;
+    }
+
+    const QueueNode<E>* const old_head = head_;
+    head_ = head_->next_;
+    size_--;
+    if (size_ == 0) {
+      last_ = NULL;
+    }
+
+    E* element = new E(old_head->element());
+    delete old_head;
+
+    return element;
+  }
+
+  // Applies a function/functor on each element of the queue, and
+  // returns the result in a new queue.  The original queue is not
+  // affected.
+  template <typename F>
+  Queue* Map(F function) const {
+    Queue* new_queue = new Queue();
+    for (const QueueNode<E>* node = head_; node != NULL; node = node->next_) {
+      new_queue->Enqueue(function(node->element()));
+    }
+
+    return new_queue;
+  }
+
+ private:
+  QueueNode<E>* head_;  // The first node of the queue.
+  QueueNode<E>* last_;  // The last node of the queue.
+  size_t size_;  // The number of elements in the queue.
+
+  // We disallow copying a queue.
+  Queue(const Queue&);
+  const Queue& operator = (const Queue&);
+};
+
+#endif  // GTEST_SAMPLES_SAMPLE3_INL_H_
diff --git a/contrib/gtest-1.7.0/samples/sample3_unittest.cc b/contrib/gtest-1.7.0/samples/sample3_unittest.cc
new file mode 100644
index 0000000..bf3877d
--- /dev/null
+++ b/contrib/gtest-1.7.0/samples/sample3_unittest.cc
@@ -0,0 +1,151 @@
+// Copyright 2005, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+// A sample program demonstrating using Google C++ testing framework.
+//
+// Author: wan at google.com (Zhanyong Wan)
+
+
+// In this example, we use a more advanced feature of Google Test called
+// test fixture.
+//
+// A test fixture is a place to hold objects and functions shared by
+// all tests in a test case.  Using a test fixture avoids duplicating
+// the test code necessary to initialize and cleanup those common
+// objects for each test.  It is also useful for defining sub-routines
+// that your tests need to invoke a lot.
+//
+// <TechnicalDetails>
+//
+// The tests share the test fixture in the sense of code sharing, not
+// data sharing.  Each test is given its own fresh copy of the
+// fixture.  You cannot expect the data modified by one test to be
+// passed on to another test, which is a bad idea.
+//
+// The reason for this design is that tests should be independent and
+// repeatable.  In particular, a test should not fail as the result of
+// another test's failure.  If one test depends on info produced by
+// another test, then the two tests should really be one big test.
+//
+// The macros for indicating the success/failure of a test
+// (EXPECT_TRUE, FAIL, etc) need to know what the current test is
+// (when Google Test prints the test result, it tells you which test
+// each failure belongs to).  Technically, these macros invoke a
+// member function of the Test class.  Therefore, you cannot use them
+// in a global function.  That's why you should put test sub-routines
+// in a test fixture.
+//
+// </TechnicalDetails>
+
+#include "sample3-inl.h"
+#include "gtest/gtest.h"
+
+// To use a test fixture, derive a class from testing::Test.
+class QueueTest : public testing::Test {
+ protected:  // You should make the members protected s.t. they can be
+             // accessed from sub-classes.
+
+  // virtual void SetUp() will be called before each test is run.  You
+  // should define it if you need to initialize the varaibles.
+  // Otherwise, this can be skipped.
+  virtual void SetUp() {
+    q1_.Enqueue(1);
+    q2_.Enqueue(2);
+    q2_.Enqueue(3);
+  }
+
+  // virtual void TearDown() will be called after each test is run.
+  // You should define it if there is cleanup work to do.  Otherwise,
+  // you don't have to provide it.
+  //
+  // virtual void TearDown() {
+  // }
+
+  // A helper function that some test uses.
+  static int Double(int n) {
+    return 2*n;
+  }
+
+  // A helper function for testing Queue::Map().
+  void MapTester(const Queue<int> * q) {
+    // Creates a new queue, where each element is twice as big as the
+    // corresponding one in q.
+    const Queue<int> * const new_q = q->Map(Double);
+
+    // Verifies that the new queue has the same size as q.
+    ASSERT_EQ(q->Size(), new_q->Size());
+
+    // Verifies the relationship between the elements of the two queues.
+    for ( const QueueNode<int> * n1 = q->Head(), * n2 = new_q->Head();
+          n1 != NULL; n1 = n1->next(), n2 = n2->next() ) {
+      EXPECT_EQ(2 * n1->element(), n2->element());
+    }
+
+    delete new_q;
+  }
+
+  // Declares the variables your tests want to use.
+  Queue<int> q0_;
+  Queue<int> q1_;
+  Queue<int> q2_;
+};
+
+// When you have a test fixture, you define a test using TEST_F
+// instead of TEST.
+
+// Tests the default c'tor.
+TEST_F(QueueTest, DefaultConstructor) {
+  // You can access data in the test fixture here.
+  EXPECT_EQ(0u, q0_.Size());
+}
+
+// Tests Dequeue().
+TEST_F(QueueTest, Dequeue) {
+  int * n = q0_.Dequeue();
+  EXPECT_TRUE(n == NULL);
+
+  n = q1_.Dequeue();
+  ASSERT_TRUE(n != NULL);
+  EXPECT_EQ(1, *n);
+  EXPECT_EQ(0u, q1_.Size());
+  delete n;
+
+  n = q2_.Dequeue();
+  ASSERT_TRUE(n != NULL);
+  EXPECT_EQ(2, *n);
+  EXPECT_EQ(1u, q2_.Size());
+  delete n;
+}
+
+// Tests the Queue::Map() function.
+TEST_F(QueueTest, Map) {
+  MapTester(&q0_);
+  MapTester(&q1_);
+  MapTester(&q2_);
+}
diff --git a/contrib/gtest-1.7.0/samples/sample4.cc b/contrib/gtest-1.7.0/samples/sample4.cc
new file mode 100644
index 0000000..ae44bda
--- /dev/null
+++ b/contrib/gtest-1.7.0/samples/sample4.cc
@@ -0,0 +1,46 @@
+// Copyright 2005, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+// A sample program demonstrating using Google C++ testing framework.
+//
+// Author: wan at google.com (Zhanyong Wan)
+
+#include <stdio.h>
+
+#include "sample4.h"
+
+// Returns the current counter value, and increments it.
+int Counter::Increment() {
+  return counter_++;
+}
+
+// Prints the current counter value to STDOUT.
+void Counter::Print() const {
+  printf("%d", counter_);
+}
diff --git a/contrib/gtest-1.7.0/samples/sample4.h b/contrib/gtest-1.7.0/samples/sample4.h
new file mode 100644
index 0000000..cd60f0d
--- /dev/null
+++ b/contrib/gtest-1.7.0/samples/sample4.h
@@ -0,0 +1,53 @@
+// Copyright 2005, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+// A sample program demonstrating using Google C++ testing framework.
+//
+// Author: wan at google.com (Zhanyong Wan)
+
+#ifndef GTEST_SAMPLES_SAMPLE4_H_
+#define GTEST_SAMPLES_SAMPLE4_H_
+
+// A simple monotonic counter.
+class Counter {
+ private:
+  int counter_;
+
+ public:
+  // Creates a counter that starts at 0.
+  Counter() : counter_(0) {}
+
+  // Returns the current counter value, and increments it.
+  int Increment();
+
+  // Prints the current counter value to STDOUT.
+  void Print() const;
+};
+
+#endif  // GTEST_SAMPLES_SAMPLE4_H_
diff --git a/contrib/gtest-1.7.0/samples/sample4_unittest.cc b/contrib/gtest-1.7.0/samples/sample4_unittest.cc
new file mode 100644
index 0000000..fa5afc7
--- /dev/null
+++ b/contrib/gtest-1.7.0/samples/sample4_unittest.cc
@@ -0,0 +1,45 @@
+// Copyright 2005, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+
+#include "gtest/gtest.h"
+#include "sample4.h"
+
+// Tests the Increment() method.
+TEST(Counter, Increment) {
+  Counter c;
+
+  // EXPECT_EQ() evaluates its arguments exactly once, so they
+  // can have side effects.
+
+  EXPECT_EQ(0, c.Increment());
+  EXPECT_EQ(1, c.Increment());
+  EXPECT_EQ(2, c.Increment());
+}
diff --git a/contrib/gtest-1.7.0/samples/sample5_unittest.cc b/contrib/gtest-1.7.0/samples/sample5_unittest.cc
new file mode 100644
index 0000000..43d8e57
--- /dev/null
+++ b/contrib/gtest-1.7.0/samples/sample5_unittest.cc
@@ -0,0 +1,199 @@
+// Copyright 2005, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+
+// This sample teaches how to reuse a test fixture in multiple test
+// cases by deriving sub-fixtures from it.
+//
+// When you define a test fixture, you specify the name of the test
+// case that will use this fixture.  Therefore, a test fixture can
+// be used by only one test case.
+//
+// Sometimes, more than one test cases may want to use the same or
+// slightly different test fixtures.  For example, you may want to
+// make sure that all tests for a GUI library don't leak important
+// system resources like fonts and brushes.  In Google Test, you do
+// this by putting the shared logic in a super (as in "super class")
+// test fixture, and then have each test case use a fixture derived
+// from this super fixture.
+
+#include <limits.h>
+#include <time.h>
+#include "sample3-inl.h"
+#include "gtest/gtest.h"
+#include "sample1.h"
+
+// In this sample, we want to ensure that every test finishes within
+// ~5 seconds.  If a test takes longer to run, we consider it a
+// failure.
+//
+// We put the code for timing a test in a test fixture called
+// "QuickTest".  QuickTest is intended to be the super fixture that
+// other fixtures derive from, therefore there is no test case with
+// the name "QuickTest".  This is OK.
+//
+// Later, we will derive multiple test fixtures from QuickTest.
+class QuickTest : public testing::Test {
+ protected:
+  // Remember that SetUp() is run immediately before a test starts.
+  // This is a good place to record the start time.
+  virtual void SetUp() {
+    start_time_ = time(NULL);
+  }
+
+  // TearDown() is invoked immediately after a test finishes.  Here we
+  // check if the test was too slow.
+  virtual void TearDown() {
+    // Gets the time when the test finishes
+    const time_t end_time = time(NULL);
+
+    // Asserts that the test took no more than ~5 seconds.  Did you
+    // know that you can use assertions in SetUp() and TearDown() as
+    // well?
+    EXPECT_TRUE(end_time - start_time_ <= 5) << "The test took too long.";
+  }
+
+  // The UTC time (in seconds) when the test starts
+  time_t start_time_;
+};
+
+
+// We derive a fixture named IntegerFunctionTest from the QuickTest
+// fixture.  All tests using this fixture will be automatically
+// required to be quick.
+class IntegerFunctionTest : public QuickTest {
+  // We don't need any more logic than already in the QuickTest fixture.
+  // Therefore the body is empty.
+};
+
+
+// Now we can write tests in the IntegerFunctionTest test case.
+
+// Tests Factorial()
+TEST_F(IntegerFunctionTest, Factorial) {
+  // Tests factorial of negative numbers.
+  EXPECT_EQ(1, Factorial(-5));
+  EXPECT_EQ(1, Factorial(-1));
+  EXPECT_GT(Factorial(-10), 0);
+
+  // Tests factorial of 0.
+  EXPECT_EQ(1, Factorial(0));
+
+  // Tests factorial of positive numbers.
+  EXPECT_EQ(1, Factorial(1));
+  EXPECT_EQ(2, Factorial(2));
+  EXPECT_EQ(6, Factorial(3));
+  EXPECT_EQ(40320, Factorial(8));
+}
+
+
+// Tests IsPrime()
+TEST_F(IntegerFunctionTest, IsPrime) {
+  // Tests negative input.
+  EXPECT_FALSE(IsPrime(-1));
+  EXPECT_FALSE(IsPrime(-2));
+  EXPECT_FALSE(IsPrime(INT_MIN));
+
+  // Tests some trivial cases.
+  EXPECT_FALSE(IsPrime(0));
+  EXPECT_FALSE(IsPrime(1));
+  EXPECT_TRUE(IsPrime(2));
+  EXPECT_TRUE(IsPrime(3));
+
+  // Tests positive input.
+  EXPECT_FALSE(IsPrime(4));
+  EXPECT_TRUE(IsPrime(5));
+  EXPECT_FALSE(IsPrime(6));
+  EXPECT_TRUE(IsPrime(23));
+}
+
+
+// The next test case (named "QueueTest") also needs to be quick, so
+// we derive another fixture from QuickTest.
+//
+// The QueueTest test fixture has some logic and shared objects in
+// addition to what's in QuickTest already.  We define the additional
+// stuff inside the body of the test fixture, as usual.
+class QueueTest : public QuickTest {
+ protected:
+  virtual void SetUp() {
+    // First, we need to set up the super fixture (QuickTest).
+    QuickTest::SetUp();
+
+    // Second, some additional setup for this fixture.
+    q1_.Enqueue(1);
+    q2_.Enqueue(2);
+    q2_.Enqueue(3);
+  }
+
+  // By default, TearDown() inherits the behavior of
+  // QuickTest::TearDown().  As we have no additional cleaning work
+  // for QueueTest, we omit it here.
+  //
+  // virtual void TearDown() {
+  //   QuickTest::TearDown();
+  // }
+
+  Queue<int> q0_;
+  Queue<int> q1_;
+  Queue<int> q2_;
+};
+
+
+// Now, let's write tests using the QueueTest fixture.
+
+// Tests the default constructor.
+TEST_F(QueueTest, DefaultConstructor) {
+  EXPECT_EQ(0u, q0_.Size());
+}
+
+// Tests Dequeue().
+TEST_F(QueueTest, Dequeue) {
+  int* n = q0_.Dequeue();
+  EXPECT_TRUE(n == NULL);
+
+  n = q1_.Dequeue();
+  EXPECT_TRUE(n != NULL);
+  EXPECT_EQ(1, *n);
+  EXPECT_EQ(0u, q1_.Size());
+  delete n;
+
+  n = q2_.Dequeue();
+  EXPECT_TRUE(n != NULL);
+  EXPECT_EQ(2, *n);
+  EXPECT_EQ(1u, q2_.Size());
+  delete n;
+}
+
+// If necessary, you can derive further test fixtures from a derived
+// fixture itself.  For example, you can derive another fixture from
+// QueueTest.  Google Test imposes no limit on how deep the hierarchy
+// can be.  In practice, however, you probably don't want it to be too
+// deep as to be confusing.
diff --git a/contrib/gtest-1.7.0/samples/sample6_unittest.cc b/contrib/gtest-1.7.0/samples/sample6_unittest.cc
new file mode 100644
index 0000000..8f2036a
--- /dev/null
+++ b/contrib/gtest-1.7.0/samples/sample6_unittest.cc
@@ -0,0 +1,224 @@
+// Copyright 2008 Google Inc.
+// All Rights Reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+
+// This sample shows how to test common properties of multiple
+// implementations of the same interface (aka interface tests).
+
+// The interface and its implementations are in this header.
+#include "prime_tables.h"
+
+#include "gtest/gtest.h"
+
+// First, we define some factory functions for creating instances of
+// the implementations.  You may be able to skip this step if all your
+// implementations can be constructed the same way.
+
+template <class T>
+PrimeTable* CreatePrimeTable();
+
+template <>
+PrimeTable* CreatePrimeTable<OnTheFlyPrimeTable>() {
+  return new OnTheFlyPrimeTable;
+}
+
+template <>
+PrimeTable* CreatePrimeTable<PreCalculatedPrimeTable>() {
+  return new PreCalculatedPrimeTable(10000);
+}
+
+// Then we define a test fixture class template.
+template <class T>
+class PrimeTableTest : public testing::Test {
+ protected:
+  // The ctor calls the factory function to create a prime table
+  // implemented by T.
+  PrimeTableTest() : table_(CreatePrimeTable<T>()) {}
+
+  virtual ~PrimeTableTest() { delete table_; }
+
+  // Note that we test an implementation via the base interface
+  // instead of the actual implementation class.  This is important
+  // for keeping the tests close to the real world scenario, where the
+  // implementation is invoked via the base interface.  It avoids
+  // got-yas where the implementation class has a method that shadows
+  // a method with the same name (but slightly different argument
+  // types) in the base interface, for example.
+  PrimeTable* const table_;
+};
+
+#if GTEST_HAS_TYPED_TEST
+
+using testing::Types;
+
+// Google Test offers two ways for reusing tests for different types.
+// The first is called "typed tests".  You should use it if you
+// already know *all* the types you are gonna exercise when you write
+// the tests.
+
+// To write a typed test case, first use
+//
+//   TYPED_TEST_CASE(TestCaseName, TypeList);
+//
+// to declare it and specify the type parameters.  As with TEST_F,
+// TestCaseName must match the test fixture name.
+
+// The list of types we want to test.
+typedef Types<OnTheFlyPrimeTable, PreCalculatedPrimeTable> Implementations;
+
+TYPED_TEST_CASE(PrimeTableTest, Implementations);
+
+// Then use TYPED_TEST(TestCaseName, TestName) to define a typed test,
+// similar to TEST_F.
+TYPED_TEST(PrimeTableTest, ReturnsFalseForNonPrimes) {
+  // Inside the test body, you can refer to the type parameter by
+  // TypeParam, and refer to the fixture class by TestFixture.  We
+  // don't need them in this example.
+
+  // Since we are in the template world, C++ requires explicitly
+  // writing 'this->' when referring to members of the fixture class.
+  // This is something you have to learn to live with.
+  EXPECT_FALSE(this->table_->IsPrime(-5));
+  EXPECT_FALSE(this->table_->IsPrime(0));
+  EXPECT_FALSE(this->table_->IsPrime(1));
+  EXPECT_FALSE(this->table_->IsPrime(4));
+  EXPECT_FALSE(this->table_->IsPrime(6));
+  EXPECT_FALSE(this->table_->IsPrime(100));
+}
+
+TYPED_TEST(PrimeTableTest, ReturnsTrueForPrimes) {
+  EXPECT_TRUE(this->table_->IsPrime(2));
+  EXPECT_TRUE(this->table_->IsPrime(3));
+  EXPECT_TRUE(this->table_->IsPrime(5));
+  EXPECT_TRUE(this->table_->IsPrime(7));
+  EXPECT_TRUE(this->table_->IsPrime(11));
+  EXPECT_TRUE(this->table_->IsPrime(131));
+}
+
+TYPED_TEST(PrimeTableTest, CanGetNextPrime) {
+  EXPECT_EQ(2, this->table_->GetNextPrime(0));
+  EXPECT_EQ(3, this->table_->GetNextPrime(2));
+  EXPECT_EQ(5, this->table_->GetNextPrime(3));
+  EXPECT_EQ(7, this->table_->GetNextPrime(5));
+  EXPECT_EQ(11, this->table_->GetNextPrime(7));
+  EXPECT_EQ(131, this->table_->GetNextPrime(128));
+}
+
+// That's it!  Google Test will repeat each TYPED_TEST for each type
+// in the type list specified in TYPED_TEST_CASE.  Sit back and be
+// happy that you don't have to define them multiple times.
+
+#endif  // GTEST_HAS_TYPED_TEST
+
+#if GTEST_HAS_TYPED_TEST_P
+
+using testing::Types;
+
+// Sometimes, however, you don't yet know all the types that you want
+// to test when you write the tests.  For example, if you are the
+// author of an interface and expect other people to implement it, you
+// might want to write a set of tests to make sure each implementation
+// conforms to some basic requirements, but you don't know what
+// implementations will be written in the future.
+//
+// How can you write the tests without committing to the type
+// parameters?  That's what "type-parameterized tests" can do for you.
+// It is a bit more involved than typed tests, but in return you get a
+// test pattern that can be reused in many contexts, which is a big
+// win.  Here's how you do it:
+
+// First, define a test fixture class template.  Here we just reuse
+// the PrimeTableTest fixture defined earlier:
+
+template <class T>
+class PrimeTableTest2 : public PrimeTableTest<T> {
+};
+
+// Then, declare the test case.  The argument is the name of the test
+// fixture, and also the name of the test case (as usual).  The _P
+// suffix is for "parameterized" or "pattern".
+TYPED_TEST_CASE_P(PrimeTableTest2);
+
+// Next, use TYPED_TEST_P(TestCaseName, TestName) to define a test,
+// similar to what you do with TEST_F.
+TYPED_TEST_P(PrimeTableTest2, ReturnsFalseForNonPrimes) {
+  EXPECT_FALSE(this->table_->IsPrime(-5));
+  EXPECT_FALSE(this->table_->IsPrime(0));
+  EXPECT_FALSE(this->table_->IsPrime(1));
+  EXPECT_FALSE(this->table_->IsPrime(4));
+  EXPECT_FALSE(this->table_->IsPrime(6));
+  EXPECT_FALSE(this->table_->IsPrime(100));
+}
+
+TYPED_TEST_P(PrimeTableTest2, ReturnsTrueForPrimes) {
+  EXPECT_TRUE(this->table_->IsPrime(2));
+  EXPECT_TRUE(this->table_->IsPrime(3));
+  EXPECT_TRUE(this->table_->IsPrime(5));
+  EXPECT_TRUE(this->table_->IsPrime(7));
+  EXPECT_TRUE(this->table_->IsPrime(11));
+  EXPECT_TRUE(this->table_->IsPrime(131));
+}
+
+TYPED_TEST_P(PrimeTableTest2, CanGetNextPrime) {
+  EXPECT_EQ(2, this->table_->GetNextPrime(0));
+  EXPECT_EQ(3, this->table_->GetNextPrime(2));
+  EXPECT_EQ(5, this->table_->GetNextPrime(3));
+  EXPECT_EQ(7, this->table_->GetNextPrime(5));
+  EXPECT_EQ(11, this->table_->GetNextPrime(7));
+  EXPECT_EQ(131, this->table_->GetNextPrime(128));
+}
+
+// Type-parameterized tests involve one extra step: you have to
+// enumerate the tests you defined:
+REGISTER_TYPED_TEST_CASE_P(
+    PrimeTableTest2,  // The first argument is the test case name.
+    // The rest of the arguments are the test names.
+    ReturnsFalseForNonPrimes, ReturnsTrueForPrimes, CanGetNextPrime);
+
+// At this point the test pattern is done.  However, you don't have
+// any real test yet as you haven't said which types you want to run
+// the tests with.
+
+// To turn the abstract test pattern into real tests, you instantiate
+// it with a list of types.  Usually the test pattern will be defined
+// in a .h file, and anyone can #include and instantiate it.  You can
+// even instantiate it more than once in the same program.  To tell
+// different instances apart, you give each of them a name, which will
+// become part of the test case name and can be used in test filters.
+
+// The list of types we want to test.  Note that it doesn't have to be
+// defined at the time we write the TYPED_TEST_P()s.
+typedef Types<OnTheFlyPrimeTable, PreCalculatedPrimeTable>
+    PrimeTableImplementations;
+INSTANTIATE_TYPED_TEST_CASE_P(OnTheFlyAndPreCalculated,    // Instance name
+                              PrimeTableTest2,             // Test case name
+                              PrimeTableImplementations);  // Type list
+
+#endif  // GTEST_HAS_TYPED_TEST_P
diff --git a/contrib/gtest-1.7.0/samples/sample7_unittest.cc b/contrib/gtest-1.7.0/samples/sample7_unittest.cc
new file mode 100644
index 0000000..1b651a2
--- /dev/null
+++ b/contrib/gtest-1.7.0/samples/sample7_unittest.cc
@@ -0,0 +1,130 @@
+// Copyright 2008 Google Inc.
+// All Rights Reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: vladl at google.com (Vlad Losev)
+
+// This sample shows how to test common properties of multiple
+// implementations of an interface (aka interface tests) using
+// value-parameterized tests. Each test in the test case has
+// a parameter that is an interface pointer to an implementation
+// tested.
+
+// The interface and its implementations are in this header.
+#include "prime_tables.h"
+
+#include "gtest/gtest.h"
+
+#if GTEST_HAS_PARAM_TEST
+
+using ::testing::TestWithParam;
+using ::testing::Values;
+
+// As a general rule, to prevent a test from affecting the tests that come
+// after it, you should create and destroy the tested objects for each test
+// instead of reusing them.  In this sample we will define a simple factory
+// function for PrimeTable objects.  We will instantiate objects in test's
+// SetUp() method and delete them in TearDown() method.
+typedef PrimeTable* CreatePrimeTableFunc();
+
+PrimeTable* CreateOnTheFlyPrimeTable() {
+  return new OnTheFlyPrimeTable();
+}
+
+template <size_t max_precalculated>
+PrimeTable* CreatePreCalculatedPrimeTable() {
+  return new PreCalculatedPrimeTable(max_precalculated);
+}
+
+// Inside the test body, fixture constructor, SetUp(), and TearDown() you
+// can refer to the test parameter by GetParam().  In this case, the test
+// parameter is a factory function which we call in fixture's SetUp() to
+// create and store an instance of PrimeTable.
+class PrimeTableTest : public TestWithParam<CreatePrimeTableFunc*> {
+ public:
+  virtual ~PrimeTableTest() { delete table_; }
+  virtual void SetUp() { table_ = (*GetParam())(); }
+  virtual void TearDown() {
+    delete table_;
+    table_ = NULL;
+  }
+
+ protected:
+  PrimeTable* table_;
+};
+
+TEST_P(PrimeTableTest, ReturnsFalseForNonPrimes) {
+  EXPECT_FALSE(table_->IsPrime(-5));
+  EXPECT_FALSE(table_->IsPrime(0));
+  EXPECT_FALSE(table_->IsPrime(1));
+  EXPECT_FALSE(table_->IsPrime(4));
+  EXPECT_FALSE(table_->IsPrime(6));
+  EXPECT_FALSE(table_->IsPrime(100));
+}
+
+TEST_P(PrimeTableTest, ReturnsTrueForPrimes) {
+  EXPECT_TRUE(table_->IsPrime(2));
+  EXPECT_TRUE(table_->IsPrime(3));
+  EXPECT_TRUE(table_->IsPrime(5));
+  EXPECT_TRUE(table_->IsPrime(7));
+  EXPECT_TRUE(table_->IsPrime(11));
+  EXPECT_TRUE(table_->IsPrime(131));
+}
+
+TEST_P(PrimeTableTest, CanGetNextPrime) {
+  EXPECT_EQ(2, table_->GetNextPrime(0));
+  EXPECT_EQ(3, table_->GetNextPrime(2));
+  EXPECT_EQ(5, table_->GetNextPrime(3));
+  EXPECT_EQ(7, table_->GetNextPrime(5));
+  EXPECT_EQ(11, table_->GetNextPrime(7));
+  EXPECT_EQ(131, table_->GetNextPrime(128));
+}
+
+// In order to run value-parameterized tests, you need to instantiate them,
+// or bind them to a list of values which will be used as test parameters.
+// You can instantiate them in a different translation module, or even
+// instantiate them several times.
+//
+// Here, we instantiate our tests with a list of two PrimeTable object
+// factory functions:
+INSTANTIATE_TEST_CASE_P(
+    OnTheFlyAndPreCalculated,
+    PrimeTableTest,
+    Values(&CreateOnTheFlyPrimeTable, &CreatePreCalculatedPrimeTable<1000>));
+
+#else
+
+// Google Test may not support value-parameterized tests with some
+// compilers. If we use conditional compilation to compile out all
+// code referring to the gtest_main library, MSVC linker will not link
+// that library at all and consequently complain about missing entry
+// point defined in that library (fatal error LNK1561: entry point
+// must be defined). This dummy test keeps gtest_main linked in.
+TEST(DummyTest, ValueParameterizedTestsAreNotSupportedOnThisPlatform) {}
+
+#endif  // GTEST_HAS_PARAM_TEST
diff --git a/contrib/gtest-1.7.0/samples/sample8_unittest.cc b/contrib/gtest-1.7.0/samples/sample8_unittest.cc
new file mode 100644
index 0000000..5ad2e2c
--- /dev/null
+++ b/contrib/gtest-1.7.0/samples/sample8_unittest.cc
@@ -0,0 +1,173 @@
+// Copyright 2008 Google Inc.
+// All Rights Reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: vladl at google.com (Vlad Losev)
+
+// This sample shows how to test code relying on some global flag variables.
+// Combine() helps with generating all possible combinations of such flags,
+// and each test is given one combination as a parameter.
+
+// Use class definitions to test from this header.
+#include "prime_tables.h"
+
+#include "gtest/gtest.h"
+
+#if GTEST_HAS_COMBINE
+
+// Suppose we want to introduce a new, improved implementation of PrimeTable
+// which combines speed of PrecalcPrimeTable and versatility of
+// OnTheFlyPrimeTable (see prime_tables.h). Inside it instantiates both
+// PrecalcPrimeTable and OnTheFlyPrimeTable and uses the one that is more
+// appropriate under the circumstances. But in low memory conditions, it can be
+// told to instantiate without PrecalcPrimeTable instance at all and use only
+// OnTheFlyPrimeTable.
+class HybridPrimeTable : public PrimeTable {
+ public:
+  HybridPrimeTable(bool force_on_the_fly, int max_precalculated)
+      : on_the_fly_impl_(new OnTheFlyPrimeTable),
+        precalc_impl_(force_on_the_fly ? NULL :
+                          new PreCalculatedPrimeTable(max_precalculated)),
+        max_precalculated_(max_precalculated) {}
+  virtual ~HybridPrimeTable() {
+    delete on_the_fly_impl_;
+    delete precalc_impl_;
+  }
+
+  virtual bool IsPrime(int n) const {
+    if (precalc_impl_ != NULL && n < max_precalculated_)
+      return precalc_impl_->IsPrime(n);
+    else
+      return on_the_fly_impl_->IsPrime(n);
+  }
+
+  virtual int GetNextPrime(int p) const {
+    int next_prime = -1;
+    if (precalc_impl_ != NULL && p < max_precalculated_)
+      next_prime = precalc_impl_->GetNextPrime(p);
+
+    return next_prime != -1 ? next_prime : on_the_fly_impl_->GetNextPrime(p);
+  }
+
+ private:
+  OnTheFlyPrimeTable* on_the_fly_impl_;
+  PreCalculatedPrimeTable* precalc_impl_;
+  int max_precalculated_;
+};
+
+using ::testing::TestWithParam;
+using ::testing::Bool;
+using ::testing::Values;
+using ::testing::Combine;
+
+// To test all code paths for HybridPrimeTable we must test it with numbers
+// both within and outside PreCalculatedPrimeTable's capacity and also with
+// PreCalculatedPrimeTable disabled. We do this by defining fixture which will
+// accept different combinations of parameters for instantiating a
+// HybridPrimeTable instance.
+class PrimeTableTest : public TestWithParam< ::std::tr1::tuple<bool, int> > {
+ protected:
+  virtual void SetUp() {
+    // This can be written as
+    //
+    // bool force_on_the_fly;
+    // int max_precalculated;
+    // tie(force_on_the_fly, max_precalculated) = GetParam();
+    //
+    // once the Google C++ Style Guide allows use of ::std::tr1::tie.
+    //
+    bool force_on_the_fly = ::std::tr1::get<0>(GetParam());
+    int max_precalculated = ::std::tr1::get<1>(GetParam());
+    table_ = new HybridPrimeTable(force_on_the_fly, max_precalculated);
+  }
+  virtual void TearDown() {
+    delete table_;
+    table_ = NULL;
+  }
+  HybridPrimeTable* table_;
+};
+
+TEST_P(PrimeTableTest, ReturnsFalseForNonPrimes) {
+  // Inside the test body, you can refer to the test parameter by GetParam().
+  // In this case, the test parameter is a PrimeTable interface pointer which
+  // we can use directly.
+  // Please note that you can also save it in the fixture's SetUp() method
+  // or constructor and use saved copy in the tests.
+
+  EXPECT_FALSE(table_->IsPrime(-5));
+  EXPECT_FALSE(table_->IsPrime(0));
+  EXPECT_FALSE(table_->IsPrime(1));
+  EXPECT_FALSE(table_->IsPrime(4));
+  EXPECT_FALSE(table_->IsPrime(6));
+  EXPECT_FALSE(table_->IsPrime(100));
+}
+
+TEST_P(PrimeTableTest, ReturnsTrueForPrimes) {
+  EXPECT_TRUE(table_->IsPrime(2));
+  EXPECT_TRUE(table_->IsPrime(3));
+  EXPECT_TRUE(table_->IsPrime(5));
+  EXPECT_TRUE(table_->IsPrime(7));
+  EXPECT_TRUE(table_->IsPrime(11));
+  EXPECT_TRUE(table_->IsPrime(131));
+}
+
+TEST_P(PrimeTableTest, CanGetNextPrime) {
+  EXPECT_EQ(2, table_->GetNextPrime(0));
+  EXPECT_EQ(3, table_->GetNextPrime(2));
+  EXPECT_EQ(5, table_->GetNextPrime(3));
+  EXPECT_EQ(7, table_->GetNextPrime(5));
+  EXPECT_EQ(11, table_->GetNextPrime(7));
+  EXPECT_EQ(131, table_->GetNextPrime(128));
+}
+
+// In order to run value-parameterized tests, you need to instantiate them,
+// or bind them to a list of values which will be used as test parameters.
+// You can instantiate them in a different translation module, or even
+// instantiate them several times.
+//
+// Here, we instantiate our tests with a list of parameters. We must combine
+// all variations of the boolean flag suppressing PrecalcPrimeTable and some
+// meaningful values for tests. We choose a small value (1), and a value that
+// will put some of the tested numbers beyond the capability of the
+// PrecalcPrimeTable instance and some inside it (10). Combine will produce all
+// possible combinations.
+INSTANTIATE_TEST_CASE_P(MeaningfulTestParameters,
+                        PrimeTableTest,
+                        Combine(Bool(), Values(1, 10)));
+
+#else
+
+// Google Test may not support Combine() with some compilers. If we
+// use conditional compilation to compile out all code referring to
+// the gtest_main library, MSVC linker will not link that library at
+// all and consequently complain about missing entry point defined in
+// that library (fatal error LNK1561: entry point must be
+// defined). This dummy test keeps gtest_main linked in.
+TEST(DummyTest, CombineIsNotSupportedOnThisPlatform) {}
+
+#endif  // GTEST_HAS_COMBINE
diff --git a/contrib/gtest-1.7.0/samples/sample9_unittest.cc b/contrib/gtest-1.7.0/samples/sample9_unittest.cc
new file mode 100644
index 0000000..b2e2079
--- /dev/null
+++ b/contrib/gtest-1.7.0/samples/sample9_unittest.cc
@@ -0,0 +1,160 @@
+// Copyright 2009 Google Inc. All Rights Reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: vladl at google.com (Vlad Losev)
+
+// This sample shows how to use Google Test listener API to implement
+// an alternative console output and how to use the UnitTest reflection API
+// to enumerate test cases and tests and to inspect their results.
+
+#include <stdio.h>
+
+#include "gtest/gtest.h"
+
+using ::testing::EmptyTestEventListener;
+using ::testing::InitGoogleTest;
+using ::testing::Test;
+using ::testing::TestCase;
+using ::testing::TestEventListeners;
+using ::testing::TestInfo;
+using ::testing::TestPartResult;
+using ::testing::UnitTest;
+
+namespace {
+
+// Provides alternative output mode which produces minimal amount of
+// information about tests.
+class TersePrinter : public EmptyTestEventListener {
+ private:
+  // Called before any test activity starts.
+  virtual void OnTestProgramStart(const UnitTest& /* unit_test */) {}
+
+  // Called after all test activities have ended.
+  virtual void OnTestProgramEnd(const UnitTest& unit_test) {
+    fprintf(stdout, "TEST %s\n", unit_test.Passed() ? "PASSED" : "FAILED");
+    fflush(stdout);
+  }
+
+  // Called before a test starts.
+  virtual void OnTestStart(const TestInfo& test_info) {
+    fprintf(stdout,
+            "*** Test %s.%s starting.\n",
+            test_info.test_case_name(),
+            test_info.name());
+    fflush(stdout);
+  }
+
+  // Called after a failed assertion or a SUCCEED() invocation.
+  virtual void OnTestPartResult(const TestPartResult& test_part_result) {
+    fprintf(stdout,
+            "%s in %s:%d\n%s\n",
+            test_part_result.failed() ? "*** Failure" : "Success",
+            test_part_result.file_name(),
+            test_part_result.line_number(),
+            test_part_result.summary());
+    fflush(stdout);
+  }
+
+  // Called after a test ends.
+  virtual void OnTestEnd(const TestInfo& test_info) {
+    fprintf(stdout,
+            "*** Test %s.%s ending.\n",
+            test_info.test_case_name(),
+            test_info.name());
+    fflush(stdout);
+  }
+};  // class TersePrinter
+
+TEST(CustomOutputTest, PrintsMessage) {
+  printf("Printing something from the test body...\n");
+}
+
+TEST(CustomOutputTest, Succeeds) {
+  SUCCEED() << "SUCCEED() has been invoked from here";
+}
+
+TEST(CustomOutputTest, Fails) {
+  EXPECT_EQ(1, 2)
+      << "This test fails in order to demonstrate alternative failure messages";
+}
+
+}  // namespace
+
+int main(int argc, char **argv) {
+  InitGoogleTest(&argc, argv);
+
+  bool terse_output = false;
+  if (argc > 1 && strcmp(argv[1], "--terse_output") == 0 )
+    terse_output = true;
+  else
+    printf("%s\n", "Run this program with --terse_output to change the way "
+           "it prints its output.");
+
+  UnitTest& unit_test = *UnitTest::GetInstance();
+
+  // If we are given the --terse_output command line flag, suppresses the
+  // standard output and attaches own result printer.
+  if (terse_output) {
+    TestEventListeners& listeners = unit_test.listeners();
+
+    // Removes the default console output listener from the list so it will
+    // not receive events from Google Test and won't print any output. Since
+    // this operation transfers ownership of the listener to the caller we
+    // have to delete it as well.
+    delete listeners.Release(listeners.default_result_printer());
+
+    // Adds the custom output listener to the list. It will now receive
+    // events from Google Test and print the alternative output. We don't
+    // have to worry about deleting it since Google Test assumes ownership
+    // over it after adding it to the list.
+    listeners.Append(new TersePrinter);
+  }
+  int ret_val = RUN_ALL_TESTS();
+
+  // This is an example of using the UnitTest reflection API to inspect test
+  // results. Here we discount failures from the tests we expected to fail.
+  int unexpectedly_failed_tests = 0;
+  for (int i = 0; i < unit_test.total_test_case_count(); ++i) {
+    const TestCase& test_case = *unit_test.GetTestCase(i);
+    for (int j = 0; j < test_case.total_test_count(); ++j) {
+      const TestInfo& test_info = *test_case.GetTestInfo(j);
+      // Counts failed tests that were not meant to fail (those without
+      // 'Fails' in the name).
+      if (test_info.result()->Failed() &&
+          strcmp(test_info.name(), "Fails") != 0) {
+        unexpectedly_failed_tests++;
+      }
+    }
+  }
+
+  // Test that were meant to fail should not affect the test program outcome.
+  if (unexpectedly_failed_tests == 0)
+    ret_val = 0;
+
+  return ret_val;
+}
diff --git a/contrib/gtest-1.7.0/scripts/fuse_gtest_files.py b/contrib/gtest-1.7.0/scripts/fuse_gtest_files.py
new file mode 100755
index 0000000..57ef72f
--- /dev/null
+++ b/contrib/gtest-1.7.0/scripts/fuse_gtest_files.py
@@ -0,0 +1,250 @@
+#!/usr/bin/env python
+#
+# Copyright 2009, Google Inc.
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+#
+#     * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#     * Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following disclaimer
+# in the documentation and/or other materials provided with the
+# distribution.
+#     * Neither the name of Google Inc. nor the names of its
+# contributors may be used to endorse or promote products derived from
+# this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+"""fuse_gtest_files.py v0.2.0
+Fuses Google Test source code into a .h file and a .cc file.
+
+SYNOPSIS
+       fuse_gtest_files.py [GTEST_ROOT_DIR] OUTPUT_DIR
+
+       Scans GTEST_ROOT_DIR for Google Test source code, and generates
+       two files: OUTPUT_DIR/gtest/gtest.h and OUTPUT_DIR/gtest/gtest-all.cc.
+       Then you can build your tests by adding OUTPUT_DIR to the include
+       search path and linking with OUTPUT_DIR/gtest/gtest-all.cc.  These
+       two files contain everything you need to use Google Test.  Hence
+       you can "install" Google Test by copying them to wherever you want.
+
+       GTEST_ROOT_DIR can be omitted and defaults to the parent
+       directory of the directory holding this script.
+
+EXAMPLES
+       ./fuse_gtest_files.py fused_gtest
+       ./fuse_gtest_files.py path/to/unpacked/gtest fused_gtest
+
+This tool is experimental.  In particular, it assumes that there is no
+conditional inclusion of Google Test headers.  Please report any
+problems to googletestframework at googlegroups.com.  You can read
+http://code.google.com/p/googletest/wiki/GoogleTestAdvancedGuide for
+more information.
+"""
+
+__author__ = 'wan at google.com (Zhanyong Wan)'
+
+import os
+import re
+import sets
+import sys
+
+# We assume that this file is in the scripts/ directory in the Google
+# Test root directory.
+DEFAULT_GTEST_ROOT_DIR = os.path.join(os.path.dirname(__file__), '..')
+
+# Regex for matching '#include "gtest/..."'.
+INCLUDE_GTEST_FILE_REGEX = re.compile(r'^\s*#\s*include\s*"(gtest/.+)"')
+
+# Regex for matching '#include "src/..."'.
+INCLUDE_SRC_FILE_REGEX = re.compile(r'^\s*#\s*include\s*"(src/.+)"')
+
+# Where to find the source seed files.
+GTEST_H_SEED = 'include/gtest/gtest.h'
+GTEST_SPI_H_SEED = 'include/gtest/gtest-spi.h'
+GTEST_ALL_CC_SEED = 'src/gtest-all.cc'
+
+# Where to put the generated files.
+GTEST_H_OUTPUT = 'gtest/gtest.h'
+GTEST_ALL_CC_OUTPUT = 'gtest/gtest-all.cc'
+
+
+def VerifyFileExists(directory, relative_path):
+  """Verifies that the given file exists; aborts on failure.
+
+  relative_path is the file path relative to the given directory.
+  """
+
+  if not os.path.isfile(os.path.join(directory, relative_path)):
+    print 'ERROR: Cannot find %s in directory %s.' % (relative_path,
+                                                      directory)
+    print ('Please either specify a valid project root directory '
+           'or omit it on the command line.')
+    sys.exit(1)
+
+
+def ValidateGTestRootDir(gtest_root):
+  """Makes sure gtest_root points to a valid gtest root directory.
+
+  The function aborts the program on failure.
+  """
+
+  VerifyFileExists(gtest_root, GTEST_H_SEED)
+  VerifyFileExists(gtest_root, GTEST_ALL_CC_SEED)
+
+
+def VerifyOutputFile(output_dir, relative_path):
+  """Verifies that the given output file path is valid.
+
+  relative_path is relative to the output_dir directory.
+  """
+
+  # Makes sure the output file either doesn't exist or can be overwritten.
+  output_file = os.path.join(output_dir, relative_path)
+  if os.path.exists(output_file):
+    # TODO(wan at google.com): The following user-interaction doesn't
+    # work with automated processes.  We should provide a way for the
+    # Makefile to force overwriting the files.
+    print ('%s already exists in directory %s - overwrite it? (y/N) ' %
+           (relative_path, output_dir))
+    answer = sys.stdin.readline().strip()
+    if answer not in ['y', 'Y']:
+      print 'ABORTED.'
+      sys.exit(1)
+
+  # Makes sure the directory holding the output file exists; creates
+  # it and all its ancestors if necessary.
+  parent_directory = os.path.dirname(output_file)
+  if not os.path.isdir(parent_directory):
+    os.makedirs(parent_directory)
+
+
+def ValidateOutputDir(output_dir):
+  """Makes sure output_dir points to a valid output directory.
+
+  The function aborts the program on failure.
+  """
+
+  VerifyOutputFile(output_dir, GTEST_H_OUTPUT)
+  VerifyOutputFile(output_dir, GTEST_ALL_CC_OUTPUT)
+
+
+def FuseGTestH(gtest_root, output_dir):
+  """Scans folder gtest_root to generate gtest/gtest.h in output_dir."""
+
+  output_file = file(os.path.join(output_dir, GTEST_H_OUTPUT), 'w')
+  processed_files = sets.Set()  # Holds all gtest headers we've processed.
+
+  def ProcessFile(gtest_header_path):
+    """Processes the given gtest header file."""
+
+    # We don't process the same header twice.
+    if gtest_header_path in processed_files:
+      return
+
+    processed_files.add(gtest_header_path)
+
+    # Reads each line in the given gtest header.
+    for line in file(os.path.join(gtest_root, gtest_header_path), 'r'):
+      m = INCLUDE_GTEST_FILE_REGEX.match(line)
+      if m:
+        # It's '#include "gtest/..."' - let's process it recursively.
+        ProcessFile('include/' + m.group(1))
+      else:
+        # Otherwise we copy the line unchanged to the output file.
+        output_file.write(line)
+
+  ProcessFile(GTEST_H_SEED)
+  output_file.close()
+
+
+def FuseGTestAllCcToFile(gtest_root, output_file):
+  """Scans folder gtest_root to generate gtest/gtest-all.cc in output_file."""
+
+  processed_files = sets.Set()
+
+  def ProcessFile(gtest_source_file):
+    """Processes the given gtest source file."""
+
+    # We don't process the same #included file twice.
+    if gtest_source_file in processed_files:
+      return
+
+    processed_files.add(gtest_source_file)
+
+    # Reads each line in the given gtest source file.
+    for line in file(os.path.join(gtest_root, gtest_source_file), 'r'):
+      m = INCLUDE_GTEST_FILE_REGEX.match(line)
+      if m:
+        if 'include/' + m.group(1) == GTEST_SPI_H_SEED:
+          # It's '#include "gtest/gtest-spi.h"'.  This file is not
+          # #included by "gtest/gtest.h", so we need to process it.
+          ProcessFile(GTEST_SPI_H_SEED)
+        else:
+          # It's '#include "gtest/foo.h"' where foo is not gtest-spi.
+          # We treat it as '#include "gtest/gtest.h"', as all other
+          # gtest headers are being fused into gtest.h and cannot be
+          # #included directly.
+
+          # There is no need to #include "gtest/gtest.h" more than once.
+          if not GTEST_H_SEED in processed_files:
+            processed_files.add(GTEST_H_SEED)
+            output_file.write('#include "%s"\n' % (GTEST_H_OUTPUT,))
+      else:
+        m = INCLUDE_SRC_FILE_REGEX.match(line)
+        if m:
+          # It's '#include "src/foo"' - let's process it recursively.
+          ProcessFile(m.group(1))
+        else:
+          output_file.write(line)
+
+  ProcessFile(GTEST_ALL_CC_SEED)
+
+
+def FuseGTestAllCc(gtest_root, output_dir):
+  """Scans folder gtest_root to generate gtest/gtest-all.cc in output_dir."""
+
+  output_file = file(os.path.join(output_dir, GTEST_ALL_CC_OUTPUT), 'w')
+  FuseGTestAllCcToFile(gtest_root, output_file)
+  output_file.close()
+
+
+def FuseGTest(gtest_root, output_dir):
+  """Fuses gtest.h and gtest-all.cc."""
+
+  ValidateGTestRootDir(gtest_root)
+  ValidateOutputDir(output_dir)
+
+  FuseGTestH(gtest_root, output_dir)
+  FuseGTestAllCc(gtest_root, output_dir)
+
+
+def main():
+  argc = len(sys.argv)
+  if argc == 2:
+    # fuse_gtest_files.py OUTPUT_DIR
+    FuseGTest(DEFAULT_GTEST_ROOT_DIR, sys.argv[1])
+  elif argc == 3:
+    # fuse_gtest_files.py GTEST_ROOT_DIR OUTPUT_DIR
+    FuseGTest(sys.argv[1], sys.argv[2])
+  else:
+    print __doc__
+    sys.exit(1)
+
+
+if __name__ == '__main__':
+  main()
diff --git a/contrib/gtest-1.7.0/scripts/gen_gtest_pred_impl.py b/contrib/gtest-1.7.0/scripts/gen_gtest_pred_impl.py
new file mode 100755
index 0000000..3e7ab04
--- /dev/null
+++ b/contrib/gtest-1.7.0/scripts/gen_gtest_pred_impl.py
@@ -0,0 +1,730 @@
+#!/usr/bin/env python
+#
+# Copyright 2006, Google Inc.
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+#
+#     * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#     * Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following disclaimer
+# in the documentation and/or other materials provided with the
+# distribution.
+#     * Neither the name of Google Inc. nor the names of its
+# contributors may be used to endorse or promote products derived from
+# this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+"""gen_gtest_pred_impl.py v0.1
+
+Generates the implementation of Google Test predicate assertions and
+accompanying tests.
+
+Usage:
+
+  gen_gtest_pred_impl.py MAX_ARITY
+
+where MAX_ARITY is a positive integer.
+
+The command generates the implementation of up-to MAX_ARITY-ary
+predicate assertions, and writes it to file gtest_pred_impl.h in the
+directory where the script is.  It also generates the accompanying
+unit test in file gtest_pred_impl_unittest.cc.
+"""
+
+__author__ = 'wan at google.com (Zhanyong Wan)'
+
+import os
+import sys
+import time
+
+# Where this script is.
+SCRIPT_DIR = os.path.dirname(sys.argv[0])
+
+# Where to store the generated header.
+HEADER = os.path.join(SCRIPT_DIR, '../include/gtest/gtest_pred_impl.h')
+
+# Where to store the generated unit test.
+UNIT_TEST = os.path.join(SCRIPT_DIR, '../test/gtest_pred_impl_unittest.cc')
+
+
+def HeaderPreamble(n):
+  """Returns the preamble for the header file.
+
+  Args:
+    n:  the maximum arity of the predicate macros to be generated.
+  """
+
+  # A map that defines the values used in the preamble template.
+  DEFS = {
+    'today' : time.strftime('%m/%d/%Y'),
+    'year' : time.strftime('%Y'),
+    'command' : '%s %s' % (os.path.basename(sys.argv[0]), n),
+    'n' : n
+    }
+
+  return (
+"""// Copyright 2006, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+// This file is AUTOMATICALLY GENERATED on %(today)s by command
+// '%(command)s'.  DO NOT EDIT BY HAND!
+//
+// Implements a family of generic predicate assertion macros.
+
+#ifndef GTEST_INCLUDE_GTEST_GTEST_PRED_IMPL_H_
+#define GTEST_INCLUDE_GTEST_GTEST_PRED_IMPL_H_
+
+// Makes sure this header is not included before gtest.h.
+#ifndef GTEST_INCLUDE_GTEST_GTEST_H_
+# error Do not include gtest_pred_impl.h directly.  Include gtest.h instead.
+#endif  // GTEST_INCLUDE_GTEST_GTEST_H_
+
+// This header implements a family of generic predicate assertion
+// macros:
+//
+//   ASSERT_PRED_FORMAT1(pred_format, v1)
+//   ASSERT_PRED_FORMAT2(pred_format, v1, v2)
+//   ...
+//
+// where pred_format is a function or functor that takes n (in the
+// case of ASSERT_PRED_FORMATn) values and their source expression
+// text, and returns a testing::AssertionResult.  See the definition
+// of ASSERT_EQ in gtest.h for an example.
+//
+// If you don't care about formatting, you can use the more
+// restrictive version:
+//
+//   ASSERT_PRED1(pred, v1)
+//   ASSERT_PRED2(pred, v1, v2)
+//   ...
+//
+// where pred is an n-ary function or functor that returns bool,
+// and the values v1, v2, ..., must support the << operator for
+// streaming to std::ostream.
+//
+// We also define the EXPECT_* variations.
+//
+// For now we only support predicates whose arity is at most %(n)s.
+// Please email googletestframework at googlegroups.com if you need
+// support for higher arities.
+
+// GTEST_ASSERT_ is the basic statement to which all of the assertions
+// in this file reduce.  Don't use this in your code.
+
+#define GTEST_ASSERT_(expression, on_failure) \\
+  GTEST_AMBIGUOUS_ELSE_BLOCKER_ \\
+  if (const ::testing::AssertionResult gtest_ar = (expression)) \\
+    ; \\
+  else \\
+    on_failure(gtest_ar.failure_message())
+""" % DEFS)
+
+
+def Arity(n):
+  """Returns the English name of the given arity."""
+
+  if n < 0:
+    return None
+  elif n <= 3:
+    return ['nullary', 'unary', 'binary', 'ternary'][n]
+  else:
+    return '%s-ary' % n
+
+
+def Title(word):
+  """Returns the given word in title case.  The difference between
+  this and string's title() method is that Title('4-ary') is '4-ary'
+  while '4-ary'.title() is '4-Ary'."""
+
+  return word[0].upper() + word[1:]
+
+
+def OneTo(n):
+  """Returns the list [1, 2, 3, ..., n]."""
+
+  return range(1, n + 1)
+
+
+def Iter(n, format, sep=''):
+  """Given a positive integer n, a format string that contains 0 or
+  more '%s' format specs, and optionally a separator string, returns
+  the join of n strings, each formatted with the format string on an
+  iterator ranged from 1 to n.
+
+  Example:
+
+  Iter(3, 'v%s', sep=', ') returns 'v1, v2, v3'.
+  """
+
+  # How many '%s' specs are in format?
+  spec_count = len(format.split('%s')) - 1
+  return sep.join([format % (spec_count * (i,)) for i in OneTo(n)])
+
+
+def ImplementationForArity(n):
+  """Returns the implementation of n-ary predicate assertions."""
+
+  # A map the defines the values used in the implementation template.
+  DEFS = {
+    'n' : str(n),
+    'vs' : Iter(n, 'v%s', sep=', '),
+    'vts' : Iter(n, '#v%s', sep=', '),
+    'arity' : Arity(n),
+    'Arity' : Title(Arity(n))
+    }
+
+  impl = """
+
+// Helper function for implementing {EXPECT|ASSERT}_PRED%(n)s.  Don't use
+// this in your code.
+template <typename Pred""" % DEFS
+
+  impl += Iter(n, """,
+          typename T%s""")
+
+  impl += """>
+AssertionResult AssertPred%(n)sHelper(const char* pred_text""" % DEFS
+
+  impl += Iter(n, """,
+                                  const char* e%s""")
+
+  impl += """,
+                                  Pred pred"""
+
+  impl += Iter(n, """,
+                                  const T%s& v%s""")
+
+  impl += """) {
+  if (pred(%(vs)s)) return AssertionSuccess();
+
+""" % DEFS
+
+  impl += '  return AssertionFailure() << pred_text << "("'
+
+  impl += Iter(n, """
+                            << e%s""", sep=' << ", "')
+
+  impl += ' << ") evaluates to false, where"'
+
+  impl += Iter(n, """
+                            << "\\n" << e%s << " evaluates to " << v%s""")
+
+  impl += """;
+}
+
+// Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT%(n)s.
+// Don't use this in your code.
+#define GTEST_PRED_FORMAT%(n)s_(pred_format, %(vs)s, on_failure)\\
+  GTEST_ASSERT_(pred_format(%(vts)s, %(vs)s), \\
+                on_failure)
+
+// Internal macro for implementing {EXPECT|ASSERT}_PRED%(n)s.  Don't use
+// this in your code.
+#define GTEST_PRED%(n)s_(pred, %(vs)s, on_failure)\\
+  GTEST_ASSERT_(::testing::AssertPred%(n)sHelper(#pred""" % DEFS
+
+  impl += Iter(n, """, \\
+                                             #v%s""")
+
+  impl += """, \\
+                                             pred"""
+
+  impl += Iter(n, """, \\
+                                             v%s""")
+
+  impl += """), on_failure)
+
+// %(Arity)s predicate assertion macros.
+#define EXPECT_PRED_FORMAT%(n)s(pred_format, %(vs)s) \\
+  GTEST_PRED_FORMAT%(n)s_(pred_format, %(vs)s, GTEST_NONFATAL_FAILURE_)
+#define EXPECT_PRED%(n)s(pred, %(vs)s) \\
+  GTEST_PRED%(n)s_(pred, %(vs)s, GTEST_NONFATAL_FAILURE_)
+#define ASSERT_PRED_FORMAT%(n)s(pred_format, %(vs)s) \\
+  GTEST_PRED_FORMAT%(n)s_(pred_format, %(vs)s, GTEST_FATAL_FAILURE_)
+#define ASSERT_PRED%(n)s(pred, %(vs)s) \\
+  GTEST_PRED%(n)s_(pred, %(vs)s, GTEST_FATAL_FAILURE_)
+
+""" % DEFS
+
+  return impl
+
+
+def HeaderPostamble():
+  """Returns the postamble for the header file."""
+
+  return """
+
+#endif  // GTEST_INCLUDE_GTEST_GTEST_PRED_IMPL_H_
+"""
+
+
+def GenerateFile(path, content):
+  """Given a file path and a content string, overwrites it with the
+  given content."""
+
+  print 'Updating file %s . . .' % path
+
+  f = file(path, 'w+')
+  print >>f, content,
+  f.close()
+
+  print 'File %s has been updated.' % path
+
+
+def GenerateHeader(n):
+  """Given the maximum arity n, updates the header file that implements
+  the predicate assertions."""
+
+  GenerateFile(HEADER,
+               HeaderPreamble(n)
+               + ''.join([ImplementationForArity(i) for i in OneTo(n)])
+               + HeaderPostamble())
+
+
+def UnitTestPreamble():
+  """Returns the preamble for the unit test file."""
+
+  # A map that defines the values used in the preamble template.
+  DEFS = {
+    'today' : time.strftime('%m/%d/%Y'),
+    'year' : time.strftime('%Y'),
+    'command' : '%s %s' % (os.path.basename(sys.argv[0]), sys.argv[1]),
+    }
+
+  return (
+"""// Copyright 2006, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+// This file is AUTOMATICALLY GENERATED on %(today)s by command
+// '%(command)s'.  DO NOT EDIT BY HAND!
+
+// Regression test for gtest_pred_impl.h
+//
+// This file is generated by a script and quite long.  If you intend to
+// learn how Google Test works by reading its unit tests, read
+// gtest_unittest.cc instead.
+//
+// This is intended as a regression test for the Google Test predicate
+// assertions.  We compile it as part of the gtest_unittest target
+// only to keep the implementation tidy and compact, as it is quite
+// involved to set up the stage for testing Google Test using Google
+// Test itself.
+//
+// Currently, gtest_unittest takes ~11 seconds to run in the testing
+// daemon.  In the future, if it grows too large and needs much more
+// time to finish, we should consider separating this file into a
+// stand-alone regression test.
+
+#include <iostream>
+
+#include "gtest/gtest.h"
+#include "gtest/gtest-spi.h"
+
+// A user-defined data type.
+struct Bool {
+  explicit Bool(int val) : value(val != 0) {}
+
+  bool operator>(int n) const { return value > Bool(n).value; }
+
+  Bool operator+(const Bool& rhs) const { return Bool(value + rhs.value); }
+
+  bool operator==(const Bool& rhs) const { return value == rhs.value; }
+
+  bool value;
+};
+
+// Enables Bool to be used in assertions.
+std::ostream& operator<<(std::ostream& os, const Bool& x) {
+  return os << (x.value ? "true" : "false");
+}
+
+""" % DEFS)
+
+
+def TestsForArity(n):
+  """Returns the tests for n-ary predicate assertions."""
+
+  # A map that defines the values used in the template for the tests.
+  DEFS = {
+    'n' : n,
+    'es' : Iter(n, 'e%s', sep=', '),
+    'vs' : Iter(n, 'v%s', sep=', '),
+    'vts' : Iter(n, '#v%s', sep=', '),
+    'tvs' : Iter(n, 'T%s v%s', sep=', '),
+    'int_vs' : Iter(n, 'int v%s', sep=', '),
+    'Bool_vs' : Iter(n, 'Bool v%s', sep=', '),
+    'types' : Iter(n, 'typename T%s', sep=', '),
+    'v_sum' : Iter(n, 'v%s', sep=' + '),
+    'arity' : Arity(n),
+    'Arity' : Title(Arity(n)),
+    }
+
+  tests = (
+"""// Sample functions/functors for testing %(arity)s predicate assertions.
+
+// A %(arity)s predicate function.
+template <%(types)s>
+bool PredFunction%(n)s(%(tvs)s) {
+  return %(v_sum)s > 0;
+}
+
+// The following two functions are needed to circumvent a bug in
+// gcc 2.95.3, which sometimes has problem with the above template
+// function.
+bool PredFunction%(n)sInt(%(int_vs)s) {
+  return %(v_sum)s > 0;
+}
+bool PredFunction%(n)sBool(%(Bool_vs)s) {
+  return %(v_sum)s > 0;
+}
+""" % DEFS)
+
+  tests += """
+// A %(arity)s predicate functor.
+struct PredFunctor%(n)s {
+  template <%(types)s>
+  bool operator()(""" % DEFS
+
+  tests += Iter(n, 'const T%s& v%s', sep=""",
+                  """)
+
+  tests += """) {
+    return %(v_sum)s > 0;
+  }
+};
+""" % DEFS
+
+  tests += """
+// A %(arity)s predicate-formatter function.
+template <%(types)s>
+testing::AssertionResult PredFormatFunction%(n)s(""" % DEFS
+
+  tests += Iter(n, 'const char* e%s', sep=""",
+                                             """)
+
+  tests += Iter(n, """,
+                                             const T%s& v%s""")
+
+  tests += """) {
+  if (PredFunction%(n)s(%(vs)s))
+    return testing::AssertionSuccess();
+
+  return testing::AssertionFailure()
+      << """ % DEFS
+
+  tests += Iter(n, 'e%s', sep=' << " + " << ')
+
+  tests += """
+      << " is expected to be positive, but evaluates to "
+      << %(v_sum)s << ".";
+}
+""" % DEFS
+
+  tests += """
+// A %(arity)s predicate-formatter functor.
+struct PredFormatFunctor%(n)s {
+  template <%(types)s>
+  testing::AssertionResult operator()(""" % DEFS
+
+  tests += Iter(n, 'const char* e%s', sep=""",
+                                      """)
+
+  tests += Iter(n, """,
+                                      const T%s& v%s""")
+
+  tests += """) const {
+    return PredFormatFunction%(n)s(%(es)s, %(vs)s);
+  }
+};
+""" % DEFS
+
+  tests += """
+// Tests for {EXPECT|ASSERT}_PRED_FORMAT%(n)s.
+
+class Predicate%(n)sTest : public testing::Test {
+ protected:
+  virtual void SetUp() {
+    expected_to_finish_ = true;
+    finished_ = false;""" % DEFS
+
+  tests += """
+    """ + Iter(n, 'n%s_ = ') + """0;
+  }
+"""
+
+  tests += """
+  virtual void TearDown() {
+    // Verifies that each of the predicate's arguments was evaluated
+    // exactly once."""
+
+  tests += ''.join(["""
+    EXPECT_EQ(1, n%s_) <<
+        "The predicate assertion didn't evaluate argument %s "
+        "exactly once.";""" % (i, i + 1) for i in OneTo(n)])
+
+  tests += """
+
+    // Verifies that the control flow in the test function is expected.
+    if (expected_to_finish_ && !finished_) {
+      FAIL() << "The predicate assertion unexpactedly aborted the test.";
+    } else if (!expected_to_finish_ && finished_) {
+      FAIL() << "The failed predicate assertion didn't abort the test "
+                "as expected.";
+    }
+  }
+
+  // true iff the test function is expected to run to finish.
+  static bool expected_to_finish_;
+
+  // true iff the test function did run to finish.
+  static bool finished_;
+""" % DEFS
+
+  tests += Iter(n, """
+  static int n%s_;""")
+
+  tests += """
+};
+
+bool Predicate%(n)sTest::expected_to_finish_;
+bool Predicate%(n)sTest::finished_;
+""" % DEFS
+
+  tests += Iter(n, """int Predicate%%(n)sTest::n%s_;
+""") % DEFS
+
+  tests += """
+typedef Predicate%(n)sTest EXPECT_PRED_FORMAT%(n)sTest;
+typedef Predicate%(n)sTest ASSERT_PRED_FORMAT%(n)sTest;
+typedef Predicate%(n)sTest EXPECT_PRED%(n)sTest;
+typedef Predicate%(n)sTest ASSERT_PRED%(n)sTest;
+""" % DEFS
+
+  def GenTest(use_format, use_assert, expect_failure,
+              use_functor, use_user_type):
+    """Returns the test for a predicate assertion macro.
+
+    Args:
+      use_format:     true iff the assertion is a *_PRED_FORMAT*.
+      use_assert:     true iff the assertion is a ASSERT_*.
+      expect_failure: true iff the assertion is expected to fail.
+      use_functor:    true iff the first argument of the assertion is
+                      a functor (as opposed to a function)
+      use_user_type:  true iff the predicate functor/function takes
+                      argument(s) of a user-defined type.
+
+    Example:
+
+      GenTest(1, 0, 0, 1, 0) returns a test that tests the behavior
+      of a successful EXPECT_PRED_FORMATn() that takes a functor
+      whose arguments have built-in types."""
+
+    if use_assert:
+      assrt = 'ASSERT'  # 'assert' is reserved, so we cannot use
+                        # that identifier here.
+    else:
+      assrt = 'EXPECT'
+
+    assertion = assrt + '_PRED'
+
+    if use_format:
+      pred_format = 'PredFormat'
+      assertion += '_FORMAT'
+    else:
+      pred_format = 'Pred'
+
+    assertion += '%(n)s' % DEFS
+
+    if use_functor:
+      pred_format_type = 'functor'
+      pred_format += 'Functor%(n)s()'
+    else:
+      pred_format_type = 'function'
+      pred_format += 'Function%(n)s'
+      if not use_format:
+        if use_user_type:
+          pred_format += 'Bool'
+        else:
+          pred_format += 'Int'
+
+    test_name = pred_format_type.title()
+
+    if use_user_type:
+      arg_type = 'user-defined type (Bool)'
+      test_name += 'OnUserType'
+      if expect_failure:
+        arg = 'Bool(n%s_++)'
+      else:
+        arg = 'Bool(++n%s_)'
+    else:
+      arg_type = 'built-in type (int)'
+      test_name += 'OnBuiltInType'
+      if expect_failure:
+        arg = 'n%s_++'
+      else:
+        arg = '++n%s_'
+
+    if expect_failure:
+      successful_or_failed = 'failed'
+      expected_or_not = 'expected.'
+      test_name +=  'Failure'
+    else:
+      successful_or_failed = 'successful'
+      expected_or_not = 'UNEXPECTED!'
+      test_name +=  'Success'
+
+    # A map that defines the values used in the test template.
+    defs = DEFS.copy()
+    defs.update({
+      'assert' : assrt,
+      'assertion' : assertion,
+      'test_name' : test_name,
+      'pf_type' : pred_format_type,
+      'pf' : pred_format,
+      'arg_type' : arg_type,
+      'arg' : arg,
+      'successful' : successful_or_failed,
+      'expected' : expected_or_not,
+      })
+
+    test = """
+// Tests a %(successful)s %(assertion)s where the
+// predicate-formatter is a %(pf_type)s on a %(arg_type)s.
+TEST_F(%(assertion)sTest, %(test_name)s) {""" % defs
+
+    indent = (len(assertion) + 3)*' '
+    extra_indent = ''
+
+    if expect_failure:
+      extra_indent = '  '
+      if use_assert:
+        test += """
+  expected_to_finish_ = false;
+  EXPECT_FATAL_FAILURE({  // NOLINT"""
+      else:
+        test += """
+  EXPECT_NONFATAL_FAILURE({  // NOLINT"""
+
+    test += '\n' + extra_indent + """  %(assertion)s(%(pf)s""" % defs
+
+    test = test % defs
+    test += Iter(n, ',\n' + indent + extra_indent + '%(arg)s' % defs)
+    test += ');\n' + extra_indent + '  finished_ = true;\n'
+
+    if expect_failure:
+      test += '  }, "");\n'
+
+    test += '}\n'
+    return test
+
+  # Generates tests for all 2**6 = 64 combinations.
+  tests += ''.join([GenTest(use_format, use_assert, expect_failure,
+                            use_functor, use_user_type)
+                    for use_format in [0, 1]
+                    for use_assert in [0, 1]
+                    for expect_failure in [0, 1]
+                    for use_functor in [0, 1]
+                    for use_user_type in [0, 1]
+                    ])
+
+  return tests
+
+
+def UnitTestPostamble():
+  """Returns the postamble for the tests."""
+
+  return ''
+
+
+def GenerateUnitTest(n):
+  """Returns the tests for up-to n-ary predicate assertions."""
+
+  GenerateFile(UNIT_TEST,
+               UnitTestPreamble()
+               + ''.join([TestsForArity(i) for i in OneTo(n)])
+               + UnitTestPostamble())
+
+
+def _Main():
+  """The entry point of the script.  Generates the header file and its
+  unit test."""
+
+  if len(sys.argv) != 2:
+    print __doc__
+    print 'Author: ' + __author__
+    sys.exit(1)
+
+  n = int(sys.argv[1])
+  GenerateHeader(n)
+  GenerateUnitTest(n)
+
+
+if __name__ == '__main__':
+  _Main()
diff --git a/contrib/gtest-1.7.0/scripts/gtest-config.in b/contrib/gtest-1.7.0/scripts/gtest-config.in
new file mode 100755
index 0000000..780f843
--- /dev/null
+++ b/contrib/gtest-1.7.0/scripts/gtest-config.in
@@ -0,0 +1,274 @@
+#!/bin/sh
+
+# These variables are automatically filled in by the configure script.
+name="@PACKAGE_TARNAME@"
+version="@PACKAGE_VERSION@"
+
+show_usage()
+{
+  echo "Usage: gtest-config [OPTIONS...]"
+}
+
+show_help()
+{
+  show_usage
+  cat <<\EOF
+
+The `gtest-config' script provides access to the necessary compile and linking
+flags to connect with Google C++ Testing Framework, both in a build prior to
+installation, and on the system proper after installation. The installation
+overrides may be issued in combination with any other queries, but will only
+affect installation queries if called on a built but not installed gtest. The
+installation queries may not be issued with any other types of queries, and
+only one installation query may be made at a time. The version queries and
+compiler flag queries may be combined as desired but not mixed. Different
+version queries are always combined with logical "and" semantics, and only the
+last of any particular query is used while all previous ones ignored. All
+versions must be specified as a sequence of numbers separated by periods.
+Compiler flag queries output the union of the sets of flags when combined.
+
+ Examples:
+  gtest-config --min-version=1.0 || echo "Insufficient Google Test version."
+
+  g++ $(gtest-config --cppflags --cxxflags) -o foo.o -c foo.cpp
+  g++ $(gtest-config --ldflags --libs) -o foo foo.o
+
+  # When using a built but not installed Google Test:
+  g++ $(../../my_gtest_build/scripts/gtest-config ...) ...
+
+  # When using an installed Google Test, but with installation overrides:
+  export GTEST_PREFIX="/opt"
+  g++ $(gtest-config --libdir="/opt/lib64" ...) ...
+
+ Help:
+  --usage                    brief usage information
+  --help                     display this help message
+
+ Installation Overrides:
+  --prefix=<dir>             overrides the installation prefix
+  --exec-prefix=<dir>        overrides the executable installation prefix
+  --libdir=<dir>             overrides the library installation prefix
+  --includedir=<dir>         overrides the header file installation prefix
+
+ Installation Queries:
+  --prefix                   installation prefix
+  --exec-prefix              executable installation prefix
+  --libdir                   library installation directory
+  --includedir               header file installation directory
+  --version                  the version of the Google Test installation
+
+ Version Queries:
+  --min-version=VERSION      return 0 if the version is at least VERSION
+  --exact-version=VERSION    return 0 if the version is exactly VERSION
+  --max-version=VERSION      return 0 if the version is at most VERSION
+
+ Compilation Flag Queries:
+  --cppflags                 compile flags specific to the C-like preprocessors
+  --cxxflags                 compile flags appropriate for C++ programs
+  --ldflags                  linker flags
+  --libs                     libraries for linking
+
+EOF
+}
+
+# This function bounds our version with a min and a max. It uses some clever
+# POSIX-compliant variable expansion to portably do all the work in the shell
+# and avoid any dependency on a particular "sed" or "awk" implementation.
+# Notable is that it will only ever compare the first 3 components of versions.
+# Further components will be cleanly stripped off. All versions must be
+# unadorned, so "v1.0" will *not* work. The minimum version must be in $1, and
+# the max in $2. TODO(chandlerc at google.com): If this ever breaks, we should
+# investigate expanding this via autom4te from AS_VERSION_COMPARE rather than
+# continuing to maintain our own shell version.
+check_versions()
+{
+  major_version=${version%%.*}
+  minor_version="0"
+  point_version="0"
+  if test "${version#*.}" != "${version}"; then
+    minor_version=${version#*.}
+    minor_version=${minor_version%%.*}
+  fi
+  if test "${version#*.*.}" != "${version}"; then
+    point_version=${version#*.*.}
+    point_version=${point_version%%.*}
+  fi
+
+  min_version="$1"
+  min_major_version=${min_version%%.*}
+  min_minor_version="0"
+  min_point_version="0"
+  if test "${min_version#*.}" != "${min_version}"; then
+    min_minor_version=${min_version#*.}
+    min_minor_version=${min_minor_version%%.*}
+  fi
+  if test "${min_version#*.*.}" != "${min_version}"; then
+    min_point_version=${min_version#*.*.}
+    min_point_version=${min_point_version%%.*}
+  fi
+
+  max_version="$2"
+  max_major_version=${max_version%%.*}
+  max_minor_version="0"
+  max_point_version="0"
+  if test "${max_version#*.}" != "${max_version}"; then
+    max_minor_version=${max_version#*.}
+    max_minor_version=${max_minor_version%%.*}
+  fi
+  if test "${max_version#*.*.}" != "${max_version}"; then
+    max_point_version=${max_version#*.*.}
+    max_point_version=${max_point_version%%.*}
+  fi
+
+  test $(($major_version)) -lt $(($min_major_version)) && exit 1
+  if test $(($major_version)) -eq $(($min_major_version)); then
+    test $(($minor_version)) -lt $(($min_minor_version)) && exit 1
+    if test $(($minor_version)) -eq $(($min_minor_version)); then
+      test $(($point_version)) -lt $(($min_point_version)) && exit 1
+    fi
+  fi
+
+  test $(($major_version)) -gt $(($max_major_version)) && exit 1
+  if test $(($major_version)) -eq $(($max_major_version)); then
+    test $(($minor_version)) -gt $(($max_minor_version)) && exit 1
+    if test $(($minor_version)) -eq $(($max_minor_version)); then
+      test $(($point_version)) -gt $(($max_point_version)) && exit 1
+    fi
+  fi
+
+  exit 0
+}
+
+# Show the usage line when no arguments are specified.
+if test $# -eq 0; then
+  show_usage
+  exit 1
+fi
+
+while test $# -gt 0; do
+  case $1 in
+    --usage)          show_usage;         exit 0;;
+    --help)           show_help;          exit 0;;
+
+    # Installation overrides
+    --prefix=*)       GTEST_PREFIX=${1#--prefix=};;
+    --exec-prefix=*)  GTEST_EXEC_PREFIX=${1#--exec-prefix=};;
+    --libdir=*)       GTEST_LIBDIR=${1#--libdir=};;
+    --includedir=*)   GTEST_INCLUDEDIR=${1#--includedir=};;
+
+    # Installation queries
+    --prefix|--exec-prefix|--libdir|--includedir|--version)
+      if test -n "${do_query}"; then
+        show_usage
+        exit 1
+      fi
+      do_query=${1#--}
+      ;;
+
+    # Version checking
+    --min-version=*)
+      do_check_versions=yes
+      min_version=${1#--min-version=}
+      ;;
+    --max-version=*)
+      do_check_versions=yes
+      max_version=${1#--max-version=}
+      ;;
+    --exact-version=*)
+      do_check_versions=yes
+      exact_version=${1#--exact-version=}
+      ;;
+
+    # Compiler flag output
+    --cppflags)       echo_cppflags=yes;;
+    --cxxflags)       echo_cxxflags=yes;;
+    --ldflags)        echo_ldflags=yes;;
+    --libs)           echo_libs=yes;;
+
+    # Everything else is an error
+    *)                show_usage;         exit 1;;
+  esac
+  shift
+done
+
+# These have defaults filled in by the configure script but can also be
+# overridden by environment variables or command line parameters.
+prefix="${GTEST_PREFIX:- at prefix@}"
+exec_prefix="${GTEST_EXEC_PREFIX:- at exec_prefix@}"
+libdir="${GTEST_LIBDIR:- at libdir@}"
+includedir="${GTEST_INCLUDEDIR:- at includedir@}"
+
+# We try and detect if our binary is not located at its installed location. If
+# it's not, we provide variables pointing to the source and build tree rather
+# than to the install tree. This allows building against a just-built gtest
+# rather than an installed gtest.
+bindir="@bindir@"
+this_relative_bindir=`dirname $0`
+this_bindir=`cd ${this_relative_bindir}; pwd -P`
+if test "${this_bindir}" = "${this_bindir%${bindir}}"; then
+  # The path to the script doesn't end in the bindir sequence from Autoconf,
+  # assume that we are in a build tree.
+  build_dir=`dirname ${this_bindir}`
+  src_dir=`cd ${this_bindir}; cd @top_srcdir@; pwd -P`
+
+  # TODO(chandlerc at google.com): This is a dangerous dependency on libtool, we
+  # should work to remove it, and/or remove libtool altogether, replacing it
+  # with direct references to the library and a link path.
+  gtest_libs="${build_dir}/lib/libgtest.la @PTHREAD_CFLAGS@ @PTHREAD_LIBS@"
+  gtest_ldflags=""
+
+  # We provide hooks to include from either the source or build dir, where the
+  # build dir is always preferred. This will potentially allow us to write
+  # build rules for generated headers and have them automatically be preferred
+  # over provided versions.
+  gtest_cppflags="-I${build_dir}/include -I${src_dir}/include"
+  gtest_cxxflags="@PTHREAD_CFLAGS@"
+else
+  # We're using an installed gtest, although it may be staged under some
+  # prefix. Assume (as our own libraries do) that we can resolve the prefix,
+  # and are present in the dynamic link paths.
+  gtest_ldflags="-L${libdir}"
+  gtest_libs="-l${name} @PTHREAD_CFLAGS@ @PTHREAD_LIBS@"
+  gtest_cppflags="-I${includedir}"
+  gtest_cxxflags="@PTHREAD_CFLAGS@"
+fi
+
+# Do an installation query if requested.
+if test -n "$do_query"; then
+  case $do_query in
+    prefix)           echo $prefix;       exit 0;;
+    exec-prefix)      echo $exec_prefix;  exit 0;;
+    libdir)           echo $libdir;       exit 0;;
+    includedir)       echo $includedir;   exit 0;;
+    version)          echo $version;      exit 0;;
+    *)                show_usage;         exit 1;;
+  esac
+fi
+
+# Do a version check if requested.
+if test "$do_check_versions" = "yes"; then
+  # Make sure we didn't receive a bad combination of parameters.
+  test "$echo_cppflags" = "yes" && show_usage && exit 1
+  test "$echo_cxxflags" = "yes" && show_usage && exit 1
+  test "$echo_ldflags" = "yes"  && show_usage && exit 1
+  test "$echo_libs" = "yes"     && show_usage && exit 1
+
+  if test "$exact_version" != ""; then
+    check_versions $exact_version $exact_version
+    # unreachable
+  else
+    check_versions ${min_version:-0.0.0} ${max_version:-9999.9999.9999}
+    # unreachable
+  fi
+fi
+
+# Do the output in the correct order so that these can be used in-line of
+# a compiler invocation.
+output=""
+test "$echo_cppflags" = "yes" && output="$output $gtest_cppflags"
+test "$echo_cxxflags" = "yes" && output="$output $gtest_cxxflags"
+test "$echo_ldflags" = "yes"  && output="$output $gtest_ldflags"
+test "$echo_libs" = "yes"     && output="$output $gtest_libs"
+echo $output
+
+exit 0
diff --git a/contrib/gtest-1.7.0/scripts/pump.py b/contrib/gtest-1.7.0/scripts/pump.py
new file mode 100755
index 0000000..5efb653
--- /dev/null
+++ b/contrib/gtest-1.7.0/scripts/pump.py
@@ -0,0 +1,855 @@
+#!/usr/bin/env python
+#
+# Copyright 2008, Google Inc.
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+#
+#     * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#     * Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following disclaimer
+# in the documentation and/or other materials provided with the
+# distribution.
+#     * Neither the name of Google Inc. nor the names of its
+# contributors may be used to endorse or promote products derived from
+# this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+"""pump v0.2.0 - Pretty Useful for Meta Programming.
+
+A tool for preprocessor meta programming.  Useful for generating
+repetitive boilerplate code.  Especially useful for writing C++
+classes, functions, macros, and templates that need to work with
+various number of arguments.
+
+USAGE:
+       pump.py SOURCE_FILE
+
+EXAMPLES:
+       pump.py foo.cc.pump
+         Converts foo.cc.pump to foo.cc.
+
+GRAMMAR:
+       CODE ::= ATOMIC_CODE*
+       ATOMIC_CODE ::= $var ID = EXPRESSION
+           | $var ID = [[ CODE ]]
+           | $range ID EXPRESSION..EXPRESSION
+           | $for ID SEPARATOR [[ CODE ]]
+           | $($)
+           | $ID
+           | $(EXPRESSION)
+           | $if EXPRESSION [[ CODE ]] ELSE_BRANCH
+           | [[ CODE ]]
+           | RAW_CODE
+       SEPARATOR ::= RAW_CODE | EMPTY
+       ELSE_BRANCH ::= $else [[ CODE ]]
+           | $elif EXPRESSION [[ CODE ]] ELSE_BRANCH
+           | EMPTY
+       EXPRESSION has Python syntax.
+"""
+
+__author__ = 'wan at google.com (Zhanyong Wan)'
+
+import os
+import re
+import sys
+
+
+TOKEN_TABLE = [
+    (re.compile(r'\$var\s+'), '$var'),
+    (re.compile(r'\$elif\s+'), '$elif'),
+    (re.compile(r'\$else\s+'), '$else'),
+    (re.compile(r'\$for\s+'), '$for'),
+    (re.compile(r'\$if\s+'), '$if'),
+    (re.compile(r'\$range\s+'), '$range'),
+    (re.compile(r'\$[_A-Za-z]\w*'), '$id'),
+    (re.compile(r'\$\(\$\)'), '$($)'),
+    (re.compile(r'\$'), '$'),
+    (re.compile(r'\[\[\n?'), '[['),
+    (re.compile(r'\]\]\n?'), ']]'),
+    ]
+
+
+class Cursor:
+  """Represents a position (line and column) in a text file."""
+
+  def __init__(self, line=-1, column=-1):
+    self.line = line
+    self.column = column
+
+  def __eq__(self, rhs):
+    return self.line == rhs.line and self.column == rhs.column
+
+  def __ne__(self, rhs):
+    return not self == rhs
+
+  def __lt__(self, rhs):
+    return self.line < rhs.line or (
+        self.line == rhs.line and self.column < rhs.column)
+
+  def __le__(self, rhs):
+    return self < rhs or self == rhs
+
+  def __gt__(self, rhs):
+    return rhs < self
+
+  def __ge__(self, rhs):
+    return rhs <= self
+
+  def __str__(self):
+    if self == Eof():
+      return 'EOF'
+    else:
+      return '%s(%s)' % (self.line + 1, self.column)
+
+  def __add__(self, offset):
+    return Cursor(self.line, self.column + offset)
+
+  def __sub__(self, offset):
+    return Cursor(self.line, self.column - offset)
+
+  def Clone(self):
+    """Returns a copy of self."""
+
+    return Cursor(self.line, self.column)
+
+
+# Special cursor to indicate the end-of-file.
+def Eof():
+  """Returns the special cursor to denote the end-of-file."""
+  return Cursor(-1, -1)
+
+
+class Token:
+  """Represents a token in a Pump source file."""
+
+  def __init__(self, start=None, end=None, value=None, token_type=None):
+    if start is None:
+      self.start = Eof()
+    else:
+      self.start = start
+    if end is None:
+      self.end = Eof()
+    else:
+      self.end = end
+    self.value = value
+    self.token_type = token_type
+
+  def __str__(self):
+    return 'Token @%s: \'%s\' type=%s' % (
+        self.start, self.value, self.token_type)
+
+  def Clone(self):
+    """Returns a copy of self."""
+
+    return Token(self.start.Clone(), self.end.Clone(), self.value,
+                 self.token_type)
+
+
+def StartsWith(lines, pos, string):
+  """Returns True iff the given position in lines starts with 'string'."""
+
+  return lines[pos.line][pos.column:].startswith(string)
+
+
+def FindFirstInLine(line, token_table):
+  best_match_start = -1
+  for (regex, token_type) in token_table:
+    m = regex.search(line)
+    if m:
+      # We found regex in lines
+      if best_match_start < 0 or m.start() < best_match_start:
+        best_match_start = m.start()
+        best_match_length = m.end() - m.start()
+        best_match_token_type = token_type
+
+  if best_match_start < 0:
+    return None
+
+  return (best_match_start, best_match_length, best_match_token_type)
+
+
+def FindFirst(lines, token_table, cursor):
+  """Finds the first occurrence of any string in strings in lines."""
+
+  start = cursor.Clone()
+  cur_line_number = cursor.line
+  for line in lines[start.line:]:
+    if cur_line_number == start.line:
+      line = line[start.column:]
+    m = FindFirstInLine(line, token_table)
+    if m:
+      # We found a regex in line.
+      (start_column, length, token_type) = m
+      if cur_line_number == start.line:
+        start_column += start.column
+      found_start = Cursor(cur_line_number, start_column)
+      found_end = found_start + length
+      return MakeToken(lines, found_start, found_end, token_type)
+    cur_line_number += 1
+  # We failed to find str in lines
+  return None
+
+
+def SubString(lines, start, end):
+  """Returns a substring in lines."""
+
+  if end == Eof():
+    end = Cursor(len(lines) - 1, len(lines[-1]))
+
+  if start >= end:
+    return ''
+
+  if start.line == end.line:
+    return lines[start.line][start.column:end.column]
+
+  result_lines = ([lines[start.line][start.column:]] +
+                  lines[start.line + 1:end.line] +
+                  [lines[end.line][:end.column]])
+  return ''.join(result_lines)
+
+
+def StripMetaComments(str):
+  """Strip meta comments from each line in the given string."""
+
+  # First, completely remove lines containing nothing but a meta
+  # comment, including the trailing \n.
+  str = re.sub(r'^\s*\$\$.*\n', '', str)
+
+  # Then, remove meta comments from contentful lines.
+  return re.sub(r'\s*\$\$.*', '', str)
+
+
+def MakeToken(lines, start, end, token_type):
+  """Creates a new instance of Token."""
+
+  return Token(start, end, SubString(lines, start, end), token_type)
+
+
+def ParseToken(lines, pos, regex, token_type):
+  line = lines[pos.line][pos.column:]
+  m = regex.search(line)
+  if m and not m.start():
+    return MakeToken(lines, pos, pos + m.end(), token_type)
+  else:
+    print 'ERROR: %s expected at %s.' % (token_type, pos)
+    sys.exit(1)
+
+
+ID_REGEX = re.compile(r'[_A-Za-z]\w*')
+EQ_REGEX = re.compile(r'=')
+REST_OF_LINE_REGEX = re.compile(r'.*?(?=$|\$\$)')
+OPTIONAL_WHITE_SPACES_REGEX = re.compile(r'\s*')
+WHITE_SPACE_REGEX = re.compile(r'\s')
+DOT_DOT_REGEX = re.compile(r'\.\.')
+
+
+def Skip(lines, pos, regex):
+  line = lines[pos.line][pos.column:]
+  m = re.search(regex, line)
+  if m and not m.start():
+    return pos + m.end()
+  else:
+    return pos
+
+
+def SkipUntil(lines, pos, regex, token_type):
+  line = lines[pos.line][pos.column:]
+  m = re.search(regex, line)
+  if m:
+    return pos + m.start()
+  else:
+    print ('ERROR: %s expected on line %s after column %s.' %
+           (token_type, pos.line + 1, pos.column))
+    sys.exit(1)
+
+
+def ParseExpTokenInParens(lines, pos):
+  def ParseInParens(pos):
+    pos = Skip(lines, pos, OPTIONAL_WHITE_SPACES_REGEX)
+    pos = Skip(lines, pos, r'\(')
+    pos = Parse(pos)
+    pos = Skip(lines, pos, r'\)')
+    return pos
+
+  def Parse(pos):
+    pos = SkipUntil(lines, pos, r'\(|\)', ')')
+    if SubString(lines, pos, pos + 1) == '(':
+      pos = Parse(pos + 1)
+      pos = Skip(lines, pos, r'\)')
+      return Parse(pos)
+    else:
+      return pos
+
+  start = pos.Clone()
+  pos = ParseInParens(pos)
+  return MakeToken(lines, start, pos, 'exp')
+
+
+def RStripNewLineFromToken(token):
+  if token.value.endswith('\n'):
+    return Token(token.start, token.end, token.value[:-1], token.token_type)
+  else:
+    return token
+
+
+def TokenizeLines(lines, pos):
+  while True:
+    found = FindFirst(lines, TOKEN_TABLE, pos)
+    if not found:
+      yield MakeToken(lines, pos, Eof(), 'code')
+      return
+
+    if found.start == pos:
+      prev_token = None
+      prev_token_rstripped = None
+    else:
+      prev_token = MakeToken(lines, pos, found.start, 'code')
+      prev_token_rstripped = RStripNewLineFromToken(prev_token)
+
+    if found.token_type == '$var':
+      if prev_token_rstripped:
+        yield prev_token_rstripped
+      yield found
+      id_token = ParseToken(lines, found.end, ID_REGEX, 'id')
+      yield id_token
+      pos = Skip(lines, id_token.end, OPTIONAL_WHITE_SPACES_REGEX)
+
+      eq_token = ParseToken(lines, pos, EQ_REGEX, '=')
+      yield eq_token
+      pos = Skip(lines, eq_token.end, r'\s*')
+
+      if SubString(lines, pos, pos + 2) != '[[':
+        exp_token = ParseToken(lines, pos, REST_OF_LINE_REGEX, 'exp')
+        yield exp_token
+        pos = Cursor(exp_token.end.line + 1, 0)
+    elif found.token_type == '$for':
+      if prev_token_rstripped:
+        yield prev_token_rstripped
+      yield found
+      id_token = ParseToken(lines, found.end, ID_REGEX, 'id')
+      yield id_token
+      pos = Skip(lines, id_token.end, WHITE_SPACE_REGEX)
+    elif found.token_type == '$range':
+      if prev_token_rstripped:
+        yield prev_token_rstripped
+      yield found
+      id_token = ParseToken(lines, found.end, ID_REGEX, 'id')
+      yield id_token
+      pos = Skip(lines, id_token.end, OPTIONAL_WHITE_SPACES_REGEX)
+
+      dots_pos = SkipUntil(lines, pos, DOT_DOT_REGEX, '..')
+      yield MakeToken(lines, pos, dots_pos, 'exp')
+      yield MakeToken(lines, dots_pos, dots_pos + 2, '..')
+      pos = dots_pos + 2
+      new_pos = Cursor(pos.line + 1, 0)
+      yield MakeToken(lines, pos, new_pos, 'exp')
+      pos = new_pos
+    elif found.token_type == '$':
+      if prev_token:
+        yield prev_token
+      yield found
+      exp_token = ParseExpTokenInParens(lines, found.end)
+      yield exp_token
+      pos = exp_token.end
+    elif (found.token_type == ']]' or found.token_type == '$if' or
+          found.token_type == '$elif' or found.token_type == '$else'):
+      if prev_token_rstripped:
+        yield prev_token_rstripped
+      yield found
+      pos = found.end
+    else:
+      if prev_token:
+        yield prev_token
+      yield found
+      pos = found.end
+
+
+def Tokenize(s):
+  """A generator that yields the tokens in the given string."""
+  if s != '':
+    lines = s.splitlines(True)
+    for token in TokenizeLines(lines, Cursor(0, 0)):
+      yield token
+
+
+class CodeNode:
+  def __init__(self, atomic_code_list=None):
+    self.atomic_code = atomic_code_list
+
+
+class VarNode:
+  def __init__(self, identifier=None, atomic_code=None):
+    self.identifier = identifier
+    self.atomic_code = atomic_code
+
+
+class RangeNode:
+  def __init__(self, identifier=None, exp1=None, exp2=None):
+    self.identifier = identifier
+    self.exp1 = exp1
+    self.exp2 = exp2
+
+
+class ForNode:
+  def __init__(self, identifier=None, sep=None, code=None):
+    self.identifier = identifier
+    self.sep = sep
+    self.code = code
+
+
+class ElseNode:
+  def __init__(self, else_branch=None):
+    self.else_branch = else_branch
+
+
+class IfNode:
+  def __init__(self, exp=None, then_branch=None, else_branch=None):
+    self.exp = exp
+    self.then_branch = then_branch
+    self.else_branch = else_branch
+
+
+class RawCodeNode:
+  def __init__(self, token=None):
+    self.raw_code = token
+
+
+class LiteralDollarNode:
+  def __init__(self, token):
+    self.token = token
+
+
+class ExpNode:
+  def __init__(self, token, python_exp):
+    self.token = token
+    self.python_exp = python_exp
+
+
+def PopFront(a_list):
+  head = a_list[0]
+  a_list[:1] = []
+  return head
+
+
+def PushFront(a_list, elem):
+  a_list[:0] = [elem]
+
+
+def PopToken(a_list, token_type=None):
+  token = PopFront(a_list)
+  if token_type is not None and token.token_type != token_type:
+    print 'ERROR: %s expected at %s' % (token_type, token.start)
+    print 'ERROR: %s found instead' % (token,)
+    sys.exit(1)
+
+  return token
+
+
+def PeekToken(a_list):
+  if not a_list:
+    return None
+
+  return a_list[0]
+
+
+def ParseExpNode(token):
+  python_exp = re.sub(r'([_A-Za-z]\w*)', r'self.GetValue("\1")', token.value)
+  return ExpNode(token, python_exp)
+
+
+def ParseElseNode(tokens):
+  def Pop(token_type=None):
+    return PopToken(tokens, token_type)
+
+  next = PeekToken(tokens)
+  if not next:
+    return None
+  if next.token_type == '$else':
+    Pop('$else')
+    Pop('[[')
+    code_node = ParseCodeNode(tokens)
+    Pop(']]')
+    return code_node
+  elif next.token_type == '$elif':
+    Pop('$elif')
+    exp = Pop('code')
+    Pop('[[')
+    code_node = ParseCodeNode(tokens)
+    Pop(']]')
+    inner_else_node = ParseElseNode(tokens)
+    return CodeNode([IfNode(ParseExpNode(exp), code_node, inner_else_node)])
+  elif not next.value.strip():
+    Pop('code')
+    return ParseElseNode(tokens)
+  else:
+    return None
+
+
+def ParseAtomicCodeNode(tokens):
+  def Pop(token_type=None):
+    return PopToken(tokens, token_type)
+
+  head = PopFront(tokens)
+  t = head.token_type
+  if t == 'code':
+    return RawCodeNode(head)
+  elif t == '$var':
+    id_token = Pop('id')
+    Pop('=')
+    next = PeekToken(tokens)
+    if next.token_type == 'exp':
+      exp_token = Pop()
+      return VarNode(id_token, ParseExpNode(exp_token))
+    Pop('[[')
+    code_node = ParseCodeNode(tokens)
+    Pop(']]')
+    return VarNode(id_token, code_node)
+  elif t == '$for':
+    id_token = Pop('id')
+    next_token = PeekToken(tokens)
+    if next_token.token_type == 'code':
+      sep_token = next_token
+      Pop('code')
+    else:
+      sep_token = None
+    Pop('[[')
+    code_node = ParseCodeNode(tokens)
+    Pop(']]')
+    return ForNode(id_token, sep_token, code_node)
+  elif t == '$if':
+    exp_token = Pop('code')
+    Pop('[[')
+    code_node = ParseCodeNode(tokens)
+    Pop(']]')
+    else_node = ParseElseNode(tokens)
+    return IfNode(ParseExpNode(exp_token), code_node, else_node)
+  elif t == '$range':
+    id_token = Pop('id')
+    exp1_token = Pop('exp')
+    Pop('..')
+    exp2_token = Pop('exp')
+    return RangeNode(id_token, ParseExpNode(exp1_token),
+                     ParseExpNode(exp2_token))
+  elif t == '$id':
+    return ParseExpNode(Token(head.start + 1, head.end, head.value[1:], 'id'))
+  elif t == '$($)':
+    return LiteralDollarNode(head)
+  elif t == '$':
+    exp_token = Pop('exp')
+    return ParseExpNode(exp_token)
+  elif t == '[[':
+    code_node = ParseCodeNode(tokens)
+    Pop(']]')
+    return code_node
+  else:
+    PushFront(tokens, head)
+    return None
+
+
+def ParseCodeNode(tokens):
+  atomic_code_list = []
+  while True:
+    if not tokens:
+      break
+    atomic_code_node = ParseAtomicCodeNode(tokens)
+    if atomic_code_node:
+      atomic_code_list.append(atomic_code_node)
+    else:
+      break
+  return CodeNode(atomic_code_list)
+
+
+def ParseToAST(pump_src_text):
+  """Convert the given Pump source text into an AST."""
+  tokens = list(Tokenize(pump_src_text))
+  code_node = ParseCodeNode(tokens)
+  return code_node
+
+
+class Env:
+  def __init__(self):
+    self.variables = []
+    self.ranges = []
+
+  def Clone(self):
+    clone = Env()
+    clone.variables = self.variables[:]
+    clone.ranges = self.ranges[:]
+    return clone
+
+  def PushVariable(self, var, value):
+    # If value looks like an int, store it as an int.
+    try:
+      int_value = int(value)
+      if ('%s' % int_value) == value:
+        value = int_value
+    except Exception:
+      pass
+    self.variables[:0] = [(var, value)]
+
+  def PopVariable(self):
+    self.variables[:1] = []
+
+  def PushRange(self, var, lower, upper):
+    self.ranges[:0] = [(var, lower, upper)]
+
+  def PopRange(self):
+    self.ranges[:1] = []
+
+  def GetValue(self, identifier):
+    for (var, value) in self.variables:
+      if identifier == var:
+        return value
+
+    print 'ERROR: meta variable %s is undefined.' % (identifier,)
+    sys.exit(1)
+
+  def EvalExp(self, exp):
+    try:
+      result = eval(exp.python_exp)
+    except Exception, e:
+      print 'ERROR: caught exception %s: %s' % (e.__class__.__name__, e)
+      print ('ERROR: failed to evaluate meta expression %s at %s' %
+             (exp.python_exp, exp.token.start))
+      sys.exit(1)
+    return result
+
+  def GetRange(self, identifier):
+    for (var, lower, upper) in self.ranges:
+      if identifier == var:
+        return (lower, upper)
+
+    print 'ERROR: range %s is undefined.' % (identifier,)
+    sys.exit(1)
+
+
+class Output:
+  def __init__(self):
+    self.string = ''
+
+  def GetLastLine(self):
+    index = self.string.rfind('\n')
+    if index < 0:
+      return ''
+
+    return self.string[index + 1:]
+
+  def Append(self, s):
+    self.string += s
+
+
+def RunAtomicCode(env, node, output):
+  if isinstance(node, VarNode):
+    identifier = node.identifier.value.strip()
+    result = Output()
+    RunAtomicCode(env.Clone(), node.atomic_code, result)
+    value = result.string
+    env.PushVariable(identifier, value)
+  elif isinstance(node, RangeNode):
+    identifier = node.identifier.value.strip()
+    lower = int(env.EvalExp(node.exp1))
+    upper = int(env.EvalExp(node.exp2))
+    env.PushRange(identifier, lower, upper)
+  elif isinstance(node, ForNode):
+    identifier = node.identifier.value.strip()
+    if node.sep is None:
+      sep = ''
+    else:
+      sep = node.sep.value
+    (lower, upper) = env.GetRange(identifier)
+    for i in range(lower, upper + 1):
+      new_env = env.Clone()
+      new_env.PushVariable(identifier, i)
+      RunCode(new_env, node.code, output)
+      if i != upper:
+        output.Append(sep)
+  elif isinstance(node, RawCodeNode):
+    output.Append(node.raw_code.value)
+  elif isinstance(node, IfNode):
+    cond = env.EvalExp(node.exp)
+    if cond:
+      RunCode(env.Clone(), node.then_branch, output)
+    elif node.else_branch is not None:
+      RunCode(env.Clone(), node.else_branch, output)
+  elif isinstance(node, ExpNode):
+    value = env.EvalExp(node)
+    output.Append('%s' % (value,))
+  elif isinstance(node, LiteralDollarNode):
+    output.Append('$')
+  elif isinstance(node, CodeNode):
+    RunCode(env.Clone(), node, output)
+  else:
+    print 'BAD'
+    print node
+    sys.exit(1)
+
+
+def RunCode(env, code_node, output):
+  for atomic_code in code_node.atomic_code:
+    RunAtomicCode(env, atomic_code, output)
+
+
+def IsSingleLineComment(cur_line):
+  return '//' in cur_line
+
+
+def IsInPreprocessorDirective(prev_lines, cur_line):
+  if cur_line.lstrip().startswith('#'):
+    return True
+  return prev_lines and prev_lines[-1].endswith('\\')
+
+
+def WrapComment(line, output):
+  loc = line.find('//')
+  before_comment = line[:loc].rstrip()
+  if before_comment == '':
+    indent = loc
+  else:
+    output.append(before_comment)
+    indent = len(before_comment) - len(before_comment.lstrip())
+  prefix = indent*' ' + '// '
+  max_len = 80 - len(prefix)
+  comment = line[loc + 2:].strip()
+  segs = [seg for seg in re.split(r'(\w+\W*)', comment) if seg != '']
+  cur_line = ''
+  for seg in segs:
+    if len((cur_line + seg).rstrip()) < max_len:
+      cur_line += seg
+    else:
+      if cur_line.strip() != '':
+        output.append(prefix + cur_line.rstrip())
+      cur_line = seg.lstrip()
+  if cur_line.strip() != '':
+    output.append(prefix + cur_line.strip())
+
+
+def WrapCode(line, line_concat, output):
+  indent = len(line) - len(line.lstrip())
+  prefix = indent*' '  # Prefix of the current line
+  max_len = 80 - indent - len(line_concat)  # Maximum length of the current line
+  new_prefix = prefix + 4*' '  # Prefix of a continuation line
+  new_max_len = max_len - 4  # Maximum length of a continuation line
+  # Prefers to wrap a line after a ',' or ';'.
+  segs = [seg for seg in re.split(r'([^,;]+[,;]?)', line.strip()) if seg != '']
+  cur_line = ''  # The current line without leading spaces.
+  for seg in segs:
+    # If the line is still too long, wrap at a space.
+    while cur_line == '' and len(seg.strip()) > max_len:
+      seg = seg.lstrip()
+      split_at = seg.rfind(' ', 0, max_len)
+      output.append(prefix + seg[:split_at].strip() + line_concat)
+      seg = seg[split_at + 1:]
+      prefix = new_prefix
+      max_len = new_max_len
+
+    if len((cur_line + seg).rstrip()) < max_len:
+      cur_line = (cur_line + seg).lstrip()
+    else:
+      output.append(prefix + cur_line.rstrip() + line_concat)
+      prefix = new_prefix
+      max_len = new_max_len
+      cur_line = seg.lstrip()
+  if cur_line.strip() != '':
+    output.append(prefix + cur_line.strip())
+
+
+def WrapPreprocessorDirective(line, output):
+  WrapCode(line, ' \\', output)
+
+
+def WrapPlainCode(line, output):
+  WrapCode(line, '', output)
+
+
+def IsMultiLineIWYUPragma(line):
+  return re.search(r'/\* IWYU pragma: ', line)
+
+
+def IsHeaderGuardIncludeOrOneLineIWYUPragma(line):
+  return (re.match(r'^#(ifndef|define|endif\s*//)\s*[\w_]+\s*$', line) or
+          re.match(r'^#include\s', line) or
+          # Don't break IWYU pragmas, either; that causes iwyu.py problems.
+          re.search(r'// IWYU pragma: ', line))
+
+
+def WrapLongLine(line, output):
+  line = line.rstrip()
+  if len(line) <= 80:
+    output.append(line)
+  elif IsSingleLineComment(line):
+    if IsHeaderGuardIncludeOrOneLineIWYUPragma(line):
+      # The style guide made an exception to allow long header guard lines,
+      # includes and IWYU pragmas.
+      output.append(line)
+    else:
+      WrapComment(line, output)
+  elif IsInPreprocessorDirective(output, line):
+    if IsHeaderGuardIncludeOrOneLineIWYUPragma(line):
+      # The style guide made an exception to allow long header guard lines,
+      # includes and IWYU pragmas.
+      output.append(line)
+    else:
+      WrapPreprocessorDirective(line, output)
+  elif IsMultiLineIWYUPragma(line):
+    output.append(line)
+  else:
+    WrapPlainCode(line, output)
+
+
+def BeautifyCode(string):
+  lines = string.splitlines()
+  output = []
+  for line in lines:
+    WrapLongLine(line, output)
+  output2 = [line.rstrip() for line in output]
+  return '\n'.join(output2) + '\n'
+
+
+def ConvertFromPumpSource(src_text):
+  """Return the text generated from the given Pump source text."""
+  ast = ParseToAST(StripMetaComments(src_text))
+  output = Output()
+  RunCode(Env(), ast, output)
+  return BeautifyCode(output.string)
+
+
+def main(argv):
+  if len(argv) == 1:
+    print __doc__
+    sys.exit(1)
+
+  file_path = argv[-1]
+  output_str = ConvertFromPumpSource(file(file_path, 'r').read())
+  if file_path.endswith('.pump'):
+    output_file_path = file_path[:-5]
+  else:
+    output_file_path = '-'
+  if output_file_path == '-':
+    print output_str,
+  else:
+    output_file = file(output_file_path, 'w')
+    output_file.write('// This file was GENERATED by command:\n')
+    output_file.write('//     %s %s\n' %
+                      (os.path.basename(__file__), os.path.basename(file_path)))
+    output_file.write('// DO NOT EDIT BY HAND!!!\n\n')
+    output_file.write(output_str)
+    output_file.close()
+
+
+if __name__ == '__main__':
+  main(sys.argv)
diff --git a/contrib/gtest-1.7.0/scripts/test/Makefile b/contrib/gtest-1.7.0/scripts/test/Makefile
new file mode 100644
index 0000000..cdff584
--- /dev/null
+++ b/contrib/gtest-1.7.0/scripts/test/Makefile
@@ -0,0 +1,59 @@
+# A Makefile for fusing Google Test and building a sample test against it.
+#
+# SYNOPSIS:
+#
+#   make [all]  - makes everything.
+#   make TARGET - makes the given target.
+#   make check  - makes everything and runs the built sample test.
+#   make clean  - removes all files generated by make.
+
+# Points to the root of fused Google Test, relative to where this file is.
+FUSED_GTEST_DIR = output
+
+# Paths to the fused gtest files.
+FUSED_GTEST_H = $(FUSED_GTEST_DIR)/gtest/gtest.h
+FUSED_GTEST_ALL_CC = $(FUSED_GTEST_DIR)/gtest/gtest-all.cc
+
+# Where to find the sample test.
+SAMPLE_DIR = ../../samples
+
+# Where to find gtest_main.cc.
+GTEST_MAIN_CC = ../../src/gtest_main.cc
+
+# Flags passed to the preprocessor.
+# We have no idea here whether pthreads is available in the system, so
+# disable its use.
+CPPFLAGS += -I$(FUSED_GTEST_DIR) -DGTEST_HAS_PTHREAD=0
+
+# Flags passed to the C++ compiler.
+CXXFLAGS += -g
+
+all : sample1_unittest
+
+check : all
+	./sample1_unittest
+
+clean :
+	rm -rf $(FUSED_GTEST_DIR) sample1_unittest *.o
+
+$(FUSED_GTEST_H) :
+	../fuse_gtest_files.py $(FUSED_GTEST_DIR)
+
+$(FUSED_GTEST_ALL_CC) :
+	../fuse_gtest_files.py $(FUSED_GTEST_DIR)
+
+gtest-all.o : $(FUSED_GTEST_H) $(FUSED_GTEST_ALL_CC)
+	$(CXX) $(CPPFLAGS) $(CXXFLAGS) -c $(FUSED_GTEST_DIR)/gtest/gtest-all.cc
+
+gtest_main.o : $(FUSED_GTEST_H) $(GTEST_MAIN_CC)
+	$(CXX) $(CPPFLAGS) $(CXXFLAGS) -c $(GTEST_MAIN_CC)
+
+sample1.o : $(SAMPLE_DIR)/sample1.cc $(SAMPLE_DIR)/sample1.h
+	$(CXX) $(CPPFLAGS) $(CXXFLAGS) -c $(SAMPLE_DIR)/sample1.cc
+
+sample1_unittest.o : $(SAMPLE_DIR)/sample1_unittest.cc \
+                     $(SAMPLE_DIR)/sample1.h $(FUSED_GTEST_H)
+	$(CXX) $(CPPFLAGS) $(CXXFLAGS) -c $(SAMPLE_DIR)/sample1_unittest.cc
+
+sample1_unittest : sample1.o sample1_unittest.o gtest-all.o gtest_main.o
+	$(CXX) $(CPPFLAGS) $(CXXFLAGS) $^ -o $@
diff --git a/contrib/gtest-1.7.0/src/gtest-all.cc b/contrib/gtest-1.7.0/src/gtest-all.cc
new file mode 100644
index 0000000..0a9cee5
--- /dev/null
+++ b/contrib/gtest-1.7.0/src/gtest-all.cc
@@ -0,0 +1,48 @@
+// Copyright 2008, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: mheule at google.com (Markus Heule)
+//
+// Google C++ Testing Framework (Google Test)
+//
+// Sometimes it's desirable to build Google Test by compiling a single file.
+// This file serves this purpose.
+
+// This line ensures that gtest.h can be compiled on its own, even
+// when it's fused.
+#include "gtest/gtest.h"
+
+// The following lines pull in the real gtest *.cc files.
+#include "src/gtest.cc"
+#include "src/gtest-death-test.cc"
+#include "src/gtest-filepath.cc"
+#include "src/gtest-port.cc"
+#include "src/gtest-printers.cc"
+#include "src/gtest-test-part.cc"
+#include "src/gtest-typed-test.cc"
diff --git a/contrib/gtest-1.7.0/src/gtest-death-test.cc b/contrib/gtest-1.7.0/src/gtest-death-test.cc
new file mode 100644
index 0000000..a6023fc
--- /dev/null
+++ b/contrib/gtest-1.7.0/src/gtest-death-test.cc
@@ -0,0 +1,1344 @@
+// Copyright 2005, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan), vladl at google.com (Vlad Losev)
+//
+// This file implements death tests.
+
+#include "gtest/gtest-death-test.h"
+#include "gtest/internal/gtest-port.h"
+
+#if GTEST_HAS_DEATH_TEST
+
+# if GTEST_OS_MAC
+#  include <crt_externs.h>
+# endif  // GTEST_OS_MAC
+
+# include <errno.h>
+# include <fcntl.h>
+# include <limits.h>
+
+# if GTEST_OS_LINUX
+#  include <signal.h>
+# endif  // GTEST_OS_LINUX
+
+# include <stdarg.h>
+
+# if GTEST_OS_WINDOWS
+#  include <windows.h>
+# else
+#  include <sys/mman.h>
+#  include <sys/wait.h>
+# endif  // GTEST_OS_WINDOWS
+
+# if GTEST_OS_QNX
+#  include <spawn.h>
+# endif  // GTEST_OS_QNX
+
+#endif  // GTEST_HAS_DEATH_TEST
+
+#include "gtest/gtest-message.h"
+#include "gtest/internal/gtest-string.h"
+
+// Indicates that this translation unit is part of Google Test's
+// implementation.  It must come before gtest-internal-inl.h is
+// included, or there will be a compiler error.  This trick is to
+// prevent a user from accidentally including gtest-internal-inl.h in
+// his code.
+#define GTEST_IMPLEMENTATION_ 1
+#include "src/gtest-internal-inl.h"
+#undef GTEST_IMPLEMENTATION_
+
+namespace testing {
+
+// Constants.
+
+// The default death test style.
+static const char kDefaultDeathTestStyle[] = "fast";
+
+GTEST_DEFINE_string_(
+    death_test_style,
+    internal::StringFromGTestEnv("death_test_style", kDefaultDeathTestStyle),
+    "Indicates how to run a death test in a forked child process: "
+    "\"threadsafe\" (child process re-executes the test binary "
+    "from the beginning, running only the specific death test) or "
+    "\"fast\" (child process runs the death test immediately "
+    "after forking).");
+
+GTEST_DEFINE_bool_(
+    death_test_use_fork,
+    internal::BoolFromGTestEnv("death_test_use_fork", false),
+    "Instructs to use fork()/_exit() instead of clone() in death tests. "
+    "Ignored and always uses fork() on POSIX systems where clone() is not "
+    "implemented. Useful when running under valgrind or similar tools if "
+    "those do not support clone(). Valgrind 3.3.1 will just fail if "
+    "it sees an unsupported combination of clone() flags. "
+    "It is not recommended to use this flag w/o valgrind though it will "
+    "work in 99% of the cases. Once valgrind is fixed, this flag will "
+    "most likely be removed.");
+
+namespace internal {
+GTEST_DEFINE_string_(
+    internal_run_death_test, "",
+    "Indicates the file, line number, temporal index of "
+    "the single death test to run, and a file descriptor to "
+    "which a success code may be sent, all separated by "
+    "the '|' characters.  This flag is specified if and only if the current "
+    "process is a sub-process launched for running a thread-safe "
+    "death test.  FOR INTERNAL USE ONLY.");
+}  // namespace internal
+
+#if GTEST_HAS_DEATH_TEST
+
+namespace internal {
+
+// Valid only for fast death tests. Indicates the code is running in the
+// child process of a fast style death test.
+static bool g_in_fast_death_test_child = false;
+
+// Returns a Boolean value indicating whether the caller is currently
+// executing in the context of the death test child process.  Tools such as
+// Valgrind heap checkers may need this to modify their behavior in death
+// tests.  IMPORTANT: This is an internal utility.  Using it may break the
+// implementation of death tests.  User code MUST NOT use it.
+bool InDeathTestChild() {
+# if GTEST_OS_WINDOWS
+
+  // On Windows, death tests are thread-safe regardless of the value of the
+  // death_test_style flag.
+  return !GTEST_FLAG(internal_run_death_test).empty();
+
+# else
+
+  if (GTEST_FLAG(death_test_style) == "threadsafe")
+    return !GTEST_FLAG(internal_run_death_test).empty();
+  else
+    return g_in_fast_death_test_child;
+#endif
+}
+
+}  // namespace internal
+
+// ExitedWithCode constructor.
+ExitedWithCode::ExitedWithCode(int exit_code) : exit_code_(exit_code) {
+}
+
+// ExitedWithCode function-call operator.
+bool ExitedWithCode::operator()(int exit_status) const {
+# if GTEST_OS_WINDOWS
+
+  return exit_status == exit_code_;
+
+# else
+
+  return WIFEXITED(exit_status) && WEXITSTATUS(exit_status) == exit_code_;
+
+# endif  // GTEST_OS_WINDOWS
+}
+
+# if !GTEST_OS_WINDOWS
+// KilledBySignal constructor.
+KilledBySignal::KilledBySignal(int signum) : signum_(signum) {
+}
+
+// KilledBySignal function-call operator.
+bool KilledBySignal::operator()(int exit_status) const {
+  return WIFSIGNALED(exit_status) && WTERMSIG(exit_status) == signum_;
+}
+# endif  // !GTEST_OS_WINDOWS
+
+namespace internal {
+
+// Utilities needed for death tests.
+
+// Generates a textual description of a given exit code, in the format
+// specified by wait(2).
+static std::string ExitSummary(int exit_code) {
+  Message m;
+
+# if GTEST_OS_WINDOWS
+
+  m << "Exited with exit status " << exit_code;
+
+# else
+
+  if (WIFEXITED(exit_code)) {
+    m << "Exited with exit status " << WEXITSTATUS(exit_code);
+  } else if (WIFSIGNALED(exit_code)) {
+    m << "Terminated by signal " << WTERMSIG(exit_code);
+  }
+#  ifdef WCOREDUMP
+  if (WCOREDUMP(exit_code)) {
+    m << " (core dumped)";
+  }
+#  endif
+# endif  // GTEST_OS_WINDOWS
+
+  return m.GetString();
+}
+
+// Returns true if exit_status describes a process that was terminated
+// by a signal, or exited normally with a nonzero exit code.
+bool ExitedUnsuccessfully(int exit_status) {
+  return !ExitedWithCode(0)(exit_status);
+}
+
+# if !GTEST_OS_WINDOWS
+// Generates a textual failure message when a death test finds more than
+// one thread running, or cannot determine the number of threads, prior
+// to executing the given statement.  It is the responsibility of the
+// caller not to pass a thread_count of 1.
+static std::string DeathTestThreadWarning(size_t thread_count) {
+  Message msg;
+  msg << "Death tests use fork(), which is unsafe particularly"
+      << " in a threaded context. For this test, " << GTEST_NAME_ << " ";
+  if (thread_count == 0)
+    msg << "couldn't detect the number of threads.";
+  else
+    msg << "detected " << thread_count << " threads.";
+  return msg.GetString();
+}
+# endif  // !GTEST_OS_WINDOWS
+
+// Flag characters for reporting a death test that did not die.
+static const char kDeathTestLived = 'L';
+static const char kDeathTestReturned = 'R';
+static const char kDeathTestThrew = 'T';
+static const char kDeathTestInternalError = 'I';
+
+// An enumeration describing all of the possible ways that a death test can
+// conclude.  DIED means that the process died while executing the test
+// code; LIVED means that process lived beyond the end of the test code;
+// RETURNED means that the test statement attempted to execute a return
+// statement, which is not allowed; THREW means that the test statement
+// returned control by throwing an exception.  IN_PROGRESS means the test
+// has not yet concluded.
+// TODO(vladl at google.com): Unify names and possibly values for
+// AbortReason, DeathTestOutcome, and flag characters above.
+enum DeathTestOutcome { IN_PROGRESS, DIED, LIVED, RETURNED, THREW };
+
+// Routine for aborting the program which is safe to call from an
+// exec-style death test child process, in which case the error
+// message is propagated back to the parent process.  Otherwise, the
+// message is simply printed to stderr.  In either case, the program
+// then exits with status 1.
+void DeathTestAbort(const std::string& message) {
+  // On a POSIX system, this function may be called from a threadsafe-style
+  // death test child process, which operates on a very small stack.  Use
+  // the heap for any additional non-minuscule memory requirements.
+  const InternalRunDeathTestFlag* const flag =
+      GetUnitTestImpl()->internal_run_death_test_flag();
+  if (flag != NULL) {
+    FILE* parent = posix::FDOpen(flag->write_fd(), "w");
+    fputc(kDeathTestInternalError, parent);
+    fprintf(parent, "%s", message.c_str());
+    fflush(parent);
+    _exit(1);
+  } else {
+    fprintf(stderr, "%s", message.c_str());
+    fflush(stderr);
+    posix::Abort();
+  }
+}
+
+// A replacement for CHECK that calls DeathTestAbort if the assertion
+// fails.
+# define GTEST_DEATH_TEST_CHECK_(expression) \
+  do { \
+    if (!::testing::internal::IsTrue(expression)) { \
+      DeathTestAbort( \
+          ::std::string("CHECK failed: File ") + __FILE__ +  ", line " \
+          + ::testing::internal::StreamableToString(__LINE__) + ": " \
+          + #expression); \
+    } \
+  } while (::testing::internal::AlwaysFalse())
+
+// This macro is similar to GTEST_DEATH_TEST_CHECK_, but it is meant for
+// evaluating any system call that fulfills two conditions: it must return
+// -1 on failure, and set errno to EINTR when it is interrupted and
+// should be tried again.  The macro expands to a loop that repeatedly
+// evaluates the expression as long as it evaluates to -1 and sets
+// errno to EINTR.  If the expression evaluates to -1 but errno is
+// something other than EINTR, DeathTestAbort is called.
+# define GTEST_DEATH_TEST_CHECK_SYSCALL_(expression) \
+  do { \
+    int gtest_retval; \
+    do { \
+      gtest_retval = (expression); \
+    } while (gtest_retval == -1 && errno == EINTR); \
+    if (gtest_retval == -1) { \
+      DeathTestAbort( \
+          ::std::string("CHECK failed: File ") + __FILE__ + ", line " \
+          + ::testing::internal::StreamableToString(__LINE__) + ": " \
+          + #expression + " != -1"); \
+    } \
+  } while (::testing::internal::AlwaysFalse())
+
+// Returns the message describing the last system error in errno.
+std::string GetLastErrnoDescription() {
+    return errno == 0 ? "" : posix::StrError(errno);
+}
+
+// This is called from a death test parent process to read a failure
+// message from the death test child process and log it with the FATAL
+// severity. On Windows, the message is read from a pipe handle. On other
+// platforms, it is read from a file descriptor.
+static void FailFromInternalError(int fd) {
+  Message error;
+  char buffer[256];
+  int num_read;
+
+  do {
+    while ((num_read = posix::Read(fd, buffer, 255)) > 0) {
+      buffer[num_read] = '\0';
+      error << buffer;
+    }
+  } while (num_read == -1 && errno == EINTR);
+
+  if (num_read == 0) {
+    GTEST_LOG_(FATAL) << error.GetString();
+  } else {
+    const int last_error = errno;
+    GTEST_LOG_(FATAL) << "Error while reading death test internal: "
+                      << GetLastErrnoDescription() << " [" << last_error << "]";
+  }
+}
+
+// Death test constructor.  Increments the running death test count
+// for the current test.
+DeathTest::DeathTest() {
+  TestInfo* const info = GetUnitTestImpl()->current_test_info();
+  if (info == NULL) {
+    DeathTestAbort("Cannot run a death test outside of a TEST or "
+                   "TEST_F construct");
+  }
+}
+
+// Creates and returns a death test by dispatching to the current
+// death test factory.
+bool DeathTest::Create(const char* statement, const RE* regex,
+                       const char* file, int line, DeathTest** test) {
+  return GetUnitTestImpl()->death_test_factory()->Create(
+      statement, regex, file, line, test);
+}
+
+const char* DeathTest::LastMessage() {
+  return last_death_test_message_.c_str();
+}
+
+void DeathTest::set_last_death_test_message(const std::string& message) {
+  last_death_test_message_ = message;
+}
+
+std::string DeathTest::last_death_test_message_;
+
+// Provides cross platform implementation for some death functionality.
+class DeathTestImpl : public DeathTest {
+ protected:
+  DeathTestImpl(const char* a_statement, const RE* a_regex)
+      : statement_(a_statement),
+        regex_(a_regex),
+        spawned_(false),
+        status_(-1),
+        outcome_(IN_PROGRESS),
+        read_fd_(-1),
+        write_fd_(-1) {}
+
+  // read_fd_ is expected to be closed and cleared by a derived class.
+  ~DeathTestImpl() { GTEST_DEATH_TEST_CHECK_(read_fd_ == -1); }
+
+  void Abort(AbortReason reason);
+  virtual bool Passed(bool status_ok);
+
+  const char* statement() const { return statement_; }
+  const RE* regex() const { return regex_; }
+  bool spawned() const { return spawned_; }
+  void set_spawned(bool is_spawned) { spawned_ = is_spawned; }
+  int status() const { return status_; }
+  void set_status(int a_status) { status_ = a_status; }
+  DeathTestOutcome outcome() const { return outcome_; }
+  void set_outcome(DeathTestOutcome an_outcome) { outcome_ = an_outcome; }
+  int read_fd() const { return read_fd_; }
+  void set_read_fd(int fd) { read_fd_ = fd; }
+  int write_fd() const { return write_fd_; }
+  void set_write_fd(int fd) { write_fd_ = fd; }
+
+  // Called in the parent process only. Reads the result code of the death
+  // test child process via a pipe, interprets it to set the outcome_
+  // member, and closes read_fd_.  Outputs diagnostics and terminates in
+  // case of unexpected codes.
+  void ReadAndInterpretStatusByte();
+
+ private:
+  // The textual content of the code this object is testing.  This class
+  // doesn't own this string and should not attempt to delete it.
+  const char* const statement_;
+  // The regular expression which test output must match.  DeathTestImpl
+  // doesn't own this object and should not attempt to delete it.
+  const RE* const regex_;
+  // True if the death test child process has been successfully spawned.
+  bool spawned_;
+  // The exit status of the child process.
+  int status_;
+  // How the death test concluded.
+  DeathTestOutcome outcome_;
+  // Descriptor to the read end of the pipe to the child process.  It is
+  // always -1 in the child process.  The child keeps its write end of the
+  // pipe in write_fd_.
+  int read_fd_;
+  // Descriptor to the child's write end of the pipe to the parent process.
+  // It is always -1 in the parent process.  The parent keeps its end of the
+  // pipe in read_fd_.
+  int write_fd_;
+};
+
+// Called in the parent process only. Reads the result code of the death
+// test child process via a pipe, interprets it to set the outcome_
+// member, and closes read_fd_.  Outputs diagnostics and terminates in
+// case of unexpected codes.
+void DeathTestImpl::ReadAndInterpretStatusByte() {
+  char flag;
+  int bytes_read;
+
+  // The read() here blocks until data is available (signifying the
+  // failure of the death test) or until the pipe is closed (signifying
+  // its success), so it's okay to call this in the parent before
+  // the child process has exited.
+  do {
+    bytes_read = posix::Read(read_fd(), &flag, 1);
+  } while (bytes_read == -1 && errno == EINTR);
+
+  if (bytes_read == 0) {
+    set_outcome(DIED);
+  } else if (bytes_read == 1) {
+    switch (flag) {
+      case kDeathTestReturned:
+        set_outcome(RETURNED);
+        break;
+      case kDeathTestThrew:
+        set_outcome(THREW);
+        break;
+      case kDeathTestLived:
+        set_outcome(LIVED);
+        break;
+      case kDeathTestInternalError:
+        FailFromInternalError(read_fd());  // Does not return.
+        break;
+      default:
+        GTEST_LOG_(FATAL) << "Death test child process reported "
+                          << "unexpected status byte ("
+                          << static_cast<unsigned int>(flag) << ")";
+    }
+  } else {
+    GTEST_LOG_(FATAL) << "Read from death test child process failed: "
+                      << GetLastErrnoDescription();
+  }
+  GTEST_DEATH_TEST_CHECK_SYSCALL_(posix::Close(read_fd()));
+  set_read_fd(-1);
+}
+
+// Signals that the death test code which should have exited, didn't.
+// Should be called only in a death test child process.
+// Writes a status byte to the child's status file descriptor, then
+// calls _exit(1).
+void DeathTestImpl::Abort(AbortReason reason) {
+  // The parent process considers the death test to be a failure if
+  // it finds any data in our pipe.  So, here we write a single flag byte
+  // to the pipe, then exit.
+  const char status_ch =
+      reason == TEST_DID_NOT_DIE ? kDeathTestLived :
+      reason == TEST_THREW_EXCEPTION ? kDeathTestThrew : kDeathTestReturned;
+
+  GTEST_DEATH_TEST_CHECK_SYSCALL_(posix::Write(write_fd(), &status_ch, 1));
+  // We are leaking the descriptor here because on some platforms (i.e.,
+  // when built as Windows DLL), destructors of global objects will still
+  // run after calling _exit(). On such systems, write_fd_ will be
+  // indirectly closed from the destructor of UnitTestImpl, causing double
+  // close if it is also closed here. On debug configurations, double close
+  // may assert. As there are no in-process buffers to flush here, we are
+  // relying on the OS to close the descriptor after the process terminates
+  // when the destructors are not run.
+  _exit(1);  // Exits w/o any normal exit hooks (we were supposed to crash)
+}
+
+// Returns an indented copy of stderr output for a death test.
+// This makes distinguishing death test output lines from regular log lines
+// much easier.
+static ::std::string FormatDeathTestOutput(const ::std::string& output) {
+  ::std::string ret;
+  for (size_t at = 0; ; ) {
+    const size_t line_end = output.find('\n', at);
+    ret += "[  DEATH   ] ";
+    if (line_end == ::std::string::npos) {
+      ret += output.substr(at);
+      break;
+    }
+    ret += output.substr(at, line_end + 1 - at);
+    at = line_end + 1;
+  }
+  return ret;
+}
+
+// Assesses the success or failure of a death test, using both private
+// members which have previously been set, and one argument:
+//
+// Private data members:
+//   outcome:  An enumeration describing how the death test
+//             concluded: DIED, LIVED, THREW, or RETURNED.  The death test
+//             fails in the latter three cases.
+//   status:   The exit status of the child process. On *nix, it is in the
+//             in the format specified by wait(2). On Windows, this is the
+//             value supplied to the ExitProcess() API or a numeric code
+//             of the exception that terminated the program.
+//   regex:    A regular expression object to be applied to
+//             the test's captured standard error output; the death test
+//             fails if it does not match.
+//
+// Argument:
+//   status_ok: true if exit_status is acceptable in the context of
+//              this particular death test, which fails if it is false
+//
+// Returns true iff all of the above conditions are met.  Otherwise, the
+// first failing condition, in the order given above, is the one that is
+// reported. Also sets the last death test message string.
+bool DeathTestImpl::Passed(bool status_ok) {
+  if (!spawned())
+    return false;
+
+  const std::string error_message = GetCapturedStderr();
+
+  bool success = false;
+  Message buffer;
+
+  buffer << "Death test: " << statement() << "\n";
+  switch (outcome()) {
+    case LIVED:
+      buffer << "    Result: failed to die.\n"
+             << " Error msg:\n" << FormatDeathTestOutput(error_message);
+      break;
+    case THREW:
+      buffer << "    Result: threw an exception.\n"
+             << " Error msg:\n" << FormatDeathTestOutput(error_message);
+      break;
+    case RETURNED:
+      buffer << "    Result: illegal return in test statement.\n"
+             << " Error msg:\n" << FormatDeathTestOutput(error_message);
+      break;
+    case DIED:
+      if (status_ok) {
+        const bool matched = RE::PartialMatch(error_message.c_str(), *regex());
+        if (matched) {
+          success = true;
+        } else {
+          buffer << "    Result: died but not with expected error.\n"
+                 << "  Expected: " << regex()->pattern() << "\n"
+                 << "Actual msg:\n" << FormatDeathTestOutput(error_message);
+        }
+      } else {
+        buffer << "    Result: died but not with expected exit code:\n"
+               << "            " << ExitSummary(status()) << "\n"
+               << "Actual msg:\n" << FormatDeathTestOutput(error_message);
+      }
+      break;
+    case IN_PROGRESS:
+    default:
+      GTEST_LOG_(FATAL)
+          << "DeathTest::Passed somehow called before conclusion of test";
+  }
+
+  DeathTest::set_last_death_test_message(buffer.GetString());
+  return success;
+}
+
+# if GTEST_OS_WINDOWS
+// WindowsDeathTest implements death tests on Windows. Due to the
+// specifics of starting new processes on Windows, death tests there are
+// always threadsafe, and Google Test considers the
+// --gtest_death_test_style=fast setting to be equivalent to
+// --gtest_death_test_style=threadsafe there.
+//
+// A few implementation notes:  Like the Linux version, the Windows
+// implementation uses pipes for child-to-parent communication. But due to
+// the specifics of pipes on Windows, some extra steps are required:
+//
+// 1. The parent creates a communication pipe and stores handles to both
+//    ends of it.
+// 2. The parent starts the child and provides it with the information
+//    necessary to acquire the handle to the write end of the pipe.
+// 3. The child acquires the write end of the pipe and signals the parent
+//    using a Windows event.
+// 4. Now the parent can release the write end of the pipe on its side. If
+//    this is done before step 3, the object's reference count goes down to
+//    0 and it is destroyed, preventing the child from acquiring it. The
+//    parent now has to release it, or read operations on the read end of
+//    the pipe will not return when the child terminates.
+// 5. The parent reads child's output through the pipe (outcome code and
+//    any possible error messages) from the pipe, and its stderr and then
+//    determines whether to fail the test.
+//
+// Note: to distinguish Win32 API calls from the local method and function
+// calls, the former are explicitly resolved in the global namespace.
+//
+class WindowsDeathTest : public DeathTestImpl {
+ public:
+  WindowsDeathTest(const char* a_statement,
+                   const RE* a_regex,
+                   const char* file,
+                   int line)
+      : DeathTestImpl(a_statement, a_regex), file_(file), line_(line) {}
+
+  // All of these virtual functions are inherited from DeathTest.
+  virtual int Wait();
+  virtual TestRole AssumeRole();
+
+ private:
+  // The name of the file in which the death test is located.
+  const char* const file_;
+  // The line number on which the death test is located.
+  const int line_;
+  // Handle to the write end of the pipe to the child process.
+  AutoHandle write_handle_;
+  // Child process handle.
+  AutoHandle child_handle_;
+  // Event the child process uses to signal the parent that it has
+  // acquired the handle to the write end of the pipe. After seeing this
+  // event the parent can release its own handles to make sure its
+  // ReadFile() calls return when the child terminates.
+  AutoHandle event_handle_;
+};
+
+// Waits for the child in a death test to exit, returning its exit
+// status, or 0 if no child process exists.  As a side effect, sets the
+// outcome data member.
+int WindowsDeathTest::Wait() {
+  if (!spawned())
+    return 0;
+
+  // Wait until the child either signals that it has acquired the write end
+  // of the pipe or it dies.
+  const HANDLE wait_handles[2] = { child_handle_.Get(), event_handle_.Get() };
+  switch (::WaitForMultipleObjects(2,
+                                   wait_handles,
+                                   FALSE,  // Waits for any of the handles.
+                                   INFINITE)) {
+    case WAIT_OBJECT_0:
+    case WAIT_OBJECT_0 + 1:
+      break;
+    default:
+      GTEST_DEATH_TEST_CHECK_(false);  // Should not get here.
+  }
+
+  // The child has acquired the write end of the pipe or exited.
+  // We release the handle on our side and continue.
+  write_handle_.Reset();
+  event_handle_.Reset();
+
+  ReadAndInterpretStatusByte();
+
+  // Waits for the child process to exit if it haven't already. This
+  // returns immediately if the child has already exited, regardless of
+  // whether previous calls to WaitForMultipleObjects synchronized on this
+  // handle or not.
+  GTEST_DEATH_TEST_CHECK_(
+      WAIT_OBJECT_0 == ::WaitForSingleObject(child_handle_.Get(),
+                                             INFINITE));
+  DWORD status_code;
+  GTEST_DEATH_TEST_CHECK_(
+      ::GetExitCodeProcess(child_handle_.Get(), &status_code) != FALSE);
+  child_handle_.Reset();
+  set_status(static_cast<int>(status_code));
+  return status();
+}
+
+// The AssumeRole process for a Windows death test.  It creates a child
+// process with the same executable as the current process to run the
+// death test.  The child process is given the --gtest_filter and
+// --gtest_internal_run_death_test flags such that it knows to run the
+// current death test only.
+DeathTest::TestRole WindowsDeathTest::AssumeRole() {
+  const UnitTestImpl* const impl = GetUnitTestImpl();
+  const InternalRunDeathTestFlag* const flag =
+      impl->internal_run_death_test_flag();
+  const TestInfo* const info = impl->current_test_info();
+  const int death_test_index = info->result()->death_test_count();
+
+  if (flag != NULL) {
+    // ParseInternalRunDeathTestFlag() has performed all the necessary
+    // processing.
+    set_write_fd(flag->write_fd());
+    return EXECUTE_TEST;
+  }
+
+  // WindowsDeathTest uses an anonymous pipe to communicate results of
+  // a death test.
+  SECURITY_ATTRIBUTES handles_are_inheritable = {
+    sizeof(SECURITY_ATTRIBUTES), NULL, TRUE };
+  HANDLE read_handle, write_handle;
+  GTEST_DEATH_TEST_CHECK_(
+      ::CreatePipe(&read_handle, &write_handle, &handles_are_inheritable,
+                   0)  // Default buffer size.
+      != FALSE);
+  set_read_fd(::_open_osfhandle(reinterpret_cast<intptr_t>(read_handle),
+                                O_RDONLY));
+  write_handle_.Reset(write_handle);
+  event_handle_.Reset(::CreateEvent(
+      &handles_are_inheritable,
+      TRUE,    // The event will automatically reset to non-signaled state.
+      FALSE,   // The initial state is non-signalled.
+      NULL));  // The even is unnamed.
+  GTEST_DEATH_TEST_CHECK_(event_handle_.Get() != NULL);
+  const std::string filter_flag =
+      std::string("--") + GTEST_FLAG_PREFIX_ + kFilterFlag + "=" +
+      info->test_case_name() + "." + info->name();
+  const std::string internal_flag =
+      std::string("--") + GTEST_FLAG_PREFIX_ + kInternalRunDeathTestFlag +
+      "=" + file_ + "|" + StreamableToString(line_) + "|" +
+      StreamableToString(death_test_index) + "|" +
+      StreamableToString(static_cast<unsigned int>(::GetCurrentProcessId())) +
+      // size_t has the same width as pointers on both 32-bit and 64-bit
+      // Windows platforms.
+      // See http://msdn.microsoft.com/en-us/library/tcxf1dw6.aspx.
+      "|" + StreamableToString(reinterpret_cast<size_t>(write_handle)) +
+      "|" + StreamableToString(reinterpret_cast<size_t>(event_handle_.Get()));
+
+  char executable_path[_MAX_PATH + 1];  // NOLINT
+  GTEST_DEATH_TEST_CHECK_(
+      _MAX_PATH + 1 != ::GetModuleFileNameA(NULL,
+                                            executable_path,
+                                            _MAX_PATH));
+
+  std::string command_line =
+      std::string(::GetCommandLineA()) + " " + filter_flag + " \"" +
+      internal_flag + "\"";
+
+  DeathTest::set_last_death_test_message("");
+
+  CaptureStderr();
+  // Flush the log buffers since the log streams are shared with the child.
+  FlushInfoLog();
+
+  // The child process will share the standard handles with the parent.
+  STARTUPINFOA startup_info;
+  memset(&startup_info, 0, sizeof(STARTUPINFO));
+  startup_info.dwFlags = STARTF_USESTDHANDLES;
+  startup_info.hStdInput = ::GetStdHandle(STD_INPUT_HANDLE);
+  startup_info.hStdOutput = ::GetStdHandle(STD_OUTPUT_HANDLE);
+  startup_info.hStdError = ::GetStdHandle(STD_ERROR_HANDLE);
+
+  PROCESS_INFORMATION process_info;
+  GTEST_DEATH_TEST_CHECK_(::CreateProcessA(
+      executable_path,
+      const_cast<char*>(command_line.c_str()),
+      NULL,   // Retuned process handle is not inheritable.
+      NULL,   // Retuned thread handle is not inheritable.
+      TRUE,   // Child inherits all inheritable handles (for write_handle_).
+      0x0,    // Default creation flags.
+      NULL,   // Inherit the parent's environment.
+      UnitTest::GetInstance()->original_working_dir(),
+      &startup_info,
+      &process_info) != FALSE);
+  child_handle_.Reset(process_info.hProcess);
+  ::CloseHandle(process_info.hThread);
+  set_spawned(true);
+  return OVERSEE_TEST;
+}
+# else  // We are not on Windows.
+
+// ForkingDeathTest provides implementations for most of the abstract
+// methods of the DeathTest interface.  Only the AssumeRole method is
+// left undefined.
+class ForkingDeathTest : public DeathTestImpl {
+ public:
+  ForkingDeathTest(const char* statement, const RE* regex);
+
+  // All of these virtual functions are inherited from DeathTest.
+  virtual int Wait();
+
+ protected:
+  void set_child_pid(pid_t child_pid) { child_pid_ = child_pid; }
+
+ private:
+  // PID of child process during death test; 0 in the child process itself.
+  pid_t child_pid_;
+};
+
+// Constructs a ForkingDeathTest.
+ForkingDeathTest::ForkingDeathTest(const char* a_statement, const RE* a_regex)
+    : DeathTestImpl(a_statement, a_regex),
+      child_pid_(-1) {}
+
+// Waits for the child in a death test to exit, returning its exit
+// status, or 0 if no child process exists.  As a side effect, sets the
+// outcome data member.
+int ForkingDeathTest::Wait() {
+  if (!spawned())
+    return 0;
+
+  ReadAndInterpretStatusByte();
+
+  int status_value;
+  GTEST_DEATH_TEST_CHECK_SYSCALL_(waitpid(child_pid_, &status_value, 0));
+  set_status(status_value);
+  return status_value;
+}
+
+// A concrete death test class that forks, then immediately runs the test
+// in the child process.
+class NoExecDeathTest : public ForkingDeathTest {
+ public:
+  NoExecDeathTest(const char* a_statement, const RE* a_regex) :
+      ForkingDeathTest(a_statement, a_regex) { }
+  virtual TestRole AssumeRole();
+};
+
+// The AssumeRole process for a fork-and-run death test.  It implements a
+// straightforward fork, with a simple pipe to transmit the status byte.
+DeathTest::TestRole NoExecDeathTest::AssumeRole() {
+  const size_t thread_count = GetThreadCount();
+  if (thread_count != 1) {
+    GTEST_LOG_(WARNING) << DeathTestThreadWarning(thread_count);
+  }
+
+  int pipe_fd[2];
+  GTEST_DEATH_TEST_CHECK_(pipe(pipe_fd) != -1);
+
+  DeathTest::set_last_death_test_message("");
+  CaptureStderr();
+  // When we fork the process below, the log file buffers are copied, but the
+  // file descriptors are shared.  We flush all log files here so that closing
+  // the file descriptors in the child process doesn't throw off the
+  // synchronization between descriptors and buffers in the parent process.
+  // This is as close to the fork as possible to avoid a race condition in case
+  // there are multiple threads running before the death test, and another
+  // thread writes to the log file.
+  FlushInfoLog();
+
+  const pid_t child_pid = fork();
+  GTEST_DEATH_TEST_CHECK_(child_pid != -1);
+  set_child_pid(child_pid);
+  if (child_pid == 0) {
+    GTEST_DEATH_TEST_CHECK_SYSCALL_(close(pipe_fd[0]));
+    set_write_fd(pipe_fd[1]);
+    // Redirects all logging to stderr in the child process to prevent
+    // concurrent writes to the log files.  We capture stderr in the parent
+    // process and append the child process' output to a log.
+    LogToStderr();
+    // Event forwarding to the listeners of event listener API mush be shut
+    // down in death test subprocesses.
+    GetUnitTestImpl()->listeners()->SuppressEventForwarding();
+    g_in_fast_death_test_child = true;
+    return EXECUTE_TEST;
+  } else {
+    GTEST_DEATH_TEST_CHECK_SYSCALL_(close(pipe_fd[1]));
+    set_read_fd(pipe_fd[0]);
+    set_spawned(true);
+    return OVERSEE_TEST;
+  }
+}
+
+// A concrete death test class that forks and re-executes the main
+// program from the beginning, with command-line flags set that cause
+// only this specific death test to be run.
+class ExecDeathTest : public ForkingDeathTest {
+ public:
+  ExecDeathTest(const char* a_statement, const RE* a_regex,
+                const char* file, int line) :
+      ForkingDeathTest(a_statement, a_regex), file_(file), line_(line) { }
+  virtual TestRole AssumeRole();
+ private:
+  static ::std::vector<testing::internal::string>
+  GetArgvsForDeathTestChildProcess() {
+    ::std::vector<testing::internal::string> args = GetInjectableArgvs();
+    return args;
+  }
+  // The name of the file in which the death test is located.
+  const char* const file_;
+  // The line number on which the death test is located.
+  const int line_;
+};
+
+// Utility class for accumulating command-line arguments.
+class Arguments {
+ public:
+  Arguments() {
+    args_.push_back(NULL);
+  }
+
+  ~Arguments() {
+    for (std::vector<char*>::iterator i = args_.begin(); i != args_.end();
+         ++i) {
+      free(*i);
+    }
+  }
+  void AddArgument(const char* argument) {
+    args_.insert(args_.end() - 1, posix::StrDup(argument));
+  }
+
+  template <typename Str>
+  void AddArguments(const ::std::vector<Str>& arguments) {
+    for (typename ::std::vector<Str>::const_iterator i = arguments.begin();
+         i != arguments.end();
+         ++i) {
+      args_.insert(args_.end() - 1, posix::StrDup(i->c_str()));
+    }
+  }
+  char* const* Argv() {
+    return &args_[0];
+  }
+
+ private:
+  std::vector<char*> args_;
+};
+
+// A struct that encompasses the arguments to the child process of a
+// threadsafe-style death test process.
+struct ExecDeathTestArgs {
+  char* const* argv;  // Command-line arguments for the child's call to exec
+  int close_fd;       // File descriptor to close; the read end of a pipe
+};
+
+#  if GTEST_OS_MAC
+inline char** GetEnviron() {
+  // When Google Test is built as a framework on MacOS X, the environ variable
+  // is unavailable. Apple's documentation (man environ) recommends using
+  // _NSGetEnviron() instead.
+  return *_NSGetEnviron();
+}
+#  else
+// Some POSIX platforms expect you to declare environ. extern "C" makes
+// it reside in the global namespace.
+extern "C" char** environ;
+inline char** GetEnviron() { return environ; }
+#  endif  // GTEST_OS_MAC
+
+#  if !GTEST_OS_QNX
+// The main function for a threadsafe-style death test child process.
+// This function is called in a clone()-ed process and thus must avoid
+// any potentially unsafe operations like malloc or libc functions.
+static int ExecDeathTestChildMain(void* child_arg) {
+  ExecDeathTestArgs* const args = static_cast<ExecDeathTestArgs*>(child_arg);
+  GTEST_DEATH_TEST_CHECK_SYSCALL_(close(args->close_fd));
+
+  // We need to execute the test program in the same environment where
+  // it was originally invoked.  Therefore we change to the original
+  // working directory first.
+  const char* const original_dir =
+      UnitTest::GetInstance()->original_working_dir();
+  // We can safely call chdir() as it's a direct system call.
+  if (chdir(original_dir) != 0) {
+    DeathTestAbort(std::string("chdir(\"") + original_dir + "\") failed: " +
+                   GetLastErrnoDescription());
+    return EXIT_FAILURE;
+  }
+
+  // We can safely call execve() as it's a direct system call.  We
+  // cannot use execvp() as it's a libc function and thus potentially
+  // unsafe.  Since execve() doesn't search the PATH, the user must
+  // invoke the test program via a valid path that contains at least
+  // one path separator.
+  execve(args->argv[0], args->argv, GetEnviron());
+  DeathTestAbort(std::string("execve(") + args->argv[0] + ", ...) in " +
+                 original_dir + " failed: " +
+                 GetLastErrnoDescription());
+  return EXIT_FAILURE;
+}
+#  endif  // !GTEST_OS_QNX
+
+// Two utility routines that together determine the direction the stack
+// grows.
+// This could be accomplished more elegantly by a single recursive
+// function, but we want to guard against the unlikely possibility of
+// a smart compiler optimizing the recursion away.
+//
+// GTEST_NO_INLINE_ is required to prevent GCC 4.6 from inlining
+// StackLowerThanAddress into StackGrowsDown, which then doesn't give
+// correct answer.
+void StackLowerThanAddress(const void* ptr, bool* result) GTEST_NO_INLINE_;
+void StackLowerThanAddress(const void* ptr, bool* result) {
+  int dummy;
+  *result = (&dummy < ptr);
+}
+
+bool StackGrowsDown() {
+  int dummy;
+  bool result;
+  StackLowerThanAddress(&dummy, &result);
+  return result;
+}
+
+// Spawns a child process with the same executable as the current process in
+// a thread-safe manner and instructs it to run the death test.  The
+// implementation uses fork(2) + exec.  On systems where clone(2) is
+// available, it is used instead, being slightly more thread-safe.  On QNX,
+// fork supports only single-threaded environments, so this function uses
+// spawn(2) there instead.  The function dies with an error message if
+// anything goes wrong.
+static pid_t ExecDeathTestSpawnChild(char* const* argv, int close_fd) {
+  ExecDeathTestArgs args = { argv, close_fd };
+  pid_t child_pid = -1;
+
+#  if GTEST_OS_QNX
+  // Obtains the current directory and sets it to be closed in the child
+  // process.
+  const int cwd_fd = open(".", O_RDONLY);
+  GTEST_DEATH_TEST_CHECK_(cwd_fd != -1);
+  GTEST_DEATH_TEST_CHECK_SYSCALL_(fcntl(cwd_fd, F_SETFD, FD_CLOEXEC));
+  // We need to execute the test program in the same environment where
+  // it was originally invoked.  Therefore we change to the original
+  // working directory first.
+  const char* const original_dir =
+      UnitTest::GetInstance()->original_working_dir();
+  // We can safely call chdir() as it's a direct system call.
+  if (chdir(original_dir) != 0) {
+    DeathTestAbort(std::string("chdir(\"") + original_dir + "\") failed: " +
+                   GetLastErrnoDescription());
+    return EXIT_FAILURE;
+  }
+
+  int fd_flags;
+  // Set close_fd to be closed after spawn.
+  GTEST_DEATH_TEST_CHECK_SYSCALL_(fd_flags = fcntl(close_fd, F_GETFD));
+  GTEST_DEATH_TEST_CHECK_SYSCALL_(fcntl(close_fd, F_SETFD,
+                                        fd_flags | FD_CLOEXEC));
+  struct inheritance inherit = {0};
+  // spawn is a system call.
+  child_pid = spawn(args.argv[0], 0, NULL, &inherit, args.argv, GetEnviron());
+  // Restores the current working directory.
+  GTEST_DEATH_TEST_CHECK_(fchdir(cwd_fd) != -1);
+  GTEST_DEATH_TEST_CHECK_SYSCALL_(close(cwd_fd));
+
+#  else   // GTEST_OS_QNX
+#   if GTEST_OS_LINUX
+  // When a SIGPROF signal is received while fork() or clone() are executing,
+  // the process may hang. To avoid this, we ignore SIGPROF here and re-enable
+  // it after the call to fork()/clone() is complete.
+  struct sigaction saved_sigprof_action;
+  struct sigaction ignore_sigprof_action;
+  memset(&ignore_sigprof_action, 0, sizeof(ignore_sigprof_action));
+  sigemptyset(&ignore_sigprof_action.sa_mask);
+  ignore_sigprof_action.sa_handler = SIG_IGN;
+  GTEST_DEATH_TEST_CHECK_SYSCALL_(sigaction(
+      SIGPROF, &ignore_sigprof_action, &saved_sigprof_action));
+#   endif  // GTEST_OS_LINUX
+
+#   if GTEST_HAS_CLONE
+  const bool use_fork = GTEST_FLAG(death_test_use_fork);
+
+  if (!use_fork) {
+    static const bool stack_grows_down = StackGrowsDown();
+    const size_t stack_size = getpagesize();
+    // MMAP_ANONYMOUS is not defined on Mac, so we use MAP_ANON instead.
+    void* const stack = mmap(NULL, stack_size, PROT_READ | PROT_WRITE,
+                             MAP_ANON | MAP_PRIVATE, -1, 0);
+    GTEST_DEATH_TEST_CHECK_(stack != MAP_FAILED);
+
+    // Maximum stack alignment in bytes:  For a downward-growing stack, this
+    // amount is subtracted from size of the stack space to get an address
+    // that is within the stack space and is aligned on all systems we care
+    // about.  As far as I know there is no ABI with stack alignment greater
+    // than 64.  We assume stack and stack_size already have alignment of
+    // kMaxStackAlignment.
+    const size_t kMaxStackAlignment = 64;
+    void* const stack_top =
+        static_cast<char*>(stack) +
+            (stack_grows_down ? stack_size - kMaxStackAlignment : 0);
+    GTEST_DEATH_TEST_CHECK_(stack_size > kMaxStackAlignment &&
+        reinterpret_cast<intptr_t>(stack_top) % kMaxStackAlignment == 0);
+
+    child_pid = clone(&ExecDeathTestChildMain, stack_top, SIGCHLD, &args);
+
+    GTEST_DEATH_TEST_CHECK_(munmap(stack, stack_size) != -1);
+  }
+#   else
+  const bool use_fork = true;
+#   endif  // GTEST_HAS_CLONE
+
+  if (use_fork && (child_pid = fork()) == 0) {
+      ExecDeathTestChildMain(&args);
+      _exit(0);
+  }
+#  endif  // GTEST_OS_QNX
+#  if GTEST_OS_LINUX
+  GTEST_DEATH_TEST_CHECK_SYSCALL_(
+      sigaction(SIGPROF, &saved_sigprof_action, NULL));
+#  endif  // GTEST_OS_LINUX
+
+  GTEST_DEATH_TEST_CHECK_(child_pid != -1);
+  return child_pid;
+}
+
+// The AssumeRole process for a fork-and-exec death test.  It re-executes the
+// main program from the beginning, setting the --gtest_filter
+// and --gtest_internal_run_death_test flags to cause only the current
+// death test to be re-run.
+DeathTest::TestRole ExecDeathTest::AssumeRole() {
+  const UnitTestImpl* const impl = GetUnitTestImpl();
+  const InternalRunDeathTestFlag* const flag =
+      impl->internal_run_death_test_flag();
+  const TestInfo* const info = impl->current_test_info();
+  const int death_test_index = info->result()->death_test_count();
+
+  if (flag != NULL) {
+    set_write_fd(flag->write_fd());
+    return EXECUTE_TEST;
+  }
+
+  int pipe_fd[2];
+  GTEST_DEATH_TEST_CHECK_(pipe(pipe_fd) != -1);
+  // Clear the close-on-exec flag on the write end of the pipe, lest
+  // it be closed when the child process does an exec:
+  GTEST_DEATH_TEST_CHECK_(fcntl(pipe_fd[1], F_SETFD, 0) != -1);
+
+  const std::string filter_flag =
+      std::string("--") + GTEST_FLAG_PREFIX_ + kFilterFlag + "="
+      + info->test_case_name() + "." + info->name();
+  const std::string internal_flag =
+      std::string("--") + GTEST_FLAG_PREFIX_ + kInternalRunDeathTestFlag + "="
+      + file_ + "|" + StreamableToString(line_) + "|"
+      + StreamableToString(death_test_index) + "|"
+      + StreamableToString(pipe_fd[1]);
+  Arguments args;
+  args.AddArguments(GetArgvsForDeathTestChildProcess());
+  args.AddArgument(filter_flag.c_str());
+  args.AddArgument(internal_flag.c_str());
+
+  DeathTest::set_last_death_test_message("");
+
+  CaptureStderr();
+  // See the comment in NoExecDeathTest::AssumeRole for why the next line
+  // is necessary.
+  FlushInfoLog();
+
+  const pid_t child_pid = ExecDeathTestSpawnChild(args.Argv(), pipe_fd[0]);
+  GTEST_DEATH_TEST_CHECK_SYSCALL_(close(pipe_fd[1]));
+  set_child_pid(child_pid);
+  set_read_fd(pipe_fd[0]);
+  set_spawned(true);
+  return OVERSEE_TEST;
+}
+
+# endif  // !GTEST_OS_WINDOWS
+
+// Creates a concrete DeathTest-derived class that depends on the
+// --gtest_death_test_style flag, and sets the pointer pointed to
+// by the "test" argument to its address.  If the test should be
+// skipped, sets that pointer to NULL.  Returns true, unless the
+// flag is set to an invalid value.
+bool DefaultDeathTestFactory::Create(const char* statement, const RE* regex,
+                                     const char* file, int line,
+                                     DeathTest** test) {
+  UnitTestImpl* const impl = GetUnitTestImpl();
+  const InternalRunDeathTestFlag* const flag =
+      impl->internal_run_death_test_flag();
+  const int death_test_index = impl->current_test_info()
+      ->increment_death_test_count();
+
+  if (flag != NULL) {
+    if (death_test_index > flag->index()) {
+      DeathTest::set_last_death_test_message(
+          "Death test count (" + StreamableToString(death_test_index)
+          + ") somehow exceeded expected maximum ("
+          + StreamableToString(flag->index()) + ")");
+      return false;
+    }
+
+    if (!(flag->file() == file && flag->line() == line &&
+          flag->index() == death_test_index)) {
+      *test = NULL;
+      return true;
+    }
+  }
+
+# if GTEST_OS_WINDOWS
+
+  if (GTEST_FLAG(death_test_style) == "threadsafe" ||
+      GTEST_FLAG(death_test_style) == "fast") {
+    *test = new WindowsDeathTest(statement, regex, file, line);
+  }
+
+# else
+
+  if (GTEST_FLAG(death_test_style) == "threadsafe") {
+    *test = new ExecDeathTest(statement, regex, file, line);
+  } else if (GTEST_FLAG(death_test_style) == "fast") {
+    *test = new NoExecDeathTest(statement, regex);
+  }
+
+# endif  // GTEST_OS_WINDOWS
+
+  else {  // NOLINT - this is more readable than unbalanced brackets inside #if.
+    DeathTest::set_last_death_test_message(
+        "Unknown death test style \"" + GTEST_FLAG(death_test_style)
+        + "\" encountered");
+    return false;
+  }
+
+  return true;
+}
+
+// Splits a given string on a given delimiter, populating a given
+// vector with the fields.  GTEST_HAS_DEATH_TEST implies that we have
+// ::std::string, so we can use it here.
+static void SplitString(const ::std::string& str, char delimiter,
+                        ::std::vector< ::std::string>* dest) {
+  ::std::vector< ::std::string> parsed;
+  ::std::string::size_type pos = 0;
+  while (::testing::internal::AlwaysTrue()) {
+    const ::std::string::size_type colon = str.find(delimiter, pos);
+    if (colon == ::std::string::npos) {
+      parsed.push_back(str.substr(pos));
+      break;
+    } else {
+      parsed.push_back(str.substr(pos, colon - pos));
+      pos = colon + 1;
+    }
+  }
+  dest->swap(parsed);
+}
+
+# if GTEST_OS_WINDOWS
+// Recreates the pipe and event handles from the provided parameters,
+// signals the event, and returns a file descriptor wrapped around the pipe
+// handle. This function is called in the child process only.
+int GetStatusFileDescriptor(unsigned int parent_process_id,
+                            size_t write_handle_as_size_t,
+                            size_t event_handle_as_size_t) {
+  AutoHandle parent_process_handle(::OpenProcess(PROCESS_DUP_HANDLE,
+                                                   FALSE,  // Non-inheritable.
+                                                   parent_process_id));
+  if (parent_process_handle.Get() == INVALID_HANDLE_VALUE) {
+    DeathTestAbort("Unable to open parent process " +
+                   StreamableToString(parent_process_id));
+  }
+
+  // TODO(vladl at google.com): Replace the following check with a
+  // compile-time assertion when available.
+  GTEST_CHECK_(sizeof(HANDLE) <= sizeof(size_t));
+
+  const HANDLE write_handle =
+      reinterpret_cast<HANDLE>(write_handle_as_size_t);
+  HANDLE dup_write_handle;
+
+  // The newly initialized handle is accessible only in in the parent
+  // process. To obtain one accessible within the child, we need to use
+  // DuplicateHandle.
+  if (!::DuplicateHandle(parent_process_handle.Get(), write_handle,
+                         ::GetCurrentProcess(), &dup_write_handle,
+                         0x0,    // Requested privileges ignored since
+                                 // DUPLICATE_SAME_ACCESS is used.
+                         FALSE,  // Request non-inheritable handler.
+                         DUPLICATE_SAME_ACCESS)) {
+    DeathTestAbort("Unable to duplicate the pipe handle " +
+                   StreamableToString(write_handle_as_size_t) +
+                   " from the parent process " +
+                   StreamableToString(parent_process_id));
+  }
+
+  const HANDLE event_handle = reinterpret_cast<HANDLE>(event_handle_as_size_t);
+  HANDLE dup_event_handle;
+
+  if (!::DuplicateHandle(parent_process_handle.Get(), event_handle,
+                         ::GetCurrentProcess(), &dup_event_handle,
+                         0x0,
+                         FALSE,
+                         DUPLICATE_SAME_ACCESS)) {
+    DeathTestAbort("Unable to duplicate the event handle " +
+                   StreamableToString(event_handle_as_size_t) +
+                   " from the parent process " +
+                   StreamableToString(parent_process_id));
+  }
+
+  const int write_fd =
+      ::_open_osfhandle(reinterpret_cast<intptr_t>(dup_write_handle), O_APPEND);
+  if (write_fd == -1) {
+    DeathTestAbort("Unable to convert pipe handle " +
+                   StreamableToString(write_handle_as_size_t) +
+                   " to a file descriptor");
+  }
+
+  // Signals the parent that the write end of the pipe has been acquired
+  // so the parent can release its own write end.
+  ::SetEvent(dup_event_handle);
+
+  return write_fd;
+}
+# endif  // GTEST_OS_WINDOWS
+
+// Returns a newly created InternalRunDeathTestFlag object with fields
+// initialized from the GTEST_FLAG(internal_run_death_test) flag if
+// the flag is specified; otherwise returns NULL.
+InternalRunDeathTestFlag* ParseInternalRunDeathTestFlag() {
+  if (GTEST_FLAG(internal_run_death_test) == "") return NULL;
+
+  // GTEST_HAS_DEATH_TEST implies that we have ::std::string, so we
+  // can use it here.
+  int line = -1;
+  int index = -1;
+  ::std::vector< ::std::string> fields;
+  SplitString(GTEST_FLAG(internal_run_death_test).c_str(), '|', &fields);
+  int write_fd = -1;
+
+# if GTEST_OS_WINDOWS
+
+  unsigned int parent_process_id = 0;
+  size_t write_handle_as_size_t = 0;
+  size_t event_handle_as_size_t = 0;
+
+  if (fields.size() != 6
+      || !ParseNaturalNumber(fields[1], &line)
+      || !ParseNaturalNumber(fields[2], &index)
+      || !ParseNaturalNumber(fields[3], &parent_process_id)
+      || !ParseNaturalNumber(fields[4], &write_handle_as_size_t)
+      || !ParseNaturalNumber(fields[5], &event_handle_as_size_t)) {
+    DeathTestAbort("Bad --gtest_internal_run_death_test flag: " +
+                   GTEST_FLAG(internal_run_death_test));
+  }
+  write_fd = GetStatusFileDescriptor(parent_process_id,
+                                     write_handle_as_size_t,
+                                     event_handle_as_size_t);
+# else
+
+  if (fields.size() != 4
+      || !ParseNaturalNumber(fields[1], &line)
+      || !ParseNaturalNumber(fields[2], &index)
+      || !ParseNaturalNumber(fields[3], &write_fd)) {
+    DeathTestAbort("Bad --gtest_internal_run_death_test flag: "
+        + GTEST_FLAG(internal_run_death_test));
+  }
+
+# endif  // GTEST_OS_WINDOWS
+
+  return new InternalRunDeathTestFlag(fields[0], line, index, write_fd);
+}
+
+}  // namespace internal
+
+#endif  // GTEST_HAS_DEATH_TEST
+
+}  // namespace testing
diff --git a/contrib/gtest-1.7.0/src/gtest-filepath.cc b/contrib/gtest-1.7.0/src/gtest-filepath.cc
new file mode 100644
index 0000000..6be58b6
--- /dev/null
+++ b/contrib/gtest-1.7.0/src/gtest-filepath.cc
@@ -0,0 +1,382 @@
+// Copyright 2008, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Authors: keith.ray at gmail.com (Keith Ray)
+
+#include "gtest/gtest-message.h"
+#include "gtest/internal/gtest-filepath.h"
+#include "gtest/internal/gtest-port.h"
+
+#include <stdlib.h>
+
+#if GTEST_OS_WINDOWS_MOBILE
+# include <windows.h>
+#elif GTEST_OS_WINDOWS
+# include <direct.h>
+# include <io.h>
+#elif GTEST_OS_SYMBIAN
+// Symbian OpenC has PATH_MAX in sys/syslimits.h
+# include <sys/syslimits.h>
+#else
+# include <limits.h>
+# include <climits>  // Some Linux distributions define PATH_MAX here.
+#endif  // GTEST_OS_WINDOWS_MOBILE
+
+#if GTEST_OS_WINDOWS
+# define GTEST_PATH_MAX_ _MAX_PATH
+#elif defined(PATH_MAX)
+# define GTEST_PATH_MAX_ PATH_MAX
+#elif defined(_XOPEN_PATH_MAX)
+# define GTEST_PATH_MAX_ _XOPEN_PATH_MAX
+#else
+# define GTEST_PATH_MAX_ _POSIX_PATH_MAX
+#endif  // GTEST_OS_WINDOWS
+
+#include "gtest/internal/gtest-string.h"
+
+namespace testing {
+namespace internal {
+
+#if GTEST_OS_WINDOWS
+// On Windows, '\\' is the standard path separator, but many tools and the
+// Windows API also accept '/' as an alternate path separator. Unless otherwise
+// noted, a file path can contain either kind of path separators, or a mixture
+// of them.
+const char kPathSeparator = '\\';
+const char kAlternatePathSeparator = '/';
+const char kPathSeparatorString[] = "\\";
+const char kAlternatePathSeparatorString[] = "/";
+# if GTEST_OS_WINDOWS_MOBILE
+// Windows CE doesn't have a current directory. You should not use
+// the current directory in tests on Windows CE, but this at least
+// provides a reasonable fallback.
+const char kCurrentDirectoryString[] = "\\";
+// Windows CE doesn't define INVALID_FILE_ATTRIBUTES
+const DWORD kInvalidFileAttributes = 0xffffffff;
+# else
+const char kCurrentDirectoryString[] = ".\\";
+# endif  // GTEST_OS_WINDOWS_MOBILE
+#else
+const char kPathSeparator = '/';
+const char kPathSeparatorString[] = "/";
+const char kCurrentDirectoryString[] = "./";
+#endif  // GTEST_OS_WINDOWS
+
+// Returns whether the given character is a valid path separator.
+static bool IsPathSeparator(char c) {
+#if GTEST_HAS_ALT_PATH_SEP_
+  return (c == kPathSeparator) || (c == kAlternatePathSeparator);
+#else
+  return c == kPathSeparator;
+#endif
+}
+
+// Returns the current working directory, or "" if unsuccessful.
+FilePath FilePath::GetCurrentDir() {
+#if GTEST_OS_WINDOWS_MOBILE
+  // Windows CE doesn't have a current directory, so we just return
+  // something reasonable.
+  return FilePath(kCurrentDirectoryString);
+#elif GTEST_OS_WINDOWS
+  char cwd[GTEST_PATH_MAX_ + 1] = { '\0' };
+  return FilePath(_getcwd(cwd, sizeof(cwd)) == NULL ? "" : cwd);
+#else
+  char cwd[GTEST_PATH_MAX_ + 1] = { '\0' };
+  return FilePath(getcwd(cwd, sizeof(cwd)) == NULL ? "" : cwd);
+#endif  // GTEST_OS_WINDOWS_MOBILE
+}
+
+// Returns a copy of the FilePath with the case-insensitive extension removed.
+// Example: FilePath("dir/file.exe").RemoveExtension("EXE") returns
+// FilePath("dir/file"). If a case-insensitive extension is not
+// found, returns a copy of the original FilePath.
+FilePath FilePath::RemoveExtension(const char* extension) const {
+  const std::string dot_extension = std::string(".") + extension;
+  if (String::EndsWithCaseInsensitive(pathname_, dot_extension)) {
+    return FilePath(pathname_.substr(
+        0, pathname_.length() - dot_extension.length()));
+  }
+  return *this;
+}
+
+// Returns a pointer to the last occurence of a valid path separator in
+// the FilePath. On Windows, for example, both '/' and '\' are valid path
+// separators. Returns NULL if no path separator was found.
+const char* FilePath::FindLastPathSeparator() const {
+  const char* const last_sep = strrchr(c_str(), kPathSeparator);
+#if GTEST_HAS_ALT_PATH_SEP_
+  const char* const last_alt_sep = strrchr(c_str(), kAlternatePathSeparator);
+  // Comparing two pointers of which only one is NULL is undefined.
+  if (last_alt_sep != NULL &&
+      (last_sep == NULL || last_alt_sep > last_sep)) {
+    return last_alt_sep;
+  }
+#endif
+  return last_sep;
+}
+
+// Returns a copy of the FilePath with the directory part removed.
+// Example: FilePath("path/to/file").RemoveDirectoryName() returns
+// FilePath("file"). If there is no directory part ("just_a_file"), it returns
+// the FilePath unmodified. If there is no file part ("just_a_dir/") it
+// returns an empty FilePath ("").
+// On Windows platform, '\' is the path separator, otherwise it is '/'.
+FilePath FilePath::RemoveDirectoryName() const {
+  const char* const last_sep = FindLastPathSeparator();
+  return last_sep ? FilePath(last_sep + 1) : *this;
+}
+
+// RemoveFileName returns the directory path with the filename removed.
+// Example: FilePath("path/to/file").RemoveFileName() returns "path/to/".
+// If the FilePath is "a_file" or "/a_file", RemoveFileName returns
+// FilePath("./") or, on Windows, FilePath(".\\"). If the filepath does
+// not have a file, like "just/a/dir/", it returns the FilePath unmodified.
+// On Windows platform, '\' is the path separator, otherwise it is '/'.
+FilePath FilePath::RemoveFileName() const {
+  const char* const last_sep = FindLastPathSeparator();
+  std::string dir;
+  if (last_sep) {
+    dir = std::string(c_str(), last_sep + 1 - c_str());
+  } else {
+    dir = kCurrentDirectoryString;
+  }
+  return FilePath(dir);
+}
+
+// Helper functions for naming files in a directory for xml output.
+
+// Given directory = "dir", base_name = "test", number = 0,
+// extension = "xml", returns "dir/test.xml". If number is greater
+// than zero (e.g., 12), returns "dir/test_12.xml".
+// On Windows platform, uses \ as the separator rather than /.
+FilePath FilePath::MakeFileName(const FilePath& directory,
+                                const FilePath& base_name,
+                                int number,
+                                const char* extension) {
+  std::string file;
+  if (number == 0) {
+    file = base_name.string() + "." + extension;
+  } else {
+    file = base_name.string() + "_" + StreamableToString(number)
+        + "." + extension;
+  }
+  return ConcatPaths(directory, FilePath(file));
+}
+
+// Given directory = "dir", relative_path = "test.xml", returns "dir/test.xml".
+// On Windows, uses \ as the separator rather than /.
+FilePath FilePath::ConcatPaths(const FilePath& directory,
+                               const FilePath& relative_path) {
+  if (directory.IsEmpty())
+    return relative_path;
+  const FilePath dir(directory.RemoveTrailingPathSeparator());
+  return FilePath(dir.string() + kPathSeparator + relative_path.string());
+}
+
+// Returns true if pathname describes something findable in the file-system,
+// either a file, directory, or whatever.
+bool FilePath::FileOrDirectoryExists() const {
+#if GTEST_OS_WINDOWS_MOBILE
+  LPCWSTR unicode = String::AnsiToUtf16(pathname_.c_str());
+  const DWORD attributes = GetFileAttributes(unicode);
+  delete [] unicode;
+  return attributes != kInvalidFileAttributes;
+#else
+  posix::StatStruct file_stat;
+  return posix::Stat(pathname_.c_str(), &file_stat) == 0;
+#endif  // GTEST_OS_WINDOWS_MOBILE
+}
+
+// Returns true if pathname describes a directory in the file-system
+// that exists.
+bool FilePath::DirectoryExists() const {
+  bool result = false;
+#if GTEST_OS_WINDOWS
+  // Don't strip off trailing separator if path is a root directory on
+  // Windows (like "C:\\").
+  const FilePath& path(IsRootDirectory() ? *this :
+                                           RemoveTrailingPathSeparator());
+#else
+  const FilePath& path(*this);
+#endif
+
+#if GTEST_OS_WINDOWS_MOBILE
+  LPCWSTR unicode = String::AnsiToUtf16(path.c_str());
+  const DWORD attributes = GetFileAttributes(unicode);
+  delete [] unicode;
+  if ((attributes != kInvalidFileAttributes) &&
+      (attributes & FILE_ATTRIBUTE_DIRECTORY)) {
+    result = true;
+  }
+#else
+  posix::StatStruct file_stat;
+  result = posix::Stat(path.c_str(), &file_stat) == 0 &&
+      posix::IsDir(file_stat);
+#endif  // GTEST_OS_WINDOWS_MOBILE
+
+  return result;
+}
+
+// Returns true if pathname describes a root directory. (Windows has one
+// root directory per disk drive.)
+bool FilePath::IsRootDirectory() const {
+#if GTEST_OS_WINDOWS
+  // TODO(wan at google.com): on Windows a network share like
+  // \\server\share can be a root directory, although it cannot be the
+  // current directory.  Handle this properly.
+  return pathname_.length() == 3 && IsAbsolutePath();
+#else
+  return pathname_.length() == 1 && IsPathSeparator(pathname_.c_str()[0]);
+#endif
+}
+
+// Returns true if pathname describes an absolute path.
+bool FilePath::IsAbsolutePath() const {
+  const char* const name = pathname_.c_str();
+#if GTEST_OS_WINDOWS
+  return pathname_.length() >= 3 &&
+     ((name[0] >= 'a' && name[0] <= 'z') ||
+      (name[0] >= 'A' && name[0] <= 'Z')) &&
+     name[1] == ':' &&
+     IsPathSeparator(name[2]);
+#else
+  return IsPathSeparator(name[0]);
+#endif
+}
+
+// Returns a pathname for a file that does not currently exist. The pathname
+// will be directory/base_name.extension or
+// directory/base_name_<number>.extension if directory/base_name.extension
+// already exists. The number will be incremented until a pathname is found
+// that does not already exist.
+// Examples: 'dir/foo_test.xml' or 'dir/foo_test_1.xml'.
+// There could be a race condition if two or more processes are calling this
+// function at the same time -- they could both pick the same filename.
+FilePath FilePath::GenerateUniqueFileName(const FilePath& directory,
+                                          const FilePath& base_name,
+                                          const char* extension) {
+  FilePath full_pathname;
+  int number = 0;
+  do {
+    full_pathname.Set(MakeFileName(directory, base_name, number++, extension));
+  } while (full_pathname.FileOrDirectoryExists());
+  return full_pathname;
+}
+
+// Returns true if FilePath ends with a path separator, which indicates that
+// it is intended to represent a directory. Returns false otherwise.
+// This does NOT check that a directory (or file) actually exists.
+bool FilePath::IsDirectory() const {
+  return !pathname_.empty() &&
+         IsPathSeparator(pathname_.c_str()[pathname_.length() - 1]);
+}
+
+// Create directories so that path exists. Returns true if successful or if
+// the directories already exist; returns false if unable to create directories
+// for any reason.
+bool FilePath::CreateDirectoriesRecursively() const {
+  if (!this->IsDirectory()) {
+    return false;
+  }
+
+  if (pathname_.length() == 0 || this->DirectoryExists()) {
+    return true;
+  }
+
+  const FilePath parent(this->RemoveTrailingPathSeparator().RemoveFileName());
+  return parent.CreateDirectoriesRecursively() && this->CreateFolder();
+}
+
+// Create the directory so that path exists. Returns true if successful or
+// if the directory already exists; returns false if unable to create the
+// directory for any reason, including if the parent directory does not
+// exist. Not named "CreateDirectory" because that's a macro on Windows.
+bool FilePath::CreateFolder() const {
+#if GTEST_OS_WINDOWS_MOBILE
+  FilePath removed_sep(this->RemoveTrailingPathSeparator());
+  LPCWSTR unicode = String::AnsiToUtf16(removed_sep.c_str());
+  int result = CreateDirectory(unicode, NULL) ? 0 : -1;
+  delete [] unicode;
+#elif GTEST_OS_WINDOWS
+  int result = _mkdir(pathname_.c_str());
+#else
+  int result = mkdir(pathname_.c_str(), 0777);
+#endif  // GTEST_OS_WINDOWS_MOBILE
+
+  if (result == -1) {
+    return this->DirectoryExists();  // An error is OK if the directory exists.
+  }
+  return true;  // No error.
+}
+
+// If input name has a trailing separator character, remove it and return the
+// name, otherwise return the name string unmodified.
+// On Windows platform, uses \ as the separator, other platforms use /.
+FilePath FilePath::RemoveTrailingPathSeparator() const {
+  return IsDirectory()
+      ? FilePath(pathname_.substr(0, pathname_.length() - 1))
+      : *this;
+}
+
+// Removes any redundant separators that might be in the pathname.
+// For example, "bar///foo" becomes "bar/foo". Does not eliminate other
+// redundancies that might be in a pathname involving "." or "..".
+// TODO(wan at google.com): handle Windows network shares (e.g. \\server\share).
+void FilePath::Normalize() {
+  if (pathname_.c_str() == NULL) {
+    pathname_ = "";
+    return;
+  }
+  const char* src = pathname_.c_str();
+  char* const dest = new char[pathname_.length() + 1];
+  char* dest_ptr = dest;
+  memset(dest_ptr, 0, pathname_.length() + 1);
+
+  while (*src != '\0') {
+    *dest_ptr = *src;
+    if (!IsPathSeparator(*src)) {
+      src++;
+    } else {
+#if GTEST_HAS_ALT_PATH_SEP_
+      if (*dest_ptr == kAlternatePathSeparator) {
+        *dest_ptr = kPathSeparator;
+      }
+#endif
+      while (IsPathSeparator(*src))
+        src++;
+    }
+    dest_ptr++;
+  }
+  *dest_ptr = '\0';
+  pathname_ = dest;
+  delete[] dest;
+}
+
+}  // namespace internal
+}  // namespace testing
diff --git a/contrib/gtest-1.7.0/src/gtest-internal-inl.h b/contrib/gtest-1.7.0/src/gtest-internal-inl.h
new file mode 100644
index 0000000..35df303
--- /dev/null
+++ b/contrib/gtest-1.7.0/src/gtest-internal-inl.h
@@ -0,0 +1,1218 @@
+// Copyright 2005, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+// Utility functions and classes used by the Google C++ testing framework.
+//
+// Author: wan at google.com (Zhanyong Wan)
+//
+// This file contains purely Google Test's internal implementation.  Please
+// DO NOT #INCLUDE IT IN A USER PROGRAM.
+
+#ifndef GTEST_SRC_GTEST_INTERNAL_INL_H_
+#define GTEST_SRC_GTEST_INTERNAL_INL_H_
+
+// GTEST_IMPLEMENTATION_ is defined to 1 iff the current translation unit is
+// part of Google Test's implementation; otherwise it's undefined.
+#if !GTEST_IMPLEMENTATION_
+// A user is trying to include this from his code - just say no.
+# error "gtest-internal-inl.h is part of Google Test's internal implementation."
+# error "It must not be included except by Google Test itself."
+#endif  // GTEST_IMPLEMENTATION_
+
+#ifndef _WIN32_WCE
+# include <errno.h>
+#endif  // !_WIN32_WCE
+#include <stddef.h>
+#include <stdlib.h>  // For strtoll/_strtoul64/malloc/free.
+#include <string.h>  // For memmove.
+
+#include <algorithm>
+#include <string>
+#include <vector>
+
+#include "gtest/internal/gtest-port.h"
+
+#if GTEST_CAN_STREAM_RESULTS_
+# include <arpa/inet.h>  // NOLINT
+# include <netdb.h>  // NOLINT
+#endif
+
+#if GTEST_OS_WINDOWS
+# include <windows.h>  // NOLINT
+#endif  // GTEST_OS_WINDOWS
+
+#include "gtest/gtest.h"  // NOLINT
+#include "gtest/gtest-spi.h"
+
+namespace testing {
+
+// Declares the flags.
+//
+// We don't want the users to modify this flag in the code, but want
+// Google Test's own unit tests to be able to access it. Therefore we
+// declare it here as opposed to in gtest.h.
+GTEST_DECLARE_bool_(death_test_use_fork);
+
+namespace internal {
+
+// The value of GetTestTypeId() as seen from within the Google Test
+// library.  This is solely for testing GetTestTypeId().
+GTEST_API_ extern const TypeId kTestTypeIdInGoogleTest;
+
+// Names of the flags (needed for parsing Google Test flags).
+const char kAlsoRunDisabledTestsFlag[] = "also_run_disabled_tests";
+const char kBreakOnFailureFlag[] = "break_on_failure";
+const char kCatchExceptionsFlag[] = "catch_exceptions";
+const char kColorFlag[] = "color";
+const char kFilterFlag[] = "filter";
+const char kListTestsFlag[] = "list_tests";
+const char kOutputFlag[] = "output";
+const char kPrintTimeFlag[] = "print_time";
+const char kRandomSeedFlag[] = "random_seed";
+const char kRepeatFlag[] = "repeat";
+const char kShuffleFlag[] = "shuffle";
+const char kStackTraceDepthFlag[] = "stack_trace_depth";
+const char kStreamResultToFlag[] = "stream_result_to";
+const char kThrowOnFailureFlag[] = "throw_on_failure";
+
+// A valid random seed must be in [1, kMaxRandomSeed].
+const int kMaxRandomSeed = 99999;
+
+// g_help_flag is true iff the --help flag or an equivalent form is
+// specified on the command line.
+GTEST_API_ extern bool g_help_flag;
+
+// Returns the current time in milliseconds.
+GTEST_API_ TimeInMillis GetTimeInMillis();
+
+// Returns true iff Google Test should use colors in the output.
+GTEST_API_ bool ShouldUseColor(bool stdout_is_tty);
+
+// Formats the given time in milliseconds as seconds.
+GTEST_API_ std::string FormatTimeInMillisAsSeconds(TimeInMillis ms);
+
+// Converts the given time in milliseconds to a date string in the ISO 8601
+// format, without the timezone information.  N.B.: due to the use the
+// non-reentrant localtime() function, this function is not thread safe.  Do
+// not use it in any code that can be called from multiple threads.
+GTEST_API_ std::string FormatEpochTimeInMillisAsIso8601(TimeInMillis ms);
+
+// Parses a string for an Int32 flag, in the form of "--flag=value".
+//
+// On success, stores the value of the flag in *value, and returns
+// true.  On failure, returns false without changing *value.
+GTEST_API_ bool ParseInt32Flag(
+    const char* str, const char* flag, Int32* value);
+
+// Returns a random seed in range [1, kMaxRandomSeed] based on the
+// given --gtest_random_seed flag value.
+inline int GetRandomSeedFromFlag(Int32 random_seed_flag) {
+  const unsigned int raw_seed = (random_seed_flag == 0) ?
+      static_cast<unsigned int>(GetTimeInMillis()) :
+      static_cast<unsigned int>(random_seed_flag);
+
+  // Normalizes the actual seed to range [1, kMaxRandomSeed] such that
+  // it's easy to type.
+  const int normalized_seed =
+      static_cast<int>((raw_seed - 1U) %
+                       static_cast<unsigned int>(kMaxRandomSeed)) + 1;
+  return normalized_seed;
+}
+
+// Returns the first valid random seed after 'seed'.  The behavior is
+// undefined if 'seed' is invalid.  The seed after kMaxRandomSeed is
+// considered to be 1.
+inline int GetNextRandomSeed(int seed) {
+  GTEST_CHECK_(1 <= seed && seed <= kMaxRandomSeed)
+      << "Invalid random seed " << seed << " - must be in [1, "
+      << kMaxRandomSeed << "].";
+  const int next_seed = seed + 1;
+  return (next_seed > kMaxRandomSeed) ? 1 : next_seed;
+}
+
+// This class saves the values of all Google Test flags in its c'tor, and
+// restores them in its d'tor.
+class GTestFlagSaver {
+ public:
+  // The c'tor.
+  GTestFlagSaver() {
+    also_run_disabled_tests_ = GTEST_FLAG(also_run_disabled_tests);
+    break_on_failure_ = GTEST_FLAG(break_on_failure);
+    catch_exceptions_ = GTEST_FLAG(catch_exceptions);
+    color_ = GTEST_FLAG(color);
+    death_test_style_ = GTEST_FLAG(death_test_style);
+    death_test_use_fork_ = GTEST_FLAG(death_test_use_fork);
+    filter_ = GTEST_FLAG(filter);
+    internal_run_death_test_ = GTEST_FLAG(internal_run_death_test);
+    list_tests_ = GTEST_FLAG(list_tests);
+    output_ = GTEST_FLAG(output);
+    print_time_ = GTEST_FLAG(print_time);
+    random_seed_ = GTEST_FLAG(random_seed);
+    repeat_ = GTEST_FLAG(repeat);
+    shuffle_ = GTEST_FLAG(shuffle);
+    stack_trace_depth_ = GTEST_FLAG(stack_trace_depth);
+    stream_result_to_ = GTEST_FLAG(stream_result_to);
+    throw_on_failure_ = GTEST_FLAG(throw_on_failure);
+  }
+
+  // The d'tor is not virtual.  DO NOT INHERIT FROM THIS CLASS.
+  ~GTestFlagSaver() {
+    GTEST_FLAG(also_run_disabled_tests) = also_run_disabled_tests_;
+    GTEST_FLAG(break_on_failure) = break_on_failure_;
+    GTEST_FLAG(catch_exceptions) = catch_exceptions_;
+    GTEST_FLAG(color) = color_;
+    GTEST_FLAG(death_test_style) = death_test_style_;
+    GTEST_FLAG(death_test_use_fork) = death_test_use_fork_;
+    GTEST_FLAG(filter) = filter_;
+    GTEST_FLAG(internal_run_death_test) = internal_run_death_test_;
+    GTEST_FLAG(list_tests) = list_tests_;
+    GTEST_FLAG(output) = output_;
+    GTEST_FLAG(print_time) = print_time_;
+    GTEST_FLAG(random_seed) = random_seed_;
+    GTEST_FLAG(repeat) = repeat_;
+    GTEST_FLAG(shuffle) = shuffle_;
+    GTEST_FLAG(stack_trace_depth) = stack_trace_depth_;
+    GTEST_FLAG(stream_result_to) = stream_result_to_;
+    GTEST_FLAG(throw_on_failure) = throw_on_failure_;
+  }
+
+ private:
+  // Fields for saving the original values of flags.
+  bool also_run_disabled_tests_;
+  bool break_on_failure_;
+  bool catch_exceptions_;
+  std::string color_;
+  std::string death_test_style_;
+  bool death_test_use_fork_;
+  std::string filter_;
+  std::string internal_run_death_test_;
+  bool list_tests_;
+  std::string output_;
+  bool print_time_;
+  internal::Int32 random_seed_;
+  internal::Int32 repeat_;
+  bool shuffle_;
+  internal::Int32 stack_trace_depth_;
+  std::string stream_result_to_;
+  bool throw_on_failure_;
+} GTEST_ATTRIBUTE_UNUSED_;
+
+// Converts a Unicode code point to a narrow string in UTF-8 encoding.
+// code_point parameter is of type UInt32 because wchar_t may not be
+// wide enough to contain a code point.
+// If the code_point is not a valid Unicode code point
+// (i.e. outside of Unicode range U+0 to U+10FFFF) it will be converted
+// to "(Invalid Unicode 0xXXXXXXXX)".
+GTEST_API_ std::string CodePointToUtf8(UInt32 code_point);
+
+// Converts a wide string to a narrow string in UTF-8 encoding.
+// The wide string is assumed to have the following encoding:
+//   UTF-16 if sizeof(wchar_t) == 2 (on Windows, Cygwin, Symbian OS)
+//   UTF-32 if sizeof(wchar_t) == 4 (on Linux)
+// Parameter str points to a null-terminated wide string.
+// Parameter num_chars may additionally limit the number
+// of wchar_t characters processed. -1 is used when the entire string
+// should be processed.
+// If the string contains code points that are not valid Unicode code points
+// (i.e. outside of Unicode range U+0 to U+10FFFF) they will be output
+// as '(Invalid Unicode 0xXXXXXXXX)'. If the string is in UTF16 encoding
+// and contains invalid UTF-16 surrogate pairs, values in those pairs
+// will be encoded as individual Unicode characters from Basic Normal Plane.
+GTEST_API_ std::string WideStringToUtf8(const wchar_t* str, int num_chars);
+
+// Reads the GTEST_SHARD_STATUS_FILE environment variable, and creates the file
+// if the variable is present. If a file already exists at this location, this
+// function will write over it. If the variable is present, but the file cannot
+// be created, prints an error and exits.
+void WriteToShardStatusFileIfNeeded();
+
+// Checks whether sharding is enabled by examining the relevant
+// environment variable values. If the variables are present,
+// but inconsistent (e.g., shard_index >= total_shards), prints
+// an error and exits. If in_subprocess_for_death_test, sharding is
+// disabled because it must only be applied to the original test
+// process. Otherwise, we could filter out death tests we intended to execute.
+GTEST_API_ bool ShouldShard(const char* total_shards_str,
+                            const char* shard_index_str,
+                            bool in_subprocess_for_death_test);
+
+// Parses the environment variable var as an Int32. If it is unset,
+// returns default_val. If it is not an Int32, prints an error and
+// and aborts.
+GTEST_API_ Int32 Int32FromEnvOrDie(const char* env_var, Int32 default_val);
+
+// Given the total number of shards, the shard index, and the test id,
+// returns true iff the test should be run on this shard. The test id is
+// some arbitrary but unique non-negative integer assigned to each test
+// method. Assumes that 0 <= shard_index < total_shards.
+GTEST_API_ bool ShouldRunTestOnShard(
+    int total_shards, int shard_index, int test_id);
+
+// STL container utilities.
+
+// Returns the number of elements in the given container that satisfy
+// the given predicate.
+template <class Container, typename Predicate>
+inline int CountIf(const Container& c, Predicate predicate) {
+  // Implemented as an explicit loop since std::count_if() in libCstd on
+  // Solaris has a non-standard signature.
+  int count = 0;
+  for (typename Container::const_iterator it = c.begin(); it != c.end(); ++it) {
+    if (predicate(*it))
+      ++count;
+  }
+  return count;
+}
+
+// Applies a function/functor to each element in the container.
+template <class Container, typename Functor>
+void ForEach(const Container& c, Functor functor) {
+  std::for_each(c.begin(), c.end(), functor);
+}
+
+// Returns the i-th element of the vector, or default_value if i is not
+// in range [0, v.size()).
+template <typename E>
+inline E GetElementOr(const std::vector<E>& v, int i, E default_value) {
+  return (i < 0 || i >= static_cast<int>(v.size())) ? default_value : v[i];
+}
+
+// Performs an in-place shuffle of a range of the vector's elements.
+// 'begin' and 'end' are element indices as an STL-style range;
+// i.e. [begin, end) are shuffled, where 'end' == size() means to
+// shuffle to the end of the vector.
+template <typename E>
+void ShuffleRange(internal::Random* random, int begin, int end,
+                  std::vector<E>* v) {
+  const int size = static_cast<int>(v->size());
+  GTEST_CHECK_(0 <= begin && begin <= size)
+      << "Invalid shuffle range start " << begin << ": must be in range [0, "
+      << size << "].";
+  GTEST_CHECK_(begin <= end && end <= size)
+      << "Invalid shuffle range finish " << end << ": must be in range ["
+      << begin << ", " << size << "].";
+
+  // Fisher-Yates shuffle, from
+  // http://en.wikipedia.org/wiki/Fisher-Yates_shuffle
+  for (int range_width = end - begin; range_width >= 2; range_width--) {
+    const int last_in_range = begin + range_width - 1;
+    const int selected = begin + random->Generate(range_width);
+    std::swap((*v)[selected], (*v)[last_in_range]);
+  }
+}
+
+// Performs an in-place shuffle of the vector's elements.
+template <typename E>
+inline void Shuffle(internal::Random* random, std::vector<E>* v) {
+  ShuffleRange(random, 0, static_cast<int>(v->size()), v);
+}
+
+// A function for deleting an object.  Handy for being used as a
+// functor.
+template <typename T>
+static void Delete(T* x) {
+  delete x;
+}
+
+// A predicate that checks the key of a TestProperty against a known key.
+//
+// TestPropertyKeyIs is copyable.
+class TestPropertyKeyIs {
+ public:
+  // Constructor.
+  //
+  // TestPropertyKeyIs has NO default constructor.
+  explicit TestPropertyKeyIs(const std::string& key) : key_(key) {}
+
+  // Returns true iff the test name of test property matches on key_.
+  bool operator()(const TestProperty& test_property) const {
+    return test_property.key() == key_;
+  }
+
+ private:
+  std::string key_;
+};
+
+// Class UnitTestOptions.
+//
+// This class contains functions for processing options the user
+// specifies when running the tests.  It has only static members.
+//
+// In most cases, the user can specify an option using either an
+// environment variable or a command line flag.  E.g. you can set the
+// test filter using either GTEST_FILTER or --gtest_filter.  If both
+// the variable and the flag are present, the latter overrides the
+// former.
+class GTEST_API_ UnitTestOptions {
+ public:
+  // Functions for processing the gtest_output flag.
+
+  // Returns the output format, or "" for normal printed output.
+  static std::string GetOutputFormat();
+
+  // Returns the absolute path of the requested output file, or the
+  // default (test_detail.xml in the original working directory) if
+  // none was explicitly specified.
+  static std::string GetAbsolutePathToOutputFile();
+
+  // Functions for processing the gtest_filter flag.
+
+  // Returns true iff the wildcard pattern matches the string.  The
+  // first ':' or '\0' character in pattern marks the end of it.
+  //
+  // This recursive algorithm isn't very efficient, but is clear and
+  // works well enough for matching test names, which are short.
+  static bool PatternMatchesString(const char *pattern, const char *str);
+
+  // Returns true iff the user-specified filter matches the test case
+  // name and the test name.
+  static bool FilterMatchesTest(const std::string &test_case_name,
+                                const std::string &test_name);
+
+#if GTEST_OS_WINDOWS
+  // Function for supporting the gtest_catch_exception flag.
+
+  // Returns EXCEPTION_EXECUTE_HANDLER if Google Test should handle the
+  // given SEH exception, or EXCEPTION_CONTINUE_SEARCH otherwise.
+  // This function is useful as an __except condition.
+  static int GTestShouldProcessSEH(DWORD exception_code);
+#endif  // GTEST_OS_WINDOWS
+
+  // Returns true if "name" matches the ':' separated list of glob-style
+  // filters in "filter".
+  static bool MatchesFilter(const std::string& name, const char* filter);
+};
+
+// Returns the current application's name, removing directory path if that
+// is present.  Used by UnitTestOptions::GetOutputFile.
+GTEST_API_ FilePath GetCurrentExecutableName();
+
+// The role interface for getting the OS stack trace as a string.
+class OsStackTraceGetterInterface {
+ public:
+  OsStackTraceGetterInterface() {}
+  virtual ~OsStackTraceGetterInterface() {}
+
+  // Returns the current OS stack trace as an std::string.  Parameters:
+  //
+  //   max_depth  - the maximum number of stack frames to be included
+  //                in the trace.
+  //   skip_count - the number of top frames to be skipped; doesn't count
+  //                against max_depth.
+  virtual string CurrentStackTrace(int max_depth, int skip_count) = 0;
+
+  // UponLeavingGTest() should be called immediately before Google Test calls
+  // user code. It saves some information about the current stack that
+  // CurrentStackTrace() will use to find and hide Google Test stack frames.
+  virtual void UponLeavingGTest() = 0;
+
+ private:
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(OsStackTraceGetterInterface);
+};
+
+// A working implementation of the OsStackTraceGetterInterface interface.
+class OsStackTraceGetter : public OsStackTraceGetterInterface {
+ public:
+  OsStackTraceGetter() : caller_frame_(NULL) {}
+
+  virtual string CurrentStackTrace(int max_depth, int skip_count)
+      GTEST_LOCK_EXCLUDED_(mutex_);
+
+  virtual void UponLeavingGTest() GTEST_LOCK_EXCLUDED_(mutex_);
+
+  // This string is inserted in place of stack frames that are part of
+  // Google Test's implementation.
+  static const char* const kElidedFramesMarker;
+
+ private:
+  Mutex mutex_;  // protects all internal state
+
+  // We save the stack frame below the frame that calls user code.
+  // We do this because the address of the frame immediately below
+  // the user code changes between the call to UponLeavingGTest()
+  // and any calls to CurrentStackTrace() from within the user code.
+  void* caller_frame_;
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(OsStackTraceGetter);
+};
+
+// Information about a Google Test trace point.
+struct TraceInfo {
+  const char* file;
+  int line;
+  std::string message;
+};
+
+// This is the default global test part result reporter used in UnitTestImpl.
+// This class should only be used by UnitTestImpl.
+class DefaultGlobalTestPartResultReporter
+  : public TestPartResultReporterInterface {
+ public:
+  explicit DefaultGlobalTestPartResultReporter(UnitTestImpl* unit_test);
+  // Implements the TestPartResultReporterInterface. Reports the test part
+  // result in the current test.
+  virtual void ReportTestPartResult(const TestPartResult& result);
+
+ private:
+  UnitTestImpl* const unit_test_;
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(DefaultGlobalTestPartResultReporter);
+};
+
+// This is the default per thread test part result reporter used in
+// UnitTestImpl. This class should only be used by UnitTestImpl.
+class DefaultPerThreadTestPartResultReporter
+    : public TestPartResultReporterInterface {
+ public:
+  explicit DefaultPerThreadTestPartResultReporter(UnitTestImpl* unit_test);
+  // Implements the TestPartResultReporterInterface. The implementation just
+  // delegates to the current global test part result reporter of *unit_test_.
+  virtual void ReportTestPartResult(const TestPartResult& result);
+
+ private:
+  UnitTestImpl* const unit_test_;
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(DefaultPerThreadTestPartResultReporter);
+};
+
+// The private implementation of the UnitTest class.  We don't protect
+// the methods under a mutex, as this class is not accessible by a
+// user and the UnitTest class that delegates work to this class does
+// proper locking.
+class GTEST_API_ UnitTestImpl {
+ public:
+  explicit UnitTestImpl(UnitTest* parent);
+  virtual ~UnitTestImpl();
+
+  // There are two different ways to register your own TestPartResultReporter.
+  // You can register your own repoter to listen either only for test results
+  // from the current thread or for results from all threads.
+  // By default, each per-thread test result repoter just passes a new
+  // TestPartResult to the global test result reporter, which registers the
+  // test part result for the currently running test.
+
+  // Returns the global test part result reporter.
+  TestPartResultReporterInterface* GetGlobalTestPartResultReporter();
+
+  // Sets the global test part result reporter.
+  void SetGlobalTestPartResultReporter(
+      TestPartResultReporterInterface* reporter);
+
+  // Returns the test part result reporter for the current thread.
+  TestPartResultReporterInterface* GetTestPartResultReporterForCurrentThread();
+
+  // Sets the test part result reporter for the current thread.
+  void SetTestPartResultReporterForCurrentThread(
+      TestPartResultReporterInterface* reporter);
+
+  // Gets the number of successful test cases.
+  int successful_test_case_count() const;
+
+  // Gets the number of failed test cases.
+  int failed_test_case_count() const;
+
+  // Gets the number of all test cases.
+  int total_test_case_count() const;
+
+  // Gets the number of all test cases that contain at least one test
+  // that should run.
+  int test_case_to_run_count() const;
+
+  // Gets the number of successful tests.
+  int successful_test_count() const;
+
+  // Gets the number of failed tests.
+  int failed_test_count() const;
+
+  // Gets the number of disabled tests that will be reported in the XML report.
+  int reportable_disabled_test_count() const;
+
+  // Gets the number of disabled tests.
+  int disabled_test_count() const;
+
+  // Gets the number of tests to be printed in the XML report.
+  int reportable_test_count() const;
+
+  // Gets the number of all tests.
+  int total_test_count() const;
+
+  // Gets the number of tests that should run.
+  int test_to_run_count() const;
+
+  // Gets the time of the test program start, in ms from the start of the
+  // UNIX epoch.
+  TimeInMillis start_timestamp() const { return start_timestamp_; }
+
+  // Gets the elapsed time, in milliseconds.
+  TimeInMillis elapsed_time() const { return elapsed_time_; }
+
+  // Returns true iff the unit test passed (i.e. all test cases passed).
+  bool Passed() const { return !Failed(); }
+
+  // Returns true iff the unit test failed (i.e. some test case failed
+  // or something outside of all tests failed).
+  bool Failed() const {
+    return failed_test_case_count() > 0 || ad_hoc_test_result()->Failed();
+  }
+
+  // Gets the i-th test case among all the test cases. i can range from 0 to
+  // total_test_case_count() - 1. If i is not in that range, returns NULL.
+  const TestCase* GetTestCase(int i) const {
+    const int index = GetElementOr(test_case_indices_, i, -1);
+    return index < 0 ? NULL : test_cases_[i];
+  }
+
+  // Gets the i-th test case among all the test cases. i can range from 0 to
+  // total_test_case_count() - 1. If i is not in that range, returns NULL.
+  TestCase* GetMutableTestCase(int i) {
+    const int index = GetElementOr(test_case_indices_, i, -1);
+    return index < 0 ? NULL : test_cases_[index];
+  }
+
+  // Provides access to the event listener list.
+  TestEventListeners* listeners() { return &listeners_; }
+
+  // Returns the TestResult for the test that's currently running, or
+  // the TestResult for the ad hoc test if no test is running.
+  TestResult* current_test_result();
+
+  // Returns the TestResult for the ad hoc test.
+  const TestResult* ad_hoc_test_result() const { return &ad_hoc_test_result_; }
+
+  // Sets the OS stack trace getter.
+  //
+  // Does nothing if the input and the current OS stack trace getter
+  // are the same; otherwise, deletes the old getter and makes the
+  // input the current getter.
+  void set_os_stack_trace_getter(OsStackTraceGetterInterface* getter);
+
+  // Returns the current OS stack trace getter if it is not NULL;
+  // otherwise, creates an OsStackTraceGetter, makes it the current
+  // getter, and returns it.
+  OsStackTraceGetterInterface* os_stack_trace_getter();
+
+  // Returns the current OS stack trace as an std::string.
+  //
+  // The maximum number of stack frames to be included is specified by
+  // the gtest_stack_trace_depth flag.  The skip_count parameter
+  // specifies the number of top frames to be skipped, which doesn't
+  // count against the number of frames to be included.
+  //
+  // For example, if Foo() calls Bar(), which in turn calls
+  // CurrentOsStackTraceExceptTop(1), Foo() will be included in the
+  // trace but Bar() and CurrentOsStackTraceExceptTop() won't.
+  std::string CurrentOsStackTraceExceptTop(int skip_count) GTEST_NO_INLINE_;
+
+  // Finds and returns a TestCase with the given name.  If one doesn't
+  // exist, creates one and returns it.
+  //
+  // Arguments:
+  //
+  //   test_case_name: name of the test case
+  //   type_param:     the name of the test's type parameter, or NULL if
+  //                   this is not a typed or a type-parameterized test.
+  //   set_up_tc:      pointer to the function that sets up the test case
+  //   tear_down_tc:   pointer to the function that tears down the test case
+  TestCase* GetTestCase(const char* test_case_name,
+                        const char* type_param,
+                        Test::SetUpTestCaseFunc set_up_tc,
+                        Test::TearDownTestCaseFunc tear_down_tc);
+
+  // Adds a TestInfo to the unit test.
+  //
+  // Arguments:
+  //
+  //   set_up_tc:    pointer to the function that sets up the test case
+  //   tear_down_tc: pointer to the function that tears down the test case
+  //   test_info:    the TestInfo object
+  void AddTestInfo(Test::SetUpTestCaseFunc set_up_tc,
+                   Test::TearDownTestCaseFunc tear_down_tc,
+                   TestInfo* test_info) {
+    // In order to support thread-safe death tests, we need to
+    // remember the original working directory when the test program
+    // was first invoked.  We cannot do this in RUN_ALL_TESTS(), as
+    // the user may have changed the current directory before calling
+    // RUN_ALL_TESTS().  Therefore we capture the current directory in
+    // AddTestInfo(), which is called to register a TEST or TEST_F
+    // before main() is reached.
+    if (original_working_dir_.IsEmpty()) {
+      original_working_dir_.Set(FilePath::GetCurrentDir());
+      GTEST_CHECK_(!original_working_dir_.IsEmpty())
+          << "Failed to get the current working directory.";
+    }
+
+    GetTestCase(test_info->test_case_name(),
+                test_info->type_param(),
+                set_up_tc,
+                tear_down_tc)->AddTestInfo(test_info);
+  }
+
+#if GTEST_HAS_PARAM_TEST
+  // Returns ParameterizedTestCaseRegistry object used to keep track of
+  // value-parameterized tests and instantiate and register them.
+  internal::ParameterizedTestCaseRegistry& parameterized_test_registry() {
+    return parameterized_test_registry_;
+  }
+#endif  // GTEST_HAS_PARAM_TEST
+
+  // Sets the TestCase object for the test that's currently running.
+  void set_current_test_case(TestCase* a_current_test_case) {
+    current_test_case_ = a_current_test_case;
+  }
+
+  // Sets the TestInfo object for the test that's currently running.  If
+  // current_test_info is NULL, the assertion results will be stored in
+  // ad_hoc_test_result_.
+  void set_current_test_info(TestInfo* a_current_test_info) {
+    current_test_info_ = a_current_test_info;
+  }
+
+  // Registers all parameterized tests defined using TEST_P and
+  // INSTANTIATE_TEST_CASE_P, creating regular tests for each test/parameter
+  // combination. This method can be called more then once; it has guards
+  // protecting from registering the tests more then once.  If
+  // value-parameterized tests are disabled, RegisterParameterizedTests is
+  // present but does nothing.
+  void RegisterParameterizedTests();
+
+  // Runs all tests in this UnitTest object, prints the result, and
+  // returns true if all tests are successful.  If any exception is
+  // thrown during a test, this test is considered to be failed, but
+  // the rest of the tests will still be run.
+  bool RunAllTests();
+
+  // Clears the results of all tests, except the ad hoc tests.
+  void ClearNonAdHocTestResult() {
+    ForEach(test_cases_, TestCase::ClearTestCaseResult);
+  }
+
+  // Clears the results of ad-hoc test assertions.
+  void ClearAdHocTestResult() {
+    ad_hoc_test_result_.Clear();
+  }
+
+  // Adds a TestProperty to the current TestResult object when invoked in a
+  // context of a test or a test case, or to the global property set. If the
+  // result already contains a property with the same key, the value will be
+  // updated.
+  void RecordProperty(const TestProperty& test_property);
+
+  enum ReactionToSharding {
+    HONOR_SHARDING_PROTOCOL,
+    IGNORE_SHARDING_PROTOCOL
+  };
+
+  // Matches the full name of each test against the user-specified
+  // filter to decide whether the test should run, then records the
+  // result in each TestCase and TestInfo object.
+  // If shard_tests == HONOR_SHARDING_PROTOCOL, further filters tests
+  // based on sharding variables in the environment.
+  // Returns the number of tests that should run.
+  int FilterTests(ReactionToSharding shard_tests);
+
+  // Prints the names of the tests matching the user-specified filter flag.
+  void ListTestsMatchingFilter();
+
+  const TestCase* current_test_case() const { return current_test_case_; }
+  TestInfo* current_test_info() { return current_test_info_; }
+  const TestInfo* current_test_info() const { return current_test_info_; }
+
+  // Returns the vector of environments that need to be set-up/torn-down
+  // before/after the tests are run.
+  std::vector<Environment*>& environments() { return environments_; }
+
+  // Getters for the per-thread Google Test trace stack.
+  std::vector<TraceInfo>& gtest_trace_stack() {
+    return *(gtest_trace_stack_.pointer());
+  }
+  const std::vector<TraceInfo>& gtest_trace_stack() const {
+    return gtest_trace_stack_.get();
+  }
+
+#if GTEST_HAS_DEATH_TEST
+  void InitDeathTestSubprocessControlInfo() {
+    internal_run_death_test_flag_.reset(ParseInternalRunDeathTestFlag());
+  }
+  // Returns a pointer to the parsed --gtest_internal_run_death_test
+  // flag, or NULL if that flag was not specified.
+  // This information is useful only in a death test child process.
+  // Must not be called before a call to InitGoogleTest.
+  const InternalRunDeathTestFlag* internal_run_death_test_flag() const {
+    return internal_run_death_test_flag_.get();
+  }
+
+  // Returns a pointer to the current death test factory.
+  internal::DeathTestFactory* death_test_factory() {
+    return death_test_factory_.get();
+  }
+
+  void SuppressTestEventsIfInSubprocess();
+
+  friend class ReplaceDeathTestFactory;
+#endif  // GTEST_HAS_DEATH_TEST
+
+  // Initializes the event listener performing XML output as specified by
+  // UnitTestOptions. Must not be called before InitGoogleTest.
+  void ConfigureXmlOutput();
+
+#if GTEST_CAN_STREAM_RESULTS_
+  // Initializes the event listener for streaming test results to a socket.
+  // Must not be called before InitGoogleTest.
+  void ConfigureStreamingOutput();
+#endif
+
+  // Performs initialization dependent upon flag values obtained in
+  // ParseGoogleTestFlagsOnly.  Is called from InitGoogleTest after the call to
+  // ParseGoogleTestFlagsOnly.  In case a user neglects to call InitGoogleTest
+  // this function is also called from RunAllTests.  Since this function can be
+  // called more than once, it has to be idempotent.
+  void PostFlagParsingInit();
+
+  // Gets the random seed used at the start of the current test iteration.
+  int random_seed() const { return random_seed_; }
+
+  // Gets the random number generator.
+  internal::Random* random() { return &random_; }
+
+  // Shuffles all test cases, and the tests within each test case,
+  // making sure that death tests are still run first.
+  void ShuffleTests();
+
+  // Restores the test cases and tests to their order before the first shuffle.
+  void UnshuffleTests();
+
+  // Returns the value of GTEST_FLAG(catch_exceptions) at the moment
+  // UnitTest::Run() starts.
+  bool catch_exceptions() const { return catch_exceptions_; }
+
+ private:
+  friend class ::testing::UnitTest;
+
+  // Used by UnitTest::Run() to capture the state of
+  // GTEST_FLAG(catch_exceptions) at the moment it starts.
+  void set_catch_exceptions(bool value) { catch_exceptions_ = value; }
+
+  // The UnitTest object that owns this implementation object.
+  UnitTest* const parent_;
+
+  // The working directory when the first TEST() or TEST_F() was
+  // executed.
+  internal::FilePath original_working_dir_;
+
+  // The default test part result reporters.
+  DefaultGlobalTestPartResultReporter default_global_test_part_result_reporter_;
+  DefaultPerThreadTestPartResultReporter
+      default_per_thread_test_part_result_reporter_;
+
+  // Points to (but doesn't own) the global test part result reporter.
+  TestPartResultReporterInterface* global_test_part_result_repoter_;
+
+  // Protects read and write access to global_test_part_result_reporter_.
+  internal::Mutex global_test_part_result_reporter_mutex_;
+
+  // Points to (but doesn't own) the per-thread test part result reporter.
+  internal::ThreadLocal<TestPartResultReporterInterface*>
+      per_thread_test_part_result_reporter_;
+
+  // The vector of environments that need to be set-up/torn-down
+  // before/after the tests are run.
+  std::vector<Environment*> environments_;
+
+  // The vector of TestCases in their original order.  It owns the
+  // elements in the vector.
+  std::vector<TestCase*> test_cases_;
+
+  // Provides a level of indirection for the test case list to allow
+  // easy shuffling and restoring the test case order.  The i-th
+  // element of this vector is the index of the i-th test case in the
+  // shuffled order.
+  std::vector<int> test_case_indices_;
+
+#if GTEST_HAS_PARAM_TEST
+  // ParameterizedTestRegistry object used to register value-parameterized
+  // tests.
+  internal::ParameterizedTestCaseRegistry parameterized_test_registry_;
+
+  // Indicates whether RegisterParameterizedTests() has been called already.
+  bool parameterized_tests_registered_;
+#endif  // GTEST_HAS_PARAM_TEST
+
+  // Index of the last death test case registered.  Initially -1.
+  int last_death_test_case_;
+
+  // This points to the TestCase for the currently running test.  It
+  // changes as Google Test goes through one test case after another.
+  // When no test is running, this is set to NULL and Google Test
+  // stores assertion results in ad_hoc_test_result_.  Initially NULL.
+  TestCase* current_test_case_;
+
+  // This points to the TestInfo for the currently running test.  It
+  // changes as Google Test goes through one test after another.  When
+  // no test is running, this is set to NULL and Google Test stores
+  // assertion results in ad_hoc_test_result_.  Initially NULL.
+  TestInfo* current_test_info_;
+
+  // Normally, a user only writes assertions inside a TEST or TEST_F,
+  // or inside a function called by a TEST or TEST_F.  Since Google
+  // Test keeps track of which test is current running, it can
+  // associate such an assertion with the test it belongs to.
+  //
+  // If an assertion is encountered when no TEST or TEST_F is running,
+  // Google Test attributes the assertion result to an imaginary "ad hoc"
+  // test, and records the result in ad_hoc_test_result_.
+  TestResult ad_hoc_test_result_;
+
+  // The list of event listeners that can be used to track events inside
+  // Google Test.
+  TestEventListeners listeners_;
+
+  // The OS stack trace getter.  Will be deleted when the UnitTest
+  // object is destructed.  By default, an OsStackTraceGetter is used,
+  // but the user can set this field to use a custom getter if that is
+  // desired.
+  OsStackTraceGetterInterface* os_stack_trace_getter_;
+
+  // True iff PostFlagParsingInit() has been called.
+  bool post_flag_parse_init_performed_;
+
+  // The random number seed used at the beginning of the test run.
+  int random_seed_;
+
+  // Our random number generator.
+  internal::Random random_;
+
+  // The time of the test program start, in ms from the start of the
+  // UNIX epoch.
+  TimeInMillis start_timestamp_;
+
+  // How long the test took to run, in milliseconds.
+  TimeInMillis elapsed_time_;
+
+#if GTEST_HAS_DEATH_TEST
+  // The decomposed components of the gtest_internal_run_death_test flag,
+  // parsed when RUN_ALL_TESTS is called.
+  internal::scoped_ptr<InternalRunDeathTestFlag> internal_run_death_test_flag_;
+  internal::scoped_ptr<internal::DeathTestFactory> death_test_factory_;
+#endif  // GTEST_HAS_DEATH_TEST
+
+  // A per-thread stack of traces created by the SCOPED_TRACE() macro.
+  internal::ThreadLocal<std::vector<TraceInfo> > gtest_trace_stack_;
+
+  // The value of GTEST_FLAG(catch_exceptions) at the moment RunAllTests()
+  // starts.
+  bool catch_exceptions_;
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(UnitTestImpl);
+};  // class UnitTestImpl
+
+// Convenience function for accessing the global UnitTest
+// implementation object.
+inline UnitTestImpl* GetUnitTestImpl() {
+  return UnitTest::GetInstance()->impl();
+}
+
+#if GTEST_USES_SIMPLE_RE
+
+// Internal helper functions for implementing the simple regular
+// expression matcher.
+GTEST_API_ bool IsInSet(char ch, const char* str);
+GTEST_API_ bool IsAsciiDigit(char ch);
+GTEST_API_ bool IsAsciiPunct(char ch);
+GTEST_API_ bool IsRepeat(char ch);
+GTEST_API_ bool IsAsciiWhiteSpace(char ch);
+GTEST_API_ bool IsAsciiWordChar(char ch);
+GTEST_API_ bool IsValidEscape(char ch);
+GTEST_API_ bool AtomMatchesChar(bool escaped, char pattern, char ch);
+GTEST_API_ bool ValidateRegex(const char* regex);
+GTEST_API_ bool MatchRegexAtHead(const char* regex, const char* str);
+GTEST_API_ bool MatchRepetitionAndRegexAtHead(
+    bool escaped, char ch, char repeat, const char* regex, const char* str);
+GTEST_API_ bool MatchRegexAnywhere(const char* regex, const char* str);
+
+#endif  // GTEST_USES_SIMPLE_RE
+
+// Parses the command line for Google Test flags, without initializing
+// other parts of Google Test.
+GTEST_API_ void ParseGoogleTestFlagsOnly(int* argc, char** argv);
+GTEST_API_ void ParseGoogleTestFlagsOnly(int* argc, wchar_t** argv);
+
+#if GTEST_HAS_DEATH_TEST
+
+// Returns the message describing the last system error, regardless of the
+// platform.
+GTEST_API_ std::string GetLastErrnoDescription();
+
+# if GTEST_OS_WINDOWS
+// Provides leak-safe Windows kernel handle ownership.
+class AutoHandle {
+ public:
+  AutoHandle() : handle_(INVALID_HANDLE_VALUE) {}
+  explicit AutoHandle(HANDLE handle) : handle_(handle) {}
+
+  ~AutoHandle() { Reset(); }
+
+  HANDLE Get() const { return handle_; }
+  void Reset() { Reset(INVALID_HANDLE_VALUE); }
+  void Reset(HANDLE handle) {
+    if (handle != handle_) {
+      if (handle_ != INVALID_HANDLE_VALUE)
+        ::CloseHandle(handle_);
+      handle_ = handle;
+    }
+  }
+
+ private:
+  HANDLE handle_;
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(AutoHandle);
+};
+# endif  // GTEST_OS_WINDOWS
+
+// Attempts to parse a string into a positive integer pointed to by the
+// number parameter.  Returns true if that is possible.
+// GTEST_HAS_DEATH_TEST implies that we have ::std::string, so we can use
+// it here.
+template <typename Integer>
+bool ParseNaturalNumber(const ::std::string& str, Integer* number) {
+  // Fail fast if the given string does not begin with a digit;
+  // this bypasses strtoXXX's "optional leading whitespace and plus
+  // or minus sign" semantics, which are undesirable here.
+  if (str.empty() || !IsDigit(str[0])) {
+    return false;
+  }
+  errno = 0;
+
+  char* end;
+  // BiggestConvertible is the largest integer type that system-provided
+  // string-to-number conversion routines can return.
+
+# if GTEST_OS_WINDOWS && !defined(__GNUC__)
+
+  // MSVC and C++ Builder define __int64 instead of the standard long long.
+  typedef unsigned __int64 BiggestConvertible;
+  const BiggestConvertible parsed = _strtoui64(str.c_str(), &end, 10);
+
+# else
+
+  typedef unsigned long long BiggestConvertible;  // NOLINT
+  const BiggestConvertible parsed = strtoull(str.c_str(), &end, 10);
+
+# endif  // GTEST_OS_WINDOWS && !defined(__GNUC__)
+
+  const bool parse_success = *end == '\0' && errno == 0;
+
+  // TODO(vladl at google.com): Convert this to compile time assertion when it is
+  // available.
+  GTEST_CHECK_(sizeof(Integer) <= sizeof(parsed));
+
+  const Integer result = static_cast<Integer>(parsed);
+  if (parse_success && static_cast<BiggestConvertible>(result) == parsed) {
+    *number = result;
+    return true;
+  }
+  return false;
+}
+#endif  // GTEST_HAS_DEATH_TEST
+
+// TestResult contains some private methods that should be hidden from
+// Google Test user but are required for testing. This class allow our tests
+// to access them.
+//
+// This class is supplied only for the purpose of testing Google Test's own
+// constructs. Do not use it in user tests, either directly or indirectly.
+class TestResultAccessor {
+ public:
+  static void RecordProperty(TestResult* test_result,
+                             const std::string& xml_element,
+                             const TestProperty& property) {
+    test_result->RecordProperty(xml_element, property);
+  }
+
+  static void ClearTestPartResults(TestResult* test_result) {
+    test_result->ClearTestPartResults();
+  }
+
+  static const std::vector<testing::TestPartResult>& test_part_results(
+      const TestResult& test_result) {
+    return test_result.test_part_results();
+  }
+};
+
+#if GTEST_CAN_STREAM_RESULTS_
+
+// Streams test results to the given port on the given host machine.
+class StreamingListener : public EmptyTestEventListener {
+ public:
+  // Abstract base class for writing strings to a socket.
+  class AbstractSocketWriter {
+   public:
+    virtual ~AbstractSocketWriter() {}
+
+    // Sends a string to the socket.
+    virtual void Send(const string& message) = 0;
+
+    // Closes the socket.
+    virtual void CloseConnection() {}
+
+    // Sends a string and a newline to the socket.
+    void SendLn(const string& message) {
+      Send(message + "\n");
+    }
+  };
+
+  // Concrete class for actually writing strings to a socket.
+  class SocketWriter : public AbstractSocketWriter {
+   public:
+    SocketWriter(const string& host, const string& port)
+        : sockfd_(-1), host_name_(host), port_num_(port) {
+      MakeConnection();
+    }
+
+    virtual ~SocketWriter() {
+      if (sockfd_ != -1)
+        CloseConnection();
+    }
+
+    // Sends a string to the socket.
+    virtual void Send(const string& message) {
+      GTEST_CHECK_(sockfd_ != -1)
+          << "Send() can be called only when there is a connection.";
+
+      const int len = static_cast<int>(message.length());
+      if (write(sockfd_, message.c_str(), len) != len) {
+        GTEST_LOG_(WARNING)
+            << "stream_result_to: failed to stream to "
+            << host_name_ << ":" << port_num_;
+      }
+    }
+
+   private:
+    // Creates a client socket and connects to the server.
+    void MakeConnection();
+
+    // Closes the socket.
+    void CloseConnection() {
+      GTEST_CHECK_(sockfd_ != -1)
+          << "CloseConnection() can be called only when there is a connection.";
+
+      close(sockfd_);
+      sockfd_ = -1;
+    }
+
+    int sockfd_;  // socket file descriptor
+    const string host_name_;
+    const string port_num_;
+
+    GTEST_DISALLOW_COPY_AND_ASSIGN_(SocketWriter);
+  };  // class SocketWriter
+
+  // Escapes '=', '&', '%', and '\n' characters in str as "%xx".
+  static string UrlEncode(const char* str);
+
+  StreamingListener(const string& host, const string& port)
+      : socket_writer_(new SocketWriter(host, port)) { Start(); }
+
+  explicit StreamingListener(AbstractSocketWriter* socket_writer)
+      : socket_writer_(socket_writer) { Start(); }
+
+  void OnTestProgramStart(const UnitTest& /* unit_test */) {
+    SendLn("event=TestProgramStart");
+  }
+
+  void OnTestProgramEnd(const UnitTest& unit_test) {
+    // Note that Google Test current only report elapsed time for each
+    // test iteration, not for the entire test program.
+    SendLn("event=TestProgramEnd&passed=" + FormatBool(unit_test.Passed()));
+
+    // Notify the streaming server to stop.
+    socket_writer_->CloseConnection();
+  }
+
+  void OnTestIterationStart(const UnitTest& /* unit_test */, int iteration) {
+    SendLn("event=TestIterationStart&iteration=" +
+           StreamableToString(iteration));
+  }
+
+  void OnTestIterationEnd(const UnitTest& unit_test, int /* iteration */) {
+    SendLn("event=TestIterationEnd&passed=" +
+           FormatBool(unit_test.Passed()) + "&elapsed_time=" +
+           StreamableToString(unit_test.elapsed_time()) + "ms");
+  }
+
+  void OnTestCaseStart(const TestCase& test_case) {
+    SendLn(std::string("event=TestCaseStart&name=") + test_case.name());
+  }
+
+  void OnTestCaseEnd(const TestCase& test_case) {
+    SendLn("event=TestCaseEnd&passed=" + FormatBool(test_case.Passed())
+           + "&elapsed_time=" + StreamableToString(test_case.elapsed_time())
+           + "ms");
+  }
+
+  void OnTestStart(const TestInfo& test_info) {
+    SendLn(std::string("event=TestStart&name=") + test_info.name());
+  }
+
+  void OnTestEnd(const TestInfo& test_info) {
+    SendLn("event=TestEnd&passed=" +
+           FormatBool((test_info.result())->Passed()) +
+           "&elapsed_time=" +
+           StreamableToString((test_info.result())->elapsed_time()) + "ms");
+  }
+
+  void OnTestPartResult(const TestPartResult& test_part_result) {
+    const char* file_name = test_part_result.file_name();
+    if (file_name == NULL)
+      file_name = "";
+    SendLn("event=TestPartResult&file=" + UrlEncode(file_name) +
+           "&line=" + StreamableToString(test_part_result.line_number()) +
+           "&message=" + UrlEncode(test_part_result.message()));
+  }
+
+ private:
+  // Sends the given message and a newline to the socket.
+  void SendLn(const string& message) { socket_writer_->SendLn(message); }
+
+  // Called at the start of streaming to notify the receiver what
+  // protocol we are using.
+  void Start() { SendLn("gtest_streaming_protocol_version=1.0"); }
+
+  string FormatBool(bool value) { return value ? "1" : "0"; }
+
+  const scoped_ptr<AbstractSocketWriter> socket_writer_;
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(StreamingListener);
+};  // class StreamingListener
+
+#endif  // GTEST_CAN_STREAM_RESULTS_
+
+}  // namespace internal
+}  // namespace testing
+
+#endif  // GTEST_SRC_GTEST_INTERNAL_INL_H_
diff --git a/contrib/gtest-1.7.0/src/gtest-port.cc b/contrib/gtest-1.7.0/src/gtest-port.cc
new file mode 100644
index 0000000..0c4df5f
--- /dev/null
+++ b/contrib/gtest-1.7.0/src/gtest-port.cc
@@ -0,0 +1,805 @@
+// Copyright 2008, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+
+#include "gtest/internal/gtest-port.h"
+
+#include <limits.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+#if GTEST_OS_WINDOWS_MOBILE
+# include <windows.h>  // For TerminateProcess()
+#elif GTEST_OS_WINDOWS
+# include <io.h>
+# include <sys/stat.h>
+#else
+# include <unistd.h>
+#endif  // GTEST_OS_WINDOWS_MOBILE
+
+#if GTEST_OS_MAC
+# include <mach/mach_init.h>
+# include <mach/task.h>
+# include <mach/vm_map.h>
+#endif  // GTEST_OS_MAC
+
+#if GTEST_OS_QNX
+# include <devctl.h>
+# include <sys/procfs.h>
+#endif  // GTEST_OS_QNX
+
+#include "gtest/gtest-spi.h"
+#include "gtest/gtest-message.h"
+#include "gtest/internal/gtest-internal.h"
+#include "gtest/internal/gtest-string.h"
+
+// Indicates that this translation unit is part of Google Test's
+// implementation.  It must come before gtest-internal-inl.h is
+// included, or there will be a compiler error.  This trick is to
+// prevent a user from accidentally including gtest-internal-inl.h in
+// his code.
+#define GTEST_IMPLEMENTATION_ 1
+#include "src/gtest-internal-inl.h"
+#undef GTEST_IMPLEMENTATION_
+
+namespace testing {
+namespace internal {
+
+#if defined(_MSC_VER) || defined(__BORLANDC__)
+// MSVC and C++Builder do not provide a definition of STDERR_FILENO.
+const int kStdOutFileno = 1;
+const int kStdErrFileno = 2;
+#else
+const int kStdOutFileno = STDOUT_FILENO;
+const int kStdErrFileno = STDERR_FILENO;
+#endif  // _MSC_VER
+
+#if GTEST_OS_MAC
+
+// Returns the number of threads running in the process, or 0 to indicate that
+// we cannot detect it.
+size_t GetThreadCount() {
+  const task_t task = mach_task_self();
+  mach_msg_type_number_t thread_count;
+  thread_act_array_t thread_list;
+  const kern_return_t status = task_threads(task, &thread_list, &thread_count);
+  if (status == KERN_SUCCESS) {
+    // task_threads allocates resources in thread_list and we need to free them
+    // to avoid leaks.
+    vm_deallocate(task,
+                  reinterpret_cast<vm_address_t>(thread_list),
+                  sizeof(thread_t) * thread_count);
+    return static_cast<size_t>(thread_count);
+  } else {
+    return 0;
+  }
+}
+
+#elif GTEST_OS_QNX
+
+// Returns the number of threads running in the process, or 0 to indicate that
+// we cannot detect it.
+size_t GetThreadCount() {
+  const int fd = open("/proc/self/as", O_RDONLY);
+  if (fd < 0) {
+    return 0;
+  }
+  procfs_info process_info;
+  const int status =
+      devctl(fd, DCMD_PROC_INFO, &process_info, sizeof(process_info), NULL);
+  close(fd);
+  if (status == EOK) {
+    return static_cast<size_t>(process_info.num_threads);
+  } else {
+    return 0;
+  }
+}
+
+#else
+
+size_t GetThreadCount() {
+  // There's no portable way to detect the number of threads, so we just
+  // return 0 to indicate that we cannot detect it.
+  return 0;
+}
+
+#endif  // GTEST_OS_MAC
+
+#if GTEST_USES_POSIX_RE
+
+// Implements RE.  Currently only needed for death tests.
+
+RE::~RE() {
+  if (is_valid_) {
+    // regfree'ing an invalid regex might crash because the content
+    // of the regex is undefined. Since the regex's are essentially
+    // the same, one cannot be valid (or invalid) without the other
+    // being so too.
+    regfree(&partial_regex_);
+    regfree(&full_regex_);
+  }
+  free(const_cast<char*>(pattern_));
+}
+
+// Returns true iff regular expression re matches the entire str.
+bool RE::FullMatch(const char* str, const RE& re) {
+  if (!re.is_valid_) return false;
+
+  regmatch_t match;
+  return regexec(&re.full_regex_, str, 1, &match, 0) == 0;
+}
+
+// Returns true iff regular expression re matches a substring of str
+// (including str itself).
+bool RE::PartialMatch(const char* str, const RE& re) {
+  if (!re.is_valid_) return false;
+
+  regmatch_t match;
+  return regexec(&re.partial_regex_, str, 1, &match, 0) == 0;
+}
+
+// Initializes an RE from its string representation.
+void RE::Init(const char* regex) {
+  pattern_ = posix::StrDup(regex);
+
+  // Reserves enough bytes to hold the regular expression used for a
+  // full match.
+  const size_t full_regex_len = strlen(regex) + 10;
+  char* const full_pattern = new char[full_regex_len];
+
+  snprintf(full_pattern, full_regex_len, "^(%s)$", regex);
+  is_valid_ = regcomp(&full_regex_, full_pattern, REG_EXTENDED) == 0;
+  // We want to call regcomp(&partial_regex_, ...) even if the
+  // previous expression returns false.  Otherwise partial_regex_ may
+  // not be properly initialized can may cause trouble when it's
+  // freed.
+  //
+  // Some implementation of POSIX regex (e.g. on at least some
+  // versions of Cygwin) doesn't accept the empty string as a valid
+  // regex.  We change it to an equivalent form "()" to be safe.
+  if (is_valid_) {
+    const char* const partial_regex = (*regex == '\0') ? "()" : regex;
+    is_valid_ = regcomp(&partial_regex_, partial_regex, REG_EXTENDED) == 0;
+  }
+  EXPECT_TRUE(is_valid_)
+      << "Regular expression \"" << regex
+      << "\" is not a valid POSIX Extended regular expression.";
+
+  delete[] full_pattern;
+}
+
+#elif GTEST_USES_SIMPLE_RE
+
+// Returns true iff ch appears anywhere in str (excluding the
+// terminating '\0' character).
+bool IsInSet(char ch, const char* str) {
+  return ch != '\0' && strchr(str, ch) != NULL;
+}
+
+// Returns true iff ch belongs to the given classification.  Unlike
+// similar functions in <ctype.h>, these aren't affected by the
+// current locale.
+bool IsAsciiDigit(char ch) { return '0' <= ch && ch <= '9'; }
+bool IsAsciiPunct(char ch) {
+  return IsInSet(ch, "^-!\"#$%&'()*+,./:;<=>?@[\\]_`{|}~");
+}
+bool IsRepeat(char ch) { return IsInSet(ch, "?*+"); }
+bool IsAsciiWhiteSpace(char ch) { return IsInSet(ch, " \f\n\r\t\v"); }
+bool IsAsciiWordChar(char ch) {
+  return ('a' <= ch && ch <= 'z') || ('A' <= ch && ch <= 'Z') ||
+      ('0' <= ch && ch <= '9') || ch == '_';
+}
+
+// Returns true iff "\\c" is a supported escape sequence.
+bool IsValidEscape(char c) {
+  return (IsAsciiPunct(c) || IsInSet(c, "dDfnrsStvwW"));
+}
+
+// Returns true iff the given atom (specified by escaped and pattern)
+// matches ch.  The result is undefined if the atom is invalid.
+bool AtomMatchesChar(bool escaped, char pattern_char, char ch) {
+  if (escaped) {  // "\\p" where p is pattern_char.
+    switch (pattern_char) {
+      case 'd': return IsAsciiDigit(ch);
+      case 'D': return !IsAsciiDigit(ch);
+      case 'f': return ch == '\f';
+      case 'n': return ch == '\n';
+      case 'r': return ch == '\r';
+      case 's': return IsAsciiWhiteSpace(ch);
+      case 'S': return !IsAsciiWhiteSpace(ch);
+      case 't': return ch == '\t';
+      case 'v': return ch == '\v';
+      case 'w': return IsAsciiWordChar(ch);
+      case 'W': return !IsAsciiWordChar(ch);
+    }
+    return IsAsciiPunct(pattern_char) && pattern_char == ch;
+  }
+
+  return (pattern_char == '.' && ch != '\n') || pattern_char == ch;
+}
+
+// Helper function used by ValidateRegex() to format error messages.
+std::string FormatRegexSyntaxError(const char* regex, int index) {
+  return (Message() << "Syntax error at index " << index
+          << " in simple regular expression \"" << regex << "\": ").GetString();
+}
+
+// Generates non-fatal failures and returns false if regex is invalid;
+// otherwise returns true.
+bool ValidateRegex(const char* regex) {
+  if (regex == NULL) {
+    // TODO(wan at google.com): fix the source file location in the
+    // assertion failures to match where the regex is used in user
+    // code.
+    ADD_FAILURE() << "NULL is not a valid simple regular expression.";
+    return false;
+  }
+
+  bool is_valid = true;
+
+  // True iff ?, *, or + can follow the previous atom.
+  bool prev_repeatable = false;
+  for (int i = 0; regex[i]; i++) {
+    if (regex[i] == '\\') {  // An escape sequence
+      i++;
+      if (regex[i] == '\0') {
+        ADD_FAILURE() << FormatRegexSyntaxError(regex, i - 1)
+                      << "'\\' cannot appear at the end.";
+        return false;
+      }
+
+      if (!IsValidEscape(regex[i])) {
+        ADD_FAILURE() << FormatRegexSyntaxError(regex, i - 1)
+                      << "invalid escape sequence \"\\" << regex[i] << "\".";
+        is_valid = false;
+      }
+      prev_repeatable = true;
+    } else {  // Not an escape sequence.
+      const char ch = regex[i];
+
+      if (ch == '^' && i > 0) {
+        ADD_FAILURE() << FormatRegexSyntaxError(regex, i)
+                      << "'^' can only appear at the beginning.";
+        is_valid = false;
+      } else if (ch == '$' && regex[i + 1] != '\0') {
+        ADD_FAILURE() << FormatRegexSyntaxError(regex, i)
+                      << "'$' can only appear at the end.";
+        is_valid = false;
+      } else if (IsInSet(ch, "()[]{}|")) {
+        ADD_FAILURE() << FormatRegexSyntaxError(regex, i)
+                      << "'" << ch << "' is unsupported.";
+        is_valid = false;
+      } else if (IsRepeat(ch) && !prev_repeatable) {
+        ADD_FAILURE() << FormatRegexSyntaxError(regex, i)
+                      << "'" << ch << "' can only follow a repeatable token.";
+        is_valid = false;
+      }
+
+      prev_repeatable = !IsInSet(ch, "^$?*+");
+    }
+  }
+
+  return is_valid;
+}
+
+// Matches a repeated regex atom followed by a valid simple regular
+// expression.  The regex atom is defined as c if escaped is false,
+// or \c otherwise.  repeat is the repetition meta character (?, *,
+// or +).  The behavior is undefined if str contains too many
+// characters to be indexable by size_t, in which case the test will
+// probably time out anyway.  We are fine with this limitation as
+// std::string has it too.
+bool MatchRepetitionAndRegexAtHead(
+    bool escaped, char c, char repeat, const char* regex,
+    const char* str) {
+  const size_t min_count = (repeat == '+') ? 1 : 0;
+  const size_t max_count = (repeat == '?') ? 1 :
+      static_cast<size_t>(-1) - 1;
+  // We cannot call numeric_limits::max() as it conflicts with the
+  // max() macro on Windows.
+
+  for (size_t i = 0; i <= max_count; ++i) {
+    // We know that the atom matches each of the first i characters in str.
+    if (i >= min_count && MatchRegexAtHead(regex, str + i)) {
+      // We have enough matches at the head, and the tail matches too.
+      // Since we only care about *whether* the pattern matches str
+      // (as opposed to *how* it matches), there is no need to find a
+      // greedy match.
+      return true;
+    }
+    if (str[i] == '\0' || !AtomMatchesChar(escaped, c, str[i]))
+      return false;
+  }
+  return false;
+}
+
+// Returns true iff regex matches a prefix of str.  regex must be a
+// valid simple regular expression and not start with "^", or the
+// result is undefined.
+bool MatchRegexAtHead(const char* regex, const char* str) {
+  if (*regex == '\0')  // An empty regex matches a prefix of anything.
+    return true;
+
+  // "$" only matches the end of a string.  Note that regex being
+  // valid guarantees that there's nothing after "$" in it.
+  if (*regex == '$')
+    return *str == '\0';
+
+  // Is the first thing in regex an escape sequence?
+  const bool escaped = *regex == '\\';
+  if (escaped)
+    ++regex;
+  if (IsRepeat(regex[1])) {
+    // MatchRepetitionAndRegexAtHead() calls MatchRegexAtHead(), so
+    // here's an indirect recursion.  It terminates as the regex gets
+    // shorter in each recursion.
+    return MatchRepetitionAndRegexAtHead(
+        escaped, regex[0], regex[1], regex + 2, str);
+  } else {
+    // regex isn't empty, isn't "$", and doesn't start with a
+    // repetition.  We match the first atom of regex with the first
+    // character of str and recurse.
+    return (*str != '\0') && AtomMatchesChar(escaped, *regex, *str) &&
+        MatchRegexAtHead(regex + 1, str + 1);
+  }
+}
+
+// Returns true iff regex matches any substring of str.  regex must be
+// a valid simple regular expression, or the result is undefined.
+//
+// The algorithm is recursive, but the recursion depth doesn't exceed
+// the regex length, so we won't need to worry about running out of
+// stack space normally.  In rare cases the time complexity can be
+// exponential with respect to the regex length + the string length,
+// but usually it's must faster (often close to linear).
+bool MatchRegexAnywhere(const char* regex, const char* str) {
+  if (regex == NULL || str == NULL)
+    return false;
+
+  if (*regex == '^')
+    return MatchRegexAtHead(regex + 1, str);
+
+  // A successful match can be anywhere in str.
+  do {
+    if (MatchRegexAtHead(regex, str))
+      return true;
+  } while (*str++ != '\0');
+  return false;
+}
+
+// Implements the RE class.
+
+RE::~RE() {
+  free(const_cast<char*>(pattern_));
+  free(const_cast<char*>(full_pattern_));
+}
+
+// Returns true iff regular expression re matches the entire str.
+bool RE::FullMatch(const char* str, const RE& re) {
+  return re.is_valid_ && MatchRegexAnywhere(re.full_pattern_, str);
+}
+
+// Returns true iff regular expression re matches a substring of str
+// (including str itself).
+bool RE::PartialMatch(const char* str, const RE& re) {
+  return re.is_valid_ && MatchRegexAnywhere(re.pattern_, str);
+}
+
+// Initializes an RE from its string representation.
+void RE::Init(const char* regex) {
+  pattern_ = full_pattern_ = NULL;
+  if (regex != NULL) {
+    pattern_ = posix::StrDup(regex);
+  }
+
+  is_valid_ = ValidateRegex(regex);
+  if (!is_valid_) {
+    // No need to calculate the full pattern when the regex is invalid.
+    return;
+  }
+
+  const size_t len = strlen(regex);
+  // Reserves enough bytes to hold the regular expression used for a
+  // full match: we need space to prepend a '^', append a '$', and
+  // terminate the string with '\0'.
+  char* buffer = static_cast<char*>(malloc(len + 3));
+  full_pattern_ = buffer;
+
+  if (*regex != '^')
+    *buffer++ = '^';  // Makes sure full_pattern_ starts with '^'.
+
+  // We don't use snprintf or strncpy, as they trigger a warning when
+  // compiled with VC++ 8.0.
+  memcpy(buffer, regex, len);
+  buffer += len;
+
+  if (len == 0 || regex[len - 1] != '$')
+    *buffer++ = '$';  // Makes sure full_pattern_ ends with '$'.
+
+  *buffer = '\0';
+}
+
+#endif  // GTEST_USES_POSIX_RE
+
+const char kUnknownFile[] = "unknown file";
+
+// Formats a source file path and a line number as they would appear
+// in an error message from the compiler used to compile this code.
+GTEST_API_ ::std::string FormatFileLocation(const char* file, int line) {
+  const std::string file_name(file == NULL ? kUnknownFile : file);
+
+  if (line < 0) {
+    return file_name + ":";
+  }
+#ifdef _MSC_VER
+  return file_name + "(" + StreamableToString(line) + "):";
+#else
+  return file_name + ":" + StreamableToString(line) + ":";
+#endif  // _MSC_VER
+}
+
+// Formats a file location for compiler-independent XML output.
+// Although this function is not platform dependent, we put it next to
+// FormatFileLocation in order to contrast the two functions.
+// Note that FormatCompilerIndependentFileLocation() does NOT append colon
+// to the file location it produces, unlike FormatFileLocation().
+GTEST_API_ ::std::string FormatCompilerIndependentFileLocation(
+    const char* file, int line) {
+  const std::string file_name(file == NULL ? kUnknownFile : file);
+
+  if (line < 0)
+    return file_name;
+  else
+    return file_name + ":" + StreamableToString(line);
+}
+
+
+GTestLog::GTestLog(GTestLogSeverity severity, const char* file, int line)
+    : severity_(severity) {
+  const char* const marker =
+      severity == GTEST_INFO ?    "[  INFO ]" :
+      severity == GTEST_WARNING ? "[WARNING]" :
+      severity == GTEST_ERROR ?   "[ ERROR ]" : "[ FATAL ]";
+  GetStream() << ::std::endl << marker << " "
+              << FormatFileLocation(file, line).c_str() << ": ";
+}
+
+// Flushes the buffers and, if severity is GTEST_FATAL, aborts the program.
+GTestLog::~GTestLog() {
+  GetStream() << ::std::endl;
+  if (severity_ == GTEST_FATAL) {
+    fflush(stderr);
+    posix::Abort();
+  }
+}
+// Disable Microsoft deprecation warnings for POSIX functions called from
+// this class (creat, dup, dup2, and close)
+#ifdef _MSC_VER
+# pragma warning(push)
+# pragma warning(disable: 4996)
+#endif  // _MSC_VER
+
+#if GTEST_HAS_STREAM_REDIRECTION
+
+// Object that captures an output stream (stdout/stderr).
+class CapturedStream {
+ public:
+  // The ctor redirects the stream to a temporary file.
+  explicit CapturedStream(int fd) : fd_(fd), uncaptured_fd_(dup(fd)) {
+# if GTEST_OS_WINDOWS
+    char temp_dir_path[MAX_PATH + 1] = { '\0' };  // NOLINT
+    char temp_file_path[MAX_PATH + 1] = { '\0' };  // NOLINT
+
+    ::GetTempPathA(sizeof(temp_dir_path), temp_dir_path);
+    const UINT success = ::GetTempFileNameA(temp_dir_path,
+                                            "gtest_redir",
+                                            0,  // Generate unique file name.
+                                            temp_file_path);
+    GTEST_CHECK_(success != 0)
+        << "Unable to create a temporary file in " << temp_dir_path;
+    const int captured_fd = creat(temp_file_path, _S_IREAD | _S_IWRITE);
+    GTEST_CHECK_(captured_fd != -1) << "Unable to open temporary file "
+                                    << temp_file_path;
+    filename_ = temp_file_path;
+# else
+    // There's no guarantee that a test has write access to the current
+    // directory, so we create the temporary file in the /tmp directory
+    // instead. We use /tmp on most systems, and /sdcard on Android.
+    // That's because Android doesn't have /tmp.
+#  if GTEST_OS_LINUX_ANDROID
+    // Note: Android applications are expected to call the framework's
+    // Context.getExternalStorageDirectory() method through JNI to get
+    // the location of the world-writable SD Card directory. However,
+    // this requires a Context handle, which cannot be retrieved
+    // globally from native code. Doing so also precludes running the
+    // code as part of a regular standalone executable, which doesn't
+    // run in a Dalvik process (e.g. when running it through 'adb shell').
+    //
+    // The location /sdcard is directly accessible from native code
+    // and is the only location (unofficially) supported by the Android
+    // team. It's generally a symlink to the real SD Card mount point
+    // which can be /mnt/sdcard, /mnt/sdcard0, /system/media/sdcard, or
+    // other OEM-customized locations. Never rely on these, and always
+    // use /sdcard.
+    char name_template[] = "/sdcard/gtest_captured_stream.XXXXXX";
+#  else
+    char name_template[] = "/tmp/captured_stream.XXXXXX";
+#  endif  // GTEST_OS_LINUX_ANDROID
+    const int captured_fd = mkstemp(name_template);
+    filename_ = name_template;
+# endif  // GTEST_OS_WINDOWS
+    fflush(NULL);
+    dup2(captured_fd, fd_);
+    close(captured_fd);
+  }
+
+  ~CapturedStream() {
+    remove(filename_.c_str());
+  }
+
+  std::string GetCapturedString() {
+    if (uncaptured_fd_ != -1) {
+      // Restores the original stream.
+      fflush(NULL);
+      dup2(uncaptured_fd_, fd_);
+      close(uncaptured_fd_);
+      uncaptured_fd_ = -1;
+    }
+
+    FILE* const file = posix::FOpen(filename_.c_str(), "r");
+    const std::string content = ReadEntireFile(file);
+    posix::FClose(file);
+    return content;
+  }
+
+ private:
+  // Reads the entire content of a file as an std::string.
+  static std::string ReadEntireFile(FILE* file);
+
+  // Returns the size (in bytes) of a file.
+  static size_t GetFileSize(FILE* file);
+
+  const int fd_;  // A stream to capture.
+  int uncaptured_fd_;
+  // Name of the temporary file holding the stderr output.
+  ::std::string filename_;
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(CapturedStream);
+};
+
+// Returns the size (in bytes) of a file.
+size_t CapturedStream::GetFileSize(FILE* file) {
+  fseek(file, 0, SEEK_END);
+  return static_cast<size_t>(ftell(file));
+}
+
+// Reads the entire content of a file as a string.
+std::string CapturedStream::ReadEntireFile(FILE* file) {
+  const size_t file_size = GetFileSize(file);
+  char* const buffer = new char[file_size];
+
+  size_t bytes_last_read = 0;  // # of bytes read in the last fread()
+  size_t bytes_read = 0;       // # of bytes read so far
+
+  fseek(file, 0, SEEK_SET);
+
+  // Keeps reading the file until we cannot read further or the
+  // pre-determined file size is reached.
+  do {
+    bytes_last_read = fread(buffer+bytes_read, 1, file_size-bytes_read, file);
+    bytes_read += bytes_last_read;
+  } while (bytes_last_read > 0 && bytes_read < file_size);
+
+  const std::string content(buffer, bytes_read);
+  delete[] buffer;
+
+  return content;
+}
+
+# ifdef _MSC_VER
+#  pragma warning(pop)
+# endif  // _MSC_VER
+
+static CapturedStream* g_captured_stderr = NULL;
+static CapturedStream* g_captured_stdout = NULL;
+
+// Starts capturing an output stream (stdout/stderr).
+void CaptureStream(int fd, const char* stream_name, CapturedStream** stream) {
+  if (*stream != NULL) {
+    GTEST_LOG_(FATAL) << "Only one " << stream_name
+                      << " capturer can exist at a time.";
+  }
+  *stream = new CapturedStream(fd);
+}
+
+// Stops capturing the output stream and returns the captured string.
+std::string GetCapturedStream(CapturedStream** captured_stream) {
+  const std::string content = (*captured_stream)->GetCapturedString();
+
+  delete *captured_stream;
+  *captured_stream = NULL;
+
+  return content;
+}
+
+// Starts capturing stdout.
+void CaptureStdout() {
+  CaptureStream(kStdOutFileno, "stdout", &g_captured_stdout);
+}
+
+// Starts capturing stderr.
+void CaptureStderr() {
+  CaptureStream(kStdErrFileno, "stderr", &g_captured_stderr);
+}
+
+// Stops capturing stdout and returns the captured string.
+std::string GetCapturedStdout() {
+  return GetCapturedStream(&g_captured_stdout);
+}
+
+// Stops capturing stderr and returns the captured string.
+std::string GetCapturedStderr() {
+  return GetCapturedStream(&g_captured_stderr);
+}
+
+#endif  // GTEST_HAS_STREAM_REDIRECTION
+
+#if GTEST_HAS_DEATH_TEST
+
+// A copy of all command line arguments.  Set by InitGoogleTest().
+::std::vector<testing::internal::string> g_argvs;
+
+static const ::std::vector<testing::internal::string>* g_injected_test_argvs =
+                                        NULL;  // Owned.
+
+void SetInjectableArgvs(const ::std::vector<testing::internal::string>* argvs) {
+  if (g_injected_test_argvs != argvs)
+    delete g_injected_test_argvs;
+  g_injected_test_argvs = argvs;
+}
+
+const ::std::vector<testing::internal::string>& GetInjectableArgvs() {
+  if (g_injected_test_argvs != NULL) {
+    return *g_injected_test_argvs;
+  }
+  return g_argvs;
+}
+#endif  // GTEST_HAS_DEATH_TEST
+
+#if GTEST_OS_WINDOWS_MOBILE
+namespace posix {
+void Abort() {
+  DebugBreak();
+  TerminateProcess(GetCurrentProcess(), 1);
+}
+}  // namespace posix
+#endif  // GTEST_OS_WINDOWS_MOBILE
+
+// Returns the name of the environment variable corresponding to the
+// given flag.  For example, FlagToEnvVar("foo") will return
+// "GTEST_FOO" in the open-source version.
+static std::string FlagToEnvVar(const char* flag) {
+  const std::string full_flag =
+      (Message() << GTEST_FLAG_PREFIX_ << flag).GetString();
+
+  Message env_var;
+  for (size_t i = 0; i != full_flag.length(); i++) {
+    env_var << ToUpper(full_flag.c_str()[i]);
+  }
+
+  return env_var.GetString();
+}
+
+// Parses 'str' for a 32-bit signed integer.  If successful, writes
+// the result to *value and returns true; otherwise leaves *value
+// unchanged and returns false.
+bool ParseInt32(const Message& src_text, const char* str, Int32* value) {
+  // Parses the environment variable as a decimal integer.
+  char* end = NULL;
+  const long long_value = strtol(str, &end, 10);  // NOLINT
+
+  // Has strtol() consumed all characters in the string?
+  if (*end != '\0') {
+    // No - an invalid character was encountered.
+    Message msg;
+    msg << "WARNING: " << src_text
+        << " is expected to be a 32-bit integer, but actually"
+        << " has value \"" << str << "\".\n";
+    printf("%s", msg.GetString().c_str());
+    fflush(stdout);
+    return false;
+  }
+
+  // Is the parsed value in the range of an Int32?
+  const Int32 result = static_cast<Int32>(long_value);
+  if (long_value == LONG_MAX || long_value == LONG_MIN ||
+      // The parsed value overflows as a long.  (strtol() returns
+      // LONG_MAX or LONG_MIN when the input overflows.)
+      result != long_value
+      // The parsed value overflows as an Int32.
+      ) {
+    Message msg;
+    msg << "WARNING: " << src_text
+        << " is expected to be a 32-bit integer, but actually"
+        << " has value " << str << ", which overflows.\n";
+    printf("%s", msg.GetString().c_str());
+    fflush(stdout);
+    return false;
+  }
+
+  *value = result;
+  return true;
+}
+
+// Reads and returns the Boolean environment variable corresponding to
+// the given flag; if it's not set, returns default_value.
+//
+// The value is considered true iff it's not "0".
+bool BoolFromGTestEnv(const char* flag, bool default_value) {
+  const std::string env_var = FlagToEnvVar(flag);
+  const char* const string_value = posix::GetEnv(env_var.c_str());
+  return string_value == NULL ?
+      default_value : strcmp(string_value, "0") != 0;
+}
+
+// Reads and returns a 32-bit integer stored in the environment
+// variable corresponding to the given flag; if it isn't set or
+// doesn't represent a valid 32-bit integer, returns default_value.
+Int32 Int32FromGTestEnv(const char* flag, Int32 default_value) {
+  const std::string env_var = FlagToEnvVar(flag);
+  const char* const string_value = posix::GetEnv(env_var.c_str());
+  if (string_value == NULL) {
+    // The environment variable is not set.
+    return default_value;
+  }
+
+  Int32 result = default_value;
+  if (!ParseInt32(Message() << "Environment variable " << env_var,
+                  string_value, &result)) {
+    printf("The default value %s is used.\n",
+           (Message() << default_value).GetString().c_str());
+    fflush(stdout);
+    return default_value;
+  }
+
+  return result;
+}
+
+// Reads and returns the string environment variable corresponding to
+// the given flag; if it's not set, returns default_value.
+const char* StringFromGTestEnv(const char* flag, const char* default_value) {
+  const std::string env_var = FlagToEnvVar(flag);
+  const char* const value = posix::GetEnv(env_var.c_str());
+  return value == NULL ? default_value : value;
+}
+
+}  // namespace internal
+}  // namespace testing
diff --git a/contrib/gtest-1.7.0/src/gtest-printers.cc b/contrib/gtest-1.7.0/src/gtest-printers.cc
new file mode 100644
index 0000000..75fa408
--- /dev/null
+++ b/contrib/gtest-1.7.0/src/gtest-printers.cc
@@ -0,0 +1,363 @@
+// Copyright 2007, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+
+// Google Test - The Google C++ Testing Framework
+//
+// This file implements a universal value printer that can print a
+// value of any type T:
+//
+//   void ::testing::internal::UniversalPrinter<T>::Print(value, ostream_ptr);
+//
+// It uses the << operator when possible, and prints the bytes in the
+// object otherwise.  A user can override its behavior for a class
+// type Foo by defining either operator<<(::std::ostream&, const Foo&)
+// or void PrintTo(const Foo&, ::std::ostream*) in the namespace that
+// defines Foo.
+
+#include "gtest/gtest-printers.h"
+#include <ctype.h>
+#include <stdio.h>
+#include <ostream>  // NOLINT
+#include <string>
+#include "gtest/internal/gtest-port.h"
+
+namespace testing {
+
+namespace {
+
+using ::std::ostream;
+
+// Prints a segment of bytes in the given object.
+void PrintByteSegmentInObjectTo(const unsigned char* obj_bytes, size_t start,
+                                size_t count, ostream* os) {
+  char text[5] = "";
+  for (size_t i = 0; i != count; i++) {
+    const size_t j = start + i;
+    if (i != 0) {
+      // Organizes the bytes into groups of 2 for easy parsing by
+      // human.
+      if ((j % 2) == 0)
+        *os << ' ';
+      else
+        *os << '-';
+    }
+    GTEST_SNPRINTF_(text, sizeof(text), "%02X", obj_bytes[j]);
+    *os << text;
+  }
+}
+
+// Prints the bytes in the given value to the given ostream.
+void PrintBytesInObjectToImpl(const unsigned char* obj_bytes, size_t count,
+                              ostream* os) {
+  // Tells the user how big the object is.
+  *os << count << "-byte object <";
+
+  const size_t kThreshold = 132;
+  const size_t kChunkSize = 64;
+  // If the object size is bigger than kThreshold, we'll have to omit
+  // some details by printing only the first and the last kChunkSize
+  // bytes.
+  // TODO(wan): let the user control the threshold using a flag.
+  if (count < kThreshold) {
+    PrintByteSegmentInObjectTo(obj_bytes, 0, count, os);
+  } else {
+    PrintByteSegmentInObjectTo(obj_bytes, 0, kChunkSize, os);
+    *os << " ... ";
+    // Rounds up to 2-byte boundary.
+    const size_t resume_pos = (count - kChunkSize + 1)/2*2;
+    PrintByteSegmentInObjectTo(obj_bytes, resume_pos, count - resume_pos, os);
+  }
+  *os << ">";
+}
+
+}  // namespace
+
+namespace internal2 {
+
+// Delegates to PrintBytesInObjectToImpl() to print the bytes in the
+// given object.  The delegation simplifies the implementation, which
+// uses the << operator and thus is easier done outside of the
+// ::testing::internal namespace, which contains a << operator that
+// sometimes conflicts with the one in STL.
+void PrintBytesInObjectTo(const unsigned char* obj_bytes, size_t count,
+                          ostream* os) {
+  PrintBytesInObjectToImpl(obj_bytes, count, os);
+}
+
+}  // namespace internal2
+
+namespace internal {
+
+// Depending on the value of a char (or wchar_t), we print it in one
+// of three formats:
+//   - as is if it's a printable ASCII (e.g. 'a', '2', ' '),
+//   - as a hexidecimal escape sequence (e.g. '\x7F'), or
+//   - as a special escape sequence (e.g. '\r', '\n').
+enum CharFormat {
+  kAsIs,
+  kHexEscape,
+  kSpecialEscape
+};
+
+// Returns true if c is a printable ASCII character.  We test the
+// value of c directly instead of calling isprint(), which is buggy on
+// Windows Mobile.
+inline bool IsPrintableAscii(wchar_t c) {
+  return 0x20 <= c && c <= 0x7E;
+}
+
+// Prints a wide or narrow char c as a character literal without the
+// quotes, escaping it when necessary; returns how c was formatted.
+// The template argument UnsignedChar is the unsigned version of Char,
+// which is the type of c.
+template <typename UnsignedChar, typename Char>
+static CharFormat PrintAsCharLiteralTo(Char c, ostream* os) {
+  switch (static_cast<wchar_t>(c)) {
+    case L'\0':
+      *os << "\\0";
+      break;
+    case L'\'':
+      *os << "\\'";
+      break;
+    case L'\\':
+      *os << "\\\\";
+      break;
+    case L'\a':
+      *os << "\\a";
+      break;
+    case L'\b':
+      *os << "\\b";
+      break;
+    case L'\f':
+      *os << "\\f";
+      break;
+    case L'\n':
+      *os << "\\n";
+      break;
+    case L'\r':
+      *os << "\\r";
+      break;
+    case L'\t':
+      *os << "\\t";
+      break;
+    case L'\v':
+      *os << "\\v";
+      break;
+    default:
+      if (IsPrintableAscii(c)) {
+        *os << static_cast<char>(c);
+        return kAsIs;
+      } else {
+        *os << "\\x" + String::FormatHexInt(static_cast<UnsignedChar>(c));
+        return kHexEscape;
+      }
+  }
+  return kSpecialEscape;
+}
+
+// Prints a wchar_t c as if it's part of a string literal, escaping it when
+// necessary; returns how c was formatted.
+static CharFormat PrintAsStringLiteralTo(wchar_t c, ostream* os) {
+  switch (c) {
+    case L'\'':
+      *os << "'";
+      return kAsIs;
+    case L'"':
+      *os << "\\\"";
+      return kSpecialEscape;
+    default:
+      return PrintAsCharLiteralTo<wchar_t>(c, os);
+  }
+}
+
+// Prints a char c as if it's part of a string literal, escaping it when
+// necessary; returns how c was formatted.
+static CharFormat PrintAsStringLiteralTo(char c, ostream* os) {
+  return PrintAsStringLiteralTo(
+      static_cast<wchar_t>(static_cast<unsigned char>(c)), os);
+}
+
+// Prints a wide or narrow character c and its code.  '\0' is printed
+// as "'\\0'", other unprintable characters are also properly escaped
+// using the standard C++ escape sequence.  The template argument
+// UnsignedChar is the unsigned version of Char, which is the type of c.
+template <typename UnsignedChar, typename Char>
+void PrintCharAndCodeTo(Char c, ostream* os) {
+  // First, print c as a literal in the most readable form we can find.
+  *os << ((sizeof(c) > 1) ? "L'" : "'");
+  const CharFormat format = PrintAsCharLiteralTo<UnsignedChar>(c, os);
+  *os << "'";
+
+  // To aid user debugging, we also print c's code in decimal, unless
+  // it's 0 (in which case c was printed as '\\0', making the code
+  // obvious).
+  if (c == 0)
+    return;
+  *os << " (" << static_cast<int>(c);
+
+  // For more convenience, we print c's code again in hexidecimal,
+  // unless c was already printed in the form '\x##' or the code is in
+  // [1, 9].
+  if (format == kHexEscape || (1 <= c && c <= 9)) {
+    // Do nothing.
+  } else {
+    *os << ", 0x" << String::FormatHexInt(static_cast<UnsignedChar>(c));
+  }
+  *os << ")";
+}
+
+void PrintTo(unsigned char c, ::std::ostream* os) {
+  PrintCharAndCodeTo<unsigned char>(c, os);
+}
+void PrintTo(signed char c, ::std::ostream* os) {
+  PrintCharAndCodeTo<unsigned char>(c, os);
+}
+
+// Prints a wchar_t as a symbol if it is printable or as its internal
+// code otherwise and also as its code.  L'\0' is printed as "L'\\0'".
+void PrintTo(wchar_t wc, ostream* os) {
+  PrintCharAndCodeTo<wchar_t>(wc, os);
+}
+
+// Prints the given array of characters to the ostream.  CharType must be either
+// char or wchar_t.
+// The array starts at begin, the length is len, it may include '\0' characters
+// and may not be NUL-terminated.
+template <typename CharType>
+static void PrintCharsAsStringTo(
+    const CharType* begin, size_t len, ostream* os) {
+  const char* const kQuoteBegin = sizeof(CharType) == 1 ? "\"" : "L\"";
+  *os << kQuoteBegin;
+  bool is_previous_hex = false;
+  for (size_t index = 0; index < len; ++index) {
+    const CharType cur = begin[index];
+    if (is_previous_hex && IsXDigit(cur)) {
+      // Previous character is of '\x..' form and this character can be
+      // interpreted as another hexadecimal digit in its number. Break string to
+      // disambiguate.
+      *os << "\" " << kQuoteBegin;
+    }
+    is_previous_hex = PrintAsStringLiteralTo(cur, os) == kHexEscape;
+  }
+  *os << "\"";
+}
+
+// Prints a (const) char/wchar_t array of 'len' elements, starting at address
+// 'begin'.  CharType must be either char or wchar_t.
+template <typename CharType>
+static void UniversalPrintCharArray(
+    const CharType* begin, size_t len, ostream* os) {
+  // The code
+  //   const char kFoo[] = "foo";
+  // generates an array of 4, not 3, elements, with the last one being '\0'.
+  //
+  // Therefore when printing a char array, we don't print the last element if
+  // it's '\0', such that the output matches the string literal as it's
+  // written in the source code.
+  if (len > 0 && begin[len - 1] == '\0') {
+    PrintCharsAsStringTo(begin, len - 1, os);
+    return;
+  }
+
+  // If, however, the last element in the array is not '\0', e.g.
+  //    const char kFoo[] = { 'f', 'o', 'o' };
+  // we must print the entire array.  We also print a message to indicate
+  // that the array is not NUL-terminated.
+  PrintCharsAsStringTo(begin, len, os);
+  *os << " (no terminating NUL)";
+}
+
+// Prints a (const) char array of 'len' elements, starting at address 'begin'.
+void UniversalPrintArray(const char* begin, size_t len, ostream* os) {
+  UniversalPrintCharArray(begin, len, os);
+}
+
+// Prints a (const) wchar_t array of 'len' elements, starting at address
+// 'begin'.
+void UniversalPrintArray(const wchar_t* begin, size_t len, ostream* os) {
+  UniversalPrintCharArray(begin, len, os);
+}
+
+// Prints the given C string to the ostream.
+void PrintTo(const char* s, ostream* os) {
+  if (s == NULL) {
+    *os << "NULL";
+  } else {
+    *os << ImplicitCast_<const void*>(s) << " pointing to ";
+    PrintCharsAsStringTo(s, strlen(s), os);
+  }
+}
+
+// MSVC compiler can be configured to define whar_t as a typedef
+// of unsigned short. Defining an overload for const wchar_t* in that case
+// would cause pointers to unsigned shorts be printed as wide strings,
+// possibly accessing more memory than intended and causing invalid
+// memory accesses. MSVC defines _NATIVE_WCHAR_T_DEFINED symbol when
+// wchar_t is implemented as a native type.
+#if !defined(_MSC_VER) || defined(_NATIVE_WCHAR_T_DEFINED)
+// Prints the given wide C string to the ostream.
+void PrintTo(const wchar_t* s, ostream* os) {
+  if (s == NULL) {
+    *os << "NULL";
+  } else {
+    *os << ImplicitCast_<const void*>(s) << " pointing to ";
+    PrintCharsAsStringTo(s, wcslen(s), os);
+  }
+}
+#endif  // wchar_t is native
+
+// Prints a ::string object.
+#if GTEST_HAS_GLOBAL_STRING
+void PrintStringTo(const ::string& s, ostream* os) {
+  PrintCharsAsStringTo(s.data(), s.size(), os);
+}
+#endif  // GTEST_HAS_GLOBAL_STRING
+
+void PrintStringTo(const ::std::string& s, ostream* os) {
+  PrintCharsAsStringTo(s.data(), s.size(), os);
+}
+
+// Prints a ::wstring object.
+#if GTEST_HAS_GLOBAL_WSTRING
+void PrintWideStringTo(const ::wstring& s, ostream* os) {
+  PrintCharsAsStringTo(s.data(), s.size(), os);
+}
+#endif  // GTEST_HAS_GLOBAL_WSTRING
+
+#if GTEST_HAS_STD_WSTRING
+void PrintWideStringTo(const ::std::wstring& s, ostream* os) {
+  PrintCharsAsStringTo(s.data(), s.size(), os);
+}
+#endif  // GTEST_HAS_STD_WSTRING
+
+}  // namespace internal
+
+}  // namespace testing
diff --git a/contrib/gtest-1.7.0/src/gtest-test-part.cc b/contrib/gtest-1.7.0/src/gtest-test-part.cc
new file mode 100644
index 0000000..c60eef3
--- /dev/null
+++ b/contrib/gtest-1.7.0/src/gtest-test-part.cc
@@ -0,0 +1,110 @@
+// Copyright 2008, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: mheule at google.com (Markus Heule)
+//
+// The Google C++ Testing Framework (Google Test)
+
+#include "gtest/gtest-test-part.h"
+
+// Indicates that this translation unit is part of Google Test's
+// implementation.  It must come before gtest-internal-inl.h is
+// included, or there will be a compiler error.  This trick is to
+// prevent a user from accidentally including gtest-internal-inl.h in
+// his code.
+#define GTEST_IMPLEMENTATION_ 1
+#include "src/gtest-internal-inl.h"
+#undef GTEST_IMPLEMENTATION_
+
+namespace testing {
+
+using internal::GetUnitTestImpl;
+
+// Gets the summary of the failure message by omitting the stack trace
+// in it.
+std::string TestPartResult::ExtractSummary(const char* message) {
+  const char* const stack_trace = strstr(message, internal::kStackTraceMarker);
+  return stack_trace == NULL ? message :
+      std::string(message, stack_trace);
+}
+
+// Prints a TestPartResult object.
+std::ostream& operator<<(std::ostream& os, const TestPartResult& result) {
+  return os
+      << result.file_name() << ":" << result.line_number() << ": "
+      << (result.type() == TestPartResult::kSuccess ? "Success" :
+          result.type() == TestPartResult::kFatalFailure ? "Fatal failure" :
+          "Non-fatal failure") << ":\n"
+      << result.message() << std::endl;
+}
+
+// Appends a TestPartResult to the array.
+void TestPartResultArray::Append(const TestPartResult& result) {
+  array_.push_back(result);
+}
+
+// Returns the TestPartResult at the given index (0-based).
+const TestPartResult& TestPartResultArray::GetTestPartResult(int index) const {
+  if (index < 0 || index >= size()) {
+    printf("\nInvalid index (%d) into TestPartResultArray.\n", index);
+    internal::posix::Abort();
+  }
+
+  return array_[index];
+}
+
+// Returns the number of TestPartResult objects in the array.
+int TestPartResultArray::size() const {
+  return static_cast<int>(array_.size());
+}
+
+namespace internal {
+
+HasNewFatalFailureHelper::HasNewFatalFailureHelper()
+    : has_new_fatal_failure_(false),
+      original_reporter_(GetUnitTestImpl()->
+                         GetTestPartResultReporterForCurrentThread()) {
+  GetUnitTestImpl()->SetTestPartResultReporterForCurrentThread(this);
+}
+
+HasNewFatalFailureHelper::~HasNewFatalFailureHelper() {
+  GetUnitTestImpl()->SetTestPartResultReporterForCurrentThread(
+      original_reporter_);
+}
+
+void HasNewFatalFailureHelper::ReportTestPartResult(
+    const TestPartResult& result) {
+  if (result.fatally_failed())
+    has_new_fatal_failure_ = true;
+  original_reporter_->ReportTestPartResult(result);
+}
+
+}  // namespace internal
+
+}  // namespace testing
diff --git a/contrib/gtest-1.7.0/src/gtest-typed-test.cc b/contrib/gtest-1.7.0/src/gtest-typed-test.cc
new file mode 100644
index 0000000..f0079f4
--- /dev/null
+++ b/contrib/gtest-1.7.0/src/gtest-typed-test.cc
@@ -0,0 +1,110 @@
+// Copyright 2008 Google Inc.
+// All Rights Reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+
+#include "gtest/gtest-typed-test.h"
+#include "gtest/gtest.h"
+
+namespace testing {
+namespace internal {
+
+#if GTEST_HAS_TYPED_TEST_P
+
+// Skips to the first non-space char in str. Returns an empty string if str
+// contains only whitespace characters.
+static const char* SkipSpaces(const char* str) {
+  while (IsSpace(*str))
+    str++;
+  return str;
+}
+
+// Verifies that registered_tests match the test names in
+// defined_test_names_; returns registered_tests if successful, or
+// aborts the program otherwise.
+const char* TypedTestCasePState::VerifyRegisteredTestNames(
+    const char* file, int line, const char* registered_tests) {
+  typedef ::std::set<const char*>::const_iterator DefinedTestIter;
+  registered_ = true;
+
+  // Skip initial whitespace in registered_tests since some
+  // preprocessors prefix stringizied literals with whitespace.
+  registered_tests = SkipSpaces(registered_tests);
+
+  Message errors;
+  ::std::set<std::string> tests;
+  for (const char* names = registered_tests; names != NULL;
+       names = SkipComma(names)) {
+    const std::string name = GetPrefixUntilComma(names);
+    if (tests.count(name) != 0) {
+      errors << "Test " << name << " is listed more than once.\n";
+      continue;
+    }
+
+    bool found = false;
+    for (DefinedTestIter it = defined_test_names_.begin();
+         it != defined_test_names_.end();
+         ++it) {
+      if (name == *it) {
+        found = true;
+        break;
+      }
+    }
+
+    if (found) {
+      tests.insert(name);
+    } else {
+      errors << "No test named " << name
+             << " can be found in this test case.\n";
+    }
+  }
+
+  for (DefinedTestIter it = defined_test_names_.begin();
+       it != defined_test_names_.end();
+       ++it) {
+    if (tests.count(*it) == 0) {
+      errors << "You forgot to list test " << *it << ".\n";
+    }
+  }
+
+  const std::string& errors_str = errors.GetString();
+  if (errors_str != "") {
+    fprintf(stderr, "%s %s", FormatFileLocation(file, line).c_str(),
+            errors_str.c_str());
+    fflush(stderr);
+    posix::Abort();
+  }
+
+  return registered_tests;
+}
+
+#endif  // GTEST_HAS_TYPED_TEST_P
+
+}  // namespace internal
+}  // namespace testing
diff --git a/contrib/gtest-1.7.0/src/gtest.cc b/contrib/gtest-1.7.0/src/gtest.cc
new file mode 100644
index 0000000..6de53dd
--- /dev/null
+++ b/contrib/gtest-1.7.0/src/gtest.cc
@@ -0,0 +1,5015 @@
+// Copyright 2005, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+//
+// The Google C++ Testing Framework (Google Test)
+
+#include "gtest/gtest.h"
+#include "gtest/gtest-spi.h"
+
+#include <ctype.h>
+#include <math.h>
+#include <stdarg.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <time.h>
+#include <wchar.h>
+#include <wctype.h>
+
+#include <algorithm>
+#include <iomanip>
+#include <limits>
+#include <ostream>  // NOLINT
+#include <sstream>
+#include <vector>
+
+#if GTEST_OS_LINUX
+
+// TODO(kenton at google.com): Use autoconf to detect availability of
+// gettimeofday().
+# define GTEST_HAS_GETTIMEOFDAY_ 1
+
+# include <fcntl.h>  // NOLINT
+# include <limits.h>  // NOLINT
+# include <sched.h>  // NOLINT
+// Declares vsnprintf().  This header is not available on Windows.
+# include <strings.h>  // NOLINT
+# include <sys/mman.h>  // NOLINT
+# include <sys/time.h>  // NOLINT
+# include <unistd.h>  // NOLINT
+# include <string>
+
+#elif GTEST_OS_SYMBIAN
+# define GTEST_HAS_GETTIMEOFDAY_ 1
+# include <sys/time.h>  // NOLINT
+
+#elif GTEST_OS_ZOS
+# define GTEST_HAS_GETTIMEOFDAY_ 1
+# include <sys/time.h>  // NOLINT
+
+// On z/OS we additionally need strings.h for strcasecmp.
+# include <strings.h>  // NOLINT
+
+#elif GTEST_OS_WINDOWS_MOBILE  // We are on Windows CE.
+
+# include <windows.h>  // NOLINT
+
+#elif GTEST_OS_WINDOWS  // We are on Windows proper.
+
+# include <io.h>  // NOLINT
+# include <sys/timeb.h>  // NOLINT
+# include <sys/types.h>  // NOLINT
+# include <sys/stat.h>  // NOLINT
+
+# if GTEST_OS_WINDOWS_MINGW
+// MinGW has gettimeofday() but not _ftime64().
+// TODO(kenton at google.com): Use autoconf to detect availability of
+//   gettimeofday().
+// TODO(kenton at google.com): There are other ways to get the time on
+//   Windows, like GetTickCount() or GetSystemTimeAsFileTime().  MinGW
+//   supports these.  consider using them instead.
+#  define GTEST_HAS_GETTIMEOFDAY_ 1
+#  include <sys/time.h>  // NOLINT
+# endif  // GTEST_OS_WINDOWS_MINGW
+
+// cpplint thinks that the header is already included, so we want to
+// silence it.
+# include <windows.h>  // NOLINT
+
+#else
+
+// Assume other platforms have gettimeofday().
+// TODO(kenton at google.com): Use autoconf to detect availability of
+//   gettimeofday().
+# define GTEST_HAS_GETTIMEOFDAY_ 1
+
+// cpplint thinks that the header is already included, so we want to
+// silence it.
+# include <sys/time.h>  // NOLINT
+# include <unistd.h>  // NOLINT
+
+#endif  // GTEST_OS_LINUX
+
+#if GTEST_HAS_EXCEPTIONS
+# include <stdexcept>
+#endif
+
+#if GTEST_CAN_STREAM_RESULTS_
+# include <arpa/inet.h>  // NOLINT
+# include <netdb.h>  // NOLINT
+#endif
+
+// Indicates that this translation unit is part of Google Test's
+// implementation.  It must come before gtest-internal-inl.h is
+// included, or there will be a compiler error.  This trick is to
+// prevent a user from accidentally including gtest-internal-inl.h in
+// his code.
+#define GTEST_IMPLEMENTATION_ 1
+#include "src/gtest-internal-inl.h"
+#undef GTEST_IMPLEMENTATION_
+
+#if GTEST_OS_WINDOWS
+# define vsnprintf _vsnprintf
+#endif  // GTEST_OS_WINDOWS
+
+namespace testing {
+
+using internal::CountIf;
+using internal::ForEach;
+using internal::GetElementOr;
+using internal::Shuffle;
+
+// Constants.
+
+// A test whose test case name or test name matches this filter is
+// disabled and not run.
+static const char kDisableTestFilter[] = "DISABLED_*:*/DISABLED_*";
+
+// A test case whose name matches this filter is considered a death
+// test case and will be run before test cases whose name doesn't
+// match this filter.
+static const char kDeathTestCaseFilter[] = "*DeathTest:*DeathTest/*";
+
+// A test filter that matches everything.
+static const char kUniversalFilter[] = "*";
+
+// The default output file for XML output.
+static const char kDefaultOutputFile[] = "test_detail.xml";
+
+// The environment variable name for the test shard index.
+static const char kTestShardIndex[] = "GTEST_SHARD_INDEX";
+// The environment variable name for the total number of test shards.
+static const char kTestTotalShards[] = "GTEST_TOTAL_SHARDS";
+// The environment variable name for the test shard status file.
+static const char kTestShardStatusFile[] = "GTEST_SHARD_STATUS_FILE";
+
+namespace internal {
+
+// The text used in failure messages to indicate the start of the
+// stack trace.
+const char kStackTraceMarker[] = "\nStack trace:\n";
+
+// g_help_flag is true iff the --help flag or an equivalent form is
+// specified on the command line.
+bool g_help_flag = false;
+
+}  // namespace internal
+
+static const char* GetDefaultFilter() {
+  return kUniversalFilter;
+}
+
+GTEST_DEFINE_bool_(
+    also_run_disabled_tests,
+    internal::BoolFromGTestEnv("also_run_disabled_tests", false),
+    "Run disabled tests too, in addition to the tests normally being run.");
+
+GTEST_DEFINE_bool_(
+    break_on_failure,
+    internal::BoolFromGTestEnv("break_on_failure", false),
+    "True iff a failed assertion should be a debugger break-point.");
+
+GTEST_DEFINE_bool_(
+    catch_exceptions,
+    internal::BoolFromGTestEnv("catch_exceptions", true),
+    "True iff " GTEST_NAME_
+    " should catch exceptions and treat them as test failures.");
+
+GTEST_DEFINE_string_(
+    color,
+    internal::StringFromGTestEnv("color", "auto"),
+    "Whether to use colors in the output.  Valid values: yes, no, "
+    "and auto.  'auto' means to use colors if the output is "
+    "being sent to a terminal and the TERM environment variable "
+    "is set to a terminal type that supports colors.");
+
+GTEST_DEFINE_string_(
+    filter,
+    internal::StringFromGTestEnv("filter", GetDefaultFilter()),
+    "A colon-separated list of glob (not regex) patterns "
+    "for filtering the tests to run, optionally followed by a "
+    "'-' and a : separated list of negative patterns (tests to "
+    "exclude).  A test is run if it matches one of the positive "
+    "patterns and does not match any of the negative patterns.");
+
+GTEST_DEFINE_bool_(list_tests, false,
+                   "List all tests without running them.");
+
+GTEST_DEFINE_string_(
+    output,
+    internal::StringFromGTestEnv("output", ""),
+    "A format (currently must be \"xml\"), optionally followed "
+    "by a colon and an output file name or directory. A directory "
+    "is indicated by a trailing pathname separator. "
+    "Examples: \"xml:filename.xml\", \"xml::directoryname/\". "
+    "If a directory is specified, output files will be created "
+    "within that directory, with file-names based on the test "
+    "executable's name and, if necessary, made unique by adding "
+    "digits.");
+
+GTEST_DEFINE_bool_(
+    print_time,
+    internal::BoolFromGTestEnv("print_time", true),
+    "True iff " GTEST_NAME_
+    " should display elapsed time in text output.");
+
+GTEST_DEFINE_int32_(
+    random_seed,
+    internal::Int32FromGTestEnv("random_seed", 0),
+    "Random number seed to use when shuffling test orders.  Must be in range "
+    "[1, 99999], or 0 to use a seed based on the current time.");
+
+GTEST_DEFINE_int32_(
+    repeat,
+    internal::Int32FromGTestEnv("repeat", 1),
+    "How many times to repeat each test.  Specify a negative number "
+    "for repeating forever.  Useful for shaking out flaky tests.");
+
+GTEST_DEFINE_bool_(
+    show_internal_stack_frames, false,
+    "True iff " GTEST_NAME_ " should include internal stack frames when "
+    "printing test failure stack traces.");
+
+GTEST_DEFINE_bool_(
+    shuffle,
+    internal::BoolFromGTestEnv("shuffle", false),
+    "True iff " GTEST_NAME_
+    " should randomize tests' order on every run.");
+
+GTEST_DEFINE_int32_(
+    stack_trace_depth,
+    internal::Int32FromGTestEnv("stack_trace_depth", kMaxStackTraceDepth),
+    "The maximum number of stack frames to print when an "
+    "assertion fails.  The valid range is 0 through 100, inclusive.");
+
+GTEST_DEFINE_string_(
+    stream_result_to,
+    internal::StringFromGTestEnv("stream_result_to", ""),
+    "This flag specifies the host name and the port number on which to stream "
+    "test results. Example: \"localhost:555\". The flag is effective only on "
+    "Linux.");
+
+GTEST_DEFINE_bool_(
+    throw_on_failure,
+    internal::BoolFromGTestEnv("throw_on_failure", false),
+    "When this flag is specified, a failed assertion will throw an exception "
+    "if exceptions are enabled or exit the program with a non-zero code "
+    "otherwise.");
+
+namespace internal {
+
+// Generates a random number from [0, range), using a Linear
+// Congruential Generator (LCG).  Crashes if 'range' is 0 or greater
+// than kMaxRange.
+UInt32 Random::Generate(UInt32 range) {
+  // These constants are the same as are used in glibc's rand(3).
+  state_ = (1103515245U*state_ + 12345U) % kMaxRange;
+
+  GTEST_CHECK_(range > 0)
+      << "Cannot generate a number in the range [0, 0).";
+  GTEST_CHECK_(range <= kMaxRange)
+      << "Generation of a number in [0, " << range << ") was requested, "
+      << "but this can only generate numbers in [0, " << kMaxRange << ").";
+
+  // Converting via modulus introduces a bit of downward bias, but
+  // it's simple, and a linear congruential generator isn't too good
+  // to begin with.
+  return state_ % range;
+}
+
+// GTestIsInitialized() returns true iff the user has initialized
+// Google Test.  Useful for catching the user mistake of not initializing
+// Google Test before calling RUN_ALL_TESTS().
+//
+// A user must call testing::InitGoogleTest() to initialize Google
+// Test.  g_init_gtest_count is set to the number of times
+// InitGoogleTest() has been called.  We don't protect this variable
+// under a mutex as it is only accessed in the main thread.
+GTEST_API_ int g_init_gtest_count = 0;
+static bool GTestIsInitialized() { return g_init_gtest_count != 0; }
+
+// Iterates over a vector of TestCases, keeping a running sum of the
+// results of calling a given int-returning method on each.
+// Returns the sum.
+static int SumOverTestCaseList(const std::vector<TestCase*>& case_list,
+                               int (TestCase::*method)() const) {
+  int sum = 0;
+  for (size_t i = 0; i < case_list.size(); i++) {
+    sum += (case_list[i]->*method)();
+  }
+  return sum;
+}
+
+// Returns true iff the test case passed.
+static bool TestCasePassed(const TestCase* test_case) {
+  return test_case->should_run() && test_case->Passed();
+}
+
+// Returns true iff the test case failed.
+static bool TestCaseFailed(const TestCase* test_case) {
+  return test_case->should_run() && test_case->Failed();
+}
+
+// Returns true iff test_case contains at least one test that should
+// run.
+static bool ShouldRunTestCase(const TestCase* test_case) {
+  return test_case->should_run();
+}
+
+// AssertHelper constructor.
+AssertHelper::AssertHelper(TestPartResult::Type type,
+                           const char* file,
+                           int line,
+                           const char* message)
+    : data_(new AssertHelperData(type, file, line, message)) {
+}
+
+AssertHelper::~AssertHelper() {
+  delete data_;
+}
+
+// Message assignment, for assertion streaming support.
+void AssertHelper::operator=(const Message& message) const {
+  UnitTest::GetInstance()->
+    AddTestPartResult(data_->type, data_->file, data_->line,
+                      AppendUserMessage(data_->message, message),
+                      UnitTest::GetInstance()->impl()
+                      ->CurrentOsStackTraceExceptTop(1)
+                      // Skips the stack frame for this function itself.
+                      );  // NOLINT
+}
+
+// Mutex for linked pointers.
+GTEST_API_ GTEST_DEFINE_STATIC_MUTEX_(g_linked_ptr_mutex);
+
+// Application pathname gotten in InitGoogleTest.
+std::string g_executable_path;
+
+// Returns the current application's name, removing directory path if that
+// is present.
+FilePath GetCurrentExecutableName() {
+  FilePath result;
+
+#if GTEST_OS_WINDOWS
+  result.Set(FilePath(g_executable_path).RemoveExtension("exe"));
+#else
+  result.Set(FilePath(g_executable_path));
+#endif  // GTEST_OS_WINDOWS
+
+  return result.RemoveDirectoryName();
+}
+
+// Functions for processing the gtest_output flag.
+
+// Returns the output format, or "" for normal printed output.
+std::string UnitTestOptions::GetOutputFormat() {
+  const char* const gtest_output_flag = GTEST_FLAG(output).c_str();
+  if (gtest_output_flag == NULL) return std::string("");
+
+  const char* const colon = strchr(gtest_output_flag, ':');
+  return (colon == NULL) ?
+      std::string(gtest_output_flag) :
+      std::string(gtest_output_flag, colon - gtest_output_flag);
+}
+
+// Returns the name of the requested output file, or the default if none
+// was explicitly specified.
+std::string UnitTestOptions::GetAbsolutePathToOutputFile() {
+  const char* const gtest_output_flag = GTEST_FLAG(output).c_str();
+  if (gtest_output_flag == NULL)
+    return "";
+
+  const char* const colon = strchr(gtest_output_flag, ':');
+  if (colon == NULL)
+    return internal::FilePath::ConcatPaths(
+        internal::FilePath(
+            UnitTest::GetInstance()->original_working_dir()),
+        internal::FilePath(kDefaultOutputFile)).string();
+
+  internal::FilePath output_name(colon + 1);
+  if (!output_name.IsAbsolutePath())
+    // TODO(wan at google.com): on Windows \some\path is not an absolute
+    // path (as its meaning depends on the current drive), yet the
+    // following logic for turning it into an absolute path is wrong.
+    // Fix it.
+    output_name = internal::FilePath::ConcatPaths(
+        internal::FilePath(UnitTest::GetInstance()->original_working_dir()),
+        internal::FilePath(colon + 1));
+
+  if (!output_name.IsDirectory())
+    return output_name.string();
+
+  internal::FilePath result(internal::FilePath::GenerateUniqueFileName(
+      output_name, internal::GetCurrentExecutableName(),
+      GetOutputFormat().c_str()));
+  return result.string();
+}
+
+// Returns true iff the wildcard pattern matches the string.  The
+// first ':' or '\0' character in pattern marks the end of it.
+//
+// This recursive algorithm isn't very efficient, but is clear and
+// works well enough for matching test names, which are short.
+bool UnitTestOptions::PatternMatchesString(const char *pattern,
+                                           const char *str) {
+  switch (*pattern) {
+    case '\0':
+    case ':':  // Either ':' or '\0' marks the end of the pattern.
+      return *str == '\0';
+    case '?':  // Matches any single character.
+      return *str != '\0' && PatternMatchesString(pattern + 1, str + 1);
+    case '*':  // Matches any string (possibly empty) of characters.
+      return (*str != '\0' && PatternMatchesString(pattern, str + 1)) ||
+          PatternMatchesString(pattern + 1, str);
+    default:  // Non-special character.  Matches itself.
+      return *pattern == *str &&
+          PatternMatchesString(pattern + 1, str + 1);
+  }
+}
+
+bool UnitTestOptions::MatchesFilter(
+    const std::string& name, const char* filter) {
+  const char *cur_pattern = filter;
+  for (;;) {
+    if (PatternMatchesString(cur_pattern, name.c_str())) {
+      return true;
+    }
+
+    // Finds the next pattern in the filter.
+    cur_pattern = strchr(cur_pattern, ':');
+
+    // Returns if no more pattern can be found.
+    if (cur_pattern == NULL) {
+      return false;
+    }
+
+    // Skips the pattern separater (the ':' character).
+    cur_pattern++;
+  }
+}
+
+// Returns true iff the user-specified filter matches the test case
+// name and the test name.
+bool UnitTestOptions::FilterMatchesTest(const std::string &test_case_name,
+                                        const std::string &test_name) {
+  const std::string& full_name = test_case_name + "." + test_name.c_str();
+
+  // Split --gtest_filter at '-', if there is one, to separate into
+  // positive filter and negative filter portions
+  const char* const p = GTEST_FLAG(filter).c_str();
+  const char* const dash = strchr(p, '-');
+  std::string positive;
+  std::string negative;
+  if (dash == NULL) {
+    positive = GTEST_FLAG(filter).c_str();  // Whole string is a positive filter
+    negative = "";
+  } else {
+    positive = std::string(p, dash);   // Everything up to the dash
+    negative = std::string(dash + 1);  // Everything after the dash
+    if (positive.empty()) {
+      // Treat '-test1' as the same as '*-test1'
+      positive = kUniversalFilter;
+    }
+  }
+
+  // A filter is a colon-separated list of patterns.  It matches a
+  // test if any pattern in it matches the test.
+  return (MatchesFilter(full_name, positive.c_str()) &&
+          !MatchesFilter(full_name, negative.c_str()));
+}
+
+#if GTEST_HAS_SEH
+// Returns EXCEPTION_EXECUTE_HANDLER if Google Test should handle the
+// given SEH exception, or EXCEPTION_CONTINUE_SEARCH otherwise.
+// This function is useful as an __except condition.
+int UnitTestOptions::GTestShouldProcessSEH(DWORD exception_code) {
+  // Google Test should handle a SEH exception if:
+  //   1. the user wants it to, AND
+  //   2. this is not a breakpoint exception, AND
+  //   3. this is not a C++ exception (VC++ implements them via SEH,
+  //      apparently).
+  //
+  // SEH exception code for C++ exceptions.
+  // (see http://support.microsoft.com/kb/185294 for more information).
+  const DWORD kCxxExceptionCode = 0xe06d7363;
+
+  bool should_handle = true;
+
+  if (!GTEST_FLAG(catch_exceptions))
+    should_handle = false;
+  else if (exception_code == EXCEPTION_BREAKPOINT)
+    should_handle = false;
+  else if (exception_code == kCxxExceptionCode)
+    should_handle = false;
+
+  return should_handle ? EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH;
+}
+#endif  // GTEST_HAS_SEH
+
+}  // namespace internal
+
+// The c'tor sets this object as the test part result reporter used by
+// Google Test.  The 'result' parameter specifies where to report the
+// results. Intercepts only failures from the current thread.
+ScopedFakeTestPartResultReporter::ScopedFakeTestPartResultReporter(
+    TestPartResultArray* result)
+    : intercept_mode_(INTERCEPT_ONLY_CURRENT_THREAD),
+      result_(result) {
+  Init();
+}
+
+// The c'tor sets this object as the test part result reporter used by
+// Google Test.  The 'result' parameter specifies where to report the
+// results.
+ScopedFakeTestPartResultReporter::ScopedFakeTestPartResultReporter(
+    InterceptMode intercept_mode, TestPartResultArray* result)
+    : intercept_mode_(intercept_mode),
+      result_(result) {
+  Init();
+}
+
+void ScopedFakeTestPartResultReporter::Init() {
+  internal::UnitTestImpl* const impl = internal::GetUnitTestImpl();
+  if (intercept_mode_ == INTERCEPT_ALL_THREADS) {
+    old_reporter_ = impl->GetGlobalTestPartResultReporter();
+    impl->SetGlobalTestPartResultReporter(this);
+  } else {
+    old_reporter_ = impl->GetTestPartResultReporterForCurrentThread();
+    impl->SetTestPartResultReporterForCurrentThread(this);
+  }
+}
+
+// The d'tor restores the test part result reporter used by Google Test
+// before.
+ScopedFakeTestPartResultReporter::~ScopedFakeTestPartResultReporter() {
+  internal::UnitTestImpl* const impl = internal::GetUnitTestImpl();
+  if (intercept_mode_ == INTERCEPT_ALL_THREADS) {
+    impl->SetGlobalTestPartResultReporter(old_reporter_);
+  } else {
+    impl->SetTestPartResultReporterForCurrentThread(old_reporter_);
+  }
+}
+
+// Increments the test part result count and remembers the result.
+// This method is from the TestPartResultReporterInterface interface.
+void ScopedFakeTestPartResultReporter::ReportTestPartResult(
+    const TestPartResult& result) {
+  result_->Append(result);
+}
+
+namespace internal {
+
+// Returns the type ID of ::testing::Test.  We should always call this
+// instead of GetTypeId< ::testing::Test>() to get the type ID of
+// testing::Test.  This is to work around a suspected linker bug when
+// using Google Test as a framework on Mac OS X.  The bug causes
+// GetTypeId< ::testing::Test>() to return different values depending
+// on whether the call is from the Google Test framework itself or
+// from user test code.  GetTestTypeId() is guaranteed to always
+// return the same value, as it always calls GetTypeId<>() from the
+// gtest.cc, which is within the Google Test framework.
+TypeId GetTestTypeId() {
+  return GetTypeId<Test>();
+}
+
+// The value of GetTestTypeId() as seen from within the Google Test
+// library.  This is solely for testing GetTestTypeId().
+extern const TypeId kTestTypeIdInGoogleTest = GetTestTypeId();
+
+// This predicate-formatter checks that 'results' contains a test part
+// failure of the given type and that the failure message contains the
+// given substring.
+AssertionResult HasOneFailure(const char* /* results_expr */,
+                              const char* /* type_expr */,
+                              const char* /* substr_expr */,
+                              const TestPartResultArray& results,
+                              TestPartResult::Type type,
+                              const string& substr) {
+  const std::string expected(type == TestPartResult::kFatalFailure ?
+                        "1 fatal failure" :
+                        "1 non-fatal failure");
+  Message msg;
+  if (results.size() != 1) {
+    msg << "Expected: " << expected << "\n"
+        << "  Actual: " << results.size() << " failures";
+    for (int i = 0; i < results.size(); i++) {
+      msg << "\n" << results.GetTestPartResult(i);
+    }
+    return AssertionFailure() << msg;
+  }
+
+  const TestPartResult& r = results.GetTestPartResult(0);
+  if (r.type() != type) {
+    return AssertionFailure() << "Expected: " << expected << "\n"
+                              << "  Actual:\n"
+                              << r;
+  }
+
+  if (strstr(r.message(), substr.c_str()) == NULL) {
+    return AssertionFailure() << "Expected: " << expected << " containing \""
+                              << substr << "\"\n"
+                              << "  Actual:\n"
+                              << r;
+  }
+
+  return AssertionSuccess();
+}
+
+// The constructor of SingleFailureChecker remembers where to look up
+// test part results, what type of failure we expect, and what
+// substring the failure message should contain.
+SingleFailureChecker:: SingleFailureChecker(
+    const TestPartResultArray* results,
+    TestPartResult::Type type,
+    const string& substr)
+    : results_(results),
+      type_(type),
+      substr_(substr) {}
+
+// The destructor of SingleFailureChecker verifies that the given
+// TestPartResultArray contains exactly one failure that has the given
+// type and contains the given substring.  If that's not the case, a
+// non-fatal failure will be generated.
+SingleFailureChecker::~SingleFailureChecker() {
+  EXPECT_PRED_FORMAT3(HasOneFailure, *results_, type_, substr_);
+}
+
+DefaultGlobalTestPartResultReporter::DefaultGlobalTestPartResultReporter(
+    UnitTestImpl* unit_test) : unit_test_(unit_test) {}
+
+void DefaultGlobalTestPartResultReporter::ReportTestPartResult(
+    const TestPartResult& result) {
+  unit_test_->current_test_result()->AddTestPartResult(result);
+  unit_test_->listeners()->repeater()->OnTestPartResult(result);
+}
+
+DefaultPerThreadTestPartResultReporter::DefaultPerThreadTestPartResultReporter(
+    UnitTestImpl* unit_test) : unit_test_(unit_test) {}
+
+void DefaultPerThreadTestPartResultReporter::ReportTestPartResult(
+    const TestPartResult& result) {
+  unit_test_->GetGlobalTestPartResultReporter()->ReportTestPartResult(result);
+}
+
+// Returns the global test part result reporter.
+TestPartResultReporterInterface*
+UnitTestImpl::GetGlobalTestPartResultReporter() {
+  internal::MutexLock lock(&global_test_part_result_reporter_mutex_);
+  return global_test_part_result_repoter_;
+}
+
+// Sets the global test part result reporter.
+void UnitTestImpl::SetGlobalTestPartResultReporter(
+    TestPartResultReporterInterface* reporter) {
+  internal::MutexLock lock(&global_test_part_result_reporter_mutex_);
+  global_test_part_result_repoter_ = reporter;
+}
+
+// Returns the test part result reporter for the current thread.
+TestPartResultReporterInterface*
+UnitTestImpl::GetTestPartResultReporterForCurrentThread() {
+  return per_thread_test_part_result_reporter_.get();
+}
+
+// Sets the test part result reporter for the current thread.
+void UnitTestImpl::SetTestPartResultReporterForCurrentThread(
+    TestPartResultReporterInterface* reporter) {
+  per_thread_test_part_result_reporter_.set(reporter);
+}
+
+// Gets the number of successful test cases.
+int UnitTestImpl::successful_test_case_count() const {
+  return CountIf(test_cases_, TestCasePassed);
+}
+
+// Gets the number of failed test cases.
+int UnitTestImpl::failed_test_case_count() const {
+  return CountIf(test_cases_, TestCaseFailed);
+}
+
+// Gets the number of all test cases.
+int UnitTestImpl::total_test_case_count() const {
+  return static_cast<int>(test_cases_.size());
+}
+
+// Gets the number of all test cases that contain at least one test
+// that should run.
+int UnitTestImpl::test_case_to_run_count() const {
+  return CountIf(test_cases_, ShouldRunTestCase);
+}
+
+// Gets the number of successful tests.
+int UnitTestImpl::successful_test_count() const {
+  return SumOverTestCaseList(test_cases_, &TestCase::successful_test_count);
+}
+
+// Gets the number of failed tests.
+int UnitTestImpl::failed_test_count() const {
+  return SumOverTestCaseList(test_cases_, &TestCase::failed_test_count);
+}
+
+// Gets the number of disabled tests that will be reported in the XML report.
+int UnitTestImpl::reportable_disabled_test_count() const {
+  return SumOverTestCaseList(test_cases_,
+                             &TestCase::reportable_disabled_test_count);
+}
+
+// Gets the number of disabled tests.
+int UnitTestImpl::disabled_test_count() const {
+  return SumOverTestCaseList(test_cases_, &TestCase::disabled_test_count);
+}
+
+// Gets the number of tests to be printed in the XML report.
+int UnitTestImpl::reportable_test_count() const {
+  return SumOverTestCaseList(test_cases_, &TestCase::reportable_test_count);
+}
+
+// Gets the number of all tests.
+int UnitTestImpl::total_test_count() const {
+  return SumOverTestCaseList(test_cases_, &TestCase::total_test_count);
+}
+
+// Gets the number of tests that should run.
+int UnitTestImpl::test_to_run_count() const {
+  return SumOverTestCaseList(test_cases_, &TestCase::test_to_run_count);
+}
+
+// Returns the current OS stack trace as an std::string.
+//
+// The maximum number of stack frames to be included is specified by
+// the gtest_stack_trace_depth flag.  The skip_count parameter
+// specifies the number of top frames to be skipped, which doesn't
+// count against the number of frames to be included.
+//
+// For example, if Foo() calls Bar(), which in turn calls
+// CurrentOsStackTraceExceptTop(1), Foo() will be included in the
+// trace but Bar() and CurrentOsStackTraceExceptTop() won't.
+std::string UnitTestImpl::CurrentOsStackTraceExceptTop(int skip_count) {
+  (void)skip_count;
+  return "";
+}
+
+// Returns the current time in milliseconds.
+TimeInMillis GetTimeInMillis() {
+#if GTEST_OS_WINDOWS_MOBILE || defined(__BORLANDC__)
+  // Difference between 1970-01-01 and 1601-01-01 in milliseconds.
+  // http://analogous.blogspot.com/2005/04/epoch.html
+  const TimeInMillis kJavaEpochToWinFileTimeDelta =
+    static_cast<TimeInMillis>(116444736UL) * 100000UL;
+  const DWORD kTenthMicrosInMilliSecond = 10000;
+
+  SYSTEMTIME now_systime;
+  FILETIME now_filetime;
+  ULARGE_INTEGER now_int64;
+  // TODO(kenton at google.com): Shouldn't this just use
+  //   GetSystemTimeAsFileTime()?
+  GetSystemTime(&now_systime);
+  if (SystemTimeToFileTime(&now_systime, &now_filetime)) {
+    now_int64.LowPart = now_filetime.dwLowDateTime;
+    now_int64.HighPart = now_filetime.dwHighDateTime;
+    now_int64.QuadPart = (now_int64.QuadPart / kTenthMicrosInMilliSecond) -
+      kJavaEpochToWinFileTimeDelta;
+    return now_int64.QuadPart;
+  }
+  return 0;
+#elif GTEST_OS_WINDOWS && !GTEST_HAS_GETTIMEOFDAY_
+  __timeb64 now;
+
+# ifdef _MSC_VER
+
+  // MSVC 8 deprecates _ftime64(), so we want to suppress warning 4996
+  // (deprecated function) there.
+  // TODO(kenton at google.com): Use GetTickCount()?  Or use
+  //   SystemTimeToFileTime()
+#  pragma warning(push)          // Saves the current warning state.
+#  pragma warning(disable:4996)  // Temporarily disables warning 4996.
+  _ftime64(&now);
+#  pragma warning(pop)           // Restores the warning state.
+# else
+
+  _ftime64(&now);
+
+# endif  // _MSC_VER
+
+  return static_cast<TimeInMillis>(now.time) * 1000 + now.millitm;
+#elif GTEST_HAS_GETTIMEOFDAY_
+  struct timeval now;
+  gettimeofday(&now, NULL);
+  return static_cast<TimeInMillis>(now.tv_sec) * 1000 + now.tv_usec / 1000;
+#else
+# error "Don't know how to get the current time on your system."
+#endif
+}
+
+// Utilities
+
+// class String.
+
+#if GTEST_OS_WINDOWS_MOBILE
+// Creates a UTF-16 wide string from the given ANSI string, allocating
+// memory using new. The caller is responsible for deleting the return
+// value using delete[]. Returns the wide string, or NULL if the
+// input is NULL.
+LPCWSTR String::AnsiToUtf16(const char* ansi) {
+  if (!ansi) return NULL;
+  const int length = strlen(ansi);
+  const int unicode_length =
+      MultiByteToWideChar(CP_ACP, 0, ansi, length,
+                          NULL, 0);
+  WCHAR* unicode = new WCHAR[unicode_length + 1];
+  MultiByteToWideChar(CP_ACP, 0, ansi, length,
+                      unicode, unicode_length);
+  unicode[unicode_length] = 0;
+  return unicode;
+}
+
+// Creates an ANSI string from the given wide string, allocating
+// memory using new. The caller is responsible for deleting the return
+// value using delete[]. Returns the ANSI string, or NULL if the
+// input is NULL.
+const char* String::Utf16ToAnsi(LPCWSTR utf16_str)  {
+  if (!utf16_str) return NULL;
+  const int ansi_length =
+      WideCharToMultiByte(CP_ACP, 0, utf16_str, -1,
+                          NULL, 0, NULL, NULL);
+  char* ansi = new char[ansi_length + 1];
+  WideCharToMultiByte(CP_ACP, 0, utf16_str, -1,
+                      ansi, ansi_length, NULL, NULL);
+  ansi[ansi_length] = 0;
+  return ansi;
+}
+
+#endif  // GTEST_OS_WINDOWS_MOBILE
+
+// Compares two C strings.  Returns true iff they have the same content.
+//
+// Unlike strcmp(), this function can handle NULL argument(s).  A NULL
+// C string is considered different to any non-NULL C string,
+// including the empty string.
+bool String::CStringEquals(const char * lhs, const char * rhs) {
+  if ( lhs == NULL ) return rhs == NULL;
+
+  if ( rhs == NULL ) return false;
+
+  return strcmp(lhs, rhs) == 0;
+}
+
+#if GTEST_HAS_STD_WSTRING || GTEST_HAS_GLOBAL_WSTRING
+
+// Converts an array of wide chars to a narrow string using the UTF-8
+// encoding, and streams the result to the given Message object.
+static void StreamWideCharsToMessage(const wchar_t* wstr, size_t length,
+                                     Message* msg) {
+  for (size_t i = 0; i != length; ) {  // NOLINT
+    if (wstr[i] != L'\0') {
+      *msg << WideStringToUtf8(wstr + i, static_cast<int>(length - i));
+      while (i != length && wstr[i] != L'\0')
+        i++;
+    } else {
+      *msg << '\0';
+      i++;
+    }
+  }
+}
+
+#endif  // GTEST_HAS_STD_WSTRING || GTEST_HAS_GLOBAL_WSTRING
+
+}  // namespace internal
+
+// Constructs an empty Message.
+// We allocate the stringstream separately because otherwise each use of
+// ASSERT/EXPECT in a procedure adds over 200 bytes to the procedure's
+// stack frame leading to huge stack frames in some cases; gcc does not reuse
+// the stack space.
+Message::Message() : ss_(new ::std::stringstream) {
+  // By default, we want there to be enough precision when printing
+  // a double to a Message.
+  *ss_ << std::setprecision(std::numeric_limits<double>::digits10 + 2);
+}
+
+// These two overloads allow streaming a wide C string to a Message
+// using the UTF-8 encoding.
+Message& Message::operator <<(const wchar_t* wide_c_str) {
+  return *this << internal::String::ShowWideCString(wide_c_str);
+}
+Message& Message::operator <<(wchar_t* wide_c_str) {
+  return *this << internal::String::ShowWideCString(wide_c_str);
+}
+
+#if GTEST_HAS_STD_WSTRING
+// Converts the given wide string to a narrow string using the UTF-8
+// encoding, and streams the result to this Message object.
+Message& Message::operator <<(const ::std::wstring& wstr) {
+  internal::StreamWideCharsToMessage(wstr.c_str(), wstr.length(), this);
+  return *this;
+}
+#endif  // GTEST_HAS_STD_WSTRING
+
+#if GTEST_HAS_GLOBAL_WSTRING
+// Converts the given wide string to a narrow string using the UTF-8
+// encoding, and streams the result to this Message object.
+Message& Message::operator <<(const ::wstring& wstr) {
+  internal::StreamWideCharsToMessage(wstr.c_str(), wstr.length(), this);
+  return *this;
+}
+#endif  // GTEST_HAS_GLOBAL_WSTRING
+
+// Gets the text streamed to this object so far as an std::string.
+// Each '\0' character in the buffer is replaced with "\\0".
+std::string Message::GetString() const {
+  return internal::StringStreamToString(ss_.get());
+}
+
+// AssertionResult constructors.
+// Used in EXPECT_TRUE/FALSE(assertion_result).
+AssertionResult::AssertionResult(const AssertionResult& other)
+    : success_(other.success_),
+      message_(other.message_.get() != NULL ?
+               new ::std::string(*other.message_) :
+               static_cast< ::std::string*>(NULL)) {
+}
+
+// Returns the assertion's negation. Used with EXPECT/ASSERT_FALSE.
+AssertionResult AssertionResult::operator!() const {
+  AssertionResult negation(!success_);
+  if (message_.get() != NULL)
+    negation << *message_;
+  return negation;
+}
+
+// Makes a successful assertion result.
+AssertionResult AssertionSuccess() {
+  return AssertionResult(true);
+}
+
+// Makes a failed assertion result.
+AssertionResult AssertionFailure() {
+  return AssertionResult(false);
+}
+
+// Makes a failed assertion result with the given failure message.
+// Deprecated; use AssertionFailure() << message.
+AssertionResult AssertionFailure(const Message& message) {
+  return AssertionFailure() << message;
+}
+
+namespace internal {
+
+// Constructs and returns the message for an equality assertion
+// (e.g. ASSERT_EQ, EXPECT_STREQ, etc) failure.
+//
+// The first four parameters are the expressions used in the assertion
+// and their values, as strings.  For example, for ASSERT_EQ(foo, bar)
+// where foo is 5 and bar is 6, we have:
+//
+//   expected_expression: "foo"
+//   actual_expression:   "bar"
+//   expected_value:      "5"
+//   actual_value:        "6"
+//
+// The ignoring_case parameter is true iff the assertion is a
+// *_STRCASEEQ*.  When it's true, the string " (ignoring case)" will
+// be inserted into the message.
+AssertionResult EqFailure(const char* expected_expression,
+                          const char* actual_expression,
+                          const std::string& expected_value,
+                          const std::string& actual_value,
+                          bool ignoring_case) {
+  Message msg;
+  msg << "Value of: " << actual_expression;
+  if (actual_value != actual_expression) {
+    msg << "\n  Actual: " << actual_value;
+  }
+
+  msg << "\nExpected: " << expected_expression;
+  if (ignoring_case) {
+    msg << " (ignoring case)";
+  }
+  if (expected_value != expected_expression) {
+    msg << "\nWhich is: " << expected_value;
+  }
+
+  return AssertionFailure() << msg;
+}
+
+// Constructs a failure message for Boolean assertions such as EXPECT_TRUE.
+std::string GetBoolAssertionFailureMessage(
+    const AssertionResult& assertion_result,
+    const char* expression_text,
+    const char* actual_predicate_value,
+    const char* expected_predicate_value) {
+  const char* actual_message = assertion_result.message();
+  Message msg;
+  msg << "Value of: " << expression_text
+      << "\n  Actual: " << actual_predicate_value;
+  if (actual_message[0] != '\0')
+    msg << " (" << actual_message << ")";
+  msg << "\nExpected: " << expected_predicate_value;
+  return msg.GetString();
+}
+
+// Helper function for implementing ASSERT_NEAR.
+AssertionResult DoubleNearPredFormat(const char* expr1,
+                                     const char* expr2,
+                                     const char* abs_error_expr,
+                                     double val1,
+                                     double val2,
+                                     double abs_error) {
+  const double diff = fabs(val1 - val2);
+  if (diff <= abs_error) return AssertionSuccess();
+
+  // TODO(wan): do not print the value of an expression if it's
+  // already a literal.
+  return AssertionFailure()
+      << "The difference between " << expr1 << " and " << expr2
+      << " is " << diff << ", which exceeds " << abs_error_expr << ", where\n"
+      << expr1 << " evaluates to " << val1 << ",\n"
+      << expr2 << " evaluates to " << val2 << ", and\n"
+      << abs_error_expr << " evaluates to " << abs_error << ".";
+}
+
+
+// Helper template for implementing FloatLE() and DoubleLE().
+template <typename RawType>
+AssertionResult FloatingPointLE(const char* expr1,
+                                const char* expr2,
+                                RawType val1,
+                                RawType val2) {
+  // Returns success if val1 is less than val2,
+  if (val1 < val2) {
+    return AssertionSuccess();
+  }
+
+  // or if val1 is almost equal to val2.
+  const FloatingPoint<RawType> lhs(val1), rhs(val2);
+  if (lhs.AlmostEquals(rhs)) {
+    return AssertionSuccess();
+  }
+
+  // Note that the above two checks will both fail if either val1 or
+  // val2 is NaN, as the IEEE floating-point standard requires that
+  // any predicate involving a NaN must return false.
+
+  ::std::stringstream val1_ss;
+  val1_ss << std::setprecision(std::numeric_limits<RawType>::digits10 + 2)
+          << val1;
+
+  ::std::stringstream val2_ss;
+  val2_ss << std::setprecision(std::numeric_limits<RawType>::digits10 + 2)
+          << val2;
+
+  return AssertionFailure()
+      << "Expected: (" << expr1 << ") <= (" << expr2 << ")\n"
+      << "  Actual: " << StringStreamToString(&val1_ss) << " vs "
+      << StringStreamToString(&val2_ss);
+}
+
+}  // namespace internal
+
+// Asserts that val1 is less than, or almost equal to, val2.  Fails
+// otherwise.  In particular, it fails if either val1 or val2 is NaN.
+AssertionResult FloatLE(const char* expr1, const char* expr2,
+                        float val1, float val2) {
+  return internal::FloatingPointLE<float>(expr1, expr2, val1, val2);
+}
+
+// Asserts that val1 is less than, or almost equal to, val2.  Fails
+// otherwise.  In particular, it fails if either val1 or val2 is NaN.
+AssertionResult DoubleLE(const char* expr1, const char* expr2,
+                         double val1, double val2) {
+  return internal::FloatingPointLE<double>(expr1, expr2, val1, val2);
+}
+
+namespace internal {
+
+// The helper function for {ASSERT|EXPECT}_EQ with int or enum
+// arguments.
+AssertionResult CmpHelperEQ(const char* expected_expression,
+                            const char* actual_expression,
+                            BiggestInt expected,
+                            BiggestInt actual) {
+  if (expected == actual) {
+    return AssertionSuccess();
+  }
+
+  return EqFailure(expected_expression,
+                   actual_expression,
+                   FormatForComparisonFailureMessage(expected, actual),
+                   FormatForComparisonFailureMessage(actual, expected),
+                   false);
+}
+
+// A macro for implementing the helper functions needed to implement
+// ASSERT_?? and EXPECT_?? with integer or enum arguments.  It is here
+// just to avoid copy-and-paste of similar code.
+#define GTEST_IMPL_CMP_HELPER_(op_name, op)\
+AssertionResult CmpHelper##op_name(const char* expr1, const char* expr2, \
+                                   BiggestInt val1, BiggestInt val2) {\
+  if (val1 op val2) {\
+    return AssertionSuccess();\
+  } else {\
+    return AssertionFailure() \
+        << "Expected: (" << expr1 << ") " #op " (" << expr2\
+        << "), actual: " << FormatForComparisonFailureMessage(val1, val2)\
+        << " vs " << FormatForComparisonFailureMessage(val2, val1);\
+  }\
+}
+
+// Implements the helper function for {ASSERT|EXPECT}_NE with int or
+// enum arguments.
+GTEST_IMPL_CMP_HELPER_(NE, !=)
+// Implements the helper function for {ASSERT|EXPECT}_LE with int or
+// enum arguments.
+GTEST_IMPL_CMP_HELPER_(LE, <=)
+// Implements the helper function for {ASSERT|EXPECT}_LT with int or
+// enum arguments.
+GTEST_IMPL_CMP_HELPER_(LT, < )
+// Implements the helper function for {ASSERT|EXPECT}_GE with int or
+// enum arguments.
+GTEST_IMPL_CMP_HELPER_(GE, >=)
+// Implements the helper function for {ASSERT|EXPECT}_GT with int or
+// enum arguments.
+GTEST_IMPL_CMP_HELPER_(GT, > )
+
+#undef GTEST_IMPL_CMP_HELPER_
+
+// The helper function for {ASSERT|EXPECT}_STREQ.
+AssertionResult CmpHelperSTREQ(const char* expected_expression,
+                               const char* actual_expression,
+                               const char* expected,
+                               const char* actual) {
+  if (String::CStringEquals(expected, actual)) {
+    return AssertionSuccess();
+  }
+
+  return EqFailure(expected_expression,
+                   actual_expression,
+                   PrintToString(expected),
+                   PrintToString(actual),
+                   false);
+}
+
+// The helper function for {ASSERT|EXPECT}_STRCASEEQ.
+AssertionResult CmpHelperSTRCASEEQ(const char* expected_expression,
+                                   const char* actual_expression,
+                                   const char* expected,
+                                   const char* actual) {
+  if (String::CaseInsensitiveCStringEquals(expected, actual)) {
+    return AssertionSuccess();
+  }
+
+  return EqFailure(expected_expression,
+                   actual_expression,
+                   PrintToString(expected),
+                   PrintToString(actual),
+                   true);
+}
+
+// The helper function for {ASSERT|EXPECT}_STRNE.
+AssertionResult CmpHelperSTRNE(const char* s1_expression,
+                               const char* s2_expression,
+                               const char* s1,
+                               const char* s2) {
+  if (!String::CStringEquals(s1, s2)) {
+    return AssertionSuccess();
+  } else {
+    return AssertionFailure() << "Expected: (" << s1_expression << ") != ("
+                              << s2_expression << "), actual: \""
+                              << s1 << "\" vs \"" << s2 << "\"";
+  }
+}
+
+// The helper function for {ASSERT|EXPECT}_STRCASENE.
+AssertionResult CmpHelperSTRCASENE(const char* s1_expression,
+                                   const char* s2_expression,
+                                   const char* s1,
+                                   const char* s2) {
+  if (!String::CaseInsensitiveCStringEquals(s1, s2)) {
+    return AssertionSuccess();
+  } else {
+    return AssertionFailure()
+        << "Expected: (" << s1_expression << ") != ("
+        << s2_expression << ") (ignoring case), actual: \""
+        << s1 << "\" vs \"" << s2 << "\"";
+  }
+}
+
+}  // namespace internal
+
+namespace {
+
+// Helper functions for implementing IsSubString() and IsNotSubstring().
+
+// This group of overloaded functions return true iff needle is a
+// substring of haystack.  NULL is considered a substring of itself
+// only.
+
+bool IsSubstringPred(const char* needle, const char* haystack) {
+  if (needle == NULL || haystack == NULL)
+    return needle == haystack;
+
+  return strstr(haystack, needle) != NULL;
+}
+
+bool IsSubstringPred(const wchar_t* needle, const wchar_t* haystack) {
+  if (needle == NULL || haystack == NULL)
+    return needle == haystack;
+
+  return wcsstr(haystack, needle) != NULL;
+}
+
+// StringType here can be either ::std::string or ::std::wstring.
+template <typename StringType>
+bool IsSubstringPred(const StringType& needle,
+                     const StringType& haystack) {
+  return haystack.find(needle) != StringType::npos;
+}
+
+// This function implements either IsSubstring() or IsNotSubstring(),
+// depending on the value of the expected_to_be_substring parameter.
+// StringType here can be const char*, const wchar_t*, ::std::string,
+// or ::std::wstring.
+template <typename StringType>
+AssertionResult IsSubstringImpl(
+    bool expected_to_be_substring,
+    const char* needle_expr, const char* haystack_expr,
+    const StringType& needle, const StringType& haystack) {
+  if (IsSubstringPred(needle, haystack) == expected_to_be_substring)
+    return AssertionSuccess();
+
+  const bool is_wide_string = sizeof(needle[0]) > 1;
+  const char* const begin_string_quote = is_wide_string ? "L\"" : "\"";
+  return AssertionFailure()
+      << "Value of: " << needle_expr << "\n"
+      << "  Actual: " << begin_string_quote << needle << "\"\n"
+      << "Expected: " << (expected_to_be_substring ? "" : "not ")
+      << "a substring of " << haystack_expr << "\n"
+      << "Which is: " << begin_string_quote << haystack << "\"";
+}
+
+}  // namespace
+
+// IsSubstring() and IsNotSubstring() check whether needle is a
+// substring of haystack (NULL is considered a substring of itself
+// only), and return an appropriate error message when they fail.
+
+AssertionResult IsSubstring(
+    const char* needle_expr, const char* haystack_expr,
+    const char* needle, const char* haystack) {
+  return IsSubstringImpl(true, needle_expr, haystack_expr, needle, haystack);
+}
+
+AssertionResult IsSubstring(
+    const char* needle_expr, const char* haystack_expr,
+    const wchar_t* needle, const wchar_t* haystack) {
+  return IsSubstringImpl(true, needle_expr, haystack_expr, needle, haystack);
+}
+
+AssertionResult IsNotSubstring(
+    const char* needle_expr, const char* haystack_expr,
+    const char* needle, const char* haystack) {
+  return IsSubstringImpl(false, needle_expr, haystack_expr, needle, haystack);
+}
+
+AssertionResult IsNotSubstring(
+    const char* needle_expr, const char* haystack_expr,
+    const wchar_t* needle, const wchar_t* haystack) {
+  return IsSubstringImpl(false, needle_expr, haystack_expr, needle, haystack);
+}
+
+AssertionResult IsSubstring(
+    const char* needle_expr, const char* haystack_expr,
+    const ::std::string& needle, const ::std::string& haystack) {
+  return IsSubstringImpl(true, needle_expr, haystack_expr, needle, haystack);
+}
+
+AssertionResult IsNotSubstring(
+    const char* needle_expr, const char* haystack_expr,
+    const ::std::string& needle, const ::std::string& haystack) {
+  return IsSubstringImpl(false, needle_expr, haystack_expr, needle, haystack);
+}
+
+#if GTEST_HAS_STD_WSTRING
+AssertionResult IsSubstring(
+    const char* needle_expr, const char* haystack_expr,
+    const ::std::wstring& needle, const ::std::wstring& haystack) {
+  return IsSubstringImpl(true, needle_expr, haystack_expr, needle, haystack);
+}
+
+AssertionResult IsNotSubstring(
+    const char* needle_expr, const char* haystack_expr,
+    const ::std::wstring& needle, const ::std::wstring& haystack) {
+  return IsSubstringImpl(false, needle_expr, haystack_expr, needle, haystack);
+}
+#endif  // GTEST_HAS_STD_WSTRING
+
+namespace internal {
+
+#if GTEST_OS_WINDOWS
+
+namespace {
+
+// Helper function for IsHRESULT{SuccessFailure} predicates
+AssertionResult HRESULTFailureHelper(const char* expr,
+                                     const char* expected,
+                                     long hr) {  // NOLINT
+# if GTEST_OS_WINDOWS_MOBILE
+
+  // Windows CE doesn't support FormatMessage.
+  const char error_text[] = "";
+
+# else
+
+  // Looks up the human-readable system message for the HRESULT code
+  // and since we're not passing any params to FormatMessage, we don't
+  // want inserts expanded.
+  const DWORD kFlags = FORMAT_MESSAGE_FROM_SYSTEM |
+                       FORMAT_MESSAGE_IGNORE_INSERTS;
+  const DWORD kBufSize = 4096;
+  // Gets the system's human readable message string for this HRESULT.
+  char error_text[kBufSize] = { '\0' };
+  DWORD message_length = ::FormatMessageA(kFlags,
+                                          0,  // no source, we're asking system
+                                          hr,  // the error
+                                          0,  // no line width restrictions
+                                          error_text,  // output buffer
+                                          kBufSize,  // buf size
+                                          NULL);  // no arguments for inserts
+  // Trims tailing white space (FormatMessage leaves a trailing CR-LF)
+  for (; message_length && IsSpace(error_text[message_length - 1]);
+          --message_length) {
+    error_text[message_length - 1] = '\0';
+  }
+
+# endif  // GTEST_OS_WINDOWS_MOBILE
+
+  const std::string error_hex("0x" + String::FormatHexInt(hr));
+  return ::testing::AssertionFailure()
+      << "Expected: " << expr << " " << expected << ".\n"
+      << "  Actual: " << error_hex << " " << error_text << "\n";
+}
+
+}  // namespace
+
+AssertionResult IsHRESULTSuccess(const char* expr, long hr) {  // NOLINT
+  if (SUCCEEDED(hr)) {
+    return AssertionSuccess();
+  }
+  return HRESULTFailureHelper(expr, "succeeds", hr);
+}
+
+AssertionResult IsHRESULTFailure(const char* expr, long hr) {  // NOLINT
+  if (FAILED(hr)) {
+    return AssertionSuccess();
+  }
+  return HRESULTFailureHelper(expr, "fails", hr);
+}
+
+#endif  // GTEST_OS_WINDOWS
+
+// Utility functions for encoding Unicode text (wide strings) in
+// UTF-8.
+
+// A Unicode code-point can have upto 21 bits, and is encoded in UTF-8
+// like this:
+//
+// Code-point length   Encoding
+//   0 -  7 bits       0xxxxxxx
+//   8 - 11 bits       110xxxxx 10xxxxxx
+//  12 - 16 bits       1110xxxx 10xxxxxx 10xxxxxx
+//  17 - 21 bits       11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
+
+// The maximum code-point a one-byte UTF-8 sequence can represent.
+const UInt32 kMaxCodePoint1 = (static_cast<UInt32>(1) <<  7) - 1;
+
+// The maximum code-point a two-byte UTF-8 sequence can represent.
+const UInt32 kMaxCodePoint2 = (static_cast<UInt32>(1) << (5 + 6)) - 1;
+
+// The maximum code-point a three-byte UTF-8 sequence can represent.
+const UInt32 kMaxCodePoint3 = (static_cast<UInt32>(1) << (4 + 2*6)) - 1;
+
+// The maximum code-point a four-byte UTF-8 sequence can represent.
+const UInt32 kMaxCodePoint4 = (static_cast<UInt32>(1) << (3 + 3*6)) - 1;
+
+// Chops off the n lowest bits from a bit pattern.  Returns the n
+// lowest bits.  As a side effect, the original bit pattern will be
+// shifted to the right by n bits.
+inline UInt32 ChopLowBits(UInt32* bits, int n) {
+  const UInt32 low_bits = *bits & ((static_cast<UInt32>(1) << n) - 1);
+  *bits >>= n;
+  return low_bits;
+}
+
+// Converts a Unicode code point to a narrow string in UTF-8 encoding.
+// code_point parameter is of type UInt32 because wchar_t may not be
+// wide enough to contain a code point.
+// If the code_point is not a valid Unicode code point
+// (i.e. outside of Unicode range U+0 to U+10FFFF) it will be converted
+// to "(Invalid Unicode 0xXXXXXXXX)".
+std::string CodePointToUtf8(UInt32 code_point) {
+  if (code_point > kMaxCodePoint4) {
+    return "(Invalid Unicode 0x" + String::FormatHexInt(code_point) + ")";
+  }
+
+  char str[5];  // Big enough for the largest valid code point.
+  if (code_point <= kMaxCodePoint1) {
+    str[1] = '\0';
+    str[0] = static_cast<char>(code_point);                          // 0xxxxxxx
+  } else if (code_point <= kMaxCodePoint2) {
+    str[2] = '\0';
+    str[1] = static_cast<char>(0x80 | ChopLowBits(&code_point, 6));  // 10xxxxxx
+    str[0] = static_cast<char>(0xC0 | code_point);                   // 110xxxxx
+  } else if (code_point <= kMaxCodePoint3) {
+    str[3] = '\0';
+    str[2] = static_cast<char>(0x80 | ChopLowBits(&code_point, 6));  // 10xxxxxx
+    str[1] = static_cast<char>(0x80 | ChopLowBits(&code_point, 6));  // 10xxxxxx
+    str[0] = static_cast<char>(0xE0 | code_point);                   // 1110xxxx
+  } else {  // code_point <= kMaxCodePoint4
+    str[4] = '\0';
+    str[3] = static_cast<char>(0x80 | ChopLowBits(&code_point, 6));  // 10xxxxxx
+    str[2] = static_cast<char>(0x80 | ChopLowBits(&code_point, 6));  // 10xxxxxx
+    str[1] = static_cast<char>(0x80 | ChopLowBits(&code_point, 6));  // 10xxxxxx
+    str[0] = static_cast<char>(0xF0 | code_point);                   // 11110xxx
+  }
+  return str;
+}
+
+// The following two functions only make sense if the the system
+// uses UTF-16 for wide string encoding. All supported systems
+// with 16 bit wchar_t (Windows, Cygwin, Symbian OS) do use UTF-16.
+
+// Determines if the arguments constitute UTF-16 surrogate pair
+// and thus should be combined into a single Unicode code point
+// using CreateCodePointFromUtf16SurrogatePair.
+inline bool IsUtf16SurrogatePair(wchar_t first, wchar_t second) {
+  return sizeof(wchar_t) == 2 &&
+      (first & 0xFC00) == 0xD800 && (second & 0xFC00) == 0xDC00;
+}
+
+// Creates a Unicode code point from UTF16 surrogate pair.
+inline UInt32 CreateCodePointFromUtf16SurrogatePair(wchar_t first,
+                                                    wchar_t second) {
+  const UInt32 mask = (1 << 10) - 1;
+  return (sizeof(wchar_t) == 2) ?
+      (((first & mask) << 10) | (second & mask)) + 0x10000 :
+      // This function should not be called when the condition is
+      // false, but we provide a sensible default in case it is.
+      static_cast<UInt32>(first);
+}
+
+// Converts a wide string to a narrow string in UTF-8 encoding.
+// The wide string is assumed to have the following encoding:
+//   UTF-16 if sizeof(wchar_t) == 2 (on Windows, Cygwin, Symbian OS)
+//   UTF-32 if sizeof(wchar_t) == 4 (on Linux)
+// Parameter str points to a null-terminated wide string.
+// Parameter num_chars may additionally limit the number
+// of wchar_t characters processed. -1 is used when the entire string
+// should be processed.
+// If the string contains code points that are not valid Unicode code points
+// (i.e. outside of Unicode range U+0 to U+10FFFF) they will be output
+// as '(Invalid Unicode 0xXXXXXXXX)'. If the string is in UTF16 encoding
+// and contains invalid UTF-16 surrogate pairs, values in those pairs
+// will be encoded as individual Unicode characters from Basic Normal Plane.
+std::string WideStringToUtf8(const wchar_t* str, int num_chars) {
+  if (num_chars == -1)
+    num_chars = static_cast<int>(wcslen(str));
+
+  ::std::stringstream stream;
+  for (int i = 0; i < num_chars; ++i) {
+    UInt32 unicode_code_point;
+
+    if (str[i] == L'\0') {
+      break;
+    } else if (i + 1 < num_chars && IsUtf16SurrogatePair(str[i], str[i + 1])) {
+      unicode_code_point = CreateCodePointFromUtf16SurrogatePair(str[i],
+                                                                 str[i + 1]);
+      i++;
+    } else {
+      unicode_code_point = static_cast<UInt32>(str[i]);
+    }
+
+    stream << CodePointToUtf8(unicode_code_point);
+  }
+  return StringStreamToString(&stream);
+}
+
+// Converts a wide C string to an std::string using the UTF-8 encoding.
+// NULL will be converted to "(null)".
+std::string String::ShowWideCString(const wchar_t * wide_c_str) {
+  if (wide_c_str == NULL)  return "(null)";
+
+  return internal::WideStringToUtf8(wide_c_str, -1);
+}
+
+// Compares two wide C strings.  Returns true iff they have the same
+// content.
+//
+// Unlike wcscmp(), this function can handle NULL argument(s).  A NULL
+// C string is considered different to any non-NULL C string,
+// including the empty string.
+bool String::WideCStringEquals(const wchar_t * lhs, const wchar_t * rhs) {
+  if (lhs == NULL) return rhs == NULL;
+
+  if (rhs == NULL) return false;
+
+  return wcscmp(lhs, rhs) == 0;
+}
+
+// Helper function for *_STREQ on wide strings.
+AssertionResult CmpHelperSTREQ(const char* expected_expression,
+                               const char* actual_expression,
+                               const wchar_t* expected,
+                               const wchar_t* actual) {
+  if (String::WideCStringEquals(expected, actual)) {
+    return AssertionSuccess();
+  }
+
+  return EqFailure(expected_expression,
+                   actual_expression,
+                   PrintToString(expected),
+                   PrintToString(actual),
+                   false);
+}
+
+// Helper function for *_STRNE on wide strings.
+AssertionResult CmpHelperSTRNE(const char* s1_expression,
+                               const char* s2_expression,
+                               const wchar_t* s1,
+                               const wchar_t* s2) {
+  if (!String::WideCStringEquals(s1, s2)) {
+    return AssertionSuccess();
+  }
+
+  return AssertionFailure() << "Expected: (" << s1_expression << ") != ("
+                            << s2_expression << "), actual: "
+                            << PrintToString(s1)
+                            << " vs " << PrintToString(s2);
+}
+
+// Compares two C strings, ignoring case.  Returns true iff they have
+// the same content.
+//
+// Unlike strcasecmp(), this function can handle NULL argument(s).  A
+// NULL C string is considered different to any non-NULL C string,
+// including the empty string.
+bool String::CaseInsensitiveCStringEquals(const char * lhs, const char * rhs) {
+  if (lhs == NULL)
+    return rhs == NULL;
+  if (rhs == NULL)
+    return false;
+  return posix::StrCaseCmp(lhs, rhs) == 0;
+}
+
+  // Compares two wide C strings, ignoring case.  Returns true iff they
+  // have the same content.
+  //
+  // Unlike wcscasecmp(), this function can handle NULL argument(s).
+  // A NULL C string is considered different to any non-NULL wide C string,
+  // including the empty string.
+  // NB: The implementations on different platforms slightly differ.
+  // On windows, this method uses _wcsicmp which compares according to LC_CTYPE
+  // environment variable. On GNU platform this method uses wcscasecmp
+  // which compares according to LC_CTYPE category of the current locale.
+  // On MacOS X, it uses towlower, which also uses LC_CTYPE category of the
+  // current locale.
+bool String::CaseInsensitiveWideCStringEquals(const wchar_t* lhs,
+                                              const wchar_t* rhs) {
+  if (lhs == NULL) return rhs == NULL;
+
+  if (rhs == NULL) return false;
+
+#if GTEST_OS_WINDOWS
+  return _wcsicmp(lhs, rhs) == 0;
+#elif GTEST_OS_LINUX && !GTEST_OS_LINUX_ANDROID
+  return wcscasecmp(lhs, rhs) == 0;
+#else
+  // Android, Mac OS X and Cygwin don't define wcscasecmp.
+  // Other unknown OSes may not define it either.
+  wint_t left, right;
+  do {
+    left = towlower(*lhs++);
+    right = towlower(*rhs++);
+  } while (left && left == right);
+  return left == right;
+#endif  // OS selector
+}
+
+// Returns true iff str ends with the given suffix, ignoring case.
+// Any string is considered to end with an empty suffix.
+bool String::EndsWithCaseInsensitive(
+    const std::string& str, const std::string& suffix) {
+  const size_t str_len = str.length();
+  const size_t suffix_len = suffix.length();
+  return (str_len >= suffix_len) &&
+         CaseInsensitiveCStringEquals(str.c_str() + str_len - suffix_len,
+                                      suffix.c_str());
+}
+
+// Formats an int value as "%02d".
+std::string String::FormatIntWidth2(int value) {
+  std::stringstream ss;
+  ss << std::setfill('0') << std::setw(2) << value;
+  return ss.str();
+}
+
+// Formats an int value as "%X".
+std::string String::FormatHexInt(int value) {
+  std::stringstream ss;
+  ss << std::hex << std::uppercase << value;
+  return ss.str();
+}
+
+// Formats a byte as "%02X".
+std::string String::FormatByte(unsigned char value) {
+  std::stringstream ss;
+  ss << std::setfill('0') << std::setw(2) << std::hex << std::uppercase
+     << static_cast<unsigned int>(value);
+  return ss.str();
+}
+
+// Converts the buffer in a stringstream to an std::string, converting NUL
+// bytes to "\\0" along the way.
+std::string StringStreamToString(::std::stringstream* ss) {
+  const ::std::string& str = ss->str();
+  const char* const start = str.c_str();
+  const char* const end = start + str.length();
+
+  std::string result;
+  result.reserve(2 * (end - start));
+  for (const char* ch = start; ch != end; ++ch) {
+    if (*ch == '\0') {
+      result += "\\0";  // Replaces NUL with "\\0";
+    } else {
+      result += *ch;
+    }
+  }
+
+  return result;
+}
+
+// Appends the user-supplied message to the Google-Test-generated message.
+std::string AppendUserMessage(const std::string& gtest_msg,
+                              const Message& user_msg) {
+  // Appends the user message if it's non-empty.
+  const std::string user_msg_string = user_msg.GetString();
+  if (user_msg_string.empty()) {
+    return gtest_msg;
+  }
+
+  return gtest_msg + "\n" + user_msg_string;
+}
+
+}  // namespace internal
+
+// class TestResult
+
+// Creates an empty TestResult.
+TestResult::TestResult()
+    : death_test_count_(0),
+      elapsed_time_(0) {
+}
+
+// D'tor.
+TestResult::~TestResult() {
+}
+
+// Returns the i-th test part result among all the results. i can
+// range from 0 to total_part_count() - 1. If i is not in that range,
+// aborts the program.
+const TestPartResult& TestResult::GetTestPartResult(int i) const {
+  if (i < 0 || i >= total_part_count())
+    internal::posix::Abort();
+  return test_part_results_.at(i);
+}
+
+// Returns the i-th test property. i can range from 0 to
+// test_property_count() - 1. If i is not in that range, aborts the
+// program.
+const TestProperty& TestResult::GetTestProperty(int i) const {
+  if (i < 0 || i >= test_property_count())
+    internal::posix::Abort();
+  return test_properties_.at(i);
+}
+
+// Clears the test part results.
+void TestResult::ClearTestPartResults() {
+  test_part_results_.clear();
+}
+
+// Adds a test part result to the list.
+void TestResult::AddTestPartResult(const TestPartResult& test_part_result) {
+  test_part_results_.push_back(test_part_result);
+}
+
+// Adds a test property to the list. If a property with the same key as the
+// supplied property is already represented, the value of this test_property
+// replaces the old value for that key.
+void TestResult::RecordProperty(const std::string& xml_element,
+                                const TestProperty& test_property) {
+  if (!ValidateTestProperty(xml_element, test_property)) {
+    return;
+  }
+  internal::MutexLock lock(&test_properites_mutex_);
+  const std::vector<TestProperty>::iterator property_with_matching_key =
+      std::find_if(test_properties_.begin(), test_properties_.end(),
+                   internal::TestPropertyKeyIs(test_property.key()));
+  if (property_with_matching_key == test_properties_.end()) {
+    test_properties_.push_back(test_property);
+    return;
+  }
+  property_with_matching_key->SetValue(test_property.value());
+}
+
+// The list of reserved attributes used in the <testsuites> element of XML
+// output.
+static const char* const kReservedTestSuitesAttributes[] = {
+  "disabled",
+  "errors",
+  "failures",
+  "name",
+  "random_seed",
+  "tests",
+  "time",
+  "timestamp"
+};
+
+// The list of reserved attributes used in the <testsuite> element of XML
+// output.
+static const char* const kReservedTestSuiteAttributes[] = {
+  "disabled",
+  "errors",
+  "failures",
+  "name",
+  "tests",
+  "time"
+};
+
+// The list of reserved attributes used in the <testcase> element of XML output.
+static const char* const kReservedTestCaseAttributes[] = {
+  "classname",
+  "name",
+  "status",
+  "time",
+  "type_param",
+  "value_param"
+};
+
+template <int kSize>
+std::vector<std::string> ArrayAsVector(const char* const (&array)[kSize]) {
+  return std::vector<std::string>(array, array + kSize);
+}
+
+static std::vector<std::string> GetReservedAttributesForElement(
+    const std::string& xml_element) {
+  if (xml_element == "testsuites") {
+    return ArrayAsVector(kReservedTestSuitesAttributes);
+  } else if (xml_element == "testsuite") {
+    return ArrayAsVector(kReservedTestSuiteAttributes);
+  } else if (xml_element == "testcase") {
+    return ArrayAsVector(kReservedTestCaseAttributes);
+  } else {
+    GTEST_CHECK_(false) << "Unrecognized xml_element provided: " << xml_element;
+  }
+  // This code is unreachable but some compilers may not realizes that.
+  return std::vector<std::string>();
+}
+
+static std::string FormatWordList(const std::vector<std::string>& words) {
+  Message word_list;
+  for (size_t i = 0; i < words.size(); ++i) {
+    if (i > 0 && words.size() > 2) {
+      word_list << ", ";
+    }
+    if (i == words.size() - 1) {
+      word_list << "and ";
+    }
+    word_list << "'" << words[i] << "'";
+  }
+  return word_list.GetString();
+}
+
+bool ValidateTestPropertyName(const std::string& property_name,
+                              const std::vector<std::string>& reserved_names) {
+  if (std::find(reserved_names.begin(), reserved_names.end(), property_name) !=
+          reserved_names.end()) {
+    ADD_FAILURE() << "Reserved key used in RecordProperty(): " << property_name
+                  << " (" << FormatWordList(reserved_names)
+                  << " are reserved by " << GTEST_NAME_ << ")";
+    return false;
+  }
+  return true;
+}
+
+// Adds a failure if the key is a reserved attribute of the element named
+// xml_element.  Returns true if the property is valid.
+bool TestResult::ValidateTestProperty(const std::string& xml_element,
+                                      const TestProperty& test_property) {
+  return ValidateTestPropertyName(test_property.key(),
+                                  GetReservedAttributesForElement(xml_element));
+}
+
+// Clears the object.
+void TestResult::Clear() {
+  test_part_results_.clear();
+  test_properties_.clear();
+  death_test_count_ = 0;
+  elapsed_time_ = 0;
+}
+
+// Returns true iff the test failed.
+bool TestResult::Failed() const {
+  for (int i = 0; i < total_part_count(); ++i) {
+    if (GetTestPartResult(i).failed())
+      return true;
+  }
+  return false;
+}
+
+// Returns true iff the test part fatally failed.
+static bool TestPartFatallyFailed(const TestPartResult& result) {
+  return result.fatally_failed();
+}
+
+// Returns true iff the test fatally failed.
+bool TestResult::HasFatalFailure() const {
+  return CountIf(test_part_results_, TestPartFatallyFailed) > 0;
+}
+
+// Returns true iff the test part non-fatally failed.
+static bool TestPartNonfatallyFailed(const TestPartResult& result) {
+  return result.nonfatally_failed();
+}
+
+// Returns true iff the test has a non-fatal failure.
+bool TestResult::HasNonfatalFailure() const {
+  return CountIf(test_part_results_, TestPartNonfatallyFailed) > 0;
+}
+
+// Gets the number of all test parts.  This is the sum of the number
+// of successful test parts and the number of failed test parts.
+int TestResult::total_part_count() const {
+  return static_cast<int>(test_part_results_.size());
+}
+
+// Returns the number of the test properties.
+int TestResult::test_property_count() const {
+  return static_cast<int>(test_properties_.size());
+}
+
+// class Test
+
+// Creates a Test object.
+
+// The c'tor saves the values of all Google Test flags.
+Test::Test()
+    : gtest_flag_saver_(new internal::GTestFlagSaver) {
+}
+
+// The d'tor restores the values of all Google Test flags.
+Test::~Test() {
+  delete gtest_flag_saver_;
+}
+
+// Sets up the test fixture.
+//
+// A sub-class may override this.
+void Test::SetUp() {
+}
+
+// Tears down the test fixture.
+//
+// A sub-class may override this.
+void Test::TearDown() {
+}
+
+// Allows user supplied key value pairs to be recorded for later output.
+void Test::RecordProperty(const std::string& key, const std::string& value) {
+  UnitTest::GetInstance()->RecordProperty(key, value);
+}
+
+// Allows user supplied key value pairs to be recorded for later output.
+void Test::RecordProperty(const std::string& key, int value) {
+  Message value_message;
+  value_message << value;
+  RecordProperty(key, value_message.GetString().c_str());
+}
+
+namespace internal {
+
+void ReportFailureInUnknownLocation(TestPartResult::Type result_type,
+                                    const std::string& message) {
+  // This function is a friend of UnitTest and as such has access to
+  // AddTestPartResult.
+  UnitTest::GetInstance()->AddTestPartResult(
+      result_type,
+      NULL,  // No info about the source file where the exception occurred.
+      -1,    // We have no info on which line caused the exception.
+      message,
+      "");   // No stack trace, either.
+}
+
+}  // namespace internal
+
+// Google Test requires all tests in the same test case to use the same test
+// fixture class.  This function checks if the current test has the
+// same fixture class as the first test in the current test case.  If
+// yes, it returns true; otherwise it generates a Google Test failure and
+// returns false.
+bool Test::HasSameFixtureClass() {
+  internal::UnitTestImpl* const impl = internal::GetUnitTestImpl();
+  const TestCase* const test_case = impl->current_test_case();
+
+  // Info about the first test in the current test case.
+  const TestInfo* const first_test_info = test_case->test_info_list()[0];
+  const internal::TypeId first_fixture_id = first_test_info->fixture_class_id_;
+  const char* const first_test_name = first_test_info->name();
+
+  // Info about the current test.
+  const TestInfo* const this_test_info = impl->current_test_info();
+  const internal::TypeId this_fixture_id = this_test_info->fixture_class_id_;
+  const char* const this_test_name = this_test_info->name();
+
+  if (this_fixture_id != first_fixture_id) {
+    // Is the first test defined using TEST?
+    const bool first_is_TEST = first_fixture_id == internal::GetTestTypeId();
+    // Is this test defined using TEST?
+    const bool this_is_TEST = this_fixture_id == internal::GetTestTypeId();
+
+    if (first_is_TEST || this_is_TEST) {
+      // The user mixed TEST and TEST_F in this test case - we'll tell
+      // him/her how to fix it.
+
+      // Gets the name of the TEST and the name of the TEST_F.  Note
+      // that first_is_TEST and this_is_TEST cannot both be true, as
+      // the fixture IDs are different for the two tests.
+      const char* const TEST_name =
+          first_is_TEST ? first_test_name : this_test_name;
+      const char* const TEST_F_name =
+          first_is_TEST ? this_test_name : first_test_name;
+
+      ADD_FAILURE()
+          << "All tests in the same test case must use the same test fixture\n"
+          << "class, so mixing TEST_F and TEST in the same test case is\n"
+          << "illegal.  In test case " << this_test_info->test_case_name()
+          << ",\n"
+          << "test " << TEST_F_name << " is defined using TEST_F but\n"
+          << "test " << TEST_name << " is defined using TEST.  You probably\n"
+          << "want to change the TEST to TEST_F or move it to another test\n"
+          << "case.";
+    } else {
+      // The user defined two fixture classes with the same name in
+      // two namespaces - we'll tell him/her how to fix it.
+      ADD_FAILURE()
+          << "All tests in the same test case must use the same test fixture\n"
+          << "class.  However, in test case "
+          << this_test_info->test_case_name() << ",\n"
+          << "you defined test " << first_test_name
+          << " and test " << this_test_name << "\n"
+          << "using two different test fixture classes.  This can happen if\n"
+          << "the two classes are from different namespaces or translation\n"
+          << "units and have the same name.  You should probably rename one\n"
+          << "of the classes to put the tests into different test cases.";
+    }
+    return false;
+  }
+
+  return true;
+}
+
+#if GTEST_HAS_SEH
+
+// Adds an "exception thrown" fatal failure to the current test.  This
+// function returns its result via an output parameter pointer because VC++
+// prohibits creation of objects with destructors on stack in functions
+// using __try (see error C2712).
+static std::string* FormatSehExceptionMessage(DWORD exception_code,
+                                              const char* location) {
+  Message message;
+  message << "SEH exception with code 0x" << std::setbase(16) <<
+    exception_code << std::setbase(10) << " thrown in " << location << ".";
+
+  return new std::string(message.GetString());
+}
+
+#endif  // GTEST_HAS_SEH
+
+namespace internal {
+
+#if GTEST_HAS_EXCEPTIONS
+
+// Adds an "exception thrown" fatal failure to the current test.
+static std::string FormatCxxExceptionMessage(const char* description,
+                                             const char* location) {
+  Message message;
+  if (description != NULL) {
+    message << "C++ exception with description \"" << description << "\"";
+  } else {
+    message << "Unknown C++ exception";
+  }
+  message << " thrown in " << location << ".";
+
+  return message.GetString();
+}
+
+static std::string PrintTestPartResultToString(
+    const TestPartResult& test_part_result);
+
+GoogleTestFailureException::GoogleTestFailureException(
+    const TestPartResult& failure)
+    : ::std::runtime_error(PrintTestPartResultToString(failure).c_str()) {}
+
+#endif  // GTEST_HAS_EXCEPTIONS
+
+// We put these helper functions in the internal namespace as IBM's xlC
+// compiler rejects the code if they were declared static.
+
+// Runs the given method and handles SEH exceptions it throws, when
+// SEH is supported; returns the 0-value for type Result in case of an
+// SEH exception.  (Microsoft compilers cannot handle SEH and C++
+// exceptions in the same function.  Therefore, we provide a separate
+// wrapper function for handling SEH exceptions.)
+template <class T, typename Result>
+Result HandleSehExceptionsInMethodIfSupported(
+    T* object, Result (T::*method)(), const char* location) {
+#if GTEST_HAS_SEH
+  __try {
+    return (object->*method)();
+  } __except (internal::UnitTestOptions::GTestShouldProcessSEH(  // NOLINT
+      GetExceptionCode())) {
+    // We create the exception message on the heap because VC++ prohibits
+    // creation of objects with destructors on stack in functions using __try
+    // (see error C2712).
+    std::string* exception_message = FormatSehExceptionMessage(
+        GetExceptionCode(), location);
+    internal::ReportFailureInUnknownLocation(TestPartResult::kFatalFailure,
+                                             *exception_message);
+    delete exception_message;
+    return static_cast<Result>(0);
+  }
+#else
+  (void)location;
+  return (object->*method)();
+#endif  // GTEST_HAS_SEH
+}
+
+// Runs the given method and catches and reports C++ and/or SEH-style
+// exceptions, if they are supported; returns the 0-value for type
+// Result in case of an SEH exception.
+template <class T, typename Result>
+Result HandleExceptionsInMethodIfSupported(
+    T* object, Result (T::*method)(), const char* location) {
+  // NOTE: The user code can affect the way in which Google Test handles
+  // exceptions by setting GTEST_FLAG(catch_exceptions), but only before
+  // RUN_ALL_TESTS() starts. It is technically possible to check the flag
+  // after the exception is caught and either report or re-throw the
+  // exception based on the flag's value:
+  //
+  // try {
+  //   // Perform the test method.
+  // } catch (...) {
+  //   if (GTEST_FLAG(catch_exceptions))
+  //     // Report the exception as failure.
+  //   else
+  //     throw;  // Re-throws the original exception.
+  // }
+  //
+  // However, the purpose of this flag is to allow the program to drop into
+  // the debugger when the exception is thrown. On most platforms, once the
+  // control enters the catch block, the exception origin information is
+  // lost and the debugger will stop the program at the point of the
+  // re-throw in this function -- instead of at the point of the original
+  // throw statement in the code under test.  For this reason, we perform
+  // the check early, sacrificing the ability to affect Google Test's
+  // exception handling in the method where the exception is thrown.
+  if (internal::GetUnitTestImpl()->catch_exceptions()) {
+#if GTEST_HAS_EXCEPTIONS
+    try {
+      return HandleSehExceptionsInMethodIfSupported(object, method, location);
+    } catch (const internal::GoogleTestFailureException&) {  // NOLINT
+      // This exception type can only be thrown by a failed Google
+      // Test assertion with the intention of letting another testing
+      // framework catch it.  Therefore we just re-throw it.
+      throw;
+    } catch (const std::exception& e) {  // NOLINT
+      internal::ReportFailureInUnknownLocation(
+          TestPartResult::kFatalFailure,
+          FormatCxxExceptionMessage(e.what(), location));
+    } catch (...) {  // NOLINT
+      internal::ReportFailureInUnknownLocation(
+          TestPartResult::kFatalFailure,
+          FormatCxxExceptionMessage(NULL, location));
+    }
+    return static_cast<Result>(0);
+#else
+    return HandleSehExceptionsInMethodIfSupported(object, method, location);
+#endif  // GTEST_HAS_EXCEPTIONS
+  } else {
+    return (object->*method)();
+  }
+}
+
+}  // namespace internal
+
+// Runs the test and updates the test result.
+void Test::Run() {
+  if (!HasSameFixtureClass()) return;
+
+  internal::UnitTestImpl* const impl = internal::GetUnitTestImpl();
+  impl->os_stack_trace_getter()->UponLeavingGTest();
+  internal::HandleExceptionsInMethodIfSupported(this, &Test::SetUp, "SetUp()");
+  // We will run the test only if SetUp() was successful.
+  if (!HasFatalFailure()) {
+    impl->os_stack_trace_getter()->UponLeavingGTest();
+    internal::HandleExceptionsInMethodIfSupported(
+        this, &Test::TestBody, "the test body");
+  }
+
+  // However, we want to clean up as much as possible.  Hence we will
+  // always call TearDown(), even if SetUp() or the test body has
+  // failed.
+  impl->os_stack_trace_getter()->UponLeavingGTest();
+  internal::HandleExceptionsInMethodIfSupported(
+      this, &Test::TearDown, "TearDown()");
+}
+
+// Returns true iff the current test has a fatal failure.
+bool Test::HasFatalFailure() {
+  return internal::GetUnitTestImpl()->current_test_result()->HasFatalFailure();
+}
+
+// Returns true iff the current test has a non-fatal failure.
+bool Test::HasNonfatalFailure() {
+  return internal::GetUnitTestImpl()->current_test_result()->
+      HasNonfatalFailure();
+}
+
+// class TestInfo
+
+// Constructs a TestInfo object. It assumes ownership of the test factory
+// object.
+TestInfo::TestInfo(const std::string& a_test_case_name,
+                   const std::string& a_name,
+                   const char* a_type_param,
+                   const char* a_value_param,
+                   internal::TypeId fixture_class_id,
+                   internal::TestFactoryBase* factory)
+    : test_case_name_(a_test_case_name),
+      name_(a_name),
+      type_param_(a_type_param ? new std::string(a_type_param) : NULL),
+      value_param_(a_value_param ? new std::string(a_value_param) : NULL),
+      fixture_class_id_(fixture_class_id),
+      should_run_(false),
+      is_disabled_(false),
+      matches_filter_(false),
+      factory_(factory),
+      result_() {}
+
+// Destructs a TestInfo object.
+TestInfo::~TestInfo() { delete factory_; }
+
+namespace internal {
+
+// Creates a new TestInfo object and registers it with Google Test;
+// returns the created object.
+//
+// Arguments:
+//
+//   test_case_name:   name of the test case
+//   name:             name of the test
+//   type_param:       the name of the test's type parameter, or NULL if
+//                     this is not a typed or a type-parameterized test.
+//   value_param:      text representation of the test's value parameter,
+//                     or NULL if this is not a value-parameterized test.
+//   fixture_class_id: ID of the test fixture class
+//   set_up_tc:        pointer to the function that sets up the test case
+//   tear_down_tc:     pointer to the function that tears down the test case
+//   factory:          pointer to the factory that creates a test object.
+//                     The newly created TestInfo instance will assume
+//                     ownership of the factory object.
+TestInfo* MakeAndRegisterTestInfo(
+    const char* test_case_name,
+    const char* name,
+    const char* type_param,
+    const char* value_param,
+    TypeId fixture_class_id,
+    SetUpTestCaseFunc set_up_tc,
+    TearDownTestCaseFunc tear_down_tc,
+    TestFactoryBase* factory) {
+  TestInfo* const test_info =
+      new TestInfo(test_case_name, name, type_param, value_param,
+                   fixture_class_id, factory);
+  GetUnitTestImpl()->AddTestInfo(set_up_tc, tear_down_tc, test_info);
+  return test_info;
+}
+
+#if GTEST_HAS_PARAM_TEST
+void ReportInvalidTestCaseType(const char* test_case_name,
+                               const char* file, int line) {
+  Message errors;
+  errors
+      << "Attempted redefinition of test case " << test_case_name << ".\n"
+      << "All tests in the same test case must use the same test fixture\n"
+      << "class.  However, in test case " << test_case_name << ", you tried\n"
+      << "to define a test using a fixture class different from the one\n"
+      << "used earlier. This can happen if the two fixture classes are\n"
+      << "from different namespaces and have the same name. You should\n"
+      << "probably rename one of the classes to put the tests into different\n"
+      << "test cases.";
+
+  fprintf(stderr, "%s %s", FormatFileLocation(file, line).c_str(),
+          errors.GetString().c_str());
+}
+#endif  // GTEST_HAS_PARAM_TEST
+
+}  // namespace internal
+
+namespace {
+
+// A predicate that checks the test name of a TestInfo against a known
+// value.
+//
+// This is used for implementation of the TestCase class only.  We put
+// it in the anonymous namespace to prevent polluting the outer
+// namespace.
+//
+// TestNameIs is copyable.
+class TestNameIs {
+ public:
+  // Constructor.
+  //
+  // TestNameIs has NO default constructor.
+  explicit TestNameIs(const char* name)
+      : name_(name) {}
+
+  // Returns true iff the test name of test_info matches name_.
+  bool operator()(const TestInfo * test_info) const {
+    return test_info && test_info->name() == name_;
+  }
+
+ private:
+  std::string name_;
+};
+
+}  // namespace
+
+namespace internal {
+
+// This method expands all parameterized tests registered with macros TEST_P
+// and INSTANTIATE_TEST_CASE_P into regular tests and registers those.
+// This will be done just once during the program runtime.
+void UnitTestImpl::RegisterParameterizedTests() {
+#if GTEST_HAS_PARAM_TEST
+  if (!parameterized_tests_registered_) {
+    parameterized_test_registry_.RegisterTests();
+    parameterized_tests_registered_ = true;
+  }
+#endif
+}
+
+}  // namespace internal
+
+// Creates the test object, runs it, records its result, and then
+// deletes it.
+void TestInfo::Run() {
+  if (!should_run_) return;
+
+  // Tells UnitTest where to store test result.
+  internal::UnitTestImpl* const impl = internal::GetUnitTestImpl();
+  impl->set_current_test_info(this);
+
+  TestEventListener* repeater = UnitTest::GetInstance()->listeners().repeater();
+
+  // Notifies the unit test event listeners that a test is about to start.
+  repeater->OnTestStart(*this);
+
+  const TimeInMillis start = internal::GetTimeInMillis();
+
+  impl->os_stack_trace_getter()->UponLeavingGTest();
+
+  // Creates the test object.
+  Test* const test = internal::HandleExceptionsInMethodIfSupported(
+      factory_, &internal::TestFactoryBase::CreateTest,
+      "the test fixture's constructor");
+
+  // Runs the test only if the test object was created and its
+  // constructor didn't generate a fatal failure.
+  if ((test != NULL) && !Test::HasFatalFailure()) {
+    // This doesn't throw as all user code that can throw are wrapped into
+    // exception handling code.
+    test->Run();
+  }
+
+  // Deletes the test object.
+  impl->os_stack_trace_getter()->UponLeavingGTest();
+  internal::HandleExceptionsInMethodIfSupported(
+      test, &Test::DeleteSelf_, "the test fixture's destructor");
+
+  result_.set_elapsed_time(internal::GetTimeInMillis() - start);
+
+  // Notifies the unit test event listener that a test has just finished.
+  repeater->OnTestEnd(*this);
+
+  // Tells UnitTest to stop associating assertion results to this
+  // test.
+  impl->set_current_test_info(NULL);
+}
+
+// class TestCase
+
+// Gets the number of successful tests in this test case.
+int TestCase::successful_test_count() const {
+  return CountIf(test_info_list_, TestPassed);
+}
+
+// Gets the number of failed tests in this test case.
+int TestCase::failed_test_count() const {
+  return CountIf(test_info_list_, TestFailed);
+}
+
+// Gets the number of disabled tests that will be reported in the XML report.
+int TestCase::reportable_disabled_test_count() const {
+  return CountIf(test_info_list_, TestReportableDisabled);
+}
+
+// Gets the number of disabled tests in this test case.
+int TestCase::disabled_test_count() const {
+  return CountIf(test_info_list_, TestDisabled);
+}
+
+// Gets the number of tests to be printed in the XML report.
+int TestCase::reportable_test_count() const {
+  return CountIf(test_info_list_, TestReportable);
+}
+
+// Get the number of tests in this test case that should run.
+int TestCase::test_to_run_count() const {
+  return CountIf(test_info_list_, ShouldRunTest);
+}
+
+// Gets the number of all tests.
+int TestCase::total_test_count() const {
+  return static_cast<int>(test_info_list_.size());
+}
+
+// Creates a TestCase with the given name.
+//
+// Arguments:
+//
+//   name:         name of the test case
+//   a_type_param: the name of the test case's type parameter, or NULL if
+//                 this is not a typed or a type-parameterized test case.
+//   set_up_tc:    pointer to the function that sets up the test case
+//   tear_down_tc: pointer to the function that tears down the test case
+TestCase::TestCase(const char* a_name, const char* a_type_param,
+                   Test::SetUpTestCaseFunc set_up_tc,
+                   Test::TearDownTestCaseFunc tear_down_tc)
+    : name_(a_name),
+      type_param_(a_type_param ? new std::string(a_type_param) : NULL),
+      set_up_tc_(set_up_tc),
+      tear_down_tc_(tear_down_tc),
+      should_run_(false),
+      elapsed_time_(0) {
+}
+
+// Destructor of TestCase.
+TestCase::~TestCase() {
+  // Deletes every Test in the collection.
+  ForEach(test_info_list_, internal::Delete<TestInfo>);
+}
+
+// Returns the i-th test among all the tests. i can range from 0 to
+// total_test_count() - 1. If i is not in that range, returns NULL.
+const TestInfo* TestCase::GetTestInfo(int i) const {
+  const int index = GetElementOr(test_indices_, i, -1);
+  return index < 0 ? NULL : test_info_list_[index];
+}
+
+// Returns the i-th test among all the tests. i can range from 0 to
+// total_test_count() - 1. If i is not in that range, returns NULL.
+TestInfo* TestCase::GetMutableTestInfo(int i) {
+  const int index = GetElementOr(test_indices_, i, -1);
+  return index < 0 ? NULL : test_info_list_[index];
+}
+
+// Adds a test to this test case.  Will delete the test upon
+// destruction of the TestCase object.
+void TestCase::AddTestInfo(TestInfo * test_info) {
+  test_info_list_.push_back(test_info);
+  test_indices_.push_back(static_cast<int>(test_indices_.size()));
+}
+
+// Runs every test in this TestCase.
+void TestCase::Run() {
+  if (!should_run_) return;
+
+  internal::UnitTestImpl* const impl = internal::GetUnitTestImpl();
+  impl->set_current_test_case(this);
+
+  TestEventListener* repeater = UnitTest::GetInstance()->listeners().repeater();
+
+  repeater->OnTestCaseStart(*this);
+  impl->os_stack_trace_getter()->UponLeavingGTest();
+  internal::HandleExceptionsInMethodIfSupported(
+      this, &TestCase::RunSetUpTestCase, "SetUpTestCase()");
+
+  const internal::TimeInMillis start = internal::GetTimeInMillis();
+  for (int i = 0; i < total_test_count(); i++) {
+    GetMutableTestInfo(i)->Run();
+  }
+  elapsed_time_ = internal::GetTimeInMillis() - start;
+
+  impl->os_stack_trace_getter()->UponLeavingGTest();
+  internal::HandleExceptionsInMethodIfSupported(
+      this, &TestCase::RunTearDownTestCase, "TearDownTestCase()");
+
+  repeater->OnTestCaseEnd(*this);
+  impl->set_current_test_case(NULL);
+}
+
+// Clears the results of all tests in this test case.
+void TestCase::ClearResult() {
+  ad_hoc_test_result_.Clear();
+  ForEach(test_info_list_, TestInfo::ClearTestResult);
+}
+
+// Shuffles the tests in this test case.
+void TestCase::ShuffleTests(internal::Random* random) {
+  Shuffle(random, &test_indices_);
+}
+
+// Restores the test order to before the first shuffle.
+void TestCase::UnshuffleTests() {
+  for (size_t i = 0; i < test_indices_.size(); i++) {
+    test_indices_[i] = static_cast<int>(i);
+  }
+}
+
+// Formats a countable noun.  Depending on its quantity, either the
+// singular form or the plural form is used. e.g.
+//
+// FormatCountableNoun(1, "formula", "formuli") returns "1 formula".
+// FormatCountableNoun(5, "book", "books") returns "5 books".
+static std::string FormatCountableNoun(int count,
+                                       const char * singular_form,
+                                       const char * plural_form) {
+  return internal::StreamableToString(count) + " " +
+      (count == 1 ? singular_form : plural_form);
+}
+
+// Formats the count of tests.
+static std::string FormatTestCount(int test_count) {
+  return FormatCountableNoun(test_count, "test", "tests");
+}
+
+// Formats the count of test cases.
+static std::string FormatTestCaseCount(int test_case_count) {
+  return FormatCountableNoun(test_case_count, "test case", "test cases");
+}
+
+// Converts a TestPartResult::Type enum to human-friendly string
+// representation.  Both kNonFatalFailure and kFatalFailure are translated
+// to "Failure", as the user usually doesn't care about the difference
+// between the two when viewing the test result.
+static const char * TestPartResultTypeToString(TestPartResult::Type type) {
+  switch (type) {
+    case TestPartResult::kSuccess:
+      return "Success";
+
+    case TestPartResult::kNonFatalFailure:
+    case TestPartResult::kFatalFailure:
+#ifdef _MSC_VER
+      return "error: ";
+#else
+      return "Failure\n";
+#endif
+    default:
+      return "Unknown result type";
+  }
+}
+
+namespace internal {
+
+// Prints a TestPartResult to an std::string.
+static std::string PrintTestPartResultToString(
+    const TestPartResult& test_part_result) {
+  return (Message()
+          << internal::FormatFileLocation(test_part_result.file_name(),
+                                          test_part_result.line_number())
+          << " " << TestPartResultTypeToString(test_part_result.type())
+          << test_part_result.message()).GetString();
+}
+
+// Prints a TestPartResult.
+static void PrintTestPartResult(const TestPartResult& test_part_result) {
+  const std::string& result =
+      PrintTestPartResultToString(test_part_result);
+  printf("%s\n", result.c_str());
+  fflush(stdout);
+  // If the test program runs in Visual Studio or a debugger, the
+  // following statements add the test part result message to the Output
+  // window such that the user can double-click on it to jump to the
+  // corresponding source code location; otherwise they do nothing.
+#if GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_MOBILE
+  // We don't call OutputDebugString*() on Windows Mobile, as printing
+  // to stdout is done by OutputDebugString() there already - we don't
+  // want the same message printed twice.
+  ::OutputDebugStringA(result.c_str());
+  ::OutputDebugStringA("\n");
+#endif
+}
+
+// class PrettyUnitTestResultPrinter
+
+enum GTestColor {
+  COLOR_DEFAULT,
+  COLOR_RED,
+  COLOR_GREEN,
+  COLOR_YELLOW
+};
+
+#if GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_MOBILE
+
+// Returns the character attribute for the given color.
+WORD GetColorAttribute(GTestColor color) {
+  switch (color) {
+    case COLOR_RED:    return FOREGROUND_RED;
+    case COLOR_GREEN:  return FOREGROUND_GREEN;
+    case COLOR_YELLOW: return FOREGROUND_RED | FOREGROUND_GREEN;
+    default:           return 0;
+  }
+}
+
+#else
+
+// Returns the ANSI color code for the given color.  COLOR_DEFAULT is
+// an invalid input.
+const char* GetAnsiColorCode(GTestColor color) {
+  switch (color) {
+    case COLOR_RED:     return "1";
+    case COLOR_GREEN:   return "2";
+    case COLOR_YELLOW:  return "3";
+    default:            return NULL;
+  };
+}
+
+#endif  // GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_MOBILE
+
+// Returns true iff Google Test should use colors in the output.
+bool ShouldUseColor(bool stdout_is_tty) {
+  const char* const gtest_color = GTEST_FLAG(color).c_str();
+
+  if (String::CaseInsensitiveCStringEquals(gtest_color, "auto")) {
+#if GTEST_OS_WINDOWS
+    // On Windows the TERM variable is usually not set, but the
+    // console there does support colors.
+    return stdout_is_tty;
+#else
+    // On non-Windows platforms, we rely on the TERM variable.
+    const char* const term = posix::GetEnv("TERM");
+    const bool term_supports_color =
+        String::CStringEquals(term, "xterm") ||
+        String::CStringEquals(term, "xterm-color") ||
+        String::CStringEquals(term, "xterm-256color") ||
+        String::CStringEquals(term, "screen") ||
+        String::CStringEquals(term, "screen-256color") ||
+        String::CStringEquals(term, "linux") ||
+        String::CStringEquals(term, "cygwin");
+    return stdout_is_tty && term_supports_color;
+#endif  // GTEST_OS_WINDOWS
+  }
+
+  return String::CaseInsensitiveCStringEquals(gtest_color, "yes") ||
+      String::CaseInsensitiveCStringEquals(gtest_color, "true") ||
+      String::CaseInsensitiveCStringEquals(gtest_color, "t") ||
+      String::CStringEquals(gtest_color, "1");
+  // We take "yes", "true", "t", and "1" as meaning "yes".  If the
+  // value is neither one of these nor "auto", we treat it as "no" to
+  // be conservative.
+}
+
+// Helpers for printing colored strings to stdout. Note that on Windows, we
+// cannot simply emit special characters and have the terminal change colors.
+// This routine must actually emit the characters rather than return a string
+// that would be colored when printed, as can be done on Linux.
+void ColoredPrintf(GTestColor color, const char* fmt, ...) {
+  va_list args;
+  va_start(args, fmt);
+
+#if GTEST_OS_WINDOWS_MOBILE || GTEST_OS_SYMBIAN || GTEST_OS_ZOS || GTEST_OS_IOS
+  const bool use_color = false;
+#else
+  static const bool in_color_mode =
+      ShouldUseColor(posix::IsATTY(posix::FileNo(stdout)) != 0);
+  const bool use_color = in_color_mode && (color != COLOR_DEFAULT);
+#endif  // GTEST_OS_WINDOWS_MOBILE || GTEST_OS_SYMBIAN || GTEST_OS_ZOS
+  // The '!= 0' comparison is necessary to satisfy MSVC 7.1.
+
+  if (!use_color) {
+    vprintf(fmt, args);
+    va_end(args);
+    return;
+  }
+
+#if GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_MOBILE
+  const HANDLE stdout_handle = GetStdHandle(STD_OUTPUT_HANDLE);
+
+  // Gets the current text color.
+  CONSOLE_SCREEN_BUFFER_INFO buffer_info;
+  GetConsoleScreenBufferInfo(stdout_handle, &buffer_info);
+  const WORD old_color_attrs = buffer_info.wAttributes;
+
+  // We need to flush the stream buffers into the console before each
+  // SetConsoleTextAttribute call lest it affect the text that is already
+  // printed but has not yet reached the console.
+  fflush(stdout);
+  SetConsoleTextAttribute(stdout_handle,
+                          GetColorAttribute(color) | FOREGROUND_INTENSITY);
+  vprintf(fmt, args);
+
+  fflush(stdout);
+  // Restores the text color.
+  SetConsoleTextAttribute(stdout_handle, old_color_attrs);
+#else
+  printf("\033[0;3%sm", GetAnsiColorCode(color));
+  vprintf(fmt, args);
+  printf("\033[m");  // Resets the terminal to default.
+#endif  // GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_MOBILE
+  va_end(args);
+}
+
+// Text printed in Google Test's text output and --gunit_list_tests
+// output to label the type parameter and value parameter for a test.
+static const char kTypeParamLabel[] = "TypeParam";
+static const char kValueParamLabel[] = "GetParam()";
+
+void PrintFullTestCommentIfPresent(const TestInfo& test_info) {
+  const char* const type_param = test_info.type_param();
+  const char* const value_param = test_info.value_param();
+
+  if (type_param != NULL || value_param != NULL) {
+    printf(", where ");
+    if (type_param != NULL) {
+      printf("%s = %s", kTypeParamLabel, type_param);
+      if (value_param != NULL)
+        printf(" and ");
+    }
+    if (value_param != NULL) {
+      printf("%s = %s", kValueParamLabel, value_param);
+    }
+  }
+}
+
+// This class implements the TestEventListener interface.
+//
+// Class PrettyUnitTestResultPrinter is copyable.
+class PrettyUnitTestResultPrinter : public TestEventListener {
+ public:
+  PrettyUnitTestResultPrinter() {}
+  static void PrintTestName(const char * test_case, const char * test) {
+    printf("%s.%s", test_case, test);
+  }
+
+  // The following methods override what's in the TestEventListener class.
+  virtual void OnTestProgramStart(const UnitTest& /*unit_test*/) {}
+  virtual void OnTestIterationStart(const UnitTest& unit_test, int iteration);
+  virtual void OnEnvironmentsSetUpStart(const UnitTest& unit_test);
+  virtual void OnEnvironmentsSetUpEnd(const UnitTest& /*unit_test*/) {}
+  virtual void OnTestCaseStart(const TestCase& test_case);
+  virtual void OnTestStart(const TestInfo& test_info);
+  virtual void OnTestPartResult(const TestPartResult& result);
+  virtual void OnTestEnd(const TestInfo& test_info);
+  virtual void OnTestCaseEnd(const TestCase& test_case);
+  virtual void OnEnvironmentsTearDownStart(const UnitTest& unit_test);
+  virtual void OnEnvironmentsTearDownEnd(const UnitTest& /*unit_test*/) {}
+  virtual void OnTestIterationEnd(const UnitTest& unit_test, int iteration);
+  virtual void OnTestProgramEnd(const UnitTest& /*unit_test*/) {}
+
+ private:
+  static void PrintFailedTests(const UnitTest& unit_test);
+};
+
+  // Fired before each iteration of tests starts.
+void PrettyUnitTestResultPrinter::OnTestIterationStart(
+    const UnitTest& unit_test, int iteration) {
+  if (GTEST_FLAG(repeat) != 1)
+    printf("\nRepeating all tests (iteration %d) . . .\n\n", iteration + 1);
+
+  const char* const filter = GTEST_FLAG(filter).c_str();
+
+  // Prints the filter if it's not *.  This reminds the user that some
+  // tests may be skipped.
+  if (!String::CStringEquals(filter, kUniversalFilter)) {
+    ColoredPrintf(COLOR_YELLOW,
+                  "Note: %s filter = %s\n", GTEST_NAME_, filter);
+  }
+
+  if (internal::ShouldShard(kTestTotalShards, kTestShardIndex, false)) {
+    const Int32 shard_index = Int32FromEnvOrDie(kTestShardIndex, -1);
+    ColoredPrintf(COLOR_YELLOW,
+                  "Note: This is test shard %d of %s.\n",
+                  static_cast<int>(shard_index) + 1,
+                  internal::posix::GetEnv(kTestTotalShards));
+  }
+
+  if (GTEST_FLAG(shuffle)) {
+    ColoredPrintf(COLOR_YELLOW,
+                  "Note: Randomizing tests' orders with a seed of %d .\n",
+                  unit_test.random_seed());
+  }
+
+  ColoredPrintf(COLOR_GREEN,  "[==========] ");
+  printf("Running %s from %s.\n",
+         FormatTestCount(unit_test.test_to_run_count()).c_str(),
+         FormatTestCaseCount(unit_test.test_case_to_run_count()).c_str());
+  fflush(stdout);
+}
+
+void PrettyUnitTestResultPrinter::OnEnvironmentsSetUpStart(
+    const UnitTest& /*unit_test*/) {
+  ColoredPrintf(COLOR_GREEN,  "[----------] ");
+  printf("Global test environment set-up.\n");
+  fflush(stdout);
+}
+
+void PrettyUnitTestResultPrinter::OnTestCaseStart(const TestCase& test_case) {
+  const std::string counts =
+      FormatCountableNoun(test_case.test_to_run_count(), "test", "tests");
+  ColoredPrintf(COLOR_GREEN, "[----------] ");
+  printf("%s from %s", counts.c_str(), test_case.name());
+  if (test_case.type_param() == NULL) {
+    printf("\n");
+  } else {
+    printf(", where %s = %s\n", kTypeParamLabel, test_case.type_param());
+  }
+  fflush(stdout);
+}
+
+void PrettyUnitTestResultPrinter::OnTestStart(const TestInfo& test_info) {
+  ColoredPrintf(COLOR_GREEN,  "[ RUN      ] ");
+  PrintTestName(test_info.test_case_name(), test_info.name());
+  printf("\n");
+  fflush(stdout);
+}
+
+// Called after an assertion failure.
+void PrettyUnitTestResultPrinter::OnTestPartResult(
+    const TestPartResult& result) {
+  // If the test part succeeded, we don't need to do anything.
+  if (result.type() == TestPartResult::kSuccess)
+    return;
+
+  // Print failure message from the assertion (e.g. expected this and got that).
+  PrintTestPartResult(result);
+  fflush(stdout);
+}
+
+void PrettyUnitTestResultPrinter::OnTestEnd(const TestInfo& test_info) {
+  if (test_info.result()->Passed()) {
+    ColoredPrintf(COLOR_GREEN, "[       OK ] ");
+  } else {
+    ColoredPrintf(COLOR_RED, "[  FAILED  ] ");
+  }
+  PrintTestName(test_info.test_case_name(), test_info.name());
+  if (test_info.result()->Failed())
+    PrintFullTestCommentIfPresent(test_info);
+
+  if (GTEST_FLAG(print_time)) {
+    printf(" (%s ms)\n", internal::StreamableToString(
+           test_info.result()->elapsed_time()).c_str());
+  } else {
+    printf("\n");
+  }
+  fflush(stdout);
+}
+
+void PrettyUnitTestResultPrinter::OnTestCaseEnd(const TestCase& test_case) {
+  if (!GTEST_FLAG(print_time)) return;
+
+  const std::string counts =
+      FormatCountableNoun(test_case.test_to_run_count(), "test", "tests");
+  ColoredPrintf(COLOR_GREEN, "[----------] ");
+  printf("%s from %s (%s ms total)\n\n",
+         counts.c_str(), test_case.name(),
+         internal::StreamableToString(test_case.elapsed_time()).c_str());
+  fflush(stdout);
+}
+
+void PrettyUnitTestResultPrinter::OnEnvironmentsTearDownStart(
+    const UnitTest& /*unit_test*/) {
+  ColoredPrintf(COLOR_GREEN,  "[----------] ");
+  printf("Global test environment tear-down\n");
+  fflush(stdout);
+}
+
+// Internal helper for printing the list of failed tests.
+void PrettyUnitTestResultPrinter::PrintFailedTests(const UnitTest& unit_test) {
+  const int failed_test_count = unit_test.failed_test_count();
+  if (failed_test_count == 0) {
+    return;
+  }
+
+  for (int i = 0; i < unit_test.total_test_case_count(); ++i) {
+    const TestCase& test_case = *unit_test.GetTestCase(i);
+    if (!test_case.should_run() || (test_case.failed_test_count() == 0)) {
+      continue;
+    }
+    for (int j = 0; j < test_case.total_test_count(); ++j) {
+      const TestInfo& test_info = *test_case.GetTestInfo(j);
+      if (!test_info.should_run() || test_info.result()->Passed()) {
+        continue;
+      }
+      ColoredPrintf(COLOR_RED, "[  FAILED  ] ");
+      printf("%s.%s", test_case.name(), test_info.name());
+      PrintFullTestCommentIfPresent(test_info);
+      printf("\n");
+    }
+  }
+}
+
+void PrettyUnitTestResultPrinter::OnTestIterationEnd(const UnitTest& unit_test,
+                                                     int /*iteration*/) {
+  ColoredPrintf(COLOR_GREEN,  "[==========] ");
+  printf("%s from %s ran.",
+         FormatTestCount(unit_test.test_to_run_count()).c_str(),
+         FormatTestCaseCount(unit_test.test_case_to_run_count()).c_str());
+  if (GTEST_FLAG(print_time)) {
+    printf(" (%s ms total)",
+           internal::StreamableToString(unit_test.elapsed_time()).c_str());
+  }
+  printf("\n");
+  ColoredPrintf(COLOR_GREEN,  "[  PASSED  ] ");
+  printf("%s.\n", FormatTestCount(unit_test.successful_test_count()).c_str());
+
+  int num_failures = unit_test.failed_test_count();
+  if (!unit_test.Passed()) {
+    const int failed_test_count = unit_test.failed_test_count();
+    ColoredPrintf(COLOR_RED,  "[  FAILED  ] ");
+    printf("%s, listed below:\n", FormatTestCount(failed_test_count).c_str());
+    PrintFailedTests(unit_test);
+    printf("\n%2d FAILED %s\n", num_failures,
+                        num_failures == 1 ? "TEST" : "TESTS");
+  }
+
+  int num_disabled = unit_test.reportable_disabled_test_count();
+  if (num_disabled && !GTEST_FLAG(also_run_disabled_tests)) {
+    if (!num_failures) {
+      printf("\n");  // Add a spacer if no FAILURE banner is displayed.
+    }
+    ColoredPrintf(COLOR_YELLOW,
+                  "  YOU HAVE %d DISABLED %s\n\n",
+                  num_disabled,
+                  num_disabled == 1 ? "TEST" : "TESTS");
+  }
+  // Ensure that Google Test output is printed before, e.g., heapchecker output.
+  fflush(stdout);
+}
+
+// End PrettyUnitTestResultPrinter
+
+// class TestEventRepeater
+//
+// This class forwards events to other event listeners.
+class TestEventRepeater : public TestEventListener {
+ public:
+  TestEventRepeater() : forwarding_enabled_(true) {}
+  virtual ~TestEventRepeater();
+  void Append(TestEventListener *listener);
+  TestEventListener* Release(TestEventListener* listener);
+
+  // Controls whether events will be forwarded to listeners_. Set to false
+  // in death test child processes.
+  bool forwarding_enabled() const { return forwarding_enabled_; }
+  void set_forwarding_enabled(bool enable) { forwarding_enabled_ = enable; }
+
+  virtual void OnTestProgramStart(const UnitTest& unit_test);
+  virtual void OnTestIterationStart(const UnitTest& unit_test, int iteration);
+  virtual void OnEnvironmentsSetUpStart(const UnitTest& unit_test);
+  virtual void OnEnvironmentsSetUpEnd(const UnitTest& unit_test);
+  virtual void OnTestCaseStart(const TestCase& test_case);
+  virtual void OnTestStart(const TestInfo& test_info);
+  virtual void OnTestPartResult(const TestPartResult& result);
+  virtual void OnTestEnd(const TestInfo& test_info);
+  virtual void OnTestCaseEnd(const TestCase& test_case);
+  virtual void OnEnvironmentsTearDownStart(const UnitTest& unit_test);
+  virtual void OnEnvironmentsTearDownEnd(const UnitTest& unit_test);
+  virtual void OnTestIterationEnd(const UnitTest& unit_test, int iteration);
+  virtual void OnTestProgramEnd(const UnitTest& unit_test);
+
+ private:
+  // Controls whether events will be forwarded to listeners_. Set to false
+  // in death test child processes.
+  bool forwarding_enabled_;
+  // The list of listeners that receive events.
+  std::vector<TestEventListener*> listeners_;
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(TestEventRepeater);
+};
+
+TestEventRepeater::~TestEventRepeater() {
+  ForEach(listeners_, Delete<TestEventListener>);
+}
+
+void TestEventRepeater::Append(TestEventListener *listener) {
+  listeners_.push_back(listener);
+}
+
+// TODO(vladl at google.com): Factor the search functionality into Vector::Find.
+TestEventListener* TestEventRepeater::Release(TestEventListener *listener) {
+  for (size_t i = 0; i < listeners_.size(); ++i) {
+    if (listeners_[i] == listener) {
+      listeners_.erase(listeners_.begin() + i);
+      return listener;
+    }
+  }
+
+  return NULL;
+}
+
+// Since most methods are very similar, use macros to reduce boilerplate.
+// This defines a member that forwards the call to all listeners.
+#define GTEST_REPEATER_METHOD_(Name, Type) \
+void TestEventRepeater::Name(const Type& parameter) { \
+  if (forwarding_enabled_) { \
+    for (size_t i = 0; i < listeners_.size(); i++) { \
+      listeners_[i]->Name(parameter); \
+    } \
+  } \
+}
+// This defines a member that forwards the call to all listeners in reverse
+// order.
+#define GTEST_REVERSE_REPEATER_METHOD_(Name, Type) \
+void TestEventRepeater::Name(const Type& parameter) { \
+  if (forwarding_enabled_) { \
+    for (int i = static_cast<int>(listeners_.size()) - 1; i >= 0; i--) { \
+      listeners_[i]->Name(parameter); \
+    } \
+  } \
+}
+
+GTEST_REPEATER_METHOD_(OnTestProgramStart, UnitTest)
+GTEST_REPEATER_METHOD_(OnEnvironmentsSetUpStart, UnitTest)
+GTEST_REPEATER_METHOD_(OnTestCaseStart, TestCase)
+GTEST_REPEATER_METHOD_(OnTestStart, TestInfo)
+GTEST_REPEATER_METHOD_(OnTestPartResult, TestPartResult)
+GTEST_REPEATER_METHOD_(OnEnvironmentsTearDownStart, UnitTest)
+GTEST_REVERSE_REPEATER_METHOD_(OnEnvironmentsSetUpEnd, UnitTest)
+GTEST_REVERSE_REPEATER_METHOD_(OnEnvironmentsTearDownEnd, UnitTest)
+GTEST_REVERSE_REPEATER_METHOD_(OnTestEnd, TestInfo)
+GTEST_REVERSE_REPEATER_METHOD_(OnTestCaseEnd, TestCase)
+GTEST_REVERSE_REPEATER_METHOD_(OnTestProgramEnd, UnitTest)
+
+#undef GTEST_REPEATER_METHOD_
+#undef GTEST_REVERSE_REPEATER_METHOD_
+
+void TestEventRepeater::OnTestIterationStart(const UnitTest& unit_test,
+                                             int iteration) {
+  if (forwarding_enabled_) {
+    for (size_t i = 0; i < listeners_.size(); i++) {
+      listeners_[i]->OnTestIterationStart(unit_test, iteration);
+    }
+  }
+}
+
+void TestEventRepeater::OnTestIterationEnd(const UnitTest& unit_test,
+                                           int iteration) {
+  if (forwarding_enabled_) {
+    for (int i = static_cast<int>(listeners_.size()) - 1; i >= 0; i--) {
+      listeners_[i]->OnTestIterationEnd(unit_test, iteration);
+    }
+  }
+}
+
+// End TestEventRepeater
+
+// This class generates an XML output file.
+class XmlUnitTestResultPrinter : public EmptyTestEventListener {
+ public:
+  explicit XmlUnitTestResultPrinter(const char* output_file);
+
+  virtual void OnTestIterationEnd(const UnitTest& unit_test, int iteration);
+
+ private:
+  // Is c a whitespace character that is normalized to a space character
+  // when it appears in an XML attribute value?
+  static bool IsNormalizableWhitespace(char c) {
+    return c == 0x9 || c == 0xA || c == 0xD;
+  }
+
+  // May c appear in a well-formed XML document?
+  static bool IsValidXmlCharacter(char c) {
+    return IsNormalizableWhitespace(c) || c >= 0x20;
+  }
+
+  // Returns an XML-escaped copy of the input string str.  If
+  // is_attribute is true, the text is meant to appear as an attribute
+  // value, and normalizable whitespace is preserved by replacing it
+  // with character references.
+  static std::string EscapeXml(const std::string& str, bool is_attribute);
+
+  // Returns the given string with all characters invalid in XML removed.
+  static std::string RemoveInvalidXmlCharacters(const std::string& str);
+
+  // Convenience wrapper around EscapeXml when str is an attribute value.
+  static std::string EscapeXmlAttribute(const std::string& str) {
+    return EscapeXml(str, true);
+  }
+
+  // Convenience wrapper around EscapeXml when str is not an attribute value.
+  static std::string EscapeXmlText(const char* str) {
+    return EscapeXml(str, false);
+  }
+
+  // Verifies that the given attribute belongs to the given element and
+  // streams the attribute as XML.
+  static void OutputXmlAttribute(std::ostream* stream,
+                                 const std::string& element_name,
+                                 const std::string& name,
+                                 const std::string& value);
+
+  // Streams an XML CDATA section, escaping invalid CDATA sequences as needed.
+  static void OutputXmlCDataSection(::std::ostream* stream, const char* data);
+
+  // Streams an XML representation of a TestInfo object.
+  static void OutputXmlTestInfo(::std::ostream* stream,
+                                const char* test_case_name,
+                                const TestInfo& test_info);
+
+  // Prints an XML representation of a TestCase object
+  static void PrintXmlTestCase(::std::ostream* stream,
+                               const TestCase& test_case);
+
+  // Prints an XML summary of unit_test to output stream out.
+  static void PrintXmlUnitTest(::std::ostream* stream,
+                               const UnitTest& unit_test);
+
+  // Produces a string representing the test properties in a result as space
+  // delimited XML attributes based on the property key="value" pairs.
+  // When the std::string is not empty, it includes a space at the beginning,
+  // to delimit this attribute from prior attributes.
+  static std::string TestPropertiesAsXmlAttributes(const TestResult& result);
+
+  // The output file.
+  const std::string output_file_;
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(XmlUnitTestResultPrinter);
+};
+
+// Creates a new XmlUnitTestResultPrinter.
+XmlUnitTestResultPrinter::XmlUnitTestResultPrinter(const char* output_file)
+    : output_file_(output_file) {
+  if (output_file_.c_str() == NULL || output_file_.empty()) {
+    fprintf(stderr, "XML output file may not be null\n");
+    fflush(stderr);
+    exit(EXIT_FAILURE);
+  }
+}
+
+// Called after the unit test ends.
+void XmlUnitTestResultPrinter::OnTestIterationEnd(const UnitTest& unit_test,
+                                                  int /*iteration*/) {
+  FILE* xmlout = NULL;
+  FilePath output_file(output_file_);
+  FilePath output_dir(output_file.RemoveFileName());
+
+  if (output_dir.CreateDirectoriesRecursively()) {
+    xmlout = posix::FOpen(output_file_.c_str(), "w");
+  }
+  if (xmlout == NULL) {
+    // TODO(wan): report the reason of the failure.
+    //
+    // We don't do it for now as:
+    //
+    //   1. There is no urgent need for it.
+    //   2. It's a bit involved to make the errno variable thread-safe on
+    //      all three operating systems (Linux, Windows, and Mac OS).
+    //   3. To interpret the meaning of errno in a thread-safe way,
+    //      we need the strerror_r() function, which is not available on
+    //      Windows.
+    fprintf(stderr,
+            "Unable to open file \"%s\"\n",
+            output_file_.c_str());
+    fflush(stderr);
+    exit(EXIT_FAILURE);
+  }
+  std::stringstream stream;
+  PrintXmlUnitTest(&stream, unit_test);
+  fprintf(xmlout, "%s", StringStreamToString(&stream).c_str());
+  fclose(xmlout);
+}
+
+// Returns an XML-escaped copy of the input string str.  If is_attribute
+// is true, the text is meant to appear as an attribute value, and
+// normalizable whitespace is preserved by replacing it with character
+// references.
+//
+// Invalid XML characters in str, if any, are stripped from the output.
+// It is expected that most, if not all, of the text processed by this
+// module will consist of ordinary English text.
+// If this module is ever modified to produce version 1.1 XML output,
+// most invalid characters can be retained using character references.
+// TODO(wan): It might be nice to have a minimally invasive, human-readable
+// escaping scheme for invalid characters, rather than dropping them.
+std::string XmlUnitTestResultPrinter::EscapeXml(
+    const std::string& str, bool is_attribute) {
+  Message m;
+
+  for (size_t i = 0; i < str.size(); ++i) {
+    const char ch = str[i];
+    switch (ch) {
+      case '<':
+        m << "<";
+        break;
+      case '>':
+        m << ">";
+        break;
+      case '&':
+        m << "&";
+        break;
+      case '\'':
+        if (is_attribute)
+          m << "'";
+        else
+          m << '\'';
+        break;
+      case '"':
+        if (is_attribute)
+          m << """;
+        else
+          m << '"';
+        break;
+      default:
+        if (IsValidXmlCharacter(ch)) {
+          if (is_attribute && IsNormalizableWhitespace(ch))
+            m << "&#x" << String::FormatByte(static_cast<unsigned char>(ch))
+              << ";";
+          else
+            m << ch;
+        }
+        break;
+    }
+  }
+
+  return m.GetString();
+}
+
+// Returns the given string with all characters invalid in XML removed.
+// Currently invalid characters are dropped from the string. An
+// alternative is to replace them with certain characters such as . or ?.
+std::string XmlUnitTestResultPrinter::RemoveInvalidXmlCharacters(
+    const std::string& str) {
+  std::string output;
+  output.reserve(str.size());
+  for (std::string::const_iterator it = str.begin(); it != str.end(); ++it)
+    if (IsValidXmlCharacter(*it))
+      output.push_back(*it);
+
+  return output;
+}
+
+// The following routines generate an XML representation of a UnitTest
+// object.
+//
+// This is how Google Test concepts map to the DTD:
+//
+// <testsuites name="AllTests">        <-- corresponds to a UnitTest object
+//   <testsuite name="testcase-name">  <-- corresponds to a TestCase object
+//     <testcase name="test-name">     <-- corresponds to a TestInfo object
+//       <failure message="...">...</failure>
+//       <failure message="...">...</failure>
+//       <failure message="...">...</failure>
+//                                     <-- individual assertion failures
+//     </testcase>
+//   </testsuite>
+// </testsuites>
+
+// Formats the given time in milliseconds as seconds.
+std::string FormatTimeInMillisAsSeconds(TimeInMillis ms) {
+  ::std::stringstream ss;
+  ss << ms/1000.0;
+  return ss.str();
+}
+
+// Converts the given epoch time in milliseconds to a date string in the ISO
+// 8601 format, without the timezone information.
+std::string FormatEpochTimeInMillisAsIso8601(TimeInMillis ms) {
+  // Using non-reentrant version as localtime_r is not portable.
+  time_t seconds = static_cast<time_t>(ms / 1000);
+#ifdef _MSC_VER
+# pragma warning(push)          // Saves the current warning state.
+# pragma warning(disable:4996)  // Temporarily disables warning 4996
+                                // (function or variable may be unsafe).
+  const struct tm* const time_struct = localtime(&seconds);  // NOLINT
+# pragma warning(pop)           // Restores the warning state again.
+#else
+  const struct tm* const time_struct = localtime(&seconds);  // NOLINT
+#endif
+  if (time_struct == NULL)
+    return "";  // Invalid ms value
+
+  // YYYY-MM-DDThh:mm:ss
+  return StreamableToString(time_struct->tm_year + 1900) + "-" +
+      String::FormatIntWidth2(time_struct->tm_mon + 1) + "-" +
+      String::FormatIntWidth2(time_struct->tm_mday) + "T" +
+      String::FormatIntWidth2(time_struct->tm_hour) + ":" +
+      String::FormatIntWidth2(time_struct->tm_min) + ":" +
+      String::FormatIntWidth2(time_struct->tm_sec);
+}
+
+// Streams an XML CDATA section, escaping invalid CDATA sequences as needed.
+void XmlUnitTestResultPrinter::OutputXmlCDataSection(::std::ostream* stream,
+                                                     const char* data) {
+  const char* segment = data;
+  *stream << "<![CDATA[";
+  for (;;) {
+    const char* const next_segment = strstr(segment, "]]>");
+    if (next_segment != NULL) {
+      stream->write(
+          segment, static_cast<std::streamsize>(next_segment - segment));
+      *stream << "]]>]]><![CDATA[";
+      segment = next_segment + strlen("]]>");
+    } else {
+      *stream << segment;
+      break;
+    }
+  }
+  *stream << "]]>";
+}
+
+void XmlUnitTestResultPrinter::OutputXmlAttribute(
+    std::ostream* stream,
+    const std::string& element_name,
+    const std::string& name,
+    const std::string& value) {
+  const std::vector<std::string>& allowed_names =
+      GetReservedAttributesForElement(element_name);
+
+  GTEST_CHECK_(std::find(allowed_names.begin(), allowed_names.end(), name) !=
+                   allowed_names.end())
+      << "Attribute " << name << " is not allowed for element <" << element_name
+      << ">.";
+
+  *stream << " " << name << "=\"" << EscapeXmlAttribute(value) << "\"";
+}
+
+// Prints an XML representation of a TestInfo object.
+// TODO(wan): There is also value in printing properties with the plain printer.
+void XmlUnitTestResultPrinter::OutputXmlTestInfo(::std::ostream* stream,
+                                                 const char* test_case_name,
+                                                 const TestInfo& test_info) {
+  const TestResult& result = *test_info.result();
+  const std::string kTestcase = "testcase";
+
+  *stream << "    <testcase";
+  OutputXmlAttribute(stream, kTestcase, "name", test_info.name());
+
+  if (test_info.value_param() != NULL) {
+    OutputXmlAttribute(stream, kTestcase, "value_param",
+                       test_info.value_param());
+  }
+  if (test_info.type_param() != NULL) {
+    OutputXmlAttribute(stream, kTestcase, "type_param", test_info.type_param());
+  }
+
+  OutputXmlAttribute(stream, kTestcase, "status",
+                     test_info.should_run() ? "run" : "notrun");
+  OutputXmlAttribute(stream, kTestcase, "time",
+                     FormatTimeInMillisAsSeconds(result.elapsed_time()));
+  OutputXmlAttribute(stream, kTestcase, "classname", test_case_name);
+  *stream << TestPropertiesAsXmlAttributes(result);
+
+  int failures = 0;
+  for (int i = 0; i < result.total_part_count(); ++i) {
+    const TestPartResult& part = result.GetTestPartResult(i);
+    if (part.failed()) {
+      if (++failures == 1) {
+        *stream << ">\n";
+      }
+      const string location = internal::FormatCompilerIndependentFileLocation(
+          part.file_name(), part.line_number());
+      const string summary = location + "\n" + part.summary();
+      *stream << "      <failure message=\""
+              << EscapeXmlAttribute(summary.c_str())
+              << "\" type=\"\">";
+      const string detail = location + "\n" + part.message();
+      OutputXmlCDataSection(stream, RemoveInvalidXmlCharacters(detail).c_str());
+      *stream << "</failure>\n";
+    }
+  }
+
+  if (failures == 0)
+    *stream << " />\n";
+  else
+    *stream << "    </testcase>\n";
+}
+
+// Prints an XML representation of a TestCase object
+void XmlUnitTestResultPrinter::PrintXmlTestCase(std::ostream* stream,
+                                                const TestCase& test_case) {
+  const std::string kTestsuite = "testsuite";
+  *stream << "  <" << kTestsuite;
+  OutputXmlAttribute(stream, kTestsuite, "name", test_case.name());
+  OutputXmlAttribute(stream, kTestsuite, "tests",
+                     StreamableToString(test_case.reportable_test_count()));
+  OutputXmlAttribute(stream, kTestsuite, "failures",
+                     StreamableToString(test_case.failed_test_count()));
+  OutputXmlAttribute(
+      stream, kTestsuite, "disabled",
+      StreamableToString(test_case.reportable_disabled_test_count()));
+  OutputXmlAttribute(stream, kTestsuite, "errors", "0");
+  OutputXmlAttribute(stream, kTestsuite, "time",
+                     FormatTimeInMillisAsSeconds(test_case.elapsed_time()));
+  *stream << TestPropertiesAsXmlAttributes(test_case.ad_hoc_test_result())
+          << ">\n";
+
+  for (int i = 0; i < test_case.total_test_count(); ++i) {
+    if (test_case.GetTestInfo(i)->is_reportable())
+      OutputXmlTestInfo(stream, test_case.name(), *test_case.GetTestInfo(i));
+  }
+  *stream << "  </" << kTestsuite << ">\n";
+}
+
+// Prints an XML summary of unit_test to output stream out.
+void XmlUnitTestResultPrinter::PrintXmlUnitTest(std::ostream* stream,
+                                                const UnitTest& unit_test) {
+  const std::string kTestsuites = "testsuites";
+
+  *stream << "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
+  *stream << "<" << kTestsuites;
+
+  OutputXmlAttribute(stream, kTestsuites, "tests",
+                     StreamableToString(unit_test.reportable_test_count()));
+  OutputXmlAttribute(stream, kTestsuites, "failures",
+                     StreamableToString(unit_test.failed_test_count()));
+  OutputXmlAttribute(
+      stream, kTestsuites, "disabled",
+      StreamableToString(unit_test.reportable_disabled_test_count()));
+  OutputXmlAttribute(stream, kTestsuites, "errors", "0");
+  OutputXmlAttribute(
+      stream, kTestsuites, "timestamp",
+      FormatEpochTimeInMillisAsIso8601(unit_test.start_timestamp()));
+  OutputXmlAttribute(stream, kTestsuites, "time",
+                     FormatTimeInMillisAsSeconds(unit_test.elapsed_time()));
+
+  if (GTEST_FLAG(shuffle)) {
+    OutputXmlAttribute(stream, kTestsuites, "random_seed",
+                       StreamableToString(unit_test.random_seed()));
+  }
+
+  *stream << TestPropertiesAsXmlAttributes(unit_test.ad_hoc_test_result());
+
+  OutputXmlAttribute(stream, kTestsuites, "name", "AllTests");
+  *stream << ">\n";
+
+  for (int i = 0; i < unit_test.total_test_case_count(); ++i) {
+    if (unit_test.GetTestCase(i)->reportable_test_count() > 0)
+      PrintXmlTestCase(stream, *unit_test.GetTestCase(i));
+  }
+  *stream << "</" << kTestsuites << ">\n";
+}
+
+// Produces a string representing the test properties in a result as space
+// delimited XML attributes based on the property key="value" pairs.
+std::string XmlUnitTestResultPrinter::TestPropertiesAsXmlAttributes(
+    const TestResult& result) {
+  Message attributes;
+  for (int i = 0; i < result.test_property_count(); ++i) {
+    const TestProperty& property = result.GetTestProperty(i);
+    attributes << " " << property.key() << "="
+        << "\"" << EscapeXmlAttribute(property.value()) << "\"";
+  }
+  return attributes.GetString();
+}
+
+// End XmlUnitTestResultPrinter
+
+#if GTEST_CAN_STREAM_RESULTS_
+
+// Checks if str contains '=', '&', '%' or '\n' characters. If yes,
+// replaces them by "%xx" where xx is their hexadecimal value. For
+// example, replaces "=" with "%3D".  This algorithm is O(strlen(str))
+// in both time and space -- important as the input str may contain an
+// arbitrarily long test failure message and stack trace.
+string StreamingListener::UrlEncode(const char* str) {
+  string result;
+  result.reserve(strlen(str) + 1);
+  for (char ch = *str; ch != '\0'; ch = *++str) {
+    switch (ch) {
+      case '%':
+      case '=':
+      case '&':
+      case '\n':
+        result.append("%" + String::FormatByte(static_cast<unsigned char>(ch)));
+        break;
+      default:
+        result.push_back(ch);
+        break;
+    }
+  }
+  return result;
+}
+
+void StreamingListener::SocketWriter::MakeConnection() {
+  GTEST_CHECK_(sockfd_ == -1)
+      << "MakeConnection() can't be called when there is already a connection.";
+
+  addrinfo hints;
+  memset(&hints, 0, sizeof(hints));
+  hints.ai_family = AF_UNSPEC;    // To allow both IPv4 and IPv6 addresses.
+  hints.ai_socktype = SOCK_STREAM;
+  addrinfo* servinfo = NULL;
+
+  // Use the getaddrinfo() to get a linked list of IP addresses for
+  // the given host name.
+  const int error_num = getaddrinfo(
+      host_name_.c_str(), port_num_.c_str(), &hints, &servinfo);
+  if (error_num != 0) {
+    GTEST_LOG_(WARNING) << "stream_result_to: getaddrinfo() failed: "
+                        << gai_strerror(error_num);
+  }
+
+  // Loop through all the results and connect to the first we can.
+  for (addrinfo* cur_addr = servinfo; sockfd_ == -1 && cur_addr != NULL;
+       cur_addr = cur_addr->ai_next) {
+    sockfd_ = socket(
+        cur_addr->ai_family, cur_addr->ai_socktype, cur_addr->ai_protocol);
+    if (sockfd_ != -1) {
+      // Connect the client socket to the server socket.
+      if (connect(sockfd_, cur_addr->ai_addr, cur_addr->ai_addrlen) == -1) {
+        close(sockfd_);
+        sockfd_ = -1;
+      }
+    }
+  }
+
+  freeaddrinfo(servinfo);  // all done with this structure
+
+  if (sockfd_ == -1) {
+    GTEST_LOG_(WARNING) << "stream_result_to: failed to connect to "
+                        << host_name_ << ":" << port_num_;
+  }
+}
+
+// End of class Streaming Listener
+#endif  // GTEST_CAN_STREAM_RESULTS__
+
+// Class ScopedTrace
+
+// Pushes the given source file location and message onto a per-thread
+// trace stack maintained by Google Test.
+ScopedTrace::ScopedTrace(const char* file, int line, const Message& message)
+    GTEST_LOCK_EXCLUDED_(&UnitTest::mutex_) {
+  TraceInfo trace;
+  trace.file = file;
+  trace.line = line;
+  trace.message = message.GetString();
+
+  UnitTest::GetInstance()->PushGTestTrace(trace);
+}
+
+// Pops the info pushed by the c'tor.
+ScopedTrace::~ScopedTrace()
+    GTEST_LOCK_EXCLUDED_(&UnitTest::mutex_) {
+  UnitTest::GetInstance()->PopGTestTrace();
+}
+
+
+// class OsStackTraceGetter
+
+// Returns the current OS stack trace as an std::string.  Parameters:
+//
+//   max_depth  - the maximum number of stack frames to be included
+//                in the trace.
+//   skip_count - the number of top frames to be skipped; doesn't count
+//                against max_depth.
+//
+string OsStackTraceGetter::CurrentStackTrace(int /* max_depth */,
+                                             int /* skip_count */)
+    GTEST_LOCK_EXCLUDED_(mutex_) {
+  return "";
+}
+
+void OsStackTraceGetter::UponLeavingGTest()
+    GTEST_LOCK_EXCLUDED_(mutex_) {
+}
+
+const char* const
+OsStackTraceGetter::kElidedFramesMarker =
+    "... " GTEST_NAME_ " internal frames ...";
+
+// A helper class that creates the premature-exit file in its
+// constructor and deletes the file in its destructor.
+class ScopedPrematureExitFile {
+ public:
+  explicit ScopedPrematureExitFile(const char* premature_exit_filepath)
+      : premature_exit_filepath_(premature_exit_filepath) {
+    // If a path to the premature-exit file is specified...
+    if (premature_exit_filepath != NULL && *premature_exit_filepath != '\0') {
+      // create the file with a single "0" character in it.  I/O
+      // errors are ignored as there's nothing better we can do and we
+      // don't want to fail the test because of this.
+      FILE* pfile = posix::FOpen(premature_exit_filepath, "w");
+      fwrite("0", 1, 1, pfile);
+      fclose(pfile);
+    }
+  }
+
+  ~ScopedPrematureExitFile() {
+    if (premature_exit_filepath_ != NULL && *premature_exit_filepath_ != '\0') {
+      remove(premature_exit_filepath_);
+    }
+  }
+
+ private:
+  const char* const premature_exit_filepath_;
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(ScopedPrematureExitFile);
+};
+
+}  // namespace internal
+
+// class TestEventListeners
+
+TestEventListeners::TestEventListeners()
+    : repeater_(new internal::TestEventRepeater()),
+      default_result_printer_(NULL),
+      default_xml_generator_(NULL) {
+}
+
+TestEventListeners::~TestEventListeners() { delete repeater_; }
+
+// Returns the standard listener responsible for the default console
+// output.  Can be removed from the listeners list to shut down default
+// console output.  Note that removing this object from the listener list
+// with Release transfers its ownership to the user.
+void TestEventListeners::Append(TestEventListener* listener) {
+  repeater_->Append(listener);
+}
+
+// Removes the given event listener from the list and returns it.  It then
+// becomes the caller's responsibility to delete the listener. Returns
+// NULL if the listener is not found in the list.
+TestEventListener* TestEventListeners::Release(TestEventListener* listener) {
+  if (listener == default_result_printer_)
+    default_result_printer_ = NULL;
+  else if (listener == default_xml_generator_)
+    default_xml_generator_ = NULL;
+  return repeater_->Release(listener);
+}
+
+// Returns repeater that broadcasts the TestEventListener events to all
+// subscribers.
+TestEventListener* TestEventListeners::repeater() { return repeater_; }
+
+// Sets the default_result_printer attribute to the provided listener.
+// The listener is also added to the listener list and previous
+// default_result_printer is removed from it and deleted. The listener can
+// also be NULL in which case it will not be added to the list. Does
+// nothing if the previous and the current listener objects are the same.
+void TestEventListeners::SetDefaultResultPrinter(TestEventListener* listener) {
+  if (default_result_printer_ != listener) {
+    // It is an error to pass this method a listener that is already in the
+    // list.
+    delete Release(default_result_printer_);
+    default_result_printer_ = listener;
+    if (listener != NULL)
+      Append(listener);
+  }
+}
+
+// Sets the default_xml_generator attribute to the provided listener.  The
+// listener is also added to the listener list and previous
+// default_xml_generator is removed from it and deleted. The listener can
+// also be NULL in which case it will not be added to the list. Does
+// nothing if the previous and the current listener objects are the same.
+void TestEventListeners::SetDefaultXmlGenerator(TestEventListener* listener) {
+  if (default_xml_generator_ != listener) {
+    // It is an error to pass this method a listener that is already in the
+    // list.
+    delete Release(default_xml_generator_);
+    default_xml_generator_ = listener;
+    if (listener != NULL)
+      Append(listener);
+  }
+}
+
+// Controls whether events will be forwarded by the repeater to the
+// listeners in the list.
+bool TestEventListeners::EventForwardingEnabled() const {
+  return repeater_->forwarding_enabled();
+}
+
+void TestEventListeners::SuppressEventForwarding() {
+  repeater_->set_forwarding_enabled(false);
+}
+
+// class UnitTest
+
+// Gets the singleton UnitTest object.  The first time this method is
+// called, a UnitTest object is constructed and returned.  Consecutive
+// calls will return the same object.
+//
+// We don't protect this under mutex_ as a user is not supposed to
+// call this before main() starts, from which point on the return
+// value will never change.
+UnitTest* UnitTest::GetInstance() {
+  // When compiled with MSVC 7.1 in optimized mode, destroying the
+  // UnitTest object upon exiting the program messes up the exit code,
+  // causing successful tests to appear failed.  We have to use a
+  // different implementation in this case to bypass the compiler bug.
+  // This implementation makes the compiler happy, at the cost of
+  // leaking the UnitTest object.
+
+  // CodeGear C++Builder insists on a public destructor for the
+  // default implementation.  Use this implementation to keep good OO
+  // design with private destructor.
+
+#if (_MSC_VER == 1310 && !defined(_DEBUG)) || defined(__BORLANDC__)
+  static UnitTest* const instance = new UnitTest;
+  return instance;
+#else
+  static UnitTest instance;
+  return &instance;
+#endif  // (_MSC_VER == 1310 && !defined(_DEBUG)) || defined(__BORLANDC__)
+}
+
+// Gets the number of successful test cases.
+int UnitTest::successful_test_case_count() const {
+  return impl()->successful_test_case_count();
+}
+
+// Gets the number of failed test cases.
+int UnitTest::failed_test_case_count() const {
+  return impl()->failed_test_case_count();
+}
+
+// Gets the number of all test cases.
+int UnitTest::total_test_case_count() const {
+  return impl()->total_test_case_count();
+}
+
+// Gets the number of all test cases that contain at least one test
+// that should run.
+int UnitTest::test_case_to_run_count() const {
+  return impl()->test_case_to_run_count();
+}
+
+// Gets the number of successful tests.
+int UnitTest::successful_test_count() const {
+  return impl()->successful_test_count();
+}
+
+// Gets the number of failed tests.
+int UnitTest::failed_test_count() const { return impl()->failed_test_count(); }
+
+// Gets the number of disabled tests that will be reported in the XML report.
+int UnitTest::reportable_disabled_test_count() const {
+  return impl()->reportable_disabled_test_count();
+}
+
+// Gets the number of disabled tests.
+int UnitTest::disabled_test_count() const {
+  return impl()->disabled_test_count();
+}
+
+// Gets the number of tests to be printed in the XML report.
+int UnitTest::reportable_test_count() const {
+  return impl()->reportable_test_count();
+}
+
+// Gets the number of all tests.
+int UnitTest::total_test_count() const { return impl()->total_test_count(); }
+
+// Gets the number of tests that should run.
+int UnitTest::test_to_run_count() const { return impl()->test_to_run_count(); }
+
+// Gets the time of the test program start, in ms from the start of the
+// UNIX epoch.
+internal::TimeInMillis UnitTest::start_timestamp() const {
+    return impl()->start_timestamp();
+}
+
+// Gets the elapsed time, in milliseconds.
+internal::TimeInMillis UnitTest::elapsed_time() const {
+  return impl()->elapsed_time();
+}
+
+// Returns true iff the unit test passed (i.e. all test cases passed).
+bool UnitTest::Passed() const { return impl()->Passed(); }
+
+// Returns true iff the unit test failed (i.e. some test case failed
+// or something outside of all tests failed).
+bool UnitTest::Failed() const { return impl()->Failed(); }
+
+// Gets the i-th test case among all the test cases. i can range from 0 to
+// total_test_case_count() - 1. If i is not in that range, returns NULL.
+const TestCase* UnitTest::GetTestCase(int i) const {
+  return impl()->GetTestCase(i);
+}
+
+// Returns the TestResult containing information on test failures and
+// properties logged outside of individual test cases.
+const TestResult& UnitTest::ad_hoc_test_result() const {
+  return *impl()->ad_hoc_test_result();
+}
+
+// Gets the i-th test case among all the test cases. i can range from 0 to
+// total_test_case_count() - 1. If i is not in that range, returns NULL.
+TestCase* UnitTest::GetMutableTestCase(int i) {
+  return impl()->GetMutableTestCase(i);
+}
+
+// Returns the list of event listeners that can be used to track events
+// inside Google Test.
+TestEventListeners& UnitTest::listeners() {
+  return *impl()->listeners();
+}
+
+// Registers and returns a global test environment.  When a test
+// program is run, all global test environments will be set-up in the
+// order they were registered.  After all tests in the program have
+// finished, all global test environments will be torn-down in the
+// *reverse* order they were registered.
+//
+// The UnitTest object takes ownership of the given environment.
+//
+// We don't protect this under mutex_, as we only support calling it
+// from the main thread.
+Environment* UnitTest::AddEnvironment(Environment* env) {
+  if (env == NULL) {
+    return NULL;
+  }
+
+  impl_->environments().push_back(env);
+  return env;
+}
+
+// Adds a TestPartResult to the current TestResult object.  All Google Test
+// assertion macros (e.g. ASSERT_TRUE, EXPECT_EQ, etc) eventually call
+// this to report their results.  The user code should use the
+// assertion macros instead of calling this directly.
+void UnitTest::AddTestPartResult(
+    TestPartResult::Type result_type,
+    const char* file_name,
+    int line_number,
+    const std::string& message,
+    const std::string& os_stack_trace) GTEST_LOCK_EXCLUDED_(mutex_) {
+  Message msg;
+  msg << message;
+
+  internal::MutexLock lock(&mutex_);
+  if (impl_->gtest_trace_stack().size() > 0) {
+    msg << "\n" << GTEST_NAME_ << " trace:";
+
+    for (int i = static_cast<int>(impl_->gtest_trace_stack().size());
+         i > 0; --i) {
+      const internal::TraceInfo& trace = impl_->gtest_trace_stack()[i - 1];
+      msg << "\n" << internal::FormatFileLocation(trace.file, trace.line)
+          << " " << trace.message;
+    }
+  }
+
+  if (os_stack_trace.c_str() != NULL && !os_stack_trace.empty()) {
+    msg << internal::kStackTraceMarker << os_stack_trace;
+  }
+
+  const TestPartResult result =
+    TestPartResult(result_type, file_name, line_number,
+                   msg.GetString().c_str());
+  impl_->GetTestPartResultReporterForCurrentThread()->
+      ReportTestPartResult(result);
+
+  if (result_type != TestPartResult::kSuccess) {
+    // gtest_break_on_failure takes precedence over
+    // gtest_throw_on_failure.  This allows a user to set the latter
+    // in the code (perhaps in order to use Google Test assertions
+    // with another testing framework) and specify the former on the
+    // command line for debugging.
+    if (GTEST_FLAG(break_on_failure)) {
+#if GTEST_OS_WINDOWS
+      // Using DebugBreak on Windows allows gtest to still break into a debugger
+      // when a failure happens and both the --gtest_break_on_failure and
+      // the --gtest_catch_exceptions flags are specified.
+      DebugBreak();
+#else
+      // Dereference NULL through a volatile pointer to prevent the compiler
+      // from removing. We use this rather than abort() or __builtin_trap() for
+      // portability: Symbian doesn't implement abort() well, and some debuggers
+      // don't correctly trap abort().
+      *static_cast<volatile int*>(NULL) = 1;
+#endif  // GTEST_OS_WINDOWS
+    } else if (GTEST_FLAG(throw_on_failure)) {
+#if GTEST_HAS_EXCEPTIONS
+      throw internal::GoogleTestFailureException(result);
+#else
+      // We cannot call abort() as it generates a pop-up in debug mode
+      // that cannot be suppressed in VC 7.1 or below.
+      exit(1);
+#endif
+    }
+  }
+}
+
+// Adds a TestProperty to the current TestResult object when invoked from
+// inside a test, to current TestCase's ad_hoc_test_result_ when invoked
+// from SetUpTestCase or TearDownTestCase, or to the global property set
+// when invoked elsewhere.  If the result already contains a property with
+// the same key, the value will be updated.
+void UnitTest::RecordProperty(const std::string& key,
+                              const std::string& value) {
+  impl_->RecordProperty(TestProperty(key, value));
+}
+
+// Runs all tests in this UnitTest object and prints the result.
+// Returns 0 if successful, or 1 otherwise.
+//
+// We don't protect this under mutex_, as we only support calling it
+// from the main thread.
+int UnitTest::Run() {
+  const bool in_death_test_child_process =
+      internal::GTEST_FLAG(internal_run_death_test).length() > 0;
+
+  // Google Test implements this protocol for catching that a test
+  // program exits before returning control to Google Test:
+  //
+  //   1. Upon start, Google Test creates a file whose absolute path
+  //      is specified by the environment variable
+  //      TEST_PREMATURE_EXIT_FILE.
+  //   2. When Google Test has finished its work, it deletes the file.
+  //
+  // This allows a test runner to set TEST_PREMATURE_EXIT_FILE before
+  // running a Google-Test-based test program and check the existence
+  // of the file at the end of the test execution to see if it has
+  // exited prematurely.
+
+  // If we are in the child process of a death test, don't
+  // create/delete the premature exit file, as doing so is unnecessary
+  // and will confuse the parent process.  Otherwise, create/delete
+  // the file upon entering/leaving this function.  If the program
+  // somehow exits before this function has a chance to return, the
+  // premature-exit file will be left undeleted, causing a test runner
+  // that understands the premature-exit-file protocol to report the
+  // test as having failed.
+  const internal::ScopedPrematureExitFile premature_exit_file(
+      in_death_test_child_process ?
+      NULL : internal::posix::GetEnv("TEST_PREMATURE_EXIT_FILE"));
+
+  // Captures the value of GTEST_FLAG(catch_exceptions).  This value will be
+  // used for the duration of the program.
+  impl()->set_catch_exceptions(GTEST_FLAG(catch_exceptions));
+
+#if GTEST_HAS_SEH
+  // Either the user wants Google Test to catch exceptions thrown by the
+  // tests or this is executing in the context of death test child
+  // process. In either case the user does not want to see pop-up dialogs
+  // about crashes - they are expected.
+  if (impl()->catch_exceptions() || in_death_test_child_process) {
+# if !GTEST_OS_WINDOWS_MOBILE
+    // SetErrorMode doesn't exist on CE.
+    SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOALIGNMENTFAULTEXCEPT |
+                 SEM_NOGPFAULTERRORBOX | SEM_NOOPENFILEERRORBOX);
+# endif  // !GTEST_OS_WINDOWS_MOBILE
+
+# if (defined(_MSC_VER) || GTEST_OS_WINDOWS_MINGW) && !GTEST_OS_WINDOWS_MOBILE
+    // Death test children can be terminated with _abort().  On Windows,
+    // _abort() can show a dialog with a warning message.  This forces the
+    // abort message to go to stderr instead.
+    _set_error_mode(_OUT_TO_STDERR);
+# endif
+
+# if _MSC_VER >= 1400 && !GTEST_OS_WINDOWS_MOBILE
+    // In the debug version, Visual Studio pops up a separate dialog
+    // offering a choice to debug the aborted program. We need to suppress
+    // this dialog or it will pop up for every EXPECT/ASSERT_DEATH statement
+    // executed. Google Test will notify the user of any unexpected
+    // failure via stderr.
+    //
+    // VC++ doesn't define _set_abort_behavior() prior to the version 8.0.
+    // Users of prior VC versions shall suffer the agony and pain of
+    // clicking through the countless debug dialogs.
+    // TODO(vladl at google.com): find a way to suppress the abort dialog() in the
+    // debug mode when compiled with VC 7.1 or lower.
+    if (!GTEST_FLAG(break_on_failure))
+      _set_abort_behavior(
+          0x0,                                    // Clear the following flags:
+          _WRITE_ABORT_MSG | _CALL_REPORTFAULT);  // pop-up window, core dump.
+# endif
+  }
+#endif  // GTEST_HAS_SEH
+
+  return internal::HandleExceptionsInMethodIfSupported(
+      impl(),
+      &internal::UnitTestImpl::RunAllTests,
+      "auxiliary test code (environments or event listeners)") ? 0 : 1;
+}
+
+// Returns the working directory when the first TEST() or TEST_F() was
+// executed.
+const char* UnitTest::original_working_dir() const {
+  return impl_->original_working_dir_.c_str();
+}
+
+// Returns the TestCase object for the test that's currently running,
+// or NULL if no test is running.
+const TestCase* UnitTest::current_test_case() const
+    GTEST_LOCK_EXCLUDED_(mutex_) {
+  internal::MutexLock lock(&mutex_);
+  return impl_->current_test_case();
+}
+
+// Returns the TestInfo object for the test that's currently running,
+// or NULL if no test is running.
+const TestInfo* UnitTest::current_test_info() const
+    GTEST_LOCK_EXCLUDED_(mutex_) {
+  internal::MutexLock lock(&mutex_);
+  return impl_->current_test_info();
+}
+
+// Returns the random seed used at the start of the current test run.
+int UnitTest::random_seed() const { return impl_->random_seed(); }
+
+#if GTEST_HAS_PARAM_TEST
+// Returns ParameterizedTestCaseRegistry object used to keep track of
+// value-parameterized tests and instantiate and register them.
+internal::ParameterizedTestCaseRegistry&
+    UnitTest::parameterized_test_registry()
+        GTEST_LOCK_EXCLUDED_(mutex_) {
+  return impl_->parameterized_test_registry();
+}
+#endif  // GTEST_HAS_PARAM_TEST
+
+// Creates an empty UnitTest.
+UnitTest::UnitTest() {
+  impl_ = new internal::UnitTestImpl(this);
+}
+
+// Destructor of UnitTest.
+UnitTest::~UnitTest() {
+  delete impl_;
+}
+
+// Pushes a trace defined by SCOPED_TRACE() on to the per-thread
+// Google Test trace stack.
+void UnitTest::PushGTestTrace(const internal::TraceInfo& trace)
+    GTEST_LOCK_EXCLUDED_(mutex_) {
+  internal::MutexLock lock(&mutex_);
+  impl_->gtest_trace_stack().push_back(trace);
+}
+
+// Pops a trace from the per-thread Google Test trace stack.
+void UnitTest::PopGTestTrace()
+    GTEST_LOCK_EXCLUDED_(mutex_) {
+  internal::MutexLock lock(&mutex_);
+  impl_->gtest_trace_stack().pop_back();
+}
+
+namespace internal {
+
+UnitTestImpl::UnitTestImpl(UnitTest* parent)
+    : parent_(parent),
+#ifdef _MSC_VER
+# pragma warning(push)                    // Saves the current warning state.
+# pragma warning(disable:4355)            // Temporarily disables warning 4355
+                                         // (using this in initializer).
+      default_global_test_part_result_reporter_(this),
+      default_per_thread_test_part_result_reporter_(this),
+# pragma warning(pop)                     // Restores the warning state again.
+#else
+      default_global_test_part_result_reporter_(this),
+      default_per_thread_test_part_result_reporter_(this),
+#endif  // _MSC_VER
+      global_test_part_result_repoter_(
+          &default_global_test_part_result_reporter_),
+      per_thread_test_part_result_reporter_(
+          &default_per_thread_test_part_result_reporter_),
+#if GTEST_HAS_PARAM_TEST
+      parameterized_test_registry_(),
+      parameterized_tests_registered_(false),
+#endif  // GTEST_HAS_PARAM_TEST
+      last_death_test_case_(-1),
+      current_test_case_(NULL),
+      current_test_info_(NULL),
+      ad_hoc_test_result_(),
+      os_stack_trace_getter_(NULL),
+      post_flag_parse_init_performed_(false),
+      random_seed_(0),  // Will be overridden by the flag before first use.
+      random_(0),  // Will be reseeded before first use.
+      start_timestamp_(0),
+      elapsed_time_(0),
+#if GTEST_HAS_DEATH_TEST
+      death_test_factory_(new DefaultDeathTestFactory),
+#endif
+      // Will be overridden by the flag before first use.
+      catch_exceptions_(false) {
+  listeners()->SetDefaultResultPrinter(new PrettyUnitTestResultPrinter);
+}
+
+UnitTestImpl::~UnitTestImpl() {
+  // Deletes every TestCase.
+  ForEach(test_cases_, internal::Delete<TestCase>);
+
+  // Deletes every Environment.
+  ForEach(environments_, internal::Delete<Environment>);
+
+  delete os_stack_trace_getter_;
+}
+
+// Adds a TestProperty to the current TestResult object when invoked in a
+// context of a test, to current test case's ad_hoc_test_result when invoke
+// from SetUpTestCase/TearDownTestCase, or to the global property set
+// otherwise.  If the result already contains a property with the same key,
+// the value will be updated.
+void UnitTestImpl::RecordProperty(const TestProperty& test_property) {
+  std::string xml_element;
+  TestResult* test_result;  // TestResult appropriate for property recording.
+
+  if (current_test_info_ != NULL) {
+    xml_element = "testcase";
+    test_result = &(current_test_info_->result_);
+  } else if (current_test_case_ != NULL) {
+    xml_element = "testsuite";
+    test_result = &(current_test_case_->ad_hoc_test_result_);
+  } else {
+    xml_element = "testsuites";
+    test_result = &ad_hoc_test_result_;
+  }
+  test_result->RecordProperty(xml_element, test_property);
+}
+
+#if GTEST_HAS_DEATH_TEST
+// Disables event forwarding if the control is currently in a death test
+// subprocess. Must not be called before InitGoogleTest.
+void UnitTestImpl::SuppressTestEventsIfInSubprocess() {
+  if (internal_run_death_test_flag_.get() != NULL)
+    listeners()->SuppressEventForwarding();
+}
+#endif  // GTEST_HAS_DEATH_TEST
+
+// Initializes event listeners performing XML output as specified by
+// UnitTestOptions. Must not be called before InitGoogleTest.
+void UnitTestImpl::ConfigureXmlOutput() {
+  const std::string& output_format = UnitTestOptions::GetOutputFormat();
+  if (output_format == "xml") {
+    listeners()->SetDefaultXmlGenerator(new XmlUnitTestResultPrinter(
+        UnitTestOptions::GetAbsolutePathToOutputFile().c_str()));
+  } else if (output_format != "") {
+    printf("WARNING: unrecognized output format \"%s\" ignored.\n",
+           output_format.c_str());
+    fflush(stdout);
+  }
+}
+
+#if GTEST_CAN_STREAM_RESULTS_
+// Initializes event listeners for streaming test results in string form.
+// Must not be called before InitGoogleTest.
+void UnitTestImpl::ConfigureStreamingOutput() {
+  const std::string& target = GTEST_FLAG(stream_result_to);
+  if (!target.empty()) {
+    const size_t pos = target.find(':');
+    if (pos != std::string::npos) {
+      listeners()->Append(new StreamingListener(target.substr(0, pos),
+                                                target.substr(pos+1)));
+    } else {
+      printf("WARNING: unrecognized streaming target \"%s\" ignored.\n",
+             target.c_str());
+      fflush(stdout);
+    }
+  }
+}
+#endif  // GTEST_CAN_STREAM_RESULTS_
+
+// Performs initialization dependent upon flag values obtained in
+// ParseGoogleTestFlagsOnly.  Is called from InitGoogleTest after the call to
+// ParseGoogleTestFlagsOnly.  In case a user neglects to call InitGoogleTest
+// this function is also called from RunAllTests.  Since this function can be
+// called more than once, it has to be idempotent.
+void UnitTestImpl::PostFlagParsingInit() {
+  // Ensures that this function does not execute more than once.
+  if (!post_flag_parse_init_performed_) {
+    post_flag_parse_init_performed_ = true;
+
+#if GTEST_HAS_DEATH_TEST
+    InitDeathTestSubprocessControlInfo();
+    SuppressTestEventsIfInSubprocess();
+#endif  // GTEST_HAS_DEATH_TEST
+
+    // Registers parameterized tests. This makes parameterized tests
+    // available to the UnitTest reflection API without running
+    // RUN_ALL_TESTS.
+    RegisterParameterizedTests();
+
+    // Configures listeners for XML output. This makes it possible for users
+    // to shut down the default XML output before invoking RUN_ALL_TESTS.
+    ConfigureXmlOutput();
+
+#if GTEST_CAN_STREAM_RESULTS_
+    // Configures listeners for streaming test results to the specified server.
+    ConfigureStreamingOutput();
+#endif  // GTEST_CAN_STREAM_RESULTS_
+  }
+}
+
+// A predicate that checks the name of a TestCase against a known
+// value.
+//
+// This is used for implementation of the UnitTest class only.  We put
+// it in the anonymous namespace to prevent polluting the outer
+// namespace.
+//
+// TestCaseNameIs is copyable.
+class TestCaseNameIs {
+ public:
+  // Constructor.
+  explicit TestCaseNameIs(const std::string& name)
+      : name_(name) {}
+
+  // Returns true iff the name of test_case matches name_.
+  bool operator()(const TestCase* test_case) const {
+    return test_case != NULL && strcmp(test_case->name(), name_.c_str()) == 0;
+  }
+
+ private:
+  std::string name_;
+};
+
+// Finds and returns a TestCase with the given name.  If one doesn't
+// exist, creates one and returns it.  It's the CALLER'S
+// RESPONSIBILITY to ensure that this function is only called WHEN THE
+// TESTS ARE NOT SHUFFLED.
+//
+// Arguments:
+//
+//   test_case_name: name of the test case
+//   type_param:     the name of the test case's type parameter, or NULL if
+//                   this is not a typed or a type-parameterized test case.
+//   set_up_tc:      pointer to the function that sets up the test case
+//   tear_down_tc:   pointer to the function that tears down the test case
+TestCase* UnitTestImpl::GetTestCase(const char* test_case_name,
+                                    const char* type_param,
+                                    Test::SetUpTestCaseFunc set_up_tc,
+                                    Test::TearDownTestCaseFunc tear_down_tc) {
+  // Can we find a TestCase with the given name?
+  const std::vector<TestCase*>::const_iterator test_case =
+      std::find_if(test_cases_.begin(), test_cases_.end(),
+                   TestCaseNameIs(test_case_name));
+
+  if (test_case != test_cases_.end())
+    return *test_case;
+
+  // No.  Let's create one.
+  TestCase* const new_test_case =
+      new TestCase(test_case_name, type_param, set_up_tc, tear_down_tc);
+
+  // Is this a death test case?
+  if (internal::UnitTestOptions::MatchesFilter(test_case_name,
+                                               kDeathTestCaseFilter)) {
+    // Yes.  Inserts the test case after the last death test case
+    // defined so far.  This only works when the test cases haven't
+    // been shuffled.  Otherwise we may end up running a death test
+    // after a non-death test.
+    ++last_death_test_case_;
+    test_cases_.insert(test_cases_.begin() + last_death_test_case_,
+                       new_test_case);
+  } else {
+    // No.  Appends to the end of the list.
+    test_cases_.push_back(new_test_case);
+  }
+
+  test_case_indices_.push_back(static_cast<int>(test_case_indices_.size()));
+  return new_test_case;
+}
+
+// Helpers for setting up / tearing down the given environment.  They
+// are for use in the ForEach() function.
+static void SetUpEnvironment(Environment* env) { env->SetUp(); }
+static void TearDownEnvironment(Environment* env) { env->TearDown(); }
+
+// Runs all tests in this UnitTest object, prints the result, and
+// returns true if all tests are successful.  If any exception is
+// thrown during a test, the test is considered to be failed, but the
+// rest of the tests will still be run.
+//
+// When parameterized tests are enabled, it expands and registers
+// parameterized tests first in RegisterParameterizedTests().
+// All other functions called from RunAllTests() may safely assume that
+// parameterized tests are ready to be counted and run.
+bool UnitTestImpl::RunAllTests() {
+  // Makes sure InitGoogleTest() was called.
+  if (!GTestIsInitialized()) {
+    printf("%s",
+           "\nThis test program did NOT call ::testing::InitGoogleTest "
+           "before calling RUN_ALL_TESTS().  Please fix it.\n");
+    return false;
+  }
+
+  // Do not run any test if the --help flag was specified.
+  if (g_help_flag)
+    return true;
+
+  // Repeats the call to the post-flag parsing initialization in case the
+  // user didn't call InitGoogleTest.
+  PostFlagParsingInit();
+
+  // Even if sharding is not on, test runners may want to use the
+  // GTEST_SHARD_STATUS_FILE to query whether the test supports the sharding
+  // protocol.
+  internal::WriteToShardStatusFileIfNeeded();
+
+  // True iff we are in a subprocess for running a thread-safe-style
+  // death test.
+  bool in_subprocess_for_death_test = false;
+
+#if GTEST_HAS_DEATH_TEST
+  in_subprocess_for_death_test = (internal_run_death_test_flag_.get() != NULL);
+#endif  // GTEST_HAS_DEATH_TEST
+
+  const bool should_shard = ShouldShard(kTestTotalShards, kTestShardIndex,
+                                        in_subprocess_for_death_test);
+
+  // Compares the full test names with the filter to decide which
+  // tests to run.
+  const bool has_tests_to_run = FilterTests(should_shard
+                                              ? HONOR_SHARDING_PROTOCOL
+                                              : IGNORE_SHARDING_PROTOCOL) > 0;
+
+  // Lists the tests and exits if the --gtest_list_tests flag was specified.
+  if (GTEST_FLAG(list_tests)) {
+    // This must be called *after* FilterTests() has been called.
+    ListTestsMatchingFilter();
+    return true;
+  }
+
+  random_seed_ = GTEST_FLAG(shuffle) ?
+      GetRandomSeedFromFlag(GTEST_FLAG(random_seed)) : 0;
+
+  // True iff at least one test has failed.
+  bool failed = false;
+
+  TestEventListener* repeater = listeners()->repeater();
+
+  start_timestamp_ = GetTimeInMillis();
+  repeater->OnTestProgramStart(*parent_);
+
+  // How many times to repeat the tests?  We don't want to repeat them
+  // when we are inside the subprocess of a death test.
+  const int repeat = in_subprocess_for_death_test ? 1 : GTEST_FLAG(repeat);
+  // Repeats forever if the repeat count is negative.
+  const bool forever = repeat < 0;
+  for (int i = 0; forever || i != repeat; i++) {
+    // We want to preserve failures generated by ad-hoc test
+    // assertions executed before RUN_ALL_TESTS().
+    ClearNonAdHocTestResult();
+
+    const TimeInMillis start = GetTimeInMillis();
+
+    // Shuffles test cases and tests if requested.
+    if (has_tests_to_run && GTEST_FLAG(shuffle)) {
+      random()->Reseed(random_seed_);
+      // This should be done before calling OnTestIterationStart(),
+      // such that a test event listener can see the actual test order
+      // in the event.
+      ShuffleTests();
+    }
+
+    // Tells the unit test event listeners that the tests are about to start.
+    repeater->OnTestIterationStart(*parent_, i);
+
+    // Runs each test case if there is at least one test to run.
+    if (has_tests_to_run) {
+      // Sets up all environments beforehand.
+      repeater->OnEnvironmentsSetUpStart(*parent_);
+      ForEach(environments_, SetUpEnvironment);
+      repeater->OnEnvironmentsSetUpEnd(*parent_);
+
+      // Runs the tests only if there was no fatal failure during global
+      // set-up.
+      if (!Test::HasFatalFailure()) {
+        for (int test_index = 0; test_index < total_test_case_count();
+             test_index++) {
+          GetMutableTestCase(test_index)->Run();
+        }
+      }
+
+      // Tears down all environments in reverse order afterwards.
+      repeater->OnEnvironmentsTearDownStart(*parent_);
+      std::for_each(environments_.rbegin(), environments_.rend(),
+                    TearDownEnvironment);
+      repeater->OnEnvironmentsTearDownEnd(*parent_);
+    }
+
+    elapsed_time_ = GetTimeInMillis() - start;
+
+    // Tells the unit test event listener that the tests have just finished.
+    repeater->OnTestIterationEnd(*parent_, i);
+
+    // Gets the result and clears it.
+    if (!Passed()) {
+      failed = true;
+    }
+
+    // Restores the original test order after the iteration.  This
+    // allows the user to quickly repro a failure that happens in the
+    // N-th iteration without repeating the first (N - 1) iterations.
+    // This is not enclosed in "if (GTEST_FLAG(shuffle)) { ... }", in
+    // case the user somehow changes the value of the flag somewhere
+    // (it's always safe to unshuffle the tests).
+    UnshuffleTests();
+
+    if (GTEST_FLAG(shuffle)) {
+      // Picks a new random seed for each iteration.
+      random_seed_ = GetNextRandomSeed(random_seed_);
+    }
+  }
+
+  repeater->OnTestProgramEnd(*parent_);
+
+  return !failed;
+}
+
+// Reads the GTEST_SHARD_STATUS_FILE environment variable, and creates the file
+// if the variable is present. If a file already exists at this location, this
+// function will write over it. If the variable is present, but the file cannot
+// be created, prints an error and exits.
+void WriteToShardStatusFileIfNeeded() {
+  const char* const test_shard_file = posix::GetEnv(kTestShardStatusFile);
+  if (test_shard_file != NULL) {
+    FILE* const file = posix::FOpen(test_shard_file, "w");
+    if (file == NULL) {
+      ColoredPrintf(COLOR_RED,
+                    "Could not write to the test shard status file \"%s\" "
+                    "specified by the %s environment variable.\n",
+                    test_shard_file, kTestShardStatusFile);
+      fflush(stdout);
+      exit(EXIT_FAILURE);
+    }
+    fclose(file);
+  }
+}
+
+// Checks whether sharding is enabled by examining the relevant
+// environment variable values. If the variables are present,
+// but inconsistent (i.e., shard_index >= total_shards), prints
+// an error and exits. If in_subprocess_for_death_test, sharding is
+// disabled because it must only be applied to the original test
+// process. Otherwise, we could filter out death tests we intended to execute.
+bool ShouldShard(const char* total_shards_env,
+                 const char* shard_index_env,
+                 bool in_subprocess_for_death_test) {
+  if (in_subprocess_for_death_test) {
+    return false;
+  }
+
+  const Int32 total_shards = Int32FromEnvOrDie(total_shards_env, -1);
+  const Int32 shard_index = Int32FromEnvOrDie(shard_index_env, -1);
+
+  if (total_shards == -1 && shard_index == -1) {
+    return false;
+  } else if (total_shards == -1 && shard_index != -1) {
+    const Message msg = Message()
+      << "Invalid environment variables: you have "
+      << kTestShardIndex << " = " << shard_index
+      << ", but have left " << kTestTotalShards << " unset.\n";
+    ColoredPrintf(COLOR_RED, msg.GetString().c_str());
+    fflush(stdout);
+    exit(EXIT_FAILURE);
+  } else if (total_shards != -1 && shard_index == -1) {
+    const Message msg = Message()
+      << "Invalid environment variables: you have "
+      << kTestTotalShards << " = " << total_shards
+      << ", but have left " << kTestShardIndex << " unset.\n";
+    ColoredPrintf(COLOR_RED, msg.GetString().c_str());
+    fflush(stdout);
+    exit(EXIT_FAILURE);
+  } else if (shard_index < 0 || shard_index >= total_shards) {
+    const Message msg = Message()
+      << "Invalid environment variables: we require 0 <= "
+      << kTestShardIndex << " < " << kTestTotalShards
+      << ", but you have " << kTestShardIndex << "=" << shard_index
+      << ", " << kTestTotalShards << "=" << total_shards << ".\n";
+    ColoredPrintf(COLOR_RED, msg.GetString().c_str());
+    fflush(stdout);
+    exit(EXIT_FAILURE);
+  }
+
+  return total_shards > 1;
+}
+
+// Parses the environment variable var as an Int32. If it is unset,
+// returns default_val. If it is not an Int32, prints an error
+// and aborts.
+Int32 Int32FromEnvOrDie(const char* var, Int32 default_val) {
+  const char* str_val = posix::GetEnv(var);
+  if (str_val == NULL) {
+    return default_val;
+  }
+
+  Int32 result;
+  if (!ParseInt32(Message() << "The value of environment variable " << var,
+                  str_val, &result)) {
+    exit(EXIT_FAILURE);
+  }
+  return result;
+}
+
+// Given the total number of shards, the shard index, and the test id,
+// returns true iff the test should be run on this shard. The test id is
+// some arbitrary but unique non-negative integer assigned to each test
+// method. Assumes that 0 <= shard_index < total_shards.
+bool ShouldRunTestOnShard(int total_shards, int shard_index, int test_id) {
+  return (test_id % total_shards) == shard_index;
+}
+
+// Compares the name of each test with the user-specified filter to
+// decide whether the test should be run, then records the result in
+// each TestCase and TestInfo object.
+// If shard_tests == true, further filters tests based on sharding
+// variables in the environment - see
+// http://code.google.com/p/googletest/wiki/GoogleTestAdvancedGuide.
+// Returns the number of tests that should run.
+int UnitTestImpl::FilterTests(ReactionToSharding shard_tests) {
+  const Int32 total_shards = shard_tests == HONOR_SHARDING_PROTOCOL ?
+      Int32FromEnvOrDie(kTestTotalShards, -1) : -1;
+  const Int32 shard_index = shard_tests == HONOR_SHARDING_PROTOCOL ?
+      Int32FromEnvOrDie(kTestShardIndex, -1) : -1;
+
+  // num_runnable_tests are the number of tests that will
+  // run across all shards (i.e., match filter and are not disabled).
+  // num_selected_tests are the number of tests to be run on
+  // this shard.
+  int num_runnable_tests = 0;
+  int num_selected_tests = 0;
+  for (size_t i = 0; i < test_cases_.size(); i++) {
+    TestCase* const test_case = test_cases_[i];
+    const std::string &test_case_name = test_case->name();
+    test_case->set_should_run(false);
+
+    for (size_t j = 0; j < test_case->test_info_list().size(); j++) {
+      TestInfo* const test_info = test_case->test_info_list()[j];
+      const std::string test_name(test_info->name());
+      // A test is disabled if test case name or test name matches
+      // kDisableTestFilter.
+      const bool is_disabled =
+          internal::UnitTestOptions::MatchesFilter(test_case_name,
+                                                   kDisableTestFilter) ||
+          internal::UnitTestOptions::MatchesFilter(test_name,
+                                                   kDisableTestFilter);
+      test_info->is_disabled_ = is_disabled;
+
+      const bool matches_filter =
+          internal::UnitTestOptions::FilterMatchesTest(test_case_name,
+                                                       test_name);
+      test_info->matches_filter_ = matches_filter;
+
+      const bool is_runnable =
+          (GTEST_FLAG(also_run_disabled_tests) || !is_disabled) &&
+          matches_filter;
+
+      const bool is_selected = is_runnable &&
+          (shard_tests == IGNORE_SHARDING_PROTOCOL ||
+           ShouldRunTestOnShard(total_shards, shard_index,
+                                num_runnable_tests));
+
+      num_runnable_tests += is_runnable;
+      num_selected_tests += is_selected;
+
+      test_info->should_run_ = is_selected;
+      test_case->set_should_run(test_case->should_run() || is_selected);
+    }
+  }
+  return num_selected_tests;
+}
+
+// Prints the given C-string on a single line by replacing all '\n'
+// characters with string "\\n".  If the output takes more than
+// max_length characters, only prints the first max_length characters
+// and "...".
+static void PrintOnOneLine(const char* str, int max_length) {
+  if (str != NULL) {
+    for (int i = 0; *str != '\0'; ++str) {
+      if (i >= max_length) {
+        printf("...");
+        break;
+      }
+      if (*str == '\n') {
+        printf("\\n");
+        i += 2;
+      } else {
+        printf("%c", *str);
+        ++i;
+      }
+    }
+  }
+}
+
+// Prints the names of the tests matching the user-specified filter flag.
+void UnitTestImpl::ListTestsMatchingFilter() {
+  // Print at most this many characters for each type/value parameter.
+  const int kMaxParamLength = 250;
+
+  for (size_t i = 0; i < test_cases_.size(); i++) {
+    const TestCase* const test_case = test_cases_[i];
+    bool printed_test_case_name = false;
+
+    for (size_t j = 0; j < test_case->test_info_list().size(); j++) {
+      const TestInfo* const test_info =
+          test_case->test_info_list()[j];
+      if (test_info->matches_filter_) {
+        if (!printed_test_case_name) {
+          printed_test_case_name = true;
+          printf("%s.", test_case->name());
+          if (test_case->type_param() != NULL) {
+            printf("  # %s = ", kTypeParamLabel);
+            // We print the type parameter on a single line to make
+            // the output easy to parse by a program.
+            PrintOnOneLine(test_case->type_param(), kMaxParamLength);
+          }
+          printf("\n");
+        }
+        printf("  %s", test_info->name());
+        if (test_info->value_param() != NULL) {
+          printf("  # %s = ", kValueParamLabel);
+          // We print the value parameter on a single line to make the
+          // output easy to parse by a program.
+          PrintOnOneLine(test_info->value_param(), kMaxParamLength);
+        }
+        printf("\n");
+      }
+    }
+  }
+  fflush(stdout);
+}
+
+// Sets the OS stack trace getter.
+//
+// Does nothing if the input and the current OS stack trace getter are
+// the same; otherwise, deletes the old getter and makes the input the
+// current getter.
+void UnitTestImpl::set_os_stack_trace_getter(
+    OsStackTraceGetterInterface* getter) {
+  if (os_stack_trace_getter_ != getter) {
+    delete os_stack_trace_getter_;
+    os_stack_trace_getter_ = getter;
+  }
+}
+
+// Returns the current OS stack trace getter if it is not NULL;
+// otherwise, creates an OsStackTraceGetter, makes it the current
+// getter, and returns it.
+OsStackTraceGetterInterface* UnitTestImpl::os_stack_trace_getter() {
+  if (os_stack_trace_getter_ == NULL) {
+    os_stack_trace_getter_ = new OsStackTraceGetter;
+  }
+
+  return os_stack_trace_getter_;
+}
+
+// Returns the TestResult for the test that's currently running, or
+// the TestResult for the ad hoc test if no test is running.
+TestResult* UnitTestImpl::current_test_result() {
+  return current_test_info_ ?
+      &(current_test_info_->result_) : &ad_hoc_test_result_;
+}
+
+// Shuffles all test cases, and the tests within each test case,
+// making sure that death tests are still run first.
+void UnitTestImpl::ShuffleTests() {
+  // Shuffles the death test cases.
+  ShuffleRange(random(), 0, last_death_test_case_ + 1, &test_case_indices_);
+
+  // Shuffles the non-death test cases.
+  ShuffleRange(random(), last_death_test_case_ + 1,
+               static_cast<int>(test_cases_.size()), &test_case_indices_);
+
+  // Shuffles the tests inside each test case.
+  for (size_t i = 0; i < test_cases_.size(); i++) {
+    test_cases_[i]->ShuffleTests(random());
+  }
+}
+
+// Restores the test cases and tests to their order before the first shuffle.
+void UnitTestImpl::UnshuffleTests() {
+  for (size_t i = 0; i < test_cases_.size(); i++) {
+    // Unshuffles the tests in each test case.
+    test_cases_[i]->UnshuffleTests();
+    // Resets the index of each test case.
+    test_case_indices_[i] = static_cast<int>(i);
+  }
+}
+
+// Returns the current OS stack trace as an std::string.
+//
+// The maximum number of stack frames to be included is specified by
+// the gtest_stack_trace_depth flag.  The skip_count parameter
+// specifies the number of top frames to be skipped, which doesn't
+// count against the number of frames to be included.
+//
+// For example, if Foo() calls Bar(), which in turn calls
+// GetCurrentOsStackTraceExceptTop(..., 1), Foo() will be included in
+// the trace but Bar() and GetCurrentOsStackTraceExceptTop() won't.
+std::string GetCurrentOsStackTraceExceptTop(UnitTest* /*unit_test*/,
+                                            int skip_count) {
+  // We pass skip_count + 1 to skip this wrapper function in addition
+  // to what the user really wants to skip.
+  return GetUnitTestImpl()->CurrentOsStackTraceExceptTop(skip_count + 1);
+}
+
+// Used by the GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_ macro to
+// suppress unreachable code warnings.
+namespace {
+class ClassUniqueToAlwaysTrue {};
+}
+
+bool IsTrue(bool condition) { return condition; }
+
+bool AlwaysTrue() {
+#if GTEST_HAS_EXCEPTIONS
+  // This condition is always false so AlwaysTrue() never actually throws,
+  // but it makes the compiler think that it may throw.
+  if (IsTrue(false))
+    throw ClassUniqueToAlwaysTrue();
+#endif  // GTEST_HAS_EXCEPTIONS
+  return true;
+}
+
+// If *pstr starts with the given prefix, modifies *pstr to be right
+// past the prefix and returns true; otherwise leaves *pstr unchanged
+// and returns false.  None of pstr, *pstr, and prefix can be NULL.
+bool SkipPrefix(const char* prefix, const char** pstr) {
+  const size_t prefix_len = strlen(prefix);
+  if (strncmp(*pstr, prefix, prefix_len) == 0) {
+    *pstr += prefix_len;
+    return true;
+  }
+  return false;
+}
+
+// Parses a string as a command line flag.  The string should have
+// the format "--flag=value".  When def_optional is true, the "=value"
+// part can be omitted.
+//
+// Returns the value of the flag, or NULL if the parsing failed.
+const char* ParseFlagValue(const char* str,
+                           const char* flag,
+                           bool def_optional) {
+  // str and flag must not be NULL.
+  if (str == NULL || flag == NULL) return NULL;
+
+  // The flag must start with "--" followed by GTEST_FLAG_PREFIX_.
+  const std::string flag_str = std::string("--") + GTEST_FLAG_PREFIX_ + flag;
+  const size_t flag_len = flag_str.length();
+  if (strncmp(str, flag_str.c_str(), flag_len) != 0) return NULL;
+
+  // Skips the flag name.
+  const char* flag_end = str + flag_len;
+
+  // When def_optional is true, it's OK to not have a "=value" part.
+  if (def_optional && (flag_end[0] == '\0')) {
+    return flag_end;
+  }
+
+  // If def_optional is true and there are more characters after the
+  // flag name, or if def_optional is false, there must be a '=' after
+  // the flag name.
+  if (flag_end[0] != '=') return NULL;
+
+  // Returns the string after "=".
+  return flag_end + 1;
+}
+
+// Parses a string for a bool flag, in the form of either
+// "--flag=value" or "--flag".
+//
+// In the former case, the value is taken as true as long as it does
+// not start with '0', 'f', or 'F'.
+//
+// In the latter case, the value is taken as true.
+//
+// On success, stores the value of the flag in *value, and returns
+// true.  On failure, returns false without changing *value.
+bool ParseBoolFlag(const char* str, const char* flag, bool* value) {
+  // Gets the value of the flag as a string.
+  const char* const value_str = ParseFlagValue(str, flag, true);
+
+  // Aborts if the parsing failed.
+  if (value_str == NULL) return false;
+
+  // Converts the string value to a bool.
+  *value = !(*value_str == '0' || *value_str == 'f' || *value_str == 'F');
+  return true;
+}
+
+// Parses a string for an Int32 flag, in the form of
+// "--flag=value".
+//
+// On success, stores the value of the flag in *value, and returns
+// true.  On failure, returns false without changing *value.
+bool ParseInt32Flag(const char* str, const char* flag, Int32* value) {
+  // Gets the value of the flag as a string.
+  const char* const value_str = ParseFlagValue(str, flag, false);
+
+  // Aborts if the parsing failed.
+  if (value_str == NULL) return false;
+
+  // Sets *value to the value of the flag.
+  return ParseInt32(Message() << "The value of flag --" << flag,
+                    value_str, value);
+}
+
+// Parses a string for a string flag, in the form of
+// "--flag=value".
+//
+// On success, stores the value of the flag in *value, and returns
+// true.  On failure, returns false without changing *value.
+bool ParseStringFlag(const char* str, const char* flag, std::string* value) {
+  // Gets the value of the flag as a string.
+  const char* const value_str = ParseFlagValue(str, flag, false);
+
+  // Aborts if the parsing failed.
+  if (value_str == NULL) return false;
+
+  // Sets *value to the value of the flag.
+  *value = value_str;
+  return true;
+}
+
+// Determines whether a string has a prefix that Google Test uses for its
+// flags, i.e., starts with GTEST_FLAG_PREFIX_ or GTEST_FLAG_PREFIX_DASH_.
+// If Google Test detects that a command line flag has its prefix but is not
+// recognized, it will print its help message. Flags starting with
+// GTEST_INTERNAL_PREFIX_ followed by "internal_" are considered Google Test
+// internal flags and do not trigger the help message.
+static bool HasGoogleTestFlagPrefix(const char* str) {
+  return (SkipPrefix("--", &str) ||
+          SkipPrefix("-", &str) ||
+          SkipPrefix("/", &str)) &&
+         !SkipPrefix(GTEST_FLAG_PREFIX_ "internal_", &str) &&
+         (SkipPrefix(GTEST_FLAG_PREFIX_, &str) ||
+          SkipPrefix(GTEST_FLAG_PREFIX_DASH_, &str));
+}
+
+// Prints a string containing code-encoded text.  The following escape
+// sequences can be used in the string to control the text color:
+//
+//   @@    prints a single '@' character.
+//   @R    changes the color to red.
+//   @G    changes the color to green.
+//   @Y    changes the color to yellow.
+//   @D    changes to the default terminal text color.
+//
+// TODO(wan at google.com): Write tests for this once we add stdout
+// capturing to Google Test.
+static void PrintColorEncoded(const char* str) {
+  GTestColor color = COLOR_DEFAULT;  // The current color.
+
+  // Conceptually, we split the string into segments divided by escape
+  // sequences.  Then we print one segment at a time.  At the end of
+  // each iteration, the str pointer advances to the beginning of the
+  // next segment.
+  for (;;) {
+    const char* p = strchr(str, '@');
+    if (p == NULL) {
+      ColoredPrintf(color, "%s", str);
+      return;
+    }
+
+    ColoredPrintf(color, "%s", std::string(str, p).c_str());
+
+    const char ch = p[1];
+    str = p + 2;
+    if (ch == '@') {
+      ColoredPrintf(color, "@");
+    } else if (ch == 'D') {
+      color = COLOR_DEFAULT;
+    } else if (ch == 'R') {
+      color = COLOR_RED;
+    } else if (ch == 'G') {
+      color = COLOR_GREEN;
+    } else if (ch == 'Y') {
+      color = COLOR_YELLOW;
+    } else {
+      --str;
+    }
+  }
+}
+
+static const char kColorEncodedHelpMessage[] =
+"This program contains tests written using " GTEST_NAME_ ". You can use the\n"
+"following command line flags to control its behavior:\n"
+"\n"
+"Test Selection:\n"
+"  @G--" GTEST_FLAG_PREFIX_ "list_tests at D\n"
+"      List the names of all tests instead of running them. The name of\n"
+"      TEST(Foo, Bar) is \"Foo.Bar\".\n"
+"  @G--" GTEST_FLAG_PREFIX_ "filter=@YPOSTIVE_PATTERNS"
+    "[@G- at YNEGATIVE_PATTERNS]@D\n"
+"      Run only the tests whose name matches one of the positive patterns but\n"
+"      none of the negative patterns. '?' matches any single character; '*'\n"
+"      matches any substring; ':' separates two patterns.\n"
+"  @G--" GTEST_FLAG_PREFIX_ "also_run_disabled_tests at D\n"
+"      Run all disabled tests too.\n"
+"\n"
+"Test Execution:\n"
+"  @G--" GTEST_FLAG_PREFIX_ "repeat=@Y[COUNT]@D\n"
+"      Run the tests repeatedly; use a negative count to repeat forever.\n"
+"  @G--" GTEST_FLAG_PREFIX_ "shuffle at D\n"
+"      Randomize tests' orders on every iteration.\n"
+"  @G--" GTEST_FLAG_PREFIX_ "random_seed=@Y[NUMBER]@D\n"
+"      Random number seed to use for shuffling test orders (between 1 and\n"
+"      99999, or 0 to use a seed based on the current time).\n"
+"\n"
+"Test Output:\n"
+"  @G--" GTEST_FLAG_PREFIX_ "color=@Y(@Gyes at Y|@Gno at Y|@Gauto at Y)@D\n"
+"      Enable/disable colored output. The default is @Gauto at D.\n"
+"  - at G-" GTEST_FLAG_PREFIX_ "print_time=0 at D\n"
+"      Don't print the elapsed time of each test.\n"
+"  @G--" GTEST_FLAG_PREFIX_ "output=xml at Y[@G:@YDIRECTORY_PATH at G"
+    GTEST_PATH_SEP_ "@Y|@G:@YFILE_PATH]@D\n"
+"      Generate an XML report in the given directory or with the given file\n"
+"      name. @YFILE_PATH at D defaults to @Gtest_details.xml at D.\n"
+#if GTEST_CAN_STREAM_RESULTS_
+"  @G--" GTEST_FLAG_PREFIX_ "stream_result_to=@YHOST at G:@YPORT at D\n"
+"      Stream test results to the given server.\n"
+#endif  // GTEST_CAN_STREAM_RESULTS_
+"\n"
+"Assertion Behavior:\n"
+#if GTEST_HAS_DEATH_TEST && !GTEST_OS_WINDOWS
+"  @G--" GTEST_FLAG_PREFIX_ "death_test_style=@Y(@Gfast at Y|@Gthreadsafe at Y)@D\n"
+"      Set the default death test style.\n"
+#endif  // GTEST_HAS_DEATH_TEST && !GTEST_OS_WINDOWS
+"  @G--" GTEST_FLAG_PREFIX_ "break_on_failure at D\n"
+"      Turn assertion failures into debugger break-points.\n"
+"  @G--" GTEST_FLAG_PREFIX_ "throw_on_failure at D\n"
+"      Turn assertion failures into C++ exceptions.\n"
+"  @G--" GTEST_FLAG_PREFIX_ "catch_exceptions=0 at D\n"
+"      Do not report exceptions as test failures. Instead, allow them\n"
+"      to crash the program or throw a pop-up (on Windows).\n"
+"\n"
+"Except for @G--" GTEST_FLAG_PREFIX_ "list_tests at D, you can alternatively set "
+    "the corresponding\n"
+"environment variable of a flag (all letters in upper-case). For example, to\n"
+"disable colored text output, you can either specify @G--" GTEST_FLAG_PREFIX_
+    "color=no at D or set\n"
+"the @G" GTEST_FLAG_PREFIX_UPPER_ "COLOR at D environment variable to @Gno at D.\n"
+"\n"
+"For more information, please read the " GTEST_NAME_ " documentation at\n"
+"@G" GTEST_PROJECT_URL_ "@D. If you find a bug in " GTEST_NAME_ "\n"
+"(not one in your own code or tests), please report it to\n"
+"@G<" GTEST_DEV_EMAIL_ ">@D.\n";
+
+// Parses the command line for Google Test flags, without initializing
+// other parts of Google Test.  The type parameter CharType can be
+// instantiated to either char or wchar_t.
+template <typename CharType>
+void ParseGoogleTestFlagsOnlyImpl(int* argc, CharType** argv) {
+  for (int i = 1; i < *argc; i++) {
+    const std::string arg_string = StreamableToString(argv[i]);
+    const char* const arg = arg_string.c_str();
+
+    using internal::ParseBoolFlag;
+    using internal::ParseInt32Flag;
+    using internal::ParseStringFlag;
+
+    // Do we see a Google Test flag?
+    if (ParseBoolFlag(arg, kAlsoRunDisabledTestsFlag,
+                      &GTEST_FLAG(also_run_disabled_tests)) ||
+        ParseBoolFlag(arg, kBreakOnFailureFlag,
+                      &GTEST_FLAG(break_on_failure)) ||
+        ParseBoolFlag(arg, kCatchExceptionsFlag,
+                      &GTEST_FLAG(catch_exceptions)) ||
+        ParseStringFlag(arg, kColorFlag, &GTEST_FLAG(color)) ||
+        ParseStringFlag(arg, kDeathTestStyleFlag,
+                        &GTEST_FLAG(death_test_style)) ||
+        ParseBoolFlag(arg, kDeathTestUseFork,
+                      &GTEST_FLAG(death_test_use_fork)) ||
+        ParseStringFlag(arg, kFilterFlag, &GTEST_FLAG(filter)) ||
+        ParseStringFlag(arg, kInternalRunDeathTestFlag,
+                        &GTEST_FLAG(internal_run_death_test)) ||
+        ParseBoolFlag(arg, kListTestsFlag, &GTEST_FLAG(list_tests)) ||
+        ParseStringFlag(arg, kOutputFlag, &GTEST_FLAG(output)) ||
+        ParseBoolFlag(arg, kPrintTimeFlag, &GTEST_FLAG(print_time)) ||
+        ParseInt32Flag(arg, kRandomSeedFlag, &GTEST_FLAG(random_seed)) ||
+        ParseInt32Flag(arg, kRepeatFlag, &GTEST_FLAG(repeat)) ||
+        ParseBoolFlag(arg, kShuffleFlag, &GTEST_FLAG(shuffle)) ||
+        ParseInt32Flag(arg, kStackTraceDepthFlag,
+                       &GTEST_FLAG(stack_trace_depth)) ||
+        ParseStringFlag(arg, kStreamResultToFlag,
+                        &GTEST_FLAG(stream_result_to)) ||
+        ParseBoolFlag(arg, kThrowOnFailureFlag,
+                      &GTEST_FLAG(throw_on_failure))
+        ) {
+      // Yes.  Shift the remainder of the argv list left by one.  Note
+      // that argv has (*argc + 1) elements, the last one always being
+      // NULL.  The following loop moves the trailing NULL element as
+      // well.
+      for (int j = i; j != *argc; j++) {
+        argv[j] = argv[j + 1];
+      }
+
+      // Decrements the argument count.
+      (*argc)--;
+
+      // We also need to decrement the iterator as we just removed
+      // an element.
+      i--;
+    } else if (arg_string == "--help" || arg_string == "-h" ||
+               arg_string == "-?" || arg_string == "/?" ||
+               HasGoogleTestFlagPrefix(arg)) {
+      // Both help flag and unrecognized Google Test flags (excluding
+      // internal ones) trigger help display.
+      g_help_flag = true;
+    }
+  }
+
+  if (g_help_flag) {
+    // We print the help here instead of in RUN_ALL_TESTS(), as the
+    // latter may not be called at all if the user is using Google
+    // Test with another testing framework.
+    PrintColorEncoded(kColorEncodedHelpMessage);
+  }
+}
+
+// Parses the command line for Google Test flags, without initializing
+// other parts of Google Test.
+void ParseGoogleTestFlagsOnly(int* argc, char** argv) {
+  ParseGoogleTestFlagsOnlyImpl(argc, argv);
+}
+void ParseGoogleTestFlagsOnly(int* argc, wchar_t** argv) {
+  ParseGoogleTestFlagsOnlyImpl(argc, argv);
+}
+
+// The internal implementation of InitGoogleTest().
+//
+// The type parameter CharType can be instantiated to either char or
+// wchar_t.
+template <typename CharType>
+void InitGoogleTestImpl(int* argc, CharType** argv) {
+  g_init_gtest_count++;
+
+  // We don't want to run the initialization code twice.
+  if (g_init_gtest_count != 1) return;
+
+  if (*argc <= 0) return;
+
+  internal::g_executable_path = internal::StreamableToString(argv[0]);
+
+#if GTEST_HAS_DEATH_TEST
+
+  g_argvs.clear();
+  for (int i = 0; i != *argc; i++) {
+    g_argvs.push_back(StreamableToString(argv[i]));
+  }
+
+#endif  // GTEST_HAS_DEATH_TEST
+
+  ParseGoogleTestFlagsOnly(argc, argv);
+  GetUnitTestImpl()->PostFlagParsingInit();
+}
+
+}  // namespace internal
+
+// Initializes Google Test.  This must be called before calling
+// RUN_ALL_TESTS().  In particular, it parses a command line for the
+// flags that Google Test recognizes.  Whenever a Google Test flag is
+// seen, it is removed from argv, and *argc is decremented.
+//
+// No value is returned.  Instead, the Google Test flag variables are
+// updated.
+//
+// Calling the function for the second time has no user-visible effect.
+void InitGoogleTest(int* argc, char** argv) {
+  internal::InitGoogleTestImpl(argc, argv);
+}
+
+// This overloaded version can be used in Windows programs compiled in
+// UNICODE mode.
+void InitGoogleTest(int* argc, wchar_t** argv) {
+  internal::InitGoogleTestImpl(argc, argv);
+}
+
+}  // namespace testing
diff --git a/contrib/gtest-1.7.0/src/gtest_main.cc b/contrib/gtest-1.7.0/src/gtest_main.cc
new file mode 100644
index 0000000..f302822
--- /dev/null
+++ b/contrib/gtest-1.7.0/src/gtest_main.cc
@@ -0,0 +1,38 @@
+// Copyright 2006, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#include <stdio.h>
+
+#include "gtest/gtest.h"
+
+GTEST_API_ int main(int argc, char **argv) {
+  printf("Running main() from gtest_main.cc\n");
+  testing::InitGoogleTest(&argc, argv);
+  return RUN_ALL_TESTS();
+}
diff --git a/contrib/gtest-1.7.0/test/gtest-death-test_ex_test.cc b/contrib/gtest-1.7.0/test/gtest-death-test_ex_test.cc
new file mode 100644
index 0000000..b50a13d
--- /dev/null
+++ b/contrib/gtest-1.7.0/test/gtest-death-test_ex_test.cc
@@ -0,0 +1,93 @@
+// Copyright 2010, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: vladl at google.com (Vlad Losev)
+//
+// Tests that verify interaction of exceptions and death tests.
+
+#include "gtest/gtest-death-test.h"
+#include "gtest/gtest.h"
+
+#if GTEST_HAS_DEATH_TEST
+
+# if GTEST_HAS_SEH
+#  include <windows.h>          // For RaiseException().
+# endif
+
+# include "gtest/gtest-spi.h"
+
+# if GTEST_HAS_EXCEPTIONS
+
+#  include <exception>  // For std::exception.
+
+// Tests that death tests report thrown exceptions as failures and that the
+// exceptions do not escape death test macros.
+TEST(CxxExceptionDeathTest, ExceptionIsFailure) {
+  try {
+    EXPECT_NONFATAL_FAILURE(EXPECT_DEATH(throw 1, ""), "threw an exception");
+  } catch (...) {  // NOLINT
+    FAIL() << "An exception escaped a death test macro invocation "
+           << "with catch_exceptions "
+           << (testing::GTEST_FLAG(catch_exceptions) ? "enabled" : "disabled");
+  }
+}
+
+class TestException : public std::exception {
+ public:
+  virtual const char* what() const throw() { return "exceptional message"; }
+};
+
+TEST(CxxExceptionDeathTest, PrintsMessageForStdExceptions) {
+  // Verifies that the exception message is quoted in the failure text.
+  EXPECT_NONFATAL_FAILURE(EXPECT_DEATH(throw TestException(), ""),
+                          "exceptional message");
+  // Verifies that the location is mentioned in the failure text.
+  EXPECT_NONFATAL_FAILURE(EXPECT_DEATH(throw TestException(), ""),
+                          "gtest-death-test_ex_test.cc");
+}
+# endif  // GTEST_HAS_EXCEPTIONS
+
+# if GTEST_HAS_SEH
+// Tests that enabling interception of SEH exceptions with the
+// catch_exceptions flag does not interfere with SEH exceptions being
+// treated as death by death tests.
+TEST(SehExceptionDeasTest, CatchExceptionsDoesNotInterfere) {
+  EXPECT_DEATH(RaiseException(42, 0x0, 0, NULL), "")
+      << "with catch_exceptions "
+      << (testing::GTEST_FLAG(catch_exceptions) ? "enabled" : "disabled");
+}
+# endif
+
+#endif  // GTEST_HAS_DEATH_TEST
+
+int main(int argc, char** argv) {
+  testing::InitGoogleTest(&argc, argv);
+  testing::GTEST_FLAG(catch_exceptions) = GTEST_ENABLE_CATCH_EXCEPTIONS_ != 0;
+  return RUN_ALL_TESTS();
+}
diff --git a/contrib/gtest-1.7.0/test/gtest-death-test_test.cc b/contrib/gtest-1.7.0/test/gtest-death-test_test.cc
new file mode 100644
index 0000000..c2d26df
--- /dev/null
+++ b/contrib/gtest-1.7.0/test/gtest-death-test_test.cc
@@ -0,0 +1,1367 @@
+// Copyright 2005, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+//
+// Tests for death tests.
+
+#include "gtest/gtest-death-test.h"
+#include "gtest/gtest.h"
+#include "gtest/internal/gtest-filepath.h"
+
+using testing::internal::AlwaysFalse;
+using testing::internal::AlwaysTrue;
+
+#if GTEST_HAS_DEATH_TEST
+
+# if GTEST_OS_WINDOWS
+#  include <direct.h>          // For chdir().
+# else
+#  include <unistd.h>
+#  include <sys/wait.h>        // For waitpid.
+# endif  // GTEST_OS_WINDOWS
+
+# include <limits.h>
+# include <signal.h>
+# include <stdio.h>
+
+# if GTEST_OS_LINUX
+#  include <sys/time.h>
+# endif  // GTEST_OS_LINUX
+
+# include "gtest/gtest-spi.h"
+
+// Indicates that this translation unit is part of Google Test's
+// implementation.  It must come before gtest-internal-inl.h is
+// included, or there will be a compiler error.  This trick is to
+// prevent a user from accidentally including gtest-internal-inl.h in
+// his code.
+# define GTEST_IMPLEMENTATION_ 1
+# include "src/gtest-internal-inl.h"
+# undef GTEST_IMPLEMENTATION_
+
+namespace posix = ::testing::internal::posix;
+
+using testing::Message;
+using testing::internal::DeathTest;
+using testing::internal::DeathTestFactory;
+using testing::internal::FilePath;
+using testing::internal::GetLastErrnoDescription;
+using testing::internal::GetUnitTestImpl;
+using testing::internal::InDeathTestChild;
+using testing::internal::ParseNaturalNumber;
+
+namespace testing {
+namespace internal {
+
+// A helper class whose objects replace the death test factory for a
+// single UnitTest object during their lifetimes.
+class ReplaceDeathTestFactory {
+ public:
+  explicit ReplaceDeathTestFactory(DeathTestFactory* new_factory)
+      : unit_test_impl_(GetUnitTestImpl()) {
+    old_factory_ = unit_test_impl_->death_test_factory_.release();
+    unit_test_impl_->death_test_factory_.reset(new_factory);
+  }
+
+  ~ReplaceDeathTestFactory() {
+    unit_test_impl_->death_test_factory_.release();
+    unit_test_impl_->death_test_factory_.reset(old_factory_);
+  }
+ private:
+  // Prevents copying ReplaceDeathTestFactory objects.
+  ReplaceDeathTestFactory(const ReplaceDeathTestFactory&);
+  void operator=(const ReplaceDeathTestFactory&);
+
+  UnitTestImpl* unit_test_impl_;
+  DeathTestFactory* old_factory_;
+};
+
+}  // namespace internal
+}  // namespace testing
+
+void DieWithMessage(const ::std::string& message) {
+  fprintf(stderr, "%s", message.c_str());
+  fflush(stderr);  // Make sure the text is printed before the process exits.
+
+  // We call _exit() instead of exit(), as the former is a direct
+  // system call and thus safer in the presence of threads.  exit()
+  // will invoke user-defined exit-hooks, which may do dangerous
+  // things that conflict with death tests.
+  //
+  // Some compilers can recognize that _exit() never returns and issue the
+  // 'unreachable code' warning for code following this function, unless
+  // fooled by a fake condition.
+  if (AlwaysTrue())
+    _exit(1);
+}
+
+void DieInside(const ::std::string& function) {
+  DieWithMessage("death inside " + function + "().");
+}
+
+// Tests that death tests work.
+
+class TestForDeathTest : public testing::Test {
+ protected:
+  TestForDeathTest() : original_dir_(FilePath::GetCurrentDir()) {}
+
+  virtual ~TestForDeathTest() {
+    posix::ChDir(original_dir_.c_str());
+  }
+
+  // A static member function that's expected to die.
+  static void StaticMemberFunction() { DieInside("StaticMemberFunction"); }
+
+  // A method of the test fixture that may die.
+  void MemberFunction() {
+    if (should_die_)
+      DieInside("MemberFunction");
+  }
+
+  // True iff MemberFunction() should die.
+  bool should_die_;
+  const FilePath original_dir_;
+};
+
+// A class with a member function that may die.
+class MayDie {
+ public:
+  explicit MayDie(bool should_die) : should_die_(should_die) {}
+
+  // A member function that may die.
+  void MemberFunction() const {
+    if (should_die_)
+      DieInside("MayDie::MemberFunction");
+  }
+
+ private:
+  // True iff MemberFunction() should die.
+  bool should_die_;
+};
+
+// A global function that's expected to die.
+void GlobalFunction() { DieInside("GlobalFunction"); }
+
+// A non-void function that's expected to die.
+int NonVoidFunction() {
+  DieInside("NonVoidFunction");
+  return 1;
+}
+
+// A unary function that may die.
+void DieIf(bool should_die) {
+  if (should_die)
+    DieInside("DieIf");
+}
+
+// A binary function that may die.
+bool DieIfLessThan(int x, int y) {
+  if (x < y) {
+    DieInside("DieIfLessThan");
+  }
+  return true;
+}
+
+// Tests that ASSERT_DEATH can be used outside a TEST, TEST_F, or test fixture.
+void DeathTestSubroutine() {
+  EXPECT_DEATH(GlobalFunction(), "death.*GlobalFunction");
+  ASSERT_DEATH(GlobalFunction(), "death.*GlobalFunction");
+}
+
+// Death in dbg, not opt.
+int DieInDebugElse12(int* sideeffect) {
+  if (sideeffect) *sideeffect = 12;
+
+# ifndef NDEBUG
+
+  DieInside("DieInDebugElse12");
+
+# endif  // NDEBUG
+
+  return 12;
+}
+
+# if GTEST_OS_WINDOWS
+
+// Tests the ExitedWithCode predicate.
+TEST(ExitStatusPredicateTest, ExitedWithCode) {
+  // On Windows, the process's exit code is the same as its exit status,
+  // so the predicate just compares the its input with its parameter.
+  EXPECT_TRUE(testing::ExitedWithCode(0)(0));
+  EXPECT_TRUE(testing::ExitedWithCode(1)(1));
+  EXPECT_TRUE(testing::ExitedWithCode(42)(42));
+  EXPECT_FALSE(testing::ExitedWithCode(0)(1));
+  EXPECT_FALSE(testing::ExitedWithCode(1)(0));
+}
+
+# else
+
+// Returns the exit status of a process that calls _exit(2) with a
+// given exit code.  This is a helper function for the
+// ExitStatusPredicateTest test suite.
+static int NormalExitStatus(int exit_code) {
+  pid_t child_pid = fork();
+  if (child_pid == 0) {
+    _exit(exit_code);
+  }
+  int status;
+  waitpid(child_pid, &status, 0);
+  return status;
+}
+
+// Returns the exit status of a process that raises a given signal.
+// If the signal does not cause the process to die, then it returns
+// instead the exit status of a process that exits normally with exit
+// code 1.  This is a helper function for the ExitStatusPredicateTest
+// test suite.
+static int KilledExitStatus(int signum) {
+  pid_t child_pid = fork();
+  if (child_pid == 0) {
+    raise(signum);
+    _exit(1);
+  }
+  int status;
+  waitpid(child_pid, &status, 0);
+  return status;
+}
+
+// Tests the ExitedWithCode predicate.
+TEST(ExitStatusPredicateTest, ExitedWithCode) {
+  const int status0  = NormalExitStatus(0);
+  const int status1  = NormalExitStatus(1);
+  const int status42 = NormalExitStatus(42);
+  const testing::ExitedWithCode pred0(0);
+  const testing::ExitedWithCode pred1(1);
+  const testing::ExitedWithCode pred42(42);
+  EXPECT_PRED1(pred0,  status0);
+  EXPECT_PRED1(pred1,  status1);
+  EXPECT_PRED1(pred42, status42);
+  EXPECT_FALSE(pred0(status1));
+  EXPECT_FALSE(pred42(status0));
+  EXPECT_FALSE(pred1(status42));
+}
+
+// Tests the KilledBySignal predicate.
+TEST(ExitStatusPredicateTest, KilledBySignal) {
+  const int status_segv = KilledExitStatus(SIGSEGV);
+  const int status_kill = KilledExitStatus(SIGKILL);
+  const testing::KilledBySignal pred_segv(SIGSEGV);
+  const testing::KilledBySignal pred_kill(SIGKILL);
+  EXPECT_PRED1(pred_segv, status_segv);
+  EXPECT_PRED1(pred_kill, status_kill);
+  EXPECT_FALSE(pred_segv(status_kill));
+  EXPECT_FALSE(pred_kill(status_segv));
+}
+
+# endif  // GTEST_OS_WINDOWS
+
+// Tests that the death test macros expand to code which may or may not
+// be followed by operator<<, and that in either case the complete text
+// comprises only a single C++ statement.
+TEST_F(TestForDeathTest, SingleStatement) {
+  if (AlwaysFalse())
+    // This would fail if executed; this is a compilation test only
+    ASSERT_DEATH(return, "");
+
+  if (AlwaysTrue())
+    EXPECT_DEATH(_exit(1), "");
+  else
+    // This empty "else" branch is meant to ensure that EXPECT_DEATH
+    // doesn't expand into an "if" statement without an "else"
+    ;
+
+  if (AlwaysFalse())
+    ASSERT_DEATH(return, "") << "did not die";
+
+  if (AlwaysFalse())
+    ;
+  else
+    EXPECT_DEATH(_exit(1), "") << 1 << 2 << 3;
+}
+
+void DieWithEmbeddedNul() {
+  fprintf(stderr, "Hello%cmy null world.\n", '\0');
+  fflush(stderr);
+  _exit(1);
+}
+
+# if GTEST_USES_PCRE
+// Tests that EXPECT_DEATH and ASSERT_DEATH work when the error
+// message has a NUL character in it.
+TEST_F(TestForDeathTest, EmbeddedNulInMessage) {
+  // TODO(wan at google.com): <regex.h> doesn't support matching strings
+  // with embedded NUL characters - find a way to workaround it.
+  EXPECT_DEATH(DieWithEmbeddedNul(), "my null world");
+  ASSERT_DEATH(DieWithEmbeddedNul(), "my null world");
+}
+# endif  // GTEST_USES_PCRE
+
+// Tests that death test macros expand to code which interacts well with switch
+// statements.
+TEST_F(TestForDeathTest, SwitchStatement) {
+// Microsoft compiler usually complains about switch statements without
+// case labels. We suppress that warning for this test.
+# ifdef _MSC_VER
+#  pragma warning(push)
+#  pragma warning(disable: 4065)
+# endif  // _MSC_VER
+
+  switch (0)
+    default:
+      ASSERT_DEATH(_exit(1), "") << "exit in default switch handler";
+
+  switch (0)
+    case 0:
+      EXPECT_DEATH(_exit(1), "") << "exit in switch case";
+
+# ifdef _MSC_VER
+#  pragma warning(pop)
+# endif  // _MSC_VER
+}
+
+// Tests that a static member function can be used in a "fast" style
+// death test.
+TEST_F(TestForDeathTest, StaticMemberFunctionFastStyle) {
+  testing::GTEST_FLAG(death_test_style) = "fast";
+  ASSERT_DEATH(StaticMemberFunction(), "death.*StaticMember");
+}
+
+// Tests that a method of the test fixture can be used in a "fast"
+// style death test.
+TEST_F(TestForDeathTest, MemberFunctionFastStyle) {
+  testing::GTEST_FLAG(death_test_style) = "fast";
+  should_die_ = true;
+  EXPECT_DEATH(MemberFunction(), "inside.*MemberFunction");
+}
+
+void ChangeToRootDir() { posix::ChDir(GTEST_PATH_SEP_); }
+
+// Tests that death tests work even if the current directory has been
+// changed.
+TEST_F(TestForDeathTest, FastDeathTestInChangedDir) {
+  testing::GTEST_FLAG(death_test_style) = "fast";
+
+  ChangeToRootDir();
+  EXPECT_EXIT(_exit(1), testing::ExitedWithCode(1), "");
+
+  ChangeToRootDir();
+  ASSERT_DEATH(_exit(1), "");
+}
+
+# if GTEST_OS_LINUX
+void SigprofAction(int, siginfo_t*, void*) { /* no op */ }
+
+// Sets SIGPROF action and ITIMER_PROF timer (interval: 1ms).
+void SetSigprofActionAndTimer() {
+  struct itimerval timer;
+  timer.it_interval.tv_sec = 0;
+  timer.it_interval.tv_usec = 1;
+  timer.it_value = timer.it_interval;
+  ASSERT_EQ(0, setitimer(ITIMER_PROF, &timer, NULL));
+  struct sigaction signal_action;
+  memset(&signal_action, 0, sizeof(signal_action));
+  sigemptyset(&signal_action.sa_mask);
+  signal_action.sa_sigaction = SigprofAction;
+  signal_action.sa_flags = SA_RESTART | SA_SIGINFO;
+  ASSERT_EQ(0, sigaction(SIGPROF, &signal_action, NULL));
+}
+
+// Disables ITIMER_PROF timer and ignores SIGPROF signal.
+void DisableSigprofActionAndTimer(struct sigaction* old_signal_action) {
+  struct itimerval timer;
+  timer.it_interval.tv_sec = 0;
+  timer.it_interval.tv_usec = 0;
+  timer.it_value = timer.it_interval;
+  ASSERT_EQ(0, setitimer(ITIMER_PROF, &timer, NULL));
+  struct sigaction signal_action;
+  memset(&signal_action, 0, sizeof(signal_action));
+  sigemptyset(&signal_action.sa_mask);
+  signal_action.sa_handler = SIG_IGN;
+  ASSERT_EQ(0, sigaction(SIGPROF, &signal_action, old_signal_action));
+}
+
+// Tests that death tests work when SIGPROF handler and timer are set.
+TEST_F(TestForDeathTest, FastSigprofActionSet) {
+  testing::GTEST_FLAG(death_test_style) = "fast";
+  SetSigprofActionAndTimer();
+  EXPECT_DEATH(_exit(1), "");
+  struct sigaction old_signal_action;
+  DisableSigprofActionAndTimer(&old_signal_action);
+  EXPECT_TRUE(old_signal_action.sa_sigaction == SigprofAction);
+}
+
+TEST_F(TestForDeathTest, ThreadSafeSigprofActionSet) {
+  testing::GTEST_FLAG(death_test_style) = "threadsafe";
+  SetSigprofActionAndTimer();
+  EXPECT_DEATH(_exit(1), "");
+  struct sigaction old_signal_action;
+  DisableSigprofActionAndTimer(&old_signal_action);
+  EXPECT_TRUE(old_signal_action.sa_sigaction == SigprofAction);
+}
+# endif  // GTEST_OS_LINUX
+
+// Repeats a representative sample of death tests in the "threadsafe" style:
+
+TEST_F(TestForDeathTest, StaticMemberFunctionThreadsafeStyle) {
+  testing::GTEST_FLAG(death_test_style) = "threadsafe";
+  ASSERT_DEATH(StaticMemberFunction(), "death.*StaticMember");
+}
+
+TEST_F(TestForDeathTest, MemberFunctionThreadsafeStyle) {
+  testing::GTEST_FLAG(death_test_style) = "threadsafe";
+  should_die_ = true;
+  EXPECT_DEATH(MemberFunction(), "inside.*MemberFunction");
+}
+
+TEST_F(TestForDeathTest, ThreadsafeDeathTestInLoop) {
+  testing::GTEST_FLAG(death_test_style) = "threadsafe";
+
+  for (int i = 0; i < 3; ++i)
+    EXPECT_EXIT(_exit(i), testing::ExitedWithCode(i), "") << ": i = " << i;
+}
+
+TEST_F(TestForDeathTest, ThreadsafeDeathTestInChangedDir) {
+  testing::GTEST_FLAG(death_test_style) = "threadsafe";
+
+  ChangeToRootDir();
+  EXPECT_EXIT(_exit(1), testing::ExitedWithCode(1), "");
+
+  ChangeToRootDir();
+  ASSERT_DEATH(_exit(1), "");
+}
+
+TEST_F(TestForDeathTest, MixedStyles) {
+  testing::GTEST_FLAG(death_test_style) = "threadsafe";
+  EXPECT_DEATH(_exit(1), "");
+  testing::GTEST_FLAG(death_test_style) = "fast";
+  EXPECT_DEATH(_exit(1), "");
+}
+
+# if GTEST_HAS_CLONE && GTEST_HAS_PTHREAD
+
+namespace {
+
+bool pthread_flag;
+
+void SetPthreadFlag() {
+  pthread_flag = true;
+}
+
+}  // namespace
+
+TEST_F(TestForDeathTest, DoesNotExecuteAtforkHooks) {
+  if (!testing::GTEST_FLAG(death_test_use_fork)) {
+    testing::GTEST_FLAG(death_test_style) = "threadsafe";
+    pthread_flag = false;
+    ASSERT_EQ(0, pthread_atfork(&SetPthreadFlag, NULL, NULL));
+    ASSERT_DEATH(_exit(1), "");
+    ASSERT_FALSE(pthread_flag);
+  }
+}
+
+# endif  // GTEST_HAS_CLONE && GTEST_HAS_PTHREAD
+
+// Tests that a method of another class can be used in a death test.
+TEST_F(TestForDeathTest, MethodOfAnotherClass) {
+  const MayDie x(true);
+  ASSERT_DEATH(x.MemberFunction(), "MayDie\\:\\:MemberFunction");
+}
+
+// Tests that a global function can be used in a death test.
+TEST_F(TestForDeathTest, GlobalFunction) {
+  EXPECT_DEATH(GlobalFunction(), "GlobalFunction");
+}
+
+// Tests that any value convertible to an RE works as a second
+// argument to EXPECT_DEATH.
+TEST_F(TestForDeathTest, AcceptsAnythingConvertibleToRE) {
+  static const char regex_c_str[] = "GlobalFunction";
+  EXPECT_DEATH(GlobalFunction(), regex_c_str);
+
+  const testing::internal::RE regex(regex_c_str);
+  EXPECT_DEATH(GlobalFunction(), regex);
+
+# if GTEST_HAS_GLOBAL_STRING
+
+  const string regex_str(regex_c_str);
+  EXPECT_DEATH(GlobalFunction(), regex_str);
+
+# endif  // GTEST_HAS_GLOBAL_STRING
+
+  const ::std::string regex_std_str(regex_c_str);
+  EXPECT_DEATH(GlobalFunction(), regex_std_str);
+}
+
+// Tests that a non-void function can be used in a death test.
+TEST_F(TestForDeathTest, NonVoidFunction) {
+  ASSERT_DEATH(NonVoidFunction(), "NonVoidFunction");
+}
+
+// Tests that functions that take parameter(s) can be used in a death test.
+TEST_F(TestForDeathTest, FunctionWithParameter) {
+  EXPECT_DEATH(DieIf(true), "DieIf\\(\\)");
+  EXPECT_DEATH(DieIfLessThan(2, 3), "DieIfLessThan");
+}
+
+// Tests that ASSERT_DEATH can be used outside a TEST, TEST_F, or test fixture.
+TEST_F(TestForDeathTest, OutsideFixture) {
+  DeathTestSubroutine();
+}
+
+// Tests that death tests can be done inside a loop.
+TEST_F(TestForDeathTest, InsideLoop) {
+  for (int i = 0; i < 5; i++) {
+    EXPECT_DEATH(DieIfLessThan(-1, i), "DieIfLessThan") << "where i == " << i;
+  }
+}
+
+// Tests that a compound statement can be used in a death test.
+TEST_F(TestForDeathTest, CompoundStatement) {
+  EXPECT_DEATH({  // NOLINT
+    const int x = 2;
+    const int y = x + 1;
+    DieIfLessThan(x, y);
+  },
+  "DieIfLessThan");
+}
+
+// Tests that code that doesn't die causes a death test to fail.
+TEST_F(TestForDeathTest, DoesNotDie) {
+  EXPECT_NONFATAL_FAILURE(EXPECT_DEATH(DieIf(false), "DieIf"),
+                          "failed to die");
+}
+
+// Tests that a death test fails when the error message isn't expected.
+TEST_F(TestForDeathTest, ErrorMessageMismatch) {
+  EXPECT_NONFATAL_FAILURE({  // NOLINT
+    EXPECT_DEATH(DieIf(true), "DieIfLessThan") << "End of death test message.";
+  }, "died but not with expected error");
+}
+
+// On exit, *aborted will be true iff the EXPECT_DEATH() statement
+// aborted the function.
+void ExpectDeathTestHelper(bool* aborted) {
+  *aborted = true;
+  EXPECT_DEATH(DieIf(false), "DieIf");  // This assertion should fail.
+  *aborted = false;
+}
+
+// Tests that EXPECT_DEATH doesn't abort the test on failure.
+TEST_F(TestForDeathTest, EXPECT_DEATH) {
+  bool aborted = true;
+  EXPECT_NONFATAL_FAILURE(ExpectDeathTestHelper(&aborted),
+                          "failed to die");
+  EXPECT_FALSE(aborted);
+}
+
+// Tests that ASSERT_DEATH does abort the test on failure.
+TEST_F(TestForDeathTest, ASSERT_DEATH) {
+  static bool aborted;
+  EXPECT_FATAL_FAILURE({  // NOLINT
+    aborted = true;
+    ASSERT_DEATH(DieIf(false), "DieIf");  // This assertion should fail.
+    aborted = false;
+  }, "failed to die");
+  EXPECT_TRUE(aborted);
+}
+
+// Tests that EXPECT_DEATH evaluates the arguments exactly once.
+TEST_F(TestForDeathTest, SingleEvaluation) {
+  int x = 3;
+  EXPECT_DEATH(DieIf((++x) == 4), "DieIf");
+
+  const char* regex = "DieIf";
+  const char* regex_save = regex;
+  EXPECT_DEATH(DieIfLessThan(3, 4), regex++);
+  EXPECT_EQ(regex_save + 1, regex);
+}
+
+// Tests that run-away death tests are reported as failures.
+TEST_F(TestForDeathTest, RunawayIsFailure) {
+  EXPECT_NONFATAL_FAILURE(EXPECT_DEATH(static_cast<void>(0), "Foo"),
+                          "failed to die.");
+}
+
+// Tests that death tests report executing 'return' in the statement as
+// failure.
+TEST_F(TestForDeathTest, ReturnIsFailure) {
+  EXPECT_FATAL_FAILURE(ASSERT_DEATH(return, "Bar"),
+                       "illegal return in test statement.");
+}
+
+// Tests that EXPECT_DEBUG_DEATH works as expected, that is, you can stream a
+// message to it, and in debug mode it:
+// 1. Asserts on death.
+// 2. Has no side effect.
+//
+// And in opt mode, it:
+// 1.  Has side effects but does not assert.
+TEST_F(TestForDeathTest, TestExpectDebugDeath) {
+  int sideeffect = 0;
+
+  EXPECT_DEBUG_DEATH(DieInDebugElse12(&sideeffect), "death.*DieInDebugElse12")
+      << "Must accept a streamed message";
+
+# ifdef NDEBUG
+
+  // Checks that the assignment occurs in opt mode (sideeffect).
+  EXPECT_EQ(12, sideeffect);
+
+# else
+
+  // Checks that the assignment does not occur in dbg mode (no sideeffect).
+  EXPECT_EQ(0, sideeffect);
+
+# endif
+}
+
+// Tests that ASSERT_DEBUG_DEATH works as expected, that is, you can stream a
+// message to it, and in debug mode it:
+// 1. Asserts on death.
+// 2. Has no side effect.
+//
+// And in opt mode, it:
+// 1.  Has side effects but does not assert.
+TEST_F(TestForDeathTest, TestAssertDebugDeath) {
+  int sideeffect = 0;
+
+  ASSERT_DEBUG_DEATH(DieInDebugElse12(&sideeffect), "death.*DieInDebugElse12")
+      << "Must accept a streamed message";
+
+# ifdef NDEBUG
+
+  // Checks that the assignment occurs in opt mode (sideeffect).
+  EXPECT_EQ(12, sideeffect);
+
+# else
+
+  // Checks that the assignment does not occur in dbg mode (no sideeffect).
+  EXPECT_EQ(0, sideeffect);
+
+# endif
+}
+
+# ifndef NDEBUG
+
+void ExpectDebugDeathHelper(bool* aborted) {
+  *aborted = true;
+  EXPECT_DEBUG_DEATH(return, "") << "This is expected to fail.";
+  *aborted = false;
+}
+
+#  if GTEST_OS_WINDOWS
+TEST(PopUpDeathTest, DoesNotShowPopUpOnAbort) {
+  printf("This test should be considered failing if it shows "
+         "any pop-up dialogs.\n");
+  fflush(stdout);
+
+  EXPECT_DEATH({
+    testing::GTEST_FLAG(catch_exceptions) = false;
+    abort();
+  }, "");
+}
+#  endif  // GTEST_OS_WINDOWS
+
+// Tests that EXPECT_DEBUG_DEATH in debug mode does not abort
+// the function.
+TEST_F(TestForDeathTest, ExpectDebugDeathDoesNotAbort) {
+  bool aborted = true;
+  EXPECT_NONFATAL_FAILURE(ExpectDebugDeathHelper(&aborted), "");
+  EXPECT_FALSE(aborted);
+}
+
+void AssertDebugDeathHelper(bool* aborted) {
+  *aborted = true;
+  ASSERT_DEBUG_DEATH(return, "") << "This is expected to fail.";
+  *aborted = false;
+}
+
+// Tests that ASSERT_DEBUG_DEATH in debug mode aborts the function on
+// failure.
+TEST_F(TestForDeathTest, AssertDebugDeathAborts) {
+  static bool aborted;
+  aborted = false;
+  EXPECT_FATAL_FAILURE(AssertDebugDeathHelper(&aborted), "");
+  EXPECT_TRUE(aborted);
+}
+
+# endif  // _NDEBUG
+
+// Tests the *_EXIT family of macros, using a variety of predicates.
+static void TestExitMacros() {
+  EXPECT_EXIT(_exit(1),  testing::ExitedWithCode(1),  "");
+  ASSERT_EXIT(_exit(42), testing::ExitedWithCode(42), "");
+
+# if GTEST_OS_WINDOWS
+
+  // Of all signals effects on the process exit code, only those of SIGABRT
+  // are documented on Windows.
+  // See http://msdn.microsoft.com/en-us/library/dwwzkt4c(VS.71).aspx.
+  EXPECT_EXIT(raise(SIGABRT), testing::ExitedWithCode(3), "") << "b_ar";
+
+# else
+
+  EXPECT_EXIT(raise(SIGKILL), testing::KilledBySignal(SIGKILL), "") << "foo";
+  ASSERT_EXIT(raise(SIGUSR2), testing::KilledBySignal(SIGUSR2), "") << "bar";
+
+  EXPECT_FATAL_FAILURE({  // NOLINT
+    ASSERT_EXIT(_exit(0), testing::KilledBySignal(SIGSEGV), "")
+      << "This failure is expected, too.";
+  }, "This failure is expected, too.");
+
+# endif  // GTEST_OS_WINDOWS
+
+  EXPECT_NONFATAL_FAILURE({  // NOLINT
+    EXPECT_EXIT(raise(SIGSEGV), testing::ExitedWithCode(0), "")
+      << "This failure is expected.";
+  }, "This failure is expected.");
+}
+
+TEST_F(TestForDeathTest, ExitMacros) {
+  TestExitMacros();
+}
+
+TEST_F(TestForDeathTest, ExitMacrosUsingFork) {
+  testing::GTEST_FLAG(death_test_use_fork) = true;
+  TestExitMacros();
+}
+
+TEST_F(TestForDeathTest, InvalidStyle) {
+  testing::GTEST_FLAG(death_test_style) = "rococo";
+  EXPECT_NONFATAL_FAILURE({  // NOLINT
+    EXPECT_DEATH(_exit(0), "") << "This failure is expected.";
+  }, "This failure is expected.");
+}
+
+TEST_F(TestForDeathTest, DeathTestFailedOutput) {
+  testing::GTEST_FLAG(death_test_style) = "fast";
+  EXPECT_NONFATAL_FAILURE(
+      EXPECT_DEATH(DieWithMessage("death\n"),
+                   "expected message"),
+      "Actual msg:\n"
+      "[  DEATH   ] death\n");
+}
+
+TEST_F(TestForDeathTest, DeathTestUnexpectedReturnOutput) {
+  testing::GTEST_FLAG(death_test_style) = "fast";
+  EXPECT_NONFATAL_FAILURE(
+      EXPECT_DEATH({
+          fprintf(stderr, "returning\n");
+          fflush(stderr);
+          return;
+        }, ""),
+      "    Result: illegal return in test statement.\n"
+      " Error msg:\n"
+      "[  DEATH   ] returning\n");
+}
+
+TEST_F(TestForDeathTest, DeathTestBadExitCodeOutput) {
+  testing::GTEST_FLAG(death_test_style) = "fast";
+  EXPECT_NONFATAL_FAILURE(
+      EXPECT_EXIT(DieWithMessage("exiting with rc 1\n"),
+                  testing::ExitedWithCode(3),
+                  "expected message"),
+      "    Result: died but not with expected exit code:\n"
+      "            Exited with exit status 1\n"
+      "Actual msg:\n"
+      "[  DEATH   ] exiting with rc 1\n");
+}
+
+TEST_F(TestForDeathTest, DeathTestMultiLineMatchFail) {
+  testing::GTEST_FLAG(death_test_style) = "fast";
+  EXPECT_NONFATAL_FAILURE(
+      EXPECT_DEATH(DieWithMessage("line 1\nline 2\nline 3\n"),
+                   "line 1\nxyz\nline 3\n"),
+      "Actual msg:\n"
+      "[  DEATH   ] line 1\n"
+      "[  DEATH   ] line 2\n"
+      "[  DEATH   ] line 3\n");
+}
+
+TEST_F(TestForDeathTest, DeathTestMultiLineMatchPass) {
+  testing::GTEST_FLAG(death_test_style) = "fast";
+  EXPECT_DEATH(DieWithMessage("line 1\nline 2\nline 3\n"),
+               "line 1\nline 2\nline 3\n");
+}
+
+// A DeathTestFactory that returns MockDeathTests.
+class MockDeathTestFactory : public DeathTestFactory {
+ public:
+  MockDeathTestFactory();
+  virtual bool Create(const char* statement,
+                      const ::testing::internal::RE* regex,
+                      const char* file, int line, DeathTest** test);
+
+  // Sets the parameters for subsequent calls to Create.
+  void SetParameters(bool create, DeathTest::TestRole role,
+                     int status, bool passed);
+
+  // Accessors.
+  int AssumeRoleCalls() const { return assume_role_calls_; }
+  int WaitCalls() const { return wait_calls_; }
+  int PassedCalls() const { return passed_args_.size(); }
+  bool PassedArgument(int n) const { return passed_args_[n]; }
+  int AbortCalls() const { return abort_args_.size(); }
+  DeathTest::AbortReason AbortArgument(int n) const {
+    return abort_args_[n];
+  }
+  bool TestDeleted() const { return test_deleted_; }
+
+ private:
+  friend class MockDeathTest;
+  // If true, Create will return a MockDeathTest; otherwise it returns
+  // NULL.
+  bool create_;
+  // The value a MockDeathTest will return from its AssumeRole method.
+  DeathTest::TestRole role_;
+  // The value a MockDeathTest will return from its Wait method.
+  int status_;
+  // The value a MockDeathTest will return from its Passed method.
+  bool passed_;
+
+  // Number of times AssumeRole was called.
+  int assume_role_calls_;
+  // Number of times Wait was called.
+  int wait_calls_;
+  // The arguments to the calls to Passed since the last call to
+  // SetParameters.
+  std::vector<bool> passed_args_;
+  // The arguments to the calls to Abort since the last call to
+  // SetParameters.
+  std::vector<DeathTest::AbortReason> abort_args_;
+  // True if the last MockDeathTest returned by Create has been
+  // deleted.
+  bool test_deleted_;
+};
+
+
+// A DeathTest implementation useful in testing.  It returns values set
+// at its creation from its various inherited DeathTest methods, and
+// reports calls to those methods to its parent MockDeathTestFactory
+// object.
+class MockDeathTest : public DeathTest {
+ public:
+  MockDeathTest(MockDeathTestFactory *parent,
+                TestRole role, int status, bool passed) :
+      parent_(parent), role_(role), status_(status), passed_(passed) {
+  }
+  virtual ~MockDeathTest() {
+    parent_->test_deleted_ = true;
+  }
+  virtual TestRole AssumeRole() {
+    ++parent_->assume_role_calls_;
+    return role_;
+  }
+  virtual int Wait() {
+    ++parent_->wait_calls_;
+    return status_;
+  }
+  virtual bool Passed(bool exit_status_ok) {
+    parent_->passed_args_.push_back(exit_status_ok);
+    return passed_;
+  }
+  virtual void Abort(AbortReason reason) {
+    parent_->abort_args_.push_back(reason);
+  }
+
+ private:
+  MockDeathTestFactory* const parent_;
+  const TestRole role_;
+  const int status_;
+  const bool passed_;
+};
+
+
+// MockDeathTestFactory constructor.
+MockDeathTestFactory::MockDeathTestFactory()
+    : create_(true),
+      role_(DeathTest::OVERSEE_TEST),
+      status_(0),
+      passed_(true),
+      assume_role_calls_(0),
+      wait_calls_(0),
+      passed_args_(),
+      abort_args_() {
+}
+
+
+// Sets the parameters for subsequent calls to Create.
+void MockDeathTestFactory::SetParameters(bool create,
+                                         DeathTest::TestRole role,
+                                         int status, bool passed) {
+  create_ = create;
+  role_ = role;
+  status_ = status;
+  passed_ = passed;
+
+  assume_role_calls_ = 0;
+  wait_calls_ = 0;
+  passed_args_.clear();
+  abort_args_.clear();
+}
+
+
+// Sets test to NULL (if create_ is false) or to the address of a new
+// MockDeathTest object with parameters taken from the last call
+// to SetParameters (if create_ is true).  Always returns true.
+bool MockDeathTestFactory::Create(const char* /*statement*/,
+                                  const ::testing::internal::RE* /*regex*/,
+                                  const char* /*file*/,
+                                  int /*line*/,
+                                  DeathTest** test) {
+  test_deleted_ = false;
+  if (create_) {
+    *test = new MockDeathTest(this, role_, status_, passed_);
+  } else {
+    *test = NULL;
+  }
+  return true;
+}
+
+// A test fixture for testing the logic of the GTEST_DEATH_TEST_ macro.
+// It installs a MockDeathTestFactory that is used for the duration
+// of the test case.
+class MacroLogicDeathTest : public testing::Test {
+ protected:
+  static testing::internal::ReplaceDeathTestFactory* replacer_;
+  static MockDeathTestFactory* factory_;
+
+  static void SetUpTestCase() {
+    factory_ = new MockDeathTestFactory;
+    replacer_ = new testing::internal::ReplaceDeathTestFactory(factory_);
+  }
+
+  static void TearDownTestCase() {
+    delete replacer_;
+    replacer_ = NULL;
+    delete factory_;
+    factory_ = NULL;
+  }
+
+  // Runs a death test that breaks the rules by returning.  Such a death
+  // test cannot be run directly from a test routine that uses a
+  // MockDeathTest, or the remainder of the routine will not be executed.
+  static void RunReturningDeathTest(bool* flag) {
+    ASSERT_DEATH({  // NOLINT
+      *flag = true;
+      return;
+    }, "");
+  }
+};
+
+testing::internal::ReplaceDeathTestFactory* MacroLogicDeathTest::replacer_
+    = NULL;
+MockDeathTestFactory* MacroLogicDeathTest::factory_ = NULL;
+
+
+// Test that nothing happens when the factory doesn't return a DeathTest:
+TEST_F(MacroLogicDeathTest, NothingHappens) {
+  bool flag = false;
+  factory_->SetParameters(false, DeathTest::OVERSEE_TEST, 0, true);
+  EXPECT_DEATH(flag = true, "");
+  EXPECT_FALSE(flag);
+  EXPECT_EQ(0, factory_->AssumeRoleCalls());
+  EXPECT_EQ(0, factory_->WaitCalls());
+  EXPECT_EQ(0, factory_->PassedCalls());
+  EXPECT_EQ(0, factory_->AbortCalls());
+  EXPECT_FALSE(factory_->TestDeleted());
+}
+
+// Test that the parent process doesn't run the death test code,
+// and that the Passed method returns false when the (simulated)
+// child process exits with status 0:
+TEST_F(MacroLogicDeathTest, ChildExitsSuccessfully) {
+  bool flag = false;
+  factory_->SetParameters(true, DeathTest::OVERSEE_TEST, 0, true);
+  EXPECT_DEATH(flag = true, "");
+  EXPECT_FALSE(flag);
+  EXPECT_EQ(1, factory_->AssumeRoleCalls());
+  EXPECT_EQ(1, factory_->WaitCalls());
+  ASSERT_EQ(1, factory_->PassedCalls());
+  EXPECT_FALSE(factory_->PassedArgument(0));
+  EXPECT_EQ(0, factory_->AbortCalls());
+  EXPECT_TRUE(factory_->TestDeleted());
+}
+
+// Tests that the Passed method was given the argument "true" when
+// the (simulated) child process exits with status 1:
+TEST_F(MacroLogicDeathTest, ChildExitsUnsuccessfully) {
+  bool flag = false;
+  factory_->SetParameters(true, DeathTest::OVERSEE_TEST, 1, true);
+  EXPECT_DEATH(flag = true, "");
+  EXPECT_FALSE(flag);
+  EXPECT_EQ(1, factory_->AssumeRoleCalls());
+  EXPECT_EQ(1, factory_->WaitCalls());
+  ASSERT_EQ(1, factory_->PassedCalls());
+  EXPECT_TRUE(factory_->PassedArgument(0));
+  EXPECT_EQ(0, factory_->AbortCalls());
+  EXPECT_TRUE(factory_->TestDeleted());
+}
+
+// Tests that the (simulated) child process executes the death test
+// code, and is aborted with the correct AbortReason if it
+// executes a return statement.
+TEST_F(MacroLogicDeathTest, ChildPerformsReturn) {
+  bool flag = false;
+  factory_->SetParameters(true, DeathTest::EXECUTE_TEST, 0, true);
+  RunReturningDeathTest(&flag);
+  EXPECT_TRUE(flag);
+  EXPECT_EQ(1, factory_->AssumeRoleCalls());
+  EXPECT_EQ(0, factory_->WaitCalls());
+  EXPECT_EQ(0, factory_->PassedCalls());
+  EXPECT_EQ(1, factory_->AbortCalls());
+  EXPECT_EQ(DeathTest::TEST_ENCOUNTERED_RETURN_STATEMENT,
+            factory_->AbortArgument(0));
+  EXPECT_TRUE(factory_->TestDeleted());
+}
+
+// Tests that the (simulated) child process is aborted with the
+// correct AbortReason if it does not die.
+TEST_F(MacroLogicDeathTest, ChildDoesNotDie) {
+  bool flag = false;
+  factory_->SetParameters(true, DeathTest::EXECUTE_TEST, 0, true);
+  EXPECT_DEATH(flag = true, "");
+  EXPECT_TRUE(flag);
+  EXPECT_EQ(1, factory_->AssumeRoleCalls());
+  EXPECT_EQ(0, factory_->WaitCalls());
+  EXPECT_EQ(0, factory_->PassedCalls());
+  // This time there are two calls to Abort: one since the test didn't
+  // die, and another from the ReturnSentinel when it's destroyed.  The
+  // sentinel normally isn't destroyed if a test doesn't die, since
+  // _exit(2) is called in that case by ForkingDeathTest, but not by
+  // our MockDeathTest.
+  ASSERT_EQ(2, factory_->AbortCalls());
+  EXPECT_EQ(DeathTest::TEST_DID_NOT_DIE,
+            factory_->AbortArgument(0));
+  EXPECT_EQ(DeathTest::TEST_ENCOUNTERED_RETURN_STATEMENT,
+            factory_->AbortArgument(1));
+  EXPECT_TRUE(factory_->TestDeleted());
+}
+
+// Tests that a successful death test does not register a successful
+// test part.
+TEST(SuccessRegistrationDeathTest, NoSuccessPart) {
+  EXPECT_DEATH(_exit(1), "");
+  EXPECT_EQ(0, GetUnitTestImpl()->current_test_result()->total_part_count());
+}
+
+TEST(StreamingAssertionsDeathTest, DeathTest) {
+  EXPECT_DEATH(_exit(1), "") << "unexpected failure";
+  ASSERT_DEATH(_exit(1), "") << "unexpected failure";
+  EXPECT_NONFATAL_FAILURE({  // NOLINT
+    EXPECT_DEATH(_exit(0), "") << "expected failure";
+  }, "expected failure");
+  EXPECT_FATAL_FAILURE({  // NOLINT
+    ASSERT_DEATH(_exit(0), "") << "expected failure";
+  }, "expected failure");
+}
+
+// Tests that GetLastErrnoDescription returns an empty string when the
+// last error is 0 and non-empty string when it is non-zero.
+TEST(GetLastErrnoDescription, GetLastErrnoDescriptionWorks) {
+  errno = ENOENT;
+  EXPECT_STRNE("", GetLastErrnoDescription().c_str());
+  errno = 0;
+  EXPECT_STREQ("", GetLastErrnoDescription().c_str());
+}
+
+# if GTEST_OS_WINDOWS
+TEST(AutoHandleTest, AutoHandleWorks) {
+  HANDLE handle = ::CreateEvent(NULL, FALSE, FALSE, NULL);
+  ASSERT_NE(INVALID_HANDLE_VALUE, handle);
+
+  // Tests that the AutoHandle is correctly initialized with a handle.
+  testing::internal::AutoHandle auto_handle(handle);
+  EXPECT_EQ(handle, auto_handle.Get());
+
+  // Tests that Reset assigns INVALID_HANDLE_VALUE.
+  // Note that this cannot verify whether the original handle is closed.
+  auto_handle.Reset();
+  EXPECT_EQ(INVALID_HANDLE_VALUE, auto_handle.Get());
+
+  // Tests that Reset assigns the new handle.
+  // Note that this cannot verify whether the original handle is closed.
+  handle = ::CreateEvent(NULL, FALSE, FALSE, NULL);
+  ASSERT_NE(INVALID_HANDLE_VALUE, handle);
+  auto_handle.Reset(handle);
+  EXPECT_EQ(handle, auto_handle.Get());
+
+  // Tests that AutoHandle contains INVALID_HANDLE_VALUE by default.
+  testing::internal::AutoHandle auto_handle2;
+  EXPECT_EQ(INVALID_HANDLE_VALUE, auto_handle2.Get());
+}
+# endif  // GTEST_OS_WINDOWS
+
+# if GTEST_OS_WINDOWS
+typedef unsigned __int64 BiggestParsable;
+typedef signed __int64 BiggestSignedParsable;
+# else
+typedef unsigned long long BiggestParsable;
+typedef signed long long BiggestSignedParsable;
+# endif  // GTEST_OS_WINDOWS
+
+// We cannot use std::numeric_limits<T>::max() as it clashes with the
+// max() macro defined by <windows.h>.
+const BiggestParsable kBiggestParsableMax = ULLONG_MAX;
+const BiggestSignedParsable kBiggestSignedParsableMax = LLONG_MAX;
+
+TEST(ParseNaturalNumberTest, RejectsInvalidFormat) {
+  BiggestParsable result = 0;
+
+  // Rejects non-numbers.
+  EXPECT_FALSE(ParseNaturalNumber("non-number string", &result));
+
+  // Rejects numbers with whitespace prefix.
+  EXPECT_FALSE(ParseNaturalNumber(" 123", &result));
+
+  // Rejects negative numbers.
+  EXPECT_FALSE(ParseNaturalNumber("-123", &result));
+
+  // Rejects numbers starting with a plus sign.
+  EXPECT_FALSE(ParseNaturalNumber("+123", &result));
+  errno = 0;
+}
+
+TEST(ParseNaturalNumberTest, RejectsOverflownNumbers) {
+  BiggestParsable result = 0;
+
+  EXPECT_FALSE(ParseNaturalNumber("99999999999999999999999", &result));
+
+  signed char char_result = 0;
+  EXPECT_FALSE(ParseNaturalNumber("200", &char_result));
+  errno = 0;
+}
+
+TEST(ParseNaturalNumberTest, AcceptsValidNumbers) {
+  BiggestParsable result = 0;
+
+  result = 0;
+  ASSERT_TRUE(ParseNaturalNumber("123", &result));
+  EXPECT_EQ(123U, result);
+
+  // Check 0 as an edge case.
+  result = 1;
+  ASSERT_TRUE(ParseNaturalNumber("0", &result));
+  EXPECT_EQ(0U, result);
+
+  result = 1;
+  ASSERT_TRUE(ParseNaturalNumber("00000", &result));
+  EXPECT_EQ(0U, result);
+}
+
+TEST(ParseNaturalNumberTest, AcceptsTypeLimits) {
+  Message msg;
+  msg << kBiggestParsableMax;
+
+  BiggestParsable result = 0;
+  EXPECT_TRUE(ParseNaturalNumber(msg.GetString(), &result));
+  EXPECT_EQ(kBiggestParsableMax, result);
+
+  Message msg2;
+  msg2 << kBiggestSignedParsableMax;
+
+  BiggestSignedParsable signed_result = 0;
+  EXPECT_TRUE(ParseNaturalNumber(msg2.GetString(), &signed_result));
+  EXPECT_EQ(kBiggestSignedParsableMax, signed_result);
+
+  Message msg3;
+  msg3 << INT_MAX;
+
+  int int_result = 0;
+  EXPECT_TRUE(ParseNaturalNumber(msg3.GetString(), &int_result));
+  EXPECT_EQ(INT_MAX, int_result);
+
+  Message msg4;
+  msg4 << UINT_MAX;
+
+  unsigned int uint_result = 0;
+  EXPECT_TRUE(ParseNaturalNumber(msg4.GetString(), &uint_result));
+  EXPECT_EQ(UINT_MAX, uint_result);
+}
+
+TEST(ParseNaturalNumberTest, WorksForShorterIntegers) {
+  short short_result = 0;
+  ASSERT_TRUE(ParseNaturalNumber("123", &short_result));
+  EXPECT_EQ(123, short_result);
+
+  signed char char_result = 0;
+  ASSERT_TRUE(ParseNaturalNumber("123", &char_result));
+  EXPECT_EQ(123, char_result);
+}
+
+# if GTEST_OS_WINDOWS
+TEST(EnvironmentTest, HandleFitsIntoSizeT) {
+  // TODO(vladl at google.com): Remove this test after this condition is verified
+  // in a static assertion in gtest-death-test.cc in the function
+  // GetStatusFileDescriptor.
+  ASSERT_TRUE(sizeof(HANDLE) <= sizeof(size_t));
+}
+# endif  // GTEST_OS_WINDOWS
+
+// Tests that EXPECT_DEATH_IF_SUPPORTED/ASSERT_DEATH_IF_SUPPORTED trigger
+// failures when death tests are available on the system.
+TEST(ConditionalDeathMacrosDeathTest, ExpectsDeathWhenDeathTestsAvailable) {
+  EXPECT_DEATH_IF_SUPPORTED(DieInside("CondDeathTestExpectMacro"),
+                            "death inside CondDeathTestExpectMacro");
+  ASSERT_DEATH_IF_SUPPORTED(DieInside("CondDeathTestAssertMacro"),
+                            "death inside CondDeathTestAssertMacro");
+
+  // Empty statement will not crash, which must trigger a failure.
+  EXPECT_NONFATAL_FAILURE(EXPECT_DEATH_IF_SUPPORTED(;, ""), "");
+  EXPECT_FATAL_FAILURE(ASSERT_DEATH_IF_SUPPORTED(;, ""), "");
+}
+
+#else
+
+using testing::internal::CaptureStderr;
+using testing::internal::GetCapturedStderr;
+
+// Tests that EXPECT_DEATH_IF_SUPPORTED/ASSERT_DEATH_IF_SUPPORTED are still
+// defined but do not trigger failures when death tests are not available on
+// the system.
+TEST(ConditionalDeathMacrosTest, WarnsWhenDeathTestsNotAvailable) {
+  // Empty statement will not crash, but that should not trigger a failure
+  // when death tests are not supported.
+  CaptureStderr();
+  EXPECT_DEATH_IF_SUPPORTED(;, "");
+  std::string output = GetCapturedStderr();
+  ASSERT_TRUE(NULL != strstr(output.c_str(),
+                             "Death tests are not supported on this platform"));
+  ASSERT_TRUE(NULL != strstr(output.c_str(), ";"));
+
+  // The streamed message should not be printed as there is no test failure.
+  CaptureStderr();
+  EXPECT_DEATH_IF_SUPPORTED(;, "") << "streamed message";
+  output = GetCapturedStderr();
+  ASSERT_TRUE(NULL == strstr(output.c_str(), "streamed message"));
+
+  CaptureStderr();
+  ASSERT_DEATH_IF_SUPPORTED(;, "");  // NOLINT
+  output = GetCapturedStderr();
+  ASSERT_TRUE(NULL != strstr(output.c_str(),
+                             "Death tests are not supported on this platform"));
+  ASSERT_TRUE(NULL != strstr(output.c_str(), ";"));
+
+  CaptureStderr();
+  ASSERT_DEATH_IF_SUPPORTED(;, "") << "streamed message";  // NOLINT
+  output = GetCapturedStderr();
+  ASSERT_TRUE(NULL == strstr(output.c_str(), "streamed message"));
+}
+
+void FuncWithAssert(int* n) {
+  ASSERT_DEATH_IF_SUPPORTED(return;, "");
+  (*n)++;
+}
+
+// Tests that ASSERT_DEATH_IF_SUPPORTED does not return from the current
+// function (as ASSERT_DEATH does) if death tests are not supported.
+TEST(ConditionalDeathMacrosTest, AssertDeatDoesNotReturnhIfUnsupported) {
+  int n = 0;
+  FuncWithAssert(&n);
+  EXPECT_EQ(1, n);
+}
+
+TEST(InDeathTestChildDeathTest, ReportsDeathTestCorrectlyInFastStyle) {
+  testing::GTEST_FLAG(death_test_style) = "fast";
+  EXPECT_FALSE(InDeathTestChild());
+  EXPECT_DEATH({
+    fprintf(stderr, InDeathTestChild() ? "Inside" : "Outside");
+    fflush(stderr);
+    _exit(1);
+  }, "Inside");
+}
+
+TEST(InDeathTestChildDeathTest, ReportsDeathTestCorrectlyInThreadSafeStyle) {
+  testing::GTEST_FLAG(death_test_style) = "threadsafe";
+  EXPECT_FALSE(InDeathTestChild());
+  EXPECT_DEATH({
+    fprintf(stderr, InDeathTestChild() ? "Inside" : "Outside");
+    fflush(stderr);
+    _exit(1);
+  }, "Inside");
+}
+
+#endif  // GTEST_HAS_DEATH_TEST
+
+// Tests that the death test macros expand to code which may or may not
+// be followed by operator<<, and that in either case the complete text
+// comprises only a single C++ statement.
+//
+// The syntax should work whether death tests are available or not.
+TEST(ConditionalDeathMacrosSyntaxDeathTest, SingleStatement) {
+  if (AlwaysFalse())
+    // This would fail if executed; this is a compilation test only
+    ASSERT_DEATH_IF_SUPPORTED(return, "");
+
+  if (AlwaysTrue())
+    EXPECT_DEATH_IF_SUPPORTED(_exit(1), "");
+  else
+    // This empty "else" branch is meant to ensure that EXPECT_DEATH
+    // doesn't expand into an "if" statement without an "else"
+    ;  // NOLINT
+
+  if (AlwaysFalse())
+    ASSERT_DEATH_IF_SUPPORTED(return, "") << "did not die";
+
+  if (AlwaysFalse())
+    ;  // NOLINT
+  else
+    EXPECT_DEATH_IF_SUPPORTED(_exit(1), "") << 1 << 2 << 3;
+}
+
+// Tests that conditional death test macros expand to code which interacts
+// well with switch statements.
+TEST(ConditionalDeathMacrosSyntaxDeathTest, SwitchStatement) {
+// Microsoft compiler usually complains about switch statements without
+// case labels. We suppress that warning for this test.
+#ifdef _MSC_VER
+# pragma warning(push)
+# pragma warning(disable: 4065)
+#endif  // _MSC_VER
+
+  switch (0)
+    default:
+      ASSERT_DEATH_IF_SUPPORTED(_exit(1), "")
+          << "exit in default switch handler";
+
+  switch (0)
+    case 0:
+      EXPECT_DEATH_IF_SUPPORTED(_exit(1), "") << "exit in switch case";
+
+#ifdef _MSC_VER
+# pragma warning(pop)
+#endif  // _MSC_VER
+}
+
+// Tests that a test case whose name ends with "DeathTest" works fine
+// on Windows.
+TEST(NotADeathTest, Test) {
+  SUCCEED();
+}
diff --git a/contrib/gtest-1.7.0/test/gtest-filepath_test.cc b/contrib/gtest-1.7.0/test/gtest-filepath_test.cc
new file mode 100644
index 0000000..ae9f55a
--- /dev/null
+++ b/contrib/gtest-1.7.0/test/gtest-filepath_test.cc
@@ -0,0 +1,680 @@
+// Copyright 2008, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Authors: keith.ray at gmail.com (Keith Ray)
+//
+// Google Test filepath utilities
+//
+// This file tests classes and functions used internally by
+// Google Test.  They are subject to change without notice.
+//
+// This file is #included from gtest_unittest.cc, to avoid changing
+// build or make-files for some existing Google Test clients. Do not
+// #include this file anywhere else!
+
+#include "gtest/internal/gtest-filepath.h"
+#include "gtest/gtest.h"
+
+// Indicates that this translation unit is part of Google Test's
+// implementation.  It must come before gtest-internal-inl.h is
+// included, or there will be a compiler error.  This trick is to
+// prevent a user from accidentally including gtest-internal-inl.h in
+// his code.
+#define GTEST_IMPLEMENTATION_ 1
+#include "src/gtest-internal-inl.h"
+#undef GTEST_IMPLEMENTATION_
+
+#if GTEST_OS_WINDOWS_MOBILE
+# include <windows.h>  // NOLINT
+#elif GTEST_OS_WINDOWS
+# include <direct.h>  // NOLINT
+#endif  // GTEST_OS_WINDOWS_MOBILE
+
+namespace testing {
+namespace internal {
+namespace {
+
+#if GTEST_OS_WINDOWS_MOBILE
+// TODO(wan at google.com): Move these to the POSIX adapter section in
+// gtest-port.h.
+
+// Windows CE doesn't have the remove C function.
+int remove(const char* path) {
+  LPCWSTR wpath = String::AnsiToUtf16(path);
+  int ret = DeleteFile(wpath) ? 0 : -1;
+  delete [] wpath;
+  return ret;
+}
+// Windows CE doesn't have the _rmdir C function.
+int _rmdir(const char* path) {
+  FilePath filepath(path);
+  LPCWSTR wpath = String::AnsiToUtf16(
+      filepath.RemoveTrailingPathSeparator().c_str());
+  int ret = RemoveDirectory(wpath) ? 0 : -1;
+  delete [] wpath;
+  return ret;
+}
+
+#else
+
+TEST(GetCurrentDirTest, ReturnsCurrentDir) {
+  const FilePath original_dir = FilePath::GetCurrentDir();
+  EXPECT_FALSE(original_dir.IsEmpty());
+
+  posix::ChDir(GTEST_PATH_SEP_);
+  const FilePath cwd = FilePath::GetCurrentDir();
+  posix::ChDir(original_dir.c_str());
+
+# if GTEST_OS_WINDOWS
+
+  // Skips the ":".
+  const char* const cwd_without_drive = strchr(cwd.c_str(), ':');
+  ASSERT_TRUE(cwd_without_drive != NULL);
+  EXPECT_STREQ(GTEST_PATH_SEP_, cwd_without_drive + 1);
+
+# else
+
+  EXPECT_EQ(GTEST_PATH_SEP_, cwd.string());
+
+# endif
+}
+
+#endif  // GTEST_OS_WINDOWS_MOBILE
+
+TEST(IsEmptyTest, ReturnsTrueForEmptyPath) {
+  EXPECT_TRUE(FilePath("").IsEmpty());
+}
+
+TEST(IsEmptyTest, ReturnsFalseForNonEmptyPath) {
+  EXPECT_FALSE(FilePath("a").IsEmpty());
+  EXPECT_FALSE(FilePath(".").IsEmpty());
+  EXPECT_FALSE(FilePath("a/b").IsEmpty());
+  EXPECT_FALSE(FilePath("a\\b\\").IsEmpty());
+}
+
+// RemoveDirectoryName "" -> ""
+TEST(RemoveDirectoryNameTest, WhenEmptyName) {
+  EXPECT_EQ("", FilePath("").RemoveDirectoryName().string());
+}
+
+// RemoveDirectoryName "afile" -> "afile"
+TEST(RemoveDirectoryNameTest, ButNoDirectory) {
+  EXPECT_EQ("afile",
+      FilePath("afile").RemoveDirectoryName().string());
+}
+
+// RemoveDirectoryName "/afile" -> "afile"
+TEST(RemoveDirectoryNameTest, RootFileShouldGiveFileName) {
+  EXPECT_EQ("afile",
+      FilePath(GTEST_PATH_SEP_ "afile").RemoveDirectoryName().string());
+}
+
+// RemoveDirectoryName "adir/" -> ""
+TEST(RemoveDirectoryNameTest, WhereThereIsNoFileName) {
+  EXPECT_EQ("",
+      FilePath("adir" GTEST_PATH_SEP_).RemoveDirectoryName().string());
+}
+
+// RemoveDirectoryName "adir/afile" -> "afile"
+TEST(RemoveDirectoryNameTest, ShouldGiveFileName) {
+  EXPECT_EQ("afile",
+      FilePath("adir" GTEST_PATH_SEP_ "afile").RemoveDirectoryName().string());
+}
+
+// RemoveDirectoryName "adir/subdir/afile" -> "afile"
+TEST(RemoveDirectoryNameTest, ShouldAlsoGiveFileName) {
+  EXPECT_EQ("afile",
+      FilePath("adir" GTEST_PATH_SEP_ "subdir" GTEST_PATH_SEP_ "afile")
+      .RemoveDirectoryName().string());
+}
+
+#if GTEST_HAS_ALT_PATH_SEP_
+
+// Tests that RemoveDirectoryName() works with the alternate separator
+// on Windows.
+
+// RemoveDirectoryName("/afile") -> "afile"
+TEST(RemoveDirectoryNameTest, RootFileShouldGiveFileNameForAlternateSeparator) {
+  EXPECT_EQ("afile", FilePath("/afile").RemoveDirectoryName().string());
+}
+
+// RemoveDirectoryName("adir/") -> ""
+TEST(RemoveDirectoryNameTest, WhereThereIsNoFileNameForAlternateSeparator) {
+  EXPECT_EQ("", FilePath("adir/").RemoveDirectoryName().string());
+}
+
+// RemoveDirectoryName("adir/afile") -> "afile"
+TEST(RemoveDirectoryNameTest, ShouldGiveFileNameForAlternateSeparator) {
+  EXPECT_EQ("afile", FilePath("adir/afile").RemoveDirectoryName().string());
+}
+
+// RemoveDirectoryName("adir/subdir/afile") -> "afile"
+TEST(RemoveDirectoryNameTest, ShouldAlsoGiveFileNameForAlternateSeparator) {
+  EXPECT_EQ("afile",
+            FilePath("adir/subdir/afile").RemoveDirectoryName().string());
+}
+
+#endif
+
+// RemoveFileName "" -> "./"
+TEST(RemoveFileNameTest, EmptyName) {
+#if GTEST_OS_WINDOWS_MOBILE
+  // On Windows CE, we use the root as the current directory.
+  EXPECT_EQ(GTEST_PATH_SEP_, FilePath("").RemoveFileName().string());
+#else
+  EXPECT_EQ("." GTEST_PATH_SEP_, FilePath("").RemoveFileName().string());
+#endif
+}
+
+// RemoveFileName "adir/" -> "adir/"
+TEST(RemoveFileNameTest, ButNoFile) {
+  EXPECT_EQ("adir" GTEST_PATH_SEP_,
+      FilePath("adir" GTEST_PATH_SEP_).RemoveFileName().string());
+}
+
+// RemoveFileName "adir/afile" -> "adir/"
+TEST(RemoveFileNameTest, GivesDirName) {
+  EXPECT_EQ("adir" GTEST_PATH_SEP_,
+            FilePath("adir" GTEST_PATH_SEP_ "afile").RemoveFileName().string());
+}
+
+// RemoveFileName "adir/subdir/afile" -> "adir/subdir/"
+TEST(RemoveFileNameTest, GivesDirAndSubDirName) {
+  EXPECT_EQ("adir" GTEST_PATH_SEP_ "subdir" GTEST_PATH_SEP_,
+      FilePath("adir" GTEST_PATH_SEP_ "subdir" GTEST_PATH_SEP_ "afile")
+      .RemoveFileName().string());
+}
+
+// RemoveFileName "/afile" -> "/"
+TEST(RemoveFileNameTest, GivesRootDir) {
+  EXPECT_EQ(GTEST_PATH_SEP_,
+      FilePath(GTEST_PATH_SEP_ "afile").RemoveFileName().string());
+}
+
+#if GTEST_HAS_ALT_PATH_SEP_
+
+// Tests that RemoveFileName() works with the alternate separator on
+// Windows.
+
+// RemoveFileName("adir/") -> "adir/"
+TEST(RemoveFileNameTest, ButNoFileForAlternateSeparator) {
+  EXPECT_EQ("adir" GTEST_PATH_SEP_,
+            FilePath("adir/").RemoveFileName().string());
+}
+
+// RemoveFileName("adir/afile") -> "adir/"
+TEST(RemoveFileNameTest, GivesDirNameForAlternateSeparator) {
+  EXPECT_EQ("adir" GTEST_PATH_SEP_,
+            FilePath("adir/afile").RemoveFileName().string());
+}
+
+// RemoveFileName("adir/subdir/afile") -> "adir/subdir/"
+TEST(RemoveFileNameTest, GivesDirAndSubDirNameForAlternateSeparator) {
+  EXPECT_EQ("adir" GTEST_PATH_SEP_ "subdir" GTEST_PATH_SEP_,
+            FilePath("adir/subdir/afile").RemoveFileName().string());
+}
+
+// RemoveFileName("/afile") -> "\"
+TEST(RemoveFileNameTest, GivesRootDirForAlternateSeparator) {
+  EXPECT_EQ(GTEST_PATH_SEP_, FilePath("/afile").RemoveFileName().string());
+}
+
+#endif
+
+TEST(MakeFileNameTest, GenerateWhenNumberIsZero) {
+  FilePath actual = FilePath::MakeFileName(FilePath("foo"), FilePath("bar"),
+      0, "xml");
+  EXPECT_EQ("foo" GTEST_PATH_SEP_ "bar.xml", actual.string());
+}
+
+TEST(MakeFileNameTest, GenerateFileNameNumberGtZero) {
+  FilePath actual = FilePath::MakeFileName(FilePath("foo"), FilePath("bar"),
+      12, "xml");
+  EXPECT_EQ("foo" GTEST_PATH_SEP_ "bar_12.xml", actual.string());
+}
+
+TEST(MakeFileNameTest, GenerateFileNameWithSlashNumberIsZero) {
+  FilePath actual = FilePath::MakeFileName(FilePath("foo" GTEST_PATH_SEP_),
+      FilePath("bar"), 0, "xml");
+  EXPECT_EQ("foo" GTEST_PATH_SEP_ "bar.xml", actual.string());
+}
+
+TEST(MakeFileNameTest, GenerateFileNameWithSlashNumberGtZero) {
+  FilePath actual = FilePath::MakeFileName(FilePath("foo" GTEST_PATH_SEP_),
+      FilePath("bar"), 12, "xml");
+  EXPECT_EQ("foo" GTEST_PATH_SEP_ "bar_12.xml", actual.string());
+}
+
+TEST(MakeFileNameTest, GenerateWhenNumberIsZeroAndDirIsEmpty) {
+  FilePath actual = FilePath::MakeFileName(FilePath(""), FilePath("bar"),
+      0, "xml");
+  EXPECT_EQ("bar.xml", actual.string());
+}
+
+TEST(MakeFileNameTest, GenerateWhenNumberIsNotZeroAndDirIsEmpty) {
+  FilePath actual = FilePath::MakeFileName(FilePath(""), FilePath("bar"),
+      14, "xml");
+  EXPECT_EQ("bar_14.xml", actual.string());
+}
+
+TEST(ConcatPathsTest, WorksWhenDirDoesNotEndWithPathSep) {
+  FilePath actual = FilePath::ConcatPaths(FilePath("foo"),
+                                          FilePath("bar.xml"));
+  EXPECT_EQ("foo" GTEST_PATH_SEP_ "bar.xml", actual.string());
+}
+
+TEST(ConcatPathsTest, WorksWhenPath1EndsWithPathSep) {
+  FilePath actual = FilePath::ConcatPaths(FilePath("foo" GTEST_PATH_SEP_),
+                                          FilePath("bar.xml"));
+  EXPECT_EQ("foo" GTEST_PATH_SEP_ "bar.xml", actual.string());
+}
+
+TEST(ConcatPathsTest, Path1BeingEmpty) {
+  FilePath actual = FilePath::ConcatPaths(FilePath(""),
+                                          FilePath("bar.xml"));
+  EXPECT_EQ("bar.xml", actual.string());
+}
+
+TEST(ConcatPathsTest, Path2BeingEmpty) {
+  FilePath actual = FilePath::ConcatPaths(FilePath("foo"), FilePath(""));
+  EXPECT_EQ("foo" GTEST_PATH_SEP_, actual.string());
+}
+
+TEST(ConcatPathsTest, BothPathBeingEmpty) {
+  FilePath actual = FilePath::ConcatPaths(FilePath(""),
+                                          FilePath(""));
+  EXPECT_EQ("", actual.string());
+}
+
+TEST(ConcatPathsTest, Path1ContainsPathSep) {
+  FilePath actual = FilePath::ConcatPaths(FilePath("foo" GTEST_PATH_SEP_ "bar"),
+                                          FilePath("foobar.xml"));
+  EXPECT_EQ("foo" GTEST_PATH_SEP_ "bar" GTEST_PATH_SEP_ "foobar.xml",
+            actual.string());
+}
+
+TEST(ConcatPathsTest, Path2ContainsPathSep) {
+  FilePath actual = FilePath::ConcatPaths(
+      FilePath("foo" GTEST_PATH_SEP_),
+      FilePath("bar" GTEST_PATH_SEP_ "bar.xml"));
+  EXPECT_EQ("foo" GTEST_PATH_SEP_ "bar" GTEST_PATH_SEP_ "bar.xml",
+            actual.string());
+}
+
+TEST(ConcatPathsTest, Path2EndsWithPathSep) {
+  FilePath actual = FilePath::ConcatPaths(FilePath("foo"),
+                                          FilePath("bar" GTEST_PATH_SEP_));
+  EXPECT_EQ("foo" GTEST_PATH_SEP_ "bar" GTEST_PATH_SEP_, actual.string());
+}
+
+// RemoveTrailingPathSeparator "" -> ""
+TEST(RemoveTrailingPathSeparatorTest, EmptyString) {
+  EXPECT_EQ("", FilePath("").RemoveTrailingPathSeparator().string());
+}
+
+// RemoveTrailingPathSeparator "foo" -> "foo"
+TEST(RemoveTrailingPathSeparatorTest, FileNoSlashString) {
+  EXPECT_EQ("foo", FilePath("foo").RemoveTrailingPathSeparator().string());
+}
+
+// RemoveTrailingPathSeparator "foo/" -> "foo"
+TEST(RemoveTrailingPathSeparatorTest, ShouldRemoveTrailingSeparator) {
+  EXPECT_EQ("foo",
+      FilePath("foo" GTEST_PATH_SEP_).RemoveTrailingPathSeparator().string());
+#if GTEST_HAS_ALT_PATH_SEP_
+  EXPECT_EQ("foo", FilePath("foo/").RemoveTrailingPathSeparator().string());
+#endif
+}
+
+// RemoveTrailingPathSeparator "foo/bar/" -> "foo/bar/"
+TEST(RemoveTrailingPathSeparatorTest, ShouldRemoveLastSeparator) {
+  EXPECT_EQ("foo" GTEST_PATH_SEP_ "bar",
+            FilePath("foo" GTEST_PATH_SEP_ "bar" GTEST_PATH_SEP_)
+                .RemoveTrailingPathSeparator().string());
+}
+
+// RemoveTrailingPathSeparator "foo/bar" -> "foo/bar"
+TEST(RemoveTrailingPathSeparatorTest, ShouldReturnUnmodified) {
+  EXPECT_EQ("foo" GTEST_PATH_SEP_ "bar",
+            FilePath("foo" GTEST_PATH_SEP_ "bar")
+                .RemoveTrailingPathSeparator().string());
+}
+
+TEST(DirectoryTest, RootDirectoryExists) {
+#if GTEST_OS_WINDOWS  // We are on Windows.
+  char current_drive[_MAX_PATH];  // NOLINT
+  current_drive[0] = static_cast<char>(_getdrive() + 'A' - 1);
+  current_drive[1] = ':';
+  current_drive[2] = '\\';
+  current_drive[3] = '\0';
+  EXPECT_TRUE(FilePath(current_drive).DirectoryExists());
+#else
+  EXPECT_TRUE(FilePath("/").DirectoryExists());
+#endif  // GTEST_OS_WINDOWS
+}
+
+#if GTEST_OS_WINDOWS
+TEST(DirectoryTest, RootOfWrongDriveDoesNotExists) {
+  const int saved_drive_ = _getdrive();
+  // Find a drive that doesn't exist. Start with 'Z' to avoid common ones.
+  for (char drive = 'Z'; drive >= 'A'; drive--)
+    if (_chdrive(drive - 'A' + 1) == -1) {
+      char non_drive[_MAX_PATH];  // NOLINT
+      non_drive[0] = drive;
+      non_drive[1] = ':';
+      non_drive[2] = '\\';
+      non_drive[3] = '\0';
+      EXPECT_FALSE(FilePath(non_drive).DirectoryExists());
+      break;
+    }
+  _chdrive(saved_drive_);
+}
+#endif  // GTEST_OS_WINDOWS
+
+#if !GTEST_OS_WINDOWS_MOBILE
+// Windows CE _does_ consider an empty directory to exist.
+TEST(DirectoryTest, EmptyPathDirectoryDoesNotExist) {
+  EXPECT_FALSE(FilePath("").DirectoryExists());
+}
+#endif  // !GTEST_OS_WINDOWS_MOBILE
+
+TEST(DirectoryTest, CurrentDirectoryExists) {
+#if GTEST_OS_WINDOWS  // We are on Windows.
+# ifndef _WIN32_CE  // Windows CE doesn't have a current directory.
+
+  EXPECT_TRUE(FilePath(".").DirectoryExists());
+  EXPECT_TRUE(FilePath(".\\").DirectoryExists());
+
+# endif  // _WIN32_CE
+#else
+  EXPECT_TRUE(FilePath(".").DirectoryExists());
+  EXPECT_TRUE(FilePath("./").DirectoryExists());
+#endif  // GTEST_OS_WINDOWS
+}
+
+// "foo/bar" == foo//bar" == "foo///bar"
+TEST(NormalizeTest, MultipleConsecutiveSepaparatorsInMidstring) {
+  EXPECT_EQ("foo" GTEST_PATH_SEP_ "bar",
+            FilePath("foo" GTEST_PATH_SEP_ "bar").string());
+  EXPECT_EQ("foo" GTEST_PATH_SEP_ "bar",
+            FilePath("foo" GTEST_PATH_SEP_ GTEST_PATH_SEP_ "bar").string());
+  EXPECT_EQ("foo" GTEST_PATH_SEP_ "bar",
+            FilePath("foo" GTEST_PATH_SEP_ GTEST_PATH_SEP_
+                     GTEST_PATH_SEP_ "bar").string());
+}
+
+// "/bar" == //bar" == "///bar"
+TEST(NormalizeTest, MultipleConsecutiveSepaparatorsAtStringStart) {
+  EXPECT_EQ(GTEST_PATH_SEP_ "bar",
+    FilePath(GTEST_PATH_SEP_ "bar").string());
+  EXPECT_EQ(GTEST_PATH_SEP_ "bar",
+    FilePath(GTEST_PATH_SEP_ GTEST_PATH_SEP_ "bar").string());
+  EXPECT_EQ(GTEST_PATH_SEP_ "bar",
+    FilePath(GTEST_PATH_SEP_ GTEST_PATH_SEP_ GTEST_PATH_SEP_ "bar").string());
+}
+
+// "foo/" == foo//" == "foo///"
+TEST(NormalizeTest, MultipleConsecutiveSepaparatorsAtStringEnd) {
+  EXPECT_EQ("foo" GTEST_PATH_SEP_,
+    FilePath("foo" GTEST_PATH_SEP_).string());
+  EXPECT_EQ("foo" GTEST_PATH_SEP_,
+    FilePath("foo" GTEST_PATH_SEP_ GTEST_PATH_SEP_).string());
+  EXPECT_EQ("foo" GTEST_PATH_SEP_,
+    FilePath("foo" GTEST_PATH_SEP_ GTEST_PATH_SEP_ GTEST_PATH_SEP_).string());
+}
+
+#if GTEST_HAS_ALT_PATH_SEP_
+
+// Tests that separators at the end of the string are normalized
+// regardless of their combination (e.g. "foo\" =="foo/\" ==
+// "foo\\/").
+TEST(NormalizeTest, MixAlternateSeparatorAtStringEnd) {
+  EXPECT_EQ("foo" GTEST_PATH_SEP_,
+            FilePath("foo/").string());
+  EXPECT_EQ("foo" GTEST_PATH_SEP_,
+            FilePath("foo" GTEST_PATH_SEP_ "/").string());
+  EXPECT_EQ("foo" GTEST_PATH_SEP_,
+            FilePath("foo//" GTEST_PATH_SEP_).string());
+}
+
+#endif
+
+TEST(AssignmentOperatorTest, DefaultAssignedToNonDefault) {
+  FilePath default_path;
+  FilePath non_default_path("path");
+  non_default_path = default_path;
+  EXPECT_EQ("", non_default_path.string());
+  EXPECT_EQ("", default_path.string());  // RHS var is unchanged.
+}
+
+TEST(AssignmentOperatorTest, NonDefaultAssignedToDefault) {
+  FilePath non_default_path("path");
+  FilePath default_path;
+  default_path = non_default_path;
+  EXPECT_EQ("path", default_path.string());
+  EXPECT_EQ("path", non_default_path.string());  // RHS var is unchanged.
+}
+
+TEST(AssignmentOperatorTest, ConstAssignedToNonConst) {
+  const FilePath const_default_path("const_path");
+  FilePath non_default_path("path");
+  non_default_path = const_default_path;
+  EXPECT_EQ("const_path", non_default_path.string());
+}
+
+class DirectoryCreationTest : public Test {
+ protected:
+  virtual void SetUp() {
+    testdata_path_.Set(FilePath(
+        TempDir() + GetCurrentExecutableName().string() +
+        "_directory_creation" GTEST_PATH_SEP_ "test" GTEST_PATH_SEP_));
+    testdata_file_.Set(testdata_path_.RemoveTrailingPathSeparator());
+
+    unique_file0_.Set(FilePath::MakeFileName(testdata_path_, FilePath("unique"),
+        0, "txt"));
+    unique_file1_.Set(FilePath::MakeFileName(testdata_path_, FilePath("unique"),
+        1, "txt"));
+
+    remove(testdata_file_.c_str());
+    remove(unique_file0_.c_str());
+    remove(unique_file1_.c_str());
+    posix::RmDir(testdata_path_.c_str());
+  }
+
+  virtual void TearDown() {
+    remove(testdata_file_.c_str());
+    remove(unique_file0_.c_str());
+    remove(unique_file1_.c_str());
+    posix::RmDir(testdata_path_.c_str());
+  }
+
+  std::string TempDir() const {
+#if GTEST_OS_WINDOWS_MOBILE
+    return "\\temp\\";
+#elif GTEST_OS_WINDOWS
+    const char* temp_dir = posix::GetEnv("TEMP");
+    if (temp_dir == NULL || temp_dir[0] == '\0')
+      return "\\temp\\";
+    else if (temp_dir[strlen(temp_dir) - 1] == '\\')
+      return temp_dir;
+    else
+      return std::string(temp_dir) + "\\";
+#elif GTEST_OS_LINUX_ANDROID
+    return "/sdcard/";
+#else
+    return "/tmp/";
+#endif  // GTEST_OS_WINDOWS_MOBILE
+  }
+
+  void CreateTextFile(const char* filename) {
+    FILE* f = posix::FOpen(filename, "w");
+    fprintf(f, "text\n");
+    fclose(f);
+  }
+
+  // Strings representing a directory and a file, with identical paths
+  // except for the trailing separator character that distinquishes
+  // a directory named 'test' from a file named 'test'. Example names:
+  FilePath testdata_path_;  // "/tmp/directory_creation/test/"
+  FilePath testdata_file_;  // "/tmp/directory_creation/test"
+  FilePath unique_file0_;  // "/tmp/directory_creation/test/unique.txt"
+  FilePath unique_file1_;  // "/tmp/directory_creation/test/unique_1.txt"
+};
+
+TEST_F(DirectoryCreationTest, CreateDirectoriesRecursively) {
+  EXPECT_FALSE(testdata_path_.DirectoryExists()) << testdata_path_.string();
+  EXPECT_TRUE(testdata_path_.CreateDirectoriesRecursively());
+  EXPECT_TRUE(testdata_path_.DirectoryExists());
+}
+
+TEST_F(DirectoryCreationTest, CreateDirectoriesForAlreadyExistingPath) {
+  EXPECT_FALSE(testdata_path_.DirectoryExists()) << testdata_path_.string();
+  EXPECT_TRUE(testdata_path_.CreateDirectoriesRecursively());
+  // Call 'create' again... should still succeed.
+  EXPECT_TRUE(testdata_path_.CreateDirectoriesRecursively());
+}
+
+TEST_F(DirectoryCreationTest, CreateDirectoriesAndUniqueFilename) {
+  FilePath file_path(FilePath::GenerateUniqueFileName(testdata_path_,
+      FilePath("unique"), "txt"));
+  EXPECT_EQ(unique_file0_.string(), file_path.string());
+  EXPECT_FALSE(file_path.FileOrDirectoryExists());  // file not there
+
+  testdata_path_.CreateDirectoriesRecursively();
+  EXPECT_FALSE(file_path.FileOrDirectoryExists());  // file still not there
+  CreateTextFile(file_path.c_str());
+  EXPECT_TRUE(file_path.FileOrDirectoryExists());
+
+  FilePath file_path2(FilePath::GenerateUniqueFileName(testdata_path_,
+      FilePath("unique"), "txt"));
+  EXPECT_EQ(unique_file1_.string(), file_path2.string());
+  EXPECT_FALSE(file_path2.FileOrDirectoryExists());  // file not there
+  CreateTextFile(file_path2.c_str());
+  EXPECT_TRUE(file_path2.FileOrDirectoryExists());
+}
+
+TEST_F(DirectoryCreationTest, CreateDirectoriesFail) {
+  // force a failure by putting a file where we will try to create a directory.
+  CreateTextFile(testdata_file_.c_str());
+  EXPECT_TRUE(testdata_file_.FileOrDirectoryExists());
+  EXPECT_FALSE(testdata_file_.DirectoryExists());
+  EXPECT_FALSE(testdata_file_.CreateDirectoriesRecursively());
+}
+
+TEST(NoDirectoryCreationTest, CreateNoDirectoriesForDefaultXmlFile) {
+  const FilePath test_detail_xml("test_detail.xml");
+  EXPECT_FALSE(test_detail_xml.CreateDirectoriesRecursively());
+}
+
+TEST(FilePathTest, DefaultConstructor) {
+  FilePath fp;
+  EXPECT_EQ("", fp.string());
+}
+
+TEST(FilePathTest, CharAndCopyConstructors) {
+  const FilePath fp("spicy");
+  EXPECT_EQ("spicy", fp.string());
+
+  const FilePath fp_copy(fp);
+  EXPECT_EQ("spicy", fp_copy.string());
+}
+
+TEST(FilePathTest, StringConstructor) {
+  const FilePath fp(std::string("cider"));
+  EXPECT_EQ("cider", fp.string());
+}
+
+TEST(FilePathTest, Set) {
+  const FilePath apple("apple");
+  FilePath mac("mac");
+  mac.Set(apple);  // Implement Set() since overloading operator= is forbidden.
+  EXPECT_EQ("apple", mac.string());
+  EXPECT_EQ("apple", apple.string());
+}
+
+TEST(FilePathTest, ToString) {
+  const FilePath file("drink");
+  EXPECT_EQ("drink", file.string());
+}
+
+TEST(FilePathTest, RemoveExtension) {
+  EXPECT_EQ("app", FilePath("app.cc").RemoveExtension("cc").string());
+  EXPECT_EQ("app", FilePath("app.exe").RemoveExtension("exe").string());
+  EXPECT_EQ("APP", FilePath("APP.EXE").RemoveExtension("exe").string());
+}
+
+TEST(FilePathTest, RemoveExtensionWhenThereIsNoExtension) {
+  EXPECT_EQ("app", FilePath("app").RemoveExtension("exe").string());
+}
+
+TEST(FilePathTest, IsDirectory) {
+  EXPECT_FALSE(FilePath("cola").IsDirectory());
+  EXPECT_TRUE(FilePath("koala" GTEST_PATH_SEP_).IsDirectory());
+#if GTEST_HAS_ALT_PATH_SEP_
+  EXPECT_TRUE(FilePath("koala/").IsDirectory());
+#endif
+}
+
+TEST(FilePathTest, IsAbsolutePath) {
+  EXPECT_FALSE(FilePath("is" GTEST_PATH_SEP_ "relative").IsAbsolutePath());
+  EXPECT_FALSE(FilePath("").IsAbsolutePath());
+#if GTEST_OS_WINDOWS
+  EXPECT_TRUE(FilePath("c:\\" GTEST_PATH_SEP_ "is_not"
+                       GTEST_PATH_SEP_ "relative").IsAbsolutePath());
+  EXPECT_FALSE(FilePath("c:foo" GTEST_PATH_SEP_ "bar").IsAbsolutePath());
+  EXPECT_TRUE(FilePath("c:/" GTEST_PATH_SEP_ "is_not"
+                       GTEST_PATH_SEP_ "relative").IsAbsolutePath());
+#else
+  EXPECT_TRUE(FilePath(GTEST_PATH_SEP_ "is_not" GTEST_PATH_SEP_ "relative")
+              .IsAbsolutePath());
+#endif  // GTEST_OS_WINDOWS
+}
+
+TEST(FilePathTest, IsRootDirectory) {
+#if GTEST_OS_WINDOWS
+  EXPECT_TRUE(FilePath("a:\\").IsRootDirectory());
+  EXPECT_TRUE(FilePath("Z:/").IsRootDirectory());
+  EXPECT_TRUE(FilePath("e://").IsRootDirectory());
+  EXPECT_FALSE(FilePath("").IsRootDirectory());
+  EXPECT_FALSE(FilePath("b:").IsRootDirectory());
+  EXPECT_FALSE(FilePath("b:a").IsRootDirectory());
+  EXPECT_FALSE(FilePath("8:/").IsRootDirectory());
+  EXPECT_FALSE(FilePath("c|/").IsRootDirectory());
+#else
+  EXPECT_TRUE(FilePath("/").IsRootDirectory());
+  EXPECT_TRUE(FilePath("//").IsRootDirectory());
+  EXPECT_FALSE(FilePath("").IsRootDirectory());
+  EXPECT_FALSE(FilePath("\\").IsRootDirectory());
+  EXPECT_FALSE(FilePath("/x").IsRootDirectory());
+#endif
+}
+
+}  // namespace
+}  // namespace internal
+}  // namespace testing
diff --git a/contrib/gtest-1.7.0/test/gtest-linked_ptr_test.cc b/contrib/gtest-1.7.0/test/gtest-linked_ptr_test.cc
new file mode 100644
index 0000000..6fcf512
--- /dev/null
+++ b/contrib/gtest-1.7.0/test/gtest-linked_ptr_test.cc
@@ -0,0 +1,154 @@
+// Copyright 2003, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Authors: Dan Egnor (egnor at google.com)
+// Ported to Windows: Vadim Berman (vadimb at google.com)
+
+#include "gtest/internal/gtest-linked_ptr.h"
+
+#include <stdlib.h>
+#include "gtest/gtest.h"
+
+namespace {
+
+using testing::Message;
+using testing::internal::linked_ptr;
+
+int num;
+Message* history = NULL;
+
+// Class which tracks allocation/deallocation
+class A {
+ public:
+  A(): mynum(num++) { *history << "A" << mynum << " ctor\n"; }
+  virtual ~A() { *history << "A" << mynum << " dtor\n"; }
+  virtual void Use() { *history << "A" << mynum << " use\n"; }
+ protected:
+  int mynum;
+};
+
+// Subclass
+class B : public A {
+ public:
+  B() { *history << "B" << mynum << " ctor\n"; }
+  ~B() { *history << "B" << mynum << " dtor\n"; }
+  virtual void Use() { *history << "B" << mynum << " use\n"; }
+};
+
+class LinkedPtrTest : public testing::Test {
+ public:
+  LinkedPtrTest() {
+    num = 0;
+    history = new Message;
+  }
+
+  virtual ~LinkedPtrTest() {
+    delete history;
+    history = NULL;
+  }
+};
+
+TEST_F(LinkedPtrTest, GeneralTest) {
+  {
+    linked_ptr<A> a0, a1, a2;
+    // Use explicit function call notation here to suppress self-assign warning.
+    a0.operator=(a0);
+    a1 = a2;
+    ASSERT_EQ(a0.get(), static_cast<A*>(NULL));
+    ASSERT_EQ(a1.get(), static_cast<A*>(NULL));
+    ASSERT_EQ(a2.get(), static_cast<A*>(NULL));
+    ASSERT_TRUE(a0 == NULL);
+    ASSERT_TRUE(a1 == NULL);
+    ASSERT_TRUE(a2 == NULL);
+
+    {
+      linked_ptr<A> a3(new A);
+      a0 = a3;
+      ASSERT_TRUE(a0 == a3);
+      ASSERT_TRUE(a0 != NULL);
+      ASSERT_TRUE(a0.get() == a3);
+      ASSERT_TRUE(a0 == a3.get());
+      linked_ptr<A> a4(a0);
+      a1 = a4;
+      linked_ptr<A> a5(new A);
+      ASSERT_TRUE(a5.get() != a3);
+      ASSERT_TRUE(a5 != a3.get());
+      a2 = a5;
+      linked_ptr<B> b0(new B);
+      linked_ptr<A> a6(b0);
+      ASSERT_TRUE(b0 == a6);
+      ASSERT_TRUE(a6 == b0);
+      ASSERT_TRUE(b0 != NULL);
+      a5 = b0;
+      a5 = b0;
+      a3->Use();
+      a4->Use();
+      a5->Use();
+      a6->Use();
+      b0->Use();
+      (*b0).Use();
+      b0.get()->Use();
+    }
+
+    a0->Use();
+    a1->Use();
+    a2->Use();
+
+    a1 = a2;
+    a2.reset(new A);
+    a0.reset();
+
+    linked_ptr<A> a7;
+  }
+
+  ASSERT_STREQ(
+    "A0 ctor\n"
+    "A1 ctor\n"
+    "A2 ctor\n"
+    "B2 ctor\n"
+    "A0 use\n"
+    "A0 use\n"
+    "B2 use\n"
+    "B2 use\n"
+    "B2 use\n"
+    "B2 use\n"
+    "B2 use\n"
+    "B2 dtor\n"
+    "A2 dtor\n"
+    "A0 use\n"
+    "A0 use\n"
+    "A1 use\n"
+    "A3 ctor\n"
+    "A0 dtor\n"
+    "A3 dtor\n"
+    "A1 dtor\n",
+    history->GetString().c_str());
+}
+
+}  // Unnamed namespace
diff --git a/contrib/gtest-1.7.0/test/gtest-listener_test.cc b/contrib/gtest-1.7.0/test/gtest-listener_test.cc
new file mode 100644
index 0000000..99662cf
--- /dev/null
+++ b/contrib/gtest-1.7.0/test/gtest-listener_test.cc
@@ -0,0 +1,310 @@
+// Copyright 2009 Google Inc. All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: vladl at google.com (Vlad Losev)
+//
+// The Google C++ Testing Framework (Google Test)
+//
+// This file verifies Google Test event listeners receive events at the
+// right times.
+
+#include "gtest/gtest.h"
+#include <vector>
+
+using ::testing::AddGlobalTestEnvironment;
+using ::testing::Environment;
+using ::testing::InitGoogleTest;
+using ::testing::Test;
+using ::testing::TestCase;
+using ::testing::TestEventListener;
+using ::testing::TestInfo;
+using ::testing::TestPartResult;
+using ::testing::UnitTest;
+
+// Used by tests to register their events.
+std::vector<std::string>* g_events = NULL;
+
+namespace testing {
+namespace internal {
+
+class EventRecordingListener : public TestEventListener {
+ public:
+  explicit EventRecordingListener(const char* name) : name_(name) {}
+
+ protected:
+  virtual void OnTestProgramStart(const UnitTest& /*unit_test*/) {
+    g_events->push_back(GetFullMethodName("OnTestProgramStart"));
+  }
+
+  virtual void OnTestIterationStart(const UnitTest& /*unit_test*/,
+                                    int iteration) {
+    Message message;
+    message << GetFullMethodName("OnTestIterationStart")
+            << "(" << iteration << ")";
+    g_events->push_back(message.GetString());
+  }
+
+  virtual void OnEnvironmentsSetUpStart(const UnitTest& /*unit_test*/) {
+    g_events->push_back(GetFullMethodName("OnEnvironmentsSetUpStart"));
+  }
+
+  virtual void OnEnvironmentsSetUpEnd(const UnitTest& /*unit_test*/) {
+    g_events->push_back(GetFullMethodName("OnEnvironmentsSetUpEnd"));
+  }
+
+  virtual void OnTestCaseStart(const TestCase& /*test_case*/) {
+    g_events->push_back(GetFullMethodName("OnTestCaseStart"));
+  }
+
+  virtual void OnTestStart(const TestInfo& /*test_info*/) {
+    g_events->push_back(GetFullMethodName("OnTestStart"));
+  }
+
+  virtual void OnTestPartResult(const TestPartResult& /*test_part_result*/) {
+    g_events->push_back(GetFullMethodName("OnTestPartResult"));
+  }
+
+  virtual void OnTestEnd(const TestInfo& /*test_info*/) {
+    g_events->push_back(GetFullMethodName("OnTestEnd"));
+  }
+
+  virtual void OnTestCaseEnd(const TestCase& /*test_case*/) {
+    g_events->push_back(GetFullMethodName("OnTestCaseEnd"));
+  }
+
+  virtual void OnEnvironmentsTearDownStart(const UnitTest& /*unit_test*/) {
+    g_events->push_back(GetFullMethodName("OnEnvironmentsTearDownStart"));
+  }
+
+  virtual void OnEnvironmentsTearDownEnd(const UnitTest& /*unit_test*/) {
+    g_events->push_back(GetFullMethodName("OnEnvironmentsTearDownEnd"));
+  }
+
+  virtual void OnTestIterationEnd(const UnitTest& /*unit_test*/,
+                                  int iteration) {
+    Message message;
+    message << GetFullMethodName("OnTestIterationEnd")
+            << "("  << iteration << ")";
+    g_events->push_back(message.GetString());
+  }
+
+  virtual void OnTestProgramEnd(const UnitTest& /*unit_test*/) {
+    g_events->push_back(GetFullMethodName("OnTestProgramEnd"));
+  }
+
+ private:
+  std::string GetFullMethodName(const char* name) {
+    return name_ + "." + name;
+  }
+
+  std::string name_;
+};
+
+class EnvironmentInvocationCatcher : public Environment {
+ protected:
+  virtual void SetUp() {
+    g_events->push_back("Environment::SetUp");
+  }
+
+  virtual void TearDown() {
+    g_events->push_back("Environment::TearDown");
+  }
+};
+
+class ListenerTest : public Test {
+ protected:
+  static void SetUpTestCase() {
+    g_events->push_back("ListenerTest::SetUpTestCase");
+  }
+
+  static void TearDownTestCase() {
+    g_events->push_back("ListenerTest::TearDownTestCase");
+  }
+
+  virtual void SetUp() {
+    g_events->push_back("ListenerTest::SetUp");
+  }
+
+  virtual void TearDown() {
+    g_events->push_back("ListenerTest::TearDown");
+  }
+};
+
+TEST_F(ListenerTest, DoesFoo) {
+  // Test execution order within a test case is not guaranteed so we are not
+  // recording the test name.
+  g_events->push_back("ListenerTest::* Test Body");
+  SUCCEED();  // Triggers OnTestPartResult.
+}
+
+TEST_F(ListenerTest, DoesBar) {
+  g_events->push_back("ListenerTest::* Test Body");
+  SUCCEED();  // Triggers OnTestPartResult.
+}
+
+}  // namespace internal
+
+}  // namespace testing
+
+using ::testing::internal::EnvironmentInvocationCatcher;
+using ::testing::internal::EventRecordingListener;
+
+void VerifyResults(const std::vector<std::string>& data,
+                   const char* const* expected_data,
+                   int expected_data_size) {
+  const int actual_size = data.size();
+  // If the following assertion fails, a new entry will be appended to
+  // data.  Hence we save data.size() first.
+  EXPECT_EQ(expected_data_size, actual_size);
+
+  // Compares the common prefix.
+  const int shorter_size = expected_data_size <= actual_size ?
+      expected_data_size : actual_size;
+  int i = 0;
+  for (; i < shorter_size; ++i) {
+    ASSERT_STREQ(expected_data[i], data[i].c_str())
+        << "at position " << i;
+  }
+
+  // Prints extra elements in the actual data.
+  for (; i < actual_size; ++i) {
+    printf("  Actual event #%d: %s\n", i, data[i].c_str());
+  }
+}
+
+int main(int argc, char **argv) {
+  std::vector<std::string> events;
+  g_events = &events;
+  InitGoogleTest(&argc, argv);
+
+  UnitTest::GetInstance()->listeners().Append(
+      new EventRecordingListener("1st"));
+  UnitTest::GetInstance()->listeners().Append(
+      new EventRecordingListener("2nd"));
+
+  AddGlobalTestEnvironment(new EnvironmentInvocationCatcher);
+
+  GTEST_CHECK_(events.size() == 0)
+      << "AddGlobalTestEnvironment should not generate any events itself.";
+
+  ::testing::GTEST_FLAG(repeat) = 2;
+  int ret_val = RUN_ALL_TESTS();
+
+  const char* const expected_events[] = {
+    "1st.OnTestProgramStart",
+    "2nd.OnTestProgramStart",
+    "1st.OnTestIterationStart(0)",
+    "2nd.OnTestIterationStart(0)",
+    "1st.OnEnvironmentsSetUpStart",
+    "2nd.OnEnvironmentsSetUpStart",
+    "Environment::SetUp",
+    "2nd.OnEnvironmentsSetUpEnd",
+    "1st.OnEnvironmentsSetUpEnd",
+    "1st.OnTestCaseStart",
+    "2nd.OnTestCaseStart",
+    "ListenerTest::SetUpTestCase",
+    "1st.OnTestStart",
+    "2nd.OnTestStart",
+    "ListenerTest::SetUp",
+    "ListenerTest::* Test Body",
+    "1st.OnTestPartResult",
+    "2nd.OnTestPartResult",
+    "ListenerTest::TearDown",
+    "2nd.OnTestEnd",
+    "1st.OnTestEnd",
+    "1st.OnTestStart",
+    "2nd.OnTestStart",
+    "ListenerTest::SetUp",
+    "ListenerTest::* Test Body",
+    "1st.OnTestPartResult",
+    "2nd.OnTestPartResult",
+    "ListenerTest::TearDown",
+    "2nd.OnTestEnd",
+    "1st.OnTestEnd",
+    "ListenerTest::TearDownTestCase",
+    "2nd.OnTestCaseEnd",
+    "1st.OnTestCaseEnd",
+    "1st.OnEnvironmentsTearDownStart",
+    "2nd.OnEnvironmentsTearDownStart",
+    "Environment::TearDown",
+    "2nd.OnEnvironmentsTearDownEnd",
+    "1st.OnEnvironmentsTearDownEnd",
+    "2nd.OnTestIterationEnd(0)",
+    "1st.OnTestIterationEnd(0)",
+    "1st.OnTestIterationStart(1)",
+    "2nd.OnTestIterationStart(1)",
+    "1st.OnEnvironmentsSetUpStart",
+    "2nd.OnEnvironmentsSetUpStart",
+    "Environment::SetUp",
+    "2nd.OnEnvironmentsSetUpEnd",
+    "1st.OnEnvironmentsSetUpEnd",
+    "1st.OnTestCaseStart",
+    "2nd.OnTestCaseStart",
+    "ListenerTest::SetUpTestCase",
+    "1st.OnTestStart",
+    "2nd.OnTestStart",
+    "ListenerTest::SetUp",
+    "ListenerTest::* Test Body",
+    "1st.OnTestPartResult",
+    "2nd.OnTestPartResult",
+    "ListenerTest::TearDown",
+    "2nd.OnTestEnd",
+    "1st.OnTestEnd",
+    "1st.OnTestStart",
+    "2nd.OnTestStart",
+    "ListenerTest::SetUp",
+    "ListenerTest::* Test Body",
+    "1st.OnTestPartResult",
+    "2nd.OnTestPartResult",
+    "ListenerTest::TearDown",
+    "2nd.OnTestEnd",
+    "1st.OnTestEnd",
+    "ListenerTest::TearDownTestCase",
+    "2nd.OnTestCaseEnd",
+    "1st.OnTestCaseEnd",
+    "1st.OnEnvironmentsTearDownStart",
+    "2nd.OnEnvironmentsTearDownStart",
+    "Environment::TearDown",
+    "2nd.OnEnvironmentsTearDownEnd",
+    "1st.OnEnvironmentsTearDownEnd",
+    "2nd.OnTestIterationEnd(1)",
+    "1st.OnTestIterationEnd(1)",
+    "2nd.OnTestProgramEnd",
+    "1st.OnTestProgramEnd"
+  };
+  VerifyResults(events,
+                expected_events,
+                sizeof(expected_events)/sizeof(expected_events[0]));
+
+  // We need to check manually for ad hoc test failures that happen after
+  // RUN_ALL_TESTS finishes.
+  if (UnitTest::GetInstance()->Failed())
+    ret_val = 1;
+
+  return ret_val;
+}
diff --git a/contrib/gtest-1.7.0/test/gtest-message_test.cc b/contrib/gtest-1.7.0/test/gtest-message_test.cc
new file mode 100644
index 0000000..175238e
--- /dev/null
+++ b/contrib/gtest-1.7.0/test/gtest-message_test.cc
@@ -0,0 +1,159 @@
+// Copyright 2005, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+//
+// Tests for the Message class.
+
+#include "gtest/gtest-message.h"
+
+#include "gtest/gtest.h"
+
+namespace {
+
+using ::testing::Message;
+
+// Tests the testing::Message class
+
+// Tests the default constructor.
+TEST(MessageTest, DefaultConstructor) {
+  const Message msg;
+  EXPECT_EQ("", msg.GetString());
+}
+
+// Tests the copy constructor.
+TEST(MessageTest, CopyConstructor) {
+  const Message msg1("Hello");
+  const Message msg2(msg1);
+  EXPECT_EQ("Hello", msg2.GetString());
+}
+
+// Tests constructing a Message from a C-string.
+TEST(MessageTest, ConstructsFromCString) {
+  Message msg("Hello");
+  EXPECT_EQ("Hello", msg.GetString());
+}
+
+// Tests streaming a float.
+TEST(MessageTest, StreamsFloat) {
+  const std::string s = (Message() << 1.23456F << " " << 2.34567F).GetString();
+  // Both numbers should be printed with enough precision.
+  EXPECT_PRED_FORMAT2(testing::IsSubstring, "1.234560", s.c_str());
+  EXPECT_PRED_FORMAT2(testing::IsSubstring, " 2.345669", s.c_str());
+}
+
+// Tests streaming a double.
+TEST(MessageTest, StreamsDouble) {
+  const std::string s = (Message() << 1260570880.4555497 << " "
+                                  << 1260572265.1954534).GetString();
+  // Both numbers should be printed with enough precision.
+  EXPECT_PRED_FORMAT2(testing::IsSubstring, "1260570880.45", s.c_str());
+  EXPECT_PRED_FORMAT2(testing::IsSubstring, " 1260572265.19", s.c_str());
+}
+
+// Tests streaming a non-char pointer.
+TEST(MessageTest, StreamsPointer) {
+  int n = 0;
+  int* p = &n;
+  EXPECT_NE("(null)", (Message() << p).GetString());
+}
+
+// Tests streaming a NULL non-char pointer.
+TEST(MessageTest, StreamsNullPointer) {
+  int* p = NULL;
+  EXPECT_EQ("(null)", (Message() << p).GetString());
+}
+
+// Tests streaming a C string.
+TEST(MessageTest, StreamsCString) {
+  EXPECT_EQ("Foo", (Message() << "Foo").GetString());
+}
+
+// Tests streaming a NULL C string.
+TEST(MessageTest, StreamsNullCString) {
+  char* p = NULL;
+  EXPECT_EQ("(null)", (Message() << p).GetString());
+}
+
+// Tests streaming std::string.
+TEST(MessageTest, StreamsString) {
+  const ::std::string str("Hello");
+  EXPECT_EQ("Hello", (Message() << str).GetString());
+}
+
+// Tests that we can output strings containing embedded NULs.
+TEST(MessageTest, StreamsStringWithEmbeddedNUL) {
+  const char char_array_with_nul[] =
+      "Here's a NUL\0 and some more string";
+  const ::std::string string_with_nul(char_array_with_nul,
+                                      sizeof(char_array_with_nul) - 1);
+  EXPECT_EQ("Here's a NUL\\0 and some more string",
+            (Message() << string_with_nul).GetString());
+}
+
+// Tests streaming a NUL char.
+TEST(MessageTest, StreamsNULChar) {
+  EXPECT_EQ("\\0", (Message() << '\0').GetString());
+}
+
+// Tests streaming int.
+TEST(MessageTest, StreamsInt) {
+  EXPECT_EQ("123", (Message() << 123).GetString());
+}
+
+// Tests that basic IO manipulators (endl, ends, and flush) can be
+// streamed to Message.
+TEST(MessageTest, StreamsBasicIoManip) {
+  EXPECT_EQ("Line 1.\nA NUL char \\0 in line 2.",
+               (Message() << "Line 1." << std::endl
+                         << "A NUL char " << std::ends << std::flush
+                         << " in line 2.").GetString());
+}
+
+// Tests Message::GetString()
+TEST(MessageTest, GetString) {
+  Message msg;
+  msg << 1 << " lamb";
+  EXPECT_EQ("1 lamb", msg.GetString());
+}
+
+// Tests streaming a Message object to an ostream.
+TEST(MessageTest, StreamsToOStream) {
+  Message msg("Hello");
+  ::std::stringstream ss;
+  ss << msg;
+  EXPECT_EQ("Hello", testing::internal::StringStreamToString(&ss));
+}
+
+// Tests that a Message object doesn't take up too much stack space.
+TEST(MessageTest, DoesNotTakeUpMuchStackSpace) {
+  EXPECT_LE(sizeof(Message), 16U);
+}
+
+}  // namespace
diff --git a/contrib/gtest-1.7.0/test/gtest-options_test.cc b/contrib/gtest-1.7.0/test/gtest-options_test.cc
new file mode 100644
index 0000000..5586dc3
--- /dev/null
+++ b/contrib/gtest-1.7.0/test/gtest-options_test.cc
@@ -0,0 +1,215 @@
+// Copyright 2008, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Authors: keith.ray at gmail.com (Keith Ray)
+//
+// Google Test UnitTestOptions tests
+//
+// This file tests classes and functions used internally by
+// Google Test.  They are subject to change without notice.
+//
+// This file is #included from gtest.cc, to avoid changing build or
+// make-files on Windows and other platforms. Do not #include this file
+// anywhere else!
+
+#include "gtest/gtest.h"
+
+#if GTEST_OS_WINDOWS_MOBILE
+# include <windows.h>
+#elif GTEST_OS_WINDOWS
+# include <direct.h>
+#endif  // GTEST_OS_WINDOWS_MOBILE
+
+// Indicates that this translation unit is part of Google Test's
+// implementation.  It must come before gtest-internal-inl.h is
+// included, or there will be a compiler error.  This trick is to
+// prevent a user from accidentally including gtest-internal-inl.h in
+// his code.
+#define GTEST_IMPLEMENTATION_ 1
+#include "src/gtest-internal-inl.h"
+#undef GTEST_IMPLEMENTATION_
+
+namespace testing {
+namespace internal {
+namespace {
+
+// Turns the given relative path into an absolute path.
+FilePath GetAbsolutePathOf(const FilePath& relative_path) {
+  return FilePath::ConcatPaths(FilePath::GetCurrentDir(), relative_path);
+}
+
+// Testing UnitTestOptions::GetOutputFormat/GetOutputFile.
+
+TEST(XmlOutputTest, GetOutputFormatDefault) {
+  GTEST_FLAG(output) = "";
+  EXPECT_STREQ("", UnitTestOptions::GetOutputFormat().c_str());
+}
+
+TEST(XmlOutputTest, GetOutputFormat) {
+  GTEST_FLAG(output) = "xml:filename";
+  EXPECT_STREQ("xml", UnitTestOptions::GetOutputFormat().c_str());
+}
+
+TEST(XmlOutputTest, GetOutputFileDefault) {
+  GTEST_FLAG(output) = "";
+  EXPECT_EQ(GetAbsolutePathOf(FilePath("test_detail.xml")).string(),
+            UnitTestOptions::GetAbsolutePathToOutputFile());
+}
+
+TEST(XmlOutputTest, GetOutputFileSingleFile) {
+  GTEST_FLAG(output) = "xml:filename.abc";
+  EXPECT_EQ(GetAbsolutePathOf(FilePath("filename.abc")).string(),
+            UnitTestOptions::GetAbsolutePathToOutputFile());
+}
+
+TEST(XmlOutputTest, GetOutputFileFromDirectoryPath) {
+  GTEST_FLAG(output) = "xml:path" GTEST_PATH_SEP_;
+  const std::string expected_output_file =
+      GetAbsolutePathOf(
+          FilePath(std::string("path") + GTEST_PATH_SEP_ +
+                   GetCurrentExecutableName().string() + ".xml")).string();
+  const std::string& output_file =
+      UnitTestOptions::GetAbsolutePathToOutputFile();
+#if GTEST_OS_WINDOWS
+  EXPECT_STRCASEEQ(expected_output_file.c_str(), output_file.c_str());
+#else
+  EXPECT_EQ(expected_output_file, output_file.c_str());
+#endif
+}
+
+TEST(OutputFileHelpersTest, GetCurrentExecutableName) {
+  const std::string exe_str = GetCurrentExecutableName().string();
+#if GTEST_OS_WINDOWS
+  const bool success =
+      _strcmpi("gtest-options_test", exe_str.c_str()) == 0 ||
+      _strcmpi("gtest-options-ex_test", exe_str.c_str()) == 0 ||
+      _strcmpi("gtest_all_test", exe_str.c_str()) == 0 ||
+      _strcmpi("gtest_dll_test", exe_str.c_str()) == 0;
+#else
+  // TODO(wan at google.com): remove the hard-coded "lt-" prefix when
+  //   Chandler Carruth's libtool replacement is ready.
+  const bool success =
+      exe_str == "gtest-options_test" ||
+      exe_str == "gtest_all_test" ||
+      exe_str == "lt-gtest_all_test" ||
+      exe_str == "gtest_dll_test";
+#endif  // GTEST_OS_WINDOWS
+  if (!success)
+    FAIL() << "GetCurrentExecutableName() returns " << exe_str;
+}
+
+class XmlOutputChangeDirTest : public Test {
+ protected:
+  virtual void SetUp() {
+    original_working_dir_ = FilePath::GetCurrentDir();
+    posix::ChDir("..");
+    // This will make the test fail if run from the root directory.
+    EXPECT_NE(original_working_dir_.string(),
+              FilePath::GetCurrentDir().string());
+  }
+
+  virtual void TearDown() {
+    posix::ChDir(original_working_dir_.string().c_str());
+  }
+
+  FilePath original_working_dir_;
+};
+
+TEST_F(XmlOutputChangeDirTest, PreserveOriginalWorkingDirWithDefault) {
+  GTEST_FLAG(output) = "";
+  EXPECT_EQ(FilePath::ConcatPaths(original_working_dir_,
+                                  FilePath("test_detail.xml")).string(),
+            UnitTestOptions::GetAbsolutePathToOutputFile());
+}
+
+TEST_F(XmlOutputChangeDirTest, PreserveOriginalWorkingDirWithDefaultXML) {
+  GTEST_FLAG(output) = "xml";
+  EXPECT_EQ(FilePath::ConcatPaths(original_working_dir_,
+                                  FilePath("test_detail.xml")).string(),
+            UnitTestOptions::GetAbsolutePathToOutputFile());
+}
+
+TEST_F(XmlOutputChangeDirTest, PreserveOriginalWorkingDirWithRelativeFile) {
+  GTEST_FLAG(output) = "xml:filename.abc";
+  EXPECT_EQ(FilePath::ConcatPaths(original_working_dir_,
+                                  FilePath("filename.abc")).string(),
+            UnitTestOptions::GetAbsolutePathToOutputFile());
+}
+
+TEST_F(XmlOutputChangeDirTest, PreserveOriginalWorkingDirWithRelativePath) {
+  GTEST_FLAG(output) = "xml:path" GTEST_PATH_SEP_;
+  const std::string expected_output_file =
+      FilePath::ConcatPaths(
+          original_working_dir_,
+          FilePath(std::string("path") + GTEST_PATH_SEP_ +
+                   GetCurrentExecutableName().string() + ".xml")).string();
+  const std::string& output_file =
+      UnitTestOptions::GetAbsolutePathToOutputFile();
+#if GTEST_OS_WINDOWS
+  EXPECT_STRCASEEQ(expected_output_file.c_str(), output_file.c_str());
+#else
+  EXPECT_EQ(expected_output_file, output_file.c_str());
+#endif
+}
+
+TEST_F(XmlOutputChangeDirTest, PreserveOriginalWorkingDirWithAbsoluteFile) {
+#if GTEST_OS_WINDOWS
+  GTEST_FLAG(output) = "xml:c:\\tmp\\filename.abc";
+  EXPECT_EQ(FilePath("c:\\tmp\\filename.abc").string(),
+            UnitTestOptions::GetAbsolutePathToOutputFile());
+#else
+  GTEST_FLAG(output) ="xml:/tmp/filename.abc";
+  EXPECT_EQ(FilePath("/tmp/filename.abc").string(),
+            UnitTestOptions::GetAbsolutePathToOutputFile());
+#endif
+}
+
+TEST_F(XmlOutputChangeDirTest, PreserveOriginalWorkingDirWithAbsolutePath) {
+#if GTEST_OS_WINDOWS
+  const std::string path = "c:\\tmp\\";
+#else
+  const std::string path = "/tmp/";
+#endif
+
+  GTEST_FLAG(output) = "xml:" + path;
+  const std::string expected_output_file =
+      path + GetCurrentExecutableName().string() + ".xml";
+  const std::string& output_file =
+      UnitTestOptions::GetAbsolutePathToOutputFile();
+
+#if GTEST_OS_WINDOWS
+  EXPECT_STRCASEEQ(expected_output_file.c_str(), output_file.c_str());
+#else
+  EXPECT_EQ(expected_output_file, output_file.c_str());
+#endif
+}
+
+}  // namespace
+}  // namespace internal
+}  // namespace testing
diff --git a/contrib/gtest-1.7.0/test/gtest-param-test2_test.cc b/contrib/gtest-1.7.0/test/gtest-param-test2_test.cc
new file mode 100644
index 0000000..4a782fe
--- /dev/null
+++ b/contrib/gtest-1.7.0/test/gtest-param-test2_test.cc
@@ -0,0 +1,65 @@
+// Copyright 2008, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: vladl at google.com (Vlad Losev)
+//
+// Tests for Google Test itself.  This verifies that the basic constructs of
+// Google Test work.
+
+#include "gtest/gtest.h"
+
+#include "test/gtest-param-test_test.h"
+
+#if GTEST_HAS_PARAM_TEST
+
+using ::testing::Values;
+using ::testing::internal::ParamGenerator;
+
+// Tests that generators defined in a different translation unit
+// are functional. The test using extern_gen is defined
+// in gtest-param-test_test.cc.
+ParamGenerator<int> extern_gen = Values(33);
+
+// Tests that a parameterized test case can be defined in one translation unit
+// and instantiated in another. The test is defined in gtest-param-test_test.cc
+// and ExternalInstantiationTest fixture class is defined in
+// gtest-param-test_test.h.
+INSTANTIATE_TEST_CASE_P(MultiplesOf33,
+                        ExternalInstantiationTest,
+                        Values(33, 66));
+
+// Tests that a parameterized test case can be instantiated
+// in multiple translation units. Another instantiation is defined
+// in gtest-param-test_test.cc and InstantiationInMultipleTranslaionUnitsTest
+// fixture is defined in gtest-param-test_test.h
+INSTANTIATE_TEST_CASE_P(Sequence2,
+                        InstantiationInMultipleTranslaionUnitsTest,
+                        Values(42*3, 42*4, 42*5));
+
+#endif  // GTEST_HAS_PARAM_TEST
diff --git a/contrib/gtest-1.7.0/test/gtest-param-test_test.cc b/contrib/gtest-1.7.0/test/gtest-param-test_test.cc
new file mode 100644
index 0000000..f60cb8a
--- /dev/null
+++ b/contrib/gtest-1.7.0/test/gtest-param-test_test.cc
@@ -0,0 +1,904 @@
+// Copyright 2008, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: vladl at google.com (Vlad Losev)
+//
+// Tests for Google Test itself. This file verifies that the parameter
+// generators objects produce correct parameter sequences and that
+// Google Test runtime instantiates correct tests from those sequences.
+
+#include "gtest/gtest.h"
+
+#if GTEST_HAS_PARAM_TEST
+
+# include <algorithm>
+# include <iostream>
+# include <list>
+# include <sstream>
+# include <string>
+# include <vector>
+
+// To include gtest-internal-inl.h.
+# define GTEST_IMPLEMENTATION_ 1
+# include "src/gtest-internal-inl.h"  // for UnitTestOptions
+# undef GTEST_IMPLEMENTATION_
+
+# include "test/gtest-param-test_test.h"
+
+using ::std::vector;
+using ::std::sort;
+
+using ::testing::AddGlobalTestEnvironment;
+using ::testing::Bool;
+using ::testing::Message;
+using ::testing::Range;
+using ::testing::TestWithParam;
+using ::testing::Values;
+using ::testing::ValuesIn;
+
+# if GTEST_HAS_COMBINE
+using ::testing::Combine;
+using ::std::tr1::get;
+using ::std::tr1::make_tuple;
+using ::std::tr1::tuple;
+# endif  // GTEST_HAS_COMBINE
+
+using ::testing::internal::ParamGenerator;
+using ::testing::internal::UnitTestOptions;
+
+// Prints a value to a string.
+//
+// TODO(wan at google.com): remove PrintValue() when we move matchers and
+// EXPECT_THAT() from Google Mock to Google Test.  At that time, we
+// can write EXPECT_THAT(x, Eq(y)) to compare two tuples x and y, as
+// EXPECT_THAT() and the matchers know how to print tuples.
+template <typename T>
+::std::string PrintValue(const T& value) {
+  ::std::stringstream stream;
+  stream << value;
+  return stream.str();
+}
+
+# if GTEST_HAS_COMBINE
+
+// These overloads allow printing tuples in our tests.  We cannot
+// define an operator<< for tuples, as that definition needs to be in
+// the std namespace in order to be picked up by Google Test via
+// Argument-Dependent Lookup, yet defining anything in the std
+// namespace in non-STL code is undefined behavior.
+
+template <typename T1, typename T2>
+::std::string PrintValue(const tuple<T1, T2>& value) {
+  ::std::stringstream stream;
+  stream << "(" << get<0>(value) << ", " << get<1>(value) << ")";
+  return stream.str();
+}
+
+template <typename T1, typename T2, typename T3>
+::std::string PrintValue(const tuple<T1, T2, T3>& value) {
+  ::std::stringstream stream;
+  stream << "(" << get<0>(value) << ", " << get<1>(value)
+         << ", "<< get<2>(value) << ")";
+  return stream.str();
+}
+
+template <typename T1, typename T2, typename T3, typename T4, typename T5,
+          typename T6, typename T7, typename T8, typename T9, typename T10>
+::std::string PrintValue(
+    const tuple<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>& value) {
+  ::std::stringstream stream;
+  stream << "(" << get<0>(value) << ", " << get<1>(value)
+         << ", "<< get<2>(value) << ", " << get<3>(value)
+         << ", "<< get<4>(value) << ", " << get<5>(value)
+         << ", "<< get<6>(value) << ", " << get<7>(value)
+         << ", "<< get<8>(value) << ", " << get<9>(value) << ")";
+  return stream.str();
+}
+
+# endif  // GTEST_HAS_COMBINE
+
+// Verifies that a sequence generated by the generator and accessed
+// via the iterator object matches the expected one using Google Test
+// assertions.
+template <typename T, size_t N>
+void VerifyGenerator(const ParamGenerator<T>& generator,
+                     const T (&expected_values)[N]) {
+  typename ParamGenerator<T>::iterator it = generator.begin();
+  for (size_t i = 0; i < N; ++i) {
+    ASSERT_FALSE(it == generator.end())
+        << "At element " << i << " when accessing via an iterator "
+        << "created with the copy constructor.\n";
+    // We cannot use EXPECT_EQ() here as the values may be tuples,
+    // which don't support <<.
+    EXPECT_TRUE(expected_values[i] == *it)
+        << "where i is " << i
+        << ", expected_values[i] is " << PrintValue(expected_values[i])
+        << ", *it is " << PrintValue(*it)
+        << ", and 'it' is an iterator created with the copy constructor.\n";
+    it++;
+  }
+  EXPECT_TRUE(it == generator.end())
+        << "At the presumed end of sequence when accessing via an iterator "
+        << "created with the copy constructor.\n";
+
+  // Test the iterator assignment. The following lines verify that
+  // the sequence accessed via an iterator initialized via the
+  // assignment operator (as opposed to a copy constructor) matches
+  // just the same.
+  it = generator.begin();
+  for (size_t i = 0; i < N; ++i) {
+    ASSERT_FALSE(it == generator.end())
+        << "At element " << i << " when accessing via an iterator "
+        << "created with the assignment operator.\n";
+    EXPECT_TRUE(expected_values[i] == *it)
+        << "where i is " << i
+        << ", expected_values[i] is " << PrintValue(expected_values[i])
+        << ", *it is " << PrintValue(*it)
+        << ", and 'it' is an iterator created with the copy constructor.\n";
+    it++;
+  }
+  EXPECT_TRUE(it == generator.end())
+        << "At the presumed end of sequence when accessing via an iterator "
+        << "created with the assignment operator.\n";
+}
+
+template <typename T>
+void VerifyGeneratorIsEmpty(const ParamGenerator<T>& generator) {
+  typename ParamGenerator<T>::iterator it = generator.begin();
+  EXPECT_TRUE(it == generator.end());
+
+  it = generator.begin();
+  EXPECT_TRUE(it == generator.end());
+}
+
+// Generator tests. They test that each of the provided generator functions
+// generates an expected sequence of values. The general test pattern
+// instantiates a generator using one of the generator functions,
+// checks the sequence produced by the generator using its iterator API,
+// and then resets the iterator back to the beginning of the sequence
+// and checks the sequence again.
+
+// Tests that iterators produced by generator functions conform to the
+// ForwardIterator concept.
+TEST(IteratorTest, ParamIteratorConformsToForwardIteratorConcept) {
+  const ParamGenerator<int> gen = Range(0, 10);
+  ParamGenerator<int>::iterator it = gen.begin();
+
+  // Verifies that iterator initialization works as expected.
+  ParamGenerator<int>::iterator it2 = it;
+  EXPECT_TRUE(*it == *it2) << "Initialized iterators must point to the "
+                           << "element same as its source points to";
+
+  // Verifies that iterator assignment works as expected.
+  it++;
+  EXPECT_FALSE(*it == *it2);
+  it2 = it;
+  EXPECT_TRUE(*it == *it2) << "Assigned iterators must point to the "
+                           << "element same as its source points to";
+
+  // Verifies that prefix operator++() returns *this.
+  EXPECT_EQ(&it, &(++it)) << "Result of the prefix operator++ must be "
+                          << "refer to the original object";
+
+  // Verifies that the result of the postfix operator++ points to the value
+  // pointed to by the original iterator.
+  int original_value = *it;  // Have to compute it outside of macro call to be
+                             // unaffected by the parameter evaluation order.
+  EXPECT_EQ(original_value, *(it++));
+
+  // Verifies that prefix and postfix operator++() advance an iterator
+  // all the same.
+  it2 = it;
+  it++;
+  ++it2;
+  EXPECT_TRUE(*it == *it2);
+}
+
+// Tests that Range() generates the expected sequence.
+TEST(RangeTest, IntRangeWithDefaultStep) {
+  const ParamGenerator<int> gen = Range(0, 3);
+  const int expected_values[] = {0, 1, 2};
+  VerifyGenerator(gen, expected_values);
+}
+
+// Edge case. Tests that Range() generates the single element sequence
+// as expected when provided with range limits that are equal.
+TEST(RangeTest, IntRangeSingleValue) {
+  const ParamGenerator<int> gen = Range(0, 1);
+  const int expected_values[] = {0};
+  VerifyGenerator(gen, expected_values);
+}
+
+// Edge case. Tests that Range() with generates empty sequence when
+// supplied with an empty range.
+TEST(RangeTest, IntRangeEmpty) {
+  const ParamGenerator<int> gen = Range(0, 0);
+  VerifyGeneratorIsEmpty(gen);
+}
+
+// Tests that Range() with custom step (greater then one) generates
+// the expected sequence.
+TEST(RangeTest, IntRangeWithCustomStep) {
+  const ParamGenerator<int> gen = Range(0, 9, 3);
+  const int expected_values[] = {0, 3, 6};
+  VerifyGenerator(gen, expected_values);
+}
+
+// Tests that Range() with custom step (greater then one) generates
+// the expected sequence when the last element does not fall on the
+// upper range limit. Sequences generated by Range() must not have
+// elements beyond the range limits.
+TEST(RangeTest, IntRangeWithCustomStepOverUpperBound) {
+  const ParamGenerator<int> gen = Range(0, 4, 3);
+  const int expected_values[] = {0, 3};
+  VerifyGenerator(gen, expected_values);
+}
+
+// Verifies that Range works with user-defined types that define
+// copy constructor, operator=(), operator+(), and operator<().
+class DogAdder {
+ public:
+  explicit DogAdder(const char* a_value) : value_(a_value) {}
+  DogAdder(const DogAdder& other) : value_(other.value_.c_str()) {}
+
+  DogAdder operator=(const DogAdder& other) {
+    if (this != &other)
+      value_ = other.value_;
+    return *this;
+  }
+  DogAdder operator+(const DogAdder& other) const {
+    Message msg;
+    msg << value_.c_str() << other.value_.c_str();
+    return DogAdder(msg.GetString().c_str());
+  }
+  bool operator<(const DogAdder& other) const {
+    return value_ < other.value_;
+  }
+  const std::string& value() const { return value_; }
+
+ private:
+  std::string value_;
+};
+
+TEST(RangeTest, WorksWithACustomType) {
+  const ParamGenerator<DogAdder> gen =
+      Range(DogAdder("cat"), DogAdder("catdogdog"), DogAdder("dog"));
+  ParamGenerator<DogAdder>::iterator it = gen.begin();
+
+  ASSERT_FALSE(it == gen.end());
+  EXPECT_STREQ("cat", it->value().c_str());
+
+  ASSERT_FALSE(++it == gen.end());
+  EXPECT_STREQ("catdog", it->value().c_str());
+
+  EXPECT_TRUE(++it == gen.end());
+}
+
+class IntWrapper {
+ public:
+  explicit IntWrapper(int a_value) : value_(a_value) {}
+  IntWrapper(const IntWrapper& other) : value_(other.value_) {}
+
+  IntWrapper operator=(const IntWrapper& other) {
+    value_ = other.value_;
+    return *this;
+  }
+  // operator+() adds a different type.
+  IntWrapper operator+(int other) const { return IntWrapper(value_ + other); }
+  bool operator<(const IntWrapper& other) const {
+    return value_ < other.value_;
+  }
+  int value() const { return value_; }
+
+ private:
+  int value_;
+};
+
+TEST(RangeTest, WorksWithACustomTypeWithDifferentIncrementType) {
+  const ParamGenerator<IntWrapper> gen = Range(IntWrapper(0), IntWrapper(2));
+  ParamGenerator<IntWrapper>::iterator it = gen.begin();
+
+  ASSERT_FALSE(it == gen.end());
+  EXPECT_EQ(0, it->value());
+
+  ASSERT_FALSE(++it == gen.end());
+  EXPECT_EQ(1, it->value());
+
+  EXPECT_TRUE(++it == gen.end());
+}
+
+// Tests that ValuesIn() with an array parameter generates
+// the expected sequence.
+TEST(ValuesInTest, ValuesInArray) {
+  int array[] = {3, 5, 8};
+  const ParamGenerator<int> gen = ValuesIn(array);
+  VerifyGenerator(gen, array);
+}
+
+// Tests that ValuesIn() with a const array parameter generates
+// the expected sequence.
+TEST(ValuesInTest, ValuesInConstArray) {
+  const int array[] = {3, 5, 8};
+  const ParamGenerator<int> gen = ValuesIn(array);
+  VerifyGenerator(gen, array);
+}
+
+// Edge case. Tests that ValuesIn() with an array parameter containing a
+// single element generates the single element sequence.
+TEST(ValuesInTest, ValuesInSingleElementArray) {
+  int array[] = {42};
+  const ParamGenerator<int> gen = ValuesIn(array);
+  VerifyGenerator(gen, array);
+}
+
+// Tests that ValuesIn() generates the expected sequence for an STL
+// container (vector).
+TEST(ValuesInTest, ValuesInVector) {
+  typedef ::std::vector<int> ContainerType;
+  ContainerType values;
+  values.push_back(3);
+  values.push_back(5);
+  values.push_back(8);
+  const ParamGenerator<int> gen = ValuesIn(values);
+
+  const int expected_values[] = {3, 5, 8};
+  VerifyGenerator(gen, expected_values);
+}
+
+// Tests that ValuesIn() generates the expected sequence.
+TEST(ValuesInTest, ValuesInIteratorRange) {
+  typedef ::std::vector<int> ContainerType;
+  ContainerType values;
+  values.push_back(3);
+  values.push_back(5);
+  values.push_back(8);
+  const ParamGenerator<int> gen = ValuesIn(values.begin(), values.end());
+
+  const int expected_values[] = {3, 5, 8};
+  VerifyGenerator(gen, expected_values);
+}
+
+// Edge case. Tests that ValuesIn() provided with an iterator range specifying a
+// single value generates a single-element sequence.
+TEST(ValuesInTest, ValuesInSingleElementIteratorRange) {
+  typedef ::std::vector<int> ContainerType;
+  ContainerType values;
+  values.push_back(42);
+  const ParamGenerator<int> gen = ValuesIn(values.begin(), values.end());
+
+  const int expected_values[] = {42};
+  VerifyGenerator(gen, expected_values);
+}
+
+// Edge case. Tests that ValuesIn() provided with an empty iterator range
+// generates an empty sequence.
+TEST(ValuesInTest, ValuesInEmptyIteratorRange) {
+  typedef ::std::vector<int> ContainerType;
+  ContainerType values;
+  const ParamGenerator<int> gen = ValuesIn(values.begin(), values.end());
+
+  VerifyGeneratorIsEmpty(gen);
+}
+
+// Tests that the Values() generates the expected sequence.
+TEST(ValuesTest, ValuesWorks) {
+  const ParamGenerator<int> gen = Values(3, 5, 8);
+
+  const int expected_values[] = {3, 5, 8};
+  VerifyGenerator(gen, expected_values);
+}
+
+// Tests that Values() generates the expected sequences from elements of
+// different types convertible to ParamGenerator's parameter type.
+TEST(ValuesTest, ValuesWorksForValuesOfCompatibleTypes) {
+  const ParamGenerator<double> gen = Values(3, 5.0f, 8.0);
+
+  const double expected_values[] = {3.0, 5.0, 8.0};
+  VerifyGenerator(gen, expected_values);
+}
+
+TEST(ValuesTest, ValuesWorksForMaxLengthList) {
+  const ParamGenerator<int> gen = Values(
+      10, 20, 30, 40, 50, 60, 70, 80, 90, 100,
+      110, 120, 130, 140, 150, 160, 170, 180, 190, 200,
+      210, 220, 230, 240, 250, 260, 270, 280, 290, 300,
+      310, 320, 330, 340, 350, 360, 370, 380, 390, 400,
+      410, 420, 430, 440, 450, 460, 470, 480, 490, 500);
+
+  const int expected_values[] = {
+      10, 20, 30, 40, 50, 60, 70, 80, 90, 100,
+      110, 120, 130, 140, 150, 160, 170, 180, 190, 200,
+      210, 220, 230, 240, 250, 260, 270, 280, 290, 300,
+      310, 320, 330, 340, 350, 360, 370, 380, 390, 400,
+      410, 420, 430, 440, 450, 460, 470, 480, 490, 500};
+  VerifyGenerator(gen, expected_values);
+}
+
+// Edge case test. Tests that single-parameter Values() generates the sequence
+// with the single value.
+TEST(ValuesTest, ValuesWithSingleParameter) {
+  const ParamGenerator<int> gen = Values(42);
+
+  const int expected_values[] = {42};
+  VerifyGenerator(gen, expected_values);
+}
+
+// Tests that Bool() generates sequence (false, true).
+TEST(BoolTest, BoolWorks) {
+  const ParamGenerator<bool> gen = Bool();
+
+  const bool expected_values[] = {false, true};
+  VerifyGenerator(gen, expected_values);
+}
+
+# if GTEST_HAS_COMBINE
+
+// Tests that Combine() with two parameters generates the expected sequence.
+TEST(CombineTest, CombineWithTwoParameters) {
+  const char* foo = "foo";
+  const char* bar = "bar";
+  const ParamGenerator<tuple<const char*, int> > gen =
+      Combine(Values(foo, bar), Values(3, 4));
+
+  tuple<const char*, int> expected_values[] = {
+    make_tuple(foo, 3), make_tuple(foo, 4),
+    make_tuple(bar, 3), make_tuple(bar, 4)};
+  VerifyGenerator(gen, expected_values);
+}
+
+// Tests that Combine() with three parameters generates the expected sequence.
+TEST(CombineTest, CombineWithThreeParameters) {
+  const ParamGenerator<tuple<int, int, int> > gen = Combine(Values(0, 1),
+                                                            Values(3, 4),
+                                                            Values(5, 6));
+  tuple<int, int, int> expected_values[] = {
+    make_tuple(0, 3, 5), make_tuple(0, 3, 6),
+    make_tuple(0, 4, 5), make_tuple(0, 4, 6),
+    make_tuple(1, 3, 5), make_tuple(1, 3, 6),
+    make_tuple(1, 4, 5), make_tuple(1, 4, 6)};
+  VerifyGenerator(gen, expected_values);
+}
+
+// Tests that the Combine() with the first parameter generating a single value
+// sequence generates a sequence with the number of elements equal to the
+// number of elements in the sequence generated by the second parameter.
+TEST(CombineTest, CombineWithFirstParameterSingleValue) {
+  const ParamGenerator<tuple<int, int> > gen = Combine(Values(42),
+                                                       Values(0, 1));
+
+  tuple<int, int> expected_values[] = {make_tuple(42, 0), make_tuple(42, 1)};
+  VerifyGenerator(gen, expected_values);
+}
+
+// Tests that the Combine() with the second parameter generating a single value
+// sequence generates a sequence with the number of elements equal to the
+// number of elements in the sequence generated by the first parameter.
+TEST(CombineTest, CombineWithSecondParameterSingleValue) {
+  const ParamGenerator<tuple<int, int> > gen = Combine(Values(0, 1),
+                                                       Values(42));
+
+  tuple<int, int> expected_values[] = {make_tuple(0, 42), make_tuple(1, 42)};
+  VerifyGenerator(gen, expected_values);
+}
+
+// Tests that when the first parameter produces an empty sequence,
+// Combine() produces an empty sequence, too.
+TEST(CombineTest, CombineWithFirstParameterEmptyRange) {
+  const ParamGenerator<tuple<int, int> > gen = Combine(Range(0, 0),
+                                                       Values(0, 1));
+  VerifyGeneratorIsEmpty(gen);
+}
+
+// Tests that when the second parameter produces an empty sequence,
+// Combine() produces an empty sequence, too.
+TEST(CombineTest, CombineWithSecondParameterEmptyRange) {
+  const ParamGenerator<tuple<int, int> > gen = Combine(Values(0, 1),
+                                                       Range(1, 1));
+  VerifyGeneratorIsEmpty(gen);
+}
+
+// Edge case. Tests that combine works with the maximum number
+// of parameters supported by Google Test (currently 10).
+TEST(CombineTest, CombineWithMaxNumberOfParameters) {
+  const char* foo = "foo";
+  const char* bar = "bar";
+  const ParamGenerator<tuple<const char*, int, int, int, int, int, int, int,
+                             int, int> > gen = Combine(Values(foo, bar),
+                                                       Values(1), Values(2),
+                                                       Values(3), Values(4),
+                                                       Values(5), Values(6),
+                                                       Values(7), Values(8),
+                                                       Values(9));
+
+  tuple<const char*, int, int, int, int, int, int, int, int, int>
+      expected_values[] = {make_tuple(foo, 1, 2, 3, 4, 5, 6, 7, 8, 9),
+                           make_tuple(bar, 1, 2, 3, 4, 5, 6, 7, 8, 9)};
+  VerifyGenerator(gen, expected_values);
+}
+
+# endif  // GTEST_HAS_COMBINE
+
+// Tests that an generator produces correct sequence after being
+// assigned from another generator.
+TEST(ParamGeneratorTest, AssignmentWorks) {
+  ParamGenerator<int> gen = Values(1, 2);
+  const ParamGenerator<int> gen2 = Values(3, 4);
+  gen = gen2;
+
+  const int expected_values[] = {3, 4};
+  VerifyGenerator(gen, expected_values);
+}
+
+// This test verifies that the tests are expanded and run as specified:
+// one test per element from the sequence produced by the generator
+// specified in INSTANTIATE_TEST_CASE_P. It also verifies that the test's
+// fixture constructor, SetUp(), and TearDown() have run and have been
+// supplied with the correct parameters.
+
+// The use of environment object allows detection of the case where no test
+// case functionality is run at all. In this case TestCaseTearDown will not
+// be able to detect missing tests, naturally.
+template <int kExpectedCalls>
+class TestGenerationEnvironment : public ::testing::Environment {
+ public:
+  static TestGenerationEnvironment* Instance() {
+    static TestGenerationEnvironment* instance = new TestGenerationEnvironment;
+    return instance;
+  }
+
+  void FixtureConstructorExecuted() { fixture_constructor_count_++; }
+  void SetUpExecuted() { set_up_count_++; }
+  void TearDownExecuted() { tear_down_count_++; }
+  void TestBodyExecuted() { test_body_count_++; }
+
+  virtual void TearDown() {
+    // If all MultipleTestGenerationTest tests have been de-selected
+    // by the filter flag, the following checks make no sense.
+    bool perform_check = false;
+
+    for (int i = 0; i < kExpectedCalls; ++i) {
+      Message msg;
+      msg << "TestsExpandedAndRun/" << i;
+      if (UnitTestOptions::FilterMatchesTest(
+             "TestExpansionModule/MultipleTestGenerationTest",
+              msg.GetString().c_str())) {
+        perform_check = true;
+      }
+    }
+    if (perform_check) {
+      EXPECT_EQ(kExpectedCalls, fixture_constructor_count_)
+          << "Fixture constructor of ParamTestGenerationTest test case "
+          << "has not been run as expected.";
+      EXPECT_EQ(kExpectedCalls, set_up_count_)
+          << "Fixture SetUp method of ParamTestGenerationTest test case "
+          << "has not been run as expected.";
+      EXPECT_EQ(kExpectedCalls, tear_down_count_)
+          << "Fixture TearDown method of ParamTestGenerationTest test case "
+          << "has not been run as expected.";
+      EXPECT_EQ(kExpectedCalls, test_body_count_)
+          << "Test in ParamTestGenerationTest test case "
+          << "has not been run as expected.";
+    }
+  }
+
+ private:
+  TestGenerationEnvironment() : fixture_constructor_count_(0), set_up_count_(0),
+                                tear_down_count_(0), test_body_count_(0) {}
+
+  int fixture_constructor_count_;
+  int set_up_count_;
+  int tear_down_count_;
+  int test_body_count_;
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(TestGenerationEnvironment);
+};
+
+const int test_generation_params[] = {36, 42, 72};
+
+class TestGenerationTest : public TestWithParam<int> {
+ public:
+  enum {
+    PARAMETER_COUNT =
+        sizeof(test_generation_params)/sizeof(test_generation_params[0])
+  };
+
+  typedef TestGenerationEnvironment<PARAMETER_COUNT> Environment;
+
+  TestGenerationTest() {
+    Environment::Instance()->FixtureConstructorExecuted();
+    current_parameter_ = GetParam();
+  }
+  virtual void SetUp() {
+    Environment::Instance()->SetUpExecuted();
+    EXPECT_EQ(current_parameter_, GetParam());
+  }
+  virtual void TearDown() {
+    Environment::Instance()->TearDownExecuted();
+    EXPECT_EQ(current_parameter_, GetParam());
+  }
+
+  static void SetUpTestCase() {
+    bool all_tests_in_test_case_selected = true;
+
+    for (int i = 0; i < PARAMETER_COUNT; ++i) {
+      Message test_name;
+      test_name << "TestsExpandedAndRun/" << i;
+      if ( !UnitTestOptions::FilterMatchesTest(
+                "TestExpansionModule/MultipleTestGenerationTest",
+                test_name.GetString())) {
+        all_tests_in_test_case_selected = false;
+      }
+    }
+    EXPECT_TRUE(all_tests_in_test_case_selected)
+        << "When running the TestGenerationTest test case all of its tests\n"
+        << "must be selected by the filter flag for the test case to pass.\n"
+        << "If not all of them are enabled, we can't reliably conclude\n"
+        << "that the correct number of tests have been generated.";
+
+    collected_parameters_.clear();
+  }
+
+  static void TearDownTestCase() {
+    vector<int> expected_values(test_generation_params,
+                                test_generation_params + PARAMETER_COUNT);
+    // Test execution order is not guaranteed by Google Test,
+    // so the order of values in collected_parameters_ can be
+    // different and we have to sort to compare.
+    sort(expected_values.begin(), expected_values.end());
+    sort(collected_parameters_.begin(), collected_parameters_.end());
+
+    EXPECT_TRUE(collected_parameters_ == expected_values);
+  }
+
+ protected:
+  int current_parameter_;
+  static vector<int> collected_parameters_;
+
+ private:
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(TestGenerationTest);
+};
+vector<int> TestGenerationTest::collected_parameters_;
+
+TEST_P(TestGenerationTest, TestsExpandedAndRun) {
+  Environment::Instance()->TestBodyExecuted();
+  EXPECT_EQ(current_parameter_, GetParam());
+  collected_parameters_.push_back(GetParam());
+}
+INSTANTIATE_TEST_CASE_P(TestExpansionModule, TestGenerationTest,
+                        ValuesIn(test_generation_params));
+
+// This test verifies that the element sequence (third parameter of
+// INSTANTIATE_TEST_CASE_P) is evaluated in InitGoogleTest() and neither at
+// the call site of INSTANTIATE_TEST_CASE_P nor in RUN_ALL_TESTS().  For
+// that, we declare param_value_ to be a static member of
+// GeneratorEvaluationTest and initialize it to 0.  We set it to 1 in
+// main(), just before invocation of InitGoogleTest().  After calling
+// InitGoogleTest(), we set the value to 2.  If the sequence is evaluated
+// before or after InitGoogleTest, INSTANTIATE_TEST_CASE_P will create a
+// test with parameter other than 1, and the test body will fail the
+// assertion.
+class GeneratorEvaluationTest : public TestWithParam<int> {
+ public:
+  static int param_value() { return param_value_; }
+  static void set_param_value(int param_value) { param_value_ = param_value; }
+
+ private:
+  static int param_value_;
+};
+int GeneratorEvaluationTest::param_value_ = 0;
+
+TEST_P(GeneratorEvaluationTest, GeneratorsEvaluatedInMain) {
+  EXPECT_EQ(1, GetParam());
+}
+INSTANTIATE_TEST_CASE_P(GenEvalModule,
+                        GeneratorEvaluationTest,
+                        Values(GeneratorEvaluationTest::param_value()));
+
+// Tests that generators defined in a different translation unit are
+// functional. Generator extern_gen is defined in gtest-param-test_test2.cc.
+extern ParamGenerator<int> extern_gen;
+class ExternalGeneratorTest : public TestWithParam<int> {};
+TEST_P(ExternalGeneratorTest, ExternalGenerator) {
+  // Sequence produced by extern_gen contains only a single value
+  // which we verify here.
+  EXPECT_EQ(GetParam(), 33);
+}
+INSTANTIATE_TEST_CASE_P(ExternalGeneratorModule,
+                        ExternalGeneratorTest,
+                        extern_gen);
+
+// Tests that a parameterized test case can be defined in one translation
+// unit and instantiated in another. This test will be instantiated in
+// gtest-param-test_test2.cc. ExternalInstantiationTest fixture class is
+// defined in gtest-param-test_test.h.
+TEST_P(ExternalInstantiationTest, IsMultipleOf33) {
+  EXPECT_EQ(0, GetParam() % 33);
+}
+
+// Tests that a parameterized test case can be instantiated with multiple
+// generators.
+class MultipleInstantiationTest : public TestWithParam<int> {};
+TEST_P(MultipleInstantiationTest, AllowsMultipleInstances) {
+}
+INSTANTIATE_TEST_CASE_P(Sequence1, MultipleInstantiationTest, Values(1, 2));
+INSTANTIATE_TEST_CASE_P(Sequence2, MultipleInstantiationTest, Range(3, 5));
+
+// Tests that a parameterized test case can be instantiated
+// in multiple translation units. This test will be instantiated
+// here and in gtest-param-test_test2.cc.
+// InstantiationInMultipleTranslationUnitsTest fixture class
+// is defined in gtest-param-test_test.h.
+TEST_P(InstantiationInMultipleTranslaionUnitsTest, IsMultipleOf42) {
+  EXPECT_EQ(0, GetParam() % 42);
+}
+INSTANTIATE_TEST_CASE_P(Sequence1,
+                        InstantiationInMultipleTranslaionUnitsTest,
+                        Values(42, 42*2));
+
+// Tests that each iteration of parameterized test runs in a separate test
+// object.
+class SeparateInstanceTest : public TestWithParam<int> {
+ public:
+  SeparateInstanceTest() : count_(0) {}
+
+  static void TearDownTestCase() {
+    EXPECT_GE(global_count_, 2)
+        << "If some (but not all) SeparateInstanceTest tests have been "
+        << "filtered out this test will fail. Make sure that all "
+        << "GeneratorEvaluationTest are selected or de-selected together "
+        << "by the test filter.";
+  }
+
+ protected:
+  int count_;
+  static int global_count_;
+};
+int SeparateInstanceTest::global_count_ = 0;
+
+TEST_P(SeparateInstanceTest, TestsRunInSeparateInstances) {
+  EXPECT_EQ(0, count_++);
+  global_count_++;
+}
+INSTANTIATE_TEST_CASE_P(FourElemSequence, SeparateInstanceTest, Range(1, 4));
+
+// Tests that all instantiations of a test have named appropriately. Test
+// defined with TEST_P(TestCaseName, TestName) and instantiated with
+// INSTANTIATE_TEST_CASE_P(SequenceName, TestCaseName, generator) must be named
+// SequenceName/TestCaseName.TestName/i, where i is the 0-based index of the
+// sequence element used to instantiate the test.
+class NamingTest : public TestWithParam<int> {};
+
+TEST_P(NamingTest, TestsReportCorrectNamesAndParameters) {
+  const ::testing::TestInfo* const test_info =
+     ::testing::UnitTest::GetInstance()->current_test_info();
+
+  EXPECT_STREQ("ZeroToFiveSequence/NamingTest", test_info->test_case_name());
+
+  Message index_stream;
+  index_stream << "TestsReportCorrectNamesAndParameters/" << GetParam();
+  EXPECT_STREQ(index_stream.GetString().c_str(), test_info->name());
+
+  EXPECT_EQ(::testing::PrintToString(GetParam()), test_info->value_param());
+}
+
+INSTANTIATE_TEST_CASE_P(ZeroToFiveSequence, NamingTest, Range(0, 5));
+
+// Class that cannot be streamed into an ostream.  It needs to be copyable
+// (and, in case of MSVC, also assignable) in order to be a test parameter
+// type.  Its default copy constructor and assignment operator do exactly
+// what we need.
+class Unstreamable {
+ public:
+  explicit Unstreamable(int value) : value_(value) {}
+
+ private:
+  int value_;
+};
+
+class CommentTest : public TestWithParam<Unstreamable> {};
+
+TEST_P(CommentTest, TestsCorrectlyReportUnstreamableParams) {
+  const ::testing::TestInfo* const test_info =
+     ::testing::UnitTest::GetInstance()->current_test_info();
+
+  EXPECT_EQ(::testing::PrintToString(GetParam()), test_info->value_param());
+}
+
+INSTANTIATE_TEST_CASE_P(InstantiationWithComments,
+                        CommentTest,
+                        Values(Unstreamable(1)));
+
+// Verify that we can create a hierarchy of test fixtures, where the base
+// class fixture is not parameterized and the derived class is. In this case
+// ParameterizedDerivedTest inherits from NonParameterizedBaseTest.  We
+// perform simple tests on both.
+class NonParameterizedBaseTest : public ::testing::Test {
+ public:
+  NonParameterizedBaseTest() : n_(17) { }
+ protected:
+  int n_;
+};
+
+class ParameterizedDerivedTest : public NonParameterizedBaseTest,
+                                 public ::testing::WithParamInterface<int> {
+ protected:
+  ParameterizedDerivedTest() : count_(0) { }
+  int count_;
+  static int global_count_;
+};
+
+int ParameterizedDerivedTest::global_count_ = 0;
+
+TEST_F(NonParameterizedBaseTest, FixtureIsInitialized) {
+  EXPECT_EQ(17, n_);
+}
+
+TEST_P(ParameterizedDerivedTest, SeesSequence) {
+  EXPECT_EQ(17, n_);
+  EXPECT_EQ(0, count_++);
+  EXPECT_EQ(GetParam(), global_count_++);
+}
+
+class ParameterizedDeathTest : public ::testing::TestWithParam<int> { };
+
+TEST_F(ParameterizedDeathTest, GetParamDiesFromTestF) {
+  EXPECT_DEATH_IF_SUPPORTED(GetParam(),
+                            ".* value-parameterized test .*");
+}
+
+INSTANTIATE_TEST_CASE_P(RangeZeroToFive, ParameterizedDerivedTest, Range(0, 5));
+
+#endif  // GTEST_HAS_PARAM_TEST
+
+TEST(CompileTest, CombineIsDefinedOnlyWhenGtestHasParamTestIsDefined) {
+#if GTEST_HAS_COMBINE && !GTEST_HAS_PARAM_TEST
+  FAIL() << "GTEST_HAS_COMBINE is defined while GTEST_HAS_PARAM_TEST is not\n"
+#endif
+}
+
+int main(int argc, char **argv) {
+#if GTEST_HAS_PARAM_TEST
+  // Used in TestGenerationTest test case.
+  AddGlobalTestEnvironment(TestGenerationTest::Environment::Instance());
+  // Used in GeneratorEvaluationTest test case. Tests that the updated value
+  // will be picked up for instantiating tests in GeneratorEvaluationTest.
+  GeneratorEvaluationTest::set_param_value(1);
+#endif  // GTEST_HAS_PARAM_TEST
+
+  ::testing::InitGoogleTest(&argc, argv);
+
+#if GTEST_HAS_PARAM_TEST
+  // Used in GeneratorEvaluationTest test case. Tests that value updated
+  // here will NOT be used for instantiating tests in
+  // GeneratorEvaluationTest.
+  GeneratorEvaluationTest::set_param_value(2);
+#endif  // GTEST_HAS_PARAM_TEST
+
+  return RUN_ALL_TESTS();
+}
diff --git a/contrib/gtest-1.7.0/test/gtest-param-test_test.h b/contrib/gtest-1.7.0/test/gtest-param-test_test.h
new file mode 100644
index 0000000..26ea122
--- /dev/null
+++ b/contrib/gtest-1.7.0/test/gtest-param-test_test.h
@@ -0,0 +1,57 @@
+// Copyright 2008, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Authors: vladl at google.com (Vlad Losev)
+//
+// The Google C++ Testing Framework (Google Test)
+//
+// This header file provides classes and functions used internally
+// for testing Google Test itself.
+
+#ifndef GTEST_TEST_GTEST_PARAM_TEST_TEST_H_
+#define GTEST_TEST_GTEST_PARAM_TEST_TEST_H_
+
+#include "gtest/gtest.h"
+
+#if GTEST_HAS_PARAM_TEST
+
+// Test fixture for testing definition and instantiation of a test
+// in separate translation units.
+class ExternalInstantiationTest : public ::testing::TestWithParam<int> {
+};
+
+// Test fixture for testing instantiation of a test in multiple
+// translation units.
+class InstantiationInMultipleTranslaionUnitsTest
+    : public ::testing::TestWithParam<int> {
+};
+
+#endif  // GTEST_HAS_PARAM_TEST
+
+#endif  // GTEST_TEST_GTEST_PARAM_TEST_TEST_H_
diff --git a/contrib/gtest-1.7.0/test/gtest-port_test.cc b/contrib/gtest-1.7.0/test/gtest-port_test.cc
new file mode 100644
index 0000000..43f1f20
--- /dev/null
+++ b/contrib/gtest-1.7.0/test/gtest-port_test.cc
@@ -0,0 +1,1253 @@
+// Copyright 2008, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Authors: vladl at google.com (Vlad Losev), wan at google.com (Zhanyong Wan)
+//
+// This file tests the internal cross-platform support utilities.
+
+#include "gtest/internal/gtest-port.h"
+
+#include <stdio.h>
+
+#if GTEST_OS_MAC
+# include <time.h>
+#endif  // GTEST_OS_MAC
+
+#include <list>
+#include <utility>  // For std::pair and std::make_pair.
+#include <vector>
+
+#include "gtest/gtest.h"
+#include "gtest/gtest-spi.h"
+
+// Indicates that this translation unit is part of Google Test's
+// implementation.  It must come before gtest-internal-inl.h is
+// included, or there will be a compiler error.  This trick is to
+// prevent a user from accidentally including gtest-internal-inl.h in
+// his code.
+#define GTEST_IMPLEMENTATION_ 1
+#include "src/gtest-internal-inl.h"
+#undef GTEST_IMPLEMENTATION_
+
+using std::make_pair;
+using std::pair;
+
+namespace testing {
+namespace internal {
+
+TEST(IsXDigitTest, WorksForNarrowAscii) {
+  EXPECT_TRUE(IsXDigit('0'));
+  EXPECT_TRUE(IsXDigit('9'));
+  EXPECT_TRUE(IsXDigit('A'));
+  EXPECT_TRUE(IsXDigit('F'));
+  EXPECT_TRUE(IsXDigit('a'));
+  EXPECT_TRUE(IsXDigit('f'));
+
+  EXPECT_FALSE(IsXDigit('-'));
+  EXPECT_FALSE(IsXDigit('g'));
+  EXPECT_FALSE(IsXDigit('G'));
+}
+
+TEST(IsXDigitTest, ReturnsFalseForNarrowNonAscii) {
+  EXPECT_FALSE(IsXDigit(static_cast<char>(0x80)));
+  EXPECT_FALSE(IsXDigit(static_cast<char>('0' | 0x80)));
+}
+
+TEST(IsXDigitTest, WorksForWideAscii) {
+  EXPECT_TRUE(IsXDigit(L'0'));
+  EXPECT_TRUE(IsXDigit(L'9'));
+  EXPECT_TRUE(IsXDigit(L'A'));
+  EXPECT_TRUE(IsXDigit(L'F'));
+  EXPECT_TRUE(IsXDigit(L'a'));
+  EXPECT_TRUE(IsXDigit(L'f'));
+
+  EXPECT_FALSE(IsXDigit(L'-'));
+  EXPECT_FALSE(IsXDigit(L'g'));
+  EXPECT_FALSE(IsXDigit(L'G'));
+}
+
+TEST(IsXDigitTest, ReturnsFalseForWideNonAscii) {
+  EXPECT_FALSE(IsXDigit(static_cast<wchar_t>(0x80)));
+  EXPECT_FALSE(IsXDigit(static_cast<wchar_t>(L'0' | 0x80)));
+  EXPECT_FALSE(IsXDigit(static_cast<wchar_t>(L'0' | 0x100)));
+}
+
+class Base {
+ public:
+  // Copy constructor and assignment operator do exactly what we need, so we
+  // use them.
+  Base() : member_(0) {}
+  explicit Base(int n) : member_(n) {}
+  virtual ~Base() {}
+  int member() { return member_; }
+
+ private:
+  int member_;
+};
+
+class Derived : public Base {
+ public:
+  explicit Derived(int n) : Base(n) {}
+};
+
+TEST(ImplicitCastTest, ConvertsPointers) {
+  Derived derived(0);
+  EXPECT_TRUE(&derived == ::testing::internal::ImplicitCast_<Base*>(&derived));
+}
+
+TEST(ImplicitCastTest, CanUseInheritance) {
+  Derived derived(1);
+  Base base = ::testing::internal::ImplicitCast_<Base>(derived);
+  EXPECT_EQ(derived.member(), base.member());
+}
+
+class Castable {
+ public:
+  explicit Castable(bool* converted) : converted_(converted) {}
+  operator Base() {
+    *converted_ = true;
+    return Base();
+  }
+
+ private:
+  bool* converted_;
+};
+
+TEST(ImplicitCastTest, CanUseNonConstCastOperator) {
+  bool converted = false;
+  Castable castable(&converted);
+  Base base = ::testing::internal::ImplicitCast_<Base>(castable);
+  EXPECT_TRUE(converted);
+}
+
+class ConstCastable {
+ public:
+  explicit ConstCastable(bool* converted) : converted_(converted) {}
+  operator Base() const {
+    *converted_ = true;
+    return Base();
+  }
+
+ private:
+  bool* converted_;
+};
+
+TEST(ImplicitCastTest, CanUseConstCastOperatorOnConstValues) {
+  bool converted = false;
+  const ConstCastable const_castable(&converted);
+  Base base = ::testing::internal::ImplicitCast_<Base>(const_castable);
+  EXPECT_TRUE(converted);
+}
+
+class ConstAndNonConstCastable {
+ public:
+  ConstAndNonConstCastable(bool* converted, bool* const_converted)
+      : converted_(converted), const_converted_(const_converted) {}
+  operator Base() {
+    *converted_ = true;
+    return Base();
+  }
+  operator Base() const {
+    *const_converted_ = true;
+    return Base();
+  }
+
+ private:
+  bool* converted_;
+  bool* const_converted_;
+};
+
+TEST(ImplicitCastTest, CanSelectBetweenConstAndNonConstCasrAppropriately) {
+  bool converted = false;
+  bool const_converted = false;
+  ConstAndNonConstCastable castable(&converted, &const_converted);
+  Base base = ::testing::internal::ImplicitCast_<Base>(castable);
+  EXPECT_TRUE(converted);
+  EXPECT_FALSE(const_converted);
+
+  converted = false;
+  const_converted = false;
+  const ConstAndNonConstCastable const_castable(&converted, &const_converted);
+  base = ::testing::internal::ImplicitCast_<Base>(const_castable);
+  EXPECT_FALSE(converted);
+  EXPECT_TRUE(const_converted);
+}
+
+class To {
+ public:
+  To(bool* converted) { *converted = true; }  // NOLINT
+};
+
+TEST(ImplicitCastTest, CanUseImplicitConstructor) {
+  bool converted = false;
+  To to = ::testing::internal::ImplicitCast_<To>(&converted);
+  (void)to;
+  EXPECT_TRUE(converted);
+}
+
+TEST(IteratorTraitsTest, WorksForSTLContainerIterators) {
+  StaticAssertTypeEq<int,
+      IteratorTraits< ::std::vector<int>::const_iterator>::value_type>();
+  StaticAssertTypeEq<bool,
+      IteratorTraits< ::std::list<bool>::iterator>::value_type>();
+}
+
+TEST(IteratorTraitsTest, WorksForPointerToNonConst) {
+  StaticAssertTypeEq<char, IteratorTraits<char*>::value_type>();
+  StaticAssertTypeEq<const void*, IteratorTraits<const void**>::value_type>();
+}
+
+TEST(IteratorTraitsTest, WorksForPointerToConst) {
+  StaticAssertTypeEq<char, IteratorTraits<const char*>::value_type>();
+  StaticAssertTypeEq<const void*,
+      IteratorTraits<const void* const*>::value_type>();
+}
+
+// Tests that the element_type typedef is available in scoped_ptr and refers
+// to the parameter type.
+TEST(ScopedPtrTest, DefinesElementType) {
+  StaticAssertTypeEq<int, ::testing::internal::scoped_ptr<int>::element_type>();
+}
+
+// TODO(vladl at google.com): Implement THE REST of scoped_ptr tests.
+
+TEST(GtestCheckSyntaxTest, BehavesLikeASingleStatement) {
+  if (AlwaysFalse())
+    GTEST_CHECK_(false) << "This should never be executed; "
+                           "It's a compilation test only.";
+
+  if (AlwaysTrue())
+    GTEST_CHECK_(true);
+  else
+    ;  // NOLINT
+
+  if (AlwaysFalse())
+    ;  // NOLINT
+  else
+    GTEST_CHECK_(true) << "";
+}
+
+TEST(GtestCheckSyntaxTest, WorksWithSwitch) {
+  switch (0) {
+    case 1:
+      break;
+    default:
+      GTEST_CHECK_(true);
+  }
+
+  switch (0)
+    case 0:
+      GTEST_CHECK_(true) << "Check failed in switch case";
+}
+
+// Verifies behavior of FormatFileLocation.
+TEST(FormatFileLocationTest, FormatsFileLocation) {
+  EXPECT_PRED_FORMAT2(IsSubstring, "foo.cc", FormatFileLocation("foo.cc", 42));
+  EXPECT_PRED_FORMAT2(IsSubstring, "42", FormatFileLocation("foo.cc", 42));
+}
+
+TEST(FormatFileLocationTest, FormatsUnknownFile) {
+  EXPECT_PRED_FORMAT2(
+      IsSubstring, "unknown file", FormatFileLocation(NULL, 42));
+  EXPECT_PRED_FORMAT2(IsSubstring, "42", FormatFileLocation(NULL, 42));
+}
+
+TEST(FormatFileLocationTest, FormatsUknownLine) {
+  EXPECT_EQ("foo.cc:", FormatFileLocation("foo.cc", -1));
+}
+
+TEST(FormatFileLocationTest, FormatsUknownFileAndLine) {
+  EXPECT_EQ("unknown file:", FormatFileLocation(NULL, -1));
+}
+
+// Verifies behavior of FormatCompilerIndependentFileLocation.
+TEST(FormatCompilerIndependentFileLocationTest, FormatsFileLocation) {
+  EXPECT_EQ("foo.cc:42", FormatCompilerIndependentFileLocation("foo.cc", 42));
+}
+
+TEST(FormatCompilerIndependentFileLocationTest, FormatsUknownFile) {
+  EXPECT_EQ("unknown file:42",
+            FormatCompilerIndependentFileLocation(NULL, 42));
+}
+
+TEST(FormatCompilerIndependentFileLocationTest, FormatsUknownLine) {
+  EXPECT_EQ("foo.cc", FormatCompilerIndependentFileLocation("foo.cc", -1));
+}
+
+TEST(FormatCompilerIndependentFileLocationTest, FormatsUknownFileAndLine) {
+  EXPECT_EQ("unknown file", FormatCompilerIndependentFileLocation(NULL, -1));
+}
+
+#if GTEST_OS_MAC || GTEST_OS_QNX
+void* ThreadFunc(void* data) {
+  pthread_mutex_t* mutex = static_cast<pthread_mutex_t*>(data);
+  pthread_mutex_lock(mutex);
+  pthread_mutex_unlock(mutex);
+  return NULL;
+}
+
+TEST(GetThreadCountTest, ReturnsCorrectValue) {
+  EXPECT_EQ(1U, GetThreadCount());
+  pthread_mutex_t mutex;
+  pthread_attr_t  attr;
+  pthread_t       thread_id;
+
+  // TODO(vladl at google.com): turn mutex into internal::Mutex for automatic
+  // destruction.
+  pthread_mutex_init(&mutex, NULL);
+  pthread_mutex_lock(&mutex);
+  ASSERT_EQ(0, pthread_attr_init(&attr));
+  ASSERT_EQ(0, pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE));
+
+  const int status = pthread_create(&thread_id, &attr, &ThreadFunc, &mutex);
+  ASSERT_EQ(0, pthread_attr_destroy(&attr));
+  ASSERT_EQ(0, status);
+  EXPECT_EQ(2U, GetThreadCount());
+  pthread_mutex_unlock(&mutex);
+
+  void* dummy;
+  ASSERT_EQ(0, pthread_join(thread_id, &dummy));
+
+# if GTEST_OS_MAC
+
+  // MacOS X may not immediately report the updated thread count after
+  // joining a thread, causing flakiness in this test. To counter that, we
+  // wait for up to .5 seconds for the OS to report the correct value.
+  for (int i = 0; i < 5; ++i) {
+    if (GetThreadCount() == 1)
+      break;
+
+    SleepMilliseconds(100);
+  }
+
+# endif  // GTEST_OS_MAC
+
+  EXPECT_EQ(1U, GetThreadCount());
+  pthread_mutex_destroy(&mutex);
+}
+#else
+TEST(GetThreadCountTest, ReturnsZeroWhenUnableToCountThreads) {
+  EXPECT_EQ(0U, GetThreadCount());
+}
+#endif  // GTEST_OS_MAC || GTEST_OS_QNX
+
+TEST(GtestCheckDeathTest, DiesWithCorrectOutputOnFailure) {
+  const bool a_false_condition = false;
+  const char regex[] =
+#ifdef _MSC_VER
+     "gtest-port_test\\.cc\\(\\d+\\):"
+#elif GTEST_USES_POSIX_RE
+     "gtest-port_test\\.cc:[0-9]+"
+#else
+     "gtest-port_test\\.cc:\\d+"
+#endif  // _MSC_VER
+     ".*a_false_condition.*Extra info.*";
+
+  EXPECT_DEATH_IF_SUPPORTED(GTEST_CHECK_(a_false_condition) << "Extra info",
+                            regex);
+}
+
+#if GTEST_HAS_DEATH_TEST
+
+TEST(GtestCheckDeathTest, LivesSilentlyOnSuccess) {
+  EXPECT_EXIT({
+      GTEST_CHECK_(true) << "Extra info";
+      ::std::cerr << "Success\n";
+      exit(0); },
+      ::testing::ExitedWithCode(0), "Success");
+}
+
+#endif  // GTEST_HAS_DEATH_TEST
+
+// Verifies that Google Test choose regular expression engine appropriate to
+// the platform. The test will produce compiler errors in case of failure.
+// For simplicity, we only cover the most important platforms here.
+TEST(RegexEngineSelectionTest, SelectsCorrectRegexEngine) {
+#if GTEST_HAS_POSIX_RE
+
+  EXPECT_TRUE(GTEST_USES_POSIX_RE);
+
+#else
+
+  EXPECT_TRUE(GTEST_USES_SIMPLE_RE);
+
+#endif
+}
+
+#if GTEST_USES_POSIX_RE
+
+# if GTEST_HAS_TYPED_TEST
+
+template <typename Str>
+class RETest : public ::testing::Test {};
+
+// Defines StringTypes as the list of all string types that class RE
+// supports.
+typedef testing::Types<
+    ::std::string,
+#  if GTEST_HAS_GLOBAL_STRING
+    ::string,
+#  endif  // GTEST_HAS_GLOBAL_STRING
+    const char*> StringTypes;
+
+TYPED_TEST_CASE(RETest, StringTypes);
+
+// Tests RE's implicit constructors.
+TYPED_TEST(RETest, ImplicitConstructorWorks) {
+  const RE empty(TypeParam(""));
+  EXPECT_STREQ("", empty.pattern());
+
+  const RE simple(TypeParam("hello"));
+  EXPECT_STREQ("hello", simple.pattern());
+
+  const RE normal(TypeParam(".*(\\w+)"));
+  EXPECT_STREQ(".*(\\w+)", normal.pattern());
+}
+
+// Tests that RE's constructors reject invalid regular expressions.
+TYPED_TEST(RETest, RejectsInvalidRegex) {
+  EXPECT_NONFATAL_FAILURE({
+    const RE invalid(TypeParam("?"));
+  }, "\"?\" is not a valid POSIX Extended regular expression.");
+}
+
+// Tests RE::FullMatch().
+TYPED_TEST(RETest, FullMatchWorks) {
+  const RE empty(TypeParam(""));
+  EXPECT_TRUE(RE::FullMatch(TypeParam(""), empty));
+  EXPECT_FALSE(RE::FullMatch(TypeParam("a"), empty));
+
+  const RE re(TypeParam("a.*z"));
+  EXPECT_TRUE(RE::FullMatch(TypeParam("az"), re));
+  EXPECT_TRUE(RE::FullMatch(TypeParam("axyz"), re));
+  EXPECT_FALSE(RE::FullMatch(TypeParam("baz"), re));
+  EXPECT_FALSE(RE::FullMatch(TypeParam("azy"), re));
+}
+
+// Tests RE::PartialMatch().
+TYPED_TEST(RETest, PartialMatchWorks) {
+  const RE empty(TypeParam(""));
+  EXPECT_TRUE(RE::PartialMatch(TypeParam(""), empty));
+  EXPECT_TRUE(RE::PartialMatch(TypeParam("a"), empty));
+
+  const RE re(TypeParam("a.*z"));
+  EXPECT_TRUE(RE::PartialMatch(TypeParam("az"), re));
+  EXPECT_TRUE(RE::PartialMatch(TypeParam("axyz"), re));
+  EXPECT_TRUE(RE::PartialMatch(TypeParam("baz"), re));
+  EXPECT_TRUE(RE::PartialMatch(TypeParam("azy"), re));
+  EXPECT_FALSE(RE::PartialMatch(TypeParam("zza"), re));
+}
+
+# endif  // GTEST_HAS_TYPED_TEST
+
+#elif GTEST_USES_SIMPLE_RE
+
+TEST(IsInSetTest, NulCharIsNotInAnySet) {
+  EXPECT_FALSE(IsInSet('\0', ""));
+  EXPECT_FALSE(IsInSet('\0', "\0"));
+  EXPECT_FALSE(IsInSet('\0', "a"));
+}
+
+TEST(IsInSetTest, WorksForNonNulChars) {
+  EXPECT_FALSE(IsInSet('a', "Ab"));
+  EXPECT_FALSE(IsInSet('c', ""));
+
+  EXPECT_TRUE(IsInSet('b', "bcd"));
+  EXPECT_TRUE(IsInSet('b', "ab"));
+}
+
+TEST(IsAsciiDigitTest, IsFalseForNonDigit) {
+  EXPECT_FALSE(IsAsciiDigit('\0'));
+  EXPECT_FALSE(IsAsciiDigit(' '));
+  EXPECT_FALSE(IsAsciiDigit('+'));
+  EXPECT_FALSE(IsAsciiDigit('-'));
+  EXPECT_FALSE(IsAsciiDigit('.'));
+  EXPECT_FALSE(IsAsciiDigit('a'));
+}
+
+TEST(IsAsciiDigitTest, IsTrueForDigit) {
+  EXPECT_TRUE(IsAsciiDigit('0'));
+  EXPECT_TRUE(IsAsciiDigit('1'));
+  EXPECT_TRUE(IsAsciiDigit('5'));
+  EXPECT_TRUE(IsAsciiDigit('9'));
+}
+
+TEST(IsAsciiPunctTest, IsFalseForNonPunct) {
+  EXPECT_FALSE(IsAsciiPunct('\0'));
+  EXPECT_FALSE(IsAsciiPunct(' '));
+  EXPECT_FALSE(IsAsciiPunct('\n'));
+  EXPECT_FALSE(IsAsciiPunct('a'));
+  EXPECT_FALSE(IsAsciiPunct('0'));
+}
+
+TEST(IsAsciiPunctTest, IsTrueForPunct) {
+  for (const char* p = "^-!\"#$%&'()*+,./:;<=>?@[\\]_`{|}~"; *p; p++) {
+    EXPECT_PRED1(IsAsciiPunct, *p);
+  }
+}
+
+TEST(IsRepeatTest, IsFalseForNonRepeatChar) {
+  EXPECT_FALSE(IsRepeat('\0'));
+  EXPECT_FALSE(IsRepeat(' '));
+  EXPECT_FALSE(IsRepeat('a'));
+  EXPECT_FALSE(IsRepeat('1'));
+  EXPECT_FALSE(IsRepeat('-'));
+}
+
+TEST(IsRepeatTest, IsTrueForRepeatChar) {
+  EXPECT_TRUE(IsRepeat('?'));
+  EXPECT_TRUE(IsRepeat('*'));
+  EXPECT_TRUE(IsRepeat('+'));
+}
+
+TEST(IsAsciiWhiteSpaceTest, IsFalseForNonWhiteSpace) {
+  EXPECT_FALSE(IsAsciiWhiteSpace('\0'));
+  EXPECT_FALSE(IsAsciiWhiteSpace('a'));
+  EXPECT_FALSE(IsAsciiWhiteSpace('1'));
+  EXPECT_FALSE(IsAsciiWhiteSpace('+'));
+  EXPECT_FALSE(IsAsciiWhiteSpace('_'));
+}
+
+TEST(IsAsciiWhiteSpaceTest, IsTrueForWhiteSpace) {
+  EXPECT_TRUE(IsAsciiWhiteSpace(' '));
+  EXPECT_TRUE(IsAsciiWhiteSpace('\n'));
+  EXPECT_TRUE(IsAsciiWhiteSpace('\r'));
+  EXPECT_TRUE(IsAsciiWhiteSpace('\t'));
+  EXPECT_TRUE(IsAsciiWhiteSpace('\v'));
+  EXPECT_TRUE(IsAsciiWhiteSpace('\f'));
+}
+
+TEST(IsAsciiWordCharTest, IsFalseForNonWordChar) {
+  EXPECT_FALSE(IsAsciiWordChar('\0'));
+  EXPECT_FALSE(IsAsciiWordChar('+'));
+  EXPECT_FALSE(IsAsciiWordChar('.'));
+  EXPECT_FALSE(IsAsciiWordChar(' '));
+  EXPECT_FALSE(IsAsciiWordChar('\n'));
+}
+
+TEST(IsAsciiWordCharTest, IsTrueForLetter) {
+  EXPECT_TRUE(IsAsciiWordChar('a'));
+  EXPECT_TRUE(IsAsciiWordChar('b'));
+  EXPECT_TRUE(IsAsciiWordChar('A'));
+  EXPECT_TRUE(IsAsciiWordChar('Z'));
+}
+
+TEST(IsAsciiWordCharTest, IsTrueForDigit) {
+  EXPECT_TRUE(IsAsciiWordChar('0'));
+  EXPECT_TRUE(IsAsciiWordChar('1'));
+  EXPECT_TRUE(IsAsciiWordChar('7'));
+  EXPECT_TRUE(IsAsciiWordChar('9'));
+}
+
+TEST(IsAsciiWordCharTest, IsTrueForUnderscore) {
+  EXPECT_TRUE(IsAsciiWordChar('_'));
+}
+
+TEST(IsValidEscapeTest, IsFalseForNonPrintable) {
+  EXPECT_FALSE(IsValidEscape('\0'));
+  EXPECT_FALSE(IsValidEscape('\007'));
+}
+
+TEST(IsValidEscapeTest, IsFalseForDigit) {
+  EXPECT_FALSE(IsValidEscape('0'));
+  EXPECT_FALSE(IsValidEscape('9'));
+}
+
+TEST(IsValidEscapeTest, IsFalseForWhiteSpace) {
+  EXPECT_FALSE(IsValidEscape(' '));
+  EXPECT_FALSE(IsValidEscape('\n'));
+}
+
+TEST(IsValidEscapeTest, IsFalseForSomeLetter) {
+  EXPECT_FALSE(IsValidEscape('a'));
+  EXPECT_FALSE(IsValidEscape('Z'));
+}
+
+TEST(IsValidEscapeTest, IsTrueForPunct) {
+  EXPECT_TRUE(IsValidEscape('.'));
+  EXPECT_TRUE(IsValidEscape('-'));
+  EXPECT_TRUE(IsValidEscape('^'));
+  EXPECT_TRUE(IsValidEscape('$'));
+  EXPECT_TRUE(IsValidEscape('('));
+  EXPECT_TRUE(IsValidEscape(']'));
+  EXPECT_TRUE(IsValidEscape('{'));
+  EXPECT_TRUE(IsValidEscape('|'));
+}
+
+TEST(IsValidEscapeTest, IsTrueForSomeLetter) {
+  EXPECT_TRUE(IsValidEscape('d'));
+  EXPECT_TRUE(IsValidEscape('D'));
+  EXPECT_TRUE(IsValidEscape('s'));
+  EXPECT_TRUE(IsValidEscape('S'));
+  EXPECT_TRUE(IsValidEscape('w'));
+  EXPECT_TRUE(IsValidEscape('W'));
+}
+
+TEST(AtomMatchesCharTest, EscapedPunct) {
+  EXPECT_FALSE(AtomMatchesChar(true, '\\', '\0'));
+  EXPECT_FALSE(AtomMatchesChar(true, '\\', ' '));
+  EXPECT_FALSE(AtomMatchesChar(true, '_', '.'));
+  EXPECT_FALSE(AtomMatchesChar(true, '.', 'a'));
+
+  EXPECT_TRUE(AtomMatchesChar(true, '\\', '\\'));
+  EXPECT_TRUE(AtomMatchesChar(true, '_', '_'));
+  EXPECT_TRUE(AtomMatchesChar(true, '+', '+'));
+  EXPECT_TRUE(AtomMatchesChar(true, '.', '.'));
+}
+
+TEST(AtomMatchesCharTest, Escaped_d) {
+  EXPECT_FALSE(AtomMatchesChar(true, 'd', '\0'));
+  EXPECT_FALSE(AtomMatchesChar(true, 'd', 'a'));
+  EXPECT_FALSE(AtomMatchesChar(true, 'd', '.'));
+
+  EXPECT_TRUE(AtomMatchesChar(true, 'd', '0'));
+  EXPECT_TRUE(AtomMatchesChar(true, 'd', '9'));
+}
+
+TEST(AtomMatchesCharTest, Escaped_D) {
+  EXPECT_FALSE(AtomMatchesChar(true, 'D', '0'));
+  EXPECT_FALSE(AtomMatchesChar(true, 'D', '9'));
+
+  EXPECT_TRUE(AtomMatchesChar(true, 'D', '\0'));
+  EXPECT_TRUE(AtomMatchesChar(true, 'D', 'a'));
+  EXPECT_TRUE(AtomMatchesChar(true, 'D', '-'));
+}
+
+TEST(AtomMatchesCharTest, Escaped_s) {
+  EXPECT_FALSE(AtomMatchesChar(true, 's', '\0'));
+  EXPECT_FALSE(AtomMatchesChar(true, 's', 'a'));
+  EXPECT_FALSE(AtomMatchesChar(true, 's', '.'));
+  EXPECT_FALSE(AtomMatchesChar(true, 's', '9'));
+
+  EXPECT_TRUE(AtomMatchesChar(true, 's', ' '));
+  EXPECT_TRUE(AtomMatchesChar(true, 's', '\n'));
+  EXPECT_TRUE(AtomMatchesChar(true, 's', '\t'));
+}
+
+TEST(AtomMatchesCharTest, Escaped_S) {
+  EXPECT_FALSE(AtomMatchesChar(true, 'S', ' '));
+  EXPECT_FALSE(AtomMatchesChar(true, 'S', '\r'));
+
+  EXPECT_TRUE(AtomMatchesChar(true, 'S', '\0'));
+  EXPECT_TRUE(AtomMatchesChar(true, 'S', 'a'));
+  EXPECT_TRUE(AtomMatchesChar(true, 'S', '9'));
+}
+
+TEST(AtomMatchesCharTest, Escaped_w) {
+  EXPECT_FALSE(AtomMatchesChar(true, 'w', '\0'));
+  EXPECT_FALSE(AtomMatchesChar(true, 'w', '+'));
+  EXPECT_FALSE(AtomMatchesChar(true, 'w', ' '));
+  EXPECT_FALSE(AtomMatchesChar(true, 'w', '\n'));
+
+  EXPECT_TRUE(AtomMatchesChar(true, 'w', '0'));
+  EXPECT_TRUE(AtomMatchesChar(true, 'w', 'b'));
+  EXPECT_TRUE(AtomMatchesChar(true, 'w', 'C'));
+  EXPECT_TRUE(AtomMatchesChar(true, 'w', '_'));
+}
+
+TEST(AtomMatchesCharTest, Escaped_W) {
+  EXPECT_FALSE(AtomMatchesChar(true, 'W', 'A'));
+  EXPECT_FALSE(AtomMatchesChar(true, 'W', 'b'));
+  EXPECT_FALSE(AtomMatchesChar(true, 'W', '9'));
+  EXPECT_FALSE(AtomMatchesChar(true, 'W', '_'));
+
+  EXPECT_TRUE(AtomMatchesChar(true, 'W', '\0'));
+  EXPECT_TRUE(AtomMatchesChar(true, 'W', '*'));
+  EXPECT_TRUE(AtomMatchesChar(true, 'W', '\n'));
+}
+
+TEST(AtomMatchesCharTest, EscapedWhiteSpace) {
+  EXPECT_FALSE(AtomMatchesChar(true, 'f', '\0'));
+  EXPECT_FALSE(AtomMatchesChar(true, 'f', '\n'));
+  EXPECT_FALSE(AtomMatchesChar(true, 'n', '\0'));
+  EXPECT_FALSE(AtomMatchesChar(true, 'n', '\r'));
+  EXPECT_FALSE(AtomMatchesChar(true, 'r', '\0'));
+  EXPECT_FALSE(AtomMatchesChar(true, 'r', 'a'));
+  EXPECT_FALSE(AtomMatchesChar(true, 't', '\0'));
+  EXPECT_FALSE(AtomMatchesChar(true, 't', 't'));
+  EXPECT_FALSE(AtomMatchesChar(true, 'v', '\0'));
+  EXPECT_FALSE(AtomMatchesChar(true, 'v', '\f'));
+
+  EXPECT_TRUE(AtomMatchesChar(true, 'f', '\f'));
+  EXPECT_TRUE(AtomMatchesChar(true, 'n', '\n'));
+  EXPECT_TRUE(AtomMatchesChar(true, 'r', '\r'));
+  EXPECT_TRUE(AtomMatchesChar(true, 't', '\t'));
+  EXPECT_TRUE(AtomMatchesChar(true, 'v', '\v'));
+}
+
+TEST(AtomMatchesCharTest, UnescapedDot) {
+  EXPECT_FALSE(AtomMatchesChar(false, '.', '\n'));
+
+  EXPECT_TRUE(AtomMatchesChar(false, '.', '\0'));
+  EXPECT_TRUE(AtomMatchesChar(false, '.', '.'));
+  EXPECT_TRUE(AtomMatchesChar(false, '.', 'a'));
+  EXPECT_TRUE(AtomMatchesChar(false, '.', ' '));
+}
+
+TEST(AtomMatchesCharTest, UnescapedChar) {
+  EXPECT_FALSE(AtomMatchesChar(false, 'a', '\0'));
+  EXPECT_FALSE(AtomMatchesChar(false, 'a', 'b'));
+  EXPECT_FALSE(AtomMatchesChar(false, '$', 'a'));
+
+  EXPECT_TRUE(AtomMatchesChar(false, '$', '$'));
+  EXPECT_TRUE(AtomMatchesChar(false, '5', '5'));
+  EXPECT_TRUE(AtomMatchesChar(false, 'Z', 'Z'));
+}
+
+TEST(ValidateRegexTest, GeneratesFailureAndReturnsFalseForInvalid) {
+  EXPECT_NONFATAL_FAILURE(ASSERT_FALSE(ValidateRegex(NULL)),
+                          "NULL is not a valid simple regular expression");
+  EXPECT_NONFATAL_FAILURE(
+      ASSERT_FALSE(ValidateRegex("a\\")),
+      "Syntax error at index 1 in simple regular expression \"a\\\": ");
+  EXPECT_NONFATAL_FAILURE(ASSERT_FALSE(ValidateRegex("a\\")),
+                          "'\\' cannot appear at the end");
+  EXPECT_NONFATAL_FAILURE(ASSERT_FALSE(ValidateRegex("\\n\\")),
+                          "'\\' cannot appear at the end");
+  EXPECT_NONFATAL_FAILURE(ASSERT_FALSE(ValidateRegex("\\s\\hb")),
+                          "invalid escape sequence \"\\h\"");
+  EXPECT_NONFATAL_FAILURE(ASSERT_FALSE(ValidateRegex("^^")),
+                          "'^' can only appear at the beginning");
+  EXPECT_NONFATAL_FAILURE(ASSERT_FALSE(ValidateRegex(".*^b")),
+                          "'^' can only appear at the beginning");
+  EXPECT_NONFATAL_FAILURE(ASSERT_FALSE(ValidateRegex("$$")),
+                          "'$' can only appear at the end");
+  EXPECT_NONFATAL_FAILURE(ASSERT_FALSE(ValidateRegex("^$a")),
+                          "'$' can only appear at the end");
+  EXPECT_NONFATAL_FAILURE(ASSERT_FALSE(ValidateRegex("a(b")),
+                          "'(' is unsupported");
+  EXPECT_NONFATAL_FAILURE(ASSERT_FALSE(ValidateRegex("ab)")),
+                          "')' is unsupported");
+  EXPECT_NONFATAL_FAILURE(ASSERT_FALSE(ValidateRegex("[ab")),
+                          "'[' is unsupported");
+  EXPECT_NONFATAL_FAILURE(ASSERT_FALSE(ValidateRegex("a{2")),
+                          "'{' is unsupported");
+  EXPECT_NONFATAL_FAILURE(ASSERT_FALSE(ValidateRegex("?")),
+                          "'?' can only follow a repeatable token");
+  EXPECT_NONFATAL_FAILURE(ASSERT_FALSE(ValidateRegex("^*")),
+                          "'*' can only follow a repeatable token");
+  EXPECT_NONFATAL_FAILURE(ASSERT_FALSE(ValidateRegex("5*+")),
+                          "'+' can only follow a repeatable token");
+}
+
+TEST(ValidateRegexTest, ReturnsTrueForValid) {
+  EXPECT_TRUE(ValidateRegex(""));
+  EXPECT_TRUE(ValidateRegex("a"));
+  EXPECT_TRUE(ValidateRegex(".*"));
+  EXPECT_TRUE(ValidateRegex("^a_+"));
+  EXPECT_TRUE(ValidateRegex("^a\\t\\&?"));
+  EXPECT_TRUE(ValidateRegex("09*$"));
+  EXPECT_TRUE(ValidateRegex("^Z$"));
+  EXPECT_TRUE(ValidateRegex("a\\^Z\\$\\(\\)\\|\\[\\]\\{\\}"));
+}
+
+TEST(MatchRepetitionAndRegexAtHeadTest, WorksForZeroOrOne) {
+  EXPECT_FALSE(MatchRepetitionAndRegexAtHead(false, 'a', '?', "a", "ba"));
+  // Repeating more than once.
+  EXPECT_FALSE(MatchRepetitionAndRegexAtHead(false, 'a', '?', "b", "aab"));
+
+  // Repeating zero times.
+  EXPECT_TRUE(MatchRepetitionAndRegexAtHead(false, 'a', '?', "b", "ba"));
+  // Repeating once.
+  EXPECT_TRUE(MatchRepetitionAndRegexAtHead(false, 'a', '?', "b", "ab"));
+  EXPECT_TRUE(MatchRepetitionAndRegexAtHead(false, '#', '?', ".", "##"));
+}
+
+TEST(MatchRepetitionAndRegexAtHeadTest, WorksForZeroOrMany) {
+  EXPECT_FALSE(MatchRepetitionAndRegexAtHead(false, '.', '*', "a$", "baab"));
+
+  // Repeating zero times.
+  EXPECT_TRUE(MatchRepetitionAndRegexAtHead(false, '.', '*', "b", "bc"));
+  // Repeating once.
+  EXPECT_TRUE(MatchRepetitionAndRegexAtHead(false, '.', '*', "b", "abc"));
+  // Repeating more than once.
+  EXPECT_TRUE(MatchRepetitionAndRegexAtHead(true, 'w', '*', "-", "ab_1-g"));
+}
+
+TEST(MatchRepetitionAndRegexAtHeadTest, WorksForOneOrMany) {
+  EXPECT_FALSE(MatchRepetitionAndRegexAtHead(false, '.', '+', "a$", "baab"));
+  // Repeating zero times.
+  EXPECT_FALSE(MatchRepetitionAndRegexAtHead(false, '.', '+', "b", "bc"));
+
+  // Repeating once.
+  EXPECT_TRUE(MatchRepetitionAndRegexAtHead(false, '.', '+', "b", "abc"));
+  // Repeating more than once.
+  EXPECT_TRUE(MatchRepetitionAndRegexAtHead(true, 'w', '+', "-", "ab_1-g"));
+}
+
+TEST(MatchRegexAtHeadTest, ReturnsTrueForEmptyRegex) {
+  EXPECT_TRUE(MatchRegexAtHead("", ""));
+  EXPECT_TRUE(MatchRegexAtHead("", "ab"));
+}
+
+TEST(MatchRegexAtHeadTest, WorksWhenDollarIsInRegex) {
+  EXPECT_FALSE(MatchRegexAtHead("$", "a"));
+
+  EXPECT_TRUE(MatchRegexAtHead("$", ""));
+  EXPECT_TRUE(MatchRegexAtHead("a$", "a"));
+}
+
+TEST(MatchRegexAtHeadTest, WorksWhenRegexStartsWithEscapeSequence) {
+  EXPECT_FALSE(MatchRegexAtHead("\\w", "+"));
+  EXPECT_FALSE(MatchRegexAtHead("\\W", "ab"));
+
+  EXPECT_TRUE(MatchRegexAtHead("\\sa", "\nab"));
+  EXPECT_TRUE(MatchRegexAtHead("\\d", "1a"));
+}
+
+TEST(MatchRegexAtHeadTest, WorksWhenRegexStartsWithRepetition) {
+  EXPECT_FALSE(MatchRegexAtHead(".+a", "abc"));
+  EXPECT_FALSE(MatchRegexAtHead("a?b", "aab"));
+
+  EXPECT_TRUE(MatchRegexAtHead(".*a", "bc12-ab"));
+  EXPECT_TRUE(MatchRegexAtHead("a?b", "b"));
+  EXPECT_TRUE(MatchRegexAtHead("a?b", "ab"));
+}
+
+TEST(MatchRegexAtHeadTest,
+     WorksWhenRegexStartsWithRepetionOfEscapeSequence) {
+  EXPECT_FALSE(MatchRegexAtHead("\\.+a", "abc"));
+  EXPECT_FALSE(MatchRegexAtHead("\\s?b", "  b"));
+
+  EXPECT_TRUE(MatchRegexAtHead("\\(*a", "((((ab"));
+  EXPECT_TRUE(MatchRegexAtHead("\\^?b", "^b"));
+  EXPECT_TRUE(MatchRegexAtHead("\\\\?b", "b"));
+  EXPECT_TRUE(MatchRegexAtHead("\\\\?b", "\\b"));
+}
+
+TEST(MatchRegexAtHeadTest, MatchesSequentially) {
+  EXPECT_FALSE(MatchRegexAtHead("ab.*c", "acabc"));
+
+  EXPECT_TRUE(MatchRegexAtHead("ab.*c", "ab-fsc"));
+}
+
+TEST(MatchRegexAnywhereTest, ReturnsFalseWhenStringIsNull) {
+  EXPECT_FALSE(MatchRegexAnywhere("", NULL));
+}
+
+TEST(MatchRegexAnywhereTest, WorksWhenRegexStartsWithCaret) {
+  EXPECT_FALSE(MatchRegexAnywhere("^a", "ba"));
+  EXPECT_FALSE(MatchRegexAnywhere("^$", "a"));
+
+  EXPECT_TRUE(MatchRegexAnywhere("^a", "ab"));
+  EXPECT_TRUE(MatchRegexAnywhere("^", "ab"));
+  EXPECT_TRUE(MatchRegexAnywhere("^$", ""));
+}
+
+TEST(MatchRegexAnywhereTest, ReturnsFalseWhenNoMatch) {
+  EXPECT_FALSE(MatchRegexAnywhere("a", "bcde123"));
+  EXPECT_FALSE(MatchRegexAnywhere("a.+a", "--aa88888888"));
+}
+
+TEST(MatchRegexAnywhereTest, ReturnsTrueWhenMatchingPrefix) {
+  EXPECT_TRUE(MatchRegexAnywhere("\\w+", "ab1_ - 5"));
+  EXPECT_TRUE(MatchRegexAnywhere(".*=", "="));
+  EXPECT_TRUE(MatchRegexAnywhere("x.*ab?.*bc", "xaaabc"));
+}
+
+TEST(MatchRegexAnywhereTest, ReturnsTrueWhenMatchingNonPrefix) {
+  EXPECT_TRUE(MatchRegexAnywhere("\\w+", "$$$ ab1_ - 5"));
+  EXPECT_TRUE(MatchRegexAnywhere("\\.+=", "=  ...="));
+}
+
+// Tests RE's implicit constructors.
+TEST(RETest, ImplicitConstructorWorks) {
+  const RE empty("");
+  EXPECT_STREQ("", empty.pattern());
+
+  const RE simple("hello");
+  EXPECT_STREQ("hello", simple.pattern());
+}
+
+// Tests that RE's constructors reject invalid regular expressions.
+TEST(RETest, RejectsInvalidRegex) {
+  EXPECT_NONFATAL_FAILURE({
+    const RE normal(NULL);
+  }, "NULL is not a valid simple regular expression");
+
+  EXPECT_NONFATAL_FAILURE({
+    const RE normal(".*(\\w+");
+  }, "'(' is unsupported");
+
+  EXPECT_NONFATAL_FAILURE({
+    const RE invalid("^?");
+  }, "'?' can only follow a repeatable token");
+}
+
+// Tests RE::FullMatch().
+TEST(RETest, FullMatchWorks) {
+  const RE empty("");
+  EXPECT_TRUE(RE::FullMatch("", empty));
+  EXPECT_FALSE(RE::FullMatch("a", empty));
+
+  const RE re1("a");
+  EXPECT_TRUE(RE::FullMatch("a", re1));
+
+  const RE re("a.*z");
+  EXPECT_TRUE(RE::FullMatch("az", re));
+  EXPECT_TRUE(RE::FullMatch("axyz", re));
+  EXPECT_FALSE(RE::FullMatch("baz", re));
+  EXPECT_FALSE(RE::FullMatch("azy", re));
+}
+
+// Tests RE::PartialMatch().
+TEST(RETest, PartialMatchWorks) {
+  const RE empty("");
+  EXPECT_TRUE(RE::PartialMatch("", empty));
+  EXPECT_TRUE(RE::PartialMatch("a", empty));
+
+  const RE re("a.*z");
+  EXPECT_TRUE(RE::PartialMatch("az", re));
+  EXPECT_TRUE(RE::PartialMatch("axyz", re));
+  EXPECT_TRUE(RE::PartialMatch("baz", re));
+  EXPECT_TRUE(RE::PartialMatch("azy", re));
+  EXPECT_FALSE(RE::PartialMatch("zza", re));
+}
+
+#endif  // GTEST_USES_POSIX_RE
+
+#if !GTEST_OS_WINDOWS_MOBILE
+
+TEST(CaptureTest, CapturesStdout) {
+  CaptureStdout();
+  fprintf(stdout, "abc");
+  EXPECT_STREQ("abc", GetCapturedStdout().c_str());
+
+  CaptureStdout();
+  fprintf(stdout, "def%cghi", '\0');
+  EXPECT_EQ(::std::string("def\0ghi", 7), ::std::string(GetCapturedStdout()));
+}
+
+TEST(CaptureTest, CapturesStderr) {
+  CaptureStderr();
+  fprintf(stderr, "jkl");
+  EXPECT_STREQ("jkl", GetCapturedStderr().c_str());
+
+  CaptureStderr();
+  fprintf(stderr, "jkl%cmno", '\0');
+  EXPECT_EQ(::std::string("jkl\0mno", 7), ::std::string(GetCapturedStderr()));
+}
+
+// Tests that stdout and stderr capture don't interfere with each other.
+TEST(CaptureTest, CapturesStdoutAndStderr) {
+  CaptureStdout();
+  CaptureStderr();
+  fprintf(stdout, "pqr");
+  fprintf(stderr, "stu");
+  EXPECT_STREQ("pqr", GetCapturedStdout().c_str());
+  EXPECT_STREQ("stu", GetCapturedStderr().c_str());
+}
+
+TEST(CaptureDeathTest, CannotReenterStdoutCapture) {
+  CaptureStdout();
+  EXPECT_DEATH_IF_SUPPORTED(CaptureStdout(),
+                            "Only one stdout capturer can exist at a time");
+  GetCapturedStdout();
+
+  // We cannot test stderr capturing using death tests as they use it
+  // themselves.
+}
+
+#endif  // !GTEST_OS_WINDOWS_MOBILE
+
+TEST(ThreadLocalTest, DefaultConstructorInitializesToDefaultValues) {
+  ThreadLocal<int> t1;
+  EXPECT_EQ(0, t1.get());
+
+  ThreadLocal<void*> t2;
+  EXPECT_TRUE(t2.get() == NULL);
+}
+
+TEST(ThreadLocalTest, SingleParamConstructorInitializesToParam) {
+  ThreadLocal<int> t1(123);
+  EXPECT_EQ(123, t1.get());
+
+  int i = 0;
+  ThreadLocal<int*> t2(&i);
+  EXPECT_EQ(&i, t2.get());
+}
+
+class NoDefaultContructor {
+ public:
+  explicit NoDefaultContructor(const char*) {}
+  NoDefaultContructor(const NoDefaultContructor&) {}
+};
+
+TEST(ThreadLocalTest, ValueDefaultContructorIsNotRequiredForParamVersion) {
+  ThreadLocal<NoDefaultContructor> bar(NoDefaultContructor("foo"));
+  bar.pointer();
+}
+
+TEST(ThreadLocalTest, GetAndPointerReturnSameValue) {
+  ThreadLocal<std::string> thread_local_string;
+
+  EXPECT_EQ(thread_local_string.pointer(), &(thread_local_string.get()));
+
+  // Verifies the condition still holds after calling set.
+  thread_local_string.set("foo");
+  EXPECT_EQ(thread_local_string.pointer(), &(thread_local_string.get()));
+}
+
+TEST(ThreadLocalTest, PointerAndConstPointerReturnSameValue) {
+  ThreadLocal<std::string> thread_local_string;
+  const ThreadLocal<std::string>& const_thread_local_string =
+      thread_local_string;
+
+  EXPECT_EQ(thread_local_string.pointer(), const_thread_local_string.pointer());
+
+  thread_local_string.set("foo");
+  EXPECT_EQ(thread_local_string.pointer(), const_thread_local_string.pointer());
+}
+
+#if GTEST_IS_THREADSAFE
+
+void AddTwo(int* param) { *param += 2; }
+
+TEST(ThreadWithParamTest, ConstructorExecutesThreadFunc) {
+  int i = 40;
+  ThreadWithParam<int*> thread(&AddTwo, &i, NULL);
+  thread.Join();
+  EXPECT_EQ(42, i);
+}
+
+TEST(MutexDeathTest, AssertHeldShouldAssertWhenNotLocked) {
+  // AssertHeld() is flaky only in the presence of multiple threads accessing
+  // the lock. In this case, the test is robust.
+  EXPECT_DEATH_IF_SUPPORTED({
+    Mutex m;
+    { MutexLock lock(&m); }
+    m.AssertHeld();
+  },
+  "thread .*hold");
+}
+
+TEST(MutexTest, AssertHeldShouldNotAssertWhenLocked) {
+  Mutex m;
+  MutexLock lock(&m);
+  m.AssertHeld();
+}
+
+class AtomicCounterWithMutex {
+ public:
+  explicit AtomicCounterWithMutex(Mutex* mutex) :
+    value_(0), mutex_(mutex), random_(42) {}
+
+  void Increment() {
+    MutexLock lock(mutex_);
+    int temp = value_;
+    {
+      // Locking a mutex puts up a memory barrier, preventing reads and
+      // writes to value_ rearranged when observed from other threads.
+      //
+      // We cannot use Mutex and MutexLock here or rely on their memory
+      // barrier functionality as we are testing them here.
+      pthread_mutex_t memory_barrier_mutex;
+      GTEST_CHECK_POSIX_SUCCESS_(
+          pthread_mutex_init(&memory_barrier_mutex, NULL));
+      GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_lock(&memory_barrier_mutex));
+
+      SleepMilliseconds(random_.Generate(30));
+
+      GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_unlock(&memory_barrier_mutex));
+      GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_destroy(&memory_barrier_mutex));
+    }
+    value_ = temp + 1;
+  }
+  int value() const { return value_; }
+
+ private:
+  volatile int value_;
+  Mutex* const mutex_;  // Protects value_.
+  Random       random_;
+};
+
+void CountingThreadFunc(pair<AtomicCounterWithMutex*, int> param) {
+  for (int i = 0; i < param.second; ++i)
+      param.first->Increment();
+}
+
+// Tests that the mutex only lets one thread at a time to lock it.
+TEST(MutexTest, OnlyOneThreadCanLockAtATime) {
+  Mutex mutex;
+  AtomicCounterWithMutex locked_counter(&mutex);
+
+  typedef ThreadWithParam<pair<AtomicCounterWithMutex*, int> > ThreadType;
+  const int kCycleCount = 20;
+  const int kThreadCount = 7;
+  scoped_ptr<ThreadType> counting_threads[kThreadCount];
+  Notification threads_can_start;
+  // Creates and runs kThreadCount threads that increment locked_counter
+  // kCycleCount times each.
+  for (int i = 0; i < kThreadCount; ++i) {
+    counting_threads[i].reset(new ThreadType(&CountingThreadFunc,
+                                             make_pair(&locked_counter,
+                                                       kCycleCount),
+                                             &threads_can_start));
+  }
+  threads_can_start.Notify();
+  for (int i = 0; i < kThreadCount; ++i)
+    counting_threads[i]->Join();
+
+  // If the mutex lets more than one thread to increment the counter at a
+  // time, they are likely to encounter a race condition and have some
+  // increments overwritten, resulting in the lower then expected counter
+  // value.
+  EXPECT_EQ(kCycleCount * kThreadCount, locked_counter.value());
+}
+
+template <typename T>
+void RunFromThread(void (func)(T), T param) {
+  ThreadWithParam<T> thread(func, param, NULL);
+  thread.Join();
+}
+
+void RetrieveThreadLocalValue(
+    pair<ThreadLocal<std::string>*, std::string*> param) {
+  *param.second = param.first->get();
+}
+
+TEST(ThreadLocalTest, ParameterizedConstructorSetsDefault) {
+  ThreadLocal<std::string> thread_local_string("foo");
+  EXPECT_STREQ("foo", thread_local_string.get().c_str());
+
+  thread_local_string.set("bar");
+  EXPECT_STREQ("bar", thread_local_string.get().c_str());
+
+  std::string result;
+  RunFromThread(&RetrieveThreadLocalValue,
+                make_pair(&thread_local_string, &result));
+  EXPECT_STREQ("foo", result.c_str());
+}
+
+// DestructorTracker keeps track of whether its instances have been
+// destroyed.
+static std::vector<bool> g_destroyed;
+
+class DestructorTracker {
+ public:
+  DestructorTracker() : index_(GetNewIndex()) {}
+  DestructorTracker(const DestructorTracker& /* rhs */)
+      : index_(GetNewIndex()) {}
+  ~DestructorTracker() {
+    // We never access g_destroyed concurrently, so we don't need to
+    // protect the write operation under a mutex.
+    g_destroyed[index_] = true;
+  }
+
+ private:
+  static int GetNewIndex() {
+    g_destroyed.push_back(false);
+    return g_destroyed.size() - 1;
+  }
+  const int index_;
+};
+
+typedef ThreadLocal<DestructorTracker>* ThreadParam;
+
+void CallThreadLocalGet(ThreadParam thread_local_param) {
+  thread_local_param->get();
+}
+
+// Tests that when a ThreadLocal object dies in a thread, it destroys
+// the managed object for that thread.
+TEST(ThreadLocalTest, DestroysManagedObjectForOwnThreadWhenDying) {
+  g_destroyed.clear();
+
+  {
+    // The next line default constructs a DestructorTracker object as
+    // the default value of objects managed by thread_local_tracker.
+    ThreadLocal<DestructorTracker> thread_local_tracker;
+    ASSERT_EQ(1U, g_destroyed.size());
+    ASSERT_FALSE(g_destroyed[0]);
+
+    // This creates another DestructorTracker object for the main thread.
+    thread_local_tracker.get();
+    ASSERT_EQ(2U, g_destroyed.size());
+    ASSERT_FALSE(g_destroyed[0]);
+    ASSERT_FALSE(g_destroyed[1]);
+  }
+
+  // Now thread_local_tracker has died.  It should have destroyed both the
+  // default value shared by all threads and the value for the main
+  // thread.
+  ASSERT_EQ(2U, g_destroyed.size());
+  EXPECT_TRUE(g_destroyed[0]);
+  EXPECT_TRUE(g_destroyed[1]);
+
+  g_destroyed.clear();
+}
+
+// Tests that when a thread exits, the thread-local object for that
+// thread is destroyed.
+TEST(ThreadLocalTest, DestroysManagedObjectAtThreadExit) {
+  g_destroyed.clear();
+
+  {
+    // The next line default constructs a DestructorTracker object as
+    // the default value of objects managed by thread_local_tracker.
+    ThreadLocal<DestructorTracker> thread_local_tracker;
+    ASSERT_EQ(1U, g_destroyed.size());
+    ASSERT_FALSE(g_destroyed[0]);
+
+    // This creates another DestructorTracker object in the new thread.
+    ThreadWithParam<ThreadParam> thread(
+        &CallThreadLocalGet, &thread_local_tracker, NULL);
+    thread.Join();
+
+    // Now the new thread has exited.  The per-thread object for it
+    // should have been destroyed.
+    ASSERT_EQ(2U, g_destroyed.size());
+    ASSERT_FALSE(g_destroyed[0]);
+    ASSERT_TRUE(g_destroyed[1]);
+  }
+
+  // Now thread_local_tracker has died.  The default value should have been
+  // destroyed too.
+  ASSERT_EQ(2U, g_destroyed.size());
+  EXPECT_TRUE(g_destroyed[0]);
+  EXPECT_TRUE(g_destroyed[1]);
+
+  g_destroyed.clear();
+}
+
+TEST(ThreadLocalTest, ThreadLocalMutationsAffectOnlyCurrentThread) {
+  ThreadLocal<std::string> thread_local_string;
+  thread_local_string.set("Foo");
+  EXPECT_STREQ("Foo", thread_local_string.get().c_str());
+
+  std::string result;
+  RunFromThread(&RetrieveThreadLocalValue,
+                make_pair(&thread_local_string, &result));
+  EXPECT_TRUE(result.empty());
+}
+
+#endif  // GTEST_IS_THREADSAFE
+
+}  // namespace internal
+}  // namespace testing
diff --git a/contrib/gtest-1.7.0/test/gtest-printers_test.cc b/contrib/gtest-1.7.0/test/gtest-printers_test.cc
new file mode 100644
index 0000000..c2beca7
--- /dev/null
+++ b/contrib/gtest-1.7.0/test/gtest-printers_test.cc
@@ -0,0 +1,1566 @@
+// Copyright 2007, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+
+// Google Test - The Google C++ Testing Framework
+//
+// This file tests the universal value printer.
+
+#include "gtest/gtest-printers.h"
+
+#include <ctype.h>
+#include <limits.h>
+#include <string.h>
+#include <algorithm>
+#include <deque>
+#include <list>
+#include <map>
+#include <set>
+#include <sstream>
+#include <string>
+#include <utility>
+#include <vector>
+
+#include "gtest/gtest.h"
+
+// hash_map and hash_set are available under Visual C++.
+#if _MSC_VER
+# define GTEST_HAS_HASH_MAP_ 1  // Indicates that hash_map is available.
+# include <hash_map>            // NOLINT
+# define GTEST_HAS_HASH_SET_ 1  // Indicates that hash_set is available.
+# include <hash_set>            // NOLINT
+#endif  // GTEST_OS_WINDOWS
+
+// Some user-defined types for testing the universal value printer.
+
+// An anonymous enum type.
+enum AnonymousEnum {
+  kAE1 = -1,
+  kAE2 = 1
+};
+
+// An enum without a user-defined printer.
+enum EnumWithoutPrinter {
+  kEWP1 = -2,
+  kEWP2 = 42
+};
+
+// An enum with a << operator.
+enum EnumWithStreaming {
+  kEWS1 = 10
+};
+
+std::ostream& operator<<(std::ostream& os, EnumWithStreaming e) {
+  return os << (e == kEWS1 ? "kEWS1" : "invalid");
+}
+
+// An enum with a PrintTo() function.
+enum EnumWithPrintTo {
+  kEWPT1 = 1
+};
+
+void PrintTo(EnumWithPrintTo e, std::ostream* os) {
+  *os << (e == kEWPT1 ? "kEWPT1" : "invalid");
+}
+
+// A class implicitly convertible to BiggestInt.
+class BiggestIntConvertible {
+ public:
+  operator ::testing::internal::BiggestInt() const { return 42; }
+};
+
+// A user-defined unprintable class template in the global namespace.
+template <typename T>
+class UnprintableTemplateInGlobal {
+ public:
+  UnprintableTemplateInGlobal() : value_() {}
+ private:
+  T value_;
+};
+
+// A user-defined streamable type in the global namespace.
+class StreamableInGlobal {
+ public:
+  virtual ~StreamableInGlobal() {}
+};
+
+inline void operator<<(::std::ostream& os, const StreamableInGlobal& /* x */) {
+  os << "StreamableInGlobal";
+}
+
+void operator<<(::std::ostream& os, const StreamableInGlobal* /* x */) {
+  os << "StreamableInGlobal*";
+}
+
+namespace foo {
+
+// A user-defined unprintable type in a user namespace.
+class UnprintableInFoo {
+ public:
+  UnprintableInFoo() : z_(0) { memcpy(xy_, "\xEF\x12\x0\x0\x34\xAB\x0\x0", 8); }
+ private:
+  char xy_[8];
+  double z_;
+};
+
+// A user-defined printable type in a user-chosen namespace.
+struct PrintableViaPrintTo {
+  PrintableViaPrintTo() : value() {}
+  int value;
+};
+
+void PrintTo(const PrintableViaPrintTo& x, ::std::ostream* os) {
+  *os << "PrintableViaPrintTo: " << x.value;
+}
+
+// A type with a user-defined << for printing its pointer.
+struct PointerPrintable {
+};
+
+::std::ostream& operator<<(::std::ostream& os,
+                           const PointerPrintable* /* x */) {
+  return os << "PointerPrintable*";
+}
+
+// A user-defined printable class template in a user-chosen namespace.
+template <typename T>
+class PrintableViaPrintToTemplate {
+ public:
+  explicit PrintableViaPrintToTemplate(const T& a_value) : value_(a_value) {}
+
+  const T& value() const { return value_; }
+ private:
+  T value_;
+};
+
+template <typename T>
+void PrintTo(const PrintableViaPrintToTemplate<T>& x, ::std::ostream* os) {
+  *os << "PrintableViaPrintToTemplate: " << x.value();
+}
+
+// A user-defined streamable class template in a user namespace.
+template <typename T>
+class StreamableTemplateInFoo {
+ public:
+  StreamableTemplateInFoo() : value_() {}
+
+  const T& value() const { return value_; }
+ private:
+  T value_;
+};
+
+template <typename T>
+inline ::std::ostream& operator<<(::std::ostream& os,
+                                  const StreamableTemplateInFoo<T>& x) {
+  return os << "StreamableTemplateInFoo: " << x.value();
+}
+
+}  // namespace foo
+
+namespace testing {
+namespace gtest_printers_test {
+
+using ::std::deque;
+using ::std::list;
+using ::std::make_pair;
+using ::std::map;
+using ::std::multimap;
+using ::std::multiset;
+using ::std::pair;
+using ::std::set;
+using ::std::vector;
+using ::testing::PrintToString;
+using ::testing::internal::FormatForComparisonFailureMessage;
+using ::testing::internal::ImplicitCast_;
+using ::testing::internal::NativeArray;
+using ::testing::internal::RE;
+using ::testing::internal::Strings;
+using ::testing::internal::UniversalPrint;
+using ::testing::internal::UniversalPrinter;
+using ::testing::internal::UniversalTersePrint;
+using ::testing::internal::UniversalTersePrintTupleFieldsToStrings;
+using ::testing::internal::kReference;
+using ::testing::internal::string;
+
+#if GTEST_HAS_TR1_TUPLE
+using ::std::tr1::make_tuple;
+using ::std::tr1::tuple;
+#endif
+
+// The hash_* classes are not part of the C++ standard.  STLport
+// defines them in namespace std.  MSVC defines them in ::stdext.  GCC
+// defines them in ::.
+#ifdef _STLP_HASH_MAP  // We got <hash_map> from STLport.
+using ::std::hash_map;
+using ::std::hash_set;
+using ::std::hash_multimap;
+using ::std::hash_multiset;
+#elif _MSC_VER
+using ::stdext::hash_map;
+using ::stdext::hash_set;
+using ::stdext::hash_multimap;
+using ::stdext::hash_multiset;
+#endif
+
+// Prints a value to a string using the universal value printer.  This
+// is a helper for testing UniversalPrinter<T>::Print() for various types.
+template <typename T>
+string Print(const T& value) {
+  ::std::stringstream ss;
+  UniversalPrinter<T>::Print(value, &ss);
+  return ss.str();
+}
+
+// Prints a value passed by reference to a string, using the universal
+// value printer.  This is a helper for testing
+// UniversalPrinter<T&>::Print() for various types.
+template <typename T>
+string PrintByRef(const T& value) {
+  ::std::stringstream ss;
+  UniversalPrinter<T&>::Print(value, &ss);
+  return ss.str();
+}
+
+// Tests printing various enum types.
+
+TEST(PrintEnumTest, AnonymousEnum) {
+  EXPECT_EQ("-1", Print(kAE1));
+  EXPECT_EQ("1", Print(kAE2));
+}
+
+TEST(PrintEnumTest, EnumWithoutPrinter) {
+  EXPECT_EQ("-2", Print(kEWP1));
+  EXPECT_EQ("42", Print(kEWP2));
+}
+
+TEST(PrintEnumTest, EnumWithStreaming) {
+  EXPECT_EQ("kEWS1", Print(kEWS1));
+  EXPECT_EQ("invalid", Print(static_cast<EnumWithStreaming>(0)));
+}
+
+TEST(PrintEnumTest, EnumWithPrintTo) {
+  EXPECT_EQ("kEWPT1", Print(kEWPT1));
+  EXPECT_EQ("invalid", Print(static_cast<EnumWithPrintTo>(0)));
+}
+
+// Tests printing a class implicitly convertible to BiggestInt.
+
+TEST(PrintClassTest, BiggestIntConvertible) {
+  EXPECT_EQ("42", Print(BiggestIntConvertible()));
+}
+
+// Tests printing various char types.
+
+// char.
+TEST(PrintCharTest, PlainChar) {
+  EXPECT_EQ("'\\0'", Print('\0'));
+  EXPECT_EQ("'\\'' (39, 0x27)", Print('\''));
+  EXPECT_EQ("'\"' (34, 0x22)", Print('"'));
+  EXPECT_EQ("'?' (63, 0x3F)", Print('?'));
+  EXPECT_EQ("'\\\\' (92, 0x5C)", Print('\\'));
+  EXPECT_EQ("'\\a' (7)", Print('\a'));
+  EXPECT_EQ("'\\b' (8)", Print('\b'));
+  EXPECT_EQ("'\\f' (12, 0xC)", Print('\f'));
+  EXPECT_EQ("'\\n' (10, 0xA)", Print('\n'));
+  EXPECT_EQ("'\\r' (13, 0xD)", Print('\r'));
+  EXPECT_EQ("'\\t' (9)", Print('\t'));
+  EXPECT_EQ("'\\v' (11, 0xB)", Print('\v'));
+  EXPECT_EQ("'\\x7F' (127)", Print('\x7F'));
+  EXPECT_EQ("'\\xFF' (255)", Print('\xFF'));
+  EXPECT_EQ("' ' (32, 0x20)", Print(' '));
+  EXPECT_EQ("'a' (97, 0x61)", Print('a'));
+}
+
+// signed char.
+TEST(PrintCharTest, SignedChar) {
+  EXPECT_EQ("'\\0'", Print(static_cast<signed char>('\0')));
+  EXPECT_EQ("'\\xCE' (-50)",
+            Print(static_cast<signed char>(-50)));
+}
+
+// unsigned char.
+TEST(PrintCharTest, UnsignedChar) {
+  EXPECT_EQ("'\\0'", Print(static_cast<unsigned char>('\0')));
+  EXPECT_EQ("'b' (98, 0x62)",
+            Print(static_cast<unsigned char>('b')));
+}
+
+// Tests printing other simple, built-in types.
+
+// bool.
+TEST(PrintBuiltInTypeTest, Bool) {
+  EXPECT_EQ("false", Print(false));
+  EXPECT_EQ("true", Print(true));
+}
+
+// wchar_t.
+TEST(PrintBuiltInTypeTest, Wchar_t) {
+  EXPECT_EQ("L'\\0'", Print(L'\0'));
+  EXPECT_EQ("L'\\'' (39, 0x27)", Print(L'\''));
+  EXPECT_EQ("L'\"' (34, 0x22)", Print(L'"'));
+  EXPECT_EQ("L'?' (63, 0x3F)", Print(L'?'));
+  EXPECT_EQ("L'\\\\' (92, 0x5C)", Print(L'\\'));
+  EXPECT_EQ("L'\\a' (7)", Print(L'\a'));
+  EXPECT_EQ("L'\\b' (8)", Print(L'\b'));
+  EXPECT_EQ("L'\\f' (12, 0xC)", Print(L'\f'));
+  EXPECT_EQ("L'\\n' (10, 0xA)", Print(L'\n'));
+  EXPECT_EQ("L'\\r' (13, 0xD)", Print(L'\r'));
+  EXPECT_EQ("L'\\t' (9)", Print(L'\t'));
+  EXPECT_EQ("L'\\v' (11, 0xB)", Print(L'\v'));
+  EXPECT_EQ("L'\\x7F' (127)", Print(L'\x7F'));
+  EXPECT_EQ("L'\\xFF' (255)", Print(L'\xFF'));
+  EXPECT_EQ("L' ' (32, 0x20)", Print(L' '));
+  EXPECT_EQ("L'a' (97, 0x61)", Print(L'a'));
+  EXPECT_EQ("L'\\x576' (1398)", Print(static_cast<wchar_t>(0x576)));
+  EXPECT_EQ("L'\\xC74D' (51021)", Print(static_cast<wchar_t>(0xC74D)));
+}
+
+// Test that Int64 provides more storage than wchar_t.
+TEST(PrintTypeSizeTest, Wchar_t) {
+  EXPECT_LT(sizeof(wchar_t), sizeof(testing::internal::Int64));
+}
+
+// Various integer types.
+TEST(PrintBuiltInTypeTest, Integer) {
+  EXPECT_EQ("'\\xFF' (255)", Print(static_cast<unsigned char>(255)));  // uint8
+  EXPECT_EQ("'\\x80' (-128)", Print(static_cast<signed char>(-128)));  // int8
+  EXPECT_EQ("65535", Print(USHRT_MAX));  // uint16
+  EXPECT_EQ("-32768", Print(SHRT_MIN));  // int16
+  EXPECT_EQ("4294967295", Print(UINT_MAX));  // uint32
+  EXPECT_EQ("-2147483648", Print(INT_MIN));  // int32
+  EXPECT_EQ("18446744073709551615",
+            Print(static_cast<testing::internal::UInt64>(-1)));  // uint64
+  EXPECT_EQ("-9223372036854775808",
+            Print(static_cast<testing::internal::Int64>(1) << 63));  // int64
+}
+
+// Size types.
+TEST(PrintBuiltInTypeTest, Size_t) {
+  EXPECT_EQ("1", Print(sizeof('a')));  // size_t.
+#if !GTEST_OS_WINDOWS
+  // Windows has no ssize_t type.
+  EXPECT_EQ("-2", Print(static_cast<ssize_t>(-2)));  // ssize_t.
+#endif  // !GTEST_OS_WINDOWS
+}
+
+// Floating-points.
+TEST(PrintBuiltInTypeTest, FloatingPoints) {
+  EXPECT_EQ("1.5", Print(1.5f));   // float
+  EXPECT_EQ("-2.5", Print(-2.5));  // double
+}
+
+// Since ::std::stringstream::operator<<(const void *) formats the pointer
+// output differently with different compilers, we have to create the expected
+// output first and use it as our expectation.
+static string PrintPointer(const void *p) {
+  ::std::stringstream expected_result_stream;
+  expected_result_stream << p;
+  return expected_result_stream.str();
+}
+
+// Tests printing C strings.
+
+// const char*.
+TEST(PrintCStringTest, Const) {
+  const char* p = "World";
+  EXPECT_EQ(PrintPointer(p) + " pointing to \"World\"", Print(p));
+}
+
+// char*.
+TEST(PrintCStringTest, NonConst) {
+  char p[] = "Hi";
+  EXPECT_EQ(PrintPointer(p) + " pointing to \"Hi\"",
+            Print(static_cast<char*>(p)));
+}
+
+// NULL C string.
+TEST(PrintCStringTest, Null) {
+  const char* p = NULL;
+  EXPECT_EQ("NULL", Print(p));
+}
+
+// Tests that C strings are escaped properly.
+TEST(PrintCStringTest, EscapesProperly) {
+  const char* p = "'\"?\\\a\b\f\n\r\t\v\x7F\xFF a";
+  EXPECT_EQ(PrintPointer(p) + " pointing to \"'\\\"?\\\\\\a\\b\\f"
+            "\\n\\r\\t\\v\\x7F\\xFF a\"",
+            Print(p));
+}
+
+
+
+// MSVC compiler can be configured to define whar_t as a typedef
+// of unsigned short. Defining an overload for const wchar_t* in that case
+// would cause pointers to unsigned shorts be printed as wide strings,
+// possibly accessing more memory than intended and causing invalid
+// memory accesses. MSVC defines _NATIVE_WCHAR_T_DEFINED symbol when
+// wchar_t is implemented as a native type.
+#if !defined(_MSC_VER) || defined(_NATIVE_WCHAR_T_DEFINED)
+
+// const wchar_t*.
+TEST(PrintWideCStringTest, Const) {
+  const wchar_t* p = L"World";
+  EXPECT_EQ(PrintPointer(p) + " pointing to L\"World\"", Print(p));
+}
+
+// wchar_t*.
+TEST(PrintWideCStringTest, NonConst) {
+  wchar_t p[] = L"Hi";
+  EXPECT_EQ(PrintPointer(p) + " pointing to L\"Hi\"",
+            Print(static_cast<wchar_t*>(p)));
+}
+
+// NULL wide C string.
+TEST(PrintWideCStringTest, Null) {
+  const wchar_t* p = NULL;
+  EXPECT_EQ("NULL", Print(p));
+}
+
+// Tests that wide C strings are escaped properly.
+TEST(PrintWideCStringTest, EscapesProperly) {
+  const wchar_t s[] = {'\'', '"', '?', '\\', '\a', '\b', '\f', '\n', '\r',
+                       '\t', '\v', 0xD3, 0x576, 0x8D3, 0xC74D, ' ', 'a', '\0'};
+  EXPECT_EQ(PrintPointer(s) + " pointing to L\"'\\\"?\\\\\\a\\b\\f"
+            "\\n\\r\\t\\v\\xD3\\x576\\x8D3\\xC74D a\"",
+            Print(static_cast<const wchar_t*>(s)));
+}
+#endif  // native wchar_t
+
+// Tests printing pointers to other char types.
+
+// signed char*.
+TEST(PrintCharPointerTest, SignedChar) {
+  signed char* p = reinterpret_cast<signed char*>(0x1234);
+  EXPECT_EQ(PrintPointer(p), Print(p));
+  p = NULL;
+  EXPECT_EQ("NULL", Print(p));
+}
+
+// const signed char*.
+TEST(PrintCharPointerTest, ConstSignedChar) {
+  signed char* p = reinterpret_cast<signed char*>(0x1234);
+  EXPECT_EQ(PrintPointer(p), Print(p));
+  p = NULL;
+  EXPECT_EQ("NULL", Print(p));
+}
+
+// unsigned char*.
+TEST(PrintCharPointerTest, UnsignedChar) {
+  unsigned char* p = reinterpret_cast<unsigned char*>(0x1234);
+  EXPECT_EQ(PrintPointer(p), Print(p));
+  p = NULL;
+  EXPECT_EQ("NULL", Print(p));
+}
+
+// const unsigned char*.
+TEST(PrintCharPointerTest, ConstUnsignedChar) {
+  const unsigned char* p = reinterpret_cast<const unsigned char*>(0x1234);
+  EXPECT_EQ(PrintPointer(p), Print(p));
+  p = NULL;
+  EXPECT_EQ("NULL", Print(p));
+}
+
+// Tests printing pointers to simple, built-in types.
+
+// bool*.
+TEST(PrintPointerToBuiltInTypeTest, Bool) {
+  bool* p = reinterpret_cast<bool*>(0xABCD);
+  EXPECT_EQ(PrintPointer(p), Print(p));
+  p = NULL;
+  EXPECT_EQ("NULL", Print(p));
+}
+
+// void*.
+TEST(PrintPointerToBuiltInTypeTest, Void) {
+  void* p = reinterpret_cast<void*>(0xABCD);
+  EXPECT_EQ(PrintPointer(p), Print(p));
+  p = NULL;
+  EXPECT_EQ("NULL", Print(p));
+}
+
+// const void*.
+TEST(PrintPointerToBuiltInTypeTest, ConstVoid) {
+  const void* p = reinterpret_cast<const void*>(0xABCD);
+  EXPECT_EQ(PrintPointer(p), Print(p));
+  p = NULL;
+  EXPECT_EQ("NULL", Print(p));
+}
+
+// Tests printing pointers to pointers.
+TEST(PrintPointerToPointerTest, IntPointerPointer) {
+  int** p = reinterpret_cast<int**>(0xABCD);
+  EXPECT_EQ(PrintPointer(p), Print(p));
+  p = NULL;
+  EXPECT_EQ("NULL", Print(p));
+}
+
+// Tests printing (non-member) function pointers.
+
+void MyFunction(int /* n */) {}
+
+TEST(PrintPointerTest, NonMemberFunctionPointer) {
+  // We cannot directly cast &MyFunction to const void* because the
+  // standard disallows casting between pointers to functions and
+  // pointers to objects, and some compilers (e.g. GCC 3.4) enforce
+  // this limitation.
+  EXPECT_EQ(
+      PrintPointer(reinterpret_cast<const void*>(
+          reinterpret_cast<internal::BiggestInt>(&MyFunction))),
+      Print(&MyFunction));
+  int (*p)(bool) = NULL;  // NOLINT
+  EXPECT_EQ("NULL", Print(p));
+}
+
+// An assertion predicate determining whether a one string is a prefix for
+// another.
+template <typename StringType>
+AssertionResult HasPrefix(const StringType& str, const StringType& prefix) {
+  if (str.find(prefix, 0) == 0)
+    return AssertionSuccess();
+
+  const bool is_wide_string = sizeof(prefix[0]) > 1;
+  const char* const begin_string_quote = is_wide_string ? "L\"" : "\"";
+  return AssertionFailure()
+      << begin_string_quote << prefix << "\" is not a prefix of "
+      << begin_string_quote << str << "\"\n";
+}
+
+// Tests printing member variable pointers.  Although they are called
+// pointers, they don't point to a location in the address space.
+// Their representation is implementation-defined.  Thus they will be
+// printed as raw bytes.
+
+struct Foo {
+ public:
+  virtual ~Foo() {}
+  int MyMethod(char x) { return x + 1; }
+  virtual char MyVirtualMethod(int /* n */) { return 'a'; }
+
+  int value;
+};
+
+TEST(PrintPointerTest, MemberVariablePointer) {
+  EXPECT_TRUE(HasPrefix(Print(&Foo::value),
+                        Print(sizeof(&Foo::value)) + "-byte object "));
+  int (Foo::*p) = NULL;  // NOLINT
+  EXPECT_TRUE(HasPrefix(Print(p),
+                        Print(sizeof(p)) + "-byte object "));
+}
+
+// Tests printing member function pointers.  Although they are called
+// pointers, they don't point to a location in the address space.
+// Their representation is implementation-defined.  Thus they will be
+// printed as raw bytes.
+TEST(PrintPointerTest, MemberFunctionPointer) {
+  EXPECT_TRUE(HasPrefix(Print(&Foo::MyMethod),
+                        Print(sizeof(&Foo::MyMethod)) + "-byte object "));
+  EXPECT_TRUE(
+      HasPrefix(Print(&Foo::MyVirtualMethod),
+                Print(sizeof((&Foo::MyVirtualMethod))) + "-byte object "));
+  int (Foo::*p)(char) = NULL;  // NOLINT
+  EXPECT_TRUE(HasPrefix(Print(p),
+                        Print(sizeof(p)) + "-byte object "));
+}
+
+// Tests printing C arrays.
+
+// The difference between this and Print() is that it ensures that the
+// argument is a reference to an array.
+template <typename T, size_t N>
+string PrintArrayHelper(T (&a)[N]) {
+  return Print(a);
+}
+
+// One-dimensional array.
+TEST(PrintArrayTest, OneDimensionalArray) {
+  int a[5] = { 1, 2, 3, 4, 5 };
+  EXPECT_EQ("{ 1, 2, 3, 4, 5 }", PrintArrayHelper(a));
+}
+
+// Two-dimensional array.
+TEST(PrintArrayTest, TwoDimensionalArray) {
+  int a[2][5] = {
+    { 1, 2, 3, 4, 5 },
+    { 6, 7, 8, 9, 0 }
+  };
+  EXPECT_EQ("{ { 1, 2, 3, 4, 5 }, { 6, 7, 8, 9, 0 } }", PrintArrayHelper(a));
+}
+
+// Array of const elements.
+TEST(PrintArrayTest, ConstArray) {
+  const bool a[1] = { false };
+  EXPECT_EQ("{ false }", PrintArrayHelper(a));
+}
+
+// char array without terminating NUL.
+TEST(PrintArrayTest, CharArrayWithNoTerminatingNul) {
+  // Array a contains '\0' in the middle and doesn't end with '\0'.
+  char a[] = { 'H', '\0', 'i' };
+  EXPECT_EQ("\"H\\0i\" (no terminating NUL)", PrintArrayHelper(a));
+}
+
+// const char array with terminating NUL.
+TEST(PrintArrayTest, ConstCharArrayWithTerminatingNul) {
+  const char a[] = "\0Hi";
+  EXPECT_EQ("\"\\0Hi\"", PrintArrayHelper(a));
+}
+
+// const wchar_t array without terminating NUL.
+TEST(PrintArrayTest, WCharArrayWithNoTerminatingNul) {
+  // Array a contains '\0' in the middle and doesn't end with '\0'.
+  const wchar_t a[] = { L'H', L'\0', L'i' };
+  EXPECT_EQ("L\"H\\0i\" (no terminating NUL)", PrintArrayHelper(a));
+}
+
+// wchar_t array with terminating NUL.
+TEST(PrintArrayTest, WConstCharArrayWithTerminatingNul) {
+  const wchar_t a[] = L"\0Hi";
+  EXPECT_EQ("L\"\\0Hi\"", PrintArrayHelper(a));
+}
+
+// Array of objects.
+TEST(PrintArrayTest, ObjectArray) {
+  string a[3] = { "Hi", "Hello", "Ni hao" };
+  EXPECT_EQ("{ \"Hi\", \"Hello\", \"Ni hao\" }", PrintArrayHelper(a));
+}
+
+// Array with many elements.
+TEST(PrintArrayTest, BigArray) {
+  int a[100] = { 1, 2, 3 };
+  EXPECT_EQ("{ 1, 2, 3, 0, 0, 0, 0, 0, ..., 0, 0, 0, 0, 0, 0, 0, 0 }",
+            PrintArrayHelper(a));
+}
+
+// Tests printing ::string and ::std::string.
+
+#if GTEST_HAS_GLOBAL_STRING
+// ::string.
+TEST(PrintStringTest, StringInGlobalNamespace) {
+  const char s[] = "'\"?\\\a\b\f\n\0\r\t\v\x7F\xFF a";
+  const ::string str(s, sizeof(s));
+  EXPECT_EQ("\"'\\\"?\\\\\\a\\b\\f\\n\\0\\r\\t\\v\\x7F\\xFF a\\0\"",
+            Print(str));
+}
+#endif  // GTEST_HAS_GLOBAL_STRING
+
+// ::std::string.
+TEST(PrintStringTest, StringInStdNamespace) {
+  const char s[] = "'\"?\\\a\b\f\n\0\r\t\v\x7F\xFF a";
+  const ::std::string str(s, sizeof(s));
+  EXPECT_EQ("\"'\\\"?\\\\\\a\\b\\f\\n\\0\\r\\t\\v\\x7F\\xFF a\\0\"",
+            Print(str));
+}
+
+TEST(PrintStringTest, StringAmbiguousHex) {
+  // "\x6BANANA" is ambiguous, it can be interpreted as starting with either of:
+  // '\x6', '\x6B', or '\x6BA'.
+
+  // a hex escaping sequence following by a decimal digit
+  EXPECT_EQ("\"0\\x12\" \"3\"", Print(::std::string("0\x12" "3")));
+  // a hex escaping sequence following by a hex digit (lower-case)
+  EXPECT_EQ("\"mm\\x6\" \"bananas\"", Print(::std::string("mm\x6" "bananas")));
+  // a hex escaping sequence following by a hex digit (upper-case)
+  EXPECT_EQ("\"NOM\\x6\" \"BANANA\"", Print(::std::string("NOM\x6" "BANANA")));
+  // a hex escaping sequence following by a non-xdigit
+  EXPECT_EQ("\"!\\x5-!\"", Print(::std::string("!\x5-!")));
+}
+
+// Tests printing ::wstring and ::std::wstring.
+
+#if GTEST_HAS_GLOBAL_WSTRING
+// ::wstring.
+TEST(PrintWideStringTest, StringInGlobalNamespace) {
+  const wchar_t s[] = L"'\"?\\\a\b\f\n\0\r\t\v\xD3\x576\x8D3\xC74D a";
+  const ::wstring str(s, sizeof(s)/sizeof(wchar_t));
+  EXPECT_EQ("L\"'\\\"?\\\\\\a\\b\\f\\n\\0\\r\\t\\v"
+            "\\xD3\\x576\\x8D3\\xC74D a\\0\"",
+            Print(str));
+}
+#endif  // GTEST_HAS_GLOBAL_WSTRING
+
+#if GTEST_HAS_STD_WSTRING
+// ::std::wstring.
+TEST(PrintWideStringTest, StringInStdNamespace) {
+  const wchar_t s[] = L"'\"?\\\a\b\f\n\0\r\t\v\xD3\x576\x8D3\xC74D a";
+  const ::std::wstring str(s, sizeof(s)/sizeof(wchar_t));
+  EXPECT_EQ("L\"'\\\"?\\\\\\a\\b\\f\\n\\0\\r\\t\\v"
+            "\\xD3\\x576\\x8D3\\xC74D a\\0\"",
+            Print(str));
+}
+
+TEST(PrintWideStringTest, StringAmbiguousHex) {
+  // same for wide strings.
+  EXPECT_EQ("L\"0\\x12\" L\"3\"", Print(::std::wstring(L"0\x12" L"3")));
+  EXPECT_EQ("L\"mm\\x6\" L\"bananas\"",
+            Print(::std::wstring(L"mm\x6" L"bananas")));
+  EXPECT_EQ("L\"NOM\\x6\" L\"BANANA\"",
+            Print(::std::wstring(L"NOM\x6" L"BANANA")));
+  EXPECT_EQ("L\"!\\x5-!\"", Print(::std::wstring(L"!\x5-!")));
+}
+#endif  // GTEST_HAS_STD_WSTRING
+
+// Tests printing types that support generic streaming (i.e. streaming
+// to std::basic_ostream<Char, CharTraits> for any valid Char and
+// CharTraits types).
+
+// Tests printing a non-template type that supports generic streaming.
+
+class AllowsGenericStreaming {};
+
+template <typename Char, typename CharTraits>
+std::basic_ostream<Char, CharTraits>& operator<<(
+    std::basic_ostream<Char, CharTraits>& os,
+    const AllowsGenericStreaming& /* a */) {
+  return os << "AllowsGenericStreaming";
+}
+
+TEST(PrintTypeWithGenericStreamingTest, NonTemplateType) {
+  AllowsGenericStreaming a;
+  EXPECT_EQ("AllowsGenericStreaming", Print(a));
+}
+
+// Tests printing a template type that supports generic streaming.
+
+template <typename T>
+class AllowsGenericStreamingTemplate {};
+
+template <typename Char, typename CharTraits, typename T>
+std::basic_ostream<Char, CharTraits>& operator<<(
+    std::basic_ostream<Char, CharTraits>& os,
+    const AllowsGenericStreamingTemplate<T>& /* a */) {
+  return os << "AllowsGenericStreamingTemplate";
+}
+
+TEST(PrintTypeWithGenericStreamingTest, TemplateType) {
+  AllowsGenericStreamingTemplate<int> a;
+  EXPECT_EQ("AllowsGenericStreamingTemplate", Print(a));
+}
+
+// Tests printing a type that supports generic streaming and can be
+// implicitly converted to another printable type.
+
+template <typename T>
+class AllowsGenericStreamingAndImplicitConversionTemplate {
+ public:
+  operator bool() const { return false; }
+};
+
+template <typename Char, typename CharTraits, typename T>
+std::basic_ostream<Char, CharTraits>& operator<<(
+    std::basic_ostream<Char, CharTraits>& os,
+    const AllowsGenericStreamingAndImplicitConversionTemplate<T>& /* a */) {
+  return os << "AllowsGenericStreamingAndImplicitConversionTemplate";
+}
+
+TEST(PrintTypeWithGenericStreamingTest, TypeImplicitlyConvertible) {
+  AllowsGenericStreamingAndImplicitConversionTemplate<int> a;
+  EXPECT_EQ("AllowsGenericStreamingAndImplicitConversionTemplate", Print(a));
+}
+
+#if GTEST_HAS_STRING_PIECE_
+
+// Tests printing StringPiece.
+
+TEST(PrintStringPieceTest, SimpleStringPiece) {
+  const StringPiece sp = "Hello";
+  EXPECT_EQ("\"Hello\"", Print(sp));
+}
+
+TEST(PrintStringPieceTest, UnprintableCharacters) {
+  const char str[] = "NUL (\0) and \r\t";
+  const StringPiece sp(str, sizeof(str) - 1);
+  EXPECT_EQ("\"NUL (\\0) and \\r\\t\"", Print(sp));
+}
+
+#endif  // GTEST_HAS_STRING_PIECE_
+
+// Tests printing STL containers.
+
+TEST(PrintStlContainerTest, EmptyDeque) {
+  deque<char> empty;
+  EXPECT_EQ("{}", Print(empty));
+}
+
+TEST(PrintStlContainerTest, NonEmptyDeque) {
+  deque<int> non_empty;
+  non_empty.push_back(1);
+  non_empty.push_back(3);
+  EXPECT_EQ("{ 1, 3 }", Print(non_empty));
+}
+
+#if GTEST_HAS_HASH_MAP_
+
+TEST(PrintStlContainerTest, OneElementHashMap) {
+  hash_map<int, char> map1;
+  map1[1] = 'a';
+  EXPECT_EQ("{ (1, 'a' (97, 0x61)) }", Print(map1));
+}
+
+TEST(PrintStlContainerTest, HashMultiMap) {
+  hash_multimap<int, bool> map1;
+  map1.insert(make_pair(5, true));
+  map1.insert(make_pair(5, false));
+
+  // Elements of hash_multimap can be printed in any order.
+  const string result = Print(map1);
+  EXPECT_TRUE(result == "{ (5, true), (5, false) }" ||
+              result == "{ (5, false), (5, true) }")
+                  << " where Print(map1) returns \"" << result << "\".";
+}
+
+#endif  // GTEST_HAS_HASH_MAP_
+
+#if GTEST_HAS_HASH_SET_
+
+TEST(PrintStlContainerTest, HashSet) {
+  hash_set<string> set1;
+  set1.insert("hello");
+  EXPECT_EQ("{ \"hello\" }", Print(set1));
+}
+
+TEST(PrintStlContainerTest, HashMultiSet) {
+  const int kSize = 5;
+  int a[kSize] = { 1, 1, 2, 5, 1 };
+  hash_multiset<int> set1(a, a + kSize);
+
+  // Elements of hash_multiset can be printed in any order.
+  const string result = Print(set1);
+  const string expected_pattern = "{ d, d, d, d, d }";  // d means a digit.
+
+  // Verifies the result matches the expected pattern; also extracts
+  // the numbers in the result.
+  ASSERT_EQ(expected_pattern.length(), result.length());
+  std::vector<int> numbers;
+  for (size_t i = 0; i != result.length(); i++) {
+    if (expected_pattern[i] == 'd') {
+      ASSERT_NE(isdigit(static_cast<unsigned char>(result[i])), 0);
+      numbers.push_back(result[i] - '0');
+    } else {
+      EXPECT_EQ(expected_pattern[i], result[i]) << " where result is "
+                                                << result;
+    }
+  }
+
+  // Makes sure the result contains the right numbers.
+  std::sort(numbers.begin(), numbers.end());
+  std::sort(a, a + kSize);
+  EXPECT_TRUE(std::equal(a, a + kSize, numbers.begin()));
+}
+
+#endif  // GTEST_HAS_HASH_SET_
+
+TEST(PrintStlContainerTest, List) {
+  const string a[] = {
+    "hello",
+    "world"
+  };
+  const list<string> strings(a, a + 2);
+  EXPECT_EQ("{ \"hello\", \"world\" }", Print(strings));
+}
+
+TEST(PrintStlContainerTest, Map) {
+  map<int, bool> map1;
+  map1[1] = true;
+  map1[5] = false;
+  map1[3] = true;
+  EXPECT_EQ("{ (1, true), (3, true), (5, false) }", Print(map1));
+}
+
+TEST(PrintStlContainerTest, MultiMap) {
+  multimap<bool, int> map1;
+  // The make_pair template function would deduce the type as
+  // pair<bool, int> here, and since the key part in a multimap has to
+  // be constant, without a templated ctor in the pair class (as in
+  // libCstd on Solaris), make_pair call would fail to compile as no
+  // implicit conversion is found.  Thus explicit typename is used
+  // here instead.
+  map1.insert(pair<const bool, int>(true, 0));
+  map1.insert(pair<const bool, int>(true, 1));
+  map1.insert(pair<const bool, int>(false, 2));
+  EXPECT_EQ("{ (false, 2), (true, 0), (true, 1) }", Print(map1));
+}
+
+TEST(PrintStlContainerTest, Set) {
+  const unsigned int a[] = { 3, 0, 5 };
+  set<unsigned int> set1(a, a + 3);
+  EXPECT_EQ("{ 0, 3, 5 }", Print(set1));
+}
+
+TEST(PrintStlContainerTest, MultiSet) {
+  const int a[] = { 1, 1, 2, 5, 1 };
+  multiset<int> set1(a, a + 5);
+  EXPECT_EQ("{ 1, 1, 1, 2, 5 }", Print(set1));
+}
+
+TEST(PrintStlContainerTest, Pair) {
+  pair<const bool, int> p(true, 5);
+  EXPECT_EQ("(true, 5)", Print(p));
+}
+
+TEST(PrintStlContainerTest, Vector) {
+  vector<int> v;
+  v.push_back(1);
+  v.push_back(2);
+  EXPECT_EQ("{ 1, 2 }", Print(v));
+}
+
+TEST(PrintStlContainerTest, LongSequence) {
+  const int a[100] = { 1, 2, 3 };
+  const vector<int> v(a, a + 100);
+  EXPECT_EQ("{ 1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "
+            "0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ... }", Print(v));
+}
+
+TEST(PrintStlContainerTest, NestedContainer) {
+  const int a1[] = { 1, 2 };
+  const int a2[] = { 3, 4, 5 };
+  const list<int> l1(a1, a1 + 2);
+  const list<int> l2(a2, a2 + 3);
+
+  vector<list<int> > v;
+  v.push_back(l1);
+  v.push_back(l2);
+  EXPECT_EQ("{ { 1, 2 }, { 3, 4, 5 } }", Print(v));
+}
+
+TEST(PrintStlContainerTest, OneDimensionalNativeArray) {
+  const int a[3] = { 1, 2, 3 };
+  NativeArray<int> b(a, 3, kReference);
+  EXPECT_EQ("{ 1, 2, 3 }", Print(b));
+}
+
+TEST(PrintStlContainerTest, TwoDimensionalNativeArray) {
+  const int a[2][3] = { { 1, 2, 3 }, { 4, 5, 6 } };
+  NativeArray<int[3]> b(a, 2, kReference);
+  EXPECT_EQ("{ { 1, 2, 3 }, { 4, 5, 6 } }", Print(b));
+}
+
+// Tests that a class named iterator isn't treated as a container.
+
+struct iterator {
+  char x;
+};
+
+TEST(PrintStlContainerTest, Iterator) {
+  iterator it = {};
+  EXPECT_EQ("1-byte object <00>", Print(it));
+}
+
+// Tests that a class named const_iterator isn't treated as a container.
+
+struct const_iterator {
+  char x;
+};
+
+TEST(PrintStlContainerTest, ConstIterator) {
+  const_iterator it = {};
+  EXPECT_EQ("1-byte object <00>", Print(it));
+}
+
+#if GTEST_HAS_TR1_TUPLE
+// Tests printing tuples.
+
+// Tuples of various arities.
+TEST(PrintTupleTest, VariousSizes) {
+  tuple<> t0;
+  EXPECT_EQ("()", Print(t0));
+
+  tuple<int> t1(5);
+  EXPECT_EQ("(5)", Print(t1));
+
+  tuple<char, bool> t2('a', true);
+  EXPECT_EQ("('a' (97, 0x61), true)", Print(t2));
+
+  tuple<bool, int, int> t3(false, 2, 3);
+  EXPECT_EQ("(false, 2, 3)", Print(t3));
+
+  tuple<bool, int, int, int> t4(false, 2, 3, 4);
+  EXPECT_EQ("(false, 2, 3, 4)", Print(t4));
+
+  tuple<bool, int, int, int, bool> t5(false, 2, 3, 4, true);
+  EXPECT_EQ("(false, 2, 3, 4, true)", Print(t5));
+
+  tuple<bool, int, int, int, bool, int> t6(false, 2, 3, 4, true, 6);
+  EXPECT_EQ("(false, 2, 3, 4, true, 6)", Print(t6));
+
+  tuple<bool, int, int, int, bool, int, int> t7(false, 2, 3, 4, true, 6, 7);
+  EXPECT_EQ("(false, 2, 3, 4, true, 6, 7)", Print(t7));
+
+  tuple<bool, int, int, int, bool, int, int, bool> t8(
+      false, 2, 3, 4, true, 6, 7, true);
+  EXPECT_EQ("(false, 2, 3, 4, true, 6, 7, true)", Print(t8));
+
+  tuple<bool, int, int, int, bool, int, int, bool, int> t9(
+      false, 2, 3, 4, true, 6, 7, true, 9);
+  EXPECT_EQ("(false, 2, 3, 4, true, 6, 7, true, 9)", Print(t9));
+
+  const char* const str = "8";
+  // VC++ 2010's implementation of tuple of C++0x is deficient, requiring
+  // an explicit type cast of NULL to be used.
+  tuple<bool, char, short, testing::internal::Int32,  // NOLINT
+      testing::internal::Int64, float, double, const char*, void*, string>
+      t10(false, 'a', 3, 4, 5, 1.5F, -2.5, str,
+          ImplicitCast_<void*>(NULL), "10");
+  EXPECT_EQ("(false, 'a' (97, 0x61), 3, 4, 5, 1.5, -2.5, " + PrintPointer(str) +
+            " pointing to \"8\", NULL, \"10\")",
+            Print(t10));
+}
+
+// Nested tuples.
+TEST(PrintTupleTest, NestedTuple) {
+  tuple<tuple<int, bool>, char> nested(make_tuple(5, true), 'a');
+  EXPECT_EQ("((5, true), 'a' (97, 0x61))", Print(nested));
+}
+
+#endif  // GTEST_HAS_TR1_TUPLE
+
+// Tests printing user-defined unprintable types.
+
+// Unprintable types in the global namespace.
+TEST(PrintUnprintableTypeTest, InGlobalNamespace) {
+  EXPECT_EQ("1-byte object <00>",
+            Print(UnprintableTemplateInGlobal<char>()));
+}
+
+// Unprintable types in a user namespace.
+TEST(PrintUnprintableTypeTest, InUserNamespace) {
+  EXPECT_EQ("16-byte object <EF-12 00-00 34-AB 00-00 00-00 00-00 00-00 00-00>",
+            Print(::foo::UnprintableInFoo()));
+}
+
+// Unprintable types are that too big to be printed completely.
+
+struct Big {
+  Big() { memset(array, 0, sizeof(array)); }
+  char array[257];
+};
+
+TEST(PrintUnpritableTypeTest, BigObject) {
+  EXPECT_EQ("257-byte object <00-00 00-00 00-00 00-00 00-00 00-00 "
+            "00-00 00-00 00-00 00-00 00-00 00-00 00-00 00-00 00-00 00-00 "
+            "00-00 00-00 00-00 00-00 00-00 00-00 00-00 00-00 00-00 00-00 "
+            "00-00 00-00 00-00 00-00 00-00 00-00 ... 00-00 00-00 00-00 "
+            "00-00 00-00 00-00 00-00 00-00 00-00 00-00 00-00 00-00 00-00 "
+            "00-00 00-00 00-00 00-00 00-00 00-00 00-00 00-00 00-00 00-00 "
+            "00-00 00-00 00-00 00-00 00-00 00-00 00-00 00-00 00>",
+            Print(Big()));
+}
+
+// Tests printing user-defined streamable types.
+
+// Streamable types in the global namespace.
+TEST(PrintStreamableTypeTest, InGlobalNamespace) {
+  StreamableInGlobal x;
+  EXPECT_EQ("StreamableInGlobal", Print(x));
+  EXPECT_EQ("StreamableInGlobal*", Print(&x));
+}
+
+// Printable template types in a user namespace.
+TEST(PrintStreamableTypeTest, TemplateTypeInUserNamespace) {
+  EXPECT_EQ("StreamableTemplateInFoo: 0",
+            Print(::foo::StreamableTemplateInFoo<int>()));
+}
+
+// Tests printing user-defined types that have a PrintTo() function.
+TEST(PrintPrintableTypeTest, InUserNamespace) {
+  EXPECT_EQ("PrintableViaPrintTo: 0",
+            Print(::foo::PrintableViaPrintTo()));
+}
+
+// Tests printing a pointer to a user-defined type that has a <<
+// operator for its pointer.
+TEST(PrintPrintableTypeTest, PointerInUserNamespace) {
+  ::foo::PointerPrintable x;
+  EXPECT_EQ("PointerPrintable*", Print(&x));
+}
+
+// Tests printing user-defined class template that have a PrintTo() function.
+TEST(PrintPrintableTypeTest, TemplateInUserNamespace) {
+  EXPECT_EQ("PrintableViaPrintToTemplate: 5",
+            Print(::foo::PrintableViaPrintToTemplate<int>(5)));
+}
+
+#if GTEST_HAS_PROTOBUF_
+
+// Tests printing a protocol message.
+TEST(PrintProtocolMessageTest, PrintsShortDebugString) {
+  testing::internal::TestMessage msg;
+  msg.set_member("yes");
+  EXPECT_EQ("<member:\"yes\">", Print(msg));
+}
+
+// Tests printing a short proto2 message.
+TEST(PrintProto2MessageTest, PrintsShortDebugStringWhenItIsShort) {
+  testing::internal::FooMessage msg;
+  msg.set_int_field(2);
+  msg.set_string_field("hello");
+  EXPECT_PRED2(RE::FullMatch, Print(msg),
+               "<int_field:\\s*2\\s+string_field:\\s*\"hello\">");
+}
+
+// Tests printing a long proto2 message.
+TEST(PrintProto2MessageTest, PrintsDebugStringWhenItIsLong) {
+  testing::internal::FooMessage msg;
+  msg.set_int_field(2);
+  msg.set_string_field("hello");
+  msg.add_names("peter");
+  msg.add_names("paul");
+  msg.add_names("mary");
+  EXPECT_PRED2(RE::FullMatch, Print(msg),
+               "<\n"
+               "int_field:\\s*2\n"
+               "string_field:\\s*\"hello\"\n"
+               "names:\\s*\"peter\"\n"
+               "names:\\s*\"paul\"\n"
+               "names:\\s*\"mary\"\n"
+               ">");
+}
+
+#endif  // GTEST_HAS_PROTOBUF_
+
+// Tests that the universal printer prints both the address and the
+// value of a reference.
+TEST(PrintReferenceTest, PrintsAddressAndValue) {
+  int n = 5;
+  EXPECT_EQ("@" + PrintPointer(&n) + " 5", PrintByRef(n));
+
+  int a[2][3] = {
+    { 0, 1, 2 },
+    { 3, 4, 5 }
+  };
+  EXPECT_EQ("@" + PrintPointer(a) + " { { 0, 1, 2 }, { 3, 4, 5 } }",
+            PrintByRef(a));
+
+  const ::foo::UnprintableInFoo x;
+  EXPECT_EQ("@" + PrintPointer(&x) + " 16-byte object "
+            "<EF-12 00-00 34-AB 00-00 00-00 00-00 00-00 00-00>",
+            PrintByRef(x));
+}
+
+// Tests that the universal printer prints a function pointer passed by
+// reference.
+TEST(PrintReferenceTest, HandlesFunctionPointer) {
+  void (*fp)(int n) = &MyFunction;
+  const string fp_pointer_string =
+      PrintPointer(reinterpret_cast<const void*>(&fp));
+  // We cannot directly cast &MyFunction to const void* because the
+  // standard disallows casting between pointers to functions and
+  // pointers to objects, and some compilers (e.g. GCC 3.4) enforce
+  // this limitation.
+  const string fp_string = PrintPointer(reinterpret_cast<const void*>(
+      reinterpret_cast<internal::BiggestInt>(fp)));
+  EXPECT_EQ("@" + fp_pointer_string + " " + fp_string,
+            PrintByRef(fp));
+}
+
+// Tests that the universal printer prints a member function pointer
+// passed by reference.
+TEST(PrintReferenceTest, HandlesMemberFunctionPointer) {
+  int (Foo::*p)(char ch) = &Foo::MyMethod;
+  EXPECT_TRUE(HasPrefix(
+      PrintByRef(p),
+      "@" + PrintPointer(reinterpret_cast<const void*>(&p)) + " " +
+          Print(sizeof(p)) + "-byte object "));
+
+  char (Foo::*p2)(int n) = &Foo::MyVirtualMethod;
+  EXPECT_TRUE(HasPrefix(
+      PrintByRef(p2),
+      "@" + PrintPointer(reinterpret_cast<const void*>(&p2)) + " " +
+          Print(sizeof(p2)) + "-byte object "));
+}
+
+// Tests that the universal printer prints a member variable pointer
+// passed by reference.
+TEST(PrintReferenceTest, HandlesMemberVariablePointer) {
+  int (Foo::*p) = &Foo::value;  // NOLINT
+  EXPECT_TRUE(HasPrefix(
+      PrintByRef(p),
+      "@" + PrintPointer(&p) + " " + Print(sizeof(p)) + "-byte object "));
+}
+
+// Tests that FormatForComparisonFailureMessage(), which is used to print
+// an operand in a comparison assertion (e.g. ASSERT_EQ) when the assertion
+// fails, formats the operand in the desired way.
+
+// scalar
+TEST(FormatForComparisonFailureMessageTest, WorksForScalar) {
+  EXPECT_STREQ("123",
+               FormatForComparisonFailureMessage(123, 124).c_str());
+}
+
+// non-char pointer
+TEST(FormatForComparisonFailureMessageTest, WorksForNonCharPointer) {
+  int n = 0;
+  EXPECT_EQ(PrintPointer(&n),
+            FormatForComparisonFailureMessage(&n, &n).c_str());
+}
+
+// non-char array
+TEST(FormatForComparisonFailureMessageTest, FormatsNonCharArrayAsPointer) {
+  // In expression 'array == x', 'array' is compared by pointer.
+  // Therefore we want to print an array operand as a pointer.
+  int n[] = { 1, 2, 3 };
+  EXPECT_EQ(PrintPointer(n),
+            FormatForComparisonFailureMessage(n, n).c_str());
+}
+
+// Tests formatting a char pointer when it's compared with another pointer.
+// In this case we want to print it as a raw pointer, as the comparision is by
+// pointer.
+
+// char pointer vs pointer
+TEST(FormatForComparisonFailureMessageTest, WorksForCharPointerVsPointer) {
+  // In expression 'p == x', where 'p' and 'x' are (const or not) char
+  // pointers, the operands are compared by pointer.  Therefore we
+  // want to print 'p' as a pointer instead of a C string (we don't
+  // even know if it's supposed to point to a valid C string).
+
+  // const char*
+  const char* s = "hello";
+  EXPECT_EQ(PrintPointer(s),
+            FormatForComparisonFailureMessage(s, s).c_str());
+
+  // char*
+  char ch = 'a';
+  EXPECT_EQ(PrintPointer(&ch),
+            FormatForComparisonFailureMessage(&ch, &ch).c_str());
+}
+
+// wchar_t pointer vs pointer
+TEST(FormatForComparisonFailureMessageTest, WorksForWCharPointerVsPointer) {
+  // In expression 'p == x', where 'p' and 'x' are (const or not) char
+  // pointers, the operands are compared by pointer.  Therefore we
+  // want to print 'p' as a pointer instead of a wide C string (we don't
+  // even know if it's supposed to point to a valid wide C string).
+
+  // const wchar_t*
+  const wchar_t* s = L"hello";
+  EXPECT_EQ(PrintPointer(s),
+            FormatForComparisonFailureMessage(s, s).c_str());
+
+  // wchar_t*
+  wchar_t ch = L'a';
+  EXPECT_EQ(PrintPointer(&ch),
+            FormatForComparisonFailureMessage(&ch, &ch).c_str());
+}
+
+// Tests formatting a char pointer when it's compared to a string object.
+// In this case we want to print the char pointer as a C string.
+
+#if GTEST_HAS_GLOBAL_STRING
+// char pointer vs ::string
+TEST(FormatForComparisonFailureMessageTest, WorksForCharPointerVsString) {
+  const char* s = "hello \"world";
+  EXPECT_STREQ("\"hello \\\"world\"",  // The string content should be escaped.
+               FormatForComparisonFailureMessage(s, ::string()).c_str());
+
+  // char*
+  char str[] = "hi\1";
+  char* p = str;
+  EXPECT_STREQ("\"hi\\x1\"",  // The string content should be escaped.
+               FormatForComparisonFailureMessage(p, ::string()).c_str());
+}
+#endif
+
+// char pointer vs std::string
+TEST(FormatForComparisonFailureMessageTest, WorksForCharPointerVsStdString) {
+  const char* s = "hello \"world";
+  EXPECT_STREQ("\"hello \\\"world\"",  // The string content should be escaped.
+               FormatForComparisonFailureMessage(s, ::std::string()).c_str());
+
+  // char*
+  char str[] = "hi\1";
+  char* p = str;
+  EXPECT_STREQ("\"hi\\x1\"",  // The string content should be escaped.
+               FormatForComparisonFailureMessage(p, ::std::string()).c_str());
+}
+
+#if GTEST_HAS_GLOBAL_WSTRING
+// wchar_t pointer vs ::wstring
+TEST(FormatForComparisonFailureMessageTest, WorksForWCharPointerVsWString) {
+  const wchar_t* s = L"hi \"world";
+  EXPECT_STREQ("L\"hi \\\"world\"",  // The string content should be escaped.
+               FormatForComparisonFailureMessage(s, ::wstring()).c_str());
+
+  // wchar_t*
+  wchar_t str[] = L"hi\1";
+  wchar_t* p = str;
+  EXPECT_STREQ("L\"hi\\x1\"",  // The string content should be escaped.
+               FormatForComparisonFailureMessage(p, ::wstring()).c_str());
+}
+#endif
+
+#if GTEST_HAS_STD_WSTRING
+// wchar_t pointer vs std::wstring
+TEST(FormatForComparisonFailureMessageTest, WorksForWCharPointerVsStdWString) {
+  const wchar_t* s = L"hi \"world";
+  EXPECT_STREQ("L\"hi \\\"world\"",  // The string content should be escaped.
+               FormatForComparisonFailureMessage(s, ::std::wstring()).c_str());
+
+  // wchar_t*
+  wchar_t str[] = L"hi\1";
+  wchar_t* p = str;
+  EXPECT_STREQ("L\"hi\\x1\"",  // The string content should be escaped.
+               FormatForComparisonFailureMessage(p, ::std::wstring()).c_str());
+}
+#endif
+
+// Tests formatting a char array when it's compared with a pointer or array.
+// In this case we want to print the array as a row pointer, as the comparison
+// is by pointer.
+
+// char array vs pointer
+TEST(FormatForComparisonFailureMessageTest, WorksForCharArrayVsPointer) {
+  char str[] = "hi \"world\"";
+  char* p = NULL;
+  EXPECT_EQ(PrintPointer(str),
+            FormatForComparisonFailureMessage(str, p).c_str());
+}
+
+// char array vs char array
+TEST(FormatForComparisonFailureMessageTest, WorksForCharArrayVsCharArray) {
+  const char str[] = "hi \"world\"";
+  EXPECT_EQ(PrintPointer(str),
+            FormatForComparisonFailureMessage(str, str).c_str());
+}
+
+// wchar_t array vs pointer
+TEST(FormatForComparisonFailureMessageTest, WorksForWCharArrayVsPointer) {
+  wchar_t str[] = L"hi \"world\"";
+  wchar_t* p = NULL;
+  EXPECT_EQ(PrintPointer(str),
+            FormatForComparisonFailureMessage(str, p).c_str());
+}
+
+// wchar_t array vs wchar_t array
+TEST(FormatForComparisonFailureMessageTest, WorksForWCharArrayVsWCharArray) {
+  const wchar_t str[] = L"hi \"world\"";
+  EXPECT_EQ(PrintPointer(str),
+            FormatForComparisonFailureMessage(str, str).c_str());
+}
+
+// Tests formatting a char array when it's compared with a string object.
+// In this case we want to print the array as a C string.
+
+#if GTEST_HAS_GLOBAL_STRING
+// char array vs string
+TEST(FormatForComparisonFailureMessageTest, WorksForCharArrayVsString) {
+  const char str[] = "hi \"w\0rld\"";
+  EXPECT_STREQ("\"hi \\\"w\"",  // The content should be escaped.
+                                // Embedded NUL terminates the string.
+               FormatForComparisonFailureMessage(str, ::string()).c_str());
+}
+#endif
+
+// char array vs std::string
+TEST(FormatForComparisonFailureMessageTest, WorksForCharArrayVsStdString) {
+  const char str[] = "hi \"world\"";
+  EXPECT_STREQ("\"hi \\\"world\\\"\"",  // The content should be escaped.
+               FormatForComparisonFailureMessage(str, ::std::string()).c_str());
+}
+
+#if GTEST_HAS_GLOBAL_WSTRING
+// wchar_t array vs wstring
+TEST(FormatForComparisonFailureMessageTest, WorksForWCharArrayVsWString) {
+  const wchar_t str[] = L"hi \"world\"";
+  EXPECT_STREQ("L\"hi \\\"world\\\"\"",  // The content should be escaped.
+               FormatForComparisonFailureMessage(str, ::wstring()).c_str());
+}
+#endif
+
+#if GTEST_HAS_STD_WSTRING
+// wchar_t array vs std::wstring
+TEST(FormatForComparisonFailureMessageTest, WorksForWCharArrayVsStdWString) {
+  const wchar_t str[] = L"hi \"w\0rld\"";
+  EXPECT_STREQ(
+      "L\"hi \\\"w\"",  // The content should be escaped.
+                        // Embedded NUL terminates the string.
+      FormatForComparisonFailureMessage(str, ::std::wstring()).c_str());
+}
+#endif
+
+// Useful for testing PrintToString().  We cannot use EXPECT_EQ()
+// there as its implementation uses PrintToString().  The caller must
+// ensure that 'value' has no side effect.
+#define EXPECT_PRINT_TO_STRING_(value, expected_string)         \
+  EXPECT_TRUE(PrintToString(value) == (expected_string))        \
+      << " where " #value " prints as " << (PrintToString(value))
+
+TEST(PrintToStringTest, WorksForScalar) {
+  EXPECT_PRINT_TO_STRING_(123, "123");
+}
+
+TEST(PrintToStringTest, WorksForPointerToConstChar) {
+  const char* p = "hello";
+  EXPECT_PRINT_TO_STRING_(p, "\"hello\"");
+}
+
+TEST(PrintToStringTest, WorksForPointerToNonConstChar) {
+  char s[] = "hello";
+  char* p = s;
+  EXPECT_PRINT_TO_STRING_(p, "\"hello\"");
+}
+
+TEST(PrintToStringTest, EscapesForPointerToConstChar) {
+  const char* p = "hello\n";
+  EXPECT_PRINT_TO_STRING_(p, "\"hello\\n\"");
+}
+
+TEST(PrintToStringTest, EscapesForPointerToNonConstChar) {
+  char s[] = "hello\1";
+  char* p = s;
+  EXPECT_PRINT_TO_STRING_(p, "\"hello\\x1\"");
+}
+
+TEST(PrintToStringTest, WorksForArray) {
+  int n[3] = { 1, 2, 3 };
+  EXPECT_PRINT_TO_STRING_(n, "{ 1, 2, 3 }");
+}
+
+TEST(PrintToStringTest, WorksForCharArray) {
+  char s[] = "hello";
+  EXPECT_PRINT_TO_STRING_(s, "\"hello\"");
+}
+
+TEST(PrintToStringTest, WorksForCharArrayWithEmbeddedNul) {
+  const char str_with_nul[] = "hello\0 world";
+  EXPECT_PRINT_TO_STRING_(str_with_nul, "\"hello\\0 world\"");
+
+  char mutable_str_with_nul[] = "hello\0 world";
+  EXPECT_PRINT_TO_STRING_(mutable_str_with_nul, "\"hello\\0 world\"");
+}
+
+#undef EXPECT_PRINT_TO_STRING_
+
+TEST(UniversalTersePrintTest, WorksForNonReference) {
+  ::std::stringstream ss;
+  UniversalTersePrint(123, &ss);
+  EXPECT_EQ("123", ss.str());
+}
+
+TEST(UniversalTersePrintTest, WorksForReference) {
+  const int& n = 123;
+  ::std::stringstream ss;
+  UniversalTersePrint(n, &ss);
+  EXPECT_EQ("123", ss.str());
+}
+
+TEST(UniversalTersePrintTest, WorksForCString) {
+  const char* s1 = "abc";
+  ::std::stringstream ss1;
+  UniversalTersePrint(s1, &ss1);
+  EXPECT_EQ("\"abc\"", ss1.str());
+
+  char* s2 = const_cast<char*>(s1);
+  ::std::stringstream ss2;
+  UniversalTersePrint(s2, &ss2);
+  EXPECT_EQ("\"abc\"", ss2.str());
+
+  const char* s3 = NULL;
+  ::std::stringstream ss3;
+  UniversalTersePrint(s3, &ss3);
+  EXPECT_EQ("NULL", ss3.str());
+}
+
+TEST(UniversalPrintTest, WorksForNonReference) {
+  ::std::stringstream ss;
+  UniversalPrint(123, &ss);
+  EXPECT_EQ("123", ss.str());
+}
+
+TEST(UniversalPrintTest, WorksForReference) {
+  const int& n = 123;
+  ::std::stringstream ss;
+  UniversalPrint(n, &ss);
+  EXPECT_EQ("123", ss.str());
+}
+
+TEST(UniversalPrintTest, WorksForCString) {
+  const char* s1 = "abc";
+  ::std::stringstream ss1;
+  UniversalPrint(s1, &ss1);
+  EXPECT_EQ(PrintPointer(s1) + " pointing to \"abc\"", string(ss1.str()));
+
+  char* s2 = const_cast<char*>(s1);
+  ::std::stringstream ss2;
+  UniversalPrint(s2, &ss2);
+  EXPECT_EQ(PrintPointer(s2) + " pointing to \"abc\"", string(ss2.str()));
+
+  const char* s3 = NULL;
+  ::std::stringstream ss3;
+  UniversalPrint(s3, &ss3);
+  EXPECT_EQ("NULL", ss3.str());
+}
+
+TEST(UniversalPrintTest, WorksForCharArray) {
+  const char str[] = "\"Line\0 1\"\nLine 2";
+  ::std::stringstream ss1;
+  UniversalPrint(str, &ss1);
+  EXPECT_EQ("\"\\\"Line\\0 1\\\"\\nLine 2\"", ss1.str());
+
+  const char mutable_str[] = "\"Line\0 1\"\nLine 2";
+  ::std::stringstream ss2;
+  UniversalPrint(mutable_str, &ss2);
+  EXPECT_EQ("\"\\\"Line\\0 1\\\"\\nLine 2\"", ss2.str());
+}
+
+#if GTEST_HAS_TR1_TUPLE
+
+TEST(UniversalTersePrintTupleFieldsToStringsTest, PrintsEmptyTuple) {
+  Strings result = UniversalTersePrintTupleFieldsToStrings(make_tuple());
+  EXPECT_EQ(0u, result.size());
+}
+
+TEST(UniversalTersePrintTupleFieldsToStringsTest, PrintsOneTuple) {
+  Strings result = UniversalTersePrintTupleFieldsToStrings(make_tuple(1));
+  ASSERT_EQ(1u, result.size());
+  EXPECT_EQ("1", result[0]);
+}
+
+TEST(UniversalTersePrintTupleFieldsToStringsTest, PrintsTwoTuple) {
+  Strings result = UniversalTersePrintTupleFieldsToStrings(make_tuple(1, 'a'));
+  ASSERT_EQ(2u, result.size());
+  EXPECT_EQ("1", result[0]);
+  EXPECT_EQ("'a' (97, 0x61)", result[1]);
+}
+
+TEST(UniversalTersePrintTupleFieldsToStringsTest, PrintsTersely) {
+  const int n = 1;
+  Strings result = UniversalTersePrintTupleFieldsToStrings(
+      tuple<const int&, const char*>(n, "a"));
+  ASSERT_EQ(2u, result.size());
+  EXPECT_EQ("1", result[0]);
+  EXPECT_EQ("\"a\"", result[1]);
+}
+
+#endif  // GTEST_HAS_TR1_TUPLE
+
+}  // namespace gtest_printers_test
+}  // namespace testing
diff --git a/contrib/gtest-1.7.0/test/gtest-test-part_test.cc b/contrib/gtest-1.7.0/test/gtest-test-part_test.cc
new file mode 100644
index 0000000..ca8ba93
--- /dev/null
+++ b/contrib/gtest-1.7.0/test/gtest-test-part_test.cc
@@ -0,0 +1,208 @@
+// Copyright 2008 Google Inc.
+// All Rights Reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: mheule at google.com (Markus Heule)
+//
+
+#include "gtest/gtest-test-part.h"
+
+#include "gtest/gtest.h"
+
+using testing::Message;
+using testing::Test;
+using testing::TestPartResult;
+using testing::TestPartResultArray;
+
+namespace {
+
+// Tests the TestPartResult class.
+
+// The test fixture for testing TestPartResult.
+class TestPartResultTest : public Test {
+ protected:
+  TestPartResultTest()
+      : r1_(TestPartResult::kSuccess, "foo/bar.cc", 10, "Success!"),
+        r2_(TestPartResult::kNonFatalFailure, "foo/bar.cc", -1, "Failure!"),
+        r3_(TestPartResult::kFatalFailure, NULL, -1, "Failure!") {}
+
+  TestPartResult r1_, r2_, r3_;
+};
+
+
+TEST_F(TestPartResultTest, ConstructorWorks) {
+  Message message;
+  message << "something is terribly wrong";
+  message << static_cast<const char*>(testing::internal::kStackTraceMarker);
+  message << "some unimportant stack trace";
+
+  const TestPartResult result(TestPartResult::kNonFatalFailure,
+                              "some_file.cc",
+                              42,
+                              message.GetString().c_str());
+
+  EXPECT_EQ(TestPartResult::kNonFatalFailure, result.type());
+  EXPECT_STREQ("some_file.cc", result.file_name());
+  EXPECT_EQ(42, result.line_number());
+  EXPECT_STREQ(message.GetString().c_str(), result.message());
+  EXPECT_STREQ("something is terribly wrong", result.summary());
+}
+
+TEST_F(TestPartResultTest, ResultAccessorsWork) {
+  const TestPartResult success(TestPartResult::kSuccess,
+                               "file.cc",
+                               42,
+                               "message");
+  EXPECT_TRUE(success.passed());
+  EXPECT_FALSE(success.failed());
+  EXPECT_FALSE(success.nonfatally_failed());
+  EXPECT_FALSE(success.fatally_failed());
+
+  const TestPartResult nonfatal_failure(TestPartResult::kNonFatalFailure,
+                                        "file.cc",
+                                        42,
+                                        "message");
+  EXPECT_FALSE(nonfatal_failure.passed());
+  EXPECT_TRUE(nonfatal_failure.failed());
+  EXPECT_TRUE(nonfatal_failure.nonfatally_failed());
+  EXPECT_FALSE(nonfatal_failure.fatally_failed());
+
+  const TestPartResult fatal_failure(TestPartResult::kFatalFailure,
+                                     "file.cc",
+                                     42,
+                                     "message");
+  EXPECT_FALSE(fatal_failure.passed());
+  EXPECT_TRUE(fatal_failure.failed());
+  EXPECT_FALSE(fatal_failure.nonfatally_failed());
+  EXPECT_TRUE(fatal_failure.fatally_failed());
+}
+
+// Tests TestPartResult::type().
+TEST_F(TestPartResultTest, type) {
+  EXPECT_EQ(TestPartResult::kSuccess, r1_.type());
+  EXPECT_EQ(TestPartResult::kNonFatalFailure, r2_.type());
+  EXPECT_EQ(TestPartResult::kFatalFailure, r3_.type());
+}
+
+// Tests TestPartResult::file_name().
+TEST_F(TestPartResultTest, file_name) {
+  EXPECT_STREQ("foo/bar.cc", r1_.file_name());
+  EXPECT_STREQ(NULL, r3_.file_name());
+}
+
+// Tests TestPartResult::line_number().
+TEST_F(TestPartResultTest, line_number) {
+  EXPECT_EQ(10, r1_.line_number());
+  EXPECT_EQ(-1, r2_.line_number());
+}
+
+// Tests TestPartResult::message().
+TEST_F(TestPartResultTest, message) {
+  EXPECT_STREQ("Success!", r1_.message());
+}
+
+// Tests TestPartResult::passed().
+TEST_F(TestPartResultTest, Passed) {
+  EXPECT_TRUE(r1_.passed());
+  EXPECT_FALSE(r2_.passed());
+  EXPECT_FALSE(r3_.passed());
+}
+
+// Tests TestPartResult::failed().
+TEST_F(TestPartResultTest, Failed) {
+  EXPECT_FALSE(r1_.failed());
+  EXPECT_TRUE(r2_.failed());
+  EXPECT_TRUE(r3_.failed());
+}
+
+// Tests TestPartResult::fatally_failed().
+TEST_F(TestPartResultTest, FatallyFailed) {
+  EXPECT_FALSE(r1_.fatally_failed());
+  EXPECT_FALSE(r2_.fatally_failed());
+  EXPECT_TRUE(r3_.fatally_failed());
+}
+
+// Tests TestPartResult::nonfatally_failed().
+TEST_F(TestPartResultTest, NonfatallyFailed) {
+  EXPECT_FALSE(r1_.nonfatally_failed());
+  EXPECT_TRUE(r2_.nonfatally_failed());
+  EXPECT_FALSE(r3_.nonfatally_failed());
+}
+
+// Tests the TestPartResultArray class.
+
+class TestPartResultArrayTest : public Test {
+ protected:
+  TestPartResultArrayTest()
+      : r1_(TestPartResult::kNonFatalFailure, "foo/bar.cc", -1, "Failure 1"),
+        r2_(TestPartResult::kFatalFailure, "foo/bar.cc", -1, "Failure 2") {}
+
+  const TestPartResult r1_, r2_;
+};
+
+// Tests that TestPartResultArray initially has size 0.
+TEST_F(TestPartResultArrayTest, InitialSizeIsZero) {
+  TestPartResultArray results;
+  EXPECT_EQ(0, results.size());
+}
+
+// Tests that TestPartResultArray contains the given TestPartResult
+// after one Append() operation.
+TEST_F(TestPartResultArrayTest, ContainsGivenResultAfterAppend) {
+  TestPartResultArray results;
+  results.Append(r1_);
+  EXPECT_EQ(1, results.size());
+  EXPECT_STREQ("Failure 1", results.GetTestPartResult(0).message());
+}
+
+// Tests that TestPartResultArray contains the given TestPartResults
+// after two Append() operations.
+TEST_F(TestPartResultArrayTest, ContainsGivenResultsAfterTwoAppends) {
+  TestPartResultArray results;
+  results.Append(r1_);
+  results.Append(r2_);
+  EXPECT_EQ(2, results.size());
+  EXPECT_STREQ("Failure 1", results.GetTestPartResult(0).message());
+  EXPECT_STREQ("Failure 2", results.GetTestPartResult(1).message());
+}
+
+typedef TestPartResultArrayTest TestPartResultArrayDeathTest;
+
+// Tests that the program dies when GetTestPartResult() is called with
+// an invalid index.
+TEST_F(TestPartResultArrayDeathTest, DiesWhenIndexIsOutOfBound) {
+  TestPartResultArray results;
+  results.Append(r1_);
+
+  EXPECT_DEATH_IF_SUPPORTED(results.GetTestPartResult(-1), "");
+  EXPECT_DEATH_IF_SUPPORTED(results.GetTestPartResult(1), "");
+}
+
+// TODO(mheule at google.com): Add a test for the class HasNewFatalFailureHelper.
+
+}  // namespace
diff --git a/contrib/gtest-1.7.0/test/gtest-tuple_test.cc b/contrib/gtest-1.7.0/test/gtest-tuple_test.cc
new file mode 100644
index 0000000..bfaa3e0
--- /dev/null
+++ b/contrib/gtest-1.7.0/test/gtest-tuple_test.cc
@@ -0,0 +1,320 @@
+// Copyright 2007, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+
+#include "gtest/internal/gtest-tuple.h"
+#include <utility>
+#include "gtest/gtest.h"
+
+namespace {
+
+using ::std::tr1::get;
+using ::std::tr1::make_tuple;
+using ::std::tr1::tuple;
+using ::std::tr1::tuple_element;
+using ::std::tr1::tuple_size;
+using ::testing::StaticAssertTypeEq;
+
+// Tests that tuple_element<K, tuple<T0, T1, ..., TN> >::type returns TK.
+TEST(tuple_element_Test, ReturnsElementType) {
+  StaticAssertTypeEq<int, tuple_element<0, tuple<int, char> >::type>();
+  StaticAssertTypeEq<int&, tuple_element<1, tuple<double, int&> >::type>();
+  StaticAssertTypeEq<bool, tuple_element<2, tuple<double, int, bool> >::type>();
+}
+
+// Tests that tuple_size<T>::value gives the number of fields in tuple
+// type T.
+TEST(tuple_size_Test, ReturnsNumberOfFields) {
+  EXPECT_EQ(0, +tuple_size<tuple<> >::value);
+  EXPECT_EQ(1, +tuple_size<tuple<void*> >::value);
+  EXPECT_EQ(1, +tuple_size<tuple<char> >::value);
+  EXPECT_EQ(1, +(tuple_size<tuple<tuple<int, double> > >::value));
+  EXPECT_EQ(2, +(tuple_size<tuple<int&, const char> >::value));
+  EXPECT_EQ(3, +(tuple_size<tuple<char*, void, const bool&> >::value));
+}
+
+// Tests comparing a tuple with itself.
+TEST(ComparisonTest, ComparesWithSelf) {
+  const tuple<int, char, bool> a(5, 'a', false);
+
+  EXPECT_TRUE(a == a);
+  EXPECT_FALSE(a != a);
+}
+
+// Tests comparing two tuples with the same value.
+TEST(ComparisonTest, ComparesEqualTuples) {
+  const tuple<int, bool> a(5, true), b(5, true);
+
+  EXPECT_TRUE(a == b);
+  EXPECT_FALSE(a != b);
+}
+
+// Tests comparing two different tuples that have no reference fields.
+TEST(ComparisonTest, ComparesUnequalTuplesWithoutReferenceFields) {
+  typedef tuple<const int, char> FooTuple;
+
+  const FooTuple a(0, 'x');
+  const FooTuple b(1, 'a');
+
+  EXPECT_TRUE(a != b);
+  EXPECT_FALSE(a == b);
+
+  const FooTuple c(1, 'b');
+
+  EXPECT_TRUE(b != c);
+  EXPECT_FALSE(b == c);
+}
+
+// Tests comparing two different tuples that have reference fields.
+TEST(ComparisonTest, ComparesUnequalTuplesWithReferenceFields) {
+  typedef tuple<int&, const char&> FooTuple;
+
+  int i = 5;
+  const char ch = 'a';
+  const FooTuple a(i, ch);
+
+  int j = 6;
+  const FooTuple b(j, ch);
+
+  EXPECT_TRUE(a != b);
+  EXPECT_FALSE(a == b);
+
+  j = 5;
+  const char ch2 = 'b';
+  const FooTuple c(j, ch2);
+
+  EXPECT_TRUE(b != c);
+  EXPECT_FALSE(b == c);
+}
+
+// Tests that a tuple field with a reference type is an alias of the
+// variable it's supposed to reference.
+TEST(ReferenceFieldTest, IsAliasOfReferencedVariable) {
+  int n = 0;
+  tuple<bool, int&> t(true, n);
+
+  n = 1;
+  EXPECT_EQ(n, get<1>(t))
+      << "Changing a underlying variable should update the reference field.";
+
+  // Makes sure that the implementation doesn't do anything funny with
+  // the & operator for the return type of get<>().
+  EXPECT_EQ(&n, &(get<1>(t)))
+      << "The address of a reference field should equal the address of "
+      << "the underlying variable.";
+
+  get<1>(t) = 2;
+  EXPECT_EQ(2, n)
+      << "Changing a reference field should update the underlying variable.";
+}
+
+// Tests that tuple's default constructor default initializes each field.
+// This test needs to compile without generating warnings.
+TEST(TupleConstructorTest, DefaultConstructorDefaultInitializesEachField) {
+  // The TR1 report requires that tuple's default constructor default
+  // initializes each field, even if it's a primitive type.  If the
+  // implementation forgets to do this, this test will catch it by
+  // generating warnings about using uninitialized variables (assuming
+  // a decent compiler).
+
+  tuple<> empty;
+
+  tuple<int> a1, b1;
+  b1 = a1;
+  EXPECT_EQ(0, get<0>(b1));
+
+  tuple<int, double> a2, b2;
+  b2 = a2;
+  EXPECT_EQ(0, get<0>(b2));
+  EXPECT_EQ(0.0, get<1>(b2));
+
+  tuple<double, char, bool*> a3, b3;
+  b3 = a3;
+  EXPECT_EQ(0.0, get<0>(b3));
+  EXPECT_EQ('\0', get<1>(b3));
+  EXPECT_TRUE(get<2>(b3) == NULL);
+
+  tuple<int, int, int, int, int, int, int, int, int, int> a10, b10;
+  b10 = a10;
+  EXPECT_EQ(0, get<0>(b10));
+  EXPECT_EQ(0, get<1>(b10));
+  EXPECT_EQ(0, get<2>(b10));
+  EXPECT_EQ(0, get<3>(b10));
+  EXPECT_EQ(0, get<4>(b10));
+  EXPECT_EQ(0, get<5>(b10));
+  EXPECT_EQ(0, get<6>(b10));
+  EXPECT_EQ(0, get<7>(b10));
+  EXPECT_EQ(0, get<8>(b10));
+  EXPECT_EQ(0, get<9>(b10));
+}
+
+// Tests constructing a tuple from its fields.
+TEST(TupleConstructorTest, ConstructsFromFields) {
+  int n = 1;
+  // Reference field.
+  tuple<int&> a(n);
+  EXPECT_EQ(&n, &(get<0>(a)));
+
+  // Non-reference fields.
+  tuple<int, char> b(5, 'a');
+  EXPECT_EQ(5, get<0>(b));
+  EXPECT_EQ('a', get<1>(b));
+
+  // Const reference field.
+  const int m = 2;
+  tuple<bool, const int&> c(true, m);
+  EXPECT_TRUE(get<0>(c));
+  EXPECT_EQ(&m, &(get<1>(c)));
+}
+
+// Tests tuple's copy constructor.
+TEST(TupleConstructorTest, CopyConstructor) {
+  tuple<double, bool> a(0.0, true);
+  tuple<double, bool> b(a);
+
+  EXPECT_DOUBLE_EQ(0.0, get<0>(b));
+  EXPECT_TRUE(get<1>(b));
+}
+
+// Tests constructing a tuple from another tuple that has a compatible
+// but different type.
+TEST(TupleConstructorTest, ConstructsFromDifferentTupleType) {
+  tuple<int, int, char> a(0, 1, 'a');
+  tuple<double, long, int> b(a);
+
+  EXPECT_DOUBLE_EQ(0.0, get<0>(b));
+  EXPECT_EQ(1, get<1>(b));
+  EXPECT_EQ('a', get<2>(b));
+}
+
+// Tests constructing a 2-tuple from an std::pair.
+TEST(TupleConstructorTest, ConstructsFromPair) {
+  ::std::pair<int, char> a(1, 'a');
+  tuple<int, char> b(a);
+  tuple<int, const char&> c(a);
+}
+
+// Tests assigning a tuple to another tuple with the same type.
+TEST(TupleAssignmentTest, AssignsToSameTupleType) {
+  const tuple<int, long> a(5, 7L);
+  tuple<int, long> b;
+  b = a;
+  EXPECT_EQ(5, get<0>(b));
+  EXPECT_EQ(7L, get<1>(b));
+}
+
+// Tests assigning a tuple to another tuple with a different but
+// compatible type.
+TEST(TupleAssignmentTest, AssignsToDifferentTupleType) {
+  const tuple<int, long, bool> a(1, 7L, true);
+  tuple<long, int, bool> b;
+  b = a;
+  EXPECT_EQ(1L, get<0>(b));
+  EXPECT_EQ(7, get<1>(b));
+  EXPECT_TRUE(get<2>(b));
+}
+
+// Tests assigning an std::pair to a 2-tuple.
+TEST(TupleAssignmentTest, AssignsFromPair) {
+  const ::std::pair<int, bool> a(5, true);
+  tuple<int, bool> b;
+  b = a;
+  EXPECT_EQ(5, get<0>(b));
+  EXPECT_TRUE(get<1>(b));
+
+  tuple<long, bool> c;
+  c = a;
+  EXPECT_EQ(5L, get<0>(c));
+  EXPECT_TRUE(get<1>(c));
+}
+
+// A fixture for testing big tuples.
+class BigTupleTest : public testing::Test {
+ protected:
+  typedef tuple<int, int, int, int, int, int, int, int, int, int> BigTuple;
+
+  BigTupleTest() :
+      a_(1, 0, 0, 0, 0, 0, 0, 0, 0, 2),
+      b_(1, 0, 0, 0, 0, 0, 0, 0, 0, 3) {}
+
+  BigTuple a_, b_;
+};
+
+// Tests constructing big tuples.
+TEST_F(BigTupleTest, Construction) {
+  BigTuple a;
+  BigTuple b(b_);
+}
+
+// Tests that get<N>(t) returns the N-th (0-based) field of tuple t.
+TEST_F(BigTupleTest, get) {
+  EXPECT_EQ(1, get<0>(a_));
+  EXPECT_EQ(2, get<9>(a_));
+
+  // Tests that get() works on a const tuple too.
+  const BigTuple a(a_);
+  EXPECT_EQ(1, get<0>(a));
+  EXPECT_EQ(2, get<9>(a));
+}
+
+// Tests comparing big tuples.
+TEST_F(BigTupleTest, Comparisons) {
+  EXPECT_TRUE(a_ == a_);
+  EXPECT_FALSE(a_ != a_);
+
+  EXPECT_TRUE(a_ != b_);
+  EXPECT_FALSE(a_ == b_);
+}
+
+TEST(MakeTupleTest, WorksForScalarTypes) {
+  tuple<bool, int> a;
+  a = make_tuple(true, 5);
+  EXPECT_TRUE(get<0>(a));
+  EXPECT_EQ(5, get<1>(a));
+
+  tuple<char, int, long> b;
+  b = make_tuple('a', 'b', 5);
+  EXPECT_EQ('a', get<0>(b));
+  EXPECT_EQ('b', get<1>(b));
+  EXPECT_EQ(5, get<2>(b));
+}
+
+TEST(MakeTupleTest, WorksForPointers) {
+  int a[] = { 1, 2, 3, 4 };
+  const char* const str = "hi";
+  int* const p = a;
+
+  tuple<const char*, int*> t;
+  t = make_tuple(str, p);
+  EXPECT_EQ(str, get<0>(t));
+  EXPECT_EQ(p, get<1>(t));
+}
+
+}  // namespace
diff --git a/contrib/gtest-1.7.0/test/gtest-typed-test2_test.cc b/contrib/gtest-1.7.0/test/gtest-typed-test2_test.cc
new file mode 100644
index 0000000..c284700
--- /dev/null
+++ b/contrib/gtest-1.7.0/test/gtest-typed-test2_test.cc
@@ -0,0 +1,45 @@
+// Copyright 2008 Google Inc.
+// All Rights Reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+
+#include <vector>
+
+#include "test/gtest-typed-test_test.h"
+#include "gtest/gtest.h"
+
+#if GTEST_HAS_TYPED_TEST_P
+
+// Tests that the same type-parameterized test case can be
+// instantiated in different translation units linked together.
+// (ContainerTest is also instantiated in gtest-typed-test_test.cc.)
+INSTANTIATE_TYPED_TEST_CASE_P(Vector, ContainerTest,
+                              testing::Types<std::vector<int> >);
+
+#endif  // GTEST_HAS_TYPED_TEST_P
diff --git a/contrib/gtest-1.7.0/test/gtest-typed-test_test.cc b/contrib/gtest-1.7.0/test/gtest-typed-test_test.cc
new file mode 100644
index 0000000..dd4ba43
--- /dev/null
+++ b/contrib/gtest-1.7.0/test/gtest-typed-test_test.cc
@@ -0,0 +1,360 @@
+// Copyright 2008 Google Inc.
+// All Rights Reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+
+#include <set>
+#include <vector>
+
+#include "test/gtest-typed-test_test.h"
+#include "gtest/gtest.h"
+
+using testing::Test;
+
+// Used for testing that SetUpTestCase()/TearDownTestCase(), fixture
+// ctor/dtor, and SetUp()/TearDown() work correctly in typed tests and
+// type-parameterized test.
+template <typename T>
+class CommonTest : public Test {
+  // For some technical reason, SetUpTestCase() and TearDownTestCase()
+  // must be public.
+ public:
+  static void SetUpTestCase() {
+    shared_ = new T(5);
+  }
+
+  static void TearDownTestCase() {
+    delete shared_;
+    shared_ = NULL;
+  }
+
+  // This 'protected:' is optional.  There's no harm in making all
+  // members of this fixture class template public.
+ protected:
+  // We used to use std::list here, but switched to std::vector since
+  // MSVC's <list> doesn't compile cleanly with /W4.
+  typedef std::vector<T> Vector;
+  typedef std::set<int> IntSet;
+
+  CommonTest() : value_(1) {}
+
+  virtual ~CommonTest() { EXPECT_EQ(3, value_); }
+
+  virtual void SetUp() {
+    EXPECT_EQ(1, value_);
+    value_++;
+  }
+
+  virtual void TearDown() {
+    EXPECT_EQ(2, value_);
+    value_++;
+  }
+
+  T value_;
+  static T* shared_;
+};
+
+template <typename T>
+T* CommonTest<T>::shared_ = NULL;
+
+// This #ifdef block tests typed tests.
+#if GTEST_HAS_TYPED_TEST
+
+using testing::Types;
+
+// Tests that SetUpTestCase()/TearDownTestCase(), fixture ctor/dtor,
+// and SetUp()/TearDown() work correctly in typed tests
+
+typedef Types<char, int> TwoTypes;
+TYPED_TEST_CASE(CommonTest, TwoTypes);
+
+TYPED_TEST(CommonTest, ValuesAreCorrect) {
+  // Static members of the fixture class template can be visited via
+  // the TestFixture:: prefix.
+  EXPECT_EQ(5, *TestFixture::shared_);
+
+  // Typedefs in the fixture class template can be visited via the
+  // "typename TestFixture::" prefix.
+  typename TestFixture::Vector empty;
+  EXPECT_EQ(0U, empty.size());
+
+  typename TestFixture::IntSet empty2;
+  EXPECT_EQ(0U, empty2.size());
+
+  // Non-static members of the fixture class must be visited via
+  // 'this', as required by C++ for class templates.
+  EXPECT_EQ(2, this->value_);
+}
+
+// The second test makes sure shared_ is not deleted after the first
+// test.
+TYPED_TEST(CommonTest, ValuesAreStillCorrect) {
+  // Static members of the fixture class template can also be visited
+  // via 'this'.
+  ASSERT_TRUE(this->shared_ != NULL);
+  EXPECT_EQ(5, *this->shared_);
+
+  // TypeParam can be used to refer to the type parameter.
+  EXPECT_EQ(static_cast<TypeParam>(2), this->value_);
+}
+
+// Tests that multiple TYPED_TEST_CASE's can be defined in the same
+// translation unit.
+
+template <typename T>
+class TypedTest1 : public Test {
+};
+
+// Verifies that the second argument of TYPED_TEST_CASE can be a
+// single type.
+TYPED_TEST_CASE(TypedTest1, int);
+TYPED_TEST(TypedTest1, A) {}
+
+template <typename T>
+class TypedTest2 : public Test {
+};
+
+// Verifies that the second argument of TYPED_TEST_CASE can be a
+// Types<...> type list.
+TYPED_TEST_CASE(TypedTest2, Types<int>);
+
+// This also verifies that tests from different typed test cases can
+// share the same name.
+TYPED_TEST(TypedTest2, A) {}
+
+// Tests that a typed test case can be defined in a namespace.
+
+namespace library1 {
+
+template <typename T>
+class NumericTest : public Test {
+};
+
+typedef Types<int, long> NumericTypes;
+TYPED_TEST_CASE(NumericTest, NumericTypes);
+
+TYPED_TEST(NumericTest, DefaultIsZero) {
+  EXPECT_EQ(0, TypeParam());
+}
+
+}  // namespace library1
+
+#endif  // GTEST_HAS_TYPED_TEST
+
+// This #ifdef block tests type-parameterized tests.
+#if GTEST_HAS_TYPED_TEST_P
+
+using testing::Types;
+using testing::internal::TypedTestCasePState;
+
+// Tests TypedTestCasePState.
+
+class TypedTestCasePStateTest : public Test {
+ protected:
+  virtual void SetUp() {
+    state_.AddTestName("foo.cc", 0, "FooTest", "A");
+    state_.AddTestName("foo.cc", 0, "FooTest", "B");
+    state_.AddTestName("foo.cc", 0, "FooTest", "C");
+  }
+
+  TypedTestCasePState state_;
+};
+
+TEST_F(TypedTestCasePStateTest, SucceedsForMatchingList) {
+  const char* tests = "A, B, C";
+  EXPECT_EQ(tests,
+            state_.VerifyRegisteredTestNames("foo.cc", 1, tests));
+}
+
+// Makes sure that the order of the tests and spaces around the names
+// don't matter.
+TEST_F(TypedTestCasePStateTest, IgnoresOrderAndSpaces) {
+  const char* tests = "A,C,   B";
+  EXPECT_EQ(tests,
+            state_.VerifyRegisteredTestNames("foo.cc", 1, tests));
+}
+
+typedef TypedTestCasePStateTest TypedTestCasePStateDeathTest;
+
+TEST_F(TypedTestCasePStateDeathTest, DetectsDuplicates) {
+  EXPECT_DEATH_IF_SUPPORTED(
+      state_.VerifyRegisteredTestNames("foo.cc", 1, "A, B, A, C"),
+      "foo\\.cc.1.?: Test A is listed more than once\\.");
+}
+
+TEST_F(TypedTestCasePStateDeathTest, DetectsExtraTest) {
+  EXPECT_DEATH_IF_SUPPORTED(
+      state_.VerifyRegisteredTestNames("foo.cc", 1, "A, B, C, D"),
+      "foo\\.cc.1.?: No test named D can be found in this test case\\.");
+}
+
+TEST_F(TypedTestCasePStateDeathTest, DetectsMissedTest) {
+  EXPECT_DEATH_IF_SUPPORTED(
+      state_.VerifyRegisteredTestNames("foo.cc", 1, "A, C"),
+      "foo\\.cc.1.?: You forgot to list test B\\.");
+}
+
+// Tests that defining a test for a parameterized test case generates
+// a run-time error if the test case has been registered.
+TEST_F(TypedTestCasePStateDeathTest, DetectsTestAfterRegistration) {
+  state_.VerifyRegisteredTestNames("foo.cc", 1, "A, B, C");
+  EXPECT_DEATH_IF_SUPPORTED(
+      state_.AddTestName("foo.cc", 2, "FooTest", "D"),
+      "foo\\.cc.2.?: Test D must be defined before REGISTER_TYPED_TEST_CASE_P"
+      "\\(FooTest, \\.\\.\\.\\)\\.");
+}
+
+// Tests that SetUpTestCase()/TearDownTestCase(), fixture ctor/dtor,
+// and SetUp()/TearDown() work correctly in type-parameterized tests.
+
+template <typename T>
+class DerivedTest : public CommonTest<T> {
+};
+
+TYPED_TEST_CASE_P(DerivedTest);
+
+TYPED_TEST_P(DerivedTest, ValuesAreCorrect) {
+  // Static members of the fixture class template can be visited via
+  // the TestFixture:: prefix.
+  EXPECT_EQ(5, *TestFixture::shared_);
+
+  // Non-static members of the fixture class must be visited via
+  // 'this', as required by C++ for class templates.
+  EXPECT_EQ(2, this->value_);
+}
+
+// The second test makes sure shared_ is not deleted after the first
+// test.
+TYPED_TEST_P(DerivedTest, ValuesAreStillCorrect) {
+  // Static members of the fixture class template can also be visited
+  // via 'this'.
+  ASSERT_TRUE(this->shared_ != NULL);
+  EXPECT_EQ(5, *this->shared_);
+  EXPECT_EQ(2, this->value_);
+}
+
+REGISTER_TYPED_TEST_CASE_P(DerivedTest,
+                           ValuesAreCorrect, ValuesAreStillCorrect);
+
+typedef Types<short, long> MyTwoTypes;
+INSTANTIATE_TYPED_TEST_CASE_P(My, DerivedTest, MyTwoTypes);
+
+// Tests that multiple TYPED_TEST_CASE_P's can be defined in the same
+// translation unit.
+
+template <typename T>
+class TypedTestP1 : public Test {
+};
+
+TYPED_TEST_CASE_P(TypedTestP1);
+
+// For testing that the code between TYPED_TEST_CASE_P() and
+// TYPED_TEST_P() is not enclosed in a namespace.
+typedef int IntAfterTypedTestCaseP;
+
+TYPED_TEST_P(TypedTestP1, A) {}
+TYPED_TEST_P(TypedTestP1, B) {}
+
+// For testing that the code between TYPED_TEST_P() and
+// REGISTER_TYPED_TEST_CASE_P() is not enclosed in a namespace.
+typedef int IntBeforeRegisterTypedTestCaseP;
+
+REGISTER_TYPED_TEST_CASE_P(TypedTestP1, A, B);
+
+template <typename T>
+class TypedTestP2 : public Test {
+};
+
+TYPED_TEST_CASE_P(TypedTestP2);
+
+// This also verifies that tests from different type-parameterized
+// test cases can share the same name.
+TYPED_TEST_P(TypedTestP2, A) {}
+
+REGISTER_TYPED_TEST_CASE_P(TypedTestP2, A);
+
+// Verifies that the code between TYPED_TEST_CASE_P() and
+// REGISTER_TYPED_TEST_CASE_P() is not enclosed in a namespace.
+IntAfterTypedTestCaseP after = 0;
+IntBeforeRegisterTypedTestCaseP before = 0;
+
+// Verifies that the last argument of INSTANTIATE_TYPED_TEST_CASE_P()
+// can be either a single type or a Types<...> type list.
+INSTANTIATE_TYPED_TEST_CASE_P(Int, TypedTestP1, int);
+INSTANTIATE_TYPED_TEST_CASE_P(Int, TypedTestP2, Types<int>);
+
+// Tests that the same type-parameterized test case can be
+// instantiated more than once in the same translation unit.
+INSTANTIATE_TYPED_TEST_CASE_P(Double, TypedTestP2, Types<double>);
+
+// Tests that the same type-parameterized test case can be
+// instantiated in different translation units linked together.
+// (ContainerTest is also instantiated in gtest-typed-test_test.cc.)
+typedef Types<std::vector<double>, std::set<char> > MyContainers;
+INSTANTIATE_TYPED_TEST_CASE_P(My, ContainerTest, MyContainers);
+
+// Tests that a type-parameterized test case can be defined and
+// instantiated in a namespace.
+
+namespace library2 {
+
+template <typename T>
+class NumericTest : public Test {
+};
+
+TYPED_TEST_CASE_P(NumericTest);
+
+TYPED_TEST_P(NumericTest, DefaultIsZero) {
+  EXPECT_EQ(0, TypeParam());
+}
+
+TYPED_TEST_P(NumericTest, ZeroIsLessThanOne) {
+  EXPECT_LT(TypeParam(0), TypeParam(1));
+}
+
+REGISTER_TYPED_TEST_CASE_P(NumericTest,
+                           DefaultIsZero, ZeroIsLessThanOne);
+typedef Types<int, double> NumericTypes;
+INSTANTIATE_TYPED_TEST_CASE_P(My, NumericTest, NumericTypes);
+
+}  // namespace library2
+
+#endif  // GTEST_HAS_TYPED_TEST_P
+
+#if !defined(GTEST_HAS_TYPED_TEST) && !defined(GTEST_HAS_TYPED_TEST_P)
+
+// Google Test may not support type-parameterized tests with some
+// compilers. If we use conditional compilation to compile out all
+// code referring to the gtest_main library, MSVC linker will not link
+// that library at all and consequently complain about missing entry
+// point defined in that library (fatal error LNK1561: entry point
+// must be defined). This dummy test keeps gtest_main linked in.
+TEST(DummyTest, TypedTestsAreNotSupportedOnThisPlatform) {}
+
+#endif  // #if !defined(GTEST_HAS_TYPED_TEST) && !defined(GTEST_HAS_TYPED_TEST_P)
diff --git a/contrib/gtest-1.7.0/test/gtest-typed-test_test.h b/contrib/gtest-1.7.0/test/gtest-typed-test_test.h
new file mode 100644
index 0000000..41d7570
--- /dev/null
+++ b/contrib/gtest-1.7.0/test/gtest-typed-test_test.h
@@ -0,0 +1,66 @@
+// Copyright 2008 Google Inc.
+// All Rights Reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+
+#ifndef GTEST_TEST_GTEST_TYPED_TEST_TEST_H_
+#define GTEST_TEST_GTEST_TYPED_TEST_TEST_H_
+
+#include "gtest/gtest.h"
+
+#if GTEST_HAS_TYPED_TEST_P
+
+using testing::Test;
+
+// For testing that the same type-parameterized test case can be
+// instantiated in different translation units linked together.
+// ContainerTest will be instantiated in both gtest-typed-test_test.cc
+// and gtest-typed-test2_test.cc.
+
+template <typename T>
+class ContainerTest : public Test {
+};
+
+TYPED_TEST_CASE_P(ContainerTest);
+
+TYPED_TEST_P(ContainerTest, CanBeDefaultConstructed) {
+  TypeParam container;
+}
+
+TYPED_TEST_P(ContainerTest, InitialSizeIsZero) {
+  TypeParam container;
+  EXPECT_EQ(0U, container.size());
+}
+
+REGISTER_TYPED_TEST_CASE_P(ContainerTest,
+                           CanBeDefaultConstructed, InitialSizeIsZero);
+
+#endif  // GTEST_HAS_TYPED_TEST_P
+
+#endif  // GTEST_TEST_GTEST_TYPED_TEST_TEST_H_
diff --git a/contrib/gtest-1.7.0/test/gtest-unittest-api_test.cc b/contrib/gtest-1.7.0/test/gtest-unittest-api_test.cc
new file mode 100644
index 0000000..07083e5
--- /dev/null
+++ b/contrib/gtest-1.7.0/test/gtest-unittest-api_test.cc
@@ -0,0 +1,341 @@
+// Copyright 2009 Google Inc.  All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: vladl at google.com (Vlad Losev)
+//
+// The Google C++ Testing Framework (Google Test)
+//
+// This file contains tests verifying correctness of data provided via
+// UnitTest's public methods.
+
+#include "gtest/gtest.h"
+
+#include <string.h>  // For strcmp.
+#include <algorithm>
+
+using ::testing::InitGoogleTest;
+
+namespace testing {
+namespace internal {
+
+template <typename T>
+struct LessByName {
+  bool operator()(const T* a, const T* b) {
+    return strcmp(a->name(), b->name()) < 0;
+  }
+};
+
+class UnitTestHelper {
+ public:
+  // Returns the array of pointers to all test cases sorted by the test case
+  // name.  The caller is responsible for deleting the array.
+  static TestCase const** const GetSortedTestCases() {
+    UnitTest& unit_test = *UnitTest::GetInstance();
+    TestCase const** const test_cases =
+        new const TestCase*[unit_test.total_test_case_count()];
+
+    for (int i = 0; i < unit_test.total_test_case_count(); ++i)
+      test_cases[i] = unit_test.GetTestCase(i);
+
+    std::sort(test_cases,
+              test_cases + unit_test.total_test_case_count(),
+              LessByName<TestCase>());
+    return test_cases;
+  }
+
+  // Returns the test case by its name.  The caller doesn't own the returned
+  // pointer.
+  static const TestCase* FindTestCase(const char* name) {
+    UnitTest& unit_test = *UnitTest::GetInstance();
+    for (int i = 0; i < unit_test.total_test_case_count(); ++i) {
+      const TestCase* test_case = unit_test.GetTestCase(i);
+      if (0 == strcmp(test_case->name(), name))
+        return test_case;
+    }
+    return NULL;
+  }
+
+  // Returns the array of pointers to all tests in a particular test case
+  // sorted by the test name.  The caller is responsible for deleting the
+  // array.
+  static TestInfo const** const GetSortedTests(const TestCase* test_case) {
+    TestInfo const** const tests =
+        new const TestInfo*[test_case->total_test_count()];
+
+    for (int i = 0; i < test_case->total_test_count(); ++i)
+      tests[i] = test_case->GetTestInfo(i);
+
+    std::sort(tests, tests + test_case->total_test_count(),
+              LessByName<TestInfo>());
+    return tests;
+  }
+};
+
+#if GTEST_HAS_TYPED_TEST
+template <typename T> class TestCaseWithCommentTest : public Test {};
+TYPED_TEST_CASE(TestCaseWithCommentTest, Types<int>);
+TYPED_TEST(TestCaseWithCommentTest, Dummy) {}
+
+const int kTypedTestCases = 1;
+const int kTypedTests = 1;
+#else
+const int kTypedTestCases = 0;
+const int kTypedTests = 0;
+#endif  // GTEST_HAS_TYPED_TEST
+
+// We can only test the accessors that do not change value while tests run.
+// Since tests can be run in any order, the values the accessors that track
+// test execution (such as failed_test_count) can not be predicted.
+TEST(ApiTest, UnitTestImmutableAccessorsWork) {
+  UnitTest* unit_test = UnitTest::GetInstance();
+
+  ASSERT_EQ(2 + kTypedTestCases, unit_test->total_test_case_count());
+  EXPECT_EQ(1 + kTypedTestCases, unit_test->test_case_to_run_count());
+  EXPECT_EQ(2, unit_test->disabled_test_count());
+  EXPECT_EQ(5 + kTypedTests, unit_test->total_test_count());
+  EXPECT_EQ(3 + kTypedTests, unit_test->test_to_run_count());
+
+  const TestCase** const test_cases = UnitTestHelper::GetSortedTestCases();
+
+  EXPECT_STREQ("ApiTest", test_cases[0]->name());
+  EXPECT_STREQ("DISABLED_Test", test_cases[1]->name());
+#if GTEST_HAS_TYPED_TEST
+  EXPECT_STREQ("TestCaseWithCommentTest/0", test_cases[2]->name());
+#endif  // GTEST_HAS_TYPED_TEST
+
+  delete[] test_cases;
+
+  // The following lines initiate actions to verify certain methods in
+  // FinalSuccessChecker::TearDown.
+
+  // Records a test property to verify TestResult::GetTestProperty().
+  RecordProperty("key", "value");
+}
+
+AssertionResult IsNull(const char* str) {
+  if (str != NULL) {
+    return testing::AssertionFailure() << "argument is " << str;
+  }
+  return AssertionSuccess();
+}
+
+TEST(ApiTest, TestCaseImmutableAccessorsWork) {
+  const TestCase* test_case = UnitTestHelper::FindTestCase("ApiTest");
+  ASSERT_TRUE(test_case != NULL);
+
+  EXPECT_STREQ("ApiTest", test_case->name());
+  EXPECT_TRUE(IsNull(test_case->type_param()));
+  EXPECT_TRUE(test_case->should_run());
+  EXPECT_EQ(1, test_case->disabled_test_count());
+  EXPECT_EQ(3, test_case->test_to_run_count());
+  ASSERT_EQ(4, test_case->total_test_count());
+
+  const TestInfo** tests = UnitTestHelper::GetSortedTests(test_case);
+
+  EXPECT_STREQ("DISABLED_Dummy1", tests[0]->name());
+  EXPECT_STREQ("ApiTest", tests[0]->test_case_name());
+  EXPECT_TRUE(IsNull(tests[0]->value_param()));
+  EXPECT_TRUE(IsNull(tests[0]->type_param()));
+  EXPECT_FALSE(tests[0]->should_run());
+
+  EXPECT_STREQ("TestCaseDisabledAccessorsWork", tests[1]->name());
+  EXPECT_STREQ("ApiTest", tests[1]->test_case_name());
+  EXPECT_TRUE(IsNull(tests[1]->value_param()));
+  EXPECT_TRUE(IsNull(tests[1]->type_param()));
+  EXPECT_TRUE(tests[1]->should_run());
+
+  EXPECT_STREQ("TestCaseImmutableAccessorsWork", tests[2]->name());
+  EXPECT_STREQ("ApiTest", tests[2]->test_case_name());
+  EXPECT_TRUE(IsNull(tests[2]->value_param()));
+  EXPECT_TRUE(IsNull(tests[2]->type_param()));
+  EXPECT_TRUE(tests[2]->should_run());
+
+  EXPECT_STREQ("UnitTestImmutableAccessorsWork", tests[3]->name());
+  EXPECT_STREQ("ApiTest", tests[3]->test_case_name());
+  EXPECT_TRUE(IsNull(tests[3]->value_param()));
+  EXPECT_TRUE(IsNull(tests[3]->type_param()));
+  EXPECT_TRUE(tests[3]->should_run());
+
+  delete[] tests;
+  tests = NULL;
+
+#if GTEST_HAS_TYPED_TEST
+  test_case = UnitTestHelper::FindTestCase("TestCaseWithCommentTest/0");
+  ASSERT_TRUE(test_case != NULL);
+
+  EXPECT_STREQ("TestCaseWithCommentTest/0", test_case->name());
+  EXPECT_STREQ(GetTypeName<int>().c_str(), test_case->type_param());
+  EXPECT_TRUE(test_case->should_run());
+  EXPECT_EQ(0, test_case->disabled_test_count());
+  EXPECT_EQ(1, test_case->test_to_run_count());
+  ASSERT_EQ(1, test_case->total_test_count());
+
+  tests = UnitTestHelper::GetSortedTests(test_case);
+
+  EXPECT_STREQ("Dummy", tests[0]->name());
+  EXPECT_STREQ("TestCaseWithCommentTest/0", tests[0]->test_case_name());
+  EXPECT_TRUE(IsNull(tests[0]->value_param()));
+  EXPECT_STREQ(GetTypeName<int>().c_str(), tests[0]->type_param());
+  EXPECT_TRUE(tests[0]->should_run());
+
+  delete[] tests;
+#endif  // GTEST_HAS_TYPED_TEST
+}
+
+TEST(ApiTest, TestCaseDisabledAccessorsWork) {
+  const TestCase* test_case = UnitTestHelper::FindTestCase("DISABLED_Test");
+  ASSERT_TRUE(test_case != NULL);
+
+  EXPECT_STREQ("DISABLED_Test", test_case->name());
+  EXPECT_TRUE(IsNull(test_case->type_param()));
+  EXPECT_FALSE(test_case->should_run());
+  EXPECT_EQ(1, test_case->disabled_test_count());
+  EXPECT_EQ(0, test_case->test_to_run_count());
+  ASSERT_EQ(1, test_case->total_test_count());
+
+  const TestInfo* const test_info = test_case->GetTestInfo(0);
+  EXPECT_STREQ("Dummy2", test_info->name());
+  EXPECT_STREQ("DISABLED_Test", test_info->test_case_name());
+  EXPECT_TRUE(IsNull(test_info->value_param()));
+  EXPECT_TRUE(IsNull(test_info->type_param()));
+  EXPECT_FALSE(test_info->should_run());
+}
+
+// These two tests are here to provide support for testing
+// test_case_to_run_count, disabled_test_count, and test_to_run_count.
+TEST(ApiTest, DISABLED_Dummy1) {}
+TEST(DISABLED_Test, Dummy2) {}
+
+class FinalSuccessChecker : public Environment {
+ protected:
+  virtual void TearDown() {
+    UnitTest* unit_test = UnitTest::GetInstance();
+
+    EXPECT_EQ(1 + kTypedTestCases, unit_test->successful_test_case_count());
+    EXPECT_EQ(3 + kTypedTests, unit_test->successful_test_count());
+    EXPECT_EQ(0, unit_test->failed_test_case_count());
+    EXPECT_EQ(0, unit_test->failed_test_count());
+    EXPECT_TRUE(unit_test->Passed());
+    EXPECT_FALSE(unit_test->Failed());
+    ASSERT_EQ(2 + kTypedTestCases, unit_test->total_test_case_count());
+
+    const TestCase** const test_cases = UnitTestHelper::GetSortedTestCases();
+
+    EXPECT_STREQ("ApiTest", test_cases[0]->name());
+    EXPECT_TRUE(IsNull(test_cases[0]->type_param()));
+    EXPECT_TRUE(test_cases[0]->should_run());
+    EXPECT_EQ(1, test_cases[0]->disabled_test_count());
+    ASSERT_EQ(4, test_cases[0]->total_test_count());
+    EXPECT_EQ(3, test_cases[0]->successful_test_count());
+    EXPECT_EQ(0, test_cases[0]->failed_test_count());
+    EXPECT_TRUE(test_cases[0]->Passed());
+    EXPECT_FALSE(test_cases[0]->Failed());
+
+    EXPECT_STREQ("DISABLED_Test", test_cases[1]->name());
+    EXPECT_TRUE(IsNull(test_cases[1]->type_param()));
+    EXPECT_FALSE(test_cases[1]->should_run());
+    EXPECT_EQ(1, test_cases[1]->disabled_test_count());
+    ASSERT_EQ(1, test_cases[1]->total_test_count());
+    EXPECT_EQ(0, test_cases[1]->successful_test_count());
+    EXPECT_EQ(0, test_cases[1]->failed_test_count());
+
+#if GTEST_HAS_TYPED_TEST
+    EXPECT_STREQ("TestCaseWithCommentTest/0", test_cases[2]->name());
+    EXPECT_STREQ(GetTypeName<int>().c_str(), test_cases[2]->type_param());
+    EXPECT_TRUE(test_cases[2]->should_run());
+    EXPECT_EQ(0, test_cases[2]->disabled_test_count());
+    ASSERT_EQ(1, test_cases[2]->total_test_count());
+    EXPECT_EQ(1, test_cases[2]->successful_test_count());
+    EXPECT_EQ(0, test_cases[2]->failed_test_count());
+    EXPECT_TRUE(test_cases[2]->Passed());
+    EXPECT_FALSE(test_cases[2]->Failed());
+#endif  // GTEST_HAS_TYPED_TEST
+
+    const TestCase* test_case = UnitTestHelper::FindTestCase("ApiTest");
+    const TestInfo** tests = UnitTestHelper::GetSortedTests(test_case);
+    EXPECT_STREQ("DISABLED_Dummy1", tests[0]->name());
+    EXPECT_STREQ("ApiTest", tests[0]->test_case_name());
+    EXPECT_FALSE(tests[0]->should_run());
+
+    EXPECT_STREQ("TestCaseDisabledAccessorsWork", tests[1]->name());
+    EXPECT_STREQ("ApiTest", tests[1]->test_case_name());
+    EXPECT_TRUE(IsNull(tests[1]->value_param()));
+    EXPECT_TRUE(IsNull(tests[1]->type_param()));
+    EXPECT_TRUE(tests[1]->should_run());
+    EXPECT_TRUE(tests[1]->result()->Passed());
+    EXPECT_EQ(0, tests[1]->result()->test_property_count());
+
+    EXPECT_STREQ("TestCaseImmutableAccessorsWork", tests[2]->name());
+    EXPECT_STREQ("ApiTest", tests[2]->test_case_name());
+    EXPECT_TRUE(IsNull(tests[2]->value_param()));
+    EXPECT_TRUE(IsNull(tests[2]->type_param()));
+    EXPECT_TRUE(tests[2]->should_run());
+    EXPECT_TRUE(tests[2]->result()->Passed());
+    EXPECT_EQ(0, tests[2]->result()->test_property_count());
+
+    EXPECT_STREQ("UnitTestImmutableAccessorsWork", tests[3]->name());
+    EXPECT_STREQ("ApiTest", tests[3]->test_case_name());
+    EXPECT_TRUE(IsNull(tests[3]->value_param()));
+    EXPECT_TRUE(IsNull(tests[3]->type_param()));
+    EXPECT_TRUE(tests[3]->should_run());
+    EXPECT_TRUE(tests[3]->result()->Passed());
+    EXPECT_EQ(1, tests[3]->result()->test_property_count());
+    const TestProperty& property = tests[3]->result()->GetTestProperty(0);
+    EXPECT_STREQ("key", property.key());
+    EXPECT_STREQ("value", property.value());
+
+    delete[] tests;
+
+#if GTEST_HAS_TYPED_TEST
+    test_case = UnitTestHelper::FindTestCase("TestCaseWithCommentTest/0");
+    tests = UnitTestHelper::GetSortedTests(test_case);
+
+    EXPECT_STREQ("Dummy", tests[0]->name());
+    EXPECT_STREQ("TestCaseWithCommentTest/0", tests[0]->test_case_name());
+    EXPECT_TRUE(IsNull(tests[0]->value_param()));
+    EXPECT_STREQ(GetTypeName<int>().c_str(), tests[0]->type_param());
+    EXPECT_TRUE(tests[0]->should_run());
+    EXPECT_TRUE(tests[0]->result()->Passed());
+    EXPECT_EQ(0, tests[0]->result()->test_property_count());
+
+    delete[] tests;
+#endif  // GTEST_HAS_TYPED_TEST
+    delete[] test_cases;
+  }
+};
+
+}  // namespace internal
+}  // namespace testing
+
+int main(int argc, char **argv) {
+  InitGoogleTest(&argc, argv);
+
+  AddGlobalTestEnvironment(new testing::internal::FinalSuccessChecker());
+
+  return RUN_ALL_TESTS();
+}
diff --git a/contrib/gtest-1.7.0/test/gtest_all_test.cc b/contrib/gtest-1.7.0/test/gtest_all_test.cc
new file mode 100644
index 0000000..955aa62
--- /dev/null
+++ b/contrib/gtest-1.7.0/test/gtest_all_test.cc
@@ -0,0 +1,47 @@
+// Copyright 2009, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+//
+// Tests for Google C++ Testing Framework (Google Test)
+//
+// Sometimes it's desirable to build most of Google Test's own tests
+// by compiling a single file.  This file serves this purpose.
+#include "test/gtest-filepath_test.cc"
+#include "test/gtest-linked_ptr_test.cc"
+#include "test/gtest-message_test.cc"
+#include "test/gtest-options_test.cc"
+#include "test/gtest-port_test.cc"
+#include "test/gtest_pred_impl_unittest.cc"
+#include "test/gtest_prod_test.cc"
+#include "test/gtest-test-part_test.cc"
+#include "test/gtest-typed-test_test.cc"
+#include "test/gtest-typed-test2_test.cc"
+#include "test/gtest_unittest.cc"
+#include "test/production.cc"
diff --git a/contrib/gtest-1.7.0/test/gtest_break_on_failure_unittest.py b/contrib/gtest-1.7.0/test/gtest_break_on_failure_unittest.py
new file mode 100755
index 0000000..78f3e0f
--- /dev/null
+++ b/contrib/gtest-1.7.0/test/gtest_break_on_failure_unittest.py
@@ -0,0 +1,212 @@
+#!/usr/bin/env python
+#
+# Copyright 2006, Google Inc.
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+#
+#     * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#     * Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following disclaimer
+# in the documentation and/or other materials provided with the
+# distribution.
+#     * Neither the name of Google Inc. nor the names of its
+# contributors may be used to endorse or promote products derived from
+# this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+"""Unit test for Google Test's break-on-failure mode.
+
+A user can ask Google Test to seg-fault when an assertion fails, using
+either the GTEST_BREAK_ON_FAILURE environment variable or the
+--gtest_break_on_failure flag.  This script tests such functionality
+by invoking gtest_break_on_failure_unittest_ (a program written with
+Google Test) with different environments and command line flags.
+"""
+
+__author__ = 'wan at google.com (Zhanyong Wan)'
+
+import gtest_test_utils
+import os
+import sys
+
+
+# Constants.
+
+IS_WINDOWS = os.name == 'nt'
+
+# The environment variable for enabling/disabling the break-on-failure mode.
+BREAK_ON_FAILURE_ENV_VAR = 'GTEST_BREAK_ON_FAILURE'
+
+# The command line flag for enabling/disabling the break-on-failure mode.
+BREAK_ON_FAILURE_FLAG = 'gtest_break_on_failure'
+
+# The environment variable for enabling/disabling the throw-on-failure mode.
+THROW_ON_FAILURE_ENV_VAR = 'GTEST_THROW_ON_FAILURE'
+
+# The environment variable for enabling/disabling the catch-exceptions mode.
+CATCH_EXCEPTIONS_ENV_VAR = 'GTEST_CATCH_EXCEPTIONS'
+
+# Path to the gtest_break_on_failure_unittest_ program.
+EXE_PATH = gtest_test_utils.GetTestExecutablePath(
+    'gtest_break_on_failure_unittest_')
+
+
+environ = gtest_test_utils.environ
+SetEnvVar = gtest_test_utils.SetEnvVar
+
+# Tests in this file run a Google-Test-based test program and expect it
+# to terminate prematurely.  Therefore they are incompatible with
+# the premature-exit-file protocol by design.  Unset the
+# premature-exit filepath to prevent Google Test from creating
+# the file.
+SetEnvVar(gtest_test_utils.PREMATURE_EXIT_FILE_ENV_VAR, None)
+
+
+def Run(command):
+  """Runs a command; returns 1 if it was killed by a signal, or 0 otherwise."""
+
+  p = gtest_test_utils.Subprocess(command, env=environ)
+  if p.terminated_by_signal:
+    return 1
+  else:
+    return 0
+
+
+# The tests.
+
+
+class GTestBreakOnFailureUnitTest(gtest_test_utils.TestCase):
+  """Tests using the GTEST_BREAK_ON_FAILURE environment variable or
+  the --gtest_break_on_failure flag to turn assertion failures into
+  segmentation faults.
+  """
+
+  def RunAndVerify(self, env_var_value, flag_value, expect_seg_fault):
+    """Runs gtest_break_on_failure_unittest_ and verifies that it does
+    (or does not) have a seg-fault.
+
+    Args:
+      env_var_value:    value of the GTEST_BREAK_ON_FAILURE environment
+                        variable; None if the variable should be unset.
+      flag_value:       value of the --gtest_break_on_failure flag;
+                        None if the flag should not be present.
+      expect_seg_fault: 1 if the program is expected to generate a seg-fault;
+                        0 otherwise.
+    """
+
+    SetEnvVar(BREAK_ON_FAILURE_ENV_VAR, env_var_value)
+
+    if env_var_value is None:
+      env_var_value_msg = ' is not set'
+    else:
+      env_var_value_msg = '=' + env_var_value
+
+    if flag_value is None:
+      flag = ''
+    elif flag_value == '0':
+      flag = '--%s=0' % BREAK_ON_FAILURE_FLAG
+    else:
+      flag = '--%s' % BREAK_ON_FAILURE_FLAG
+
+    command = [EXE_PATH]
+    if flag:
+      command.append(flag)
+
+    if expect_seg_fault:
+      should_or_not = 'should'
+    else:
+      should_or_not = 'should not'
+
+    has_seg_fault = Run(command)
+
+    SetEnvVar(BREAK_ON_FAILURE_ENV_VAR, None)
+
+    msg = ('when %s%s, an assertion failure in "%s" %s cause a seg-fault.' %
+           (BREAK_ON_FAILURE_ENV_VAR, env_var_value_msg, ' '.join(command),
+            should_or_not))
+    self.assert_(has_seg_fault == expect_seg_fault, msg)
+
+  def testDefaultBehavior(self):
+    """Tests the behavior of the default mode."""
+
+    self.RunAndVerify(env_var_value=None,
+                      flag_value=None,
+                      expect_seg_fault=0)
+
+  def testEnvVar(self):
+    """Tests using the GTEST_BREAK_ON_FAILURE environment variable."""
+
+    self.RunAndVerify(env_var_value='0',
+                      flag_value=None,
+                      expect_seg_fault=0)
+    self.RunAndVerify(env_var_value='1',
+                      flag_value=None,
+                      expect_seg_fault=1)
+
+  def testFlag(self):
+    """Tests using the --gtest_break_on_failure flag."""
+
+    self.RunAndVerify(env_var_value=None,
+                      flag_value='0',
+                      expect_seg_fault=0)
+    self.RunAndVerify(env_var_value=None,
+                      flag_value='1',
+                      expect_seg_fault=1)
+
+  def testFlagOverridesEnvVar(self):
+    """Tests that the flag overrides the environment variable."""
+
+    self.RunAndVerify(env_var_value='0',
+                      flag_value='0',
+                      expect_seg_fault=0)
+    self.RunAndVerify(env_var_value='0',
+                      flag_value='1',
+                      expect_seg_fault=1)
+    self.RunAndVerify(env_var_value='1',
+                      flag_value='0',
+                      expect_seg_fault=0)
+    self.RunAndVerify(env_var_value='1',
+                      flag_value='1',
+                      expect_seg_fault=1)
+
+  def testBreakOnFailureOverridesThrowOnFailure(self):
+    """Tests that gtest_break_on_failure overrides gtest_throw_on_failure."""
+
+    SetEnvVar(THROW_ON_FAILURE_ENV_VAR, '1')
+    try:
+      self.RunAndVerify(env_var_value=None,
+                        flag_value='1',
+                        expect_seg_fault=1)
+    finally:
+      SetEnvVar(THROW_ON_FAILURE_ENV_VAR, None)
+
+  if IS_WINDOWS:
+    def testCatchExceptionsDoesNotInterfere(self):
+      """Tests that gtest_catch_exceptions doesn't interfere."""
+
+      SetEnvVar(CATCH_EXCEPTIONS_ENV_VAR, '1')
+      try:
+        self.RunAndVerify(env_var_value='1',
+                          flag_value='1',
+                          expect_seg_fault=1)
+      finally:
+        SetEnvVar(CATCH_EXCEPTIONS_ENV_VAR, None)
+
+
+if __name__ == '__main__':
+  gtest_test_utils.Main()
diff --git a/contrib/gtest-1.7.0/test/gtest_break_on_failure_unittest_.cc b/contrib/gtest-1.7.0/test/gtest_break_on_failure_unittest_.cc
new file mode 100644
index 0000000..dd07478
--- /dev/null
+++ b/contrib/gtest-1.7.0/test/gtest_break_on_failure_unittest_.cc
@@ -0,0 +1,88 @@
+// Copyright 2006, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+
+// Unit test for Google Test's break-on-failure mode.
+//
+// A user can ask Google Test to seg-fault when an assertion fails, using
+// either the GTEST_BREAK_ON_FAILURE environment variable or the
+// --gtest_break_on_failure flag.  This file is used for testing such
+// functionality.
+//
+// This program will be invoked from a Python unit test.  It is
+// expected to fail.  Don't run it directly.
+
+#include "gtest/gtest.h"
+
+#if GTEST_OS_WINDOWS
+# include <windows.h>
+# include <stdlib.h>
+#endif
+
+namespace {
+
+// A test that's expected to fail.
+TEST(Foo, Bar) {
+  EXPECT_EQ(2, 3);
+}
+
+#if GTEST_HAS_SEH && !GTEST_OS_WINDOWS_MOBILE
+// On Windows Mobile global exception handlers are not supported.
+LONG WINAPI ExitWithExceptionCode(
+    struct _EXCEPTION_POINTERS* exception_pointers) {
+  exit(exception_pointers->ExceptionRecord->ExceptionCode);
+}
+#endif
+
+}  // namespace
+
+int main(int argc, char **argv) {
+#if GTEST_OS_WINDOWS
+  // Suppresses display of the Windows error dialog upon encountering
+  // a general protection fault (segment violation).
+  SetErrorMode(SEM_NOGPFAULTERRORBOX | SEM_FAILCRITICALERRORS);
+
+# if GTEST_HAS_SEH && !GTEST_OS_WINDOWS_MOBILE
+
+  // The default unhandled exception filter does not always exit
+  // with the exception code as exit code - for example it exits with
+  // 0 for EXCEPTION_ACCESS_VIOLATION and 1 for EXCEPTION_BREAKPOINT
+  // if the application is compiled in debug mode. Thus we use our own
+  // filter which always exits with the exception code for unhandled
+  // exceptions.
+  SetUnhandledExceptionFilter(ExitWithExceptionCode);
+
+# endif
+#endif
+
+  testing::InitGoogleTest(&argc, argv);
+
+  return RUN_ALL_TESTS();
+}
diff --git a/contrib/gtest-1.7.0/test/gtest_catch_exceptions_test.py b/contrib/gtest-1.7.0/test/gtest_catch_exceptions_test.py
new file mode 100755
index 0000000..e6fc22f
--- /dev/null
+++ b/contrib/gtest-1.7.0/test/gtest_catch_exceptions_test.py
@@ -0,0 +1,237 @@
+#!/usr/bin/env python
+#
+# Copyright 2010 Google Inc.  All Rights Reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+#
+#     * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#     * Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following disclaimer
+# in the documentation and/or other materials provided with the
+# distribution.
+#     * Neither the name of Google Inc. nor the names of its
+# contributors may be used to endorse or promote products derived from
+# this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+"""Tests Google Test's exception catching behavior.
+
+This script invokes gtest_catch_exceptions_test_ and
+gtest_catch_exceptions_ex_test_ (programs written with
+Google Test) and verifies their output.
+"""
+
+__author__ = 'vladl at google.com (Vlad Losev)'
+
+import os
+
+import gtest_test_utils
+
+# Constants.
+FLAG_PREFIX = '--gtest_'
+LIST_TESTS_FLAG = FLAG_PREFIX + 'list_tests'
+NO_CATCH_EXCEPTIONS_FLAG = FLAG_PREFIX + 'catch_exceptions=0'
+FILTER_FLAG = FLAG_PREFIX + 'filter'
+
+# Path to the gtest_catch_exceptions_ex_test_ binary, compiled with
+# exceptions enabled.
+EX_EXE_PATH = gtest_test_utils.GetTestExecutablePath(
+    'gtest_catch_exceptions_ex_test_')
+
+# Path to the gtest_catch_exceptions_test_ binary, compiled with
+# exceptions disabled.
+EXE_PATH = gtest_test_utils.GetTestExecutablePath(
+    'gtest_catch_exceptions_no_ex_test_')
+
+environ = gtest_test_utils.environ
+SetEnvVar = gtest_test_utils.SetEnvVar
+
+# Tests in this file run a Google-Test-based test program and expect it
+# to terminate prematurely.  Therefore they are incompatible with
+# the premature-exit-file protocol by design.  Unset the
+# premature-exit filepath to prevent Google Test from creating
+# the file.
+SetEnvVar(gtest_test_utils.PREMATURE_EXIT_FILE_ENV_VAR, None)
+
+TEST_LIST = gtest_test_utils.Subprocess(
+    [EXE_PATH, LIST_TESTS_FLAG], env=environ).output
+
+SUPPORTS_SEH_EXCEPTIONS = 'ThrowsSehException' in TEST_LIST
+
+if SUPPORTS_SEH_EXCEPTIONS:
+  BINARY_OUTPUT = gtest_test_utils.Subprocess([EXE_PATH], env=environ).output
+
+EX_BINARY_OUTPUT = gtest_test_utils.Subprocess(
+    [EX_EXE_PATH], env=environ).output
+
+
+# The tests.
+if SUPPORTS_SEH_EXCEPTIONS:
+  # pylint:disable-msg=C6302
+  class CatchSehExceptionsTest(gtest_test_utils.TestCase):
+    """Tests exception-catching behavior."""
+
+
+    def TestSehExceptions(self, test_output):
+      self.assert_('SEH exception with code 0x2a thrown '
+                   'in the test fixture\'s constructor'
+                   in test_output)
+      self.assert_('SEH exception with code 0x2a thrown '
+                   'in the test fixture\'s destructor'
+                   in test_output)
+      self.assert_('SEH exception with code 0x2a thrown in SetUpTestCase()'
+                   in test_output)
+      self.assert_('SEH exception with code 0x2a thrown in TearDownTestCase()'
+                   in test_output)
+      self.assert_('SEH exception with code 0x2a thrown in SetUp()'
+                   in test_output)
+      self.assert_('SEH exception with code 0x2a thrown in TearDown()'
+                   in test_output)
+      self.assert_('SEH exception with code 0x2a thrown in the test body'
+                   in test_output)
+
+    def testCatchesSehExceptionsWithCxxExceptionsEnabled(self):
+      self.TestSehExceptions(EX_BINARY_OUTPUT)
+
+    def testCatchesSehExceptionsWithCxxExceptionsDisabled(self):
+      self.TestSehExceptions(BINARY_OUTPUT)
+
+
+class CatchCxxExceptionsTest(gtest_test_utils.TestCase):
+  """Tests C++ exception-catching behavior.
+
+     Tests in this test case verify that:
+     * C++ exceptions are caught and logged as C++ (not SEH) exceptions
+     * Exception thrown affect the remainder of the test work flow in the
+       expected manner.
+  """
+
+  def testCatchesCxxExceptionsInFixtureConstructor(self):
+    self.assert_('C++ exception with description '
+                 '"Standard C++ exception" thrown '
+                 'in the test fixture\'s constructor'
+                 in EX_BINARY_OUTPUT)
+    self.assert_('unexpected' not in EX_BINARY_OUTPUT,
+                 'This failure belongs in this test only if '
+                 '"CxxExceptionInConstructorTest" (no quotes) '
+                 'appears on the same line as words "called unexpectedly"')
+
+  if ('CxxExceptionInDestructorTest.ThrowsExceptionInDestructor' in
+      EX_BINARY_OUTPUT):
+
+    def testCatchesCxxExceptionsInFixtureDestructor(self):
+      self.assert_('C++ exception with description '
+                   '"Standard C++ exception" thrown '
+                   'in the test fixture\'s destructor'
+                   in EX_BINARY_OUTPUT)
+      self.assert_('CxxExceptionInDestructorTest::TearDownTestCase() '
+                   'called as expected.'
+                   in EX_BINARY_OUTPUT)
+
+  def testCatchesCxxExceptionsInSetUpTestCase(self):
+    self.assert_('C++ exception with description "Standard C++ exception"'
+                 ' thrown in SetUpTestCase()'
+                 in EX_BINARY_OUTPUT)
+    self.assert_('CxxExceptionInConstructorTest::TearDownTestCase() '
+                 'called as expected.'
+                 in EX_BINARY_OUTPUT)
+    self.assert_('CxxExceptionInSetUpTestCaseTest constructor '
+                 'called as expected.'
+                 in EX_BINARY_OUTPUT)
+    self.assert_('CxxExceptionInSetUpTestCaseTest destructor '
+                 'called as expected.'
+                 in EX_BINARY_OUTPUT)
+    self.assert_('CxxExceptionInSetUpTestCaseTest::SetUp() '
+                 'called as expected.'
+                 in EX_BINARY_OUTPUT)
+    self.assert_('CxxExceptionInSetUpTestCaseTest::TearDown() '
+                 'called as expected.'
+                 in EX_BINARY_OUTPUT)
+    self.assert_('CxxExceptionInSetUpTestCaseTest test body '
+                 'called as expected.'
+                 in EX_BINARY_OUTPUT)
+
+  def testCatchesCxxExceptionsInTearDownTestCase(self):
+    self.assert_('C++ exception with description "Standard C++ exception"'
+                 ' thrown in TearDownTestCase()'
+                 in EX_BINARY_OUTPUT)
+
+  def testCatchesCxxExceptionsInSetUp(self):
+    self.assert_('C++ exception with description "Standard C++ exception"'
+                 ' thrown in SetUp()'
+                 in EX_BINARY_OUTPUT)
+    self.assert_('CxxExceptionInSetUpTest::TearDownTestCase() '
+                 'called as expected.'
+                 in EX_BINARY_OUTPUT)
+    self.assert_('CxxExceptionInSetUpTest destructor '
+                 'called as expected.'
+                 in EX_BINARY_OUTPUT)
+    self.assert_('CxxExceptionInSetUpTest::TearDown() '
+                 'called as expected.'
+                 in EX_BINARY_OUTPUT)
+    self.assert_('unexpected' not in EX_BINARY_OUTPUT,
+                 'This failure belongs in this test only if '
+                 '"CxxExceptionInSetUpTest" (no quotes) '
+                 'appears on the same line as words "called unexpectedly"')
+
+  def testCatchesCxxExceptionsInTearDown(self):
+    self.assert_('C++ exception with description "Standard C++ exception"'
+                 ' thrown in TearDown()'
+                 in EX_BINARY_OUTPUT)
+    self.assert_('CxxExceptionInTearDownTest::TearDownTestCase() '
+                 'called as expected.'
+                 in EX_BINARY_OUTPUT)
+    self.assert_('CxxExceptionInTearDownTest destructor '
+                 'called as expected.'
+                 in EX_BINARY_OUTPUT)
+
+  def testCatchesCxxExceptionsInTestBody(self):
+    self.assert_('C++ exception with description "Standard C++ exception"'
+                 ' thrown in the test body'
+                 in EX_BINARY_OUTPUT)
+    self.assert_('CxxExceptionInTestBodyTest::TearDownTestCase() '
+                 'called as expected.'
+                 in EX_BINARY_OUTPUT)
+    self.assert_('CxxExceptionInTestBodyTest destructor '
+                 'called as expected.'
+                 in EX_BINARY_OUTPUT)
+    self.assert_('CxxExceptionInTestBodyTest::TearDown() '
+                 'called as expected.'
+                 in EX_BINARY_OUTPUT)
+
+  def testCatchesNonStdCxxExceptions(self):
+    self.assert_('Unknown C++ exception thrown in the test body'
+                 in EX_BINARY_OUTPUT)
+
+  def testUnhandledCxxExceptionsAbortTheProgram(self):
+    # Filters out SEH exception tests on Windows. Unhandled SEH exceptions
+    # cause tests to show pop-up windows there.
+    FITLER_OUT_SEH_TESTS_FLAG = FILTER_FLAG + '=-*Seh*'
+    # By default, Google Test doesn't catch the exceptions.
+    uncaught_exceptions_ex_binary_output = gtest_test_utils.Subprocess(
+        [EX_EXE_PATH,
+         NO_CATCH_EXCEPTIONS_FLAG,
+         FITLER_OUT_SEH_TESTS_FLAG],
+        env=environ).output
+
+    self.assert_('Unhandled C++ exception terminating the program'
+                 in uncaught_exceptions_ex_binary_output)
+    self.assert_('unexpected' not in uncaught_exceptions_ex_binary_output)
+
+
+if __name__ == '__main__':
+  gtest_test_utils.Main()
diff --git a/contrib/gtest-1.7.0/test/gtest_catch_exceptions_test_.cc b/contrib/gtest-1.7.0/test/gtest_catch_exceptions_test_.cc
new file mode 100644
index 0000000..d0fc82c
--- /dev/null
+++ b/contrib/gtest-1.7.0/test/gtest_catch_exceptions_test_.cc
@@ -0,0 +1,311 @@
+// Copyright 2010, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: vladl at google.com (Vlad Losev)
+//
+// Tests for Google Test itself. Tests in this file throw C++ or SEH
+// exceptions, and the output is verified by gtest_catch_exceptions_test.py.
+
+#include "gtest/gtest.h"
+
+#include <stdio.h>  // NOLINT
+#include <stdlib.h>  // For exit().
+
+#if GTEST_HAS_SEH
+# include <windows.h>
+#endif
+
+#if GTEST_HAS_EXCEPTIONS
+# include <exception>  // For set_terminate().
+# include <stdexcept>
+#endif
+
+using testing::Test;
+
+#if GTEST_HAS_SEH
+
+class SehExceptionInConstructorTest : public Test {
+ public:
+  SehExceptionInConstructorTest() { RaiseException(42, 0, 0, NULL); }
+};
+
+TEST_F(SehExceptionInConstructorTest, ThrowsExceptionInConstructor) {}
+
+class SehExceptionInDestructorTest : public Test {
+ public:
+  ~SehExceptionInDestructorTest() { RaiseException(42, 0, 0, NULL); }
+};
+
+TEST_F(SehExceptionInDestructorTest, ThrowsExceptionInDestructor) {}
+
+class SehExceptionInSetUpTestCaseTest : public Test {
+ public:
+  static void SetUpTestCase() { RaiseException(42, 0, 0, NULL); }
+};
+
+TEST_F(SehExceptionInSetUpTestCaseTest, ThrowsExceptionInSetUpTestCase) {}
+
+class SehExceptionInTearDownTestCaseTest : public Test {
+ public:
+  static void TearDownTestCase() { RaiseException(42, 0, 0, NULL); }
+};
+
+TEST_F(SehExceptionInTearDownTestCaseTest, ThrowsExceptionInTearDownTestCase) {}
+
+class SehExceptionInSetUpTest : public Test {
+ protected:
+  virtual void SetUp() { RaiseException(42, 0, 0, NULL); }
+};
+
+TEST_F(SehExceptionInSetUpTest, ThrowsExceptionInSetUp) {}
+
+class SehExceptionInTearDownTest : public Test {
+ protected:
+  virtual void TearDown() { RaiseException(42, 0, 0, NULL); }
+};
+
+TEST_F(SehExceptionInTearDownTest, ThrowsExceptionInTearDown) {}
+
+TEST(SehExceptionTest, ThrowsSehException) {
+  RaiseException(42, 0, 0, NULL);
+}
+
+#endif  // GTEST_HAS_SEH
+
+#if GTEST_HAS_EXCEPTIONS
+
+class CxxExceptionInConstructorTest : public Test {
+ public:
+  CxxExceptionInConstructorTest() {
+    // Without this macro VC++ complains about unreachable code at the end of
+    // the constructor.
+    GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(
+        throw std::runtime_error("Standard C++ exception"));
+  }
+
+  static void TearDownTestCase() {
+    printf("%s",
+           "CxxExceptionInConstructorTest::TearDownTestCase() "
+           "called as expected.\n");
+  }
+
+ protected:
+  ~CxxExceptionInConstructorTest() {
+    ADD_FAILURE() << "CxxExceptionInConstructorTest destructor "
+                  << "called unexpectedly.";
+  }
+
+  virtual void SetUp() {
+    ADD_FAILURE() << "CxxExceptionInConstructorTest::SetUp() "
+                  << "called unexpectedly.";
+  }
+
+  virtual void TearDown() {
+    ADD_FAILURE() << "CxxExceptionInConstructorTest::TearDown() "
+                  << "called unexpectedly.";
+  }
+};
+
+TEST_F(CxxExceptionInConstructorTest, ThrowsExceptionInConstructor) {
+  ADD_FAILURE() << "CxxExceptionInConstructorTest test body "
+                << "called unexpectedly.";
+}
+
+// Exceptions in destructors are not supported in C++11.
+#if !defined(__GXX_EXPERIMENTAL_CXX0X__) &&  __cplusplus < 201103L
+class CxxExceptionInDestructorTest : public Test {
+ public:
+  static void TearDownTestCase() {
+    printf("%s",
+           "CxxExceptionInDestructorTest::TearDownTestCase() "
+           "called as expected.\n");
+  }
+
+ protected:
+  ~CxxExceptionInDestructorTest() {
+    GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(
+        throw std::runtime_error("Standard C++ exception"));
+  }
+};
+
+TEST_F(CxxExceptionInDestructorTest, ThrowsExceptionInDestructor) {}
+#endif  // C++11 mode
+
+class CxxExceptionInSetUpTestCaseTest : public Test {
+ public:
+  CxxExceptionInSetUpTestCaseTest() {
+    printf("%s",
+           "CxxExceptionInSetUpTestCaseTest constructor "
+           "called as expected.\n");
+  }
+
+  static void SetUpTestCase() {
+    throw std::runtime_error("Standard C++ exception");
+  }
+
+  static void TearDownTestCase() {
+    printf("%s",
+           "CxxExceptionInSetUpTestCaseTest::TearDownTestCase() "
+           "called as expected.\n");
+  }
+
+ protected:
+  ~CxxExceptionInSetUpTestCaseTest() {
+    printf("%s",
+           "CxxExceptionInSetUpTestCaseTest destructor "
+           "called as expected.\n");
+  }
+
+  virtual void SetUp() {
+    printf("%s",
+           "CxxExceptionInSetUpTestCaseTest::SetUp() "
+           "called as expected.\n");
+  }
+
+  virtual void TearDown() {
+    printf("%s",
+           "CxxExceptionInSetUpTestCaseTest::TearDown() "
+           "called as expected.\n");
+  }
+};
+
+TEST_F(CxxExceptionInSetUpTestCaseTest, ThrowsExceptionInSetUpTestCase) {
+  printf("%s",
+         "CxxExceptionInSetUpTestCaseTest test body "
+         "called as expected.\n");
+}
+
+class CxxExceptionInTearDownTestCaseTest : public Test {
+ public:
+  static void TearDownTestCase() {
+    throw std::runtime_error("Standard C++ exception");
+  }
+};
+
+TEST_F(CxxExceptionInTearDownTestCaseTest, ThrowsExceptionInTearDownTestCase) {}
+
+class CxxExceptionInSetUpTest : public Test {
+ public:
+  static void TearDownTestCase() {
+    printf("%s",
+           "CxxExceptionInSetUpTest::TearDownTestCase() "
+           "called as expected.\n");
+  }
+
+ protected:
+  ~CxxExceptionInSetUpTest() {
+    printf("%s",
+           "CxxExceptionInSetUpTest destructor "
+           "called as expected.\n");
+  }
+
+  virtual void SetUp() { throw std::runtime_error("Standard C++ exception"); }
+
+  virtual void TearDown() {
+    printf("%s",
+           "CxxExceptionInSetUpTest::TearDown() "
+           "called as expected.\n");
+  }
+};
+
+TEST_F(CxxExceptionInSetUpTest, ThrowsExceptionInSetUp) {
+  ADD_FAILURE() << "CxxExceptionInSetUpTest test body "
+                << "called unexpectedly.";
+}
+
+class CxxExceptionInTearDownTest : public Test {
+ public:
+  static void TearDownTestCase() {
+    printf("%s",
+           "CxxExceptionInTearDownTest::TearDownTestCase() "
+           "called as expected.\n");
+  }
+
+ protected:
+  ~CxxExceptionInTearDownTest() {
+    printf("%s",
+           "CxxExceptionInTearDownTest destructor "
+           "called as expected.\n");
+  }
+
+  virtual void TearDown() {
+    throw std::runtime_error("Standard C++ exception");
+  }
+};
+
+TEST_F(CxxExceptionInTearDownTest, ThrowsExceptionInTearDown) {}
+
+class CxxExceptionInTestBodyTest : public Test {
+ public:
+  static void TearDownTestCase() {
+    printf("%s",
+           "CxxExceptionInTestBodyTest::TearDownTestCase() "
+           "called as expected.\n");
+  }
+
+ protected:
+  ~CxxExceptionInTestBodyTest() {
+    printf("%s",
+           "CxxExceptionInTestBodyTest destructor "
+           "called as expected.\n");
+  }
+
+  virtual void TearDown() {
+    printf("%s",
+           "CxxExceptionInTestBodyTest::TearDown() "
+           "called as expected.\n");
+  }
+};
+
+TEST_F(CxxExceptionInTestBodyTest, ThrowsStdCxxException) {
+  throw std::runtime_error("Standard C++ exception");
+}
+
+TEST(CxxExceptionTest, ThrowsNonStdCxxException) {
+  throw "C-string";
+}
+
+// This terminate handler aborts the program using exit() rather than abort().
+// This avoids showing pop-ups on Windows systems and core dumps on Unix-like
+// ones.
+void TerminateHandler() {
+  fprintf(stderr, "%s\n", "Unhandled C++ exception terminating the program.");
+  fflush(NULL);
+  exit(3);
+}
+
+#endif  // GTEST_HAS_EXCEPTIONS
+
+int main(int argc, char** argv) {
+#if GTEST_HAS_EXCEPTIONS
+  std::set_terminate(&TerminateHandler);
+#endif
+  testing::InitGoogleTest(&argc, argv);
+  return RUN_ALL_TESTS();
+}
diff --git a/contrib/gtest-1.7.0/test/gtest_color_test.py b/contrib/gtest-1.7.0/test/gtest_color_test.py
new file mode 100755
index 0000000..d02a53e
--- /dev/null
+++ b/contrib/gtest-1.7.0/test/gtest_color_test.py
@@ -0,0 +1,130 @@
+#!/usr/bin/env python
+#
+# Copyright 2008, Google Inc.
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+#
+#     * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#     * Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following disclaimer
+# in the documentation and/or other materials provided with the
+# distribution.
+#     * Neither the name of Google Inc. nor the names of its
+# contributors may be used to endorse or promote products derived from
+# this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+"""Verifies that Google Test correctly determines whether to use colors."""
+
+__author__ = 'wan at google.com (Zhanyong Wan)'
+
+import os
+import gtest_test_utils
+
+
+IS_WINDOWS = os.name = 'nt'
+
+COLOR_ENV_VAR = 'GTEST_COLOR'
+COLOR_FLAG = 'gtest_color'
+COMMAND = gtest_test_utils.GetTestExecutablePath('gtest_color_test_')
+
+
+def SetEnvVar(env_var, value):
+  """Sets the env variable to 'value'; unsets it when 'value' is None."""
+
+  if value is not None:
+    os.environ[env_var] = value
+  elif env_var in os.environ:
+    del os.environ[env_var]
+
+
+def UsesColor(term, color_env_var, color_flag):
+  """Runs gtest_color_test_ and returns its exit code."""
+
+  SetEnvVar('TERM', term)
+  SetEnvVar(COLOR_ENV_VAR, color_env_var)
+
+  if color_flag is None:
+    args = []
+  else:
+    args = ['--%s=%s' % (COLOR_FLAG, color_flag)]
+  p = gtest_test_utils.Subprocess([COMMAND] + args)
+  return not p.exited or p.exit_code
+
+
+class GTestColorTest(gtest_test_utils.TestCase):
+  def testNoEnvVarNoFlag(self):
+    """Tests the case when there's neither GTEST_COLOR nor --gtest_color."""
+
+    if not IS_WINDOWS:
+      self.assert_(not UsesColor('dumb', None, None))
+      self.assert_(not UsesColor('emacs', None, None))
+      self.assert_(not UsesColor('xterm-mono', None, None))
+      self.assert_(not UsesColor('unknown', None, None))
+      self.assert_(not UsesColor(None, None, None))
+    self.assert_(UsesColor('linux', None, None))
+    self.assert_(UsesColor('cygwin', None, None))
+    self.assert_(UsesColor('xterm', None, None))
+    self.assert_(UsesColor('xterm-color', None, None))
+    self.assert_(UsesColor('xterm-256color', None, None))
+
+  def testFlagOnly(self):
+    """Tests the case when there's --gtest_color but not GTEST_COLOR."""
+
+    self.assert_(not UsesColor('dumb', None, 'no'))
+    self.assert_(not UsesColor('xterm-color', None, 'no'))
+    if not IS_WINDOWS:
+      self.assert_(not UsesColor('emacs', None, 'auto'))
+    self.assert_(UsesColor('xterm', None, 'auto'))
+    self.assert_(UsesColor('dumb', None, 'yes'))
+    self.assert_(UsesColor('xterm', None, 'yes'))
+
+  def testEnvVarOnly(self):
+    """Tests the case when there's GTEST_COLOR but not --gtest_color."""
+
+    self.assert_(not UsesColor('dumb', 'no', None))
+    self.assert_(not UsesColor('xterm-color', 'no', None))
+    if not IS_WINDOWS:
+      self.assert_(not UsesColor('dumb', 'auto', None))
+    self.assert_(UsesColor('xterm-color', 'auto', None))
+    self.assert_(UsesColor('dumb', 'yes', None))
+    self.assert_(UsesColor('xterm-color', 'yes', None))
+
+  def testEnvVarAndFlag(self):
+    """Tests the case when there are both GTEST_COLOR and --gtest_color."""
+
+    self.assert_(not UsesColor('xterm-color', 'no', 'no'))
+    self.assert_(UsesColor('dumb', 'no', 'yes'))
+    self.assert_(UsesColor('xterm-color', 'no', 'auto'))
+
+  def testAliasesOfYesAndNo(self):
+    """Tests using aliases in specifying --gtest_color."""
+
+    self.assert_(UsesColor('dumb', None, 'true'))
+    self.assert_(UsesColor('dumb', None, 'YES'))
+    self.assert_(UsesColor('dumb', None, 'T'))
+    self.assert_(UsesColor('dumb', None, '1'))
+
+    self.assert_(not UsesColor('xterm', None, 'f'))
+    self.assert_(not UsesColor('xterm', None, 'false'))
+    self.assert_(not UsesColor('xterm', None, '0'))
+    self.assert_(not UsesColor('xterm', None, 'unknown'))
+
+
+if __name__ == '__main__':
+  gtest_test_utils.Main()
diff --git a/contrib/gtest-1.7.0/test/gtest_color_test_.cc b/contrib/gtest-1.7.0/test/gtest_color_test_.cc
new file mode 100644
index 0000000..f61ebb8
--- /dev/null
+++ b/contrib/gtest-1.7.0/test/gtest_color_test_.cc
@@ -0,0 +1,71 @@
+// Copyright 2008, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+
+// A helper program for testing how Google Test determines whether to use
+// colors in the output.  It prints "YES" and returns 1 if Google Test
+// decides to use colors, and prints "NO" and returns 0 otherwise.
+
+#include <stdio.h>
+
+#include "gtest/gtest.h"
+
+// Indicates that this translation unit is part of Google Test's
+// implementation.  It must come before gtest-internal-inl.h is
+// included, or there will be a compiler error.  This trick is to
+// prevent a user from accidentally including gtest-internal-inl.h in
+// his code.
+#define GTEST_IMPLEMENTATION_ 1
+#include "src/gtest-internal-inl.h"
+#undef GTEST_IMPLEMENTATION_
+
+using testing::internal::ShouldUseColor;
+
+// The purpose of this is to ensure that the UnitTest singleton is
+// created before main() is entered, and thus that ShouldUseColor()
+// works the same way as in a real Google-Test-based test.  We don't actual
+// run the TEST itself.
+TEST(GTestColorTest, Dummy) {
+}
+
+int main(int argc, char** argv) {
+  testing::InitGoogleTest(&argc, argv);
+
+  if (ShouldUseColor(true)) {
+    // Google Test decides to use colors in the output (assuming it
+    // goes to a TTY).
+    printf("YES\n");
+    return 1;
+  } else {
+    // Google Test decides not to use colors in the output.
+    printf("NO\n");
+    return 0;
+  }
+}
diff --git a/contrib/gtest-1.7.0/test/gtest_env_var_test.py b/contrib/gtest-1.7.0/test/gtest_env_var_test.py
new file mode 100755
index 0000000..ac24337
--- /dev/null
+++ b/contrib/gtest-1.7.0/test/gtest_env_var_test.py
@@ -0,0 +1,103 @@
+#!/usr/bin/env python
+#
+# Copyright 2008, Google Inc.
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+#
+#     * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#     * Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following disclaimer
+# in the documentation and/or other materials provided with the
+# distribution.
+#     * Neither the name of Google Inc. nor the names of its
+# contributors may be used to endorse or promote products derived from
+# this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+"""Verifies that Google Test correctly parses environment variables."""
+
+__author__ = 'wan at google.com (Zhanyong Wan)'
+
+import os
+import gtest_test_utils
+
+
+IS_WINDOWS = os.name == 'nt'
+IS_LINUX = os.name == 'posix' and os.uname()[0] == 'Linux'
+
+COMMAND = gtest_test_utils.GetTestExecutablePath('gtest_env_var_test_')
+
+environ = os.environ.copy()
+
+
+def AssertEq(expected, actual):
+  if expected != actual:
+    print 'Expected: %s' % (expected,)
+    print '  Actual: %s' % (actual,)
+    raise AssertionError
+
+
+def SetEnvVar(env_var, value):
+  """Sets the env variable to 'value'; unsets it when 'value' is None."""
+
+  if value is not None:
+    environ[env_var] = value
+  elif env_var in environ:
+    del environ[env_var]
+
+
+def GetFlag(flag):
+  """Runs gtest_env_var_test_ and returns its output."""
+
+  args = [COMMAND]
+  if flag is not None:
+    args += [flag]
+  return gtest_test_utils.Subprocess(args, env=environ).output
+
+
+def TestFlag(flag, test_val, default_val):
+  """Verifies that the given flag is affected by the corresponding env var."""
+
+  env_var = 'GTEST_' + flag.upper()
+  SetEnvVar(env_var, test_val)
+  AssertEq(test_val, GetFlag(flag))
+  SetEnvVar(env_var, None)
+  AssertEq(default_val, GetFlag(flag))
+
+
+class GTestEnvVarTest(gtest_test_utils.TestCase):
+  def testEnvVarAffectsFlag(self):
+    """Tests that environment variable should affect the corresponding flag."""
+
+    TestFlag('break_on_failure', '1', '0')
+    TestFlag('color', 'yes', 'auto')
+    TestFlag('filter', 'FooTest.Bar', '*')
+    TestFlag('output', 'xml:tmp/foo.xml', '')
+    TestFlag('print_time', '0', '1')
+    TestFlag('repeat', '999', '1')
+    TestFlag('throw_on_failure', '1', '0')
+    TestFlag('death_test_style', 'threadsafe', 'fast')
+    TestFlag('catch_exceptions', '0', '1')
+
+    if IS_LINUX:
+      TestFlag('death_test_use_fork', '1', '0')
+      TestFlag('stack_trace_depth', '0', '100')
+
+
+if __name__ == '__main__':
+  gtest_test_utils.Main()
diff --git a/contrib/gtest-1.7.0/test/gtest_env_var_test_.cc b/contrib/gtest-1.7.0/test/gtest_env_var_test_.cc
new file mode 100644
index 0000000..539afc9
--- /dev/null
+++ b/contrib/gtest-1.7.0/test/gtest_env_var_test_.cc
@@ -0,0 +1,126 @@
+// Copyright 2008, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+
+// A helper program for testing that Google Test parses the environment
+// variables correctly.
+
+#include "gtest/gtest.h"
+
+#include <iostream>
+
+#define GTEST_IMPLEMENTATION_ 1
+#include "src/gtest-internal-inl.h"
+#undef GTEST_IMPLEMENTATION_
+
+using ::std::cout;
+
+namespace testing {
+
+// The purpose of this is to make the test more realistic by ensuring
+// that the UnitTest singleton is created before main() is entered.
+// We don't actual run the TEST itself.
+TEST(GTestEnvVarTest, Dummy) {
+}
+
+void PrintFlag(const char* flag) {
+  if (strcmp(flag, "break_on_failure") == 0) {
+    cout << GTEST_FLAG(break_on_failure);
+    return;
+  }
+
+  if (strcmp(flag, "catch_exceptions") == 0) {
+    cout << GTEST_FLAG(catch_exceptions);
+    return;
+  }
+
+  if (strcmp(flag, "color") == 0) {
+    cout << GTEST_FLAG(color);
+    return;
+  }
+
+  if (strcmp(flag, "death_test_style") == 0) {
+    cout << GTEST_FLAG(death_test_style);
+    return;
+  }
+
+  if (strcmp(flag, "death_test_use_fork") == 0) {
+    cout << GTEST_FLAG(death_test_use_fork);
+    return;
+  }
+
+  if (strcmp(flag, "filter") == 0) {
+    cout << GTEST_FLAG(filter);
+    return;
+  }
+
+  if (strcmp(flag, "output") == 0) {
+    cout << GTEST_FLAG(output);
+    return;
+  }
+
+  if (strcmp(flag, "print_time") == 0) {
+    cout << GTEST_FLAG(print_time);
+    return;
+  }
+
+  if (strcmp(flag, "repeat") == 0) {
+    cout << GTEST_FLAG(repeat);
+    return;
+  }
+
+  if (strcmp(flag, "stack_trace_depth") == 0) {
+    cout << GTEST_FLAG(stack_trace_depth);
+    return;
+  }
+
+  if (strcmp(flag, "throw_on_failure") == 0) {
+    cout << GTEST_FLAG(throw_on_failure);
+    return;
+  }
+
+  cout << "Invalid flag name " << flag
+       << ".  Valid names are break_on_failure, color, filter, etc.\n";
+  exit(1);
+}
+
+}  // namespace testing
+
+int main(int argc, char** argv) {
+  testing::InitGoogleTest(&argc, argv);
+
+  if (argc != 2) {
+    cout << "Usage: gtest_env_var_test_ NAME_OF_FLAG\n";
+    return 1;
+  }
+
+  testing::PrintFlag(argv[1]);
+  return 0;
+}
diff --git a/contrib/gtest-1.7.0/test/gtest_environment_test.cc b/contrib/gtest-1.7.0/test/gtest_environment_test.cc
new file mode 100644
index 0000000..3cff19e
--- /dev/null
+++ b/contrib/gtest-1.7.0/test/gtest_environment_test.cc
@@ -0,0 +1,192 @@
+// Copyright 2007, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+//
+// Tests using global test environments.
+
+#include <stdlib.h>
+#include <stdio.h>
+#include "gtest/gtest.h"
+
+#define GTEST_IMPLEMENTATION_ 1  // Required for the next #include.
+#include "src/gtest-internal-inl.h"
+#undef GTEST_IMPLEMENTATION_
+
+namespace testing {
+GTEST_DECLARE_string_(filter);
+}
+
+namespace {
+
+enum FailureType {
+  NO_FAILURE, NON_FATAL_FAILURE, FATAL_FAILURE
+};
+
+// For testing using global test environments.
+class MyEnvironment : public testing::Environment {
+ public:
+  MyEnvironment() { Reset(); }
+
+  // Depending on the value of failure_in_set_up_, SetUp() will
+  // generate a non-fatal failure, generate a fatal failure, or
+  // succeed.
+  virtual void SetUp() {
+    set_up_was_run_ = true;
+
+    switch (failure_in_set_up_) {
+      case NON_FATAL_FAILURE:
+        ADD_FAILURE() << "Expected non-fatal failure in global set-up.";
+        break;
+      case FATAL_FAILURE:
+        FAIL() << "Expected fatal failure in global set-up.";
+        break;
+      default:
+        break;
+    }
+  }
+
+  // Generates a non-fatal failure.
+  virtual void TearDown() {
+    tear_down_was_run_ = true;
+    ADD_FAILURE() << "Expected non-fatal failure in global tear-down.";
+  }
+
+  // Resets the state of the environment s.t. it can be reused.
+  void Reset() {
+    failure_in_set_up_ = NO_FAILURE;
+    set_up_was_run_ = false;
+    tear_down_was_run_ = false;
+  }
+
+  // We call this function to set the type of failure SetUp() should
+  // generate.
+  void set_failure_in_set_up(FailureType type) {
+    failure_in_set_up_ = type;
+  }
+
+  // Was SetUp() run?
+  bool set_up_was_run() const { return set_up_was_run_; }
+
+  // Was TearDown() run?
+  bool tear_down_was_run() const { return tear_down_was_run_; }
+
+ private:
+  FailureType failure_in_set_up_;
+  bool set_up_was_run_;
+  bool tear_down_was_run_;
+};
+
+// Was the TEST run?
+bool test_was_run;
+
+// The sole purpose of this TEST is to enable us to check whether it
+// was run.
+TEST(FooTest, Bar) {
+  test_was_run = true;
+}
+
+// Prints the message and aborts the program if condition is false.
+void Check(bool condition, const char* msg) {
+  if (!condition) {
+    printf("FAILED: %s\n", msg);
+    testing::internal::posix::Abort();
+  }
+}
+
+// Runs the tests.  Return true iff successful.
+//
+// The 'failure' parameter specifies the type of failure that should
+// be generated by the global set-up.
+int RunAllTests(MyEnvironment* env, FailureType failure) {
+  env->Reset();
+  env->set_failure_in_set_up(failure);
+  test_was_run = false;
+  testing::internal::GetUnitTestImpl()->ClearAdHocTestResult();
+  return RUN_ALL_TESTS();
+}
+
+}  // namespace
+
+int main(int argc, char **argv) {
+  testing::InitGoogleTest(&argc, argv);
+
+  // Registers a global test environment, and verifies that the
+  // registration function returns its argument.
+  MyEnvironment* const env = new MyEnvironment;
+  Check(testing::AddGlobalTestEnvironment(env) == env,
+        "AddGlobalTestEnvironment() should return its argument.");
+
+  // Verifies that RUN_ALL_TESTS() runs the tests when the global
+  // set-up is successful.
+  Check(RunAllTests(env, NO_FAILURE) != 0,
+        "RUN_ALL_TESTS() should return non-zero, as the global tear-down "
+        "should generate a failure.");
+  Check(test_was_run,
+        "The tests should run, as the global set-up should generate no "
+        "failure");
+  Check(env->tear_down_was_run(),
+        "The global tear-down should run, as the global set-up was run.");
+
+  // Verifies that RUN_ALL_TESTS() runs the tests when the global
+  // set-up generates no fatal failure.
+  Check(RunAllTests(env, NON_FATAL_FAILURE) != 0,
+        "RUN_ALL_TESTS() should return non-zero, as both the global set-up "
+        "and the global tear-down should generate a non-fatal failure.");
+  Check(test_was_run,
+        "The tests should run, as the global set-up should generate no "
+        "fatal failure.");
+  Check(env->tear_down_was_run(),
+        "The global tear-down should run, as the global set-up was run.");
+
+  // Verifies that RUN_ALL_TESTS() runs no test when the global set-up
+  // generates a fatal failure.
+  Check(RunAllTests(env, FATAL_FAILURE) != 0,
+        "RUN_ALL_TESTS() should return non-zero, as the global set-up "
+        "should generate a fatal failure.");
+  Check(!test_was_run,
+        "The tests should not run, as the global set-up should generate "
+        "a fatal failure.");
+  Check(env->tear_down_was_run(),
+        "The global tear-down should run, as the global set-up was run.");
+
+  // Verifies that RUN_ALL_TESTS() doesn't do global set-up or
+  // tear-down when there is no test to run.
+  testing::GTEST_FLAG(filter) = "-*";
+  Check(RunAllTests(env, NO_FAILURE) == 0,
+        "RUN_ALL_TESTS() should return zero, as there is no test to run.");
+  Check(!env->set_up_was_run(),
+        "The global set-up should not run, as there is no test to run.");
+  Check(!env->tear_down_was_run(),
+        "The global tear-down should not run, "
+        "as the global set-up was not run.");
+
+  printf("PASS\n");
+  return 0;
+}
diff --git a/contrib/gtest-1.7.0/test/gtest_filter_unittest.py b/contrib/gtest-1.7.0/test/gtest_filter_unittest.py
new file mode 100755
index 0000000..0d1a770
--- /dev/null
+++ b/contrib/gtest-1.7.0/test/gtest_filter_unittest.py
@@ -0,0 +1,633 @@
+#!/usr/bin/env python
+#
+# Copyright 2005 Google Inc. All Rights Reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+#
+#     * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#     * Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following disclaimer
+# in the documentation and/or other materials provided with the
+# distribution.
+#     * Neither the name of Google Inc. nor the names of its
+# contributors may be used to endorse or promote products derived from
+# this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+"""Unit test for Google Test test filters.
+
+A user can specify which test(s) in a Google Test program to run via either
+the GTEST_FILTER environment variable or the --gtest_filter flag.
+This script tests such functionality by invoking
+gtest_filter_unittest_ (a program written with Google Test) with different
+environments and command line flags.
+
+Note that test sharding may also influence which tests are filtered. Therefore,
+we test that here also.
+"""
+
+__author__ = 'wan at google.com (Zhanyong Wan)'
+
+import os
+import re
+import sets
+import sys
+
+import gtest_test_utils
+
+# Constants.
+
+# Checks if this platform can pass empty environment variables to child
+# processes.  We set an env variable to an empty string and invoke a python
+# script in a subprocess to print whether the variable is STILL in
+# os.environ.  We then use 'eval' to parse the child's output so that an
+# exception is thrown if the input is anything other than 'True' nor 'False'.
+os.environ['EMPTY_VAR'] = ''
+child = gtest_test_utils.Subprocess(
+    [sys.executable, '-c', 'import os; print \'EMPTY_VAR\' in os.environ'])
+CAN_PASS_EMPTY_ENV = eval(child.output)
+
+
+# Check if this platform can unset environment variables in child processes.
+# We set an env variable to a non-empty string, unset it, and invoke
+# a python script in a subprocess to print whether the variable
+# is NO LONGER in os.environ.
+# We use 'eval' to parse the child's output so that an exception
+# is thrown if the input is neither 'True' nor 'False'.
+os.environ['UNSET_VAR'] = 'X'
+del os.environ['UNSET_VAR']
+child = gtest_test_utils.Subprocess(
+    [sys.executable, '-c', 'import os; print \'UNSET_VAR\' not in os.environ'])
+CAN_UNSET_ENV = eval(child.output)
+
+
+# Checks if we should test with an empty filter. This doesn't
+# make sense on platforms that cannot pass empty env variables (Win32)
+# and on platforms that cannot unset variables (since we cannot tell
+# the difference between "" and NULL -- Borland and Solaris < 5.10)
+CAN_TEST_EMPTY_FILTER = (CAN_PASS_EMPTY_ENV and CAN_UNSET_ENV)
+
+
+# The environment variable for specifying the test filters.
+FILTER_ENV_VAR = 'GTEST_FILTER'
+
+# The environment variables for test sharding.
+TOTAL_SHARDS_ENV_VAR = 'GTEST_TOTAL_SHARDS'
+SHARD_INDEX_ENV_VAR = 'GTEST_SHARD_INDEX'
+SHARD_STATUS_FILE_ENV_VAR = 'GTEST_SHARD_STATUS_FILE'
+
+# The command line flag for specifying the test filters.
+FILTER_FLAG = 'gtest_filter'
+
+# The command line flag for including disabled tests.
+ALSO_RUN_DISABED_TESTS_FLAG = 'gtest_also_run_disabled_tests'
+
+# Command to run the gtest_filter_unittest_ program.
+COMMAND = gtest_test_utils.GetTestExecutablePath('gtest_filter_unittest_')
+
+# Regex for determining whether parameterized tests are enabled in the binary.
+PARAM_TEST_REGEX = re.compile(r'/ParamTest')
+
+# Regex for parsing test case names from Google Test's output.
+TEST_CASE_REGEX = re.compile(r'^\[\-+\] \d+ tests? from (\w+(/\w+)?)')
+
+# Regex for parsing test names from Google Test's output.
+TEST_REGEX = re.compile(r'^\[\s*RUN\s*\].*\.(\w+(/\w+)?)')
+
+# The command line flag to tell Google Test to output the list of tests it
+# will run.
+LIST_TESTS_FLAG = '--gtest_list_tests'
+
+# Indicates whether Google Test supports death tests.
+SUPPORTS_DEATH_TESTS = 'HasDeathTest' in gtest_test_utils.Subprocess(
+    [COMMAND, LIST_TESTS_FLAG]).output
+
+# Full names of all tests in gtest_filter_unittests_.
+PARAM_TESTS = [
+    'SeqP/ParamTest.TestX/0',
+    'SeqP/ParamTest.TestX/1',
+    'SeqP/ParamTest.TestY/0',
+    'SeqP/ParamTest.TestY/1',
+    'SeqQ/ParamTest.TestX/0',
+    'SeqQ/ParamTest.TestX/1',
+    'SeqQ/ParamTest.TestY/0',
+    'SeqQ/ParamTest.TestY/1',
+    ]
+
+DISABLED_TESTS = [
+    'BarTest.DISABLED_TestFour',
+    'BarTest.DISABLED_TestFive',
+    'BazTest.DISABLED_TestC',
+    'DISABLED_FoobarTest.Test1',
+    'DISABLED_FoobarTest.DISABLED_Test2',
+    'DISABLED_FoobarbazTest.TestA',
+    ]
+
+if SUPPORTS_DEATH_TESTS:
+  DEATH_TESTS = [
+    'HasDeathTest.Test1',
+    'HasDeathTest.Test2',
+    ]
+else:
+  DEATH_TESTS = []
+
+# All the non-disabled tests.
+ACTIVE_TESTS = [
+    'FooTest.Abc',
+    'FooTest.Xyz',
+
+    'BarTest.TestOne',
+    'BarTest.TestTwo',
+    'BarTest.TestThree',
+
+    'BazTest.TestOne',
+    'BazTest.TestA',
+    'BazTest.TestB',
+    ] + DEATH_TESTS + PARAM_TESTS
+
+param_tests_present = None
+
+# Utilities.
+
+environ = os.environ.copy()
+
+
+def SetEnvVar(env_var, value):
+  """Sets the env variable to 'value'; unsets it when 'value' is None."""
+
+  if value is not None:
+    environ[env_var] = value
+  elif env_var in environ:
+    del environ[env_var]
+
+
+def RunAndReturnOutput(args = None):
+  """Runs the test program and returns its output."""
+
+  return gtest_test_utils.Subprocess([COMMAND] + (args or []),
+                                     env=environ).output
+
+
+def RunAndExtractTestList(args = None):
+  """Runs the test program and returns its exit code and a list of tests run."""
+
+  p = gtest_test_utils.Subprocess([COMMAND] + (args or []), env=environ)
+  tests_run = []
+  test_case = ''
+  test = ''
+  for line in p.output.split('\n'):
+    match = TEST_CASE_REGEX.match(line)
+    if match is not None:
+      test_case = match.group(1)
+    else:
+      match = TEST_REGEX.match(line)
+      if match is not None:
+        test = match.group(1)
+        tests_run.append(test_case + '.' + test)
+  return (tests_run, p.exit_code)
+
+
+def InvokeWithModifiedEnv(extra_env, function, *args, **kwargs):
+  """Runs the given function and arguments in a modified environment."""
+  try:
+    original_env = environ.copy()
+    environ.update(extra_env)
+    return function(*args, **kwargs)
+  finally:
+    environ.clear()
+    environ.update(original_env)
+
+
+def RunWithSharding(total_shards, shard_index, command):
+  """Runs a test program shard and returns exit code and a list of tests run."""
+
+  extra_env = {SHARD_INDEX_ENV_VAR: str(shard_index),
+               TOTAL_SHARDS_ENV_VAR: str(total_shards)}
+  return InvokeWithModifiedEnv(extra_env, RunAndExtractTestList, command)
+
+# The unit test.
+
+
+class GTestFilterUnitTest(gtest_test_utils.TestCase):
+  """Tests the env variable or the command line flag to filter tests."""
+
+  # Utilities.
+
+  def AssertSetEqual(self, lhs, rhs):
+    """Asserts that two sets are equal."""
+
+    for elem in lhs:
+      self.assert_(elem in rhs, '%s in %s' % (elem, rhs))
+
+    for elem in rhs:
+      self.assert_(elem in lhs, '%s in %s' % (elem, lhs))
+
+  def AssertPartitionIsValid(self, set_var, list_of_sets):
+    """Asserts that list_of_sets is a valid partition of set_var."""
+
+    full_partition = []
+    for slice_var in list_of_sets:
+      full_partition.extend(slice_var)
+    self.assertEqual(len(set_var), len(full_partition))
+    self.assertEqual(sets.Set(set_var), sets.Set(full_partition))
+
+  def AdjustForParameterizedTests(self, tests_to_run):
+    """Adjust tests_to_run in case value parameterized tests are disabled."""
+
+    global param_tests_present
+    if not param_tests_present:
+      return list(sets.Set(tests_to_run) - sets.Set(PARAM_TESTS))
+    else:
+      return tests_to_run
+
+  def RunAndVerify(self, gtest_filter, tests_to_run):
+    """Checks that the binary runs correct set of tests for a given filter."""
+
+    tests_to_run = self.AdjustForParameterizedTests(tests_to_run)
+
+    # First, tests using the environment variable.
+
+    # Windows removes empty variables from the environment when passing it
+    # to a new process.  This means it is impossible to pass an empty filter
+    # into a process using the environment variable.  However, we can still
+    # test the case when the variable is not supplied (i.e., gtest_filter is
+    # None).
+    # pylint: disable-msg=C6403
+    if CAN_TEST_EMPTY_FILTER or gtest_filter != '':
+      SetEnvVar(FILTER_ENV_VAR, gtest_filter)
+      tests_run = RunAndExtractTestList()[0]
+      SetEnvVar(FILTER_ENV_VAR, None)
+      self.AssertSetEqual(tests_run, tests_to_run)
+    # pylint: enable-msg=C6403
+
+    # Next, tests using the command line flag.
+
+    if gtest_filter is None:
+      args = []
+    else:
+      args = ['--%s=%s' % (FILTER_FLAG, gtest_filter)]
+
+    tests_run = RunAndExtractTestList(args)[0]
+    self.AssertSetEqual(tests_run, tests_to_run)
+
+  def RunAndVerifyWithSharding(self, gtest_filter, total_shards, tests_to_run,
+                               args=None, check_exit_0=False):
+    """Checks that binary runs correct tests for the given filter and shard.
+
+    Runs all shards of gtest_filter_unittest_ with the given filter, and
+    verifies that the right set of tests were run. The union of tests run
+    on each shard should be identical to tests_to_run, without duplicates.
+
+    Args:
+      gtest_filter: A filter to apply to the tests.
+      total_shards: A total number of shards to split test run into.
+      tests_to_run: A set of tests expected to run.
+      args   :      Arguments to pass to the to the test binary.
+      check_exit_0: When set to a true value, make sure that all shards
+                    return 0.
+    """
+
+    tests_to_run = self.AdjustForParameterizedTests(tests_to_run)
+
+    # Windows removes empty variables from the environment when passing it
+    # to a new process.  This means it is impossible to pass an empty filter
+    # into a process using the environment variable.  However, we can still
+    # test the case when the variable is not supplied (i.e., gtest_filter is
+    # None).
+    # pylint: disable-msg=C6403
+    if CAN_TEST_EMPTY_FILTER or gtest_filter != '':
+      SetEnvVar(FILTER_ENV_VAR, gtest_filter)
+      partition = []
+      for i in range(0, total_shards):
+        (tests_run, exit_code) = RunWithSharding(total_shards, i, args)
+        if check_exit_0:
+          self.assertEqual(0, exit_code)
+        partition.append(tests_run)
+
+      self.AssertPartitionIsValid(tests_to_run, partition)
+      SetEnvVar(FILTER_ENV_VAR, None)
+    # pylint: enable-msg=C6403
+
+  def RunAndVerifyAllowingDisabled(self, gtest_filter, tests_to_run):
+    """Checks that the binary runs correct set of tests for the given filter.
+
+    Runs gtest_filter_unittest_ with the given filter, and enables
+    disabled tests. Verifies that the right set of tests were run.
+
+    Args:
+      gtest_filter: A filter to apply to the tests.
+      tests_to_run: A set of tests expected to run.
+    """
+
+    tests_to_run = self.AdjustForParameterizedTests(tests_to_run)
+
+    # Construct the command line.
+    args = ['--%s' % ALSO_RUN_DISABED_TESTS_FLAG]
+    if gtest_filter is not None:
+      args.append('--%s=%s' % (FILTER_FLAG, gtest_filter))
+
+    tests_run = RunAndExtractTestList(args)[0]
+    self.AssertSetEqual(tests_run, tests_to_run)
+
+  def setUp(self):
+    """Sets up test case.
+
+    Determines whether value-parameterized tests are enabled in the binary and
+    sets the flags accordingly.
+    """
+
+    global param_tests_present
+    if param_tests_present is None:
+      param_tests_present = PARAM_TEST_REGEX.search(
+          RunAndReturnOutput()) is not None
+
+  def testDefaultBehavior(self):
+    """Tests the behavior of not specifying the filter."""
+
+    self.RunAndVerify(None, ACTIVE_TESTS)
+
+  def testDefaultBehaviorWithShards(self):
+    """Tests the behavior without the filter, with sharding enabled."""
+
+    self.RunAndVerifyWithSharding(None, 1, ACTIVE_TESTS)
+    self.RunAndVerifyWithSharding(None, 2, ACTIVE_TESTS)
+    self.RunAndVerifyWithSharding(None, len(ACTIVE_TESTS) - 1, ACTIVE_TESTS)
+    self.RunAndVerifyWithSharding(None, len(ACTIVE_TESTS), ACTIVE_TESTS)
+    self.RunAndVerifyWithSharding(None, len(ACTIVE_TESTS) + 1, ACTIVE_TESTS)
+
+  def testEmptyFilter(self):
+    """Tests an empty filter."""
+
+    self.RunAndVerify('', [])
+    self.RunAndVerifyWithSharding('', 1, [])
+    self.RunAndVerifyWithSharding('', 2, [])
+
+  def testBadFilter(self):
+    """Tests a filter that matches nothing."""
+
+    self.RunAndVerify('BadFilter', [])
+    self.RunAndVerifyAllowingDisabled('BadFilter', [])
+
+  def testFullName(self):
+    """Tests filtering by full name."""
+
+    self.RunAndVerify('FooTest.Xyz', ['FooTest.Xyz'])
+    self.RunAndVerifyAllowingDisabled('FooTest.Xyz', ['FooTest.Xyz'])
+    self.RunAndVerifyWithSharding('FooTest.Xyz', 5, ['FooTest.Xyz'])
+
+  def testUniversalFilters(self):
+    """Tests filters that match everything."""
+
+    self.RunAndVerify('*', ACTIVE_TESTS)
+    self.RunAndVerify('*.*', ACTIVE_TESTS)
+    self.RunAndVerifyWithSharding('*.*', len(ACTIVE_TESTS) - 3, ACTIVE_TESTS)
+    self.RunAndVerifyAllowingDisabled('*', ACTIVE_TESTS + DISABLED_TESTS)
+    self.RunAndVerifyAllowingDisabled('*.*', ACTIVE_TESTS + DISABLED_TESTS)
+
+  def testFilterByTestCase(self):
+    """Tests filtering by test case name."""
+
+    self.RunAndVerify('FooTest.*', ['FooTest.Abc', 'FooTest.Xyz'])
+
+    BAZ_TESTS = ['BazTest.TestOne', 'BazTest.TestA', 'BazTest.TestB']
+    self.RunAndVerify('BazTest.*', BAZ_TESTS)
+    self.RunAndVerifyAllowingDisabled('BazTest.*',
+                                      BAZ_TESTS + ['BazTest.DISABLED_TestC'])
+
+  def testFilterByTest(self):
+    """Tests filtering by test name."""
+
+    self.RunAndVerify('*.TestOne', ['BarTest.TestOne', 'BazTest.TestOne'])
+
+  def testFilterDisabledTests(self):
+    """Select only the disabled tests to run."""
+
+    self.RunAndVerify('DISABLED_FoobarTest.Test1', [])
+    self.RunAndVerifyAllowingDisabled('DISABLED_FoobarTest.Test1',
+                                      ['DISABLED_FoobarTest.Test1'])
+
+    self.RunAndVerify('*DISABLED_*', [])
+    self.RunAndVerifyAllowingDisabled('*DISABLED_*', DISABLED_TESTS)
+
+    self.RunAndVerify('*.DISABLED_*', [])
+    self.RunAndVerifyAllowingDisabled('*.DISABLED_*', [
+        'BarTest.DISABLED_TestFour',
+        'BarTest.DISABLED_TestFive',
+        'BazTest.DISABLED_TestC',
+        'DISABLED_FoobarTest.DISABLED_Test2',
+        ])
+
+    self.RunAndVerify('DISABLED_*', [])
+    self.RunAndVerifyAllowingDisabled('DISABLED_*', [
+        'DISABLED_FoobarTest.Test1',
+        'DISABLED_FoobarTest.DISABLED_Test2',
+        'DISABLED_FoobarbazTest.TestA',
+        ])
+
+  def testWildcardInTestCaseName(self):
+    """Tests using wildcard in the test case name."""
+
+    self.RunAndVerify('*a*.*', [
+        'BarTest.TestOne',
+        'BarTest.TestTwo',
+        'BarTest.TestThree',
+
+        'BazTest.TestOne',
+        'BazTest.TestA',
+        'BazTest.TestB', ] + DEATH_TESTS + PARAM_TESTS)
+
+  def testWildcardInTestName(self):
+    """Tests using wildcard in the test name."""
+
+    self.RunAndVerify('*.*A*', ['FooTest.Abc', 'BazTest.TestA'])
+
+  def testFilterWithoutDot(self):
+    """Tests a filter that has no '.' in it."""
+
+    self.RunAndVerify('*z*', [
+        'FooTest.Xyz',
+
+        'BazTest.TestOne',
+        'BazTest.TestA',
+        'BazTest.TestB',
+        ])
+
+  def testTwoPatterns(self):
+    """Tests filters that consist of two patterns."""
+
+    self.RunAndVerify('Foo*.*:*A*', [
+        'FooTest.Abc',
+        'FooTest.Xyz',
+
+        'BazTest.TestA',
+        ])
+
+    # An empty pattern + a non-empty one
+    self.RunAndVerify(':*A*', ['FooTest.Abc', 'BazTest.TestA'])
+
+  def testThreePatterns(self):
+    """Tests filters that consist of three patterns."""
+
+    self.RunAndVerify('*oo*:*A*:*One', [
+        'FooTest.Abc',
+        'FooTest.Xyz',
+
+        'BarTest.TestOne',
+
+        'BazTest.TestOne',
+        'BazTest.TestA',
+        ])
+
+    # The 2nd pattern is empty.
+    self.RunAndVerify('*oo*::*One', [
+        'FooTest.Abc',
+        'FooTest.Xyz',
+
+        'BarTest.TestOne',
+
+        'BazTest.TestOne',
+        ])
+
+    # The last 2 patterns are empty.
+    self.RunAndVerify('*oo*::', [
+        'FooTest.Abc',
+        'FooTest.Xyz',
+        ])
+
+  def testNegativeFilters(self):
+    self.RunAndVerify('*-BazTest.TestOne', [
+        'FooTest.Abc',
+        'FooTest.Xyz',
+
+        'BarTest.TestOne',
+        'BarTest.TestTwo',
+        'BarTest.TestThree',
+
+        'BazTest.TestA',
+        'BazTest.TestB',
+        ] + DEATH_TESTS + PARAM_TESTS)
+
+    self.RunAndVerify('*-FooTest.Abc:BazTest.*', [
+        'FooTest.Xyz',
+
+        'BarTest.TestOne',
+        'BarTest.TestTwo',
+        'BarTest.TestThree',
+        ] + DEATH_TESTS + PARAM_TESTS)
+
+    self.RunAndVerify('BarTest.*-BarTest.TestOne', [
+        'BarTest.TestTwo',
+        'BarTest.TestThree',
+        ])
+
+    # Tests without leading '*'.
+    self.RunAndVerify('-FooTest.Abc:FooTest.Xyz:BazTest.*', [
+        'BarTest.TestOne',
+        'BarTest.TestTwo',
+        'BarTest.TestThree',
+        ] + DEATH_TESTS + PARAM_TESTS)
+
+    # Value parameterized tests.
+    self.RunAndVerify('*/*', PARAM_TESTS)
+
+    # Value parameterized tests filtering by the sequence name.
+    self.RunAndVerify('SeqP/*', [
+        'SeqP/ParamTest.TestX/0',
+        'SeqP/ParamTest.TestX/1',
+        'SeqP/ParamTest.TestY/0',
+        'SeqP/ParamTest.TestY/1',
+        ])
+
+    # Value parameterized tests filtering by the test name.
+    self.RunAndVerify('*/0', [
+        'SeqP/ParamTest.TestX/0',
+        'SeqP/ParamTest.TestY/0',
+        'SeqQ/ParamTest.TestX/0',
+        'SeqQ/ParamTest.TestY/0',
+        ])
+
+  def testFlagOverridesEnvVar(self):
+    """Tests that the filter flag overrides the filtering env. variable."""
+
+    SetEnvVar(FILTER_ENV_VAR, 'Foo*')
+    args = ['--%s=%s' % (FILTER_FLAG, '*One')]
+    tests_run = RunAndExtractTestList(args)[0]
+    SetEnvVar(FILTER_ENV_VAR, None)
+
+    self.AssertSetEqual(tests_run, ['BarTest.TestOne', 'BazTest.TestOne'])
+
+  def testShardStatusFileIsCreated(self):
+    """Tests that the shard file is created if specified in the environment."""
+
+    shard_status_file = os.path.join(gtest_test_utils.GetTempDir(),
+                                     'shard_status_file')
+    self.assert_(not os.path.exists(shard_status_file))
+
+    extra_env = {SHARD_STATUS_FILE_ENV_VAR: shard_status_file}
+    try:
+      InvokeWithModifiedEnv(extra_env, RunAndReturnOutput)
+    finally:
+      self.assert_(os.path.exists(shard_status_file))
+      os.remove(shard_status_file)
+
+  def testShardStatusFileIsCreatedWithListTests(self):
+    """Tests that the shard file is created with the "list_tests" flag."""
+
+    shard_status_file = os.path.join(gtest_test_utils.GetTempDir(),
+                                     'shard_status_file2')
+    self.assert_(not os.path.exists(shard_status_file))
+
+    extra_env = {SHARD_STATUS_FILE_ENV_VAR: shard_status_file}
+    try:
+      output = InvokeWithModifiedEnv(extra_env,
+                                     RunAndReturnOutput,
+                                     [LIST_TESTS_FLAG])
+    finally:
+      # This assertion ensures that Google Test enumerated the tests as
+      # opposed to running them.
+      self.assert_('[==========]' not in output,
+                   'Unexpected output during test enumeration.\n'
+                   'Please ensure that LIST_TESTS_FLAG is assigned the\n'
+                   'correct flag value for listing Google Test tests.')
+
+      self.assert_(os.path.exists(shard_status_file))
+      os.remove(shard_status_file)
+
+  if SUPPORTS_DEATH_TESTS:
+    def testShardingWorksWithDeathTests(self):
+      """Tests integration with death tests and sharding."""
+
+      gtest_filter = 'HasDeathTest.*:SeqP/*'
+      expected_tests = [
+          'HasDeathTest.Test1',
+          'HasDeathTest.Test2',
+
+          'SeqP/ParamTest.TestX/0',
+          'SeqP/ParamTest.TestX/1',
+          'SeqP/ParamTest.TestY/0',
+          'SeqP/ParamTest.TestY/1',
+          ]
+
+      for flag in ['--gtest_death_test_style=threadsafe',
+                   '--gtest_death_test_style=fast']:
+        self.RunAndVerifyWithSharding(gtest_filter, 3, expected_tests,
+                                      check_exit_0=True, args=[flag])
+        self.RunAndVerifyWithSharding(gtest_filter, 5, expected_tests,
+                                      check_exit_0=True, args=[flag])
+
+if __name__ == '__main__':
+  gtest_test_utils.Main()
diff --git a/contrib/gtest-1.7.0/test/gtest_filter_unittest_.cc b/contrib/gtest-1.7.0/test/gtest_filter_unittest_.cc
new file mode 100644
index 0000000..77deffc
--- /dev/null
+++ b/contrib/gtest-1.7.0/test/gtest_filter_unittest_.cc
@@ -0,0 +1,140 @@
+// Copyright 2005, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+
+// Unit test for Google Test test filters.
+//
+// A user can specify which test(s) in a Google Test program to run via
+// either the GTEST_FILTER environment variable or the --gtest_filter
+// flag.  This is used for testing such functionality.
+//
+// The program will be invoked from a Python unit test.  Don't run it
+// directly.
+
+#include "gtest/gtest.h"
+
+namespace {
+
+// Test case FooTest.
+
+class FooTest : public testing::Test {
+};
+
+TEST_F(FooTest, Abc) {
+}
+
+TEST_F(FooTest, Xyz) {
+  FAIL() << "Expected failure.";
+}
+
+// Test case BarTest.
+
+TEST(BarTest, TestOne) {
+}
+
+TEST(BarTest, TestTwo) {
+}
+
+TEST(BarTest, TestThree) {
+}
+
+TEST(BarTest, DISABLED_TestFour) {
+  FAIL() << "Expected failure.";
+}
+
+TEST(BarTest, DISABLED_TestFive) {
+  FAIL() << "Expected failure.";
+}
+
+// Test case BazTest.
+
+TEST(BazTest, TestOne) {
+  FAIL() << "Expected failure.";
+}
+
+TEST(BazTest, TestA) {
+}
+
+TEST(BazTest, TestB) {
+}
+
+TEST(BazTest, DISABLED_TestC) {
+  FAIL() << "Expected failure.";
+}
+
+// Test case HasDeathTest
+
+TEST(HasDeathTest, Test1) {
+  EXPECT_DEATH_IF_SUPPORTED(exit(1), ".*");
+}
+
+// We need at least two death tests to make sure that the all death tests
+// aren't on the first shard.
+TEST(HasDeathTest, Test2) {
+  EXPECT_DEATH_IF_SUPPORTED(exit(1), ".*");
+}
+
+// Test case FoobarTest
+
+TEST(DISABLED_FoobarTest, Test1) {
+  FAIL() << "Expected failure.";
+}
+
+TEST(DISABLED_FoobarTest, DISABLED_Test2) {
+  FAIL() << "Expected failure.";
+}
+
+// Test case FoobarbazTest
+
+TEST(DISABLED_FoobarbazTest, TestA) {
+  FAIL() << "Expected failure.";
+}
+
+#if GTEST_HAS_PARAM_TEST
+class ParamTest : public testing::TestWithParam<int> {
+};
+
+TEST_P(ParamTest, TestX) {
+}
+
+TEST_P(ParamTest, TestY) {
+}
+
+INSTANTIATE_TEST_CASE_P(SeqP, ParamTest, testing::Values(1, 2));
+INSTANTIATE_TEST_CASE_P(SeqQ, ParamTest, testing::Values(5, 6));
+#endif  // GTEST_HAS_PARAM_TEST
+
+}  // namespace
+
+int main(int argc, char **argv) {
+  ::testing::InitGoogleTest(&argc, argv);
+
+  return RUN_ALL_TESTS();
+}
diff --git a/contrib/gtest-1.7.0/test/gtest_help_test.py b/contrib/gtest-1.7.0/test/gtest_help_test.py
new file mode 100755
index 0000000..093c838
--- /dev/null
+++ b/contrib/gtest-1.7.0/test/gtest_help_test.py
@@ -0,0 +1,172 @@
+#!/usr/bin/env python
+#
+# Copyright 2009, Google Inc.
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+#
+#     * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#     * Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following disclaimer
+# in the documentation and/or other materials provided with the
+# distribution.
+#     * Neither the name of Google Inc. nor the names of its
+# contributors may be used to endorse or promote products derived from
+# this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+"""Tests the --help flag of Google C++ Testing Framework.
+
+SYNOPSIS
+       gtest_help_test.py --build_dir=BUILD/DIR
+         # where BUILD/DIR contains the built gtest_help_test_ file.
+       gtest_help_test.py
+"""
+
+__author__ = 'wan at google.com (Zhanyong Wan)'
+
+import os
+import re
+import gtest_test_utils
+
+
+IS_LINUX = os.name == 'posix' and os.uname()[0] == 'Linux'
+IS_WINDOWS = os.name == 'nt'
+
+PROGRAM_PATH = gtest_test_utils.GetTestExecutablePath('gtest_help_test_')
+FLAG_PREFIX = '--gtest_'
+DEATH_TEST_STYLE_FLAG = FLAG_PREFIX + 'death_test_style'
+STREAM_RESULT_TO_FLAG = FLAG_PREFIX + 'stream_result_to'
+UNKNOWN_FLAG = FLAG_PREFIX + 'unknown_flag_for_testing'
+LIST_TESTS_FLAG = FLAG_PREFIX + 'list_tests'
+INCORRECT_FLAG_VARIANTS = [re.sub('^--', '-', LIST_TESTS_FLAG),
+                           re.sub('^--', '/', LIST_TESTS_FLAG),
+                           re.sub('_', '-', LIST_TESTS_FLAG)]
+INTERNAL_FLAG_FOR_TESTING = FLAG_PREFIX + 'internal_flag_for_testing'
+
+SUPPORTS_DEATH_TESTS = "DeathTest" in gtest_test_utils.Subprocess(
+    [PROGRAM_PATH, LIST_TESTS_FLAG]).output
+
+# The help message must match this regex.
+HELP_REGEX = re.compile(
+    FLAG_PREFIX + r'list_tests.*' +
+    FLAG_PREFIX + r'filter=.*' +
+    FLAG_PREFIX + r'also_run_disabled_tests.*' +
+    FLAG_PREFIX + r'repeat=.*' +
+    FLAG_PREFIX + r'shuffle.*' +
+    FLAG_PREFIX + r'random_seed=.*' +
+    FLAG_PREFIX + r'color=.*' +
+    FLAG_PREFIX + r'print_time.*' +
+    FLAG_PREFIX + r'output=.*' +
+    FLAG_PREFIX + r'break_on_failure.*' +
+    FLAG_PREFIX + r'throw_on_failure.*' +
+    FLAG_PREFIX + r'catch_exceptions=0.*',
+    re.DOTALL)
+
+
+def RunWithFlag(flag):
+  """Runs gtest_help_test_ with the given flag.
+
+  Returns:
+    the exit code and the text output as a tuple.
+  Args:
+    flag: the command-line flag to pass to gtest_help_test_, or None.
+  """
+
+  if flag is None:
+    command = [PROGRAM_PATH]
+  else:
+    command = [PROGRAM_PATH, flag]
+  child = gtest_test_utils.Subprocess(command)
+  return child.exit_code, child.output
+
+
+class GTestHelpTest(gtest_test_utils.TestCase):
+  """Tests the --help flag and its equivalent forms."""
+
+  def TestHelpFlag(self, flag):
+    """Verifies correct behavior when help flag is specified.
+
+    The right message must be printed and the tests must
+    skipped when the given flag is specified.
+
+    Args:
+      flag:  A flag to pass to the binary or None.
+    """
+
+    exit_code, output = RunWithFlag(flag)
+    self.assertEquals(0, exit_code)
+    self.assert_(HELP_REGEX.search(output), output)
+
+    if IS_LINUX:
+      self.assert_(STREAM_RESULT_TO_FLAG in output, output)
+    else:
+      self.assert_(STREAM_RESULT_TO_FLAG not in output, output)
+
+    if SUPPORTS_DEATH_TESTS and not IS_WINDOWS:
+      self.assert_(DEATH_TEST_STYLE_FLAG in output, output)
+    else:
+      self.assert_(DEATH_TEST_STYLE_FLAG not in output, output)
+
+  def TestNonHelpFlag(self, flag):
+    """Verifies correct behavior when no help flag is specified.
+
+    Verifies that when no help flag is specified, the tests are run
+    and the help message is not printed.
+
+    Args:
+      flag:  A flag to pass to the binary or None.
+    """
+
+    exit_code, output = RunWithFlag(flag)
+    self.assert_(exit_code != 0)
+    self.assert_(not HELP_REGEX.search(output), output)
+
+  def testPrintsHelpWithFullFlag(self):
+    self.TestHelpFlag('--help')
+
+  def testPrintsHelpWithShortFlag(self):
+    self.TestHelpFlag('-h')
+
+  def testPrintsHelpWithQuestionFlag(self):
+    self.TestHelpFlag('-?')
+
+  def testPrintsHelpWithWindowsStyleQuestionFlag(self):
+    self.TestHelpFlag('/?')
+
+  def testPrintsHelpWithUnrecognizedGoogleTestFlag(self):
+    self.TestHelpFlag(UNKNOWN_FLAG)
+
+  def testPrintsHelpWithIncorrectFlagStyle(self):
+    for incorrect_flag in INCORRECT_FLAG_VARIANTS:
+      self.TestHelpFlag(incorrect_flag)
+
+  def testRunsTestsWithoutHelpFlag(self):
+    """Verifies that when no help flag is specified, the tests are run
+    and the help message is not printed."""
+
+    self.TestNonHelpFlag(None)
+
+  def testRunsTestsWithGtestInternalFlag(self):
+    """Verifies that the tests are run and no help message is printed when
+    a flag starting with Google Test prefix and 'internal_' is supplied."""
+
+    self.TestNonHelpFlag(INTERNAL_FLAG_FOR_TESTING)
+
+
+if __name__ == '__main__':
+  gtest_test_utils.Main()
diff --git a/contrib/gtest-1.7.0/test/gtest_help_test_.cc b/contrib/gtest-1.7.0/test/gtest_help_test_.cc
new file mode 100644
index 0000000..31f78c2
--- /dev/null
+++ b/contrib/gtest-1.7.0/test/gtest_help_test_.cc
@@ -0,0 +1,46 @@
+// Copyright 2009, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+
+// This program is meant to be run by gtest_help_test.py.  Do not run
+// it directly.
+
+#include "gtest/gtest.h"
+
+// When a help flag is specified, this program should skip the tests
+// and exit with 0; otherwise the following test will be executed,
+// causing this program to exit with a non-zero code.
+TEST(HelpFlagTest, ShouldNotBeRun) {
+  ASSERT_TRUE(false) << "Tests shouldn't be run when --help is specified.";
+}
+
+#if GTEST_HAS_DEATH_TEST
+TEST(DeathTest, UsedByPythonScriptToDetectSupportForDeathTestsInThisBinary) {}
+#endif
diff --git a/contrib/gtest-1.7.0/test/gtest_list_tests_unittest.py b/contrib/gtest-1.7.0/test/gtest_list_tests_unittest.py
new file mode 100755
index 0000000..925b09d
--- /dev/null
+++ b/contrib/gtest-1.7.0/test/gtest_list_tests_unittest.py
@@ -0,0 +1,207 @@
+#!/usr/bin/env python
+#
+# Copyright 2006, Google Inc.
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+#
+#     * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#     * Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following disclaimer
+# in the documentation and/or other materials provided with the
+# distribution.
+#     * Neither the name of Google Inc. nor the names of its
+# contributors may be used to endorse or promote products derived from
+# this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+"""Unit test for Google Test's --gtest_list_tests flag.
+
+A user can ask Google Test to list all tests by specifying the
+--gtest_list_tests flag.  This script tests such functionality
+by invoking gtest_list_tests_unittest_ (a program written with
+Google Test) the command line flags.
+"""
+
+__author__ = 'phanna at google.com (Patrick Hanna)'
+
+import gtest_test_utils
+import re
+
+
+# Constants.
+
+# The command line flag for enabling/disabling listing all tests.
+LIST_TESTS_FLAG = 'gtest_list_tests'
+
+# Path to the gtest_list_tests_unittest_ program.
+EXE_PATH = gtest_test_utils.GetTestExecutablePath('gtest_list_tests_unittest_')
+
+# The expected output when running gtest_list_tests_unittest_ with
+# --gtest_list_tests
+EXPECTED_OUTPUT_NO_FILTER_RE = re.compile(r"""FooDeathTest\.
+  Test1
+Foo\.
+  Bar1
+  Bar2
+  DISABLED_Bar3
+Abc\.
+  Xyz
+  Def
+FooBar\.
+  Baz
+FooTest\.
+  Test1
+  DISABLED_Test2
+  Test3
+TypedTest/0\.  # TypeParam = (VeryLo{245}|class VeryLo{239})\.\.\.
+  TestA
+  TestB
+TypedTest/1\.  # TypeParam = int\s*\*
+  TestA
+  TestB
+TypedTest/2\.  # TypeParam = .*MyArray<bool,\s*42>
+  TestA
+  TestB
+My/TypeParamTest/0\.  # TypeParam = (VeryLo{245}|class VeryLo{239})\.\.\.
+  TestA
+  TestB
+My/TypeParamTest/1\.  # TypeParam = int\s*\*
+  TestA
+  TestB
+My/TypeParamTest/2\.  # TypeParam = .*MyArray<bool,\s*42>
+  TestA
+  TestB
+MyInstantiation/ValueParamTest\.
+  TestA/0  # GetParam\(\) = one line
+  TestA/1  # GetParam\(\) = two\\nlines
+  TestA/2  # GetParam\(\) = a very\\nlo{241}\.\.\.
+  TestB/0  # GetParam\(\) = one line
+  TestB/1  # GetParam\(\) = two\\nlines
+  TestB/2  # GetParam\(\) = a very\\nlo{241}\.\.\.
+""")
+
+# The expected output when running gtest_list_tests_unittest_ with
+# --gtest_list_tests and --gtest_filter=Foo*.
+EXPECTED_OUTPUT_FILTER_FOO_RE = re.compile(r"""FooDeathTest\.
+  Test1
+Foo\.
+  Bar1
+  Bar2
+  DISABLED_Bar3
+FooBar\.
+  Baz
+FooTest\.
+  Test1
+  DISABLED_Test2
+  Test3
+""")
+
+# Utilities.
+
+
+def Run(args):
+  """Runs gtest_list_tests_unittest_ and returns the list of tests printed."""
+
+  return gtest_test_utils.Subprocess([EXE_PATH] + args,
+                                     capture_stderr=False).output
+
+
+# The unit test.
+
+class GTestListTestsUnitTest(gtest_test_utils.TestCase):
+  """Tests using the --gtest_list_tests flag to list all tests."""
+
+  def RunAndVerify(self, flag_value, expected_output_re, other_flag):
+    """Runs gtest_list_tests_unittest_ and verifies that it prints
+    the correct tests.
+
+    Args:
+      flag_value:         value of the --gtest_list_tests flag;
+                          None if the flag should not be present.
+      expected_output_re: regular expression that matches the expected
+                          output after running command;
+      other_flag:         a different flag to be passed to command
+                          along with gtest_list_tests;
+                          None if the flag should not be present.
+    """
+
+    if flag_value is None:
+      flag = ''
+      flag_expression = 'not set'
+    elif flag_value == '0':
+      flag = '--%s=0' % LIST_TESTS_FLAG
+      flag_expression = '0'
+    else:
+      flag = '--%s' % LIST_TESTS_FLAG
+      flag_expression = '1'
+
+    args = [flag]
+
+    if other_flag is not None:
+      args += [other_flag]
+
+    output = Run(args)
+
+    if expected_output_re:
+      self.assert_(
+          expected_output_re.match(output),
+          ('when %s is %s, the output of "%s" is "%s",\n'
+           'which does not match regex "%s"' %
+           (LIST_TESTS_FLAG, flag_expression, ' '.join(args), output,
+            expected_output_re.pattern)))
+    else:
+      self.assert_(
+          not EXPECTED_OUTPUT_NO_FILTER_RE.match(output),
+          ('when %s is %s, the output of "%s" is "%s"'%
+           (LIST_TESTS_FLAG, flag_expression, ' '.join(args), output)))
+
+  def testDefaultBehavior(self):
+    """Tests the behavior of the default mode."""
+
+    self.RunAndVerify(flag_value=None,
+                      expected_output_re=None,
+                      other_flag=None)
+
+  def testFlag(self):
+    """Tests using the --gtest_list_tests flag."""
+
+    self.RunAndVerify(flag_value='0',
+                      expected_output_re=None,
+                      other_flag=None)
+    self.RunAndVerify(flag_value='1',
+                      expected_output_re=EXPECTED_OUTPUT_NO_FILTER_RE,
+                      other_flag=None)
+
+  def testOverrideNonFilterFlags(self):
+    """Tests that --gtest_list_tests overrides the non-filter flags."""
+
+    self.RunAndVerify(flag_value='1',
+                      expected_output_re=EXPECTED_OUTPUT_NO_FILTER_RE,
+                      other_flag='--gtest_break_on_failure')
+
+  def testWithFilterFlags(self):
+    """Tests that --gtest_list_tests takes into account the
+    --gtest_filter flag."""
+
+    self.RunAndVerify(flag_value='1',
+                      expected_output_re=EXPECTED_OUTPUT_FILTER_FOO_RE,
+                      other_flag='--gtest_filter=Foo*')
+
+
+if __name__ == '__main__':
+  gtest_test_utils.Main()
diff --git a/contrib/gtest-1.7.0/test/gtest_list_tests_unittest_.cc b/contrib/gtest-1.7.0/test/gtest_list_tests_unittest_.cc
new file mode 100644
index 0000000..907c176
--- /dev/null
+++ b/contrib/gtest-1.7.0/test/gtest_list_tests_unittest_.cc
@@ -0,0 +1,157 @@
+// Copyright 2006, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: phanna at google.com (Patrick Hanna)
+
+// Unit test for Google Test's --gtest_list_tests flag.
+//
+// A user can ask Google Test to list all tests that will run
+// so that when using a filter, a user will know what
+// tests to look for. The tests will not be run after listing.
+//
+// This program will be invoked from a Python unit test.
+// Don't run it directly.
+
+#include "gtest/gtest.h"
+
+// Several different test cases and tests that will be listed.
+TEST(Foo, Bar1) {
+}
+
+TEST(Foo, Bar2) {
+}
+
+TEST(Foo, DISABLED_Bar3) {
+}
+
+TEST(Abc, Xyz) {
+}
+
+TEST(Abc, Def) {
+}
+
+TEST(FooBar, Baz) {
+}
+
+class FooTest : public testing::Test {
+};
+
+TEST_F(FooTest, Test1) {
+}
+
+TEST_F(FooTest, DISABLED_Test2) {
+}
+
+TEST_F(FooTest, Test3) {
+}
+
+TEST(FooDeathTest, Test1) {
+}
+
+// A group of value-parameterized tests.
+
+class MyType {
+ public:
+  explicit MyType(const std::string& a_value) : value_(a_value) {}
+
+  const std::string& value() const { return value_; }
+
+ private:
+  std::string value_;
+};
+
+// Teaches Google Test how to print a MyType.
+void PrintTo(const MyType& x, std::ostream* os) {
+  *os << x.value();
+}
+
+class ValueParamTest : public testing::TestWithParam<MyType> {
+};
+
+TEST_P(ValueParamTest, TestA) {
+}
+
+TEST_P(ValueParamTest, TestB) {
+}
+
+INSTANTIATE_TEST_CASE_P(
+    MyInstantiation, ValueParamTest,
+    testing::Values(MyType("one line"),
+                    MyType("two\nlines"),
+                    MyType("a very\nloooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong line")));  // NOLINT
+
+// A group of typed tests.
+
+// A deliberately long type name for testing the line-truncating
+// behavior when printing a type parameter.
+class VeryLoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooogName {  // NOLINT
+};
+
+template <typename T>
+class TypedTest : public testing::Test {
+};
+
+template <typename T, int kSize>
+class MyArray {
+};
+
+typedef testing::Types<VeryLoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooogName,  // NOLINT
+                       int*, MyArray<bool, 42> > MyTypes;
+
+TYPED_TEST_CASE(TypedTest, MyTypes);
+
+TYPED_TEST(TypedTest, TestA) {
+}
+
+TYPED_TEST(TypedTest, TestB) {
+}
+
+// A group of type-parameterized tests.
+
+template <typename T>
+class TypeParamTest : public testing::Test {
+};
+
+TYPED_TEST_CASE_P(TypeParamTest);
+
+TYPED_TEST_P(TypeParamTest, TestA) {
+}
+
+TYPED_TEST_P(TypeParamTest, TestB) {
+}
+
+REGISTER_TYPED_TEST_CASE_P(TypeParamTest, TestA, TestB);
+
+INSTANTIATE_TYPED_TEST_CASE_P(My, TypeParamTest, MyTypes);
+
+int main(int argc, char **argv) {
+  ::testing::InitGoogleTest(&argc, argv);
+
+  return RUN_ALL_TESTS();
+}
diff --git a/contrib/gtest-1.7.0/test/gtest_main_unittest.cc b/contrib/gtest-1.7.0/test/gtest_main_unittest.cc
new file mode 100644
index 0000000..ecd9bb8
--- /dev/null
+++ b/contrib/gtest-1.7.0/test/gtest_main_unittest.cc
@@ -0,0 +1,45 @@
+// Copyright 2006, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+
+#include "gtest/gtest.h"
+
+// Tests that we don't have to define main() when we link to
+// gtest_main instead of gtest.
+
+namespace {
+
+TEST(GTestMainTest, ShouldSucceed) {
+}
+
+}  // namespace
+
+// We are using the main() function defined in src/gtest_main.cc, so
+// we don't define it here.
diff --git a/contrib/gtest-1.7.0/test/gtest_no_test_unittest.cc b/contrib/gtest-1.7.0/test/gtest_no_test_unittest.cc
new file mode 100644
index 0000000..292599a
--- /dev/null
+++ b/contrib/gtest-1.7.0/test/gtest_no_test_unittest.cc
@@ -0,0 +1,56 @@
+// Copyright 2006, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+// Tests that a Google Test program that has no test defined can run
+// successfully.
+//
+// Author: wan at google.com (Zhanyong Wan)
+
+#include "gtest/gtest.h"
+
+int main(int argc, char **argv) {
+  testing::InitGoogleTest(&argc, argv);
+
+  // An ad-hoc assertion outside of all tests.
+  //
+  // This serves three purposes:
+  //
+  // 1. It verifies that an ad-hoc assertion can be executed even if
+  //    no test is defined.
+  // 2. It verifies that a failed ad-hoc assertion causes the test
+  //    program to fail.
+  // 3. We had a bug where the XML output won't be generated if an
+  //    assertion is executed before RUN_ALL_TESTS() is called, even
+  //    though --gtest_output=xml is specified.  This makes sure the
+  //    bug is fixed and doesn't regress.
+  EXPECT_EQ(1, 2);
+
+  // The above EXPECT_EQ() should cause RUN_ALL_TESTS() to return non-zero.
+  return RUN_ALL_TESTS() ? 0 : 1;
+}
diff --git a/contrib/gtest-1.7.0/test/gtest_output_test.py b/contrib/gtest-1.7.0/test/gtest_output_test.py
new file mode 100755
index 0000000..f409e2a
--- /dev/null
+++ b/contrib/gtest-1.7.0/test/gtest_output_test.py
@@ -0,0 +1,335 @@
+#!/usr/bin/env python
+#
+# Copyright 2008, Google Inc.
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+#
+#     * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#     * Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following disclaimer
+# in the documentation and/or other materials provided with the
+# distribution.
+#     * Neither the name of Google Inc. nor the names of its
+# contributors may be used to endorse or promote products derived from
+# this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+"""Tests the text output of Google C++ Testing Framework.
+
+SYNOPSIS
+       gtest_output_test.py --build_dir=BUILD/DIR --gengolden
+         # where BUILD/DIR contains the built gtest_output_test_ file.
+       gtest_output_test.py --gengolden
+       gtest_output_test.py
+"""
+
+__author__ = 'wan at google.com (Zhanyong Wan)'
+
+import os
+import re
+import sys
+import gtest_test_utils
+
+
+# The flag for generating the golden file
+GENGOLDEN_FLAG = '--gengolden'
+CATCH_EXCEPTIONS_ENV_VAR_NAME = 'GTEST_CATCH_EXCEPTIONS'
+
+IS_WINDOWS = os.name == 'nt'
+
+# TODO(vladl at google.com): remove the _lin suffix.
+GOLDEN_NAME = 'gtest_output_test_golden_lin.txt'
+
+PROGRAM_PATH = gtest_test_utils.GetTestExecutablePath('gtest_output_test_')
+
+# At least one command we exercise must not have the
+# --gtest_internal_skip_environment_and_ad_hoc_tests flag.
+COMMAND_LIST_TESTS = ({}, [PROGRAM_PATH, '--gtest_list_tests'])
+COMMAND_WITH_COLOR = ({}, [PROGRAM_PATH, '--gtest_color=yes'])
+COMMAND_WITH_TIME = ({}, [PROGRAM_PATH,
+                          '--gtest_print_time',
+                          '--gtest_internal_skip_environment_and_ad_hoc_tests',
+                          '--gtest_filter=FatalFailureTest.*:LoggingTest.*'])
+COMMAND_WITH_DISABLED = (
+    {}, [PROGRAM_PATH,
+         '--gtest_also_run_disabled_tests',
+         '--gtest_internal_skip_environment_and_ad_hoc_tests',
+         '--gtest_filter=*DISABLED_*'])
+COMMAND_WITH_SHARDING = (
+    {'GTEST_SHARD_INDEX': '1', 'GTEST_TOTAL_SHARDS': '2'},
+    [PROGRAM_PATH,
+     '--gtest_internal_skip_environment_and_ad_hoc_tests',
+     '--gtest_filter=PassingTest.*'])
+
+GOLDEN_PATH = os.path.join(gtest_test_utils.GetSourceDir(), GOLDEN_NAME)
+
+
+def ToUnixLineEnding(s):
+  """Changes all Windows/Mac line endings in s to UNIX line endings."""
+
+  return s.replace('\r\n', '\n').replace('\r', '\n')
+
+
+def RemoveLocations(test_output):
+  """Removes all file location info from a Google Test program's output.
+
+  Args:
+       test_output:  the output of a Google Test program.
+
+  Returns:
+       output with all file location info (in the form of
+       'DIRECTORY/FILE_NAME:LINE_NUMBER: 'or
+       'DIRECTORY\\FILE_NAME(LINE_NUMBER): ') replaced by
+       'FILE_NAME:#: '.
+  """
+
+  return re.sub(r'.*[/\\](.+)(\:\d+|\(\d+\))\: ', r'\1:#: ', test_output)
+
+
+def RemoveStackTraceDetails(output):
+  """Removes all stack traces from a Google Test program's output."""
+
+  # *? means "find the shortest string that matches".
+  return re.sub(r'Stack trace:(.|\n)*?\n\n',
+                'Stack trace: (omitted)\n\n', output)
+
+
+def RemoveStackTraces(output):
+  """Removes all traces of stack traces from a Google Test program's output."""
+
+  # *? means "find the shortest string that matches".
+  return re.sub(r'Stack trace:(.|\n)*?\n\n', '', output)
+
+
+def RemoveTime(output):
+  """Removes all time information from a Google Test program's output."""
+
+  return re.sub(r'\(\d+ ms', '(? ms', output)
+
+
+def RemoveTypeInfoDetails(test_output):
+  """Removes compiler-specific type info from Google Test program's output.
+
+  Args:
+       test_output:  the output of a Google Test program.
+
+  Returns:
+       output with type information normalized to canonical form.
+  """
+
+  # some compilers output the name of type 'unsigned int' as 'unsigned'
+  return re.sub(r'unsigned int', 'unsigned', test_output)
+
+
+def NormalizeToCurrentPlatform(test_output):
+  """Normalizes platform specific output details for easier comparison."""
+
+  if IS_WINDOWS:
+    # Removes the color information that is not present on Windows.
+    test_output = re.sub('\x1b\\[(0;3\d)?m', '', test_output)
+    # Changes failure message headers into the Windows format.
+    test_output = re.sub(r': Failure\n', r': error: ', test_output)
+    # Changes file(line_number) to file:line_number.
+    test_output = re.sub(r'((\w|\.)+)\((\d+)\):', r'\1:\3:', test_output)
+
+  return test_output
+
+
+def RemoveTestCounts(output):
+  """Removes test counts from a Google Test program's output."""
+
+  output = re.sub(r'\d+ tests?, listed below',
+                  '? tests, listed below', output)
+  output = re.sub(r'\d+ FAILED TESTS',
+                  '? FAILED TESTS', output)
+  output = re.sub(r'\d+ tests? from \d+ test cases?',
+                  '? tests from ? test cases', output)
+  output = re.sub(r'\d+ tests? from ([a-zA-Z_])',
+                  r'? tests from \1', output)
+  return re.sub(r'\d+ tests?\.', '? tests.', output)
+
+
+def RemoveMatchingTests(test_output, pattern):
+  """Removes output of specified tests from a Google Test program's output.
+
+  This function strips not only the beginning and the end of a test but also
+  all output in between.
+
+  Args:
+    test_output:       A string containing the test output.
+    pattern:           A regex string that matches names of test cases or
+                       tests to remove.
+
+  Returns:
+    Contents of test_output with tests whose names match pattern removed.
+  """
+
+  test_output = re.sub(
+      r'.*\[ RUN      \] .*%s(.|\n)*?\[(  FAILED  |       OK )\] .*%s.*\n' % (
+          pattern, pattern),
+      '',
+      test_output)
+  return re.sub(r'.*%s.*\n' % pattern, '', test_output)
+
+
+def NormalizeOutput(output):
+  """Normalizes output (the output of gtest_output_test_.exe)."""
+
+  output = ToUnixLineEnding(output)
+  output = RemoveLocations(output)
+  output = RemoveStackTraceDetails(output)
+  output = RemoveTime(output)
+  return output
+
+
+def GetShellCommandOutput(env_cmd):
+  """Runs a command in a sub-process, and returns its output in a string.
+
+  Args:
+    env_cmd: The shell command. A 2-tuple where element 0 is a dict of extra
+             environment variables to set, and element 1 is a string with
+             the command and any flags.
+
+  Returns:
+    A string with the command's combined standard and diagnostic output.
+  """
+
+  # Spawns cmd in a sub-process, and gets its standard I/O file objects.
+  # Set and save the environment properly.
+  environ = os.environ.copy()
+  environ.update(env_cmd[0])
+  p = gtest_test_utils.Subprocess(env_cmd[1], env=environ)
+
+  return p.output
+
+
+def GetCommandOutput(env_cmd):
+  """Runs a command and returns its output with all file location
+  info stripped off.
+
+  Args:
+    env_cmd:  The shell command. A 2-tuple where element 0 is a dict of extra
+              environment variables to set, and element 1 is a string with
+              the command and any flags.
+  """
+
+  # Disables exception pop-ups on Windows.
+  environ, cmdline = env_cmd
+  environ = dict(environ)  # Ensures we are modifying a copy.
+  environ[CATCH_EXCEPTIONS_ENV_VAR_NAME] = '1'
+  return NormalizeOutput(GetShellCommandOutput((environ, cmdline)))
+
+
+def GetOutputOfAllCommands():
+  """Returns concatenated output from several representative commands."""
+
+  return (GetCommandOutput(COMMAND_WITH_COLOR) +
+          GetCommandOutput(COMMAND_WITH_TIME) +
+          GetCommandOutput(COMMAND_WITH_DISABLED) +
+          GetCommandOutput(COMMAND_WITH_SHARDING))
+
+
+test_list = GetShellCommandOutput(COMMAND_LIST_TESTS)
+SUPPORTS_DEATH_TESTS = 'DeathTest' in test_list
+SUPPORTS_TYPED_TESTS = 'TypedTest' in test_list
+SUPPORTS_THREADS = 'ExpectFailureWithThreadsTest' in test_list
+SUPPORTS_STACK_TRACES = False
+
+CAN_GENERATE_GOLDEN_FILE = (SUPPORTS_DEATH_TESTS and
+                            SUPPORTS_TYPED_TESTS and
+                            SUPPORTS_THREADS)
+
+
+class GTestOutputTest(gtest_test_utils.TestCase):
+  def RemoveUnsupportedTests(self, test_output):
+    if not SUPPORTS_DEATH_TESTS:
+      test_output = RemoveMatchingTests(test_output, 'DeathTest')
+    if not SUPPORTS_TYPED_TESTS:
+      test_output = RemoveMatchingTests(test_output, 'TypedTest')
+      test_output = RemoveMatchingTests(test_output, 'TypedDeathTest')
+      test_output = RemoveMatchingTests(test_output, 'TypeParamDeathTest')
+    if not SUPPORTS_THREADS:
+      test_output = RemoveMatchingTests(test_output,
+                                        'ExpectFailureWithThreadsTest')
+      test_output = RemoveMatchingTests(test_output,
+                                        'ScopedFakeTestPartResultReporterTest')
+      test_output = RemoveMatchingTests(test_output,
+                                        'WorksConcurrently')
+    if not SUPPORTS_STACK_TRACES:
+      test_output = RemoveStackTraces(test_output)
+
+    return test_output
+
+  def testOutput(self):
+    output = GetOutputOfAllCommands()
+
+    golden_file = open(GOLDEN_PATH, 'rb')
+    # A mis-configured source control system can cause \r appear in EOL
+    # sequences when we read the golden file irrespective of an operating
+    # system used. Therefore, we need to strip those \r's from newlines
+    # unconditionally.
+    golden = ToUnixLineEnding(golden_file.read())
+    golden_file.close()
+
+    # We want the test to pass regardless of certain features being
+    # supported or not.
+
+    # We still have to remove type name specifics in all cases.
+    normalized_actual = RemoveTypeInfoDetails(output)
+    normalized_golden = RemoveTypeInfoDetails(golden)
+
+    if CAN_GENERATE_GOLDEN_FILE:
+      self.assertEqual(normalized_golden, normalized_actual)
+    else:
+      normalized_actual = NormalizeToCurrentPlatform(
+          RemoveTestCounts(normalized_actual))
+      normalized_golden = NormalizeToCurrentPlatform(
+          RemoveTestCounts(self.RemoveUnsupportedTests(normalized_golden)))
+
+      # This code is very handy when debugging golden file differences:
+      if os.getenv('DEBUG_GTEST_OUTPUT_TEST'):
+        open(os.path.join(
+            gtest_test_utils.GetSourceDir(),
+            '_gtest_output_test_normalized_actual.txt'), 'wb').write(
+                normalized_actual)
+        open(os.path.join(
+            gtest_test_utils.GetSourceDir(),
+            '_gtest_output_test_normalized_golden.txt'), 'wb').write(
+                normalized_golden)
+
+      self.assertEqual(normalized_golden, normalized_actual)
+
+
+if __name__ == '__main__':
+  if sys.argv[1:] == [GENGOLDEN_FLAG]:
+    if CAN_GENERATE_GOLDEN_FILE:
+      output = GetOutputOfAllCommands()
+      golden_file = open(GOLDEN_PATH, 'wb')
+      golden_file.write(output)
+      golden_file.close()
+    else:
+      message = (
+          """Unable to write a golden file when compiled in an environment
+that does not support all the required features (death tests, typed tests,
+and multiple threads).  Please generate the golden file using a binary built
+with those features enabled.""")
+
+      sys.stderr.write(message)
+      sys.exit(1)
+  else:
+    gtest_test_utils.Main()
diff --git a/contrib/gtest-1.7.0/test/gtest_output_test_.cc b/contrib/gtest-1.7.0/test/gtest_output_test_.cc
new file mode 100644
index 0000000..07ab633
--- /dev/null
+++ b/contrib/gtest-1.7.0/test/gtest_output_test_.cc
@@ -0,0 +1,1034 @@
+// Copyright 2005, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// The purpose of this file is to generate Google Test output under
+// various conditions.  The output will then be verified by
+// gtest_output_test.py to ensure that Google Test generates the
+// desired messages.  Therefore, most tests in this file are MEANT TO
+// FAIL.
+//
+// Author: wan at google.com (Zhanyong Wan)
+
+#include "gtest/gtest-spi.h"
+#include "gtest/gtest.h"
+
+// Indicates that this translation unit is part of Google Test's
+// implementation.  It must come before gtest-internal-inl.h is
+// included, or there will be a compiler error.  This trick is to
+// prevent a user from accidentally including gtest-internal-inl.h in
+// his code.
+#define GTEST_IMPLEMENTATION_ 1
+#include "src/gtest-internal-inl.h"
+#undef GTEST_IMPLEMENTATION_
+
+#include <stdlib.h>
+
+#if GTEST_IS_THREADSAFE
+using testing::ScopedFakeTestPartResultReporter;
+using testing::TestPartResultArray;
+
+using testing::internal::Notification;
+using testing::internal::ThreadWithParam;
+#endif
+
+namespace posix = ::testing::internal::posix;
+using testing::internal::scoped_ptr;
+
+// Tests catching fatal failures.
+
+// A subroutine used by the following test.
+void TestEq1(int x) {
+  ASSERT_EQ(1, x);
+}
+
+// This function calls a test subroutine, catches the fatal failure it
+// generates, and then returns early.
+void TryTestSubroutine() {
+  // Calls a subrountine that yields a fatal failure.
+  TestEq1(2);
+
+  // Catches the fatal failure and aborts the test.
+  //
+  // The testing::Test:: prefix is necessary when calling
+  // HasFatalFailure() outside of a TEST, TEST_F, or test fixture.
+  if (testing::Test::HasFatalFailure()) return;
+
+  // If we get here, something is wrong.
+  FAIL() << "This should never be reached.";
+}
+
+TEST(PassingTest, PassingTest1) {
+}
+
+TEST(PassingTest, PassingTest2) {
+}
+
+// Tests that parameters of failing parameterized tests are printed in the
+// failing test summary.
+class FailingParamTest : public testing::TestWithParam<int> {};
+
+TEST_P(FailingParamTest, Fails) {
+  EXPECT_EQ(1, GetParam());
+}
+
+// This generates a test which will fail. Google Test is expected to print
+// its parameter when it outputs the list of all failed tests.
+INSTANTIATE_TEST_CASE_P(PrintingFailingParams,
+                        FailingParamTest,
+                        testing::Values(2));
+
+static const char kGoldenString[] = "\"Line\0 1\"\nLine 2";
+
+TEST(NonfatalFailureTest, EscapesStringOperands) {
+  std::string actual = "actual \"string\"";
+  EXPECT_EQ(kGoldenString, actual);
+
+  const char* golden = kGoldenString;
+  EXPECT_EQ(golden, actual);
+}
+
+// Tests catching a fatal failure in a subroutine.
+TEST(FatalFailureTest, FatalFailureInSubroutine) {
+  printf("(expecting a failure that x should be 1)\n");
+
+  TryTestSubroutine();
+}
+
+// Tests catching a fatal failure in a nested subroutine.
+TEST(FatalFailureTest, FatalFailureInNestedSubroutine) {
+  printf("(expecting a failure that x should be 1)\n");
+
+  // Calls a subrountine that yields a fatal failure.
+  TryTestSubroutine();
+
+  // Catches the fatal failure and aborts the test.
+  //
+  // When calling HasFatalFailure() inside a TEST, TEST_F, or test
+  // fixture, the testing::Test:: prefix is not needed.
+  if (HasFatalFailure()) return;
+
+  // If we get here, something is wrong.
+  FAIL() << "This should never be reached.";
+}
+
+// Tests HasFatalFailure() after a failed EXPECT check.
+TEST(FatalFailureTest, NonfatalFailureInSubroutine) {
+  printf("(expecting a failure on false)\n");
+  EXPECT_TRUE(false);  // Generates a nonfatal failure
+  ASSERT_FALSE(HasFatalFailure());  // This should succeed.
+}
+
+// Tests interleaving user logging and Google Test assertions.
+TEST(LoggingTest, InterleavingLoggingAndAssertions) {
+  static const int a[4] = {
+    3, 9, 2, 6
+  };
+
+  printf("(expecting 2 failures on (3) >= (a[i]))\n");
+  for (int i = 0; i < static_cast<int>(sizeof(a)/sizeof(*a)); i++) {
+    printf("i == %d\n", i);
+    EXPECT_GE(3, a[i]);
+  }
+}
+
+// Tests the SCOPED_TRACE macro.
+
+// A helper function for testing SCOPED_TRACE.
+void SubWithoutTrace(int n) {
+  EXPECT_EQ(1, n);
+  ASSERT_EQ(2, n);
+}
+
+// Another helper function for testing SCOPED_TRACE.
+void SubWithTrace(int n) {
+  SCOPED_TRACE(testing::Message() << "n = " << n);
+
+  SubWithoutTrace(n);
+}
+
+// Tests that SCOPED_TRACE() obeys lexical scopes.
+TEST(SCOPED_TRACETest, ObeysScopes) {
+  printf("(expected to fail)\n");
+
+  // There should be no trace before SCOPED_TRACE() is invoked.
+  ADD_FAILURE() << "This failure is expected, and shouldn't have a trace.";
+
+  {
+    SCOPED_TRACE("Expected trace");
+    // After SCOPED_TRACE(), a failure in the current scope should contain
+    // the trace.
+    ADD_FAILURE() << "This failure is expected, and should have a trace.";
+  }
+
+  // Once the control leaves the scope of the SCOPED_TRACE(), there
+  // should be no trace again.
+  ADD_FAILURE() << "This failure is expected, and shouldn't have a trace.";
+}
+
+// Tests that SCOPED_TRACE works inside a loop.
+TEST(SCOPED_TRACETest, WorksInLoop) {
+  printf("(expected to fail)\n");
+
+  for (int i = 1; i <= 2; i++) {
+    SCOPED_TRACE(testing::Message() << "i = " << i);
+
+    SubWithoutTrace(i);
+  }
+}
+
+// Tests that SCOPED_TRACE works in a subroutine.
+TEST(SCOPED_TRACETest, WorksInSubroutine) {
+  printf("(expected to fail)\n");
+
+  SubWithTrace(1);
+  SubWithTrace(2);
+}
+
+// Tests that SCOPED_TRACE can be nested.
+TEST(SCOPED_TRACETest, CanBeNested) {
+  printf("(expected to fail)\n");
+
+  SCOPED_TRACE("");  // A trace without a message.
+
+  SubWithTrace(2);
+}
+
+// Tests that multiple SCOPED_TRACEs can be used in the same scope.
+TEST(SCOPED_TRACETest, CanBeRepeated) {
+  printf("(expected to fail)\n");
+
+  SCOPED_TRACE("A");
+  ADD_FAILURE()
+      << "This failure is expected, and should contain trace point A.";
+
+  SCOPED_TRACE("B");
+  ADD_FAILURE()
+      << "This failure is expected, and should contain trace point A and B.";
+
+  {
+    SCOPED_TRACE("C");
+    ADD_FAILURE() << "This failure is expected, and should "
+                  << "contain trace point A, B, and C.";
+  }
+
+  SCOPED_TRACE("D");
+  ADD_FAILURE() << "This failure is expected, and should "
+                << "contain trace point A, B, and D.";
+}
+
+#if GTEST_IS_THREADSAFE
+// Tests that SCOPED_TRACE()s can be used concurrently from multiple
+// threads.  Namely, an assertion should be affected by
+// SCOPED_TRACE()s in its own thread only.
+
+// Here's the sequence of actions that happen in the test:
+//
+//   Thread A (main)                | Thread B (spawned)
+//   ===============================|================================
+//   spawns thread B                |
+//   -------------------------------+--------------------------------
+//   waits for n1                   | SCOPED_TRACE("Trace B");
+//                                  | generates failure #1
+//                                  | notifies n1
+//   -------------------------------+--------------------------------
+//   SCOPED_TRACE("Trace A");       | waits for n2
+//   generates failure #2           |
+//   notifies n2                    |
+//   -------------------------------|--------------------------------
+//   waits for n3                   | generates failure #3
+//                                  | trace B dies
+//                                  | generates failure #4
+//                                  | notifies n3
+//   -------------------------------|--------------------------------
+//   generates failure #5           | finishes
+//   trace A dies                   |
+//   generates failure #6           |
+//   -------------------------------|--------------------------------
+//   waits for thread B to finish   |
+
+struct CheckPoints {
+  Notification n1;
+  Notification n2;
+  Notification n3;
+};
+
+static void ThreadWithScopedTrace(CheckPoints* check_points) {
+  {
+    SCOPED_TRACE("Trace B");
+    ADD_FAILURE()
+        << "Expected failure #1 (in thread B, only trace B alive).";
+    check_points->n1.Notify();
+    check_points->n2.WaitForNotification();
+
+    ADD_FAILURE()
+        << "Expected failure #3 (in thread B, trace A & B both alive).";
+  }  // Trace B dies here.
+  ADD_FAILURE()
+      << "Expected failure #4 (in thread B, only trace A alive).";
+  check_points->n3.Notify();
+}
+
+TEST(SCOPED_TRACETest, WorksConcurrently) {
+  printf("(expecting 6 failures)\n");
+
+  CheckPoints check_points;
+  ThreadWithParam<CheckPoints*> thread(&ThreadWithScopedTrace,
+                                       &check_points,
+                                       NULL);
+  check_points.n1.WaitForNotification();
+
+  {
+    SCOPED_TRACE("Trace A");
+    ADD_FAILURE()
+        << "Expected failure #2 (in thread A, trace A & B both alive).";
+    check_points.n2.Notify();
+    check_points.n3.WaitForNotification();
+
+    ADD_FAILURE()
+        << "Expected failure #5 (in thread A, only trace A alive).";
+  }  // Trace A dies here.
+  ADD_FAILURE()
+      << "Expected failure #6 (in thread A, no trace alive).";
+  thread.Join();
+}
+#endif  // GTEST_IS_THREADSAFE
+
+TEST(DisabledTestsWarningTest,
+     DISABLED_AlsoRunDisabledTestsFlagSuppressesWarning) {
+  // This test body is intentionally empty.  Its sole purpose is for
+  // verifying that the --gtest_also_run_disabled_tests flag
+  // suppresses the "YOU HAVE 12 DISABLED TESTS" warning at the end of
+  // the test output.
+}
+
+// Tests using assertions outside of TEST and TEST_F.
+//
+// This function creates two failures intentionally.
+void AdHocTest() {
+  printf("The non-test part of the code is expected to have 2 failures.\n\n");
+  EXPECT_TRUE(false);
+  EXPECT_EQ(2, 3);
+}
+
+// Runs all TESTs, all TEST_Fs, and the ad hoc test.
+int RunAllTests() {
+  AdHocTest();
+  return RUN_ALL_TESTS();
+}
+
+// Tests non-fatal failures in the fixture constructor.
+class NonFatalFailureInFixtureConstructorTest : public testing::Test {
+ protected:
+  NonFatalFailureInFixtureConstructorTest() {
+    printf("(expecting 5 failures)\n");
+    ADD_FAILURE() << "Expected failure #1, in the test fixture c'tor.";
+  }
+
+  ~NonFatalFailureInFixtureConstructorTest() {
+    ADD_FAILURE() << "Expected failure #5, in the test fixture d'tor.";
+  }
+
+  virtual void SetUp() {
+    ADD_FAILURE() << "Expected failure #2, in SetUp().";
+  }
+
+  virtual void TearDown() {
+    ADD_FAILURE() << "Expected failure #4, in TearDown.";
+  }
+};
+
+TEST_F(NonFatalFailureInFixtureConstructorTest, FailureInConstructor) {
+  ADD_FAILURE() << "Expected failure #3, in the test body.";
+}
+
+// Tests fatal failures in the fixture constructor.
+class FatalFailureInFixtureConstructorTest : public testing::Test {
+ protected:
+  FatalFailureInFixtureConstructorTest() {
+    printf("(expecting 2 failures)\n");
+    Init();
+  }
+
+  ~FatalFailureInFixtureConstructorTest() {
+    ADD_FAILURE() << "Expected failure #2, in the test fixture d'tor.";
+  }
+
+  virtual void SetUp() {
+    ADD_FAILURE() << "UNEXPECTED failure in SetUp().  "
+                  << "We should never get here, as the test fixture c'tor "
+                  << "had a fatal failure.";
+  }
+
+  virtual void TearDown() {
+    ADD_FAILURE() << "UNEXPECTED failure in TearDown().  "
+                  << "We should never get here, as the test fixture c'tor "
+                  << "had a fatal failure.";
+  }
+
+ private:
+  void Init() {
+    FAIL() << "Expected failure #1, in the test fixture c'tor.";
+  }
+};
+
+TEST_F(FatalFailureInFixtureConstructorTest, FailureInConstructor) {
+  ADD_FAILURE() << "UNEXPECTED failure in the test body.  "
+                << "We should never get here, as the test fixture c'tor "
+                << "had a fatal failure.";
+}
+
+// Tests non-fatal failures in SetUp().
+class NonFatalFailureInSetUpTest : public testing::Test {
+ protected:
+  virtual ~NonFatalFailureInSetUpTest() {
+    Deinit();
+  }
+
+  virtual void SetUp() {
+    printf("(expecting 4 failures)\n");
+    ADD_FAILURE() << "Expected failure #1, in SetUp().";
+  }
+
+  virtual void TearDown() {
+    FAIL() << "Expected failure #3, in TearDown().";
+  }
+ private:
+  void Deinit() {
+    FAIL() << "Expected failure #4, in the test fixture d'tor.";
+  }
+};
+
+TEST_F(NonFatalFailureInSetUpTest, FailureInSetUp) {
+  FAIL() << "Expected failure #2, in the test function.";
+}
+
+// Tests fatal failures in SetUp().
+class FatalFailureInSetUpTest : public testing::Test {
+ protected:
+  virtual ~FatalFailureInSetUpTest() {
+    Deinit();
+  }
+
+  virtual void SetUp() {
+    printf("(expecting 3 failures)\n");
+    FAIL() << "Expected failure #1, in SetUp().";
+  }
+
+  virtual void TearDown() {
+    FAIL() << "Expected failure #2, in TearDown().";
+  }
+ private:
+  void Deinit() {
+    FAIL() << "Expected failure #3, in the test fixture d'tor.";
+  }
+};
+
+TEST_F(FatalFailureInSetUpTest, FailureInSetUp) {
+  FAIL() << "UNEXPECTED failure in the test function.  "
+         << "We should never get here, as SetUp() failed.";
+}
+
+TEST(AddFailureAtTest, MessageContainsSpecifiedFileAndLineNumber) {
+  ADD_FAILURE_AT("foo.cc", 42) << "Expected failure in foo.cc";
+}
+
+#if GTEST_IS_THREADSAFE
+
+// A unary function that may die.
+void DieIf(bool should_die) {
+  GTEST_CHECK_(!should_die) << " - death inside DieIf().";
+}
+
+// Tests running death tests in a multi-threaded context.
+
+// Used for coordination between the main and the spawn thread.
+struct SpawnThreadNotifications {
+  SpawnThreadNotifications() {}
+
+  Notification spawn_thread_started;
+  Notification spawn_thread_ok_to_terminate;
+
+ private:
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(SpawnThreadNotifications);
+};
+
+// The function to be executed in the thread spawn by the
+// MultipleThreads test (below).
+static void ThreadRoutine(SpawnThreadNotifications* notifications) {
+  // Signals the main thread that this thread has started.
+  notifications->spawn_thread_started.Notify();
+
+  // Waits for permission to finish from the main thread.
+  notifications->spawn_thread_ok_to_terminate.WaitForNotification();
+}
+
+// This is a death-test test, but it's not named with a DeathTest
+// suffix.  It starts threads which might interfere with later
+// death tests, so it must run after all other death tests.
+class DeathTestAndMultiThreadsTest : public testing::Test {
+ protected:
+  // Starts a thread and waits for it to begin.
+  virtual void SetUp() {
+    thread_.reset(new ThreadWithParam<SpawnThreadNotifications*>(
+        &ThreadRoutine, &notifications_, NULL));
+    notifications_.spawn_thread_started.WaitForNotification();
+  }
+  // Tells the thread to finish, and reaps it.
+  // Depending on the version of the thread library in use,
+  // a manager thread might still be left running that will interfere
+  // with later death tests.  This is unfortunate, but this class
+  // cleans up after itself as best it can.
+  virtual void TearDown() {
+    notifications_.spawn_thread_ok_to_terminate.Notify();
+  }
+
+ private:
+  SpawnThreadNotifications notifications_;
+  scoped_ptr<ThreadWithParam<SpawnThreadNotifications*> > thread_;
+};
+
+#endif  // GTEST_IS_THREADSAFE
+
+// The MixedUpTestCaseTest test case verifies that Google Test will fail a
+// test if it uses a different fixture class than what other tests in
+// the same test case use.  It deliberately contains two fixture
+// classes with the same name but defined in different namespaces.
+
+// The MixedUpTestCaseWithSameTestNameTest test case verifies that
+// when the user defines two tests with the same test case name AND
+// same test name (but in different namespaces), the second test will
+// fail.
+
+namespace foo {
+
+class MixedUpTestCaseTest : public testing::Test {
+};
+
+TEST_F(MixedUpTestCaseTest, FirstTestFromNamespaceFoo) {}
+TEST_F(MixedUpTestCaseTest, SecondTestFromNamespaceFoo) {}
+
+class MixedUpTestCaseWithSameTestNameTest : public testing::Test {
+};
+
+TEST_F(MixedUpTestCaseWithSameTestNameTest,
+       TheSecondTestWithThisNameShouldFail) {}
+
+}  // namespace foo
+
+namespace bar {
+
+class MixedUpTestCaseTest : public testing::Test {
+};
+
+// The following two tests are expected to fail.  We rely on the
+// golden file to check that Google Test generates the right error message.
+TEST_F(MixedUpTestCaseTest, ThisShouldFail) {}
+TEST_F(MixedUpTestCaseTest, ThisShouldFailToo) {}
+
+class MixedUpTestCaseWithSameTestNameTest : public testing::Test {
+};
+
+// Expected to fail.  We rely on the golden file to check that Google Test
+// generates the right error message.
+TEST_F(MixedUpTestCaseWithSameTestNameTest,
+       TheSecondTestWithThisNameShouldFail) {}
+
+}  // namespace bar
+
+// The following two test cases verify that Google Test catches the user
+// error of mixing TEST and TEST_F in the same test case.  The first
+// test case checks the scenario where TEST_F appears before TEST, and
+// the second one checks where TEST appears before TEST_F.
+
+class TEST_F_before_TEST_in_same_test_case : public testing::Test {
+};
+
+TEST_F(TEST_F_before_TEST_in_same_test_case, DefinedUsingTEST_F) {}
+
+// Expected to fail.  We rely on the golden file to check that Google Test
+// generates the right error message.
+TEST(TEST_F_before_TEST_in_same_test_case, DefinedUsingTESTAndShouldFail) {}
+
+class TEST_before_TEST_F_in_same_test_case : public testing::Test {
+};
+
+TEST(TEST_before_TEST_F_in_same_test_case, DefinedUsingTEST) {}
+
+// Expected to fail.  We rely on the golden file to check that Google Test
+// generates the right error message.
+TEST_F(TEST_before_TEST_F_in_same_test_case, DefinedUsingTEST_FAndShouldFail) {
+}
+
+// Used for testing EXPECT_NONFATAL_FAILURE() and EXPECT_FATAL_FAILURE().
+int global_integer = 0;
+
+// Tests that EXPECT_NONFATAL_FAILURE() can reference global variables.
+TEST(ExpectNonfatalFailureTest, CanReferenceGlobalVariables) {
+  global_integer = 0;
+  EXPECT_NONFATAL_FAILURE({
+    EXPECT_EQ(1, global_integer) << "Expected non-fatal failure.";
+  }, "Expected non-fatal failure.");
+}
+
+// Tests that EXPECT_NONFATAL_FAILURE() can reference local variables
+// (static or not).
+TEST(ExpectNonfatalFailureTest, CanReferenceLocalVariables) {
+  int m = 0;
+  static int n;
+  n = 1;
+  EXPECT_NONFATAL_FAILURE({
+    EXPECT_EQ(m, n) << "Expected non-fatal failure.";
+  }, "Expected non-fatal failure.");
+}
+
+// Tests that EXPECT_NONFATAL_FAILURE() succeeds when there is exactly
+// one non-fatal failure and no fatal failure.
+TEST(ExpectNonfatalFailureTest, SucceedsWhenThereIsOneNonfatalFailure) {
+  EXPECT_NONFATAL_FAILURE({
+    ADD_FAILURE() << "Expected non-fatal failure.";
+  }, "Expected non-fatal failure.");
+}
+
+// Tests that EXPECT_NONFATAL_FAILURE() fails when there is no
+// non-fatal failure.
+TEST(ExpectNonfatalFailureTest, FailsWhenThereIsNoNonfatalFailure) {
+  printf("(expecting a failure)\n");
+  EXPECT_NONFATAL_FAILURE({
+  }, "");
+}
+
+// Tests that EXPECT_NONFATAL_FAILURE() fails when there are two
+// non-fatal failures.
+TEST(ExpectNonfatalFailureTest, FailsWhenThereAreTwoNonfatalFailures) {
+  printf("(expecting a failure)\n");
+  EXPECT_NONFATAL_FAILURE({
+    ADD_FAILURE() << "Expected non-fatal failure 1.";
+    ADD_FAILURE() << "Expected non-fatal failure 2.";
+  }, "");
+}
+
+// Tests that EXPECT_NONFATAL_FAILURE() fails when there is one fatal
+// failure.
+TEST(ExpectNonfatalFailureTest, FailsWhenThereIsOneFatalFailure) {
+  printf("(expecting a failure)\n");
+  EXPECT_NONFATAL_FAILURE({
+    FAIL() << "Expected fatal failure.";
+  }, "");
+}
+
+// Tests that EXPECT_NONFATAL_FAILURE() fails when the statement being
+// tested returns.
+TEST(ExpectNonfatalFailureTest, FailsWhenStatementReturns) {
+  printf("(expecting a failure)\n");
+  EXPECT_NONFATAL_FAILURE({
+    return;
+  }, "");
+}
+
+#if GTEST_HAS_EXCEPTIONS
+
+// Tests that EXPECT_NONFATAL_FAILURE() fails when the statement being
+// tested throws.
+TEST(ExpectNonfatalFailureTest, FailsWhenStatementThrows) {
+  printf("(expecting a failure)\n");
+  try {
+    EXPECT_NONFATAL_FAILURE({
+      throw 0;
+    }, "");
+  } catch(int) {  // NOLINT
+  }
+}
+
+#endif  // GTEST_HAS_EXCEPTIONS
+
+// Tests that EXPECT_FATAL_FAILURE() can reference global variables.
+TEST(ExpectFatalFailureTest, CanReferenceGlobalVariables) {
+  global_integer = 0;
+  EXPECT_FATAL_FAILURE({
+    ASSERT_EQ(1, global_integer) << "Expected fatal failure.";
+  }, "Expected fatal failure.");
+}
+
+// Tests that EXPECT_FATAL_FAILURE() can reference local static
+// variables.
+TEST(ExpectFatalFailureTest, CanReferenceLocalStaticVariables) {
+  static int n;
+  n = 1;
+  EXPECT_FATAL_FAILURE({
+    ASSERT_EQ(0, n) << "Expected fatal failure.";
+  }, "Expected fatal failure.");
+}
+
+// Tests that EXPECT_FATAL_FAILURE() succeeds when there is exactly
+// one fatal failure and no non-fatal failure.
+TEST(ExpectFatalFailureTest, SucceedsWhenThereIsOneFatalFailure) {
+  EXPECT_FATAL_FAILURE({
+    FAIL() << "Expected fatal failure.";
+  }, "Expected fatal failure.");
+}
+
+// Tests that EXPECT_FATAL_FAILURE() fails when there is no fatal
+// failure.
+TEST(ExpectFatalFailureTest, FailsWhenThereIsNoFatalFailure) {
+  printf("(expecting a failure)\n");
+  EXPECT_FATAL_FAILURE({
+  }, "");
+}
+
+// A helper for generating a fatal failure.
+void FatalFailure() {
+  FAIL() << "Expected fatal failure.";
+}
+
+// Tests that EXPECT_FATAL_FAILURE() fails when there are two
+// fatal failures.
+TEST(ExpectFatalFailureTest, FailsWhenThereAreTwoFatalFailures) {
+  printf("(expecting a failure)\n");
+  EXPECT_FATAL_FAILURE({
+    FatalFailure();
+    FatalFailure();
+  }, "");
+}
+
+// Tests that EXPECT_FATAL_FAILURE() fails when there is one non-fatal
+// failure.
+TEST(ExpectFatalFailureTest, FailsWhenThereIsOneNonfatalFailure) {
+  printf("(expecting a failure)\n");
+  EXPECT_FATAL_FAILURE({
+    ADD_FAILURE() << "Expected non-fatal failure.";
+  }, "");
+}
+
+// Tests that EXPECT_FATAL_FAILURE() fails when the statement being
+// tested returns.
+TEST(ExpectFatalFailureTest, FailsWhenStatementReturns) {
+  printf("(expecting a failure)\n");
+  EXPECT_FATAL_FAILURE({
+    return;
+  }, "");
+}
+
+#if GTEST_HAS_EXCEPTIONS
+
+// Tests that EXPECT_FATAL_FAILURE() fails when the statement being
+// tested throws.
+TEST(ExpectFatalFailureTest, FailsWhenStatementThrows) {
+  printf("(expecting a failure)\n");
+  try {
+    EXPECT_FATAL_FAILURE({
+      throw 0;
+    }, "");
+  } catch(int) {  // NOLINT
+  }
+}
+
+#endif  // GTEST_HAS_EXCEPTIONS
+
+// This #ifdef block tests the output of typed tests.
+#if GTEST_HAS_TYPED_TEST
+
+template <typename T>
+class TypedTest : public testing::Test {
+};
+
+TYPED_TEST_CASE(TypedTest, testing::Types<int>);
+
+TYPED_TEST(TypedTest, Success) {
+  EXPECT_EQ(0, TypeParam());
+}
+
+TYPED_TEST(TypedTest, Failure) {
+  EXPECT_EQ(1, TypeParam()) << "Expected failure";
+}
+
+#endif  // GTEST_HAS_TYPED_TEST
+
+// This #ifdef block tests the output of type-parameterized tests.
+#if GTEST_HAS_TYPED_TEST_P
+
+template <typename T>
+class TypedTestP : public testing::Test {
+};
+
+TYPED_TEST_CASE_P(TypedTestP);
+
+TYPED_TEST_P(TypedTestP, Success) {
+  EXPECT_EQ(0U, TypeParam());
+}
+
+TYPED_TEST_P(TypedTestP, Failure) {
+  EXPECT_EQ(1U, TypeParam()) << "Expected failure";
+}
+
+REGISTER_TYPED_TEST_CASE_P(TypedTestP, Success, Failure);
+
+typedef testing::Types<unsigned char, unsigned int> UnsignedTypes;
+INSTANTIATE_TYPED_TEST_CASE_P(Unsigned, TypedTestP, UnsignedTypes);
+
+#endif  // GTEST_HAS_TYPED_TEST_P
+
+#if GTEST_HAS_DEATH_TEST
+
+// We rely on the golden file to verify that tests whose test case
+// name ends with DeathTest are run first.
+
+TEST(ADeathTest, ShouldRunFirst) {
+}
+
+# if GTEST_HAS_TYPED_TEST
+
+// We rely on the golden file to verify that typed tests whose test
+// case name ends with DeathTest are run first.
+
+template <typename T>
+class ATypedDeathTest : public testing::Test {
+};
+
+typedef testing::Types<int, double> NumericTypes;
+TYPED_TEST_CASE(ATypedDeathTest, NumericTypes);
+
+TYPED_TEST(ATypedDeathTest, ShouldRunFirst) {
+}
+
+# endif  // GTEST_HAS_TYPED_TEST
+
+# if GTEST_HAS_TYPED_TEST_P
+
+
+// We rely on the golden file to verify that type-parameterized tests
+// whose test case name ends with DeathTest are run first.
+
+template <typename T>
+class ATypeParamDeathTest : public testing::Test {
+};
+
+TYPED_TEST_CASE_P(ATypeParamDeathTest);
+
+TYPED_TEST_P(ATypeParamDeathTest, ShouldRunFirst) {
+}
+
+REGISTER_TYPED_TEST_CASE_P(ATypeParamDeathTest, ShouldRunFirst);
+
+INSTANTIATE_TYPED_TEST_CASE_P(My, ATypeParamDeathTest, NumericTypes);
+
+# endif  // GTEST_HAS_TYPED_TEST_P
+
+#endif  // GTEST_HAS_DEATH_TEST
+
+// Tests various failure conditions of
+// EXPECT_{,NON}FATAL_FAILURE{,_ON_ALL_THREADS}.
+class ExpectFailureTest : public testing::Test {
+ public:  // Must be public and not protected due to a bug in g++ 3.4.2.
+  enum FailureMode {
+    FATAL_FAILURE,
+    NONFATAL_FAILURE
+  };
+  static void AddFailure(FailureMode failure) {
+    if (failure == FATAL_FAILURE) {
+      FAIL() << "Expected fatal failure.";
+    } else {
+      ADD_FAILURE() << "Expected non-fatal failure.";
+    }
+  }
+};
+
+TEST_F(ExpectFailureTest, ExpectFatalFailure) {
+  // Expected fatal failure, but succeeds.
+  printf("(expecting 1 failure)\n");
+  EXPECT_FATAL_FAILURE(SUCCEED(), "Expected fatal failure.");
+  // Expected fatal failure, but got a non-fatal failure.
+  printf("(expecting 1 failure)\n");
+  EXPECT_FATAL_FAILURE(AddFailure(NONFATAL_FAILURE), "Expected non-fatal "
+                       "failure.");
+  // Wrong message.
+  printf("(expecting 1 failure)\n");
+  EXPECT_FATAL_FAILURE(AddFailure(FATAL_FAILURE), "Some other fatal failure "
+                       "expected.");
+}
+
+TEST_F(ExpectFailureTest, ExpectNonFatalFailure) {
+  // Expected non-fatal failure, but succeeds.
+  printf("(expecting 1 failure)\n");
+  EXPECT_NONFATAL_FAILURE(SUCCEED(), "Expected non-fatal failure.");
+  // Expected non-fatal failure, but got a fatal failure.
+  printf("(expecting 1 failure)\n");
+  EXPECT_NONFATAL_FAILURE(AddFailure(FATAL_FAILURE), "Expected fatal failure.");
+  // Wrong message.
+  printf("(expecting 1 failure)\n");
+  EXPECT_NONFATAL_FAILURE(AddFailure(NONFATAL_FAILURE), "Some other non-fatal "
+                          "failure.");
+}
+
+#if GTEST_IS_THREADSAFE
+
+class ExpectFailureWithThreadsTest : public ExpectFailureTest {
+ protected:
+  static void AddFailureInOtherThread(FailureMode failure) {
+    ThreadWithParam<FailureMode> thread(&AddFailure, failure, NULL);
+    thread.Join();
+  }
+};
+
+TEST_F(ExpectFailureWithThreadsTest, ExpectFatalFailure) {
+  // We only intercept the current thread.
+  printf("(expecting 2 failures)\n");
+  EXPECT_FATAL_FAILURE(AddFailureInOtherThread(FATAL_FAILURE),
+                       "Expected fatal failure.");
+}
+
+TEST_F(ExpectFailureWithThreadsTest, ExpectNonFatalFailure) {
+  // We only intercept the current thread.
+  printf("(expecting 2 failures)\n");
+  EXPECT_NONFATAL_FAILURE(AddFailureInOtherThread(NONFATAL_FAILURE),
+                          "Expected non-fatal failure.");
+}
+
+typedef ExpectFailureWithThreadsTest ScopedFakeTestPartResultReporterTest;
+
+// Tests that the ScopedFakeTestPartResultReporter only catches failures from
+// the current thread if it is instantiated with INTERCEPT_ONLY_CURRENT_THREAD.
+TEST_F(ScopedFakeTestPartResultReporterTest, InterceptOnlyCurrentThread) {
+  printf("(expecting 2 failures)\n");
+  TestPartResultArray results;
+  {
+    ScopedFakeTestPartResultReporter reporter(
+        ScopedFakeTestPartResultReporter::INTERCEPT_ONLY_CURRENT_THREAD,
+        &results);
+    AddFailureInOtherThread(FATAL_FAILURE);
+    AddFailureInOtherThread(NONFATAL_FAILURE);
+  }
+  // The two failures should not have been intercepted.
+  EXPECT_EQ(0, results.size()) << "This shouldn't fail.";
+}
+
+#endif  // GTEST_IS_THREADSAFE
+
+TEST_F(ExpectFailureTest, ExpectFatalFailureOnAllThreads) {
+  // Expected fatal failure, but succeeds.
+  printf("(expecting 1 failure)\n");
+  EXPECT_FATAL_FAILURE_ON_ALL_THREADS(SUCCEED(), "Expected fatal failure.");
+  // Expected fatal failure, but got a non-fatal failure.
+  printf("(expecting 1 failure)\n");
+  EXPECT_FATAL_FAILURE_ON_ALL_THREADS(AddFailure(NONFATAL_FAILURE),
+                                      "Expected non-fatal failure.");
+  // Wrong message.
+  printf("(expecting 1 failure)\n");
+  EXPECT_FATAL_FAILURE_ON_ALL_THREADS(AddFailure(FATAL_FAILURE),
+                                      "Some other fatal failure expected.");
+}
+
+TEST_F(ExpectFailureTest, ExpectNonFatalFailureOnAllThreads) {
+  // Expected non-fatal failure, but succeeds.
+  printf("(expecting 1 failure)\n");
+  EXPECT_NONFATAL_FAILURE_ON_ALL_THREADS(SUCCEED(), "Expected non-fatal "
+                                         "failure.");
+  // Expected non-fatal failure, but got a fatal failure.
+  printf("(expecting 1 failure)\n");
+  EXPECT_NONFATAL_FAILURE_ON_ALL_THREADS(AddFailure(FATAL_FAILURE),
+                                         "Expected fatal failure.");
+  // Wrong message.
+  printf("(expecting 1 failure)\n");
+  EXPECT_NONFATAL_FAILURE_ON_ALL_THREADS(AddFailure(NONFATAL_FAILURE),
+                                         "Some other non-fatal failure.");
+}
+
+
+// Two test environments for testing testing::AddGlobalTestEnvironment().
+
+class FooEnvironment : public testing::Environment {
+ public:
+  virtual void SetUp() {
+    printf("%s", "FooEnvironment::SetUp() called.\n");
+  }
+
+  virtual void TearDown() {
+    printf("%s", "FooEnvironment::TearDown() called.\n");
+    FAIL() << "Expected fatal failure.";
+  }
+};
+
+class BarEnvironment : public testing::Environment {
+ public:
+  virtual void SetUp() {
+    printf("%s", "BarEnvironment::SetUp() called.\n");
+  }
+
+  virtual void TearDown() {
+    printf("%s", "BarEnvironment::TearDown() called.\n");
+    ADD_FAILURE() << "Expected non-fatal failure.";
+  }
+};
+
+bool GTEST_FLAG(internal_skip_environment_and_ad_hoc_tests) = false;
+
+// The main function.
+//
+// The idea is to use Google Test to run all the tests we have defined (some
+// of them are intended to fail), and then compare the test results
+// with the "golden" file.
+int main(int argc, char **argv) {
+  testing::GTEST_FLAG(print_time) = false;
+
+  // We just run the tests, knowing some of them are intended to fail.
+  // We will use a separate Python script to compare the output of
+  // this program with the golden file.
+
+  // It's hard to test InitGoogleTest() directly, as it has many
+  // global side effects.  The following line serves as a sanity test
+  // for it.
+  testing::InitGoogleTest(&argc, argv);
+  if (argc >= 2 &&
+      (std::string(argv[1]) ==
+       "--gtest_internal_skip_environment_and_ad_hoc_tests"))
+    GTEST_FLAG(internal_skip_environment_and_ad_hoc_tests) = true;
+
+#if GTEST_HAS_DEATH_TEST
+  if (testing::internal::GTEST_FLAG(internal_run_death_test) != "") {
+    // Skip the usual output capturing if we're running as the child
+    // process of an threadsafe-style death test.
+# if GTEST_OS_WINDOWS
+    posix::FReopen("nul:", "w", stdout);
+# else
+    posix::FReopen("/dev/null", "w", stdout);
+# endif  // GTEST_OS_WINDOWS
+    return RUN_ALL_TESTS();
+  }
+#endif  // GTEST_HAS_DEATH_TEST
+
+  if (GTEST_FLAG(internal_skip_environment_and_ad_hoc_tests))
+    return RUN_ALL_TESTS();
+
+  // Registers two global test environments.
+  // The golden file verifies that they are set up in the order they
+  // are registered, and torn down in the reverse order.
+  testing::AddGlobalTestEnvironment(new FooEnvironment);
+  testing::AddGlobalTestEnvironment(new BarEnvironment);
+
+  return RunAllTests();
+}
diff --git a/contrib/gtest-1.7.0/test/gtest_output_test_golden_lin.txt b/contrib/gtest-1.7.0/test/gtest_output_test_golden_lin.txt
new file mode 100644
index 0000000..960eedc
--- /dev/null
+++ b/contrib/gtest-1.7.0/test/gtest_output_test_golden_lin.txt
@@ -0,0 +1,720 @@
+The non-test part of the code is expected to have 2 failures.
+
+gtest_output_test_.cc:#: Failure
+Value of: false
+  Actual: false
+Expected: true
+gtest_output_test_.cc:#: Failure
+Value of: 3
+Expected: 2
+[==========] Running 63 tests from 28 test cases.
+[----------] Global test environment set-up.
+FooEnvironment::SetUp() called.
+BarEnvironment::SetUp() called.
+[----------] 1 test from ADeathTest
+[ RUN      ] ADeathTest.ShouldRunFirst
+[       OK ] ADeathTest.ShouldRunFirst
+[----------] 1 test from ATypedDeathTest/0, where TypeParam = int
+[ RUN      ] ATypedDeathTest/0.ShouldRunFirst
+[       OK ] ATypedDeathTest/0.ShouldRunFirst
+[----------] 1 test from ATypedDeathTest/1, where TypeParam = double
+[ RUN      ] ATypedDeathTest/1.ShouldRunFirst
+[       OK ] ATypedDeathTest/1.ShouldRunFirst
+[----------] 1 test from My/ATypeParamDeathTest/0, where TypeParam = int
+[ RUN      ] My/ATypeParamDeathTest/0.ShouldRunFirst
+[       OK ] My/ATypeParamDeathTest/0.ShouldRunFirst
+[----------] 1 test from My/ATypeParamDeathTest/1, where TypeParam = double
+[ RUN      ] My/ATypeParamDeathTest/1.ShouldRunFirst
+[       OK ] My/ATypeParamDeathTest/1.ShouldRunFirst
+[----------] 2 tests from PassingTest
+[ RUN      ] PassingTest.PassingTest1
+[       OK ] PassingTest.PassingTest1
+[ RUN      ] PassingTest.PassingTest2
+[       OK ] PassingTest.PassingTest2
+[----------] 1 test from NonfatalFailureTest
+[ RUN      ] NonfatalFailureTest.EscapesStringOperands
+gtest_output_test_.cc:#: Failure
+Value of: actual
+  Actual: "actual \"string\""
+Expected: kGoldenString
+Which is: "\"Line"
+gtest_output_test_.cc:#: Failure
+Value of: actual
+  Actual: "actual \"string\""
+Expected: golden
+Which is: "\"Line"
+[  FAILED  ] NonfatalFailureTest.EscapesStringOperands
+[----------] 3 tests from FatalFailureTest
+[ RUN      ] FatalFailureTest.FatalFailureInSubroutine
+(expecting a failure that x should be 1)
+gtest_output_test_.cc:#: Failure
+Value of: x
+  Actual: 2
+Expected: 1
+[  FAILED  ] FatalFailureTest.FatalFailureInSubroutine
+[ RUN      ] FatalFailureTest.FatalFailureInNestedSubroutine
+(expecting a failure that x should be 1)
+gtest_output_test_.cc:#: Failure
+Value of: x
+  Actual: 2
+Expected: 1
+[  FAILED  ] FatalFailureTest.FatalFailureInNestedSubroutine
+[ RUN      ] FatalFailureTest.NonfatalFailureInSubroutine
+(expecting a failure on false)
+gtest_output_test_.cc:#: Failure
+Value of: false
+  Actual: false
+Expected: true
+[  FAILED  ] FatalFailureTest.NonfatalFailureInSubroutine
+[----------] 1 test from LoggingTest
+[ RUN      ] LoggingTest.InterleavingLoggingAndAssertions
+(expecting 2 failures on (3) >= (a[i]))
+i == 0
+i == 1
+gtest_output_test_.cc:#: Failure
+Expected: (3) >= (a[i]), actual: 3 vs 9
+i == 2
+i == 3
+gtest_output_test_.cc:#: Failure
+Expected: (3) >= (a[i]), actual: 3 vs 6
+[  FAILED  ] LoggingTest.InterleavingLoggingAndAssertions
+[----------] 6 tests from SCOPED_TRACETest
+[ RUN      ] SCOPED_TRACETest.ObeysScopes
+(expected to fail)
+gtest_output_test_.cc:#: Failure
+Failed
+This failure is expected, and shouldn't have a trace.
+gtest_output_test_.cc:#: Failure
+Failed
+This failure is expected, and should have a trace.
+Google Test trace:
+gtest_output_test_.cc:#: Expected trace
+gtest_output_test_.cc:#: Failure
+Failed
+This failure is expected, and shouldn't have a trace.
+[  FAILED  ] SCOPED_TRACETest.ObeysScopes
+[ RUN      ] SCOPED_TRACETest.WorksInLoop
+(expected to fail)
+gtest_output_test_.cc:#: Failure
+Value of: n
+  Actual: 1
+Expected: 2
+Google Test trace:
+gtest_output_test_.cc:#: i = 1
+gtest_output_test_.cc:#: Failure
+Value of: n
+  Actual: 2
+Expected: 1
+Google Test trace:
+gtest_output_test_.cc:#: i = 2
+[  FAILED  ] SCOPED_TRACETest.WorksInLoop
+[ RUN      ] SCOPED_TRACETest.WorksInSubroutine
+(expected to fail)
+gtest_output_test_.cc:#: Failure
+Value of: n
+  Actual: 1
+Expected: 2
+Google Test trace:
+gtest_output_test_.cc:#: n = 1
+gtest_output_test_.cc:#: Failure
+Value of: n
+  Actual: 2
+Expected: 1
+Google Test trace:
+gtest_output_test_.cc:#: n = 2
+[  FAILED  ] SCOPED_TRACETest.WorksInSubroutine
+[ RUN      ] SCOPED_TRACETest.CanBeNested
+(expected to fail)
+gtest_output_test_.cc:#: Failure
+Value of: n
+  Actual: 2
+Expected: 1
+Google Test trace:
+gtest_output_test_.cc:#: n = 2
+gtest_output_test_.cc:#: 
+[  FAILED  ] SCOPED_TRACETest.CanBeNested
+[ RUN      ] SCOPED_TRACETest.CanBeRepeated
+(expected to fail)
+gtest_output_test_.cc:#: Failure
+Failed
+This failure is expected, and should contain trace point A.
+Google Test trace:
+gtest_output_test_.cc:#: A
+gtest_output_test_.cc:#: Failure
+Failed
+This failure is expected, and should contain trace point A and B.
+Google Test trace:
+gtest_output_test_.cc:#: B
+gtest_output_test_.cc:#: A
+gtest_output_test_.cc:#: Failure
+Failed
+This failure is expected, and should contain trace point A, B, and C.
+Google Test trace:
+gtest_output_test_.cc:#: C
+gtest_output_test_.cc:#: B
+gtest_output_test_.cc:#: A
+gtest_output_test_.cc:#: Failure
+Failed
+This failure is expected, and should contain trace point A, B, and D.
+Google Test trace:
+gtest_output_test_.cc:#: D
+gtest_output_test_.cc:#: B
+gtest_output_test_.cc:#: A
+[  FAILED  ] SCOPED_TRACETest.CanBeRepeated
+[ RUN      ] SCOPED_TRACETest.WorksConcurrently
+(expecting 6 failures)
+gtest_output_test_.cc:#: Failure
+Failed
+Expected failure #1 (in thread B, only trace B alive).
+Google Test trace:
+gtest_output_test_.cc:#: Trace B
+gtest_output_test_.cc:#: Failure
+Failed
+Expected failure #2 (in thread A, trace A & B both alive).
+Google Test trace:
+gtest_output_test_.cc:#: Trace A
+gtest_output_test_.cc:#: Failure
+Failed
+Expected failure #3 (in thread B, trace A & B both alive).
+Google Test trace:
+gtest_output_test_.cc:#: Trace B
+gtest_output_test_.cc:#: Failure
+Failed
+Expected failure #4 (in thread B, only trace A alive).
+gtest_output_test_.cc:#: Failure
+Failed
+Expected failure #5 (in thread A, only trace A alive).
+Google Test trace:
+gtest_output_test_.cc:#: Trace A
+gtest_output_test_.cc:#: Failure
+Failed
+Expected failure #6 (in thread A, no trace alive).
+[  FAILED  ] SCOPED_TRACETest.WorksConcurrently
+[----------] 1 test from NonFatalFailureInFixtureConstructorTest
+[ RUN      ] NonFatalFailureInFixtureConstructorTest.FailureInConstructor
+(expecting 5 failures)
+gtest_output_test_.cc:#: Failure
+Failed
+Expected failure #1, in the test fixture c'tor.
+gtest_output_test_.cc:#: Failure
+Failed
+Expected failure #2, in SetUp().
+gtest_output_test_.cc:#: Failure
+Failed
+Expected failure #3, in the test body.
+gtest_output_test_.cc:#: Failure
+Failed
+Expected failure #4, in TearDown.
+gtest_output_test_.cc:#: Failure
+Failed
+Expected failure #5, in the test fixture d'tor.
+[  FAILED  ] NonFatalFailureInFixtureConstructorTest.FailureInConstructor
+[----------] 1 test from FatalFailureInFixtureConstructorTest
+[ RUN      ] FatalFailureInFixtureConstructorTest.FailureInConstructor
+(expecting 2 failures)
+gtest_output_test_.cc:#: Failure
+Failed
+Expected failure #1, in the test fixture c'tor.
+gtest_output_test_.cc:#: Failure
+Failed
+Expected failure #2, in the test fixture d'tor.
+[  FAILED  ] FatalFailureInFixtureConstructorTest.FailureInConstructor
+[----------] 1 test from NonFatalFailureInSetUpTest
+[ RUN      ] NonFatalFailureInSetUpTest.FailureInSetUp
+(expecting 4 failures)
+gtest_output_test_.cc:#: Failure
+Failed
+Expected failure #1, in SetUp().
+gtest_output_test_.cc:#: Failure
+Failed
+Expected failure #2, in the test function.
+gtest_output_test_.cc:#: Failure
+Failed
+Expected failure #3, in TearDown().
+gtest_output_test_.cc:#: Failure
+Failed
+Expected failure #4, in the test fixture d'tor.
+[  FAILED  ] NonFatalFailureInSetUpTest.FailureInSetUp
+[----------] 1 test from FatalFailureInSetUpTest
+[ RUN      ] FatalFailureInSetUpTest.FailureInSetUp
+(expecting 3 failures)
+gtest_output_test_.cc:#: Failure
+Failed
+Expected failure #1, in SetUp().
+gtest_output_test_.cc:#: Failure
+Failed
+Expected failure #2, in TearDown().
+gtest_output_test_.cc:#: Failure
+Failed
+Expected failure #3, in the test fixture d'tor.
+[  FAILED  ] FatalFailureInSetUpTest.FailureInSetUp
+[----------] 1 test from AddFailureAtTest
+[ RUN      ] AddFailureAtTest.MessageContainsSpecifiedFileAndLineNumber
+foo.cc:42: Failure
+Failed
+Expected failure in foo.cc
+[  FAILED  ] AddFailureAtTest.MessageContainsSpecifiedFileAndLineNumber
+[----------] 4 tests from MixedUpTestCaseTest
+[ RUN      ] MixedUpTestCaseTest.FirstTestFromNamespaceFoo
+[       OK ] MixedUpTestCaseTest.FirstTestFromNamespaceFoo
+[ RUN      ] MixedUpTestCaseTest.SecondTestFromNamespaceFoo
+[       OK ] MixedUpTestCaseTest.SecondTestFromNamespaceFoo
+[ RUN      ] MixedUpTestCaseTest.ThisShouldFail
+gtest.cc:#: Failure
+Failed
+All tests in the same test case must use the same test fixture
+class.  However, in test case MixedUpTestCaseTest,
+you defined test FirstTestFromNamespaceFoo and test ThisShouldFail
+using two different test fixture classes.  This can happen if
+the two classes are from different namespaces or translation
+units and have the same name.  You should probably rename one
+of the classes to put the tests into different test cases.
+[  FAILED  ] MixedUpTestCaseTest.ThisShouldFail
+[ RUN      ] MixedUpTestCaseTest.ThisShouldFailToo
+gtest.cc:#: Failure
+Failed
+All tests in the same test case must use the same test fixture
+class.  However, in test case MixedUpTestCaseTest,
+you defined test FirstTestFromNamespaceFoo and test ThisShouldFailToo
+using two different test fixture classes.  This can happen if
+the two classes are from different namespaces or translation
+units and have the same name.  You should probably rename one
+of the classes to put the tests into different test cases.
+[  FAILED  ] MixedUpTestCaseTest.ThisShouldFailToo
+[----------] 2 tests from MixedUpTestCaseWithSameTestNameTest
+[ RUN      ] MixedUpTestCaseWithSameTestNameTest.TheSecondTestWithThisNameShouldFail
+[       OK ] MixedUpTestCaseWithSameTestNameTest.TheSecondTestWithThisNameShouldFail
+[ RUN      ] MixedUpTestCaseWithSameTestNameTest.TheSecondTestWithThisNameShouldFail
+gtest.cc:#: Failure
+Failed
+All tests in the same test case must use the same test fixture
+class.  However, in test case MixedUpTestCaseWithSameTestNameTest,
+you defined test TheSecondTestWithThisNameShouldFail and test TheSecondTestWithThisNameShouldFail
+using two different test fixture classes.  This can happen if
+the two classes are from different namespaces or translation
+units and have the same name.  You should probably rename one
+of the classes to put the tests into different test cases.
+[  FAILED  ] MixedUpTestCaseWithSameTestNameTest.TheSecondTestWithThisNameShouldFail
+[----------] 2 tests from TEST_F_before_TEST_in_same_test_case
+[ RUN      ] TEST_F_before_TEST_in_same_test_case.DefinedUsingTEST_F
+[       OK ] TEST_F_before_TEST_in_same_test_case.DefinedUsingTEST_F
+[ RUN      ] TEST_F_before_TEST_in_same_test_case.DefinedUsingTESTAndShouldFail
+gtest.cc:#: Failure
+Failed
+All tests in the same test case must use the same test fixture
+class, so mixing TEST_F and TEST in the same test case is
+illegal.  In test case TEST_F_before_TEST_in_same_test_case,
+test DefinedUsingTEST_F is defined using TEST_F but
+test DefinedUsingTESTAndShouldFail is defined using TEST.  You probably
+want to change the TEST to TEST_F or move it to another test
+case.
+[  FAILED  ] TEST_F_before_TEST_in_same_test_case.DefinedUsingTESTAndShouldFail
+[----------] 2 tests from TEST_before_TEST_F_in_same_test_case
+[ RUN      ] TEST_before_TEST_F_in_same_test_case.DefinedUsingTEST
+[       OK ] TEST_before_TEST_F_in_same_test_case.DefinedUsingTEST
+[ RUN      ] TEST_before_TEST_F_in_same_test_case.DefinedUsingTEST_FAndShouldFail
+gtest.cc:#: Failure
+Failed
+All tests in the same test case must use the same test fixture
+class, so mixing TEST_F and TEST in the same test case is
+illegal.  In test case TEST_before_TEST_F_in_same_test_case,
+test DefinedUsingTEST_FAndShouldFail is defined using TEST_F but
+test DefinedUsingTEST is defined using TEST.  You probably
+want to change the TEST to TEST_F or move it to another test
+case.
+[  FAILED  ] TEST_before_TEST_F_in_same_test_case.DefinedUsingTEST_FAndShouldFail
+[----------] 8 tests from ExpectNonfatalFailureTest
+[ RUN      ] ExpectNonfatalFailureTest.CanReferenceGlobalVariables
+[       OK ] ExpectNonfatalFailureTest.CanReferenceGlobalVariables
+[ RUN      ] ExpectNonfatalFailureTest.CanReferenceLocalVariables
+[       OK ] ExpectNonfatalFailureTest.CanReferenceLocalVariables
+[ RUN      ] ExpectNonfatalFailureTest.SucceedsWhenThereIsOneNonfatalFailure
+[       OK ] ExpectNonfatalFailureTest.SucceedsWhenThereIsOneNonfatalFailure
+[ RUN      ] ExpectNonfatalFailureTest.FailsWhenThereIsNoNonfatalFailure
+(expecting a failure)
+gtest.cc:#: Failure
+Expected: 1 non-fatal failure
+  Actual: 0 failures
+[  FAILED  ] ExpectNonfatalFailureTest.FailsWhenThereIsNoNonfatalFailure
+[ RUN      ] ExpectNonfatalFailureTest.FailsWhenThereAreTwoNonfatalFailures
+(expecting a failure)
+gtest.cc:#: Failure
+Expected: 1 non-fatal failure
+  Actual: 2 failures
+gtest_output_test_.cc:#: Non-fatal failure:
+Failed
+Expected non-fatal failure 1.
+
+gtest_output_test_.cc:#: Non-fatal failure:
+Failed
+Expected non-fatal failure 2.
+
+[  FAILED  ] ExpectNonfatalFailureTest.FailsWhenThereAreTwoNonfatalFailures
+[ RUN      ] ExpectNonfatalFailureTest.FailsWhenThereIsOneFatalFailure
+(expecting a failure)
+gtest.cc:#: Failure
+Expected: 1 non-fatal failure
+  Actual:
+gtest_output_test_.cc:#: Fatal failure:
+Failed
+Expected fatal failure.
+
+[  FAILED  ] ExpectNonfatalFailureTest.FailsWhenThereIsOneFatalFailure
+[ RUN      ] ExpectNonfatalFailureTest.FailsWhenStatementReturns
+(expecting a failure)
+gtest.cc:#: Failure
+Expected: 1 non-fatal failure
+  Actual: 0 failures
+[  FAILED  ] ExpectNonfatalFailureTest.FailsWhenStatementReturns
+[ RUN      ] ExpectNonfatalFailureTest.FailsWhenStatementThrows
+(expecting a failure)
+gtest.cc:#: Failure
+Expected: 1 non-fatal failure
+  Actual: 0 failures
+[  FAILED  ] ExpectNonfatalFailureTest.FailsWhenStatementThrows
+[----------] 8 tests from ExpectFatalFailureTest
+[ RUN      ] ExpectFatalFailureTest.CanReferenceGlobalVariables
+[       OK ] ExpectFatalFailureTest.CanReferenceGlobalVariables
+[ RUN      ] ExpectFatalFailureTest.CanReferenceLocalStaticVariables
+[       OK ] ExpectFatalFailureTest.CanReferenceLocalStaticVariables
+[ RUN      ] ExpectFatalFailureTest.SucceedsWhenThereIsOneFatalFailure
+[       OK ] ExpectFatalFailureTest.SucceedsWhenThereIsOneFatalFailure
+[ RUN      ] ExpectFatalFailureTest.FailsWhenThereIsNoFatalFailure
+(expecting a failure)
+gtest.cc:#: Failure
+Expected: 1 fatal failure
+  Actual: 0 failures
+[  FAILED  ] ExpectFatalFailureTest.FailsWhenThereIsNoFatalFailure
+[ RUN      ] ExpectFatalFailureTest.FailsWhenThereAreTwoFatalFailures
+(expecting a failure)
+gtest.cc:#: Failure
+Expected: 1 fatal failure
+  Actual: 2 failures
+gtest_output_test_.cc:#: Fatal failure:
+Failed
+Expected fatal failure.
+
+gtest_output_test_.cc:#: Fatal failure:
+Failed
+Expected fatal failure.
+
+[  FAILED  ] ExpectFatalFailureTest.FailsWhenThereAreTwoFatalFailures
+[ RUN      ] ExpectFatalFailureTest.FailsWhenThereIsOneNonfatalFailure
+(expecting a failure)
+gtest.cc:#: Failure
+Expected: 1 fatal failure
+  Actual:
+gtest_output_test_.cc:#: Non-fatal failure:
+Failed
+Expected non-fatal failure.
+
+[  FAILED  ] ExpectFatalFailureTest.FailsWhenThereIsOneNonfatalFailure
+[ RUN      ] ExpectFatalFailureTest.FailsWhenStatementReturns
+(expecting a failure)
+gtest.cc:#: Failure
+Expected: 1 fatal failure
+  Actual: 0 failures
+[  FAILED  ] ExpectFatalFailureTest.FailsWhenStatementReturns
+[ RUN      ] ExpectFatalFailureTest.FailsWhenStatementThrows
+(expecting a failure)
+gtest.cc:#: Failure
+Expected: 1 fatal failure
+  Actual: 0 failures
+[  FAILED  ] ExpectFatalFailureTest.FailsWhenStatementThrows
+[----------] 2 tests from TypedTest/0, where TypeParam = int
+[ RUN      ] TypedTest/0.Success
+[       OK ] TypedTest/0.Success
+[ RUN      ] TypedTest/0.Failure
+gtest_output_test_.cc:#: Failure
+Value of: TypeParam()
+  Actual: 0
+Expected: 1
+Expected failure
+[  FAILED  ] TypedTest/0.Failure, where TypeParam = int
+[----------] 2 tests from Unsigned/TypedTestP/0, where TypeParam = unsigned char
+[ RUN      ] Unsigned/TypedTestP/0.Success
+[       OK ] Unsigned/TypedTestP/0.Success
+[ RUN      ] Unsigned/TypedTestP/0.Failure
+gtest_output_test_.cc:#: Failure
+Value of: TypeParam()
+  Actual: '\0'
+Expected: 1U
+Which is: 1
+Expected failure
+[  FAILED  ] Unsigned/TypedTestP/0.Failure, where TypeParam = unsigned char
+[----------] 2 tests from Unsigned/TypedTestP/1, where TypeParam = unsigned int
+[ RUN      ] Unsigned/TypedTestP/1.Success
+[       OK ] Unsigned/TypedTestP/1.Success
+[ RUN      ] Unsigned/TypedTestP/1.Failure
+gtest_output_test_.cc:#: Failure
+Value of: TypeParam()
+  Actual: 0
+Expected: 1U
+Which is: 1
+Expected failure
+[  FAILED  ] Unsigned/TypedTestP/1.Failure, where TypeParam = unsigned int
+[----------] 4 tests from ExpectFailureTest
+[ RUN      ] ExpectFailureTest.ExpectFatalFailure
+(expecting 1 failure)
+gtest.cc:#: Failure
+Expected: 1 fatal failure
+  Actual:
+gtest_output_test_.cc:#: Success:
+Succeeded
+
+(expecting 1 failure)
+gtest.cc:#: Failure
+Expected: 1 fatal failure
+  Actual:
+gtest_output_test_.cc:#: Non-fatal failure:
+Failed
+Expected non-fatal failure.
+
+(expecting 1 failure)
+gtest.cc:#: Failure
+Expected: 1 fatal failure containing "Some other fatal failure expected."
+  Actual:
+gtest_output_test_.cc:#: Fatal failure:
+Failed
+Expected fatal failure.
+
+[  FAILED  ] ExpectFailureTest.ExpectFatalFailure
+[ RUN      ] ExpectFailureTest.ExpectNonFatalFailure
+(expecting 1 failure)
+gtest.cc:#: Failure
+Expected: 1 non-fatal failure
+  Actual:
+gtest_output_test_.cc:#: Success:
+Succeeded
+
+(expecting 1 failure)
+gtest.cc:#: Failure
+Expected: 1 non-fatal failure
+  Actual:
+gtest_output_test_.cc:#: Fatal failure:
+Failed
+Expected fatal failure.
+
+(expecting 1 failure)
+gtest.cc:#: Failure
+Expected: 1 non-fatal failure containing "Some other non-fatal failure."
+  Actual:
+gtest_output_test_.cc:#: Non-fatal failure:
+Failed
+Expected non-fatal failure.
+
+[  FAILED  ] ExpectFailureTest.ExpectNonFatalFailure
+[ RUN      ] ExpectFailureTest.ExpectFatalFailureOnAllThreads
+(expecting 1 failure)
+gtest.cc:#: Failure
+Expected: 1 fatal failure
+  Actual:
+gtest_output_test_.cc:#: Success:
+Succeeded
+
+(expecting 1 failure)
+gtest.cc:#: Failure
+Expected: 1 fatal failure
+  Actual:
+gtest_output_test_.cc:#: Non-fatal failure:
+Failed
+Expected non-fatal failure.
+
+(expecting 1 failure)
+gtest.cc:#: Failure
+Expected: 1 fatal failure containing "Some other fatal failure expected."
+  Actual:
+gtest_output_test_.cc:#: Fatal failure:
+Failed
+Expected fatal failure.
+
+[  FAILED  ] ExpectFailureTest.ExpectFatalFailureOnAllThreads
+[ RUN      ] ExpectFailureTest.ExpectNonFatalFailureOnAllThreads
+(expecting 1 failure)
+gtest.cc:#: Failure
+Expected: 1 non-fatal failure
+  Actual:
+gtest_output_test_.cc:#: Success:
+Succeeded
+
+(expecting 1 failure)
+gtest.cc:#: Failure
+Expected: 1 non-fatal failure
+  Actual:
+gtest_output_test_.cc:#: Fatal failure:
+Failed
+Expected fatal failure.
+
+(expecting 1 failure)
+gtest.cc:#: Failure
+Expected: 1 non-fatal failure containing "Some other non-fatal failure."
+  Actual:
+gtest_output_test_.cc:#: Non-fatal failure:
+Failed
+Expected non-fatal failure.
+
+[  FAILED  ] ExpectFailureTest.ExpectNonFatalFailureOnAllThreads
+[----------] 2 tests from ExpectFailureWithThreadsTest
+[ RUN      ] ExpectFailureWithThreadsTest.ExpectFatalFailure
+(expecting 2 failures)
+gtest_output_test_.cc:#: Failure
+Failed
+Expected fatal failure.
+gtest.cc:#: Failure
+Expected: 1 fatal failure
+  Actual: 0 failures
+[  FAILED  ] ExpectFailureWithThreadsTest.ExpectFatalFailure
+[ RUN      ] ExpectFailureWithThreadsTest.ExpectNonFatalFailure
+(expecting 2 failures)
+gtest_output_test_.cc:#: Failure
+Failed
+Expected non-fatal failure.
+gtest.cc:#: Failure
+Expected: 1 non-fatal failure
+  Actual: 0 failures
+[  FAILED  ] ExpectFailureWithThreadsTest.ExpectNonFatalFailure
+[----------] 1 test from ScopedFakeTestPartResultReporterTest
+[ RUN      ] ScopedFakeTestPartResultReporterTest.InterceptOnlyCurrentThread
+(expecting 2 failures)
+gtest_output_test_.cc:#: Failure
+Failed
+Expected fatal failure.
+gtest_output_test_.cc:#: Failure
+Failed
+Expected non-fatal failure.
+[  FAILED  ] ScopedFakeTestPartResultReporterTest.InterceptOnlyCurrentThread
+[----------] 1 test from PrintingFailingParams/FailingParamTest
+[ RUN      ] PrintingFailingParams/FailingParamTest.Fails/0
+gtest_output_test_.cc:#: Failure
+Value of: GetParam()
+  Actual: 2
+Expected: 1
+[  FAILED  ] PrintingFailingParams/FailingParamTest.Fails/0, where GetParam() = 2
+[----------] Global test environment tear-down
+BarEnvironment::TearDown() called.
+gtest_output_test_.cc:#: Failure
+Failed
+Expected non-fatal failure.
+FooEnvironment::TearDown() called.
+gtest_output_test_.cc:#: Failure
+Failed
+Expected fatal failure.
+[==========] 63 tests from 28 test cases ran.
+[  PASSED  ] 21 tests.
+[  FAILED  ] 42 tests, listed below:
+[  FAILED  ] NonfatalFailureTest.EscapesStringOperands
+[  FAILED  ] FatalFailureTest.FatalFailureInSubroutine
+[  FAILED  ] FatalFailureTest.FatalFailureInNestedSubroutine
+[  FAILED  ] FatalFailureTest.NonfatalFailureInSubroutine
+[  FAILED  ] LoggingTest.InterleavingLoggingAndAssertions
+[  FAILED  ] SCOPED_TRACETest.ObeysScopes
+[  FAILED  ] SCOPED_TRACETest.WorksInLoop
+[  FAILED  ] SCOPED_TRACETest.WorksInSubroutine
+[  FAILED  ] SCOPED_TRACETest.CanBeNested
+[  FAILED  ] SCOPED_TRACETest.CanBeRepeated
+[  FAILED  ] SCOPED_TRACETest.WorksConcurrently
+[  FAILED  ] NonFatalFailureInFixtureConstructorTest.FailureInConstructor
+[  FAILED  ] FatalFailureInFixtureConstructorTest.FailureInConstructor
+[  FAILED  ] NonFatalFailureInSetUpTest.FailureInSetUp
+[  FAILED  ] FatalFailureInSetUpTest.FailureInSetUp
+[  FAILED  ] AddFailureAtTest.MessageContainsSpecifiedFileAndLineNumber
+[  FAILED  ] MixedUpTestCaseTest.ThisShouldFail
+[  FAILED  ] MixedUpTestCaseTest.ThisShouldFailToo
+[  FAILED  ] MixedUpTestCaseWithSameTestNameTest.TheSecondTestWithThisNameShouldFail
+[  FAILED  ] TEST_F_before_TEST_in_same_test_case.DefinedUsingTESTAndShouldFail
+[  FAILED  ] TEST_before_TEST_F_in_same_test_case.DefinedUsingTEST_FAndShouldFail
+[  FAILED  ] ExpectNonfatalFailureTest.FailsWhenThereIsNoNonfatalFailure
+[  FAILED  ] ExpectNonfatalFailureTest.FailsWhenThereAreTwoNonfatalFailures
+[  FAILED  ] ExpectNonfatalFailureTest.FailsWhenThereIsOneFatalFailure
+[  FAILED  ] ExpectNonfatalFailureTest.FailsWhenStatementReturns
+[  FAILED  ] ExpectNonfatalFailureTest.FailsWhenStatementThrows
+[  FAILED  ] ExpectFatalFailureTest.FailsWhenThereIsNoFatalFailure
+[  FAILED  ] ExpectFatalFailureTest.FailsWhenThereAreTwoFatalFailures
+[  FAILED  ] ExpectFatalFailureTest.FailsWhenThereIsOneNonfatalFailure
+[  FAILED  ] ExpectFatalFailureTest.FailsWhenStatementReturns
+[  FAILED  ] ExpectFatalFailureTest.FailsWhenStatementThrows
+[  FAILED  ] TypedTest/0.Failure, where TypeParam = int
+[  FAILED  ] Unsigned/TypedTestP/0.Failure, where TypeParam = unsigned char
+[  FAILED  ] Unsigned/TypedTestP/1.Failure, where TypeParam = unsigned int
+[  FAILED  ] ExpectFailureTest.ExpectFatalFailure
+[  FAILED  ] ExpectFailureTest.ExpectNonFatalFailure
+[  FAILED  ] ExpectFailureTest.ExpectFatalFailureOnAllThreads
+[  FAILED  ] ExpectFailureTest.ExpectNonFatalFailureOnAllThreads
+[  FAILED  ] ExpectFailureWithThreadsTest.ExpectFatalFailure
+[  FAILED  ] ExpectFailureWithThreadsTest.ExpectNonFatalFailure
+[  FAILED  ] ScopedFakeTestPartResultReporterTest.InterceptOnlyCurrentThread
+[  FAILED  ] PrintingFailingParams/FailingParamTest.Fails/0, where GetParam() = 2
+
+42 FAILED TESTS
+  YOU HAVE 1 DISABLED TEST
+
+Note: Google Test filter = FatalFailureTest.*:LoggingTest.*
+[==========] Running 4 tests from 2 test cases.
+[----------] Global test environment set-up.
+[----------] 3 tests from FatalFailureTest
+[ RUN      ] FatalFailureTest.FatalFailureInSubroutine
+(expecting a failure that x should be 1)
+gtest_output_test_.cc:#: Failure
+Value of: x
+  Actual: 2
+Expected: 1
+[  FAILED  ] FatalFailureTest.FatalFailureInSubroutine (? ms)
+[ RUN      ] FatalFailureTest.FatalFailureInNestedSubroutine
+(expecting a failure that x should be 1)
+gtest_output_test_.cc:#: Failure
+Value of: x
+  Actual: 2
+Expected: 1
+[  FAILED  ] FatalFailureTest.FatalFailureInNestedSubroutine (? ms)
+[ RUN      ] FatalFailureTest.NonfatalFailureInSubroutine
+(expecting a failure on false)
+gtest_output_test_.cc:#: Failure
+Value of: false
+  Actual: false
+Expected: true
+[  FAILED  ] FatalFailureTest.NonfatalFailureInSubroutine (? ms)
+[----------] 3 tests from FatalFailureTest (? ms total)
+
+[----------] 1 test from LoggingTest
+[ RUN      ] LoggingTest.InterleavingLoggingAndAssertions
+(expecting 2 failures on (3) >= (a[i]))
+i == 0
+i == 1
+gtest_output_test_.cc:#: Failure
+Expected: (3) >= (a[i]), actual: 3 vs 9
+i == 2
+i == 3
+gtest_output_test_.cc:#: Failure
+Expected: (3) >= (a[i]), actual: 3 vs 6
+[  FAILED  ] LoggingTest.InterleavingLoggingAndAssertions (? ms)
+[----------] 1 test from LoggingTest (? ms total)
+
+[----------] Global test environment tear-down
+[==========] 4 tests from 2 test cases ran. (? ms total)
+[  PASSED  ] 0 tests.
+[  FAILED  ] 4 tests, listed below:
+[  FAILED  ] FatalFailureTest.FatalFailureInSubroutine
+[  FAILED  ] FatalFailureTest.FatalFailureInNestedSubroutine
+[  FAILED  ] FatalFailureTest.NonfatalFailureInSubroutine
+[  FAILED  ] LoggingTest.InterleavingLoggingAndAssertions
+
+ 4 FAILED TESTS
+Note: Google Test filter = *DISABLED_*
+[==========] Running 1 test from 1 test case.
+[----------] Global test environment set-up.
+[----------] 1 test from DisabledTestsWarningTest
+[ RUN      ] DisabledTestsWarningTest.DISABLED_AlsoRunDisabledTestsFlagSuppressesWarning
+[       OK ] DisabledTestsWarningTest.DISABLED_AlsoRunDisabledTestsFlagSuppressesWarning
+[----------] Global test environment tear-down
+[==========] 1 test from 1 test case ran.
+[  PASSED  ] 1 test.
+Note: Google Test filter = PassingTest.*
+Note: This is test shard 2 of 2.
+[==========] Running 1 test from 1 test case.
+[----------] Global test environment set-up.
+[----------] 1 test from PassingTest
+[ RUN      ] PassingTest.PassingTest2
+[       OK ] PassingTest.PassingTest2
+[----------] Global test environment tear-down
+[==========] 1 test from 1 test case ran.
+[  PASSED  ] 1 test.
diff --git a/contrib/gtest-1.7.0/test/gtest_pred_impl_unittest.cc b/contrib/gtest-1.7.0/test/gtest_pred_impl_unittest.cc
new file mode 100644
index 0000000..a84eff8
--- /dev/null
+++ b/contrib/gtest-1.7.0/test/gtest_pred_impl_unittest.cc
@@ -0,0 +1,2427 @@
+// Copyright 2006, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+// This file is AUTOMATICALLY GENERATED on 10/31/2011 by command
+// 'gen_gtest_pred_impl.py 5'.  DO NOT EDIT BY HAND!
+
+// Regression test for gtest_pred_impl.h
+//
+// This file is generated by a script and quite long.  If you intend to
+// learn how Google Test works by reading its unit tests, read
+// gtest_unittest.cc instead.
+//
+// This is intended as a regression test for the Google Test predicate
+// assertions.  We compile it as part of the gtest_unittest target
+// only to keep the implementation tidy and compact, as it is quite
+// involved to set up the stage for testing Google Test using Google
+// Test itself.
+//
+// Currently, gtest_unittest takes ~11 seconds to run in the testing
+// daemon.  In the future, if it grows too large and needs much more
+// time to finish, we should consider separating this file into a
+// stand-alone regression test.
+
+#include <iostream>
+
+#include "gtest/gtest.h"
+#include "gtest/gtest-spi.h"
+
+// A user-defined data type.
+struct Bool {
+  explicit Bool(int val) : value(val != 0) {}
+
+  bool operator>(int n) const { return value > Bool(n).value; }
+
+  Bool operator+(const Bool& rhs) const { return Bool(value + rhs.value); }
+
+  bool operator==(const Bool& rhs) const { return value == rhs.value; }
+
+  bool value;
+};
+
+// Enables Bool to be used in assertions.
+std::ostream& operator<<(std::ostream& os, const Bool& x) {
+  return os << (x.value ? "true" : "false");
+}
+
+// Sample functions/functors for testing unary predicate assertions.
+
+// A unary predicate function.
+template <typename T1>
+bool PredFunction1(T1 v1) {
+  return v1 > 0;
+}
+
+// The following two functions are needed to circumvent a bug in
+// gcc 2.95.3, which sometimes has problem with the above template
+// function.
+bool PredFunction1Int(int v1) {
+  return v1 > 0;
+}
+bool PredFunction1Bool(Bool v1) {
+  return v1 > 0;
+}
+
+// A unary predicate functor.
+struct PredFunctor1 {
+  template <typename T1>
+  bool operator()(const T1& v1) {
+    return v1 > 0;
+  }
+};
+
+// A unary predicate-formatter function.
+template <typename T1>
+testing::AssertionResult PredFormatFunction1(const char* e1,
+                                             const T1& v1) {
+  if (PredFunction1(v1))
+    return testing::AssertionSuccess();
+
+  return testing::AssertionFailure()
+      << e1
+      << " is expected to be positive, but evaluates to "
+      << v1 << ".";
+}
+
+// A unary predicate-formatter functor.
+struct PredFormatFunctor1 {
+  template <typename T1>
+  testing::AssertionResult operator()(const char* e1,
+                                      const T1& v1) const {
+    return PredFormatFunction1(e1, v1);
+  }
+};
+
+// Tests for {EXPECT|ASSERT}_PRED_FORMAT1.
+
+class Predicate1Test : public testing::Test {
+ protected:
+  virtual void SetUp() {
+    expected_to_finish_ = true;
+    finished_ = false;
+    n1_ = 0;
+  }
+
+  virtual void TearDown() {
+    // Verifies that each of the predicate's arguments was evaluated
+    // exactly once.
+    EXPECT_EQ(1, n1_) <<
+        "The predicate assertion didn't evaluate argument 2 "
+        "exactly once.";
+
+    // Verifies that the control flow in the test function is expected.
+    if (expected_to_finish_ && !finished_) {
+      FAIL() << "The predicate assertion unexpactedly aborted the test.";
+    } else if (!expected_to_finish_ && finished_) {
+      FAIL() << "The failed predicate assertion didn't abort the test "
+                "as expected.";
+    }
+  }
+
+  // true iff the test function is expected to run to finish.
+  static bool expected_to_finish_;
+
+  // true iff the test function did run to finish.
+  static bool finished_;
+
+  static int n1_;
+};
+
+bool Predicate1Test::expected_to_finish_;
+bool Predicate1Test::finished_;
+int Predicate1Test::n1_;
+
+typedef Predicate1Test EXPECT_PRED_FORMAT1Test;
+typedef Predicate1Test ASSERT_PRED_FORMAT1Test;
+typedef Predicate1Test EXPECT_PRED1Test;
+typedef Predicate1Test ASSERT_PRED1Test;
+
+// Tests a successful EXPECT_PRED1 where the
+// predicate-formatter is a function on a built-in type (int).
+TEST_F(EXPECT_PRED1Test, FunctionOnBuiltInTypeSuccess) {
+  EXPECT_PRED1(PredFunction1Int,
+               ++n1_);
+  finished_ = true;
+}
+
+// Tests a successful EXPECT_PRED1 where the
+// predicate-formatter is a function on a user-defined type (Bool).
+TEST_F(EXPECT_PRED1Test, FunctionOnUserTypeSuccess) {
+  EXPECT_PRED1(PredFunction1Bool,
+               Bool(++n1_));
+  finished_ = true;
+}
+
+// Tests a successful EXPECT_PRED1 where the
+// predicate-formatter is a functor on a built-in type (int).
+TEST_F(EXPECT_PRED1Test, FunctorOnBuiltInTypeSuccess) {
+  EXPECT_PRED1(PredFunctor1(),
+               ++n1_);
+  finished_ = true;
+}
+
+// Tests a successful EXPECT_PRED1 where the
+// predicate-formatter is a functor on a user-defined type (Bool).
+TEST_F(EXPECT_PRED1Test, FunctorOnUserTypeSuccess) {
+  EXPECT_PRED1(PredFunctor1(),
+               Bool(++n1_));
+  finished_ = true;
+}
+
+// Tests a failed EXPECT_PRED1 where the
+// predicate-formatter is a function on a built-in type (int).
+TEST_F(EXPECT_PRED1Test, FunctionOnBuiltInTypeFailure) {
+  EXPECT_NONFATAL_FAILURE({  // NOLINT
+    EXPECT_PRED1(PredFunction1Int,
+                 n1_++);
+    finished_ = true;
+  }, "");
+}
+
+// Tests a failed EXPECT_PRED1 where the
+// predicate-formatter is a function on a user-defined type (Bool).
+TEST_F(EXPECT_PRED1Test, FunctionOnUserTypeFailure) {
+  EXPECT_NONFATAL_FAILURE({  // NOLINT
+    EXPECT_PRED1(PredFunction1Bool,
+                 Bool(n1_++));
+    finished_ = true;
+  }, "");
+}
+
+// Tests a failed EXPECT_PRED1 where the
+// predicate-formatter is a functor on a built-in type (int).
+TEST_F(EXPECT_PRED1Test, FunctorOnBuiltInTypeFailure) {
+  EXPECT_NONFATAL_FAILURE({  // NOLINT
+    EXPECT_PRED1(PredFunctor1(),
+                 n1_++);
+    finished_ = true;
+  }, "");
+}
+
+// Tests a failed EXPECT_PRED1 where the
+// predicate-formatter is a functor on a user-defined type (Bool).
+TEST_F(EXPECT_PRED1Test, FunctorOnUserTypeFailure) {
+  EXPECT_NONFATAL_FAILURE({  // NOLINT
+    EXPECT_PRED1(PredFunctor1(),
+                 Bool(n1_++));
+    finished_ = true;
+  }, "");
+}
+
+// Tests a successful ASSERT_PRED1 where the
+// predicate-formatter is a function on a built-in type (int).
+TEST_F(ASSERT_PRED1Test, FunctionOnBuiltInTypeSuccess) {
+  ASSERT_PRED1(PredFunction1Int,
+               ++n1_);
+  finished_ = true;
+}
+
+// Tests a successful ASSERT_PRED1 where the
+// predicate-formatter is a function on a user-defined type (Bool).
+TEST_F(ASSERT_PRED1Test, FunctionOnUserTypeSuccess) {
+  ASSERT_PRED1(PredFunction1Bool,
+               Bool(++n1_));
+  finished_ = true;
+}
+
+// Tests a successful ASSERT_PRED1 where the
+// predicate-formatter is a functor on a built-in type (int).
+TEST_F(ASSERT_PRED1Test, FunctorOnBuiltInTypeSuccess) {
+  ASSERT_PRED1(PredFunctor1(),
+               ++n1_);
+  finished_ = true;
+}
+
+// Tests a successful ASSERT_PRED1 where the
+// predicate-formatter is a functor on a user-defined type (Bool).
+TEST_F(ASSERT_PRED1Test, FunctorOnUserTypeSuccess) {
+  ASSERT_PRED1(PredFunctor1(),
+               Bool(++n1_));
+  finished_ = true;
+}
+
+// Tests a failed ASSERT_PRED1 where the
+// predicate-formatter is a function on a built-in type (int).
+TEST_F(ASSERT_PRED1Test, FunctionOnBuiltInTypeFailure) {
+  expected_to_finish_ = false;
+  EXPECT_FATAL_FAILURE({  // NOLINT
+    ASSERT_PRED1(PredFunction1Int,
+                 n1_++);
+    finished_ = true;
+  }, "");
+}
+
+// Tests a failed ASSERT_PRED1 where the
+// predicate-formatter is a function on a user-defined type (Bool).
+TEST_F(ASSERT_PRED1Test, FunctionOnUserTypeFailure) {
+  expected_to_finish_ = false;
+  EXPECT_FATAL_FAILURE({  // NOLINT
+    ASSERT_PRED1(PredFunction1Bool,
+                 Bool(n1_++));
+    finished_ = true;
+  }, "");
+}
+
+// Tests a failed ASSERT_PRED1 where the
+// predicate-formatter is a functor on a built-in type (int).
+TEST_F(ASSERT_PRED1Test, FunctorOnBuiltInTypeFailure) {
+  expected_to_finish_ = false;
+  EXPECT_FATAL_FAILURE({  // NOLINT
+    ASSERT_PRED1(PredFunctor1(),
+                 n1_++);
+    finished_ = true;
+  }, "");
+}
+
+// Tests a failed ASSERT_PRED1 where the
+// predicate-formatter is a functor on a user-defined type (Bool).
+TEST_F(ASSERT_PRED1Test, FunctorOnUserTypeFailure) {
+  expected_to_finish_ = false;
+  EXPECT_FATAL_FAILURE({  // NOLINT
+    ASSERT_PRED1(PredFunctor1(),
+                 Bool(n1_++));
+    finished_ = true;
+  }, "");
+}
+
+// Tests a successful EXPECT_PRED_FORMAT1 where the
+// predicate-formatter is a function on a built-in type (int).
+TEST_F(EXPECT_PRED_FORMAT1Test, FunctionOnBuiltInTypeSuccess) {
+  EXPECT_PRED_FORMAT1(PredFormatFunction1,
+                      ++n1_);
+  finished_ = true;
+}
+
+// Tests a successful EXPECT_PRED_FORMAT1 where the
+// predicate-formatter is a function on a user-defined type (Bool).
+TEST_F(EXPECT_PRED_FORMAT1Test, FunctionOnUserTypeSuccess) {
+  EXPECT_PRED_FORMAT1(PredFormatFunction1,
+                      Bool(++n1_));
+  finished_ = true;
+}
+
+// Tests a successful EXPECT_PRED_FORMAT1 where the
+// predicate-formatter is a functor on a built-in type (int).
+TEST_F(EXPECT_PRED_FORMAT1Test, FunctorOnBuiltInTypeSuccess) {
+  EXPECT_PRED_FORMAT1(PredFormatFunctor1(),
+                      ++n1_);
+  finished_ = true;
+}
+
+// Tests a successful EXPECT_PRED_FORMAT1 where the
+// predicate-formatter is a functor on a user-defined type (Bool).
+TEST_F(EXPECT_PRED_FORMAT1Test, FunctorOnUserTypeSuccess) {
+  EXPECT_PRED_FORMAT1(PredFormatFunctor1(),
+                      Bool(++n1_));
+  finished_ = true;
+}
+
+// Tests a failed EXPECT_PRED_FORMAT1 where the
+// predicate-formatter is a function on a built-in type (int).
+TEST_F(EXPECT_PRED_FORMAT1Test, FunctionOnBuiltInTypeFailure) {
+  EXPECT_NONFATAL_FAILURE({  // NOLINT
+    EXPECT_PRED_FORMAT1(PredFormatFunction1,
+                        n1_++);
+    finished_ = true;
+  }, "");
+}
+
+// Tests a failed EXPECT_PRED_FORMAT1 where the
+// predicate-formatter is a function on a user-defined type (Bool).
+TEST_F(EXPECT_PRED_FORMAT1Test, FunctionOnUserTypeFailure) {
+  EXPECT_NONFATAL_FAILURE({  // NOLINT
+    EXPECT_PRED_FORMAT1(PredFormatFunction1,
+                        Bool(n1_++));
+    finished_ = true;
+  }, "");
+}
+
+// Tests a failed EXPECT_PRED_FORMAT1 where the
+// predicate-formatter is a functor on a built-in type (int).
+TEST_F(EXPECT_PRED_FORMAT1Test, FunctorOnBuiltInTypeFailure) {
+  EXPECT_NONFATAL_FAILURE({  // NOLINT
+    EXPECT_PRED_FORMAT1(PredFormatFunctor1(),
+                        n1_++);
+    finished_ = true;
+  }, "");
+}
+
+// Tests a failed EXPECT_PRED_FORMAT1 where the
+// predicate-formatter is a functor on a user-defined type (Bool).
+TEST_F(EXPECT_PRED_FORMAT1Test, FunctorOnUserTypeFailure) {
+  EXPECT_NONFATAL_FAILURE({  // NOLINT
+    EXPECT_PRED_FORMAT1(PredFormatFunctor1(),
+                        Bool(n1_++));
+    finished_ = true;
+  }, "");
+}
+
+// Tests a successful ASSERT_PRED_FORMAT1 where the
+// predicate-formatter is a function on a built-in type (int).
+TEST_F(ASSERT_PRED_FORMAT1Test, FunctionOnBuiltInTypeSuccess) {
+  ASSERT_PRED_FORMAT1(PredFormatFunction1,
+                      ++n1_);
+  finished_ = true;
+}
+
+// Tests a successful ASSERT_PRED_FORMAT1 where the
+// predicate-formatter is a function on a user-defined type (Bool).
+TEST_F(ASSERT_PRED_FORMAT1Test, FunctionOnUserTypeSuccess) {
+  ASSERT_PRED_FORMAT1(PredFormatFunction1,
+                      Bool(++n1_));
+  finished_ = true;
+}
+
+// Tests a successful ASSERT_PRED_FORMAT1 where the
+// predicate-formatter is a functor on a built-in type (int).
+TEST_F(ASSERT_PRED_FORMAT1Test, FunctorOnBuiltInTypeSuccess) {
+  ASSERT_PRED_FORMAT1(PredFormatFunctor1(),
+                      ++n1_);
+  finished_ = true;
+}
+
+// Tests a successful ASSERT_PRED_FORMAT1 where the
+// predicate-formatter is a functor on a user-defined type (Bool).
+TEST_F(ASSERT_PRED_FORMAT1Test, FunctorOnUserTypeSuccess) {
+  ASSERT_PRED_FORMAT1(PredFormatFunctor1(),
+                      Bool(++n1_));
+  finished_ = true;
+}
+
+// Tests a failed ASSERT_PRED_FORMAT1 where the
+// predicate-formatter is a function on a built-in type (int).
+TEST_F(ASSERT_PRED_FORMAT1Test, FunctionOnBuiltInTypeFailure) {
+  expected_to_finish_ = false;
+  EXPECT_FATAL_FAILURE({  // NOLINT
+    ASSERT_PRED_FORMAT1(PredFormatFunction1,
+                        n1_++);
+    finished_ = true;
+  }, "");
+}
+
+// Tests a failed ASSERT_PRED_FORMAT1 where the
+// predicate-formatter is a function on a user-defined type (Bool).
+TEST_F(ASSERT_PRED_FORMAT1Test, FunctionOnUserTypeFailure) {
+  expected_to_finish_ = false;
+  EXPECT_FATAL_FAILURE({  // NOLINT
+    ASSERT_PRED_FORMAT1(PredFormatFunction1,
+                        Bool(n1_++));
+    finished_ = true;
+  }, "");
+}
+
+// Tests a failed ASSERT_PRED_FORMAT1 where the
+// predicate-formatter is a functor on a built-in type (int).
+TEST_F(ASSERT_PRED_FORMAT1Test, FunctorOnBuiltInTypeFailure) {
+  expected_to_finish_ = false;
+  EXPECT_FATAL_FAILURE({  // NOLINT
+    ASSERT_PRED_FORMAT1(PredFormatFunctor1(),
+                        n1_++);
+    finished_ = true;
+  }, "");
+}
+
+// Tests a failed ASSERT_PRED_FORMAT1 where the
+// predicate-formatter is a functor on a user-defined type (Bool).
+TEST_F(ASSERT_PRED_FORMAT1Test, FunctorOnUserTypeFailure) {
+  expected_to_finish_ = false;
+  EXPECT_FATAL_FAILURE({  // NOLINT
+    ASSERT_PRED_FORMAT1(PredFormatFunctor1(),
+                        Bool(n1_++));
+    finished_ = true;
+  }, "");
+}
+// Sample functions/functors for testing binary predicate assertions.
+
+// A binary predicate function.
+template <typename T1, typename T2>
+bool PredFunction2(T1 v1, T2 v2) {
+  return v1 + v2 > 0;
+}
+
+// The following two functions are needed to circumvent a bug in
+// gcc 2.95.3, which sometimes has problem with the above template
+// function.
+bool PredFunction2Int(int v1, int v2) {
+  return v1 + v2 > 0;
+}
+bool PredFunction2Bool(Bool v1, Bool v2) {
+  return v1 + v2 > 0;
+}
+
+// A binary predicate functor.
+struct PredFunctor2 {
+  template <typename T1, typename T2>
+  bool operator()(const T1& v1,
+                  const T2& v2) {
+    return v1 + v2 > 0;
+  }
+};
+
+// A binary predicate-formatter function.
+template <typename T1, typename T2>
+testing::AssertionResult PredFormatFunction2(const char* e1,
+                                             const char* e2,
+                                             const T1& v1,
+                                             const T2& v2) {
+  if (PredFunction2(v1, v2))
+    return testing::AssertionSuccess();
+
+  return testing::AssertionFailure()
+      << e1 << " + " << e2
+      << " is expected to be positive, but evaluates to "
+      << v1 + v2 << ".";
+}
+
+// A binary predicate-formatter functor.
+struct PredFormatFunctor2 {
+  template <typename T1, typename T2>
+  testing::AssertionResult operator()(const char* e1,
+                                      const char* e2,
+                                      const T1& v1,
+                                      const T2& v2) const {
+    return PredFormatFunction2(e1, e2, v1, v2);
+  }
+};
+
+// Tests for {EXPECT|ASSERT}_PRED_FORMAT2.
+
+class Predicate2Test : public testing::Test {
+ protected:
+  virtual void SetUp() {
+    expected_to_finish_ = true;
+    finished_ = false;
+    n1_ = n2_ = 0;
+  }
+
+  virtual void TearDown() {
+    // Verifies that each of the predicate's arguments was evaluated
+    // exactly once.
+    EXPECT_EQ(1, n1_) <<
+        "The predicate assertion didn't evaluate argument 2 "
+        "exactly once.";
+    EXPECT_EQ(1, n2_) <<
+        "The predicate assertion didn't evaluate argument 3 "
+        "exactly once.";
+
+    // Verifies that the control flow in the test function is expected.
+    if (expected_to_finish_ && !finished_) {
+      FAIL() << "The predicate assertion unexpactedly aborted the test.";
+    } else if (!expected_to_finish_ && finished_) {
+      FAIL() << "The failed predicate assertion didn't abort the test "
+                "as expected.";
+    }
+  }
+
+  // true iff the test function is expected to run to finish.
+  static bool expected_to_finish_;
+
+  // true iff the test function did run to finish.
+  static bool finished_;
+
+  static int n1_;
+  static int n2_;
+};
+
+bool Predicate2Test::expected_to_finish_;
+bool Predicate2Test::finished_;
+int Predicate2Test::n1_;
+int Predicate2Test::n2_;
+
+typedef Predicate2Test EXPECT_PRED_FORMAT2Test;
+typedef Predicate2Test ASSERT_PRED_FORMAT2Test;
+typedef Predicate2Test EXPECT_PRED2Test;
+typedef Predicate2Test ASSERT_PRED2Test;
+
+// Tests a successful EXPECT_PRED2 where the
+// predicate-formatter is a function on a built-in type (int).
+TEST_F(EXPECT_PRED2Test, FunctionOnBuiltInTypeSuccess) {
+  EXPECT_PRED2(PredFunction2Int,
+               ++n1_,
+               ++n2_);
+  finished_ = true;
+}
+
+// Tests a successful EXPECT_PRED2 where the
+// predicate-formatter is a function on a user-defined type (Bool).
+TEST_F(EXPECT_PRED2Test, FunctionOnUserTypeSuccess) {
+  EXPECT_PRED2(PredFunction2Bool,
+               Bool(++n1_),
+               Bool(++n2_));
+  finished_ = true;
+}
+
+// Tests a successful EXPECT_PRED2 where the
+// predicate-formatter is a functor on a built-in type (int).
+TEST_F(EXPECT_PRED2Test, FunctorOnBuiltInTypeSuccess) {
+  EXPECT_PRED2(PredFunctor2(),
+               ++n1_,
+               ++n2_);
+  finished_ = true;
+}
+
+// Tests a successful EXPECT_PRED2 where the
+// predicate-formatter is a functor on a user-defined type (Bool).
+TEST_F(EXPECT_PRED2Test, FunctorOnUserTypeSuccess) {
+  EXPECT_PRED2(PredFunctor2(),
+               Bool(++n1_),
+               Bool(++n2_));
+  finished_ = true;
+}
+
+// Tests a failed EXPECT_PRED2 where the
+// predicate-formatter is a function on a built-in type (int).
+TEST_F(EXPECT_PRED2Test, FunctionOnBuiltInTypeFailure) {
+  EXPECT_NONFATAL_FAILURE({  // NOLINT
+    EXPECT_PRED2(PredFunction2Int,
+                 n1_++,
+                 n2_++);
+    finished_ = true;
+  }, "");
+}
+
+// Tests a failed EXPECT_PRED2 where the
+// predicate-formatter is a function on a user-defined type (Bool).
+TEST_F(EXPECT_PRED2Test, FunctionOnUserTypeFailure) {
+  EXPECT_NONFATAL_FAILURE({  // NOLINT
+    EXPECT_PRED2(PredFunction2Bool,
+                 Bool(n1_++),
+                 Bool(n2_++));
+    finished_ = true;
+  }, "");
+}
+
+// Tests a failed EXPECT_PRED2 where the
+// predicate-formatter is a functor on a built-in type (int).
+TEST_F(EXPECT_PRED2Test, FunctorOnBuiltInTypeFailure) {
+  EXPECT_NONFATAL_FAILURE({  // NOLINT
+    EXPECT_PRED2(PredFunctor2(),
+                 n1_++,
+                 n2_++);
+    finished_ = true;
+  }, "");
+}
+
+// Tests a failed EXPECT_PRED2 where the
+// predicate-formatter is a functor on a user-defined type (Bool).
+TEST_F(EXPECT_PRED2Test, FunctorOnUserTypeFailure) {
+  EXPECT_NONFATAL_FAILURE({  // NOLINT
+    EXPECT_PRED2(PredFunctor2(),
+                 Bool(n1_++),
+                 Bool(n2_++));
+    finished_ = true;
+  }, "");
+}
+
+// Tests a successful ASSERT_PRED2 where the
+// predicate-formatter is a function on a built-in type (int).
+TEST_F(ASSERT_PRED2Test, FunctionOnBuiltInTypeSuccess) {
+  ASSERT_PRED2(PredFunction2Int,
+               ++n1_,
+               ++n2_);
+  finished_ = true;
+}
+
+// Tests a successful ASSERT_PRED2 where the
+// predicate-formatter is a function on a user-defined type (Bool).
+TEST_F(ASSERT_PRED2Test, FunctionOnUserTypeSuccess) {
+  ASSERT_PRED2(PredFunction2Bool,
+               Bool(++n1_),
+               Bool(++n2_));
+  finished_ = true;
+}
+
+// Tests a successful ASSERT_PRED2 where the
+// predicate-formatter is a functor on a built-in type (int).
+TEST_F(ASSERT_PRED2Test, FunctorOnBuiltInTypeSuccess) {
+  ASSERT_PRED2(PredFunctor2(),
+               ++n1_,
+               ++n2_);
+  finished_ = true;
+}
+
+// Tests a successful ASSERT_PRED2 where the
+// predicate-formatter is a functor on a user-defined type (Bool).
+TEST_F(ASSERT_PRED2Test, FunctorOnUserTypeSuccess) {
+  ASSERT_PRED2(PredFunctor2(),
+               Bool(++n1_),
+               Bool(++n2_));
+  finished_ = true;
+}
+
+// Tests a failed ASSERT_PRED2 where the
+// predicate-formatter is a function on a built-in type (int).
+TEST_F(ASSERT_PRED2Test, FunctionOnBuiltInTypeFailure) {
+  expected_to_finish_ = false;
+  EXPECT_FATAL_FAILURE({  // NOLINT
+    ASSERT_PRED2(PredFunction2Int,
+                 n1_++,
+                 n2_++);
+    finished_ = true;
+  }, "");
+}
+
+// Tests a failed ASSERT_PRED2 where the
+// predicate-formatter is a function on a user-defined type (Bool).
+TEST_F(ASSERT_PRED2Test, FunctionOnUserTypeFailure) {
+  expected_to_finish_ = false;
+  EXPECT_FATAL_FAILURE({  // NOLINT
+    ASSERT_PRED2(PredFunction2Bool,
+                 Bool(n1_++),
+                 Bool(n2_++));
+    finished_ = true;
+  }, "");
+}
+
+// Tests a failed ASSERT_PRED2 where the
+// predicate-formatter is a functor on a built-in type (int).
+TEST_F(ASSERT_PRED2Test, FunctorOnBuiltInTypeFailure) {
+  expected_to_finish_ = false;
+  EXPECT_FATAL_FAILURE({  // NOLINT
+    ASSERT_PRED2(PredFunctor2(),
+                 n1_++,
+                 n2_++);
+    finished_ = true;
+  }, "");
+}
+
+// Tests a failed ASSERT_PRED2 where the
+// predicate-formatter is a functor on a user-defined type (Bool).
+TEST_F(ASSERT_PRED2Test, FunctorOnUserTypeFailure) {
+  expected_to_finish_ = false;
+  EXPECT_FATAL_FAILURE({  // NOLINT
+    ASSERT_PRED2(PredFunctor2(),
+                 Bool(n1_++),
+                 Bool(n2_++));
+    finished_ = true;
+  }, "");
+}
+
+// Tests a successful EXPECT_PRED_FORMAT2 where the
+// predicate-formatter is a function on a built-in type (int).
+TEST_F(EXPECT_PRED_FORMAT2Test, FunctionOnBuiltInTypeSuccess) {
+  EXPECT_PRED_FORMAT2(PredFormatFunction2,
+                      ++n1_,
+                      ++n2_);
+  finished_ = true;
+}
+
+// Tests a successful EXPECT_PRED_FORMAT2 where the
+// predicate-formatter is a function on a user-defined type (Bool).
+TEST_F(EXPECT_PRED_FORMAT2Test, FunctionOnUserTypeSuccess) {
+  EXPECT_PRED_FORMAT2(PredFormatFunction2,
+                      Bool(++n1_),
+                      Bool(++n2_));
+  finished_ = true;
+}
+
+// Tests a successful EXPECT_PRED_FORMAT2 where the
+// predicate-formatter is a functor on a built-in type (int).
+TEST_F(EXPECT_PRED_FORMAT2Test, FunctorOnBuiltInTypeSuccess) {
+  EXPECT_PRED_FORMAT2(PredFormatFunctor2(),
+                      ++n1_,
+                      ++n2_);
+  finished_ = true;
+}
+
+// Tests a successful EXPECT_PRED_FORMAT2 where the
+// predicate-formatter is a functor on a user-defined type (Bool).
+TEST_F(EXPECT_PRED_FORMAT2Test, FunctorOnUserTypeSuccess) {
+  EXPECT_PRED_FORMAT2(PredFormatFunctor2(),
+                      Bool(++n1_),
+                      Bool(++n2_));
+  finished_ = true;
+}
+
+// Tests a failed EXPECT_PRED_FORMAT2 where the
+// predicate-formatter is a function on a built-in type (int).
+TEST_F(EXPECT_PRED_FORMAT2Test, FunctionOnBuiltInTypeFailure) {
+  EXPECT_NONFATAL_FAILURE({  // NOLINT
+    EXPECT_PRED_FORMAT2(PredFormatFunction2,
+                        n1_++,
+                        n2_++);
+    finished_ = true;
+  }, "");
+}
+
+// Tests a failed EXPECT_PRED_FORMAT2 where the
+// predicate-formatter is a function on a user-defined type (Bool).
+TEST_F(EXPECT_PRED_FORMAT2Test, FunctionOnUserTypeFailure) {
+  EXPECT_NONFATAL_FAILURE({  // NOLINT
+    EXPECT_PRED_FORMAT2(PredFormatFunction2,
+                        Bool(n1_++),
+                        Bool(n2_++));
+    finished_ = true;
+  }, "");
+}
+
+// Tests a failed EXPECT_PRED_FORMAT2 where the
+// predicate-formatter is a functor on a built-in type (int).
+TEST_F(EXPECT_PRED_FORMAT2Test, FunctorOnBuiltInTypeFailure) {
+  EXPECT_NONFATAL_FAILURE({  // NOLINT
+    EXPECT_PRED_FORMAT2(PredFormatFunctor2(),
+                        n1_++,
+                        n2_++);
+    finished_ = true;
+  }, "");
+}
+
+// Tests a failed EXPECT_PRED_FORMAT2 where the
+// predicate-formatter is a functor on a user-defined type (Bool).
+TEST_F(EXPECT_PRED_FORMAT2Test, FunctorOnUserTypeFailure) {
+  EXPECT_NONFATAL_FAILURE({  // NOLINT
+    EXPECT_PRED_FORMAT2(PredFormatFunctor2(),
+                        Bool(n1_++),
+                        Bool(n2_++));
+    finished_ = true;
+  }, "");
+}
+
+// Tests a successful ASSERT_PRED_FORMAT2 where the
+// predicate-formatter is a function on a built-in type (int).
+TEST_F(ASSERT_PRED_FORMAT2Test, FunctionOnBuiltInTypeSuccess) {
+  ASSERT_PRED_FORMAT2(PredFormatFunction2,
+                      ++n1_,
+                      ++n2_);
+  finished_ = true;
+}
+
+// Tests a successful ASSERT_PRED_FORMAT2 where the
+// predicate-formatter is a function on a user-defined type (Bool).
+TEST_F(ASSERT_PRED_FORMAT2Test, FunctionOnUserTypeSuccess) {
+  ASSERT_PRED_FORMAT2(PredFormatFunction2,
+                      Bool(++n1_),
+                      Bool(++n2_));
+  finished_ = true;
+}
+
+// Tests a successful ASSERT_PRED_FORMAT2 where the
+// predicate-formatter is a functor on a built-in type (int).
+TEST_F(ASSERT_PRED_FORMAT2Test, FunctorOnBuiltInTypeSuccess) {
+  ASSERT_PRED_FORMAT2(PredFormatFunctor2(),
+                      ++n1_,
+                      ++n2_);
+  finished_ = true;
+}
+
+// Tests a successful ASSERT_PRED_FORMAT2 where the
+// predicate-formatter is a functor on a user-defined type (Bool).
+TEST_F(ASSERT_PRED_FORMAT2Test, FunctorOnUserTypeSuccess) {
+  ASSERT_PRED_FORMAT2(PredFormatFunctor2(),
+                      Bool(++n1_),
+                      Bool(++n2_));
+  finished_ = true;
+}
+
+// Tests a failed ASSERT_PRED_FORMAT2 where the
+// predicate-formatter is a function on a built-in type (int).
+TEST_F(ASSERT_PRED_FORMAT2Test, FunctionOnBuiltInTypeFailure) {
+  expected_to_finish_ = false;
+  EXPECT_FATAL_FAILURE({  // NOLINT
+    ASSERT_PRED_FORMAT2(PredFormatFunction2,
+                        n1_++,
+                        n2_++);
+    finished_ = true;
+  }, "");
+}
+
+// Tests a failed ASSERT_PRED_FORMAT2 where the
+// predicate-formatter is a function on a user-defined type (Bool).
+TEST_F(ASSERT_PRED_FORMAT2Test, FunctionOnUserTypeFailure) {
+  expected_to_finish_ = false;
+  EXPECT_FATAL_FAILURE({  // NOLINT
+    ASSERT_PRED_FORMAT2(PredFormatFunction2,
+                        Bool(n1_++),
+                        Bool(n2_++));
+    finished_ = true;
+  }, "");
+}
+
+// Tests a failed ASSERT_PRED_FORMAT2 where the
+// predicate-formatter is a functor on a built-in type (int).
+TEST_F(ASSERT_PRED_FORMAT2Test, FunctorOnBuiltInTypeFailure) {
+  expected_to_finish_ = false;
+  EXPECT_FATAL_FAILURE({  // NOLINT
+    ASSERT_PRED_FORMAT2(PredFormatFunctor2(),
+                        n1_++,
+                        n2_++);
+    finished_ = true;
+  }, "");
+}
+
+// Tests a failed ASSERT_PRED_FORMAT2 where the
+// predicate-formatter is a functor on a user-defined type (Bool).
+TEST_F(ASSERT_PRED_FORMAT2Test, FunctorOnUserTypeFailure) {
+  expected_to_finish_ = false;
+  EXPECT_FATAL_FAILURE({  // NOLINT
+    ASSERT_PRED_FORMAT2(PredFormatFunctor2(),
+                        Bool(n1_++),
+                        Bool(n2_++));
+    finished_ = true;
+  }, "");
+}
+// Sample functions/functors for testing ternary predicate assertions.
+
+// A ternary predicate function.
+template <typename T1, typename T2, typename T3>
+bool PredFunction3(T1 v1, T2 v2, T3 v3) {
+  return v1 + v2 + v3 > 0;
+}
+
+// The following two functions are needed to circumvent a bug in
+// gcc 2.95.3, which sometimes has problem with the above template
+// function.
+bool PredFunction3Int(int v1, int v2, int v3) {
+  return v1 + v2 + v3 > 0;
+}
+bool PredFunction3Bool(Bool v1, Bool v2, Bool v3) {
+  return v1 + v2 + v3 > 0;
+}
+
+// A ternary predicate functor.
+struct PredFunctor3 {
+  template <typename T1, typename T2, typename T3>
+  bool operator()(const T1& v1,
+                  const T2& v2,
+                  const T3& v3) {
+    return v1 + v2 + v3 > 0;
+  }
+};
+
+// A ternary predicate-formatter function.
+template <typename T1, typename T2, typename T3>
+testing::AssertionResult PredFormatFunction3(const char* e1,
+                                             const char* e2,
+                                             const char* e3,
+                                             const T1& v1,
+                                             const T2& v2,
+                                             const T3& v3) {
+  if (PredFunction3(v1, v2, v3))
+    return testing::AssertionSuccess();
+
+  return testing::AssertionFailure()
+      << e1 << " + " << e2 << " + " << e3
+      << " is expected to be positive, but evaluates to "
+      << v1 + v2 + v3 << ".";
+}
+
+// A ternary predicate-formatter functor.
+struct PredFormatFunctor3 {
+  template <typename T1, typename T2, typename T3>
+  testing::AssertionResult operator()(const char* e1,
+                                      const char* e2,
+                                      const char* e3,
+                                      const T1& v1,
+                                      const T2& v2,
+                                      const T3& v3) const {
+    return PredFormatFunction3(e1, e2, e3, v1, v2, v3);
+  }
+};
+
+// Tests for {EXPECT|ASSERT}_PRED_FORMAT3.
+
+class Predicate3Test : public testing::Test {
+ protected:
+  virtual void SetUp() {
+    expected_to_finish_ = true;
+    finished_ = false;
+    n1_ = n2_ = n3_ = 0;
+  }
+
+  virtual void TearDown() {
+    // Verifies that each of the predicate's arguments was evaluated
+    // exactly once.
+    EXPECT_EQ(1, n1_) <<
+        "The predicate assertion didn't evaluate argument 2 "
+        "exactly once.";
+    EXPECT_EQ(1, n2_) <<
+        "The predicate assertion didn't evaluate argument 3 "
+        "exactly once.";
+    EXPECT_EQ(1, n3_) <<
+        "The predicate assertion didn't evaluate argument 4 "
+        "exactly once.";
+
+    // Verifies that the control flow in the test function is expected.
+    if (expected_to_finish_ && !finished_) {
+      FAIL() << "The predicate assertion unexpactedly aborted the test.";
+    } else if (!expected_to_finish_ && finished_) {
+      FAIL() << "The failed predicate assertion didn't abort the test "
+                "as expected.";
+    }
+  }
+
+  // true iff the test function is expected to run to finish.
+  static bool expected_to_finish_;
+
+  // true iff the test function did run to finish.
+  static bool finished_;
+
+  static int n1_;
+  static int n2_;
+  static int n3_;
+};
+
+bool Predicate3Test::expected_to_finish_;
+bool Predicate3Test::finished_;
+int Predicate3Test::n1_;
+int Predicate3Test::n2_;
+int Predicate3Test::n3_;
+
+typedef Predicate3Test EXPECT_PRED_FORMAT3Test;
+typedef Predicate3Test ASSERT_PRED_FORMAT3Test;
+typedef Predicate3Test EXPECT_PRED3Test;
+typedef Predicate3Test ASSERT_PRED3Test;
+
+// Tests a successful EXPECT_PRED3 where the
+// predicate-formatter is a function on a built-in type (int).
+TEST_F(EXPECT_PRED3Test, FunctionOnBuiltInTypeSuccess) {
+  EXPECT_PRED3(PredFunction3Int,
+               ++n1_,
+               ++n2_,
+               ++n3_);
+  finished_ = true;
+}
+
+// Tests a successful EXPECT_PRED3 where the
+// predicate-formatter is a function on a user-defined type (Bool).
+TEST_F(EXPECT_PRED3Test, FunctionOnUserTypeSuccess) {
+  EXPECT_PRED3(PredFunction3Bool,
+               Bool(++n1_),
+               Bool(++n2_),
+               Bool(++n3_));
+  finished_ = true;
+}
+
+// Tests a successful EXPECT_PRED3 where the
+// predicate-formatter is a functor on a built-in type (int).
+TEST_F(EXPECT_PRED3Test, FunctorOnBuiltInTypeSuccess) {
+  EXPECT_PRED3(PredFunctor3(),
+               ++n1_,
+               ++n2_,
+               ++n3_);
+  finished_ = true;
+}
+
+// Tests a successful EXPECT_PRED3 where the
+// predicate-formatter is a functor on a user-defined type (Bool).
+TEST_F(EXPECT_PRED3Test, FunctorOnUserTypeSuccess) {
+  EXPECT_PRED3(PredFunctor3(),
+               Bool(++n1_),
+               Bool(++n2_),
+               Bool(++n3_));
+  finished_ = true;
+}
+
+// Tests a failed EXPECT_PRED3 where the
+// predicate-formatter is a function on a built-in type (int).
+TEST_F(EXPECT_PRED3Test, FunctionOnBuiltInTypeFailure) {
+  EXPECT_NONFATAL_FAILURE({  // NOLINT
+    EXPECT_PRED3(PredFunction3Int,
+                 n1_++,
+                 n2_++,
+                 n3_++);
+    finished_ = true;
+  }, "");
+}
+
+// Tests a failed EXPECT_PRED3 where the
+// predicate-formatter is a function on a user-defined type (Bool).
+TEST_F(EXPECT_PRED3Test, FunctionOnUserTypeFailure) {
+  EXPECT_NONFATAL_FAILURE({  // NOLINT
+    EXPECT_PRED3(PredFunction3Bool,
+                 Bool(n1_++),
+                 Bool(n2_++),
+                 Bool(n3_++));
+    finished_ = true;
+  }, "");
+}
+
+// Tests a failed EXPECT_PRED3 where the
+// predicate-formatter is a functor on a built-in type (int).
+TEST_F(EXPECT_PRED3Test, FunctorOnBuiltInTypeFailure) {
+  EXPECT_NONFATAL_FAILURE({  // NOLINT
+    EXPECT_PRED3(PredFunctor3(),
+                 n1_++,
+                 n2_++,
+                 n3_++);
+    finished_ = true;
+  }, "");
+}
+
+// Tests a failed EXPECT_PRED3 where the
+// predicate-formatter is a functor on a user-defined type (Bool).
+TEST_F(EXPECT_PRED3Test, FunctorOnUserTypeFailure) {
+  EXPECT_NONFATAL_FAILURE({  // NOLINT
+    EXPECT_PRED3(PredFunctor3(),
+                 Bool(n1_++),
+                 Bool(n2_++),
+                 Bool(n3_++));
+    finished_ = true;
+  }, "");
+}
+
+// Tests a successful ASSERT_PRED3 where the
+// predicate-formatter is a function on a built-in type (int).
+TEST_F(ASSERT_PRED3Test, FunctionOnBuiltInTypeSuccess) {
+  ASSERT_PRED3(PredFunction3Int,
+               ++n1_,
+               ++n2_,
+               ++n3_);
+  finished_ = true;
+}
+
+// Tests a successful ASSERT_PRED3 where the
+// predicate-formatter is a function on a user-defined type (Bool).
+TEST_F(ASSERT_PRED3Test, FunctionOnUserTypeSuccess) {
+  ASSERT_PRED3(PredFunction3Bool,
+               Bool(++n1_),
+               Bool(++n2_),
+               Bool(++n3_));
+  finished_ = true;
+}
+
+// Tests a successful ASSERT_PRED3 where the
+// predicate-formatter is a functor on a built-in type (int).
+TEST_F(ASSERT_PRED3Test, FunctorOnBuiltInTypeSuccess) {
+  ASSERT_PRED3(PredFunctor3(),
+               ++n1_,
+               ++n2_,
+               ++n3_);
+  finished_ = true;
+}
+
+// Tests a successful ASSERT_PRED3 where the
+// predicate-formatter is a functor on a user-defined type (Bool).
+TEST_F(ASSERT_PRED3Test, FunctorOnUserTypeSuccess) {
+  ASSERT_PRED3(PredFunctor3(),
+               Bool(++n1_),
+               Bool(++n2_),
+               Bool(++n3_));
+  finished_ = true;
+}
+
+// Tests a failed ASSERT_PRED3 where the
+// predicate-formatter is a function on a built-in type (int).
+TEST_F(ASSERT_PRED3Test, FunctionOnBuiltInTypeFailure) {
+  expected_to_finish_ = false;
+  EXPECT_FATAL_FAILURE({  // NOLINT
+    ASSERT_PRED3(PredFunction3Int,
+                 n1_++,
+                 n2_++,
+                 n3_++);
+    finished_ = true;
+  }, "");
+}
+
+// Tests a failed ASSERT_PRED3 where the
+// predicate-formatter is a function on a user-defined type (Bool).
+TEST_F(ASSERT_PRED3Test, FunctionOnUserTypeFailure) {
+  expected_to_finish_ = false;
+  EXPECT_FATAL_FAILURE({  // NOLINT
+    ASSERT_PRED3(PredFunction3Bool,
+                 Bool(n1_++),
+                 Bool(n2_++),
+                 Bool(n3_++));
+    finished_ = true;
+  }, "");
+}
+
+// Tests a failed ASSERT_PRED3 where the
+// predicate-formatter is a functor on a built-in type (int).
+TEST_F(ASSERT_PRED3Test, FunctorOnBuiltInTypeFailure) {
+  expected_to_finish_ = false;
+  EXPECT_FATAL_FAILURE({  // NOLINT
+    ASSERT_PRED3(PredFunctor3(),
+                 n1_++,
+                 n2_++,
+                 n3_++);
+    finished_ = true;
+  }, "");
+}
+
+// Tests a failed ASSERT_PRED3 where the
+// predicate-formatter is a functor on a user-defined type (Bool).
+TEST_F(ASSERT_PRED3Test, FunctorOnUserTypeFailure) {
+  expected_to_finish_ = false;
+  EXPECT_FATAL_FAILURE({  // NOLINT
+    ASSERT_PRED3(PredFunctor3(),
+                 Bool(n1_++),
+                 Bool(n2_++),
+                 Bool(n3_++));
+    finished_ = true;
+  }, "");
+}
+
+// Tests a successful EXPECT_PRED_FORMAT3 where the
+// predicate-formatter is a function on a built-in type (int).
+TEST_F(EXPECT_PRED_FORMAT3Test, FunctionOnBuiltInTypeSuccess) {
+  EXPECT_PRED_FORMAT3(PredFormatFunction3,
+                      ++n1_,
+                      ++n2_,
+                      ++n3_);
+  finished_ = true;
+}
+
+// Tests a successful EXPECT_PRED_FORMAT3 where the
+// predicate-formatter is a function on a user-defined type (Bool).
+TEST_F(EXPECT_PRED_FORMAT3Test, FunctionOnUserTypeSuccess) {
+  EXPECT_PRED_FORMAT3(PredFormatFunction3,
+                      Bool(++n1_),
+                      Bool(++n2_),
+                      Bool(++n3_));
+  finished_ = true;
+}
+
+// Tests a successful EXPECT_PRED_FORMAT3 where the
+// predicate-formatter is a functor on a built-in type (int).
+TEST_F(EXPECT_PRED_FORMAT3Test, FunctorOnBuiltInTypeSuccess) {
+  EXPECT_PRED_FORMAT3(PredFormatFunctor3(),
+                      ++n1_,
+                      ++n2_,
+                      ++n3_);
+  finished_ = true;
+}
+
+// Tests a successful EXPECT_PRED_FORMAT3 where the
+// predicate-formatter is a functor on a user-defined type (Bool).
+TEST_F(EXPECT_PRED_FORMAT3Test, FunctorOnUserTypeSuccess) {
+  EXPECT_PRED_FORMAT3(PredFormatFunctor3(),
+                      Bool(++n1_),
+                      Bool(++n2_),
+                      Bool(++n3_));
+  finished_ = true;
+}
+
+// Tests a failed EXPECT_PRED_FORMAT3 where the
+// predicate-formatter is a function on a built-in type (int).
+TEST_F(EXPECT_PRED_FORMAT3Test, FunctionOnBuiltInTypeFailure) {
+  EXPECT_NONFATAL_FAILURE({  // NOLINT
+    EXPECT_PRED_FORMAT3(PredFormatFunction3,
+                        n1_++,
+                        n2_++,
+                        n3_++);
+    finished_ = true;
+  }, "");
+}
+
+// Tests a failed EXPECT_PRED_FORMAT3 where the
+// predicate-formatter is a function on a user-defined type (Bool).
+TEST_F(EXPECT_PRED_FORMAT3Test, FunctionOnUserTypeFailure) {
+  EXPECT_NONFATAL_FAILURE({  // NOLINT
+    EXPECT_PRED_FORMAT3(PredFormatFunction3,
+                        Bool(n1_++),
+                        Bool(n2_++),
+                        Bool(n3_++));
+    finished_ = true;
+  }, "");
+}
+
+// Tests a failed EXPECT_PRED_FORMAT3 where the
+// predicate-formatter is a functor on a built-in type (int).
+TEST_F(EXPECT_PRED_FORMAT3Test, FunctorOnBuiltInTypeFailure) {
+  EXPECT_NONFATAL_FAILURE({  // NOLINT
+    EXPECT_PRED_FORMAT3(PredFormatFunctor3(),
+                        n1_++,
+                        n2_++,
+                        n3_++);
+    finished_ = true;
+  }, "");
+}
+
+// Tests a failed EXPECT_PRED_FORMAT3 where the
+// predicate-formatter is a functor on a user-defined type (Bool).
+TEST_F(EXPECT_PRED_FORMAT3Test, FunctorOnUserTypeFailure) {
+  EXPECT_NONFATAL_FAILURE({  // NOLINT
+    EXPECT_PRED_FORMAT3(PredFormatFunctor3(),
+                        Bool(n1_++),
+                        Bool(n2_++),
+                        Bool(n3_++));
+    finished_ = true;
+  }, "");
+}
+
+// Tests a successful ASSERT_PRED_FORMAT3 where the
+// predicate-formatter is a function on a built-in type (int).
+TEST_F(ASSERT_PRED_FORMAT3Test, FunctionOnBuiltInTypeSuccess) {
+  ASSERT_PRED_FORMAT3(PredFormatFunction3,
+                      ++n1_,
+                      ++n2_,
+                      ++n3_);
+  finished_ = true;
+}
+
+// Tests a successful ASSERT_PRED_FORMAT3 where the
+// predicate-formatter is a function on a user-defined type (Bool).
+TEST_F(ASSERT_PRED_FORMAT3Test, FunctionOnUserTypeSuccess) {
+  ASSERT_PRED_FORMAT3(PredFormatFunction3,
+                      Bool(++n1_),
+                      Bool(++n2_),
+                      Bool(++n3_));
+  finished_ = true;
+}
+
+// Tests a successful ASSERT_PRED_FORMAT3 where the
+// predicate-formatter is a functor on a built-in type (int).
+TEST_F(ASSERT_PRED_FORMAT3Test, FunctorOnBuiltInTypeSuccess) {
+  ASSERT_PRED_FORMAT3(PredFormatFunctor3(),
+                      ++n1_,
+                      ++n2_,
+                      ++n3_);
+  finished_ = true;
+}
+
+// Tests a successful ASSERT_PRED_FORMAT3 where the
+// predicate-formatter is a functor on a user-defined type (Bool).
+TEST_F(ASSERT_PRED_FORMAT3Test, FunctorOnUserTypeSuccess) {
+  ASSERT_PRED_FORMAT3(PredFormatFunctor3(),
+                      Bool(++n1_),
+                      Bool(++n2_),
+                      Bool(++n3_));
+  finished_ = true;
+}
+
+// Tests a failed ASSERT_PRED_FORMAT3 where the
+// predicate-formatter is a function on a built-in type (int).
+TEST_F(ASSERT_PRED_FORMAT3Test, FunctionOnBuiltInTypeFailure) {
+  expected_to_finish_ = false;
+  EXPECT_FATAL_FAILURE({  // NOLINT
+    ASSERT_PRED_FORMAT3(PredFormatFunction3,
+                        n1_++,
+                        n2_++,
+                        n3_++);
+    finished_ = true;
+  }, "");
+}
+
+// Tests a failed ASSERT_PRED_FORMAT3 where the
+// predicate-formatter is a function on a user-defined type (Bool).
+TEST_F(ASSERT_PRED_FORMAT3Test, FunctionOnUserTypeFailure) {
+  expected_to_finish_ = false;
+  EXPECT_FATAL_FAILURE({  // NOLINT
+    ASSERT_PRED_FORMAT3(PredFormatFunction3,
+                        Bool(n1_++),
+                        Bool(n2_++),
+                        Bool(n3_++));
+    finished_ = true;
+  }, "");
+}
+
+// Tests a failed ASSERT_PRED_FORMAT3 where the
+// predicate-formatter is a functor on a built-in type (int).
+TEST_F(ASSERT_PRED_FORMAT3Test, FunctorOnBuiltInTypeFailure) {
+  expected_to_finish_ = false;
+  EXPECT_FATAL_FAILURE({  // NOLINT
+    ASSERT_PRED_FORMAT3(PredFormatFunctor3(),
+                        n1_++,
+                        n2_++,
+                        n3_++);
+    finished_ = true;
+  }, "");
+}
+
+// Tests a failed ASSERT_PRED_FORMAT3 where the
+// predicate-formatter is a functor on a user-defined type (Bool).
+TEST_F(ASSERT_PRED_FORMAT3Test, FunctorOnUserTypeFailure) {
+  expected_to_finish_ = false;
+  EXPECT_FATAL_FAILURE({  // NOLINT
+    ASSERT_PRED_FORMAT3(PredFormatFunctor3(),
+                        Bool(n1_++),
+                        Bool(n2_++),
+                        Bool(n3_++));
+    finished_ = true;
+  }, "");
+}
+// Sample functions/functors for testing 4-ary predicate assertions.
+
+// A 4-ary predicate function.
+template <typename T1, typename T2, typename T3, typename T4>
+bool PredFunction4(T1 v1, T2 v2, T3 v3, T4 v4) {
+  return v1 + v2 + v3 + v4 > 0;
+}
+
+// The following two functions are needed to circumvent a bug in
+// gcc 2.95.3, which sometimes has problem with the above template
+// function.
+bool PredFunction4Int(int v1, int v2, int v3, int v4) {
+  return v1 + v2 + v3 + v4 > 0;
+}
+bool PredFunction4Bool(Bool v1, Bool v2, Bool v3, Bool v4) {
+  return v1 + v2 + v3 + v4 > 0;
+}
+
+// A 4-ary predicate functor.
+struct PredFunctor4 {
+  template <typename T1, typename T2, typename T3, typename T4>
+  bool operator()(const T1& v1,
+                  const T2& v2,
+                  const T3& v3,
+                  const T4& v4) {
+    return v1 + v2 + v3 + v4 > 0;
+  }
+};
+
+// A 4-ary predicate-formatter function.
+template <typename T1, typename T2, typename T3, typename T4>
+testing::AssertionResult PredFormatFunction4(const char* e1,
+                                             const char* e2,
+                                             const char* e3,
+                                             const char* e4,
+                                             const T1& v1,
+                                             const T2& v2,
+                                             const T3& v3,
+                                             const T4& v4) {
+  if (PredFunction4(v1, v2, v3, v4))
+    return testing::AssertionSuccess();
+
+  return testing::AssertionFailure()
+      << e1 << " + " << e2 << " + " << e3 << " + " << e4
+      << " is expected to be positive, but evaluates to "
+      << v1 + v2 + v3 + v4 << ".";
+}
+
+// A 4-ary predicate-formatter functor.
+struct PredFormatFunctor4 {
+  template <typename T1, typename T2, typename T3, typename T4>
+  testing::AssertionResult operator()(const char* e1,
+                                      const char* e2,
+                                      const char* e3,
+                                      const char* e4,
+                                      const T1& v1,
+                                      const T2& v2,
+                                      const T3& v3,
+                                      const T4& v4) const {
+    return PredFormatFunction4(e1, e2, e3, e4, v1, v2, v3, v4);
+  }
+};
+
+// Tests for {EXPECT|ASSERT}_PRED_FORMAT4.
+
+class Predicate4Test : public testing::Test {
+ protected:
+  virtual void SetUp() {
+    expected_to_finish_ = true;
+    finished_ = false;
+    n1_ = n2_ = n3_ = n4_ = 0;
+  }
+
+  virtual void TearDown() {
+    // Verifies that each of the predicate's arguments was evaluated
+    // exactly once.
+    EXPECT_EQ(1, n1_) <<
+        "The predicate assertion didn't evaluate argument 2 "
+        "exactly once.";
+    EXPECT_EQ(1, n2_) <<
+        "The predicate assertion didn't evaluate argument 3 "
+        "exactly once.";
+    EXPECT_EQ(1, n3_) <<
+        "The predicate assertion didn't evaluate argument 4 "
+        "exactly once.";
+    EXPECT_EQ(1, n4_) <<
+        "The predicate assertion didn't evaluate argument 5 "
+        "exactly once.";
+
+    // Verifies that the control flow in the test function is expected.
+    if (expected_to_finish_ && !finished_) {
+      FAIL() << "The predicate assertion unexpactedly aborted the test.";
+    } else if (!expected_to_finish_ && finished_) {
+      FAIL() << "The failed predicate assertion didn't abort the test "
+                "as expected.";
+    }
+  }
+
+  // true iff the test function is expected to run to finish.
+  static bool expected_to_finish_;
+
+  // true iff the test function did run to finish.
+  static bool finished_;
+
+  static int n1_;
+  static int n2_;
+  static int n3_;
+  static int n4_;
+};
+
+bool Predicate4Test::expected_to_finish_;
+bool Predicate4Test::finished_;
+int Predicate4Test::n1_;
+int Predicate4Test::n2_;
+int Predicate4Test::n3_;
+int Predicate4Test::n4_;
+
+typedef Predicate4Test EXPECT_PRED_FORMAT4Test;
+typedef Predicate4Test ASSERT_PRED_FORMAT4Test;
+typedef Predicate4Test EXPECT_PRED4Test;
+typedef Predicate4Test ASSERT_PRED4Test;
+
+// Tests a successful EXPECT_PRED4 where the
+// predicate-formatter is a function on a built-in type (int).
+TEST_F(EXPECT_PRED4Test, FunctionOnBuiltInTypeSuccess) {
+  EXPECT_PRED4(PredFunction4Int,
+               ++n1_,
+               ++n2_,
+               ++n3_,
+               ++n4_);
+  finished_ = true;
+}
+
+// Tests a successful EXPECT_PRED4 where the
+// predicate-formatter is a function on a user-defined type (Bool).
+TEST_F(EXPECT_PRED4Test, FunctionOnUserTypeSuccess) {
+  EXPECT_PRED4(PredFunction4Bool,
+               Bool(++n1_),
+               Bool(++n2_),
+               Bool(++n3_),
+               Bool(++n4_));
+  finished_ = true;
+}
+
+// Tests a successful EXPECT_PRED4 where the
+// predicate-formatter is a functor on a built-in type (int).
+TEST_F(EXPECT_PRED4Test, FunctorOnBuiltInTypeSuccess) {
+  EXPECT_PRED4(PredFunctor4(),
+               ++n1_,
+               ++n2_,
+               ++n3_,
+               ++n4_);
+  finished_ = true;
+}
+
+// Tests a successful EXPECT_PRED4 where the
+// predicate-formatter is a functor on a user-defined type (Bool).
+TEST_F(EXPECT_PRED4Test, FunctorOnUserTypeSuccess) {
+  EXPECT_PRED4(PredFunctor4(),
+               Bool(++n1_),
+               Bool(++n2_),
+               Bool(++n3_),
+               Bool(++n4_));
+  finished_ = true;
+}
+
+// Tests a failed EXPECT_PRED4 where the
+// predicate-formatter is a function on a built-in type (int).
+TEST_F(EXPECT_PRED4Test, FunctionOnBuiltInTypeFailure) {
+  EXPECT_NONFATAL_FAILURE({  // NOLINT
+    EXPECT_PRED4(PredFunction4Int,
+                 n1_++,
+                 n2_++,
+                 n3_++,
+                 n4_++);
+    finished_ = true;
+  }, "");
+}
+
+// Tests a failed EXPECT_PRED4 where the
+// predicate-formatter is a function on a user-defined type (Bool).
+TEST_F(EXPECT_PRED4Test, FunctionOnUserTypeFailure) {
+  EXPECT_NONFATAL_FAILURE({  // NOLINT
+    EXPECT_PRED4(PredFunction4Bool,
+                 Bool(n1_++),
+                 Bool(n2_++),
+                 Bool(n3_++),
+                 Bool(n4_++));
+    finished_ = true;
+  }, "");
+}
+
+// Tests a failed EXPECT_PRED4 where the
+// predicate-formatter is a functor on a built-in type (int).
+TEST_F(EXPECT_PRED4Test, FunctorOnBuiltInTypeFailure) {
+  EXPECT_NONFATAL_FAILURE({  // NOLINT
+    EXPECT_PRED4(PredFunctor4(),
+                 n1_++,
+                 n2_++,
+                 n3_++,
+                 n4_++);
+    finished_ = true;
+  }, "");
+}
+
+// Tests a failed EXPECT_PRED4 where the
+// predicate-formatter is a functor on a user-defined type (Bool).
+TEST_F(EXPECT_PRED4Test, FunctorOnUserTypeFailure) {
+  EXPECT_NONFATAL_FAILURE({  // NOLINT
+    EXPECT_PRED4(PredFunctor4(),
+                 Bool(n1_++),
+                 Bool(n2_++),
+                 Bool(n3_++),
+                 Bool(n4_++));
+    finished_ = true;
+  }, "");
+}
+
+// Tests a successful ASSERT_PRED4 where the
+// predicate-formatter is a function on a built-in type (int).
+TEST_F(ASSERT_PRED4Test, FunctionOnBuiltInTypeSuccess) {
+  ASSERT_PRED4(PredFunction4Int,
+               ++n1_,
+               ++n2_,
+               ++n3_,
+               ++n4_);
+  finished_ = true;
+}
+
+// Tests a successful ASSERT_PRED4 where the
+// predicate-formatter is a function on a user-defined type (Bool).
+TEST_F(ASSERT_PRED4Test, FunctionOnUserTypeSuccess) {
+  ASSERT_PRED4(PredFunction4Bool,
+               Bool(++n1_),
+               Bool(++n2_),
+               Bool(++n3_),
+               Bool(++n4_));
+  finished_ = true;
+}
+
+// Tests a successful ASSERT_PRED4 where the
+// predicate-formatter is a functor on a built-in type (int).
+TEST_F(ASSERT_PRED4Test, FunctorOnBuiltInTypeSuccess) {
+  ASSERT_PRED4(PredFunctor4(),
+               ++n1_,
+               ++n2_,
+               ++n3_,
+               ++n4_);
+  finished_ = true;
+}
+
+// Tests a successful ASSERT_PRED4 where the
+// predicate-formatter is a functor on a user-defined type (Bool).
+TEST_F(ASSERT_PRED4Test, FunctorOnUserTypeSuccess) {
+  ASSERT_PRED4(PredFunctor4(),
+               Bool(++n1_),
+               Bool(++n2_),
+               Bool(++n3_),
+               Bool(++n4_));
+  finished_ = true;
+}
+
+// Tests a failed ASSERT_PRED4 where the
+// predicate-formatter is a function on a built-in type (int).
+TEST_F(ASSERT_PRED4Test, FunctionOnBuiltInTypeFailure) {
+  expected_to_finish_ = false;
+  EXPECT_FATAL_FAILURE({  // NOLINT
+    ASSERT_PRED4(PredFunction4Int,
+                 n1_++,
+                 n2_++,
+                 n3_++,
+                 n4_++);
+    finished_ = true;
+  }, "");
+}
+
+// Tests a failed ASSERT_PRED4 where the
+// predicate-formatter is a function on a user-defined type (Bool).
+TEST_F(ASSERT_PRED4Test, FunctionOnUserTypeFailure) {
+  expected_to_finish_ = false;
+  EXPECT_FATAL_FAILURE({  // NOLINT
+    ASSERT_PRED4(PredFunction4Bool,
+                 Bool(n1_++),
+                 Bool(n2_++),
+                 Bool(n3_++),
+                 Bool(n4_++));
+    finished_ = true;
+  }, "");
+}
+
+// Tests a failed ASSERT_PRED4 where the
+// predicate-formatter is a functor on a built-in type (int).
+TEST_F(ASSERT_PRED4Test, FunctorOnBuiltInTypeFailure) {
+  expected_to_finish_ = false;
+  EXPECT_FATAL_FAILURE({  // NOLINT
+    ASSERT_PRED4(PredFunctor4(),
+                 n1_++,
+                 n2_++,
+                 n3_++,
+                 n4_++);
+    finished_ = true;
+  }, "");
+}
+
+// Tests a failed ASSERT_PRED4 where the
+// predicate-formatter is a functor on a user-defined type (Bool).
+TEST_F(ASSERT_PRED4Test, FunctorOnUserTypeFailure) {
+  expected_to_finish_ = false;
+  EXPECT_FATAL_FAILURE({  // NOLINT
+    ASSERT_PRED4(PredFunctor4(),
+                 Bool(n1_++),
+                 Bool(n2_++),
+                 Bool(n3_++),
+                 Bool(n4_++));
+    finished_ = true;
+  }, "");
+}
+
+// Tests a successful EXPECT_PRED_FORMAT4 where the
+// predicate-formatter is a function on a built-in type (int).
+TEST_F(EXPECT_PRED_FORMAT4Test, FunctionOnBuiltInTypeSuccess) {
+  EXPECT_PRED_FORMAT4(PredFormatFunction4,
+                      ++n1_,
+                      ++n2_,
+                      ++n3_,
+                      ++n4_);
+  finished_ = true;
+}
+
+// Tests a successful EXPECT_PRED_FORMAT4 where the
+// predicate-formatter is a function on a user-defined type (Bool).
+TEST_F(EXPECT_PRED_FORMAT4Test, FunctionOnUserTypeSuccess) {
+  EXPECT_PRED_FORMAT4(PredFormatFunction4,
+                      Bool(++n1_),
+                      Bool(++n2_),
+                      Bool(++n3_),
+                      Bool(++n4_));
+  finished_ = true;
+}
+
+// Tests a successful EXPECT_PRED_FORMAT4 where the
+// predicate-formatter is a functor on a built-in type (int).
+TEST_F(EXPECT_PRED_FORMAT4Test, FunctorOnBuiltInTypeSuccess) {
+  EXPECT_PRED_FORMAT4(PredFormatFunctor4(),
+                      ++n1_,
+                      ++n2_,
+                      ++n3_,
+                      ++n4_);
+  finished_ = true;
+}
+
+// Tests a successful EXPECT_PRED_FORMAT4 where the
+// predicate-formatter is a functor on a user-defined type (Bool).
+TEST_F(EXPECT_PRED_FORMAT4Test, FunctorOnUserTypeSuccess) {
+  EXPECT_PRED_FORMAT4(PredFormatFunctor4(),
+                      Bool(++n1_),
+                      Bool(++n2_),
+                      Bool(++n3_),
+                      Bool(++n4_));
+  finished_ = true;
+}
+
+// Tests a failed EXPECT_PRED_FORMAT4 where the
+// predicate-formatter is a function on a built-in type (int).
+TEST_F(EXPECT_PRED_FORMAT4Test, FunctionOnBuiltInTypeFailure) {
+  EXPECT_NONFATAL_FAILURE({  // NOLINT
+    EXPECT_PRED_FORMAT4(PredFormatFunction4,
+                        n1_++,
+                        n2_++,
+                        n3_++,
+                        n4_++);
+    finished_ = true;
+  }, "");
+}
+
+// Tests a failed EXPECT_PRED_FORMAT4 where the
+// predicate-formatter is a function on a user-defined type (Bool).
+TEST_F(EXPECT_PRED_FORMAT4Test, FunctionOnUserTypeFailure) {
+  EXPECT_NONFATAL_FAILURE({  // NOLINT
+    EXPECT_PRED_FORMAT4(PredFormatFunction4,
+                        Bool(n1_++),
+                        Bool(n2_++),
+                        Bool(n3_++),
+                        Bool(n4_++));
+    finished_ = true;
+  }, "");
+}
+
+// Tests a failed EXPECT_PRED_FORMAT4 where the
+// predicate-formatter is a functor on a built-in type (int).
+TEST_F(EXPECT_PRED_FORMAT4Test, FunctorOnBuiltInTypeFailure) {
+  EXPECT_NONFATAL_FAILURE({  // NOLINT
+    EXPECT_PRED_FORMAT4(PredFormatFunctor4(),
+                        n1_++,
+                        n2_++,
+                        n3_++,
+                        n4_++);
+    finished_ = true;
+  }, "");
+}
+
+// Tests a failed EXPECT_PRED_FORMAT4 where the
+// predicate-formatter is a functor on a user-defined type (Bool).
+TEST_F(EXPECT_PRED_FORMAT4Test, FunctorOnUserTypeFailure) {
+  EXPECT_NONFATAL_FAILURE({  // NOLINT
+    EXPECT_PRED_FORMAT4(PredFormatFunctor4(),
+                        Bool(n1_++),
+                        Bool(n2_++),
+                        Bool(n3_++),
+                        Bool(n4_++));
+    finished_ = true;
+  }, "");
+}
+
+// Tests a successful ASSERT_PRED_FORMAT4 where the
+// predicate-formatter is a function on a built-in type (int).
+TEST_F(ASSERT_PRED_FORMAT4Test, FunctionOnBuiltInTypeSuccess) {
+  ASSERT_PRED_FORMAT4(PredFormatFunction4,
+                      ++n1_,
+                      ++n2_,
+                      ++n3_,
+                      ++n4_);
+  finished_ = true;
+}
+
+// Tests a successful ASSERT_PRED_FORMAT4 where the
+// predicate-formatter is a function on a user-defined type (Bool).
+TEST_F(ASSERT_PRED_FORMAT4Test, FunctionOnUserTypeSuccess) {
+  ASSERT_PRED_FORMAT4(PredFormatFunction4,
+                      Bool(++n1_),
+                      Bool(++n2_),
+                      Bool(++n3_),
+                      Bool(++n4_));
+  finished_ = true;
+}
+
+// Tests a successful ASSERT_PRED_FORMAT4 where the
+// predicate-formatter is a functor on a built-in type (int).
+TEST_F(ASSERT_PRED_FORMAT4Test, FunctorOnBuiltInTypeSuccess) {
+  ASSERT_PRED_FORMAT4(PredFormatFunctor4(),
+                      ++n1_,
+                      ++n2_,
+                      ++n3_,
+                      ++n4_);
+  finished_ = true;
+}
+
+// Tests a successful ASSERT_PRED_FORMAT4 where the
+// predicate-formatter is a functor on a user-defined type (Bool).
+TEST_F(ASSERT_PRED_FORMAT4Test, FunctorOnUserTypeSuccess) {
+  ASSERT_PRED_FORMAT4(PredFormatFunctor4(),
+                      Bool(++n1_),
+                      Bool(++n2_),
+                      Bool(++n3_),
+                      Bool(++n4_));
+  finished_ = true;
+}
+
+// Tests a failed ASSERT_PRED_FORMAT4 where the
+// predicate-formatter is a function on a built-in type (int).
+TEST_F(ASSERT_PRED_FORMAT4Test, FunctionOnBuiltInTypeFailure) {
+  expected_to_finish_ = false;
+  EXPECT_FATAL_FAILURE({  // NOLINT
+    ASSERT_PRED_FORMAT4(PredFormatFunction4,
+                        n1_++,
+                        n2_++,
+                        n3_++,
+                        n4_++);
+    finished_ = true;
+  }, "");
+}
+
+// Tests a failed ASSERT_PRED_FORMAT4 where the
+// predicate-formatter is a function on a user-defined type (Bool).
+TEST_F(ASSERT_PRED_FORMAT4Test, FunctionOnUserTypeFailure) {
+  expected_to_finish_ = false;
+  EXPECT_FATAL_FAILURE({  // NOLINT
+    ASSERT_PRED_FORMAT4(PredFormatFunction4,
+                        Bool(n1_++),
+                        Bool(n2_++),
+                        Bool(n3_++),
+                        Bool(n4_++));
+    finished_ = true;
+  }, "");
+}
+
+// Tests a failed ASSERT_PRED_FORMAT4 where the
+// predicate-formatter is a functor on a built-in type (int).
+TEST_F(ASSERT_PRED_FORMAT4Test, FunctorOnBuiltInTypeFailure) {
+  expected_to_finish_ = false;
+  EXPECT_FATAL_FAILURE({  // NOLINT
+    ASSERT_PRED_FORMAT4(PredFormatFunctor4(),
+                        n1_++,
+                        n2_++,
+                        n3_++,
+                        n4_++);
+    finished_ = true;
+  }, "");
+}
+
+// Tests a failed ASSERT_PRED_FORMAT4 where the
+// predicate-formatter is a functor on a user-defined type (Bool).
+TEST_F(ASSERT_PRED_FORMAT4Test, FunctorOnUserTypeFailure) {
+  expected_to_finish_ = false;
+  EXPECT_FATAL_FAILURE({  // NOLINT
+    ASSERT_PRED_FORMAT4(PredFormatFunctor4(),
+                        Bool(n1_++),
+                        Bool(n2_++),
+                        Bool(n3_++),
+                        Bool(n4_++));
+    finished_ = true;
+  }, "");
+}
+// Sample functions/functors for testing 5-ary predicate assertions.
+
+// A 5-ary predicate function.
+template <typename T1, typename T2, typename T3, typename T4, typename T5>
+bool PredFunction5(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5) {
+  return v1 + v2 + v3 + v4 + v5 > 0;
+}
+
+// The following two functions are needed to circumvent a bug in
+// gcc 2.95.3, which sometimes has problem with the above template
+// function.
+bool PredFunction5Int(int v1, int v2, int v3, int v4, int v5) {
+  return v1 + v2 + v3 + v4 + v5 > 0;
+}
+bool PredFunction5Bool(Bool v1, Bool v2, Bool v3, Bool v4, Bool v5) {
+  return v1 + v2 + v3 + v4 + v5 > 0;
+}
+
+// A 5-ary predicate functor.
+struct PredFunctor5 {
+  template <typename T1, typename T2, typename T3, typename T4, typename T5>
+  bool operator()(const T1& v1,
+                  const T2& v2,
+                  const T3& v3,
+                  const T4& v4,
+                  const T5& v5) {
+    return v1 + v2 + v3 + v4 + v5 > 0;
+  }
+};
+
+// A 5-ary predicate-formatter function.
+template <typename T1, typename T2, typename T3, typename T4, typename T5>
+testing::AssertionResult PredFormatFunction5(const char* e1,
+                                             const char* e2,
+                                             const char* e3,
+                                             const char* e4,
+                                             const char* e5,
+                                             const T1& v1,
+                                             const T2& v2,
+                                             const T3& v3,
+                                             const T4& v4,
+                                             const T5& v5) {
+  if (PredFunction5(v1, v2, v3, v4, v5))
+    return testing::AssertionSuccess();
+
+  return testing::AssertionFailure()
+      << e1 << " + " << e2 << " + " << e3 << " + " << e4 << " + " << e5
+      << " is expected to be positive, but evaluates to "
+      << v1 + v2 + v3 + v4 + v5 << ".";
+}
+
+// A 5-ary predicate-formatter functor.
+struct PredFormatFunctor5 {
+  template <typename T1, typename T2, typename T3, typename T4, typename T5>
+  testing::AssertionResult operator()(const char* e1,
+                                      const char* e2,
+                                      const char* e3,
+                                      const char* e4,
+                                      const char* e5,
+                                      const T1& v1,
+                                      const T2& v2,
+                                      const T3& v3,
+                                      const T4& v4,
+                                      const T5& v5) const {
+    return PredFormatFunction5(e1, e2, e3, e4, e5, v1, v2, v3, v4, v5);
+  }
+};
+
+// Tests for {EXPECT|ASSERT}_PRED_FORMAT5.
+
+class Predicate5Test : public testing::Test {
+ protected:
+  virtual void SetUp() {
+    expected_to_finish_ = true;
+    finished_ = false;
+    n1_ = n2_ = n3_ = n4_ = n5_ = 0;
+  }
+
+  virtual void TearDown() {
+    // Verifies that each of the predicate's arguments was evaluated
+    // exactly once.
+    EXPECT_EQ(1, n1_) <<
+        "The predicate assertion didn't evaluate argument 2 "
+        "exactly once.";
+    EXPECT_EQ(1, n2_) <<
+        "The predicate assertion didn't evaluate argument 3 "
+        "exactly once.";
+    EXPECT_EQ(1, n3_) <<
+        "The predicate assertion didn't evaluate argument 4 "
+        "exactly once.";
+    EXPECT_EQ(1, n4_) <<
+        "The predicate assertion didn't evaluate argument 5 "
+        "exactly once.";
+    EXPECT_EQ(1, n5_) <<
+        "The predicate assertion didn't evaluate argument 6 "
+        "exactly once.";
+
+    // Verifies that the control flow in the test function is expected.
+    if (expected_to_finish_ && !finished_) {
+      FAIL() << "The predicate assertion unexpactedly aborted the test.";
+    } else if (!expected_to_finish_ && finished_) {
+      FAIL() << "The failed predicate assertion didn't abort the test "
+                "as expected.";
+    }
+  }
+
+  // true iff the test function is expected to run to finish.
+  static bool expected_to_finish_;
+
+  // true iff the test function did run to finish.
+  static bool finished_;
+
+  static int n1_;
+  static int n2_;
+  static int n3_;
+  static int n4_;
+  static int n5_;
+};
+
+bool Predicate5Test::expected_to_finish_;
+bool Predicate5Test::finished_;
+int Predicate5Test::n1_;
+int Predicate5Test::n2_;
+int Predicate5Test::n3_;
+int Predicate5Test::n4_;
+int Predicate5Test::n5_;
+
+typedef Predicate5Test EXPECT_PRED_FORMAT5Test;
+typedef Predicate5Test ASSERT_PRED_FORMAT5Test;
+typedef Predicate5Test EXPECT_PRED5Test;
+typedef Predicate5Test ASSERT_PRED5Test;
+
+// Tests a successful EXPECT_PRED5 where the
+// predicate-formatter is a function on a built-in type (int).
+TEST_F(EXPECT_PRED5Test, FunctionOnBuiltInTypeSuccess) {
+  EXPECT_PRED5(PredFunction5Int,
+               ++n1_,
+               ++n2_,
+               ++n3_,
+               ++n4_,
+               ++n5_);
+  finished_ = true;
+}
+
+// Tests a successful EXPECT_PRED5 where the
+// predicate-formatter is a function on a user-defined type (Bool).
+TEST_F(EXPECT_PRED5Test, FunctionOnUserTypeSuccess) {
+  EXPECT_PRED5(PredFunction5Bool,
+               Bool(++n1_),
+               Bool(++n2_),
+               Bool(++n3_),
+               Bool(++n4_),
+               Bool(++n5_));
+  finished_ = true;
+}
+
+// Tests a successful EXPECT_PRED5 where the
+// predicate-formatter is a functor on a built-in type (int).
+TEST_F(EXPECT_PRED5Test, FunctorOnBuiltInTypeSuccess) {
+  EXPECT_PRED5(PredFunctor5(),
+               ++n1_,
+               ++n2_,
+               ++n3_,
+               ++n4_,
+               ++n5_);
+  finished_ = true;
+}
+
+// Tests a successful EXPECT_PRED5 where the
+// predicate-formatter is a functor on a user-defined type (Bool).
+TEST_F(EXPECT_PRED5Test, FunctorOnUserTypeSuccess) {
+  EXPECT_PRED5(PredFunctor5(),
+               Bool(++n1_),
+               Bool(++n2_),
+               Bool(++n3_),
+               Bool(++n4_),
+               Bool(++n5_));
+  finished_ = true;
+}
+
+// Tests a failed EXPECT_PRED5 where the
+// predicate-formatter is a function on a built-in type (int).
+TEST_F(EXPECT_PRED5Test, FunctionOnBuiltInTypeFailure) {
+  EXPECT_NONFATAL_FAILURE({  // NOLINT
+    EXPECT_PRED5(PredFunction5Int,
+                 n1_++,
+                 n2_++,
+                 n3_++,
+                 n4_++,
+                 n5_++);
+    finished_ = true;
+  }, "");
+}
+
+// Tests a failed EXPECT_PRED5 where the
+// predicate-formatter is a function on a user-defined type (Bool).
+TEST_F(EXPECT_PRED5Test, FunctionOnUserTypeFailure) {
+  EXPECT_NONFATAL_FAILURE({  // NOLINT
+    EXPECT_PRED5(PredFunction5Bool,
+                 Bool(n1_++),
+                 Bool(n2_++),
+                 Bool(n3_++),
+                 Bool(n4_++),
+                 Bool(n5_++));
+    finished_ = true;
+  }, "");
+}
+
+// Tests a failed EXPECT_PRED5 where the
+// predicate-formatter is a functor on a built-in type (int).
+TEST_F(EXPECT_PRED5Test, FunctorOnBuiltInTypeFailure) {
+  EXPECT_NONFATAL_FAILURE({  // NOLINT
+    EXPECT_PRED5(PredFunctor5(),
+                 n1_++,
+                 n2_++,
+                 n3_++,
+                 n4_++,
+                 n5_++);
+    finished_ = true;
+  }, "");
+}
+
+// Tests a failed EXPECT_PRED5 where the
+// predicate-formatter is a functor on a user-defined type (Bool).
+TEST_F(EXPECT_PRED5Test, FunctorOnUserTypeFailure) {
+  EXPECT_NONFATAL_FAILURE({  // NOLINT
+    EXPECT_PRED5(PredFunctor5(),
+                 Bool(n1_++),
+                 Bool(n2_++),
+                 Bool(n3_++),
+                 Bool(n4_++),
+                 Bool(n5_++));
+    finished_ = true;
+  }, "");
+}
+
+// Tests a successful ASSERT_PRED5 where the
+// predicate-formatter is a function on a built-in type (int).
+TEST_F(ASSERT_PRED5Test, FunctionOnBuiltInTypeSuccess) {
+  ASSERT_PRED5(PredFunction5Int,
+               ++n1_,
+               ++n2_,
+               ++n3_,
+               ++n4_,
+               ++n5_);
+  finished_ = true;
+}
+
+// Tests a successful ASSERT_PRED5 where the
+// predicate-formatter is a function on a user-defined type (Bool).
+TEST_F(ASSERT_PRED5Test, FunctionOnUserTypeSuccess) {
+  ASSERT_PRED5(PredFunction5Bool,
+               Bool(++n1_),
+               Bool(++n2_),
+               Bool(++n3_),
+               Bool(++n4_),
+               Bool(++n5_));
+  finished_ = true;
+}
+
+// Tests a successful ASSERT_PRED5 where the
+// predicate-formatter is a functor on a built-in type (int).
+TEST_F(ASSERT_PRED5Test, FunctorOnBuiltInTypeSuccess) {
+  ASSERT_PRED5(PredFunctor5(),
+               ++n1_,
+               ++n2_,
+               ++n3_,
+               ++n4_,
+               ++n5_);
+  finished_ = true;
+}
+
+// Tests a successful ASSERT_PRED5 where the
+// predicate-formatter is a functor on a user-defined type (Bool).
+TEST_F(ASSERT_PRED5Test, FunctorOnUserTypeSuccess) {
+  ASSERT_PRED5(PredFunctor5(),
+               Bool(++n1_),
+               Bool(++n2_),
+               Bool(++n3_),
+               Bool(++n4_),
+               Bool(++n5_));
+  finished_ = true;
+}
+
+// Tests a failed ASSERT_PRED5 where the
+// predicate-formatter is a function on a built-in type (int).
+TEST_F(ASSERT_PRED5Test, FunctionOnBuiltInTypeFailure) {
+  expected_to_finish_ = false;
+  EXPECT_FATAL_FAILURE({  // NOLINT
+    ASSERT_PRED5(PredFunction5Int,
+                 n1_++,
+                 n2_++,
+                 n3_++,
+                 n4_++,
+                 n5_++);
+    finished_ = true;
+  }, "");
+}
+
+// Tests a failed ASSERT_PRED5 where the
+// predicate-formatter is a function on a user-defined type (Bool).
+TEST_F(ASSERT_PRED5Test, FunctionOnUserTypeFailure) {
+  expected_to_finish_ = false;
+  EXPECT_FATAL_FAILURE({  // NOLINT
+    ASSERT_PRED5(PredFunction5Bool,
+                 Bool(n1_++),
+                 Bool(n2_++),
+                 Bool(n3_++),
+                 Bool(n4_++),
+                 Bool(n5_++));
+    finished_ = true;
+  }, "");
+}
+
+// Tests a failed ASSERT_PRED5 where the
+// predicate-formatter is a functor on a built-in type (int).
+TEST_F(ASSERT_PRED5Test, FunctorOnBuiltInTypeFailure) {
+  expected_to_finish_ = false;
+  EXPECT_FATAL_FAILURE({  // NOLINT
+    ASSERT_PRED5(PredFunctor5(),
+                 n1_++,
+                 n2_++,
+                 n3_++,
+                 n4_++,
+                 n5_++);
+    finished_ = true;
+  }, "");
+}
+
+// Tests a failed ASSERT_PRED5 where the
+// predicate-formatter is a functor on a user-defined type (Bool).
+TEST_F(ASSERT_PRED5Test, FunctorOnUserTypeFailure) {
+  expected_to_finish_ = false;
+  EXPECT_FATAL_FAILURE({  // NOLINT
+    ASSERT_PRED5(PredFunctor5(),
+                 Bool(n1_++),
+                 Bool(n2_++),
+                 Bool(n3_++),
+                 Bool(n4_++),
+                 Bool(n5_++));
+    finished_ = true;
+  }, "");
+}
+
+// Tests a successful EXPECT_PRED_FORMAT5 where the
+// predicate-formatter is a function on a built-in type (int).
+TEST_F(EXPECT_PRED_FORMAT5Test, FunctionOnBuiltInTypeSuccess) {
+  EXPECT_PRED_FORMAT5(PredFormatFunction5,
+                      ++n1_,
+                      ++n2_,
+                      ++n3_,
+                      ++n4_,
+                      ++n5_);
+  finished_ = true;
+}
+
+// Tests a successful EXPECT_PRED_FORMAT5 where the
+// predicate-formatter is a function on a user-defined type (Bool).
+TEST_F(EXPECT_PRED_FORMAT5Test, FunctionOnUserTypeSuccess) {
+  EXPECT_PRED_FORMAT5(PredFormatFunction5,
+                      Bool(++n1_),
+                      Bool(++n2_),
+                      Bool(++n3_),
+                      Bool(++n4_),
+                      Bool(++n5_));
+  finished_ = true;
+}
+
+// Tests a successful EXPECT_PRED_FORMAT5 where the
+// predicate-formatter is a functor on a built-in type (int).
+TEST_F(EXPECT_PRED_FORMAT5Test, FunctorOnBuiltInTypeSuccess) {
+  EXPECT_PRED_FORMAT5(PredFormatFunctor5(),
+                      ++n1_,
+                      ++n2_,
+                      ++n3_,
+                      ++n4_,
+                      ++n5_);
+  finished_ = true;
+}
+
+// Tests a successful EXPECT_PRED_FORMAT5 where the
+// predicate-formatter is a functor on a user-defined type (Bool).
+TEST_F(EXPECT_PRED_FORMAT5Test, FunctorOnUserTypeSuccess) {
+  EXPECT_PRED_FORMAT5(PredFormatFunctor5(),
+                      Bool(++n1_),
+                      Bool(++n2_),
+                      Bool(++n3_),
+                      Bool(++n4_),
+                      Bool(++n5_));
+  finished_ = true;
+}
+
+// Tests a failed EXPECT_PRED_FORMAT5 where the
+// predicate-formatter is a function on a built-in type (int).
+TEST_F(EXPECT_PRED_FORMAT5Test, FunctionOnBuiltInTypeFailure) {
+  EXPECT_NONFATAL_FAILURE({  // NOLINT
+    EXPECT_PRED_FORMAT5(PredFormatFunction5,
+                        n1_++,
+                        n2_++,
+                        n3_++,
+                        n4_++,
+                        n5_++);
+    finished_ = true;
+  }, "");
+}
+
+// Tests a failed EXPECT_PRED_FORMAT5 where the
+// predicate-formatter is a function on a user-defined type (Bool).
+TEST_F(EXPECT_PRED_FORMAT5Test, FunctionOnUserTypeFailure) {
+  EXPECT_NONFATAL_FAILURE({  // NOLINT
+    EXPECT_PRED_FORMAT5(PredFormatFunction5,
+                        Bool(n1_++),
+                        Bool(n2_++),
+                        Bool(n3_++),
+                        Bool(n4_++),
+                        Bool(n5_++));
+    finished_ = true;
+  }, "");
+}
+
+// Tests a failed EXPECT_PRED_FORMAT5 where the
+// predicate-formatter is a functor on a built-in type (int).
+TEST_F(EXPECT_PRED_FORMAT5Test, FunctorOnBuiltInTypeFailure) {
+  EXPECT_NONFATAL_FAILURE({  // NOLINT
+    EXPECT_PRED_FORMAT5(PredFormatFunctor5(),
+                        n1_++,
+                        n2_++,
+                        n3_++,
+                        n4_++,
+                        n5_++);
+    finished_ = true;
+  }, "");
+}
+
+// Tests a failed EXPECT_PRED_FORMAT5 where the
+// predicate-formatter is a functor on a user-defined type (Bool).
+TEST_F(EXPECT_PRED_FORMAT5Test, FunctorOnUserTypeFailure) {
+  EXPECT_NONFATAL_FAILURE({  // NOLINT
+    EXPECT_PRED_FORMAT5(PredFormatFunctor5(),
+                        Bool(n1_++),
+                        Bool(n2_++),
+                        Bool(n3_++),
+                        Bool(n4_++),
+                        Bool(n5_++));
+    finished_ = true;
+  }, "");
+}
+
+// Tests a successful ASSERT_PRED_FORMAT5 where the
+// predicate-formatter is a function on a built-in type (int).
+TEST_F(ASSERT_PRED_FORMAT5Test, FunctionOnBuiltInTypeSuccess) {
+  ASSERT_PRED_FORMAT5(PredFormatFunction5,
+                      ++n1_,
+                      ++n2_,
+                      ++n3_,
+                      ++n4_,
+                      ++n5_);
+  finished_ = true;
+}
+
+// Tests a successful ASSERT_PRED_FORMAT5 where the
+// predicate-formatter is a function on a user-defined type (Bool).
+TEST_F(ASSERT_PRED_FORMAT5Test, FunctionOnUserTypeSuccess) {
+  ASSERT_PRED_FORMAT5(PredFormatFunction5,
+                      Bool(++n1_),
+                      Bool(++n2_),
+                      Bool(++n3_),
+                      Bool(++n4_),
+                      Bool(++n5_));
+  finished_ = true;
+}
+
+// Tests a successful ASSERT_PRED_FORMAT5 where the
+// predicate-formatter is a functor on a built-in type (int).
+TEST_F(ASSERT_PRED_FORMAT5Test, FunctorOnBuiltInTypeSuccess) {
+  ASSERT_PRED_FORMAT5(PredFormatFunctor5(),
+                      ++n1_,
+                      ++n2_,
+                      ++n3_,
+                      ++n4_,
+                      ++n5_);
+  finished_ = true;
+}
+
+// Tests a successful ASSERT_PRED_FORMAT5 where the
+// predicate-formatter is a functor on a user-defined type (Bool).
+TEST_F(ASSERT_PRED_FORMAT5Test, FunctorOnUserTypeSuccess) {
+  ASSERT_PRED_FORMAT5(PredFormatFunctor5(),
+                      Bool(++n1_),
+                      Bool(++n2_),
+                      Bool(++n3_),
+                      Bool(++n4_),
+                      Bool(++n5_));
+  finished_ = true;
+}
+
+// Tests a failed ASSERT_PRED_FORMAT5 where the
+// predicate-formatter is a function on a built-in type (int).
+TEST_F(ASSERT_PRED_FORMAT5Test, FunctionOnBuiltInTypeFailure) {
+  expected_to_finish_ = false;
+  EXPECT_FATAL_FAILURE({  // NOLINT
+    ASSERT_PRED_FORMAT5(PredFormatFunction5,
+                        n1_++,
+                        n2_++,
+                        n3_++,
+                        n4_++,
+                        n5_++);
+    finished_ = true;
+  }, "");
+}
+
+// Tests a failed ASSERT_PRED_FORMAT5 where the
+// predicate-formatter is a function on a user-defined type (Bool).
+TEST_F(ASSERT_PRED_FORMAT5Test, FunctionOnUserTypeFailure) {
+  expected_to_finish_ = false;
+  EXPECT_FATAL_FAILURE({  // NOLINT
+    ASSERT_PRED_FORMAT5(PredFormatFunction5,
+                        Bool(n1_++),
+                        Bool(n2_++),
+                        Bool(n3_++),
+                        Bool(n4_++),
+                        Bool(n5_++));
+    finished_ = true;
+  }, "");
+}
+
+// Tests a failed ASSERT_PRED_FORMAT5 where the
+// predicate-formatter is a functor on a built-in type (int).
+TEST_F(ASSERT_PRED_FORMAT5Test, FunctorOnBuiltInTypeFailure) {
+  expected_to_finish_ = false;
+  EXPECT_FATAL_FAILURE({  // NOLINT
+    ASSERT_PRED_FORMAT5(PredFormatFunctor5(),
+                        n1_++,
+                        n2_++,
+                        n3_++,
+                        n4_++,
+                        n5_++);
+    finished_ = true;
+  }, "");
+}
+
+// Tests a failed ASSERT_PRED_FORMAT5 where the
+// predicate-formatter is a functor on a user-defined type (Bool).
+TEST_F(ASSERT_PRED_FORMAT5Test, FunctorOnUserTypeFailure) {
+  expected_to_finish_ = false;
+  EXPECT_FATAL_FAILURE({  // NOLINT
+    ASSERT_PRED_FORMAT5(PredFormatFunctor5(),
+                        Bool(n1_++),
+                        Bool(n2_++),
+                        Bool(n3_++),
+                        Bool(n4_++),
+                        Bool(n5_++));
+    finished_ = true;
+  }, "");
+}
diff --git a/contrib/gtest-1.7.0/test/gtest_premature_exit_test.cc b/contrib/gtest-1.7.0/test/gtest_premature_exit_test.cc
new file mode 100644
index 0000000..f6b6be9
--- /dev/null
+++ b/contrib/gtest-1.7.0/test/gtest_premature_exit_test.cc
@@ -0,0 +1,141 @@
+// Copyright 2013, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+//
+// Tests that Google Test manipulates the premature-exit-detection
+// file correctly.
+
+#include <stdio.h>
+
+#include "gtest/gtest.h"
+
+using ::testing::InitGoogleTest;
+using ::testing::Test;
+using ::testing::internal::posix::GetEnv;
+using ::testing::internal::posix::Stat;
+using ::testing::internal::posix::StatStruct;
+
+namespace {
+
+// Is the TEST_PREMATURE_EXIT_FILE environment variable expected to be
+// set?
+const bool kTestPrematureExitFileEnvVarShouldBeSet = false;
+
+class PrematureExitTest : public Test {
+ public:
+  // Returns true iff the given file exists.
+  static bool FileExists(const char* filepath) {
+    StatStruct stat;
+    return Stat(filepath, &stat) == 0;
+  }
+
+ protected:
+  PrematureExitTest() {
+    premature_exit_file_path_ = GetEnv("TEST_PREMATURE_EXIT_FILE");
+
+    // Normalize NULL to "" for ease of handling.
+    if (premature_exit_file_path_ == NULL) {
+      premature_exit_file_path_ = "";
+    }
+  }
+
+  // Returns true iff the premature-exit file exists.
+  bool PrematureExitFileExists() const {
+    return FileExists(premature_exit_file_path_);
+  }
+
+  const char* premature_exit_file_path_;
+};
+
+typedef PrematureExitTest PrematureExitDeathTest;
+
+// Tests that:
+//   - the premature-exit file exists during the execution of a
+//     death test (EXPECT_DEATH*), and
+//   - a death test doesn't interfere with the main test process's
+//     handling of the premature-exit file.
+TEST_F(PrematureExitDeathTest, FileExistsDuringExecutionOfDeathTest) {
+  if (*premature_exit_file_path_ == '\0') {
+    return;
+  }
+
+  EXPECT_DEATH_IF_SUPPORTED({
+      // If the file exists, crash the process such that the main test
+      // process will catch the (expected) crash and report a success;
+      // otherwise don't crash, which will cause the main test process
+      // to report that the death test has failed.
+      if (PrematureExitFileExists()) {
+        exit(1);
+      }
+    }, "");
+}
+
+// Tests that TEST_PREMATURE_EXIT_FILE is set where it's expected to
+// be set.
+TEST_F(PrematureExitTest, TestPrematureExitFileEnvVarIsSet) {
+  if (kTestPrematureExitFileEnvVarShouldBeSet) {
+    const char* const filepath = GetEnv("TEST_PREMATURE_EXIT_FILE");
+    ASSERT_TRUE(filepath != NULL);
+    ASSERT_NE(*filepath, '\0');
+  }
+}
+
+// Tests that the premature-exit file exists during the execution of a
+// normal (non-death) test.
+TEST_F(PrematureExitTest, PrematureExitFileExistsDuringTestExecution) {
+  if (*premature_exit_file_path_ == '\0') {
+    return;
+  }
+
+  EXPECT_TRUE(PrematureExitFileExists())
+      << " file " << premature_exit_file_path_
+      << " should exist during test execution, but doesn't.";
+}
+
+}  // namespace
+
+int main(int argc, char **argv) {
+  InitGoogleTest(&argc, argv);
+  const int exit_code = RUN_ALL_TESTS();
+
+  // Test that the premature-exit file is deleted upon return from
+  // RUN_ALL_TESTS().
+  const char* const filepath = GetEnv("TEST_PREMATURE_EXIT_FILE");
+  if (filepath != NULL && *filepath != '\0') {
+    if (PrematureExitTest::FileExists(filepath)) {
+      printf(
+          "File %s shouldn't exist after the test program finishes, but does.",
+          filepath);
+      return 1;
+    }
+  }
+
+  return exit_code;
+}
diff --git a/contrib/gtest-1.7.0/test/gtest_prod_test.cc b/contrib/gtest-1.7.0/test/gtest_prod_test.cc
new file mode 100644
index 0000000..060abce
--- /dev/null
+++ b/contrib/gtest-1.7.0/test/gtest_prod_test.cc
@@ -0,0 +1,57 @@
+// Copyright 2006, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+//
+// Unit test for include/gtest/gtest_prod.h.
+
+#include "gtest/gtest.h"
+#include "test/production.h"
+
+// Tests that private members can be accessed from a TEST declared as
+// a friend of the class.
+TEST(PrivateCodeTest, CanAccessPrivateMembers) {
+  PrivateCode a;
+  EXPECT_EQ(0, a.x_);
+
+  a.set_x(1);
+  EXPECT_EQ(1, a.x_);
+}
+
+typedef testing::Test PrivateCodeFixtureTest;
+
+// Tests that private members can be accessed from a TEST_F declared
+// as a friend of the class.
+TEST_F(PrivateCodeFixtureTest, CanAccessPrivateMembers) {
+  PrivateCode a;
+  EXPECT_EQ(0, a.x_);
+
+  a.set_x(2);
+  EXPECT_EQ(2, a.x_);
+}
diff --git a/contrib/gtest-1.7.0/test/gtest_repeat_test.cc b/contrib/gtest-1.7.0/test/gtest_repeat_test.cc
new file mode 100644
index 0000000..481012a
--- /dev/null
+++ b/contrib/gtest-1.7.0/test/gtest_repeat_test.cc
@@ -0,0 +1,253 @@
+// Copyright 2008, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+
+// Tests the --gtest_repeat=number flag.
+
+#include <stdlib.h>
+#include <iostream>
+#include "gtest/gtest.h"
+
+// Indicates that this translation unit is part of Google Test's
+// implementation.  It must come before gtest-internal-inl.h is
+// included, or there will be a compiler error.  This trick is to
+// prevent a user from accidentally including gtest-internal-inl.h in
+// his code.
+#define GTEST_IMPLEMENTATION_ 1
+#include "src/gtest-internal-inl.h"
+#undef GTEST_IMPLEMENTATION_
+
+namespace testing {
+
+GTEST_DECLARE_string_(death_test_style);
+GTEST_DECLARE_string_(filter);
+GTEST_DECLARE_int32_(repeat);
+
+}  // namespace testing
+
+using testing::GTEST_FLAG(death_test_style);
+using testing::GTEST_FLAG(filter);
+using testing::GTEST_FLAG(repeat);
+
+namespace {
+
+// We need this when we are testing Google Test itself and therefore
+// cannot use Google Test assertions.
+#define GTEST_CHECK_INT_EQ_(expected, actual) \
+  do {\
+    const int expected_val = (expected);\
+    const int actual_val = (actual);\
+    if (::testing::internal::IsTrue(expected_val != actual_val)) {\
+      ::std::cout << "Value of: " #actual "\n"\
+                  << "  Actual: " << actual_val << "\n"\
+                  << "Expected: " #expected "\n"\
+                  << "Which is: " << expected_val << "\n";\
+      ::testing::internal::posix::Abort();\
+    }\
+  } while (::testing::internal::AlwaysFalse())
+
+
+// Used for verifying that global environment set-up and tear-down are
+// inside the gtest_repeat loop.
+
+int g_environment_set_up_count = 0;
+int g_environment_tear_down_count = 0;
+
+class MyEnvironment : public testing::Environment {
+ public:
+  MyEnvironment() {}
+  virtual void SetUp() { g_environment_set_up_count++; }
+  virtual void TearDown() { g_environment_tear_down_count++; }
+};
+
+// A test that should fail.
+
+int g_should_fail_count = 0;
+
+TEST(FooTest, ShouldFail) {
+  g_should_fail_count++;
+  EXPECT_EQ(0, 1) << "Expected failure.";
+}
+
+// A test that should pass.
+
+int g_should_pass_count = 0;
+
+TEST(FooTest, ShouldPass) {
+  g_should_pass_count++;
+}
+
+// A test that contains a thread-safe death test and a fast death
+// test.  It should pass.
+
+int g_death_test_count = 0;
+
+TEST(BarDeathTest, ThreadSafeAndFast) {
+  g_death_test_count++;
+
+  GTEST_FLAG(death_test_style) = "threadsafe";
+  EXPECT_DEATH_IF_SUPPORTED(::testing::internal::posix::Abort(), "");
+
+  GTEST_FLAG(death_test_style) = "fast";
+  EXPECT_DEATH_IF_SUPPORTED(::testing::internal::posix::Abort(), "");
+}
+
+#if GTEST_HAS_PARAM_TEST
+int g_param_test_count = 0;
+
+const int kNumberOfParamTests = 10;
+
+class MyParamTest : public testing::TestWithParam<int> {};
+
+TEST_P(MyParamTest, ShouldPass) {
+  // TODO(vladl at google.com): Make parameter value checking robust
+  //                         WRT order of tests.
+  GTEST_CHECK_INT_EQ_(g_param_test_count % kNumberOfParamTests, GetParam());
+  g_param_test_count++;
+}
+INSTANTIATE_TEST_CASE_P(MyParamSequence,
+                        MyParamTest,
+                        testing::Range(0, kNumberOfParamTests));
+#endif  // GTEST_HAS_PARAM_TEST
+
+// Resets the count for each test.
+void ResetCounts() {
+  g_environment_set_up_count = 0;
+  g_environment_tear_down_count = 0;
+  g_should_fail_count = 0;
+  g_should_pass_count = 0;
+  g_death_test_count = 0;
+#if GTEST_HAS_PARAM_TEST
+  g_param_test_count = 0;
+#endif  // GTEST_HAS_PARAM_TEST
+}
+
+// Checks that the count for each test is expected.
+void CheckCounts(int expected) {
+  GTEST_CHECK_INT_EQ_(expected, g_environment_set_up_count);
+  GTEST_CHECK_INT_EQ_(expected, g_environment_tear_down_count);
+  GTEST_CHECK_INT_EQ_(expected, g_should_fail_count);
+  GTEST_CHECK_INT_EQ_(expected, g_should_pass_count);
+  GTEST_CHECK_INT_EQ_(expected, g_death_test_count);
+#if GTEST_HAS_PARAM_TEST
+  GTEST_CHECK_INT_EQ_(expected * kNumberOfParamTests, g_param_test_count);
+#endif  // GTEST_HAS_PARAM_TEST
+}
+
+// Tests the behavior of Google Test when --gtest_repeat is not specified.
+void TestRepeatUnspecified() {
+  ResetCounts();
+  GTEST_CHECK_INT_EQ_(1, RUN_ALL_TESTS());
+  CheckCounts(1);
+}
+
+// Tests the behavior of Google Test when --gtest_repeat has the given value.
+void TestRepeat(int repeat) {
+  GTEST_FLAG(repeat) = repeat;
+
+  ResetCounts();
+  GTEST_CHECK_INT_EQ_(repeat > 0 ? 1 : 0, RUN_ALL_TESTS());
+  CheckCounts(repeat);
+}
+
+// Tests using --gtest_repeat when --gtest_filter specifies an empty
+// set of tests.
+void TestRepeatWithEmptyFilter(int repeat) {
+  GTEST_FLAG(repeat) = repeat;
+  GTEST_FLAG(filter) = "None";
+
+  ResetCounts();
+  GTEST_CHECK_INT_EQ_(0, RUN_ALL_TESTS());
+  CheckCounts(0);
+}
+
+// Tests using --gtest_repeat when --gtest_filter specifies a set of
+// successful tests.
+void TestRepeatWithFilterForSuccessfulTests(int repeat) {
+  GTEST_FLAG(repeat) = repeat;
+  GTEST_FLAG(filter) = "*-*ShouldFail";
+
+  ResetCounts();
+  GTEST_CHECK_INT_EQ_(0, RUN_ALL_TESTS());
+  GTEST_CHECK_INT_EQ_(repeat, g_environment_set_up_count);
+  GTEST_CHECK_INT_EQ_(repeat, g_environment_tear_down_count);
+  GTEST_CHECK_INT_EQ_(0, g_should_fail_count);
+  GTEST_CHECK_INT_EQ_(repeat, g_should_pass_count);
+  GTEST_CHECK_INT_EQ_(repeat, g_death_test_count);
+#if GTEST_HAS_PARAM_TEST
+  GTEST_CHECK_INT_EQ_(repeat * kNumberOfParamTests, g_param_test_count);
+#endif  // GTEST_HAS_PARAM_TEST
+}
+
+// Tests using --gtest_repeat when --gtest_filter specifies a set of
+// failed tests.
+void TestRepeatWithFilterForFailedTests(int repeat) {
+  GTEST_FLAG(repeat) = repeat;
+  GTEST_FLAG(filter) = "*ShouldFail";
+
+  ResetCounts();
+  GTEST_CHECK_INT_EQ_(1, RUN_ALL_TESTS());
+  GTEST_CHECK_INT_EQ_(repeat, g_environment_set_up_count);
+  GTEST_CHECK_INT_EQ_(repeat, g_environment_tear_down_count);
+  GTEST_CHECK_INT_EQ_(repeat, g_should_fail_count);
+  GTEST_CHECK_INT_EQ_(0, g_should_pass_count);
+  GTEST_CHECK_INT_EQ_(0, g_death_test_count);
+#if GTEST_HAS_PARAM_TEST
+  GTEST_CHECK_INT_EQ_(0, g_param_test_count);
+#endif  // GTEST_HAS_PARAM_TEST
+}
+
+}  // namespace
+
+int main(int argc, char **argv) {
+  testing::InitGoogleTest(&argc, argv);
+  testing::AddGlobalTestEnvironment(new MyEnvironment);
+
+  TestRepeatUnspecified();
+  TestRepeat(0);
+  TestRepeat(1);
+  TestRepeat(5);
+
+  TestRepeatWithEmptyFilter(2);
+  TestRepeatWithEmptyFilter(3);
+
+  TestRepeatWithFilterForSuccessfulTests(3);
+
+  TestRepeatWithFilterForFailedTests(4);
+
+  // It would be nice to verify that the tests indeed loop forever
+  // when GTEST_FLAG(repeat) is negative, but this test will be quite
+  // complicated to write.  Since this flag is for interactive
+  // debugging only and doesn't affect the normal test result, such a
+  // test would be an overkill.
+
+  printf("PASS\n");
+  return 0;
+}
diff --git a/contrib/gtest-1.7.0/test/gtest_shuffle_test.py b/contrib/gtest-1.7.0/test/gtest_shuffle_test.py
new file mode 100755
index 0000000..30d0303
--- /dev/null
+++ b/contrib/gtest-1.7.0/test/gtest_shuffle_test.py
@@ -0,0 +1,325 @@
+#!/usr/bin/env python
+#
+# Copyright 2009 Google Inc. All Rights Reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+#
+#     * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#     * Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following disclaimer
+# in the documentation and/or other materials provided with the
+# distribution.
+#     * Neither the name of Google Inc. nor the names of its
+# contributors may be used to endorse or promote products derived from
+# this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+"""Verifies that test shuffling works."""
+
+__author__ = 'wan at google.com (Zhanyong Wan)'
+
+import os
+import gtest_test_utils
+
+# Command to run the gtest_shuffle_test_ program.
+COMMAND = gtest_test_utils.GetTestExecutablePath('gtest_shuffle_test_')
+
+# The environment variables for test sharding.
+TOTAL_SHARDS_ENV_VAR = 'GTEST_TOTAL_SHARDS'
+SHARD_INDEX_ENV_VAR = 'GTEST_SHARD_INDEX'
+
+TEST_FILTER = 'A*.A:A*.B:C*'
+
+ALL_TESTS = []
+ACTIVE_TESTS = []
+FILTERED_TESTS = []
+SHARDED_TESTS = []
+
+SHUFFLED_ALL_TESTS = []
+SHUFFLED_ACTIVE_TESTS = []
+SHUFFLED_FILTERED_TESTS = []
+SHUFFLED_SHARDED_TESTS = []
+
+
+def AlsoRunDisabledTestsFlag():
+  return '--gtest_also_run_disabled_tests'
+
+
+def FilterFlag(test_filter):
+  return '--gtest_filter=%s' % (test_filter,)
+
+
+def RepeatFlag(n):
+  return '--gtest_repeat=%s' % (n,)
+
+
+def ShuffleFlag():
+  return '--gtest_shuffle'
+
+
+def RandomSeedFlag(n):
+  return '--gtest_random_seed=%s' % (n,)
+
+
+def RunAndReturnOutput(extra_env, args):
+  """Runs the test program and returns its output."""
+
+  environ_copy = os.environ.copy()
+  environ_copy.update(extra_env)
+
+  return gtest_test_utils.Subprocess([COMMAND] + args, env=environ_copy).output
+
+
+def GetTestsForAllIterations(extra_env, args):
+  """Runs the test program and returns a list of test lists.
+
+  Args:
+    extra_env: a map from environment variables to their values
+    args: command line flags to pass to gtest_shuffle_test_
+
+  Returns:
+    A list where the i-th element is the list of tests run in the i-th
+    test iteration.
+  """
+
+  test_iterations = []
+  for line in RunAndReturnOutput(extra_env, args).split('\n'):
+    if line.startswith('----'):
+      tests = []
+      test_iterations.append(tests)
+    elif line.strip():
+      tests.append(line.strip())  # 'TestCaseName.TestName'
+
+  return test_iterations
+
+
+def GetTestCases(tests):
+  """Returns a list of test cases in the given full test names.
+
+  Args:
+    tests: a list of full test names
+
+  Returns:
+    A list of test cases from 'tests', in their original order.
+    Consecutive duplicates are removed.
+  """
+
+  test_cases = []
+  for test in tests:
+    test_case = test.split('.')[0]
+    if not test_case in test_cases:
+      test_cases.append(test_case)
+
+  return test_cases
+
+
+def CalculateTestLists():
+  """Calculates the list of tests run under different flags."""
+
+  if not ALL_TESTS:
+    ALL_TESTS.extend(
+        GetTestsForAllIterations({}, [AlsoRunDisabledTestsFlag()])[0])
+
+  if not ACTIVE_TESTS:
+    ACTIVE_TESTS.extend(GetTestsForAllIterations({}, [])[0])
+
+  if not FILTERED_TESTS:
+    FILTERED_TESTS.extend(
+        GetTestsForAllIterations({}, [FilterFlag(TEST_FILTER)])[0])
+
+  if not SHARDED_TESTS:
+    SHARDED_TESTS.extend(
+        GetTestsForAllIterations({TOTAL_SHARDS_ENV_VAR: '3',
+                                  SHARD_INDEX_ENV_VAR: '1'},
+                                 [])[0])
+
+  if not SHUFFLED_ALL_TESTS:
+    SHUFFLED_ALL_TESTS.extend(GetTestsForAllIterations(
+        {}, [AlsoRunDisabledTestsFlag(), ShuffleFlag(), RandomSeedFlag(1)])[0])
+
+  if not SHUFFLED_ACTIVE_TESTS:
+    SHUFFLED_ACTIVE_TESTS.extend(GetTestsForAllIterations(
+        {}, [ShuffleFlag(), RandomSeedFlag(1)])[0])
+
+  if not SHUFFLED_FILTERED_TESTS:
+    SHUFFLED_FILTERED_TESTS.extend(GetTestsForAllIterations(
+        {}, [ShuffleFlag(), RandomSeedFlag(1), FilterFlag(TEST_FILTER)])[0])
+
+  if not SHUFFLED_SHARDED_TESTS:
+    SHUFFLED_SHARDED_TESTS.extend(
+        GetTestsForAllIterations({TOTAL_SHARDS_ENV_VAR: '3',
+                                  SHARD_INDEX_ENV_VAR: '1'},
+                                 [ShuffleFlag(), RandomSeedFlag(1)])[0])
+
+
+class GTestShuffleUnitTest(gtest_test_utils.TestCase):
+  """Tests test shuffling."""
+
+  def setUp(self):
+    CalculateTestLists()
+
+  def testShufflePreservesNumberOfTests(self):
+    self.assertEqual(len(ALL_TESTS), len(SHUFFLED_ALL_TESTS))
+    self.assertEqual(len(ACTIVE_TESTS), len(SHUFFLED_ACTIVE_TESTS))
+    self.assertEqual(len(FILTERED_TESTS), len(SHUFFLED_FILTERED_TESTS))
+    self.assertEqual(len(SHARDED_TESTS), len(SHUFFLED_SHARDED_TESTS))
+
+  def testShuffleChangesTestOrder(self):
+    self.assert_(SHUFFLED_ALL_TESTS != ALL_TESTS, SHUFFLED_ALL_TESTS)
+    self.assert_(SHUFFLED_ACTIVE_TESTS != ACTIVE_TESTS, SHUFFLED_ACTIVE_TESTS)
+    self.assert_(SHUFFLED_FILTERED_TESTS != FILTERED_TESTS,
+                 SHUFFLED_FILTERED_TESTS)
+    self.assert_(SHUFFLED_SHARDED_TESTS != SHARDED_TESTS,
+                 SHUFFLED_SHARDED_TESTS)
+
+  def testShuffleChangesTestCaseOrder(self):
+    self.assert_(GetTestCases(SHUFFLED_ALL_TESTS) != GetTestCases(ALL_TESTS),
+                 GetTestCases(SHUFFLED_ALL_TESTS))
+    self.assert_(
+        GetTestCases(SHUFFLED_ACTIVE_TESTS) != GetTestCases(ACTIVE_TESTS),
+        GetTestCases(SHUFFLED_ACTIVE_TESTS))
+    self.assert_(
+        GetTestCases(SHUFFLED_FILTERED_TESTS) != GetTestCases(FILTERED_TESTS),
+        GetTestCases(SHUFFLED_FILTERED_TESTS))
+    self.assert_(
+        GetTestCases(SHUFFLED_SHARDED_TESTS) != GetTestCases(SHARDED_TESTS),
+        GetTestCases(SHUFFLED_SHARDED_TESTS))
+
+  def testShuffleDoesNotRepeatTest(self):
+    for test in SHUFFLED_ALL_TESTS:
+      self.assertEqual(1, SHUFFLED_ALL_TESTS.count(test),
+                       '%s appears more than once' % (test,))
+    for test in SHUFFLED_ACTIVE_TESTS:
+      self.assertEqual(1, SHUFFLED_ACTIVE_TESTS.count(test),
+                       '%s appears more than once' % (test,))
+    for test in SHUFFLED_FILTERED_TESTS:
+      self.assertEqual(1, SHUFFLED_FILTERED_TESTS.count(test),
+                       '%s appears more than once' % (test,))
+    for test in SHUFFLED_SHARDED_TESTS:
+      self.assertEqual(1, SHUFFLED_SHARDED_TESTS.count(test),
+                       '%s appears more than once' % (test,))
+
+  def testShuffleDoesNotCreateNewTest(self):
+    for test in SHUFFLED_ALL_TESTS:
+      self.assert_(test in ALL_TESTS, '%s is an invalid test' % (test,))
+    for test in SHUFFLED_ACTIVE_TESTS:
+      self.assert_(test in ACTIVE_TESTS, '%s is an invalid test' % (test,))
+    for test in SHUFFLED_FILTERED_TESTS:
+      self.assert_(test in FILTERED_TESTS, '%s is an invalid test' % (test,))
+    for test in SHUFFLED_SHARDED_TESTS:
+      self.assert_(test in SHARDED_TESTS, '%s is an invalid test' % (test,))
+
+  def testShuffleIncludesAllTests(self):
+    for test in ALL_TESTS:
+      self.assert_(test in SHUFFLED_ALL_TESTS, '%s is missing' % (test,))
+    for test in ACTIVE_TESTS:
+      self.assert_(test in SHUFFLED_ACTIVE_TESTS, '%s is missing' % (test,))
+    for test in FILTERED_TESTS:
+      self.assert_(test in SHUFFLED_FILTERED_TESTS, '%s is missing' % (test,))
+    for test in SHARDED_TESTS:
+      self.assert_(test in SHUFFLED_SHARDED_TESTS, '%s is missing' % (test,))
+
+  def testShuffleLeavesDeathTestsAtFront(self):
+    non_death_test_found = False
+    for test in SHUFFLED_ACTIVE_TESTS:
+      if 'DeathTest.' in test:
+        self.assert_(not non_death_test_found,
+                     '%s appears after a non-death test' % (test,))
+      else:
+        non_death_test_found = True
+
+  def _VerifyTestCasesDoNotInterleave(self, tests):
+    test_cases = []
+    for test in tests:
+      [test_case, _] = test.split('.')
+      if test_cases and test_cases[-1] != test_case:
+        test_cases.append(test_case)
+        self.assertEqual(1, test_cases.count(test_case),
+                         'Test case %s is not grouped together in %s' %
+                         (test_case, tests))
+
+  def testShuffleDoesNotInterleaveTestCases(self):
+    self._VerifyTestCasesDoNotInterleave(SHUFFLED_ALL_TESTS)
+    self._VerifyTestCasesDoNotInterleave(SHUFFLED_ACTIVE_TESTS)
+    self._VerifyTestCasesDoNotInterleave(SHUFFLED_FILTERED_TESTS)
+    self._VerifyTestCasesDoNotInterleave(SHUFFLED_SHARDED_TESTS)
+
+  def testShuffleRestoresOrderAfterEachIteration(self):
+    # Get the test lists in all 3 iterations, using random seed 1, 2,
+    # and 3 respectively.  Google Test picks a different seed in each
+    # iteration, and this test depends on the current implementation
+    # picking successive numbers.  This dependency is not ideal, but
+    # makes the test much easier to write.
+    [tests_in_iteration1, tests_in_iteration2, tests_in_iteration3] = (
+        GetTestsForAllIterations(
+            {}, [ShuffleFlag(), RandomSeedFlag(1), RepeatFlag(3)]))
+
+    # Make sure running the tests with random seed 1 gets the same
+    # order as in iteration 1 above.
+    [tests_with_seed1] = GetTestsForAllIterations(
+        {}, [ShuffleFlag(), RandomSeedFlag(1)])
+    self.assertEqual(tests_in_iteration1, tests_with_seed1)
+
+    # Make sure running the tests with random seed 2 gets the same
+    # order as in iteration 2 above.  Success means that Google Test
+    # correctly restores the test order before re-shuffling at the
+    # beginning of iteration 2.
+    [tests_with_seed2] = GetTestsForAllIterations(
+        {}, [ShuffleFlag(), RandomSeedFlag(2)])
+    self.assertEqual(tests_in_iteration2, tests_with_seed2)
+
+    # Make sure running the tests with random seed 3 gets the same
+    # order as in iteration 3 above.  Success means that Google Test
+    # correctly restores the test order before re-shuffling at the
+    # beginning of iteration 3.
+    [tests_with_seed3] = GetTestsForAllIterations(
+        {}, [ShuffleFlag(), RandomSeedFlag(3)])
+    self.assertEqual(tests_in_iteration3, tests_with_seed3)
+
+  def testShuffleGeneratesNewOrderInEachIteration(self):
+    [tests_in_iteration1, tests_in_iteration2, tests_in_iteration3] = (
+        GetTestsForAllIterations(
+            {}, [ShuffleFlag(), RandomSeedFlag(1), RepeatFlag(3)]))
+
+    self.assert_(tests_in_iteration1 != tests_in_iteration2,
+                 tests_in_iteration1)
+    self.assert_(tests_in_iteration1 != tests_in_iteration3,
+                 tests_in_iteration1)
+    self.assert_(tests_in_iteration2 != tests_in_iteration3,
+                 tests_in_iteration2)
+
+  def testShuffleShardedTestsPreservesPartition(self):
+    # If we run M tests on N shards, the same M tests should be run in
+    # total, regardless of the random seeds used by the shards.
+    [tests1] = GetTestsForAllIterations({TOTAL_SHARDS_ENV_VAR: '3',
+                                         SHARD_INDEX_ENV_VAR: '0'},
+                                        [ShuffleFlag(), RandomSeedFlag(1)])
+    [tests2] = GetTestsForAllIterations({TOTAL_SHARDS_ENV_VAR: '3',
+                                         SHARD_INDEX_ENV_VAR: '1'},
+                                        [ShuffleFlag(), RandomSeedFlag(20)])
+    [tests3] = GetTestsForAllIterations({TOTAL_SHARDS_ENV_VAR: '3',
+                                         SHARD_INDEX_ENV_VAR: '2'},
+                                        [ShuffleFlag(), RandomSeedFlag(25)])
+    sorted_sharded_tests = tests1 + tests2 + tests3
+    sorted_sharded_tests.sort()
+    sorted_active_tests = []
+    sorted_active_tests.extend(ACTIVE_TESTS)
+    sorted_active_tests.sort()
+    self.assertEqual(sorted_active_tests, sorted_sharded_tests)
+
+if __name__ == '__main__':
+  gtest_test_utils.Main()
diff --git a/contrib/gtest-1.7.0/test/gtest_shuffle_test_.cc b/contrib/gtest-1.7.0/test/gtest_shuffle_test_.cc
new file mode 100644
index 0000000..6fb441b
--- /dev/null
+++ b/contrib/gtest-1.7.0/test/gtest_shuffle_test_.cc
@@ -0,0 +1,103 @@
+// Copyright 2009, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+
+// Verifies that test shuffling works.
+
+#include "gtest/gtest.h"
+
+namespace {
+
+using ::testing::EmptyTestEventListener;
+using ::testing::InitGoogleTest;
+using ::testing::Message;
+using ::testing::Test;
+using ::testing::TestEventListeners;
+using ::testing::TestInfo;
+using ::testing::UnitTest;
+using ::testing::internal::scoped_ptr;
+
+// The test methods are empty, as the sole purpose of this program is
+// to print the test names before/after shuffling.
+
+class A : public Test {};
+TEST_F(A, A) {}
+TEST_F(A, B) {}
+
+TEST(ADeathTest, A) {}
+TEST(ADeathTest, B) {}
+TEST(ADeathTest, C) {}
+
+TEST(B, A) {}
+TEST(B, B) {}
+TEST(B, C) {}
+TEST(B, DISABLED_D) {}
+TEST(B, DISABLED_E) {}
+
+TEST(BDeathTest, A) {}
+TEST(BDeathTest, B) {}
+
+TEST(C, A) {}
+TEST(C, B) {}
+TEST(C, C) {}
+TEST(C, DISABLED_D) {}
+
+TEST(CDeathTest, A) {}
+
+TEST(DISABLED_D, A) {}
+TEST(DISABLED_D, DISABLED_B) {}
+
+// This printer prints the full test names only, starting each test
+// iteration with a "----" marker.
+class TestNamePrinter : public EmptyTestEventListener {
+ public:
+  virtual void OnTestIterationStart(const UnitTest& /* unit_test */,
+                                    int /* iteration */) {
+    printf("----\n");
+  }
+
+  virtual void OnTestStart(const TestInfo& test_info) {
+    printf("%s.%s\n", test_info.test_case_name(), test_info.name());
+  }
+};
+
+}  // namespace
+
+int main(int argc, char **argv) {
+  InitGoogleTest(&argc, argv);
+
+  // Replaces the default printer with TestNamePrinter, which prints
+  // the test name only.
+  TestEventListeners& listeners = UnitTest::GetInstance()->listeners();
+  delete listeners.Release(listeners.default_result_printer());
+  listeners.Append(new TestNamePrinter);
+
+  return RUN_ALL_TESTS();
+}
diff --git a/contrib/gtest-1.7.0/test/gtest_sole_header_test.cc b/contrib/gtest-1.7.0/test/gtest_sole_header_test.cc
new file mode 100644
index 0000000..ccd091a
--- /dev/null
+++ b/contrib/gtest-1.7.0/test/gtest_sole_header_test.cc
@@ -0,0 +1,57 @@
+// Copyright 2008, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: mheule at google.com (Markus Heule)
+//
+// This test verifies that it's possible to use Google Test by including
+// the gtest.h header file alone.
+
+#include "gtest/gtest.h"
+
+namespace {
+
+void Subroutine() {
+  EXPECT_EQ(42, 42);
+}
+
+TEST(NoFatalFailureTest, ExpectNoFatalFailure) {
+  EXPECT_NO_FATAL_FAILURE(;);
+  EXPECT_NO_FATAL_FAILURE(SUCCEED());
+  EXPECT_NO_FATAL_FAILURE(Subroutine());
+  EXPECT_NO_FATAL_FAILURE({ SUCCEED(); });
+}
+
+TEST(NoFatalFailureTest, AssertNoFatalFailure) {
+  ASSERT_NO_FATAL_FAILURE(;);
+  ASSERT_NO_FATAL_FAILURE(SUCCEED());
+  ASSERT_NO_FATAL_FAILURE(Subroutine());
+  ASSERT_NO_FATAL_FAILURE({ SUCCEED(); });
+}
+
+}  // namespace
diff --git a/contrib/gtest-1.7.0/test/gtest_stress_test.cc b/contrib/gtest-1.7.0/test/gtest_stress_test.cc
new file mode 100644
index 0000000..e7daa43
--- /dev/null
+++ b/contrib/gtest-1.7.0/test/gtest_stress_test.cc
@@ -0,0 +1,256 @@
+// Copyright 2007, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+
+// Tests that SCOPED_TRACE() and various Google Test assertions can be
+// used in a large number of threads concurrently.
+
+#include "gtest/gtest.h"
+
+#include <iostream>
+#include <vector>
+
+// We must define this macro in order to #include
+// gtest-internal-inl.h.  This is how Google Test prevents a user from
+// accidentally depending on its internal implementation.
+#define GTEST_IMPLEMENTATION_ 1
+#include "src/gtest-internal-inl.h"
+#undef GTEST_IMPLEMENTATION_
+
+#if GTEST_IS_THREADSAFE
+
+namespace testing {
+namespace {
+
+using internal::Notification;
+using internal::TestPropertyKeyIs;
+using internal::ThreadWithParam;
+using internal::scoped_ptr;
+
+// In order to run tests in this file, for platforms where Google Test is
+// thread safe, implement ThreadWithParam. See the description of its API
+// in gtest-port.h, where it is defined for already supported platforms.
+
+// How many threads to create?
+const int kThreadCount = 50;
+
+std::string IdToKey(int id, const char* suffix) {
+  Message key;
+  key << "key_" << id << "_" << suffix;
+  return key.GetString();
+}
+
+std::string IdToString(int id) {
+  Message id_message;
+  id_message << id;
+  return id_message.GetString();
+}
+
+void ExpectKeyAndValueWereRecordedForId(
+    const std::vector<TestProperty>& properties,
+    int id, const char* suffix) {
+  TestPropertyKeyIs matches_key(IdToKey(id, suffix).c_str());
+  const std::vector<TestProperty>::const_iterator property =
+      std::find_if(properties.begin(), properties.end(), matches_key);
+  ASSERT_TRUE(property != properties.end())
+      << "expecting " << suffix << " value for id " << id;
+  EXPECT_STREQ(IdToString(id).c_str(), property->value());
+}
+
+// Calls a large number of Google Test assertions, where exactly one of them
+// will fail.
+void ManyAsserts(int id) {
+  GTEST_LOG_(INFO) << "Thread #" << id << " running...";
+
+  SCOPED_TRACE(Message() << "Thread #" << id);
+
+  for (int i = 0; i < kThreadCount; i++) {
+    SCOPED_TRACE(Message() << "Iteration #" << i);
+
+    // A bunch of assertions that should succeed.
+    EXPECT_TRUE(true);
+    ASSERT_FALSE(false) << "This shouldn't fail.";
+    EXPECT_STREQ("a", "a");
+    ASSERT_LE(5, 6);
+    EXPECT_EQ(i, i) << "This shouldn't fail.";
+
+    // RecordProperty() should interact safely with other threads as well.
+    // The shared_key forces property updates.
+    Test::RecordProperty(IdToKey(id, "string").c_str(), IdToString(id).c_str());
+    Test::RecordProperty(IdToKey(id, "int").c_str(), id);
+    Test::RecordProperty("shared_key", IdToString(id).c_str());
+
+    // This assertion should fail kThreadCount times per thread.  It
+    // is for testing whether Google Test can handle failed assertions in a
+    // multi-threaded context.
+    EXPECT_LT(i, 0) << "This should always fail.";
+  }
+}
+
+void CheckTestFailureCount(int expected_failures) {
+  const TestInfo* const info = UnitTest::GetInstance()->current_test_info();
+  const TestResult* const result = info->result();
+  GTEST_CHECK_(expected_failures == result->total_part_count())
+      << "Logged " << result->total_part_count() << " failures "
+      << " vs. " << expected_failures << " expected";
+}
+
+// Tests using SCOPED_TRACE() and Google Test assertions in many threads
+// concurrently.
+TEST(StressTest, CanUseScopedTraceAndAssertionsInManyThreads) {
+  {
+    scoped_ptr<ThreadWithParam<int> > threads[kThreadCount];
+    Notification threads_can_start;
+    for (int i = 0; i != kThreadCount; i++)
+      threads[i].reset(new ThreadWithParam<int>(&ManyAsserts,
+                                                i,
+                                                &threads_can_start));
+
+    threads_can_start.Notify();
+
+    // Blocks until all the threads are done.
+    for (int i = 0; i != kThreadCount; i++)
+      threads[i]->Join();
+  }
+
+  // Ensures that kThreadCount*kThreadCount failures have been reported.
+  const TestInfo* const info = UnitTest::GetInstance()->current_test_info();
+  const TestResult* const result = info->result();
+
+  std::vector<TestProperty> properties;
+  // We have no access to the TestResult's list of properties but we can
+  // copy them one by one.
+  for (int i = 0; i < result->test_property_count(); ++i)
+    properties.push_back(result->GetTestProperty(i));
+
+  EXPECT_EQ(kThreadCount * 2 + 1, result->test_property_count())
+      << "String and int values recorded on each thread, "
+      << "as well as one shared_key";
+  for (int i = 0; i < kThreadCount; ++i) {
+    ExpectKeyAndValueWereRecordedForId(properties, i, "string");
+    ExpectKeyAndValueWereRecordedForId(properties, i, "int");
+  }
+  CheckTestFailureCount(kThreadCount*kThreadCount);
+}
+
+void FailingThread(bool is_fatal) {
+  if (is_fatal)
+    FAIL() << "Fatal failure in some other thread. "
+           << "(This failure is expected.)";
+  else
+    ADD_FAILURE() << "Non-fatal failure in some other thread. "
+                  << "(This failure is expected.)";
+}
+
+void GenerateFatalFailureInAnotherThread(bool is_fatal) {
+  ThreadWithParam<bool> thread(&FailingThread, is_fatal, NULL);
+  thread.Join();
+}
+
+TEST(NoFatalFailureTest, ExpectNoFatalFailureIgnoresFailuresInOtherThreads) {
+  EXPECT_NO_FATAL_FAILURE(GenerateFatalFailureInAnotherThread(true));
+  // We should only have one failure (the one from
+  // GenerateFatalFailureInAnotherThread()), since the EXPECT_NO_FATAL_FAILURE
+  // should succeed.
+  CheckTestFailureCount(1);
+}
+
+void AssertNoFatalFailureIgnoresFailuresInOtherThreads() {
+  ASSERT_NO_FATAL_FAILURE(GenerateFatalFailureInAnotherThread(true));
+}
+TEST(NoFatalFailureTest, AssertNoFatalFailureIgnoresFailuresInOtherThreads) {
+  // Using a subroutine, to make sure, that the test continues.
+  AssertNoFatalFailureIgnoresFailuresInOtherThreads();
+  // We should only have one failure (the one from
+  // GenerateFatalFailureInAnotherThread()), since the EXPECT_NO_FATAL_FAILURE
+  // should succeed.
+  CheckTestFailureCount(1);
+}
+
+TEST(FatalFailureTest, ExpectFatalFailureIgnoresFailuresInOtherThreads) {
+  // This statement should fail, since the current thread doesn't generate a
+  // fatal failure, only another one does.
+  EXPECT_FATAL_FAILURE(GenerateFatalFailureInAnotherThread(true), "expected");
+  CheckTestFailureCount(2);
+}
+
+TEST(FatalFailureOnAllThreadsTest, ExpectFatalFailureOnAllThreads) {
+  // This statement should succeed, because failures in all threads are
+  // considered.
+  EXPECT_FATAL_FAILURE_ON_ALL_THREADS(
+      GenerateFatalFailureInAnotherThread(true), "expected");
+  CheckTestFailureCount(0);
+  // We need to add a failure, because main() checks that there are failures.
+  // But when only this test is run, we shouldn't have any failures.
+  ADD_FAILURE() << "This is an expected non-fatal failure.";
+}
+
+TEST(NonFatalFailureTest, ExpectNonFatalFailureIgnoresFailuresInOtherThreads) {
+  // This statement should fail, since the current thread doesn't generate a
+  // fatal failure, only another one does.
+  EXPECT_NONFATAL_FAILURE(GenerateFatalFailureInAnotherThread(false),
+                          "expected");
+  CheckTestFailureCount(2);
+}
+
+TEST(NonFatalFailureOnAllThreadsTest, ExpectNonFatalFailureOnAllThreads) {
+  // This statement should succeed, because failures in all threads are
+  // considered.
+  EXPECT_NONFATAL_FAILURE_ON_ALL_THREADS(
+      GenerateFatalFailureInAnotherThread(false), "expected");
+  CheckTestFailureCount(0);
+  // We need to add a failure, because main() checks that there are failures,
+  // But when only this test is run, we shouldn't have any failures.
+  ADD_FAILURE() << "This is an expected non-fatal failure.";
+}
+
+}  // namespace
+}  // namespace testing
+
+int main(int argc, char **argv) {
+  testing::InitGoogleTest(&argc, argv);
+
+  const int result = RUN_ALL_TESTS();  // Expected to fail.
+  GTEST_CHECK_(result == 1) << "RUN_ALL_TESTS() did not fail as expected";
+
+  printf("\nPASS\n");
+  return 0;
+}
+
+#else
+TEST(StressTest,
+     DISABLED_ThreadSafetyTestsAreSkippedWhenGoogleTestIsNotThreadSafe) {
+}
+
+int main(int argc, char **argv) {
+  testing::InitGoogleTest(&argc, argv);
+  return RUN_ALL_TESTS();
+}
+#endif  // GTEST_IS_THREADSAFE
diff --git a/contrib/gtest-1.7.0/test/gtest_test_utils.py b/contrib/gtest-1.7.0/test/gtest_test_utils.py
new file mode 100755
index 0000000..28884bd
--- /dev/null
+++ b/contrib/gtest-1.7.0/test/gtest_test_utils.py
@@ -0,0 +1,320 @@
+#!/usr/bin/env python
+#
+# Copyright 2006, Google Inc.
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+#
+#     * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#     * Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following disclaimer
+# in the documentation and/or other materials provided with the
+# distribution.
+#     * Neither the name of Google Inc. nor the names of its
+# contributors may be used to endorse or promote products derived from
+# this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+"""Unit test utilities for Google C++ Testing Framework."""
+
+__author__ = 'wan at google.com (Zhanyong Wan)'
+
+import atexit
+import os
+import shutil
+import sys
+import tempfile
+import unittest
+_test_module = unittest
+
+# Suppresses the 'Import not at the top of the file' lint complaint.
+# pylint: disable-msg=C6204
+try:
+  import subprocess
+  _SUBPROCESS_MODULE_AVAILABLE = True
+except:
+  import popen2
+  _SUBPROCESS_MODULE_AVAILABLE = False
+# pylint: enable-msg=C6204
+
+GTEST_OUTPUT_VAR_NAME = 'GTEST_OUTPUT'
+
+IS_WINDOWS = os.name == 'nt'
+IS_CYGWIN = os.name == 'posix' and 'CYGWIN' in os.uname()[0]
+
+# The environment variable for specifying the path to the premature-exit file.
+PREMATURE_EXIT_FILE_ENV_VAR = 'TEST_PREMATURE_EXIT_FILE'
+
+environ = os.environ.copy()
+
+
+def SetEnvVar(env_var, value):
+  """Sets/unsets an environment variable to a given value."""
+
+  if value is not None:
+    environ[env_var] = value
+  elif env_var in environ:
+    del environ[env_var]
+
+
+# Here we expose a class from a particular module, depending on the
+# environment. The comment suppresses the 'Invalid variable name' lint
+# complaint.
+TestCase = _test_module.TestCase  # pylint: disable-msg=C6409
+
+# Initially maps a flag to its default value. After
+# _ParseAndStripGTestFlags() is called, maps a flag to its actual value.
+_flag_map = {'source_dir': os.path.dirname(sys.argv[0]),
+             'build_dir': os.path.dirname(sys.argv[0])}
+_gtest_flags_are_parsed = False
+
+
+def _ParseAndStripGTestFlags(argv):
+  """Parses and strips Google Test flags from argv.  This is idempotent."""
+
+  # Suppresses the lint complaint about a global variable since we need it
+  # here to maintain module-wide state.
+  global _gtest_flags_are_parsed  # pylint: disable-msg=W0603
+  if _gtest_flags_are_parsed:
+    return
+
+  _gtest_flags_are_parsed = True
+  for flag in _flag_map:
+    # The environment variable overrides the default value.
+    if flag.upper() in os.environ:
+      _flag_map[flag] = os.environ[flag.upper()]
+
+    # The command line flag overrides the environment variable.
+    i = 1  # Skips the program name.
+    while i < len(argv):
+      prefix = '--' + flag + '='
+      if argv[i].startswith(prefix):
+        _flag_map[flag] = argv[i][len(prefix):]
+        del argv[i]
+        break
+      else:
+        # We don't increment i in case we just found a --gtest_* flag
+        # and removed it from argv.
+        i += 1
+
+
+def GetFlag(flag):
+  """Returns the value of the given flag."""
+
+  # In case GetFlag() is called before Main(), we always call
+  # _ParseAndStripGTestFlags() here to make sure the --gtest_* flags
+  # are parsed.
+  _ParseAndStripGTestFlags(sys.argv)
+
+  return _flag_map[flag]
+
+
+def GetSourceDir():
+  """Returns the absolute path of the directory where the .py files are."""
+
+  return os.path.abspath(GetFlag('source_dir'))
+
+
+def GetBuildDir():
+  """Returns the absolute path of the directory where the test binaries are."""
+
+  return os.path.abspath(GetFlag('build_dir'))
+
+
+_temp_dir = None
+
+def _RemoveTempDir():
+  if _temp_dir:
+    shutil.rmtree(_temp_dir, ignore_errors=True)
+
+atexit.register(_RemoveTempDir)
+
+
+def GetTempDir():
+  """Returns a directory for temporary files."""
+
+  global _temp_dir
+  if not _temp_dir:
+    _temp_dir = tempfile.mkdtemp()
+  return _temp_dir
+
+
+def GetTestExecutablePath(executable_name, build_dir=None):
+  """Returns the absolute path of the test binary given its name.
+
+  The function will print a message and abort the program if the resulting file
+  doesn't exist.
+
+  Args:
+    executable_name: name of the test binary that the test script runs.
+    build_dir:       directory where to look for executables, by default
+                     the result of GetBuildDir().
+
+  Returns:
+    The absolute path of the test binary.
+  """
+
+  path = os.path.abspath(os.path.join(build_dir or GetBuildDir(),
+                                      executable_name))
+  if (IS_WINDOWS or IS_CYGWIN) and not path.endswith('.exe'):
+    path += '.exe'
+
+  if not os.path.exists(path):
+    message = (
+        'Unable to find the test binary. Please make sure to provide path\n'
+        'to the binary via the --build_dir flag or the BUILD_DIR\n'
+        'environment variable.')
+    print >> sys.stderr, message
+    sys.exit(1)
+
+  return path
+
+
+def GetExitStatus(exit_code):
+  """Returns the argument to exit(), or -1 if exit() wasn't called.
+
+  Args:
+    exit_code: the result value of os.system(command).
+  """
+
+  if os.name == 'nt':
+    # On Windows, os.WEXITSTATUS() doesn't work and os.system() returns
+    # the argument to exit() directly.
+    return exit_code
+  else:
+    # On Unix, os.WEXITSTATUS() must be used to extract the exit status
+    # from the result of os.system().
+    if os.WIFEXITED(exit_code):
+      return os.WEXITSTATUS(exit_code)
+    else:
+      return -1
+
+
+class Subprocess:
+  def __init__(self, command, working_dir=None, capture_stderr=True, env=None):
+    """Changes into a specified directory, if provided, and executes a command.
+
+    Restores the old directory afterwards.
+
+    Args:
+      command:        The command to run, in the form of sys.argv.
+      working_dir:    The directory to change into.
+      capture_stderr: Determines whether to capture stderr in the output member
+                      or to discard it.
+      env:            Dictionary with environment to pass to the subprocess.
+
+    Returns:
+      An object that represents outcome of the executed process. It has the
+      following attributes:
+        terminated_by_signal   True iff the child process has been terminated
+                               by a signal.
+        signal                 Sygnal that terminated the child process.
+        exited                 True iff the child process exited normally.
+        exit_code              The code with which the child process exited.
+        output                 Child process's stdout and stderr output
+                               combined in a string.
+    """
+
+    # The subprocess module is the preferrable way of running programs
+    # since it is available and behaves consistently on all platforms,
+    # including Windows. But it is only available starting in python 2.4.
+    # In earlier python versions, we revert to the popen2 module, which is
+    # available in python 2.0 and later but doesn't provide required
+    # functionality (Popen4) under Windows. This allows us to support Mac
+    # OS X 10.4 Tiger, which has python 2.3 installed.
+    if _SUBPROCESS_MODULE_AVAILABLE:
+      if capture_stderr:
+        stderr = subprocess.STDOUT
+      else:
+        stderr = subprocess.PIPE
+
+      p = subprocess.Popen(command,
+                           stdout=subprocess.PIPE, stderr=stderr,
+                           cwd=working_dir, universal_newlines=True, env=env)
+      # communicate returns a tuple with the file obect for the child's
+      # output.
+      self.output = p.communicate()[0]
+      self._return_code = p.returncode
+    else:
+      old_dir = os.getcwd()
+
+      def _ReplaceEnvDict(dest, src):
+        # Changes made by os.environ.clear are not inheritable by child
+        # processes until Python 2.6. To produce inheritable changes we have
+        # to delete environment items with the del statement.
+        for key in dest.keys():
+          del dest[key]
+        dest.update(src)
+
+      # When 'env' is not None, backup the environment variables and replace
+      # them with the passed 'env'. When 'env' is None, we simply use the
+      # current 'os.environ' for compatibility with the subprocess.Popen
+      # semantics used above.
+      if env is not None:
+        old_environ = os.environ.copy()
+        _ReplaceEnvDict(os.environ, env)
+
+      try:
+        if working_dir is not None:
+          os.chdir(working_dir)
+        if capture_stderr:
+          p = popen2.Popen4(command)
+        else:
+          p = popen2.Popen3(command)
+        p.tochild.close()
+        self.output = p.fromchild.read()
+        ret_code = p.wait()
+      finally:
+        os.chdir(old_dir)
+
+        # Restore the old environment variables
+        # if they were replaced.
+        if env is not None:
+          _ReplaceEnvDict(os.environ, old_environ)
+
+      # Converts ret_code to match the semantics of
+      # subprocess.Popen.returncode.
+      if os.WIFSIGNALED(ret_code):
+        self._return_code = -os.WTERMSIG(ret_code)
+      else:  # os.WIFEXITED(ret_code) should return True here.
+        self._return_code = os.WEXITSTATUS(ret_code)
+
+    if self._return_code < 0:
+      self.terminated_by_signal = True
+      self.exited = False
+      self.signal = -self._return_code
+    else:
+      self.terminated_by_signal = False
+      self.exited = True
+      self.exit_code = self._return_code
+
+
+def Main():
+  """Runs the unit test."""
+
+  # We must call _ParseAndStripGTestFlags() before calling
+  # unittest.main().  Otherwise the latter will be confused by the
+  # --gtest_* flags.
+  _ParseAndStripGTestFlags(sys.argv)
+  # The tested binaries should not be writing XML output files unless the
+  # script explicitly instructs them to.
+  # TODO(vladl at google.com): Move this into Subprocess when we implement
+  # passing environment into it as a parameter.
+  if GTEST_OUTPUT_VAR_NAME in os.environ:
+    del os.environ[GTEST_OUTPUT_VAR_NAME]
+
+  _test_module.main()
diff --git a/contrib/gtest-1.7.0/test/gtest_throw_on_failure_ex_test.cc b/contrib/gtest-1.7.0/test/gtest_throw_on_failure_ex_test.cc
new file mode 100644
index 0000000..8d46c76
--- /dev/null
+++ b/contrib/gtest-1.7.0/test/gtest_throw_on_failure_ex_test.cc
@@ -0,0 +1,92 @@
+// Copyright 2009, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+
+// Tests Google Test's throw-on-failure mode with exceptions enabled.
+
+#include "gtest/gtest.h"
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <stdexcept>
+
+// Prints the given failure message and exits the program with
+// non-zero.  We use this instead of a Google Test assertion to
+// indicate a failure, as the latter is been tested and cannot be
+// relied on.
+void Fail(const char* msg) {
+  printf("FAILURE: %s\n", msg);
+  fflush(stdout);
+  exit(1);
+}
+
+// Tests that an assertion failure throws a subclass of
+// std::runtime_error.
+void TestFailureThrowsRuntimeError() {
+  testing::GTEST_FLAG(throw_on_failure) = true;
+
+  // A successful assertion shouldn't throw.
+  try {
+    EXPECT_EQ(3, 3);
+  } catch(...) {
+    Fail("A successful assertion wrongfully threw.");
+  }
+
+  // A failed assertion should throw a subclass of std::runtime_error.
+  try {
+    EXPECT_EQ(2, 3) << "Expected failure";
+  } catch(const std::runtime_error& e) {
+    if (strstr(e.what(), "Expected failure") != NULL)
+      return;
+
+    printf("%s",
+           "A failed assertion did throw an exception of the right type, "
+           "but the message is incorrect.  Instead of containing \"Expected "
+           "failure\", it is:\n");
+    Fail(e.what());
+  } catch(...) {
+    Fail("A failed assertion threw the wrong type of exception.");
+  }
+  Fail("A failed assertion should've thrown but didn't.");
+}
+
+int main(int argc, char** argv) {
+  testing::InitGoogleTest(&argc, argv);
+
+  // We want to ensure that people can use Google Test assertions in
+  // other testing frameworks, as long as they initialize Google Test
+  // properly and set the thrown-on-failure mode.  Therefore, we don't
+  // use Google Test's constructs for defining and running tests
+  // (e.g. TEST and RUN_ALL_TESTS) here.
+
+  TestFailureThrowsRuntimeError();
+  return 0;
+}
diff --git a/contrib/gtest-1.7.0/test/gtest_throw_on_failure_test.py b/contrib/gtest-1.7.0/test/gtest_throw_on_failure_test.py
new file mode 100755
index 0000000..5678ffe
--- /dev/null
+++ b/contrib/gtest-1.7.0/test/gtest_throw_on_failure_test.py
@@ -0,0 +1,171 @@
+#!/usr/bin/env python
+#
+# Copyright 2009, Google Inc.
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+#
+#     * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#     * Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following disclaimer
+# in the documentation and/or other materials provided with the
+# distribution.
+#     * Neither the name of Google Inc. nor the names of its
+# contributors may be used to endorse or promote products derived from
+# this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+"""Tests Google Test's throw-on-failure mode with exceptions disabled.
+
+This script invokes gtest_throw_on_failure_test_ (a program written with
+Google Test) with different environments and command line flags.
+"""
+
+__author__ = 'wan at google.com (Zhanyong Wan)'
+
+import os
+import gtest_test_utils
+
+
+# Constants.
+
+# The command line flag for enabling/disabling the throw-on-failure mode.
+THROW_ON_FAILURE = 'gtest_throw_on_failure'
+
+# Path to the gtest_throw_on_failure_test_ program, compiled with
+# exceptions disabled.
+EXE_PATH = gtest_test_utils.GetTestExecutablePath(
+    'gtest_throw_on_failure_test_')
+
+
+# Utilities.
+
+
+def SetEnvVar(env_var, value):
+  """Sets an environment variable to a given value; unsets it when the
+  given value is None.
+  """
+
+  env_var = env_var.upper()
+  if value is not None:
+    os.environ[env_var] = value
+  elif env_var in os.environ:
+    del os.environ[env_var]
+
+
+def Run(command):
+  """Runs a command; returns True/False if its exit code is/isn't 0."""
+
+  print 'Running "%s". . .' % ' '.join(command)
+  p = gtest_test_utils.Subprocess(command)
+  return p.exited and p.exit_code == 0
+
+
+# The tests.  TODO(wan at google.com): refactor the class to share common
+# logic with code in gtest_break_on_failure_unittest.py.
+class ThrowOnFailureTest(gtest_test_utils.TestCase):
+  """Tests the throw-on-failure mode."""
+
+  def RunAndVerify(self, env_var_value, flag_value, should_fail):
+    """Runs gtest_throw_on_failure_test_ and verifies that it does
+    (or does not) exit with a non-zero code.
+
+    Args:
+      env_var_value:    value of the GTEST_BREAK_ON_FAILURE environment
+                        variable; None if the variable should be unset.
+      flag_value:       value of the --gtest_break_on_failure flag;
+                        None if the flag should not be present.
+      should_fail:      True iff the program is expected to fail.
+    """
+
+    SetEnvVar(THROW_ON_FAILURE, env_var_value)
+
+    if env_var_value is None:
+      env_var_value_msg = ' is not set'
+    else:
+      env_var_value_msg = '=' + env_var_value
+
+    if flag_value is None:
+      flag = ''
+    elif flag_value == '0':
+      flag = '--%s=0' % THROW_ON_FAILURE
+    else:
+      flag = '--%s' % THROW_ON_FAILURE
+
+    command = [EXE_PATH]
+    if flag:
+      command.append(flag)
+
+    if should_fail:
+      should_or_not = 'should'
+    else:
+      should_or_not = 'should not'
+
+    failed = not Run(command)
+
+    SetEnvVar(THROW_ON_FAILURE, None)
+
+    msg = ('when %s%s, an assertion failure in "%s" %s cause a non-zero '
+           'exit code.' %
+           (THROW_ON_FAILURE, env_var_value_msg, ' '.join(command),
+            should_or_not))
+    self.assert_(failed == should_fail, msg)
+
+  def testDefaultBehavior(self):
+    """Tests the behavior of the default mode."""
+
+    self.RunAndVerify(env_var_value=None, flag_value=None, should_fail=False)
+
+  def testThrowOnFailureEnvVar(self):
+    """Tests using the GTEST_THROW_ON_FAILURE environment variable."""
+
+    self.RunAndVerify(env_var_value='0',
+                      flag_value=None,
+                      should_fail=False)
+    self.RunAndVerify(env_var_value='1',
+                      flag_value=None,
+                      should_fail=True)
+
+  def testThrowOnFailureFlag(self):
+    """Tests using the --gtest_throw_on_failure flag."""
+
+    self.RunAndVerify(env_var_value=None,
+                      flag_value='0',
+                      should_fail=False)
+    self.RunAndVerify(env_var_value=None,
+                      flag_value='1',
+                      should_fail=True)
+
+  def testThrowOnFailureFlagOverridesEnvVar(self):
+    """Tests that --gtest_throw_on_failure overrides GTEST_THROW_ON_FAILURE."""
+
+    self.RunAndVerify(env_var_value='0',
+                      flag_value='0',
+                      should_fail=False)
+    self.RunAndVerify(env_var_value='0',
+                      flag_value='1',
+                      should_fail=True)
+    self.RunAndVerify(env_var_value='1',
+                      flag_value='0',
+                      should_fail=False)
+    self.RunAndVerify(env_var_value='1',
+                      flag_value='1',
+                      should_fail=True)
+
+
+if __name__ == '__main__':
+  gtest_test_utils.Main()
diff --git a/contrib/gtest-1.7.0/test/gtest_throw_on_failure_test_.cc b/contrib/gtest-1.7.0/test/gtest_throw_on_failure_test_.cc
new file mode 100644
index 0000000..2b88fe3
--- /dev/null
+++ b/contrib/gtest-1.7.0/test/gtest_throw_on_failure_test_.cc
@@ -0,0 +1,72 @@
+// Copyright 2009, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+
+// Tests Google Test's throw-on-failure mode with exceptions disabled.
+//
+// This program must be compiled with exceptions disabled.  It will be
+// invoked by gtest_throw_on_failure_test.py, and is expected to exit
+// with non-zero in the throw-on-failure mode or 0 otherwise.
+
+#include "gtest/gtest.h"
+
+#include <stdio.h>                      // for fflush, fprintf, NULL, etc.
+#include <stdlib.h>                     // for exit
+#include <exception>                    // for set_terminate
+
+// This terminate handler aborts the program using exit() rather than abort().
+// This avoids showing pop-ups on Windows systems and core dumps on Unix-like
+// ones.
+void TerminateHandler() {
+  fprintf(stderr, "%s\n", "Unhandled C++ exception terminating the program.");
+  fflush(NULL);
+  exit(1);
+}
+
+int main(int argc, char** argv) {
+#if GTEST_HAS_EXCEPTIONS
+  std::set_terminate(&TerminateHandler);
+#endif
+  testing::InitGoogleTest(&argc, argv);
+
+  // We want to ensure that people can use Google Test assertions in
+  // other testing frameworks, as long as they initialize Google Test
+  // properly and set the throw-on-failure mode.  Therefore, we don't
+  // use Google Test's constructs for defining and running tests
+  // (e.g. TEST and RUN_ALL_TESTS) here.
+
+  // In the throw-on-failure mode with exceptions disabled, this
+  // assertion will cause the program to exit with a non-zero code.
+  EXPECT_EQ(2, 3);
+
+  // When not in the throw-on-failure mode, the control will reach
+  // here.
+  return 0;
+}
diff --git a/contrib/gtest-1.7.0/test/gtest_uninitialized_test.py b/contrib/gtest-1.7.0/test/gtest_uninitialized_test.py
new file mode 100755
index 0000000..6ae57ee
--- /dev/null
+++ b/contrib/gtest-1.7.0/test/gtest_uninitialized_test.py
@@ -0,0 +1,70 @@
+#!/usr/bin/env python
+#
+# Copyright 2008, Google Inc.
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+#
+#     * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#     * Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following disclaimer
+# in the documentation and/or other materials provided with the
+# distribution.
+#     * Neither the name of Google Inc. nor the names of its
+# contributors may be used to endorse or promote products derived from
+# this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+"""Verifies that Google Test warns the user when not initialized properly."""
+
+__author__ = 'wan at google.com (Zhanyong Wan)'
+
+import gtest_test_utils
+
+
+COMMAND = gtest_test_utils.GetTestExecutablePath('gtest_uninitialized_test_')
+
+
+def Assert(condition):
+  if not condition:
+    raise AssertionError
+
+
+def AssertEq(expected, actual):
+  if expected != actual:
+    print 'Expected: %s' % (expected,)
+    print '  Actual: %s' % (actual,)
+    raise AssertionError
+
+
+def TestExitCodeAndOutput(command):
+  """Runs the given command and verifies its exit code and output."""
+
+  # Verifies that 'command' exits with code 1.
+  p = gtest_test_utils.Subprocess(command)
+  Assert(p.exited)
+  AssertEq(1, p.exit_code)
+  Assert('InitGoogleTest' in p.output)
+
+
+class GTestUninitializedTest(gtest_test_utils.TestCase):
+  def testExitCodeAndOutput(self):
+    TestExitCodeAndOutput(COMMAND)
+
+
+if __name__ == '__main__':
+  gtest_test_utils.Main()
diff --git a/contrib/gtest-1.7.0/test/gtest_uninitialized_test_.cc b/contrib/gtest-1.7.0/test/gtest_uninitialized_test_.cc
new file mode 100644
index 0000000..4431698
--- /dev/null
+++ b/contrib/gtest-1.7.0/test/gtest_uninitialized_test_.cc
@@ -0,0 +1,43 @@
+// Copyright 2008, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+
+#include "gtest/gtest.h"
+
+TEST(DummyTest, Dummy) {
+  // This test doesn't verify anything.  We just need it to create a
+  // realistic stage for testing the behavior of Google Test when
+  // RUN_ALL_TESTS() is called without testing::InitGoogleTest() being
+  // called first.
+}
+
+int main() {
+  return RUN_ALL_TESTS();
+}
diff --git a/contrib/gtest-1.7.0/test/gtest_unittest.cc b/contrib/gtest-1.7.0/test/gtest_unittest.cc
new file mode 100644
index 0000000..0cab07d
--- /dev/null
+++ b/contrib/gtest-1.7.0/test/gtest_unittest.cc
@@ -0,0 +1,7415 @@
+// Copyright 2005, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+//
+// Tests for Google Test itself.  This verifies that the basic constructs of
+// Google Test work.
+
+#include "gtest/gtest.h"
+
+// Verifies that the command line flag variables can be accessed
+// in code once <gtest/gtest.h> has been #included.
+// Do not move it after other #includes.
+TEST(CommandLineFlagsTest, CanBeAccessedInCodeOnceGTestHIsIncluded) {
+  bool dummy = testing::GTEST_FLAG(also_run_disabled_tests)
+      || testing::GTEST_FLAG(break_on_failure)
+      || testing::GTEST_FLAG(catch_exceptions)
+      || testing::GTEST_FLAG(color) != "unknown"
+      || testing::GTEST_FLAG(filter) != "unknown"
+      || testing::GTEST_FLAG(list_tests)
+      || testing::GTEST_FLAG(output) != "unknown"
+      || testing::GTEST_FLAG(print_time)
+      || testing::GTEST_FLAG(random_seed)
+      || testing::GTEST_FLAG(repeat) > 0
+      || testing::GTEST_FLAG(show_internal_stack_frames)
+      || testing::GTEST_FLAG(shuffle)
+      || testing::GTEST_FLAG(stack_trace_depth) > 0
+      || testing::GTEST_FLAG(stream_result_to) != "unknown"
+      || testing::GTEST_FLAG(throw_on_failure);
+  EXPECT_TRUE(dummy || !dummy);  // Suppresses warning that dummy is unused.
+}
+
+#include <limits.h>  // For INT_MAX.
+#include <stdlib.h>
+#include <string.h>
+#include <time.h>
+
+#include <map>
+#include <vector>
+#include <ostream>
+
+#include "gtest/gtest-spi.h"
+
+// Indicates that this translation unit is part of Google Test's
+// implementation.  It must come before gtest-internal-inl.h is
+// included, or there will be a compiler error.  This trick is to
+// prevent a user from accidentally including gtest-internal-inl.h in
+// his code.
+#define GTEST_IMPLEMENTATION_ 1
+#include "src/gtest-internal-inl.h"
+#undef GTEST_IMPLEMENTATION_
+
+namespace testing {
+namespace internal {
+
+#if GTEST_CAN_STREAM_RESULTS_
+
+class StreamingListenerTest : public Test {
+ public:
+  class FakeSocketWriter : public StreamingListener::AbstractSocketWriter {
+   public:
+    // Sends a string to the socket.
+    virtual void Send(const string& message) { output_ += message; }
+
+    string output_;
+  };
+
+  StreamingListenerTest()
+      : fake_sock_writer_(new FakeSocketWriter),
+        streamer_(fake_sock_writer_),
+        test_info_obj_("FooTest", "Bar", NULL, NULL, 0, NULL) {}
+
+ protected:
+  string* output() { return &(fake_sock_writer_->output_); }
+
+  FakeSocketWriter* const fake_sock_writer_;
+  StreamingListener streamer_;
+  UnitTest unit_test_;
+  TestInfo test_info_obj_;  // The name test_info_ was taken by testing::Test.
+};
+
+TEST_F(StreamingListenerTest, OnTestProgramEnd) {
+  *output() = "";
+  streamer_.OnTestProgramEnd(unit_test_);
+  EXPECT_EQ("event=TestProgramEnd&passed=1\n", *output());
+}
+
+TEST_F(StreamingListenerTest, OnTestIterationEnd) {
+  *output() = "";
+  streamer_.OnTestIterationEnd(unit_test_, 42);
+  EXPECT_EQ("event=TestIterationEnd&passed=1&elapsed_time=0ms\n", *output());
+}
+
+TEST_F(StreamingListenerTest, OnTestCaseStart) {
+  *output() = "";
+  streamer_.OnTestCaseStart(TestCase("FooTest", "Bar", NULL, NULL));
+  EXPECT_EQ("event=TestCaseStart&name=FooTest\n", *output());
+}
+
+TEST_F(StreamingListenerTest, OnTestCaseEnd) {
+  *output() = "";
+  streamer_.OnTestCaseEnd(TestCase("FooTest", "Bar", NULL, NULL));
+  EXPECT_EQ("event=TestCaseEnd&passed=1&elapsed_time=0ms\n", *output());
+}
+
+TEST_F(StreamingListenerTest, OnTestStart) {
+  *output() = "";
+  streamer_.OnTestStart(test_info_obj_);
+  EXPECT_EQ("event=TestStart&name=Bar\n", *output());
+}
+
+TEST_F(StreamingListenerTest, OnTestEnd) {
+  *output() = "";
+  streamer_.OnTestEnd(test_info_obj_);
+  EXPECT_EQ("event=TestEnd&passed=1&elapsed_time=0ms\n", *output());
+}
+
+TEST_F(StreamingListenerTest, OnTestPartResult) {
+  *output() = "";
+  streamer_.OnTestPartResult(TestPartResult(
+      TestPartResult::kFatalFailure, "foo.cc", 42, "failed=\n&%"));
+
+  // Meta characters in the failure message should be properly escaped.
+  EXPECT_EQ(
+      "event=TestPartResult&file=foo.cc&line=42&message=failed%3D%0A%26%25\n",
+      *output());
+}
+
+#endif  // GTEST_CAN_STREAM_RESULTS_
+
+// Provides access to otherwise private parts of the TestEventListeners class
+// that are needed to test it.
+class TestEventListenersAccessor {
+ public:
+  static TestEventListener* GetRepeater(TestEventListeners* listeners) {
+    return listeners->repeater();
+  }
+
+  static void SetDefaultResultPrinter(TestEventListeners* listeners,
+                                      TestEventListener* listener) {
+    listeners->SetDefaultResultPrinter(listener);
+  }
+  static void SetDefaultXmlGenerator(TestEventListeners* listeners,
+                                     TestEventListener* listener) {
+    listeners->SetDefaultXmlGenerator(listener);
+  }
+
+  static bool EventForwardingEnabled(const TestEventListeners& listeners) {
+    return listeners.EventForwardingEnabled();
+  }
+
+  static void SuppressEventForwarding(TestEventListeners* listeners) {
+    listeners->SuppressEventForwarding();
+  }
+};
+
+class UnitTestRecordPropertyTestHelper : public Test {
+ protected:
+  UnitTestRecordPropertyTestHelper() {}
+
+  // Forwards to UnitTest::RecordProperty() to bypass access controls.
+  void UnitTestRecordProperty(const char* key, const std::string& value) {
+    unit_test_.RecordProperty(key, value);
+  }
+
+  UnitTest unit_test_;
+};
+
+}  // namespace internal
+}  // namespace testing
+
+using testing::AssertionFailure;
+using testing::AssertionResult;
+using testing::AssertionSuccess;
+using testing::DoubleLE;
+using testing::EmptyTestEventListener;
+using testing::Environment;
+using testing::FloatLE;
+using testing::GTEST_FLAG(also_run_disabled_tests);
+using testing::GTEST_FLAG(break_on_failure);
+using testing::GTEST_FLAG(catch_exceptions);
+using testing::GTEST_FLAG(color);
+using testing::GTEST_FLAG(death_test_use_fork);
+using testing::GTEST_FLAG(filter);
+using testing::GTEST_FLAG(list_tests);
+using testing::GTEST_FLAG(output);
+using testing::GTEST_FLAG(print_time);
+using testing::GTEST_FLAG(random_seed);
+using testing::GTEST_FLAG(repeat);
+using testing::GTEST_FLAG(show_internal_stack_frames);
+using testing::GTEST_FLAG(shuffle);
+using testing::GTEST_FLAG(stack_trace_depth);
+using testing::GTEST_FLAG(stream_result_to);
+using testing::GTEST_FLAG(throw_on_failure);
+using testing::IsNotSubstring;
+using testing::IsSubstring;
+using testing::Message;
+using testing::ScopedFakeTestPartResultReporter;
+using testing::StaticAssertTypeEq;
+using testing::Test;
+using testing::TestCase;
+using testing::TestEventListeners;
+using testing::TestInfo;
+using testing::TestPartResult;
+using testing::TestPartResultArray;
+using testing::TestProperty;
+using testing::TestResult;
+using testing::TimeInMillis;
+using testing::UnitTest;
+using testing::kMaxStackTraceDepth;
+using testing::internal::AddReference;
+using testing::internal::AlwaysFalse;
+using testing::internal::AlwaysTrue;
+using testing::internal::AppendUserMessage;
+using testing::internal::ArrayAwareFind;
+using testing::internal::ArrayEq;
+using testing::internal::CodePointToUtf8;
+using testing::internal::CompileAssertTypesEqual;
+using testing::internal::CopyArray;
+using testing::internal::CountIf;
+using testing::internal::EqFailure;
+using testing::internal::FloatingPoint;
+using testing::internal::ForEach;
+using testing::internal::FormatEpochTimeInMillisAsIso8601;
+using testing::internal::FormatTimeInMillisAsSeconds;
+using testing::internal::GTestFlagSaver;
+using testing::internal::GetCurrentOsStackTraceExceptTop;
+using testing::internal::GetElementOr;
+using testing::internal::GetNextRandomSeed;
+using testing::internal::GetRandomSeedFromFlag;
+using testing::internal::GetTestTypeId;
+using testing::internal::GetTimeInMillis;
+using testing::internal::GetTypeId;
+using testing::internal::GetUnitTestImpl;
+using testing::internal::ImplicitlyConvertible;
+using testing::internal::Int32;
+using testing::internal::Int32FromEnvOrDie;
+using testing::internal::IsAProtocolMessage;
+using testing::internal::IsContainer;
+using testing::internal::IsContainerTest;
+using testing::internal::IsNotContainer;
+using testing::internal::NativeArray;
+using testing::internal::ParseInt32Flag;
+using testing::internal::RemoveConst;
+using testing::internal::RemoveReference;
+using testing::internal::ShouldRunTestOnShard;
+using testing::internal::ShouldShard;
+using testing::internal::ShouldUseColor;
+using testing::internal::Shuffle;
+using testing::internal::ShuffleRange;
+using testing::internal::SkipPrefix;
+using testing::internal::StreamableToString;
+using testing::internal::String;
+using testing::internal::TestEventListenersAccessor;
+using testing::internal::TestResultAccessor;
+using testing::internal::UInt32;
+using testing::internal::WideStringToUtf8;
+using testing::internal::kCopy;
+using testing::internal::kMaxRandomSeed;
+using testing::internal::kReference;
+using testing::internal::kTestTypeIdInGoogleTest;
+using testing::internal::scoped_ptr;
+
+#if GTEST_HAS_STREAM_REDIRECTION
+using testing::internal::CaptureStdout;
+using testing::internal::GetCapturedStdout;
+#endif
+
+#if GTEST_IS_THREADSAFE
+using testing::internal::ThreadWithParam;
+#endif
+
+class TestingVector : public std::vector<int> {
+};
+
+::std::ostream& operator<<(::std::ostream& os,
+                           const TestingVector& vector) {
+  os << "{ ";
+  for (size_t i = 0; i < vector.size(); i++) {
+    os << vector[i] << " ";
+  }
+  os << "}";
+  return os;
+}
+
+// This line tests that we can define tests in an unnamed namespace.
+namespace {
+
+TEST(GetRandomSeedFromFlagTest, HandlesZero) {
+  const int seed = GetRandomSeedFromFlag(0);
+  EXPECT_LE(1, seed);
+  EXPECT_LE(seed, static_cast<int>(kMaxRandomSeed));
+}
+
+TEST(GetRandomSeedFromFlagTest, PreservesValidSeed) {
+  EXPECT_EQ(1, GetRandomSeedFromFlag(1));
+  EXPECT_EQ(2, GetRandomSeedFromFlag(2));
+  EXPECT_EQ(kMaxRandomSeed - 1, GetRandomSeedFromFlag(kMaxRandomSeed - 1));
+  EXPECT_EQ(static_cast<int>(kMaxRandomSeed),
+            GetRandomSeedFromFlag(kMaxRandomSeed));
+}
+
+TEST(GetRandomSeedFromFlagTest, NormalizesInvalidSeed) {
+  const int seed1 = GetRandomSeedFromFlag(-1);
+  EXPECT_LE(1, seed1);
+  EXPECT_LE(seed1, static_cast<int>(kMaxRandomSeed));
+
+  const int seed2 = GetRandomSeedFromFlag(kMaxRandomSeed + 1);
+  EXPECT_LE(1, seed2);
+  EXPECT_LE(seed2, static_cast<int>(kMaxRandomSeed));
+}
+
+TEST(GetNextRandomSeedTest, WorksForValidInput) {
+  EXPECT_EQ(2, GetNextRandomSeed(1));
+  EXPECT_EQ(3, GetNextRandomSeed(2));
+  EXPECT_EQ(static_cast<int>(kMaxRandomSeed),
+            GetNextRandomSeed(kMaxRandomSeed - 1));
+  EXPECT_EQ(1, GetNextRandomSeed(kMaxRandomSeed));
+
+  // We deliberately don't test GetNextRandomSeed() with invalid
+  // inputs, as that requires death tests, which are expensive.  This
+  // is fine as GetNextRandomSeed() is internal and has a
+  // straightforward definition.
+}
+
+static void ClearCurrentTestPartResults() {
+  TestResultAccessor::ClearTestPartResults(
+      GetUnitTestImpl()->current_test_result());
+}
+
+// Tests GetTypeId.
+
+TEST(GetTypeIdTest, ReturnsSameValueForSameType) {
+  EXPECT_EQ(GetTypeId<int>(), GetTypeId<int>());
+  EXPECT_EQ(GetTypeId<Test>(), GetTypeId<Test>());
+}
+
+class SubClassOfTest : public Test {};
+class AnotherSubClassOfTest : public Test {};
+
+TEST(GetTypeIdTest, ReturnsDifferentValuesForDifferentTypes) {
+  EXPECT_NE(GetTypeId<int>(), GetTypeId<const int>());
+  EXPECT_NE(GetTypeId<int>(), GetTypeId<char>());
+  EXPECT_NE(GetTypeId<int>(), GetTestTypeId());
+  EXPECT_NE(GetTypeId<SubClassOfTest>(), GetTestTypeId());
+  EXPECT_NE(GetTypeId<AnotherSubClassOfTest>(), GetTestTypeId());
+  EXPECT_NE(GetTypeId<AnotherSubClassOfTest>(), GetTypeId<SubClassOfTest>());
+}
+
+// Verifies that GetTestTypeId() returns the same value, no matter it
+// is called from inside Google Test or outside of it.
+TEST(GetTestTypeIdTest, ReturnsTheSameValueInsideOrOutsideOfGoogleTest) {
+  EXPECT_EQ(kTestTypeIdInGoogleTest, GetTestTypeId());
+}
+
+// Tests FormatTimeInMillisAsSeconds().
+
+TEST(FormatTimeInMillisAsSecondsTest, FormatsZero) {
+  EXPECT_EQ("0", FormatTimeInMillisAsSeconds(0));
+}
+
+TEST(FormatTimeInMillisAsSecondsTest, FormatsPositiveNumber) {
+  EXPECT_EQ("0.003", FormatTimeInMillisAsSeconds(3));
+  EXPECT_EQ("0.01", FormatTimeInMillisAsSeconds(10));
+  EXPECT_EQ("0.2", FormatTimeInMillisAsSeconds(200));
+  EXPECT_EQ("1.2", FormatTimeInMillisAsSeconds(1200));
+  EXPECT_EQ("3", FormatTimeInMillisAsSeconds(3000));
+}
+
+TEST(FormatTimeInMillisAsSecondsTest, FormatsNegativeNumber) {
+  EXPECT_EQ("-0.003", FormatTimeInMillisAsSeconds(-3));
+  EXPECT_EQ("-0.01", FormatTimeInMillisAsSeconds(-10));
+  EXPECT_EQ("-0.2", FormatTimeInMillisAsSeconds(-200));
+  EXPECT_EQ("-1.2", FormatTimeInMillisAsSeconds(-1200));
+  EXPECT_EQ("-3", FormatTimeInMillisAsSeconds(-3000));
+}
+
+// Tests FormatEpochTimeInMillisAsIso8601().  The correctness of conversion
+// for particular dates below was verified in Python using
+// datetime.datetime.fromutctimestamp(<timetamp>/1000).
+
+// FormatEpochTimeInMillisAsIso8601 depends on the current timezone, so we
+// have to set up a particular timezone to obtain predictable results.
+class FormatEpochTimeInMillisAsIso8601Test : public Test {
+ public:
+  // On Cygwin, GCC doesn't allow unqualified integer literals to exceed
+  // 32 bits, even when 64-bit integer types are available.  We have to
+  // force the constants to have a 64-bit type here.
+  static const TimeInMillis kMillisPerSec = 1000;
+
+ private:
+  virtual void SetUp() {
+    saved_tz_ = NULL;
+#if _MSC_VER
+# pragma warning(push)          // Saves the current warning state.
+# pragma warning(disable:4996)  // Temporarily disables warning 4996
+                                // (function or variable may be unsafe
+                                // for getenv, function is deprecated for
+                                // strdup).
+    if (getenv("TZ"))
+      saved_tz_ = strdup(getenv("TZ"));
+# pragma warning(pop)           // Restores the warning state again.
+#else
+    if (getenv("TZ"))
+      saved_tz_ = strdup(getenv("TZ"));
+#endif
+
+    // Set up the time zone for FormatEpochTimeInMillisAsIso8601 to use.  We
+    // cannot use the local time zone because the function's output depends
+    // on the time zone.
+    SetTimeZone("UTC+00");
+  }
+
+  virtual void TearDown() {
+    SetTimeZone(saved_tz_);
+    free(const_cast<char*>(saved_tz_));
+    saved_tz_ = NULL;
+  }
+
+  static void SetTimeZone(const char* time_zone) {
+    // tzset() distinguishes between the TZ variable being present and empty
+    // and not being present, so we have to consider the case of time_zone
+    // being NULL.
+#if _MSC_VER
+    // ...Unless it's MSVC, whose standard library's _putenv doesn't
+    // distinguish between an empty and a missing variable.
+    const std::string env_var =
+        std::string("TZ=") + (time_zone ? time_zone : "");
+    _putenv(env_var.c_str());
+# pragma warning(push)          // Saves the current warning state.
+# pragma warning(disable:4996)  // Temporarily disables warning 4996
+                                // (function is deprecated).
+    tzset();
+# pragma warning(pop)           // Restores the warning state again.
+#else
+    if (time_zone) {
+      setenv(("TZ"), time_zone, 1);
+    } else {
+      unsetenv("TZ");
+    }
+    tzset();
+#endif
+  }
+
+  const char* saved_tz_;
+};
+
+const TimeInMillis FormatEpochTimeInMillisAsIso8601Test::kMillisPerSec;
+
+TEST_F(FormatEpochTimeInMillisAsIso8601Test, PrintsTwoDigitSegments) {
+  EXPECT_EQ("2011-10-31T18:52:42",
+            FormatEpochTimeInMillisAsIso8601(1320087162 * kMillisPerSec));
+}
+
+TEST_F(FormatEpochTimeInMillisAsIso8601Test, MillisecondsDoNotAffectResult) {
+  EXPECT_EQ(
+      "2011-10-31T18:52:42",
+      FormatEpochTimeInMillisAsIso8601(1320087162 * kMillisPerSec + 234));
+}
+
+TEST_F(FormatEpochTimeInMillisAsIso8601Test, PrintsLeadingZeroes) {
+  EXPECT_EQ("2011-09-03T05:07:02",
+            FormatEpochTimeInMillisAsIso8601(1315026422 * kMillisPerSec));
+}
+
+TEST_F(FormatEpochTimeInMillisAsIso8601Test, Prints24HourTime) {
+  EXPECT_EQ("2011-09-28T17:08:22",
+            FormatEpochTimeInMillisAsIso8601(1317229702 * kMillisPerSec));
+}
+
+TEST_F(FormatEpochTimeInMillisAsIso8601Test, PrintsEpochStart) {
+  EXPECT_EQ("1970-01-01T00:00:00", FormatEpochTimeInMillisAsIso8601(0));
+}
+
+#if GTEST_CAN_COMPARE_NULL
+
+# ifdef __BORLANDC__
+// Silences warnings: "Condition is always true", "Unreachable code"
+#  pragma option push -w-ccc -w-rch
+# endif
+
+// Tests that GTEST_IS_NULL_LITERAL_(x) is true when x is a null
+// pointer literal.
+TEST(NullLiteralTest, IsTrueForNullLiterals) {
+  EXPECT_TRUE(GTEST_IS_NULL_LITERAL_(NULL));
+  EXPECT_TRUE(GTEST_IS_NULL_LITERAL_(0));
+  EXPECT_TRUE(GTEST_IS_NULL_LITERAL_(0U));
+  EXPECT_TRUE(GTEST_IS_NULL_LITERAL_(0L));
+}
+
+// Tests that GTEST_IS_NULL_LITERAL_(x) is false when x is not a null
+// pointer literal.
+TEST(NullLiteralTest, IsFalseForNonNullLiterals) {
+  EXPECT_FALSE(GTEST_IS_NULL_LITERAL_(1));
+  EXPECT_FALSE(GTEST_IS_NULL_LITERAL_(0.0));
+  EXPECT_FALSE(GTEST_IS_NULL_LITERAL_('a'));
+  EXPECT_FALSE(GTEST_IS_NULL_LITERAL_(static_cast<void*>(NULL)));
+}
+
+# ifdef __BORLANDC__
+// Restores warnings after previous "#pragma option push" suppressed them.
+#  pragma option pop
+# endif
+
+#endif  // GTEST_CAN_COMPARE_NULL
+//
+// Tests CodePointToUtf8().
+
+// Tests that the NUL character L'\0' is encoded correctly.
+TEST(CodePointToUtf8Test, CanEncodeNul) {
+  EXPECT_EQ("", CodePointToUtf8(L'\0'));
+}
+
+// Tests that ASCII characters are encoded correctly.
+TEST(CodePointToUtf8Test, CanEncodeAscii) {
+  EXPECT_EQ("a", CodePointToUtf8(L'a'));
+  EXPECT_EQ("Z", CodePointToUtf8(L'Z'));
+  EXPECT_EQ("&", CodePointToUtf8(L'&'));
+  EXPECT_EQ("\x7F", CodePointToUtf8(L'\x7F'));
+}
+
+// Tests that Unicode code-points that have 8 to 11 bits are encoded
+// as 110xxxxx 10xxxxxx.
+TEST(CodePointToUtf8Test, CanEncode8To11Bits) {
+  // 000 1101 0011 => 110-00011 10-010011
+  EXPECT_EQ("\xC3\x93", CodePointToUtf8(L'\xD3'));
+
+  // 101 0111 0110 => 110-10101 10-110110
+  // Some compilers (e.g., GCC on MinGW) cannot handle non-ASCII codepoints
+  // in wide strings and wide chars. In order to accomodate them, we have to
+  // introduce such character constants as integers.
+  EXPECT_EQ("\xD5\xB6",
+            CodePointToUtf8(static_cast<wchar_t>(0x576)));
+}
+
+// Tests that Unicode code-points that have 12 to 16 bits are encoded
+// as 1110xxxx 10xxxxxx 10xxxxxx.
+TEST(CodePointToUtf8Test, CanEncode12To16Bits) {
+  // 0000 1000 1101 0011 => 1110-0000 10-100011 10-010011
+  EXPECT_EQ("\xE0\xA3\x93",
+            CodePointToUtf8(static_cast<wchar_t>(0x8D3)));
+
+  // 1100 0111 0100 1101 => 1110-1100 10-011101 10-001101
+  EXPECT_EQ("\xEC\x9D\x8D",
+            CodePointToUtf8(static_cast<wchar_t>(0xC74D)));
+}
+
+#if !GTEST_WIDE_STRING_USES_UTF16_
+// Tests in this group require a wchar_t to hold > 16 bits, and thus
+// are skipped on Windows, Cygwin, and Symbian, where a wchar_t is
+// 16-bit wide. This code may not compile on those systems.
+
+// Tests that Unicode code-points that have 17 to 21 bits are encoded
+// as 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx.
+TEST(CodePointToUtf8Test, CanEncode17To21Bits) {
+  // 0 0001 0000 1000 1101 0011 => 11110-000 10-010000 10-100011 10-010011
+  EXPECT_EQ("\xF0\x90\xA3\x93", CodePointToUtf8(L'\x108D3'));
+
+  // 0 0001 0000 0100 0000 0000 => 11110-000 10-010000 10-010000 10-000000
+  EXPECT_EQ("\xF0\x90\x90\x80", CodePointToUtf8(L'\x10400'));
+
+  // 1 0000 1000 0110 0011 0100 => 11110-100 10-001000 10-011000 10-110100
+  EXPECT_EQ("\xF4\x88\x98\xB4", CodePointToUtf8(L'\x108634'));
+}
+
+// Tests that encoding an invalid code-point generates the expected result.
+TEST(CodePointToUtf8Test, CanEncodeInvalidCodePoint) {
+  EXPECT_EQ("(Invalid Unicode 0x1234ABCD)", CodePointToUtf8(L'\x1234ABCD'));
+}
+
+#endif  // !GTEST_WIDE_STRING_USES_UTF16_
+
+// Tests WideStringToUtf8().
+
+// Tests that the NUL character L'\0' is encoded correctly.
+TEST(WideStringToUtf8Test, CanEncodeNul) {
+  EXPECT_STREQ("", WideStringToUtf8(L"", 0).c_str());
+  EXPECT_STREQ("", WideStringToUtf8(L"", -1).c_str());
+}
+
+// Tests that ASCII strings are encoded correctly.
+TEST(WideStringToUtf8Test, CanEncodeAscii) {
+  EXPECT_STREQ("a", WideStringToUtf8(L"a", 1).c_str());
+  EXPECT_STREQ("ab", WideStringToUtf8(L"ab", 2).c_str());
+  EXPECT_STREQ("a", WideStringToUtf8(L"a", -1).c_str());
+  EXPECT_STREQ("ab", WideStringToUtf8(L"ab", -1).c_str());
+}
+
+// Tests that Unicode code-points that have 8 to 11 bits are encoded
+// as 110xxxxx 10xxxxxx.
+TEST(WideStringToUtf8Test, CanEncode8To11Bits) {
+  // 000 1101 0011 => 110-00011 10-010011
+  EXPECT_STREQ("\xC3\x93", WideStringToUtf8(L"\xD3", 1).c_str());
+  EXPECT_STREQ("\xC3\x93", WideStringToUtf8(L"\xD3", -1).c_str());
+
+  // 101 0111 0110 => 110-10101 10-110110
+  const wchar_t s[] = { 0x576, '\0' };
+  EXPECT_STREQ("\xD5\xB6", WideStringToUtf8(s, 1).c_str());
+  EXPECT_STREQ("\xD5\xB6", WideStringToUtf8(s, -1).c_str());
+}
+
+// Tests that Unicode code-points that have 12 to 16 bits are encoded
+// as 1110xxxx 10xxxxxx 10xxxxxx.
+TEST(WideStringToUtf8Test, CanEncode12To16Bits) {
+  // 0000 1000 1101 0011 => 1110-0000 10-100011 10-010011
+  const wchar_t s1[] = { 0x8D3, '\0' };
+  EXPECT_STREQ("\xE0\xA3\x93", WideStringToUtf8(s1, 1).c_str());
+  EXPECT_STREQ("\xE0\xA3\x93", WideStringToUtf8(s1, -1).c_str());
+
+  // 1100 0111 0100 1101 => 1110-1100 10-011101 10-001101
+  const wchar_t s2[] = { 0xC74D, '\0' };
+  EXPECT_STREQ("\xEC\x9D\x8D", WideStringToUtf8(s2, 1).c_str());
+  EXPECT_STREQ("\xEC\x9D\x8D", WideStringToUtf8(s2, -1).c_str());
+}
+
+// Tests that the conversion stops when the function encounters \0 character.
+TEST(WideStringToUtf8Test, StopsOnNulCharacter) {
+  EXPECT_STREQ("ABC", WideStringToUtf8(L"ABC\0XYZ", 100).c_str());
+}
+
+// Tests that the conversion stops when the function reaches the limit
+// specified by the 'length' parameter.
+TEST(WideStringToUtf8Test, StopsWhenLengthLimitReached) {
+  EXPECT_STREQ("ABC", WideStringToUtf8(L"ABCDEF", 3).c_str());
+}
+
+#if !GTEST_WIDE_STRING_USES_UTF16_
+// Tests that Unicode code-points that have 17 to 21 bits are encoded
+// as 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx. This code may not compile
+// on the systems using UTF-16 encoding.
+TEST(WideStringToUtf8Test, CanEncode17To21Bits) {
+  // 0 0001 0000 1000 1101 0011 => 11110-000 10-010000 10-100011 10-010011
+  EXPECT_STREQ("\xF0\x90\xA3\x93", WideStringToUtf8(L"\x108D3", 1).c_str());
+  EXPECT_STREQ("\xF0\x90\xA3\x93", WideStringToUtf8(L"\x108D3", -1).c_str());
+
+  // 1 0000 1000 0110 0011 0100 => 11110-100 10-001000 10-011000 10-110100
+  EXPECT_STREQ("\xF4\x88\x98\xB4", WideStringToUtf8(L"\x108634", 1).c_str());
+  EXPECT_STREQ("\xF4\x88\x98\xB4", WideStringToUtf8(L"\x108634", -1).c_str());
+}
+
+// Tests that encoding an invalid code-point generates the expected result.
+TEST(WideStringToUtf8Test, CanEncodeInvalidCodePoint) {
+  EXPECT_STREQ("(Invalid Unicode 0xABCDFF)",
+               WideStringToUtf8(L"\xABCDFF", -1).c_str());
+}
+#else  // !GTEST_WIDE_STRING_USES_UTF16_
+// Tests that surrogate pairs are encoded correctly on the systems using
+// UTF-16 encoding in the wide strings.
+TEST(WideStringToUtf8Test, CanEncodeValidUtf16SUrrogatePairs) {
+  const wchar_t s[] = { 0xD801, 0xDC00, '\0' };
+  EXPECT_STREQ("\xF0\x90\x90\x80", WideStringToUtf8(s, -1).c_str());
+}
+
+// Tests that encoding an invalid UTF-16 surrogate pair
+// generates the expected result.
+TEST(WideStringToUtf8Test, CanEncodeInvalidUtf16SurrogatePair) {
+  // Leading surrogate is at the end of the string.
+  const wchar_t s1[] = { 0xD800, '\0' };
+  EXPECT_STREQ("\xED\xA0\x80", WideStringToUtf8(s1, -1).c_str());
+  // Leading surrogate is not followed by the trailing surrogate.
+  const wchar_t s2[] = { 0xD800, 'M', '\0' };
+  EXPECT_STREQ("\xED\xA0\x80M", WideStringToUtf8(s2, -1).c_str());
+  // Trailing surrogate appearas without a leading surrogate.
+  const wchar_t s3[] = { 0xDC00, 'P', 'Q', 'R', '\0' };
+  EXPECT_STREQ("\xED\xB0\x80PQR", WideStringToUtf8(s3, -1).c_str());
+}
+#endif  // !GTEST_WIDE_STRING_USES_UTF16_
+
+// Tests that codepoint concatenation works correctly.
+#if !GTEST_WIDE_STRING_USES_UTF16_
+TEST(WideStringToUtf8Test, ConcatenatesCodepointsCorrectly) {
+  const wchar_t s[] = { 0x108634, 0xC74D, '\n', 0x576, 0x8D3, 0x108634, '\0'};
+  EXPECT_STREQ(
+      "\xF4\x88\x98\xB4"
+          "\xEC\x9D\x8D"
+          "\n"
+          "\xD5\xB6"
+          "\xE0\xA3\x93"
+          "\xF4\x88\x98\xB4",
+      WideStringToUtf8(s, -1).c_str());
+}
+#else
+TEST(WideStringToUtf8Test, ConcatenatesCodepointsCorrectly) {
+  const wchar_t s[] = { 0xC74D, '\n', 0x576, 0x8D3, '\0'};
+  EXPECT_STREQ(
+      "\xEC\x9D\x8D" "\n" "\xD5\xB6" "\xE0\xA3\x93",
+      WideStringToUtf8(s, -1).c_str());
+}
+#endif  // !GTEST_WIDE_STRING_USES_UTF16_
+
+// Tests the Random class.
+
+TEST(RandomDeathTest, GeneratesCrashesOnInvalidRange) {
+  testing::internal::Random random(42);
+  EXPECT_DEATH_IF_SUPPORTED(
+      random.Generate(0),
+      "Cannot generate a number in the range \\[0, 0\\)");
+  EXPECT_DEATH_IF_SUPPORTED(
+      random.Generate(testing::internal::Random::kMaxRange + 1),
+      "Generation of a number in \\[0, 2147483649\\) was requested, "
+      "but this can only generate numbers in \\[0, 2147483648\\)");
+}
+
+TEST(RandomTest, GeneratesNumbersWithinRange) {
+  const UInt32 kRange = 10000;
+  testing::internal::Random random(12345);
+  for (int i = 0; i < 10; i++) {
+    EXPECT_LT(random.Generate(kRange), kRange) << " for iteration " << i;
+  }
+
+  testing::internal::Random random2(testing::internal::Random::kMaxRange);
+  for (int i = 0; i < 10; i++) {
+    EXPECT_LT(random2.Generate(kRange), kRange) << " for iteration " << i;
+  }
+}
+
+TEST(RandomTest, RepeatsWhenReseeded) {
+  const int kSeed = 123;
+  const int kArraySize = 10;
+  const UInt32 kRange = 10000;
+  UInt32 values[kArraySize];
+
+  testing::internal::Random random(kSeed);
+  for (int i = 0; i < kArraySize; i++) {
+    values[i] = random.Generate(kRange);
+  }
+
+  random.Reseed(kSeed);
+  for (int i = 0; i < kArraySize; i++) {
+    EXPECT_EQ(values[i], random.Generate(kRange)) << " for iteration " << i;
+  }
+}
+
+// Tests STL container utilities.
+
+// Tests CountIf().
+
+static bool IsPositive(int n) { return n > 0; }
+
+TEST(ContainerUtilityTest, CountIf) {
+  std::vector<int> v;
+  EXPECT_EQ(0, CountIf(v, IsPositive));  // Works for an empty container.
+
+  v.push_back(-1);
+  v.push_back(0);
+  EXPECT_EQ(0, CountIf(v, IsPositive));  // Works when no value satisfies.
+
+  v.push_back(2);
+  v.push_back(-10);
+  v.push_back(10);
+  EXPECT_EQ(2, CountIf(v, IsPositive));
+}
+
+// Tests ForEach().
+
+static int g_sum = 0;
+static void Accumulate(int n) { g_sum += n; }
+
+TEST(ContainerUtilityTest, ForEach) {
+  std::vector<int> v;
+  g_sum = 0;
+  ForEach(v, Accumulate);
+  EXPECT_EQ(0, g_sum);  // Works for an empty container;
+
+  g_sum = 0;
+  v.push_back(1);
+  ForEach(v, Accumulate);
+  EXPECT_EQ(1, g_sum);  // Works for a container with one element.
+
+  g_sum = 0;
+  v.push_back(20);
+  v.push_back(300);
+  ForEach(v, Accumulate);
+  EXPECT_EQ(321, g_sum);
+}
+
+// Tests GetElementOr().
+TEST(ContainerUtilityTest, GetElementOr) {
+  std::vector<char> a;
+  EXPECT_EQ('x', GetElementOr(a, 0, 'x'));
+
+  a.push_back('a');
+  a.push_back('b');
+  EXPECT_EQ('a', GetElementOr(a, 0, 'x'));
+  EXPECT_EQ('b', GetElementOr(a, 1, 'x'));
+  EXPECT_EQ('x', GetElementOr(a, -2, 'x'));
+  EXPECT_EQ('x', GetElementOr(a, 2, 'x'));
+}
+
+TEST(ContainerUtilityDeathTest, ShuffleRange) {
+  std::vector<int> a;
+  a.push_back(0);
+  a.push_back(1);
+  a.push_back(2);
+  testing::internal::Random random(1);
+
+  EXPECT_DEATH_IF_SUPPORTED(
+      ShuffleRange(&random, -1, 1, &a),
+      "Invalid shuffle range start -1: must be in range \\[0, 3\\]");
+  EXPECT_DEATH_IF_SUPPORTED(
+      ShuffleRange(&random, 4, 4, &a),
+      "Invalid shuffle range start 4: must be in range \\[0, 3\\]");
+  EXPECT_DEATH_IF_SUPPORTED(
+      ShuffleRange(&random, 3, 2, &a),
+      "Invalid shuffle range finish 2: must be in range \\[3, 3\\]");
+  EXPECT_DEATH_IF_SUPPORTED(
+      ShuffleRange(&random, 3, 4, &a),
+      "Invalid shuffle range finish 4: must be in range \\[3, 3\\]");
+}
+
+class VectorShuffleTest : public Test {
+ protected:
+  static const int kVectorSize = 20;
+
+  VectorShuffleTest() : random_(1) {
+    for (int i = 0; i < kVectorSize; i++) {
+      vector_.push_back(i);
+    }
+  }
+
+  static bool VectorIsCorrupt(const TestingVector& vector) {
+    if (kVectorSize != static_cast<int>(vector.size())) {
+      return true;
+    }
+
+    bool found_in_vector[kVectorSize] = { false };
+    for (size_t i = 0; i < vector.size(); i++) {
+      const int e = vector[i];
+      if (e < 0 || e >= kVectorSize || found_in_vector[e]) {
+        return true;
+      }
+      found_in_vector[e] = true;
+    }
+
+    // Vector size is correct, elements' range is correct, no
+    // duplicate elements.  Therefore no corruption has occurred.
+    return false;
+  }
+
+  static bool VectorIsNotCorrupt(const TestingVector& vector) {
+    return !VectorIsCorrupt(vector);
+  }
+
+  static bool RangeIsShuffled(const TestingVector& vector, int begin, int end) {
+    for (int i = begin; i < end; i++) {
+      if (i != vector[i]) {
+        return true;
+      }
+    }
+    return false;
+  }
+
+  static bool RangeIsUnshuffled(
+      const TestingVector& vector, int begin, int end) {
+    return !RangeIsShuffled(vector, begin, end);
+  }
+
+  static bool VectorIsShuffled(const TestingVector& vector) {
+    return RangeIsShuffled(vector, 0, static_cast<int>(vector.size()));
+  }
+
+  static bool VectorIsUnshuffled(const TestingVector& vector) {
+    return !VectorIsShuffled(vector);
+  }
+
+  testing::internal::Random random_;
+  TestingVector vector_;
+};  // class VectorShuffleTest
+
+const int VectorShuffleTest::kVectorSize;
+
+TEST_F(VectorShuffleTest, HandlesEmptyRange) {
+  // Tests an empty range at the beginning...
+  ShuffleRange(&random_, 0, 0, &vector_);
+  ASSERT_PRED1(VectorIsNotCorrupt, vector_);
+  ASSERT_PRED1(VectorIsUnshuffled, vector_);
+
+  // ...in the middle...
+  ShuffleRange(&random_, kVectorSize/2, kVectorSize/2, &vector_);
+  ASSERT_PRED1(VectorIsNotCorrupt, vector_);
+  ASSERT_PRED1(VectorIsUnshuffled, vector_);
+
+  // ...at the end...
+  ShuffleRange(&random_, kVectorSize - 1, kVectorSize - 1, &vector_);
+  ASSERT_PRED1(VectorIsNotCorrupt, vector_);
+  ASSERT_PRED1(VectorIsUnshuffled, vector_);
+
+  // ...and past the end.
+  ShuffleRange(&random_, kVectorSize, kVectorSize, &vector_);
+  ASSERT_PRED1(VectorIsNotCorrupt, vector_);
+  ASSERT_PRED1(VectorIsUnshuffled, vector_);
+}
+
+TEST_F(VectorShuffleTest, HandlesRangeOfSizeOne) {
+  // Tests a size one range at the beginning...
+  ShuffleRange(&random_, 0, 1, &vector_);
+  ASSERT_PRED1(VectorIsNotCorrupt, vector_);
+  ASSERT_PRED1(VectorIsUnshuffled, vector_);
+
+  // ...in the middle...
+  ShuffleRange(&random_, kVectorSize/2, kVectorSize/2 + 1, &vector_);
+  ASSERT_PRED1(VectorIsNotCorrupt, vector_);
+  ASSERT_PRED1(VectorIsUnshuffled, vector_);
+
+  // ...and at the end.
+  ShuffleRange(&random_, kVectorSize - 1, kVectorSize, &vector_);
+  ASSERT_PRED1(VectorIsNotCorrupt, vector_);
+  ASSERT_PRED1(VectorIsUnshuffled, vector_);
+}
+
+// Because we use our own random number generator and a fixed seed,
+// we can guarantee that the following "random" tests will succeed.
+
+TEST_F(VectorShuffleTest, ShufflesEntireVector) {
+  Shuffle(&random_, &vector_);
+  ASSERT_PRED1(VectorIsNotCorrupt, vector_);
+  EXPECT_FALSE(VectorIsUnshuffled(vector_)) << vector_;
+
+  // Tests the first and last elements in particular to ensure that
+  // there are no off-by-one problems in our shuffle algorithm.
+  EXPECT_NE(0, vector_[0]);
+  EXPECT_NE(kVectorSize - 1, vector_[kVectorSize - 1]);
+}
+
+TEST_F(VectorShuffleTest, ShufflesStartOfVector) {
+  const int kRangeSize = kVectorSize/2;
+
+  ShuffleRange(&random_, 0, kRangeSize, &vector_);
+
+  ASSERT_PRED1(VectorIsNotCorrupt, vector_);
+  EXPECT_PRED3(RangeIsShuffled, vector_, 0, kRangeSize);
+  EXPECT_PRED3(RangeIsUnshuffled, vector_, kRangeSize, kVectorSize);
+}
+
+TEST_F(VectorShuffleTest, ShufflesEndOfVector) {
+  const int kRangeSize = kVectorSize / 2;
+  ShuffleRange(&random_, kRangeSize, kVectorSize, &vector_);
+
+  ASSERT_PRED1(VectorIsNotCorrupt, vector_);
+  EXPECT_PRED3(RangeIsUnshuffled, vector_, 0, kRangeSize);
+  EXPECT_PRED3(RangeIsShuffled, vector_, kRangeSize, kVectorSize);
+}
+
+TEST_F(VectorShuffleTest, ShufflesMiddleOfVector) {
+  int kRangeSize = kVectorSize/3;
+  ShuffleRange(&random_, kRangeSize, 2*kRangeSize, &vector_);
+
+  ASSERT_PRED1(VectorIsNotCorrupt, vector_);
+  EXPECT_PRED3(RangeIsUnshuffled, vector_, 0, kRangeSize);
+  EXPECT_PRED3(RangeIsShuffled, vector_, kRangeSize, 2*kRangeSize);
+  EXPECT_PRED3(RangeIsUnshuffled, vector_, 2*kRangeSize, kVectorSize);
+}
+
+TEST_F(VectorShuffleTest, ShufflesRepeatably) {
+  TestingVector vector2;
+  for (int i = 0; i < kVectorSize; i++) {
+    vector2.push_back(i);
+  }
+
+  random_.Reseed(1234);
+  Shuffle(&random_, &vector_);
+  random_.Reseed(1234);
+  Shuffle(&random_, &vector2);
+
+  ASSERT_PRED1(VectorIsNotCorrupt, vector_);
+  ASSERT_PRED1(VectorIsNotCorrupt, vector2);
+
+  for (int i = 0; i < kVectorSize; i++) {
+    EXPECT_EQ(vector_[i], vector2[i]) << " where i is " << i;
+  }
+}
+
+// Tests the size of the AssertHelper class.
+
+TEST(AssertHelperTest, AssertHelperIsSmall) {
+  // To avoid breaking clients that use lots of assertions in one
+  // function, we cannot grow the size of AssertHelper.
+  EXPECT_LE(sizeof(testing::internal::AssertHelper), sizeof(void*));
+}
+
+// Tests String::EndsWithCaseInsensitive().
+TEST(StringTest, EndsWithCaseInsensitive) {
+  EXPECT_TRUE(String::EndsWithCaseInsensitive("foobar", "BAR"));
+  EXPECT_TRUE(String::EndsWithCaseInsensitive("foobaR", "bar"));
+  EXPECT_TRUE(String::EndsWithCaseInsensitive("foobar", ""));
+  EXPECT_TRUE(String::EndsWithCaseInsensitive("", ""));
+
+  EXPECT_FALSE(String::EndsWithCaseInsensitive("Foobar", "foo"));
+  EXPECT_FALSE(String::EndsWithCaseInsensitive("foobar", "Foo"));
+  EXPECT_FALSE(String::EndsWithCaseInsensitive("", "foo"));
+}
+
+// C++Builder's preprocessor is buggy; it fails to expand macros that
+// appear in macro parameters after wide char literals.  Provide an alias
+// for NULL as a workaround.
+static const wchar_t* const kNull = NULL;
+
+// Tests String::CaseInsensitiveWideCStringEquals
+TEST(StringTest, CaseInsensitiveWideCStringEquals) {
+  EXPECT_TRUE(String::CaseInsensitiveWideCStringEquals(NULL, NULL));
+  EXPECT_FALSE(String::CaseInsensitiveWideCStringEquals(kNull, L""));
+  EXPECT_FALSE(String::CaseInsensitiveWideCStringEquals(L"", kNull));
+  EXPECT_FALSE(String::CaseInsensitiveWideCStringEquals(kNull, L"foobar"));
+  EXPECT_FALSE(String::CaseInsensitiveWideCStringEquals(L"foobar", kNull));
+  EXPECT_TRUE(String::CaseInsensitiveWideCStringEquals(L"foobar", L"foobar"));
+  EXPECT_TRUE(String::CaseInsensitiveWideCStringEquals(L"foobar", L"FOOBAR"));
+  EXPECT_TRUE(String::CaseInsensitiveWideCStringEquals(L"FOOBAR", L"foobar"));
+}
+
+#if GTEST_OS_WINDOWS
+
+// Tests String::ShowWideCString().
+TEST(StringTest, ShowWideCString) {
+  EXPECT_STREQ("(null)",
+               String::ShowWideCString(NULL).c_str());
+  EXPECT_STREQ("", String::ShowWideCString(L"").c_str());
+  EXPECT_STREQ("foo", String::ShowWideCString(L"foo").c_str());
+}
+
+# if GTEST_OS_WINDOWS_MOBILE
+TEST(StringTest, AnsiAndUtf16Null) {
+  EXPECT_EQ(NULL, String::AnsiToUtf16(NULL));
+  EXPECT_EQ(NULL, String::Utf16ToAnsi(NULL));
+}
+
+TEST(StringTest, AnsiAndUtf16ConvertBasic) {
+  const char* ansi = String::Utf16ToAnsi(L"str");
+  EXPECT_STREQ("str", ansi);
+  delete [] ansi;
+  const WCHAR* utf16 = String::AnsiToUtf16("str");
+  EXPECT_EQ(0, wcsncmp(L"str", utf16, 3));
+  delete [] utf16;
+}
+
+TEST(StringTest, AnsiAndUtf16ConvertPathChars) {
+  const char* ansi = String::Utf16ToAnsi(L".:\\ \"*?");
+  EXPECT_STREQ(".:\\ \"*?", ansi);
+  delete [] ansi;
+  const WCHAR* utf16 = String::AnsiToUtf16(".:\\ \"*?");
+  EXPECT_EQ(0, wcsncmp(L".:\\ \"*?", utf16, 3));
+  delete [] utf16;
+}
+# endif  // GTEST_OS_WINDOWS_MOBILE
+
+#endif  // GTEST_OS_WINDOWS
+
+// Tests TestProperty construction.
+TEST(TestPropertyTest, StringValue) {
+  TestProperty property("key", "1");
+  EXPECT_STREQ("key", property.key());
+  EXPECT_STREQ("1", property.value());
+}
+
+// Tests TestProperty replacing a value.
+TEST(TestPropertyTest, ReplaceStringValue) {
+  TestProperty property("key", "1");
+  EXPECT_STREQ("1", property.value());
+  property.SetValue("2");
+  EXPECT_STREQ("2", property.value());
+}
+
+// AddFatalFailure() and AddNonfatalFailure() must be stand-alone
+// functions (i.e. their definitions cannot be inlined at the call
+// sites), or C++Builder won't compile the code.
+static void AddFatalFailure() {
+  FAIL() << "Expected fatal failure.";
+}
+
+static void AddNonfatalFailure() {
+  ADD_FAILURE() << "Expected non-fatal failure.";
+}
+
+class ScopedFakeTestPartResultReporterTest : public Test {
+ public:  // Must be public and not protected due to a bug in g++ 3.4.2.
+  enum FailureMode {
+    FATAL_FAILURE,
+    NONFATAL_FAILURE
+  };
+  static void AddFailure(FailureMode failure) {
+    if (failure == FATAL_FAILURE) {
+      AddFatalFailure();
+    } else {
+      AddNonfatalFailure();
+    }
+  }
+};
+
+// Tests that ScopedFakeTestPartResultReporter intercepts test
+// failures.
+TEST_F(ScopedFakeTestPartResultReporterTest, InterceptsTestFailures) {
+  TestPartResultArray results;
+  {
+    ScopedFakeTestPartResultReporter reporter(
+        ScopedFakeTestPartResultReporter::INTERCEPT_ONLY_CURRENT_THREAD,
+        &results);
+    AddFailure(NONFATAL_FAILURE);
+    AddFailure(FATAL_FAILURE);
+  }
+
+  EXPECT_EQ(2, results.size());
+  EXPECT_TRUE(results.GetTestPartResult(0).nonfatally_failed());
+  EXPECT_TRUE(results.GetTestPartResult(1).fatally_failed());
+}
+
+TEST_F(ScopedFakeTestPartResultReporterTest, DeprecatedConstructor) {
+  TestPartResultArray results;
+  {
+    // Tests, that the deprecated constructor still works.
+    ScopedFakeTestPartResultReporter reporter(&results);
+    AddFailure(NONFATAL_FAILURE);
+  }
+  EXPECT_EQ(1, results.size());
+}
+
+#if GTEST_IS_THREADSAFE
+
+class ScopedFakeTestPartResultReporterWithThreadsTest
+  : public ScopedFakeTestPartResultReporterTest {
+ protected:
+  static void AddFailureInOtherThread(FailureMode failure) {
+    ThreadWithParam<FailureMode> thread(&AddFailure, failure, NULL);
+    thread.Join();
+  }
+};
+
+TEST_F(ScopedFakeTestPartResultReporterWithThreadsTest,
+       InterceptsTestFailuresInAllThreads) {
+  TestPartResultArray results;
+  {
+    ScopedFakeTestPartResultReporter reporter(
+        ScopedFakeTestPartResultReporter::INTERCEPT_ALL_THREADS, &results);
+    AddFailure(NONFATAL_FAILURE);
+    AddFailure(FATAL_FAILURE);
+    AddFailureInOtherThread(NONFATAL_FAILURE);
+    AddFailureInOtherThread(FATAL_FAILURE);
+  }
+
+  EXPECT_EQ(4, results.size());
+  EXPECT_TRUE(results.GetTestPartResult(0).nonfatally_failed());
+  EXPECT_TRUE(results.GetTestPartResult(1).fatally_failed());
+  EXPECT_TRUE(results.GetTestPartResult(2).nonfatally_failed());
+  EXPECT_TRUE(results.GetTestPartResult(3).fatally_failed());
+}
+
+#endif  // GTEST_IS_THREADSAFE
+
+// Tests EXPECT_FATAL_FAILURE{,ON_ALL_THREADS}.  Makes sure that they
+// work even if the failure is generated in a called function rather than
+// the current context.
+
+typedef ScopedFakeTestPartResultReporterTest ExpectFatalFailureTest;
+
+TEST_F(ExpectFatalFailureTest, CatchesFatalFaliure) {
+  EXPECT_FATAL_FAILURE(AddFatalFailure(), "Expected fatal failure.");
+}
+
+#if GTEST_HAS_GLOBAL_STRING
+TEST_F(ExpectFatalFailureTest, AcceptsStringObject) {
+  EXPECT_FATAL_FAILURE(AddFatalFailure(), ::string("Expected fatal failure."));
+}
+#endif
+
+TEST_F(ExpectFatalFailureTest, AcceptsStdStringObject) {
+  EXPECT_FATAL_FAILURE(AddFatalFailure(),
+                       ::std::string("Expected fatal failure."));
+}
+
+TEST_F(ExpectFatalFailureTest, CatchesFatalFailureOnAllThreads) {
+  // We have another test below to verify that the macro catches fatal
+  // failures generated on another thread.
+  EXPECT_FATAL_FAILURE_ON_ALL_THREADS(AddFatalFailure(),
+                                      "Expected fatal failure.");
+}
+
+#ifdef __BORLANDC__
+// Silences warnings: "Condition is always true"
+# pragma option push -w-ccc
+#endif
+
+// Tests that EXPECT_FATAL_FAILURE() can be used in a non-void
+// function even when the statement in it contains ASSERT_*.
+
+int NonVoidFunction() {
+  EXPECT_FATAL_FAILURE(ASSERT_TRUE(false), "");
+  EXPECT_FATAL_FAILURE_ON_ALL_THREADS(FAIL(), "");
+  return 0;
+}
+
+TEST_F(ExpectFatalFailureTest, CanBeUsedInNonVoidFunction) {
+  NonVoidFunction();
+}
+
+// Tests that EXPECT_FATAL_FAILURE(statement, ...) doesn't abort the
+// current function even though 'statement' generates a fatal failure.
+
+void DoesNotAbortHelper(bool* aborted) {
+  EXPECT_FATAL_FAILURE(ASSERT_TRUE(false), "");
+  EXPECT_FATAL_FAILURE_ON_ALL_THREADS(FAIL(), "");
+
+  *aborted = false;
+}
+
+#ifdef __BORLANDC__
+// Restores warnings after previous "#pragma option push" suppressed them.
+# pragma option pop
+#endif
+
+TEST_F(ExpectFatalFailureTest, DoesNotAbort) {
+  bool aborted = true;
+  DoesNotAbortHelper(&aborted);
+  EXPECT_FALSE(aborted);
+}
+
+// Tests that the EXPECT_FATAL_FAILURE{,_ON_ALL_THREADS} accepts a
+// statement that contains a macro which expands to code containing an
+// unprotected comma.
+
+static int global_var = 0;
+#define GTEST_USE_UNPROTECTED_COMMA_ global_var++, global_var++
+
+TEST_F(ExpectFatalFailureTest, AcceptsMacroThatExpandsToUnprotectedComma) {
+#ifndef __BORLANDC__
+  // ICE's in C++Builder.
+  EXPECT_FATAL_FAILURE({
+    GTEST_USE_UNPROTECTED_COMMA_;
+    AddFatalFailure();
+  }, "");
+#endif
+
+  EXPECT_FATAL_FAILURE_ON_ALL_THREADS({
+    GTEST_USE_UNPROTECTED_COMMA_;
+    AddFatalFailure();
+  }, "");
+}
+
+// Tests EXPECT_NONFATAL_FAILURE{,ON_ALL_THREADS}.
+
+typedef ScopedFakeTestPartResultReporterTest ExpectNonfatalFailureTest;
+
+TEST_F(ExpectNonfatalFailureTest, CatchesNonfatalFailure) {
+  EXPECT_NONFATAL_FAILURE(AddNonfatalFailure(),
+                          "Expected non-fatal failure.");
+}
+
+#if GTEST_HAS_GLOBAL_STRING
+TEST_F(ExpectNonfatalFailureTest, AcceptsStringObject) {
+  EXPECT_NONFATAL_FAILURE(AddNonfatalFailure(),
+                          ::string("Expected non-fatal failure."));
+}
+#endif
+
+TEST_F(ExpectNonfatalFailureTest, AcceptsStdStringObject) {
+  EXPECT_NONFATAL_FAILURE(AddNonfatalFailure(),
+                          ::std::string("Expected non-fatal failure."));
+}
+
+TEST_F(ExpectNonfatalFailureTest, CatchesNonfatalFailureOnAllThreads) {
+  // We have another test below to verify that the macro catches
+  // non-fatal failures generated on another thread.
+  EXPECT_NONFATAL_FAILURE_ON_ALL_THREADS(AddNonfatalFailure(),
+                                         "Expected non-fatal failure.");
+}
+
+// Tests that the EXPECT_NONFATAL_FAILURE{,_ON_ALL_THREADS} accepts a
+// statement that contains a macro which expands to code containing an
+// unprotected comma.
+TEST_F(ExpectNonfatalFailureTest, AcceptsMacroThatExpandsToUnprotectedComma) {
+  EXPECT_NONFATAL_FAILURE({
+    GTEST_USE_UNPROTECTED_COMMA_;
+    AddNonfatalFailure();
+  }, "");
+
+  EXPECT_NONFATAL_FAILURE_ON_ALL_THREADS({
+    GTEST_USE_UNPROTECTED_COMMA_;
+    AddNonfatalFailure();
+  }, "");
+}
+
+#if GTEST_IS_THREADSAFE
+
+typedef ScopedFakeTestPartResultReporterWithThreadsTest
+    ExpectFailureWithThreadsTest;
+
+TEST_F(ExpectFailureWithThreadsTest, ExpectFatalFailureOnAllThreads) {
+  EXPECT_FATAL_FAILURE_ON_ALL_THREADS(AddFailureInOtherThread(FATAL_FAILURE),
+                                      "Expected fatal failure.");
+}
+
+TEST_F(ExpectFailureWithThreadsTest, ExpectNonFatalFailureOnAllThreads) {
+  EXPECT_NONFATAL_FAILURE_ON_ALL_THREADS(
+      AddFailureInOtherThread(NONFATAL_FAILURE), "Expected non-fatal failure.");
+}
+
+#endif  // GTEST_IS_THREADSAFE
+
+// Tests the TestProperty class.
+
+TEST(TestPropertyTest, ConstructorWorks) {
+  const TestProperty property("key", "value");
+  EXPECT_STREQ("key", property.key());
+  EXPECT_STREQ("value", property.value());
+}
+
+TEST(TestPropertyTest, SetValue) {
+  TestProperty property("key", "value_1");
+  EXPECT_STREQ("key", property.key());
+  property.SetValue("value_2");
+  EXPECT_STREQ("key", property.key());
+  EXPECT_STREQ("value_2", property.value());
+}
+
+// Tests the TestResult class
+
+// The test fixture for testing TestResult.
+class TestResultTest : public Test {
+ protected:
+  typedef std::vector<TestPartResult> TPRVector;
+
+  // We make use of 2 TestPartResult objects,
+  TestPartResult * pr1, * pr2;
+
+  // ... and 3 TestResult objects.
+  TestResult * r0, * r1, * r2;
+
+  virtual void SetUp() {
+    // pr1 is for success.
+    pr1 = new TestPartResult(TestPartResult::kSuccess,
+                             "foo/bar.cc",
+                             10,
+                             "Success!");
+
+    // pr2 is for fatal failure.
+    pr2 = new TestPartResult(TestPartResult::kFatalFailure,
+                             "foo/bar.cc",
+                             -1,  // This line number means "unknown"
+                             "Failure!");
+
+    // Creates the TestResult objects.
+    r0 = new TestResult();
+    r1 = new TestResult();
+    r2 = new TestResult();
+
+    // In order to test TestResult, we need to modify its internal
+    // state, in particular the TestPartResult vector it holds.
+    // test_part_results() returns a const reference to this vector.
+    // We cast it to a non-const object s.t. it can be modified (yes,
+    // this is a hack).
+    TPRVector* results1 = const_cast<TPRVector*>(
+        &TestResultAccessor::test_part_results(*r1));
+    TPRVector* results2 = const_cast<TPRVector*>(
+        &TestResultAccessor::test_part_results(*r2));
+
+    // r0 is an empty TestResult.
+
+    // r1 contains a single SUCCESS TestPartResult.
+    results1->push_back(*pr1);
+
+    // r2 contains a SUCCESS, and a FAILURE.
+    results2->push_back(*pr1);
+    results2->push_back(*pr2);
+  }
+
+  virtual void TearDown() {
+    delete pr1;
+    delete pr2;
+
+    delete r0;
+    delete r1;
+    delete r2;
+  }
+
+  // Helper that compares two two TestPartResults.
+  static void CompareTestPartResult(const TestPartResult& expected,
+                                    const TestPartResult& actual) {
+    EXPECT_EQ(expected.type(), actual.type());
+    EXPECT_STREQ(expected.file_name(), actual.file_name());
+    EXPECT_EQ(expected.line_number(), actual.line_number());
+    EXPECT_STREQ(expected.summary(), actual.summary());
+    EXPECT_STREQ(expected.message(), actual.message());
+    EXPECT_EQ(expected.passed(), actual.passed());
+    EXPECT_EQ(expected.failed(), actual.failed());
+    EXPECT_EQ(expected.nonfatally_failed(), actual.nonfatally_failed());
+    EXPECT_EQ(expected.fatally_failed(), actual.fatally_failed());
+  }
+};
+
+// Tests TestResult::total_part_count().
+TEST_F(TestResultTest, total_part_count) {
+  ASSERT_EQ(0, r0->total_part_count());
+  ASSERT_EQ(1, r1->total_part_count());
+  ASSERT_EQ(2, r2->total_part_count());
+}
+
+// Tests TestResult::Passed().
+TEST_F(TestResultTest, Passed) {
+  ASSERT_TRUE(r0->Passed());
+  ASSERT_TRUE(r1->Passed());
+  ASSERT_FALSE(r2->Passed());
+}
+
+// Tests TestResult::Failed().
+TEST_F(TestResultTest, Failed) {
+  ASSERT_FALSE(r0->Failed());
+  ASSERT_FALSE(r1->Failed());
+  ASSERT_TRUE(r2->Failed());
+}
+
+// Tests TestResult::GetTestPartResult().
+
+typedef TestResultTest TestResultDeathTest;
+
+TEST_F(TestResultDeathTest, GetTestPartResult) {
+  CompareTestPartResult(*pr1, r2->GetTestPartResult(0));
+  CompareTestPartResult(*pr2, r2->GetTestPartResult(1));
+  EXPECT_DEATH_IF_SUPPORTED(r2->GetTestPartResult(2), "");
+  EXPECT_DEATH_IF_SUPPORTED(r2->GetTestPartResult(-1), "");
+}
+
+// Tests TestResult has no properties when none are added.
+TEST(TestResultPropertyTest, NoPropertiesFoundWhenNoneAreAdded) {
+  TestResult test_result;
+  ASSERT_EQ(0, test_result.test_property_count());
+}
+
+// Tests TestResult has the expected property when added.
+TEST(TestResultPropertyTest, OnePropertyFoundWhenAdded) {
+  TestResult test_result;
+  TestProperty property("key_1", "1");
+  TestResultAccessor::RecordProperty(&test_result, "testcase", property);
+  ASSERT_EQ(1, test_result.test_property_count());
+  const TestProperty& actual_property = test_result.GetTestProperty(0);
+  EXPECT_STREQ("key_1", actual_property.key());
+  EXPECT_STREQ("1", actual_property.value());
+}
+
+// Tests TestResult has multiple properties when added.
+TEST(TestResultPropertyTest, MultiplePropertiesFoundWhenAdded) {
+  TestResult test_result;
+  TestProperty property_1("key_1", "1");
+  TestProperty property_2("key_2", "2");
+  TestResultAccessor::RecordProperty(&test_result, "testcase", property_1);
+  TestResultAccessor::RecordProperty(&test_result, "testcase", property_2);
+  ASSERT_EQ(2, test_result.test_property_count());
+  const TestProperty& actual_property_1 = test_result.GetTestProperty(0);
+  EXPECT_STREQ("key_1", actual_property_1.key());
+  EXPECT_STREQ("1", actual_property_1.value());
+
+  const TestProperty& actual_property_2 = test_result.GetTestProperty(1);
+  EXPECT_STREQ("key_2", actual_property_2.key());
+  EXPECT_STREQ("2", actual_property_2.value());
+}
+
+// Tests TestResult::RecordProperty() overrides values for duplicate keys.
+TEST(TestResultPropertyTest, OverridesValuesForDuplicateKeys) {
+  TestResult test_result;
+  TestProperty property_1_1("key_1", "1");
+  TestProperty property_2_1("key_2", "2");
+  TestProperty property_1_2("key_1", "12");
+  TestProperty property_2_2("key_2", "22");
+  TestResultAccessor::RecordProperty(&test_result, "testcase", property_1_1);
+  TestResultAccessor::RecordProperty(&test_result, "testcase", property_2_1);
+  TestResultAccessor::RecordProperty(&test_result, "testcase", property_1_2);
+  TestResultAccessor::RecordProperty(&test_result, "testcase", property_2_2);
+
+  ASSERT_EQ(2, test_result.test_property_count());
+  const TestProperty& actual_property_1 = test_result.GetTestProperty(0);
+  EXPECT_STREQ("key_1", actual_property_1.key());
+  EXPECT_STREQ("12", actual_property_1.value());
+
+  const TestProperty& actual_property_2 = test_result.GetTestProperty(1);
+  EXPECT_STREQ("key_2", actual_property_2.key());
+  EXPECT_STREQ("22", actual_property_2.value());
+}
+
+// Tests TestResult::GetTestProperty().
+TEST(TestResultPropertyTest, GetTestProperty) {
+  TestResult test_result;
+  TestProperty property_1("key_1", "1");
+  TestProperty property_2("key_2", "2");
+  TestProperty property_3("key_3", "3");
+  TestResultAccessor::RecordProperty(&test_result, "testcase", property_1);
+  TestResultAccessor::RecordProperty(&test_result, "testcase", property_2);
+  TestResultAccessor::RecordProperty(&test_result, "testcase", property_3);
+
+  const TestProperty& fetched_property_1 = test_result.GetTestProperty(0);
+  const TestProperty& fetched_property_2 = test_result.GetTestProperty(1);
+  const TestProperty& fetched_property_3 = test_result.GetTestProperty(2);
+
+  EXPECT_STREQ("key_1", fetched_property_1.key());
+  EXPECT_STREQ("1", fetched_property_1.value());
+
+  EXPECT_STREQ("key_2", fetched_property_2.key());
+  EXPECT_STREQ("2", fetched_property_2.value());
+
+  EXPECT_STREQ("key_3", fetched_property_3.key());
+  EXPECT_STREQ("3", fetched_property_3.value());
+
+  EXPECT_DEATH_IF_SUPPORTED(test_result.GetTestProperty(3), "");
+  EXPECT_DEATH_IF_SUPPORTED(test_result.GetTestProperty(-1), "");
+}
+
+// Tests that GTestFlagSaver works on Windows and Mac.
+
+class GTestFlagSaverTest : public Test {
+ protected:
+  // Saves the Google Test flags such that we can restore them later, and
+  // then sets them to their default values.  This will be called
+  // before the first test in this test case is run.
+  static void SetUpTestCase() {
+    saver_ = new GTestFlagSaver;
+
+    GTEST_FLAG(also_run_disabled_tests) = false;
+    GTEST_FLAG(break_on_failure) = false;
+    GTEST_FLAG(catch_exceptions) = false;
+    GTEST_FLAG(death_test_use_fork) = false;
+    GTEST_FLAG(color) = "auto";
+    GTEST_FLAG(filter) = "";
+    GTEST_FLAG(list_tests) = false;
+    GTEST_FLAG(output) = "";
+    GTEST_FLAG(print_time) = true;
+    GTEST_FLAG(random_seed) = 0;
+    GTEST_FLAG(repeat) = 1;
+    GTEST_FLAG(shuffle) = false;
+    GTEST_FLAG(stack_trace_depth) = kMaxStackTraceDepth;
+    GTEST_FLAG(stream_result_to) = "";
+    GTEST_FLAG(throw_on_failure) = false;
+  }
+
+  // Restores the Google Test flags that the tests have modified.  This will
+  // be called after the last test in this test case is run.
+  static void TearDownTestCase() {
+    delete saver_;
+    saver_ = NULL;
+  }
+
+  // Verifies that the Google Test flags have their default values, and then
+  // modifies each of them.
+  void VerifyAndModifyFlags() {
+    EXPECT_FALSE(GTEST_FLAG(also_run_disabled_tests));
+    EXPECT_FALSE(GTEST_FLAG(break_on_failure));
+    EXPECT_FALSE(GTEST_FLAG(catch_exceptions));
+    EXPECT_STREQ("auto", GTEST_FLAG(color).c_str());
+    EXPECT_FALSE(GTEST_FLAG(death_test_use_fork));
+    EXPECT_STREQ("", GTEST_FLAG(filter).c_str());
+    EXPECT_FALSE(GTEST_FLAG(list_tests));
+    EXPECT_STREQ("", GTEST_FLAG(output).c_str());
+    EXPECT_TRUE(GTEST_FLAG(print_time));
+    EXPECT_EQ(0, GTEST_FLAG(random_seed));
+    EXPECT_EQ(1, GTEST_FLAG(repeat));
+    EXPECT_FALSE(GTEST_FLAG(shuffle));
+    EXPECT_EQ(kMaxStackTraceDepth, GTEST_FLAG(stack_trace_depth));
+    EXPECT_STREQ("", GTEST_FLAG(stream_result_to).c_str());
+    EXPECT_FALSE(GTEST_FLAG(throw_on_failure));
+
+    GTEST_FLAG(also_run_disabled_tests) = true;
+    GTEST_FLAG(break_on_failure) = true;
+    GTEST_FLAG(catch_exceptions) = true;
+    GTEST_FLAG(color) = "no";
+    GTEST_FLAG(death_test_use_fork) = true;
+    GTEST_FLAG(filter) = "abc";
+    GTEST_FLAG(list_tests) = true;
+    GTEST_FLAG(output) = "xml:foo.xml";
+    GTEST_FLAG(print_time) = false;
+    GTEST_FLAG(random_seed) = 1;
+    GTEST_FLAG(repeat) = 100;
+    GTEST_FLAG(shuffle) = true;
+    GTEST_FLAG(stack_trace_depth) = 1;
+    GTEST_FLAG(stream_result_to) = "localhost:1234";
+    GTEST_FLAG(throw_on_failure) = true;
+  }
+
+ private:
+  // For saving Google Test flags during this test case.
+  static GTestFlagSaver* saver_;
+};
+
+GTestFlagSaver* GTestFlagSaverTest::saver_ = NULL;
+
+// Google Test doesn't guarantee the order of tests.  The following two
+// tests are designed to work regardless of their order.
+
+// Modifies the Google Test flags in the test body.
+TEST_F(GTestFlagSaverTest, ModifyGTestFlags) {
+  VerifyAndModifyFlags();
+}
+
+// Verifies that the Google Test flags in the body of the previous test were
+// restored to their original values.
+TEST_F(GTestFlagSaverTest, VerifyGTestFlags) {
+  VerifyAndModifyFlags();
+}
+
+// Sets an environment variable with the given name to the given
+// value.  If the value argument is "", unsets the environment
+// variable.  The caller must ensure that both arguments are not NULL.
+static void SetEnv(const char* name, const char* value) {
+#if GTEST_OS_WINDOWS_MOBILE
+  // Environment variables are not supported on Windows CE.
+  return;
+#elif defined(__BORLANDC__) || defined(__SunOS_5_8) || defined(__SunOS_5_9)
+  // C++Builder's putenv only stores a pointer to its parameter; we have to
+  // ensure that the string remains valid as long as it might be needed.
+  // We use an std::map to do so.
+  static std::map<std::string, std::string*> added_env;
+
+  // Because putenv stores a pointer to the string buffer, we can't delete the
+  // previous string (if present) until after it's replaced.
+  std::string *prev_env = NULL;
+  if (added_env.find(name) != added_env.end()) {
+    prev_env = added_env[name];
+  }
+  added_env[name] = new std::string(
+      (Message() << name << "=" << value).GetString());
+
+  // The standard signature of putenv accepts a 'char*' argument. Other
+  // implementations, like C++Builder's, accept a 'const char*'.
+  // We cast away the 'const' since that would work for both variants.
+  putenv(const_cast<char*>(added_env[name]->c_str()));
+  delete prev_env;
+#elif GTEST_OS_WINDOWS  // If we are on Windows proper.
+  _putenv((Message() << name << "=" << value).GetString().c_str());
+#else
+  if (*value == '\0') {
+    unsetenv(name);
+  } else {
+    setenv(name, value, 1);
+  }
+#endif  // GTEST_OS_WINDOWS_MOBILE
+}
+
+#if !GTEST_OS_WINDOWS_MOBILE
+// Environment variables are not supported on Windows CE.
+
+using testing::internal::Int32FromGTestEnv;
+
+// Tests Int32FromGTestEnv().
+
+// Tests that Int32FromGTestEnv() returns the default value when the
+// environment variable is not set.
+TEST(Int32FromGTestEnvTest, ReturnsDefaultWhenVariableIsNotSet) {
+  SetEnv(GTEST_FLAG_PREFIX_UPPER_ "TEMP", "");
+  EXPECT_EQ(10, Int32FromGTestEnv("temp", 10));
+}
+
+// Tests that Int32FromGTestEnv() returns the default value when the
+// environment variable overflows as an Int32.
+TEST(Int32FromGTestEnvTest, ReturnsDefaultWhenValueOverflows) {
+  printf("(expecting 2 warnings)\n");
+
+  SetEnv(GTEST_FLAG_PREFIX_UPPER_ "TEMP", "12345678987654321");
+  EXPECT_EQ(20, Int32FromGTestEnv("temp", 20));
+
+  SetEnv(GTEST_FLAG_PREFIX_UPPER_ "TEMP", "-12345678987654321");
+  EXPECT_EQ(30, Int32FromGTestEnv("temp", 30));
+}
+
+// Tests that Int32FromGTestEnv() returns the default value when the
+// environment variable does not represent a valid decimal integer.
+TEST(Int32FromGTestEnvTest, ReturnsDefaultWhenValueIsInvalid) {
+  printf("(expecting 2 warnings)\n");
+
+  SetEnv(GTEST_FLAG_PREFIX_UPPER_ "TEMP", "A1");
+  EXPECT_EQ(40, Int32FromGTestEnv("temp", 40));
+
+  SetEnv(GTEST_FLAG_PREFIX_UPPER_ "TEMP", "12X");
+  EXPECT_EQ(50, Int32FromGTestEnv("temp", 50));
+}
+
+// Tests that Int32FromGTestEnv() parses and returns the value of the
+// environment variable when it represents a valid decimal integer in
+// the range of an Int32.
+TEST(Int32FromGTestEnvTest, ParsesAndReturnsValidValue) {
+  SetEnv(GTEST_FLAG_PREFIX_UPPER_ "TEMP", "123");
+  EXPECT_EQ(123, Int32FromGTestEnv("temp", 0));
+
+  SetEnv(GTEST_FLAG_PREFIX_UPPER_ "TEMP", "-321");
+  EXPECT_EQ(-321, Int32FromGTestEnv("temp", 0));
+}
+#endif  // !GTEST_OS_WINDOWS_MOBILE
+
+// Tests ParseInt32Flag().
+
+// Tests that ParseInt32Flag() returns false and doesn't change the
+// output value when the flag has wrong format
+TEST(ParseInt32FlagTest, ReturnsFalseForInvalidFlag) {
+  Int32 value = 123;
+  EXPECT_FALSE(ParseInt32Flag("--a=100", "b", &value));
+  EXPECT_EQ(123, value);
+
+  EXPECT_FALSE(ParseInt32Flag("a=100", "a", &value));
+  EXPECT_EQ(123, value);
+}
+
+// Tests that ParseInt32Flag() returns false and doesn't change the
+// output value when the flag overflows as an Int32.
+TEST(ParseInt32FlagTest, ReturnsDefaultWhenValueOverflows) {
+  printf("(expecting 2 warnings)\n");
+
+  Int32 value = 123;
+  EXPECT_FALSE(ParseInt32Flag("--abc=12345678987654321", "abc", &value));
+  EXPECT_EQ(123, value);
+
+  EXPECT_FALSE(ParseInt32Flag("--abc=-12345678987654321", "abc", &value));
+  EXPECT_EQ(123, value);
+}
+
+// Tests that ParseInt32Flag() returns false and doesn't change the
+// output value when the flag does not represent a valid decimal
+// integer.
+TEST(ParseInt32FlagTest, ReturnsDefaultWhenValueIsInvalid) {
+  printf("(expecting 2 warnings)\n");
+
+  Int32 value = 123;
+  EXPECT_FALSE(ParseInt32Flag("--abc=A1", "abc", &value));
+  EXPECT_EQ(123, value);
+
+  EXPECT_FALSE(ParseInt32Flag("--abc=12X", "abc", &value));
+  EXPECT_EQ(123, value);
+}
+
+// Tests that ParseInt32Flag() parses the value of the flag and
+// returns true when the flag represents a valid decimal integer in
+// the range of an Int32.
+TEST(ParseInt32FlagTest, ParsesAndReturnsValidValue) {
+  Int32 value = 123;
+  EXPECT_TRUE(ParseInt32Flag("--" GTEST_FLAG_PREFIX_ "abc=456", "abc", &value));
+  EXPECT_EQ(456, value);
+
+  EXPECT_TRUE(ParseInt32Flag("--" GTEST_FLAG_PREFIX_ "abc=-789",
+                             "abc", &value));
+  EXPECT_EQ(-789, value);
+}
+
+// Tests that Int32FromEnvOrDie() parses the value of the var or
+// returns the correct default.
+// Environment variables are not supported on Windows CE.
+#if !GTEST_OS_WINDOWS_MOBILE
+TEST(Int32FromEnvOrDieTest, ParsesAndReturnsValidValue) {
+  EXPECT_EQ(333, Int32FromEnvOrDie(GTEST_FLAG_PREFIX_UPPER_ "UnsetVar", 333));
+  SetEnv(GTEST_FLAG_PREFIX_UPPER_ "UnsetVar", "123");
+  EXPECT_EQ(123, Int32FromEnvOrDie(GTEST_FLAG_PREFIX_UPPER_ "UnsetVar", 333));
+  SetEnv(GTEST_FLAG_PREFIX_UPPER_ "UnsetVar", "-123");
+  EXPECT_EQ(-123, Int32FromEnvOrDie(GTEST_FLAG_PREFIX_UPPER_ "UnsetVar", 333));
+}
+#endif  // !GTEST_OS_WINDOWS_MOBILE
+
+// Tests that Int32FromEnvOrDie() aborts with an error message
+// if the variable is not an Int32.
+TEST(Int32FromEnvOrDieDeathTest, AbortsOnFailure) {
+  SetEnv(GTEST_FLAG_PREFIX_UPPER_ "VAR", "xxx");
+  EXPECT_DEATH_IF_SUPPORTED(
+      Int32FromEnvOrDie(GTEST_FLAG_PREFIX_UPPER_ "VAR", 123),
+      ".*");
+}
+
+// Tests that Int32FromEnvOrDie() aborts with an error message
+// if the variable cannot be represnted by an Int32.
+TEST(Int32FromEnvOrDieDeathTest, AbortsOnInt32Overflow) {
+  SetEnv(GTEST_FLAG_PREFIX_UPPER_ "VAR", "1234567891234567891234");
+  EXPECT_DEATH_IF_SUPPORTED(
+      Int32FromEnvOrDie(GTEST_FLAG_PREFIX_UPPER_ "VAR", 123),
+      ".*");
+}
+
+// Tests that ShouldRunTestOnShard() selects all tests
+// where there is 1 shard.
+TEST(ShouldRunTestOnShardTest, IsPartitionWhenThereIsOneShard) {
+  EXPECT_TRUE(ShouldRunTestOnShard(1, 0, 0));
+  EXPECT_TRUE(ShouldRunTestOnShard(1, 0, 1));
+  EXPECT_TRUE(ShouldRunTestOnShard(1, 0, 2));
+  EXPECT_TRUE(ShouldRunTestOnShard(1, 0, 3));
+  EXPECT_TRUE(ShouldRunTestOnShard(1, 0, 4));
+}
+
+class ShouldShardTest : public testing::Test {
+ protected:
+  virtual void SetUp() {
+    index_var_ = GTEST_FLAG_PREFIX_UPPER_ "INDEX";
+    total_var_ = GTEST_FLAG_PREFIX_UPPER_ "TOTAL";
+  }
+
+  virtual void TearDown() {
+    SetEnv(index_var_, "");
+    SetEnv(total_var_, "");
+  }
+
+  const char* index_var_;
+  const char* total_var_;
+};
+
+// Tests that sharding is disabled if neither of the environment variables
+// are set.
+TEST_F(ShouldShardTest, ReturnsFalseWhenNeitherEnvVarIsSet) {
+  SetEnv(index_var_, "");
+  SetEnv(total_var_, "");
+
+  EXPECT_FALSE(ShouldShard(total_var_, index_var_, false));
+  EXPECT_FALSE(ShouldShard(total_var_, index_var_, true));
+}
+
+// Tests that sharding is not enabled if total_shards  == 1.
+TEST_F(ShouldShardTest, ReturnsFalseWhenTotalShardIsOne) {
+  SetEnv(index_var_, "0");
+  SetEnv(total_var_, "1");
+  EXPECT_FALSE(ShouldShard(total_var_, index_var_, false));
+  EXPECT_FALSE(ShouldShard(total_var_, index_var_, true));
+}
+
+// Tests that sharding is enabled if total_shards > 1 and
+// we are not in a death test subprocess.
+// Environment variables are not supported on Windows CE.
+#if !GTEST_OS_WINDOWS_MOBILE
+TEST_F(ShouldShardTest, WorksWhenShardEnvVarsAreValid) {
+  SetEnv(index_var_, "4");
+  SetEnv(total_var_, "22");
+  EXPECT_TRUE(ShouldShard(total_var_, index_var_, false));
+  EXPECT_FALSE(ShouldShard(total_var_, index_var_, true));
+
+  SetEnv(index_var_, "8");
+  SetEnv(total_var_, "9");
+  EXPECT_TRUE(ShouldShard(total_var_, index_var_, false));
+  EXPECT_FALSE(ShouldShard(total_var_, index_var_, true));
+
+  SetEnv(index_var_, "0");
+  SetEnv(total_var_, "9");
+  EXPECT_TRUE(ShouldShard(total_var_, index_var_, false));
+  EXPECT_FALSE(ShouldShard(total_var_, index_var_, true));
+}
+#endif  // !GTEST_OS_WINDOWS_MOBILE
+
+// Tests that we exit in error if the sharding values are not valid.
+
+typedef ShouldShardTest ShouldShardDeathTest;
+
+TEST_F(ShouldShardDeathTest, AbortsWhenShardingEnvVarsAreInvalid) {
+  SetEnv(index_var_, "4");
+  SetEnv(total_var_, "4");
+  EXPECT_DEATH_IF_SUPPORTED(ShouldShard(total_var_, index_var_, false), ".*");
+
+  SetEnv(index_var_, "4");
+  SetEnv(total_var_, "-2");
+  EXPECT_DEATH_IF_SUPPORTED(ShouldShard(total_var_, index_var_, false), ".*");
+
+  SetEnv(index_var_, "5");
+  SetEnv(total_var_, "");
+  EXPECT_DEATH_IF_SUPPORTED(ShouldShard(total_var_, index_var_, false), ".*");
+
+  SetEnv(index_var_, "");
+  SetEnv(total_var_, "5");
+  EXPECT_DEATH_IF_SUPPORTED(ShouldShard(total_var_, index_var_, false), ".*");
+}
+
+// Tests that ShouldRunTestOnShard is a partition when 5
+// shards are used.
+TEST(ShouldRunTestOnShardTest, IsPartitionWhenThereAreFiveShards) {
+  // Choose an arbitrary number of tests and shards.
+  const int num_tests = 17;
+  const int num_shards = 5;
+
+  // Check partitioning: each test should be on exactly 1 shard.
+  for (int test_id = 0; test_id < num_tests; test_id++) {
+    int prev_selected_shard_index = -1;
+    for (int shard_index = 0; shard_index < num_shards; shard_index++) {
+      if (ShouldRunTestOnShard(num_shards, shard_index, test_id)) {
+        if (prev_selected_shard_index < 0) {
+          prev_selected_shard_index = shard_index;
+        } else {
+          ADD_FAILURE() << "Shard " << prev_selected_shard_index << " and "
+            << shard_index << " are both selected to run test " << test_id;
+        }
+      }
+    }
+  }
+
+  // Check balance: This is not required by the sharding protocol, but is a
+  // desirable property for performance.
+  for (int shard_index = 0; shard_index < num_shards; shard_index++) {
+    int num_tests_on_shard = 0;
+    for (int test_id = 0; test_id < num_tests; test_id++) {
+      num_tests_on_shard +=
+        ShouldRunTestOnShard(num_shards, shard_index, test_id);
+    }
+    EXPECT_GE(num_tests_on_shard, num_tests / num_shards);
+  }
+}
+
+// For the same reason we are not explicitly testing everything in the
+// Test class, there are no separate tests for the following classes
+// (except for some trivial cases):
+//
+//   TestCase, UnitTest, UnitTestResultPrinter.
+//
+// Similarly, there are no separate tests for the following macros:
+//
+//   TEST, TEST_F, RUN_ALL_TESTS
+
+TEST(UnitTestTest, CanGetOriginalWorkingDir) {
+  ASSERT_TRUE(UnitTest::GetInstance()->original_working_dir() != NULL);
+  EXPECT_STRNE(UnitTest::GetInstance()->original_working_dir(), "");
+}
+
+TEST(UnitTestTest, ReturnsPlausibleTimestamp) {
+  EXPECT_LT(0, UnitTest::GetInstance()->start_timestamp());
+  EXPECT_LE(UnitTest::GetInstance()->start_timestamp(), GetTimeInMillis());
+}
+
+// When a property using a reserved key is supplied to this function, it
+// tests that a non-fatal failure is added, a fatal failure is not added,
+// and that the property is not recorded.
+void ExpectNonFatalFailureRecordingPropertyWithReservedKey(
+    const TestResult& test_result, const char* key) {
+  EXPECT_NONFATAL_FAILURE(Test::RecordProperty(key, "1"), "Reserved key");
+  ASSERT_EQ(0, test_result.test_property_count()) << "Property for key '" << key
+                                                  << "' recorded unexpectedly.";
+}
+
+void ExpectNonFatalFailureRecordingPropertyWithReservedKeyForCurrentTest(
+    const char* key) {
+  const TestInfo* test_info = UnitTest::GetInstance()->current_test_info();
+  ASSERT_TRUE(test_info != NULL);
+  ExpectNonFatalFailureRecordingPropertyWithReservedKey(*test_info->result(),
+                                                        key);
+}
+
+void ExpectNonFatalFailureRecordingPropertyWithReservedKeyForCurrentTestCase(
+    const char* key) {
+  const TestCase* test_case = UnitTest::GetInstance()->current_test_case();
+  ASSERT_TRUE(test_case != NULL);
+  ExpectNonFatalFailureRecordingPropertyWithReservedKey(
+      test_case->ad_hoc_test_result(), key);
+}
+
+void ExpectNonFatalFailureRecordingPropertyWithReservedKeyOutsideOfTestCase(
+    const char* key) {
+  ExpectNonFatalFailureRecordingPropertyWithReservedKey(
+      UnitTest::GetInstance()->ad_hoc_test_result(), key);
+}
+
+// Tests that property recording functions in UnitTest outside of tests
+// functions correcly.  Creating a separate instance of UnitTest ensures it
+// is in a state similar to the UnitTest's singleton's between tests.
+class UnitTestRecordPropertyTest :
+    public testing::internal::UnitTestRecordPropertyTestHelper {
+ public:
+  static void SetUpTestCase() {
+    ExpectNonFatalFailureRecordingPropertyWithReservedKeyForCurrentTestCase(
+        "disabled");
+    ExpectNonFatalFailureRecordingPropertyWithReservedKeyForCurrentTestCase(
+        "errors");
+    ExpectNonFatalFailureRecordingPropertyWithReservedKeyForCurrentTestCase(
+        "failures");
+    ExpectNonFatalFailureRecordingPropertyWithReservedKeyForCurrentTestCase(
+        "name");
+    ExpectNonFatalFailureRecordingPropertyWithReservedKeyForCurrentTestCase(
+        "tests");
+    ExpectNonFatalFailureRecordingPropertyWithReservedKeyForCurrentTestCase(
+        "time");
+
+    Test::RecordProperty("test_case_key_1", "1");
+    const TestCase* test_case = UnitTest::GetInstance()->current_test_case();
+    ASSERT_TRUE(test_case != NULL);
+
+    ASSERT_EQ(1, test_case->ad_hoc_test_result().test_property_count());
+    EXPECT_STREQ("test_case_key_1",
+                 test_case->ad_hoc_test_result().GetTestProperty(0).key());
+    EXPECT_STREQ("1",
+                 test_case->ad_hoc_test_result().GetTestProperty(0).value());
+  }
+};
+
+// Tests TestResult has the expected property when added.
+TEST_F(UnitTestRecordPropertyTest, OnePropertyFoundWhenAdded) {
+  UnitTestRecordProperty("key_1", "1");
+
+  ASSERT_EQ(1, unit_test_.ad_hoc_test_result().test_property_count());
+
+  EXPECT_STREQ("key_1",
+               unit_test_.ad_hoc_test_result().GetTestProperty(0).key());
+  EXPECT_STREQ("1",
+               unit_test_.ad_hoc_test_result().GetTestProperty(0).value());
+}
+
+// Tests TestResult has multiple properties when added.
+TEST_F(UnitTestRecordPropertyTest, MultiplePropertiesFoundWhenAdded) {
+  UnitTestRecordProperty("key_1", "1");
+  UnitTestRecordProperty("key_2", "2");
+
+  ASSERT_EQ(2, unit_test_.ad_hoc_test_result().test_property_count());
+
+  EXPECT_STREQ("key_1",
+               unit_test_.ad_hoc_test_result().GetTestProperty(0).key());
+  EXPECT_STREQ("1", unit_test_.ad_hoc_test_result().GetTestProperty(0).value());
+
+  EXPECT_STREQ("key_2",
+               unit_test_.ad_hoc_test_result().GetTestProperty(1).key());
+  EXPECT_STREQ("2", unit_test_.ad_hoc_test_result().GetTestProperty(1).value());
+}
+
+// Tests TestResult::RecordProperty() overrides values for duplicate keys.
+TEST_F(UnitTestRecordPropertyTest, OverridesValuesForDuplicateKeys) {
+  UnitTestRecordProperty("key_1", "1");
+  UnitTestRecordProperty("key_2", "2");
+  UnitTestRecordProperty("key_1", "12");
+  UnitTestRecordProperty("key_2", "22");
+
+  ASSERT_EQ(2, unit_test_.ad_hoc_test_result().test_property_count());
+
+  EXPECT_STREQ("key_1",
+               unit_test_.ad_hoc_test_result().GetTestProperty(0).key());
+  EXPECT_STREQ("12",
+               unit_test_.ad_hoc_test_result().GetTestProperty(0).value());
+
+  EXPECT_STREQ("key_2",
+               unit_test_.ad_hoc_test_result().GetTestProperty(1).key());
+  EXPECT_STREQ("22",
+               unit_test_.ad_hoc_test_result().GetTestProperty(1).value());
+}
+
+TEST_F(UnitTestRecordPropertyTest,
+       AddFailureInsideTestsWhenUsingTestCaseReservedKeys) {
+  ExpectNonFatalFailureRecordingPropertyWithReservedKeyForCurrentTest(
+      "name");
+  ExpectNonFatalFailureRecordingPropertyWithReservedKeyForCurrentTest(
+      "value_param");
+  ExpectNonFatalFailureRecordingPropertyWithReservedKeyForCurrentTest(
+      "type_param");
+  ExpectNonFatalFailureRecordingPropertyWithReservedKeyForCurrentTest(
+      "status");
+  ExpectNonFatalFailureRecordingPropertyWithReservedKeyForCurrentTest(
+      "time");
+  ExpectNonFatalFailureRecordingPropertyWithReservedKeyForCurrentTest(
+      "classname");
+}
+
+TEST_F(UnitTestRecordPropertyTest,
+       AddRecordWithReservedKeysGeneratesCorrectPropertyList) {
+  EXPECT_NONFATAL_FAILURE(
+      Test::RecordProperty("name", "1"),
+      "'classname', 'name', 'status', 'time', 'type_param', and 'value_param'"
+      " are reserved");
+}
+
+class UnitTestRecordPropertyTestEnvironment : public Environment {
+ public:
+  virtual void TearDown() {
+    ExpectNonFatalFailureRecordingPropertyWithReservedKeyOutsideOfTestCase(
+        "tests");
+    ExpectNonFatalFailureRecordingPropertyWithReservedKeyOutsideOfTestCase(
+        "failures");
+    ExpectNonFatalFailureRecordingPropertyWithReservedKeyOutsideOfTestCase(
+        "disabled");
+    ExpectNonFatalFailureRecordingPropertyWithReservedKeyOutsideOfTestCase(
+        "errors");
+    ExpectNonFatalFailureRecordingPropertyWithReservedKeyOutsideOfTestCase(
+        "name");
+    ExpectNonFatalFailureRecordingPropertyWithReservedKeyOutsideOfTestCase(
+        "timestamp");
+    ExpectNonFatalFailureRecordingPropertyWithReservedKeyOutsideOfTestCase(
+        "time");
+    ExpectNonFatalFailureRecordingPropertyWithReservedKeyOutsideOfTestCase(
+        "random_seed");
+  }
+};
+
+// This will test property recording outside of any test or test case.
+static Environment* record_property_env =
+    AddGlobalTestEnvironment(new UnitTestRecordPropertyTestEnvironment);
+
+// This group of tests is for predicate assertions (ASSERT_PRED*, etc)
+// of various arities.  They do not attempt to be exhaustive.  Rather,
+// view them as smoke tests that can be easily reviewed and verified.
+// A more complete set of tests for predicate assertions can be found
+// in gtest_pred_impl_unittest.cc.
+
+// First, some predicates and predicate-formatters needed by the tests.
+
+// Returns true iff the argument is an even number.
+bool IsEven(int n) {
+  return (n % 2) == 0;
+}
+
+// A functor that returns true iff the argument is an even number.
+struct IsEvenFunctor {
+  bool operator()(int n) { return IsEven(n); }
+};
+
+// A predicate-formatter function that asserts the argument is an even
+// number.
+AssertionResult AssertIsEven(const char* expr, int n) {
+  if (IsEven(n)) {
+    return AssertionSuccess();
+  }
+
+  Message msg;
+  msg << expr << " evaluates to " << n << ", which is not even.";
+  return AssertionFailure(msg);
+}
+
+// A predicate function that returns AssertionResult for use in
+// EXPECT/ASSERT_TRUE/FALSE.
+AssertionResult ResultIsEven(int n) {
+  if (IsEven(n))
+    return AssertionSuccess() << n << " is even";
+  else
+    return AssertionFailure() << n << " is odd";
+}
+
+// A predicate function that returns AssertionResult but gives no
+// explanation why it succeeds. Needed for testing that
+// EXPECT/ASSERT_FALSE handles such functions correctly.
+AssertionResult ResultIsEvenNoExplanation(int n) {
+  if (IsEven(n))
+    return AssertionSuccess();
+  else
+    return AssertionFailure() << n << " is odd";
+}
+
+// A predicate-formatter functor that asserts the argument is an even
+// number.
+struct AssertIsEvenFunctor {
+  AssertionResult operator()(const char* expr, int n) {
+    return AssertIsEven(expr, n);
+  }
+};
+
+// Returns true iff the sum of the arguments is an even number.
+bool SumIsEven2(int n1, int n2) {
+  return IsEven(n1 + n2);
+}
+
+// A functor that returns true iff the sum of the arguments is an even
+// number.
+struct SumIsEven3Functor {
+  bool operator()(int n1, int n2, int n3) {
+    return IsEven(n1 + n2 + n3);
+  }
+};
+
+// A predicate-formatter function that asserts the sum of the
+// arguments is an even number.
+AssertionResult AssertSumIsEven4(
+    const char* e1, const char* e2, const char* e3, const char* e4,
+    int n1, int n2, int n3, int n4) {
+  const int sum = n1 + n2 + n3 + n4;
+  if (IsEven(sum)) {
+    return AssertionSuccess();
+  }
+
+  Message msg;
+  msg << e1 << " + " << e2 << " + " << e3 << " + " << e4
+      << " (" << n1 << " + " << n2 << " + " << n3 << " + " << n4
+      << ") evaluates to " << sum << ", which is not even.";
+  return AssertionFailure(msg);
+}
+
+// A predicate-formatter functor that asserts the sum of the arguments
+// is an even number.
+struct AssertSumIsEven5Functor {
+  AssertionResult operator()(
+      const char* e1, const char* e2, const char* e3, const char* e4,
+      const char* e5, int n1, int n2, int n3, int n4, int n5) {
+    const int sum = n1 + n2 + n3 + n4 + n5;
+    if (IsEven(sum)) {
+      return AssertionSuccess();
+    }
+
+    Message msg;
+    msg << e1 << " + " << e2 << " + " << e3 << " + " << e4 << " + " << e5
+        << " ("
+        << n1 << " + " << n2 << " + " << n3 << " + " << n4 << " + " << n5
+        << ") evaluates to " << sum << ", which is not even.";
+    return AssertionFailure(msg);
+  }
+};
+
+
+// Tests unary predicate assertions.
+
+// Tests unary predicate assertions that don't use a custom formatter.
+TEST(Pred1Test, WithoutFormat) {
+  // Success cases.
+  EXPECT_PRED1(IsEvenFunctor(), 2) << "This failure is UNEXPECTED!";
+  ASSERT_PRED1(IsEven, 4);
+
+  // Failure cases.
+  EXPECT_NONFATAL_FAILURE({  // NOLINT
+    EXPECT_PRED1(IsEven, 5) << "This failure is expected.";
+  }, "This failure is expected.");
+  EXPECT_FATAL_FAILURE(ASSERT_PRED1(IsEvenFunctor(), 5),
+                       "evaluates to false");
+}
+
+// Tests unary predicate assertions that use a custom formatter.
+TEST(Pred1Test, WithFormat) {
+  // Success cases.
+  EXPECT_PRED_FORMAT1(AssertIsEven, 2);
+  ASSERT_PRED_FORMAT1(AssertIsEvenFunctor(), 4)
+    << "This failure is UNEXPECTED!";
+
+  // Failure cases.
+  const int n = 5;
+  EXPECT_NONFATAL_FAILURE(EXPECT_PRED_FORMAT1(AssertIsEvenFunctor(), n),
+                          "n evaluates to 5, which is not even.");
+  EXPECT_FATAL_FAILURE({  // NOLINT
+    ASSERT_PRED_FORMAT1(AssertIsEven, 5) << "This failure is expected.";
+  }, "This failure is expected.");
+}
+
+// Tests that unary predicate assertions evaluates their arguments
+// exactly once.
+TEST(Pred1Test, SingleEvaluationOnFailure) {
+  // A success case.
+  static int n = 0;
+  EXPECT_PRED1(IsEven, n++);
+  EXPECT_EQ(1, n) << "The argument is not evaluated exactly once.";
+
+  // A failure case.
+  EXPECT_FATAL_FAILURE({  // NOLINT
+    ASSERT_PRED_FORMAT1(AssertIsEvenFunctor(), n++)
+        << "This failure is expected.";
+  }, "This failure is expected.");
+  EXPECT_EQ(2, n) << "The argument is not evaluated exactly once.";
+}
+
+
+// Tests predicate assertions whose arity is >= 2.
+
+// Tests predicate assertions that don't use a custom formatter.
+TEST(PredTest, WithoutFormat) {
+  // Success cases.
+  ASSERT_PRED2(SumIsEven2, 2, 4) << "This failure is UNEXPECTED!";
+  EXPECT_PRED3(SumIsEven3Functor(), 4, 6, 8);
+
+  // Failure cases.
+  const int n1 = 1;
+  const int n2 = 2;
+  EXPECT_NONFATAL_FAILURE({  // NOLINT
+    EXPECT_PRED2(SumIsEven2, n1, n2) << "This failure is expected.";
+  }, "This failure is expected.");
+  EXPECT_FATAL_FAILURE({  // NOLINT
+    ASSERT_PRED3(SumIsEven3Functor(), 1, 2, 4);
+  }, "evaluates to false");
+}
+
+// Tests predicate assertions that use a custom formatter.
+TEST(PredTest, WithFormat) {
+  // Success cases.
+  ASSERT_PRED_FORMAT4(AssertSumIsEven4, 4, 6, 8, 10) <<
+    "This failure is UNEXPECTED!";
+  EXPECT_PRED_FORMAT5(AssertSumIsEven5Functor(), 2, 4, 6, 8, 10);
+
+  // Failure cases.
+  const int n1 = 1;
+  const int n2 = 2;
+  const int n3 = 4;
+  const int n4 = 6;
+  EXPECT_NONFATAL_FAILURE({  // NOLINT
+    EXPECT_PRED_FORMAT4(AssertSumIsEven4, n1, n2, n3, n4);
+  }, "evaluates to 13, which is not even.");
+  EXPECT_FATAL_FAILURE({  // NOLINT
+    ASSERT_PRED_FORMAT5(AssertSumIsEven5Functor(), 1, 2, 4, 6, 8)
+        << "This failure is expected.";
+  }, "This failure is expected.");
+}
+
+// Tests that predicate assertions evaluates their arguments
+// exactly once.
+TEST(PredTest, SingleEvaluationOnFailure) {
+  // A success case.
+  int n1 = 0;
+  int n2 = 0;
+  EXPECT_PRED2(SumIsEven2, n1++, n2++);
+  EXPECT_EQ(1, n1) << "Argument 1 is not evaluated exactly once.";
+  EXPECT_EQ(1, n2) << "Argument 2 is not evaluated exactly once.";
+
+  // Another success case.
+  n1 = n2 = 0;
+  int n3 = 0;
+  int n4 = 0;
+  int n5 = 0;
+  ASSERT_PRED_FORMAT5(AssertSumIsEven5Functor(),
+                      n1++, n2++, n3++, n4++, n5++)
+                        << "This failure is UNEXPECTED!";
+  EXPECT_EQ(1, n1) << "Argument 1 is not evaluated exactly once.";
+  EXPECT_EQ(1, n2) << "Argument 2 is not evaluated exactly once.";
+  EXPECT_EQ(1, n3) << "Argument 3 is not evaluated exactly once.";
+  EXPECT_EQ(1, n4) << "Argument 4 is not evaluated exactly once.";
+  EXPECT_EQ(1, n5) << "Argument 5 is not evaluated exactly once.";
+
+  // A failure case.
+  n1 = n2 = n3 = 0;
+  EXPECT_NONFATAL_FAILURE({  // NOLINT
+    EXPECT_PRED3(SumIsEven3Functor(), ++n1, n2++, n3++)
+        << "This failure is expected.";
+  }, "This failure is expected.");
+  EXPECT_EQ(1, n1) << "Argument 1 is not evaluated exactly once.";
+  EXPECT_EQ(1, n2) << "Argument 2 is not evaluated exactly once.";
+  EXPECT_EQ(1, n3) << "Argument 3 is not evaluated exactly once.";
+
+  // Another failure case.
+  n1 = n2 = n3 = n4 = 0;
+  EXPECT_NONFATAL_FAILURE({  // NOLINT
+    EXPECT_PRED_FORMAT4(AssertSumIsEven4, ++n1, n2++, n3++, n4++);
+  }, "evaluates to 1, which is not even.");
+  EXPECT_EQ(1, n1) << "Argument 1 is not evaluated exactly once.";
+  EXPECT_EQ(1, n2) << "Argument 2 is not evaluated exactly once.";
+  EXPECT_EQ(1, n3) << "Argument 3 is not evaluated exactly once.";
+  EXPECT_EQ(1, n4) << "Argument 4 is not evaluated exactly once.";
+}
+
+
+// Some helper functions for testing using overloaded/template
+// functions with ASSERT_PREDn and EXPECT_PREDn.
+
+bool IsPositive(double x) {
+  return x > 0;
+}
+
+template <typename T>
+bool IsNegative(T x) {
+  return x < 0;
+}
+
+template <typename T1, typename T2>
+bool GreaterThan(T1 x1, T2 x2) {
+  return x1 > x2;
+}
+
+// Tests that overloaded functions can be used in *_PRED* as long as
+// their types are explicitly specified.
+TEST(PredicateAssertionTest, AcceptsOverloadedFunction) {
+  // C++Builder requires C-style casts rather than static_cast.
+  EXPECT_PRED1((bool (*)(int))(IsPositive), 5);  // NOLINT
+  ASSERT_PRED1((bool (*)(double))(IsPositive), 6.0);  // NOLINT
+}
+
+// Tests that template functions can be used in *_PRED* as long as
+// their types are explicitly specified.
+TEST(PredicateAssertionTest, AcceptsTemplateFunction) {
+  EXPECT_PRED1(IsNegative<int>, -5);
+  // Makes sure that we can handle templates with more than one
+  // parameter.
+  ASSERT_PRED2((GreaterThan<int, int>), 5, 0);
+}
+
+
+// Some helper functions for testing using overloaded/template
+// functions with ASSERT_PRED_FORMATn and EXPECT_PRED_FORMATn.
+
+AssertionResult IsPositiveFormat(const char* /* expr */, int n) {
+  return n > 0 ? AssertionSuccess() :
+      AssertionFailure(Message() << "Failure");
+}
+
+AssertionResult IsPositiveFormat(const char* /* expr */, double x) {
+  return x > 0 ? AssertionSuccess() :
+      AssertionFailure(Message() << "Failure");
+}
+
+template <typename T>
+AssertionResult IsNegativeFormat(const char* /* expr */, T x) {
+  return x < 0 ? AssertionSuccess() :
+      AssertionFailure(Message() << "Failure");
+}
+
+template <typename T1, typename T2>
+AssertionResult EqualsFormat(const char* /* expr1 */, const char* /* expr2 */,
+                             const T1& x1, const T2& x2) {
+  return x1 == x2 ? AssertionSuccess() :
+      AssertionFailure(Message() << "Failure");
+}
+
+// Tests that overloaded functions can be used in *_PRED_FORMAT*
+// without explicitly specifying their types.
+TEST(PredicateFormatAssertionTest, AcceptsOverloadedFunction) {
+  EXPECT_PRED_FORMAT1(IsPositiveFormat, 5);
+  ASSERT_PRED_FORMAT1(IsPositiveFormat, 6.0);
+}
+
+// Tests that template functions can be used in *_PRED_FORMAT* without
+// explicitly specifying their types.
+TEST(PredicateFormatAssertionTest, AcceptsTemplateFunction) {
+  EXPECT_PRED_FORMAT1(IsNegativeFormat, -5);
+  ASSERT_PRED_FORMAT2(EqualsFormat, 3, 3);
+}
+
+
+// Tests string assertions.
+
+// Tests ASSERT_STREQ with non-NULL arguments.
+TEST(StringAssertionTest, ASSERT_STREQ) {
+  const char * const p1 = "good";
+  ASSERT_STREQ(p1, p1);
+
+  // Let p2 have the same content as p1, but be at a different address.
+  const char p2[] = "good";
+  ASSERT_STREQ(p1, p2);
+
+  EXPECT_FATAL_FAILURE(ASSERT_STREQ("bad", "good"),
+                       "Expected: \"bad\"");
+}
+
+// Tests ASSERT_STREQ with NULL arguments.
+TEST(StringAssertionTest, ASSERT_STREQ_Null) {
+  ASSERT_STREQ(static_cast<const char *>(NULL), NULL);
+  EXPECT_FATAL_FAILURE(ASSERT_STREQ(NULL, "non-null"),
+                       "non-null");
+}
+
+// Tests ASSERT_STREQ with NULL arguments.
+TEST(StringAssertionTest, ASSERT_STREQ_Null2) {
+  EXPECT_FATAL_FAILURE(ASSERT_STREQ("non-null", NULL),
+                       "non-null");
+}
+
+// Tests ASSERT_STRNE.
+TEST(StringAssertionTest, ASSERT_STRNE) {
+  ASSERT_STRNE("hi", "Hi");
+  ASSERT_STRNE("Hi", NULL);
+  ASSERT_STRNE(NULL, "Hi");
+  ASSERT_STRNE("", NULL);
+  ASSERT_STRNE(NULL, "");
+  ASSERT_STRNE("", "Hi");
+  ASSERT_STRNE("Hi", "");
+  EXPECT_FATAL_FAILURE(ASSERT_STRNE("Hi", "Hi"),
+                       "\"Hi\" vs \"Hi\"");
+}
+
+// Tests ASSERT_STRCASEEQ.
+TEST(StringAssertionTest, ASSERT_STRCASEEQ) {
+  ASSERT_STRCASEEQ("hi", "Hi");
+  ASSERT_STRCASEEQ(static_cast<const char *>(NULL), NULL);
+
+  ASSERT_STRCASEEQ("", "");
+  EXPECT_FATAL_FAILURE(ASSERT_STRCASEEQ("Hi", "hi2"),
+                       "(ignoring case)");
+}
+
+// Tests ASSERT_STRCASENE.
+TEST(StringAssertionTest, ASSERT_STRCASENE) {
+  ASSERT_STRCASENE("hi1", "Hi2");
+  ASSERT_STRCASENE("Hi", NULL);
+  ASSERT_STRCASENE(NULL, "Hi");
+  ASSERT_STRCASENE("", NULL);
+  ASSERT_STRCASENE(NULL, "");
+  ASSERT_STRCASENE("", "Hi");
+  ASSERT_STRCASENE("Hi", "");
+  EXPECT_FATAL_FAILURE(ASSERT_STRCASENE("Hi", "hi"),
+                       "(ignoring case)");
+}
+
+// Tests *_STREQ on wide strings.
+TEST(StringAssertionTest, STREQ_Wide) {
+  // NULL strings.
+  ASSERT_STREQ(static_cast<const wchar_t *>(NULL), NULL);
+
+  // Empty strings.
+  ASSERT_STREQ(L"", L"");
+
+  // Non-null vs NULL.
+  EXPECT_NONFATAL_FAILURE(EXPECT_STREQ(L"non-null", NULL),
+                          "non-null");
+
+  // Equal strings.
+  EXPECT_STREQ(L"Hi", L"Hi");
+
+  // Unequal strings.
+  EXPECT_NONFATAL_FAILURE(EXPECT_STREQ(L"abc", L"Abc"),
+                          "Abc");
+
+  // Strings containing wide characters.
+  EXPECT_NONFATAL_FAILURE(EXPECT_STREQ(L"abc\x8119", L"abc\x8120"),
+                          "abc");
+
+  // The streaming variation.
+  EXPECT_NONFATAL_FAILURE({  // NOLINT
+    EXPECT_STREQ(L"abc\x8119", L"abc\x8121") << "Expected failure";
+  }, "Expected failure");
+}
+
+// Tests *_STRNE on wide strings.
+TEST(StringAssertionTest, STRNE_Wide) {
+  // NULL strings.
+  EXPECT_NONFATAL_FAILURE({  // NOLINT
+    EXPECT_STRNE(static_cast<const wchar_t *>(NULL), NULL);
+  }, "");
+
+  // Empty strings.
+  EXPECT_NONFATAL_FAILURE(EXPECT_STRNE(L"", L""),
+                          "L\"\"");
+
+  // Non-null vs NULL.
+  ASSERT_STRNE(L"non-null", NULL);
+
+  // Equal strings.
+  EXPECT_NONFATAL_FAILURE(EXPECT_STRNE(L"Hi", L"Hi"),
+                          "L\"Hi\"");
+
+  // Unequal strings.
+  EXPECT_STRNE(L"abc", L"Abc");
+
+  // Strings containing wide characters.
+  EXPECT_NONFATAL_FAILURE(EXPECT_STRNE(L"abc\x8119", L"abc\x8119"),
+                          "abc");
+
+  // The streaming variation.
+  ASSERT_STRNE(L"abc\x8119", L"abc\x8120") << "This shouldn't happen";
+}
+
+// Tests for ::testing::IsSubstring().
+
+// Tests that IsSubstring() returns the correct result when the input
+// argument type is const char*.
+TEST(IsSubstringTest, ReturnsCorrectResultForCString) {
+  EXPECT_FALSE(IsSubstring("", "", NULL, "a"));
+  EXPECT_FALSE(IsSubstring("", "", "b", NULL));
+  EXPECT_FALSE(IsSubstring("", "", "needle", "haystack"));
+
+  EXPECT_TRUE(IsSubstring("", "", static_cast<const char*>(NULL), NULL));
+  EXPECT_TRUE(IsSubstring("", "", "needle", "two needles"));
+}
+
+// Tests that IsSubstring() returns the correct result when the input
+// argument type is const wchar_t*.
+TEST(IsSubstringTest, ReturnsCorrectResultForWideCString) {
+  EXPECT_FALSE(IsSubstring("", "", kNull, L"a"));
+  EXPECT_FALSE(IsSubstring("", "", L"b", kNull));
+  EXPECT_FALSE(IsSubstring("", "", L"needle", L"haystack"));
+
+  EXPECT_TRUE(IsSubstring("", "", static_cast<const wchar_t*>(NULL), NULL));
+  EXPECT_TRUE(IsSubstring("", "", L"needle", L"two needles"));
+}
+
+// Tests that IsSubstring() generates the correct message when the input
+// argument type is const char*.
+TEST(IsSubstringTest, GeneratesCorrectMessageForCString) {
+  EXPECT_STREQ("Value of: needle_expr\n"
+               "  Actual: \"needle\"\n"
+               "Expected: a substring of haystack_expr\n"
+               "Which is: \"haystack\"",
+               IsSubstring("needle_expr", "haystack_expr",
+                           "needle", "haystack").failure_message());
+}
+
+// Tests that IsSubstring returns the correct result when the input
+// argument type is ::std::string.
+TEST(IsSubstringTest, ReturnsCorrectResultsForStdString) {
+  EXPECT_TRUE(IsSubstring("", "", std::string("hello"), "ahellob"));
+  EXPECT_FALSE(IsSubstring("", "", "hello", std::string("world")));
+}
+
+#if GTEST_HAS_STD_WSTRING
+// Tests that IsSubstring returns the correct result when the input
+// argument type is ::std::wstring.
+TEST(IsSubstringTest, ReturnsCorrectResultForStdWstring) {
+  EXPECT_TRUE(IsSubstring("", "", ::std::wstring(L"needle"), L"two needles"));
+  EXPECT_FALSE(IsSubstring("", "", L"needle", ::std::wstring(L"haystack")));
+}
+
+// Tests that IsSubstring() generates the correct message when the input
+// argument type is ::std::wstring.
+TEST(IsSubstringTest, GeneratesCorrectMessageForWstring) {
+  EXPECT_STREQ("Value of: needle_expr\n"
+               "  Actual: L\"needle\"\n"
+               "Expected: a substring of haystack_expr\n"
+               "Which is: L\"haystack\"",
+               IsSubstring(
+                   "needle_expr", "haystack_expr",
+                   ::std::wstring(L"needle"), L"haystack").failure_message());
+}
+
+#endif  // GTEST_HAS_STD_WSTRING
+
+// Tests for ::testing::IsNotSubstring().
+
+// Tests that IsNotSubstring() returns the correct result when the input
+// argument type is const char*.
+TEST(IsNotSubstringTest, ReturnsCorrectResultForCString) {
+  EXPECT_TRUE(IsNotSubstring("", "", "needle", "haystack"));
+  EXPECT_FALSE(IsNotSubstring("", "", "needle", "two needles"));
+}
+
+// Tests that IsNotSubstring() returns the correct result when the input
+// argument type is const wchar_t*.
+TEST(IsNotSubstringTest, ReturnsCorrectResultForWideCString) {
+  EXPECT_TRUE(IsNotSubstring("", "", L"needle", L"haystack"));
+  EXPECT_FALSE(IsNotSubstring("", "", L"needle", L"two needles"));
+}
+
+// Tests that IsNotSubstring() generates the correct message when the input
+// argument type is const wchar_t*.
+TEST(IsNotSubstringTest, GeneratesCorrectMessageForWideCString) {
+  EXPECT_STREQ("Value of: needle_expr\n"
+               "  Actual: L\"needle\"\n"
+               "Expected: not a substring of haystack_expr\n"
+               "Which is: L\"two needles\"",
+               IsNotSubstring(
+                   "needle_expr", "haystack_expr",
+                   L"needle", L"two needles").failure_message());
+}
+
+// Tests that IsNotSubstring returns the correct result when the input
+// argument type is ::std::string.
+TEST(IsNotSubstringTest, ReturnsCorrectResultsForStdString) {
+  EXPECT_FALSE(IsNotSubstring("", "", std::string("hello"), "ahellob"));
+  EXPECT_TRUE(IsNotSubstring("", "", "hello", std::string("world")));
+}
+
+// Tests that IsNotSubstring() generates the correct message when the input
+// argument type is ::std::string.
+TEST(IsNotSubstringTest, GeneratesCorrectMessageForStdString) {
+  EXPECT_STREQ("Value of: needle_expr\n"
+               "  Actual: \"needle\"\n"
+               "Expected: not a substring of haystack_expr\n"
+               "Which is: \"two needles\"",
+               IsNotSubstring(
+                   "needle_expr", "haystack_expr",
+                   ::std::string("needle"), "two needles").failure_message());
+}
+
+#if GTEST_HAS_STD_WSTRING
+
+// Tests that IsNotSubstring returns the correct result when the input
+// argument type is ::std::wstring.
+TEST(IsNotSubstringTest, ReturnsCorrectResultForStdWstring) {
+  EXPECT_FALSE(
+      IsNotSubstring("", "", ::std::wstring(L"needle"), L"two needles"));
+  EXPECT_TRUE(IsNotSubstring("", "", L"needle", ::std::wstring(L"haystack")));
+}
+
+#endif  // GTEST_HAS_STD_WSTRING
+
+// Tests floating-point assertions.
+
+template <typename RawType>
+class FloatingPointTest : public Test {
+ protected:
+  // Pre-calculated numbers to be used by the tests.
+  struct TestValues {
+    RawType close_to_positive_zero;
+    RawType close_to_negative_zero;
+    RawType further_from_negative_zero;
+
+    RawType close_to_one;
+    RawType further_from_one;
+
+    RawType infinity;
+    RawType close_to_infinity;
+    RawType further_from_infinity;
+
+    RawType nan1;
+    RawType nan2;
+  };
+
+  typedef typename testing::internal::FloatingPoint<RawType> Floating;
+  typedef typename Floating::Bits Bits;
+
+  virtual void SetUp() {
+    const size_t max_ulps = Floating::kMaxUlps;
+
+    // The bits that represent 0.0.
+    const Bits zero_bits = Floating(0).bits();
+
+    // Makes some numbers close to 0.0.
+    values_.close_to_positive_zero = Floating::ReinterpretBits(
+        zero_bits + max_ulps/2);
+    values_.close_to_negative_zero = -Floating::ReinterpretBits(
+        zero_bits + max_ulps - max_ulps/2);
+    values_.further_from_negative_zero = -Floating::ReinterpretBits(
+        zero_bits + max_ulps + 1 - max_ulps/2);
+
+    // The bits that represent 1.0.
+    const Bits one_bits = Floating(1).bits();
+
+    // Makes some numbers close to 1.0.
+    values_.close_to_one = Floating::ReinterpretBits(one_bits + max_ulps);
+    values_.further_from_one = Floating::ReinterpretBits(
+        one_bits + max_ulps + 1);
+
+    // +infinity.
+    values_.infinity = Floating::Infinity();
+
+    // The bits that represent +infinity.
+    const Bits infinity_bits = Floating(values_.infinity).bits();
+
+    // Makes some numbers close to infinity.
+    values_.close_to_infinity = Floating::ReinterpretBits(
+        infinity_bits - max_ulps);
+    values_.further_from_infinity = Floating::ReinterpretBits(
+        infinity_bits - max_ulps - 1);
+
+    // Makes some NAN's.  Sets the most significant bit of the fraction so that
+    // our NaN's are quiet; trying to process a signaling NaN would raise an
+    // exception if our environment enables floating point exceptions.
+    values_.nan1 = Floating::ReinterpretBits(Floating::kExponentBitMask
+        | (static_cast<Bits>(1) << (Floating::kFractionBitCount - 1)) | 1);
+    values_.nan2 = Floating::ReinterpretBits(Floating::kExponentBitMask
+        | (static_cast<Bits>(1) << (Floating::kFractionBitCount - 1)) | 200);
+  }
+
+  void TestSize() {
+    EXPECT_EQ(sizeof(RawType), sizeof(Bits));
+  }
+
+  static TestValues values_;
+};
+
+template <typename RawType>
+typename FloatingPointTest<RawType>::TestValues
+    FloatingPointTest<RawType>::values_;
+
+// Instantiates FloatingPointTest for testing *_FLOAT_EQ.
+typedef FloatingPointTest<float> FloatTest;
+
+// Tests that the size of Float::Bits matches the size of float.
+TEST_F(FloatTest, Size) {
+  TestSize();
+}
+
+// Tests comparing with +0 and -0.
+TEST_F(FloatTest, Zeros) {
+  EXPECT_FLOAT_EQ(0.0, -0.0);
+  EXPECT_NONFATAL_FAILURE(EXPECT_FLOAT_EQ(-0.0, 1.0),
+                          "1.0");
+  EXPECT_FATAL_FAILURE(ASSERT_FLOAT_EQ(0.0, 1.5),
+                       "1.5");
+}
+
+// Tests comparing numbers close to 0.
+//
+// This ensures that *_FLOAT_EQ handles the sign correctly and no
+// overflow occurs when comparing numbers whose absolute value is very
+// small.
+TEST_F(FloatTest, AlmostZeros) {
+  // In C++Builder, names within local classes (such as used by
+  // EXPECT_FATAL_FAILURE) cannot be resolved against static members of the
+  // scoping class.  Use a static local alias as a workaround.
+  // We use the assignment syntax since some compilers, like Sun Studio,
+  // don't allow initializing references using construction syntax
+  // (parentheses).
+  static const FloatTest::TestValues& v = this->values_;
+
+  EXPECT_FLOAT_EQ(0.0, v.close_to_positive_zero);
+  EXPECT_FLOAT_EQ(-0.0, v.close_to_negative_zero);
+  EXPECT_FLOAT_EQ(v.close_to_positive_zero, v.close_to_negative_zero);
+
+  EXPECT_FATAL_FAILURE({  // NOLINT
+    ASSERT_FLOAT_EQ(v.close_to_positive_zero,
+                    v.further_from_negative_zero);
+  }, "v.further_from_negative_zero");
+}
+
+// Tests comparing numbers close to each other.
+TEST_F(FloatTest, SmallDiff) {
+  EXPECT_FLOAT_EQ(1.0, values_.close_to_one);
+  EXPECT_NONFATAL_FAILURE(EXPECT_FLOAT_EQ(1.0, values_.further_from_one),
+                          "values_.further_from_one");
+}
+
+// Tests comparing numbers far apart.
+TEST_F(FloatTest, LargeDiff) {
+  EXPECT_NONFATAL_FAILURE(EXPECT_FLOAT_EQ(2.5, 3.0),
+                          "3.0");
+}
+
+// Tests comparing with infinity.
+//
+// This ensures that no overflow occurs when comparing numbers whose
+// absolute value is very large.
+TEST_F(FloatTest, Infinity) {
+  EXPECT_FLOAT_EQ(values_.infinity, values_.close_to_infinity);
+  EXPECT_FLOAT_EQ(-values_.infinity, -values_.close_to_infinity);
+#if !GTEST_OS_SYMBIAN
+  // Nokia's STLport crashes if we try to output infinity or NaN.
+  EXPECT_NONFATAL_FAILURE(EXPECT_FLOAT_EQ(values_.infinity, -values_.infinity),
+                          "-values_.infinity");
+
+  // This is interesting as the representations of infinity and nan1
+  // are only 1 DLP apart.
+  EXPECT_NONFATAL_FAILURE(EXPECT_FLOAT_EQ(values_.infinity, values_.nan1),
+                          "values_.nan1");
+#endif  // !GTEST_OS_SYMBIAN
+}
+
+// Tests that comparing with NAN always returns false.
+TEST_F(FloatTest, NaN) {
+#if !GTEST_OS_SYMBIAN
+// Nokia's STLport crashes if we try to output infinity or NaN.
+
+  // In C++Builder, names within local classes (such as used by
+  // EXPECT_FATAL_FAILURE) cannot be resolved against static members of the
+  // scoping class.  Use a static local alias as a workaround.
+  // We use the assignment syntax since some compilers, like Sun Studio,
+  // don't allow initializing references using construction syntax
+  // (parentheses).
+  static const FloatTest::TestValues& v = this->values_;
+
+  EXPECT_NONFATAL_FAILURE(EXPECT_FLOAT_EQ(v.nan1, v.nan1),
+                          "v.nan1");
+  EXPECT_NONFATAL_FAILURE(EXPECT_FLOAT_EQ(v.nan1, v.nan2),
+                          "v.nan2");
+  EXPECT_NONFATAL_FAILURE(EXPECT_FLOAT_EQ(1.0, v.nan1),
+                          "v.nan1");
+
+  EXPECT_FATAL_FAILURE(ASSERT_FLOAT_EQ(v.nan1, v.infinity),
+                       "v.infinity");
+#endif  // !GTEST_OS_SYMBIAN
+}
+
+// Tests that *_FLOAT_EQ are reflexive.
+TEST_F(FloatTest, Reflexive) {
+  EXPECT_FLOAT_EQ(0.0, 0.0);
+  EXPECT_FLOAT_EQ(1.0, 1.0);
+  ASSERT_FLOAT_EQ(values_.infinity, values_.infinity);
+}
+
+// Tests that *_FLOAT_EQ are commutative.
+TEST_F(FloatTest, Commutative) {
+  // We already tested EXPECT_FLOAT_EQ(1.0, values_.close_to_one).
+  EXPECT_FLOAT_EQ(values_.close_to_one, 1.0);
+
+  // We already tested EXPECT_FLOAT_EQ(1.0, values_.further_from_one).
+  EXPECT_NONFATAL_FAILURE(EXPECT_FLOAT_EQ(values_.further_from_one, 1.0),
+                          "1.0");
+}
+
+// Tests EXPECT_NEAR.
+TEST_F(FloatTest, EXPECT_NEAR) {
+  EXPECT_NEAR(-1.0f, -1.1f, 0.2f);
+  EXPECT_NEAR(2.0f, 3.0f, 1.0f);
+  EXPECT_NONFATAL_FAILURE(EXPECT_NEAR(1.0f,1.5f, 0.25f),  // NOLINT
+                          "The difference between 1.0f and 1.5f is 0.5, "
+                          "which exceeds 0.25f");
+  // To work around a bug in gcc 2.95.0, there is intentionally no
+  // space after the first comma in the previous line.
+}
+
+// Tests ASSERT_NEAR.
+TEST_F(FloatTest, ASSERT_NEAR) {
+  ASSERT_NEAR(-1.0f, -1.1f, 0.2f);
+  ASSERT_NEAR(2.0f, 3.0f, 1.0f);
+  EXPECT_FATAL_FAILURE(ASSERT_NEAR(1.0f,1.5f, 0.25f),  // NOLINT
+                       "The difference between 1.0f and 1.5f is 0.5, "
+                       "which exceeds 0.25f");
+  // To work around a bug in gcc 2.95.0, there is intentionally no
+  // space after the first comma in the previous line.
+}
+
+// Tests the cases where FloatLE() should succeed.
+TEST_F(FloatTest, FloatLESucceeds) {
+  EXPECT_PRED_FORMAT2(FloatLE, 1.0f, 2.0f);  // When val1 < val2,
+  ASSERT_PRED_FORMAT2(FloatLE, 1.0f, 1.0f);  // val1 == val2,
+
+  // or when val1 is greater than, but almost equals to, val2.
+  EXPECT_PRED_FORMAT2(FloatLE, values_.close_to_positive_zero, 0.0f);
+}
+
+// Tests the cases where FloatLE() should fail.
+TEST_F(FloatTest, FloatLEFails) {
+  // When val1 is greater than val2 by a large margin,
+  EXPECT_NONFATAL_FAILURE(EXPECT_PRED_FORMAT2(FloatLE, 2.0f, 1.0f),
+                          "(2.0f) <= (1.0f)");
+
+  // or by a small yet non-negligible margin,
+  EXPECT_NONFATAL_FAILURE({  // NOLINT
+    EXPECT_PRED_FORMAT2(FloatLE, values_.further_from_one, 1.0f);
+  }, "(values_.further_from_one) <= (1.0f)");
+
+#if !GTEST_OS_SYMBIAN && !defined(__BORLANDC__)
+  // Nokia's STLport crashes if we try to output infinity or NaN.
+  // C++Builder gives bad results for ordered comparisons involving NaNs
+  // due to compiler bugs.
+  EXPECT_NONFATAL_FAILURE({  // NOLINT
+    EXPECT_PRED_FORMAT2(FloatLE, values_.nan1, values_.infinity);
+  }, "(values_.nan1) <= (values_.infinity)");
+  EXPECT_NONFATAL_FAILURE({  // NOLINT
+    EXPECT_PRED_FORMAT2(FloatLE, -values_.infinity, values_.nan1);
+  }, "(-values_.infinity) <= (values_.nan1)");
+  EXPECT_FATAL_FAILURE({  // NOLINT
+    ASSERT_PRED_FORMAT2(FloatLE, values_.nan1, values_.nan1);
+  }, "(values_.nan1) <= (values_.nan1)");
+#endif  // !GTEST_OS_SYMBIAN && !defined(__BORLANDC__)
+}
+
+// Instantiates FloatingPointTest for testing *_DOUBLE_EQ.
+typedef FloatingPointTest<double> DoubleTest;
+
+// Tests that the size of Double::Bits matches the size of double.
+TEST_F(DoubleTest, Size) {
+  TestSize();
+}
+
+// Tests comparing with +0 and -0.
+TEST_F(DoubleTest, Zeros) {
+  EXPECT_DOUBLE_EQ(0.0, -0.0);
+  EXPECT_NONFATAL_FAILURE(EXPECT_DOUBLE_EQ(-0.0, 1.0),
+                          "1.0");
+  EXPECT_FATAL_FAILURE(ASSERT_DOUBLE_EQ(0.0, 1.0),
+                       "1.0");
+}
+
+// Tests comparing numbers close to 0.
+//
+// This ensures that *_DOUBLE_EQ handles the sign correctly and no
+// overflow occurs when comparing numbers whose absolute value is very
+// small.
+TEST_F(DoubleTest, AlmostZeros) {
+  // In C++Builder, names within local classes (such as used by
+  // EXPECT_FATAL_FAILURE) cannot be resolved against static members of the
+  // scoping class.  Use a static local alias as a workaround.
+  // We use the assignment syntax since some compilers, like Sun Studio,
+  // don't allow initializing references using construction syntax
+  // (parentheses).
+  static const DoubleTest::TestValues& v = this->values_;
+
+  EXPECT_DOUBLE_EQ(0.0, v.close_to_positive_zero);
+  EXPECT_DOUBLE_EQ(-0.0, v.close_to_negative_zero);
+  EXPECT_DOUBLE_EQ(v.close_to_positive_zero, v.close_to_negative_zero);
+
+  EXPECT_FATAL_FAILURE({  // NOLINT
+    ASSERT_DOUBLE_EQ(v.close_to_positive_zero,
+                     v.further_from_negative_zero);
+  }, "v.further_from_negative_zero");
+}
+
+// Tests comparing numbers close to each other.
+TEST_F(DoubleTest, SmallDiff) {
+  EXPECT_DOUBLE_EQ(1.0, values_.close_to_one);
+  EXPECT_NONFATAL_FAILURE(EXPECT_DOUBLE_EQ(1.0, values_.further_from_one),
+                          "values_.further_from_one");
+}
+
+// Tests comparing numbers far apart.
+TEST_F(DoubleTest, LargeDiff) {
+  EXPECT_NONFATAL_FAILURE(EXPECT_DOUBLE_EQ(2.0, 3.0),
+                          "3.0");
+}
+
+// Tests comparing with infinity.
+//
+// This ensures that no overflow occurs when comparing numbers whose
+// absolute value is very large.
+TEST_F(DoubleTest, Infinity) {
+  EXPECT_DOUBLE_EQ(values_.infinity, values_.close_to_infinity);
+  EXPECT_DOUBLE_EQ(-values_.infinity, -values_.close_to_infinity);
+#if !GTEST_OS_SYMBIAN
+  // Nokia's STLport crashes if we try to output infinity or NaN.
+  EXPECT_NONFATAL_FAILURE(EXPECT_DOUBLE_EQ(values_.infinity, -values_.infinity),
+                          "-values_.infinity");
+
+  // This is interesting as the representations of infinity_ and nan1_
+  // are only 1 DLP apart.
+  EXPECT_NONFATAL_FAILURE(EXPECT_DOUBLE_EQ(values_.infinity, values_.nan1),
+                          "values_.nan1");
+#endif  // !GTEST_OS_SYMBIAN
+}
+
+// Tests that comparing with NAN always returns false.
+TEST_F(DoubleTest, NaN) {
+#if !GTEST_OS_SYMBIAN
+  // In C++Builder, names within local classes (such as used by
+  // EXPECT_FATAL_FAILURE) cannot be resolved against static members of the
+  // scoping class.  Use a static local alias as a workaround.
+  // We use the assignment syntax since some compilers, like Sun Studio,
+  // don't allow initializing references using construction syntax
+  // (parentheses).
+  static const DoubleTest::TestValues& v = this->values_;
+
+  // Nokia's STLport crashes if we try to output infinity or NaN.
+  EXPECT_NONFATAL_FAILURE(EXPECT_DOUBLE_EQ(v.nan1, v.nan1),
+                          "v.nan1");
+  EXPECT_NONFATAL_FAILURE(EXPECT_DOUBLE_EQ(v.nan1, v.nan2), "v.nan2");
+  EXPECT_NONFATAL_FAILURE(EXPECT_DOUBLE_EQ(1.0, v.nan1), "v.nan1");
+  EXPECT_FATAL_FAILURE(ASSERT_DOUBLE_EQ(v.nan1, v.infinity),
+                       "v.infinity");
+#endif  // !GTEST_OS_SYMBIAN
+}
+
+// Tests that *_DOUBLE_EQ are reflexive.
+TEST_F(DoubleTest, Reflexive) {
+  EXPECT_DOUBLE_EQ(0.0, 0.0);
+  EXPECT_DOUBLE_EQ(1.0, 1.0);
+#if !GTEST_OS_SYMBIAN
+  // Nokia's STLport crashes if we try to output infinity or NaN.
+  ASSERT_DOUBLE_EQ(values_.infinity, values_.infinity);
+#endif  // !GTEST_OS_SYMBIAN
+}
+
+// Tests that *_DOUBLE_EQ are commutative.
+TEST_F(DoubleTest, Commutative) {
+  // We already tested EXPECT_DOUBLE_EQ(1.0, values_.close_to_one).
+  EXPECT_DOUBLE_EQ(values_.close_to_one, 1.0);
+
+  // We already tested EXPECT_DOUBLE_EQ(1.0, values_.further_from_one).
+  EXPECT_NONFATAL_FAILURE(EXPECT_DOUBLE_EQ(values_.further_from_one, 1.0),
+                          "1.0");
+}
+
+// Tests EXPECT_NEAR.
+TEST_F(DoubleTest, EXPECT_NEAR) {
+  EXPECT_NEAR(-1.0, -1.1, 0.2);
+  EXPECT_NEAR(2.0, 3.0, 1.0);
+  EXPECT_NONFATAL_FAILURE(EXPECT_NEAR(1.0, 1.5, 0.25),  // NOLINT
+                          "The difference between 1.0 and 1.5 is 0.5, "
+                          "which exceeds 0.25");
+  // To work around a bug in gcc 2.95.0, there is intentionally no
+  // space after the first comma in the previous statement.
+}
+
+// Tests ASSERT_NEAR.
+TEST_F(DoubleTest, ASSERT_NEAR) {
+  ASSERT_NEAR(-1.0, -1.1, 0.2);
+  ASSERT_NEAR(2.0, 3.0, 1.0);
+  EXPECT_FATAL_FAILURE(ASSERT_NEAR(1.0, 1.5, 0.25),  // NOLINT
+                       "The difference between 1.0 and 1.5 is 0.5, "
+                       "which exceeds 0.25");
+  // To work around a bug in gcc 2.95.0, there is intentionally no
+  // space after the first comma in the previous statement.
+}
+
+// Tests the cases where DoubleLE() should succeed.
+TEST_F(DoubleTest, DoubleLESucceeds) {
+  EXPECT_PRED_FORMAT2(DoubleLE, 1.0, 2.0);  // When val1 < val2,
+  ASSERT_PRED_FORMAT2(DoubleLE, 1.0, 1.0);  // val1 == val2,
+
+  // or when val1 is greater than, but almost equals to, val2.
+  EXPECT_PRED_FORMAT2(DoubleLE, values_.close_to_positive_zero, 0.0);
+}
+
+// Tests the cases where DoubleLE() should fail.
+TEST_F(DoubleTest, DoubleLEFails) {
+  // When val1 is greater than val2 by a large margin,
+  EXPECT_NONFATAL_FAILURE(EXPECT_PRED_FORMAT2(DoubleLE, 2.0, 1.0),
+                          "(2.0) <= (1.0)");
+
+  // or by a small yet non-negligible margin,
+  EXPECT_NONFATAL_FAILURE({  // NOLINT
+    EXPECT_PRED_FORMAT2(DoubleLE, values_.further_from_one, 1.0);
+  }, "(values_.further_from_one) <= (1.0)");
+
+#if !GTEST_OS_SYMBIAN && !defined(__BORLANDC__)
+  // Nokia's STLport crashes if we try to output infinity or NaN.
+  // C++Builder gives bad results for ordered comparisons involving NaNs
+  // due to compiler bugs.
+  EXPECT_NONFATAL_FAILURE({  // NOLINT
+    EXPECT_PRED_FORMAT2(DoubleLE, values_.nan1, values_.infinity);
+  }, "(values_.nan1) <= (values_.infinity)");
+  EXPECT_NONFATAL_FAILURE({  // NOLINT
+    EXPECT_PRED_FORMAT2(DoubleLE, -values_.infinity, values_.nan1);
+  }, " (-values_.infinity) <= (values_.nan1)");
+  EXPECT_FATAL_FAILURE({  // NOLINT
+    ASSERT_PRED_FORMAT2(DoubleLE, values_.nan1, values_.nan1);
+  }, "(values_.nan1) <= (values_.nan1)");
+#endif  // !GTEST_OS_SYMBIAN && !defined(__BORLANDC__)
+}
+
+
+// Verifies that a test or test case whose name starts with DISABLED_ is
+// not run.
+
+// A test whose name starts with DISABLED_.
+// Should not run.
+TEST(DisabledTest, DISABLED_TestShouldNotRun) {
+  FAIL() << "Unexpected failure: Disabled test should not be run.";
+}
+
+// A test whose name does not start with DISABLED_.
+// Should run.
+TEST(DisabledTest, NotDISABLED_TestShouldRun) {
+  EXPECT_EQ(1, 1);
+}
+
+// A test case whose name starts with DISABLED_.
+// Should not run.
+TEST(DISABLED_TestCase, TestShouldNotRun) {
+  FAIL() << "Unexpected failure: Test in disabled test case should not be run.";
+}
+
+// A test case and test whose names start with DISABLED_.
+// Should not run.
+TEST(DISABLED_TestCase, DISABLED_TestShouldNotRun) {
+  FAIL() << "Unexpected failure: Test in disabled test case should not be run.";
+}
+
+// Check that when all tests in a test case are disabled, SetupTestCase() and
+// TearDownTestCase() are not called.
+class DisabledTestsTest : public Test {
+ protected:
+  static void SetUpTestCase() {
+    FAIL() << "Unexpected failure: All tests disabled in test case. "
+              "SetupTestCase() should not be called.";
+  }
+
+  static void TearDownTestCase() {
+    FAIL() << "Unexpected failure: All tests disabled in test case. "
+              "TearDownTestCase() should not be called.";
+  }
+};
+
+TEST_F(DisabledTestsTest, DISABLED_TestShouldNotRun_1) {
+  FAIL() << "Unexpected failure: Disabled test should not be run.";
+}
+
+TEST_F(DisabledTestsTest, DISABLED_TestShouldNotRun_2) {
+  FAIL() << "Unexpected failure: Disabled test should not be run.";
+}
+
+// Tests that disabled typed tests aren't run.
+
+#if GTEST_HAS_TYPED_TEST
+
+template <typename T>
+class TypedTest : public Test {
+};
+
+typedef testing::Types<int, double> NumericTypes;
+TYPED_TEST_CASE(TypedTest, NumericTypes);
+
+TYPED_TEST(TypedTest, DISABLED_ShouldNotRun) {
+  FAIL() << "Unexpected failure: Disabled typed test should not run.";
+}
+
+template <typename T>
+class DISABLED_TypedTest : public Test {
+};
+
+TYPED_TEST_CASE(DISABLED_TypedTest, NumericTypes);
+
+TYPED_TEST(DISABLED_TypedTest, ShouldNotRun) {
+  FAIL() << "Unexpected failure: Disabled typed test should not run.";
+}
+
+#endif  // GTEST_HAS_TYPED_TEST
+
+// Tests that disabled type-parameterized tests aren't run.
+
+#if GTEST_HAS_TYPED_TEST_P
+
+template <typename T>
+class TypedTestP : public Test {
+};
+
+TYPED_TEST_CASE_P(TypedTestP);
+
+TYPED_TEST_P(TypedTestP, DISABLED_ShouldNotRun) {
+  FAIL() << "Unexpected failure: "
+         << "Disabled type-parameterized test should not run.";
+}
+
+REGISTER_TYPED_TEST_CASE_P(TypedTestP, DISABLED_ShouldNotRun);
+
+INSTANTIATE_TYPED_TEST_CASE_P(My, TypedTestP, NumericTypes);
+
+template <typename T>
+class DISABLED_TypedTestP : public Test {
+};
+
+TYPED_TEST_CASE_P(DISABLED_TypedTestP);
+
+TYPED_TEST_P(DISABLED_TypedTestP, ShouldNotRun) {
+  FAIL() << "Unexpected failure: "
+         << "Disabled type-parameterized test should not run.";
+}
+
+REGISTER_TYPED_TEST_CASE_P(DISABLED_TypedTestP, ShouldNotRun);
+
+INSTANTIATE_TYPED_TEST_CASE_P(My, DISABLED_TypedTestP, NumericTypes);
+
+#endif  // GTEST_HAS_TYPED_TEST_P
+
+// Tests that assertion macros evaluate their arguments exactly once.
+
+class SingleEvaluationTest : public Test {
+ public:  // Must be public and not protected due to a bug in g++ 3.4.2.
+  // This helper function is needed by the FailedASSERT_STREQ test
+  // below.  It's public to work around C++Builder's bug with scoping local
+  // classes.
+  static void CompareAndIncrementCharPtrs() {
+    ASSERT_STREQ(p1_++, p2_++);
+  }
+
+  // This helper function is needed by the FailedASSERT_NE test below.  It's
+  // public to work around C++Builder's bug with scoping local classes.
+  static void CompareAndIncrementInts() {
+    ASSERT_NE(a_++, b_++);
+  }
+
+ protected:
+  SingleEvaluationTest() {
+    p1_ = s1_;
+    p2_ = s2_;
+    a_ = 0;
+    b_ = 0;
+  }
+
+  static const char* const s1_;
+  static const char* const s2_;
+  static const char* p1_;
+  static const char* p2_;
+
+  static int a_;
+  static int b_;
+};
+
+const char* const SingleEvaluationTest::s1_ = "01234";
+const char* const SingleEvaluationTest::s2_ = "abcde";
+const char* SingleEvaluationTest::p1_;
+const char* SingleEvaluationTest::p2_;
+int SingleEvaluationTest::a_;
+int SingleEvaluationTest::b_;
+
+// Tests that when ASSERT_STREQ fails, it evaluates its arguments
+// exactly once.
+TEST_F(SingleEvaluationTest, FailedASSERT_STREQ) {
+  EXPECT_FATAL_FAILURE(SingleEvaluationTest::CompareAndIncrementCharPtrs(),
+                       "p2_++");
+  EXPECT_EQ(s1_ + 1, p1_);
+  EXPECT_EQ(s2_ + 1, p2_);
+}
+
+// Tests that string assertion arguments are evaluated exactly once.
+TEST_F(SingleEvaluationTest, ASSERT_STR) {
+  // successful EXPECT_STRNE
+  EXPECT_STRNE(p1_++, p2_++);
+  EXPECT_EQ(s1_ + 1, p1_);
+  EXPECT_EQ(s2_ + 1, p2_);
+
+  // failed EXPECT_STRCASEEQ
+  EXPECT_NONFATAL_FAILURE(EXPECT_STRCASEEQ(p1_++, p2_++),
+                          "ignoring case");
+  EXPECT_EQ(s1_ + 2, p1_);
+  EXPECT_EQ(s2_ + 2, p2_);
+}
+
+// Tests that when ASSERT_NE fails, it evaluates its arguments exactly
+// once.
+TEST_F(SingleEvaluationTest, FailedASSERT_NE) {
+  EXPECT_FATAL_FAILURE(SingleEvaluationTest::CompareAndIncrementInts(),
+                       "(a_++) != (b_++)");
+  EXPECT_EQ(1, a_);
+  EXPECT_EQ(1, b_);
+}
+
+// Tests that assertion arguments are evaluated exactly once.
+TEST_F(SingleEvaluationTest, OtherCases) {
+  // successful EXPECT_TRUE
+  EXPECT_TRUE(0 == a_++);  // NOLINT
+  EXPECT_EQ(1, a_);
+
+  // failed EXPECT_TRUE
+  EXPECT_NONFATAL_FAILURE(EXPECT_TRUE(-1 == a_++), "-1 == a_++");
+  EXPECT_EQ(2, a_);
+
+  // successful EXPECT_GT
+  EXPECT_GT(a_++, b_++);
+  EXPECT_EQ(3, a_);
+  EXPECT_EQ(1, b_);
+
+  // failed EXPECT_LT
+  EXPECT_NONFATAL_FAILURE(EXPECT_LT(a_++, b_++), "(a_++) < (b_++)");
+  EXPECT_EQ(4, a_);
+  EXPECT_EQ(2, b_);
+
+  // successful ASSERT_TRUE
+  ASSERT_TRUE(0 < a_++);  // NOLINT
+  EXPECT_EQ(5, a_);
+
+  // successful ASSERT_GT
+  ASSERT_GT(a_++, b_++);
+  EXPECT_EQ(6, a_);
+  EXPECT_EQ(3, b_);
+}
+
+#if GTEST_HAS_EXCEPTIONS
+
+void ThrowAnInteger() {
+  throw 1;
+}
+
+// Tests that assertion arguments are evaluated exactly once.
+TEST_F(SingleEvaluationTest, ExceptionTests) {
+  // successful EXPECT_THROW
+  EXPECT_THROW({  // NOLINT
+    a_++;
+    ThrowAnInteger();
+  }, int);
+  EXPECT_EQ(1, a_);
+
+  // failed EXPECT_THROW, throws different
+  EXPECT_NONFATAL_FAILURE(EXPECT_THROW({  // NOLINT
+    a_++;
+    ThrowAnInteger();
+  }, bool), "throws a different type");
+  EXPECT_EQ(2, a_);
+
+  // failed EXPECT_THROW, throws nothing
+  EXPECT_NONFATAL_FAILURE(EXPECT_THROW(a_++, bool), "throws nothing");
+  EXPECT_EQ(3, a_);
+
+  // successful EXPECT_NO_THROW
+  EXPECT_NO_THROW(a_++);
+  EXPECT_EQ(4, a_);
+
+  // failed EXPECT_NO_THROW
+  EXPECT_NONFATAL_FAILURE(EXPECT_NO_THROW({  // NOLINT
+    a_++;
+    ThrowAnInteger();
+  }), "it throws");
+  EXPECT_EQ(5, a_);
+
+  // successful EXPECT_ANY_THROW
+  EXPECT_ANY_THROW({  // NOLINT
+    a_++;
+    ThrowAnInteger();
+  });
+  EXPECT_EQ(6, a_);
+
+  // failed EXPECT_ANY_THROW
+  EXPECT_NONFATAL_FAILURE(EXPECT_ANY_THROW(a_++), "it doesn't");
+  EXPECT_EQ(7, a_);
+}
+
+#endif  // GTEST_HAS_EXCEPTIONS
+
+// Tests {ASSERT|EXPECT}_NO_FATAL_FAILURE.
+class NoFatalFailureTest : public Test {
+ protected:
+  void Succeeds() {}
+  void FailsNonFatal() {
+    ADD_FAILURE() << "some non-fatal failure";
+  }
+  void Fails() {
+    FAIL() << "some fatal failure";
+  }
+
+  void DoAssertNoFatalFailureOnFails() {
+    ASSERT_NO_FATAL_FAILURE(Fails());
+    ADD_FAILURE() << "shold not reach here.";
+  }
+
+  void DoExpectNoFatalFailureOnFails() {
+    EXPECT_NO_FATAL_FAILURE(Fails());
+    ADD_FAILURE() << "other failure";
+  }
+};
+
+TEST_F(NoFatalFailureTest, NoFailure) {
+  EXPECT_NO_FATAL_FAILURE(Succeeds());
+  ASSERT_NO_FATAL_FAILURE(Succeeds());
+}
+
+TEST_F(NoFatalFailureTest, NonFatalIsNoFailure) {
+  EXPECT_NONFATAL_FAILURE(
+      EXPECT_NO_FATAL_FAILURE(FailsNonFatal()),
+      "some non-fatal failure");
+  EXPECT_NONFATAL_FAILURE(
+      ASSERT_NO_FATAL_FAILURE(FailsNonFatal()),
+      "some non-fatal failure");
+}
+
+TEST_F(NoFatalFailureTest, AssertNoFatalFailureOnFatalFailure) {
+  TestPartResultArray gtest_failures;
+  {
+    ScopedFakeTestPartResultReporter gtest_reporter(&gtest_failures);
+    DoAssertNoFatalFailureOnFails();
+  }
+  ASSERT_EQ(2, gtest_failures.size());
+  EXPECT_EQ(TestPartResult::kFatalFailure,
+            gtest_failures.GetTestPartResult(0).type());
+  EXPECT_EQ(TestPartResult::kFatalFailure,
+            gtest_failures.GetTestPartResult(1).type());
+  EXPECT_PRED_FORMAT2(testing::IsSubstring, "some fatal failure",
+                      gtest_failures.GetTestPartResult(0).message());
+  EXPECT_PRED_FORMAT2(testing::IsSubstring, "it does",
+                      gtest_failures.GetTestPartResult(1).message());
+}
+
+TEST_F(NoFatalFailureTest, ExpectNoFatalFailureOnFatalFailure) {
+  TestPartResultArray gtest_failures;
+  {
+    ScopedFakeTestPartResultReporter gtest_reporter(&gtest_failures);
+    DoExpectNoFatalFailureOnFails();
+  }
+  ASSERT_EQ(3, gtest_failures.size());
+  EXPECT_EQ(TestPartResult::kFatalFailure,
+            gtest_failures.GetTestPartResult(0).type());
+  EXPECT_EQ(TestPartResult::kNonFatalFailure,
+            gtest_failures.GetTestPartResult(1).type());
+  EXPECT_EQ(TestPartResult::kNonFatalFailure,
+            gtest_failures.GetTestPartResult(2).type());
+  EXPECT_PRED_FORMAT2(testing::IsSubstring, "some fatal failure",
+                      gtest_failures.GetTestPartResult(0).message());
+  EXPECT_PRED_FORMAT2(testing::IsSubstring, "it does",
+                      gtest_failures.GetTestPartResult(1).message());
+  EXPECT_PRED_FORMAT2(testing::IsSubstring, "other failure",
+                      gtest_failures.GetTestPartResult(2).message());
+}
+
+TEST_F(NoFatalFailureTest, MessageIsStreamable) {
+  TestPartResultArray gtest_failures;
+  {
+    ScopedFakeTestPartResultReporter gtest_reporter(&gtest_failures);
+    EXPECT_NO_FATAL_FAILURE(FAIL() << "foo") << "my message";
+  }
+  ASSERT_EQ(2, gtest_failures.size());
+  EXPECT_EQ(TestPartResult::kNonFatalFailure,
+            gtest_failures.GetTestPartResult(0).type());
+  EXPECT_EQ(TestPartResult::kNonFatalFailure,
+            gtest_failures.GetTestPartResult(1).type());
+  EXPECT_PRED_FORMAT2(testing::IsSubstring, "foo",
+                      gtest_failures.GetTestPartResult(0).message());
+  EXPECT_PRED_FORMAT2(testing::IsSubstring, "my message",
+                      gtest_failures.GetTestPartResult(1).message());
+}
+
+// Tests non-string assertions.
+
+// Tests EqFailure(), used for implementing *EQ* assertions.
+TEST(AssertionTest, EqFailure) {
+  const std::string foo_val("5"), bar_val("6");
+  const std::string msg1(
+      EqFailure("foo", "bar", foo_val, bar_val, false)
+      .failure_message());
+  EXPECT_STREQ(
+      "Value of: bar\n"
+      "  Actual: 6\n"
+      "Expected: foo\n"
+      "Which is: 5",
+      msg1.c_str());
+
+  const std::string msg2(
+      EqFailure("foo", "6", foo_val, bar_val, false)
+      .failure_message());
+  EXPECT_STREQ(
+      "Value of: 6\n"
+      "Expected: foo\n"
+      "Which is: 5",
+      msg2.c_str());
+
+  const std::string msg3(
+      EqFailure("5", "bar", foo_val, bar_val, false)
+      .failure_message());
+  EXPECT_STREQ(
+      "Value of: bar\n"
+      "  Actual: 6\n"
+      "Expected: 5",
+      msg3.c_str());
+
+  const std::string msg4(
+      EqFailure("5", "6", foo_val, bar_val, false).failure_message());
+  EXPECT_STREQ(
+      "Value of: 6\n"
+      "Expected: 5",
+      msg4.c_str());
+
+  const std::string msg5(
+      EqFailure("foo", "bar",
+                std::string("\"x\""), std::string("\"y\""),
+                true).failure_message());
+  EXPECT_STREQ(
+      "Value of: bar\n"
+      "  Actual: \"y\"\n"
+      "Expected: foo (ignoring case)\n"
+      "Which is: \"x\"",
+      msg5.c_str());
+}
+
+// Tests AppendUserMessage(), used for implementing the *EQ* macros.
+TEST(AssertionTest, AppendUserMessage) {
+  const std::string foo("foo");
+
+  Message msg;
+  EXPECT_STREQ("foo",
+               AppendUserMessage(foo, msg).c_str());
+
+  msg << "bar";
+  EXPECT_STREQ("foo\nbar",
+               AppendUserMessage(foo, msg).c_str());
+}
+
+#ifdef __BORLANDC__
+// Silences warnings: "Condition is always true", "Unreachable code"
+# pragma option push -w-ccc -w-rch
+#endif
+
+// Tests ASSERT_TRUE.
+TEST(AssertionTest, ASSERT_TRUE) {
+  ASSERT_TRUE(2 > 1);  // NOLINT
+  EXPECT_FATAL_FAILURE(ASSERT_TRUE(2 < 1),
+                       "2 < 1");
+}
+
+// Tests ASSERT_TRUE(predicate) for predicates returning AssertionResult.
+TEST(AssertionTest, AssertTrueWithAssertionResult) {
+  ASSERT_TRUE(ResultIsEven(2));
+#ifndef __BORLANDC__
+  // ICE's in C++Builder.
+  EXPECT_FATAL_FAILURE(ASSERT_TRUE(ResultIsEven(3)),
+                       "Value of: ResultIsEven(3)\n"
+                       "  Actual: false (3 is odd)\n"
+                       "Expected: true");
+#endif
+  ASSERT_TRUE(ResultIsEvenNoExplanation(2));
+  EXPECT_FATAL_FAILURE(ASSERT_TRUE(ResultIsEvenNoExplanation(3)),
+                       "Value of: ResultIsEvenNoExplanation(3)\n"
+                       "  Actual: false (3 is odd)\n"
+                       "Expected: true");
+}
+
+// Tests ASSERT_FALSE.
+TEST(AssertionTest, ASSERT_FALSE) {
+  ASSERT_FALSE(2 < 1);  // NOLINT
+  EXPECT_FATAL_FAILURE(ASSERT_FALSE(2 > 1),
+                       "Value of: 2 > 1\n"
+                       "  Actual: true\n"
+                       "Expected: false");
+}
+
+// Tests ASSERT_FALSE(predicate) for predicates returning AssertionResult.
+TEST(AssertionTest, AssertFalseWithAssertionResult) {
+  ASSERT_FALSE(ResultIsEven(3));
+#ifndef __BORLANDC__
+  // ICE's in C++Builder.
+  EXPECT_FATAL_FAILURE(ASSERT_FALSE(ResultIsEven(2)),
+                       "Value of: ResultIsEven(2)\n"
+                       "  Actual: true (2 is even)\n"
+                       "Expected: false");
+#endif
+  ASSERT_FALSE(ResultIsEvenNoExplanation(3));
+  EXPECT_FATAL_FAILURE(ASSERT_FALSE(ResultIsEvenNoExplanation(2)),
+                       "Value of: ResultIsEvenNoExplanation(2)\n"
+                       "  Actual: true\n"
+                       "Expected: false");
+}
+
+#ifdef __BORLANDC__
+// Restores warnings after previous "#pragma option push" supressed them
+# pragma option pop
+#endif
+
+// Tests using ASSERT_EQ on double values.  The purpose is to make
+// sure that the specialization we did for integer and anonymous enums
+// isn't used for double arguments.
+TEST(ExpectTest, ASSERT_EQ_Double) {
+  // A success.
+  ASSERT_EQ(5.6, 5.6);
+
+  // A failure.
+  EXPECT_FATAL_FAILURE(ASSERT_EQ(5.1, 5.2),
+                       "5.1");
+}
+
+// Tests ASSERT_EQ.
+TEST(AssertionTest, ASSERT_EQ) {
+  ASSERT_EQ(5, 2 + 3);
+  EXPECT_FATAL_FAILURE(ASSERT_EQ(5, 2*3),
+                       "Value of: 2*3\n"
+                       "  Actual: 6\n"
+                       "Expected: 5");
+}
+
+// Tests ASSERT_EQ(NULL, pointer).
+#if GTEST_CAN_COMPARE_NULL
+TEST(AssertionTest, ASSERT_EQ_NULL) {
+  // A success.
+  const char* p = NULL;
+  // Some older GCC versions may issue a spurious waring in this or the next
+  // assertion statement. This warning should not be suppressed with
+  // static_cast since the test verifies the ability to use bare NULL as the
+  // expected parameter to the macro.
+  ASSERT_EQ(NULL, p);
+
+  // A failure.
+  static int n = 0;
+  EXPECT_FATAL_FAILURE(ASSERT_EQ(NULL, &n),
+                       "Value of: &n\n");
+}
+#endif  // GTEST_CAN_COMPARE_NULL
+
+// Tests ASSERT_EQ(0, non_pointer).  Since the literal 0 can be
+// treated as a null pointer by the compiler, we need to make sure
+// that ASSERT_EQ(0, non_pointer) isn't interpreted by Google Test as
+// ASSERT_EQ(static_cast<void*>(NULL), non_pointer).
+TEST(ExpectTest, ASSERT_EQ_0) {
+  int n = 0;
+
+  // A success.
+  ASSERT_EQ(0, n);
+
+  // A failure.
+  EXPECT_FATAL_FAILURE(ASSERT_EQ(0, 5.6),
+                       "Expected: 0");
+}
+
+// Tests ASSERT_NE.
+TEST(AssertionTest, ASSERT_NE) {
+  ASSERT_NE(6, 7);
+  EXPECT_FATAL_FAILURE(ASSERT_NE('a', 'a'),
+                       "Expected: ('a') != ('a'), "
+                       "actual: 'a' (97, 0x61) vs 'a' (97, 0x61)");
+}
+
+// Tests ASSERT_LE.
+TEST(AssertionTest, ASSERT_LE) {
+  ASSERT_LE(2, 3);
+  ASSERT_LE(2, 2);
+  EXPECT_FATAL_FAILURE(ASSERT_LE(2, 0),
+                       "Expected: (2) <= (0), actual: 2 vs 0");
+}
+
+// Tests ASSERT_LT.
+TEST(AssertionTest, ASSERT_LT) {
+  ASSERT_LT(2, 3);
+  EXPECT_FATAL_FAILURE(ASSERT_LT(2, 2),
+                       "Expected: (2) < (2), actual: 2 vs 2");
+}
+
+// Tests ASSERT_GE.
+TEST(AssertionTest, ASSERT_GE) {
+  ASSERT_GE(2, 1);
+  ASSERT_GE(2, 2);
+  EXPECT_FATAL_FAILURE(ASSERT_GE(2, 3),
+                       "Expected: (2) >= (3), actual: 2 vs 3");
+}
+
+// Tests ASSERT_GT.
+TEST(AssertionTest, ASSERT_GT) {
+  ASSERT_GT(2, 1);
+  EXPECT_FATAL_FAILURE(ASSERT_GT(2, 2),
+                       "Expected: (2) > (2), actual: 2 vs 2");
+}
+
+#if GTEST_HAS_EXCEPTIONS
+
+void ThrowNothing() {}
+
+// Tests ASSERT_THROW.
+TEST(AssertionTest, ASSERT_THROW) {
+  ASSERT_THROW(ThrowAnInteger(), int);
+
+# ifndef __BORLANDC__
+
+  // ICE's in C++Builder 2007 and 2009.
+  EXPECT_FATAL_FAILURE(
+      ASSERT_THROW(ThrowAnInteger(), bool),
+      "Expected: ThrowAnInteger() throws an exception of type bool.\n"
+      "  Actual: it throws a different type.");
+# endif
+
+  EXPECT_FATAL_FAILURE(
+      ASSERT_THROW(ThrowNothing(), bool),
+      "Expected: ThrowNothing() throws an exception of type bool.\n"
+      "  Actual: it throws nothing.");
+}
+
+// Tests ASSERT_NO_THROW.
+TEST(AssertionTest, ASSERT_NO_THROW) {
+  ASSERT_NO_THROW(ThrowNothing());
+  EXPECT_FATAL_FAILURE(ASSERT_NO_THROW(ThrowAnInteger()),
+                       "Expected: ThrowAnInteger() doesn't throw an exception."
+                       "\n  Actual: it throws.");
+}
+
+// Tests ASSERT_ANY_THROW.
+TEST(AssertionTest, ASSERT_ANY_THROW) {
+  ASSERT_ANY_THROW(ThrowAnInteger());
+  EXPECT_FATAL_FAILURE(
+      ASSERT_ANY_THROW(ThrowNothing()),
+      "Expected: ThrowNothing() throws an exception.\n"
+      "  Actual: it doesn't.");
+}
+
+#endif  // GTEST_HAS_EXCEPTIONS
+
+// Makes sure we deal with the precedence of <<.  This test should
+// compile.
+TEST(AssertionTest, AssertPrecedence) {
+  ASSERT_EQ(1 < 2, true);
+  bool false_value = false;
+  ASSERT_EQ(true && false_value, false);
+}
+
+// A subroutine used by the following test.
+void TestEq1(int x) {
+  ASSERT_EQ(1, x);
+}
+
+// Tests calling a test subroutine that's not part of a fixture.
+TEST(AssertionTest, NonFixtureSubroutine) {
+  EXPECT_FATAL_FAILURE(TestEq1(2),
+                       "Value of: x");
+}
+
+// An uncopyable class.
+class Uncopyable {
+ public:
+  explicit Uncopyable(int a_value) : value_(a_value) {}
+
+  int value() const { return value_; }
+  bool operator==(const Uncopyable& rhs) const {
+    return value() == rhs.value();
+  }
+ private:
+  // This constructor deliberately has no implementation, as we don't
+  // want this class to be copyable.
+  Uncopyable(const Uncopyable&);  // NOLINT
+
+  int value_;
+};
+
+::std::ostream& operator<<(::std::ostream& os, const Uncopyable& value) {
+  return os << value.value();
+}
+
+
+bool IsPositiveUncopyable(const Uncopyable& x) {
+  return x.value() > 0;
+}
+
+// A subroutine used by the following test.
+void TestAssertNonPositive() {
+  Uncopyable y(-1);
+  ASSERT_PRED1(IsPositiveUncopyable, y);
+}
+// A subroutine used by the following test.
+void TestAssertEqualsUncopyable() {
+  Uncopyable x(5);
+  Uncopyable y(-1);
+  ASSERT_EQ(x, y);
+}
+
+// Tests that uncopyable objects can be used in assertions.
+TEST(AssertionTest, AssertWorksWithUncopyableObject) {
+  Uncopyable x(5);
+  ASSERT_PRED1(IsPositiveUncopyable, x);
+  ASSERT_EQ(x, x);
+  EXPECT_FATAL_FAILURE(TestAssertNonPositive(),
+    "IsPositiveUncopyable(y) evaluates to false, where\ny evaluates to -1");
+  EXPECT_FATAL_FAILURE(TestAssertEqualsUncopyable(),
+    "Value of: y\n  Actual: -1\nExpected: x\nWhich is: 5");
+}
+
+// Tests that uncopyable objects can be used in expects.
+TEST(AssertionTest, ExpectWorksWithUncopyableObject) {
+  Uncopyable x(5);
+  EXPECT_PRED1(IsPositiveUncopyable, x);
+  Uncopyable y(-1);
+  EXPECT_NONFATAL_FAILURE(EXPECT_PRED1(IsPositiveUncopyable, y),
+    "IsPositiveUncopyable(y) evaluates to false, where\ny evaluates to -1");
+  EXPECT_EQ(x, x);
+  EXPECT_NONFATAL_FAILURE(EXPECT_EQ(x, y),
+    "Value of: y\n  Actual: -1\nExpected: x\nWhich is: 5");
+}
+
+enum NamedEnum {
+  kE1 = 0,
+  kE2 = 1
+};
+
+TEST(AssertionTest, NamedEnum) {
+  EXPECT_EQ(kE1, kE1);
+  EXPECT_LT(kE1, kE2);
+  EXPECT_NONFATAL_FAILURE(EXPECT_EQ(kE1, kE2), "Which is: 0");
+  EXPECT_NONFATAL_FAILURE(EXPECT_EQ(kE1, kE2), "Actual: 1");
+}
+
+// The version of gcc used in XCode 2.2 has a bug and doesn't allow
+// anonymous enums in assertions.  Therefore the following test is not
+// done on Mac.
+// Sun Studio and HP aCC also reject this code.
+#if !GTEST_OS_MAC && !defined(__SUNPRO_CC) && !defined(__HP_aCC)
+
+// Tests using assertions with anonymous enums.
+enum {
+  kCaseA = -1,
+
+# if GTEST_OS_LINUX
+
+  // We want to test the case where the size of the anonymous enum is
+  // larger than sizeof(int), to make sure our implementation of the
+  // assertions doesn't truncate the enums.  However, MSVC
+  // (incorrectly) doesn't allow an enum value to exceed the range of
+  // an int, so this has to be conditionally compiled.
+  //
+  // On Linux, kCaseB and kCaseA have the same value when truncated to
+  // int size.  We want to test whether this will confuse the
+  // assertions.
+  kCaseB = testing::internal::kMaxBiggestInt,
+
+# else
+
+  kCaseB = INT_MAX,
+
+# endif  // GTEST_OS_LINUX
+
+  kCaseC = 42
+};
+
+TEST(AssertionTest, AnonymousEnum) {
+# if GTEST_OS_LINUX
+
+  EXPECT_EQ(static_cast<int>(kCaseA), static_cast<int>(kCaseB));
+
+# endif  // GTEST_OS_LINUX
+
+  EXPECT_EQ(kCaseA, kCaseA);
+  EXPECT_NE(kCaseA, kCaseB);
+  EXPECT_LT(kCaseA, kCaseB);
+  EXPECT_LE(kCaseA, kCaseB);
+  EXPECT_GT(kCaseB, kCaseA);
+  EXPECT_GE(kCaseA, kCaseA);
+  EXPECT_NONFATAL_FAILURE(EXPECT_GE(kCaseA, kCaseB),
+                          "(kCaseA) >= (kCaseB)");
+  EXPECT_NONFATAL_FAILURE(EXPECT_GE(kCaseA, kCaseC),
+                          "-1 vs 42");
+
+  ASSERT_EQ(kCaseA, kCaseA);
+  ASSERT_NE(kCaseA, kCaseB);
+  ASSERT_LT(kCaseA, kCaseB);
+  ASSERT_LE(kCaseA, kCaseB);
+  ASSERT_GT(kCaseB, kCaseA);
+  ASSERT_GE(kCaseA, kCaseA);
+
+# ifndef __BORLANDC__
+
+  // ICE's in C++Builder.
+  EXPECT_FATAL_FAILURE(ASSERT_EQ(kCaseA, kCaseB),
+                       "Value of: kCaseB");
+  EXPECT_FATAL_FAILURE(ASSERT_EQ(kCaseA, kCaseC),
+                       "Actual: 42");
+# endif
+
+  EXPECT_FATAL_FAILURE(ASSERT_EQ(kCaseA, kCaseC),
+                       "Which is: -1");
+}
+
+#endif  // !GTEST_OS_MAC && !defined(__SUNPRO_CC)
+
+#if GTEST_OS_WINDOWS
+
+static HRESULT UnexpectedHRESULTFailure() {
+  return E_UNEXPECTED;
+}
+
+static HRESULT OkHRESULTSuccess() {
+  return S_OK;
+}
+
+static HRESULT FalseHRESULTSuccess() {
+  return S_FALSE;
+}
+
+// HRESULT assertion tests test both zero and non-zero
+// success codes as well as failure message for each.
+//
+// Windows CE doesn't support message texts.
+TEST(HRESULTAssertionTest, EXPECT_HRESULT_SUCCEEDED) {
+  EXPECT_HRESULT_SUCCEEDED(S_OK);
+  EXPECT_HRESULT_SUCCEEDED(S_FALSE);
+
+  EXPECT_NONFATAL_FAILURE(EXPECT_HRESULT_SUCCEEDED(UnexpectedHRESULTFailure()),
+    "Expected: (UnexpectedHRESULTFailure()) succeeds.\n"
+    "  Actual: 0x8000FFFF");
+}
+
+TEST(HRESULTAssertionTest, ASSERT_HRESULT_SUCCEEDED) {
+  ASSERT_HRESULT_SUCCEEDED(S_OK);
+  ASSERT_HRESULT_SUCCEEDED(S_FALSE);
+
+  EXPECT_FATAL_FAILURE(ASSERT_HRESULT_SUCCEEDED(UnexpectedHRESULTFailure()),
+    "Expected: (UnexpectedHRESULTFailure()) succeeds.\n"
+    "  Actual: 0x8000FFFF");
+}
+
+TEST(HRESULTAssertionTest, EXPECT_HRESULT_FAILED) {
+  EXPECT_HRESULT_FAILED(E_UNEXPECTED);
+
+  EXPECT_NONFATAL_FAILURE(EXPECT_HRESULT_FAILED(OkHRESULTSuccess()),
+    "Expected: (OkHRESULTSuccess()) fails.\n"
+    "  Actual: 0x0");
+  EXPECT_NONFATAL_FAILURE(EXPECT_HRESULT_FAILED(FalseHRESULTSuccess()),
+    "Expected: (FalseHRESULTSuccess()) fails.\n"
+    "  Actual: 0x1");
+}
+
+TEST(HRESULTAssertionTest, ASSERT_HRESULT_FAILED) {
+  ASSERT_HRESULT_FAILED(E_UNEXPECTED);
+
+# ifndef __BORLANDC__
+
+  // ICE's in C++Builder 2007 and 2009.
+  EXPECT_FATAL_FAILURE(ASSERT_HRESULT_FAILED(OkHRESULTSuccess()),
+    "Expected: (OkHRESULTSuccess()) fails.\n"
+    "  Actual: 0x0");
+# endif
+
+  EXPECT_FATAL_FAILURE(ASSERT_HRESULT_FAILED(FalseHRESULTSuccess()),
+    "Expected: (FalseHRESULTSuccess()) fails.\n"
+    "  Actual: 0x1");
+}
+
+// Tests that streaming to the HRESULT macros works.
+TEST(HRESULTAssertionTest, Streaming) {
+  EXPECT_HRESULT_SUCCEEDED(S_OK) << "unexpected failure";
+  ASSERT_HRESULT_SUCCEEDED(S_OK) << "unexpected failure";
+  EXPECT_HRESULT_FAILED(E_UNEXPECTED) << "unexpected failure";
+  ASSERT_HRESULT_FAILED(E_UNEXPECTED) << "unexpected failure";
+
+  EXPECT_NONFATAL_FAILURE(
+      EXPECT_HRESULT_SUCCEEDED(E_UNEXPECTED) << "expected failure",
+      "expected failure");
+
+# ifndef __BORLANDC__
+
+  // ICE's in C++Builder 2007 and 2009.
+  EXPECT_FATAL_FAILURE(
+      ASSERT_HRESULT_SUCCEEDED(E_UNEXPECTED) << "expected failure",
+      "expected failure");
+# endif
+
+  EXPECT_NONFATAL_FAILURE(
+      EXPECT_HRESULT_FAILED(S_OK) << "expected failure",
+      "expected failure");
+
+  EXPECT_FATAL_FAILURE(
+      ASSERT_HRESULT_FAILED(S_OK) << "expected failure",
+      "expected failure");
+}
+
+#endif  // GTEST_OS_WINDOWS
+
+#ifdef __BORLANDC__
+// Silences warnings: "Condition is always true", "Unreachable code"
+# pragma option push -w-ccc -w-rch
+#endif
+
+// Tests that the assertion macros behave like single statements.
+TEST(AssertionSyntaxTest, BasicAssertionsBehavesLikeSingleStatement) {
+  if (AlwaysFalse())
+    ASSERT_TRUE(false) << "This should never be executed; "
+                          "It's a compilation test only.";
+
+  if (AlwaysTrue())
+    EXPECT_FALSE(false);
+  else
+    ;  // NOLINT
+
+  if (AlwaysFalse())
+    ASSERT_LT(1, 3);
+
+  if (AlwaysFalse())
+    ;  // NOLINT
+  else
+    EXPECT_GT(3, 2) << "";
+}
+
+#if GTEST_HAS_EXCEPTIONS
+// Tests that the compiler will not complain about unreachable code in the
+// EXPECT_THROW/EXPECT_ANY_THROW/EXPECT_NO_THROW macros.
+TEST(ExpectThrowTest, DoesNotGenerateUnreachableCodeWarning) {
+  int n = 0;
+
+  EXPECT_THROW(throw 1, int);
+  EXPECT_NONFATAL_FAILURE(EXPECT_THROW(n++, int), "");
+  EXPECT_NONFATAL_FAILURE(EXPECT_THROW(throw 1, const char*), "");
+  EXPECT_NO_THROW(n++);
+  EXPECT_NONFATAL_FAILURE(EXPECT_NO_THROW(throw 1), "");
+  EXPECT_ANY_THROW(throw 1);
+  EXPECT_NONFATAL_FAILURE(EXPECT_ANY_THROW(n++), "");
+}
+
+TEST(AssertionSyntaxTest, ExceptionAssertionsBehavesLikeSingleStatement) {
+  if (AlwaysFalse())
+    EXPECT_THROW(ThrowNothing(), bool);
+
+  if (AlwaysTrue())
+    EXPECT_THROW(ThrowAnInteger(), int);
+  else
+    ;  // NOLINT
+
+  if (AlwaysFalse())
+    EXPECT_NO_THROW(ThrowAnInteger());
+
+  if (AlwaysTrue())
+    EXPECT_NO_THROW(ThrowNothing());
+  else
+    ;  // NOLINT
+
+  if (AlwaysFalse())
+    EXPECT_ANY_THROW(ThrowNothing());
+
+  if (AlwaysTrue())
+    EXPECT_ANY_THROW(ThrowAnInteger());
+  else
+    ;  // NOLINT
+}
+#endif  // GTEST_HAS_EXCEPTIONS
+
+TEST(AssertionSyntaxTest, NoFatalFailureAssertionsBehavesLikeSingleStatement) {
+  if (AlwaysFalse())
+    EXPECT_NO_FATAL_FAILURE(FAIL()) << "This should never be executed. "
+                                    << "It's a compilation test only.";
+  else
+    ;  // NOLINT
+
+  if (AlwaysFalse())
+    ASSERT_NO_FATAL_FAILURE(FAIL()) << "";
+  else
+    ;  // NOLINT
+
+  if (AlwaysTrue())
+    EXPECT_NO_FATAL_FAILURE(SUCCEED());
+  else
+    ;  // NOLINT
+
+  if (AlwaysFalse())
+    ;  // NOLINT
+  else
+    ASSERT_NO_FATAL_FAILURE(SUCCEED());
+}
+
+// Tests that the assertion macros work well with switch statements.
+TEST(AssertionSyntaxTest, WorksWithSwitch) {
+  switch (0) {
+    case 1:
+      break;
+    default:
+      ASSERT_TRUE(true);
+  }
+
+  switch (0)
+    case 0:
+      EXPECT_FALSE(false) << "EXPECT_FALSE failed in switch case";
+
+  // Binary assertions are implemented using a different code path
+  // than the Boolean assertions.  Hence we test them separately.
+  switch (0) {
+    case 1:
+    default:
+      ASSERT_EQ(1, 1) << "ASSERT_EQ failed in default switch handler";
+  }
+
+  switch (0)
+    case 0:
+      EXPECT_NE(1, 2);
+}
+
+#if GTEST_HAS_EXCEPTIONS
+
+void ThrowAString() {
+    throw "std::string";
+}
+
+// Test that the exception assertion macros compile and work with const
+// type qualifier.
+TEST(AssertionSyntaxTest, WorksWithConst) {
+    ASSERT_THROW(ThrowAString(), const char*);
+
+    EXPECT_THROW(ThrowAString(), const char*);
+}
+
+#endif  // GTEST_HAS_EXCEPTIONS
+
+}  // namespace
+
+namespace testing {
+
+// Tests that Google Test tracks SUCCEED*.
+TEST(SuccessfulAssertionTest, SUCCEED) {
+  SUCCEED();
+  SUCCEED() << "OK";
+  EXPECT_EQ(2, GetUnitTestImpl()->current_test_result()->total_part_count());
+}
+
+// Tests that Google Test doesn't track successful EXPECT_*.
+TEST(SuccessfulAssertionTest, EXPECT) {
+  EXPECT_TRUE(true);
+  EXPECT_EQ(0, GetUnitTestImpl()->current_test_result()->total_part_count());
+}
+
+// Tests that Google Test doesn't track successful EXPECT_STR*.
+TEST(SuccessfulAssertionTest, EXPECT_STR) {
+  EXPECT_STREQ("", "");
+  EXPECT_EQ(0, GetUnitTestImpl()->current_test_result()->total_part_count());
+}
+
+// Tests that Google Test doesn't track successful ASSERT_*.
+TEST(SuccessfulAssertionTest, ASSERT) {
+  ASSERT_TRUE(true);
+  EXPECT_EQ(0, GetUnitTestImpl()->current_test_result()->total_part_count());
+}
+
+// Tests that Google Test doesn't track successful ASSERT_STR*.
+TEST(SuccessfulAssertionTest, ASSERT_STR) {
+  ASSERT_STREQ("", "");
+  EXPECT_EQ(0, GetUnitTestImpl()->current_test_result()->total_part_count());
+}
+
+}  // namespace testing
+
+namespace {
+
+// Tests the message streaming variation of assertions.
+
+TEST(AssertionWithMessageTest, EXPECT) {
+  EXPECT_EQ(1, 1) << "This should succeed.";
+  EXPECT_NONFATAL_FAILURE(EXPECT_NE(1, 1) << "Expected failure #1.",
+                          "Expected failure #1");
+  EXPECT_LE(1, 2) << "This should succeed.";
+  EXPECT_NONFATAL_FAILURE(EXPECT_LT(1, 0) << "Expected failure #2.",
+                          "Expected failure #2.");
+  EXPECT_GE(1, 0) << "This should succeed.";
+  EXPECT_NONFATAL_FAILURE(EXPECT_GT(1, 2) << "Expected failure #3.",
+                          "Expected failure #3.");
+
+  EXPECT_STREQ("1", "1") << "This should succeed.";
+  EXPECT_NONFATAL_FAILURE(EXPECT_STRNE("1", "1") << "Expected failure #4.",
+                          "Expected failure #4.");
+  EXPECT_STRCASEEQ("a", "A") << "This should succeed.";
+  EXPECT_NONFATAL_FAILURE(EXPECT_STRCASENE("a", "A") << "Expected failure #5.",
+                          "Expected failure #5.");
+
+  EXPECT_FLOAT_EQ(1, 1) << "This should succeed.";
+  EXPECT_NONFATAL_FAILURE(EXPECT_DOUBLE_EQ(1, 1.2) << "Expected failure #6.",
+                          "Expected failure #6.");
+  EXPECT_NEAR(1, 1.1, 0.2) << "This should succeed.";
+}
+
+TEST(AssertionWithMessageTest, ASSERT) {
+  ASSERT_EQ(1, 1) << "This should succeed.";
+  ASSERT_NE(1, 2) << "This should succeed.";
+  ASSERT_LE(1, 2) << "This should succeed.";
+  ASSERT_LT(1, 2) << "This should succeed.";
+  ASSERT_GE(1, 0) << "This should succeed.";
+  EXPECT_FATAL_FAILURE(ASSERT_GT(1, 2) << "Expected failure.",
+                       "Expected failure.");
+}
+
+TEST(AssertionWithMessageTest, ASSERT_STR) {
+  ASSERT_STREQ("1", "1") << "This should succeed.";
+  ASSERT_STRNE("1", "2") << "This should succeed.";
+  ASSERT_STRCASEEQ("a", "A") << "This should succeed.";
+  EXPECT_FATAL_FAILURE(ASSERT_STRCASENE("a", "A") << "Expected failure.",
+                       "Expected failure.");
+}
+
+TEST(AssertionWithMessageTest, ASSERT_FLOATING) {
+  ASSERT_FLOAT_EQ(1, 1) << "This should succeed.";
+  ASSERT_DOUBLE_EQ(1, 1) << "This should succeed.";
+  EXPECT_FATAL_FAILURE(ASSERT_NEAR(1,1.2, 0.1) << "Expect failure.",  // NOLINT
+                       "Expect failure.");
+  // To work around a bug in gcc 2.95.0, there is intentionally no
+  // space after the first comma in the previous statement.
+}
+
+// Tests using ASSERT_FALSE with a streamed message.
+TEST(AssertionWithMessageTest, ASSERT_FALSE) {
+  ASSERT_FALSE(false) << "This shouldn't fail.";
+  EXPECT_FATAL_FAILURE({  // NOLINT
+    ASSERT_FALSE(true) << "Expected failure: " << 2 << " > " << 1
+                       << " evaluates to " << true;
+  }, "Expected failure");
+}
+
+// Tests using FAIL with a streamed message.
+TEST(AssertionWithMessageTest, FAIL) {
+  EXPECT_FATAL_FAILURE(FAIL() << 0,
+                       "0");
+}
+
+// Tests using SUCCEED with a streamed message.
+TEST(AssertionWithMessageTest, SUCCEED) {
+  SUCCEED() << "Success == " << 1;
+}
+
+// Tests using ASSERT_TRUE with a streamed message.
+TEST(AssertionWithMessageTest, ASSERT_TRUE) {
+  ASSERT_TRUE(true) << "This should succeed.";
+  ASSERT_TRUE(true) << true;
+  EXPECT_FATAL_FAILURE({  // NOLINT
+    ASSERT_TRUE(false) << static_cast<const char *>(NULL)
+                       << static_cast<char *>(NULL);
+  }, "(null)(null)");
+}
+
+#if GTEST_OS_WINDOWS
+// Tests using wide strings in assertion messages.
+TEST(AssertionWithMessageTest, WideStringMessage) {
+  EXPECT_NONFATAL_FAILURE({  // NOLINT
+    EXPECT_TRUE(false) << L"This failure is expected.\x8119";
+  }, "This failure is expected.");
+  EXPECT_FATAL_FAILURE({  // NOLINT
+    ASSERT_EQ(1, 2) << "This failure is "
+                    << L"expected too.\x8120";
+  }, "This failure is expected too.");
+}
+#endif  // GTEST_OS_WINDOWS
+
+// Tests EXPECT_TRUE.
+TEST(ExpectTest, EXPECT_TRUE) {
+  EXPECT_TRUE(true) << "Intentional success";
+  EXPECT_NONFATAL_FAILURE(EXPECT_TRUE(false) << "Intentional failure #1.",
+                          "Intentional failure #1.");
+  EXPECT_NONFATAL_FAILURE(EXPECT_TRUE(false) << "Intentional failure #2.",
+                          "Intentional failure #2.");
+  EXPECT_TRUE(2 > 1);  // NOLINT
+  EXPECT_NONFATAL_FAILURE(EXPECT_TRUE(2 < 1),
+                          "Value of: 2 < 1\n"
+                          "  Actual: false\n"
+                          "Expected: true");
+  EXPECT_NONFATAL_FAILURE(EXPECT_TRUE(2 > 3),
+                          "2 > 3");
+}
+
+// Tests EXPECT_TRUE(predicate) for predicates returning AssertionResult.
+TEST(ExpectTest, ExpectTrueWithAssertionResult) {
+  EXPECT_TRUE(ResultIsEven(2));
+  EXPECT_NONFATAL_FAILURE(EXPECT_TRUE(ResultIsEven(3)),
+                          "Value of: ResultIsEven(3)\n"
+                          "  Actual: false (3 is odd)\n"
+                          "Expected: true");
+  EXPECT_TRUE(ResultIsEvenNoExplanation(2));
+  EXPECT_NONFATAL_FAILURE(EXPECT_TRUE(ResultIsEvenNoExplanation(3)),
+                          "Value of: ResultIsEvenNoExplanation(3)\n"
+                          "  Actual: false (3 is odd)\n"
+                          "Expected: true");
+}
+
+// Tests EXPECT_FALSE with a streamed message.
+TEST(ExpectTest, EXPECT_FALSE) {
+  EXPECT_FALSE(2 < 1);  // NOLINT
+  EXPECT_FALSE(false) << "Intentional success";
+  EXPECT_NONFATAL_FAILURE(EXPECT_FALSE(true) << "Intentional failure #1.",
+                          "Intentional failure #1.");
+  EXPECT_NONFATAL_FAILURE(EXPECT_FALSE(true) << "Intentional failure #2.",
+                          "Intentional failure #2.");
+  EXPECT_NONFATAL_FAILURE(EXPECT_FALSE(2 > 1),
+                          "Value of: 2 > 1\n"
+                          "  Actual: true\n"
+                          "Expected: false");
+  EXPECT_NONFATAL_FAILURE(EXPECT_FALSE(2 < 3),
+                          "2 < 3");
+}
+
+// Tests EXPECT_FALSE(predicate) for predicates returning AssertionResult.
+TEST(ExpectTest, ExpectFalseWithAssertionResult) {
+  EXPECT_FALSE(ResultIsEven(3));
+  EXPECT_NONFATAL_FAILURE(EXPECT_FALSE(ResultIsEven(2)),
+                          "Value of: ResultIsEven(2)\n"
+                          "  Actual: true (2 is even)\n"
+                          "Expected: false");
+  EXPECT_FALSE(ResultIsEvenNoExplanation(3));
+  EXPECT_NONFATAL_FAILURE(EXPECT_FALSE(ResultIsEvenNoExplanation(2)),
+                          "Value of: ResultIsEvenNoExplanation(2)\n"
+                          "  Actual: true\n"
+                          "Expected: false");
+}
+
+#ifdef __BORLANDC__
+// Restores warnings after previous "#pragma option push" supressed them
+# pragma option pop
+#endif
+
+// Tests EXPECT_EQ.
+TEST(ExpectTest, EXPECT_EQ) {
+  EXPECT_EQ(5, 2 + 3);
+  EXPECT_NONFATAL_FAILURE(EXPECT_EQ(5, 2*3),
+                          "Value of: 2*3\n"
+                          "  Actual: 6\n"
+                          "Expected: 5");
+  EXPECT_NONFATAL_FAILURE(EXPECT_EQ(5, 2 - 3),
+                          "2 - 3");
+}
+
+// Tests using EXPECT_EQ on double values.  The purpose is to make
+// sure that the specialization we did for integer and anonymous enums
+// isn't used for double arguments.
+TEST(ExpectTest, EXPECT_EQ_Double) {
+  // A success.
+  EXPECT_EQ(5.6, 5.6);
+
+  // A failure.
+  EXPECT_NONFATAL_FAILURE(EXPECT_EQ(5.1, 5.2),
+                          "5.1");
+}
+
+#if GTEST_CAN_COMPARE_NULL
+// Tests EXPECT_EQ(NULL, pointer).
+TEST(ExpectTest, EXPECT_EQ_NULL) {
+  // A success.
+  const char* p = NULL;
+  // Some older GCC versions may issue a spurious warning in this or the next
+  // assertion statement. This warning should not be suppressed with
+  // static_cast since the test verifies the ability to use bare NULL as the
+  // expected parameter to the macro.
+  EXPECT_EQ(NULL, p);
+
+  // A failure.
+  int n = 0;
+  EXPECT_NONFATAL_FAILURE(EXPECT_EQ(NULL, &n),
+                          "Value of: &n\n");
+}
+#endif  // GTEST_CAN_COMPARE_NULL
+
+// Tests EXPECT_EQ(0, non_pointer).  Since the literal 0 can be
+// treated as a null pointer by the compiler, we need to make sure
+// that EXPECT_EQ(0, non_pointer) isn't interpreted by Google Test as
+// EXPECT_EQ(static_cast<void*>(NULL), non_pointer).
+TEST(ExpectTest, EXPECT_EQ_0) {
+  int n = 0;
+
+  // A success.
+  EXPECT_EQ(0, n);
+
+  // A failure.
+  EXPECT_NONFATAL_FAILURE(EXPECT_EQ(0, 5.6),
+                          "Expected: 0");
+}
+
+// Tests EXPECT_NE.
+TEST(ExpectTest, EXPECT_NE) {
+  EXPECT_NE(6, 7);
+
+  EXPECT_NONFATAL_FAILURE(EXPECT_NE('a', 'a'),
+                          "Expected: ('a') != ('a'), "
+                          "actual: 'a' (97, 0x61) vs 'a' (97, 0x61)");
+  EXPECT_NONFATAL_FAILURE(EXPECT_NE(2, 2),
+                          "2");
+  char* const p0 = NULL;
+  EXPECT_NONFATAL_FAILURE(EXPECT_NE(p0, p0),
+                          "p0");
+  // Only way to get the Nokia compiler to compile the cast
+  // is to have a separate void* variable first. Putting
+  // the two casts on the same line doesn't work, neither does
+  // a direct C-style to char*.
+  void* pv1 = (void*)0x1234;  // NOLINT
+  char* const p1 = reinterpret_cast<char*>(pv1);
+  EXPECT_NONFATAL_FAILURE(EXPECT_NE(p1, p1),
+                          "p1");
+}
+
+// Tests EXPECT_LE.
+TEST(ExpectTest, EXPECT_LE) {
+  EXPECT_LE(2, 3);
+  EXPECT_LE(2, 2);
+  EXPECT_NONFATAL_FAILURE(EXPECT_LE(2, 0),
+                          "Expected: (2) <= (0), actual: 2 vs 0");
+  EXPECT_NONFATAL_FAILURE(EXPECT_LE(1.1, 0.9),
+                          "(1.1) <= (0.9)");
+}
+
+// Tests EXPECT_LT.
+TEST(ExpectTest, EXPECT_LT) {
+  EXPECT_LT(2, 3);
+  EXPECT_NONFATAL_FAILURE(EXPECT_LT(2, 2),
+                          "Expected: (2) < (2), actual: 2 vs 2");
+  EXPECT_NONFATAL_FAILURE(EXPECT_LT(2, 1),
+                          "(2) < (1)");
+}
+
+// Tests EXPECT_GE.
+TEST(ExpectTest, EXPECT_GE) {
+  EXPECT_GE(2, 1);
+  EXPECT_GE(2, 2);
+  EXPECT_NONFATAL_FAILURE(EXPECT_GE(2, 3),
+                          "Expected: (2) >= (3), actual: 2 vs 3");
+  EXPECT_NONFATAL_FAILURE(EXPECT_GE(0.9, 1.1),
+                          "(0.9) >= (1.1)");
+}
+
+// Tests EXPECT_GT.
+TEST(ExpectTest, EXPECT_GT) {
+  EXPECT_GT(2, 1);
+  EXPECT_NONFATAL_FAILURE(EXPECT_GT(2, 2),
+                          "Expected: (2) > (2), actual: 2 vs 2");
+  EXPECT_NONFATAL_FAILURE(EXPECT_GT(2, 3),
+                          "(2) > (3)");
+}
+
+#if GTEST_HAS_EXCEPTIONS
+
+// Tests EXPECT_THROW.
+TEST(ExpectTest, EXPECT_THROW) {
+  EXPECT_THROW(ThrowAnInteger(), int);
+  EXPECT_NONFATAL_FAILURE(EXPECT_THROW(ThrowAnInteger(), bool),
+                          "Expected: ThrowAnInteger() throws an exception of "
+                          "type bool.\n  Actual: it throws a different type.");
+  EXPECT_NONFATAL_FAILURE(
+      EXPECT_THROW(ThrowNothing(), bool),
+      "Expected: ThrowNothing() throws an exception of type bool.\n"
+      "  Actual: it throws nothing.");
+}
+
+// Tests EXPECT_NO_THROW.
+TEST(ExpectTest, EXPECT_NO_THROW) {
+  EXPECT_NO_THROW(ThrowNothing());
+  EXPECT_NONFATAL_FAILURE(EXPECT_NO_THROW(ThrowAnInteger()),
+                          "Expected: ThrowAnInteger() doesn't throw an "
+                          "exception.\n  Actual: it throws.");
+}
+
+// Tests EXPECT_ANY_THROW.
+TEST(ExpectTest, EXPECT_ANY_THROW) {
+  EXPECT_ANY_THROW(ThrowAnInteger());
+  EXPECT_NONFATAL_FAILURE(
+      EXPECT_ANY_THROW(ThrowNothing()),
+      "Expected: ThrowNothing() throws an exception.\n"
+      "  Actual: it doesn't.");
+}
+
+#endif  // GTEST_HAS_EXCEPTIONS
+
+// Make sure we deal with the precedence of <<.
+TEST(ExpectTest, ExpectPrecedence) {
+  EXPECT_EQ(1 < 2, true);
+  EXPECT_NONFATAL_FAILURE(EXPECT_EQ(true, true && false),
+                          "Value of: true && false");
+}
+
+
+// Tests the StreamableToString() function.
+
+// Tests using StreamableToString() on a scalar.
+TEST(StreamableToStringTest, Scalar) {
+  EXPECT_STREQ("5", StreamableToString(5).c_str());
+}
+
+// Tests using StreamableToString() on a non-char pointer.
+TEST(StreamableToStringTest, Pointer) {
+  int n = 0;
+  int* p = &n;
+  EXPECT_STRNE("(null)", StreamableToString(p).c_str());
+}
+
+// Tests using StreamableToString() on a NULL non-char pointer.
+TEST(StreamableToStringTest, NullPointer) {
+  int* p = NULL;
+  EXPECT_STREQ("(null)", StreamableToString(p).c_str());
+}
+
+// Tests using StreamableToString() on a C string.
+TEST(StreamableToStringTest, CString) {
+  EXPECT_STREQ("Foo", StreamableToString("Foo").c_str());
+}
+
+// Tests using StreamableToString() on a NULL C string.
+TEST(StreamableToStringTest, NullCString) {
+  char* p = NULL;
+  EXPECT_STREQ("(null)", StreamableToString(p).c_str());
+}
+
+// Tests using streamable values as assertion messages.
+
+// Tests using std::string as an assertion message.
+TEST(StreamableTest, string) {
+  static const std::string str(
+      "This failure message is a std::string, and is expected.");
+  EXPECT_FATAL_FAILURE(FAIL() << str,
+                       str.c_str());
+}
+
+// Tests that we can output strings containing embedded NULs.
+// Limited to Linux because we can only do this with std::string's.
+TEST(StreamableTest, stringWithEmbeddedNUL) {
+  static const char char_array_with_nul[] =
+      "Here's a NUL\0 and some more string";
+  static const std::string string_with_nul(char_array_with_nul,
+                                           sizeof(char_array_with_nul)
+                                           - 1);  // drops the trailing NUL
+  EXPECT_FATAL_FAILURE(FAIL() << string_with_nul,
+                       "Here's a NUL\\0 and some more string");
+}
+
+// Tests that we can output a NUL char.
+TEST(StreamableTest, NULChar) {
+  EXPECT_FATAL_FAILURE({  // NOLINT
+    FAIL() << "A NUL" << '\0' << " and some more string";
+  }, "A NUL\\0 and some more string");
+}
+
+// Tests using int as an assertion message.
+TEST(StreamableTest, int) {
+  EXPECT_FATAL_FAILURE(FAIL() << 900913,
+                       "900913");
+}
+
+// Tests using NULL char pointer as an assertion message.
+//
+// In MSVC, streaming a NULL char * causes access violation.  Google Test
+// implemented a workaround (substituting "(null)" for NULL).  This
+// tests whether the workaround works.
+TEST(StreamableTest, NullCharPtr) {
+  EXPECT_FATAL_FAILURE(FAIL() << static_cast<const char*>(NULL),
+                       "(null)");
+}
+
+// Tests that basic IO manipulators (endl, ends, and flush) can be
+// streamed to testing::Message.
+TEST(StreamableTest, BasicIoManip) {
+  EXPECT_FATAL_FAILURE({  // NOLINT
+    FAIL() << "Line 1." << std::endl
+           << "A NUL char " << std::ends << std::flush << " in line 2.";
+  }, "Line 1.\nA NUL char \\0 in line 2.");
+}
+
+// Tests the macros that haven't been covered so far.
+
+void AddFailureHelper(bool* aborted) {
+  *aborted = true;
+  ADD_FAILURE() << "Intentional failure.";
+  *aborted = false;
+}
+
+// Tests ADD_FAILURE.
+TEST(MacroTest, ADD_FAILURE) {
+  bool aborted = true;
+  EXPECT_NONFATAL_FAILURE(AddFailureHelper(&aborted),
+                          "Intentional failure.");
+  EXPECT_FALSE(aborted);
+}
+
+// Tests ADD_FAILURE_AT.
+TEST(MacroTest, ADD_FAILURE_AT) {
+  // Verifies that ADD_FAILURE_AT does generate a nonfatal failure and
+  // the failure message contains the user-streamed part.
+  EXPECT_NONFATAL_FAILURE(ADD_FAILURE_AT("foo.cc", 42) << "Wrong!", "Wrong!");
+
+  // Verifies that the user-streamed part is optional.
+  EXPECT_NONFATAL_FAILURE(ADD_FAILURE_AT("foo.cc", 42), "Failed");
+
+  // Unfortunately, we cannot verify that the failure message contains
+  // the right file path and line number the same way, as
+  // EXPECT_NONFATAL_FAILURE() doesn't get to see the file path and
+  // line number.  Instead, we do that in gtest_output_test_.cc.
+}
+
+// Tests FAIL.
+TEST(MacroTest, FAIL) {
+  EXPECT_FATAL_FAILURE(FAIL(),
+                       "Failed");
+  EXPECT_FATAL_FAILURE(FAIL() << "Intentional failure.",
+                       "Intentional failure.");
+}
+
+// Tests SUCCEED
+TEST(MacroTest, SUCCEED) {
+  SUCCEED();
+  SUCCEED() << "Explicit success.";
+}
+
+// Tests for EXPECT_EQ() and ASSERT_EQ().
+//
+// These tests fail *intentionally*, s.t. the failure messages can be
+// generated and tested.
+//
+// We have different tests for different argument types.
+
+// Tests using bool values in {EXPECT|ASSERT}_EQ.
+TEST(EqAssertionTest, Bool) {
+  EXPECT_EQ(true,  true);
+  EXPECT_FATAL_FAILURE({
+      bool false_value = false;
+      ASSERT_EQ(false_value, true);
+    }, "Value of: true");
+}
+
+// Tests using int values in {EXPECT|ASSERT}_EQ.
+TEST(EqAssertionTest, Int) {
+  ASSERT_EQ(32, 32);
+  EXPECT_NONFATAL_FAILURE(EXPECT_EQ(32, 33),
+                          "33");
+}
+
+// Tests using time_t values in {EXPECT|ASSERT}_EQ.
+TEST(EqAssertionTest, Time_T) {
+  EXPECT_EQ(static_cast<time_t>(0),
+            static_cast<time_t>(0));
+  EXPECT_FATAL_FAILURE(ASSERT_EQ(static_cast<time_t>(0),
+                                 static_cast<time_t>(1234)),
+                       "1234");
+}
+
+// Tests using char values in {EXPECT|ASSERT}_EQ.
+TEST(EqAssertionTest, Char) {
+  ASSERT_EQ('z', 'z');
+  const char ch = 'b';
+  EXPECT_NONFATAL_FAILURE(EXPECT_EQ('\0', ch),
+                          "ch");
+  EXPECT_NONFATAL_FAILURE(EXPECT_EQ('a', ch),
+                          "ch");
+}
+
+// Tests using wchar_t values in {EXPECT|ASSERT}_EQ.
+TEST(EqAssertionTest, WideChar) {
+  EXPECT_EQ(L'b', L'b');
+
+  EXPECT_NONFATAL_FAILURE(EXPECT_EQ(L'\0', L'x'),
+                          "Value of: L'x'\n"
+                          "  Actual: L'x' (120, 0x78)\n"
+                          "Expected: L'\0'\n"
+                          "Which is: L'\0' (0, 0x0)");
+
+  static wchar_t wchar;
+  wchar = L'b';
+  EXPECT_NONFATAL_FAILURE(EXPECT_EQ(L'a', wchar),
+                          "wchar");
+  wchar = 0x8119;
+  EXPECT_FATAL_FAILURE(ASSERT_EQ(static_cast<wchar_t>(0x8120), wchar),
+                       "Value of: wchar");
+}
+
+// Tests using ::std::string values in {EXPECT|ASSERT}_EQ.
+TEST(EqAssertionTest, StdString) {
+  // Compares a const char* to an std::string that has identical
+  // content.
+  ASSERT_EQ("Test", ::std::string("Test"));
+
+  // Compares two identical std::strings.
+  static const ::std::string str1("A * in the middle");
+  static const ::std::string str2(str1);
+  EXPECT_EQ(str1, str2);
+
+  // Compares a const char* to an std::string that has different
+  // content
+  EXPECT_NONFATAL_FAILURE(EXPECT_EQ("Test", ::std::string("test")),
+                          "\"test\"");
+
+  // Compares an std::string to a char* that has different content.
+  char* const p1 = const_cast<char*>("foo");
+  EXPECT_NONFATAL_FAILURE(EXPECT_EQ(::std::string("bar"), p1),
+                          "p1");
+
+  // Compares two std::strings that have different contents, one of
+  // which having a NUL character in the middle.  This should fail.
+  static ::std::string str3(str1);
+  str3.at(2) = '\0';
+  EXPECT_FATAL_FAILURE(ASSERT_EQ(str1, str3),
+                       "Value of: str3\n"
+                       "  Actual: \"A \\0 in the middle\"");
+}
+
+#if GTEST_HAS_STD_WSTRING
+
+// Tests using ::std::wstring values in {EXPECT|ASSERT}_EQ.
+TEST(EqAssertionTest, StdWideString) {
+  // Compares two identical std::wstrings.
+  const ::std::wstring wstr1(L"A * in the middle");
+  const ::std::wstring wstr2(wstr1);
+  ASSERT_EQ(wstr1, wstr2);
+
+  // Compares an std::wstring to a const wchar_t* that has identical
+  // content.
+  const wchar_t kTestX8119[] = { 'T', 'e', 's', 't', 0x8119, '\0' };
+  EXPECT_EQ(::std::wstring(kTestX8119), kTestX8119);
+
+  // Compares an std::wstring to a const wchar_t* that has different
+  // content.
+  const wchar_t kTestX8120[] = { 'T', 'e', 's', 't', 0x8120, '\0' };
+  EXPECT_NONFATAL_FAILURE({  // NOLINT
+    EXPECT_EQ(::std::wstring(kTestX8119), kTestX8120);
+  }, "kTestX8120");
+
+  // Compares two std::wstrings that have different contents, one of
+  // which having a NUL character in the middle.
+  ::std::wstring wstr3(wstr1);
+  wstr3.at(2) = L'\0';
+  EXPECT_NONFATAL_FAILURE(EXPECT_EQ(wstr1, wstr3),
+                          "wstr3");
+
+  // Compares a wchar_t* to an std::wstring that has different
+  // content.
+  EXPECT_FATAL_FAILURE({  // NOLINT
+    ASSERT_EQ(const_cast<wchar_t*>(L"foo"), ::std::wstring(L"bar"));
+  }, "");
+}
+
+#endif  // GTEST_HAS_STD_WSTRING
+
+#if GTEST_HAS_GLOBAL_STRING
+// Tests using ::string values in {EXPECT|ASSERT}_EQ.
+TEST(EqAssertionTest, GlobalString) {
+  // Compares a const char* to a ::string that has identical content.
+  EXPECT_EQ("Test", ::string("Test"));
+
+  // Compares two identical ::strings.
+  const ::string str1("A * in the middle");
+  const ::string str2(str1);
+  ASSERT_EQ(str1, str2);
+
+  // Compares a ::string to a const char* that has different content.
+  EXPECT_NONFATAL_FAILURE(EXPECT_EQ(::string("Test"), "test"),
+                          "test");
+
+  // Compares two ::strings that have different contents, one of which
+  // having a NUL character in the middle.
+  ::string str3(str1);
+  str3.at(2) = '\0';
+  EXPECT_NONFATAL_FAILURE(EXPECT_EQ(str1, str3),
+                          "str3");
+
+  // Compares a ::string to a char* that has different content.
+  EXPECT_FATAL_FAILURE({  // NOLINT
+    ASSERT_EQ(::string("bar"), const_cast<char*>("foo"));
+  }, "");
+}
+
+#endif  // GTEST_HAS_GLOBAL_STRING
+
+#if GTEST_HAS_GLOBAL_WSTRING
+
+// Tests using ::wstring values in {EXPECT|ASSERT}_EQ.
+TEST(EqAssertionTest, GlobalWideString) {
+  // Compares two identical ::wstrings.
+  static const ::wstring wstr1(L"A * in the middle");
+  static const ::wstring wstr2(wstr1);
+  EXPECT_EQ(wstr1, wstr2);
+
+  // Compares a const wchar_t* to a ::wstring that has identical content.
+  const wchar_t kTestX8119[] = { 'T', 'e', 's', 't', 0x8119, '\0' };
+  ASSERT_EQ(kTestX8119, ::wstring(kTestX8119));
+
+  // Compares a const wchar_t* to a ::wstring that has different
+  // content.
+  const wchar_t kTestX8120[] = { 'T', 'e', 's', 't', 0x8120, '\0' };
+  EXPECT_NONFATAL_FAILURE({  // NOLINT
+    EXPECT_EQ(kTestX8120, ::wstring(kTestX8119));
+  }, "Test\\x8119");
+
+  // Compares a wchar_t* to a ::wstring that has different content.
+  wchar_t* const p1 = const_cast<wchar_t*>(L"foo");
+  EXPECT_NONFATAL_FAILURE(EXPECT_EQ(p1, ::wstring(L"bar")),
+                          "bar");
+
+  // Compares two ::wstrings that have different contents, one of which
+  // having a NUL character in the middle.
+  static ::wstring wstr3;
+  wstr3 = wstr1;
+  wstr3.at(2) = L'\0';
+  EXPECT_FATAL_FAILURE(ASSERT_EQ(wstr1, wstr3),
+                       "wstr3");
+}
+
+#endif  // GTEST_HAS_GLOBAL_WSTRING
+
+// Tests using char pointers in {EXPECT|ASSERT}_EQ.
+TEST(EqAssertionTest, CharPointer) {
+  char* const p0 = NULL;
+  // Only way to get the Nokia compiler to compile the cast
+  // is to have a separate void* variable first. Putting
+  // the two casts on the same line doesn't work, neither does
+  // a direct C-style to char*.
+  void* pv1 = (void*)0x1234;  // NOLINT
+  void* pv2 = (void*)0xABC0;  // NOLINT
+  char* const p1 = reinterpret_cast<char*>(pv1);
+  char* const p2 = reinterpret_cast<char*>(pv2);
+  ASSERT_EQ(p1, p1);
+
+  EXPECT_NONFATAL_FAILURE(EXPECT_EQ(p0, p2),
+                          "Value of: p2");
+  EXPECT_NONFATAL_FAILURE(EXPECT_EQ(p1, p2),
+                          "p2");
+  EXPECT_FATAL_FAILURE(ASSERT_EQ(reinterpret_cast<char*>(0x1234),
+                                 reinterpret_cast<char*>(0xABC0)),
+                       "ABC0");
+}
+
+// Tests using wchar_t pointers in {EXPECT|ASSERT}_EQ.
+TEST(EqAssertionTest, WideCharPointer) {
+  wchar_t* const p0 = NULL;
+  // Only way to get the Nokia compiler to compile the cast
+  // is to have a separate void* variable first. Putting
+  // the two casts on the same line doesn't work, neither does
+  // a direct C-style to char*.
+  void* pv1 = (void*)0x1234;  // NOLINT
+  void* pv2 = (void*)0xABC0;  // NOLINT
+  wchar_t* const p1 = reinterpret_cast<wchar_t*>(pv1);
+  wchar_t* const p2 = reinterpret_cast<wchar_t*>(pv2);
+  EXPECT_EQ(p0, p0);
+
+  EXPECT_NONFATAL_FAILURE(EXPECT_EQ(p0, p2),
+                          "Value of: p2");
+  EXPECT_NONFATAL_FAILURE(EXPECT_EQ(p1, p2),
+                          "p2");
+  void* pv3 = (void*)0x1234;  // NOLINT
+  void* pv4 = (void*)0xABC0;  // NOLINT
+  const wchar_t* p3 = reinterpret_cast<const wchar_t*>(pv3);
+  const wchar_t* p4 = reinterpret_cast<const wchar_t*>(pv4);
+  EXPECT_NONFATAL_FAILURE(EXPECT_EQ(p3, p4),
+                          "p4");
+}
+
+// Tests using other types of pointers in {EXPECT|ASSERT}_EQ.
+TEST(EqAssertionTest, OtherPointer) {
+  ASSERT_EQ(static_cast<const int*>(NULL),
+            static_cast<const int*>(NULL));
+  EXPECT_FATAL_FAILURE(ASSERT_EQ(static_cast<const int*>(NULL),
+                                 reinterpret_cast<const int*>(0x1234)),
+                       "0x1234");
+}
+
+// A class that supports binary comparison operators but not streaming.
+class UnprintableChar {
+ public:
+  explicit UnprintableChar(char ch) : char_(ch) {}
+
+  bool operator==(const UnprintableChar& rhs) const {
+    return char_ == rhs.char_;
+  }
+  bool operator!=(const UnprintableChar& rhs) const {
+    return char_ != rhs.char_;
+  }
+  bool operator<(const UnprintableChar& rhs) const {
+    return char_ < rhs.char_;
+  }
+  bool operator<=(const UnprintableChar& rhs) const {
+    return char_ <= rhs.char_;
+  }
+  bool operator>(const UnprintableChar& rhs) const {
+    return char_ > rhs.char_;
+  }
+  bool operator>=(const UnprintableChar& rhs) const {
+    return char_ >= rhs.char_;
+  }
+
+ private:
+  char char_;
+};
+
+// Tests that ASSERT_EQ() and friends don't require the arguments to
+// be printable.
+TEST(ComparisonAssertionTest, AcceptsUnprintableArgs) {
+  const UnprintableChar x('x'), y('y');
+  ASSERT_EQ(x, x);
+  EXPECT_NE(x, y);
+  ASSERT_LT(x, y);
+  EXPECT_LE(x, y);
+  ASSERT_GT(y, x);
+  EXPECT_GE(x, x);
+
+  EXPECT_NONFATAL_FAILURE(EXPECT_EQ(x, y), "1-byte object <78>");
+  EXPECT_NONFATAL_FAILURE(EXPECT_EQ(x, y), "1-byte object <79>");
+  EXPECT_NONFATAL_FAILURE(EXPECT_LT(y, y), "1-byte object <79>");
+  EXPECT_NONFATAL_FAILURE(EXPECT_GT(x, y), "1-byte object <78>");
+  EXPECT_NONFATAL_FAILURE(EXPECT_GT(x, y), "1-byte object <79>");
+
+  // Code tested by EXPECT_FATAL_FAILURE cannot reference local
+  // variables, so we have to write UnprintableChar('x') instead of x.
+#ifndef __BORLANDC__
+  // ICE's in C++Builder.
+  EXPECT_FATAL_FAILURE(ASSERT_NE(UnprintableChar('x'), UnprintableChar('x')),
+                       "1-byte object <78>");
+  EXPECT_FATAL_FAILURE(ASSERT_LE(UnprintableChar('y'), UnprintableChar('x')),
+                       "1-byte object <78>");
+#endif
+  EXPECT_FATAL_FAILURE(ASSERT_LE(UnprintableChar('y'), UnprintableChar('x')),
+                       "1-byte object <79>");
+  EXPECT_FATAL_FAILURE(ASSERT_GE(UnprintableChar('x'), UnprintableChar('y')),
+                       "1-byte object <78>");
+  EXPECT_FATAL_FAILURE(ASSERT_GE(UnprintableChar('x'), UnprintableChar('y')),
+                       "1-byte object <79>");
+}
+
+// Tests the FRIEND_TEST macro.
+
+// This class has a private member we want to test.  We will test it
+// both in a TEST and in a TEST_F.
+class Foo {
+ public:
+  Foo() {}
+
+ private:
+  int Bar() const { return 1; }
+
+  // Declares the friend tests that can access the private member
+  // Bar().
+  FRIEND_TEST(FRIEND_TEST_Test, TEST);
+  FRIEND_TEST(FRIEND_TEST_Test2, TEST_F);
+};
+
+// Tests that the FRIEND_TEST declaration allows a TEST to access a
+// class's private members.  This should compile.
+TEST(FRIEND_TEST_Test, TEST) {
+  ASSERT_EQ(1, Foo().Bar());
+}
+
+// The fixture needed to test using FRIEND_TEST with TEST_F.
+class FRIEND_TEST_Test2 : public Test {
+ protected:
+  Foo foo;
+};
+
+// Tests that the FRIEND_TEST declaration allows a TEST_F to access a
+// class's private members.  This should compile.
+TEST_F(FRIEND_TEST_Test2, TEST_F) {
+  ASSERT_EQ(1, foo.Bar());
+}
+
+// Tests the life cycle of Test objects.
+
+// The test fixture for testing the life cycle of Test objects.
+//
+// This class counts the number of live test objects that uses this
+// fixture.
+class TestLifeCycleTest : public Test {
+ protected:
+  // Constructor.  Increments the number of test objects that uses
+  // this fixture.
+  TestLifeCycleTest() { count_++; }
+
+  // Destructor.  Decrements the number of test objects that uses this
+  // fixture.
+  ~TestLifeCycleTest() { count_--; }
+
+  // Returns the number of live test objects that uses this fixture.
+  int count() const { return count_; }
+
+ private:
+  static int count_;
+};
+
+int TestLifeCycleTest::count_ = 0;
+
+// Tests the life cycle of test objects.
+TEST_F(TestLifeCycleTest, Test1) {
+  // There should be only one test object in this test case that's
+  // currently alive.
+  ASSERT_EQ(1, count());
+}
+
+// Tests the life cycle of test objects.
+TEST_F(TestLifeCycleTest, Test2) {
+  // After Test1 is done and Test2 is started, there should still be
+  // only one live test object, as the object for Test1 should've been
+  // deleted.
+  ASSERT_EQ(1, count());
+}
+
+}  // namespace
+
+// Tests that the copy constructor works when it is NOT optimized away by
+// the compiler.
+TEST(AssertionResultTest, CopyConstructorWorksWhenNotOptimied) {
+  // Checks that the copy constructor doesn't try to dereference NULL pointers
+  // in the source object.
+  AssertionResult r1 = AssertionSuccess();
+  AssertionResult r2 = r1;
+  // The following line is added to prevent the compiler from optimizing
+  // away the constructor call.
+  r1 << "abc";
+
+  AssertionResult r3 = r1;
+  EXPECT_EQ(static_cast<bool>(r3), static_cast<bool>(r1));
+  EXPECT_STREQ("abc", r1.message());
+}
+
+// Tests that AssertionSuccess and AssertionFailure construct
+// AssertionResult objects as expected.
+TEST(AssertionResultTest, ConstructionWorks) {
+  AssertionResult r1 = AssertionSuccess();
+  EXPECT_TRUE(r1);
+  EXPECT_STREQ("", r1.message());
+
+  AssertionResult r2 = AssertionSuccess() << "abc";
+  EXPECT_TRUE(r2);
+  EXPECT_STREQ("abc", r2.message());
+
+  AssertionResult r3 = AssertionFailure();
+  EXPECT_FALSE(r3);
+  EXPECT_STREQ("", r3.message());
+
+  AssertionResult r4 = AssertionFailure() << "def";
+  EXPECT_FALSE(r4);
+  EXPECT_STREQ("def", r4.message());
+
+  AssertionResult r5 = AssertionFailure(Message() << "ghi");
+  EXPECT_FALSE(r5);
+  EXPECT_STREQ("ghi", r5.message());
+}
+
+// Tests that the negation flips the predicate result but keeps the message.
+TEST(AssertionResultTest, NegationWorks) {
+  AssertionResult r1 = AssertionSuccess() << "abc";
+  EXPECT_FALSE(!r1);
+  EXPECT_STREQ("abc", (!r1).message());
+
+  AssertionResult r2 = AssertionFailure() << "def";
+  EXPECT_TRUE(!r2);
+  EXPECT_STREQ("def", (!r2).message());
+}
+
+TEST(AssertionResultTest, StreamingWorks) {
+  AssertionResult r = AssertionSuccess();
+  r << "abc" << 'd' << 0 << true;
+  EXPECT_STREQ("abcd0true", r.message());
+}
+
+TEST(AssertionResultTest, CanStreamOstreamManipulators) {
+  AssertionResult r = AssertionSuccess();
+  r << "Data" << std::endl << std::flush << std::ends << "Will be visible";
+  EXPECT_STREQ("Data\n\\0Will be visible", r.message());
+}
+
+// Tests streaming a user type whose definition and operator << are
+// both in the global namespace.
+class Base {
+ public:
+  explicit Base(int an_x) : x_(an_x) {}
+  int x() const { return x_; }
+ private:
+  int x_;
+};
+std::ostream& operator<<(std::ostream& os,
+                         const Base& val) {
+  return os << val.x();
+}
+std::ostream& operator<<(std::ostream& os,
+                         const Base* pointer) {
+  return os << "(" << pointer->x() << ")";
+}
+
+TEST(MessageTest, CanStreamUserTypeInGlobalNameSpace) {
+  Message msg;
+  Base a(1);
+
+  msg << a << &a;  // Uses ::operator<<.
+  EXPECT_STREQ("1(1)", msg.GetString().c_str());
+}
+
+// Tests streaming a user type whose definition and operator<< are
+// both in an unnamed namespace.
+namespace {
+class MyTypeInUnnamedNameSpace : public Base {
+ public:
+  explicit MyTypeInUnnamedNameSpace(int an_x): Base(an_x) {}
+};
+std::ostream& operator<<(std::ostream& os,
+                         const MyTypeInUnnamedNameSpace& val) {
+  return os << val.x();
+}
+std::ostream& operator<<(std::ostream& os,
+                         const MyTypeInUnnamedNameSpace* pointer) {
+  return os << "(" << pointer->x() << ")";
+}
+}  // namespace
+
+TEST(MessageTest, CanStreamUserTypeInUnnamedNameSpace) {
+  Message msg;
+  MyTypeInUnnamedNameSpace a(1);
+
+  msg << a << &a;  // Uses <unnamed_namespace>::operator<<.
+  EXPECT_STREQ("1(1)", msg.GetString().c_str());
+}
+
+// Tests streaming a user type whose definition and operator<< are
+// both in a user namespace.
+namespace namespace1 {
+class MyTypeInNameSpace1 : public Base {
+ public:
+  explicit MyTypeInNameSpace1(int an_x): Base(an_x) {}
+};
+std::ostream& operator<<(std::ostream& os,
+                         const MyTypeInNameSpace1& val) {
+  return os << val.x();
+}
+std::ostream& operator<<(std::ostream& os,
+                         const MyTypeInNameSpace1* pointer) {
+  return os << "(" << pointer->x() << ")";
+}
+}  // namespace namespace1
+
+TEST(MessageTest, CanStreamUserTypeInUserNameSpace) {
+  Message msg;
+  namespace1::MyTypeInNameSpace1 a(1);
+
+  msg << a << &a;  // Uses namespace1::operator<<.
+  EXPECT_STREQ("1(1)", msg.GetString().c_str());
+}
+
+// Tests streaming a user type whose definition is in a user namespace
+// but whose operator<< is in the global namespace.
+namespace namespace2 {
+class MyTypeInNameSpace2 : public ::Base {
+ public:
+  explicit MyTypeInNameSpace2(int an_x): Base(an_x) {}
+};
+}  // namespace namespace2
+std::ostream& operator<<(std::ostream& os,
+                         const namespace2::MyTypeInNameSpace2& val) {
+  return os << val.x();
+}
+std::ostream& operator<<(std::ostream& os,
+                         const namespace2::MyTypeInNameSpace2* pointer) {
+  return os << "(" << pointer->x() << ")";
+}
+
+TEST(MessageTest, CanStreamUserTypeInUserNameSpaceWithStreamOperatorInGlobal) {
+  Message msg;
+  namespace2::MyTypeInNameSpace2 a(1);
+
+  msg << a << &a;  // Uses ::operator<<.
+  EXPECT_STREQ("1(1)", msg.GetString().c_str());
+}
+
+// Tests streaming NULL pointers to testing::Message.
+TEST(MessageTest, NullPointers) {
+  Message msg;
+  char* const p1 = NULL;
+  unsigned char* const p2 = NULL;
+  int* p3 = NULL;
+  double* p4 = NULL;
+  bool* p5 = NULL;
+  Message* p6 = NULL;
+
+  msg << p1 << p2 << p3 << p4 << p5 << p6;
+  ASSERT_STREQ("(null)(null)(null)(null)(null)(null)",
+               msg.GetString().c_str());
+}
+
+// Tests streaming wide strings to testing::Message.
+TEST(MessageTest, WideStrings) {
+  // Streams a NULL of type const wchar_t*.
+  const wchar_t* const_wstr = NULL;
+  EXPECT_STREQ("(null)",
+               (Message() << const_wstr).GetString().c_str());
+
+  // Streams a NULL of type wchar_t*.
+  wchar_t* wstr = NULL;
+  EXPECT_STREQ("(null)",
+               (Message() << wstr).GetString().c_str());
+
+  // Streams a non-NULL of type const wchar_t*.
+  const_wstr = L"abc\x8119";
+  EXPECT_STREQ("abc\xe8\x84\x99",
+               (Message() << const_wstr).GetString().c_str());
+
+  // Streams a non-NULL of type wchar_t*.
+  wstr = const_cast<wchar_t*>(const_wstr);
+  EXPECT_STREQ("abc\xe8\x84\x99",
+               (Message() << wstr).GetString().c_str());
+}
+
+
+// This line tests that we can define tests in the testing namespace.
+namespace testing {
+
+// Tests the TestInfo class.
+
+class TestInfoTest : public Test {
+ protected:
+  static const TestInfo* GetTestInfo(const char* test_name) {
+    const TestCase* const test_case = GetUnitTestImpl()->
+        GetTestCase("TestInfoTest", "", NULL, NULL);
+
+    for (int i = 0; i < test_case->total_test_count(); ++i) {
+      const TestInfo* const test_info = test_case->GetTestInfo(i);
+      if (strcmp(test_name, test_info->name()) == 0)
+        return test_info;
+    }
+    return NULL;
+  }
+
+  static const TestResult* GetTestResult(
+      const TestInfo* test_info) {
+    return test_info->result();
+  }
+};
+
+// Tests TestInfo::test_case_name() and TestInfo::name().
+TEST_F(TestInfoTest, Names) {
+  const TestInfo* const test_info = GetTestInfo("Names");
+
+  ASSERT_STREQ("TestInfoTest", test_info->test_case_name());
+  ASSERT_STREQ("Names", test_info->name());
+}
+
+// Tests TestInfo::result().
+TEST_F(TestInfoTest, result) {
+  const TestInfo* const test_info = GetTestInfo("result");
+
+  // Initially, there is no TestPartResult for this test.
+  ASSERT_EQ(0, GetTestResult(test_info)->total_part_count());
+
+  // After the previous assertion, there is still none.
+  ASSERT_EQ(0, GetTestResult(test_info)->total_part_count());
+}
+
+// Tests setting up and tearing down a test case.
+
+class SetUpTestCaseTest : public Test {
+ protected:
+  // This will be called once before the first test in this test case
+  // is run.
+  static void SetUpTestCase() {
+    printf("Setting up the test case . . .\n");
+
+    // Initializes some shared resource.  In this simple example, we
+    // just create a C string.  More complex stuff can be done if
+    // desired.
+    shared_resource_ = "123";
+
+    // Increments the number of test cases that have been set up.
+    counter_++;
+
+    // SetUpTestCase() should be called only once.
+    EXPECT_EQ(1, counter_);
+  }
+
+  // This will be called once after the last test in this test case is
+  // run.
+  static void TearDownTestCase() {
+    printf("Tearing down the test case . . .\n");
+
+    // Decrements the number of test cases that have been set up.
+    counter_--;
+
+    // TearDownTestCase() should be called only once.
+    EXPECT_EQ(0, counter_);
+
+    // Cleans up the shared resource.
+    shared_resource_ = NULL;
+  }
+
+  // This will be called before each test in this test case.
+  virtual void SetUp() {
+    // SetUpTestCase() should be called only once, so counter_ should
+    // always be 1.
+    EXPECT_EQ(1, counter_);
+  }
+
+  // Number of test cases that have been set up.
+  static int counter_;
+
+  // Some resource to be shared by all tests in this test case.
+  static const char* shared_resource_;
+};
+
+int SetUpTestCaseTest::counter_ = 0;
+const char* SetUpTestCaseTest::shared_resource_ = NULL;
+
+// A test that uses the shared resource.
+TEST_F(SetUpTestCaseTest, Test1) {
+  EXPECT_STRNE(NULL, shared_resource_);
+}
+
+// Another test that uses the shared resource.
+TEST_F(SetUpTestCaseTest, Test2) {
+  EXPECT_STREQ("123", shared_resource_);
+}
+
+// The InitGoogleTestTest test case tests testing::InitGoogleTest().
+
+// The Flags struct stores a copy of all Google Test flags.
+struct Flags {
+  // Constructs a Flags struct where each flag has its default value.
+  Flags() : also_run_disabled_tests(false),
+            break_on_failure(false),
+            catch_exceptions(false),
+            death_test_use_fork(false),
+            filter(""),
+            list_tests(false),
+            output(""),
+            print_time(true),
+            random_seed(0),
+            repeat(1),
+            shuffle(false),
+            stack_trace_depth(kMaxStackTraceDepth),
+            stream_result_to(""),
+            throw_on_failure(false) {}
+
+  // Factory methods.
+
+  // Creates a Flags struct where the gtest_also_run_disabled_tests flag has
+  // the given value.
+  static Flags AlsoRunDisabledTests(bool also_run_disabled_tests) {
+    Flags flags;
+    flags.also_run_disabled_tests = also_run_disabled_tests;
+    return flags;
+  }
+
+  // Creates a Flags struct where the gtest_break_on_failure flag has
+  // the given value.
+  static Flags BreakOnFailure(bool break_on_failure) {
+    Flags flags;
+    flags.break_on_failure = break_on_failure;
+    return flags;
+  }
+
+  // Creates a Flags struct where the gtest_catch_exceptions flag has
+  // the given value.
+  static Flags CatchExceptions(bool catch_exceptions) {
+    Flags flags;
+    flags.catch_exceptions = catch_exceptions;
+    return flags;
+  }
+
+  // Creates a Flags struct where the gtest_death_test_use_fork flag has
+  // the given value.
+  static Flags DeathTestUseFork(bool death_test_use_fork) {
+    Flags flags;
+    flags.death_test_use_fork = death_test_use_fork;
+    return flags;
+  }
+
+  // Creates a Flags struct where the gtest_filter flag has the given
+  // value.
+  static Flags Filter(const char* filter) {
+    Flags flags;
+    flags.filter = filter;
+    return flags;
+  }
+
+  // Creates a Flags struct where the gtest_list_tests flag has the
+  // given value.
+  static Flags ListTests(bool list_tests) {
+    Flags flags;
+    flags.list_tests = list_tests;
+    return flags;
+  }
+
+  // Creates a Flags struct where the gtest_output flag has the given
+  // value.
+  static Flags Output(const char* output) {
+    Flags flags;
+    flags.output = output;
+    return flags;
+  }
+
+  // Creates a Flags struct where the gtest_print_time flag has the given
+  // value.
+  static Flags PrintTime(bool print_time) {
+    Flags flags;
+    flags.print_time = print_time;
+    return flags;
+  }
+
+  // Creates a Flags struct where the gtest_random_seed flag has
+  // the given value.
+  static Flags RandomSeed(Int32 random_seed) {
+    Flags flags;
+    flags.random_seed = random_seed;
+    return flags;
+  }
+
+  // Creates a Flags struct where the gtest_repeat flag has the given
+  // value.
+  static Flags Repeat(Int32 repeat) {
+    Flags flags;
+    flags.repeat = repeat;
+    return flags;
+  }
+
+  // Creates a Flags struct where the gtest_shuffle flag has
+  // the given value.
+  static Flags Shuffle(bool shuffle) {
+    Flags flags;
+    flags.shuffle = shuffle;
+    return flags;
+  }
+
+  // Creates a Flags struct where the GTEST_FLAG(stack_trace_depth) flag has
+  // the given value.
+  static Flags StackTraceDepth(Int32 stack_trace_depth) {
+    Flags flags;
+    flags.stack_trace_depth = stack_trace_depth;
+    return flags;
+  }
+
+  // Creates a Flags struct where the GTEST_FLAG(stream_result_to) flag has
+  // the given value.
+  static Flags StreamResultTo(const char* stream_result_to) {
+    Flags flags;
+    flags.stream_result_to = stream_result_to;
+    return flags;
+  }
+
+  // Creates a Flags struct where the gtest_throw_on_failure flag has
+  // the given value.
+  static Flags ThrowOnFailure(bool throw_on_failure) {
+    Flags flags;
+    flags.throw_on_failure = throw_on_failure;
+    return flags;
+  }
+
+  // These fields store the flag values.
+  bool also_run_disabled_tests;
+  bool break_on_failure;
+  bool catch_exceptions;
+  bool death_test_use_fork;
+  const char* filter;
+  bool list_tests;
+  const char* output;
+  bool print_time;
+  Int32 random_seed;
+  Int32 repeat;
+  bool shuffle;
+  Int32 stack_trace_depth;
+  const char* stream_result_to;
+  bool throw_on_failure;
+};
+
+// Fixture for testing InitGoogleTest().
+class InitGoogleTestTest : public Test {
+ protected:
+  // Clears the flags before each test.
+  virtual void SetUp() {
+    GTEST_FLAG(also_run_disabled_tests) = false;
+    GTEST_FLAG(break_on_failure) = false;
+    GTEST_FLAG(catch_exceptions) = false;
+    GTEST_FLAG(death_test_use_fork) = false;
+    GTEST_FLAG(filter) = "";
+    GTEST_FLAG(list_tests) = false;
+    GTEST_FLAG(output) = "";
+    GTEST_FLAG(print_time) = true;
+    GTEST_FLAG(random_seed) = 0;
+    GTEST_FLAG(repeat) = 1;
+    GTEST_FLAG(shuffle) = false;
+    GTEST_FLAG(stack_trace_depth) = kMaxStackTraceDepth;
+    GTEST_FLAG(stream_result_to) = "";
+    GTEST_FLAG(throw_on_failure) = false;
+  }
+
+  // Asserts that two narrow or wide string arrays are equal.
+  template <typename CharType>
+  static void AssertStringArrayEq(size_t size1, CharType** array1,
+                                  size_t size2, CharType** array2) {
+    ASSERT_EQ(size1, size2) << " Array sizes different.";
+
+    for (size_t i = 0; i != size1; i++) {
+      ASSERT_STREQ(array1[i], array2[i]) << " where i == " << i;
+    }
+  }
+
+  // Verifies that the flag values match the expected values.
+  static void CheckFlags(const Flags& expected) {
+    EXPECT_EQ(expected.also_run_disabled_tests,
+              GTEST_FLAG(also_run_disabled_tests));
+    EXPECT_EQ(expected.break_on_failure, GTEST_FLAG(break_on_failure));
+    EXPECT_EQ(expected.catch_exceptions, GTEST_FLAG(catch_exceptions));
+    EXPECT_EQ(expected.death_test_use_fork, GTEST_FLAG(death_test_use_fork));
+    EXPECT_STREQ(expected.filter, GTEST_FLAG(filter).c_str());
+    EXPECT_EQ(expected.list_tests, GTEST_FLAG(list_tests));
+    EXPECT_STREQ(expected.output, GTEST_FLAG(output).c_str());
+    EXPECT_EQ(expected.print_time, GTEST_FLAG(print_time));
+    EXPECT_EQ(expected.random_seed, GTEST_FLAG(random_seed));
+    EXPECT_EQ(expected.repeat, GTEST_FLAG(repeat));
+    EXPECT_EQ(expected.shuffle, GTEST_FLAG(shuffle));
+    EXPECT_EQ(expected.stack_trace_depth, GTEST_FLAG(stack_trace_depth));
+    EXPECT_STREQ(expected.stream_result_to,
+                 GTEST_FLAG(stream_result_to).c_str());
+    EXPECT_EQ(expected.throw_on_failure, GTEST_FLAG(throw_on_failure));
+  }
+
+  // Parses a command line (specified by argc1 and argv1), then
+  // verifies that the flag values are expected and that the
+  // recognized flags are removed from the command line.
+  template <typename CharType>
+  static void TestParsingFlags(int argc1, const CharType** argv1,
+                               int argc2, const CharType** argv2,
+                               const Flags& expected, bool should_print_help) {
+    const bool saved_help_flag = ::testing::internal::g_help_flag;
+    ::testing::internal::g_help_flag = false;
+
+#if GTEST_HAS_STREAM_REDIRECTION
+    CaptureStdout();
+#endif
+
+    // Parses the command line.
+    internal::ParseGoogleTestFlagsOnly(&argc1, const_cast<CharType**>(argv1));
+
+#if GTEST_HAS_STREAM_REDIRECTION
+    const std::string captured_stdout = GetCapturedStdout();
+#endif
+
+    // Verifies the flag values.
+    CheckFlags(expected);
+
+    // Verifies that the recognized flags are removed from the command
+    // line.
+    AssertStringArrayEq(argc1 + 1, argv1, argc2 + 1, argv2);
+
+    // ParseGoogleTestFlagsOnly should neither set g_help_flag nor print the
+    // help message for the flags it recognizes.
+    EXPECT_EQ(should_print_help, ::testing::internal::g_help_flag);
+
+#if GTEST_HAS_STREAM_REDIRECTION
+    const char* const expected_help_fragment =
+        "This program contains tests written using";
+    if (should_print_help) {
+      EXPECT_PRED_FORMAT2(IsSubstring, expected_help_fragment, captured_stdout);
+    } else {
+      EXPECT_PRED_FORMAT2(IsNotSubstring,
+                          expected_help_fragment, captured_stdout);
+    }
+#endif  // GTEST_HAS_STREAM_REDIRECTION
+
+    ::testing::internal::g_help_flag = saved_help_flag;
+  }
+
+  // This macro wraps TestParsingFlags s.t. the user doesn't need
+  // to specify the array sizes.
+
+#define GTEST_TEST_PARSING_FLAGS_(argv1, argv2, expected, should_print_help) \
+  TestParsingFlags(sizeof(argv1)/sizeof(*argv1) - 1, argv1, \
+                   sizeof(argv2)/sizeof(*argv2) - 1, argv2, \
+                   expected, should_print_help)
+};
+
+// Tests parsing an empty command line.
+TEST_F(InitGoogleTestTest, Empty) {
+  const char* argv[] = {
+    NULL
+  };
+
+  const char* argv2[] = {
+    NULL
+  };
+
+  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags(), false);
+}
+
+// Tests parsing a command line that has no flag.
+TEST_F(InitGoogleTestTest, NoFlag) {
+  const char* argv[] = {
+    "foo.exe",
+    NULL
+  };
+
+  const char* argv2[] = {
+    "foo.exe",
+    NULL
+  };
+
+  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags(), false);
+}
+
+// Tests parsing a bad --gtest_filter flag.
+TEST_F(InitGoogleTestTest, FilterBad) {
+  const char* argv[] = {
+    "foo.exe",
+    "--gtest_filter",
+    NULL
+  };
+
+  const char* argv2[] = {
+    "foo.exe",
+    "--gtest_filter",
+    NULL
+  };
+
+  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::Filter(""), true);
+}
+
+// Tests parsing an empty --gtest_filter flag.
+TEST_F(InitGoogleTestTest, FilterEmpty) {
+  const char* argv[] = {
+    "foo.exe",
+    "--gtest_filter=",
+    NULL
+  };
+
+  const char* argv2[] = {
+    "foo.exe",
+    NULL
+  };
+
+  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::Filter(""), false);
+}
+
+// Tests parsing a non-empty --gtest_filter flag.
+TEST_F(InitGoogleTestTest, FilterNonEmpty) {
+  const char* argv[] = {
+    "foo.exe",
+    "--gtest_filter=abc",
+    NULL
+  };
+
+  const char* argv2[] = {
+    "foo.exe",
+    NULL
+  };
+
+  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::Filter("abc"), false);
+}
+
+// Tests parsing --gtest_break_on_failure.
+TEST_F(InitGoogleTestTest, BreakOnFailureWithoutValue) {
+  const char* argv[] = {
+    "foo.exe",
+    "--gtest_break_on_failure",
+    NULL
+};
+
+  const char* argv2[] = {
+    "foo.exe",
+    NULL
+  };
+
+  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::BreakOnFailure(true), false);
+}
+
+// Tests parsing --gtest_break_on_failure=0.
+TEST_F(InitGoogleTestTest, BreakOnFailureFalse_0) {
+  const char* argv[] = {
+    "foo.exe",
+    "--gtest_break_on_failure=0",
+    NULL
+  };
+
+  const char* argv2[] = {
+    "foo.exe",
+    NULL
+  };
+
+  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::BreakOnFailure(false), false);
+}
+
+// Tests parsing --gtest_break_on_failure=f.
+TEST_F(InitGoogleTestTest, BreakOnFailureFalse_f) {
+  const char* argv[] = {
+    "foo.exe",
+    "--gtest_break_on_failure=f",
+    NULL
+  };
+
+  const char* argv2[] = {
+    "foo.exe",
+    NULL
+  };
+
+  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::BreakOnFailure(false), false);
+}
+
+// Tests parsing --gtest_break_on_failure=F.
+TEST_F(InitGoogleTestTest, BreakOnFailureFalse_F) {
+  const char* argv[] = {
+    "foo.exe",
+    "--gtest_break_on_failure=F",
+    NULL
+  };
+
+  const char* argv2[] = {
+    "foo.exe",
+    NULL
+  };
+
+  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::BreakOnFailure(false), false);
+}
+
+// Tests parsing a --gtest_break_on_failure flag that has a "true"
+// definition.
+TEST_F(InitGoogleTestTest, BreakOnFailureTrue) {
+  const char* argv[] = {
+    "foo.exe",
+    "--gtest_break_on_failure=1",
+    NULL
+  };
+
+  const char* argv2[] = {
+    "foo.exe",
+    NULL
+  };
+
+  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::BreakOnFailure(true), false);
+}
+
+// Tests parsing --gtest_catch_exceptions.
+TEST_F(InitGoogleTestTest, CatchExceptions) {
+  const char* argv[] = {
+    "foo.exe",
+    "--gtest_catch_exceptions",
+    NULL
+  };
+
+  const char* argv2[] = {
+    "foo.exe",
+    NULL
+  };
+
+  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::CatchExceptions(true), false);
+}
+
+// Tests parsing --gtest_death_test_use_fork.
+TEST_F(InitGoogleTestTest, DeathTestUseFork) {
+  const char* argv[] = {
+    "foo.exe",
+    "--gtest_death_test_use_fork",
+    NULL
+  };
+
+  const char* argv2[] = {
+    "foo.exe",
+    NULL
+  };
+
+  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::DeathTestUseFork(true), false);
+}
+
+// Tests having the same flag twice with different values.  The
+// expected behavior is that the one coming last takes precedence.
+TEST_F(InitGoogleTestTest, DuplicatedFlags) {
+  const char* argv[] = {
+    "foo.exe",
+    "--gtest_filter=a",
+    "--gtest_filter=b",
+    NULL
+  };
+
+  const char* argv2[] = {
+    "foo.exe",
+    NULL
+  };
+
+  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::Filter("b"), false);
+}
+
+// Tests having an unrecognized flag on the command line.
+TEST_F(InitGoogleTestTest, UnrecognizedFlag) {
+  const char* argv[] = {
+    "foo.exe",
+    "--gtest_break_on_failure",
+    "bar",  // Unrecognized by Google Test.
+    "--gtest_filter=b",
+    NULL
+  };
+
+  const char* argv2[] = {
+    "foo.exe",
+    "bar",
+    NULL
+  };
+
+  Flags flags;
+  flags.break_on_failure = true;
+  flags.filter = "b";
+  GTEST_TEST_PARSING_FLAGS_(argv, argv2, flags, false);
+}
+
+// Tests having a --gtest_list_tests flag
+TEST_F(InitGoogleTestTest, ListTestsFlag) {
+    const char* argv[] = {
+      "foo.exe",
+      "--gtest_list_tests",
+      NULL
+    };
+
+    const char* argv2[] = {
+      "foo.exe",
+      NULL
+    };
+
+    GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::ListTests(true), false);
+}
+
+// Tests having a --gtest_list_tests flag with a "true" value
+TEST_F(InitGoogleTestTest, ListTestsTrue) {
+    const char* argv[] = {
+      "foo.exe",
+      "--gtest_list_tests=1",
+      NULL
+    };
+
+    const char* argv2[] = {
+      "foo.exe",
+      NULL
+    };
+
+    GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::ListTests(true), false);
+}
+
+// Tests having a --gtest_list_tests flag with a "false" value
+TEST_F(InitGoogleTestTest, ListTestsFalse) {
+    const char* argv[] = {
+      "foo.exe",
+      "--gtest_list_tests=0",
+      NULL
+    };
+
+    const char* argv2[] = {
+      "foo.exe",
+      NULL
+    };
+
+    GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::ListTests(false), false);
+}
+
+// Tests parsing --gtest_list_tests=f.
+TEST_F(InitGoogleTestTest, ListTestsFalse_f) {
+  const char* argv[] = {
+    "foo.exe",
+    "--gtest_list_tests=f",
+    NULL
+  };
+
+  const char* argv2[] = {
+    "foo.exe",
+    NULL
+  };
+
+  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::ListTests(false), false);
+}
+
+// Tests parsing --gtest_list_tests=F.
+TEST_F(InitGoogleTestTest, ListTestsFalse_F) {
+  const char* argv[] = {
+    "foo.exe",
+    "--gtest_list_tests=F",
+    NULL
+  };
+
+  const char* argv2[] = {
+    "foo.exe",
+    NULL
+  };
+
+  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::ListTests(false), false);
+}
+
+// Tests parsing --gtest_output (invalid).
+TEST_F(InitGoogleTestTest, OutputEmpty) {
+  const char* argv[] = {
+    "foo.exe",
+    "--gtest_output",
+    NULL
+  };
+
+  const char* argv2[] = {
+    "foo.exe",
+    "--gtest_output",
+    NULL
+  };
+
+  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags(), true);
+}
+
+// Tests parsing --gtest_output=xml
+TEST_F(InitGoogleTestTest, OutputXml) {
+  const char* argv[] = {
+    "foo.exe",
+    "--gtest_output=xml",
+    NULL
+  };
+
+  const char* argv2[] = {
+    "foo.exe",
+    NULL
+  };
+
+  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::Output("xml"), false);
+}
+
+// Tests parsing --gtest_output=xml:file
+TEST_F(InitGoogleTestTest, OutputXmlFile) {
+  const char* argv[] = {
+    "foo.exe",
+    "--gtest_output=xml:file",
+    NULL
+  };
+
+  const char* argv2[] = {
+    "foo.exe",
+    NULL
+  };
+
+  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::Output("xml:file"), false);
+}
+
+// Tests parsing --gtest_output=xml:directory/path/
+TEST_F(InitGoogleTestTest, OutputXmlDirectory) {
+  const char* argv[] = {
+    "foo.exe",
+    "--gtest_output=xml:directory/path/",
+    NULL
+  };
+
+  const char* argv2[] = {
+    "foo.exe",
+    NULL
+  };
+
+  GTEST_TEST_PARSING_FLAGS_(argv, argv2,
+                            Flags::Output("xml:directory/path/"), false);
+}
+
+// Tests having a --gtest_print_time flag
+TEST_F(InitGoogleTestTest, PrintTimeFlag) {
+    const char* argv[] = {
+      "foo.exe",
+      "--gtest_print_time",
+      NULL
+    };
+
+    const char* argv2[] = {
+      "foo.exe",
+      NULL
+    };
+
+    GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::PrintTime(true), false);
+}
+
+// Tests having a --gtest_print_time flag with a "true" value
+TEST_F(InitGoogleTestTest, PrintTimeTrue) {
+    const char* argv[] = {
+      "foo.exe",
+      "--gtest_print_time=1",
+      NULL
+    };
+
+    const char* argv2[] = {
+      "foo.exe",
+      NULL
+    };
+
+    GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::PrintTime(true), false);
+}
+
+// Tests having a --gtest_print_time flag with a "false" value
+TEST_F(InitGoogleTestTest, PrintTimeFalse) {
+    const char* argv[] = {
+      "foo.exe",
+      "--gtest_print_time=0",
+      NULL
+    };
+
+    const char* argv2[] = {
+      "foo.exe",
+      NULL
+    };
+
+    GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::PrintTime(false), false);
+}
+
+// Tests parsing --gtest_print_time=f.
+TEST_F(InitGoogleTestTest, PrintTimeFalse_f) {
+  const char* argv[] = {
+    "foo.exe",
+    "--gtest_print_time=f",
+    NULL
+  };
+
+  const char* argv2[] = {
+    "foo.exe",
+    NULL
+  };
+
+  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::PrintTime(false), false);
+}
+
+// Tests parsing --gtest_print_time=F.
+TEST_F(InitGoogleTestTest, PrintTimeFalse_F) {
+  const char* argv[] = {
+    "foo.exe",
+    "--gtest_print_time=F",
+    NULL
+  };
+
+  const char* argv2[] = {
+    "foo.exe",
+    NULL
+  };
+
+  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::PrintTime(false), false);
+}
+
+// Tests parsing --gtest_random_seed=number
+TEST_F(InitGoogleTestTest, RandomSeed) {
+  const char* argv[] = {
+    "foo.exe",
+    "--gtest_random_seed=1000",
+    NULL
+  };
+
+  const char* argv2[] = {
+    "foo.exe",
+    NULL
+  };
+
+  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::RandomSeed(1000), false);
+}
+
+// Tests parsing --gtest_repeat=number
+TEST_F(InitGoogleTestTest, Repeat) {
+  const char* argv[] = {
+    "foo.exe",
+    "--gtest_repeat=1000",
+    NULL
+  };
+
+  const char* argv2[] = {
+    "foo.exe",
+    NULL
+  };
+
+  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::Repeat(1000), false);
+}
+
+// Tests having a --gtest_also_run_disabled_tests flag
+TEST_F(InitGoogleTestTest, AlsoRunDisabledTestsFlag) {
+    const char* argv[] = {
+      "foo.exe",
+      "--gtest_also_run_disabled_tests",
+      NULL
+    };
+
+    const char* argv2[] = {
+      "foo.exe",
+      NULL
+    };
+
+    GTEST_TEST_PARSING_FLAGS_(argv, argv2,
+                              Flags::AlsoRunDisabledTests(true), false);
+}
+
+// Tests having a --gtest_also_run_disabled_tests flag with a "true" value
+TEST_F(InitGoogleTestTest, AlsoRunDisabledTestsTrue) {
+    const char* argv[] = {
+      "foo.exe",
+      "--gtest_also_run_disabled_tests=1",
+      NULL
+    };
+
+    const char* argv2[] = {
+      "foo.exe",
+      NULL
+    };
+
+    GTEST_TEST_PARSING_FLAGS_(argv, argv2,
+                              Flags::AlsoRunDisabledTests(true), false);
+}
+
+// Tests having a --gtest_also_run_disabled_tests flag with a "false" value
+TEST_F(InitGoogleTestTest, AlsoRunDisabledTestsFalse) {
+    const char* argv[] = {
+      "foo.exe",
+      "--gtest_also_run_disabled_tests=0",
+      NULL
+    };
+
+    const char* argv2[] = {
+      "foo.exe",
+      NULL
+    };
+
+    GTEST_TEST_PARSING_FLAGS_(argv, argv2,
+                              Flags::AlsoRunDisabledTests(false), false);
+}
+
+// Tests parsing --gtest_shuffle.
+TEST_F(InitGoogleTestTest, ShuffleWithoutValue) {
+  const char* argv[] = {
+    "foo.exe",
+    "--gtest_shuffle",
+    NULL
+};
+
+  const char* argv2[] = {
+    "foo.exe",
+    NULL
+  };
+
+  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::Shuffle(true), false);
+}
+
+// Tests parsing --gtest_shuffle=0.
+TEST_F(InitGoogleTestTest, ShuffleFalse_0) {
+  const char* argv[] = {
+    "foo.exe",
+    "--gtest_shuffle=0",
+    NULL
+  };
+
+  const char* argv2[] = {
+    "foo.exe",
+    NULL
+  };
+
+  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::Shuffle(false), false);
+}
+
+// Tests parsing a --gtest_shuffle flag that has a "true"
+// definition.
+TEST_F(InitGoogleTestTest, ShuffleTrue) {
+  const char* argv[] = {
+    "foo.exe",
+    "--gtest_shuffle=1",
+    NULL
+  };
+
+  const char* argv2[] = {
+    "foo.exe",
+    NULL
+  };
+
+  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::Shuffle(true), false);
+}
+
+// Tests parsing --gtest_stack_trace_depth=number.
+TEST_F(InitGoogleTestTest, StackTraceDepth) {
+  const char* argv[] = {
+    "foo.exe",
+    "--gtest_stack_trace_depth=5",
+    NULL
+  };
+
+  const char* argv2[] = {
+    "foo.exe",
+    NULL
+  };
+
+  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::StackTraceDepth(5), false);
+}
+
+TEST_F(InitGoogleTestTest, StreamResultTo) {
+  const char* argv[] = {
+    "foo.exe",
+    "--gtest_stream_result_to=localhost:1234",
+    NULL
+  };
+
+  const char* argv2[] = {
+    "foo.exe",
+    NULL
+  };
+
+  GTEST_TEST_PARSING_FLAGS_(
+      argv, argv2, Flags::StreamResultTo("localhost:1234"), false);
+}
+
+// Tests parsing --gtest_throw_on_failure.
+TEST_F(InitGoogleTestTest, ThrowOnFailureWithoutValue) {
+  const char* argv[] = {
+    "foo.exe",
+    "--gtest_throw_on_failure",
+    NULL
+};
+
+  const char* argv2[] = {
+    "foo.exe",
+    NULL
+  };
+
+  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::ThrowOnFailure(true), false);
+}
+
+// Tests parsing --gtest_throw_on_failure=0.
+TEST_F(InitGoogleTestTest, ThrowOnFailureFalse_0) {
+  const char* argv[] = {
+    "foo.exe",
+    "--gtest_throw_on_failure=0",
+    NULL
+  };
+
+  const char* argv2[] = {
+    "foo.exe",
+    NULL
+  };
+
+  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::ThrowOnFailure(false), false);
+}
+
+// Tests parsing a --gtest_throw_on_failure flag that has a "true"
+// definition.
+TEST_F(InitGoogleTestTest, ThrowOnFailureTrue) {
+  const char* argv[] = {
+    "foo.exe",
+    "--gtest_throw_on_failure=1",
+    NULL
+  };
+
+  const char* argv2[] = {
+    "foo.exe",
+    NULL
+  };
+
+  GTEST_TEST_PARSING_FLAGS_(argv, argv2, Flags::ThrowOnFailure(true), false);
+}
+
+#if GTEST_OS_WINDOWS
+// Tests parsing wide strings.
+TEST_F(InitGoogleTestTest, WideStrings) {
+  const wchar_t* argv[] = {
+    L"foo.exe",
+    L"--gtest_filter=Foo*",
+    L"--gtest_list_tests=1",
+    L"--gtest_break_on_failure",
+    L"--non_gtest_flag",
+    NULL
+  };
+
+  const wchar_t* argv2[] = {
+    L"foo.exe",
+    L"--non_gtest_flag",
+    NULL
+  };
+
+  Flags expected_flags;
+  expected_flags.break_on_failure = true;
+  expected_flags.filter = "Foo*";
+  expected_flags.list_tests = true;
+
+  GTEST_TEST_PARSING_FLAGS_(argv, argv2, expected_flags, false);
+}
+#endif  // GTEST_OS_WINDOWS
+
+// Tests current_test_info() in UnitTest.
+class CurrentTestInfoTest : public Test {
+ protected:
+  // Tests that current_test_info() returns NULL before the first test in
+  // the test case is run.
+  static void SetUpTestCase() {
+    // There should be no tests running at this point.
+    const TestInfo* test_info =
+      UnitTest::GetInstance()->current_test_info();
+    EXPECT_TRUE(test_info == NULL)
+        << "There should be no tests running at this point.";
+  }
+
+  // Tests that current_test_info() returns NULL after the last test in
+  // the test case has run.
+  static void TearDownTestCase() {
+    const TestInfo* test_info =
+      UnitTest::GetInstance()->current_test_info();
+    EXPECT_TRUE(test_info == NULL)
+        << "There should be no tests running at this point.";
+  }
+};
+
+// Tests that current_test_info() returns TestInfo for currently running
+// test by checking the expected test name against the actual one.
+TEST_F(CurrentTestInfoTest, WorksForFirstTestInATestCase) {
+  const TestInfo* test_info =
+    UnitTest::GetInstance()->current_test_info();
+  ASSERT_TRUE(NULL != test_info)
+      << "There is a test running so we should have a valid TestInfo.";
+  EXPECT_STREQ("CurrentTestInfoTest", test_info->test_case_name())
+      << "Expected the name of the currently running test case.";
+  EXPECT_STREQ("WorksForFirstTestInATestCase", test_info->name())
+      << "Expected the name of the currently running test.";
+}
+
+// Tests that current_test_info() returns TestInfo for currently running
+// test by checking the expected test name against the actual one.  We
+// use this test to see that the TestInfo object actually changed from
+// the previous invocation.
+TEST_F(CurrentTestInfoTest, WorksForSecondTestInATestCase) {
+  const TestInfo* test_info =
+    UnitTest::GetInstance()->current_test_info();
+  ASSERT_TRUE(NULL != test_info)
+      << "There is a test running so we should have a valid TestInfo.";
+  EXPECT_STREQ("CurrentTestInfoTest", test_info->test_case_name())
+      << "Expected the name of the currently running test case.";
+  EXPECT_STREQ("WorksForSecondTestInATestCase", test_info->name())
+      << "Expected the name of the currently running test.";
+}
+
+}  // namespace testing
+
+// These two lines test that we can define tests in a namespace that
+// has the name "testing" and is nested in another namespace.
+namespace my_namespace {
+namespace testing {
+
+// Makes sure that TEST knows to use ::testing::Test instead of
+// ::my_namespace::testing::Test.
+class Test {};
+
+// Makes sure that an assertion knows to use ::testing::Message instead of
+// ::my_namespace::testing::Message.
+class Message {};
+
+// Makes sure that an assertion knows to use
+// ::testing::AssertionResult instead of
+// ::my_namespace::testing::AssertionResult.
+class AssertionResult {};
+
+// Tests that an assertion that should succeed works as expected.
+TEST(NestedTestingNamespaceTest, Success) {
+  EXPECT_EQ(1, 1) << "This shouldn't fail.";
+}
+
+// Tests that an assertion that should fail works as expected.
+TEST(NestedTestingNamespaceTest, Failure) {
+  EXPECT_FATAL_FAILURE(FAIL() << "This failure is expected.",
+                       "This failure is expected.");
+}
+
+}  // namespace testing
+}  // namespace my_namespace
+
+// Tests that one can call superclass SetUp and TearDown methods--
+// that is, that they are not private.
+// No tests are based on this fixture; the test "passes" if it compiles
+// successfully.
+class ProtectedFixtureMethodsTest : public Test {
+ protected:
+  virtual void SetUp() {
+    Test::SetUp();
+  }
+  virtual void TearDown() {
+    Test::TearDown();
+  }
+};
+
+// StreamingAssertionsTest tests the streaming versions of a representative
+// sample of assertions.
+TEST(StreamingAssertionsTest, Unconditional) {
+  SUCCEED() << "expected success";
+  EXPECT_NONFATAL_FAILURE(ADD_FAILURE() << "expected failure",
+                          "expected failure");
+  EXPECT_FATAL_FAILURE(FAIL() << "expected failure",
+                       "expected failure");
+}
+
+#ifdef __BORLANDC__
+// Silences warnings: "Condition is always true", "Unreachable code"
+# pragma option push -w-ccc -w-rch
+#endif
+
+TEST(StreamingAssertionsTest, Truth) {
+  EXPECT_TRUE(true) << "unexpected failure";
+  ASSERT_TRUE(true) << "unexpected failure";
+  EXPECT_NONFATAL_FAILURE(EXPECT_TRUE(false) << "expected failure",
+                          "expected failure");
+  EXPECT_FATAL_FAILURE(ASSERT_TRUE(false) << "expected failure",
+                       "expected failure");
+}
+
+TEST(StreamingAssertionsTest, Truth2) {
+  EXPECT_FALSE(false) << "unexpected failure";
+  ASSERT_FALSE(false) << "unexpected failure";
+  EXPECT_NONFATAL_FAILURE(EXPECT_FALSE(true) << "expected failure",
+                          "expected failure");
+  EXPECT_FATAL_FAILURE(ASSERT_FALSE(true) << "expected failure",
+                       "expected failure");
+}
+
+#ifdef __BORLANDC__
+// Restores warnings after previous "#pragma option push" supressed them
+# pragma option pop
+#endif
+
+TEST(StreamingAssertionsTest, IntegerEquals) {
+  EXPECT_EQ(1, 1) << "unexpected failure";
+  ASSERT_EQ(1, 1) << "unexpected failure";
+  EXPECT_NONFATAL_FAILURE(EXPECT_EQ(1, 2) << "expected failure",
+                          "expected failure");
+  EXPECT_FATAL_FAILURE(ASSERT_EQ(1, 2) << "expected failure",
+                       "expected failure");
+}
+
+TEST(StreamingAssertionsTest, IntegerLessThan) {
+  EXPECT_LT(1, 2) << "unexpected failure";
+  ASSERT_LT(1, 2) << "unexpected failure";
+  EXPECT_NONFATAL_FAILURE(EXPECT_LT(2, 1) << "expected failure",
+                          "expected failure");
+  EXPECT_FATAL_FAILURE(ASSERT_LT(2, 1) << "expected failure",
+                       "expected failure");
+}
+
+TEST(StreamingAssertionsTest, StringsEqual) {
+  EXPECT_STREQ("foo", "foo") << "unexpected failure";
+  ASSERT_STREQ("foo", "foo") << "unexpected failure";
+  EXPECT_NONFATAL_FAILURE(EXPECT_STREQ("foo", "bar") << "expected failure",
+                          "expected failure");
+  EXPECT_FATAL_FAILURE(ASSERT_STREQ("foo", "bar") << "expected failure",
+                       "expected failure");
+}
+
+TEST(StreamingAssertionsTest, StringsNotEqual) {
+  EXPECT_STRNE("foo", "bar") << "unexpected failure";
+  ASSERT_STRNE("foo", "bar") << "unexpected failure";
+  EXPECT_NONFATAL_FAILURE(EXPECT_STRNE("foo", "foo") << "expected failure",
+                          "expected failure");
+  EXPECT_FATAL_FAILURE(ASSERT_STRNE("foo", "foo") << "expected failure",
+                       "expected failure");
+}
+
+TEST(StreamingAssertionsTest, StringsEqualIgnoringCase) {
+  EXPECT_STRCASEEQ("foo", "FOO") << "unexpected failure";
+  ASSERT_STRCASEEQ("foo", "FOO") << "unexpected failure";
+  EXPECT_NONFATAL_FAILURE(EXPECT_STRCASEEQ("foo", "bar") << "expected failure",
+                          "expected failure");
+  EXPECT_FATAL_FAILURE(ASSERT_STRCASEEQ("foo", "bar") << "expected failure",
+                       "expected failure");
+}
+
+TEST(StreamingAssertionsTest, StringNotEqualIgnoringCase) {
+  EXPECT_STRCASENE("foo", "bar") << "unexpected failure";
+  ASSERT_STRCASENE("foo", "bar") << "unexpected failure";
+  EXPECT_NONFATAL_FAILURE(EXPECT_STRCASENE("foo", "FOO") << "expected failure",
+                          "expected failure");
+  EXPECT_FATAL_FAILURE(ASSERT_STRCASENE("bar", "BAR") << "expected failure",
+                       "expected failure");
+}
+
+TEST(StreamingAssertionsTest, FloatingPointEquals) {
+  EXPECT_FLOAT_EQ(1.0, 1.0) << "unexpected failure";
+  ASSERT_FLOAT_EQ(1.0, 1.0) << "unexpected failure";
+  EXPECT_NONFATAL_FAILURE(EXPECT_FLOAT_EQ(0.0, 1.0) << "expected failure",
+                          "expected failure");
+  EXPECT_FATAL_FAILURE(ASSERT_FLOAT_EQ(0.0, 1.0) << "expected failure",
+                       "expected failure");
+}
+
+#if GTEST_HAS_EXCEPTIONS
+
+TEST(StreamingAssertionsTest, Throw) {
+  EXPECT_THROW(ThrowAnInteger(), int) << "unexpected failure";
+  ASSERT_THROW(ThrowAnInteger(), int) << "unexpected failure";
+  EXPECT_NONFATAL_FAILURE(EXPECT_THROW(ThrowAnInteger(), bool) <<
+                          "expected failure", "expected failure");
+  EXPECT_FATAL_FAILURE(ASSERT_THROW(ThrowAnInteger(), bool) <<
+                       "expected failure", "expected failure");
+}
+
+TEST(StreamingAssertionsTest, NoThrow) {
+  EXPECT_NO_THROW(ThrowNothing()) << "unexpected failure";
+  ASSERT_NO_THROW(ThrowNothing()) << "unexpected failure";
+  EXPECT_NONFATAL_FAILURE(EXPECT_NO_THROW(ThrowAnInteger()) <<
+                          "expected failure", "expected failure");
+  EXPECT_FATAL_FAILURE(ASSERT_NO_THROW(ThrowAnInteger()) <<
+                       "expected failure", "expected failure");
+}
+
+TEST(StreamingAssertionsTest, AnyThrow) {
+  EXPECT_ANY_THROW(ThrowAnInteger()) << "unexpected failure";
+  ASSERT_ANY_THROW(ThrowAnInteger()) << "unexpected failure";
+  EXPECT_NONFATAL_FAILURE(EXPECT_ANY_THROW(ThrowNothing()) <<
+                          "expected failure", "expected failure");
+  EXPECT_FATAL_FAILURE(ASSERT_ANY_THROW(ThrowNothing()) <<
+                       "expected failure", "expected failure");
+}
+
+#endif  // GTEST_HAS_EXCEPTIONS
+
+// Tests that Google Test correctly decides whether to use colors in the output.
+
+TEST(ColoredOutputTest, UsesColorsWhenGTestColorFlagIsYes) {
+  GTEST_FLAG(color) = "yes";
+
+  SetEnv("TERM", "xterm");  // TERM supports colors.
+  EXPECT_TRUE(ShouldUseColor(true));  // Stdout is a TTY.
+  EXPECT_TRUE(ShouldUseColor(false));  // Stdout is not a TTY.
+
+  SetEnv("TERM", "dumb");  // TERM doesn't support colors.
+  EXPECT_TRUE(ShouldUseColor(true));  // Stdout is a TTY.
+  EXPECT_TRUE(ShouldUseColor(false));  // Stdout is not a TTY.
+}
+
+TEST(ColoredOutputTest, UsesColorsWhenGTestColorFlagIsAliasOfYes) {
+  SetEnv("TERM", "dumb");  // TERM doesn't support colors.
+
+  GTEST_FLAG(color) = "True";
+  EXPECT_TRUE(ShouldUseColor(false));  // Stdout is not a TTY.
+
+  GTEST_FLAG(color) = "t";
+  EXPECT_TRUE(ShouldUseColor(false));  // Stdout is not a TTY.
+
+  GTEST_FLAG(color) = "1";
+  EXPECT_TRUE(ShouldUseColor(false));  // Stdout is not a TTY.
+}
+
+TEST(ColoredOutputTest, UsesNoColorWhenGTestColorFlagIsNo) {
+  GTEST_FLAG(color) = "no";
+
+  SetEnv("TERM", "xterm");  // TERM supports colors.
+  EXPECT_FALSE(ShouldUseColor(true));  // Stdout is a TTY.
+  EXPECT_FALSE(ShouldUseColor(false));  // Stdout is not a TTY.
+
+  SetEnv("TERM", "dumb");  // TERM doesn't support colors.
+  EXPECT_FALSE(ShouldUseColor(true));  // Stdout is a TTY.
+  EXPECT_FALSE(ShouldUseColor(false));  // Stdout is not a TTY.
+}
+
+TEST(ColoredOutputTest, UsesNoColorWhenGTestColorFlagIsInvalid) {
+  SetEnv("TERM", "xterm");  // TERM supports colors.
+
+  GTEST_FLAG(color) = "F";
+  EXPECT_FALSE(ShouldUseColor(true));  // Stdout is a TTY.
+
+  GTEST_FLAG(color) = "0";
+  EXPECT_FALSE(ShouldUseColor(true));  // Stdout is a TTY.
+
+  GTEST_FLAG(color) = "unknown";
+  EXPECT_FALSE(ShouldUseColor(true));  // Stdout is a TTY.
+}
+
+TEST(ColoredOutputTest, UsesColorsWhenStdoutIsTty) {
+  GTEST_FLAG(color) = "auto";
+
+  SetEnv("TERM", "xterm");  // TERM supports colors.
+  EXPECT_FALSE(ShouldUseColor(false));  // Stdout is not a TTY.
+  EXPECT_TRUE(ShouldUseColor(true));    // Stdout is a TTY.
+}
+
+TEST(ColoredOutputTest, UsesColorsWhenTermSupportsColors) {
+  GTEST_FLAG(color) = "auto";
+
+#if GTEST_OS_WINDOWS
+  // On Windows, we ignore the TERM variable as it's usually not set.
+
+  SetEnv("TERM", "dumb");
+  EXPECT_TRUE(ShouldUseColor(true));  // Stdout is a TTY.
+
+  SetEnv("TERM", "");
+  EXPECT_TRUE(ShouldUseColor(true));  // Stdout is a TTY.
+
+  SetEnv("TERM", "xterm");
+  EXPECT_TRUE(ShouldUseColor(true));  // Stdout is a TTY.
+#else
+  // On non-Windows platforms, we rely on TERM to determine if the
+  // terminal supports colors.
+
+  SetEnv("TERM", "dumb");  // TERM doesn't support colors.
+  EXPECT_FALSE(ShouldUseColor(true));  // Stdout is a TTY.
+
+  SetEnv("TERM", "emacs");  // TERM doesn't support colors.
+  EXPECT_FALSE(ShouldUseColor(true));  // Stdout is a TTY.
+
+  SetEnv("TERM", "vt100");  // TERM doesn't support colors.
+  EXPECT_FALSE(ShouldUseColor(true));  // Stdout is a TTY.
+
+  SetEnv("TERM", "xterm-mono");  // TERM doesn't support colors.
+  EXPECT_FALSE(ShouldUseColor(true));  // Stdout is a TTY.
+
+  SetEnv("TERM", "xterm");  // TERM supports colors.
+  EXPECT_TRUE(ShouldUseColor(true));  // Stdout is a TTY.
+
+  SetEnv("TERM", "xterm-color");  // TERM supports colors.
+  EXPECT_TRUE(ShouldUseColor(true));  // Stdout is a TTY.
+
+  SetEnv("TERM", "xterm-256color");  // TERM supports colors.
+  EXPECT_TRUE(ShouldUseColor(true));  // Stdout is a TTY.
+
+  SetEnv("TERM", "screen");  // TERM supports colors.
+  EXPECT_TRUE(ShouldUseColor(true));  // Stdout is a TTY.
+
+  SetEnv("TERM", "screen-256color");  // TERM supports colors.
+  EXPECT_TRUE(ShouldUseColor(true));  // Stdout is a TTY.
+
+  SetEnv("TERM", "linux");  // TERM supports colors.
+  EXPECT_TRUE(ShouldUseColor(true));  // Stdout is a TTY.
+
+  SetEnv("TERM", "cygwin");  // TERM supports colors.
+  EXPECT_TRUE(ShouldUseColor(true));  // Stdout is a TTY.
+#endif  // GTEST_OS_WINDOWS
+}
+
+// Verifies that StaticAssertTypeEq works in a namespace scope.
+
+static bool dummy1 GTEST_ATTRIBUTE_UNUSED_ = StaticAssertTypeEq<bool, bool>();
+static bool dummy2 GTEST_ATTRIBUTE_UNUSED_ =
+    StaticAssertTypeEq<const int, const int>();
+
+// Verifies that StaticAssertTypeEq works in a class.
+
+template <typename T>
+class StaticAssertTypeEqTestHelper {
+ public:
+  StaticAssertTypeEqTestHelper() { StaticAssertTypeEq<bool, T>(); }
+};
+
+TEST(StaticAssertTypeEqTest, WorksInClass) {
+  StaticAssertTypeEqTestHelper<bool>();
+}
+
+// Verifies that StaticAssertTypeEq works inside a function.
+
+typedef int IntAlias;
+
+TEST(StaticAssertTypeEqTest, CompilesForEqualTypes) {
+  StaticAssertTypeEq<int, IntAlias>();
+  StaticAssertTypeEq<int*, IntAlias*>();
+}
+
+TEST(GetCurrentOsStackTraceExceptTopTest, ReturnsTheStackTrace) {
+  testing::UnitTest* const unit_test = testing::UnitTest::GetInstance();
+
+  // We don't have a stack walker in Google Test yet.
+  EXPECT_STREQ("", GetCurrentOsStackTraceExceptTop(unit_test, 0).c_str());
+  EXPECT_STREQ("", GetCurrentOsStackTraceExceptTop(unit_test, 1).c_str());
+}
+
+TEST(HasNonfatalFailureTest, ReturnsFalseWhenThereIsNoFailure) {
+  EXPECT_FALSE(HasNonfatalFailure());
+}
+
+static void FailFatally() { FAIL(); }
+
+TEST(HasNonfatalFailureTest, ReturnsFalseWhenThereIsOnlyFatalFailure) {
+  FailFatally();
+  const bool has_nonfatal_failure = HasNonfatalFailure();
+  ClearCurrentTestPartResults();
+  EXPECT_FALSE(has_nonfatal_failure);
+}
+
+TEST(HasNonfatalFailureTest, ReturnsTrueWhenThereIsNonfatalFailure) {
+  ADD_FAILURE();
+  const bool has_nonfatal_failure = HasNonfatalFailure();
+  ClearCurrentTestPartResults();
+  EXPECT_TRUE(has_nonfatal_failure);
+}
+
+TEST(HasNonfatalFailureTest, ReturnsTrueWhenThereAreFatalAndNonfatalFailures) {
+  FailFatally();
+  ADD_FAILURE();
+  const bool has_nonfatal_failure = HasNonfatalFailure();
+  ClearCurrentTestPartResults();
+  EXPECT_TRUE(has_nonfatal_failure);
+}
+
+// A wrapper for calling HasNonfatalFailure outside of a test body.
+static bool HasNonfatalFailureHelper() {
+  return testing::Test::HasNonfatalFailure();
+}
+
+TEST(HasNonfatalFailureTest, WorksOutsideOfTestBody) {
+  EXPECT_FALSE(HasNonfatalFailureHelper());
+}
+
+TEST(HasNonfatalFailureTest, WorksOutsideOfTestBody2) {
+  ADD_FAILURE();
+  const bool has_nonfatal_failure = HasNonfatalFailureHelper();
+  ClearCurrentTestPartResults();
+  EXPECT_TRUE(has_nonfatal_failure);
+}
+
+TEST(HasFailureTest, ReturnsFalseWhenThereIsNoFailure) {
+  EXPECT_FALSE(HasFailure());
+}
+
+TEST(HasFailureTest, ReturnsTrueWhenThereIsFatalFailure) {
+  FailFatally();
+  const bool has_failure = HasFailure();
+  ClearCurrentTestPartResults();
+  EXPECT_TRUE(has_failure);
+}
+
+TEST(HasFailureTest, ReturnsTrueWhenThereIsNonfatalFailure) {
+  ADD_FAILURE();
+  const bool has_failure = HasFailure();
+  ClearCurrentTestPartResults();
+  EXPECT_TRUE(has_failure);
+}
+
+TEST(HasFailureTest, ReturnsTrueWhenThereAreFatalAndNonfatalFailures) {
+  FailFatally();
+  ADD_FAILURE();
+  const bool has_failure = HasFailure();
+  ClearCurrentTestPartResults();
+  EXPECT_TRUE(has_failure);
+}
+
+// A wrapper for calling HasFailure outside of a test body.
+static bool HasFailureHelper() { return testing::Test::HasFailure(); }
+
+TEST(HasFailureTest, WorksOutsideOfTestBody) {
+  EXPECT_FALSE(HasFailureHelper());
+}
+
+TEST(HasFailureTest, WorksOutsideOfTestBody2) {
+  ADD_FAILURE();
+  const bool has_failure = HasFailureHelper();
+  ClearCurrentTestPartResults();
+  EXPECT_TRUE(has_failure);
+}
+
+class TestListener : public EmptyTestEventListener {
+ public:
+  TestListener() : on_start_counter_(NULL), is_destroyed_(NULL) {}
+  TestListener(int* on_start_counter, bool* is_destroyed)
+      : on_start_counter_(on_start_counter),
+        is_destroyed_(is_destroyed) {}
+
+  virtual ~TestListener() {
+    if (is_destroyed_)
+      *is_destroyed_ = true;
+  }
+
+ protected:
+  virtual void OnTestProgramStart(const UnitTest& /*unit_test*/) {
+    if (on_start_counter_ != NULL)
+      (*on_start_counter_)++;
+  }
+
+ private:
+  int* on_start_counter_;
+  bool* is_destroyed_;
+};
+
+// Tests the constructor.
+TEST(TestEventListenersTest, ConstructionWorks) {
+  TestEventListeners listeners;
+
+  EXPECT_TRUE(TestEventListenersAccessor::GetRepeater(&listeners) != NULL);
+  EXPECT_TRUE(listeners.default_result_printer() == NULL);
+  EXPECT_TRUE(listeners.default_xml_generator() == NULL);
+}
+
+// Tests that the TestEventListeners destructor deletes all the listeners it
+// owns.
+TEST(TestEventListenersTest, DestructionWorks) {
+  bool default_result_printer_is_destroyed = false;
+  bool default_xml_printer_is_destroyed = false;
+  bool extra_listener_is_destroyed = false;
+  TestListener* default_result_printer = new TestListener(
+      NULL, &default_result_printer_is_destroyed);
+  TestListener* default_xml_printer = new TestListener(
+      NULL, &default_xml_printer_is_destroyed);
+  TestListener* extra_listener = new TestListener(
+      NULL, &extra_listener_is_destroyed);
+
+  {
+    TestEventListeners listeners;
+    TestEventListenersAccessor::SetDefaultResultPrinter(&listeners,
+                                                        default_result_printer);
+    TestEventListenersAccessor::SetDefaultXmlGenerator(&listeners,
+                                                       default_xml_printer);
+    listeners.Append(extra_listener);
+  }
+  EXPECT_TRUE(default_result_printer_is_destroyed);
+  EXPECT_TRUE(default_xml_printer_is_destroyed);
+  EXPECT_TRUE(extra_listener_is_destroyed);
+}
+
+// Tests that a listener Append'ed to a TestEventListeners list starts
+// receiving events.
+TEST(TestEventListenersTest, Append) {
+  int on_start_counter = 0;
+  bool is_destroyed = false;
+  TestListener* listener = new TestListener(&on_start_counter, &is_destroyed);
+  {
+    TestEventListeners listeners;
+    listeners.Append(listener);
+    TestEventListenersAccessor::GetRepeater(&listeners)->OnTestProgramStart(
+        *UnitTest::GetInstance());
+    EXPECT_EQ(1, on_start_counter);
+  }
+  EXPECT_TRUE(is_destroyed);
+}
+
+// Tests that listeners receive events in the order they were appended to
+// the list, except for *End requests, which must be received in the reverse
+// order.
+class SequenceTestingListener : public EmptyTestEventListener {
+ public:
+  SequenceTestingListener(std::vector<std::string>* vector, const char* id)
+      : vector_(vector), id_(id) {}
+
+ protected:
+  virtual void OnTestProgramStart(const UnitTest& /*unit_test*/) {
+    vector_->push_back(GetEventDescription("OnTestProgramStart"));
+  }
+
+  virtual void OnTestProgramEnd(const UnitTest& /*unit_test*/) {
+    vector_->push_back(GetEventDescription("OnTestProgramEnd"));
+  }
+
+  virtual void OnTestIterationStart(const UnitTest& /*unit_test*/,
+                                    int /*iteration*/) {
+    vector_->push_back(GetEventDescription("OnTestIterationStart"));
+  }
+
+  virtual void OnTestIterationEnd(const UnitTest& /*unit_test*/,
+                                  int /*iteration*/) {
+    vector_->push_back(GetEventDescription("OnTestIterationEnd"));
+  }
+
+ private:
+  std::string GetEventDescription(const char* method) {
+    Message message;
+    message << id_ << "." << method;
+    return message.GetString();
+  }
+
+  std::vector<std::string>* vector_;
+  const char* const id_;
+
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(SequenceTestingListener);
+};
+
+TEST(EventListenerTest, AppendKeepsOrder) {
+  std::vector<std::string> vec;
+  TestEventListeners listeners;
+  listeners.Append(new SequenceTestingListener(&vec, "1st"));
+  listeners.Append(new SequenceTestingListener(&vec, "2nd"));
+  listeners.Append(new SequenceTestingListener(&vec, "3rd"));
+
+  TestEventListenersAccessor::GetRepeater(&listeners)->OnTestProgramStart(
+      *UnitTest::GetInstance());
+  ASSERT_EQ(3U, vec.size());
+  EXPECT_STREQ("1st.OnTestProgramStart", vec[0].c_str());
+  EXPECT_STREQ("2nd.OnTestProgramStart", vec[1].c_str());
+  EXPECT_STREQ("3rd.OnTestProgramStart", vec[2].c_str());
+
+  vec.clear();
+  TestEventListenersAccessor::GetRepeater(&listeners)->OnTestProgramEnd(
+      *UnitTest::GetInstance());
+  ASSERT_EQ(3U, vec.size());
+  EXPECT_STREQ("3rd.OnTestProgramEnd", vec[0].c_str());
+  EXPECT_STREQ("2nd.OnTestProgramEnd", vec[1].c_str());
+  EXPECT_STREQ("1st.OnTestProgramEnd", vec[2].c_str());
+
+  vec.clear();
+  TestEventListenersAccessor::GetRepeater(&listeners)->OnTestIterationStart(
+      *UnitTest::GetInstance(), 0);
+  ASSERT_EQ(3U, vec.size());
+  EXPECT_STREQ("1st.OnTestIterationStart", vec[0].c_str());
+  EXPECT_STREQ("2nd.OnTestIterationStart", vec[1].c_str());
+  EXPECT_STREQ("3rd.OnTestIterationStart", vec[2].c_str());
+
+  vec.clear();
+  TestEventListenersAccessor::GetRepeater(&listeners)->OnTestIterationEnd(
+      *UnitTest::GetInstance(), 0);
+  ASSERT_EQ(3U, vec.size());
+  EXPECT_STREQ("3rd.OnTestIterationEnd", vec[0].c_str());
+  EXPECT_STREQ("2nd.OnTestIterationEnd", vec[1].c_str());
+  EXPECT_STREQ("1st.OnTestIterationEnd", vec[2].c_str());
+}
+
+// Tests that a listener removed from a TestEventListeners list stops receiving
+// events and is not deleted when the list is destroyed.
+TEST(TestEventListenersTest, Release) {
+  int on_start_counter = 0;
+  bool is_destroyed = false;
+  // Although Append passes the ownership of this object to the list,
+  // the following calls release it, and we need to delete it before the
+  // test ends.
+  TestListener* listener = new TestListener(&on_start_counter, &is_destroyed);
+  {
+    TestEventListeners listeners;
+    listeners.Append(listener);
+    EXPECT_EQ(listener, listeners.Release(listener));
+    TestEventListenersAccessor::GetRepeater(&listeners)->OnTestProgramStart(
+        *UnitTest::GetInstance());
+    EXPECT_TRUE(listeners.Release(listener) == NULL);
+  }
+  EXPECT_EQ(0, on_start_counter);
+  EXPECT_FALSE(is_destroyed);
+  delete listener;
+}
+
+// Tests that no events are forwarded when event forwarding is disabled.
+TEST(EventListenerTest, SuppressEventForwarding) {
+  int on_start_counter = 0;
+  TestListener* listener = new TestListener(&on_start_counter, NULL);
+
+  TestEventListeners listeners;
+  listeners.Append(listener);
+  ASSERT_TRUE(TestEventListenersAccessor::EventForwardingEnabled(listeners));
+  TestEventListenersAccessor::SuppressEventForwarding(&listeners);
+  ASSERT_FALSE(TestEventListenersAccessor::EventForwardingEnabled(listeners));
+  TestEventListenersAccessor::GetRepeater(&listeners)->OnTestProgramStart(
+      *UnitTest::GetInstance());
+  EXPECT_EQ(0, on_start_counter);
+}
+
+// Tests that events generated by Google Test are not forwarded in
+// death test subprocesses.
+TEST(EventListenerDeathTest, EventsNotForwardedInDeathTestSubprecesses) {
+  EXPECT_DEATH_IF_SUPPORTED({
+      GTEST_CHECK_(TestEventListenersAccessor::EventForwardingEnabled(
+          *GetUnitTestImpl()->listeners())) << "expected failure";},
+      "expected failure");
+}
+
+// Tests that a listener installed via SetDefaultResultPrinter() starts
+// receiving events and is returned via default_result_printer() and that
+// the previous default_result_printer is removed from the list and deleted.
+TEST(EventListenerTest, default_result_printer) {
+  int on_start_counter = 0;
+  bool is_destroyed = false;
+  TestListener* listener = new TestListener(&on_start_counter, &is_destroyed);
+
+  TestEventListeners listeners;
+  TestEventListenersAccessor::SetDefaultResultPrinter(&listeners, listener);
+
+  EXPECT_EQ(listener, listeners.default_result_printer());
+
+  TestEventListenersAccessor::GetRepeater(&listeners)->OnTestProgramStart(
+      *UnitTest::GetInstance());
+
+  EXPECT_EQ(1, on_start_counter);
+
+  // Replacing default_result_printer with something else should remove it
+  // from the list and destroy it.
+  TestEventListenersAccessor::SetDefaultResultPrinter(&listeners, NULL);
+
+  EXPECT_TRUE(listeners.default_result_printer() == NULL);
+  EXPECT_TRUE(is_destroyed);
+
+  // After broadcasting an event the counter is still the same, indicating
+  // the listener is not in the list anymore.
+  TestEventListenersAccessor::GetRepeater(&listeners)->OnTestProgramStart(
+      *UnitTest::GetInstance());
+  EXPECT_EQ(1, on_start_counter);
+}
+
+// Tests that the default_result_printer listener stops receiving events
+// when removed via Release and that is not owned by the list anymore.
+TEST(EventListenerTest, RemovingDefaultResultPrinterWorks) {
+  int on_start_counter = 0;
+  bool is_destroyed = false;
+  // Although Append passes the ownership of this object to the list,
+  // the following calls release it, and we need to delete it before the
+  // test ends.
+  TestListener* listener = new TestListener(&on_start_counter, &is_destroyed);
+  {
+    TestEventListeners listeners;
+    TestEventListenersAccessor::SetDefaultResultPrinter(&listeners, listener);
+
+    EXPECT_EQ(listener, listeners.Release(listener));
+    EXPECT_TRUE(listeners.default_result_printer() == NULL);
+    EXPECT_FALSE(is_destroyed);
+
+    // Broadcasting events now should not affect default_result_printer.
+    TestEventListenersAccessor::GetRepeater(&listeners)->OnTestProgramStart(
+        *UnitTest::GetInstance());
+    EXPECT_EQ(0, on_start_counter);
+  }
+  // Destroying the list should not affect the listener now, too.
+  EXPECT_FALSE(is_destroyed);
+  delete listener;
+}
+
+// Tests that a listener installed via SetDefaultXmlGenerator() starts
+// receiving events and is returned via default_xml_generator() and that
+// the previous default_xml_generator is removed from the list and deleted.
+TEST(EventListenerTest, default_xml_generator) {
+  int on_start_counter = 0;
+  bool is_destroyed = false;
+  TestListener* listener = new TestListener(&on_start_counter, &is_destroyed);
+
+  TestEventListeners listeners;
+  TestEventListenersAccessor::SetDefaultXmlGenerator(&listeners, listener);
+
+  EXPECT_EQ(listener, listeners.default_xml_generator());
+
+  TestEventListenersAccessor::GetRepeater(&listeners)->OnTestProgramStart(
+      *UnitTest::GetInstance());
+
+  EXPECT_EQ(1, on_start_counter);
+
+  // Replacing default_xml_generator with something else should remove it
+  // from the list and destroy it.
+  TestEventListenersAccessor::SetDefaultXmlGenerator(&listeners, NULL);
+
+  EXPECT_TRUE(listeners.default_xml_generator() == NULL);
+  EXPECT_TRUE(is_destroyed);
+
+  // After broadcasting an event the counter is still the same, indicating
+  // the listener is not in the list anymore.
+  TestEventListenersAccessor::GetRepeater(&listeners)->OnTestProgramStart(
+      *UnitTest::GetInstance());
+  EXPECT_EQ(1, on_start_counter);
+}
+
+// Tests that the default_xml_generator listener stops receiving events
+// when removed via Release and that is not owned by the list anymore.
+TEST(EventListenerTest, RemovingDefaultXmlGeneratorWorks) {
+  int on_start_counter = 0;
+  bool is_destroyed = false;
+  // Although Append passes the ownership of this object to the list,
+  // the following calls release it, and we need to delete it before the
+  // test ends.
+  TestListener* listener = new TestListener(&on_start_counter, &is_destroyed);
+  {
+    TestEventListeners listeners;
+    TestEventListenersAccessor::SetDefaultXmlGenerator(&listeners, listener);
+
+    EXPECT_EQ(listener, listeners.Release(listener));
+    EXPECT_TRUE(listeners.default_xml_generator() == NULL);
+    EXPECT_FALSE(is_destroyed);
+
+    // Broadcasting events now should not affect default_xml_generator.
+    TestEventListenersAccessor::GetRepeater(&listeners)->OnTestProgramStart(
+        *UnitTest::GetInstance());
+    EXPECT_EQ(0, on_start_counter);
+  }
+  // Destroying the list should not affect the listener now, too.
+  EXPECT_FALSE(is_destroyed);
+  delete listener;
+}
+
+// Sanity tests to ensure that the alternative, verbose spellings of
+// some of the macros work.  We don't test them thoroughly as that
+// would be quite involved.  Since their implementations are
+// straightforward, and they are rarely used, we'll just rely on the
+// users to tell us when they are broken.
+GTEST_TEST(AlternativeNameTest, Works) {  // GTEST_TEST is the same as TEST.
+  GTEST_SUCCEED() << "OK";  // GTEST_SUCCEED is the same as SUCCEED.
+
+  // GTEST_FAIL is the same as FAIL.
+  EXPECT_FATAL_FAILURE(GTEST_FAIL() << "An expected failure",
+                       "An expected failure");
+
+  // GTEST_ASSERT_XY is the same as ASSERT_XY.
+
+  GTEST_ASSERT_EQ(0, 0);
+  EXPECT_FATAL_FAILURE(GTEST_ASSERT_EQ(0, 1) << "An expected failure",
+                       "An expected failure");
+  EXPECT_FATAL_FAILURE(GTEST_ASSERT_EQ(1, 0) << "An expected failure",
+                       "An expected failure");
+
+  GTEST_ASSERT_NE(0, 1);
+  GTEST_ASSERT_NE(1, 0);
+  EXPECT_FATAL_FAILURE(GTEST_ASSERT_NE(0, 0) << "An expected failure",
+                       "An expected failure");
+
+  GTEST_ASSERT_LE(0, 0);
+  GTEST_ASSERT_LE(0, 1);
+  EXPECT_FATAL_FAILURE(GTEST_ASSERT_LE(1, 0) << "An expected failure",
+                       "An expected failure");
+
+  GTEST_ASSERT_LT(0, 1);
+  EXPECT_FATAL_FAILURE(GTEST_ASSERT_LT(0, 0) << "An expected failure",
+                       "An expected failure");
+  EXPECT_FATAL_FAILURE(GTEST_ASSERT_LT(1, 0) << "An expected failure",
+                       "An expected failure");
+
+  GTEST_ASSERT_GE(0, 0);
+  GTEST_ASSERT_GE(1, 0);
+  EXPECT_FATAL_FAILURE(GTEST_ASSERT_GE(0, 1) << "An expected failure",
+                       "An expected failure");
+
+  GTEST_ASSERT_GT(1, 0);
+  EXPECT_FATAL_FAILURE(GTEST_ASSERT_GT(0, 1) << "An expected failure",
+                       "An expected failure");
+  EXPECT_FATAL_FAILURE(GTEST_ASSERT_GT(1, 1) << "An expected failure",
+                       "An expected failure");
+}
+
+// Tests for internal utilities necessary for implementation of the universal
+// printing.
+// TODO(vladl at google.com): Find a better home for them.
+
+class ConversionHelperBase {};
+class ConversionHelperDerived : public ConversionHelperBase {};
+
+// Tests that IsAProtocolMessage<T>::value is a compile-time constant.
+TEST(IsAProtocolMessageTest, ValueIsCompileTimeConstant) {
+  GTEST_COMPILE_ASSERT_(IsAProtocolMessage<ProtocolMessage>::value,
+                        const_true);
+  GTEST_COMPILE_ASSERT_(!IsAProtocolMessage<int>::value, const_false);
+}
+
+// Tests that IsAProtocolMessage<T>::value is true when T is
+// proto2::Message or a sub-class of it.
+TEST(IsAProtocolMessageTest, ValueIsTrueWhenTypeIsAProtocolMessage) {
+  EXPECT_TRUE(IsAProtocolMessage< ::proto2::Message>::value);
+  EXPECT_TRUE(IsAProtocolMessage<ProtocolMessage>::value);
+}
+
+// Tests that IsAProtocolMessage<T>::value is false when T is neither
+// ProtocolMessage nor a sub-class of it.
+TEST(IsAProtocolMessageTest, ValueIsFalseWhenTypeIsNotAProtocolMessage) {
+  EXPECT_FALSE(IsAProtocolMessage<int>::value);
+  EXPECT_FALSE(IsAProtocolMessage<const ConversionHelperBase>::value);
+}
+
+// Tests that CompileAssertTypesEqual compiles when the type arguments are
+// equal.
+TEST(CompileAssertTypesEqual, CompilesWhenTypesAreEqual) {
+  CompileAssertTypesEqual<void, void>();
+  CompileAssertTypesEqual<int*, int*>();
+}
+
+// Tests that RemoveReference does not affect non-reference types.
+TEST(RemoveReferenceTest, DoesNotAffectNonReferenceType) {
+  CompileAssertTypesEqual<int, RemoveReference<int>::type>();
+  CompileAssertTypesEqual<const char, RemoveReference<const char>::type>();
+}
+
+// Tests that RemoveReference removes reference from reference types.
+TEST(RemoveReferenceTest, RemovesReference) {
+  CompileAssertTypesEqual<int, RemoveReference<int&>::type>();
+  CompileAssertTypesEqual<const char, RemoveReference<const char&>::type>();
+}
+
+// Tests GTEST_REMOVE_REFERENCE_.
+
+template <typename T1, typename T2>
+void TestGTestRemoveReference() {
+  CompileAssertTypesEqual<T1, GTEST_REMOVE_REFERENCE_(T2)>();
+}
+
+TEST(RemoveReferenceTest, MacroVersion) {
+  TestGTestRemoveReference<int, int>();
+  TestGTestRemoveReference<const char, const char&>();
+}
+
+
+// Tests that RemoveConst does not affect non-const types.
+TEST(RemoveConstTest, DoesNotAffectNonConstType) {
+  CompileAssertTypesEqual<int, RemoveConst<int>::type>();
+  CompileAssertTypesEqual<char&, RemoveConst<char&>::type>();
+}
+
+// Tests that RemoveConst removes const from const types.
+TEST(RemoveConstTest, RemovesConst) {
+  CompileAssertTypesEqual<int, RemoveConst<const int>::type>();
+  CompileAssertTypesEqual<char[2], RemoveConst<const char[2]>::type>();
+  CompileAssertTypesEqual<char[2][3], RemoveConst<const char[2][3]>::type>();
+}
+
+// Tests GTEST_REMOVE_CONST_.
+
+template <typename T1, typename T2>
+void TestGTestRemoveConst() {
+  CompileAssertTypesEqual<T1, GTEST_REMOVE_CONST_(T2)>();
+}
+
+TEST(RemoveConstTest, MacroVersion) {
+  TestGTestRemoveConst<int, int>();
+  TestGTestRemoveConst<double&, double&>();
+  TestGTestRemoveConst<char, const char>();
+}
+
+// Tests GTEST_REMOVE_REFERENCE_AND_CONST_.
+
+template <typename T1, typename T2>
+void TestGTestRemoveReferenceAndConst() {
+  CompileAssertTypesEqual<T1, GTEST_REMOVE_REFERENCE_AND_CONST_(T2)>();
+}
+
+TEST(RemoveReferenceToConstTest, Works) {
+  TestGTestRemoveReferenceAndConst<int, int>();
+  TestGTestRemoveReferenceAndConst<double, double&>();
+  TestGTestRemoveReferenceAndConst<char, const char>();
+  TestGTestRemoveReferenceAndConst<char, const char&>();
+  TestGTestRemoveReferenceAndConst<const char*, const char*>();
+}
+
+// Tests that AddReference does not affect reference types.
+TEST(AddReferenceTest, DoesNotAffectReferenceType) {
+  CompileAssertTypesEqual<int&, AddReference<int&>::type>();
+  CompileAssertTypesEqual<const char&, AddReference<const char&>::type>();
+}
+
+// Tests that AddReference adds reference to non-reference types.
+TEST(AddReferenceTest, AddsReference) {
+  CompileAssertTypesEqual<int&, AddReference<int>::type>();
+  CompileAssertTypesEqual<const char&, AddReference<const char>::type>();
+}
+
+// Tests GTEST_ADD_REFERENCE_.
+
+template <typename T1, typename T2>
+void TestGTestAddReference() {
+  CompileAssertTypesEqual<T1, GTEST_ADD_REFERENCE_(T2)>();
+}
+
+TEST(AddReferenceTest, MacroVersion) {
+  TestGTestAddReference<int&, int>();
+  TestGTestAddReference<const char&, const char&>();
+}
+
+// Tests GTEST_REFERENCE_TO_CONST_.
+
+template <typename T1, typename T2>
+void TestGTestReferenceToConst() {
+  CompileAssertTypesEqual<T1, GTEST_REFERENCE_TO_CONST_(T2)>();
+}
+
+TEST(GTestReferenceToConstTest, Works) {
+  TestGTestReferenceToConst<const char&, char>();
+  TestGTestReferenceToConst<const int&, const int>();
+  TestGTestReferenceToConst<const double&, double>();
+  TestGTestReferenceToConst<const std::string&, const std::string&>();
+}
+
+// Tests that ImplicitlyConvertible<T1, T2>::value is a compile-time constant.
+TEST(ImplicitlyConvertibleTest, ValueIsCompileTimeConstant) {
+  GTEST_COMPILE_ASSERT_((ImplicitlyConvertible<int, int>::value), const_true);
+  GTEST_COMPILE_ASSERT_((!ImplicitlyConvertible<void*, int*>::value),
+                        const_false);
+}
+
+// Tests that ImplicitlyConvertible<T1, T2>::value is true when T1 can
+// be implicitly converted to T2.
+TEST(ImplicitlyConvertibleTest, ValueIsTrueWhenConvertible) {
+  EXPECT_TRUE((ImplicitlyConvertible<int, double>::value));
+  EXPECT_TRUE((ImplicitlyConvertible<double, int>::value));
+  EXPECT_TRUE((ImplicitlyConvertible<int*, void*>::value));
+  EXPECT_TRUE((ImplicitlyConvertible<int*, const int*>::value));
+  EXPECT_TRUE((ImplicitlyConvertible<ConversionHelperDerived&,
+                                     const ConversionHelperBase&>::value));
+  EXPECT_TRUE((ImplicitlyConvertible<const ConversionHelperBase,
+                                     ConversionHelperBase>::value));
+}
+
+// Tests that ImplicitlyConvertible<T1, T2>::value is false when T1
+// cannot be implicitly converted to T2.
+TEST(ImplicitlyConvertibleTest, ValueIsFalseWhenNotConvertible) {
+  EXPECT_FALSE((ImplicitlyConvertible<double, int*>::value));
+  EXPECT_FALSE((ImplicitlyConvertible<void*, int*>::value));
+  EXPECT_FALSE((ImplicitlyConvertible<const int*, int*>::value));
+  EXPECT_FALSE((ImplicitlyConvertible<ConversionHelperBase&,
+                                      ConversionHelperDerived&>::value));
+}
+
+// Tests IsContainerTest.
+
+class NonContainer {};
+
+TEST(IsContainerTestTest, WorksForNonContainer) {
+  EXPECT_EQ(sizeof(IsNotContainer), sizeof(IsContainerTest<int>(0)));
+  EXPECT_EQ(sizeof(IsNotContainer), sizeof(IsContainerTest<char[5]>(0)));
+  EXPECT_EQ(sizeof(IsNotContainer), sizeof(IsContainerTest<NonContainer>(0)));
+}
+
+TEST(IsContainerTestTest, WorksForContainer) {
+  EXPECT_EQ(sizeof(IsContainer),
+            sizeof(IsContainerTest<std::vector<bool> >(0)));
+  EXPECT_EQ(sizeof(IsContainer),
+            sizeof(IsContainerTest<std::map<int, double> >(0)));
+}
+
+// Tests ArrayEq().
+
+TEST(ArrayEqTest, WorksForDegeneratedArrays) {
+  EXPECT_TRUE(ArrayEq(5, 5L));
+  EXPECT_FALSE(ArrayEq('a', 0));
+}
+
+TEST(ArrayEqTest, WorksForOneDimensionalArrays) {
+  // Note that a and b are distinct but compatible types.
+  const int a[] = { 0, 1 };
+  long b[] = { 0, 1 };
+  EXPECT_TRUE(ArrayEq(a, b));
+  EXPECT_TRUE(ArrayEq(a, 2, b));
+
+  b[0] = 2;
+  EXPECT_FALSE(ArrayEq(a, b));
+  EXPECT_FALSE(ArrayEq(a, 1, b));
+}
+
+TEST(ArrayEqTest, WorksForTwoDimensionalArrays) {
+  const char a[][3] = { "hi", "lo" };
+  const char b[][3] = { "hi", "lo" };
+  const char c[][3] = { "hi", "li" };
+
+  EXPECT_TRUE(ArrayEq(a, b));
+  EXPECT_TRUE(ArrayEq(a, 2, b));
+
+  EXPECT_FALSE(ArrayEq(a, c));
+  EXPECT_FALSE(ArrayEq(a, 2, c));
+}
+
+// Tests ArrayAwareFind().
+
+TEST(ArrayAwareFindTest, WorksForOneDimensionalArray) {
+  const char a[] = "hello";
+  EXPECT_EQ(a + 4, ArrayAwareFind(a, a + 5, 'o'));
+  EXPECT_EQ(a + 5, ArrayAwareFind(a, a + 5, 'x'));
+}
+
+TEST(ArrayAwareFindTest, WorksForTwoDimensionalArray) {
+  int a[][2] = { { 0, 1 }, { 2, 3 }, { 4, 5 } };
+  const int b[2] = { 2, 3 };
+  EXPECT_EQ(a + 1, ArrayAwareFind(a, a + 3, b));
+
+  const int c[2] = { 6, 7 };
+  EXPECT_EQ(a + 3, ArrayAwareFind(a, a + 3, c));
+}
+
+// Tests CopyArray().
+
+TEST(CopyArrayTest, WorksForDegeneratedArrays) {
+  int n = 0;
+  CopyArray('a', &n);
+  EXPECT_EQ('a', n);
+}
+
+TEST(CopyArrayTest, WorksForOneDimensionalArrays) {
+  const char a[3] = "hi";
+  int b[3];
+#ifndef __BORLANDC__  // C++Builder cannot compile some array size deductions.
+  CopyArray(a, &b);
+  EXPECT_TRUE(ArrayEq(a, b));
+#endif
+
+  int c[3];
+  CopyArray(a, 3, c);
+  EXPECT_TRUE(ArrayEq(a, c));
+}
+
+TEST(CopyArrayTest, WorksForTwoDimensionalArrays) {
+  const int a[2][3] = { { 0, 1, 2 }, { 3, 4, 5 } };
+  int b[2][3];
+#ifndef __BORLANDC__  // C++Builder cannot compile some array size deductions.
+  CopyArray(a, &b);
+  EXPECT_TRUE(ArrayEq(a, b));
+#endif
+
+  int c[2][3];
+  CopyArray(a, 2, c);
+  EXPECT_TRUE(ArrayEq(a, c));
+}
+
+// Tests NativeArray.
+
+TEST(NativeArrayTest, ConstructorFromArrayWorks) {
+  const int a[3] = { 0, 1, 2 };
+  NativeArray<int> na(a, 3, kReference);
+  EXPECT_EQ(3U, na.size());
+  EXPECT_EQ(a, na.begin());
+}
+
+TEST(NativeArrayTest, CreatesAndDeletesCopyOfArrayWhenAskedTo) {
+  typedef int Array[2];
+  Array* a = new Array[1];
+  (*a)[0] = 0;
+  (*a)[1] = 1;
+  NativeArray<int> na(*a, 2, kCopy);
+  EXPECT_NE(*a, na.begin());
+  delete[] a;
+  EXPECT_EQ(0, na.begin()[0]);
+  EXPECT_EQ(1, na.begin()[1]);
+
+  // We rely on the heap checker to verify that na deletes the copy of
+  // array.
+}
+
+TEST(NativeArrayTest, TypeMembersAreCorrect) {
+  StaticAssertTypeEq<char, NativeArray<char>::value_type>();
+  StaticAssertTypeEq<int[2], NativeArray<int[2]>::value_type>();
+
+  StaticAssertTypeEq<const char*, NativeArray<char>::const_iterator>();
+  StaticAssertTypeEq<const bool(*)[2], NativeArray<bool[2]>::const_iterator>();
+}
+
+TEST(NativeArrayTest, MethodsWork) {
+  const int a[3] = { 0, 1, 2 };
+  NativeArray<int> na(a, 3, kCopy);
+  ASSERT_EQ(3U, na.size());
+  EXPECT_EQ(3, na.end() - na.begin());
+
+  NativeArray<int>::const_iterator it = na.begin();
+  EXPECT_EQ(0, *it);
+  ++it;
+  EXPECT_EQ(1, *it);
+  it++;
+  EXPECT_EQ(2, *it);
+  ++it;
+  EXPECT_EQ(na.end(), it);
+
+  EXPECT_TRUE(na == na);
+
+  NativeArray<int> na2(a, 3, kReference);
+  EXPECT_TRUE(na == na2);
+
+  const int b1[3] = { 0, 1, 1 };
+  const int b2[4] = { 0, 1, 2, 3 };
+  EXPECT_FALSE(na == NativeArray<int>(b1, 3, kReference));
+  EXPECT_FALSE(na == NativeArray<int>(b2, 4, kCopy));
+}
+
+TEST(NativeArrayTest, WorksForTwoDimensionalArray) {
+  const char a[2][3] = { "hi", "lo" };
+  NativeArray<char[3]> na(a, 2, kReference);
+  ASSERT_EQ(2U, na.size());
+  EXPECT_EQ(a, na.begin());
+}
+
+// Tests SkipPrefix().
+
+TEST(SkipPrefixTest, SkipsWhenPrefixMatches) {
+  const char* const str = "hello";
+
+  const char* p = str;
+  EXPECT_TRUE(SkipPrefix("", &p));
+  EXPECT_EQ(str, p);
+
+  p = str;
+  EXPECT_TRUE(SkipPrefix("hell", &p));
+  EXPECT_EQ(str + 4, p);
+}
+
+TEST(SkipPrefixTest, DoesNotSkipWhenPrefixDoesNotMatch) {
+  const char* const str = "world";
+
+  const char* p = str;
+  EXPECT_FALSE(SkipPrefix("W", &p));
+  EXPECT_EQ(str, p);
+
+  p = str;
+  EXPECT_FALSE(SkipPrefix("world!", &p));
+  EXPECT_EQ(str, p);
+}
diff --git a/contrib/gtest-1.7.0/test/gtest_xml_outfile1_test_.cc b/contrib/gtest-1.7.0/test/gtest_xml_outfile1_test_.cc
new file mode 100644
index 0000000..531ced4
--- /dev/null
+++ b/contrib/gtest-1.7.0/test/gtest_xml_outfile1_test_.cc
@@ -0,0 +1,49 @@
+// Copyright 2008, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: keith.ray at gmail.com (Keith Ray)
+//
+// gtest_xml_outfile1_test_ writes some xml via TestProperty used by
+// gtest_xml_outfiles_test.py
+
+#include "gtest/gtest.h"
+
+class PropertyOne : public testing::Test {
+ protected:
+  virtual void SetUp() {
+    RecordProperty("SetUpProp", 1);
+  }
+  virtual void TearDown() {
+    RecordProperty("TearDownProp", 1);
+  }
+};
+
+TEST_F(PropertyOne, TestSomeProperties) {
+  RecordProperty("TestSomeProperty", 1);
+}
diff --git a/contrib/gtest-1.7.0/test/gtest_xml_outfile2_test_.cc b/contrib/gtest-1.7.0/test/gtest_xml_outfile2_test_.cc
new file mode 100644
index 0000000..7b400b2
--- /dev/null
+++ b/contrib/gtest-1.7.0/test/gtest_xml_outfile2_test_.cc
@@ -0,0 +1,49 @@
+// Copyright 2008, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: keith.ray at gmail.com (Keith Ray)
+//
+// gtest_xml_outfile2_test_ writes some xml via TestProperty used by
+// gtest_xml_outfiles_test.py
+
+#include "gtest/gtest.h"
+
+class PropertyTwo : public testing::Test {
+ protected:
+  virtual void SetUp() {
+    RecordProperty("SetUpProp", 2);
+  }
+  virtual void TearDown() {
+    RecordProperty("TearDownProp", 2);
+  }
+};
+
+TEST_F(PropertyTwo, TestSomeProperties) {
+  RecordProperty("TestSomeProperty", 2);
+}
diff --git a/contrib/gtest-1.7.0/test/gtest_xml_outfiles_test.py b/contrib/gtest-1.7.0/test/gtest_xml_outfiles_test.py
new file mode 100755
index 0000000..524e437
--- /dev/null
+++ b/contrib/gtest-1.7.0/test/gtest_xml_outfiles_test.py
@@ -0,0 +1,132 @@
+#!/usr/bin/env python
+#
+# Copyright 2008, Google Inc.
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+#
+#     * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#     * Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following disclaimer
+# in the documentation and/or other materials provided with the
+# distribution.
+#     * Neither the name of Google Inc. nor the names of its
+# contributors may be used to endorse or promote products derived from
+# this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+"""Unit test for the gtest_xml_output module."""
+
+__author__ = "keith.ray at gmail.com (Keith Ray)"
+
+import os
+from xml.dom import minidom, Node
+
+import gtest_test_utils
+import gtest_xml_test_utils
+
+
+GTEST_OUTPUT_SUBDIR = "xml_outfiles"
+GTEST_OUTPUT_1_TEST = "gtest_xml_outfile1_test_"
+GTEST_OUTPUT_2_TEST = "gtest_xml_outfile2_test_"
+
+EXPECTED_XML_1 = """<?xml version="1.0" encoding="UTF-8"?>
+<testsuites tests="1" failures="0" disabled="0" errors="0" time="*" timestamp="*" name="AllTests">
+  <testsuite name="PropertyOne" tests="1" failures="0" disabled="0" errors="0" time="*">
+    <testcase name="TestSomeProperties" status="run" time="*" classname="PropertyOne" SetUpProp="1" TestSomeProperty="1" TearDownProp="1" />
+  </testsuite>
+</testsuites>
+"""
+
+EXPECTED_XML_2 = """<?xml version="1.0" encoding="UTF-8"?>
+<testsuites tests="1" failures="0" disabled="0" errors="0" time="*" timestamp="*" name="AllTests">
+  <testsuite name="PropertyTwo" tests="1" failures="0" disabled="0" errors="0" time="*">
+    <testcase name="TestSomeProperties" status="run" time="*" classname="PropertyTwo" SetUpProp="2" TestSomeProperty="2" TearDownProp="2" />
+  </testsuite>
+</testsuites>
+"""
+
+
+class GTestXMLOutFilesTest(gtest_xml_test_utils.GTestXMLTestCase):
+  """Unit test for Google Test's XML output functionality."""
+
+  def setUp(self):
+    # We want the trailing '/' that the last "" provides in os.path.join, for
+    # telling Google Test to create an output directory instead of a single file
+    # for xml output.
+    self.output_dir_ = os.path.join(gtest_test_utils.GetTempDir(),
+                                    GTEST_OUTPUT_SUBDIR, "")
+    self.DeleteFilesAndDir()
+
+  def tearDown(self):
+    self.DeleteFilesAndDir()
+
+  def DeleteFilesAndDir(self):
+    try:
+      os.remove(os.path.join(self.output_dir_, GTEST_OUTPUT_1_TEST + ".xml"))
+    except os.error:
+      pass
+    try:
+      os.remove(os.path.join(self.output_dir_, GTEST_OUTPUT_2_TEST + ".xml"))
+    except os.error:
+      pass
+    try:
+      os.rmdir(self.output_dir_)
+    except os.error:
+      pass
+
+  def testOutfile1(self):
+    self._TestOutFile(GTEST_OUTPUT_1_TEST, EXPECTED_XML_1)
+
+  def testOutfile2(self):
+    self._TestOutFile(GTEST_OUTPUT_2_TEST, EXPECTED_XML_2)
+
+  def _TestOutFile(self, test_name, expected_xml):
+    gtest_prog_path = gtest_test_utils.GetTestExecutablePath(test_name)
+    command = [gtest_prog_path, "--gtest_output=xml:%s" % self.output_dir_]
+    p = gtest_test_utils.Subprocess(command,
+                                    working_dir=gtest_test_utils.GetTempDir())
+    self.assert_(p.exited)
+    self.assertEquals(0, p.exit_code)
+
+    # TODO(wan at google.com): libtool causes the built test binary to be
+    #   named lt-gtest_xml_outfiles_test_ instead of
+    #   gtest_xml_outfiles_test_.  To account for this possibillity, we
+    #   allow both names in the following code.  We should remove this
+    #   hack when Chandler Carruth's libtool replacement tool is ready.
+    output_file_name1 = test_name + ".xml"
+    output_file1 = os.path.join(self.output_dir_, output_file_name1)
+    output_file_name2 = 'lt-' + output_file_name1
+    output_file2 = os.path.join(self.output_dir_, output_file_name2)
+    self.assert_(os.path.isfile(output_file1) or os.path.isfile(output_file2),
+                 output_file1)
+
+    expected = minidom.parseString(expected_xml)
+    if os.path.isfile(output_file1):
+      actual = minidom.parse(output_file1)
+    else:
+      actual = minidom.parse(output_file2)
+    self.NormalizeXml(actual.documentElement)
+    self.AssertEquivalentNodes(expected.documentElement,
+                               actual.documentElement)
+    expected.unlink()
+    actual.unlink()
+
+
+if __name__ == "__main__":
+  os.environ["GTEST_STACK_TRACE_DEPTH"] = "0"
+  gtest_test_utils.Main()
diff --git a/contrib/gtest-1.7.0/test/gtest_xml_output_unittest.py b/contrib/gtest-1.7.0/test/gtest_xml_output_unittest.py
new file mode 100755
index 0000000..f605d4e
--- /dev/null
+++ b/contrib/gtest-1.7.0/test/gtest_xml_output_unittest.py
@@ -0,0 +1,307 @@
+#!/usr/bin/env python
+#
+# Copyright 2006, Google Inc.
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+#
+#     * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#     * Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following disclaimer
+# in the documentation and/or other materials provided with the
+# distribution.
+#     * Neither the name of Google Inc. nor the names of its
+# contributors may be used to endorse or promote products derived from
+# this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+"""Unit test for the gtest_xml_output module"""
+
+__author__ = 'eefacm at gmail.com (Sean Mcafee)'
+
+import datetime
+import errno
+import os
+import re
+import sys
+from xml.dom import minidom, Node
+
+import gtest_test_utils
+import gtest_xml_test_utils
+
+
+GTEST_FILTER_FLAG = '--gtest_filter'
+GTEST_LIST_TESTS_FLAG = '--gtest_list_tests'
+GTEST_OUTPUT_FLAG         = "--gtest_output"
+GTEST_DEFAULT_OUTPUT_FILE = "test_detail.xml"
+GTEST_PROGRAM_NAME = "gtest_xml_output_unittest_"
+
+SUPPORTS_STACK_TRACES = False
+
+if SUPPORTS_STACK_TRACES:
+  STACK_TRACE_TEMPLATE = '\nStack trace:\n*'
+else:
+  STACK_TRACE_TEMPLATE = ''
+
+EXPECTED_NON_EMPTY_XML = """<?xml version="1.0" encoding="UTF-8"?>
+<testsuites tests="23" failures="4" disabled="2" errors="0" time="*" timestamp="*" name="AllTests" ad_hoc_property="42">
+  <testsuite name="SuccessfulTest" tests="1" failures="0" disabled="0" errors="0" time="*">
+    <testcase name="Succeeds" status="run" time="*" classname="SuccessfulTest"/>
+  </testsuite>
+  <testsuite name="FailedTest" tests="1" failures="1" disabled="0" errors="0" time="*">
+    <testcase name="Fails" status="run" time="*" classname="FailedTest">
+      <failure message="gtest_xml_output_unittest_.cc:*&#x0A;Value of: 2&#x0A;Expected: 1" type=""><![CDATA[gtest_xml_output_unittest_.cc:*
+Value of: 2
+Expected: 1%(stack)s]]></failure>
+    </testcase>
+  </testsuite>
+  <testsuite name="MixedResultTest" tests="3" failures="1" disabled="1" errors="0" time="*">
+    <testcase name="Succeeds" status="run" time="*" classname="MixedResultTest"/>
+    <testcase name="Fails" status="run" time="*" classname="MixedResultTest">
+      <failure message="gtest_xml_output_unittest_.cc:*&#x0A;Value of: 2&#x0A;Expected: 1" type=""><![CDATA[gtest_xml_output_unittest_.cc:*
+Value of: 2
+Expected: 1%(stack)s]]></failure>
+      <failure message="gtest_xml_output_unittest_.cc:*&#x0A;Value of: 3&#x0A;Expected: 2" type=""><![CDATA[gtest_xml_output_unittest_.cc:*
+Value of: 3
+Expected: 2%(stack)s]]></failure>
+    </testcase>
+    <testcase name="DISABLED_test" status="notrun" time="*" classname="MixedResultTest"/>
+  </testsuite>
+  <testsuite name="XmlQuotingTest" tests="1" failures="1" disabled="0" errors="0" time="*">
+    <testcase name="OutputsCData" status="run" time="*" classname="XmlQuotingTest">
+      <failure message="gtest_xml_output_unittest_.cc:*&#x0A;Failed&#x0A;XML output: <?xml encoding="utf-8"><top><![CDATA[cdata text]]></top>" type=""><![CDATA[gtest_xml_output_unittest_.cc:*
+Failed
+XML output: <?xml encoding="utf-8"><top><![CDATA[cdata text]]>]]><![CDATA[</top>%(stack)s]]></failure>
+    </testcase>
+  </testsuite>
+  <testsuite name="InvalidCharactersTest" tests="1" failures="1" disabled="0" errors="0" time="*">
+    <testcase name="InvalidCharactersInMessage" status="run" time="*" classname="InvalidCharactersTest">
+      <failure message="gtest_xml_output_unittest_.cc:*&#x0A;Failed&#x0A;Invalid characters in brackets []" type=""><![CDATA[gtest_xml_output_unittest_.cc:*
+Failed
+Invalid characters in brackets []%(stack)s]]></failure>
+    </testcase>
+  </testsuite>
+  <testsuite name="DisabledTest" tests="1" failures="0" disabled="1" errors="0" time="*">
+    <testcase name="DISABLED_test_not_run" status="notrun" time="*" classname="DisabledTest"/>
+  </testsuite>
+  <testsuite name="PropertyRecordingTest" tests="4" failures="0" disabled="0" errors="0" time="*" SetUpTestCase="yes" TearDownTestCase="aye">
+    <testcase name="OneProperty" status="run" time="*" classname="PropertyRecordingTest" key_1="1"/>
+    <testcase name="IntValuedProperty" status="run" time="*" classname="PropertyRecordingTest" key_int="1"/>
+    <testcase name="ThreeProperties" status="run" time="*" classname="PropertyRecordingTest" key_1="1" key_2="2" key_3="3"/>
+    <testcase name="TwoValuesForOneKeyUsesLastValue" status="run" time="*" classname="PropertyRecordingTest" key_1="2"/>
+  </testsuite>
+  <testsuite name="NoFixtureTest" tests="3" failures="0" disabled="0" errors="0" time="*">
+     <testcase name="RecordProperty" status="run" time="*" classname="NoFixtureTest" key="1"/>
+     <testcase name="ExternalUtilityThatCallsRecordIntValuedProperty" status="run" time="*" classname="NoFixtureTest" key_for_utility_int="1"/>
+     <testcase name="ExternalUtilityThatCallsRecordStringValuedProperty" status="run" time="*" classname="NoFixtureTest" key_for_utility_string="1"/>
+  </testsuite>
+  <testsuite name="Single/ValueParamTest" tests="4" failures="0" disabled="0" errors="0" time="*">
+    <testcase name="HasValueParamAttribute/0" value_param="33" status="run" time="*" classname="Single/ValueParamTest" />
+    <testcase name="HasValueParamAttribute/1" value_param="42" status="run" time="*" classname="Single/ValueParamTest" />
+    <testcase name="AnotherTestThatHasValueParamAttribute/0" value_param="33" status="run" time="*" classname="Single/ValueParamTest" />
+    <testcase name="AnotherTestThatHasValueParamAttribute/1" value_param="42" status="run" time="*" classname="Single/ValueParamTest" />
+  </testsuite>
+  <testsuite name="TypedTest/0" tests="1" failures="0" disabled="0" errors="0" time="*">
+    <testcase name="HasTypeParamAttribute" type_param="*" status="run" time="*" classname="TypedTest/0" />
+  </testsuite>
+  <testsuite name="TypedTest/1" tests="1" failures="0" disabled="0" errors="0" time="*">
+    <testcase name="HasTypeParamAttribute" type_param="*" status="run" time="*" classname="TypedTest/1" />
+  </testsuite>
+  <testsuite name="Single/TypeParameterizedTestCase/0" tests="1" failures="0" disabled="0" errors="0" time="*">
+    <testcase name="HasTypeParamAttribute" type_param="*" status="run" time="*" classname="Single/TypeParameterizedTestCase/0" />
+  </testsuite>
+  <testsuite name="Single/TypeParameterizedTestCase/1" tests="1" failures="0" disabled="0" errors="0" time="*">
+    <testcase name="HasTypeParamAttribute" type_param="*" status="run" time="*" classname="Single/TypeParameterizedTestCase/1" />
+  </testsuite>
+</testsuites>""" % {'stack': STACK_TRACE_TEMPLATE}
+
+EXPECTED_FILTERED_TEST_XML = """<?xml version="1.0" encoding="UTF-8"?>
+<testsuites tests="1" failures="0" disabled="0" errors="0" time="*"
+            timestamp="*" name="AllTests" ad_hoc_property="42">
+  <testsuite name="SuccessfulTest" tests="1" failures="0" disabled="0"
+             errors="0" time="*">
+    <testcase name="Succeeds" status="run" time="*" classname="SuccessfulTest"/>
+  </testsuite>
+</testsuites>"""
+
+EXPECTED_EMPTY_XML = """<?xml version="1.0" encoding="UTF-8"?>
+<testsuites tests="0" failures="0" disabled="0" errors="0" time="*"
+            timestamp="*" name="AllTests">
+</testsuites>"""
+
+GTEST_PROGRAM_PATH = gtest_test_utils.GetTestExecutablePath(GTEST_PROGRAM_NAME)
+
+SUPPORTS_TYPED_TESTS = 'TypedTest' in gtest_test_utils.Subprocess(
+    [GTEST_PROGRAM_PATH, GTEST_LIST_TESTS_FLAG], capture_stderr=False).output
+
+
+class GTestXMLOutputUnitTest(gtest_xml_test_utils.GTestXMLTestCase):
+  """
+  Unit test for Google Test's XML output functionality.
+  """
+
+  # This test currently breaks on platforms that do not support typed and
+  # type-parameterized tests, so we don't run it under them.
+  if SUPPORTS_TYPED_TESTS:
+    def testNonEmptyXmlOutput(self):
+      """
+      Runs a test program that generates a non-empty XML output, and
+      tests that the XML output is expected.
+      """
+      self._TestXmlOutput(GTEST_PROGRAM_NAME, EXPECTED_NON_EMPTY_XML, 1)
+
+  def testEmptyXmlOutput(self):
+    """Verifies XML output for a Google Test binary without actual tests.
+
+    Runs a test program that generates an empty XML output, and
+    tests that the XML output is expected.
+    """
+
+    self._TestXmlOutput('gtest_no_test_unittest', EXPECTED_EMPTY_XML, 0)
+
+  def testTimestampValue(self):
+    """Checks whether the timestamp attribute in the XML output is valid.
+
+    Runs a test program that generates an empty XML output, and checks if
+    the timestamp attribute in the testsuites tag is valid.
+    """
+    actual = self._GetXmlOutput('gtest_no_test_unittest', [], 0)
+    date_time_str = actual.documentElement.getAttributeNode('timestamp').value
+    # datetime.strptime() is only available in Python 2.5+ so we have to
+    # parse the expected datetime manually.
+    match = re.match(r'(\d+)-(\d\d)-(\d\d)T(\d\d):(\d\d):(\d\d)', date_time_str)
+    self.assertTrue(
+        re.match,
+        'XML datettime string %s has incorrect format' % date_time_str)
+    date_time_from_xml = datetime.datetime(
+        year=int(match.group(1)), month=int(match.group(2)),
+        day=int(match.group(3)), hour=int(match.group(4)),
+        minute=int(match.group(5)), second=int(match.group(6)))
+
+    time_delta = abs(datetime.datetime.now() - date_time_from_xml)
+    # timestamp value should be near the current local time
+    self.assertTrue(time_delta < datetime.timedelta(seconds=600),
+                    'time_delta is %s' % time_delta)
+    actual.unlink()
+
+  def testDefaultOutputFile(self):
+    """
+    Confirms that Google Test produces an XML output file with the expected
+    default name if no name is explicitly specified.
+    """
+    output_file = os.path.join(gtest_test_utils.GetTempDir(),
+                               GTEST_DEFAULT_OUTPUT_FILE)
+    gtest_prog_path = gtest_test_utils.GetTestExecutablePath(
+        'gtest_no_test_unittest')
+    try:
+      os.remove(output_file)
+    except OSError, e:
+      if e.errno != errno.ENOENT:
+        raise
+
+    p = gtest_test_utils.Subprocess(
+        [gtest_prog_path, '%s=xml' % GTEST_OUTPUT_FLAG],
+        working_dir=gtest_test_utils.GetTempDir())
+    self.assert_(p.exited)
+    self.assertEquals(0, p.exit_code)
+    self.assert_(os.path.isfile(output_file))
+
+  def testSuppressedXmlOutput(self):
+    """
+    Tests that no XML file is generated if the default XML listener is
+    shut down before RUN_ALL_TESTS is invoked.
+    """
+
+    xml_path = os.path.join(gtest_test_utils.GetTempDir(),
+                            GTEST_PROGRAM_NAME + 'out.xml')
+    if os.path.isfile(xml_path):
+      os.remove(xml_path)
+
+    command = [GTEST_PROGRAM_PATH,
+               '%s=xml:%s' % (GTEST_OUTPUT_FLAG, xml_path),
+               '--shut_down_xml']
+    p = gtest_test_utils.Subprocess(command)
+    if p.terminated_by_signal:
+      # p.signal is avalable only if p.terminated_by_signal is True.
+      self.assertFalse(
+          p.terminated_by_signal,
+          '%s was killed by signal %d' % (GTEST_PROGRAM_NAME, p.signal))
+    else:
+      self.assert_(p.exited)
+      self.assertEquals(1, p.exit_code,
+                        "'%s' exited with code %s, which doesn't match "
+                        'the expected exit code %s.'
+                        % (command, p.exit_code, 1))
+
+    self.assert_(not os.path.isfile(xml_path))
+
+  def testFilteredTestXmlOutput(self):
+    """Verifies XML output when a filter is applied.
+
+    Runs a test program that executes only some tests and verifies that
+    non-selected tests do not show up in the XML output.
+    """
+
+    self._TestXmlOutput(GTEST_PROGRAM_NAME, EXPECTED_FILTERED_TEST_XML, 0,
+                        extra_args=['%s=SuccessfulTest.*' % GTEST_FILTER_FLAG])
+
+  def _GetXmlOutput(self, gtest_prog_name, extra_args, expected_exit_code):
+    """
+    Returns the xml output generated by running the program gtest_prog_name.
+    Furthermore, the program's exit code must be expected_exit_code.
+    """
+    xml_path = os.path.join(gtest_test_utils.GetTempDir(),
+                            gtest_prog_name + 'out.xml')
+    gtest_prog_path = gtest_test_utils.GetTestExecutablePath(gtest_prog_name)
+
+    command = ([gtest_prog_path, '%s=xml:%s' % (GTEST_OUTPUT_FLAG, xml_path)] +
+               extra_args)
+    p = gtest_test_utils.Subprocess(command)
+    if p.terminated_by_signal:
+      self.assert_(False,
+                   '%s was killed by signal %d' % (gtest_prog_name, p.signal))
+    else:
+      self.assert_(p.exited)
+      self.assertEquals(expected_exit_code, p.exit_code,
+                        "'%s' exited with code %s, which doesn't match "
+                        'the expected exit code %s.'
+                        % (command, p.exit_code, expected_exit_code))
+    actual = minidom.parse(xml_path)
+    return actual
+
+  def _TestXmlOutput(self, gtest_prog_name, expected_xml,
+                     expected_exit_code, extra_args=None):
+    """
+    Asserts that the XML document generated by running the program
+    gtest_prog_name matches expected_xml, a string containing another
+    XML document.  Furthermore, the program's exit code must be
+    expected_exit_code.
+    """
+
+    actual = self._GetXmlOutput(gtest_prog_name, extra_args or [],
+                                expected_exit_code)
+    expected = minidom.parseString(expected_xml)
+    self.NormalizeXml(actual.documentElement)
+    self.AssertEquivalentNodes(expected.documentElement,
+                               actual.documentElement)
+    expected.unlink()
+    actual.unlink()
+
+
+if __name__ == '__main__':
+  os.environ['GTEST_STACK_TRACE_DEPTH'] = '1'
+  gtest_test_utils.Main()
diff --git a/contrib/gtest-1.7.0/test/gtest_xml_output_unittest_.cc b/contrib/gtest-1.7.0/test/gtest_xml_output_unittest_.cc
new file mode 100644
index 0000000..48b8771
--- /dev/null
+++ b/contrib/gtest-1.7.0/test/gtest_xml_output_unittest_.cc
@@ -0,0 +1,181 @@
+// Copyright 2006, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+// Author: eefacm at gmail.com (Sean Mcafee)
+
+// Unit test for Google Test XML output.
+//
+// A user can specify XML output in a Google Test program to run via
+// either the GTEST_OUTPUT environment variable or the --gtest_output
+// flag.  This is used for testing such functionality.
+//
+// This program will be invoked from a Python unit test.  Don't run it
+// directly.
+
+#include "gtest/gtest.h"
+
+using ::testing::InitGoogleTest;
+using ::testing::TestEventListeners;
+using ::testing::TestWithParam;
+using ::testing::UnitTest;
+using ::testing::Test;
+using ::testing::Values;
+
+class SuccessfulTest : public Test {
+};
+
+TEST_F(SuccessfulTest, Succeeds) {
+  SUCCEED() << "This is a success.";
+  ASSERT_EQ(1, 1);
+}
+
+class FailedTest : public Test {
+};
+
+TEST_F(FailedTest, Fails) {
+  ASSERT_EQ(1, 2);
+}
+
+class DisabledTest : public Test {
+};
+
+TEST_F(DisabledTest, DISABLED_test_not_run) {
+  FAIL() << "Unexpected failure: Disabled test should not be run";
+}
+
+TEST(MixedResultTest, Succeeds) {
+  EXPECT_EQ(1, 1);
+  ASSERT_EQ(1, 1);
+}
+
+TEST(MixedResultTest, Fails) {
+  EXPECT_EQ(1, 2);
+  ASSERT_EQ(2, 3);
+}
+
+TEST(MixedResultTest, DISABLED_test) {
+  FAIL() << "Unexpected failure: Disabled test should not be run";
+}
+
+TEST(XmlQuotingTest, OutputsCData) {
+  FAIL() << "XML output: "
+            "<?xml encoding=\"utf-8\"><top><![CDATA[cdata text]]></top>";
+}
+
+// Helps to test that invalid characters produced by test code do not make
+// it into the XML file.
+TEST(InvalidCharactersTest, InvalidCharactersInMessage) {
+  FAIL() << "Invalid characters in brackets [\x1\x2]";
+}
+
+class PropertyRecordingTest : public Test {
+ public:
+  static void SetUpTestCase() { RecordProperty("SetUpTestCase", "yes"); }
+  static void TearDownTestCase() { RecordProperty("TearDownTestCase", "aye"); }
+};
+
+TEST_F(PropertyRecordingTest, OneProperty) {
+  RecordProperty("key_1", "1");
+}
+
+TEST_F(PropertyRecordingTest, IntValuedProperty) {
+  RecordProperty("key_int", 1);
+}
+
+TEST_F(PropertyRecordingTest, ThreeProperties) {
+  RecordProperty("key_1", "1");
+  RecordProperty("key_2", "2");
+  RecordProperty("key_3", "3");
+}
+
+TEST_F(PropertyRecordingTest, TwoValuesForOneKeyUsesLastValue) {
+  RecordProperty("key_1", "1");
+  RecordProperty("key_1", "2");
+}
+
+TEST(NoFixtureTest, RecordProperty) {
+  RecordProperty("key", "1");
+}
+
+void ExternalUtilityThatCallsRecordProperty(const std::string& key, int value) {
+  testing::Test::RecordProperty(key, value);
+}
+
+void ExternalUtilityThatCallsRecordProperty(const std::string& key,
+                                            const std::string& value) {
+  testing::Test::RecordProperty(key, value);
+}
+
+TEST(NoFixtureTest, ExternalUtilityThatCallsRecordIntValuedProperty) {
+  ExternalUtilityThatCallsRecordProperty("key_for_utility_int", 1);
+}
+
+TEST(NoFixtureTest, ExternalUtilityThatCallsRecordStringValuedProperty) {
+  ExternalUtilityThatCallsRecordProperty("key_for_utility_string", "1");
+}
+
+// Verifies that the test parameter value is output in the 'value_param'
+// XML attribute for value-parameterized tests.
+class ValueParamTest : public TestWithParam<int> {};
+TEST_P(ValueParamTest, HasValueParamAttribute) {}
+TEST_P(ValueParamTest, AnotherTestThatHasValueParamAttribute) {}
+INSTANTIATE_TEST_CASE_P(Single, ValueParamTest, Values(33, 42));
+
+#if GTEST_HAS_TYPED_TEST
+// Verifies that the type parameter name is output in the 'type_param'
+// XML attribute for typed tests.
+template <typename T> class TypedTest : public Test {};
+typedef testing::Types<int, long> TypedTestTypes;
+TYPED_TEST_CASE(TypedTest, TypedTestTypes);
+TYPED_TEST(TypedTest, HasTypeParamAttribute) {}
+#endif
+
+#if GTEST_HAS_TYPED_TEST_P
+// Verifies that the type parameter name is output in the 'type_param'
+// XML attribute for type-parameterized tests.
+template <typename T> class TypeParameterizedTestCase : public Test {};
+TYPED_TEST_CASE_P(TypeParameterizedTestCase);
+TYPED_TEST_P(TypeParameterizedTestCase, HasTypeParamAttribute) {}
+REGISTER_TYPED_TEST_CASE_P(TypeParameterizedTestCase, HasTypeParamAttribute);
+typedef testing::Types<int, long> TypeParameterizedTestCaseTypes;
+INSTANTIATE_TYPED_TEST_CASE_P(Single,
+                              TypeParameterizedTestCase,
+                              TypeParameterizedTestCaseTypes);
+#endif
+
+int main(int argc, char** argv) {
+  InitGoogleTest(&argc, argv);
+
+  if (argc > 1 && strcmp(argv[1], "--shut_down_xml") == 0) {
+    TestEventListeners& listeners = UnitTest::GetInstance()->listeners();
+    delete listeners.Release(listeners.default_xml_generator());
+  }
+  testing::Test::RecordProperty("ad_hoc_property", "42");
+  return RUN_ALL_TESTS();
+}
diff --git a/contrib/gtest-1.7.0/test/gtest_xml_test_utils.py b/contrib/gtest-1.7.0/test/gtest_xml_test_utils.py
new file mode 100755
index 0000000..3d0c3b2
--- /dev/null
+++ b/contrib/gtest-1.7.0/test/gtest_xml_test_utils.py
@@ -0,0 +1,194 @@
+#!/usr/bin/env python
+#
+# Copyright 2006, Google Inc.
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+#
+#     * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#     * Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following disclaimer
+# in the documentation and/or other materials provided with the
+# distribution.
+#     * Neither the name of Google Inc. nor the names of its
+# contributors may be used to endorse or promote products derived from
+# this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+"""Unit test utilities for gtest_xml_output"""
+
+__author__ = 'eefacm at gmail.com (Sean Mcafee)'
+
+import re
+from xml.dom import minidom, Node
+
+import gtest_test_utils
+
+
+GTEST_OUTPUT_FLAG         = '--gtest_output'
+GTEST_DEFAULT_OUTPUT_FILE = 'test_detail.xml'
+
+class GTestXMLTestCase(gtest_test_utils.TestCase):
+  """
+  Base class for tests of Google Test's XML output functionality.
+  """
+
+
+  def AssertEquivalentNodes(self, expected_node, actual_node):
+    """
+    Asserts that actual_node (a DOM node object) is equivalent to
+    expected_node (another DOM node object), in that either both of
+    them are CDATA nodes and have the same value, or both are DOM
+    elements and actual_node meets all of the following conditions:
+
+    *  It has the same tag name as expected_node.
+    *  It has the same set of attributes as expected_node, each with
+       the same value as the corresponding attribute of expected_node.
+       Exceptions are any attribute named "time", which needs only be
+       convertible to a floating-point number and any attribute named
+       "type_param" which only has to be non-empty.
+    *  It has an equivalent set of child nodes (including elements and
+       CDATA sections) as expected_node.  Note that we ignore the
+       order of the children as they are not guaranteed to be in any
+       particular order.
+    """
+
+    if expected_node.nodeType == Node.CDATA_SECTION_NODE:
+      self.assertEquals(Node.CDATA_SECTION_NODE, actual_node.nodeType)
+      self.assertEquals(expected_node.nodeValue, actual_node.nodeValue)
+      return
+
+    self.assertEquals(Node.ELEMENT_NODE, actual_node.nodeType)
+    self.assertEquals(Node.ELEMENT_NODE, expected_node.nodeType)
+    self.assertEquals(expected_node.tagName, actual_node.tagName)
+
+    expected_attributes = expected_node.attributes
+    actual_attributes   = actual_node  .attributes
+    self.assertEquals(
+        expected_attributes.length, actual_attributes.length,
+        'attribute numbers differ in element %s:\nExpected: %r\nActual: %r' % (
+            actual_node.tagName, expected_attributes.keys(),
+            actual_attributes.keys()))
+    for i in range(expected_attributes.length):
+      expected_attr = expected_attributes.item(i)
+      actual_attr   = actual_attributes.get(expected_attr.name)
+      self.assert_(
+          actual_attr is not None,
+          'expected attribute %s not found in element %s' %
+          (expected_attr.name, actual_node.tagName))
+      self.assertEquals(
+          expected_attr.value, actual_attr.value,
+          ' values of attribute %s in element %s differ: %s vs %s' %
+          (expected_attr.name, actual_node.tagName,
+           expected_attr.value, actual_attr.value))
+
+    expected_children = self._GetChildren(expected_node)
+    actual_children = self._GetChildren(actual_node)
+    self.assertEquals(
+        len(expected_children), len(actual_children),
+        'number of child elements differ in element ' + actual_node.tagName)
+    for child_id, child in expected_children.iteritems():
+      self.assert_(child_id in actual_children,
+                   '<%s> is not in <%s> (in element %s)' %
+                   (child_id, actual_children, actual_node.tagName))
+      self.AssertEquivalentNodes(child, actual_children[child_id])
+
+  identifying_attribute = {
+    'testsuites': 'name',
+    'testsuite': 'name',
+    'testcase':  'name',
+    'failure':   'message',
+    }
+
+  def _GetChildren(self, element):
+    """
+    Fetches all of the child nodes of element, a DOM Element object.
+    Returns them as the values of a dictionary keyed by the IDs of the
+    children.  For <testsuites>, <testsuite> and <testcase> elements, the ID
+    is the value of their "name" attribute; for <failure> elements, it is
+    the value of the "message" attribute; CDATA sections and non-whitespace
+    text nodes are concatenated into a single CDATA section with ID
+    "detail".  An exception is raised if any element other than the above
+    four is encountered, if two child elements with the same identifying
+    attributes are encountered, or if any other type of node is encountered.
+    """
+
+    children = {}
+    for child in element.childNodes:
+      if child.nodeType == Node.ELEMENT_NODE:
+        self.assert_(child.tagName in self.identifying_attribute,
+                     'Encountered unknown element <%s>' % child.tagName)
+        childID = child.getAttribute(self.identifying_attribute[child.tagName])
+        self.assert_(childID not in children)
+        children[childID] = child
+      elif child.nodeType in [Node.TEXT_NODE, Node.CDATA_SECTION_NODE]:
+        if 'detail' not in children:
+          if (child.nodeType == Node.CDATA_SECTION_NODE or
+              not child.nodeValue.isspace()):
+            children['detail'] = child.ownerDocument.createCDATASection(
+                child.nodeValue)
+        else:
+          children['detail'].nodeValue += child.nodeValue
+      else:
+        self.fail('Encountered unexpected node type %d' % child.nodeType)
+    return children
+
+  def NormalizeXml(self, element):
+    """
+    Normalizes Google Test's XML output to eliminate references to transient
+    information that may change from run to run.
+
+    *  The "time" attribute of <testsuites>, <testsuite> and <testcase>
+       elements is replaced with a single asterisk, if it contains
+       only digit characters.
+    *  The "timestamp" attribute of <testsuites> elements is replaced with a
+       single asterisk, if it contains a valid ISO8601 datetime value.
+    *  The "type_param" attribute of <testcase> elements is replaced with a
+       single asterisk (if it sn non-empty) as it is the type name returned
+       by the compiler and is platform dependent.
+    *  The line info reported in the first line of the "message"
+       attribute and CDATA section of <failure> elements is replaced with the
+       file's basename and a single asterisk for the line number.
+    *  The directory names in file paths are removed.
+    *  The stack traces are removed.
+    """
+
+    if element.tagName == 'testsuites':
+      timestamp = element.getAttributeNode('timestamp')
+      timestamp.value = re.sub(r'^\d{4}-\d\d-\d\dT\d\d:\d\d:\d\d$',
+                               '*', timestamp.value)
+    if element.tagName in ('testsuites', 'testsuite', 'testcase'):
+      time = element.getAttributeNode('time')
+      time.value = re.sub(r'^\d+(\.\d+)?$', '*', time.value)
+      type_param = element.getAttributeNode('type_param')
+      if type_param and type_param.value:
+        type_param.value = '*'
+    elif element.tagName == 'failure':
+      source_line_pat = r'^.*[/\\](.*:)\d+\n'
+      # Replaces the source line information with a normalized form.
+      message = element.getAttributeNode('message')
+      message.value = re.sub(source_line_pat, '\\1*\n', message.value)
+      for child in element.childNodes:
+        if child.nodeType == Node.CDATA_SECTION_NODE:
+          # Replaces the source line information with a normalized form.
+          cdata = re.sub(source_line_pat, '\\1*\n', child.nodeValue)
+          # Removes the actual stack trace.
+          child.nodeValue = re.sub(r'\nStack trace:\n(.|\n)*',
+                                   '', cdata)
+    for child in element.childNodes:
+      if child.nodeType == Node.ELEMENT_NODE:
+        self.NormalizeXml(child)
diff --git a/contrib/gtest-1.7.0/test/production.cc b/contrib/gtest-1.7.0/test/production.cc
new file mode 100644
index 0000000..8b8a40b
--- /dev/null
+++ b/contrib/gtest-1.7.0/test/production.cc
@@ -0,0 +1,36 @@
+// Copyright 2006, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+//
+// This is part of the unit test for include/gtest/gtest_prod.h.
+
+#include "production.h"
+
+PrivateCode::PrivateCode() : x_(0) {}
diff --git a/contrib/gtest-1.7.0/test/production.h b/contrib/gtest-1.7.0/test/production.h
new file mode 100644
index 0000000..98fd5e4
--- /dev/null
+++ b/contrib/gtest-1.7.0/test/production.h
@@ -0,0 +1,55 @@
+// Copyright 2006, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: wan at google.com (Zhanyong Wan)
+//
+// This is part of the unit test for include/gtest/gtest_prod.h.
+
+#ifndef GTEST_TEST_PRODUCTION_H_
+#define GTEST_TEST_PRODUCTION_H_
+
+#include "gtest/gtest_prod.h"
+
+class PrivateCode {
+ public:
+  // Declares a friend test that does not use a fixture.
+  FRIEND_TEST(PrivateCodeTest, CanAccessPrivateMembers);
+
+  // Declares a friend test that uses a fixture.
+  FRIEND_TEST(PrivateCodeFixtureTest, CanAccessPrivateMembers);
+
+  PrivateCode();
+
+  int x() const { return x_; }
+ private:
+  void set_x(int an_x) { x_ = an_x; }
+  int x_;
+};
+
+#endif  // GTEST_TEST_PRODUCTION_H_
diff --git a/contrib/gtest-1.7.0/xcode/Config/DebugProject.xcconfig b/contrib/gtest-1.7.0/xcode/Config/DebugProject.xcconfig
new file mode 100644
index 0000000..3d68157
--- /dev/null
+++ b/contrib/gtest-1.7.0/xcode/Config/DebugProject.xcconfig
@@ -0,0 +1,30 @@
+//
+//  DebugProject.xcconfig
+//
+//  These are Debug Configuration project settings for the gtest framework and
+//  examples. It is set in the "Based On:" dropdown in the "Project" info
+//  dialog.
+//  This file is based on the Xcode Configuration files in:
+//  http://code.google.com/p/google-toolbox-for-mac/
+// 
+
+#include "General.xcconfig"
+
+// No optimization
+GCC_OPTIMIZATION_LEVEL = 0
+
+// Deployment postprocessing is what triggers Xcode to strip, turn it off
+DEPLOYMENT_POSTPROCESSING = NO
+
+// Dead code stripping off
+DEAD_CODE_STRIPPING = NO
+
+// Debug symbols should be on obviously
+GCC_GENERATE_DEBUGGING_SYMBOLS = YES
+
+// Define the DEBUG macro in all debug builds
+OTHER_CFLAGS = $(OTHER_CFLAGS) -DDEBUG=1
+
+// These are turned off to avoid STL incompatibilities with client code
+// // Turns on special C++ STL checks to "encourage" good STL use
+// GCC_PREPROCESSOR_DEFINITIONS = $(GCC_PREPROCESSOR_DEFINITIONS) _GLIBCXX_DEBUG_PEDANTIC _GLIBCXX_DEBUG _GLIBCPP_CONCEPT_CHECKS
diff --git a/contrib/gtest-1.7.0/xcode/Config/FrameworkTarget.xcconfig b/contrib/gtest-1.7.0/xcode/Config/FrameworkTarget.xcconfig
new file mode 100644
index 0000000..357b1c8
--- /dev/null
+++ b/contrib/gtest-1.7.0/xcode/Config/FrameworkTarget.xcconfig
@@ -0,0 +1,17 @@
+//
+//  FrameworkTarget.xcconfig
+//
+//  These are Framework target settings for the gtest framework and examples. It
+//  is set in the "Based On:" dropdown in the "Target" info dialog.
+//  This file is based on the Xcode Configuration files in:
+//  http://code.google.com/p/google-toolbox-for-mac/
+// 
+
+// Dynamic libs need to be position independent
+GCC_DYNAMIC_NO_PIC = NO
+
+// Dynamic libs should not have their external symbols stripped.
+STRIP_STYLE = non-global
+
+// Let the user install by specifying the $DSTROOT with xcodebuild
+SKIP_INSTALL = NO
diff --git a/contrib/gtest-1.7.0/xcode/Config/General.xcconfig b/contrib/gtest-1.7.0/xcode/Config/General.xcconfig
new file mode 100644
index 0000000..f23e322
--- /dev/null
+++ b/contrib/gtest-1.7.0/xcode/Config/General.xcconfig
@@ -0,0 +1,41 @@
+//
+//  General.xcconfig
+//
+//  These are General configuration settings for the gtest framework and
+//  examples.
+//  This file is based on the Xcode Configuration files in:
+//  http://code.google.com/p/google-toolbox-for-mac/
+// 
+
+// Build for PPC and Intel, 32- and 64-bit
+ARCHS = i386 x86_64 ppc ppc64
+
+// Zerolink prevents link warnings so turn it off
+ZERO_LINK = NO
+
+// Prebinding considered unhelpful in 10.3 and later
+PREBINDING = NO
+
+// Strictest warning policy
+WARNING_CFLAGS = -Wall -Werror -Wendif-labels -Wnewline-eof -Wno-sign-compare -Wshadow
+
+// Work around Xcode bugs by using external strip. See:
+// http://lists.apple.com/archives/Xcode-users/2006/Feb/msg00050.html
+SEPARATE_STRIP = YES
+
+// Force C99 dialect
+GCC_C_LANGUAGE_STANDARD = c99
+
+// not sure why apple defaults this on, but it's pretty risky
+ALWAYS_SEARCH_USER_PATHS = NO
+
+// Turn on position dependent code for most cases (overridden where appropriate)
+GCC_DYNAMIC_NO_PIC = YES
+
+// Default SDK and minimum OS version is 10.4
+SDKROOT = $(DEVELOPER_SDK_DIR)/MacOSX10.4u.sdk
+MACOSX_DEPLOYMENT_TARGET = 10.4
+GCC_VERSION = 4.0
+
+// VERSIONING BUILD SETTINGS (used in Info.plist)
+GTEST_VERSIONINFO_ABOUT =  © 2008 Google Inc.
diff --git a/contrib/gtest-1.7.0/xcode/Config/ReleaseProject.xcconfig b/contrib/gtest-1.7.0/xcode/Config/ReleaseProject.xcconfig
new file mode 100644
index 0000000..5349f0a
--- /dev/null
+++ b/contrib/gtest-1.7.0/xcode/Config/ReleaseProject.xcconfig
@@ -0,0 +1,32 @@
+//
+//  ReleaseProject.xcconfig
+//
+//  These are Release Configuration project settings for the gtest framework
+//  and examples. It is set in the "Based On:" dropdown in the "Project" info
+//  dialog.
+//  This file is based on the Xcode Configuration files in:
+//  http://code.google.com/p/google-toolbox-for-mac/
+// 
+
+#include "General.xcconfig"
+
+// subconfig/Release.xcconfig
+
+// Optimize for space and size (Apple recommendation)
+GCC_OPTIMIZATION_LEVEL = s
+
+// Deploment postprocessing is what triggers Xcode to strip
+DEPLOYMENT_POSTPROCESSING = YES
+
+// No symbols
+GCC_GENERATE_DEBUGGING_SYMBOLS = NO
+
+// Dead code strip does not affect ObjC code but can help for C
+DEAD_CODE_STRIPPING = YES
+
+// NDEBUG is used by things like assert.h, so define it for general compat.
+// ASSERT going away in release tends to create unused vars.
+OTHER_CFLAGS = $(OTHER_CFLAGS) -DNDEBUG=1 -Wno-unused-variable
+
+// When we strip we want to strip all symbols in release, but save externals.
+STRIP_STYLE = all
diff --git a/contrib/gtest-1.7.0/xcode/Config/StaticLibraryTarget.xcconfig b/contrib/gtest-1.7.0/xcode/Config/StaticLibraryTarget.xcconfig
new file mode 100644
index 0000000..3922fa5
--- /dev/null
+++ b/contrib/gtest-1.7.0/xcode/Config/StaticLibraryTarget.xcconfig
@@ -0,0 +1,18 @@
+//
+//  StaticLibraryTarget.xcconfig
+//
+//  These are static library target settings for libgtest.a. It
+//  is set in the "Based On:" dropdown in the "Target" info dialog.
+//  This file is based on the Xcode Configuration files in:
+//  http://code.google.com/p/google-toolbox-for-mac/
+// 
+
+// Static libs can be included in bundles so make them position independent
+GCC_DYNAMIC_NO_PIC = NO
+
+// Static libs should not have their internal globals or external symbols
+// stripped.
+STRIP_STYLE = debugging
+
+// Let the user install by specifying the $DSTROOT with xcodebuild
+SKIP_INSTALL = NO
diff --git a/contrib/gtest-1.7.0/xcode/Config/TestTarget.xcconfig b/contrib/gtest-1.7.0/xcode/Config/TestTarget.xcconfig
new file mode 100644
index 0000000..e6652ba
--- /dev/null
+++ b/contrib/gtest-1.7.0/xcode/Config/TestTarget.xcconfig
@@ -0,0 +1,8 @@
+//
+//  TestTarget.xcconfig
+//
+//  These are Test target settings for the gtest framework and examples. It
+//  is set in the "Based On:" dropdown in the "Target" info dialog.
+
+PRODUCT_NAME = $(TARGET_NAME)
+HEADER_SEARCH_PATHS = ../include
diff --git a/contrib/gtest-1.7.0/xcode/Resources/Info.plist b/contrib/gtest-1.7.0/xcode/Resources/Info.plist
new file mode 100644
index 0000000..9dd28ea
--- /dev/null
+++ b/contrib/gtest-1.7.0/xcode/Resources/Info.plist
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+	<key>CFBundleDevelopmentRegion</key>
+	<string>English</string>
+	<key>CFBundleExecutable</key>
+	<string>${EXECUTABLE_NAME}</string>
+	<key>CFBundleIconFile</key>
+	<string></string>
+	<key>CFBundleIdentifier</key>
+	<string>com.google.${PRODUCT_NAME}</string>
+	<key>CFBundleInfoDictionaryVersion</key>
+	<string>6.0</string>
+	<key>CFBundlePackageType</key>
+	<string>FMWK</string>
+	<key>CFBundleSignature</key>
+	<string>????</string>
+	<key>CFBundleVersion</key>
+	<string>GTEST_VERSIONINFO_LONG</string>
+	<key>CFBundleShortVersionString</key>
+	<string>GTEST_VERSIONINFO_SHORT</string>
+	<key>CFBundleGetInfoString</key>
+	<string>${PRODUCT_NAME} GTEST_VERSIONINFO_LONG, ${GTEST_VERSIONINFO_ABOUT}</string>
+	<key>NSHumanReadableCopyright</key>
+	<string>${GTEST_VERSIONINFO_ABOUT}</string>
+	<key>CSResourcesFileMapped</key>
+	<true/>
+</dict>
+</plist>
diff --git a/contrib/gtest-1.7.0/xcode/Samples/FrameworkSample/Info.plist b/contrib/gtest-1.7.0/xcode/Samples/FrameworkSample/Info.plist
new file mode 100644
index 0000000..f3852ed
--- /dev/null
+++ b/contrib/gtest-1.7.0/xcode/Samples/FrameworkSample/Info.plist
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+	<key>CFBundleDevelopmentRegion</key>
+	<string>English</string>
+	<key>CFBundleExecutable</key>
+	<string>${EXECUTABLE_NAME}</string>
+	<key>CFBundleIconFile</key>
+	<string></string>
+	<key>CFBundleIdentifier</key>
+	<string>com.google.gtest.${PRODUCT_NAME:identifier}</string>
+	<key>CFBundleInfoDictionaryVersion</key>
+	<string>6.0</string>
+	<key>CFBundleName</key>
+	<string>${PRODUCT_NAME}</string>
+	<key>CFBundlePackageType</key>
+	<string>FMWK</string>
+	<key>CFBundleShortVersionString</key>
+	<string>1.0</string>
+	<key>CFBundleSignature</key>
+	<string>????</string>
+	<key>CFBundleVersion</key>
+	<string>1.0</string>
+	<key>CSResourcesFileMapped</key>
+	<true/>
+</dict>
+</plist>
diff --git a/contrib/gtest-1.7.0/xcode/Samples/FrameworkSample/WidgetFramework.xcodeproj/project.pbxproj b/contrib/gtest-1.7.0/xcode/Samples/FrameworkSample/WidgetFramework.xcodeproj/project.pbxproj
new file mode 100644
index 0000000..497617e
--- /dev/null
+++ b/contrib/gtest-1.7.0/xcode/Samples/FrameworkSample/WidgetFramework.xcodeproj/project.pbxproj
@@ -0,0 +1,457 @@
+// !$*UTF8*$!
+{
+	archiveVersion = 1;
+	classes = {
+	};
+	objectVersion = 42;
+	objects = {
+
+/* Begin PBXAggregateTarget section */
+		4024D162113D7D2400C7059E /* Test */ = {
+			isa = PBXAggregateTarget;
+			buildConfigurationList = 4024D169113D7D4600C7059E /* Build configuration list for PBXAggregateTarget "Test" */;
+			buildPhases = (
+				4024D161113D7D2400C7059E /* ShellScript */,
+			);
+			dependencies = (
+				4024D166113D7D3100C7059E /* PBXTargetDependency */,
+			);
+			name = Test;
+			productName = TestAndBuild;
+		};
+		4024D1E9113D83FF00C7059E /* TestAndBuild */ = {
+			isa = PBXAggregateTarget;
+			buildConfigurationList = 4024D1F0113D842B00C7059E /* Build configuration list for PBXAggregateTarget "TestAndBuild" */;
+			buildPhases = (
+			);
+			dependencies = (
+				4024D1ED113D840900C7059E /* PBXTargetDependency */,
+				4024D1EF113D840D00C7059E /* PBXTargetDependency */,
+			);
+			name = TestAndBuild;
+			productName = TestAndBuild;
+		};
+/* End PBXAggregateTarget section */
+
+/* Begin PBXBuildFile section */
+		3B7EB1250E5AEE3500C7F239 /* widget.cc in Sources */ = {isa = PBXBuildFile; fileRef = 3B7EB1230E5AEE3500C7F239 /* widget.cc */; };
+		3B7EB1260E5AEE3500C7F239 /* widget.h in Headers */ = {isa = PBXBuildFile; fileRef = 3B7EB1240E5AEE3500C7F239 /* widget.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		3B7EB1280E5AEE4600C7F239 /* widget_test.cc in Sources */ = {isa = PBXBuildFile; fileRef = 3B7EB1270E5AEE4600C7F239 /* widget_test.cc */; };
+		3B7EB1480E5AF3B400C7F239 /* Widget.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 8D07F2C80486CC7A007CD1D0 /* Widget.framework */; };
+		4024D188113D7D7800C7059E /* libgtest.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4024D185113D7D5500C7059E /* libgtest.a */; };
+		4024D189113D7D7A00C7059E /* libgtest_main.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4024D183113D7D5500C7059E /* libgtest_main.a */; };
+/* End PBXBuildFile section */
+
+/* Begin PBXContainerItemProxy section */
+		3B07BDF00E3F3FAE00647869 /* PBXContainerItemProxy */ = {
+			isa = PBXContainerItemProxy;
+			containerPortal = 0867D690FE84028FC02AAC07 /* Project object */;
+			proxyType = 1;
+			remoteGlobalIDString = 8D07F2BC0486CC7A007CD1D0;
+			remoteInfo = gTestExample;
+		};
+		4024D165113D7D3100C7059E /* PBXContainerItemProxy */ = {
+			isa = PBXContainerItemProxy;
+			containerPortal = 0867D690FE84028FC02AAC07 /* Project object */;
+			proxyType = 1;
+			remoteGlobalIDString = 3B07BDE90E3F3F9E00647869;
+			remoteInfo = WidgetFrameworkTest;
+		};
+		4024D1EC113D840900C7059E /* PBXContainerItemProxy */ = {
+			isa = PBXContainerItemProxy;
+			containerPortal = 0867D690FE84028FC02AAC07 /* Project object */;
+			proxyType = 1;
+			remoteGlobalIDString = 8D07F2BC0486CC7A007CD1D0;
+			remoteInfo = WidgetFramework;
+		};
+		4024D1EE113D840D00C7059E /* PBXContainerItemProxy */ = {
+			isa = PBXContainerItemProxy;
+			containerPortal = 0867D690FE84028FC02AAC07 /* Project object */;
+			proxyType = 1;
+			remoteGlobalIDString = 4024D162113D7D2400C7059E;
+			remoteInfo = Test;
+		};
+/* End PBXContainerItemProxy section */
+
+/* Begin PBXFileReference section */
+		3B07BDEA0E3F3F9E00647869 /* WidgetFrameworkTest */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = WidgetFrameworkTest; sourceTree = BUILT_PRODUCTS_DIR; };
+		3B7EB1230E5AEE3500C7F239 /* widget.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = widget.cc; sourceTree = "<group>"; };
+		3B7EB1240E5AEE3500C7F239 /* widget.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = widget.h; sourceTree = "<group>"; };
+		3B7EB1270E5AEE4600C7F239 /* widget_test.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = widget_test.cc; sourceTree = "<group>"; };
+		4024D183113D7D5500C7059E /* libgtest_main.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libgtest_main.a; path = /usr/local/lib/libgtest_main.a; sourceTree = "<absolute>"; };
+		4024D185113D7D5500C7059E /* libgtest.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = libgtest.a; path = /usr/local/lib/libgtest.a; sourceTree = "<absolute>"; };
+		4024D1E2113D838200C7059E /* runtests.sh */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.sh; path = runtests.sh; sourceTree = "<group>"; };
+		8D07F2C70486CC7A007CD1D0 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist; path = Info.plist; sourceTree = "<group>"; };
+		8D07F2C80486CC7A007CD1D0 /* Widget.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Widget.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+/* End PBXFileReference section */
+
+/* Begin PBXFrameworksBuildPhase section */
+		3B07BDE80E3F3F9E00647869 /* Frameworks */ = {
+			isa = PBXFrameworksBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				4024D189113D7D7A00C7059E /* libgtest_main.a in Frameworks */,
+				4024D188113D7D7800C7059E /* libgtest.a in Frameworks */,
+				3B7EB1480E5AF3B400C7F239 /* Widget.framework in Frameworks */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		8D07F2C30486CC7A007CD1D0 /* Frameworks */ = {
+			isa = PBXFrameworksBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+/* End PBXFrameworksBuildPhase section */
+
+/* Begin PBXGroup section */
+		034768DDFF38A45A11DB9C8B /* Products */ = {
+			isa = PBXGroup;
+			children = (
+				8D07F2C80486CC7A007CD1D0 /* Widget.framework */,
+				3B07BDEA0E3F3F9E00647869 /* WidgetFrameworkTest */,
+			);
+			name = Products;
+			sourceTree = "<group>";
+		};
+		0867D691FE84028FC02AAC07 /* gTestExample */ = {
+			isa = PBXGroup;
+			children = (
+				4024D1E1113D836C00C7059E /* Scripts */,
+				08FB77ACFE841707C02AAC07 /* Source */,
+				089C1665FE841158C02AAC07 /* Resources */,
+				3B07BE350E4094E400647869 /* Test */,
+				0867D69AFE84028FC02AAC07 /* External Frameworks and Libraries */,
+				034768DDFF38A45A11DB9C8B /* Products */,
+			);
+			name = gTestExample;
+			sourceTree = "<group>";
+		};
+		0867D69AFE84028FC02AAC07 /* External Frameworks and Libraries */ = {
+			isa = PBXGroup;
+			children = (
+				4024D183113D7D5500C7059E /* libgtest_main.a */,
+				4024D185113D7D5500C7059E /* libgtest.a */,
+			);
+			name = "External Frameworks and Libraries";
+			sourceTree = "<group>";
+		};
+		089C1665FE841158C02AAC07 /* Resources */ = {
+			isa = PBXGroup;
+			children = (
+				8D07F2C70486CC7A007CD1D0 /* Info.plist */,
+			);
+			name = Resources;
+			sourceTree = "<group>";
+		};
+		08FB77ACFE841707C02AAC07 /* Source */ = {
+			isa = PBXGroup;
+			children = (
+				3B7EB1230E5AEE3500C7F239 /* widget.cc */,
+				3B7EB1240E5AEE3500C7F239 /* widget.h */,
+			);
+			name = Source;
+			sourceTree = "<group>";
+		};
+		3B07BE350E4094E400647869 /* Test */ = {
+			isa = PBXGroup;
+			children = (
+				3B7EB1270E5AEE4600C7F239 /* widget_test.cc */,
+			);
+			name = Test;
+			sourceTree = "<group>";
+		};
+		4024D1E1113D836C00C7059E /* Scripts */ = {
+			isa = PBXGroup;
+			children = (
+				4024D1E2113D838200C7059E /* runtests.sh */,
+			);
+			name = Scripts;
+			sourceTree = "<group>";
+		};
+/* End PBXGroup section */
+
+/* Begin PBXHeadersBuildPhase section */
+		8D07F2BD0486CC7A007CD1D0 /* Headers */ = {
+			isa = PBXHeadersBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				3B7EB1260E5AEE3500C7F239 /* widget.h in Headers */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+/* End PBXHeadersBuildPhase section */
+
+/* Begin PBXNativeTarget section */
+		3B07BDE90E3F3F9E00647869 /* WidgetFrameworkTest */ = {
+			isa = PBXNativeTarget;
+			buildConfigurationList = 3B07BDF40E3F3FB600647869 /* Build configuration list for PBXNativeTarget "WidgetFrameworkTest" */;
+			buildPhases = (
+				3B07BDE70E3F3F9E00647869 /* Sources */,
+				3B07BDE80E3F3F9E00647869 /* Frameworks */,
+			);
+			buildRules = (
+			);
+			dependencies = (
+				3B07BDF10E3F3FAE00647869 /* PBXTargetDependency */,
+			);
+			name = WidgetFrameworkTest;
+			productName = gTestExampleTest;
+			productReference = 3B07BDEA0E3F3F9E00647869 /* WidgetFrameworkTest */;
+			productType = "com.apple.product-type.tool";
+		};
+		8D07F2BC0486CC7A007CD1D0 /* WidgetFramework */ = {
+			isa = PBXNativeTarget;
+			buildConfigurationList = 4FADC24208B4156D00ABE55E /* Build configuration list for PBXNativeTarget "WidgetFramework" */;
+			buildPhases = (
+				8D07F2C10486CC7A007CD1D0 /* Sources */,
+				8D07F2C30486CC7A007CD1D0 /* Frameworks */,
+				8D07F2BD0486CC7A007CD1D0 /* Headers */,
+				8D07F2BF0486CC7A007CD1D0 /* Resources */,
+				8D07F2C50486CC7A007CD1D0 /* Rez */,
+			);
+			buildRules = (
+			);
+			dependencies = (
+			);
+			name = WidgetFramework;
+			productInstallPath = "$(HOME)/Library/Frameworks";
+			productName = gTestExample;
+			productReference = 8D07F2C80486CC7A007CD1D0 /* Widget.framework */;
+			productType = "com.apple.product-type.framework";
+		};
+/* End PBXNativeTarget section */
+
+/* Begin PBXProject section */
+		0867D690FE84028FC02AAC07 /* Project object */ = {
+			isa = PBXProject;
+			buildConfigurationList = 4FADC24608B4156D00ABE55E /* Build configuration list for PBXProject "WidgetFramework" */;
+			compatibilityVersion = "Xcode 2.4";
+			hasScannedForEncodings = 1;
+			mainGroup = 0867D691FE84028FC02AAC07 /* gTestExample */;
+			productRefGroup = 034768DDFF38A45A11DB9C8B /* Products */;
+			projectDirPath = "";
+			projectRoot = "";
+			targets = (
+				8D07F2BC0486CC7A007CD1D0 /* WidgetFramework */,
+				3B07BDE90E3F3F9E00647869 /* WidgetFrameworkTest */,
+				4024D162113D7D2400C7059E /* Test */,
+				4024D1E9113D83FF00C7059E /* TestAndBuild */,
+			);
+		};
+/* End PBXProject section */
+
+/* Begin PBXResourcesBuildPhase section */
+		8D07F2BF0486CC7A007CD1D0 /* Resources */ = {
+			isa = PBXResourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+/* End PBXResourcesBuildPhase section */
+
+/* Begin PBXRezBuildPhase section */
+		8D07F2C50486CC7A007CD1D0 /* Rez */ = {
+			isa = PBXRezBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+/* End PBXRezBuildPhase section */
+
+/* Begin PBXShellScriptBuildPhase section */
+		4024D161113D7D2400C7059E /* ShellScript */ = {
+			isa = PBXShellScriptBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+			);
+			inputPaths = (
+			);
+			outputPaths = (
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+			shellPath = /bin/sh;
+			shellScript = "/bin/bash $SRCROOT/runtests.sh $BUILT_PRODUCTS_DIR/WidgetFrameworkTest\n";
+		};
+/* End PBXShellScriptBuildPhase section */
+
+/* Begin PBXSourcesBuildPhase section */
+		3B07BDE70E3F3F9E00647869 /* Sources */ = {
+			isa = PBXSourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				3B7EB1280E5AEE4600C7F239 /* widget_test.cc in Sources */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		8D07F2C10486CC7A007CD1D0 /* Sources */ = {
+			isa = PBXSourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				3B7EB1250E5AEE3500C7F239 /* widget.cc in Sources */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+/* End PBXSourcesBuildPhase section */
+
+/* Begin PBXTargetDependency section */
+		3B07BDF10E3F3FAE00647869 /* PBXTargetDependency */ = {
+			isa = PBXTargetDependency;
+			target = 8D07F2BC0486CC7A007CD1D0 /* WidgetFramework */;
+			targetProxy = 3B07BDF00E3F3FAE00647869 /* PBXContainerItemProxy */;
+		};
+		4024D166113D7D3100C7059E /* PBXTargetDependency */ = {
+			isa = PBXTargetDependency;
+			target = 3B07BDE90E3F3F9E00647869 /* WidgetFrameworkTest */;
+			targetProxy = 4024D165113D7D3100C7059E /* PBXContainerItemProxy */;
+		};
+		4024D1ED113D840900C7059E /* PBXTargetDependency */ = {
+			isa = PBXTargetDependency;
+			target = 8D07F2BC0486CC7A007CD1D0 /* WidgetFramework */;
+			targetProxy = 4024D1EC113D840900C7059E /* PBXContainerItemProxy */;
+		};
+		4024D1EF113D840D00C7059E /* PBXTargetDependency */ = {
+			isa = PBXTargetDependency;
+			target = 4024D162113D7D2400C7059E /* Test */;
+			targetProxy = 4024D1EE113D840D00C7059E /* PBXContainerItemProxy */;
+		};
+/* End PBXTargetDependency section */
+
+/* Begin XCBuildConfiguration section */
+		3B07BDEC0E3F3F9F00647869 /* Debug */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				PRODUCT_NAME = WidgetFrameworkTest;
+			};
+			name = Debug;
+		};
+		3B07BDED0E3F3F9F00647869 /* Release */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				PRODUCT_NAME = WidgetFrameworkTest;
+			};
+			name = Release;
+		};
+		4024D163113D7D2400C7059E /* Debug */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				PRODUCT_NAME = TestAndBuild;
+			};
+			name = Debug;
+		};
+		4024D164113D7D2400C7059E /* Release */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				PRODUCT_NAME = TestAndBuild;
+			};
+			name = Release;
+		};
+		4024D1EA113D83FF00C7059E /* Debug */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				PRODUCT_NAME = TestAndBuild;
+			};
+			name = Debug;
+		};
+		4024D1EB113D83FF00C7059E /* Release */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				PRODUCT_NAME = TestAndBuild;
+			};
+			name = Release;
+		};
+		4FADC24308B4156D00ABE55E /* Debug */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				DYLIB_COMPATIBILITY_VERSION = 1;
+				DYLIB_CURRENT_VERSION = 1;
+				FRAMEWORK_VERSION = A;
+				INFOPLIST_FILE = Info.plist;
+				INSTALL_PATH = "@loader_path/../Frameworks";
+				PRODUCT_NAME = Widget;
+			};
+			name = Debug;
+		};
+		4FADC24408B4156D00ABE55E /* Release */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				DYLIB_COMPATIBILITY_VERSION = 1;
+				DYLIB_CURRENT_VERSION = 1;
+				FRAMEWORK_VERSION = A;
+				INFOPLIST_FILE = Info.plist;
+				INSTALL_PATH = "@loader_path/../Frameworks";
+				PRODUCT_NAME = Widget;
+			};
+			name = Release;
+		};
+		4FADC24708B4156D00ABE55E /* Debug */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				GCC_VERSION = 4.0;
+				SDKROOT = /Developer/SDKs/MacOSX10.4u.sdk;
+			};
+			name = Debug;
+		};
+		4FADC24808B4156D00ABE55E /* Release */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				GCC_VERSION = 4.0;
+				SDKROOT = /Developer/SDKs/MacOSX10.4u.sdk;
+			};
+			name = Release;
+		};
+/* End XCBuildConfiguration section */
+
+/* Begin XCConfigurationList section */
+		3B07BDF40E3F3FB600647869 /* Build configuration list for PBXNativeTarget "WidgetFrameworkTest" */ = {
+			isa = XCConfigurationList;
+			buildConfigurations = (
+				3B07BDEC0E3F3F9F00647869 /* Debug */,
+				3B07BDED0E3F3F9F00647869 /* Release */,
+			);
+			defaultConfigurationIsVisible = 0;
+			defaultConfigurationName = Release;
+		};
+		4024D169113D7D4600C7059E /* Build configuration list for PBXAggregateTarget "Test" */ = {
+			isa = XCConfigurationList;
+			buildConfigurations = (
+				4024D163113D7D2400C7059E /* Debug */,
+				4024D164113D7D2400C7059E /* Release */,
+			);
+			defaultConfigurationIsVisible = 0;
+			defaultConfigurationName = Release;
+		};
+		4024D1F0113D842B00C7059E /* Build configuration list for PBXAggregateTarget "TestAndBuild" */ = {
+			isa = XCConfigurationList;
+			buildConfigurations = (
+				4024D1EA113D83FF00C7059E /* Debug */,
+				4024D1EB113D83FF00C7059E /* Release */,
+			);
+			defaultConfigurationIsVisible = 0;
+			defaultConfigurationName = Release;
+		};
+		4FADC24208B4156D00ABE55E /* Build configuration list for PBXNativeTarget "WidgetFramework" */ = {
+			isa = XCConfigurationList;
+			buildConfigurations = (
+				4FADC24308B4156D00ABE55E /* Debug */,
+				4FADC24408B4156D00ABE55E /* Release */,
+			);
+			defaultConfigurationIsVisible = 0;
+			defaultConfigurationName = Release;
+		};
+		4FADC24608B4156D00ABE55E /* Build configuration list for PBXProject "WidgetFramework" */ = {
+			isa = XCConfigurationList;
+			buildConfigurations = (
+				4FADC24708B4156D00ABE55E /* Debug */,
+				4FADC24808B4156D00ABE55E /* Release */,
+			);
+			defaultConfigurationIsVisible = 0;
+			defaultConfigurationName = Release;
+		};
+/* End XCConfigurationList section */
+	};
+	rootObject = 0867D690FE84028FC02AAC07 /* Project object */;
+}
diff --git a/contrib/gtest-1.7.0/xcode/Samples/FrameworkSample/runtests.sh b/contrib/gtest-1.7.0/xcode/Samples/FrameworkSample/runtests.sh
new file mode 100644
index 0000000..4a0d413
--- /dev/null
+++ b/contrib/gtest-1.7.0/xcode/Samples/FrameworkSample/runtests.sh
@@ -0,0 +1,62 @@
+#!/bin/bash
+#
+# Copyright 2008, Google Inc.
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+#
+#     * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#     * Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following disclaimer
+# in the documentation and/or other materials provided with the
+# distribution.
+#     * Neither the name of Google Inc. nor the names of its
+# contributors may be used to endorse or promote products derived from
+# this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+# Executes the samples and tests for the Google Test Framework.
+
+# Help the dynamic linker find the path to the libraries.
+export DYLD_FRAMEWORK_PATH=$BUILT_PRODUCTS_DIR
+export DYLD_LIBRARY_PATH=$BUILT_PRODUCTS_DIR
+
+# Create some executables.
+test_executables=$@
+
+# Now execute each one in turn keeping track of how many succeeded and failed.
+succeeded=0
+failed=0
+failed_list=()
+for test in ${test_executables[*]}; do
+  "$test"
+  result=$?
+  if [ $result -eq 0 ]; then
+    succeeded=$(( $succeeded + 1 ))
+  else
+    failed=$(( failed + 1 ))
+    failed_list="$failed_list $test"
+  fi
+done
+
+# Report the successes and failures to the console.
+echo "Tests complete with $succeeded successes and $failed failures."
+if [ $failed -ne 0 ]; then
+  echo "The following tests failed:"
+  echo $failed_list
+fi
+exit $failed
diff --git a/contrib/gtest-1.7.0/xcode/Samples/FrameworkSample/widget.cc b/contrib/gtest-1.7.0/xcode/Samples/FrameworkSample/widget.cc
new file mode 100644
index 0000000..bfc4e7f
--- /dev/null
+++ b/contrib/gtest-1.7.0/xcode/Samples/FrameworkSample/widget.cc
@@ -0,0 +1,63 @@
+// Copyright 2008, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: preston.a.jackson at gmail.com (Preston Jackson)
+//
+// Google Test - FrameworkSample
+// widget.cc
+//
+
+// Widget is a very simple class used for demonstrating the use of gtest
+
+#include "widget.h"
+
+Widget::Widget(int number, const std::string& name)
+    : number_(number),
+      name_(name) {}
+
+Widget::~Widget() {}
+
+float Widget::GetFloatValue() const {
+  return number_;
+}
+
+int Widget::GetIntValue() const {
+  return static_cast<int>(number_);
+}
+
+std::string Widget::GetStringValue() const {
+  return name_;
+}
+
+void Widget::GetCharPtrValue(char* buffer, size_t max_size) const {
+  // Copy the char* representation of name_ into buffer, up to max_size.
+  strncpy(buffer, name_.c_str(), max_size-1);
+  buffer[max_size-1] = '\0';
+  return;
+}
diff --git a/contrib/gtest-1.7.0/xcode/Samples/FrameworkSample/widget.h b/contrib/gtest-1.7.0/xcode/Samples/FrameworkSample/widget.h
new file mode 100644
index 0000000..0c55cdc
--- /dev/null
+++ b/contrib/gtest-1.7.0/xcode/Samples/FrameworkSample/widget.h
@@ -0,0 +1,59 @@
+// Copyright 2008, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: preston.a.jackson at gmail.com (Preston Jackson)
+//
+// Google Test - FrameworkSample
+// widget.h
+//
+
+// Widget is a very simple class used for demonstrating the use of gtest. It
+// simply stores two values a string and an integer, which are returned via
+// public accessors in multiple forms.
+
+#import <string>
+
+class Widget {
+ public:
+  Widget(int number, const std::string& name);
+  ~Widget();
+
+  // Public accessors to number data
+  float GetFloatValue() const;
+  int GetIntValue() const;
+
+  // Public accessors to the string data
+  std::string GetStringValue() const;
+  void GetCharPtrValue(char* buffer, size_t max_size) const;
+
+ private:
+  // Data members
+  float number_;
+  std::string name_;
+};
diff --git a/contrib/gtest-1.7.0/xcode/Samples/FrameworkSample/widget_test.cc b/contrib/gtest-1.7.0/xcode/Samples/FrameworkSample/widget_test.cc
new file mode 100644
index 0000000..8725994
--- /dev/null
+++ b/contrib/gtest-1.7.0/xcode/Samples/FrameworkSample/widget_test.cc
@@ -0,0 +1,68 @@
+// Copyright 2008, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: preston.a.jackson at gmail.com (Preston Jackson)
+//
+// Google Test - FrameworkSample
+// widget_test.cc
+//
+
+// This is a simple test file for the Widget class in the Widget.framework
+
+#include <string>
+#include "gtest/gtest.h"
+
+#include <Widget/widget.h>
+
+// This test verifies that the constructor sets the internal state of the
+// Widget class correctly.
+TEST(WidgetInitializerTest, TestConstructor) {
+  Widget widget(1.0f, "name");
+  EXPECT_FLOAT_EQ(1.0f, widget.GetFloatValue());
+  EXPECT_EQ(std::string("name"), widget.GetStringValue());
+}
+
+// This test verifies the conversion of the float and string values to int and
+// char*, respectively.
+TEST(WidgetInitializerTest, TestConversion) {
+  Widget widget(1.0f, "name");
+  EXPECT_EQ(1, widget.GetIntValue());
+
+  size_t max_size = 128;
+  char buffer[max_size];
+  widget.GetCharPtrValue(buffer, max_size);
+  EXPECT_STREQ("name", buffer);
+}
+
+// Use the Google Test main that is linked into the framework. It does something
+// like this:
+// int main(int argc, char** argv) {
+//   testing::InitGoogleTest(&argc, argv);
+//   return RUN_ALL_TESTS();
+// }
diff --git a/contrib/gtest-1.7.0/xcode/Scripts/runtests.sh b/contrib/gtest-1.7.0/xcode/Scripts/runtests.sh
new file mode 100644
index 0000000..3fc229f
--- /dev/null
+++ b/contrib/gtest-1.7.0/xcode/Scripts/runtests.sh
@@ -0,0 +1,65 @@
+#!/bin/bash
+#
+# Copyright 2008, Google Inc.
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+#
+#     * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#     * Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following disclaimer
+# in the documentation and/or other materials provided with the
+# distribution.
+#     * Neither the name of Google Inc. nor the names of its
+# contributors may be used to endorse or promote products derived from
+# this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+# Executes the samples and tests for the Google Test Framework.
+
+# Help the dynamic linker find the path to the libraries.
+export DYLD_FRAMEWORK_PATH=$BUILT_PRODUCTS_DIR
+export DYLD_LIBRARY_PATH=$BUILT_PRODUCTS_DIR
+
+# Create some executables.
+test_executables=("$BUILT_PRODUCTS_DIR/gtest_unittest-framework"
+                  "$BUILT_PRODUCTS_DIR/gtest_unittest"
+                  "$BUILT_PRODUCTS_DIR/sample1_unittest-framework"
+                  "$BUILT_PRODUCTS_DIR/sample1_unittest-static")
+
+# Now execute each one in turn keeping track of how many succeeded and failed. 
+succeeded=0
+failed=0
+failed_list=()
+for test in ${test_executables[*]}; do
+  "$test"
+  result=$?
+  if [ $result -eq 0 ]; then
+    succeeded=$(( $succeeded + 1 ))
+  else
+    failed=$(( failed + 1 ))
+    failed_list="$failed_list $test"
+  fi
+done
+
+# Report the successes and failures to the console.
+echo "Tests complete with $succeeded successes and $failed failures."
+if [ $failed -ne 0 ]; then
+  echo "The following tests failed:"
+  echo $failed_list
+fi
+exit $failed
diff --git a/contrib/gtest-1.7.0/xcode/Scripts/versiongenerate.py b/contrib/gtest-1.7.0/xcode/Scripts/versiongenerate.py
new file mode 100755
index 0000000..81de8c9
--- /dev/null
+++ b/contrib/gtest-1.7.0/xcode/Scripts/versiongenerate.py
@@ -0,0 +1,100 @@
+#!/usr/bin/env python
+#
+# Copyright 2008, Google Inc.
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+#
+#     * Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+#     * Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following disclaimer
+# in the documentation and/or other materials provided with the
+# distribution.
+#     * Neither the name of Google Inc. nor the names of its
+# contributors may be used to endorse or promote products derived from
+# this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+"""A script to prepare version informtion for use the gtest Info.plist file.
+
+  This script extracts the version information from the configure.ac file and
+  uses it to generate a header file containing the same information. The
+  #defines in this header file will be included in during the generation of
+  the Info.plist of the framework, giving the correct value to the version
+  shown in the Finder.
+
+  This script makes the following assumptions (these are faults of the script,
+  not problems with the Autoconf):
+    1. The AC_INIT macro will be contained within the first 1024 characters
+       of configure.ac
+    2. The version string will be 3 integers separated by periods and will be
+       surrounded by squre brackets, "[" and "]" (e.g. [1.0.1]). The first
+       segment represents the major version, the second represents the minor
+       version and the third represents the fix version.
+    3. No ")" character exists between the opening "(" and closing ")" of
+       AC_INIT, including in comments and character strings.
+"""
+
+import sys
+import re
+
+# Read the command line argument (the output directory for Version.h)
+if (len(sys.argv) < 3):
+  print "Usage: versiongenerate.py input_dir output_dir"
+  sys.exit(1)
+else:
+  input_dir = sys.argv[1]
+  output_dir = sys.argv[2]
+
+# Read the first 1024 characters of the configure.ac file
+config_file = open("%s/configure.ac" % input_dir, 'r')
+buffer_size = 1024
+opening_string = config_file.read(buffer_size)
+config_file.close()
+
+# Extract the version string from the AC_INIT macro
+#   The following init_expression means:
+#     Extract three integers separated by periods and surrounded by squre
+#     brackets(e.g. "[1.0.1]") between "AC_INIT(" and ")". Do not be greedy
+#     (*? is the non-greedy flag) since that would pull in everything between
+#     the first "(" and the last ")" in the file.
+version_expression = re.compile(r"AC_INIT\(.*?\[(\d+)\.(\d+)\.(\d+)\].*?\)",
+                                re.DOTALL)
+version_values = version_expression.search(opening_string)
+major_version = version_values.group(1)
+minor_version = version_values.group(2)
+fix_version = version_values.group(3)
+
+# Write the version information to a header file to be included in the
+# Info.plist file.
+file_data = """//
+// DO NOT MODIFY THIS FILE (but you can delete it)
+//
+// This file is autogenerated by the versiongenerate.py script. This script
+// is executed in a "Run Script" build phase when creating gtest.framework. This
+// header file is not used during compilation of C-source. Rather, it simply
+// defines some version strings for substitution in the Info.plist. Because of
+// this, we are not not restricted to C-syntax nor are we using include guards.
+//
+
+#define GTEST_VERSIONINFO_SHORT %s.%s
+#define GTEST_VERSIONINFO_LONG %s.%s.%s
+
+""" % (major_version, minor_version, major_version, minor_version, fix_version)
+version_file = open("%s/Version.h" % output_dir, 'w')
+version_file.write(file_data)
+version_file.close()
diff --git a/contrib/gtest-1.7.0/xcode/gtest.xcodeproj/project.pbxproj b/contrib/gtest-1.7.0/xcode/gtest.xcodeproj/project.pbxproj
new file mode 100644
index 0000000..0452a63
--- /dev/null
+++ b/contrib/gtest-1.7.0/xcode/gtest.xcodeproj/project.pbxproj
@@ -0,0 +1,1135 @@
+// !$*UTF8*$!
+{
+	archiveVersion = 1;
+	classes = {
+	};
+	objectVersion = 46;
+	objects = {
+
+/* Begin PBXAggregateTarget section */
+		3B238F5F0E828B5400846E11 /* Check */ = {
+			isa = PBXAggregateTarget;
+			buildConfigurationList = 3B238FA30E828BB600846E11 /* Build configuration list for PBXAggregateTarget "Check" */;
+			buildPhases = (
+				3B238F5E0E828B5400846E11 /* ShellScript */,
+			);
+			dependencies = (
+				40899F9D0FFA740F000B29AE /* PBXTargetDependency */,
+				40C849F7101A43440083642A /* PBXTargetDependency */,
+				4089A0980FFAD34A000B29AE /* PBXTargetDependency */,
+				40C849F9101A43490083642A /* PBXTargetDependency */,
+			);
+			name = Check;
+			productName = Check;
+		};
+		40C44ADC0E3798F4008FCC51 /* Version Info */ = {
+			isa = PBXAggregateTarget;
+			buildConfigurationList = 40C44AE40E379905008FCC51 /* Build configuration list for PBXAggregateTarget "Version Info" */;
+			buildPhases = (
+				40C44ADB0E3798F4008FCC51 /* Generate Version.h */,
+			);
+			comments = "The generation of Version.h must be performed in its own target. Since the Info.plist is preprocessed before any of the other build phases in gtest, the Version.h file would not be ready if included as a build phase of that target.";
+			dependencies = (
+			);
+			name = "Version Info";
+			productName = Version.h;
+		};
+/* End PBXAggregateTarget section */
+
+/* Begin PBXBuildFile section */
+		224A12A30E9EADCC00BD17FD /* gtest-test-part.h in Headers */ = {isa = PBXBuildFile; fileRef = 224A12A20E9EADCC00BD17FD /* gtest-test-part.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		3BF6F2A00E79B5AD000F2EEE /* gtest-type-util.h in Copy Headers Internal */ = {isa = PBXBuildFile; fileRef = 3BF6F29F0E79B5AD000F2EEE /* gtest-type-util.h */; };
+		3BF6F2A50E79B616000F2EEE /* gtest-typed-test.h in Headers */ = {isa = PBXBuildFile; fileRef = 3BF6F2A40E79B616000F2EEE /* gtest-typed-test.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		404884380E2F799B00CF7658 /* gtest-death-test.h in Headers */ = {isa = PBXBuildFile; fileRef = 404883DB0E2F799B00CF7658 /* gtest-death-test.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		404884390E2F799B00CF7658 /* gtest-message.h in Headers */ = {isa = PBXBuildFile; fileRef = 404883DC0E2F799B00CF7658 /* gtest-message.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		4048843A0E2F799B00CF7658 /* gtest-spi.h in Headers */ = {isa = PBXBuildFile; fileRef = 404883DD0E2F799B00CF7658 /* gtest-spi.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		4048843B0E2F799B00CF7658 /* gtest.h in Headers */ = {isa = PBXBuildFile; fileRef = 404883DE0E2F799B00CF7658 /* gtest.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		4048843C0E2F799B00CF7658 /* gtest_pred_impl.h in Headers */ = {isa = PBXBuildFile; fileRef = 404883DF0E2F799B00CF7658 /* gtest_pred_impl.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		4048843D0E2F799B00CF7658 /* gtest_prod.h in Headers */ = {isa = PBXBuildFile; fileRef = 404883E00E2F799B00CF7658 /* gtest_prod.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		404884500E2F799B00CF7658 /* README in Resources */ = {isa = PBXBuildFile; fileRef = 404883F60E2F799B00CF7658 /* README */; };
+		404884A00E2F7BE600CF7658 /* gtest-death-test-internal.h in Copy Headers Internal */ = {isa = PBXBuildFile; fileRef = 404883E20E2F799B00CF7658 /* gtest-death-test-internal.h */; };
+		404884A10E2F7BE600CF7658 /* gtest-filepath.h in Copy Headers Internal */ = {isa = PBXBuildFile; fileRef = 404883E30E2F799B00CF7658 /* gtest-filepath.h */; };
+		404884A20E2F7BE600CF7658 /* gtest-internal.h in Copy Headers Internal */ = {isa = PBXBuildFile; fileRef = 404883E40E2F799B00CF7658 /* gtest-internal.h */; };
+		404884A30E2F7BE600CF7658 /* gtest-port.h in Copy Headers Internal */ = {isa = PBXBuildFile; fileRef = 404883E50E2F799B00CF7658 /* gtest-port.h */; };
+		404884A40E2F7BE600CF7658 /* gtest-string.h in Copy Headers Internal */ = {isa = PBXBuildFile; fileRef = 404883E60E2F799B00CF7658 /* gtest-string.h */; };
+		404884AC0E2F7CD900CF7658 /* CHANGES in Resources */ = {isa = PBXBuildFile; fileRef = 404884A90E2F7CD900CF7658 /* CHANGES */; };
+		404884AD0E2F7CD900CF7658 /* CONTRIBUTORS in Resources */ = {isa = PBXBuildFile; fileRef = 404884AA0E2F7CD900CF7658 /* CONTRIBUTORS */; };
+		404884AE0E2F7CD900CF7658 /* LICENSE in Resources */ = {isa = PBXBuildFile; fileRef = 404884AB0E2F7CD900CF7658 /* LICENSE */; };
+		40899F3A0FFA70D4000B29AE /* gtest-all.cc in Sources */ = {isa = PBXBuildFile; fileRef = 224A12A10E9EADA700BD17FD /* gtest-all.cc */; };
+		40899F500FFA7281000B29AE /* gtest-tuple.h in Copy Headers Internal */ = {isa = PBXBuildFile; fileRef = 40899F4D0FFA7271000B29AE /* gtest-tuple.h */; };
+		40899F530FFA72A0000B29AE /* gtest_unittest.cc in Sources */ = {isa = PBXBuildFile; fileRef = 3B238C120E7FE13C00846E11 /* gtest_unittest.cc */; };
+		4089A0440FFAD1BE000B29AE /* sample1.cc in Sources */ = {isa = PBXBuildFile; fileRef = 4089A02C0FFACF7F000B29AE /* sample1.cc */; };
+		4089A0460FFAD1BE000B29AE /* sample1_unittest.cc in Sources */ = {isa = PBXBuildFile; fileRef = 4089A02E0FFACF7F000B29AE /* sample1_unittest.cc */; };
+		40C848FF101A21150083642A /* gtest-all.cc in Sources */ = {isa = PBXBuildFile; fileRef = 224A12A10E9EADA700BD17FD /* gtest-all.cc */; };
+		40C84915101A21DF0083642A /* gtest_main.cc in Sources */ = {isa = PBXBuildFile; fileRef = 4048840D0E2F799B00CF7658 /* gtest_main.cc */; };
+		40C84916101A235B0083642A /* libgtest_main.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 40C8490B101A217E0083642A /* libgtest_main.a */; };
+		40C84921101A23AD0083642A /* libgtest_main.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 40C8490B101A217E0083642A /* libgtest_main.a */; };
+		40C84978101A36540083642A /* libgtest_main.a in Resources */ = {isa = PBXBuildFile; fileRef = 40C8490B101A217E0083642A /* libgtest_main.a */; };
+		40C84980101A36850083642A /* gtest_unittest.cc in Sources */ = {isa = PBXBuildFile; fileRef = 3B238C120E7FE13C00846E11 /* gtest_unittest.cc */; };
+		40C84982101A36850083642A /* libgtest.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 40C848FA101A209C0083642A /* libgtest.a */; };
+		40C84983101A36850083642A /* libgtest_main.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 40C8490B101A217E0083642A /* libgtest_main.a */; };
+		40C8498F101A36A60083642A /* sample1.cc in Sources */ = {isa = PBXBuildFile; fileRef = 4089A02C0FFACF7F000B29AE /* sample1.cc */; };
+		40C84990101A36A60083642A /* sample1_unittest.cc in Sources */ = {isa = PBXBuildFile; fileRef = 4089A02E0FFACF7F000B29AE /* sample1_unittest.cc */; };
+		40C84992101A36A60083642A /* libgtest.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 40C848FA101A209C0083642A /* libgtest.a */; };
+		40C84993101A36A60083642A /* libgtest_main.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 40C8490B101A217E0083642A /* libgtest_main.a */; };
+		40C849A2101A37050083642A /* gtest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4539C8FF0EC27F6400A70F4C /* gtest.framework */; };
+		40C849A4101A37150083642A /* gtest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4539C8FF0EC27F6400A70F4C /* gtest.framework */; };
+		4539C9340EC280AE00A70F4C /* gtest-param-test.h in Headers */ = {isa = PBXBuildFile; fileRef = 4539C9330EC280AE00A70F4C /* gtest-param-test.h */; settings = {ATTRIBUTES = (Public, ); }; };
+		4539C9380EC280E200A70F4C /* gtest-linked_ptr.h in Copy Headers Internal */ = {isa = PBXBuildFile; fileRef = 4539C9350EC280E200A70F4C /* gtest-linked_ptr.h */; };
+		4539C9390EC280E200A70F4C /* gtest-param-util-generated.h in Copy Headers Internal */ = {isa = PBXBuildFile; fileRef = 4539C9360EC280E200A70F4C /* gtest-param-util-generated.h */; };
+		4539C93A0EC280E200A70F4C /* gtest-param-util.h in Copy Headers Internal */ = {isa = PBXBuildFile; fileRef = 4539C9370EC280E200A70F4C /* gtest-param-util.h */; };
+		4567C8181264FF71007740BE /* gtest-printers.h in Headers */ = {isa = PBXBuildFile; fileRef = 4567C8171264FF71007740BE /* gtest-printers.h */; settings = {ATTRIBUTES = (Public, ); }; };
+/* End PBXBuildFile section */
+
+/* Begin PBXContainerItemProxy section */
+		40899F9C0FFA740F000B29AE /* PBXContainerItemProxy */ = {
+			isa = PBXContainerItemProxy;
+			containerPortal = 0867D690FE84028FC02AAC07 /* Project object */;
+			proxyType = 1;
+			remoteGlobalIDString = 40899F420FFA7184000B29AE;
+			remoteInfo = gtest_unittest;
+		};
+		4089A0970FFAD34A000B29AE /* PBXContainerItemProxy */ = {
+			isa = PBXContainerItemProxy;
+			containerPortal = 0867D690FE84028FC02AAC07 /* Project object */;
+			proxyType = 1;
+			remoteGlobalIDString = 4089A0120FFACEFC000B29AE;
+			remoteInfo = sample1_unittest;
+		};
+		408BEC0F1046CFE900DEF522 /* PBXContainerItemProxy */ = {
+			isa = PBXContainerItemProxy;
+			containerPortal = 0867D690FE84028FC02AAC07 /* Project object */;
+			proxyType = 1;
+			remoteGlobalIDString = 40C848F9101A209C0083642A;
+			remoteInfo = "gtest-static";
+		};
+		40C44AE50E379922008FCC51 /* PBXContainerItemProxy */ = {
+			isa = PBXContainerItemProxy;
+			containerPortal = 0867D690FE84028FC02AAC07 /* Project object */;
+			proxyType = 1;
+			remoteGlobalIDString = 40C44ADC0E3798F4008FCC51;
+			remoteInfo = Version.h;
+		};
+		40C8497C101A36850083642A /* PBXContainerItemProxy */ = {
+			isa = PBXContainerItemProxy;
+			containerPortal = 0867D690FE84028FC02AAC07 /* Project object */;
+			proxyType = 1;
+			remoteGlobalIDString = 40C848F9101A209C0083642A;
+			remoteInfo = "gtest-static";
+		};
+		40C8497E101A36850083642A /* PBXContainerItemProxy */ = {
+			isa = PBXContainerItemProxy;
+			containerPortal = 0867D690FE84028FC02AAC07 /* Project object */;
+			proxyType = 1;
+			remoteGlobalIDString = 40C8490A101A217E0083642A;
+			remoteInfo = "gtest_main-static";
+		};
+		40C8498B101A36A60083642A /* PBXContainerItemProxy */ = {
+			isa = PBXContainerItemProxy;
+			containerPortal = 0867D690FE84028FC02AAC07 /* Project object */;
+			proxyType = 1;
+			remoteGlobalIDString = 40C848F9101A209C0083642A;
+			remoteInfo = "gtest-static";
+		};
+		40C8498D101A36A60083642A /* PBXContainerItemProxy */ = {
+			isa = PBXContainerItemProxy;
+			containerPortal = 0867D690FE84028FC02AAC07 /* Project object */;
+			proxyType = 1;
+			remoteGlobalIDString = 40C8490A101A217E0083642A;
+			remoteInfo = "gtest_main-static";
+		};
+		40C8499B101A36DC0083642A /* PBXContainerItemProxy */ = {
+			isa = PBXContainerItemProxy;
+			containerPortal = 0867D690FE84028FC02AAC07 /* Project object */;
+			proxyType = 1;
+			remoteGlobalIDString = 40C8490A101A217E0083642A;
+			remoteInfo = "gtest_main-static";
+		};
+		40C8499D101A36E50083642A /* PBXContainerItemProxy */ = {
+			isa = PBXContainerItemProxy;
+			containerPortal = 0867D690FE84028FC02AAC07 /* Project object */;
+			proxyType = 1;
+			remoteGlobalIDString = 8D07F2BC0486CC7A007CD1D0;
+			remoteInfo = "gtest-framework";
+		};
+		40C8499F101A36F10083642A /* PBXContainerItemProxy */ = {
+			isa = PBXContainerItemProxy;
+			containerPortal = 0867D690FE84028FC02AAC07 /* Project object */;
+			proxyType = 1;
+			remoteGlobalIDString = 8D07F2BC0486CC7A007CD1D0;
+			remoteInfo = "gtest-framework";
+		};
+		40C849F6101A43440083642A /* PBXContainerItemProxy */ = {
+			isa = PBXContainerItemProxy;
+			containerPortal = 0867D690FE84028FC02AAC07 /* Project object */;
+			proxyType = 1;
+			remoteGlobalIDString = 40C8497A101A36850083642A;
+			remoteInfo = "gtest_unittest-static";
+		};
+		40C849F8101A43490083642A /* PBXContainerItemProxy */ = {
+			isa = PBXContainerItemProxy;
+			containerPortal = 0867D690FE84028FC02AAC07 /* Project object */;
+			proxyType = 1;
+			remoteGlobalIDString = 40C84989101A36A60083642A;
+			remoteInfo = "sample1_unittest-static";
+		};
+/* End PBXContainerItemProxy section */
+
+/* Begin PBXCopyFilesBuildPhase section */
+		404884A50E2F7C0400CF7658 /* Copy Headers Internal */ = {
+			isa = PBXCopyFilesBuildPhase;
+			buildActionMask = 2147483647;
+			dstPath = Headers/internal;
+			dstSubfolderSpec = 6;
+			files = (
+				404884A00E2F7BE600CF7658 /* gtest-death-test-internal.h in Copy Headers Internal */,
+				404884A10E2F7BE600CF7658 /* gtest-filepath.h in Copy Headers Internal */,
+				404884A20E2F7BE600CF7658 /* gtest-internal.h in Copy Headers Internal */,
+				4539C9380EC280E200A70F4C /* gtest-linked_ptr.h in Copy Headers Internal */,
+				4539C9390EC280E200A70F4C /* gtest-param-util-generated.h in Copy Headers Internal */,
+				4539C93A0EC280E200A70F4C /* gtest-param-util.h in Copy Headers Internal */,
+				404884A30E2F7BE600CF7658 /* gtest-port.h in Copy Headers Internal */,
+				404884A40E2F7BE600CF7658 /* gtest-string.h in Copy Headers Internal */,
+				40899F500FFA7281000B29AE /* gtest-tuple.h in Copy Headers Internal */,
+				3BF6F2A00E79B5AD000F2EEE /* gtest-type-util.h in Copy Headers Internal */,
+			);
+			name = "Copy Headers Internal";
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+/* End PBXCopyFilesBuildPhase section */
+
+/* Begin PBXFileReference section */
+		224A12A10E9EADA700BD17FD /* gtest-all.cc */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = "gtest-all.cc"; sourceTree = "<group>"; };
+		224A12A20E9EADCC00BD17FD /* gtest-test-part.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = "gtest-test-part.h"; sourceTree = "<group>"; };
+		3B238C120E7FE13C00846E11 /* gtest_unittest.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = gtest_unittest.cc; sourceTree = "<group>"; };
+		3B87D2100E96B92E000D1852 /* runtests.sh */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.sh; path = runtests.sh; sourceTree = "<group>"; };
+		3BF6F29F0E79B5AD000F2EEE /* gtest-type-util.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "gtest-type-util.h"; sourceTree = "<group>"; };
+		3BF6F2A40E79B616000F2EEE /* gtest-typed-test.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "gtest-typed-test.h"; sourceTree = "<group>"; };
+		403EE37C0E377822004BD1E2 /* versiongenerate.py */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.python; path = versiongenerate.py; sourceTree = "<group>"; };
+		404883DB0E2F799B00CF7658 /* gtest-death-test.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "gtest-death-test.h"; sourceTree = "<group>"; };
+		404883DC0E2F799B00CF7658 /* gtest-message.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "gtest-message.h"; sourceTree = "<group>"; };
+		404883DD0E2F799B00CF7658 /* gtest-spi.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "gtest-spi.h"; sourceTree = "<group>"; };
+		404883DE0E2F799B00CF7658 /* gtest.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = gtest.h; sourceTree = "<group>"; };
+		404883DF0E2F799B00CF7658 /* gtest_pred_impl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = gtest_pred_impl.h; sourceTree = "<group>"; };
+		404883E00E2F799B00CF7658 /* gtest_prod.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = gtest_prod.h; sourceTree = "<group>"; };
+		404883E20E2F799B00CF7658 /* gtest-death-test-internal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "gtest-death-test-internal.h"; sourceTree = "<group>"; };
+		404883E30E2F799B00CF7658 /* gtest-filepath.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "gtest-filepath.h"; sourceTree = "<group>"; };
+		404883E40E2F799B00CF7658 /* gtest-internal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "gtest-internal.h"; sourceTree = "<group>"; };
+		404883E50E2F799B00CF7658 /* gtest-port.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "gtest-port.h"; sourceTree = "<group>"; };
+		404883E60E2F799B00CF7658 /* gtest-string.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "gtest-string.h"; sourceTree = "<group>"; };
+		404883F60E2F799B00CF7658 /* README */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = README; path = ../README; sourceTree = SOURCE_ROOT; };
+		4048840D0E2F799B00CF7658 /* gtest_main.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = gtest_main.cc; sourceTree = "<group>"; };
+		404884A90E2F7CD900CF7658 /* CHANGES */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = CHANGES; path = ../CHANGES; sourceTree = SOURCE_ROOT; };
+		404884AA0E2F7CD900CF7658 /* CONTRIBUTORS */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = CONTRIBUTORS; path = ../CONTRIBUTORS; sourceTree = SOURCE_ROOT; };
+		404884AB0E2F7CD900CF7658 /* LICENSE */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = LICENSE; path = ../LICENSE; sourceTree = SOURCE_ROOT; };
+		40899F430FFA7184000B29AE /* gtest_unittest-framework */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = "gtest_unittest-framework"; sourceTree = BUILT_PRODUCTS_DIR; };
+		40899F4D0FFA7271000B29AE /* gtest-tuple.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "gtest-tuple.h"; sourceTree = "<group>"; };
+		40899FB30FFA7567000B29AE /* StaticLibraryTarget.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = StaticLibraryTarget.xcconfig; sourceTree = "<group>"; };
+		4089A0130FFACEFC000B29AE /* sample1_unittest-framework */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = "sample1_unittest-framework"; sourceTree = BUILT_PRODUCTS_DIR; };
+		4089A02C0FFACF7F000B29AE /* sample1.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = sample1.cc; sourceTree = "<group>"; };
+		4089A02D0FFACF7F000B29AE /* sample1.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = sample1.h; sourceTree = "<group>"; };
+		4089A02E0FFACF7F000B29AE /* sample1_unittest.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = sample1_unittest.cc; sourceTree = "<group>"; };
+		40C848FA101A209C0083642A /* libgtest.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libgtest.a; sourceTree = BUILT_PRODUCTS_DIR; };
+		40C8490B101A217E0083642A /* libgtest_main.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libgtest_main.a; sourceTree = BUILT_PRODUCTS_DIR; };
+		40C84987101A36850083642A /* gtest_unittest */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = gtest_unittest; sourceTree = BUILT_PRODUCTS_DIR; };
+		40C84997101A36A60083642A /* sample1_unittest-static */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = "sample1_unittest-static"; sourceTree = BUILT_PRODUCTS_DIR; };
+		40D4CDF10E30E07400294801 /* DebugProject.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = DebugProject.xcconfig; sourceTree = "<group>"; };
+		40D4CDF20E30E07400294801 /* FrameworkTarget.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = FrameworkTarget.xcconfig; sourceTree = "<group>"; };
+		40D4CDF30E30E07400294801 /* General.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = General.xcconfig; sourceTree = "<group>"; };
+		40D4CDF40E30E07400294801 /* ReleaseProject.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = ReleaseProject.xcconfig; sourceTree = "<group>"; };
+		40D4CF510E30F5E200294801 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
+		4539C8FF0EC27F6400A70F4C /* gtest.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = gtest.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+		4539C9330EC280AE00A70F4C /* gtest-param-test.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "gtest-param-test.h"; sourceTree = "<group>"; };
+		4539C9350EC280E200A70F4C /* gtest-linked_ptr.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "gtest-linked_ptr.h"; sourceTree = "<group>"; };
+		4539C9360EC280E200A70F4C /* gtest-param-util-generated.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "gtest-param-util-generated.h"; sourceTree = "<group>"; };
+		4539C9370EC280E200A70F4C /* gtest-param-util.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "gtest-param-util.h"; sourceTree = "<group>"; };
+		4567C8171264FF71007740BE /* gtest-printers.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "gtest-printers.h"; sourceTree = "<group>"; };
+/* End PBXFileReference section */
+
+/* Begin PBXFrameworksBuildPhase section */
+		40899F410FFA7184000B29AE /* Frameworks */ = {
+			isa = PBXFrameworksBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				40C849A4101A37150083642A /* gtest.framework in Frameworks */,
+				40C84916101A235B0083642A /* libgtest_main.a in Frameworks */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		4089A0110FFACEFC000B29AE /* Frameworks */ = {
+			isa = PBXFrameworksBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				40C849A2101A37050083642A /* gtest.framework in Frameworks */,
+				40C84921101A23AD0083642A /* libgtest_main.a in Frameworks */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		40C84981101A36850083642A /* Frameworks */ = {
+			isa = PBXFrameworksBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				40C84982101A36850083642A /* libgtest.a in Frameworks */,
+				40C84983101A36850083642A /* libgtest_main.a in Frameworks */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		40C84991101A36A60083642A /* Frameworks */ = {
+			isa = PBXFrameworksBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				40C84992101A36A60083642A /* libgtest.a in Frameworks */,
+				40C84993101A36A60083642A /* libgtest_main.a in Frameworks */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+/* End PBXFrameworksBuildPhase section */
+
+/* Begin PBXGroup section */
+		034768DDFF38A45A11DB9C8B /* Products */ = {
+			isa = PBXGroup;
+			children = (
+				4539C8FF0EC27F6400A70F4C /* gtest.framework */,
+				40C848FA101A209C0083642A /* libgtest.a */,
+				40C8490B101A217E0083642A /* libgtest_main.a */,
+				40899F430FFA7184000B29AE /* gtest_unittest-framework */,
+				40C84987101A36850083642A /* gtest_unittest */,
+				4089A0130FFACEFC000B29AE /* sample1_unittest-framework */,
+				40C84997101A36A60083642A /* sample1_unittest-static */,
+			);
+			name = Products;
+			sourceTree = "<group>";
+		};
+		0867D691FE84028FC02AAC07 /* gtest */ = {
+			isa = PBXGroup;
+			children = (
+				40D4CDF00E30E07400294801 /* Config */,
+				08FB77ACFE841707C02AAC07 /* Source */,
+				40D4CF4E0E30F5E200294801 /* Resources */,
+				403EE37B0E377822004BD1E2 /* Scripts */,
+				034768DDFF38A45A11DB9C8B /* Products */,
+			);
+			name = gtest;
+			sourceTree = "<group>";
+		};
+		08FB77ACFE841707C02AAC07 /* Source */ = {
+			isa = PBXGroup;
+			children = (
+				404884A90E2F7CD900CF7658 /* CHANGES */,
+				404884AA0E2F7CD900CF7658 /* CONTRIBUTORS */,
+				404884AB0E2F7CD900CF7658 /* LICENSE */,
+				404883F60E2F799B00CF7658 /* README */,
+				404883D90E2F799B00CF7658 /* include */,
+				4089A02F0FFACF84000B29AE /* samples */,
+				404884070E2F799B00CF7658 /* src */,
+				3B238BF00E7FE13B00846E11 /* test */,
+			);
+			name = Source;
+			sourceTree = "<group>";
+		};
+		3B238BF00E7FE13B00846E11 /* test */ = {
+			isa = PBXGroup;
+			children = (
+				3B238C120E7FE13C00846E11 /* gtest_unittest.cc */,
+			);
+			name = test;
+			path = ../test;
+			sourceTree = SOURCE_ROOT;
+		};
+		403EE37B0E377822004BD1E2 /* Scripts */ = {
+			isa = PBXGroup;
+			children = (
+				403EE37C0E377822004BD1E2 /* versiongenerate.py */,
+				3B87D2100E96B92E000D1852 /* runtests.sh */,
+			);
+			path = Scripts;
+			sourceTree = "<group>";
+		};
+		404883D90E2F799B00CF7658 /* include */ = {
+			isa = PBXGroup;
+			children = (
+				404883DA0E2F799B00CF7658 /* gtest */,
+			);
+			name = include;
+			path = ../include;
+			sourceTree = SOURCE_ROOT;
+		};
+		404883DA0E2F799B00CF7658 /* gtest */ = {
+			isa = PBXGroup;
+			children = (
+				404883E10E2F799B00CF7658 /* internal */,
+				224A12A20E9EADCC00BD17FD /* gtest-test-part.h */,
+				404883DB0E2F799B00CF7658 /* gtest-death-test.h */,
+				404883DC0E2F799B00CF7658 /* gtest-message.h */,
+				4539C9330EC280AE00A70F4C /* gtest-param-test.h */,
+				4567C8171264FF71007740BE /* gtest-printers.h */,
+				404883DD0E2F799B00CF7658 /* gtest-spi.h */,
+				404883DE0E2F799B00CF7658 /* gtest.h */,
+				404883DF0E2F799B00CF7658 /* gtest_pred_impl.h */,
+				404883E00E2F799B00CF7658 /* gtest_prod.h */,
+				3BF6F2A40E79B616000F2EEE /* gtest-typed-test.h */,
+			);
+			path = gtest;
+			sourceTree = "<group>";
+		};
+		404883E10E2F799B00CF7658 /* internal */ = {
+			isa = PBXGroup;
+			children = (
+				404883E20E2F799B00CF7658 /* gtest-death-test-internal.h */,
+				404883E30E2F799B00CF7658 /* gtest-filepath.h */,
+				404883E40E2F799B00CF7658 /* gtest-internal.h */,
+				4539C9350EC280E200A70F4C /* gtest-linked_ptr.h */,
+				4539C9360EC280E200A70F4C /* gtest-param-util-generated.h */,
+				4539C9370EC280E200A70F4C /* gtest-param-util.h */,
+				404883E50E2F799B00CF7658 /* gtest-port.h */,
+				404883E60E2F799B00CF7658 /* gtest-string.h */,
+				40899F4D0FFA7271000B29AE /* gtest-tuple.h */,
+				3BF6F29F0E79B5AD000F2EEE /* gtest-type-util.h */,
+			);
+			path = internal;
+			sourceTree = "<group>";
+		};
+		404884070E2F799B00CF7658 /* src */ = {
+			isa = PBXGroup;
+			children = (
+				224A12A10E9EADA700BD17FD /* gtest-all.cc */,
+				4048840D0E2F799B00CF7658 /* gtest_main.cc */,
+			);
+			name = src;
+			path = ../src;
+			sourceTree = SOURCE_ROOT;
+		};
+		4089A02F0FFACF84000B29AE /* samples */ = {
+			isa = PBXGroup;
+			children = (
+				4089A02C0FFACF7F000B29AE /* sample1.cc */,
+				4089A02D0FFACF7F000B29AE /* sample1.h */,
+				4089A02E0FFACF7F000B29AE /* sample1_unittest.cc */,
+			);
+			name = samples;
+			path = ../samples;
+			sourceTree = SOURCE_ROOT;
+		};
+		40D4CDF00E30E07400294801 /* Config */ = {
+			isa = PBXGroup;
+			children = (
+				40D4CDF10E30E07400294801 /* DebugProject.xcconfig */,
+				40D4CDF20E30E07400294801 /* FrameworkTarget.xcconfig */,
+				40D4CDF30E30E07400294801 /* General.xcconfig */,
+				40D4CDF40E30E07400294801 /* ReleaseProject.xcconfig */,
+				40899FB30FFA7567000B29AE /* StaticLibraryTarget.xcconfig */,
+			);
+			path = Config;
+			sourceTree = "<group>";
+		};
+		40D4CF4E0E30F5E200294801 /* Resources */ = {
+			isa = PBXGroup;
+			children = (
+				40D4CF510E30F5E200294801 /* Info.plist */,
+			);
+			path = Resources;
+			sourceTree = "<group>";
+		};
+/* End PBXGroup section */
+
+/* Begin PBXHeadersBuildPhase section */
+		8D07F2BD0486CC7A007CD1D0 /* Headers */ = {
+			isa = PBXHeadersBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				404884380E2F799B00CF7658 /* gtest-death-test.h in Headers */,
+				404884390E2F799B00CF7658 /* gtest-message.h in Headers */,
+				4539C9340EC280AE00A70F4C /* gtest-param-test.h in Headers */,
+				4567C8181264FF71007740BE /* gtest-printers.h in Headers */,
+				3BF6F2A50E79B616000F2EEE /* gtest-typed-test.h in Headers */,
+				4048843A0E2F799B00CF7658 /* gtest-spi.h in Headers */,
+				4048843B0E2F799B00CF7658 /* gtest.h in Headers */,
+				4048843C0E2F799B00CF7658 /* gtest_pred_impl.h in Headers */,
+				4048843D0E2F799B00CF7658 /* gtest_prod.h in Headers */,
+				224A12A30E9EADCC00BD17FD /* gtest-test-part.h in Headers */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+/* End PBXHeadersBuildPhase section */
+
+/* Begin PBXNativeTarget section */
+		40899F420FFA7184000B29AE /* gtest_unittest-framework */ = {
+			isa = PBXNativeTarget;
+			buildConfigurationList = 40899F4A0FFA71BC000B29AE /* Build configuration list for PBXNativeTarget "gtest_unittest-framework" */;
+			buildPhases = (
+				40899F400FFA7184000B29AE /* Sources */,
+				40899F410FFA7184000B29AE /* Frameworks */,
+			);
+			buildRules = (
+			);
+			dependencies = (
+				40C849A0101A36F10083642A /* PBXTargetDependency */,
+			);
+			name = "gtest_unittest-framework";
+			productName = gtest_unittest;
+			productReference = 40899F430FFA7184000B29AE /* gtest_unittest-framework */;
+			productType = "com.apple.product-type.tool";
+		};
+		4089A0120FFACEFC000B29AE /* sample1_unittest-framework */ = {
+			isa = PBXNativeTarget;
+			buildConfigurationList = 4089A0240FFACF01000B29AE /* Build configuration list for PBXNativeTarget "sample1_unittest-framework" */;
+			buildPhases = (
+				4089A0100FFACEFC000B29AE /* Sources */,
+				4089A0110FFACEFC000B29AE /* Frameworks */,
+			);
+			buildRules = (
+			);
+			dependencies = (
+				40C8499E101A36E50083642A /* PBXTargetDependency */,
+			);
+			name = "sample1_unittest-framework";
+			productName = sample1_unittest;
+			productReference = 4089A0130FFACEFC000B29AE /* sample1_unittest-framework */;
+			productType = "com.apple.product-type.tool";
+		};
+		40C848F9101A209C0083642A /* gtest-static */ = {
+			isa = PBXNativeTarget;
+			buildConfigurationList = 40C84902101A212E0083642A /* Build configuration list for PBXNativeTarget "gtest-static" */;
+			buildPhases = (
+				40C848F7101A209C0083642A /* Sources */,
+			);
+			buildRules = (
+			);
+			dependencies = (
+			);
+			name = "gtest-static";
+			productName = "gtest-static";
+			productReference = 40C848FA101A209C0083642A /* libgtest.a */;
+			productType = "com.apple.product-type.library.static";
+		};
+		40C8490A101A217E0083642A /* gtest_main-static */ = {
+			isa = PBXNativeTarget;
+			buildConfigurationList = 40C84912101A21D20083642A /* Build configuration list for PBXNativeTarget "gtest_main-static" */;
+			buildPhases = (
+				40C84908101A217E0083642A /* Sources */,
+			);
+			buildRules = (
+			);
+			dependencies = (
+			);
+			name = "gtest_main-static";
+			productName = "gtest_main-static";
+			productReference = 40C8490B101A217E0083642A /* libgtest_main.a */;
+			productType = "com.apple.product-type.library.static";
+		};
+		40C8497A101A36850083642A /* gtest_unittest-static */ = {
+			isa = PBXNativeTarget;
+			buildConfigurationList = 40C84984101A36850083642A /* Build configuration list for PBXNativeTarget "gtest_unittest-static" */;
+			buildPhases = (
+				40C8497F101A36850083642A /* Sources */,
+				40C84981101A36850083642A /* Frameworks */,
+			);
+			buildRules = (
+			);
+			dependencies = (
+				40C8497B101A36850083642A /* PBXTargetDependency */,
+				40C8497D101A36850083642A /* PBXTargetDependency */,
+			);
+			name = "gtest_unittest-static";
+			productName = gtest_unittest;
+			productReference = 40C84987101A36850083642A /* gtest_unittest */;
+			productType = "com.apple.product-type.tool";
+		};
+		40C84989101A36A60083642A /* sample1_unittest-static */ = {
+			isa = PBXNativeTarget;
+			buildConfigurationList = 40C84994101A36A60083642A /* Build configuration list for PBXNativeTarget "sample1_unittest-static" */;
+			buildPhases = (
+				40C8498E101A36A60083642A /* Sources */,
+				40C84991101A36A60083642A /* Frameworks */,
+			);
+			buildRules = (
+			);
+			dependencies = (
+				40C8498A101A36A60083642A /* PBXTargetDependency */,
+				40C8498C101A36A60083642A /* PBXTargetDependency */,
+			);
+			name = "sample1_unittest-static";
+			productName = sample1_unittest;
+			productReference = 40C84997101A36A60083642A /* sample1_unittest-static */;
+			productType = "com.apple.product-type.tool";
+		};
+		8D07F2BC0486CC7A007CD1D0 /* gtest-framework */ = {
+			isa = PBXNativeTarget;
+			buildConfigurationList = 4FADC24208B4156D00ABE55E /* Build configuration list for PBXNativeTarget "gtest-framework" */;
+			buildPhases = (
+				8D07F2C10486CC7A007CD1D0 /* Sources */,
+				8D07F2BD0486CC7A007CD1D0 /* Headers */,
+				404884A50E2F7C0400CF7658 /* Copy Headers Internal */,
+				8D07F2BF0486CC7A007CD1D0 /* Resources */,
+			);
+			buildRules = (
+			);
+			dependencies = (
+				40C44AE60E379922008FCC51 /* PBXTargetDependency */,
+				408BEC101046CFE900DEF522 /* PBXTargetDependency */,
+				40C8499C101A36DC0083642A /* PBXTargetDependency */,
+			);
+			name = "gtest-framework";
+			productInstallPath = "$(HOME)/Library/Frameworks";
+			productName = gtest;
+			productReference = 4539C8FF0EC27F6400A70F4C /* gtest.framework */;
+			productType = "com.apple.product-type.framework";
+		};
+/* End PBXNativeTarget section */
+
+/* Begin PBXProject section */
+		0867D690FE84028FC02AAC07 /* Project object */ = {
+			isa = PBXProject;
+			attributes = {
+				LastUpgradeCheck = 0460;
+			};
+			buildConfigurationList = 4FADC24608B4156D00ABE55E /* Build configuration list for PBXProject "gtest" */;
+			compatibilityVersion = "Xcode 3.2";
+			developmentRegion = English;
+			hasScannedForEncodings = 1;
+			knownRegions = (
+				English,
+				Japanese,
+				French,
+				German,
+				en,
+			);
+			mainGroup = 0867D691FE84028FC02AAC07 /* gtest */;
+			productRefGroup = 034768DDFF38A45A11DB9C8B /* Products */;
+			projectDirPath = "";
+			projectRoot = "";
+			targets = (
+				8D07F2BC0486CC7A007CD1D0 /* gtest-framework */,
+				40C848F9101A209C0083642A /* gtest-static */,
+				40C8490A101A217E0083642A /* gtest_main-static */,
+				40899F420FFA7184000B29AE /* gtest_unittest-framework */,
+				40C8497A101A36850083642A /* gtest_unittest-static */,
+				4089A0120FFACEFC000B29AE /* sample1_unittest-framework */,
+				40C84989101A36A60083642A /* sample1_unittest-static */,
+				3B238F5F0E828B5400846E11 /* Check */,
+				40C44ADC0E3798F4008FCC51 /* Version Info */,
+			);
+		};
+/* End PBXProject section */
+
+/* Begin PBXResourcesBuildPhase section */
+		8D07F2BF0486CC7A007CD1D0 /* Resources */ = {
+			isa = PBXResourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				404884500E2F799B00CF7658 /* README in Resources */,
+				404884AC0E2F7CD900CF7658 /* CHANGES in Resources */,
+				404884AD0E2F7CD900CF7658 /* CONTRIBUTORS in Resources */,
+				404884AE0E2F7CD900CF7658 /* LICENSE in Resources */,
+				40C84978101A36540083642A /* libgtest_main.a in Resources */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+/* End PBXResourcesBuildPhase section */
+
+/* Begin PBXShellScriptBuildPhase section */
+		3B238F5E0E828B5400846E11 /* ShellScript */ = {
+			isa = PBXShellScriptBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+			);
+			inputPaths = (
+			);
+			outputPaths = (
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+			shellPath = /bin/sh;
+			shellScript = "# Remember, this \"Run Script\" build phase will be executed from $SRCROOT\n/bin/bash Scripts/runtests.sh";
+		};
+		40C44ADB0E3798F4008FCC51 /* Generate Version.h */ = {
+			isa = PBXShellScriptBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+			);
+			inputPaths = (
+				"$(SRCROOT)/Scripts/versiongenerate.py",
+				"$(SRCROOT)/../configure.ac",
+			);
+			name = "Generate Version.h";
+			outputPaths = (
+				"$(PROJECT_TEMP_DIR)/Version.h",
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+			shellPath = /bin/sh;
+			shellScript = "# Remember, this \"Run Script\" build phase will be executed from $SRCROOT\n/usr/bin/python Scripts/versiongenerate.py ../ $PROJECT_TEMP_DIR";
+		};
+/* End PBXShellScriptBuildPhase section */
+
+/* Begin PBXSourcesBuildPhase section */
+		40899F400FFA7184000B29AE /* Sources */ = {
+			isa = PBXSourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				40899F530FFA72A0000B29AE /* gtest_unittest.cc in Sources */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		4089A0100FFACEFC000B29AE /* Sources */ = {
+			isa = PBXSourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				4089A0440FFAD1BE000B29AE /* sample1.cc in Sources */,
+				4089A0460FFAD1BE000B29AE /* sample1_unittest.cc in Sources */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		40C848F7101A209C0083642A /* Sources */ = {
+			isa = PBXSourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				40C848FF101A21150083642A /* gtest-all.cc in Sources */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		40C84908101A217E0083642A /* Sources */ = {
+			isa = PBXSourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				40C84915101A21DF0083642A /* gtest_main.cc in Sources */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		40C8497F101A36850083642A /* Sources */ = {
+			isa = PBXSourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				40C84980101A36850083642A /* gtest_unittest.cc in Sources */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		40C8498E101A36A60083642A /* Sources */ = {
+			isa = PBXSourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				40C8498F101A36A60083642A /* sample1.cc in Sources */,
+				40C84990101A36A60083642A /* sample1_unittest.cc in Sources */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+		8D07F2C10486CC7A007CD1D0 /* Sources */ = {
+			isa = PBXSourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				40899F3A0FFA70D4000B29AE /* gtest-all.cc in Sources */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+/* End PBXSourcesBuildPhase section */
+
+/* Begin PBXTargetDependency section */
+		40899F9D0FFA740F000B29AE /* PBXTargetDependency */ = {
+			isa = PBXTargetDependency;
+			target = 40899F420FFA7184000B29AE /* gtest_unittest-framework */;
+			targetProxy = 40899F9C0FFA740F000B29AE /* PBXContainerItemProxy */;
+		};
+		4089A0980FFAD34A000B29AE /* PBXTargetDependency */ = {
+			isa = PBXTargetDependency;
+			target = 4089A0120FFACEFC000B29AE /* sample1_unittest-framework */;
+			targetProxy = 4089A0970FFAD34A000B29AE /* PBXContainerItemProxy */;
+		};
+		408BEC101046CFE900DEF522 /* PBXTargetDependency */ = {
+			isa = PBXTargetDependency;
+			target = 40C848F9101A209C0083642A /* gtest-static */;
+			targetProxy = 408BEC0F1046CFE900DEF522 /* PBXContainerItemProxy */;
+		};
+		40C44AE60E379922008FCC51 /* PBXTargetDependency */ = {
+			isa = PBXTargetDependency;
+			target = 40C44ADC0E3798F4008FCC51 /* Version Info */;
+			targetProxy = 40C44AE50E379922008FCC51 /* PBXContainerItemProxy */;
+		};
+		40C8497B101A36850083642A /* PBXTargetDependency */ = {
+			isa = PBXTargetDependency;
+			target = 40C848F9101A209C0083642A /* gtest-static */;
+			targetProxy = 40C8497C101A36850083642A /* PBXContainerItemProxy */;
+		};
+		40C8497D101A36850083642A /* PBXTargetDependency */ = {
+			isa = PBXTargetDependency;
+			target = 40C8490A101A217E0083642A /* gtest_main-static */;
+			targetProxy = 40C8497E101A36850083642A /* PBXContainerItemProxy */;
+		};
+		40C8498A101A36A60083642A /* PBXTargetDependency */ = {
+			isa = PBXTargetDependency;
+			target = 40C848F9101A209C0083642A /* gtest-static */;
+			targetProxy = 40C8498B101A36A60083642A /* PBXContainerItemProxy */;
+		};
+		40C8498C101A36A60083642A /* PBXTargetDependency */ = {
+			isa = PBXTargetDependency;
+			target = 40C8490A101A217E0083642A /* gtest_main-static */;
+			targetProxy = 40C8498D101A36A60083642A /* PBXContainerItemProxy */;
+		};
+		40C8499C101A36DC0083642A /* PBXTargetDependency */ = {
+			isa = PBXTargetDependency;
+			target = 40C8490A101A217E0083642A /* gtest_main-static */;
+			targetProxy = 40C8499B101A36DC0083642A /* PBXContainerItemProxy */;
+		};
+		40C8499E101A36E50083642A /* PBXTargetDependency */ = {
+			isa = PBXTargetDependency;
+			target = 8D07F2BC0486CC7A007CD1D0 /* gtest-framework */;
+			targetProxy = 40C8499D101A36E50083642A /* PBXContainerItemProxy */;
+		};
+		40C849A0101A36F10083642A /* PBXTargetDependency */ = {
+			isa = PBXTargetDependency;
+			target = 8D07F2BC0486CC7A007CD1D0 /* gtest-framework */;
+			targetProxy = 40C8499F101A36F10083642A /* PBXContainerItemProxy */;
+		};
+		40C849F7101A43440083642A /* PBXTargetDependency */ = {
+			isa = PBXTargetDependency;
+			target = 40C8497A101A36850083642A /* gtest_unittest-static */;
+			targetProxy = 40C849F6101A43440083642A /* PBXContainerItemProxy */;
+		};
+		40C849F9101A43490083642A /* PBXTargetDependency */ = {
+			isa = PBXTargetDependency;
+			target = 40C84989101A36A60083642A /* sample1_unittest-static */;
+			targetProxy = 40C849F8101A43490083642A /* PBXContainerItemProxy */;
+		};
+/* End PBXTargetDependency section */
+
+/* Begin XCBuildConfiguration section */
+		3B238F600E828B5400846E11 /* Debug */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				COMBINE_HIDPI_IMAGES = YES;
+				COPY_PHASE_STRIP = NO;
+				GCC_DYNAMIC_NO_PIC = NO;
+				GCC_OPTIMIZATION_LEVEL = 0;
+				GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
+				PRODUCT_NAME = Check;
+				SDKROOT = macosx;
+			};
+			name = Debug;
+		};
+		3B238F610E828B5400846E11 /* Release */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				COMBINE_HIDPI_IMAGES = YES;
+				COPY_PHASE_STRIP = YES;
+				DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+				GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
+				PRODUCT_NAME = Check;
+				SDKROOT = macosx;
+				ZERO_LINK = NO;
+			};
+			name = Release;
+		};
+		40899F450FFA7185000B29AE /* Debug */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
+				HEADER_SEARCH_PATHS = ../;
+				PRODUCT_NAME = "gtest_unittest-framework";
+				SDKROOT = macosx;
+			};
+			name = Debug;
+		};
+		40899F460FFA7185000B29AE /* Release */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
+				HEADER_SEARCH_PATHS = ../;
+				PRODUCT_NAME = "gtest_unittest-framework";
+				SDKROOT = macosx;
+			};
+			name = Release;
+		};
+		4089A0150FFACEFD000B29AE /* Debug */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
+				PRODUCT_NAME = "sample1_unittest-framework";
+				SDKROOT = macosx;
+			};
+			name = Debug;
+		};
+		4089A0160FFACEFD000B29AE /* Release */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
+				PRODUCT_NAME = "sample1_unittest-framework";
+				SDKROOT = macosx;
+			};
+			name = Release;
+		};
+		40C44ADF0E3798F4008FCC51 /* Debug */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				COMBINE_HIDPI_IMAGES = YES;
+				GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
+				MACOSX_DEPLOYMENT_TARGET = 10.7;
+				PRODUCT_NAME = gtest;
+				SDKROOT = macosx;
+				TARGET_NAME = gtest;
+			};
+			name = Debug;
+		};
+		40C44AE00E3798F4008FCC51 /* Release */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				COMBINE_HIDPI_IMAGES = YES;
+				GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
+				MACOSX_DEPLOYMENT_TARGET = 10.7;
+				PRODUCT_NAME = gtest;
+				SDKROOT = macosx;
+				TARGET_NAME = gtest;
+			};
+			name = Release;
+		};
+		40C848FB101A209D0083642A /* Debug */ = {
+			isa = XCBuildConfiguration;
+			baseConfigurationReference = 40899FB30FFA7567000B29AE /* StaticLibraryTarget.xcconfig */;
+			buildSettings = {
+				COMBINE_HIDPI_IMAGES = YES;
+				GCC_INLINES_ARE_PRIVATE_EXTERN = YES;
+				GCC_SYMBOLS_PRIVATE_EXTERN = YES;
+				GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
+				HEADER_SEARCH_PATHS = (
+					../,
+					../include/,
+				);
+				PRODUCT_NAME = gtest;
+				SDKROOT = macosx;
+			};
+			name = Debug;
+		};
+		40C848FC101A209D0083642A /* Release */ = {
+			isa = XCBuildConfiguration;
+			baseConfigurationReference = 40899FB30FFA7567000B29AE /* StaticLibraryTarget.xcconfig */;
+			buildSettings = {
+				COMBINE_HIDPI_IMAGES = YES;
+				GCC_INLINES_ARE_PRIVATE_EXTERN = YES;
+				GCC_SYMBOLS_PRIVATE_EXTERN = YES;
+				GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
+				HEADER_SEARCH_PATHS = (
+					../,
+					../include/,
+				);
+				PRODUCT_NAME = gtest;
+				SDKROOT = macosx;
+			};
+			name = Release;
+		};
+		40C8490E101A217F0083642A /* Debug */ = {
+			isa = XCBuildConfiguration;
+			baseConfigurationReference = 40899FB30FFA7567000B29AE /* StaticLibraryTarget.xcconfig */;
+			buildSettings = {
+				COMBINE_HIDPI_IMAGES = YES;
+				GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
+				HEADER_SEARCH_PATHS = (
+					../,
+					../include/,
+				);
+				PRODUCT_NAME = gtest_main;
+				SDKROOT = macosx;
+			};
+			name = Debug;
+		};
+		40C8490F101A217F0083642A /* Release */ = {
+			isa = XCBuildConfiguration;
+			baseConfigurationReference = 40899FB30FFA7567000B29AE /* StaticLibraryTarget.xcconfig */;
+			buildSettings = {
+				COMBINE_HIDPI_IMAGES = YES;
+				GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
+				HEADER_SEARCH_PATHS = (
+					../,
+					../include/,
+				);
+				PRODUCT_NAME = gtest_main;
+				SDKROOT = macosx;
+			};
+			name = Release;
+		};
+		40C84985101A36850083642A /* Debug */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
+				HEADER_SEARCH_PATHS = ../;
+				PRODUCT_NAME = gtest_unittest;
+				SDKROOT = macosx;
+			};
+			name = Debug;
+		};
+		40C84986101A36850083642A /* Release */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
+				HEADER_SEARCH_PATHS = ../;
+				PRODUCT_NAME = gtest_unittest;
+				SDKROOT = macosx;
+			};
+			name = Release;
+		};
+		40C84995101A36A60083642A /* Debug */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
+				PRODUCT_NAME = "sample1_unittest-static";
+				SDKROOT = macosx;
+			};
+			name = Debug;
+		};
+		40C84996101A36A60083642A /* Release */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
+				PRODUCT_NAME = "sample1_unittest-static";
+				SDKROOT = macosx;
+			};
+			name = Release;
+		};
+		4FADC24308B4156D00ABE55E /* Debug */ = {
+			isa = XCBuildConfiguration;
+			baseConfigurationReference = 40D4CDF20E30E07400294801 /* FrameworkTarget.xcconfig */;
+			buildSettings = {
+				COMBINE_HIDPI_IMAGES = YES;
+				DYLIB_COMPATIBILITY_VERSION = 1;
+				DYLIB_CURRENT_VERSION = 1;
+				GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
+				HEADER_SEARCH_PATHS = (
+					../,
+					../include/,
+				);
+				INFOPLIST_FILE = Resources/Info.plist;
+				INFOPLIST_PREFIX_HEADER = "$(PROJECT_TEMP_DIR)/Version.h";
+				INFOPLIST_PREPROCESS = YES;
+				PRODUCT_NAME = gtest;
+				SDKROOT = macosx;
+				VERSIONING_SYSTEM = "apple-generic";
+			};
+			name = Debug;
+		};
+		4FADC24408B4156D00ABE55E /* Release */ = {
+			isa = XCBuildConfiguration;
+			baseConfigurationReference = 40D4CDF20E30E07400294801 /* FrameworkTarget.xcconfig */;
+			buildSettings = {
+				COMBINE_HIDPI_IMAGES = YES;
+				DYLIB_COMPATIBILITY_VERSION = 1;
+				DYLIB_CURRENT_VERSION = 1;
+				GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
+				HEADER_SEARCH_PATHS = (
+					../,
+					../include/,
+				);
+				INFOPLIST_FILE = Resources/Info.plist;
+				INFOPLIST_PREFIX_HEADER = "$(PROJECT_TEMP_DIR)/Version.h";
+				INFOPLIST_PREPROCESS = YES;
+				PRODUCT_NAME = gtest;
+				SDKROOT = macosx;
+				VERSIONING_SYSTEM = "apple-generic";
+			};
+			name = Release;
+		};
+		4FADC24708B4156D00ABE55E /* Debug */ = {
+			isa = XCBuildConfiguration;
+			baseConfigurationReference = 40D4CDF10E30E07400294801 /* DebugProject.xcconfig */;
+			buildSettings = {
+			};
+			name = Debug;
+		};
+		4FADC24808B4156D00ABE55E /* Release */ = {
+			isa = XCBuildConfiguration;
+			baseConfigurationReference = 40D4CDF40E30E07400294801 /* ReleaseProject.xcconfig */;
+			buildSettings = {
+			};
+			name = Release;
+		};
+/* End XCBuildConfiguration section */
+
+/* Begin XCConfigurationList section */
+		3B238FA30E828BB600846E11 /* Build configuration list for PBXAggregateTarget "Check" */ = {
+			isa = XCConfigurationList;
+			buildConfigurations = (
+				3B238F600E828B5400846E11 /* Debug */,
+				3B238F610E828B5400846E11 /* Release */,
+			);
+			defaultConfigurationIsVisible = 0;
+			defaultConfigurationName = Release;
+		};
+		40899F4A0FFA71BC000B29AE /* Build configuration list for PBXNativeTarget "gtest_unittest-framework" */ = {
+			isa = XCConfigurationList;
+			buildConfigurations = (
+				40899F450FFA7185000B29AE /* Debug */,
+				40899F460FFA7185000B29AE /* Release */,
+			);
+			defaultConfigurationIsVisible = 0;
+			defaultConfigurationName = Release;
+		};
+		4089A0240FFACF01000B29AE /* Build configuration list for PBXNativeTarget "sample1_unittest-framework" */ = {
+			isa = XCConfigurationList;
+			buildConfigurations = (
+				4089A0150FFACEFD000B29AE /* Debug */,
+				4089A0160FFACEFD000B29AE /* Release */,
+			);
+			defaultConfigurationIsVisible = 0;
+			defaultConfigurationName = Release;
+		};
+		40C44AE40E379905008FCC51 /* Build configuration list for PBXAggregateTarget "Version Info" */ = {
+			isa = XCConfigurationList;
+			buildConfigurations = (
+				40C44ADF0E3798F4008FCC51 /* Debug */,
+				40C44AE00E3798F4008FCC51 /* Release */,
+			);
+			defaultConfigurationIsVisible = 0;
+			defaultConfigurationName = Release;
+		};
+		40C84902101A212E0083642A /* Build configuration list for PBXNativeTarget "gtest-static" */ = {
+			isa = XCConfigurationList;
+			buildConfigurations = (
+				40C848FB101A209D0083642A /* Debug */,
+				40C848FC101A209D0083642A /* Release */,
+			);
+			defaultConfigurationIsVisible = 0;
+			defaultConfigurationName = Release;
+		};
+		40C84912101A21D20083642A /* Build configuration list for PBXNativeTarget "gtest_main-static" */ = {
+			isa = XCConfigurationList;
+			buildConfigurations = (
+				40C8490E101A217F0083642A /* Debug */,
+				40C8490F101A217F0083642A /* Release */,
+			);
+			defaultConfigurationIsVisible = 0;
+			defaultConfigurationName = Release;
+		};
+		40C84984101A36850083642A /* Build configuration list for PBXNativeTarget "gtest_unittest-static" */ = {
+			isa = XCConfigurationList;
+			buildConfigurations = (
+				40C84985101A36850083642A /* Debug */,
+				40C84986101A36850083642A /* Release */,
+			);
+			defaultConfigurationIsVisible = 0;
+			defaultConfigurationName = Release;
+		};
+		40C84994101A36A60083642A /* Build configuration list for PBXNativeTarget "sample1_unittest-static" */ = {
+			isa = XCConfigurationList;
+			buildConfigurations = (
+				40C84995101A36A60083642A /* Debug */,
+				40C84996101A36A60083642A /* Release */,
+			);
+			defaultConfigurationIsVisible = 0;
+			defaultConfigurationName = Release;
+		};
+		4FADC24208B4156D00ABE55E /* Build configuration list for PBXNativeTarget "gtest-framework" */ = {
+			isa = XCConfigurationList;
+			buildConfigurations = (
+				4FADC24308B4156D00ABE55E /* Debug */,
+				4FADC24408B4156D00ABE55E /* Release */,
+			);
+			defaultConfigurationIsVisible = 0;
+			defaultConfigurationName = Release;
+		};
+		4FADC24608B4156D00ABE55E /* Build configuration list for PBXProject "gtest" */ = {
+			isa = XCConfigurationList;
+			buildConfigurations = (
+				4FADC24708B4156D00ABE55E /* Debug */,
+				4FADC24808B4156D00ABE55E /* Release */,
+			);
+			defaultConfigurationIsVisible = 0;
+			defaultConfigurationName = Release;
+		};
+/* End XCConfigurationList section */
+	};
+	rootObject = 0867D690FE84028FC02AAC07 /* Project object */;
+}
diff --git a/help/Commands/query.bf b/help/Commands/query.bf
new file mode 100644
index 0000000..fb0b696
--- /dev/null
+++ b/help/Commands/query.bf
@@ -0,0 +1,170 @@
+classStyle = "\n\\section*{_INSERT_DATA_FOR_Command_HERE_}\\begin{tabular}{lr}\\parbox[t]{2in}{\\textit{_INSERT_DATA_FOR_Class_HERE_\\newline _INSERT_DATA_FOR_Revised_HERE_}}&\\parbox{4in}{\\textsf{_INSERT_DATA_FOR_Description_HERE_}}\\end{tabular}"+
+"\n\n\\texttt{_INSERT_DATA_FOR_Syntax_HERE_}\\scriptsize{\\begin{flushleft}_INSERT_DATA_FOR_Notes_HERE_\\end{flushleft}}Example\\linebreak\\linespread{0.3}\\fbox{\\parbox{6in}{\\tiny\\begin{alltt}_INSERT_DATA_FOR_Example_HERE_\\end{alltt}}}\\linespread{1}\n";
+
+latexTop    = "\\documentclass[11pt]{article}\\usepackage{amssymb}\\usepackage{alltt}\\textwidth    = 6.25 in\\textheight  = 9 in\\oddsidemargin = 0.0 in\\evensidemargin = 0.0 in\\topmargin = 0.0 in\\headheight = 0.0 in\\headsep = 0.0 in\\parskip = 0.2in\\parindent = 0.0in\\begin{document}";
+latexBottom = "\end{document}";
+/*--------------------------------------------------*/
+
+function countHits (dummy)
+{
+	hitNames[hitCount] = SQL_ROW_DATA[0];
+	hitDescs[hitCount] = SQL_ROW_DATA[1];
+	hitCount = hitCount + 1;
+	return 0;
+}
+
+/*--------------------------------------------------*/
+
+function echoQuery (dummy)
+{
+	colCount = Columns (SQL_ROW_DATA);
+	if (doExport)
+	{
+		cText = classStyle;
+		for (cc=0; cc<colCount; cc=cc+1)
+		{
+			cName  = SQL_COLUMN_NAMES[cc];
+			
+			inLines = {{""}};
+			cr = SQL_ROW_DATA[cc]&&2;
+			if (Abs(cr))
+			{
+				sscanf (cr,"Lines",inLines);
+				c = "";
+				for (k=0; k<Columns(inLines)-1;k=k+1)
+				{
+					if (Abs(inLines[k]))
+					{
+						c = c+inLines[k]+"\\linebreak\n";
+					}
+					else
+					{
+						c = c+"\n\n";
+					}
+				}
+				c = c+inLines[k];
+				
+				cr = "#&$%~_^{}";
+				
+				for (rcc = 0; rcc < Abs(cr); rcc=rcc+1)
+				{
+					crp = "\\"+cr[rcc];
+					c=c^{{crp,crp}};
+				}
+
+				c=c^{{"\\|","$|$"}};
+				c=c^{{"\\[","$[$"}};
+				c=c^{{"\\]","$]$"}};
+
+				/*cr=cr^{{"\\\\\\\\","$\\backslash$"}};*/
+				
+				cText  = cText^{{"_INSERT_DATA_FOR_"+cName+"_HERE_",c}};
+				sscanf (cName,"Raw",rcc);
+			}
+			else
+			{
+				cText  = cText^{{"_INSERT_DATA_FOR_"+cName+"_HERE_","N/A"}};			
+			}
+		}	
+		fprintf (latexFile,"\n", cText);
+	}
+	else
+	{
+		for (cc=0; cc<colCount; cc=cc+1)
+		{
+			cName  = SQL_COLUMN_NAMES[cc];
+			cChars = Abs(cName);
+			
+			underLine = "";
+			
+			for (ck=0; ck<cChars;ck=ck+1)
+			{
+				underLine = underLine+"-";
+			}	
+			
+			fprintf (stdout, "\n", SQL_COLUMN_NAMES[cc],"\n",underLine,"\n", SQL_ROW_DATA[cc]&&2,"\n");
+		}
+	}
+	return 0;
+}
+
+/*--------------------------------------------------*/
+
+if (QUERY_FIELD == "Window")
+{
+	filePath = HYPHY_BASE_DIRECTORY + "Help" + DIRECTORY_SEPARATOR + "Commands"+DIRECTORY_SEPARATOR+"reference.sql";
+	OpenWindow (DATABASEWINDOW,{{filePath}},"SCREEN_WIDTH-100;SCREEN_HEIGHT-100;50;50");
+	return 0;
+}
+
+DoSQL (SQL_OPEN,"reference.sql",dbID);
+hitCount        = 0;
+hitNames        = {};
+hitDescs		= {}; 
+
+if (QUERY_FIELD == "Export")
+{
+	QUERY_FIELD = "Command";
+	doExport = 1;
+}
+else
+{
+	doExport = 0;
+}
+
+sqlQuery = "select Command, Description from HYPHY_REFERENCE where "+QUERY_FIELD+" glob '*" + QUERY_TERM+"*' order by Command";
+
+DoSQL (dbID,sqlQuery,"return countHits(0);");
+
+if (hitCount == 0)
+{
+	fprintf (stdout, "\nNo records matched your query\n");
+}
+else
+{
+	if (doExport)
+	{
+		DEFAULT_FILE_SAVE_NAME = "Commands.tex";
+		SetDialogPrompt ("Export a LaTex document to:");
+		fprintf (PROMPT_FOR_FILE, CLEAR_FILE,latexTop);
+		latexFile = LAST_FILE_PATH;
+		
+	}
+	if (hitCount > 1)
+	{
+		hitRecords = {hitCount,2};
+		for (cc=0; cc<hitCount; cc=cc+1)
+		{
+			hitRecords[cc][0] = hitNames[cc];
+			hitRecords[cc][1] = hitDescs[cc];
+		}
+		
+		ChoiceList (hitCount,"Choose a command",0,SKIP_NONE,hitRecords);
+
+		if (hitCount[0]<0)
+		{
+			DoSQL (SQL_CLOSE,"",dbID);
+			return 0;
+		}		
+		
+		for (h=0; h<Columns(hitCount); h=h+1)
+		{
+			hc = hitCount [h];
+			hitNames[0] = hitNames[hc];
+			DoSQL (dbID,"select Command, Class, Syntax, Description, Notes, Example, Revised from HYPHY_REFERENCE where Command = '" + hitNames[0]+"' order by Command","return echoQuery(0);");	
+		}
+		hitDescs    = 0;
+		hitRecords  = 0;
+	}
+	else
+	{
+		DoSQL (dbID,"select Command, Class, Syntax, Description, Notes, Example, Revised from HYPHY_REFERENCE where Command = '" + hitNames[0]+"' order by Command","return echoQuery(0);");
+	}
+	hitNames = 0;
+	if (doExport)
+	{
+		fprintf (latexFile,latexBottom);
+	}
+}
+
+DoSQL (SQL_CLOSE,"",dbID);
diff --git a/help/Commands/reference.sql b/help/Commands/reference.sql
new file mode 100644
index 0000000..eab70cd
Binary files /dev/null and b/help/Commands/reference.sql differ
diff --git a/help/Getting Started With HyPhy.pdf b/help/Getting Started With HyPhy.pdf
new file mode 100644
index 0000000..6e1ef1d
Binary files /dev/null and b/help/Getting Started With HyPhy.pdf differ
diff --git a/help/SelectionAnalyses.pdf b/help/SelectionAnalyses.pdf
new file mode 100644
index 0000000..999162d
Binary files /dev/null and b/help/SelectionAnalyses.pdf differ
diff --git a/package.json b/package.json
new file mode 100644
index 0000000..fc977e7
--- /dev/null
+++ b/package.json
@@ -0,0 +1,12 @@
+{
+  "name": "hyphy",
+  "version": "2.2.1",
+  "author": "Sergei L Kosakovsky Pond",
+  "repository": {
+  "type": "git",
+  "url": "https://github.com/veg/hyphy.git"
+  },
+    "scripts": {
+    "install": "/usr/local/bin/cmake .;make HYPHYMP"
+  }
+}
diff --git a/res/ChartAddIns/Approximate_CDF b/res/ChartAddIns/Approximate_CDF
new file mode 100644
index 0000000..f81b5ea
--- /dev/null
+++ b/res/ChartAddIns/Approximate_CDF
@@ -0,0 +1,34 @@
+if (NON_EMPTY_SELECTION)
+{
+	bounds = {6,1};
+	bounds[0] = 0.25;
+	bounds[1] = 0.5;
+	bounds[2] = 1;
+	bounds[3] = 1.5;
+	bounds[4] = 2;
+	bounds[5] = 4;
+	cdf_counts = {7,1};
+	
+	count = Columns (SELECTED_CHART_DATA);
+
+	for (counter=0; counter < count; counter = counter+1)
+	{
+		term = SELECTED_CHART_DATA [counter];
+		for (bin = 0; bin < 6; bin = bin+1)
+		{
+			if (term < bounds[bin])
+			{
+				break;
+			}
+		}
+		cdf_counts [bin] = cdf_counts[bin] + 1;
+	}
+	cdf_counts = cdf_counts * (1/count);
+	fprintf (stdout, cdf_counts, "\n");
+		
+}
+else
+{
+	NON_EMPTY_SELECTION = -1;
+}
+
diff --git a/res/ChartAddIns/Column Operations b/res/ChartAddIns/Column Operations
new file mode 100644
index 0000000..76e46ee
--- /dev/null
+++ b/res/ChartAddIns/Column Operations	
@@ -0,0 +1,88 @@
+if (NON_EMPTY_SELECTION)
+{
+	data_rows  	 		= Columns 	(SELECTED_CHART_ROWS);
+	selected_columns	= {data_rows, 1};
+	different_columns	= 0;
+	first_row			= SELECTED_CHART_ROWS[0];
+	counter				= 0;
+
+	while ((counter<data_rows)&&(SELECTED_CHART_ROWS[counter]==first_row))
+	{
+		selected_columns [different_columns] = SELECTED_CHART_COLS[counter];
+		different_columns = different_columns+1;
+		counter = counter + 1;
+	}
+
+	column_stensil = {different_columns,1};
+
+	for (counter=0; counter < different_columns; counter = counter + 1)
+	{
+		column_stensil [counter] = selected_columns[counter];
+	}
+
+	selected_columns = 0;
+
+	/*check selection consistency*/
+
+	counter = different_columns; 
+
+	while (counter+different_columns < data_rows)
+	{
+		first_row			= SELECTED_CHART_ROWS[counter];
+		for (counter2 = 0; counter2 < different_columns; counter2 = counter2 + 1)
+		{		
+			if ((SELECTED_CHART_COLS[counter2+counter]==column_stensil[counter2])&&(SELECTED_CHART_ROWS[counter2+counter]==first_row))
+			{
+				continue;
+			}
+			break;
+		}
+		if (counter2 != different_columns)
+		{
+			counter = -1;
+			break;
+		}
+		counter = counter+different_columns;
+	}
+
+	if (counter+different_columns!=data_rows)
+	{
+		fprintf (stdout, "Invalid selection: the same rows must be selected in each column\n");
+	}
+	else
+	{
+		fprintf (stdout, "Enter the column operation in terms of data_column[index], where index is between 0 and ", different_columns-1, ":");
+		fscanf  (stdin, "String", column_op);
+		
+		data_column = {different_columns,1};
+		
+		for (counter=0; counter < data_rows; counter = counter+different_columns)
+		{
+			for (counter2 = 0; counter2 < different_columns; counter2 = counter2 + 1)
+			{
+				data_column[counter2] = SELECTED_CHART_DATA[counter+counter2];
+			}
+			
+			data_column2 = data_column;
+			ExecuteCommands (column_op);
+
+			for (counter2 = 0; counter2 < different_columns; counter2 = counter2 + 1)
+			{
+				if (data_column[counter2] != data_column2[counter2])
+				{
+					SELECTED_CHART_DATA[counter+counter2] = data_column[counter2];
+					break;
+				}
+			}
+		}
+		data_column  = 0;
+		data_column2 = 0;
+		UPDATE_CELL_DATA = 1;
+	}
+
+	column_stensil = 0;
+}
+else
+{
+	NON_EMPTY_SELECTION = -1;
+}
diff --git a/res/ChartAddIns/Complex Select Cells By Value b/res/ChartAddIns/Complex Select Cells By Value
new file mode 100644
index 0000000..3325ae1
--- /dev/null
+++ b/res/ChartAddIns/Complex Select Cells By Value	
@@ -0,0 +1,138 @@
+if (NON_EMPTY_SELECTION)
+{
+	data_rows  	 		= Columns 	(SELECTED_CHART_ROWS);
+	selected_columns	= {data_rows, 1};
+	different_columns	= 0;
+	first_row			= SELECTED_CHART_ROWS[0];
+	counter				= 0;
+
+	while ((counter<data_rows)&&(SELECTED_CHART_ROWS[counter]==first_row))
+	{
+		selected_columns [different_columns] = SELECTED_CHART_COLS[counter];
+		different_columns = different_columns+1;
+		counter = counter + 1;
+	}
+
+	column_stensil = {different_columns,1};
+
+	for (counter=0; counter < different_columns; counter = counter + 1)
+	{
+		column_stensil [counter] = selected_columns[counter];
+	}
+
+	selected_columns = 0;
+
+	/*check selection consistency*/
+
+	counter = different_columns; 
+
+	while (counter+different_columns < data_rows)
+	{
+		first_row			= SELECTED_CHART_ROWS[counter];
+		for (counter2 = 0; counter2 < different_columns; counter2 = counter2 + 1)
+		{		
+			if ((SELECTED_CHART_COLS[counter2+counter]==column_stensil[counter2])&&(SELECTED_CHART_ROWS[counter2+counter]==first_row))
+			{
+				continue;
+			}
+			break;
+		}
+		if (counter2 != different_columns)
+		{
+			counter = -1;
+			break;
+		}
+		counter = counter+different_columns;
+	}
+
+	if (counter+different_columns!=data_rows)
+	{
+		fprintf (stdout, "Invalid selection: the same rows must be selected in each column\n");
+	}
+	else
+	{
+		cell_selector = "";
+		while (Abs(cell_selector) == 0)
+		{
+			fprintf (stdout, "\nSelection criterion in terms of cell_value[index], where index is between 0 and ", 
+								different_columns-1,":");
+								
+			fscanf  (stdin,  "String", cell_selector);
+		}
+		
+		ExecuteCommands ("cell_selector:="+cell_selector+";");
+		cell_value 		= {different_columns,1};
+		selectedData    = {data_rows,different_columns+1};
+		actualSelected  = 0;
+
+		for (counter=0; counter < data_rows; counter = counter+different_columns)
+		{
+			for (counter2 = 0; counter2 < different_columns; counter2 = counter2 + 1)
+			{
+				cell_value[counter2] = SELECTED_CHART_DATA[counter+counter2];
+			}
+			
+			if (cell_selector)
+			{
+				selectedData [actualSelected][0] = SELECTED_CHART_ROWS[counter]+1;			
+				for (counter2 = 0; counter2 < different_columns; counter2 = counter2 + 1)
+				{
+					selectedData [actualSelected][counter2+1] = SELECTED_CHART_DATA[counter+counter2];
+				}
+				actualSelected = actualSelected + 1;			
+			}
+		}
+		
+		if (actualSelected == 0)
+		{
+			fprintf (stdout, "\nNo cells matched selection criteria\n");
+		}
+		else
+		{
+			reallySelectedData = {actualSelected,different_columns+1};
+			
+			labels = {1,different_columns+1};
+			labels[0] = "Cell Index";
+			
+			for (count = 0; count < actualSelected; count = count + 1)
+			{
+				for (counter2 = 0; counter2 <= different_columns; counter2 = counter2+1)
+				{
+					reallySelectedData[count][counter2] = selectedData[count][counter2];
+				}
+			}
+
+			for (counter2 = 1; counter2 <= different_columns; counter2 = counter2+1)
+			{
+				count = column_stensil[counter2-1];
+				labels[counter2] = CHART_COLUMN_HEADERS[count];
+			}
+			
+			fprintf (stdout, "\nMatched ", Rows(reallySelectedData)," rows\n");
+			
+			selectedData = "Selected Data";
+			OpenWindow (CHARTWINDOW,{{selectedData}
+								   {"labels"},
+								   {"reallySelectedData"},
+								   {"Bar Chart"},
+								   {labels[0]},
+								   {labels[1]},
+								   {"Index"},
+								   {""},
+								   {"Value"},
+								   {"0"}
+								   {""}
+								   {"-1;-1"}
+								   {"10;1.309;0.785398"}
+								   {"Times:12:0;Times:10:0;Times:12:2"}
+								   {"0;0;13816530;16777215;0;0;6579300;11842740;13158600;14474460;0;3947580;16777215;15670812;6845928;16771158;2984993;9199669;7018159;1460610;16748822;11184810;14173291"}
+								   {"16"}
+								   },
+								   "SCREEN_WIDTH-60;SCREEN_HEIGHT-50;30;50");
+		}
+	}
+}
+else
+{
+	NON_EMPTY_SELECTION = -1;
+}
diff --git a/res/ChartAddIns/Contigency Table b/res/ChartAddIns/Contigency Table
new file mode 100644
index 0000000..01b87ab
--- /dev/null
+++ b/res/ChartAddIns/Contigency Table	
@@ -0,0 +1,142 @@
+if (NON_EMPTY_SELECTION)
+{
+	data_rows  	 = Columns 	(SELECTED_CHART_ROWS);
+
+	if (data_rows % 2 == 0)
+	{
+		temp = -1;
+		data_columns = -1;
+		
+		for (count = 0; count<data_rows; count = count+1)
+		{
+			temp2 = SELECTED_CHART_COLS[count];
+			if (temp<0)
+			{
+				temp = temp2;
+			}
+			else
+			{
+				if (temp!=temp2)
+				{
+					if (data_columns<0)
+					{
+						data_columns = temp2;
+					}
+					else
+					{
+						if (temp2!=data_columns)
+						{
+							break;
+						}
+					}
+				}
+			}
+		}
+		
+		if ((count == data_rows)&&(data_columns>=0)&&(temp>=0))
+		{
+			for (count = 0; count < data_rows; count = count+2)
+			{
+				if (SELECTED_CHART_ROWS[count]!=SELECTED_CHART_ROWS[count+1])
+				{
+					break;
+				}
+			}
+		
+			if (count==data_rows)
+			{
+			
+				SELECTED_CHART_ROWS = {2,data_rows/2};
+				for (count = 0; count < data_rows; count = count+2)
+				{
+					SELECTED_CHART_ROWS[0][count/2]=SELECTED_CHART_DATA[count];
+					SELECTED_CHART_ROWS[1][count/2]=SELECTED_CHART_DATA[count+1];
+				}
+				SELECTED_CHART_DATA = SELECTED_CHART_ROWS;
+				data_rows = data_rows/2;
+				
+				HASH_TABLE_1 = {};
+				HASH_TABLE_2 = {};
+				
+				for (count = 0; count < data_rows; count = count+1)
+				{
+					value = SELECTED_CHART_ROWS[0][count];
+					if (HASH_TABLE_1[value]==0)
+					{
+						HASH_TABLE_1[value] = Abs(HASH_TABLE_1)+1;
+					}
+					value = SELECTED_CHART_ROWS[1][count];
+					if (HASH_TABLE_2[value]==0)
+					{
+						HASH_TABLE_2[value] = Abs(HASH_TABLE_2)+1;
+					}
+				}
+				
+				
+				
+				C_TABLE = {Abs(HASH_TABLE_1),Abs(HASH_TABLE_2)};
+				
+				for (count = 0; count < data_rows; count = count+1)
+				{
+					value = SELECTED_CHART_ROWS[0][count];
+					value = HASH_TABLE_1[value]-1;
+					value2 = SELECTED_CHART_ROWS[1][count];
+					value2 = HASH_TABLE_2[value2]-1;
+					C_TABLE[value][value2] = C_TABLE[value][value2] + 1;
+				}
+				
+			    data_rows = Abs(HASH_TABLE_1);
+				data_cols = Abs(HASH_TABLE_2);
+
+				labels = {1,data_cols+1};
+				
+				keys = Rows (HASH_TABLE_2);
+				
+				for (count = 0; count < data_cols; count = count+1)
+				{
+					labels[count] = "" + keys[count];
+				}
+
+
+				keys = Rows (HASH_TABLE_1);
+				firstString = "Categories";
+				
+				for (count = 0; count < data_rows; count = count+1)
+				{
+					firstString = firstString + ";"+ keys[count];
+				}
+				
+				labels [data_cols] = firstString;
+				
+				fprintf (stdout, "\nFisher's exact p:", CChi2(C_TABLE,0), "\n");
+
+				OpenWindow (CHARTWINDOW,{{"Contigency Table"}
+								   {"labels"},
+								   {"C_TABLE"},
+								   {"None"},
+								   {""},
+								   {""},
+								   {"Index"},
+								   {""},
+								   {"Value"},
+								   {"0"}
+								   {""}
+								   {"-1;-1"}
+								   {"10;1.309;0.785398"}
+								   {"Times:12:0;Times:10:0;Times:12:2"}
+								   {"0;0;16777215;1644825;0;0;6579300;11842740;13158600;14474460;0;3947580;4294967295;15670812;6845928;16771158;2984993;9199669;7018159;1460610;16748822;11184810;14173291"}
+								   {"16"}
+								   },
+								   "SCREEN_WIDTH-60;SCREEN_HEIGHT-50;30;50");
+								   
+				return 0;
+			}
+		}
+	}
+
+	fprintf (stdout, "Please select two columns with the observations for two variables.\n");
+}
+else
+{
+	NON_EMPTY_SELECTION = -1;
+}
diff --git a/res/ChartAddIns/Covariance b/res/ChartAddIns/Covariance
new file mode 100644
index 0000000..1691617
--- /dev/null
+++ b/res/ChartAddIns/Covariance
@@ -0,0 +1,78 @@
+if (NON_EMPTY_SELECTION)
+{
+	data_rows  	 = Columns 	(SELECTED_CHART_ROWS);
+
+	if (data_rows % 2 == 0)
+	{
+		temp = -1;
+		data_columns = -1;
+		
+		for (count = 0; count<data_rows; count = count+1)
+		{
+			temp2 = SELECTED_CHART_COLS[count];
+			if (temp<0)
+			{
+				temp = temp2;
+			}
+			else
+			{
+				if (temp!=temp2)
+				{
+					if (data_columns<0)
+					{
+						data_columns = temp2;
+					}
+					else
+					{
+						if (temp2!=data_columns)
+						{
+							break;
+						}
+					}
+				}
+			}
+		}
+		
+		if ((count == data_rows)&&(data_columns>=0)&&(temp>=0))
+		{
+			for (count = 0; count < data_rows; count = count+2)
+			{
+				if (SELECTED_CHART_ROWS[count]!=SELECTED_CHART_ROWS[count+1])
+				{
+					break;
+				}
+			}
+		
+			if (count==data_rows)
+			{
+			
+				SELECTED_CHART_ROWS = {2,data_rows/2};
+
+				sumX  = 0;
+				sumY  = 0;
+				sumXY = 0;
+
+				for (count = 0; count < data_rows; count = count+2)
+				{
+					x_v = SELECTED_CHART_DATA[count];
+					y_v = SELECTED_CHART_DATA[count+1];
+					sumX  = sumX + x_v;
+					sumY  = sumY + y_v;
+					sumXY = sumXY + y_v*x_v;
+				}
+				data_rows = data_rows/2;
+				
+				fprintf (stdout, "\nEstimated covariance: ", sumXY/data_rows - sumX*sumY/data_rows^2 , "\n");
+				
+				return 0;
+			}
+		}
+	}
+
+	fprintf (stdout, "Please select two columns to compute the covariance of.\n");
+}
+else
+{
+	NON_EMPTY_SELECTION = -1;
+}
+
diff --git a/res/ChartAddIns/DBAddIns/DescriptiveStats.bf b/res/ChartAddIns/DBAddIns/DescriptiveStats.bf
new file mode 100644
index 0000000..3844993
--- /dev/null
+++ b/res/ChartAddIns/DBAddIns/DescriptiveStats.bf
@@ -0,0 +1,49 @@
+_HY_DBW_OUTPUT_PROCESSOR_NAME_ = "Descriptive Statistics";
+
+/*--------------------------------------------------*/
+
+function _HY_DBW_OUTPUT_PROCESSOR_FUNCTION_ (dummy)
+{
+	colCount = Columns (SQL_ROW_DATA);
+	
+	if (Abs(_CW_columnHeaders[0]) == 0)
+	{
+		_CW_columnHeaders = SQL_COLUMN_NAMES;
+	}
+	
+	_CW_dataRows [Abs(_CW_dataRows)] = SQL_ROW_DATA;
+	return 0;
+}
+
+/*--------------------------------------------------*/
+
+if (_HY_DBW_OUTPUT_RUN_ME_)	
+{
+	recordCounter = 0;
+	
+	_CW_columnHeaders = {};
+	_CW_dataRows	  = {};
+	
+	DoSQL (_HY_DBW_OUTPUT_DB_ID_, _HY_DBW_SQL_QUERY, "return _HY_DBW_OUTPUT_PROCESSOR_FUNCTION_ (0);");
+	
+	rowCount = Abs (_CW_dataRows);
+	colCount = Columns(_CW_columnHeaders);
+	
+	if (rowCount && colCount == 1)
+	{
+		_CW_datatable = {rowCount,1}["0 + (_CW_dataRows [_MATRIX_ELEMENT_ROW_])[0]"];
+		_CW_dataRows = 0;
+		
+		LoadFunctionLibrary   ("DescriptiveStatistics");
+		LoadFunctionLibrary   ("PS_Plotters.bf");
+		
+		fprintf (stdout, "Quantity label:");
+		fscanf	(stdin, "String", dataLabel);
+		histPlot = PSHistogram (_CW_datatable,0,1,"TimesNewRoman",{{400,400,12}},{{0.3,0.3,0.3}},{{"",dataLabel,"Frequency"}},1);
+		DEFAULT_FILE_SAVE_NAME = "Histogram.ps";
+		SetDialogPrompt ("Write a Postscript histogram file to:");
+		fprintf (PROMPT_FOR_FILE, CLEAR_FILE, histPlot);
+		
+		PrintDescriptiveStats (dataLabel, GatherDescriptiveStats (_CW_datatable));
+	}
+}
diff --git a/res/ChartAddIns/DBAddIns/FromSQLFlatFile.bf b/res/ChartAddIns/DBAddIns/FromSQLFlatFile.bf
new file mode 100644
index 0000000..bcf88d1
--- /dev/null
+++ b/res/ChartAddIns/DBAddIns/FromSQLFlatFile.bf
@@ -0,0 +1,16 @@
+_HY_DBW_OUTPUT_PROCESSOR_NAME_ = "Import Records from SQL file";
+
+if (_HY_DBW_OUTPUT_RUN_ME_)	
+{
+	SetDialogPrompt ("SQL to import from:");
+	fscanf 			(PROMPT_FOR_FILE,"Raw",inSQL);
+
+	DoSQL 			(_HY_DBW_OUTPUT_DB_ID_, inSQL, "return 0;");	
+}
+
+/*--------------------------------------------------*/
+
+function _HY_DBW_OUTPUT_PROCESSOR_FUNCTION_ (dummy)
+{
+	return 0;
+}
diff --git a/res/ChartAddIns/DBAddIns/HY_DBW_TemplateList b/res/ChartAddIns/DBAddIns/HY_DBW_TemplateList
new file mode 100644
index 0000000..6375756
--- /dev/null
+++ b/res/ChartAddIns/DBAddIns/HY_DBW_TemplateList
@@ -0,0 +1,12 @@
+HY_DBW_TemplateList = {};
+
+HY_DBW_TemplateList ["Select all values from columns"] 	 = "SELECT ALL _HY_DBW_COLUMN_NAMES_ FROM _HY_DBW_TABLE_NAME_ ORDER BY _HY_DBW_COLUMN_NAMES_";
+HY_DBW_TemplateList ["Select distinct values from columns"] = "SELECT DISTINCT _HY_DBW_COLUMN_NAMES_ FROM _HY_DBW_TABLE_NAME_ ORDER BY _HY_DBW_COLUMN_NAMES_";
+HY_DBW_TemplateList ["Sort on selected columns"] = "SELECT * FROM _HY_DBW_TABLE_NAME_ ORDER BY _HY_DBW_COLUMN_NAMES_";
+HY_DBW_TemplateList ["Add a column"] = "ALTER TABLE _HY_DBW_TABLE_NAME_ ADD COLUMN COLUMN_NAME COLUMN_TYPE";
+HY_DBW_TemplateList ["Sep1"] = "";
+HY_DBW_TemplateList ["Select rows matching selected values"] = "SELECT * FROM _HY_DBW_TABLE_NAME_ WHERE _HY_DBW_ROW_VALUES_ ORDER BY _HY_DBW_COLUMN_NAMES_";
+HY_DBW_TemplateList ["Sep2"] = "";
+HY_DBW_TemplateList ["Reload table"] = "SELECT * FROM _HY_DBW_TABLE_NAME_";
+HY_DBW_TemplateList ["Show table structure"] = "SELECT sql FROM SQLITE_MASTER WHERE NAME = '_HY_DBW_TABLE_NAME_'";
+
diff --git a/res/ChartAddIns/DBAddIns/ToChartWindow.bf b/res/ChartAddIns/DBAddIns/ToChartWindow.bf
new file mode 100644
index 0000000..68e7e56
--- /dev/null
+++ b/res/ChartAddIns/DBAddIns/ToChartWindow.bf
@@ -0,0 +1,53 @@
+_HY_DBW_OUTPUT_PROCESSOR_NAME_ = "Chart window";
+
+/*--------------------------------------------------*/
+
+function _HY_DBW_OUTPUT_PROCESSOR_FUNCTION_ (dummy)
+{
+	colCount = Columns (SQL_ROW_DATA);
+	
+	if (Abs(_CW_columnHeaders[0]) == 0)
+	{
+		_CW_columnHeaders = SQL_COLUMN_NAMES;
+	}
+	
+	_CW_dataRows [Abs(_CW_dataRows)] = SQL_ROW_DATA;
+	return 0;
+}
+
+/*--------------------------------------------------*/
+
+if (_HY_DBW_OUTPUT_RUN_ME_)	
+{
+	recordCounter = 0;
+	
+	_CW_columnHeaders = {};
+	_CW_dataRows	  = {};
+	
+	DoSQL (_HY_DBW_OUTPUT_DB_ID_, _HY_DBW_SQL_QUERY, "return _HY_DBW_OUTPUT_PROCESSOR_FUNCTION_ (0);");
+	
+	rowCount = Abs (_CW_dataRows);
+	if (rowCount)
+	{
+		_CW_datatable = {rowCount,colCount};
+		
+		for (ri = 0; ri < rowCount; ri = ri+1)
+		{
+			dRow = _CW_dataRows[ri];
+			
+			for (ci = 0; ci < colCount; ci = ci+1)
+			{
+				_CW_datatable [ri][ci] = 0 + dRow [ci];
+			}
+		}
+		
+		_CW_dataRows = 0;
+		
+		OpenWindow (CHARTWINDOW,{{"SQL Table Extract"}
+								   {"_CW_columnHeaders"},
+								   {"_CW_datatable"},
+								   {"None"},
+								   {"Index"}},
+								   "SCREEN_WIDTH-60;SCREEN_HEIGHT-50;30;50");
+	}
+}
diff --git a/res/ChartAddIns/DBAddIns/ToConsole.bf b/res/ChartAddIns/DBAddIns/ToConsole.bf
new file mode 100644
index 0000000..f969623
--- /dev/null
+++ b/res/ChartAddIns/DBAddIns/ToConsole.bf
@@ -0,0 +1,35 @@
+_HY_DBW_OUTPUT_PROCESSOR_NAME_ = "Console, by record";
+
+/*--------------------------------------------------*/
+
+function _HY_DBW_OUTPUT_PROCESSOR_FUNCTION_ (dummy)
+{
+	colCount = Columns (SQL_ROW_DATA);
+	
+	recordCounter = recordCounter + 1;
+	fprintf (stdout, "\nRECORD ", recordCounter, "\n");
+	
+	for (cc=0; cc<colCount; cc=cc+1)
+	{
+		cName  = SQL_COLUMN_NAMES[cc];
+		cChars = Abs(cName);
+		
+		underLine = "";
+		
+		for (ck=0; ck<cChars;ck=ck+1)
+		{
+			underLine = underLine+"-";
+		}	
+		
+		fprintf (stdout, "\n", SQL_COLUMN_NAMES[cc],"\n",underLine,"\n", SQL_ROW_DATA[cc]&&2,"\n");
+	}
+	return 0;
+}
+
+/*--------------------------------------------------*/
+
+if (_HY_DBW_OUTPUT_RUN_ME_)
+{
+	recordCounter = 0;
+	DoSQL (_HY_DBW_OUTPUT_DB_ID_, _HY_DBW_SQL_QUERY, "return _HY_DBW_OUTPUT_PROCESSOR_FUNCTION_ (0);");
+}
diff --git a/res/ChartAddIns/DBAddIns/ToFastaFile.bf b/res/ChartAddIns/DBAddIns/ToFastaFile.bf
new file mode 100644
index 0000000..727936e
--- /dev/null
+++ b/res/ChartAddIns/DBAddIns/ToFastaFile.bf
@@ -0,0 +1,32 @@
+_HY_DBW_OUTPUT_PROCESSOR_NAME_ = "File, FASTA";
+
+/*--------------------------------------------------*/
+
+function _HY_DBW_OUTPUT_PROCESSOR_FUNCTION_ (dummy)
+{
+	colCount = Columns (SQL_ROW_DATA);
+	
+	if (colCount >= 2)
+	{
+		cString = "";
+		cString * 128;		
+		cString  * (">"+SQL_ROW_DATA[0]+"\n");
+		cString  * (SQL_ROW_DATA[1]+"\n");
+		cString * 0;
+		
+		fprintf (_HY_DBW_TAB_DELIMITED_FILE_,cString,"\n");
+		recordCounter = 1;
+	}
+	return 0;
+}
+
+/*--------------------------------------------------*/
+
+if (_HY_DBW_OUTPUT_RUN_ME_)
+{
+	SetDialogPrompt ("File to export to:");
+	fprintf (PROMPT_FOR_FILE,CLEAR_FILE);
+	_HY_DBW_TAB_DELIMITED_FILE_ = LAST_FILE_PATH;
+	recordCounter = 0;
+	DoSQL (_HY_DBW_OUTPUT_DB_ID_, _HY_DBW_SQL_QUERY, "return _HY_DBW_OUTPUT_PROCESSOR_FUNCTION_ (0);");
+}
diff --git a/res/ChartAddIns/DBAddIns/ToFastaFileFromPandit.bf b/res/ChartAddIns/DBAddIns/ToFastaFileFromPandit.bf
new file mode 100644
index 0000000..7b3f953
--- /dev/null
+++ b/res/ChartAddIns/DBAddIns/ToFastaFileFromPandit.bf
@@ -0,0 +1,73 @@
+_HY_DBW_OUTPUT_PROCESSOR_NAME_ = "File, FASTA from PANDIT";
+ExecuteAFile		(HYPHY_LIB_DIRECTORY+"TemplateBatchFiles"+DIRECTORY_SEPARATOR+"Utility"+DIRECTORY_SEPARATOR+"ReadDelimitedFiles.bf");
+ExecuteAFile		(HYPHY_LIB_DIRECTORY+"TemplateBatchFiles"+DIRECTORY_SEPARATOR+"Utility"+DIRECTORY_SEPARATOR+"GrabBag.bf");
+ExecuteAFile		(HYPHY_LIB_DIRECTORY+"TemplateBatchFiles"+DIRECTORY_SEPARATOR+"TreeTools.ibf");
+
+VERBOSITY_LEVEL = -1;
+/*--------------------------------------------------*/
+
+function _HY_DBW_OUTPUT_PROCESSOR_FUNCTION_ (dummy)
+{
+	colCount = Columns (SQL_ROW_DATA);
+	
+	if (colCount == 4)
+	{
+		Topology		T = SQL_ROW_DATA[1];
+		tAVL 			  = T^0;
+
+		usedLeafLabels = {};
+		oldToNewMap	   = {};
+
+		for (k=1; k<Abs(tAVL); k=k+1)
+		{
+			cName 		=	 	(tAVL[k])["Name"];
+			nName		= 		normalizeSequenceID (cName, "usedLeafLabels");
+			if (nName != cName)
+			{
+				(tAVL[k])["Name"] = nName;
+			}
+			oldToNewMap[cName] = nName;
+		}
+
+		DATAFILE_TREE 			= PostOrderAVL2String(tAVL);
+
+		DataSet testDS 			= ReadFromString (SQL_ROW_DATA[3]);
+
+		for (k=0; k<testDS.species; k=k+1)
+		{
+			GetString    (cName, testDS,k);
+			SetParameter (testDS,k,oldToNewMap[cName]);
+		}			
+	
+		IS_TREE_PRESENT_IN_DATA = 1;
+		
+		goodPositions = SQL_ROW_DATA[2]||"x|X";
+		includeThese  = stringMatrixToAVL ("goodPositions");
+		DataSetFilter theF = CreateFilter (testDS,1,includeThese[siteIndex]);
+		
+		if (recordCount == 0)
+		{
+			DEFAULT_FILE_SAVE_NAME		= SQL_ROW_DATA[0] + ".nex";
+			SetDialogPrompt 			 ("File to export to:");
+			fprintf 				 	 (PROMPT_FOR_FILE,CLEAR_FILE,theF);
+			_HY_DBW_TAB_DELIMITED_FILE_ = LAST_FILE_PATH $ ("\\"+DIRECTORY_SEPARATOR+"[^\\"+DIRECTORY_SEPARATOR+"]+$");
+			_HY_DBW_TAB_DELIMITED_FILE_	= LAST_FILE_PATH[0][_HY_DBW_TAB_DELIMITED_FILE_[0]];
+		}
+		else
+		{
+			_HY_DBW_TAB_DELIMITED_FILE2_ = _HY_DBW_TAB_DELIMITED_FILE_ + SQL_ROW_DATA[0] + ".nex";
+			fprintf 				 	 (_HY_DBW_TAB_DELIMITED_FILE2_,CLEAR_FILE,theF);
+		}
+		recordCount = 1;
+	}
+	return 0;
+}
+
+/*--------------------------------------------------*/
+
+if (_HY_DBW_OUTPUT_RUN_ME_)
+{
+	recordCount = 0;
+	_HY_DBW_TAB_DELIMITED_FILE_ = LAST_FILE_PATH;
+	DoSQL (_HY_DBW_OUTPUT_DB_ID_, _HY_DBW_SQL_QUERY, "return _HY_DBW_OUTPUT_PROCESSOR_FUNCTION_ (0);");
+}
diff --git a/res/ChartAddIns/DBAddIns/ToFrontierFastaFile.bf b/res/ChartAddIns/DBAddIns/ToFrontierFastaFile.bf
new file mode 100644
index 0000000..c40033b
--- /dev/null
+++ b/res/ChartAddIns/DBAddIns/ToFrontierFastaFile.bf
@@ -0,0 +1,62 @@
+_HY_DBW_OUTPUT_PROCESSOR_NAME_ = "File, Frontier Header FASTA";
+
+/*--------------------------------------------------*/
+
+function _HY_DBW_OUTPUT_PROCESSOR_FUNCTION_ (dummy)
+{
+	colCount = Columns (SQL_ROW_DATA);
+	
+	if (colCount == 2)
+	{
+		cString = "";
+		cString * 128;		
+		headerSplit = splitOnRegExp(SQL_ROW_DATA[0],"\\|");
+		
+		if (SQL_COLUMN_NAMES[1] == "RAW")
+		{
+			seqno = 1;
+		}
+		else
+		{
+			seqno = 2;
+		}
+		
+		cString  * (">"+headerSplit[0]+" "+headerSplit[1]+" seqno=" + seqno + "\n");
+		cString  * (SQL_ROW_DATA[1]+"\n");
+		cString * 0;
+		
+		fprintf (_HY_DBW_TAB_DELIMITED_FILE_,cString,"\n");
+		recordCounter = 1;
+	}
+	return 0;
+}
+
+/*--------------------------------------------------*/
+
+if (_HY_DBW_OUTPUT_RUN_ME_)
+{
+	SetDialogPrompt ("File to export to:");
+	fprintf (PROMPT_FOR_FILE,CLEAR_FILE, KEEP_OPEN);
+	_HY_DBW_TAB_DELIMITED_FILE_ = LAST_FILE_PATH;
+	recordCounter = 0;
+	DoSQL (_HY_DBW_OUTPUT_DB_ID_, _HY_DBW_SQL_QUERY, "return _HY_DBW_OUTPUT_PROCESSOR_FUNCTION_ (0);");
+	fprintf (_HY_DBW_TAB_DELIMITED_FILE_,CLOSE_FILE);
+}
+
+/*----------------------------------------------------------------*/
+
+function splitOnRegExp (string, splitter)
+{
+	matched = string || splitter;
+	splitBits = {};
+	fromPos = 0;
+	toPos	= 0;
+	for (mc = 0; mc < Rows (matched); mc = mc+2)
+	{
+		toPos = matched[mc]-1;
+		splitBits [Abs(splitBits)] = string[fromPos][toPos];
+		fromPos    = matched[mc+1]+1;
+	}
+	splitBits [Abs(splitBits)] = string[fromPos][Abs(string)-1];
+	return splitBits;
+}
diff --git a/res/ChartAddIns/DBAddIns/ToSQLFlatFile.bf b/res/ChartAddIns/DBAddIns/ToSQLFlatFile.bf
new file mode 100644
index 0000000..db260ce
--- /dev/null
+++ b/res/ChartAddIns/DBAddIns/ToSQLFlatFile.bf
@@ -0,0 +1,97 @@
+_HY_DBW_OUTPUT_PROCESSOR_NAME_ = "File, SQL Instructions";
+
+/*--------------------------------------------------*/
+
+function _HY_DBW_OUTPUT_PROCESSOR_FUNCTION_ (dummy)
+{
+	colCount = Columns (SQL_ROW_DATA);
+	
+	if (colCount)
+	{
+		cString = "";
+		cString * 128;
+		cString * ("\nINSERT INTO "+tableID+ " (");
+		cString  * SQL_COLUMN_NAMES[0];
+		for (cc=1; cc<colCount; cc=cc+1)
+		{
+			cString  * ",";
+			cString  * SQL_COLUMN_NAMES[cc];
+		}
+		cString * ") VALUES ('";
+		
+		cString  * (SQL_ROW_DATA[0]);
+		cString  * "'";
+		for (cc=1; cc<colCount; cc=cc+1)
+		{
+			cString  * ", '";
+			cString  * (SQL_ROW_DATA[cc]);
+			cString  * "'";
+		}
+		cString * ");\n";
+		cString * 0;
+		
+		fprintf (_HY_DBW_TAB_DELIMITED_FILE_,cString);
+	}
+	return 0;
+}
+
+/*--------------------------------------------------*/
+
+function _HY_DBW_OUTPUT_PROCESSOR_FUNCTION_PRE_ (dummy)
+{
+	colCount = Columns (SQL_ROW_DATA);
+	
+	if (colCount)
+	{
+		cName = SQL_ROW_DATA[0];
+		sqliteTables[cName] = SQL_ROW_DATA[1];	
+	}
+	return 0;
+}
+
+/*--------------------------------------------------*/
+
+if (_HY_DBW_OUTPUT_RUN_ME_)
+{
+	SetDialogPrompt ("SQL text file to export to:");
+	fprintf (PROMPT_FOR_FILE,CLEAR_FILE,KEEP_OPEN);
+	_HY_DBW_TAB_DELIMITED_FILE_ = LAST_FILE_PATH;
+	
+	sqliteTables = {};
+	DoSQL (_HY_DBW_OUTPUT_DB_ID_, "SELECT name,sql from SQLITE_MASTER WHERE length(sql)>0", "return _HY_DBW_OUTPUT_PROCESSOR_FUNCTION_PRE_ (0);");	
+	
+	fprintf 		(stdout, "[FOUND ", Abs(sqliteTables), " TABLES]\n");
+	
+	tableChoice = {Abs(sqliteTables),2};
+	tn 			=  Rows(sqliteTables);
+	
+	for (cc = 0; cc < Abs(sqliteTables); cc = cc+1)
+	{
+		tableChoice[cc][0] = tn[cc];
+		tableChoice[cc][1] = "Table "+ tn[cc];
+		
+	}	
+
+	ChoiceList		(whichTable,"Which Table?",1, SKIP_NONE,tableChoice);
+	if (whichTable < 0)
+	{
+		return 0;
+	}
+	
+	ChoiceList		(exportTable,"Export Table Definition?",1, SKIP_NONE, "Yes", "Include SQL code to create the table",
+																		   "No","Export only record definitions");
+	
+	if (exportTable<0)
+	{
+		return 0;
+	}
+	
+	tableID = tableChoice[whichTable][0];
+	
+	if (exportTable==0)
+	{
+		fprintf (_HY_DBW_TAB_DELIMITED_FILE_, sqliteTables[tableID], ";\n");
+	}
+	DoSQL (_HY_DBW_OUTPUT_DB_ID_, "SELECT * from " + tableID, "return _HY_DBW_OUTPUT_PROCESSOR_FUNCTION_ (0);");	
+	fprintf (_HY_DBW_TAB_DELIMITED_FILE_,CLOSE_FILE);
+}
diff --git a/res/ChartAddIns/DBAddIns/ToTabFile.bf b/res/ChartAddIns/DBAddIns/ToTabFile.bf
new file mode 100644
index 0000000..d81b1a6
--- /dev/null
+++ b/res/ChartAddIns/DBAddIns/ToTabFile.bf
@@ -0,0 +1,48 @@
+_HY_DBW_OUTPUT_PROCESSOR_NAME_ = "File, tab delimited";
+
+/*--------------------------------------------------*/
+
+function _HY_DBW_OUTPUT_PROCESSOR_FUNCTION_ (dummy)
+{
+	colCount = Columns (SQL_ROW_DATA);
+	
+	if (colCount)
+	{
+		cString = "";
+		cString * 128;
+		if (recordCounter == 0)
+		{
+			cString  * SQL_COLUMN_NAMES[0];
+			for (cc=1; cc<colCount; cc=cc+1)
+			{
+				cString  * "\t";
+				cString  * SQL_COLUMN_NAMES[cc];
+			}
+			cString * "\n";
+		}
+		
+		cString  * (SQL_ROW_DATA[0]&&2);
+		for (cc=1; cc<colCount; cc=cc+1)
+		{
+			cString  * "\t";
+			cString  * (SQL_ROW_DATA[cc]&&2);
+		}
+		cString * 0;
+		
+		fprintf (_HY_DBW_TAB_DELIMITED_FILE_,cString,"\n");
+		recordCounter = 1;
+	}
+	return 0;
+}
+
+/*--------------------------------------------------*/
+
+if (_HY_DBW_OUTPUT_RUN_ME_)
+{
+	SetDialogPrompt ("File to export to:");
+	fprintf (PROMPT_FOR_FILE,CLEAR_FILE,KEEP_OPEN);
+	_HY_DBW_TAB_DELIMITED_FILE_ = LAST_FILE_PATH;
+	recordCounter = 0;
+	DoSQL (_HY_DBW_OUTPUT_DB_ID_, _HY_DBW_SQL_QUERY, "return _HY_DBW_OUTPUT_PROCESSOR_FUNCTION_ (0);");
+	fprintf (_HY_DBW_TAB_DELIMITED_FILE_,CLOSE_FILE);
+}
diff --git a/res/ChartAddIns/Descriptive Statistics b/res/ChartAddIns/Descriptive Statistics
new file mode 100644
index 0000000..d12ca1d
--- /dev/null
+++ b/res/ChartAddIns/Descriptive Statistics	
@@ -0,0 +1,91 @@
+if (NON_EMPTY_SELECTION)
+{
+	count = Columns (SELECTED_CHART_DATA);
+
+	sum  = 0;
+	sum2 = 0;
+	sum3 = 0;
+	sum4 = 0;
+	
+	SELECTED_CHART_DATA = Transpose(SELECTED_CHART_DATA)%0;
+	
+	data_min  = SELECTED_CHART_DATA [0];
+	data_max  = SELECTED_CHART_DATA [count-1];
+	data_25   = SELECTED_CHART_DATA [(count*0.025)$1];
+	data_975  = SELECTED_CHART_DATA [Min((count*0.975+0.5)$1,count-1)];
+	
+	if (count%2)
+	{
+		median = SELECTED_CHART_DATA[count/2];
+	}
+	else
+	{
+		counter = count/2-1;
+		median = (SELECTED_CHART_DATA[counter]+SELECTED_CHART_DATA[counter+1])/2;
+	}
+
+	for (counter=0; counter < count; counter = counter+1)
+	{
+		term = SELECTED_CHART_DATA [counter];
+		sum  = sum+term;
+		sum2 = sum2+term*term;
+		sum3 = sum3+term^3;
+		sum4 = sum4+term^4;
+	}
+
+	if (count > 1)
+	{
+		counter = (sum2-sum*sum/count)/(count-1);
+		
+		if (count > 3)
+		{
+			sum4 = (-6*sum^4+12*count*sum^2*sum2-3(count-1)*count*sum2^2-4*count(count+1)*sum*sum3+count^2*(count+1)*sum4)/(count*(count-1)*(count-2)*(count-3));
+			sum4 = sum4/counter^2+3;
+		}
+		else
+		{
+			sum4 = 0;
+		}	
+
+		if (count > 2)
+		{
+			sum3 = (2*sum^3-3*count*sum*sum2+count^2*sum3)/(count*(count-1)*(count-2))/Sqrt(counter^2);
+		}
+		else
+		{
+			sum3 = 0;
+		}	
+		
+		fprintf (stdout, "\nCount    = ", count,
+						 "\nMean     = ", sum/count,
+						 "\nMedian   = ", median,
+						 "\nVariance = ", counter,
+						 "\nStd.Dev  = ", Sqrt (counter),
+						 "\nCOV      = ", Sqrt (counter)*count/sum,
+						 "\nSum      = ", sum,
+						 "\nSq. sum  = ", sum2,
+						 "\nSkewness = ", sum3,
+						 "\nKurtosis = ", sum4,
+						 "\nMin      = ", data_min,
+						 "\n2.5%     = ", data_25,
+						 "\n97.5%    = ", data_975,
+						 "\nMax      = ", data_max,"\n\n");
+	}
+	else
+	{
+		fprintf (stdout, "\nCount    = ", count,
+						 "\nMean     = ", sum/count,
+						 "\nMedian   = ", median,
+						 "\nVariance = Inf",
+						 "\nStd.Dev  = Inf",
+						 "\nCOV      = Inf",
+						 "\nSum      = ", sum,
+						 "\nSq. sum  = ", sum2,
+						 "\nMin      = ", data_min,
+						 "\nMax      = ", data_max,"\n\n""\n\n");
+	}
+}
+else
+{
+	NON_EMPTY_SELECTION = -1;
+}
diff --git a/res/ChartAddIns/Distribution Moments b/res/ChartAddIns/Distribution Moments
new file mode 100644
index 0000000..719ef97
--- /dev/null
+++ b/res/ChartAddIns/Distribution Moments	
@@ -0,0 +1,153 @@
+if (NON_EMPTY_SELECTION)
+{
+	data_rows  	 = Columns 	(SELECTED_CHART_ROWS);
+
+	if (data_rows % 2 == 0)
+	{
+		temp = -1;
+		data_columns = -1;
+		
+		for (count = 0; count<data_rows; count = count+1)
+		{
+			temp2 = SELECTED_CHART_COLS[count];
+			if (temp<0)
+			{
+				temp = temp2;
+			}
+			else
+			{
+				if (temp!=temp2)
+				{
+					if (data_columns<0)
+					{
+						data_columns = temp2;
+					}
+					else
+					{
+						if (temp2!=data_columns)
+						{
+							break;
+						}
+					}
+				}
+			}
+		}
+		
+		if ((count == data_rows)&&(data_columns>=0)&&(temp>=0))
+		{
+			for (count = 0; count < data_rows; count = count+2)
+			{
+				if (SELECTED_CHART_ROWS[count]!=SELECTED_CHART_ROWS[count+1])
+				{
+					break;
+				}
+			}
+		
+			if (count==data_rows)
+			{
+			
+				SELECTED_CHART_ROWS = {2,data_rows/2};
+				for (count = 0; count < data_rows; count = count+2)
+				{
+					SELECTED_CHART_ROWS[0][count/2]=SELECTED_CHART_DATA[count];
+					SELECTED_CHART_ROWS[1][count/2]=SELECTED_CHART_DATA[count+1];
+				}
+				SELECTED_CHART_DATA = SELECTED_CHART_ROWS;
+				data_rows = data_rows/2;
+				
+				/* decide what the weight column is: weights or cum. distr and whether the 1st or the 2nd column has weights */
+				
+				data_col   = 0;
+				weight_col = 1;
+				rm1 = 0;
+				
+				for (count = 0; count < data_rows; count = count + 1)
+				{
+					rm2 = SELECTED_CHART_DATA[weight_col][count];
+					if ((rm2<0)||(rm2>1))
+					{
+						break;
+					}
+					rm1 = rm1 + SELECTED_CHART_DATA[weight_col][count];
+				}
+				
+				if (Abs(rm1-1)>=0.00001 && Abs(rm2-1) >= 0.00001)
+				{
+					data_col   = 1;
+					weight_col = 0;
+					for (count = 0; count < data_rows; count = count + 1)
+					{
+						rm2 = SELECTED_CHART_DATA[weight_col][count];
+						if ((rm2<0)||(rm2>1))
+						{
+							fprintf (stdout, "Weight column must contain numbers between 0 and 1.\n");
+							return;
+						}
+						rm1 = rm1 + SELECTED_CHART_DATA[weight_col][count];
+					}
+				
+				}
+				
+				if (Abs(rm1-1)<0.00001)
+				/* weights */
+				{
+					rm1 = 0;
+					rm2  = 0;
+					rm3 = 0;
+					rm4 = 0;
+					for (count = 0; count < data_rows; count = count + 1)
+					{
+						temp = SELECTED_CHART_DATA[weight_col][count]*SELECTED_CHART_DATA[data_col][count];
+						rm1 = rm1 + temp;
+						rm2 = rm2+temp*SELECTED_CHART_DATA[data_col][count];
+						rm3 = rm3+temp*(SELECTED_CHART_DATA[data_col][count])^2;
+						rm4 = rm4+temp*(SELECTED_CHART_DATA[data_col][count])^3;
+					}
+				}
+				else
+				{
+					if (Abs(rm2-1)<0.00001)
+					/* cum distr */
+					{
+						rm1 =  SELECTED_CHART_DATA[weight_col][0]*SELECTED_CHART_DATA[data_col][0];
+						rm2  = rm1*SELECTED_CHART_DATA[data_col][0];
+						rm3 = rm2*SELECTED_CHART_DATA[data_col][0];
+						rm4 = rm3*SELECTED_CHART_DATA[data_col][0];
+						
+						for (count = 1; count < data_rows; count = count + 1)
+						{
+							temp = SELECTED_CHART_DATA[weight_col][count]-SELECTED_CHART_DATA[weight_col][count-1];
+							temp = temp*SELECTED_CHART_DATA[data_col][count];
+							rm1 = rm1 + temp;
+							temp = temp*SELECTED_CHART_DATA[data_col][count];
+							rm2 = rm2+temp;
+							temp = temp*SELECTED_CHART_DATA[data_col][count];
+							rm3 = rm3+temp;
+							rm4 = rm4+temp*SELECTED_CHART_DATA[data_col][count];
+						}			
+					}
+					else
+					{
+						fprintf (stdout, "Weight column is neither a collection of weights nor a cumulative probability.\n");
+						return;
+					}
+				}
+				var_value = rm2-rm1*rm1;
+				
+				fprintf (stdout, "\nMean     = ", rm1,
+								 "\nVariance = ", var_value,
+								 "\nSkewness = ", (2*rm1^3-3*rm1*rm2+rm3)/var_value^1.5,
+								 "\nKurtosis = ", (6*rm1^2*rm2-3*rm1^4-4*rm1*rm3+rm4)/var_value^2, 
+								 "\n");
+				return;
+			}
+		}
+	}
+
+	fprintf (stdout, "Please select two columns with distribution values (1st column) and weights (2nd columns).\n");
+}
+else
+{
+	NON_EMPTY_SELECTION = -1;
+}
+
diff --git a/res/ChartAddIns/DistributionAddIns/Event Posteriors b/res/ChartAddIns/DistributionAddIns/Event Posteriors
new file mode 100644
index 0000000..76b86b9
--- /dev/null
+++ b/res/ChartAddIns/DistributionAddIns/Event Posteriors	
@@ -0,0 +1,87 @@
+#include "Includes/posteriors.ibf";
+
+if (_CATEGORY_VARIABLE_EVENT_[0] >= 0)
+{
+	_moment_matrix = {_sites, 6};
+	
+	_event_size	   = Columns (_CATEGORY_VARIABLE_EVENT_);
+	
+	for (_counter2 = 0; _counter2 < _sites; _counter2 = _counter2 + 1)
+	{
+		_prior  	 = 0;
+		_posterior    = 0;
+		
+		for (_counter = 0; _counter < _event_size; _counter = _counter + 1)
+		{
+			_eidx = _CATEGORY_VARIABLE_EVENT_ [_counter];
+			
+			_prior     = _prior + _CATEGORY_VARIABLE_CDF_[0][_eidx];
+			_posterior = _posterior +  _MARGINAL_MATRIX_[_eidx][_counter2];
+		}
+		
+		_moment_matrix[_counter2][0] = _prior;
+		_moment_matrix[_counter2][1] = _posterior;
+		if (_prior>=1)
+		{
+			_moment_matrix[_counter2][2] = 1e100;		
+		}
+		else
+		{
+			_moment_matrix[_counter2][2] = _prior/(1-_prior);
+		}
+		if (_posterior>=1)
+		{
+			_moment_matrix[_counter2][3] = 1e100;		
+		}
+		else
+		{
+			_moment_matrix[_counter2][3] = _posterior/(1-_posterior);
+		}
+		_moment_matrix[_counter2][4] = _moment_matrix[_counter2][3]/_moment_matrix[_counter2][2];
+		_moment_matrix[_counter2][5] = Log(_moment_matrix[_counter2][4]);
+	}
+	
+	_labels = {{"Event Prior","Event Posterior", "Prior Odds", "Posterior Odds", "Bayes Factor","Log[Bayes Factor]",""}};
+
+
+	_rowLabel = "Site";
+	for (_counter2 = 1; _counter2 <= _sites; _counter2 = _counter2 + 1)
+	{
+		_rowLabel = _rowLabel + ";" + _counter2;
+	}
+
+	_labels [6] = _rowLabel;
+
+
+	promptString = "Event [" + (_CATEGORY_VARIABLE_EVENT_ [0]+1);
+	
+	for (_counter = 1; _counter < _event_size; _counter = _counter + 1)
+	{
+		promptString = promptString + "," + (_CATEGORY_VARIABLE_EVENT_ [_counter]+1);
+	}
+	
+	promptString = promptString + "] Info For " + _CATEGORY_VARIABLE_ID_;
+
+	OpenWindow (CHARTWINDOW,{{promptString}
+							   {"_labels"},
+							   {"_moment_matrix"},
+							   {"None"},
+							   {""},
+							   {""},
+							   {""},
+							   {""},
+							   {""},
+							   {"0"}},
+							   "SCREEN_WIDTH-60;SCREEN_HEIGHT-50;30;50");
+							   
+	_labels = 0;
+	_sites  = 0;
+	_momentMatrix = 0;
+}
+else
+{
+	fprintf (stdout, "\n+-------------------------------------------------------+\n"
+					   "|                EMPTY EVENT SELECTED                   |",
+					 "\n+-------------------------------------------------------+\n");
+					   
+}
diff --git a/res/ChartAddIns/DistributionAddIns/Includes/posteriors.ibf b/res/ChartAddIns/DistributionAddIns/Includes/posteriors.ibf
new file mode 100644
index 0000000..3871812
--- /dev/null
+++ b/res/ChartAddIns/DistributionAddIns/Includes/posteriors.ibf
@@ -0,0 +1,26 @@
+_sites 				= Columns (_MARGINAL_MATRIX_);
+_classes			= Rows	  (_MARGINAL_MATRIX_);
+
+_siteVector			= {1, _classes};
+
+STASH_MARGINAL_MATRIX = _MARGINAL_MATRIX_;
+
+_post :< 1e300;
+_norm :< 1e300;
+
+for (_counter = 0; _counter < _sites; _counter = _counter + 1)
+{
+	_norm = 0;
+	for (_counter2 = 0; _counter2 < _classes; _counter2 = _counter2 + 1)
+	{
+		_post 			 		= _MARGINAL_MATRIX_[_counter2][_counter] * _CATEGORY_VARIABLE_CDF_ [0][_counter2];
+		_norm 			 		= _norm + _post;
+		_siteVector [_counter2] = _post;
+	}
+	_siteVector = _siteVector * (1/_norm);
+
+	for (_counter2 = 0; _counter2 < _classes; _counter2 = _counter2 + 1)
+	{
+		_MARGINAL_MATRIX_[_counter2][_counter] = _siteVector [_counter2];
+	}
+}
diff --git a/res/ChartAddIns/DistributionAddIns/Most Likely Class Assignment b/res/ChartAddIns/DistributionAddIns/Most Likely Class Assignment
new file mode 100644
index 0000000..bfad947
--- /dev/null
+++ b/res/ChartAddIns/DistributionAddIns/Most Likely Class Assignment	
@@ -0,0 +1,67 @@
+#include "Includes/posteriors.ibf";
+
+_labels   = {{"Class","Log likelihood"}};
+_CLASSES_ = {_sites,2};
+
+_CLASS_COUNT  = {};
+_CLASS_STRING = {};
+
+
+for (_counter2 = 0; _counter2 < _sites; _counter2 = _counter2 + 1)
+{
+	_maxP = 0;
+	_maxC = 0;
+	for (_counter3 = 0; _counter3 < _classes; _counter3 = _counter3 + 1)
+	{
+		if (_MARGINAL_MATRIX_[_counter3][_counter2] > _maxP)
+		{
+			_maxP = _MARGINAL_MATRIX_[_counter3][_counter2];
+			_maxC = _counter3;
+		}
+	}
+	_CLASSES_ [_counter2][0] = _maxC;
+	_CLASSES_ [_counter2][1] = Log(STASH_MARGINAL_MATRIX[_maxC][_counter2]);
+	
+	_CLASS_COUNT [_maxC] = _CLASS_COUNT [_maxC] + 1;
+	if (Abs(_CLASS_STRING[_maxC]))
+	{
+		_CLASS_STRING[_maxC] = _CLASS_STRING[_maxC] + "," + (3*_counter2) + "-" + (3*_counter2+2);
+	}
+	else
+	{
+		_CLASS_STRING[_maxC] =  "" + (3*_counter2) + "-" + (3*_counter2+2);
+	}
+	
+}
+
+
+promptString = "Class Assignments for Sites for " + _CATEGORY_VARIABLE_ID_;
+
+OpenWindow (CHARTWINDOW,{{promptString}
+						   {"_labels"},
+						   {"_CLASSES_"},
+						   {"Bar Chart"},
+						   {"Index"},
+						   {"Class"},
+						   {""},
+						   {""},
+						   {""},
+						   {"0"}},
+						   "SCREEN_WIDTH-60;SCREEN_HEIGHT-50;30;50");
+						   
+_labels = 0;
+_sites  = 0;
+
+for (_counter3 = 0; _counter3 < _classes; _counter3 = _counter3 + 1)
+{
+	fprintf (stdout, "\n", _CLASS_COUNT[_counter3], " sites in class ", _counter3);
+}
+
+fprintf (stdout, "\n");
+
+for (_counter3 = 0; _counter3 < _classes; _counter3 = _counter3 + 1)
+{
+	fprintf (stdout, "\nSites in class ", _counter3, "\n", _CLASS_STRING[_counter3]);
+}
+
+fprintf (stdout, "\n");
diff --git a/res/ChartAddIns/DistributionAddIns/Posterior Distribution b/res/ChartAddIns/DistributionAddIns/Posterior Distribution
new file mode 100644
index 0000000..b8f14a8
--- /dev/null
+++ b/res/ChartAddIns/DistributionAddIns/Posterior Distribution	
@@ -0,0 +1,34 @@
+#include "Includes/posteriors.ibf";
+
+_labels = {1, _sites+1};
+
+for (_counter2 = 1; _counter2 <= _sites; _counter2 = _counter2 + 1)
+{
+	_labels[_counter2-1] = "Site " + _counter2;
+}
+
+_rowLabel = "Prior";
+for (_counter2 = 0; _counter2 < _classes; _counter2 = _counter2 + 1)
+{
+	_rowLabel = _rowLabel + ";" + _CATEGORY_VARIABLE_CDF_ [0][_counter2];
+}
+
+_labels [_sites] = _rowLabel;
+
+
+promptString = "Posterior Distribution at Sites for " + _CATEGORY_VARIABLE_ID_;
+
+OpenWindow (CHARTWINDOW,{{promptString}
+						   {"_labels"},
+						   {"_MARGINAL_MATRIX_"},
+						   {"None"},
+						   {""},
+						   {""},
+						   {""},
+						   {""},
+						   {""},
+						   {"0"}},
+						   "SCREEN_WIDTH-60;SCREEN_HEIGHT-50;30;50");
+						   
+_labels = 0;
+_sites  = 0;
diff --git a/res/ChartAddIns/DistributionAddIns/Posterior Moments b/res/ChartAddIns/DistributionAddIns/Posterior Moments
new file mode 100644
index 0000000..de577f6
--- /dev/null
+++ b/res/ChartAddIns/DistributionAddIns/Posterior Moments	
@@ -0,0 +1,65 @@
+#include "Includes/posteriors.ibf";
+
+_moment_matrix = {_sites, 5};
+
+for (_counter2 = 0; _counter2 < _sites; _counter2 = _counter2 + 1)
+{
+	_firstmoment  = 0;
+	_secondmoment = 0;
+	_thirdmoment  = 0;
+	
+	_max_4_site	  = 0;
+	_site_mode	  = 0;
+	
+	for (_counter = 0; _counter < _classes; _counter = _counter + 1)
+	{
+		_temp = _MARGINAL_MATRIX_[_counter][_counter2];
+		if (_temp > _max_4_site)
+		{
+			_max_4_site = _temp;
+			_site_mode  = _counter;
+		}	
+		_temp =  _temp * _CATEGORY_VARIABLE_CDF_[1][_counter];
+		_firstmoment 	= _firstmoment 	+ _temp;
+		_temp = _temp * _CATEGORY_VARIABLE_CDF_[1][_counter];
+		_secondmoment	= _secondmoment + _temp;
+		_thirdmoment	= _thirdmoment + _temp * _CATEGORY_VARIABLE_CDF_[1][_counter];
+	}
+	
+	_moment_matrix [_counter2][0] = _firstmoment;
+	_moment_matrix [_counter2][1] = _secondmoment - _firstmoment^2;
+	_moment_matrix [_counter2][2] = Sqrt(_moment_matrix [_counter2][1])/Abs(_firstmoment);	
+	_moment_matrix [_counter2][3] = (2*_firstmoment^3-3*_firstmoment*_secondmoment+_thirdmoment)/(_moment_matrix [_counter2][1])^1.5;
+	_moment_matrix [_counter2][4] = _CATEGORY_VARIABLE_CDF_[1][_site_mode];
+}
+
+
+_labels = {{"Expectation","Variance", "COV", "Skewness", "Mode", ""}};
+
+
+_rowLabel = "Site;";
+for (_counter2 = 1; _counter2 <= _sites; _counter2 = _counter2 + 1)
+{
+	_rowLabel = _rowLabel + ";" + _counter2;
+}
+
+_labels [5] = _rowLabel;
+
+
+promptString = "Posterior Moments at Sites for " + _CATEGORY_VARIABLE_ID_;
+
+OpenWindow (CHARTWINDOW,{{promptString}
+						   {"_labels"},
+						   {"_moment_matrix"},
+						   {"None"},
+						   {""},
+						   {""},
+						   {""},
+						   {""},
+						   {""},
+						   {"0"}},
+						   "SCREEN_WIDTH-60;SCREEN_HEIGHT-50;30;50");
+						   
+_labels = 0;
+_sites  = 0;
+_momentMatrix = 0;
diff --git a/res/ChartAddIns/DistributionAddIns/Prior Moments b/res/ChartAddIns/DistributionAddIns/Prior Moments
new file mode 100644
index 0000000..ef39dba
--- /dev/null
+++ b/res/ChartAddIns/DistributionAddIns/Prior Moments	
@@ -0,0 +1,62 @@
+_classes = Columns(_CATEGORY_VARIABLE_CDF_);
+
+_firstmoment  = 0;
+_secondmoment = 0;
+_thirdmoment  = 0;
+_fourthmoment  = 0;
+
+_cumprob = 0;
+
+_CATEGORY_VARIABLE_CDF2_ = _CATEGORY_VARIABLE_CDF_;
+
+_latexString = "";
+_latexString * 128;
+
+_entropy = 0;
+
+for (_counter = 0; _counter < _classes; _counter = _counter + 1)
+{
+	_temp = _CATEGORY_VARIABLE_CDF_[0][_counter]*_CATEGORY_VARIABLE_CDF_[1][_counter];
+	_entropy = _entropy - Log (_CATEGORY_VARIABLE_CDF_[0][_counter]) * _CATEGORY_VARIABLE_CDF_[0][_counter]; 
+	_firstmoment 	= _firstmoment 	+ _temp;
+	_temp = _temp * _CATEGORY_VARIABLE_CDF_[1][_counter];
+	_secondmoment	= _secondmoment + _temp;
+	_temp = _temp * _CATEGORY_VARIABLE_CDF_[1][_counter];
+	_thirdmoment	= _thirdmoment + _temp;
+	_fourthmoment	= _fourthmoment + _temp * _CATEGORY_VARIABLE_CDF_[1][_counter];
+	_cumprob = _cumprob + _CATEGORY_VARIABLE_CDF_[0][_counter];
+	_CATEGORY_VARIABLE_CDF2_[0][_counter] = _cumprob;
+}
+
+_cw = 0;
+
+for (_counter = 0; _counter < _classes -1 ; _counter = _counter + 1)
+{
+	_cw = _cw + _CATEGORY_VARIABLE_CDF_[0][_counter];
+	if (_CATEGORY_VARIABLE_CDF_[1][_counter+1]-_CATEGORY_VARIABLE_CDF_[1][_counter] > 0.001)
+	{
+		_latexString * ("&"+Format(_CATEGORY_VARIABLE_CDF_[1][_counter],7,3) +"&"+Format(_cw,7,3));	
+		_cw = 0;
+	}
+}
+
+_cw = _cw + _CATEGORY_VARIABLE_CDF_[0][_counter];
+_latexString * ("&"+Format(_CATEGORY_VARIABLE_CDF_[1][_counter],7,3) +"&"+Format(_cw,7,3));	
+_latexString*0;
+_latexString = _latexString[1][Abs(_latexString)-1];
+
+_counter = _secondmoment-_firstmoment*_firstmoment;
+
+fprintf (stdout, "\nMean     = ", _firstmoment,
+				 "\nVariance = ", _counter,
+				 "\nCOV      = ", Sqrt(_counter)/_firstmoment,
+				 "\nSkewness = ", (2*_firstmoment^3-3*_firstmoment*_secondmoment+_thirdmoment)/Sqrt(_counter)^3,
+				 "\nKurtosis = ", (6*_firstmoment^2*_secondmoment-3*_firstmoment^4-4*_firstmoment*_thirdmoment+_fourthmoment)/_counter^2, 
+				 "\nEntropy  = ", _entropy, 
+				 "\n");
+
+
+_labels = 0;
+_sites  = 0;
+_momentMatrix = 0;
+
diff --git a/res/ChartAddIns/Gaussian Penalty Clustering b/res/ChartAddIns/Gaussian Penalty Clustering
new file mode 100644
index 0000000..25ae95f
--- /dev/null
+++ b/res/ChartAddIns/Gaussian Penalty Clustering	
@@ -0,0 +1,229 @@
+/*****************************************************************************/
+
+function  DoNCategoryFit (weightMatrix)
+{
+	weightClasses	 = Rows(weightMatrix);
+	
+	logLikelihood	= 0;
+
+	allMeasurements = Columns(SELECTED_CHART_DATA);
+	
+	for (measureCount = 0; measureCount < allMeasurements; measureCount = measureCount+1)
+	{
+		siteLikelihood = 0;
+		measVal  = SELECTED_CHART_DATA[0][measureCount];
+		
+		for (classCounter = 0; classCounter < weightClasses; classCounter = classCounter + 1)
+		{
+			classVal = weightMatrix[classCounter][1];
+			if (measVal==classVal)
+			{
+				siteLikelihood = siteLikelihood + weightMatrix[classCounter][0];
+			}
+			else
+			{
+				siteLikelihood = siteLikelihood + Exp(-(measVal-classVal)^2/(2*classVal)) * weightMatrix[classCounter][0]
+			}			
+		}
+		
+		if (siteLikelihood > 0)
+		{
+			logLikelihood = logLikelihood + SELECTED_CHART_DATA[1][measureCount]*Log(siteLikelihood);		
+		}
+		else
+		{
+			logLikelihood = logLikelihood-1e10;
+		}
+	}
+	
+	return logLikelihood;
+}
+
+/*****************************************************************************/
+
+function  DoOneCategoryFit (theRate)
+{
+	logLikelihood	= 0;
+
+	allMeasurements = Columns(SELECTED_CHART_DATA);
+			
+	for (measureCount = 0; measureCount < allMeasurements; measureCount = measureCount+1)
+	{
+		siteLikelihood = 0;
+		measVal  = SELECTED_CHART_DATA[0][measureCount];
+		
+		if (measVal!=theRate)
+		{
+			siteLikelihood = siteLikelihood + Exp(-(measVal-theRate)^2/(2*theRate));
+		}			
+		
+		if (siteLikelihood > 0)
+		{
+			logLikelihood = logLikelihood + SELECTED_CHART_DATA[1][measureCount]*Log(siteLikelihood);		
+		}
+		else
+		{
+			logLikelihood = logLikelihood-1e10;
+		}
+	}
+	
+	return logLikelihood;
+}
+
+/*****************************************************************************/
+
+if (NON_EMPTY_SELECTION)
+{
+	UPDATE_CELL_DATE = 0;
+	
+	data_rows  	 = Columns 	(SELECTED_CHART_ROWS);
+
+	temp = SELECTED_CHART_COLS[0];
+
+	for (count = 1; count<data_rows; count = count+1)
+	{
+		temp2 = SELECTED_CHART_COLS[count];
+		if (temp!=temp2)
+		{
+			break;
+		}
+		if (SELECTED_CHART_DATA[count]<SELECTED_CHART_DATA[count-1])
+		{
+			break;
+		}
+	}
+	
+	if (count == data_rows)
+	{
+		/* compress the data vector to account for repeated observations */
+		
+		dataPoints = Columns(SELECTED_CHART_DATA);
+		temp_data_vector = {2, dataPoints};
+		currentIndex = 0;
+		
+		temp_data_vector[0][0] = SELECTED_CHART_DATA[0];
+		temp_data_vector[1][0] = 1;
+		for (nextIndex = 1; nextIndex < dataPoints; nextIndex = nextIndex + 1)
+		{
+			if (SELECTED_CHART_DATA[nextIndex]!=SELECTED_CHART_DATA[nextIndex-1])
+			{
+				currentIndex = currentIndex+1;
+				temp_data_vector[0][currentIndex] = SELECTED_CHART_DATA[nextIndex];
+			}
+			temp_data_vector[1][currentIndex] = temp_data_vector[1][currentIndex] + 1;
+		}
+		
+		SELECTED_CHART_DATA = {2, currentIndex+1};
+		
+		upperBound = 0;
+		
+		for (nextIndex = 0; nextIndex <= currentIndex; nextIndex = nextIndex + 1)
+		{
+			SELECTED_CHART_DATA[0][nextIndex] = temp_data_vector[0][nextIndex];
+			SELECTED_CHART_DATA[1][nextIndex] = temp_data_vector[1][nextIndex];
+		}
+		
+		
+		temp_data_vector = 0;
+		lastMax 		 = -100000000000;
+
+		oneRate = 1;
+		
+		oneRate:>1e-10;
+		
+		Optimize (bestFit, DoOneCategoryFit(oneRate));
+		
+		lastMax = bestFit [1][0];
+
+		fprintf (stdout, Format (1,3,0), " rate classes: Log(L) = ", bestFit[1][0],"  \n");
+
+		for (resp = 2; resp <= Columns(SELECTED_CHART_DATA); resp = resp+1)
+		{
+			freqStrMx    = {resp,1};
+			freqStrMx[0] = "PS_1";
+
+			ratesMx    = {resp,1};
+			ratesMx[0] = "CR1*CR2";
+			ratesMx[1] = "CR2";
+
+			for (mi=1; mi<resp-1; mi=mi+1)
+			{
+				freqStrMx[mi] = "";
+				for (mi2=1;mi2<=mi;mi2=mi2+1)
+				{
+					freqStrMx[mi] = freqStrMx[mi]+"(1-PS_"+mi2+")";		
+				}
+				freqStrMx[mi] = freqStrMx[mi]+"PS_"+(mi+1);	
+			}	
+
+			freqStrMx[mi] = "";
+			freqStrMx[mi] = freqStrMx[mi]+"(1-PS_"+mi+")";	
+			for (mi2=1;mi2<mi;mi2=mi2+1)
+			{
+				freqStrMx[mi] = freqStrMx[mi]+"(1-PS_"+mi2+")";		
+			}
+
+			for (mi=2; mi<resp; mi=mi+1)
+			{
+				ratesMx[mi] = ratesMx [mi-1]+"*CR"+(mi+1);
+			}	
+
+			mx = {resp,2};
+			
+			execString  = "";
+			execString2 = "CR1=0;CR1:>1e-10;CR1:<0.99;CR2:>0;CR2=1;";
+			for (resp2 = 0; resp2 < resp; resp2 = resp2 + 1)
+			{
+				if (resp2)
+				{
+					execString = execString + "PS_"+resp2+":>0;PS_"+resp2+":<1;PS_"+resp2+"=1/"+(resp-resp2+1)+";";
+				}
+				execString  = execString + "mx[" + resp2 + "][0]:=" + freqStrMx[resp2] + ";";
+				execString2 = execString2 + "mx[" + resp2 + "][1]:=" + ratesMx[resp2] + ";";
+				if (resp2>=2)
+				{
+					execString2 = execString2 + "CR" + (resp2+1) + "=CR" + resp2 + "*1.5;CR" + (resp2+1) + ":>1.01;"
+				}
+			}
+			
+			ExecuteCommands (execString);
+			ExecuteCommands (execString2);
+			
+			Optimize (bestFit, DoNCategoryFit(mx));
+			
+			fprintf (stdout, Format (resp,3,0), " rate classes: Log(L) = ", bestFit[1][0],"  \n");
+			if (bestFit[1][0] - lastMax < 2)
+			{
+				break;
+			}
+			
+			saveMx	= mx;
+			lastMax = bestFit[1][0];
+		}
+		
+		resp = resp-1;
+		
+		if (resp==1)
+		{
+			fprintf (stdout, "\n\nFit a single rate to the data: ", oneRate, "\n\n");
+		
+		}
+		else
+		{
+			fprintf (stdout, "\n\nFit ", resp, " categories to the data\n\n");
+			
+			for (resp2 = 0; resp2 < resp; resp2 = resp2+1)
+			{
+				fprintf (stdout, "Class ", Format (resp2+1,3,0), " : ",  Format (saveMx[resp2][1], 8, 5), " weight = ", Format (saveMx[resp2][0], 8, 5), "\n");
+			}
+		}
+	}
+	else
+	{
+		fprintf (stdout, "Please select a single sorted column to fit a profile to.\n");
+	}
+}
+else
+{
+	NON_EMPTY_SELECTION = -1;
+}
diff --git a/res/ChartAddIns/Goodness of Fit b/res/ChartAddIns/Goodness of Fit
new file mode 100644
index 0000000..2e8c1f0
--- /dev/null
+++ b/res/ChartAddIns/Goodness of Fit	
@@ -0,0 +1,90 @@
+if (NON_EMPTY_SELECTION)
+{
+	data_rows  	 = Columns 	(SELECTED_CHART_ROWS);
+
+	if (data_rows % 2 == 0)
+	{
+		temp = -1;
+		data_columns = -1;
+		
+		for (count = 0; count<data_rows; count = count+1)
+		{
+			temp2 = SELECTED_CHART_COLS[count];
+			if (temp<0)
+			{
+				temp = temp2;
+			}
+			else
+			{
+				if (temp!=temp2)
+				{
+					if (data_columns<0)
+					{
+						data_columns = temp2;
+					}
+					else
+					{
+						if (temp2!=data_columns)
+						{
+							break;
+						}
+					}
+				}
+			}
+		}
+		
+		if ((count == data_rows)&&(data_columns>=0)&&(temp>=0))
+		{
+			for (count = 0; count < data_rows; count = count+2)
+			{
+				if (SELECTED_CHART_ROWS[count]!=SELECTED_CHART_ROWS[count+1])
+				{
+					break;
+				}
+			}
+		
+			if (count==data_rows)
+			{
+				SELECTED_CHART_ROWS = {2,data_rows/2};
+				for (count = 0; count < data_rows; count = count+2)
+				{
+					SELECTED_CHART_ROWS[0][count/2]=SELECTED_CHART_DATA[count];
+					SELECTED_CHART_ROWS[1][count/2]=SELECTED_CHART_DATA[count+1];
+				}
+				SELECTED_CHART_DATA = SELECTED_CHART_ROWS;
+				data_rows = data_rows/2;
+				
+				/* decide what the weight column is: weights or cum. distr */
+				data_mean = 0;
+				for (count = 0; count < data_rows; count = count + 1)
+				{
+					data_var = SELECTED_CHART_DATA[1][count];
+					if ((data_var<0)||(data_var>1))
+					{
+						fprintf (stdout, "Interval probabilities column must contain numbers between 0 and 1.\n");
+						return;
+					}
+					data_mean = data_mean + SELECTED_CHART_DATA[1][count];
+				}
+				chi2statistic = 0;
+				
+				for (count = 0; count < data_rows; count = count + 1)
+				{
+					temp = data_rows*SELECTED_CHART_DATA[1][count];
+					chi2statistic = chi2statistic+(SELECTED_CHART_DATA[0][count]*data_rows-temp)^2/temp;
+				}
+				
+				fprintf (stdout, "\nGoodness of fit statisitc: ", chi2statistic, 
+								 "\np-value: ", 1-CChi2(chi2statistic,data_rows-1), "\n");
+				return 0;
+			}
+		}
+	}
+
+	fprintf (stdout, "Please select two columns with interval proportions (1st column) and hypothesized distribution weights (2nd columns).\n");
+}
+else
+{
+	NON_EMPTY_SELECTION = -1;
+}
+
diff --git a/res/ChartAddIns/Histogram b/res/ChartAddIns/Histogram
new file mode 100644
index 0000000..5a0596d
--- /dev/null
+++ b/res/ChartAddIns/Histogram
@@ -0,0 +1,103 @@
+if (NON_EMPTY_SELECTION)
+{
+	count = Columns (SELECTED_CHART_DATA);
+
+	colMin  = SELECTED_CHART_DATA [0];
+	colMax  = SELECTED_CHART_DATA [0];
+
+	for (counter=0; counter < count; counter = counter+1)
+	{
+		term = SELECTED_CHART_DATA [counter];
+		if (term<colMin)
+		{
+			colMin = term;
+		}
+		else
+		{
+			if (term>colMax)
+			{
+				colMax = term;
+			}
+		}
+	}
+
+	fprintf (stdout, "\nMin Value (data min = ", colMin,") = ");
+	fscanf  (stdin, "Number", colMin);
+
+	term = colMin-1;
+	while (term<=colMin)
+	{
+		fprintf (stdout, "\nMax Value (data max = ", colMax,") = ");
+		fscanf  (stdin, "Number", term);
+	}
+	colMax = term;
+
+	numberOfBins = 0;
+
+	if (colMin==colMax)
+	{
+		numberOfBins = 1;
+	}
+	else
+	{
+		while (numberOfBins<1)
+		{
+			fprintf (stdout, "\nNumber of bins = ");
+			fscanf	(stdin, "Number", numberOfBins);
+		}
+	}
+
+	matrixOfCounts = {numberOfBins, 5};
+
+	colMax = (colMax-colMin)/numberOfBins;
+
+	if (colMax==0)
+	{
+		colMax = 0;
+	}
+
+	for (counter=0; counter < count; counter = counter+1)
+	{
+		term = Min(((SELECTED_CHART_DATA [counter]-colMin)/colMax)$1,numberOfBins-1);
+		matrixOfCounts [term][2] = matrixOfCounts [term][2]+1;
+	}
+	
+	term = 0;
+
+	for (counter=0; counter < numberOfBins; counter = counter+1)
+	{
+		matrixOfCounts [counter][0] = colMin;
+		term2 = matrixOfCounts [counter][2]/count;
+		matrixOfCounts [counter][3] = term2;
+		term = term+term2;
+		matrixOfCounts [counter][4] = term;
+		colMin = colMin + colMax;
+		matrixOfCounts [counter][1] = colMin;
+	}
+
+	labelMatrix = {{"Bin Left Bound","Bin Right Bound", "Raw Count", "Bin Weight", "Cumulative Weight"}};
+	promptString = "Data Histogram";
+	OpenWindow (CHARTWINDOW,{{promptString}
+							   {"labelMatrix"},
+							   {"matrixOfCounts"},
+							   {"Bar Chart"},
+							   {labelMatrix[0]},
+							   {labelMatrix[3]},
+							   {"Value"},
+							   {""},
+							   {"Weight"},
+								{"0"}
+								{""}
+								{"-1;-1"}
+								{"10;1.309;0.785398"}
+								{"Times:12:0;Times:10:0;Times:12:2"}
+								{"0;0;16777215;1644825;0;0;6579300;11842740;13158600;14474460;0;3947580;16777215;5000268;6845928;16771158;2984993;9199669;7018159;1460610;16748822;11184810;14173291"}
+								{"16,0,0"}
+								},
+							   "(SCREEN_WIDTH-60)/2;(SCREEN_HEIGHT-50)/2;(SCREEN_WIDTH-60)/2;50");
+}
+else
+{
+	NON_EMPTY_SELECTION = -1;
+}
+
diff --git a/res/ChartAddIns/K-Mean Clustering b/res/ChartAddIns/K-Mean Clustering
new file mode 100644
index 0000000..c59b598
--- /dev/null
+++ b/res/ChartAddIns/K-Mean Clustering	
@@ -0,0 +1,108 @@
+/*****************************************************************************/
+
+if (NON_EMPTY_SELECTION)
+{
+	UPDATE_CELL_DATE = 0;
+	
+	data_rows  	 = Columns 	(SELECTED_CHART_ROWS);
+
+	temp = SELECTED_CHART_COLS[0];
+
+	for (count = 1; count<data_rows; count = count+1)
+	{
+		temp2 = SELECTED_CHART_COLS[count];
+		if (temp!=temp2)
+		{
+			break;
+		}
+		if (SELECTED_CHART_DATA[count]<SELECTED_CHART_DATA[count-1])
+		{
+			break;
+		}
+	}
+
+	if (count == data_rows)
+	{
+		/* compress the data vector to account for repeated observations */
+		
+		dataPoints = Columns(SELECTED_CHART_DATA);
+		temp_data_vector = {2, dataPoints};
+		currentIndex = 0;
+		
+		temp_data_vector[0][0] = SELECTED_CHART_DATA[0];
+		temp_data_vector[1][0] = 1;
+		for (nextIndex = 1; nextIndex < dataPoints; nextIndex = nextIndex + 1)
+		{
+			if (SELECTED_CHART_DATA[nextIndex]!=SELECTED_CHART_DATA[nextIndex-1])
+			{
+				currentIndex = currentIndex+1;
+				temp_data_vector[0][currentIndex] = SELECTED_CHART_DATA[nextIndex];
+			}
+			temp_data_vector[1][currentIndex] = temp_data_vector[1][currentIndex] + 1;
+		}
+		
+		SELECTED_CHART_DATA = {2, currentIndex+1};
+		
+		for (nextIndex = 0; nextIndex <= currentIndex; nextIndex = nextIndex + 1)
+		{
+			SELECTED_CHART_DATA[0][nextIndex] = temp_data_vector[0][nextIndex];
+			SELECTED_CHART_DATA[1][nextIndex] = temp_data_vector[1][nextIndex];
+		}
+		
+	
+		
+		patternCount = Columns(SELECTED_CHART_DATA);
+		fprintf (stdout, "\n");
+		upTo = Max(1,10);
+		
+		cMeans  = {};
+		errMatrix = {upTo,5};
+
+		kIters = 1000;
+		
+		for (cc = 0; cc < upTo; cc = cc+1)
+		{
+			km = Transpose(SELECTED_CHART_DATA) <= {{cc+1}{kIters}};
+				
+			cMeans[cc+1]  = km;
+
+			errMatrix[cc][0] = cc+1;
+			errMatrix[cc][1] = km[1][0];
+			errMatrix[cc][2] = 1./km[1][0];
+			if (cc)
+			{
+				errMatrix[cc][3] = errMatrix[cc][2]-errMatrix[cc-1][2];
+				errMatrix[cc][2] = 1./km[1][0];
+				errMatrix[cc][4] = 100*km[1][1]/kIters;
+			}
+			else
+			{
+				errMatrix[cc][4] = 100;			
+			}
+		}
+		
+		labels = {{"Classes", "Error", "Transformed Error", "Transformed Jumps", "Confidence"}};
+		
+		promptString = "Clustering Error";
+		OpenWindow (CHARTWINDOW,{{promptString}
+								   {"labels"},
+								   {"errMatrix"},
+								   {"Line Plot"},
+								   {labels[0]},
+								   {labels[3]},
+								   {"Cluster Count"},
+								   {""},
+								   {"Transformed Error"},
+								   {"0"}},
+								   "SCREEN_WIDTH-60;SCREEN_HEIGHT-50;30;50");
+								   
+	}
+	else
+	{
+		fprintf (stdout, "Please select a single sorted column to fit a profile to.\n");
+	}
+}
+else
+{
+	NON_EMPTY_SELECTION = -1;
+}
diff --git a/res/ChartAddIns/KH Resampler b/res/ChartAddIns/KH Resampler
new file mode 100644
index 0000000..c401709
--- /dev/null
+++ b/res/ChartAddIns/KH Resampler	
@@ -0,0 +1,106 @@
+if (NON_EMPTY_SELECTION)
+{
+	data_rows  	 = Columns 	(SELECTED_CHART_ROWS);
+
+	if (data_rows % 2 == 0)
+	{
+		temp = -1;
+		data_columns = -1;
+		
+		for (count = 0; count<data_rows; count = count+1)
+		{
+			temp2 = SELECTED_CHART_COLS[count];
+			if (temp<0)
+			{
+				temp = temp2;
+			}
+			else
+			{
+				if (temp!=temp2)
+				{
+					if (data_columns<0)
+					{
+						data_columns = temp2;
+					}
+					else
+					{
+						if (temp2!=data_columns)
+						{
+							break;
+						}
+					}
+				}
+			}
+		}
+		
+		if ((count == data_rows)&&(data_columns>=0)&&(temp>=0))
+		{
+			for (count = 0; count < data_rows; count = count+2)
+			{
+				if (SELECTED_CHART_ROWS[count]!=SELECTED_CHART_ROWS[count+1])
+				{
+					break;
+				}
+			}
+			if (count==data_rows)
+			{
+			
+				SELECTED_CHART_ROWS = {2,data_rows/2};
+				for (count = 0; count < data_rows; count = count+2)
+				{
+					SELECTED_CHART_ROWS[0][count/2]=SELECTED_CHART_DATA[count];
+					SELECTED_CHART_ROWS[1][count/2]=SELECTED_CHART_DATA[count+1];
+				}
+				SELECTED_CHART_DATA = SELECTED_CHART_ROWS;
+				sumVec = {Columns(SELECTED_CHART_DATA),1};
+				
+				for (count = Columns(SELECTED_CHART_DATA)-1; count >=0 ; count = count - 1)
+				{
+					sumVec[count] = 1;
+				} 
+				
+				scd = SELECTED_CHART_DATA;
+				fprintf (stdout, "How many samples should be generated?");
+				fscanf  (stdin, "Number", samples);
+				resampledLRT = {samples,3};
+				for (count = 0; count < samples; count = count + 1)
+				{
+					resampled = Random(SELECTED_CHART_DATA,1)*sumVec;
+					resampledLRT[count][0] = resampled[0];
+					resampledLRT[count][1] = resampled[1];
+					resampledLRT[count][2] = resampled[1]-resampled[0];
+				}
+				
+				labels = {{"Model_1", "Model_2", "Model_2 - Model_1"}};
+
+
+				OpenWindow (CHARTWINDOW,{{"Resampled LRT"}
+					{"labels"}
+					{"resampledLRT"}
+					{"Bar Chart"}
+					{"Index"}
+					{labels[2]}
+					{"Index"}
+					{"LRT"}
+					{"LRT"}
+					{""}
+					{""}
+					{""}
+					{"10;1.309;0.785398"}
+					{"Times:12:0;Times:10:0;Times:14:2"}
+					{"0;0;16777215;5000268;0;0;6750054;11842740;13158600;14474460;0;3947580;16777215;0;5000268;11776947;10066329;9199669;7018159;1460610;16748822;11184810;14173291"}
+					{"16"}
+					},
+					"SCREEN_WIDTH-150;SCREEN_HEIGHT-150;100;100");
+
+				return;
+			}
+		}
+	}
+
+	fprintf (stdout, "Please select two columns of data.\n");
+}
+else
+{
+	NON_EMPTY_SELECTION = -1;
+}
diff --git a/res/ChartAddIns/Linear Fit b/res/ChartAddIns/Linear Fit
new file mode 100644
index 0000000..58cebb2
--- /dev/null
+++ b/res/ChartAddIns/Linear Fit	
@@ -0,0 +1,75 @@
+if (NON_EMPTY_SELECTION)
+{
+	data_rows  	 = Columns 	(SELECTED_CHART_ROWS);
+
+	if (data_rows % 2 == 0)
+	{
+		temp = -1;
+		data_columns = -1;
+		
+		for (count = 0; count<data_rows; count = count+1)
+		{
+			temp2 = SELECTED_CHART_COLS[count];
+			if (temp<0)
+			{
+				temp = temp2;
+			}
+			else
+			{
+				if (temp!=temp2)
+				{
+					if (data_columns<0)
+					{
+						data_columns = temp2;
+					}
+					else
+					{
+						if (temp2!=data_columns)
+						{
+							break;
+						}
+					}
+				}
+			}
+		}
+		
+		if ((count == data_rows)&&(data_columns>=0)&&(temp>=0))
+		{
+			for (count = 0; count < data_rows; count = count+2)
+			{
+				if (SELECTED_CHART_ROWS[count]!=SELECTED_CHART_ROWS[count+1])
+				{
+					break;
+				}
+			}
+		
+			if (count==data_rows)
+			{
+			
+				SELECTED_CHART_ROWS = {2,data_rows/2};
+				for (count = 0; count < data_rows; count = count+2)
+				{
+					SELECTED_CHART_ROWS[0][count/2]=SELECTED_CHART_DATA[count];
+					SELECTED_CHART_ROWS[1][count/2]=SELECTED_CHART_DATA[count+1];
+				}
+				SELECTED_CHART_DATA = SELECTED_CHART_ROWS;
+				
+                LoadFunctionLibrary ("ProbabilityDistributions");
+                lfit = linearFit (Transpose(SELECTED_CHART_DATA));
+                        
+                 
+							
+				fprintf (stdout, "\n\nCorrelation coefficient:",lfit["Correlation"],"\n");
+				fprintf (stdout, "\nLinear fit :\n\t y = ",lfit["Intercept"]," + ", lfit["Slope"], " * x\n");
+				fprintf (stdout, "\nB = ",lfit["Slope"], " +/- ", Sqrt (lfit["Var(Slope)"]),"\nA = ",lfit["Intercept"], " +/- ", Sqrt (lfit["Var(Intercept)"]),"\n");
+				return;
+			}
+		}
+	}
+
+	fprintf (stdout, "Please select two columns with independent values (1st column) and dependent values (2nd columns).\n");
+}
+else
+{
+	NON_EMPTY_SELECTION = -1;
+}
\ No newline at end of file
diff --git a/res/ChartAddIns/Linear Fit.orig b/res/ChartAddIns/Linear Fit.orig
new file mode 100644
index 0000000..5753e58
--- /dev/null
+++ b/res/ChartAddIns/Linear Fit.orig	
@@ -0,0 +1,79 @@
+<<<<<<< HEAD
+if (NON_EMPTY_SELECTION)
+{
+	data_rows  	 = Columns 	(SELECTED_CHART_ROWS);
+
+	if (data_rows % 2 == 0)
+	{
+		temp = -1;
+		data_columns = -1;
+		
+		for (count = 0; count<data_rows; count = count+1)
+		{
+			temp2 = SELECTED_CHART_COLS[count];
+			if (temp<0)
+			{
+				temp = temp2;
+			}
+			else
+			{
+				if (temp!=temp2)
+				{
+					if (data_columns<0)
+					{
+						data_columns = temp2;
+					}
+					else
+					{
+						if (temp2!=data_columns)
+						{
+							break;
+						}
+					}
+				}
+			}
+		}
+		
+		if ((count == data_rows)&&(data_columns>=0)&&(temp>=0))
+		{
+			for (count = 0; count < data_rows; count = count+2)
+			{
+				if (SELECTED_CHART_ROWS[count]!=SELECTED_CHART_ROWS[count+1])
+				{
+					break;
+				}
+			}
+		
+			if (count==data_rows)
+			{
+			
+				SELECTED_CHART_ROWS = {2,data_rows/2};
+				for (count = 0; count < data_rows; count = count+2)
+				{
+					SELECTED_CHART_ROWS[0][count/2]=SELECTED_CHART_DATA[count];
+					SELECTED_CHART_ROWS[1][count/2]=SELECTED_CHART_DATA[count+1];
+				}
+				SELECTED_CHART_DATA = SELECTED_CHART_ROWS;
+				
+                LoadFunctionLibrary ("ProbabilityDistributions");
+                lfit = linearFit (Transpose(SELECTED_CHART_DATA));
+                        
+                 
+							
+				fprintf (stdout, "\n\nCorrelation coefficient:",lfit["Correlation"],"\n");
+				fprintf (stdout, "\nLinear fit :\n\t y = ",lfit["Intercept"]," + ", lfit["Slope"], " * x\n");
+				fprintf (stdout, "\nB = ",lfit["Slope"], " +/- ", Sqrt (lfit["Var(Slope)"]),"\nA = ",lfit["Intercept"], " +/- ", Sqrt (lfit["Var(Intercept)"]),"\n");
+				return;
+			}
+		}
+	}
+
+	fprintf (stdout, "Please select two columns with independent values (1st column) and dependent values (2nd columns).\n");
+}
+else
+{
+	NON_EMPTY_SELECTION = -1;
+}
+=======
+if (NON_EMPTY_SELECTION)
{
	data_rows  	 = Columns 	(SELECTED_CHART_ROWS);

	if (data_rows % 2 == 0)
	{
		temp = -1;
		data_columns = -1;
		
		for (count = 0; count<data_rows; count = count+1)
		{
			temp2 = SELECTED_CHART_COLS[count];
			if (temp<0)
			{
				temp = temp2;
			}
			else
			{
				if (temp!=temp2)
				{
					if (data_columns<0)
					{
						data_columns = temp2;
					}
					else
					{
						if (temp2!=data_columns)
						{
							break;
						}
					}
				}
			}
		}
		
		if ((count == data_rows)&&(data_columns>=0)&&(temp>=0))
		{
			for (count = 0; count < data_rows; count = count+2)
			{
				if (SELECTED_CHART_ROWS[count]!=SELECTED_CHART_ROWS[count+1])
				{
					break;
				}
			}
		
			if (count==data_rows)
			{
			
				SELECTED_CHART_ROWS = {2,data_rows/2};
				for (count = 0; count < data_rows; count = count+2)
				{
					SELECTED_CHART_ROWS[0][count/2]=SELECTED_CHART_DATA[count];
					SELECTED_CHART_ROWS[1][count/2]=SELECTED_CHART_DATA[count+1];
				}
				SELECTED_CHART_DATA = SELECTED_CHART_ROWS;
				data_rows = data_rows/2;
				
				sx = 0;
				sy = 0;
				ss = data_rows;
				for (count = 0; count<data_rows; count = count+1)
				{
					sx = sx+SELECTED_CHART_DATA[0][count];
					sy = sy+SELECTED_CHART_DATA[1][count];
				}
				
				sxoss = sx/ss;
				
				fitB = 0;
				st2  = 0;
				
				sxx = 0;
				syy = 0;
				sxy = 0;
				ax  = sx/data_rows;
				ay  = sy/data_rows;
				
				for (count = 0; count<data_rows; count = count+1)
				{
					xt = SELECTED_CHART_DATA[0][count]-ax;
					yt = SELECTED_CHART_DATA[1][count]-ay;
					sxx = sxx+(xt)^2;
					syy = syy+(yt)^2;
					sxy = sxy+xt*yt;
					t = SELECTED_CHART_DATA[0][count]-sxoss;
					st2 = st2+t*t;
					fitB = fitB + t*SELECTED_CHART_DATA[1][count];
				}
				
				fitB = fitB/st2;
				fitA = (sy-sx*fitB)/ss;
				varA = Sqrt ((1+sx*sx/(ss*st2))/ss);
				varB = Sqrt (1/st2);
							
				fprintf (stdout, "\n\nCorrelation coefficient:",sxy/Sqrt(sxx*syy),"\n");
				fprintf (stdout, "\nLinear fit :\n\t y = ",fitA," + ", fitB, " * x\n");
				fprintf (stdout, "\nB = ",fitB, " +/- ", Sqrt (varB),"\nA = ",fitA, " +/- ", Sqrt (varA),"\n");
				return;
			}
		}
	}

	fprintf (stdout, "Please select two columns with independent values (1st column) and dependent values (2nd columns).\n");
}
else
{
	NON_EMPTY_SELECTION = -1;
}
+>>>>>>> 9d85cc92f6c2b2d70b633744b7b79f99b3c9ad0d
diff --git a/res/ChartAddIns/Mean Profile Plot b/res/ChartAddIns/Mean Profile Plot
new file mode 100644
index 0000000..f59e844
--- /dev/null
+++ b/res/ChartAddIns/Mean Profile Plot	
@@ -0,0 +1,93 @@
+if (NON_EMPTY_SELECTION)
+{
+	UPDATE_CELL_DATA = 1;
+
+	data_rows  	 = Columns 	(SELECTED_CHART_ROWS);
+
+	temp = SELECTED_CHART_COLS[0];
+
+	for (count = 1; count<data_rows; count = count+1)
+	{
+		temp2 = SELECTED_CHART_COLS[count];
+		if (temp!=temp2)
+		{
+			break;
+		}
+	}
+
+	if ((count == data_rows)&&(count>1))
+	/* proper selection */
+	{
+		windowWidth = 0;
+		
+		while ((windowWidth<2)||(windowWidth>count)||(windowWidth%2==0))
+		{
+			fprintf (stdout, "\nChoose an ODD mean profile window width in [3,",count,"]:");
+			fscanf  (stdin, "Number", windowWidth);
+		}
+		
+		medianLocation  = windowWidth$2;
+		meanDataMatrix	= {data_rows,2};
+		currentMean		= 0;
+		
+		for (kk=0; kk<windowWidth;kk=kk+1)
+		{
+			currentMean = currentMean+SELECTED_CHART_DATA[kk];
+		}
+		
+		currentMean = currentMean / windowWidth;
+				
+		for (kk=0; kk<=medianLocation;kk=kk+1)
+		{
+			meanDataMatrix[kk][0] = SELECTED_CHART_DATA[kk];
+			meanDataMatrix[kk][1] = currentMean;
+		}
+		
+		t2 = data_rows-medianLocation;
+		
+		t5 = 0;
+		t4 = windowWidth;
+		
+		for (;kk<t2;kk=kk+1)
+		{
+			currentMean = currentMean + (SELECTED_CHART_DATA[t4]-SELECTED_CHART_DATA[t5])/windowWidth;
+			meanDataMatrix[kk][0] = SELECTED_CHART_DATA[kk];
+			meanDataMatrix[kk][1] = currentMean;			
+			t5 = t5+1;
+			t4 = t4+1;
+		}
+
+		for (; kk<data_rows;kk=kk+1)
+		{
+			meanDataMatrix[kk][0] = SELECTED_CHART_DATA[kk];
+			meanDataMatrix[kk][1] = currentMean;
+		}
+		
+		labelMatrix = {{"Data","Sliding mean"}};
+
+		OpenWindow (CHARTWINDOW,{{"Mean Profile"}
+								   {"labelMatrix"},
+								   {"meanDataMatrix"},
+								   {"Bar Chart"},
+								   {"Index"},
+								   {labelMatrix[0]},
+								   {"Index"},
+								   {"Window("+windowWidth+") Median"},
+								   {"Data"},
+								   {"0"},
+								   {"meanDataMatrix[_x_-1][1]"}
+								   {"-1;-1"}
+		{"10;1.309;0.785398"}
+		{"Times:12:0;Times:10:0;Times:12:2"}
+		{"0;0;16777215;8421504;11776947;0;0;11842740;13158600;14474460;0;3947580;16777215;13421772;6845928;16771158;2984993;9199669;7018159;1460610;16748822;11184810;14173291"}
+		{"16"}},
+								   "SCREEN_WIDTH-60;SCREEN_HEIGHT-50;30;50");
+		return 0;
+	}
+
+	fprintf (stdout, "Please select a single column with more than one entry to profile\n");
+}
+else
+{
+	NON_EMPTY_SELECTION = -1;
+}
diff --git a/res/ChartAddIns/Median Profile Plot b/res/ChartAddIns/Median Profile Plot
new file mode 100644
index 0000000..bc0a07d
--- /dev/null
+++ b/res/ChartAddIns/Median Profile Plot	
@@ -0,0 +1,172 @@
+if (NON_EMPTY_SELECTION)
+{
+	UPDATE_CELL_DATA = 1;
+
+	data_rows  	 = Columns 	(SELECTED_CHART_ROWS);
+
+	temp = SELECTED_CHART_COLS[0];
+
+	for (count = 1; count<data_rows; count = count+1)
+	{
+		temp2 = SELECTED_CHART_COLS[count];
+		if (temp!=temp2)
+		{
+			break;
+		}
+	}
+
+	if ((count == data_rows)&&(count>1))
+	/* proper selection */
+	{
+		windowWidth = 0;
+		
+		while ((windowWidth<2)||(windowWidth>count)||(windowWidth%2==0))
+		{
+			fprintf (stdout, "\nChoose an ODD median profile window width in [3,",count,"]:");
+			fscanf  (stdin, "Number", windowWidth);
+		}
+		
+		medianLocation = windowWidth$2;
+		
+		profileSnapshot = {windowWidth, 2};
+		medianDataMatrix	= {data_rows,2};
+		
+		for (kk=0; kk<windowWidth;kk=kk+1)
+		{
+			profileSnapshot[kk][0] = SELECTED_CHART_DATA[kk];
+			profileSnapshot[kk][1] = kk;
+		}
+		
+		/* sort the first windowWidth elements by bubble sort 
+		  (hopefully the window is small!)*/
+		  
+		goOn = 1;
+		while (goOn)
+		{
+			goOn = 0;
+			for (kk=0; kk<windowWidth-1;kk=kk+1)
+			{
+				t1 = profileSnapshot[kk][0];
+				t2 = profileSnapshot[kk+1][0];
+			
+				if (t2<t1)
+				{
+					profileSnapshot[kk+1][0] 	= t1;
+					profileSnapshot[kk][0] 		= t2;
+					t1 							= profileSnapshot[kk+1][1];
+					profileSnapshot[kk+1][1] 	= profileSnapshot[kk][1];
+					profileSnapshot[kk][1] 		= t1;
+					goOn = 1;
+				}
+			}
+		}
+		
+		t1 = profileSnapshot[medianLocation][0];
+		
+		for (kk=0; kk<=medianLocation;kk=kk+1)
+		{
+			medianDataMatrix[kk][0] = SELECTED_CHART_DATA[kk];
+			medianDataMatrix[kk][1] = t1;
+		}
+		
+		t2 = data_rows-medianLocation;
+		
+		kk3 = 0;
+		
+		t5 = kk+medianLocation;
+		
+		for (;kk<t2;kk=kk+1)
+		{
+			for (kk2=0;kk2<windowWidth;kk2=kk2+1)
+			{
+				if (profileSnapshot[kk2][1] == kk3)
+				{
+					break;
+				}
+			}
+			kk3 = kk3+1;
+			
+			t3 = SELECTED_CHART_DATA[t5];
+			
+			profileSnapshot[kk2][0] = t3;
+			profileSnapshot[kk2][1] = t5;
+			
+			t5 = t5+1;
+			
+			t4 = kk2+1;
+			
+			while (t4<windowWidth)
+			{
+				if (t3<=profileSnapshot[t4][0])
+				{
+					break;
+				}
+				t1 = profileSnapshot[t4][0];
+				profileSnapshot[t4][0] = profileSnapshot[kk2][0];
+				profileSnapshot[kk2][0] = t1;
+				t1 = profileSnapshot[t4][1];
+				profileSnapshot[t4][1] = profileSnapshot[kk2][1];
+				profileSnapshot[kk2][1] = t1;
+				kk2 = t4;
+				t4 = t4+1;
+			}
+			if (t4)
+			{
+				t4 = kk2-1;
+				while (t4>=0)
+				{
+				if (t3>=profileSnapshot[t4][0])
+					{
+						break;
+					}
+					t1 = profileSnapshot[t4][0];
+					profileSnapshot[t4][0] = profileSnapshot[kk2][0];
+					profileSnapshot[kk2][0] = t1;
+					t1 = profileSnapshot[t4][1];
+					profileSnapshot[t4][1] = profileSnapshot[kk2][1];
+					profileSnapshot[kk2][1] = t1;
+					kk2 = t4;
+					t4 = t4-1;
+				}
+			}
+			medianDataMatrix[kk][0] = SELECTED_CHART_DATA[kk];
+			medianDataMatrix[kk][1] = profileSnapshot[medianLocation][0];
+			
+		}
+
+		t1 = profileSnapshot[medianLocation][0];
+
+		for (; kk<data_rows;kk=kk+1)
+		{
+			medianDataMatrix[kk][0] = SELECTED_CHART_DATA[kk];
+			medianDataMatrix[kk][1] = t1;
+		}
+		
+		labelMatrix = {{"Data","Sliding median"}};
+
+		OpenWindow (CHARTWINDOW,{{"Median Profile"}
+								   {"labelMatrix"},
+								   {"medianDataMatrix"},
+								   {"Bar Chart"},
+								   {"Index"},
+								   {labelMatrix[0]},
+								   {"Index"},
+								   {"Window("+windowWidth+") Median"},
+								   {"Data"},
+								   {"0"}
+								   {"medianDataMatrix[_x_-1][1]"}
+								   {"-1;-1"}
+		{"10;1.309;0.785398"}
+		{"Times:12:0;Times:10:0;Times:12:2"}
+		{"0;0;16777215;8421504;11776947;0;0;11842740;13158600;14474460;0;3947580;13421772;6845928;16771158;2984993;9199669;7018159;1460610;16748822;11184810;14173291"}
+		{"16"}},
+								   "SCREEN_WIDTH-60;SCREEN_HEIGHT-50;30;50");
+		return 0;
+	}
+
+	fprintf (stdout, "Please select a single column with more than one entry to profile\n");
+}
+else
+{
+	NON_EMPTY_SELECTION = -1;
+}
diff --git a/res/ChartAddIns/Poisson Mixture Fit b/res/ChartAddIns/Poisson Mixture Fit
new file mode 100644
index 0000000..e4202fe
--- /dev/null
+++ b/res/ChartAddIns/Poisson Mixture Fit	
@@ -0,0 +1,265 @@
+/*****************************************************************************/
+
+function  DoNExpCategoryFit (weightMatrix, coeffMatrix)
+{
+	weightClasses	 = Rows(weightMatrix);
+	
+	logLikelihood    = 0;
+	
+	normCoeffs		 = {weightClasses,1};
+	
+	for (currentModel = 0; currentModel < weightClasses; currentModel = currentModel + 1)
+	{
+		gamma = coeffMatrix[currentModel];
+		if (gamma != savedLambdas [currentModel][0])
+		{
+			Integrate(int, Exp(_x_*Log(gamma)-Log(Gamma(_x_+1))-gamma), _x_, 0, 150);
+			normCoeffs[currentModel] 		= int;
+			savedLambdas [currentModel][0]  = gamma;
+			savedLambdas [currentModel][1]  = int;
+		}
+		else
+		{
+			normCoeffs[currentModel] = savedLambdas [currentModel][1];
+		}
+		/*fprintf (stdout, "\nNorm ", gamma, "\t", int);*/
+	}
+	
+	/*fprintf (stdout, "\n\n", coeffMatrix, normCoeffs, "\n");*/
+	
+	for (currentIndex = 0; currentIndex < measCount; currentIndex = currentIndex + 1)
+	{
+		currentValue = SELECTED_CHART_DATA[0][currentIndex];
+		
+		currentContrib = 0;
+		
+		for (currentModel = 0; currentModel < weightClasses; currentModel = currentModel + 1)
+		{
+			gamma = coeffMatrix[currentModel];
+			currentContrib = currentContrib + weightMatrix[currentModel] * Exp(currentValue*Log(gamma)- Log(Gamma(gamma+1))-gamma)/normCoeffs[currentModel];
+		}
+		
+		logLikelihood = logLikelihood + SELECTED_CHART_DATA[1][currentIndex] * Log (currentContrib);
+		/*fprintf (stdout, "\n", currentIndex, "\t", logLikelihood);*/
+	}
+	
+	
+	return logLikelihood;
+}
+
+/*****************************************************************************/
+
+if (NON_EMPTY_SELECTION)
+{
+	UPDATE_CELL_DATE = 0;
+	
+	data_rows  	 = Columns 	(SELECTED_CHART_ROWS);
+
+	temp = SELECTED_CHART_COLS[0];
+
+	for (count = 1; count<data_rows; count = count+1)
+	{
+		temp2 = SELECTED_CHART_COLS[count];
+		if (temp!=temp2)
+		{
+			break;
+		}
+		if (SELECTED_CHART_DATA[count]<SELECTED_CHART_DATA[count-1])
+		{
+			break;
+		}
+	}
+
+	if (count == data_rows)
+	{
+		/* compress the data vector to account for repeated observations */
+		
+		dataPoints = Columns(SELECTED_CHART_DATA);
+		temp_data_vector = {2, dataPoints};
+		currentIndex = 0;
+		
+		temp_data_vector[0][0] = SELECTED_CHART_DATA[0];
+		temp_data_vector[1][0] = 1;
+		for (nextIndex = 1; nextIndex < dataPoints; nextIndex = nextIndex + 1)
+		{
+			if (SELECTED_CHART_DATA[nextIndex]!=SELECTED_CHART_DATA[nextIndex-1])
+			{
+				currentIndex = currentIndex+1;
+				temp_data_vector[0][currentIndex] = SELECTED_CHART_DATA[nextIndex];
+			}
+			temp_data_vector[1][currentIndex] = temp_data_vector[1][currentIndex] + 1;
+		}
+		
+		SELECTED_CHART_DATA = {2, currentIndex+1};
+		
+		upperBound = 0;
+		
+		for (nextIndex = 0; nextIndex <= currentIndex; nextIndex = nextIndex + 1)
+		{
+			SELECTED_CHART_DATA[0][nextIndex] = temp_data_vector[0][nextIndex];
+			SELECTED_CHART_DATA[1][nextIndex] = temp_data_vector[1][nextIndex];
+			upperBound = upperBound + temp_data_vector[1][nextIndex] * Log(temp_data_vector[1][nextIndex]/dataPoints);
+		}
+		
+		
+		temp_data_vector = 0;
+		normal_sigma 	 = .25;
+		lastMax 		 = -100000000000;
+		
+		_x_ = 0;
+
+		ES_1:>0;
+		ES_1:<1;
+		
+		ES_2:>0;
+		ES_2:<20;
+		
+		measCount		 = Columns (SELECTED_CHART_DATA);
+
+		for (resp = 2; resp <= Columns(SELECTED_CHART_DATA); resp = resp+1)
+		{
+			freqStrMx    = {resp,1};
+			freqStrMx[0] = "PS_1";
+
+			for (mi=1; mi<resp-1; mi=mi+1)
+			{
+				freqStrMx[mi] = "";
+				for (mi2=1;mi2<=mi;mi2=mi2+1)
+				{
+					freqStrMx[mi] = freqStrMx[mi]+"(1-PS_"+mi2+")";		
+				}
+				freqStrMx[mi] = freqStrMx[mi]+"PS_"+(mi+1);	
+			}	
+
+			freqStrMx[mi] = "";
+			for (mi2=1;mi2<mi;mi2=mi2+1)
+			{
+				freqStrMx[mi] = freqStrMx[mi]+"(1-PS_"+mi2+")";		
+			}
+			freqStrMx[mi] = freqStrMx[mi]+"(1-PS_"+mi+")";	
+			mx = {resp,1};
+			ex = {resp,1};
+			
+			execString = "";
+			
+			for (resp2 = 0; resp2 < resp; resp2 = resp2 + 1)
+			{
+				if (resp2)
+				{
+					execString = execString + "PS_"+resp2+":>0.0001;PS_"+resp2+":<.9999;PS_"+resp2+"=1/"+(resp-resp2+1)+";";
+				}
+				execString = execString + "mx[" + resp2 + "]:=" + freqStrMx[resp2] + ";";
+			}
+			
+			ex[0] := ES_1;
+			ex[1] := ES_2;
+			
+			
+			for (resp2 = 3; resp2 <= resp; resp2 = resp2 + 1)
+			{
+				multString = multString+"+ES_"+resp2;
+				
+				execString = execString + "ES_"+resp2+":>0;ES_"+resp2+":<20;PS_"+resp2+"="+(resp2-1)+";"+
+							 "ex[" + (resp2-1) + "]:=ES_"+resp2+";";
+			}
+			
+			
+			/* initialize the settings to conditional interval means */
+			
+			currentBin	  = 1;
+			currentTarget = dataPoints/resp;
+			currentIndex  = 1;
+			currentSum	  = SELECTED_CHART_DATA[1][0];
+			currentSpan	  = SELECTED_CHART_DATA[1][0];
+			currentValue  = SELECTED_CHART_DATA[0][0]*currentSpan;
+			
+			while (currentIndex < measCount)
+			{
+				if (currentSum>=currentTarget)
+				{
+					execString  = execString + "ES_" +currentBin + "=" + currentValue/currentSpan + ";";
+					currentSpan = 0;
+					currenValue = 0;
+					currentBin  = currentBin+1;
+					currentTarget = currentTarget+dataPoints/resp;
+				}
+				cv 			 = SELECTED_CHART_DATA[1][currentIndex];
+				currentSum   = currentSum   + cv;
+				currentValue = currentValue + SELECTED_CHART_DATA[0][currentIndex] * cv;
+				currentSpan  = currentSpan  + cv;
+				currentIndex = currentIndex + 1;
+			}
+			
+			execString  = execString + "ES_" +currentBin + "=" + currentValue/currentSpan;
+			
+			ExecuteCommands (execString);
+
+			savedLambdas = {resp,2};
+
+			
+			/*fprintf (stdout, "\nStarting values for ", resp, " rate classes.\n");
+			for (resp2 = 1; resp2 <= resp; resp2 = resp2+1)
+			{
+				ExecuteCommands ("fprintf(stdout,\"Class \", resp2, \" = \", ES_"+resp2+");");
+				fprintf (stdout, "\n");
+			}*/
+			
+			Optimize (bestFit, DoNExpCategoryFit(mx,ex));
+			
+			localMax = bestFit[1][0];
+			saveMxL	 = mx;
+			sameExL	 = ex;
+			
+			/*execString = "";
+			
+			fprintf (stdout, Format (resp,3,0), " rate classes: Log(L) = ", localMax, "\n");
+
+			for (itcount = 0; itcount < 3; itcount = itcount + 1)
+			{
+				for (vcount = 1; vcount <= resp; vcount = vcount + 1)
+				{
+					execString = execString + "ES_"+ vcount + "=" + Random(0,20) + ";PS_"+ vcount + "=" + Random(0,1) + ";"; 
+				}
+				ExecuteCommands (execString);
+				Optimize (bestFit, DoNExpCategoryFit(mx,ex));
+				if (bestFit[1][0] > localMax)
+				{
+					itcount = 0;
+					localMax = bestFit[1][0];
+					saveMxL	 = mx;
+					sameExL	 = ex;
+					fprintf (stdout, Format (resp,3,0), " rate classes: Log(L) = ", localMax, "\n");
+				}
+			}*/
+			
+			
+			fprintf (stdout, Format (resp,3,0), " rate classes: Log(L) = ", localMax, "\n");
+			
+			if (localMax - lastMax < 2)
+			{
+				break;
+			}
+			
+			saveMx	= saveMxL;
+			saveEx	= sameExL;
+			lastMax = localMax;
+		}
+		
+		resp = resp-1;
+		
+		fprintf (stdout, "\n\nFit ", resp, " categories to the data\n\n");
+		
+		for (resp2 = 0; resp2 < resp; resp2 = resp2+1)
+		{
+			fprintf (stdout, "Class ", Format (resp2+1,3,0), " : ",  Format (saveEx[resp2], 8, 5), " weight = ", Format (saveMx[resp2], 8, 5), "\n");
+		}
+	}
+	else
+	{
+		fprintf (stdout, "Please select a single sorted column to fit a profile to.\n");
+	}
+}
+else
+{
+	NON_EMPTY_SELECTION = -1;
+}
diff --git a/res/ChartAddIns/Populate Cells b/res/ChartAddIns/Populate Cells
new file mode 100644
index 0000000..8518ef7
--- /dev/null
+++ b/res/ChartAddIns/Populate Cells	
@@ -0,0 +1,25 @@
+if (NON_EMPTY_SELECTION)
+{
+	fprintf (stdout, "Formula to populate with (row_index and col_index will be replaced with actual cell row and column - both 0 based):");
+	fscanf  (stdin,  "String", cell_populator);
+
+	count = Columns (SELECTED_CHART_DATA);
+
+	cell_populator = "new_cell_value:=" + cell_populator;
+
+	ExecuteCommands (cell_populator);
+
+	for (counter=0; counter < count; counter = counter+1)
+	{
+		row_index 					 = SELECTED_CHART_ROWS[counter];
+		col_index 					 = SELECTED_CHART_COLS[counter];
+		SELECTED_CHART_DATA[counter] = new_cell_value;
+	}
+
+	UPDATE_CELL_DATA = 1;
+}
+else
+{
+	NON_EMPTY_SELECTION = -1;
+}
+
diff --git a/res/ChartAddIns/Profile Mean Clustering b/res/ChartAddIns/Profile Mean Clustering
new file mode 100644
index 0000000..d8d7430
--- /dev/null
+++ b/res/ChartAddIns/Profile Mean Clustering	
@@ -0,0 +1,259 @@
+/*****************************************************************************/
+
+function  DoNCategoryFit (weightMatrix)
+{
+	weightClasses	 = Rows(weightMatrix);
+	breakPointMatrix = {3,weightClasses};
+	
+	runningSum 		= 0;
+	targetSum  		= weightMatrix[0];
+	currentIndex 	= 0;
+	currentSlider	= 0;
+	runningSize		= 1;
+	valueSum		= 0;
+	currentSpan		= SELECTED_CHART_DATA[1][currentIndex];
+	
+	measCount 		= Columns (SELECTED_CHART_DATA);
+	
+	
+	while (currentIndex < measCount - 1)
+	{
+		runningSum = runningSum + SELECTED_CHART_DATA[1][currentIndex]/dataPoints;
+		
+		if ((runningSum >= targetSum)||(measCount-currentIndex <= weightClasses - currentSlider))
+		{
+			breakPointMatrix[0][currentSlider] = currentIndex;
+			breakPointMatrix[1][currentSlider] = runningSize;
+				
+			breakPointMatrix[2][currentSlider] = (SELECTED_CHART_DATA[0][currentIndex]*SELECTED_CHART_DATA[1][currentIndex]+valueSum)/(currentSpan+SELECTED_CHART_DATA[1][currentIndex]);	
+			runningSize   = 1;	
+			valueSum	  = 0;
+			currentSlider = currentSlider + 1;
+			targetSum 	  = targetSum + weightMatrix[currentSlider];
+			currentSpan	  = 0;
+		}	
+		else
+		{
+			valueSum	= valueSum	  + SELECTED_CHART_DATA[0][currentIndex]*SELECTED_CHART_DATA[1][currentIndex];
+			runningSize = runningSize + 1;
+			currentSpan = currentSpan + SELECTED_CHART_DATA[1][currentIndex];
+		}
+		currentIndex = currentIndex + 1;
+	}
+
+	currentSpan	  = currentSpan + SELECTED_CHART_DATA[1][currentIndex];
+	valueSum = valueSum	+ SELECTED_CHART_DATA[0][currentIndex]*SELECTED_CHART_DATA[1][currentIndex];
+	breakPointMatrix[0][currentSlider] = currentIndex;
+	breakPointMatrix[1][currentSlider] = runningSize;	
+	breakPointMatrix[2][currentSlider] = valueSum/currentSpan;	
+	
+		
+	currentIndex 	= 0;
+	currentSlider	= 0;
+	runningOffset	= 0;
+	
+	/* now apply the normal smear */
+
+	logLikelihood	= 0;
+	valueSum		= Rows(weightMatrix);
+	
+	while (currentSlider < valueSum)
+	{
+		classSize 	= breakPointMatrix[1][currentSlider];
+		classWeight = weightMatrix[currentSlider];
+			
+		if (classWeight > 0.0)
+		{
+			if (classSize == 1)
+			/* a single class representative - no smearing needed */
+			{
+				logLikelihood = logLikelihood + SELECTED_CHART_DATA[1][runningOffset] * Log (weightMatrix[currentSlider]);
+			}
+			else
+			{
+				classMean 		= breakPointMatrix[2][currentSlider];
+				classNorm 		= 0;
+				currentIndex 	= runningOffset+classSize-1;
+					
+				REWEIGHTED_MATRIX = {measCount,1};
+				for (reslider = runningOffset; reslider < currentIndex; reslider = reslider+1)
+				{
+					targetSum = SELECTED_CHART_DATA[0][reslider];
+					targetSum = Exp(-(targetSum-classMean)^2/(2*varMult*Abs(classMean)));		
+					if (targetSum==0)
+					{
+						targetSum = 1e-50;
+					}			
+					REWEIGHTED_MATRIX[reslider] = targetSum;
+					classNorm = classNorm + targetSum;
+				}
+				
+				targetSum = SELECTED_CHART_DATA[0][reslider];
+				targetSum = Exp(-(targetSum-classMean)^2/(2*varMult*Abs(classMean)));		
+				if (targetSum==0)
+				{
+					targetSum = 1e-50;
+				}			
+
+				REWEIGHTED_MATRIX[reslider] = targetSum;
+				classNorm = classNorm + targetSum;
+				
+				REWEIGHTED_MATRIX = Log (REWEIGHTED_MATRIX * (classWeight/classNorm));								
+
+				currentIndex = currentIndex + 1;
+				for (reslider = runningOffset; reslider < currentIndex; reslider = reslider+1)
+				{
+					logLikelihood = logLikelihood + REWEIGHTED_MATRIX[reslider]*SELECTED_CHART_DATA[1][reslider];
+				}
+				
+			}
+		}
+		else
+		{
+			if (classSize>0)
+			{
+				return -(1e100);
+			}
+		}
+		runningOffset = runningOffset + classSize;
+		currentSlider = currentSlider + 1;
+	}
+	
+	return logLikelihood;
+}
+
+/*****************************************************************************/
+
+if (NON_EMPTY_SELECTION)
+{
+	UPDATE_CELL_DATE = 0;
+	
+	data_rows  	 = Columns 	(SELECTED_CHART_ROWS);
+
+	temp = SELECTED_CHART_COLS[0];
+
+	for (count = 1; count<data_rows; count = count+1)
+	{
+		temp2 = SELECTED_CHART_COLS[count];
+		if (temp!=temp2)
+		{
+			break;
+		}
+		if (SELECTED_CHART_DATA[count]<SELECTED_CHART_DATA[count-1])
+		{
+			break;
+		}
+	}
+
+	if (count == data_rows)
+	{
+		/* compress the data vector to account for repeated observations */
+		
+		dataPoints = Columns(SELECTED_CHART_DATA);
+		temp_data_vector = {2, dataPoints};
+		currentIndex = 0;
+		
+		temp_data_vector[0][0] = SELECTED_CHART_DATA[0];
+		temp_data_vector[1][0] = 1;
+		for (nextIndex = 1; nextIndex < dataPoints; nextIndex = nextIndex + 1)
+		{
+			if (SELECTED_CHART_DATA[nextIndex]!=SELECTED_CHART_DATA[nextIndex-1])
+			{
+				currentIndex = currentIndex+1;
+				temp_data_vector[0][currentIndex] = SELECTED_CHART_DATA[nextIndex];
+			}
+			temp_data_vector[1][currentIndex] = temp_data_vector[1][currentIndex] + 1;
+		}
+		
+		SELECTED_CHART_DATA = {2, currentIndex+1};
+		
+		upperBound = 0;
+		
+		for (nextIndex = 0; nextIndex <= currentIndex; nextIndex = nextIndex + 1)
+		{
+			SELECTED_CHART_DATA[0][nextIndex] = temp_data_vector[0][nextIndex];
+			SELECTED_CHART_DATA[1][nextIndex] = temp_data_vector[1][nextIndex];
+			upperBound = upperBound + temp_data_vector[1][nextIndex] * Log(temp_data_vector[1][nextIndex]/dataPoints);
+		}
+		
+		
+		temp_data_vector = 0;
+		normal_sigma 	 = .25;
+		lastMax 		 = -100000000000;
+
+		for (resp = 2; resp <= Columns(SELECTED_CHART_DATA); resp = resp+1)
+		{
+			freqStrMx    = {resp,1};
+			freqStrMx[0] = "PS_1";
+
+			for (mi=1; mi<resp-1; mi=mi+1)
+			{
+				freqStrMx[mi] = "";
+				for (mi2=1;mi2<=mi;mi2=mi2+1)
+				{
+					freqStrMx[mi] = freqStrMx[mi]+"(1-PS_"+mi2+")";		
+				}
+				freqStrMx[mi] = freqStrMx[mi]+"PS_"+(mi+1);	
+			}	
+
+			freqStrMx[mi] = "";
+			for (mi2=1;mi2<mi;mi2=mi2+1)
+			{
+				freqStrMx[mi] = freqStrMx[mi]+"(1-PS_"+mi2+")";		
+			}
+			freqStrMx[mi] = freqStrMx[mi]+"(1-PS_"+mi+")";	
+			mx = {resp,1};
+			
+			execString = "";
+			for (resp2 = 0; resp2 < resp; resp2 = resp2 + 1)
+			{
+				if (resp2)
+				{
+					execString = execString + "PS_"+resp2+":>0;PS_"+resp2+":<1;PS_"+resp2+"=1/"+(resp-resp2+1)+";";
+				}
+				execString = execString + "mx[" + resp2 + "]:=" + freqStrMx[resp2] + ";";
+			}
+			ExecuteCommands (execString);
+			
+			varMult = 1+Log(resp-1);
+			
+			/*mx = {resp,1};
+			nStr = "";
+			
+			for (mi=1; mi<=resp; mi=mi+1)
+			{
+				ExecuteCommands ("APS_"+mi+"="+1/resp+";APS_"+mi+":>0;APS_"+mi+":<1;mx["+(mi-1)+"]:=APS_"+mi+"/weightFactor;");
+				nStr = nStr + "+APS_"+mi;
+			}*/
+			
+			ExecuteCommands ("weightFactor:="+nStr[1][Abs(nStr)-1]+";");
+			Optimize (bestFit, DoNCategoryFit(mx));
+			
+			fprintf (stdout, Format (resp,3,0), " rate classes: Log(L) = ", bestFit[1][0], " (upper bound = ", upperBound, ")\n");
+			if (bestFit[1][0] - lastMax < 2)
+			{
+				break;
+			}
+			saveBPM = breakPointMatrix;
+			saveMx	= mx;
+			lastMax = bestFit[1][0];
+		}
+		
+		resp = resp-1;
+		
+		fprintf (stdout, "\n\nFit ", resp, " categories to the data\n\n");
+		
+		for (resp2 = 0; resp2 < resp; resp2 = resp2+1)
+		{
+			fprintf (stdout, "Class ", Format (resp2+1,3,0), " : ",  Format (saveBPM[2][resp2], 8, 5), " weight = ", Format (saveMx[resp2], 8, 5), "\n");
+		}
+	}
+	else
+	{
+		fprintf (stdout, "Please select a single sorted column to fit a profile to.\n");
+	}
+}
+else
+{
+	NON_EMPTY_SELECTION = -1;
+}
diff --git a/res/ChartAddIns/Running Sum b/res/ChartAddIns/Running Sum
new file mode 100644
index 0000000..1980ab2
--- /dev/null
+++ b/res/ChartAddIns/Running Sum	
@@ -0,0 +1,32 @@
+if (NON_EMPTY_SELECTION)
+{
+	UPDATE_CELL_DATA = 1;
+
+	data_rows  	 = Columns 	(SELECTED_CHART_ROWS);
+
+	temp = SELECTED_CHART_COLS[0];
+
+	for (count = 1; count<data_rows; count = count+1)
+	{
+		temp2 = SELECTED_CHART_COLS[count];
+		if (temp!=temp2)
+		{
+			break;
+		}
+	}
+
+	if (count == data_rows)
+	{
+		for (count = 1; count<data_rows; count = count+1)
+		{
+			SELECTED_CHART_DATA[count] = SELECTED_CHART_DATA[count-1]+SELECTED_CHART_DATA[count];
+		}
+		return 0;
+	}
+
+	fprintf (stdout, "Please select a single column to sort.\n");
+}
+else
+{
+	NON_EMPTY_SELECTION = -1;
+}
diff --git a/res/ChartAddIns/Samplers/lhc.bf b/res/ChartAddIns/Samplers/lhc.bf
new file mode 100644
index 0000000..edc3b88
--- /dev/null
+++ b/res/ChartAddIns/Samplers/lhc.bf
@@ -0,0 +1,66 @@
+/*---------------------------------------------------------------------------------------------------------------------*/
+
+varCount = Abs(COVARIANCE_PARAMETER);
+usedVars = Rows(COVARIANCE_PARAMETER);
+
+inflationFactor = -1;
+while (inflationFactor <= 0)
+{
+	fprintf (stdout, "Inflation factor for profile likelihood bounds (>0.0):");
+	fscanf (stdin,"Number",inflationFactor);
+}
+
+fprintf (stdout, "\nObtaining profile likeihood bounds...\n");
+
+svpc = COVARIANCE_PRECISION;
+COVARIANCE_PRECISION = 0.95;
+
+ExecuteCommands ("CovarianceMatrix (covMx, "+LF_NAME+");");
+
+COVARIANCE_PRECISION = svpc;
+stashedValues = {varCount,4};
+
+assignmentString = "";
+assignmentString * 256;
+
+for (k=0; k<varCount; k=k+1)
+{
+	aKey = usedVars[k];
+	stashedValues[k][0] = covMx[k][1];
+	stashedValues[k][1] = covMx[k][1]-(covMx[k][1]-covMx[k][0])*inflationFactor;
+	if (stashedValues[k][1] < 0)
+	{
+		stashedValues[k][1] = 0;
+	}
+	stashedValues[k][2] = covMx[k][1]+(covMx[k][2]-covMx[k][1])*inflationFactor;
+	stashedValues[k][3] = (covMx[k][2]-covMx[k][0])*inflationFactor/SAMPLE_N;
+	assignmentString * (aKey+ "=generatedSamples[itCount]["+k+"];\n");
+}
+
+assignmentString * 0;
+
+varCount	= Rows (covMx);
+generatedSamples = {SAMPLE_N,varCount};
+indexVector		 = {1,SAMPLE_N};
+
+for (k=0; k<SAMPLE_N; k=k+1)
+{
+	indexVector[k] = k;
+}
+
+fprintf (stdout, "\nDoing Latin hypercube sampling...\n");
+
+for (k=0; k<varCount; k=k+1)
+{
+	permVector = Random (indexVector,1);
+	lb = stashedValues[k][1];
+	st = stashedValues[k][3];
+	for (m = 0; m<SAMPLE_N; m=m+1)
+	{
+		generatedSamples[m][k] = lb+st*permVector[m];
+	}
+}
+
+
+#include "srs.ibf";
+
diff --git a/res/ChartAddIns/Samplers/sir.bf b/res/ChartAddIns/Samplers/sir.bf
new file mode 100644
index 0000000..aa3dbcf
--- /dev/null
+++ b/res/ChartAddIns/Samplers/sir.bf
@@ -0,0 +1,135 @@
+/*---------------------------------------------------------------------------------------------------------------------*/
+
+pi_const = 3.141592653589793;
+
+/*---------------------------------------------------------------------------------------------------------------------*/
+
+function x2ymap (x,l,u, m)
+{	
+	if (m==1)
+		return Log(x-l);
+	else
+	{
+		x = (x-l)/(u-l);
+		return Log(x/(1-x));
+	}
+}
+
+/*---------------------------------------------------------------------------------------------------------------------*/
+
+function  y2xmap (y,l,u, m)
+{
+	if (m==1)
+		return Exp(y)+l;
+	else
+	{
+		x = Exp(y)/(1+Exp(y));
+		return x*(u-l)+l;
+	}
+}
+
+/*---------------------------------------------------------------------------------------------------------------------*/
+
+function CholeskyDecomposition (aMatrix)
+{
+	matrixDim = Rows(aMatrix);
+	_CholeskyL_ 	 =     {matrixDim,matrixDim};
+	for (i=0; i<matrixDim; i=i+1)
+	{
+		for (j=i; j<matrixDim; j=j+1)
+		{
+			k = i-1;
+			for (sum=aMatrix[i][j]; k>=0; k=k-1)
+			{
+				sum = sum - aMatrix[i][k]*aMatrix[j][k];
+			}
+			if (i==j)
+			{
+				if (sum<=0)
+				{
+					fprintf (stdout, "\nMatrix passed to CholeskyDecomposition was not positive definite\n");
+					return 0;
+				}
+				_CholeskyL_[i][i] = Sqrt (sum);
+			}
+			else
+			{
+				_CholeskyL_[j][i] = sum/_CholeskyL_[i][i];
+			}
+		}
+	}
+	return _CholeskyL_;
+}
+
+/*---------------------------------------------------------------------------------------------------------------------*/
+
+varCount = Abs(COVARIANCE_PARAMETER);
+stashedValues = {varCount,4};
+MeanVector    = {varCount,1};
+
+usedVars = Rows(COVARIANCE_PARAMETER);
+
+
+smif = USE_INTERVAL_MAPPING;
+svpc = COVARIANCE_PRECISION;
+USE_INTERVAL_MAPPING = 1;
+COVARIANCE_PRECISION = 2;
+
+ExecuteCommands ("CovarianceMatrix (covMx, "+LF_NAME+");");
+
+COVARIANCE_PRECISION = svpc;
+USE_INTERVAL_MAPPING = smif;
+
+assignmentString = "";
+assignmentString * 256;
+
+for (k=0; k<varCount; k=k+1)
+{
+	aKey = usedVars[k];
+	GetInformation(varInfo,aKey);
+	stashedValues[k][0] = varInfo[0];
+	stashedValues[k][1] = varInfo[1];
+	stashedValues[k][2] = varInfo[2];
+	stashedValues[k][3] = INTERVAL_MAPPING_METHOD[aKey];
+	MeanVector[k] = x2ymap(varInfo[0],varInfo[1],varInfo[2],stashedValues[k][3]);
+	assignmentString * (aKey+ "=generatedSamples[itCount]["+k+"];\n");
+}
+
+assignmentString * 0;
+
+varCount	= Rows (covMx);
+generatedSamples = {SAMPLE_N,varCount};
+
+LT = CholeskyDecomposition(covMx);
+
+
+if (Abs(LT))
+{
+	fprintf (stdout, "Generating approximate normal samples...\n");
+	timer = Time (0);
+	for (itCount = 0; itCount < SAMPLE_N; itCount = itCount + 1)
+	{
+		sampleVector = {varCount,1};
+		
+		for (coord = 0; coord < varCount; coord = coord+1)
+		{
+			_cdfCut = Random(0,1);
+			FindRoot (stdNormal,ZCDF(x)-_cdfCut,x,-10,10);
+			sampleVector[coord] = stdNormal;
+		}
+		
+		sampleVector = LT*sampleVector+MeanVector;
+
+		for (coord = 0; coord < varCount; coord = coord+1)
+		{
+			generatedSamples[itCount][coord] = y2xmap(sampleVector[coord],stashedValues[coord][1],stashedValues[coord][2],stashedValues[coord][3]);
+		}
+		
+		if ((1+itCount) % 500 == 0)
+		{
+			fprintf (stdout, itCount+1, "/", SAMPLE_N, " samples done. Estimated remaining time: ",Format (((SAMPLE_N-itCount-1)/(itCount+1))*(Time(0)-timer),5,2)," seconds \n");
+		}
+	}
+	
+    #include "srs.ibf";
+}
diff --git a/res/ChartAddIns/Samplers/srs.ibf b/res/ChartAddIns/Samplers/srs.ibf
new file mode 100644
index 0000000..1d79059
--- /dev/null
+++ b/res/ChartAddIns/Samplers/srs.ibf
@@ -0,0 +1,108 @@
+fprintf (stdout, "\n\nComputing likelihood weights (this may take a while)...\n");
+
+ExecuteCommands ("LFCompute ("+LF_NAME+",LF_START_COMPUTE);");
+
+scores = {SAMPLE_N,2};
+
+bestScore = -1e25;
+
+timer = Time (0);
+for (itCount = 0; itCount < SAMPLE_N; itCount = itCount + 1)
+{
+	ExecuteCommands (assignmentString+"LFCompute ("+LF_NAME+",lfWeight);");
+	scores[itCount][0] = lfWeight;
+	
+	if (lfWeight > bestScore)
+	{
+		bestScore = lfWeight;
+	}
+	
+	if ((1+itCount) % 100 == 0)
+	{
+		fprintf (stdout, itCount+1, "/", SAMPLE_N, " evaluations done. Estimated remaining time: ",Format (((SAMPLE_N-itCount-1)/(itCount+1))*(Time(0)-timer),5,2)," seconds \n");
+	}
+}
+
+	/* restore to original values */
+
+for (k=0; k<varCount; k=k+1)
+{
+	aKey = usedVars[k];
+	ExecuteCommands (aKey + "=" + stashedValues[k][0] + ";");
+}	
+
+ExecuteCommands ("LFCompute ("+LF_NAME+",LF_DONE_COMPUTE);");
+
+fprintf (stdout, "\n\nResampling...\n");
+coord = 0;
+for (itCount = 0; itCount < SAMPLE_N; itCount = itCount + 1)
+{
+	scores[itCount][0] = Exp(scores[itCount][0]-bestScore);
+	coord = coord + scores[itCount][0];
+}
+
+N_eff = 0;
+
+for (itCount = 0; itCount < SAMPLE_N; itCount = itCount + 1)
+{
+	N_eff = N_eff + (scores[itCount][0]/coord)^2;
+}
+
+fprintf (stdout, "Estimated effective sample size: ", 1/N_eff, "\n\n");
+
+j = 0;
+sampledPoints = {SAMPLE_M,varCount+1};
+
+timer = Time (0);
+
+for (itCount = 0; itCount < SAMPLE_M; itCount = itCount + 1)
+{
+	sum = Random(0,1);
+	runningSum     = 0;
+	lastValidIndex = 0;
+	
+	for (k=0; k<SAMPLE_N && runningSum < sum;k=k+1)
+	{
+		if (scores[k][1] == 0)
+		{
+			lastValidIndex = k;
+			runningSum = runningSum + scores[k][0] / coord; 
+		}
+	}
+	
+	sampledPoints[j][0] = Log(scores[lastValidIndex][0])+bestScore;
+	for (k = 0; k < varCount; k=k+1)
+	{
+		sampledPoints[j][k+1] = generatedSamples[lastValidIndex][k];	
+	}
+	coord = coord - scores[lastValidIndex][0];
+	scores[lastValidIndex][1] = 1;
+	j = j+1;
+
+	if ((1+itCount) % 500 == 0)
+	{
+		fprintf (stdout, itCount+1, "/", SAMPLE_M, " samples drawn. Estimated remaining time: ",Format (((SAMPLE_M-itCount-1)/(itCount+1))*(Time(0)-timer),5,2)," seconds \n");
+	}
+}
+
+labelMatrix = {1,varCount+1};
+
+labelMatrix[0] = "-Log(L)";
+for (k = 0; k < varCount; k=k+1)
+{
+	labelMatrix[k+1] = usedVars[k];	
+}
+
+/* open a chart window */
+
+OpenWindow (CHARTWINDOW,{{"Sampled parameter values"}
+					   {"labelMatrix"},
+					   {"sampledPoints"},
+					   {""},
+					   {"Index"},
+					   {""},
+					   {""},
+					   {""},
+					   {""},
+					   {"3"}},
+					   "(SCREEN_WIDTH-200);(SCREEN_HEIGHT-200);80;100");
diff --git a/res/ChartAddIns/Select Cells By Index b/res/ChartAddIns/Select Cells By Index
new file mode 100644
index 0000000..867716f
--- /dev/null
+++ b/res/ChartAddIns/Select Cells By Index	
@@ -0,0 +1,46 @@
+fprintf (stdout, "Selection criterion (row_index and col_index will be replaced with actual cell row and column - both 0 based):");
+fscanf  (stdin,  "String", cell_populator);
+
+cell_populator = "cell_selector:=" + cell_populator;
+
+ExecuteCommands (cell_populator);
+
+selection_Size = 0;
+
+for (row_index=0; row_index < CHART_DIMENSIONS[0]; row_index = row_index+1)
+{
+	for (col_index=0; col_index < CHART_DIMENSIONS[1]; col_index = col_index+1)
+	{
+		if (cell_selector)
+		{
+			selection_Size = selection_Size+1;	
+		}
+	}
+}
+
+if (selection_Size)
+{
+	SELECTED_CHART_ROWS    = {1,selection_Size};
+	SELECTED_CHART_COLS	   = {1,selection_Size};
+	
+	selection_Size = 0;
+
+	for (row_index=0; row_index < CHART_DIMENSIONS[0]; row_index = row_index+1)
+	{
+		for (col_index=0; col_index < CHART_DIMENSIONS[1]; col_index = col_index+1)
+		{
+			if (cell_selector)
+			{
+				SELECTED_CHART_ROWS[selection_Size] = row_index;		
+				SELECTED_CHART_COLS[selection_Size] = col_index;		
+				selection_Size = selection_Size+1;			
+			}
+		}
+	}
+
+	UPDATE_CHART_SELECTION = 1;
+}
+else
+{
+	fprintf (stdout, "\nNo matches found!\n");
+}
diff --git a/res/ChartAddIns/Select Cells By Value b/res/ChartAddIns/Select Cells By Value
new file mode 100644
index 0000000..4360828
--- /dev/null
+++ b/res/ChartAddIns/Select Cells By Value	
@@ -0,0 +1,96 @@
+if (NON_EMPTY_SELECTION)
+{
+	data_rows  	 = Columns 	(SELECTED_CHART_ROWS);
+
+	temp = SELECTED_CHART_COLS[0];
+
+	for (count = 1; count<data_rows; count = count+1)
+	{
+		temp2 = SELECTED_CHART_COLS[count];
+		if (temp!=temp2)
+		{
+			break;
+		}
+	}
+
+	if (count == data_rows)
+	{
+		cell_selector = "";
+		while (Abs(cell_selector) == 0)
+		{
+			fprintf (stdout, "\nSelection criterion in terms of cell_value:");
+			fscanf  (stdin,  "String", cell_selector);
+		}
+		
+		ExecuteCommands ("cell_selector:="+cell_selector+";");
+		
+		selectedData   = {data_rows,2};
+		actualSelected = 0;
+		
+		for (count = 0;  count < data_rows; count = count + 1)
+		{
+			cell_value = SELECTED_CHART_DATA[count];
+			if (cell_selector)
+			{
+				selectedData [actualSelected][1] = cell_value;
+				selectedData [actualSelected][0] = SELECTED_CHART_ROWS[count]+1;
+				actualSelected = actualSelected + 1;
+			}
+		}
+		
+		if (actualSelected == 0)
+		{
+			fprintf (stdout, "\nNo cells matched selection criteria\n");
+		}
+		else
+		{
+			reallySelectedData = {actualSelected,2};
+			
+			
+			/*reallySelectedData[0][0] = selectedData[0][0];
+			reallySelectedData[0][1] = selectedData[0][1];
+			fprintf (stdout, "\nSelection String:\n", reallySelectedData[0][0]-1);*/
+			
+			for (count = 0; count < actualSelected; count = count + 1)
+			{
+				reallySelectedData[count][0] = selectedData[count][0];
+				reallySelectedData[count][1] = selectedData[count][1];
+				/*fprintf (stdout, ",", reallySelectedData[count][0]-1);*/
+			}
+			
+			/*fprintf (stdout, "\n");*/
+			
+			labels = {{"Cell Index", "Value"}};
+			
+			selectedData = "Selected Data";
+			OpenWindow (CHARTWINDOW,{{selectedData}
+								   {"labels"},
+								   {"reallySelectedData"},
+								   {"Bar Chart"},
+								   {labels[0]},
+								   {labels[1]},
+								   {"Index"},
+								   {""},
+								   {"Value"},
+								   {"0"}
+								   {""}
+								   {"-1;-1"}
+								   {"10;1.309;0.785398"}
+								   {"Times:12:0;Times:10:0;Times:12:2"}
+								   {"0;0;16777215;1644825;0;0;6579300;11842740;13158600;14474460;0;3947580;4294967295;15670812;6845928;16771158;2984993;9199669;7018159;1460610;16748822;11184810;14173291"}
+								   {"16"}
+								   },
+								   "SCREEN_WIDTH-60;SCREEN_HEIGHT-50;30;50");
+		}
+		
+
+	}
+	else
+	{
+		fprintf (stdout, "Please select a single column of data.\n");
+	}
+}
+else
+{
+	NON_EMPTY_SELECTION = -1;
+}
diff --git a/res/ChartAddIns/SingleColumn b/res/ChartAddIns/SingleColumn
new file mode 100644
index 0000000..1abd801
--- /dev/null
+++ b/res/ChartAddIns/SingleColumn
@@ -0,0 +1,22 @@
+if (NON_EMPTY_SELECTION)
+{
+	SELECTED_CHART_DATA = Transpose(SELECTED_CHART_DATA);
+	labelMatrix = {{"Data"}};
+	promptString = "Single Column";
+	OpenWindow (CHARTWINDOW,{{promptString}
+							   {"labelMatrix"},
+							   {"SELECTED_CHART_DATA"},
+							   {"Node"},
+							   {""},
+							   {""},
+							   {""},
+							   {""},
+							   {""},
+							   {"0"}},
+							   "SCREEN_WIDTH-60;SCREEN_HEIGHT-50;30;50");
+}
+else
+{
+	NON_EMPTY_SELECTION = -1;
+}
+
diff --git a/res/ChartAddIns/Sort b/res/ChartAddIns/Sort
new file mode 100644
index 0000000..3b2cd3f
--- /dev/null
+++ b/res/ChartAddIns/Sort
@@ -0,0 +1,29 @@
+if (NON_EMPTY_SELECTION)
+{
+	UPDATE_CELL_DATA = 1;
+
+	data_rows  	 = Columns 	(SELECTED_CHART_ROWS);
+
+	temp = SELECTED_CHART_COLS[0];
+
+	for (count = 1; count<data_rows; count = count+1)
+	{
+		temp2 = SELECTED_CHART_COLS[count];
+		if (temp!=temp2)
+		{
+			break;
+		}
+	}
+
+	if (count == data_rows)
+	{
+		SELECTED_CHART_DATA = Transpose(Transpose(SELECTED_CHART_DATA)%0);
+		return 0;
+	}
+
+	fprintf (stdout, "Please select a single column to sort.\n");
+}
+else
+{
+	NON_EMPTY_SELECTION = -1;
+}
diff --git a/res/DatapanelAddIns/Character Plot b/res/DatapanelAddIns/Character Plot
new file mode 100644
index 0000000..2262fcd
--- /dev/null
+++ b/res/DatapanelAddIns/Character Plot	
@@ -0,0 +1,177 @@
+RequireVersion ("0.9920060501");
+
+#include "ibfs/char_colors.def";
+
+ExecuteAFile ("`HYPHY_LIB_DIRECTORY`TemplateBatchFiles`DIRECTORY_SEPARATOR`Utility`DIRECTORY_SEPARATOR`GrabBag.bf");
+ExecuteAFile ("`HYPHY_LIB_DIRECTORY`TemplateBatchFiles`DIRECTORY_SEPARATOR`Utility`DIRECTORY_SEPARATOR`PostScript.bf");
+
+if (_selFilters == 1)
+{
+	_baseName = _DATAPANEL_SELECTED_FILTERS_[0];
+}
+else
+{
+	_baseName = _DATAPANEL_DATASET_NAME_;
+}
+
+_font_size  = 14;
+_char_space_mult = 1 + 0.1*((Log (_DATAPANEL_DATAFILTER_.sites)/Log(2) + 1.5)$1);
+_char_space = (_font_size*_char_space_mult);
+_page_w	    = 612;
+_page_h     = 792;
+_atom		= 5;
+
+DEFAULT_FILE_SAVE_NAME = _baseName + ".ps";
+SetDialogPrompt 	  ("Save PostScript graphics to:");
+fprintf (PROMPT_FOR_FILE,CLEAR_FILE,_HYPSPageHeader (_page_w,_page_h,"Character Plot for "+_baseName),
+							_HYPSSetFont ("Courier",_font_size),
+							"/dmx 6 array currentmatrix def\n",
+							"/sshift fs 2 idiv fs add def\n",
+							"/setb {0 0 0 setrgbcolor} def\n",
+							"/flbx {setrgbcolor newpath 2 copy moveto 4 -1 roll exch 2 copy lineto exch 4 -1 roll 2 copy lineto 4 -1 roll exch lineto pop pop closepath fill setb} def\n",
+							"/drawletter {translate scale newpath 0 0 moveto false charpath fill dmx setmatrix translate 0.4 0.4 scale newpath sshift 0 moveto  false charpath fill dmx setmatrix} def\n"
+);
+
+outFile = LAST_FILE_PATH;
+
+_selFilters		= Columns(_DATAPANEL_SELECTED_FILTERS_);
+
+if (_selFilters > 1)
+{
+	fprintf (stdout, "ERROR: This plug in-needs zero or one selected data filter\n");
+	return 0;
+}
+
+if (_selFilters == 1)
+{
+	_baseName = _DATAPANEL_SELECTED_FILTERS_[0];
+}
+else
+{
+	_baseName = _DATAPANEL_DATASET_NAME_;
+}
+
+GetDataInfo (_charHandles, _DATAPANEL_DATAFILTER_, "CHARACTERS");
+_ccount  = Columns (_charHandles);
+_unit    = {1,_ccount}["1"];
+GetDataInfo (_dupInfo, _DATAPANEL_DATAFILTER_);
+_result_cache = {};
+_maxD		  = 0;
+
+_char_per_line  = _page_w / _char_space $ _atom * _atom;
+if (_char_per_line == 0)
+{
+	fprintf (stdout, "\nERROR: At least ",_atom," characters must fit in a line; reduce font size in 'Character Plot' source\n");
+}
+else
+{
+	fprintf (stdout, "\n", _char_per_line, " characters per line\n");
+}
+
+_dbyLine = {};
+
+for (_idx = 0; _idx < _DATAPANEL_DATAFILTER_.sites; _idx = _idx + 1)
+{
+	_siteInfo = {_ccount, 2};
+	_cCounter = {_ccount, 1};
+	for (_sidx = 0; _sidx < _DATAPANEL_DATAFILTER_.species; _sidx = _sidx + 1)
+	{
+		GetDataInfo (_thisChar, _DATAPANEL_DATAFILTER_, _sidx, _dupInfo[_idx]);
+		/* don't count gaps */
+		if (Abs (_thisChar) != Sqrt (_ccount))
+		{
+			_cCounter = _cCounter + _thisChar*(1/(_unit*_thisChar)[0]);
+		}
+	}
+	_siteInfo = _siteInfo ["_MATRIX_ELEMENT_ROW_ * _MATRIX_ELEMENT_COLUMN_ + (1-_MATRIX_ELEMENT_COLUMN_)*_cCounter[_MATRIX_ELEMENT_ROW_]"]%0;
+	for (_sidx = _ccount-1; _sidx >= 0; _sidx = _sidx - 1)
+	{
+		if (_siteInfo[_sidx][0] == 0)
+		{
+			break;
+		}
+	}
+	_result_cache[_idx] = _siteInfo[{{_sidx+1,0}}][{{_ccount-1,1}}];
+	_sidx = Rows (_result_cache[_idx]);
+	
+	if (_sidx > _maxD)
+	{
+		_maxD = _sidx;
+	}
+
+	if ((_idx + 1)%_char_per_line==0)
+	{
+		_dbyLine [Abs(_dbyLine)] = _maxD;
+		_maxD = 0;
+	}	
+}
+
+_current_x 	  = 0;
+_current_y	  = _page_h-2*_font_size;
+_cl			  = 0;
+
+for (_idx = 0; _idx < _DATAPANEL_DATAFILTER_.sites; _idx = _idx + 1)
+{
+	_cCounter = _result_cache[_idx];
+	
+	if (Rows(_cCounter))
+	{
+		for (_sidx = Rows(_cCounter)-1; _sidx >= 0; _sidx = _sidx - 1)
+		{
+			_siteInfo = _current_y-_font_size*(Rows(_cCounter)-1-_sidx);
+			_my_c     = _charHandles[_cCounter[_sidx][1]];
+			if (Abs(_charColorList[_my_c]))
+			{
+				fprintf (outFile, _charColorList[_my_c], " setrgbcolor\n");
+			}
+			fprintf (outFile, "(",_cCounter[_sidx][0],") ", _current_x, " ",_siteInfo," (",_my_c,") 1 1 ", _current_x, " ", _siteInfo, " drawletter\n");
+			if (Abs(_charColorList[_my_c]))
+			{
+				fprintf (outFile, "setb\n");
+			}
+		}
+	}
+	else
+	{
+		fprintf (outFile, "( ) ", _current_x, " ",_current_y," (-) 1 1 ", _current_x, " ", _current_y, " drawletter\n");
+	}
+	_current_x = _current_x + _char_space;
+
+	if ((_idx + 1)%_char_per_line==0 || _idx == _DATAPANEL_DATAFILTER_.sites-1)
+	{
+		_current_y = _current_y + _font_size;
+		if (_idx == _DATAPANEL_DATAFILTER_.sites-1)
+		{
+			if (_DATAPANEL_DATAFILTER_.sites % _char_per_line == 0)
+			{
+				_startx = _char_per_line;
+			}
+			else
+			{
+				_startx = _DATAPANEL_DATAFILTER_.sites%_char_per_line$_atom*_atom;
+			}
+			_idx2 = _DATAPANEL_DATAFILTER_.sites-_DATAPANEL_DATAFILTER_.sites%_char_per_line;
+		}
+		else
+		{
+			_idx2 = _idx - _char_per_line + 1;
+			_startx = _char_per_line;
+		}
+		fprintf (outFile, "0 ", _current_y + _font_size * 4$5, " ", (_char_space+1) * _char_per_line , " ", _current_y - _font_size$4, " 0.9 0.9 0.9 flbx\n");
+		for (_idx3 = _startx; _idx3 > 0; _idx3 = _idx3 - _atom)
+		{
+			fprintf (outFile, "( ) 0 0 (",_idx2+_idx3,") 0.9 0.9 ", (_idx3-1) * _char_space, " ", _current_y, " drawletter\n");
+		}
+		_current_x = 0; 
+		_current_y = _current_y - (2+_dbyLine[_cl])*_font_size;
+		_cl = _cl+1;
+		if (_current_y - (1+_dbyLine[_cl])*_font_size < 0)
+		{
+			_current_y = _page_h-2*_font_size;
+			fprintf (outFile, "showpage\n");
+		}
+	}
+}
+
+
+
diff --git a/res/DatapanelAddIns/Character Plot Two b/res/DatapanelAddIns/Character Plot Two
new file mode 100644
index 0000000..9976bd2
--- /dev/null
+++ b/res/DatapanelAddIns/Character Plot Two	
@@ -0,0 +1,392 @@
+RequireVersion ("0.9920060502");
+
+#include "ibfs/char_colors.def";
+
+_idx = "`HYPHY_LIB_DIRECTORY`TemplateBatchFiles`DIRECTORY_SEPARATOR`Utility`DIRECTORY_SEPARATOR`GrabBag.bf";
+ExecuteCommands ("#include\"`_idx`\";");
+_idx = "`HYPHY_LIB_DIRECTORY`TemplateBatchFiles`DIRECTORY_SEPARATOR`Utility`DIRECTORY_SEPARATOR`PostScript.bf";
+ExecuteCommands ("#include\"`_idx`\";");
+
+_seqCount 		= Columns(_DATAPANEL_SELECTED_SEQUENCES_);
+_selFilters		= Columns(_DATAPANEL_SELECTED_FILTERS_);
+
+if (_seqCount == 0 || (_selFilters > 1 && _selFilters!=3) || _seqCount == _DATAPANEL_DATAFILTER_.species)
+{
+	fprintf (stdout, "ERROR: This plug in-needs one selected data filter and some (but not all) selected sequences\n");
+	return 0;
+}
+
+_unitSize 	   = _DATAPANEL_UNIT_SIZE_[0];
+
+if (_unitSize!=1)
+{
+	fprintf (stdout, "ERROR: This plug can only accept filters with unit size of one\n");
+	return 0;
+}
+
+if (_selFilters)
+{
+	_baseName = _DATAPANEL_SELECTED_FILTERS_[0];
+}
+else
+{
+	_baseName = _DATAPANEL_DATASET_NAME_;
+}
+
+_sequenceMapping = {};
+_haveReference = -1;
+
+for (_idx = 0; _idx < _seqCount; _idx = _idx + 1)
+{
+	_sequenceMapping[_DATAPANEL_SELECTED_SEQUENCES_[_idx]] = 1;
+}
+
+for (_idx = 0; _idx < _DATAPANEL_DATAFILTER_.species; _idx = _idx + 1)
+{
+	GetString (_sidx, _DATAPANEL_DATAFILTER_, _idx);
+	if (_sidx % "Reference")
+	{
+		_haveReference = _idx;
+	}
+}
+_exclusions    = _DATAPANEL_EXCLUSIONS_[0];
+
+
+DataSetFilter _subset1 = CreateFilter (_DATAPANEL_DATAFILTER_,_unitSize,"",_sequenceMapping[speciesIndex] == 1 && speciesIndex != _haveReference,_exclusions);
+DataSetFilter _subset2 = CreateFilter (_DATAPANEL_DATAFILTER_,_unitSize,"",_sequenceMapping[speciesIndex] == 0 && speciesIndex != _haveReference,_exclusions);
+
+_underMap = {};
+if (_selFilters == 3)
+{
+	ExecuteCommands ("GetDataInfo (_under0,"+_DATAPANEL_SELECTED_FILTERS_[0]+",0);GetDataInfo (_under1,"+_DATAPANEL_SELECTED_FILTERS_[1]+",0);GetDataInfo (_under2,"+_DATAPANEL_SELECTED_FILTERS_[2]+",0);");
+	if (Columns (_under1) < Columns (_under0))
+	{
+		for (_idx = 0; _idx < Columns (_under1); _idx = _idx+1)
+		{
+			_underMap [_under1[_idx]] = 1;
+		}
+	}
+	if (Columns (_under2) < Columns (_under0))
+	{
+		for (_idx = 0; _idx < Columns (_under2); _idx = _idx+1)
+		{
+			_underMap [_under2[_idx]] = _underMap [_under2[_idx]] + 2;
+		}
+	}
+}
+
+_font_size  = 12;
+_char_space = _font_size*1.1$1;
+_page_w	    = 612;
+_page_h     = 792;
+_atom		= 5;
+_seqCaps	= {};
+
+_seqCaps[0] = "SRC";
+_seqCaps[1] = "RCP";
+_seqCaps[2] = "HXB2";
+
+fprintf (stdout, "Name the selected sequence group:");
+fscanf  (stdin, "String", _idx);
+_seqCaps[0] = _idx;
+fprintf (stdout, "Name the other sequence group:");
+fscanf  (stdin, "String", _idx);
+_seqCaps[1] = _idx;
+
+_capOffset	= (Max(Abs(_seqCaps[0]),Max(Abs(_seqCaps[1]),Abs(_seqCaps[2])))-1)*_font_size;
+
+DEFAULT_FILE_SAVE_NAME = _baseName + ".ps";
+SetDialogPrompt 	  ("Save PostScript graphics to:");
+
+fprintf (PROMPT_FOR_FILE,CLEAR_FILE,KEEP_OPEN,_HYPSPageHeader (_page_w,_page_h,"Character Plot for "+_baseName),
+							_HYPSSetFont ("Courier",_font_size),
+							"/dmx 6 array currentmatrix def\n",
+							"/sshift fs 2 idiv fs add def\n",
+							"/setb {0 0 0 setrgbcolor} def\n",
+							"/dobox {setrgbcolor newpath 2 copy moveto 4 -1 roll exch 2 copy lineto exch 4 -1 roll 2 copy lineto 4 -1 roll exch lineto pop pop closepath} def\n",
+							"/flbx  {dobox fill setb} def\n",
+							"/stbx  {dobox stroke setb} def\n",
+							"/drln  {setrgbcolor newpath moveto lineto stroke setb} def\n",
+							"/drawletter {translate scale newpath 0 0 moveto false charpath fill dmx setmatrix translate 0.4 0.4 scale newpath sshift 0 moveto  false charpath fill dmx setmatrix} def\n"
+);
+
+outFile = LAST_FILE_PATH;
+
+_page_w		= _page_w-_capOffset;
+_selFilters		= Columns(_DATAPANEL_SELECTED_FILTERS_);
+
+
+GetDataInfo (_charHandles, _DATAPANEL_DATAFILTER_, "CHARACTERS");
+_ccount  = Columns (_charHandles);
+_unit    = {1,_ccount}["1"];
+_char_per_line  = _page_w / _char_space $ _atom * _atom;
+if (_char_per_line == 0)
+{
+	fprintf (stdout, "\nERROR: At least ",_atom," characters must fit in a line; reduce font size in 'Character Plot' source\n");
+}
+else
+{
+	fprintf (stdout, "\n", _char_per_line, " characters per line\n");
+}
+
+GetDataInfo (_dupInfo, _subset1);
+_result_cache1 = {};
+_maxD		   = 0;
+_dbyLine1 	   = {};
+
+for (_idx = 0; _idx < _subset1.sites; _idx = _idx + 1)
+{
+	_siteInfo = {_ccount, 2};
+	_cCounter = {_ccount, 1};
+	for (_sidx = 0; _sidx < _subset1.species; _sidx = _sidx + 1)
+	{
+		GetDataInfo (_thisChar, _subset1, _sidx, _dupInfo[_idx]);
+		/* don't count gaps */
+		if (Abs (_thisChar) != Sqrt (_ccount))
+		{
+			_cCounter = _cCounter + _thisChar*(1/(_unit*_thisChar)[0]);
+		}
+	}
+	_siteInfo = _siteInfo ["_MATRIX_ELEMENT_ROW_ * _MATRIX_ELEMENT_COLUMN_ + (1-_MATRIX_ELEMENT_COLUMN_)*_cCounter[_MATRIX_ELEMENT_ROW_]"]%0;
+	for (_sidx = _ccount-1; _sidx >= 0; _sidx = _sidx - 1)
+	{
+		if (_siteInfo[_sidx][0] == 0)
+		{
+			break;
+		}
+	}
+	_result_cache1[_idx] = _siteInfo[{{_sidx+1,0}}][{{_ccount-1,1}}];
+	_sidx = Rows (_result_cache1[_idx]);
+	
+	if (_sidx > _maxD)
+	{
+		_maxD = _sidx;
+	}
+
+	if ((_idx + 1)%_char_per_line==0 || _idx == _subset1.sites - 1)
+	{
+		_dbyLine1 [Abs(_dbyLine1)] = _maxD;
+		_maxD = 0;
+	}	
+}
+
+GetDataInfo (_dupInfo, _subset2);
+_result_cache2 = {};
+_maxD		   = 0;
+_dbyLine2 	   = {};
+
+for (_idx = 0; _idx < _subset2.sites; _idx = _idx + 1)
+{
+	_siteInfo = {_ccount, 2};
+	_cCounter = {_ccount, 1};
+	for (_sidx = 0; _sidx < _subset2.species; _sidx = _sidx + 1)
+	{
+		GetDataInfo (_thisChar, _subset2, _sidx, _dupInfo[_idx]);
+		/* don't count gaps */
+		if (Abs (_thisChar) != Sqrt (_ccount))
+		{
+			_cCounter = _cCounter + _thisChar*(1/(_unit*_thisChar)[0]);
+		}
+	}
+	_siteInfo = _siteInfo ["_MATRIX_ELEMENT_ROW_ * _MATRIX_ELEMENT_COLUMN_ + (1-_MATRIX_ELEMENT_COLUMN_)*_cCounter[_MATRIX_ELEMENT_ROW_]"]%0;
+	for (_sidx = _ccount-1; _sidx >= 0; _sidx = _sidx - 1)
+	{
+		if (_siteInfo[_sidx][0] == 0)
+		{
+			break;
+		}
+	}
+	_result_cache2[_idx] = _siteInfo[{{_sidx+1,0}}][{{_ccount-1,1}}];
+	_sidx = Rows (_result_cache2[_idx]);
+	
+	if ((_idx + 1)%_char_per_line==0 || _idx == _subset2.sites - 1)
+	{
+		_dbyLine2 [Abs(_dbyLine2)] = _maxD;
+		_maxD = 0;
+	}
+	
+	if (_sidx > _maxD)
+	{
+		_maxD = _sidx;
+	}
+}
+
+if (_haveReference >= 0)
+{
+	_result_ref = {};
+	GetDataInfo (_dupInfo, _DATAPANEL_DATAFILTER_);
+	for (_idx = 0; _idx < _DATAPANEL_DATAFILTER_.sites; _idx = _idx + 1)
+	{
+		_cCounter = {_ccount, 1};
+		_siteInfo = {_ccount, 2};
+		
+		GetDataInfo (_thisChar, _DATAPANEL_DATAFILTER_, _haveReference, _dupInfo[_idx]);
+		/* don't count gaps */
+		if (Abs (_thisChar) != Sqrt (_ccount))
+		{
+			_cCounter = _cCounter + _thisChar*(1/(_unit*_thisChar)[0]);
+			_siteInfo = _siteInfo ["_MATRIX_ELEMENT_ROW_ * _MATRIX_ELEMENT_COLUMN_ + (1-_MATRIX_ELEMENT_COLUMN_)*_cCounter[_MATRIX_ELEMENT_ROW_]"]%0;
+			_result_ref[_idx] = _siteInfo[Rows(_siteInfo)-1][1] + 1;
+		}
+	}
+}
+
+/* now for the plotter */
+
+_current_x 	  = _capOffset;
+_current_y	  = _page_h-(2+(_haveReference>=0))*_font_size;
+_cl			  = 0;
+_current_y2	  = _current_y - _dbyLine1 [0]*_font_size;
+
+for (_idx = 0; _idx < _DATAPANEL_DATAFILTER_.sites; _idx = _idx + 1)
+{
+	_cCounter  = _result_cache1[_idx];
+	_cCounter2 = _result_cache2[_idx];
+	
+	if (_underMap[_idx])
+	{
+		if (_underMap[_idx] != 2)
+		{
+			fprintf (outFile, _current_x, " ", _current_y-1, " ", _current_x + _char_space, " ", _current_y-1, " 0 0 0 drln\n");
+		}
+		if (_underMap[_idx] >= 2)
+		{
+			fprintf (outFile, _current_x, " ", _current_y2-1, " ", _current_x + _char_space, " ", _current_y2-1, " 0 0 0 drln\n");
+		}
+	}
+
+	if (Rows (_cCounter) == 1 && Rows (_cCounter2) == 1)
+	{
+		if (_cCounter[0][1] != _cCounter2[0][1])
+		{
+			fprintf (outFile, _current_x, " ", _current_y+_font_size-_font_size$4-1, " ", _current_x + _char_space , " ", _current_y - _dbyLine1[_cl]*_font_size - 2, " 0.2 0.2 0.2 stbx\n");
+		}
+	}
+	
+	if (Rows(_cCounter))
+	{
+		for (_sidx = Rows(_cCounter)-1; _sidx >= 0; _sidx = _sidx - 1)
+		{
+			_siteInfo = _current_y-_font_size*(Rows(_cCounter)-1-_sidx);
+			_my_c     = _charHandles[_cCounter[_sidx][1]];
+			if (Abs(_charColorList[_my_c]))
+			{
+				fprintf (outFile, _charColorList[_my_c], " setrgbcolor\n");
+			}
+			fprintf (outFile, "(",_cCounter[_sidx][0],") ", _current_x, " ",_siteInfo," (",_my_c,") 1 1 ", _current_x, " ", _siteInfo, " drawletter\n");
+			if (Abs(_charColorList[_my_c]))
+			{
+				fprintf (outFile, "setb\n");
+			}
+		}
+	}
+	else
+	{
+		fprintf (outFile, "( ) ", _current_x, " ",_current_y," (-) 1 1 ", _current_x, " ", _current_y, " drawletter\n");
+	}
+	
+	if (Rows(_cCounter2))
+	{
+		for (_sidx = Rows(_cCounter2)-1; _sidx >= 0; _sidx = _sidx - 1)
+		{
+			_siteInfo = _current_y2-_font_size*(Rows(_cCounter2)-1-_sidx);
+			_my_c     = _charHandles[_cCounter2[_sidx][1]];
+			if (Abs(_charColorList[_my_c]))
+			{
+				fprintf (outFile, _charColorList[_my_c], " setrgbcolor\n");
+			}
+			fprintf (outFile, "(",_cCounter2[_sidx][0],") ", _current_x, " ",_siteInfo," (",_my_c,") 1 1 ", _current_x, " ", _siteInfo, " drawletter\n");
+			if (Abs(_charColorList[_my_c]))
+			{
+				fprintf (outFile, "setb\n");
+			}
+		}
+	}
+	else
+	{
+		fprintf (outFile, "( ) ", _current_x, " ",_current_y2," (-) 1 1 ", _current_x, " ", _current_y2, " drawletter\n");
+	}
+	
+	
+	if (_haveReference >= 0)
+	{
+		if (_result_ref[_idx])
+		{
+			_siteInfo = _current_y+_font_size;
+			_my_c     = _charHandles[_result_ref[_idx]-1];
+			if (Abs(_charColorList[_my_c]))
+			{
+				fprintf (outFile, _charColorList[_my_c], " setrgbcolor\n");
+			}
+			fprintf (outFile, "() 0 0 (",_my_c,") 1 1 ", _current_x, " ", _siteInfo, " drawletter\n");
+			
+			if (Abs(_charColorList[_my_c]))
+			{
+				fprintf (outFile, "setb\n");
+			}
+		}
+		else
+		{
+			fprintf (outFile, "( ) 0 0 (-) 1 1 ", _current_x, " ", _current_y+_font_size, " drawletter\n");
+		}
+		
+	}
+	
+	_current_x = _current_x + _char_space;
+
+	if ((_idx + 1)%_char_per_line==0 || _idx == _DATAPANEL_DATAFILTER_.sites-1)
+	{
+		_current_y = _current_y + _font_size;
+		if (_idx == _DATAPANEL_DATAFILTER_.sites-1)
+		{
+			if (_DATAPANEL_DATAFILTER_.sites % _char_per_line == 0)
+			{
+				_startx = _char_per_line;
+			}
+			else
+			{
+				_startx = _DATAPANEL_DATAFILTER_.sites%_char_per_line$_atom*_atom;
+			}
+			_idx2 = _DATAPANEL_DATAFILTER_.sites-_DATAPANEL_DATAFILTER_.sites%_char_per_line;
+		}
+		else
+		{
+			_idx2 = _idx - _char_per_line + 1;
+			_startx = _char_per_line;
+		}
+		
+		fprintf (outFile, "0 ", _current_y - _font_size, " moveto (", _seqCaps[0], ") show\n");
+		fprintf (outFile, "0 ", _current_y2, " moveto (", _seqCaps[1], ") show\n");
+		
+		if (_haveReference >= 0)
+		{
+			fprintf (outFile, "0 ", _current_y, " moveto (", _seqCaps[2], ") show\n");
+			_current_y = _current_y + _font_size;
+		}
+		
+		fprintf (outFile, _capOffset, " ", _current_y + _font_size * 4$5, " ", _capOffset + _char_space*(1+_char_per_line) , " ", _current_y - _font_size$4, " 0.9 0.9 0.9 flbx\n");
+		for (_idx3 = _startx; _idx3 > 0; _idx3 = _idx3 - _atom)
+		{
+			fprintf (outFile, "( ) 0 0 (",_idx2+_idx3,") 0.9 0.9 ", _capOffset + (_idx3-1) * _char_space, " ", _current_y, " drawletter\n");
+		}
+
+		if (_haveReference >= 0)
+		{
+			_current_y = _current_y - _font_size;
+		}
+
+		_current_x = _capOffset; 
+		_current_y  = _current_y - (2+_dbyLine1[_cl]+_dbyLine2[_cl]+(_haveReference>=0))*_font_size;
+		_cl = _cl+1;
+		_current_y2 = _current_y - _dbyLine1 [_cl]*_font_size;
+		if (_current_y - (1+_dbyLine1[_cl]+_dbyLine2[_cl]+(_haveReference>=0))*_font_size < 0)
+		{
+			_current_y  = _page_h-(2+(_haveReference>=0))*_font_size;
+			_current_y2 = _current_y - _dbyLine1 [_cl];
+			fprintf (outFile, "showpage\n");
+		}
+	}
+}
+
+fprintf (outFile, CLOSE_FILE);
+
diff --git a/res/DatapanelAddIns/Compare Subsets b/res/DatapanelAddIns/Compare Subsets
new file mode 100644
index 0000000..981db29
--- /dev/null
+++ b/res/DatapanelAddIns/Compare Subsets	
@@ -0,0 +1,141 @@
+RequireVersion ("0.9920060426");
+
+_idx = "`HYPHY_LIB_DIRECTORY`TemplateBatchFiles`DIRECTORY_SEPARATOR`Utility`DIRECTORY_SEPARATOR`GrabBag.bf";
+ExecuteCommands ("#include\"`_idx`\";");
+
+_seqCount 		= Columns(_DATAPANEL_SELECTED_SEQUENCES_);
+_selFilters		= Columns(_DATAPANEL_SELECTED_FILTERS_);
+
+if (_seqCount == 0 || _selFilters > 1 || _seqCount == _DATAPANEL_DATAFILTER_.species)
+{
+	fprintf (stdout, "ERROR: This plug in-needs one selected data filter and some (but not all) selected sequences\n");
+	return 0;
+}
+
+if (_selFilters == 1)
+{
+	_baseName = _DATAPANEL_SELECTED_FILTERS_[0];
+}
+else
+{
+	_baseName = _DATAPANEL_DATASET_NAME_;
+}
+
+_sequenceMapping = {};
+
+for (_idx = 0; _idx < _seqCount; _idx = _idx + 1)
+{
+	_sequenceMapping[_DATAPANEL_SELECTED_SEQUENCES_[_idx]] = 1;
+}
+
+_unitSize 	= _DATAPANEL_UNIT_SIZE_[0];
+_exclusions = _DATAPANEL_EXCLUSIONS_[0];
+
+DataSetFilter _subset1 = CreateFilter (_DATAPANEL_DATAFILTER_,_unitSize,"",_sequenceMapping[speciesIndex] == 1,_exclusions);
+DataSetFilter _subset2 = CreateFilter (_DATAPANEL_DATAFILTER_,_unitSize,"",_sequenceMapping[speciesIndex] == 0,_exclusions);
+_svl = VERBOSITY_LEVEL;
+VERBOSITY_LEVEL = -1;
+
+_siteTypes = {};
+
+_siteTypes["Fixed and same in both subsets"] = {};
+_siteTypes["Fixed and different in both subsets"] = {};
+_siteTypes["Fixed in selected sequences only"] = {};
+_siteTypes["Fixed in excluded sequences only"] = {};
+_siteTypes["Polymorphic in both subsets"] = {};
+
+for (_idx = 0; _idx < _DATAPANEL_DATAFILTER_.sites; _idx = _idx + 1)
+{
+	if (_unitSize > 1)
+	{
+		_siteSpec = Format (_idx*_unitSize,20,0) + "-" + Format ((1+_idx)*_unitSize-1,20,0)
+	}
+	else
+	{
+		_siteSpec = Format (_idx,20,0);
+	}
+	DataSetFilter _aSite = CreateFilter (_subset1, _unitSize, _siteSpec,"",_exclusions);
+	HarvestFrequencies     (_freqs1, _aSite, _unitSize, _unitSize, 0);
+	DataSetFilter _aSite = CreateFilter (_subset2, _unitSize, _siteSpec,"",_exclusions);
+	HarvestFrequencies     (_freqs2, _aSite, _unitSize, _unitSize, 0);
+	
+	_f = Abs (_freqs1-_freqs2);
+	if (_f == Sqrt(2))
+	{
+		(_siteTypes["Fixed and different in both subsets"])[Abs(_siteTypes["Fixed and different in both subsets"])] = _idx;
+	}
+	else
+	{
+		if (_f == 0)
+		{
+			(_siteTypes["Fixed and same in both subsets"])[Abs(_siteTypes["Fixed and same in both subsets"])] = _idx;
+		}
+		else
+		{
+			if (Abs (_freqs1) == 1)
+			{
+				(_siteTypes["Fixed in selected sequences only"])[Abs(_siteTypes["Fixed in selected sequences only"])] = _idx;
+		
+			}
+			else
+			{
+				if (Abs(_freqs2) == 1)
+				{
+					(_siteTypes["Fixed in excluded sequences only"])[Abs(_siteTypes["Fixed in excluded sequences only"])] = _idx;
+				}
+				else
+				{
+					(_siteTypes["Polymorphic in both subsets"])[Abs(_siteTypes["Polymorphic in both subsets"])] = _idx;
+				}
+			}
+		}
+	}
+}
+
+VERBOSITY_LEVEL = _svl;
+_countMatrix	= Abs (_siteTypes); 
+_idx			= avlToLabels (_siteTypes,"Kind",";");
+_labels			= {{"Count","`_idx`"}};
+_types			= Rows (_siteTypes);
+_plotMx			= {Columns(_types),1};
+
+_DATAPANEL_RETURNED_FILTERS_ = {};
+
+for (_idx = 0; _idx < Columns (_types); _idx = _idx + 1)
+{
+	_plotMx [_idx] = Abs(_siteTypes[_types[_idx]]);
+	
+	_f = {};
+	_f ["SITES"] = avlToRow (_siteTypes[_types[_idx]],_DATAPANEL_DATAFILTER_.site_map,_unitSize);
+	if (Columns(_f["SITES"]))
+	{
+		_DATAPANEL_RETURNED_FILTERS_ [_baseName+_types[_idx]] = _f;
+	}
+	/*_f = avlToString (_siteTypes[_types[_idx]],",");
+	fprintf (stdout, "\n", _types[_idx], "\n", _f ,"\n");*/
+}
+
+OpenWindow (CHARTWINDOW,{{"Site type comparison"}
+		{"_labels"}
+		{"_plotMx"}
+		{"Pie Chart"}
+		{"Count"}
+		{"Count"}
+		{""}
+		{""}
+		{""}
+		{"1"}
+		{""}
+		{"-1;-1"}
+		{"10;1.309;0.785398"}
+		{"Times:12:0;Times:10:0;Times:12:2"}
+		{"0;0;13816530;16777215;0;0;6579300;11842740;13158600;14474460;0;3947580;16777215;15670812;6845928;16771158;2984993;9199669;7018159;1460610;16748822;11184810;14173291"}
+		{"16,0,0"}
+		},
+		"700;700;50;50");
+
+
+
+
+
+
diff --git a/res/DatapanelAddIns/Sequence Plot b/res/DatapanelAddIns/Sequence Plot
new file mode 100644
index 0000000..69a2e10
--- /dev/null
+++ b/res/DatapanelAddIns/Sequence Plot	
@@ -0,0 +1,194 @@
+RequireVersion ("0.9920060502");
+
+
+ChoiceList (_idx, "Colors", 1, SKIP_NONE, "Default Colors", "Use the default (20 character) amino-acid palette","Black", "All characters are black");
+
+if (_idx<0)
+{
+	return 0;
+}
+
+_charColorList = {};
+if (_idx == 0)
+{
+	ExecuteCommands ("#include \"ibfs/char_colors.def\";");
+}
+
+_idx = "`HYPHY_LIB_DIRECTORY`TemplateBatchFiles`DIRECTORY_SEPARATOR`Utility`DIRECTORY_SEPARATOR`GrabBag.bf";
+ExecuteCommands ("#include\"`_idx`\";");
+_idx = "`HYPHY_LIB_DIRECTORY`TemplateBatchFiles`DIRECTORY_SEPARATOR`Utility`DIRECTORY_SEPARATOR`PostScript.bf";
+ExecuteCommands ("#include\"`_idx`\";");
+
+_seqCount 		= Columns(_DATAPANEL_SELECTED_SEQUENCES_);
+_selFilters		= Columns(_DATAPANEL_SELECTED_FILTERS_);
+
+if (_selFilters > 1)
+{
+	fprintf (stdout, "ERROR: This plug in-needs none or one selected data filter\n");
+	return 0;
+}
+
+_unitSize 	   = _DATAPANEL_UNIT_SIZE_[0];
+
+if (_unitSize!=1)
+{
+	fprintf (stdout, "ERROR: This plug can only accept filters with unit size of one\n");
+	return 0;
+}
+
+if (_selFilters)
+{
+	_baseName = _DATAPANEL_SELECTED_FILTERS_[0];
+}
+else
+{
+	_baseName = _DATAPANEL_DATASET_NAME_;
+}
+
+_sequenceMapping = {};
+_haveReference = -1;
+
+_exclusions    = _DATAPANEL_EXCLUSIONS_[0];
+
+
+_font_size  = 8;
+_char_space = _font_size;
+_page_w	    = 792;
+_page_h     = 612;
+_atom		= 5;
+_seqCaps	= {};
+
+_idx2		= 0;
+
+for (_idx = 0; _idx < _DATAPANEL_DATAFILTER_.species; _idx = _idx+1)
+{
+	GetString (_capOffset, _DATAPANEL_DATAFILTER_, _idx);
+	_idx2 = Max (_idx2, Abs(_capOffset));
+	_seqCaps [_idx] = _capOffset;
+}
+
+
+_capOffset	= (_idx2)*_font_size*0.8$1;
+
+DEFAULT_FILE_SAVE_NAME = _baseName + ".ps";
+SetDialogPrompt 	  ("Save PostScript graphics to:");
+
+fprintf (PROMPT_FOR_FILE,CLEAR_FILE,KEEP_OPEN,_HYPSPageHeader (_page_w,_page_h,"Character Plot for "+_baseName),
+							_HYPSSetFont ("Courier",_font_size),
+							"/dmx 6 array currentmatrix def\n",
+							"/sshift fs 2 idiv fs add def\n",
+							"/setb {0 0 0 setrgbcolor} def\n",
+							"/dobox {setrgbcolor newpath 2 copy moveto 4 -1 roll exch 2 copy lineto exch 4 -1 roll 2 copy lineto 4 -1 roll exch lineto pop pop closepath} def\n",
+							"/flbx  {dobox fill setb} def\n",
+							"/stbx  {dobox stroke setb} def\n",
+							"/drln  {setrgbcolor newpath moveto lineto stroke setb} def\n",
+							"/drawletter {translate scale newpath 0 0 moveto false charpath fill dmx setmatrix} def\n"
+);
+
+outFile = LAST_FILE_PATH;
+
+_page_w		= _page_w-_capOffset;
+_selFilters		= Columns(_DATAPANEL_SELECTED_FILTERS_);
+
+
+GetDataInfo (_charHandles, _DATAPANEL_DATAFILTER_, "CHARACTERS");
+_ccount  = Columns (_charHandles);
+_unit    = {1,_ccount}["1"];
+_char_per_line  = _page_w / _char_space $ _atom * _atom;
+if (_char_per_line == 0)
+{
+	fprintf (stdout, "\nERROR: At least ",_atom," characters must fit in a line; reduce font size in 'Sequence Plot' source\n");
+}
+else
+{
+	fprintf (stdout, "\n", _char_per_line, " characters per line\n");
+}
+
+_current_x 	  = _capOffset;
+_xtra_spacing = _font_size$2 + 1;
+_current_y	  = _page_h-(1+_DATAPANEL_DATAFILTER_.species)*_font_size-_xtra_spacing;
+
+GetInformation (_rawStrings, _DATAPANEL_DATAFILTER_);
+
+for (_idx = 0; _idx < _DATAPANEL_DATAFILTER_.sites; _idx = _idx + 1)
+{
+
+	/*if (Rows (_cCounter) == 1 && Rows (_cCounter2) == 1)
+	{
+		if (_cCounter[0][1] != _cCounter2[0][1])
+		{
+			fprintf (outFile, _current_x, " ", _current_y+_font_size-_font_size$4-1, " ", _current_x + _char_space , " ", _current_y - _dbyLine1[_cl]*_font_size - 2, " 0.2 0.2 0.2 stbx\n");
+		}
+	}*/
+	
+	_ref_c = (_rawStrings[0])[_idx];
+	
+	for (_sidx = _DATAPANEL_DATAFILTER_.species-1; _sidx >= 0; _sidx = _sidx - 1)
+	{
+		_my_c     = (_rawStrings[_sidx])[_idx];
+		if (_sidx && _my_c == _ref_c)
+		{
+			_my_c = ".";
+		}
+		if (Abs(_charColorList[_my_c]))
+		{
+			fprintf (outFile, _charColorList[_my_c], " setrgbcolor\n");
+		}
+		fprintf (outFile, "(",_my_c,") 1 1 ", _current_x, " ", _current_y+_font_size*(_DATAPANEL_DATAFILTER_.species-1-_sidx), " drawletter\n");
+		
+		if (Abs(_charColorList[_my_c]))
+		{
+			fprintf (outFile, "setb\n");
+		}
+	}
+	
+	_current_x = _current_x + _char_space;
+
+	if ((_idx + 1)%_char_per_line==0 || _idx == _DATAPANEL_DATAFILTER_.sites-1)
+	{
+		for (_sidx = _DATAPANEL_DATAFILTER_.species-1; _sidx >= 0; _sidx = _sidx - 1)
+		{
+			fprintf (outFile, "0 ", _current_y+_font_size*(_DATAPANEL_DATAFILTER_.species-1-_sidx), " moveto (",_seqCaps[_sidx],") show\n");
+		}
+
+		_current_y = _current_y + _DATAPANEL_DATAFILTER_.species*_font_size;
+		if (_idx == _DATAPANEL_DATAFILTER_.sites-1)
+		{
+			if (_DATAPANEL_DATAFILTER_.sites % _char_per_line == 0)
+			{
+				_startx = _char_per_line;
+			}
+			else
+			{
+				_startx = _DATAPANEL_DATAFILTER_.sites%_char_per_line$_atom*_atom;
+			}
+			_idx2 = _DATAPANEL_DATAFILTER_.sites-_DATAPANEL_DATAFILTER_.sites%_char_per_line;
+		}
+		else
+		{
+			_idx2 = _idx - _char_per_line + 1;
+			_startx = _char_per_line;
+		}
+		
+		/*fprintf (outFile, "0 ", _current_y - _font_size, " moveto (", _seqCaps[0], ") show\n");
+		fprintf (outFile, "0 ", _current_y2, " moveto (", _seqCaps[1], ") show\n");*/
+				
+		fprintf (outFile, _capOffset, " ", _current_y + _font_size * 4$5, " ", _capOffset + _char_space*(1+_char_per_line) , " ", _current_y - _font_size$4, " 0.9 0.9 0.9 flbx\n");
+		for (_idx3 = _startx; _idx3 > 0; _idx3 = _idx3 - _atom)
+		{
+			fprintf (outFile, "(",_idx2+_idx3,") 0.9 0.9 ", _capOffset + (_idx3-1) * _char_space, " ", _current_y, " drawletter\n");
+		}
+
+		_current_x = _capOffset; 
+		_current_y  = _current_y - (1+2*_DATAPANEL_DATAFILTER_.species)*_font_size - _xtra_spacing;
+		_cl = _cl+1;
+		if (_current_y < 0)
+		{
+			_current_y	  = _page_h-(1+_DATAPANEL_DATAFILTER_.species)*_font_size - _xtra_spacing;
+			fprintf (outFile, "showpage\n");
+		}
+	}
+}
+
+fprintf (outFile, CLOSE_FILE);
+
diff --git a/res/DatapanelAddIns/TBD/Character Plot By Sequence b/res/DatapanelAddIns/TBD/Character Plot By Sequence
new file mode 100644
index 0000000..83bd2aa
--- /dev/null
+++ b/res/DatapanelAddIns/TBD/Character Plot By Sequence	
@@ -0,0 +1,382 @@
+RequireVersion ("0.9920060502");
+
+#include "ibfs/char_colors.def";
+
+_idx = "`HYPHY_LIB_DIRECTORY`TemplateBatchFiles`DIRECTORY_SEPARATOR`Utility`DIRECTORY_SEPARATOR`GrabBag.bf";
+ExecuteCommands ("#include\"`_idx`\";");
+_idx = "`HYPHY_LIB_DIRECTORY`TemplateBatchFiles`DIRECTORY_SEPARATOR`Utility`DIRECTORY_SEPARATOR`PostScript.bf";
+ExecuteCommands ("#include\"`_idx`\";");
+
+_seqCount 		= Columns(_DATAPANEL_SELECTED_SEQUENCES_);
+_selFilters		= Columns(_DATAPANEL_SELECTED_FILTERS_);
+
+if (_seqCount != 1)
+{
+	fprintf (stdout, "ERROR: This plug in-needs a single selected sequence to use as reference\n");
+	return 0;
+}
+
+_unitSize 	   = _DATAPANEL_UNIT_SIZE_[0];
+
+if (_unitSize!=1)
+{
+	fprintf (stdout, "ERROR: This plug-in can only accept filters with unit size of one\n");
+	return 0;
+}
+
+_seqCount = _DATAPANEL_SELECTED_SEQUENCES_[0];
+_baseName = _DATAPANEL_DATASET_NAME_;
+
+_sequenceMapping = {};
+_haveReference = -1;
+
+for (_idx = 0; _idx < _seqCount; _idx = _idx + 1)
+{
+	_sequenceMapping[_DATAPANEL_SELECTED_SEQUENCES_[_idx]] = 1;
+}
+
+for (_idx = 0; _idx < _DATAPANEL_DATAFILTER_.species; _idx = _idx + 1)
+{
+	GetString (_sidx, _DATAPANEL_DATAFILTER_, _idx);
+	if (_sidx % "Reference")
+	{
+		_haveReference = _idx;
+	}
+}
+_exclusions    = _DATAPANEL_EXCLUSIONS_[0];
+
+
+DataSetFilter _subset1 = CreateFilter (_DATAPANEL_DATAFILTER_,_unitSize,"",_sequenceMapping[speciesIndex] == 1 && speciesIndex != _haveReference,_exclusions);
+DataSetFilter _subset2 = CreateFilter (_DATAPANEL_DATAFILTER_,_unitSize,"",_sequenceMapping[speciesIndex] == 0 && speciesIndex != _haveReference,_exclusions);
+
+_underMap = {};
+if (_selFilters == 3)
+{
+	ExecuteCommands ("GetDataInfo (_under1,"+_DATAPANEL_SELECTED_FILTERS_[1]+",0);GetDataInfo (_under2,"+_DATAPANEL_SELECTED_FILTERS_[2]+",0);");
+	for (_idx = 0; _idx < Columns (_under1); _idx = _idx+1)
+	{
+		_underMap [_under1[_idx]] = 1;
+	}
+	for (_idx = 0; _idx < Columns (_under2); _idx = _idx+1)
+	{
+		_underMap [_under2[_idx]] = _underMap [_under2[_idx]] + 2;
+	}
+}
+
+_font_size  = 12;
+_char_space = _font_size*1.1$1;
+_page_w	    = 612;
+_page_h     = 792;
+_atom		= 5;
+_seqCaps	= {};
+
+_seqCaps[0] = "SRC";
+_seqCaps[1] = "RCP";
+_seqCaps[2] = "HXB2";
+
+fprintf (stdout, "Name the selected sequence group:");
+fscanf  (stdin, "String", _idx);
+_seqCaps[0] = _idx;
+fprintf (stdout, "Name the other sequence group:");
+fscanf  (stdin, "String", _idx);
+_seqCaps[1] = _idx;
+
+_capOffset	= (Max(Abs(_seqCaps[0]),Max(Abs(_seqCaps[1]),Abs(_seqCaps[2])))-1)*_font_size;
+
+DEFAULT_FILE_SAVE_NAME = _baseName + ".ps";
+SetDialogPrompt 	  ("Save PostScript graphics to:");
+
+fprintf (PROMPT_FOR_FILE,CLEAR_FILE,_HYPSPageHeader (_page_w,_page_h,"Character Plot for "+_baseName),
+							_HYPSSetFont ("Courier",_font_size),
+							"/dmx 6 array currentmatrix def\n",
+							"/sshift fs 2 idiv fs add def\n",
+							"/setb {0 0 0 setrgbcolor} def\n",
+							"/dobox {setrgbcolor newpath 2 copy moveto 4 -1 roll exch 2 copy lineto exch 4 -1 roll 2 copy lineto 4 -1 roll exch lineto pop pop closepath} def\n",
+							"/flbx  {dobox fill setb} def\n",
+							"/stbx  {dobox stroke setb} def\n",
+							"/drln  {setrgbcolor newpath moveto lineto stroke setb} def\n",
+							"/drawletter {translate scale newpath 0 0 moveto false charpath fill dmx setmatrix translate 0.4 0.4 scale newpath sshift 0 moveto  false charpath fill dmx setmatrix} def\n"
+);
+
+outFile = LAST_FILE_PATH;
+
+_page_w		= _page_w-_capOffset;
+_selFilters		= Columns(_DATAPANEL_SELECTED_FILTERS_);
+
+
+GetDataInfo (_charHandles, _DATAPANEL_DATAFILTER_, "CHARACTERS");
+_ccount  = Columns (_charHandles);
+_unit    = {1,_ccount}["1"];
+_char_per_line  = _page_w / _char_space $ _atom * _atom;
+if (_char_per_line == 0)
+{
+	fprintf (stdout, "\nERROR: At least ",_atom," characters must fit in a line; reduce font size in 'Character Plot' source\n");
+}
+else
+{
+	fprintf (stdout, "\n", _char_per_line, " characters per line\n");
+}
+
+GetDataInfo (_dupInfo, _subset1);
+_result_cache1 = {};
+_maxD		   = 0;
+_dbyLine1 	   = {};
+
+for (_idx = 0; _idx < _subset1.sites; _idx = _idx + 1)
+{
+	_siteInfo = {_ccount, 2};
+	_cCounter = {_ccount, 1};
+	for (_sidx = 0; _sidx < _subset1.species; _sidx = _sidx + 1)
+	{
+		GetDataInfo (_thisChar, _subset1, _sidx, _dupInfo[_idx]);
+		/* don't count gaps */
+		if (Abs (_thisChar) != Sqrt (_ccount))
+		{
+			_cCounter = _cCounter + _thisChar*(1/(_unit*_thisChar)[0]);
+		}
+	}
+	_siteInfo = _siteInfo ["_MATRIX_ELEMENT_ROW_ * _MATRIX_ELEMENT_COLUMN_ + (1-_MATRIX_ELEMENT_COLUMN_)*_cCounter[_MATRIX_ELEMENT_ROW_]"]%0;
+	for (_sidx = _ccount-1; _sidx >= 0; _sidx = _sidx - 1)
+	{
+		if (_siteInfo[_sidx][0] == 0)
+		{
+			break;
+		}
+	}
+	_result_cache1[_idx] = _siteInfo[{{_sidx+1,0}}][{{_ccount-1,1}}];
+	_sidx = Rows (_result_cache1[_idx]);
+	
+	if (_sidx > _maxD)
+	{
+		_maxD = _sidx;
+	}
+
+	if ((_idx + 1)%_char_per_line==0 || _idx == _subset1.sites - 1)
+	{
+		_dbyLine1 [Abs(_dbyLine1)] = _maxD;
+		_maxD = 0;
+	}	
+}
+
+GetDataInfo (_dupInfo, _subset2);
+_result_cache2 = {};
+_maxD		   = 0;
+_dbyLine2 	   = {};
+
+for (_idx = 0; _idx < _subset2.sites; _idx = _idx + 1)
+{
+	_siteInfo = {_ccount, 2};
+	_cCounter = {_ccount, 1};
+	for (_sidx = 0; _sidx < _subset2.species; _sidx = _sidx + 1)
+	{
+		GetDataInfo (_thisChar, _subset2, _sidx, _dupInfo[_idx]);
+		/* don't count gaps */
+		if (Abs (_thisChar) != Sqrt (_ccount))
+		{
+			_cCounter = _cCounter + _thisChar*(1/(_unit*_thisChar)[0]);
+		}
+	}
+	_siteInfo = _siteInfo ["_MATRIX_ELEMENT_ROW_ * _MATRIX_ELEMENT_COLUMN_ + (1-_MATRIX_ELEMENT_COLUMN_)*_cCounter[_MATRIX_ELEMENT_ROW_]"]%0;
+	for (_sidx = _ccount-1; _sidx >= 0; _sidx = _sidx - 1)
+	{
+		if (_siteInfo[_sidx][0] == 0)
+		{
+			break;
+		}
+	}
+	_result_cache2[_idx] = _siteInfo[{{_sidx+1,0}}][{{_ccount-1,1}}];
+	_sidx = Rows (_result_cache2[_idx]);
+	
+	if ((_idx + 1)%_char_per_line==0 || _idx == _subset2.sites - 1)
+	{
+		_dbyLine2 [Abs(_dbyLine2)] = _maxD;
+		_maxD = 0;
+	}
+	
+	if (_sidx > _maxD)
+	{
+		_maxD = _sidx;
+	}
+}
+
+if (_haveReference >= 0)
+{
+	_result_ref = {};
+	GetDataInfo (_dupInfo, _DATAPANEL_DATAFILTER_);
+	for (_idx = 0; _idx < _DATAPANEL_DATAFILTER_.sites; _idx = _idx + 1)
+	{
+		_cCounter = {_ccount, 1};
+		_siteInfo = {_ccount, 2};
+		
+		GetDataInfo (_thisChar, _DATAPANEL_DATAFILTER_, _haveReference, _dupInfo[_idx]);
+		/* don't count gaps */
+		if (Abs (_thisChar) != Sqrt (_ccount))
+		{
+			_cCounter = _cCounter + _thisChar*(1/(_unit*_thisChar)[0]);
+			_siteInfo = _siteInfo ["_MATRIX_ELEMENT_ROW_ * _MATRIX_ELEMENT_COLUMN_ + (1-_MATRIX_ELEMENT_COLUMN_)*_cCounter[_MATRIX_ELEMENT_ROW_]"]%0;
+			_result_ref[_idx] = _siteInfo[Rows(_siteInfo)-1][1] + 1;
+		}
+	}
+}
+
+/* now for the plotter */
+
+_current_x 	  = _capOffset;
+_current_y	  = _page_h-(2+(_haveReference>=0))*_font_size;
+_cl			  = 0;
+_current_y2	  = _current_y - _dbyLine1 [0]*_font_size;
+
+for (_idx = 0; _idx < _DATAPANEL_DATAFILTER_.sites; _idx = _idx + 1)
+{
+	_cCounter  = _result_cache1[_idx];
+	_cCounter2 = _result_cache2[_idx];
+	
+	if (_underMap[_idx])
+	{
+		if (_underMap[_idx] != 2)
+		{
+			fprintf (outFile, _current_x, " ", _current_y-1, " ", _current_x + _char_space, " ", _current_y-1, " 0 0 0 drln\n");
+		}
+		if (_underMap[_idx] >= 2)
+		{
+			fprintf (outFile, _current_x, " ", _current_y2-1, " ", _current_x + _char_space, " ", _current_y2-1, " 0 0 0 drln\n");
+		}
+	}
+
+	if (Rows (_cCounter) == 1 && Rows (_cCounter2) == 1)
+	{
+		if (_cCounter[0][1] != _cCounter2[0][1])
+		{
+			fprintf (outFile, _current_x, " ", _current_y+_font_size-_font_size$4-1, " ", _current_x + _char_space , " ", _current_y - _dbyLine1[_cl]*_font_size - 2, " 0.2 0.2 0.2 stbx\n");
+		}
+	}
+	
+	if (Rows(_cCounter))
+	{
+		for (_sidx = Rows(_cCounter)-1; _sidx >= 0; _sidx = _sidx - 1)
+		{
+			_siteInfo = _current_y-_font_size*(Rows(_cCounter)-1-_sidx);
+			_my_c     = _charHandles[_cCounter[_sidx][1]];
+			if (Abs(_charColorList[_my_c]))
+			{
+				fprintf (outFile, _charColorList[_my_c], " setrgbcolor\n");
+			}
+			fprintf (outFile, "(",_cCounter[_sidx][0],") ", _current_x, " ",_siteInfo," (",_my_c,") 1 1 ", _current_x, " ", _siteInfo, " drawletter\n");
+			if (Abs(_charColorList[_my_c]))
+			{
+				fprintf (outFile, "setb\n");
+			}
+		}
+	}
+	else
+	{
+		fprintf (outFile, "( ) ", _current_x, " ",_current_y," (-) 1 1 ", _current_x, " ", _current_y, " drawletter\n");
+	}
+	
+	if (Rows(_cCounter2))
+	{
+		for (_sidx = Rows(_cCounter2)-1; _sidx >= 0; _sidx = _sidx - 1)
+		{
+			_siteInfo = _current_y2-_font_size*(Rows(_cCounter2)-1-_sidx);
+			_my_c     = _charHandles[_cCounter2[_sidx][1]];
+			if (Abs(_charColorList[_my_c]))
+			{
+				fprintf (outFile, _charColorList[_my_c], " setrgbcolor\n");
+			}
+			fprintf (outFile, "(",_cCounter2[_sidx][0],") ", _current_x, " ",_siteInfo," (",_my_c,") 1 1 ", _current_x, " ", _siteInfo, " drawletter\n");
+			if (Abs(_charColorList[_my_c]))
+			{
+				fprintf (outFile, "setb\n");
+			}
+		}
+	}
+	else
+	{
+		fprintf (outFile, "( ) ", _current_x, " ",_current_y2," (-) 1 1 ", _current_x, " ", _current_y2, " drawletter\n");
+	}
+	
+	
+	if (_haveReference >= 0)
+	{
+		if (_result_ref[_idx])
+		{
+			_siteInfo = _current_y+_font_size;
+			_my_c     = _charHandles[_result_ref[_idx]-1];
+			if (Abs(_charColorList[_my_c]))
+			{
+				fprintf (outFile, _charColorList[_my_c], " setrgbcolor\n");
+			}
+			fprintf (outFile, "() 0 0 (",_my_c,") 1 1 ", _current_x, " ", _siteInfo, " drawletter\n");
+			
+			if (Abs(_charColorList[_my_c]))
+			{
+				fprintf (outFile, "setb\n");
+			}
+		}
+		else
+		{
+			fprintf (outFile, "( ) 0 0 (-) 1 1 ", _current_x, " ", _current_y+_font_size, " drawletter\n");
+		}
+		
+	}
+	
+	_current_x = _current_x + _char_space;
+
+	if ((_idx + 1)%_char_per_line==0 || _idx == _DATAPANEL_DATAFILTER_.sites-1)
+	{
+		_current_y = _current_y + _font_size;
+		if (_idx == _DATAPANEL_DATAFILTER_.sites-1)
+		{
+			if (_DATAPANEL_DATAFILTER_.sites % _char_per_line == 0)
+			{
+				_startx = _char_per_line;
+			}
+			else
+			{
+				_startx = _DATAPANEL_DATAFILTER_.sites%_char_per_line$_atom*_atom;
+			}
+			_idx2 = _DATAPANEL_DATAFILTER_.sites-_DATAPANEL_DATAFILTER_.sites%_char_per_line;
+		}
+		else
+		{
+			_idx2 = _idx - _char_per_line + 1;
+			_startx = _char_per_line;
+		}
+		
+		fprintf (outFile, "0 ", _current_y - _font_size, " moveto (", _seqCaps[0], ") show\n");
+		fprintf (outFile, "0 ", _current_y2, " moveto (", _seqCaps[1], ") show\n");
+		
+		if (_haveReference >= 0)
+		{
+			fprintf (outFile, "0 ", _current_y, " moveto (", _seqCaps[2], ") show\n");
+			_current_y = _current_y + _font_size;
+		}
+		
+		fprintf (outFile, _capOffset, " ", _current_y + _font_size * 4$5, " ", _capOffset + _char_space*(1+_char_per_line) , " ", _current_y - _font_size$4, " 0.9 0.9 0.9 flbx\n");
+		for (_idx3 = _startx; _idx3 > 0; _idx3 = _idx3 - _atom)
+		{
+			fprintf (outFile, "( ) 0 0 (",_idx2+_idx3,") 0.9 0.9 ", _capOffset + (_idx3-1) * _char_space, " ", _current_y, " drawletter\n");
+		}
+
+		if (_haveReference >= 0)
+		{
+			_current_y = _current_y - _font_size;
+		}
+
+		_current_x = _capOffset; 
+		_current_y  = _current_y - (2+_dbyLine1[_cl]+_dbyLine2[_cl]+(_haveReference>=0))*_font_size;
+		_cl = _cl+1;
+		_current_y2 = _current_y - _dbyLine1 [_cl]*_font_size;
+		if (_current_y - (1+_dbyLine1[_cl]+_dbyLine2[_cl]+(_haveReference>=0))*_font_size < 0)
+		{
+			_current_y  = _page_h-(2+(_haveReference>=0))*_font_size;
+			_current_y2 = _current_y - _dbyLine1 [_cl];
+			fprintf (outFile, "showpage\n");
+		}
+	}
+}
+
+/*
+fprintf (outFile, CLOSE_FILE);
+*/
+
diff --git a/res/DatapanelAddIns/ibfs/char_colors.def b/res/DatapanelAddIns/ibfs/char_colors.def
new file mode 100644
index 0000000..4c7841d
--- /dev/null
+++ b/res/DatapanelAddIns/ibfs/char_colors.def
@@ -0,0 +1,28 @@
+_charColorList = {};
+_charColorList["A"] = {{102,51,51}}*(1/255);
+_charColorList["C"] = {{153,204,153}}*(1/255);
+_charColorList["D"] = {{102,0,153}}*(1/255);
+_charColorList["E"] = {{153,0,153}}*(1/255);
+_charColorList["F"] = {{255,51,51}}*(1/255);
+_charColorList["G"] = {{102,0,153}}*(1/255);
+_charColorList["H"] = {{255,204,0}}*(1/255);
+_charColorList["I"] = {{153,255,153}}*(1/255);
+_charColorList["K"] = {{102,153,51}}*(1/255);
+_charColorList["L"] = {{102,204,102}}*(1/255);
+_charColorList["M"] = {{0,51,153}}*(1/255);
+_charColorList["N"] = {{255,102,0}}*(1/255);
+_charColorList["P"] = {{153,153,51}}*(1/255);
+_charColorList["Q"] = {{255,153,0}}*(1/255);
+_charColorList["R"] = {{153,51,102}}*(1/255);
+_charColorList["S"] = {{153,153,153}}*(1/255);
+_charColorList["T"] = {{102,102,153}}*(1/255);
+_charColorList["V"] = {{153,51,51}}*(1/255);
+_charColorList["W"] = {{204,51,51}}*(1/255);
+_charColorList["Y"] = {{102,153,102}}*(1/255);
+
+_font_size = Rows (_charColorList);
+for (_idx = 0; _idx < Abs(_charColorList); _idx = _idx + 1)
+{
+	_sidx = _charColorList[_font_size[_idx]];
+	_charColorList[_font_size[_idx]] = ""+_sidx[0]+" "+_sidx[1]+" "+_sidx[2];
+}
diff --git a/res/GeneticCodes/Alt_Yeast_Nuclear.cod b/res/GeneticCodes/Alt_Yeast_Nuclear.cod
new file mode 100644
index 0000000..53f2403
--- /dev/null
+++ b/res/GeneticCodes/Alt_Yeast_Nuclear.cod
@@ -0,0 +1,67 @@
+1;
+Alt_Yeast_Nuclear;
+The Alternative Yeast Nuclear Code (transl_table=12);
+14 /*AAA*/,
+13 /*AAC*/,
+14 /*AAG*/,
+13 /*AAT*/,
+7 /*ACA*/,
+7 /*ACC*/,
+7 /*ACG*/,
+7 /*ACT*/,
+19 /*AGA*/,
+5 /*AGC*/,
+19 /*AGG*/,
+5 /*AGT*/,
+2 /*ATA*/,
+2 /*ATC*/,
+3 /*ATG*/,
+2 /*ATT*/,
+12 /*CAA*/,
+11 /*CAC*/,
+12 /*CAG*/,
+11 /*CAT*/,
+6 /*CCA*/,
+6 /*CCC*/,
+6 /*CCG*/,
+6 /*CCT*/,
+19 /*CGA*/,
+19 /*CGC*/,
+19 /*CGG*/,
+19 /*CGT*/,
+1 /*CTA*/,
+1 /*CTC*/,
+5 /*CTG*/,
+1 /*CTT*/,
+16 /*GAA*/,
+15 /*GAC*/,
+16 /*GAG*/,
+15 /*GAT*/,
+8 /*GCA*/,
+8 /*GCC*/,
+8 /*GCG*/,
+8 /*GCT*/,
+20 /*GGA*/,
+20 /*GGC*/,
+20 /*GGG*/,
+20 /*GGT*/,
+4 /*GTA*/,
+4 /*GTC*/,
+4 /*GTG*/,
+4 /*GTT*/,
+10 /*TAA*/,
+9 /*TAC*/,
+10 /*TAG*/,
+9 /*TAT*/,
+5 /*TCA*/,
+5 /*TCC*/,
+5 /*TCG*/,
+5 /*TCT*/,
+10 /*TGA*/,
+17 /*TGC*/,
+18 /*TGG*/,
+17 /*TGT*/,
+1 /*TTA*/,
+0 /*TTC*/,
+1 /*TTG*/,
+0 /*TTT*/;
diff --git a/res/GeneticCodes/Ascidian_mtDNA.cod b/res/GeneticCodes/Ascidian_mtDNA.cod
new file mode 100644
index 0000000..68b3262
--- /dev/null
+++ b/res/GeneticCodes/Ascidian_mtDNA.cod
@@ -0,0 +1,67 @@
+2;
+Ascidian_mtDNA;
+The Ascidian Mitochondrial Code (transl_table=13);
+14 /*AAA*/,
+13 /*AAC*/,
+14 /*AAG*/,
+13 /*AAT*/,
+7 /*ACA*/,
+7 /*ACC*/,
+7 /*ACG*/,
+7 /*ACT*/,
+20 /*AGA*/,
+5 /*AGC*/,
+20 /*AGG*/,
+5 /*AGT*/,
+3 /*ATA*/,
+2 /*ATC*/,
+3 /*ATG*/,
+2 /*ATT*/,
+12 /*CAA*/,
+11 /*CAC*/,
+12 /*CAG*/,
+11 /*CAT*/,
+6 /*CCA*/,
+6 /*CCC*/,
+6 /*CCG*/,
+6 /*CCT*/,
+19 /*CGA*/,
+19 /*CGC*/,
+19 /*CGG*/,
+19 /*CGT*/,
+1 /*CTA*/,
+1 /*CTC*/,
+1 /*CTG*/,
+1 /*CTT*/,
+16 /*GAA*/,
+15 /*GAC*/,
+16 /*GAG*/,
+15 /*GAT*/,
+8 /*GCA*/,
+8 /*GCC*/,
+8 /*GCG*/,
+8 /*GCT*/,
+20 /*GGA*/,
+20 /*GGC*/,
+20 /*GGG*/,
+20 /*GGT*/,
+4 /*GTA*/,
+4 /*GTC*/,
+4 /*GTG*/,
+4 /*GTT*/,
+10 /*TAA*/,
+9 /*TAC*/,
+10 /*TAG*/,
+9 /*TAT*/,
+5 /*TCA*/,
+5 /*TCC*/,
+5 /*TCG*/,
+5 /*TCT*/,
+18 /*TGA*/,
+17 /*TGC*/,
+18 /*TGG*/,
+17 /*TGT*/,
+1 /*TTA*/,
+0 /*TTC*/,
+1 /*TTG*/,
+0 /*TTT*/;
diff --git a/res/GeneticCodes/Blepharisma_Nuclear.cod b/res/GeneticCodes/Blepharisma_Nuclear.cod
new file mode 100644
index 0000000..7214231
--- /dev/null
+++ b/res/GeneticCodes/Blepharisma_Nuclear.cod
@@ -0,0 +1,67 @@
+3;
+Blepharisma_Nuclear;
+Blepharisma Nuclear Code;
+14 /*AAA*/,
+13 /*AAC*/,
+14 /*AAG*/,
+13 /*AAT*/,
+7 /*ACA*/,
+7 /*ACC*/,
+7 /*ACG*/,
+7 /*ACT*/,
+19 /*AGA*/,
+5 /*AGC*/,
+19 /*AGG*/,
+5 /*AGT*/,
+2 /*ATA*/,
+2 /*ATC*/,
+3 /*ATG*/,
+2 /*ATT*/,
+12 /*CAA*/,
+11 /*CAC*/,
+12 /*CAG*/,
+11 /*CAT*/,
+6 /*CCA*/,
+6 /*CCC*/,
+6 /*CCG*/,
+6 /*CCT*/,
+19 /*CGA*/,
+19 /*CGC*/,
+19 /*CGG*/,
+19 /*CGT*/,
+1 /*CTA*/,
+1 /*CTC*/,
+1 /*CTG*/,
+1 /*CTT*/,
+16 /*GAA*/,
+15 /*GAC*/,
+16 /*GAG*/,
+15 /*GAT*/,
+8 /*GCA*/,
+8 /*GCC*/,
+8 /*GCG*/,
+8 /*GCT*/,
+20 /*GGA*/,
+20 /*GGC*/,
+20 /*GGG*/,
+20 /*GGT*/,
+4 /*GTA*/,
+4 /*GTC*/,
+4 /*GTG*/,
+4 /*GTT*/,
+10 /*TAA*/,
+9 /*TAC*/,
+12 /*TAG*/,
+9 /*TAT*/,
+5 /*TCA*/,
+5 /*TCC*/,
+5 /*TCG*/,
+5 /*TCT*/,
+10 /*TGA*/,
+17 /*TGC*/,
+18 /*TGG*/,
+17 /*TGT*/,
+1 /*TTA*/,
+0 /*TTC*/,
+1 /*TTG*/,
+0 /*TTT*/;
diff --git a/res/GeneticCodes/Ciliate.cod b/res/GeneticCodes/Ciliate.cod
new file mode 100644
index 0000000..2bc3ff1
--- /dev/null
+++ b/res/GeneticCodes/Ciliate.cod
@@ -0,0 +1,68 @@
+4;
+Ciliate;
+The Ciliate, Dasycladacean and Hexamita Nuclear Code (transl_table=6)
+;
+14 /*AAA*/,
+13 /*AAC*/,
+14 /*AAG*/,
+13 /*AAT*/,
+7 /*ACA*/,
+7 /*ACC*/,
+7 /*ACG*/,
+7 /*ACT*/,
+19 /*AGA*/,
+5 /*AGC*/,
+19 /*AGG*/,
+5 /*AGT*/,
+2 /*ATA*/,
+2 /*ATC*/,
+3 /*ATG*/,
+2 /*ATT*/,
+12 /*CAA*/,
+11 /*CAC*/,
+12 /*CAG*/,
+11 /*CAT*/,
+6 /*CCA*/,
+6 /*CCC*/,
+6 /*CCG*/,
+6 /*CCT*/,
+19 /*CGA*/,
+19 /*CGC*/,
+19 /*CGG*/,
+19 /*CGT*/,
+1 /*CTA*/,
+1 /*CTC*/,
+1 /*CTG*/,
+1 /*CTT*/,
+16 /*GAA*/,
+15 /*GAC*/,
+16 /*GAG*/,
+15 /*GAT*/,
+8 /*GCA*/,
+8 /*GCC*/,
+8 /*GCG*/,
+8 /*GCT*/,
+20 /*GGA*/,
+20 /*GGC*/,
+20 /*GGG*/,
+20 /*GGT*/,
+4 /*GTA*/,
+4 /*GTC*/,
+4 /*GTG*/,
+4 /*GTT*/,
+12 /*TAA*/,
+9 /*TAC*/,
+12 /*TAG*/,
+9 /*TAT*/,
+5 /*TCA*/,
+5 /*TCC*/,
+5 /*TCG*/,
+5 /*TCT*/,
+10 /*TGA*/,
+17 /*TGC*/,
+18 /*TGG*/,
+17 /*TGT*/,
+1 /*TTA*/,
+0 /*TTC*/,
+1 /*TTG*/,
+0 /*TTT*/;
diff --git a/res/GeneticCodes/Echinoderm_mtDNA.cod b/res/GeneticCodes/Echinoderm_mtDNA.cod
new file mode 100644
index 0000000..cea8265
--- /dev/null
+++ b/res/GeneticCodes/Echinoderm_mtDNA.cod
@@ -0,0 +1,68 @@
+5;
+Echinoderm_mtDNA;
+The Echinoderm Mitochondrial Code (transl_table=9)
+;
+13 /*AAA*/,
+13 /*AAC*/,
+14 /*AAG*/,
+13 /*AAT*/,
+7 /*ACA*/,
+7 /*ACC*/,
+7 /*ACG*/,
+7 /*ACT*/,
+5 /*AGA*/,
+5 /*AGC*/,
+5 /*AGG*/,
+5 /*AGT*/,
+2 /*ATA*/,
+2 /*ATC*/,
+3 /*ATG*/,
+2 /*ATT*/,
+12 /*CAA*/,
+11 /*CAC*/,
+12 /*CAG*/,
+11 /*CAT*/,
+6 /*CCA*/,
+6 /*CCC*/,
+6 /*CCG*/,
+6 /*CCT*/,
+19 /*CGA*/,
+19 /*CGC*/,
+19 /*CGG*/,
+19 /*CGT*/,
+1 /*CTA*/,
+1 /*CTC*/,
+1 /*CTG*/,
+1 /*CTT*/,
+16 /*GAA*/,
+15 /*GAC*/,
+16 /*GAG*/,
+15 /*GAT*/,
+8 /*GCA*/,
+8 /*GCC*/,
+8 /*GCG*/,
+8 /*GCT*/,
+20 /*GGA*/,
+20 /*GGC*/,
+20 /*GGG*/,
+20 /*GGT*/,
+4 /*GTA*/,
+4 /*GTC*/,
+4 /*GTG*/,
+4 /*GTT*/,
+10 /*TAA*/,
+9 /*TAC*/,
+10 /*TAG*/,
+9 /*TAT*/,
+5 /*TCA*/,
+5 /*TCC*/,
+5 /*TCG*/,
+5 /*TCT*/,
+18 /*TGA*/,
+17 /*TGC*/,
+18 /*TGG*/,
+17 /*TGT*/,
+1 /*TTA*/,
+0 /*TTC*/,
+1 /*TTG*/,
+0 /*TTT*/;
diff --git a/res/GeneticCodes/Euplotid_Nuclear.cod b/res/GeneticCodes/Euplotid_Nuclear.cod
new file mode 100644
index 0000000..bc699cb
--- /dev/null
+++ b/res/GeneticCodes/Euplotid_Nuclear.cod
@@ -0,0 +1,68 @@
+6;
+Euplotid_Nuclear;
+The Euplotid Nuclear Code (transl_table=10)
+;
+14 /*AAA*/,
+13 /*AAC*/,
+14 /*AAG*/,
+13 /*AAT*/,
+7 /*ACA*/,
+7 /*ACC*/,
+7 /*ACG*/,
+7 /*ACT*/,
+19 /*AGA*/,
+5 /*AGC*/,
+19 /*AGG*/,
+5 /*AGT*/,
+2 /*ATA*/,
+2 /*ATC*/,
+3 /*ATG*/,
+2 /*ATT*/,
+12 /*CAA*/,
+11 /*CAC*/,
+12 /*CAG*/,
+11 /*CAT*/,
+6 /*CCA*/,
+6 /*CCC*/,
+6 /*CCG*/,
+6 /*CCT*/,
+19 /*CGA*/,
+19 /*CGC*/,
+19 /*CGG*/,
+19 /*CGT*/,
+1 /*CTA*/,
+1 /*CTC*/,
+1 /*CTG*/,
+1 /*CTT*/,
+16 /*GAA*/,
+15 /*GAC*/,
+16 /*GAG*/,
+15 /*GAT*/,
+8 /*GCA*/,
+8 /*GCC*/,
+8 /*GCG*/,
+8 /*GCT*/,
+20 /*GGA*/,
+20 /*GGC*/,
+20 /*GGG*/,
+20 /*GGT*/,
+4 /*GTA*/,
+4 /*GTC*/,
+4 /*GTG*/,
+4 /*GTT*/,
+10 /*TAA*/,
+9 /*TAC*/,
+10 /*TAG*/,
+9 /*TAT*/,
+5 /*TCA*/,
+5 /*TCC*/,
+5 /*TCG*/,
+5 /*TCT*/,
+17 /*TGA*/,
+17 /*TGC*/,
+18 /*TGG*/,
+17 /*TGT*/,
+1 /*TTA*/,
+0 /*TTC*/,
+1 /*TTG*/,
+0 /*TTT*/;
diff --git a/res/GeneticCodes/Flatworm_mtDNA.cod b/res/GeneticCodes/Flatworm_mtDNA.cod
new file mode 100644
index 0000000..4767528
--- /dev/null
+++ b/res/GeneticCodes/Flatworm_mtDNA.cod
@@ -0,0 +1,68 @@
+7;
+Flatworm_mtDNA;
+The Flatworm Mitochondrial Code (transl_table=14)
+;
+13 /*AAA*/,
+13 /*AAC*/,
+14 /*AAG*/,
+13 /*AAT*/,
+7 /*ACA*/,
+7 /*ACC*/,
+7 /*ACG*/,
+7 /*ACT*/,
+5 /*AGA*/,
+5 /*AGC*/,
+5 /*AGG*/,
+5 /*AGT*/,
+2 /*ATA*/,
+2 /*ATC*/,
+3 /*ATG*/,
+2 /*ATT*/,
+12 /*CAA*/,
+11 /*CAC*/,
+12 /*CAG*/,
+11 /*CAT*/,
+6 /*CCA*/,
+6 /*CCC*/,
+6 /*CCG*/,
+6 /*CCT*/,
+19 /*CGA*/,
+19 /*CGC*/,
+19 /*CGG*/,
+19 /*CGT*/,
+1 /*CTA*/,
+1 /*CTC*/,
+1 /*CTG*/,
+1 /*CTT*/,
+16 /*GAA*/,
+15 /*GAC*/,
+16 /*GAG*/,
+15 /*GAT*/,
+8 /*GCA*/,
+8 /*GCC*/,
+8 /*GCG*/,
+8 /*GCT*/,
+20 /*GGA*/,
+20 /*GGC*/,
+20 /*GGG*/,
+20 /*GGT*/,
+4 /*GTA*/,
+4 /*GTC*/,
+4 /*GTG*/,
+4 /*GTT*/,
+9 /*TAA*/,
+9 /*TAC*/,
+10 /*TAG*/,
+9 /*TAT*/,
+5 /*TCA*/,
+5 /*TCC*/,
+5 /*TCG*/,
+5 /*TCT*/,
+18 /*TGA*/,
+17 /*TGC*/,
+18 /*TGG*/,
+17 /*TGT*/,
+1 /*TTA*/,
+0 /*TTC*/,
+1 /*TTG*/,
+0 /*TTT*/;
diff --git a/res/GeneticCodes/Invertebrate_mtDNA.cod b/res/GeneticCodes/Invertebrate_mtDNA.cod
new file mode 100644
index 0000000..6755d7c
--- /dev/null
+++ b/res/GeneticCodes/Invertebrate_mtDNA.cod
@@ -0,0 +1,67 @@
+8;
+Invertebrate_mtDNA;
+The Invertebrate Mitochondrial Code (transl_table=5);
+14 /*AAA*/,
+13 /*AAC*/,
+14 /*AAG*/,
+13 /*AAT*/,
+7 /*ACA*/,
+7 /*ACC*/,
+7 /*ACG*/,
+7 /*ACT*/,
+5 /*AGA*/,
+5 /*AGC*/,
+5 /*AGG*/,
+5 /*AGT*/,
+3 /*ATA*/,
+2 /*ATC*/,
+3 /*ATG*/,
+2 /*ATT*/,
+12 /*CAA*/,
+11 /*CAC*/,
+12 /*CAG*/,
+11 /*CAT*/,
+6 /*CCA*/,
+6 /*CCC*/,
+6 /*CCG*/,
+6 /*CCT*/,
+19 /*CGA*/,
+19 /*CGC*/,
+19 /*CGG*/,
+19 /*CGT*/,
+1 /*CTA*/,
+1 /*CTC*/,
+1 /*CTG*/,
+1 /*CTT*/,
+16 /*GAA*/,
+15 /*GAC*/,
+16 /*GAG*/,
+15 /*GAT*/,
+8 /*GCA*/,
+8 /*GCC*/,
+8 /*GCG*/,
+8 /*GCT*/,
+20 /*GGA*/,
+20 /*GGC*/,
+20 /*GGG*/,
+20 /*GGT*/,
+4 /*GTA*/,
+4 /*GTC*/,
+4 /*GTG*/,
+4 /*GTT*/,
+10 /*TAA*/,
+9 /*TAC*/,
+10 /*TAG*/,
+9 /*TAT*/,
+5 /*TCA*/,
+5 /*TCC*/,
+5 /*TCG*/,
+5 /*TCT*/,
+18 /*TGA*/,
+17 /*TGC*/,
+18 /*TGG*/,
+17 /*TGT*/,
+1 /*TTA*/,
+0 /*TTC*/,
+1 /*TTG*/,
+0 /*TTT*/;
diff --git a/res/GeneticCodes/Mold_mtDNA.cod b/res/GeneticCodes/Mold_mtDNA.cod
new file mode 100644
index 0000000..d35ade8
--- /dev/null
+++ b/res/GeneticCodes/Mold_mtDNA.cod
@@ -0,0 +1,67 @@
+9;
+Mold_mtDNA;
+Mold,Protozoan and Coelenterate mtDNA;
+14 /*AAA*/,
+13 /*AAC*/,
+14 /*AAG*/,
+13 /*AAT*/,
+7 /*ACA*/,
+7 /*ACC*/,
+7 /*ACG*/,
+7 /*ACT*/,
+19 /*AGA*/,
+5 /*AGC*/,
+19 /*AGG*/,
+5 /*AGT*/,
+2 /*ATA*/,
+2 /*ATC*/,
+3 /*ATG*/,
+2 /*ATT*/,
+12 /*CAA*/,
+11 /*CAC*/,
+12 /*CAG*/,
+11 /*CAT*/,
+6 /*CCA*/,
+6 /*CCC*/,
+6 /*CCG*/,
+6 /*CCT*/,
+19 /*CGA*/,
+19 /*CGC*/,
+19 /*CGG*/,
+19 /*CGT*/,
+1 /*CTA*/,
+1 /*CTC*/,
+1 /*CTG*/,
+1 /*CTT*/,
+16 /*GAA*/,
+15 /*GAC*/,
+16 /*GAG*/,
+15 /*GAT*/,
+8 /*GCA*/,
+8 /*GCC*/,
+8 /*GCG*/,
+8 /*GCT*/,
+20 /*GGA*/,
+20 /*GGC*/,
+20 /*GGG*/,
+20 /*GGT*/,
+4 /*GTA*/,
+4 /*GTC*/,
+4 /*GTG*/,
+4 /*GTT*/,
+10 /*TAA*/,
+9 /*TAC*/,
+10 /*TAG*/,
+9 /*TAT*/,
+5 /*TCA*/,
+5 /*TCC*/,
+5 /*TCG*/,
+5 /*TCT*/,
+18 /*TGA*/,
+17 /*TGC*/,
+18 /*TGG*/,
+17 /*TGT*/,
+1 /*TTA*/,
+0 /*TTC*/,
+1 /*TTG*/,
+0 /*TTT*/;
diff --git a/res/GeneticCodes/Thraustochytrium_mtDNA.cod b/res/GeneticCodes/Thraustochytrium_mtDNA.cod
new file mode 100644
index 0000000..1f9a01b
--- /dev/null
+++ b/res/GeneticCodes/Thraustochytrium_mtDNA.cod
@@ -0,0 +1,69 @@
+10;
+Thraustochytrium_mtDNA
+;
+Thraustochytrium Mitochondrial Code (transl_table=23)
+;
+14 /*AAA*/,
+13 /*AAC*/,
+14 /*AAG*/,
+13 /*AAT*/,
+7 /*ACA*/,
+7 /*ACC*/,
+7 /*ACG*/,
+7 /*ACT*/,
+19 /*AGA*/,
+5 /*AGC*/,
+19 /*AGG*/,
+5 /*AGT*/,
+2 /*ATA*/,
+2 /*ATC*/,
+3 /*ATG*/,
+2 /*ATT*/,
+12 /*CAA*/,
+11 /*CAC*/,
+12 /*CAG*/,
+11 /*CAT*/,
+6 /*CCA*/,
+6 /*CCC*/,
+6 /*CCG*/,
+6 /*CCT*/,
+19 /*CGA*/,
+19 /*CGC*/,
+19 /*CGG*/,
+19 /*CGT*/,
+1 /*CTA*/,
+1 /*CTC*/,
+1 /*CTG*/,
+1 /*CTT*/,
+16 /*GAA*/,
+15 /*GAC*/,
+16 /*GAG*/,
+15 /*GAT*/,
+8 /*GCA*/,
+8 /*GCC*/,
+8 /*GCG*/,
+8 /*GCT*/,
+20 /*GGA*/,
+20 /*GGC*/,
+20 /*GGG*/,
+20 /*GGT*/,
+4 /*GTA*/,
+4 /*GTC*/,
+4 /*GTG*/,
+4 /*GTT*/,
+10 /*TAA*/,
+9 /*TAC*/,
+10 /*TAG*/,
+9 /*TAT*/,
+5 /*TCA*/,
+5 /*TCC*/,
+5 /*TCG*/,
+5 /*TCT*/,
+10 /*TGA*/,
+17 /*TGC*/,
+18 /*TGG*/,
+17 /*TGT*/,
+10 /*TTA*/,
+0 /*TTC*/,
+1 /*TTG*/,
+0 /*TTT*/;
diff --git a/res/GeneticCodes/Vertebratemtdna.cod b/res/GeneticCodes/Vertebratemtdna.cod
new file mode 100644
index 0000000..2275be4
--- /dev/null
+++ b/res/GeneticCodes/Vertebratemtdna.cod
@@ -0,0 +1,99 @@
+11;
+Vertebrate_mtDNA;
+Vertebrate mitochondrial genetic code;
+/*  numerical codes for various aminoacids 
+	and the stop codon
+ 	
+ 	0 == Phe
+ 	1 == Leu
+ 	2 == Ile
+ 	3 == Met
+ 	4 == Val
+ 	5 == Ser
+ 	6 == Pro
+ 	7 == Thr
+ 	8 == Ala
+ 	9 == Tyr
+ 	10 == Stop
+ 	11 == His
+ 	12 == Gln
+ 	13 == Asn
+ 	14 == Lys
+ 	15 == Asp
+ 	16 == Glu
+ 	17 == Cys
+ 	18 == Trp
+ 	19 == Arg
+ 	20 == Gly
+ 	
+ 	AAA,AAC,AAG....TTA,TTC,TTG,TTT - 64 all in all
+ 	
+ 	Each line below represent a codon->aminoacid
+ 	correspondence, e.g the line
+ 	14, AAG
+ 	means that AAG encodes Lys (which is denoted by 14, cf. the table above)
+*/
+14,/*AAA*/
+13,/*AAC*/ 
+14,/*AAG*/ 
+13,/*AAT*/
+7, /*ACA*/ 
+7, /*ACC*/ 
+7, /*ACG*/ 
+7, /*ACT*/
+10,/*AGA*/ 
+5, /*AGC*/
+10, /*AGG*/ 
+5, /*AGT*/
+3, /*ATA*/ 
+2, /*ATC*/	
+3, /*ATG*/ 
+2, /*ATT*/
+12,/*CAA*/ 
+11,/*CAC*/ 
+12,/*CAG*/ 
+11,/*CAT*/
+6, /*CCA*/ 
+6, /*CCC*/ 
+6, /*CCG*/ 
+6, /*CCT*/
+19,/*CGA*/ 
+19,/*CGC*/ 
+19,/*CGG*/ 
+19,/*CGT*/
+1, /*CTA*/ 
+1, /*CTG*/ 
+1, /*CTC*/ 
+1, /*CTT*/
+16,/*GAA*/ 
+15,/*GAC*/ 
+16,/*GAG*/ 
+15,/*GAT*/
+8, /*GCA*/ 
+8, /*GCC*/ 
+8, /*GCG*/ 
+8, /*GCT*/
+20,/*GGA*/ 
+20,/*GGC*/ 
+20,/*GGG*/ 
+20,/*GGT*/
+4, /*GTA*/ 
+4, /*GTC*/ 
+4, /*GTG*/ 
+4, /*GTT*/
+10,/*TAA*/ 
+9, /*TAC*/
+10,/*TAG*/ 
+9, /*TAT*/
+5, /*TCA*/ 
+5, /*TCC*/ 
+5, /*TCG*/ 
+5, /*TCT*/
+18,/*TGA*/ 
+17,/*TGC*/ 
+18,/*TGG*/ 
+17,/*TGT*/
+1, /*TTA*/ 
+0, /*TTC*/ 
+1, /*TTG*/ 
+0;  /*TTT*/
diff --git a/res/GeneticCodes/Yeast_mtDNA.cod b/res/GeneticCodes/Yeast_mtDNA.cod
new file mode 100644
index 0000000..c7e6989
--- /dev/null
+++ b/res/GeneticCodes/Yeast_mtDNA.cod
@@ -0,0 +1,67 @@
+12;
+Yeast_mtDNA;
+Yeast mtDNA;
+14 /*AAA*/,
+13 /*AAC*/,
+14 /*AAG*/,
+13 /*AAT*/,
+7 /*ACA*/,
+7 /*ACC*/,
+7 /*ACG*/,
+7 /*ACT*/,
+19 /*AGA*/,
+5 /*AGC*/,
+19 /*AGG*/,
+5 /*AGT*/,
+3 /*ATA*/,
+2 /*ATC*/,
+3 /*ATG*/,
+2 /*ATT*/,
+12 /*CAA*/,
+11 /*CAC*/,
+12 /*CAG*/,
+11 /*CAT*/,
+6 /*CCA*/,
+6 /*CCC*/,
+6 /*CCG*/,
+6 /*CCT*/,
+19 /*CGA*/,
+19 /*CGC*/,
+19 /*CGG*/,
+19 /*CGT*/,
+7 /*CTA*/,
+7 /*CTC*/,
+7 /*CTG*/,
+7 /*CTT*/,
+16 /*GAA*/,
+15 /*GAC*/,
+16 /*GAG*/,
+15 /*GAT*/,
+8 /*GCA*/,
+8 /*GCC*/,
+8 /*GCG*/,
+8 /*GCT*/,
+20 /*GGA*/,
+20 /*GGC*/,
+20 /*GGG*/,
+20 /*GGT*/,
+4 /*GTA*/,
+4 /*GTC*/,
+4 /*GTG*/,
+4 /*GTT*/,
+10 /*TAA*/,
+9 /*TAC*/,
+10 /*TAG*/,
+9 /*TAT*/,
+5 /*TCA*/,
+5 /*TCC*/,
+5 /*TCG*/,
+5 /*TCT*/,
+18 /*TGA*/,
+17 /*TGC*/,
+18 /*TGG*/,
+17 /*TGT*/,
+1 /*TTA*/,
+0 /*TTC*/,
+1 /*TTG*/,
+0 /*TTT*/;
diff --git a/res/SubstitutionClasses/AAEFV/Equal b/res/SubstitutionClasses/AAEFV/Equal
new file mode 100644
index 0000000..89fa863
--- /dev/null
+++ b/res/SubstitutionClasses/AAEFV/Equal
@@ -0,0 +1,3 @@
+Model_EFV_Vector  = {{.05,.05,.05,.05,.05,.05,.05,.05,.05,.05,.05,.05,.05,.05,.05,.05,.05,.05,.05,.05}};
+MULTIPLY_BY_FREQS = 1;
+
diff --git a/res/SubstitutionClasses/AAEFV/Estimated b/res/SubstitutionClasses/AAEFV/Estimated
new file mode 100644
index 0000000..4b6f251
--- /dev/null
+++ b/res/SubstitutionClasses/AAEFV/Estimated
@@ -0,0 +1,51 @@
+function GUIHandleFrequenciesCollection (dummy_parameter)
+{
+	HarvestFrequencies (Model_EFV_Vector,Data_Partition_ID,1,1,1);
+
+	global frequencyVariable_1 = Model_EFV_Vector[0];
+	global frequencyVariable_2 = Model_EFV_Vector[1]/(1-frequencyVariable_1);
+	global frequencyVariable_3 = Model_EFV_Vector[2]/(1-frequencyVariable_1)/(1-frequencyVariable_1);
+	global frequencyVariable_4 = Model_EFV_Vector[3]/(1-frequencyVariable_1)/(1-frequencyVariable_1)/(1-frequencyVariable_2);
+	global frequencyVariable_5 = Model_EFV_Vector[4]/(1-frequencyVariable_1)/(1-frequencyVariable_1)/(1-frequencyVariable_2)/(1-frequencyVariable_3);
+	global frequencyVariable_6 = Model_EFV_Vector[5]/(1-frequencyVariable_1)/(1-frequencyVariable_1)/(1-frequencyVariable_2)/(1-frequencyVariable_3)/(1-frequencyVariable_4);
+	global frequencyVariable_7 = Model_EFV_Vector[6]/(1-frequencyVariable_1)/(1-frequencyVariable_1)/(1-frequencyVariable_2)/(1-frequencyVariable_3)/(1-frequencyVariable_4)/(1-frequencyVariable_5);
+	global frequencyVariable_8 = Model_EFV_Vector[7]/(1-frequencyVariable_1)/(1-frequencyVariable_1)/(1-frequencyVariable_2)/(1-frequencyVariable_3)/(1-frequencyVariable_4)/(1-frequencyVariable_5)/(1-frequencyVariable_6);
+	global frequencyVariable_9 = Model_EFV_Vector[8]/(1-frequencyVariable_1)/(1-frequencyVariable_1)/(1-frequencyVariable_2)/(1-frequencyVariable_3)/(1-frequencyVariable_4)/(1-frequencyVariable_5)/(1-frequencyVariable_6)/(1-frequencyVariable_7);
+	global frequencyVariable_10 = Model_EFV_Vector[9]/(1-frequencyVariable_1)/(1-frequencyVariable_1)/(1-frequencyVariable_2)/(1-frequencyVariable_3)/(1-frequencyVariable_4)/(1-frequencyVariable_5)/(1-frequencyVariable_6)/(1-frequencyVariable_7)/(1-frequencyVariable_8);
+	global frequencyVariable_11 = Model_EFV_Vector[10]/(1-frequencyVariable_1)/(1-frequencyVariable_1)/(1-frequencyVariable_2)/(1-frequencyVariable_3)/(1-frequencyVariable_4)/(1-frequencyVariable_5)/(1-frequencyVariable_6)/(1-frequencyVariable_7)/(1-frequencyVariable_8)/(1-frequencyVariable_9);
+	global frequencyVariable_12 = Model_EFV_Vector[11]/(1-frequencyVariable_1)/(1-frequencyVariable_1)/(1-frequencyVariable_2)/(1-frequencyVariable_3)/(1-frequencyVariable_4)/(1-frequencyVariable_5)/(1-frequencyVariable_6)/(1-frequencyVariable_7)/(1-frequencyVariable_8)/(1-frequencyVariable_9)/(1-frequencyVariable_10);
+	global frequencyVariable_13 = Model_EFV_Vector[12]/(1-frequencyVariable_1)/(1-frequencyVariable_1)/(1-frequencyVariable_2)/(1-frequencyVariable_3)/(1-frequencyVariable_4)/(1-frequencyVariable_5)/(1-frequencyVariable_6)/(1-frequencyVariable_7)/(1-frequencyVariable_8)/(1-frequencyVariable_9)/(1-frequencyVariable_10)/(1-frequencyVariable_11);
+	global frequencyVariable_14 = Model_EFV_Vector[13]/(1-frequencyVariable_1)/(1-frequencyVariable_1)/(1-frequencyVariable_2)/(1-frequencyVariable_3)/(1-frequencyVariable_4)/(1-frequencyVariable_5)/(1-frequencyVariable_6)/(1-frequencyVariable_7)/(1-frequencyVariable_8)/(1-frequencyVariable_9)/(1-frequencyVariable_10)/(1-frequencyVariable_11)/(1-frequencyVariable_12);
+	global frequencyVariable_15 = Model_EFV_Vector[14]/(1-frequencyVariable_1)/(1-frequencyVariable_1)/(1-frequencyVariable_2)/(1-frequencyVariable_3)/(1-frequencyVariable_4)/(1-frequencyVariable_5)/(1-frequencyVariable_6)/(1-frequencyVariable_7)/(1-frequencyVariable_8)/(1-frequencyVariable_9)/(1-frequencyVariable_10)/(1-frequencyVariable_11)/(1-frequencyVariable_12)/(1-frequencyVariable_13);
+	global frequencyVariable_16 = Model_EFV_Vector[15]/(1-frequencyVariable_1)/(1-frequencyVariable_1)/(1-frequencyVariable_2)/(1-frequencyVariable_3)/(1-frequencyVariable_4)/(1-frequencyVariable_5)/(1-frequencyVariable_6)/(1-frequencyVariable_7)/(1-frequencyVariable_8)/(1-frequencyVariable_9)/(1-frequencyVariable_10)/(1-frequencyVariable_11)/(1-frequencyVariable_12)/(1-frequencyVariable_13)/(1-frequencyVariable_14);
+	global frequencyVariable_17 = Model_EFV_Vector[16]/(1-frequencyVariable_1)/(1-frequencyVariable_1)/(1-frequencyVariable_2)/(1-frequencyVariable_3)/(1-frequencyVariable_4)/(1-frequencyVariable_5)/(1-frequencyVariable_6)/(1-frequencyVariable_7)/(1-frequencyVariable_8)/(1-frequencyVariable_9)/(1-frequencyVariable_10)/(1-frequencyVariable_11)/(1-frequencyVariable_12)/(1-frequencyVariable_13)/(1-frequencyVariable_14)/(1-frequencyVariable_15);
+	global frequencyVariable_18 = Model_EFV_Vector[17]/(1-frequencyVariable_1)/(1-frequencyVariable_1)/(1-frequencyVariable_2)/(1-frequencyVariable_3)/(1-frequencyVariable_4)/(1-frequencyVariable_5)/(1-frequencyVariable_6)/(1-frequencyVariable_7)/(1-frequencyVariable_8)/(1-frequencyVariable_9)/(1-frequencyVariable_10)/(1-frequencyVariable_11)/(1-frequencyVariable_12)/(1-frequencyVariable_13)/(1-frequencyVariable_14)/(1-frequencyVariable_15)/(1-frequencyVariable_16);
+	global frequencyVariable_19 = Model_EFV_Vector[18]/(1-frequencyVariable_1)/(1-frequencyVariable_1)/(1-frequencyVariable_2)/(1-frequencyVariable_3)/(1-frequencyVariable_4)/(1-frequencyVariable_5)/(1-frequencyVariable_6)/(1-frequencyVariable_7)/(1-frequencyVariable_8)/(1-frequencyVariable_9)/(1-frequencyVariable_10)/(1-frequencyVariable_11)/(1-frequencyVariable_12)/(1-frequencyVariable_13)/(1-frequencyVariable_14)/(1-frequencyVariable_15)/(1-frequencyVariable_16)/(1-frequencyVariable_17);
+
+
+	Model_EFV_Vector = {
+		{frequencyVariable_1}
+		{(1-frequencyVariable_1)*frequencyVariable_2}
+		{(1-frequencyVariable_1)*(1-frequencyVariable_2)*frequencyVariable_3}
+		{(1-frequencyVariable_1)*(1-frequencyVariable_2)*(1-frequencyVariable_3)*frequencyVariable_4}
+		{(1-frequencyVariable_1)*(1-frequencyVariable_2)*(1-frequencyVariable_3)*(1-frequencyVariable_4)*frequencyVariable_5}
+		{(1-frequencyVariable_1)*(1-frequencyVariable_2)*(1-frequencyVariable_3)*(1-frequencyVariable_4)*(1-frequencyVariable_5)*frequencyVariable_6}
+		{(1-frequencyVariable_1)*(1-frequencyVariable_2)*(1-frequencyVariable_3)*(1-frequencyVariable_4)*(1-frequencyVariable_5)*(1-frequencyVariable_6)*frequencyVariable_7}
+		{(1-frequencyVariable_1)*(1-frequencyVariable_2)*(1-frequencyVariable_3)*(1-frequencyVariable_4)*(1-frequencyVariable_5)*(1-frequencyVariable_6)*(1-frequencyVariable_7)*frequencyVariable_8}
+		{(1-frequencyVariable_1)*(1-frequencyVariable_2)*(1-frequencyVariable_3)*(1-frequencyVariable_4)*(1-frequencyVariable_5)*(1-frequencyVariable_6)*(1-frequencyVariable_7)*(1-frequencyVariable_8)*frequencyVariable_9}
+		{(1-frequencyVariable_1)*(1-frequencyVariable_2)*(1-frequencyVariable_3)*(1-frequencyVariable_4)*(1-frequencyVariable_5)*(1-frequencyVariable_6)*(1-frequencyVariable_7)*(1-frequencyVariable_8)*(1-frequencyVariable_9)*frequencyVariable_10}
+		{(1-frequencyVariable_1)*(1-frequencyVariable_2)*(1-frequencyVariable_3)*(1-frequencyVariable_4)*(1-frequencyVariable_5)*(1-frequencyVariable_6)*(1-frequencyVariable_7)*(1-frequencyVariable_8)*(1-frequencyVariable_9)*(1-frequencyVariable_10)*frequencyVariable_11}
+		{(1-frequencyVariable_1)*(1-frequencyVariable_2)*(1-frequencyVariable_3)*(1-frequencyVariable_4)*(1-frequencyVariable_5)*(1-frequencyVariable_6)*(1-frequencyVariable_7)*(1-frequencyVariable_8)*(1-frequencyVariable_9)*(1-frequencyVariable_10)*(1-frequencyVariable_11)*frequencyVariable_12}
+		{(1-frequencyVariable_1)*(1-frequencyVariable_2)*(1-frequencyVariable_3)*(1-frequencyVariable_4)*(1-frequencyVariable_5)*(1-frequencyVariable_6)*(1-frequencyVariable_7)*(1-frequencyVariable_8)*(1-frequencyVariable_9)*(1-frequencyVariable_10)*(1-frequencyVariable_11)*(1-frequencyVariable_12)*frequencyVariable_13}
+		{(1-frequencyVariable_1)*(1-frequencyVariable_2)*(1-frequencyVariable_3)*(1-frequencyVariable_4)*(1-frequencyVariable_5)*(1-frequencyVariable_6)*(1-frequencyVariable_7)*(1-frequencyVariable_8)*(1-frequencyVariable_9)*(1-frequencyVariable_10)*(1-frequencyVariable_11)*(1-frequencyVariable_12)*(1-frequencyVariable_13)*frequencyVariable_14}
+		{(1-frequencyVariable_1)*(1-frequencyVariable_2)*(1-frequencyVariable_3)*(1-frequencyVariable_4)*(1-frequencyVariable_5)*(1-frequencyVariable_6)*(1-frequencyVariable_7)*(1-frequencyVariable_8)*(1-frequencyVariable_9)*(1-frequencyVariable_10)*(1-frequencyVariable_11)*(1-frequencyVariable_12)*(1-frequencyVariable_13)*(1-frequencyVariable_14)*frequencyVariable_15}
+		{(1-frequencyVariable_1)*(1-frequencyVariable_2)*(1-frequencyVariable_3)*(1-frequencyVariable_4)*(1-frequencyVariable_5)*(1-frequencyVariable_6)*(1-frequencyVariable_7)*(1-frequencyVariable_8)*(1-frequencyVariable_9)*(1-frequencyVariable_10)*(1-frequencyVariable_11)*(1-frequencyVariable_12)*(1-frequencyVariable_13)*(1-frequencyVariable_14)*(1-frequencyVariable_15)*frequencyVariable_16}
+		{(1-frequencyVariable_1)*(1-frequencyVariable_2)*(1-frequencyVariable_3)*(1-frequencyVariable_4)*(1-frequencyVariable_5)*(1-frequencyVariable_6)*(1-frequencyVariable_7)*(1-frequencyVariable_8)*(1-frequencyVariable_9)*(1-frequencyVariable_10)*(1-frequencyVariable_11)*(1-frequencyVariable_12)*(1-frequencyVariable_13)*(1-frequencyVariable_14)*(1-frequencyVariable_15)*(1-frequencyVariable_16)*frequencyVariable_17}
+		{(1-frequencyVariable_1)*(1-frequencyVariable_2)*(1-frequencyVariable_3)*(1-frequencyVariable_4)*(1-frequencyVariable_5)*(1-frequencyVariable_6)*(1-frequencyVariable_7)*(1-frequencyVariable_8)*(1-frequencyVariable_9)*(1-frequencyVariable_10)*(1-frequencyVariable_11)*(1-frequencyVariable_12)*(1-frequencyVariable_13)*(1-frequencyVariable_14)*(1-frequencyVariable_15)*(1-frequencyVariable_16)*(1-frequencyVariable_17)*frequencyVariable_18}
+		{(1-frequencyVariable_1)*(1-frequencyVariable_2)*(1-frequencyVariable_3)*(1-frequencyVariable_4)*(1-frequencyVariable_5)*(1-frequencyVariable_6)*(1-frequencyVariable_7)*(1-frequencyVariable_8)*(1-frequencyVariable_9)*(1-frequencyVariable_10)*(1-frequencyVariable_11)*(1-frequencyVariable_12)*(1-frequencyVariable_13)*(1-frequencyVariable_14)*(1-frequencyVariable_15)*(1-frequencyVariable_16)*(1-frequencyVariable_17)*(1-frequencyVariable_18)*frequencyVariable_19}
+		{(1-frequencyVariable_1)*(1-frequencyVariable_2)*(1-frequencyVariable_3)*(1-frequencyVariable_4)*(1-frequencyVariable_5)*(1-frequencyVariable_6)*(1-frequencyVariable_7)*(1-frequencyVariable_8)*(1-frequencyVariable_9)*(1-frequencyVariable_10)*(1-frequencyVariable_11)*(1-frequencyVariable_12)*(1-frequencyVariable_13)*(1-frequencyVariable_14)*(1-frequencyVariable_15)*(1-frequencyVariable_16)*(1-frequencyVariable_17)*(1-frequencyVariable_18)*(1-frequencyVariable_19)}
+	};
+					
+	MULTIPLY_BY_FREQS = 1;
+	return 	0;
+}
diff --git a/res/SubstitutionClasses/AAEFV/Observed In Data Set b/res/SubstitutionClasses/AAEFV/Observed In Data Set
new file mode 100644
index 0000000..4acfe0e
--- /dev/null
+++ b/res/SubstitutionClasses/AAEFV/Observed In Data Set	
@@ -0,0 +1,8 @@
+function GUIHandleFrequenciesCollection (dummy_parameter)
+{
+	HarvestFrequencies (Model_EFV_Vector,Data_Set_ID,1,1,1);
+	MULTIPLY_BY_FREQS = 1;
+
+	return 	0;
+}
+
diff --git a/res/SubstitutionClasses/AAEFV/Observed In Partition b/res/SubstitutionClasses/AAEFV/Observed In Partition
new file mode 100644
index 0000000..626e503
--- /dev/null
+++ b/res/SubstitutionClasses/AAEFV/Observed In Partition	
@@ -0,0 +1,8 @@
+function GUIHandleFrequenciesCollection (dummy_parameter)
+{
+	HarvestFrequencies (Model_EFV_Vector,Data_Partition_ID,1,1,1);
+	MULTIPLY_BY_FREQS = 1;
+
+	return 	0;
+}
+
diff --git a/res/SubstitutionClasses/CodonEFV/Equal b/res/SubstitutionClasses/CodonEFV/Equal
new file mode 100644
index 0000000..b88be65
--- /dev/null
+++ b/res/SubstitutionClasses/CodonEFV/Equal
@@ -0,0 +1,20 @@
+MULTIPLY_BY_FREQS = 1;
+
+function GUIBuildCodonFrequencies (EFV)
+{
+	result = {ModelMatrixDimension,1};
+	hshift = 0;
+	PIStop = 1/ModelMatrixDimension;
+
+	for (h=0; h<64; h=h+1)
+	{
+		if (_Genetic_Code[h]==10) 
+		{
+			hshift = hshift+1;
+			continue; 
+		}
+		result[h-hshift][0]=PIStop;
+	}
+	return result;
+}
+
diff --git a/res/SubstitutionClasses/CodonEFV/Observed Codon b/res/SubstitutionClasses/CodonEFV/Observed Codon
new file mode 100644
index 0000000..4fd433e
--- /dev/null
+++ b/res/SubstitutionClasses/CodonEFV/Observed Codon	
@@ -0,0 +1,100 @@
+function GUIBuildCodonFrequencies (EFV)
+{
+	result = {ModelMatrixDimension,1};
+	HarvestFrequencies (Model_EFV_Vector,Data_Set_ID,3,3,1);
+	MULTIPLY_BY_FREQS = 0;
+	return result;
+}
+
+/** MATRIX MODIFICATION CODE **/
+
+EFVModifierMatrix = {ModelMatrixDimension,ModelMatrixDimension}; 
+hshift = 0;
+
+for (h=0; h<64; h=h+1)
+{
+	if (ModelGeneticCode[h]==10) 
+	{
+		hshift = hshift+1;
+		continue; 
+	}
+	vshift = hshift;
+	for (v = h+1; v<64; v=v+1)
+	{
+		diff = v-h;
+		if (ModelGeneticCode[v]==10) 
+		{
+			vshift = vshift+1;
+			continue; 
+		}
+	  	if ((h$4==v$4)||((diff%4==0)&&(h$16==v$16))||(diff%16==0))
+	  	{
+	  		if (h$4==v$4)
+	  		{
+	  			transition = v%4;
+	  			transition2= h%4;
+	  		}
+	  		else
+	  		{
+	  			if(diff%16==0)
+	  			{
+	  				transition = v$16;
+	  				transition2= h$16;
+	  			}
+	  			else
+	  			{
+	  				transition = v%16$4;
+	  				transition2= h%16$4;
+	  			}
+	  		}
+	  		if (transition==0) 
+	  		{
+	  			EFVModifierMatrix[h-hshift][v-vshift] := "EFV__[0]";
+		  	}
+		  	else
+		  	{
+		  		if (transition==1) 
+		  		{
+		  			EFVModifierMatrix[h-hshift][v-vshift] := "EFV__[1]";
+			  	}		  	
+			  	else
+			  	{
+			  		if (transition==2) 
+			  		{
+			  			EFVModifierMatrix[h-hshift][v-vshift] := "EFV__[2]";
+				  	}		  	
+				  	else
+			  		{
+			  			EFVModifierMatrix[h-hshift][v-vshift] := "EFV__[3]";
+				  	}		  	
+				  	
+			  	}
+		  	}
+	  		if (transition2==0) 
+	  		{
+	  			EFVModifierMatrix[v-vshift][h-hshift] := "EFV__[0]";
+		  	}
+		  	else
+		  	{
+		  		if (transition2==1) 
+		  		{
+		  			EFVModifierMatrix[v-vshift][h-hshift] := "EFV__[1]";
+			  	}		  	
+			  	else
+			  	{
+			  		if (transition2==2) 
+			  		{
+			  			EFVModifierMatrix[v-vshift][h-hshift] := "EFV__[2]";
+				  	}		  	
+				  	else
+			  		{
+			  			EFVModifierMatrix[v-vshift][h-hshift] := "EFV__[3]";
+				  	}		  	
+				  	
+			  	}
+		  	}
+	  	}
+    }
+}
+
+
diff --git a/res/SubstitutionClasses/CodonEFV/Observed Nuc 3 params. b/res/SubstitutionClasses/CodonEFV/Observed Nuc 3 params.
new file mode 100644
index 0000000..e1c5271
--- /dev/null
+++ b/res/SubstitutionClasses/CodonEFV/Observed Nuc 3 params.	
@@ -0,0 +1,121 @@
+function GUIBuildCodonFrequencies (EFV)
+{
+	PIStop = 1.0;
+	result = {ModelMatrixDimension,1};
+	hshift = 0;
+
+	for (h=0; h<64; h=h+1)
+	{
+		first = h$16;
+		second = h%16$4;
+		third = h%4;
+		if (ModelGeneticCode[h]==10) 
+		{
+			hshift = hshift+1;
+			PIStop = PIStop-EFV[first][0]*EFV[second][0]*EFV[third][0];
+			continue; 
+		}
+		result[h-hshift][0]=EFV[first][0]*EFV[second][0]*EFV[third][0];
+	}
+	return result*(1.0/PIStop);
+}
+
+function GUIHandleFrequenciesCollection (dummy_parameter)
+{
+	HarvestFrequencies (Model_EFV_Vector,Data_Set_ID,1,1,1);
+	MULTIPLY_BY_FREQS = 0;
+	return 	0;
+}
+
+/** MATRIX MODIFICATION CODE **/
+
+EFVModifierMatrix = {ModelMatrixDimension,ModelMatrixDimension}; 
+hshift = 0;
+
+for (h=0; h<64; h=h+1)
+{
+	if (ModelGeneticCode[h]==10) 
+	{
+		hshift = hshift+1;
+		continue; 
+	}
+	vshift = hshift;
+	for (v = h+1; v<64; v=v+1)
+	{
+		diff = v-h;
+		if (ModelGeneticCode[v]==10) 
+		{
+			vshift = vshift+1;
+			continue; 
+		}
+	  	if ((h$4==v$4)||((diff%4==0)&&(h$16==v$16))||(diff%16==0))
+	  	{
+	  		if (h$4==v$4)
+	  		{
+	  			transition = v%4;
+	  			transition2= h%4;
+	  		}
+	  		else
+	  		{
+	  			if(diff%16==0)
+	  			{
+	  				transition = v$16;
+	  				transition2= h$16;
+	  			}
+	  			else
+	  			{
+	  				transition = v%16$4;
+	  				transition2= h%16$4;
+	  			}
+	  		}
+	  		if (transition==0) 
+	  		{
+	  			EFVModifierMatrix[h-hshift][v-vshift] := "EFV__[0]";
+		  	}
+		  	else
+		  	{
+		  		if (transition==1) 
+		  		{
+		  			EFVModifierMatrix[h-hshift][v-vshift] := "EFV__[1]";
+			  	}		  	
+			  	else
+			  	{
+			  		if (transition==2) 
+			  		{
+			  			EFVModifierMatrix[h-hshift][v-vshift] := "EFV__[2]";
+				  	}		  	
+				  	else
+			  		{
+			  			EFVModifierMatrix[h-hshift][v-vshift] := "EFV__[3]";
+				  	}		  	
+				  	
+			  	}
+		  	}
+	  		if (transition2==0) 
+	  		{
+	  			EFVModifierMatrix[v-vshift][h-hshift] := "EFV__[0]";
+		  	}
+		  	else
+		  	{
+		  		if (transition2==1) 
+		  		{
+		  			EFVModifierMatrix[v-vshift][h-hshift] := "EFV__[1]";
+			  	}		  	
+			  	else
+			  	{
+			  		if (transition2==2) 
+			  		{
+			  			EFVModifierMatrix[v-vshift][h-hshift] := "EFV__[2]";
+				  	}		  	
+				  	else
+			  		{
+			  			EFVModifierMatrix[v-vshift][h-hshift] := "EFV__[3]";
+				  	}		  	
+				  	
+			  	}
+		  	}
+	  	}
+    }
+}
+
+
diff --git a/res/SubstitutionClasses/CodonEFV/Observed Nuc 9 params. b/res/SubstitutionClasses/CodonEFV/Observed Nuc 9 params.
new file mode 100644
index 0000000..5f5fcbc
--- /dev/null
+++ b/res/SubstitutionClasses/CodonEFV/Observed Nuc 9 params.	
@@ -0,0 +1,131 @@
+function GUIBuildCodonFrequencies (EFV)
+{
+	PIStop = 1.0;
+	result = {ModelMatrixDimension,1};
+	hshift = 0;
+
+	for (h=0; h<64; h=h+1)
+	{
+		first  = h$16;
+		second = h%16$4;
+		third  = h%4;
+		if (ModelGeneticCode[h]==10) 
+		{
+			hshift = hshift+1;
+			PIStop = PIStop-EFV[first][0]*EFV[second][1]*EFV[third][2];
+			continue; 
+		}
+		result[h-hshift][0]=EFV[first][0]*EFV[second][1]*EFV[third][2];
+	}
+	return result*(1.0/PIStop);
+}
+
+function GUIHandleFrequenciesCollection (dummy_parameter)
+{
+	HarvestFrequencies (Model_EFV_Vector,Data_Set_ID,3,1,1);
+	MULTIPLY_BY_FREQS = 0;
+	return 	0;
+}
+
+/** MATRIX MODIFICATION CODE **/
+
+EFVModifierMatrix = {ModelMatrixDimension,ModelMatrixDimension}; 
+hshift = 0;
+
+for (h=0; h<64; h=h+1)
+{
+	if (ModelGeneticCode[h]==10) 
+	{
+		hshift = hshift+1;
+		continue; 
+	}
+	vshift = hshift;
+	for (v = h+1; v<64; v=v+1)
+	{
+		diff = v-h;
+		if (ModelGeneticCode[v]==10) 
+		{
+			vshift = vshift+1;
+			continue; 
+		}
+		modString2 = "[2]";
+	  	if ((h$4==v$4)||((diff%4==0)&&(h$16==v$16))||(diff%16==0))
+	  	{
+	  		if (h$4==v$4)
+	  		{
+	  			transition = v%4;
+	  			transition2= h%4;
+	  		}
+	  		else
+	  		{
+	  			if(diff%16==0)
+	  			{
+	  				transition = v$16;
+	  				transition2= h$16;
+					modString2 = "[0]";
+	  			}
+	  			else
+	  			{
+	  				transition = v%16$4;
+	  				transition2= h%16$4;
+					modString2 = "[1]";
+	  			}
+			}
+	  		modString  = "EFV__[";
+	  		if (transition==0) 
+	  		{
+	  			modString = "EFV__[0]";
+		  	}
+		  	else
+		  	{
+		  		if (transition==1) 
+		  		{
+		  			modString = "EFV__[1]";
+			  	}		  	
+			  	else
+			  	{
+			  		if (transition==2) 
+			  		{
+			  			modString = "EFV__[2]";
+				  	}		  	
+				  	else
+			  		{
+			  			modString = "EFV__[3]";
+				  	}		  	
+				  	
+			  	}
+		  	}
+		  	
+		  	modString = modString+modString2;
+	  		EFVModifierMatrix[h-hshift][v-vshift] := modString__;
+		  	
+			if (transition2==0) 
+	  		{
+	  			modString = "EFV__[0]";
+		  	}
+		  	else
+		  	{
+		  		if (transition2==1) 
+		  		{
+		  			modString = "EFV__[1]";
+			  	}		  	
+			  	else
+			  	{
+			  		if (transition2==2) 
+			  		{
+			  			modString = "EFV__[2]";
+				  	}		  	
+				  	else
+			  		{
+			  			modString2 = "EFV__[3]";
+				  	}		  	
+				  	
+			  	}
+		  	}	  	
+		  	modString = modString+modString2;
+	  		EFVModifierMatrix[v-vshift][h-hshift] := modString__;
+		 }
+    }
+}
+
+
diff --git a/res/SubstitutionClasses/Heterogeneity/2 Bin Discrete b/res/SubstitutionClasses/Heterogeneity/2 Bin Discrete
new file mode 100644
index 0000000..9674a40
--- /dev/null
+++ b/res/SubstitutionClasses/Heterogeneity/2 Bin Discrete	
@@ -0,0 +1,10 @@
+global shapeParameter_Rate1 	= .5;
+global shapeParameter_Rate2 	= 1.5;
+global shapeParameter_Weight 	= .5;
+
+shapeParameter_Weight:<1;
+
+shapeParameterRateMatrix={{shapeParameter_Rate1,shapeParameter_Rate2}};
+shapeParameterFreqMatrix={{shapeParameter_Weight,1-shapeParameter_Weight}};
+
+category categoryPlaceholder     = (2,shapeParameterFreqMatrix , MEAN, ,shapeParameterRateMatrix, 0, 1e25);
diff --git a/res/SubstitutionClasses/Heterogeneity/Beta b/res/SubstitutionClasses/Heterogeneity/Beta
new file mode 100644
index 0000000..d2d300e
--- /dev/null
+++ b/res/SubstitutionClasses/Heterogeneity/Beta
@@ -0,0 +1,11 @@
+global shapeParameterP = 1;
+global shapeParameterQ = 1;
+shapeParameterP:>0.05;shapeParameterP:<85;
+shapeParameterQ:>0.05;shapeParameterQ:<85;
+category categoryPlaceholder = (rateClassCount, EQUAL, MEAN, 
+							 _x_^(shapeParameterP-1)*(1-_x_)^(shapeParameterQ-1)/Beta(shapeParameterP,shapeParameterQ), /* density */
+							 IBeta(_x_,shapeParameterP,shapeParameterQ), /*CDF*/
+							 0, 				   /*left bound*/
+							 1, 			   /*right bound*/
+							 IBeta(_x_,shapeParameterP+1,shapeParameterQ)*shapeParameterP/(shapeParameterP+shapeParameterQ)
+		  	 				);
diff --git a/res/SubstitutionClasses/Heterogeneity/Beta-Gamma b/res/SubstitutionClasses/Heterogeneity/Beta-Gamma
new file mode 100644
index 0000000..4abca9e
--- /dev/null
+++ b/res/SubstitutionClasses/Heterogeneity/Beta-Gamma
@@ -0,0 +1,21 @@
+global shapeParameterP = 1;
+global shapeParameterQ = 1;
+shapeParameterP:>0.05;shapeParameterP:<85;
+shapeParameterQ:>0.05;shapeParameterQ:<85;
+category categoryPlaceholderPC = (rateClassCount-1, EQUAL, MEAN, 
+							 _x_^(shapeParameterP-1)*(1-_x_)^(shapeParameterQ-1)/Beta(shapeParameterP,shapeParameterQ), /* density */
+							 IBeta(_x_,shapeParameterP,shapeParameterQ), /*CDF*/
+							 0, 				   /*left bound*/
+							 1, 			   /*right bound*/
+							 IBeta(_x_,shapeParameterP+1,shapeParameterQ)*shapeParameterP/(shapeParameterP+shapeParameterQ)
+		  	 				);
+
+global shapeParameter_alpha = .5;
+shapeParameter_alpha:>0.01;shapeParameter_alpha:<100;
+category categoryPlaceholder = (rateClassCount, categoryPlaceholderPC, MEAN, 
+								GammaDist(_x_,shapeParameter_alpha,shapeParameter_alpha), 
+								CGammaDist(_x_,shapeParameter_alpha,shapeParameter_alpha), 
+								0 , 
+						  	    1e25,
+						  	    CGammaDist(_x_,shapeParameter_alpha+1,shapeParameter_alpha)
+						  	 );
diff --git a/res/SubstitutionClasses/Heterogeneity/General Discrete b/res/SubstitutionClasses/Heterogeneity/General Discrete
new file mode 100644
index 0000000..4ccb473
--- /dev/null
+++ b/res/SubstitutionClasses/Heterogeneity/General Discrete	
@@ -0,0 +1,68 @@
+executeMePlease = "";
+for (mi=1; mi<rateClassCount; mi=mi+1)
+{
+	executeMePlease = executeMePlease + "global shapeParameterPS_" + mi + " = 1/" +  
+					  ((rateClassCount+1)-mi) + ";\nshapeParameterPS_" + mi + ":<1;\n";
+}
+
+executeMePlease = executeMePlease + "\nglobal shapeParameterRS_1=.3;shapeParameterRS_1:<1;";
+
+for (mi=3; mi<=rateClassCount; mi=mi+1)
+{
+	executeMePlease = executeMePlease + "global shapeParameterRS_" + mi + " = 1.5;" + "\nshapeParameterRS_" + mi + ":>1;\n";
+} 
+
+rateStrMx    = {rateClassCount,1};
+rateStrMx[0] = "shapeParameterRS_1";
+rateStrMx[1] = "1";
+
+for (mi=3; mi<=rateClassCount; mi=mi+1)
+{
+	rateStrMx[mi-1] = rateStrMx[mi-2]+"*shapeParameterRS_"+mi;
+} 	
+
+freqStrMx    = {rateClassCount,1};
+freqStrMx[0] = "shapeParameterPS_1";
+
+for (mi=1; mi<rateClassCount-1; mi=mi+1)
+{
+	freqStrMx[mi] = "";
+	for (mi2=1;mi2<=mi;mi2=mi2+1)
+	{
+		freqStrMx[mi] = freqStrMx[mi]+"(1-shapeParameterPS_"+mi2+")";		
+	}
+	freqStrMx[mi] = freqStrMx[mi]+"shapeParameterPS_"+(mi+1);	
+}	
+
+freqStrMx[mi] = "";
+for (mi2=1;mi2<mi;mi2=mi2+1)
+{
+	freqStrMx[mi] = freqStrMx[mi]+"(1-shapeParameterPS_"+mi2+")";		
+}
+freqStrMx[mi] = freqStrMx[mi]+"(1-shapeParameterPS_"+mi+")";	
+
+executeMePlease = executeMePlease + "\n\nglobal shapeParameterScale:="+rateStrMx[0]+"*"+freqStrMx[0];
+
+for (mi=1; mi<rateClassCount; mi=mi+1)
+{
+	executeMePlease = executeMePlease + "+" + rateStrMx[mi] + "*" + freqStrMx[mi];
+}
+
+
+executeMePlease = executeMePlease + ";\nshapeParameterCFM={{" + freqStrMx[0];
+
+for (mi=1; mi<rateClassCount; mi=mi+1)
+{
+	executeMePlease = executeMePlease + "," + freqStrMx[mi];
+}
+
+executeMePlease = executeMePlease + "}};\nshapeParameterCRM={{" + rateStrMx[0] + "/shapeParameterScale";
+
+for (mi=1; mi<rateClassCount; mi=mi+1)
+{
+	executeMePlease = executeMePlease +  "," + rateStrMx[mi] + "/shapeParameterScale";
+}
+
+executeMePlease = executeMePlease + "}};\n\ncategory categoryPlaceholder   = (" + rateClassCount + ", shapeParameterCFM , MEAN, ,shapeParameterCRM, 0, 1e25);\n\n";
+ExecuteCommands (executeMePlease);
+executeMePlease = "";
diff --git a/res/SubstitutionClasses/Heterogeneity/Half Normal b/res/SubstitutionClasses/Heterogeneity/Half Normal
new file mode 100644
index 0000000..0f1cfbe
--- /dev/null
+++ b/res/SubstitutionClasses/Heterogeneity/Half Normal	
@@ -0,0 +1,14 @@
+global shapeParameterMu = 1;
+global shapeParameterSigma  = .5;
+shapeParameterSigma:>0.0001;
+
+sqrt2pi = Sqrt(8*Arctan(1));
+category categoryPlaceholder = (rateClassCount, EQUAL, MEAN, 
+							 Exp((_x_-shapeParameterMu)(shapeParameterMu-_x_)/(2*shapeParameterSigma*shapeParameterSigma))/(sqrt2pi__*shapeParameterSigma)/ZCDF(shapeParameterMu/shapeParameterSigma), /* density */
+							 (1-ZCDF((shapeParameterMu-_x_)/shapeParameterSigma))/ZCDF(shapeParameterMu/shapeParameterSigma), /*CDF*/
+							  0, 				   /*left bound*/
+							 1e25, 			   /*right bound*/
+							 (shapeParameterMu*(1-ZCDF(-shapeParameterMu/shapeParameterSigma)-ZCDF((shapeParameterMu-_x_)/shapeParameterSigma))+
+			    			 shapeParameterSigma*(Exp(-shapeParameterMu*shapeParameterMu/(2*shapeParameterSigma*shapeParameterSigma))-
+			    			 Exp((_x_-shapeParameterMu)(shapeParameterMu-_x_)/(2*shapeParameterSigma*shapeParameterSigma)))/sqrt2pi__)/ZCDF(shapeParameterMu/shapeParameterSigma)
+		  	 				);
diff --git a/res/SubstitutionClasses/Heterogeneity/Lognormal b/res/SubstitutionClasses/Heterogeneity/Lognormal
new file mode 100644
index 0000000..fc4f8e4
--- /dev/null
+++ b/res/SubstitutionClasses/Heterogeneity/Lognormal
@@ -0,0 +1,11 @@
+global shapeParameterSigma = .1;
+shapeParameterSigma:>0.0001;shapeParameterSigma:<10;
+sqrt2pi = Sqrt(8*Arctan(1));
+global _x_:<1e200;
+category categoryPlaceholder = (rateClassCount, EQUAL, MEAN, 
+				Exp (-Log(_x_)*Log(_x_) / (2*shapeParameterSigma*shapeParameterSigma)) / (_x_*shapeParameterSigma*sqrt2pi__), /*density*/
+				ZCDF (Log(_x_)/shapeParameterSigma), /*CDF*/
+				1e-200, 			   /*left bound*/
+				1e200, 			       /*right bound*/
+		  	    Exp (.5*shapeParameterSigma^2)*ZCDF (Log(_x_)/shapeParameterSigma-shapeParameterSigma)
+		  	 );
diff --git a/res/SubstitutionClasses/NucEFV/Equal b/res/SubstitutionClasses/NucEFV/Equal
new file mode 100644
index 0000000..5603006
--- /dev/null
+++ b/res/SubstitutionClasses/NucEFV/Equal
@@ -0,0 +1,3 @@
+Model_EFV_Vector  = {{.25,.25,.25,.25}};
+MULTIPLY_BY_FREQS = 1;
+
diff --git a/res/SubstitutionClasses/NucEFV/Estimated b/res/SubstitutionClasses/NucEFV/Estimated
new file mode 100644
index 0000000..c6e5e91
--- /dev/null
+++ b/res/SubstitutionClasses/NucEFV/Estimated
@@ -0,0 +1,23 @@
+function GUIHandleFrequenciesCollection (dummy_parameter)
+{
+	HarvestFrequencies (Model_EFV_Vector,Data_Partition_ID,1,1,1);
+
+	global frequencyVariable_1;
+	global frequencyVariable_2;
+	global frequencyVariable_3;
+
+	/* Initial Guesses */
+
+	frequencyVariable_1 = Model_EFV_Vector[0];
+	frequencyVariable_2 = Model_EFV_Vector[1]/(1-frequencyVariable_1);
+	frequencyVariable_3 = Model_EFV_Vector[2]/(1-frequencyVariable_1)/(1-frequencyVariable_2);
+
+
+	Model_EFV_Vector = {{frequencyVariable_1},
+					 {(1-frequencyVariable_1)*frequencyVariable_2},
+					 {(1-frequencyVariable_1)*(1-frequencyVariable_2)*frequencyVariable_3},
+					 {(1-frequencyVariable_1)*(1-frequencyVariable_2)*(1-frequencyVariable_3)}};
+					
+	MULTIPLY_BY_FREQS = 1;
+	return 	0;
+}
diff --git a/res/SubstitutionClasses/NucEFV/Observed In Data Set b/res/SubstitutionClasses/NucEFV/Observed In Data Set
new file mode 100644
index 0000000..ab3aa86
--- /dev/null
+++ b/res/SubstitutionClasses/NucEFV/Observed In Data Set	
@@ -0,0 +1,7 @@
+function GUIHandleFrequenciesCollection (dummy_parameter)
+{
+	HarvestFrequencies (Model_EFV_Vector,Data_Set_ID,1,1,1);
+	MULTIPLY_BY_FREQS = 1;
+
+	return 	0;
+}
diff --git a/res/SubstitutionClasses/NucEFV/Observed In Partition b/res/SubstitutionClasses/NucEFV/Observed In Partition
new file mode 100644
index 0000000..626e503
--- /dev/null
+++ b/res/SubstitutionClasses/NucEFV/Observed In Partition	
@@ -0,0 +1,8 @@
+function GUIHandleFrequenciesCollection (dummy_parameter)
+{
+	HarvestFrequencies (Model_EFV_Vector,Data_Partition_ID,1,1,1);
+	MULTIPLY_BY_FREQS = 1;
+
+	return 	0;
+}
+
diff --git a/res/SubstitutionClasses/aa.bf b/res/SubstitutionClasses/aa.bf
new file mode 100644
index 0000000..a4bcf48
--- /dev/null
+++ b/res/SubstitutionClasses/aa.bf
@@ -0,0 +1,137 @@
+/* 
+0  - A (Alanine)
+1  - C (Cysteine)
+2  - D (Aspartic Acid)
+3  - E (Glutamin Acid)
+4  - F (Phenylalanine)
+5  - G (Glycine)
+6  - H (Histidine)
+7  - I (Isoleucine)
+8  - K (Lysine)
+9  - L (Leucine)
+10 - M (Methionine)
+11 - N (Asparagine)
+12 - P (Prolone)
+13 - Q (Glutamine)
+14 - R (Arginine)
+15 - S (Serine)
+16 - T (Threonine)
+17 - V (Valine)
+18 - W (Tryptophan)
+19 - Y (Tyrosine)
+*/
+
+
+SubClassNames = {{
+	"Hydrophobic",
+	"Hydrophilic",
+	"Charged[+]",
+	"Charged[-]",
+	"Neutral",
+	"Polar",
+	"Aliphatic",
+	"Aromatic",
+	"All"
+}};
+
+function CreateSubClasses (classID)
+{
+	if (classID==0) /*hydrophobic*/
+	{
+		MatrixTemplate = {{0,1,4,7,9,10,12,17,18,19}};
+	}
+	else
+	{
+		if (classID==1) /*hydrophilic*/
+		{
+			MatrixTemplate = {{2,3,6,8,11,13,14,15,16}};
+		}
+		else
+		{
+			if (classID==2) /* charged (+) */
+			{
+				MatrixTemplate = {{6,8,14}};
+			}
+			else
+			{
+				if (classID==3) /* charged (-) */
+				{
+					MatrixTemplate = {{2,3}};
+				}
+				else
+				{
+					if (classID==4) /* neutral */
+					{
+						MatrixTemplate = {{0,1,4,5,7,9,10,11,12,13,15,16,17,18}};
+					}
+					else
+					{
+						if (classID==5) /* polar */
+						{
+							MatrixTemplate = {{1,2,3,6,8,11,13,14,15,16,19}};
+						}
+						else
+						{
+							if (classID==6) /* alpihatic */
+							{
+								MatrixTemplate = {{0,5,7,9,17}};
+							}
+							else
+							{
+								if (classID==7) /* aromatic */
+								{
+									MatrixTemplate = {{4,6,18,19}};
+								}
+								else
+								{
+									if (classID==8) /* neutral */
+									{
+										MatrixTemplate = {{0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19}};
+									}
+								}
+							}
+						}
+					}
+				}
+			}
+		}
+	}
+	return 0;
+}
+
+/*SubClassNames = {{
+	"Hydrophobic",
+	"Charged",
+	"Polar",
+	"All"
+}};
+
+function CreateSubClasses (classID)
+{
+	if (classID==0)
+	{
+		MatrixTemplate = {{0,4,7,9,10,12,17}};
+	}
+	else
+	{
+		if (classID==1)
+		{
+			MatrixTemplate = {{2,3,8,14}};
+		}
+		else
+		{
+			if (classID==2)
+			{
+				MatrixTemplate = {{1,6,11,13,15,16,18,19}};
+			}
+			else
+			{
+				if (classID==3)
+				{
+					MatrixTemplate = {{0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19}};
+				}
+			}
+		}
+	}
+	return 0;
+}*/
diff --git a/res/SubstitutionClasses/codon.bf b/res/SubstitutionClasses/codon.bf
new file mode 100644
index 0000000..1631e2a
--- /dev/null
+++ b/res/SubstitutionClasses/codon.bf
@@ -0,0 +1,374 @@
+ModelGeneticCode = {
+		{14, 13, 14,  13,
+		  7,  7,  7,   7, 
+		 19,  5, 19,   5, 
+		  2,  2, 	3,   2, 
+		 12, 11, 12,  11,
+		  6,  6,  6,   6, 
+		 19, 19, 19,  19,
+		  1,  1,  1,   1, 
+		 16, 15, 16,  15,
+		  8,  8,  8,   8, 
+		 20, 20, 20,  20,
+		  4,  4,  4,   4, 
+		 10,  9, 10,   9, 
+		  5,  5,  5,   5, 
+		 10, 17, 18,  17,
+		  1,  0,  1,   0 }
+};
+
+ModelGeneticCodeSize = 64;
+
+for (h=0; h<64; h=h+1)
+{
+	if (ModelGeneticCode[h]==10)
+	{
+		ModelGeneticCodeSize=ModelGeneticCodeSize-1;
+	}
+}
+
+TemplateNames = {{
+	"One-step",
+	"Two-step",
+	"Three-step",
+	"Synonymous",
+	"Non-synonymous",
+	"1-step Transitions",
+	"1-step Transversions",
+	"A-C",
+	"A-G",
+	"A-T",
+	"C-G",
+	"C-T",
+	"G-T"
+}};
+
+SubClassNames = {{
+	"Alanin",
+	"Arginine",
+	"Asparagine",
+	"Aspartic Acid",
+	"Cysteine",
+	"Glutamin Acid",
+	"Glutamine",
+	"Glycine",
+	"Histidine",
+	"Isoleucine",
+	"Leucine",
+	"Lysine",
+	"Methionine",
+	"Phenylalanine",
+	"Proline",
+	"Serine",
+	"Threonine",
+	"Tryptophan",
+	"Tyrosine",
+	"Valine",
+	"Hydrophobic",
+	"Charged",
+	"Polar"
+}};
+
+function CreateTemplates (classID)
+{
+	vShift = 0;
+	hShift = 0;
+	MatrixTemplate = {ModelGeneticCodeSize*ModelGeneticCodeSize,1};
+	matchCount = 0;
+
+	if (classID < 3)
+	{
+		for (h=0; h<63; h=h+1)
+		{
+			if (ModelGeneticCode[h]==10)
+			{
+				hShift = hShift+1;
+				continue;
+			}
+			
+			vShift = hShift;
+			
+			for (v=h+1; v<64; v=v+1)
+			{
+				if (ModelGeneticCode[v]==10)
+				{
+					vShift = vShift+1;
+					continue;
+				}
+				
+				posCount = (h%4!=v%4)+(h$16!=v$16)+(h%16$4!=v%16$4)-1;
+								
+				if (posCount == classID)
+				{
+					MatrixTemplate[matchCount] = (h-hShift)*ModelGeneticCodeSize + v-vShift;
+					matchCount = matchCount+1;
+					MatrixTemplate[matchCount] = (v-vShift)*ModelGeneticCodeSize + h-hShift;
+					matchCount = matchCount+1;
+				}
+			}
+		}
+	}
+	else
+	{
+		if (classID<5)
+		{
+			classID = 4-classID;
+			for (h=0; h<63; h=h+1)
+			{
+				if (ModelGeneticCode[h]==10)
+				{
+					hShift = hShift+1;
+					continue;
+				}
+				vShift = hShift;
+				for (v=h+1; v<64; v=v+1)
+				{
+					if (ModelGeneticCode[v]==10)
+					{
+						vShift = vShift+1;
+						continue;
+					}
+					if ((ModelGeneticCode[v]==ModelGeneticCode[h])==classID)
+					{
+						MatrixTemplate[matchCount] = (h-hShift)*ModelGeneticCodeSize + v-vShift;
+						matchCount = matchCount+1;
+						MatrixTemplate[matchCount] = (v-vShift)*ModelGeneticCodeSize + h-hShift;
+						matchCount = matchCount+1;
+					}
+				}
+			}
+		}
+		else
+		{
+			if (classID < 7)
+			{
+				for (h=0; h<63; h=h+1)
+				{
+					if (ModelGeneticCode[h]==10)
+					{
+						hShift = hShift+1;
+						continue;
+					}
+					
+					vShift = hShift;
+					for (v=h+1; v<64; v=v+1)
+					{
+						if (ModelGeneticCode[v]==10)
+						{
+							vShift = vShift+1;
+							continue;
+						}
+						diff = v-h;
+						if ((h$4==v$4)||((diff%4==0)&&(h$16==v$16))||(diff%16==0))
+						{
+							if (diff>=4)
+							{
+								if (diff<16)
+								{
+									diff = diff$4;
+								}
+								else
+								{
+									diff = diff$16;
+								}
+							}
+						}
+						else
+						{
+							continue;
+						}
+						
+						if ((diff%2)==classID-5)
+						{
+							MatrixTemplate[matchCount] = (h-hShift)*ModelGeneticCodeSize + v-vShift;
+							matchCount = matchCount+1;
+							MatrixTemplate[matchCount] = (v-vShift)*ModelGeneticCodeSize + h-hShift;
+							matchCount = matchCount+1;
+						}
+					}
+				}
+			}
+			else
+			{
+				if (classID < 13)
+				{
+					
+					m11 = 0;
+					if (classID>=10)
+					{
+						if (classID<12)
+						{
+							m11 = 1;
+						}
+						else
+						{
+							m11 = 2;
+						}
+					}
+					
+					m22 = 3;
+					if (classID==7)
+					{
+						m22 = 1;
+					}
+					else
+					{
+						if ((classID==8)||(classID==10))
+						{
+							m22 = 2;
+						}
+					}
+					
+					
+					for (h=0; h<63; h=h+1)
+					{
+						if (ModelGeneticCode[h]==10)
+						{
+							hShift = hShift+1;
+							continue;
+						}
+						
+						vShift = hShift;
+						for (v=h+1; v<64; v=v+1)
+						{
+							if (ModelGeneticCode[v]==10)
+							{
+								vShift = vShift+1;
+								continue;
+							}
+							
+							diff = v-h;
+							p11  = h%4;
+							p21  = v%4;
+							p12  = (h%16)$4;
+							p22  = (v%16)$4;
+							p13  = h$16;
+							p23  = v$16;
+							
+							if (((p11==m11)&&(p21==m22))||((p12==m11)&&(p22==m22))||((p13==m11)&&(p23==m22)))
+							{
+								MatrixTemplate[matchCount] = (h-hShift)*ModelGeneticCodeSize + v-vShift;
+								matchCount = matchCount+1;
+								MatrixTemplate[matchCount] = (v-vShift)*ModelGeneticCodeSize + h-hShift;
+								matchCount = matchCount+1;
+							}
+						}
+					}
+				}
+			}
+		}
+		
+	}
+	return 0;
+}
+
+NumberToIndex = {{
+8,
+19,
+13,
+15,
+17,
+16,
+12,
+20,
+11,
+2,
+1,
+14,
+3,
+0,
+6,
+5,
+7,
+18,
+9,
+4
+}};
+
+function CreateSubClasses (classID)
+{
+	hShift = 0;
+	MatrixTemplate = {ModelGeneticCodeSize,1};
+	matchCount = 0;
+	if (classID<20)
+	{
+		v = NumberToIndex [classID];
+		for (h=0; h<64; h=h+1)
+		{
+			if (ModelGeneticCode[h-hShift]==10)
+			{
+				hShift = hShift+1;
+				continue;
+			}
+			if (v==ModelGeneticCode[h-hShift])
+			{
+				MatrixTemplate[matchCount] = h-hShift;
+				matchCount = matchCount+1;
+			}
+		}
+	}
+	else
+	{
+		if (classID==20)
+		{
+			for (h=0; h<64; h=h+1)
+			{
+				vShift = ModelGeneticCode[h-hShift];
+				if (vShift==10)
+				{
+					hShift = hShift+1;
+					continue;
+				}
+				if ((vShift==8)||(vShift==4)||(vShift==0)||(vShift==6)||(vShift==2)||(vShift==1))
+				{
+					MatrixTemplate[matchCount] = h-hShift;
+					matchCount = matchCount+1;
+				}
+			}
+		
+		}
+		else
+		{
+			if (classID==21)
+			{
+				for (h=0; h<64; h=h+1)
+				{
+					vShift = ModelGeneticCode[h-hShift];
+					if (vShift==10)
+					{
+						hShift = hShift+1;
+						continue;
+					}
+					if ( (vShift==13)||(vShift==16)||(vShift==14)||(vShift==19))
+					{
+						MatrixTemplate[matchCount] = h-hShift;
+						matchCount = matchCount+1;
+					}
+				}
+			
+			}
+			else
+			{
+				if (classID==22)
+				{
+					for (h=0; h<64; h=h+1)
+					{
+						vShift = ModelGeneticCode[h-hShift];
+						if (vShift==10)
+						{
+							hShift = hShift+1;
+							continue;
+						}
+						if ( (vShift==5)||(vShift==7)||(vShift==9)||(vShift==11)||(vShift==17)||(vShift==13)||(vShift==12)||(vShift==18))
+						{
+							MatrixTemplate[matchCount] = h-hShift;
+							matchCount = matchCount+1;
+						}
+					}
+				
+				}
+			}
+		}
+	}
+	return 0;
+}
diff --git a/res/SubstitutionClasses/dinuc.bf b/res/SubstitutionClasses/dinuc.bf
new file mode 100644
index 0000000..4ca40e9
--- /dev/null
+++ b/res/SubstitutionClasses/dinuc.bf
@@ -0,0 +1,103 @@
+TemplateNames = {{
+	"One-step",
+	"Two-step",
+	"1-step Transitions",
+	"1-step Transversions"
+}};
+
+
+function CreateTemplates (classID)
+{
+	MatrixTemplate = {240,1};
+	matchCount = 0;
+
+	if (classID < 2)
+	{
+		for (h=0; h<15; h=h+1)
+		{
+			for (v=h+1; v<16; v=v+1)
+			{
+				posCount = (h%4!=v%4)+(h$4!=v$4)-1;
+								
+				if (posCount == classID)
+				{
+					MatrixTemplate[matchCount] = h*16 + v;
+					matchCount = matchCount+1;
+					MatrixTemplate[matchCount] = v*16 + h;
+					matchCount = matchCount+1;
+				}
+			}
+		}
+	}
+	else
+	{
+		if (classID < 4)
+		{
+			for (h=0; h<15; h=h+1)
+			{
+				for (v=h+1; v<16; v=v+1)
+				{
+					diff = v-h;
+					if ((h$4==v$4)||(h%4==v%4))
+					{
+						if (diff>=4)
+						{
+							diff = diff$4;
+						}
+					}
+					else
+					{
+						continue;
+					}
+					
+					if ((diff%2)==classID-2)
+					{
+						MatrixTemplate[matchCount] = h*16 + v;
+						matchCount = matchCount+1;
+						MatrixTemplate[matchCount] = v*16 + h;
+						matchCount = matchCount+1;
+					}
+				}
+			}
+		}
+	}
+	return 0;
+}
+
+SubClassNames = {{
+	"Purines-1",
+	"Purines-2",
+	"Pyrimidines-1",
+	"Pyrimidines-2"
+}};
+
+function CreateSubClasses (classID)
+{
+	if (classID==0)
+	{
+		MatrixTemplate = {{0,1,2,3,8,9,10,11}};
+	}
+	else
+	{
+		if (classID==2)
+		{
+			MatrixTemplate = {{4,5,6,7,12,13,14,15}};
+		}
+		else
+		{
+			if (classID==1)
+			{
+				MatrixTemplate = {{0,2,4,6,8,10,12,14}};
+			}
+			else
+			{
+				if (classID==3)
+				{
+					MatrixTemplate = {{1,3,5,7,9,11,13,15}};
+				}
+			}
+		}
+	}
+	return 0;
+}
+
diff --git a/res/SubstitutionClasses/nuc.bf b/res/SubstitutionClasses/nuc.bf
new file mode 100644
index 0000000..a8e48d5
--- /dev/null
+++ b/res/SubstitutionClasses/nuc.bf
@@ -0,0 +1,41 @@
+TemplateNames = {{
+	"Transitions",
+	"Transversions"
+}};
+
+SubClassNames = {{
+	"Purines",
+	"Pyrimidines"
+}};
+
+function CreateTemplates (classID)
+{
+	if (classID==0)
+	{	
+		MatrixTemplate = {{2,7,8,13}};
+	}
+	else
+	{
+		if (classID==1)
+		{
+			MatrixTemplate = {{1,3,4,6,9,11,12,14}};
+		}
+	}
+	return 0;
+}
+
+function CreateSubClasses (classID)
+{
+	if (classID==0)
+	{
+		MatrixTemplate = {{0,2}};
+	}
+	else
+	{
+		if (classID==1)
+		{
+			MatrixTemplate = {{1,3}};
+		}
+	}
+	return 0;
+}
diff --git a/res/SubstitutionModels/Aminoacid/Dayhoff.mdl b/res/SubstitutionModels/Aminoacid/Dayhoff.mdl
new file mode 100644
index 0000000..1eeb254
--- /dev/null
+++ b/res/SubstitutionModels/Aminoacid/Dayhoff.mdl
@@ -0,0 +1,348 @@
+Model_Name  		= "Dayhoff";
+Model_EFV_Type		= "User Defined Vector";
+Model_Options 		= 8;
+Model_Dimension 	= 20;
+Model_Data_Type		= 1;
+
+function GUIPopulateModelMatrix (ModelMatrixName&, EFV)
+{
+
+	ModelMatrixName = {20,20};
+	ModelMatrixName[0][1]:=t*0.036;
+	ModelMatrixName[0][2]:=t*0.12;
+	ModelMatrixName[0][3]:=t*0.198;
+	ModelMatrixName[0][4]:=t*0.018;
+	ModelMatrixName[0][5]:=t*0.24;
+	ModelMatrixName[0][6]:=t*0.023;
+	ModelMatrixName[0][7]:=t*0.065;
+	ModelMatrixName[0][8]:=t*0.026;
+	ModelMatrixName[0][9]:=t*0.041;
+	ModelMatrixName[0][10]:=t*0.072;
+	ModelMatrixName[0][11]:=t*0.098;
+	ModelMatrixName[0][12]:=t*0.25;
+	ModelMatrixName[0][13]:=t*0.089;
+	ModelMatrixName[0][14]:=t*0.027;
+	ModelMatrixName[0][15]:=t*0.409;
+	ModelMatrixName[0][16]:=t*0.371;
+	ModelMatrixName[0][17]:=t*0.208;
+	ModelMatrixName[0][19]:=t*0.024;
+	ModelMatrixName[1][0]:=t*0.036;
+	ModelMatrixName[1][5]:=t*0.011;
+	ModelMatrixName[1][6]:=t*0.028;
+	ModelMatrixName[1][7]:=t*0.044;
+	ModelMatrixName[1][12]:=t*0.019;
+	ModelMatrixName[1][14]:=t*0.023;
+	ModelMatrixName[1][15]:=t*0.161;
+	ModelMatrixName[1][16]:=t*0.016;
+	ModelMatrixName[1][17]:=t*0.049;
+	ModelMatrixName[1][19]:=t*0.096;
+	ModelMatrixName[2][0]:=t*0.12;
+	ModelMatrixName[2][3]:=t*1.153;
+	ModelMatrixName[2][5]:=t*0.125;
+	ModelMatrixName[2][6]:=t*0.086;
+	ModelMatrixName[2][7]:=t*0.024;
+	ModelMatrixName[2][8]:=t*0.071;
+	ModelMatrixName[2][11]:=t*0.905;
+	ModelMatrixName[2][12]:=t*0.013;
+	ModelMatrixName[2][13]:=t*0.134;
+	ModelMatrixName[2][15]:=t*0.095;
+	ModelMatrixName[2][16]:=t*0.066;
+	ModelMatrixName[2][17]:=t*0.018;
+	ModelMatrixName[3][0]:=t*0.198;
+	ModelMatrixName[3][2]:=t*1.153;
+	ModelMatrixName[3][5]:=t*0.081;
+	ModelMatrixName[3][6]:=t*0.043;
+	ModelMatrixName[3][7]:=t*0.061;
+	ModelMatrixName[3][8]:=t*0.083;
+	ModelMatrixName[3][9]:=t*0.011;
+	ModelMatrixName[3][10]:=t*0.03;
+	ModelMatrixName[3][11]:=t*0.148;
+	ModelMatrixName[3][12]:=t*0.051;
+	ModelMatrixName[3][13]:=t*0.716;
+	ModelMatrixName[3][14]:=t*0.001;
+	ModelMatrixName[3][15]:=t*0.079;
+	ModelMatrixName[3][16]:=t*0.034;
+	ModelMatrixName[3][17]:=t*0.037;
+	ModelMatrixName[3][19]:=t*0.022;
+	ModelMatrixName[4][0]:=t*0.018;
+	ModelMatrixName[4][5]:=t*0.015;
+	ModelMatrixName[4][6]:=t*0.048;
+	ModelMatrixName[4][7]:=t*0.196;
+	ModelMatrixName[4][9]:=t*0.157;
+	ModelMatrixName[4][10]:=t*0.092;
+	ModelMatrixName[4][11]:=t*0.014;
+	ModelMatrixName[4][12]:=t*0.011;
+	ModelMatrixName[4][14]:=t*0.014;
+	ModelMatrixName[4][15]:=t*0.046;
+	ModelMatrixName[4][16]:=t*0.013;
+	ModelMatrixName[4][17]:=t*0.012;
+	ModelMatrixName[4][18]:=t*0.076;
+	ModelMatrixName[4][19]:=t*0.698;
+	ModelMatrixName[5][0]:=t*0.24;
+	ModelMatrixName[5][1]:=t*0.011;
+	ModelMatrixName[5][2]:=t*0.125;
+	ModelMatrixName[5][3]:=t*0.081;
+	ModelMatrixName[5][4]:=t*0.015;
+	ModelMatrixName[5][6]:=t*0.01;
+	ModelMatrixName[5][8]:=t*0.027;
+	ModelMatrixName[5][9]:=t*0.007;
+	ModelMatrixName[5][10]:=t*0.017;
+	ModelMatrixName[5][11]:=t*0.139;
+	ModelMatrixName[5][12]:=t*0.034;
+	ModelMatrixName[5][13]:=t*0.028;
+	ModelMatrixName[5][14]:=t*0.009;
+	ModelMatrixName[5][15]:=t*0.234;
+	ModelMatrixName[5][16]:=t*0.03;
+	ModelMatrixName[5][17]:=t*0.054;
+	ModelMatrixName[6][0]:=t*0.023;
+	ModelMatrixName[6][1]:=t*0.028;
+	ModelMatrixName[6][2]:=t*0.086;
+	ModelMatrixName[6][3]:=t*0.043;
+	ModelMatrixName[6][4]:=t*0.048;
+	ModelMatrixName[6][5]:=t*0.01;
+	ModelMatrixName[6][7]:=t*0.007;
+	ModelMatrixName[6][8]:=t*0.026;
+	ModelMatrixName[6][9]:=t*0.044;
+	ModelMatrixName[6][11]:=t*0.535;
+	ModelMatrixName[6][12]:=t*0.094;
+	ModelMatrixName[6][13]:=t*0.606;
+	ModelMatrixName[6][14]:=t*0.24;
+	ModelMatrixName[6][15]:=t*0.035;
+	ModelMatrixName[6][16]:=t*0.022;
+	ModelMatrixName[6][17]:=t*0.044;
+	ModelMatrixName[6][18]:=t*0.027;
+	ModelMatrixName[6][19]:=t*0.127;
+	ModelMatrixName[7][0]:=t*0.065;
+	ModelMatrixName[7][1]:=t*0.044;
+	ModelMatrixName[7][2]:=t*0.024;
+	ModelMatrixName[7][3]:=t*0.061;
+	ModelMatrixName[7][4]:=t*0.196;
+	ModelMatrixName[7][6]:=t*0.007;
+	ModelMatrixName[7][8]:=t*0.046;
+	ModelMatrixName[7][9]:=t*0.257;
+	ModelMatrixName[7][10]:=t*0.336;
+	ModelMatrixName[7][11]:=t*0.077;
+	ModelMatrixName[7][12]:=t*0.012;
+	ModelMatrixName[7][13]:=t*0.018;
+	ModelMatrixName[7][14]:=t*0.064;
+	ModelMatrixName[7][15]:=t*0.024;
+	ModelMatrixName[7][16]:=t*0.192;
+	ModelMatrixName[7][17]:=t*0.889;
+	ModelMatrixName[7][19]:=t*0.037;
+	ModelMatrixName[8][0]:=t*0.026;
+	ModelMatrixName[8][2]:=t*0.071;
+	ModelMatrixName[8][3]:=t*0.083;
+	ModelMatrixName[8][5]:=t*0.027;
+	ModelMatrixName[8][6]:=t*0.026;
+	ModelMatrixName[8][7]:=t*0.046;
+	ModelMatrixName[8][9]:=t*0.018;
+	ModelMatrixName[8][10]:=t*0.243;
+	ModelMatrixName[8][11]:=t*0.318;
+	ModelMatrixName[8][12]:=t*0.033;
+	ModelMatrixName[8][13]:=t*0.153;
+	ModelMatrixName[8][14]:=t*0.464;
+	ModelMatrixName[8][15]:=t*0.096;
+	ModelMatrixName[8][16]:=t*0.136;
+	ModelMatrixName[8][17]:=t*0.01;
+	ModelMatrixName[8][19]:=t*0.013;
+	ModelMatrixName[9][0]:=t*0.041;
+	ModelMatrixName[9][3]:=t*0.011;
+	ModelMatrixName[9][4]:=t*0.157;
+	ModelMatrixName[9][5]:=t*0.007;
+	ModelMatrixName[9][6]:=t*0.044;
+	ModelMatrixName[9][7]:=t*0.257;
+	ModelMatrixName[9][8]:=t*0.018;
+	ModelMatrixName[9][10]:=t*0.527;
+	ModelMatrixName[9][11]:=t*0.034;
+	ModelMatrixName[9][12]:=t*0.032;
+	ModelMatrixName[9][13]:=t*0.073;
+	ModelMatrixName[9][14]:=t*0.015;
+	ModelMatrixName[9][15]:=t*0.017;
+	ModelMatrixName[9][16]:=t*0.033;
+	ModelMatrixName[9][17]:=t*0.175;
+	ModelMatrixName[9][18]:=t*0.046;
+	ModelMatrixName[9][19]:=t*0.028;
+	ModelMatrixName[10][0]:=t*0.072;
+	ModelMatrixName[10][3]:=t*0.03;
+	ModelMatrixName[10][4]:=t*0.092;
+	ModelMatrixName[10][5]:=t*0.017;
+	ModelMatrixName[10][7]:=t*0.336;
+	ModelMatrixName[10][8]:=t*0.243;
+	ModelMatrixName[10][9]:=t*0.527;
+	ModelMatrixName[10][11]:=t*0.001;
+	ModelMatrixName[10][12]:=t*0.017;
+	ModelMatrixName[10][13]:=t*0.114;
+	ModelMatrixName[10][14]:=t*0.09;
+	ModelMatrixName[10][15]:=t*0.062;
+	ModelMatrixName[10][16]:=t*0.104;
+	ModelMatrixName[10][17]:=t*0.258;
+	ModelMatrixName[11][0]:=t*0.098;
+	ModelMatrixName[11][2]:=t*0.905;
+	ModelMatrixName[11][3]:=t*0.148;
+	ModelMatrixName[11][4]:=t*0.014;
+	ModelMatrixName[11][5]:=t*0.139;
+	ModelMatrixName[11][6]:=t*0.535;
+	ModelMatrixName[11][7]:=t*0.077;
+	ModelMatrixName[11][8]:=t*0.318;
+	ModelMatrixName[11][9]:=t*0.034;
+	ModelMatrixName[11][10]:=t*0.001;
+	ModelMatrixName[11][12]:=t*0.042;
+	ModelMatrixName[11][13]:=t*0.103;
+	ModelMatrixName[11][14]:=t*0.032;
+	ModelMatrixName[11][15]:=t*0.495;
+	ModelMatrixName[11][16]:=t*0.229;
+	ModelMatrixName[11][17]:=t*0.015;
+	ModelMatrixName[11][18]:=t*0.023;
+	ModelMatrixName[11][19]:=t*0.095;
+	ModelMatrixName[12][0]:=t*0.25;
+	ModelMatrixName[12][1]:=t*0.019;
+	ModelMatrixName[12][2]:=t*0.013;
+	ModelMatrixName[12][3]:=t*0.051;
+	ModelMatrixName[12][4]:=t*0.011;
+	ModelMatrixName[12][5]:=t*0.034;
+	ModelMatrixName[12][6]:=t*0.094;
+	ModelMatrixName[12][7]:=t*0.012;
+	ModelMatrixName[12][8]:=t*0.033;
+	ModelMatrixName[12][9]:=t*0.032;
+	ModelMatrixName[12][10]:=t*0.017;
+	ModelMatrixName[12][11]:=t*0.042;
+	ModelMatrixName[12][13]:=t*0.153;
+	ModelMatrixName[12][14]:=t*0.103;
+	ModelMatrixName[12][15]:=t*0.245;
+	ModelMatrixName[12][16]:=t*0.078;
+	ModelMatrixName[12][17]:=t*0.048;
+	ModelMatrixName[13][0]:=t*0.089;
+	ModelMatrixName[13][2]:=t*0.134;
+	ModelMatrixName[13][3]:=t*0.716;
+	ModelMatrixName[13][5]:=t*0.028;
+	ModelMatrixName[13][6]:=t*0.606;
+	ModelMatrixName[13][7]:=t*0.018;
+	ModelMatrixName[13][8]:=t*0.153;
+	ModelMatrixName[13][9]:=t*0.073;
+	ModelMatrixName[13][10]:=t*0.114;
+	ModelMatrixName[13][11]:=t*0.103;
+	ModelMatrixName[13][12]:=t*0.153;
+	ModelMatrixName[13][14]:=t*0.246;
+	ModelMatrixName[13][15]:=t*0.056;
+	ModelMatrixName[13][16]:=t*0.053;
+	ModelMatrixName[13][17]:=t*0.035;
+	ModelMatrixName[14][0]:=t*0.027;
+	ModelMatrixName[14][1]:=t*0.023;
+	ModelMatrixName[14][3]:=t*0.001;
+	ModelMatrixName[14][4]:=t*0.014;
+	ModelMatrixName[14][5]:=t*0.009;
+	ModelMatrixName[14][6]:=t*0.24;
+	ModelMatrixName[14][7]:=t*0.064;
+	ModelMatrixName[14][8]:=t*0.464;
+	ModelMatrixName[14][9]:=t*0.015;
+	ModelMatrixName[14][10]:=t*0.09;
+	ModelMatrixName[14][11]:=t*0.032;
+	ModelMatrixName[14][12]:=t*0.103;
+	ModelMatrixName[14][13]:=t*0.246;
+	ModelMatrixName[14][15]:=t*0.154;
+	ModelMatrixName[14][16]:=t*0.026;
+	ModelMatrixName[14][17]:=t*0.024;
+	ModelMatrixName[14][18]:=t*0.201;
+	ModelMatrixName[14][19]:=t*0.008;
+	ModelMatrixName[15][0]:=t*0.409;
+	ModelMatrixName[15][1]:=t*0.161;
+	ModelMatrixName[15][2]:=t*0.095;
+	ModelMatrixName[15][3]:=t*0.079;
+	ModelMatrixName[15][4]:=t*0.046;
+	ModelMatrixName[15][5]:=t*0.234;
+	ModelMatrixName[15][6]:=t*0.035;
+	ModelMatrixName[15][7]:=t*0.024;
+	ModelMatrixName[15][8]:=t*0.096;
+	ModelMatrixName[15][9]:=t*0.017;
+	ModelMatrixName[15][10]:=t*0.062;
+	ModelMatrixName[15][11]:=t*0.495;
+	ModelMatrixName[15][12]:=t*0.245;
+	ModelMatrixName[15][13]:=t*0.056;
+	ModelMatrixName[15][14]:=t*0.154;
+	ModelMatrixName[15][16]:=t*0.55;
+	ModelMatrixName[15][17]:=t*0.03;
+	ModelMatrixName[15][18]:=t*0.075;
+	ModelMatrixName[15][19]:=t*0.034;
+	ModelMatrixName[16][0]:=t*0.371;
+	ModelMatrixName[16][1]:=t*0.016;
+	ModelMatrixName[16][2]:=t*0.066;
+	ModelMatrixName[16][3]:=t*0.034;
+	ModelMatrixName[16][4]:=t*0.013;
+	ModelMatrixName[16][5]:=t*0.03;
+	ModelMatrixName[16][6]:=t*0.022;
+	ModelMatrixName[16][7]:=t*0.192;
+	ModelMatrixName[16][8]:=t*0.136;
+	ModelMatrixName[16][9]:=t*0.033;
+	ModelMatrixName[16][10]:=t*0.104;
+	ModelMatrixName[16][11]:=t*0.229;
+	ModelMatrixName[16][12]:=t*0.078;
+	ModelMatrixName[16][13]:=t*0.053;
+	ModelMatrixName[16][14]:=t*0.026;
+	ModelMatrixName[16][15]:=t*0.55;
+	ModelMatrixName[16][17]:=t*0.157;
+	ModelMatrixName[16][19]:=t*0.042;
+	ModelMatrixName[17][0]:=t*0.208;
+	ModelMatrixName[17][1]:=t*0.049;
+	ModelMatrixName[17][2]:=t*0.018;
+	ModelMatrixName[17][3]:=t*0.037;
+	ModelMatrixName[17][4]:=t*0.012;
+	ModelMatrixName[17][5]:=t*0.054;
+	ModelMatrixName[17][6]:=t*0.044;
+	ModelMatrixName[17][7]:=t*0.889;
+	ModelMatrixName[17][8]:=t*0.01;
+	ModelMatrixName[17][9]:=t*0.175;
+	ModelMatrixName[17][10]:=t*0.258;
+	ModelMatrixName[17][11]:=t*0.015;
+	ModelMatrixName[17][12]:=t*0.048;
+	ModelMatrixName[17][13]:=t*0.035;
+	ModelMatrixName[17][14]:=t*0.024;
+	ModelMatrixName[17][15]:=t*0.03;
+	ModelMatrixName[17][16]:=t*0.157;
+	ModelMatrixName[17][19]:=t*0.028;
+	ModelMatrixName[18][4]:=t*0.076;
+	ModelMatrixName[18][6]:=t*0.027;
+	ModelMatrixName[18][9]:=t*0.046;
+	ModelMatrixName[18][11]:=t*0.023;
+	ModelMatrixName[18][14]:=t*0.201;
+	ModelMatrixName[18][15]:=t*0.075;
+	ModelMatrixName[18][19]:=t*0.061;
+	ModelMatrixName[19][0]:=t*0.024;
+	ModelMatrixName[19][1]:=t*0.096;
+	ModelMatrixName[19][3]:=t*0.022;
+	ModelMatrixName[19][4]:=t*0.698;
+	ModelMatrixName[19][6]:=t*0.127;
+	ModelMatrixName[19][7]:=t*0.037;
+	ModelMatrixName[19][8]:=t*0.013;
+	ModelMatrixName[19][9]:=t*0.028;
+	ModelMatrixName[19][11]:=t*0.095;
+	ModelMatrixName[19][14]:=t*0.008;
+	ModelMatrixName[19][15]:=t*0.034;
+	ModelMatrixName[19][16]:=t*0.042;
+	ModelMatrixName[19][17]:=t*0.028;
+	ModelMatrixName[19][18]:=t*0.061;
+	
+	return 1;
+}
+
+Model_EFV_Vector ={20,1};
+Model_EFV_Vector[0]		=0.087127;
+Model_EFV_Vector[14]	=0.040904;
+Model_EFV_Vector[11]	=0.040432;
+Model_EFV_Vector[2]		=0.046872;
+Model_EFV_Vector[1]		=0.033474;
+Model_EFV_Vector[13]	=0.038255;
+Model_EFV_Vector[3]		=0.04953;
+Model_EFV_Vector[5]		=0.088612;
+Model_EFV_Vector[6]		=0.033618;
+Model_EFV_Vector[7]		=0.036886;
+Model_EFV_Vector[9]		=0.085357;
+Model_EFV_Vector[8]		=0.080482;
+Model_EFV_Vector[10]	=0.014753;
+Model_EFV_Vector[4]		=0.039772;
+Model_EFV_Vector[12]	=0.05068;
+Model_EFV_Vector[15]	=0.069577;
+Model_EFV_Vector[16]	=0.058542;
+Model_EFV_Vector[18]	=0.010494;
+Model_EFV_Vector[19]	=0.029916;
+Model_EFV_Vector[17]	=0.064718;
+
diff --git a/res/SubstitutionModels/Aminoacid/EIAA.mdl b/res/SubstitutionModels/Aminoacid/EIAA.mdl
new file mode 100644
index 0000000..c7174aa
--- /dev/null
+++ b/res/SubstitutionModels/Aminoacid/EIAA.mdl
@@ -0,0 +1,92 @@
+Model_Name  		= "EqualInputAA";
+Model_Options 		= 2;
+Model_Dimension 	= 20;
+
+function GUIPopulateModelMatrix (ModelMatrixName&, EFV)
+{
+
+	ModelMatrixName = {20,20};
+	
+	if (modelType==0)
+	{
+		for (counter1=0; counter1<19;counter1=counter1+1)
+		{
+			for (counter2=counter1+1; counter2<20; counter2=counter2+1)
+			{
+				ModelMatrixName[counter1][counter2]:=a;
+				ModelMatrixName[counter2][counter1]:=a;			
+			}
+		}
+	}
+	else
+	{
+		global shapeParameter = .5;
+		shapeParameter:>0.01;shapeParameter:<100;
+		category     categoryVariable = 
+					(rateClassCount, EQUAL, MEAN, GammaDist(_x_,shapeParameter,shapeParameter), CGammaDist(_x_,shapeParameter,shapeParameter), 0 , 
+			  							1e25,CGammaDist(_x_,shapeParameter+1,shapeParameter));
+
+		for (counter1=0; counter1<19;counter1=counter1+1)
+		{
+			for (counter2=counter1+1; counter2<20; counter2=counter2+1)
+			{
+				ModelMatrixName[counter1][counter2]:=categoryVariable*a;
+				ModelMatrixName[counter2][counter1]:=categoryVariable*a;			
+			}
+		}
+	}
+	
+	return 1;
+}
+
+/*-------------------------------------------------------------------------------*/
+
+function	EFVEstimated	(EFVector&, EFVApproximations)
+{
+	global frequencyVariable_1 = EFVApproximations[0];
+	global frequencyVariable_2 = EFVApproximations[1]/(1-frequencyVariable_1);
+	global frequencyVariable_3 = EFVApproximations[2]/(1-frequencyVariable_1)/(1-frequencyVariable_1);
+	global frequencyVariable_4 = EFVApproximations[3]/(1-frequencyVariable_1)/(1-frequencyVariable_1)/(1-frequencyVariable_2);
+	global frequencyVariable_5 = EFVApproximations[4]/(1-frequencyVariable_1)/(1-frequencyVariable_1)/(1-frequencyVariable_2)/(1-frequencyVariable_3);
+	global frequencyVariable_6 = EFVApproximations[5]/(1-frequencyVariable_1)/(1-frequencyVariable_1)/(1-frequencyVariable_2)/(1-frequencyVariable_3)/(1-frequencyVariable_4);
+	global frequencyVariable_7 = EFVApproximations[6]/(1-frequencyVariable_1)/(1-frequencyVariable_1)/(1-frequencyVariable_2)/(1-frequencyVariable_3)/(1-frequencyVariable_4)/(1-frequencyVariable_5);
+	global frequencyVariable_8 = EFVApproximations[7]/(1-frequencyVariable_1)/(1-frequencyVariable_1)/(1-frequencyVariable_2)/(1-frequencyVariable_3)/(1-frequencyVariable_4)/(1-frequencyVariable_5)/(1-frequencyVariable_6);
+	global frequencyVariable_9 = EFVApproximations[8]/(1-frequencyVariable_1)/(1-frequencyVariable_1)/(1-frequencyVariable_2)/(1-frequencyVariable_3)/(1-frequencyVariable_4)/(1-frequencyVariable_5)/(1-frequencyVariable_6)/(1-frequencyVariable_7);
+	global frequencyVariable_10 = EFVApproximations[9]/(1-frequencyVariable_1)/(1-frequencyVariable_1)/(1-frequencyVariable_2)/(1-frequencyVariable_3)/(1-frequencyVariable_4)/(1-frequencyVariable_5)/(1-frequencyVariable_6)/(1-frequencyVariable_7)/(1-frequencyVariable_8);
+	global frequencyVariable_11 = EFVApproximations[10]/(1-frequencyVariable_1)/(1-frequencyVariable_1)/(1-frequencyVariable_2)/(1-frequencyVariable_3)/(1-frequencyVariable_4)/(1-frequencyVariable_5)/(1-frequencyVariable_6)/(1-frequencyVariable_7)/(1-frequencyVariable_8)/(1-frequencyVariable_9);
+	global frequencyVariable_12 = EFVApproximations[11]/(1-frequencyVariable_1)/(1-frequencyVariable_1)/(1-frequencyVariable_2)/(1-frequencyVariable_3)/(1-frequencyVariable_4)/(1-frequencyVariable_5)/(1-frequencyVariable_6)/(1-frequencyVariable_7)/(1-frequencyVariable_8)/(1-frequencyVariable_9)/(1-frequencyVariable_10);
+	global frequencyVariable_13 = EFVApproximations[12]/(1-frequencyVariable_1)/(1-frequencyVariable_1)/(1-frequencyVariable_2)/(1-frequencyVariable_3)/(1-frequencyVariable_4)/(1-frequencyVariable_5)/(1-frequencyVariable_6)/(1-frequencyVariable_7)/(1-frequencyVariable_8)/(1-frequencyVariable_9)/(1-frequencyVariable_10)/(1-frequencyVariable_11);
+	global frequencyVariable_14 = EFVApproximations[13]/(1-frequencyVariable_1)/(1-frequencyVariable_1)/(1-frequencyVariable_2)/(1-frequencyVariable_3)/(1-frequencyVariable_4)/(1-frequencyVariable_5)/(1-frequencyVariable_6)/(1-frequencyVariable_7)/(1-frequencyVariable_8)/(1-frequencyVariable_9)/(1-frequencyVariable_10)/(1-frequencyVariable_11)/(1-frequencyVariable_12);
+	global frequencyVariable_15 = EFVApproximations[14]/(1-frequencyVariable_1)/(1-frequencyVariable_1)/(1-frequencyVariable_2)/(1-frequencyVariable_3)/(1-frequencyVariable_4)/(1-frequencyVariable_5)/(1-frequencyVariable_6)/(1-frequencyVariable_7)/(1-frequencyVariable_8)/(1-frequencyVariable_9)/(1-frequencyVariable_10)/(1-frequencyVariable_11)/(1-frequencyVariable_12)/(1-frequencyVariable_13);
+	global frequencyVariable_16 = EFVApproximations[15]/(1-frequencyVariable_1)/(1-frequencyVariable_1)/(1-frequencyVariable_2)/(1-frequencyVariable_3)/(1-frequencyVariable_4)/(1-frequencyVariable_5)/(1-frequencyVariable_6)/(1-frequencyVariable_7)/(1-frequencyVariable_8)/(1-frequencyVariable_9)/(1-frequencyVariable_10)/(1-frequencyVariable_11)/(1-frequencyVariable_12)/(1-frequencyVariable_13)/(1-frequencyVariable_14);
+	global frequencyVariable_17 = EFVApproximations[16]/(1-frequencyVariable_1)/(1-frequencyVariable_1)/(1-frequencyVariable_2)/(1-frequencyVariable_3)/(1-frequencyVariable_4)/(1-frequencyVariable_5)/(1-frequencyVariable_6)/(1-frequencyVariable_7)/(1-frequencyVariable_8)/(1-frequencyVariable_9)/(1-frequencyVariable_10)/(1-frequencyVariable_11)/(1-frequencyVariable_12)/(1-frequencyVariable_13)/(1-frequencyVariable_14)/(1-frequencyVariable_15);
+	global frequencyVariable_18 = EFVApproximations[17]/(1-frequencyVariable_1)/(1-frequencyVariable_1)/(1-frequencyVariable_2)/(1-frequencyVariable_3)/(1-frequencyVariable_4)/(1-frequencyVariable_5)/(1-frequencyVariable_6)/(1-frequencyVariable_7)/(1-frequencyVariable_8)/(1-frequencyVariable_9)/(1-frequencyVariable_10)/(1-frequencyVariable_11)/(1-frequencyVariable_12)/(1-frequencyVariable_13)/(1-frequencyVariable_14)/(1-frequencyVariable_15)/(1-frequencyVariable_16);
+	global frequencyVariable_19 = EFVApproximations[18]/(1-frequencyVariable_1)/(1-frequencyVariable_1)/(1-frequencyVariable_2)/(1-frequencyVariable_3)/(1-frequencyVariable_4)/(1-frequencyVariable_5)/(1-frequencyVariable_6)/(1-frequencyVariable_7)/(1-frequencyVariable_8)/(1-frequencyVariable_9)/(1-frequencyVariable_10)/(1-frequencyVariable_11)/(1-frequencyVariable_12)/(1-frequencyVariable_13)/(1-frequencyVariable_14)/(1-frequencyVariable_15)/(1-frequencyVariable_16)/(1-frequencyVariable_17);
+
+
+	EFVector = {
+		{frequencyVariable_1}
+		{(1-frequencyVariable_1)*frequencyVariable_2}
+		{(1-frequencyVariable_1)*(1-frequencyVariable_2)*frequencyVariable_3}
+		{(1-frequencyVariable_1)*(1-frequencyVariable_2)*(1-frequencyVariable_3)*frequencyVariable_4}
+		{(1-frequencyVariable_1)*(1-frequencyVariable_2)*(1-frequencyVariable_3)*(1-frequencyVariable_4)*frequencyVariable_5}
+		{(1-frequencyVariable_1)*(1-frequencyVariable_2)*(1-frequencyVariable_3)*(1-frequencyVariable_4)*(1-frequencyVariable_5)*frequencyVariable_6}
+		{(1-frequencyVariable_1)*(1-frequencyVariable_2)*(1-frequencyVariable_3)*(1-frequencyVariable_4)*(1-frequencyVariable_5)*(1-frequencyVariable_6)*frequencyVariable_7}
+		{(1-frequencyVariable_1)*(1-frequencyVariable_2)*(1-frequencyVariable_3)*(1-frequencyVariable_4)*(1-frequencyVariable_5)*(1-frequencyVariable_6)*(1-frequencyVariable_7)*frequencyVariable_8}
+		{(1-frequencyVariable_1)*(1-frequencyVariable_2)*(1-frequencyVariable_3)*(1-frequencyVariable_4)*(1-frequencyVariable_5)*(1-frequencyVariable_6)*(1-frequencyVariable_7)*(1-frequencyVariable_8)*frequencyVariable_9}
+		{(1-frequencyVariable_1)*(1-frequencyVariable_2)*(1-frequencyVariable_3)*(1-frequencyVariable_4)*(1-frequencyVariable_5)*(1-frequencyVariable_6)*(1-frequencyVariable_7)*(1-frequencyVariable_8)*(1-frequencyVariable_9)*frequencyVariable_10}
+		{(1-frequencyVariable_1)*(1-frequencyVariable_2)*(1-frequencyVariable_3)*(1-frequencyVariable_4)*(1-frequencyVariable_5)*(1-frequencyVariable_6)*(1-frequencyVariable_7)*(1-frequencyVariable_8)*(1-frequencyVariable_9)*(1-frequencyVariable_10)*frequencyVariable_11}
+		{(1-frequencyVariable_1)*(1-frequencyVariable_2)*(1-frequencyVariable_3)*(1-frequencyVariable_4)*(1-frequencyVariable_5)*(1-frequencyVariable_6)*(1-frequencyVariable_7)*(1-frequencyVariable_8)*(1-frequencyVariable_9)*(1-frequencyVariable_10)*(1-frequencyVariable_11)*frequencyVariable_12}
+		{(1-frequencyVariable_1)*(1-frequencyVariable_2)*(1-frequencyVariable_3)*(1-frequencyVariable_4)*(1-frequencyVariable_5)*(1-frequencyVariable_6)*(1-frequencyVariable_7)*(1-frequencyVariable_8)*(1-frequencyVariable_9)*(1-frequencyVariable_10)*(1-frequencyVariable_11)*(1-frequencyVariable_12)*frequencyVariable_13}
+		{(1-frequencyVariable_1)*(1-frequencyVariable_2)*(1-frequencyVariable_3)*(1-frequencyVariable_4)*(1-frequencyVariable_5)*(1-frequencyVariable_6)*(1-frequencyVariable_7)*(1-frequencyVariable_8)*(1-frequencyVariable_9)*(1-frequencyVariable_10)*(1-frequencyVariable_11)*(1-frequencyVariable_12)*(1-frequencyVariable_13)*frequencyVariable_14}
+		{(1-frequencyVariable_1)*(1-frequencyVariable_2)*(1-frequencyVariable_3)*(1-frequencyVariable_4)*(1-frequencyVariable_5)*(1-frequencyVariable_6)*(1-frequencyVariable_7)*(1-frequencyVariable_8)*(1-frequencyVariable_9)*(1-frequencyVariable_10)*(1-frequencyVariable_11)*(1-frequencyVariable_12)*(1-frequencyVariable_13)*(1-frequencyVariable_14)*frequencyVariable_15}
+		{(1-frequencyVariable_1)*(1-frequencyVariable_2)*(1-frequencyVariable_3)*(1-frequencyVariable_4)*(1-frequencyVariable_5)*(1-frequencyVariable_6)*(1-frequencyVariable_7)*(1-frequencyVariable_8)*(1-frequencyVariable_9)*(1-frequencyVariable_10)*(1-frequencyVariable_11)*(1-frequencyVariable_12)*(1-frequencyVariable_13)*(1-frequencyVariable_14)*(1-frequencyVariable_15)*frequencyVariable_16}
+		{(1-frequencyVariable_1)*(1-frequencyVariable_2)*(1-frequencyVariable_3)*(1-frequencyVariable_4)*(1-frequencyVariable_5)*(1-frequencyVariable_6)*(1-frequencyVariable_7)*(1-frequencyVariable_8)*(1-frequencyVariable_9)*(1-frequencyVariable_10)*(1-frequencyVariable_11)*(1-frequencyVariable_12)*(1-frequencyVariable_13)*(1-frequencyVariable_14)*(1-frequencyVariable_15)*(1-frequencyVariable_16)*frequencyVariable_17}
+		{(1-frequencyVariable_1)*(1-frequencyVariable_2)*(1-frequencyVariable_3)*(1-frequencyVariable_4)*(1-frequencyVariable_5)*(1-frequencyVariable_6)*(1-frequencyVariable_7)*(1-frequencyVariable_8)*(1-frequencyVariable_9)*(1-frequencyVariable_10)*(1-frequencyVariable_11)*(1-frequencyVariable_12)*(1-frequencyVariable_13)*(1-frequencyVariable_14)*(1-frequencyVariable_15)*(1-frequencyVariable_16)*(1-frequencyVariable_17)*frequencyVariable_18}
+		{(1-frequencyVariable_1)*(1-frequencyVariable_2)*(1-frequencyVariable_3)*(1-frequencyVariable_4)*(1-frequencyVariable_5)*(1-frequencyVariable_6)*(1-frequencyVariable_7)*(1-frequencyVariable_8)*(1-frequencyVariable_9)*(1-frequencyVariable_10)*(1-frequencyVariable_11)*(1-frequencyVariable_12)*(1-frequencyVariable_13)*(1-frequencyVariable_14)*(1-frequencyVariable_15)*(1-frequencyVariable_16)*(1-frequencyVariable_17)*(1-frequencyVariable_18)*frequencyVariable_19}
+		{(1-frequencyVariable_1)*(1-frequencyVariable_2)*(1-frequencyVariable_3)*(1-frequencyVariable_4)*(1-frequencyVariable_5)*(1-frequencyVariable_6)*(1-frequencyVariable_7)*(1-frequencyVariable_8)*(1-frequencyVariable_9)*(1-frequencyVariable_10)*(1-frequencyVariable_11)*(1-frequencyVariable_12)*(1-frequencyVariable_13)*(1-frequencyVariable_14)*(1-frequencyVariable_15)*(1-frequencyVariable_16)*(1-frequencyVariable_17)*(1-frequencyVariable_18)*(1-frequencyVariable_19)}
+	};
+					
+	MULTIPLY_BY_FREQS = 1;
+	return 	0;
+}
diff --git a/res/SubstitutionModels/Aminoacid/Fitness.mdl b/res/SubstitutionModels/Aminoacid/Fitness.mdl
new file mode 100644
index 0000000..2790d5d
--- /dev/null
+++ b/res/SubstitutionModels/Aminoacid/Fitness.mdl
@@ -0,0 +1,91 @@
+Model_Name  		= "Fitness";
+Model_EFV_Type		= "User Defined Vector";
+Model_Options 		= 8;
+Model_Dimension 	= 20;
+Model_Data_Type		= 1;
+
+aaCodes = {{"A",
+"C",
+"D",
+"E",
+"F",
+"G",
+"H",
+"I",
+"K",
+"L",
+"M",
+"N",
+"P",
+"Q",
+"R",
+"S",
+"T",
+"V",
+"W",
+"Y"}};
+
+function GUIPopulateModelMatrix (ModelMatrixName&, EFV)
+{
+	ModelMatrixName = {20,20};
+	EFV				= {20,1};
+	
+	commandString = "";
+	
+	for (rI = 1; rI < 20; rI = rI+1)
+	{
+		commandString = commandString + "global globalVariable_F_" + aaCodes[rI] + 
+						"=0; global globalVariable_FR_" + aaCodes[rI] +
+						":>-1e10;\n";
+	}
+	
+	ExecuteCommands (commandString);
+	
+	for (cI = 1; cI < 20; cI = cI+1)
+	{
+		commandString = "ModelMatrixName[0]["+cI+"]:=t*(1+(globalVariable_F_" + 
+						 aaCodes[cI] + "<0)*(Exp(globalVariable_F_"+
+						 aaCodes[cI] + ")-1));\n" + 
+						 "ModelMatrixName["+cI+"][0]:=t*(1+(0>" + "globalVariable_F_" + 
+						 aaCodes[cI] + ")*(Exp(-globalVariable_F_"+
+						 aaCodes[cI] + ")-1));\n"; 
+		ExecuteCommands	 (commandString);
+	}
+
+	for (rI = 1; rI < 19; rI = rI+1)
+	{
+		for (cI = rI+1; cI < 20; cI = cI+1)
+		{
+			commandString = "ModelMatrixName["+rI+"]["+cI+"]:=t*(1+(globalVariable_F_" + 
+							 aaCodes[cI] + "<" + "globalVariable_F_" + 
+							 aaCodes[rI] + ")*(Exp(globalVariable_F_"+
+							 aaCodes[cI] + "-globalVariable_F_"+
+							 aaCodes[rI] + ")-1));\n" + 
+							 "ModelMatrixName["+cI+"]["+rI+"]:=t*(1+(globalVariable_F_" + 
+							 aaCodes[rI] + "<" + "globalVariable_F_" + 
+							 aaCodes[cI] + ")*(Exp(globalVariable_F_"+
+							 aaCodes[rI] + "-globalVariable_F_"+
+							 aaCodes[cI] + ")-1));\n"; 
+			ExecuteCommands	 (commandString);
+		}
+	}
+	
+	commandString = "global globalVariable_EFV_Norm:=1";
+	for (rI = 1; rI < 20; rI = rI+1)
+	{
+		commandString = commandString+"+Exp(globalVariable_FR_"+aaCodes[rI]+")";
+	}
+	Model_EFV_Vector = {20,1};
+	ExecuteCommands (commandString+";");
+	commandString = "Model_EFV_Vector[0]:=1/globalVariable_EFV_Norm;";
+	ExecuteCommands (commandString);
+	for (rI = 1; rI < 20; rI = rI+1)
+	{
+		commandString = "Model_EFV_Vector[" + rI + "]:=Exp(globalVariable_FR_" + aaCodes[rI] + ")/globalVariable_EFV_Norm;";
+		ExecuteCommands (commandString);
+	}
+	return 0;
+}
+
+
+
diff --git a/res/SubstitutionModels/Aminoacid/Jones.mdl b/res/SubstitutionModels/Aminoacid/Jones.mdl
new file mode 100644
index 0000000..d13727a
--- /dev/null
+++ b/res/SubstitutionModels/Aminoacid/Jones.mdl
@@ -0,0 +1,802 @@
+Model_Name  		= "Jones";
+Model_EFV_Type		= "User Defined Vector";
+Model_Options 		= 8;
+Model_Dimension 	= 20;
+Model_Data_Type		= 1;
+
+function GUIPopulateModelMatrix (ModelMatrixName&, EFV)
+{
+
+	ModelMatrixName = {20,20};
+	
+	if (modelType)
+	{
+        ModelMatrixName[0][1] := t*c*0.056;
+        ModelMatrixName[1][0] := t*c*0.056;
+        ModelMatrixName[0][2] := t*c*0.081;
+        ModelMatrixName[2][0] := t*c*0.081;
+        ModelMatrixName[0][3] := t*c*0.105;
+        ModelMatrixName[3][0] := t*c*0.105;
+        ModelMatrixName[0][4] := t*c*0.015;
+        ModelMatrixName[4][0] := t*c*0.015;
+        ModelMatrixName[0][5] := t*c*0.179;
+        ModelMatrixName[5][0] := t*c*0.179;
+        ModelMatrixName[0][6] := t*c*0.027;
+        ModelMatrixName[6][0] := t*c*0.027;
+        ModelMatrixName[0][7] := t*c*0.036;
+        ModelMatrixName[7][0] := t*c*0.036;
+        ModelMatrixName[0][8] := t*c*0.035;
+        ModelMatrixName[8][0] := t*c*0.035;
+        ModelMatrixName[0][9] := t*c*0.03;
+        ModelMatrixName[9][0] := t*c*0.03;
+        ModelMatrixName[0][10] := t*c*0.054;
+        ModelMatrixName[10][0] := t*c*0.054;
+        ModelMatrixName[0][11] := t*c*0.054;
+        ModelMatrixName[11][0] := t*c*0.054;
+        ModelMatrixName[0][12] := t*c*0.194;
+        ModelMatrixName[12][0] := t*c*0.194;
+        ModelMatrixName[0][13] := t*c*0.057;
+        ModelMatrixName[13][0] := t*c*0.057;
+        ModelMatrixName[0][14] := t*c*0.058;
+        ModelMatrixName[14][0] := t*c*0.058;
+        ModelMatrixName[0][15] := t*c*0.378;
+        ModelMatrixName[15][0] := t*c*0.378;
+        ModelMatrixName[0][16] := t*c*0.475;
+        ModelMatrixName[16][0] := t*c*0.475;
+        ModelMatrixName[0][17] := t*c*0.298;
+        ModelMatrixName[17][0] := t*c*0.298;
+        ModelMatrixName[0][18] := t*c*0.009;
+        ModelMatrixName[18][0] := t*c*0.009;
+        ModelMatrixName[0][19] := t*c*0.011;
+        ModelMatrixName[19][0] := t*c*0.011;
+        ModelMatrixName[1][2] := t*c*0.01;
+        ModelMatrixName[2][1] := t*c*0.01;
+        ModelMatrixName[1][3] := t*c*0.005;
+        ModelMatrixName[3][1] := t*c*0.005;
+        ModelMatrixName[1][4] := t*c*0.078;
+        ModelMatrixName[4][1] := t*c*0.078;
+        ModelMatrixName[1][5] := t*c*0.059;
+        ModelMatrixName[5][1] := t*c*0.059;
+        ModelMatrixName[1][6] := t*c*0.069;
+        ModelMatrixName[6][1] := t*c*0.069;
+        ModelMatrixName[1][7] := t*c*0.017;
+        ModelMatrixName[7][1] := t*c*0.017;
+        ModelMatrixName[1][8] := t*c*0.007;
+        ModelMatrixName[8][1] := t*c*0.007;
+        ModelMatrixName[1][9] := t*c*0.023;
+        ModelMatrixName[9][1] := t*c*0.023;
+        ModelMatrixName[1][10] := t*c*0.031;
+        ModelMatrixName[10][1] := t*c*0.031;
+        ModelMatrixName[1][11] := t*c*0.034;
+        ModelMatrixName[11][1] := t*c*0.034;
+        ModelMatrixName[1][12] := t*c*0.014;
+        ModelMatrixName[12][1] := t*c*0.014;
+        ModelMatrixName[1][13] := t*c*0.009;
+        ModelMatrixName[13][1] := t*c*0.009;
+        ModelMatrixName[1][14] := t*c*0.113;
+        ModelMatrixName[14][1] := t*c*0.113;
+        ModelMatrixName[1][15] := t*c*0.223;
+        ModelMatrixName[15][1] := t*c*0.223;
+        ModelMatrixName[1][16] := t*c*0.042;
+        ModelMatrixName[16][1] := t*c*0.042;
+        ModelMatrixName[1][17] := t*c*0.062;
+        ModelMatrixName[17][1] := t*c*0.062;
+        ModelMatrixName[1][18] := t*c*0.115;
+        ModelMatrixName[18][1] := t*c*0.115;
+        ModelMatrixName[1][19] := t*c*0.209;
+        ModelMatrixName[19][1] := t*c*0.209;
+        ModelMatrixName[2][3] := t*c*0.767;
+        ModelMatrixName[3][2] := t*c*0.767;
+        ModelMatrixName[2][4] := t*c*0.004;
+        ModelMatrixName[4][2] := t*c*0.004;
+        ModelMatrixName[2][5] := t*c*0.13;
+        ModelMatrixName[5][2] := t*c*0.13;
+        ModelMatrixName[2][6] := t*c*0.112;
+        ModelMatrixName[6][2] := t*c*0.112;
+        ModelMatrixName[2][7] := t*c*0.011;
+        ModelMatrixName[7][2] := t*c*0.011;
+        ModelMatrixName[2][8] := t*c*0.026;
+        ModelMatrixName[8][2] := t*c*0.026;
+        ModelMatrixName[2][9] := t*c*0.007;
+        ModelMatrixName[9][2] := t*c*0.007;
+        ModelMatrixName[2][10] := t*c*0.015;
+        ModelMatrixName[10][2] := t*c*0.015;
+        ModelMatrixName[2][11] := t*c*0.528;
+        ModelMatrixName[11][2] := t*c*0.528;
+        ModelMatrixName[2][12] := t*c*0.015;
+        ModelMatrixName[12][2] := t*c*0.015;
+        ModelMatrixName[2][13] := t*c*0.049;
+        ModelMatrixName[13][2] := t*c*0.049;
+        ModelMatrixName[2][14] := t*c*0.016;
+        ModelMatrixName[14][2] := t*c*0.016;
+        ModelMatrixName[2][15] := t*c*0.059;
+        ModelMatrixName[15][2] := t*c*0.059;
+        ModelMatrixName[2][16] := t*c*0.038;
+        ModelMatrixName[16][2] := t*c*0.038;
+        ModelMatrixName[2][17] := t*c*0.031;
+        ModelMatrixName[17][2] := t*c*0.031;
+        ModelMatrixName[2][18] := t*c*0.004;
+        ModelMatrixName[18][2] := t*c*0.004;
+        ModelMatrixName[2][19] := t*c*0.046;
+        ModelMatrixName[19][2] := t*c*0.046;
+        ModelMatrixName[3][4] := t*c*0.005;
+        ModelMatrixName[4][3] := t*c*0.005;
+        ModelMatrixName[3][5] := t*c*0.119;
+        ModelMatrixName[5][3] := t*c*0.119;
+        ModelMatrixName[3][6] := t*c*0.026;
+        ModelMatrixName[6][3] := t*c*0.026;
+        ModelMatrixName[3][7] := t*c*0.012;
+        ModelMatrixName[7][3] := t*c*0.012;
+        ModelMatrixName[3][8] := t*c*0.181;
+        ModelMatrixName[8][3] := t*c*0.181;
+        ModelMatrixName[3][9] := t*c*0.009;
+        ModelMatrixName[9][3] := t*c*0.009;
+        ModelMatrixName[3][10] := t*c*0.018;
+        ModelMatrixName[10][3] := t*c*0.018;
+        ModelMatrixName[3][11] := t*c*0.058;
+        ModelMatrixName[11][3] := t*c*0.058;
+        ModelMatrixName[3][12] := t*c*0.018;
+        ModelMatrixName[12][3] := t*c*0.018;
+        ModelMatrixName[3][13] := t*c*0.323;
+        ModelMatrixName[13][3] := t*c*0.323;
+        ModelMatrixName[3][14] := t*c*0.029;
+        ModelMatrixName[14][3] := t*c*0.029;
+        ModelMatrixName[3][15] := t*c*0.03;
+        ModelMatrixName[15][3] := t*c*0.03;
+        ModelMatrixName[3][16] := t*c*0.032;
+        ModelMatrixName[16][3] := t*c*0.032;
+        ModelMatrixName[3][17] := t*c*0.045;
+        ModelMatrixName[17][3] := t*c*0.045;
+        ModelMatrixName[3][18] := t*c*0.01;
+        ModelMatrixName[18][3] := t*c*0.01;
+        ModelMatrixName[3][19] := t*c*0.007;
+        ModelMatrixName[19][3] := t*c*0.007;
+        ModelMatrixName[4][5] := t*c*0.005;
+        ModelMatrixName[5][4] := t*c*0.005;
+        ModelMatrixName[4][6] := t*c*0.04;
+        ModelMatrixName[6][4] := t*c*0.04;
+        ModelMatrixName[4][7] := t*c*0.089;
+        ModelMatrixName[7][4] := t*c*0.089;
+        ModelMatrixName[4][8] := t*c*0.004;
+        ModelMatrixName[8][4] := t*c*0.004;
+        ModelMatrixName[4][9] := t*c*0.248;
+        ModelMatrixName[9][4] := t*c*0.248;
+        ModelMatrixName[4][10] := t*c*0.043;
+        ModelMatrixName[10][4] := t*c*0.043;
+        ModelMatrixName[4][11] := t*c*0.01;
+        ModelMatrixName[11][4] := t*c*0.01;
+        ModelMatrixName[4][12] := t*c*0.017;
+        ModelMatrixName[12][4] := t*c*0.017;
+        ModelMatrixName[4][13] := t*c*0.004;
+        ModelMatrixName[13][4] := t*c*0.004;
+        ModelMatrixName[4][14] := t*c*0.005;
+        ModelMatrixName[14][4] := t*c*0.005;
+        ModelMatrixName[4][15] := t*c*0.092;
+        ModelMatrixName[15][4] := t*c*0.092;
+        ModelMatrixName[4][16] := t*c*0.012;
+        ModelMatrixName[16][4] := t*c*0.012;
+        ModelMatrixName[4][17] := t*c*0.062;
+        ModelMatrixName[17][4] := t*c*0.062;
+        ModelMatrixName[4][18] := t*c*0.053;
+        ModelMatrixName[18][4] := t*c*0.053;
+        ModelMatrixName[4][19] := t*c*0.536;
+        ModelMatrixName[19][4] := t*c*0.536;
+        ModelMatrixName[5][6] := t*c*0.023;
+        ModelMatrixName[6][5] := t*c*0.023;
+        ModelMatrixName[5][7] := t*c*0.006;
+        ModelMatrixName[7][5] := t*c*0.006;
+        ModelMatrixName[5][8] := t*c*0.027;
+        ModelMatrixName[8][5] := t*c*0.027;
+        ModelMatrixName[5][9] := t*c*0.006;
+        ModelMatrixName[9][5] := t*c*0.006;
+        ModelMatrixName[5][10] := t*c*0.014;
+        ModelMatrixName[10][5] := t*c*0.014;
+        ModelMatrixName[5][11] := t*c*0.081;
+        ModelMatrixName[11][5] := t*c*0.081;
+        ModelMatrixName[5][12] := t*c*0.024;
+        ModelMatrixName[12][5] := t*c*0.024;
+        ModelMatrixName[5][13] := t*c*0.026;
+        ModelMatrixName[13][5] := t*c*0.026;
+        ModelMatrixName[5][14] := t*c*0.137;
+        ModelMatrixName[14][5] := t*c*0.137;
+        ModelMatrixName[5][15] := t*c*0.201;
+        ModelMatrixName[15][5] := t*c*0.201;
+        ModelMatrixName[5][16] := t*c*0.033;
+        ModelMatrixName[16][5] := t*c*0.033;
+        ModelMatrixName[5][17] := t*c*0.047;
+        ModelMatrixName[17][5] := t*c*0.047;
+        ModelMatrixName[5][18] := t*c*0.055;
+        ModelMatrixName[18][5] := t*c*0.055;
+        ModelMatrixName[5][19] := t*c*0.008;
+        ModelMatrixName[19][5] := t*c*0.008;
+        ModelMatrixName[6][7] := t*c*0.016;
+        ModelMatrixName[7][6] := t*c*0.016;
+        ModelMatrixName[6][8] := t*c*0.045;
+        ModelMatrixName[8][6] := t*c*0.045;
+        ModelMatrixName[6][9] := t*c*0.056;
+        ModelMatrixName[9][6] := t*c*0.056;
+        ModelMatrixName[6][10] := t*c*0.033;
+        ModelMatrixName[10][6] := t*c*0.033;
+        ModelMatrixName[6][11] := t*c*0.391;
+        ModelMatrixName[11][6] := t*c*0.391;
+        ModelMatrixName[6][12] := t*c*0.115;
+        ModelMatrixName[12][6] := t*c*0.115;
+        ModelMatrixName[6][13] := t*c*0.597;
+        ModelMatrixName[13][6] := t*c*0.597;
+        ModelMatrixName[6][14] := t*c*0.328;
+        ModelMatrixName[14][6] := t*c*0.328;
+        ModelMatrixName[6][15] := t*c*0.073;
+        ModelMatrixName[15][6] := t*c*0.073;
+        ModelMatrixName[6][16] := t*c*0.046;
+        ModelMatrixName[16][6] := t*c*0.046;
+        ModelMatrixName[6][17] := t*c*0.011;
+        ModelMatrixName[17][6] := t*c*0.011;
+        ModelMatrixName[6][18] := t*c*0.008;
+        ModelMatrixName[18][6] := t*c*0.008;
+        ModelMatrixName[6][19] := t*c*0.573;
+        ModelMatrixName[19][6] := t*c*0.573;
+        ModelMatrixName[7][8] := t*c*0.021;
+        ModelMatrixName[8][7] := t*c*0.021;
+        ModelMatrixName[7][9] := t*c*0.229;
+        ModelMatrixName[9][7] := t*c*0.229;
+        ModelMatrixName[7][10] := t*c*0.479;
+        ModelMatrixName[10][7] := t*c*0.479;
+        ModelMatrixName[7][11] := t*c*0.047;
+        ModelMatrixName[11][7] := t*c*0.047;
+        ModelMatrixName[7][12] := t*c*0.01;
+        ModelMatrixName[12][7] := t*c*0.01;
+        ModelMatrixName[7][13] := t*c*0.009;
+        ModelMatrixName[13][7] := t*c*0.009;
+        ModelMatrixName[7][14] := t*c*0.022;
+        ModelMatrixName[14][7] := t*c*0.022;
+        ModelMatrixName[7][15] := t*c*0.04;
+        ModelMatrixName[15][7] := t*c*0.04;
+        ModelMatrixName[7][16] := t*c*0.245;
+        ModelMatrixName[16][7] := t*c*0.245;
+        ModelMatrixName[7][17] := t*c*0.961;
+        ModelMatrixName[17][7] := t*c*0.961;
+        ModelMatrixName[7][18] := t*c*0.009;
+        ModelMatrixName[18][7] := t*c*0.009;
+        ModelMatrixName[7][19] := t*c*0.032;
+        ModelMatrixName[19][7] := t*c*0.032;
+        ModelMatrixName[8][9] := t*c*0.014;
+        ModelMatrixName[9][8] := t*c*0.014;
+        ModelMatrixName[8][10] := t*c*0.065;
+        ModelMatrixName[10][8] := t*c*0.065;
+        ModelMatrixName[8][11] := t*c*0.263;
+        ModelMatrixName[11][8] := t*c*0.263;
+        ModelMatrixName[8][12] := t*c*0.021;
+        ModelMatrixName[12][8] := t*c*0.021;
+        ModelMatrixName[8][13] := t*c*0.292;
+        ModelMatrixName[13][8] := t*c*0.292;
+        ModelMatrixName[8][14] := t*c*0.646;
+        ModelMatrixName[14][8] := t*c*0.646;
+        ModelMatrixName[8][15] := t*c*0.047;
+        ModelMatrixName[15][8] := t*c*0.047;
+        ModelMatrixName[8][16] := t*c*0.103;
+        ModelMatrixName[16][8] := t*c*0.103;
+        ModelMatrixName[8][17] := t*c*0.014;
+        ModelMatrixName[17][8] := t*c*0.014;
+        ModelMatrixName[8][18] := t*c*0.01;
+        ModelMatrixName[18][8] := t*c*0.01;
+        ModelMatrixName[8][19] := t*c*0.008;
+        ModelMatrixName[19][8] := t*c*0.008;
+        ModelMatrixName[9][10] := t*c*0.388;
+        ModelMatrixName[10][9] := t*c*0.388;
+        ModelMatrixName[9][11] := t*c*0.012;
+        ModelMatrixName[11][9] := t*c*0.012;
+        ModelMatrixName[9][12] := t*c*0.102;
+        ModelMatrixName[12][9] := t*c*0.102;
+        ModelMatrixName[9][13] := t*c*0.072;
+        ModelMatrixName[13][9] := t*c*0.072;
+        ModelMatrixName[9][14] := t*c*0.038;
+        ModelMatrixName[14][9] := t*c*0.038;
+        ModelMatrixName[9][15] := t*c*0.059;
+        ModelMatrixName[15][9] := t*c*0.059;
+        ModelMatrixName[9][16] := t*c*0.025;
+        ModelMatrixName[16][9] := t*c*0.025;
+        ModelMatrixName[9][17] := t*c*0.18;
+        ModelMatrixName[17][9] := t*c*0.18;
+        ModelMatrixName[9][18] := t*c*0.052;
+        ModelMatrixName[18][9] := t*c*0.052;
+        ModelMatrixName[9][19] := t*c*0.024;
+        ModelMatrixName[19][9] := t*c*0.024;
+        ModelMatrixName[10][11] := t*c*0.03;
+        ModelMatrixName[11][10] := t*c*0.03;
+        ModelMatrixName[10][12] := t*c*0.016;
+        ModelMatrixName[12][10] := t*c*0.016;
+        ModelMatrixName[10][13] := t*c*0.043;
+        ModelMatrixName[13][10] := t*c*0.043;
+        ModelMatrixName[10][14] := t*c*0.044;
+        ModelMatrixName[14][10] := t*c*0.044;
+        ModelMatrixName[10][15] := t*c*0.029;
+        ModelMatrixName[15][10] := t*c*0.029;
+        ModelMatrixName[10][16] := t*c*0.226;
+        ModelMatrixName[16][10] := t*c*0.226;
+        ModelMatrixName[10][17] := t*c*0.323;
+        ModelMatrixName[17][10] := t*c*0.323;
+        ModelMatrixName[10][18] := t*c*0.024;
+        ModelMatrixName[18][10] := t*c*0.024;
+        ModelMatrixName[10][19] := t*c*0.018;
+        ModelMatrixName[19][10] := t*c*0.018;
+        ModelMatrixName[11][12] := t*c*0.015;
+        ModelMatrixName[12][11] := t*c*0.015;
+        ModelMatrixName[11][13] := t*c*0.086;
+        ModelMatrixName[13][11] := t*c*0.086;
+        ModelMatrixName[11][14] := t*c*0.045;
+        ModelMatrixName[14][11] := t*c*0.045;
+        ModelMatrixName[11][15] := t*c*0.503;
+        ModelMatrixName[15][11] := t*c*0.503;
+        ModelMatrixName[11][16] := t*c*0.232;
+        ModelMatrixName[16][11] := t*c*0.232;
+        ModelMatrixName[11][17] := t*c*0.016;
+        ModelMatrixName[17][11] := t*c*0.016;
+        ModelMatrixName[11][18] := t*c*0.008;
+        ModelMatrixName[18][11] := t*c*0.008;
+        ModelMatrixName[11][19] := t*c*0.07;
+        ModelMatrixName[19][11] := t*c*0.07;
+        ModelMatrixName[12][13] := t*c*0.164;
+        ModelMatrixName[13][12] := t*c*0.164;
+        ModelMatrixName[12][14] := t*c*0.074;
+        ModelMatrixName[14][12] := t*c*0.074;
+        ModelMatrixName[12][15] := t*c*0.285;
+        ModelMatrixName[15][12] := t*c*0.285;
+        ModelMatrixName[12][16] := t*c*0.118;
+        ModelMatrixName[16][12] := t*c*0.118;
+        ModelMatrixName[12][17] := t*c*0.023;
+        ModelMatrixName[17][12] := t*c*0.023;
+        ModelMatrixName[12][18] := t*c*0.006;
+        ModelMatrixName[18][12] := t*c*0.006;
+        ModelMatrixName[12][19] := t*c*0.01;
+        ModelMatrixName[19][12] := t*c*0.01;
+        ModelMatrixName[13][14] := t*c*0.31;
+        ModelMatrixName[14][13] := t*c*0.31;
+        ModelMatrixName[13][15] := t*c*0.053;
+        ModelMatrixName[15][13] := t*c*0.053;
+        ModelMatrixName[13][16] := t*c*0.051;
+        ModelMatrixName[16][13] := t*c*0.051;
+        ModelMatrixName[13][17] := t*c*0.02;
+        ModelMatrixName[17][13] := t*c*0.02;
+        ModelMatrixName[13][18] := t*c*0.018;
+        ModelMatrixName[18][13] := t*c*0.018;
+        ModelMatrixName[13][19] := t*c*0.024;
+        ModelMatrixName[19][13] := t*c*0.024;
+        ModelMatrixName[14][15] := t*c*0.101;
+        ModelMatrixName[15][14] := t*c*0.101;
+        ModelMatrixName[14][16] := t*c*0.064;
+        ModelMatrixName[16][14] := t*c*0.064;
+        ModelMatrixName[14][17] := t*c*0.017;
+        ModelMatrixName[17][14] := t*c*0.017;
+        ModelMatrixName[14][18] := t*c*0.126;
+        ModelMatrixName[18][14] := t*c*0.126;
+        ModelMatrixName[14][19] := t*c*0.02;
+        ModelMatrixName[19][14] := t*c*0.02;
+        ModelMatrixName[15][16] := t*c*0.477;
+        ModelMatrixName[16][15] := t*c*0.477;
+        ModelMatrixName[15][17] := t*c*0.038;
+        ModelMatrixName[17][15] := t*c*0.038;
+        ModelMatrixName[15][18] := t*c*0.035;
+        ModelMatrixName[18][15] := t*c*0.035;
+        ModelMatrixName[15][19] := t*c*0.063;
+        ModelMatrixName[19][15] := t*c*0.063;
+        ModelMatrixName[16][17] := t*c*0.112;
+        ModelMatrixName[17][16] := t*c*0.112;
+        ModelMatrixName[16][18] := t*c*0.012;
+        ModelMatrixName[18][16] := t*c*0.012;
+        ModelMatrixName[16][19] := t*c*0.021;
+        ModelMatrixName[19][16] := t*c*0.021;
+        ModelMatrixName[17][18] := t*c*0.025;
+        ModelMatrixName[18][17] := t*c*0.025;
+        ModelMatrixName[17][19] := t*c*0.016;
+        ModelMatrixName[19][17] := t*c*0.016;
+        ModelMatrixName[18][19] := t*c*0.071;
+        ModelMatrixName[19][18] := t*c*0.071;
+	}
+	else
+	{
+		ModelMatrixName[0][1] := t*0.056;
+        ModelMatrixName[1][0] := t*0.056;
+        ModelMatrixName[0][2] := t*0.081;
+        ModelMatrixName[2][0] := t*0.081;
+        ModelMatrixName[0][3] := t*0.105;
+        ModelMatrixName[3][0] := t*0.105;
+        ModelMatrixName[0][4] := t*0.015;
+        ModelMatrixName[4][0] := t*0.015;
+        ModelMatrixName[0][5] := t*0.179;
+        ModelMatrixName[5][0] := t*0.179;
+        ModelMatrixName[0][6] := t*0.027;
+        ModelMatrixName[6][0] := t*0.027;
+        ModelMatrixName[0][7] := t*0.036;
+        ModelMatrixName[7][0] := t*0.036;
+        ModelMatrixName[0][8] := t*0.035;
+        ModelMatrixName[8][0] := t*0.035;
+        ModelMatrixName[0][9] := t*0.03;
+        ModelMatrixName[9][0] := t*0.03;
+        ModelMatrixName[0][10] := t*0.054;
+        ModelMatrixName[10][0] := t*0.054;
+        ModelMatrixName[0][11] := t*0.054;
+        ModelMatrixName[11][0] := t*0.054;
+        ModelMatrixName[0][12] := t*0.194;
+        ModelMatrixName[12][0] := t*0.194;
+        ModelMatrixName[0][13] := t*0.057;
+        ModelMatrixName[13][0] := t*0.057;
+        ModelMatrixName[0][14] := t*0.058;
+        ModelMatrixName[14][0] := t*0.058;
+        ModelMatrixName[0][15] := t*0.378;
+        ModelMatrixName[15][0] := t*0.378;
+        ModelMatrixName[0][16] := t*0.475;
+        ModelMatrixName[16][0] := t*0.475;
+        ModelMatrixName[0][17] := t*0.298;
+        ModelMatrixName[17][0] := t*0.298;
+        ModelMatrixName[0][18] := t*0.009;
+        ModelMatrixName[18][0] := t*0.009;
+        ModelMatrixName[0][19] := t*0.011;
+        ModelMatrixName[19][0] := t*0.011;
+        ModelMatrixName[1][2] := t*0.01;
+        ModelMatrixName[2][1] := t*0.01;
+        ModelMatrixName[1][3] := t*0.005;
+        ModelMatrixName[3][1] := t*0.005;
+        ModelMatrixName[1][4] := t*0.078;
+        ModelMatrixName[4][1] := t*0.078;
+        ModelMatrixName[1][5] := t*0.059;
+        ModelMatrixName[5][1] := t*0.059;
+        ModelMatrixName[1][6] := t*0.069;
+        ModelMatrixName[6][1] := t*0.069;
+        ModelMatrixName[1][7] := t*0.017;
+        ModelMatrixName[7][1] := t*0.017;
+        ModelMatrixName[1][8] := t*0.007;
+        ModelMatrixName[8][1] := t*0.007;
+        ModelMatrixName[1][9] := t*0.023;
+        ModelMatrixName[9][1] := t*0.023;
+        ModelMatrixName[1][10] := t*0.031;
+        ModelMatrixName[10][1] := t*0.031;
+        ModelMatrixName[1][11] := t*0.034;
+        ModelMatrixName[11][1] := t*0.034;
+        ModelMatrixName[1][12] := t*0.014;
+        ModelMatrixName[12][1] := t*0.014;
+        ModelMatrixName[1][13] := t*0.009;
+        ModelMatrixName[13][1] := t*0.009;
+        ModelMatrixName[1][14] := t*0.113;
+        ModelMatrixName[14][1] := t*0.113;
+        ModelMatrixName[1][15] := t*0.223;
+        ModelMatrixName[15][1] := t*0.223;
+        ModelMatrixName[1][16] := t*0.042;
+        ModelMatrixName[16][1] := t*0.042;
+        ModelMatrixName[1][17] := t*0.062;
+        ModelMatrixName[17][1] := t*0.062;
+        ModelMatrixName[1][18] := t*0.115;
+        ModelMatrixName[18][1] := t*0.115;
+        ModelMatrixName[1][19] := t*0.209;
+        ModelMatrixName[19][1] := t*0.209;
+        ModelMatrixName[2][3] := t*0.767;
+        ModelMatrixName[3][2] := t*0.767;
+        ModelMatrixName[2][4] := t*0.004;
+        ModelMatrixName[4][2] := t*0.004;
+        ModelMatrixName[2][5] := t*0.13;
+        ModelMatrixName[5][2] := t*0.13;
+        ModelMatrixName[2][6] := t*0.112;
+        ModelMatrixName[6][2] := t*0.112;
+        ModelMatrixName[2][7] := t*0.011;
+        ModelMatrixName[7][2] := t*0.011;
+        ModelMatrixName[2][8] := t*0.026;
+        ModelMatrixName[8][2] := t*0.026;
+        ModelMatrixName[2][9] := t*0.007;
+        ModelMatrixName[9][2] := t*0.007;
+        ModelMatrixName[2][10] := t*0.015;
+        ModelMatrixName[10][2] := t*0.015;
+        ModelMatrixName[2][11] := t*0.528;
+        ModelMatrixName[11][2] := t*0.528;
+        ModelMatrixName[2][12] := t*0.015;
+        ModelMatrixName[12][2] := t*0.015;
+        ModelMatrixName[2][13] := t*0.049;
+        ModelMatrixName[13][2] := t*0.049;
+        ModelMatrixName[2][14] := t*0.016;
+        ModelMatrixName[14][2] := t*0.016;
+        ModelMatrixName[2][15] := t*0.059;
+        ModelMatrixName[15][2] := t*0.059;
+        ModelMatrixName[2][16] := t*0.038;
+        ModelMatrixName[16][2] := t*0.038;
+        ModelMatrixName[2][17] := t*0.031;
+        ModelMatrixName[17][2] := t*0.031;
+        ModelMatrixName[2][18] := t*0.004;
+        ModelMatrixName[18][2] := t*0.004;
+        ModelMatrixName[2][19] := t*0.046;
+        ModelMatrixName[19][2] := t*0.046;
+        ModelMatrixName[3][4] := t*0.005;
+        ModelMatrixName[4][3] := t*0.005;
+        ModelMatrixName[3][5] := t*0.119;
+        ModelMatrixName[5][3] := t*0.119;
+        ModelMatrixName[3][6] := t*0.026;
+        ModelMatrixName[6][3] := t*0.026;
+        ModelMatrixName[3][7] := t*0.012;
+        ModelMatrixName[7][3] := t*0.012;
+        ModelMatrixName[3][8] := t*0.181;
+        ModelMatrixName[8][3] := t*0.181;
+        ModelMatrixName[3][9] := t*0.009;
+        ModelMatrixName[9][3] := t*0.009;
+        ModelMatrixName[3][10] := t*0.018;
+        ModelMatrixName[10][3] := t*0.018;
+        ModelMatrixName[3][11] := t*0.058;
+        ModelMatrixName[11][3] := t*0.058;
+        ModelMatrixName[3][12] := t*0.018;
+        ModelMatrixName[12][3] := t*0.018;
+        ModelMatrixName[3][13] := t*0.323;
+        ModelMatrixName[13][3] := t*0.323;
+        ModelMatrixName[3][14] := t*0.029;
+        ModelMatrixName[14][3] := t*0.029;
+        ModelMatrixName[3][15] := t*0.03;
+        ModelMatrixName[15][3] := t*0.03;
+        ModelMatrixName[3][16] := t*0.032;
+        ModelMatrixName[16][3] := t*0.032;
+        ModelMatrixName[3][17] := t*0.045;
+        ModelMatrixName[17][3] := t*0.045;
+        ModelMatrixName[3][18] := t*0.01;
+        ModelMatrixName[18][3] := t*0.01;
+        ModelMatrixName[3][19] := t*0.007;
+        ModelMatrixName[19][3] := t*0.007;
+        ModelMatrixName[4][5] := t*0.005;
+        ModelMatrixName[5][4] := t*0.005;
+        ModelMatrixName[4][6] := t*0.04;
+        ModelMatrixName[6][4] := t*0.04;
+        ModelMatrixName[4][7] := t*0.089;
+        ModelMatrixName[7][4] := t*0.089;
+        ModelMatrixName[4][8] := t*0.004;
+        ModelMatrixName[8][4] := t*0.004;
+        ModelMatrixName[4][9] := t*0.248;
+        ModelMatrixName[9][4] := t*0.248;
+        ModelMatrixName[4][10] := t*0.043;
+        ModelMatrixName[10][4] := t*0.043;
+        ModelMatrixName[4][11] := t*0.01;
+        ModelMatrixName[11][4] := t*0.01;
+        ModelMatrixName[4][12] := t*0.017;
+        ModelMatrixName[12][4] := t*0.017;
+        ModelMatrixName[4][13] := t*0.004;
+        ModelMatrixName[13][4] := t*0.004;
+        ModelMatrixName[4][14] := t*0.005;
+        ModelMatrixName[14][4] := t*0.005;
+        ModelMatrixName[4][15] := t*0.092;
+        ModelMatrixName[15][4] := t*0.092;
+        ModelMatrixName[4][16] := t*0.012;
+        ModelMatrixName[16][4] := t*0.012;
+        ModelMatrixName[4][17] := t*0.062;
+        ModelMatrixName[17][4] := t*0.062;
+        ModelMatrixName[4][18] := t*0.053;
+        ModelMatrixName[18][4] := t*0.053;
+        ModelMatrixName[4][19] := t*0.536;
+        ModelMatrixName[19][4] := t*0.536;
+        ModelMatrixName[5][6] := t*0.023;
+        ModelMatrixName[6][5] := t*0.023;
+        ModelMatrixName[5][7] := t*0.006;
+        ModelMatrixName[7][5] := t*0.006;
+        ModelMatrixName[5][8] := t*0.027;
+        ModelMatrixName[8][5] := t*0.027;
+        ModelMatrixName[5][9] := t*0.006;
+        ModelMatrixName[9][5] := t*0.006;
+        ModelMatrixName[5][10] := t*0.014;
+        ModelMatrixName[10][5] := t*0.014;
+        ModelMatrixName[5][11] := t*0.081;
+        ModelMatrixName[11][5] := t*0.081;
+        ModelMatrixName[5][12] := t*0.024;
+        ModelMatrixName[12][5] := t*0.024;
+        ModelMatrixName[5][13] := t*0.026;
+        ModelMatrixName[13][5] := t*0.026;
+        ModelMatrixName[5][14] := t*0.137;
+        ModelMatrixName[14][5] := t*0.137;
+        ModelMatrixName[5][15] := t*0.201;
+        ModelMatrixName[15][5] := t*0.201;
+        ModelMatrixName[5][16] := t*0.033;
+        ModelMatrixName[16][5] := t*0.033;
+        ModelMatrixName[5][17] := t*0.047;
+        ModelMatrixName[17][5] := t*0.047;
+        ModelMatrixName[5][18] := t*0.055;
+        ModelMatrixName[18][5] := t*0.055;
+        ModelMatrixName[5][19] := t*0.008;
+        ModelMatrixName[19][5] := t*0.008;
+        ModelMatrixName[6][7] := t*0.016;
+        ModelMatrixName[7][6] := t*0.016;
+        ModelMatrixName[6][8] := t*0.045;
+        ModelMatrixName[8][6] := t*0.045;
+        ModelMatrixName[6][9] := t*0.056;
+        ModelMatrixName[9][6] := t*0.056;
+        ModelMatrixName[6][10] := t*0.033;
+        ModelMatrixName[10][6] := t*0.033;
+        ModelMatrixName[6][11] := t*0.391;
+        ModelMatrixName[11][6] := t*0.391;
+        ModelMatrixName[6][12] := t*0.115;
+        ModelMatrixName[12][6] := t*0.115;
+        ModelMatrixName[6][13] := t*0.597;
+        ModelMatrixName[13][6] := t*0.597;
+        ModelMatrixName[6][14] := t*0.328;
+        ModelMatrixName[14][6] := t*0.328;
+        ModelMatrixName[6][15] := t*0.073;
+        ModelMatrixName[15][6] := t*0.073;
+        ModelMatrixName[6][16] := t*0.046;
+        ModelMatrixName[16][6] := t*0.046;
+        ModelMatrixName[6][17] := t*0.011;
+        ModelMatrixName[17][6] := t*0.011;
+        ModelMatrixName[6][18] := t*0.008;
+        ModelMatrixName[18][6] := t*0.008;
+        ModelMatrixName[6][19] := t*0.573;
+        ModelMatrixName[19][6] := t*0.573;
+        ModelMatrixName[7][8] := t*0.021;
+        ModelMatrixName[8][7] := t*0.021;
+        ModelMatrixName[7][9] := t*0.229;
+        ModelMatrixName[9][7] := t*0.229;
+        ModelMatrixName[7][10] := t*0.479;
+        ModelMatrixName[10][7] := t*0.479;
+        ModelMatrixName[7][11] := t*0.047;
+        ModelMatrixName[11][7] := t*0.047;
+        ModelMatrixName[7][12] := t*0.01;
+        ModelMatrixName[12][7] := t*0.01;
+        ModelMatrixName[7][13] := t*0.009;
+        ModelMatrixName[13][7] := t*0.009;
+        ModelMatrixName[7][14] := t*0.022;
+        ModelMatrixName[14][7] := t*0.022;
+        ModelMatrixName[7][15] := t*0.04;
+        ModelMatrixName[15][7] := t*0.04;
+        ModelMatrixName[7][16] := t*0.245;
+        ModelMatrixName[16][7] := t*0.245;
+        ModelMatrixName[7][17] := t*0.961;
+        ModelMatrixName[17][7] := t*0.961;
+        ModelMatrixName[7][18] := t*0.009;
+        ModelMatrixName[18][7] := t*0.009;
+        ModelMatrixName[7][19] := t*0.032;
+        ModelMatrixName[19][7] := t*0.032;
+        ModelMatrixName[8][9] := t*0.014;
+        ModelMatrixName[9][8] := t*0.014;
+        ModelMatrixName[8][10] := t*0.065;
+        ModelMatrixName[10][8] := t*0.065;
+        ModelMatrixName[8][11] := t*0.263;
+        ModelMatrixName[11][8] := t*0.263;
+        ModelMatrixName[8][12] := t*0.021;
+        ModelMatrixName[12][8] := t*0.021;
+        ModelMatrixName[8][13] := t*0.292;
+        ModelMatrixName[13][8] := t*0.292;
+        ModelMatrixName[8][14] := t*0.646;
+        ModelMatrixName[14][8] := t*0.646;
+        ModelMatrixName[8][15] := t*0.047;
+        ModelMatrixName[15][8] := t*0.047;
+        ModelMatrixName[8][16] := t*0.103;
+        ModelMatrixName[16][8] := t*0.103;
+        ModelMatrixName[8][17] := t*0.014;
+        ModelMatrixName[17][8] := t*0.014;
+        ModelMatrixName[8][18] := t*0.01;
+        ModelMatrixName[18][8] := t*0.01;
+        ModelMatrixName[8][19] := t*0.008;
+        ModelMatrixName[19][8] := t*0.008;
+        ModelMatrixName[9][10] := t*0.388;
+        ModelMatrixName[10][9] := t*0.388;
+        ModelMatrixName[9][11] := t*0.012;
+        ModelMatrixName[11][9] := t*0.012;
+        ModelMatrixName[9][12] := t*0.102;
+        ModelMatrixName[12][9] := t*0.102;
+        ModelMatrixName[9][13] := t*0.072;
+        ModelMatrixName[13][9] := t*0.072;
+        ModelMatrixName[9][14] := t*0.038;
+        ModelMatrixName[14][9] := t*0.038;
+        ModelMatrixName[9][15] := t*0.059;
+        ModelMatrixName[15][9] := t*0.059;
+        ModelMatrixName[9][16] := t*0.025;
+        ModelMatrixName[16][9] := t*0.025;
+        ModelMatrixName[9][17] := t*0.18;
+        ModelMatrixName[17][9] := t*0.18;
+        ModelMatrixName[9][18] := t*0.052;
+        ModelMatrixName[18][9] := t*0.052;
+        ModelMatrixName[9][19] := t*0.024;
+        ModelMatrixName[19][9] := t*0.024;
+        ModelMatrixName[10][11] := t*0.03;
+        ModelMatrixName[11][10] := t*0.03;
+        ModelMatrixName[10][12] := t*0.016;
+        ModelMatrixName[12][10] := t*0.016;
+        ModelMatrixName[10][13] := t*0.043;
+        ModelMatrixName[13][10] := t*0.043;
+        ModelMatrixName[10][14] := t*0.044;
+        ModelMatrixName[14][10] := t*0.044;
+        ModelMatrixName[10][15] := t*0.029;
+        ModelMatrixName[15][10] := t*0.029;
+        ModelMatrixName[10][16] := t*0.226;
+        ModelMatrixName[16][10] := t*0.226;
+        ModelMatrixName[10][17] := t*0.323;
+        ModelMatrixName[17][10] := t*0.323;
+        ModelMatrixName[10][18] := t*0.024;
+        ModelMatrixName[18][10] := t*0.024;
+        ModelMatrixName[10][19] := t*0.018;
+        ModelMatrixName[19][10] := t*0.018;
+        ModelMatrixName[11][12] := t*0.015;
+        ModelMatrixName[12][11] := t*0.015;
+        ModelMatrixName[11][13] := t*0.086;
+        ModelMatrixName[13][11] := t*0.086;
+        ModelMatrixName[11][14] := t*0.045;
+        ModelMatrixName[14][11] := t*0.045;
+        ModelMatrixName[11][15] := t*0.503;
+        ModelMatrixName[15][11] := t*0.503;
+        ModelMatrixName[11][16] := t*0.232;
+        ModelMatrixName[16][11] := t*0.232;
+        ModelMatrixName[11][17] := t*0.016;
+        ModelMatrixName[17][11] := t*0.016;
+        ModelMatrixName[11][18] := t*0.008;
+        ModelMatrixName[18][11] := t*0.008;
+        ModelMatrixName[11][19] := t*0.07;
+        ModelMatrixName[19][11] := t*0.07;
+        ModelMatrixName[12][13] := t*0.164;
+        ModelMatrixName[13][12] := t*0.164;
+        ModelMatrixName[12][14] := t*0.074;
+        ModelMatrixName[14][12] := t*0.074;
+        ModelMatrixName[12][15] := t*0.285;
+        ModelMatrixName[15][12] := t*0.285;
+        ModelMatrixName[12][16] := t*0.118;
+        ModelMatrixName[16][12] := t*0.118;
+        ModelMatrixName[12][17] := t*0.023;
+        ModelMatrixName[17][12] := t*0.023;
+        ModelMatrixName[12][18] := t*0.006;
+        ModelMatrixName[18][12] := t*0.006;
+        ModelMatrixName[12][19] := t*0.01;
+        ModelMatrixName[19][12] := t*0.01;
+        ModelMatrixName[13][14] := t*0.31;
+        ModelMatrixName[14][13] := t*0.31;
+        ModelMatrixName[13][15] := t*0.053;
+        ModelMatrixName[15][13] := t*0.053;
+        ModelMatrixName[13][16] := t*0.051;
+        ModelMatrixName[16][13] := t*0.051;
+        ModelMatrixName[13][17] := t*0.02;
+        ModelMatrixName[17][13] := t*0.02;
+        ModelMatrixName[13][18] := t*0.018;
+        ModelMatrixName[18][13] := t*0.018;
+        ModelMatrixName[13][19] := t*0.024;
+        ModelMatrixName[19][13] := t*0.024;
+        ModelMatrixName[14][15] := t*0.101;
+        ModelMatrixName[15][14] := t*0.101;
+        ModelMatrixName[14][16] := t*0.064;
+        ModelMatrixName[16][14] := t*0.064;
+        ModelMatrixName[14][17] := t*0.017;
+        ModelMatrixName[17][14] := t*0.017;
+        ModelMatrixName[14][18] := t*0.126;
+        ModelMatrixName[18][14] := t*0.126;
+        ModelMatrixName[14][19] := t*0.02;
+        ModelMatrixName[19][14] := t*0.02;
+        ModelMatrixName[15][16] := t*0.477;
+        ModelMatrixName[16][15] := t*0.477;
+        ModelMatrixName[15][17] := t*0.038;
+        ModelMatrixName[17][15] := t*0.038;
+        ModelMatrixName[15][18] := t*0.035;
+        ModelMatrixName[18][15] := t*0.035;
+        ModelMatrixName[15][19] := t*0.063;
+        ModelMatrixName[19][15] := t*0.063;
+        ModelMatrixName[16][17] := t*0.112;
+        ModelMatrixName[17][16] := t*0.112;
+        ModelMatrixName[16][18] := t*0.012;
+        ModelMatrixName[18][16] := t*0.012;
+        ModelMatrixName[16][19] := t*0.021;
+        ModelMatrixName[19][16] := t*0.021;
+        ModelMatrixName[17][18] := t*0.025;
+        ModelMatrixName[18][17] := t*0.025;
+        ModelMatrixName[17][19] := t*0.016;
+        ModelMatrixName[19][17] := t*0.016;
+        ModelMatrixName[18][19] := t*0.071;
+        ModelMatrixName[19][18] := t*0.071;
+    }
+	return 1;
+}
+
+Model_EFV_Vector = {20,1};
+Model_EFV_Vector[0][0]=0.076748;
+Model_EFV_Vector[14][0]=0.051691;
+Model_EFV_Vector[11][0]=0.042645;
+Model_EFV_Vector[2][0]=0.051544;
+Model_EFV_Vector[1][0]=0.019803;
+Model_EFV_Vector[13][0]=0.040752;
+Model_EFV_Vector[3][0]=0.06183;
+Model_EFV_Vector[5][0]=0.073152;
+Model_EFV_Vector[6][0]=0.022944;
+Model_EFV_Vector[7][0]=0.053761;
+Model_EFV_Vector[9][0]=0.091904;
+Model_EFV_Vector[8][0]=0.058676;
+Model_EFV_Vector[10][0]=0.023826;
+Model_EFV_Vector[4][0]=0.040126;
+Model_EFV_Vector[12][0]=0.050901;
+Model_EFV_Vector[15][0]=0.068765;
+Model_EFV_Vector[16][0]=0.058565;
+Model_EFV_Vector[18][0]=0.014261;
+Model_EFV_Vector[19][0]=0.032102;
+Model_EFV_Vector[17][0]=0.066005;
+
diff --git a/res/SubstitutionModels/Aminoacid/mtREV.mdl b/res/SubstitutionModels/Aminoacid/mtREV.mdl
new file mode 100644
index 0000000..9abcedf
--- /dev/null
+++ b/res/SubstitutionModels/Aminoacid/mtREV.mdl
@@ -0,0 +1,1213 @@
+Model_Name  		= "GeneralReversible";
+Model_Options 		= 3;
+Model_Dimension 	= 20;
+Model_Data_Type		= 1;
+
+function GUIPopulateModelMatrix (ModelMatrixName&, EFV)
+{
+	ModelMatrixName = {20,20};
+	
+	if (modelType == 1)
+	{
+		ModelMatrixName[0][1]:=t;
+		ModelMatrixName[1][0]:=t;
+		global globalVariable_AD = 1;
+		ModelMatrixName[0][2]:=globalVariable_AD*t;
+		ModelMatrixName[2][0]:=globalVariable_AD*t;
+		global globalVariable_AE = 1;
+		ModelMatrixName[0][3]:=globalVariable_AE*t;
+		ModelMatrixName[3][0]:=globalVariable_AE*t;
+		global globalVariable_AF = 1;
+		ModelMatrixName[0][4]:=globalVariable_AF*t;
+		ModelMatrixName[4][0]:=globalVariable_AF*t;
+		global globalVariable_AG = 1;
+		ModelMatrixName[0][5]:=globalVariable_AG*t;
+		ModelMatrixName[5][0]:=globalVariable_AG*t;
+		global globalVariable_AH = 1;
+		ModelMatrixName[0][6]:=globalVariable_AH*t;
+		ModelMatrixName[6][0]:=globalVariable_AH*t;
+		global globalVariable_AI = 1;
+		ModelMatrixName[0][7]:=globalVariable_AI*t;
+		ModelMatrixName[7][0]:=globalVariable_AI*t;
+		global globalVariable_AK = 1;
+		ModelMatrixName[0][8]:=globalVariable_AK*t;
+		ModelMatrixName[8][0]:=globalVariable_AK*t;
+		global globalVariable_AL = 1;
+		ModelMatrixName[0][9]:=globalVariable_AL*t;
+		ModelMatrixName[9][0]:=globalVariable_AL*t;
+		global globalVariable_AM = 1;
+		ModelMatrixName[0][10]:=globalVariable_AM*t;
+		ModelMatrixName[10][0]:=globalVariable_AM*t;
+		global globalVariable_AN = 1;
+		ModelMatrixName[0][11]:=globalVariable_AN*t;
+		ModelMatrixName[11][0]:=globalVariable_AN*t;
+		global globalVariable_AP = 1;
+		ModelMatrixName[0][12]:=globalVariable_AP*t;
+		ModelMatrixName[12][0]:=globalVariable_AP*t;
+		global globalVariable_AQ = 1;
+		ModelMatrixName[0][13]:=globalVariable_AQ*t;
+		ModelMatrixName[13][0]:=globalVariable_AQ*t;
+		global globalVariable_AR = 1;
+		ModelMatrixName[0][14]:=globalVariable_AR*t;
+		ModelMatrixName[14][0]:=globalVariable_AR*t;
+		global globalVariable_AS = 1;
+		ModelMatrixName[0][15]:=globalVariable_AS*t;
+		ModelMatrixName[15][0]:=globalVariable_AS*t;
+		global globalVariable_AT = 1;
+		ModelMatrixName[0][16]:=globalVariable_AT*t;
+		ModelMatrixName[16][0]:=globalVariable_AT*t;
+		global globalVariable_AV = 1;
+		ModelMatrixName[0][17]:=globalVariable_AV*t;
+		ModelMatrixName[17][0]:=globalVariable_AV*t;
+		global globalVariable_AW = 1;
+		ModelMatrixName[0][18]:=globalVariable_AW*t;
+		ModelMatrixName[18][0]:=globalVariable_AW*t;
+		global globalVariable_AY = 1;
+		ModelMatrixName[0][19]:=globalVariable_AY*t;
+		ModelMatrixName[19][0]:=globalVariable_AY*t;
+		global globalVariable_CD = 1;
+		ModelMatrixName[1][2]:=globalVariable_CD*t;
+		ModelMatrixName[2][1]:=globalVariable_CD*t;
+		global globalVariable_CE = 1;
+		ModelMatrixName[1][3]:=globalVariable_CE*t;
+		ModelMatrixName[3][1]:=globalVariable_CE*t;
+		global globalVariable_CF = 1;
+		ModelMatrixName[1][4]:=globalVariable_CF*t;
+		ModelMatrixName[4][1]:=globalVariable_CF*t;
+		global globalVariable_CG = 1;
+		ModelMatrixName[1][5]:=globalVariable_CG*t;
+		ModelMatrixName[5][1]:=globalVariable_CG*t;
+		global globalVariable_CH = 1;
+		ModelMatrixName[1][6]:=globalVariable_CH*t;
+		ModelMatrixName[6][1]:=globalVariable_CH*t;
+		global globalVariable_CI = 1;
+		ModelMatrixName[1][7]:=globalVariable_CI*t;
+		ModelMatrixName[7][1]:=globalVariable_CI*t;
+		global globalVariable_CK = 1;
+		ModelMatrixName[1][8]:=globalVariable_CK*t;
+		ModelMatrixName[8][1]:=globalVariable_CK*t;
+		global globalVariable_CL = 1;
+		ModelMatrixName[1][9]:=globalVariable_CL*t;
+		ModelMatrixName[9][1]:=globalVariable_CL*t;
+		global globalVariable_CM = 1;
+		ModelMatrixName[1][10]:=globalVariable_CM*t;
+		ModelMatrixName[10][1]:=globalVariable_CM*t;
+		global globalVariable_CN = 1;
+		ModelMatrixName[1][11]:=globalVariable_CN*t;
+		ModelMatrixName[11][1]:=globalVariable_CN*t;
+		global globalVariable_CP = 1;
+		ModelMatrixName[1][12]:=globalVariable_CP*t;
+		ModelMatrixName[12][1]:=globalVariable_CP*t;
+		global globalVariable_CQ = 1;
+		ModelMatrixName[1][13]:=globalVariable_CQ*t;
+		ModelMatrixName[13][1]:=globalVariable_CQ*t;
+		global globalVariable_CR = 1;
+		ModelMatrixName[1][14]:=globalVariable_CR*t;
+		ModelMatrixName[14][1]:=globalVariable_CR*t;
+		global globalVariable_CS = 1;
+		ModelMatrixName[1][15]:=globalVariable_CS*t;
+		ModelMatrixName[15][1]:=globalVariable_CS*t;
+		global globalVariable_CT = 1;
+		ModelMatrixName[1][16]:=globalVariable_CT*t;
+		ModelMatrixName[16][1]:=globalVariable_CT*t;
+		global globalVariable_CV = 1;
+		ModelMatrixName[1][17]:=globalVariable_CV*t;
+		ModelMatrixName[17][1]:=globalVariable_CV*t;
+		global globalVariable_CW = 1;
+		ModelMatrixName[1][18]:=globalVariable_CW*t;
+		ModelMatrixName[18][1]:=globalVariable_CW*t;
+		global globalVariable_CY = 1;
+		ModelMatrixName[1][19]:=globalVariable_CY*t;
+		ModelMatrixName[19][1]:=globalVariable_CY*t;
+		global globalVariable_DE = 1;
+		ModelMatrixName[2][3]:=globalVariable_DE*t;
+		ModelMatrixName[3][2]:=globalVariable_DE*t;
+		global globalVariable_DF = 1;
+		ModelMatrixName[2][4]:=globalVariable_DF*t;
+		ModelMatrixName[4][2]:=globalVariable_DF*t;
+		global globalVariable_DG = 1;
+		ModelMatrixName[2][5]:=globalVariable_DG*t;
+		ModelMatrixName[5][2]:=globalVariable_DG*t;
+		global globalVariable_DH = 1;
+		ModelMatrixName[2][6]:=globalVariable_DH*t;
+		ModelMatrixName[6][2]:=globalVariable_DH*t;
+		global globalVariable_DI = 1;
+		ModelMatrixName[2][7]:=globalVariable_DI*t;
+		ModelMatrixName[7][2]:=globalVariable_DI*t;
+		global globalVariable_DK = 1;
+		ModelMatrixName[2][8]:=globalVariable_DK*t;
+		ModelMatrixName[8][2]:=globalVariable_DK*t;
+		global globalVariable_DL = 1;
+		ModelMatrixName[2][9]:=globalVariable_DL*t;
+		ModelMatrixName[9][2]:=globalVariable_DL*t;
+		global globalVariable_DM = 1;
+		ModelMatrixName[2][10]:=globalVariable_DM*t;
+		ModelMatrixName[10][2]:=globalVariable_DM*t;
+		global globalVariable_DN = 1;
+		ModelMatrixName[2][11]:=globalVariable_DN*t;
+		ModelMatrixName[11][2]:=globalVariable_DN*t;
+		global globalVariable_DP = 1;
+		ModelMatrixName[2][12]:=globalVariable_DP*t;
+		ModelMatrixName[12][2]:=globalVariable_DP*t;
+		global globalVariable_DQ = 1;
+		ModelMatrixName[2][13]:=globalVariable_DQ*t;
+		ModelMatrixName[13][2]:=globalVariable_DQ*t;
+		global globalVariable_DR = 1;
+		ModelMatrixName[2][14]:=globalVariable_DR*t;
+		ModelMatrixName[14][2]:=globalVariable_DR*t;
+		global globalVariable_DS = 1;
+		ModelMatrixName[2][15]:=globalVariable_DS*t;
+		ModelMatrixName[15][2]:=globalVariable_DS*t;
+		global globalVariable_DT = 1;
+		ModelMatrixName[2][16]:=globalVariable_DT*t;
+		ModelMatrixName[16][2]:=globalVariable_DT*t;
+		global globalVariable_DV = 1;
+		ModelMatrixName[2][17]:=globalVariable_DV*t;
+		ModelMatrixName[17][2]:=globalVariable_DV*t;
+		global globalVariable_DW = 1;
+		ModelMatrixName[2][18]:=globalVariable_DW*t;
+		ModelMatrixName[18][2]:=globalVariable_DW*t;
+		global globalVariable_DY = 1;
+		ModelMatrixName[2][19]:=globalVariable_DY*t;
+		ModelMatrixName[19][2]:=globalVariable_DY*t;
+		global globalVariable_EF = 1;
+		ModelMatrixName[3][4]:=globalVariable_EF*t;
+		ModelMatrixName[4][3]:=globalVariable_EF*t;
+		global globalVariable_EG = 1;
+		ModelMatrixName[3][5]:=globalVariable_EG*t;
+		ModelMatrixName[5][3]:=globalVariable_EG*t;
+		global globalVariable_EH = 1;
+		ModelMatrixName[3][6]:=globalVariable_EH*t;
+		ModelMatrixName[6][3]:=globalVariable_EH*t;
+		global globalVariable_EI = 1;
+		ModelMatrixName[3][7]:=globalVariable_EI*t;
+		ModelMatrixName[7][3]:=globalVariable_EI*t;
+		global globalVariable_EK = 1;
+		ModelMatrixName[3][8]:=globalVariable_EK*t;
+		ModelMatrixName[8][3]:=globalVariable_EK*t;
+		global globalVariable_EL = 1;
+		ModelMatrixName[3][9]:=globalVariable_EL*t;
+		ModelMatrixName[9][3]:=globalVariable_EL*t;
+		global globalVariable_EM = 1;
+		ModelMatrixName[3][10]:=globalVariable_EM*t;
+		ModelMatrixName[10][3]:=globalVariable_EM*t;
+		global globalVariable_EN = 1;
+		ModelMatrixName[3][11]:=globalVariable_EN*t;
+		ModelMatrixName[11][3]:=globalVariable_EN*t;
+		global globalVariable_EP = 1;
+		ModelMatrixName[3][12]:=globalVariable_EP*t;
+		ModelMatrixName[12][3]:=globalVariable_EP*t;
+		global globalVariable_EQ = 1;
+		ModelMatrixName[3][13]:=globalVariable_EQ*t;
+		ModelMatrixName[13][3]:=globalVariable_EQ*t;
+		global globalVariable_ER = 1;
+		ModelMatrixName[3][14]:=globalVariable_ER*t;
+		ModelMatrixName[14][3]:=globalVariable_ER*t;
+		global globalVariable_ES = 1;
+		ModelMatrixName[3][15]:=globalVariable_ES*t;
+		ModelMatrixName[15][3]:=globalVariable_ES*t;
+		global globalVariable_ET = 1;
+		ModelMatrixName[3][16]:=globalVariable_ET*t;
+		ModelMatrixName[16][3]:=globalVariable_ET*t;
+		global globalVariable_EV = 1;
+		ModelMatrixName[3][17]:=globalVariable_EV*t;
+		ModelMatrixName[17][3]:=globalVariable_EV*t;
+		global globalVariable_EW = 1;
+		ModelMatrixName[3][18]:=globalVariable_EW*t;
+		ModelMatrixName[18][3]:=globalVariable_EW*t;
+		global globalVariable_EY = 1;
+		ModelMatrixName[3][19]:=globalVariable_EY*t;
+		ModelMatrixName[19][3]:=globalVariable_EY*t;
+		global globalVariable_FG = 1;
+		ModelMatrixName[4][5]:=globalVariable_FG*t;
+		ModelMatrixName[5][4]:=globalVariable_FG*t;
+		global globalVariable_FH = 1;
+		ModelMatrixName[4][6]:=globalVariable_FH*t;
+		ModelMatrixName[6][4]:=globalVariable_FH*t;
+		global globalVariable_FI = 1;
+		ModelMatrixName[4][7]:=globalVariable_FI*t;
+		ModelMatrixName[7][4]:=globalVariable_FI*t;
+		global globalVariable_FK = 1;
+		ModelMatrixName[4][8]:=globalVariable_FK*t;
+		ModelMatrixName[8][4]:=globalVariable_FK*t;
+		global globalVariable_FL = 1;
+		ModelMatrixName[4][9]:=globalVariable_FL*t;
+		ModelMatrixName[9][4]:=globalVariable_FL*t;
+		global globalVariable_FM = 1;
+		ModelMatrixName[4][10]:=globalVariable_FM*t;
+		ModelMatrixName[10][4]:=globalVariable_FM*t;
+		global globalVariable_FN = 1;
+		ModelMatrixName[4][11]:=globalVariable_FN*t;
+		ModelMatrixName[11][4]:=globalVariable_FN*t;
+		global globalVariable_FP = 1;
+		ModelMatrixName[4][12]:=globalVariable_FP*t;
+		ModelMatrixName[12][4]:=globalVariable_FP*t;
+		global globalVariable_FQ = 1;
+		ModelMatrixName[4][13]:=globalVariable_FQ*t;
+		ModelMatrixName[13][4]:=globalVariable_FQ*t;
+		global globalVariable_FR = 1;
+		ModelMatrixName[4][14]:=globalVariable_FR*t;
+		ModelMatrixName[14][4]:=globalVariable_FR*t;
+		global globalVariable_FS = 1;
+		ModelMatrixName[4][15]:=globalVariable_FS*t;
+		ModelMatrixName[15][4]:=globalVariable_FS*t;
+		global globalVariable_FT = 1;
+		ModelMatrixName[4][16]:=globalVariable_FT*t;
+		ModelMatrixName[16][4]:=globalVariable_FT*t;
+		global globalVariable_FV = 1;
+		ModelMatrixName[4][17]:=globalVariable_FV*t;
+		ModelMatrixName[17][4]:=globalVariable_FV*t;
+		global globalVariable_FW = 1;
+		ModelMatrixName[4][18]:=globalVariable_FW*t;
+		ModelMatrixName[18][4]:=globalVariable_FW*t;
+		global globalVariable_FY = 1;
+		ModelMatrixName[4][19]:=globalVariable_FY*t;
+		ModelMatrixName[19][4]:=globalVariable_FY*t;
+		global globalVariable_GH = 1;
+		ModelMatrixName[5][6]:=globalVariable_GH*t;
+		ModelMatrixName[6][5]:=globalVariable_GH*t;
+		global globalVariable_GI = 1;
+		ModelMatrixName[5][7]:=globalVariable_GI*t;
+		ModelMatrixName[7][5]:=globalVariable_GI*t;
+		global globalVariable_GK = 1;
+		ModelMatrixName[5][8]:=globalVariable_GK*t;
+		ModelMatrixName[8][5]:=globalVariable_GK*t;
+		global globalVariable_GL = 1;
+		ModelMatrixName[5][9]:=globalVariable_GL*t;
+		ModelMatrixName[9][5]:=globalVariable_GL*t;
+		global globalVariable_GM = 1;
+		ModelMatrixName[5][10]:=globalVariable_GM*t;
+		ModelMatrixName[10][5]:=globalVariable_GM*t;
+		global globalVariable_GN = 1;
+		ModelMatrixName[5][11]:=globalVariable_GN*t;
+		ModelMatrixName[11][5]:=globalVariable_GN*t;
+		global globalVariable_GP = 1;
+		ModelMatrixName[5][12]:=globalVariable_GP*t;
+		ModelMatrixName[12][5]:=globalVariable_GP*t;
+		global globalVariable_GQ = 1;
+		ModelMatrixName[5][13]:=globalVariable_GQ*t;
+		ModelMatrixName[13][5]:=globalVariable_GQ*t;
+		global globalVariable_GR = 1;
+		ModelMatrixName[5][14]:=globalVariable_GR*t;
+		ModelMatrixName[14][5]:=globalVariable_GR*t;
+		global globalVariable_GS = 1;
+		ModelMatrixName[5][15]:=globalVariable_GS*t;
+		ModelMatrixName[15][5]:=globalVariable_GS*t;
+		global globalVariable_GT = 1;
+		ModelMatrixName[5][16]:=globalVariable_GT*t;
+		ModelMatrixName[16][5]:=globalVariable_GT*t;
+		global globalVariable_GV = 1;
+		ModelMatrixName[5][17]:=globalVariable_GV*t;
+		ModelMatrixName[17][5]:=globalVariable_GV*t;
+		global globalVariable_GW = 1;
+		ModelMatrixName[5][18]:=globalVariable_GW*t;
+		ModelMatrixName[18][5]:=globalVariable_GW*t;
+		global globalVariable_GY = 1;
+		ModelMatrixName[5][19]:=globalVariable_GY*t;
+		ModelMatrixName[19][5]:=globalVariable_GY*t;
+		global globalVariable_HI = 1;
+		ModelMatrixName[6][7]:=globalVariable_HI*t;
+		ModelMatrixName[7][6]:=globalVariable_HI*t;
+		global globalVariable_HK = 1;
+		ModelMatrixName[6][8]:=globalVariable_HK*t;
+		ModelMatrixName[8][6]:=globalVariable_HK*t;
+		global globalVariable_HL = 1;
+		ModelMatrixName[6][9]:=globalVariable_HL*t;
+		ModelMatrixName[9][6]:=globalVariable_HL*t;
+		global globalVariable_HM = 1;
+		ModelMatrixName[6][10]:=globalVariable_HM*t;
+		ModelMatrixName[10][6]:=globalVariable_HM*t;
+		global globalVariable_HN = 1;
+		ModelMatrixName[6][11]:=globalVariable_HN*t;
+		ModelMatrixName[11][6]:=globalVariable_HN*t;
+		global globalVariable_HP = 1;
+		ModelMatrixName[6][12]:=globalVariable_HP*t;
+		ModelMatrixName[12][6]:=globalVariable_HP*t;
+		global globalVariable_HQ = 1;
+		ModelMatrixName[6][13]:=globalVariable_HQ*t;
+		ModelMatrixName[13][6]:=globalVariable_HQ*t;
+		global globalVariable_HR = 1;
+		ModelMatrixName[6][14]:=globalVariable_HR*t;
+		ModelMatrixName[14][6]:=globalVariable_HR*t;
+		global globalVariable_HS = 1;
+		ModelMatrixName[6][15]:=globalVariable_HS*t;
+		ModelMatrixName[15][6]:=globalVariable_HS*t;
+		global globalVariable_HT = 1;
+		ModelMatrixName[6][16]:=globalVariable_HT*t;
+		ModelMatrixName[16][6]:=globalVariable_HT*t;
+		global globalVariable_HV = 1;
+		ModelMatrixName[6][17]:=globalVariable_HV*t;
+		ModelMatrixName[17][6]:=globalVariable_HV*t;
+		global globalVariable_HW = 1;
+		ModelMatrixName[6][18]:=globalVariable_HW*t;
+		ModelMatrixName[18][6]:=globalVariable_HW*t;
+		global globalVariable_HY = 1;
+		ModelMatrixName[6][19]:=globalVariable_HY*t;
+		ModelMatrixName[19][6]:=globalVariable_HY*t;
+		global globalVariable_IK = 1;
+		ModelMatrixName[7][8]:=globalVariable_IK*t;
+		ModelMatrixName[8][7]:=globalVariable_IK*t;
+		global globalVariable_IL = 1;
+		ModelMatrixName[7][9]:=globalVariable_IL*t;
+		ModelMatrixName[9][7]:=globalVariable_IL*t;
+		global globalVariable_IM = 1;
+		ModelMatrixName[7][10]:=globalVariable_IM*t;
+		ModelMatrixName[10][7]:=globalVariable_IM*t;
+		global globalVariable_IN = 1;
+		ModelMatrixName[7][11]:=globalVariable_IN*t;
+		ModelMatrixName[11][7]:=globalVariable_IN*t;
+		global globalVariable_IP = 1;
+		ModelMatrixName[7][12]:=globalVariable_IP*t;
+		ModelMatrixName[12][7]:=globalVariable_IP*t;
+		global globalVariable_IQ = 1;
+		ModelMatrixName[7][13]:=globalVariable_IQ*t;
+		ModelMatrixName[13][7]:=globalVariable_IQ*t;
+		global globalVariable_IR = 1;
+		ModelMatrixName[7][14]:=globalVariable_IR*t;
+		ModelMatrixName[14][7]:=globalVariable_IR*t;
+		global globalVariable_IS = 1;
+		ModelMatrixName[7][15]:=globalVariable_IS*t;
+		ModelMatrixName[15][7]:=globalVariable_IS*t;
+		global globalVariable_IT = 1;
+		ModelMatrixName[7][16]:=globalVariable_IT*t;
+		ModelMatrixName[16][7]:=globalVariable_IT*t;
+		global globalVariable_IV = 1;
+		ModelMatrixName[7][17]:=globalVariable_IV*t;
+		ModelMatrixName[17][7]:=globalVariable_IV*t;
+		global globalVariable_IW = 1;
+		ModelMatrixName[7][18]:=globalVariable_IW*t;
+		ModelMatrixName[18][7]:=globalVariable_IW*t;
+		global globalVariable_IY = 1;
+		ModelMatrixName[7][19]:=globalVariable_IY*t;
+		ModelMatrixName[19][7]:=globalVariable_IY*t;
+		global globalVariable_KL = 1;
+		ModelMatrixName[8][9]:=globalVariable_KL*t;
+		ModelMatrixName[9][8]:=globalVariable_KL*t;
+		global globalVariable_KM = 1;
+		ModelMatrixName[8][10]:=globalVariable_KM*t;
+		ModelMatrixName[10][8]:=globalVariable_KM*t;
+		global globalVariable_KN = 1;
+		ModelMatrixName[8][11]:=globalVariable_KN*t;
+		ModelMatrixName[11][8]:=globalVariable_KN*t;
+		global globalVariable_KP = 1;
+		ModelMatrixName[8][12]:=globalVariable_KP*t;
+		ModelMatrixName[12][8]:=globalVariable_KP*t;
+		global globalVariable_KQ = 1;
+		ModelMatrixName[8][13]:=globalVariable_KQ*t;
+		ModelMatrixName[13][8]:=globalVariable_KQ*t;
+		global globalVariable_KR = 1;
+		ModelMatrixName[8][14]:=globalVariable_KR*t;
+		ModelMatrixName[14][8]:=globalVariable_KR*t;
+		global globalVariable_KS = 1;
+		ModelMatrixName[8][15]:=globalVariable_KS*t;
+		ModelMatrixName[15][8]:=globalVariable_KS*t;
+		global globalVariable_KT = 1;
+		ModelMatrixName[8][16]:=globalVariable_KT*t;
+		ModelMatrixName[16][8]:=globalVariable_KT*t;
+		global globalVariable_KV = 1;
+		ModelMatrixName[8][17]:=globalVariable_KV*t;
+		ModelMatrixName[17][8]:=globalVariable_KV*t;
+		global globalVariable_KW = 1;
+		ModelMatrixName[8][18]:=globalVariable_KW*t;
+		ModelMatrixName[18][8]:=globalVariable_KW*t;
+		global globalVariable_KY = 1;
+		ModelMatrixName[8][19]:=globalVariable_KY*t;
+		ModelMatrixName[19][8]:=globalVariable_KY*t;
+		global globalVariable_LM = 1;
+		ModelMatrixName[9][10]:=globalVariable_LM*t;
+		ModelMatrixName[10][9]:=globalVariable_LM*t;
+		global globalVariable_LN = 1;
+		ModelMatrixName[9][11]:=globalVariable_LN*t;
+		ModelMatrixName[11][9]:=globalVariable_LN*t;
+		global globalVariable_LP = 1;
+		ModelMatrixName[9][12]:=globalVariable_LP*t;
+		ModelMatrixName[12][9]:=globalVariable_LP*t;
+		global globalVariable_LQ = 1;
+		ModelMatrixName[9][13]:=globalVariable_LQ*t;
+		ModelMatrixName[13][9]:=globalVariable_LQ*t;
+		global globalVariable_LR = 1;
+		ModelMatrixName[9][14]:=globalVariable_LR*t;
+		ModelMatrixName[14][9]:=globalVariable_LR*t;
+		global globalVariable_LS = 1;
+		ModelMatrixName[9][15]:=globalVariable_LS*t;
+		ModelMatrixName[15][9]:=globalVariable_LS*t;
+		global globalVariable_LT = 1;
+		ModelMatrixName[9][16]:=globalVariable_LT*t;
+		ModelMatrixName[16][9]:=globalVariable_LT*t;
+		global globalVariable_LV = 1;
+		ModelMatrixName[9][17]:=globalVariable_LV*t;
+		ModelMatrixName[17][9]:=globalVariable_LV*t;
+		global globalVariable_LW = 1;
+		ModelMatrixName[9][18]:=globalVariable_LW*t;
+		ModelMatrixName[18][9]:=globalVariable_LW*t;
+		global globalVariable_LY = 1;
+		ModelMatrixName[9][19]:=globalVariable_LY*t;
+		ModelMatrixName[19][9]:=globalVariable_LY*t;
+		global globalVariable_MN = 1;
+		ModelMatrixName[10][11]:=globalVariable_MN*t;
+		ModelMatrixName[11][10]:=globalVariable_MN*t;
+		global globalVariable_MP = 1;
+		ModelMatrixName[10][12]:=globalVariable_MP*t;
+		ModelMatrixName[12][10]:=globalVariable_MP*t;
+		global globalVariable_MQ = 1;
+		ModelMatrixName[10][13]:=globalVariable_MQ*t;
+		ModelMatrixName[13][10]:=globalVariable_MQ*t;
+		global globalVariable_MR = 1;
+		ModelMatrixName[10][14]:=globalVariable_MR*t;
+		ModelMatrixName[14][10]:=globalVariable_MR*t;
+		global globalVariable_MS = 1;
+		ModelMatrixName[10][15]:=globalVariable_MS*t;
+		ModelMatrixName[15][10]:=globalVariable_MS*t;
+		global globalVariable_MT = 1;
+		ModelMatrixName[10][16]:=globalVariable_MT*t;
+		ModelMatrixName[16][10]:=globalVariable_MT*t;
+		global globalVariable_MV = 1;
+		ModelMatrixName[10][17]:=globalVariable_MV*t;
+		ModelMatrixName[17][10]:=globalVariable_MV*t;
+		global globalVariable_MW = 1;
+		ModelMatrixName[10][18]:=globalVariable_MW*t;
+		ModelMatrixName[18][10]:=globalVariable_MW*t;
+		global globalVariable_MY = 1;
+		ModelMatrixName[10][19]:=globalVariable_MY*t;
+		ModelMatrixName[19][10]:=globalVariable_MY*t;
+		global globalVariable_NP = 1;
+		ModelMatrixName[11][12]:=globalVariable_NP*t;
+		ModelMatrixName[12][11]:=globalVariable_NP*t;
+		global globalVariable_NQ = 1;
+		ModelMatrixName[11][13]:=globalVariable_NQ*t;
+		ModelMatrixName[13][11]:=globalVariable_NQ*t;
+		global globalVariable_NR = 1;
+		ModelMatrixName[11][14]:=globalVariable_NR*t;
+		ModelMatrixName[14][11]:=globalVariable_NR*t;
+		global globalVariable_NS = 1;
+		ModelMatrixName[11][15]:=globalVariable_NS*t;
+		ModelMatrixName[15][11]:=globalVariable_NS*t;
+		global globalVariable_NT = 1;
+		ModelMatrixName[11][16]:=globalVariable_NT*t;
+		ModelMatrixName[16][11]:=globalVariable_NT*t;
+		global globalVariable_NV = 1;
+		ModelMatrixName[11][17]:=globalVariable_NV*t;
+		ModelMatrixName[17][11]:=globalVariable_NV*t;
+		global globalVariable_NW = 1;
+		ModelMatrixName[11][18]:=globalVariable_NW*t;
+		ModelMatrixName[18][11]:=globalVariable_NW*t;
+		global globalVariable_NY = 1;
+		ModelMatrixName[11][19]:=globalVariable_NY*t;
+		ModelMatrixName[19][11]:=globalVariable_NY*t;
+		global globalVariable_PQ = 1;
+		ModelMatrixName[12][13]:=globalVariable_PQ*t;
+		ModelMatrixName[13][12]:=globalVariable_PQ*t;
+		global globalVariable_PR = 1;
+		ModelMatrixName[12][14]:=globalVariable_PR*t;
+		ModelMatrixName[14][12]:=globalVariable_PR*t;
+		global globalVariable_PS = 1;
+		ModelMatrixName[12][15]:=globalVariable_PS*t;
+		ModelMatrixName[15][12]:=globalVariable_PS*t;
+		global globalVariable_PT = 1;
+		ModelMatrixName[12][16]:=globalVariable_PT*t;
+		ModelMatrixName[16][12]:=globalVariable_PT*t;
+		global globalVariable_PV = 1;
+		ModelMatrixName[12][17]:=globalVariable_PV*t;
+		ModelMatrixName[17][12]:=globalVariable_PV*t;
+		global globalVariable_PW = 1;
+		ModelMatrixName[12][18]:=globalVariable_PW*t;
+		ModelMatrixName[18][12]:=globalVariable_PW*t;
+		global globalVariable_PY = 1;
+		ModelMatrixName[12][19]:=globalVariable_PY*t;
+		ModelMatrixName[19][12]:=globalVariable_PY*t;
+		global globalVariable_QR = 1;
+		ModelMatrixName[13][14]:=globalVariable_QR*t;
+		ModelMatrixName[14][13]:=globalVariable_QR*t;
+		global globalVariable_QS = 1;
+		ModelMatrixName[13][15]:=globalVariable_QS*t;
+		ModelMatrixName[15][13]:=globalVariable_QS*t;
+		global globalVariable_QT = 1;
+		ModelMatrixName[13][16]:=globalVariable_QT*t;
+		ModelMatrixName[16][13]:=globalVariable_QT*t;
+		global globalVariable_QV = 1;
+		ModelMatrixName[13][17]:=globalVariable_QV*t;
+		ModelMatrixName[17][13]:=globalVariable_QV*t;
+		global globalVariable_QW = 1;
+		ModelMatrixName[13][18]:=globalVariable_QW*t;
+		ModelMatrixName[18][13]:=globalVariable_QW*t;
+		global globalVariable_QY = 1;
+		ModelMatrixName[13][19]:=globalVariable_QY*t;
+		ModelMatrixName[19][13]:=globalVariable_QY*t;
+		global globalVariable_RS = 1;
+		ModelMatrixName[14][15]:=globalVariable_RS*t;
+		ModelMatrixName[15][14]:=globalVariable_RS*t;
+		global globalVariable_RT = 1;
+		ModelMatrixName[14][16]:=globalVariable_RT*t;
+		ModelMatrixName[16][14]:=globalVariable_RT*t;
+		global globalVariable_RV = 1;
+		ModelMatrixName[14][17]:=globalVariable_RV*t;
+		ModelMatrixName[17][14]:=globalVariable_RV*t;
+		global globalVariable_RW = 1;
+		ModelMatrixName[14][18]:=globalVariable_RW*t;
+		ModelMatrixName[18][14]:=globalVariable_RW*t;
+		global globalVariable_RY = 1;
+		ModelMatrixName[14][19]:=globalVariable_RY*t;
+		ModelMatrixName[19][14]:=globalVariable_RY*t;
+		global globalVariable_ST = 1;
+		ModelMatrixName[15][16]:=globalVariable_ST*t;
+		ModelMatrixName[16][15]:=globalVariable_ST*t;
+		global globalVariable_SV = 1;
+		ModelMatrixName[15][17]:=globalVariable_SV*t;
+		ModelMatrixName[17][15]:=globalVariable_SV*t;
+		global globalVariable_SW = 1;
+		ModelMatrixName[15][18]:=globalVariable_SW*t;
+		ModelMatrixName[18][15]:=globalVariable_SW*t;
+		global globalVariable_SY = 1;
+		ModelMatrixName[15][19]:=globalVariable_SY*t;
+		ModelMatrixName[19][15]:=globalVariable_SY*t;
+		global globalVariable_TV = 1;
+		ModelMatrixName[16][17]:=globalVariable_TV*t;
+		ModelMatrixName[17][16]:=globalVariable_TV*t;
+		global globalVariable_TW = 1;
+		ModelMatrixName[16][18]:=globalVariable_TW*t;
+		ModelMatrixName[18][16]:=globalVariable_TW*t;
+		global globalVariable_TY = 1;
+		ModelMatrixName[16][19]:=globalVariable_TY*t;
+		ModelMatrixName[19][16]:=globalVariable_TY*t;
+		global globalVariable_VW = 1;
+		ModelMatrixName[17][18]:=globalVariable_VW*t;
+		ModelMatrixName[18][17]:=globalVariable_VW*t;
+		global globalVariable_VY = 1;
+		ModelMatrixName[17][19]:=globalVariable_VY*t;
+		ModelMatrixName[19][17]:=globalVariable_VY*t;
+		global globalVariable_WY = 1;
+		ModelMatrixName[18][19]:=globalVariable_WY*t;
+		ModelMatrixName[19][18]:=globalVariable_WY*t;
+	}	
+	else
+	{
+		global shapeParameter = .5;
+		shapeParameter:>0.01;shapeParameter:<100;
+		category     categoryVariable = 
+					(rateClassCount, EQUAL, MEAN, GammaDist(_x_,shapeParameter,shapeParameter), CGammaDist(_x_,shapeParameter,shapeParameter), 0 , 
+			  							1e25,CGammaDist(_x_,shapeParameter+1,shapeParameter));
+
+		ModelMatrixName[0][1]:= categoryVariable*t;
+		ModelMatrixName[1][0]:= categoryVariable*t;
+		global globalVariable_AD = 1;
+		ModelMatrixName[0][2]:= categoryVariable*globalVariable_AD*t;
+		ModelMatrixName[2][0]:= categoryVariable*globalVariable_AD*t;
+		global globalVariable_AE = 1;
+		ModelMatrixName[0][3]:= categoryVariable*globalVariable_AE*t;
+		ModelMatrixName[3][0]:= categoryVariable*globalVariable_AE*t;
+		global globalVariable_AF = 1;
+		ModelMatrixName[0][4]:= categoryVariable*globalVariable_AF*t;
+		ModelMatrixName[4][0]:= categoryVariable*globalVariable_AF*t;
+		global globalVariable_AG = 1;
+		ModelMatrixName[0][5]:= categoryVariable*globalVariable_AG*t;
+		ModelMatrixName[5][0]:= categoryVariable*globalVariable_AG*t;
+		global globalVariable_AH = 1;
+		ModelMatrixName[0][6]:= categoryVariable*globalVariable_AH*t;
+		ModelMatrixName[6][0]:= categoryVariable*globalVariable_AH*t;
+		global globalVariable_AI = 1;
+		ModelMatrixName[0][7]:= categoryVariable*globalVariable_AI*t;
+		ModelMatrixName[7][0]:= categoryVariable*globalVariable_AI*t;
+		global globalVariable_AK = 1;
+		ModelMatrixName[0][8]:= categoryVariable*globalVariable_AK*t;
+		ModelMatrixName[8][0]:= categoryVariable*globalVariable_AK*t;
+		global globalVariable_AL = 1;
+		ModelMatrixName[0][9]:= categoryVariable*globalVariable_AL*t;
+		ModelMatrixName[9][0]:= categoryVariable*globalVariable_AL*t;
+		global globalVariable_AM = 1;
+		ModelMatrixName[0][10]:= categoryVariable*globalVariable_AM*t;
+		ModelMatrixName[10][0]:= categoryVariable*globalVariable_AM*t;
+		global globalVariable_AN = 1;
+		ModelMatrixName[0][11]:= categoryVariable*globalVariable_AN*t;
+		ModelMatrixName[11][0]:= categoryVariable*globalVariable_AN*t;
+		global globalVariable_AP = 1;
+		ModelMatrixName[0][12]:= categoryVariable*globalVariable_AP*t;
+		ModelMatrixName[12][0]:= categoryVariable*globalVariable_AP*t;
+		global globalVariable_AQ = 1;
+		ModelMatrixName[0][13]:= categoryVariable*globalVariable_AQ*t;
+		ModelMatrixName[13][0]:= categoryVariable*globalVariable_AQ*t;
+		global globalVariable_AR = 1;
+		ModelMatrixName[0][14]:= categoryVariable*globalVariable_AR*t;
+		ModelMatrixName[14][0]:= categoryVariable*globalVariable_AR*t;
+		global globalVariable_AS = 1;
+		ModelMatrixName[0][15]:= categoryVariable*globalVariable_AS*t;
+		ModelMatrixName[15][0]:= categoryVariable*globalVariable_AS*t;
+		global globalVariable_AT = 1;
+		ModelMatrixName[0][16]:= categoryVariable*globalVariable_AT*t;
+		ModelMatrixName[16][0]:= categoryVariable*globalVariable_AT*t;
+		global globalVariable_AV = 1;
+		ModelMatrixName[0][17]:= categoryVariable*globalVariable_AV*t;
+		ModelMatrixName[17][0]:= categoryVariable*globalVariable_AV*t;
+		global globalVariable_AW = 1;
+		ModelMatrixName[0][18]:= categoryVariable*globalVariable_AW*t;
+		ModelMatrixName[18][0]:= categoryVariable*globalVariable_AW*t;
+		global globalVariable_AY = 1;
+		ModelMatrixName[0][19]:= categoryVariable*globalVariable_AY*t;
+		ModelMatrixName[19][0]:= categoryVariable*globalVariable_AY*t;
+		global globalVariable_CD = 1;
+		ModelMatrixName[1][2]:= categoryVariable*globalVariable_CD*t;
+		ModelMatrixName[2][1]:= categoryVariable*globalVariable_CD*t;
+		global globalVariable_CE = 1;
+		ModelMatrixName[1][3]:= categoryVariable*globalVariable_CE*t;
+		ModelMatrixName[3][1]:= categoryVariable*globalVariable_CE*t;
+		global globalVariable_CF = 1;
+		ModelMatrixName[1][4]:= categoryVariable*globalVariable_CF*t;
+		ModelMatrixName[4][1]:= categoryVariable*globalVariable_CF*t;
+		global globalVariable_CG = 1;
+		ModelMatrixName[1][5]:= categoryVariable*globalVariable_CG*t;
+		ModelMatrixName[5][1]:= categoryVariable*globalVariable_CG*t;
+		global globalVariable_CH = 1;
+		ModelMatrixName[1][6]:= categoryVariable*globalVariable_CH*t;
+		ModelMatrixName[6][1]:= categoryVariable*globalVariable_CH*t;
+		global globalVariable_CI = 1;
+		ModelMatrixName[1][7]:= categoryVariable*globalVariable_CI*t;
+		ModelMatrixName[7][1]:= categoryVariable*globalVariable_CI*t;
+		global globalVariable_CK = 1;
+		ModelMatrixName[1][8]:= categoryVariable*globalVariable_CK*t;
+		ModelMatrixName[8][1]:= categoryVariable*globalVariable_CK*t;
+		global globalVariable_CL = 1;
+		ModelMatrixName[1][9]:= categoryVariable*globalVariable_CL*t;
+		ModelMatrixName[9][1]:= categoryVariable*globalVariable_CL*t;
+		global globalVariable_CM = 1;
+		ModelMatrixName[1][10]:= categoryVariable*globalVariable_CM*t;
+		ModelMatrixName[10][1]:= categoryVariable*globalVariable_CM*t;
+		global globalVariable_CN = 1;
+		ModelMatrixName[1][11]:= categoryVariable*globalVariable_CN*t;
+		ModelMatrixName[11][1]:= categoryVariable*globalVariable_CN*t;
+		global globalVariable_CP = 1;
+		ModelMatrixName[1][12]:= categoryVariable*globalVariable_CP*t;
+		ModelMatrixName[12][1]:= categoryVariable*globalVariable_CP*t;
+		global globalVariable_CQ = 1;
+		ModelMatrixName[1][13]:= categoryVariable*globalVariable_CQ*t;
+		ModelMatrixName[13][1]:= categoryVariable*globalVariable_CQ*t;
+		global globalVariable_CR = 1;
+		ModelMatrixName[1][14]:= categoryVariable*globalVariable_CR*t;
+		ModelMatrixName[14][1]:= categoryVariable*globalVariable_CR*t;
+		global globalVariable_CS = 1;
+		ModelMatrixName[1][15]:= categoryVariable*globalVariable_CS*t;
+		ModelMatrixName[15][1]:= categoryVariable*globalVariable_CS*t;
+		global globalVariable_CT = 1;
+		ModelMatrixName[1][16]:= categoryVariable*globalVariable_CT*t;
+		ModelMatrixName[16][1]:= categoryVariable*globalVariable_CT*t;
+		global globalVariable_CV = 1;
+		ModelMatrixName[1][17]:= categoryVariable*globalVariable_CV*t;
+		ModelMatrixName[17][1]:= categoryVariable*globalVariable_CV*t;
+		global globalVariable_CW = 1;
+		ModelMatrixName[1][18]:= categoryVariable*globalVariable_CW*t;
+		ModelMatrixName[18][1]:= categoryVariable*globalVariable_CW*t;
+		global globalVariable_CY = 1;
+		ModelMatrixName[1][19]:= categoryVariable*globalVariable_CY*t;
+		ModelMatrixName[19][1]:= categoryVariable*globalVariable_CY*t;
+		global globalVariable_DE = 1;
+		ModelMatrixName[2][3]:= categoryVariable*globalVariable_DE*t;
+		ModelMatrixName[3][2]:= categoryVariable*globalVariable_DE*t;
+		global globalVariable_DF = 1;
+		ModelMatrixName[2][4]:= categoryVariable*globalVariable_DF*t;
+		ModelMatrixName[4][2]:= categoryVariable*globalVariable_DF*t;
+		global globalVariable_DG = 1;
+		ModelMatrixName[2][5]:= categoryVariable*globalVariable_DG*t;
+		ModelMatrixName[5][2]:= categoryVariable*globalVariable_DG*t;
+		global globalVariable_DH = 1;
+		ModelMatrixName[2][6]:= categoryVariable*globalVariable_DH*t;
+		ModelMatrixName[6][2]:= categoryVariable*globalVariable_DH*t;
+		global globalVariable_DI = 1;
+		ModelMatrixName[2][7]:= categoryVariable*globalVariable_DI*t;
+		ModelMatrixName[7][2]:= categoryVariable*globalVariable_DI*t;
+		global globalVariable_DK = 1;
+		ModelMatrixName[2][8]:= categoryVariable*globalVariable_DK*t;
+		ModelMatrixName[8][2]:= categoryVariable*globalVariable_DK*t;
+		global globalVariable_DL = 1;
+		ModelMatrixName[2][9]:= categoryVariable*globalVariable_DL*t;
+		ModelMatrixName[9][2]:= categoryVariable*globalVariable_DL*t;
+		global globalVariable_DM = 1;
+		ModelMatrixName[2][10]:= categoryVariable*globalVariable_DM*t;
+		ModelMatrixName[10][2]:= categoryVariable*globalVariable_DM*t;
+		global globalVariable_DN = 1;
+		ModelMatrixName[2][11]:= categoryVariable*globalVariable_DN*t;
+		ModelMatrixName[11][2]:= categoryVariable*globalVariable_DN*t;
+		global globalVariable_DP = 1;
+		ModelMatrixName[2][12]:= categoryVariable*globalVariable_DP*t;
+		ModelMatrixName[12][2]:= categoryVariable*globalVariable_DP*t;
+		global globalVariable_DQ = 1;
+		ModelMatrixName[2][13]:= categoryVariable*globalVariable_DQ*t;
+		ModelMatrixName[13][2]:= categoryVariable*globalVariable_DQ*t;
+		global globalVariable_DR = 1;
+		ModelMatrixName[2][14]:= categoryVariable*globalVariable_DR*t;
+		ModelMatrixName[14][2]:= categoryVariable*globalVariable_DR*t;
+		global globalVariable_DS = 1;
+		ModelMatrixName[2][15]:= categoryVariable*globalVariable_DS*t;
+		ModelMatrixName[15][2]:= categoryVariable*globalVariable_DS*t;
+		global globalVariable_DT = 1;
+		ModelMatrixName[2][16]:= categoryVariable*globalVariable_DT*t;
+		ModelMatrixName[16][2]:= categoryVariable*globalVariable_DT*t;
+		global globalVariable_DV = 1;
+		ModelMatrixName[2][17]:= categoryVariable*globalVariable_DV*t;
+		ModelMatrixName[17][2]:= categoryVariable*globalVariable_DV*t;
+		global globalVariable_DW = 1;
+		ModelMatrixName[2][18]:= categoryVariable*globalVariable_DW*t;
+		ModelMatrixName[18][2]:= categoryVariable*globalVariable_DW*t;
+		global globalVariable_DY = 1;
+		ModelMatrixName[2][19]:= categoryVariable*globalVariable_DY*t;
+		ModelMatrixName[19][2]:= categoryVariable*globalVariable_DY*t;
+		global globalVariable_EF = 1;
+		ModelMatrixName[3][4]:= categoryVariable*globalVariable_EF*t;
+		ModelMatrixName[4][3]:= categoryVariable*globalVariable_EF*t;
+		global globalVariable_EG = 1;
+		ModelMatrixName[3][5]:= categoryVariable*globalVariable_EG*t;
+		ModelMatrixName[5][3]:= categoryVariable*globalVariable_EG*t;
+		global globalVariable_EH = 1;
+		ModelMatrixName[3][6]:= categoryVariable*globalVariable_EH*t;
+		ModelMatrixName[6][3]:= categoryVariable*globalVariable_EH*t;
+		global globalVariable_EI = 1;
+		ModelMatrixName[3][7]:= categoryVariable*globalVariable_EI*t;
+		ModelMatrixName[7][3]:= categoryVariable*globalVariable_EI*t;
+		global globalVariable_EK = 1;
+		ModelMatrixName[3][8]:= categoryVariable*globalVariable_EK*t;
+		ModelMatrixName[8][3]:= categoryVariable*globalVariable_EK*t;
+		global globalVariable_EL = 1;
+		ModelMatrixName[3][9]:= categoryVariable*globalVariable_EL*t;
+		ModelMatrixName[9][3]:= categoryVariable*globalVariable_EL*t;
+		global globalVariable_EM = 1;
+		ModelMatrixName[3][10]:= categoryVariable*globalVariable_EM*t;
+		ModelMatrixName[10][3]:= categoryVariable*globalVariable_EM*t;
+		global globalVariable_EN = 1;
+		ModelMatrixName[3][11]:= categoryVariable*globalVariable_EN*t;
+		ModelMatrixName[11][3]:= categoryVariable*globalVariable_EN*t;
+		global globalVariable_EP = 1;
+		ModelMatrixName[3][12]:= categoryVariable*globalVariable_EP*t;
+		ModelMatrixName[12][3]:= categoryVariable*globalVariable_EP*t;
+		global globalVariable_EQ = 1;
+		ModelMatrixName[3][13]:= categoryVariable*globalVariable_EQ*t;
+		ModelMatrixName[13][3]:= categoryVariable*globalVariable_EQ*t;
+		global globalVariable_ER = 1;
+		ModelMatrixName[3][14]:= categoryVariable*globalVariable_ER*t;
+		ModelMatrixName[14][3]:= categoryVariable*globalVariable_ER*t;
+		global globalVariable_ES = 1;
+		ModelMatrixName[3][15]:= categoryVariable*globalVariable_ES*t;
+		ModelMatrixName[15][3]:= categoryVariable*globalVariable_ES*t;
+		global globalVariable_ET = 1;
+		ModelMatrixName[3][16]:= categoryVariable*globalVariable_ET*t;
+		ModelMatrixName[16][3]:= categoryVariable*globalVariable_ET*t;
+		global globalVariable_EV = 1;
+		ModelMatrixName[3][17]:= categoryVariable*globalVariable_EV*t;
+		ModelMatrixName[17][3]:= categoryVariable*globalVariable_EV*t;
+		global globalVariable_EW = 1;
+		ModelMatrixName[3][18]:= categoryVariable*globalVariable_EW*t;
+		ModelMatrixName[18][3]:= categoryVariable*globalVariable_EW*t;
+		global globalVariable_EY = 1;
+		ModelMatrixName[3][19]:= categoryVariable*globalVariable_EY*t;
+		ModelMatrixName[19][3]:= categoryVariable*globalVariable_EY*t;
+		global globalVariable_FG = 1;
+		ModelMatrixName[4][5]:= categoryVariable*globalVariable_FG*t;
+		ModelMatrixName[5][4]:= categoryVariable*globalVariable_FG*t;
+		global globalVariable_FH = 1;
+		ModelMatrixName[4][6]:= categoryVariable*globalVariable_FH*t;
+		ModelMatrixName[6][4]:= categoryVariable*globalVariable_FH*t;
+		global globalVariable_FI = 1;
+		ModelMatrixName[4][7]:= categoryVariable*globalVariable_FI*t;
+		ModelMatrixName[7][4]:= categoryVariable*globalVariable_FI*t;
+		global globalVariable_FK = 1;
+		ModelMatrixName[4][8]:= categoryVariable*globalVariable_FK*t;
+		ModelMatrixName[8][4]:= categoryVariable*globalVariable_FK*t;
+		global globalVariable_FL = 1;
+		ModelMatrixName[4][9]:= categoryVariable*globalVariable_FL*t;
+		ModelMatrixName[9][4]:= categoryVariable*globalVariable_FL*t;
+		global globalVariable_FM = 1;
+		ModelMatrixName[4][10]:= categoryVariable*globalVariable_FM*t;
+		ModelMatrixName[10][4]:= categoryVariable*globalVariable_FM*t;
+		global globalVariable_FN = 1;
+		ModelMatrixName[4][11]:= categoryVariable*globalVariable_FN*t;
+		ModelMatrixName[11][4]:= categoryVariable*globalVariable_FN*t;
+		global globalVariable_FP = 1;
+		ModelMatrixName[4][12]:= categoryVariable*globalVariable_FP*t;
+		ModelMatrixName[12][4]:= categoryVariable*globalVariable_FP*t;
+		global globalVariable_FQ = 1;
+		ModelMatrixName[4][13]:= categoryVariable*globalVariable_FQ*t;
+		ModelMatrixName[13][4]:= categoryVariable*globalVariable_FQ*t;
+		global globalVariable_FR = 1;
+		ModelMatrixName[4][14]:= categoryVariable*globalVariable_FR*t;
+		ModelMatrixName[14][4]:= categoryVariable*globalVariable_FR*t;
+		global globalVariable_FS = 1;
+		ModelMatrixName[4][15]:= categoryVariable*globalVariable_FS*t;
+		ModelMatrixName[15][4]:= categoryVariable*globalVariable_FS*t;
+		global globalVariable_FT = 1;
+		ModelMatrixName[4][16]:= categoryVariable*globalVariable_FT*t;
+		ModelMatrixName[16][4]:= categoryVariable*globalVariable_FT*t;
+		global globalVariable_FV = 1;
+		ModelMatrixName[4][17]:= categoryVariable*globalVariable_FV*t;
+		ModelMatrixName[17][4]:= categoryVariable*globalVariable_FV*t;
+		global globalVariable_FW = 1;
+		ModelMatrixName[4][18]:= categoryVariable*globalVariable_FW*t;
+		ModelMatrixName[18][4]:= categoryVariable*globalVariable_FW*t;
+		global globalVariable_FY = 1;
+		ModelMatrixName[4][19]:= categoryVariable*globalVariable_FY*t;
+		ModelMatrixName[19][4]:= categoryVariable*globalVariable_FY*t;
+		global globalVariable_GH = 1;
+		ModelMatrixName[5][6]:= categoryVariable*globalVariable_GH*t;
+		ModelMatrixName[6][5]:= categoryVariable*globalVariable_GH*t;
+		global globalVariable_GI = 1;
+		ModelMatrixName[5][7]:= categoryVariable*globalVariable_GI*t;
+		ModelMatrixName[7][5]:= categoryVariable*globalVariable_GI*t;
+		global globalVariable_GK = 1;
+		ModelMatrixName[5][8]:= categoryVariable*globalVariable_GK*t;
+		ModelMatrixName[8][5]:= categoryVariable*globalVariable_GK*t;
+		global globalVariable_GL = 1;
+		ModelMatrixName[5][9]:= categoryVariable*globalVariable_GL*t;
+		ModelMatrixName[9][5]:= categoryVariable*globalVariable_GL*t;
+		global globalVariable_GM = 1;
+		ModelMatrixName[5][10]:= categoryVariable*globalVariable_GM*t;
+		ModelMatrixName[10][5]:= categoryVariable*globalVariable_GM*t;
+		global globalVariable_GN = 1;
+		ModelMatrixName[5][11]:= categoryVariable*globalVariable_GN*t;
+		ModelMatrixName[11][5]:= categoryVariable*globalVariable_GN*t;
+		global globalVariable_GP = 1;
+		ModelMatrixName[5][12]:= categoryVariable*globalVariable_GP*t;
+		ModelMatrixName[12][5]:= categoryVariable*globalVariable_GP*t;
+		global globalVariable_GQ = 1;
+		ModelMatrixName[5][13]:= categoryVariable*globalVariable_GQ*t;
+		ModelMatrixName[13][5]:= categoryVariable*globalVariable_GQ*t;
+		global globalVariable_GR = 1;
+		ModelMatrixName[5][14]:= categoryVariable*globalVariable_GR*t;
+		ModelMatrixName[14][5]:= categoryVariable*globalVariable_GR*t;
+		global globalVariable_GS = 1;
+		ModelMatrixName[5][15]:= categoryVariable*globalVariable_GS*t;
+		ModelMatrixName[15][5]:= categoryVariable*globalVariable_GS*t;
+		global globalVariable_GT = 1;
+		ModelMatrixName[5][16]:= categoryVariable*globalVariable_GT*t;
+		ModelMatrixName[16][5]:= categoryVariable*globalVariable_GT*t;
+		global globalVariable_GV = 1;
+		ModelMatrixName[5][17]:= categoryVariable*globalVariable_GV*t;
+		ModelMatrixName[17][5]:= categoryVariable*globalVariable_GV*t;
+		global globalVariable_GW = 1;
+		ModelMatrixName[5][18]:= categoryVariable*globalVariable_GW*t;
+		ModelMatrixName[18][5]:= categoryVariable*globalVariable_GW*t;
+		global globalVariable_GY = 1;
+		ModelMatrixName[5][19]:= categoryVariable*globalVariable_GY*t;
+		ModelMatrixName[19][5]:= categoryVariable*globalVariable_GY*t;
+		global globalVariable_HI = 1;
+		ModelMatrixName[6][7]:= categoryVariable*globalVariable_HI*t;
+		ModelMatrixName[7][6]:= categoryVariable*globalVariable_HI*t;
+		global globalVariable_HK = 1;
+		ModelMatrixName[6][8]:= categoryVariable*globalVariable_HK*t;
+		ModelMatrixName[8][6]:= categoryVariable*globalVariable_HK*t;
+		global globalVariable_HL = 1;
+		ModelMatrixName[6][9]:= categoryVariable*globalVariable_HL*t;
+		ModelMatrixName[9][6]:= categoryVariable*globalVariable_HL*t;
+		global globalVariable_HM = 1;
+		ModelMatrixName[6][10]:= categoryVariable*globalVariable_HM*t;
+		ModelMatrixName[10][6]:= categoryVariable*globalVariable_HM*t;
+		global globalVariable_HN = 1;
+		ModelMatrixName[6][11]:= categoryVariable*globalVariable_HN*t;
+		ModelMatrixName[11][6]:= categoryVariable*globalVariable_HN*t;
+		global globalVariable_HP = 1;
+		ModelMatrixName[6][12]:= categoryVariable*globalVariable_HP*t;
+		ModelMatrixName[12][6]:= categoryVariable*globalVariable_HP*t;
+		global globalVariable_HQ = 1;
+		ModelMatrixName[6][13]:= categoryVariable*globalVariable_HQ*t;
+		ModelMatrixName[13][6]:= categoryVariable*globalVariable_HQ*t;
+		global globalVariable_HR = 1;
+		ModelMatrixName[6][14]:= categoryVariable*globalVariable_HR*t;
+		ModelMatrixName[14][6]:= categoryVariable*globalVariable_HR*t;
+		global globalVariable_HS = 1;
+		ModelMatrixName[6][15]:= categoryVariable*globalVariable_HS*t;
+		ModelMatrixName[15][6]:= categoryVariable*globalVariable_HS*t;
+		global globalVariable_HT = 1;
+		ModelMatrixName[6][16]:= categoryVariable*globalVariable_HT*t;
+		ModelMatrixName[16][6]:= categoryVariable*globalVariable_HT*t;
+		global globalVariable_HV = 1;
+		ModelMatrixName[6][17]:= categoryVariable*globalVariable_HV*t;
+		ModelMatrixName[17][6]:= categoryVariable*globalVariable_HV*t;
+		global globalVariable_HW = 1;
+		ModelMatrixName[6][18]:= categoryVariable*globalVariable_HW*t;
+		ModelMatrixName[18][6]:= categoryVariable*globalVariable_HW*t;
+		global globalVariable_HY = 1;
+		ModelMatrixName[6][19]:= categoryVariable*globalVariable_HY*t;
+		ModelMatrixName[19][6]:= categoryVariable*globalVariable_HY*t;
+		global globalVariable_IK = 1;
+		ModelMatrixName[7][8]:= categoryVariable*globalVariable_IK*t;
+		ModelMatrixName[8][7]:= categoryVariable*globalVariable_IK*t;
+		global globalVariable_IL = 1;
+		ModelMatrixName[7][9]:= categoryVariable*globalVariable_IL*t;
+		ModelMatrixName[9][7]:= categoryVariable*globalVariable_IL*t;
+		global globalVariable_IM = 1;
+		ModelMatrixName[7][10]:= categoryVariable*globalVariable_IM*t;
+		ModelMatrixName[10][7]:= categoryVariable*globalVariable_IM*t;
+		global globalVariable_IN = 1;
+		ModelMatrixName[7][11]:= categoryVariable*globalVariable_IN*t;
+		ModelMatrixName[11][7]:= categoryVariable*globalVariable_IN*t;
+		global globalVariable_IP = 1;
+		ModelMatrixName[7][12]:= categoryVariable*globalVariable_IP*t;
+		ModelMatrixName[12][7]:= categoryVariable*globalVariable_IP*t;
+		global globalVariable_IQ = 1;
+		ModelMatrixName[7][13]:= categoryVariable*globalVariable_IQ*t;
+		ModelMatrixName[13][7]:= categoryVariable*globalVariable_IQ*t;
+		global globalVariable_IR = 1;
+		ModelMatrixName[7][14]:= categoryVariable*globalVariable_IR*t;
+		ModelMatrixName[14][7]:= categoryVariable*globalVariable_IR*t;
+		global globalVariable_IS = 1;
+		ModelMatrixName[7][15]:= categoryVariable*globalVariable_IS*t;
+		ModelMatrixName[15][7]:= categoryVariable*globalVariable_IS*t;
+		global globalVariable_IT = 1;
+		ModelMatrixName[7][16]:= categoryVariable*globalVariable_IT*t;
+		ModelMatrixName[16][7]:= categoryVariable*globalVariable_IT*t;
+		global globalVariable_IV = 1;
+		ModelMatrixName[7][17]:= categoryVariable*globalVariable_IV*t;
+		ModelMatrixName[17][7]:= categoryVariable*globalVariable_IV*t;
+		global globalVariable_IW = 1;
+		ModelMatrixName[7][18]:= categoryVariable*globalVariable_IW*t;
+		ModelMatrixName[18][7]:= categoryVariable*globalVariable_IW*t;
+		global globalVariable_IY = 1;
+		ModelMatrixName[7][19]:= categoryVariable*globalVariable_IY*t;
+		ModelMatrixName[19][7]:= categoryVariable*globalVariable_IY*t;
+		global globalVariable_KL = 1;
+		ModelMatrixName[8][9]:= categoryVariable*globalVariable_KL*t;
+		ModelMatrixName[9][8]:= categoryVariable*globalVariable_KL*t;
+		global globalVariable_KM = 1;
+		ModelMatrixName[8][10]:= categoryVariable*globalVariable_KM*t;
+		ModelMatrixName[10][8]:= categoryVariable*globalVariable_KM*t;
+		global globalVariable_KN = 1;
+		ModelMatrixName[8][11]:= categoryVariable*globalVariable_KN*t;
+		ModelMatrixName[11][8]:= categoryVariable*globalVariable_KN*t;
+		global globalVariable_KP = 1;
+		ModelMatrixName[8][12]:= categoryVariable*globalVariable_KP*t;
+		ModelMatrixName[12][8]:= categoryVariable*globalVariable_KP*t;
+		global globalVariable_KQ = 1;
+		ModelMatrixName[8][13]:= categoryVariable*globalVariable_KQ*t;
+		ModelMatrixName[13][8]:= categoryVariable*globalVariable_KQ*t;
+		global globalVariable_KR = 1;
+		ModelMatrixName[8][14]:= categoryVariable*globalVariable_KR*t;
+		ModelMatrixName[14][8]:= categoryVariable*globalVariable_KR*t;
+		global globalVariable_KS = 1;
+		ModelMatrixName[8][15]:= categoryVariable*globalVariable_KS*t;
+		ModelMatrixName[15][8]:= categoryVariable*globalVariable_KS*t;
+		global globalVariable_KT = 1;
+		ModelMatrixName[8][16]:= categoryVariable*globalVariable_KT*t;
+		ModelMatrixName[16][8]:= categoryVariable*globalVariable_KT*t;
+		global globalVariable_KV = 1;
+		ModelMatrixName[8][17]:= categoryVariable*globalVariable_KV*t;
+		ModelMatrixName[17][8]:= categoryVariable*globalVariable_KV*t;
+		global globalVariable_KW = 1;
+		ModelMatrixName[8][18]:= categoryVariable*globalVariable_KW*t;
+		ModelMatrixName[18][8]:= categoryVariable*globalVariable_KW*t;
+		global globalVariable_KY = 1;
+		ModelMatrixName[8][19]:= categoryVariable*globalVariable_KY*t;
+		ModelMatrixName[19][8]:= categoryVariable*globalVariable_KY*t;
+		global globalVariable_LM = 1;
+		ModelMatrixName[9][10]:= categoryVariable*globalVariable_LM*t;
+		ModelMatrixName[10][9]:= categoryVariable*globalVariable_LM*t;
+		global globalVariable_LN = 1;
+		ModelMatrixName[9][11]:= categoryVariable*globalVariable_LN*t;
+		ModelMatrixName[11][9]:= categoryVariable*globalVariable_LN*t;
+		global globalVariable_LP = 1;
+		ModelMatrixName[9][12]:= categoryVariable*globalVariable_LP*t;
+		ModelMatrixName[12][9]:= categoryVariable*globalVariable_LP*t;
+		global globalVariable_LQ = 1;
+		ModelMatrixName[9][13]:= categoryVariable*globalVariable_LQ*t;
+		ModelMatrixName[13][9]:= categoryVariable*globalVariable_LQ*t;
+		global globalVariable_LR = 1;
+		ModelMatrixName[9][14]:= categoryVariable*globalVariable_LR*t;
+		ModelMatrixName[14][9]:= categoryVariable*globalVariable_LR*t;
+		global globalVariable_LS = 1;
+		ModelMatrixName[9][15]:= categoryVariable*globalVariable_LS*t;
+		ModelMatrixName[15][9]:= categoryVariable*globalVariable_LS*t;
+		global globalVariable_LT = 1;
+		ModelMatrixName[9][16]:= categoryVariable*globalVariable_LT*t;
+		ModelMatrixName[16][9]:= categoryVariable*globalVariable_LT*t;
+		global globalVariable_LV = 1;
+		ModelMatrixName[9][17]:= categoryVariable*globalVariable_LV*t;
+		ModelMatrixName[17][9]:= categoryVariable*globalVariable_LV*t;
+		global globalVariable_LW = 1;
+		ModelMatrixName[9][18]:= categoryVariable*globalVariable_LW*t;
+		ModelMatrixName[18][9]:= categoryVariable*globalVariable_LW*t;
+		global globalVariable_LY = 1;
+		ModelMatrixName[9][19]:= categoryVariable*globalVariable_LY*t;
+		ModelMatrixName[19][9]:= categoryVariable*globalVariable_LY*t;
+		global globalVariable_MN = 1;
+		ModelMatrixName[10][11]:= categoryVariable*globalVariable_MN*t;
+		ModelMatrixName[11][10]:= categoryVariable*globalVariable_MN*t;
+		global globalVariable_MP = 1;
+		ModelMatrixName[10][12]:= categoryVariable*globalVariable_MP*t;
+		ModelMatrixName[12][10]:= categoryVariable*globalVariable_MP*t;
+		global globalVariable_MQ = 1;
+		ModelMatrixName[10][13]:= categoryVariable*globalVariable_MQ*t;
+		ModelMatrixName[13][10]:= categoryVariable*globalVariable_MQ*t;
+		global globalVariable_MR = 1;
+		ModelMatrixName[10][14]:= categoryVariable*globalVariable_MR*t;
+		ModelMatrixName[14][10]:= categoryVariable*globalVariable_MR*t;
+		global globalVariable_MS = 1;
+		ModelMatrixName[10][15]:= categoryVariable*globalVariable_MS*t;
+		ModelMatrixName[15][10]:= categoryVariable*globalVariable_MS*t;
+		global globalVariable_MT = 1;
+		ModelMatrixName[10][16]:= categoryVariable*globalVariable_MT*t;
+		ModelMatrixName[16][10]:= categoryVariable*globalVariable_MT*t;
+		global globalVariable_MV = 1;
+		ModelMatrixName[10][17]:= categoryVariable*globalVariable_MV*t;
+		ModelMatrixName[17][10]:= categoryVariable*globalVariable_MV*t;
+		global globalVariable_MW = 1;
+		ModelMatrixName[10][18]:= categoryVariable*globalVariable_MW*t;
+		ModelMatrixName[18][10]:= categoryVariable*globalVariable_MW*t;
+		global globalVariable_MY = 1;
+		ModelMatrixName[10][19]:= categoryVariable*globalVariable_MY*t;
+		ModelMatrixName[19][10]:= categoryVariable*globalVariable_MY*t;
+		global globalVariable_NP = 1;
+		ModelMatrixName[11][12]:= categoryVariable*globalVariable_NP*t;
+		ModelMatrixName[12][11]:= categoryVariable*globalVariable_NP*t;
+		global globalVariable_NQ = 1;
+		ModelMatrixName[11][13]:= categoryVariable*globalVariable_NQ*t;
+		ModelMatrixName[13][11]:= categoryVariable*globalVariable_NQ*t;
+		global globalVariable_NR = 1;
+		ModelMatrixName[11][14]:= categoryVariable*globalVariable_NR*t;
+		ModelMatrixName[14][11]:= categoryVariable*globalVariable_NR*t;
+		global globalVariable_NS = 1;
+		ModelMatrixName[11][15]:= categoryVariable*globalVariable_NS*t;
+		ModelMatrixName[15][11]:= categoryVariable*globalVariable_NS*t;
+		global globalVariable_NT = 1;
+		ModelMatrixName[11][16]:= categoryVariable*globalVariable_NT*t;
+		ModelMatrixName[16][11]:= categoryVariable*globalVariable_NT*t;
+		global globalVariable_NV = 1;
+		ModelMatrixName[11][17]:= categoryVariable*globalVariable_NV*t;
+		ModelMatrixName[17][11]:= categoryVariable*globalVariable_NV*t;
+		global globalVariable_NW = 1;
+		ModelMatrixName[11][18]:= categoryVariable*globalVariable_NW*t;
+		ModelMatrixName[18][11]:= categoryVariable*globalVariable_NW*t;
+		global globalVariable_NY = 1;
+		ModelMatrixName[11][19]:= categoryVariable*globalVariable_NY*t;
+		ModelMatrixName[19][11]:= categoryVariable*globalVariable_NY*t;
+		global globalVariable_PQ = 1;
+		ModelMatrixName[12][13]:= categoryVariable*globalVariable_PQ*t;
+		ModelMatrixName[13][12]:= categoryVariable*globalVariable_PQ*t;
+		global globalVariable_PR = 1;
+		ModelMatrixName[12][14]:= categoryVariable*globalVariable_PR*t;
+		ModelMatrixName[14][12]:= categoryVariable*globalVariable_PR*t;
+		global globalVariable_PS = 1;
+		ModelMatrixName[12][15]:= categoryVariable*globalVariable_PS*t;
+		ModelMatrixName[15][12]:= categoryVariable*globalVariable_PS*t;
+		global globalVariable_PT = 1;
+		ModelMatrixName[12][16]:= categoryVariable*globalVariable_PT*t;
+		ModelMatrixName[16][12]:= categoryVariable*globalVariable_PT*t;
+		global globalVariable_PV = 1;
+		ModelMatrixName[12][17]:= categoryVariable*globalVariable_PV*t;
+		ModelMatrixName[17][12]:= categoryVariable*globalVariable_PV*t;
+		global globalVariable_PW = 1;
+		ModelMatrixName[12][18]:= categoryVariable*globalVariable_PW*t;
+		ModelMatrixName[18][12]:= categoryVariable*globalVariable_PW*t;
+		global globalVariable_PY = 1;
+		ModelMatrixName[12][19]:= categoryVariable*globalVariable_PY*t;
+		ModelMatrixName[19][12]:= categoryVariable*globalVariable_PY*t;
+		global globalVariable_QR = 1;
+		ModelMatrixName[13][14]:= categoryVariable*globalVariable_QR*t;
+		ModelMatrixName[14][13]:= categoryVariable*globalVariable_QR*t;
+		global globalVariable_QS = 1;
+		ModelMatrixName[13][15]:= categoryVariable*globalVariable_QS*t;
+		ModelMatrixName[15][13]:= categoryVariable*globalVariable_QS*t;
+		global globalVariable_QT = 1;
+		ModelMatrixName[13][16]:= categoryVariable*globalVariable_QT*t;
+		ModelMatrixName[16][13]:= categoryVariable*globalVariable_QT*t;
+		global globalVariable_QV = 1;
+		ModelMatrixName[13][17]:= categoryVariable*globalVariable_QV*t;
+		ModelMatrixName[17][13]:= categoryVariable*globalVariable_QV*t;
+		global globalVariable_QW = 1;
+		ModelMatrixName[13][18]:= categoryVariable*globalVariable_QW*t;
+		ModelMatrixName[18][13]:= categoryVariable*globalVariable_QW*t;
+		global globalVariable_QY = 1;
+		ModelMatrixName[13][19]:= categoryVariable*globalVariable_QY*t;
+		ModelMatrixName[19][13]:= categoryVariable*globalVariable_QY*t;
+		global globalVariable_RS = 1;
+		ModelMatrixName[14][15]:= categoryVariable*globalVariable_RS*t;
+		ModelMatrixName[15][14]:= categoryVariable*globalVariable_RS*t;
+		global globalVariable_RT = 1;
+		ModelMatrixName[14][16]:= categoryVariable*globalVariable_RT*t;
+		ModelMatrixName[16][14]:= categoryVariable*globalVariable_RT*t;
+		global globalVariable_RV = 1;
+		ModelMatrixName[14][17]:= categoryVariable*globalVariable_RV*t;
+		ModelMatrixName[17][14]:= categoryVariable*globalVariable_RV*t;
+		global globalVariable_RW = 1;
+		ModelMatrixName[14][18]:= categoryVariable*globalVariable_RW*t;
+		ModelMatrixName[18][14]:= categoryVariable*globalVariable_RW*t;
+		global globalVariable_RY = 1;
+		ModelMatrixName[14][19]:= categoryVariable*globalVariable_RY*t;
+		ModelMatrixName[19][14]:= categoryVariable*globalVariable_RY*t;
+		global globalVariable_ST = 1;
+		ModelMatrixName[15][16]:= categoryVariable*globalVariable_ST*t;
+		ModelMatrixName[16][15]:= categoryVariable*globalVariable_ST*t;
+		global globalVariable_SV = 1;
+		ModelMatrixName[15][17]:= categoryVariable*globalVariable_SV*t;
+		ModelMatrixName[17][15]:= categoryVariable*globalVariable_SV*t;
+		global globalVariable_SW = 1;
+		ModelMatrixName[15][18]:= categoryVariable*globalVariable_SW*t;
+		ModelMatrixName[18][15]:= categoryVariable*globalVariable_SW*t;
+		global globalVariable_SY = 1;
+		ModelMatrixName[15][19]:= categoryVariable*globalVariable_SY*t;
+		ModelMatrixName[19][15]:= categoryVariable*globalVariable_SY*t;
+		global globalVariable_TV = 1;
+		ModelMatrixName[16][17]:= categoryVariable*globalVariable_TV*t;
+		ModelMatrixName[17][16]:= categoryVariable*globalVariable_TV*t;
+		global globalVariable_TW = 1;
+		ModelMatrixName[16][18]:= categoryVariable*globalVariable_TW*t;
+		ModelMatrixName[18][16]:= categoryVariable*globalVariable_TW*t;
+		global globalVariable_TY = 1;
+		ModelMatrixName[16][19]:= categoryVariable*globalVariable_TY*t;
+		ModelMatrixName[19][16]:= categoryVariable*globalVariable_TY*t;
+		global globalVariable_VW = 1;
+		ModelMatrixName[17][18]:= categoryVariable*globalVariable_VW*t;
+		ModelMatrixName[18][17]:= categoryVariable*globalVariable_VW*t;
+		global globalVariable_VY = 1;
+		ModelMatrixName[17][19]:= categoryVariable*globalVariable_VY*t;
+		ModelMatrixName[19][17]:= categoryVariable*globalVariable_VY*t;
+		global globalVariable_WY = 1;
+		ModelMatrixName[18][19]:= categoryVariable*globalVariable_WY*t;
+		ModelMatrixName[19][18]:= categoryVariable*globalVariable_WY*t;	
+	}
+	return 1;
+}
+
+/*-------------------------------------------------------------------------------*/
+
+function	EFVEstimated	(EFVector&, EFVApproximations)
+{
+	global frequencyVariable_1 = EFVApproximations[0];
+	global frequencyVariable_2 = EFVApproximations[1]/(1-frequencyVariable_1);
+	global frequencyVariable_3 = EFVApproximations[2]/(1-frequencyVariable_1)/(1-frequencyVariable_1);
+	global frequencyVariable_4 = EFVApproximations[3]/(1-frequencyVariable_1)/(1-frequencyVariable_1)/(1-frequencyVariable_2);
+	global frequencyVariable_5 = EFVApproximations[4]/(1-frequencyVariable_1)/(1-frequencyVariable_1)/(1-frequencyVariable_2)/(1-frequencyVariable_3);
+	global frequencyVariable_6 = EFVApproximations[5]/(1-frequencyVariable_1)/(1-frequencyVariable_1)/(1-frequencyVariable_2)/(1-frequencyVariable_3)/(1-frequencyVariable_4);
+	global frequencyVariable_7 = EFVApproximations[6]/(1-frequencyVariable_1)/(1-frequencyVariable_1)/(1-frequencyVariable_2)/(1-frequencyVariable_3)/(1-frequencyVariable_4)/(1-frequencyVariable_5);
+	global frequencyVariable_8 = EFVApproximations[7]/(1-frequencyVariable_1)/(1-frequencyVariable_1)/(1-frequencyVariable_2)/(1-frequencyVariable_3)/(1-frequencyVariable_4)/(1-frequencyVariable_5)/(1-frequencyVariable_6);
+	global frequencyVariable_9 = EFVApproximations[8]/(1-frequencyVariable_1)/(1-frequencyVariable_1)/(1-frequencyVariable_2)/(1-frequencyVariable_3)/(1-frequencyVariable_4)/(1-frequencyVariable_5)/(1-frequencyVariable_6)/(1-frequencyVariable_7);
+	global frequencyVariable_10 = EFVApproximations[9]/(1-frequencyVariable_1)/(1-frequencyVariable_1)/(1-frequencyVariable_2)/(1-frequencyVariable_3)/(1-frequencyVariable_4)/(1-frequencyVariable_5)/(1-frequencyVariable_6)/(1-frequencyVariable_7)/(1-frequencyVariable_8);
+	global frequencyVariable_11 = EFVApproximations[10]/(1-frequencyVariable_1)/(1-frequencyVariable_1)/(1-frequencyVariable_2)/(1-frequencyVariable_3)/(1-frequencyVariable_4)/(1-frequencyVariable_5)/(1-frequencyVariable_6)/(1-frequencyVariable_7)/(1-frequencyVariable_8)/(1-frequencyVariable_9);
+	global frequencyVariable_12 = EFVApproximations[11]/(1-frequencyVariable_1)/(1-frequencyVariable_1)/(1-frequencyVariable_2)/(1-frequencyVariable_3)/(1-frequencyVariable_4)/(1-frequencyVariable_5)/(1-frequencyVariable_6)/(1-frequencyVariable_7)/(1-frequencyVariable_8)/(1-frequencyVariable_9)/(1-frequencyVariable_10);
+	global frequencyVariable_13 = EFVApproximations[12]/(1-frequencyVariable_1)/(1-frequencyVariable_1)/(1-frequencyVariable_2)/(1-frequencyVariable_3)/(1-frequencyVariable_4)/(1-frequencyVariable_5)/(1-frequencyVariable_6)/(1-frequencyVariable_7)/(1-frequencyVariable_8)/(1-frequencyVariable_9)/(1-frequencyVariable_10)/(1-frequencyVariable_11);
+	global frequencyVariable_14 = EFVApproximations[13]/(1-frequencyVariable_1)/(1-frequencyVariable_1)/(1-frequencyVariable_2)/(1-frequencyVariable_3)/(1-frequencyVariable_4)/(1-frequencyVariable_5)/(1-frequencyVariable_6)/(1-frequencyVariable_7)/(1-frequencyVariable_8)/(1-frequencyVariable_9)/(1-frequencyVariable_10)/(1-frequencyVariable_11)/(1-frequencyVariable_12);
+	global frequencyVariable_15 = EFVApproximations[14]/(1-frequencyVariable_1)/(1-frequencyVariable_1)/(1-frequencyVariable_2)/(1-frequencyVariable_3)/(1-frequencyVariable_4)/(1-frequencyVariable_5)/(1-frequencyVariable_6)/(1-frequencyVariable_7)/(1-frequencyVariable_8)/(1-frequencyVariable_9)/(1-frequencyVariable_10)/(1-frequencyVariable_11)/(1-frequencyVariable_12)/(1-frequencyVariable_13);
+	global frequencyVariable_16 = EFVApproximations[15]/(1-frequencyVariable_1)/(1-frequencyVariable_1)/(1-frequencyVariable_2)/(1-frequencyVariable_3)/(1-frequencyVariable_4)/(1-frequencyVariable_5)/(1-frequencyVariable_6)/(1-frequencyVariable_7)/(1-frequencyVariable_8)/(1-frequencyVariable_9)/(1-frequencyVariable_10)/(1-frequencyVariable_11)/(1-frequencyVariable_12)/(1-frequencyVariable_13)/(1-frequencyVariable_14);
+	global frequencyVariable_17 = EFVApproximations[16]/(1-frequencyVariable_1)/(1-frequencyVariable_1)/(1-frequencyVariable_2)/(1-frequencyVariable_3)/(1-frequencyVariable_4)/(1-frequencyVariable_5)/(1-frequencyVariable_6)/(1-frequencyVariable_7)/(1-frequencyVariable_8)/(1-frequencyVariable_9)/(1-frequencyVariable_10)/(1-frequencyVariable_11)/(1-frequencyVariable_12)/(1-frequencyVariable_13)/(1-frequencyVariable_14)/(1-frequencyVariable_15);
+	global frequencyVariable_18 = EFVApproximations[17]/(1-frequencyVariable_1)/(1-frequencyVariable_1)/(1-frequencyVariable_2)/(1-frequencyVariable_3)/(1-frequencyVariable_4)/(1-frequencyVariable_5)/(1-frequencyVariable_6)/(1-frequencyVariable_7)/(1-frequencyVariable_8)/(1-frequencyVariable_9)/(1-frequencyVariable_10)/(1-frequencyVariable_11)/(1-frequencyVariable_12)/(1-frequencyVariable_13)/(1-frequencyVariable_14)/(1-frequencyVariable_15)/(1-frequencyVariable_16);
+	global frequencyVariable_19 = EFVApproximations[18]/(1-frequencyVariable_1)/(1-frequencyVariable_1)/(1-frequencyVariable_2)/(1-frequencyVariable_3)/(1-frequencyVariable_4)/(1-frequencyVariable_5)/(1-frequencyVariable_6)/(1-frequencyVariable_7)/(1-frequencyVariable_8)/(1-frequencyVariable_9)/(1-frequencyVariable_10)/(1-frequencyVariable_11)/(1-frequencyVariable_12)/(1-frequencyVariable_13)/(1-frequencyVariable_14)/(1-frequencyVariable_15)/(1-frequencyVariable_16)/(1-frequencyVariable_17);
+
+
+	EFVector = {
+		{frequencyVariable_1}
+		{(1-frequencyVariable_1)*frequencyVariable_2}
+		{(1-frequencyVariable_1)*(1-frequencyVariable_2)*frequencyVariable_3}
+		{(1-frequencyVariable_1)*(1-frequencyVariable_2)*(1-frequencyVariable_3)*frequencyVariable_4}
+		{(1-frequencyVariable_1)*(1-frequencyVariable_2)*(1-frequencyVariable_3)*(1-frequencyVariable_4)*frequencyVariable_5}
+		{(1-frequencyVariable_1)*(1-frequencyVariable_2)*(1-frequencyVariable_3)*(1-frequencyVariable_4)*(1-frequencyVariable_5)*frequencyVariable_6}
+		{(1-frequencyVariable_1)*(1-frequencyVariable_2)*(1-frequencyVariable_3)*(1-frequencyVariable_4)*(1-frequencyVariable_5)*(1-frequencyVariable_6)*frequencyVariable_7}
+		{(1-frequencyVariable_1)*(1-frequencyVariable_2)*(1-frequencyVariable_3)*(1-frequencyVariable_4)*(1-frequencyVariable_5)*(1-frequencyVariable_6)*(1-frequencyVariable_7)*frequencyVariable_8}
+		{(1-frequencyVariable_1)*(1-frequencyVariable_2)*(1-frequencyVariable_3)*(1-frequencyVariable_4)*(1-frequencyVariable_5)*(1-frequencyVariable_6)*(1-frequencyVariable_7)*(1-frequencyVariable_8)*frequencyVariable_9}
+		{(1-frequencyVariable_1)*(1-frequencyVariable_2)*(1-frequencyVariable_3)*(1-frequencyVariable_4)*(1-frequencyVariable_5)*(1-frequencyVariable_6)*(1-frequencyVariable_7)*(1-frequencyVariable_8)*(1-frequencyVariable_9)*frequencyVariable_10}
+		{(1-frequencyVariable_1)*(1-frequencyVariable_2)*(1-frequencyVariable_3)*(1-frequencyVariable_4)*(1-frequencyVariable_5)*(1-frequencyVariable_6)*(1-frequencyVariable_7)*(1-frequencyVariable_8)*(1-frequencyVariable_9)*(1-frequencyVariable_10)*frequencyVariable_11}
+		{(1-frequencyVariable_1)*(1-frequencyVariable_2)*(1-frequencyVariable_3)*(1-frequencyVariable_4)*(1-frequencyVariable_5)*(1-frequencyVariable_6)*(1-frequencyVariable_7)*(1-frequencyVariable_8)*(1-frequencyVariable_9)*(1-frequencyVariable_10)*(1-frequencyVariable_11)*frequencyVariable_12}
+		{(1-frequencyVariable_1)*(1-frequencyVariable_2)*(1-frequencyVariable_3)*(1-frequencyVariable_4)*(1-frequencyVariable_5)*(1-frequencyVariable_6)*(1-frequencyVariable_7)*(1-frequencyVariable_8)*(1-frequencyVariable_9)*(1-frequencyVariable_10)*(1-frequencyVariable_11)*(1-frequencyVariable_12)*frequencyVariable_13}
+		{(1-frequencyVariable_1)*(1-frequencyVariable_2)*(1-frequencyVariable_3)*(1-frequencyVariable_4)*(1-frequencyVariable_5)*(1-frequencyVariable_6)*(1-frequencyVariable_7)*(1-frequencyVariable_8)*(1-frequencyVariable_9)*(1-frequencyVariable_10)*(1-frequencyVariable_11)*(1-frequencyVariable_12)*(1-frequencyVariable_13)*frequencyVariable_14}
+		{(1-frequencyVariable_1)*(1-frequencyVariable_2)*(1-frequencyVariable_3)*(1-frequencyVariable_4)*(1-frequencyVariable_5)*(1-frequencyVariable_6)*(1-frequencyVariable_7)*(1-frequencyVariable_8)*(1-frequencyVariable_9)*(1-frequencyVariable_10)*(1-frequencyVariable_11)*(1-frequencyVariable_12)*(1-frequencyVariable_13)*(1-frequencyVariable_14)*frequencyVariable_15}
+		{(1-frequencyVariable_1)*(1-frequencyVariable_2)*(1-frequencyVariable_3)*(1-frequencyVariable_4)*(1-frequencyVariable_5)*(1-frequencyVariable_6)*(1-frequencyVariable_7)*(1-frequencyVariable_8)*(1-frequencyVariable_9)*(1-frequencyVariable_10)*(1-frequencyVariable_11)*(1-frequencyVariable_12)*(1-frequencyVariable_13)*(1-frequencyVariable_14)*(1-frequencyVariable_15)*frequencyVariable_16}
+		{(1-frequencyVariable_1)*(1-frequencyVariable_2)*(1-frequencyVariable_3)*(1-frequencyVariable_4)*(1-frequencyVariable_5)*(1-frequencyVariable_6)*(1-frequencyVariable_7)*(1-frequencyVariable_8)*(1-frequencyVariable_9)*(1-frequencyVariable_10)*(1-frequencyVariable_11)*(1-frequencyVariable_12)*(1-frequencyVariable_13)*(1-frequencyVariable_14)*(1-frequencyVariable_15)*(1-frequencyVariable_16)*frequencyVariable_17}
+		{(1-frequencyVariable_1)*(1-frequencyVariable_2)*(1-frequencyVariable_3)*(1-frequencyVariable_4)*(1-frequencyVariable_5)*(1-frequencyVariable_6)*(1-frequencyVariable_7)*(1-frequencyVariable_8)*(1-frequencyVariable_9)*(1-frequencyVariable_10)*(1-frequencyVariable_11)*(1-frequencyVariable_12)*(1-frequencyVariable_13)*(1-frequencyVariable_14)*(1-frequencyVariable_15)*(1-frequencyVariable_16)*(1-frequencyVariable_17)*frequencyVariable_18}
+		{(1-frequencyVariable_1)*(1-frequencyVariable_2)*(1-frequencyVariable_3)*(1-frequencyVariable_4)*(1-frequencyVariable_5)*(1-frequencyVariable_6)*(1-frequencyVariable_7)*(1-frequencyVariable_8)*(1-frequencyVariable_9)*(1-frequencyVariable_10)*(1-frequencyVariable_11)*(1-frequencyVariable_12)*(1-frequencyVariable_13)*(1-frequencyVariable_14)*(1-frequencyVariable_15)*(1-frequencyVariable_16)*(1-frequencyVariable_17)*(1-frequencyVariable_18)*frequencyVariable_19}
+		{(1-frequencyVariable_1)*(1-frequencyVariable_2)*(1-frequencyVariable_3)*(1-frequencyVariable_4)*(1-frequencyVariable_5)*(1-frequencyVariable_6)*(1-frequencyVariable_7)*(1-frequencyVariable_8)*(1-frequencyVariable_9)*(1-frequencyVariable_10)*(1-frequencyVariable_11)*(1-frequencyVariable_12)*(1-frequencyVariable_13)*(1-frequencyVariable_14)*(1-frequencyVariable_15)*(1-frequencyVariable_16)*(1-frequencyVariable_17)*(1-frequencyVariable_18)*(1-frequencyVariable_19)}
+	};
+					
+	MULTIPLY_BY_FREQS = 1;
+	return 	0;
+}
diff --git a/res/SubstitutionModels/Binary/F81.mdl b/res/SubstitutionModels/Binary/F81.mdl
new file mode 100644
index 0000000..6159be4
--- /dev/null
+++ b/res/SubstitutionModels/Binary/F81.mdl
@@ -0,0 +1,45 @@
+Model_Name  		= "F81";
+Model_Options 		= 6;
+Model_Dimension 	= 2;
+Model_EFV_Type		= "Observed In Partition";
+
+/*-------------------------------------------------------------------------------*/
+
+function GUIPopulateModelMatrix (ModelMatrixName&, EFV)
+{
+	if (modelType == 0)
+	{
+		ModelMatrixName = {{*,t}
+						   {t,*}};
+	}
+	else
+	{
+		global shapeParameter = .5;
+		shapeParameter:>0.01;shapeParameter:<100;
+		category     categoryVariable = 
+					(rateClassCount, EQUAL, MEAN, GammaDist(_x_,shapeParameter,shapeParameter), CGammaDist(_x_,shapeParameter,shapeParameter), 0 , 
+			  							1e25,CGammaDist(_x_,shapeParameter+1,shapeParameter));
+			  							
+		ModelMatrixName = {{*,t*categoryVariable}
+						   {t*categoryVariable,*}};
+	}
+	return 1;
+}
+
+/*-------------------------------------------------------------------------------*/
+
+function	EFVEstimated	(EFVector&, EFVApproximations)
+{
+	global frequencyVariable0;
+	global frequencyVariable1;
+
+	frequencyVariable0:<1;
+	frequencyVariable1	 :=	1-frequencyVariable0;
+
+	frequencyVariableA = EFVApproximations[0];
+
+	EFVector = {{frequencyVariable0},
+				{frequencyVariable1}};
+				
+	return	1;
+}
diff --git a/res/SubstitutionModels/Codon/GY94_3x4.mdl b/res/SubstitutionModels/Codon/GY94_3x4.mdl
new file mode 100644
index 0000000..dc016f3
--- /dev/null
+++ b/res/SubstitutionModels/Codon/GY94_3x4.mdl
@@ -0,0 +1,271 @@
+Model_Name  		= "GY94_3x4";
+Model_Options 		= 3;
+Model_Dimension 	= 64;
+Model_EFV_Type		= "Observed Codon";
+
+function GUIBuildCodonFrequencies (EFV)
+{
+	PIStop = 1.0;
+	result = {ModelMatrixDimension,1};
+	hshift = 0;
+	
+	for (h=0; h<64; h=h+1)
+	{
+		first = h$16;
+		second = h%16$4;
+		third = h%4;
+		if (ModelGeneticCode[h]==10) 
+		{
+			hshift = hshift+1;
+			PIStop = PIStop-EFV[first][0]*EFV[second][1]*EFV[third][2];
+			continue; 
+		}
+		result[h-hshift][0]=EFV[first][0]*EFV[second][1]*EFV[third][2];
+	}
+	return result*(1.0/PIStop);
+}
+
+function GUIPopulateModelMatrix (ModelMatrixName&, EFV)
+{
+	global globalVariable_TVTS;
+	
+	if (!ModelMatrixDimension)
+	{
+		ModelMatrixDimension = 64;
+		for (h = 0 ;h<64; h=h+1)
+		{
+			if (ModelGeneticCode[h]==10)
+			{
+				ModelMatrixDimension = ModelMatrixDimension-1;
+			}
+		}
+	}
+	
+	ModelMatrixName = {ModelMatrixDimension,ModelMatrixDimension}; 
+
+	hshift = 0;
+
+	if (modelType == 0)
+	{
+		for (h=0; h<64; h=h+1)
+		{
+			if (ModelGeneticCode[h]==10) 
+			{
+				hshift = hshift+1;
+				continue; 
+			}
+			vshift = hshift;
+			for (v = h+1; v<64; v=v+1)
+			{
+				diff = v-h;
+				if (ModelGeneticCode[v]==10) 
+				{
+					vshift = vshift+1;
+					continue; 
+				}
+			  	if ((h$4==v$4)||((diff%4==0)&&(h$16==v$16))||(diff%16==0))
+			  	{
+			  		if (h$4==v$4)
+			  		{
+			  			transition = v%4;
+			  			transition2= h%4;
+			  		}
+			  		else
+			  		{
+			  			if(diff%16==0)
+			  			{
+			  				transition = v$16;
+			  				transition2= h$16;
+			  			}
+			  			else
+			  			{
+			  				transition = v%16$4;
+			  				transition2= h%16$4;
+			  			}
+			  		}
+			  		if (ModelGeneticCode[0][h]==ModelGeneticCode[0][v]) 
+			  		{
+			  			if ((Abs(transition-transition2)%2)==1)
+			  			{
+			  				ModelMatrixName[h-hshift][v-vshift] := globalVariable_TVTS*synRate;
+			  				ModelMatrixName[v-vshift][h-hshift] := globalVariable_TVTS*synRate;
+			  			
+			  			}
+			  			else
+			  			{
+			  				ModelMatrixName[h-hshift][v-vshift] := synRate;
+			  				ModelMatrixName[v-vshift][h-hshift] := synRate;
+			  			}
+				  	}
+			  		else
+			  		{
+			  			if ((Abs(transition-transition2)%2)==1)
+			  			{
+			  				ModelMatrixName[h-hshift][v-vshift] := globalVariable_TVTS*nonSynRate;
+			  				ModelMatrixName[v-vshift][h-hshift] := globalVariable_TVTS*nonSynRate;
+			  			
+			  			}
+			  			else
+			  			{
+			  				ModelMatrixName[h-hshift][v-vshift] := nonSynRate;
+			  				ModelMatrixName[v-vshift][h-hshift] := nonSynRate;
+			  			}
+				  	}
+			  	}
+			}
+		}
+	}
+	else
+	{
+		global globalVariable_DNDS = 1;
+		if (modelType == 1)
+		{
+			for (h=0; h<64; h=h+1)
+			{
+				if (ModelGeneticCode[h]==10) 
+				{
+					hshift = hshift+1;
+					continue; 
+				}
+				vshift = hshift;
+				for (v = h+1; v<64; v=v+1)
+				{
+					diff = v-h;
+					if (ModelGeneticCode[v]==10) 
+					{
+						vshift = vshift+1;
+						continue; 
+					}
+				  	if ((h$4==v$4)||((diff%4==0)&&(h$16==v$16))||(diff%16==0))
+				  	{
+				  		if (h$4==v$4)
+				  		{
+				  			transition = v%4;
+				  			transition2= h%4;
+				  		}
+				  		else
+				  		{
+				  			if(diff%16==0)
+				  			{
+				  				transition = v$16;
+				  				transition2= h$16;
+				  			}
+				  			else
+				  			{
+				  				transition = v%16$4;
+				  				transition2= h%16$4;
+				  			}
+				  		}
+				  		if (ModelGeneticCode[h]==ModelGeneticCode[v]) 
+				  		{
+				  			if ((Abs(transition-transition2)%2)==0)
+				  			{
+				  				ModelMatrixName[h-hshift][v-vshift] := synRate;
+				  				ModelMatrixName[v-vshift][h-hshift] := synRate;
+				  			
+				  			}
+				  			else
+				  			{
+				  				ModelMatrixName[h-hshift][v-vshift] := globalVariable_TVTS*synRate;
+				  				ModelMatrixName[v-vshift][h-hshift] := globalVariable_TVTS*synRate;
+				  			}
+					  	}
+				  		else
+				  		{
+				  			if ((Abs(transition-transition2)%2)==0)
+				  			{
+				  				ModelMatrixName[h-hshift][v-vshift] := globalVariable_DNDS*synRate;
+				  				ModelMatrixName[v-vshift][h-hshift] := globalVariable_DNDS*synRate;
+				  			
+				  			}
+				  			else
+				  			{
+				  				ModelMatrixName[h-hshift][v-vshift] := globalVariable_DNDS*globalVariable_TVTS*synRate;
+				  				ModelMatrixName[v-vshift][h-hshift] := globalVariable_DNDS*globalVariable_TVTS*synRate;
+				  			}
+					  	}
+				  	}
+			    }
+			}	
+		}
+		else
+		{
+			global shapeParameter = .5;
+			shapeParameter:>0.01;
+			shapeParameter:<100;
+			category     categoryVariable = 
+						(rateClassCount, EQUAL, MEAN, GammaDist(_x_,shapeParameter,shapeParameter), CGammaDist(_x_,shapeParameter,shapeParameter), 0 , 
+				  									  1e25,CGammaDist(_x_,shapeParameter+1,shapeParameter));
+			for (h=0; h<64; h=h+1)
+			{
+				if (ModelGeneticCode[h]==10) 
+				{
+					hshift = hshift+1;
+					continue; 
+				}
+				vshift = hshift;
+				for (v = h+1; v<64; v=v+1)
+				{
+					diff = v-h;
+					if (ModelGeneticCode[v]==10) 
+					{
+						vshift = vshift+1;
+						continue; 
+					}
+				  	if ((h$4==v$4)||((diff%4==0)&&(h$16==v$16))||(diff%16==0))
+				  	{
+				  		if (h$4==v$4)
+				  		{
+				  			transition = v%4;
+				  			transition2= h%4;
+				  		}
+				  		else
+				  		{
+				  			if(diff%16==0)
+				  			{
+				  				transition = v$16;
+				  				transition2= h$16;
+				  			}
+				  			else
+				  			{
+				  				transition = v%16$4;
+				  				transition2= h%16$4;
+				  			}
+				  		}
+				  		
+				  		if (ModelGeneticCode[0][h]==ModelGeneticCode[0][v]) 
+				  		{
+				  			if ((Abs(transition-transition2)%2)==1)
+				  			{
+				  				ModelMatrixName[h-hshift][v-vshift] := categoryVariable*globalVariable_TVTS*synRate;
+				  				ModelMatrixName[v-vshift][h-hshift] := categoryVariable*globalVariable_TVTS*synRate;
+				  			
+				  			}
+				  			else
+				  			{
+				  				ModelMatrixName[h-hshift][v-vshift] := categoryVariable*synRate;
+				  				ModelMatrixName[v-vshift][h-hshift] := categoryVariable*synRate;
+				  			}
+					  	}
+				  		else
+				  		{
+				  			if ((Abs(transition-transition2)%2)==0)
+				  			{
+				  				ModelMatrixName[h-hshift][v-vshift] := categoryVariable*globalVariable_DNDS*globalVariable_TVTS*synRate;
+				  				ModelMatrixName[v-vshift][h-hshift] := categoryVariable*globalVariable_DNDS*globalVariable_TVTS*synRate;
+				  			
+				  			}
+				  			else
+				  			{
+				  				ModelMatrixName[h-hshift][v-vshift] := categoryVariable*globalVariable_DNDS*synRate;
+				  				ModelMatrixName[v-vshift][h-hshift] := categoryVariable*globalVariable_DNDS*synRate;
+				  			}
+					  	}
+				  	}
+				 }
+			}		
+		}
+	}
+	
+	return 1;
+}
diff --git a/res/SubstitutionModels/Codon/Lineage_MG94xHKY85.mdl b/res/SubstitutionModels/Codon/Lineage_MG94xHKY85.mdl
new file mode 100644
index 0000000..981d03c
--- /dev/null
+++ b/res/SubstitutionModels/Codon/Lineage_MG94xHKY85.mdl
@@ -0,0 +1,265 @@
+Model_Name  		= "MGxHKYxF34xGDDxMRV";
+Model_Options 		= 2;
+Model_Dimension 	= 64;
+Model_EFV_Type		= "Observed Nuc 9 params.";
+
+function GUIBuildCodonFrequencies (EFV)
+{
+	PIStop = 1.0;
+	result = {ModelMatrixDimension,1};
+	hshift = 0;
+	
+	for (h=0; h<64; h=h+1)
+	{
+		first = h$16;
+		second = h%16$4;
+		third = h%4;
+		if (ModelGeneticCode[h]==10) 
+		{
+			hshift = hshift+1;
+			PIStop = PIStop-EFV[first][0]*EFV[second][1]*EFV[third][2];
+			continue; 
+		}
+		result[h-hshift][0]=EFV[first][0]*EFV[second][1]*EFV[third][2];
+	}
+	return result*(1.0/PIStop);
+}
+
+function GUIPopulateModelMatrix (ModelMatrixName&, EFV)
+{
+	global globalVariable_TVTS = 1.;
+	
+	if (!ModelMatrixDimension)
+	{
+		ModelMatrixDimension = 64;
+		for (h = 0 ;h<64; h=h+1)
+		{
+			if (ModelGeneticCode[h]==10)
+			{
+				ModelMatrixDimension = ModelMatrixDimension-1;
+			}
+		}
+	}
+	
+	ModelMatrixName = {ModelMatrixDimension,ModelMatrixDimension}; 
+
+	hshift = 0;
+
+	if (modelType == 0)
+	{
+		for (h=0; h<64; h=h+1)
+		{
+			if (ModelGeneticCode[h]==10) 
+			{
+				hshift = hshift+1;
+				continue; 
+			}
+			vshift = hshift;
+			for (v = h+1; v<64; v=v+1)
+			{
+				diff = v-h;
+				if (ModelGeneticCode[v]==10) 
+				{
+					vshift = vshift+1;
+					continue; 
+				}
+				nucPosInCodon = 2;
+			  	if ((h$4==v$4)||((diff%4==0)&&(h$16==v$16))||(diff%16==0))
+			  	{
+			  		if (h$4==v$4)
+			  		{
+			  			transition = v%4;
+			  			transition2= h%4;
+			  		}
+			  		else
+			  		{
+			  			if(diff%16==0)
+			  			{
+			  				transition = v$16;
+			  				transition2= h$16;
+							nucPosInCodon = 0;
+			  			}
+			  			else
+			  			{
+			  				transition = v%16$4;
+			  				transition2= h%16$4;
+							nucPosInCodon = 1;
+			  			}
+			  		}
+			  		if (ModelGeneticCode[0][h]==ModelGeneticCode[0][v]) 
+			  		{
+			  			if ((Abs(transition-transition2)%2)==1)
+			  			{
+			  				ModelMatrixName[h-hshift][v-vshift] := globalVariable_TVTS*synRate*EFV__[transition__][nucPosInCodon__];
+			  				ModelMatrixName[v-vshift][h-hshift] := globalVariable_TVTS*synRate*EFV__[transition2__][nucPosInCodon__];
+			  			
+			  			}
+			  			else
+			  			{
+			  				ModelMatrixName[h-hshift][v-vshift] := synRate*EFV__[transition__][nucPosInCodon__];
+			  				ModelMatrixName[v-vshift][h-hshift] := synRate*EFV__[transition2__][nucPosInCodon__];
+			  			}
+				  	}
+			  		else
+			  		{
+			  			if ((Abs(transition-transition2)%2)==1)
+			  			{
+			  				ModelMatrixName[h-hshift][v-vshift] := globalVariable_TVTS*nonSynRate*EFV__[transition__][nucPosInCodon__];
+			  				ModelMatrixName[v-vshift][h-hshift] := globalVariable_TVTS*nonSynRate*EFV__[transition2__][nucPosInCodon__];
+			  			
+			  			}
+			  			else
+			  			{
+			  				ModelMatrixName[h-hshift][v-vshift] := nonSynRate*EFV__[transition__][nucPosInCodon__];
+			  				ModelMatrixName[v-vshift][h-hshift] := nonSynRate*EFV__[transition2__][nucPosInCodon__];
+			  			}
+				  	}
+			  	}
+			}
+		}
+	}
+	else
+	{
+		gdDefString = "";
+		gdDefString * 1024;
+		for (mi=1; mi<rateClassCount; mi=mi+1)
+		{
+			gdDefString*("global shapeParameter_PS_"+mi+" = 1/"+((rateClassCount+1)-mi)+";\nshapeParameter_PS_"+mi+":<1;\n");
+		}
+		
+		gdDefString*("\n\nglobal shapeParameter_RS_1 = .3;\nshapeParameter_RS_1:<1;shapeParameter_RS_1:>0.000000001;\n");
+
+		for (mi=3; mi<=rateClassCount; mi=mi+1)
+		{
+			gdDefString*("global shapeParameter_RS_"+mi+" = 1.5;"+"\nshapeParameter_RS_"+mi+":>1;shapeParameter_RS_"+mi+":<100000;\n");
+		} 
+
+		rateStrMx    = {rateClassCount,1};
+		rateStrMx[0] = "shapeParameter_RS_1";
+		rateStrMx[1] = "1";
+
+		for (mi=3; mi<=rateClassCount; mi=mi+1)
+		{
+			rateStrMx[mi-1] = rateStrMx[mi-2]+"*shapeParameter_RS_"+mi;
+		} 	
+
+		freqStrMx    = {rateClassCount,1};
+		freqStrMx[0] = "shapeParameter_PS_1";
+
+		for (mi=1; mi<rateClassCount-1; mi=mi+1)
+		{
+			freqStrMx[mi] = "";
+			for (mi2=1;mi2<=mi;mi2=mi2+1)
+			{
+				freqStrMx[mi] = freqStrMx[mi]+"(1-shapeParameter_PS_"+mi2+")";		
+			}
+			freqStrMx[mi] = freqStrMx[mi]+"shapeParameter_PS_"+(mi+1);	
+		}	
+
+		freqStrMx[mi] = "";
+		for (mi2=1;mi2<mi;mi2=mi2+1)
+		{
+			freqStrMx[mi] = freqStrMx[mi]+"(1-shapeParameter_PS_"+mi2+")";		
+		}
+		freqStrMx[mi] = freqStrMx[mi]+"(1-shapeParameter_PS_"+mi+")";	
+
+
+		gdDefString*("\n\nglobal shapeParameter_scale:="+rateStrMx[0]+"*"+freqStrMx[0]);
+
+		for (mi=1; mi<rateClassCount; mi=mi+1)
+		{
+			gdDefString*("+"+rateStrMx[mi]+"*"+freqStrMx[mi]);
+		}
+
+		gdDefString*(";\nshapeParameter_categFreqMatrix={{"+freqStrMx[0]);
+
+		for (mi=1; mi<rateClassCount; mi=mi+1)
+		{
+			gdDefString*(","+freqStrMx[mi]);
+		}
+
+		gdDefString*("}};\nshapeParameter_categRateMatrix={{"+rateStrMx[0]+"/shapeParameter_scale");
+
+		for (mi=1; mi<rateClassCount; mi=mi+1)
+		{
+			gdDefString*(","+rateStrMx[mi]+"/shapeParameter_scale");
+		}
+
+		gdDefString*("}};\n\ncategory categoryVariable  = ("+rateClassCount+", shapeParameter_categFreqMatrix , MEAN, ,shapeParameter_categRateMatrix, 0, 1e25);\n\n");
+		gdDefString*0;
+		ExecuteCommands (gdDefString);
+
+		for (h=0; h<64; h=h+1)
+		{
+			if (ModelGeneticCode[h]==10) 
+			{
+				hshift = hshift+1;
+				continue; 
+			}
+			vshift = hshift;
+			for (v = h+1; v<64; v=v+1)
+			{
+				diff = v-h;
+				if (ModelGeneticCode[v]==10) 
+				{
+					vshift = vshift+1;
+					continue; 
+				}
+				nucPosInCodon = 2;
+			  	if ((h$4==v$4)||((diff%4==0)&&(h$16==v$16))||(diff%16==0))
+			  	{
+			  		if (h$4==v$4)
+			  		{
+			  			transition = v%4;
+			  			transition2= h%4;
+			  		}
+			  		else
+			  		{
+			  			if(diff%16==0)
+			  			{
+			  				transition = v$16;
+			  				transition2= h$16;
+							nucPosInCodon = 0;
+			  			}
+			  			else
+			  			{
+			  				transition = v%16$4;
+			  				transition2= h%16$4;
+							nucPosInCodon = 1;
+			  			}
+			  		}
+			  		
+			  		if (ModelGeneticCode[h]==ModelGeneticCode[v]) 
+			  		{
+			  			if ((Abs(transition-transition2)%2)==1)
+			  			{
+			  				ModelMatrixName[h-hshift][v-vshift] := categoryVariable*globalVariable_TVTS*synRate*EFV__[transition__][nucPosInCodon__];
+			  				ModelMatrixName[v-vshift][h-hshift] := categoryVariable*globalVariable_TVTS*synRate*EFV__[transition2__][nucPosInCodon__];
+			  			
+			  			}
+			  			else
+			  			{
+			  				ModelMatrixName[h-hshift][v-vshift] := categoryVariable*synRate*EFV__[transition__][nucPosInCodon__];
+			  				ModelMatrixName[v-vshift][h-hshift] := categoryVariable*synRate*EFV__[transition2__][nucPosInCodon__];
+			  			}
+				  	}
+			  		else
+			  		{
+			  			if ((Abs(transition-transition2)%2)==1)
+			  			{
+			  				ModelMatrixName[h-hshift][v-vshift] := categoryVariable*globalVariable_TVTS*nonSynRate*EFV__[transition__][nucPosInCodon__];
+			  				ModelMatrixName[v-vshift][h-hshift] := categoryVariable*globalVariable_TVTS*nonSynRate*EFV__[transition2__][nucPosInCodon__];
+			  			
+			  			}
+			  			else
+			  			{
+			  				ModelMatrixName[h-hshift][v-vshift] := categoryVariable*nonSynRate*EFV__[transition__][nucPosInCodon__];
+			  				ModelMatrixName[v-vshift][h-hshift] := categoryVariable*nonSynRate*EFV__[transition2__][nucPosInCodon__];
+			  			}
+				  	}
+			  	}
+			 }
+		}		
+	}	
+	return 0;
+}
diff --git a/res/SubstitutionModels/Codon/MG94.mdl b/res/SubstitutionModels/Codon/MG94.mdl
new file mode 100644
index 0000000..8452395
--- /dev/null
+++ b/res/SubstitutionModels/Codon/MG94.mdl
@@ -0,0 +1,229 @@
+Model_Name  		= "MG94";
+Model_Options 		= 3;
+Model_Dimension 	= 64;
+Model_EFV_Type		= "Observed Nuc 3 params.";
+
+function GUIBuildCodonFrequencies (EFV)
+{
+	PIStop = 1.0;
+	result = {ModelMatrixDimension,1};
+	hshift = 0;
+	
+	/*if (Columns(EFV)==3)
+	{
+		for (h=0; h<4; h=h+1)
+		{
+			EFV[h][0] = (EFV[h][0]+EFV[h][1]+EFV[h][2])/3;
+		}
+	}*/
+
+	for (h=0; h<64; h=h+1)
+	{
+		first = h$16;
+		second = h%16$4;
+		third = h%4;
+		if (ModelGeneticCode[h]==10) 
+		{
+			hshift = hshift+1;
+			PIStop = PIStop-EFV[first][0]*EFV[second][0]*EFV[third][0];
+			continue; 
+		}
+		result[h-hshift][0]=EFV[first][0]*EFV[second][0]*EFV[third][0];
+	}
+	return result*(1.0/PIStop);
+}
+
+function GUIPopulateModelMatrix (ModelMatrixName&, EFV)
+{
+	if (!ModelMatrixDimension)
+	{
+		ModelMatrixDimension = 64;
+		for (h = 0 ;h<64; h=h+1)
+		{
+			if (ModelGeneticCode[h]==10)
+			{
+				ModelMatrixDimension = ModelMatrixDimension-1;
+			}
+		}
+	}
+
+	if (Columns(EFV)==3)
+	{
+		for (h=0; h<4; h=h+1)
+		{
+			EFV[h][0] = (EFV[h][0]+EFV[h][1]+EFV[h][2])/3;
+		}
+	}
+	
+	ModelMatrixName = {ModelMatrixDimension,ModelMatrixDimension}; 
+
+	hshift = 0;
+
+	if (modelType == 0)
+	{
+		for (h=0; h<64; h=h+1)
+		{
+			if (ModelGeneticCode[h]==10) 
+			{
+				hshift = hshift+1;
+				continue; 
+			}
+			vshift = hshift;
+			for (v = h+1; v<64; v=v+1)
+			{
+				diff = v-h;
+				if (ModelGeneticCode[v]==10) 
+				{
+					vshift = vshift+1;
+					continue; 
+				}
+			  	if ((h$4==v$4)||((diff%4==0)&&(h$16==v$16))||(diff%16==0))
+			  	{
+			  		if (h$4==v$4)
+			  		{
+			  			transition = v%4;
+			  			transition2= h%4;
+			  		}
+			  		else
+			  		{
+			  			if(diff%16==0)
+			  			{
+			  				transition = v$16;
+			  				transition2= h$16;
+			  			}
+			  			else
+			  			{
+			  				transition = v%16$4;
+			  				transition2= h%16$4;
+			  			}
+			  		}
+			  		if (ModelGeneticCode[0][h]==ModelGeneticCode[0][v]) 
+			  		{
+			  			ModelMatrixName[h-hshift][v-vshift] := synRate*EFV__[transition__][0];
+			  			ModelMatrixName[v-vshift][h-hshift] := synRate*EFV__[transition2__][0];
+				  	}
+			  		else
+			  		{
+				  		ModelMatrixName[h-hshift][v-vshift] := nonSynRate*EFV__[transition__][0];
+			  			ModelMatrixName[v-vshift][h-hshift] := nonSynRate*EFV__[transition2__][0];
+		  			}
+			  	}
+			  }
+		}
+	}
+	else
+	{
+		global globalVariable_DNDS;
+		if (modelType == 1)
+		{
+			for (h=0; h<64; h=h+1)
+				{
+					if (ModelGeneticCode[h]==10) 
+					{
+						hshift = hshift+1;
+						continue; 
+					}
+					vshift = hshift;
+					for (v = h+1; v<64; v=v+1)
+					{
+						diff = v-h;
+						if (ModelGeneticCode[v]==10) 
+						{
+							vshift = vshift+1;
+							continue; 
+						}
+					  	if ((h$4==v$4)||((diff%4==0)&&(h$16==v$16))||(diff%16==0))
+					  	{
+					  		if (h$4==v$4)
+					  		{
+					  			transition = v%4;
+					  			transition2= h%4;
+					  		}
+					  		else
+					  		{
+					  			if(diff%16==0)
+					  			{
+					  				transition = v$16;
+					  				transition2= h$16;
+					  			}
+					  			else
+					  			{
+					  				transition = v%16$4;
+					  				transition2= h%16$4;
+					  			}
+					  		}
+					  		if (ModelGeneticCode[0][h]!=ModelGeneticCode[0][v]) 
+					  		{
+					  			ModelMatrixName[h-hshift][v-vshift] := globalVariable_DNDS*synRate*EFV__[transition__][0];
+					  			ModelMatrixName[v-vshift][h-hshift] := globalVariable_DNDS*synRate*EFV__[transition2__][0];
+						  	}
+					  		else
+					  		{
+						  		ModelMatrixName[h-hshift][v-vshift] := synRate*EFV__[transition__][0];
+					  			ModelMatrixName[v-vshift][h-hshift] := synRate*EFV__[transition2__][0];
+				  			}
+					  	}
+					  }
+				}	
+		}
+		else
+		{
+			global shapeParameter = .5;
+			shapeParameter:>0.01;shapeParameter:<100;
+			category     categoryVariable = 
+						(rateClassCount, EQUAL, MEAN, GammaDist(_x_,shapeParameter,shapeParameter), CGammaDist(_x_,shapeParameter,shapeParameter), 0 , 
+				  									  1e25,CGammaDist(_x_,shapeParameter+1,shapeParameter));
+			for (h=0; h<64; h=h+1)
+				{
+					if (ModelGeneticCode[h]==10) 
+					{
+						hshift = hshift+1;
+						continue; 
+					}
+					vshift = hshift;
+					for (v = h+1; v<64; v=v+1)
+					{
+						diff = v-h;
+						if (ModelGeneticCode[v]==10) 
+						{
+							vshift = vshift+1;
+							continue; 
+						}
+					  	if ((h$4==v$4)||((diff%4==0)&&(h$16==v$16))||(diff%16==0))
+					  	{
+					  		if (h$4==v$4)
+					  		{
+					  			transition = v%4;
+					  			transition2= h%4;
+					  		}
+					  		else
+					  		{
+					  			if(diff%16==0)
+					  			{
+					  				transition = v$16;
+					  				transition2= h$16;
+					  			}
+					  			else
+					  			{
+					  				transition = v%16$4;
+					  				transition2= h%16$4;
+					  			}
+					  		}
+					  		if (ModelGeneticCode[0][h]!=ModelGeneticCode[0][v]) 
+					  		{
+					  			ModelMatrixName[h-hshift][v-vshift] := globalVariable_DNDS*synRate*categoryVariable*EFV__[transition__][0];
+					  			ModelMatrixName[v-vshift][h-hshift] := globalVariable_DNDS*synRate*categoryVariable*EFV__[transition2__][0];
+						  	}
+					  		else
+					  		{
+						  		ModelMatrixName[h-hshift][v-vshift] := synRate*categoryVariable*EFV__[transition__][0];
+					  			ModelMatrixName[v-vshift][h-hshift] := synRate*categoryVariable*EFV__[transition2__][0];
+				  			}
+					  	}
+					  }
+				}		
+		}
+	}
+	
+	return 0;
+}
diff --git a/res/SubstitutionModels/Codon/MG94REVOmegaCF3x4.mdl b/res/SubstitutionModels/Codon/MG94REVOmegaCF3x4.mdl
new file mode 100644
index 0000000..458430e
--- /dev/null
+++ b/res/SubstitutionModels/Codon/MG94REVOmegaCF3x4.mdl
@@ -0,0 +1,427 @@
+Model_Name  		= "MGxREV_Omega_CF3x4";
+Model_Options 		= 3;
+Model_Dimension 	= 64;
+Model_EFV_Type		= "Observed Nuc 9 params.";
+
+function GUIBuildCodonFrequencies (EFV)
+{
+	LoadFunctionLibrary ("CF3x4");
+	stopCodons = {};
+	nucLetters = "ACGT";
+	for (h = 0; h < 64; h+=1)
+	{
+		if (ModelGeneticCode[h]==10) 
+		{
+			stopCodons + (nucLetters[h$16] + nucLetters[h%16$4] + nucLetters[h%4]);
+		}
+	}
+	EFV = CF3x4(EFV, Join(",",stopCodons));
+	PIStop = 1.0;
+	result = {ModelMatrixDimension,1};
+	hshift = 0;
+	
+	for (h=0; h<64; h=h+1)
+	{
+		first = h$16;
+		second = h%16$4;
+		third = h%4;
+		if (ModelGeneticCode[h]==10) 
+		{
+			hshift = hshift+1;
+			PIStop = PIStop-EFV[first][0]*EFV[second][1]*EFV[third][2];
+			continue; 
+		}
+		result[h-hshift][0]=EFV[first][0]*EFV[second][1]*EFV[third][2];
+	}
+	return result*(1.0/PIStop);
+}
+
+function GUIPopulateModelMatrix (ModelMatrixName&, EFV)
+{
+	global globalVariable_AC;
+	global globalVariable_AT;
+	global globalVariable_CG;
+	global globalVariable_CT;
+	global globalVariable_GT;
+	global globalVariable_R;
+
+	
+	if (!ModelMatrixDimension)
+	{
+		ModelMatrixDimension = 64;
+		for (h = 0 ;h<64; h=h+1)
+		{
+			if (ModelGeneticCode[h]==10)
+			{
+				ModelMatrixDimension = ModelMatrixDimension-1;
+			}
+		}
+	}
+	
+	ModelMatrixName = {ModelMatrixDimension,ModelMatrixDimension}; 
+
+	hshift = 0;
+
+	if (modelType < 2)
+	{
+		for (h=0; h<64; h=h+1)
+		{
+			if (ModelGeneticCode[h]==10) 
+			{
+				hshift = hshift+1;
+				continue; 
+			}
+			vshift = hshift;
+			for (v = h+1; v<64; v=v+1)
+			{
+				diff = v-h;
+				if (ModelGeneticCode[v]==10) 
+				{
+					vshift = vshift+1;
+					continue; 
+				}
+				nucPosInCodon = 2;
+				if ((h$4==v$4)||((diff%4==0)&&(h$16==v$16))||(diff%16==0))
+				{
+					if (h$4==v$4)
+					{
+						transition = v%4;
+						transition2= h%4;
+					}
+					else
+					{
+						if(diff%16==0)
+						{
+							transition = v$16;
+							transition2= h$16;
+							nucPosInCodon = 0;
+						}
+						else
+						{
+							transition = v%16$4;
+							transition2= h%16$4;
+							nucPosInCodon = 1;
+						}
+					}
+					if (transition<transition2)
+					{
+						trSM = transition;
+						trLG = transition2;
+					}
+					else
+					{
+						trSM = transition2;
+						trLG = transition;
+					}
+					
+					if (trSM==0)
+					{
+						if (trLG==1)
+						{
+							if (ModelGeneticCode[h]==ModelGeneticCode[v]) 
+							{
+								ModelMatrixName[h-hshift][v-vshift] := globalVariable_AC*synRate*EFV__[transition__][nucPosInCodon__];
+								ModelMatrixName[v-vshift][h-hshift] := globalVariable_AC*synRate*EFV__[transition2__][nucPosInCodon__];
+							}
+							else
+							{
+								if (modelType)
+								{
+									ModelMatrixName[h-hshift][v-vshift] := globalVariable_AC*globalVariable_R*synRate*EFV__[transition__][nucPosInCodon__];
+									ModelMatrixName[v-vshift][h-hshift] := globalVariable_AC*globalVariable_R*synRate*EFV__[transition2__][nucPosInCodon__];
+								}
+								else
+								{
+									ModelMatrixName[h-hshift][v-vshift] := globalVariable_AC*omega*synRate*EFV__[transition__][nucPosInCodon__];
+									ModelMatrixName[v-vshift][h-hshift] := globalVariable_AC*omega*synRate*EFV__[transition2__][nucPosInCodon__];
+								}
+							}
+						}
+						else
+						{
+							if (trLG==2)
+							{
+								if (ModelGeneticCode[h]==ModelGeneticCode[v]) 
+								{
+									ModelMatrixName[h-hshift][v-vshift] := synRate*EFV__[transition__][nucPosInCodon__];
+									ModelMatrixName[v-vshift][h-hshift] := synRate*EFV__[transition2__][nucPosInCodon__];
+								}
+								else
+								{
+									if (modelType)
+									{
+										ModelMatrixName[h-hshift][v-vshift] := globalVariable_R*synRate*EFV__[transition__][nucPosInCodon__];
+										ModelMatrixName[v-vshift][h-hshift] := globalVariable_R*synRate*EFV__[transition2__][nucPosInCodon__];
+									}
+									else
+									{
+										ModelMatrixName[h-hshift][v-vshift] := omega*synRate*EFV__[transition__][nucPosInCodon__];
+										ModelMatrixName[v-vshift][h-hshift] := omega*synRate*EFV__[transition2__][nucPosInCodon__];									
+									}
+								}							
+							}
+							else
+							{
+								if (ModelGeneticCode[h]==ModelGeneticCode[v]) 
+								{
+									ModelMatrixName[h-hshift][v-vshift] := globalVariable_AT*synRate*EFV__[transition__][nucPosInCodon__];
+									ModelMatrixName[v-vshift][h-hshift] := globalVariable_AT*synRate*EFV__[transition2__][nucPosInCodon__];
+								}
+								else
+								{
+									if (modelType)
+									{
+										ModelMatrixName[h-hshift][v-vshift] := globalVariable_AT*globalVariable_R*synRate*EFV__[transition__][nucPosInCodon__];
+										ModelMatrixName[v-vshift][h-hshift] := globalVariable_AT*globalVariable_R*synRate*EFV__[transition2__][nucPosInCodon__];
+									}
+									else
+									{
+										ModelMatrixName[h-hshift][v-vshift] := globalVariable_AT*omega*synRate*EFV__[transition__][nucPosInCodon__];
+										ModelMatrixName[v-vshift][h-hshift] := globalVariable_AT*omega*synRate*EFV__[transition2__][nucPosInCodon__];									
+									}
+								}							
+							}
+						}
+					}
+					else
+					{
+						if (trSM==1)
+						{
+							if (trLG==2)
+							{
+								if (ModelGeneticCode[h]==ModelGeneticCode[v]) 
+								{
+									ModelMatrixName[h-hshift][v-vshift] := globalVariable_CG*synRate*EFV__[transition__][nucPosInCodon__];
+									ModelMatrixName[v-vshift][h-hshift] := globalVariable_CG*synRate*EFV__[transition2__][nucPosInCodon__];
+								}
+								else
+								{
+									if (modelType)
+									{
+										ModelMatrixName[h-hshift][v-vshift] := globalVariable_CG*globalVariable_R*synRate*EFV__[transition__][nucPosInCodon__];
+										ModelMatrixName[v-vshift][h-hshift] := globalVariable_CG*globalVariable_R*synRate*EFV__[transition2__][nucPosInCodon__];
+									}
+									else
+									{
+										ModelMatrixName[h-hshift][v-vshift] := globalVariable_CG*omega*synRate*EFV__[transition__][nucPosInCodon__];
+										ModelMatrixName[v-vshift][h-hshift] := globalVariable_CG*omega*synRate*EFV__[transition2__][nucPosInCodon__];									
+									}
+								}
+							}
+							else
+							{
+								if (ModelGeneticCode[h]==ModelGeneticCode[v]) 
+								{
+									ModelMatrixName[h-hshift][v-vshift] := globalVariable_CT*synRate*EFV__[transition__][nucPosInCodon__];
+									ModelMatrixName[v-vshift][h-hshift] := globalVariable_CT*synRate*EFV__[transition2__][nucPosInCodon__];
+								}
+								else
+								{
+									if (modelType)
+									{
+										ModelMatrixName[h-hshift][v-vshift] := globalVariable_CT*globalVariable_R*synRate*EFV__[transition__][nucPosInCodon__];
+										ModelMatrixName[v-vshift][h-hshift] := globalVariable_CT*globalVariable_R*synRate*EFV__[transition2__][nucPosInCodon__];
+									}
+									else
+									{
+										ModelMatrixName[h-hshift][v-vshift] := globalVariable_CT*omega*synRate*EFV__[transition__][nucPosInCodon__];
+										ModelMatrixName[v-vshift][h-hshift] := globalVariable_CT*omega*synRate*EFV__[transition2__][nucPosInCodon__];
+									}
+									
+								}							
+							}
+						}
+						else
+						{
+							if (ModelGeneticCode[h]==ModelGeneticCode[v]) 
+							{
+								ModelMatrixName[h-hshift][v-vshift] := globalVariable_GT*synRate*EFV__[transition__][nucPosInCodon__];
+								ModelMatrixName[v-vshift][h-hshift] := globalVariable_GT*synRate*EFV__[transition2__][nucPosInCodon__];
+							}
+							else
+							{
+								if (modelType)
+								{
+									ModelMatrixName[h-hshift][v-vshift] := globalVariable_GT*globalVariable_R*synRate*EFV__[transition__][nucPosInCodon__];
+									ModelMatrixName[v-vshift][h-hshift] := globalVariable_GT*globalVariable_R*synRate*EFV__[transition2__][nucPosInCodon__];
+								}
+								else
+								{
+									ModelMatrixName[h-hshift][v-vshift] := globalVariable_GT*omega*synRate*EFV__[transition__][nucPosInCodon__];
+									ModelMatrixName[v-vshift][h-hshift] := globalVariable_GT*omega*synRate*EFV__[transition2__][nucPosInCodon__];								
+								}
+							}							
+						}
+					}
+				}
+		    }
+	    }		
+	}		
+	else
+	{
+		global shapeParameter_betaP = 1;
+		global shapeParameter_betaQ = 1;
+		shapeParameter_betaP:>0.05;shapeParameter_betaP:<85;
+		shapeParameter_betaQ:>0.05;shapeParameter_betaQ:<85;
+		category categoryVariable_Beta = (rateClassCount-1, EQUAL, MEAN, 
+						_x_^(shapeParameter_betaP-1)*(1-_x_)^(shapeParameter_betaQ-1)/Beta(shapeParameter_betaP,shapeParameter_betaQ), /* density */
+						IBeta(_x_,shapeParameter_betaP,shapeParameter_betaQ), /*CDF*/
+						0, 				   /*left bound*/
+						1, 			   /*right bound*/
+						IBeta(_x_,shapeParameter_betaP+1,shapeParameter_betaQ)*shapeParameter_betaP/(shapeParameter_betaP+shapeParameter_betaQ)
+		);
+
+		global shapeParameter = .5;
+		shapeParameter:>0.01;
+		shapeParameter:<100;
+		category     categoryVariable = 
+					(rateClassCount, categoryVariable_Beta, MEAN, GammaDist(_x_,shapeParameter,shapeParameter), CGammaDist(_x_,shapeParameter,shapeParameter), 0 , 
+			  									  1e25,CGammaDist(_x_,shapeParameter+1,shapeParameter));
+
+		for (h=0; h<64; h=h+1)
+		{
+			if (ModelGeneticCode[h]==10) 
+			{
+				hshift = hshift+1;
+				continue; 
+			}
+			vshift = hshift;
+			for (v = h+1; v<64; v=v+1)
+			{
+				diff = v-h;
+				if (ModelGeneticCode[v]==10) 
+				{
+					vshift = vshift+1;
+					continue; 
+				}
+				nucPosInCodon = 2;
+				if ((h$4==v$4)||((diff%4==0)&&(h$16==v$16))||(diff%16==0))
+				{
+					if (h$4==v$4)
+					{
+						transition = v%4;
+						transition2= h%4;
+					}
+					else
+					{
+						if(diff%16==0)
+						{
+							transition = v$16;
+							transition2= h$16;
+							nucPosInCodon = 0;
+						}
+						else
+						{
+							transition = v%16$4;
+							transition2= h%16$4;
+							nucPosInCodon = 1;
+						}
+					}
+					if (transition<transition2)
+					{
+						trSM = transition;
+						trLG = transition2;
+					}
+					else
+					{
+						trSM = transition2;
+						trLG = transition;
+					}
+					
+					if (trSM==0)
+					{
+						if (trLG==1)
+						{
+							if (ModelGeneticCode[h]==ModelGeneticCode[v]) 
+							{
+								ModelMatrixName[h-hshift][v-vshift] := categoryVariable*globalVariable_AC*synRate*EFV__[transition__][nucPosInCodon__];
+								ModelMatrixName[v-vshift][h-hshift] := categoryVariable*globalVariable_AC*synRate*EFV__[transition2__][nucPosInCodon__];
+							}
+							else
+							{
+								ModelMatrixName[h-hshift][v-vshift] := categoryVariable*globalVariable_AC*globalVariable_R*synRate*EFV__[transition__][nucPosInCodon__];
+								ModelMatrixName[v-vshift][h-hshift] := categoryVariable*globalVariable_AC*globalVariable_R*synRate*EFV__[transition2__][nucPosInCodon__];
+							}
+						}
+						else
+						{
+							if (trLG==2)
+							{
+								if (ModelGeneticCode[h]==ModelGeneticCode[v]) 
+								{
+									ModelMatrixName[h-hshift][v-vshift] := synRate*EFV__[transition__][nucPosInCodon__];
+									ModelMatrixName[v-vshift][h-hshift] := synRate*EFV__[transition2__][nucPosInCodon__];
+								}
+								else
+								{
+									ModelMatrixName[h-hshift][v-vshift] := categoryVariable*globalVariable_R*synRate*EFV__[transition__][nucPosInCodon__];
+									ModelMatrixName[v-vshift][h-hshift] := categoryVariable*globalVariable_R*synRate*EFV__[transition2__][nucPosInCodon__];
+								}							
+							}
+							else
+							{
+								if (ModelGeneticCode[h]==ModelGeneticCode[v]) 
+								{
+									ModelMatrixName[h-hshift][v-vshift] := globalVariable_AT*synRate*EFV__[transition__][nucPosInCodon__];
+									ModelMatrixName[v-vshift][h-hshift] := globalVariable_AT*synRate*EFV__[transition2__][nucPosInCodon__];
+								}
+								else
+								{
+									ModelMatrixName[h-hshift][v-vshift] := categoryVariable*globalVariable_AT*globalVariable_R*synRate*EFV__[transition__][nucPosInCodon__];
+									ModelMatrixName[v-vshift][h-hshift] := categoryVariable*globalVariable_AT*globalVariable_R*synRate*EFV__[transition2__][nucPosInCodon__];
+								}							
+							}
+						}
+					}
+					else
+					{
+						if (trSM==1)
+						{
+							if (trLG==2)
+							{
+								if (ModelGeneticCode[h]==ModelGeneticCode[v]) 
+								{
+									ModelMatrixName[h-hshift][v-vshift] := globalVariable_CG*synRate*EFV__[transition__][nucPosInCodon__];
+									ModelMatrixName[v-vshift][h-hshift] := globalVariable_CG*synRate*EFV__[transition2__][nucPosInCodon__];
+								}
+								else
+								{
+									ModelMatrixName[h-hshift][v-vshift] := categoryVariable*globalVariable_CG*globalVariable_R*synRate*EFV__[transition__][nucPosInCodon__];
+									ModelMatrixName[v-vshift][h-hshift] := categoryVariable*globalVariable_CG*globalVariable_R*synRate*EFV__[transition2__][nucPosInCodon__];
+								}
+							}
+							else
+							{
+								if (ModelGeneticCode[h]==ModelGeneticCode[v]) 
+								{
+									ModelMatrixName[h-hshift][v-vshift] := globalVariable_CT*synRate*EFV__[transition__][nucPosInCodon__];
+									ModelMatrixName[v-vshift][h-hshift] := globalVariable_CT*synRate*EFV__[transition2__][nucPosInCodon__];
+								}
+								else
+								{
+									ModelMatrixName[h-hshift][v-vshift] := categoryVariable*globalVariable_CT*globalVariable_R*synRate*EFV__[transition__][nucPosInCodon__];
+									ModelMatrixName[v-vshift][h-hshift] := categoryVariable*globalVariable_CT*globalVariable_R*synRate*EFV__[transition2__][nucPosInCodon__];
+								}							
+							}
+						}
+						else
+						{
+							if (ModelGeneticCode[h]==ModelGeneticCode[v]) 
+							{
+								ModelMatrixName[h-hshift][v-vshift] := globalVariable_GT*synRate*EFV__[transition__][nucPosInCodon__];
+								ModelMatrixName[v-vshift][h-hshift] := globalVariable_GT*synRate*EFV__[transition2__][nucPosInCodon__];
+							}
+							else
+							{
+								ModelMatrixName[h-hshift][v-vshift] := categoryVariable*globalVariable_GT*globalVariable_R*synRate*EFV__[transition__][nucPosInCodon__];
+								ModelMatrixName[v-vshift][h-hshift] := categoryVariable*globalVariable_GT*globalVariable_R*synRate*EFV__[transition2__][nucPosInCodon__];
+							}							
+						}
+					}
+				}
+		    }
+	    }	
+	}
+	
+	return 0;
+}
diff --git a/res/SubstitutionModels/Codon/MG94_3x4.mdl b/res/SubstitutionModels/Codon/MG94_3x4.mdl
new file mode 100644
index 0000000..397ff31
--- /dev/null
+++ b/res/SubstitutionModels/Codon/MG94_3x4.mdl
@@ -0,0 +1,222 @@
+Model_Name  		= "MG94_3x4";
+Model_Options 		= 3;
+Model_Dimension 	= 64;
+Model_EFV_Type		= "Observed Nuc 9 params.";
+
+function GUIBuildCodonFrequencies (EFV)
+{
+	PIStop = 1.0;
+	result = {ModelMatrixDimension,1};
+	hshift = 0;
+	
+	for (h=0; h<64; h=h+1)
+	{
+		first = h$16;
+		second = h%16$4;
+		third = h%4;
+		if (ModelGeneticCode[h]==10) 
+		{
+			hshift = hshift+1;
+			PIStop = PIStop-EFV[first][0]*EFV[second][1]*EFV[third][2];
+			continue; 
+		}
+		result[h-hshift][0]=EFV[first][0]*EFV[second][1]*EFV[third][2];
+	}
+	return result*(1.0/PIStop);
+}
+
+function GUIPopulateModelMatrix (ModelMatrixName&, EFV)
+{
+	if (!ModelMatrixDimension)
+	{
+		ModelMatrixDimension = 64;
+		for (h = 0 ;h<64; h=h+1)
+		{
+			if (ModelGeneticCode[h]==10)
+			{
+				ModelMatrixDimension = ModelMatrixDimension-1;
+			}
+		}
+	}
+	
+	ModelMatrixName = {ModelMatrixDimension,ModelMatrixDimension}; 
+
+	hshift = 0;
+
+	if (modelType == 0)
+	{
+		for (h=0; h<64; h=h+1)
+		{
+			if (ModelGeneticCode[h]==10) 
+			{
+				hshift = hshift+1;
+				continue; 
+			}
+			vshift = hshift;
+			for (v = h+1; v<64; v=v+1)
+			{
+				diff = v-h;
+				if (ModelGeneticCode[v]==10) 
+				{
+					vshift = vshift+1;
+					continue; 
+				}
+				nucPosInCodon = 2;
+			  	if ((h$4==v$4)||((diff%4==0)&&(h$16==v$16))||(diff%16==0))
+			  	{
+			  		if (h$4==v$4)
+			  		{
+			  			transition = v%4;
+			  			transition2= h%4;
+			  		}
+			  		else
+			  		{
+			  			if(diff%16==0)
+			  			{
+			  				transition = v$16;
+			  				transition2= h$16;
+							nucPosInCodon = 0;
+			  			}
+			  			else
+			  			{
+			  				transition = v%16$4;
+			  				transition2= h%16$4;
+							nucPosInCodon = 1;
+			  			}
+			  		}
+			  		if (ModelGeneticCode[0][h]==ModelGeneticCode[0][v]) 
+			  		{
+			  			ModelMatrixName[h-hshift][v-vshift] := synRate*EFV__[transition__][nucPosInCodon__];
+			  			ModelMatrixName[v-vshift][h-hshift] := synRate*EFV__[transition2__][nucPosInCodon__];
+				  	}
+			  		else
+			  		{
+				  		ModelMatrixName[h-hshift][v-vshift] := nonSynRate*EFV__[transition__][nucPosInCodon__];
+			  			ModelMatrixName[v-vshift][h-hshift] := nonSynRate*EFV__[transition2__][nucPosInCodon__];
+		  			}
+			  	}
+			 }
+		}
+	}
+	else
+	{
+		global globalVariable_DNDS;
+		if (modelType == 1)
+		{
+			for (h=0; h<64; h=h+1)
+				{
+					if (ModelGeneticCode[h]==10) 
+					{
+						hshift = hshift+1;
+						continue; 
+					}
+					vshift = hshift;
+					for (v = h+1; v<64; v=v+1)
+					{
+						diff = v-h;
+						if (ModelGeneticCode[v]==10) 
+						{
+							vshift = vshift+1;
+							continue; 
+						}
+						nucPosInCodon = 2;
+					  	if ((h$4==v$4)||((diff%4==0)&&(h$16==v$16))||(diff%16==0))
+					  	{
+					  		if (h$4==v$4)
+					  		{
+					  			transition = v%4;
+					  			transition2= h%4;
+					  		}
+					  		else
+					  		{
+					  			if(diff%16==0)
+					  			{
+					  				transition = v$16;
+					  				transition2= h$16;
+									nucPosInCodon = 0;
+					  			}
+					  			else
+					  			{
+					  				transition = v%16$4;
+					  				transition2= h%16$4;
+									nucPosInCodon = 1;
+					  			}
+					  		}
+					  		if (ModelGeneticCode[0][h]==ModelGeneticCode[0][v]) 
+					  		{
+					  			ModelMatrixName[h-hshift][v-vshift] := synRate*EFV__[transition__][nucPosInCodon__];
+					  			ModelMatrixName[v-vshift][h-hshift] := synRate*EFV__[transition2__][nucPosInCodon__];
+						  	}
+					  		else
+					  		{
+						  		ModelMatrixName[h-hshift][v-vshift] := globalVariable_DNDS*synRate*EFV__[transition__][nucPosInCodon__];
+					  			ModelMatrixName[v-vshift][h-hshift] := globalVariable_DNDS*synRate*EFV__[transition2__][nucPosInCodon__];
+				  			}
+					  	}
+					  }
+				}	
+		}
+		else
+		{
+			global shapeParameter = .5;
+			shapeParameter:>0.01;shapeParameter:<100;
+			category     categoryVariable = 
+						(rateClassCount, EQUAL, MEAN, GammaDist(_x_,shapeParameter,shapeParameter), CGammaDist(_x_,shapeParameter,shapeParameter), 0 , 
+				  									  1e25,CGammaDist(_x_,shapeParameter+1,shapeParameter));
+			for (h=0; h<64; h=h+1)
+			{
+				if (ModelGeneticCode[h]==10) 
+				{
+					hshift = hshift+1;
+					continue; 
+				}
+				vshift = hshift;
+				for (v = h+1; v<64; v=v+1)
+				{
+					diff = v-h;
+					if (ModelGeneticCode[v]==10) 
+					{
+						vshift = vshift+1;
+						continue; 
+					}
+					nucPosInCodon = 2;
+				  	if ((h$4==v$4)||((diff%4==0)&&(h$16==v$16))||(diff%16==0))
+				  	{
+				  		if (h$4==v$4)
+				  		{
+				  			transition = v%4;
+				  			transition2= h%4;
+				  		}
+				  		else
+				  		{
+				  			if(diff%16==0)
+				  			{
+				  				transition = v$16;
+				  				transition2= h$16;
+								nucPosInCodon = 0;
+				  			}
+				  			else
+				  			{
+				  				transition = v%16$4;
+				  				transition2= h%16$4;
+								nucPosInCodon = 1;
+				  			}
+				  		}
+				  		if (ModelGeneticCode[0][h]==ModelGeneticCode[0][v]) 
+				  		{
+				  			ModelMatrixName[h-hshift][v-vshift] := categoryVariable*synRate*EFV__[transition__][nucPosInCodon__];
+				  			ModelMatrixName[v-vshift][h-hshift] := categoryVariable*synRate*EFV__[transition2__][nucPosInCodon__];
+					  	}
+				  		else
+				  		{
+					  		ModelMatrixName[h-hshift][v-vshift] := categoryVariable*globalVariable_DNDS*synRate*EFV__[transition__][nucPosInCodon__];
+				  			ModelMatrixName[v-vshift][h-hshift] := categoryVariable*globalVariable_DNDS*synRate*EFV__[transition2__][nucPosInCodon__];
+			  			}
+				  	}
+				 }
+			}		
+		}
+	}
+	
+	return 0;
+}
diff --git a/res/SubstitutionModels/Codon/MG94_HKY85x3_4.mdl b/res/SubstitutionModels/Codon/MG94_HKY85x3_4.mdl
new file mode 100644
index 0000000..6d18ecb
--- /dev/null
+++ b/res/SubstitutionModels/Codon/MG94_HKY85x3_4.mdl
@@ -0,0 +1,243 @@
+Model_Name  		= "MG94xHKY85_3x4";
+Model_Options 		= 3;
+Model_Dimension 	= 64;
+Model_EFV_Type		= "Observed Nuc 9 params.";
+
+function GUIBuildCodonFrequencies (EFV)
+{
+	PIStop = 1.0;
+	result = {ModelMatrixDimension,1};
+	hshift = 0;
+	
+	for (h=0; h<64; h=h+1)
+	{
+		first = h$16;
+		second = h%16$4;
+		third = h%4;
+		if (ModelGeneticCode[h]==10) 
+		{
+			hshift = hshift+1;
+			PIStop = PIStop-EFV[first][0]*EFV[second][1]*EFV[third][2];
+			continue; 
+		}
+		result[h-hshift][0]=EFV[first][0]*EFV[second][1]*EFV[third][2];
+	}
+	return result*(1.0/PIStop);
+}
+
+function GUIPopulateModelMatrix (ModelMatrixName&, EFV)
+{
+	global globalVariable_TVTS;
+	
+	if (!ModelMatrixDimension)
+	{
+		ModelMatrixDimension = 64;
+		for (h = 0 ;h<64; h=h+1)
+		{
+			if (ModelGeneticCode[h]==10)
+			{
+				ModelMatrixDimension = ModelMatrixDimension-1;
+			}
+		}
+	}
+	
+	ModelMatrixName = {ModelMatrixDimension,ModelMatrixDimension}; 
+
+	hshift = 0;
+
+	if (modelType == 0)
+	{
+		for (h=0; h<64; h=h+1)
+		{
+			if (ModelGeneticCode[h]==10) 
+			{
+				hshift = hshift+1;
+				continue; 
+			}
+			vshift = hshift;
+			for (v = h+1; v<64; v=v+1)
+			{
+				diff = v-h;
+				if (ModelGeneticCode[v]==10) 
+				{
+					vshift = vshift+1;
+					continue; 
+				}
+				nucPosInCodon = 2;
+			  	if ((h$4==v$4)||((diff%4==0)&&(h$16==v$16))||(diff%16==0))
+			  	{
+			  		if (h$4==v$4)
+			  		{
+			  			transition = v%4;
+			  			transition2= h%4;
+			  		}
+			  		else
+			  		{
+			  			if(diff%16==0)
+			  			{
+			  				transition = v$16;
+			  				transition2= h$16;
+							nucPosInCodon = 0;
+			  			}
+			  			else
+			  			{
+			  				transition = v%16$4;
+			  				transition2= h%16$4;
+							nucPosInCodon = 1;
+			  			}
+			  		}
+			  		
+			  		if (ModelGeneticCode[0][h]==ModelGeneticCode[0][v]) 
+			  		{
+			  			if ((Abs(transition-transition2)%2)==1)
+			  			{
+			  				ModelMatrixName[h-hshift][v-vshift] := globalVariable_TVTS*synRate*EFV__[transition__][nucPosInCodon__];
+			  				ModelMatrixName[v-vshift][h-hshift] := globalVariable_TVTS*synRate*EFV__[transition2__][nucPosInCodon__];
+			  			
+			  			}
+			  			else
+			  			{
+			  				ModelMatrixName[h-hshift][v-vshift] := synRate*EFV__[transition__][nucPosInCodon__];
+			  				ModelMatrixName[v-vshift][h-hshift] := synRate*EFV__[transition2__][nucPosInCodon__];
+			  			}
+				  	}
+			  		else
+			  		{
+			  			if ((Abs(transition-transition2)%2)==1)
+			  			{
+			  				ModelMatrixName[h-hshift][v-vshift] := globalVariable_TVTS*nonSynRate*EFV__[transition__][nucPosInCodon__];
+			  				ModelMatrixName[v-vshift][h-hshift] := globalVariable_TVTS*nonSynRate*EFV__[transition2__][nucPosInCodon__];
+			  			
+			  			}
+			  			else
+			  			{
+			  				ModelMatrixName[h-hshift][v-vshift] := nonSynRate*EFV__[transition__][nucPosInCodon__];
+			  				ModelMatrixName[v-vshift][h-hshift] := nonSynRate*EFV__[transition2__][nucPosInCodon__];
+			  			}
+				  	}
+			  	}
+			 }
+		}		
+	}
+	else
+	{
+		global  globalVariable_DNDS  = 1.;
+		if (modelType == 2)
+		{
+			global shapeParameter_alpha = .5;
+			shapeParameter_alpha:>0.01;
+			shapeParameter_alpha:<100;
+			category     categoryVariable_alpha = 
+						(rateClassCount, EQUAL, MEAN, GammaDist(_x_,shapeParameter_alpha,shapeParameter_alpha), CGammaDist(_x_,shapeParameter_alpha,shapeParameter_alpha), 0 , 
+													  1e25,CGammaDist(_x_,shapeParameter_alpha+1,shapeParameter_alpha));
+		}
+
+		for (h=0; h<64; h=h+1)
+		{
+			if (ModelGeneticCode[h]==10) 
+			{
+				hshift = hshift+1;
+				continue; 
+			}
+			vshift = hshift;
+			for (v = h+1; v<64; v=v+1)
+			{
+				diff = v-h;
+				if (ModelGeneticCode[v]==10) 
+				{
+					vshift = vshift+1;
+					continue; 
+				}
+				nucPosInCodon = 2;
+			  	if ((h$4==v$4)||((diff%4==0)&&(h$16==v$16))||(diff%16==0))
+			  	{
+			  		if (h$4==v$4)
+			  		{
+			  			transition = v%4;
+			  			transition2= h%4;
+			  		}
+			  		else
+			  		{
+			  			if(diff%16==0)
+			  			{
+			  				transition = v$16;
+			  				transition2= h$16;
+							nucPosInCodon = 0;
+			  			}
+			  			else
+			  			{
+			  				transition = v%16$4;
+			  				transition2= h%16$4;
+							nucPosInCodon = 1;
+			  			}
+			  		}
+			  		
+					if (modelType == 2)
+					{
+						if (ModelGeneticCode[0][h]==ModelGeneticCode[0][v]) 
+						{
+							if ((Abs(transition-transition2)%2)==1)
+							{
+								ModelMatrixName[h-hshift][v-vshift] := categoryVariable_alpha*globalVariable_TVTS*synRate*EFV__[transition__][nucPosInCodon__];
+								ModelMatrixName[v-vshift][h-hshift] := categoryVariable_alpha*globalVariable_TVTS*synRate*EFV__[transition2__][nucPosInCodon__];
+							
+							}
+							else
+							{
+								ModelMatrixName[h-hshift][v-vshift] := categoryVariable_alpha*synRate*EFV__[transition__][nucPosInCodon__];
+								ModelMatrixName[v-vshift][h-hshift] := categoryVariable_alpha*synRate*EFV__[transition2__][nucPosInCodon__];
+							}
+						}
+						else
+						{
+							if ((Abs(transition-transition2)%2)==1)
+							{
+								ModelMatrixName[h-hshift][v-vshift] := categoryVariable_alpha*globalVariable_DNDS*globalVariable_TVTS*synRate*EFV__[transition__][nucPosInCodon__];
+								ModelMatrixName[v-vshift][h-hshift] := categoryVariable_alpha*globalVariable_DNDS*globalVariable_TVTS*synRate*EFV__[transition2__][nucPosInCodon__];
+							
+							}
+							else
+							{
+								ModelMatrixName[h-hshift][v-vshift] := categoryVariable_alpha*globalVariable_DNDS*synRate*EFV__[transition__][nucPosInCodon__];
+								ModelMatrixName[v-vshift][h-hshift] := categoryVariable_alpha*globalVariable_DNDS*synRate*EFV__[transition2__][nucPosInCodon__];
+							}
+						}
+					}
+					else
+					{
+						if (ModelGeneticCode[0][h]==ModelGeneticCode[0][v]) 
+						{
+							if ((Abs(transition-transition2)%2)==1)
+							{
+								ModelMatrixName[h-hshift][v-vshift] := globalVariable_TVTS*synRate*EFV__[transition__][nucPosInCodon__];
+								ModelMatrixName[v-vshift][h-hshift] := globalVariable_TVTS*synRate*EFV__[transition2__][nucPosInCodon__];
+							
+							}
+							else
+							{
+								ModelMatrixName[h-hshift][v-vshift] := synRate*EFV__[transition__][nucPosInCodon__];
+								ModelMatrixName[v-vshift][h-hshift] := synRate*EFV__[transition2__][nucPosInCodon__];
+							}
+						}
+						else
+						{
+							if ((Abs(transition-transition2)%2)==1)
+							{
+								ModelMatrixName[h-hshift][v-vshift] := globalVariable_DNDS*globalVariable_TVTS*synRate*EFV__[transition__][nucPosInCodon__];
+								ModelMatrixName[v-vshift][h-hshift] := globalVariable_DNDS*globalVariable_TVTS*synRate*EFV__[transition2__][nucPosInCodon__];
+							
+							}
+							else
+							{
+								ModelMatrixName[h-hshift][v-vshift] := globalVariable_DNDS*synRate*EFV__[transition__][nucPosInCodon__];
+								ModelMatrixName[v-vshift][h-hshift] := globalVariable_DNDS*synRate*EFV__[transition2__][nucPosInCodon__];
+							}
+						}
+					}
+					
+			  	}
+			 }
+		}			
+	}	
+	return 0;
+}
diff --git a/res/SubstitutionModels/Codon/MG94_REV_3x4.mdl b/res/SubstitutionModels/Codon/MG94_REV_3x4.mdl
new file mode 100644
index 0000000..afd1fc8
--- /dev/null
+++ b/res/SubstitutionModels/Codon/MG94_REV_3x4.mdl
@@ -0,0 +1,416 @@
+Model_Name  		= "MG94xREV_3x4";
+Model_Options 		= 3;
+Model_Dimension 	= 64;
+Model_EFV_Type		= "Observed Nuc 9 params.";
+
+function GUIBuildCodonFrequencies (EFV)
+{
+	PIStop = 1.0;
+	result = {ModelMatrixDimension,1};
+	hshift = 0;
+	
+	for (h=0; h<64; h=h+1)
+	{
+		first = h$16;
+		second = h%16$4;
+		third = h%4;
+		if (ModelGeneticCode[h]==10) 
+		{
+			hshift = hshift+1;
+			PIStop = PIStop-EFV[first][0]*EFV[second][1]*EFV[third][2];
+			continue; 
+		}
+		result[h-hshift][0]=EFV[first][0]*EFV[second][1]*EFV[third][2];
+	}
+	return result*(1.0/PIStop);
+}
+
+function GUIPopulateModelMatrix (ModelMatrixName&, EFV)
+{
+	global globalVariable_AC;
+	global globalVariable_AT;
+	global globalVariable_CG;
+	global globalVariable_CT;
+	global globalVariable_GT;
+	global globalVariable_R;
+
+	
+	if (!ModelMatrixDimension)
+	{
+		ModelMatrixDimension = 64;
+		for (h = 0 ;h<64; h=h+1)
+		{
+			if (ModelGeneticCode[h]==10)
+			{
+				ModelMatrixDimension = ModelMatrixDimension-1;
+			}
+		}
+	}
+	
+	ModelMatrixName = {ModelMatrixDimension,ModelMatrixDimension}; 
+
+	hshift = 0;
+
+	if (modelType < 2)
+	{
+		for (h=0; h<64; h=h+1)
+		{
+			if (ModelGeneticCode[h]==10) 
+			{
+				hshift = hshift+1;
+				continue; 
+			}
+			vshift = hshift;
+			for (v = h+1; v<64; v=v+1)
+			{
+				diff = v-h;
+				if (ModelGeneticCode[v]==10) 
+				{
+					vshift = vshift+1;
+					continue; 
+				}
+				nucPosInCodon = 2;
+				if ((h$4==v$4)||((diff%4==0)&&(h$16==v$16))||(diff%16==0))
+				{
+					if (h$4==v$4)
+					{
+						transition = v%4;
+						transition2= h%4;
+					}
+					else
+					{
+						if(diff%16==0)
+						{
+							transition = v$16;
+							transition2= h$16;
+							nucPosInCodon = 0;
+						}
+						else
+						{
+							transition = v%16$4;
+							transition2= h%16$4;
+							nucPosInCodon = 1;
+						}
+					}
+					if (transition<transition2)
+					{
+						trSM = transition;
+						trLG = transition2;
+					}
+					else
+					{
+						trSM = transition2;
+						trLG = transition;
+					}
+					
+					if (trSM==0)
+					{
+						if (trLG==1)
+						{
+							if (ModelGeneticCode[h]==ModelGeneticCode[v]) 
+							{
+								ModelMatrixName[h-hshift][v-vshift] := globalVariable_AC*synRate*EFV__[transition__][nucPosInCodon__];
+								ModelMatrixName[v-vshift][h-hshift] := globalVariable_AC*synRate*EFV__[transition2__][nucPosInCodon__];
+							}
+							else
+							{
+								if (modelType)
+								{
+									ModelMatrixName[h-hshift][v-vshift] := globalVariable_AC*globalVariable_R*synRate*EFV__[transition__][nucPosInCodon__];
+									ModelMatrixName[v-vshift][h-hshift] := globalVariable_AC*globalVariable_R*synRate*EFV__[transition2__][nucPosInCodon__];
+								}
+								else
+								{
+									ModelMatrixName[h-hshift][v-vshift] := globalVariable_AC*nonSynRate*EFV__[transition__][nucPosInCodon__];
+									ModelMatrixName[v-vshift][h-hshift] := globalVariable_AC*nonSynRate*EFV__[transition2__][nucPosInCodon__];
+								}
+							}
+						}
+						else
+						{
+							if (trLG==2)
+							{
+								if (ModelGeneticCode[h]==ModelGeneticCode[v]) 
+								{
+									ModelMatrixName[h-hshift][v-vshift] := synRate*EFV__[transition__][nucPosInCodon__];
+									ModelMatrixName[v-vshift][h-hshift] := synRate*EFV__[transition2__][nucPosInCodon__];
+								}
+								else
+								{
+									if (modelType)
+									{
+										ModelMatrixName[h-hshift][v-vshift] := globalVariable_R*synRate*EFV__[transition__][nucPosInCodon__];
+										ModelMatrixName[v-vshift][h-hshift] := globalVariable_R*synRate*EFV__[transition2__][nucPosInCodon__];
+									}
+									else
+									{
+										ModelMatrixName[h-hshift][v-vshift] := nonSynRate*EFV__[transition__][nucPosInCodon__];
+										ModelMatrixName[v-vshift][h-hshift] := nonSynRate*EFV__[transition2__][nucPosInCodon__];									
+									}
+								}							
+							}
+							else
+							{
+								if (ModelGeneticCode[h]==ModelGeneticCode[v]) 
+								{
+									ModelMatrixName[h-hshift][v-vshift] := globalVariable_AT*synRate*EFV__[transition__][nucPosInCodon__];
+									ModelMatrixName[v-vshift][h-hshift] := globalVariable_AT*synRate*EFV__[transition2__][nucPosInCodon__];
+								}
+								else
+								{
+									if (modelType)
+									{
+										ModelMatrixName[h-hshift][v-vshift] := globalVariable_AT*globalVariable_R*synRate*EFV__[transition__][nucPosInCodon__];
+										ModelMatrixName[v-vshift][h-hshift] := globalVariable_AT*globalVariable_R*synRate*EFV__[transition2__][nucPosInCodon__];
+									}
+									else
+									{
+										ModelMatrixName[h-hshift][v-vshift] := globalVariable_AT*nonSynRate*EFV__[transition__][nucPosInCodon__];
+										ModelMatrixName[v-vshift][h-hshift] := globalVariable_AT*nonSynRate*EFV__[transition2__][nucPosInCodon__];									
+									}
+								}							
+							}
+						}
+					}
+					else
+					{
+						if (trSM==1)
+						{
+							if (trLG==2)
+							{
+								if (ModelGeneticCode[h]==ModelGeneticCode[v]) 
+								{
+									ModelMatrixName[h-hshift][v-vshift] := globalVariable_CG*synRate*EFV__[transition__][nucPosInCodon__];
+									ModelMatrixName[v-vshift][h-hshift] := globalVariable_CG*synRate*EFV__[transition2__][nucPosInCodon__];
+								}
+								else
+								{
+									if (modelType)
+									{
+										ModelMatrixName[h-hshift][v-vshift] := globalVariable_CG*globalVariable_R*synRate*EFV__[transition__][nucPosInCodon__];
+										ModelMatrixName[v-vshift][h-hshift] := globalVariable_CG*globalVariable_R*synRate*EFV__[transition2__][nucPosInCodon__];
+									}
+									else
+									{
+										ModelMatrixName[h-hshift][v-vshift] := globalVariable_CG*nonSynRate*EFV__[transition__][nucPosInCodon__];
+										ModelMatrixName[v-vshift][h-hshift] := globalVariable_CG*nonSynRate*EFV__[transition2__][nucPosInCodon__];									
+									}
+								}
+							}
+							else
+							{
+								if (ModelGeneticCode[h]==ModelGeneticCode[v]) 
+								{
+									ModelMatrixName[h-hshift][v-vshift] := globalVariable_CT*synRate*EFV__[transition__][nucPosInCodon__];
+									ModelMatrixName[v-vshift][h-hshift] := globalVariable_CT*synRate*EFV__[transition2__][nucPosInCodon__];
+								}
+								else
+								{
+									if (modelType)
+									{
+										ModelMatrixName[h-hshift][v-vshift] := globalVariable_CT*globalVariable_R*synRate*EFV__[transition__][nucPosInCodon__];
+										ModelMatrixName[v-vshift][h-hshift] := globalVariable_CT*globalVariable_R*synRate*EFV__[transition2__][nucPosInCodon__];
+									}
+									else
+									{
+										ModelMatrixName[h-hshift][v-vshift] := globalVariable_CT*nonSynRate*EFV__[transition__][nucPosInCodon__];
+										ModelMatrixName[v-vshift][h-hshift] := globalVariable_CT*nonSynRate*EFV__[transition2__][nucPosInCodon__];
+									}
+									
+								}							
+							}
+						}
+						else
+						{
+							if (ModelGeneticCode[h]==ModelGeneticCode[v]) 
+							{
+								ModelMatrixName[h-hshift][v-vshift] := globalVariable_GT*synRate*EFV__[transition__][nucPosInCodon__];
+								ModelMatrixName[v-vshift][h-hshift] := globalVariable_GT*synRate*EFV__[transition2__][nucPosInCodon__];
+							}
+							else
+							{
+								if (modelType)
+								{
+									ModelMatrixName[h-hshift][v-vshift] := globalVariable_GT*globalVariable_R*synRate*EFV__[transition__][nucPosInCodon__];
+									ModelMatrixName[v-vshift][h-hshift] := globalVariable_GT*globalVariable_R*synRate*EFV__[transition2__][nucPosInCodon__];
+								}
+								else
+								{
+									ModelMatrixName[h-hshift][v-vshift] := globalVariable_GT*nonSynRate*EFV__[transition__][nucPosInCodon__];
+									ModelMatrixName[v-vshift][h-hshift] := globalVariable_GT*nonSynRate*EFV__[transition2__][nucPosInCodon__];								
+								}
+							}							
+						}
+					}
+				}
+		    }
+	    }		
+	}		
+	else
+	{
+		global shapeParameter_betaP = 1;
+		global shapeParameter_betaQ = 1;
+		shapeParameter_betaP:>0.05;shapeParameter_betaP:<85;
+		shapeParameter_betaQ:>0.05;shapeParameter_betaQ:<85;
+		category categoryVariable_Beta = (rateClassCount-1, EQUAL, MEAN, 
+						_x_^(shapeParameter_betaP-1)*(1-_x_)^(shapeParameter_betaQ-1)/Beta(shapeParameter_betaP,shapeParameter_betaQ), /* density */
+						IBeta(_x_,shapeParameter_betaP,shapeParameter_betaQ), /*CDF*/
+						0, 				   /*left bound*/
+						1, 			   /*right bound*/
+						IBeta(_x_,shapeParameter_betaP+1,shapeParameter_betaQ)*shapeParameter_betaP/(shapeParameter_betaP+shapeParameter_betaQ)
+		);
+
+		global shapeParameter = .5;
+		shapeParameter:>0.01;
+		shapeParameter:<100;
+		category     categoryVariable = 
+					(rateClassCount, categoryVariable_Beta, MEAN, GammaDist(_x_,shapeParameter,shapeParameter), CGammaDist(_x_,shapeParameter,shapeParameter), 0 , 
+			  									  1e25,CGammaDist(_x_,shapeParameter+1,shapeParameter));
+
+		for (h=0; h<64; h=h+1)
+		{
+			if (ModelGeneticCode[h]==10) 
+			{
+				hshift = hshift+1;
+				continue; 
+			}
+			vshift = hshift;
+			for (v = h+1; v<64; v=v+1)
+			{
+				diff = v-h;
+				if (ModelGeneticCode[v]==10) 
+				{
+					vshift = vshift+1;
+					continue; 
+				}
+				nucPosInCodon = 2;
+				if ((h$4==v$4)||((diff%4==0)&&(h$16==v$16))||(diff%16==0))
+				{
+					if (h$4==v$4)
+					{
+						transition = v%4;
+						transition2= h%4;
+					}
+					else
+					{
+						if(diff%16==0)
+						{
+							transition = v$16;
+							transition2= h$16;
+							nucPosInCodon = 0;
+						}
+						else
+						{
+							transition = v%16$4;
+							transition2= h%16$4;
+							nucPosInCodon = 1;
+						}
+					}
+					if (transition<transition2)
+					{
+						trSM = transition;
+						trLG = transition2;
+					}
+					else
+					{
+						trSM = transition2;
+						trLG = transition;
+					}
+					
+					if (trSM==0)
+					{
+						if (trLG==1)
+						{
+							if (ModelGeneticCode[h]==ModelGeneticCode[v]) 
+							{
+								ModelMatrixName[h-hshift][v-vshift] := categoryVariable*globalVariable_AC*synRate*EFV__[transition__][nucPosInCodon__];
+								ModelMatrixName[v-vshift][h-hshift] := categoryVariable*globalVariable_AC*synRate*EFV__[transition2__][nucPosInCodon__];
+							}
+							else
+							{
+								ModelMatrixName[h-hshift][v-vshift] := categoryVariable*globalVariable_AC*globalVariable_R*synRate*EFV__[transition__][nucPosInCodon__];
+								ModelMatrixName[v-vshift][h-hshift] := categoryVariable*globalVariable_AC*globalVariable_R*synRate*EFV__[transition2__][nucPosInCodon__];
+							}
+						}
+						else
+						{
+							if (trLG==2)
+							{
+								if (ModelGeneticCode[h]==ModelGeneticCode[v]) 
+								{
+									ModelMatrixName[h-hshift][v-vshift] := synRate*EFV__[transition__][nucPosInCodon__];
+									ModelMatrixName[v-vshift][h-hshift] := synRate*EFV__[transition2__][nucPosInCodon__];
+								}
+								else
+								{
+									ModelMatrixName[h-hshift][v-vshift] := categoryVariable*globalVariable_R*synRate*EFV__[transition__][nucPosInCodon__];
+									ModelMatrixName[v-vshift][h-hshift] := categoryVariable*globalVariable_R*synRate*EFV__[transition2__][nucPosInCodon__];
+								}							
+							}
+							else
+							{
+								if (ModelGeneticCode[h]==ModelGeneticCode[v]) 
+								{
+									ModelMatrixName[h-hshift][v-vshift] := globalVariable_AT*synRate*EFV__[transition__][nucPosInCodon__];
+									ModelMatrixName[v-vshift][h-hshift] := globalVariable_AT*synRate*EFV__[transition2__][nucPosInCodon__];
+								}
+								else
+								{
+									ModelMatrixName[h-hshift][v-vshift] := categoryVariable*globalVariable_AT*globalVariable_R*synRate*EFV__[transition__][nucPosInCodon__];
+									ModelMatrixName[v-vshift][h-hshift] := categoryVariable*globalVariable_AT*globalVariable_R*synRate*EFV__[transition2__][nucPosInCodon__];
+								}							
+							}
+						}
+					}
+					else
+					{
+						if (trSM==1)
+						{
+							if (trLG==2)
+							{
+								if (ModelGeneticCode[h]==ModelGeneticCode[v]) 
+								{
+									ModelMatrixName[h-hshift][v-vshift] := globalVariable_CG*synRate*EFV__[transition__][nucPosInCodon__];
+									ModelMatrixName[v-vshift][h-hshift] := globalVariable_CG*synRate*EFV__[transition2__][nucPosInCodon__];
+								}
+								else
+								{
+									ModelMatrixName[h-hshift][v-vshift] := categoryVariable*globalVariable_CG*globalVariable_R*synRate*EFV__[transition__][nucPosInCodon__];
+									ModelMatrixName[v-vshift][h-hshift] := categoryVariable*globalVariable_CG*globalVariable_R*synRate*EFV__[transition2__][nucPosInCodon__];
+								}
+							}
+							else
+							{
+								if (ModelGeneticCode[h]==ModelGeneticCode[v]) 
+								{
+									ModelMatrixName[h-hshift][v-vshift] := globalVariable_CT*synRate*EFV__[transition__][nucPosInCodon__];
+									ModelMatrixName[v-vshift][h-hshift] := globalVariable_CT*synRate*EFV__[transition2__][nucPosInCodon__];
+								}
+								else
+								{
+									ModelMatrixName[h-hshift][v-vshift] := categoryVariable*globalVariable_CT*globalVariable_R*synRate*EFV__[transition__][nucPosInCodon__];
+									ModelMatrixName[v-vshift][h-hshift] := categoryVariable*globalVariable_CT*globalVariable_R*synRate*EFV__[transition2__][nucPosInCodon__];
+								}							
+							}
+						}
+						else
+						{
+							if (ModelGeneticCode[h]==ModelGeneticCode[v]) 
+							{
+								ModelMatrixName[h-hshift][v-vshift] := globalVariable_GT*synRate*EFV__[transition__][nucPosInCodon__];
+								ModelMatrixName[v-vshift][h-hshift] := globalVariable_GT*synRate*EFV__[transition2__][nucPosInCodon__];
+							}
+							else
+							{
+								ModelMatrixName[h-hshift][v-vshift] := categoryVariable*globalVariable_GT*globalVariable_R*synRate*EFV__[transition__][nucPosInCodon__];
+								ModelMatrixName[v-vshift][h-hshift] := categoryVariable*globalVariable_GT*globalVariable_R*synRate*EFV__[transition2__][nucPosInCodon__];
+							}							
+						}
+					}
+				}
+		    }
+	    }	
+	}
+	
+	return 0;
+}
diff --git a/res/SubstitutionModels/Codon/MG94_REV_3x4.mdl copy b/res/SubstitutionModels/Codon/MG94_REV_3x4.mdl copy
new file mode 100644
index 0000000..e69de29
diff --git a/res/SubstitutionModels/Codon/MG94xHKY85_3x4_2Rates.mdl b/res/SubstitutionModels/Codon/MG94xHKY85_3x4_2Rates.mdl
new file mode 100644
index 0000000..ef2923f
--- /dev/null
+++ b/res/SubstitutionModels/Codon/MG94xHKY85_3x4_2Rates.mdl
@@ -0,0 +1,233 @@
+Model_Name  		= "MG94xHKY85x3_4x2_Rates";
+Model_Options 		= 2;
+Model_Dimension 	= 64;
+Model_EFV_Type		= "Observed Nuc 9 params.";
+
+function GUIBuildCodonFrequencies (EFV)
+{
+	PIStop = 1.0;
+	result = {ModelMatrixDimension,1};
+	hshift = 0;
+	
+	for (h=0; h<64; h=h+1)
+	{
+		first = h$16;
+		second = h%16$4;
+		third = h%4;
+		if (ModelGeneticCode[h]==10) 
+		{
+			hshift = hshift+1;
+			PIStop = PIStop-EFV[first][0]*EFV[second][1]*EFV[third][2];
+			continue; 
+		}
+		result[h-hshift][0]=EFV[first][0]*EFV[second][1]*EFV[third][2];
+	}
+	return result*(1.0/PIStop);
+}
+
+function GUIPopulateModelMatrix (ModelMatrixName&, EFV)
+{
+	global globalVariable_TVTS;
+	
+	if (!ModelMatrixDimension)
+	{
+		ModelMatrixDimension = 64;
+		for (h = 0 ;h<64; h=h+1)
+		{
+			if (ModelGeneticCode[h]==10)
+			{
+				ModelMatrixDimension = ModelMatrixDimension-1;
+			}
+		}
+	}
+	
+	ModelMatrixName = {ModelMatrixDimension,ModelMatrixDimension}; 
+
+	hshift = 0;
+	
+	if (modelType == 0)
+	{
+		for (h=0; h<64; h=h+1)
+		{
+			if (ModelGeneticCode[h]==10) 
+			{
+				hshift = hshift+1;
+				continue; 
+			}
+			vshift = hshift;
+			for (v = h+1; v<64; v=v+1)
+			{
+				diff = v-h;
+				if (ModelGeneticCode[v]==10) 
+				{
+					vshift = vshift+1;
+					continue; 
+				}
+				nucPosInCodon = 2;
+			  	if ((h$4==v$4)||((diff%4==0)&&(h$16==v$16))||(diff%16==0))
+			  	{
+			  		if (h$4==v$4)
+			  		{
+			  			transition = v%4;
+			  			transition2= h%4;
+			  		}
+			  		else
+			  		{
+			  			if(diff%16==0)
+			  			{
+			  				transition = v$16;
+			  				transition2= h$16;
+							nucPosInCodon = 0;
+			  			}
+			  			else
+			  			{
+			  				transition = v%16$4;
+			  				transition2= h%16$4;
+							nucPosInCodon = 1;
+			  			}
+			  		}
+			  		
+			  		if (ModelGeneticCode[0][h]==ModelGeneticCode[0][v]) 
+			  		{
+			  			if ((Abs(transition-transition2)%2)==1)
+			  			{
+			  				ModelMatrixName[h-hshift][v-vshift] := globalVariable_TVTS*synRate*EFV__[transition__][nucPosInCodon__];
+			  				ModelMatrixName[v-vshift][h-hshift] := globalVariable_TVTS*synRate*EFV__[transition2__][nucPosInCodon__];
+			  			
+			  			}
+			  			else
+			  			{
+			  				ModelMatrixName[h-hshift][v-vshift] := synRate*EFV__[transition__][nucPosInCodon__];
+			  				ModelMatrixName[v-vshift][h-hshift] := synRate*EFV__[transition2__][nucPosInCodon__];
+			  			}
+				  	}
+			  		else
+			  		{
+			  			if ((Abs(transition-transition2)%2)==0)
+			  			{
+			  				ModelMatrixName[h-hshift][v-vshift] := globalVariable_TVTS*nonSynRate*EFV__[transition__][nucPosInCodon__];
+			  				ModelMatrixName[v-vshift][h-hshift] := globalVariable_TVTS*nonSynRate*EFV__[transition2__][nucPosInCodon__];
+			  			
+			  			}
+			  			else
+			  			{
+			  				ModelMatrixName[h-hshift][v-vshift] := nonSynRate*EFV__[transition__][nucPosInCodon__];
+			  				ModelMatrixName[v-vshift][h-hshift] := nonSynRate*EFV__[transition2__][nucPosInCodon__];
+			  			}
+				  	}
+			  	}
+			 }
+		}		
+	}
+	else
+	{
+		global  globalVariable_DNDS  = 1.;
+		global shapeParameter_alpha = .5;
+		shapeParameter_alpha:>0.01;
+		shapeParameter_alpha:<100;
+		category     categoryVariable_alpha = 
+					(rateClassCount, EQUAL, MEAN, GammaDist(_x_,shapeParameter_alpha,shapeParameter_alpha), CGammaDist(_x_,shapeParameter_alpha,shapeParameter_alpha), 0 , 
+			  									  1e25,CGammaDist(_x_,shapeParameter_alpha+1,shapeParameter_alpha));
+
+
+
+		global shapeParameter_beta = .5;
+		shapeParameter_beta:>0.01;
+		shapeParameter_beta:<100;
+		
+		global shapeParameter_beta_Inv;
+		shapeParameter_beta_Inv :< 1-(1e-10);
+		shapeParameter_beta_Inv = 1/rateClassCount;
+		
+		
+		CFM = {rateClassCount,1};
+		CFM [0] := shapeParameter_beta_Inv;
+		
+		for (h=1; h<rateClassCount;h=h+1)
+		{
+			CFM [h] := (1-shapeParameter_beta_Inv)/(rateClassCount-1);
+		}
+		
+		category categoryVariable_beta = (rateClassCount, CFM, MEAN, 
+						(1-shapeParameter_beta_Inv)*GammaDist(_x_,shapeParameter_beta,shapeParameter_beta)*(_x_>0), 
+						(1-shapeParameter_beta_Inv)*CGammaDist(_x_,shapeParameter_beta,shapeParameter_beta)*(_x_>0)+shapeParameter_beta_Inv, 
+						0, 
+				  	    1e25,
+				  	    (1-shapeParameter_beta_Inv)*CGammaDist(_x_,shapeParameter_beta+1,shapeParameter_beta)*(_x_>0)
+				  	 );
+
+
+		for (h=0; h<64; h=h+1)
+		{
+			if (ModelGeneticCode[h]==10) 
+			{
+				hshift = hshift+1;
+				continue; 
+			}
+			vshift = hshift;
+			for (v = h+1; v<64; v=v+1)
+			{
+				diff = v-h;
+				if (ModelGeneticCode[v]==10) 
+				{
+					vshift = vshift+1;
+					continue; 
+				}
+				nucPosInCodon = 2;
+			  	if ((h$4==v$4)||((diff%4==0)&&(h$16==v$16))||(diff%16==0))
+			  	{
+			  		if (h$4==v$4)
+			  		{
+			  			transition = v%4;
+			  			transition2= h%4;
+			  		}
+			  		else
+			  		{
+			  			if(diff%16==0)
+			  			{
+			  				transition = v$16;
+			  				transition2= h$16;
+							nucPosInCodon = 0;
+			  			}
+			  			else
+			  			{
+			  				transition = v%16$4;
+			  				transition2= h%16$4;
+							nucPosInCodon = 1;
+			  			}
+			  		}
+			  		
+			  		if (ModelGeneticCode[0][h]==ModelGeneticCode[0][v]) 
+			  		{
+			  			if ((Abs(transition-transition2)%2)==1)
+			  			{
+			  				ModelMatrixName[h-hshift][v-vshift] := categoryVariable_alpha*globalVariable_TVTS*synRate*EFV__[transition__][nucPosInCodon__];
+			  				ModelMatrixName[v-vshift][h-hshift] := categoryVariable_alpha*globalVariable_TVTS*synRate*EFV__[transition2__][nucPosInCodon__];
+			  			
+			  			}
+			  			else
+			  			{
+			  				ModelMatrixName[h-hshift][v-vshift] := categoryVariable_alpha*synRate*EFV__[transition__][nucPosInCodon__];
+			  				ModelMatrixName[v-vshift][h-hshift] := categoryVariable_alpha*synRate*EFV__[transition2__][nucPosInCodon__];
+			  			}
+				  	}
+			  		else
+			  		{
+			  			if ((Abs(transition-transition2)%2)==0)
+			  			{
+			  				ModelMatrixName[h-hshift][v-vshift] := categoryVariable_beta*globalVariable_DNDS*globalVariable_TVTS*synRate*EFV__[transition__][nucPosInCodon__];
+			  				ModelMatrixName[v-vshift][h-hshift] := categoryVariable_beta*globalVariable_DNDS*globalVariable_TVTS*synRate*EFV__[transition2__][nucPosInCodon__];
+			  			
+			  			}
+			  			else
+			  			{
+			  				ModelMatrixName[h-hshift][v-vshift] := categoryVariable_beta*globalVariable_DNDS*synRate*EFV__[transition__][nucPosInCodon__];
+			  				ModelMatrixName[v-vshift][h-hshift] := categoryVariable_beta*globalVariable_DNDS*synRate*EFV__[transition2__][nucPosInCodon__];
+			  			}
+				  	}
+			  	}
+			 }
+		}			
+	}
+	return 0;
+}
diff --git a/res/SubstitutionModels/Codon/MG94xREV_3x4_DualRV.mdl b/res/SubstitutionModels/Codon/MG94xREV_3x4_DualRV.mdl
new file mode 100644
index 0000000..403e069
--- /dev/null
+++ b/res/SubstitutionModels/Codon/MG94xREV_3x4_DualRV.mdl
@@ -0,0 +1,365 @@
+Model_Name  		= "MG94xREV_3x4_DualRV";
+Model_Options 		= 2;
+Model_Dimension 	= 64;
+Model_EFV_Type		= "Observed Nuc 9 params.";
+
+function GUIBuildCodonFrequencies (EFV)
+{
+	PIStop = 1.0;
+	result = {ModelMatrixDimension,1};
+	hshift = 0;
+	
+	for (h=0; h<64; h=h+1)
+	{
+		first = h$16;
+		second = h%16$4;
+		third = h%4;
+		if (ModelGeneticCode[h]==10) 
+		{
+			hshift = hshift+1;
+			PIStop = PIStop-EFV[first][0]*EFV[second][1]*EFV[third][2];
+			continue; 
+		}
+		result[h-hshift][0]=EFV[first][0]*EFV[second][1]*EFV[third][2];
+	}
+	return result*(1.0/PIStop);
+}
+
+function GUIPopulateModelMatrix (ModelMatrixName&, EFV)
+{
+	global globalVariable_AC=1;
+	global globalVariable_AT=1;
+	global globalVariable_CG=1;
+	global globalVariable_CT=1;
+	global globalVariable_GT=1;
+	global globalVariable_R=1;
+	
+	if (!ModelMatrixDimension)
+	{
+		ModelMatrixDimension = 64;
+		for (h = 0 ;h<64; h=h+1)
+		{
+			if (ModelGeneticCode[h]==10)
+			{
+				ModelMatrixDimension = ModelMatrixDimension-1;
+			}
+		}
+	}
+	
+	ModelMatrixName = {ModelMatrixDimension,ModelMatrixDimension}; 
+
+	hshift = 0;
+	
+	if (modelType == 0)
+	{
+		for (h=0; h<64; h=h+1)
+		{
+			if (ModelGeneticCode[h]==10) 
+			{
+				hshift = hshift+1;
+				continue; 
+			}
+			vshift = hshift;
+			for (v = h+1; v<64; v=v+1)
+			{
+				diff = v-h;
+				if (ModelGeneticCode[v]==10) 
+				{
+					vshift = vshift+1;
+					continue; 
+				}
+				nucPosInCodon = 2;
+				if ((h$4==v$4)||((diff%4==0)&&(h$16==v$16))||(diff%16==0))
+				{
+					if (h$4==v$4)
+					{
+						transition = v%4;
+						transition2= h%4;
+					}
+					else
+					{
+						if(diff%16==0)
+						{
+							transition = v$16;
+							transition2= h$16;
+							nucPosInCodon = 0;
+						}
+						else
+						{
+							transition = v%16$4;
+							transition2= h%16$4;
+							nucPosInCodon = 1;
+						}
+					}
+					if (transition<transition2)
+					{
+						trSM = transition;
+						trLG = transition2;
+					}
+					else
+					{
+						trSM = transition2;
+						trLG = transition;
+					}
+					
+					if (trSM==0)
+					{
+						if (trLG==1)
+						{
+							if (ModelGeneticCode[h]==ModelGeneticCode[v]) 
+							{
+								ModelMatrixName[h-hshift][v-vshift] := globalVariable_AC*synRate*EFV__[transition__][nucPosInCodon__];
+								ModelMatrixName[v-vshift][h-hshift] := globalVariable_AC*synRate*EFV__[transition2__][nucPosInCodon__];
+							}
+							else
+							{
+								ModelMatrixName[h-hshift][v-vshift] := globalVariable_AC*nonSynRate*EFV__[transition__][nucPosInCodon__];
+								ModelMatrixName[v-vshift][h-hshift] := globalVariable_AC*nonSynRate*EFV__[transition2__][nucPosInCodon__];
+							}
+						}
+						else
+						{
+							if (trLG==2)
+							{
+								if (ModelGeneticCode[h]==ModelGeneticCode[v]) 
+								{
+									ModelMatrixName[h-hshift][v-vshift] := synRate*EFV__[transition__][nucPosInCodon__];
+									ModelMatrixName[v-vshift][h-hshift] := synRate*EFV__[transition2__][nucPosInCodon__];
+								}
+								else
+								{
+									ModelMatrixName[h-hshift][v-vshift] := nonSynRate*EFV__[transition__][nucPosInCodon__];
+									ModelMatrixName[v-vshift][h-hshift] := nonSynRate*EFV__[transition2__][nucPosInCodon__];									
+								}							
+							}
+							else
+							{
+								if (ModelGeneticCode[h]==ModelGeneticCode[v]) 
+								{
+									ModelMatrixName[h-hshift][v-vshift] := globalVariable_AT*synRate*EFV__[transition__][nucPosInCodon__];
+									ModelMatrixName[v-vshift][h-hshift] := globalVariable_AT*synRate*EFV__[transition2__][nucPosInCodon__];
+								}
+								else
+								{
+									ModelMatrixName[h-hshift][v-vshift] := globalVariable_AT*nonSynRate*EFV__[transition__][nucPosInCodon__];
+									ModelMatrixName[v-vshift][h-hshift] := globalVariable_AT*nonSynRate*EFV__[transition2__][nucPosInCodon__];									
+								}							
+							}
+						}
+					}
+					else
+					{
+						if (trSM==1)
+						{
+							if (trLG==2)
+							{
+								if (ModelGeneticCode[h]==ModelGeneticCode[v]) 
+								{
+									ModelMatrixName[h-hshift][v-vshift] := globalVariable_CG*synRate*EFV__[transition__][nucPosInCodon__];
+									ModelMatrixName[v-vshift][h-hshift] := globalVariable_CG*synRate*EFV__[transition2__][nucPosInCodon__];
+								}
+								else
+								{
+									ModelMatrixName[h-hshift][v-vshift] := globalVariable_CG*nonSynRate*EFV__[transition__][nucPosInCodon__];
+									ModelMatrixName[v-vshift][h-hshift] := globalVariable_CG*nonSynRate*EFV__[transition2__][nucPosInCodon__];									
+								}
+							}
+							else
+							{
+								if (ModelGeneticCode[h]==ModelGeneticCode[v]) 
+								{
+									ModelMatrixName[h-hshift][v-vshift] := globalVariable_CT*synRate*EFV__[transition__][nucPosInCodon__];
+									ModelMatrixName[v-vshift][h-hshift] := globalVariable_CT*synRate*EFV__[transition2__][nucPosInCodon__];
+								}
+								else
+								{
+									ModelMatrixName[h-hshift][v-vshift] := globalVariable_CT*nonSynRate*EFV__[transition__][nucPosInCodon__];
+									ModelMatrixName[v-vshift][h-hshift] := globalVariable_CT*nonSynRate*EFV__[transition2__][nucPosInCodon__];
+								}							
+							}
+						}
+						else
+						{
+							if (ModelGeneticCode[h]==ModelGeneticCode[v]) 
+							{
+								ModelMatrixName[h-hshift][v-vshift] := globalVariable_GT*synRate*EFV__[transition__][nucPosInCodon__];
+								ModelMatrixName[v-vshift][h-hshift] := globalVariable_GT*synRate*EFV__[transition2__][nucPosInCodon__];
+							}
+							else
+							{
+								ModelMatrixName[h-hshift][v-vshift] := globalVariable_GT*nonSynRate*EFV__[transition__][nucPosInCodon__];
+								ModelMatrixName[v-vshift][h-hshift] := globalVariable_GT*nonSynRate*EFV__[transition2__][nucPosInCodon__];								
+							}							
+						}
+					}
+				}
+		    }
+	    }		
+	}
+	else
+	{
+		global  globalVariable_R  = 1.;
+		global shapeParameter_alpha = .5;
+		shapeParameter_alpha:>0.01;
+		shapeParameter_alpha:<100;
+		category     categoryVariable_alpha = 
+					(rateClassCount, EQUAL, MEAN, GammaDist(_x_,shapeParameter_alpha,shapeParameter_alpha), CGammaDist(_x_,shapeParameter_alpha,shapeParameter_alpha), 0 , 
+			  									  1e25,CGammaDist(_x_,shapeParameter_alpha+1,shapeParameter_alpha));
+
+
+
+		global shapeParameter_beta = .5;
+		shapeParameter_beta:>0.01;
+		shapeParameter_beta:<100;
+		
+		category     categoryVariable_beta = 
+					(rateClassCount, EQUAL, MEAN, GammaDist(_x_,shapeParameter_beta,shapeParameter_beta), CGammaDist(_x_,shapeParameter_beta,shapeParameter_beta), 0 , 
+			  									  1e25,CGammaDist(_x_,shapeParameter_beta+1,shapeParameter_beta));
+
+
+		for (h=0; h<64; h=h+1)
+		{
+			if (ModelGeneticCode[h]==10) 
+			{
+				hshift = hshift+1;
+				continue; 
+			}
+			vshift = hshift;
+			for (v = h+1; v<64; v=v+1)
+			{
+				diff = v-h;
+				if (ModelGeneticCode[v]==10) 
+				{
+					vshift = vshift+1;
+					continue; 
+				}
+				nucPosInCodon = 2;
+				if ((h$4==v$4)||((diff%4==0)&&(h$16==v$16))||(diff%16==0))
+				{
+					if (h$4==v$4)
+					{
+						transition = v%4;
+						transition2= h%4;
+					}
+					else
+					{
+						if(diff%16==0)
+						{
+							transition = v$16;
+							transition2= h$16;
+							nucPosInCodon = 0;
+						}
+						else
+						{
+							transition = v%16$4;
+							transition2= h%16$4;
+							nucPosInCodon = 1;
+						}
+					}
+					if (transition<transition2)
+					{
+						trSM = transition;
+						trLG = transition2;
+					}
+					else
+					{
+						trSM = transition2;
+						trLG = transition;
+					}
+					
+					if (trSM==0)
+					{
+						if (trLG==1)
+						{
+							if (ModelGeneticCode[h]==ModelGeneticCode[v]) 
+							{
+								ModelMatrixName[h-hshift][v-vshift] := globalVariable_AC*synRate*categoryVariable_alpha*EFV__[transition__][nucPosInCodon__];
+								ModelMatrixName[v-vshift][h-hshift] := globalVariable_AC*synRate*categoryVariable_alpha*EFV__[transition2__][nucPosInCodon__];
+							}
+							else
+							{
+								ModelMatrixName[h-hshift][v-vshift] := globalVariable_AC*globalVariable_R*synRate*categoryVariable_beta*EFV__[transition__][nucPosInCodon__];
+								ModelMatrixName[v-vshift][h-hshift] := globalVariable_AC*globalVariable_R*synRate*categoryVariable_beta*EFV__[transition2__][nucPosInCodon__];
+							}
+						}
+						else
+						{
+							if (trLG==2)
+							{
+								if (ModelGeneticCode[h]==ModelGeneticCode[v]) 
+								{
+									ModelMatrixName[h-hshift][v-vshift] := synRate*categoryVariable_alpha*EFV__[transition__][nucPosInCodon__];
+									ModelMatrixName[v-vshift][h-hshift] := synRate*categoryVariable_alpha*EFV__[transition2__][nucPosInCodon__];
+								}
+								else
+								{
+									ModelMatrixName[h-hshift][v-vshift] := globalVariable_R*synRate*categoryVariable_beta*EFV__[transition__][nucPosInCodon__];
+									ModelMatrixName[v-vshift][h-hshift] := globalVariable_R*synRate*categoryVariable_beta*EFV__[transition2__][nucPosInCodon__];
+								}							
+							}
+							else
+							{
+								if (ModelGeneticCode[h]==ModelGeneticCode[v]) 
+								{
+									ModelMatrixName[h-hshift][v-vshift] := globalVariable_AT*synRate*categoryVariable_alpha*EFV__[transition__][nucPosInCodon__];
+									ModelMatrixName[v-vshift][h-hshift] := globalVariable_AT*synRate*categoryVariable_alpha*EFV__[transition2__][nucPosInCodon__];
+								}
+								else
+								{
+									ModelMatrixName[h-hshift][v-vshift] := globalVariable_AT*globalVariable_R*synRate*categoryVariable_beta*EFV__[transition__][nucPosInCodon__];
+									ModelMatrixName[v-vshift][h-hshift] := globalVariable_AT*globalVariable_R*synRate*categoryVariable_beta*EFV__[transition2__][nucPosInCodon__];
+								}							
+							}
+						}
+					}
+					else
+					{
+						if (trSM==1)
+						{
+							if (trLG==2)
+							{
+								if (ModelGeneticCode[h]==ModelGeneticCode[v]) 
+								{
+									ModelMatrixName[h-hshift][v-vshift] := globalVariable_CG*synRate*categoryVariable_alpha*EFV__[transition__][nucPosInCodon__];
+									ModelMatrixName[v-vshift][h-hshift] := globalVariable_CG*synRate*categoryVariable_alpha*EFV__[transition2__][nucPosInCodon__];
+								}
+								else
+								{
+									ModelMatrixName[h-hshift][v-vshift] := globalVariable_CG*globalVariable_R*synRate*categoryVariable_beta*EFV__[transition__][nucPosInCodon__];
+									ModelMatrixName[v-vshift][h-hshift] := globalVariable_CG*globalVariable_R*synRate*categoryVariable_beta*EFV__[transition2__][nucPosInCodon__];
+								}
+							}
+							else
+							{
+								if (ModelGeneticCode[h]==ModelGeneticCode[v]) 
+								{
+									ModelMatrixName[h-hshift][v-vshift] := globalVariable_CT*synRate*categoryVariable_alpha*EFV__[transition__][nucPosInCodon__];
+									ModelMatrixName[v-vshift][h-hshift] := globalVariable_CT*synRate*categoryVariable_alpha*EFV__[transition2__][nucPosInCodon__];
+								}
+								else
+								{
+									ModelMatrixName[h-hshift][v-vshift] := globalVariable_CT*globalVariable_R*synRate*categoryVariable_beta*EFV__[transition__][nucPosInCodon__];
+									ModelMatrixName[v-vshift][h-hshift] := globalVariable_CT*globalVariable_R*synRate*categoryVariable_beta*EFV__[transition2__][nucPosInCodon__];									
+								}							
+							}
+						}
+						else
+						{
+							if (ModelGeneticCode[h]==ModelGeneticCode[v]) 
+							{
+								ModelMatrixName[h-hshift][v-vshift] := globalVariable_GT*synRate*categoryVariable_alpha*EFV__[transition__][nucPosInCodon__];
+								ModelMatrixName[v-vshift][h-hshift] := globalVariable_GT*synRate*categoryVariable_alpha*EFV__[transition2__][nucPosInCodon__];
+							}
+							else
+							{
+								ModelMatrixName[h-hshift][v-vshift] := globalVariable_GT*globalVariable_R*synRate*categoryVariable_beta*EFV__[transition__][nucPosInCodon__];
+								ModelMatrixName[v-vshift][h-hshift] := globalVariable_GT*globalVariable_R*synRate*categoryVariable_beta*EFV__[transition2__][nucPosInCodon__];
+							}							
+						}
+					}
+				}
+		    }
+	     }	
+	  }
+	  return 0;
+}
diff --git a/res/SubstitutionModels/Codon/MG94xREV_3x4_DualRV_GDD.mdl b/res/SubstitutionModels/Codon/MG94xREV_3x4_DualRV_GDD.mdl
new file mode 100644
index 0000000..aabe824
--- /dev/null
+++ b/res/SubstitutionModels/Codon/MG94xREV_3x4_DualRV_GDD.mdl
@@ -0,0 +1,500 @@
+Model_Name  		= "MG94xREV_3x4_DualRV_GDD";
+Model_Options 		= 2;
+Model_Dimension 	= 64;
+Model_EFV_Type		= "Observed Nuc 9 params.";
+
+function GUIBuildCodonFrequencies (EFV)
+{
+	PIStop = 1.0;
+	result = {ModelMatrixDimension,1};
+	hshift = 0;
+	
+	for (h=0; h<64; h=h+1)
+	{
+		first = h$16;
+		second = h%16$4;
+		third = h%4;
+		if (ModelGeneticCode[h]==10) 
+		{
+			hshift = hshift+1;
+			PIStop = PIStop-EFV[first][0]*EFV[second][1]*EFV[third][2];
+			continue; 
+		}
+		result[h-hshift][0]=EFV[first][0]*EFV[second][1]*EFV[third][2];
+	}
+	return result*(1.0/PIStop);
+}
+
+function GUIPopulateModelMatrix (ModelMatrixName&, EFV)
+{
+	global globalVariable_AC=1;
+	global globalVariable_AT=1;
+	global globalVariable_CG=1;
+	global globalVariable_CT=1;
+	global globalVariable_GT=1;
+	
+	if (!ModelMatrixDimension)
+	{
+		ModelMatrixDimension = 64;
+		for (h = 0 ;h<64; h=h+1)
+		{
+			if (ModelGeneticCode[h]==10)
+			{
+				ModelMatrixDimension = ModelMatrixDimension-1;
+			}
+		}
+	}
+	
+	ModelMatrixName = {ModelMatrixDimension,ModelMatrixDimension}; 
+
+	hshift = 0;
+	
+	if (modelType == 0)
+	{
+		for (h=0; h<64; h=h+1)
+		{
+			if (ModelGeneticCode[h]==10) 
+			{
+				hshift = hshift+1;
+				continue; 
+			}
+			vshift = hshift;
+			for (v = h+1; v<64; v=v+1)
+			{
+				diff = v-h;
+				if (ModelGeneticCode[v]==10) 
+				{
+					vshift = vshift+1;
+					continue; 
+				}
+				nucPosInCodon = 2;
+				if ((h$4==v$4)||((diff%4==0)&&(h$16==v$16))||(diff%16==0))
+				{
+					if (h$4==v$4)
+					{
+						transition = v%4;
+						transition2= h%4;
+					}
+					else
+					{
+						if(diff%16==0)
+						{
+							transition = v$16;
+							transition2= h$16;
+							nucPosInCodon = 0;
+						}
+						else
+						{
+							transition = v%16$4;
+							transition2= h%16$4;
+							nucPosInCodon = 1;
+						}
+					}
+					if (transition<transition2)
+					{
+						trSM = transition;
+						trLG = transition2;
+					}
+					else
+					{
+						trSM = transition2;
+						trLG = transition;
+					}
+					
+					if (trSM==0)
+					{
+						if (trLG==1)
+						{
+							if (ModelGeneticCode[h]==ModelGeneticCode[v]) 
+							{
+								ModelMatrixName[h-hshift][v-vshift] := globalVariable_AC*synRate*EFV__[transition__][nucPosInCodon__];
+								ModelMatrixName[v-vshift][h-hshift] := globalVariable_AC*synRate*EFV__[transition2__][nucPosInCodon__];
+							}
+							else
+							{
+								ModelMatrixName[h-hshift][v-vshift] := globalVariable_AC*nonSynRate*EFV__[transition__][nucPosInCodon__];
+								ModelMatrixName[v-vshift][h-hshift] := globalVariable_AC*nonSynRate*EFV__[transition2__][nucPosInCodon__];
+							}
+						}
+						else
+						{
+							if (trLG==2)
+							{
+								if (ModelGeneticCode[h]==ModelGeneticCode[v]) 
+								{
+									ModelMatrixName[h-hshift][v-vshift] := synRate*EFV__[transition__][nucPosInCodon__];
+									ModelMatrixName[v-vshift][h-hshift] := synRate*EFV__[transition2__][nucPosInCodon__];
+								}
+								else
+								{
+									ModelMatrixName[h-hshift][v-vshift] := nonSynRate*EFV__[transition__][nucPosInCodon__];
+									ModelMatrixName[v-vshift][h-hshift] := nonSynRate*EFV__[transition2__][nucPosInCodon__];									
+								}							
+							}
+							else
+							{
+								if (ModelGeneticCode[h]==ModelGeneticCode[v]) 
+								{
+									ModelMatrixName[h-hshift][v-vshift] := globalVariable_AT*synRate*EFV__[transition__][nucPosInCodon__];
+									ModelMatrixName[v-vshift][h-hshift] := globalVariable_AT*synRate*EFV__[transition2__][nucPosInCodon__];
+								}
+								else
+								{
+									ModelMatrixName[h-hshift][v-vshift] := globalVariable_AT*nonSynRate*EFV__[transition__][nucPosInCodon__];
+									ModelMatrixName[v-vshift][h-hshift] := globalVariable_AT*nonSynRate*EFV__[transition2__][nucPosInCodon__];									
+								}							
+							}
+						}
+					}
+					else
+					{
+						if (trSM==1)
+						{
+							if (trLG==2)
+							{
+								if (ModelGeneticCode[h]==ModelGeneticCode[v]) 
+								{
+									ModelMatrixName[h-hshift][v-vshift] := globalVariable_CG*synRate*EFV__[transition__][nucPosInCodon__];
+									ModelMatrixName[v-vshift][h-hshift] := globalVariable_CG*synRate*EFV__[transition2__][nucPosInCodon__];
+								}
+								else
+								{
+									ModelMatrixName[h-hshift][v-vshift] := globalVariable_CG*nonSynRate*EFV__[transition__][nucPosInCodon__];
+									ModelMatrixName[v-vshift][h-hshift] := globalVariable_CG*nonSynRate*EFV__[transition2__][nucPosInCodon__];									
+								}
+							}
+							else
+							{
+								if (ModelGeneticCode[h]==ModelGeneticCode[v]) 
+								{
+									ModelMatrixName[h-hshift][v-vshift] := globalVariable_CT*synRate*EFV__[transition__][nucPosInCodon__];
+									ModelMatrixName[v-vshift][h-hshift] := globalVariable_CT*synRate*EFV__[transition2__][nucPosInCodon__];
+								}
+								else
+								{
+									ModelMatrixName[h-hshift][v-vshift] := globalVariable_CT*nonSynRate*EFV__[transition__][nucPosInCodon__];
+									ModelMatrixName[v-vshift][h-hshift] := globalVariable_CT*nonSynRate*EFV__[transition2__][nucPosInCodon__];
+								}							
+							}
+						}
+						else
+						{
+							if (ModelGeneticCode[h]==ModelGeneticCode[v]) 
+							{
+								ModelMatrixName[h-hshift][v-vshift] := globalVariable_GT*synRate*EFV__[transition__][nucPosInCodon__];
+								ModelMatrixName[v-vshift][h-hshift] := globalVariable_GT*synRate*EFV__[transition2__][nucPosInCodon__];
+							}
+							else
+							{
+								ModelMatrixName[h-hshift][v-vshift] := globalVariable_GT*nonSynRate*EFV__[transition__][nucPosInCodon__];
+								ModelMatrixName[v-vshift][h-hshift] := globalVariable_GT*nonSynRate*EFV__[transition2__][nucPosInCodon__];								
+							}							
+						}
+					}
+				}
+		    }
+	    }		
+	}
+	else
+	{
+		global  globalVariable_R  = 1.;
+		global shapeParameter_alpha = .5;
+		shapeParameter_alpha:>0.01;
+		shapeParameter_alpha:<100;
+		category     categoryVariable_alpha = 
+					(rateClassCount, EQUAL, MEAN, GammaDist(_x_,shapeParameter_alpha,shapeParameter_alpha), CGammaDist(_x_,shapeParameter_alpha,shapeParameter_alpha), 0 , 
+			  									  1e25,CGammaDist(_x_,shapeParameter_alpha+1,shapeParameter_alpha));
+
+
+
+		global shapeParameter_beta = .5;
+		shapeParameter_beta:>0.01;
+		shapeParameter_beta:<100;
+		
+		category     categoryVariable_beta = 
+					(rateClassCount, EQUAL, MEAN, GammaDist(_x_,shapeParameter_beta,shapeParameter_beta), CGammaDist(_x_,shapeParameter_beta,shapeParameter_beta), 0 , 
+			  									  1e25,CGammaDist(_x_,shapeParameter_beta+1,shapeParameter_beta));
+
+
+
+		executeMePlease = "";
+		for (mi=1; mi<rateClassCount; mi=mi+1)
+		{
+			executeMePlease = executeMePlease + "global shapeParameter_alpha_PS_" + mi + " = 1/" +  
+							  ((rateClassCount+1)-mi) + ";\nshapeParameter_alpha_PS_" + mi + ":<1;\n";
+		}
+
+		executeMePlease = executeMePlease + "\nglobal shapeParameter_alpha_RS_1=.3;shapeParameter_alpha_RS_1:<1;";
+
+		for (mi=3; mi<=rateClassCount; mi=mi+1)
+		{
+			executeMePlease = executeMePlease + "global shapeParameter_alpha_RS_" + mi + " = 1.5;" + "\nshapeParameter_alpha_RS_" + mi + ":>1;\n";
+		} 
+
+		rateStrMx    = {rateClassCount,1};
+		rateStrMx[0] = "shapeParameter_alpha_RS_1";
+		rateStrMx[1] = "1";
+
+		for (mi=3; mi<=rateClassCount; mi=mi+1)
+		{
+			rateStrMx[mi-1] = rateStrMx[mi-2]+"*shapeParameter_alpha_RS_"+mi;
+		} 	
+
+		freqStrMx    = {rateClassCount,1};
+		freqStrMx[0] = "shapeParameter_alpha_PS_1";
+
+		for (mi=1; mi<rateClassCount-1; mi=mi+1)
+		{
+			freqStrMx[mi] = "";
+			for (mi2=1;mi2<=mi;mi2=mi2+1)
+			{
+				freqStrMx[mi] = freqStrMx[mi]+"(1-shapeParameter_alpha_PS_"+mi2+")";		
+			}
+			freqStrMx[mi] = freqStrMx[mi]+"shapeParameter_alpha_PS_"+(mi+1);	
+		}	
+
+		freqStrMx[mi] = "";
+		for (mi2=1;mi2<mi;mi2=mi2+1)
+		{
+			freqStrMx[mi] = freqStrMx[mi]+"(1-shapeParameter_alpha_PS_"+mi2+")";		
+		}
+		freqStrMx[mi] = freqStrMx[mi]+"(1-shapeParameter_alpha_PS_"+mi+")";	
+
+		executeMePlease = executeMePlease + "\n\nglobal shapeParameter_alpha_Scale:="+rateStrMx[0]+"*"+freqStrMx[0];
+
+		for (mi=1; mi<rateClassCount; mi=mi+1)
+		{
+			executeMePlease = executeMePlease + "+" + rateStrMx[mi] + "*" + freqStrMx[mi];
+		}
+
+
+		executeMePlease = executeMePlease + ";\nshapeParameter_alpha_CFM={{" + freqStrMx[0];
+
+		for (mi=1; mi<rateClassCount; mi=mi+1)
+		{
+			executeMePlease = executeMePlease + "," + freqStrMx[mi];
+		}
+
+		executeMePlease = executeMePlease + "}};\nshapeParameter_alpha_CRM={{" + rateStrMx[0] + "/shapeParameter_alpha_Scale";
+
+		for (mi=1; mi<rateClassCount; mi=mi+1)
+		{
+			executeMePlease = executeMePlease +  "," + rateStrMx[mi] + "/shapeParameter_alpha_Scale";
+		}
+
+		executeMePlease = executeMePlease + "}};\n\ncategory categoryVariable_alpha   = (" + rateClassCount + ", shapeParameter_alpha_CFM , MEAN, ,shapeParameter_alpha_CRM, 0, 1e25);\n\n";
+
+		for (mi=1; mi<rateClassCount; mi=mi+1)
+		{
+			executeMePlease = executeMePlease + "global shapeParameter_beta_PS_" + mi + " = 1/" +  
+							  ((rateClassCount+1)-mi) + ";\nshapeParameter_beta_PS_" + mi + ":<1;\n";
+		}
+
+		executeMePlease = executeMePlease + "\nglobal shapeParameter_beta_RS_1=.3;shapeParameter_beta_RS_1:<1;";
+
+		for (mi=3; mi<=rateClassCount; mi=mi+1)
+		{
+			executeMePlease = executeMePlease + "global shapeParameter_beta_RS_" + mi + " = 1.5;" + "\nshapeParameter_beta_RS_" + mi + ":>1;\n";
+		} 
+
+		rateStrMx    = {rateClassCount,1};
+		rateStrMx[0] = "shapeParameter_beta_RS_1";
+		rateStrMx[1] = "1";
+
+		for (mi=3; mi<=rateClassCount; mi=mi+1)
+		{
+			rateStrMx[mi-1] = rateStrMx[mi-2]+"*shapeParameter_beta_RS_"+mi;
+		} 	
+
+		freqStrMx    = {rateClassCount,1};
+		freqStrMx[0] = "shapeParameter_beta_PS_1";
+
+		for (mi=1; mi<rateClassCount-1; mi=mi+1)
+		{
+			freqStrMx[mi] = "";
+			for (mi2=1;mi2<=mi;mi2=mi2+1)
+			{
+				freqStrMx[mi] = freqStrMx[mi]+"(1-shapeParameter_beta_PS_"+mi2+")";		
+			}
+			freqStrMx[mi] = freqStrMx[mi]+"shapeParameter_beta_PS_"+(mi+1);	
+		}	
+
+		freqStrMx[mi] = "";
+		for (mi2=1;mi2<mi;mi2=mi2+1)
+		{
+			freqStrMx[mi] = freqStrMx[mi]+"(1-shapeParameter_beta_PS_"+mi2+")";		
+		}
+		freqStrMx[mi] = freqStrMx[mi]+"(1-shapeParameter_beta_PS_"+mi+")";	
+
+		executeMePlease = executeMePlease + "\n\nglobal shapeParameter_beta_Scale:="+rateStrMx[0]+"*"+freqStrMx[0];
+
+		for (mi=1; mi<rateClassCount; mi=mi+1)
+		{
+			executeMePlease = executeMePlease + "+" + rateStrMx[mi] + "*" + freqStrMx[mi];
+		}
+
+
+		executeMePlease = executeMePlease + ";\nshapeParameter_beta_CFM={{" + freqStrMx[0];
+
+		for (mi=1; mi<rateClassCount; mi=mi+1)
+		{
+			executeMePlease = executeMePlease + "," + freqStrMx[mi];
+		}
+
+		executeMePlease = executeMePlease + "}};\nshapeParameter_beta_CRM={{" + rateStrMx[0] + "/shapeParameter_beta_Scale";
+
+		for (mi=1; mi<rateClassCount; mi=mi+1)
+		{
+			executeMePlease = executeMePlease +  "," + rateStrMx[mi] + "/shapeParameter_beta_Scale";
+		}
+
+		executeMePlease = executeMePlease + "}};\n\ncategory categoryVariable_beta   = (" + rateClassCount + ", shapeParameter_beta_CFM , MEAN, ,shapeParameter_beta_CRM, 0, 1e25);\n\n";
+		ExecuteCommands (executeMePlease);
+		executeMePlease = "";
+
+		for (h=0; h<64; h=h+1)
+		{
+			if (ModelGeneticCode[h]==10) 
+			{
+				hshift = hshift+1;
+				continue; 
+			}
+			vshift = hshift;
+			for (v = h+1; v<64; v=v+1)
+			{
+				diff = v-h;
+				if (ModelGeneticCode[v]==10) 
+				{
+					vshift = vshift+1;
+					continue; 
+				}
+				nucPosInCodon = 2;
+				if ((h$4==v$4)||((diff%4==0)&&(h$16==v$16))||(diff%16==0))
+				{
+					if (h$4==v$4)
+					{
+						transition = v%4;
+						transition2= h%4;
+					}
+					else
+					{
+						if(diff%16==0)
+						{
+							transition = v$16;
+							transition2= h$16;
+							nucPosInCodon = 0;
+						}
+						else
+						{
+							transition = v%16$4;
+							transition2= h%16$4;
+							nucPosInCodon = 1;
+						}
+					}
+					if (transition<transition2)
+					{
+						trSM = transition;
+						trLG = transition2;
+					}
+					else
+					{
+						trSM = transition2;
+						trLG = transition;
+					}
+					
+					if (trSM==0)
+					{
+						if (trLG==1)
+						{
+							if (ModelGeneticCode[h]==ModelGeneticCode[v]) 
+							{
+								ModelMatrixName[h-hshift][v-vshift] := globalVariable_AC*synRate*categoryVariable_alpha*EFV__[transition__][nucPosInCodon__];
+								ModelMatrixName[v-vshift][h-hshift] := globalVariable_AC*synRate*categoryVariable_alpha*EFV__[transition2__][nucPosInCodon__];
+							}
+							else
+							{
+								ModelMatrixName[h-hshift][v-vshift] := globalVariable_AC*globalVariable_R*synRate*categoryVariable_beta*EFV__[transition__][nucPosInCodon__];
+								ModelMatrixName[v-vshift][h-hshift] := globalVariable_AC*globalVariable_R*synRate*categoryVariable_beta*EFV__[transition2__][nucPosInCodon__];
+							}
+						}
+						else
+						{
+							if (trLG==2)
+							{
+								if (ModelGeneticCode[h]==ModelGeneticCode[v]) 
+								{
+									ModelMatrixName[h-hshift][v-vshift] := synRate*categoryVariable_alpha*EFV__[transition__][nucPosInCodon__];
+									ModelMatrixName[v-vshift][h-hshift] := synRate*categoryVariable_alpha*EFV__[transition2__][nucPosInCodon__];
+								}
+								else
+								{
+									ModelMatrixName[h-hshift][v-vshift] := globalVariable_R*synRate*categoryVariable_beta*EFV__[transition__][nucPosInCodon__];
+									ModelMatrixName[v-vshift][h-hshift] := globalVariable_R*synRate*categoryVariable_beta*EFV__[transition2__][nucPosInCodon__];
+								}							
+							}
+							else
+							{
+								if (ModelGeneticCode[h]==ModelGeneticCode[v]) 
+								{
+									ModelMatrixName[h-hshift][v-vshift] := globalVariable_AT*synRate*categoryVariable_alpha*EFV__[transition__][nucPosInCodon__];
+									ModelMatrixName[v-vshift][h-hshift] := globalVariable_AT*synRate*categoryVariable_alpha*EFV__[transition2__][nucPosInCodon__];
+								}
+								else
+								{
+									ModelMatrixName[h-hshift][v-vshift] := globalVariable_AT*globalVariable_R*synRate*categoryVariable_beta*EFV__[transition__][nucPosInCodon__];
+									ModelMatrixName[v-vshift][h-hshift] := globalVariable_AT*globalVariable_R*synRate*categoryVariable_beta*EFV__[transition2__][nucPosInCodon__];
+								}							
+							}
+						}
+					}
+					else
+					{
+						if (trSM==1)
+						{
+							if (trLG==2)
+							{
+								if (ModelGeneticCode[h]==ModelGeneticCode[v]) 
+								{
+									ModelMatrixName[h-hshift][v-vshift] := globalVariable_CG*synRate*categoryVariable_alpha*EFV__[transition__][nucPosInCodon__];
+									ModelMatrixName[v-vshift][h-hshift] := globalVariable_CG*synRate*categoryVariable_alpha*EFV__[transition2__][nucPosInCodon__];
+								}
+								else
+								{
+									ModelMatrixName[h-hshift][v-vshift] := globalVariable_CG*globalVariable_R*synRate*categoryVariable_beta*EFV__[transition__][nucPosInCodon__];
+									ModelMatrixName[v-vshift][h-hshift] := globalVariable_CG*globalVariable_R*synRate*categoryVariable_beta*EFV__[transition2__][nucPosInCodon__];
+								}
+							}
+							else
+							{
+								if (ModelGeneticCode[h]==ModelGeneticCode[v]) 
+								{
+									ModelMatrixName[h-hshift][v-vshift] := globalVariable_CT*synRate*categoryVariable_alpha*EFV__[transition__][nucPosInCodon__];
+									ModelMatrixName[v-vshift][h-hshift] := globalVariable_CT*synRate*categoryVariable_alpha*EFV__[transition2__][nucPosInCodon__];
+								}
+								else
+								{
+									ModelMatrixName[h-hshift][v-vshift] := globalVariable_CT*globalVariable_R*synRate*categoryVariable_beta*EFV__[transition__][nucPosInCodon__];
+									ModelMatrixName[v-vshift][h-hshift] := globalVariable_CT*globalVariable_R*synRate*categoryVariable_beta*EFV__[transition2__][nucPosInCodon__];									
+								}							
+							}
+						}
+						else
+						{
+							if (ModelGeneticCode[h]==ModelGeneticCode[v]) 
+							{
+								ModelMatrixName[h-hshift][v-vshift] := globalVariable_GT*synRate*categoryVariable_alpha*EFV__[transition__][nucPosInCodon__];
+								ModelMatrixName[v-vshift][h-hshift] := globalVariable_GT*synRate*categoryVariable_alpha*EFV__[transition2__][nucPosInCodon__];
+							}
+							else
+							{
+								ModelMatrixName[h-hshift][v-vshift] := globalVariable_GT*globalVariable_R*synRate*categoryVariable_beta*EFV__[transition__][nucPosInCodon__];
+								ModelMatrixName[v-vshift][h-hshift] := globalVariable_GT*globalVariable_R*synRate*categoryVariable_beta*EFV__[transition2__][nucPosInCodon__];
+							}							
+						}
+					}
+				}
+		    }
+	     }	
+	  }
+	  return 0;
+}
diff --git a/res/SubstitutionModels/Codon/MG94xTN93_3x4.mdl b/res/SubstitutionModels/Codon/MG94xTN93_3x4.mdl
new file mode 100644
index 0000000..fdc17e5
--- /dev/null
+++ b/res/SubstitutionModels/Codon/MG94xTN93_3x4.mdl
@@ -0,0 +1,413 @@
+Model_Name  		= "MG94xTN93_3x4";
+Model_Options 		= 3;
+Model_Dimension 	= 64;
+Model_EFV_Type		= "Observed Nuc 9 params.";
+
+function GUIBuildCodonFrequencies (EFV)
+{
+	PIStop = 1.0;
+	result = {ModelMatrixDimension,1};
+	hshift = 0;
+	
+	for (h=0; h<64; h=h+1)
+	{
+		first = h$16;
+		second = h%16$4;
+		third = h%4;
+		if (ModelGeneticCode[h]==10) 
+		{
+			hshift = hshift+1;
+			PIStop = PIStop-EFV[first][0]*EFV[second][1]*EFV[third][2];
+			continue; 
+		}
+		result[h-hshift][0]=EFV[first][0]*EFV[second][1]*EFV[third][2];
+	}
+	return result*(1.0/PIStop);
+}
+
+function GUIPopulateModelMatrix (ModelMatrixName&, EFV)
+{
+	global globalVariable_AC;
+	global globalVariable_CT;
+	global globalVariable_R;
+
+	
+	if (!ModelMatrixDimension)
+	{
+		ModelMatrixDimension = 64;
+		for (h = 0 ;h<64; h=h+1)
+		{
+			if (ModelGeneticCode[h]==10)
+			{
+				ModelMatrixDimension = ModelMatrixDimension-1;
+			}
+		}
+	}
+	
+	ModelMatrixName = {ModelMatrixDimension,ModelMatrixDimension}; 
+
+	hshift = 0;
+
+	if (modelType < 2)
+	{
+		for (h=0; h<64; h=h+1)
+		{
+			if (ModelGeneticCode[h]==10) 
+			{
+				hshift = hshift+1;
+				continue; 
+			}
+			vshift = hshift;
+			for (v = h+1; v<64; v=v+1)
+			{
+				diff = v-h;
+				if (ModelGeneticCode[v]==10) 
+				{
+					vshift = vshift+1;
+					continue; 
+				}
+				nucPosInCodon = 2;
+				if ((h$4==v$4)||((diff%4==0)&&(h$16==v$16))||(diff%16==0))
+				{
+					if (h$4==v$4)
+					{
+						transition = v%4;
+						transition2= h%4;
+					}
+					else
+					{
+						if(diff%16==0)
+						{
+							transition = v$16;
+							transition2= h$16;
+							nucPosInCodon = 0;
+						}
+						else
+						{
+							transition = v%16$4;
+							transition2= h%16$4;
+							nucPosInCodon = 1;
+						}
+					}
+					if (transition<transition2)
+					{
+						trSM = transition;
+						trLG = transition2;
+					}
+					else
+					{
+						trSM = transition2;
+						trLG = transition;
+					}
+					
+					if (trSM==0)
+					{
+						if (trLG==1)
+						{
+							if (ModelGeneticCode[h]==ModelGeneticCode[v]) 
+							{
+								ModelMatrixName[h-hshift][v-vshift] := globalVariable_AC*synRate*EFV__[transition__][nucPosInCodon__];
+								ModelMatrixName[v-vshift][h-hshift] := globalVariable_AC*synRate*EFV__[transition2__][nucPosInCodon__];
+							}
+							else
+							{
+								if (modelType)
+								{
+									ModelMatrixName[h-hshift][v-vshift] := globalVariable_AC*globalVariable_R*synRate*EFV__[transition__][nucPosInCodon__];
+									ModelMatrixName[v-vshift][h-hshift] := globalVariable_AC*globalVariable_R*synRate*EFV__[transition2__][nucPosInCodon__];
+								}
+								else
+								{
+									ModelMatrixName[h-hshift][v-vshift] := globalVariable_AC*nonSynRate*EFV__[transition__][nucPosInCodon__];
+									ModelMatrixName[v-vshift][h-hshift] := globalVariable_AC*nonSynRate*EFV__[transition2__][nucPosInCodon__];
+								}
+							}
+						}
+						else
+						{
+							if (trLG==2)
+							{
+								if (ModelGeneticCode[h]==ModelGeneticCode[v]) 
+								{
+									ModelMatrixName[h-hshift][v-vshift] := synRate*EFV__[transition__][nucPosInCodon__];
+									ModelMatrixName[v-vshift][h-hshift] := synRate*EFV__[transition2__][nucPosInCodon__];
+								}
+								else
+								{
+									if (modelType)
+									{
+										ModelMatrixName[h-hshift][v-vshift] := globalVariable_R*synRate*EFV__[transition__][nucPosInCodon__];
+										ModelMatrixName[v-vshift][h-hshift] := globalVariable_R*synRate*EFV__[transition2__][nucPosInCodon__];
+									}
+									else
+									{
+										ModelMatrixName[h-hshift][v-vshift] := nonSynRate*EFV__[transition__][nucPosInCodon__];
+										ModelMatrixName[v-vshift][h-hshift] := nonSynRate*EFV__[transition2__][nucPosInCodon__];									
+									}
+								}							
+							}
+							else
+							{
+								if (ModelGeneticCode[h]==ModelGeneticCode[v]) 
+								{
+									ModelMatrixName[h-hshift][v-vshift] := globalVariable_AC*synRate*EFV__[transition__][nucPosInCodon__];
+									ModelMatrixName[v-vshift][h-hshift] := globalVariable_AC*synRate*EFV__[transition2__][nucPosInCodon__];
+								}
+								else
+								{
+									if (modelType)
+									{
+										ModelMatrixName[h-hshift][v-vshift] := globalVariable_AC*globalVariable_R*synRate*EFV__[transition__][nucPosInCodon__];
+										ModelMatrixName[v-vshift][h-hshift] := globalVariable_AC*globalVariable_R*synRate*EFV__[transition2__][nucPosInCodon__];
+									}
+									else
+									{
+										ModelMatrixName[h-hshift][v-vshift] := globalVariable_AC*nonSynRate*EFV__[transition__][nucPosInCodon__];
+										ModelMatrixName[v-vshift][h-hshift] := globalVariable_AC*nonSynRate*EFV__[transition2__][nucPosInCodon__];									
+									}
+								}							
+							}
+						}
+					}
+					else
+					{
+						if (trSM==1)
+						{
+							if (trLG==2)
+							{
+								if (ModelGeneticCode[h]==ModelGeneticCode[v]) 
+								{
+									ModelMatrixName[h-hshift][v-vshift] := globalVariable_AC*synRate*EFV__[transition__][nucPosInCodon__];
+									ModelMatrixName[v-vshift][h-hshift] := globalVariable_AC*synRate*EFV__[transition2__][nucPosInCodon__];
+								}
+								else
+								{
+									if (modelType)
+									{
+										ModelMatrixName[h-hshift][v-vshift] := globalVariable_AC*globalVariable_R*synRate*EFV__[transition__][nucPosInCodon__];
+										ModelMatrixName[v-vshift][h-hshift] := globalVariable_AC*globalVariable_R*synRate*EFV__[transition2__][nucPosInCodon__];
+									}
+									else
+									{
+										ModelMatrixName[h-hshift][v-vshift] := globalVariable_AC*nonSynRate*EFV__[transition__][nucPosInCodon__];
+										ModelMatrixName[v-vshift][h-hshift] := globalVariable_AC*nonSynRate*EFV__[transition2__][nucPosInCodon__];									
+									}
+								}
+							}
+							else
+							{
+								if (ModelGeneticCode[h]==ModelGeneticCode[v]) 
+								{
+									ModelMatrixName[h-hshift][v-vshift] := globalVariable_CT*synRate*EFV__[transition__][nucPosInCodon__];
+									ModelMatrixName[v-vshift][h-hshift] := globalVariable_CT*synRate*EFV__[transition2__][nucPosInCodon__];
+								}
+								else
+								{
+									if (modelType)
+									{
+										ModelMatrixName[h-hshift][v-vshift] := globalVariable_CT*globalVariable_R*synRate*EFV__[transition__][nucPosInCodon__];
+										ModelMatrixName[v-vshift][h-hshift] := globalVariable_CT*globalVariable_R*synRate*EFV__[transition2__][nucPosInCodon__];
+									}
+									else
+									{
+										ModelMatrixName[h-hshift][v-vshift] := globalVariable_CT*nonSynRate*EFV__[transition__][nucPosInCodon__];
+										ModelMatrixName[v-vshift][h-hshift] := globalVariable_CT*nonSynRate*EFV__[transition2__][nucPosInCodon__];
+									}
+									
+								}							
+							}
+						}
+						else
+						{
+							if (ModelGeneticCode[h]==ModelGeneticCode[v]) 
+							{
+								ModelMatrixName[h-hshift][v-vshift] := globalVariable_AC*synRate*EFV__[transition__][nucPosInCodon__];
+								ModelMatrixName[v-vshift][h-hshift] := globalVariable_AC*synRate*EFV__[transition2__][nucPosInCodon__];
+							}
+							else
+							{
+								if (modelType)
+								{
+									ModelMatrixName[h-hshift][v-vshift] := globalVariable_AC*globalVariable_R*synRate*EFV__[transition__][nucPosInCodon__];
+									ModelMatrixName[v-vshift][h-hshift] := globalVariable_AC*globalVariable_R*synRate*EFV__[transition2__][nucPosInCodon__];
+								}
+								else
+								{
+									ModelMatrixName[h-hshift][v-vshift] := globalVariable_AC*nonSynRate*EFV__[transition__][nucPosInCodon__];
+									ModelMatrixName[v-vshift][h-hshift] := globalVariable_AC*nonSynRate*EFV__[transition2__][nucPosInCodon__];								
+								}
+							}							
+						}
+					}
+				}
+		    }
+	    }		
+	}		
+	else
+	{
+		global shapeParameter_betaP = 1;
+		global shapeParameter_betaQ = 1;
+		shapeParameter_betaP:>0.05;shapeParameter_betaP:<85;
+		shapeParameter_betaQ:>0.05;shapeParameter_betaQ:<85;
+		category categoryVariable_Beta = (rateClassCount-1, EQUAL, MEAN, 
+						_x_^(shapeParameter_betaP-1)*(1-_x_)^(shapeParameter_betaQ-1)/Beta(shapeParameter_betaP,shapeParameter_betaQ), /* density */
+						IBeta(_x_,shapeParameter_betaP,shapeParameter_betaQ), /*CDF*/
+						0, 				   /*left bound*/
+						1, 			   /*right bound*/
+						IBeta(_x_,shapeParameter_betaP+1,shapeParameter_betaQ)*shapeParameter_betaP/(shapeParameter_betaP+shapeParameter_betaQ)
+		);
+
+		global shapeParameter = .5;
+		shapeParameter:>0.01;
+		shapeParameter:<100;
+		category     categoryVariable = 
+					(rateClassCount, categoryVariable_Beta, MEAN, GammaDist(_x_,shapeParameter,shapeParameter), CGammaDist(_x_,shapeParameter,shapeParameter), 0 , 
+			  									  1e25,CGammaDist(_x_,shapeParameter+1,shapeParameter));
+
+		for (h=0; h<64; h=h+1)
+		{
+			if (ModelGeneticCode[h]==10) 
+			{
+				hshift = hshift+1;
+				continue; 
+			}
+			vshift = hshift;
+			for (v = h+1; v<64; v=v+1)
+			{
+				diff = v-h;
+				if (ModelGeneticCode[v]==10) 
+				{
+					vshift = vshift+1;
+					continue; 
+				}
+				nucPosInCodon = 2;
+				if ((h$4==v$4)||((diff%4==0)&&(h$16==v$16))||(diff%16==0))
+				{
+					if (h$4==v$4)
+					{
+						transition = v%4;
+						transition2= h%4;
+					}
+					else
+					{
+						if(diff%16==0)
+						{
+							transition = v$16;
+							transition2= h$16;
+							nucPosInCodon = 0;
+						}
+						else
+						{
+							transition = v%16$4;
+							transition2= h%16$4;
+							nucPosInCodon = 1;
+						}
+					}
+					if (transition<transition2)
+					{
+						trSM = transition;
+						trLG = transition2;
+					}
+					else
+					{
+						trSM = transition2;
+						trLG = transition;
+					}
+					
+					if (trSM==0)
+					{
+						if (trLG==1)
+						{
+							if (ModelGeneticCode[h]==ModelGeneticCode[v]) 
+							{
+								ModelMatrixName[h-hshift][v-vshift] := categoryVariable*globalVariable_AC*synRate*EFV__[transition__][nucPosInCodon__];
+								ModelMatrixName[v-vshift][h-hshift] := categoryVariable*globalVariable_AC*synRate*EFV__[transition2__][nucPosInCodon__];
+							}
+							else
+							{
+								ModelMatrixName[h-hshift][v-vshift] := categoryVariable*globalVariable_AC*globalVariable_R*synRate*EFV__[transition__][nucPosInCodon__];
+								ModelMatrixName[v-vshift][h-hshift] := categoryVariable*globalVariable_AC*globalVariable_R*synRate*EFV__[transition2__][nucPosInCodon__];
+							}
+						}
+						else
+						{
+							if (trLG==2)
+							{
+								if (ModelGeneticCode[h]==ModelGeneticCode[v]) 
+								{
+									ModelMatrixName[h-hshift][v-vshift] := synRate*EFV__[transition__][nucPosInCodon__];
+									ModelMatrixName[v-vshift][h-hshift] := synRate*EFV__[transition2__][nucPosInCodon__];
+								}
+								else
+								{
+									ModelMatrixName[h-hshift][v-vshift] := categoryVariable*globalVariable_R*synRate*EFV__[transition__][nucPosInCodon__];
+									ModelMatrixName[v-vshift][h-hshift] := categoryVariable*globalVariable_R*synRate*EFV__[transition2__][nucPosInCodon__];
+								}							
+							}
+							else
+							{
+								if (ModelGeneticCode[h]==ModelGeneticCode[v]) 
+								{
+									ModelMatrixName[h-hshift][v-vshift] := globalVariable_AC*synRate*EFV__[transition__][nucPosInCodon__];
+									ModelMatrixName[v-vshift][h-hshift] := globalVariable_AC*synRate*EFV__[transition2__][nucPosInCodon__];
+								}
+								else
+								{
+									ModelMatrixName[h-hshift][v-vshift] := categoryVariable*globalVariable_AC*globalVariable_R*synRate*EFV__[transition__][nucPosInCodon__];
+									ModelMatrixName[v-vshift][h-hshift] := categoryVariable*globalVariable_AC*globalVariable_R*synRate*EFV__[transition2__][nucPosInCodon__];
+								}							
+							}
+						}
+					}
+					else
+					{
+						if (trSM==1)
+						{
+							if (trLG==2)
+							{
+								if (ModelGeneticCode[h]==ModelGeneticCode[v]) 
+								{
+									ModelMatrixName[h-hshift][v-vshift] := globalVariable_AC*synRate*EFV__[transition__][nucPosInCodon__];
+									ModelMatrixName[v-vshift][h-hshift] := globalVariable_AC*synRate*EFV__[transition2__][nucPosInCodon__];
+								}
+								else
+								{
+									ModelMatrixName[h-hshift][v-vshift] := categoryVariable*globalVariable_AC*globalVariable_R*synRate*EFV__[transition__][nucPosInCodon__];
+									ModelMatrixName[v-vshift][h-hshift] := categoryVariable*globalVariable_AC*globalVariable_R*synRate*EFV__[transition2__][nucPosInCodon__];
+								}
+							}
+							else
+							{
+								if (ModelGeneticCode[h]==ModelGeneticCode[v]) 
+								{
+									ModelMatrixName[h-hshift][v-vshift] := globalVariable_CT*synRate*EFV__[transition__][nucPosInCodon__];
+									ModelMatrixName[v-vshift][h-hshift] := globalVariable_CT*synRate*EFV__[transition2__][nucPosInCodon__];
+								}
+								else
+								{
+									ModelMatrixName[h-hshift][v-vshift] := categoryVariable*globalVariable_CT*globalVariable_R*synRate*EFV__[transition__][nucPosInCodon__];
+									ModelMatrixName[v-vshift][h-hshift] := categoryVariable*globalVariable_CT*globalVariable_R*synRate*EFV__[transition2__][nucPosInCodon__];
+								}							
+							}
+						}
+						else
+						{
+							if (ModelGeneticCode[h]==ModelGeneticCode[v]) 
+							{
+								ModelMatrixName[h-hshift][v-vshift] := globalVariable_AC*synRate*EFV__[transition__][nucPosInCodon__];
+								ModelMatrixName[v-vshift][h-hshift] := globalVariable_AC*synRate*EFV__[transition2__][nucPosInCodon__];
+							}
+							else
+							{
+								ModelMatrixName[h-hshift][v-vshift] := categoryVariable*globalVariable_AC*globalVariable_R*synRate*EFV__[transition__][nucPosInCodon__];
+								ModelMatrixName[v-vshift][h-hshift] := categoryVariable*globalVariable_AC*globalVariable_R*synRate*EFV__[transition2__][nucPosInCodon__];
+							}							
+						}
+					}
+				}
+		    }
+	    }	
+	}
+	
+	return 0;
+}
diff --git a/res/SubstitutionModels/Nucleotide/EFVEstimated.ibf b/res/SubstitutionModels/Nucleotide/EFVEstimated.ibf
new file mode 100644
index 0000000..7e26778
--- /dev/null
+++ b/res/SubstitutionModels/Nucleotide/EFVEstimated.ibf
@@ -0,0 +1,27 @@
+/*-------------------------------------------------------------------------------*/
+
+function	EFVEstimated	(EFVector&, EFVApproximations)
+{
+	global frequencyVariableA;
+	global frequencyVariableC;
+	global frequencyVariableG;
+	global frequencyVariableT;
+	global frequencyVariableSum;
+
+	frequencyVariableA:<1;
+	frequencyVariableC:<1;
+	frequencyVariableG:<1;
+	frequencyVariableT	 :=	Abs(1-frequencyVariableA-frequencyVariableC-frequencyVariableG);
+	frequencyVariableSum := frequencyVariableA+frequencyVariableC+frequencyVariableG+frequencyVariableT;
+
+	frequencyVariableA = EFVApproximations[0];
+	frequencyVariableC = EFVApproximations[1];
+	frequencyVariableG = EFVApproximations[2];
+
+	EFVector = {{frequencyVariableA/frequencyVariableSum},
+				{frequencyVariableC/frequencyVariableSum},
+				{frequencyVariableG/frequencyVariableSum},
+				{frequencyVariableT/frequencyVariableSum}};
+				
+	return	1;
+}
diff --git a/res/SubstitutionModels/Nucleotide/F81.mdl b/res/SubstitutionModels/Nucleotide/F81.mdl
new file mode 100644
index 0000000..f8a9868
--- /dev/null
+++ b/res/SubstitutionModels/Nucleotide/F81.mdl
@@ -0,0 +1,59 @@
+Model_Name  		= "F81";
+Model_Options 		= 6;
+Model_Dimension 	= 4;
+Model_EFV_Type		= "Observed In Partition";
+
+/*-------------------------------------------------------------------------------*/
+
+function GUIPopulateModelMatrix (ModelMatrixName&, EFV)
+{
+	if (modelType == 0)
+	{
+		ModelMatrixName = {{*,a,a,a}
+						   {a,*,a,a}
+						   {a,a,*,a}
+						   {a,a,a,*}};
+	}
+	else
+	{
+		global shapeParameter = .5;
+		shapeParameter:>0.01;shapeParameter:<100;
+		category     categoryVariable = 
+					(rateClassCount, EQUAL, MEAN, GammaDist(_x_,shapeParameter,shapeParameter), CGammaDist(_x_,shapeParameter,shapeParameter), 0 , 
+			  							1e25,CGammaDist(_x_,shapeParameter+1,shapeParameter));
+			  							
+		ModelMatrixName = {{*,a*categoryVariable,a*categoryVariable,a*categoryVariable}
+						   {a*categoryVariable,*,a*categoryVariable,a*categoryVariable}
+						   {a*categoryVariable,a*categoryVariable,*,a*categoryVariable}
+						   {a*categoryVariable,a*categoryVariable,a*categoryVariable,*}};
+	}
+	return 1;
+}
+
+/*-------------------------------------------------------------------------------*/
+
+function	EFVEstimated	(EFVector&, EFVApproximations)
+{
+	global frequencyVariableA;
+	global frequencyVariableC;
+	global frequencyVariableG;
+	global frequencyVariableT;
+	global frequencyVariableSum;
+
+	frequencyVariableA:<1;
+	frequencyVariableC:<1;
+	frequencyVariableG:<1;
+	frequencyVariableT	 :=	Abs(1-frequencyVariableA-frequencyVariableC-frequencyVariableG);
+	frequencyVariableSum := frequencyVariableA+frequencyVariableC+frequencyVariableG+frequencyVariableT;
+
+	frequencyVariableA = EFVApproximations[0];
+	frequencyVariableC = EFVApproximations[1];
+	frequencyVariableG = EFVApproximations[2];
+
+	EFVector = {{frequencyVariableA/frequencyVariableSum},
+				{frequencyVariableC/frequencyVariableSum},
+				{frequencyVariableG/frequencyVariableSum},
+				{frequencyVariableT/frequencyVariableSum}};
+				
+	return	1;
+}
diff --git a/res/SubstitutionModels/Nucleotide/HKY85.mdl b/res/SubstitutionModels/Nucleotide/HKY85.mdl
new file mode 100644
index 0000000..515807a
--- /dev/null
+++ b/res/SubstitutionModels/Nucleotide/HKY85.mdl
@@ -0,0 +1,72 @@
+Model_Name  		= "HKY85";
+Model_Options 		= 7;
+Model_Dimension 	= 4;
+Model_EFV_Type		= "Observed In Partition";
+
+function GUIPopulateModelMatrix (ModelMatrixName&, EFV)
+{
+	if (modelType == 0)
+	/* local */
+	{
+		ModelMatrixName = {{*,trsv,trst,trsv}
+						   {trsv,*,trsv,trst}
+						   {trst,trsv,*,trsv}
+						   {trsv,trst,trsv,*}};
+	}
+	else
+	{
+		global			globalVariable_TVTS = 1;
+		if (modelType == 1)
+		/* global */
+		{
+			
+			ModelMatrixName = {{*,t*globalVariable_TVTS,t,t*globalVariable_TVTS}
+							   {t*globalVariable_TVTS,*,t*globalVariable_TVTS,t}
+							   {t,t*globalVariable_TVTS,*,t*globalVariable_TVTS}
+							   {t*globalVariable_TVTS,t,t*globalVariable_TVTS,*}};
+		}
+		else
+		/* global + gamma */
+		{
+			global shapeParameter = .5;
+			shapeParameter:>0.01;shapeParameter:<100;
+			category     categoryVariable = 
+						(rateClassCount, EQUAL, MEAN, GammaDist(_x_,shapeParameter,shapeParameter), CGammaDist(_x_,shapeParameter,shapeParameter), 0 , 
+				  							1e25,CGammaDist(_x_,shapeParameter+1,shapeParameter));
+				  							
+			ModelMatrixName = {{*,t*globalVariable_TVTS*categoryVariable,t*categoryVariable,t*globalVariable_TVTS*categoryVariable}
+							   {t*globalVariable_TVTS*categoryVariable,*,t*globalVariable_TVTS*categoryVariable,t*categoryVariable}
+							   {t*categoryVariable,t*globalVariable_TVTS*categoryVariable,*,t*globalVariable_TVTS*categoryVariable}
+							   {t*globalVariable_TVTS*categoryVariable,t*categoryVariable,t*globalVariable_TVTS*categoryVariable,*}};
+		}
+	}
+	return 1;
+}
+
+/*-------------------------------------------------------------------------------*/
+
+function	EFVEstimated	(EFVector&, EFVApproximations)
+{
+	global frequencyVariableA;
+	global frequencyVariableC;
+	global frequencyVariableG;
+	global frequencyVariableT;
+	global frequencyVariableSum;
+
+	frequencyVariableA:<1;
+	frequencyVariableC:<1;
+	frequencyVariableG:<1;
+	frequencyVariableT	 :=	Abs(1-frequencyVariableA-frequencyVariableC-frequencyVariableG);
+	frequencyVariableSum := frequencyVariableA+frequencyVariableC+frequencyVariableG+frequencyVariableT;
+
+	frequencyVariableA = EFVApproximations[0];
+	frequencyVariableC = EFVApproximations[1];
+	frequencyVariableG = EFVApproximations[2];
+
+	EFVector = {{frequencyVariableA/frequencyVariableSum},
+				{frequencyVariableC/frequencyVariableSum},
+				{frequencyVariableG/frequencyVariableSum},
+				{frequencyVariableT/frequencyVariableSum}};
+				
+	return	1;
+}
diff --git a/res/SubstitutionModels/Nucleotide/REV.mdl b/res/SubstitutionModels/Nucleotide/REV.mdl
new file mode 100644
index 0000000..4770949
--- /dev/null
+++ b/res/SubstitutionModels/Nucleotide/REV.mdl
@@ -0,0 +1,74 @@
+Model_Name  		= "REV";
+Model_Options 		= 7;
+Model_Dimension 	= 4;
+Model_EFV_Type		= "Observed In Partition";
+
+function GUIPopulateModelMatrix (ModelMatrixName&, EFV)
+{
+	if (modelType == 0)
+	{
+		ModelMatrixName = {{*,a,b,c}
+						   {a,*,d,e}
+						   {b,d,*,f}
+						   {c,e,f,*}};
+	}
+	else
+	{
+		global			globalVariableAC;
+		global			globalVariableAT;
+		global			globalVariableCG;
+		global			globalVariableCT;
+		global			globalVariableGT;
+		
+		if (modelType<2)
+		{
+	
+			ModelMatrixName = {{*,globalVariableAC*mu,mu,globalVariableAT*mu}
+							   {globalVariableAC*mu,*,globalVariableCG*mu,globalVariableCT*mu}
+							   {mu,globalVariableCG*mu,*,globalVariableGT*mu}
+							   {globalVariableAT*mu,globalVariableCT*mu,globalVariableGT*mu,*}};
+		}
+		else
+		{
+			global shapeParameter = .5;
+			shapeParameter:>0.01;shapeParameter:<100;
+			category     categoryVariable = 
+						(rateClassCount, EQUAL, MEAN, GammaDist(_x_,shapeParameter,shapeParameter), CGammaDist(_x_,shapeParameter,shapeParameter), 0 , 
+				  							1e25,CGammaDist(_x_,shapeParameter+1,shapeParameter));
+
+			ModelMatrixName = {{*,globalVariableAC*mu*categoryVariable,mu*categoryVariable,globalVariableAT*mu*categoryVariable}
+							   {globalVariableAC*mu*categoryVariable,*,globalVariableCG*mu*categoryVariable,globalVariableCT*mu*categoryVariable}
+							   {mu*categoryVariable,globalVariableCG*mu*categoryVariable,*,globalVariableGT*mu*categoryVariable}
+							   {globalVariableAT*mu*categoryVariable,globalVariableCT*mu*categoryVariable,globalVariableGT*mu*categoryVariable,*}};
+		}
+	}
+	return 1;
+}
+
+/*-------------------------------------------------------------------------------*/
+
+function	EFVEstimated	(EFVector&, EFVApproximations)
+{
+	global frequencyVariableA;
+	global frequencyVariableC;
+	global frequencyVariableG;
+	global frequencyVariableT;
+	global frequencyVariableSum;
+
+	frequencyVariableA:<1;
+	frequencyVariableC:<1;
+	frequencyVariableG:<1;
+	frequencyVariableT	 :=	Abs(1-frequencyVariableA-frequencyVariableC-frequencyVariableG);
+	frequencyVariableSum := frequencyVariableA+frequencyVariableC+frequencyVariableG+frequencyVariableT;
+
+	frequencyVariableA = EFVApproximations[0];
+	frequencyVariableC = EFVApproximations[1];
+	frequencyVariableG = EFVApproximations[2];
+
+	EFVector = {{frequencyVariableA/frequencyVariableSum},
+				{frequencyVariableC/frequencyVariableSum},
+				{frequencyVariableG/frequencyVariableSum},
+				{frequencyVariableT/frequencyVariableSum}};
+				
+	return	1;
+}
diff --git a/res/SubstitutionModels/Nucleotide/REVBetaGamma.mdl b/res/SubstitutionModels/Nucleotide/REVBetaGamma.mdl
new file mode 100644
index 0000000..e9932f3
--- /dev/null
+++ b/res/SubstitutionModels/Nucleotide/REVBetaGamma.mdl
@@ -0,0 +1,86 @@
+Model_Name  		= "REV_BG";
+Model_Options 		= 7;
+Model_Dimension 	= 4;
+Model_EFV_Type		= "Observed In Partition";
+
+function GUIPopulateModelMatrix (ModelMatrixName&, EFV)
+{
+	if (modelType == 0)
+	{
+		ModelMatrixName = {{*,a,b,c}
+						   {a,*,d,e}
+						   {b,d,*,f}
+						   {c,e,f,*}};
+	}
+	else
+	{
+		global			globalVariableAC;
+		global			globalVariableAT;
+		global			globalVariableCG;
+		global			globalVariableCT;
+		global			globalVariableGT;
+		
+		if (modelType<2)
+		{
+	
+			ModelMatrixName = {{*,globalVariableAC*mu,mu,globalVariableAT*mu}
+							   {globalVariableAC*mu,*,globalVariableCG*mu,globalVariableCT*mu}
+							   {mu,globalVariableCG*mu,*,globalVariableGT*mu}
+							   {globalVariableAT*mu,globalVariableCT*mu,globalVariableGT*mu,*}};
+		}
+		else
+		{
+			global shapeParameter_betaP = 1;
+			global shapeParameter_betaQ = 1;
+			shapeParameter_betaP:>0.05;shapeParameter_betaP:<85;
+			shapeParameter_betaQ:>0.05;shapeParameter_betaQ:<85;
+			
+			category categoryVariable_pc = (rateClassCount-1, EQUAL, MEAN, 
+							_x_^(shapeParameter_betaP-1)*(1-_x_)^(shapeParameter_betaQ-1)/Beta(shapeParameter_betaP,shapeParameter_betaQ), /* density */
+							IBeta(_x_,shapeParameter_betaP,shapeParameter_betaQ), /*CDF*/
+							0, 				   /*left bound*/
+							1, 			   /*right bound*/
+							IBeta(_x_,shapeParameter_betaP+1,shapeParameter_betaQ)*shapeParameter_betaP/(shapeParameter_betaP+shapeParameter_betaQ));
+
+			global shapeParameter = .5;
+			shapeParameter:>0.01;shapeParameter:<100;
+			category     categoryVariable = 
+						(rateClassCount, categoryVariable_pc, MEAN, GammaDist(_x_,shapeParameter,shapeParameter), CGammaDist(_x_,shapeParameter,shapeParameter), 0 , 
+				  							1e25,CGammaDist(_x_,shapeParameter+1,shapeParameter));
+
+			ModelMatrixName = {{*,globalVariableAC*mu*categoryVariable,mu*categoryVariable,globalVariableAT*mu*categoryVariable}
+							   {globalVariableAC*mu*categoryVariable,*,globalVariableCG*mu*categoryVariable,globalVariableCT*mu*categoryVariable}
+							   {mu*categoryVariable,globalVariableCG*mu*categoryVariable,*,globalVariableGT*mu*categoryVariable}
+							   {globalVariableAT*mu*categoryVariable,globalVariableCT*mu*categoryVariable,globalVariableGT*mu*categoryVariable,*}};
+		}
+	}
+	return 1;
+}
+
+/*-------------------------------------------------------------------------------*/
+
+function	EFVEstimated	(EFVector&, EFVApproximations)
+{
+	global frequencyVariableA;
+	global frequencyVariableC;
+	global frequencyVariableG;
+	global frequencyVariableT;
+	global frequencyVariableSum;
+
+	frequencyVariableA:<1;
+	frequencyVariableC:<1;
+	frequencyVariableG:<1;
+	frequencyVariableT	 :=	Abs(1-frequencyVariableA-frequencyVariableC-frequencyVariableG);
+	frequencyVariableSum := frequencyVariableA+frequencyVariableC+frequencyVariableG+frequencyVariableT;
+
+	frequencyVariableA = EFVApproximations[0];
+	frequencyVariableC = EFVApproximations[1];
+	frequencyVariableG = EFVApproximations[2];
+
+	EFVector = {{frequencyVariableA/frequencyVariableSum},
+				{frequencyVariableC/frequencyVariableSum},
+				{frequencyVariableG/frequencyVariableSum},
+				{frequencyVariableT/frequencyVariableSum}};
+				
+	return	1;
+}
diff --git a/res/SubstitutionModels/Nucleotide/TrN.mdl b/res/SubstitutionModels/Nucleotide/TrN.mdl
new file mode 100644
index 0000000..e38f9c3
--- /dev/null
+++ b/res/SubstitutionModels/Nucleotide/TrN.mdl
@@ -0,0 +1,70 @@
+Model_Name  		= "TrN";
+Model_Options 		= 7;
+Model_Dimension 	= 4;
+Model_EFV_Type		= "Observed In Partition";
+
+function GUIPopulateModelMatrix (ModelMatrixName&, EFV)
+{
+	if (modelType == 0)
+	{
+		ModelMatrixName = {{*,a,b,a}
+						   {a,*,a,c}
+						   {b,a,*,a}
+						   {a,c,a,*}};
+	}
+	else
+	{
+		global			globalVariablePurTrst;
+		global			globalVariablePyrTrst;
+		if (modelType<2)
+		{
+			ModelMatrixName = 
+						 {{*,a,globalVariablePurTrst*a,a}
+						  {a,*,a,globalVariablePyrTrst*a}
+						  {globalVariablePurTrst*a,a,*,a}
+						  {a,globalVariablePyrTrst*a,a,*}};
+		}
+		else
+		{
+			global shapeParameter = .5;
+			shapeParameter:>0.01;shapeParameter:<100;
+			category     categoryVariable = 
+						(rateClassCount, EQUAL, MEAN, GammaDist(_x_,shapeParameter,shapeParameter), CGammaDist(_x_,shapeParameter,shapeParameter), 0 , 
+				  							1e25,CGammaDist(_x_,shapeParameter+1,shapeParameter));
+
+			ModelMatrixName = {{*,a*categoryVariable,globalVariablePurTrst*a*categoryVariable,a*categoryVariable}
+							   {a*categoryVariable,*,a*categoryVariable,globalVariablePyrTrst*a*categoryVariable}
+							   {globalVariablePurTrst*a*categoryVariable,a*categoryVariable,*,a*categoryVariable}
+							   {a*categoryVariable,globalVariablePyrTrst*a*categoryVariable,a*categoryVariable,*}};
+		}
+	}
+	return 1;
+}
+
+/*-------------------------------------------------------------------------------*/
+
+function	EFVEstimated	(EFVector&, EFVApproximations)
+{
+	global frequencyVariableA;
+	global frequencyVariableC;
+	global frequencyVariableG;
+	global frequencyVariableT;
+	global frequencyVariableSum;
+
+	frequencyVariableA:<1;
+	frequencyVariableC:<1;
+	frequencyVariableG:<1;
+	frequencyVariableT	 :=	Abs(1-frequencyVariableA-frequencyVariableC-frequencyVariableG);
+	frequencyVariableSum := frequencyVariableA+frequencyVariableC+frequencyVariableG+frequencyVariableT;
+
+	frequencyVariableA = EFVApproximations[0];
+	frequencyVariableC = EFVApproximations[1];
+	frequencyVariableG = EFVApproximations[2];
+
+	EFVector = {{frequencyVariableA/frequencyVariableSum},
+				{frequencyVariableC/frequencyVariableSum},
+				{frequencyVariableG/frequencyVariableSum},
+				{frequencyVariableT/frequencyVariableSum}};
+				
+	return	1;
+}
diff --git a/res/SubstitutionModels/User/Nucleotide/JC69 b/res/SubstitutionModels/User/Nucleotide/JC69
new file mode 100644
index 0000000..e01fd7f
--- /dev/null
+++ b/res/SubstitutionModels/User/Nucleotide/JC69
@@ -0,0 +1,31 @@
+Model_Name="JC69";
+Model_Dimension=4;
+Model_Options=8;
+Model_EFV_Type="Equal";
+Model_Data_Type=0;
+
+
+
+function GUIPopulateModelMatrix(ModelMatrixName&,EFV)
+{
+
+	ModelMatrixName={4,4};
+	ModelMatrixName[0][1]:=a;
+	ModelMatrixName[1][0]:=a;
+	ModelMatrixName[0][2]:=a;
+	ModelMatrixName[2][0]:=a;
+	ModelMatrixName[0][3]:=a;
+	ModelMatrixName[3][0]:=a;
+	ModelMatrixName[1][2]:=a;
+	ModelMatrixName[2][1]:=a;
+	ModelMatrixName[1][3]:=a;
+	ModelMatrixName[3][1]:=a;
+	ModelMatrixName[2][3]:=a;
+	ModelMatrixName[3][2]:=a;
+
+	return 0;
+}
+
+Model_EFV_Vector  = {{.25,.25,.25,.25}};
+MULTIPLY_BY_FREQS = 1;
+
diff --git a/res/SubstitutionModels/User/Nucleotide/K2P b/res/SubstitutionModels/User/Nucleotide/K2P
new file mode 100644
index 0000000..4d243c5
--- /dev/null
+++ b/res/SubstitutionModels/User/Nucleotide/K2P
@@ -0,0 +1,31 @@
+Model_Name="K2P";
+Model_Dimension=4;
+Model_Options=8;
+Model_EFV_Type="Equal";
+Model_Data_Type=0;
+
+
+
+function GUIPopulateModelMatrix(ModelMatrixName&,EFV)
+{
+
+	ModelMatrixName={4,4};
+	ModelMatrixName[0][1]:=a;
+	ModelMatrixName[1][0]:=a;
+	ModelMatrixName[0][2]:=b;
+	ModelMatrixName[2][0]:=b;
+	ModelMatrixName[0][3]:=a;
+	ModelMatrixName[3][0]:=a;
+	ModelMatrixName[1][2]:=a;
+	ModelMatrixName[2][1]:=a;
+	ModelMatrixName[1][3]:=b;
+	ModelMatrixName[3][1]:=b;
+	ModelMatrixName[2][3]:=a;
+	ModelMatrixName[3][2]:=a;
+
+	return 0;
+}
+
+Model_EFV_Vector  = {{.25,.25,.25,.25}};
+MULTIPLY_BY_FREQS = 1;
+
diff --git a/res/TemplateBatchFiles/2RatesAnalyses/GY94.mdl b/res/TemplateBatchFiles/2RatesAnalyses/GY94.mdl
new file mode 100644
index 0000000..723c7ef
--- /dev/null
+++ b/res/TemplateBatchFiles/2RatesAnalyses/GY94.mdl
@@ -0,0 +1,353 @@
+global		R;
+global 		kappa;
+
+R 	  = 1;
+kappa = 1;
+
+nucModelString = "nucModelMatrix = {{*,kappa*t,t,kappa*t}{kappa*t,*,kappa*t,t}{t,kappa*t,*,kappa*t}{kappa*t,t,kappa*t,*}};";
+
+/*---------------------------------------------------------------------------------------------------------*/
+
+function SetCodonNorm (subWeights)
+{
+	nFSTV = subWeights[0][0]+subWeights[2][0]+subWeights[3][0]+subWeights[5][0];
+	nFSTS = subWeights[1][0]+subWeights[4][0];
+	nFNTV = subWeights[0][1]+subWeights[2][1]+subWeights[3][1]+subWeights[5][1];
+	nFNTS = subWeights[1][1]+subWeights[4][1];
+	global codonFactor:=fudgeFactor__*(kappa*(nFSTV__+R*nFNTV__)+nFSTS__+nFNTS__*R);
+	return 0;
+}
+
+/*---------------------------------------------------------------------------------------------------------*/
+
+function PopulateModelMatrix (ModelMatrixName&, EFV, modelType)
+{
+	if (!ModelMatrixDimension)
+	{
+		ModelMatrixDimension = 64;
+		for (h = 0 ;h<64; h=h+1)
+		{
+			if (_Genetic_Code[h]==10)
+			{
+				ModelMatrixDimension = ModelMatrixDimension-1;
+			}
+		}
+	}
+	
+	ModelMatrixName = {ModelMatrixDimension,ModelMatrixDimension}; 
+
+	hshift = 0;
+
+	if (modelType == 0)
+	{
+		for (h=0; h<64; h=h+1)
+		{
+			if (_Genetic_Code[h]==10) 
+			{
+				hshift = hshift+1;
+				continue; 
+			}
+			vshift = hshift;
+			for (v = h+1; v<64; v=v+1)
+			{
+				diff = v-h;
+				if (_Genetic_Code[v]==10) 
+				{
+					vshift = vshift+1;
+					continue; 
+				}
+				nucPosInCodon = 2;
+				if ((h$4==v$4)||((diff%4==0)&&(h$16==v$16))||(diff%16==0))
+				{
+					if (h$4==v$4)
+					{
+						transition = v%4;
+						transition2= h%4;
+					}
+					else
+					{
+						if(diff%16==0)
+						{
+							transition = v$16;
+							transition2= h$16;
+							nucPosInCodon = 0;
+						}
+						else
+						{
+							transition = v%16$4;
+							transition2= h%16$4;
+							nucPosInCodon = 1;
+						}
+					}
+					if (_Genetic_Code[0][h]==_Genetic_Code[0][v]) 
+					{
+			  			if (Abs(transition-transition2)%2)
+			  			{
+							ModelMatrixName[h-hshift][v-vshift] := synRate*kappa;
+							ModelMatrixName[v-vshift][h-hshift] := synRate*kappa;
+			  			}
+			  			else
+			  			{
+							ModelMatrixName[h-hshift][v-vshift] := synRate;
+							ModelMatrixName[v-vshift][h-hshift] := synRate;
+			  			}
+					}
+					else
+					{
+			  			if (Abs(transition-transition2)%2)
+			  			{
+							ModelMatrixName[h-hshift][v-vshift] := R*synRate*kappa;
+							ModelMatrixName[v-vshift][h-hshift] := R*synRate*kappa;
+			  			}
+			  			else
+			  			{
+							ModelMatrixName[h-hshift][v-vshift] := R*synRate;
+							ModelMatrixName[v-vshift][h-hshift] := R*synRate;
+			  			}
+					}
+				}
+		   }
+	    }		
+	}
+	else
+	{
+		ExecuteCommands (categDef1);
+		if (modelType == 1)
+		{
+			for (h=0; h<64; h=h+1)
+			{
+				if (_Genetic_Code[h]==10) 
+				{
+					hshift = hshift+1;
+					continue; 
+				}
+				vshift = hshift;
+				for (v = h+1; v<64; v=v+1)
+				{
+					diff = v-h;
+					if (_Genetic_Code[v]==10) 
+					{
+						vshift = vshift+1;
+						continue; 
+					}
+					nucPosInCodon = 2;
+					if ((h$4==v$4)||((diff%4==0)&&(h$16==v$16))||(diff%16==0))
+					{
+						if (h$4==v$4)
+						{
+							transition = v%4;
+							transition2= h%4;
+						}
+						else
+						{
+							if(diff%16==0)
+							{
+								transition = v$16;
+								transition2= h$16;
+								nucPosInCodon = 0;
+							}
+							else
+							{
+								transition = v%16$4;
+								transition2= h%16$4;
+								nucPosInCodon = 1;
+							}
+						}
+						if (_Genetic_Code[0][h]==_Genetic_Code[0][v]) 
+						{
+				  			if (Abs(transition-transition2)%2)
+				  			{
+								ModelMatrixName[h-hshift][v-vshift] := c*synRate*kappa;
+								ModelMatrixName[v-vshift][h-hshift] := c*synRate*kappa;
+				  			}
+				  			else
+				  			{
+								ModelMatrixName[h-hshift][v-vshift] := c*synRate;
+								ModelMatrixName[v-vshift][h-hshift] := c*synRate;
+				  			}
+						}
+						else
+						{
+				  			if (Abs(transition-transition2)%2)
+				  			{
+								ModelMatrixName[h-hshift][v-vshift] := c*R*synRate*kappa;
+								ModelMatrixName[v-vshift][h-hshift] := c*R*synRate*kappa;
+				  			}
+				  			else
+				  			{
+								ModelMatrixName[h-hshift][v-vshift] := c*R*synRate;
+								ModelMatrixName[v-vshift][h-hshift] := c*R*synRate;
+				  			}
+						}
+					}
+			   }
+		    }		
+		}
+		else
+		{
+			if (modelType == 2)
+			{
+				for (h=0; h<64; h=h+1)
+				{
+					if (_Genetic_Code[h]==10) 
+					{
+						hshift = hshift+1;
+						continue; 
+					}
+					vshift = hshift;
+					for (v = h+1; v<64; v=v+1)
+					{
+						diff = v-h;
+						if (_Genetic_Code[v]==10) 
+						{
+							vshift = vshift+1;
+							continue; 
+						}
+						nucPosInCodon = 2;
+						if ((h$4==v$4)||((diff%4==0)&&(h$16==v$16))||(diff%16==0))
+						{
+							if (h$4==v$4)
+							{
+								transition = v%4;
+								transition2= h%4;
+							}
+							else
+							{
+								if(diff%16==0)
+								{
+									transition = v$16;
+									transition2= h$16;
+									nucPosInCodon = 0;
+								}
+								else
+								{
+									transition = v%16$4;
+									transition2= h%16$4;
+									nucPosInCodon = 1;
+								}
+							}
+							if (_Genetic_Code[0][h]==_Genetic_Code[0][v]) 
+							{
+				  				if (Abs(transition-transition2)%2)
+				  				{
+									ModelMatrixName[h-hshift][v-vshift] := kappa*synRate;
+									ModelMatrixName[v-vshift][h-hshift] := kappa*synRate;
+								}
+								else
+								{
+									ModelMatrixName[h-hshift][v-vshift] := synRate;
+									ModelMatrixName[v-vshift][h-hshift] := synRate;
+								}
+							}
+							else
+							{
+				  				if (Abs(transition-transition2)%2)
+				  				{
+									ModelMatrixName[h-hshift][v-vshift] := c*R*kappa*synRate;
+									ModelMatrixName[v-vshift][h-hshift] := c*R*kappa*synRate;
+								}
+								else
+								{
+									ModelMatrixName[h-hshift][v-vshift] := c*R*synRate;
+									ModelMatrixName[v-vshift][h-hshift] := c*R*synRate;
+								}
+							}
+						}
+				   }
+			    }		
+			}
+			else
+			{
+				ExecuteCommands (categDef2);
+			 	
+				for (h=0; h<64; h=h+1)
+				{
+					if (_Genetic_Code[h]==10) 
+					{
+						hshift = hshift+1;
+						continue; 
+					}
+					vshift = hshift;
+					for (v = h+1; v<64; v=v+1)
+					{
+						diff = v-h;
+						if (_Genetic_Code[v]==10) 
+						{
+							vshift = vshift+1;
+							continue; 
+						}
+						nucPosInCodon = 2;
+						if ((h$4==v$4)||((diff%4==0)&&(h$16==v$16))||(diff%16==0))
+						{
+							if (h$4==v$4)
+							{
+								transition = v%4;
+								transition2= h%4;
+							}
+							else
+							{
+								if(diff%16==0)
+								{
+									transition = v$16;
+									transition2= h$16;
+									nucPosInCodon = 0;
+								}
+								else
+								{
+									transition = v%16$4;
+									transition2= h%16$4;
+									nucPosInCodon = 1;
+								}
+							}
+					  		if (_Genetic_Code[0][h]==_Genetic_Code[0][v]) 
+					  		{
+				  				if (Abs(transition-transition2)%2)
+				  				{
+					  				ModelMatrixName[h-hshift][v-vshift] := kappa*synRate*c;
+					  				ModelMatrixName[v-vshift][h-hshift] := kappa*synRate*c;
+					  			}
+					  			else
+					  			{
+					  				ModelMatrixName[h-hshift][v-vshift] := synRate*c;
+					  				ModelMatrixName[v-vshift][h-hshift] := synRate*c;
+					  			}
+						  	}
+					  		else
+					  		{
+					  			if (modelType!=4)
+					  			{
+				  					if (Abs(transition-transition2)%2)
+				  					{
+						  				ModelMatrixName[h-hshift][v-vshift] := kappa*R*synRate*d;
+					  					ModelMatrixName[v-vshift][h-hshift] := kappa*R*synRate*d;
+					  				}
+					  				else
+				  					{
+						  				ModelMatrixName[h-hshift][v-vshift] := R*synRate*d;
+					  					ModelMatrixName[v-vshift][h-hshift] := R*synRate*d;
+					  				}
+					  				
+					  			}
+					  			else
+					  			{
+				  					if (Abs(transition-transition2)%2)
+				  					{
+								  		ModelMatrixName[h-hshift][v-vshift] := kappa*r*synRate*d;
+						  				ModelMatrixName[v-vshift][h-hshift] := kappa*r*synRate*d;
+						  			}
+						  			else
+				  					{
+								  		ModelMatrixName[h-hshift][v-vshift] := r*synRate*d;
+						  				ModelMatrixName[v-vshift][h-hshift] := r*synRate*d;
+						  			}
+					  			}
+				  			}
+					   }
+				   }
+		    	}
+			}
+		}
+	}
+	
+	return 1;
+}
diff --git a/res/TemplateBatchFiles/2RatesAnalyses/MG94GY94xREV_PARRIS_syn3.mdl b/res/TemplateBatchFiles/2RatesAnalyses/MG94GY94xREV_PARRIS_syn3.mdl
new file mode 100644
index 0000000..28a493a
--- /dev/null
+++ b/res/TemplateBatchFiles/2RatesAnalyses/MG94GY94xREV_PARRIS_syn3.mdl
@@ -0,0 +1,285 @@
+/* This file to replace MG94GY94xREV_PARRIS.mdl. The latter implements only syn1, while this file implements both syn1 and syn3. */
+
+/* PARRIS version of model files uses nonsynonymous distribution instead of synonymous distribution for 
+   single rate models (older non-PARRIS version is the other way around) */
+
+global	   R;
+global     AC;
+global 	   AT;
+global     CG;
+global	   CT;
+global     GT;
+
+R  = 1;
+AT = 1;
+CG = 1;
+CT = 1;
+GT = 1;
+AC = 1;
+
+nucModelString = "nucModelMatrix = {{*,AC*t,t,AT*t}{AC*t,*,CG*t,CT*t}{t,CG*t,*,GT*t}{AT*t,CT*t,GT*t,*}};";
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------------*/
+
+/* Unused function: */
+
+function BuildMGCodonFrequencies (obsF)
+{
+	PIStop = 1.0;
+	result = {ModelMatrixDimension,1};
+	hshift = 0;
+
+	for (h=0; h<64; h=h+1)
+	{
+		first = h$16;
+		second = h%16$4;
+		third = h%4;
+		if (_Genetic_Code[h]==10) 
+		{
+			hshift = hshift+1;
+			PIStop = PIStop-obsF[first][0]*obsF[second][1]*obsF[third][2];
+			continue; 
+		}
+		result[h-hshift][0]=obsF[first][0]*obsF[second][1]*obsF[third][2];
+	}
+	return result*(1.0/PIStop);
+}
+
+/*---------------------------------------------------------------------------------------------------------*/
+
+/* Unused function for constraining codonFactor as a function of model params (for branch length conversion
+   from nucleotide to codon models). Instead of using this, codonFactor is normally kept as an optimisable parameter. */
+
+function SetCodonNorm (subWeights)
+{
+	nSAC = subWeights[0][0];
+	nSAG = subWeights[1][0];
+	nSAT = subWeights[2][0];
+	nSCG = subWeights[3][0];
+	nSCT = subWeights[4][0];
+	nSGT = subWeights[5][0];
+
+	nNAC = subWeights[0][1];
+	nNAG = subWeights[1][1];
+	nNAT = subWeights[2][1];
+	nNCG = subWeights[3][1];
+	nNCT = subWeights[4][1];
+	nNGT = subWeights[5][1];
+	
+	global 	codonFactor:=fudgeFactor__*(R*(AC*nNAC__+nNAG__+AT*nNAT__+CG*nNCG__+CT*nNCT__+GT*nNGT__)+
+						   (AC*nSAC__+nSAG__+AT*nSAT__+CG*nSCG__+CT*nSCT__+GT*nSGT__));
+	return 0;
+}
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+rateMultipliers 		= {{""   ,"AC*",""   ,"AT*"}
+						   {"AC*",""   ,"CG*","CT*"}
+						   {""   ,"CG*",""   ,"GT*"}
+						   {"AT*","CT*","GT*","" }
+						  };
+						  
+						  
+aaRateMultipliersGlobal = {21,21};
+aaRateMultipliersLocal  = {21,21};
+
+for (h=0; h<21;h=h+1)
+{
+	for (v=0; v<21; v=v+1)
+	{
+		aaRateMultipliersGlobal[h][v] = "R*";
+		aaRateMultipliersGlobal[v][h] = "R*";
+		aaRateMultipliersLocal[h][v]  = "r*";
+		aaRateMultipliersLocal[v][h]  = "r*";
+	}
+}
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function PopulateModelMatrix (ModelMatrixName&, EFV, modelType)
+{
+    /* Count model matrix dimension if it hasn't been specified: */
+	if (!ModelMatrixDimension)
+	{
+		ModelMatrixDimension = 64;
+		for (h = 0 ;h<64; h=h+1)
+		{
+			if (_Genetic_Code[h]==10)
+			{
+				ModelMatrixDimension = ModelMatrixDimension-1;
+			}
+		}
+	}
+	
+	/* Initialise model matrix in variable provided: */
+	ModelMatrixName = {ModelMatrixDimension,ModelMatrixDimension}; 
+
+	hshift = 0;
+	
+	/* Execute relevant category definition code to define syn and nonsyn distributions: */
+	/* Also set CatRateMult strings to refer to the appropriate distribution. 
+	   For proportional and single rate models, only the model in categDef2 (using category variable d) is used
+	   (note difference from older non-PARRIS version); 
+	   for dual models, the synonymous distribution should be in categDef1 (using category variable c) 
+	   and the nonsynonymous distribution in categDef2 (using category variable d). */
+	synCatRateMult 	  = "";
+	nonsynCatRateMult = "";
+	if (modelType)
+	{
+		ExecuteCommands (categDef2);
+		nonsynCatRateMult = "d*";
+		if (modelType == 1)
+		{
+			synCatRateMult 	  = "d*";
+		}
+		else
+		{
+		        if (modelType>2)
+			{
+				ExecuteCommands (categDef1);
+				synCatRateMult 	  = "c*";
+				if (multiplicativeNonSynRate)
+				{
+				    nonsynCatRateMult = "c*d*";
+				}
+			}
+		}
+	}
+	
+	/* If a multi model has been specified, use it to assign aa rate multipliers, otherwise assign them as a 
+	   global (for normal models) or local (for lineage models) parameter which is independent of aa. */
+	if (Abs(userAARateMultipliers))
+	{
+		aaRateMultipliers = userAARateMultipliers;
+	}
+	else
+	{
+		if (modelType>=4)
+		{
+			aaRateMultipliers = aaRateMultipliersLocal;
+		}
+		else
+		{
+			aaRateMultipliers = aaRateMultipliersGlobal;		
+		}
+	}
+	
+	/* Prepare model definition string for concatenation: */
+	modelDefString = "";
+	modelDefString*16384;
+	
+	if (modelType > 0)
+	{
+		catCounterAL = {};
+	}
+	
+	/* Loop through upper triangle of (symmetrical) codon rate matrix (dimension is 64 minus nr of stop codons), 
+	   building model definition string: */
+	for (h=0; h<64; h=h+1)
+	{
+		if (_Genetic_Code[h]==10) 
+		{
+			hshift = hshift+1;
+			continue; 
+		}
+		vshift = hshift;
+		for (v = h+1; v<64; v=v+1)
+		{
+			diff = v-h;
+			if (_Genetic_Code[v]==10) 
+			{
+				vshift = vshift+1;
+				continue; 
+			}
+			
+			/* Determine in which codon position we have a change (transition and transition2 
+			   are the from and to nucleotide identities at this position): */
+			/* h$4==v$4                  : 3rd position 
+			   (diff%4==0)&&(h$16==v$16) : 2nd position
+			   diff%16==0                : 1st position
+			   other cases require more than one nucleotide change so rates are set to zero */
+			nucPosInCodon = 3;
+			if ((h$4==v$4)||((diff%4==0)&&(h$16==v$16))||(diff%16==0))
+			{
+				if (h$4==v$4)
+				{
+					transition = v%4;
+					transition2= h%4;
+				}
+				else
+				{
+					if(diff%16==0)
+					{
+						transition = v$16;
+						transition2= h$16;
+						nucPosInCodon = 1;
+					}
+					else
+					{
+						transition = v%16$4;
+						transition2= h%16$4;
+						nucPosInCodon = 2;
+					}
+				}
+				hs = Format(h-hshift,0,0);
+				vs = Format(v-vshift,0,0);
+				ts = Format(transition,0,0);
+				ts2= Format(transition2,0,0);
+				ps = Format(nucPosInCodon-1,0,0);
+				aa1 = _Genetic_Code[0][h];
+				aa2 = _Genetic_Code[0][v];
+				
+				if (nucSynVar && modelType>2) /* syn3 model */
+				{
+				    synCatRateMult 	  = "c"+nucPosInCodon+"*";
+				    if (nucSynVar > 1 && nucPosInCodon == 2) /* syn2 and 2nd pos change */
+				    {
+					synCatRateMult 	  = "(c1+c3)*0.5*";
+				    }
+				    if (multiplicativeNonSynRate)
+				    {
+					nonsynCatRateMult = synCatRateMult+"d*";
+				    }
+				}
+
+				if (aa1==aa2) /* synonymous substitution */ 
+				{
+				    if (MGGYChoice) /* GY model */
+				    {
+					modelDefString*("ModelMatrixName["+hs+"]["+vs+"] := "+synCatRateMult+rateMultipliers[transition][transition2]+"synRate;\n"+
+							"ModelMatrixName["+vs+"]["+hs+"] := "+synCatRateMult+rateMultipliers[transition][transition2]+"synRate;\n");
+				    }
+				    else /* MG model */
+				    {
+					modelDefString*("ModelMatrixName["+hs+"]["+vs+"] := "+synCatRateMult+rateMultipliers[transition][transition2]+"synRate*EFV__["+ts+"]["+ps+"];\n"+				    
+							"ModelMatrixName["+vs+"]["+hs+"] := "+synCatRateMult+rateMultipliers[transition][transition2]+"synRate*EFV__["+ts2+"]["+ps+"];\n");
+				    }
+				}
+				else /* nonsynonymous substitution */
+				{
+				    bt = aaRateMultipliers[aa1][aa2];
+				    if (MGGYChoice) /* GY model */
+				    {
+					modelDefString*("ModelMatrixName["+hs+"]["+vs+"] := "+nonsynCatRateMult+rateMultipliers[transition][transition2]+bt+"synRate;\n"+"ModelMatrixName["+vs+"]["+hs+"] := "+nonsynCatRateMult+rateMultipliers[transition][transition2]+bt+"synRate;\n");						
+				    }
+				    else /* MG model */
+				    {
+					modelDefString*("ModelMatrixName["+hs+"]["+vs+"] := "+nonsynCatRateMult+rateMultipliers[transition][transition2]+bt+"synRate*EFV__["+ts+"]["+ps+"];\n"+"ModelMatrixName["+vs+"]["+hs+"] := "+nonsynCatRateMult+rateMultipliers[transition][transition2]+bt+"synRate*EFV__["+ts2+"]["+ps+"];\n");
+				    }
+				}
+			}
+		}
+	}		
+
+	/* Finish off (close and execute the model definition string we've built up): */
+	modelDefString*0;
+	ExecuteCommands (modelDefString);
+
+	/* Return value of 0 (MG) indicates that rate matrix does not need to be multiplied by codon frequencies;
+	/* Return value of 1 (GY) indicates that rate matrix still needs to be multiplied by codon frequencies: */
+	return MGGYChoice;
+}
+
+/*---------------------------------------------------------------------------------------------------------*/
+
+
diff --git a/res/TemplateBatchFiles/2RatesAnalyses/MG94xREV.mdl b/res/TemplateBatchFiles/2RatesAnalyses/MG94xREV.mdl
new file mode 100644
index 0000000..98c3bd0
--- /dev/null
+++ b/res/TemplateBatchFiles/2RatesAnalyses/MG94xREV.mdl
@@ -0,0 +1,221 @@
+global		R;
+global     AC;
+global 	   AT;
+global     CG;
+global	   CT;
+global     GT;
+
+R  = 1;
+AT = 1;
+CG = 1;
+CT = 1;
+GT = 1;
+AC = 1;
+
+nucModelString = "nucModelMatrix = {{*,AC*t,t,AT*t}{AC*t,*,CG*t,CT*t}{t,CG*t,*,GT*t}{AT*t,CT*t,GT*t,*}};";
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function BuildMGCodonFrequencies (obsF)
+{
+	PIStop = 1.0;
+	result = {ModelMatrixDimension,1};
+	hshift = 0;
+
+	for (h=0; h<64; h=h+1)
+	{
+		first = h$16;
+		second = h%16$4;
+		third = h%4;
+		if (_Genetic_Code[h]==10) 
+		{
+			hshift = hshift+1;
+			PIStop = PIStop-obsF[first][0]*obsF[second][1]*obsF[third][2];
+			continue; 
+		}
+		result[h-hshift][0]=obsF[first][0]*obsF[second][1]*obsF[third][2];
+	}
+	return result*(1.0/PIStop);
+}
+
+/*---------------------------------------------------------------------------------------------------------*/
+
+function SetCodonNorm (subWeights)
+{
+	nSAC = subWeights[0][0];
+	nSAG = subWeights[1][0];
+	nSAT = subWeights[2][0];
+	nSCG = subWeights[3][0];
+	nSCT = subWeights[4][0];
+	nSGT = subWeights[5][0];
+
+	nNAC = subWeights[0][1];
+	nNAG = subWeights[1][1];
+	nNAT = subWeights[2][1];
+	nNCG = subWeights[3][1];
+	nNCT = subWeights[4][1];
+	nNGT = subWeights[5][1];
+	
+	global 	codonFactor:=fudgeFactor__*(R*(AC*nNAC__+nNAG__+AT*nNAT__+CG*nNCG__+CT*nNCT__+GT*nNGT__)+
+						   (AC*nSAC__+nSAG__+AT*nSAT__+CG*nSCG__+CT*nSCT__+GT*nSGT__));
+	return 0;
+}
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+rateMultipliers 		= {{""   ,"AC*",""   ,"AT*"}
+						   {"AC*",""   ,"CG*","CT*"}
+						   {""   ,"CG*",""   ,"GT*"}
+						   {"AT*","CT*","GT*","" }
+						  };
+						  
+						  
+aaRateMultipliersGlobal = {21,21};
+aaRateMultipliersLocal  = {21,21};
+
+for (h=0; h<21;h=h+1)
+{
+	for (v=0; v<21; v=v+1)
+	{
+		aaRateMultipliersGlobal[h][v] = "R*";
+		aaRateMultipliersGlobal[v][h] = "R*";
+		aaRateMultipliersLocal[h][v]  = "r*";
+		aaRateMultipliersLocal[v][h]  = "r*";
+	}
+}
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function PopulateModelMatrix (ModelMatrixName&, EFV, modelType)
+{
+	if (!ModelMatrixDimension)
+	{
+		ModelMatrixDimension = 64;
+		for (h = 0 ;h<64; h=h+1)
+		{
+			if (_Genetic_Code[h]==10)
+			{
+				ModelMatrixDimension = ModelMatrixDimension-1;
+			}
+		}
+	}
+	
+	ModelMatrixName = {ModelMatrixDimension,ModelMatrixDimension}; 
+
+	hshift = 0;
+	
+	synCatRateMult 	  = "";
+	nonsynCatRateMult = "";
+	if (modelType)
+	{
+		ExecuteCommands (categDef1);
+		nonsynCatRateMult = "c*";
+		if (modelType == 1)
+		{
+			synCatRateMult 	  = "c*";
+		}
+		else
+		{
+			if (modelType>2)
+			{
+				synCatRateMult 	  = "c*";
+				ExecuteCommands (categDef2);
+				nonsynCatRateMult = "d*";
+			}
+		}
+	}
+	
+	
+	if (Abs(userAARateMultipliers))
+	{
+		aaRateMultipliers = userAARateMultipliers;
+	}
+	else
+	{
+		if (modelType>=4)
+		{
+			aaRateMultipliers = aaRateMultipliersLocal;
+		}
+		else
+		{
+			aaRateMultipliers = aaRateMultipliersGlobal;		
+		}
+	}
+	
+	modelDefString = "";
+	modelDefString*16384;
+	
+	if (modelType > 0)
+	{
+		catCounterAL = {};
+	}
+	
+	for (h=0; h<64; h=h+1)
+	{
+		if (_Genetic_Code[h]==10) 
+		{
+			hshift = hshift+1;
+			continue; 
+		}
+		vshift = hshift;
+		for (v = h+1; v<64; v=v+1)
+		{
+			diff = v-h;
+			if (_Genetic_Code[v]==10) 
+			{
+				vshift = vshift+1;
+				continue; 
+			}
+			nucPosInCodon = 2;
+			if ((h$4==v$4)||((diff%4==0)&&(h$16==v$16))||(diff%16==0))
+			{
+				if (h$4==v$4)
+				{
+					transition = v%4;
+					transition2= h%4;
+				}
+				else
+				{
+					if(diff%16==0)
+					{
+						transition = v$16;
+						transition2= h$16;
+						nucPosInCodon = 0;
+					}
+					else
+					{
+						transition = v%16$4;
+						transition2= h%16$4;
+						nucPosInCodon = 1;
+					}
+				}
+				hs = Format(h-hshift,0,0);
+				vs = Format(v-vshift,0,0);
+				ts = Format(transition,0,0);
+				ts2= Format(transition2,0,0);
+				ps = Format(nucPosInCodon,0,0);
+				aa1 = _Genetic_Code[0][h];
+				aa2 = _Genetic_Code[0][v];
+				
+				if (aa1==aa2) 
+				{
+					modelDefString*("ModelMatrixName["+hs+"]["+vs+"] := "+synCatRateMult+rateMultipliers[transition][transition2]+"synRate*EFV__["+ts+"]["+ps+"];\n"+
+													 "ModelMatrixName["+vs+"]["+hs+"] := "+synCatRateMult+rateMultipliers[transition][transition2]+"synRate*EFV__["+ts2+"]["+ps+"];\n");
+				}
+				else
+				{
+					bt = aaRateMultipliers[aa1][aa2];
+					modelDefString*("ModelMatrixName["+hs+"]["+vs+"] := "+nonsynCatRateMult+rateMultipliers[transition][transition2]+bt+"synRate*EFV__["+ts+"]["+ps+"];\n"+
+													 "ModelMatrixName["+vs+"]["+hs+"] := "+nonsynCatRateMult+rateMultipliers[transition][transition2]+bt+"synRate*EFV__["+ts2+"]["+ps+"];\n");						
+				}
+			}
+	    }
+    }		
+	modelDefString*0;
+	ExecuteCommands (modelDefString);
+	return 0;
+}
+
+/*---------------------------------------------------------------------------------------------------------*/
+
+
diff --git a/res/TemplateBatchFiles/2RatesAnalyses/MG94xREVxBivariate.mdl b/res/TemplateBatchFiles/2RatesAnalyses/MG94xREVxBivariate.mdl
new file mode 100644
index 0000000..533e20e
--- /dev/null
+++ b/res/TemplateBatchFiles/2RatesAnalyses/MG94xREVxBivariate.mdl
@@ -0,0 +1,158 @@
+global     AC;
+global 	   AT;
+global     CG;
+global	   CT;
+global     GT;
+
+AT = 1;
+CG = 1;
+CT = 1;
+GT = 1;
+AC = 1;
+
+nucModelString = "nucModelMatrix = {{*,AC*t,t,AT*t}{AC*t,*,CG*t,CT*t}{t,CG*t,*,GT*t}{AT*t,CT*t,GT*t,*}};";
+
+/*---------------------------------------------------------------------------------------------------------*/
+
+function SetCodonNorm (subWeights)
+{
+	nSAC = subWeights[0][0];
+	nSAG = subWeights[1][0];
+	nSAT = subWeights[2][0];
+	nSCG = subWeights[3][0];
+	nSCT = subWeights[4][0];
+	nSGT = subWeights[5][0];
+
+	nNAC = subWeights[0][1];
+	nNAG = subWeights[1][1];
+	nNAT = subWeights[2][1];
+	nNCG = subWeights[3][1];
+	nNCT = subWeights[4][1];
+	nNGT = subWeights[5][1];
+	
+	global 	codonFactor:=fudgeFactor__*(R*(AC*nNAC__+nNAG__+AT*nNAT__+CG*nNCG__+CT*nNCT__+GT*nNGT__)+
+						   (AC*nSAC__+nSAG__+AT*nSAT__+CG*nSCG__+CT*nSCT__+GT*nSGT__));
+	return 0;
+}
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+rateMultipliers 		= {{""   ,"AC*",""   ,"AT*"}
+						   {"AC*",""   ,"CG*","CT*"}
+						   {""   ,"CG*",""   ,"GT*"}
+						   {"AT*","CT*","GT*","" }
+						  };
+						  
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function PopulateModelMatrix (ModelMatrixName&, EFV, c_string, d_string)
+{
+	if (!ModelMatrixDimension)
+	{
+		ModelMatrixDimension = 64;
+		for (h = 0 ;h<64; h=h+1)
+		{
+			if (_Genetic_Code[h]==10)
+			{
+				ModelMatrixDimension = ModelMatrixDimension-1;
+			}
+		}
+	}
+	
+	ModelMatrixName = {ModelMatrixDimension,ModelMatrixDimension}; 
+
+	hshift = 0;
+	
+	modelDefString = "";
+	modelDefString*16384;
+
+	if (Abs(c_string))
+	{
+		synCatRateMult 	  = "("+c_string+")*";
+	}
+	else
+	{
+		synCatRateMult    = "";
+	}
+	if (Abs(d_string))
+	{
+		nonsynCatRateMult = "("+d_string+")*";;
+	}
+	else
+	{
+		nonsynCatRateMult  = "";
+	}
+	
+	for (h=0; h<64; h=h+1)
+	{
+		if (_Genetic_Code[h]==10) 
+		{
+			hshift = hshift+1;
+			continue; 
+		}
+		vshift = hshift;
+		for (v = h+1; v<64; v=v+1)
+		{
+			diff = v-h;
+			if (_Genetic_Code[v]==10) 
+			{
+				vshift = vshift+1;
+				continue; 
+			}
+			nucPosInCodon = 2;
+			if ((h$4==v$4)||((diff%4==0)&&(h$16==v$16))||(diff%16==0))
+			{
+				if (h$4==v$4)
+				{
+					transition = v%4;
+					transition2= h%4;
+				}
+				else
+				{
+					if(diff%16==0)
+					{
+						transition = v$16;
+						transition2= h$16;
+						nucPosInCodon = 0;
+					}
+					else
+					{
+						transition = v%16$4;
+						transition2= h%16$4;
+						nucPosInCodon = 1;
+					}
+				}
+				hs = Format(h-hshift,0,0);
+				vs = Format(v-vshift,0,0);
+				ts = Format(transition,0,0);
+				ts2= Format(transition2,0,0);
+				ps = Format(nucPosInCodon,0,0);
+				aa1 = _Genetic_Code[0][h];
+				aa2 = _Genetic_Code[0][v];
+				
+				if (aa1==aa2) 
+				{
+					modelDefString*("ModelMatrixName["+hs+"]["+vs+"] := "+synCatRateMult+rateMultipliers[transition][transition2]+"synRate*EFV__["+ts+"]["+ps+"];\n"+
+													 "ModelMatrixName["+vs+"]["+hs+"] := "+synCatRateMult+rateMultipliers[transition][transition2]+"synRate*EFV__["+ts2+"]["+ps+"];\n");
+				}
+				else
+				{
+					if (Abs(nonsynCatRateMult) == 0)
+					{
+						modelDefString*("ModelMatrixName["+hs+"]["+vs+"] := "+rateMultipliers[transition][transition2]+"nonSynRate*EFV__["+ts+"]["+ps+"];\n"+
+														 "ModelMatrixName["+vs+"]["+hs+"] := "+rateMultipliers[transition][transition2]+"nonSynRate*EFV__["+ts2+"]["+ps+"];\n");									
+					}
+					else
+					{
+						modelDefString*("ModelMatrixName["+hs+"]["+vs+"] := "+nonsynCatRateMult+rateMultipliers[transition][transition2]+"synRate*EFV__["+ts+"]["+ps+"];\n"+
+														 "ModelMatrixName["+vs+"]["+hs+"] := "+nonsynCatRateMult+rateMultipliers[transition][transition2]+"synRate*EFV__["+ts2+"]["+ps+"];\n");				
+					}
+				}
+			}
+	    }
+    }		
+	modelDefString*0;
+	ExecuteCommands (modelDefString);
+	return 0;
+}
diff --git a/res/TemplateBatchFiles/2RatesAnalyses/MG94xREVxBivariate_Multirate.mdl b/res/TemplateBatchFiles/2RatesAnalyses/MG94xREVxBivariate_Multirate.mdl
new file mode 100644
index 0000000..efa174b
--- /dev/null
+++ b/res/TemplateBatchFiles/2RatesAnalyses/MG94xREVxBivariate_Multirate.mdl
@@ -0,0 +1,193 @@
+global     AC;
+global 	   AT;
+global     CG;
+global	   CT;
+global     GT;
+
+AT = 1;
+CG = 1;
+CT = 1;
+GT = 1;
+AC = 1;
+
+nucModelString = "nucModelMatrix = {{*,AC*t,t,AT*t}{AC*t,*,CG*t,CT*t}{t,CG*t,*,GT*t}{AT*t,CT*t,GT*t,*}};";
+
+/*---------------------------------------------------------------------------------------------------------*/
+
+function SetCodonNorm (subWeights)
+{
+	nSAC = subWeights[0][0];
+	nSAG = subWeights[1][0];
+	nSAT = subWeights[2][0];
+	nSCG = subWeights[3][0];
+	nSCT = subWeights[4][0];
+	nSGT = subWeights[5][0];
+
+	nNAC = subWeights[0][1];
+	nNAG = subWeights[1][1];
+	nNAT = subWeights[2][1];
+	nNCG = subWeights[3][1];
+	nNCT = subWeights[4][1];
+	nNGT = subWeights[5][1];
+	
+	global 	codonFactor:=fudgeFactor__*(R*(AC*nNAC__+nNAG__+AT*nNAT__+CG*nNCG__+CT*nNCT__+GT*nNGT__)+
+						   (AC*nSAC__+nSAG__+AT*nSAT__+CG*nSCG__+CT*nSCT__+GT*nSGT__));
+	return 0;
+}
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+rateMultipliers 		= {{""   ,"AC*",""   ,"AT*"}
+						   {"AC*",""   ,"CG*","CT*"}
+						   {""   ,"CG*",""   ,"GT*"}
+						   {"AT*","CT*","GT*","" }
+						  };
+						  
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function PopulateModelMatrix (ModelMatrixName&, EFV, c_string, d_string, aaRateMultipliers)
+{
+	if (!ModelMatrixDimension)
+	{
+		ModelMatrixDimension = 64;
+		for (h = 0 ;h<64; h=h+1)
+		{
+			if (_Genetic_Code[h]==10)
+			{
+				ModelMatrixDimension = ModelMatrixDimension-1;
+			}
+		}
+	}
+	
+	ModelMatrixName = {ModelMatrixDimension,ModelMatrixDimension}; 
+
+	hshift = 0;
+	
+	modelDefString = "";
+	modelDefString*16384;
+
+	if (Abs(c_string))
+	{
+		synCatRateMult 	  = "("+c_string+")*";
+	}
+	else
+	{
+		synCatRateMult    = "";
+	}
+	if (Abs(d_string))
+	{
+		nonsynCatRateMult = "("+d_string+")*";;
+	}
+	else
+	{
+		nonsynCatRateMult  = "";
+	}
+	
+	
+	catCounterAL = {};
+
+	for (h=0; h<64; h=h+1)
+	{
+		if (_Genetic_Code[h]==10) 
+		{
+			hshift = hshift+1;
+			continue; 
+		}
+		vshift = hshift;
+		for (v = h+1; v<64; v=v+1)
+		{
+			diff = v-h;
+			if (_Genetic_Code[v]==10) 
+			{
+				vshift = vshift+1;
+				continue; 
+			}
+			nucPosInCodon = 2;
+			if ((h$4==v$4)||((diff%4==0)&&(h$16==v$16))||(diff%16==0))
+			{
+				if (h$4==v$4)
+				{
+					transition = v%4;
+					transition2= h%4;
+				}
+				else
+				{
+					if(diff%16==0)
+					{
+						transition = v$16;
+						transition2= h$16;
+						nucPosInCodon = 0;
+					}
+					else
+					{
+						transition = v%16$4;
+						transition2= h%16$4;
+						nucPosInCodon = 1;
+					}
+				}
+				hs = Format(h-hshift,0,0);
+				vs = Format(v-vshift,0,0);
+				aa1 = _Genetic_Code[0][h];
+				aa2 = _Genetic_Code[0][v];
+				
+				if (aa1==aa2) 
+				{
+					modelDefString*("ModelMatrixName["+hs+"]["+vs+"] := "+synCatRateMult+rateMultipliers[transition][transition2]+"synRate*"+EFV[transition][nucPosInCodon]+";\n"+
+													 "ModelMatrixName["+vs+"]["+hs+"] := "+synCatRateMult+rateMultipliers[transition][transition2]+"synRate*"+EFV[transition2][nucPosInCodon]+";\n");
+				}
+				else
+				{
+					if (Abs(aaRateMultipliers))
+					{
+						if (_AA_RM_NUMERIC)
+						{
+							bt = ""+aaRateMultipliers[aa1][aa2];
+						}
+						else
+						{
+							bt = aaRateMultipliers[aa1][aa2];
+							if (catCounterAL[bt] == 0)
+							{
+								catCounterAL[bt] = 1;
+								/* check if already defined */
+								GetInformation(_info,"^NSClass"+bt+"$");
+								if (Rows(_info)==0)
+								{
+									modelDefString*("\nglobal NSClass"+bt+"=1;\n");
+								}
+							}
+							bt = "NSClass"+bt;
+						}
+						bt = bt+"*synRate*";
+					}
+					else
+					{
+						bt = "synRate*";
+					}
+						
+					if (Abs(nonsynCatRateMult) == 0)
+					{
+						modelDefString*("ModelMatrixName["+hs+"]["+vs+"] := "+rateMultipliers[transition][transition2]+bt+EFV[transition][nucPosInCodon]+";\n"+
+												 "ModelMatrixName["+vs+"]["+hs+"] := "+rateMultipliers[transition][transition2]+bt+EFV[transition2][nucPosInCodon]+";\n");
+					}
+					else
+					{
+						modelDefString*("ModelMatrixName["+hs+"]["+vs+"] := "+nonsynCatRateMult+rateMultipliers[transition][transition2]+bt+EFV[transition][nucPosInCodon]+";\n"+
+													 "ModelMatrixName["+vs+"]["+hs+"] := "+nonsynCatRateMult+rateMultipliers[transition][transition2]+bt+EFV[transition2][nucPosInCodon]+";\n");
+					}
+					
+				}
+			}
+	    }
+    }		
+    
+    if (Abs(catCounterAL)==1)
+    {
+    	modelDefString * ("NSClass" + catCounterAL[(Rows(catCounterAL))[0]] + " := 1;");
+    }
+	modelDefString*0;
+	ExecuteCommands (modelDefString);
+	
+	return 0;
+}
diff --git a/res/TemplateBatchFiles/2RatesAnalyses/PARRIS_M1.def b/res/TemplateBatchFiles/2RatesAnalyses/PARRIS_M1.def
new file mode 100644
index 0000000..270a51d
--- /dev/null
+++ b/res/TemplateBatchFiles/2RatesAnalyses/PARRIS_M1.def
@@ -0,0 +1,16 @@
+if (randomizeInitValues)
+{
+    global P1 = Random (0.0001,1);
+    global W_1 = Random (0.0001,0.9999);
+}
+else
+{
+    global P1 = 1/2;
+    global W_1 = .1;
+}
+
+P1:<1;
+W_1 :< 1; W_1:>0.000000001;
+categFreqMatrix = {{P1,(1-P1)}} ;
+categRateMatrix = {{W_1,1}};
+category d = (2, categFreqMatrix , MEAN, ,categRateMatrix, 0, 1e25);			
diff --git a/res/TemplateBatchFiles/2RatesAnalyses/PARRIS_M2.def b/res/TemplateBatchFiles/2RatesAnalyses/PARRIS_M2.def
new file mode 100644
index 0000000..50e69d4
--- /dev/null
+++ b/res/TemplateBatchFiles/2RatesAnalyses/PARRIS_M2.def
@@ -0,0 +1,22 @@
+if (randomizeInitValues)
+{
+    global P1 = Random (0.0001,1);
+    global P2 = Random (0.0001,1);
+    global W_1 = Random (0.0001,0.9999);
+    global W_2 = Random (1.0001,5);
+}
+else
+{
+    global P1 = 1/3;
+    global P2 = .5;
+    global W_1 = .1;
+    global W_2 = 5;
+}
+
+P1:<1;
+P2:<1;
+W_1 :< 1; W_1:>0.000000001;
+W_2 :> 1; W_2:<100000;
+categFreqMatrix = {{P1,(1-P1)*P2, (1-P1)*(1-P2)}} ;
+categRateMatrix = {{W_1,1,W_2}};
+category d = (3, categFreqMatrix , MEAN, ,categRateMatrix, 0, 1e25);			
diff --git a/res/TemplateBatchFiles/2RatesAnalyses/PARRIS_M3.def b/res/TemplateBatchFiles/2RatesAnalyses/PARRIS_M3.def
new file mode 100644
index 0000000..7ae3841
--- /dev/null
+++ b/res/TemplateBatchFiles/2RatesAnalyses/PARRIS_M3.def
@@ -0,0 +1,24 @@
+if (randomizeInitValues)
+{
+    global P1 = Random (0.0001,1);
+    global P2 = Random (0.0001,1);
+    global W1 = Random (0.0001,0.9999);
+    global R_1 = Random (0.0001,0.9999);
+    global R_2 = Random (1.0001,5);
+}
+else
+{
+    global P1 = 1/3;
+    global P2 = .5;
+    global W1 = .25;
+    global R_1 = .5;
+    global R_2 = 3;
+}
+
+P1:<1;
+P2:<1;
+R_1 :< 1; R_1:>0.000000001;
+R_2 :> 1; R_2:<100000;
+categFreqMatrix = {{P1,(1-P1)*P2, (1-P1)*(1-P2)}} ;
+categRateMatrix = {{W1*R_1,W1,W1*R_2}};
+category d = (3, categFreqMatrix , MEAN, ,categRateMatrix, 0, 1e25);			
diff --git a/res/TemplateBatchFiles/2RatesAnalyses/PARRIS_syn3.def b/res/TemplateBatchFiles/2RatesAnalyses/PARRIS_syn3.def
new file mode 100644
index 0000000..f545cd0
--- /dev/null
+++ b/res/TemplateBatchFiles/2RatesAnalyses/PARRIS_syn3.def
@@ -0,0 +1,26 @@
+if (randomizeInitValues)
+{
+    global PS1 = Random (0.0001,1);
+    global PS2 = Random (0.0001,1);
+    global RS1 = Random (0.0001,0.9999);
+    global RS3 = Random (1.0001,5);
+}
+else
+{
+    global PS1 = 1/3;
+    global PS2 = .5;
+    global RS1 = .3;
+    global RS3 = 1.5;
+}
+
+PS1:<1;
+PS2:<1;
+RS1:<1; RS1:>0.000000001;
+RS3:>1; RS3:<100000;
+global synRate_scale := RS1*PS1 + (1-PS1)*PS2 + RS3*(1-PS1)*(1-PS2);
+categFreqMatrix = {{PS1,(1-PS1)*PS2, (1-PS1)*(1-PS2)}} ;
+categRateMatrix = {{RS1/synRate_scale,1/synRate_scale,RS3/synRate_scale}};
+category c1 = (3, categFreqMatrix , MEAN, ,categRateMatrix, 0, 1e25);			
+category c2 = (3, categFreqMatrix , MEAN, ,categRateMatrix, 0, 1e25);			
+category c3 = (3, categFreqMatrix , MEAN, ,categRateMatrix, 0, 1e25);			
+
diff --git a/res/TemplateBatchFiles/2RatesAnalyses/PARRIS_synvar.def b/res/TemplateBatchFiles/2RatesAnalyses/PARRIS_synvar.def
new file mode 100644
index 0000000..f57de29
--- /dev/null
+++ b/res/TemplateBatchFiles/2RatesAnalyses/PARRIS_synvar.def
@@ -0,0 +1,24 @@
+if (randomizeInitValues)
+{
+    global PS1 = Random (0.0001,1);
+    global PS2 = Random (0.0001,1);
+    global RS1 = Random (0.0001,0.9999);
+    global RS3 = Random (1.0001,5);
+}
+else
+{
+    global PS1 = 1/3;
+    global PS2 = .5;
+    global RS1 = .3;
+    global RS3 = 1.5;
+}
+
+PS1:<1;
+PS2:<1;
+RS1:<1; RS1:>0.000000001;
+RS3:>1; RS3:<100000;
+global synRate_scale := RS1*PS1 + (1-PS1)*PS2 + RS3*(1-PS1)*(1-PS2);
+categFreqMatrix = {{PS1,(1-PS1)*PS2, (1-PS1)*(1-PS2)}} ;
+categRateMatrix = {{RS1/synRate_scale,1/synRate_scale,RS3/synRate_scale}};
+category c = (3, categFreqMatrix , MEAN, ,categRateMatrix, 0, 1e25);			
+
diff --git a/res/TemplateBatchFiles/2RatesAnalyses/discreteGenerator.bf b/res/TemplateBatchFiles/2RatesAnalyses/discreteGenerator.bf
new file mode 100644
index 0000000..fca4eb5
--- /dev/null
+++ b/res/TemplateBatchFiles/2RatesAnalyses/discreteGenerator.bf
@@ -0,0 +1,261 @@
+categDef1 = "";
+categDef2 = "";
+
+categDef1 * 1024;
+categDef2 * 1024;
+
+if (USE_CONST_ON_PART)
+{
+	defTail = ",,CONSTANT_ON_PARTITION";
+}
+else
+{
+	defTail = "";
+}
+
+for (mi=1; mi<resp; mi=mi+1)
+{
+	if (randomizeInitValues)
+	{
+		categDef1*("global PS_"+mi+" = Random(0.05,0.95);\nPS_"+mi+":<1;\n");	
+	}
+	else
+	{
+		categDef1*("global PS_"+mi+" = 1/"+(resp+1-mi)+";\nPS_"+mi+":<1;\n");
+	}
+}
+
+if (randomizeInitValues)
+{
+	categDef1*( "\n\nglobal RS_1 = Random(0.05,0.95);\nRS_1:<1;RS_1:>0.000000001;\n");
+}
+else
+{
+	categDef1*( "\n\nglobal RS_1 = .3;\nRS_1:<1;RS_1:>0.000000001;\n");
+}
+
+for (mi=3; mi<=resp; mi=mi+1)
+{
+	if (randomizeInitValues)
+	{
+		categDef1*("global RS_" + mi + " = Random (1.05,5);\nRS_" + mi + ":>1;RS_" + mi + ":<100000;\n");	
+	}
+	else
+	{
+		categDef1*("global RS_" + mi + " = 1.5;\nRS_" + mi + ":>1;RS_" + mi + ":<100000;\n");
+	}
+} 
+
+rateStrMx    = {resp,1};
+rateStrMx[0] = "RS_1";
+rateStrMx[1] = "1";
+
+for (mi=3; mi<=resp; mi=mi+1)
+{
+	rateStrMx[mi-1] = rateStrMx[mi-2]+"*RS_"+mi;
+} 	
+
+freqStrMx    = {resp,1};
+freqStrMx[0] = "PS_1";
+
+for (mi=1; mi<resp-1; mi=mi+1)
+{
+	freqStrMx[mi] = "";
+	for (mi2=1;mi2<=mi;mi2=mi2+1)
+	{
+		freqStrMx[mi] = freqStrMx[mi]+"(1-PS_"+mi2+")";		
+	}
+	freqStrMx[mi] = freqStrMx[mi]+"PS_"+(mi+1);	
+}	
+
+freqStrMx[mi] = "";
+for (mi2=1;mi2<mi;mi2=mi2+1)
+{
+	freqStrMx[mi] = freqStrMx[mi]+"(1-PS_"+mi2+")";		
+}
+freqStrMx[mi] = freqStrMx[mi]+"(1-PS_"+mi+")";	
+
+
+categDef1*( "\n\nglobal c_scale:=" + rateStrMx[0] + "*" + freqStrMx[0]);
+
+for (mi=1; mi<resp; mi=mi+1)
+{
+	categDef1*( "+" + rateStrMx[mi] + "*" + freqStrMx[mi]);
+}
+
+categDef1*( ";\ncategFreqMatrix={{"+freqStrMx[0] );
+
+for (mi=1; mi<resp; mi=mi+1)
+{
+	categDef1*( "," + freqStrMx[mi]);
+}
+
+categDef1*( "}};\ncategRateMatrix={{" + rateStrMx[0] + "/c_scale");
+
+for (mi=1; mi<resp; mi=mi+1)
+{
+	categDef1*( "," + rateStrMx[mi] + "/c_scale");
+}
+
+categDef1*( "}};\n\ncategory c      = (" + resp + ", categFreqMatrix , MEAN, ,categRateMatrix, 0, 1e25"+defTail+");\n\n");
+
+/* begin non-syn */
+
+if (randomizeInitValues)
+{
+	categDef2*( "\n\nglobal RN_1 = Random(0.05,0.95);\nRN_1:<1;\n");
+}
+else
+{
+	categDef2*( "\n\nglobal RN_1 = .3;\nRN_1:<1;\n");
+}
+
+
+for (mi=3; mi<=resp2; mi=mi+1)
+{
+	if (randomizeInitValues)
+	{
+		categDef2*("global RN_" + mi + " = Random(1.05,5);\nRN_" + mi + ":>1;\n");
+	}
+	else
+	{
+		categDef2*("global RN_" + mi + " = 1.5;\nRN_" + mi + ":>1;\n");
+	}
+} 
+
+rateStrMx    = {resp2,1};
+rateStrMx[0] = "RN_1";
+rateStrMx[1] = "1";
+
+for (mi=3; mi<=resp2; mi=mi+1)
+{
+	rateStrMx[mi-1] = rateStrMx[mi-2]+"*RN_"+mi;
+} 	
+
+
+if (correlationOn)
+{
+	for (mi2=1; mi2<resp2; mi2=mi2+1)
+	{
+		for (mi=1; mi<=resp; mi=mi+1)
+		{
+			if (randomizeInitValues)
+			{
+				categDef2*("global PN_" + mi + "_" + mi2 + " = Random(0.05,0.95);\nPN_" + mi + "_" + mi2 + ":<1;\n");	
+			}
+			else
+			{
+				categDef2*("global PN_" + mi + "_" + mi2 + " = 1/" + (resp2+1-mi2) + ";\nPN_" + mi + "_" + mi2 + ":<1;\n");	
+			}
+		}
+	}
+
+	categDef2*( ";\ncategRateMatrixN={{" + rateStrMx[0]);
+
+	for (mi=1; mi<resp2; mi=mi+1)
+	{
+		categDef2*( "," + rateStrMx[mi]);
+	}
+
+	categDef2*( "}};\n");
+	
+	freqStrMx    = {resp,resp2};
+
+	for (mi3=1; mi3<=resp; mi3=mi3+1)
+	{
+		freqStrMx[mi3-1][0] = "PN_"+mi3+"_1";
+
+		for (mi=1; mi<resp2-1; mi=mi+1)
+		{
+			freqStrMx[mi3-1][mi] = "";
+			for (mi2=1;mi2<=mi;mi2=mi2+1)
+			{
+				freqStrMx[mi3-1][mi] = freqStrMx[mi3-1][mi]+"(1-PN_"+mi3+"_"+mi2+")";		
+			}
+			freqStrMx[mi3-1][mi] = freqStrMx[mi3-1][mi]+"PN_"+mi3+"_"+(mi+1);	
+		}	
+		freqStrMx[mi3-1][mi] = "";
+		for (mi2=1;mi2<mi;mi2=mi2+1)
+		{
+			freqStrMx[mi3-1][mi] = freqStrMx[mi3-1][mi]+"(1-PN_"+mi3+"_"+mi2+")";		
+		}
+		freqStrMx[mi3-1][mi] = freqStrMx[mi3-1][mi]+"(1-PN_"+mi3+"_"+mi+")";	
+	}
+
+	categDef2*( "\n\ncategFreqMatrixN={" );
+
+	for (mi2=0; mi2<resp; mi2=mi2+1)
+	{
+		categDef2*( "\n\t\t{" + freqStrMx[mi2][0] );
+		for (mi=1; mi<resp2; mi=mi+1)
+		{
+			categDef2*( "," + freqStrMx[mi2][mi] );
+		}
+		categDef2*( "}");
+	}
+
+	categDef2*( "};\n\ncategory d     = (" + resp2 + ", categFreqMatrixN , MEAN, c ,categRateMatrixN, 0, 1e25"+defTail+");\n\n");
+}
+else
+{
+	for (mi=1; mi<resp2; mi=mi+1)
+	{
+		if (randomizeInitValues)
+		{
+			categDef2*("global PN_" + mi + " = Random(0.05,0.95);\nPN_" + mi + ":<1;\n");	
+		}
+		else
+		{
+			categDef2*("global PN_" + mi + " = 1/" + (resp2+1-mi) + ";\nPN_" + mi + ":<1;\n");	
+		}
+	}
+	freqStrMx    = {resp2,1};
+	freqStrMx[0] = "PN_1";
+
+	for (mi=1; mi<resp2-1; mi=mi+1)
+	{
+		freqStrMx[mi] = "";
+		for (mi2=1;mi2<=mi;mi2=mi2+1)
+		{
+			freqStrMx[mi] = freqStrMx[mi]+"(1-PN_"+mi2+")";		
+		}
+		freqStrMx[mi] = freqStrMx[mi]+"PN_"+(mi+1);	
+	}	
+
+	freqStrMx[mi] = "";
+	for (mi2=1;mi2<mi;mi2=mi2+1)
+	{
+		freqStrMx[mi] = freqStrMx[mi]+"(1-PN_"+mi2+")";		
+	}
+	freqStrMx[mi] = freqStrMx[mi]+"(1-PN_"+mi+")";	
+
+	categDef2*( "\n\nglobal d_scale:=" + rateStrMx[0] + "*" + freqStrMx[0]);
+
+	for (mi=1; mi<resp2; mi=mi+1)
+	{
+		categDef2*( "+" + rateStrMx[mi] + "*" + freqStrMx[mi]);
+	}
+
+	categDef2*( ";\ncategRateMatrixN={{" + rateStrMx[0] + "/d_scale");
+
+	for (mi=1; mi<resp2; mi=mi+1)
+	{
+		categDef2*( "," + rateStrMx[mi] + "/d_scale");
+	}
+
+	categDef2*( "}};\n");
+
+	categDef2*( "\n\ncategFreqMatrixN={{" + freqStrMx[0] );
+
+	for (mi=1; mi<resp2; mi=mi+1)
+	{
+		categDef2*( "," + freqStrMx[mi]);
+	}
+
+	categDef2*( "}};\n\ncategory d     = (" + resp2 + ", categFreqMatrixN , MEAN, ,categRateMatrixN, 0, 1e25"+defTail+");\n\n");
+
+}
+
+
+categDef1 * 0;
+categDef2 * 0;
diff --git a/res/TemplateBatchFiles/2RatesAnalyses/discreteGeneratorNoPS.bf b/res/TemplateBatchFiles/2RatesAnalyses/discreteGeneratorNoPS.bf
new file mode 100644
index 0000000..51fb614
--- /dev/null
+++ b/res/TemplateBatchFiles/2RatesAnalyses/discreteGeneratorNoPS.bf
@@ -0,0 +1,184 @@
+categDef1 = "";
+categDef2 = "";
+
+categDef1 * 1024;
+categDef2 * 1024;
+
+defTail = "";
+
+for (mi=1; mi<resp; mi=mi+1)
+{
+	if (randomizeInitValues)
+	{
+		categDef1*("global PS_"+mi+" = Random(0.05,0.95);\nPS_"+mi+":<1;\n");	
+	}
+	else
+	{
+		categDef1*("global PS_"+mi+" = 1/"+(resp+1-mi)+";\nPS_"+mi+":<1;\n");
+	}
+}
+
+if (randomizeInitValues)
+{
+	categDef1*( "\n\nglobal RS_1 = Random(0.05,0.95);\nRS_1:<1;RS_1:>0.000000001;\n");
+}
+else
+{
+	categDef1*( "\n\nglobal RS_1 = .3;\nRS_1:<1;RS_1:>0.000000001;\n");
+}
+
+for (mi=3; mi<=resp; mi=mi+1)
+{
+	if (randomizeInitValues)
+	{
+		categDef1*("global RS_" + mi + " = Random (1.05,5);\nRS_" + mi + ":>1;RS_" + mi + ":<100000;\n");	
+	}
+	else
+	{
+		categDef1*("global RS_" + mi + " = 1.5;\nRS_" + mi + ":>1;RS_" + mi + ":<100000;\n");
+	}
+} 
+
+rateStrMx    = {resp,1};
+rateStrMx[0] = "RS_1";
+rateStrMx[1] = "1";
+
+for (mi=3; mi<=resp; mi=mi+1)
+{
+	rateStrMx[mi-1] = rateStrMx[mi-2]+"*RS_"+mi;
+} 	
+
+freqStrMx    = {resp,1};
+freqStrMx[0] = "PS_1";
+
+for (mi=1; mi<resp-1; mi=mi+1)
+{
+	freqStrMx[mi] = "";
+	for (mi2=1;mi2<=mi;mi2=mi2+1)
+	{
+		freqStrMx[mi] = freqStrMx[mi]+"(1-PS_"+mi2+")";		
+	}
+	freqStrMx[mi] = freqStrMx[mi]+"PS_"+(mi+1);	
+}	
+
+freqStrMx[mi] = "";
+for (mi2=1;mi2<mi;mi2=mi2+1)
+{
+	freqStrMx[mi] = freqStrMx[mi]+"(1-PS_"+mi2+")";		
+}
+freqStrMx[mi] = freqStrMx[mi]+"(1-PS_"+mi+")";	
+
+
+categDef1*( "\n\nglobal c_scale:=" + rateStrMx[0] + "*" + freqStrMx[0]);
+
+for (mi=1; mi<resp; mi=mi+1)
+{
+	categDef1*( "+" + rateStrMx[mi] + "*" + freqStrMx[mi]);
+}
+
+categDef1*( ";\ncategFreqMatrix={{"+freqStrMx[0] );
+
+for (mi=1; mi<resp; mi=mi+1)
+{
+	categDef1*( "," + freqStrMx[mi]);
+}
+
+categDef1*( "}};\ncategRateMatrix={{" + rateStrMx[0] + "/c_scale");
+
+for (mi=1; mi<resp; mi=mi+1)
+{
+	categDef1*( "," + rateStrMx[mi] + "/c_scale");
+}
+
+categDef1*( "}};\n\ncategory c      = (" + resp + ", categFreqMatrix , MEAN, ,categRateMatrix, 0, 1e25"+defTail+");\n\n");
+
+/* begin non-syn */
+
+if (randomizeInitValues)
+{
+	categDef2*( "\n\nglobal RN_1 = Random(0.05,0.95);\nRN_1:<1;\n");
+}
+else
+{
+	categDef2*( "\n\nglobal RN_1 = .0.9;\nRN_1:<1;\n");
+}
+
+
+for (mi=2; mi<=resp2; mi=mi+1)
+{
+	if (randomizeInitValues)
+	{
+		categDef2*("global RN_" + mi + " = Random(0.05,0.95);\nRN_" + mi + ":<1;\n");
+	}
+	else
+	{
+		categDef2*("global RN_" + mi + " = 0.75;\nRN_" + mi + ":<1;\n");
+	}
+} 
+
+multFactor = rateStrMx[0];
+
+rateStrMx    	   = {resp2,1};
+rateStrMx[0] = "";
+rateStrMx[resp2-1] = multFactor+"/c_scale*RN_" + resp2;
+
+for (mi=resp2-1; mi>=1; mi=mi-1)
+{
+	rateStrMx[mi-1] = rateStrMx[mi]+"*RN_"+mi;
+} 	
+
+
+for (mi=1; mi<=resp2; mi=mi+1)
+{
+	if (randomizeInitValues)
+	{
+		categDef2*("global PN_" + mi + " = Random(0.05,0.95);\nPN_" + mi + ":<1;\n");	
+	}
+	else
+	{
+		categDef2*("global PN_" + mi + " = 1/" + (resp2+1-mi) + ";\nPN_" + mi + ":<1;\n");	
+	}
+}
+
+freqStrMx    = {resp2,1};
+freqStrMx[0] = "PN_1";
+
+for (mi=1; mi<resp2-1; mi=mi+1)
+{
+	freqStrMx[mi] = "";
+	for (mi2=1;mi2<=mi;mi2=mi2+1)
+	{
+		freqStrMx[mi] = freqStrMx[mi]+"(1-PN_"+mi2+")";		
+	}
+	freqStrMx[mi] = freqStrMx[mi]+"PN_"+(mi+1);	
+}	
+
+freqStrMx[mi] = "";
+for (mi2=1;mi2<mi;mi2=mi2+1)
+{
+	freqStrMx[mi] = freqStrMx[mi]+"(1-PN_"+mi2+")";		
+}
+freqStrMx[mi] = freqStrMx[mi]+"(1-PN_"+mi+")";	
+
+
+categDef2*( "\ncategRateMatrixN={{" + rateStrMx[0]);
+
+for (mi=1; mi<resp2; mi=mi+1)
+{
+	categDef2*( "," + rateStrMx[mi]);
+}
+
+categDef2*( "}};\n");
+
+categDef2*( "\n\ncategFreqMatrixN={{" + freqStrMx[0] );
+
+for (mi=1; mi<resp2; mi=mi+1)
+{
+	categDef2*( "," + freqStrMx[mi]);
+}
+
+categDef2*( "}};\n\ncategory d     = (" + resp2 + ", categFreqMatrixN , MEAN, ,categRateMatrixN, 0, 1e25"+defTail+");\n\n");
+
+
+categDef1 * 0;
+categDef2 * 0;
diff --git a/res/TemplateBatchFiles/2RatesAnalyses/gamma1.def b/res/TemplateBatchFiles/2RatesAnalyses/gamma1.def
new file mode 100644
index 0000000..85c56d4
--- /dev/null
+++ b/res/TemplateBatchFiles/2RatesAnalyses/gamma1.def
@@ -0,0 +1,35 @@
+if (randomizeInitValues)
+{
+	global alpha = Random (0.1,10);	
+}
+else
+{
+	global alpha = 1;	
+}
+
+alpha:>0.01;
+alpha:<100;
+
+categDef1 = " ";
+
+if (USE_CONST_ON_PART)
+{
+	category c = (resp, EQUAL, MEAN, 
+					GammaDist(_x_,alpha,alpha), 
+					CGammaDist(_x_,alpha,alpha), 
+					0 , 
+					1e25,
+					CGammaDist(_x_,alpha+1,alpha),
+					CONSTANT_ON_PARTITION);
+}
+else
+{
+	category c = (resp, EQUAL, MEAN, 
+					GammaDist(_x_,alpha,alpha), 
+					CGammaDist(_x_,alpha,alpha), 
+					0 , 
+					1e25,
+					CGammaDist(_x_,alpha+1,alpha)
+				 );
+
+}
diff --git a/res/TemplateBatchFiles/2RatesAnalyses/gamma2+Inv.def b/res/TemplateBatchFiles/2RatesAnalyses/gamma2+Inv.def
new file mode 100644
index 0000000..9dfa6d4
--- /dev/null
+++ b/res/TemplateBatchFiles/2RatesAnalyses/gamma2+Inv.def
@@ -0,0 +1,47 @@
+global beta = .25;
+beta:>0.01;beta:<100;
+categDef2 = " ";
+
+global Inv_prop;
+Inv_prop :< 1-(1e-10);
+Inv_prop = 1/resp2;
+
+if (randomizeInitValues)
+{
+	global beta = Random(0.1,10);
+	global Inv_prop = Random (0.05,0.95);
+}
+
+catFreqMatrix = {resp2,1};
+catFreqMatrix [0] := Inv_prop;
+
+for (h=1; h<resp2;h=h+1)
+{
+	catFreqMatrix [h] := (1-Inv_prop)/(resp2__-1);
+}
+
+
+if (USE_CONST_ON_PART)
+{
+category d = (resp2, catFreqMatrix, MEAN, 
+				(1-Inv_prop)*GammaDist(_x_,beta,beta)*(_x_>0), 
+				(1-Inv_prop)*CGammaDist(_x_,beta,beta)*(_x_>0)+Inv_prop, 
+				0, 
+		  	    1e25,
+		  	    (1-Inv_prop)*CGammaDist(_x_,beta+1,beta)*(_x_>0),
+		  	    CONSTANT_ON_PARTITION
+		  	 );
+}
+else
+{
+category d = (resp2, catFreqMatrix, MEAN, 
+				(1-Inv_prop)*GammaDist(_x_,beta,beta)*(_x_>0), 
+				(1-Inv_prop)*CGammaDist(_x_,beta,beta)*(_x_>0)+Inv_prop, 
+				0, 
+		  	    1e25,
+		  	    (1-Inv_prop)*CGammaDist(_x_,beta+1,beta)*(_x_>0)
+		  	 );
+
+}
+		  	 
+
diff --git a/res/TemplateBatchFiles/2RatesAnalyses/gamma2.def b/res/TemplateBatchFiles/2RatesAnalyses/gamma2.def
new file mode 100644
index 0000000..03d614b
--- /dev/null
+++ b/res/TemplateBatchFiles/2RatesAnalyses/gamma2.def
@@ -0,0 +1,32 @@
+if (randomizeInitValues)
+{
+	global beta = Random (0.1,10);	
+}
+else
+{
+	global beta = .25;
+}
+categDef2 = " ";
+
+if (USE_CONST_ON_PART)
+{
+beta:>0.01;beta:<100;
+category d =  (resp2, EQUAL, MEAN, 
+				GammaDist(_x_,beta,beta), 
+				CGammaDist(_x_,beta,beta), 
+				0 , 
+				1e25,
+				CGammaDist(_x_,beta+1,beta),
+				CONSTANT_ON_PARTITION);
+}
+else
+{
+beta:>0.01;beta:<100;
+category d =  (resp2, EQUAL, MEAN, 
+				GammaDist(_x_,beta,beta), 
+				CGammaDist(_x_,beta,beta), 
+				0 , 
+				1e25,
+				CGammaDist(_x_,beta+1,beta));
+
+}
diff --git a/res/TemplateBatchFiles/454.bf b/res/TemplateBatchFiles/454.bf
new file mode 100644
index 0000000..eded040
--- /dev/null
+++ b/res/TemplateBatchFiles/454.bf
@@ -0,0 +1,537 @@
+ExecuteAFile 					("Utility/GrabBag.bf");
+ExecuteAFile 					("Utility/DBTools.ibf");
+
+
+alignOptions = {};
+
+SetDialogPrompt 		("Sequence File:");
+DataSet        unal 	= ReadDataFile 	(PROMPT_FOR_FILE);
+BASE_FILE_PATH			= LAST_FILE_PATH;
+DB_FILE_PATH			= LAST_FILE_PATH + ".db";
+
+ANALYSIS_DB_ID			= _openCacheDB (DB_FILE_PATH);
+
+haveTable				= _TableExists (ANALYSIS_DB_ID, "SETTINGS");
+if (haveTable)
+{
+	existingSettings = _ExecuteSQL (ANALYSIS_DB_ID, "SELECT * FROM SETTINGS");
+}
+
+if (Abs(existingSettings))
+{
+	existingSettings = existingSettings [0];
+	ExecuteCommands ("_Genetic_Code = " + existingSettings["GENETIC_CODE"]);
+	ExecuteCommands (existingSettings["OPTIONS"] ^ {{"_hyphyAssociativeArray","alignOptions"}});
+	masterReferenceSequence = existingSettings["REFERENCE"];
+	dbSequences = _ExecuteSQL (ANALYSIS_DB_ID, "SELECT SEQUENCE_ID FROM SEQUENCES WHERE STAGE = 0");
+	unalSequenceCount = Abs(dbSequences);
+	toDoSequences     = {unalSequenceCount,1};
+	for (k = 0; k < unalSequenceCount; k=k+1)
+	{
+		toDoSequences[k] = (dbSequences[k])["SEQUENCE_ID"];
+	}
+	dbSequences = 0;
+	fprintf (stdout, "[PHASE 1] Reloaded ", unalSequenceCount, " unprocessed sequences\n");
+}
+else
+{
+	tableDefines			   = {};
+	tableDefines  ["SETTINGS"] = {};
+	(tableDefines ["SETTINGS"])["RUN_DATE"] 				= "DATE";
+	(tableDefines ["SETTINGS"])["OPTIONS"] 				    = "TEXT";
+	(tableDefines ["SETTINGS"])["REFERENCE"] 				= "TEXT";
+	(tableDefines ["SETTINGS"])["GENETIC_CODE"] 			= "TEXT";
+	(tableDefines ["SETTINGS"])["THRESHOLD"]				= "REAL";
+
+	tableDefines  ["SEQUENCES"] = {};
+	(tableDefines ["SEQUENCES"])["SEQUENCE_ID"]				= "TEXT UNIQUE";
+	(tableDefines ["SEQUENCES"])["LENGTH"] 				    = "INTEGER";
+	(tableDefines ["SEQUENCES"])["STAGE"] 				    = "INTEGER"; 
+								/*
+									0 - initial import
+									1 - in frame without a fix 
+									2 - one frame shift / fixed
+									3 - out-of-frame; not fixed / not aligned
+								*/
+	(tableDefines ["SEQUENCES"])["RAW"]						= "TEXT";
+	(tableDefines ["SEQUENCES"])["ALIGNED_AA"]				= "TEXT";    /* aligned aa. sequence */
+	(tableDefines ["SEQUENCES"])["ALIGNED"]					= "TEXT";    /* aligned nucleotide sequence */
+	(tableDefines ["SEQUENCES"])["OFFSET"]					= "INTEGER"; /* start offset w.r.t the reference sequence */
+	(tableDefines ["SEQUENCES"])["END_OFFSET"]				= "INTEGER"; /* end offset w.r.t the reference sequence */
+	(tableDefines ["SEQUENCES"])["SCORE"]					= "REAL";
+	(tableDefines ["SEQUENCES"])["FRAME"]					= "INTEGER";
+
+	_CreateTableIfNeeded (ANALYSIS_DB_ID, "SETTINGS",  tableDefines["SETTINGS"], 0);
+	_CreateTableIfNeeded (ANALYSIS_DB_ID, "SEQUENCES", tableDefines["SEQUENCES"], 1);
+
+	/* START ALIGNMENT SETTINGS */
+	LoadFunctionLibrary ("SeqAlignShared.ibf");
+
+	DataSetFilter  filteredData 	= CreateFilter	(unal,1);
+
+	GetInformation (UnalignedSeqs,filteredData);
+	/* preprocess sequences */
+
+	unalSequenceCount = Rows(UnalignedSeqs)*Columns(UnalignedSeqs);
+	GetString (sequenceNames, unal, -1);
+
+	longestSequence   	= 0;
+	longestSequenceIDX	= 0;
+	
+	seqRecord			= {};
+
+	fprintf (stdout, "[PHASE 1] Initial Processing of ", unalSequenceCount, " sequences\n");
+
+	for (seqCounter = 0; seqCounter < unalSequenceCount; seqCounter = seqCounter+1)
+	{
+		UnalignedSeqs[seqCounter] = UnalignedSeqs[seqCounter]^{{"[^a-zA-Z]",""}};
+		UnalignedSeqs[seqCounter] = UnalignedSeqs[seqCounter]^{{"^N+",""}};
+		UnalignedSeqs[seqCounter] = UnalignedSeqs[seqCounter]^{{"N+$",""}};
+		
+		seqRecord	["SEQUENCE_ID"] = sequenceNames[seqCounter];
+		seqRecord	["LENGTH"] = Abs (UnalignedSeqs[seqCounter]);
+		seqRecord	["STAGE"]  = 0;
+		seqRecord	["RAW"]	   = UnalignedSeqs[seqCounter];
+		
+		if (doLongestSequence)
+		{
+			if (doLongestSequence == 1 || seqCounter != unalSequenceCount-1)
+			{
+				if (Abs (UnalignedSeqs[seqCounter]) > longestSequence)
+				{
+					longestSequence    = Abs (UnalignedSeqs[seqCounter]);
+					longestSequenceIDX = seqCounter;
+				}
+			}
+		}
+		
+		_InsertRecord (ANALYSIS_DB_ID, "SEQUENCES", seqRecord);
+		SetParameter (STATUS_BAR_STATUS_STRING, "Initial processing ("+seqCounter+"/"+unalSequenceCount+" done)",0);
+	}
+	
+	if (refSeq == 0)
+	{
+		masterReferenceSequence = UnalignedSeqs[0];
+	}
+
+
+	if (doLongestSequence)
+	{
+		fprintf			 (stdout, "\nSelected sequence ", sequenceNames[longestSequenceIDX], " as reference.");
+		masterReferenceSequence = UnalignedSeqs[longestSequenceIDX];
+	}
+	
+	incFileName = HYPHY_LIB_DIRECTORY+"TemplateBatchFiles"+DIRECTORY_SEPARATOR+"TemplateModels"+DIRECTORY_SEPARATOR+"chooseGeneticCode.def";
+	ExecuteCommands  ("#include \""+incFileName+"\";");
+
+	doLongestSequence		= (refSeq==1);
+	aRecord					= {};
+	aRecord["RUN_DATE"]		= _ExecuteSQL(ANALYSIS_DB_ID,"SELECT DATE('NOW') AS CURRENT_DATE");
+	aRecord["RUN_DATE"]		= ((aRecord["RUN_DATE"])[0])["CURRENT_DATE"];
+	aRecord["OPTIONS"]		= "" + alignOptions;
+	aRecord["REFERENCE"]	= masterReferenceSequence;
+	aRecord["GENETIC_CODE"] = "" + _Genetic_Code;
+	_InsertRecord (ANALYSIS_DB_ID, "SETTINGS", aRecord);
+	toDoSequences			= sequenceNames;
+	UnalignedSequences		= 0;
+	
+}
+
+skipOutliers		= 1;
+doRC				= 1;
+
+/* build codon translation table */
+
+codonToAAMap = {};
+codeToAA 	 = "FLIMVSPTAYXHQNKDECWRG";
+
+nucChars = "ACGT";
+
+for (p1=0; p1<64; p1=p1+1)
+{
+	codon = nucChars[p1$16]+nucChars[p1%16$4]+nucChars[p1%4];
+	ccode = _Genetic_Code[p1];
+	codonToAAMap[codon] = codeToAA[ccode];
+}
+
+/* determine reading frames	*/
+ProteinSequences = {};
+AllTranslations  = {};
+ReadingFrames	 = {};
+StopCodons		 = {};
+StopPositions    = {};
+RC				 = {};
+
+fprintf				  (stdout, "\n[PHASE 2] Detecting reading frames for each unprocessed sequence...\n");
+frameCounter		  = {3,2};
+stillHasStops		  = {};
+aRecord				  = {};
+
+for (seqCounter = 0; seqCounter < unalSequenceCount; seqCounter = seqCounter+1)
+{
+	rawSeq = (_ExecuteSQL(ANALYSIS_DB_ID,"SELECT RAW FROM SEQUENCES WHERE SEQUENCE_ID = '" + toDoSequences[seqCounter] + "'"));
+	aSeq   = (rawSeq[0])["RAW"];
+	seqLen = Abs(aSeq)-2;
+	
+	minStops = 1e20;
+	tString = "";
+	rFrame = 0;
+	rrc	   = 0;
+	allTran  = {3,2};
+	stopPosn = {6,2};
+	
+	for (rc = 0; rc<=doRC; rc = rc+1)
+	{
+		if (rc)
+		{
+			aSeq = nucleotideReverseComplement (aSeq)
+		}
+		for (offset = 0; offset < 3; offset = offset+1)
+		{
+			translString = "";
+			translString * (seqLen/3+1);
+			for (seqPos = offset; seqPos < seqLen; seqPos = seqPos+3)
+			{
+				codon = aSeq[seqPos][seqPos+2];
+				prot = codonToAAMap[codon];
+				if (Abs(prot))
+				{
+					translString * prot;
+				}
+				else
+				{
+					translString * "?";
+				}
+			} 
+			translString * 0;
+			translString = translString^{{"X$","?"}};
+			stopPos = translString||"X";
+			if (stopPos[0]>=0)
+			{
+				stopCount = Rows(stopPos)$2;
+				stopPosn[3*rc+offset][0] = stopPos[0];
+				stopPosn[3*rc+offset][1] = stopPos[stopCount*2-1];
+			}
+			else
+			{
+				stopCount = 0;
+			}
+			if (stopCount<minStops)
+			{
+				minStops = stopCount;
+				rFrame   = offset;
+				rrc		 = rc;
+				tString  = translString;
+			}
+			allTran[offset][rc] = translString;
+		}
+	}
+	
+	ReadingFrames		[seqCounter] 	= rFrame;
+	ProteinSequences	[seqCounter]	= tString;
+	frameCounter		[rFrame][rrc]	= frameCounter[rFrame][rrc]+1;
+	StopPositions		[seqCounter]	= stopPosn;
+	AllTranslations		[seqCounter]	= allTran;
+	RC					[seqCounter]	= rrc;
+	
+	SetParameter (STATUS_BAR_STATUS_STRING, "Reading frame analysis ("+seqCounter+"/"+unalSequenceCount+" done)",0);
+}
+
+_closeCacheDB	(ANALYSIS_DB_ID);
+return 0;
+
+s1 = ProteinSequences[0];
+fprintf (stdout, "\nFound:\n\t", frameCounter[0], " sequences in reading frame 1\n\t",frameCounter[1], " sequences in reading frame 2\n\t",frameCounter[2], " sequences in reading frame 3\n\nThere were ", Abs(stillHasStops), " sequences with apparent frameshift/sequencing errors\n");
+
+
+skipSeqs = {};
+
+for (k=0; k<Abs(stillHasStops); k=k+1)
+{
+	seqCounter = stillHasStops[k];
+	seqName = sequenceNames[seqCounter];
+	fprintf (stdout,"Sequence ", seqCounter+1, " (", seqName, ") seems to have");
+	stopPosn = StopPositions[seqCounter];
+	
+	fStart = -1;
+	fEnd   = -1;
+	fMin   = 1e10;
+	frame1 = 0;
+	frame2 = 0;
+	
+	checkFramePosition (stopPosn[0][1],stopPosn[1][0],0,1);
+	checkFramePosition (stopPosn[1][1],stopPosn[0][0],1,0);
+	checkFramePosition (stopPosn[0][1],stopPosn[2][0],0,2);
+	checkFramePosition (stopPosn[2][1],stopPosn[0][0],2,0);
+	checkFramePosition (stopPosn[2][1],stopPosn[1][0],2,1);
+	checkFramePosition (stopPosn[1][1],stopPosn[2][0],1,2);
+	
+	if (fStart>=0)
+	{
+		allTran = AllTranslations[seqCounter];
+		useq    				   = UnalignedSeqs[seqCounter];
+		fprintf (stdout, " a shift from frame ", frame2+1, " to frame ", frame1+1, " between a.a. positions ", fStart, " and ", fEnd, ".");
+		fStart2 = Max(fStart-1,0);
+		fEnd2   = Min(fEnd+1,Min(Abs(allTran[frame1]),Abs(allTran[frame2]))-1);
+		tempString = allTran[frame2];
+		fprintf (stdout, "\n\tRegion ", fStart2, "-", fEnd2, " in frame  ", frame2+1, ":\n\t", tempString[fStart2][fEnd2]);
+		fprintf (stdout, "\n\t", useq[3*fStart2+frame2][3*fEnd2+frame2-1]);
+		tempString = allTran[frame1];
+		fprintf (stdout, "\n\tRegion ", fStart2, "-", fEnd2, " in frame  ", frame1+1, ":\n\t", tempString[fStart2][fEnd2]);
+		fprintf (stdout, "\n\t", useq[3*fStart2+frame1][3*fEnd2+frame1-1]);
+		fprintf (stdout, "\n\t\tAttempting to resolve by alignment to reference. ");
+		
+		f1s = allTran[frame1];
+		f2s = allTran[frame2];
+		f1l = Abs(f1s);
+		
+		bestScore  = -1e10;
+		bestSplice = -1;
+		
+		for (k2=fStart; k2<fEnd; k2=k2+1)
+		{
+			s2 = f2s[0][k2]+f1s[k2+1][Abs(f1s)];
+			inStr = {{s1,s2}};
+			AlignSequences(aligned, inStr, alignOptions);
+			aligned = aligned[0];
+			aligned = aligned[0];
+			if (aligned > bestScore)
+			{
+				bestScore = aligned;
+				bestSplice = k2;
+				bestString = s2;
+			}
+		}
+		fprintf (stdout, "Best splice site appears to be at a.a. position ", bestSplice, "\n");
+		/* update best spliced string */
+		
+		ProteinSequences[seqCounter] = bestString;
+		ReadingFrames[seqCounter]    = 0;
+		
+		UnalignedSeqs[seqCounter]  = useq[frame2][frame2+3*bestSplice+2] + useq[frame1+3*bestSplice+3][Abs(useq)-1] + "---";
+	}
+	else
+	{
+		
+		fprintf (stdout, " multiple frameshifts\n");
+		skipSeqs[seqCounter] = 1;
+	}	
+}
+
+SeqAlignments 	 = {};
+startingPosition = {unalSequenceCount,2};
+refLength = Abs(ProteinSequences[0]);
+refInsertions	 = {refLength,1};
+
+fprintf (stdout,"\nPerforming pairwise alignment with reference sequences\n");
+
+alignmentScores = {};
+
+for (seqCounter = 1; seqCounter < unalSequenceCount; seqCounter = seqCounter+1)
+{
+	if (skipSeqs[seqCounter] == 0)
+	{
+		s2 			 = ProteinSequences[seqCounter];
+		inStr 		 = {{s1,s2}};
+		AlignSequences(aligned, inStr, alignOptions);
+		aligned = aligned[0];
+		SeqAlignments[seqCounter] = aligned;
+		alignmentScores[Abs(alignmentScores)] = aligned[0]/Abs(aligned[1]);
+		aligned = aligned[1];
+		myStartingPosition = aligned$"[^-]";
+		myEndingPosition  = Abs (aligned)-1;
+		while (aligned[myEndingPosition]=="-")
+		{
+			myEndingPosition = myEndingPosition - 1;
+		}
+		myStartingPosition = myStartingPosition[0];
+		startingPosition[seqCounter][0] = myStartingPosition;
+		startingPosition[seqCounter][1] = myEndingPosition;
+		aligned = aligned[myStartingPosition][myEndingPosition];
+		refInsert = aligned||"-+";
+		if (refInsert[0]>0)
+		{
+			insCount = Rows (refInsert)/2;
+			offset = 0;
+			for (insN = 0; insN < insCount; insN = insN+1)
+			{
+				insPos 		= refInsert[insN*2];
+				insLength	= refInsert[insN*2+1]-insPos+1;
+				insPos 		= insPos-offset;
+				if (refInsertions[insPos]<insLength)
+				{
+					refInsertions[insPos]=insLength;
+				}
+				offset = offset + insLength;
+			}
+		}
+	}
+}
+
+alignmentScoresM = avlToMatrix  ("alignmentScores");
+ExecuteAFile 					("Utility/DescriptiveStatistics.bf");
+distInfo = 						GatherDescriptiveStats (alignmentScoresM);
+/*lowerCuttoff = 0.25;*/
+distInfo["Mean"] - 2*distInfo["Std.Dev"];
+/* produce a fully gapped reference sequence */
+
+fprintf (stdout,"\nMerging pairwise alignments into a MSA\n");
+
+fullRefSeq = "";
+fullRefSeq * refLength;
+fullRefSeq * (s1[0]);
+
+
+s1N = UnalignedSeqs[0];
+
+fullRefSeqN = "";
+fullRefSeqN * (3*refLength);
+fullRefSeqN * (s1N[0][2]);
+
+frameShift = ReadingFrames[0];
+
+for (seqCounter=1;seqCounter<refLength;seqCounter=seqCounter+1)
+{
+	gapCount = refInsertions[seqCounter];
+	for (k=0; k<gapCount;k=k+1)
+	{
+		fullRefSeq*("-");
+		fullRefSeqN*("---");
+	}	
+	fullRefSeq  * (s1[seqCounter]);
+	fullRefSeqN * (s1N[frameShift+seqCounter*3][frameShift+seqCounter*3+2]);
+}
+
+fullRefSeq * 0;
+fullRefSeqN * 0;
+
+return 0;
+
+refLength = Abs(fullRefSeq);
+
+SetDialogPrompt ("Save alignment to:");
+
+seqName=sequenceNames[0];
+fprintf (PROMPT_FOR_FILE,CLEAR_FILE,">",seqName,"\n",fullRefSeq);
+fName = LAST_FILE_PATH;
+fNameC = fName+".nuc";
+fprintf (fNameC,CLEAR_FILE,">",seqName,"\n",fullRefSeqN);
+
+alCounter		= 0;
+
+for (seqCounter = 1; seqCounter < unalSequenceCount; seqCounter = seqCounter+1)
+{
+	if (skipSeqs[seqCounter] == 0)
+	{
+		if (skipOutliers == 0 && alignmentScoresM[alCounter] < lowerCuttoff)
+		{
+			seqName=sequenceNames[seqCounter];
+			fprintf (stdout, "Sequence ", seqName ," was skipped because of a poor alignment score.\n");
+			skipSeqs[seqCounter] = 1;
+			alCounter = alCounter + 1;
+			continue;
+		}
+		alCounter = alCounter + 1;
+		seqName=sequenceNames[seqCounter];
+		aligned = SeqAlignments[seqCounter];
+		
+		aligned1 = aligned[1];
+		aligned2 = aligned[2];
+		
+		s2 = startingPosition[seqCounter][0];
+		e2 = startingPosition[seqCounter][1];
+		
+		gappedSeq = "";
+		gappedSeq * Abs(aligned2);
+
+		
+		k=0;
+		
+		while (k<refLength)
+		{
+			while (fullRefSeq[k]!=aligned1[s2])
+			{
+				gappedSeq*("-");
+				k=k+1;
+			}
+			gappedSeq*(aligned2[s2]);
+			s2=s2+1;
+			k=k+1;
+		}
+
+		gappedSeq * 0;
+
+		gappedSeqN = "";
+		gappedSeqN * (3*Abs(aligned2));
+		
+		frameShift = ReadingFrames[seqCounter];
+
+		s1N 	= UnalignedSeqs[seqCounter];
+		s2N		= ProteinSequences[seqCounter];
+		s2 		= startingPosition[seqCounter][0];
+		k 		= 0;
+		e2		= Abs(gappedSeq);
+		k = 0;
+		while  (k<e2)
+		{
+			while ((s2N[s2]!=gappedSeq[k])&&(k<e2))
+			{
+				gappedSeqN * ("---");
+				k=k+1;
+			}
+			if (k<e2)
+			{
+				gappedSeqN * s1N[frameShift+s2*3][frameShift+s2*3+2];
+				s2 = s2+1;
+				k=k+1;
+			}
+		}
+		gappedSeqN * 0;
+
+		if (refSeq2 && seqCounter == unalSequenceCount-1)
+		{
+			fscanf (fName, "Raw", soFar);
+			fprintf (fName, CLEAR_FILE,">",seqName,"\n",gappedSeq,"\n",soFar);
+			fscanf (fNameC, "Raw", soFar);
+			fprintf (fNameC,CLEAR_FILE,">",seqName,"\n",gappedSeqN,"\n",soFar);		
+			
+		}
+		else
+		{
+			fprintf (fName,"\n>",seqName,"\n",gappedSeq);
+			fprintf (fNameC,"\n>",seqName,"\n",gappedSeqN);		
+		}
+	}
+}
+
+if (Abs(skipSeqs))
+{
+	fName = fName+".bad";
+	for (seqCounter = 1; seqCounter < unalSequenceCount; seqCounter = seqCounter+1)
+	{
+		if (skipSeqs[seqCounter])
+		{
+			seqName=sequenceNames[seqCounter];
+			fprintf (fName,">",seqName,"\n",UnalignedSeqs[seqCounter],"\n");
+		}
+	}
+}
+
+function checkFramePosition (pos1, pos2, fr1, fr2)
+{
+	fSpan  = pos2-pos1;
+	
+	if (fSpan>1) /* first followed by second*/
+	{
+		if (fSpan < fMin)
+		{
+			fMin = fSpan;
+			frame1 = fr1;
+			frame2 = fr2;
+			fStart = pos1+1;
+			fEnd   = pos2;
+		}
+	}	
+	return 0;
+}
+
diff --git a/res/TemplateBatchFiles/AAModelComparison.bf b/res/TemplateBatchFiles/AAModelComparison.bf
new file mode 100644
index 0000000..602a9e5
--- /dev/null
+++ b/res/TemplateBatchFiles/AAModelComparison.bf
@@ -0,0 +1,252 @@
+if (Rows (modelMatrixList) == 0)
+{
+	modelMatrixList = 
+	{
+	{"Equal Input", "EIAA.mdl", "19"}
+	{"Dayhoff","Dayhoff.mdl","0"}
+	{"Dayhoff+F","Dayhoff_F.mdl","19"}
+	{"JTT", "Jones.mdl", "0"}
+	{"JTT+F", "Jones_F.mdl", "19"}
+	{"WAG", "WAG.mdl", "0"}
+	{"WAG+F", "WAG_F.mdl", "19"}
+	{"rtREV", "rtREV.mdl", "0"}
+	{"rtREV+F", "rtREV_F.mdl", "19"}
+	{"mtMAM", 		  "mtMAM.mdl", "0"}
+	{"mtMAM+F", 	  "mtMAM_F.mdl", "19"}
+	{"mtREV 24",      "mtREV_24.mdl", "0"}
+	{"mtREV 24+F",    "mtREV_24_F.mdl", "19"}
+	{"HIV within",    "HIVwithin.mdl", "0"}
+	{"HIV within+F",  "HIVwithin+F.mdl", "19"}
+	{"HIV between",   "HIVbetween.mdl", "0"}
+	{"HIV between+F", "HIVbetween+F.mdl", "19"}
+	{"REV-1 step", "reducedREV.mdl", "19"}
+	{"REV",   "mtREV.mdl",    "19"}
+	};
+}
+
+/*___________________________________________________________________________________________________________*/
+
+function runAModel (modelID, fileName, xtraP, midx)
+{
+	ExecuteCommands ("#include \"TemplateModels/"+fileName+"\";"); 
+	Tree 					givenTree 			= treeString;
+	LikelihoodFunction 		lf 					= (filteredData,givenTree);
+	
+	GetString (lf_info, lf, -1);
+	locals = lf_info["Local Independent"];
+
+	if (Columns (branchLengthStash))
+	{
+		USE_LAST_RESULTS = 1;
+		for (_iv = 0; _iv < Columns (locals); _iv = _iv+1)
+		{
+			ExecuteCommands (locals[_iv] + "=1;\n");
+		}
+		currentBL = BranchLength (givenTree,0);
+		currentBN = BranchName	 (givenTree,-1);
+		for (_iv = 0; _iv < Columns (currentBN); _iv = _iv+1)
+		{
+			ExecuteCommands ("givenTree."+currentBN[_iv]+".t="+branchLengthStash[_iv]/currentBL+";");
+			
+		}
+	}
+	else
+	{
+		for (_iv = 0; _iv < Columns (locals); _iv = _iv+1)
+		{
+			ExecuteCommands (locals[_iv] + "=0.1;\n");
+		}
+		USE_LAST_RESULTS = 1;
+	}
+
+	Optimize (res,lf);
+	
+	fprintf (stdout, "| ", modelID);
+	for (k=0; k<maxModelWidth-Abs(modelID)-1; k=k+1)
+	{
+		fprintf (stdout, " ");
+	}
+
+	params = res[1][1]+xtraP;
+	AIC    =  2(-res[1][0]+params);
+	
+	if (filteredData.sites-params>1)
+	{
+		cAIC   = 2(-res[1][0]+params*(filteredData.sites/(filteredData.sites-params-1)));
+	}
+	else
+	{
+		cAIC = 0;
+	}
+	
+	branchLengths = BranchLength (givenTree,-1);
+	TL = 0;
+	for (k=Rows(branchLengths)*Columns(branchLengths)-1; k>=0; k=k-1)				  
+	{
+		TL = TL + branchLengths[k];
+	}
+
+	fprintf (stdout, "| ", Format (res[1][0],14,3), " | ", Format (params,5,0), " | ",
+						   Format (AIC, 9,3), " | ",);
+					
+	if (cAIC > 0)
+	{
+		 fprintf (stdout, Format (cAIC,11,3), " | ");
+	}
+	else
+	{
+		 fprintf (stdout, "    N/A     | ");
+	}
+		   
+	fprintf (stdout, Format (TL,11,3), " |\n", sepString);
+	
+	resultMatrix[midx][0] = res[1][0];
+	resultMatrix[midx][1] = params;
+	resultMatrix[midx][2] = AIC;
+	resultMatrix[midx][3] = cAIC;
+	resultMatrix[midx][4] = TL;
+	
+	if (AIC < bestAIC)
+	{
+		bestAIC 	= AIC;
+		bestAICidx  = midx;
+		branchLengthStash = BranchLength (givenTree,-1);
+	}
+	
+	if (cAIC > 0)
+	{
+		if (bestCAIC > cAIC)
+		{
+			bestCAIC = cAIC;
+			bestCAICidx = midx;
+			
+		}
+	}
+	
+	return 0;
+}
+
+
+/*___________________________________________________________________________________________________________*/
+
+
+
+maxModelWidth = 7;
+skipCodeSelectionStep = 0;
+
+ChoiceList (doREV, "Include REV?", 1, SKIP_NONE, "Yes", "Include REV and reduced REV models. CAUTION: these models take a long time to fit.",
+												 "No", "Only use empirical models");
+												 
+if (doREV < 0)
+{
+	return 0;
+}
+
+if (doREV == 0)
+{
+	#include "TemplateModels/chooseGeneticCode.def";
+	skipCodeSelectionStep = 1;
+}
+
+modelCount    = Rows (modelMatrixList) - 2*doREV;
+
+for (k=0; k<modelCount; k=k+1)
+{
+	maxModelWidth = Max(maxModelWidth,Abs (modelMatrixList[k][0])+2);
+}
+
+sepString = "";
+capString = "";
+sepString * 256;
+sepString * "+";
+
+capString * 256;
+capString * "| Model";
+
+for (k=0; k<maxModelWidth; k=k+1)
+{
+	sepString * "-";
+}
+
+for (k=0; k<maxModelWidth-6; k=k+1)
+{
+	capString * " ";
+}
+
+capString * "| Log Likelihood | #prms | AIC Score | c-AIC Score | Tree Length |\n";
+sepString * "+----------------+-------+-----------+-------------+-------------+\n";
+sepString * 0;
+capString * 0;
+
+branchLengthStash = 0;
+
+SKIP_MODEL_PARAMETER_LIST = 0;
+
+#include "TemplateModels/modelParameters2.mdl";
+if (modelType == 1)
+{
+	#include "TemplateModels/defineGamma.mdl";
+}
+
+if (modelType == 2)
+{
+	#include "TemplateModels/defineHM.mdl";
+}
+SKIP_MODEL_PARAMETER_LIST = 1;
+
+SetDialogPrompt ("Please load an amino-acid data file:");
+
+DataSet ds = ReadDataFile (PROMPT_FOR_FILE);
+DataSetFilter filteredData = CreateFilter (ds,1);
+
+fprintf (stdout,"\nRunning aminoacid model comparisons on ", LAST_FILE_PATH, "\n\nThe alignment has ",ds.species, " sequences and ", ds.sites, " sites\n");
+
+_DO_TREE_REBALANCE_ = 1;
+
+#include "queryTree.bf";
+
+resultMatrix = {modelCount, 5};
+
+fprintf (stdout, "\n",sepString,capString,sepString);
+
+bestAIC 	= 1e100;
+bestCAIC	= 1e100;
+bestAICidx	= 0;
+bestCAICidx = -1;
+
+for (mid=0; mid<modelCount; mid=mid+1)
+{
+	runAModel (modelMatrixList[mid][0], modelMatrixList[mid][1], 0+modelMatrixList[mid][2], mid);
+}	
+
+fprintf (stdout, "\n\nBest AIC model:\n\t", modelMatrixList[bestAICidx][0], " with the score of ", bestAIC);
+
+if (bestCAICidx>=0)
+{
+	fprintf (stdout, "\n\nBest c-AIC model:\n\t", modelMatrixList[bestCAICidx][0], " with the score of ", bestCAIC);
+}
+
+labelMatrix  = {{"Log-likelihood","Parameters","AIC","c-AIC","Total tree length",""}};
+
+aaString = "Model";
+
+for (fC = 0; fC < modelCount; fC = fC+1)
+{
+	aaString = aaString + ";" + modelMatrixList[fC][0];
+}
+
+USE_LAST_RESULTS = 0;
+
+labelMatrix[5] = aaString;
+skipCodeSelectionStep = 0;
+OpenWindow (CHARTWINDOW,{{"Model Fits"}
+						   {"labelMatrix"},
+						   {"resultMatrix"},
+						   {"Bar Chart"},
+						   {"Index"},
+						   {"c-AIC"},
+						   {"Model Index"},
+						   {""},
+						   {"AIC"}
+						   },
+						   "SCREEN_WIDTH-60;SCREEN_HEIGHT-60;30;30");
diff --git a/res/TemplateBatchFiles/AddABias.ibf b/res/TemplateBatchFiles/AddABias.ibf
new file mode 100644
index 0000000..23faa54
--- /dev/null
+++ b/res/TemplateBatchFiles/AddABias.ibf
@@ -0,0 +1,279 @@
+pThresh = 0.001;
+
+/*--------------------------------------------------------------------------------------------*/
+
+function AddABias (ModelMatrixName&, ModelMatrixName2&, biasedBase)
+{
+	ModelMatrixName2 = {20,20};
+	
+	t = 1;
+	c = 1;
+	_numericRateMatrix = ModelMatrixName;
+	
+	for (ri = 0; ri < 20; ri = ri+1)
+	{
+		for (ci = ri+1; ci < 20; ci = ci+1)
+		{
+			ModelMatrixName2[ri][ci] := _numericRateMatrix__[ri__][ci__] * t;
+			ModelMatrixName2[ci][ri] := _numericRateMatrix__[ri__][ci__] * t;
+		
+		}
+	}
+
+	if (biasedBase < 20)
+	{
+		global rateBiasTo 	 = 2;
+		global rateBiasFrom	:= 1/rateBiasTo;
+		
+		rateBiasTo   :>1;
+		for (ri = 0; ri < 20; ri = ri+1)
+		{
+			if (ri != biasedBase)
+			{
+				ModelMatrixName2[ri][biasedBase] := _numericRateMatrix__[ri__][biasedBase__] * t * rateBiasTo;
+				ModelMatrixName2[biasedBase][ri] := _numericRateMatrix__[ri__][biasedBase__] * t * rateBiasFrom;
+			}
+		}
+	}
+
+	return 1;
+}
+
+/*--------------------------------------------------------------------------------------------*/
+
+function AddABiasREL (ModelMatrixName&, ModelMatrixName2&, biasedBase)
+{
+	ModelMatrixName2 = {20,20};
+	
+	t = 1;	/* branch length, local parameter */
+	c = 1;	/* rate variation */
+	_numericRateMatrix = ModelMatrixName;
+	
+	/* the probability that site is undergoing biased substitution rates */
+	global	  P_bias = 0.1;  P_bias :< 0.5;
+	
+	
+	category catVar = (2,{{1-P_bias,P_bias}},MEAN,,{{0,1}},0,1);
+	
+	for (ri = 0; ri < 20; ri = ri+1)
+	{
+		for (ci = ri+1; ci < 20; ci = ci+1)
+		{
+			ModelMatrixName2[ri][ci] := _numericRateMatrix__[ri__][ci__] * t * c;
+			ModelMatrixName2[ci][ri] := _numericRateMatrix__[ri__][ci__] * t * c;
+		
+		}
+	}
+
+	if (biasedBase < 20)
+	{
+		global rateBiasTo 	  = 5.0;
+		global rateBiasFrom	 := 1/rateBiasTo;
+			
+		rateBiasTo    :>1;
+		relBias       :>1;	/* UNUSED ?!? */
+		for (ri = 0; ri < 20; ri = ri+1)
+		{
+			if (ri != biasedBase)
+			{
+				ModelMatrixName2[ri][biasedBase] := _numericRateMatrix__[ri__][biasedBase__] * t * c * ((catVar==1)*rateBiasTo+(catVar==0));
+				ModelMatrixName2[biasedBase][ri] := _numericRateMatrix__[ri__][biasedBase__] * t * c * ((catVar==1)*rateBiasFrom+(catVar==0));
+			}
+		}
+	}
+
+	return 1;
+}
+
+/*--------------------------------------------------------------------------------------------*/
+
+function runAFit (refClass,ancClass,mySiteID)
+{
+	singletonScale 			= 1;
+	DataSetFilter			aSite = CreateFilter (ds,1,siteIndex==mySiteID,speciesIndex<ds.species-2);
+	deltaDistr	   			= {20,1}["_MATRIX_ELEMENT_ROW_=="+ancClass];
+	LikelihoodFunction3	    singletonLF = (aSite, singletonTree, deltaDistr);
+	Optimize 				(resS, singletonLF);
+	AddABias 				(modelNameString,"biasedMatrix", refClass);
+	Model biasedModel 		= (biasedMatrix, vectorOfFrequencies, 1);
+	Tree biasedTree 		= treeString;
+	global biasedScale	 	= 1;
+	ReplicateConstraint 	("this1.?.t:=biasedScale*this2.?.t__",biasedTree,givenTree);
+	LikelihoodFunction3	    biasedLF = (aSite, biasedTree, deltaDistr);
+	Optimize 				(resB, biasedLF);
+	
+	checkIfDone = {};
+	checkIfDone ["ref"] 	  = AAString[refClass];
+	checkIfDone ["anc"] 	  = AAString[ancClass];
+	checkIfDone ["p"]		  = 1-CChi2(2(resB[1][0]-resS[1][0]),1);
+	checkIfDone ["bias"]	  = rateBiasTo;
+	checkIfDone ["LL1"]	  	  = resS[1][0];
+	checkIfDone ["LL2"]	  	  = resB[1][0];
+	checkIfDone ["s1"]	  	  = singletonScale;
+	checkIfDone ["s2"]	  	  = biasedScale;
+	
+	return checkIfDone;
+}
+
+/*--------------------------------------------------------------------------------------------*/
+
+function runAFit2 (ancClass,mySiteID)
+{
+	DataSetFilter			aSite = CreateFilter (ds,1,siteIndex==mySiteID,speciesIndex<ds.species-2);
+	COUNT_GAPS_IN_FREQUENCIES     = 0;
+	HarvestFrequencies			  (siteFreqs,aSite,1,1,1);
+	singletonScale 			= 1;
+
+	DataSetFilter			aSite = CreateFilter (ds,1,siteIndex==mySiteID,speciesIndex<ds.species-2);
+	deltaDistr	   			= {20,1}["_MATRIX_ELEMENT_ROW_=="+ancClass];
+	LikelihoodFunction3	    singletonLF = (aSite, singletonTree, deltaDistr);
+	Optimize 				(resS, singletonLF);
+	
+	checkIfDone = {};
+	checkIfDone ["anc"] 	  = AAString[ancClass];
+	checkIfDone ["LL1"]	  	  = resS[1][0];
+	checkIfDone ["s1"]	  	  = singletonScale;
+	checkIfDone ["p"]		  = 1;
+
+	minP					  = 1;
+
+	for (_resID = 0; _resID < 20; _resID = _resID + 1)
+	{
+		if (siteFreqs[_resID])
+		{
+			AddABias 				(modelNameString,"biasedMatrix", _resID);
+			Model biasedModel 		= (biasedMatrix, vectorOfFrequencies, 1);
+			Tree biasedTree 		= treeString;
+			global biasedScale	 	= 1;
+			ReplicateConstraint 	("this1.?.t:=biasedScale*this2.?.t__",biasedTree,givenTree);
+			LikelihoodFunction3	    biasedLF = (aSite, biasedTree, deltaDistr);
+			Optimize 				(resB, biasedLF);	
+			pv						  = Min(20*(1-CChi2(2(resB[1][0]-resS[1][0]),1)),1);
+			if (pv < minP)
+			{
+				minP = pv;
+				checkIfDone ["ref"] 	  = AAString[_resID];
+				checkIfDone ["bias"]	  = rateBiasTo;
+				checkIfDone ["LL2"]	  	  = resB[1][0];
+				checkIfDone ["s2"]	  	  = biasedScale;
+				checkIfDone ["p"]		  = minP;
+			}
+		}
+	}
+	
+
+	return checkIfDone;
+}
+
+/*--------------------------------------------------------------------------------------------*/
+
+function promptModel (dummy)
+{
+	ChoiceList	     (pickAModel,"Subsitution Model",1,SKIP_NONE, "HIV Within","HIV Within",
+							 								      "HIV Between","HIV Between",
+							 								      "JTT","JTT",
+							 								      "Flu H5N1", "Empirical model for H5N1 Influenza",
+																  "LG", "Le-Gasquel 2008",
+							 								      "REV", "Use general time-reversible model (WARNING: 189 rate parameters will be estimated from your alignment)");
+							 								     
+							 								    
+	if (pickAModel < 0)
+	{
+		return 0;
+	}
+
+	modelSTDINoverload = {};
+	modelSTDINoverload["2"] = "Rate variation";
+	modelSTDINoverload["3"] = "Beta-Gamma";
+	modelSTDINoverload["4"] = "4";
+	modelNameString = "_customAAModelMatrix";
+
+	if (pickAModel == 0)
+	{
+		modelSTDINoverload["0"] = HYPHY_LIB_DIRECTORY + "TemplateBatchFiles" + DIRECTORY_SEPARATOR + "TemplateModels" + DIRECTORY_SEPARATOR + "EmpiricalAA" + 
+								  DIRECTORY_SEPARATOR + "HIVWithin";
+	}
+
+	if (pickAModel == 1)
+	{
+		modelSTDINoverload["0"] = HYPHY_LIB_DIRECTORY + "TemplateBatchFiles" + DIRECTORY_SEPARATOR + "TemplateModels" + DIRECTORY_SEPARATOR + "EmpiricalAA" + 
+								  DIRECTORY_SEPARATOR + "HIVBetween";
+	}
+
+	if (pickAModel == 2)
+	{
+		modelSTDINoverload["0"] = HYPHY_LIB_DIRECTORY + "TemplateBatchFiles" + DIRECTORY_SEPARATOR + "TemplateModels" + DIRECTORY_SEPARATOR + "EmpiricalAA" + 
+								  DIRECTORY_SEPARATOR + "JTT";
+	}
+
+	if (pickAModel == 3)
+	{
+		modelSTDINoverload["0"] = HYPHY_LIB_DIRECTORY + "TemplateBatchFiles" + DIRECTORY_SEPARATOR + "TemplateModels" + DIRECTORY_SEPARATOR + "EmpiricalAA" + 
+								  DIRECTORY_SEPARATOR + "H5N1";
+	}
+	
+	if (pickAModel == 4)
+	{
+		modelSTDINoverload["0"] = HYPHY_LIB_DIRECTORY + "TemplateBatchFiles" + DIRECTORY_SEPARATOR + "TemplateModels" + DIRECTORY_SEPARATOR + "EmpiricalAA" + 
+								  DIRECTORY_SEPARATOR + "LG";
+	}
+
+	if (pickAModel < 5)
+	{
+		/* estimate base frequencies as model parameters */
+		modelSTDINoverload["1"]	= "ML Estimates";
+		modelPath = HYPHY_LIB_DIRECTORY + "TemplateBatchFiles" + DIRECTORY_SEPARATOR + "TemplateModels" + DIRECTORY_SEPARATOR + "Custom_AA_empirical.mdl";
+	}
+	else
+	{
+		modelNameString = "mtREVMatrix";
+		modelPath = HYPHY_LIB_DIRECTORY + "TemplateBatchFiles" + DIRECTORY_SEPARATOR + "TemplateModels" + DIRECTORY_SEPARATOR + "mtREV.mdl";	
+	}
+	
+	ExecuteAFile (modelPath,modelSTDINoverload);
+
+	if (dummy)
+	{
+		ChoiceList	     (pickATarget,"Target residue",1,SKIP_NONE, "Fixed","Fixed Sequence",
+							 								    "Inferred","Inferred Sequence");
+	}						 								    
+	return pickAModel;
+}
+
+/*--------------------------------------------------------------------------------------------*/
+
+function processAJob (mySiteID)
+{
+	if (MPI_NODE_COUNT > 1)
+	{
+		MPIReceive 					(-1,fromNode,mpiResults);
+		mySiteID 					= MPINodeStatus[fromNode-1];
+		ExecuteCommands 			(mpiResults);
+		checkIfDone 			  = _hyphyAssociativeArray;
+	}
+		
+	fprintf (stdout, "\nSite ", mySiteID+1, 
+					 "\n\t Character : ", checkIfDone ["anc"],"->",checkIfDone ["ref"],
+					 "\n\t Bias term : ", checkIfDone ["bias"],
+					 "\n\t LogL std  : ", checkIfDone ["LL1"],
+					 "\n\t LogL bias : ", checkIfDone ["LL2"],
+					 "\n\t Scale std : ", checkIfDone ["s1"],
+					 "\n\t Scale bias: ", checkIfDone ["s2"],
+					 "\n\t p-value   : ", checkIfDone ["p"]);
+					 
+	fprintf (outPath, "\nSite ", mySiteID+1, 
+					 "\n\t Character : ", checkIfDone ["anc"],"->",checkIfDone ["ref"],
+					 "\n\t Bias term : ", checkIfDone ["bias"],
+					 "\n\t LogL std  : ", checkIfDone ["LL1"],
+					 "\n\t LogL bias : ", checkIfDone ["LL2"],
+					 "\n\t Scale std : ", checkIfDone ["s1"],
+					 "\n\t Scale bias: ", checkIfDone ["s2"],
+					 "\n\t p-value   : ", checkIfDone ["p"]);
+
+	if (checkIfDone ["p"] < pThresh)
+	{
+		mx2 = smx;
+		strongEvidence[Abs(strongEvidence)] = mx2;
+	}
+	return fromNode-1;
+}
diff --git a/res/TemplateBatchFiles/AnalyzeCodonData.bf b/res/TemplateBatchFiles/AnalyzeCodonData.bf
new file mode 100644
index 0000000..7c80934
--- /dev/null
+++ b/res/TemplateBatchFiles/AnalyzeCodonData.bf
@@ -0,0 +1,53 @@
+NICETY_LEVEL = 3;
+
+#include "TemplateModels/chooseGeneticCode.def";
+#include "simpleBootstrap.bf";
+
+SetDialogPrompt ("Please specify a codon data file:");
+
+COUNT_GAPS_IN_FREQUENCIES = 0;
+VERBOSITY_LEVEL = 1;
+
+DataSet 	  ds 		   = ReadDataFile (PROMPT_FOR_FILE);
+DataSetFilter filteredData = CreateFilter (ds,3,"","",GeneticCodeExclusions);
+
+fprintf (stdout,"\n______________READ THE FOLLOWING DATA______________\n",ds);
+
+SelectTemplateModel(filteredData);
+
+_DO_TREE_REBALANCE_ = 1;
+#include "queryTree.bf";
+
+if (modelType)
+{
+	ChoiceList (branchLengths, "Branch Lengths", 1, SKIP_NONE,
+							   "Estimate", "Estimate branch lengths by ML",
+							   "Proportional to input tree", "Branch lengths are proportional to those in input tree");
+				 				  
+	if (branchLengths < 0)
+	{
+		return;
+	}
+	
+	if (branchLengths == 1)
+	{
+		global treeScaler = 1;
+		ReplicateConstraint ("this1.?.?:=treeScaler*this2.?.?__", givenTree, givenTree);
+	}
+}
+
+LikelihoodFunction lf = (filteredData,givenTree);
+
+Optimize	(res,lf);
+
+fprintf (stdout, "\n______________RESULTS______________\n",lf);
+
+/* compute syn and non-syn stencils for current genetic code */
+
+#include "categoryEcho.bf";
+
+GetString 				(sendMeBack,lf,-1);
+sendMeBack["LogL"] 		= res[1][0];
+sendMeBack["NP"] 		= res[1][1];
+
+return sendMeBack;
diff --git a/res/TemplateBatchFiles/AnalyzeCodonDataMPI.bf b/res/TemplateBatchFiles/AnalyzeCodonDataMPI.bf
new file mode 100644
index 0000000..b2b727e
--- /dev/null
+++ b/res/TemplateBatchFiles/AnalyzeCodonDataMPI.bf
@@ -0,0 +1,71 @@
+#include "TemplateModels/chooseGeneticCode.def";
+
+#include "simpleBootstrap.bf";
+
+SetDialogPrompt ("Please specify a codon data file:");
+
+DataSet ds = ReadDataFile (PROMPT_FOR_FILE);
+
+DataSetFilter filteredData = CreateFilter (ds,3,"","",GeneticCodeExclusions);
+
+fprintf (stdout,"\n______________READ THE FOLLOWING DATA______________\n",ds);
+
+SelectTemplateModel(filteredData);
+
+_DO_TREE_REBALANCE_ = 1;
+
+#include "queryTree.bf";
+
+
+cs = 0;
+lfString = "";
+lfString * 128;
+
+partCount = 10;
+perProc = filteredData.sites$(partCount);
+
+fprintf (stdout,"\n",perProc, " sites / processor\n");
+for (k=0; k<partCount; k=k+1)
+{
+	if (k < partCount-1)
+	{
+		upTo = cs+perProc;
+	}
+	else
+	{
+		upTo = filteredData.sites;
+	}
+	fc = "DataSetFilter filteredData_"+ k + "=CreateFilter (ds,3,\""+(cs*3)+"-"+(3*upTo-1)+"\",\"\",GeneticCodeExclusions);";
+	ExecuteCommands (fc);
+	ExecuteCommands ("Tree tree_"+ k + "=treeString;");
+	if (k)
+	{
+		ExecuteCommands ("ReplicateConstraint(\"this1.?.?:=this2.?.?\",tree_"+k+",tree_0);");
+		lfString * ",";
+	}	
+	cs = cs+perProc;
+	lfString * ("filteredData_"+k+",tree_"+k);
+}
+
+lfString * 0;
+
+ExecuteCommands ("LikelihoodFunction lf = ("+lfString+");");
+
+mxF81 = {{*,t,t,t}{t,*,t,t}{t,t,*,t}{t,t,t,*}};
+HarvestFrequencies (nucFreq,ds,1,1,1);
+Model M81 = (mxF81,nucFreq,1);
+Tree nucTree = treeString;
+DataSetFilter nucData = CreateFilter (ds,1);
+LikelihoodFunction nlf = (nucData,nucTree);
+Optimize (nuc_ref,nlf);
+
+ReplicateConstraint ("this1.?.synRate:=3*this2.?.t",tree_0,nucTree);
+ClearConstraints (tree_0);
+
+USE_LAST_RESULTS = 1;
+
+Optimize (res,lf);
+
+fprintf (stdout, "\n______________RESULTS______________\n",lf);
+
+#include "categoryEcho.bf";
diff --git a/res/TemplateBatchFiles/AnalyzeDiNucData.bf b/res/TemplateBatchFiles/AnalyzeDiNucData.bf
new file mode 100644
index 0000000..692f490
--- /dev/null
+++ b/res/TemplateBatchFiles/AnalyzeDiNucData.bf
@@ -0,0 +1,28 @@
+SetDialogPrompt ("Please specify a di-nucleotide (e.g. stem RNA) file:");
+
+DataSet ds = ReadDataFile (PROMPT_FOR_FILE);
+DataSetFilter filteredData = CreateFilter (ds,2);
+
+fprintf (stdout,"\n______________READ THE FOLLOWING DATA______________\n",ds);
+
+SelectTemplateModel(filteredData);
+
+_DO_TREE_REBALANCE_ = 1;
+
+#include "queryTree.bf";
+
+LikelihoodFunction lf = (filteredData,givenTree);
+
+timer = Time(0);
+
+USE_ADAPTIVE_VARIABLE_STEP = 0;
+
+Optimize (res,lf);
+
+timer = Time(0)-timer;
+
+
+fprintf (stdout, "\n______________RESULTS______________\nTime taken = ", timer, " seconds\nAIC Score = ", 
+				  2(res[1][1]-res[1][0]),"\n",lf);
+
+#include "categoryEcho.bf";
diff --git a/res/TemplateBatchFiles/AnalyzeNucDataFreq.bf b/res/TemplateBatchFiles/AnalyzeNucDataFreq.bf
new file mode 100644
index 0000000..7f46101
--- /dev/null
+++ b/res/TemplateBatchFiles/AnalyzeNucDataFreq.bf
@@ -0,0 +1,46 @@
+SetDialogPrompt ("Please specify a nuleotide data or aminoacid file:");
+
+DataSet ds = ReadDataFile (PROMPT_FOR_FILE);
+DataSetFilter filteredData = CreateFilter (ds,1);
+
+global estPiA;
+global estPiC;
+global estPiG;
+global estPiT;
+global sum;
+
+estPiA:<1;
+estPiC:<1;
+estPiG:<1;
+estPiT:=Abs(1-estPiA-estPiC-estPiG);
+sum := estPiA+estPiC+estPiG+estPiT;
+
+EMBED_FREQUENCY_DEPENDENCE = 1;
+
+SelectTemplateModel(filteredData);
+
+estPiA = .25;
+estPiC = .25;
+estPiG = .25;
+
+vectorOfFrequencies = {{estPiA/sum},{estPiC/sum},{estPiG/sum},{estPiT/sum}};
+
+fprintf (stdout,"\n",ds);
+
+_DO_TREE_REBALANCE_ = 1;
+
+#include "queryTree.bf";
+
+LikelihoodFunction lf = (filteredData,givenTree);
+
+Optimize (res,lf);
+
+fprintf (stdout, "\n",lf);
+
+HarvestFrequencies (obsFreq,filteredData,1,1,1);
+
+fprintf (stdout, "\nEstimated Frequencies:", vectorOfFrequencies, "\nObserved Frequencies", obsFreq);
+
+GetString (mbl, TrNModel,-1);
+
+fprintf (stdout,"\n",mbl,"\n");
diff --git a/res/TemplateBatchFiles/AnalyzeNucDataFreq2.bf b/res/TemplateBatchFiles/AnalyzeNucDataFreq2.bf
new file mode 100644
index 0000000..bbf4808
--- /dev/null
+++ b/res/TemplateBatchFiles/AnalyzeNucDataFreq2.bf
@@ -0,0 +1,58 @@
+SetDialogPrompt ("Please specify a nuleotide data or aminoacid file:");
+
+DataSet ds = ReadDataFile (PROMPT_FOR_FILE);
+DataSetFilter filteredData = CreateFilter (ds,1);
+
+global estPiA = 0.25;
+global estPiC = 0.25;
+global estPiG = 0.25;
+global estPiT = 0.25;
+global sum;
+
+estPiA:<1;
+estPiC:<1;
+estPiG:<1;
+estPiT:=Abs(1-estPiA-estPiC-estPiG);
+sum := estPiA+estPiC+estPiG+estPiT;
+
+global estPiAR = 0.25;
+global estPiCR = 0.25;
+global estPiGR = 0.25;
+global estPiTR = 0.25;
+global sumR;
+
+estPiAR:<1;
+estPiCR:<1;
+estPiGR:<1;
+estPiTR:=Abs(1-estPiAR-estPiCR-estPiGR);
+sumR := estPiAR+estPiCR+estPiGR+estPiTR;
+
+EMBED_FREQUENCY_DEPENDENCE = 1;
+
+SelectTemplateModel(filteredData);
+
+estPiA = .25;
+estPiC = .25;
+estPiG = .25;
+
+vectorOfFrequencies     = {{estPiA/sum},{estPiC/sum},{estPiG/sum},{estPiT/sum}};
+vectorOfFrequenciesRoot = {{estPiAR/sumR},{estPiCR/sumR},{estPiGR/sumR},{estPiTR/sumR}};
+
+fprintf (stdout,"\n",ds);
+
+_DO_TREE_REBALANCE_ = 0;
+ACCEPT_ROOTED_TREES = 1;
+#include "queryTree.bf";
+
+LikelihoodFunction3 lf = (filteredData,givenTree,vectorOfFrequenciesRoot);
+
+Optimize (res,lf);
+
+fprintf (stdout, "\n",lf);
+
+HarvestFrequencies (obsFreq,filteredData,1,1,1);
+
+fprintf (stdout, "\nEstimated Root Frequencies:\n", vectorOfFrequenciesRoot, 
+				 "\nEstimated Matrix Frequencies:\n", vectorOfFrequencies, 
+				 "\nObserved Frequencies\n", obsFreq);
+
diff --git a/res/TemplateBatchFiles/AnalyzeNucProtData.bf b/res/TemplateBatchFiles/AnalyzeNucProtData.bf
new file mode 100644
index 0000000..78a388d
--- /dev/null
+++ b/res/TemplateBatchFiles/AnalyzeNucProtData.bf
@@ -0,0 +1,28 @@
+_Genetic_Code   = 0;
+
+ExecuteAFile("simpleBootstrap.bf");
+
+SetDialogPrompt ("Please specify a nucleotide or amino-acid data file:");
+
+DataSet 	  ds 		   = ReadDataFile (PROMPT_FOR_FILE);
+DataSetFilter filteredData = CreateFilter (ds,1);
+
+fprintf (stdout,"\n______________READ THE FOLLOWING DATA______________\n",ds);
+
+SelectTemplateModel(filteredData);
+_DO_TREE_REBALANCE_ = 1;
+
+ExecuteAFile            ("queryTree.bf");
+
+LikelihoodFunction lf = (filteredData,givenTree);
+timer                 = Time(0);
+Optimize                (res,lf);
+timer                 = Time(0)-timer;
+
+fprintf (stdout, "\n______________RESULTS______________\nTime taken = ", timer, " seconds\nAIC Score = ", 
+				  2(res[1][1]-res[1][0]),"\n",lf);
+
+ExecuteAFile ("categoryEcho.bf");
+GetString	 (lfInfo, lf, -1);
+
+return {"Log(L)": res[1][0], "DF": res[1][1], "Tree": Format (givenTree,1,1)}
diff --git a/res/TemplateBatchFiles/AnalyzeNucProtData2.bf b/res/TemplateBatchFiles/AnalyzeNucProtData2.bf
new file mode 100644
index 0000000..96b2a58
--- /dev/null
+++ b/res/TemplateBatchFiles/AnalyzeNucProtData2.bf
@@ -0,0 +1,133 @@
+_Genetic_Code = 0;
+#include "simpleBootstrap.bf";
+
+SetDialogPrompt ("Please specify a nucleotide or amino-acid data file:");
+
+DataSet ds = ReadDataFile (PROMPT_FOR_FILE);
+DataSetFilter filteredData = CreateFilter (ds,1);
+
+fprintf (stdout,"\n______________READ THE FOLLOWING DATA______________\n",ds);
+
+SelectTemplateModel(filteredData);
+
+_DO_TREE_REBALANCE_ = 1;
+
+#include "queryTree.bf";
+
+LikelihoodFunction lf = (filteredData,givenTree);
+
+Optimize (res,lf);
+
+params = res[1][1]+19;
+
+fprintf (stdout, "\nLog(L)\t",res[1][0],"\nParameters:\t", params,"\nc-AIC Score = ", 
+				  2(-res[1][0]+params*(filteredData.sites/(filteredData.sites-params-1))));
+				  
+branchLengths = BranchLength (givenTree,-1);
+
+TL = 0;
+
+for (k=Rows(branchLengths)*Columns(branchLengths)-1; k>=0; k=k-1)				  
+{
+	TL = TL + branchLengths[k];
+}
+
+fprintf (stdout, "\nTotal tree length: ", TL, "\n");
+
+bName = TipName ( givenTree, 0);
+ExecuteCommands ("GetInformation (rmx,givenTree."+bName+");");
+
+SELECTED_CHART_DATA = {190,1};
+
+k = 0;
+
+for (h=0; h<20; h=h+1)
+{
+	for (v=h+1; v<20; v=v+1)
+	{
+		SELECTED_CHART_DATA[k] = rmx[h][v]/vectorOfFrequencies[v];
+		k=k+1;
+	}
+}
+
+SELECTED_CHART_DATA = SELECTED_CHART_DATA*(vectorOfFrequencies[9]/rmx[7][9]);
+
+
+count = Rows (SELECTED_CHART_DATA);
+
+sum  = 0;
+sum2 = 0;
+sum3 = 0;
+sum4 = 0;
+
+SELECTED_CHART_DATA = SELECTED_CHART_DATA%0;
+
+data_min  = SELECTED_CHART_DATA [0];
+data_max  = SELECTED_CHART_DATA [0];
+
+if (count%2)
+{
+	median = SELECTED_CHART_DATA[count/2];
+}
+else
+{
+	counter = count/2-1;
+	median = (SELECTED_CHART_DATA[counter]+SELECTED_CHART_DATA[counter+1])/2;
+}
+
+for (counter=0; counter < count; counter = counter+1)
+{
+	term = SELECTED_CHART_DATA [counter];
+	sum  = sum+term;
+	sum2 = sum2+term*term;
+	sum3 = sum3+term^3;
+	sum4 = sum4+term^4;
+	if (term < data_min)
+	{
+		data_min = term;
+	}
+	else
+	{
+		if (term > data_max)
+		{
+			data_max = term;
+		}
+	}
+}
+
+counter = (sum2-sum*sum/count)/(count-1);
+
+if (count > 3)
+{
+	sum4 = (-6*sum^4+12*count*sum^2*sum2-3(count-1)*count*sum2^2-4*count(count+1)*sum*sum3+count^2*(count+1)*sum4)/(count*(count-1)*(count-2)*(count-3));
+	sum4 = sum4/counter^2+3;
+}
+else
+{
+	sum4 = 0;
+}	
+
+if (count > 2)
+{
+	sum3 = (2*sum^3-3*count*sum*sum2+count^2*sum3)/(count*(count-1)*(count-2))/Sqrt(counter^2);
+}
+else
+{
+	sum3 = 0;
+}	
+
+fprintf (stdout, "\nCount    = ", count,
+				 "\nMean     = ", sum/count,
+				 "\nMedian   = ", median,
+				 "\nVariance = ", counter,
+				 "\nStd.Dev  = ", Sqrt (counter),
+				 "\nCOV      = ", Sqrt (counter)*count/sum,
+				 "\nSum      = ", sum,
+				 "\nSq. sum  = ", sum2,
+				 "\nSkewness = ", sum3,
+				 "\nKurtosis = ", sum4,
+				 "\nMin      = ", data_min,
+				 "\nMax      = ", data_max,"\n\n");
+
+
+#include "categoryEcho.bf";
diff --git a/res/TemplateBatchFiles/BGM.bf b/res/TemplateBatchFiles/BGM.bf
new file mode 100644
index 0000000..f1a2838
--- /dev/null
+++ b/res/TemplateBatchFiles/BGM.bf
@@ -0,0 +1,248 @@
+ExecuteAFile("bayesgraph.ibf");
+
+/* ________________________________________________________________	*/
+
+function checkNode (nID)
+{
+	if (nodeList[nID] == 0)
+	{
+		nodeList [nID] = 1;
+		fprintf (LAST_FILE_PATH, nID, "; ");
+	}
+	return 0;
+}
+
+/* ________________________________________________________________	*/
+
+function obtainBGMParameters (_lfID)
+{
+	ChoiceList (ambChoice, "Treatment of Ambiguities",1,SKIP_NONE,
+				"Averaged","All possible resolutions are considered and averaged.",
+				"Resolved","The most frequent (for that site) resolution is chosen.");
+
+	ExecuteAFile ("Utility/AncestralMapper.bf");
+	ExecuteAFile ("Utility/DescriptiveStatistics.bf");
+	ExecuteAFile ("Utility/GrabBag.bf");
+	
+	site_map				= {};
+	_SITE_RESULTS			= obtainSubstitutionMatrix ("lf",0,site_map,_OBSERVED_NS_);
+	site_map				= {};
+	branchCount				= Rows(_SITE_RESULTS);
+	nodeCount				= Columns(_SITE_RESULTS);
+	
+	substitution_counts		= ({1,branchCount}["1"])*_SITE_RESULTS;
+	substitution_stats		= GatherDescriptiveStats (substitution_counts);
+	
+	PrintDescriptiveStats   ("Counts of inferred non-synonymous substitution by site",substitution_stats);
+	/* determine the appropriate lower and upper bounds */
+	nontrivial_sites		= substitution_counts["_MATRIX_ELEMENT_VALUE_>0"] * ({nodeCount,1})["1"];
+	
+	if (nontrivial_sites[0] < 2)
+	{
+		fprintf (stdout, "\nERROR: BGM analysis requires at least 2 sites with non-synonymous susbtitutions\n");
+		return site_map;
+	}
+
+	for (k = 0+substitution_stats["Max"]; k >= 1; k=k-1)
+	{
+		nontrivial_sites		= (substitution_counts["_MATRIX_ELEMENT_VALUE_>=k"]) * ({nodeCount,1})["1"];
+		if (nontrivial_sites[0] >= 2)
+		{
+			break;
+		}
+	}
+	
+	cutoff					= prompt_for_a_value ("Include only sites with at least this many total substitutions",Max(1,substitution_stats["Median"]), Max(1,substitution_stats["Min"]), k, 1);
+
+	for (h=0; h<nodeCount;h=h+1)
+	{
+		if (substitution_counts[h]>=cutoff)
+		{	
+			site_map[Abs(site_map)] = h;
+		}
+	}
+	
+	nodeCount = Abs (site_map);
+	fprintf (stdout, "\nFound ", nodeCount, " sites with at least one non-synonymous mutation\n");
+	ChoiceList  (num_parents,"Maximum parents",1,NO_SKIP,
+				/*0*/ "1","Each site can be conditionally dependant on at most ONE other site. This setting permits the processing of large datasets quickly",
+				/*1*/ "2","Each site can be conditionally dependant on at most TWO other sites. This setting permits the recovery of more complex dependancies, but is computationally costly. It may be too slow/memory hungry for more than 100 sites.");		
+	
+	if (num_parents < 0)
+	{
+		return site_map;
+	}
+	num_parents = num_parents + 1; 
+	BGM_MCMC_DURATION					= prompt_for_a_value ("Run the MCMC chain for this many iterations",100000, 1000, 1e26, 1);
+	BGM_MCMC_BURNIN						= prompt_for_a_value ("How many burn-in steps before the main chain is run",BGM_MCMC_DURATION$10, 100, 1e26, 1);
+	BGM_MCMC_SAMPLES					= prompt_for_a_value ("Sample from the chain every so many steps",BGM_MCMC_DURATION$100, 10, BGM_MCMC_DURATION, 1);
+	
+	BGM_MCMC_SAMPLES					= Max(1,(BGM_MCMC_DURATION-BGM_MCMC_BURNIN)$BGM_MCMC_SAMPLES);
+
+	ChoiceList  (resample,"Ancestral Resampling",1,NO_SKIP,
+				/*0*/ "No","Base inference on the maximum likelihood ancestal reconstruction only",
+				/*1*/ "Yes","In addition to maximum likelihood ancestral states, sample a number (S) of alternative ancestral reconstructions to assess robustness. Runs S additional BGM analyses [MPI Enabled]");		
+
+	if (resample < 0)
+	{
+		return site_map;
+	}
+	if (resample > 0)
+	{
+		resample = prompt_for_a_value ("How many ancestral samples?",100,1,1e26,1);
+	}
+	
+	fprintf (stdout, "\nRunning a BGM on ", nodeCount, " nodes with", 
+					 "\n\t", Format(num_parents,20,0), " maximum parents per node",
+					 "\n\t", Format(BGM_MCMC_BURNIN,20,0), " burn-in steps",
+					 "\n\t", Format(BGM_MCMC_DURATION,20,0), " chain length",
+					 "\n\t", Format(BGM_MCMC_SAMPLES,20,0), " samples\n");
+			
+	if (resample > 0)
+	{
+		fprintf (stdout, "\nWill generate ", resample, " ancestral samples\n");
+	}
+	_bgm_data = {};
+	_bgm_data ["MAP"]				= site_map;
+	_bgm_data ["MATRIX"]			= _SITE_RESULTS;				 		 
+	_bgm_data ["BGM_MCMC_DURATION"] = BGM_MCMC_DURATION;				 		 
+	_bgm_data ["BGM_MCMC_BURNIN"]   = BGM_MCMC_BURNIN;				 		 
+	_bgm_data ["BGM_MCMC_SAMPLES"]  = BGM_MCMC_SAMPLES;				 		 
+	_bgm_data ["PARENTS"]			= num_parents;				 		 
+	_bgm_data ["RESAMPLE"]			= resample;				 		 
+	return _bgm_data;
+}
+
+/* ________________________________________________________________	*/
+
+function obtainSubstitutionMatrix (_lfID, sample_flag, site_map, _filterMatrix)
+{
+	_ancestral_id = _buildAncestralCacheInternal (_lfID, 0, _sample_flag);
+	
+	_fd					= _filterDimensions (_ancestral_id);
+	if (Abs(site_map) == 0)
+	{
+		for (_k = 0; _k < _fd[0]; _k=_k+1)
+		{
+			site_map[_k] = _k;
+		}
+	}
+	else
+	{
+		_fd[0]				= Abs (site_map);
+	}
+	_theMatrix			= {_fd[1],_fd[0]};
+	
+	for (_k = 0; _k < Abs(site_map); _k = _k+1)
+	{
+		_subsitution_matrix = _countSubstitutionsByBranchSite (_ancestral_id,site_map[_k],_filterMatrix);
+		for (_j = 0; _j < _fd[1]; _j=_j+1)
+		{
+			_theMatrix [_j][_k] = _subsitution_matrix[_j];
+		}
+	}
+	
+	_destroyAncestralCache (_ancestral_id);
+	return _theMatrix;
+}
+
+/* ________________________________________________________________	*/
+
+function handleMPIBGM (_bgm_data, jobID)
+{
+	if (MPI_NODE_COUNT <= 1)
+	{
+		if (jobID >= 0)
+		{				
+			_sample_results [jobID] = runBGM(_bgm_data);
+			fprintf (stdout, "Ancestral sample ", jobID + 1, "\n");
+		}
+	}
+	else
+	{
+		mpiNode = 0;
+		jobToSend = "";
+		if (jobID >= 0)
+		{
+			bgmFilePath = HYPHY_LIB_DIRECTORY + "TemplateBatchFiles" + DIRECTORY_SEPARATOR + "BGM.bf";
+			jobToSend * 128;
+			jobToSend * ("ExecuteAFile (\""+bgmFilePath+"\");");
+			jobToSend * (""+_bgm_data);
+			jobToSend * ("; return runBGM(_hyphyAssociativeArray);");
+			jobToSend * 0;
+			for (mpiNode = 0; mpiNode < MPI_NODE_COUNT-1; mpiNode=mpiNode+1)
+			{
+				if (bgm_MPI[mpiNode] < 0)
+				{
+					break;
+				}
+			}
+		}
+		doReceive = (jobID < 0) || (mpiNode == MPI_NODE_COUNT-1);
+		if (doReceive)
+		{
+			MPIReceive		(-1, mpiNode, _jobResult);
+			mpiNode			= mpiNode-1;
+			receivedID		= bgm_MPI [mpiNode];
+			fprintf (stdout, "Ancestral sample ", receivedID + 1, " from node ", mpiNode+1, "\n");
+			ExecuteCommands ("_sample_results [" + receivedID + "] = " + _jobResult);
+			bgm_MPI[mpiNode] = -1;
+		}
+		
+		if (Abs(jobToSend))
+		{
+			bgm_MPI[mpiNode] = jobID;
+			MPISend (mpiNode+1,jobToSend);
+		}
+	}
+	return 0;
+}
+
+
+function runBGM (_bgm_data) 
+{
+    num_nodes			=	Abs (_bgm_data["MAP"]);
+	num_parents			=	_bgm_data["PARENTS"];
+	num_parents = num_parents$1;
+	
+	branches			=	Rows(_bgm_data["MATRIX"]);
+	
+	BGM_MCMC_DURATION   = _bgm_data ["BGM_MCMC_DURATION"];				 		 
+	BGM_MCMC_BURNIN     = _bgm_data ["BGM_MCMC_BURNIN"];	
+	BGM_MCMC_SAMPLES	= _bgm_data ["BGM_MCMC_SAMPLES"];
+	
+	/* convert data to matrix form */
+	bgm_data_matrix = {branches,num_nodes};
+	
+	for (k = 0; k < num_nodes; k=k+1)
+	{
+		i = (_bgm_data["MAP"])[k];
+		for (j = 0; j < branches; j=j+1)
+		{
+			bgm_data_matrix[j][k] = (_bgm_data["MATRIX"])[j][i];
+		}
+	}
+	
+    nodes = {};
+	for (k = 0; k < num_nodes; k = k+1)
+	{
+	    /* Arguments:
+	        1. node name, must be a string
+	        2. maximum number of parents
+	        3. prior sample size - always uninformative (count split evenly across levels)
+	            - if we were truly Bayesian, we would let the user set informative priors..
+	        4. number of levels - always binary in this case (substitution mapped to branch)
+	    */
+	    node_name = ""+k;
+	    nodes[Abs(nodes)] = add_discrete_node (node_name, num_parents, 0, 2);
+	}
+	
+    BayesianGraphicalModel gen_bgm = (nodes);
+    
+    // no imputation of missing data (setting args to 0)
+    attach_data("gen_bgm", bgm_data_matrix, 0, 0, 0);
+    
+    bgm_result = order_MCMC("gen_bgm", BGM_MCMC_DURATION, BGM_MCMC_BURNIN, BGM_MCMC_SAMPLES);
+    
+	return bgm_result;
+}
diff --git a/res/TemplateBatchFiles/BS2007.bf b/res/TemplateBatchFiles/BS2007.bf
new file mode 100644
index 0000000..67b5a3c
--- /dev/null
+++ b/res/TemplateBatchFiles/BS2007.bf
@@ -0,0 +1,295 @@
+/* 1. include a file to define the genetic code
+   Note the use of base directory and path forming variables to make this analysis 
+   independent of directory placement
+ */
+
+incFileName = HYPHY_LIB_DIRECTORY+"TemplateBatchFiles"+DIRECTORY_SEPARATOR+"TemplateModels"+DIRECTORY_SEPARATOR+"chooseGeneticCode.def";
+ExecuteCommands  ("#include \""+incFileName+"\";");
+
+/* 2. load a codon partition  */
+
+SetDialogPrompt 			("Please locate a coding alignment:");
+DataSet 	  ds		   = ReadDataFile (PROMPT_FOR_FILE);
+DataSetFilter filteredData = CreateFilter (ds,3,"","",GeneticCodeExclusions);
+coding_path = LAST_FILE_PATH;
+
+fprintf (stdout, "\nLoaded a ", filteredData.species, " sequence alignment with ", filteredData.sites, " codons from\n",coding_path,"\n");
+
+/* 3. include a file to prompt for a tree */
+
+incFileName = HYPHY_LIB_DIRECTORY+"TemplateBatchFiles"+DIRECTORY_SEPARATOR+"queryTree.bf";
+ExecuteCommands  ("#include \""+incFileName+"\";");
+
+/* 4. Compute nucleotide counts by position for the F3x4 estimator */
+
+COUNT_GAPS_IN_FREQUENCIES = 0;
+HarvestFrequencies (baseFreqs,filteredData,3,1,1);
+COUNT_GAPS_IN_FREQUENCIES = 1;
+
+fprintf (stdout, "\nBase composition:\n\tA: ", Format (baseFreqs[0][0],10,5),",",Format (baseFreqs[0][1],10,5),",",Format (baseFreqs[0][2],10,5),
+								    "\n\tC: ", Format (baseFreqs[1][0],10,5),",",Format (baseFreqs[1][1],10,5),",",Format (baseFreqs[1][2],10,5), 
+									"\n\tG: ", Format (baseFreqs[2][0],10,5),",",Format (baseFreqs[2][1],10,5),",",Format (baseFreqs[2][2],10,5), 
+									"\n\tT: ", Format (baseFreqs[3][0],10,5),",",Format (baseFreqs[3][1],10,5),",",Format (baseFreqs[3][2],10,5), "\n");
+										  
+
+
+/* 6. define the GY94 rate matrix; for now each branch will have it's own
+   dS and dN, we will constrain them later */
+
+global kappa_inv = 1;
+
+ModelMatrixDimension = 64;
+for (h = 0; h<64; h=h+1) 
+{
+	if (_Genetic_Code[h]==10) /* stop codon */
+	{
+		ModelMatrixDimension = ModelMatrixDimension-1;
+	}
+}
+
+GY_Matrix = {ModelMatrixDimension,ModelMatrixDimension};
+hshift = 0;
+for (h=0; h<64; h=h+1)
+{
+	if (_Genetic_Code[h]==10) 
+	{
+		hshift = hshift+1;
+	}
+	else
+	{
+		vshift = hshift;
+		for (v = h+1; v<64; v=v+1)
+		{
+			diff = v-h;
+			if (_Genetic_Code[v]==10) 
+			{
+				vshift = vshift+1;
+			}
+			else
+			{
+			  	if ((h$4==v$4)||((diff%4==0)&&(h$16==v$16))||(diff%16==0)) /* one step */
+			  	{
+			  		if (h$4==v$4)
+			  		{
+			  			transition = v%4;
+			  			transition2= h%4;
+			  		}
+			  		else
+			  		{
+			  			if(diff%16==0)
+			  			{
+			  				transition = v$16;
+			  				transition2= h$16;
+			  			}
+			  			else
+			  			{
+			  				transition = v%16$4;
+			  				transition2= h%16$4;
+			  			}
+			  		}
+			  		if (_Genetic_Code[0][h]==_Genetic_Code[0][v]) /* synonymous */
+			  		{
+			  			if (Abs(transition-transition2)%2) /* transversion */
+			  			{
+			  				GY_Matrix[h-hshift][v-vshift] := kappa_inv*synRate;
+			  				GY_Matrix[v-vshift][h-hshift] := kappa_inv*synRate;
+			  			}
+			  			else
+			  			{
+			  				GY_Matrix[h-hshift][v-vshift] := synRate;
+			  				GY_Matrix[v-vshift][h-hshift] := synRate;			  			
+			  			}
+				  	}
+			  		else
+			  		{
+			  			if (Abs(transition-transition2)%2) /* transversion */
+			  			{
+			  				GY_Matrix[h-hshift][v-vshift] := kappa_inv*nonSynRate;
+			  				GY_Matrix[v-vshift][h-hshift] := kappa_inv*nonSynRate;
+			  			}
+			  			else
+			  			{
+			  				GY_Matrix[h-hshift][v-vshift] := nonSynRate;
+			  				GY_Matrix[v-vshift][h-hshift] := nonSynRate;			  			
+			  			}
+		  			}
+			  	}
+			 }
+		 }
+	}	
+}
+
+/*8. build codon frequencies (use the F3x4 estimator) */
+
+PIStop = 1.0;
+codonFreqs = {ModelMatrixDimension,1};
+hshift = 0;
+
+for (h=0; h<64; h=h+1)
+{
+	first  = h$16;
+	second = h%16$4;
+	third  = h%4;
+	if (_Genetic_Code[h]==10) 
+	{
+		hshift = hshift+1;
+		PIStop = PIStop-baseFreqs[first][0]*baseFreqs[second][1]*baseFreqs[third][2];
+		continue; 
+	}
+	codonFreqs[h-hshift]=baseFreqs[first][0]*baseFreqs[second][1]*baseFreqs[third][2];
+}
+
+codonFreqs = codonFreqs*(1.0/PIStop);
+
+/*9. define the codon model */
+
+Model GY_Model = (GY_Matrix,codonFreqs,1);
+
+/*10. Define the tree and pick the foreground branch, displaying a tree window to facilitate selection; 
+the latter step is executed for 2 of 3 model choices */
+
+Tree 	  givenTree1 	= treeString;
+Tree 	  givenTree2	= treeString;
+Tree 	  givenTree3	= treeString;
+Tree	  givenTree4	= treeString;
+
+USE_LAST_RESULTS    = 0;
+OPTIMIZATION_METHOD = 4;
+
+/* Approximate kappa and branch lengths using an HKY85 fit */
+
+HKY85_Matrix = {{*,t*kappa_inv,t,t*kappa_inv}
+				{t*kappa_inv,*,kappa_inv*t,t}
+				{t,t*kappa_inv,*,kappa_inv*t}
+				{t*kappa_inv,t,kappa_inv*t,*}};
+			
+HarvestFrequencies (nucFreqs,ds,1,1,1);
+Model HKY85_Model = (HKY85_Matrix,nucFreqs,1);
+
+Tree		  nucTree = treeString;
+DataSetFilter nucData = CreateFilter (ds,1);
+
+fprintf 					 (stdout, "Obtaining nucleotide branch lengths and kappa to be used as starting values...\n");
+LikelihoodFunction	nuc_lf = (nucData,nucTree);
+Optimize					 (nuc_mle,nuc_lf);
+fprintf 					 (stdout, "\n", Format (nucTree,1,1), "\nkappa=", Format (1/kappa_inv,8,3), "\n");
+
+USE_LAST_RESULTS = 1;
+
+mxTreeSpec = {5,1};
+mxTreeSpec [0] = "nucTree";
+mxTreeSpec [1] = "8240";
+mxTreeSpec [2] = "10,40,-10,-175,1";
+mxTreeSpec [3] = "";
+mxTreeSpec [4] = "";
+OpenWindow 		(TREEWINDOW, mxTreeSpec,"(SCREEN_WIDTH-50)/2;(SCREEN_HEIGHT-50)/2;30+(SCREEN_WIDTH-30)/2;45");				
+
+leafNodes	  = TipCount   (givenTree);			
+internalNodes = BranchCount(givenTree);
+
+choiceMatrix = {internalNodes+leafNodes,2};
+for (bc=0; bc<internalNodes; bc=bc+1)
+{
+	choiceMatrix[bc][0] = BranchName(givenTree,bc);
+	choiceMatrix[bc][1] = "Internal Branch Rooting " + givenTree[bc];
+}
+for (bc=0; bc<leafNodes; bc=bc+1)
+{
+	choiceMatrix[bc+internalNodes][0] = TipName(givenTree,bc);
+	choiceMatrix[bc+internalNodes][1] = "Leaf node " + choiceMatrix[bc+internalNodes][0];
+}
+
+ChoiceList  (stOption,"Choose the foreground branch",0,NO_SKIP,choiceMatrix);
+
+if (stOption[0] < 0)
+{
+	return -1;
+}
+
+fprintf (stdout, "\n\n", Columns (stOption)," foreground branch(es) set to: ", "\n");
+for (bc = 0; bc < Columns (stOption); bc = bc + 1)
+{
+	fprintf (stdout, choiceMatrix[stOption[bc]][0], "\n");
+}
+OpenWindow (CLOSEWINDOW, "Tree nucTree");
+	
+/* 15. Constrain dS and dN in the tree to based upon different models */
+
+global omega_1 = 0.25;
+global omega_2 = 0.5;
+global omega_3 = 1.5;
+
+omega_1 		:< 1;
+omega_2 		:< 1;
+omega_3 		:> 1;
+
+ClearConstraints (givenTree1);
+ClearConstraints (givenTree2);
+ClearConstraints (givenTree3);
+ClearConstraints (givenTree4);
+
+/* 16. define and optimize the likelihood function */
+
+bNames = BranchName   (givenTree,-1);
+nucBL  = BranchLength (nucTree,-1);
+
+for (bc=0; bc<Columns(bNames)-1; bc=bc+1)
+{
+	ExecuteCommands ("givenTree1."+bNames[bc]+".synRate		=nucTree."+bNames[bc]+".t;");
+	ExecuteCommands ("givenTree1."+bNames[bc]+".nonSynRate	=nucTree."+bNames[bc]+".t;");
+	ExecuteCommands ("givenTree2."+bNames[bc]+".synRate		=nucTree."+bNames[bc]+".t;");
+	ExecuteCommands ("givenTree2."+bNames[bc]+".nonSynRate	=nucTree."+bNames[bc]+".t;");
+	ExecuteCommands ("givenTree3."+bNames[bc]+".synRate		=nucTree."+bNames[bc]+".t;");
+	ExecuteCommands ("givenTree3."+bNames[bc]+".nonSynRate	=nucTree."+bNames[bc]+".t;");
+	ExecuteCommands ("givenTree4."+bNames[bc]+".synRate		=nucTree."+bNames[bc]+".t;");
+	ExecuteCommands ("givenTree4."+bNames[bc]+".nonSynRate	=nucTree."+bNames[bc]+".t;");
+}
+
+codBL  = BranchLength (givenTree1,-1);
+
+for (bc=0; bc<Columns(bNames)-1; bc=bc+1)
+{
+	if (nucBL[bc]>0)
+	{
+		scalingFactor = nucBL[bc]/codBL[bc];
+		ExecuteCommands ("givenTree1."+bNames[bc]+".synRate=nucTree."+bNames[bc]+".t*"+scalingFactor+";");
+		ExecuteCommands ("givenTree1."+bNames[bc]+".nonSynRate=nucTree."+bNames[bc]+".t*"+scalingFactor+";");
+		ExecuteCommands ("givenTree2."+bNames[bc]+".synRate=nucTree."+bNames[bc]+".t*"+scalingFactor+";");
+		ExecuteCommands ("givenTree2."+bNames[bc]+".nonSynRate=nucTree."+bNames[bc]+".t*"+scalingFactor+";");
+		ExecuteCommands ("givenTree3."+bNames[bc]+".synRate=nucTree."+bNames[bc]+".t*"+scalingFactor+";");
+		ExecuteCommands ("givenTree3."+bNames[bc]+".nonSynRate=nucTree."+bNames[bc]+".t*"+scalingFactor+";");
+		ExecuteCommands ("givenTree4."+bNames[bc]+".synRate		=nucTree."+bNames[bc]+".t;");
+		ExecuteCommands ("givenTree4."+bNames[bc]+".nonSynRate	=nucTree."+bNames[bc]+".t;");
+	}
+}
+
+for (bc = 0; bc < Columns (stOption); bc = bc + 1)
+{
+	bName = choiceMatrix[stOption[bc]][0];
+	ExecuteCommands ("givenTree1."+bName+".nonSynRate:=omega_1*givenTree1."+bName+".synRate");
+	ExecuteCommands ("givenTree2."+bName+".nonSynRate:=omega_2*givenTree2."+bName+".synRate");
+	ExecuteCommands ("givenTree3."+bName+".nonSynRate:=givenTree3."+bName+".synRate");
+	ExecuteCommands ("givenTree4."+bName+".nonSynRate:=omega_3*givenTree4."+bName+".synRate");
+}
+
+
+OPTIMIZATION_PRECISION = 0.001;
+
+global P_1 = 1/4;
+global P_2 = 1/3;
+global P_3 = 1/2;
+P_1 :< 1;
+P_2 :< 1;
+P_3 :< 1;
+
+
+fprintf (stdout, "\nFitting the model with selection...\n");
+
+LikelihoodFunction lf  = (filteredData, givenTree1, filteredData, givenTree2,filteredData, givenTree3,filteredData, givenTree4,
+						  "Log(P_1*SITE_LIKELIHOOD[0]+(1-P_1)*P_2*SITE_LIKELIHOOD[1]+(1-P_1)(1-P_2)*P_3*SITE_LIKELIHOOD[2]+(1-P_1)(1-P_2)(1-P_3)*SITE_LIKELIHOOD[3])");
+						  
+
+Optimize 		    (mles,lf);
+fprintf 			(stdout, lf);
+
+	
diff --git a/res/TemplateBatchFiles/BUSTED-SRV.bf b/res/TemplateBatchFiles/BUSTED-SRV.bf
new file mode 100644
index 0000000..70d380a
--- /dev/null
+++ b/res/TemplateBatchFiles/BUSTED-SRV.bf
@@ -0,0 +1,551 @@
+RequireVersion ("2.1320141020");
+
+_BUSTED_timers  = {3,1};
+busted.taskTimerStart (2);
+
+VERBOSITY_LEVEL				= 0;
+//LF_SMOOTHING_SCALER         = 0.1;
+
+
+LoadFunctionLibrary("GrabBag");
+LoadFunctionLibrary("CF3x4");
+LoadFunctionLibrary("TreeTools");
+
+
+// namespace 'utility' for convenience functions 
+LoadFunctionLibrary("lib2014/UtilityFunctions.bf");
+
+// namespace 'io' for interactive/datamonkey i/o functions
+LoadFunctionLibrary("lib2014/IOFunctions.bf");
+
+// namespace 'models.DNA.GTR' for the nucleotide GTR model
+LoadFunctionLibrary("lib2014/tasks/estimators.bf");
+
+
+io.displayAnalysisBanner ({"info" : "BUSTED (branch-site unrestricted statistical test of episodic diversification)
+                            uses a random effects branch-site model fitted jointly to all or a subset of tree branches
+                            in order to test for alignment-wide evidence of episodic diversifying selection. 
+                            This version of BUSTED allows synonymous substitution rates to vary from site to site (but not
+                            from branch to branch).
+                            Assuming
+                            there is evidence of positive selection (i.e. there is an omega > 1), BUSTED will also perform
+                            a quick evidence-ratio style analysis to explore which individual sites may have been subject to selection.",
+                           "version" : "1.00",
+                           "reference" : "In preparation, preprint at xxx",
+                           "authors" : "Sergei L Kosakovsky Pond, Ben Murrell, Sasha Murrell, and the UCSD VEG group",
+                           "contact" : "spond at ucsd.edu",
+                           "requirements" : "in-frame codon alignment and a phylogenetic tree (optionally annotated with {})"         
+                          } );
+
+
+
+/*------------------------------------------------------------------------------ 
+    BranchSiteTemplate Defines
+
+    BuildCodonFrequencies (obsF);
+    PopulateModelMatrix (ModelMatrixName&, EFV, synrateP, globalP, nonsynRateP);
+
+------------------------------------------------------------------------------*/
+
+
+LoadFunctionLibrary("BranchSiteTemplate");
+
+
+
+_BUSTED_json    = {"fits" : {},
+                  "timers" : {},
+                  "profiles" : {},
+                  "evidence ratios": {}
+                  };
+                  
+
+codon_data_info = utility.promptForGeneticCodeAndAlignment ("codon_data", "codon_filter");
+codon_data_info["json"] = codon_data_info["file"] + ".BUSTED-SRV.json";
+io.reportProgressMessage ("BUSTED", "Loaded an MSA with " + codon_data_info["sequences"] + " sequences and " + codon_data_info["sites"] + " codons from '" + codon_data_info["file"] + "'");
+
+codon_frequencies = utility.defineFrequencies ("codon_filter");
+tree_definition   = utility.loadAnnotatedTopology(1);
+
+busted.selected_branches = busted.io.selectBranchesToTest (tree_definition);
+_BUSTED_json ["test set"] = Join (",",Rows(busted.selected_branches));
+
+io.reportProgressMessage ("BUSTED", "Selected " + Abs (busted.selected_branches) + " branches as the test (foreground) set: " + Join (",", Rows (busted.selected_branches)));
+
+busted.model_definitions = busted.io.define_bsrel_models  ("FG","BG", codon_frequencies);
+io.reportProgressMessage ("BUSTED", "Obtaining initial branch lengths under the GTR model");
+busted.gtr_results = estimators.fitGTR     ("codon_filter", tree_definition, None);
+io.reportProgressMessage ("BUSTED", "Log(L) = " + busted.gtr_results["LogL"]);
+
+model.applyModelToTree ("busted.tree", tree_definition, "", {"DEFAULT" : (busted.model_definitions["BG"])["model"], 
+                                                             (busted.model_definitions["FG"])["model"] : Rows (busted.selected_branches)});
+                                                             
+                                                             
+                                                             
+busted.taskTimerStart (0);
+LikelihoodFunction busted.LF = (codon_filter, busted.tree);
+
+_BUSTED_json["background"] =  busted.hasBackground  ("busted.tree");
+
+global busted.T_scaler = 4;
+BUSTED.proportional_constraint = "busted.T_scaler";
+
+BUSTED.model_specification = {};
+BUSTED.model_specification[(busted.model_definitions["FG"])["model"]] = busted.model_definitions;
+BUSTED.model_specification[(busted.model_definitions["BG"])["model"]] = busted.model_definitions;
+
+estimators.applyExistingEstimates ("busted.LF", BUSTED.model_specification, busted.gtr_results);
+
+io.reportProgressMessage ("BUSTED", "Fitting the unconstrained branch-site model");
+
+USE_LAST_RESULTS = 1;
+OPTIMIZATION_PRECISION = 0.1;
+ASSUME_REVERSIBLE_MODELS = 1;
+
+busted.bls = busted.io.evaluate_branch_lengths (busted.model_definitions, "busted.tree", busted.selected_branches);
+Optimize (busted.MLE_HA, busted.LF);
+
+parameters.unconstrain_parameter_set ("busted.LF", {{terms.lf.local.constrained}});
+
+OPTIMIZATION_PRECISION = 0.001;
+Optimize (busted.MLE_HA, busted.LF);
+io.spoolLF ("busted.LF", codon_data_info["file"], None);
+busted_positive_class = busted.checkForPS (busted.model_definitions);
+io.reportProgressMessage ("BUSTED", "Log(L) = " + busted.MLE_HA[1][0] + ". Unrestricted class omega = " + busted_positive_class["omega"] + " (weight = " + busted_positive_class["weight"] + ")");
+
+
+busted.sample_size             =codon_data_info["sites"] * codon_data_info["sequences"];
+busted.taskTimerStop (0);
+
+busted.bls = busted.io.evaluate_branch_lengths (busted.model_definitions, "busted.tree", busted.selected_branches);
+busted.tavl         = busted.tree ^ 0;
+busted.renderString = PostOrderAVL2StringDistances (busted.tavl, busted.bls);
+UseModel (USE_NO_MODEL);
+Tree busted.T = busted.renderString;
+
+busted.json_store_lf                (_BUSTED_json, "Unconstrained model", 
+        busted.MLE_HA[1][0], busted.MLE_HA[1][1]+9, 
+        busted.getIC (busted.MLE_HA[1][0], busted.MLE_HA[1][1]+9, busted.sample_size) , 
+        _BUSTED_timers[0], 
+        +BranchLength (busted.T,-1), 
+        Format (busted.T, 1,1),
+        busted.model_definitions,
+        _BUSTED_json["background"]
+        );
+
+
+busted.profiles = {};
+(_BUSTED_json ["profiles"])["unconstrained"] = busted.computeSiteLikelihoods ("busted.LF");
+
+
+if (busted_positive_class["omega"] < 1 || busted_positive_class["weight"] < 1e-8) {
+    io.reportProgressMessage ("BUSTED", "No evidence for positive selection under the unconstrained model, skipping constrained model fitting");
+    _BUSTED_json ["test results"] = busted.runLRT (0, 0);
+} else {
+    busted.taskTimerStart (1);
+
+    io.reportProgressMessage ("BUSTED", "Fitting the branch-site model that disallows omega > 1 among foreground branches");
+    busted.constrainTheModel (busted.model_definitions);
+    (_BUSTED_json ["profiles"])["constrained"] = busted.computeSiteLikelihoods ("busted.LF");;
+    Optimize (busted.MLE_H0, busted.LF);
+    io.spoolLF ("busted.LF", codon_data_info["file"], "null");
+    (_BUSTED_json ["profiles"])["optimized null"] = busted.computeSiteLikelihoods ("busted.LF");;
+    io.reportProgressMessage ("BUSTED", "Log(L) = " + busted.MLE_H0[1][0]);
+    busted.LRT = busted.runLRT (busted.MLE_HA[1][0], busted.MLE_H0[1][0]);
+    
+    _BUSTED_json ["test results"] = busted.LRT;
+    
+    io.reportProgressMessage ("BUSTED", "Likelihood ratio test for episodic positive selection, p = " + busted.LRT["p"]);
+     busted.taskTimerStop (1);
+    
+    busted.bls = busted.io.evaluate_branch_lengths (busted.model_definitions, "busted.tree", busted.selected_branches);
+    busted.tavl         = busted.tree ^ 0;
+    busted.renderString = PostOrderAVL2StringDistances (busted.tavl, busted.bls);
+    UseModel (USE_NO_MODEL);
+    Tree busted.T = busted.renderString;
+
+    busted.json_store_lf                (_BUSTED_json, 
+                                        "Constrained model", busted.MLE_H0[1][0], 
+                                        busted.MLE_H0[1][1]+9, 
+                                        busted.getIC (busted.MLE_H0[1][0], busted.MLE_H0[1][1]+9, busted.sample_size) , 
+                                        _BUSTED_timers[1],
+                                         +BranchLength (busted.T,-1), 
+                                        Format (busted.T, 1,1),
+                                        busted.model_definitions,
+                                        _BUSTED_json["background"]
+                                       );
+                                       
+    (_BUSTED_json ["evidence ratios"])["constrained"] = busted.evidenceRatios ( (_BUSTED_json ["profiles"])["unconstrained"],  (_BUSTED_json ["profiles"])["constrained"]);
+    (_BUSTED_json ["evidence ratios"])["optimized null"] = busted.evidenceRatios ( (_BUSTED_json ["profiles"])["unconstrained"],  (_BUSTED_json ["profiles"])["optimized null"]);
+}
+
+busted.taskTimerStop (2);
+
+(_BUSTED_json ["timers"])["overall"] = _BUSTED_timers[2];
+(_BUSTED_json ["timers"])["unconstrained"] = _BUSTED_timers[0];
+(_BUSTED_json ["timers"])["constrained"] = _BUSTED_timers[1];
+
+USE_JSON_FOR_MATRIX = 1;
+fprintf (codon_data_info["json"], CLEAR_FILE, _BUSTED_json);
+USE_JSON_FOR_MATRIX = 0;
+
+//------------------------------------------------------------------------------ 
+// HELPER FUNCTIONS FROM HTHIS POINT ON
+//------------------------------------------------------------------------------ 
+
+
+//------------------------------------------------------------------------------ 
+function busted.hasBackground (id) {
+   ExecuteCommands ("GetInformation (busted.nodeMap, `id`)");
+   busted.nodeMap = Columns(busted.nodeMap);
+   return Rows (busted.nodeMap) * Columns (busted.nodeMap) > 1; 
+}
+
+//------------------------------------------------------------------------------ 
+function busted.getRateDistribution (model_description, key) {
+  busted.getRateInformation.rate_classes = Abs ((model_description[key])["omegas"]);
+  busted.getRateInformation.omega_info = {busted.getRateInformation.rate_classes,2};
+  
+  for (busted.getRateInformation.k = 0; busted.getRateInformation.k < busted.getRateInformation.rate_classes; busted.getRateInformation.k += 1) {
+    busted.getRateInformation.omega_info[busted.getRateInformation.k][0] = Eval (((model_description[key])["omegas"])[busted.getRateInformation.k]);
+    busted.getRateInformation.omega_info[busted.getRateInformation.k][1] = Eval (((model_description[key])["weights"])[busted.getRateInformation.k]);
+  }
+  return busted.getRateInformation.omega_info;
+}
+
+
+//------------------------------------------------------------------------------ 
+function busted._aux.free_lengths (key, value) {
+    ExecuteCommands ("busted.tree." + key + ".t = busted.tree." + key + ".t");
+}
+
+
+//------------------------------------------------------------------------------ 
+function busted.checkForPS (model_parameters) {
+   return {"omega" :Eval (((model_parameters["FG"])["omegas"])[2]),
+           "weight" : Eval (((model_parameters["FG"])["weights"])[2])};
+           
+}
+
+//------------------------------------------------------------------------------ 
+function busted.constrainTheModel (model_parameters) {
+  ExecuteCommands (((model_parameters["FG"])["omegas"])[2] + ":=1");           
+}
+
+//------------------------------------------------------------------------------ 
+function busted.computeSiteLikelihoods (id) {
+   ConstructCategoryMatrix (_siteLike, *id, SITE_LOG_LIKELIHOODS);
+   return _siteLike;         
+}
+
+
+
+//------------------------------------------------------------------------------ 
+function busted.runLRT (ha, h0) {
+    return {"LR" : 2*(ha-h0),
+            "p" : 1-CChi2 (2*(ha-h0),2)};
+}
+
+//------------------------------------------------------------------------------ 
+lfunction busted._aux.stick_breaking (parameters) {
+    left_over = ""; 
+    weights = {};
+    for (k = 0; k < Abs (parameters); k += 1) {
+        weights [k] = left_over + parameters[k];
+        left_over += "(1-" + parameters[k] + ")*";
+    }
+    weights[k] = left_over[0][Abs (left_over)-2];
+    return weights;
+}
+
+//------------------------------------------------------------------------------ 
+function busted._aux.define_srv_category (rates, weights, cat_name) {
+
+    rate_count           = Abs (weights);
+    expected_value  = "(" + weights[0] + ")*(" + rates[0] + ")";
+    
+    cat_freqs = "`cat_name`.weights";
+    cat_rates = "`cat_name`.rates";
+    cat_norm  = "`cat_name`.normalizer";
+    ExecuteCommands ("`cat_freqs` = {rate_count,1}");
+    ExecuteCommands ("`cat_rates` = {rate_count,1}");
+    ExecuteCommands ("`cat_freqs`[0] := " + weights[0]); 
+
+    for (k = 1; k < rate_count; k+=1) {
+        expected_value += "+(" + weights[k] + ")*(" + rates[k] + ")";
+        ExecuteCommands ("`cat_freqs`[k] := " + weights[k]); 
+    }
+
+    ExecuteCommands ("global `cat_norm` := `expected_value`");
+
+    for (k = 0; k < rate_count; k+=1) {
+        ExecuteCommands ("`cat_rates`[k] := (" + rates[k] + ")/`cat_norm`"); 
+    }
+    //category c  = ("+resp+", categFreqMatrix , MEAN, ,categRateMatrix, 0, 1e25);\n\n"
+    ExecuteCommands ("category `cat_name`  = (rate_count, `cat_freqs`, MEAN, , `cat_rates`, 0,1e25)");  
+}
+
+//------------------------------------------------------------------------------ 
+function busted._aux.define_bsrel_model (id,Q,weights,freqs) {
+    rate_count = Abs (Q);
+    components = {};
+    length = "";
+    Eval ("`id`_eqf = freqs");
+
+    for (k = 0; k < rate_count; k+=1) {
+        components[k] = "Exp(" + Q[k] + ")*" + weights[k];
+        ExecuteCommands ("Model busted._aux.define_bsrel_model_bl = (" + Q[k] + ",`id`_eqf,0)");
+        GetString (blExp, busted._aux.define_bsrel_model_bl, -1);
+        if (k) {
+            length += "+";
+        }
+        length += "(`blExp`)*" + weights[k];
+    }
+    
+    ExecuteCommands ("Model `id` =(\"" + Join("+",components) + "\",`id`_eqf,EXPLICIT_FORM_MATRIX_EXPONENTIAL);");
+    return length;
+}
+
+//------------------------------------------------------------------------------ 
+function busted._aux.define_parameter (key, value) {
+   ExecuteCommands ("global `value` :< 1;");
+   ExecuteCommands ("`value` :> 0;");
+   ExecuteCommands ("`value` = " + busted.init_values[key]);
+}
+
+//------------------------------------------------------------------------------ 
+function busted._aux.define_srv_rate (key, value) {
+   ExecuteCommands ("global `value`;");
+   ExecuteCommands ("`value` :> 0;");
+   ExecuteCommands ("`value` = " + busted.init_values[key]);
+}
+
+
+//------------------------------------------------------------------------------ 
+function busted.io.evaluate_branch_lengths (model_parameters, tree_id, fg_set) {
+    busted.io.evaluate_branch_lengths.res    = {};
+    busted.io.evaluate_branch_lengths.bnames = BranchName (*tree_id, -1);
+    for (busted.io.evaluate_branch_lengths.k = 0; 
+         busted.io.evaluate_branch_lengths.k < Columns (busted.io.evaluate_branch_lengths.bnames)-1;
+         busted.io.evaluate_branch_lengths.k += 1) {
+         
+         busted.io.evaluate_branch_lengths.lexpr = "";
+         
+         busted.io.evaluate_branch_lengths.b_name = busted.io.evaluate_branch_lengths.bnames[busted.io.evaluate_branch_lengths.k];
+         if (fg_set [busted.io.evaluate_branch_lengths.b_name]) {
+            //fprintf (stdout, busted.io.evaluate_branch_lengths.b_name, "=>FG\n");
+            busted.io.evaluate_branch_lengths.lexpr = (model_parameters["FG"])["length"];
+         } else {
+            //fprintf (stdout, busted.io.evaluate_branch_lengths.b_name, "=>BG\n");
+            busted.io.evaluate_branch_lengths.lexpr = (model_parameters["BG"])["length"];
+         }
+         Eval (model_parameters["length parameter"] + " = `tree_id`.`busted.io.evaluate_branch_lengths.b_name`." + model_parameters["length parameter"]);
+         busted.io.evaluate_branch_lengths.res [ busted.io.evaluate_branch_lengths.b_name ] =
+            Eval (busted.io.evaluate_branch_lengths.lexpr);
+    }
+    return busted.io.evaluate_branch_lengths.res;
+}
+
+//------------------------------------------------------------------------------ 
+function busted.io.define_bsrel_models (foreground_id, background_id, frequencies) {
+
+    model_parameters = 
+        {"FG": {"omegas" : {}, "weights" : {}, "f" : {}, "Q" : {}, "length" : ""},
+         "BG": {"omegas" : {}, "weights" : {}, "f" : {}, "Q" : {}, "length" : ""},
+         "SRV": {"omegas": {}, "weights"  : {}, "f" : {}},
+         "parameters" : {"global" : {}, "local" : {}}
+          };
+    
+    for (k = 1; k <= 3; k +=1) {
+        tag = "" + k;
+        ((model_parameters["FG"])["omegas"]) + "`foreground_id`_omega_`tag`";
+        ((model_parameters["BG"])["omegas"]) + "`background_id`_omega_`tag`";
+        ((model_parameters["SRV"])["omegas"]) + "srv.syn_rate_`tag`";
+        if (k < 3) {
+            ((model_parameters["SRV"])["f"]) + "srv.f_`tag`";
+            ((model_parameters["FG"])["f"]) + "`foreground_id`_f_`tag`";
+            ((model_parameters["BG"])["f"]) + "`background_id`_f_`tag`";
+        }
+        
+    }
+    
+    
+    
+    ((model_parameters["FG"])["weights"])   = busted._aux.stick_breaking (((model_parameters["FG"])["f"]));
+    ((model_parameters["BG"])["weights"])   = busted._aux.stick_breaking (((model_parameters["BG"])["f"]));
+    ((model_parameters["SRV"])["weights"])  = busted._aux.stick_breaking (((model_parameters["SRV"])["f"]));
+    
+    
+     
+    busted.init_values = {"0" : 0.1, "1" : 0.5, "2" : 1};
+
+    ((model_parameters["FG"])["omegas"])["busted._aux.define_parameter"][""];
+    ((model_parameters["BG"])["omegas"])["busted._aux.define_parameter"][""];
+
+    busted.init_values = {"0" : 0.25, "1" : 1, "2" : 3};
+    ((model_parameters["SRV"])["omegas"])["busted._aux.define_srv_rate"][""];
+    
+    
+    Eval (((model_parameters["FG"])["omegas"])[2] + ":<1e26");
+    Eval (((model_parameters["FG"])["omegas"])[2] + ":>1");
+    Eval (((model_parameters["BG"])["omegas"])[2] + ":<1e26");
+
+    busted.init_values = {"0" : 0.8, "1" : 0.75};
+    
+    ((model_parameters["FG"])["f"])["busted._aux.define_parameter"][""];
+    ((model_parameters["BG"])["f"])["busted._aux.define_parameter"][""];
+    ((model_parameters["SRV"])["f"])["busted._aux.define_parameter"][""];
+    
+    busted._srv_cat_name = "busted.srv.cat";
+    busted._aux.define_srv_category (((model_parameters["SRV"])["omegas"]), ((model_parameters["SRV"])["weights"]), busted._srv_cat_name);
+
+
+    for (k = 1; k <= 3; k +=1) {
+        
+        ((model_parameters["FG"])["Q"]) + ("Q_`foreground_id`_" + k);
+        PopulateModelMatrix			  (((model_parameters["FG"])["Q"])[k-1],  frequencies["nucleotide"], "t*`busted._srv_cat_name`",((model_parameters["FG"])["omegas"])[k-1], "");
+        ((model_parameters["BG"])["Q"]) + ("Q_`background_id`_" + k);
+        PopulateModelMatrix			  (((model_parameters["BG"])["Q"])[k-1],  frequencies["nucleotide"], "t*`busted._srv_cat_name`",((model_parameters["BG"])["omegas"])[k-1], "");
+    }
+    
+    (model_parameters["BG"])["model"] = "`background_id`_model";
+    (model_parameters["BG"])["length"] = busted._aux.define_bsrel_model ("`background_id`_model", (model_parameters["BG"])["Q"], (model_parameters["BG"])["weights"], frequencies["codon"]);
+    (model_parameters["FG"])["model"] = "`foreground_id`_model";
+    (model_parameters["FG"])["length"] = busted._aux.define_bsrel_model ("`foreground_id`_model", (model_parameters["FG"])["Q"], (model_parameters["FG"])["weights"], frequencies["codon"]);
+    
+    ((model_parameters["parameters"])["global"])[terms.nucleotideRate ("A","C")] = "AC";
+    ((model_parameters["parameters"])["global"])[terms.nucleotideRate ("A","T")] = "AT";
+    ((model_parameters["parameters"])["global"])[terms.nucleotideRate ("C","G")] = "CG";
+    ((model_parameters["parameters"])["global"])[terms.nucleotideRate ("C","T")] = "CT";
+    ((model_parameters["parameters"])["global"])[terms.nucleotideRate ("G","T")] = "GT";
+     model_parameters["set-branch-length"] = "busted.aux.copy_branch_length";
+
+    ((model_parameters["parameters"])[terms.local])[terms.timeParameter ()] = "t";
+    
+     model_parameters["length parameter"] = "t";
+         
+     return model_parameters;
+}
+
+function busted.aux.copy_branch_length (model, value, parameter) {
+
+    busted.aux.copy_branch_length.t = ((model["parameters"])["local"])[terms.timeParameter ()];
+    
+    if (Abs (BUSTED.proportional_constraint)) {
+        Eval ("`parameter`.`busted.aux.copy_branch_length.t` := `BUSTED.proportional_constraint` * " + value);        
+    } else {
+        Eval ("`parameter`.`busted.aux.copy_branch_length.t` = " + value);
+    }
+    
+    
+    
+    if (Type (relax.aux.copy_branch_length.k) == "String") {
+        Eval ("`parameter`.`relax.aux.copy_branch_length.k` = 1");
+    }
+}
+
+//------------------------------------------------------------------------------ 
+lfunction busted.io.selectBranchesToTest (tree_definition) {
+    
+    extra_models = {};
+    
+    for (k = 0; k < Columns (tree_definition["model_list"]); k += 1) {
+        model_id = (tree_definition["model_list"])[k];
+        if (model_id != "") {
+            extra_models  + model_id;
+        }
+    }
+    
+    
+    UseModel (USE_NO_MODEL);
+    ExecuteCommands ("Topology  T = " + tree_definition["string"]);
+    tAVL = T^0;
+
+    totalBranchCount = Abs (tAVL) - 2;
+
+    selectedBranches = {};
+    selectTheseForTesting = {totalBranchCount + 3 + Abs (extra_models), 2};
+    selectTheseForTesting [0][0] = "All";  selectTheseForTesting [0][1] = "Test for selection on all branches jointly";
+    selectTheseForTesting [1][0] = "Internal";  selectTheseForTesting [1][1] = "Test for selection on all internal branches jointly";
+    selectTheseForTesting [2][0] = "Leaves";  selectTheseForTesting [2][1] = "Test for selection on all terminal branches jointly";
+    
+    for (k = 0; k < Abs (extra_models); k+=1) {
+        selectTheseForTesting [3+k][0] = "Set " + extra_models[k];  
+        selectTheseForTesting [3+k][1] = "Test for selection on all branches labeled with {" + extra_models[k] + "} jointly";
+    }
+
+    for (k = 0; k < totalBranchCount; k += 1) {
+        selectTheseForTesting [k+3 + Abs (extra_models)][0] = (tAVL[k+1])["Name"];
+        selectTheseForTesting [k+3 + Abs (extra_models)][1] = "Add branch '" + selectTheseForTesting [k+3 + Abs (extra_models)][0] + "' to the test set";
+
+    }
+
+    ChoiceList  (whichBranchesToTest,"Which branches to test?",0,NO_SKIP,selectTheseForTesting);
+
+    for (k = 0; k < Columns (whichBranchesToTest); k += 1) {
+       if (whichBranchesToTest [k] < 3) {
+            for (k2 = 1; k2 <=  totalBranchCount; k2 += 1) {
+                if (whichBranchesToTest[k] == 0 || whichBranchesToTest[k] == 1 && Abs ((tAVL[k2])["Children"]) > 0 || whichBranchesToTest[k] == 2 && Abs ((tAVL[k2])["Children"]) == 0) {
+                    selectedBranches [(tAVL[k2])["Name"]] = 1;
+                }
+            }
+            return selectedBranches;
+        } 
+        if (whichBranchesToTest [k] < 3 + Abs (extra_models)) {
+            model_key = extra_models [whichBranchesToTest [k] - 3];
+            for (k2 = 1; k2 <=  totalBranchCount; k2 += 1) {
+                bName = (tAVL[k2])["Name"];
+                if ((tree_definition["model_map"])[bName] == model_key) {
+                    selectedBranches [bName] = 1;
+                }
+            }       
+            return selectedBranches;     
+        }
+        
+        selectedBranches [(tAVL[whichBranchesToTest [k] - 2 - Abs (extra_models)])["Name"]] = 1;
+    }
+    
+    return selectedBranches;
+}
+
+//------------------------------------------------------------------------------------------------------------------------
+
+function busted.evidenceRatios (ha, h0) {
+    sites = Rows (ha) * Columns (ha);
+    return ha["Exp(_MATRIX_ELEMENT_VALUE_-h0[_MATRIX_ELEMENT_COLUMN_])"];
+}
+
+//------------------------------------------------------------------------------------------------------------------------
+
+function busted.taskTimerStart (index) {
+    _BUSTED_timers[index] = Time(1);
+}
+
+function busted.taskTimerStop (index) {
+    _BUSTED_timers[index] = Time(1) - _BUSTED_timers[index];
+
+}
+
+//------------------------------------------------------------------------------------------------------------------------
+
+function busted.getIC (logl,params,samples) {
+    return -2*logl + 2*samples/(samples-params-1)*params;
+}
+
+
+//------------------------------------------------------------------------------------------------------------------------
+
+lfunction busted.json_store_lf (json, name, ll, df, aicc, time, tree_length, tree_string, defs, has_bg) {
+    (json["fits"])[name] = {"log-likelihood": ll,
+                            "parameters": df,
+                            "AIC-c" : aicc,
+                            "runtime" : time,
+                            "tree length" : tree_length,
+                            "tree string" : tree_string,
+                            "rate distributions" : {}};
+                            
+    (((json["fits"])[name])["rate distributions"])["FG"] = busted.getRateDistribution (defs, "FG");
+    if (has_bg) {
+        (((json["fits"])[name])["rate distributions"])["BG"] = busted.getRateDistribution (defs, "BG");
+    }
+    (((json["fits"])[name])["rate distributions"])["SRV"] = busted.getRateDistribution (defs, "SRV");
+}
diff --git a/res/TemplateBatchFiles/BUSTED.bf b/res/TemplateBatchFiles/BUSTED.bf
new file mode 100644
index 0000000..560bb72
--- /dev/null
+++ b/res/TemplateBatchFiles/BUSTED.bf
@@ -0,0 +1,499 @@
+RequireVersion ("2.1320141020");
+
+_BUSTED_timers  = {3,1};
+busted.taskTimerStart (2);
+
+VERBOSITY_LEVEL				= 0;
+LF_SMOOTHING_SCALER         = 0.1;
+
+
+LoadFunctionLibrary("GrabBag");
+LoadFunctionLibrary("CF3x4");
+LoadFunctionLibrary("TreeTools");
+
+
+// namespace 'utility' for convenience functions 
+LoadFunctionLibrary("lib2014/UtilityFunctions.bf");
+
+// namespace 'io' for interactive/datamonkey i/o functions
+LoadFunctionLibrary("lib2014/IOFunctions.bf");
+
+// namespace 'models.DNA.GTR' for the nucleotide GTR model
+LoadFunctionLibrary("lib2014/tasks/estimators.bf");
+
+
+io.displayAnalysisBanner ({"info" : "BUSTED (branch-site unrestricted statistical test of episodic diversification)
+                            uses a random effects branch-site model fitted jointly to all or a subset of tree branches
+                            in order to test for alignment-wide evidence of episodic diversifying selection. Assuming
+                            there is evidence of positive selection (i.e. there is an omega > 1), BUSTED will also perform
+                            a quick evidence-ratio style analysis to explore which individual sites may have been subject to selection.",
+                           "version" : "1.00",
+                           "reference" : "In preparation, preprint at xxx",
+                           "authors" : "Sergei L Kosakovsky Pond, Ben Murrell, Sasha Murrell, and the UCSD VEG group",
+                           "contact" : "spond at ucsd.edu",
+                           "requirements" : "in-frame codon alignment and a phylogenetic tree (optionally annotated with {})"         
+                          } );
+
+
+
+/*------------------------------------------------------------------------------ 
+    BranchSiteTemplate Defines
+
+    BuildCodonFrequencies (obsF);
+    PopulateModelMatrix (ModelMatrixName&, EFV, synrateP, globalP, nonsynRateP);
+
+------------------------------------------------------------------------------*/
+
+
+LoadFunctionLibrary("BranchSiteTemplate");
+
+
+
+_BUSTED_json    = {"fits" : {},
+                  "timers" : {},
+                  "profiles" : {},
+                  "evidence ratios": {}
+                  };
+                  
+
+codon_data_info = utility.promptForGeneticCodeAndAlignment ("codon_data", "codon_filter");
+codon_data_info["json"] = codon_data_info["file"] + ".BUSTED.json";
+io.reportProgressMessage ("BUSTED", "Loaded an MSA with " + codon_data_info["sequences"] + " sequences and " + codon_data_info["sites"] + " codons from '" + codon_data_info["file"] + "'");
+
+codon_frequencies = utility.defineFrequencies ("codon_filter");
+tree_definition   = utility.loadAnnotatedTopology(1);
+
+busted.selected_branches = busted.io.selectBranchesToTest (tree_definition);
+_BUSTED_json ["test set"] = Join (",",Rows(busted.selected_branches));
+
+io.reportProgressMessage ("BUSTED", "Selected " + Abs (busted.selected_branches) + " branches as the test (foreground) set: " + Join (",", Rows (busted.selected_branches)));
+
+busted.model_definitions = busted.io.define_bsrel_models  ("FG","BG", codon_frequencies);
+io.reportProgressMessage ("BUSTED", "Obtaining initial branch lengths under the GTR model");
+busted.gtr_results = estimators.fitGTR     ("codon_filter", tree_definition, None);
+io.reportProgressMessage ("BUSTED", "Log(L) = " + busted.gtr_results["LogL"]);
+
+model.applyModelToTree ("busted.tree", tree_definition, "", {"DEFAULT" : (busted.model_definitions["BG"])["model"], 
+                                                             (busted.model_definitions["FG"])["model"] : Rows (busted.selected_branches)});
+                                                             
+                                                             
+                                                             
+busted.taskTimerStart (0);
+LikelihoodFunction busted.LF = (codon_filter, busted.tree);
+
+_BUSTED_json["background"] =  busted.hasBackground  ("busted.tree");
+
+global busted.T_scaler = 4;
+BUSTED.proportional_constraint = "busted.T_scaler";
+
+BUSTED.model_specification = {};
+BUSTED.model_specification[(busted.model_definitions["FG"])["model"]] = busted.model_definitions;
+BUSTED.model_specification[(busted.model_definitions["BG"])["model"]] = busted.model_definitions;
+
+estimators.applyExistingEstimates ("busted.LF", BUSTED.model_specification, busted.gtr_results);
+
+io.reportProgressMessage ("BUSTED", "Fitting the unconstrained branch-site model");
+
+USE_LAST_RESULTS = 1;
+OPTIMIZATION_PRECISION = 0.1;
+ASSUME_REVERSIBLE_MODELS = 1;
+
+busted.bls = busted.io.evaluate_branch_lengths (busted.model_definitions, "busted.tree", busted.selected_branches);
+Optimize (busted.MLE_HA, busted.LF);
+
+parameters.unconstrain_parameter_set ("busted.LF", {{terms.lf.local.constrained}});
+
+OPTIMIZATION_PRECISION = 0.001;
+Optimize (busted.MLE_HA, busted.LF);
+io.spoolLF ("busted.LF", codon_data_info["file"], None);
+busted_positive_class = busted.checkForPS (busted.model_definitions);
+io.reportProgressMessage ("BUSTED", "Log(L) = " + busted.MLE_HA[1][0] + ". Unrestricted class omega = " + busted_positive_class["omega"] + " (weight = " + busted_positive_class["weight"] + ")");
+
+
+busted.sample_size             =codon_data_info["sites"] * codon_data_info["sequences"];
+busted.taskTimerStop (0);
+
+busted.bls = busted.io.evaluate_branch_lengths (busted.model_definitions, "busted.tree", busted.selected_branches);
+busted.tavl         = busted.tree ^ 0;
+busted.renderString = PostOrderAVL2StringDistances (busted.tavl, busted.bls);
+UseModel (USE_NO_MODEL);
+Tree busted.T = busted.renderString;
+
+busted.json_store_lf                (_BUSTED_json, "Unconstrained model", 
+        busted.MLE_HA[1][0], busted.MLE_HA[1][1]+9, 
+        busted.getIC (busted.MLE_HA[1][0], busted.MLE_HA[1][1]+9, busted.sample_size) , 
+        _BUSTED_timers[0], 
+        +BranchLength (busted.T,-1), 
+        Format (busted.T, 1,1),
+        busted.model_definitions,
+        _BUSTED_json["background"]
+        );
+
+
+busted.profiles = {};
+(_BUSTED_json ["profiles"])["unconstrained"] = busted.computeSiteLikelihoods ("busted.LF");
+
+
+if (busted_positive_class["omega"] < 1 || busted_positive_class["weight"] < 1e-8) {
+    io.reportProgressMessage ("BUSTED", "No evidence for positive selection under the unconstrained model, skipping constrained model fitting");
+    _BUSTED_json ["test results"] = busted.runLRT (0, 0);
+} else {
+    busted.taskTimerStart (1);
+
+    io.reportProgressMessage ("BUSTED", "Fitting the branch-site model that disallows omega > 1 among foreground branches");
+    busted.constrainTheModel (busted.model_definitions);
+    (_BUSTED_json ["profiles"])["constrained"] = busted.computeSiteLikelihoods ("busted.LF");;
+    Optimize (busted.MLE_H0, busted.LF);
+    io.spoolLF ("busted.LF", codon_data_info["file"], "null");
+    (_BUSTED_json ["profiles"])["optimized null"] = busted.computeSiteLikelihoods ("busted.LF");;
+    io.reportProgressMessage ("BUSTED", "Log(L) = " + busted.MLE_H0[1][0]);
+    busted.LRT = busted.runLRT (busted.MLE_HA[1][0], busted.MLE_H0[1][0]);
+    
+    _BUSTED_json ["test results"] = busted.LRT;
+    
+    io.reportProgressMessage ("BUSTED", "Likelihood ratio test for episodic positive selection, p = " + busted.LRT["p"]);
+     busted.taskTimerStop (1);
+    
+    busted.bls = busted.io.evaluate_branch_lengths (busted.model_definitions, "busted.tree", busted.selected_branches);
+    busted.tavl         = busted.tree ^ 0;
+    busted.renderString = PostOrderAVL2StringDistances (busted.tavl, busted.bls);
+    UseModel (USE_NO_MODEL);
+    Tree busted.T = busted.renderString;
+
+    busted.json_store_lf                (_BUSTED_json, 
+                                        "Constrained model", busted.MLE_H0[1][0], 
+                                        busted.MLE_H0[1][1]+9, 
+                                        busted.getIC (busted.MLE_H0[1][0], busted.MLE_H0[1][1]+9, busted.sample_size) , 
+                                        _BUSTED_timers[1],
+                                         +BranchLength (busted.T,-1), 
+                                        Format (busted.T, 1,1),
+                                        busted.model_definitions,
+                                        _BUSTED_json["background"]
+                                       );
+                                       
+    (_BUSTED_json ["evidence ratios"])["constrained"] = busted.evidenceRatios ( (_BUSTED_json ["profiles"])["unconstrained"],  (_BUSTED_json ["profiles"])["constrained"]);
+    (_BUSTED_json ["evidence ratios"])["optimized null"] = busted.evidenceRatios ( (_BUSTED_json ["profiles"])["unconstrained"],  (_BUSTED_json ["profiles"])["optimized null"]);
+}
+
+busted.taskTimerStop (2);
+
+(_BUSTED_json ["timers"])["overall"] = _BUSTED_timers[2];
+(_BUSTED_json ["timers"])["unconstrained"] = _BUSTED_timers[0];
+(_BUSTED_json ["timers"])["constrained"] = _BUSTED_timers[1];
+
+USE_JSON_FOR_MATRIX = 1;
+fprintf (codon_data_info["json"], CLEAR_FILE, _BUSTED_json);
+USE_JSON_FOR_MATRIX = 0;
+
+//------------------------------------------------------------------------------ 
+// HELPER FUNCTIONS FROM HTHIS POINT ON
+//------------------------------------------------------------------------------ 
+
+
+//------------------------------------------------------------------------------ 
+function busted.hasBackground (id) {
+   ExecuteCommands ("GetInformation (busted.nodeMap, `id`)");
+   busted.nodeMap = Columns(busted.nodeMap);
+   return Rows (busted.nodeMap) * Columns (busted.nodeMap) > 1; 
+}
+
+//------------------------------------------------------------------------------ 
+function busted.getRateDistribution (model_description, key) {
+  busted.getRateInformation.rate_classes = Abs ((model_description[key])["omegas"]);
+  busted.getRateInformation.omega_info = {busted.getRateInformation.rate_classes,2};
+  
+  for (busted.getRateInformation.k = 0; busted.getRateInformation.k < busted.getRateInformation.rate_classes; busted.getRateInformation.k += 1) {
+    busted.getRateInformation.omega_info[busted.getRateInformation.k][0] = Eval (((model_description[key])["omegas"])[busted.getRateInformation.k]);
+    busted.getRateInformation.omega_info[busted.getRateInformation.k][1] = Eval (((model_description[key])["weights"])[busted.getRateInformation.k]);
+  }
+  return busted.getRateInformation.omega_info;
+}
+
+
+//------------------------------------------------------------------------------ 
+function busted._aux.free_lengths (key, value) {
+    ExecuteCommands ("busted.tree." + key + ".t = busted.tree." + key + ".t");
+}
+
+
+//------------------------------------------------------------------------------ 
+function busted.checkForPS (model_parameters) {
+   return {"omega" :Eval (((model_parameters["FG"])["omegas"])[2]),
+           "weight" : Eval (((model_parameters["FG"])["weights"])[2])};
+           
+}
+
+//------------------------------------------------------------------------------ 
+function busted.constrainTheModel (model_parameters) {
+  ExecuteCommands (((model_parameters["FG"])["omegas"])[2] + ":=1");           
+}
+
+//------------------------------------------------------------------------------ 
+function busted.computeSiteLikelihoods (id) {
+   ConstructCategoryMatrix (_siteLike, *id, SITE_LOG_LIKELIHOODS);
+   return _siteLike;         
+}
+
+
+
+//------------------------------------------------------------------------------ 
+function busted.runLRT (ha, h0) {
+    return {"LR" : 2*(ha-h0),
+            "p" : 1-CChi2 (2*(ha-h0),2)};
+}
+
+//------------------------------------------------------------------------------ 
+lfunction busted._aux.stick_breaking (parameters) {
+    left_over = ""; 
+    weights = {};
+    for (k = 0; k < Abs (parameters); k += 1) {
+        weights [k] = left_over + parameters[k];
+        left_over += "(1-" + parameters[k] + ")*";
+    }
+    weights[k] = left_over[0][Abs (left_over)-2];
+    return weights;
+}
+
+//------------------------------------------------------------------------------ 
+function busted._aux.define_bsrel_model (id,Q,weights,freqs) {
+    rate_count = Abs (Q);
+    components = {};
+    length = "";
+    Eval ("`id`_eqf = freqs");
+
+    for (k = 0; k < rate_count; k+=1) {
+        components[k] = "Exp(" + Q[k] + ")*" + weights[k];
+        ExecuteCommands ("Model busted._aux.define_bsrel_model_bl = (" + Q[k] + ",`id`_eqf,0)");
+        GetString (blExp, busted._aux.define_bsrel_model_bl, -1);
+        if (k) {
+            length += "+";
+        }
+        length += "(`blExp`)*" + weights[k];
+    }
+    
+    ExecuteCommands ("Model `id` =(\"" + Join("+",components) + "\",`id`_eqf,EXPLICIT_FORM_MATRIX_EXPONENTIAL);");
+    return length;
+}
+
+//------------------------------------------------------------------------------ 
+function busted._aux.define_parameter (key, value) {
+   ExecuteCommands ("global `value` :< 1;");
+   ExecuteCommands ("`value` :> 0;");
+   ExecuteCommands ("`value` = " + busted.init_values[key]);
+}
+
+//------------------------------------------------------------------------------ 
+function busted.io.evaluate_branch_lengths (model_parameters, tree_id, fg_set) {
+    busted.io.evaluate_branch_lengths.res    = {};
+    busted.io.evaluate_branch_lengths.bnames = BranchName (*tree_id, -1);
+    for (busted.io.evaluate_branch_lengths.k = 0; 
+         busted.io.evaluate_branch_lengths.k < Columns (busted.io.evaluate_branch_lengths.bnames)-1;
+         busted.io.evaluate_branch_lengths.k += 1) {
+         
+         busted.io.evaluate_branch_lengths.lexpr = "";
+         
+         busted.io.evaluate_branch_lengths.b_name = busted.io.evaluate_branch_lengths.bnames[busted.io.evaluate_branch_lengths.k];
+         if (fg_set [busted.io.evaluate_branch_lengths.b_name]) {
+            //fprintf (stdout, busted.io.evaluate_branch_lengths.b_name, "=>FG\n");
+            busted.io.evaluate_branch_lengths.lexpr = (model_parameters["FG"])["length"];
+         } else {
+            //fprintf (stdout, busted.io.evaluate_branch_lengths.b_name, "=>BG\n");
+            busted.io.evaluate_branch_lengths.lexpr = (model_parameters["BG"])["length"];
+         }
+         Eval (model_parameters["length parameter"] + " = `tree_id`.`busted.io.evaluate_branch_lengths.b_name`." + model_parameters["length parameter"]);
+         busted.io.evaluate_branch_lengths.res [ busted.io.evaluate_branch_lengths.b_name ] =
+            Eval (busted.io.evaluate_branch_lengths.lexpr);
+    }
+    return busted.io.evaluate_branch_lengths.res;
+}
+
+//------------------------------------------------------------------------------ 
+function busted.io.define_bsrel_models (foreground_id, background_id, frequencies) {
+
+    model_parameters = 
+        {"FG": {"omegas" : {}, "weights" : {}, "f" : {}, "Q" : {}, "length" : ""},
+         "BG": {"omegas" : {}, "weights" : {}, "f" : {}, "Q" : {}, "length" : ""},
+         "parameters" : {"global" : {}, "local" : {}}
+          };
+    
+    for (k = 1; k <= 3; k +=1) {
+        tag = "" + k;
+        ((model_parameters["FG"])["omegas"]) + "`foreground_id`_omega_`tag`";
+        ((model_parameters["BG"])["omegas"]) + "`background_id`_omega_`tag`";
+        if (k < 3) {
+            ((model_parameters["FG"])["f"]) + "`foreground_id`_f_`tag`";
+            ((model_parameters["BG"])["f"]) + "`background_id`_f_`tag`";
+        }
+        
+    }
+    
+    
+    
+    ((model_parameters["FG"])["weights"])  = busted._aux.stick_breaking (((model_parameters["FG"])["f"]));
+    ((model_parameters["BG"])["weights"])  = busted._aux.stick_breaking (((model_parameters["BG"])["f"]));
+     
+    busted.init_values = {"0" : 0.1, "1" : 0.5, "2" : 1};
+
+    ((model_parameters["FG"])["omegas"])["busted._aux.define_parameter"][""];
+    ((model_parameters["BG"])["omegas"])["busted._aux.define_parameter"][""];
+    
+    Eval (((model_parameters["FG"])["omegas"])[2] + ":<1e26");
+    Eval (((model_parameters["FG"])["omegas"])[2] + ":>1");
+    Eval (((model_parameters["BG"])["omegas"])[2] + ":<1e26");
+
+    busted.init_values = {"0" : 0.8, "1" : 0.75};
+    
+    ((model_parameters["FG"])["f"])["busted._aux.define_parameter"][""];
+    ((model_parameters["BG"])["f"])["busted._aux.define_parameter"][""];
+    
+
+    for (k = 1; k <= 3; k +=1) {
+        
+        ((model_parameters["FG"])["Q"]) + ("Q_`foreground_id`_" + k);
+        PopulateModelMatrix			  (((model_parameters["FG"])["Q"])[k-1],  frequencies["nucleotide"], "t",((model_parameters["FG"])["omegas"])[k-1], "");
+        ((model_parameters["BG"])["Q"]) + ("Q_`background_id`_" + k);
+        PopulateModelMatrix			  (((model_parameters["BG"])["Q"])[k-1],  frequencies["nucleotide"], "t",((model_parameters["BG"])["omegas"])[k-1], "");
+    }
+    
+    (model_parameters["BG"])["model"] = "`background_id`_model";
+    (model_parameters["BG"])["length"] = busted._aux.define_bsrel_model ("`background_id`_model", (model_parameters["BG"])["Q"], (model_parameters["BG"])["weights"], frequencies["codon"]);
+    (model_parameters["FG"])["model"] = "`foreground_id`_model";
+    (model_parameters["FG"])["length"] = busted._aux.define_bsrel_model ("`foreground_id`_model", (model_parameters["FG"])["Q"], (model_parameters["FG"])["weights"], frequencies["codon"]);
+    
+    ((model_parameters["parameters"])["global"])[terms.nucleotideRate ("A","C")] = "AC";
+    ((model_parameters["parameters"])["global"])[terms.nucleotideRate ("A","T")] = "AT";
+    ((model_parameters["parameters"])["global"])[terms.nucleotideRate ("C","G")] = "CG";
+    ((model_parameters["parameters"])["global"])[terms.nucleotideRate ("C","T")] = "CT";
+    ((model_parameters["parameters"])["global"])[terms.nucleotideRate ("G","T")] = "GT";
+     model_parameters["set-branch-length"] = "busted.aux.copy_branch_length";
+
+    ((model_parameters["parameters"])[terms.local])[terms.timeParameter ()] = "t";
+    
+     model_parameters["length parameter"] = "t";
+    
+    return model_parameters;
+}
+
+function busted.aux.copy_branch_length (model, value, parameter) {
+
+    busted.aux.copy_branch_length.t = ((model["parameters"])["local"])[terms.timeParameter ()];
+    
+    if (Abs (BUSTED.proportional_constraint)) {
+        Eval ("`parameter`.`busted.aux.copy_branch_length.t` := `BUSTED.proportional_constraint` * " + value);        
+    } else {
+        Eval ("`parameter`.`busted.aux.copy_branch_length.t` = " + value);
+    }
+    
+    
+    
+    if (Type (relax.aux.copy_branch_length.k) == "String") {
+        Eval ("`parameter`.`relax.aux.copy_branch_length.k` = 1");
+    }
+}
+
+//------------------------------------------------------------------------------ 
+lfunction busted.io.selectBranchesToTest (tree_definition) {
+    
+    extra_models = {};
+    
+    for (k = 0; k < Columns (tree_definition["model_list"]); k += 1) {
+        model_id = (tree_definition["model_list"])[k];
+        if (model_id != "") {
+            extra_models  + model_id;
+        }
+    }
+    
+    
+    UseModel (USE_NO_MODEL);
+    ExecuteCommands ("Topology  T = " + tree_definition["string"]);
+    tAVL = T^0;
+
+    totalBranchCount = Abs (tAVL) - 2;
+
+    selectedBranches = {};
+    selectTheseForTesting = {totalBranchCount + 3 + Abs (extra_models), 2};
+    selectTheseForTesting [0][0] = "All";  selectTheseForTesting [0][1] = "Test for selection on all branches jointly";
+    selectTheseForTesting [1][0] = "Internal";  selectTheseForTesting [1][1] = "Test for selection on all internal branches jointly";
+    selectTheseForTesting [2][0] = "Leaves";  selectTheseForTesting [2][1] = "Test for selection on all terminal branches jointly";
+    
+    for (k = 0; k < Abs (extra_models); k+=1) {
+        selectTheseForTesting [3+k][0] = "Set " + extra_models[k];  
+        selectTheseForTesting [3+k][1] = "Test for selection on all branches labeled with {" + extra_models[k] + "} jointly";
+    }
+
+    for (k = 0; k < totalBranchCount; k += 1) {
+        selectTheseForTesting [k+3 + Abs (extra_models)][0] = (tAVL[k+1])["Name"];
+        selectTheseForTesting [k+3 + Abs (extra_models)][1] = "Add branch '" + selectTheseForTesting [k+3 + Abs (extra_models)][0] + "' to the test set";
+
+    }
+
+    ChoiceList  (whichBranchesToTest,"Which branches to test?",0,NO_SKIP,selectTheseForTesting);
+
+    for (k = 0; k < Columns (whichBranchesToTest); k += 1) {
+       if (whichBranchesToTest [k] < 3) {
+            for (k2 = 1; k2 <=  totalBranchCount; k2 += 1) {
+                if (whichBranchesToTest[k] == 0 || whichBranchesToTest[k] == 1 && Abs ((tAVL[k2])["Children"]) > 0 || whichBranchesToTest[k] == 2 && Abs ((tAVL[k2])["Children"]) == 0) {
+                    selectedBranches [(tAVL[k2])["Name"]] = 1;
+                }
+            }
+            return selectedBranches;
+        } 
+        if (whichBranchesToTest [k] < 3 + Abs (extra_models)) {
+            model_key = extra_models [whichBranchesToTest [k] - 3];
+            for (k2 = 1; k2 <=  totalBranchCount; k2 += 1) {
+                bName = (tAVL[k2])["Name"];
+                if ((tree_definition["model_map"])[bName] == model_key) {
+                    selectedBranches [bName] = 1;
+                }
+            }       
+            return selectedBranches;     
+        }
+        
+        selectedBranches [(tAVL[whichBranchesToTest [k] - 2 - Abs (extra_models)])["Name"]] = 1;
+    }
+    
+    return selectedBranches;
+}
+
+//------------------------------------------------------------------------------------------------------------------------
+
+function busted.evidenceRatios (ha, h0) {
+    sites = Rows (ha) * Columns (ha);
+    return ha["Exp(_MATRIX_ELEMENT_VALUE_-h0[_MATRIX_ELEMENT_COLUMN_])"];
+}
+
+//------------------------------------------------------------------------------------------------------------------------
+
+function busted.taskTimerStart (index) {
+    _BUSTED_timers[index] = Time(1);
+}
+
+function busted.taskTimerStop (index) {
+    _BUSTED_timers[index] = Time(1) - _BUSTED_timers[index];
+
+}
+
+//------------------------------------------------------------------------------------------------------------------------
+
+function busted.getIC (logl,params,samples) {
+    return -2*logl + 2*samples/(samples-params-1)*params;
+}
+
+
+
+//------------------------------------------------------------------------------------------------------------------------
+
+lfunction busted.json_store_lf (json, name, ll, df, aicc, time, tree_length, tree_string, defs, has_bg) {
+    (json["fits"])[name] = {"log-likelihood": ll,
+                            "parameters": df,
+                            "AIC-c" : aicc,
+                            "runtime" : time,
+                            "tree length" : tree_length,
+                            "tree string" : tree_string,
+                            "rate distributions" : {}};
+                            
+    (((json["fits"])[name])["rate distributions"])["FG"] = busted.getRateDistribution (defs, "FG");
+    if (has_bg) {
+        (((json["fits"])[name])["rate distributions"])["BG"] = busted.getRateDistribution (defs, "BG");
+    }
+}
diff --git a/res/TemplateBatchFiles/BivariateCodonRateAnalysis.bf b/res/TemplateBatchFiles/BivariateCodonRateAnalysis.bf
new file mode 100644
index 0000000..f6b10ac
--- /dev/null
+++ b/res/TemplateBatchFiles/BivariateCodonRateAnalysis.bf
@@ -0,0 +1,120 @@
+bivariateFitOptions = {};
+
+SetDialogPrompt ("Datafile:");
+DataSet ds = ReadDataFile (PROMPT_FOR_FILE);
+_bivariateFilePath = LAST_FILE_PATH;
+
+ExecuteAFile (HYPHY_LIB_DIRECTORY + 
+				"TemplateBatchFiles" + 
+				DIRECTORY_SEPARATOR  + 
+				"TemplateModels" + 
+				DIRECTORY_SEPARATOR  + 
+				"chooseGeneticCode.def");
+
+_genCodeID = _geneticCodeOptionMatrix [modelType][0];
+
+
+ChoiceList (branchLengths,"Branch Lengths",1,SKIP_NONE,
+            "Codon Model","Jointly optimize rate parameters and branch lengths (slow and thorough)",
+            "Nucleotide Model","Estimate branch lengths once, using an appropriate nucleotide model (quick and dirty)."
+            );
+
+assert (branchLengths >= 0);
+
+fprintf (stdout, "Model string:");
+fscanf  (stdin,  "String",mstring);
+
+ExecuteAFile ("TemplateModels/MGwAA.ibf");
+
+currentLFSpool = _bivariateFilePath + ".fit.1";
+
+bivariateFitOptions ["00"] = "New run";
+if (branchLengths == 0)
+{
+    bivariateFitOptions ["01"] = "Codon Model";
+}
+else
+{
+    bivariateFitOptions ["01"] = "Nucleotide Model";
+}
+bivariateFitOptions ["02"] = "1";
+bivariateFitOptions ["03"] = _genCodeID;
+bivariateFitOptions ["04"] = _bivariateFilePath;
+if (Abs(DATAFILE_TREE))
+{
+	bivariateFitOptions ["06"] = "y";
+}
+else
+{
+	bivariateFitOptions ["06"] = "";
+}
+
+bivariateFitOptions ["07"] = mstring;
+bivariateFitOptions ["08"] = "Default";
+bivariateFitOptions ["09"] = "1";
+bivariateFitOptions ["10"] = "Unconstrained";
+bivariateFitOptions ["11"] = currentLFSpool;
+
+ExecuteAFile (  "dNdSBivariateRateAnalysis.bf",
+				bivariateFitOptions
+			 );
+			 
+currentCAIC   = bivariateReturnAVL["cAIC"];
+bestCAICsoFar = 1e100;
+currentRateCount = 1;
+bestClassCount = 1;
+
+gateauxOptions = {};
+gateauxOptions ["02"] = "-1";
+
+
+while (currentCAIC < bestCAICsoFar)
+{
+	bestClassCount = currentRateCount;
+	gateauxOptions ["01"] = currentLFSpool;
+	fprintf (stdout, "[FINISHED FITTING A MODEL WITH ", currentRateCount, " RATES]\n");
+	fprintf (stdout, "[CURRENT c-AIC = ", currentCAIC, ". BEST c-AIC SO FAR = ", bestCAICsoFar, "]\n");
+	bestCAICsoFar = currentCAIC;
+
+	DeleteObject (lf);
+
+	ExecuteAFile (  HYPHY_LIB_DIRECTORY + 
+				"TemplateBatchFiles" + 
+				DIRECTORY_SEPARATOR  + 
+				"GateauxMR.bf",
+				gateauxOptions
+			 );
+
+	improved = bivariateReturnAVL ["DIFF"];
+	if (improved == 0)
+	{
+		fprintf (stdout, "[NO GATEAUX IMPROVEMENT. TERMINATING...]\n");
+		break;
+	}
+	lastLFSpool		 = currentLFSpool;
+	currentRateCount = currentRateCount + 1;
+	currentLFSpool = currentLFSpool + "." + currentRateCount;
+
+	bivariateFitOptions ["00"] = "Continued run";
+	bivariateFitOptions ["01"] = currentLFSpool;
+	bivariateFitOptions ["02"] = "Unconstrained";
+
+	ExecuteAFile (  HYPHY_LIB_DIRECTORY + 
+				"TemplateBatchFiles" + 
+				DIRECTORY_SEPARATOR  + 
+				"dNdSBivariateRateAnalysis.bf",
+				bivariateFitOptions
+			 	);
+			 
+	currentCAIC   = bivariateReturnAVL["cAIC"];
+	
+	
+}
+
+fprintf (stdout, "[BEST-FITTING MODEL HAS ", bestClassCount, " RATES]\n");
+fprintf (stdout, "[USE CodonBivariateRateProcessor.bf ON ", lastLFSpool, " TO PROCESS THE RESULTS]\n");
+
+
+
+
+
diff --git a/res/TemplateBatchFiles/BranchClassDNDS.bf b/res/TemplateBatchFiles/BranchClassDNDS.bf
new file mode 100644
index 0000000..4c81ace
--- /dev/null
+++ b/res/TemplateBatchFiles/BranchClassDNDS.bf
@@ -0,0 +1,460 @@
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+
+function BuildCodonFrequencies (obsF)
+{
+	PIStop = 1.0;
+	result = {ModelMatrixDimension,1};
+	hshift = 0;
+
+	for (h=0; h<64; h=h+1)
+	{
+		first = h$16;
+		second = h%16$4;
+		third = h%4;
+		if (_Genetic_Code[h]==10) 
+		{
+			hshift = hshift+1;
+			PIStop = PIStop-obsF[first][0]*obsF[second][1]*obsF[third][2];
+			continue; 
+		}
+		result[h-hshift][0]=obsF[first][0]*obsF[second][1]*obsF[third][2];
+	}
+	return result*(1.0/PIStop);
+}
+
+ModelMatrixDimension = 0;
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function PopulateModelMatrix (ModelMatrixName&, EFV)
+{
+	if (!ModelMatrixDimension)
+	{
+		ModelMatrixDimension = 64;
+		for (h = 0 ;h<64; h=h+1)
+		{
+			if (_Genetic_Code[h]==10)
+			{
+				ModelMatrixDimension = ModelMatrixDimension-1;
+			}
+		}
+	}
+	
+	ModelMatrixName = {ModelMatrixDimension,ModelMatrixDimension}; 
+
+	hshift = 0;
+	
+	modelDefString = "";
+	modelDefString*16384;
+	
+	for (h=0; h<64; h=h+1)
+	{
+		if (_Genetic_Code[h]==10) 
+		{
+			hshift = hshift+1;
+			continue; 
+		}
+		vshift = hshift;
+		for (v = h+1; v<64; v=v+1)
+		{
+			diff = v-h;
+			if (_Genetic_Code[v]==10) 
+			{
+				vshift = vshift+1;
+				continue; 
+			}
+			nucPosInCodon = 2;
+			if ((h$4==v$4)||((diff%4==0)&&(h$16==v$16))||(diff%16==0))
+			{
+				if (h$4==v$4)
+				{
+					transition = v%4;
+					transition2= h%4;
+				}
+				else
+				{
+					if(diff%16==0)
+					{
+						transition = v$16;
+						transition2= h$16;
+						nucPosInCodon = 0;
+					}
+					else
+					{
+						transition = v%16$4;
+						transition2= h%16$4;
+						nucPosInCodon = 1;
+					}
+				}
+				hs = Format(h-hshift,0,0);
+				vs = Format(v-vshift,0,0);
+				ts = Format(transition,0,0);
+				ts2= Format(transition2,0,0);
+				ps = Format(nucPosInCodon,0,0);
+				aa1 = _Genetic_Code[0][h];
+				aa2 = _Genetic_Code[0][v];
+				if (aa1==aa2) 
+				{
+					modelDefString*("ModelMatrixName["+hs+"]["+vs+"] := "+_nucBiasTerms[transition][transition2]+"synRate*EFV__["+ts+"]["+ps+"];\n"+
+													 "ModelMatrixName["+vs+"]["+hs+"] := "+_nucBiasTerms[transition][transition2]+"synRate*EFV__["+ts2+"]["+ps+"];\n");
+				}
+				else
+				{
+					if (rvOptions == 2)
+					{
+						modelDefString*("ModelMatrixName["+hs+"]["+vs+"] := "+_nucBiasTerms[transition][transition2]+"c*nonSynRate*EFV__["+ts+"]["+ps+"];\n"+
+														 "ModelMatrixName["+vs+"]["+hs+"] := "+_nucBiasTerms[transition][transition2]+"c*nonSynRate*EFV__["+ts2+"]["+ps+"];\n");	
+					}
+					else
+					{
+						modelDefString*("ModelMatrixName["+hs+"]["+vs+"] := "+_nucBiasTerms[transition][transition2]+"nonSynRate*EFV__["+ts+"]["+ps+"];\n"+
+														 "ModelMatrixName["+vs+"]["+hs+"] := "+_nucBiasTerms[transition][transition2]+"nonSynRate*EFV__["+ts2+"]["+ps+"];\n");						
+					}
+				}
+			}
+	    }
+    }		
+	modelDefString*0;
+	ExecuteCommands (modelDefString);
+	return 0;
+}
+
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+
+
+ExecuteAFile  (HYPHY_LIB_DIRECTORY+"TemplateBatchFiles"+DIRECTORY_SEPARATOR+"TemplateModels"+DIRECTORY_SEPARATOR+"chooseGeneticCode.def");
+
+SetDialogPrompt 	  		  ("Locate a codon file:");
+DataSet 		ds  		 = ReadDataFile (PROMPT_FOR_FILE);
+DataSetFilter	filteredData = CreateFilter(ds,3,"","",GeneticCodeExclusions);
+
+numberOfSamples = filteredData.sites;
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+global AC = 1;
+global AT = 1;
+global CG = 1;
+global CT = 1;
+global GT = 1;
+
+catCounterAL = {totalBranches,1};
+
+ChoiceList  (rvOptions,"Site-to-site rate variation",1,NO_SKIP,
+					   "None","No site-to-site rate variation",
+					   "Mutation Rate","Vary mutation rate site-to-site",
+					   "dN/dS","Vary dN/dS ratio site-to-site",
+					   "Both","Vary dS and dN across sites");
+					 
+
+MGCustomRateBiasTerms = {{"AC*","","AT*","CG*","CT*","GT*"}};	
+
+if (rvOptions < 0)
+{
+	return;
+}
+
+if (rvOptions > 0)
+{
+	if (rvOptions < 3)
+	{
+		ExecuteAFile  (HYPHY_LIB_DIRECTORY+"TemplateBatchFiles"+DIRECTORY_SEPARATOR+"TemplateModels"+DIRECTORY_SEPARATOR+"defineGamma.mdl");
+	}
+	else
+	{
+		
+		ExecuteAFile  (HYPHY_LIB_DIRECTORY+"TemplateBatchFiles"+DIRECTORY_SEPARATOR+"Utility"+DIRECTORY_SEPARATOR+"GrabBag.bf");	
+		ExecuteAFile  (HYPHY_LIB_DIRECTORY+"TemplateBatchFiles"+DIRECTORY_SEPARATOR+"TreeTools.ibf");	
+		partCount = prompt_for_a_value ("How many site classes", 3, 2, 8, 1);
+		
+		generate_gdd_freqs (partCount, "freqs", "lfMix", "P", 0);
+		
+		
+	}
+	
+	if (rvOptions == 1)
+	{
+		MGCustomRateBiasTerms = {{"AC*c*","c*","AT*c*","CG*c*","CT*c*","GT*c*"}};	
+	}
+}
+
+
+done = 0;
+while (!done)
+{
+	fprintf (stdout,"\nPlease enter a 6 character model designation (e.g:010010 defines HKY85):");
+	fscanf  (stdin,"String", modelDesc);
+	if (Abs(modelDesc)==6)
+	{	
+		done = 1;
+	}
+}			
+
+		
+paramCount	  = 0;
+_nucBiasTerms = {4,4};
+_nucBiasTerms[0][0] = "";
+
+
+if (modelDesc[0]==modelDesc[1])
+{
+	MGCustomRateBiasTerms[0] = MGCustomRateBiasTerms[1];
+}
+
+_nucBiasTerms[1][0] = MGCustomRateBiasTerms[0];
+_nucBiasTerms[0][1] = MGCustomRateBiasTerms[0];
+_nucBiasTerms[2][0] = MGCustomRateBiasTerms[1];
+_nucBiasTerms[0][2] = MGCustomRateBiasTerms[1];
+
+h = 0;
+v = 3;
+
+for (customLoopCounter2=2; customLoopCounter2<6; customLoopCounter2=customLoopCounter2+1)
+{
+	for (customLoopCounter=0; customLoopCounter<customLoopCounter2; customLoopCounter=customLoopCounter+1)
+	{
+		if (modelDesc[customLoopCounter]==modelDesc[customLoopCounter2])
+		{
+			_nucBiasTerms[h][v] = MGCustomRateBiasTerms[customLoopCounter];
+			_nucBiasTerms[v][h] = MGCustomRateBiasTerms[customLoopCounter];
+			break;
+		}
+	}
+	if (customLoopCounter == customLoopCounter2)
+	{
+		_nucBiasTerms[h][v] = MGCustomRateBiasTerms[customLoopCounter2];
+		_nucBiasTerms[v][h] = MGCustomRateBiasTerms[customLoopCounter2];
+	}
+	
+	v = v+1;
+	if (v==4)
+	{
+		h=h+1;
+		v=h+1;
+	}
+}
+
+HarvestFrequencies (observedFreq,filteredData,3,1,1);
+
+
+MG94plain = 0;
+MULTIPLY_BY_FREQS 				= PopulateModelMatrix ("MG94", observedFreq);
+vectorOfFrequencies 			= BuildCodonFrequencies (observedFreq);
+Model MG94_Model		 		= (MG94,vectorOfFrequencies,0);
+
+SetDialogPrompt ("Locate tree and branch splits file:");
+fscanf (PROMPT_FOR_FILE,"Raw",treeDef);
+ExecuteCommands (treeDef);
+
+bclasses = Abs(_branchClasses);
+
+if (bclasses == 0)
+{
+	fprintf (stdout, LAST_FILE_PATH, " does not appear to contain a valid branch partition information\n");
+	return 0;
+}
+
+classAllocations = {};
+fprintf (stdout, "\nLoaded ", bclasses, " branch partitions\n");
+
+doAllocation = 1;
+
+if (Abs (_rateClasses) == bclasses)
+{
+	fprintf (stdout, "Would you like to use allocation information loaded from the file (y/n)?");
+	fscanf (stdin,"String",doAllocation);
+	if (doAllocation[0] == "n")
+	{
+		doAllocation = 0;
+	}
+	else
+	{
+		doAllocation = 1;
+	}
+}
+
+if (bclasses > 1)
+{
+	cclasses = 0;
+	while (cclasses < 1 || cclasses > bclasses)
+	{
+		fprintf (stdout, "How many dN/dS branch classes would you like to use [1-", bclasses,"]?");
+		fscanf (stdin,"Number",cclasses);
+	}
+}
+else
+{
+	cclasses = 1;
+}
+
+keys = Rows (_branchClasses);
+classAllocations[0] = 1;
+
+fprintf (stdout, "\nUsing ", cclasses, " dN/dS branch classes\n");
+fprintf (stdout, "\n\nAllocated branch set ", keys[0], " to dN/dS class 1\n");
+
+if (cclasses > 1)
+{
+	allocatedBC   = 1;
+	allocatedRC   = 1;
+
+	while (cclasses-allocatedRC < bclasses-allocatedBC)
+	{
+		allocMeTo = -1;
+		maxRate = Min (allocatedRC+1,cclasses);
+		while (allocMeTo < 1 || allocMeTo > maxRate)
+		{
+			fprintf (stdout, "Allocate branch set ", keys[allocatedBC], " to rate class [1-", maxRate,"]:");
+			fscanf (stdin, "Number", allocMeTo);
+		}
+		classAllocations[allocatedBC] = allocMeTo;
+		allocatedBC = allocatedBC + 1;
+		if (allocMeTo > allocatedRC)
+		{
+			allocatedRC = allocatedRC + 1; 
+		}
+	}
+	allocatedRC = allocatedRC+1;
+	for (k=allocatedBC; k<bclasses; k=k+1)
+	{
+		fprintf (stdout, "\nAllocated branch set ", keys[k], " to rate class ",allocatedRC);
+		classAllocations[k] = allocatedRC;
+		allocatedRC = allocatedRC + 1;
+	}
+	fprintf (stdout, "\n");
+}
+else
+{
+	for (k=1; k<bclasses; k=k+1)
+	{
+		fprintf (stdout, "\nAllocated branch set ", keys[k], " to rate class 1");
+		classAllocations [k] = 1;
+	}
+}
+
+fprintf (stdout, "\n\n");
+
+if (rvOptions == 3)
+{
+	treeString = Format (theTree,1,0);
+	
+	likeFunc = {partCount+1,1};
+	
+	scalerExpr = {};
+	
+	for (k2 = 0; k2 < bclasses; k2 += 1)
+	{
+		scalerExpr[k2] = {partCount,1};
+	}
+
+	for (k = 0; k < partCount; k+=1)
+	{
+		ExecuteCommands ("Tree T_" + k + " = " + treeString + ";\n");
+		likeFunc[k] = "filteredData,T_"+k;
+		for (k2 = 0; k2 < bclasses; k2 += 1)
+		{
+			(scalerExpr[k2])[k] = "S_S" + k + "_B" + k2;
+			ExecuteCommands ("global " + (scalerExpr[k2])[k] + " = 1;");
+			(scalerExpr[k2])[k] = (scalerExpr[k2])[k] + "*" + freqs[k];
+		}
+	}
+	likeFunc[k] = "\"" + lfMix + "\"";
+	
+	for (k = 0; k < bclasses; k+=1)
+	{
+		ExecuteCommands ("global syn_scaler_" + k +" := " + Join("+",scalerExpr[k]) + "\n");
+	}
+		
+		
+	for (k=0; k<bclasses;k=k+1)
+	{
+		for (k3 = 0; k3 < partCount; k3+=1)
+		{
+			class = classAllocations [k]-1;
+			rateParmID =  "omega_B"+ class + "_S" + k3;
+			fprintf (stdout, "Branch set ", keys[k], " has been mapped to ",rateParmID,"\n");
+				
+			ExecuteCommands ("global `rateParmID`=1;");
+			stringMatrix = _branchClasses[keys[k]];
+			for (k2=0; k2<Columns (stringMatrix); k2=k2+1)
+			{
+				stringCommand = "T_"+k3+"."+stringMatrix[k2]+".nonSynRate:="+rateParmID+"*T_"+k3+"."+stringMatrix[k2]+".synRate;" + 
+								"T_"+k3+"."+stringMatrix[k2]+".synRate:=S_S"+k3+"_B"+class+"/syn_scaler_"+class+"*theTree."+stringMatrix[k2]+".synRate;";
+
+				ExecuteCommands (stringCommand);
+			}
+		}
+	}
+	
+	ExecuteCommands ("LikelihoodFunction lf = (" + Join (",",likeFunc) + ");");
+}
+else
+{
+	for (k=0; k<bclasses;k=k+1)
+	{
+		rateParmID =  "dNdS_"+classAllocations [k];
+		fprintf (stdout, "Branch set ", keys[k], " has been mapped to ",rateParmID,"\n");
+			
+		ExecuteCommands ("global `rateParmID`=1;");
+		stringMatrix = _branchClasses[keys[k]];
+		for (k2=0; k2<Columns (stringMatrix); k2=k2+1)
+		{
+			stringCommand = "theTree."+stringMatrix[k2]+".nonSynRate:="+rateParmID+"*theTree."+stringMatrix[k2]+".synRate;";
+			/*fprintf (stdout, stringCommand, "\n");*/
+			ExecuteCommands (stringCommand);
+		}
+	}
+	LikelihoodFunction lf = (filteredData,theTree);
+}
+
+Optimize (res,lf);
+
+fprintf (stdout, "\nFitting summary:\n\n",
+				 "   Log-L = ", res[1][0], "\n",
+				 "   d.f   = ", res[1][1], "\n",
+				 "   sites = ", filteredData.sites, "\n",
+				 "   AIC   = ", 2*(res[1][1]-res[1][0]), "\n",
+				 "   c-AIC = ", 2*(res[1][1]*(filteredData.sites/(filteredData.sites-res[1][1]-1))-res[1][0]), "\n\n", lf);
+				 
+if (rvOptions == 3)
+{
+	weights = {partCount,1}["Eval(freqs[_MATRIX_ELEMENT_ROW_])"];
+	fprintf (stdout, "\nSubstitution rate summary\n");
+
+	for (k3 = 0; k3 < bclasses; k3+=1)
+	{
+		fprintf (stdout, "\n\tBranch class ", k3+1);
+		rateMatrix = {3,partCount}["Eval(\"S_S\"+_MATRIX_ELEMENT_COLUMN_+\"_B\"+k3+\"/syn_scaler_\"+k3)"];
+		rateMatrix = rateMatrix["Eval(\"omega_B\"+k3+\"_S\"+_MATRIX_ELEMENT_COLUMN_)"]["_MATRIX_ELEMENT_ROW_==1"];
+		rateMatrix = rateMatrix["weights[_MATRIX_ELEMENT_COLUMN_]"]["_MATRIX_ELEMENT_ROW_==2"];
+		
+		fprintf (stdout, "\n\tRate class | Synonymous Rate |   Omega   |  Weight "); 
+		
+		for (k2 = 0; k2 < partCount; k2 += 1)
+		{
+			fprintf (stdout, "\n\t ", Format (k2+1,9,0), " | ", Format (rateMatrix[0][k2], 15, 3), " | ", Format (rateMatrix[1][k2], 9, 3), " | ", Format (rateMatrix[2][k2], 6, 2));
+		}
+		
+		fprintf (stdout, "\n");
+	}
+	
+	BL = BranchLength(T_0,-1)*weights[0];
+	for (k2 = 1; k2 < partCount; k2 += 1)
+	{
+		BL += Eval ("BranchLength(T_"+k2+",-1)*weights[k2]");
+	}
+	
+	TAVL = T_0^0;
+	
+	for (k2 = 1; k2 < Abs(TAVL); k2+=1)
+	{
+		(TAVL[k2])["Length"] = BL[k2-1];
+	}
+	fprintf (stdout, "\nScaled mixture-model tree:\n", PostOrderAVL2StringDL(TAVL,1), "\n");
+	
+}
+				 
+
diff --git a/res/TemplateBatchFiles/BranchSiteREL.bf b/res/TemplateBatchFiles/BranchSiteREL.bf
new file mode 100644
index 0000000..92ae3a4
--- /dev/null
+++ b/res/TemplateBatchFiles/BranchSiteREL.bf
@@ -0,0 +1,1080 @@
+RequireVersion ("2.1320141101");
+
+_BSREL_timers  = {5,1};
+taskTimerStart (4);
+
+VERBOSITY_LEVEL				= 0;
+maximum_number_of_omegas   = 10;
+skipCodeSelectionStep 		= 0;
+_useGridSearch              = 1;
+//LF_SMOOTHING_SCALER         = 10;
+LF_SMOOTHING_REDUCTION      = 0.1;
+
+_BSREL.valid_models = {"MGL" : 1};
+
+
+ExecuteAFile(HYPHY_LIB_DIRECTORY + "TemplateBatchFiles" + DIRECTORY_SEPARATOR + "TemplateModels" + DIRECTORY_SEPARATOR + "chooseGeneticCode.def");
+LoadFunctionLibrary("GrabBag");
+LoadFunctionLibrary("dSdNTreeTools");
+LoadFunctionLibrary("CF3x4");
+LoadFunctionLibrary("BranchSiteTemplate");
+LoadFunctionLibrary("TreeTools");
+LoadFunctionLibrary("lib2014/UtilityFunctions.bf");
+
+
+ChoiceList  (oldBSREL,"Run the adaptive version of BS-REL?", 1,NO_SKIP,
+        "Yes","[Strongly recommended] Automatically decide on appropriate model complexity among branches",
+        "No", "[Compatibility only] Sets the number of rate classes on each branch to 3 (as done with the 2011 version of BS-REL)");
+
+if (oldBSREL < 0) {
+    return 1;
+}   
+
+
+ChoiceList  (doSynRateVariation,"Allow branch-site variation in synonymous rates?", 1,NO_SKIP,
+        "Yes","Both alpha and beta vary along branch-site combinations",
+        "No", "[Default] Alpha varies from branch to branch, while omega varies among branch-site combinations");
+
+if (doSynRateVariation < 0) {
+    return 1;
+}   
+
+_BSREL_json    = {"fits" : {},
+                  "test results" : {},
+                  "timers" : {}
+                  };
+                  
+if (oldBSREL) {
+    _BSREL_json["version"] = "3-rate BS-REL";
+    _BSREL_json["PMID"] = "21670087";
+} else {
+    _BSREL_json["version"] = "Adaptive BS-REL";
+    _BSREL_json["PMID"] = "YYY";
+}
+
+_BSREL_json["convergence failures"] = 0;
+
+doSynRateVariation = 1-doSynRateVariation;
+
+DataSet 			ds 				= ReadDataFile(PROMPT_FOR_FILE);
+DataSetFilter 		dsf 			= CreateFilter(ds,3,"","",GeneticCodeExclusions);
+HarvestFrequencies	(nuc3, dsf, 3, 1, 1);
+
+
+nucCF						= CF3x4	(nuc3, GeneticCodeExclusions);
+
+for (matrix_id = 1; matrix_id <= maximum_number_of_omegas; matrix_id += 1) {
+    if (doSynRateVariation) {
+      PopulateModelMatrix			  ("MGMatrix" + matrix_id,  nucCF, "syn" + matrix_id, "", "nonsyn" + matrix_id);    
+    } else {
+       PopulateModelMatrix			  ("MGMatrix" + matrix_id,  nucCF, "t", "omega" + matrix_id, "");
+    }
+    
+    if (matrix_id > 1) {
+        _BSREL.valid_models ["MG" + matrix_id] = matrix_id;
+    }
+    
+}
+
+PopulateModelMatrix			  ("MGMatrixLocal",  nucCF, "syn", "", "nonsyn");
+codon3x4					= BuildCodonFrequencies (nucCF);
+
+tree_info = utility.loadAnnotatedTopology (1);
+
+Model	  MGL				= (MGMatrixLocal, codon3x4, 0);
+
+tree_info_models = tree_info["model_map"];
+
+ExecuteCommands ("Tree baselineTree = " + tree_info["string"]);
+
+totalBranchCount			 = BranchCount(baselineTree) + TipCount (baselineTree);
+bNames						 = BranchName (baselineTree, -1);
+tavl                         = baselineTree ^ 0;
+
+tree_info_map = {};
+for (k = 0; k < totalBranchCount; k+=1) {
+    model_id = _BSREL.valid_models[tree_info_models[bNames[k]]];
+    if (model_id == 0) {
+        tree_info_map = {};
+        break;
+    }
+    tree_info_map[bNames[k]] = model_id;
+}
+
+useExistingModelSpec = 0;
+
+if (oldBSREL == 0 && Abs (tree_info_map)) {
+    ChoiceList  (useExistingModelSpec,"Use the model specified in the tree string?", 1,NO_SKIP,
+        "No", "[Default] Infer the model complexity automatically",
+        "Yes","Use the number of branch-level rate classes as specified in the tree string");
+        
+    if (useExistingModelSpec < 0) {
+        return 1;
+    }
+}
+
+is_internal = {};
+for (k = 1; k < Abs (tavl); k+=1) {
+    is_internal[(tavl[k])["Name"]] = Abs ((tavl[k])["Children"]) > 0;
+}
+
+
+//******* SELECT WHICH BRANCHES TO TEST ********//
+
+selectedBranches = {};
+
+if (doSynRateVariation == 0) {
+    selectTheseForTesting = {totalBranchCount + 4, 2};
+    selectTheseForTesting [0][0] = "None"; selectTheseForTesting [0][1] = "Just fit the branch-site REL model";
+    selectTheseForTesting [1][0] = "All";  selectTheseForTesting [1][1] = "Test all branches";
+    selectTheseForTesting [2][0] = "Internal";  selectTheseForTesting [2][1] = "Test all internal branches";
+    selectTheseForTesting [3][0] = "Leaves";  selectTheseForTesting [3][1] = "Test all terminal branches";
+
+    for (k = 0; k < totalBranchCount; k += 1) {
+        selectTheseForTesting [k+4][0] = bNames[k];
+        selectTheseForTesting [k+4][1] = "Test branch '" + bNames[k] + "'";
+    
+    }
+
+    ChoiceList  (whichBranchesToTest,"Which branches to test?",0,NO_SKIP,selectTheseForTesting);
+
+
+    if (whichBranchesToTest[0] < 0) {
+        return 1;
+    }
+
+    for (k = 0; k < Columns (whichBranchesToTest); k += 1) {
+        if (whichBranchesToTest [k] == 0) {
+            selectedBranches = {}; 
+            break;
+        }
+        if (whichBranchesToTest [k] >= 1 && whichBranchesToTest [k] <= 3) {
+            for (k2 = 0; k2 <  totalBranchCount; k2 += 1) {
+                 if (is_internal [bNames[k2]] && whichBranchesToTest [k] == 2 || is_internal [bNames[k2]] == 0 && whichBranchesToTest [k] == 3 || whichBranchesToTest [k] == 1) {
+                     selectedBranches[k2] = 1;
+                 }
+            }
+            break;
+        }
+        selectedBranches [whichBranchesToTest [k] - 4] = 1;
+    }
+}
+
+if (Abs (selectedBranches)) {
+    fprintf (stdout, "Selected the following branches for testing");
+    selectedBranches["printSelectedBranches"][""];
+} else {
+    fprintf (stdout, "No branch by branch testing will be performed");
+}
+
+function printSelectedBranches (key, value) {
+    fprintf (stdout, "\n\t", bNames[0+key]);
+    return 0;
+}
+
+fprintf (stdout, "\n");
+ 
+//******* BASE MODEL FITTING ********//
+ 
+
+SetDialogPrompt ("Save analysis results to");
+
+lrt_column = 4;
+p_uncorrected_column = 5;
+p_corrected_column = 6;
+branch_length_column = 7;
+
+fprintf (PROMPT_FOR_FILE, CLEAR_FILE, KEEP_OPEN,"Branch,Mean_dNdS,RateClasses,OmegaOver1,WtOmegaOver1,LRT,p,p_Holm,BranchLength");
+csvFilePath = LAST_FILE_PATH;
+
+fprintf 					  (stdout, "[PHASE 0] Fitting the local MG94 (no site-to-site variation) to obtain initial parameter estimates\n");
+
+lfOut	= csvFilePath + ".mglocal.fit";
+
+taskTimerStart (0);
+if (_reload_local_fit) {
+    ExecuteAFile (lfOut);
+    LFCompute (base_LF,LF_START_COMPUTE);
+    LFCompute (base_LF,localLL);
+    LFCompute (base_LF,LF_DONE_COMPUTE);
+    GetString (_lfInfo, base_LF, -1);
+    localParams = Columns (_lfInfo["Local Independent"]) + Columns (_lfInfo["Global Independent"]) + 9;
+    
+} else {
+    LikelihoodFunction	base_LF	 = (dsf, baselineTree);
+    T0 = Time(1);
+    Optimize					  (res_base,base_LF);
+    
+    OPTIMIZATION_TIME_HARD_LIMIT = (Time(1)-T0)*4;
+    LIKELIHOOD_FUNCTION_OUTPUT = 7;
+    fprintf (lfOut, CLEAR_FILE, base_LF);
+    LIKELIHOOD_FUNCTION_OUTPUT = 2;
+
+    localLL						 = res_base[1][0];
+    localParams					 = res_base[1][1] + 9;
+}
+taskTimerStop (0);
+
+current_parameter_count = localParams;
+current_log_L           = localLL;
+sample_size             = dsf.sites * dsf.species;
+current_IC             = getIC (current_log_L, current_parameter_count, sample_size);
+
+json_store_lf                (_BSREL_json, "MG94", localLL, localParams,current_IC, _BSREL_timers[0], +BranchLength (baselineTree,-1), Format (baselineTree, 1,1)); 
+
+LoadFunctionLibrary			 ("DescriptiveStatistics");
+
+//GetInformation	   		   (varNames, "baselineTree\\..*\\.omega1");
+//localOmegaValues			 = {totalBranchCount,1}["Eval(varNames[_MATRIX_ELEMENT_ROW_])"];
+
+pValueByBranch				  = {totalBranchCount,8};
+
+for (k = 0; k < totalBranchCount; k = k+1) {
+	srate  = Eval ("baselineTree." + bNames[k] + ".syn");
+	nsrate = Eval ("baselineTree." + bNames[k] + ".nonsyn");
+	if (srate > 0) {
+		pValueByBranch [k][0] = Min (10, nsrate/srate);
+	}
+	else {
+		pValueByBranch [k][0] = 10;
+	}	
+	
+	node_omegas = {1,2};
+	node_omegas[0] = pValueByBranch [k][0];
+	node_omegas[1] = 1;
+	
+	
+    (((_BSREL_json["fits"])["MG94"]) ["rate distributions"])[bNames[k]] = matrix2json(node_omegas);
+	
+	
+}
+
+omegaStats					 = GatherDescriptiveStats (pValueByBranch[-1][0]);
+
+
+fprintf						 (stdout, "\nLog L = ", localLL, " with ", localParams, " degrees of freedom. IC = ", current_IC, "\n");
+PrintDescriptiveStats		 ("Branch omega values", omegaStats);
+
+
+for (matrix_id = 2; matrix_id <= maximum_number_of_omegas; matrix_id += 1) {
+    freq_weights = generateFrequencyParameterization ("Paux", matrix_id);
+    for (k = 0; k < matrix_id; k += 1) {
+        freq_weights[k] =  "Exp(MGMatrix" + (k+1) + ")*" + freq_weights[k];
+    }
+    ExecuteCommands ("Model 		MG" + matrix_id + "=(\"" + Join("+",freq_weights) + "\",codon3x4,EXPLICIT_FORM_MATRIX_EXPONENTIAL);");
+}
+
+
+ASSUME_REVERSIBLE_MODELS	  = 1;
+USE_LAST_RESULTS              = 1;
+OPTIMIZATION_METHOD           = 0;
+//LF_SMOOTHING_SCALER           = 1;
+LF_SMOOTHING_REDUCTION        = 1/16;
+
+Tree stepupTree               = baselineTree;
+
+
+taskTimerStart (1);
+
+fprintf 					  (stdout, "[PHASE 1] Fitting Branch Site REL models to one branch at a time\n");
+
+mg94bls   = BranchLength (baselineTree,-1);
+sortedBLs = {totalBranchCount, 2}["mg94bls[_MATRIX_ELEMENT_ROW_]*(_MATRIX_ELEMENT_COLUMN_==0)+_MATRIX_ELEMENT_ROW_*(_MATRIX_ELEMENT_COLUMN_==1)"];
+sortedBLs = sortedBLs%0;
+
+rate_classes_by_branch = {};
+
+
+
+for (k = 0; k < totalBranchCount; k+=1) {
+    reordered_index = sortedBLs[totalBranchCount-k-1][1];
+    //reordered_index = sortedBLs[k][1];
+    local_branch_name = bNames[reordered_index];
+    accepted_rates_count = 1;
+    
+    //fprintf (stdout, local_branch_name, ":", useExistingModelSpec, ":", tree_info_map[local_branch_name], ":", accepted_rates_count, "\n");
+    
+    if (useExistingModelSpec && tree_info_map[local_branch_name] == accepted_rates_count) {
+        rate_classes_by_branch [reordered_index] = accepted_rates_count;
+        continue;
+    }
+    
+    branch_name_to_test_base = "stepupTree.`local_branch_name`";
+    ExecuteCommands ("SetParameter (`branch_name_to_test_base`, MODEL, MG2);");
+    
+    Tree         mixtureTree = stepupTree;
+
+    for (l = 0; l < totalBranchCount; l+=1) {
+        if (l != reordered_index) {
+            _constrainVariablesAndDescendants ("mixtureTree." + bNames[l]);
+        }
+    }
+    
+    branch_name_to_test = "mixtureTree." + bNames[reordered_index];
+    setBSRELBounds (branch_name_to_test, 2);
+    copyomegas (branch_name_to_test, Eval ("baselineTree.`local_branch_name`.syn"), Eval ("baselineTree.`local_branch_name`.nonsyn"));
+    
+    
+    LikelihoodFunction stepupLF = (dsf, mixtureTree);
+    
+    
+    fixGlobalParameters           ("stepupLF");
+
+    if (_useGridSearch) {
+        if (!doSynRateVariation) {
+            _baseT = Eval ("baselineTree.`local_branch_name`.syn");
+            
+            computeOnAGrid ({"0": {5,1}["_MATRIX_ELEMENT_ROW_ * 0.2"],
+                 "1": {7,1}["(1+(_MATRIX_ELEMENT_ROW_-3)^3)*(_MATRIX_ELEMENT_ROW_>=3)+(_MATRIX_ELEMENT_ROW_*0.25+0.25)*(_MATRIX_ELEMENT_ROW_<3)"],
+                 "2": {{0.98}{0.95}{0.90}{0.75}{0.5}},
+                 "3": {5,1}["_baseT * (1+(2-_MATRIX_ELEMENT_ROW_)*0.25)"]},
+                {"0": "`branch_name_to_test`.omega1",
+                 "1": "`branch_name_to_test`.omega2",
+                 "2": "`branch_name_to_test`.Paux1",
+                 "3": "`branch_name_to_test`.t"},
+                 "stepupLF");
+        } else {
+             _baseS = Eval ("baselineTree.`local_branch_name`.syn");
+             _baseN = Eval ("baselineTree.`local_branch_name`.nonsyn");
+                computeOnAGrid ({"0": {{_baseS}{_0.5*_baseS + (_baseS==0)*0.05}{_2*_baseS + (_baseS==0)*0.1}{_5*_baseS + (_baseS==0)*0.5}},
+                                 "1": {{_baseN}{_0.5*_baseN + (_baseN==0)*0.05}{_2*_baseN + (_baseN==0)*0.1}{_5*_baseN + (_baseN==0)*0.5}},
+                                 "2": {{0}{0.25}{1.0}{5.0}},
+                                 "3": {{0}{0.25}{1.0}{5.0}},
+                                 "4": {{0.98}{0.90}{0.75}{0.5}}},
+                                {"0": "`branch_name_to_test`.syn1",
+                                 "1": "`branch_name_to_test`.nonsyn1",
+                                 "2": "`branch_name_to_test`.syn2",
+                                 "3": "`branch_name_to_test`.nonsyn2",
+                                 "4": "`branch_name_to_test`.Paux1"},
+                                 "stepupLF");
+        }
+    }
+    
+
+    Optimize                      (res, stepupLF);
+    
+    test_IC = getIC (res[1][0], current_parameter_count + 2 + doSynRateVariation, sample_size);
+    fprintf 					  (stdout, "\n[PHASE 1] Branch ", local_branch_name, " log(L) = ", Format(res[1][0],8,3), ", IC = ", Format (test_IC,8,3), "\n\t2 rate clases\n\t");
+    printNodeDesc ("mixtureTree.`local_branch_name`", 2);
+    
+    while (test_IC < current_IC || oldBSREL && accepted_rates_count < 3 || useExistingModelSpec && tree_info_map[local_branch_name] > accepted_rates_count) {
+        accepted_rates_count += 1;
+        current_parameter_count += 2 + doSynRateVariation;
+        current_IC = Min (test_IC,current_IC);
+        saved_MLEs = saveNodeMLES (branch_name_to_test, accepted_rates_count);
+        if (oldBSREL && accepted_rates_count == 3 || useExistingModelSpec && tree_info_map[local_branch_name] == accepted_rates_count) {
+            break;
+        }
+        ExecuteCommands ("SetParameter (`branch_name_to_test_base`, MODEL, MG" + (accepted_rates_count+1) +");");
+        
+        Tree         mixtureTree = stepupTree;
+        for (l = 0; l < totalBranchCount; l+=1) {
+            if (l != reordered_index) {
+                _constrainVariablesAndDescendants ("mixtureTree." + bNames[l]);
+            }
+        }
+        setBSRELBounds (branch_name_to_test, accepted_rates_count+1);
+        initNodeMLESPlus1 (branch_name_to_test, saved_MLEs);
+        LikelihoodFunction stepupLF = (dsf, mixtureTree);
+        fixGlobalParameters           ("stepupLF");
+        
+        
+        if (_useGridSearch) {
+            if (!doSynRateVariation) {
+                computeOnAGrid ({"0": {10,1}["(1+(_MATRIX_ELEMENT_ROW_-5)^3)*(_MATRIX_ELEMENT_ROW_>=5)+(_MATRIX_ELEMENT_ROW_*0.15+0.15)*(_MATRIX_ELEMENT_ROW_<5)"],
+                 "1": {{0.98}{0.95}{0.90}{0.75}{0.5}{0.25}}},
+                {"0": "`branch_name_to_test`.omega" + (accepted_rates_count+1),
+                 "1": "`branch_name_to_test`.Paux" + (accepted_rates_count)},
+                 "stepupLF");
+            } else {
+                computeOnAGrid ({"0": {{0.0,0.25,0.5,1.0,5.0}},
+                 "1": {{0.0,0.25,0.5,1.0,5.0}},
+                 "2": {{0.98}{0.90}{0.75}{0.5}{0.25}}},
+                {"0": "`branch_name_to_test`.syn" + (accepted_rates_count+1),
+                 "1": "`branch_name_to_test`.nonsyn" + (accepted_rates_count+1),
+                 "2": "`branch_name_to_test`.Paux" + (accepted_rates_count)},
+                 "stepupLF");
+            
+            }
+        }
+        
+        Optimize                      (res, stepupLF);
+        test_IC = getIC (res[1][0], current_parameter_count + 2 + doSynRateVariation, sample_size);
+        fprintf 					  (stdout, "\n[PHASE 1] Branch ", local_branch_name, " log(L) = ", res[1][0], ", IC = ", test_IC, "\n\t", accepted_rates_count+1, " rate clases\n\t");
+        printNodeDesc ("mixtureTree.`local_branch_name`", accepted_rates_count + 1);
+
+    }
+    
+    if (accepted_rates_count > 1) {
+        ExecuteCommands ("SetParameter (`branch_name_to_test_base`, MODEL, MG" + (accepted_rates_count) +");");
+        Tree         mixtureTree = stepupTree;
+        restoreNodeMLE (branch_name_to_test, saved_MLEs);
+    }
+
+    Tree stepupTree = mixtureTree;
+    
+    if (accepted_rates_count == 1) {
+        ExecuteCommands ("SetParameter (`branch_name_to_test_base`, MODEL, MGL);");
+        ExecuteCommands ("`branch_name_to_test_base`.syn = baselineTree.`local_branch_name`.syn");
+        ExecuteCommands ("`branch_name_to_test_base`.nonsyn = baselineTree.`local_branch_name`.nonsyn");
+    }
+
+    rate_classes_by_branch [reordered_index] = accepted_rates_count;
+}
+
+//DeleteObject (stepupLF);
+
+Tree mixtureTree = stepupTree;
+ClearConstraints (mixtureTree);
+
+INCLUDE_MODEL_SPECS = 1;
+save_tree_string_to	= csvFilePath + ".annotated.nwk";
+fprintf (save_tree_string_to, CLEAR_FILE, stepupTree);
+INCLUDE_MODEL_SPECS = 0;
+
+// need this so that DeleteObject does not die later
+LikelihoodFunction stepupLF = (dsf, mixtureTree);
+
+fprintf (stdout, "\n\n[INFERRED MODEL COMPLEXITY]");
+
+for (k = 0; k < totalBranchCount; k+=1) {
+    branch_name_to_test = "mixtureTree." + bNames[k];
+    pValueByBranch [k][1] = rate_classes_by_branch[k];
+    if (rate_classes_by_branch [k] != 1) {
+        setBSRELBounds (branch_name_to_test, rate_classes_by_branch[k]);
+    }
+    fprintf (stdout, "\n\t", branch_name_to_test, " has ", rate_classes_by_branch [k], " site rate classes");
+}
+fprintf (stdout, "\n");
+
+taskTimerStop (1);
+(_BSREL_json ["timers"])["Complexity analysis"] = _BSREL_timers[1];
+
+
+OPTIMIZATION_TIME_HARD_LIMIT = 1e26;
+
+//LF_SMOOTHING_SCALER           = 1/8;
+LF_SMOOTHING_REDUCTION        = 1/2;
+
+
+LikelihoodFunction three_LF   = (dsf,mixtureTree);
+unconstrainGlobalParameters ("three_LF");
+
+VERBOSITY_LEVEL     = 0;
+USE_LAST_RESULTS    = 1;
+OPTIMIZATION_METHOD = 0;
+
+
+fprintf 					  (stdout, "\n\n[PHASE 2] Fitting the full LOCAL alternative model (no constraints)\n");
+VERBOSITY_LEVEL = 0;
+taskTimerStart (2);
+Optimize					  (res_three_LF,three_LF);
+taskTimerStop (2);
+fprintf						  (stdout, "\nLog L = ", res_three_LF[1][0], " with ", res_three_LF[1][1] + 9, " degrees of freedom, IC = ", getIC (res_three_LF[1][0], res_three_LF[1][1] + 9, sample_size), "\n");
+
+
+//LF_SMOOTHING_SCALER           = 10;
+LF_SMOOTHING_REDUCTION        = 0.1;
+
+
+lfOut	= csvFilePath + ".fit";
+LIKELIHOOD_FUNCTION_OUTPUT = 7;
+fprintf (lfOut, CLEAR_FILE, three_LF);
+LIKELIHOOD_FUNCTION_OUTPUT = 2;
+
+if (doSynRateVariation) {
+    bsrel_bls = extractBranchLengthsFromBSREL_SRV ("mixtureTree");
+} else {
+    bsrel_bls = extractBranchLengthsFromBSREL ("mixtureTree");
+}
+
+tavl         = mixtureTree ^ 0;
+renderString = PostOrderAVL2StringDistances (tavl, bsrel_bls);
+fprintf (stdout, renderString, "\n");
+
+UseModel (USE_NO_MODEL);
+Tree T = renderString;
+//_BSREL_json ["tree"] = renderString;
+
+json_store_lf                 (_BSREL_json, "Full model", res_three_LF[1][0], res_three_LF[1][1] + 9, getIC (res_three_LF[1][0], res_three_LF[1][1] + 9, sample_size), _BSREL_timers[2],
+                                            +BranchLength (T, -1),
+                                            renderString); 
+
+
+taskTimerStart (3);
+
+totalTestedBranches = 1;
+secondaryOptimizations = 0;
+
+for	(k = 0; k < totalBranchCount; k += 1) {
+    pValueByBranch[k][branch_length_column] = bsrel_bls[bNames[k]];
+    
+
+    ref = "mixtureTree."+bNames[k];
+    
+    rate_classes = rate_classes_by_branch[k];
+    node_omegas = getNodeOmegaDistribution (ref, rate_classes);
+    
+    (((_BSREL_json["fits"])["Full model"]) ["rate distributions"])[bNames[k]] = matrix2json(node_omegas);
+    
+    fprintf (stdout, "\n");
+    printNodeDesc (ref, rate_classes_by_branch[k]);
+    
+    if (node_omegas[rate_classes-1][0] > 1) {
+        pValueByBranch[k][2] = node_omegas[rate_classes-1][0];
+        pValueByBranch[k][3] = node_omegas[rate_classes-1][1];
+    }
+    
+    totalTestedBranches += selectedBranches[k] > 0;
+
+    if (node_omegas[rate_classes-1][0] > 1 && node_omegas[rate_classes-1][1] > 1e-6 && selectedBranches[k] && bsrel_bls[bNames[k]] > 1e-8) {
+        fprintf (stdout, "...Testing for selection at this branch\n");
+        _stashLF = saveLF ("three_LF");
+        
+        if (rate_classes > 1) {
+            if (doSynRateVariation) {
+                for (rc = 1; rc <= rate_classes; rc += 1) {
+                    ratio = "_mg94omega" + rc;
+                    nonsynvar = ref + ".nonsyn" + rc;
+                    synvar    = ref + ".syn" + rc;
+                    
+                    Eval ("global `ratio` = " + *(nonsynvar)/(*(synvar)));
+                    ^ratio :< 1;
+                    Eval ("`nonsynvar` := " + "`synvar` * `ratio`");                    
+                }
+            } else {
+                testing_parameter =   ref + ".omega" + rate_classes;
+                *testing_parameter :< 1;
+            }
+        } else {
+            global _mg94omega = 1;
+            _mg94omega :< 1;
+            *(ref + ".syn") = (*(ref + ".nonsyn") + *(ref + ".syn")) / 2;
+            *(ref + ".nonsyn") := *(ref + ".syn") * _mg94omega;
+        }
+        
+        //VERBOSITY_LEVEL = 10;
+        
+        secondaryOptimizations += 1;
+        Optimize					  (res_three_current,three_LF);
+        
+        fprintf (stdout, "\n");
+        printNodeDesc (ref, rate_classes_by_branch[k]);
+        pValueByBranch[k][lrt_column]			  = 2*(res_three_LF[1][0] - res_three_current[1][0]);	
+        if (doSynRateVariation && rate_classes) {
+            pValueByBranch[k][p_uncorrected_column]			  = (1-CChi2 (pValueByBranch[k][lrt_column],rate_classes));       
+        } else {	 
+            if (oldBSREL) {
+                pValueByBranch[k][p_uncorrected_column]			  = (1-0.1*CChi2 (pValueByBranch[k][lrt_column],1)-0.9* CChi2 (pValueByBranch[k][lrt_column],2))*.5;
+            
+            } else {
+                pValueByBranch[k][p_uncorrected_column]			  = (1-0.4*CChi2 (pValueByBranch[k][lrt_column],1)-0.6* CChi2 (pValueByBranch[k][lrt_column],2))*.5;
+            }            
+        }
+        
+        fprintf (stdout, "p-value = ", pValueByBranch[k][p_uncorrected_column], "\n");
+        
+        (_BSREL_json["test results"])[bNames[k]] = {"LRT": pValueByBranch[k][lrt_column],
+                                                    "uncorrected p": pValueByBranch[k][p_uncorrected_column]};
+        
+        if (rate_classes > 1) {
+            if (doSynRateVariation == 0) {
+                *testing_parameter :< 10000;
+            } else {
+                for (rc = 1; rc <= rate_classes; rc += 1) {
+                    *(ref + ".nonsyn" + rc) = *(ref + ".nonsyn" + rc);                    
+                }
+            }
+        }
+        
+        if (pValueByBranch[k][lrt_column] < (-0.5)) {
+            
+            
+            if (rate_classes > 1) {
+                if (doSynRateVariation) {
+                    for (rc = 1; rc <= rate_classes; rc += 1) {
+                        ratio = "_mg94omega" + rc;
+                        nonsynvar = ref + ".nonsyn" + rc;
+                        synvar    = ref + ".syn" + rc;
+                        Eval ("`nonsynvar` = " + "`synvar` * `ratio`");                    
+                    }
+                } 
+            } else {
+                *(ref + ".nonsyn") = *(ref + ".syn") * _mg94omega;
+            }
+            
+        
+            fprintf 					  (stdout, "[PHASE 2/REPEAT] Detected a convergence problem; refitting the LOCAL alternative model with new starting values\n");
+            lfOut	= csvFilePath + ".fit";
+            _BSREL_json["convergence failures"] += 1;
+            Optimize					  (res_three_LF,three_LF);
+            json_store_lf                 ( _BSREL_json,
+                                            "BS-REL",
+                                            res_three_LF[1][0],
+                                            res_three_LF[1][1] + 9,
+                                            getIC(  res_three_LF[1][0],
+                                                    res_three_LF[1][1],
+                                                    sample_size),
+                                            _BSREL_timers[2],
+                                            +BranchLength (T, -1),
+                                            renderString);
+            LIKELIHOOD_FUNCTION_OUTPUT = 7;
+            fprintf (lfOut, CLEAR_FILE, three_LF);
+            LIKELIHOOD_FUNCTION_OUTPUT = 2;
+            _stashLF = saveLF ("three_LF");
+            k = 0;
+            secondaryOptimizations = 0;
+        }
+        else {
+            _stashLF ["restoreLF"][""];
+        }
+    }
+    else
+    {
+        pValueByBranch[k][p_uncorrected_column] = 1.0;
+        (_BSREL_json["test results"])[bNames[k]] = {"LRT": "test not run",
+                                                    "uncorrected p": 1.0};
+    }
+    ((_BSREL_json["test results"])[bNames[k]])["tested"] = selectedBranches[k];
+}
+
+taskTimerStop (3);
+(_BSREL_json ["timers"])["Testing"] = _BSREL_timers[3];
+
+
+OPTIMIZATION_METHOD = 4;
+
+
+pValueSorter = {totalBranchCount,2};
+pValueSorter = pValueSorter["_MATRIX_ELEMENT_ROW_*(_MATRIX_ELEMENT_COLUMN_==0)+pValueByBranch[_MATRIX_ELEMENT_ROW_][p_uncorrected_column]*(_MATRIX_ELEMENT_COLUMN_==1)"];
+pValueSorter = pValueSorter % 1;
+pValueSorter = pValueSorter["_MATRIX_ELEMENT_VALUE_*(_MATRIX_ELEMENT_COLUMN_==0)+_MATRIX_ELEMENT_VALUE_*(Max(1,totalTestedBranches-_MATRIX_ELEMENT_ROW_))*(_MATRIX_ELEMENT_COLUMN_==1)"];
+
+fprintf (stdout,"\n\nSummary of branches under episodic selection (", Abs(selectedBranches)," were tested, of which ", secondaryOptimizations, " required optimizations) :\n");
+hasBranchesUnderSelection = 0;
+
+pthreshold = 0.05;
+
+for		(k = 0; k < totalBranchCount; k = k+1)
+{
+    pValueByBranch[pValueSorter[k][0]][p_corrected_column] = Min (1,pValueSorter[k][1]);
+    if (pValueSorter[k][1] <= pthreshold) {
+        fprintf (stdout, "\t", bNames[pValueSorter[k][0]], " p = ", pValueByBranch[pValueSorter[k][0]][p_corrected_column], "\n");
+        hasBranchesUnderSelection += 1;
+    }
+    ((_BSREL_json["test results"])[bNames[pValueSorter[k][0]]])["p"] = pValueByBranch[pValueSorter[k][0]][p_corrected_column] ;
+
+}
+
+
+if (hasBranchesUnderSelection == 0) {
+    fprintf (stdout, "\tNo branches were found to be under selection at p <= ", pthreshold, "\n");
+}
+
+
+for		(k = 0; k < totalBranchCount; k = k+1) {
+    fprintf (csvFilePath, "\n", bNames[k], ",", Join(",",pValueByBranch[k][-1]));
+}
+
+
+fprintf (csvFilePath, CLOSE_FILE);
+jsonFilePath = csvFilePath + ".json";
+taskTimerStop (4);
+(_BSREL_json ["timers"])["overall"] = _BSREL_timers[4];
+fprintf        (jsonFilePath, CLEAR_FILE, _BSREL_json);
+
+
+DeleteObject (stepupLF, three_LF, base_FL);
+
+printTimers (_BSREL_timers, {"0" : "MG94 model fit",
+                             "1" : "Rate class complexity analysis",
+                             "2" : "aBSREL model fit",
+                             "3" : "Individual branch selection testing",
+                             "4" : "Total time"});
+
+return pValueByBranch;
+
+//------------------------------------------------------------------------------------------------------------------------
+function makeDNDSColor (omega) {
+	if (omega < 1) {
+		return {{0.5*omega__,0.5*omega__,1-0.5*omega__}};
+	}
+	omega = Min (omega,5);
+	return {{0.5+0.125*(omega__-1),0.5-(omega__-1)*0.125,0.5-(omega__-1)*0.125}};
+}
+
+//------------------------------------------------------------------------------------------------------------------------
+function saveLF (ID) {
+	ExecuteCommands ("GetString(_lfInfo,"+ID+",-1)");
+	_stashLF = {};
+	for (_k = 0; _k < Columns (_lfInfo["Global Independent"]); _k+=1)
+	{
+		_stashLF [(_lfInfo["Global Independent"])[_k]] = Eval ((_lfInfo["Global Independent"])[_k]);
+	}
+	for (_k = 0; _k < Columns (_lfInfo["Local Independent"]); _k+=1)
+	{
+		_stashLF [(_lfInfo["Local Independent"])[_k]] = Eval ((_lfInfo["Local Independent"])[_k]);
+	}
+	
+	return _stashLF;
+}
+
+//------------------------------------------------------------------------------------------------------------------------
+
+function restoreLF (key, value) {
+	ExecuteCommands (key + " = " + value);
+	return 0;
+}
+
+//------------------------------------------------------------------------------------------------------------------------
+
+lfunction printTimers (timers, titles) {
+    fprintf (stdout, "\n\n === CPU TIME REPORT === \n");
+    for (k = 0; k < Rows (timers); k+=1) {
+        fprintf (stdout, "\t", titles[k], " : ", _formatTimeString (timers[k]), "\n");
+    }
+
+}
+//------------------------------------------------------------------------------------------------------------------------
+
+lfunction printNodeDesc (ref, rate_classes) {
+    if (rate_classes > 1) {
+        do_srv = ^("doSynRateVariation");
+        wts = generateFrequencyParameterization ("Paux", rate_classes);
+     
+        fprintf (stdout, "Node: ", ref);
+        if (! do_srv) {
+            fprintf (stdout,"\n\tLength parameter = ", ^(ref+".t"));
+        }
+                 
+        for (k = 1; k < rate_classes; k+=1) {
+            Eval ("Paux" + k + "= ^(ref+\".Paux\" + k)");
+        }
+
+        for (k = 0; k < rate_classes; k+=1) {
+            if (do_srv) {
+                fprintf (stdout, "\n\tClass ", k+1,
+                         "\n\t\tsyn     : ", Format(^(ref+".syn" + (k+1)),10,4), 
+                         "\n\t\tnon-syn : ", Format(^(ref+".nonsyn" + (k+1)),10,4), 
+                         "\n\t\tomega   : ", _standardizeRatio (^(ref+".nonsyn" + (k+1)),^(ref+".syn" + (k+1))),
+                         "\n\t\tweight  : ", Format(Eval(wts[k]),10,4));            
+            } else {
+                fprintf (stdout, "\n\tClass ", k+1,
+                        "\n\t\tomega = ", Format(^(ref+".omega" + (k+1)),5,3), 
+                        "\n\t\tweight = ", Format(Eval(wts[k]),5,3));
+            }
+        }
+                  
+        fprintf (stdout, "\n"); 
+    } else {
+        fprintf (stdout, "Node: ", ref, 
+                     "\n\tLength parameter = ", ^(ref+".syn"));
+        
+        fprintf (stdout, "\n\tClass ", rate_classes ,": omega = ", _standardizeRatio(^(ref+".nonsyn"),^(ref+".syn")), ", weight = 1.\n");
+    }    
+    return 0;
+}
+
+//------------------------------------------------------------------------------------------------------------------------
+
+function getIC (logl,params,samples) {
+    return -2*logl + 2*samples/(samples-params-1)*params;
+    //return -2*logl + Log (samples)*params;
+}
+
+//------------------------------------------------------------------------------------------------------------------------
+
+function copyomegas (node, syn, nonsyn) {
+    if (doSynRateVariation) {
+        if (syn>nonsyn) {
+            Eval("`node`.Paux1 = 1");
+            Eval("`node`.syn1=  syn");
+            Eval("`node`.nonsyn1 = nonsyn");        
+        } else {
+            Eval("`node`.Paux1 = 0");
+            Eval("`node`.syn2 =  syn");
+            Eval("`node`.nonsyn2 = nonsyn");        
+        }
+        
+    } else {
+        local_omega = =  Min (10, nonsyn/syn);
+        Eval("`node`.omega2 = 1");
+        if (local_omega < 1) {
+            Eval("`node`.Paux1 = 1");
+            Eval("`node`.omega1 =  local_omega");
+            Eval("`node`.omega2 = 10");
+        } else {
+            Eval("`node`.Paux1 = 0");
+            Eval("`node`.omega2 =  local_omega");
+            Eval("`node`.omega1 = 0");    
+        }
+        Eval("`node`.t = syn");    
+    }
+       
+    return 0;
+}
+
+//------------------------------------------------------------------------------------------------------------------------
+
+lfunction setBSRELBounds (node, count) {
+    do_srv = ^("doSynRateVariation");
+    for (k = 1; k < count; k += 1) {
+        ^("`node`.Paux" + k ) :< 1;   
+        if (do_srv == 0) {
+            ^("`node`.omega" + k ) :<1;
+        }   
+    }
+    return 0;
+}
+
+
+//------------------------------------------------------------------------------------------------------------------------
+
+lfunction getNodeOmegaDistribution (ref, rate_classes) {
+    values = {rate_classes, 2};
+    do_srv = ^("doSynRateVariation");
+
+    if (rate_classes > 1) {
+        wts = generateFrequencyParameterization ("Paux", rate_classes);     
+        for (k = 0; k < rate_classes; k+=1) {
+            if (do_srv) {
+                values[k][0] = ^(ref+".nonsyn" + (k+1))/^(ref+".syn" + (k+1));            
+            } else {
+                values[k][0] = ^(ref+".omega" + (k+1));
+            }
+            
+            if (k < rate_classes - 1) {
+                Eval ("Paux" + (k+1) + " = ^(ref+\".Paux\" + (k+1))" );
+            }
+            values[k][1] = Eval(wts[k]);
+        }
+        
+    } else {
+        ns = ^("`ref`.nonsyn");
+        syn = ^("`ref`.syn");
+        if (syn == 0) {
+            if (ns > 0) {
+                values[0][0] = 1e26;
+            } else {
+                values[0][0] = 1;
+            }
+        } else {
+            values [0][0] =   ns/syn;
+        }
+        values [0][1] =   1;        
+    }
+    return values;
+}
+
+//------------------------------------------------------------------------------------------------------------------------
+
+lfunction saveNodeMLES (node, count) {
+    do_srv = ^("doSynRateVariation");
+    values = {count, 2 + do_srv};
+
+    if (do_srv) {
+         for (k = 0; k < count - 1; k += 1) {
+            values [k][0] = ^("`node`.syn" + (k+1));
+            values [k][1] = ^("`node`.nonsyn" + (k+1));
+            values [k][2] = ^("`node`.Paux" + (k+1));        
+        }
+        values [count-1][0] = ^("`node`.syn" + count);
+        values [count-1][1] = ^("`node`.nonsyn" + count);
+    
+    } else {
+        for (k = 0; k < count - 1; k += 1) {
+            values [k][0] = ^("`node`.omega" + (k+1));
+            values [k][1] = ^("`node`.Paux" + (k+1));        
+        }
+        values [count-1][0] = ^("`node`.omega" + count);
+        values [count-1][1] = ^("`node`.t");
+    }
+    return values;
+}
+
+//------------------------------------------------------------------------------------------------------------------------
+
+lfunction initNodeMLESPlus1 (node, values) {
+    count = Rows (values);
+    do_srv = ^("doSynRateVariation");
+    
+    if (do_srv) {
+        for (k = 0; k < count - 1; k += 1) {
+            ^("`node`.syn" + (k+1)) = values[k][0];
+            ^("`node`.nonsyn" + (k+1)) = values[k][1];
+            ^("`node`.Paux"  + (k+1)) = values[k][2];        
+        }
+        ^("`node`.syn" + (count+1)) = 1;
+        ^("`node`.nonsyn" + (count+1)) = 1;
+        ^("`node`.Paux"  + (count))   = 0.99;        
+        
+        
+    } else {
+        for (k = 0; k < count - 1; k += 1) {
+            ^("`node`.omega" + (k+1)) = values[k][0];
+            ^("`node`.Paux"  + (k+1)) = values[k][1];        
+        }
+        if (values[count-1][0] > 1) {
+            ^("`node`.omega" + (count+1)) = values[count-1][0];
+            ^("`node`.Paux"  + (count))   = 0.01;        
+            ^("`node`.omega" + (count))   = 0.5;
+        } else {
+            ^("`node`.omega" + (count+1)) = 2;
+            ^("`node`.Paux"  + (count))   = 0.99;        
+            ^("`node`.omega" + (count))   = values[count-1][0];
+        }
+        ^("`node`.t") = values[count-1][1];  
+    }
+    
+    return 0;
+}
+
+//------------------------------------------------------------------------------------------------------------------------
+
+lfunction restoreNodeMLE (node, values) {
+    count = Rows (values);
+    do_srv = ^("doSynRateVariation");
+
+    if (do_srv) {
+        for (k = 0; k < count - 1; k += 1) {
+             ^("`node`.syn" + (k+1)) = values[k][0];
+             ^("`node`.nonsyn" + (k+1)) = values[k][1];
+             ^("`node`.Paux"  + (k+1)) = values[k][2];        
+        }
+        ^("`node`.syn" + count) = values[count-1][0];  
+        ^("`node`.nonsyn" + count) = values[count-1][1];  
+
+    } else {
+        for (k = 0; k < count - 1; k += 1) {
+             ^("`node`.omega" + (k+1)) = values[k][0];
+             ^("`node`.Paux"  + (k+1)) = values[k][1];        
+        }
+        ^("`node`.omega" + count) = values[count-1][0];  
+        ^("`node`.t") = values[count-1][1];  
+    }
+    return 0;
+}
+
+
+//------------------------------------------------------------------------------------------------------------------------
+
+lfunction generateFrequencyParameterization (prefix, count) {
+    result = {1, count};
+    if (count > 1) {
+        result[0] = "`prefix`1";
+        buffer = "(1-`prefix`1)";
+        for (i = 1; i < count - 1; i+=1) {
+            result[i] = buffer + "*" + "`prefix`" + (i+1);
+            buffer   += "*(1-`prefix`" + (i+1) + ")";
+        } 
+        result[count-1] = buffer;
+    } else {
+        result [0] = "1";
+    }
+    return result;
+}
+
+//------------------------------------------------------------------------------------------------------------------------
+
+lfunction copyParametersToArray (parameters) {
+    p_count = Abs (parameters);
+    array = {p_count, 1};
+    for (k = 0; k < p_count; k += 1) {
+        array[k] = ^(parameters[k]);
+    }
+    return array;
+}
+
+//------------------------------------------------------------------------------------------------------------------------
+
+function taskTimerStart (index) {
+    _BSREL_timers[index] = Time(1);
+}
+
+function taskTimerStop (index) {
+    _BSREL_timers[index] = Time(1) - _BSREL_timers[index];
+
+}
+
+//------------------------------------------------------------------------------------------------------------------------
+
+lfunction copyArrayToParameters (array, parameters) {
+    p_count = Abs (parameters);
+    for (k = 0; k < p_count; k += 1) {
+        param_name = parameters[k];
+        ^(param_name) =  array[k];
+        if (^param_name != array[k]) {
+            return -1;
+        }
+    }
+    return 0;
+}
+
+//------------------------------------------------------------------------------------------------------------------------
+
+lfunction computeOnAGrid (grid_points, parameters, lfname) {
+    parameter_count = Abs (parameters);
+    grid_dimensions = {parameter_count,1};
+    total_grid_points     = 1;
+    
+     
+    for (k = 0; k < parameter_count; k += 1) {
+        grid_dimensions[k] = Rows(grid_points[k]);
+        total_grid_points = total_grid_points * grid_dimensions[k];
+    }
+    
+    best_val :> -1e100;
+    best_val = -1e100;
+    
+    current_state = copyParametersToArray (parameters);
+
+
+    LFCompute (^lfname,LF_START_COMPUTE);
+    for (grid_point = 0; grid_point < total_grid_points; grid_point += 1) {
+        index = grid_point;
+        for (p_id = 0; p_id < parameter_count; p_id += 1) {
+            current_state[p_id] = (grid_points[p_id])[index % grid_dimensions[p_id]];
+            index = index $ grid_dimensions[p_id];
+        }
+        copyArrayToParameters (current_state, parameters);
+        LFCompute (^lfname, try_value);
+        
+        if (try_value > best_val) {
+            best_state  = current_state;
+            best_val = try_value;
+        }
+    }
+    copyArrayToParameters (best_state, parameters);
+    LFCompute (^lfname, current_value);
+    LFCompute(^lfname,LF_DONE_COMPUTE);
+    return best_state;
+            
+}
+
+//------------------------------------------------------------------------------------------------------------------------
+
+lfunction matrix2json (mx) {
+    result_str = ""; result_str * 128;
+    result_str * "[";
+    for (r = 0; r < Rows (mx); r+=1) {
+        if (r) {
+            result_str * ",";
+        }
+        result_str * ("[" + Join(",",mx[r][-1]) + "]");
+    }
+    result_str * "]";
+    result_str * 0;
+    return result_str;
+}
+
+//------------------------------------------------------------------------------------------------------------------------
+
+lfunction json_store_lf (json, name, ll, df, aicc, time, tree_length, tree_string) {
+    (json["fits"])[name] = {"log-likelihood": ll,
+                            "parameters": df,
+                            "AIC-c" : aicc,
+                            "runtime" : time,
+                            "tree length" : tree_length,
+                            "tree string" : tree_string,
+                            "rate distributions" : {}};
+}
diff --git a/res/TemplateBatchFiles/BranchSiteRELMultiModel.bf b/res/TemplateBatchFiles/BranchSiteRELMultiModel.bf
new file mode 100644
index 0000000..80326ee
--- /dev/null
+++ b/res/TemplateBatchFiles/BranchSiteRELMultiModel.bf
@@ -0,0 +1,575 @@
+skipCodeSelectionStep 		= 0;
+
+
+LoadFunctionLibrary("chooseGeneticCode");
+LoadFunctionLibrary("GrabBag");
+LoadFunctionLibrary("dSdNTreeTools");
+LoadFunctionLibrary("CF3x4");
+LoadFunctionLibrary("BranchSiteTemplate");
+LoadFunctionLibrary("DescriptiveStatistics");
+LoadFunctionLibrary("TreeTools");
+
+
+DataSet 			ds 				= ReadDataFile(PROMPT_FOR_FILE);
+DataSetFilter 		dsf 			= CreateFilter(ds,3,"","",GeneticCodeExclusions);
+
+HarvestFrequencies	(nuc3, dsf, 3, 1, 1);
+nucCF			  = CF3x4	(nuc3, GeneticCodeExclusions);
+
+rate_class_count = prompt_for_a_value ("How many rate classes", 3, 2, 8, 1);
+fprintf (stdout, "\nUsing ", rate_class_count, " rate classes\n");
+
+PopulateModelMatrix			  ("MGMatrixLocal",  nucCF, "syn", "", "nonsyn");
+codon3x4					= BuildCodonFrequencies (nucCF);
+Model		MGL				= (MGMatrixLocal, codon3x4, 0);
+
+_DO_TREE_REBALANCE_ = 0;
+LoadFunctionLibrary			  ("queryTree");
+
+SetDialogPrompt ("Save analysis results to");
+fprintf (PROMPT_FOR_FILE, CLEAR_FILE, KEEP_OPEN,"Model\tLogL\tNP\tBIC\tTree String");
+csvFilePath = LAST_FILE_PATH;
+
+
+// ---- PHASE 0 : LOCAL (no omega variation model) FIT. -----
+
+fprintf 					  (stdout, "[BS-REL PHASE 0] Fitting the local MG94 (no site-to-site variation) to obtain initial parameter estimates\n");
+
+
+LikelihoodFunction	base_LF	 = (dsf, givenTree);
+
+/*
+ExecuteAFile (csvFilePath + ".mglocal.fit");
+res_base = {2,2};
+*/
+
+Optimize					  (res_base,base_LF);
+writeTheLF (".mglocal.fit", "base_LF");
+baseParameters                = 9;
+localLL						 = res_base[1][0];
+localParams					 = res_base[1][1] + baseParameters;
+
+totalBranchCount			 = BranchCount(givenTree) + TipCount (givenTree);
+
+pValueByBranch				  = {totalBranchCount,10};
+bNames						  = BranchName (givenTree, -1);
+
+for (k = 0; k < totalBranchCount; k = k+1) {
+	srate  = Eval ("givenTree." + bNames[k] + ".syn");
+	nsrate = Eval ("givenTree." + bNames[k] + ".nonsyn");
+	if (srate > 0) {
+		pValueByBranch [k][0] = Min (10, nsrate/srate);
+	} else {
+		pValueByBranch [k][0] = 10;
+	}	
+}
+
+sample_size                    = dsf.sites * dsf.species;
+omegaStats					 = GatherDescriptiveStats (pValueByBranch[-1][0]);
+fprintf						 (stdout, "Local omega model (no rate variation) ");
+
+
+localBIC                    = BIC (localLL, localParams, sample_size);
+PrintDescriptiveStats		 ("Branch omega values", omegaStats);
+
+for (rcc = 1; rcc <= rate_class_count; rcc += 1) {
+    PopulateModelMatrix			  ("MGMatrix"+rcc,  nucCF, "t", "omega"+rcc, "");
+    ExecuteCommands               ("global omegaG" + rcc + " = " + (0.3*rcc - 0.2));
+    PopulateModelMatrix			  ("MGMatrixG"+rcc,  nucCF, "t", "omegaG"+rcc, "");
+}
+    
+// ---- PHASE 1 : FULL GLOBAL MODEL FIT ---- //
+
+generate_bs_rel_gdd_freqs (rate_class_count, "global_freqsG", "model_mixingG", "PauxG", "MGMatrixG",1);
+generate_bs_rel_gdd_freqs (rate_class_count, "global_freqs",  "model_mixing",  "Paux", "MGMatrix",0);
+
+sortedLocalDNDS              = (pValueByBranch[-1][0])%0;
+
+for (rcc = 1; rcc <= rate_class_count; rcc += 1) {
+    ExecuteCommands ("omegaG" + rcc + "=" +  sortedLocalDNDS[Max(0,totalBranchCount*rcc$rate_class_count-1)]);
+}
+
+
+ExecuteCommands ("Model 		MGG	=(\"`model_mixingG`\",codon3x4,EXPLICIT_FORM_MATRIX_EXPONENTIAL);");
+Tree						   mixtureTreeG = treeString;
+
+ExecuteCommands ("Model 		MGLocal=(\"`model_mixing`\",codon3x4,EXPLICIT_FORM_MATRIX_EXPONENTIAL);");
+Tree						   mixtureTree = treeString;
+
+ReplicateConstraint 		  ("this1.?.t:=this2.?.syn",mixtureTreeG,givenTree);
+ReplicateConstraint 		  ("this1.?.t:=this2.?.syn",mixtureTree,givenTree);
+ClearConstraints			  (mixtureTree);
+ClearConstraints			  (mixtureTreeG);
+
+
+ASSUME_REVERSIBLE_MODELS	  = 1;
+OPTIMIZATION_METHOD           = 4;
+
+BIC_scores                    = {};
+BranchLengthEstimates         = {};
+
+mixTreeAVL                    = mixtureTreeG ^ 0;
+
+LikelihoodFunction three_LFG   = (dsf,mixtureTreeG);
+fprintf 					  (stdout, "[BS-REL PHASE 1] Fitting a GLOBAL branch-site matrix mixture\n");
+
+
+blG = getBranchLengthExpression (1);
+removeT = "/(" + (blG ^{{"\\*t",""}}) + ")";
+
+fprintf (stdout, base_LF);
+
+blLocal = {};
+for (k = 0; k < totalBranchCount; k += 1) {
+    blLocal [bNames[k]] = Eval("BranchLength(givenTree,\""+bNames[k]+"\")")*3;
+    ExecuteCommands ("mixtureTreeG." + bNames[k] + ".t := " + blLocal [bNames[k]] + removeT );    
+}
+
+
+USE_LAST_RESULTS			= 1;
+SHORT_MPI_RETURN            = 1;
+VERBOSITY_LEVEL				= 0;
+
+OPTIMIZATION_PRECISION      = 0.1;
+
+Optimize					  (res_three_LF_global,three_LFG);
+
+fprintf (stdout, "\n\nApproximation phase 1 (use MG-local branch lengths): ", res_three_LF_global[1][0], "\n");
+fprintf     (stdout,"Tree branch lengths:\n",PostOrderAVL2StringDistances(mixTreeAVL,getBranchLengths ("mixtureTreeG", 1)));
+
+OPTIMIZATION_PRECISION      = 0.01;
+
+for (k = 0; k < totalBranchCount; k += 1) {
+    ExecuteCommands ("mixtureTreeG." + bNames[k] + ".t = mixtureTreeG." + bNames[k] + ".t");    
+    bl = blLocal [bNames[k]] ;
+    ExecuteCommands ("FindRoot (z,`blG`-"+bl+",t,0,10000);");
+    ExecuteCommands ("mixtureTreeG." + bNames[k] + ".t :< " + 10*z);    
+
+}
+
+Optimize					  (res_three_LF_global,three_LFG);
+fprintf (stdout, "\n\nApproximation phase 2 (maximum branch lengths are limited to 10x those of the null model): ", res_three_LF_global[1][0], "\n");
+fprintf     (stdout,"Tree branch lengths:\n",PostOrderAVL2StringDistances(mixTreeAVL,getBranchLengths ("mixtureTreeG", 1)));
+
+OPTIMIZATION_PRECISION      = 0.001;
+
+for (k = 0; k < totalBranchCount; k += 1) {
+    ExecuteCommands ("mixtureTreeG." + bNames[k] + ".t :< 10000");    
+}
+
+Optimize					  (res_three_LF_global,three_LFG);
+
+//ExecuteAFile (csvFilePath + ".relglobal.fit");
+
+
+blStashByName = {};
+for (k = 0; k < totalBranchCount; k += 1) {
+    bl = blLocal [bNames[k]] ;
+    ExecuteCommands ("FindRoot (z,`blG`-"+bl+",t,0,10000);");
+    blStashByName[bNames[k]] = z;
+    //fprintf (stdout, "\n", bNames[k], " : ", z, " (", bl/3, ")\n");
+}
+
+writeTheLF (".relglobal.fit", "three_LFG");
+
+
+fprintf (stdout, "Global model fit:");
+
+BIC_scores ["global model"] = BIC (res_three_LF_global[1][0], res_three_LF_global[1][1]+baseParameters, sample_size);
+BranchLengthEstimates ["global model"] = getBranchLengths ("mixtureTreeG", 1);
+
+fprintf     (csvFilePath, "\nGlobal\t", res_three_LF_global[1][0],"\t", res_three_LF_global[1][1]+baseParameters, "\t", BIC_scores ["global model"], "\t", PostOrderAVL2StringDistances(mixTreeAVL,BranchLengthEstimates ["global model"]));
+
+fprintf (stdout, "\nInferred this global omega distribution: ");
+reportOmegaDistro ("");
+fprintf     (stdout,"Tree branch lengths:\n",PostOrderAVL2StringDistances(mixTreeAVL,BranchLengthEstimates ["global model"]));
+globalState = saveLF ("three_LFG");
+
+
+for (k = 0; k < totalBranchCount; k += 1) {
+    constrainABranch (bNames[k], 0);
+}
+
+// ---- PHASE 2 : LOCAL MODEL FITS ---- //
+
+fprintf (stdout, "\n[BS-REL PHASE 2] Fitting a GLOBAL branch-site matrix mixture with a SINGLE unconstrained branch\n");
+
+OPTIMIZATION_METHOD = 0;
+
+LikelihoodFunction three_LF   = (dsf,mixtureTree);
+
+branchValues = {};
+
+if (MPI_NODE_COUNT > 1) {
+    MPI_NODE_STATE = {MPI_NODE_COUNT-1,1};
+    MPI_NODE_STATE[0] = "";
+}
+
+
+for (k = 0; k < totalBranchCount; k+=1) {
+    thisBranchName = bNames[k];
+    fprintf (stdout, "\n[BS-REL PHASE 2. Branch '", thisBranchName, "']\n");
+    globalState["restoreLF"][""];
+    if (k) {
+        if (MPI_NODE_COUNT > 1) {
+            for (nodeID = 0; nodeID < totalBranchCount; nodeID += 1) {
+                constrainABranch (bNames[nodeID],0);
+            }
+        } else {
+            constrainABranch (bNames[k-1],0);    
+        }
+    }
+    unConstrainABranch (thisBranchName);
+    
+    if (MPI_NODE_COUNT > 1) {
+        for (nodeID = 0; nodeID < MPI_NODE_COUNT-1; nodeID += 1) {
+            if (Abs(MPI_NODE_STATE[nodeID]) == 0) {
+                MPISend (nodeID+1, three_LF);
+                fprintf (stdout, "\n[SENT TO NODE ", nodeID, "]\n");
+                MPI_NODE_STATE [nodeID] = thisBranchName;
+                break;
+            }   
+        }
+        if (nodeID == MPI_NODE_COUNT-1) {
+            processABranch (thisBranchName, 1);
+        }
+    } else {
+        OPTIMIZATION_PRECISION = 0.05;
+        maxBL = blStashByName[thisBranchName]*10;
+        t = maxBL;
+        fprintf (stdout, thisBranchName, ": maximum t value: ", maxBL, ". Maximum achieved branch length: ", Eval (blG), "\n");
+        constrainABranch (thisBranchName,maxBL);
+        Optimize (localBranchRes, three_LF);
+        fprintf (stdout, "Approximation phase 1 (constrained branch length): ", localBranchRes[1][0], "\n");
+        constrainABranch (thisBranchName,-1);
+        OPTIMIZATION_PRECISION = 0.001;
+        Optimize (localBranchRes, three_LF);
+        processABranch (thisBranchName,0);
+    }
+}
+
+
+leftOver = 0;
+for (nodeID = 0; nodeID < MPI_NODE_COUNT-1; nodeID += 1) {
+    leftOver += Abs(MPI_NODE_STATE[nodeID])>0;
+}
+
+//fprintf (stdout, MPI_NODE_STATE, "\n", leftOver, "\n");
+
+
+for (nodeID = 0; nodeID < leftOver; nodeID += 1) {
+    processABranch ("", 0);
+}
+
+branchValues ["restoreLF"][""];
+
+fprintf (stdout, "\n[BS-REL PHASE 3] Fitting a LOCAL branch-site matrix mixture model\n");
+Optimize (res_local, three_LF);
+
+writeTheLF (".local.fit", "three_LF");
+ 
+fprintf (stdout, "Local model fit:");   
+BIC_scores ["local model"] = BIC (res_local[1][0], res_local[1][1]+baseParameters, sample_size);
+BranchLengthEstimates ["local model"] = getBranchLengths ("mixtureTree", 0);
+fprintf     (stdout, "\nTree: ", PostOrderAVL2StringDistances(mixTreeAVL,BranchLengthEstimates ["local model"]), "\n");
+fprintf     (csvFilePath, "\nLocal\t", res_local[1][0],"\t", res_local[1][1]+baseParameters, "\t", BIC_scores ["local model"], "\t", PostOrderAVL2StringDistances(mixTreeAVL,BranchLengthEstimates ["local model"]), CLOSE_FILE);
+
+min_BIC = 1e100;
+
+function compute_min_BIC (key, value) {
+    min_BIC = Min (min_BIC, value);
+    return 0;
+}
+
+function akaike_weights_pass1 (key, value) {
+    akaike_scores [key] = Exp (0.5*(min_BIC-value));
+    return 0;
+}
+
+
+function akaike_weights_pass2 (key, value) {
+    BIC_scores [key] = value/norm_factor;
+    return 0;
+}
+
+fprintf (stdout, "\n[BS-REL PHASE 4] Generating a model averaged branch lengths\n");
+akaike_scores = {};
+BIC_scores ["compute_min_BIC"][""];
+BIC_scores ["akaike_weights_pass1"][""];
+norm_factor = +akaike_scores;
+akaike_scores ["akaike_weights_pass2"][""];
+
+reweighted_branch_lengths = {};
+
+model_names = Rows(BranchLengthEstimates);
+for (k = 0; k < Abs (BranchLengthEstimates); k+=1) {
+    key = model_names [k];
+    bl_avl = BranchLengthEstimates[key];
+    bnames = Rows (bl_avl);
+    
+    for (b = 0; b < Abs (bl_avl); b += 1) {
+        reweighted_branch_lengths[bnames[b]] += BIC_scores[key]*bl_avl[bnames[b]];
+    }
+}
+
+fprintf (stdout,  PostOrderAVL2StringDistances(mixTreeAVL,reweighted_branch_lengths), "\n");
+
+//------------------------------------------------------------------------------------------------------------------------
+function processABranch (thisBranchName, doSend) {
+    if (MPI_NODE_COUNT > 1) {
+        MPIReceive (-1,fromNode,resStr);
+	    prevBranch = MPI_NODE_STATE[fromNode-1];
+        fprintf (stdout, "\n[RECEIVED " + prevBranch +" FROM NODE ", (fromNode-1), "]\n");
+        if (doSend) {
+            MPISend (fromNode, three_LF);
+            MPI_NODE_STATE [fromNode-1] = thisBranchName;
+            fprintf (stdout, "\n[SENT " + thisBranchName +" TO NODE ", (fromNode-1), "]\n");
+        } else {
+            MPI_NODE_STATE [fromNode-1] = "";
+        }
+        thisBranchName = prevBranch;
+        ExecuteCommands (resStr);
+        three_LF_MLE_VALUES ["restoreLF"][""];
+        localBranchRes = three_LF_MLES;
+    }
+    writeTheLF (".`thisBranchName`.fit", "three_LF");
+    fprintf (stdout, "\nModel fit:");   
+    BIC_scores [thisBranchName] = BIC (localBranchRes[1][0], localBranchRes[1][1]+baseParameters, sample_size);
+    BranchLengthEstimates [thisBranchName] = getBranchLengths ("mixtureTree", 0);
+    fprintf     (csvFilePath, "\nGlobal+",thisBranchName,"\t", localBranchRes[1][0],"\t", localBranchRes[1][1]+baseParameters, "\t", BIC_scores [thisBranchName], "\t", PostOrderAVL2StringDistances(mixTreeAVL,BranchLengthEstimates [thisBranchName]));
+    fprintf (stdout, "\nLocal branch omega distribution: ");
+    reportOmegaDistro(thisBranchName);
+    fprintf (stdout, "Global omega distribution on the rest of the branches: ");
+    reportOmegaDistro ("");
+    stashBranchValues (thisBranchName, "branchValues");
+    pv = 1-CChi2 (2*(localBranchRes[1][0]-res_three_LF_global[1][0]),5);
+    fprintf (stdout, "\nLRT p-value for branch deviation from the global pattern = ", pv, "\n");
+    fprintf     (stdout,"\n", PostOrderAVL2StringDistances(mixTreeAVL,BranchLengthEstimates [thisBranchName]));
+    return 0;
+
+}
+
+//------------------------------------------------------------------------------------------------------------------------
+function writeTheLF (fileNameExt,lfID) {
+    lfOut	= csvFilePath + fileNameExt;//".local.fit";    
+    LIKELIHOOD_FUNCTION_OUTPUT = 7;
+    ExecuteCommands ("fprintf (lfOut, CLEAR_FILE, `lfID`);");
+    fprintf (stdout, "[WROTE MODEL FIT TO ", lfOut, "]\n");
+    LIKELIHOOD_FUNCTION_OUTPUT = 2;
+    return 0;
+}
+
+//------------------------------------------------------------------------------------------------------------------------
+function constrainABranch (branch_name, z) {
+    if (z > 0) {
+        ExecuteCommands ("mixtureTree." + branch_name + ".t :< " + z);
+        return 0;
+    } else {
+        if (z < 0) {
+            ExecuteCommands ("mixtureTree." + branch_name + ".t :< 10000");
+            return 0;
+        }
+    }
+    ExecuteCommands ("mixtureTree." + branch_name + ".t = mixtureTreeG." + branch_name + ".t");
+    for (rcc = 1; rcc <= rate_class_count; rcc += 1) {
+        ExecuteCommands ("mixtureTree." + branch_name + ".omega" + rcc + ":= omegaG" + rcc);
+    }        
+
+    for (rcc = 1; rcc < rate_class_count; rcc += 1) {
+        ExecuteCommands ("mixtureTree." + branch_name + ".Paux" + rcc + ":= PauxG" + rcc);
+    }        
+        
+    return 0;
+}
+
+//------------------------------------------------------------------------------------------------------------------------
+function stashBranchValues (branch_name, storage&) {
+
+    locals = {"0" : "t"};
+    
+    for (rcc = 1; rcc <= rate_class_count; rcc += 1) {
+        locals + ("omega" + rcc);
+        if (rcc < rate_class_count) {
+            locals + ("Paux" + rcc);
+        }
+    }
+    for (_varID = 0; _varID < Abs (locals); _varID += 1) {
+        storage ["mixtureTree." + branch_name + "." + locals[_varID]] = Eval ("mixtureTree." + branch_name + "." + locals[_varID]);
+    }
+    
+    return 0;
+}
+
+//------------------------------------------------------------------------------------------------------------------------
+function unConstrainABranch (branch_name) {
+
+    ExecuteCommands ("mixtureTree." + branch_name + ".t = mixtureTreeG." + branch_name + ".t");
+    for (rcc = 1; rcc <= rate_class_count; rcc += 1) {
+        ExecuteCommands ("mixtureTree." + branch_name + ".omega" + rcc + "= omegaG" + rcc);
+    }        
+
+    for (rcc = 1; rcc < rate_class_count; rcc += 1) {
+        ExecuteCommands ("mixtureTree." + branch_name + ".Paux" + rcc + "= PauxG" + rcc);
+    }        
+
+    return 0;
+}
+
+//------------------------------------------------------------------------------------------------------------------------
+function BIC (logL, params, sample_size) {
+    BICvalue = -2*logL + 2*params*(sample_size-params-1);
+    fprintf (stdout, " log(L) = ", logL, " with ", params, " parameters, yielding BIC = ", BICvalue, " assuming the sample size of ", sample_size, ".");
+    return BICvalue;
+}
+
+//------------------------------------------------------------------------------------------------------------------------
+function reportOmegaDistro (branchName) {
+    if (Abs(branchName)==0) {
+        for (rcc = 1; rcc <= rate_class_count; rcc += 1) {
+            fprintf (stdout, "\n\t omega = ", Eval("omegaG"+rcc), ", p = ", Eval(global_freqsG[rcc-1]));
+        }
+    } else {
+        for (rcc = 1; rcc < rate_class_count; rcc += 1) {
+            ExecuteCommands ("Paux" + rcc + "=mixtureTree.`branchName`.Paux" +rcc);
+        }        
+
+        for (rcc = 1; rcc <= rate_class_count; rcc += 1) {
+            fprintf (stdout, "\n\t omega = ", Eval("mixtureTree.`branchName`.omega"+rcc), ", p = ", Eval(global_freqs[rcc-1]));
+        }    
+    }
+    fprintf (stdout, "\n");
+    return 0;
+}
+
+//------------------------------------------------------------------------------------------------------------------------
+
+function getBranchLengthExpression (modelType) {
+    bl_expression = ""; bl_expression * 128;
+    
+    if (modelType == 0) {
+        modelPrefix = "MGMatrix";
+        freqMatrix  = global_freqs;
+    } else {
+        modelPrefix = "MGMatrixG";
+        freqMatrix  = global_freqsG;
+    }
+    for (rcc = 1; rcc <= rate_class_count; rcc += 1) {
+        if (rcc > 1) {
+            bl_expression * "+";
+        }
+        ExecuteCommands ("Model _temp = (`modelPrefix`" + rcc + ", codon3x4, 0);");
+        GetString (modelBL, _temp, -1);
+        bl_expression * (freqMatrix[rcc-1]+"*(`modelBL`)");
+    }   
+    bl_expression * 0;
+    return bl_expression;
+}
+
+//------------------------------------------------------------------------------------------------------------------------
+
+function getBranchLengths (treeID, modelType) {
+    blByName        = {};
+    bnames_list     = Eval ("BranchName (`treeID`,-1)");
+
+    bl_expression = getBranchLengthExpression(modelType);
+ 
+    if (modelType == 0) {
+        locals = {"0" : "t"};
+        
+        for (rcc = 1; rcc <= rate_class_count; rcc += 1) {
+            locals + ("omega" + rcc);
+            if (rcc < rate_class_count) {
+                locals + ("Paux" + rcc);
+            }
+        }
+      
+        for (_bID = 0; _bID < Columns (bnames_list) - 1; _bID += 1) {
+            branch_name = bnames_list[_bID];
+         
+             for (_varID = 0; _varID < Abs (locals); _varID += 1) {
+                ExecuteCommands (locals[_varID] + " = Eval (\"`treeID`.`branch_name`." + locals[_varID] + "\")");
+            }
+            blByName [branch_name] = Eval (bl_expression)/3;
+        }
+    } else {
+        for (_bID = 0; _bID < Columns (bnames_list) - 1; _bID += 1) {
+            branch_name = bnames_list[_bID];
+            t = Eval ("`treeID`.`branch_name`.t");        
+            blByName [branch_name] = Eval (bl_expression)/3;
+        }    
+    }
+    
+    return blByName;
+}
+
+
+//------------------------------------------------------------------------------------------------------------------------
+function saveLF (ID)
+{
+	ExecuteCommands ("GetString(_lfInfo,"+ID+",-1)");
+	_stashLF = {};
+	for (_k = 0; _k < Columns (_lfInfo["Global Independent"]); _k+=1)
+	{
+		_stashLF [(_lfInfo["Global Independent"])[_k]] = Eval ((_lfInfo["Global Independent"])[_k]);
+	}
+	for (_k = 0; _k < Columns (_lfInfo["Local Independent"]); _k+=1)
+	{
+		_stashLF [(_lfInfo["Local Independent"])[_k]] = Eval ((_lfInfo["Local Independent"])[_k]);
+	}
+	
+	return _stashLF;
+}
+
+//------------------------------------------------------------------------------------------------------------------------
+function restoreLF (key, value)
+{
+	ExecuteCommands (key + " = " + value);
+	return 0;
+}
+
+
+//------------------------------------------------------------------------------------------------------------------------
+function generate_bs_rel_gdd_freqs (numberOfRates, freqs&, model_mixing&, probPrefix, modelPrefix, is_global)
+{
+
+	freqs    	 = {numberOfRates,1};
+	model_mixing	 = ""; model_mixing * 128; 
+	
+	if (numberOfRates == 1) {
+		freqs[0] = "1";
+	}
+	else {
+	    global_prefix = "";
+	    
+	    if (is_global) 
+	        { global_prefix = "global "; }
+	    
+        for (mi=1; mi<numberOfRates; mi += 1) {
+            ExecuteCommands (global_prefix+probPrefix+mi+":<1;"+probPrefix+mi+" = 1/" + (numberOfRates-mi+1));
+            ExecuteCommands (global_prefix+probPrefix+mi+":>0;");
+        }
+		
+		freqs[0] 	 = ""+probPrefix+"1";
+		for (mi=1; mi<numberOfRates-1; mi+=1) {
+			freqs[mi] = "";
+			for (mi2=1;mi2<=mi;mi2+=1) {
+				freqs[mi] = freqs[mi] + "(1-"+probPrefix+mi2+")*";		
+			}
+			freqs[mi] = freqs[mi] + probPrefix+(mi+1);	
+		}	
+	
+		freqs[mi] = "";
+		for (mi2=1;mi2<mi;mi2+=1)
+		{
+			freqs[mi] = freqs[mi] + "(1-"+probPrefix+mi2+")*";		
+		}
+		freqs[mi] = freqs[mi] + "(1-"+probPrefix+mi+")";	
+	}
+	
+	model_mixing * ("Exp(`modelPrefix`1)*"+freqs[0]);
+	for (mi = 1; mi < numberOfRates; mi=mi+1) {
+		model_mixing * ("+Exp(`modelPrefix`"+(mi+1)+")*" + freqs[mi]);
+	}
+	model_mixing * 0;
+	return 0;
+}
diff --git a/res/TemplateBatchFiles/BranchSwap.bf b/res/TemplateBatchFiles/BranchSwap.bf
new file mode 100644
index 0000000..0e56d1d
--- /dev/null
+++ b/res/TemplateBatchFiles/BranchSwap.bf
@@ -0,0 +1,440 @@
+A_DISTANCE_METHOD 	   = 1;
+SHORT_MPI_RETURN 	   = 1;
+
+/*---------------------------------------------------------------*/
+
+function cutTheStringUp		  (delimiterChar)
+{
+	while (treeStringIndex<treeStringLength)
+	{
+		aTreeChar = aTreeString[treeStringIndex];
+		if ((aTreeChar == delimiterChar)&&(parenthesesDepth==0))
+		{
+			break;
+		}
+		else
+		{
+			if (aTreeChar == ")")
+			{
+				parenthesesDepth = parenthesesDepth-1;
+			}
+			else
+			{
+				if (aTreeChar == "(")
+				{
+					parenthesesDepth = parenthesesDepth+1;
+				}
+			}
+		}
+		treeStringIndex = treeStringIndex+1;
+	}
+	return 0;
+}
+
+/*---------------------------------------------------------------*/
+
+function getTheClustersToSwap (aTreeString)
+{
+	clusterOne   = "";
+	clusterTwo   = "";
+	clusterThree = "";
+	clusterFour  = "";
+	
+	treeStringLength = Abs (aTreeString);
+	aTreeString		 = aTreeString [2][treeStringLength-3];
+	parenthesesDepth = 0;
+	treeStringIndex  = 0;
+	treeStringLength = treeStringLength - 4;
+	startCuttingAt   = 0;
+	cutTheStringUp (",");
+	clusterOne = aTreeString[startCuttingAt][treeStringIndex-1];
+	if (Abs(clusterOne)==0)
+	{
+		return 1;
+	}
+	treeStringIndex = treeStringIndex+1;
+	startCuttingAt   = treeStringIndex;
+	cutTheStringUp (")");
+	clusterTwo = aTreeString[startCuttingAt][treeStringIndex-1];
+	if (Abs(clusterTwo)==0)
+	{
+		return 2;
+	}
+	treeStringIndex = treeStringIndex + 1;
+	cutTheStringUp (",");
+	treeStringIndex = treeStringIndex+2;
+	startCuttingAt   = treeStringIndex;
+	cutTheStringUp (",");
+	clusterThree = aTreeString[startCuttingAt][treeStringIndex-1];
+	if (Abs(clusterThree)==0)
+	{
+		return 3;
+	}
+	startCuttingAt = treeStringIndex+1;
+	cutTheStringUp (")");
+	clusterFour = aTreeString[startCuttingAt][treeStringIndex-1];
+	return 4;
+}
+
+/*---------------------------------------------------------------*/
+
+function ReceiveJobs (sendOrNot)
+{
+	if (MPI_NODE_COUNT>1)
+	{
+		MPIReceive (-1, fromNode, result_String);
+		branchSwap_2 = MPINodeTree[fromNode-1][0];
+		anIntBranch2 = MPINodeTree[fromNode-1][1];
+		if (sendOrNot)
+		{
+			MPISend (fromNode,theLF);
+			MPINodeTree[fromNode-1][0] = branchSwap;
+			MPINodeTree[fromNode-1][1] = anIntBranch;
+		}
+		else
+		{
+			MPINodeState[fromNode-1]    = 0;
+			MPINodeTree[fromNode-1][0]  = "";
+			MPINodeTree[fromNode-1][1]  = "";
+		}
+		
+		anIntBranch = anIntBranch2;
+		branchSwap	= branchSwap_2;
+		ExecuteCommands (result_String);
+		
+		res = theLF_MLES;
+	}
+	
+	fprintf (stdout, totalRearrangementsTried, "). Swap at:", anIntBranch, ".Log-L = ", Format(res[1][0],10,5)," (", Format(res[1][0]-originalValueToBeat,10,5), ")\n");		
+	
+	dummy = CheckForImprovement(0);
+	
+	return fromNode-1;
+}
+
+/*---------------------------------------------------------------*/
+
+function CheckForImprovement (dummy)
+{
+	if (res[1][0]>valueToBeat+0.5*OPTIMIZATION_PRECISION)
+	{
+		if (globalOption == 2)
+		{
+			ClearConstraints (testTree);
+			ExecuteCommands (setString);
+			Optimize (res, theLF);
+		}
+		totalSupportWeight = totalSupportWeight*Exp(valueToBeat-res[1][0])+1;
+				
+		valueToBeat     = res[1][0];
+		currentBestTree = branchSwap;
+		doSwapping 		= 1; 
+		savedMLEs		= res;
+		
+		if (!swapType)
+		{
+			ibc = intBranchCount;
+		}
+	}
+	else
+	{
+		totalSupportWeight = totalSupportWeight + Exp(res[1][0]-valueToBeat);
+	}
+	return 0;
+}
+
+/*---------------------------------------------------------------*/
+
+function StartSwappingJob (dummy)
+{
+	USE_LAST_RESULTS = 1;
+	
+	branchSwap = RerootTree (branchSwap,0);
+	
+	Tree 	   testTree = branchSwap;		
+	
+	/* map parameter values from one tree to the next */
+	
+	GetInformation (params1, "^givenTree\.[^\.]+\..+$");
+	GetInformation (params2, "^testTree\.[^\.]+\..+$");
+	
+	initString = "";
+	initString * 8192;
+	existingData = {};
+	
+	for (mpiNode=Columns(params1)-1; mpiNode >= 0; mpiNode = mpiNode-1)
+	{
+		eVar = params1[mpiNode];
+		eVar = eVar[10][Abs(eVar)-1];
+		existingData [eVar] = 1;
+	}
+	
+	if (globalOption == 2)
+	{
+		for (mpiNode=Columns(params2)-1; mpiNode >= 0; mpiNode = mpiNode-1)
+		{
+			eVar = params2[mpiNode];
+			eVar = eVar[9][Abs(eVar)-1];
+			eIdx = existingData[eVar];
+			if (eIdx)
+			{
+				initString * ("testTree."+eVar+":=givenTree."+eVar+"__;\n");
+			}
+		}
+	}
+	else
+	{
+		for (mpiNode=Columns(params2)-1; mpiNode >= 0; mpiNode = mpiNode-1)
+		{
+			eVar = params2[mpiNode];
+			eVar = eVar[9][Abs(eVar)-1];
+			eIdx = existingData[eVar];
+			if (eIdx)
+			{
+				initString * ("testTree."+eVar+"=givenTree."+eVar+";\n");
+			}
+		}
+		
+	}
+	
+	
+	initString * 0;
+	if (Abs(initString))
+	{
+		ExecuteCommands (initString);
+	}
+	
+	/* done with mapping */
+	
+	LikelihoodFunction theLF = (filteredData, testTree);
+	if (MPI_NODE_COUNT>1)
+	{
+		for (mpiNode = 0; mpiNode < MPI_NODE_COUNT-1; mpiNode = mpiNode+1)
+		{
+			if (MPINodeState[mpiNode]==0)
+			{
+				break;	
+			}
+		}
+		
+		if (mpiNode==MPI_NODE_COUNT-1)
+		/* all nodes busy */
+		{
+			mpiNode = ReceiveJobs (1);
+		}
+		else
+		{
+			MPISend (mpiNode+1,theLF);
+			MPINodeState[mpiNode] = 1;
+			MPINodeTree[mpiNode][0] = branchSwap;
+			MPINodeTree[mpiNode][1] = anIntBranch;
+		}
+	}
+	else
+	{
+		Optimize (res, theLF);
+		mpiNode = ReceiveJobs (0);
+	}
+	
+	totalRearrangementsTried = totalRearrangementsTried + 1;
+	return 0;
+}
+
+/*---------------------------------------------------------------*/
+
+ChoiceList (swapType,"Swapping Strategy",1,SKIP_NONE,"Greedy","As soon as branch swapping yields a better tree, the swapping procedure is restarted on that tree.",
+				     "Patient","After ALL branch swaps have been attempted on a given tree, the procedure is restarted on the tree with the best likelihood improvement over the original (if there is one, of course).");
+
+if (swapType<0) 
+{
+	return;
+}
+
+
+ChoiceList (dataType,"Data type",1,SKIP_NONE,"Nucleotide/Protein","Nucleotide or amino-acid (protein).",
+				     "Codon","Codon (several available genetic codes).");
+
+if (dataType<0) 
+{                   
+	return;
+}
+
+#include "heuristicMethodNPBootstrap.bf";
+
+MESSAGE_LOGGING = 0;
+
+if (dataType)
+{
+	NICETY_LEVEL = 3;
+	SetDialogPrompt ("Please choose a codon data file:");
+	#include "TemplateModels/chooseGeneticCode.def";
+}
+else
+{
+	SetDialogPrompt ("Please choose a nucleotide or amino-acid data file:");
+}
+
+totalRearrangementsTried = 0;
+totalSupportWeight		 = 1;
+
+DataSet ds = ReadDataFile (PROMPT_FOR_FILE);
+
+if (dataType)
+{
+	DataSetFilter filteredData = CreateFilter (ds,3,"","",GeneticCodeExclusions);
+}
+else
+{
+	DataSetFilter filteredData = CreateFilter (ds,1,"","");
+}
+
+SelectTemplateModel(filteredData);
+
+_DO_TREE_REBALANCE_ = 1;
+
+_KEEP_I_LABELS_ = 1;
+#include "queryTree.bf";
+_KEEP_I_LABELS_ = 0;
+
+ChoiceList (globalOption,"Global parameters",1,SKIP_NONE,"Re-estimate","Re-estimate all global parameters for every rearrangement (slower).",
+				     "Do once","Use the estimates obtained from the original tree for all rearrangements (faster, but less precise).",
+				     "Quick and Dirty","Only re-estimate the branch involved in the swap, fix other parameter estimates");
+				     
+if (globalOption < 0)
+{
+	return 0;
+}
+
+
+SetDialogPrompt ("If a better tree is found, save it to:");
+fprintf (PROMPT_FOR_FILE,CLEAR_FILE);
+treeFileSave = LAST_FILE_PATH;
+
+
+LikelihoodFunction theLF = (filteredData, givenTree);
+Optimize (res, theLF);
+
+if (globalOption > 0)
+{
+	setString 	= "";
+	resetString	= "";
+	if (res[1][2]>0)
+	{
+		setString * 128;
+		resetString *128;
+	
+		for (k=0; k<res[1][2]; k=k+1)
+		{
+			GetString (eVar, theLF, k);
+			setString * (eVar + ":="+eVar+"__;\n");
+			resetString * (eVar + "="+eVar+";\n");
+		}
+	
+		setString * 0;
+		resetString *0;
+		
+		ExecuteCommands (setString);
+	}
+}
+
+doSwapping 			= 1;
+valueToBeat  		= res [1][0];
+originalValueToBeat = valueToBeat;
+
+svl = VERBOSITY_LEVEL;
+VERBOSITY_LEVEL = -1;
+
+fprintf	 (stdout, "\n\n****** ORIGINAL TREE AND LIKELIHOOD ******\n\n", 
+		    	  theLF,"\n\n****** RUNNING BRANCH SWAPPING ANALYSIS ******\n\n");
+		    	  
+phaseCounter 	= 1;
+currentBestTree = treeString;
+
+Tree originalTree = treeString;
+
+if (MPI_NODE_COUNT>1)
+{
+	MPINodeState = {MPI_NODE_COUNT-1,1};
+	MPINodeTree  = {MPI_NODE_COUNT-1,2};
+	MPINodeTree[0]  = "";
+}
+
+while (doSwapping)
+{
+	doSwapping    = 0;
+	intBranchCount  = BranchCount (givenTree);
+
+	fprintf	 (stdout, "\n> PHASE ",phaseCounter,"\n\n"); 
+
+	for (ibc = 0; ibc < intBranchCount; ibc=ibc+1)
+	{
+		anIntBranch   = BranchName (givenTree,ibc);
+		aRerootedTree = RerootTree (givenTree, anIntBranch);
+			
+		dummy = getTheClustersToSwap (aRerootedTree);
+		branchSwap = "(("+clusterOne+","+clusterThree+"),"+clusterTwo+","+clusterFour+")";
+		dummy = StartSwappingJob(0);
+		if (ibc == intBranchCount)
+		{
+			break;
+		}
+		branchSwap = "(("+clusterOne+","+clusterFour+"),"+clusterTwo+","+clusterThree+")";
+		dummy = StartSwappingJob(0);
+	}		
+	if (MPI_NODE_COUNT>1)
+	{
+		while (1)
+		{
+			for (nodeCounter = 0; nodeCounter < MPI_NODE_COUNT-1; nodeCounter = nodeCounter+1)
+			{
+				if (MPINodeState[nodeCounter]==1)
+				{
+					fromNode = ReceiveJobs (0);
+					break;	
+				}
+			}
+			if (nodeCounter == MPI_NODE_COUNT-1)
+			{
+				break;
+			}
+		}	
+	}	
+	if (doSwapping)
+	{
+		Tree givenTree = currentBestTree;
+		fprintf (stdout, "\n\n**** AFTER PHASE ",phaseCounter,"\n\n>Best Tree:\n",currentBestTree,"\n>Log-likelihood = ",valueToBeat," (Improvement of ", valueToBeat-originalValueToBeat,")\n\n"); 
+		phaseCounter = phaseCounter+1;
+	}	
+}
+
+if (globalOption > 0)
+{
+	if (Abs(resetString)>0)
+	{
+		ExecuteCommands (resetString);
+	}
+}
+
+fprintf (stdout, "\n\n***** ", totalRearrangementsTried, " TREE REARRANGEMENTS WERE EXPOLORED *****\n\n",
+				 "\n\n***** RELATIVE TREE SUPPORT (WITH UN-INFORMATIVE PRIOR): ", 1/totalSupportWeight, " ******\n\n");
+
+if (phaseCounter>1)
+{
+	fprintf (stdout, "\n\n***** BRANCH SWAPPING FOUND A BETTER TREE! *****\n\n");
+	Tree			   newBestTree = currentBestTree;
+	NO_INTERNAL_LABELS = 1;
+	fprintf (treeFileSave,newBestTree);	
+	fprintf (stdout, newBestTree,"\n");
+	NO_INTERNAL_LABELS = 0;
+	fprintf (stdout, "\n\nA likelihood improvement of ",valueToBeat-originalValueToBeat,"\n\n");
+}
+else
+{
+	fprintf (stdout, "\n\n***** BRANCH SWAPPING FAILED TO YIELD A BETTER TREE *****\n\n");
+	NO_INTERNAL_LABELS = 1;
+	fprintf (treeFileSave,givenTree);	
+	NO_INTERNAL_LABELS = 0;
+}
+
+
+VERBOSITY_LEVEL = svl;
diff --git a/res/TemplateBatchFiles/CleanGaps.bf b/res/TemplateBatchFiles/CleanGaps.bf
new file mode 100644
index 0000000..a417ba5
--- /dev/null
+++ b/res/TemplateBatchFiles/CleanGaps.bf
@@ -0,0 +1,112 @@
+function _standardAnalysisBFHelp (_what)
+{
+	if (_what == "Synopsis")
+	{
+		return "Filter "gappy" columns in a sequence alignments: i.e. those that contain fewer than a given proportion of sequences with fully or partially resolved characters";
+	}
+	if (_what == "Input")
+	{
+		return "A sequence alignment";
+	}
+	if (_what == "Output")
+	{
+		return "A sequence alignment with gappy columns stripped out";
+	}
+	if (_what == "Options")
+	{
+		_options = {};
+		_options ["Filtering threshold"] = "Minimum percent of informative sequences per site to retain the site";
+		_options ["Informative characters"] = "Define an informative character as either a fully resolved charatcer (e.g. A) or a partial ambiguity (e.g. R)";
+		return _options
+	}
+	if (_what == "Further")
+	{
+		return "";
+	}
+	if (_what == "Author")
+	{
+		return "Sergei L Kosakovsky Pond (spond at ucsd.edu)";
+	}
+	if (_what == "Version")
+	{
+		retrun "1.00";
+	}
+	if (_what == "Date")
+	{
+		return "20081215";
+	}
+	return "";
+}
+
+/*--------------------------------------------------------------------------*/
+
+ExecuteAFile ("Utility/GrabBag.bf");
+
+SetDialogPrompt ("Please choose a data file:");
+DataSet ds = ReadDataFile (PROMPT_FOR_FILE);
+fprintf (stdout, "\nRead an alignment on ", ds.species, " sequences with ", ds.sites, " sites from ", LAST_FILE_PATH);
+
+if (IS_TREE_PRESENT_IN_DATA)
+{
+	fprintf (stdout, "\nTree In Data:", DATAFILE_TREE);
+}
+
+DataSetFilter	    all = CreateFilter (ds, 1, "", "");
+
+options				={{"Completely resolved", "Only count completely unambiguious characters (e.g. A,C,G,T for nucleotides) as informative"}
+					  {"Partially resolved",  "Also count partially resolved characters (e.g. R,Y,M,S etc for nucleotides)"}};
+					  
+
+ChoiceList (filteringOption,"Informative characters?",1,SKIP_NONE,options);
+															   
+if (filteringOption < 0)
+{
+	return 0;
+}
+	
+
+fprintf (stdout, "\n");
+gating_thresh     = prompt_for_a_value ("Retain sites with at least this proportion of informative sites:",0.1,0,1,0);
+gating_thresh_seq = (gating_thresh * all.species+0.5)$1;
+
+fprintf 	  (stdout, "Selected informative sites option '", options[filteringOption][0], "' and filtering threshold of '", gating_thresh, "'\n");
+retainSites = {};
+
+GetDataInfo     (charInfo, all, "CHARACTERS");
+GetDataInfo		(siteToPatternMap,  all);
+
+charCount	  = Columns (charInfo);
+template	  = {1,charCount}["1"];
+passcode	  = 2;
+if (filteringOption == 1)
+{
+	passcode = charCount;
+}
+
+for (site = 0; site < all.unique_sites; site = site+1)
+{
+	seq_count = 0;
+	for (sequence = 0; sequence < all.species; sequence = sequence + 1)
+	{
+		GetDataInfo (thisChar, all, sequence, site);
+		if ((template*thisChar)[0] < passcode)
+		{
+			seq_count = seq_count + 1;
+			if (seq_count >= gating_thresh_seq)
+			{
+				break;
+			}
+		}
+	}
+	if (seq_count >= gating_thresh_seq)
+	{
+		retainSites [site] = 1;
+	}
+	SetParameter (STATUS_BAR_STATUS_STRING, "Processing pattern "+(site+1)+"/"+all.unique_sites,0);
+}
+
+DataSetFilter	filtered = CreateFilter (all, 1, retainSites[siteToPatternMap[siteIndex]]);
+fprintf (stdout, "\nRetained ", filtered.sites, "/", all.sites, " sites\n");
+SetDialogPrompt ("Saved the filtered alignment to:");
+
+fprintf (PROMPT_FOR_FILE, CLEAR_FILE, filtered);
diff --git a/res/TemplateBatchFiles/CleanStopCodons.bf b/res/TemplateBatchFiles/CleanStopCodons.bf
new file mode 100644
index 0000000..eb3a164
--- /dev/null
+++ b/res/TemplateBatchFiles/CleanStopCodons.bf
@@ -0,0 +1,244 @@
+if (onlyFilterSequenceNames != 1)
+{
+	#include "TemplateModels/chooseGeneticCode.def";
+
+	SetDialogPrompt ("Please choose a codon data file:");
+
+	DataSet ds = ReadDataFile (PROMPT_FOR_FILE);
+	fprintf (stdout, "\n\nData Read:\n", ds);
+
+	if (IS_TREE_PRESENT_IN_DATA)
+	{
+		fprintf (stdout, "\nTree In Data:", DATAFILE_TREE);
+	}
+
+	DataSetFilter	    all64 = CreateFilter (ds, 3, "", "");
+
+	stopCodonTemplate   = {1,64};
+
+	stopCodonTemplate   	= {1,64};
+	nonStopCodonTemplate	= {1,64};
+}
+else
+{
+	SetDialogPrompt ("Please choose a data file:");
+
+	DataSet ds = ReadDataFile (PROMPT_FOR_FILE);
+	fprintf (stdout, "\n\nData Read:\n", ds);
+
+	if (IS_TREE_PRESENT_IN_DATA)
+	{
+		fprintf (stdout, "\nTree In Data:", DATAFILE_TREE);
+	}
+
+	DataSetFilter	    all64 = CreateFilter (ds, 1, "", "");
+}
+
+ChoiceList (filteringOption,"Filter duplicates/gaps?",1,SKIP_NONE,"No/No",    "Keep all sequences and sites",
+                                                                  "No/Yes",   "Keep all sequences, filter sites with nothing but gaps",
+															      "Yes/No",   "Filter duplicate sequences but keep all sites",
+                                                                  "Yes/Yes",  "Filter duplicate sequences and sites with nothing but gaps",
+                                                                  "Disallow stops", "Filter duplicate sequences and all sequences that have stop codons");
+															   
+if (filteringOption < 0)
+{
+	return 0;
+}
+GetDataInfo (filterDimensions,all64,"CHARACTERS");
+filterDimensions = Columns(filterDimensions);
+
+if (onlyFilterSequenceNames != 1)
+{
+	for (stateCount=0; stateCount<64; stateCount=stateCount+1)
+	{
+		if (_Genetic_Code[stateCount] == 10)
+		{
+			stopCodonTemplate[stateCount] = 1;
+		}
+		else
+		{
+			nonStopCodonTemplate[stateCount] = 1;
+		}
+	}
+}
+else
+{
+	nonStopCodonTemplate = {1,filterDimensions}["1"];
+	stopCodonTemplate	 = {1,filterDimensions}["0"];
+}
+
+sequenceNames = {all64.species, 1};
+doSomething 	  = 0;
+
+validID = "[_|a-z|A-Z|0-9]+";
+
+seqNamesList    = {};
+seqNamesListAll = {};
+
+for (k=0; k<all64.species;k=k+1)
+{
+	GetString(seqName, all64, k);
+	newName 	= "";
+	changed 	= 0;
+	k2    		= Abs(seqName);
+	if (k2 == 0)
+	{
+		newName = "Unnamed";
+	}
+	else
+	{
+		for (k3 = 0; k3 < k2; k3 = k3+1)
+		{
+			aChar = seqName[k3];
+			if ((aChar$validID)[0] < 0)
+			{
+				newName = newName+"_";
+				changed = 1;
+			}
+			else
+			{
+				newName = newName + aChar;
+			}
+		}
+	}
+	
+	baseName = newName;
+	testName = newName && 1;
+	k2 = 2;
+	while (seqNamesListAll[testName] > 0)
+	{
+		newName = baseName + "_" + k2;
+		testName = newName && 1;
+		k2 = k2+1;
+		changed = 1;
+	}
+	
+	if (changed)
+	{
+		doSomething = 1;
+		sequenceNames   [k] = newName;
+	}
+	else
+	{
+		sequenceNames   [k] = seqName;
+	}
+	
+	seqNamesListAll[testName] = 1;
+}
+
+GetInformation (sequenceData, 	 all64);
+GetDataInfo    (duplicateMapper, all64);
+
+if (onlyFilterSequenceNames != 1)
+{
+	replacementString = "---";
+}
+else
+{
+	replacementString = "-";
+}
+
+notDuplicate 	  = {};
+duplicateChecker  = {};
+haveInfoAtSites	  = {};
+
+for (sequenceIndex = 0; sequenceIndex < all64.species; sequenceIndex = sequenceIndex+1)
+{
+
+	stopCodonCount     = 0;
+	sitesWithDeletions = {1,all64.unique_sites};
+	
+	for (siteIndex = 0; siteIndex < all64.unique_sites; siteIndex = siteIndex+1)
+	{
+		GetDataInfo (siteInfo, all64, sequenceIndex, siteIndex);
+		siteInfo1 = stopCodonTemplate*siteInfo;
+		siteInfo2 = nonStopCodonTemplate*siteInfo;
+		if (siteInfo1[0]>0 && siteInfo2[0] == 0)
+		{
+			sitesWithDeletions[siteIndex] = 1;
+			stopCodonCount 	= stopCodonCount+1;
+		}
+		if (filteringOption % 2)
+		{
+			if (haveInfoAtSites[siteIndex] == 0)
+			{
+				if (siteInfo1[0]+siteInfo2[0] < stopCodonTemplate)
+				{
+					haveInfoAtSites[siteIndex] = 1;
+				}
+			}
+		}
+	}
+	
+	if (stopCodonCount > 0)
+	{
+        if (filterinOption == 4)
+        {   
+            continue;
+        }
+		fprintf (stdout, "\nSequence ", sequenceNames[sequenceIndex], ":"); 
+		fprintf (stdout, "\n\t", Format(stopCodonCount,8,0), " stop codons found.");
+		
+		doSomething 		= 1;
+		cleanedString 		= "";
+		seqString 			= sequenceData[sequenceIndex];
+		cleanedString 		* (Abs(seqString)+1);
+
+		for (siteIndex = 0; siteIndex < all64.sites; siteIndex = siteIndex+1)
+		{
+			stopCodonCount = duplicateMapper[siteIndex];
+			if (sitesWithDeletions[stopCodonCount])
+			{
+				cleanedString * replacementString;
+			}
+			else
+			{
+				cleanedString * seqString[3*siteIndex][3*siteIndex+2];
+			}
+		}
+		cleanedString * 0;
+		sequenceData[sequenceIndex] = cleanedString;
+	}
+	
+	if (filteringOption >= 2)
+	{
+		if (duplicateChecker[sequenceData[sequenceIndex]] == 0)
+		{	
+			duplicateChecker[sequenceData[sequenceIndex]] = 1;
+			notDuplicate[sequenceIndex] = 1;
+		}
+		else
+		{
+			doSomething 		= 1;
+		}
+	}
+	else
+	{
+		notDuplicate[sequenceIndex] = 1;
+	}
+}
+
+if (filteringOption%2)
+{
+	doSomething = doSomething || (Abs(haveInfoAtSites)<all64.unique_sites);
+}
+
+if (doSomething)
+{
+	SetDialogPrompt ("Save cleaned data to:");
+	fprintf (PROMPT_FOR_FILE, CLEAR_FILE, KEEP_OPEN);
+	for (sequenceIndex = 0; sequenceIndex < all64.species; sequenceIndex = sequenceIndex+1)
+	{
+		if (notDuplicate[sequenceIndex])
+		{
+			fprintf (LAST_FILE_PATH, ">", sequenceNames[sequenceIndex], "\n", sequenceData[sequenceIndex], "\n\n");
+		}
+	}
+	fprintf (LAST_FILE_PATH, CLOSE_FILE);
+}
+else
+{
+	fprintf (stdout, "\n\nNo stop codons found\n\n");
+}
+
+sequenceData = 0;
diff --git a/res/TemplateBatchFiles/ClusterAnalysis.bf b/res/TemplateBatchFiles/ClusterAnalysis.bf
new file mode 100644
index 0000000..9b26e36
--- /dev/null
+++ b/res/TemplateBatchFiles/ClusterAnalysis.bf
@@ -0,0 +1,535 @@
+ChoiceList (distanceChoice, "Distance Computation",1,SKIP_NONE,
+			"Distance formulae","Use one of the predefined distance measures based on data comparisons. Fast.",
+			"Full likelihood","Estimate distances using pairwise MLE. More choices but slow.");
+			
+if (distanceChoice < 0)
+	return 0;
+
+ChoiceList (dataType,"Data type",1,SKIP_NONE,"Nucleotide/Protein","Nucleotide or amino-acid (protein).",
+				     "Codon","Codon (several available genetic codes).");
+				     
+A_DISTANCE_METHOD = 1;
+
+#include "distanceRMethodNPBootstrap.bf";
+
+if (dataType<0) 
+{
+	return;
+}
+if (dataType)
+{
+	NICETY_LEVEL = 3;
+	SetDialogPrompt ("Please choose a codon data file:");
+	#include "TemplateModels/chooseGeneticCode.def";
+}
+else
+{
+	SetDialogPrompt ("Please choose a nucleotide or amino-acid data file:");
+}
+
+
+DataSet ds = ReadDataFile (PROMPT_FOR_FILE);
+
+if (dataType)
+{
+	DataSetFilter filteredData = CreateFilter (ds,3,"","",GeneticCodeExclusions);
+}
+else
+{
+	DataSetFilter filteredData = CreateFilter (ds,1,"","");
+}
+
+if (distanceChoice > 0)
+{
+	SelectTemplateModel(filteredData);
+}
+
+ChoiceList (methodIndex,"Clustering Method",1,SKIP_NONE,
+			"UPGMA","Unweighted Pair Group Method using Arithmetic Averages. (new distance)=1/2(sum of old distances).",
+			"WPGMA","Weighted Pair Group Method using Arithmetic Averages. (new distance)=((Taxa in clade 1)dist1+(Taxa in clade 2)dist2)/(Taxa in clade 1+Taxa in clade 2).",
+			"Complete Linkage","Complete Linkage Method. (new distance)=max(old distances).",
+			"Single Linkage","Single Linkage Method. (new distance)=min(old distances).");
+			
+if (methodIndex<0)
+{
+	return;
+}
+function InferTreeTopology(verbFlag)
+{
+	columnMin 		= {ds.species, 1};
+	indexMin  		= {ds.species, 1};
+	distanceMatrix  = {ds.species,ds.species};
+	useColumn 		= {ds.species, 1};
+	columnIndex 	= {ds.species, 1};
+	parentInfo		= {2*(ds.species+1),3};
+	netDivergence 	= {ds.species, 1};
+	cladesInfo 		= {2*(ds.species+1),1};
+	taxaCount		= {ds.species-1, 1};
+
+	/* first column has the node indices in pre-order */
+	/* second column contains the depths of the nodes (root has depth 0) */
+
+	/* first column has the clades size (in nodes)
+	   second column has the clades position in the tree "stack" */
+	   
+	/* used to count how many taxa are in a given clade */
+	   
+	treeLength = 0;
+
+	MESSAGE_LOGGING = 0;
+
+	if (distanceChoice)
+	{
+		if (verbFlag)
+		{
+			fprintf (stdout,"\nHYPHY is computing pairwise maximum likelihood distance estimates. A total of ", Format(ds.species*(ds.species-1)/2,0,0),
+						   " estimations will be performed.\n");
+		}
+		_pddVF = 1;
+		ExecuteAFile ("pairwiseDistanceEstimator.ibf");
+
+		for (i = 0; i<ds.species; i=i+1)
+		{
+			min = 1e10;
+			minIndex = -1;
+			for (j = 0; j<i; j = j+1)
+			{
+				k = distanceMatrix[j][i];			
+				if (k<min)
+				{
+					min 	 = k;
+					minIndex = j;
+				}
+			}
+			columnMin   [i] = min;
+			indexMin    [i] = minIndex;
+			useColumn   [i] = 1;
+			columnIndex [i] = i;
+			cladesInfo  [i] = 1;
+		}
+	}
+	else
+	{
+		#include "chooseDistanceFormula.def";
+		
+		dummy = InitializeDistances (0);
+		
+		for (i = 0; i<ds.species; i=i+1)
+		{
+			min = 1e10;
+			minIndex = -1;
+			for (j = 0; j<i; j = j+1)
+			{
+				k = ComputeDistanceFormula (i,j);
+				distanceMatrix[j][i] = k;			
+				if (k<min)
+				{
+					min 	 = k;
+					minIndex = j;
+				}
+			}
+			columnMin	[i] = min;
+			indexMin 	[i] = minIndex;
+			useColumn	[i] = 1;
+			columnIndex	[i] = i;
+			cladesInfo  [i] = 1;
+		}
+	}
+
+	MESSAGE_LOGGING = 1;
+
+	cladesMade = 1;
+
+	while (cladesMade < ds.species)
+	{
+		/*fprintf (stdout,"\nStage ",cladesMade,"\n"); */
+		min 		= 1e9;
+		minIndex 	= -1;
+		for (i=0;i<ds.species;i=i+1)
+		{
+			if (useColumn[i])
+			{
+				if (columnMin[i]<min)
+				{
+					min 	 = columnMin[i];
+					minIndex = i;
+				}
+			}
+		}
+
+		d 		 = min;
+		j 		 = minIndex;
+		minIndex = indexMin[minIndex];
+		
+		/* update tree description */
+		
+		m = columnIndex[j];
+		n = columnIndex[minIndex];
+
+		k = ds.species+cladesMade-1;		
+
+		parentInfo[n][0] = k; /* parent */
+		parentInfo[m][0] = k; /* parent */
+		cladesInfo[k]    = cladesInfo[n]+cladesInfo[m]+1;
+		
+		p = parentInfo[n][2];
+		l = parentInfo[m][2];
+		
+		d2 = (d+p-l)/2;
+		
+		if (d2>d)
+		{
+			d2 = d;
+		}
+		if (d2<0)
+		{
+			d2 = 0;
+		}
+		
+		/*fprintf (stdout, "Cluster ", n, ":", d-d2, " and ", m, ":", d2, "\n");*/
+				
+		parentInfo[m][1] = d2;
+		parentInfo[n][1] = d-d2;
+				
+		parentInfo[k][2] = parentInfo[n][1]+parentInfo[n][2];
+		
+		k = cladesMade - 1;
+		
+		if (n<ds.species)
+		{
+			taxaCount [k] = taxaCount [k]+1;
+		}
+		else
+		{
+			taxaCount [k] = taxaCount [k]+taxaCount[n-ds.species];		
+		}
+		
+		if (m<ds.species)
+		{
+			taxaCount [k] = taxaCount [k]+1;
+		}
+		else
+		{
+			taxaCount [k] = taxaCount [k]+taxaCount[m-ds.species];		
+		}
+		
+
+		useColumn[j] = 0;
+
+		if (methodIndex == 0)
+		{
+			/*UPGMA*/
+			for (k=0;k<minIndex; k=k+1)
+			{
+				if (useColumn[k])
+				{
+					distanceMatrix[k][minIndex] = (distanceMatrix[k][minIndex]+distanceMatrix[k][j])/2;
+				}
+			}
+						
+			for (k=minIndex+1;k<j;k=k+1)
+			{
+				if (useColumn[k])
+				{
+					distanceMatrix[minIndex][k] = (distanceMatrix[minIndex][k] + distanceMatrix[k][j])/2;
+				}
+			}
+			
+			for (k=j+1;k<ds.species;k=k+1)
+			{
+				if (useColumn[k])
+				{
+					distanceMatrix[minIndex][k] = (distanceMatrix[minIndex][k] + distanceMatrix[j][k])/2;
+				}
+			}	
+		}
+		else
+		{
+			if (methodIndex == 1)
+			{
+				/*WPGMA*/
+				m = columnIndex[j];
+				n = columnIndex[minIndex];
+				if (m>=ds.species)
+				{
+					p = taxaCount[m-ds.species];
+				}
+				else
+				{
+					p = 1;
+				}
+				if (n>=ds.species)
+				{
+					l = taxaCount[n-ds.species];
+				}
+				else
+				{
+					l = 1;
+				}
+				m = l+p;
+				for (k=0;k<minIndex; k=k+1)
+				{
+					if (useColumn[k])
+					{
+						distanceMatrix[k][minIndex] = (distanceMatrix[k][minIndex]*l+distanceMatrix[k][j]*p)/m;
+					}
+				}
+				
+				for (k=minIndex+1;k<j;k=k+1)
+				{
+					if (useColumn[k])
+					{
+						distanceMatrix[minIndex][k] = (distanceMatrix[minIndex][k]*l+distanceMatrix[k][j]*p)/m;
+					}
+				}
+				for (k=j+1;k<ds.species;k=k+1)
+				{
+					if (useColumn[k])
+					{
+						distanceMatrix[minIndex][k] = (distanceMatrix[minIndex][k]*l+distanceMatrix[j][k]*p)/m;
+					}
+				}	
+			}	
+			else
+			{
+				if (methodIndex == 2)
+				{
+					/*complete linkage*/
+					for (k=0;k<minIndex; k=k+1)
+					{
+						if (useColumn[k])
+						{
+							if (distanceMatrix[k][j]>distanceMatrix[k][minIndex])
+							{
+								distanceMatrix[k][minIndex] = distanceMatrix[k][j];
+							}
+						}
+					}
+
+					for (k=minIndex+1;k<j;k=k+1)
+					{
+						if (useColumn[k])
+						{
+							if (distanceMatrix[minIndex][k]<distanceMatrix[k][j])
+							{
+								distanceMatrix[minIndex][k]=distanceMatrix[k][j];
+							}
+						}
+					}
+					
+					for (k=j+1;k<ds.species;k=k+1)
+					{
+						if (useColumn[k])
+						{
+							if (distanceMatrix[minIndex][k]<distanceMatrix[j][k])
+							{
+								distanceMatrix[minIndex][k]=distanceMatrix[j][k];
+							}
+						}
+					}	
+				}
+				else
+				{
+					/* single linkage */
+					for (k=0;k<minIndex; k=k+1)
+					{
+						if (useColumn[k])
+						{
+							if (distanceMatrix[k][j]<distanceMatrix[k][minIndex])
+							{
+								distanceMatrix[k][minIndex] = distanceMatrix[k][j];
+							}
+						}
+					}
+					for (k=minIndex+1;k<j;k=k+1)
+					{
+						if (useColumn[k])
+						{
+							if (distanceMatrix[minIndex][k]>distanceMatrix[k][j])
+							{
+								distanceMatrix[minIndex][k]=distanceMatrix[k][j];
+							}
+						}
+					}
+					for (k=j+1;k<ds.species;k=k+1)
+					{
+						if (useColumn[k])
+						{
+							if (distanceMatrix[minIndex][k]>distanceMatrix[j][k])
+							{
+								distanceMatrix[minIndex][k]=distanceMatrix[j][k];
+							}
+						}
+					}				
+				}	
+			}
+		}
+		
+		columnIndex[minIndex] = ds.species+cladesMade-1;
+		
+		for (i=0; i<j; i=i+1)
+		{
+			distanceMatrix[i][j]=0;
+		}
+
+		for (i=j+1; i<ds.species; i=i+1)
+		{
+			distanceMatrix[j][i]=0;
+		}
+		
+		cladesMade = cladesMade+1;
+		
+		for (i = 1; i<ds.species; i=i+1)
+		{
+			if (useColumn[i])
+			{
+				min = distanceMatrix[0][i];
+				minIndex = 0;
+				
+				for (j = 0; j<i; j = j+1)
+				{
+					if (useColumn[j])
+					{
+						if (distanceMatrix[j][i]<min)
+						{
+							min = distanceMatrix[j][i];
+							minIndex = j;
+						}
+					}
+				}
+				columnMin[i] = min;
+				indexMin [i] = minIndex;
+			}
+		}
+	}
+	
+	taxaCount		= 0;
+	
+	columnIndex     = {2*(ds.species+1),1};
+	distanceMatrix  = {ds.species-1,2};
+
+	treeNodes 		= {2*(ds.species+1),3};
+	useColumn		= 0;
+	columnMin		= 0;
+	indexMin		= 0;
+
+	   
+	parentInfo	[ds.species+cladesMade-2][0] = -1; 
+
+	for (j=0; j<ds.species-1; j=j+1)
+	{
+		distanceMatrix[j][1] = -1;
+	}
+
+	for (j=0; j<ds.species; j=j+1)
+	{
+		i = placeParentNodes (j);
+	}
+
+	for (j=0; j<ds.species-1; j=j+1)
+	{
+		distanceMatrix[j][0] = cladesInfo[ds.species+j];
+	}
+
+	distanceMatrix[cladesMade-2][1] = 0;
+	treeNodes[useColumn][0] = cladesMade-2+ds.species;
+	treeNodes[useColumn][1] = 0;
+
+	cladesInfo 	   = distanceMatrix;  
+
+	distanceMatrix = 0;
+	parentInfo 	   = 0;
+	columnIndex	   = 0;
+	
+	return 1;
+}
+
+DISTANCE_PROMPTS  = 1;
+p = InferTreeTopology(1.0);
+DISTANCE_PROMPTS  = 0;
+
+
+/* now with the treeNodes matrix ready we can convert it into a Newick string */
+
+treeString = TreeMatrix2TreeString (1);
+
+fprintf (stdout,"\n\n --------------------- INFERRED TREE --------------------- \n\n", treeString);
+
+fprintf (stdout, "\n\n***********Save this tree to a file (y/n)?");
+
+fscanf  (stdin, "String", resp);
+
+if ((resp!="n")&&(resp!="N"))
+{
+	SetDialogPrompt ("Write tree string to:");
+	fprintf (PROMPT_FOR_FILE,CLEAR_FILE,treeString,";");
+}
+
+UseModel (USE_NO_MODEL);
+
+Tree Inferred_Tree = treeString; 
+
+bestTreeNodes = treeNodes;
+/* now with the treeNodes matrix ready we can convert it into a Newick string */
+
+/*treeString = "";
+p = 0;
+k = 0;
+m = treeNodes[0][1];
+n = treeNodes[0][0];
+
+while (m)
+{	
+	if (m>p)
+	{
+		if (p)
+		{
+			treeString = treeString+",";
+		}
+		for (j=p;j<m;j=j+1)
+		{
+			treeString = treeString+"(";
+		}
+	}
+	else
+	{
+		if (m<p)
+		{
+			for (j=m;j<p;j=j+1)
+			{
+				treeString = treeString+")";
+			}
+		}	
+		else
+		{
+			treeString = treeString+",";
+		}	
+	}
+	if (n<ds.species)
+	{
+		GetString (nodeName, ds, n);
+		treeString = treeString+nodeName;
+	}
+	treeString = treeString+":"+treeNodes[k][2];
+	k=k+1;
+	p=m;
+	n=treeNodes[k][0];
+	m=treeNodes[k][1];
+}
+
+for (j=m;j<p;j=j+1)
+{
+	treeString = treeString+")";
+}
+
+fprintf (stdout,"\n\n --------------------- INFERRED TREE --------------------- \n\n", treeString);
+
+fprintf (stdout, "\n\n***********Save this tree to a file (y/n)?");
+
+fscanf  (stdin, "String", resp);
+
+if ((resp!="n")&&(resp!="N"))
+{
+	SetDialogPrompt ("Write tree string to:");
+	fprintf (PROMPT_FOR_FILE,CLEAR_FILE,treeString,";");
+}*/
diff --git a/res/TemplateBatchFiles/ClusterByDistanceRange.bf b/res/TemplateBatchFiles/ClusterByDistanceRange.bf
new file mode 100644
index 0000000..9e01e8e
--- /dev/null
+++ b/res/TemplateBatchFiles/ClusterByDistanceRange.bf
@@ -0,0 +1,655 @@
+ExecuteAFile ("Utility/GrabBag.bf");
+ExecuteAFile ("SequentialAddition.ibf");
+
+
+/*___________________________________________________________________________________________________________*/
+
+function FindMaxDistance (rIndex, fIndex)
+{
+	max 	= 0;
+	oldIdx 	= 0;
+	for (k=0; k<rIndex; k=k+1)
+	{
+		t = distanceMatrix[rIndex][k];
+		if (t>max)
+		{
+			oldIdx = min;
+			max = t;
+			min = k;
+		}
+	}
+	for (k=rIndex+1; k<mDim; k=k+1)
+	{
+		t = distanceMatrix[rIndex][k];
+		if (t>max)
+		{
+			oldIdx = min;
+			max = t;
+			min = k;
+		}
+	}
+	if (min == fIndex)
+	{
+		return oldIdx;
+	}
+	return min;
+}
+/*___________________________________________________________________________________________________________*/
+
+function PadString (padLength,padChar)
+{
+	for (padCounter=0;padCounter<padLength;padCounter=padCounter+1)
+	{
+		fprintf (stdout,padChar);
+	}
+	return padLength;
+}
+
+/*___________________________________________________________________________________________________________*/
+
+function	PrintASCIITable (dataMatrix, titleMatrix)
+{
+	columnWidths = {1,Columns(titleMatrix)};
+	for (counter1=0; counter1<Columns(titleMatrix); counter1 = counter1+1)
+	{
+		counter2 = Abs (titleMatrix[0][counter1])+2;
+		if (counter2<12)
+		{
+			counter2 = 12;
+		}
+		columnWidths[0][counter1] = counter2;
+	}
+	fprintf (stdout, "\n");
+	for (counter2 = 0; counter2 < Columns (titleMatrix); counter2 = counter2+1)
+	{
+		fprintf (stdout,"+-");
+		dummy = PadString (columnWidths[0][counter2],"-");
+		fprintf (stdout,"-");
+	}
+	fprintf (stdout,"+\n| ");
+	
+	for (counter1=0; counter1<Columns(titleMatrix); counter1 = counter1+1)
+	{
+		fprintf (stdout, titleMatrix[counter1]);
+		dummy = PadString (columnWidths[0][counter1]-Abs(titleMatrix[counter1])," ");
+		fprintf (stdout, " | ");
+	}
+	
+	fprintf (stdout, "\n");
+	
+	for (counter1=-1; counter1<Rows(dataMatrix); counter1 = counter1 + 1)
+	{
+		if (counter1>=0)
+		{
+			fprintf (stdout,"| ");
+			fprintf (stdout,Format(counter1+1,columnWidths[0][0],0));
+			for (counter2 = 1; counter2 < Columns (titleMatrix); counter2 = counter2+1)
+			{
+				fprintf (stdout," | ");
+				fprintf (stdout,Format(dataMatrix[counter1][counter2-1],columnWidths[0][counter2],-1));
+			}
+			fprintf (stdout," ");
+			fprintf (stdout, "|\n");
+		}
+		for (counter2 = 0; counter2 < Columns (titleMatrix); counter2 = counter2+1)
+		{
+			fprintf (stdout,"+-");
+			dummy = PadString (columnWidths[0][counter2],"-");
+			fprintf (stdout,"-");
+		}
+		fprintf (stdout, "+\n");
+	}
+	
+	return 1;
+}
+
+/*___________________________________________________________________________________________________________*/
+
+ChoiceList (dataType,"Data type",1,SKIP_NONE,"Nucleotide/Protein","Nucleotide or amino-acid (protein).",
+				     "Codon","Codon (several available genetic codes).");
+
+if (dataType<0) 
+{
+	return;
+}
+if (dataType)
+{
+	SetDialogPrompt ("Please choose a codon data file:");
+	ExecuteAFile("TemplateModels/chooseGeneticCode.def");
+}
+else
+{
+	SetDialogPrompt ("Please choose a nucleotide or amino-acid data file:");
+}
+
+
+DataSet ds = ReadDataFile (PROMPT_FOR_FILE);
+
+if (dataType)
+{
+	DataSetFilter filteredData = CreateFilter (ds,3,"","",GeneticCodeExclusions);
+}
+else
+{
+	DataSetFilter filteredData = CreateFilter (ds,1,"","");
+}
+
+SetDialogPrompt 	("Load a distance matrix:");
+fscanf 				(PROMPT_FOR_FILE,"NMatrix",distanceMatrix);
+
+
+/* compute some matrix statistics */
+
+sum  = 0;
+sum2 = 0;
+max	 = 0;
+min  = 1e100;
+
+mDim = Rows (distanceMatrix);
+
+if (mDim != ds.species)
+{
+	fprintf (stdout, "[ERROR] Read ", ds.species, " but the distance matrix had an incompatible dimension: ", mDim, "\n");
+	return 0;
+}
+
+dDim = mDim*(mDim-1)/2;
+
+ChoiceList (doHist,"Histogram",1,SKIP_NONE,"Generate","Compute and report distribution statistics of pairwise distances.",
+				     "Skip","Skip this step");
+	
+if (doHist<0)
+{
+	return 0;
+}
+
+if (doHist == 0)
+{
+	vec  = {dDim,1};
+
+	k	  = 0;
+	for (r=0; r< mDim; r=r+1)
+	{
+		for (c=r+1; c<mDim; c=c+1)
+		{
+			t                    = Max(distanceMatrix[r][c],0);
+			distanceMatrix[c][r] = t;
+			distanceMatrix[r][c] = t;
+			vec[k]				 = t;
+			k					 = k+1;
+			sum				     = sum+t;
+		}
+	}
+
+	vec		 = vec%0;
+	min		 = vec[0];
+	max		 = vec[dDim-1];
+	sum      = sum/dDim;
+
+
+	IQR = vec[3*dDim$4] - vec[dDim$4];
+
+	h    = 2*IQR/dDim^(1/3);
+	b25	 = vec[25*dDim$1000];
+	t975 = vec[975*dDim$1000];
+	span = t975 - b25;
+	bins = (span/h+0.5)$1;
+	h	 = span/bins;
+
+
+	histogramTable		 = {bins,4};
+	histogramTable[0][0] = min;
+	histogramTable[0][1] = b25+h;
+
+	for (c=1; c<bins;c=c+1)
+	{
+		histogramTable[c][0] = histogramTable[c-1][1];
+		histogramTable[c][1] = histogramTable[c-1][1] + h;
+	}
+
+	histogramTable[c-1][1] = max;
+	bm1				       = bins-1;
+
+	for (r=0; r< mDim; r=r+1)
+	{
+		for (c=r+1; c<mDim; c=c+1)
+		{
+			t     = distanceMatrix[r][c];
+			sum2  = sum2+(t-sum)^2;
+			t	  = Max(0,Min(((t-b25)/h$1),bm1));
+			
+			
+			histogramTable[t][2] = histogramTable[t][2] + 1;
+		}
+	}
+
+	for (c=0; c<25;c=c+1)
+	{
+		histogramTable[c][3] = histogramTable[c][2]/dDim;
+	}
+
+	fprintf (stdout, "\nDistance matrix info:\n",
+					 "Mean        : ", sum, "\n",
+					 "Variance    : ", sum2/(dDim-1), "\n",
+					 "IQR         : ", IQR, "\n",
+					 "Minimum     : ", min, "\n",
+					 "Maximum     : ", max, "\n");
+
+	labels = {{"Bin","From","To", "Count", "Proportion"}};
+
+	PrintASCIITable (histogramTable, labels);
+}
+else
+{
+	/*for (r=0; r< mDim; r=r+1)
+	{
+		for (c=r+1; c<mDim; c=c+1)
+		{
+			t = Max(distanceMatrix[r][c], 0);
+			distanceMatrix[c][r] = t;
+			distanceMatrix[r][c] = t;
+		}
+	}*/	
+	
+	max = Max(distanceMatrix,0);
+
+}
+
+clumpingL = -1;
+
+
+ChoiceList (clusteringType,"Clustering algorithm",1,SKIP_NONE,
+						   "At least one","A sequence in a cluster is sufficiently close to AT LEAST ONE of the other sequences in the cluster.",
+						   "All",		  "A sequence in a cluster is sufficiently close to ALL OTHER sequences in the cluster.");
+						   
+if (clusteringType < 0)
+{
+		return 0;
+}	
+		
+while (clumpingL < 0)
+{
+	fprintf (stdout, "Please enter the lower distance bound (>=0, or -1 to plot clusters vs cutoff):");
+	fscanf  (stdin,"Number",clumpingL);
+	if (clumpingL == (-1))
+	{
+		break;
+	}
+}
+
+if (clumpingL>=0)
+{
+	do
+	{
+		SetDialogPrompt ("Set comma separated results to:");
+		DEFAULT_FILE_SAVE_NAME = "Clustering.csv";	
+		fprintf (PROMPT_FOR_FILE,CLEAR_FILE);	
+		outFile = LAST_FILE_PATH;
+		outString = "";
+		outString * 8192;
+		clumpingU	 = prompt_for_a_value ("Please enter the upper distance bound", clumpingL + 0.01, clumpingL, max, 0);
+		clusterCount = doClustering (clumpingL, clumpingU, clusteringType);
+		
+		
+		fprintf (stdout, "\nFound ", clusterCount, " clusters on total ", totalEdgeCount," edges\n");
+		
+		sortedCluster = {mDim,2};
+		degreeDistro  = {};
+		ones		  = {mDim,1}["1"];
+		maxDegree	  = 0;
+		
+		for (k=0; k<mDim; k=k+1)
+		{
+			sortedCluster[k][0] = visited[k];
+			sortedCluster[k][1] = k;
+			thisRow 			= ((gatedDistances[k][-1])*ones)[0] + 1;
+			degreeDistro[thisRow] = degreeDistro[thisRow] + 1;
+		}	
+		
+		diffDegrees = Abs(degreeDistro);
+		logLog 		= {diffDegrees,2};
+		keys		= Rows (degreeDistro);
+		
+		for (k=0; k<diffDegrees; k=k+1)
+		{
+			logLog[k][0] = 0+keys[k];
+			logLog[k][1] = degreeDistro[keys[k]];
+		}
+	
+		
+		logLog = logLog % 0;
+		logLog[diffDegrees-1][1] = logLog[diffDegrees-1][1] / mDim;
+		for (k=diffDegrees-2; k>=0; k=k-1)
+		{
+			logLog[k][1] = logLog[k][1]/mDim+logLog[k+1][1];
+		}
+		
+		logLog = Log(logLog);
+		
+columnHeaders = {{"Log[Degree]","Log[Prob]"}};
+OpenWindow (CHARTWINDOW,{{"Log-Log degree plot"}
+		{"columnHeaders"}
+		{"logLog"}
+		{"Scatterplot"}
+		{"Log[Degree]"}
+		{"Log[Prob]"}
+		{"Log(Degree)"}
+		{""}
+		{"Log(Probability)"}
+		{"0"}
+		{""}
+		{"-1;-1"}
+		{"10;1.309;0.785398"}
+		{"Times:12:0;Times:10:0;Times:12:2"}
+		{"0;0;16777215;8355711;0;0;6579300;11842740;13158600;14474460;0;3947580;16777215;15670812;6845928;16771158;2984993;9199669;7018159;1460610;16748822;11184810;14173291"}
+		{"16,0,0"}
+		},
+		"480;665;70;70");
+		
+		sortedCluster = sortedCluster % 0;
+		
+		stringLabel = "";
+		graphVizSt  = ""; graphVizSt * 128;
+		
+		edgesPrinted = 0;
+		nodesMade	 = {};
+		
+		outString  * ("SequenceID,ClusterID_"+clumpingL+"_"+clumpingU);
+		
+		lastClusterID     = 1;
+		clusterSpan	      = 0;
+		clusterSizes      = {};
+		clusterMembership = {};
+		definedNode = {};
+		
+		for (k=0; k<=mDim; k=k+1)
+		{
+			if (k < mDim)
+			{
+				clusterID		= sortedCluster[k][0];
+				visited [k]		= clusterID;
+				GetString		(seqName, ds,sortedCluster[k][1]);
+				stringLabel		= stringLabel + ";" + seqName;
+				outString	    * ("\n"+seqName+","+clusterID);
+			}
+			else
+			{
+				clusterID 		= lastClusterID+1;
+			}	
+			
+			if (lastClusterID != clusterID)
+			{
+				clusterSize						= k-clusterSpan;
+				clusterSizes[clusterSize]		= clusterSizes[clusterSize] + 1;
+				clusterMembership[clusterSize]  = clusterMembership[clusterSize] + clusterSize;
+				
+				graphVizSt * ("\n\n/* cluster " + lastClusterID + "*/\n\n");
+				
+				
+				for (n1 = 0; n1 < clusterSize; n1=n1+1)
+				{
+					id1  = sortedCluster[clusterSpan + n1][1];
+					GetString		(seqName, ds,id1); 
+										
+					for (n2 = n1 + 1; n2 < clusterSize; n2 = n2+1)
+					{
+						id2 = sortedCluster[clusterSpan + n2][1];
+						d = distanceMatrix[id1][id2];
+						/*fprintf (stdout, id1, ":", id2, ":", d, "\n");*/
+						if (d <= clumpingU && d>= clumpingL)
+						{
+							if (Abs(definedNode[seqName]) == 0)
+							{
+								graphVizSt * ("\"" + seqName + "\" [label = \"\"];\n");
+								definedNode[seqName]  = 1;
+							}
+							GetString		(seqName2, ds,id2); 
+							if (Abs(definedNode[seqName2]) == 0)
+							{
+								graphVizSt * ("\"" + seqName2 + "\" [label = \"\"];\n");
+								definedNode[seqName2]  = 1;
+							}
+							graphVizSt * ("\"" + seqName + "\" -- \"" + seqName2 + "\";\n");
+							edgesPrinted = edgesPrinted + 1;
+							nodesMade [seqName] = 1;
+							nodesMade [seqName2] = 1;
+						}
+					}
+				}
+				clusterSpan = k;
+				lastClusterID = clusterID;
+			}
+		}
+		
+		outString * 0;
+		fprintf (outFile, outString);
+		fprintf (stdout, "Graphviz edges/nodes = ", edgesPrinted, "/", Abs(nodesMade), "\n");
+		
+		fprintf (stdout, "\nCluster size distribution\n");
+		_printAnAVLNumericTotal (clusterSizes, ".");
+
+		fprintf (stdout, "\nCluster membership distribution\n");
+		_printAnAVLNumericTotal (clusterMembership, ".");
+		
+		graphVizSt * 0;
+		
+		SetDialogPrompt ("Save GraphViz file to:");
+		fprintf			(PROMPT_FOR_FILE, CLEAR_FILE, "graph G{\n", graphVizSt, "\n};");
+		
+		fprintf (stdout, "Continue with another threshold (y/n)?");
+		fscanf  (stdin,"String", shouldCont);
+		
+	}
+	while (shouldCont[0] != "n" && shouldCont[0] != "N");
+	
+	columnHeaders = {{"Cluster ID",  stringLabel}};
+
+	OpenWindow (CHARTWINDOW,{{"Cluster Allocation"}
+		{"columnHeaders"}
+		{"visited"}
+		{"None"}
+		{"Cutoff"}
+		{"Clusters"}
+		{"Cutoff"}
+		{""}
+		{"Cluster Count"}
+		{"0"}
+		{""}
+		{"-1;-1"}
+		{"10;1.309;0.785398"}
+		{"Times:14:0;Times:10:0;Times:14:1"}
+		{"0;0;16777215;8421504;0;0;6579300;11842740;13158600;14474460;0;3947580;16777215;0;6845928;16771158;2984993;9199669;7018159;1460610;16748822;11184810;14173291"}
+		{"16,0,0"}
+		},
+		"SCREEN_WIDTH-100;SCREEN_HEIGHT-100;50;50");
+}
+else
+{
+	SetDialogPrompt ("Set comma separated results to:");
+
+	DEFAULT_FILE_SAVE_NAME = "Clustering.csv";
+
+	fprintf (PROMPT_FOR_FILE,CLEAR_FILE);
+
+	outFile = LAST_FILE_PATH;
+	outString = "";
+	outString * 8192;
+
+	maxSteps = 500;
+	
+	distanceMx = {maxSteps,2} ["(_MATRIX_ELEMENT_COLUMN_==0)*(_MATRIX_ELEMENT_ROW_)*max/maxSteps"];
+	
+	/*size 	 = mDim*(mDim-1)/2;
+	sizeStep = size$maxSteps;
+	
+	if (sizeStep<1)
+	{
+		sizeStep = 1;
+	}
+
+	size = Min(maxSteps,size);
+	
+	distanceMx = {size,2};
+	
+	k  = 0;
+	k2 = 0;
+	for (r=0; r< mDim; r=r+1)
+	{
+		for (c=r+1; c<mDim; c=c+1)
+		{
+			k2 = k2+1;
+			if (k2%sizeStep == 0)
+			{
+				distanceMx [k][0] = distanceMatrix[r][c];
+				k = k+1;
+			}
+		}
+	}*/
+	
+	lastTime = Time (0);
+	outString * "Cutoff, Cluster Count";
+
+	distanceMx = distanceMx%0;
+	distanceMx[0][1] = doClustering (0, distanceMx[0][0], clusteringType);
+	outString * ("\n"+distanceMx[0][0]+","+distanceMx[0][1]);
+	for (rz = 1; rz < Rows(distanceMx); rz = rz+1)
+	{
+		if (Time(0)-lastTime>5)
+		{
+			fprintf (stdout, "Step ", rz, "/", Rows(distanceMx),"\n");
+			lastTime = Time(0);
+		}
+
+		if (distanceMx[rz][0]>distanceMx[rz-1][0])
+		{
+			distanceMx[rz][1] = doClustering (0, distanceMx[rz][0], clusteringType);
+		}
+		else
+		{
+			distanceMx[rz][1] = distanceMx[rz-1][1];
+		}
+		outString * ("\n"+distanceMx[rz][0]+","+distanceMx[rz][1]);
+	}
+	
+	outString * 0;
+	fprintf (outFile, outString);
+	columnHeaders = {{"Cutoff","Clusters"}};
+	OpenWindow (CHARTWINDOW,{{"Cluster Count Plot"}
+		{"columnHeaders"}
+		{"distanceMx"}
+		{"Line Plot"}
+		{"Cutoff"}
+		{"Clusters"}
+		{"Cutoff"}
+		{""}
+		{"Cluster Count"}
+		{"0"}
+		{""}
+		{"-1;-1"}
+		{"10;1.309;0.785398"}
+		{"Times:14:0;Times:10:0;Times:14:1"}
+		{"0;0;16777215;8421504;0;0;6579300;11842740;13158600;14474460;0;3947580;16777215;0;6845928;16771158;2984993;9199669;7018159;1460610;16748822;11184810;14173291"}
+		{"16,0,0"}
+		},
+		"SCREEN_WIDTH-100;SCREEN_HEIGHT-100;50;50");
+}
+
+
+
+/*___________________________________________________________________________________________________________*/
+
+function doClustering (from, to, clusteringAlg)
+{
+	visited 	   = {mDim,1};
+	gatedDistances = distanceMatrix["_MATRIX_ELEMENT_VALUE_ >= from && _MATRIX_ELEMENT_VALUE_ <= to && _MATRIX_ELEMENT_ROW_!=_MATRIX_ELEMENT_COLUMN_"];
+
+	clusterCount = 1;
+	done		 = 0;
+	vertexCount  = 0;
+	
+	totalEdgeCount = (+gatedDistances) $ 2;
+	
+	if (clusteringAlg == 0)	
+	{
+		for (currentVertex=0; currentVertex < mDim; currentVertex=currentVertex+1)
+		{
+			if (visited[currentVertex] == 0)
+			{
+				visited[currentVertex] = clusterCount;
+				for (k=currentVertex+1; k<mDim; k=k+1)
+				{
+					if (visited[k] == 0)
+					{
+						if (gatedDistances[currentVertex][k])
+						{
+							visited[k] = clusterCount;
+							doAVertex (k, 0);
+						}
+					}
+				}
+				clusterCount += 1;
+			}
+		}
+	}
+	else
+	{
+		for (currentVertex=0; currentVertex < mDim; currentVertex +=1 )
+		{
+			//fprintf (stdout, visited, "\n");
+			for (k=0; k<currentVertex; k += 1 )
+			{
+				if (gatedDistances[currentVertex][k])
+				{
+					tryThisCluster = visited[k];
+					//fprintf (stdout, "\n", currentVertex, " testing: ", tryThisCluster, "\n");
+					for (k2 = 0; k2 < currentVertex; k2+=1)
+					{
+						if (visited[k2] == tryThisCluster)
+						{
+							if (gatedDistances[currentVertex][k2] == 0)
+							{
+								//fprintf (stdout, currentVertex, " failed: ", k2, "/", distanceMatrix[currentVertex][k2], "\n");
+								k2 = -1;
+								break;
+							}
+						}
+					}
+					if (k2 > 0)
+					{
+						//fprintf (stdout, currentVertex, " passed: ", tryThisCluster, "\n");
+						visited[currentVertex] = tryThisCluster;
+						k = -1;
+						break;
+					}
+				}
+			}
+			if (k >= 0)
+			{
+				//fprintf (stdout, currentVertex, " assigned to a new cluster: ", clusterCount, "\n");
+				visited[currentVertex] = clusterCount;
+				clusterCount += 1;			
+			}
+		}
+		
+	}
+	return clusterCount-1;
+}
+
+
+/*___________________________________________________________________________________________________________*/
+
+function 	doAVertex (vertexID, currentNeighbor)
+{
+	for (;currentNeighbor < mDim; currentNeighbor=currentNeighbor+1)
+	{
+		if (visited[currentNeighbor]==0)
+		{
+			if (gatedDistances[vertexID][currentNeighbor])
+			{
+				visited[currentNeighbor] = clusterCount;
+				ExecuteCommands("doAVertex ("+currentNeighbor+", 0);");
+			}
+		}
+	}
+	return 0;
+}
diff --git a/res/TemplateBatchFiles/CodonBivariateRateProcessor.bf b/res/TemplateBatchFiles/CodonBivariateRateProcessor.bf
new file mode 100644
index 0000000..e6ad258
--- /dev/null
+++ b/res/TemplateBatchFiles/CodonBivariateRateProcessor.bf
@@ -0,0 +1,444 @@
+/*---------------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function echoCatVar (ps,values)
+{
+	DD 			= Rows(ps);
+	EE 			= 0.0;
+	sampleVar 	= 0.0;
+	
+	for (k=0; k<DD; k=k+1)
+	{
+		EE = ps[k]*values[k]+EE;
+		sampleVar = sampleVar+ps[k]*values[k]*values[k];
+	}
+		
+	sampleVar = sampleVar-EE*EE;
+	
+	fprintf  (stdout,  "Mean     = ",EE, 
+					 "\nVariance = ",sampleVar,
+					 "\nCOV      = ", Sqrt(sampleVar)/EE,"\n");
+					 
+	for (k=0; k<DD; k=k+1)
+	{
+		fprintf (stdout,"\nRate[",Format(k,0,0),"]=",Format(values[k],12,8), " (weight=", 
+						  Format(ps[k],9,7),")");
+	}
+	return EE;
+}
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function echoCovariance (ps,values1,values2)
+{
+	DD 			= Rows(ps);
+	EE 			= 0.0;
+	EE2			= 0.0;
+	sampleVar 	= 0.0;
+	sampleVar2 	= 0.0;
+	
+	for (k=0; k<DD; k=k+1)
+	{
+		EE  = ps[k]*values1[k]+EE;
+		EE2 = ps[k]*values2[k]+EE2;
+		sampleVar = sampleVar+ps[k]*values1[k]*values1[k];
+		sampleVar2 = sampleVar2+ps[k]*values2[k]*values2[k];
+	}
+		
+	sampleVar = sampleVar-EE*EE;
+	sampleVar2 = sampleVar2-EE2*EE2;
+	
+	cov  = 0;
+	cov2 = 0;
+	for (k=0; k<DD; k=k+1)
+	{
+		cov  = cov  + ps[k]*(values1[k]-EE);
+		cov2 = cov2 + ps[k]*(values2[k]-EE2);
+	}
+
+	return cov*cov2/Sqrt(sampleVar*sampleVar2);
+}
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------------*/
+
+ExecuteAFile(HYPHY_LIB_DIRECTORY+"TemplateBatchFiles"+DIRECTORY_SEPARATOR+"TemplateModels"+DIRECTORY_SEPARATOR+"chooseGeneticCode.def");
+ExecuteAFile(HYPHY_LIB_DIRECTORY+"TemplateBatchFiles"+DIRECTORY_SEPARATOR+"Utility"+DIRECTORY_SEPARATOR+"PS_Plotters.bf");
+
+SetDialogPrompt		("Choose a model fit:");
+ExecuteAFile		(PROMPT_FOR_FILE);
+basePath		    = LAST_FILE_PATH;
+GetInformation		(vars,"^P_[0-9]+");
+rateCount			= Columns (vars)+1;
+
+GetString			(lfInfo, lf, -1);
+fileCount			= Columns(lfInfo["Trees"])/rateCount;
+
+fprintf (stdout, "\nLoaded a fit on ", fileCount, " data sets with ", rateCount, " rates\n");
+
+ps 			 = {rateCount,1};
+rateInfo	 = {rateCount,4};
+rateInfo	 = rateInfo["1"];
+
+for (mi = 0; mi < rateCount-1; mi=mi+1)
+{
+	ExecuteCommands ("ps["+mi+"]="+"P_"+(mi+1)+";");
+}
+
+for (mi = 0; mi < rateCount; mi=mi+1)
+{
+	ExecuteCommands ("rateInfo[mi][1]="+"S_"+mi+"/c_scale;");
+	ExecuteCommands ("rateInfo[mi][2]="+"NS_"+mi+"/c_scale;");
+	rateInfo[mi][3] = rateInfo[mi][2]-rateInfo[mi][1];
+}
+
+
+for (mi=0; mi<rateCount-1; mi=mi+1)
+{
+	for (mi2 = 0; mi2 < mi; mi2=mi2+1)
+	{
+		rateInfo[mi][0] = rateInfo[mi][0] * (1-ps[mi2]);
+	}
+	rateInfo[mi][0] = rateInfo[mi][0] * ps[mi];
+}
+
+
+for (mi2 = 0; mi2 < mi; mi2=mi2+1)
+{
+	rateInfo[mi][0] = rateInfo[mi][0] * (1-ps[mi2]);
+}
+
+fprintf (stdout, "\n\n1).Synonymous rates:\n\n");
+echoCatVar (rateInfo[-1][0],rateInfo[-1][1]);
+fprintf (stdout, "\n\n2).Non-synonymous rates:\n\n");
+echoCatVar (rateInfo[-1][0],rateInfo[-1][2]);
+
+columnHeaders = {{"P","dS","dN","dN-dS"}};
+OpenWindow (CHARTWINDOW,{{"Rates"}
+		{"columnHeaders"}
+		{"rateInfo"}
+		{"Scatterplot"}
+		{"dS"}
+		{"dN"}
+		{"dS"}
+		{""}
+		{"dN"}
+		{"0"}
+		{""}
+		{"-1;-1"}
+		{"10;1.309;0.785398"}
+		{"Times:12:0;Times:10:0;Times:12:2"}
+		{"0;0;16777215;0;0;0;6579300;11842740;13158600;14474460;0;3947580;16777215;16711680;6845928;16771158;2984993;9199669;7018159;1460610;16748822;11184810;14173291"}
+		{"16,0,0"}
+		},
+		"749;663;70;70");
+		
+		
+
+		
+ConstructCategoryMatrix (cm, lf, COMPLETE);
+
+site_count 		= Columns (cm)/rateCount;
+posteriorProbs  = {site_count, rateCount};
+columnHeaders   = {1,rateCount};
+
+for (rate_enumerator = 0; rate_enumerator < rateCount; rate_enumerator = rate_enumerator + 1)
+{
+	columnHeaders[rate_enumerator] = "Rate " + (rate_enumerator+1);
+}
+
+for (site_enumerator = 0; site_enumerator < site_count; site_enumerator = site_enumerator + 1)
+{
+	sum = 0; 
+	
+	smallestScaler = 1e100;
+	
+	for (rate_enumerator = 0; rate_enumerator < rateCount; rate_enumerator = rate_enumerator + 1)
+	{
+		smallestScaler = Min(smallestScaler,cm.site_scalers[rate_enumerator*site_count+site_enumerator]);
+	}
+	
+	for (rate_enumerator = 0; rate_enumerator < rateCount; rate_enumerator = rate_enumerator + 1)
+	{
+		v = cm[rate_enumerator*site_count+site_enumerator] * rateInfo[rate_enumerator][0] * Exp(cm.log_scale_multiplier*(smallestScaler-cm.site_scalers[rate_enumerator*site_count+site_enumerator]));
+		posteriorProbs[site_enumerator] [rate_enumerator]= v;
+		sum = sum + v;
+	}
+
+	for (rate_enumerator = 0; rate_enumerator < rateCount; rate_enumerator = rate_enumerator + 1)
+	{
+		posteriorProbs[site_enumerator] [rate_enumerator]= posteriorProbs[site_enumerator] [rate_enumerator]/sum;
+	}
+}
+
+distrInfo = "";
+distrInfo * 128;
+distrInfo * "dN_minus_dS";
+for (k = 0; k <= mi; k = k+1)
+{
+	distrInfo * (":" + rateInfo[k][0]);
+}
+for (k = 0; k <= mi; k = k+1)
+{
+	distrInfo * (":" + rateInfo[k][3]);
+}
+distrInfo * 0;
+
+{"SmallCodon_part_Categ:0.25:0.25:0.25:0.25:0.00116849:0.0498505:0.447572:3.50141"}
+
+OpenWindow (DISTRIBUTIONWINDOW,{{"Posteriors"}
+		{"columnHeaders"}
+		{"posteriorProbs"}
+		{"None"}
+		{""}
+		{""}
+		{""}
+		{""}
+		{""}
+		{"0"}
+		{""}
+		{"-1;-1"}
+		{"10;1.309;0.785398"}
+		{"Times:12:0;Times:10:0;Times:12:2"}
+		{"0;0;16777215;0;0;0;6579300;11842740;13158600;14474460;0;3947580;16777215;16711680;6845928;16771158;2984993;9199669;7018159;1460610;16748822;11184810;14173291"}
+		{"16,0,0"}
+		{distrInfo}		
+		},
+		"749;663;200;200");
+
+
+nonStopCount = 0;
+
+for (h1 = 0; h1<64; h1=h1+1)
+{
+	if (_Genetic_Code[h1]!=10)
+	{
+		nonStopCount = nonStopCount + 1;
+	}
+}
+
+/* make syn and non-syn template matrices */
+
+ExecuteAFile(HYPHY_LIB_DIRECTORY+"TemplateBatchFiles"+DIRECTORY_SEPARATOR+"Distances"+DIRECTORY_SEPARATOR+"CodonTools.def");
+
+for (fileID = 1; fileID <= fileCount; fileID = fileID+1)
+{
+	fprintf (stdout, "\n\nWorking on file ", fileID, "\n\n");
+	ExecuteCommands ("codonCount=filteredData_"+fileID+".sites;");
+
+	sSites  = 0;
+	nsSites = 0;
+
+	synM    = {nonStopCount,nonStopCount};
+	nonSynM = {nonStopCount,nonStopCount};
+
+	vertOnes = {nonStopCount,1};
+	horOnes  = {1,nonStopCount};
+
+	for (h1 = 0; h1<nonStopCount; h1=h1+1)
+	{
+		vertOnes [h1] = 1;
+		horOnes  [h1] = 1;
+	}
+
+	hShift = 0;
+	for (h1 = 0; h1 < 64; h1=h1+1)
+	{
+		gc1 = _Genetic_Code[h1];
+		if (gc1 == 10)
+		{
+			hShift = hShift+1;
+		}
+		else
+		{
+			sSites = sSites   + codonCount * _S_NS_POSITIONS_[0][h1] * vectorOfFrequencies[h1-hShift];
+			nsSites = nsSites + codonCount * _S_NS_POSITIONS_[1][h1] * vectorOfFrequencies[h1-hShift];
+			
+			vShift = hShift;
+			for (v1 = h1+1; v1 < 64; v1=v1+1)
+			{
+				gc2 = _Genetic_Code[v1];
+				if (gc2 == 10)
+				{
+					vShift = vShift + 1;
+				}
+				else
+				{
+					if (gc1 == gc2)
+					{
+						synM [h1-hShift][v1-vShift] = vectorOfFrequencies[h1-hShift];
+						synM [v1-vShift][h1-hShift] = vectorOfFrequencies[v1-vShift];
+					}
+					else
+					{
+						nonSynM [h1-hShift][v1-vShift] = vectorOfFrequencies[h1-hShift];
+						nonSynM [v1-vShift][h1-hShift] = vectorOfFrequencies[v1-vShift];
+					}
+				}
+			}
+		}
+	}
+
+
+	ExecuteAFile(HYPHY_LIB_DIRECTORY+"TemplateBatchFiles"+DIRECTORY_SEPARATOR+"TreeTools.ibf");
+
+	fprintf (stdout, "\nTotal nucleotide sites :", codonCount*3,
+					 "\nSynonymous  sites      :", sSites, 
+					 "\nNonsynonymous  sites   :", nsSites, "\n");
+					 
+	sSites  = codonCount/sSites;
+	nsSites = codonCount/nsSites;
+
+	ExecuteCommands ("branchNames = BranchName (tree_"+fileID+"_0,-1);");
+	T 			= Columns    (branchNames);
+
+	synSubsAVL = {};
+	dSAVL	   = {};
+	nsSubsAVL  = {};
+	dNAVL	   = {};
+
+	for (treeCounter = 0; treeCounter < rateCount; treeCounter = treeCounter + 1)
+	{
+		for (h1=0; h1 < T-1; h1=h1+1)
+		{
+			abn = branchNames[h1];
+			ExecuteCommands("GetInformation (aRateMx, tree_"+fileID+"_"+treeCounter+"."+abn+");");
+			synSubs  = (horOnes*(aRateMx$synM))*vertOnes;
+			nsynSubs = (horOnes*(aRateMx$nonSynM))*vertOnes;
+			synSubs = synSubs[0]/3;
+			nsynSubs = nsynSubs[0]/3;
+			
+			synSubsAVL[abn] = synSubsAVL[abn] + synSubs*rateInfo[treeCounter][0];
+			nsSubsAVL [abn] = nsSubsAVL [abn] + nsynSubs*rateInfo[treeCounter][0];
+			dSAVL[abn]	    = dSAVL[abn] + synSubs *sSites*rateInfo[treeCounter][0];
+			dNAVL[abn]	    = dNAVL[abn] + nsynSubs*nsSites*rateInfo[treeCounter][0];
+		}
+	}
+
+	ExecuteCommands ("treeAVL = tree_"+fileID+"_0^0");
+
+	synTreeString 		= PostOrderAVL2StringDistances (treeAVL, synSubsAVL); 
+	nonSynTreeString	= PostOrderAVL2StringDistances (treeAVL, nsSubsAVL);
+	dSTreeString 		= PostOrderAVL2StringDistances (treeAVL, dSAVL); 
+	dNTreeString	    = PostOrderAVL2StringDistances (treeAVL, dNAVL);
+
+
+	/*fprintf (stdout, "\nE[Syn subs/nucleotide site] tree: \n\t",     synTreeString, 	   "\n");
+	fprintf (stdout, "\nE[Non-syn subs/nucleotide site] tree: \n\t", nonSynTreeString, "\n");
+	fprintf (stdout, "\ndS tree: \n\t", dSTreeString, "\n");
+	fprintf (stdout, "\ndN tree: \n\t", dNTreeString, "\n");*/
+
+	UseModel (USE_NO_MODEL);
+
+	ExecuteCommands ("Tree 	synSubsTree_"+fileID+"= synTreeString;Tree	nonsynSubsTree_"+fileID+" 	= nonSynTreeString;Tree 	dSTree_"+fileID+" 			= dSTreeString;Tree	dNTree_"+fileID+" = dNTreeString;");
+
+	ProcessATree ("synSubsTree_"+fileID);
+	ProcessATree ("nonsynSubsTree_"+fileID);
+	ProcessATree ("dSTree_"+fileID);
+	ProcessATree ("dNTree_"+fileID);
+	
+	mxTreeSpec  = {5,1};
+
+	mxTreeSpec [0] = "nonsynSubsTree_"+fileID;
+	mxTreeSpec [3] = "";
+	mxTreeSpec [4] = "Inferred_Tree."+nodeName;
+	mxTreeSpec [1] = "8211";
+	mxTreeSpec [2] = "";
+
+
+	OpenWindow (TREEWINDOW, mxTreeSpec,"(SCREEN_WIDTH-50)/2;(SCREEN_HEIGHT-50)/2;10;40");
+
+	mxTreeSpec [0] = "synSubsTree_"+fileID;
+	OpenWindow (TREEWINDOW, mxTreeSpec,"(SCREEN_WIDTH-50)/2;(SCREEN_HEIGHT-50)/2;30+(SCREEN_WIDTH-30)/2;40");
+
+	mxTreeSpec [0] = "dSTree_"+fileID;
+	OpenWindow (TREEWINDOW, mxTreeSpec,"(SCREEN_WIDTH-50)/2;(SCREEN_HEIGHT-50)/2;10;45+(SCREEN_HEIGHT-50)/2");
+
+	mxTreeSpec [0] = "dNTree_"+fileID;
+	OpenWindow (TREEWINDOW, mxTreeSpec,"(SCREEN_WIDTH-50)/2;(SCREEN_HEIGHT-50)/2;30+(SCREEN_WIDTH-30)/2;45+(SCREEN_HEIGHT-50)/2");
+}
+
+logRates = {rateCount,3};
+epsilon  = Exp(-4);
+for (mi = 0; mi < rateCount; mi=mi+1)
+{
+	logRates[mi][0] = Min(Log(rateInfo[mi][1]+epsilon),4);
+	logRates[mi][1] = Min(Log(rateInfo[mi][2]+epsilon),4);
+	logRates[mi][2] = rateInfo[mi][0];
+}
+		
+psCode = ScaledDensityPlot ("logRates", {{-4,4}{-4,4}}, "Courier", {{400,400,14,40}},
+								"_dNdSDensityPlot",
+								{{"","log (alpha)", "log (beta)"}}, 1, 1);
+
+psFile = basePath + ".ps";
+fprintf (psFile, CLEAR_FILE, psCode);
+
+
+/*---------------------------------------------------------*/
+
+function ProcessATree (treeName)
+{
+	ExecuteCommands ("treeAVL2 = "+treeName + " ^ 0;leafCount=TipCount("+treeName+");"); 
+	
+	multFactors = {};
+	for (k=1; k<Abs(treeAVL2); k=k+1)
+	{
+		aNode = treeAVL2[k];
+		aNodeName = aNode["Name"];
+		parentIndex = aNode["Parent"];
+		k2 = Abs(aNode["Children"]);
+		if (k2)
+		{
+			currentDepth = aNode["Below"];
+			multFactors[aNodeName] = currentDepth;		
+			if (parentIndex > 0)
+			{
+				pInfo = treeAVL2[parentIndex];
+				pInfo ["Below"] = pInfo ["Below"] + currentDepth;
+				treeAVL2[parentIndex] = pInfo;
+			}
+		}
+		else
+		{
+			multFactors[aNodeName] = 1;
+			pInfo = treeAVL2[parentIndex];
+			pInfo ["Below"] = pInfo ["Below"] + 1;
+			treeAVL2[parentIndex] = pInfo;
+		}
+		
+	}
+
+	pKeys 			= Rows(multFactors);
+
+	for (k=0; k<Columns(pKeys); k=k+1)
+	{
+		aNodeName = pKeys[k];
+		multFactors[aNodeName] = multFactors[aNodeName] * (leafCount-multFactors[aNodeName]);
+	}
+
+	divInfo 		=	 computeTotalDivergence (treeName);
+	pInfo 			= 	2*divInfo[0]/leafCount/(leafCount-1);
+	currentDepth	= 	divInfo[1]/(Abs(treeAVL2)-2);
+	
+	fprintf (stdout, "Mean pairwise divergence for ",treeName, " is ", pInfo, 	   "\n");
+	fprintf (stdout, "Mean branch length for ",      treeName, " is ", currentDepth, "\n");
+	return 0;
+}
+	
+/*---------------------------------------------------------*/
+
+function computeTotalDivergence (treeID)
+{
+	ExecuteCommands ("bNames = BranchName   ("+treeID+",-1);");
+	ExecuteCommands ("bLen   = BranchLength ("+treeID+",-1);");
+	
+	sum  = 0;
+	sum2 = 0;
+	
+	for (k=0; k<Columns(bNames); k=k+1)
+	{
+		aNodeName = bNames[k];
+		sum  = sum + bLen[k]*multFactors[aNodeName];
+		sum2 = sum2 + bLen[k];
+	}	
+	return {{sum,sum2}};
+}
diff --git a/res/TemplateBatchFiles/CodonModelCompare.bf b/res/TemplateBatchFiles/CodonModelCompare.bf
new file mode 100644
index 0000000..e24b730
--- /dev/null
+++ b/res/TemplateBatchFiles/CodonModelCompare.bf
@@ -0,0 +1,1046 @@
+/* 
+	This file takes a nucleotide data set and a tree (either from the data file or from a separate 	file) and computes maximum likelihood estimates for every possible 4x4 reversible model on that data and tree.
+
+		We use the string (v1,v2,v3,v4,v5,v6), where and v1..6 = 0..5
+   to encode a 4x4 symmetric transition matrix with entries
+   [*  v1  v2  v3]
+   [-  *   v4  v5]
+   [-  -   *   v6]
+   [-  -   -   * ]
+   
+   		For instance: (010010) encodes HKY85.
+   		
+   		For each model the following information is reported:
+   		- Model string. (e.g. (012345) for the GRM)
+   		- Number of model parameters
+   		- Max ln-likelihood for the model
+   		- Likelihood ratio statistic (as a sub-model of the GRM)
+   		- AIC
+   		- P-Value for the Likelihood Ratio Test.
+   		
+   
+   Sergei L. Kosakovsky Pond, Summer 2002.
+   
+*/ 
+
+function ReceiveJobs (sendOrNot)
+{
+	if (MPI_NODE_COUNT>1)
+	{
+		MPIReceive (-1, fromNode, result_String);
+		jobModelNum = MPINodeState[fromNode-1][1];
+		vv1 = MPINodeState[fromNode-1][2];
+		vv2 = MPINodeState[fromNode-1][3];
+		vv3 = MPINodeState[fromNode-1][4];
+		vv4 = MPINodeState[fromNode-1][5];
+		vv5 = MPINodeState[fromNode-1][6];
+		vv6 = MPINodeState[fromNode-1][7];
+		if (sendOrNot)
+		{
+			MPISend (fromNode,lf);
+			MPINodeState[fromNode-1][1] = modelNum;		
+			MPINodeState[fromNode-1][2] = v1;
+			MPINodeState[fromNode-1][3] = v2;
+			MPINodeState[fromNode-1][4] = v3;
+			MPINodeState[fromNode-1][5] = v4;
+			MPINodeState[fromNode-1][6] = v5;
+			MPINodeState[fromNode-1][7] = v6;
+		}
+		else
+		{
+			MPINodeState[fromNode-1][0] = 0;
+			MPINodeState[fromNode-1][1] = -1;		
+		}
+		
+		ExecuteCommands (result_String);
+	}
+	else
+	{
+		jobModelNum = modelNum;
+	}
+	
+	if (jobModelNum == 0)
+	{
+		stdl = lf_MLES[1][0];
+		fullnp = lf_MLES[1][1]+addOn;
+		fprintf(stdout,"\n(012345) Full Model ln-lik =  ",stdl,". Parameter Count=",Format(fullnp,0,0)," AIC = ", 2*(fullnp-stdl),"\n\n");
+
+
+		resultCache [0][0] = 1;
+		resultCache [0][1] = 2;
+		resultCache [0][2] = 3;
+		resultCache [0][3] = 4;
+		resultCache [0][4] = 5;
+		resultCache [0][5] = lf_MLES[1][0];
+		resultCache [0][6] = lf_MLES[1][1]+addOn;
+		resultCache [0][7] = 0;
+		resultCache [0][8] = 0;
+		
+		fprintf (stdout,"\n#   |  Model   | # prm |    lnL    |      LRT       |    AIC     |   P-Value        |");   
+		fprintf (stdout,"\n----|----------|-------|-----------|----------------|------------|------------------|");   
+
+		if (MPI_NODE_COUNT>1)
+		{
+			for (h=1; h<203; h=h+1)
+			{
+				lnL = resultCache[h][5];
+				
+				if (lnL<0)
+				{
+					np = resultCache[h][6];
+					LRT = -2*(lnL-stdl);
+					if (LRT<0)
+					{
+						LRT = 0;
+					}
+					AIC = -2*lnL+2*np;
+					PRINT_DIGITS = 3;
+					fprintf (stdout,"\n",h);
+					PRINT_DIGITS = 1;
+					fprintf (stdout," | (",0, resultCache[h][0], resultCache[h][1], resultCache[h][2], resultCache[h][3], resultCache[h][4],") | ");
+					fprintf (stdout,Format (np,5,0));
+					PRINT_DIGITS = 8;
+					fprintf (stdout, " |  ",lnL," | ",Format(LRT,14,3), " |  ", AIC, "  |  ", );
+					
+					PRINT_DIGITS = 15;
+					if (LRT==0)
+					{
+						pValue = 1;					
+					}
+					else
+					{
+						pValue = 1-CChi2(LRT,fullnp-np);
+					}
+					fprintf (stdout,pValue," |");
+					resultCache [jobModelNum][7] = pValue;
+					if (pValue<rejectAt)
+					{
+						rejectCount = rejectCount+1;
+						resultCache [jobModelNum][8] = 0;
+					}
+					else
+					{
+						resultCache [jobModelNum][8] = 1;					
+					}
+					
+					if (pValue<rejectAt)
+					{
+						fprintf (stdout,"(*)");
+					}				
+				}
+			}
+		}
+		
+		return fromNode-1;
+	}
+	else
+	{
+		if ((MPI_NODE_COUNT>1)&&(resultCache[0][5]>=0))
+		{
+			resultCache [jobModelNum][0] = vv2;
+			resultCache [jobModelNum][1] = vv3;
+			resultCache [jobModelNum][2] = vv4;
+			resultCache [jobModelNum][3] = vv5;
+			resultCache [jobModelNum][4] = vv6;
+			resultCache [jobModelNum][5] = lf_MLES[1][0];
+			resultCache [jobModelNum][6] = lf_MLES[1][1]+addOn;
+			return fromNode - 1;
+		}
+	}
+
+	np = lf_MLES[1][1]+addOn;
+	lnL = lf_MLES[1][0];
+	LRT = -2*(lnL-stdl);
+	if (LRT<0)
+	{
+		LRT = 0;
+	}
+	AIC = -2*lnL+2*np;
+	PRINT_DIGITS = 3;
+	fprintf (stdout,"\n",jobModelNum);
+	PRINT_DIGITS = 1;
+	fprintf (stdout," | (",vv1,vv2,vv3,vv4,vv5,vv6,") | ");
+	fprintf (stdout,Format (np,5,0));
+	PRINT_DIGITS = 8;
+	fprintf (stdout, " |  ",lnL," | ",Format(LRT,14,3), " |  ", AIC, "  |  ", );
+	
+	
+	PRINT_DIGITS = 15;
+	if (LRT==0)
+	{
+		pValue = 1;					
+	}
+	else
+	{
+		pValue = 1-CChi2(LRT,fullnp-np);
+	}
+	fprintf (stdout,pValue," |");
+	
+	resultCache [jobModelNum][0] = vv2;
+	resultCache [jobModelNum][1] = vv3;
+	resultCache [jobModelNum][2] = vv4;
+	resultCache [jobModelNum][3] = vv5;
+	resultCache [jobModelNum][4] = vv6;
+	resultCache [jobModelNum][5] = lf_MLES[1][0];
+	resultCache [jobModelNum][6] = lf_MLES[1][1]+addOn;
+	resultCache [jobModelNum][7] = pValue;
+	if (pValue<rejectAt)
+	{
+		rejectCount = rejectCount+1;
+		resultCache [jobModelNum][8] = 0;
+	}
+	else
+	{
+		resultCache [jobModelNum][8] = 1;					
+	}
+	
+	if (pValue<rejectAt)
+	{
+		fprintf (stdout,"(*)");
+	}
+			
+	return fromNode-1;
+}
+
+function PopulateModelMatrix (ModelMatrixName&, EFV)
+{
+	if (!ModelMatrixDimension)
+	{
+		ModelMatrixDimension = 64;
+		for (h = 0 ;h<64; h=h+1)
+		{
+			if (_Genetic_Code[h]==10)
+			{
+				ModelMatrixDimension = ModelMatrixDimension-1;
+			}
+		}
+	}
+	
+	ModelMatrixName = {ModelMatrixDimension,ModelMatrixDimension}; 
+
+	hshift = 0;
+
+	if (modelType == 0)
+	{
+		for (h=0; h<64; h=h+1)
+		{
+			if (_Genetic_Code[h]==10) 
+			{
+				hshift = hshift+1;
+				continue; 
+			}
+			vshift = hshift;
+			for (v = h+1; v<64; v=v+1)
+			{
+				diff = v-h;
+				if (_Genetic_Code[v]==10) 
+				{
+					vshift = vshift+1;
+					continue; 
+				}
+				nucPosInCodon = 2;
+			  	if ((h$4==v$4)||((diff%4==0)&&(h$16==v$16))||(diff%16==0))
+			  	{
+			  		if (h$4==v$4)
+			  		{
+			  			transition = v%4;
+			  			transition2= h%4;
+			  		}
+			  		else
+			  		{
+			  			if(diff%16==0)
+			  			{
+			  				transition = v$16;
+			  				transition2= h$16;
+							nucPosInCodon = 0;
+			  			}
+			  			else
+			  			{
+			  				transition = v%16$4;
+			  				transition2= h%16$4;
+							nucPosInCodon = 1;
+			  			}
+			  		}
+			  		
+			  		rateType = mSpecMatrix[transition][transition2];
+			  		
+			  		if (rateType == 1)
+			  		{
+				  		if (_Genetic_Code[0][h]==_Genetic_Code[0][v]) 
+				  		{
+				  			ModelMatrixName[h-hshift][v-vshift] := AC*synRate*EFV__[transition__][nucPosInCodon__];
+				  			ModelMatrixName[v-vshift][h-hshift] := AC*synRate*EFV__[transition2__][nucPosInCodon__];
+					  	}
+				  		else
+				  		{
+					  		ModelMatrixName[h-hshift][v-vshift] := AC*R*synRate*EFV__[transition__][nucPosInCodon__];
+				  			ModelMatrixName[v-vshift][h-hshift] := AC*R*synRate*EFV__[transition2__][nucPosInCodon__];
+			  			}
+			  		}
+			  		else
+			  		{
+				  		if (rateType == 2)
+				  		{
+					  		if (_Genetic_Code[0][h]==_Genetic_Code[0][v]) 
+					  		{
+					  			ModelMatrixName[h-hshift][v-vshift] := synRate*EFV__[transition__][nucPosInCodon__];
+					  			ModelMatrixName[v-vshift][h-hshift] := synRate*EFV__[transition2__][nucPosInCodon__];
+						  	}
+					  		else
+					  		{
+						  		ModelMatrixName[h-hshift][v-vshift] := R*synRate*EFV__[transition__][nucPosInCodon__];
+					  			ModelMatrixName[v-vshift][h-hshift] := R*synRate*EFV__[transition2__][nucPosInCodon__];
+				  			}
+				  		}
+				  		else
+				  		{
+					  		if (rateType == 3)
+					  		{
+						  		if (_Genetic_Code[0][h]==_Genetic_Code[0][v]) 
+						  		{
+						  			ModelMatrixName[h-hshift][v-vshift] := AT*synRate*EFV__[transition__][nucPosInCodon__];
+						  			ModelMatrixName[v-vshift][h-hshift] := AT*synRate*EFV__[transition2__][nucPosInCodon__];
+							  	}
+						  		else
+						  		{
+							  		ModelMatrixName[h-hshift][v-vshift] := AT*R*synRate*EFV__[transition__][nucPosInCodon__];
+						  			ModelMatrixName[v-vshift][h-hshift] := AT*R*synRate*EFV__[transition2__][nucPosInCodon__];
+					  			}
+					  		}
+					  		else
+					  		{
+						  		if (rateType == 4)
+						  		{
+							  		if (_Genetic_Code[0][h]==_Genetic_Code[0][v]) 
+							  		{
+							  			ModelMatrixName[h-hshift][v-vshift] := CG*synRate*EFV__[transition__][nucPosInCodon__];
+							  			ModelMatrixName[v-vshift][h-hshift] := CG*synRate*EFV__[transition2__][nucPosInCodon__];
+								  	}
+							  		else
+							  		{
+								  		ModelMatrixName[h-hshift][v-vshift] := CG*R*synRate*EFV__[transition__][nucPosInCodon__];
+							  			ModelMatrixName[v-vshift][h-hshift] := CG*R*synRate*EFV__[transition2__][nucPosInCodon__];
+						  			}
+						  		}
+						  		else
+						  		{
+							  		if (rateType == 5)
+							  		{
+								  		if (_Genetic_Code[0][h]==_Genetic_Code[0][v]) 
+								  		{
+								  			ModelMatrixName[h-hshift][v-vshift] := CT*synRate*EFV__[transition__][nucPosInCodon__];
+								  			ModelMatrixName[v-vshift][h-hshift] := CT*synRate*EFV__[transition2__][nucPosInCodon__];
+									  	}
+								  		else
+								  		{
+									  		ModelMatrixName[h-hshift][v-vshift] := CT*R*synRate*EFV__[transition__][nucPosInCodon__];
+								  			ModelMatrixName[v-vshift][h-hshift] := CT*R*synRate*EFV__[transition2__][nucPosInCodon__];
+							  			}
+							  		}
+							  		else
+							  		{
+								  		if (_Genetic_Code[0][h]==_Genetic_Code[0][v]) 
+								  		{
+								  			ModelMatrixName[h-hshift][v-vshift] := GT*synRate*EFV__[transition__][nucPosInCodon__];
+								  			ModelMatrixName[v-vshift][h-hshift] := GT*synRate*EFV__[transition2__][nucPosInCodon__];
+									  	}
+								  		else
+								  		{
+									  		ModelMatrixName[h-hshift][v-vshift] := GT*R*synRate*EFV__[transition__][nucPosInCodon__];
+								  			ModelMatrixName[v-vshift][h-hshift] := GT*R*synRate*EFV__[transition2__][nucPosInCodon__];
+							  			}
+							  		}
+							  	}
+						  	}
+					  	}
+				  	}
+			  	}
+			}
+		}	
+	}
+	else
+	{
+		for (h=0; h<64; h=h+1)
+		{
+			if (_Genetic_Code[h]==10) 
+			{
+				hshift = hshift+1;
+				continue; 
+			}
+			vshift = hshift;
+			for (v = h+1; v<64; v=v+1)
+			{
+				diff = v-h;
+				if (_Genetic_Code[v]==10) 
+				{
+					vshift = vshift+1;
+					continue; 
+				}
+				nucPosInCodon = 2;
+			  	if ((h$4==v$4)||((diff%4==0)&&(h$16==v$16))||(diff%16==0))
+			  	{
+			  		if (h$4==v$4)
+			  		{
+			  			transition = v%4;
+			  			transition2= h%4;
+			  		}
+			  		else
+			  		{
+			  			if(diff%16==0)
+			  			{
+			  				transition = v$16;
+			  				transition2= h$16;
+							nucPosInCodon = 0;
+			  			}
+			  			else
+			  			{
+			  				transition = v%16$4;
+			  				transition2= h%16$4;
+							nucPosInCodon = 1;
+			  			}
+			  		}
+			  		
+			  		rateType = mSpecMatrix[transition][transition2];
+			  		
+					if (rateType == 1)
+			  		{
+				  		if (_Genetic_Code[0][h]==_Genetic_Code[0][v]) 
+				  		{
+				  			ModelMatrixName[h-hshift][v-vshift] := c*AC*synRate*EFV__[transition__][nucPosInCodon__];
+				  			ModelMatrixName[v-vshift][h-hshift] := c*AC*synRate*EFV__[transition2__][nucPosInCodon__];
+					  	}
+				  		else
+				  		{
+					  		ModelMatrixName[h-hshift][v-vshift] := c*AC*R*synRate*EFV__[transition__][nucPosInCodon__];
+				  			ModelMatrixName[v-vshift][h-hshift] := c*AC*R*synRate*EFV__[transition2__][nucPosInCodon__];
+			  			}
+			  		}
+			  		else
+			  		{
+				  		if (rateType == 2)
+				  		{
+					  		if (_Genetic_Code[0][h]==_Genetic_Code[0][v]) 
+					  		{
+					  			ModelMatrixName[h-hshift][v-vshift] := c*synRate*EFV__[transition__][nucPosInCodon__];
+					  			ModelMatrixName[v-vshift][h-hshift] := c*synRate*EFV__[transition2__][nucPosInCodon__];
+						  	}
+					  		else
+					  		{
+						  		ModelMatrixName[h-hshift][v-vshift] := c*R*synRate*EFV__[transition__][nucPosInCodon__];
+					  			ModelMatrixName[v-vshift][h-hshift] := c*R*synRate*EFV__[transition2__][nucPosInCodon__];
+				  			}
+				  		}
+				  		else
+				  		{
+					  		if (rateType == 3)
+					  		{
+						  		if (_Genetic_Code[0][h]==_Genetic_Code[0][v]) 
+						  		{
+						  			ModelMatrixName[h-hshift][v-vshift] := c*AT*synRate*EFV__[transition__][nucPosInCodon__];
+						  			ModelMatrixName[v-vshift][h-hshift] := c*AT*synRate*EFV__[transition2__][nucPosInCodon__];
+							  	}
+						  		else
+						  		{
+							  		ModelMatrixName[h-hshift][v-vshift] := c*AT*R*synRate*EFV__[transition__][nucPosInCodon__];
+						  			ModelMatrixName[v-vshift][h-hshift] := c*AT*R*synRate*EFV__[transition2__][nucPosInCodon__];
+					  			}
+					  		}
+					  		else
+					  		{
+						  		if (rateType == 4)
+						  		{
+							  		if (_Genetic_Code[0][h]==_Genetic_Code[0][v]) 
+							  		{
+							  			ModelMatrixName[h-hshift][v-vshift] := c*CG*synRate*EFV__[transition__][nucPosInCodon__];
+							  			ModelMatrixName[v-vshift][h-hshift] := c*CG*synRate*EFV__[transition2__][nucPosInCodon__];
+								  	}
+							  		else
+							  		{
+								  		ModelMatrixName[h-hshift][v-vshift] := c*CG*R*synRate*EFV__[transition__][nucPosInCodon__];
+							  			ModelMatrixName[v-vshift][h-hshift] := c*CG*R*synRate*EFV__[transition2__][nucPosInCodon__];
+						  			}
+						  		}
+						  		else
+						  		{
+							  		if (rateType == 5)
+							  		{
+								  		if (_Genetic_Code[0][h]==_Genetic_Code[0][v]) 
+								  		{
+								  			ModelMatrixName[h-hshift][v-vshift] := c*CT*synRate*EFV__[transition__][nucPosInCodon__];
+								  			ModelMatrixName[v-vshift][h-hshift] := c*CT*synRate*EFV__[transition2__][nucPosInCodon__];
+									  	}
+								  		else
+								  		{
+									  		ModelMatrixName[h-hshift][v-vshift] := c*CT*R*synRate*EFV__[transition__][nucPosInCodon__];
+								  			ModelMatrixName[v-vshift][h-hshift] := c*CT*R*synRate*EFV__[transition2__][nucPosInCodon__];
+							  			}
+							  		}
+							  		else
+							  		{
+								  		if (_Genetic_Code[0][h]==_Genetic_Code[0][v]) 
+								  		{
+								  			ModelMatrixName[h-hshift][v-vshift] := c*GT*synRate*EFV__[transition__][nucPosInCodon__];
+								  			ModelMatrixName[v-vshift][h-hshift] := c*GT*synRate*EFV__[transition2__][nucPosInCodon__];
+									  	}
+								  		else
+								  		{
+									  		ModelMatrixName[h-hshift][v-vshift] := c*GT*R*synRate*EFV__[transition__][nucPosInCodon__];
+								  			ModelMatrixName[v-vshift][h-hshift] := c*GT*R*synRate*EFV__[transition2__][nucPosInCodon__];
+							  			}
+							  		}
+							  	}
+						  	}
+					  	}
+				  	}				  	
+				  }
+			}
+		}	
+	}	
+	return 0;
+}
+
+
+function BuildCodonFrequencies (obsF)
+{
+	PIStop = 1.0;
+	result = {ModelMatrixDimension,1};
+	hshift = 0;
+
+	for (h=0; h<64; h=h+1)
+	{
+		first = h$16;
+		second = h%16$4;
+		third = h%4;
+		if (_Genetic_Code[h]==10) 
+		{
+			hshift = hshift+1;
+			PIStop = PIStop-obsF[first][0]*obsF[second][1]*obsF[third][2];
+			continue; 
+		}
+		result[h-hshift][0]=obsF[first][0]*obsF[second][1]*obsF[third][2];
+	}
+	return result*(1.0/PIStop);
+}
+
+function  setElement (h,v,cc)
+{	
+	mSpecMatrix[h][v]=cc+1;
+	mSpecMatrix[v][h]=cc+1;
+	return 1;
+}
+
+
+function printModelMatrix (modelString)
+{
+	
+	mstrConv = "1";
+	for (v2 = 1; v2 < 6; v2 = v2+1)
+	{
+		if (modelString[v2]=="0")
+		{
+			mstrConv = mstrConv+"1";
+		}
+		else
+		{
+			if (modelString[v2]=="1")
+			{
+				mstrConv = mstrConv+"B";
+			}
+			else
+			{
+				if (modelString[v2]=="2")
+				{
+					mstrConv = mstrConv+"C";
+				}
+				else
+				{
+					if (modelString[v2]=="3")
+					{
+						mstrConv = mstrConv+"D";
+					}
+					else
+					{
+						if (modelString[v2]=="4")
+						{
+							mstrConv = mstrConv+"E";
+						}
+						else
+						{
+							mstrConv = mstrConv+"F";
+						}
+					}
+				}
+			}
+		}
+	}
+	sep = "+---+-----+-----+-----+-----+\n";
+	fprintf (stdout, sep,
+					 "|   |  A  |  C  |  G  |  T  |\n",
+					 sep,
+					 "| A |  *  | ", mstrConv[0], "*t | ", mstrConv[1], "*t | ", mstrConv[2], "*t |\n",
+					 sep,
+					 "| C | ", mstrConv[0], "*t |  *  | ", mstrConv[3], "*t | ", mstrConv[4], "*t |\n",
+					 sep,
+					 "| G | ", mstrConv[1], "*t | " , mstrConv[3], "*t |  *  | ", mstrConv[5], "*t |\n",
+					 sep,
+					 "| T | ", mstrConv[2], "*t | " , mstrConv[4], "*t | ", mstrConv[5], "*t |  *  |\n",
+					 sep, "\nt = synRate for synonymous substitutions, and t=R*synRate for non-synonumous ones.\n");
+						 
+	return 1;
+}
+
+#include 				   "TemplateModels/chooseGeneticCode.def";
+SetDialogPrompt 		   ("Please specify a codon data file:");
+
+DataSet 				   ds 			= ReadDataFile (PROMPT_FOR_FILE);
+DataSetFilter 			   filteredData = CreateFilter (ds,3,"","",GeneticCodeExclusions);
+
+fprintf 				   (stdout,"\n______________READ THE FOLLOWING DATA______________\n",ds);
+
+
+HarvestFrequencies         (observedFreq,filteredData,3,1,1);
+
+mSpecMatrix 			   = {{*,1,1,1}{1,*,1,1}{1,1,*,1}{1,1,1,*}};
+ModelMatrixDimension       = 0;
+
+_DO_TREE_REBALANCE_ = 1;
+
+#include "queryTree.bf";
+#include "TemplateModels/modelParameters5.mdl";
+
+if (modelType > 0)
+{
+	#include "TemplateModels/defineGamma.mdl";
+}
+
+ChoiceList (branchLengths,"Estimate Branch Lengths",1,SKIP_NONE,
+			"Every Time","Branch lengths are reestimated for every model.",
+			"Once","Branch lenghts obtained from the nucleotide GTR model and reused for subsequent models."
+	       );
+
+if (branchLengths<0)
+{
+	return;
+}
+
+rejectAt = 0;
+
+while ((rejectAt<=0)||(rejectAt>=1))
+{
+	fprintf (stdout, "\nModel rejection level (e.g. 0.05):");
+	fscanf  (stdin,"Number", rejectAt);
+}
+
+SetDialogPrompt ("Save results to:"); 
+ 
+fprintf (PROMPT_FOR_FILE, CLEAR_FILE); 
+BASE_PATH = LAST_FILE_PATH; 
+
+KEEP_OPTIMAL_ORDER = 1;
+MESSAGE_LOGGING = 0;
+
+global AC=1;
+global AT=1;
+global CG=1;
+global CT=1;
+global GT=1;
+global R=1;
+
+
+r = setElement (0,2,1);
+r = setElement (0,3,2);
+r = setElement (1,2,3);
+r = setElement (1,3,4);
+r = setElement (2,3,5);
+
+MG94custom = 0;
+MULTIPLY_BY_FREQS     = PopulateModelMatrix ("MG94custom", observedFreq);
+vectorOfFrequencies   = BuildCodonFrequencies (observedFreq);
+Model MG94customModel = (MG94custom,vectorOfFrequencies,0);
+
+USE_POSITION_SPECIFIC_FREQS = 1;
+Tree tr = treeString;
+
+addOn = 0;
+
+if (branchLengths)
+{
+	global TreeScaler = 1;
+	GTRMatrix = {{*,AC*nt,nt,AT*nt}{AC*nt,*,CG*nt,CT*nt}{nt,CG*nt,*,GT*nt}{AT*nt,CT*nt,GT*nt,*}};
+	DataSetFilter 	nucFilter = CreateFilter (filteredData,1);
+	HarvestFrequencies         (nucFreq,nucFilter,1,1,1);
+	Model GTRModel = (GTRMatrix,nucFreq,1);
+	givenTreeString = Format (tr,0,0);
+	Tree nucTree = givenTreeString;
+	LikelihoodFunction lfn = (nucFilter, nucTree);
+	Optimize (nres,lfn);
+	ReplicateConstraint ("this1.?.synRate:=this2.?.nt__/TreeScaler",tr,nucTree);
+	addOn = nres[1][1]-nres[1][2]-1;
+}
+
+LikelihoodFunction lf = (filteredData, tr);
+
+resultCache = {203,9};
+
+modelNum	= 0;
+rejectCount = 0;
+
+if (MPI_NODE_COUNT>1)
+{
+	MPINodeState = {MPI_NODE_COUNT-1,8};
+	OPTIMIZE_SUMMATION_ORDER = 0;
+	MPISend (1,lf);
+	MPINodeState[0][0] = 1;
+	MPINodeState[0][1] = modelNum;
+}
+else
+{
+	Optimize (lf_MLES,lf);
+	vv1 = 0;
+	vv2 = 0;
+	vv3 = 0;
+	vv4 = 0;
+	vv5 = 0;
+	vv6 = 0;
+	dummy = ReceiveJobs (0);
+}
+
+rateBiasTerms = {{"AC","1","AT","CG","CT","GT"}};
+
+for (v2=0; v2<=1; v2=v2+1)
+{
+	for (v3=0; v3<=v2+1; v3=v3+1)
+	{
+		if (v3>v2)
+		{
+			ub4 = v3;
+		}
+		else
+		{
+			ub4 = v2;
+		}
+		for (v4=0; v4<=ub4+1; v4=v4+1)
+		{
+			if (v4>=ub4)
+			{
+				ub5 = v4;
+			}
+			else
+			{
+				ub5 = ub4;
+			}
+			for (v5=0; v5<=ub5+1; v5=v5+1)
+			{
+				if (v5>ub5)
+				{
+					ub6 = v5;
+				}
+				else
+				{
+					ub6 = ub5;
+				}
+				for (v6=0; v6<=ub6+1; v6=v6+1)
+				{
+					if (v6==5)
+					{
+						break;
+					}
+
+					R = 1;
+
+					paramCount	  = 0;
+
+					modelDesc = "0"+Format(v2,1,0);
+					modelDesc = modelDesc+Format(v3,1,0);
+					modelDesc = modelDesc+Format(v4,1,0);
+					modelDesc = modelDesc+Format(v5,1,0);
+					modelDesc = modelDesc+Format(v6,1,0);
+					
+					modelConstraintString = "";
+					
+					AC = 1;
+					AT = 1;
+					CG = 1;
+					CT = 1;
+					GT = 1;
+
+					for (customLoopCounter2=1; customLoopCounter2<6; customLoopCounter2=customLoopCounter2+1)
+					{
+						for (customLoopCounter=0; customLoopCounter<customLoopCounter2; customLoopCounter=customLoopCounter+1)
+						{
+							if (modelDesc[customLoopCounter2]==modelDesc[customLoopCounter])
+							{
+								if (rateBiasTerms[customLoopCounter2] == "1")
+								{
+									modelConstraintString = modelConstraintString + rateBiasTerms[customLoopCounter]+":="+rateBiasTerms[customLoopCounter2]+";";
+								}
+								else
+								{
+									modelConstraintString = modelConstraintString + rateBiasTerms[customLoopCounter2]+":="+rateBiasTerms[customLoopCounter]+";";			
+								}
+								break;
+							}
+						}
+					}	
+
+					if (Abs(modelConstraintString))
+					{
+						ExecuteCommands (modelConstraintString);
+					}					
+										
+
+					modelNum = modelNum+1;
+					if (MPI_NODE_COUNT>1)
+					{
+						for (mpiNode = 0; mpiNode < MPI_NODE_COUNT-1; mpiNode = mpiNode+1)
+						{
+							if (MPINodeState[mpiNode][0]==0)
+							{
+								break;	
+							}
+						}
+						
+						if (mpiNode==MPI_NODE_COUNT-1)
+						/* all nodes busy */
+						{
+							mpiNode = ReceiveJobs (1);
+						}
+						else
+						{
+							MPISend (mpiNode+1,lf);
+							MPINodeState[mpiNode][0] = 1;
+							MPINodeState[mpiNode][1] = modelNum;
+							MPINodeState[mpiNode][2] = v1;
+							MPINodeState[mpiNode][3] = v2;
+							MPINodeState[mpiNode][4] = v3;
+							MPINodeState[mpiNode][5] = v4;
+							MPINodeState[mpiNode][6] = v5;
+							MPINodeState[mpiNode][7] = v6;
+						}
+					}
+					else
+					{
+						Optimize (lf_MLES,lf);
+						vv1 = v1;
+						vv2 = v2;
+						vv3 = v3;
+						vv4 = v4;
+						vv5 = v5;
+						vv6 = v6;
+						dummy = ReceiveJobs (0);
+					}
+				}
+			}
+		}
+	}
+
+}
+
+if (MPI_NODE_COUNT>1)
+{
+	while (1)
+	{
+		for (nodeCounter = 0; nodeCounter < MPI_NODE_COUNT-1; nodeCounter = nodeCounter+1)
+		{
+			if (MPINodeState[nodeCounter][0]==1)
+			{
+				fromNode = ReceiveJobs (0);
+				break;	
+			}
+		}
+		if (nodeCounter == MPI_NODE_COUNT-1)
+		{
+			break;
+		}
+	}	
+	OPTIMIZE_SUMMATION_ORDER = 1;
+}
+
+function checkEmbedding (_m1, _m2)
+{
+	for (r=0; r<6; r=r+1)
+	{
+		if (_m2[r]<_m1[r])
+		{
+			/*fprintf (stdout,_m1," ", _m2, " Reject 1 at position ",r,"\n");*/
+			return 0;
+		}
+		if (_m2[r]>_m1[r])
+		{
+			for (r2 = 0; r2 < 6; r2 = r2+1)
+			{
+				if ((_m2[r2]==_m2[r])&&(_m1[r2]!=_m1[r]))
+				{
+					/*fprintf (stdout,_m1," ", _m2, " Reject 2 at positions ",r,r2,"\n");*/
+					return 0;
+				}
+			}
+		}
+	}
+	return 1;
+}
+
+PRINT_DIGITS = 0;
+
+fprintf (stdout, "\n\n--------------------------\n   (*) => p-Value < ", rejectAt, "\nRejected ", rejectCount, " models.\n");
+
+
+if (rejectCount<202)
+{
+
+	fprintf (stdout, "\nPerforming nested tests on the remaining models...\n");
+
+	done = 0;
+	while (!done)
+	{
+		done = 1;
+		for (v2=1; v2<203; v2=v2+1)
+		{
+			if (resultCache[v2][8])
+			{
+				modelString = "0";
+				for (v3 = 0; v3<5; v3=v3+1)
+				{
+					modelString = modelString + resultCache [v2][v3];
+				}
+				for (v3 = v2+1; v3<203; v3 = v3+1)
+				{
+					if (resultCache[v3][8])
+					{
+						modelString2 = "0";
+						for (v4 = 0; v4<5; v4=v4+1)
+						{
+							modelString2 = modelString2 + resultCache [v3][v4];
+						}	
+						if (checkEmbedding (modelString, modelString2))
+						{
+							fprintf (stdout,"H: (", modelString,") A: (", modelString2, "). ");
+							done = 0;
+							LRT = 2*(resultCache[v3][5]-resultCache[v2][5]);
+							npd = resultCache[v3][6]-resultCache[v2][6];
+							if (LRT<0)
+							{
+								pValue = 1;
+							}
+							else
+							{
+								pValue = 1-CChi2(LRT,npd);
+							}
+							fprintf (stdout," P-Value=", Format (pValue,10,3));
+							if (pValue<rejectAt)
+							{
+								fprintf (stdout,". Rejected H.\n");
+								resultCache[v2][8] = 0;
+								break;
+							}
+							else
+							{
+								fprintf (stdout,". Failed to reject H. Discarding A.\n");
+								resultCache[v3][8] = 0;
+							}
+						}
+					}
+				}
+			}
+		}
+	}
+
+	fprintf (stdout,"\n\nRemaining models:\n\n#   |  Model   | # prm |    lnL    |      LRT       |    AIC     |   P-Value        |");   
+	fprintf (stdout,"\n----|----------|-------|-----------|----------------|------------|------------------|"); 
+	fprintf (BASE_PATH,"\n\nRemaining models:\n\n#   |  Model   | # prm |    lnL    |      LRT       |    AIC     |   P-Value        |");   
+	fprintf (BASE_PATH,"\n----|----------|-------|-----------|----------------|------------|------------------|"); 
+	
+	modelNum = 0;  
+	v5 = 1e10;
+	v4 = 0;
+
+	for (v2=1; v2<203; v2=v2+1)
+	{
+		if (resultCache[v2][8])
+		{
+			modelNum = 0;
+			modelString = "0";
+			for (v3 = 0; v3<5; v3=v3+1)
+			{
+				modelString = modelString + resultCache [v2][v3];
+			}
+			np  = resultCache[v2][6];
+			lnL = resultCache[v2][5];
+			LRT = -2*(lnL-stdl);
+			if (LRT<0)
+			{
+				LRT = 0;
+			}
+			AIC = -2*lnL+2*np;
+			modelNum = modelNum + 1;
+			PRINT_DIGITS = 3;
+			fprintf (stdout,"\n",v2);
+			fprintf (BASE_PATH,"\n",v2);
+			PRINT_DIGITS = 1;
+			fprintf (stdout," | (",0,resultCache[v2][0],resultCache[v2][1],resultCache[v2][2],resultCache[v2][3],resultCache[v2][4],") | ");
+			fprintf (stdout,Format (np,5,0));
+			fprintf (BASE_PATH," | (",0,resultCache[v2][0],resultCache[v2][1],resultCache[v2][2],resultCache[v2][3],resultCache[v2][4],") | ");
+			fprintf (BASE_PATH,Format (np,5,0));
+			PRINT_DIGITS = 8;
+			fprintf (stdout, " |  ",lnL," | ",Format(LRT,14,3), " |  ", AIC, "  |  ", );
+			fprintf (BASE_PATH, " |  ",lnL," | ",Format(LRT,14,3), " |  ", AIC, "  |  ", );
+			PRINT_DIGITS = 15;
+			if (LRT==0)
+			{
+				pValue = 1;					
+			}
+			else
+			{
+				pValue = 1-CChi2(LRT,fullnp-np);
+			}
+			if (AIC<v5)
+			{
+				v5 = AIC;
+				v4 = v2;
+			}
+			fprintf (stdout,pValue," |");
+			fprintf (BASE_PATH,pValue," |");
+			
+		}
+	}
+	
+	PRINT_DIGITS = 0;
+	modelString = "0";
+	for (v3 = 0; v3<5; v3=v3+1)
+	{
+		modelString = modelString + Format(resultCache [v4][v3],0,0);
+	}
+	
+	fprintf (stdout, "\n\nAIC based winner: (", modelString, ") with AIC = ", v5, "\n\n");
+	fprintf (BASE_PATH, "\n\nAIC based winner: (", modelString, ") with AIC = ", v5, "\n\n");
+	
+	dummy = printModelMatrix (modelString);
+	
+	modelString2 = "";
+	if (modelString == "000000")
+	{
+		modelString2 = "F81";
+	}
+	if (modelString == "010010")
+	{
+		modelString2 = "HKY85";
+	}
+	if (modelString == "010020")
+	{
+		modelString2 = "TrN";
+	}
+	if (Abs(modelString2))
+	{
+		fprintf (stdout, "\nThis model is better known as:", modelString2, "\n");
+		fprintf (BASE_PATH, "\nThis model is better known as:", modelString2, "\n");
+	}
+
+}
+else
+{
+	fprintf (stdout, "\nGeneral Reversible Model is the winner!\n");
+	fprintf (BASE_PATH, "\nGeneral Reversible Model is the winner!\n");
+}
+
+
+
diff --git a/res/TemplateBatchFiles/CodonToProtein.bf b/res/TemplateBatchFiles/CodonToProtein.bf
new file mode 100644
index 0000000..8fbb59d
--- /dev/null
+++ b/res/TemplateBatchFiles/CodonToProtein.bf
@@ -0,0 +1,181 @@
+function 	  setUpCodonToAA (dataSetID)
+{
+	codonToAAMap = {};
+	codeToAA 	 = "FLIMVSPTAYXHQNKDECWRG";
+	
+	nucChars = "ACGT";
+	
+	for (p1=0; p1<64; p1=p1+1)
+	{
+		codon = nucChars[p1$16]+nucChars[p1%16$4]+nucChars[p1%4];
+		ccode = _Genetic_Code[p1];
+		codonToAAMap[codon] = codeToAA[ccode];
+	}
+	
+	codonToAAMap["---"] = "-";
+	
+	ExecuteCommands ("DataSetFilter _converterfilteredData 	= CreateFilter	("+dataSetID+",1);");
+	ExecuteCommands ("DataSetFilter _converterfilteredDataC 	= CreateFilter	("+dataSetID+",3);");
+	GetInformation (theSequences,_converterfilteredData);
+	GetDataInfo    (siteToPatternMap,_converterfilteredDataC);
+	return 0;
+}
+
+/*--------------------------------------------------------------------------------------------*/
+
+function 	  doTheMapping (dummy)
+{
+	outSequences = "";
+	outSequences *  (bigDataSet.sites* bigDataSet.species);
+	
+	freqCount = {};
+	
+	for (seqCounter = 0; seqCounter < bigDataSet.species; seqCounter = seqCounter+1)
+	{
+		
+		aSeq = theSequences[seqCounter];
+		seqLen = Abs(aSeq)-2;
+		GetString (seqName, _converterfilteredData, seqCounter);
+		translString = "";
+		translString * (seqLen/3+1);
+		for (seqPos = 0; seqPos < seqLen; seqPos = seqPos+3)
+		{
+			codon = aSeq[seqPos][seqPos+2];
+			
+			gap_count = codon$"[N-]";
+			if (gap_count[0] >= 0)
+			{	
+				/* handle cases where codon contains one or two gap characters - this was yielding 'F' in original script */
+				prot = "?";
+			}
+			else
+			{
+				prot = codonToAAMap[codon];
+				if (Abs(prot) == 0)
+				{
+					/* 
+						see if we can map this presumed ambiguitiy to a single 
+						amino-acid
+					*/
+					GetDataInfo 			(mappedToCodon, _converterfilteredDataC, seqCounter, siteToPatternMap[seqPos$3]);
+					resolutionMapping 	  = {21,1};
+					for (resID = 0; resID < 64; resID = resID + 1)
+					{
+						if (mappedToCodon[resID])
+						{
+							resolutionMapping[_Genetic_Code[resID]] = 1;
+						}
+					}
+					
+					if ((+resolutionMapping) == 1)
+					{
+						prot = codeToAA[((Transpose(resolutionMapping))["_MATRIX_ELEMENT_COLUMN_"])[0]];
+					}
+					else
+					{
+						prot = "?";
+					}
+					
+					codonToAAMap[codon] = prot; 
+				}
+			}
+			freqCount[codon] = freqCount[codon]+1;
+			translString * prot;
+		} 
+		translString * 0;
+		stopPos = translString||"X";
+		if (stopPos[0]>=0)
+		{
+			stopCount = Rows(stopPos)$2;
+			fprintf (stdout, "Warning: sequence ", seqName, " has ", stopCount, " stop codons.\n");  
+		}	
+		outSequences * (">" + seqName + "\n" + translString + "\n");
+	}
+	
+	outSequences * 0;
+	return outSequences;
+}
+
+/*--------------------------------------------------------------------------------------------*/
+
+if (_runAsFunctionLibrary != 1)
+{
+	LoadFunctionLibrary ("chooseGeneticCode.def");
+	
+	SetDialogPrompt ("Please choose a data file to convert:");
+	
+	ChoiceList (SKIP_OMISSIONS,"Deletions",1,SKIP_NONE,"Keep Deletions","Deletions will NOT be filtered from the data.",
+							   "Skip Deletions","Deletions will be pruned out and NOT included in the converted file.");
+	
+	if (SKIP_OMISSIONS<0)
+	{
+		fprintf (stdout, "\n\nExecution Canceled...");
+		return 0;
+	}
+	
+	havePartitions = 0;
+	
+	DataSet        bigDataSet 		= ReadDataFile 	(PROMPT_FOR_FILE);
+	_pCount = Rows(NEXUS_FILE_TREE_MATRIX);
+	if (_pCount == Columns(DATA_FILE_PARTITION_MATRIX) && Columns(DATA_FILE_PARTITION_MATRIX) && _pCount > 1)
+	{
+		_runAsFunctionLibrary   = 1;
+		ExecuteAFile			("_MFReader_.ibf");
+		readNEXUS_partitionInfo (0);
+		_runAsFunctionLibrary   = 0;
+		havePartitions 			= 1;
+	}
+
+	setUpCodonToAA ("bigDataSet");
+	
+	
+	fprintf (stdout, "Read ", bigDataSet.species, " sequences with ", bigDataSet.sites, " sites.");
+	fprintf (stdout, "\nRead:\n", bigDataSet);
+	
+	outSequences = doTheMapping (0);
+	 
+	sht 		 = IS_TREE_PRESENT_IN_DATA;
+	sdt 		 = DATAFILE_TREE;
+	
+	DataSet        bigDataSet 				= ReadFromString   (outSequences);
+	DataSetFilter  _converterfilteredData 	= CreateFilter	   (bigDataSet,1);
+	
+	DEFAULT_FILE_SAVE_NAME = LAST_FILE_PATH;
+	stopPos = DEFAULT_FILE_SAVE_NAME $ (DIRECTORY_SEPARATOR+"([^\\"+DIRECTORY_SEPARATOR+"]+)$");
+	if (stopPos [0] >= 0)
+	{
+		stopPos = stopPos[2];
+		DEFAULT_FILE_SAVE_NAME = DEFAULT_FILE_SAVE_NAME[stopPos][Abs(DEFAULT_FILE_SAVE_NAME)] + ".prot";
+	}
+	
+	if (havePartitions)
+	{
+		DATA_FILE_PRINT_FORMAT  = 6;
+		IS_TREE_PRESENT_IN_DATA = 0;
+		DATAFILE_TREE			= 0;	
+	}
+	else
+	{
+		IS_TREE_PRESENT_IN_DATA = sht;
+		DATAFILE_TREE 			= sdt;
+	}
+	
+	
+	SetDialogPrompt ("Save translated file to:");
+	fprintf (PROMPT_FOR_FILE, CLEAR_FILE, _converterfilteredData);
+	
+	if (havePartitions && Abs (myTrees) == _pCount && Abs (splitCoordinates) == _pCount)
+	{
+		fprintf (LAST_FILE_PATH, "\nBEGIN TREES;");
+		for (k=0; k<_pCount; k=k+1)
+		{
+			fprintf (LAST_FILE_PATH, "\n\tTree T_", k+1, " = ", myTrees[k], ";");
+		}
+		fprintf (LAST_FILE_PATH, "\nEND TREES;\nBEGIN ASSUMPTIONS;\n");
+		for (k=0; k<_pCount; k=k+1)
+		{
+			fprintf (LAST_FILE_PATH, "\n\tCHARSET P_", k+1, " = ", 1+(splitCoordinates[k])[0]$3, "-", 1+(splitCoordinates[k])[1]$3, ";");
+		}
+		fprintf (LAST_FILE_PATH, "\nEND ASSUMPTIONS;\n");
+	}
+}
diff --git a/res/TemplateBatchFiles/CodonUsageBias.bf b/res/TemplateBatchFiles/CodonUsageBias.bf
new file mode 100644
index 0000000..1149a9a
--- /dev/null
+++ b/res/TemplateBatchFiles/CodonUsageBias.bf
@@ -0,0 +1,571 @@
+#include   "TemplateModels/chooseGeneticCode.def";
+
+/*___________________________________________________________________________________________________________*/
+
+function PadString (padLength,padChar)
+{
+	for (padCounter=0;padCounter<padLength;padCounter=padCounter+1)
+	{
+		fprintf (stdout,padChar);
+	}
+	return padLength;
+}
+
+/*___________________________________________________________________________________________________________*/
+
+function	PrintASCIITable (dataMatrix, titleMatrix)
+{
+	columnWidths = {1,Columns(titleMatrix)};
+	for (counter1=0; counter1<Columns(titleMatrix); counter1 = counter1+1)
+	{
+		counter2 = Abs (titleMatrix[0][counter1])+2;
+		if (counter2<12)
+		{
+			counter2 = 12;
+		}
+		columnWidths[0][counter1] = counter2;
+	}
+	fprintf (stdout, "\n");
+	for (counter2 = 0; counter2 < Columns (titleMatrix); counter2 = counter2+1)
+	{
+		fprintf (stdout,"+-");
+		dummy = PadString (columnWidths[0][counter2],"-");
+		fprintf (stdout,"-");
+	}
+	fprintf (stdout,"+\n| ");
+	
+	for (counter1=0; counter1<Columns(titleMatrix); counter1 = counter1+1)
+	{
+		fprintf (stdout, titleMatrix[counter1]);
+		dummy = PadString (columnWidths[0][counter1]-Abs(titleMatrix[counter1])," ");
+		fprintf (stdout, " | ");
+	}
+	
+	fprintf (stdout, "\n");
+	
+	for (counter1=-1; counter1<Rows(dataMatrix); counter1 = counter1 + 1)
+	{
+		if (counter1>=0)
+		{
+			fprintf (stdout,"| ");
+			fprintf (stdout,Format(counter1+1,columnWidths[0][0],0));
+			for (counter2 = 1; counter2 < Columns (titleMatrix); counter2 = counter2+1)
+			{
+				fprintf (stdout," | ");
+				fprintf (stdout,Format(dataMatrix[counter1][counter2-1],columnWidths[0][counter2],-1));
+			}
+			fprintf (stdout," ");
+			fprintf (stdout, "|\n");
+		}
+		for (counter2 = 0; counter2 < Columns (titleMatrix); counter2 = counter2+1)
+		{
+			fprintf (stdout,"+-");
+			dummy = PadString (columnWidths[0][counter2],"-");
+			fprintf (stdout,"-");
+		}
+		fprintf (stdout, "+\n");
+	}
+	
+	return 1;
+}
+
+
+/*---------------------------------------------------------------------------*/
+
+function BuildCodonFrequencies (obsF)
+{
+	if (!ModelMatrixDimension)
+	{
+		ModelMatrixDimension = 64;
+		for (h = 0 ;h<64; h=h+1)
+		{
+			if (_Genetic_Code[h]==10)
+			{
+				ModelMatrixDimension = ModelMatrixDimension-1;
+			}
+		}
+	}
+
+	PIStop = 1.0;
+	result = {ModelMatrixDimension,1};
+	hshift = 0;
+
+	for (h=0; h<64; h=h+1)
+	{
+		first = h$16;
+		second = h%16$4;
+		third = h%4;
+		if (_Genetic_Code[h]==10) 
+		{
+			hshift = hshift+1;
+			PIStop = PIStop-obsF[first][0]*obsF[second][1]*obsF[third][2];
+			continue; 
+		}
+		result[h-hshift][0]=obsF[first][0]*obsF[second][1]*obsF[third][2];
+	}
+	return result*(1.0/PIStop);
+}
+
+/*---------------------------------------------------------------------------*/
+
+global	P1_1 = 1/4;
+global  P1_2 = 1/3;
+global  P1_3 = 1/2;
+
+P1_1:<1;
+P1_2:<1;
+P1_3:<1;
+
+global	F1_A := P1_1;
+global	F1_C := (1-P1_1)*P1_2;
+global  F1_G := (1-P1_1)*(1-P1_2)*P1_3;
+global  F1_T := (1-P1_1)*(1-P1_2)*(1-P1_3);
+
+
+global	P2_1 = 1/4;
+global  P2_2 = 1/3;
+global  P2_3 = 1/2;
+
+P2_1:<1;
+P2_2:<1;
+P2_3:<1;
+
+global	F2_A := P2_1;
+global	F2_C := (1-P2_1)*P2_2;
+global  F2_G := (1-P2_1)*(1-P2_2)*P2_3;
+global  F2_T := (1-P2_1)*(1-P2_2)*(1-P2_3);
+
+
+global	P3_1 = 1/4;
+global  P3_2 = 1/3;
+global  P3_3 = 1/2;
+
+P3_1:<1;
+P3_2:<1;
+P3_3:<1;
+
+global	F3_A := P3_1;
+global	F3_C := (1-P3_1)*P3_2;
+global  F3_G := (1-P3_1)*(1-P3_2)*P3_3;
+global  F3_T := (1-P3_1)*(1-P3_2)*(1-P3_3);
+
+nucCharacters = "ACGT";
+
+
+/*---------------------------------------------------------------------------*/
+
+function BuildCodonFrequenciesEst (freqNames)
+{
+	if (!ModelMatrixDimension)
+	{
+		ModelMatrixDimension = 64;
+		for (h = 0 ;h<64; h=h+1)
+		{
+			if (_Genetic_Code[h]==10)
+			{
+				ModelMatrixDimension = ModelMatrixDimension-1;
+			}
+		}
+	}
+
+	result = {ModelMatrixDimension,1};
+	
+	/* first pass to find the normalizing factor */
+	
+	constraintString = "1";
+	
+	
+	for (h=0; h<64; h=h+1)
+	{
+		if (_Genetic_Code[h]==10) 
+		{
+			first = h$16;
+			second = h%16$4;
+			third = h%4;
+			{
+				constraintString = constraintString + "-F1_" + nucCharacters[first] + "*F2_" + nucCharacters[second] + "*F3_" + nucCharacters[third];
+			}
+		}
+	}
+	
+	hshift = 0;
+	
+	ExecuteCommands ("global F_NORM:="+constraintString+";");
+	
+	dummy=constraintString*1024; 
+	dummy=constraintString*(freqNames+"={"+ModelMatrixDimension+",1};");
+
+	for (h=0; h<64; h=h+1)
+	{
+		if (_Genetic_Code[h]==10) 
+		{
+			hshift = hshift+1;
+		}
+		else
+		{
+			first = h$16;
+			second = h%16$4;
+			third = h%4;
+			dummy = constraintString*(freqNames + "[" +(h-hshift)+ "]:=(F1_" + nucCharacters[first] + "*F2_" + nucCharacters[second] + "*F3_" + nucCharacters[third] + ")/F_NORM;\n");
+		}
+	}
+	dummy=constraintString*0; 
+	ExecuteCommands (constraintString);
+	constraintString = 0;
+	return 0;
+}
+
+/*---------------------------------------------------------------------------*/
+
+global AC 	= 1;
+global AT 	= 1;
+global CG 	= 1;
+global CT 	= 1;
+global GT 	= 1;
+global dNdS = 1;		
+
+NucleotideMatrix	 = {{*,AC*t,t,AT*t}{AC*t,*,CG*t,CT*t}{t,CG*t,*,GT*t}{AT*t,CT*t,GT*t,*}};
+
+SetDialogPrompt ("Please specify a codon data file:");
+
+DataSet 	  ds 		= ReadDataFile (PROMPT_FOR_FILE);
+DataSetFilter filteredData = CreateFilter (ds,3,"","",GeneticCodeExclusions);
+
+
+ChoiceList (modelChoice, "Model Options",1,SKIP_NONE,
+			"Default","Use MG94xHKY85.",
+			"Custom", "Use any reversible nucleotide model crossed with MG94.");
+			
+if (modelChoice < 0)
+{
+	return;
+}
+
+modelDesc = "";
+
+if (modelChoice)
+{
+	done = 0;
+	while (!done)
+	{
+		fprintf (stdout,"\nPlease enter a 6 character model designation (e.g:010010 defines HKY85):");
+		fscanf  (stdin,"String", modelDesc);
+		if (Abs(modelDesc)==6)
+		{	
+			done = 1;
+		}
+	}			
+}
+else
+{
+	modelDesc = "010010";
+}
+
+ModelTitle = ""+modelDesc[0];
+			
+rateBiasTerms = {{"AC","1","AT","CG","CT","GT"}};
+paramCount	  = 0;
+
+modelConstraintString = "";
+
+for (customLoopCounter2=1; customLoopCounter2<6; customLoopCounter2=customLoopCounter2+1)
+{
+	for (customLoopCounter=0; customLoopCounter<customLoopCounter2; customLoopCounter=customLoopCounter+1)
+	{
+		if (modelDesc[customLoopCounter2]==modelDesc[customLoopCounter])
+		{
+			ModelTitle  = ModelTitle+modelDesc[customLoopCounter2];	
+			if (rateBiasTerms[customLoopCounter2] == "1")
+			{
+				modelConstraintString = modelConstraintString + rateBiasTerms[customLoopCounter]+":="+rateBiasTerms[customLoopCounter2]+";";
+			}
+			else
+			{
+				modelConstraintString = modelConstraintString + rateBiasTerms[customLoopCounter2]+":="+rateBiasTerms[customLoopCounter]+";";			
+			}
+			break;
+		}
+	}
+	if (customLoopCounter==customLoopCounter2)
+	{
+		ModelTitle = ModelTitle+modelDesc[customLoopCounter2];	
+	}
+}	
+
+if (Abs(modelConstraintString))
+{
+	ExecuteCommands (modelConstraintString);
+}
+
+
+HarvestFrequencies (positionFrequencies, ds,3,1,1);
+
+codonFrequencies = BuildCodonFrequencies(positionFrequencies);
+
+#include	 "queryTree.bf";
+
+CodonMatrix    = {ModelMatrixDimension,ModelMatrixDimension};
+CodonMatrixEst = {ModelMatrixDimension,ModelMatrixDimension};
+
+constraintString="";
+dummy=constraintString*65536; 
+
+global alpha_s  = 1;     
+alpha_s         :>0.01; 
+alpha_s         :<100;
+ 
+category S = (4, EQUAL, MEAN, GammaDist(_x_,alpha_s,alpha_s),  	/* density */
+							  CGammaDist(_x_,alpha_s,alpha_s), 	/* CDF */
+							  0,1e25, 						   	/* support */
+							  CGammaDist(_x_,alpha_s+1,alpha_s) /* E[alpha_s * x] - conditional mean */
+			 );
+
+
+global alpha_ns  = 1;     
+alpha_ns         :>0.01; 
+alpha_ns         :<100;
+ 
+category NS = (4, EQUAL, MEAN, GammaDist(_x_,alpha_ns,alpha_ns),  	/* density */
+							  CGammaDist(_x_,alpha_ns,alpha_ns), 	/* CDF */
+							  0,1e25, 						   	/* support */
+							  CGammaDist(_x_,alpha_ns+1,alpha_ns) /* E[alpha_ns * x] - conditional mean */
+			 );
+
+
+hshift = 0;
+
+for (h=0; h<64; h=h+1)
+{
+	if (_Genetic_Code[h]==10) 
+	{
+		hshift = hshift+1;
+		continue; 
+	}
+	vshift = hshift;
+	for (v = h+1; v<64; v=v+1)
+	{
+		diff = v-h;
+		if (_Genetic_Code[v]==10) 
+		{
+			vshift = vshift+1;
+			continue; 
+		}
+		nucPosInCodon = 2;
+		if ((h$4==v$4)||((diff%4==0)&&(h$16==v$16))||(diff%16==0))
+		{
+			if (h$4==v$4)
+			{
+				transition = v%4;
+				transition2= h%4;
+			}
+			else
+			{
+				if(diff%16==0)
+				{
+					transition = v$16;
+					transition2= h$16;
+					nucPosInCodon = 0;
+				}
+				else
+				{
+					transition = v%16$4;
+					transition2= h%16$4;
+					nucPosInCodon = 1;
+				}
+			}
+			if (transition<transition2)
+			{
+				trSM = transition;
+				trLG = transition2;
+			}
+			else
+			{
+				trSM = transition2;
+				trLG = transition;
+			}
+			
+			if (trSM==0)
+			{
+				if (trLG==1)
+				{
+					if (_Genetic_Code[0][h]==_Genetic_Code[0][v]) 
+					{
+						CodonMatrix[h-hshift][v-vshift] := AC*S*synRate*positionFrequencies__[transition__][nucPosInCodon__];
+						CodonMatrix[v-vshift][h-hshift] := AC*S*synRate*positionFrequencies__[transition2__][nucPosInCodon__];
+						dummy = constraintString*("CodonMatrixEst["+(h-hshift)+"]["+(v-vshift)+"]:=AC*S*synRate*F"+(nucPosInCodon+1)+"_"+nucCharacters[transition]+";");
+						dummy = constraintString*("CodonMatrixEst["+(v-vshift)+"]["+(h-hshift)+"]:=AC*S*synRate*F"+(nucPosInCodon+1)+"_"+nucCharacters[transition2]+";");						
+					}
+					else
+					{
+						CodonMatrix[h-hshift][v-vshift] := AC*dNdS*NS*synRate*positionFrequencies__[transition__][nucPosInCodon__];
+						CodonMatrix[v-vshift][h-hshift] := AC*dNdS*NS*synRate*positionFrequencies__[transition2__][nucPosInCodon__];
+						dummy = constraintString*("CodonMatrixEst["+(h-hshift)+"]["+(v-vshift)+"]:=AC*dNdS*NS*synRate*F"+(nucPosInCodon+1)+"_"+nucCharacters[transition]+";");
+						dummy = constraintString*("CodonMatrixEst["+(v-vshift)+"]["+(h-hshift)+"]:=AC*dNdS*NS*synRate*F"+(nucPosInCodon+1)+"_"+nucCharacters[transition2]+";");						
+					}
+				}
+				else
+				{
+					if (trLG==2)
+					{
+						if (_Genetic_Code[0][h]==_Genetic_Code[0][v]) 
+						{
+							CodonMatrix[h-hshift][v-vshift] := S*synRate*positionFrequencies__[transition__][nucPosInCodon__];
+							CodonMatrix[v-vshift][h-hshift] := S*synRate*positionFrequencies__[transition2__][nucPosInCodon__];
+							dummy = constraintString*("CodonMatrixEst["+(h-hshift)+"]["+(v-vshift)+"]:=S*synRate*F"+(nucPosInCodon+1)+"_"+nucCharacters[transition]+";");
+							dummy = constraintString*("CodonMatrixEst["+(v-vshift)+"]["+(h-hshift)+"]:=S*synRate*F"+(nucPosInCodon+1)+"_"+nucCharacters[transition2]+";");						
+						}
+						else
+						{
+							CodonMatrix[h-hshift][v-vshift] := dNdS*NS*synRate*positionFrequencies__[transition__][nucPosInCodon__];
+							CodonMatrix[v-vshift][h-hshift] := dNdS*NS*synRate*positionFrequencies__[transition2__][nucPosInCodon__];
+							dummy = constraintString*("CodonMatrixEst["+(h-hshift)+"]["+(v-vshift)+"]:=dNdS*NS*synRate*F"+(nucPosInCodon+1)+"_"+nucCharacters[transition]+";");
+							dummy = constraintString*("CodonMatrixEst["+(v-vshift)+"]["+(h-hshift)+"]:=dNdS*NS*synRate*F"+(nucPosInCodon+1)+"_"+nucCharacters[transition2]+";");						
+						}							
+					}
+					else
+					{
+						if (_Genetic_Code[0][h]==_Genetic_Code[0][v]) 
+						{
+							CodonMatrix[h-hshift][v-vshift] := S*AT*synRate*positionFrequencies__[transition__][nucPosInCodon__];
+							CodonMatrix[v-vshift][h-hshift] := S*AT*synRate*positionFrequencies__[transition2__][nucPosInCodon__];
+							dummy = constraintString*("CodonMatrixEst["+(h-hshift)+"]["+(v-vshift)+"]:=S*AT*synRate*F"+(nucPosInCodon+1)+"_"+nucCharacters[transition]+";");
+							dummy = constraintString*("CodonMatrixEst["+(v-vshift)+"]["+(h-hshift)+"]:=S*AT*synRate*F"+(nucPosInCodon+1)+"_"+nucCharacters[transition2]+";");						
+						}
+						else
+						{
+							CodonMatrix[h-hshift][v-vshift] := AT*dNdS*NS*synRate*positionFrequencies__[transition__][nucPosInCodon__];
+							CodonMatrix[v-vshift][h-hshift] := AT*dNdS*NS*synRate*positionFrequencies__[transition2__][nucPosInCodon__];
+							dummy = constraintString*("CodonMatrixEst["+(h-hshift)+"]["+(v-vshift)+"]:=AT*dNdS*NS*synRate*F"+(nucPosInCodon+1)+"_"+nucCharacters[transition]+";");
+							dummy = constraintString*("CodonMatrixEst["+(v-vshift)+"]["+(h-hshift)+"]:=AT*dNdS*NS*synRate*F"+(nucPosInCodon+1)+"_"+nucCharacters[transition2]+";");						
+						}							
+					}
+				}
+			}
+			else
+			{
+				if (trSM==1)
+				{
+					if (trLG==2)
+					{
+						if (_Genetic_Code[0][h]==_Genetic_Code[0][v]) 
+						{
+							CodonMatrix[h-hshift][v-vshift] := S*CG*synRate*positionFrequencies__[transition__][nucPosInCodon__];
+							CodonMatrix[v-vshift][h-hshift] := S*CG*synRate*positionFrequencies__[transition2__][nucPosInCodon__];
+							dummy = constraintString*("CodonMatrixEst["+(h-hshift)+"]["+(v-vshift)+"]:=S*CG*synRate*F"+(nucPosInCodon+1)+"_"+nucCharacters[transition]+";");
+							dummy = constraintString*("CodonMatrixEst["+(v-vshift)+"]["+(h-hshift)+"]:=S*CG*synRate*F"+(nucPosInCodon+1)+"_"+nucCharacters[transition2]+";");						
+						}
+						else
+						{
+							CodonMatrix[h-hshift][v-vshift] := CG*dNdS*NS*synRate*positionFrequencies__[transition__][nucPosInCodon__];
+							CodonMatrix[v-vshift][h-hshift] := CG*dNdS*NS*synRate*positionFrequencies__[transition2__][nucPosInCodon__];
+							dummy = constraintString*("CodonMatrixEst["+(h-hshift)+"]["+(v-vshift)+"]:=CG*dNdS*NS*synRate*F"+(nucPosInCodon+1)+"_"+nucCharacters[transition]+";");
+							dummy = constraintString*("CodonMatrixEst["+(v-vshift)+"]["+(h-hshift)+"]:=CG*dNdS*NS*synRate*F"+(nucPosInCodon+1)+"_"+nucCharacters[transition2]+";");						
+						}
+					}
+					else
+					{
+						if (_Genetic_Code[0][h]==_Genetic_Code[0][v]) 
+						{
+							CodonMatrix[h-hshift][v-vshift] := S*CT*synRate*positionFrequencies__[transition__][nucPosInCodon__];
+							CodonMatrix[v-vshift][h-hshift] := S*CT*synRate*positionFrequencies__[transition2__][nucPosInCodon__];
+							dummy = constraintString*("CodonMatrixEst["+(h-hshift)+"]["+(v-vshift)+"]:=S*CT*synRate*F"+(nucPosInCodon+1)+"_"+nucCharacters[transition]+";");
+							dummy = constraintString*("CodonMatrixEst["+(v-vshift)+"]["+(h-hshift)+"]:=S*CT*synRate*F"+(nucPosInCodon+1)+"_"+nucCharacters[transition2]+";");						
+						}
+						else
+						{
+							CodonMatrix[h-hshift][v-vshift] := CT*dNdS*NS*synRate*positionFrequencies__[transition__][nucPosInCodon__];
+							CodonMatrix[v-vshift][h-hshift] := CT*dNdS*NS*synRate*positionFrequencies__[transition2__][nucPosInCodon__];
+							dummy = constraintString*("CodonMatrixEst["+(h-hshift)+"]["+(v-vshift)+"]:=CT*dNdS*NS*synRate*F"+(nucPosInCodon+1)+"_"+nucCharacters[transition]+";");
+							dummy = constraintString*("CodonMatrixEst["+(v-vshift)+"]["+(h-hshift)+"]:=CT*dNdS*NS*synRate*F"+(nucPosInCodon+1)+"_"+nucCharacters[transition2]+";");						
+						}							
+					}
+				}
+				else
+				{
+					if (_Genetic_Code[0][h]==_Genetic_Code[0][v]) 
+					{
+						CodonMatrix[h-hshift][v-vshift] := S*GT*synRate*positionFrequencies__[transition__][nucPosInCodon__];
+						CodonMatrix[v-vshift][h-hshift] := S*GT*synRate*positionFrequencies__[transition2__][nucPosInCodon__];
+						dummy = constraintString*("CodonMatrixEst["+(h-hshift)+"]["+(v-vshift)+"]:=S*GT*synRate*F"+(nucPosInCodon+1)+"_"+nucCharacters[transition]+";");
+						dummy = constraintString*("CodonMatrixEst["+(v-vshift)+"]["+(h-hshift)+"]:=S*GT*synRate*F"+(nucPosInCodon+1)+"_"+nucCharacters[transition2]+";");						
+					}
+					else
+					{
+						CodonMatrix[h-hshift][v-vshift] := GT*dNdS*NS*synRate*positionFrequencies__[transition__][nucPosInCodon__];
+						CodonMatrix[v-vshift][h-hshift] := GT*dNdS*NS*synRate*positionFrequencies__[transition2__][nucPosInCodon__];
+						dummy = constraintString*("CodonMatrixEst["+(h-hshift)+"]["+(v-vshift)+"]:=GT*dNdS*NS*synRate*F"+(nucPosInCodon+1)+"_"+nucCharacters[transition]+";");
+						dummy = constraintString*("CodonMatrixEst["+(v-vshift)+"]["+(h-hshift)+"]:=GT*dNdS*NS*synRate*F"+(nucPosInCodon+1)+"_"+nucCharacters[transition2]+";");						
+					}							
+				}
+			}
+		}
+   }
+}		
+
+dummy = constraintString*0;
+ExecuteCommands (constraintString);
+constraintString = 0;
+
+Model MGModelObs   = (CodonMatrix,codonFrequencies,0);
+Tree	obsTree	   = treeString;
+
+dummy 			   = BuildCodonFrequenciesEst("codonFrequenciesEst");
+Model MGModelEst   = (CodonMatrixEst,codonFrequenciesEst,0);
+Tree	estTree	   = treeString;
+
+ReplicateConstraint ("this1.?.synRate:=this2.?.synRate",estTree,obsTree);
+
+global			  MP = .5;
+MP:<1;
+
+LikelihoodFunction lf = (filteredData,obsTree,filteredData,estTree,"Log(MP*SITE_LIKELIHOOD[0]+(1-MP)*SITE_LIKELIHOOD[1])");
+Optimize (res,lf);
+
+fprintf (stdout, "\n", lf, "\n");
+
+labelMatrix = {{"Position","A","C","G","T"}};
+
+
+fprintf (stdout,"\n\nObserved nucleotide frequency estimates\n\n");
+dummy = PrintASCIITable (Transpose(positionFrequencies),labelMatrix);
+
+estFreqs = {{F1_A,F1_C,F1_G,F1_T}{F2_A,F2_C,F2_G,F2_T}{F3_A,F3_C,F3_G,F3_T}};
+
+fprintf (stdout,"\nEstimated nucleotide frequency estimates (Prop=",1-MP,")\n\n");
+dummy = PrintASCIITable (estFreqs,labelMatrix);
+
+assignments = {filteredData.sites,2};
+
+ConstructCategoryMatrix (marginals,lf,COMPLETE);
+
+idx2 = filteredData.sites;
+
+for (idx=0; idx<filteredData.sites; idx=idx+1)
+{
+	PrObs = MP*marginals[idx];
+	PrEst = (1-MP)*marginals[idx2];
+	
+	assignments [idx][0] = PrObs/(PrObs+PrEst);
+	assignments [idx][1] = PrEst/(PrObs+PrEst);
+	
+	idx2 = idx2 + 1;
+}
+
+labelMatrix = {{"Observed Frequencies","Estimated Frequencies"}};
+specString  = labelMatrix[0]+";"+labelMatrix[1];
+
+OpenWindow    (CHARTWINDOW,{{"Model Posteriors"}
+						   {"labelMatrix"},
+						   {"assignments"},
+						   {"Stacked Bars"},
+						   {"Index"},
+						   {specString},
+						   {"Codon"},
+						   {""},
+						   {"Model Posterior"},
+						   {"3"}},
+						   "(SCREEN_WIDTH-30);(SCREEN_HEIGHT-50);10;30");
+
+
+
+
diff --git a/res/TemplateBatchFiles/CompareSelectivePressure.bf b/res/TemplateBatchFiles/CompareSelectivePressure.bf
new file mode 100644
index 0000000..0a5fd61
--- /dev/null
+++ b/res/TemplateBatchFiles/CompareSelectivePressure.bf
@@ -0,0 +1,937 @@
+SHORT_MPI_RETURN=1;
+
+/*------------------------------------------------------------------------*/
+
+function BuildCodonFrequencies (obsF)
+{
+	if (!ModelMatrixDimension)
+	{
+		ModelMatrixDimension = 64;
+		for (h = 0 ;h<64; h=h+1)
+		{
+			if (_Genetic_Code[h]==10)
+			{
+				ModelMatrixDimension = ModelMatrixDimension-1;
+			}
+		}
+	}
+
+	PIStop = 1.0;
+	result = {ModelMatrixDimension,1};
+	hshift = 0;
+
+	for (h=0; h<64; h=h+1)
+	{
+		first = h$16;
+		second = h%16$4;
+		third = h%4;
+		if (_Genetic_Code[h]==10) 
+		{
+			hshift = hshift+1;
+			PIStop = PIStop-obsF[first][0]*obsF[second][1]*obsF[third][2];
+			continue; 
+		}
+		result[h-hshift][0]=obsF[first][0]*obsF[second][1]*obsF[third][2];
+	}
+	return result*(1.0/PIStop);
+}
+
+/*------------------------------------------------------------------------*/
+
+function MakeModelConstraints (dummy)
+{
+	modelConstraintString = "";
+
+	for (customLoopCounter2=1; customLoopCounter2<6; customLoopCounter2=customLoopCounter2+1)
+	{
+		for (customLoopCounter=0; customLoopCounter<customLoopCounter2; customLoopCounter=customLoopCounter+1)
+		{
+			if (modelDesc[customLoopCounter2]==modelDesc[customLoopCounter])
+			{
+				ModelTitle  = ModelTitle+modelDesc[customLoopCounter2];	
+				if (rateBiasTerms[customLoopCounter2] == "1")
+				{
+					modelConstraintString = modelConstraintString + rateBiasTerms[customLoopCounter]+":="+rateBiasTerms[customLoopCounter2]+";";
+				}
+				else
+				{
+					modelConstraintString = modelConstraintString + rateBiasTerms[customLoopCounter2]+":="+rateBiasTerms[customLoopCounter]+";";			
+				}
+				break;
+			}
+		}
+		if (customLoopCounter==customLoopCounter2)
+		{
+			ModelTitle = ModelTitle+modelDesc[customLoopCounter2];	
+		}
+	}
+	return 0;
+}	
+
+
+/*------------------------------------------------------------------------*/
+
+function ReportSite2 (siteI, siteM)
+{
+	fullSites[siteI][0] = doneSites[siteM][0];
+	fullSites[siteI][1] = doneSites[siteM][1];
+	fullSites[siteI][2] = doneSites[siteM][2];
+	fullSites[siteI][3] = doneSites[siteM][3];
+	fullSites[siteI][4] = doneSites[siteM][1]/doneSites[siteM][0];
+	fullSites[siteI][5] = doneSites[siteM][3]/doneSites[siteM][2];
+	fullSites[siteI][6] = doneSites[siteM][4];
+	fullSites[siteI][7] = doneSites[siteM][5];
+	fullSites[siteI][8] = doneSites[siteM][6];
+	fullSites[siteI][9] = doneSites[siteM][7];
+	fullSites[siteI][10]= doneSites[siteM][8];
+
+
+	fprintf (stdout, "| Codon: ", 		Format(siteI+1,4,0),
+					 "| Sample 1 (dS,dN,dN/dS): ", 		
+					 					Format(fullSites[siteI][0],6,2),
+					 					Format(fullSites[siteI][1],6,2),
+					 					Format(fullSites[siteI][4],8,2),
+					 "| Sample 2 (dS,dN,dN/dS): ", 		
+					 					Format(fullSites[siteI][2],6,2),
+					 					Format(fullSites[siteI][3],6,2),
+					 					Format(fullSites[siteI][5],8,2),
+					 					
+					 "| LRT: ",			Format(fullSites[siteI][9],7,2),
+					 "| p: ",			Format(fullSites[siteI][10],5,2), "\n");		
+
+	return 0;
+}
+
+
+/*------------------------------------------------------------------------*/
+
+function ReceiveJobs2 (sendOrNot, nullAlt)
+{
+	MPIReceive (-1, fromNode, result_String);
+	
+	siteIndex = MPINodeState[fromNode-1][1];
+	siteNA	  = MPINodeState[fromNode-1][2];
+	
+	if (sendOrNot)
+	{
+		MPISend (fromNode,siteLikelihood);
+		MPINodeState[fromNode-1][1] = siteCount;			
+		MPINodeState[fromNode-1][2] = nullAlt;			
+	}
+	else
+	{
+		MPINodeState[fromNode-1][0] = 0;
+		MPINodeState[fromNode-1][1] = -1;		
+	}
+	
+	siteMap = siteIndex;
+	
+	/*fprintf ("../dump",CLEAR_FILE,result_String);*/
+		
+	ExecuteCommands (result_String);
+	
+	sRateV = siteLikelihood_MLE_VALUES["sRate"];
+	dNdSV = siteLikelihood_MLE_VALUES["dNdS"];
+	sRate_2V = siteLikelihood_MLE_VALUES["sRate_2"];
+	dNdS_2V = siteLikelihood_MLE_VALUES["dNdS_2"];
+
+	if (siteNA)
+	{
+		doneSites[siteMap][0] = sRateV;
+		doneSites[siteMap][1] = dNdSV;
+		doneSites[siteMap][2] = sRate_2V;
+		doneSites[siteMap][3] = dNdS_2V;
+		doneSites[siteMap][7] = doneSites[siteMap][7]+2*siteLikelihood_MLES[1][0];
+	}
+	else
+	{
+		doneSites[siteMap][4] = sRateV;
+		doneSites[siteMap][5] = sRate_2V;
+		doneSites[siteMap][6] = dNdSV;
+		doneSites[siteMap][7] = doneSites[siteMap][7]-2*siteLikelihood_MLES[1][0];	
+	}
+
+	if (doneSites[siteMap][8] == 0)
+	{
+		doneSites[siteMap][8] = -1;
+	}
+	else
+	{
+		if (doneSites[siteMap][8] == (-1))
+		{
+			doneSites[siteMap][8] = 1-CChi2(doneSites[siteMap][7],1);						
+			dummy = ReportSite2 (siteIndex, siteMap);
+		}
+	}
+	
+	return fromNode-1;
+}
+
+/*------------------------------------------------------------------------*/
+
+#include   "TemplateModels/chooseGeneticCode.def";
+
+
+global AC 	= 1;
+global AT 	= 1;
+global CG 	= 1;
+global CT 	= 1;
+global GT 	= 1;
+global dNdS = 1;		
+
+global AC_2 	= 1;
+global AT_2 	= 1;
+global CG_2 	= 1;
+global CT_2 	= 1;
+global GT_2 	= 1;
+global dNdS_2   = 1;		
+
+
+NucleotideMatrix	 = {{*,AC*t,t,AT*t}{AC*t,*,CG*t,CT*t}{t,CG*t,*,GT*t}{AT*t,CT*t,GT*t,*}};
+NucleotideMatrix_2	 = {{*,AC_2*t,t,AT_2*t}{AC_2*t,*,CG_2*t,CT_2*t}{t,CG_2*t,*,GT_2*t}{AT_2*t,CT_2*t,GT_2*t,*}};
+
+SetDialogPrompt ("Please specify the first codon data file:");
+
+DataSet 	  ds 		= ReadDataFile (PROMPT_FOR_FILE);
+DataSetFilter filteredData = CreateFilter (ds,3,"","",GeneticCodeExclusions);
+DataSetFilter nucData 	= CreateFilter (filteredData,1);
+HarvestFrequencies (overallFrequencies,  nucData,1,1,0);
+HarvestFrequencies (positionFrequencies, nucData,3,1,1);
+codonFrequencies = BuildCodonFrequencies(positionFrequencies);
+
+#include	 "queryTree.bf";
+treeString_1 = ""+givenTree;
+
+SetDialogPrompt ("Please specify the second codon data file:");
+
+DataSet 	  ds_2		= ReadDataFile (PROMPT_FOR_FILE);
+DataSetFilter filteredData_2 = CreateFilter (ds_2,3,"","",GeneticCodeExclusions);
+DataSetFilter nucData_2 	= CreateFilter (filteredData_2,1);
+HarvestFrequencies (overallFrequencies_2,  nucData_2,1,1,0);
+HarvestFrequencies (positionFrequencies_2, nucData_2,3,1,1);
+codonFrequencies_2 = BuildCodonFrequencies(positionFrequencies_2);
+
+if (filteredData.sites != filteredData_2.sites)
+{
+	fprintf (stdout, "\n\nBoth data sets must have the same number of sites.\n\n");
+	return 0;
+}
+
+#include	 "queryTree.bf";
+treeString_2 = ""+givenTree;
+
+ChoiceList (modelChoice, "Model Options",1,SKIP_NONE,
+			"Default","Use HKY85 and MG94xHKY85.",
+			"Custom", "Use any reversible nucleotide model crossed with MG94.");
+			
+if (modelChoice < 0)
+{
+	return;
+}
+
+modelDesc = "";
+
+if (modelChoice)
+{
+	done = 0;
+	while (!done)
+	{
+		fprintf (stdout,"\nPlease enter a 6 character model designation for the first data set(e.g:010010 defines HKY85):");
+		fscanf  (stdin,"String", modelDesc);
+		if (Abs(modelDesc)==6)
+		{	
+			done = 1;
+		}
+	}			
+
+	done = 0;
+	while (!done)
+	{
+		fprintf (stdout,"\nPlease enter a 6 character model designation for the second data set(e.g:010010 defines HKY85):");
+		fscanf  (stdin,"String", modelDesc2);
+		if (Abs(modelDesc2)==6)
+		{	
+			done = 1;
+		}
+	}			
+}
+else
+{
+	modelDesc  = "010010";
+	modelDesc2 = "010010";
+}
+
+ModelTitle = ""+modelDesc[0];
+rateBiasTerms = {{"AC","1","AT","CG","CT","GT"}};
+paramCount	  = 0;
+
+dummy = MakeModelConstraints (0);
+
+if (Abs(modelConstraintString))
+{
+	ExecuteCommands (modelConstraintString);
+}
+
+modelDesc = modelDesc2;
+rateBiasTerms = {{"AC_2","1","AT_2","CG_2","CT_2","GT_2"}};
+paramCount	  = 0;
+
+dummy = MakeModelConstraints (0);
+
+if (Abs(modelConstraintString))
+{
+	ExecuteCommands (modelConstraintString);
+}
+
+Model NucModel	    = (NucleotideMatrix, overallFrequencies, 1);
+Tree  givenTree 	= treeString_1;
+
+LikelihoodFunction 	nucLF = (nucData,givenTree);
+Optimize (res, nucLF);
+
+fprintf (stdout, "\nNucleotide fit for the first data set\n\n",nucLF,"\n\n");
+
+Model NucModel_2 	= (NucleotideMatrix_2, overallFrequencies_2, 1);
+Tree  givenTree_2 	= treeString_2;
+
+LikelihoodFunction 	nucLF_2 = (nucData_2,givenTree_2);
+Optimize (res_2, nucLF_2);
+
+fprintf (stdout, "\nNucleotide fit for the second data set\n\n",nucLF_2,"\n\n");
+				
+CodonMatrix = {ModelMatrixDimension,ModelMatrixDimension};
+
+hshift = 0;
+
+for (h=0; h<64; h=h+1)
+{
+	if (_Genetic_Code[h]==10) 
+	{
+		hshift = hshift+1;
+		continue; 
+	}
+	vshift = hshift;
+	for (v = h+1; v<64; v=v+1)
+	{
+		diff = v-h;
+		if (_Genetic_Code[v]==10) 
+		{
+			vshift = vshift+1;
+			continue; 
+		}
+		nucPosInCodon = 2;
+		if ((h$4==v$4)||((diff%4==0)&&(h$16==v$16))||(diff%16==0))
+		{
+			if (h$4==v$4)
+			{
+				transition = v%4;
+				transition2= h%4;
+			}
+			else
+			{
+				if(diff%16==0)
+				{
+					transition = v$16;
+					transition2= h$16;
+					nucPosInCodon = 0;
+				}
+				else
+				{
+					transition = v%16$4;
+					transition2= h%16$4;
+					nucPosInCodon = 1;
+				}
+			}
+			if (transition<transition2)
+			{
+				trSM = transition;
+				trLG = transition2;
+			}
+			else
+			{
+				trSM = transition2;
+				trLG = transition;
+			}
+			
+			if (trSM==0)
+			{
+				if (trLG==1)
+				{
+					if (_Genetic_Code[0][h]==_Genetic_Code[0][v]) 
+					{
+						CodonMatrix[h-hshift][v-vshift] := AC__*synRate*positionFrequencies__[transition__][nucPosInCodon__];
+						CodonMatrix[v-vshift][h-hshift] := AC__*synRate*positionFrequencies__[transition2__][nucPosInCodon__];
+					}
+					else
+					{
+						CodonMatrix[h-hshift][v-vshift] := AC__*nonSynRate*positionFrequencies__[transition__][nucPosInCodon__];
+						CodonMatrix[v-vshift][h-hshift] := AC__*nonSynRate*positionFrequencies__[transition2__][nucPosInCodon__];
+					}
+				}
+				else
+				{
+					if (trLG==2)
+					{
+						if (_Genetic_Code[0][h]==_Genetic_Code[0][v]) 
+						{
+							CodonMatrix[h-hshift][v-vshift] := synRate*positionFrequencies__[transition__][nucPosInCodon__];
+							CodonMatrix[v-vshift][h-hshift] := synRate*positionFrequencies__[transition2__][nucPosInCodon__];
+						}
+						else
+						{
+							CodonMatrix[h-hshift][v-vshift] := nonSynRate*positionFrequencies__[transition__][nucPosInCodon__];
+							CodonMatrix[v-vshift][h-hshift] := nonSynRate*positionFrequencies__[transition2__][nucPosInCodon__];
+						}							
+					}
+					else
+					{
+						if (_Genetic_Code[0][h]==_Genetic_Code[0][v]) 
+						{
+							CodonMatrix[h-hshift][v-vshift] := AT__*synRate*positionFrequencies__[transition__][nucPosInCodon__];
+							CodonMatrix[v-vshift][h-hshift] := AT__*synRate*positionFrequencies__[transition2__][nucPosInCodon__];
+						}
+						else
+						{
+							CodonMatrix[h-hshift][v-vshift] := AT__*nonSynRate*positionFrequencies__[transition__][nucPosInCodon__];
+							CodonMatrix[v-vshift][h-hshift] := AT__*nonSynRate*positionFrequencies__[transition2__][nucPosInCodon__];
+						}							
+					}
+				}
+			}
+			else
+			{
+				if (trSM==1)
+				{
+					if (trLG==2)
+					{
+						if (_Genetic_Code[0][h]==_Genetic_Code[0][v]) 
+						{
+							CodonMatrix[h-hshift][v-vshift] := CG__*synRate*positionFrequencies__[transition__][nucPosInCodon__];
+							CodonMatrix[v-vshift][h-hshift] := CG__*synRate*positionFrequencies__[transition2__][nucPosInCodon__];
+						}
+						else
+						{
+							CodonMatrix[h-hshift][v-vshift] := CG__*nonSynRate*positionFrequencies__[transition__][nucPosInCodon__];
+							CodonMatrix[v-vshift][h-hshift] := CG__*nonSynRate*positionFrequencies__[transition2__][nucPosInCodon__];
+						}
+					}
+					else
+					{
+						if (_Genetic_Code[0][h]==_Genetic_Code[0][v]) 
+						{
+							CodonMatrix[h-hshift][v-vshift] := CT__*synRate*positionFrequencies__[transition__][nucPosInCodon__];
+							CodonMatrix[v-vshift][h-hshift] := CT__*synRate*positionFrequencies__[transition2__][nucPosInCodon__];
+						}
+						else
+						{
+							CodonMatrix[h-hshift][v-vshift] := CT__*nonSynRate*positionFrequencies__[transition__][nucPosInCodon__];
+							CodonMatrix[v-vshift][h-hshift] := CT__*nonSynRate*positionFrequencies__[transition2__][nucPosInCodon__];
+						}							
+					}
+				}
+				else
+				{
+					if (_Genetic_Code[0][h]==_Genetic_Code[0][v]) 
+					{
+						CodonMatrix[h-hshift][v-vshift] := GT__*synRate*positionFrequencies__[transition__][nucPosInCodon__];
+						CodonMatrix[v-vshift][h-hshift] := GT__*synRate*positionFrequencies__[transition2__][nucPosInCodon__];
+					}
+					else
+					{
+						CodonMatrix[h-hshift][v-vshift] := GT__*nonSynRate*positionFrequencies__[transition__][nucPosInCodon__];
+						CodonMatrix[v-vshift][h-hshift] := GT__*nonSynRate*positionFrequencies__[transition2__][nucPosInCodon__];
+					}							
+				}
+			}
+		}
+   }
+}		
+
+CodonMatrix_2 = {ModelMatrixDimension,ModelMatrixDimension};
+
+hshift = 0;
+
+for (h=0; h<64; h=h+1)
+{
+	if (_Genetic_Code[h]==10) 
+	{
+		hshift = hshift+1;
+		continue; 
+	}
+	vshift = hshift;
+	for (v = h+1; v<64; v=v+1)
+	{
+		diff = v-h;
+		if (_Genetic_Code[v]==10) 
+		{
+			vshift = vshift+1;
+			continue; 
+		}
+		nucPosInCodon = 2;
+		if ((h$4==v$4)||((diff%4==0)&&(h$16==v$16))||(diff%16==0))
+		{
+			if (h$4==v$4)
+			{
+				transition = v%4;
+				transition2= h%4;
+			}
+			else
+			{
+				if(diff%16==0)
+				{
+					transition = v$16;
+					transition2= h$16;
+					nucPosInCodon = 0;
+				}
+				else
+				{
+					transition = v%16$4;
+					transition2= h%16$4;
+					nucPosInCodon = 1;
+				}
+			}
+			if (transition<transition2)
+			{
+				trSM = transition;
+				trLG = transition2;
+			}
+			else
+			{
+				trSM = transition2;
+				trLG = transition;
+			}
+			
+			if (trSM==0)
+			{
+				if (trLG==1)
+				{
+					if (_Genetic_Code[0][h]==_Genetic_Code[0][v]) 
+					{
+						CodonMatrix_2[h-hshift][v-vshift] := AC_2__*synRate*positionFrequencies_2__[transition__][nucPosInCodon__];
+						CodonMatrix_2[v-vshift][h-hshift] := AC_2__*synRate*positionFrequencies_2__[transition2__][nucPosInCodon__];
+					}
+					else
+					{
+						CodonMatrix_2[h-hshift][v-vshift] := AC_2__*nonSynRate*positionFrequencies_2__[transition__][nucPosInCodon__];
+						CodonMatrix_2[v-vshift][h-hshift] := AC_2__*nonSynRate*positionFrequencies_2__[transition2__][nucPosInCodon__];
+					}
+				}
+				else
+				{
+					if (trLG==2)
+					{
+						if (_Genetic_Code[0][h]==_Genetic_Code[0][v]) 
+						{
+							CodonMatrix_2[h-hshift][v-vshift] := synRate*positionFrequencies_2__[transition__][nucPosInCodon__];
+							CodonMatrix_2[v-vshift][h-hshift] := synRate*positionFrequencies_2__[transition2__][nucPosInCodon__];
+						}
+						else
+						{
+							CodonMatrix_2[h-hshift][v-vshift] := nonSynRate*positionFrequencies_2__[transition__][nucPosInCodon__];
+							CodonMatrix_2[v-vshift][h-hshift] := nonSynRate*positionFrequencies_2__[transition2__][nucPosInCodon__];
+						}							
+					}
+					else
+					{
+						if (_Genetic_Code[0][h]==_Genetic_Code[0][v]) 
+						{
+							CodonMatrix_2[h-hshift][v-vshift] := AT_2__*synRate*positionFrequencies_2__[transition__][nucPosInCodon__];
+							CodonMatrix_2[v-vshift][h-hshift] := AT_2__*synRate*positionFrequencies_2__[transition2__][nucPosInCodon__];
+						}
+						else
+						{
+							CodonMatrix_2[h-hshift][v-vshift] := AT_2__*nonSynRate*positionFrequencies_2__[transition__][nucPosInCodon__];
+							CodonMatrix_2[v-vshift][h-hshift] := AT_2__*nonSynRate*positionFrequencies_2__[transition2__][nucPosInCodon__];
+						}							
+					}
+				}
+			}
+			else
+			{
+				if (trSM==1)
+				{
+					if (trLG==2)
+					{
+						if (_Genetic_Code[0][h]==_Genetic_Code[0][v]) 
+						{
+							CodonMatrix_2[h-hshift][v-vshift] := CG_2__*synRate*positionFrequencies_2__[transition__][nucPosInCodon__];
+							CodonMatrix_2[v-vshift][h-hshift] := CG_2__*synRate*positionFrequencies_2__[transition2__][nucPosInCodon__];
+						}
+						else
+						{
+							CodonMatrix_2[h-hshift][v-vshift] := CG_2__*nonSynRate*positionFrequencies_2__[transition__][nucPosInCodon__];
+							CodonMatrix_2[v-vshift][h-hshift] := CG_2__*nonSynRate*positionFrequencies_2__[transition2__][nucPosInCodon__];
+						}
+					}
+					else
+					{
+						if (_Genetic_Code[0][h]==_Genetic_Code[0][v]) 
+						{
+							CodonMatrix_2[h-hshift][v-vshift] := CT_2__*synRate*positionFrequencies_2__[transition__][nucPosInCodon__];
+							CodonMatrix_2[v-vshift][h-hshift] := CT_2__*synRate*positionFrequencies_2__[transition2__][nucPosInCodon__];
+						}
+						else
+						{
+							CodonMatrix_2[h-hshift][v-vshift] := CT_2__*nonSynRate*positionFrequencies_2__[transition__][nucPosInCodon__];
+							CodonMatrix_2[v-vshift][h-hshift] := CT_2__*nonSynRate*positionFrequencies_2__[transition2__][nucPosInCodon__];
+						}							
+					}
+				}
+				else
+				{
+					if (_Genetic_Code[0][h]==_Genetic_Code[0][v]) 
+					{
+						CodonMatrix_2[h-hshift][v-vshift] := GT_2__*synRate*positionFrequencies_2__[transition__][nucPosInCodon__];
+						CodonMatrix_2[v-vshift][h-hshift] := GT_2__*synRate*positionFrequencies_2__[transition2__][nucPosInCodon__];
+					}
+					else
+					{
+						CodonMatrix_2[h-hshift][v-vshift] := GT_2__*nonSynRate*positionFrequencies_2__[transition__][nucPosInCodon__];
+						CodonMatrix_2[v-vshift][h-hshift] := GT_2__*nonSynRate*positionFrequencies_2__[transition2__][nucPosInCodon__];
+					}							
+				}
+			}
+		}
+   }
+}
+
+Model MGModel   = (CodonMatrix,codonFrequencies,0);
+Tree  codonTree = treeString_1;
+
+Model MGModel_2   = (CodonMatrix_2,codonFrequencies_2,0);
+Tree  codonTree_2 = treeString_2;
+
+global	sRate   		= 1;
+global  sRate_2 		= 1;
+
+DataSet jointDS = Combine (ds, ds_2);
+
+
+doneSites    = {nucData.sites/3,9};
+fullSites    = {nucData.sites/3,11};
+
+smipv = MAXIMUM_ITERATIONS_PER_VARIABLE;
+MAXIMUM_ITERATIONS_PER_VARIABLE = 5000;
+
+labels = {{"dS 1","dN 1","dS 2","dN 2", "dN1/dS1", "dN2/dS2", "Joint dS 1","Joint dS 2","Joint dN/dS", "LRT","p-value"}};
+
+ClearConstraints (codonTree);
+ReplicateConstraint("this1.?.synRate:=sRate*this2.?.t__",codonTree,givenTree);
+ReplicateConstraint("this1.?.nonSynRate:=dNdS*this2.?.t__",codonTree,givenTree);
+ClearConstraints (codonTree_2);
+ReplicateConstraint("this1.?.synRate:=sRate_2*this2.?.t__",codonTree_2,givenTree_2);
+ReplicateConstraint("this1.?.nonSynRate:=dNdS_2*this2.?.t__",codonTree_2,givenTree_2);
+
+GetDataInfo    (dupInfo, filteredData);
+GetDataInfo    (dupInfo_2, filteredData_2);
+
+donePairs = {};
+
+if (MPI_NODE_COUNT<=1)
+{
+	for (siteCount = 0; siteCount < nucData.sites/3; siteCount = siteCount+1)
+	{
+		siteMap   = dupInfo[siteCount];
+		siteMap_2 = dupInfo_2[siteCount];
+		
+		mapKey = ""+siteMap+","+siteMap_2;
+		
+		mapIndex = donePairs[mapKey];
+		
+		if (mapIndex == 0)
+		{
+			siteMap = siteCount;
+			
+			filterString = "";
+			filterString = filterString + (siteCount*3) + "-" + (siteCount*3+2);
+			filterString = "";
+			filterString = filterString + (siteCount*3) + "-" + (siteCount*3+2);
+			DataSetFilter filteredData   = CreateFilter (jointDS,3,filterString,speciesIndex<nucData.species,GeneticCodeExclusions);
+			DataSetFilter filteredData_2 = CreateFilter (jointDS,3,filterString,speciesIndex>=nucData.species,GeneticCodeExclusions);
+
+			/* check to see if the site is constant in the first data set */
+			
+			HarvestFrequencies (f1, filteredData, 3, 3, 0);
+			m1 = 0;
+			for (mpiNode=0; mpiNode < 64; mpiNode=mpiNode+1)
+			{
+				if (f1[mpiNode]>0)
+				{
+					m1=m1+1;
+				}
+			}
+			
+			/* check to see if the site is constant in the first data set */
+			HarvestFrequencies (f1, filteredData_2, 3, 3, 0);
+			m2 = 0;
+			for (mpiNode=0; mpiNode < 64; mpiNode=mpiNode+1)
+			{
+				if (f1[mpiNode]>0)
+				{
+					m2=m2+1;
+				}
+			}
+			
+			if (m1>1 || m2>1)
+			/* at least one site is not constant */
+			{
+				sRate   = 1;
+				sRate_2 = 1;
+				dNdS    = 1;
+				dNdS_2  = 1;
+				if (m1 > 1)
+				{
+					if (m2 > 1)
+					{
+						ClearConstraints (codonTree);
+						ReplicateConstraint("this1.?.synRate:=sRate*this2.?.t__",codonTree,givenTree);
+						ReplicateConstraint("this1.?.nonSynRate:=dNdS*this2.?.t__",codonTree,givenTree);
+						ClearConstraints (codonTree_2);
+						ReplicateConstraint("this1.?.synRate:=sRate_2*this2.?.t__",codonTree_2,givenTree_2);
+						ReplicateConstraint("this1.?.nonSynRate:=dNdS_2*this2.?.t__",codonTree_2,givenTree_2);
+						LikelihoodFunction siteLikelihood = (filteredData, codonTree,filteredData_2,codonTree_2);				
+						Optimize (site_res, siteLikelihood);
+					}
+					else
+					{
+						ClearConstraints (codonTree);
+						ReplicateConstraint("this1.?.synRate:=sRate*this2.?.t__",codonTree,givenTree);
+						ReplicateConstraint("this1.?.nonSynRate:=dNdS*this2.?.t__",codonTree,givenTree);
+						LikelihoodFunction siteLikelihood = (filteredData, codonTree);				
+						Optimize (site_res, siteLikelihood);
+						sRate_2 = 0;
+						dNdS_2  = 0;
+					}
+				}
+				else
+				{
+					ClearConstraints (codonTree_2);
+					ReplicateConstraint("this1.?.synRate:=sRate_2*this2.?.t__",codonTree_2,givenTree_2);
+					ReplicateConstraint("this1.?.nonSynRate:=dNdS_2*this2.?.t__",codonTree_2,givenTree_2);
+					LikelihoodFunction siteLikelihood = (filteredData_2,codonTree_2);				
+					Optimize (site_res, siteLikelihood);				
+					sRate   = 0;
+					dNdS    = 0;
+				}
+				doneSites[siteMap][0] = sRate;
+				doneSites[siteMap][1] = dNdS;
+				doneSites[siteMap][2] = sRate_2;
+				doneSites[siteMap][3] = dNdS_2;
+
+				sRate   = 1;
+				sRate_2 = 1;
+				dNdS    = 1;
+				ClearConstraints (codonTree);
+				ReplicateConstraint("this1.?.synRate:=sRate*this2.?.t__",codonTree,givenTree);
+				ReplicateConstraint("this1.?.nonSynRate:=dNdS*sRate*this2.?.t__",codonTree,givenTree);
+				ClearConstraints (codonTree_2);
+				ReplicateConstraint("this1.?.synRate:=sRate_2*this2.?.t__",codonTree_2,givenTree_2);
+				ReplicateConstraint("this1.?.nonSynRate:=dNdS*sRate_2*this2.?.t__",codonTree_2,givenTree_2);
+
+				Optimize (site_resN, siteLikelihood);
+				doneSites[siteMap][4] = sRate;
+				doneSites[siteMap][5] = sRate_2;
+				doneSites[siteMap][6] = dNdS;
+				doneSites[siteMap][7] = 2*(site_res[1][0]-site_resN[1][0]);
+				doneSites[siteMap][8] = 1-CChi2(doneSites[siteMap][7],1);		
+			}
+			else
+			{
+				doneSites[siteMap][7] = 0;
+				doneSites[siteMap][8] = 1;					
+			}					
+			donePairs [mapKey] = siteCount+1;
+			ReportSite2 (siteCount, siteCount);	
+		}
+		else
+		{
+			dummy = ReportSite2 (siteCount, mapIndex-1);				 
+		}
+	}	
+}
+else
+{
+	MPINodeState = {MPI_NODE_COUNT-1,3};
+	for (siteCount = 0; siteCount < nucData.sites/3; siteCount = siteCount+1)
+	{
+		siteMap   = dupInfo[siteCount];
+		siteMap_2 = dupInfo_2[siteCount];
+		mapKey = ""+siteMap+","+siteMap_2;		
+		mapIndex = donePairs[mapKey];
+		
+		if (mapIndex == 0)
+		{
+			
+			filterString = "";
+			filterString = filterString + (siteCount*3) + "-" + (siteCount*3+2);
+			DataSetFilter filteredData   = CreateFilter (jointDS,3,filterString,speciesIndex<nucData.species,GeneticCodeExclusions);
+			DataSetFilter filteredData_2 = CreateFilter (jointDS,3,filterString,speciesIndex>=nucData.species,GeneticCodeExclusions);
+			
+			HarvestFrequencies (f1, filteredData, 3, 3, 0);
+			m1 = 0;
+			for (mpiNode=0; mpiNode < 64; mpiNode=mpiNode+1)
+			{
+				if (f1[mpiNode]>0)
+				{
+					m1=m1+1;
+				}
+			}
+			
+			/* check to see if the site is constant in the first data set */
+			HarvestFrequencies (f1, filteredData_2, 3, 3, 0);
+			m2 = 0;
+			for (mpiNode=0; mpiNode < 64; mpiNode=mpiNode+1)
+			{
+				if (f1[mpiNode]>0)
+				{
+					m2=m2+1;
+				}
+			}
+			
+			if (m1>1 || m2>1)
+			{
+				siteMap = siteCount;
+				sRate   = 1;
+				sRate_2 = 1;
+				dNdS    = 1;
+				dNdS_2  = 1;
+				
+				ClearConstraints (codonTree);
+				ReplicateConstraint("this1.?.synRate:=sRate*this2.?.t__",codonTree,givenTree);
+				ReplicateConstraint("this1.?.nonSynRate:=dNdS*this2.?.t__",codonTree,givenTree);
+				ClearConstraints (codonTree_2);
+				ReplicateConstraint("this1.?.synRate:=sRate_2*this2.?.t__",codonTree_2,givenTree_2);
+				ReplicateConstraint("this1.?.nonSynRate:=dNdS_2*this2.?.t__",codonTree_2,givenTree_2);
+				LikelihoodFunction siteLikelihood = (filteredData, codonTree,filteredData_2,codonTree_2);				
+
+				for (mpiNode = 0; mpiNode < MPI_NODE_COUNT-1; mpiNode = mpiNode+1)
+				{
+					if (MPINodeState[mpiNode][0]==0)
+					{
+						break;	
+					}
+				}
+				
+				if (mpiNode==MPI_NODE_COUNT-1)
+				{
+					mpiNode = ReceiveJobs2 (1,1);
+				}
+				else
+				{
+					MPISend (mpiNode+1,siteLikelihood);
+					MPINodeState[mpiNode][0] = 1;
+					MPINodeState[mpiNode][1] = siteCount;
+					MPINodeState[mpiNode][2] = 1;
+				}
+				
+				sRate   = 1;
+				sRate_2 = 1;
+				dNdS    = 1;
+				
+				ClearConstraints (codonTree);
+				ReplicateConstraint("this1.?.synRate:=sRate*this2.?.t__",codonTree,givenTree);
+				ReplicateConstraint("this1.?.nonSynRate:=dNdS*sRate*this2.?.t__",codonTree,givenTree);
+				ClearConstraints (codonTree_2);
+				ReplicateConstraint("this1.?.synRate:=sRate_2*this2.?.t__",codonTree_2,givenTree_2);
+				ReplicateConstraint("this1.?.nonSynRate:=dNdS*sRate_2*this2.?.t__",codonTree_2,givenTree_2);
+
+				DataSetFilter filteredData   = CreateFilter (jointDS,3,filterString,speciesIndex<nucData.species,GeneticCodeExclusions);
+				DataSetFilter filteredData_2 = CreateFilter (jointDS,3,filterString,speciesIndex>=nucData.species,GeneticCodeExclusions);
+				LikelihoodFunction siteLikelihood = (filteredData, codonTree,filteredData_2,codonTree_2);				
+
+				for (mpiNode = 0; mpiNode < MPI_NODE_COUNT-1; mpiNode = mpiNode+1)
+				{
+					if (MPINodeState[mpiNode][0]==0)
+					{
+						break;	
+					}
+				}
+				if (mpiNode==MPI_NODE_COUNT-1)
+				{
+					mpiNode = ReceiveJobs2 (1,0);
+				}
+				else
+				{
+					MPISend (mpiNode+1,siteLikelihood);
+					MPINodeState[mpiNode][0] = 1;
+					MPINodeState[mpiNode][1] = siteCount;
+					MPINodeState[mpiNode][2] = 0;
+				}
+				
+			}
+			else
+			{
+				doneSites[siteCount][7] = 0;
+				doneSites[siteCount][8] = 1;					
+				ReportSite2 (siteCount, siteCount);	
+			}					
+			donePairs [mapKey] = siteCount+1;
+		}
+		else
+		{
+			doneSites[siteCount][0] = -mapIndex;
+		}
+	}					
+	while (1)
+	{
+		for (nodeCounter = 0; nodeCounter < MPI_NODE_COUNT-1; nodeCounter = nodeCounter+1)
+		{
+			if (MPINodeState[nodeCounter][0]==1)
+			{
+				fromNode = ReceiveJobs2 (0,0);
+				break;	
+			}
+		}
+		if (nodeCounter == MPI_NODE_COUNT-1)
+		{
+			break;
+		}
+	}			
+			
+
+	fprintf (stdout, "\n\n\n");
+
+	for (siteCount = 0; siteCount < nucData.sites/3; siteCount = siteCount+1)
+	{
+		nodeCounter = doneSites[siteCount][0];
+		if (nodeCounter < (-0.5))
+		{
+			ReportSite2 (siteCount, -nodeCounter-1);	
+		} 
+		else
+		{
+			ReportSite2 (siteCount, siteCount);	
+		}			 
+	}
+}
+
+OpenWindow (CHARTWINDOW,{{"Pairwise Comparison Results"}
+					   {"labels"},
+					   {"fullSites"},
+					   {"Bar Chart"},
+					   {"Index"},
+					   {labels[10]},
+					   {"Site Index"},
+					   {""},
+					   {labels[10]},
+					   {"0"}},
+					   "SCREEN_WIDTH-60;SCREEN_HEIGHT-50;30;50");
+					   
+SetDialogPrompt ("Save site-by-site LRT results to:");
+
+fprintf (PROMPT_FOR_FILE,CLEAR_FILE,"dS 1,dN 1,dS 2, dN 2, dN1/dS1, dN2/dS2, Joint dS1, Joint dS2, Joint dN/dS, LRT, p-value");
+
+dummy = Columns (fullSites);
+
+for (nodeCounter=0; nodeCounter < Rows (fullSites); nodeCounter = nodeCounter+1)
+{
+	fprintf (LAST_FILE_PATH,"\n",fullSites[nodeCounter][0]);
+	for (siteCount = 1; siteCount < dummy; siteCount = siteCount + 1)
+	{
+		fprintf (LAST_FILE_PATH,",",fullSites[nodeCounter][siteCount]);
+	}
+}
+
+MAXIMUM_ITERATIONS_PER_VARIABLE = smipv;
+
+donePairs = 0;
diff --git a/res/TemplateBatchFiles/CompareSelectivePressureIVL.bf b/res/TemplateBatchFiles/CompareSelectivePressureIVL.bf
new file mode 100644
index 0000000..79e8fac
--- /dev/null
+++ b/res/TemplateBatchFiles/CompareSelectivePressureIVL.bf
@@ -0,0 +1,970 @@
+SHORT_MPI_RETURN = 1;
+
+/*------------------------------------------------------------------------*/
+
+function BuildCodonFrequencies (obsF)
+{
+	if (!ModelMatrixDimension)
+	{
+		ModelMatrixDimension = 64;
+		for (h = 0 ;h<64; h=h+1)
+		{
+			if (_Genetic_Code[h]==10)
+			{
+				ModelMatrixDimension = ModelMatrixDimension-1;
+			}
+		}
+	}
+
+	PIStop = 1.0;
+	result = {ModelMatrixDimension,1};
+	hshift = 0;
+
+	for (h=0; h<64; h=h+1)
+	{
+		first = h$16;
+		second = h%16$4;
+		third = h%4;
+		if (_Genetic_Code[h]==10) 
+		{
+			hshift = hshift+1;
+			PIStop = PIStop-obsF[first][0]*obsF[second][1]*obsF[third][2];
+			continue; 
+		}
+		result[h-hshift][0]=obsF[first][0]*obsF[second][1]*obsF[third][2];
+	}
+	return result*(1.0/PIStop);
+}
+
+/*------------------------------------------------------------------------*/
+
+function MakeModelConstraints (dummy)
+{
+	modelConstraintString = "";
+
+	for (customLoopCounter2=1; customLoopCounter2<6; customLoopCounter2=customLoopCounter2+1)
+	{
+		for (customLoopCounter=0; customLoopCounter<customLoopCounter2; customLoopCounter=customLoopCounter+1)
+		{
+			if (modelDesc[customLoopCounter2]==modelDesc[customLoopCounter])
+			{
+				ModelTitle  = ModelTitle+modelDesc[customLoopCounter2];	
+				if (rateBiasTerms[customLoopCounter2] == "1")
+				{
+					modelConstraintString = modelConstraintString + rateBiasTerms[customLoopCounter]+":="+rateBiasTerms[customLoopCounter2]+";";
+				}
+				else
+				{
+					modelConstraintString = modelConstraintString + rateBiasTerms[customLoopCounter2]+":="+rateBiasTerms[customLoopCounter]+";";			
+				}
+				break;
+			}
+		}
+		if (customLoopCounter==customLoopCounter2)
+		{
+			ModelTitle = ModelTitle+modelDesc[customLoopCounter2];	
+		}
+	}
+	return 0;
+}	
+
+
+/*------------------------------------------------------------------------*/
+
+function ReportSite2 (siteI, siteM)
+{
+	if (siteI != siteM)
+	{
+		for (k=0; k < 13; k=k+1)
+		{
+			doneSites[siteI][k] = doneSites[siteM][k];
+		}
+	}					 
+
+	fprintf (stdout, "| Codon: ", 		Format(siteI+1,4,0),
+					 "| Sample 1 (dS,dN Int, dN Leaf): ", 		
+					 					Format(doneSites[siteI][0],6,2),
+					 					Format(doneSites[siteI][1],6,2),
+					 					Format(doneSites[siteI][2],8,2),
+					 "| Sample 2 (dS,dN Int, dN Leaf): ", 		
+					 					Format(doneSites[siteI][3],6,2),
+					 					Format(doneSites[siteI][4],6,2),
+					 					Format(doneSites[siteI][5],8,2),
+					 "| LRT: ",			Format(doneSites[siteI][11],7,2),
+					 "| p: ",			Format(doneSites[siteI][12],5,2), "\n");		
+
+
+	return 0;
+}
+
+
+/*------------------------------------------------------------------------*/
+
+function ReceiveJobs2 (sendOrNot, nullAlt)
+{
+	MPIReceive (-1, fromNode, result_String);
+	
+	siteIndex = MPINodeState[fromNode-1][1];
+	siteNA	  = MPINodeState[fromNode-1][2];
+	
+	if (sendOrNot)
+	{
+		MPISend (fromNode,siteLikelihood);
+		MPINodeState[fromNode-1][1] = siteCount;			
+		MPINodeState[fromNode-1][2] = nullAlt;			
+	}
+	else
+	{
+		MPINodeState[fromNode-1][0] = 0;
+		MPINodeState[fromNode-1][1] = -1;		
+	}
+	
+	siteMap = siteIndex;
+	
+	/*fprintf ("../dump",CLEAR_FILE,result_String);*/
+		
+	ExecuteCommands (result_String);
+	
+	sRateV = siteLikelihood_MLE_VALUES["sRate"];
+	dNdS_IV = siteLikelihood_MLE_VALUES["dNdS_I"];
+	dNdS_LV = siteLikelihood_MLE_VALUES["dNdS_L"];
+	sRate_2V = siteLikelihood_MLE_VALUES["sRate_2"];
+	dNdS_2_IV = siteLikelihood_MLE_VALUES["dNdS_2_I"];
+	dNdS_2_LV = siteLikelihood_MLE_VALUES["dNdS_2_L"];
+	if (siteNA)
+	{
+		doneSites[siteMap][0] = sRateV;
+		doneSites[siteMap][1] = dNdS_IV;
+		doneSites[siteMap][2] = dNdS_LV;
+		doneSites[siteMap][3] = sRate_2V;
+		doneSites[siteMap][4] = dNdS_2_IV;
+		doneSites[siteMap][5] = dNdS_2_LV;
+		doneSites[siteMap][11] = doneSites[siteMap][11]+2*siteLikelihood_MLES[1][0];
+	}
+	else
+	{
+		doneSites[siteMap][6] = sRateV;
+		doneSites[siteMap][7] = sRate_2V;
+		doneSites[siteMap][8] = dNdS_IV;
+		doneSites[siteMap][9] = dNdS_LV;
+		doneSites[siteMap][10] = dNdS_2_IV;
+		doneSites[siteMap][11] = doneSites[siteMap][11]-2*siteLikelihood_MLES[1][0];	
+	}
+
+	if (doneSites[siteMap][12] == 0)
+	{
+		doneSites[siteMap][12] = -1;
+	}
+	else
+	{
+		if (doneSites[siteMap][12] == (-1))
+		{
+			doneSites[siteMap][12] = 1-CChi2(doneSites[siteMap][11],1);						
+			dummy = ReportSite2 (siteIndex, siteMap);
+		}
+	}
+	
+	return fromNode-1;
+}
+
+/*------------------------------------------------------------------------*/
+
+#include   "TemplateModels/chooseGeneticCode.def";
+
+
+global AC 	= 1;
+global AT 	= 1;
+global CG 	= 1;
+global CT 	= 1;
+global GT 	= 1;
+global dNdS_I = 1;	
+global dNdS_L = 1;	
+
+global AC_2 	= 1;
+global AT_2 	= 1;
+global CG_2 	= 1;
+global CT_2 	= 1;
+global GT_2 	= 1;
+global dNdS_2_I   = 1;		
+global dNdS_2_L   = 1;		
+
+
+NucleotideMatrix	 = {{*,AC*t,t,AT*t}{AC*t,*,CG*t,CT*t}{t,CG*t,*,GT*t}{AT*t,CT*t,GT*t,*}};
+NucleotideMatrix_2	 = {{*,AC_2*t,t,AT_2*t}{AC_2*t,*,CG_2*t,CT_2*t}{t,CG_2*t,*,GT_2*t}{AT_2*t,CT_2*t,GT_2*t,*}};
+
+SetDialogPrompt ("Please specify the first codon data file:");
+
+DataSet 	  ds 		= ReadDataFile (PROMPT_FOR_FILE);
+DataSetFilter filteredData = CreateFilter (ds,3,"","",GeneticCodeExclusions);
+DataSetFilter nucData 	= CreateFilter (filteredData,1);
+HarvestFrequencies (overallFrequencies,  nucData,1,1,0);
+HarvestFrequencies (positionFrequencies, nucData,3,1,1);
+codonFrequencies = BuildCodonFrequencies(positionFrequencies);
+
+#include	 "queryTree.bf";
+treeString_1 = ""+givenTree;
+
+SetDialogPrompt ("Please specify the second codon data file:");
+
+DataSet 	  ds_2		= ReadDataFile (PROMPT_FOR_FILE);
+DataSetFilter filteredData_2 = CreateFilter (ds_2,3,"","",GeneticCodeExclusions);
+DataSetFilter nucData_2 	= CreateFilter (filteredData_2,1);
+HarvestFrequencies (overallFrequencies_2,  nucData_2,1,1,0);
+HarvestFrequencies (positionFrequencies_2, nucData_2,3,1,1);
+codonFrequencies_2 = BuildCodonFrequencies(positionFrequencies_2);
+
+if (filteredData.sites != filteredData_2.sites)
+{
+	fprintf (stdout, "\n\nBoth data sets must have the same number of sites.\n\n");
+	return 0;
+}
+
+#include	 "queryTree.bf";
+treeString_2 = ""+givenTree;
+
+ChoiceList (modelChoice, "Model Options",1,SKIP_NONE,
+			"Default","Use HKY85 and MG94xHKY85.",
+			"Custom", "Use any reversible nucleotide model crossed with MG94.");
+			
+if (modelChoice < 0)
+{
+	return;
+}
+
+modelDesc = "";
+
+if (modelChoice)
+{
+	done = 0;
+	while (!done)
+	{
+		fprintf (stdout,"\nPlease enter a 6 character model designation for the first data set(e.g:010010 defines HKY85):");
+		fscanf  (stdin,"String", modelDesc);
+		if (Abs(modelDesc)==6)
+		{	
+			done = 1;
+		}
+	}			
+
+	done = 0;
+	while (!done)
+	{
+		fprintf (stdout,"\nPlease enter a 6 character model designation for the second data set(e.g:010010 defines HKY85):");
+		fscanf  (stdin,"String", modelDesc2);
+		if (Abs(modelDesc2)==6)
+		{	
+			done = 1;
+		}
+	}			
+}
+else
+{
+	modelDesc  = "010010";
+	modelDesc2 = "010010";
+}
+
+ModelTitle = ""+modelDesc[0];
+rateBiasTerms = {{"AC","1","AT","CG","CT","GT"}};
+paramCount	  = 0;
+
+dummy = MakeModelConstraints (0);
+
+if (Abs(modelConstraintString))
+{
+	ExecuteCommands (modelConstraintString);
+}
+
+modelDesc = modelDesc2;
+rateBiasTerms = {{"AC_2","1","AT_2","CG_2","CT_2","GT_2"}};
+paramCount	  = 0;
+
+dummy = MakeModelConstraints (0);
+
+if (Abs(modelConstraintString))
+{
+	ExecuteCommands (modelConstraintString);
+}
+
+Model NucModel	    = (NucleotideMatrix, overallFrequencies, 1);
+Tree  givenTree 	= treeString_1;
+
+LikelihoodFunction 	nucLF = (nucData,givenTree);
+Optimize (res, nucLF);
+
+fprintf (stdout, "\nNucleotide fit for the first data set\n\n",nucLF,"\n\n");
+
+Model NucModel_2 	= (NucleotideMatrix_2, overallFrequencies_2, 1);
+Tree  givenTree_2 	= treeString_2;
+
+LikelihoodFunction 	nucLF_2 = (nucData_2,givenTree_2);
+Optimize (res_2, nucLF_2);
+
+fprintf (stdout, "\nNucleotide fit for the second data set\n\n",nucLF_2,"\n\n");
+				
+CodonMatrix = {ModelMatrixDimension,ModelMatrixDimension};
+
+hshift = 0;
+
+for (h=0; h<64; h=h+1)
+{
+	if (_Genetic_Code[h]==10) 
+	{
+		hshift = hshift+1;
+		continue; 
+	}
+	vshift = hshift;
+	for (v = h+1; v<64; v=v+1)
+	{
+		diff = v-h;
+		if (_Genetic_Code[v]==10) 
+		{
+			vshift = vshift+1;
+			continue; 
+		}
+		nucPosInCodon = 2;
+		if ((h$4==v$4)||((diff%4==0)&&(h$16==v$16))||(diff%16==0))
+		{
+			if (h$4==v$4)
+			{
+				transition = v%4;
+				transition2= h%4;
+			}
+			else
+			{
+				if(diff%16==0)
+				{
+					transition = v$16;
+					transition2= h$16;
+					nucPosInCodon = 0;
+				}
+				else
+				{
+					transition = v%16$4;
+					transition2= h%16$4;
+					nucPosInCodon = 1;
+				}
+			}
+			if (transition<transition2)
+			{
+				trSM = transition;
+				trLG = transition2;
+			}
+			else
+			{
+				trSM = transition2;
+				trLG = transition;
+			}
+			
+			if (trSM==0)
+			{
+				if (trLG==1)
+				{
+					if (_Genetic_Code[0][h]==_Genetic_Code[0][v]) 
+					{
+						CodonMatrix[h-hshift][v-vshift] := AC__*synRate*positionFrequencies__[transition__][nucPosInCodon__];
+						CodonMatrix[v-vshift][h-hshift] := AC__*synRate*positionFrequencies__[transition2__][nucPosInCodon__];
+					}
+					else
+					{
+						CodonMatrix[h-hshift][v-vshift] := AC__*nonSynRate*positionFrequencies__[transition__][nucPosInCodon__];
+						CodonMatrix[v-vshift][h-hshift] := AC__*nonSynRate*positionFrequencies__[transition2__][nucPosInCodon__];
+					}
+				}
+				else
+				{
+					if (trLG==2)
+					{
+						if (_Genetic_Code[0][h]==_Genetic_Code[0][v]) 
+						{
+							CodonMatrix[h-hshift][v-vshift] := synRate*positionFrequencies__[transition__][nucPosInCodon__];
+							CodonMatrix[v-vshift][h-hshift] := synRate*positionFrequencies__[transition2__][nucPosInCodon__];
+						}
+						else
+						{
+							CodonMatrix[h-hshift][v-vshift] := nonSynRate*positionFrequencies__[transition__][nucPosInCodon__];
+							CodonMatrix[v-vshift][h-hshift] := nonSynRate*positionFrequencies__[transition2__][nucPosInCodon__];
+						}							
+					}
+					else
+					{
+						if (_Genetic_Code[0][h]==_Genetic_Code[0][v]) 
+						{
+							CodonMatrix[h-hshift][v-vshift] := AT__*synRate*positionFrequencies__[transition__][nucPosInCodon__];
+							CodonMatrix[v-vshift][h-hshift] := AT__*synRate*positionFrequencies__[transition2__][nucPosInCodon__];
+						}
+						else
+						{
+							CodonMatrix[h-hshift][v-vshift] := AT__*nonSynRate*positionFrequencies__[transition__][nucPosInCodon__];
+							CodonMatrix[v-vshift][h-hshift] := AT__*nonSynRate*positionFrequencies__[transition2__][nucPosInCodon__];
+						}							
+					}
+				}
+			}
+			else
+			{
+				if (trSM==1)
+				{
+					if (trLG==2)
+					{
+						if (_Genetic_Code[0][h]==_Genetic_Code[0][v]) 
+						{
+							CodonMatrix[h-hshift][v-vshift] := CG__*synRate*positionFrequencies__[transition__][nucPosInCodon__];
+							CodonMatrix[v-vshift][h-hshift] := CG__*synRate*positionFrequencies__[transition2__][nucPosInCodon__];
+						}
+						else
+						{
+							CodonMatrix[h-hshift][v-vshift] := CG__*nonSynRate*positionFrequencies__[transition__][nucPosInCodon__];
+							CodonMatrix[v-vshift][h-hshift] := CG__*nonSynRate*positionFrequencies__[transition2__][nucPosInCodon__];
+						}
+					}
+					else
+					{
+						if (_Genetic_Code[0][h]==_Genetic_Code[0][v]) 
+						{
+							CodonMatrix[h-hshift][v-vshift] := CT__*synRate*positionFrequencies__[transition__][nucPosInCodon__];
+							CodonMatrix[v-vshift][h-hshift] := CT__*synRate*positionFrequencies__[transition2__][nucPosInCodon__];
+						}
+						else
+						{
+							CodonMatrix[h-hshift][v-vshift] := CT__*nonSynRate*positionFrequencies__[transition__][nucPosInCodon__];
+							CodonMatrix[v-vshift][h-hshift] := CT__*nonSynRate*positionFrequencies__[transition2__][nucPosInCodon__];
+						}							
+					}
+				}
+				else
+				{
+					if (_Genetic_Code[0][h]==_Genetic_Code[0][v]) 
+					{
+						CodonMatrix[h-hshift][v-vshift] := GT__*synRate*positionFrequencies__[transition__][nucPosInCodon__];
+						CodonMatrix[v-vshift][h-hshift] := GT__*synRate*positionFrequencies__[transition2__][nucPosInCodon__];
+					}
+					else
+					{
+						CodonMatrix[h-hshift][v-vshift] := GT__*nonSynRate*positionFrequencies__[transition__][nucPosInCodon__];
+						CodonMatrix[v-vshift][h-hshift] := GT__*nonSynRate*positionFrequencies__[transition2__][nucPosInCodon__];
+					}							
+				}
+			}
+		}
+   }
+}		
+
+CodonMatrix_2 = {ModelMatrixDimension,ModelMatrixDimension};
+
+hshift = 0;
+
+for (h=0; h<64; h=h+1)
+{
+	if (_Genetic_Code[h]==10) 
+	{
+		hshift = hshift+1;
+		continue; 
+	}
+	vshift = hshift;
+	for (v = h+1; v<64; v=v+1)
+	{
+		diff = v-h;
+		if (_Genetic_Code[v]==10) 
+		{
+			vshift = vshift+1;
+			continue; 
+		}
+		nucPosInCodon = 2;
+		if ((h$4==v$4)||((diff%4==0)&&(h$16==v$16))||(diff%16==0))
+		{
+			if (h$4==v$4)
+			{
+				transition = v%4;
+				transition2= h%4;
+			}
+			else
+			{
+				if(diff%16==0)
+				{
+					transition = v$16;
+					transition2= h$16;
+					nucPosInCodon = 0;
+				}
+				else
+				{
+					transition = v%16$4;
+					transition2= h%16$4;
+					nucPosInCodon = 1;
+				}
+			}
+			if (transition<transition2)
+			{
+				trSM = transition;
+				trLG = transition2;
+			}
+			else
+			{
+				trSM = transition2;
+				trLG = transition;
+			}
+			
+			if (trSM==0)
+			{
+				if (trLG==1)
+				{
+					if (_Genetic_Code[0][h]==_Genetic_Code[0][v]) 
+					{
+						CodonMatrix_2[h-hshift][v-vshift] := AC_2__*synRate*positionFrequencies_2__[transition__][nucPosInCodon__];
+						CodonMatrix_2[v-vshift][h-hshift] := AC_2__*synRate*positionFrequencies_2__[transition2__][nucPosInCodon__];
+					}
+					else
+					{
+						CodonMatrix_2[h-hshift][v-vshift] := AC_2__*nonSynRate*positionFrequencies_2__[transition__][nucPosInCodon__];
+						CodonMatrix_2[v-vshift][h-hshift] := AC_2__*nonSynRate*positionFrequencies_2__[transition2__][nucPosInCodon__];
+					}
+				}
+				else
+				{
+					if (trLG==2)
+					{
+						if (_Genetic_Code[0][h]==_Genetic_Code[0][v]) 
+						{
+							CodonMatrix_2[h-hshift][v-vshift] := synRate*positionFrequencies_2__[transition__][nucPosInCodon__];
+							CodonMatrix_2[v-vshift][h-hshift] := synRate*positionFrequencies_2__[transition2__][nucPosInCodon__];
+						}
+						else
+						{
+							CodonMatrix_2[h-hshift][v-vshift] := nonSynRate*positionFrequencies_2__[transition__][nucPosInCodon__];
+							CodonMatrix_2[v-vshift][h-hshift] := nonSynRate*positionFrequencies_2__[transition2__][nucPosInCodon__];
+						}							
+					}
+					else
+					{
+						if (_Genetic_Code[0][h]==_Genetic_Code[0][v]) 
+						{
+							CodonMatrix_2[h-hshift][v-vshift] := AT_2__*synRate*positionFrequencies_2__[transition__][nucPosInCodon__];
+							CodonMatrix_2[v-vshift][h-hshift] := AT_2__*synRate*positionFrequencies_2__[transition2__][nucPosInCodon__];
+						}
+						else
+						{
+							CodonMatrix_2[h-hshift][v-vshift] := AT_2__*nonSynRate*positionFrequencies_2__[transition__][nucPosInCodon__];
+							CodonMatrix_2[v-vshift][h-hshift] := AT_2__*nonSynRate*positionFrequencies_2__[transition2__][nucPosInCodon__];
+						}							
+					}
+				}
+			}
+			else
+			{
+				if (trSM==1)
+				{
+					if (trLG==2)
+					{
+						if (_Genetic_Code[0][h]==_Genetic_Code[0][v]) 
+						{
+							CodonMatrix_2[h-hshift][v-vshift] := CG_2__*synRate*positionFrequencies_2__[transition__][nucPosInCodon__];
+							CodonMatrix_2[v-vshift][h-hshift] := CG_2__*synRate*positionFrequencies_2__[transition2__][nucPosInCodon__];
+						}
+						else
+						{
+							CodonMatrix_2[h-hshift][v-vshift] := CG_2__*nonSynRate*positionFrequencies_2__[transition__][nucPosInCodon__];
+							CodonMatrix_2[v-vshift][h-hshift] := CG_2__*nonSynRate*positionFrequencies_2__[transition2__][nucPosInCodon__];
+						}
+					}
+					else
+					{
+						if (_Genetic_Code[0][h]==_Genetic_Code[0][v]) 
+						{
+							CodonMatrix_2[h-hshift][v-vshift] := CT_2__*synRate*positionFrequencies_2__[transition__][nucPosInCodon__];
+							CodonMatrix_2[v-vshift][h-hshift] := CT_2__*synRate*positionFrequencies_2__[transition2__][nucPosInCodon__];
+						}
+						else
+						{
+							CodonMatrix_2[h-hshift][v-vshift] := CT_2__*nonSynRate*positionFrequencies_2__[transition__][nucPosInCodon__];
+							CodonMatrix_2[v-vshift][h-hshift] := CT_2__*nonSynRate*positionFrequencies_2__[transition2__][nucPosInCodon__];
+						}							
+					}
+				}
+				else
+				{
+					if (_Genetic_Code[0][h]==_Genetic_Code[0][v]) 
+					{
+						CodonMatrix_2[h-hshift][v-vshift] := GT_2__*synRate*positionFrequencies_2__[transition__][nucPosInCodon__];
+						CodonMatrix_2[v-vshift][h-hshift] := GT_2__*synRate*positionFrequencies_2__[transition2__][nucPosInCodon__];
+					}
+					else
+					{
+						CodonMatrix_2[h-hshift][v-vshift] := GT_2__*nonSynRate*positionFrequencies_2__[transition__][nucPosInCodon__];
+						CodonMatrix_2[v-vshift][h-hshift] := GT_2__*nonSynRate*positionFrequencies_2__[transition2__][nucPosInCodon__];
+					}							
+				}
+			}
+		}
+   }
+}
+
+Model MGModel   = (CodonMatrix,codonFrequencies,0);
+Tree  codonTree = treeString_1;
+
+Model MGModel_2   = (CodonMatrix_2,codonFrequencies_2,0);
+Tree  codonTree_2 = treeString_2;
+
+global	sRate   		= 1;
+global  sRate_2 		= 1;
+
+DataSet jointDS = Combine (ds, ds_2);
+
+
+doneSites    = {nucData.sites/3,13};
+
+smipv = MAXIMUM_ITERATIONS_PER_VARIABLE;
+MAXIMUM_ITERATIONS_PER_VARIABLE = 5000;
+
+labels = {{"dS 1","dN Internal 1","dN  Leaves 1","dS 2","dN Internal 2", "dN Leaves 2", "Joint dS 1","Joint dS 2","Joint dN Internal", 
+		  "Joint dN Leaves 1","Joint dN Leaves 2","LRT","p-value"}};
+
+ClearConstraints (codonTree);
+ReplicateConstraint("this1.?.synRate:=sRate*this2.?.t__",codonTree,givenTree);
+ReplicateConstraint("this1.Node?.nonSynRate:=dNdS_I*this2.Node?.t__",codonTree,givenTree);
+ReplicateConstraint("this1.?.nonSynRate:=dNdS_L*this2.?.t__",codonTree,givenTree);
+ClearConstraints (codonTree_2);
+ReplicateConstraint("this1.?.synRate:=sRate_2*this2.?.t__",codonTree_2,givenTree_2);
+ReplicateConstraint("this1.Node?.nonSynRate:=dNdS_2_I*this2.Node?.t__",codonTree_2,givenTree_2);
+ReplicateConstraint("this1.?.nonSynRate:=dNdS_2_L*this2.?.t__",codonTree_2,givenTree_2);
+
+GetDataInfo    (dupInfo, filteredData);
+GetDataInfo    (dupInfo_2, filteredData_2);
+
+donePairs = {};
+
+if (MPI_NODE_COUNT<=1)
+{
+	for (siteCount = 0; siteCount < nucData.sites/3; siteCount = siteCount+1)
+	{
+		siteMap   = dupInfo[siteCount];
+		siteMap_2 = dupInfo_2[siteCount];
+		
+		mapKey = ""+siteMap+","+siteMap_2;
+		
+		mapIndex = donePairs[mapKey];
+		
+		if (mapIndex == 0)
+		{
+			siteMap = siteCount;
+			
+			filterString = "";
+			filterString = filterString + (siteCount*3) + "-" + (siteCount*3+2);
+			filterString = "";
+			filterString = filterString + (siteCount*3) + "-" + (siteCount*3+2);
+			DataSetFilter filteredData   = CreateFilter (jointDS,3,filterString,speciesIndex<nucData.species,GeneticCodeExclusions);
+			DataSetFilter filteredData_2 = CreateFilter (jointDS,3,filterString,speciesIndex>=nucData.species,GeneticCodeExclusions);
+
+			/* check to see if the site is constant in the first data set */
+			
+			HarvestFrequencies (f1, filteredData, 3, 3, 0);
+			m1 = 0;
+			for (mpiNode=0; mpiNode < 64; mpiNode=mpiNode+1)
+			{
+				if (f1[mpiNode]>0)
+				{
+					m1=m1+1;
+				}
+			}
+			
+			/* check to see if the site is constant in the first data set */
+			HarvestFrequencies (f1, filteredData_2, 3, 3, 0);
+			m2 = 0;
+			for (mpiNode=0; mpiNode < 64; mpiNode=mpiNode+1)
+			{
+				if (f1[mpiNode]>0)
+				{
+					m2=m2+1;
+				}
+			}
+			
+			if (m1>1 || m2>1)
+			/* at least one site is not constant */
+			{
+				siteMap = siteCount;
+				sRate   = 1;
+				sRate_2 = 1;
+				dNdS_I   = 1;
+				dNdS_L   = 1;
+				dNdS_2_I = 1;
+				dNdS_2_L = 1;
+				
+				if (m1 > 1)
+				{
+					if (m2 > 1)
+					{
+						ClearConstraints (codonTree);
+						ReplicateConstraint("this1.?.synRate:=sRate*this2.?.t__",codonTree,givenTree);
+						ReplicateConstraint("this1.Node?.nonSynRate:=dNdS_I*this2.Node?.t__",codonTree,givenTree);
+						ReplicateConstraint("this1.?.nonSynRate:=dNdS_L*this2.?.t__",codonTree,givenTree);
+						ClearConstraints (codonTree_2);
+						ReplicateConstraint("this1.?.synRate:=sRate_2*this2.?.t__",codonTree_2,givenTree_2);
+						ReplicateConstraint("this1.Node?.nonSynRate:=dNdS_2_I*this2.Node?.t__",codonTree_2,givenTree_2);
+						ReplicateConstraint("this1.?.nonSynRate:=dNdS_2_L*this2.?.t__",codonTree_2,givenTree_2);
+						LikelihoodFunction siteLikelihood = (filteredData, codonTree,filteredData_2,codonTree_2);				
+						Optimize (site_res, siteLikelihood);
+					}
+					else
+					{
+						ClearConstraints (codonTree);
+						ReplicateConstraint("this1.?.synRate:=sRate*this2.?.t__",codonTree,givenTree);
+						ReplicateConstraint("this1.Node?.nonSynRate:=dNdS_I*this2.Node?.t__",codonTree,givenTree);
+						ReplicateConstraint("this1.?.nonSynRate:=dNdS_L*this2.?.t__",codonTree,givenTree);
+						LikelihoodFunction siteLikelihood = (filteredData, codonTree);				
+						Optimize (site_res, siteLikelihood);
+						sRate_2   = 0;
+						dNdS_2_I  = 0;
+						dNdS_2_L  = 0;
+					}
+				}
+				else
+				{
+					ClearConstraints (codonTree_2);
+					ReplicateConstraint("this1.?.synRate:=sRate_2*this2.?.t__",codonTree_2,givenTree_2);
+					ReplicateConstraint("this1.Node?.nonSynRate:=dNdS_2_I*this2.Node?.t__",codonTree_2,givenTree_2);
+					ReplicateConstraint("this1.?.nonSynRate:=dNdS_2_L*this2.?.t__",codonTree_2,givenTree_2);
+					LikelihoodFunction siteLikelihood = (filteredData_2,codonTree_2);				
+					Optimize (site_res, siteLikelihood);				
+					sRate   = 0;
+					dNdS_I  = 0;
+					dNdS_L  = 0;
+				}
+				
+				doneSites[siteMap][0] = sRate;
+				doneSites[siteMap][1] = dNdS_I;
+				doneSites[siteMap][2] = dNdS_L;
+				doneSites[siteMap][3] = sRate_2;
+				doneSites[siteMap][4] = dNdS_2_I;
+				doneSites[siteMap][5] = dNdS_2_L;
+
+				sRate   = 1;
+				sRate_2 = 1;
+				dNdS_I  = 1;
+				dNdS_L  = 1;
+				dNdS_2_L= 1;
+				
+				ClearConstraints (codonTree);
+				ReplicateConstraint("this1.?.synRate:=sRate*this2.?.t__",codonTree,givenTree);
+				ReplicateConstraint("this1.Node?.nonSynRate:=dNdS_I*sRate*this2.Node?.t__",codonTree,givenTree);
+				ReplicateConstraint("this1.?.nonSynRate:=dNdS_L*this2.?.t__",codonTree,givenTree);
+				ClearConstraints (codonTree_2);
+				ReplicateConstraint("this1.?.synRate:=sRate_2*this2.?.t__",codonTree_2,givenTree_2);
+				ReplicateConstraint("this1.Node?.nonSynRate:=dNdS_I*sRate_2*this2.Node?.t__",codonTree_2,givenTree_2);
+				ReplicateConstraint("this1.?.nonSynRate:=dNdS_2_L*this2.?.t__",codonTree_2,givenTree_2);
+
+				Optimize (site_resN, siteLikelihood);
+				doneSites[siteMap][6] = sRate;
+				doneSites[siteMap][7] = sRate_2;
+				doneSites[siteMap][8] = dNdS_I;
+				doneSites[siteMap][9] = dNdS_L;
+				doneSites[siteMap][10] = dNdS_2_L;
+				doneSites[siteMap][11] = 2*(site_res[1][0]-site_resN[1][0]);
+				doneSites[siteMap][12] = 1-CChi2(doneSites[siteMap][11],1);
+		
+			}
+			else
+			{
+				doneSites[siteMap][11] = 0;
+				doneSites[siteMap][12] = 1;					
+			}					
+			donePairs [mapKey] = siteCount+1;
+			ReportSite2 (siteCount, siteCount);	
+		}
+		else
+		{
+			dummy = ReportSite2 (siteCount, mapIndex-1);				 
+		}
+	}	
+}
+else
+{
+	MPINodeState = {MPI_NODE_COUNT-1,3};
+	for (siteCount = 0; siteCount < nucData.sites/3; siteCount = siteCount+1)
+	{
+		siteMap   = dupInfo[siteCount];
+		siteMap_2 = dupInfo_2[siteCount];
+		mapKey = ""+siteMap+","+siteMap_2;		
+		mapIndex = donePairs[mapKey];
+		
+		if (mapIndex == 0)
+		{
+			
+			filterString = "";
+			filterString = filterString + (siteCount*3) + "-" + (siteCount*3+2);
+			DataSetFilter filteredData   = CreateFilter (jointDS,3,filterString,speciesIndex<nucData.species,GeneticCodeExclusions);
+			DataSetFilter filteredData_2 = CreateFilter (jointDS,3,filterString,speciesIndex>=nucData.species,GeneticCodeExclusions);
+			
+			HarvestFrequencies (f1, filteredData, 3, 3, 0);
+			m1 = 0;
+			for (mpiNode=0; mpiNode < 64; mpiNode=mpiNode+1)
+			{
+				if (f1[mpiNode]>0)
+				{
+					m1=m1+1;
+				}
+			}
+			
+			/* check to see if the site is constant in the first data set */
+			HarvestFrequencies (f1, filteredData_2, 3, 3, 0);
+			m2 = 0;
+			for (mpiNode=0; mpiNode < 64; mpiNode=mpiNode+1)
+			{
+				if (f1[mpiNode]>0)
+				{
+					m2=m2+1;
+				}
+			}
+			
+			if (m1>1 || m2>1)
+			{
+				siteMap = siteCount;
+				sRate   = 1;
+				sRate_2 = 1;
+				dNdS_I   = 1;
+				dNdS_L   = 1;
+				dNdS_2_I = 1;
+				dNdS_2_L = 1;
+				
+				ClearConstraints (codonTree);
+				ReplicateConstraint("this1.?.synRate:=sRate*this2.?.t__",codonTree,givenTree);
+				ReplicateConstraint("this1.Node?.nonSynRate:=dNdS_I*this2.Node?.t__",codonTree,givenTree);
+				ReplicateConstraint("this1.?.nonSynRate:=dNdS_L*this2.?.t__",codonTree,givenTree);
+				ClearConstraints (codonTree_2);
+				ReplicateConstraint("this1.?.synRate:=sRate_2*this2.?.t__",codonTree_2,givenTree_2);
+				ReplicateConstraint("this1.Node?.nonSynRate:=dNdS_2_I*this2.Node?.t__",codonTree_2,givenTree_2);
+				ReplicateConstraint("this1.?.nonSynRate:=dNdS_2_L*this2.?.t__",codonTree_2,givenTree_2);
+				LikelihoodFunction siteLikelihood = (filteredData, codonTree,filteredData_2,codonTree_2);				
+
+				for (mpiNode = 0; mpiNode < MPI_NODE_COUNT-1; mpiNode = mpiNode+1)
+				{
+					if (MPINodeState[mpiNode][0]==0)
+					{
+						break;	
+					}
+				}
+				
+				if (mpiNode==MPI_NODE_COUNT-1)
+				{
+					mpiNode = ReceiveJobs2 (1,1);
+				}
+				else
+				{
+					MPISend (mpiNode+1,siteLikelihood);
+					MPINodeState[mpiNode][0] = 1;
+					MPINodeState[mpiNode][1] = siteCount;
+					MPINodeState[mpiNode][2] = 1;
+				}
+				
+				sRate   = 1;
+				sRate_2 = 1;
+				dNdS_I  = 1;
+				dNdS_L  = 1;
+				dNdS_2_L  = 1;
+				
+				ClearConstraints (codonTree);
+				ReplicateConstraint("this1.?.synRate:=sRate*this2.?.t__",codonTree,givenTree);
+				ReplicateConstraint("this1.Node?.nonSynRate:=dNdS_I*sRate*this2.Node?.t__",codonTree,givenTree);
+				ReplicateConstraint("this1.?.nonSynRate:=dNdS_L*this2.?.t__",codonTree,givenTree);
+				ClearConstraints (codonTree_2);
+				ReplicateConstraint("this1.?.synRate:=sRate_2*this2.?.t__",codonTree_2,givenTree_2);
+				ReplicateConstraint("this1.Node?.nonSynRate:=dNdS_I*sRate_2*this2.Node?.t__",codonTree_2,givenTree_2);
+				ReplicateConstraint("this1.?.nonSynRate:=dNdS_2_L*this2.?.t__",codonTree_2,givenTree_2);
+
+				DataSetFilter filteredData   = CreateFilter (jointDS,3,filterString,speciesIndex<nucData.species,GeneticCodeExclusions);
+				DataSetFilter filteredData_2 = CreateFilter (jointDS,3,filterString,speciesIndex>=nucData.species,GeneticCodeExclusions);
+				LikelihoodFunction siteLikelihood = (filteredData, codonTree,filteredData_2,codonTree_2);				
+
+				for (mpiNode = 0; mpiNode < MPI_NODE_COUNT-1; mpiNode = mpiNode+1)
+				{
+					if (MPINodeState[mpiNode][0]==0)
+					{
+						break;	
+					}
+				}
+				if (mpiNode==MPI_NODE_COUNT-1)
+				{
+					mpiNode = ReceiveJobs2 (1,0);
+				}
+				else
+				{
+					MPISend (mpiNode+1,siteLikelihood);
+					MPINodeState[mpiNode][0] = 1;
+					MPINodeState[mpiNode][1] = siteCount;
+					MPINodeState[mpiNode][2] = 0;
+				}
+				
+			}
+			else
+			{
+				doneSites[siteCount][11] = 0;
+				doneSites[siteCount][12] = 1;					
+				ReportSite2 (siteCount, siteCount);	
+			}					
+			donePairs [mapKey] = siteCount+1;
+		}
+		else
+		{
+			doneSites[siteCount][0] = -mapIndex;
+		}
+	}					
+	while (1)
+	{
+		for (nodeCounter = 0; nodeCounter < MPI_NODE_COUNT-1; nodeCounter = nodeCounter+1)
+		{
+			if (MPINodeState[nodeCounter][0]==1)
+			{
+				fromNode = ReceiveJobs2 (0,0);
+				break;	
+			}
+		}
+		if (nodeCounter == MPI_NODE_COUNT-1)
+		{
+			break;
+		}
+	}			
+			
+
+	fprintf (stdout, "\n\n\n");
+
+	for (siteCount = 0; siteCount < nucData.sites/3; siteCount = siteCount+1)
+	{
+		nodeCounter = doneSites[siteCount][0];
+		if (nodeCounter < (-0.5))
+		{
+			ReportSite2 (siteCount, -nodeCounter-1);	
+		} 
+		else
+		{
+			ReportSite2 (siteCount, siteCount);	
+		}			 
+	}
+}
+
+OpenWindow (CHARTWINDOW,{{"Pairwise Comparison Results"}
+					   {"labels"},
+					   {"doneSites"},
+					   {"Bar Chart"},
+					   {"Index"},
+					   {labels[10]},
+					   {"Site Index"},
+					   {""},
+					   {labels[10]},
+					   {"0"}},
+					   "SCREEN_WIDTH-60;SCREEN_HEIGHT-50;30;50");
+					   
+SetDialogPrompt ("Save site-by-site LRT results to:");
+
+fprintf (PROMPT_FOR_FILE,CLEAR_FILE,"dS 1,dN Internal 1,dN  Leaves 1,dS 2,dN Internal 2,dN Leaves 2,Joint dS 1,Joint dS 2,Joint dN Internal,Joint dN Leaves 1,Joint dN Leaves 2,LRT,p-value");
+
+dummy = Columns (doneSites);
+
+for (nodeCounter=0; nodeCounter < Rows (doneSites); nodeCounter = nodeCounter+1)
+{
+	fprintf (LAST_FILE_PATH,"\n",doneSites[nodeCounter][0]);
+	for (siteCount = 1; siteCount < dummy; siteCount = siteCount + 1)
+	{
+		fprintf (LAST_FILE_PATH,",",doneSites[nodeCounter][siteCount]);
+	}
+}
+
+MAXIMUM_ITERATIONS_PER_VARIABLE = smipv;
+
+donePairs = 0;
diff --git a/res/TemplateBatchFiles/ConvertDataFile.bf b/res/TemplateBatchFiles/ConvertDataFile.bf
new file mode 100644
index 0000000..e022e51
--- /dev/null
+++ b/res/TemplateBatchFiles/ConvertDataFile.bf
@@ -0,0 +1,57 @@
+SetDialogPrompt ("Please choose a data file to convert:");
+
+ChoiceList (SKIP_OMISSIONS,"Deletions",1,SKIP_NONE,"Keep Deletions","Deletions will NOT be filtered from the data.",
+			"Skip Deletions","Deletions will be pruned out and NOT included in the converted file.");
+
+
+if (SKIP_OMISSIONS<0)
+{
+	fprintf (stdout, "\n\nExecution Canceled...");
+}
+
+DataSet bigDataSet = ReadDataFile (PROMPT_FOR_FILE);
+
+if (IS_TREE_PRESENT_IN_DATA)
+{
+	fprintf (stdout, "\nTree In Data:", DATAFILE_TREE);
+}
+DataSetFilter dsf = CreateFilter (bigDataSet,1);
+
+fprintf (stdout, "\nRead:\n", bigDataSet);
+
+
+ChoiceList (DATA_FILE_PRINT_FORMAT,"Output Format",1,SKIP_NONE,
+            /* 0 */ "# sequential","Sequential format with taxa names preceded by #",
+			/* 1 */ "# interleaved","Interleaved format with taxa names preceded by #",
+			/* 2 */ "PHYLIP sequential","PHYLIP Sequential Format. Taxa names are chopped at 10 characters.",
+			/* 3 */ "PHYLIP interleaved","PHYLIP Interleaved Format. Taxa names are chopped at 10 characters.",
+			/* 4 */ "NEXUS sequential, labels","NEXUS sequential format with taxa labels present in the data matrix.",
+			/* 5 */ "NEXUS interleaved, labels","NEXUS interleaved format with taxa labels present in the data matrix.",
+			/* 6 */ "NEXUS sequential, no labels","NEXUS sequential format without taxa labels in the data matrix.",
+			/* 7 */ "NEXUS interleaved, no labels","NEXUS interleaved format without taxa labels in the data matrix.",
+			/* 8 */ "CSV", "Comma separated characters",
+			/* 9 */ "FASTA sequential","FASTA Sequential Format.",
+			/* 10 */ "FASTA interleaved","FASTA Interleaved Format.",
+			/* 11 */ "PAML compatible", "PAML Compatible PHYLIP-like format");
+			
+if (DATA_FILE_PRINT_FORMAT<0)
+{
+	fprintf (stdout, "\n\nExecution Canceled...");
+}
+else
+{
+	if (DATA_FILE_PRINT_FORMAT%2 && DATA_FILE_PRINT_FORMAT < 8 || DATA_FILE_PRINT_FORMAT == 10)
+	{
+		fprintf (stdout,"\n How many sites per line in interleaved file:");
+		fscanf  (stdin, "Number", DATA_FILE_DEFAULT_WIDTH);
+		if (DATA_FILE_PRINT_FORMAT<4)
+		{
+			fprintf (stdout,"\n How many sites per cluster:");
+			fscanf  (stdin, "Number", DATA_FILE_GAP_WIDTH);
+		}
+	}
+	
+
+	SetDialogPrompt ("Write to file:");
+	fprintf (PROMPT_FOR_FILE, CLEAR_FILE, dsf);
+}
diff --git a/res/TemplateBatchFiles/DatedTipsMolecularClock.bf b/res/TemplateBatchFiles/DatedTipsMolecularClock.bf
new file mode 100644
index 0000000..6011fe8
--- /dev/null
+++ b/res/TemplateBatchFiles/DatedTipsMolecularClock.bf
@@ -0,0 +1,598 @@
+RequireVersion ("2.0020110101");
+VERBOSITY_LEVEL = -1;
+
+
+LoadFunctionLibrary ("TreeTools");
+ExecuteAFile 		("_tipDater.ibf");
+
+
+/*-----------------------------------------------------------*/
+
+function generateDatedTipConstraints (treeNameID, parameterToConstrain, tipDateAVL, rateAVL, initialGuesses)
+{
+	DT_String = "";
+	DT_String * 8192;
+	
+
+	treePostOrderAVL = Eval(treeNameID+"^0");
+	treePreOrderAVL  = Eval(treeNameID+"^1");
+	internalNodeCount = Eval("BranchCount(`treeNameID`)");
+	nodeCount        =  Abs(treePostOrderAVL);
+	
+	rateAVL          = {};
+	doneAssignment   = {};
+
+    // define separate global variables for each rate class (currently not used)
+	for (nodeIndex = 0; nodeIndex < nodeCount-1; nodeIndex += 1)
+	{
+		aRate = rateAVL[nodeIndex];
+		if (doneAssignment[aRate] == 0)
+		{
+			doneAssignment[aRate] = 1;
+			DT_String * ("global "+treeNameID+"_scaler_"+aRate+" = 1.0;\n"+treeNameID+"_scaler_"+aRate+"_ :> 0.0;\n");
+		}
+	}
+
+	timeStops				  = {};
+    
+    
+
+	for (nodeIndex = 1; nodeIndex < nodeCount; nodeIndex += 1)
+	{
+		nodeInfo 	= treePostOrderAVL[nodeIndex];
+		nodeNameS	= nodeInfo["Name"];
+		timeStops[nodeNameS] = 1e100;
+	
+		if (Abs(nodeInfo["Children"]))
+		{
+			DT_String * ("\n\n`treeNameID`.`nodeNameS`.T = 1;\n`treeNameID`.`nodeNameS`.T:>(0);\n");
+			if (Abs(nodeInfo["Parent"]) == 0)
+			{
+				
+				if (minV > 0)
+				{
+					minV = minV/2;
+				}
+				else
+				{
+					minV = minV*2;
+				}
+                
+				DT_String * ("`treeNameID`.`nodeNameS`.T = " + minV + ";");
+				timeStops[nodeNameS] = minV;
+			}
+			else
+			{
+				DT_String * ("`treeNameID`.`nodeNameS`.BL = 0.0001;\n`treeNameID`.`nodeNameS`.BL :> 0;\n");
+			}
+		}
+		else
+		{
+			treePostOrderAVL[nodeIndex] = nodeInfo;
+		}
+	}
+	
+	descendantsList 		  = {};
+	
+    PARAMETER_GROUPING = {internalNodeCount,1};
+    PARAMETER_GROUPING [0] = "";
+    internalsHit = 0;
+	for (nodeIndex = 1; nodeIndex < nodeCount; nodeIndex += 1)
+	{
+		nodeInfo 	= treePostOrderAVL[nodeIndex];
+		nodeNameS	= nodeInfo["Name"];
+		nodeParent = nodeInfo["Parent"];
+		if (nodeParent)
+		{
+			parentNodeID = nodeParent;
+			nodeParent = treePostOrderAVL[nodeParent];
+		}
+		if (Abs(nodeParent))
+		{
+			treePostOrderAVL[parentNodeID] = nodeParent;
+			pName    = nodeParent["Name"];
+			insIndex = Abs (descendantsList[pName]);
+			if (insIndex == 0)
+			{
+				descendantsList[pName] = {};
+			}
+			
+			rateClass = rateAVL[nodeIndex-1];
+						
+			if (Abs(nodeInfo["Children"]))
+			{
+			    PARAMETER_GROUPING [internalsHit] =  "`treeNameID`.`nodeNameS`.BL";
+			    internalsHit += 1;
+				DT_String * ("\n`treeNameID`.`nodeNameS`.`parameterToConstrain`:=`treeNameID`_scaler_"+rateClass+"*("+
+							 "`treeNameID`.`nodeNameS`.BL);\n`treeNameID`.`nodeNameS`.T:=`treeNameID`."+nodeParent["Name"]+".T+`treeNameID`."+nodeNameS+".BL;\n");
+							 
+				(descendantsList[pName])[insIndex] = treeNameID+"."+nodeNameS+".T";
+				timeStops[pName] = Min (timeStops[pName],timeStops[nodeNameS]);
+			}
+			else
+			{
+				DT_String * ("\n" + treeNameID+"."+nodeNameS+"."+parameterToConstrain+":="+treeNameID+"_scaler_"+rateClass+"*("+
+							 tipDateAVL[nodeNameS]+"-"+treeNameID+"."+nodeParent["Name"]+".T);\n");			
+				(descendantsList[pName])[insIndex] = tipDateAVL[nodeNameS];
+				timeStops[pName] = Min (timeStops[pName],tipDateAVL[nodeNameS]);
+			}
+		}
+	}
+	
+	fprintf (stdout, PARAMETER_GROUPING, "\n");
+	PARAMETER_GROUPING = {"0": PARAMETER_GROUPING};
+	
+	for (nodeIndex = 1; nodeIndex < nodeCount; nodeIndex = nodeIndex+1)
+	{
+		nodeInfo 	= treePreOrderAVL[nodeIndex];
+		if (Abs(nodeInfo["Children"]) && Abs (nodeInfo["Parent"]))
+		{
+			nodeNameS	= nodeInfo["Name"];
+			pName		= timeStops[(treePreOrderAVL[(nodeInfo["Parent"])])["Name"]];
+    
+    
+            rateClass = initialGuesses[nodeNameS] - pName;
+            
+            fprintf (stdout, nodeNameS, " initial guess = ", initialGuesses[nodeNameS], ":", rateClass, "\n");
+
+            if (rateClass < 0 || initialGuesses[nodeNameS] >= timeStops[nodeNameS])
+            {
+                rateClass = Random(0.2,0.8)*(timeStops[nodeNameS] - pName);
+            }
+			DT_String * (treeNameID+"."+nodeNameS+".BL = " + rateClass + ";\n");
+			timeStops[nodeNameS] = pName + rateClass;			
+		}
+	}
+
+
+	rateClass 			= Rows (descendantsList); 
+	minTimeByNode		= {};
+	
+	for (nodeIndex = 0; nodeIndex < Columns (rateClass); nodeIndex = nodeIndex + 1)
+	{
+		pName 				= rateClass[nodeIndex];
+		nodePT				= descendantsList[pName];
+		doneAssignment		= 1e100;
+		
+		for (nodeInfo = 0; nodeInfo< Abs (nodePT); nodeInfo = nodeInfo + 1)
+		{
+			nodeNameS = nodePT[nodeInfo];
+			if (Type (nodeNameS) == "Number")
+			{
+				doneAssignment = Min (doneAssignment, nodeNameS);
+			}
+			else
+			{
+				break;
+			}
+		}
+		minTimeByNode[pName]= doneAssignment;
+	}
+
+	for (nodeIndex = 1; nodeIndex < nodeCount; nodeIndex = nodeIndex+1)
+	{
+		nodeInfo 	= treePostOrderAVL[nodeIndex];
+		if (Abs(nodeInfo["Children"]) )
+		{
+			nodeNameS	= nodeInfo["Name"];
+			if (Abs (nodeInfo["Parent"]))
+			{
+				pName		= (treePostOrderAVL[nodeInfo["Parent"]])["Name"];
+				minTimeByNode[pName] = Min(minTimeByNode[pName], minTimeByNode[nodeNameS]);
+			}
+			
+			DT_String * (treeNameID+"."+nodeNameS+".T:<"+minTimeByNode[nodeNameS]+";\n");
+		}
+	}
+	
+	if (initialGuesses["Root"] > 0.0)
+	{
+	    DT_String * ("\n`treeNameID`.Node0.T = 0.5*" + initialGuesses["Root"] + ";");
+ 	}
+ 	else
+ 	{
+	    DT_String * ("\n`treeNameID`.Node0.T = 2.0*" + initialGuesses["Root"] + ";");
+
+ 	}
+ 	DT_String * 0;
+ 	fprintf (stdout, DT_String, "\n");
+ 	 	
+	return DT_String;
+}
+
+/*-----------------------------------------------------------*/
+
+function generateBLVector (treeNameID)
+{
+	ExecuteCommands ("treePostOrderAVL = "+treeNameID+"^0;");
+	_blVector = {};
+		
+	for (nodeIndex = 1; nodeIndex < nodeCount; nodeIndex = nodeIndex+1)
+	{
+		nodeInfo 	= treePostOrderAVL[nodeIndex];
+		nodeNameS	= nodeInfo["Name"];
+		nodeParent = nodeInfo["Parent"];
+		if (nodeParent)
+		{
+			parentNodeID = nodeParent;
+			nodeParent = treePostOrderAVL[nodeParent];
+		}
+		if (Abs(nodeParent))
+		{
+			pName    = nodeParent["Name"];
+			if (Abs(nodeInfo["Children"]))
+			{
+				ExecuteCommands ("_thisBL = `treeNameID`.`nodeNameS`.BL;tipDateAVL[\"`nodeNameS`\"]=`treeNameID`.`nodeNameS`.T;");
+			}
+			else
+			{
+				ExecuteCommands ("_thisBL = "+ tipDateAVL[nodeNameS] +" -" + treeNameID+"."+pName+".T;");			
+			}
+			_blVector [nodeNameS] = _thisBL;
+		}
+	}
+	
+	
+	return _blVector;
+}
+
+/*-----------------------------------------------------------*/
+
+
+_DO_TREE_REBALANCE_ = 0;
+
+
+fprintf(stdout,"\n ---- RUNNING MOLECULAR CLOCK ANALYSIS WITH DATED TIPS---- \n",
+			   "The underlying methodology developed by Andrew Rambaut is discussed \nin Bioinformatics 16(4): 395-399\n" );
+
+ChoiceList (dataType,"Data type",1,SKIP_NONE,"Nucleotide/Protein","Nucleotide or amino-acid (protein).",
+				     "Codon","Codon (several available genetic codes).");
+
+if (dataType<0) 
+{
+	return;
+}
+
+if (dataType == 1)
+{
+	LoadFunctionLibrary ("chooseGeneticCode");
+}
+
+SetDialogPrompt ("Choose the data file:");
+DataSet ds = ReadDataFile (PROMPT_FOR_FILE);
+fprintf (stdout,"The following data were read:\n",ds,"\n");
+
+byPosition = 0;
+
+if (dataType)
+{
+	DataSetFilter filteredData = CreateFilter (ds,3,"","",GeneticCodeExclusions);
+}
+else
+{
+	DataSetFilter filteredData = CreateFilter (ds,1);
+	GetDataInfo (_charHandles, filteredData, "CHARACTERS");
+	if (Columns (_charHandles) == 4)
+	{
+		ChoiceList (byPosition,"By codon position",1,SKIP_NONE,"Single Partition","Do not split the alignment into codon positions.",
+				    		   "Three Partitions","Allow each codon position to evolve at its own rates");
+
+		if (byPosition<0) 
+		{
+			return;
+		}
+	}
+}
+
+
+LoadFunctionLibrary ("queryTree");
+
+UseModel 		 		 (USE_NO_MODEL);
+Tree			 		 aTree = treeString;
+
+
+ChoiceList			   (df, "Date Format", 1, SKIP_NONE,
+							"TipDate","Taxon names include sampling dates, e.g. ((s1_85,s2_90),t_83)",
+							"Branch Lengths", "Branch lengths are the sampling dates, e.g. ((s1:85,s2:90),t:83)");
+
+if (df<0)
+{
+	return 0;
+}			
+else
+{	
+    tipDateAVL = Eval ("getTipDatesFromNames" + (df+1) + "(\"aTree\")");
+}
+
+if (Abs(tipDateAVL) == 0)
+{
+	fprintf (stdout, "\nERROR: Input tree must contain date information in the chosen format for all sequences.\n",
+					  "Branch lengths for internal nodes are ignored.\n");
+	return 0;
+}
+
+fprintf (stdout, "What units are the dates measured in (e.g. months; this is only used for reporting the results):");
+fscanf  (stdin,   "String", dateUnit);
+
+fprintf (stdout, "Read the following dates: \n");
+seqNames = Rows (tipDateAVL);
+for (sid = 0; sid < Columns (seqNames); sid += 1)
+{
+    fprintf (stdout, seqNames[sid], ":\t", retAVL[seqNames[sid]]/maxV,"\t",dateUnit,"\n");
+}
+
+
+
+SelectTemplateModel		(filteredData);
+Tree					 givenTree = treeString;
+
+if (byPosition)
+{
+	DataSetFilter filteredData  = CreateFilter (ds,1,"<100>");
+	DataSetFilter filteredData2 = CreateFilter (ds,1,"<010>");
+	DataSetFilter filteredData3 = CreateFilter (ds,1,"<001>");
+
+	Tree givenTree2 = treeString;
+	Tree givenTree3 = treeString;
+	global			T_Scale_2 = 1;
+	global			T_Scale_3 = 1;
+	ReplicateConstraint ("this1.?.?:=T_Scale_2*this2.?.?", givenTree2, givenTree);
+	ReplicateConstraint ("this1.?.?:=T_Scale_3*this2.?.?", givenTree3, givenTree);
+}
+
+
+parameter2Constrain = 0;
+
+ACCEPT_ROOTED_TREES = 1;
+Tree clockTree = treeString;
+
+if (byPosition)
+{
+	Tree clockTree2 = treeString;
+	Tree clockTree3 = treeString;
+	global			TC_Scale_2 = 1;
+	global			TC_Scale_3 = 1;
+	ReplicateConstraint ("this1.?.?:=TC_Scale_2*this2.?.?", clockTree2, clockTree);
+	ReplicateConstraint ("this1.?.?:=TC_Scale_3*this2.?.?", clockTree3, clockTree);
+
+}
+ACCEPT_ROOTED_TREES = 0;
+
+if (Rows("LAST_MODEL_PARAMETER_LIST")>1)
+{
+	ChoiceList (parameter2Constrain, "Parameter(s) to constrain:",1,SKIP_NONE,LAST_MODEL_PARAMETER_LIST);
+
+	if (parameter2Constrain<0)
+	{
+		return;
+	}
+	if (parameter2Constrain==0)
+	{
+		parameter2ConstrainString = "";
+		for (parameter2Constrain=Rows("LAST_MODEL_PARAMETER_LIST")-1; parameter2Constrain; parameter2Constrain = parameter2Constrain-1)
+		{
+			GetString (funnyString,LAST_MODEL_PARAMETER_LIST,parameter2Constrain);
+			parameter2ConstrainString = parameter2ConstrainString + funnyString + ",";
+		}
+		GetString (funnyString,LAST_MODEL_PARAMETER_LIST,0);
+		parameter2ConstrainString = parameter2ConstrainString + funnyString;
+	}
+	else
+	{
+		GetString (parameter2ConstrainString,LAST_MODEL_PARAMETER_LIST,parameter2Constrain-1);
+	}
+}
+else
+{
+	GetString (parameter2ConstrainString,LAST_MODEL_PARAMETER_LIST,0);	
+}
+
+
+
+timer = Time(0);
+if (byPosition)
+{
+	LikelihoodFunction lf = (filteredData,givenTree,filteredData2,givenTree2,filteredData3,givenTree3);
+}
+else
+{
+	LikelihoodFunction lf = (filteredData,givenTree);
+}
+Optimize (res,lf);
+
+
+
+separator = "*-----------------------------------------------------------*";
+
+fprintf (stdout, "\nCPU time taken: ", Time(0)-timer, " seconds.\n");
+fprintf (stdout, "\n", separator, "\nRESULTS WITHOUT THE CLOCK CONSTRAINT:\n",lf);
+
+fullModelLik = res[1][0];
+fullVars 	 = res[1][1];
+
+returnAVL = {"Free Log(L)": fullModelLik,
+			 "Free degrees of freedom": fullVars};
+
+
+/* now specify the constraint */
+
+_initialGuesses = PathDistanceToRoot (givenTree^0, "");
+
+// SLKP -- this needs to be updated to deal with partitions 
+
+linearXY = {filteredData.species, 2};
+
+//--------------------------------------------------------------------------
+
+function popXY (key,value)
+{
+    linearXY [_k][1] = value;
+    linearXY [_k][0] = _initialGuesses[key];
+    _k += 1;
+    return 0;
+}
+
+//--------------------------------------------------------------------------
+
+_k = 0;
+tipDateAVL["popXY"][""];
+
+LoadFunctionLibrary ("ProbabilityDistributions");
+
+lfit           = linearFit (linearXY);
+ExecuteCommands ("predictor:="+lfit["Slope"]+"*d+"+lfit["Intercept"]);
+
+for (k = 0; k < Abs (_initialGuesses); k += 1)
+{
+    d = _initialGuesses [_initialGuesses["INDEXORDER"][k]];
+    _initialGuesses [_initialGuesses["INDEXORDER"][k]] = predictor;
+}
+
+d = 0;
+_initialGuesses["Root"] = predictor;
+
+ExecuteCommands (generateDatedTipConstraints  ("clockTree",parameter2ConstrainString,tipDateAVL,0,_initialGuesses));
+
+if (byPosition)
+{
+	LikelihoodFunction lfConstrained = (filteredData,clockTree,filteredData2,clockTree2,filteredData3,clockTree3);
+}
+else
+{
+	LikelihoodFunction lfConstrained = (filteredData, clockTree);
+}
+
+
+sud  	= USE_DISTANCES;
+sulr 	= USE_LAST_RESULTS;
+slfo	= LIKELIHOOD_FUNCTION_OUTPUT;
+
+USE_DISTANCES 	 				= 0;
+USE_LAST_RESULTS 				= 1;
+LIKELIHOOD_FUNCTION_OUTPUT		= 0;
+
+timer = Time(0);
+
+VERBOSITY_LEVEL = 10;
+OPTIMIZATION_METHOD = 0;
+
+Optimize (res1,lfConstrained);
+
+
+fprintf (stdout, "\n", separator,"\n\nRESULTS WITH DATED TIPS CLOCK:\nLog-likelihood: ",lfConstrained);
+lnLikDiff = 2(fullModelLik-res1[1][0]);
+degFDiff = fullVars - res1[1][1];
+fprintf (stdout, "\nCPU time taken: ", Time(0)-timer, " seconds.\n");
+
+fprintf (stdout, "\n", separator,"\n\n-2(Ln Likelihood Ratio)=",lnLikDiff,"\n","Constrained parameters:",Format(degFDiff,0,0));
+P = 1-CChi2(lnLikDiff,degFDiff);
+fprintf (stdout, "\nAsymptotic p-value:",P);
+
+
+returnAVL ["Clock Log(L)"] = res1[1][0];
+returnAVL ["Clock degrees of freedom"] = res1[1][1];
+returnAVL ["P"] = P;
+
+ExecuteCommands ("rateEstimate=clockTree_scaler_0*maxV;");
+COVARIANCE_PARAMETER = "clockTree_scaler_0";
+COVARIANCE_PRECISION = 0.95;
+CovarianceMatrix (cmx,lfConstrained);
+
+
+/* convert to branch lengths */
+
+bls 	= BranchLength (clockTree, -1);
+tbc		= Columns 	   (bls);
+bns 	= BranchName   (clockTree, -1);
+btms	= {tbc,1};
+ttl		= (bls*Transpose (bls["1"]))[0];
+trl		= 0;
+blv		= generateBLVector ("clockTree");
+
+bScaleFactor = 0;
+scaledBT	 = {tbc-1,1};
+chartLabels  = {1,2};
+DT_String * 128;
+DT_String * "Node";
+for (k=0; k<tbc-1; k=k+1)
+{
+	nodeNameS 			  = bns[k];
+	blv[nodeNameS]  	  = blv[nodeNameS]/maxV;
+	trl 	  			  = trl + blv[nodeNameS];
+	scaledBT[k]			  = tipDateAVL[nodeNameS]/maxV;
+	DT_String * (";" + nodeNameS);
+}
+
+DT_String * 0;
+chartLabels [0] = "Date (" + dateUnit + ")";
+chartLabels [1] = DT_String;
+bScaleFactor 	= ttl/trl;
+
+OpenWindow (CHARTWINDOW,{{"Inferred Dates"}
+		{"chartLabels"}
+		{"scaledBT"}
+		{"None"}
+		{"Index"}
+		{"None"}
+		{""}
+		{""}
+		{""}
+		{"0"}
+		{""}
+		{"0;0"}
+		{"10;1.309;0.785398"}
+		{"Times:12:0;Times:10:0;Times:12:2"}
+		{"0;0;13816530;16777215;0;0;6579300;11842740;13158600;14474460;0;3947580;16777215;15670812;6845928;16771158;2984993;9199669;7018159;1460610;16748822;11184810;14173291"}
+		{"16,0,0"}
+		},
+		"735;540;70;70");
+		
+datedTree = PostOrderAVL2StringDistances (treePostOrderAVL,blv);
+
+returnAVL ["Dated Tree"] = datedTree;
+
+UseModel (USE_NO_MODEL);
+ACCEPT_ROOTED_TREES = 1;
+Tree	dT = datedTree;
+ACCEPT_ROOTED_TREES = 0;
+
+COVARIANCE_PARAMETER = "clockTree.Node0.T";
+COVARIANCE_PRECISION = 0.95;
+CovarianceMatrix (cmxT0,lfConstrained);
+cmxT0 = cmxT0 * (1/maxV);
+
+fprintf (stdout, "\nTree with branch lengths scaled in ",dateUnit,":\n",datedTree, "\n");
+fprintf (stdout, "\nRoot of the tree placed at ", cmxT0[1], "(95% CI: ", cmxT0[0],",", cmxT0[2],") ", dateUnit, "\n");
+
+returnAVL ["Root"] = cmxT0[1];
+returnAVL ["Root lower bound"] = cmxT0[0];
+returnAVL ["Root upper bound"] = cmxT0[2];
+
+if (byPosition)
+{
+	fprintf (stdout, "\nSubstitution rate for the first codon position estimated at ", bScaleFactor, "(95% CI: ", cmx[0]/rateEstimate*bScaleFactor,",", cmx[2]/rateEstimate*bScaleFactor,") subs per ",dateUnit," per site\n");
+	fprintf (stdout, "Substitution rate for the second codon position estimated at ", TC_Scale_2*bScaleFactor, "(95% CI: ", TC_Scale_2*cmx[0]/rateEstimate*bScaleFactor,",", TC_Scale_2*cmx[2]/rateEstimate*bScaleFactor,") subs per ",dateUnit," per site\n");
+	fprintf (stdout, "Substitution rate for the third codon position estimated at ", TC_Scale_3*bScaleFactor, "(95% CI: ", TC_Scale_3*cmx[0]/rateEstimate*bScaleFactor,",", TC_Scale_3*cmx[2]/rateEstimate*bScaleFactor,") subs per ",dateUnit," per site\n");
+}
+else
+{
+	fprintf (stdout, "\nSubstitution rate estimated at ", bScaleFactor, "(95% CI: ", maxV*cmx[0]/rateEstimate*bScaleFactor,",", maxV*cmx[2]/rateEstimate*bScaleFactor,") subs per ",dateUnit," per site\n");
+	returnAVL ["Rate"] = bScaleFactor;
+	returnAVL ["Rate lower bound"] = maxV*cmx[0]/rateEstimate*bScaleFactor;
+	returnAVL ["Rate upper bound"] = maxV*cmx[2]/rateEstimate*bScaleFactor;
+
+}
+mxTreeSpec = {5,1};
+mxTreeSpec [0] = "dT";
+mxTreeSpec [3] = "";
+mxTreeSpec [4] = "";
+mxTreeSpec [1] = "8211";
+mxTreeSpec [2] = "100,100,-300,-300,1";
+OpenWindow (TREEWINDOW, mxTreeSpec );
+
+VERBOSITY_LEVEL 				= 0;
+USE_DISTANCES 	 				= sud;
+USE_LAST_RESULTS 				= sulr;
+LIKELIHOOD_FUNCTION_OUTPUT		= slfo;
+
+return returnAVL;
diff --git a/res/TemplateBatchFiles/DirectionalREL.bf b/res/TemplateBatchFiles/DirectionalREL.bf
new file mode 100644
index 0000000..9996fd7
--- /dev/null
+++ b/res/TemplateBatchFiles/DirectionalREL.bf
@@ -0,0 +1,570 @@
+
+/* define an associative array with key = amino acid and value = integer
+	index for AA in alphabetical order */
+AAString    = "ACDEFGHIKLMNPQRSTVWY";
+
+AACharToIdx = {};		/* this is never used :-P */
+for (k=0; k<20; k=k+1)
+{
+	AACharToIdx [AAString[k]] = k;
+}
+
+SKIP_MODEL_PARAMETER_LIST = 0;
+
+#include "AddABias.ibf";
+#include "Utility/GrabBag.bf";
+
+test_p_values = {20,2};
+
+/*--------------------------------------------------------------------------------------------*/
+/*	
+	returns stationary distribution vector for amino acids
+	UNUSED?!?
+*/
+function GetEqFreqs (ModelMatrixName&, baseFreqs)
+{
+	t = 1;
+	
+	/* duplicate instantaneous rate parameterization from template  model */
+	numRateMx = ModelMatrixName;
+	
+	for (ri = 0; ri < 20; ri = ri+1)
+	{
+		for (ci = 0; ci < 20; ci = ci+1)
+		{
+			if (ri != ci)
+			{
+				/* multiply entries by base frequencies */
+				numRateMx[ri][ci] = numRateMx[ri][ci] * baseFreqs[ci];
+				
+				/* diagonal entry is sum of off-diagonal row entries (Markov process) */
+				numRateMx[ri][ri] = numRateMx[ri][ri] - numRateMx[ri][ci];
+			}
+		}
+	}
+	
+	
+	for (ri = 0; ri < 20; ri = ri+1)
+	{
+		numRateMx [ri][19] = 1;
+	}
+	numRateMxI = Inverse (numRateMx);
+	return numRateMxI [19][-1];
+}
+
+/*--------------------------------------------------------------------------------------------*/
+
+SetDialogPrompt ("Protein file to examine:");
+
+ChoiceList						(reloadFlag, "Reload/New", 1, SKIP_NONE, "New analysis","Start a new analysis",
+																	      "Reload","Reload a baseline protein fit.",
+																	      "Reprocess the results","Regenerate sites from model fits.");
+
+
+ACCEPT_ROOTED_TREES 			= 1;
+
+if (reloadFlag == 0)
+{
+	/* new analysis, fit baseline model */
+	
+	/* this should be a protein alignment */
+	DataSet			ds 			 = ReadDataFile (PROMPT_FOR_FILE);
+	basePath 					 = LAST_FILE_PATH;
+	DataSetFilter   filteredData = CreateFilter (ds,1);
+	
+	GetDataInfo		(checkCharacters, filteredData, "CHARACTERS");
+	if (Columns (checkCharacters) != 20)
+	{
+		fprintf (stdout, "ERROR: please ensure that the input alignment contains protein sequences");
+		return 0;
+	}
+	
+	/* from AddABias.ibf; select from one of several AA rate matrices estimated from
+		curated alignments (e.g., HIV within); by default, set rate variation to
+		adaptive 4-bin beta-gamma -- argument 0 skips dialog to set [pickATarget] */
+	
+	promptModel (0);
+	
+	
+	ExecuteAFile 					(HYPHY_LIB_DIRECTORY + "TemplateBatchFiles" + DIRECTORY_SEPARATOR + "queryTree.bf");
+	ChoiceList						(fixFB, "Fix Branch", 1, SKIP_NONE, "Unknown root","The character at the root of the tree is drawn from the stationary distribution",
+																		"Fix 1st sequence as root","The 1st sequence in the file (assumed to be a direct descendant of the root) is used to populate the root sequences.");
+	
+	
+	/* check if the tree is rooted */
+	
+	treeAVL  = givenTree^0;
+	rootNode = treeAVL[(treeAVL[0])["Root"]];
+	if (Abs(rootNode["Children"]) != 2)
+	{
+		fprintf (stdout, "ERROR: please ensure that the tree is rooted");
+		return 0;
+	}
+	root_left  = "givenTree." + (treeAVL[(rootNode["Children"])[0]])["Name"] + ".t";
+	root_right = "givenTree." + (treeAVL[(rootNode["Children"])[1]])["Name"] + ".t";
+	
+	if (fixFB>0)
+	{
+		/* branch to first sequence is collapsed to length zero;
+			enforcing identifiability with root sequence */
+		ExecuteCommands ("givenTree."+TipName(givenTree,0)+".t:=0");
+	}
+	else
+	{
+		if (fixFB < 0)
+		{
+			return 0;
+		}
+	}
+	
+	/* only the sum of branch lengths leading to two immediate descendants
+		of root can be estimated; this measure prevents one of the branches
+		from collapsing to zero length */
+	ExecuteCommands					(root_left + ":=" + root_right); 
+	
+	LikelihoodFunction lf 		= 	(filteredData, givenTree);
+	fprintf							(stdout, "[PHASE 0.1] Standard model fit\n"); 
+	
+	
+	VERBOSITY_LEVEL				= 1;
+	AUTO_PARALLELIZE_OPTIMIZE	= 1;
+	Optimize 						(res0,lf);
+	AUTO_PARALLELIZE_OPTIMIZE	= 0;
+	VERBOSITY_LEVEL				= -1;
+	
+	
+	/* export baseline model LF */
+	LIKELIHOOD_FUNCTION_OUTPUT = 7;
+	outPath = basePath + ".base";
+	fprintf (outPath, CLEAR_FILE, lf);
+	
+	baselineLogL				= res0[1][0];
+	
+}
+else
+{
+	/* import baseline LF from file */
+	modelNameString = "_customAAModelMatrix";
+	SetDialogPrompt ("Locate an existing fit:");
+	ExecuteAFile (PROMPT_FOR_FILE);
+	GetString (lfInfo,lf,-1);
+	if ((lfInfo["Models"])[0] == "mtREVModel")
+	{
+		modelNameString = "mtREVMatrix";	
+	}
+	bpSplit						 = splitFilePath (LAST_FILE_PATH);
+	basePath					 = bpSplit["DIRECTORY"] + bpSplit["FILENAME"];
+	outPath						 = basePath + ".base";
+	treeString 					 = Format (givenTree,0,0);	/* topology only, no branch lengths */
+
+	treeAVL  = givenTree^0;
+	rootNode = treeAVL[(treeAVL[0])["Root"]];
+	if (Abs(rootNode["Children"]) != 2)
+	{
+		fprintf (stdout, "ERROR: please ensure that the tree is rooted");
+		return 0;
+	}
+
+
+	ChoiceList						(fixFB, "Fix Branch", 1, SKIP_NONE, "Unknown root","The character at the root of the tree is drawn from the stationary distribution",
+																		"Fix 1st sequence as root","The 1st sequence in the file (assumed to be a direct descendant of the root) is used to populate the root sequences.");
+	if (fixFB>0)
+	{
+		ExecuteCommands ("givenTree."+TipName(givenTree,0)+".t:=0");
+	}
+	else
+	{
+		if (fixFB < 0)
+		{
+			return 0;
+		}
+	}
+	
+	LFCompute (lf,LF_START_COMPUTE);
+	LFCompute (lf,baselineLogL);
+	LFCompute (lf,LF_DONE_COMPUTE);
+}
+
+
+/* when the heck does biasedTree get called?  It's tucked inside runAFit() in AddABias.ibf... */
+root_left  = "biasedTree." + (treeAVL[(rootNode["Children"])[0]])["Name"] + ".t";
+root_right = "biasedTree." + (treeAVL[(rootNode["Children"])[1]])["Name"] + ".t";
+
+
+/* vector of branch lengths for entire tree */
+baselineBL						= BranchLength (givenTree,-1);
+
+referenceL						= (baselineBL * (Transpose(baselineBL)["1"]))[0];
+
+summaryPath					   = basePath+".summary";
+substitutionsPath			   = basePath+"_subs.csv";
+siteReportMap				   = basePath+"_bysite.csv";
+fprintf 						(summaryPath, CLEAR_FILE, KEEP_OPEN);
+fprintf							(stdout,      "[PHASE 0.2] Standard model fit. Log-L = ",baselineLogL,". Tree length = ",referenceL, " subs/site \n"); 
+fprintf							(summaryPath, "[PHASE 0.2] Standard model fit. Log-L = ",baselineLogL,". Tree length = ",referenceL, " subs/site \n"); 
+
+
+ExecuteAFile 					(HYPHY_LIB_DIRECTORY + "TemplateBatchFiles" + DIRECTORY_SEPARATOR + "Utility" + DIRECTORY_SEPARATOR + "GrabBag.bf");
+ExecuteAFile 					(HYPHY_LIB_DIRECTORY + "TemplateBatchFiles" + DIRECTORY_SEPARATOR + "Utility" + DIRECTORY_SEPARATOR + "AncestralMapper.bf");
+
+fixGlobalParameters ("lf");
+
+byResidueSummary = {};
+bySiteSummary	 = {};
+
+/*------------------------------------------------------------------------------*/
+
+if (MPI_NODE_COUNT > 1)
+{
+	MPINodeStatus = {MPI_NODE_COUNT-1,1}["-1"];
+}
+
+
+
+for (residue = 0; residue < 20; residue = residue + 1)
+{
+	if (reloadFlag == 2)	/* regenerate sites from results files */
+	{
+		lfb_MLES = {2,1};
+		ExecuteAFile (basePath + "." + AAString[residue]);
+		LFCompute (lfb,LF_START_COMPUTE);
+		LFCompute (lfb,res);
+		LFCompute (lfb,LF_DONE_COMPUTE);	
+		lfb_MLES [1][0] = res;
+		DoResults 						(residue);
+	}
+	else
+	{
+		AddABiasREL 					(modelNameString,"biasedMatrix",residue);	/* returns biasedMatrix object */
+		global P_bias2 					:= 1;
+		global relBias					:= 1;
+		
+		/* vectorOfFrequencies comes from Custom_AA_empirical.mdl, in turn imported from a file such as "HIVWithin" */
+		/* rate matrix is multiplied by this vector (third argument) */
+		Model							biasedModel = (biasedMatrix, vectorOfFrequencies, 1);
+		Tree							biasedTree = treeString;
+		global							treeScaler = 1;
+		
+		/* constrains tree to be congruent to that estimated under baseline model */
+		ReplicateConstraint 			("this1.?.?:=treeScaler*this2.?.?__",biasedTree,givenTree);
+		ExecuteCommands					(root_left + "=" + root_left);
+		ExecuteCommands					(root_right + "=" + root_right);
+		LikelihoodFunction lfb 		= 	(filteredData, biasedTree);
+		
+		
+		if (MPI_NODE_COUNT > 1)
+		{
+			SendAJob (residue);
+		}
+		else
+		{
+			Optimize 						(lfb_MLES,lfb);
+			DoResults 						(residue);
+		}
+	}
+}
+
+/*------------------------------------------------------------------------------*/
+
+if (MPI_NODE_COUNT > 1)
+{
+	jobsLeft = ({1,MPI_NODE_COUNT-1}["1"] * MPINodeStatus["_MATRIX_ELEMENT_VALUE_>=0"])[0];
+
+	for (nodeID = 0; nodeID < jobsLeft; nodeID = nodeID + 1)
+	{
+		MPIReceive (-1, fromNode, theJob);
+		oldRes = MPINodeStatus[fromNode-1];
+		ExecuteCommands (theJob);
+		DoResults (oldRes);	
+	}
+}
+
+/*------------------------------------------------------------------------------*/
+
+fprintf							(substitutionsPath, CLEAR_FILE, KEEP_OPEN, "Site,From,To,Count");
+fprintf							(siteReportMap,     CLEAR_FILE, KEEP_OPEN, "Site");
+for (k=0; k<20; k=k+1)
+{
+	fprintf (siteReportMap, ",", AAString[k]);
+}
+fprintf (siteReportMap, "\nLRT p-value"); 
+
+test_p_values       = test_p_values % 0;
+rejectedHypotheses   = {};
+
+for (k=0; k<20; k=k+1)
+{
+	pv      = (byResidueSummary[AAString[k]])["p"];
+	fprintf (siteReportMap, ",", pv);
+}
+
+fprintf (stdout, 	  "\nResidues (and p-values) for which there is evidence of directional selection\n");
+fprintf (summaryPath, "\nResidues (and p-values) for which there is evidence of directional selection");
+
+for (k=0; k<20; k=k+1)
+{
+	if (test_p_values[k][0] < (0.05/(20-k)))
+	{
+		rejectedHypotheses  [test_p_values[k][1]]           = 1;
+		rejectedHypotheses  [AAString[test_p_values[k][1]]] = 1;
+		fprintf (stdout, 		"\n\t", AAString[test_p_values[k][1]], " : ",test_p_values[k][0] );
+		fprintf (summaryPath, 	"\n\t", AAString[test_p_values[k][1]], " : ",test_p_values[k][0] );
+	}
+	else
+	{
+		break;
+	}
+}
+
+fprintf (stdout, 	  "\n");
+fprintf (summaryPath, "\n");
+
+
+ancCacheID 						= _buildAncestralCache ("lf", 0);
+outputcount						= 0;
+
+for (k=0; k<filteredData.sites; k=k+1)
+{
+	thisSite = _substitutionsBySite (ancCacheID,k);
+	
+	for (char1 = 0; char1 < 20; char1 = char1+1)
+	{
+		for (char2 = 0; char2 < 20; char2 = char2+1)
+		{
+			if (char1 != char2 && (thisSite["COUNTS"])[char1][char2])
+			{	
+				ccount = (thisSite["COUNTS"])[char1][char2];
+				fprintf (substitutionsPath, "\n", k+1, ",", AAString[char1], ",", AAString[char2], "," , ccount);
+			}
+		}
+	}
+	
+
+	if (Abs(bySiteSummary[k]))
+	{
+		fprintf (siteReportMap, "\n", k+1);
+		
+		didSomething = 0;
+		pv			 = 0;
+		for (k2=0; k2<20; k2=k2+1)
+		{
+			if (Abs((byResidueSummary[AAString[k2]])["BFs"]) == 0 || rejectedHypotheses[k2] == 0)
+			{
+				fprintf (siteReportMap, ",N/A");
+			}
+			else
+			{
+				thisSitePV = ((byResidueSummary[AAString[k2]])["BFs"])[k];
+				pv = Max(pv,thisSitePV);
+				fprintf (siteReportMap, ",", thisSitePV);			
+				if (pv > 100)
+				{
+					didSomething = 1;
+				}
+			}
+		}
+		
+		if (!didSomething)
+		{
+			continue;
+		}
+		
+		if (outputcount == 0)
+		{
+			outputcount = 1;
+			fprintf (stdout, 		"\nThe list of sites which show evidence of directional selection (Bayes Factor > 20)\n",
+							 		"together with the target residues and inferred substitution counts\n");
+			fprintf (summaryPath, 	"\nThe list of sites which show evidence of directional selection (Bayes Factor > 20)\n",
+							 		"together with the target residues and inferred substitution counts\n");
+		}	
+		fprintf (stdout,      "\nSite ", Format (k+1,8,0), " (max BF = ", pv, ")\n Preferred residues: ");
+		fprintf (summaryPath, "\nSite ", Format (k+1,8,0), " (max BF = ", pv, ")\n Preferred residues: ");
+		
+		
+		for (k2 = 0; k2 < Abs (bySiteSummary[k]); k2=k2+1)
+		{
+			thisChar = (bySiteSummary[k])[k2];
+			if (rejectedHypotheses[thisChar])
+			{
+				fprintf (stdout,      thisChar);
+				fprintf (summaryPath, thisChar);
+			}
+		}
+
+		fprintf (stdout,      	   "\n Substitution counts:");
+		fprintf (summaryPath,      "\n Substitution counts:");
+
+		for (char1 = 0; char1 < 20; char1 = char1+1)
+		{
+			for (char2 = char1+1; char2 < 20; char2 = char2+1)
+			{
+				ccount  = (thisSite["COUNTS"])[char1][char2];
+				ccount2 = (thisSite["COUNTS"])[char2][char1];
+				if (ccount+ccount2)
+				{	
+					fprintf (stdout, 	  "\n\t", AAString[char1], "->", AAString[char2], ":", Format (ccount, 5, 0), "/",
+											 AAString[char2], "->", AAString[char1], ":", Format (ccount2, 5, 0));
+					fprintf (summaryPath, "\n\t", AAString[char1], "->", AAString[char2], ":", Format (ccount, 5, 0), "/",
+											 AAString[char2], "->", AAString[char1], ":", Format (ccount2, 5, 0));
+				}
+			}
+		}
+
+	}
+}	
+
+_destroyAncestralCache 			(ancCacheID);
+fprintf (substitutionsPath, CLOSE_FILE);
+fprintf (summaryPath, 		CLOSE_FILE);
+fprintf (siteReportMap, 	CLOSE_FILE);
+fprintf (stdout, "\n");
+
+/*--------------------------------------------------------------------------------------------*/
+/* 
+	Compute the difference vector between the stationary distribution at the root (efv) and the expected
+	distribution of residues after time t0.
+*/
+function computeDelta (ModelMatrixName&, efv, t_0, which_cat)
+{
+	t   	= t_0;
+	c   	= 1;
+	catVar  = which_cat;
+	rmx 	= ModelMatrixName;
+	for (r=0; r<20; r=r+1)
+	{	
+		diag = 0;
+		for (c=0; c<20; c=c+1)
+		{
+			rmx[r][c] = rmx[r][c] * efv[c];
+			diag = diag - rmx[r][c];
+		}
+		rmx[r][r] = diag;
+	}
+	return Transpose(efv)*(Exp (rmx) - {20,20}["_MATRIX_ELEMENT_ROW_==_MATRIX_ELEMENT_COLUMN_"]);
+}
+
+/*------------------------------------------------------------------------------*/
+
+function SendAJob (residueIn)
+{
+	for (nodeID = 0; nodeID < MPI_NODE_COUNT -1; nodeID = nodeID + 1)
+	{
+		if (MPINodeStatus[nodeID] < 0)	/* semaphore indicates available node */
+		{
+			MPINodeStatus[nodeID] = residueIn;
+			MPISend (nodeID+1,lfb);
+			break;
+		}
+	}
+	if (nodeID == MPI_NODE_COUNT - 1)	/* looped through semaphore with no idle nodes */
+	{
+		MPIReceive (-1, fromNode, theJob);	/* wait until one of the node completes its job */
+		oldRes = MPINodeStatus[fromNode-1];
+		MPISend (fromNode,lfb);
+		MPINodeStatus[fromNode-1] = residueIn;
+		ExecuteCommands (theJob);	/* load serialized LF into master node memory */
+		DoResults (oldRes);
+	}
+	return 0;
+}
+
+/*------------------------------------------------------------------------------*/
+
+function DoResults (residueIn)
+{
+	residueC 					= 	AAString[residueIn];
+	fprintf							(stdout, "[PHASE ",residueIn+1,".1] Model biased for ",residueC,"\n"); 
+	fprintf							(summaryPath, "[PHASE ",residueIn+1,".1] Model biased for ",residueC,"\n"); 
+
+	pv							=   1-CChi2(2(lfb_MLES[1][0]-baselineLogL),3);	/* approximate p-value */
+	fprintf							(stdout, "[PHASE ",residueIn+1,".2] Finished with the model biased for ",residueC,". Log-L = ",Format(lfb_MLES[1][0],8,3),"\n"); 
+	fprintf							(summaryPath, "[PHASE ",residueIn+1,".2] Finished with the model biased for ",residueC,". Log-L = ",Format(lfb_MLES[1][0],8,3),"\n"); 
+	
+	fr1 						= 	P_bias;
+	
+	rateAccel1					=   (computeDelta("biasedMatrix",vectorOfFrequencies,referenceL,1))[residueIn];
+	
+	fprintf							(stdout, "\n\tBias term           = ", Format(rateBiasTo,8,3),
+											 "\n\tproportion          = ", Format(fr1,8,3),
+											 "\n\tExp freq increase   = ", Format(rateAccel1*100,8,3), "%",
+											 "\n\tp-value    = ", Format(pv,8,3),"\n");
+											 
+	fprintf							(summaryPath, "\n\tBias term           = ", Format(rateBiasTo,8,3),
+											 	  "\n\tproportion          = ", Format(fr1,8,3),
+											      "\n\tExp freq increase   = ", Format(rateAccel1*100,8,3), "%",
+											      "\n\tp-value    = ", Format(pv,8,3),"\n");
+	if (reloadFlag != 2)
+	{
+		LIKELIHOOD_FUNCTION_OUTPUT = 7;
+		outPath = basePath + "." + residueC;
+		fprintf (outPath, CLEAR_FILE, lfb);
+	}
+
+	byResidueSummary [residueC] = {};
+	(byResidueSummary [residueC])["p"] = pv;		
+
+	test_p_values [residueIn][0] = pv;
+	test_p_values [residueIn][1] = residueIn;
+
+	/*if (pv < 0.0025)*/
+	{
+		(byResidueSummary [residueC])["sites"] = {};		
+		(byResidueSummary [residueC])["BFs"]   = {};		
+		
+		ConstructCategoryMatrix (mmx,lfb,COMPLETE);
+		GetInformation			(catOrder, lfb);		
+		dim = Columns (mmx);
+		_MARGINAL_MATRIX_	= {2, dim};
+		
+		GetInformation 				(cInfo, c);
+		GetInformation 				(_CATEGORY_VARIABLE_CDF_, catVar);
+		
+		ccc	= Columns (cInfo);
+		
+		_CATEGORY_VARIABLE_CDF_ = _CATEGORY_VARIABLE_CDF_[1][-1];
+		if (catOrder [0] == "c")
+		{
+			for (k=0; k<dim; k=k+1)
+			{
+				for (k2 = 0; k2 < ccc; k2=k2+1)
+				{
+					_MARGINAL_MATRIX_ [0][k] = _MARGINAL_MATRIX_ [0][k] + mmx[2*k2][k]  *cInfo[1][k2];
+					_MARGINAL_MATRIX_ [1][k] = _MARGINAL_MATRIX_ [1][k] + mmx[2*k2+1][k]*cInfo[1][k2];
+				}
+			}
+		}
+		else
+		{
+			for (k=0; k<dim; k=k+1)
+			{
+				for (k2 = 0; k2 < ccc; k2=k2+1)
+				{
+					_MARGINAL_MATRIX_ [0][k] = _MARGINAL_MATRIX_ [0][k] + mmx[k2][k]*cInfo[1][k2];
+					_MARGINAL_MATRIX_ [1][k] = _MARGINAL_MATRIX_ [1][k] + mmx[ccc+k2][k]*cInfo[1][k2];
+				}
+			}
+		}
+		ExecuteAFile 					(HYPHY_LIB_DIRECTORY + "ChartAddIns" + DIRECTORY_SEPARATOR + "DistributionAddIns" + DIRECTORY_SEPARATOR + "Includes" + DIRECTORY_SEPARATOR + "posteriors.ibf");
+		
+		prior = (_CATEGORY_VARIABLE_CDF_[1])/(1-_CATEGORY_VARIABLE_CDF_[1]);
+				
+		for (k=0; k<dim; k=k+1)
+		{
+			bayesF = _MARGINAL_MATRIX_[1][k]/_MARGINAL_MATRIX_[0][k]/prior;
+			((byResidueSummary [residueC])["BFs"])[k] = bayesF;
+			if (bayesF > 100)
+			{
+				((byResidueSummary [residueC])["sites"])[Abs((byResidueSummary [residueC])["sites"])] = k+1;
+				if (Abs(bySiteSummary[k]) == 0)
+				{
+					bySiteSummary[k] = {};
+				}
+				(bySiteSummary[k])[Abs(bySiteSummary[k])] = residueC;
+			}
+		}
+		
+	}	
+	return 0;
+}
+
+
diff --git a/res/TemplateBatchFiles/DirectionalREL_MF.bf b/res/TemplateBatchFiles/DirectionalREL_MF.bf
new file mode 100644
index 0000000..90ba968
--- /dev/null
+++ b/res/TemplateBatchFiles/DirectionalREL_MF.bf
@@ -0,0 +1,523 @@
+BayesFactorCutoff = 20;
+
+AAString    = "ACDEFGHIKLMNPQRSTVWY";
+AACharToIdx = {};
+for (k=0; k<20; k=k+1)
+{
+	AACharToIdx [AAString[k]] = k;
+}
+
+SKIP_MODEL_PARAMETER_LIST = 0;
+
+#include "AddABias.ibf";
+
+test_p_values = {20,2};
+
+/*--------------------------------------------------------------------------------------------*/
+
+function GetEqFreqs (ModelMatrixName&, baseFreqs)
+{
+	t = 1;
+	numRateMx = ModelMatrixName;
+	for (ri = 0; ri < 20; ri = ri+1)
+	{
+		for (ci = 0; ci < 20; ci = ci+1)
+		{
+			if (ri != ci)
+			{
+				numRateMx[ri][ci] = numRateMx[ri][ci] * baseFreqs[ci];
+				numRateMx[ri][ri] = numRateMx[ri][ri] - numRateMx[ri][ci];
+			}
+		}
+	}
+	for (ri = 0; ri < 20; ri = ri+1)
+	{
+		numRateMx [ri][19] = 1;
+	}
+	numRateMxI = Inverse (numRateMx);
+	return numRateMxI [19][-1];
+}
+
+/*--------------------------------------------------------------------------------------------*/
+
+
+ChoiceList						(reloadFlag, "Reload/New", 1, SKIP_NONE, "New analysis","Start a new analysis",
+																	      "Reload","Reload a baseline protein fit.");
+
+ACCEPT_ROOTED_TREES 			= 1;
+
+if (reloadFlag == 0)
+{
+
+	SetDialogPrompt 			("File to examine:");
+	_doAAcids					= 1;
+	ExecuteAFile    			("_MFReader_.ibf");
+	ExecuteAFile				("TreeTools.ibf");
+	basePath 					 = LAST_FILE_PATH;
+
+	UseModel	    	(USE_NO_MODEL);
+	roots	= {};
+	for (k=0; k<fileCount; k=k+1)
+	{
+		Tree		  T = treeStrings[k+1];
+		roots[k]	    = selectATreeBranch ("T", "Choose a root for partition :" + (k+1));
+		
+		treeStrings [k+1] = RerootTree (T, roots[k]);
+	}
+	
+	SKIP_FREQ_HARVESTING = 1;
+	vectorOfFrequencies = overallFrequencies;
+	promptModel (0);
+	SKIP_FREQ_HARVESTING = 0;
+	populateTrees ("givenTree", fileCount);	
+	
+	ChoiceList						(fixFB, "Fix Branch", 1, SKIP_NONE, "Unknown root","The character at the root of the tree is drawn from the stationary distribution",
+																		"Fix rooting sequence as root","The rooting sequence in the file is used to populate the root sequences.");
+	if (fixFB>0)
+	{
+		for (k=0; k<fileCount; k=k+1)
+		{
+			ExecuteCommands ("givenTree_"+(k+1)+"."+roots[k]+".t:=0");
+		}
+	}
+	else
+	{
+		if (fixFB < 0)
+		{
+			return 0;
+		}
+	}
+	
+	ExecuteCommands (constructLF ("lf", "nucData", "givenTree", fileCount));
+	
+	fprintf							(stdout, "[PHASE 0.1] Standard model fit\n"); 
+	
+	VERBOSITY_LEVEL				= 1;
+	AUTO_PARALLELIZE_OPTIMIZE	= 1;
+	Optimize 						(res0,lf);
+	AUTO_PARALLELIZE_OPTIMIZE	= 0;
+	VERBOSITY_LEVEL				= -1;
+	
+	
+	LIKELIHOOD_FUNCTION_OUTPUT = 7;
+	outPath = basePath + ".base";
+	fprintf (outPath, CLEAR_FILE, lf);
+	
+	baselineLogL				= res0[1][0];
+	
+}
+else
+{
+	SetDialogPrompt ("Locate an existing fit:");
+	ExecuteAFile 				(PROMPT_FOR_FILE);
+	basePath 					 = LAST_FILE_PATH;
+	GetString					 (lfInfo, lf, -1);
+	fileCount 					= Columns(lfInfo["Trees"]);
+	ExecuteCommands 			 ("GetString	(modelInfo,"+(lfInfo["Models"])[0]+",-2);");
+	modelNameString = modelInfo["Matrix"];
+	treeStrings = {}; 
+	totalCodonCount = 0;
+	for (k=0; k<fileCount; k=k+1)
+	{
+		ExecuteCommands ("treeStrings [k+1] = Format(givenTree_"+(k+1)+",1,1);");
+		ExecuteCommands ("totalCodonCount = totalCodonCount + nucData_" + (k+1) + ".sites");
+	}
+	treeString = Format (givenTree,0,0);
+	LFCompute (lf,LF_START_COMPUTE);
+	LFCompute (lf,baselineLogL);
+	LFCompute (lf,LF_DONE_COMPUTE);
+	_runAsFunctionLibrary = 1;
+	ExecuteAFile    			("_MFReader_.ibf");
+	_runAsFunctionLibrary = 0;
+
+}
+
+siteToPartititon = {totalCodonCount,2};
+shifter			 = 0;
+for (k=0; k<fileCount; k=k+1)
+{
+	ExecuteCommands ("mySize = nucData_" + (k+1) + ".sites");
+	for (k2 = 0; k2 < mySize; k2 = k2+1)
+	{
+		siteToPartititon[k2+shifter][0] = k;
+		siteToPartititon[k2+shifter][1] = k2;
+	}
+	shifter = shifter + mySize;
+}
+
+	
+referenceL 	= {fileCount, 1};	
+	
+for (k=0; k<fileCount; k=k+1)
+{
+	ExecuteCommands			 		("baselineBL = BranchLength (givenTree_"+(k+1)+",-1);");
+	referenceL[k]					= (baselineBL * (Transpose(baselineBL)["1"]))[0];
+}
+
+summaryPath					   = basePath+".summary";
+substitutionsPath			   = basePath+"_subs.csv";
+siteReportMap				   = basePath+"_bysite.csv";
+fprintf 						(summaryPath, CLEAR_FILE, KEEP_OPEN);
+fprintf							(stdout,      "[PHASE 0.2] Standard model fit. Log-L = ",baselineLogL,".\n");
+fprintf							(summaryPath, "[PHASE 0.2] Standard model fit. Log-L = ",baselineLogL,".\n");
+
+for (k=0; k<fileCount; k=k+1)
+{
+	fprintf (stdout, "\tTree ",k+1," length = ",referenceL[k], " subs/site \n"); 
+	fprintf (summaryPath, "\tTree ",k+1," length = ",referenceL[k], " subs/site \n"); 
+}
+
+ExecuteAFile 					(HYPHY_LIB_DIRECTORY + "TemplateBatchFiles" + DIRECTORY_SEPARATOR + "Utility" + DIRECTORY_SEPARATOR + "GrabBag.bf");
+ExecuteAFile 					(HYPHY_LIB_DIRECTORY + "TemplateBatchFiles" + DIRECTORY_SEPARATOR + "Utility" + DIRECTORY_SEPARATOR + "AncestralMapper.bf");
+
+
+fixGlobalParameters ("lf");
+
+byResidueSummary = {};
+bySiteSummary	 = {};
+
+
+
+/*------------------------------------------------------------------------------*/
+
+if (MPI_NODE_COUNT > 1)
+{
+	MPINodeStatus = {MPI_NODE_COUNT-1,1}["-1"];
+}
+
+
+
+for (residue = 0; residue < 20; residue = residue + 1)
+{
+	AddABiasREL 					(modelNameString,"biasedMatrix",residue);
+	Model							biasedModel = (biasedMatrix, vectorOfFrequencies, 1);
+	
+	populateTrees 					("biasedTree", fileCount);	
+	copyTreeBL	 					("biasedTree", "givenTree", "treeScaler", fileCount);	
+	ExecuteCommands				     (constructLF ("lfb", "nucData", "biasedTree", fileCount));
+	
+	
+	if (MPI_NODE_COUNT > 1)
+	{
+		SendAJob (residue);
+	}
+	else
+	{
+		Optimize 						(lfb_MLES,lfb);
+		DoResults 						(residue);
+	}
+}
+
+/*------------------------------------------------------------------------------*/
+
+if (MPI_NODE_COUNT > 1)
+{
+	jobsLeft = ({1,MPI_NODE_COUNT-1}["1"] * MPINodeStatus["_MATRIX_ELEMENT_VALUE_>=0"])[0];
+
+	for (nodeID = 0; nodeID < jobsLeft; nodeID = nodeID + 1)
+	{
+		MPIReceive (-1, fromNode, theJob);
+		oldRes = MPINodeStatus[fromNode-1];
+		ExecuteCommands (theJob);
+		DoResults (oldRes);	
+	}
+}
+
+/*------------------------------------------------------------------------------*/
+
+fprintf							(substitutionsPath, CLEAR_FILE, KEEP_OPEN, "Site,From,To,Count");
+fprintf							(siteReportMap,     CLEAR_FILE, KEEP_OPEN, "Site");
+for (k=0; k<20; k=k+1)
+{
+	fprintf (siteReportMap, ",", AAString[k]);
+}
+fprintf (siteReportMap, "\nLRT p-value"); 
+
+test_p_values       = test_p_values % 0;
+rejectedHypotheses   = {};
+
+for (k=0; k<20; k=k+1)
+{
+	pv      = (byResidueSummary[AAString[k]])["p"];
+	fprintf (siteReportMap, ",", pv);
+}
+
+fprintf (stdout, 	  "\nResidues (and p-values) for which there is evidence of directional selection\n");
+fprintf (summaryPath, "\nResidues (and p-values) for which there is evidence of directional selection");
+
+for (k=0; k<20; k=k+1)
+{
+	if (test_p_values[k][0] < (0.05/(20-k)))
+	{
+		rejectedHypotheses  [test_p_values[k][1]]           = 1;
+		rejectedHypotheses  [AAString[test_p_values[k][1]]] = 1;
+		fprintf (stdout, 		"\n\t", AAString[test_p_values[k][1]], " : ",test_p_values[k][0] );
+		fprintf (summaryPath, 	"\n\t", AAString[test_p_values[k][1]], " : ",test_p_values[k][0] );
+	}
+	else
+	{
+		break;
+	}
+}
+
+fprintf (stdout, 	  "\n");
+fprintf (summaryPath, "\n");
+
+ancCacheID = {fileCount,1};
+for (k=0; k<fileCount; k=k+1)
+{
+	ancCacheID 	[k]					= _buildAncestralCache ("lf", k);
+}
+outputcount						= 0;
+
+for (k=0; k<totalCodonCount; k=k+1)
+{
+	thisSite = _substitutionsBySite (ancCacheID[siteToPartititon[k][0]],siteToPartititon[k][1]);
+	
+	for (char1 = 0; char1 < 20; char1 = char1+1)
+	{
+		for (char2 = 0; char2 < 20; char2 = char2+1)
+		{
+			if (char1 != char2 && (thisSite["COUNTS"])[char1][char2])
+			{	
+				ccount = (thisSite["COUNTS"])[char1][char2];
+				fprintf (substitutionsPath, "\n", k+1, ",", AAString[char1], ",", AAString[char2], "," , ccount);
+			}
+		}
+	}
+	
+
+	if (Abs(bySiteSummary[k]))
+	{
+		fprintf (siteReportMap, "\n", k+1);
+		
+		didSomething = 0;
+		for (k2=0; k2<20; k2=k2+1)
+		{
+			if (Abs((byResidueSummary[AAString[k2]])["BFs"]) == 0 || rejectedHypotheses[k2] == 0)
+			{
+				fprintf (siteReportMap, ",N/A");
+			}
+			else
+			{
+				pv = ((byResidueSummary[AAString[k2]])["BFs"])[k];
+				fprintf (siteReportMap, ",", pv);			
+				if (pv > BayesFactorCutoff)
+				{
+					didSomething = 1;
+				}
+			}
+		}
+		
+		if (!didSomething)
+		{
+			continue;
+		}
+		
+		if (outputcount == 0)
+		{
+			outputcount = 1;
+			fprintf (stdout, 		"\nThe list of sites which show evidence of directional selection (Bayes Factor > 20)\n",
+							 		"together with the target residues and inferred substitution counts\n");
+			fprintf (summaryPath, 	"\nThe list of sites which show evidence of directional selection (Bayes Factor > 20)\n",
+							 		"together with the target residues and inferred substitution counts\n");
+		}	
+		fprintf (stdout,      "\nSite ", Format (k+1,8,0), "\n Preferred residues: ");
+		fprintf (summaryPath, "\nSite ", Format (k+1,8,0), "\n Preferred residues: ");
+		
+		
+		for (k2 = 0; k2 < Abs (bySiteSummary[k]); k2=k2+1)
+		{
+			thisChar = (bySiteSummary[k])[k2];
+			if (rejectedHypotheses[thisChar])
+			{
+				fprintf (stdout,      thisChar);
+				fprintf (summaryPath, thisChar);
+			}
+		}
+
+		fprintf (stdout,      	   "\n Substitution counts:");
+		fprintf (summaryPath,      "\n Substitution counts:");
+
+		for (char1 = 0; char1 < 20; char1 = char1+1)
+		{
+			for (char2 = char1+1; char2 < 20; char2 = char2+1)
+			{
+				ccount  = (thisSite["COUNTS"])[char1][char2];
+				ccount2 = (thisSite["COUNTS"])[char2][char1];
+				if (ccount+ccount2)
+				{	
+					fprintf (stdout, 	  "\n\t", AAString[char1], "->", AAString[char2], ":", Format (ccount, 5, 0), "/",
+											 AAString[char2], "->", AAString[char1], ":", Format (ccount2, 5, 0));
+					fprintf (summaryPath, "\n\t", AAString[char1], "->", AAString[char2], ":", Format (ccount, 5, 0), "/",
+											 AAString[char2], "->", AAString[char1], ":", Format (ccount2, 5, 0));
+				}
+			}
+		}
+
+	}
+}	
+
+for (k=0; k<fileCount; k=k+1)
+{
+	_destroyAncestralCache 			(ancCacheID[k]);
+}
+fprintf (substitutionsPath, CLOSE_FILE);
+fprintf (summaryPath, 		CLOSE_FILE);
+fprintf (siteReportMap, 	CLOSE_FILE);
+fprintf (stdout, "\n");
+
+/*--------------------------------------------------------------------------------------------*/
+
+function computeDelta (ModelMatrixName&, efv, t_0, which_cat)
+{
+	t   	= t_0;
+	c   	= 1;
+	catVar  = which_cat;
+	rmx 	= ModelMatrixName;
+	for (r=0; r<20; r=r+1)
+	{	
+		diag = 0;
+		for (c=0; c<20; c=c+1)
+		{
+			rmx[r][c] = rmx[r][c] * efv[c];
+			diag = diag - rmx[r][c];
+		}
+		rmx[r][r] = diag;
+	}
+	return Transpose(efv)*(Exp (rmx) - {20,20}["_MATRIX_ELEMENT_ROW_==_MATRIX_ELEMENT_COLUMN_"]);
+}
+
+/*------------------------------------------------------------------------------*/
+
+function SendAJob (residueIn)
+{
+	for (nodeID = 0; nodeID < MPI_NODE_COUNT -1; nodeID = nodeID + 1)
+	{
+		if (MPINodeStatus[nodeID] < 0)
+		{
+			MPINodeStatus[nodeID] = residueIn;
+			MPISend (nodeID+1,lfb);
+			break;
+		}
+	}
+	if (nodeID == MPI_NODE_COUNT - 1)
+	{
+		MPIReceive (-1, fromNode, theJob);
+		oldRes = MPINodeStatus[fromNode-1];
+		MPISend (fromNode,lfb);
+		MPINodeStatus[fromNode-1] = residueIn;
+		ExecuteCommands (theJob);
+		DoResults (oldRes);
+	}
+	return 0;
+}
+
+/*------------------------------------------------------------------------------*/
+
+function DoResults (residueIn)
+{
+	residueC 					= 	AAString[residueIn];
+	fprintf							(stdout, "[PHASE ",residueIn+1,".1] Model biased for ",residueC,"\n"); 
+	fprintf							(summaryPath, "[PHASE ",residueIn+1,".1] Model biased for ",residueC,"\n"); 
+
+	pv							=   1-CChi2(2(lfb_MLES[1][0]-baselineLogL),2);
+	fprintf							(stdout, "[PHASE ",residueIn+1,".2] Finished with the model biased for ",residueC,". Log-L = ",Format(lfb_MLES[1][0],8,3),"\n"); 
+	fprintf							(summaryPath, "[PHASE ",residueIn+1,".2] Finished with the model biased for ",residueC,". Log-L = ",Format(lfb_MLES[1][0],8,3),"\n"); 
+	
+	fr1 						= 	P_bias;
+	
+	
+	
+	fprintf							(stdout, "\n\tBias term                = ", Format(rateBiasTo,8,3),
+											 "\n\tproportion               = ", Format(fr1,8,3),
+											 "\n\tp-value         = ", Format(pv,8,3));
+
+	fprintf							(summaryPath, "\n\tBias term                = ", Format(rateBiasTo,8,3),
+											 	  "\n\tproportion               = ", Format(fr1,8,3),
+											      "\n\tp-value         = ", Format(pv,8,3));
+
+	for		(rc = 0; rc < fileCount; rc = rc + 1)
+	{
+		rateAccel1					=   (computeDelta("biasedMatrix",vectorOfFrequencies,referenceL,1))[residueIn];
+		fprintf (stdout, 			"\n\tExp freq increase (tree ", Format(rc+1,3,0), ")  = ", Format(rateAccel1*100,8,3), "%");
+		fprintf (summaryPath, 		"\n\tExp freq increase (tree ", Format(rc+1,3,0), ")  = ", Format(rateAccel1*100,8,3), "%");
+	}
+	
+	fprintf							(stdout,			"\n");
+	fprintf							(summaryPath, 		"\n");
+		
+		
+											 											
+	LIKELIHOOD_FUNCTION_OUTPUT = 7;
+	outPath = basePath + "." + residueC;
+	fprintf (outPath, CLEAR_FILE, lfb);
+
+	byResidueSummary [residueC] = {};
+	(byResidueSummary [residueC])["p"] = pv;		
+
+	test_p_values [residueIn][0] = pv;
+	test_p_values [residueIn][1] = residueIn;
+
+	/*if (pv < 0.0025)*/
+	{
+		(byResidueSummary [residueC])["sites"] = {};		
+		(byResidueSummary [residueC])["BFs"]   = {};		
+		
+		ConstructCategoryMatrix (mmx,lfb,COMPLETE);
+		GetInformation			(catOrder, lfb);		
+		dim = Columns (mmx);
+		_MARGINAL_MATRIX_	= {2, dim};
+		
+		GetInformation 				(cInfo, c);
+		GetInformation 				(_CATEGORY_VARIABLE_CDF_, catVar);
+		
+		ccc	= Columns (cInfo);
+		
+		_CATEGORY_VARIABLE_CDF_ = _CATEGORY_VARIABLE_CDF_[1][-1];
+		if (catOrder [0] == "c")
+		{
+			for (k=0; k<dim; k=k+1)
+			{
+				for (k2 = 0; k2 < ccc; k2=k2+1)
+				{
+					_MARGINAL_MATRIX_ [0][k] = _MARGINAL_MATRIX_ [0][k] + mmx[2*k2][k]  *cInfo[1][k2];
+					_MARGINAL_MATRIX_ [1][k] = _MARGINAL_MATRIX_ [1][k] + mmx[2*k2+1][k]*cInfo[1][k2];
+				}
+			}
+		}
+		else
+		{
+			for (k=0; k<dim; k=k+1)
+			{
+				for (k2 = 0; k2 < ccc; k2=k2+1)
+				{
+					_MARGINAL_MATRIX_ [0][k] = _MARGINAL_MATRIX_ [0][k] + mmx[k2][k]*cInfo[1][k2];
+					_MARGINAL_MATRIX_ [1][k] = _MARGINAL_MATRIX_ [1][k] + mmx[ccc+k2][k]*cInfo[1][k2];
+				}
+			}
+		}
+		ExecuteAFile 					(HYPHY_LIB_DIRECTORY + "ChartAddIns" + DIRECTORY_SEPARATOR + "DistributionAddIns" + DIRECTORY_SEPARATOR + "Includes" + DIRECTORY_SEPARATOR + "posteriors.ibf");
+		
+		prior = (_CATEGORY_VARIABLE_CDF_[1])/(1-_CATEGORY_VARIABLE_CDF_[1]);
+				
+		for (k=0; k<dim; k=k+1)
+		{
+			bayesF = _MARGINAL_MATRIX_[1][k]/_MARGINAL_MATRIX_[0][k]/prior;
+			((byResidueSummary [residueC])["BFs"])[k] = bayesF;
+			if (bayesF > BayesFactorCutoff)
+			{
+				((byResidueSummary [residueC])["sites"])[Abs((byResidueSummary [residueC])["sites"])] = k+1;
+				if (Abs(bySiteSummary[k]) == 0)
+				{
+					bySiteSummary[k] = {};
+				}
+				(bySiteSummary[k])[Abs(bySiteSummary[k])] = residueC;
+			}
+		}
+		
+	}	
+	return 0;
+}
+
+
diff --git a/res/TemplateBatchFiles/DistanceMatrix.bf b/res/TemplateBatchFiles/DistanceMatrix.bf
new file mode 100644
index 0000000..3c26aa7
--- /dev/null
+++ b/res/TemplateBatchFiles/DistanceMatrix.bf
@@ -0,0 +1,312 @@
+ChoiceList (distanceChoice, "Distance Computation",1,SKIP_NONE,
+			"Distance formulae","Use one of the predefined distance measures based on data comparisons. Fast.",
+			"Full likelihood","Estimate distances using pairwise MLE. More choices but slow.");
+			
+if (distanceChoice < 0)
+{
+	return 0;
+}
+
+ChoiceList (dataType,"Data type",1,SKIP_NONE,"Nucleotide/Protein","Nucleotide or amino-acid (protein).",
+				     "Codon","Codon (several available genetic codes).");
+
+if (dataType<0) 
+{
+	return;
+}
+
+if (dataType)
+{
+	NICETY_LEVEL = 3;
+	SetDialogPrompt ("Please choose a codon data file:");
+	#include "TemplateModels/chooseGeneticCode.def";
+}
+else
+{
+	SetDialogPrompt ("Please choose a nucleotide or amino-acid data file:");
+}
+
+
+DataSet ds   = ReadDataFile (PROMPT_FOR_FILE);
+
+mpiPrefix    = ""; mpiPrefix * 128;
+mpiPrefix	 * ("DataSet ds   = ReadDataFile (\"" + LAST_FILE_PATH + "\");\n");
+ 
+
+if (dataType)
+{
+	DataSetFilter filteredData = CreateFilter (ds,3,"","",GeneticCodeExclusions);
+	mpiPrefix	 * ("DataSetFilter filteredData = CreateFilter (ds,3,\"\",\"\",\""+GeneticCodeExclusions+"\");");
+}
+else
+{
+	DataSetFilter filteredData = CreateFilter (ds,1,"","");
+	mpiPrefix	 * ("DataSetFilter filteredData = CreateFilter (ds,1);\n");
+}
+
+if (distanceChoice > 0)
+{
+	SelectTemplateModel(filteredData);
+}
+
+ChoiceList (distanceFormat, "Matrix Format",1,SKIP_NONE,
+			"PHYLIP Style","Symmetric PHYLIP style matrix.",
+			"HyPhy Matrix","Use HyPhy matrix syntax (suitable for input to other HyPhy analyses) and is written to disk incrementally",
+			"TAB","Use tab separated format, suitable for importing into a statistical analysis package and written to disk incrementally",
+			"Pairwise","Write a tab format in the form: seq1 seq2 distance");
+			
+if (distanceFormat < 0)
+{
+	return 0;
+}
+
+if (distanceFormat == 0)
+{
+	SetDialogPrompt ("Save distance matrix (symmetric PHYLIP style):");
+	fprintf (PROMPT_FOR_FILE,CLEAR_FILE,KEEP_OPEN,ds.species);
+	distanceMatrix = {ds.species,ds.species};
+}
+else
+{
+	if (distanceFormat == 1)
+	{
+		SetDialogPrompt ("Save distance matrix (HyPhy style):");
+		if (distanceChoice==1)
+		{
+			distanceMatrix = {ds.species,ds.species};
+		}
+		fprintf (PROMPT_FOR_FILE,CLEAR_FILE,KEEP_OPEN);
+	}
+	else
+	{
+		SetDialogPrompt ("Save distance matrix (tab format):");
+		fprintf (PROMPT_FOR_FILE,CLEAR_FILE,KEEP_OPEN);
+		distanceMatrix = {ds.species,ds.species};
+	}
+}
+	
+
+if (distanceChoice)
+{
+	mpiPrefix * 0;
+	fprintf 	 (stdout,"\nHYPHY is computing pairwise maximum likelihood distance estimates. A total of ", Format(ds.species*(ds.species-1)/2,0,0),
+				    	 " estimations will be performed.\n");
+	_pddVF = 1;
+	
+	pairwiseAlign = 0;
+	
+	GetDataInfo (charInfo, filteredData, "CHARACTERS");
+	ChoiceList (pairwiseAlign, "Peform pairwise alignment prior to comparison",1,SKIP_NONE,
+				"No","Assume that the sequences are already aligned.",
+				"Yes","Align each pair of sequences before computing pairwise distances");
+
+	if (pairwiseAlign < 0)
+	{
+		return 0;
+	}
+	
+			
+	
+	if (pairwiseAlign)
+	{
+		if (Columns (charInfo) == 20)
+		{
+			_skipPredefsSeqAlignShared = 1;
+			ExecuteAFile ("SeqAlignShared.ibf");
+		}
+		else
+		{
+            ChoiceList (codonAlign, "Use codon-based alignment",1,SKIP_NONE,
+                                        "No","Align nucleotide sequences directly.",
+                                        "Yes","Align nucleotide sequences in the codon-space fixing frameshifts if necessary");
+                                        
+            if (codonAlign < 0)
+            {
+                return 0;
+            }
+            if (codonAlign == 0)
+            {
+                alignOptions = {};
+                scoreMatrix = {
+                {5,-4,-4,-4}
+                {-4,5,-4,-4}
+                {-4,-4,5,-4}
+                {-4,-4,-4,5}
+                };
+                alignOptions ["SEQ_ALIGN_SCORE_MATRIX"] = 	scoreMatrix;
+                alignOptions ["SEQ_ALIGN_GAP_OPEN"]		= 	10;
+                alignOptions ["SEQ_ALIGN_GAP_OPEN2"]	= 	5;
+                alignOptions ["SEQ_ALIGN_GAP_EXTEND"]	= 	1;
+                alignOptions ["SEQ_ALIGN_GAP_EXTEND2"]	= 	1;
+                alignOptions ["SEQ_ALIGN_AFFINE"]		=   1;
+                alignOptions ["SEQ_ALIGN_CHARACTER_MAP"]=   "ACGT";
+            }
+            else
+            {
+                _skipPredefsSeqAlignShared = 1;
+				LoadFunctionLibrary ("SeqAlignmentCodonShared");
+			}
+		}
+	}
+
+    LoadFunctionLibrary ("pairwiseDistanceEstimator");	
+}
+else
+{
+	DISTANCE_PROMPTS = 1;
+	
+	#include "chooseDistanceFormula.def";
+	
+	InitializeDistances (0);
+	
+	mpiPrefix * ("ExecuteAFile(\""+_distanceFilePath+"\"); InitializeDistances (0);\n");
+	mpiPrefix * 0;
+				    
+	tdc = 0;
+	tdp = 0;
+	ldp = 0;
+	togo = ds.species*(ds.species-1)/2;
+
+	fprintf (stdout,"\nHYPHY is computing pairwise distance estimates. A total of ", Format(togo,0,0),
+				    " estimations will be performed.\n");
+	
+	distanceMatrix = {ds.species,ds.species};
+	
+	if (MPI_NODE_COUNT > 1)
+	{
+		MPI_NODE_INFO  = {MPI_NODE_COUNT-1,2};
+		perNodeFile    = togo / (MPI_NODE_COUNT-1);
+		
+		
+		accumulator = 0;
+		lastRowSent = 0;
+		totalSent	= 0;
+		
+		for (i = 0; i < ds.species-1; i = i + 1)
+		{
+			accumulator = accumulator + (ds.species-1-i);
+			
+			if (accumulator >= perNodeFile || i == ds.species-2)
+			{
+				fprintf (stdout, "[SENT MATRIX ROWS ", lastRowSent, "-", i, " to MPI node ", totalSent + 1,"]\n");
+				MPI_NODE_INFO[totalSent][0] = lastRowSent;
+				MPI_NODE_INFO[totalSent][1] = i;
+				toSend	= mpiPrefix + "vecSize = " + accumulator + ";" +
+												  "fromRow = " + lastRowSent + ";" + 
+												  "toRow   = " + i + ";" +
+												  "ExecuteAFile (HYPHY_LIB_DIRECTORY + \"TemplateBatchFiles\" + DIRECTORY_SEPARATOR + \"pairwiseDistanceEstimatorCounter.ibf\"); return result;";
+												  
+				MPISend (totalSent+1, toSend);
+				
+				accumulator = 0;
+				lastRowSent	= i+1;
+				totalSent   = totalSent + 1;
+			}
+		}
+		
+		for (i = 0; i < totalSent; i = i+1)
+		{
+			MPIReceive		(-1,fromNode,theVector);
+			fromNode		= fromNode - 1;
+			ExecuteCommands ("partialVector = " + theVector);
+			fromRow			= MPI_NODE_INFO[fromNode][0];
+			toRow			= MPI_NODE_INFO[fromNode][1];
+			fprintf (stdout, "[GOT MATRIX ROWS ", fromRow, "-", toRow, " from MPI node ", fromNode,"]\n");
+			j = 0;
+			for (r = fromRow; r <= toRow; r = r + 1)
+			{
+				for (c = r+1; c < ds.species; c = c + 1)
+				{
+					distanceMatrix [r][c] = partialVector[j];
+					distanceMatrix [c][r] = partialVector[j];
+					j = j+1;
+				}
+			}
+		}
+		
+	}
+	else
+	{
+		for (i = 0; i<ds.species-1; i=i+1)
+		{
+			for (j = 0; j<=i; j = j+1)
+			{
+				k = ComputeDistanceFormula (i+1,j);
+				distanceMatrix[j][i+1] = k;
+				distanceMatrix[i+1][j] = k;
+			}
+			tdc = tdc+i+1;
+			tdp = (tdc/togo * 100)$1;
+			if (tdp>ldp)
+			{
+				ldp = tdp;
+				fprintf (stdout, ldp, "% done\n");
+			}
+		}
+	}
+
+	DISTANCE_PROMPTS = 0;
+}
+	
+
+if (distanceFormat != 1 && distanceFormat != 3)
+{
+	if (distanceFormat == 2)
+	{
+		GetString	(seqString,ds,0);
+		fprintf (LAST_FILE_PATH, CLEAR_FILE, seqString);
+		for (i = 1; i<ds.species; i=i+1)
+		{
+			GetString	(seqString,ds,i);
+			fprintf (LAST_FILE_PATH, "\t", seqString);
+		}
+	}
+	else
+	{
+		spacer = "           ";
+	}
+	
+	for (i = 0; i<ds.species; i=i+1)
+	{
+		GetString	(seqString,ds,i);
+		if (distanceFormat == 0)
+		{
+			j = Abs(seqString);
+			if (j>=10)
+			{
+				seqString = seqString[0][9];
+			}
+			else
+			{
+				seqString = seqString+spacer[0][10-j-1];
+			}
+		}
+		fprintf (LAST_FILE_PATH, "\n", seqString);
+		
+		for (j = 0; j<ds.species; j = j+1)
+		{
+			fprintf (LAST_FILE_PATH,"\t",distanceMatrix[i][j]);
+		}
+	}
+}
+else
+{
+	if (distanceFormat == 1)
+	{
+		fprintf (LAST_FILE_PATH,CLEAR_FILE,distanceMatrix);
+	}
+	else
+	{
+		GetString (seqString,ds,-1);
+		fprintf (LAST_FILE_PATH,CLEAR_FILE,"Sequence1\tSequence2\tDistance");
+		for (i = 0; i<ds.species; i=i+1)
+		{
+			for (j = i+1; j<ds.species; j = j+1)
+			{
+				fprintf (LAST_FILE_PATH,"\n",seqString[i],"\t",seqString[j],"\t",distanceMatrix[i][j]);
+			}
+		}		
+	}
+}
+	
+fprintf (LAST_FILE_PATH, CLOSE_FILE);
diff --git a/res/TemplateBatchFiles/DistanceMatrix_Splits.bf b/res/TemplateBatchFiles/DistanceMatrix_Splits.bf
new file mode 100644
index 0000000..7e1c958
--- /dev/null
+++ b/res/TemplateBatchFiles/DistanceMatrix_Splits.bf
@@ -0,0 +1,258 @@
+ChoiceList (distanceChoice, "Distance Computation",1,SKIP_NONE,
+			"Distance formulae","Use one of the predefined distance measures based on data comparisons. Fast.",
+			"Full likelihood","Estimate distances using pairwise MLE. More choices but slow.");
+			
+if (distanceChoice < 0)
+{
+	return 0;
+}
+
+
+ChoiceList (dataType,"Data type",1,SKIP_NONE,"Nucleotide/Protein","Nucleotide or amino-acid (protein).",
+				     "Codon","Codon (several available genetic codes).");
+
+if (dataType<0) 
+{
+	return;
+}
+
+if (dataType)
+{
+	NICETY_LEVEL = 3;
+	SetDialogPrompt ("Please choose a codon data file:");
+	#include "TemplateModels/chooseGeneticCode.def";
+}
+else
+{
+	SetDialogPrompt ("Please choose a nucleotide or amino-acid data file:");
+}
+
+
+DataSet ds = ReadDataFile (PROMPT_FOR_FILE);
+
+fprintf (stdout, "Read:\n", ds, "\n");
+
+window_size = 0;
+while (window_size < 1 || window_size > ds.sites)
+{
+	fprintf (stdout, "Window Size: ");
+	fscanf  (stdin,  "Number", window_size);
+}
+
+for (windowPosition = 0; windowPosition < ds.sites; windowPosition=windowPosition+window_size)
+{
+	if (dataType)
+	{
+		DataSetFilter filteredData = CreateFilter (ds,3,siteIndex>=windowPosition && siteIndex<windowPosition+window_size,"",GeneticCodeExclusions);
+	}
+	else
+	{
+		DataSetFilter filteredData = CreateFilter (ds,1,siteIndex>=windowPosition && siteIndex<windowPosition+window_size,"");
+	}
+
+	if (distanceChoice > 0)
+	{
+		SelectTemplateModel(filteredData);
+	}
+
+	if (windowPosition==0)
+	{
+		ChoiceList (distanceFormat, "Matrix Format",1,SKIP_NONE,
+					"PHYLIP Style","Symmetric PHYLIP style matrix.",
+					"HyPhy Matrix","Use HyPhy matrix syntax (suitable for input to other HyPhy analyses) and is written to disk incrementally");
+					
+		if (distanceFormat < 0)
+		{
+			return 0;
+		}
+	}
+
+	distanceMatrix = {ds.species,ds.species};
+	if (windowPosition == 0)
+	{
+		if (distanceFormat == 0)
+		{
+			SetDialogPrompt ("Save distance matrix (symmetric PHYLIP style):");
+			fprintf (PROMPT_FOR_FILE,CLEAR_FILE);
+		}
+		else
+		{
+			SetDialogPrompt ("Save distance matrix (HyPhy style):");
+			fprintf (PROMPT_FOR_FILE,CLEAR_FILE);
+			BASE_PATH = LAST_FILE_PATH;
+		}
+	}
+	LAST_FILE_PATH = BASE_PATH + "." + windowPosition;
+	if (distanceFormat == 0)
+	{
+		SetDialogPrompt ("Save distance matrix (symmetric PHYLIP style):");
+		fprintf (LAST_FILE_PATH,CLEAR_FILE,ds.species,"\n");
+	}
+	else
+	{
+		SetDialogPrompt ("Save distance matrix (HyPhy style):");
+		fprintf (LAST_FILE_PATH,CLEAR_FILE);
+	}
+		
+
+	if (distanceChoice)
+	{
+		fprintf (stdout,"\nHYPHY is computing pairwise maximum likelihood distance estimates. A total of ", Format(ds.species*(ds.species-1)/2,0,0),
+					    " estimations will be performed.\n");
+
+		MESSAGE_LOGGING = 0;
+
+		for (i = 0; i<ds.species-1; i=i+1)
+		{
+			for (j = 0; j<=i; j = j+1)
+			{
+				if (dataType)
+				{
+					DataSetFilter twoSpecFilter = CreateFilter (filteredData,3,"",(speciesIndex==i+1)||(speciesIndex==j),GeneticCodeExclusions);
+				}
+				else
+				{
+					DataSetFilter twoSpecFilter = CreateFilter (filteredData,1,"",(speciesIndex==i+1)||(speciesIndex==j));
+				}
+				if (FREQUENCY_SENSITIVE)
+				{
+					if (USE_POSITION_SPECIFIC_FREQS)
+					{
+						HarvestFrequencies (vectorOfFrequencies,filteredData,3,1,1);
+					}
+					else
+					{
+						HarvestFrequencies (vectorOfFrequencies,twoSpecFilter,1,1,0);
+					}
+				}
+				if (FREQUENCY_SENSITIVE)
+				{
+					MULTIPLY_BY_FREQS = PopulateModelMatrix ("modelMatrix",vectorOfFrequencies);
+					if (dataType)
+					{
+						codonFrequencies = BuildCodonFrequencies (vectorOfFrequencies);
+						Model pairModel = (modelMatrix, codonFrequencies, MULTIPLY_BY_FREQS);
+					}
+					else
+					{
+						Model pairModel = (modelMatrix, vectorOfFrequencies, MULTIPLY_BY_FREQS);
+					}
+				}		
+				else
+				{
+					if (i+j==0)
+					{
+						MULTIPLY_BY_FREQS = PopulateModelMatrix ("modelMatrix",equalFreqs);
+						Model pairModel = (modelMatrix, equalFreqs, MULTIPLY_BY_FREQS);
+					}
+				}
+				
+				Tree Inferred_Tree = (1,2);
+				LikelihoodFunction lf = (twoSpecFilter,Inferred_Tree);
+				Optimize (res,lf);
+				k = BranchLength (Inferred_Tree,0);
+				distanceMatrix[j][i+1] = k;
+				distanceMatrix[i+1][j] = k;
+			}
+		}
+	}
+	else
+	{
+		tdc = 0;
+		tdp = 0;
+		ldp = 0;
+		togo = ds.species*(ds.species-1)/2;
+
+
+		if (windowPosition == 0)
+		{
+			DISTANCE_PROMPTS = 1;
+			#include "chooseDistanceFormula.def";
+			dummy = InitializeDistances (0);
+		}
+		
+		fprintf (stdout,"\nHYPHY is computing pairwise distance estimates. A total of ", Format(togo,0,0),
+					    " estimations will be performed.\n");
+		
+		if (distanceFormat == 0)
+		{
+			for (i = 0; i<ds.species-1; i=i+1)
+			{
+				for (j = 0; j<=i; j = j+1)
+				{
+					k = ComputeDistanceFormula (i+1,j);
+					distanceMatrix[j][i+1] = k;
+					distanceMatrix[i+1][j] = k;
+				}
+				tdc = tdc+i+1;
+				tdp = (tdc/togo * 100)$1;
+				if (tdp>ldp)
+				{
+					ldp = tdp;
+					fprintf (stdout, ldp, "% done\n");
+				}
+			}
+		}
+		else
+		{
+			fprintf (LAST_FILE_PATH, CLEAR_FILE, "{\n");
+			for (i = 0; i<ds.species; i=i+1)
+			{
+				outRow = "{0";
+				for (j = 0; j<i; j = j+1)
+				{
+					outRow = outRow+",0";
+				}
+				for (j = i+1; j<ds.species; j = j+1)
+				{
+					k = ComputeDistanceFormula (i,j);
+					outRow = outRow+","+k;
+				}
+				fprintf (LAST_FILE_PATH, outRow, "}\n");
+				tdc = tdc+(ds.species-i-1);
+				tdp = (tdc/togo * 100)$1;
+				if (tdp>ldp)
+				{
+					ldp = tdp;
+					fprintf (stdout, ldp, "% done\n");
+				}
+			}	
+			fprintf (LAST_FILE_PATH, "}\n");
+		}
+
+		DISTANCE_PROMPTS = 0;
+	}
+		
+
+	if (distanceFormat == 0)
+	{
+		spacer = "           ";
+
+		for (i = 0; i<ds.species; i=i+1)
+		{
+			GetString	(seqString,ds,i);
+			j = Abs(seqString);
+			if (j>=10)
+			{
+				seqString = seqString[0][9];
+			}
+			else
+			{
+				seqString = seqString+spacer[0][10-j-1];
+			}
+			for (j = 0; j<ds.species; j = j+1)
+			{
+				seqString = seqString + "\t" + (distanceMatrix[i][j]);
+			}
+			fprintf (LAST_FILE_PATH, seqString, "\n");
+		}
+	}
+	else
+	{
+		if (distanceChoice)
+		{
+			fprintf (LAST_FILE_PATH,CLEAR_FILE,distanceMatrix);
+		}
+	}
+}
+		
diff --git a/res/TemplateBatchFiles/Distances/CodonTools.def b/res/TemplateBatchFiles/Distances/CodonTools.def
new file mode 100644
index 0000000..4ec7077
--- /dev/null
+++ b/res/TemplateBatchFiles/Distances/CodonTools.def
@@ -0,0 +1,17 @@
+/* positional character frequencies. init to all .25*/
+
+_EFV_MATRIX0_ = {4,4};
+_EFV_MATRIX1_ = {4,4};
+_EFV_MATRIX2_ = {4,4};
+
+for (h=0; h<4; h=h+1)
+{
+	for (v=0; v<4; v=v+1)
+	{
+		_EFV_MATRIX0_ [h][v] = .25;
+		_EFV_MATRIX1_ [h][v] = .25;
+		_EFV_MATRIX2_ [h][v] = .25;
+	}
+}
+
+#include "CodonToolsMain.def";
diff --git a/res/TemplateBatchFiles/Distances/CodonTools2.def b/res/TemplateBatchFiles/Distances/CodonTools2.def
new file mode 100644
index 0000000..8cd5870
--- /dev/null
+++ b/res/TemplateBatchFiles/Distances/CodonTools2.def
@@ -0,0 +1,18 @@
+/* positional character frequencies. init to all .25*/
+
+_EFV_MATRIX0_ = {{1,_distance_tv_ts,1,_distance_tv_ts}
+				{_distance_tv_ts,1,_distance_tv_ts,1}
+				{1,_distance_tv_ts,1,_distance_tv_ts}
+				{_distance_tv_ts,1,_distance_tv_ts,1}};
+
+_EFV_MATRIX1_ = {{1,_distance_tv_ts,1,_distance_tv_ts}
+				{_distance_tv_ts,1,_distance_tv_ts,1}
+				{1,_distance_tv_ts,1,_distance_tv_ts}
+				{_distance_tv_ts,1,_distance_tv_ts,1}};
+
+_EFV_MATRIX2_ = {{1,_distance_tv_ts,1,_distance_tv_ts}
+				{_distance_tv_ts,1,_distance_tv_ts,1}
+				{1,_distance_tv_ts,1,_distance_tv_ts}
+				{_distance_tv_ts,1,_distance_tv_ts,1}};
+
+#include "CodonToolsMain.def";
diff --git a/res/TemplateBatchFiles/Distances/CodonToolsMain.def b/res/TemplateBatchFiles/Distances/CodonToolsMain.def
new file mode 100644
index 0000000..88f10cc
--- /dev/null
+++ b/res/TemplateBatchFiles/Distances/CodonToolsMain.def
@@ -0,0 +1,344 @@
+_S_NS_POSITIONS_ = {2,64};
+
+hShift = 0;
+
+for (h=0; h<64; h=h+1)
+{
+	myAA = _Genetic_Code[h];
+	
+	if (myAA != 10) /* not a stop codon */
+	{
+		norm_factor  = 0.0;
+		sSites	 	 = 0.0;
+		nsSites 	 = 0.0;
+		
+		/* first position change */
+		/* actual first position */
+		
+		p1 = h$16; /* 0->A, 1->C, 2->G, 3->T */
+		p2 = h%16; /* remainder - i.e. positions 2 and 3*/
+				
+		for (n1 = 0; n1 < 4; n1=n1+1)
+		{
+			if (n1 != p1) /* a change */
+			{
+				/* new codon */
+				nc = n1*16 + p2;
+				newAA = _Genetic_Code[nc];
+				
+				if (newAA!=10) /* not a stop codon */
+				{
+					if (newAA == myAA) /* syn. change */
+					{
+						sSites = sSites + _EFV_MATRIX0_[p1][n1];
+					}
+					else
+					{
+						nsSites = nsSites + _EFV_MATRIX0_[p1][n1];
+					}
+				}
+				norm_factor = norm_factor + _EFV_MATRIX0_[p1][n1];
+			}
+		}
+		
+		if (norm_factor)
+		{
+			_S_NS_POSITIONS_[0][h] = _S_NS_POSITIONS_[0][h] + sSites/norm_factor;
+			_S_NS_POSITIONS_[1][h] = _S_NS_POSITIONS_[1][h] + nsSites/norm_factor;
+		}
+		
+		norm_factor  = 0.0;
+		sSites	 	 = 0.0;
+		nsSites 	 = 0.0;
+
+		/* second position change */
+		/* actual second position */
+		
+		p1 = (h%16)$4;
+		p2 = (h$16)*16+h%4; /* remainder - i.e. positions 1 and 3*/
+		
+		for (n1 = 0; n1 < 4; n1=n1+1)
+		{
+			if (n1 != p1) /* a change */
+			{
+				/* new codon */
+				nc = n1*4 + p2;
+				newAA = _Genetic_Code[nc];
+				
+				if (newAA!=10) /* not a stop codon */
+				{
+					if (newAA == myAA) /* syn. change */
+					{
+						sSites = sSites + _EFV_MATRIX1_[p1][n1];
+					}
+					else
+					{
+						nsSites = nsSites + _EFV_MATRIX1_[p1][n1];
+					}
+				}
+				norm_factor = norm_factor + _EFV_MATRIX1_[p1][n1];
+			}
+		}
+
+		/* 3rd position change */
+		/* actual 3rd position */
+		
+		if (norm_factor)
+		{
+			_S_NS_POSITIONS_[0][h] = _S_NS_POSITIONS_[0][h] + sSites/norm_factor;
+			_S_NS_POSITIONS_[1][h] = _S_NS_POSITIONS_[1][h] + nsSites/norm_factor;
+		}
+		
+		norm_factor  = 0.0;
+		sSites	 	 = 0.0;
+		nsSites 	 = 0.0;
+
+		p1 = h%4;
+		p2 = (h$4)*4; /* remainder - i.e. positions 1 and 2*/
+		
+		for (n1 = 0; n1 < 4; n1=n1+1)
+		{
+			if (n1 != p1) /* a change */
+			{
+				/* new codon */
+				nc = n1 + p2;
+				newAA = _Genetic_Code[nc];
+				
+				if (newAA!=10) /* not a stop codon */
+				{
+					if (newAA == myAA) /* syn. change */
+					{
+						sSites = sSites + _EFV_MATRIX2_[p1][n1];
+					}
+					else
+					{
+						nsSites = nsSites + _EFV_MATRIX2_[p1][n1];
+					}
+				}
+				norm_factor = norm_factor + _EFV_MATRIX2_[p1][n1];
+			}
+		}
+		
+		if (norm_factor)
+		{
+			_S_NS_POSITIONS_[0][h] = _S_NS_POSITIONS_[0][h] + sSites/norm_factor;
+			_S_NS_POSITIONS_[1][h] = _S_NS_POSITIONS_[1][h] + nsSites/norm_factor;
+		}
+		
+	}
+	else
+	{
+		hShift = hShift+1;
+	}
+}
+
+stateCharCount = 64-hShift;
+
+
+/* now compute pairwise codon distance matrix */
+
+nuc_split 	  = {2,3};
+_PAIRWISE_S_  = {stateCharCount,stateCharCount};
+_PAIRWISE_NS_ = {stateCharCount,stateCharCount};
+_OBSERVED_S_  = {stateCharCount,stateCharCount};
+_OBSERVED_NS_ = {stateCharCount,stateCharCount};
+_NUC_SUB_TYPE_= {stateCharCount,stateCharCount};
+
+_NUC_TEMPL_	  = {{0,0,1,2}
+                 {0,0,3,4}
+                 {1,3,0,5}
+                 {2,4,5,0}};
+
+hShift = 0;
+
+for (h = 0; h<64; h=h+1)
+{
+	myAA = _Genetic_Code[h];
+	if (myAA == 10)
+	{
+		hShift = hShift+1;
+	}
+	else
+	{
+		nuc_split[0][0] = h$16;
+		nuc_split[0][1] = (h%16)$4;
+		nuc_split[0][2] = h%4;
+		
+		_PAIRWISE_S_  [h-hShift][h-hShift] = _S_NS_POSITIONS_[0][h];
+		_PAIRWISE_NS_ [h-hShift][h-hShift] = _S_NS_POSITIONS_[1][h];
+		
+		vShift = hShift;
+		
+		for (v = h+1; v<64; v=v+1)
+		{
+			newAA = _Genetic_Code[v];
+			if (newAA == 10)
+			{
+				vShift = vShift+1;
+			}
+			else
+			{
+				/*fprintf ("echo", codonString (h), "->", codonString(v), "\n");*/
+				nuc_split[1][0] = v$16;
+				nuc_split[1][1] = (v%16)$4;
+				nuc_split[1][2] = v%4;
+				
+				p1 = (nuc_split[1][0]!=nuc_split[0][0])+
+					 (nuc_split[1][1]!=nuc_split[0][1])+
+					 (nuc_split[1][2]!=nuc_split[0][2]);
+					 
+				if (p1==1) 
+				{
+					_PAIRWISE_S_ [h-hShift][v-vShift] = (_S_NS_POSITIONS_[0][h]+_S_NS_POSITIONS_[0][v])/2;
+					_PAIRWISE_NS_ [h-hShift][v-vShift] = (_S_NS_POSITIONS_[1][h]+_S_NS_POSITIONS_[1][v])/2;
+					
+					if (myAA == newAA)
+					{
+						_OBSERVED_S_[h-hShift][v-vShift] = 1;
+					}
+					else
+					{
+						_OBSERVED_NS_[h-hShift][v-vShift] = 1;					
+					}
+					
+					/*fprintf ("echo", "\tOne change:", _PAIRWISE_S_ [h][v], "\t", _PAIRWISE_NS_ [h][v], "\n");*/
+					
+					for (p1 = 0; p1 < 3; p1=p1+1)
+					{
+						if (nuc_split[0][p1] != nuc_split[1][p1])
+						{
+							_NUC_SUB_TYPE_[h-hShift][v-vShift] = _NUC_TEMPL_[nuc_split[0][p1]][nuc_split[1][p1]];
+							break;
+						}
+					}
+				}
+				else
+				{
+					if (p1==2) 
+					{
+						/*fprintf ("echo", "\tTwo changes:\n");*/
+						if (nuc_split[1][0]==nuc_split[0][0]) 
+						{
+							pc1 = 16*nuc_split[0][0]+4*nuc_split[0][1]+nuc_split[1][2];
+							pc2 = 16*nuc_split[0][0]+4*nuc_split[1][1]+nuc_split[0][2];
+						}
+						else
+						{
+							if (nuc_split[1][1]==nuc_split[0][1])
+							{
+								pc1 = 16*nuc_split[0][0]+4*nuc_split[0][1]+nuc_split[1][2];
+								pc2 = 16*nuc_split[1][0]+4*nuc_split[0][1]+nuc_split[0][2];
+							}
+							else 
+							{
+								pc1 = 16*nuc_split[1][0]+4*nuc_split[0][1]+nuc_split[0][2];
+								pc2 = 16*nuc_split[0][0]+4*nuc_split[1][1]+nuc_split[0][2];
+							}
+						}
+						
+						pc = 0;
+						
+						pc1AA = _Genetic_Code[pc1];
+						if (pc1AA != 10)
+						{	
+							_OBSERVED_S_   [h-hShift][v-vShift]  = (pc1AA == myAA) + (pc1AA == newAA);
+							_OBSERVED_NS_  [h-hShift][v-vShift]  = (pc1AA != myAA) + (pc1AA != newAA);
+							
+							_PAIRWISE_S_  [h-hShift][v-vShift] = (_S_NS_POSITIONS_[0][h]+_S_NS_POSITIONS_[0][v]+_S_NS_POSITIONS_[0][pc1])/3;
+							_PAIRWISE_NS_ [h-hShift][v-vShift] = (_S_NS_POSITIONS_[1][h]+_S_NS_POSITIONS_[1][v]+_S_NS_POSITIONS_[1][pc1])/3;
+							/*fprintf ("echo", "\t", codonString (h), "->", codonString(pc1), "->", codonString(v), "\t", _PAIRWISE_S_ [h][v], "\t", _PAIRWISE_NS_ [h][v], "\n");*/
+							pc = 1;
+						}
+						
+						pc1AA = _Genetic_Code[pc2];
+						if (pc1AA != 10)
+						{
+							_OBSERVED_S_  [h-hShift][v-vShift]  = _OBSERVED_S_ [h-hShift][v-vShift] + (pc1AA == myAA) + (pc1AA == newAA);
+							_OBSERVED_NS_ [h-hShift][v-vShift]  = _OBSERVED_NS_[h-hShift][v-vShift] + (pc1AA != myAA) + (pc1AA != newAA);
+
+							_PAIRWISE_S_  [h-hShift][v-vShift] = _PAIRWISE_S_ [h-hShift][v-vShift]+(_S_NS_POSITIONS_[0][h]+_S_NS_POSITIONS_[0][v]+_S_NS_POSITIONS_[0][pc2])/3;
+							_PAIRWISE_NS_ [h-hShift][v-vShift] = _PAIRWISE_NS_ [h-hShift][v-vShift]+(_S_NS_POSITIONS_[1][h]+_S_NS_POSITIONS_[1][v]+_S_NS_POSITIONS_[1][pc2])/3;
+							/*fprintf ("echo", "\t", codonString (h), "->", codonString(pc2), "->", codonString(v), "\t", _PAIRWISE_S_ [h][v], "\t", _PAIRWISE_NS_ [h][v], "\n");*/
+							pc = pc+1;
+						}
+						
+						if (pc == 0)
+						{
+							_PAIRWISE_S_  [h-hShift][v-vShift] = 0;
+							_PAIRWISE_NS_ [h-hShift][v-vShift] = 0;
+							_OBSERVED_S_  [h-hShift][v-vShift] = 0;
+							_OBSERVED_NS_ [h-hShift][v-vShift] = 0;
+						}
+						else
+						{
+							_PAIRWISE_S_  [h-hShift][v-vShift] = _PAIRWISE_S_  [h-hShift][v-vShift]/pc;
+							_PAIRWISE_NS_ [h-hShift][v-vShift] = _PAIRWISE_NS_ [h-hShift][v-vShift]/pc;
+							_OBSERVED_S_  [h-hShift][v-vShift] = _OBSERVED_S_  [h-hShift][v-vShift]/pc;
+							_OBSERVED_NS_ [h-hShift][v-vShift] = _OBSERVED_NS_ [h-hShift][v-vShift]/pc;						
+						}
+					}
+					else 
+					{
+						pc = 0;
+						
+						/*
+						fprintf ("echo", "\tThree changes:\n");
+						*/
+						
+						for (p1=0;p1<3;p1=p1+1)
+						{
+							pc1   = (h+4^(2-p1)*(nuc_split[1][p1]-nuc_split[0][p1])+0.5)$1;
+							pc1AA = _Genetic_Code[pc1];
+							if (pc1AA != 10)
+							{
+								for (p2=0;p2<3;p2=p2+1)
+								{
+									if (p2 != p1)
+									{
+										pc2 = (pc1+4^(2-p2)*(nuc_split[1][p2]-nuc_split[0][p2]) + 0.5)$1;
+										pc2AA = _Genetic_Code[pc2];
+										if (pc2AA != 10)
+										{
+											_OBSERVED_S_   [h-hShift][v-vShift]  = _OBSERVED_S_ [h-hShift][v-vShift] + (pc1AA == myAA) + (pc1AA == pc2AA) + (pc2AA == newAA);
+											_OBSERVED_NS_  [h-hShift][v-vShift]  = _OBSERVED_NS_[h-hShift][v-vShift] + (pc1AA != myAA) + (pc1AA != pc2AA) + (pc2AA != newAA);
+											
+											_PAIRWISE_S_ [h-hShift][v-vShift] = _PAIRWISE_S_ [h-hShift][v-vShift]+
+																(_S_NS_POSITIONS_[0][h]+_S_NS_POSITIONS_[0][v]+_S_NS_POSITIONS_[0][pc1]+_S_NS_POSITIONS_[0][pc2])/4;
+											_PAIRWISE_NS_ [h-hShift][v-vShift] = _PAIRWISE_NS_ [h-hShift][v-vShift]+
+																(_S_NS_POSITIONS_[1][h]+_S_NS_POSITIONS_[1][v]+_S_NS_POSITIONS_[1][pc1]+_S_NS_POSITIONS_[1][pc2])/4;
+											pc = pc+1;
+										
+											/*
+											fprintf (stdout, "\t", codonString (h), "->", codonString(pc1), "->", codonString(pc2), "->",codonString(v), "\t", _PAIRWISE_S_ [h][v], "\t", _PAIRWISE_NS_ [h][v], "\n");
+											*/
+										}
+									}
+								}
+							}
+						}
+						if (pc == 0)
+						{
+							_PAIRWISE_S_  [h-hShift][v-vShift] = 0;
+							_PAIRWISE_NS_ [h-hShift][v-vShift] = 0;
+							_OBSERVED_S_  [h-hShift][v-vShift] = 0;
+							_OBSERVED_NS_ [h-hShift][v-vShift] = 0;
+						}
+						else
+						{
+							_PAIRWISE_S_  [h-hShift][v-vShift] = _PAIRWISE_S_  [h-hShift][v-vShift]/pc;
+							_PAIRWISE_NS_ [h-hShift][v-vShift] = _PAIRWISE_NS_ [h-hShift][v-vShift]/pc;
+							_OBSERVED_S_  [h-hShift][v-vShift] = _OBSERVED_S_  [h-hShift][v-vShift]/pc;
+							_OBSERVED_NS_ [h-hShift][v-vShift] = _OBSERVED_NS_ [h-hShift][v-vShift]/pc;						
+						}
+					}
+				}
+				_PAIRWISE_S_  [v-vShift][h-hShift] = _PAIRWISE_S_  [h-hShift][v-vShift];
+				_PAIRWISE_NS_ [v-vShift][h-hShift] = _PAIRWISE_NS_ [h-hShift][v-vShift];
+				_OBSERVED_S_  [v-vShift][h-hShift] = _OBSERVED_S_  [h-hShift][v-vShift];
+				_OBSERVED_NS_ [v-vShift][h-hShift] = _OBSERVED_NS_ [h-hShift][v-vShift];
+				
+				
+			}
+		}
+	}
+}
diff --git a/res/TemplateBatchFiles/Distances/JC69 b/res/TemplateBatchFiles/Distances/JC69
new file mode 100644
index 0000000..baed476
--- /dev/null
+++ b/res/TemplateBatchFiles/Distances/JC69
@@ -0,0 +1,26 @@
+function InitializeDistances (dummy)
+{
+	summingVector = {4,1}["1"];
+	return 0;
+}
+
+function ComputeDistanceFormula (s1,s2)
+{
+	GetDataInfo 		 (siteDifferenceCount, filteredData, s1, s2, DIST_OPTION);
+	totalSitesCompared = (Transpose(summingVector)*(siteDifferenceCount*summingVector))[0];
+	
+	if (totalSitesCompared)
+	{
+		totalDifference    = totalSitesCompared-(siteDifferenceCount[0][0]+siteDifferenceCount[1][1]+siteDifferenceCount[2][2]+siteDifferenceCount[3][3]);
+		totalDifference    = 1-4*totalDifference/(3*totalSitesCompared);
+		if (totalDifference > 0)
+		{
+			return -.75*Log(totalDifference);
+		}
+	}
+	else
+	{
+		return 0;
+	}
+	return 1000;
+}
diff --git a/res/TemplateBatchFiles/Distances/K2P b/res/TemplateBatchFiles/Distances/K2P
new file mode 100644
index 0000000..ba2672a
--- /dev/null
+++ b/res/TemplateBatchFiles/Distances/K2P
@@ -0,0 +1,33 @@
+function InitializeDistances (dummy)
+{
+	summingVector = {4,1}["1"];
+	return 0;
+}
+
+function ComputeDistanceFormula (s1,s2)
+{
+	GetDataInfo (siteDifferenceCount, filteredData, s1, s2, DISTANCE_AMBIG_OPTION);
+	
+	totalSitesCompared = (Transpose(summingVector)*(siteDifferenceCount*summingVector))[0];
+	if (totalSitesCompared)
+	{
+		_dTransitionCounts 	 =    siteDifferenceCount[0][2]+siteDifferenceCount[2][0]  /* A-G and G-A */
+								 +siteDifferenceCount[1][3]+siteDifferenceCount[3][1]; /* C-T and T-C */
+							
+		_dTransversionCounts = (siteDifferenceCount[0][0]+siteDifferenceCount[1][1]+siteDifferenceCount[2][2]+siteDifferenceCount[3][3])+_dTransitionCounts;
+		
+		_dTransitionCounts	 = _dTransitionCounts/totalSitesCompared;
+		_dTransversionCounts = 1-_dTransversionCounts/totalSitesCompared;
+		_d1					 = 1-2*_dTransitionCounts-_dTransversionCounts;
+		_d2					 = 1-2*_dTransversionCounts;
+		if (_d1 > 0 && _d2 > 0)
+		{
+			return -(0.5*Log(_d1)+.25*Log(_d2));
+		}
+	}
+	else
+	{
+		return 0;
+	}
+	return 1000;
+}
diff --git a/res/TemplateBatchFiles/Distances/K2P_RV b/res/TemplateBatchFiles/Distances/K2P_RV
new file mode 100644
index 0000000..dc03ad8
--- /dev/null
+++ b/res/TemplateBatchFiles/Distances/K2P_RV
@@ -0,0 +1,42 @@
+function InitializeDistances (dummy)
+{
+	if (DISTANCE_PROMPTS)
+	{
+		_distance_alpha = -1;
+		while (_distance_alpha<=0)
+		{
+			fprintf (stdout, "\nSelect the shape parameter Alpha of the gamma distribution (Var = 1/Alpha):");
+			fscanf  (stdin,"Number",_distance_alpha);
+		}
+	}
+	summingVector = {4,1}["1"];
+	return 0;
+}
+
+function ComputeDistanceFormula (s1,s2)
+{
+	GetDataInfo 		 (siteDifferenceCount, filteredData, s1, s2, DISTANCE_AMBIG_OPTION);
+	totalSitesCompared = (Transpose(summingVector)*(siteDifferenceCount*summingVector))[0];
+
+	if (totalSitesCompared)
+	{
+		_dTransitionCounts 	 =    siteDifferenceCount[0][2]+siteDifferenceCount[2][0]  /* A-G and G-A */
+								 +siteDifferenceCount[1][3]+siteDifferenceCount[3][1]; /* C-T and T-C */
+							
+		_dTransversionCounts = (siteDifferenceCount[0][0]+siteDifferenceCount[1][1]+siteDifferenceCount[2][2]+siteDifferenceCount[3][3])+_dTransitionCounts;
+		_dTransitionCounts	 = _dTransitionCounts/totalSitesCompared;
+		_dTransversionCounts = 1-_dTransversionCounts/totalSitesCompared;
+		
+		_d1					 = 1-2*_dTransitionCounts-_dTransversionCounts;
+		_d2					 = 1-2*_dTransversionCounts;
+		if (_d1 > 0 && _d2 > 0)
+		{
+			return _distance_alpha/2*(_d1^(-1/_distance_alpha)+.5*(_d2)^(-1/_distance_alpha)-1.5);
+		}
+	}
+	else
+	{
+		return 0;
+	}
+	return 1000;
+}
diff --git a/res/TemplateBatchFiles/Distances/Modified_Nei_Gojobori b/res/TemplateBatchFiles/Distances/Modified_Nei_Gojobori
new file mode 100644
index 0000000..aa8310e
--- /dev/null
+++ b/res/TemplateBatchFiles/Distances/Modified_Nei_Gojobori
@@ -0,0 +1,155 @@
+function InitializeDistances (dummy)
+{
+	if (DISTANCE_PROMPTS)
+	{		
+		_distance_tv_ts = -1;
+		while (_distance_tv_ts<=0)
+		{
+			fprintf (stdout, "\nSelect transversion/transition ratio (R=1 reduces to standard NG):");
+			fscanf  (stdin,"Number",_distance_tv_ts);
+		}
+
+		ChoiceList (distChoice, "Distance computation",1,SKIP_NONE,
+					"Joint p-distance(Default)","Observed N/E[N]+Observed S/E[S]",
+					"Syn p-distance","Observed S/E[S]",
+					"Non-syn p-distance","Observed N/E[N]",
+					"JC+joint p-distance","Observed N/E[N]+Observed S/E[S], corrected for multiple hits",
+					"JC+syn p-distance","Observed S/E[S], corrected for multiple hits",
+					"JC+non-syn p-distance","Observed N/E[N], corrected for multiple hits",
+					"dN-dS","Observed N/E[N]-Observed S/E[S]");
+					
+		if (distChoice<0)
+		{
+			distChoice = 0;
+		}	
+		
+		#include "CodonTools2.def";
+
+		matrixTrick  = {1,stateCharCount};
+		matrixTrick2 = {1,stateCharCount};
+
+		for (h=Columns(matrixTrick)-1; h>=0; h=h-1)
+		{
+			matrixTrick  [h] = h;
+			matrixTrick2 [h] = 1;
+		}
+	}
+	return 0;
+}
+
+/*----------------------------------------------------------------------------*/
+
+function ComputeDistanceFormula (s1,s2)
+{	
+	_SITE_ES_COUNT = {stateCharCount,stateCharCount};
+	_SITE_EN_COUNT = {stateCharCount,stateCharCount};
+	_SITE_OS_COUNT = {stateCharCount,stateCharCount};
+	_SITE_ON_COUNT = {stateCharCount,stateCharCount};
+	
+	GetDataInfo (siteDifferenceCount, filteredData, s1, s2, DISTANCE_AMBIG_OPTION);
+	
+	_SITE_OS_COUNT = matrixTrick2*(_OBSERVED_S_$siteDifferenceCount)*Transpose(matrixTrick2);
+	_SITE_ON_COUNT = matrixTrick2*(_OBSERVED_NS_$siteDifferenceCount)*Transpose(matrixTrick2);
+	_SITE_ES_COUNT = matrixTrick2*(_PAIRWISE_S_$siteDifferenceCount)*Transpose(matrixTrick2);
+	_SITE_EN_COUNT = matrixTrick2*(_PAIRWISE_NS_$siteDifferenceCount)*Transpose(matrixTrick2);
+	
+
+	if (_SITE_ES_COUNT[0])
+	{
+		if (_SITE_EN_COUNT[0])
+		{
+			if (distChoice == 0)
+			{
+				return (_SITE_OS_COUNT[0]/_SITE_ES_COUNT[0]+_SITE_ON_COUNT[0]/_SITE_EN_COUNT[0]);
+			}
+			if (distChoice == 1)
+			{
+				return _SITE_OS_COUNT[0]/_SITE_ES_COUNT[0];
+			}
+			if (distChoice == 2)
+			{
+				return _SITE_ON_COUNT[0]/_SITE_EN_COUNT[0];
+			}
+			if (distChoice == 3)
+			{
+				return -0.75*Log(1-4*(_SITE_OS_COUNT[0]/_SITE_ES_COUNT[0]+_SITE_ON_COUNT[0]/_SITE_EN_COUNT[0])/3);
+			}
+			if (distChoice == 4)
+			{
+				return -0.75*Log(1-4*(_SITE_OS_COUNT[0]/_SITE_ES_COUNT[0])/3);
+			}
+			if (distChoice == 5)
+			{
+				return -0.75*Log(1-4*(_SITE_ON_COUNT[0]/_SITE_EN_COUNT[0])/3);
+			}
+			if (distChoice == 6)
+			{
+				return (_SITE_ON_COUNT[0]/_SITE_EN_COUNT[0]-_SITE_OS_COUNT[0]/_SITE_ES_COUNT[0]);
+			}
+		}
+		else
+		{
+			if (distChoice == 0)
+			{
+				return (_SITE_OS_COUNT[0]/_SITE_ES_COUNT[0]);
+			}
+			if (distChoice == 1)
+			{
+				return _SITE_OS_COUNT[0]/_SITE_ES_COUNT[0];
+			}
+			if (distChoice == 2)
+			{
+				return 0;
+			}
+			if (distChoice == 3)
+			{
+				return -0.75*Log(1-4*(_SITE_OS_COUNT[0]/_SITE_ES_COUNT[0])/3);
+			}
+			if (distChoice == 4)
+			{
+				return -0.75*Log(1-4*(_SITE_OS_COUNT[0]/_SITE_ES_COUNT[0])/3);
+			}
+			if (distChoice == 5)
+			{
+				return 0;
+			}
+			if (distChoice == 6)
+			{
+				return -(_SITE_OS_COUNT[0]/_SITE_ES_COUNT[0]);
+			}
+		}
+	}
+	else
+	{
+		if (distChoice == 0)
+		{
+			return (_SITE_ON_COUNT[0]/_SITE_EN_COUNT[0]);
+		}
+		if (distChoice == 1)
+		{
+			return 0;
+		}
+		if (distChoice == 2)
+		{
+			return _SITE_ON_COUNT[0]/_SITE_EN_COUNT[0];
+		}
+		if (distChoice == 3)
+		{
+			return -0.75*Log(1-4*(_SITE_ON_COUNT[0]/_SITE_EN_COUNT[0])/3);
+		}
+		if (distChoice == 4)
+		{
+			return 0;
+		}
+		if (distChoice == 5)
+		{
+			return -0.75*Log(1-4*(_SITE_ON_COUNT[0]/_SITE_EN_COUNT[0])/3);
+		}
+		if (distChoice == 6)
+		{
+			return _SITE_ON_COUNT[0]/_SITE_EN_COUNT[0];
+		}
+	}
+	
+	return 0;
+}
diff --git a/res/TemplateBatchFiles/Distances/Nei_Gojobori b/res/TemplateBatchFiles/Distances/Nei_Gojobori
new file mode 100644
index 0000000..a9dfd34
--- /dev/null
+++ b/res/TemplateBatchFiles/Distances/Nei_Gojobori
@@ -0,0 +1,147 @@
+function InitializeDistances (dummy)
+{
+	if (DISTANCE_PROMPTS)
+	{		
+
+		ChoiceList (distChoice, "Distance computation",1,SKIP_NONE,
+					"Joint p-distance(Default)","Observed N/E[N]+Observed S/E[S]",
+					"Syn p-distance","Observed S/E[S]",
+					"Non-syn p-distance","Observed N/E[N]",
+					"JC+joint p-distance","Observed N/E[N]+Observed S/E[S], corrected for multiple hits",
+					"JC+syn p-distance","Observed S/E[S], corrected for multiple hits",
+					"JC+non-syn p-distance","Observed N/E[N], corrected for multiple hits",
+					"dN-dS","Observed N/E[N]-Observed S/E[S]");
+					
+		if (distChoice<0)
+		{
+			distChoice = 0;
+		}	
+		
+		#include "CodonTools.def";
+
+		matrixTrick  = {1,stateCharCount};
+		matrixTrick2 = {1,stateCharCount};
+
+		for (h=Columns(matrixTrick)-1; h>=0; h=h-1)
+		{
+			matrixTrick  [h] = h;
+			matrixTrick2 [h] = 1;
+		}
+	}
+	return 0;
+}
+
+/*----------------------------------------------------------------------------*/
+
+function ComputeDistanceFormula (s1,s2)
+{	
+	_SITE_ES_COUNT = {stateCharCount,stateCharCount};
+	_SITE_EN_COUNT = {stateCharCount,stateCharCount};
+	_SITE_OS_COUNT = {stateCharCount,stateCharCount};
+	_SITE_ON_COUNT = {stateCharCount,stateCharCount};
+	
+	GetDataInfo (siteDifferenceCount, filteredData, s1, s2, DISTANCE_AMBIG_OPTION);
+	
+	_SITE_OS_COUNT = matrixTrick2*(_OBSERVED_S_$siteDifferenceCount)*Transpose(matrixTrick2);
+	_SITE_ON_COUNT = matrixTrick2*(_OBSERVED_NS_$siteDifferenceCount)*Transpose(matrixTrick2);
+	_SITE_ES_COUNT = matrixTrick2*(_PAIRWISE_S_$siteDifferenceCount)*Transpose(matrixTrick2);
+	_SITE_EN_COUNT = matrixTrick2*(_PAIRWISE_NS_$siteDifferenceCount)*Transpose(matrixTrick2);
+	
+	if (_SITE_ES_COUNT[0])
+	{
+		if (_SITE_EN_COUNT[0])
+		{
+			if (distChoice == 0)
+			{
+				return (_SITE_OS_COUNT[0]/_SITE_ES_COUNT[0]+_SITE_ON_COUNT[0]/_SITE_EN_COUNT[0]);
+			}
+			if (distChoice == 1)
+			{
+				return _SITE_OS_COUNT[0]/_SITE_ES_COUNT[0];
+			}
+			if (distChoice == 2)
+			{
+				return _SITE_ON_COUNT[0]/_SITE_EN_COUNT[0];
+			}
+			if (distChoice == 3)
+			{
+				return -0.75*Log(1-4*(_SITE_OS_COUNT[0]/_SITE_ES_COUNT[0]+_SITE_ON_COUNT[0]/_SITE_EN_COUNT[0])/3);
+			}
+			if (distChoice == 4)
+			{
+				return -0.75*Log(1-4*(_SITE_OS_COUNT[0]/_SITE_ES_COUNT[0])/3);
+			}
+			if (distChoice == 5)
+			{
+				return -0.75*Log(1-4*(_SITE_ON_COUNT[0]/_SITE_EN_COUNT[0])/3);
+			}
+			if (distChoice == 6)
+			{
+				return (_SITE_ON_COUNT[0]/_SITE_EN_COUNT[0]-_SITE_OS_COUNT[0]/_SITE_ES_COUNT[0]);
+			}
+		}
+		else
+		{
+			if (distChoice == 0)
+			{
+				return (_SITE_OS_COUNT[0]/_SITE_ES_COUNT[0]);
+			}
+			if (distChoice == 1)
+			{
+				return _SITE_OS_COUNT[0]/_SITE_ES_COUNT[0];
+			}
+			if (distChoice == 2)
+			{
+				return 0;
+			}
+			if (distChoice == 3)
+			{
+				return -0.75*Log(1-4*(_SITE_OS_COUNT[0]/_SITE_ES_COUNT[0])/3);
+			}
+			if (distChoice == 4)
+			{
+				return -0.75*Log(1-4*(_SITE_OS_COUNT[0]/_SITE_ES_COUNT[0])/3);
+			}
+			if (distChoice == 5)
+			{
+				return 0;
+			}
+			if (distChoice == 6)
+			{
+				return -(_SITE_OS_COUNT[0]/_SITE_ES_COUNT[0]);
+			}
+		}
+	}
+	else
+	{
+		if (distChoice == 0)
+		{
+			return (_SITE_ON_COUNT[0]/_SITE_EN_COUNT[0]);
+		}
+		if (distChoice == 1)
+		{
+			return 0;
+		}
+		if (distChoice == 2)
+		{
+			return _SITE_ON_COUNT[0]/_SITE_EN_COUNT[0];
+		}
+		if (distChoice == 3)
+		{
+			return -0.75*Log(1-4*(_SITE_ON_COUNT[0]/_SITE_EN_COUNT[0])/3);
+		}
+		if (distChoice == 4)
+		{
+			return 0;
+		}
+		if (distChoice == 5)
+		{
+			return -0.75*Log(1-4*(_SITE_ON_COUNT[0]/_SITE_EN_COUNT[0])/3);
+		}
+		if (distChoice == 6)
+		{
+			return (_SITE_ON_COUNT[0]/_SITE_EN_COUNT[0]);
+		}
+	}
+	return 0;
+}
diff --git a/res/TemplateBatchFiles/Distances/PC b/res/TemplateBatchFiles/Distances/PC
new file mode 100644
index 0000000..98a1aee
--- /dev/null
+++ b/res/TemplateBatchFiles/Distances/PC
@@ -0,0 +1,15 @@
+function InitializeDistances (dummy)
+{
+	summingVector = {20,1}["1"];
+	tracingVector = {20,20}["_MATRIX_ELEMENT_ROW_ == _MATRIX_ELEMENT_COLUMN_"];
+	return 0;
+}
+
+function ComputeDistanceFormula (s1,s2)
+{
+	GetDataInfo 		 (siteDifferenceCount, filteredData, s1, s2, DISTANCE_AMBIG_OPTION);
+	totalSitesCompared = (Transpose(summingVector)*(siteDifferenceCount*summingVector));
+	totalDifference    = Transpose(summingVector)*(siteDifferenceCount$tracingVector*summingVector);
+	
+	return -Log(totalDifference[0]/totalSitesCompared[0]);
+}
diff --git a/res/TemplateBatchFiles/Distances/PC_MH b/res/TemplateBatchFiles/Distances/PC_MH
new file mode 100644
index 0000000..e66f9ba
--- /dev/null
+++ b/res/TemplateBatchFiles/Distances/PC_MH
@@ -0,0 +1,20 @@
+function InitializeDistances (dummy)
+{
+	summingVector = {20,1}["1"];
+	tracingVector = {20,20}["_MATRIX_ELEMENT_ROW_ == _MATRIX_ELEMENT_COLUMN_"];
+	return 0;
+}
+
+function ComputeDistanceFormula (s1,s2)
+{
+	GetDataInfo (siteDifferenceCount, filteredData, s1, s2, DISTANCE_AMBIG_OPTION);
+	totalDifference    = Transpose(summingVector)*(siteDifferenceCount$tracingVector*summingVector);
+	totalSitesCompared = Transpose(summingVector)*(siteDifferenceCount*summingVector);
+	totalDifference = totalDifference[0]/totalSitesCompared[0];
+	totalDifference = 1-totalDifference-totalDifference^2/5;
+	if (totalDifference<=0.0)
+	{
+		return 10;
+	}
+	return -Log(totalDifference);
+}
diff --git a/res/TemplateBatchFiles/Distances/PC_RV b/res/TemplateBatchFiles/Distances/PC_RV
new file mode 100644
index 0000000..c2a79ba
--- /dev/null
+++ b/res/TemplateBatchFiles/Distances/PC_RV
@@ -0,0 +1,23 @@
+function InitializeDistances (dummy)
+{
+	if (DISTANCE_PROMPTS)
+	{
+		_distance_alpha = -1;
+		while (_distance_alpha<=0)
+		{
+			fprintf (stdout, "\nSelect the shape parameter Alpha of the gamma distribution (Var = 1/Alpha):");
+			fscanf  (stdin,"Number",_distance_alpha);
+		}
+	}
+	summingVector = {20,1}["1"];
+	tracingVector = {20,20}["_MATRIX_ELEMENT_ROW_ == _MATRIX_ELEMENT_COLUMN_"];
+	return 0;
+}
+
+function ComputeDistanceFormula (s1,s2)
+{
+	GetDataInfo (siteDifferenceCount, filteredData, s1, s2, DISTANCE_AMBIG_OPTION);
+	totalDifference    = Transpose(summingVector)*(siteDifferenceCount$tracingVector*summingVector);
+	totalSitesCompared = Transpose(summingVector)*(siteDifferenceCount*summingVector);
+	return _distance_alpha*((totalDifference[0]/totalSitesCompared[0])^(-1/_distance_alpha)-1);
+}
diff --git a/res/TemplateBatchFiles/Distances/T3P b/res/TemplateBatchFiles/Distances/T3P
new file mode 100644
index 0000000..e13845b
--- /dev/null
+++ b/res/TemplateBatchFiles/Distances/T3P
@@ -0,0 +1,39 @@
+function InitializeDistances (dummy)
+{
+	HarvestFrequencies (_dNucFreq,filteredData,1,1,0);
+	_GC_Content_Factor = _dNucFreq[1]+_dNucFreq[2];
+	_GC_Content_Factor = 2*_GC_Content_Factor*(1-_GC_Content_Factor);
+
+	summingVector = {4,1}["1"];
+
+	return 0;
+}
+
+function ComputeDistanceFormula (s1,s2)
+{
+	GetDataInfo (siteDifferenceCount, filteredData, s1, s2, DISTANCE_AMBIG_OPTION);
+	
+	totalSitesCompared = (Transpose(summingVector)*(siteDifferenceCount*summingVector))[0];
+	if (totalSitesCompared)
+	{
+		_dTransitionCounts 	 =    siteDifferenceCount[0][2]+siteDifferenceCount[2][0]  /* A-G and G-A */
+								 +siteDifferenceCount[1][3]+siteDifferenceCount[3][1]; /* C-T and T-C */
+							
+		_dTransversionCounts = (siteDifferenceCount[0][0]+siteDifferenceCount[1][1]+siteDifferenceCount[2][2]+siteDifferenceCount[3][3])+_dTransitionCounts;
+		
+		_dTransitionCounts	 = _dTransitionCounts/totalSitesCompared;
+		_dTransversionCounts = 1-_dTransversionCounts/totalSitesCompared;
+		
+		_d1					 = 1-_dTransitionCounts/_GC_Content_Factor-_dTransversionCounts;
+		_d2					 = 1-2*_dTransversionCounts;
+		if (_d1 > 0 && _d2 > 0)
+		{
+			return -_GC_Content_Factor*Log(_d1)-.5*(1-_GC_Content_Factor)*Log(_d2);
+		}
+	}
+	else
+	{
+		return 0;
+	}
+	return 1000;
+}
diff --git a/res/TemplateBatchFiles/Distances/TN84 b/res/TemplateBatchFiles/Distances/TN84
new file mode 100644
index 0000000..4c7bbc5
--- /dev/null
+++ b/res/TemplateBatchFiles/Distances/TN84
@@ -0,0 +1,46 @@
+function InitializeDistances (dummy)
+{
+	HarvestFrequencies (_dNucFreq,filteredData,1,1,0);
+	
+	_d_fA = _dNucFreq[0];
+	_d_fC = _dNucFreq[1];
+	_d_fG = _dNucFreq[2];
+	_d_fT = _dNucFreq[3];
+	
+	_d_SS = _d_fA^2+_d_fC^2+_d_fG^2+_d_fT^2;
+	
+	summingVector = {4,1}["1"];
+
+	return 0;
+}
+
+function ComputeDistanceFormula (s1,s2)
+{
+	GetDataInfo (siteDifferenceCount, filteredData, s1, s2, DISTANCE_AMBIG_OPTION);
+	
+	totalSitesCompared = (Transpose(summingVector)*(siteDifferenceCount*summingVector))[0];
+	if (totalSitesCompared)
+	{
+		_d_c =  (siteDifferenceCount[0][1]+siteDifferenceCount[1][0])^2/(2*_d_fA*_d_fC)+
+				(siteDifferenceCount[0][2]+siteDifferenceCount[2][0])^2/(2*_d_fA*_d_fG)+
+				(siteDifferenceCount[0][3]+siteDifferenceCount[3][0])^2/(2*_d_fA*_d_fT)+
+				(siteDifferenceCount[1][2]+siteDifferenceCount[2][1])^2/(2*_d_fC*_d_fG)+
+				(siteDifferenceCount[1][3]+siteDifferenceCount[3][1])^2/(2*_d_fC*_d_fT)+
+				(siteDifferenceCount[2][3]+siteDifferenceCount[3][2])^2/(2*_d_fG*_d_fT);
+				
+		_dDifferenceCounts = 1-(siteDifferenceCount[0][0]+siteDifferenceCount[1][1]+
+								siteDifferenceCount[2][2]+siteDifferenceCount[3][3])/totalSitesCompared;
+
+		_d_c = .5*(1-_d_SS+_dDifferenceCounts^2/_d_c);
+		_d1	 = 1-_dDifferenceCounts/_d_c;
+		if (_d1 > 0)
+		{		
+			return -_d_c*Log(_d1);
+		}
+	}
+	else
+	{
+		return 0;
+	}
+	return 1000;
+}
diff --git a/res/TemplateBatchFiles/Distances/TN93 b/res/TemplateBatchFiles/Distances/TN93
new file mode 100644
index 0000000..9b1c720
--- /dev/null
+++ b/res/TemplateBatchFiles/Distances/TN93
@@ -0,0 +1,81 @@
+/* ________________________________________________________________________________________________*/
+
+
+function InitializeDistances (void)
+{
+	HarvestFrequencies (_dNucFreq,filteredData,1,1,0);
+	_d_fR = _dNucFreq[0]+_dNucFreq[2];
+	_d_fY = _dNucFreq[1]+_dNucFreq[3];
+	
+	if (_dNucFreq[0] == 0 || _dNucFreq[1] == 0 || _dNucFreq[2] == 0 || _dNucFreq[3] == 0)
+	{
+		_useK2P = 1;
+	}
+	else
+	{
+		_d_TN_K1 = 2*_dNucFreq[0]*_dNucFreq[2]/_d_fR;
+		_d_TN_K2 = 2*_dNucFreq[1]*_dNucFreq[3]/_d_fY;
+		_d_TN_K3 = 2*(_d_fR*_d_fY-_dNucFreq[0]*_dNucFreq[2]*_d_fY/_d_fR-_dNucFreq[1]*_dNucFreq[3]*_d_fR/_d_fY);
+		_useK2P = 0;
+	}
+	summingVector = {4,1}["1"];
+	return 0;
+}
+
+/* ________________________________________________________________________________________________*/
+
+function ComputeDistanceFormula (s1,s2)
+{
+	GetDataInfo (siteDifferenceCount, filteredData, s1, s2, DEFAULT);
+	
+	totalSitesCompared = (Transpose(summingVector)*(siteDifferenceCount*summingVector))[0];
+	if (totalSitesCompared)
+	{
+		if (_useK2P)
+		{
+			_dTransitionCounts 	 =    siteDifferenceCount[0][2]+siteDifferenceCount[2][0]  /* A-G and G-A */
+									 +siteDifferenceCount[1][3]+siteDifferenceCount[3][1]; /* C-T and T-C */
+								
+			_dTransversionCounts = (siteDifferenceCount[0][0]+siteDifferenceCount[1][1]+siteDifferenceCount[2][2]+siteDifferenceCount[3][3])+_dTransitionCounts;
+			
+			_dTransitionCounts	 = _dTransitionCounts/totalSitesCompared;
+			_dTransversionCounts = 1-_dTransversionCounts/totalSitesCompared;
+			
+			_d1C = 1-2*_dTransitionCounts-_dTransversionCounts;
+			_d2C = 1-2*_dTransversionCounts;
+			
+			if (_d1C>0 && _d2C>0)
+			{
+				return -(0.5*Log(_d1C)+.25*Log(_d2C));	
+			}
+		}
+		else
+		{
+			_dAGCounts 	 =    siteDifferenceCount[0][2]+siteDifferenceCount[2][0]  /* A-G and G-A */;
+			_dCTCounts	 = 	  siteDifferenceCount[1][3]+siteDifferenceCount[3][1]; /* C-T and T-C */
+								
+			_dTransversionCounts = (siteDifferenceCount[0][0]+siteDifferenceCount[1][1]+siteDifferenceCount[2][2]+
+									siteDifferenceCount[3][3])+_dAGCounts+_dCTCounts;
+			
+			_dAGCounts	 = _dAGCounts/totalSitesCompared;
+			_dCTCounts	 = _dCTCounts/totalSitesCompared;
+			
+			_dTransversionCounts = 1-_dTransversionCounts/totalSitesCompared;
+			
+			_d1C = 1-_dAGCounts/_d_TN_K1-0.5*_dTransversionCounts/_d_fR;
+			_d2C = 1-_dCTCounts/_d_TN_K2-0.5*_dTransversionCounts/_d_fY;
+			_d3C = 1-0.5*_dTransversionCounts/_d_fY/_d_fR;
+			
+			if ((_d1C>0)&&(_d2C>0)&&(_d3C>0))
+			{
+				return -_d_TN_K1*Log(_d1C)-_d_TN_K2*Log(_d2C)-_d_TN_K3*Log(_d3C);
+			}
+		}
+	}
+	else
+	{
+		return 0;
+	}
+	
+	return 1000;
+}
diff --git a/res/TemplateBatchFiles/Distances/TN93_RV b/res/TemplateBatchFiles/Distances/TN93_RV
new file mode 100644
index 0000000..437bb36
--- /dev/null
+++ b/res/TemplateBatchFiles/Distances/TN93_RV
@@ -0,0 +1,61 @@
+function InitializeDistances (dummy)
+{
+	if (DISTANCE_PROMPTS)
+	{
+		_distance_alpha = -1;
+		while (_distance_alpha<=0)
+		{
+			fprintf (stdout, "\nSelect the shape parameter Alpha of the gamma distribution (Var = 1/Alpha):");
+			fscanf  (stdin,"Number",_distance_alpha);
+		}
+	}
+
+	HarvestFrequencies (_dNucFreq,filteredData,1,1,0);
+	_d_fR = _dNucFreq[0]+_dNucFreq[2];
+	_d_fY = _dNucFreq[1]+_dNucFreq[3];
+
+	_d_TN_K1 = 2*_dNucFreq[0]*_dNucFreq[2]/_d_fR;
+	_d_TN_K2 = 2*_dNucFreq[1]*_dNucFreq[3]/_d_fY;
+	_d_TN_K3 = 2*(_d_fR*_d_fY-_dNucFreq[0]*_dNucFreq[2]*_d_fY/_d_fR-_dNucFreq[1]*_dNucFreq[3]*_d_fR/_d_fY);
+	_d_TN_K4 = 2*(_dNucFreq[0]*_dNucFreq[2]+_dNucFreq[1]*_dNucFreq[3]+_d_fR*_d_fY);
+	
+	summingVector = {4,1}["1"];
+	return 0;
+}
+
+function ComputeDistanceFormula (s1,s2)
+{
+	GetDataInfo (siteDifferenceCount, filteredData, s1, s2, DISTANCE_AMBIG_OPTION);
+	
+	totalSitesCompared = (Transpose(summingVector)*(siteDifferenceCount*summingVector))[0];
+	if (totalSitesCompared)
+	{
+		_dAGCounts 	 =    siteDifferenceCount[0][2]+siteDifferenceCount[2][0]  /* A-G and G-A */;
+		_dCTCounts	 = 	  siteDifferenceCount[1][3]+siteDifferenceCount[3][1]; /* C-T and T-C */
+							
+		_dTransversionCounts = (siteDifferenceCount[0][0]+siteDifferenceCount[1][1]+siteDifferenceCount[2][2]+
+								siteDifferenceCount[3][3])+_dAGCounts+_dCTCounts;
+		
+		_dAGCounts	 = _dAGCounts/totalSitesCompared;
+		_dCTCounts	 = _dCTCounts/totalSitesCompared;
+		
+		_dTransversionCounts = 1-_dTransversionCounts/totalSitesCompared;
+		
+		_d1C = 1-_dAGCounts/_d_TN_K1-0.5*_dTransversionCounts/_d_fR;
+		_d2C = 1-_dCTCounts/_d_TN_K2-0.5*_dTransversionCounts/_d_fY;
+		_d3C = 1-0.5*_dTransversionCounts/_d_fY/_d_fR;
+
+		if ((_d1C>0)&&(_d2C>0)&&(_d3C>0))
+		{
+			return _distance_alpha*(_d_TN_K1*_d1C^(-1/_distance_alpha)
+				   +_d_TN_K2*_d2C^(-1/_distance_alpha)
+				   +_d_TN_K3*_d3C^(-1/_distance_alpha)
+				   -_d_TN_K4);		
+		}
+	}
+	else
+	{
+		return 0;
+	}
+	return 1000;
+}
diff --git a/res/TemplateBatchFiles/Distances/Unaligned_LZ b/res/TemplateBatchFiles/Distances/Unaligned_LZ
new file mode 100644
index 0000000..ab266cb
--- /dev/null
+++ b/res/TemplateBatchFiles/Distances/Unaligned_LZ
@@ -0,0 +1,29 @@
+function InitializeDistances (dummy)
+{
+	GetInformation (actualSequences,filteredData);
+	/* preprocess sequences */
+	
+	LZContent = {Rows(actualSequences),1};
+
+	for (seqCounter = 0; seqCounter < Rows(actualSequences); seqCounter = seqCounter+1)
+	{
+		aSeq = actualSequences[seqCounter];
+		for (siteCounter = Abs(aSeq)-1; siteCounter>0; siteCounter=siteCounter-1)
+		{
+			if (aSeq[siteCounter]!="?")
+			{
+				break;
+			}
+		}
+		actualSequences[seqCounter] = aSeq[0][siteCounter];
+		LZContent [seqCounter] = Exp (actualSequences[seqCounter]);
+	}
+	return 0;
+}
+
+function ComputeDistanceFormula (s1,s2)
+{
+	dS1S2 = Exp (actualSequences[s1]+actualSequences[s2]);
+	dS2S1 = Exp (actualSequences[s2]+actualSequences[s1]);
+	return (dS1S2+dS2S1-LZContent[s1]-LZContent[s2])/(.5*(dS1S2+dS2S1));
+}
diff --git a/res/TemplateBatchFiles/Distances/Unaligned_LZ_FR b/res/TemplateBatchFiles/Distances/Unaligned_LZ_FR
new file mode 100644
index 0000000..d67e582
--- /dev/null
+++ b/res/TemplateBatchFiles/Distances/Unaligned_LZ_FR
@@ -0,0 +1,68 @@
+function InitializeDistances (dummy)
+{
+	GetInformation (actualSequences,filteredData);
+	/* preprocess sequences */
+	
+	totalSeqCount = Rows(actualSequences);
+	
+	LZContent 			  = {2*totalSeqCount,1};
+	complementedSequences = {totalSeqCount,1};
+	charComplement		  = {};
+	charComplement ["A"]  = "T";
+	charComplement ["C"]  = "G";
+	charComplement ["G"]  = "C";
+	charComplement ["A"]  = "T";
+
+	for (seqCounter = 0; seqCounter < totalSeqCount; seqCounter = seqCounter+1)
+	{
+		aSeq = actualSequences[seqCounter];
+		for (siteCounter = Abs(aSeq)-1; siteCounter>0; siteCounter=siteCounter-1)
+		{
+			if (aSeq[siteCounter]!="?")
+			{
+				break;
+			}
+		}
+		actualSequences[seqCounter] = aSeq[0][siteCounter];
+		complementedSequence = "";
+		complementedSequence * (siteCounter+1);
+		for (charCounter = siteCounter; charCounter >=0 ; charCounter = charCounter - 1)
+		{
+			compChar 	   = aSeq[charCounter];
+			compCharMapped = charComplement[compChar];
+			if (compCharMapped == 0)
+			{
+				compCharMapped = compChar;
+			}
+			complementedSequence * compCharMapped;
+		}
+		complementedSequence * 0;
+		complementedSequences [seqCounter] = complementedSequence;
+		LZContent [2*seqCounter]    = Exp (actualSequences[seqCounter]);
+		LZContent [2*seqCounter+1]  = Exp (complementedSequences[seqCounter]);
+	}
+	return 0;	
+}
+
+function ComputeDistanceFormula (s1,s2)
+{
+	dS1S2 = Exp (actualSequences[s1]+actualSequences[s2]);
+	dS2S1 = Exp (actualSequences[s2]+actualSequences[s1]);
+	
+	a1I    = complementedSequences[s1];
+	a2I    = complementedSequences[s2];
+	
+	dS1iS2 = Exp (a1I+actualSequences[s2]);
+	dS2S1i = Exp (actualSequences[s2]+a1I);
+
+	dS2iS1 = Exp (a2I+actualSequences[s1]);
+	dS1S2i = Exp (actualSequences[s1]+a2I);
+
+	dS2iS1i= Exp (a2I+a1I);
+	dS1iS2i= Exp (a1I+a2I);
+	
+	return Min((dS1S2+dS2S1-LZContent[2*s1]-LZContent[2*s2])/(.5*(dS1S2+dS2S1)),
+	       Min((dS1iS2+dS2S1i-LZContent[2*s1+1]-LZContent[2*s2])/(.5*(dS1iS2+dS2S1i)),
+	       Min((dS1S2i+dS2iS1-LZContent[2*s2+1]-LZContent[2*s1])/(.5*(dS1S2i+dS2iS1)),
+	           (dS1iS2i+dS2iS1i-LZContent[2*s2+1]-LZContent[2*s1+1])/(.5*(dS1iS2i+dS2iS1i)))));
+}
diff --git a/res/TemplateBatchFiles/Distances/p_Distance b/res/TemplateBatchFiles/Distances/p_Distance
new file mode 100644
index 0000000..2a4d80c
--- /dev/null
+++ b/res/TemplateBatchFiles/Distances/p_Distance
@@ -0,0 +1,16 @@
+function InitializeDistances (dummy)
+{
+	summingVector = {4,1}["1"];
+	return 0;
+}
+
+function ComputeDistanceFormula (s1,s2)
+{
+	GetDataInfo (siteDifferenceCount, filteredData, s1, s2, DISTANCE_AMBIG_OPTION);
+	totalSitesCompared = (Transpose(summingVector)*(siteDifferenceCount*summingVector))[0];
+	if (totalSitesCompared)
+	{
+		return 1-(siteDifferenceCount[0][0]+siteDifferenceCount[1][1]+siteDifferenceCount[2][2]+siteDifferenceCount[3][3])/totalSitesCompared;
+	}
+	return 1000;
+}
diff --git a/res/TemplateBatchFiles/Distances/p_Distance_aa b/res/TemplateBatchFiles/Distances/p_Distance_aa
new file mode 100644
index 0000000..2e900be
--- /dev/null
+++ b/res/TemplateBatchFiles/Distances/p_Distance_aa
@@ -0,0 +1,19 @@
+function InitializeDistances (dummy)
+{
+	summingVector = {20,1};
+	tracingVector = {20,20};
+	for (_d_k=0;_d_k<20;_d_k=_d_k+1)
+	{
+		summingVector[_d_k] = 1;
+		tracingVector[_d_k][_d_k] = 1;
+	}	
+	return 0;
+}
+
+function ComputeDistanceFormula (s1,s2)
+{
+	GetDataInfo (siteDifferenceCount, filteredData, s1, s2, DISTANCE_AMBIG_OPTION);
+	totalDifference    = Transpose(summingVector)*(siteDifferenceCount$tracingVector*summingVector);
+	totalSitesCompared = Transpose(summingVector)*(siteDifferenceCount*summingVector);
+	return 1-totalDifference[0]/totalSitesCompared[0];
+}
diff --git a/res/TemplateBatchFiles/Distances/p_Distance_binary b/res/TemplateBatchFiles/Distances/p_Distance_binary
new file mode 100644
index 0000000..761fa86
--- /dev/null
+++ b/res/TemplateBatchFiles/Distances/p_Distance_binary
@@ -0,0 +1,16 @@
+function InitializeDistances (dummy)
+{
+	summingVector = {2,1}["1"];
+	return 0;
+}
+
+function ComputeDistanceFormula (s1,s2)
+{
+	GetDataInfo (siteDifferenceCount, filteredData, s1, s2, DISTANCE_AMBIG_OPTION);
+	totalSitesCompared = (Transpose(summingVector)*(siteDifferenceCount*summingVector))[0];
+	if (totalSitesCompared)
+	{
+		return 1-(siteDifferenceCount[0][0]+siteDifferenceCount[1][1])/totalSitesCompared;
+	}
+	return 1000;
+}
diff --git a/res/TemplateBatchFiles/Distances/p_Distance_codon b/res/TemplateBatchFiles/Distances/p_Distance_codon
new file mode 100644
index 0000000..ab82711
--- /dev/null
+++ b/res/TemplateBatchFiles/Distances/p_Distance_codon
@@ -0,0 +1,61 @@
+function InitializeDistances (dummy)
+{
+	if (DISTANCE_PROMPTS)
+	{
+
+		ChoiceList (distChoice, "Distance computation",1,SKIP_NONE,
+					"Synonymous p-distance","Number of synonymous substitutions divided by sequence length",
+					"Non-synonymous p-distance","Number of non-synonymous substitutions divided by sequence length",
+					"Joint p-distance","Total number of substitutions divided by sequence length");
+					
+					
+		if (distChoice<0)
+		{
+			distChoice = 0;
+		}	
+		
+		#include "CodonTools.def";
+
+		matrixTrick  = {1,stateCharCount};
+		matrixTrick2 = {1,stateCharCount};
+
+		for (h=Columns(matrixTrick)-1; h>=0; h=h-1)
+		{
+			matrixTrick  [h] = h;
+			matrixTrick2 [h] = 1;
+		}
+	}
+	return 0;
+}
+
+/*----------------------------------------------------------------------------*/
+
+function ComputeDistanceFormula (s1,s2)
+{	
+	_SITE_ON_COUNT = {stateCharCount,stateCharCount};
+	
+	GetDataInfo (siteDifferenceCount, filteredData, s1, s2, DISTANCE_AMBIG_OPTION);
+		
+	
+	if (distChoice == 0)
+	{
+		_SITE_OS_COUNT = {stateCharCount,stateCharCount};
+		_SITE_OS_COUNT = matrixTrick2*(_OBSERVED_S_$siteDifferenceCount)*Transpose(matrixTrick2);
+		return (_SITE_OS_COUNT[0]/filteredData.sites);
+	}
+	if (distChoice == 1)
+	{
+		_SITE_ON_COUNT = {stateCharCount,stateCharCount};
+		_SITE_ON_COUNT = matrixTrick2*(_OBSERVED_NS_$siteDifferenceCount)*Transpose(matrixTrick2);
+		return (_SITE_ON_COUNT[0]/filteredData.sites);
+	}
+	if (distChoice == 2)
+	{
+		_SITE_OS_COUNT = {stateCharCount,stateCharCount};
+		_SITE_OS_COUNT = matrixTrick2*(_OBSERVED_S_$siteDifferenceCount)*Transpose(matrixTrick2);
+		_SITE_ON_COUNT = {stateCharCount,stateCharCount};
+		_SITE_ON_COUNT = matrixTrick2*(_OBSERVED_NS_$siteDifferenceCount)*Transpose(matrixTrick2);
+		return (_SITE_ON_COUNT[0]+_SITE_OS_COUNT[0])/filteredData.sites;
+	}
+	return 0;
+}
diff --git a/res/TemplateBatchFiles/FUBAR.bf b/res/TemplateBatchFiles/FUBAR.bf
new file mode 100644
index 0000000..5e4e67a
--- /dev/null
+++ b/res/TemplateBatchFiles/FUBAR.bf
@@ -0,0 +1,209 @@
+RequireVersion  ("2.11");
+
+fprintf (stdout, 
+"
+============================= FUBAR v1.0 ============================
+
+This file will perform a Fast Unbiased AppRoximate Bayesian (FUBAR)
+analysis of a coding sequence alignment to determine whether some
+sites have been subject to pervasive purifying or diversifying
+selection. For details of the method and explanations of various
+settings, please see http://www.hyphy.org/wiki/FUBAR
+
+Please note that a FUBAR analysis generates many files in the same
+directory as the original alignment. HyPhy needs to have write
+privileges to this directory. For example if the original file is in
+/home/sergei/FUBAR/data/pol.nex then at the end of a FUBAR run, there
+will also exist files such as /home/sergei/FUBAR/data/pol.nex.samples,
+/home/sergei/FUBAR/data/pol.nex.gridInfo etc. Many of these files can
+be further examined for diagnostic and other purposes. They also 
+provide checkpointing so that a partially completed analysis can be
+restarted.
+
+=====================================================================
+
+");
+
+/*
+     Load the nucleotide file with multiple 
+     trees/partitions if present 
+*/
+
+_cachingOK = 1;
+
+ExecuteAFile (Join(DIRECTORY_SEPARATOR,{{HYPHY_LIB_DIRECTORY[0][Abs(HYPHY_LIB_DIRECTORY)-2],"TemplateBatchFiles","TemplateModels","chooseGeneticCode.def"}}));
+LoadFunctionLibrary ("GrabBag");
+LoadFunctionLibrary ("ReadDelimitedFiles");
+
+_runAsFunctionLibrary = 0;
+ExecuteAFile (Join(DIRECTORY_SEPARATOR,{{HYPHY_LIB_DIRECTORY[0][Abs(HYPHY_LIB_DIRECTORY)-2],"TemplateBatchFiles","_MFReader_.ibf"}}));
+
+filePaths = {"Base": LAST_FILE_PATH,
+             "Nucleotide fit suffix": ".gtr_fit",
+             "Codon fit suffix": ".codon_fit",
+             "Grid information": ".grid_info",
+             "MCMC samples": ".samples",
+             "Output": ".fubar.csv",
+             "SimGrid": ".sim_grid_info",
+             "SimFitFile": ".sim_codon_fit"};
+             
+fprintf (stdout, "\n\nFUBAR will write intermediate and result files to\n", filePaths["Base"], ".extension\n\n");
+
+//----------------------------------------------------------------------------
+// PHASE 1: nucleotide fit
+//----------------------------------------------------------------------------
+
+_fubarNucFitLocation = filePaths["Base"] + filePaths["Nucleotide fit suffix"];
+
+if (_cachingOK && !_fubarNucFitLocation) {
+// file exists 
+     fprintf (stdout, "[CACHED] FUBAR found the self-contained nucleotide fit file at ", _fubarNucFitLocation, "\n"); 
+}
+else
+{
+    _cachingOK = 0;
+    ExecuteAFile (Join(DIRECTORY_SEPARATOR,{{PATH_TO_CURRENT_BF[0][Abs(PATH_TO_CURRENT_BF)-2],"FUBAR_HBL","FUBAR_PHASE_1.bf"}}), {"0" : _fubarNucFitLocation});
+    fprintf (stdout, "[DIAGNOSTIC] FUBAR wrote the self-contained nucleotide fit file to ", _fubarNucFitLocation, "\n"); 
+}
+
+//----------------------------------------------------------------------------
+// PHASE 2: branch length scaling and grid calculation
+//----------------------------------------------------------------------------
+
+fprintf (stdout, "\n\n");
+
+_fubarCodonFitLocation = filePaths["Base"] + filePaths["Codon fit suffix"];
+_fubarGridInfoLocation = filePaths["Base"] + filePaths["Grid information"];
+
+if (_cachingOK && !_fubarGridInfoLocation && !_fubarCodonFitLocation) {
+     fprintf (stdout, "[CACHED] FUBAR found the self-contained codon fit file at ", _fubarCodonFitLocation, "\n"); 
+     fprintf (stdout, "[CACHED] FUBAR found the site likelihoods file at ", _fubarGridInfoLocation, "\n"); 
+}
+else
+{
+    _cachingOK = 0;
+    _grid_points = prompt_for_a_value ("Number of grid points per dimension (total number is D^2)",20,5,50,1);
+    fprintf (stdout, "[DIAGNOSTIC] FUBAR will use a ", _grid_points , "X", _grid_points, " grid\n"); 
+    
+    ExecuteAFile (Join(DIRECTORY_SEPARATOR,{{PATH_TO_CURRENT_BF[0][Abs(PATH_TO_CURRENT_BF)-2],"FUBAR_HBL","FUBAR_PHASE_2.bf"}}), {"0" : _fubarNucFitLocation,
+                                                                                                                                 "1" : _fubarCodonFitLocation,
+                                                                                                                                 "2" : _fubarGridInfoLocation,
+                                                                                                                                 "3" : "" + _grid_points});
+    fprintf (stdout, "[DIAGNOSTIC] FUBAR wrote the self-contained codon fit file to ", _fubarCodonFitLocation, "\n"); 
+    fprintf (stdout, "[DIAGNOSTIC] FUBAR wrote the the site likelihoods file to ", _fubarGridInfoLocation, "\n"); 
+}
+
+//----------------------------------------------------------------------------
+// PHASE 3: MCMC
+//----------------------------------------------------------------------------
+
+fprintf (stdout, "\n\n");
+
+_fubarMCMCSamplesLocation = filePaths["Base"] + filePaths["MCMC samples"];
+
+if (_cachingOK && !_fubarMCMCSamplesLocation) {
+     fscanf (_fubarMCMCSamplesLocation, "Number", _fubarChainCount);
+     fprintf (stdout, "[CACHED] FUBAR found the MCMC samples based on ", _fubarChainCount, " chains at ", _fubarMCMCSamplesLocation, "\n"); 
+}
+else
+{
+    _cachingOK = 0;
+    _fubarChainCount = prompt_for_a_value ("Number of MCMC chains to run",5,2,20,1);
+    fprintf (stdout, "[DIAGNOSTIC] FUBAR will use run ", _fubarChainCount, " independent chains\n"); 
+    _fubarChainLength  = prompt_for_a_value ("The length of each chain",2000000,500000,100000000,1);    
+    fprintf (stdout, "[DIAGNOSTIC] FUBAR will run the chains for ", _fubarChainLength, " steps\n"); 
+    _fubarChainBurnin  = prompt_for_a_value ("Discard this many samples as burn-in",_fubarChainLength$2,_fubarChainLength$20,_fubarChainLength*95$100,1);
+    fprintf (stdout, "[DIAGNOSTIC] FUBAR will run discard ", _fubarChainBurnin, " steps as burn-in\n"); 
+    _fubarTotalSamples = prompt_for_a_value ("How many samples should be drawn from each chain",100,10,_fubarChainLength-_fubarChainBurnin,1);    
+    fprintf (stdout, "[DIAGNOSTIC] FUBAR will run thin each chain down to ", _fubarTotalSamples, " samples\n"); 
+    _fubarPriorShape = prompt_for_a_value ("The concentration parameter of the Dirichlet prior",0.5,0.001,1,0);    
+    fprintf (stdout, "[DIAGNOSTIC] FUBAR will use the Dirichlet prior concentration parameter of ", _fubarPriorShape, "\n"); 
+
+    ExecuteAFile (Join(DIRECTORY_SEPARATOR,{{PATH_TO_CURRENT_BF[0][Abs(PATH_TO_CURRENT_BF)-2],"FUBAR_HBL","FUBAR_PHASE_3.bf"}}), {"0" : _fubarMCMCSamplesLocation,
+                                                                                                                                 "1" : _fubarGridInfoLocation,
+                                                                                                                                 "2" : "" + _fubarChainCount,
+                                                                                                                                 "3" : "" + _fubarChainLength,
+                                                                                                                                 "4" : "" + _fubarChainBurnin,
+                                                                                                                                 "5" : "" + _fubarTotalSamples,
+                                                                                                                                 "6" : "" + _fubarPriorShape
+                                                                                                                                  });
+                                                                                                                                        
+                                                                                                            
+                                                                                                                                 
+    fprintf (stdout, "\n[DIAGNOSTIC] FUBAR wrote samples from ", _fubarChainCount, " independent chains to ", _fubarMCMCSamplesLocation, "[0-", _fubarChainCount-1, "]\n"); 
+}
+
+//----------------------------------------------------------------------------
+// PHASE 4: PROCESSING & FDR Simulation
+//----------------------------------------------------------------------------
+
+fprintf (stdout, "\n\n");
+
+_fubarResultLocation = filePaths["Base"] + filePaths["Output"];
+_fubarSimGrid        = filePaths["Base"] + filePaths["SimGrid"];
+_fubarSimFitFile     = filePaths["Base"] + filePaths["SimFitFile"];
+
+_fubar_do_simulations = 0;
+
+if (_cachingOK && !_fubarResultLocation && (_fubar_do_simulations == 0 || (!_fubarSimGrid && !_fubarSimFitFile))) {
+     fprintf (stdout, "[CACHED] FUBAR found the results file at ",_fubarResultLocation  ,"\n"); 
+}
+else
+{
+
+    ExecuteAFile (Join(DIRECTORY_SEPARATOR,{{PATH_TO_CURRENT_BF[0][Abs(PATH_TO_CURRENT_BF)-2],"FUBAR_HBL","FUBAR_PHASE_4.bf"}}), {"0" : _fubarNucFitLocation,
+                                                                                                                                 "1" : _fubarGridInfoLocation,
+                                                                                                                                 "2" : _fubarMCMCSamplesLocation,
+                                                                                                                                 "3" : "" + _fubarChainCount,
+                                                                                                                                 "4" : _fubarResultLocation,
+                                                                                                                                 "5" : _fubarSimFitFile,
+                                                                                                                                 "6" : _fubarSimGrid,
+                                                                                                                                 "7" : _fubarCodonFitLocation
+                                                                                                                                  });
+                                                                                                                                        
+                                                                                                            
+                                                                                                                                 
+    fprintf (stdout, "\n[DIAGNOSTIC] FUBAR wrote the results of its analysis to ", _fubarResultLocation, "\n"); 
+    if (_fubar_do_simulations) {
+        fprintf (stdout, "[DIAGNOSTIC] FUBAR wrote FDR simulation data to ", _fubarSimFitFile, "\n"); 
+        fprintf (stdout, "[DIAGNOSTIC] FUBAR wrote FDR grid information to ", _fubarSimFitFile, "\n"); 
+    }
+}
+
+fubar_data = (ReadCSVTable (_fubarResultLocation, 1))[1]%4;
+
+ExecuteAFile (Join(DIRECTORY_SEPARATOR,{{PATH_TO_CURRENT_BF[0][Abs(PATH_TO_CURRENT_BF)-2],"FUBAR_HBL","FUBAR_tools.ibf"}}));
+
+fprintf (stdout, "\n[RESULTS] At posterior probability >= 0.9 ");
+
+idx = Rows(fubar_data);
+mean_pp = 0;
+
+p_i = {};
+
+while (fubar_data[idx-1][4] >= 0.9 && idx > 0) {
+    mean_pp += (1-fubar_data[idx-1][4]);
+    p_i + (1-fubar_data[idx-1][4]);
+    idx += -1;
+}
+
+if (idx == Rows(fubar_data) ) {
+    fprintf (stdout, "there were no sites under diversifying positive selection\n");
+} else {
+    detected = Rows(fubar_data)-idx;
+    ci = computeENFP_CI (p_i, 0.05);
+    fprintf (stdout, "there were ", detected, " sites under diversifying positive selection, of which ", Format (mean_pp, 5,2), " [", ci[0], " - ", ci[1], "] are expected to be false positives.\n");
+    _fubar_did_simulations = Columns(fubar_data) > 9;
+    if (_fubar_did_simulations) {
+        fprintf (stdout, "\nCodon\tProb[dN/dS>1]\tEBF[dN/dS]>1\tPSRF\tN_eff\tFDR");
+        for (idx2 = Rows(fubar_data)-1; idx2 >= idx; idx2 += -1) {
+            fprintf (stdout, "\n", fubar_data[idx2][0], "\t",  fubar_data[idx2][4], "\t",  fubar_data[idx2][6], "\t", fubar_data[idx2][7], "\t",  fubar_data[idx2][8], "\t",  fubar_data[idx2][9]); 
+        }
+    } else {
+        fprintf (stdout, "\nCodon\tProb[dN/dS>1]\tEBF[dN/dS]>1\tPSRF\tN_eff");
+        for (idx2 = Rows(fubar_data)-1; idx2 >= idx; idx2 += -1) {
+            fprintf (stdout, "\n", fubar_data[idx2][0], "\t",  fubar_data[idx2][4], "\t",  fubar_data[idx2][6], "\t", fubar_data[idx2][7], "\t",  fubar_data[idx2][8]); 
+        }    
+    }
+    fprintf (stdout, "\n");
+}
diff --git a/res/TemplateBatchFiles/FUBAR_HBL/FUBAR_PHASE_1.bf b/res/TemplateBatchFiles/FUBAR_HBL/FUBAR_PHASE_1.bf
new file mode 100644
index 0000000..9c0d731
--- /dev/null
+++ b/res/TemplateBatchFiles/FUBAR_HBL/FUBAR_PHASE_1.bf
@@ -0,0 +1,23 @@
+fprintf (stdout, "[FUBAR PHASE 1] Optimizing relative branch lengths under the nucleotide REV model\n");
+
+vectorOfFrequencies = overallFrequencies;
+// 'overallFrequencies' is supplied by _MFReader_.ibf
+
+SKIP_HARVEST_FREQ = 1;
+LoadFunctionLibrary ("GRM", {"00":"Global"});
+
+populateTrees ("nuc_tree", fileCount);
+ExecuteCommands(constructLF ("nucLF", "nucData", "nuc_tree", fileCount));
+Optimize (nuc_res, nucLF);
+
+fprintf (stdout, "[FUBAR PHASE 1 FINISHED] log(L) = ", nuc_res[1][0], "\n");
+for (k = 1; k <= fileCount; k += 1)
+{
+    fprintf (stdout, "\tLength of tree ", k, " (substitutions/site) = ", +Eval("BranchLength(nuc_tree_" + k + ",-1)"),"\n");
+}
+
+LF_NEXUS_EXPORT_EXTRA = "positionalFrequencies = " + positionFrequencies + ";";
+SetDialogPrompt ("Write nucleotide model fit to");
+LIKELIHOOD_FUNCTION_OUTPUT = 7;
+fprintf (PROMPT_FOR_FILE, CLEAR_FILE, nucLF);
+DeleteObject (nucLF);
diff --git a/res/TemplateBatchFiles/FUBAR_HBL/FUBAR_PHASE_2.bf b/res/TemplateBatchFiles/FUBAR_HBL/FUBAR_PHASE_2.bf
new file mode 100644
index 0000000..b3acb4e
--- /dev/null
+++ b/res/TemplateBatchFiles/FUBAR_HBL/FUBAR_PHASE_2.bf
@@ -0,0 +1,133 @@
+fscanf  			(stdin,"String", nucFit);
+fscanf  			(stdin,"String", codonFit);
+fscanf  			(stdin,"String", gridInfoFile);
+fscanf              (stdin,"Number", grid_points);
+
+ExecuteAFile        (PATH_TO_CURRENT_BF + "FUBAR_tools.ibf");
+prefix              = "existingFit";
+timer               = Time (1);
+ExecuteAFile        (nucFit,"","existingFit");
+ExecuteAFile        (Join(DIRECTORY_SEPARATOR,{{HYPHY_LIB_DIRECTORY[0][Abs(HYPHY_LIB_DIRECTORY)-2],"TemplateBatchFiles","Utility","LocalMGREV.bf"}}));
+ExecuteAFile        (Join(DIRECTORY_SEPARATOR,{{HYPHY_LIB_DIRECTORY[0][Abs(HYPHY_LIB_DIRECTORY)-2],"TemplateBatchFiles","TemplateModels","CF3x4.bf"}}));
+
+nuc3x4 = CF3x4 (existingFit.positionalFrequencies,GeneticCodeExclusions);
+PopulateModelMatrix ("MGLocalQ", nuc3x4);
+vectorOfFrequencies = BuildCodonFrequencies(nuc3x4);
+Model MGLocal = (MGLocalQ, vectorOfFrequencies,0);
+
+GetString (nucLF_Info, existingFit.nucLF, -1);
+fileCount = Columns (nucLF_Info["Trees"]);
+
+AC := existingFit.AC;
+AT := existingFit.AT;
+CG := existingFit.CG;
+CT := existingFit.CT;
+GT := existingFit.GT;
+
+GetString           (mgBrLen, MGLocal, -1);
+ExecuteCommands     ("GetString (nucBrLen, "+(nucLF_Info["Models"])[0]+",-1);");
+ExecuteCommands     ("GetString (nucMdlInfo, "+(nucLF_Info["Models"])[0]+",-2);");
+ExecuteCommands     ("GetString (nuclParamInfo, "+nucMdlInfo["RATE_MATRIX"]+",-1)");
+
+assert              (Columns(nuclParamInfo["Local"])==1,"The nucleotide model must have exactly one local parameter");
+paramName       =   (nuclParamInfo["Local"])[0]; 
+ExecuteCommands     ("FindRoot(nf,`nucBrLen`-1,`paramName`,0,1e10);");
+paramName       =   paramName[Abs(prefix) + 1][Abs(paramName)-1];
+
+//----------------------------------------------------------------------------
+
+
+rescaleBranchLengths (0.5,1);
+ExecuteCommands (constructLF ("codonLF", "codon_filter", "codon_tree", fileCount));
+
+grid = defineAlphaBetaGrid (grid_points);
+
+fprintf         (stdout, "[FUBAR PHASE 2] Determining appropriate branch scaling using the ", grid_points, "X", grid_points, " grid points.\n");
+bestPair        = computeLFOnGrid ("codonLF", grid, 0);
+bestPair        = bestPair%2;
+bestAlpha = bestPair [Rows(bestPair)-1][0];
+bestBeta  = bestPair [Rows(bestPair)-1][1];
+
+if (bestAlpha < 0.01) {
+    bestAlpha = 0.01;
+}
+
+
+LF_NEXUS_EXPORT_EXTRA = "";
+rescaleBranchLengths (bestBeta/bestAlpha,0);
+Export(lfExport,codonLF);
+fprintf (codonFit, CLEAR_FILE,lfExport); 
+
+
+fprintf         (stdout, "\tBest scaling achieved for dN/dS = ", Format(bestBeta/bestAlpha,5,2), ".\n\tComputing site-by-site likelihoods at ", 
+                                     grid_points, "X", grid_points, " grid points\n");
+
+gridInfo        = computeLFOnGrid ("codonLF", grid, 1);
+
+fprintf         (stdout, "\tFinished with likelihood calculations. Achieved throughput of  ",
+                                   Format(Rows(grid)/(Time(1)-timer),4,2), " calculations/second\n");
+
+
+fprintf         (gridInfoFile,CLEAR_FILE, grid, "\n", gridInfo);
+
+//------------------------------------------------------------------------------------------------//
+
+function rescaleBranchLengths (dNdS, firstPass) {
+    nonSynRate:=dNdS*synRate;
+    ExecuteCommands   ("FindRoot(cf,`mgBrLen`-3,synRate,0,1e10);");
+    nonSynRate=synRate;
+    
+    scalingFactor = cf/nf;
+    
+    global alpha = 1;
+    global beta  = dNdS;
+        
+    for (file_part = 1; file_part <= fileCount; file_part += 1) {
+        if (firstPass) {
+            treeString = Eval ("Format (" + (nucLF_Info["Trees"])[file_part-1] + ",1,1)");
+            ExecuteCommands   ("Tree codon_tree_" + file_part + " = " + treeString);
+            ExecuteCommands   ("DataSetFilter codon_filter_" + file_part + " = CreateFilter (" + (nucLF_Info["Datafilters"])[file_part-1] + ",3,,,GeneticCodeExclusions)");
+        } else {
+            ExecuteCommands ("ClearConstraints (codon_tree_" + file_part + ");");
+        }
+        ExecuteCommands   ("ReplicateConstraint (\"this1.?.synRate:=alpha*scalingFactor__*this2.?.`paramName`__\",codon_tree_" + file_part + "," +  (nucLF_Info["Trees"])[file_part-1] + ");");
+        ExecuteCommands   ("ReplicateConstraint (\"this1.?.nonSynRate:=beta*scalingFactor__*this2.?.`paramName`__\",codon_tree_" + file_part + "," +  (nucLF_Info["Trees"])[file_part-1] + ");");
+    }
+    return 0;
+}
+
+//------------------------------------------------------------------------------------------------//
+
+function defineAlphaBetaGrid (one_d_points) {
+    alphaBetaGrid = {one_d_points^2,2}; // (alpha, beta) pair
+    oneDGrid      = {one_d_points,1};
+   
+    one_d_points    = Max (one_d_points, 10);
+    neg_sel         = 0.7;
+    neg_sel_points  = ((one_d_points)*neg_sel+0.5)$1;
+    pos_sel_points  = (one_d_points-1)*(1-neg_sel)$1;
+    if (neg_sel_points + pos_sel_points != one_d_points) {
+        pos_sel_points = one_d_points - neg_sel_points; 
+    }
+    _neg_step = 1/neg_sel_points;
+    for (_k = 0; _k < neg_sel_points; _k += 1) {
+        oneDGrid [_k][0] =  _neg_step * _k;
+    }
+    oneDGrid [neg_sel_points-1][0] = 1;
+    _pos_step = 49^(1/3)/pos_sel_points;
+    for (_k = 1; _k <= pos_sel_points; _k += 1) {
+        oneDGrid [neg_sel_points+_k-1][0] = 1+(_pos_step*_k)^3;
+    }
+    
+    _p = 0;
+    for (_r = 0; _r < one_d_points; _r += 1) {
+        for (_c = 0; _c < one_d_points; _c += 1) {
+           alphaBetaGrid[_p][0] = oneDGrid[_r];
+           alphaBetaGrid[_p][1] = oneDGrid[_c];
+           _p += 1;
+        }
+    }
+    
+    return alphaBetaGrid;   
+}
+
diff --git a/res/TemplateBatchFiles/FUBAR_HBL/FUBAR_PHASE_3.bf b/res/TemplateBatchFiles/FUBAR_HBL/FUBAR_PHASE_3.bf
new file mode 100644
index 0000000..8d81a20
--- /dev/null
+++ b/res/TemplateBatchFiles/FUBAR_HBL/FUBAR_PHASE_3.bf
@@ -0,0 +1,245 @@
+fscanf              (stdin,"String", _sampleFile);
+fscanf              (stdin,"String", _gridInfo);
+
+
+fscanf              (stdin,"Number", _chainsToRun);
+fscanf              (stdin,"Number", _chainLength);
+fscanf              (stdin,"Number", _chainBurnin);
+fscanf              (stdin,"Number", _chainSamples);
+fscanf              (stdin,"Number", _concentration);
+
+ExecuteAFile        (PATH_TO_CURRENT_BF + "FUBAR_tools.ibf");
+
+assert (_chainsToRun > 1, "Must specify at least MCMC TWO chains to run");
+
+/* the MCMC function */
+
+baseFilePath  		= PATH_TO_CURRENT_BF + "spool/"+_in_FilePath;
+
+debug = 0;
+
+if (!debug) {
+    funcText = "";
+    funcsToExport = {"0": "runMCMC", "1": "jointLogL", "2": "LogDrichletDensity", "3": "computeLogLFfromGridAndWeights", "4": "siteLikelihoodsGivenWeights"};
+    for (k = 0; k < Abs (funcsToExport); k+=1) {
+        funcText += exportFunctionDefinition (funcsToExport[k]);
+    }
+    
+    
+     funcText += "\nfor (_chainIndex=start; _chainIndex<end; _chainIndex+=1) {runMCMC(_chainIndex,_gridInfo,_sampleFile,_chainLength,_chainBurnin,_chainSamples,_concentration);} return 0;";
+    
+     variablesToExport = "_gridInfo = \"" + _gridInfo + "\";\n" + 
+                         "_sampleFile = \"" + _sampleFile + "\";\n" +   
+                         "_chainsToRun = " + _chainsToRun + ";\n" +   
+                         "_chainLength = " + _chainLength + ";\n" +   
+                         "_chainBurnin = " + _chainBurnin + ";\n" +   
+                         "_chainSamples = " + _chainSamples + ";\n" +   
+                         "_concentration = " + _concentration + ";\n";
+
+     if (MPI_NODE_COUNT > 1 && _chainsToRun > 1) {
+            per_node    = Max(1,_chainsToRun $ MPI_NODE_COUNT);
+            _startPoint = _chainsToRun-per_node;
+            leftover    = _chainsToRun-per_node*MPI_NODE_COUNT;
+            
+            from          = 0;
+            to            = per_node + (leftover>0);
+            node_ranges   = {MPI_NODE_COUNT,2};
+            
+            for (node_id = 1; node_id < Min(_chainsToRun,MPI_NODE_COUNT); node_id += 1) {
+                                        
+                MPISend				(node_id, variablesToExport + ";start = " +from + ";end=" + to+";" + funcText); 
+                
+                
+                node_ranges [node_id][0]         = from;
+                node_ranges [node_id][1]         = to;
+                
+                from                             = to;
+                to                              += per_node+(node_id<=leftover);  
+            } 
+        } else {
+        _startPoint = 0;    
+    }
+        
+    for (_r = _startPoint; _r < _chainsToRun; _r += 1){
+        runMCMC(_r,_gridInfo,_sampleFile,_chainLength,_chainBurnin,_chainSamples,_concentration);
+    }
+    
+    fprintf         (stdout, "\n[FUBAR PHASE 3 DONE] Finished running the MCMC chains; drew ", _chainsToRun, "x", _chainSamples, " samples from chains of length ", _chainLength, 
+                             " after discarding ", _chainBurnin, " burn-in steps. Achieved throughput of ", Format(_chainLength/(Time(1)-time0),6,0) + " moves/sec.\n");
+   
+    if (MPI_NODE_COUNT > 1 && points > MPI_NODE_COUNT) {
+        for (node_id = 1; node_id < Min(_chainsToRun,MPI_NODE_COUNT); node_id += 1) {
+            MPIReceive (-1,fromNode,res);
+        }
+    }
+
+    fprintf (_sampleFile,CLEAR_FILE, _chainsToRun, "\n");
+}
+
+//------------------------------------------------------------------------------------------------//
+
+function jointLogL (weights, alpha) {
+    ll  = computeLogLFfromGridAndWeights (weights);
+    dir = LogDrichletDensity (weights, alpha);
+    return {{ll__, dir__}};
+}
+
+
+//------------------------------------------------------------------------------------------------//
+ 
+
+function LogDrichletDensity (dir_weights, alpha) {
+     if (Min(dir_weights, 0) <= 1e-10) {
+        return -1e10;
+     }
+     if (alpha == 1) {
+        return 0;
+     }  
+     dim = Columns (dir_weights);
+     return  (+dir_weights["Log(_MATRIX_ELEMENT_VALUE_)*(alpha-1)"]+LnGamma(alpha*dim)-dim*LnGamma(alpha));
+}
+
+//------------------------------------------------------------------------------------------------//
+
+function computeLogLFfromGridAndWeights (wts) {
+    return +(((wts *(gridInfo["conditionals"]))["Log(_MATRIX_ELEMENT_VALUE_)"])+gridInfo["scalers"]);
+}
+
+//------------------------------------------------------------------------------------------------//
+
+function siteLikelihoodsGivenWeights (wts) {
+    return wts*(gridInfo["conditionals"]);
+}
+
+//------------------------------------------------------------------------------------------------//
+
+function runMCMC (chainID,gridFile, sampleFile, total,discard,expected_samples,_concentration_parameter){
+    
+    fscanf (gridFile, REWIND, "NMatrix,Raw", grid, gridInfo);
+    gridInfo = Eval(gridInfo);
+    
+    points             = Rows(grid);
+    sites              = Columns(gridInfo["conditionals"]);
+    normalize_by_site  = ({1,points}["1"])*(gridInfo["conditionals"]);
+    normalized_weights = (gridInfo["conditionals"])*({sites,sites}["1/normalize_by_site[_MATRIX_ELEMENT_ROW_]*(_MATRIX_ELEMENT_ROW_==_MATRIX_ELEMENT_COLUMN_)"]);
+    sum_by_site        = normalized_weights * ({sites,1}["1"]);
+   
+    
+    weights = {1,points}["Random(sum_by_site[_MATRIX_ELEMENT_COLUMN_]*0.8,sum_by_site[_MATRIX_ELEMENT_COLUMN_]*1.2)"];
+    weights = weights * (1/(+weights));
+    
+    gridSampled = {points, 3};
+    for (k = 0; k < points; k+=1) {
+        gridSampled[k][0] = grid[k][0];
+        gridSampled[k][1] = grid[k][1];
+        gridSampled[k][2] = weights[k];
+    }
+    
+    //fprintf (stdout, +weights["_MATRIX_ELEMENT_VALUE_<1e-10"], "\n");
+    
+    defaultStep = Max(Min(0.001,1/sites),(weights%0)[points*50$100]);
+    
+    //fprintf (stdout, "\nDefault step = ", defaultStep, "\n");
+     
+    currentSiteLikelihoods = siteLikelihoodsGivenWeights (weights);
+    currentSiteLogSum      = +(currentSiteLikelihoods["Log(_MATRIX_ELEMENT_VALUE_)"]);
+    currentLogL            = jointLogL (weights, _concentration_parameter);
+    individualGridPointContribs = {};
+    
+    for (k = 0; k < points; k+=1) {
+        individualGridPointContribs [k] = (gridInfo["conditionals"])[k][-1];
+    }    
+    
+    contracting            = total*50;
+    sample                 = (total-discard)$expected_samples;
+    sampled_weights        = {expected_samples,points};
+    sampled_likelihoods    = {1,expected_samples};
+    
+    time0                = Time(1);
+    sample_index         = 0;
+    
+    baselineStep         = defaultStep;
+    reductionFactor      = 1;
+    accepted_steps       = 0;
+
+    if (MPI_NODE_ID == 0) {
+        fprintf         (stdout, "\n[FUBAR PHASE 3] Running an MCMC chain (ID ",chainID, ") to obtain a posterior sample of grid point weights: ", total, 
+                                            " total steps, of which ", discard, " will be discarded as burn-in, and sampling every ", sample, " steps. Dirichlet prior concentration parameter = ", _concentration, ".\n");
+        if (MPI_NODE_COUNT > 1)
+        {
+            fprintf         (stdout, "\tIn addition, ", _chainsToRun-1 , " independent chains (started at random points in the search spaces) are being run in parallel to evaluate convergence and effective sample sizes. The final sample will include thinned post burn-in representatives from all chains\n");
+        }
+    }
+
+    totalStepSum        = 0;
+    meanSampledLogL     = 0;
+    initialLogL         = currentLogL[0];
+
+    for (steps = 0; steps < total; steps += 1) {              
+
+        idx    = Random (0, points-1e-10)$1;
+        idx2   = Random (0, points-1e-10)$1;
+        while (idx == idx2) {
+            idx2   = Random (0, points-1e-10)$1;     
+        }
+        
+        if ((steps+1) % contracting == 0) {
+            acc_rate = accepted_steps/steps;
+            if (acc_rate < 0.25) {
+                baselineStep = baselineStep/1.6;
+            } else if (acc_rate > 0.5) {
+                baselineStep = baselineStep*1.6;                
+            }
+        }
+        
+        change = Random (0,baselineStep);
+        totalStepSum += change;
+        
+        if (weights[idx] > change) {
+            diffVector          = (individualGridPointContribs[idx2]-individualGridPointContribs[idx])*change;
+            logLDiff            = +((currentSiteLikelihoods + diffVector)["Log(_MATRIX_ELEMENT_VALUE_)"]) - currentSiteLogSum;
+            diffPrior           = (_concentration_parameter-1)*(Log((weights[idx]-change)/weights[idx])+Log((weights[idx2]+change)/weights[idx2]));
+            costOfMove          = logLDiff+diffPrior;
+            
+            if (Random (0,1) <= Exp (costOfMove)) {
+            
+                currentLogL[0] += logLDiff;
+                currentLogL[1] += diffPrior;
+         
+                currentSiteLikelihoods += diffVector;
+                currentSiteLogSum += logLDiff;
+                 
+                weights[idx]  += (-change);
+                weights[idx2] += (+change);
+                accepted_steps += 1;
+            } 
+        }
+        
+        if (steps > discard) {
+            if ((steps - discard + 1) % sample == 0) {
+                for (dd = 0; dd < points; dd += 1) {
+                    sampled_weights[sample_index][dd] = weights[dd];
+                }
+                sampled_likelihoods[sample_index] = currentLogL[0];
+                meanSampledLogL += currentLogL[0];
+                sample_index += 1;
+                logLString = meanSampledLogL/sample_index;
+            }
+        } else {
+            logLString = "(burning in)";
+        }
+    
+        if ((1+steps) % sample == 0) {
+             if (MPI_NODE_ID == 0) {
+                SetParameter (STATUS_BAR_STATUS_STRING, "Running MCMC chain ID "+ chainID + ". Current step: " + (1+steps) + "/" + total + ". Mean sampled log(L) = " + logLString 
+                + ". Acceptance rate = " + accepted_steps/steps, 
+                0);
+            }
+        }
+    }
+
+    mcmcfile = _sampleFile + "." + chainID;
+    fprintf (mcmcfile,CLEAR_FILE, sampled_likelihoods, "\n\n", sampled_weights);
+    
+    return 0;
+}
diff --git a/res/TemplateBatchFiles/FUBAR_HBL/FUBAR_PHASE_4.bf b/res/TemplateBatchFiles/FUBAR_HBL/FUBAR_PHASE_4.bf
new file mode 100644
index 0000000..c907a20
--- /dev/null
+++ b/res/TemplateBatchFiles/FUBAR_HBL/FUBAR_PHASE_4.bf
@@ -0,0 +1,106 @@
+fscanf              (stdin, "String", nuc_fit_file);
+fscanf              (stdin, "String", grid_file);
+fscanf              (stdin, "String", sample_base_file);
+fscanf              (stdin, "Number", _chainCount);
+fscanf              (stdin, "String", results_file);
+
+// for PHASE 5
+fscanf (stdin, "String", sim_fit_file);
+fscanf (stdin, "String", sim_grid_info);
+fscanf (stdin, "String", codon_fit_file);
+
+ExecuteAFile        (PATH_TO_CURRENT_BF + "FUBAR_tools.ibf");
+LoadFunctionLibrary ("GrabBag");
+LoadFunctionLibrary ("WriteDelimitedFiles");
+
+ExecuteAFile        (nuc_fit_file);
+sequences = nucData_1.species;
+GetInformation (treeCount,"^nuc_tree_[0-9]+$");
+fileCount       = Columns (treeCount);
+treeLengths     = {fileCount,1};
+
+for (fileID = 1; fileID <= fileCount; fileID += 1)
+{
+	treeLengths [fileID-1] = + Eval("BranchLength(nuc_tree_"+fileID+",-1)");
+}
+
+fscanf (grid_file, REWIND, "NMatrix,Raw", grid, site_probs);
+site_probs = Eval (site_probs);
+sites   = Columns (site_probs["conditionals"]);
+
+
+readMCMCSamples (sample_base_file,_chainCount);
+
+
+notPositiveSelection = {points,1} ["grid[_MATRIX_ELEMENT_ROW_][0]>=grid[_MATRIX_ELEMENT_ROW_][1]"];
+nonPositiveCount     = +notPositiveSelection;
+
+priorMean            = {1, points};
+sampleFromThisDistro = {nonPositiveCount,2};
+
+tabulateGridResults (points, sites, samples, _chainCount);
+
+from = 0;
+for (_point = 0; _point < points; _point += 1) {
+    priorMean [_point] = (+jointSamples[-1][_point])/samples;
+    if (notPositiveSelection [_point]) {
+        sampleFromThisDistro [from][0] = _point;
+        sampleFromThisDistro [from][1] = priorMean [_point];
+        from += 1;
+    }
+}
+
+priorNN = +(sampleFromThisDistro [-1][1]);
+fubar_results = reportSiteResults   (sites, 0, priorNN, _fubar_do_simulations);
+fubarRowCount     = Rows (fubar_results);
+
+if (_fubar_do_simulations) {
+    simPatterns = Random(sampleFromThisDistro, {"PDF":"Multinomial","ARG0":1000});
+    fprintf (sample_base_file, CLEAR_FILE, _chainCount, "\n", jointLogL, "\n", jointSamples);
+    
+    fprintf (stdout, "\n[FUBAR PHASE 5] Performing 1,000 simulations under the data-derived composite null model to derive False Discovery Rate (FDR) estimates\n");
+    ExecuteAFile (PATH_TO_CURRENT_BF + "FUBAR_PHASE_5.bf");
+    
+    // sort posteriorsUnderNN on the posterior prob of pos.sel. column
+    
+    posteriorsNNPP    = (posteriorsUnderNN[-1][3]) % 0;
+    sortedFubarP      = ({Rows (fubar_results), 2} ["_MATRIX_ELEMENT_ROW_*(_MATRIX_ELEMENT_COLUMN_==0)+fubar_results[_MATRIX_ELEMENT_ROW_][3]*(_MATRIX_ELEMENT_COLUMN_==1)"])%1;
+    
+    currentNNRows     = Rows (posteriorsUnderNN);
+    
+    currentNNIndex    = currentNNRows - 1;
+    
+    
+    for (currentFubarIndex =  fubarRowCount - 1; currentFubarIndex >= 0; currentFubarIndex += -1) {
+        currentFubarPosteriorP = sortedFubarP[currentFubarIndex][1];
+        
+        while (currentNNIndex > 0 && posteriorsNNPP[currentNNIndex] > currentFubarPosteriorP) {
+            currentNNIndex = currentNNIndex - 1;
+        }
+        
+        FDR = Min (1,(currentNNRows-currentNNIndex)/currentNNRows * priorNN / ((fubarRowCount-currentFubarIndex) / fubarRowCount));
+        
+        if (currentNNIndex == 0) {
+            break;
+        }
+        fubar_results[sortedFubarP[currentFubarIndex][0]][7] = FDR;
+        
+    }
+    
+    for (; currentFubarIndex >= 0; currentFubarIndex += -1) {
+        FDR = Min (1, priorNN / ((fubarRowCount-currentFubarIndex) / fubarRowCount));
+        fubar_results[sortedFubarP[currentFubarIndex][0]][7] = FDR;
+    }
+}
+
+site_counter = {};
+for (currentFubarIndex = 0; currentFubarIndex < fubarRowCount; currentFubarIndex += 1) {
+    site_counter + (currentFubarIndex+1);
+}
+
+if (_fubar_do_simulations) {
+    WriteSeparatedTable (results_file, {{"Codon","alpha","beta","beta-alpha","Prob[alpha<beta]", "Prob[alpha>beta]", "BayesFactor","PSRF", "Neff", "FDR"}}, fubar_results, site_counter, ",");
+} else {
+    WriteSeparatedTable (results_file, {{"Codon","alpha","beta","beta-alpha","Prob[alpha<beta]", "Prob[alpha>beta]", "BayesFactor","PSRF", "Neff"}}, fubar_results, site_counter, ",");
+}
+ 
\ No newline at end of file
diff --git a/res/TemplateBatchFiles/FUBAR_HBL/FUBAR_PHASE_5.bf b/res/TemplateBatchFiles/FUBAR_HBL/FUBAR_PHASE_5.bf
new file mode 100644
index 0000000..565533e
--- /dev/null
+++ b/res/TemplateBatchFiles/FUBAR_HBL/FUBAR_PHASE_5.bf
@@ -0,0 +1,168 @@
+ExecuteAFile (codon_fit_file);
+
+codonCharactersAgrument = {{"A","C","G","T"}
+			  			   {"3",GeneticCodeExclusions,"",""}};
+
+nn_sample_count = + (simPatterns[-1][1]);
+byGridPoint     = {nn_sample_count, 3};
+
+GetString         (lfInfo, codonLF, -1);
+_treeCount      = Columns (lfInfo["Trees"]);
+_filterNames    = lfInfo ["Datafilters"];
+
+baseFrequencies = Eval ((lfInfo["Base frequencies"])[0]);
+GetString (targetSpeciesOrdering, existingFit.ds_1,-1);
+
+sequenceCount = existingFit.ds_1.species;
+indexer       = 0;
+
+
+accumulatedSequences = {};
+
+for (k = 0; k < _treeCount; k+=1) {
+    accumulatedSequences [k] = {};
+    for (k2 = 0; k2 < sequenceCount; k2+=1) {
+        (accumulatedSequences [k])[k2] = "";
+        (accumulatedSequences [k])[k2] *128;
+    }
+}
+
+for (k = 0; k < Rows(simPatterns); k += 1) {
+    samples_for_this_value = simPatterns[k][1];
+    alpha_beta  = grid[simPatterns[k][0]][-1];
+    for (k2 = 0; k2 < samples_for_this_value; k2+=1) {
+        byGridPoint[indexer][0] = alpha_beta[0];
+        byGridPoint[indexer][1] = alpha_beta[1];
+        byGridPoint[indexer][2] = 1+Random(0,_treeCount-0.000000001)$1;
+        indexer += 1;
+    }
+}
+
+byGridPoint  = byGridPoint % {{0,1,2}};
+
+//fprintf (sim_grid_info, CLEAR_FILE, byGridPoint);
+
+extraFunctions        = exportFunctionDefinition("simulateFromTreeGivenRates") + exportFunctionDefinition("mapSets");
+LF_NEXUS_EXPORT_EXTRA = "\n;PRESERVE_SLAVE_NODE_STATE=1;MPI_NEXUS_FILE_RETURN=Rows(UserFunction);\nbaseFrequencies= " + baseFrequencies + ";\ncodonCharactersAgrument="+codonCharactersAgrument+"\n;targetSpeciesOrdering="+targetSpeciesOrdering+";\n"; 
+                        
+
+MPI_NODE_STATUS = {MPI_NODE_COUNT,1};
+
+Export(lfExport,codonLF);
+
+for (k = 1; k < MPI_NODE_COUNT; k+=1) {
+    MPISend (k, lfExport);
+}
+
+for (k = 1; k < MPI_NODE_COUNT; k+=1) {
+    MPIReceive (-1, fromNode, result);
+ }
+
+//------------------------------------------------------------------------------
+
+currentIndex = 0;
+t0 = Time(1);
+for (k = 1; k < nn_sample_count; k+=1)
+{
+    if (Abs(byGridPoint [k][-1] - byGridPoint[k-1][-1]) > 1e-10) {
+        treeID         = byGridPoint[k-1][2];
+        dispatchABlock (byGridPoint[k-1][2],byGridPoint[k-1][0], byGridPoint[k-1][1],  k-currentIndex);
+        currentIndex = k;
+        SetParameter (STATUS_BAR_STATUS_STRING, "Simulating neg/neutral sites "+ (k) + "/" + nn_sample_count + " " + _formatTimeString(Time(1)-t0),0);
+    }
+}
+   
+dispatchABlock (byGridPoint[k-1][2],byGridPoint[k-1][0], byGridPoint[k-1][1],  k-currentIndex);
+
+still_busy = +(MPI_NODE_STATUS["_MATRIX_ELEMENT_VALUE_>0"]);
+for (k = 0; k < still_busy; k += 1) {
+    processABlock (0);
+}
+
+
+for (k = 0; k < _treeCount; k+=1) {
+    newData = ""; newData * 128;
+    for (k2 = 0; k2 < sequenceCount; k2+=1) {
+         (accumulatedSequences [k])[k2] *0;
+         newData * (">" + targetSpeciesOrdering[k2] + "\n" + (accumulatedSequences [k])[k2] + "\n");
+    }
+    newData * 0;
+    ExecuteCommands ("DataSet simulated_data_" + (k+1)  +  " = ReadFromString (newData)");
+    ExecuteCommands ("GetDataInfo (info, " + _filterNames[k] +",\"PARAMETERS\");");
+    ExecuteCommands ("DataSetFilter " + _filterNames[k] + " = CreateFilter (simulated_data_" + (k+1) + "," + info["ATOM_SIZE"] + ",,\"" + info["SEQUENCES_STRING"] + "\",\"" + info["EXCLUSIONS"] + "\");");
+}
+
+LIKELIHOOD_FUNCTION_OUTPUT = 7;
+LF_NEXUS_EXPORT_EXTRA = "";
+fprintf (sim_fit_file, CLEAR_FILE, codonLF);
+DeleteObject (codonLF);
+ExecuteAFile (sim_fit_file);
+site_probs = computeLFOnGrid ("codonLF", grid,1);
+
+fprintf (sim_grid_info, CLEAR_FILE, byGridPoint, "\n", site_probs);
+
+tabulateGridResults (points, nn_sample_count, samples, _chainCount);
+posteriorsUnderNN = reportSiteResults (nn_sample_count, 0, 0, 1);
+
+return posteriorsUnderNN;
+
+//------------------------------------------------------------------------------
+
+function   dispatchABlock (treeID, alphaV, betaV, howMany) {
+    if (MPI_NODE_COUNT <= 1) {
+        simulatedChunk = simulateFromTreeGivenRates (treeID,alphaV,betaV,howMany, "baseFrequencies", "codonCharactersAgrument", targetSpeciesOrdering);
+        return processABlock (treeID);
+    }
+
+    //fprintf(stdout, MPI_NODE_STATUS, "\n");
+    
+    for (node_id = 1; node_id < MPI_NODE_COUNT; node_id += 1) {
+        if (MPI_NODE_STATUS[node_id] == 0) {
+            break;
+        }
+    }
+    //fprintf (stdout, "Node id:", node_id,"\n");
+    
+    if (node_id == MPI_NODE_COUNT) {
+        node_id = processABlock(0);
+    }
+    
+    mpi_command = extraFunctions + "\nreturn simulateFromTreeGivenRates ("+treeID+","+alphaV+","+betaV+","+howMany+",\"baseFrequencies\", \"codonCharactersAgrument\", targetSpeciesOrdering);";
+    //fprintf (stdout, "[DEBUG:] To node ", node_id, "=>", mpi_command, "\n");
+    MPISend (node_id, mpi_command);
+    //fprintf (stdout, MPI_LAST_SENT_MSG);
+    MPI_NODE_STATUS[node_id] = treeID;
+    return 0;
+}
+
+//------------------------------------------------------------------------------
+
+function   processABlock (treeID) {
+   if (MPI_NODE_COUNT > 1) {
+        MPIReceive (-1,fromNode,result);
+        simulatedChunk = Eval (result);
+        //fprintf (stdout, "Result:",result,"\n");
+        treeID = MPI_NODE_STATUS[fromNode];
+        MPI_NODE_STATUS[fromNode] = 0;
+   }    
+   
+   for (k2 = 0; k2 < sequenceCount; k2+=1) {
+        ((accumulatedSequences [treeID-1])[k2]) * simulatedChunk[k2];
+   }           
+   
+   return fromNode;
+}
+
+//------------------------------------------------------------------------------
+
+function simulateFromTreeGivenRates (treeID, alphaValue, betaValue, codons, frequencies, characters, speciesOrdering) {
+    alpha = alphaValue;
+    beta  = betaValue;
+    ExecuteCommands ("DataSet theData = Simulate (codon_tree_"+treeID+",`frequencies`,`characters`,codons,0);");
+    GetString (similatedOrdering, theData,-1);
+    reordering = mapSets (speciesOrdering, similatedOrdering);
+    DataSetFilter reporterFilter = CreateFilter (theData,1,"",Join(",",reordering));
+    GetInformation (allSeqs, reporterFilter);
+    GetString (similatedOrdering, reporterFilter,-1);
+    return allSeqs;
+}
diff --git a/res/TemplateBatchFiles/FUBAR_HBL/FUBAR_tools.ibf b/res/TemplateBatchFiles/FUBAR_HBL/FUBAR_tools.ibf
new file mode 100644
index 0000000..fc952ae
--- /dev/null
+++ b/res/TemplateBatchFiles/FUBAR_HBL/FUBAR_tools.ibf
@@ -0,0 +1,359 @@
+function computeENFP_CI (p_i,sig_level) {
+    N = Abs (p_i);
+      
+    
+    PDF_old = {{1-p_i[0],p_i[0]}};
+    PDF = PDF_old;
+       
+    for (i = 1; i < N; i+=1) {
+        PDF = {1,i+2};
+        PDF[0] = PDF_old[0] * (1-p_i[i]);
+        for (X = 1; X < i+1; X+=1) { 
+            PDF[X] = PDF_old[X] * (1-p_i[i]) + PDF_old[X-1] * (p_i[i]);
+        }
+        PDF[i+1] = PDF_old[i] * p_i[i];
+        PDF_old = PDF;
+    }
+    
+    sum = PDF[0];
+    _idx = 0;
+    while (sum < sig_level/2) {
+        _idx+=1;
+        sum += PDF[_idx];
+    }
+    lb = _idx;
+    
+    while (sum < 1-sig_level/2) {
+        _idx+=1;
+        sum += PDF[_idx];        
+    }
+    
+    return {{lb__, _idx__}}
+}
+
+function tabulateGridResults (points, sites, samples, _chainCount) {
+
+    jointLogLArray        = {1,samples};
+    jointSamples          = {samples,points};
+    perChain              = samples$_chainCount;
+
+    positive_selection_stencil = {points,sites} ["grid[_MATRIX_ELEMENT_ROW_][0]<grid[_MATRIX_ELEMENT_ROW_][1]"];
+    negative_selection_stencil = {points,sites} ["grid[_MATRIX_ELEMENT_ROW_][0]>grid[_MATRIX_ELEMENT_ROW_][1]"];
+    diag_alpha = {points,points}["grid[_MATRIX_ELEMENT_ROW_][0]*(_MATRIX_ELEMENT_ROW_==_MATRIX_ELEMENT_COLUMN_)"];
+    diag_beta  = {points,points}["grid[_MATRIX_ELEMENT_ROW_][1]*(_MATRIX_ELEMENT_ROW_==_MATRIX_ELEMENT_COLUMN_)"];
+    
+    pos_sel_matrices      = {};
+    neg_sel_matrices      = {};
+    alpha_matrices        = {};
+    beta_matrices         = {};
+    normalization_factors = {};
+    
+    
+    from = 0;
+    to   = perChain;
+    
+    t0 = Time (1);
+    for (_chainID = 0; _chainID < _chainCount; _chainID += 1) {
+        SetParameter (STATUS_BAR_STATUS_STRING, "Processing samples from chain "+ _chainID + "/" + _chainCount + " " + _formatTimeString(Time(1)-t0),0);
+        thisSample = samplesAVL[_chainID];
+        thisLogL   = logLAVL[_chainID];
+        norm_matrix           = (thisSample*site_probs["conditionals"]);
+        normalization_factors + norm_matrix;
+        pos_sel_matrices      + (thisSample*(site_probs["conditionals"]$positive_selection_stencil) / norm_matrix);
+        neg_sel_matrices      + (thisSample*(site_probs["conditionals"]$negative_selection_stencil) / norm_matrix);
+        alpha_matrices          + ((thisSample*diag_alpha*site_probs["conditionals"])/norm_matrix);
+        beta_matrices           + ((thisSample*diag_beta*site_probs["conditionals"])/norm_matrix);
+        indices = Random ({1,samples}["_MATRIX_ELEMENT_COLUMN_"], 0);
+        
+        for (_sampleT = from; _sampleT < to; _sampleT += 1) {
+            thisIndex = indices[_sampleT];
+            jointLogLArray [_sampleT] = thisLogL[thisIndex];
+            for (_point = 0; _point < points; _point += 1) {
+                jointSamples[_sampleT][_point] = thisSample[thisIndex][_point];
+            } 
+        }
+        from = to;
+        if (_chainID == _chainCount - 2) {
+            to = samples;
+        } else {
+            to += perChain;
+        }
+    }
+    
+    return 0;
+}
+
+//------------------------------------------------------------------------------------------------//
+
+function readMCMCSamples (baseFilePath,_chainCount) {
+    logLAVL    = {};
+    samplesAVL = {};
+    
+    for (_chainID = 0; _chainID < _chainCount; _chainID += 1) {
+       sample_file = baseFilePath + "." + _chainID;
+       fscanf (sample_file, "NMatrix,NMatrix", logL, sampled);
+       logLAVL + logL;
+       samplesAVL + sampled;
+    }
+    
+    samples = Rows (sampled);
+    points  = Columns (sampled);
+    return 0;
+}
+
+//------------------------------------------------------------------------------------------------//
+
+function reportSiteResults (sites, writeTo, priorNN, doFDR) {
+    t0 = Time (1);
+    bySitePosSel = {sites,8+doFDR};
+
+    //"alpha" 0 ,"beta" 1 ,"beta-alpha" 2,"Prob[alpha<beta]" 3, "Prob[alpha>beta]" 4, "BayesFactor[alpha<beta]" 5,"PSRF" 6, "Neff" 7
+    
+    // mean alpha (normalized to overall mean alpha = 1), mean beta, mean beta-alpha, mean pos.sel
+    // mean neg.sel, PSRF, N_eff
+     for (s = 0; s < sites; s+=1) {
+        SetParameter (STATUS_BAR_STATUS_STRING, "Tabulating results for site "+ s + "/" + sites + " " + _formatTimeString(Time(1)-t0),0);
+        pos_sel_samples    =    {};
+        for (_chainID = 0; _chainID < _chainCount; _chainID += 1) {
+            pos_sel_samples + ((alpha_matrices[_chainID])[-1][s]);
+        }
+        alpha = (computeRandNeff (pos_sel_samples))[0];
+        bySitePosSel[s][0] = alpha;
+
+        pos_sel_samples    =    {};
+        for (_chainID = 0; _chainID < _chainCount; _chainID += 1) {
+            pos_sel_samples + ((beta_matrices[_chainID])[-1][s]);
+        }
+        beta = (computeRandNeff (pos_sel_samples))[0];
+        bySitePosSel[s][1] = beta;
+        bySitePosSel[s][2] = beta - alpha;
+        
+        pos_sel_samples    =    {};
+        for (_chainID = 0; _chainID < _chainCount; _chainID += 1) {
+            pos_sel_samples + ((neg_sel_matrices[_chainID])[-1][s]);
+        }
+        neg_sel_prob = (computeRandNeff (pos_sel_samples))[0];
+        bySitePosSel[s][4] = neg_sel_prob;
+
+        pos_sel_samples    =    {};
+        for (_chainID = 0; _chainID < _chainCount; _chainID += 1) {
+            pos_sel_samples + ((pos_sel_matrices[_chainID])[-1][s]);
+        }
+        pos_sel_samples     = computeRandNeff(pos_sel_samples);
+        
+        /*if (doPrint) {
+            fprintf (finalPHP, ",", pos_sel_samples[0], ",", 1-pos_sel_samples[0], ",", pos_sel_samples[1], ",", pos_sel_samples[2]);
+        }*/
+        
+        bySitePosSel [s][3] = pos_sel_samples[0];
+        if (priorNN > 0 && priorNN < 1) {
+            bySitePosSel [s][5] = pos_sel_samples[0] / (1-pos_sel_samples[0]) / (1-priorNN) * priorNN;
+        }
+        bySitePosSel [s][6] = pos_sel_samples[1];
+        bySitePosSel [s][7] = pos_sel_samples[2];
+    }
+    
+    return bySitePosSel;
+}
+
+//------------------------------------------------------------------------------------------------//
+
+function exportFunctionDefinition (funcID) {
+    ExecuteCommands ("GetString (funcInfo, "+funcID+",-1);");
+    return "\nfunction " + funcInfo["ID"] + "(" + Join (",", funcInfo["Arguments"]) + ")\n{\n" + funcInfo ["Body"] + "\n}\n";
+}
+
+//------------------------------------------------------------------------------------------------//
+
+function computeLFOnGrid (lfID, grid, doConditionals) {
+    points = Rows (grid);
+    
+    result = {};
+    
+    t0 = Time (1);
+    _startPoint = 0;
+
+    if (MPI_NODE_COUNT > 1 && points > MPI_NODE_COUNT) {
+        per_node    = points $ MPI_NODE_COUNT;
+        _startPoint = points-per_node;
+        leftover    = points-per_node*MPI_NODE_COUNT;
+        
+        from          = 0;
+        to            = per_node + (leftover>0);
+        node_ranges   = {MPI_NODE_COUNT,2};
+        
+        for (node_id = 1; node_id < MPI_NODE_COUNT; node_id += 1) {
+            if (doConditionals) {
+                LF_NEXUS_EXPORT_EXTRA	= 
+                       "LFCompute(`lfID`,LF_START_COMPUTE);
+                        grid=" + grid[{{from,0}}][{{to-1,1}}] + ";\n
+                        points = Rows (grid);
+                        for (_r = 0 ; _r < points; _r += 1){
+                            alpha = grid[_r][0];
+                            beta  = grid[_r][1];
+                            ConstructCategoryMatrix(catMat,`lfID`,SITE_LOG_LIKELIHOODS);
+                            
+                            if (_r == 0) {
+                                _siteCount = Columns (catMat);
+                                MPI_NEXUS_FILE_RETURN = {points, _siteCount};
+                            }
+                            
+                            for (_c = 0; _c < _siteCount; _c += 1) {
+                                MPI_NEXUS_FILE_RETURN[_r][_c] = catMat[_c];
+                            }
+                        }
+                        LFCompute(`lfID`,LF_DONE_COMPUTE);
+                        return MPI_NEXUS_FILE_RETURN;";       
+                }  else {
+                 LF_NEXUS_EXPORT_EXTRA	= 
+                       "LFCompute(`lfID`,LF_START_COMPUTE);
+                        grid=" + grid[{{from,0}}][{{to-1,1}}] + ";\n
+                        points = Rows (grid);
+                        for (_r = 0 ; _r < points; _r += 1){
+                            alpha = grid[_r][0];
+                            beta  = grid[_r][1];
+                            LFCompute (`lfID`, logL);
+                            
+                            if (_r == 0) {
+                                 MPI_NEXUS_FILE_RETURN = {points, 3};
+                            }
+                            
+                            MPI_NEXUS_FILE_RETURN[_r][0] = alpha;
+                            MPI_NEXUS_FILE_RETURN[_r][1] = beta;
+                            MPI_NEXUS_FILE_RETURN[_r][2] = logL;
+                        }
+                        LFCompute(`lfID`,LF_DONE_COMPUTE);
+                        return MPI_NEXUS_FILE_RETURN;";       
+                   
+                }                             
+                                    
+            ExecuteCommands 	("Export(lfExport,`lfID`);");
+            MPISend				(node_id, lfExport);            
+            //fprintf				(stdout, "[SENT RANGE ", from+1, " - ", to, " TO MPI NODE ", node_id, "]\n");   
+            
+            node_ranges [node_id][0]         = from;
+            node_ranges [node_id][1]         = to;
+            
+            from                             = to;
+            to                              += per_node+(node_id<=leftover);  
+        } 
+    }
+    
+    ExecuteCommands ("LFCompute(`lfID`,LF_START_COMPUTE)"); 
+           
+    for (_r = _startPoint; _r < points; _r += 1){
+        alpha = grid[_r][0];
+        beta  = grid[_r][1];
+        if (doConditionals) {
+            ExecuteCommands ("ConstructCategoryMatrix(catMat,`lfID`,SITE_LOG_LIKELIHOODS)");
+        } else {
+            ExecuteCommands ("LFCompute(`lfID`,logL)");        
+        }
+        
+        if (_r == _startPoint) {
+            if (doConditionals) {
+                _siteCount = Columns (catMat);
+                conditionals = {points, _siteCount};
+                scaler = {1,_siteCount};
+            } else {
+                conditionals = {points, 3};            
+            }
+        }
+        
+        
+        if (doConditionals) {
+            for (_c = 0; _c < _siteCount; _c += 1) {
+                conditionals[_r][_c] = catMat[_c];
+            }
+
+                        
+        } else {
+            conditionals[_r][0] = alpha;
+            conditionals[_r][1] = beta;
+            conditionals[_r][2] = logL;
+        }
+        SetParameter (STATUS_BAR_STATUS_STRING, "Computing the likelihood function on grid points "+ (_r+1) + "/" + points + " " + _formatTimeString(Time(1)-t0),0);
+    }
+    ExecuteCommands ("LFCompute(`lfID`,LF_DONE_COMPUTE)");
+    
+    
+
+
+    if (MPI_NODE_COUNT > 1 && points > MPI_NODE_COUNT) {
+         for (node_id = 1; node_id < MPI_NODE_COUNT; node_id += 1) {
+            MPIReceive (-1,fromNode,res);
+		    sscanf  (res, REWIND, "NMatrix", mpires);
+		    
+		    from = node_ranges[fromNode][0];
+		    to   = node_ranges[fromNode][1];
+		    
+            /*fprintf				(stdout, "[GOT RANGE ", from+1, " - ", to, ":", 
+                                           Rows(mpires), " FROM MPI NODE ", fromNode, "]\n"); 
+            */
+            
+            if (doConditionals) {
+                for (_r = 0; _r < Rows(mpires); _r += 1) {
+                    for (_c = 0; _c < _siteCount; _c += 1) {
+                        conditionals [_r+from][_c] = mpires[_r][_c];
+                    }
+                }
+            } else {
+                 for (_r = 0; _r < Rows(mpires); _r += 1) {
+                        conditionals [_r+from][0] = mpires[_r][0];
+                        conditionals [_r+from][1] = mpires[_r][1];
+                        conditionals [_r+from][2] = mpires[_r][2];
+                    }
+            }
+		}
+
+    }
+
+    if (doConditionals) {
+        for (_c = 0; _c < _siteCount; _c += 1) {
+            this_site  = conditionals[-1][_c];
+            best_log_l = Min (this_site*(-1),0);
+	        this_site  = (this_site + best_log_l)["Exp(_MATRIX_ELEMENT_VALUE_)"];
+
+            normalizer = +this_site;
+            
+            this_site  = (this_site)*(1/normalizer);
+            scaler[_c] = -best_log_l+Log(normalizer);
+            
+            for (_r = 0; _r < points; _r += 1) {
+                conditionals[_r][_c] = this_site[_r];
+            }
+        }
+        
+
+        result["conditionals"] = conditionals;
+        result["scalers"]      = scaler;
+    } else {
+        return conditionals;
+    }
+    
+    return result;
+}
+
+//--------------------------------------------------------------------------------//
+
+function computeRandNeff (sampledValues) {
+    chainCount  = Abs (sampledValues);
+    withinVar   = {chainCount,1};
+    withinMeans = {chainCount, 1};
+    
+    chainLength = Columns(sampledValues[0])*Rows(sampledValues[0]);
+    
+    for (_chainID = 0;  _chainID < chainCount; _chainID += 1) {
+        chainMean = (+(sampledValues[_chainID]))/chainLength;
+        chainVar  = +((sampledValues[_chainID])["(_MATRIX_ELEMENT_VALUE_-chainMean__)^2"]);
+        withinVar   [_chainID] = chainVar/(chainLength-1);
+        withinMeans [_chainID] = chainMean;
+    }
+    
+    overallMean = (+withinMeans)/chainCount;
+    B           = (+withinMeans["(_MATRIX_ELEMENT_VALUE_-overallMean__)^2"])*chainLength / (chainCount-1);
+    W           = (+withinVar)/chainCount;
+    VarEst      = (chainLength-1)/chainLength*W + B/chainLength;
+        
+    return      {{overallMean, Sqrt(VarEst/W), VarEst/B*chainCount*chainLength, B, W, VarEst}};
+}
\ No newline at end of file
diff --git a/res/TemplateBatchFiles/F_ST.bf b/res/TemplateBatchFiles/F_ST.bf
new file mode 100644
index 0000000..11dc471
--- /dev/null
+++ b/res/TemplateBatchFiles/F_ST.bf
@@ -0,0 +1,742 @@
+RequireVersion ("0.9920060901");
+
+/*------------------------------------------------------------------------------*/
+function doSNN (vpart1, vpart2, vsize1, vsize2)
+{
+	for (k=0; k<vsize1;k=k+1)
+	{
+		idx1 = vpart1[k];
+		minD = 1e100;
+		X_j	 = 0;
+		W_j  = 0;
+		
+		for (k2=0; k2<vsize1; k2=k2+1)
+		{
+			if (k!=k2)
+			{
+				idx2 = vpart1[k2];
+				cd   = distanceMatrix[idx1][idx2];
+				if (cd < minD)
+				{
+					W_j  = 1;
+					X_j  = 1;
+					minD = cd;
+				}
+				else
+				{
+					if (cd == minD)
+					{
+						W_j = W_j+1;
+						X_j = X_j+1;
+					}
+				}
+			}
+		}
+
+		for (k2=0; k2<vsize2; k2=k2+1)
+		{
+			if (k!=k2)
+			{
+				idx2 = vpart2[k2];
+				cd   = distanceMatrix[idx1][idx2];
+				if (cd < minD)
+				{
+					W_j  = 1;
+					X_j  = 0;
+					minD = cd;
+				}
+				else
+				{
+					if (cd == minD)
+					{
+						W_j = W_j+1;
+					}
+				}
+			}
+		}
+		s_nn = s_nn + X_j/W_j;
+	}
+	return 0;
+}
+/*------------------------------------------------------------------------------*/
+
+function computeCompartmentValues (part1, part2)
+{
+	resMatrix = {4,1};
+	template1 = {ds.species, ds.species};
+	template2 = {ds.species, ds.species};
+	for (k=0; k<clASize;k=k+1)
+	{
+		idx1 = part1[k];
+		for (k2=k+1; k2<clASize;k2=k2+1)
+		{
+			idx2 = part1[k2];
+			template1 [idx1][idx2] = 1;
+			template1 [idx2][idx1] = 1;
+		}
+	}
+
+	for (k=0; k<clBSize;k=k+1)
+	{
+		idx1 = part2[k];
+		for (k2=k+1; k2<clBSize;k2=k2+1)
+		{
+			idx2 = part2[k2];
+			template2 [idx1][idx2] = 1;
+			template2 [idx2][idx1] = 1;
+		}
+	}
+	
+	template3 = totalUnitSqr-template1-template2;
+	
+	count1 = totalUnitRow*(template1*totalUnitCol);
+	count2 = totalUnitRow*(template2*totalUnitCol);
+	count3 = totalUnitRow*(template3*totalUnitCol);
+	
+	sum1   = totalUnitRow*(template1$distanceMatrix*totalUnitCol);
+	sum2   = totalUnitRow*(template2$distanceMatrix*totalUnitCol);
+	sum3   = totalUnitRow*(template3$distanceMatrix*totalUnitCol);
+	
+	dd1 = sum1[0]/count1[0]*f_1^2+sum2[0]/count2[0]*f_2^2;
+	
+	resMatrix[2] = sum3[0]/(count3[0]-bothCladesSize);	/* pi_B */
+	resMatrix[1] = dd1/(f_1^2+f_2^2);			        /* pi_S */
+	resMatrix[0] = dd1 + 2*f_1*f_2*resMatrix[2];        /* pi_T */
+	
+	/* now compute S_nn */
+	
+	s_nn = 0;
+	
+	doSNN (part1, part2, clASize, clBSize);
+	doSNN (part2, part1, clBSize, clASize);
+	
+	resMatrix[3] = s_nn / (clASize+clBSize);
+	
+	return    resMatrix;
+}
+
+/*------------------------------------------------------------------------------*/
+
+function reportBSTRP (_ds, obs)
+{
+	fprintf (stdout, "Observed value  : ", Format(obs,8,3), "\n",
+					 "Bootst. mean    : ", Format(_ds["Mean"],8,3), "\n",
+					 "Bootst. median  : ", Format(_ds["Median"],8,3), "\n",
+					 "Bootst. st. dev.: ", Format(_ds["Std.Dev"],8,3), "\n",
+					 "Bootst. 95% CI  : ", Format(_ds["2.5%"],8,3), " - ", Format(_ds["97.5%"],8,3), "\n");
+	return 0;
+}
+
+/*------------------------------------------------------------------------------*/
+
+ChoiceList (distanceChoice, "Distance Computation",1,SKIP_NONE,
+			"Distance formulae","Use one of the predefined distance measures based on data comparisons. Fast.",
+			"Full likelihood","Estimate distances using pairwise MLE. More choices but slow.",
+			"Load Matrix","Re-load a previously computed matrix in HyPhy format");
+			
+if (distanceChoice < 0) {
+	return 0;
+}
+
+
+if (distanceChoice == 2) {
+    ChoiceList (useSeqData,"Sequence names",1,SKIP_NONE,"Included","Sequence names are in the matrix file preceding the distance matrix.",
+                           "Read from an alignment","Gather sequence names from a separate alignment file");
+
+    if (useSeqData < 0) {
+        return 0;
+    }
+} else {
+    useSeqData = 1;
+}
+
+
+if (useSeqData) 
+{
+    ChoiceList (dataType,"Data type",1,SKIP_NONE,"Nucleotide/Protein","Nucleotide or amino-acid (protein).",
+                         "Codon","Codon (several available genetic codes).");
+    
+    if (dataType<0) {
+        return;
+    }
+
+    if (dataType) {
+        SetDialogPrompt ("Please choose a codon data file:");
+        ExecuteAFile ("TemplateModels/chooseGeneticCode.def");
+    }
+    else {
+        SetDialogPrompt ("Please choose a nucleotide or amino-acid data file:");
+    }
+    
+    DataSet ds = ReadDataFile (PROMPT_FOR_FILE);
+
+    fprintf (stdout, "\nRead the following data:", ds,"\n\n");
+} else {
+	SetDialogPrompt ("Load the names/distance matrix");
+	fscanf          (PROMPT_FOR_FILE, "Matrix,NMatrix", namesMatrix,distanceMatrix);
+	dim_names = Rows(namesMatrix)*Columns(namesMatrix);
+	assert (dim_names == Columns (distanceMatrix), "Dimension mismatch between the names vector and the distance matrix");
+	fakeDS = ""; fakeDS * 128;
+	for (_i = 0; _i < dim_names; _i+=1) {
+	    fakeDS * (">" + namesMatrix [_i] + "\nA\n");
+	}
+	fakeDS * 0;
+	DataSet ds = ReadFromString (fakeDS);
+}
+
+promptFor2ndRegExp = 1;
+ExecuteAFile ("partitionSequences.ibf");
+promptFor2ndRegExp = 0;
+
+bothCladesSize = clASize + clBSize; 
+f_1 = clASize/bothCladesSize;
+f_2 = clBSize/bothCladesSize;
+
+fprintf (stdout, "\nProportion of sequence in population 1: ", f_1,
+				 "\nProportion of sequence in population 2: ", f_2, "\n");
+
+resultAVL = {"Proportion 1": f_1,
+			 "Proportion 2": f_2};
+
+p1vector = {};
+p2vector = {};
+overallSample2 = {1,bothCladesSize};
+overallSample  = {};
+sequencesIn	   = {};
+
+for (specIndex = 0; specIndex < ds.species; specIndex = specIndex + 1)
+{
+	GetString (specName, ds, specIndex);
+	
+	if (cladeA[specName]>0)
+	{
+		p1vector			[Abs(p1vector)] 		= specIndex;
+		overallSample2		[Abs(overallSample)] 	= 1;
+		overallSample		[Abs(overallSample)] 	= specIndex;
+		sequencesIn			[specIndex] 			= 1;
+	}
+	else
+	{
+		if (cladeB[specName]>0)
+		{
+			p2vector		[Abs(p2vector)] 		= specIndex;
+			overallSample2	[Abs(overallSample)] 	= 2;
+			overallSample	[Abs(overallSample)] 	= specIndex;
+			sequencesIn		[specIndex] 			= 1;
+		}
+	}
+}
+
+if (dataType)
+{
+	DataSetFilter filteredData = CreateFilter (ds,3,"","",GeneticCodeExclusions);
+}
+else
+{
+	DataSetFilter filteredData = CreateFilter (ds,1,"","");
+}
+
+if (useSeqData) {
+    distanceMatrix = {ds.species, ds.species};
+}
+
+if (distanceChoice == 1)
+{
+	SelectTemplateModel(filteredData);
+	
+	fprintf (stdout,"\nHYPHY is computing pairwise maximum likelihood distance estimates. A total of ", Format(ds.species*(ds.species-1)/2,0,0),
+				    " estimations will be performed.\n");
+
+	MESSAGE_LOGGING = 0;
+
+	for (i = 0; i<ds.species-1; i=i+1)
+	{
+		for (j = 0; j<=i; j = j+1)
+		{
+			if (dataType)
+			{
+				DataSetFilter twoSpecFilter = CreateFilter (filteredData,3,"",(speciesIndex==i+1)||(speciesIndex==j),GeneticCodeExclusions);
+			}
+			else
+			{
+				DataSetFilter twoSpecFilter = CreateFilter (filteredData,1,"",(speciesIndex==i+1)||(speciesIndex==j));
+			}
+			if (FREQUENCY_SENSITIVE)
+			{
+				if (USE_POSITION_SPECIFIC_FREQS)
+				{
+					HarvestFrequencies (vectorOfFrequencies,filteredData,3,1,1);
+				}
+				else
+				{
+					HarvestFrequencies (vectorOfFrequencies,twoSpecFilter,1,1,0);
+				}
+			}
+			if (FREQUENCY_SENSITIVE)
+			{
+				MULTIPLY_BY_FREQS = PopulateModelMatrix ("modelMatrix",vectorOfFrequencies);
+				if (dataType)
+				{
+					codonFrequencies = BuildCodonFrequencies (vectorOfFrequencies);
+					Model pairModel = (modelMatrix, codonFrequencies, MULTIPLY_BY_FREQS);
+				}
+				else
+				{
+					Model pairModel = (modelMatrix, vectorOfFrequencies, MULTIPLY_BY_FREQS);
+				}
+			}		
+			else
+			{
+				if (i+j==0)
+				{
+					MULTIPLY_BY_FREQS = PopulateModelMatrix ("modelMatrix",equalFreqs);
+					Model pairModel = (modelMatrix, equalFreqs, MULTIPLY_BY_FREQS);
+				}
+			}
+			
+			Tree Inferred_Tree = (1,2);
+			LikelihoodFunction lf = (twoSpecFilter,Inferred_Tree);
+			Optimize (res,lf);
+			k = BranchLength (Inferred_Tree,0);
+			distanceMatrix[j][i+1] = k;
+			distanceMatrix[i+1][j] = k;
+		}
+	}
+}
+else
+{
+	if (distanceChoice == 2)
+	{
+        if (useSeqData) {
+            SetDialogPrompt ("Load the distance matrix");
+            fscanf (PROMPT_FOR_FILE,"NMatrix",distanceMatrix);
+        }
+		if ((Rows(distanceMatrix) != ds.species)||(Columns(distanceMatrix) != ds.species))
+		{
+			fprintf (stdout, "\nThe dimensions of the distance matrix are incompatible with the data set.\n");
+			return  0;
+		}		
+	}
+	else
+	{
+		DISTANCE_PROMPTS = 1;
+		#include "chooseDistanceFormula.def";
+		dummy = InitializeDistances (0);
+					    
+		tdc = 0;
+		tdp = 0;
+		ldp = 0;
+		togo = ds.species*(ds.species-1)/2;
+
+		fprintf (stdout,"\nHYPHY is computing pairwise distance estimates. A total of ", Format(togo,0,0),
+					    " estimations will be performed.\n");
+		
+		for (i = 0; i<ds.species-1; i=i+1)
+		{
+			for (j = 0; j<=i; j = j+1)
+			{
+				k = ComputeDistanceFormula (i+1,j);
+				distanceMatrix[j][i+1] = k;
+				distanceMatrix[i+1][j] = k;
+			}
+			tdc = tdc+i+1;
+			tdp = (tdc/togo * 100)$1;
+			if (tdp>ldp)
+			{
+				ldp = tdp;
+				fprintf (stdout, ldp, "% done\n");
+			}
+		}
+
+		DISTANCE_PROMPTS = 0;
+	}
+}
+
+/* make some unit matrices */
+
+totalUnitRow = {1,ds.species};
+totalUnitCol = {ds.species,1};
+totalUnitSqr = {ds.species,ds.species};
+
+for (k=0; k<ds.species; k=k+1)
+{
+	totalUnitRow[k] = 1;
+	totalUnitCol[k] = 1;
+	if (sequencesIn[k])
+	{
+		for (k2=0; k2<ds.species; k2=k2+1)
+		{
+			if (sequencesIn[k2])
+			{
+				totalUnitSqr [k][k2] = 1;
+			}
+		}
+	}
+}
+
+resMx = computeCompartmentValues (p1vector,p2vector);
+pi_D = resMx[2]-resMx[1];
+
+F_ST_OBS = {{pi_D/(resMx[1]+pi_D),pi_D/(resMx[1]+resMx[2]),1-resMx[1]/resMx[0], resMx[3]}};
+
+fprintf (stdout, "\n\nPopulation characterisitcs:",
+				 "\nMetapopulation diversity (pi_T)       = ", resMx[0],
+				 "\nMean subpopulation diversity (pi_S)   = ", resMx[1],
+				 "\nMean interpopulation diversity (pi_B) = ", resMx[2],
+				 "\n\nF_ST\n",
+				 "\nHudson, Slatkin and Maddison (Genetics     132:583-589): ",F_ST_OBS[0],
+				 "\nSlatkin                      (Evolution    47:264-279) : ",F_ST_OBS[1],
+				 "\nHudson, Boos and Kaplan	     (Mol Bio Evol 9: 138-151) : ",F_ST_OBS[2],
+				 "\nHudson (S_nn)                (Genetics     155:2011-14): ",F_ST_OBS[3], "\n");
+				 
+F_ST_OBS = F_ST_OBS;
+
+
+resultAVL ["pi_T"] = resMx[0];
+resultAVL ["pi_S"] = resMx[1];
+resultAVL ["pi_B"] = resMx[2];
+resultAVL ["Hudson, Slatkin and Maddison"] = F_ST_OBS[0];
+resultAVL ["Slatkin"] = F_ST_OBS[1];
+resultAVL ["Hudson, Boos and Kaplan"] = F_ST_OBS[2];
+resultAVL ["Hudson (S_nn)"] = F_ST_OBS[3];
+
+				 
+ChoiceList (resample,"Bootstrap Estimators",1,SKIP_NONE,
+					 "Skip","Do not perform a permutation test.",
+				     "Sure","Resample with replacement within populations to estimate sampling properties of the estimators.");
+				 
+
+if (resample < 0)
+{
+	return 0;
+}
+
+if (resample)
+{
+	sampleCount = 0;
+	while (sampleCount < 1)
+	{
+		fprintf (stdout, "\nHow many permutations would you like to perform?");
+		fscanf (stdin,"Number",sampleCount);
+	}
+
+	F_ST_1 = {sampleCount,1}; 
+	F_ST_2 = {sampleCount,1}; 
+	F_ST_3 = {sampleCount,1}; 
+	F_ST_4 = {sampleCount,1}; 
+	step  = sampleCount$20; 
+
+	fprintf (stdout, "Running the simulations...\n"); 
+
+	saveDM = distanceMatrix; 
+
+	p1Size = Abs (p1vector); 
+	p2Size = Abs (p2vector); 
+	basePartition1 = {1,p1Size}; 
+	basePartition2 = {1,p2Size}; 
+
+	for (k=0; k<p1Size;k=k+1) 
+	{ 
+		basePartition1[k] = p1vector[k]; 
+	} 
+
+	for (k=0; k<p2Size;k=k+1) 
+	{ 
+		basePartition2[k] = p2vector[k]; 
+	} 
+	 
+	maxSampleCount =  10*sampleCount;
+	 
+	for (sampleID = 0; sampleID < sampleCount; sampleID = sampleID + 1) 
+	{ 
+		 /* repeat the following code for each replicate */ 
+		 resampleP1 = Random (basePartition1,1); /* resample vector of indices with replacement */ 
+		 resampleP2 = Random (basePartition2,1);
+		 distanceMatrix = {Rows(saveDM),Rows(saveDM)}; 
+		 
+		 for (k=0; k<p1Size;k=k+1) /* repopulate distances for population 1 */ 
+		 { 
+			ki = resampleP1[k];
+			ii = p1vector[k]; 
+			for (k2 = k+1; k2 < p1Size; k2=k2+1) 
+			{ 
+				k2i = resampleP1[k2]; 
+				ii2 = p1vector[k2];
+				distanceMatrix [ii][ii2] = saveDM[ki][k2i]; 
+				distanceMatrix [ii2][ii] = saveDM[k2i][ki]; 
+			} 
+		 } 
+
+		 for (k=0; k<p2Size;k=k+1) /* repopulate distances for population 2 */ 
+		 { 
+		  	ki = resampleP2[k]; 
+			ii = p2vector  [k]; 
+		  	for (k2 = k+1; k2 < p2Size; k2=k2+1) 
+			{ 
+				k2i = resampleP2[k2]; 
+				ii2 = p2vector  [k2]; 
+				distanceMatrix  [ii][ii2] = saveDM[ki][k2i]; 
+				distanceMatrix  [ii2][ii] = saveDM[k2i][ki]; 
+			} 
+		 } 
+
+		for (k=0; k<p1Size;k=k+1) /* repopulate interpopulation distances */ 
+		{ 
+			ki = resampleP1[k]; 
+			ii = p1vector[k]; 
+			for (k2 = 0; k2 < p2Size; k2=k2+1) 
+			{ 
+				k2i = resampleP2[k2]; 
+				ii2 = p2vector  [k2]; 
+				distanceMatrix [ii][ii2] = saveDM[ki][k2i]; 
+				distanceMatrix [ii2][ii] = saveDM[k2i][ki]; 
+			} 
+		} 
+
+		if (Abs(distanceMatrix) == 0)
+		{
+			if (maxSampleCount)
+			{
+				maxSampleCount = maxSampleCount - 1;
+				sampleID = sampleID-1;
+				continue;
+			}
+			else
+			{
+				fprintf (stdout, "[ERROR: TOO MANY IDENTICAL SEQUENCES; CAN'T RESAMPLE WITHOUT OBTAINING ZERO DISTANCE MATRICES IN THE ALLOCATED NUMBER OF TRIES]\n");
+			}
+		}
+	
+		resMx = computeCompartmentValues (basePartition1,basePartition2); 
+		pi_D = resMx[2]-resMx[1]; 
+	
+		F_ST_1[sampleID] = pi_D/(resMx[1]+pi_D); 
+		F_ST_2[sampleID] = pi_D/(resMx[1]+resMx[2]); 
+		F_ST_3[sampleID] = 1-resMx[1]/resMx[0]; 
+		F_ST_4[sampleID] = resMx[3]; 
+
+		if ((sampleID+1)%step == 0) 
+		{ 
+			fprintf (stdout, Format ((sampleID+1)*100/sampleCount, 6, 2), "% done\n"); 
+		} 
+		
+		maxSampleCount = maxSampleCount - 1;
+	} 
+
+	ExecuteAFile (HYPHY_LIB_DIRECTORY + "TemplateBatchFiles" + DIRECTORY_SEPARATOR + "Utility" + DIRECTORY_SEPARATOR + 
+										 "DescriptiveStatistics.bf");
+										 
+	fprintf (stdout, "\n\nBootstrapped estimator statistics.\n",
+					 "\nHudson, Slatkin and Madison (Genetics     132:583-589)\n");
+	_stats = GatherDescriptiveStats (F_ST_1);				 
+	reportBSTRP (_stats, F_ST_OBS[0]);
+	resultAVL ["Bootstrap (Hudson, Slatkin and Maddison)"] = _stats;
+
+	fprintf (stdout, "\nSlatkin                     (Evolution    47:264-279)\n");
+	_stats = GatherDescriptiveStats (F_ST_2);				 
+	reportBSTRP (_stats, F_ST_OBS[1]);
+	resultAVL ["Bootstrap (Slatkin)"] = _stats;
+
+	fprintf (stdout, "\nHudson, Boos and Kaplan	    (Mol Bio Evol 9: 138-151)\n");
+	_stats = GatherDescriptiveStats (F_ST_3);				 
+	reportBSTRP (_stats, F_ST_OBS[2]);
+	resultAVL ["Bootstrap (Hudson, Boos and Kaplan)"] = _stats;
+
+	fprintf (stdout, "\nHudson (S_nn)               (Genetics     155:2011-14)\n");
+	_stats = GatherDescriptiveStats (F_ST_4);				 
+	reportBSTRP (_stats, F_ST_OBS[3]);
+	resultAVL ["Bootstrap (Hudson (S_nn))"] = _stats;
+	
+	distanceMatrix = saveDM;
+}
+
+ChoiceList (resample,"Permutation Test",1,SKIP_NONE,
+					 "Skip","Do not perform a permutation test.",
+				     "But of course","Randomly allocate sequences into subpopulations and tabulate the distribution of various F_ST statistics.");
+				 
+if (resample > 0)
+{
+
+	sampleCount = 0;
+	while (sampleCount < 1)
+	{
+		fprintf (stdout, "\nHow many permutations would you like to perform?");
+		fscanf (stdin,"Number",sampleCount);
+	}
+	
+	F_ST_1 = {sampleCount,2};
+	F_ST_2 = {sampleCount,2};
+	F_ST_3 = {sampleCount,2};
+	F_ST_4 = {sampleCount,2};
+	step   = sampleCount$20;
+	
+	fprintf (stdout, "Running the simulations...\n");
+	
+	for (sampleID = 0; sampleID < sampleCount; sampleID = sampleID + 1)
+	{
+		aSample = Random(overallSample2,0);
+		p1_1 	= {};
+		p2_1 	= {};
+		for (k=0; k<bothCladesSize;k=k+1)
+		{
+			k2 = overallSample[k];
+			if (aSample[k] == 2)
+			{
+				p2_1[Abs(p2_1)] = k2;
+			}
+			else
+			{
+				p1_1[Abs(p1_1)] = k2;
+			}
+		}
+		resMx = computeCompartmentValues (p1_1,p2_1);
+		pi_D = resMx[2]-resMx[1];	
+		F_ST_1[sampleID][1] = pi_D/(resMx[1]+pi_D);
+		F_ST_2[sampleID][1] = pi_D/(resMx[1]+resMx[2]);
+		F_ST_3[sampleID][1] = 1-resMx[1]/resMx[0];
+		F_ST_4[sampleID][1] = resMx[3];
+		
+		if ((sampleID+1)%step == 0)
+		{
+			fprintf (stdout, Format ((sampleID+1)*100/sampleCount, 6, 2), "% done\n");
+		}
+	}
+	
+	F_ST_1 = F_ST_1%1;
+	F_ST_2 = F_ST_2%1;
+	F_ST_3 = F_ST_3%1;
+	F_ST_4 = F_ST_4%1;
+	
+	pv = {{sampleCount,sampleCount,sampleCount,sampleCount}};
+	
+	for (sampleID = 0; sampleID < sampleCount; sampleID = sampleID + 1)
+	{
+		step = sampleID/sampleCount;
+		F_ST_1[sampleID][0] = step;
+		F_ST_2[sampleID][0] = step;
+		F_ST_3[sampleID][0] = step;
+		F_ST_4[sampleID][0] = step;
+		if (pv[0]==sampleCount)
+		{
+			if (F_ST_1[sampleID][1] > F_ST_OBS[0])
+			{
+				pv[0] = sampleID;
+			}
+		}
+		if (pv[1]==sampleCount)
+		{
+			if (F_ST_2[sampleID][1] > F_ST_OBS[1])
+			{
+				pv[1] = sampleID;
+			}
+		}
+		if (pv[2]==sampleCount)
+		{
+			if (F_ST_3[sampleID][1] > F_ST_OBS[2])
+			{
+				pv[2] = sampleID;
+			}
+		}
+		if (pv[3]==sampleCount)
+		{
+			if (F_ST_4[sampleID][1] > F_ST_OBS[3])
+			{
+				pv[3] = sampleID;
+			}
+		}
+	}
+	
+	
+	fprintf (stdout, "\n\nProb {Random F_ST > Observed F_ST}\n",
+					 "\nHudson, Slatkin and Maddison : ",(sampleCount-pv[0])/sampleCount,
+					 "\nSlatkin                      : ",(sampleCount-pv[1])/sampleCount,
+					 "\nHudson, Boos and Kaplan	     : ",(sampleCount-pv[2])/sampleCount,
+					 "\nHudson, S_nn                 : ",(sampleCount-pv[3])/sampleCount, "\n");
+	
+	resultAVL ["P (Hudson, Slatkin and Maddison)"] = (sampleCount-pv[0])/sampleCount;
+	resultAVL ["P (nSlatkin)"] = (sampleCount-pv[1])/sampleCount;
+	resultAVL ["P (Hudson, Boos and Kaplan)"] = (sampleCount-pv[2])/sampleCount;
+	resultAVL ["P (Hudson (S_nn))"] = (sampleCount-pv[3])/sampleCount;
+	
+	labels = {{"Cumulative Weight","F_ST"}};
+	
+	OpenWindow (CHARTWINDOW,{{"Hudson, Slatkin and Madison F_ST"}
+			{"labels"}
+			{"F_ST_1"}
+			{"Step Plot"}
+			{"F_ST"}
+			{"Cumulative Weight"}
+			{"F_ST"}
+			{""}
+			{"Cumulative Probability"}
+			{"3"}
+			{""}
+			{"-1;-1"}
+			{"10;1.309;0.785398"}
+			{"Times:14:0;Times:12:0;Times:14:1"}
+			{"16777215;16777215;16512;11776947;0;16777215;16711680;11842740;13158600;14474460;0;3947580;79;16744448;16777215;2984993;9199669;7018159;1460610;16748822;11184810;14173291;14173291"}
+			{"16"}
+			},
+			"SCREEN_WIDTH/2-50;SCREEN_HEIGHT/2-100;50;50");
+			
+	OpenWindow (CHARTWINDOW,{{"Slatkin F_ST"}
+			{"labels"}
+			{"F_ST_2"}
+			{"Step Plot"}
+			{"F_ST"}
+			{"Cumulative Weight"}
+			{"F_ST"}
+			{""}
+			{"Cumulative Probability"}
+			{"3"}
+			{""}
+			{"-1;-1"}
+			{"10;1.309;0.785398"}
+			{"Times:14:0;Times:12:0;Times:14:1"}
+			{"16777215;16777215;16512;11776947;0;16777215;16711680;11842740;13158600;14474460;0;3947580;79;16744448;16777215;2984993;9199669;7018159;1460610;16748822;11184810;14173291;14173291"}
+			{"16"}
+			},
+			"SCREEN_WIDTH/2-50;SCREEN_HEIGHT/2-100;50+SCREEN_WIDTH/2;50");
+	
+	OpenWindow (CHARTWINDOW,{{"Hudson, Boos and Kaplan F_ST"}
+			{"labels"}
+			{"F_ST_3"}
+			{"Step Plot"}
+			{"F_ST"}
+			{"Cumulative Weight"}
+			{"F_ST"}
+			{""}
+			{"Cumulative Probability"}
+			{"3"}
+			{""}
+			{"-1;-1"}
+			{"10;1.309;0.785398"}
+			{"Times:14:0;Times:12:0;Times:14:1"}
+			{"16777215;16777215;16512;11776947;0;16777215;16711680;11842740;13158600;14474460;0;3947580;79;16744448;16777215;2984993;9199669;7018159;1460610;16748822;11184810;14173291;14173291"}
+			{"16"}
+			},
+			"SCREEN_WIDTH/2-50;SCREEN_HEIGHT/2-100;50+SCREEN_WIDTH/2;100+SCREEN_HEIGHT/2");
+	
+	labels = {{"Cumulative Weight","S_NN"}};
+	
+	OpenWindow (CHARTWINDOW,{{"Hudson S_NN"}
+			{"labels"}
+			{"F_ST_4"}
+			{"Step Plot"}
+			{"S_NN"}
+			{"Cumulative Weight"}
+			{"S_NN"}
+			{""}
+			{"Cumulative Probability"}
+			{"3"}
+			{""}
+			{"-1;-1"}
+			{"10;1.309;0.785398"}
+			{"Times:14:0;Times:12:0;Times:14:1"}
+			{"16777215;16777215;16512;11776947;0;16777215;16711680;11842740;13158600;14474460;0;3947580;79;16744448;16777215;2984993;9199669;7018159;1460610;16748822;11184810;14173291;14173291"}
+			{"16"}
+			},
+			"SCREEN_WIDTH/2-50;SCREEN_HEIGHT/2-100;50;100+SCREEN_HEIGHT/2");
+}
+
+return resultAVL;
\ No newline at end of file
diff --git a/res/TemplateBatchFiles/FitnessAAModels.bf b/res/TemplateBatchFiles/FitnessAAModels.bf
new file mode 100644
index 0000000..3950533
--- /dev/null
+++ b/res/TemplateBatchFiles/FitnessAAModels.bf
@@ -0,0 +1,394 @@
+aaCodes = {{"A",
+"C",
+"D",
+"E",
+"F",
+"G",
+"H",
+"I",
+"K",
+"L",
+"M",
+"N",
+"P",
+"Q",
+"R",
+"S",
+"T",
+"V",
+"W",
+"Y"}};
+
+aaNames = {{"Alanine",
+"Cysteine",
+"Aspartic Acid",
+"Glutamic Acid",
+"Phenylalanine",
+"Glycine",
+"Histidine",
+"Isoleucine",
+"Lysine",
+"Leucine",
+"Methionine",
+"Asparagine",
+"Proline",
+"Glutamine",
+"Arginine",
+"Serine",
+"Threonine",
+"Valine",
+"Tryptophan",
+"Tyrosine"}};
+
+function PopulateModelMatrix (ModelMatrixName&, EFV&, classIndex)
+{
+	ModelMatrixName = {20,20};
+	EFV				= {20,1};
+	
+	commandString = "";
+	
+	for (rI = 1; rI < 20; rI = rI+1)
+	{
+		commandString = commandString + "global F_" + aaCodes[rI] + "_" + classIndex + 
+						"=0; F_" + aaCodes[rI] + "_" + classIndex + 
+						":>-1e10;\n";
+	}
+	
+	ExecuteCommands (commandString);
+	
+	for (cI = 1; cI < 20; cI = cI+1)
+	{
+		commandString = "ModelMatrixName[0]["+cI+"]:=t*(1+(F_" + 
+						 aaCodes[cI] + "_" + classIndex + "<0)*(Exp(F_"+
+						 aaCodes[cI] + "_" + classIndex + ")-1));\n" + 
+						 "ModelMatrixName["+cI+"][0]:=t*(1+(0>" + "F_" + 
+						 aaCodes[cI] + "_" + classIndex + ")*(Exp(-F_"+
+						 aaCodes[cI] + "_" + classIndex + ")-1));\n"; 
+		ExecuteCommands	 (commandString);
+	}
+
+	for (rI = 1; rI < 19; rI = rI+1)
+	{
+		for (cI = rI+1; cI < 20; cI = cI+1)
+		{
+			commandString = "ModelMatrixName["+rI+"]["+cI+"]:=t*(1+(F_" + 
+							 aaCodes[cI] + "_" + classIndex + "<" + "F_" + 
+							 aaCodes[rI] + "_" + classIndex + ")*(Exp(F_"+
+							 aaCodes[cI] + "_" + classIndex + "-F_"+
+							 aaCodes[rI] + "_" + classIndex + ")-1));\n" + 
+							 "ModelMatrixName["+cI+"]["+rI+"]:=t*(1+(F_" + 
+							 aaCodes[rI] + "_" + classIndex + "<" + "F_" + 
+							 aaCodes[cI] + "_" + classIndex + ")*(Exp(F_"+
+							 aaCodes[rI] + "_" + classIndex + "-F_"+
+							 aaCodes[cI] + "_" + classIndex + ")-1));\n"; 
+			ExecuteCommands	 (commandString);
+		}
+	}
+	
+	commandString = "global EFV_Norm_"+classIndex+":=1";
+	for (rI = 1; rI < 20; rI = rI+1)
+	{
+		commandString = commandString+"+Exp(F_"+aaCodes[rI]+"_"+classIndex+")";
+	}
+	ExecuteCommands (commandString+";");
+	commandString = "EFV[0]:=1/EFV_Norm_"+classIndex+";";
+	ExecuteCommands (commandString);
+	for (rI = 1; rI < 20; rI = rI+1)
+	{
+		commandString = "EFV["+rI+"]:=Exp(F_"+aaCodes[rI]+"_"+classIndex+")/EFV_Norm_"+classIndex+";";
+		ExecuteCommands (commandString);
+	}
+	return 0;
+}
+
+
+fprintf (stdout, "\n\n***** RUNNING MULTIPLE FITNESS CLASS AMINOACID MODELS*****\n\nModel Credit: Matthew W. Dimmic, David P. Mindell and Richard A. Goldstein\n\n");
+
+fitnessClassNumber = 0;
+while (fitnessClassNumber<1)
+{
+	fprintf (stdout, "\n\nHow many fitness classes (>=1) do you wish to spawn?");
+	fscanf  (stdin, "Number", fitnessClassNumber);
+}
+
+/*testMatrix = 0;
+testEFV	   = 0;
+dummy = PopulateModelMatrix ("testMatrix","testEFV",0);*/
+
+SetDialogPrompt ("Please specify a nucleotide or amino-acid data file:");
+
+DataSet ds 	= ReadDataFile (PROMPT_FOR_FILE);
+DataSetFilter filteredData = CreateFilter (ds,1);
+fprintf (stdout, "DATASET:", LAST_FILE_PATH, "\n\n", fitnessClassNumber, " FITNESS CLASSES\n\n");
+
+if (IS_TREE_PRESENT_IN_DATA)
+{
+	fprintf (stdout, "\n\nA tree was found in the data file:\n",DATAFILE_TREE,"\n\nWould you like to use it:(Y/N)?");
+	fscanf (stdin, "String", response);
+	if ((response=="n")||(response=="N"))
+	{
+		IS_TREE_PRESENT_IN_DATA = 0;
+	}
+	else
+	{
+		if (_DO_TREE_REBALANCE_)
+		{
+			treeString = RerootTree (DATAFILE_TREE,0);
+		}
+		else
+		{
+			treeString = DATAFILE_TREE;
+		}
+		
+		IS_TREE_PRESENT_IN_DATA = 1;
+	}
+	fprintf (stdout, "\n\n");
+
+}
+
+if (!IS_TREE_PRESENT_IN_DATA)
+{
+	SetDialogPrompt ("Please select a tree file for the data:");
+
+	fscanf (PROMPT_FOR_FILE, "String", treeString);
+	
+	while ((Abs(treeString)==0)||(treeString[0]!="("))
+	{
+		if (END_OF_FILE)
+		{
+			fprintf (stdout, "\nThis doesn't seem to be a valid Newick string file.\n").
+			return;
+		}
+		fscanf (LAST_FILE_PATH, "String", treeString);
+	}
+	
+	if (_DO_TREE_REBALANCE_)
+	{
+		treeString = RerootTree (treeString,0);
+	}
+}
+
+if (fitnessClassNumber==1)
+{
+	fitnessRates = 0;
+	fitnessEFV_0	 = 0;
+	mi = PopulateModelMatrix ("fitnessRates","fitnessEFV_0", 0);
+	Model fitnessModel = (fitnessRates, fitnessEFV_0, 0);
+	Tree givenTree = treeString;
+	LikelihoodFunction lf = (filteredData,givenTree);
+}
+else
+{
+	freqStrMx    = {fitnessClassNumber,1};
+	freqStrMx[0] = "PS_1";
+
+	for (mi=1; mi<fitnessClassNumber; mi=mi+1)
+	{
+		ExecuteCommands ("global PS_"+mi+" = 1/"+ ((fitnessClassNumber+1)-mi) + ";\nPS_"+mi+":<1;\n");
+	}
+
+	for (mi=1; mi<fitnessClassNumber-1; mi=mi+1)
+	{
+		freqStrMx[mi] = "";
+		for (mi2=1;mi2<=mi;mi2=mi2+1)
+		{
+			freqStrMx[mi] = freqStrMx[mi]+"(1-PS_"+mi2+")";		
+		}
+		freqStrMx[mi] = freqStrMx[mi]+"PS_"+(mi+1);	
+	}	
+
+	freqStrMx[mi] = "";
+	for (mi2=1;mi2<mi;mi2=mi2+1)
+	{
+		freqStrMx[mi] = freqStrMx[mi]+"(1-PS_"+mi2+")";		
+	}
+	freqStrMx[mi] = freqStrMx[mi]+"(1-PS_"+mi+")";
+	
+	lfString 	   = "LikelihoodFunction lf = (";	
+	templateString = "Log(";
+	
+	for (fC = 0; fC < fitnessClassNumber; fC = fC+1)
+	{	
+		ExecuteCommands ("fitnessRates_"+fC+"=0;fintessEFV_"+fC+"=0;dummy=PopulateModelMatrix(\"fitnessRates_"+
+						  fC+"\",\"fitnessEFV_"+fC+"\",fC);Model fitnessModel_"+fC+"=(fitnessRates_"+fC+",fitnessEFV_"+fC+",0);Tree tree_"+
+						  fC+"="+treeString+";");
+		if (fC)
+		{
+			lfString = lfString+",";
+			templateString = templateString + "+";
+		}
+		
+		lfString = lfString+"filteredData,tree_"+fC;	
+		templateString = templateString	+ "SITE_LIKELIHOOD["+fC+"]*"+freqStrMx[fC];
+	}
+	templateString = templateString+")";
+	ExecuteCommands (lfString+",templateString);");
+}
+
+ChoiceList  (rI,"Optimize or Restore",1,NO_SKIP,
+			 "Optimize","Obtain MLEs of model parameters.",
+			 "Restore","Reload MLEs from a previously saved file.");
+
+if (rI<0)
+{
+	return 0;
+}
+
+if (rI==0)
+{
+	SetDialogPrompt ("Save MLEs to:");
+	fprintf (PROMPT_FOR_FILE, CLEAR_FILE);
+	Optimize (res,lf);
+	mi				   = LIKELIHOOD_FUNCTION_OUTPUT;
+	fprintf (stdout, lf);
+	LIKELIHOOD_FUNCTION_OUTPUT = 4;
+	fprintf (LAST_FILE_PATH, lf);
+	LIKELIHOOD_FUNCTION_OUTPUT = mi;
+}
+else
+{
+	SetDialogPrompt ("Load MLEs from:");
+	fscanf			(PROMPT_FOR_FILE,"String", dummy);
+	ExecuteCommands ("#include\""+LAST_FILE_PATH+"\";");
+}
+
+estimatedFitnessParameters = {20,fitnessClassNumber};
+estimatedEFVs			   = {20,fitnessClassNumber};
+
+for (fC = 0; fC < fitnessClassNumber; fC = fC+1)
+{
+	for (mi=1; mi<20; mi=mi+1)
+	{
+		ExecuteCommands ("estimatedFitnessParameters[mi][fC]=F_"+aaCodes[mi]+"_"+fC+";");
+	}
+	for (mi=0; mi<20; mi=mi+1)
+	{
+		ExecuteCommands ("estimatedEFVs[mi][fC]=fitnessEFV_"+fC+"[mi];");
+	}
+}
+
+if (fitnessClassNumber>1) 
+/* compute marginals */
+{
+	fitnessMarginals = {filteredData.sites,fitnessClassNumber+1};
+	ConstructCategoryMatrix(flatMarginals, lf, COMPLETE);
+	mi = 0;
+	for (fC = 0; fC < fitnessClassNumber; fC = fC+1)
+	{
+		for (rI = 0; rI < filteredData.sites; rI = rI + 1)
+		{
+			fitnessMarginals [rI][fC] = flatMarginals[mi];
+			mi = mi+1;
+		}
+	}
+	classPriors = {fitnessClassNumber,1};
+	for (fC = 0; fC < fitnessClassNumber; fC = fC+1)
+	{
+		ExecuteCommands ("classPriors[fC]="+freqStrMx[fC]+";");	
+	}
+	for (rI = 0; rI < filteredData.sites; rI = rI + 1)
+	{
+		maxTerm  = 0;
+		maxIndex = 0;
+		cI		 = 0;
+		
+		for (fC = 0; fC < fitnessClassNumber; fC = fC+1)
+		{
+			flatMarginals = classPriors[fC]*fitnessMarginals[rI][fC];
+			cI = cI + flatMarginals;
+			if (flatMarginals>maxTerm)
+			{
+				maxTerm  = flatMarginals;
+				maxIndex = fC;
+			}
+		}
+		fitnessMarginals[rI][fitnessClassNumber] = maxIndex;
+		for (fC = 0; fC < fitnessClassNumber; fC = fC+1)
+		{
+			fitnessMarginals[rI][fC] =  classPriors[fC]*fitnessMarginals[rI][fC]/cI;
+		}
+	}	
+}
+
+
+labelMatrix  = {1,fitnessClassNumber+1};
+labelMatrix2 = {1,fitnessClassNumber+1};
+labelMatrix3 = {{"Class Prior"}};
+
+seriesString = "";
+
+for (fC = 0; fC < fitnessClassNumber; fC = fC+1)
+{
+	labelMatrix[fC] = "Class "+fC;
+	labelMatrix2[fC] = "Class "+fC;
+	if (fC)
+	{
+		seriesString = seriesString + ";";
+	}
+	seriesString = seriesString + labelMatrix[fC];
+}
+
+aaString = "Aminoacid";
+
+for (fC = 0; fC < 20; fC = fC+1)
+{
+	aaString = aaString + ";" + aaNames[fC];
+}
+
+labelMatrix[fitnessClassNumber] = aaString;
+
+labelMatrix2[fitnessClassNumber] = "Model Assignment";
+
+OpenWindow (CHARTWINDOW,{{"Estimated Fitnesses"}
+						   {"labelMatrix"},
+						   {"estimatedFitnessParameters"},
+						   {"Line Plot"},
+						   {"Index"},
+						   {seriesString},
+						   {"AA Index"},
+						   {""},
+						   {"Relative Fitness"},
+						   {"3"}},
+						   "(SCREEN_WIDTH-30)/3;(SCREEN_HEIGHT-50)/2;10;SCREEN_HEIGHT/2+25");
+
+OpenWindow (CHARTWINDOW,{{"Estimated EFV"}
+						   {"labelMatrix"},
+						   {"estimatedEFVs"},
+						   {"Line Plot"},
+						   {"Index"},
+						   {seriesString},
+						   {"AA Index"},
+						   {""},
+						   {"Estimated Freq"},
+						   {"3"}},
+						   "(SCREEN_WIDTH-30)/3;(SCREEN_HEIGHT-50)/2;10+(SCREEN_WIDTH-30)/3;SCREEN_HEIGHT/2+25");
+						   
+if (fitnessClassNumber>1)
+{
+	OpenWindow (CHARTWINDOW,{{"Class Priors"}
+							   {"labelMatrix3"},
+							   {"classPriors"},
+							   {"Pie Chart"},
+							   {"Class Prior"},
+							   {"None"},
+							   {""},
+							   {""},
+							   {"Class Prior"},
+							   {"3"}},
+							   "(SCREEN_WIDTH-30)/3;(SCREEN_HEIGHT-50)/2;12+2*(SCREEN_WIDTH-30)/3;SCREEN_HEIGHT/2+25");
+
+
+	OpenWindow (CHARTWINDOW,{{"Class Posteriors"}
+							   {"labelMatrix2"},
+							   {"fitnessMarginals"},
+							   {"Stacked Bars"},
+							   {"Index"},
+							   {seriesString},
+							   {"AA Index"},
+							   {""},
+							   {"Class Posterior"},
+							   {"3"}},
+							   "SCREEN_WIDTH-30;(SCREEN_HEIGHT-50)/2;15;25");
+}
+
+
diff --git a/res/TemplateBatchFiles/GADatedClock.bf b/res/TemplateBatchFiles/GADatedClock.bf
new file mode 100644
index 0000000..d051856
--- /dev/null
+++ b/res/TemplateBatchFiles/GADatedClock.bf
@@ -0,0 +1,716 @@
+RequireVersion ("0.9920070101");
+VERBOSITY_LEVEL = -1;
+
+ExecuteAFile(HYPHY_LIB_DIRECTORY + "TemplateBatchFiles" + DIRECTORY_SEPARATOR + "TreeTools.ibf");
+ExecuteAFile(HYPHY_LIB_DIRECTORY + "TemplateBatchFiles" + DIRECTORY_SEPARATOR + "Utility" + DIRECTORY_SEPARATOR + "GrabBag.bf");
+#include "GADatedClock.ibf";
+#include "_tipDater.ibf";
+
+/*________________________________________________________________________________________________*/
+
+produceOffspring		= MPI_NODE_COUNT-1;
+if (produceOffspring <= 0)
+{
+	produceOffspring = 15;
+}
+
+populationSize  		= 2*produceOffspring;
+incestDistance  		= 0;
+generationCount		  	= 5000;
+maxSampleTries			= populationSize*10;
+mutationThreshhold		= 0.0001;
+mutationProb			= 0.15;
+mutationProbDecrease	= 0.95;
+annealingPhase			= 100;
+totalSampleCounter		= 0;
+localMutationRate		= 0.05;
+localMutationInterval	= 15;
+
+stoppingCriterion		= 50;
+sampleCount				= 0;
+familyControlSize		= produceOffspring$6;
+
+verboseFlag				= 0;
+stateVectorDimension    = 120;
+rateClassesCount		= 2;
+startWithRateClasses	= 2;
+autoStepFlag			= 1;
+
+/* ________________________________________________________________________________________________*/
+
+MasterList				= {};
+REPLACE_TREE_STRUCTURE  = 1;
+SHORT_MPI_RETURN		= 1;
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function StringToMatrix (zz)
+{
+	return zz;
+}
+
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function ExportAMatrix (fileName, rateMatrix,dummy, dummy2)
+{
+	if (dummy == 1)
+	{
+		return 0;
+	}
+	
+	fprintf (fileName, CLEAR_FILE,ConvertToPartString(rateMatrix));
+	return 0;
+}
+
+
+
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function CleanUpMPI (dummy)
+{
+	if (MPI_NODE_COUNT>1)
+	{
+		while (1)
+		{
+			for (nodeCounter = 0; nodeCounter < MPI_NODE_COUNT-1; nodeCounter = nodeCounter+1)
+			{
+				if (MPINodeState[nodeCounter][0]==1)
+				{
+					fromNode = ReceiveJobs (0,0);
+					break;	
+				}
+			}
+			if (nodeCounter == MPI_NODE_COUNT-1)
+			{
+				break;
+			}
+		}			
+	}
+	return 0;
+}
+
+/*-----------------------------------------------------------*/
+
+function generateBLVector (treeNameID)
+{
+	ExecuteCommands ("treePostOrderAVL = "+treeNameID+"^0;");
+	_blVector = {};
+		
+	for (nodeIndex = 1; nodeIndex < nodeCount; nodeIndex = nodeIndex+1)
+	{
+		nodeInfo 	= treePostOrderAVL[nodeIndex];
+		nodeNameS	= nodeInfo["Name"];
+		nodeParent = nodeInfo["Parent"];
+		if (nodeParent)
+		{
+			parentNodeID = nodeParent;
+			nodeParent = treePostOrderAVL[nodeParent];
+		}
+		if (Abs(nodeParent))
+		{
+			pName    = nodeParent["Name"];
+			if (Abs(nodeInfo["Children"]))
+			{
+				ExecuteCommands ("_thisBL = " + treeNameID+"_"+nodeNameS+"_BL;tipDateAVL[\""+nodeNameS+"\"]="+ treeNameID+"_"+nodeNameS+"_T;");
+			}
+			else
+			{
+				ExecuteCommands ("_thisBL = "+ tipDateAVL[nodeNameS] +" -" + treeNameID+"_"+pName+"_T;");			
+			}
+			_blVector [nodeNameS] = _thisBL;
+		}
+	}
+	
+	
+	return _blVector;
+}
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function ReceiveJobs (sendOrNot, ji)
+{
+	if (MPI_NODE_COUNT>1)
+	{
+		MPIReceive (-1, fromNode, result_String);
+		mji = MPINodeState[fromNode-1][1];
+		
+		if (sendOrNot)
+		{
+			MPISend (fromNode,mpiMessageToSend);
+			MPINodeState[fromNode-1][1] = ji;			
+		}
+		else
+		{
+			MPINodeState[fromNode-1][0] = 0;
+			MPINodeState[fromNode-1][1] = -1;		
+		}
+		ExecuteCommands (result_String);
+		myAIC 			= 2*(_hyphyAssociativeArray["LogL"]-_hyphyAssociativeArray["DF"]-baseParams);
+		tsv				= _hyphyAssociativeArray["tsv"];
+		rsv				= _hyphyAssociativeArray["rsv"];
+		mtd				= _hyphyAssociativeArray["tree"];
+		ji 				= mji;
+	}
+	else
+	{
+		myAIC 			= 2*(res[1][0]-res[1][1]-baseParams);
+		tsv 			= generateTimeStampVector("clockTree");
+		if (ji>=0)
+		{
+			if (resultProcessingContext==0)
+			{
+				rsv = generateRatesVector ("clockTree",Max(currentPopulation[ji],0));
+			}
+			else
+			{
+				rsv = generateRatesVector ("clockTree",Max(children[ji-populationSize],0));
+			}
+			mtd = Format (clockTree,1,1);
+		}
+	}
+
+	if (resultProcessingContext==0)
+	{
+		sortedScores[ji][0] = myAIC;
+		if (ji>=0)
+		{
+			jobPrint = ConvertToPartString (currentPopulation[ji]);
+		}
+		if (verboseFlag)
+		{
+			fprintf (stdout, "Individual ",ji," AIC = ",-myAIC," ");
+		}
+	}
+	else
+	{
+		intermediateProbs[ji][0] = myAIC;	
+		if (ji>=0)
+		{
+			jobPrint = ConvertToPartString (children[ji-populationSize]);
+		}
+		if (verboseFlag)
+		{
+			fprintf (stdout, "Offspring ",ji," AIC = ",-myAIC," ");
+		}
+	}
+	
+	if (Abs(jobPrint))
+	{
+		MasterList [jobPrint] = myAIC;
+		if ( (-myAIC) < bestModelIC)
+		{
+			bestModelIC = -myAIC;
+			bestTreeString = mtd;
+		}
+		
+		if (verboseFlag)
+		{
+			fprintf (stdout, " ", jobPrint, "\n");
+		}
+		fprintf (detailedFile, "\n{{", jobPrint, "}}\n", -myAIC,"\n", tsv, "\n",rsv);
+	}
+	
+	return fromNode-1;
+}
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function ConvertToPartString (modelSpec)
+{
+	outString = "";
+	outString * 128;
+	outString * (""+modelSpec[0]);
+	
+	for (zzz = 1; zzz < stateVectorDimension; zzz = zzz + 1)
+	{
+		outString * (","+modelSpec[zzz]);
+	}
+	
+	outString * 0;
+	return outString;
+}
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function MakeStringCanonical (randomModel, classCount)
+{
+	compressedString = {classCount,1};
+	for (h=0; h<stateVectorDimension; h=h+1)
+	{
+		v = randomModel[h];
+		compressedString[v] = 1;
+	}
+	compressedString[0] = 0;
+	for (h=1; h<classCount; h=h+1)
+	{
+		compressedString[h] = compressedString[h]+compressedString[h-1];
+	}
+	for (h=0; h<stateVectorDimension; h=h+1)
+	{
+		v = randomModel[h];
+		v = compressedString[v];
+		randomModel[h] = v;
+	}
+	v = compressedString[classCount-1]+1;
+	if (v>1)
+	{
+		sortedOrder = {v,2};
+		for (h=0; h<v; h=h+1)
+		{
+			sortedOrder[h][0] = -1;
+		}
+		cc = 0;
+		for (h=0; h<stateVectorDimension; h=h+1)
+		{
+			hshift = randomModel[h];
+			if (sortedOrder[hshift][0] < 0)
+			{
+				sortedOrder[hshift][0] = cc;
+				sortedOrder[hshift][1] = hshift;
+				cc = cc+1;
+			}
+		}
+		sortedOrder = sortedOrder%1;
+		for (h=0; h<stateVectorDimension; h=h+1)
+		{
+			v = randomModel[h];
+			randomModel[h] = sortedOrder[v][0];
+		}
+		
+	}
+	return randomModel;
+}
+
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function RunASample (dummy,jobIndex)
+{	
+	myAIC = MasterList[cString];
+	if (myAIC<0)
+	{		
+		if (resultProcessingContext==0)
+		{
+			sortedScores[jobIndex][0] = myAIC;
+			if (verboseFlag)
+			{
+				fprintf (stdout, "Individual ",jobIndex," AIC = ",-myAIC, "\n");
+			}
+		}
+		else
+		{
+			intermediateProbs[jobIndex][0] = myAIC;	
+			if (verboseFlag)
+			{
+				fprintf (stdout, "Offspring ",jobIndex," AIC = ",-myAIC,"\n");
+			}
+		}	
+	}
+	else
+	{
+		ExecuteCommands ("treePostOrderAVL = "+treeNameID+"^0;");
+		nodeCount 	=  Abs(treePostOrderAVL);
+
+		if ((MPI_NODE_COUNT>1) && (jobIndex>=0))
+		{
+			mpiMessageToSend = "\ncString="+cString+ 
+							   ";\nExecuteCommands 	(generateDatedTipConstraints  (\"clockTree\",parameter2ConstrainString,tipDateAVL,cString,singleModelValues));"+
+							   "LikelihoodFunction lf			 = (filteredData, clockTree);Optimize (res,lf); return makeReturnAVL(0);";
+
+			mpiMessageToSend = _mpiPrefixString + mpiMessageToSend;
+			for (mpiNode = 0; mpiNode < MPI_NODE_COUNT-1; mpiNode = mpiNode+1)
+			{
+				if (MPINodeState[mpiNode][0]==0)
+				{
+					break;	
+				}
+			}
+			if (mpiNode==MPI_NODE_COUNT-1)
+			{
+				mpiNode = ReceiveJobs (1,jobIndex);
+			}
+			else
+			{
+				MPISend (mpiNode+1,mpiMessageToSend);
+				/*fprintf ("last.sent", CLEAR_FILE, MPI_LAST_SENT_MSG);*/
+				MPINodeState[mpiNode][0] = 1;
+				MPINodeState[mpiNode][1] = jobIndex;
+			}
+		}
+		else
+		{
+			ClearConstraints 				   (clockTree);
+			ExecuteCommands 				   (generateDatedTipConstraints  ("clockTree",parameter2ConstrainString,tipDateAVL,cString,singleModelValues));
+			LikelihoodFunction lf			 = (filteredData, clockTree);
+			
+			Optimize (res,lf);
+			
+			if (jobIndex>=0)
+			{
+				mpiNode = ReceiveJobs (1, jobIndex);
+			}
+			else
+			{
+				myAIC = 2*(res[1][0]-res[1][1]-baseParams);
+			}
+		}
+	}
+	return 0;	
+}
+
+
+
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function SpawnRandomString (clsCnt)
+{
+	rModel = {stateVectorDimension,1};
+	rModel = rModel ["Random(0,rateClassesCount)$1"];
+	return 	IsChildViable(MakeStringCanonical(rModel,rateClassesCount));
+}
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function IsChildViable (putativeChild)
+{
+	myAIC 		 = MasterList[ConvertToPartString(putativeChild)];
+	testChild 	 = putativeChild;
+	mutPassCount = 1;
+	
+	while (myAIC < (-0.1) && mutPassCount < 25)
+	{
+		if (verboseFlag)
+		{
+			fprintf (stdout,"Adjusting the child to avoid a duplicate. Pass ", mutPassCount, "\n");
+		}
+		
+		mutPassCount = mutPassCount + 1;
+		
+		sampleString = Min(Random(0,stateVectorDimension)$1,stateVectorDimension-1);
+		myAIC 		 = testChild[sampleString];
+		
+		newValue = Random (0,rateClassesCount-0.0000001)$1;
+		
+		while (newValue == myAIC)
+		{
+			newValue = Random (0,rateClassesCount-0.0000001)$1;
+		}
+		
+		testChild [sampleString] = newValue;
+		myAIC 					 = MasterList[ConvertToPartString(testChild)];
+	}
+	return testChild;
+}
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function UpdateBL (dummy)
+{
+	return 0;
+}
+
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+
+/*
+ChoiceList (dataType,"Data type",1,SKIP_NONE,"Nucleotide","Nucleotide data.",
+				     "Codon","Codon (several available genetic codes).");
+*/
+
+dataType = 0;
+if (dataType<0) 
+{
+	return;
+}
+
+if (dataType==0)
+{
+	SetDialogPrompt 	  		  ("Locate a nucleotide data  file:");
+}
+else
+{
+	SetDialogPrompt 	  		  ("Locate a codon data file:");
+}
+
+DataSet 		ds  		 = ReadDataFile (PROMPT_FOR_FILE);
+DataSetFilter	filteredData = CreateFilter(ds,1);
+
+_mpiPrefixString = "";
+_mpiPrefixString * 256;
+
+_mpiPrefixString * ("ExecuteAFile(HYPHY_LIB_DIRECTORY + \"TemplateBatchFiles\" + DIRECTORY_SEPARATOR + \"TreeTools.ibf\");\nExecuteAFile(HYPHY_LIB_DIRECTORY + \"TemplateBatchFiles\" + DIRECTORY_SEPARATOR + \"GADatedClock.ibf\");");
+_mpiPrefixString * ("DataSet 	ds    = ReadDataFile (\""+LAST_FILE_PATH+"\");");
+_mpiPrefixString * ("DataSetFilter	filteredData = CreateFilter(ds,1);ACCEPT_ROOTED_TREES=1;");
+
+SelectTemplateModel 	(filteredData);
+ExecuteAFile  			(HYPHY_LIB_DIRECTORY+"TemplateBatchFiles"+DIRECTORY_SEPARATOR+"queryTree.bf");
+
+ChoiceList			   (df, "Date Format", 1, SKIP_NONE,
+							"TipDate","Taxon names include sampling dates, e.g. ((s1_85,s2_90),t_83)",
+							"Branch Lengths", "Branch lengths are the sampling dates, e.g. ((s1:85,s2:90),t:83)");
+
+if (df<0)
+{
+	return 0;
+}			
+else
+{				
+	if (df == 0)
+	{							
+		tipDateAVL 			   = getTipDatesFromNames1 ("givenTree");
+	}
+	else
+	{
+		tipDateAVL 			   = getTipDatesFromNames2 ("givenTree");	
+	}
+	_mpiPrefixString * ("tipDateAVL="+tipDateAVL+";");
+}
+
+fprintf (stdout, "What units are the dates measured in (e.g. months. This is only used for reporting the results.)?");
+fscanf  (stdin,"String", dateUnit);
+
+
+if (Abs(tipDateAVL) == 0)
+{
+	fprintf (stdout, "\nERROR: Input tree must contain date information in the chosen format for all sequences.\n",
+					  "Branch lengths for internal nodes are ignored.\n");
+	return 0;
+}
+else
+{
+	fprintf (stdout, "Read the following dates: \n");
+	seqNames = Rows (tipDateAVL);
+	for (sid = 0; sid < Columns (seqNames); sid = sid + 1)
+	{
+		fprintf (stdout, seqNames[sid], ":\t", retAVL[seqNames[sid]]/maxV,"\t",dateUnit,"\n");
+	}
+}
+
+parameter2Constrain = 0;
+
+ACCEPT_ROOTED_TREES = 1;
+Tree clockTree = treeString;
+
+
+if (Rows("LAST_MODEL_PARAMETER_LIST")>1)
+{
+	ChoiceList (parameter2Constrain, "Parameter(s) to constrain:",1,SKIP_NONE,LAST_MODEL_PARAMETER_LIST);
+
+	if (parameter2Constrain<0)
+	{
+		return;
+	}
+	if (parameter2Constrain==0)
+	{
+		parameter2ConstrainString = "";
+		for (parameter2Constrain=Rows("LAST_MODEL_PARAMETER_LIST")-1; parameter2Constrain; parameter2Constrain = parameter2Constrain-1)
+		{
+			GetString (funnyString,LAST_MODEL_PARAMETER_LIST,parameter2Constrain);
+			parameter2ConstrainString = parameter2ConstrainString + funnyString + ",";
+		}
+		GetString (funnyString,LAST_MODEL_PARAMETER_LIST,0);
+		parameter2ConstrainString = parameter2ConstrainString + funnyString;
+	}
+	else
+	{
+		GetString (parameter2ConstrainString,LAST_MODEL_PARAMETER_LIST,parameter2Constrain-1);
+	}
+}
+else
+{
+	GetString (parameter2ConstrainString,LAST_MODEL_PARAMETER_LIST,0);
+}
+
+_mpiPrefixString * ("parameter2ConstrainString=\"" + parameter2ConstrainString + "\";maxV="+maxV+";minV="+minV+";\nUSE_DISTANCES=0;\nUSE_LAST_RESULTS = 1;\nMAXIMUM_ITERATIONS_PER_VARIABLE=1000;OPTIMIZATION_PRECISION=0.01;");
+
+SetDialogPrompt ("Save the best model to:");
+fprintf 		(PROMPT_FOR_FILE,CLEAR_FILE);
+modelFile 		= LAST_FILE_PATH;
+
+Tree givenTree 				= treeString;
+stateVectorDimension 		= Columns(BranchLength (clockTree,-1));
+
+
+USE_LAST_RESULTS 				= 1;
+LikelihoodFunction lf			= (filteredData,givenTree);
+Optimize						(res_free,lf);
+
+
+baseParams = res_free[1][2];
+	
+if (baseParams>0)
+{
+	ConstraintString = "";
+	ConstraintString*256;
+	for (h=0; h<baseParams; h=h+1)
+	{
+		GetString (v,lf,h);
+		ConstraintString * (v+":="+v+"__;\n");
+	}
+	ConstraintString*0;
+	ExecuteCommands (ConstraintString);
+}
+
+Export (modelString, USE_LAST_MODEL);
+_mpiPrefixString * modelString;
+_mpiPrefixString * ("Tree clockTree = " + treeString + ";");
+
+
+IC_BOUND = 2*(res_free[1][1]-res_free[1][0]);
+fprintf (stdout, "\n______________FREE RATES______________\n",lf,"\nBEST AIC=",IC_BOUND,"\n");
+
+
+Tree clockTree 		= treeString;
+cString 			= {stateVectorDimension,1};
+
+global				clockTree_scaler_0;
+
+ExecuteCommands 	(generateDatedTipConstraints  ("clockTree",parameter2ConstrainString,tipDateAVL,cString,0));
+
+
+fprintf (stdout, "Fitting the single rate model...\n");
+
+LikelihoodFunction lf 		= (filteredData,clockTree);
+
+/*
+LIKELIHOOD_FUNCTION_OUTPUT							  = 7;
+fprintf ("/Users/sergei/Desktop/dump.lf", CLEAR_FILE, lf);
+*/
+
+Optimize 					(res,lf);
+
+rateClassesCount = 1;
+bestRES			 = res;
+bestSnap		 = generateLFSnapshot("clockTree", cString);
+
+MAXIMUM_ITERATIONS_PER_VARIABLE = 10000;
+OPTIMIZATION_PRECISION			= 0.001;
+
+for (k=0; k<3; k=k+1)
+{
+	fprintf 					(stdout, "Pass ", rateClassesCount,"(",k,")", " log-L = ", res[1][0], "\n");
+	ExecuteCommands 			(generateDatedTipConstraints  ("clockTree",parameter2ConstrainString,tipDateAVL,cString,0));
+	Optimize 					(res,lf);
+	if (bestRES[1][0] < res[1][0] - OPTIMIZATION_PRECISION)
+	{
+		bestRES 		 = res;
+		k				 = -1;
+		bestSnap		 = generateLFSnapshot("clockTree", cString);
+	}
+	rateClassesCount = rateClassesCount + 1;
+} 
+VERBOSITY_LEVEL = 0;
+ExecuteCommands (bestSnap);
+res = bestRES;
+
+MAXIMUM_ITERATIONS_PER_VARIABLE = 1000;
+OPTIMIZATION_PRECISION			= 0.01;
+USE_LAST_RESULTS 				= 1;
+
+
+currentPopulation  = {};
+sortedScores	   = {populationSize,2};
+sortedScores[0][0] = 2*(res[1][0]-res[1][1]);
+currentBEST_IC	   = -sortedScores[0][0];
+sortedScores[0][1] = 0;
+
+currentPopulation [0] = cString;
+fprintf (stdout, "\n______________SINGLE RATE______________\n",lf,"\nAIC=",currentBEST_IC,"\n");
+maxRateClasses	      = stateVectorDimension$2;
+
+fprintf (stdout, "Maximum of ", maxRateClass, " rate classes will be considered");
+
+/* store initial guesses from the single rate model to feed into the multiple rate model  */
+
+singleModelValues 		  = {};
+singleModelValues["Rate"] = clockTree_scaler_0;
+
+for (nodeIndex = 1; nodeIndex < nodeCount; nodeIndex = nodeIndex+1)
+{
+	nodeInfo 	= treePreOrderAVL[nodeIndex];
+	if (Abs(nodeInfo["Children"]))
+	{
+		nodeNameS	= nodeInfo["Name"];
+		ExecuteCommands ("singleModelValues[\""+nodeNameS+"\"]= clockTree_"+nodeNameS+"_BL;");
+	}
+}	
+
+nodeNameS			= (treePreOrderAVL[1])["Name"];
+ExecuteCommands 	  ("singleModelValues[\""+nodeNameS+"\"]= clockTree_"+nodeNameS+"_T;");
+bestTreeString 		= Format (clockTree,1,1);
+
+detailedFile 	   = modelFile + ".samples";
+fprintf				(detailedFile, CLEAR_FILE, KEEP_OPEN, Format(givenTree,1,1), "\n", bestTreeString, "\n", dateUnit);
+
+tc            = TipCount(givenTree);
+tipDateMatrix = {tc,1};
+for (k=0; k<tc; k=k+1)
+{
+	tipDateMatrix [k] = tipDateAVL[TipName(givenTree,k)]/maxV;
+}
+
+fprintf (detailedFile, "\n", tipDateMatrix);
+
+
+_mpiPrefixString * ("singleModelValues=" + singleModelValues + ";");
+_mpiPrefixString * 0;
+
+bestModelIC = currentBEST_IC;
+
+for (rateClassesCount = startWithRateClasses; rateClassesCount < maxRateClasses; rateClassesCount = rateClassesCount + 1)
+{
+	fprintf (stdout, "\n\nStarting GA with ", rateClassesCount, " rate classes\n");
+	addOnLine = " with " + rateClassesCount + " rate classes.";
+	
+	resultProcessingContext = 0;
+	
+	if (rateClassesCount > startWithRateClasses)
+	{
+		children = {};
+		for (individual=populationSize $ 2; individual<populationSize-1; individual=individual+1)
+		{
+			cString    = currentPopulation[individual];
+			toggleRate = Random (0,rateClassesCount-1.00001)$1;
+			for (bitP = 0; bitP < stateVectorDimension; bitP = bitP + 1)
+			{
+				if (cString [bitP] == toggleRate)
+				{
+					if (Random(0,1)<0.5)
+					{
+						cString [bitP] = rateClassesCount-1;
+					}
+				}
+			}
+			cString = IsChildViable(MakeStringCanonical(cString,rateClassesCount));
+			sortedScores[individual][1] 		= individual;
+			currentPopulation[individual] 		= cString;
+			RunASample (compressedString[rateClassesCount-1],individual);
+		}
+	}	
+	
+	ExecuteAFile (HYPHY_LIB_DIRECTORY + "TemplateBatchFiles" + DIRECTORY_SEPARATOR + "GA_CHC.ibf");
+	kf				= -sortedScores[populationSize-1][0];
+	
+	if (currentBEST_IC > kf)
+	{
+		currentBEST_IC = kf;
+		/*if (IC_BOUND > currentBEST_IC)
+		better than the free rates model 
+		{
+			break;
+		}*/
+	}
+	else
+	{
+		break;
+	}
+}
+
+ExportAMatrix (modelFile,currentPopulation[populationSize-1],0, 0);
+fprintf 	  (detailedFile, CLOSE_FILE);
+fscanf		  (detailedFile, "Raw", MasterList);
+fprintf		  (detailedFile, CLEAR_FILE, bestTreeString, "\n", MasterList);
diff --git a/res/TemplateBatchFiles/GADatedClock.ibf b/res/TemplateBatchFiles/GADatedClock.ibf
new file mode 100644
index 0000000..ca7e1fc
--- /dev/null
+++ b/res/TemplateBatchFiles/GADatedClock.ibf
@@ -0,0 +1,250 @@
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function generateDatedTipConstraints (treeNameID, parameterToConstrain, tipDateAVL, rateAVL, presetValues)
+{
+	DT_String = "";
+	DT_String * 8192;
+	
+
+	ExecuteCommands ("treePostOrderAVL = "+treeNameID+"^0;");
+	ExecuteCommands ("treePreOrderAVL = "+treeNameID+"^1;");
+	nodeCount 	=  Abs(treePostOrderAVL);
+	doneAssignment = {};
+	
+	for (nodeIndex = 0; nodeIndex < nodeCount-1; nodeIndex = nodeIndex+1)
+	{
+		aRate = rateAVL[nodeIndex];
+		if (doneAssignment[aRate] == 0)
+		{
+			doneAssignment[aRate] = 1;
+			DT_String * ("global "+treeNameID+"_scaler_"+aRate+" = 1.0;\n"+treeNameID+"_scaler_"+aRate+" :> 0.0;");
+		}
+	}
+
+	timeStops				  		  = {};
+
+	for (nodeIndex = 1; nodeIndex < nodeCount; nodeIndex = nodeIndex+1)
+	{
+		nodeInfo 	= treePostOrderAVL[nodeIndex];
+		nodeNameS	= nodeInfo["Name"];
+		timeStops[nodeNameS] = 1e100;
+	
+		if (Abs(nodeInfo["Children"]))
+		{
+			DT_String * (" "+treeNameID+"_"+nodeNameS+"_T = 1;global "+treeNameID+"_"+nodeNameS+"_T:>(-10000); "+treeNameID+"_"+nodeNameS+"_BL = 0.0001; "+treeNameID+"_"+nodeNameS+"_BL :> 0;\n");
+			if (Abs(nodeInfo["Parent"]) == 0)
+			{
+				
+				if (minV > 0)
+				{
+					minV = minV/2;
+				}
+				else
+				{
+					minV = minV*2;
+				}
+				DT_String * (treeNameID+"_"+nodeNameS+"_T = " + minV + ";");
+				timeStops[nodeNameS] = minV;
+			}
+		}
+		else
+		{
+			treePostOrderAVL[nodeIndex] = nodeInfo;
+		}
+	}
+	
+	descendantsList 		  = {};
+	
+	for (nodeIndex = 1; nodeIndex < nodeCount; nodeIndex = nodeIndex+1)
+	{
+		nodeInfo 	= treePostOrderAVL[nodeIndex];
+		nodeNameS	= nodeInfo["Name"];
+		nodeParent = nodeInfo["Parent"];
+		if (nodeParent)
+		{
+			parentNodeID = nodeParent;
+			nodeParent = treePostOrderAVL[nodeParent];
+		}
+		if (Abs(nodeParent))
+		{
+			treePostOrderAVL[parentNodeID] = nodeParent;
+			pName    = nodeParent["Name"];
+			insIndex = Abs (descendantsList[pName]);
+			if (insIndex == 0)
+			{
+				descendantsList[pName] = {};
+			}
+			
+			rateClass = rateAVL[nodeIndex-1];
+						
+			if (Abs(nodeInfo["Children"]))
+			{
+				DT_String * (treeNameID+"."+nodeNameS+"."+parameterToConstrain+":="+treeNameID+"_scaler_"+rateClass+"*("+
+							 treeNameID+"_"+nodeNameS+"_BL);"+
+							 treeNameID+"_"+nodeNameS+"_T:="+treeNameID+"_"+nodeParent["Name"]+"_T+"+treeNameID+"_"+nodeNameS+"_BL;\n");
+							 
+				(descendantsList[pName])[insIndex] = treeNameID+"_"+nodeNameS+"_T";
+				timeStops[pName] = Min (timeStops[pName],timeStops[nodeNameS]);
+			}
+			else
+			{
+				DT_String * (treeNameID+"."+nodeNameS+"."+parameterToConstrain+":="+treeNameID+"_scaler_"+rateClass+"*("+
+							 tipDateAVL[nodeNameS]+"-"+treeNameID+"_"+nodeParent["Name"]+"_T);\n");			
+				(descendantsList[pName])[insIndex] = tipDateAVL[nodeNameS];
+				timeStops[pName] = Min (timeStops[pName],tipDateAVL[nodeNameS]);
+			}
+		}
+	}
+	
+	if (Abs (presetValues))
+	{
+		for (nodeIndex = 2; nodeIndex < nodeCount; nodeIndex = nodeIndex+1)
+		{
+			nodeInfo 	= treePreOrderAVL[nodeIndex];
+			if (Abs(nodeInfo["Children"]))
+			{
+				nodeNameS	= nodeInfo["Name"];
+				DT_String * (treeNameID + "_" + nodeNameS + "_BL = " + presetValues[nodeNameS] + ";");
+			}
+		}	
+		nodeNameS	= (treePreOrderAVL[1])["Name"];
+		DT_String * (treeNameID + "_" + nodeNameS + "_T = " + presetValues[nodeNameS] + ";");
+		for (nodeIndex = 0; nodeIndex < Abs(doneAssignment); nodeIndex = nodeIndex+1)
+		{
+			DT_String * (treeNameID+"_scaler_"+nodeIndex+" = " + presetValues["Rate"] + ";");
+		}
+	}	
+	else
+	{
+		for (nodeIndex = 1; nodeIndex < nodeCount; nodeIndex = nodeIndex+1)
+		{
+			nodeInfo 	= treePreOrderAVL[nodeIndex];
+			if (Abs(nodeInfo["Children"]) && Abs (nodeInfo["Parent"]))
+			{
+				nodeNameS	= nodeInfo["Name"];
+				pName		= timeStops[(treePreOrderAVL[(nodeInfo["Parent"])])["Name"]];
+				rateClass = Random(0.2,0.8)*(timeStops[nodeNameS] - pName);
+				DT_String * (treeNameID+"_"+nodeNameS+"_BL = " + rateClass + ";");
+				timeStops[nodeNameS] = pName + rateClass;			
+			}
+		}	
+	}
+
+	rateClass = Rows (descendantsList); 
+	for (nodeIndex = 0; nodeIndex < Columns (rateClass); nodeIndex = nodeIndex + 1)
+	{
+		pName 				= rateClass[nodeIndex];
+		nodePT				= descendantsList[pName];
+		doneAssignment		= 1e100;
+		for (nodeInfo = 0; nodeInfo< Abs (nodePT); nodeInfo = nodeInfo + 1)
+		{
+			nodeNameS = nodePT[nodeInfo];
+			if (0+nodeNameS == nodeNameS+0)
+			{
+				doneAssignment = Min (doneAssignment, nodeNameS);
+			}
+			else
+			{
+				break;
+			}
+		}
+		if (nodeInfo == Abs (nodePT))
+		{
+			DT_String * (treeNameID+"_"+pName+"_T:<"+doneAssignment+";\n");
+		}
+	}
+	
+	DT_String * 0;
+	return DT_String;
+}
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function generateLFSnapshot (treeNameID, rateAVL)
+{
+	DT_String = "";
+	DT_String * 8192;
+	
+
+	ExecuteCommands ("treePreOrderAVL = "+treeNameID+"^1;");
+	nodeCount 	=  Abs(treePreOrderAVL);
+	doneAssignment = {};
+	
+	for (nodeIndex = 0; nodeIndex < nodeCount-1; nodeIndex = nodeIndex+1)
+	{
+		aRate = rateAVL[nodeIndex];
+		if (doneAssignment[aRate] == 0)
+		{
+			doneAssignment[aRate] = 1;
+			ExecuteCommands ("myV = "+treeNameID+"_scaler_"+aRate+";");			
+			DT_String * (treeNameID+"_scaler_"+aRate+"="+myV+";");
+		}
+	}
+	for (nodeIndex = 2; nodeIndex < nodeCount; nodeIndex = nodeIndex+1)
+	{
+		nodeInfo 	= treePreOrderAVL[nodeIndex];
+		if (Abs(nodeInfo["Children"]))
+		{
+			nodeNameS	= nodeInfo["Name"];
+			ExecuteCommands ("myV = "+treeNameID + "_" + nodeNameS + "_BL;");			
+			DT_String * (treeNameID + "_" + nodeNameS + "_BL = " + myV+ ";");
+		}
+	}	
+	nodeNameS	= (treePreOrderAVL[1])["Name"];
+	ExecuteCommands ("myV = "+treeNameID + "_" + nodeNameS + "_T;");			
+	DT_String * (treeNameID + "_" + nodeNameS + "_T = " + myV + ";");
+	DT_String * 0;
+	return DT_String;
+}
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function generateTimeStampVector (treeNameID)
+{
+	ExecuteCommands ("iNodeCount = BranchCount("+treeNameID+");");
+	exportParameterList = {iNodeCount+1,1};
+	_cc					= 0;
+	for (nodeIndex = 1; nodeIndex < nodeCount; nodeIndex = nodeIndex+1)
+	{
+		nodeInfo 	= treePostOrderAVL[nodeIndex];
+		nodeNameS	= nodeInfo["Name"];
+	
+		if (Abs(nodeInfo["Children"]))
+		{
+			ExecuteCommands ("myvalue = " +treeNameID+"_"+nodeNameS+"_T");
+			exportParameterList[_cc] = myvalue;
+			_cc = _cc+1;
+		}
+	}
+		
+	return exportParameterList*(1/maxV);
+}
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function generateRatesVector (treeNameID, rateCount)
+{
+	rateCount			= rateCount+1;
+	exportParameterList = {rateCount,1};
+	_cc					= 0;
+	for (nodeIndex = 0; nodeIndex < rateCount; nodeIndex = nodeIndex+1)
+	{
+		ExecuteCommands 		  ("myvalue = maxV*" +treeNameID + "_scaler_" + nodeIndex);
+		exportParameterList[nodeIndex] = myvalue;
+	}
+	return exportParameterList;
+}
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function makeReturnAVL (dummy)
+{
+	retValue = {};
+	retValue ["LogL"]  = res[1][0];
+	retValue ["DF"]    = res[1][1];
+	retValue ["rsv"]   = generateRatesVector("clockTree",Max(cString,0));
+	retValue ["tsv"]   = generateTimeStampVector("clockTree");
+	retValue ["tree"]  = Format(clockTree,1,1);
+	
+	return "_hyphyAssociativeArray="+retValue;
+}
diff --git a/res/TemplateBatchFiles/GADatedClockProcessor.bf b/res/TemplateBatchFiles/GADatedClockProcessor.bf
new file mode 100644
index 0000000..5bb8414
--- /dev/null
+++ b/res/TemplateBatchFiles/GADatedClockProcessor.bf
@@ -0,0 +1,347 @@
+branchColors     = {};
+branchColors [0] = {{0,0,255}}*(1/255);   		/* blue */
+branchColors [1] = {{128,0,128}}*(1/255); 		/* purple */
+branchColors [2] = {{255,0,0}}*(1/255); 		/* red */
+
+
+ExecuteAFile(HYPHY_LIB_DIRECTORY + "TemplateBatchFiles" + DIRECTORY_SEPARATOR + "Utility" + DIRECTORY_SEPARATOR + "GrabBag.bf");
+ExecuteAFile(HYPHY_LIB_DIRECTORY + "TemplateBatchFiles" + DIRECTORY_SEPARATOR + "TreeTools.ibf");
+ExecuteAFile(HYPHY_LIB_DIRECTORY + "TemplateBatchFiles" + DIRECTORY_SEPARATOR + "Utility" + DIRECTORY_SEPARATOR + "WriteDelimitedFiles.bf");
+ExecuteAFile(HYPHY_LIB_DIRECTORY + "TemplateBatchFiles" + DIRECTORY_SEPARATOR + "Utility" + DIRECTORY_SEPARATOR + "DescriptiveStatistics.bf");
+
+SetDialogPrompt ("Locate the results file:");
+
+fscanf (PROMPT_FOR_FILE, "Raw", theSamples);
+basePath = LAST_FILE_PATH;
+UseModel (USE_NO_MODEL);
+sscanf 	(theSamples,"Tree",bestTree);
+sscanf 	(theSamples,"Tree",givenTree);
+sscanf 	(theSamples,"Tree",singleTree);
+
+TREE_OUTPUT_OPTIONS = {};
+tree_lng 			= BranchLength (bestTree,-1);
+branchNames			= BranchName   (bestTree,-1);
+iNodeCounter		= 0;
+
+fprintf 		(stdout, "\n[PHASE 0.] Making tree plots\n");
+TREE_OUTPUT_OPTIONS["__FONT_SIZE__"] = 16;
+baseHeight 		= TipCount (givenTree)*52;
+
+drawLetter			= "/drawletter {"+TREE_OUTPUT_OPTIONS["__FONT_SIZE__"]$4+" -"+TREE_OUTPUT_OPTIONS["__FONT_SIZE__"]$2+
+					   " rmoveto 1 copy false charpath pathbbox 2 index 3 sub sub exch 3 index 3 sub sub exch  0.85 setgray 4 copy rectfill 0 setgray  3 index 3 index currentlinewidth 0.5 setlinewidth 7 3 roll rectstroke setlinewidth exch 1.5 add exch 1.5 add moveto show} def\n";
+
+psString 		= PSTreeString (givenTree, "STRING_SUPPLIED_LENGTHS",{{612,baseHeight}}) ^ {{"showpage"}{"0 "+(baseHeight-50-TREE_OUTPUT_OPTIONS["__FONT_SIZE__"])+" moveto (Free rates model) drawletter\nshowpage\n"}} ;
+psString2 		= PSTreeString (singleTree,"STRING_SUPPLIED_LENGTHS",{{612,baseHeight}}) ^ {{"showpage"}{"0 "+(baseHeight-50-TREE_OUTPUT_OPTIONS["__FONT_SIZE__"])+" moveto (Single model) drawletter\nshowpage\n"}};
+psString3 		= PSTreeString (bestTree,  "STRING_SUPPLIED_LENGTHS",{{612,baseHeight}}) ^ {{"showpage"}{"0 "+(baseHeight-50-TREE_OUTPUT_OPTIONS["__FONT_SIZE__"])+" moveto (Multiple rate model) drawletter\nshowpage\n"}};
+
+tName  = basePath + ".nwk";
+fName  = basePath + "_treeshapes.ps";
+fprintf (fName, CLEAR_FILE, drawLetter, psString, 
+							psString2, 
+							psString3);
+	
+fprintf (tName, CLEAR_FILE, Format(givenTree,0,1), "\n", Format(singleTree,0,1), "\n", Format(bestTree,0,1), "\n");
+
+
+sscanf 	(theSamples,"String",units);
+sscanf 	(theSamples,"NMatrix",tipDates);
+
+rateAssignments = {};
+internalDates   = {};
+AIC				= {};
+rateValues 		= {};
+modelsRead		= 0;
+bestAIC			= 1e100;
+bestModelID		= -1;
+bestModelRC		= 0;
+
+while (!END_OF_FILE)
+{
+	modelRates = 0;
+	sscanf (theSamples,"NMatrix,Number,NMatrix,NMatrix",modelSpec,anAIC,modelDates,modelRates);
+	if (Rows (modelRates))
+	{
+		AIC[modelsRead] 			= anAIC;
+		if (anAIC < bestAIC)
+		{
+			bestAIC 	= anAIC;
+			bestModelID = modelsRead;
+			bestModelRC	= Rows(modelRates);
+		}
+		
+		internalDates[modelsRead]	= modelDates;
+		rateValues[modelsRead]		= modelRates;
+		rateAssignments[modelsRead]	= modelSpec;
+		modelsRead 					= modelsRead + 1;
+	}
+}	
+
+fprintf 		(stdout, "[PHASE 1.] Read ", modelsRead, " models. Best AIC found: ", bestAIC, " using ", bestModelRC," rates.\n");
+sortedScores = 	({modelsRead,2}["_MATRIX_ELEMENT_COLUMN_ * _MATRIX_ELEMENT_ROW_ + (_MATRIX_ELEMENT_COLUMN_==0)*Exp(-0.5*(AIC[_MATRIX_ELEMENT_ROW_]-bestAIC))"])%0;
+
+cumulWeight  = 0;
+normConst	 = ({1,modelsRead}["1"]*sortedScores[-1][0])[0];
+for (upto95p = modelsRead-1; upto95p>=0 && cumulWeight <= 0.95; upto95p = upto95p - 1)
+{
+	cumulWeight = cumulWeight + sortedScores[upto95p][0]/normConst;
+}
+ciSize 			= modelsRead-upto95p-1;
+fprintf 		(stdout, "[PHASE 2.] ", ciSize , " models in the 95% confidence set.\n");
+fprintf 		(stdout, "[PHASE 3.] Tabulating rate and date estimates\n");
+branchCount		= BranchCount (givenTree)+1;
+allCount		= BranchCount (givenTree) + TipCount (givenTree);
+
+dateEstimates   = {ciSize, branchCount};
+rateEstimates	= {ciSize, allCount};
+lengthEstimates = {ciSize, branchCount};
+dateInfo		= {branchCount,5};
+lengthInfo		= {branchCount,5};
+rootLengthInfo	= {};
+branchSpanInfo	= {};
+
+
+rateInfo		= {allCount,5};
+
+k4 = 0;
+normConst = normConst*cumulWeight;
+
+treeAVL = givenTree ^ 0;
+nodeNames		= {};
+allNames		= {};
+iNodes			= {};
+parentNames		= {};
+allNamesToI		= {};
+
+iNodeCounter	= 0;
+for (k3 = 1; k3 < Abs(treeAVL); k3=k3+1)
+{
+	if(Abs((treeAVL[k3])["Children"]))
+	{
+		nodeNames[Abs(nodeNames)] = (treeAVL[k3])["Name"];
+		iNodes[(treeAVL[k3])["Name"]] = 1;
+		allNamesToI [(treeAVL[k3])["Name"]] = iNodeCounter;
+		iNodeCounter				  = iNodeCounter+1;
+	}
+	if ((treeAVL[k3])["Parent"])
+	{
+		allNames[Abs(allNames)] = (treeAVL[k3])["Name"];
+		parentNames[Abs(parentNames)] = (treeAVL[(treeAVL[k3])["Parent"]])["Name"];
+	}
+	
+}
+
+
+for (k = modelsRead-1; k > upto95p; k = k - 1)
+{
+	thisModelID = sortedScores[k][1];
+	myAW		= (sortedScores[k][0])/normConst;
+	for (k3 = 0; k3 < branchCount; k3=k3+1)
+	{
+		dateEstimates [k4][k3] = (internalDates[thisModelID])[k3];
+		dateInfo	  [k3][0]  = dateInfo[k3][0] + dateEstimates [k4][k3]*myAW;
+	}
+	rootD		= (internalDates[thisModelID])[branchCount-1];
+	iNodeCounter= 0;
+	/*tipCounter  = 0;*/
+	for (k3 = 0; k3 < allCount; k3=k3+1)
+	{
+		rateEstimates [k4][k3] 			= (rateValues[thisModelID])[(rateAssignments[thisModelID])[k3]];
+		rateInfo 	  [k3][0]  			= rateInfo[k3][0] + rateEstimates [k4][k3]*myAW;
+		nodeName						= allNames[k3];
+		parentD		  = (internalDates[thisModelID])[allNamesToI[parentNames[k3]]];
+		/*if (iNodes[nodeName])
+		{
+			myD		     							= (internalDates[thisModelID])[iNodeCounter];
+			lengthEstimates[k4][iNodeCounter] 		= myD-parentD;
+			iNodeCounter 							= iNodeCounter+1;
+			lengthInfo [k3][0] 						= lengthInfo [k3][0] + myAW*(myD-parentD);
+		}
+		else
+		{
+			myD		   = tipDates[tipCounter];
+			tipCounter = tipCounter+1;
+		
+		}*/
+		rootLengthInfo[allNames[k3]]	= (rootLengthInfo[allNames[k3]]) + myAW*(myD-rootD);
+		branchSpanInfo[allNames[k3]]	= (branchSpanInfo[allNames[k3]]) + myAW*(myD-parentD);
+	}
+	k4 = k4 + 1;
+}
+
+/* generate date estimates */
+
+fprintf 		(stdout, "[PHASE 4.] Writing CSV files\n");
+
+labels = {{"Branch/Node","Model Averaged Mean", "2.5%", "Mean", "Median", "97.5%"}};
+
+for (k3 = 0; k3 < branchCount; k3=k3+1)
+{
+	myDS = GatherDescriptiveStats (dateEstimates[-1][k3]);
+	dateInfo[k3][1] = myDS["2.5%"];
+	dateInfo[k3][2] = myDS["Mean"];
+	dateInfo[k3][3] = myDS["Median"];
+	dateInfo[k3][4] = myDS["97.5%"];
+	myDS = GatherDescriptiveStats (lengthEstimates[-1][k3]);
+	lengthEstimates[k3][1] = myDS["2.5%"];
+	lengthEstimates[k3][2] = myDS["Mean"];
+	lengthEstimates[k3][3] = myDS["Median"];
+	lengthEstimates[k3][4] = myDS["97.5%"];
+}
+
+WriteSeparatedTable (basePath + "_dates.csv",labels,dateInfo,nodeNames,",");
+WriteSeparatedTable (basePath + "_spans.csv",labels,dateInfo,nodeNames,",");
+
+/* generate rate estimates */
+
+for (k3 = 0; k3 < allCount; k3=k3+1)
+{
+	myDS = GatherDescriptiveStats (rateEstimates[-1][k3]);
+	rateInfo[k3][1] = myDS["2.5%"];
+	rateInfo[k3][2] = myDS["Mean"];
+	rateInfo[k3][3] = myDS["Median"];
+	rateInfo[k3][4] = myDS["97.5%"];
+}
+
+WriteSeparatedTable (basePath + "_rates.csv",labels,rateInfo,allNames,",");
+
+fprintf (stdout, "[PHASE 5.] Making a PostScript tree with the model averaged rate estimates\n");
+
+
+md = 0;
+
+for (k3 = 1; k3 < Abs(treeAVL); k3=k3+1)
+{
+	md = Max (md, (treeAVL[k3])["Depth"]);
+}
+
+baseWidth 			= md * 100;
+
+/*
+bestModelDates		= internalDates[sortedScores[modelsRead-1][1]];
+bestModelRates		= rateAssignments[sortedScores[modelsRead-1][1]];
+bestModelRatesV		= rateValues[sortedScores[modelsRead-1][1]];
+*/
+
+bestModelDates		= dateInfo[-1][0];
+bestModelRates		= rateAssignments[sortedScores[modelsRead-1][1]];
+bestModelRatesV		= rateInfo[-1][0];
+
+minR				= 1e100;
+maxR				= 0;
+
+iNodeCounter		= 0;
+
+for (k=0; k<Columns(branchNames); k=k+1)
+{
+	nodeSpec  = {};
+	nodeName  = branchNames [k];
+
+	if (iNodes[nodeName])
+	{
+		nodeSpec ["TREE_OUTPUT_BRANCH_LABEL"] = "(" + Format(bestModelDates[iNodeCounter],6,3) + ") drawletter";
+		iNodeCounter = iNodeCounter + 1;
+	}
+	if (k < allCount)
+	{
+		minR = Min(minR,bestModelRatesV[k]);
+		maxR = Max(maxR,bestModelRatesV[k]);
+	}
+	TREE_OUTPUT_OPTIONS[nodeName] = nodeSpec;
+}
+
+colorByNode	= {};
+
+for (k=0; k<allCount; k=k+1)
+{
+	myRV	  = bestModelRatesV[k];
+	nodeName  = branchNames [k];
+	myColor	  = {{(myRV-minR)/(maxR-minR)} /* 1 for maxR, 0 for minR; linear between */
+				 {0}
+				 {(maxR-myRV)/(maxR-minR)} /* 1 for minR, 0 for maxR; linear between */
+				};
+				
+	colorByNode [nodeName] = myColor;
+	(TREE_OUTPUT_OPTIONS[nodeName])["TREE_OUTPUT_BRANCH_COLOR"] = myColor;
+	(TREE_OUTPUT_OPTIONS[nodeName])["TREE_OUTPUT_OVER_BRANCH"] = "0 0 0 setrgbcolor\n5 5 rmoveto\n("+Format(myRV/maxR*100,5,2)+"\\%) show";
+	
+}
+
+psString 			= PSTreeString (givenTree,"",{{baseWidth,baseHeight}});
+
+
+psLegend = "";
+psLegend * 256;
+
+sortedKeys = {{minR,(minR+maxR)/2,maxR}};
+
+currentPosY = baseHeight + 10;
+currentPosX = 25;
+
+for (k=2; k>=0; k=k-1)
+{
+	aKey 		= sortedKeys[k];
+	colorMx 	= branchColors[k];
+	psLegend * (""+colorMx[0]+" "+colorMx[1]+" "+colorMx[2]+ " setrgbcolor\n"+currentPosX+" "+currentPosY+" moveto\n");
+	psLegend * ("("+Format(aKey,10,5)+" subs/site/"+units+") show\n");
+	currentPosY = currentPosY + 20;
+}
+
+newHeight = baseHeight + (bestModelRC+1)*20;
+
+psLegend * "showpage";
+psLegend * 0;
+repMx = {{"showpage"}{psLegend}};
+psString = psString ^ repMx;
+repMx = {{"/PageSize\\ \\[[0-9\\ ]+\\]"}{"/PageSize ["+baseWidth+" "+ newHeight+ "]"}};
+psString = psString ^ repMx;
+repMx = {{"setfont"}{"setfont\n3 setlinewidth\n1 setlinecap"}};
+psString = psString ^ repMx;
+
+
+fName = basePath + "_ratesDates.ps";
+fprintf (fName, CLEAR_FILE,drawLetter,psString);
+							
+							
+fprintf (stdout, "[PHASE 6.] Making a model averaged PostScript tree with dated tips and internal nodes (relative to the root)\n");
+
+distanceAVL			= {};
+rootD				= bestModelDates[Rows(bestModelDates)-1];
+
+k2 = 0;
+k  = 0;
+md = 0;
+
+for (k3 = 1; k3 < Abs(treeAVL); k3=k3+1)
+{
+	nodeName = (treeAVL[k3])["Name"];
+	if(Abs((treeAVL[k3])["Children"]))
+	{
+		(TREE_OUTPUT_OPTIONS[nodeName])["TREE_OUTPUT_BRANCH_LABEL"] = "(" + nodeName + ") drawletter" ;
+	}
+	else
+	{
+		(TREE_OUTPUT_OPTIONS[nodeName]) - "TREE_OUTPUT_BRANCH_LABEL";
+	}
+	distanceAVL [nodeName] = branchSpanInfo[nodeName];
+	(TREE_OUTPUT_OPTIONS[nodeName]) ["TREE_OUTPUT_OVER_BRANCH"] = "0 0 0 setrgbcolor\n5 5 rmoveto\n("+
+																	Format(distanceAVL [nodeName],4,1)+") show";	
+	md = Max (md, (treeAVL[k3])["Depth"]);
+}
+
+
+ts = PostOrderAVL2StringDistances (treeAVL, distanceAVL);
+Tree T = ts;
+
+fprintf (tName, Format(T,0,1),"\n");
+
+psString 		= PSTreeString (T,"STRING_SUPPLIED_LENGTHS",{{baseWidth,baseHeight}});
+repMx = {{"showpage"}{psLegend}};
+psString = psString ^ repMx;
+repMx = {{"/PageSize\\ \\[[0-9\\ ]+\\]"}{"/PageSize [ "+baseWidth+" "+ newHeight+ "]"}};
+psString = psString ^ repMx;
+repMx = {{"setfont"}{"setfont\n3 setlinewidth\n1 setlinecap"}};
+psString = psString ^ repMx;
+fName = basePath + "_scaled.ps";
+fprintf (fName, CLEAR_FILE,drawLetter,psString);
+
+		
diff --git a/res/TemplateBatchFiles/GADatedClockProcessorM.bf b/res/TemplateBatchFiles/GADatedClockProcessorM.bf
new file mode 100644
index 0000000..a6fd51e
--- /dev/null
+++ b/res/TemplateBatchFiles/GADatedClockProcessorM.bf
@@ -0,0 +1,420 @@
+branchColors     = {};
+branchColors [0] = {{0,0,255}}*(1/255);   		/* blue */
+branchColors [1] = {{128,0,128}}*(1/255); 		/* purple */
+branchColors [2] = {{255,0,0}}*(1/255); 		/* red */
+
+
+ExecuteAFile(HYPHY_LIB_DIRECTORY + "TemplateBatchFiles" + DIRECTORY_SEPARATOR + "Utility" + DIRECTORY_SEPARATOR + "GrabBag.bf");
+ExecuteAFile(HYPHY_LIB_DIRECTORY + "TemplateBatchFiles" + DIRECTORY_SEPARATOR + "TreeTools.ibf");
+ExecuteAFile(HYPHY_LIB_DIRECTORY + "TemplateBatchFiles" + DIRECTORY_SEPARATOR + "Utility" + DIRECTORY_SEPARATOR + "WriteDelimitedFiles.bf");
+ExecuteAFile(HYPHY_LIB_DIRECTORY + "TemplateBatchFiles" + DIRECTORY_SEPARATOR + "Utility" + DIRECTORY_SEPARATOR + "DescriptiveStatistics.bf");
+
+SetDialogPrompt ("Locate the list of result files:");
+fscanf			(PROMPT_FOR_FILE,"Lines",_listOfResults);
+basePath 		= LAST_FILE_PATH;
+
+fprintf 		(stdout, "\n[PHASE 0.] Reading ", Columns (_listOfResults), " result files...\n");
+
+SetDialogPrompt ("Locate the results file:");
+
+fscanf 		(_listOfResults[0], "Raw", theSamples);
+
+UseModel (USE_NO_MODEL);
+sscanf 	(theSamples,"Tree",bestTree);
+sscanf 	(theSamples,"Tree",givenTree);
+sscanf 	(theSamples,"Tree",singleTree);
+
+TREE_OUTPUT_OPTIONS = {};
+tree_lng 			= BranchLength (bestTree,-1);
+branchNames			= BranchName   (bestTree,-1);
+iNodeCounter		= 0;
+
+TREE_OUTPUT_OPTIONS["__FONT_SIZE__"] = 16;
+baseHeight 		= TipCount (givenTree)*52;
+
+
+sscanf 	(theSamples,"String",units);
+sscanf 	(theSamples,"NMatrix",tipDates);
+
+rateAssignments = {};
+internalDates   = {};
+AIC				= {};
+rateValues 		= {};
+modelsRead		= 0;
+bestAIC			= 1e100;
+bestModelID		= -1;
+bestModelRC		= 0;
+
+model2Iterate   = {};
+
+fprintf (stdout, "File ", _listOfResults[0],  ".\n");
+while (!END_OF_FILE)
+{
+	modelRates = 0;
+	sscanf (theSamples,"NMatrix,Number,NMatrix,NMatrix",modelSpec,anAIC,modelDates,modelRates);
+	if (Rows (modelRates))
+	{
+		AIC[modelsRead] 			= anAIC;
+		if (anAIC < bestAIC + 20)
+		{
+			if (anAIC < bestAIC)
+			{
+				bestAIC 	= anAIC;
+				bestModelID = modelsRead;
+				bestModelRC	= Rows(modelRates);
+				bestTree	= a;
+			}
+			
+			internalDates[modelsRead]	= modelDates;
+			rateValues[modelsRead]		= modelRates;
+			rateAssignments[modelsRead]	= modelSpec;
+			model2Iterate  [modelsRead]	= 0;
+			modelsRead 					= modelsRead + 1;
+		}
+	}
+}	
+
+for (itt = 1; itt < Columns(_listOfResults); itt = itt+1)
+{
+	itFile = _listOfResults[itt];
+	
+	fscanf  (itFile, "Raw", additionalSamples);
+	
+	END_OF_FILE = 0;
+	
+	sscanf 	(additionalSamples,"Tree",a);
+	sscanf 	(additionalSamples,"Tree",b);
+	sscanf 	(additionalSamples,"Tree",c);
+	sscanf 	(additionalSamples,"String",d);
+	sscanf 	(additionalSamples,"NMatrix",e);
+	
+	fprintf (stdout, "File ", itFile,  ". Models read so far ", modelsRead, "\n");
+
+	while (!END_OF_FILE)
+	{
+		modelRates = 0;
+		sscanf (additionalSamples,"NMatrix,Number,NMatrix,NMatrix",modelSpec,anAIC,modelDates,modelRates);
+		if (Rows (modelRates))
+		{
+			if (anAIC < bestAIC + 20)
+			{
+				if (anAIC < bestAIC)
+				{
+					bestAIC 	= anAIC;
+					bestModelID = modelsRead;
+					bestModelRC	= Rows(modelRates);
+					bestTree	= a;
+				}
+				
+				AIC[modelsRead] 			= anAIC;
+				internalDates[modelsRead]	= modelDates;
+				rateValues[modelsRead]		= modelRates;
+				rateAssignments[modelsRead]	= modelSpec;
+				model2Iterate  [modelsRead]	= itt;
+				modelsRead 					= modelsRead + 1;
+			}
+		}
+	}	
+}
+
+drawLetter			= "/drawletter {"+TREE_OUTPUT_OPTIONS["__FONT_SIZE__"]$4+" -"+TREE_OUTPUT_OPTIONS["__FONT_SIZE__"]$2+
+					   " rmoveto 1 copy false charpath pathbbox 2 index 3 sub sub exch 3 index 3 sub sub exch  0.85 setgray 4 copy rectfill 0 setgray  3 index 3 index currentlinewidth 0.5 setlinewidth 7 3 roll rectstroke setlinewidth exch 1.5 add exch 1.5 add moveto show} def\n";
+
+psString 		= PSTreeString (givenTree, "STRING_SUPPLIED_LENGTHS",{{612,baseHeight}}) ^ {{"showpage"}{"0 "+(baseHeight-50-TREE_OUTPUT_OPTIONS["__FONT_SIZE__"])+" moveto (Free rates model) drawletter\nshowpage\n"}} ;
+psString2 		= PSTreeString (singleTree,"STRING_SUPPLIED_LENGTHS",{{612,baseHeight}}) ^ {{"showpage"}{"0 "+(baseHeight-50-TREE_OUTPUT_OPTIONS["__FONT_SIZE__"])+" moveto (Single model) drawletter\nshowpage\n"}};
+psString3 		= PSTreeString (bestTree,  "STRING_SUPPLIED_LENGTHS",{{612,baseHeight}}) ^ {{"showpage"}{"0 "+(baseHeight-50-TREE_OUTPUT_OPTIONS["__FONT_SIZE__"])+" moveto (Multiple rate model) drawletter\nshowpage\n"}};
+
+tName  = basePath + ".nwk";
+fName  = basePath + "_treeshapes.ps";
+fprintf (fName, CLEAR_FILE, drawLetter, psString, 
+							psString2, 
+							psString3);
+	
+fprintf (tName, CLEAR_FILE, Format(givenTree,0,1), "\n", Format(singleTree,0,1), "\n", Format(bestTree,0,1), "\n");
+
+
+
+fprintf 		(stdout, "[PHASE 1.] Read ", modelsRead, " models. Best AIC found: ", bestAIC, " using ", bestModelRC," rates.\n");
+sortedScores = 	({modelsRead,2}["_MATRIX_ELEMENT_COLUMN_ * _MATRIX_ELEMENT_ROW_ + (_MATRIX_ELEMENT_COLUMN_==0)*Exp(-0.5*(AIC[_MATRIX_ELEMENT_ROW_]-bestAIC))"])%0;
+
+cumulWeight  = 0;
+normConst	 = ({1,modelsRead}["1"]*sortedScores[-1][0])[0];
+
+byIterate    = {};
+
+
+for (upto95p = modelsRead-1; upto95p>=0 && cumulWeight <= 0.95; upto95p = upto95p - 1)
+{
+	cumulWeight  		  = cumulWeight + sortedScores[upto95p][0]/normConst;
+	byIterateC   		  = model2Iterate[sortedScores[upto95p][1]];
+	byIterate[byIterateC] = byIterate[byIterateC] + 1;
+}
+ciSize 			= modelsRead-upto95p-1;
+fprintf 		(stdout, "[PHASE 2.] ", ciSize , " models in the 95% confidence set (models from ", Abs(byIterate), " runs)\n");
+
+lName 	= basePath + "_byRun.csv";
+fprintf (lName,CLEAR_FILE,KEEP_OPEN,"Number,Path,ModelsInCS");
+for (k=0; k<Columns(_listOfResults); k=k+1)
+{
+	fprintf (lName, "\n", k+1, "," , _listOfResults[k], ",", byIterate[k]);
+}
+fprintf (lName,CLOSE_FILE);
+
+fprintf 		(stdout, "[PHASE 3.] Tabulating rate and date estimates\n");
+branchCount		= BranchCount (givenTree)+1;
+allCount		= BranchCount (givenTree) + TipCount (givenTree);
+
+dateEstimates   = {ciSize, branchCount};
+rateEstimates	= {ciSize, allCount};
+lengthEstimates = {ciSize, branchCount};
+dateInfo		= {branchCount,5};
+lengthInfo		= {branchCount,5};
+rootLengthInfo	= {};
+branchSpanInfo	= {};
+
+
+rateInfo		= {allCount,5};
+
+k4 = 0;
+normConst = normConst*cumulWeight;
+
+treeAVL = givenTree ^ 0;
+nodeNames		= {};
+allNames		= {};
+iNodes			= {};
+parentNames		= {};
+allNamesToI		= {};
+
+iNodeCounter	= 0;
+for (k3 = 1; k3 < Abs(treeAVL); k3=k3+1)
+{
+	if(Abs((treeAVL[k3])["Children"]))
+	{
+		nodeNames[Abs(nodeNames)] = (treeAVL[k3])["Name"];
+		iNodes[(treeAVL[k3])["Name"]] = 1;
+		allNamesToI [(treeAVL[k3])["Name"]] = iNodeCounter;
+		iNodeCounter				  = iNodeCounter+1;
+	}
+	if ((treeAVL[k3])["Parent"])
+	{
+		allNames[Abs(allNames)] = (treeAVL[k3])["Name"];
+		parentNames[Abs(parentNames)] = (treeAVL[(treeAVL[k3])["Parent"]])["Name"];
+	}
+	
+}
+
+
+for (k = modelsRead-1; k > upto95p; k = k - 1)
+{
+	thisModelID = sortedScores[k][1];
+	myAW		= (sortedScores[k][0])/normConst;
+	for (k3 = 0; k3 < branchCount; k3=k3+1)
+	{
+		dateEstimates [k4][k3] = (internalDates[thisModelID])[k3];
+		dateInfo	  [k3][0]  = dateInfo[k3][0] + dateEstimates [k4][k3]*myAW;
+	}
+	rootD		= (internalDates[thisModelID])[branchCount-1];
+	iNodeCounter= 0;
+	/*tipCounter  = 0;*/
+	for (k3 = 0; k3 < allCount; k3=k3+1)
+	{
+		rateEstimates [k4][k3] 			= (rateValues[thisModelID])[(rateAssignments[thisModelID])[k3]];
+		rateInfo 	  [k3][0]  			= rateInfo[k3][0] + rateEstimates [k4][k3]*myAW;
+		nodeName						= allNames[k3];
+		parentD		  = (internalDates[thisModelID])[allNamesToI[parentNames[k3]]];
+		/*if (iNodes[nodeName])
+		{
+			myD		     							= (internalDates[thisModelID])[iNodeCounter];
+			lengthEstimates[k4][iNodeCounter] 		= myD-parentD;
+			iNodeCounter 							= iNodeCounter+1;
+			lengthInfo [k3][0] 						= lengthInfo [k3][0] + myAW*(myD-parentD);
+		}
+		else
+		{
+			myD		   = tipDates[tipCounter];
+			tipCounter = tipCounter+1;
+		
+		}*/
+		rootLengthInfo[allNames[k3]]	= (rootLengthInfo[allNames[k3]]) + myAW*(myD-rootD);
+		branchSpanInfo[allNames[k3]]	= (branchSpanInfo[allNames[k3]]) + myAW*(myD-parentD);
+	}
+	k4 = k4 + 1;
+}
+
+/* generate date estimates */
+
+fprintf 		(stdout, "[PHASE 4.] Writing CSV files\n");
+
+labels = {{"Branch/Node","Model Averaged Mean", "2.5%", "Mean", "Median", "97.5%"}};
+
+for (k3 = 0; k3 < branchCount; k3=k3+1)
+{
+	myDS = GatherDescriptiveStats (dateEstimates[-1][k3]);
+	dateInfo[k3][1] = myDS["2.5%"];
+	dateInfo[k3][2] = myDS["Mean"];
+	dateInfo[k3][3] = myDS["Median"];
+	dateInfo[k3][4] = myDS["97.5%"];
+	myDS = GatherDescriptiveStats (lengthEstimates[-1][k3]);
+	lengthEstimates[k3][1] = myDS["2.5%"];
+	lengthEstimates[k3][2] = myDS["Mean"];
+	lengthEstimates[k3][3] = myDS["Median"];
+	lengthEstimates[k3][4] = myDS["97.5%"];
+}
+
+WriteSeparatedTable (basePath + "_dates.csv",labels,dateInfo,nodeNames,",");
+WriteSeparatedTable (basePath + "_spans.csv",labels,dateInfo,nodeNames,",");
+
+/* generate rate estimates */
+
+for (k3 = 0; k3 < allCount; k3=k3+1)
+{
+	myDS = GatherDescriptiveStats (rateEstimates[-1][k3]);
+	rateInfo[k3][1] = myDS["2.5%"];
+	rateInfo[k3][2] = myDS["Mean"];
+	rateInfo[k3][3] = myDS["Median"];
+	rateInfo[k3][4] = myDS["97.5%"];
+}
+
+WriteSeparatedTable (basePath + "_rates.csv",labels,rateInfo,allNames,",");
+
+fprintf (stdout, "[PHASE 5.] Making a PostScript tree with the model averaged rate estimates\n");
+
+
+md = 0;
+
+for (k3 = 1; k3 < Abs(treeAVL); k3=k3+1)
+{
+	md = Max (md, (treeAVL[k3])["Depth"]);
+}
+
+baseWidth 			= md * 100;
+
+/*
+bestModelDates		= internalDates[sortedScores[modelsRead-1][1]];
+bestModelRates		= rateAssignments[sortedScores[modelsRead-1][1]];
+bestModelRatesV		= rateValues[sortedScores[modelsRead-1][1]];
+*/
+
+bestModelDates		= dateInfo[-1][0];
+bestModelRates		= rateAssignments[sortedScores[modelsRead-1][1]];
+bestModelRatesV		= rateInfo[-1][0];
+
+minR				= 1e100;
+maxR				= 0;
+
+iNodeCounter		= 0;
+
+for (k=0; k<Columns(branchNames); k=k+1)
+{
+	nodeSpec  = {};
+	nodeName  = branchNames [k];
+
+	if (iNodes[nodeName])
+	{
+		nodeSpec ["TREE_OUTPUT_BRANCH_LABEL"] = "(" + Format(bestModelDates[iNodeCounter],6,3) + ") drawletter";
+		iNodeCounter = iNodeCounter + 1;
+	}
+	if (k < allCount)
+	{
+		minR = Min(minR,bestModelRatesV[k]);
+		maxR = Max(maxR,bestModelRatesV[k]);
+	}
+	TREE_OUTPUT_OPTIONS[nodeName] = nodeSpec;
+}
+
+colorByNode	= {};
+
+for (k=0; k<allCount; k=k+1)
+{
+	myRV	  = bestModelRatesV[k];
+	nodeName  = branchNames [k];
+	myColor	  = {{(myRV-minR)/(maxR-minR)} /* 1 for maxR, 0 for minR; linear between */
+				 {0}
+				 {(maxR-myRV)/(maxR-minR)} /* 1 for minR, 0 for maxR; linear between */
+				};
+				
+	colorByNode [nodeName] = myColor;
+	(TREE_OUTPUT_OPTIONS[nodeName])["TREE_OUTPUT_BRANCH_COLOR"] = myColor;
+	(TREE_OUTPUT_OPTIONS[nodeName])["TREE_OUTPUT_OVER_BRANCH"] = "0 0 0 setrgbcolor\n5 5 rmoveto\n("+Format(myRV/maxR*100,5,2)+"\\%) show";
+	
+}
+
+psString 			= PSTreeString (givenTree,"",{{baseWidth,baseHeight}});
+
+
+psLegend = "";
+psLegend * 256;
+
+sortedKeys = {{minR,(minR+maxR)/2,maxR}};
+
+currentPosY = baseHeight + 10;
+currentPosX = 25;
+
+for (k=2; k>=0; k=k-1)
+{
+	aKey 		= sortedKeys[k];
+	colorMx 	= branchColors[k];
+	psLegend * (""+colorMx[0]+" "+colorMx[1]+" "+colorMx[2]+ " setrgbcolor\n"+currentPosX+" "+currentPosY+" moveto\n");
+	psLegend * ("("+Format(aKey,10,5)+" subs/site/"+units+") show\n");
+	currentPosY = currentPosY + 20;
+}
+
+newHeight = baseHeight + (bestModelRC+1)*20;
+
+psLegend * "showpage";
+psLegend * 0;
+repMx = {{"showpage"}{psLegend}};
+psString = psString ^ repMx;
+repMx = {{"/PageSize\\ \\[[0-9\\ ]+\\]"}{"/PageSize ["+baseWidth+" "+ newHeight+ "]"}};
+psString = psString ^ repMx;
+repMx = {{"setfont"}{"setfont\n3 setlinewidth\n1 setlinecap"}};
+psString = psString ^ repMx;
+
+
+fName = basePath + "_ratesDates.ps";
+fprintf (fName, CLEAR_FILE,drawLetter,psString);
+							
+							
+fprintf (stdout, "[PHASE 6.] Making a model averaged PostScript tree with dated tips and internal nodes (relative to the root)\n");
+
+distanceAVL			= {};
+rootD				= bestModelDates[Rows(bestModelDates)-1];
+
+k2 = 0;
+k  = 0;
+md = 0;
+
+for (k3 = 1; k3 < Abs(treeAVL); k3=k3+1)
+{
+	nodeName = (treeAVL[k3])["Name"];
+	if(Abs((treeAVL[k3])["Children"]))
+	{
+		(TREE_OUTPUT_OPTIONS[nodeName])["TREE_OUTPUT_BRANCH_LABEL"] = "(" + nodeName + ") drawletter" ;
+	}
+	else
+	{
+		(TREE_OUTPUT_OPTIONS[nodeName]) - "TREE_OUTPUT_BRANCH_LABEL";
+	}
+	distanceAVL [nodeName] = branchSpanInfo[nodeName];
+	(TREE_OUTPUT_OPTIONS[nodeName]) ["TREE_OUTPUT_OVER_BRANCH"] = "0 0 0 setrgbcolor\n5 5 rmoveto\n("+
+																	Format(distanceAVL [nodeName],4,1)+") show";	
+	md = Max (md, (treeAVL[k3])["Depth"]);
+}
+
+
+ts = PostOrderAVL2StringDistances (treeAVL, distanceAVL);
+Tree T = ts;
+
+fprintf (tName, Format(T,0,1),"\n");
+
+psString 		= PSTreeString (T,"STRING_SUPPLIED_LENGTHS",{{baseWidth,baseHeight}});
+repMx = {{"showpage"}{psLegend}};
+psString = psString ^ repMx;
+repMx = {{"/PageSize\\ \\[[0-9\\ ]+\\]"}{"/PageSize [ "+baseWidth+" "+ newHeight+ "]"}};
+psString = psString ^ repMx;
+repMx = {{"setfont"}{"setfont\n3 setlinewidth\n1 setlinecap"}};
+psString = psString ^ repMx;
+fName = basePath + "_scaled.ps";
+fprintf (fName, CLEAR_FILE,drawLetter,psString);
+
+		
diff --git a/res/TemplateBatchFiles/GARD.bf b/res/TemplateBatchFiles/GARD.bf
new file mode 100644
index 0000000..8bdd67f
--- /dev/null
+++ b/res/TemplateBatchFiles/GARD.bf
@@ -0,0 +1,1385 @@
+RequireVersion("0.9920061128");
+
+if (MPI_NODE_COUNT <= 1)
+{
+	fprintf (stdout, "[ERROR] This analysis requires an MPI environment to run\n");
+	return 0;
+}
+
+RequireVersion			(".9920060901");
+partCount				= 2;
+
+produceOffspring		= MPI_NODE_COUNT-1;
+populationSize  		= 2*produceOffspring;
+incestDistance  		= 0;
+generationCount		  	= 5000;
+maxSampleTries			= populationSize*10;
+mutationThreshhold		= 0.0001;
+mutationProb			= 0.15;
+mutationProbDecrease	= 0.95;
+annealingPhase			= 100;
+SHORT_MPI_RETURN		= 1;
+totalSampleCounter		= 0;
+localMutationRate		= 0.05;
+localMutationInterval	= 20;
+shortestAllowedSegment  = 0;
+
+stoppingCriterion		= 50;
+sampleCount				= 0;
+familyControlSize		= produceOffspring$6;
+
+verboseFlag				= 0;
+rateClassesCount		= 2;
+MESSAGE_LOGGING			= 0;
+cAICPenaltyPerSite		= 100;
+adjustAICScores			= 1;
+maxTimeAllowed			= 3600*1000;
+startAtBreakpoint		= 1;
+
+/* ________________________________________________________________________________________________*/
+
+global AC 				= 1;
+global AT 				= 1;
+global CG 				= 1;
+global CT 				= 1;
+global GT 				= 1;
+
+
+
+/* ________________________________________________________________________________________________*/
+
+MasterList						= {};
+REPLACE_TREE_STRUCTURE  		= 1;
+bppMap							= {};
+SHORT_MPI_RETURN				= 1;
+totalBitSize					= 0;
+LIKELIHOOD_FUNCTION_OUTPUT 		= 0;
+FILE_SEPARATOR			   		= "__FILE_SEPARATOR__";
+
+ExecuteAFile (HYPHY_LIB_DIRECTORY+"TemplateBatchFiles"+DIRECTORY_SEPARATOR+"Utility"+DIRECTORY_SEPARATOR+"NJ.bf");
+
+
+/* ________________________________________________________________________________________________*/
+
+function ComputeDistanceFormula (s1,s2)
+{
+	GetDataInfo (siteDifferenceCount, filteredData, s1, s2, DIST);
+	
+	totalSitesCompared = Transpose(summingVector)*(siteDifferenceCount*summingVector);
+	totalSitesCompared = totalSitesCompared[0];
+	
+	if (_useK2P)
+	{
+		_dTransitionCounts 	 =    siteDifferenceCount[0][2]+siteDifferenceCount[2][0]  /* A-G and G-A */
+								 +siteDifferenceCount[1][3]+siteDifferenceCount[3][1]; /* C-T and T-C */
+							
+		_dTransversionCounts = (siteDifferenceCount[0][0]+siteDifferenceCount[1][1]+siteDifferenceCount[2][2]+siteDifferenceCount[3][3])+_dTransitionCounts;
+		
+		_dTransitionCounts	 = _dTransitionCounts/totalSitesCompared;
+		_dTransversionCounts = 1-_dTransversionCounts/totalSitesCompared;
+		
+		_d1C = 1-2*_dTransitionCounts-_dTransversionCounts;
+		_d2C = 1-2*_dTransversionCounts;
+		
+		if (_d1C>0 && _d2C>0)
+		{
+			return -(0.5*Log(_d1C)+.25*Log(_d2C));	
+		}
+	}
+	else
+	{
+		_dAGCounts 	 =    siteDifferenceCount[0][2]+siteDifferenceCount[2][0]  /* A-G and G-A */;
+		_dCTCounts	 = 	  siteDifferenceCount[1][3]+siteDifferenceCount[3][1]; /* C-T and T-C */
+							
+		_dTransversionCounts = (siteDifferenceCount[0][0]+siteDifferenceCount[1][1]+siteDifferenceCount[2][2]+
+								siteDifferenceCount[3][3])+_dAGCounts+_dCTCounts;
+		
+		_dAGCounts	 = _dAGCounts/totalSitesCompared;
+		_dCTCounts	 = _dCTCounts/totalSitesCompared;
+		
+		_dTransversionCounts = 1-_dTransversionCounts/totalSitesCompared;
+		
+		_d1C = 1-_dAGCounts/_d_TN_K1-0.5*_dTransversionCounts/_d_fR;
+		_d2C = 1-_dCTCounts/_d_TN_K2-0.5*_dTransversionCounts/_d_fY;
+		_d3C = 1-0.5*_dTransversionCounts/_d_fY/_d_fR;
+		
+		if ((_d1C>0)&&(_d2C>0)&&(_d3C>0))
+		{
+			return -_d_TN_K1*Log(_d1C)-_d_TN_K2*Log(_d2C)-_d_TN_K3*Log(_d3C);
+		}
+	}
+	
+	return 1000;
+}
+
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function StringToMatrix (zz)
+{
+	return zz;
+}
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function ExportAMatrix (fileName, rateMatrix,dummy)
+{
+	if (Abs(rateMatrix))
+	{
+		sortedBP 	= ConvertToPart (rateMatrix);
+	}
+	else
+	{
+		v = 0;
+	}
+	theAVL	= {};
+	
+	theAVL ["BP"]    = {};
+	theAVL ["Trees"] = {};
+	
+	if (dataType)
+	{
+		bpF  = 0;
+		bpF2 = 0;
+	}	
+	else
+	{
+		bpF 	= -1;
+		bpF2	= -1;
+	}
+	
+	USE_DISTANCES = 0;
+
+	lfDef = "";
+	lfDef * 128;
+	lfDef  * "LikelihoodFunction multiPart  = (";
+
+
+	partSpecs = {};
+	
+	for (h=0; h<v; h=h+1)
+	{
+		bpF2 = sortedBP[h];
+		bpF2 = bppMap[bpF2];
+		if (dataType)
+		{
+			filterString = ""+(3*bpF)+"-"+(3*bpF2-1);
+		}
+		else
+		{
+			filterString = ""+(bpF+1)+"-"+bpF2;		
+			(theAVL ["BP"])[h]   = ""+(bpF+2)+"-"+(bpF2+1);
+
+		}
+		DataSetFilter filteredData = CreateFilter(ds,1,filterString);
+		InferTreeTopology (0);
+		treeString=TreeMatrix2TreeString(0);
+
+		ExecuteCommands ("DataSetFilter part_" + h + " = CreateFilter (ds, 1, \"" + filterString + "\");");
+		ExecuteCommands ("Tree tree_" 		   + h + " = " + treeString + ";");
+				
+		if (h)
+		{
+			lfDef * ",";
+		}
+		lfDef  * ("part_"+h+",tree_"+h);
+		partSpecs [h] = filterString;
+		bpF = bpF2;
+	}
+	
+	if ((bpF2<ds.sites && (dataType == 0)) || (3*bpF2<ds.sites && dataType))
+	{
+		if (dataType)
+		{
+			filterString = ""+(3*bpF2)+"-"+(ds.sites-1);
+		}
+		else
+		{
+			filterString = ""+(bpF2+1)+"-"+(ds.sites-1);
+			(theAVL ["BP"])[h]   = ""+(bpF+2)+"-"+ds.sites;
+		}
+		DataSetFilter filteredData = CreateFilter(ds,1,filterString);
+		partSpecs [h] = filterString;
+		InferTreeTopology 		  (0);
+		treeString				   = TreeMatrix2TreeString(0);
+		ExecuteCommands 			("DataSetFilter part_" + h + " = CreateFilter (ds, 1, \"" + filterString + "\");");
+		ExecuteCommands 			("Tree tree_" + h + " = " + treeString + ";");
+		if (h)
+		{
+			lfDef * ",";
+		}
+		lfDef  * ("part_"+h+",tree_"+h);
+	}
+
+	lfDef  * ");";
+	lfDef  * 0;
+	ExecuteCommands (lfDef);
+	Optimize (res, multiPart);
+
+	ConstraintString = "";
+	ConstraintString * 8192;
+	ConstraintString * "\n";
+	
+	for (h=0; h<Abs (partSpecs); h=h+1)
+	{
+		ConstraintString * ("\n" + partSpecs [h] + "\n");
+		ExecuteCommands    ("filterString = Format (tree_" + h + ",0,1);");
+		ConstraintString * filterString;
+		(theAVL ["Trees"]) [h]    = filterString;
+	}
+
+	ConstraintString * 0;
+	fprintf (fileName,ConstraintString);
+
+	return theAVL;
+}
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function CleanUpMPI (dummy)
+{
+	if (MPI_NODE_COUNT>1)
+	{
+		while (1)
+		{
+			for (nodeCounter = 0; nodeCounter < MPI_NODE_COUNT-1; nodeCounter = nodeCounter+1)
+			{
+				if (MPINodeState[nodeCounter][0]==1)
+				{
+					fromNode = ReceiveJobs (0,0);
+					break;	
+				}
+			}
+			if (nodeCounter == MPI_NODE_COUNT-1)
+			{
+				break;
+			}
+		}			
+	}
+	return 0;
+}
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function adjustAICScore (theLL,bpMatrix)
+{
+	daAICScore = 2*(baseParams*(baseSites/(baseSites-baseParams-1)) - theLL) ;
+	lastBpos   = 0;
+	
+	for (_pid = 0; _pid < Rows(bpMatrix); _pid = _pid+1)
+	{
+		thisSpan = bppMap[bpMatrix[_pid]] - lastBpos+1;
+		lastBpos = bppMap[bpMatrix[_pid]];
+		if (thisSpan > perPartParameterCount + 1)
+		{
+			daAICScore = daAICScore + 2*(perPartParameterCount*(thisSpan/(thisSpan-perPartParameterCount-1)));
+		}
+		else
+		{
+			daAICScore = daAICScore + 2*perPartParameterCount*cAICPenaltyPerSite;
+		}
+	}
+	
+	thisSpan = baseSites-lastBpos;
+	if (thisSpan > perPartParameterCount + 1)
+	{
+		daAICScore = daAICScore + 2*(perPartParameterCount*(thisSpan/(thisSpan-perPartParameterCount-1)));
+	}
+	else
+	{
+		daAICScore = daAICScore + 2*perPartParameterCount*cAICPenaltyPerSite;
+	}
+	
+	return -daAICScore;
+}
+
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function ReceiveJobs (sendOrNot, ji)
+{
+	if (MPI_NODE_COUNT>1)
+	{
+		MPIReceive (-1, fromNode, result_String);
+		mji = MPINodeState[fromNode-1][1];
+		
+		if (sendOrNot)
+		{
+			MPISend 	(fromNode,mpiStringToSend);
+			MPINodeState[fromNode-1][1] = ji;			
+		}
+		else
+		{
+			MPINodeState[fromNode-1][0] = 0;
+			MPINodeState[fromNode-1][1] = -1;		
+		}
+		ExecuteCommands (result_String);
+		myDF  = lf_MLES[1][1]+baseParams;
+		myAIC = 2*(lf_MLES[1][0]-myDF*(baseSites/(baseSites-myDF-1)));
+		myLL  = lf_MLES[1][0];
+		ji 	  = mji;
+	}
+	else
+	{
+		myDF  = res[1][1]+baseParams;
+		myAIC = 2*(res[1][0]-myDF*(baseSites/(baseSites-myDF-1)));
+	}
+	
+	sortedBP = {{-1}};
+	
+	if (resultProcessingContext==0)
+	{
+		sortedScores[ji][0] = myAIC;
+		if (ji>=0)
+		{
+			jobPrint = ConvertToPartString (currentPopulation[ji]);
+			sortedBP = ConvertToPart 	   (currentPopulation[ji]);
+			if (adjustAICScores)
+			{
+				myAIC	 = adjustAICScore (myLL, sortedBP);
+			}
+			v 		 = Rows (sortedBP);
+			sortedScores[ji][0] = myAIC;
+		}
+		if (verboseFlag)
+		{
+			fprintf (stdout, "Individual ",ji," AIC-c = ",-myAIC," ");
+		}
+	}
+	else
+	{
+		intermediateProbs[ji][0] = myAIC;	
+		if (ji>=0)
+		{
+			jobPrint = ConvertToPartString (children[ji-populationSize]);
+			sortedBP = ConvertToPart 	   (children[ji-populationSize]);
+			if (adjustAICScores)
+			{
+				myAIC	 = adjustAICScore (myLL, sortedBP);
+			}
+			v = Rows (sortedBP);
+			intermediateProbs[ji][0] = myAIC;	
+		}
+		if (verboseFlag)
+		{
+			fprintf (stdout, "Offspring ",ji," AIC-c = ",-myAIC," ");
+		}
+	}
+	
+	if (sortedBP[0]>=0)
+	{
+		if (dataType)
+		{
+			bpF = 0;
+		}
+		else
+		{
+			bpF = -1;
+		}
+		filterString = "";
+		for (h=0; h<v; h=h+1)
+		{
+			bpF2 = sortedBP[h];
+			bpF2 = bppMap[bpF2];
+			if (dataType)
+			{
+				filterString = filterString+" "+(3*bpF)+"-"+(3*bpF2-1);
+			}
+			else
+			{
+				filterString = filterString+" "+(bpF+1)+"-"+bpF2;			
+			}
+			bpF = bpF2;
+		}
+		
+		if ((bpF2<ds.sites && (dataType == 0)) || (bpF2<3*ds.sites && dataType))
+		{
+			if (dataType)
+			{
+				filterString = filterString+" "+(3*bpF2)+"-"+(ds.sites-1);
+			}
+			else
+			{
+				filterString = filterString+" "+(bpF2+1)+"-"+(ds.sites-1);			
+			}
+		}
+
+		if (verboseFlag)
+		{
+			fprintf (stdout, " ", filterString, "\n");
+		}
+
+		MasterList [jobPrint] = myAIC;
+	}
+	return fromNode-1;
+}
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+compressedString = {{1,1}};
+
+function MakeStringCanonical (someString, dummy)
+{
+	return someString;
+}
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function ConvertToPartString (pString)
+{
+	sortedBP = ConvertToPart (pString);
+	if (dataType)
+	{
+		bpF = 0;	
+	}
+	else
+	{
+		bpF = -1;
+	}
+	
+	minPartLength 	  = 1e100;
+	
+	_ConstraintString = "";
+	_ConstraintString * 256;
+	
+
+	for (h=0; h<v; h=h+1)
+	{
+		bpF2 = bppMap[sortedBP[h]];
+	
+		if (h)
+		{
+			_ConstraintString * ",";
+		}
+		if (dataType)
+		{
+			_ConstraintString * (""+(3*bpF)+"-"+(3*bpF2-1));		
+			curSegLength = 3*(bpF2-bpF);
+		}		
+		else
+		{
+			_ConstraintString * (""+(bpF+1)+"-"+bpF2);		
+			curSegLength = bpF2-bpF;
+		}
+		bpF = bpF2;
+		
+		if (curSegLength < minPartLength && curSegLength>0)
+		{
+			minPartLength = curSegLength;
+		}
+	}
+	
+	if (bpF2<ds.sites && dataType == 0 || bpF2<3*ds.sites && dataType)
+	{
+		if (dataType)
+		{
+			_ConstraintString * (","+(3*bpF2)+"-"+(ds.sites-1));
+			curSegLength = ds.sites-3*bpF2;
+		}
+		else
+		{
+			_ConstraintString * (","+(bpF2+1)+"-"+(ds.sites-1));		
+			curSegLength = ds.sites-bpF2;
+		}
+		if (curSegLength < minPartLength && curSegLength>0)
+		{
+			minPartLength = curSegLength;
+		}
+	}
+
+	_ConstraintString * 0;
+	return _ConstraintString;
+}
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function ConvertToPart (pString)
+{
+	partitionHits    = 		{};
+	h 				 = 		0; 
+	v 				 = 		bppSize;
+	
+	for (mpiNode=0; mpiNode<partCount; mpiNode=mpiNode+1)
+	{
+		aBP    = 0;
+		bpF	   = 2^(bppSize-1);
+		
+		for (; h<v; h=h+1)
+		{
+			aBP = aBP + bpF*(0+pString[h]);
+			bpF = bpF/2;
+		}
+		
+		if (aBP>=Abs(bppMap)-1)
+		{
+			aBP = aBP - 2^(bppSize-1);
+		}
+		
+		v = v + bppSize;
+		partitionHits[aBP] = 1;
+	}
+
+	meKeys	 = Rows(partitionHits);
+	v 		 = Columns(meKeys);
+	sortedBP = {v,1};
+	
+	for (h=0; h<v; h=h+1)
+	{
+		sortedBP [h] = 0+meKeys[h];
+	}
+	
+	sortedBP = sortedBP % 0;
+	return 	   sortedBP;
+}
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function RunASample (dummy,jobIndex)
+{	
+	myAIC	 = MasterList[ConvertToPartString (cString)];
+
+	if (myAIC<0)
+	{		
+		if (resultProcessingContext==0)
+		{
+			sortedScores[jobIndex][0] = myAIC;
+			if (verboseFlag)
+			{
+				fprintf (stdout, "Individual ",jobIndex," AIC-c = ",-myAIC, "\n");
+			}
+		}
+		else
+		{
+			intermediateProbs[jobIndex][0] = myAIC;	
+			if (verboseFlag)
+			{
+				fprintf (stdout, "Offspring ",jobIndex," AIC-c = ",-myAIC,"\n");
+			}
+		}	
+		return 0;
+	}
+
+	if (dataType)
+	{
+		bpF = 0;	
+	}
+	else
+	{
+		bpF = -1;
+	}
+	
+	mpiStringToSend 			 = "";
+	mpiStringToSend				* 8192;
+	
+	ConstraintString			 = "";
+	LikelihoodFunctionString 	 = "";
+	ConstraintString 			* 8192;
+	LikelihoodFunctionString 	* 256;
+	LikelihoodFunctionString	* "LikelihoodFunction lf=(";
+	
+
+	for (h=0; h<v; h=h+1)
+	{
+		bpF2 = bppMap[sortedBP[h]];
+		if (dataType)
+		{
+			filterString = ""+(3*bpF)+"-"+(3*bpF2-1);
+		}
+		else
+		{
+			filterString = ""+(bpF+1)+"-"+bpF2;		
+		}
+		ConstraintString * ("DataSetFilter filteredData = CreateFilter(ds,1,\""+filterString+"\");");
+		if (dataType)
+		{
+			ConstraintString * ("DataSetFilter filteredData"+h+" = CreateFilter (ds,3,\""+filterString+"\",\"\",GeneticCodeExclusions);");		
+		}
+		else
+		{
+			ConstraintString * ("DataSetFilter filteredData"+h+" = CreateFilter (ds,1,\""+filterString+"\");");
+		}
+		ConstraintString * ("InferTreeTopology (0);treeString=TreeMatrix2TreeString(0);Tree givenTree"+h+" = treeString;");
+		if (h)
+		{
+			LikelihoodFunctionString * ",";
+		}
+		LikelihoodFunctionString * ("filteredData" + h + ",givenTree"+h);
+		bpF = bpF2;
+	}
+	
+	if ((bpF2<ds.sites && (dataType == 0)) || (bpF2<3*ds.sites && dataType))
+	{
+		if (dataType)
+		{
+			filterString = ""+(3*bpF2)+"-"+(ds.sites-1);
+		}
+		else
+		{
+			filterString = ""+(bpF2+1)+"-"+(ds.sites-1);		
+		}
+
+		ConstraintString * ("DataSetFilter filteredData = CreateFilter(ds,1,\""+filterString+"\");");
+		if (dataType)
+		{
+			ConstraintString * ("DataSetFilter filteredData"+h+" = CreateFilter (ds,3,\""+filterString+"\",\"\",GeneticCodeExclusions);");		
+		}
+		else
+		{
+			ConstraintString * ("DataSetFilter filteredData"+h+" = CreateFilter (ds,1,\""+filterString+"\");");
+		}
+		ConstraintString * ("InferTreeTopology (0);treeString=TreeMatrix2TreeString(0);Tree givenTree"+h+" = treeString;");
+
+		LikelihoodFunctionString * (",filteredData" + h + ",givenTree"+h);
+	}
+
+
+	LikelihoodFunctionString * (");");
+	ConstraintString 		 * 0;
+	LikelihoodFunctionString * 0;	
+	
+	mpiStringToSend * _mpiPrefixString;
+	mpiStringToSend * ConstraintString;
+	mpiStringToSend * LikelihoodFunctionString;
+	
+	
+	if ((MPI_NODE_COUNT>1) && (jobIndex>=0))
+	{
+		mpiStringToSend * ("Optimize(res,lf);return \"lf_MLES=\"+res+\";\";");
+		mpiStringToSend * 0;
+		for (mpiNode = 0; mpiNode < MPI_NODE_COUNT-1; mpiNode = mpiNode+1)
+		{
+			if (MPINodeState[mpiNode][0]==0)
+			{
+				break;	
+			}
+		}
+		if (mpiNode==MPI_NODE_COUNT-1)
+		{
+			mpiNode = ReceiveJobs (1,jobIndex);
+		}
+		else
+		{
+			MPISend (mpiNode+1,mpiStringToSend);
+			MPINodeState[mpiNode][0] = 1;
+			MPINodeState[mpiNode][1] = jobIndex;
+		}
+	}
+	else
+	{
+		mpiStringToSend * 0;
+		ExecuteCommands (mpiStringToSend);
+		Optimize (res,lf);
+		if (jobIndex>=0)
+		{
+			mpiNode = ReceiveJobs (1, jobIndex);
+		}
+		else
+		{
+			myAIC = 2*(res[1][0]-res[1][1]-baseParams);
+		}
+	}
+	return 0;	
+}
+
+
+
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function SpawnRandomString (clsCnt)
+{
+	rModel = {totalBitSize,1};
+	for (h=0; h<totalBitSize; h=h+1)
+	{
+		rModel[h] = Random(0,2)$1;
+	}
+	return rModel;
+}
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function IsChildViable (putativeChild)
+{
+	sampleString = 	ConvertToPartString (putativeChild);
+	myAIC		 = MasterList[sampleString];
+	testChild 	 = putativeChild;
+	mutPassCount = 1;
+	
+	for (_lc = 0; _lc < populationSize && myAIC > (-0.1); _lc = _lc + 1)
+	{
+		if (Rows (currentPopulation[_lc]))
+		{
+			myAIC = -(sampleString == ConvertToPartString (currentPopulation[_lc]));
+		}
+	} 
+	for (_lc = 0; _lc < Abs(children) && myAIC > (-0.1); _lc = _lc + 1)
+	{
+		if (Rows (children[_lc]))
+		{
+			myAIC = -(sampleString == ConvertToPartString (children[_lc]));
+		}
+	} 
+	
+	while ((myAIC<(-0.1) || minPartLength<shortestAllowedSegment)&& mutPassCount < 25)
+	{
+		if (verboseFlag > 1)
+		{
+			fprintf (stdout,"Adjusting the child to avoid a duplicate. Min(fragment) = ",minPartLength,".  Pass ", mutPassCount, "\n");
+		}
+		
+		mutPassCount 	= mutPassCount + 1;
+		sampleString 	= Min(Random(0,stateVectorDimension)$1,stateVectorDimension-1);
+		myAIC 			= testChild[sampleString];
+		newValue 		= Random (0,rateClassesCount-0.0000001)$1;
+		
+		while (newValue == myAIC)
+		{
+			newValue 	= Random (0,rateClassesCount-0.0000001)$1;
+		}
+		
+		testChild [sampleString]	 = newValue;
+		sampleString 				 = ConvertToPartString (testChild);
+		myAIC 						 = MasterList		   [sampleString];
+		for (_lc = 0; _lc < populationSize && myAIC > (-0.1); _lc = _lc + 1)
+		{
+			if (Rows (currentPopulation[_lc]))
+			{
+				myAIC = -(sampleString == ConvertToPartString (currentPopulation[_lc]));
+			}
+		} 
+		for (_lc = 0; _lc < Abs(children) && myAIC > (-0.1); _lc = _lc + 1)
+		{
+			if (Rows (children[_lc]))
+			{
+				myAIC = -(sampleString == ConvertToPartString (children[_lc]));
+			}
+		} 
+	}
+	return testChild;
+}
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function UpdateBL (dummy)
+{
+	return 0;
+}
+
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+
+dataType = 0;
+
+fprintf	    (stdout, "Initialized GARD on ", MPI_NODE_COUNT, " MPI nodes.\nPopulation size is ", populationSize, " models\n");
+SetDialogPrompt 	("Nucleotide file to screen:");
+DataSet 	ds    = ReadDataFile (PROMPT_FOR_FILE);
+
+baseFilePath 	  = LAST_FILE_PATH;
+
+done = 0;
+
+while (!done)
+{
+	fprintf (stdout,"\nPlease enter a 6 character model designation (e.g:010010 defines HKY85):");
+	fscanf  (stdin,"String", modelDesc);
+	if (Abs(modelDesc)==6)
+	{	
+		done = 1;
+	}
+}
+
+ChoiceList (rvChoice, "Rate variation options", 1, SKIP_NONE,
+					  "None", 					"Homogeneous rates across sites (fastest)",
+					  "General Discrete", 		"General discrete distribution on N-bins",
+					  "Beta-Gamma", 			"Adaptively discretized gamma N-bins. Try is GDD doesn't converge well, or if you suspect a lot of rate classes and do not want to overparameterize the model");
+					  
+if (rvChoice<0)
+{
+	return 0;
+}
+
+if (rvChoice)
+{
+	rateClasses = 0;
+	while (rateClasses < 2 || rateClasses > 32)
+	{
+		fprintf (stdout, "How many distribution bins [2-32]?:");
+		fscanf  (stdin,  "Number", rateClasses);
+		rateClasses = rateClasses $ 1;
+	}
+	fprintf (stdout, "\nUsing ", rateClasses, " distribution bins\n");
+}
+
+DEFAULT_FILE_SAVE_NAME 	 	= baseFilePath + ".html";
+
+SetDialogPrompt			   ("Save results to:");
+fprintf 				   (PROMPT_FOR_FILE, CLEAR_FILE, KEEP_OPEN);
+outputFilePath 	  		  = LAST_FILE_PATH;
+
+
+
+DataSetFilter filteredData  = CreateFilter (ds,1);
+
+InferTreeTopology (0);
+treeString = TreeMatrix2TreeString(0);
+
+/* find "informative sites" */
+
+if (dataType==0)
+{
+	for (h=0; h<filteredData.sites; h=h+1)
+	{
+		filterString = Format(h,20,0);
+		DataSetFilter siteFilter = CreateFilter (filteredData,1,filterString);
+
+		HarvestFrequencies (f1, siteFilter, 1, 1, 0);
+		m1 = 0;
+		for (mpiNode=0; (mpiNode < 4) && (m1<=1) ; mpiNode=mpiNode+1)
+		{
+			if (f1[mpiNode]>0)
+			{
+				m1=m1+1;
+			}
+		}	
+		if (m1>1)
+		{
+			bppMap[Abs(bppMap)] = h;
+		}
+	}
+}
+
+
+bppSize = (Log(Abs(bppMap))/Log(2)+1)$1;
+fprintf (stdout, "There are ",Abs(bppMap)," potential breakpoints. Bit size of the sample is ", bppSize,".\n");
+
+
+partCount = 2;
+h = Abs(bppMap);
+
+if (h <= partCount)
+{
+	fprintf (outputFilePath,   "ERROR: There are too few potential break points to support ", partCount-1, " recombination events.\n");
+	return 0;
+}
+
+
+maxBPP 	   = h-1;
+ModelTitle = ""+modelDesc[0];
+			
+rateBiasTerms = {{"AC","1","AT","CG","CT","GT"}};
+paramCount	  = 0;
+
+modelConstraintString = "";
+
+for (customLoopCounter2=1; customLoopCounter2<6; customLoopCounter2=customLoopCounter2+1)
+{
+	for (customLoopCounter=0; customLoopCounter<customLoopCounter2; customLoopCounter=customLoopCounter+1)
+	{
+		if (modelDesc[customLoopCounter2]==modelDesc[customLoopCounter])
+		{
+			ModelTitle  = ModelTitle+modelDesc[customLoopCounter2];	
+			if (rateBiasTerms[customLoopCounter2] == "1")
+			{
+				modelConstraintString = modelConstraintString + rateBiasTerms[customLoopCounter]+":="+rateBiasTerms[customLoopCounter2]+";";
+			}
+			else
+			{
+				modelConstraintString = modelConstraintString + rateBiasTerms[customLoopCounter2]+":="+rateBiasTerms[customLoopCounter]+";";			
+			}
+			break;
+		}
+	}
+	if (customLoopCounter==customLoopCounter2)
+	{
+		ModelTitle = ModelTitle+modelDesc[customLoopCounter2];	
+	}
+}	
+
+if (Abs(modelConstraintString))
+{
+	ExecuteCommands (modelConstraintString);
+}
+
+
+if (rvChoice)
+{
+	rateClasses = rateClasses $ 1;
+	if (rateClasses < 2)
+	{
+		rateClasses = 2;
+	}
+	else
+	{
+		if (rateClasses > 8)
+		{
+			rateClasses = 8;
+		}
+	}	
+	
+	if (ds.species < 5)
+	{
+		rateClasses = Min (3,rateClasses);
+	}
+	else
+	{
+		if (ds.species < 10)
+		{
+			rateClasses = Min (4,rateClasses);	
+		}
+		else
+		{
+			if (ds.species < 30)
+			{
+				rateClasses = Min (5,rateClasses);	
+			}
+		}
+	}
+	
+	if (rvChoice == 1)
+	{
+		gdDefString = "";
+		gdDefString * 1024;
+		for (mi=1; mi<rateClasses; mi=mi+1)
+		{
+			gdDefString*("global PS_"+mi+" = 1/"+((rateClasses+1)-mi)+";\nPS_"+mi+":<1;\n");
+		}
+		
+		gdDefString*("\n\nglobal RS_1 = .3;\nRS_1:<1;RS_1:>0.000000001;\n");
+
+		for (mi=3; mi<=rateClasses; mi=mi+1)
+		{
+			gdDefString*("global RS_"+mi+" = 1.5;"+"\nRS_"+mi+":>1;RS_"+mi+":<100000;\n");
+		} 
+
+		rateStrMx    = {rateClasses,1};
+		rateStrMx[0] = "RS_1";
+		rateStrMx[1] = "1";
+
+		for (mi=3; mi<=rateClasses; mi=mi+1)
+		{
+			rateStrMx[mi-1] = rateStrMx[mi-2]+"*RS_"+mi;
+		} 	
+
+		freqStrMx    = {rateClasses,1};
+		freqStrMx[0] = "PS_1";
+
+		for (mi=1; mi<rateClasses-1; mi=mi+1)
+		{
+			freqStrMx[mi] = "";
+			for (mi2=1;mi2<=mi;mi2=mi2+1)
+			{
+				freqStrMx[mi] = freqStrMx[mi]+"(1-PS_"+mi2+")";		
+			}
+			freqStrMx[mi] = freqStrMx[mi]+"PS_"+(mi+1);	
+		}	
+
+		freqStrMx[mi] = "";
+		for (mi2=1;mi2<mi;mi2=mi2+1)
+		{
+			freqStrMx[mi] = freqStrMx[mi]+"(1-PS_"+mi2+")";		
+		}
+		freqStrMx[mi] = freqStrMx[mi]+"(1-PS_"+mi+")";	
+
+
+		gdDefString*("\n\nglobal c_scale:="+rateStrMx[0]+"*"+freqStrMx[0]);
+
+		for (mi=1; mi<rateClasses; mi=mi+1)
+		{
+			gdDefString*("+"+rateStrMx[mi]+"*"+freqStrMx[mi]);
+		}
+
+		gdDefString*(";c_scale :< 1e100; \ncategFreqMatrix={{"+freqStrMx[0]);
+
+		for (mi=1; mi<rateClasses; mi=mi+1)
+		{
+			gdDefString*(","+freqStrMx[mi]);
+		}
+
+		gdDefString*("}};\ncategRateMatrix={{"+rateStrMx[0]+"/c_scale");
+
+		for (mi=1; mi<rateClasses; mi=mi+1)
+		{
+			gdDefString*(","+rateStrMx[mi]+"/c_scale");
+		}
+
+		gdDefString*("}};\n\ncategory c  = ("+rateClasses+", categFreqMatrix , MEAN, ,categRateMatrix, 0, 1e25);\n\n");
+		gdDefString*0;
+		ExecuteCommands (gdDefString);	
+	}
+	else
+	{
+		global betaP = 1;
+		global betaQ = 1;
+		betaP:>0.05;betaP:<85;
+		betaQ:>0.05;betaQ:<85;
+		category pc = (rateClasses-1, EQUAL, MEAN, 
+						_x_^(betaP-1)*(1-_x_)^(betaQ-1)/Beta(betaP,betaQ), /* density */
+						IBeta(_x_,betaP,betaQ), /*CDF*/
+						0, 				   /*left bound*/
+						1, 			   /*right bound*/
+						IBeta(_x_,betaP+1,betaQ)*betaP/(betaP+betaQ)
+					   );
+		
+		global alpha = .5;
+		alpha:>0.01;alpha:<100;
+		category c = (rateClasses, pc, MEAN, 
+						GammaDist(_x_,alpha,alpha), 
+						CGammaDist(_x_,alpha,alpha), 
+						0 , 
+				  	    1e25,
+				  	    CGammaDist(_x_,alpha+1,alpha)
+				  	 );
+			
+	}
+	NucleotideMatrix	 = {{*,c*AC*t,c*t,c*AT*t}
+							{c*AC*t,*,c*CG*t,c*CT*t}
+							{c*t,c*CG*t,*,c*GT*t}
+							{c*AT*t,c*CT*t,c*GT*t,*}};
+}
+else
+{
+	NucleotideMatrix	 = {{*,AC*t,t,AT*t}{AC*t,*,CG*t,CT*t}{t,CG*t,*,GT*t}{AT*t,CT*t,GT*t,*}};
+}
+
+HarvestFrequencies 		  (nucEFV, filteredData, 1, 1, 1);
+Model nucModel   		= (NucleotideMatrix, nucEFV, 1);
+Tree givenTree 			= treeString;
+branchNames	  		    = BranchName (givenTree,-1);
+LikelihoodFunction lf   = (filteredData,givenTree);
+
+
+/* check parameter counts */
+
+GetString 				(varList, lf, -1);
+baseParams 		   		= Columns(varList["Global Independent"])+3;
+perPartParameterCount	= Columns(varList["Local Independent"]);
+baseSites		   		= filteredData.sites;
+
+if (baseParams + (partCount+1) * perPartParameterCount >= baseSites - 1)
+{
+	fprintf (stdout,   "ERROR: Too few sites for c-AIC inference.\n");
+	return 0;
+}
+
+if (baseParams + 2 * perPartParameterCount >= baseSites - 1)
+{
+	fprintf (stdout,   "ERROR: Too few sites for reliable c-AIC inference.\n");
+	return 0;
+}
+
+
+fprintf (stdout, 		"\nFitting a baseline nucleotide model...\n");
+Optimize 		   (res,lf);
+baseLL			   = res[1][0];
+
+currentPopulation  = {};
+sortedScores	   = {populationSize,2};
+/*baseParams 		   = res[1][2];*/
+
+myDF 			   = baseParams+perPartParameterCount;
+
+sortedScores[0][0] = 2*(res[1][0]-myDF*(baseSites/(baseSites-myDF-1)));
+sortedScores[0][1] = 0;
+
+fprintf (stdout, CLEAR_FILE, "Done with single partition analysis. ",
+				 "Log(L) = ",lf,
+				 ", c-AIC  = ",-sortedScores[0][0], "\n");
+
+
+if (baseParams>3)
+{
+
+	ConstraintString = "";
+	ConstraintString*256;
+	for (h=0; h<baseParams-3; h=h+1)
+	{
+		GetString (v,lf,h);
+		ConstraintString * (v+":="+v+"__;\n");
+	}
+	ConstraintString*0;
+	ExecuteCommands (ConstraintString);
+}
+
+_mpiPrefixString = "";
+_mpiPrefixString * 256;
+
+_mpiPrefixString * ("ExecuteAFile (HYPHY_LIB_DIRECTORY+\"TemplateBatchFiles\"+DIRECTORY_SEPARATOR+\"Utility\"+DIRECTORY_SEPARATOR+\"NJ.bf\");");
+_mpiPrefixString * ("DataSet 	ds    = ReadDataFile (\""+baseFilePath+"\");");
+Export (modelString, USE_LAST_MODEL);
+_mpiPrefixString * modelString;
+_mpiPrefixString * 0;
+
+crapAIC 		 = -sortedScores[0][0];
+startTimer		 = Time (1);
+
+if (MPI_NODE_COUNT>1)
+{
+	MPINodeState 			= {MPI_NODE_COUNT-1,3};
+	MPINodeBreakpoints		= {};
+}
+
+currentBEST_IC 			 = crapAIC;
+ibfPath 				 = "GARD_GA_CHC.ibf";
+current_BPP_done_counter = 0;
+
+lastImprovedBPC = 0;
+
+byBPImprovement = {};
+byBPSplits		= {};
+
+DataSetFilter allData = CreateFilter (ds, 1);
+
+byBPImprovement[0]    = crapAIC;
+bestIndividualOverall = 0;
+
+fprintf (stdout, "Starting the GA...\n");
+
+for (currentBPC = startAtBreakpoint; currentBPC < maxBPP; currentBPC = currentBPC + 1)
+{
+	partCount 				= currentBPC;
+	totalBitSize 			= bppSize * partCount;
+	stateVectorDimension 	= totalBitSize;
+	
+	if (currentBPC == startAtBreakpoint)
+	{
+		currentPopulation [0] = {totalBitSize,1};
+	}
+	else
+	{
+		for (k=0; k<populationSize; k=k+1)
+		{
+			oldVector 			 = currentPopulation[k];
+			newVector			 = {totalBitSize,1};
+			currentPopulation[k] = newVector ["oldVector[_MATRIX_ELEMENT_ROW_%(totalBitSize-bppSize)]"];
+		}
+		children = {};
+	}	
+	
+	totalModelCounter 		 = 1;
+	kf 						 = 1;
+
+	for (k=1; k <= partCount; k=k+1)
+	{
+		totalModelCounter = totalModelCounter * (Abs(bppMap)-k+1);
+		kf 				  = kf * k;
+	} 
+	totalModelCounter = totalModelCounter / kf;
+
+	ExecuteAFile			 (ibfPath);	 
+	
+	current_BPP_done_counter = Abs (MasterList);
+	kf						 = -sortedScores[populationSize-1][0];
+	
+	if (currentBEST_IC > kf || currentBPC == 1)
+	{
+		byBPSplits		[currentBPC] = ConvertToPart 	(currentPopulation[populationSize-1]);
+		byBPImprovement [currentBPC] = currentBEST_IC-kf;
+		if (currentBEST_IC > kf)
+		{
+			lastImprovedBPC       = currentBPC;
+			bestIndividualOverall = currentPopulation[populationSize-1];
+		}
+		currentBEST_IC = Min(kf,currentBEST_IC);
+	}
+	else
+	{
+		break;
+	}
+}
+
+
+fprintf (outputFilePath, "<!DOCTYPE HTML PUBLIC '-//W3C//DTD HTML 4.01 Transitional//EN'><html><head><META http-equiv='Content-Style-Type' content='text/css'><meta http-equiv='Content-Type' content='text/html; charset=ISO-8859-1'><title>GARD Results</title><LINK REL=STYLESHEET TYPE='text/css' HREF='http://www.datamonkey.org/GARD/styles/styles.css'></head><body>");
+fprintf (outputFilePath, "<DIV CLASS = 'RepClassSM'>Processed alignment <b>", baseFilePath,"</b> with ", ds.species, " sequences and ", ds.sites, " sites.",
+					      "<p> Processor time taken: ", Time(1)-startTimer, " seconds.</DIV>");
+					      
+if (timeLeft < 0)
+{
+	fprintf (outputFilePath, "<DIV CLASS = 'ErrorTag'> This analysis was stopped before convergence, because the CPU time limit per job was reached. The reported results may, therefore be incomplete, as there may be more breakpoints, for example. ",
+							 "Consider reducing the size of the alignment, either by removing sequences or selecting shorted sequence regions, or choosing a simpler model (no rate variation etc). </DIV>\n");
+}
+
+fprintf (outputFilePath, "<DIV class = 'RepClassSM'><u>Results</u><p>", reportImprovementHTML (0), "</DIV>");
+
+						 
+
+fprintf (outputFilePath, "<DIV CLASS='RepClassSM'><span class = 'font-variant:small-caps;'>Substitution process parameters</span><p><b>Nucleotide Model (",modelDesc,
+		") Fit Results</b><p>Log likelihood : ",outputSpan (150,baseLL),"<br>",
+		"c-AIC : ", outputSpan(150, crapAIC),"<br>");
+
+if (rvChoice)
+{
+	if (rvChoice == 1)
+	{
+		fprintf (outputFilePath, "<p>Using general discrete distribution of rates across sites");
+	}	
+	else
+	{
+		fprintf (outputFilePath, "<p>Using the beta-gamma distribution of rates across sites");	
+	}
+	GetInformation (cI,c);
+	for (k = 0; k < Columns (cI); k=k+1)
+	{
+		fprintf (outputFilePath, "<br> Rate : ", Format (cI[0][k],7,3), outputSpan (150, "Weight : " + Format (cI[1][k],7,3)));
+	}
+}
+else
+{
+	fprintf (outputFilePath, "<p>Homogeneous rate distribution across sites");
+}
+
+fprintf (outputFilePath, "<p><u>Nucleotide substitution rate matrix</u><p>",
+		"<TABLE><TR CLASS = 'TRReportT'><TH> </TH><TH>A</TH><TH>C</TH><TH>G</TH><TH>T</TH></TR>",
+		"<TR CLASS = 'TRReport1'><TH>A</TH><TD>*</TD><TD>",AC,"</TD><TD>1</TD><TD>",AT,"</TD></TR>",		
+		"<TR CLASS = 'TRReport2'><TH>C</TH><TD>-</TD><TD>&#42</TD><TD>",CG,"</TD><TD>",CT,"</TD></TR>",		
+		"<TR CLASS = 'TRReport1'><TH>G</TH><TD>-</TD><TD>&#45</TD><TD>&#42</TD><TD>",GT,"</TD></TR>",		
+		"<TR CLASS = 'TRReport2'><TH>T</TH><TD>-</TD><TD>&#45</TD><TD>&#45</TD><TD>&#42</TD></TR></TABLE>",		
+		"</DIV></html>");
+
+
+fprintf  (outputFilePath, "</body></html>", CLOSE_FILE);
+fprintf	  (stdout, "Performing the final optimization...\n");
+
+rawOutFile = outputFilePath + "_splits";
+fprintf (rawOutFile,CLEAR_FILE);
+
+
+
+if (Rows(bestIndividualOverall))
+{
+	totalBitSize = Rows (bestIndividualOverall)*Columns(bestIndividualOverall);
+	partCount    = totalBitSize/bppSize;
+	outAVL 		 = ExportAMatrix (rawOutFile,bestIndividualOverall,0);
+}
+else
+{
+	outAVL 		= ExportAMatrix (rawOutFile,0,0);
+}
+
+
+rawOutFile = outputFilePath + "_ga_details";
+fprintf (rawOutFile,CLEAR_FILE, KEEP_OPEN);
+
+masterKeys = Rows(MasterList);
+for (h=Rows(masterKeys)*Columns(masterKeys)-1; h>=0; h=h-1)
+{
+	aKey = masterKeys[h];
+	fprintf (rawOutFile,(-MasterList[aKey]),"\n",aKey,"\n");
+}
+fprintf (rawOutFile,CLOSE_FILE);
+
+IS_TREE_PRESENT_IN_DATA = 0;
+DATA_FILE_PRINT_FORMAT	= 6;
+
+tempFile 			  = outputFilePath + "_finalout";
+
+fprintf 	 		 (tempFile,CLEAR_FILE,KEEP_OPEN,allData,"\nBEGIN TREES;\n");
+bpL					 = outAVL ["BP"];
+bpT					 = outAVL ["Trees"];
+for 				 (rvChoice = 0; rvChoice < Abs(bpT); rvChoice = rvChoice + 1)
+{
+	fprintf (tempFile, "\tTREE part_", rvChoice+1, " = ", bpT[rvChoice], ";\n");
+}
+fprintf 	 		 (tempFile,"\nEND;\n\nBEGIN ASSUMPTIONS;\n");
+for 				 (rvChoice = 0; rvChoice < Abs(bpL); rvChoice = rvChoice + 1)
+{
+	fprintf (tempFile, "\tCHARSET span_", rvChoice+1, " = ", bpL[rvChoice], ";\n");
+}
+fprintf				 (tempFile,"\nEND;\n",CLOSE_FILE);
+
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function	reportImprovementHTML (_IC)
+{
+	if (lastImprovedBPC)
+	{
+		return "<DIV class = 'RepClassSM'><b>GARD found evidence of "+lastImprovedBPC+" breakpoints</b><p>"+spoolAICTable(0) + "</DIV>\n";
+								
+	}
+	return "<DIV class = 'RepClassSM'>GARD found no evidence of recombination</DIV>";
+}
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function	outputSpan (_offset, _text)
+{
+	return "<span style = 'position: absolute; left: " + (140+_offset) + "px'>" + _text + "</span>";
+}
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function 	spoolAICTable (dummy)
+{
+	colorList 	= {{"red","black","blue","green","purple","orange"}};
+	fcolorList 	= {{"white","white","white","white","white","black"}};
+
+	htmlAICTable = "";
+	htmlAICTable * 128;
+
+
+	htmlAICTable * "<html><body><div style = 'width: 580px; border: black solid 1px; '>";
+	htmlAICTable * "<table style = 'width: 100%;font-size: 10px;text-align:left;'><tr><th>BPs</th><th>c-AIC</th><th>Δ c-AIC</th><th width = '70%'>Segments</th></tr>";
+
+
+	currentAIC = byBPImprovement [0];
+
+	for (_partCount = 0; _partCount <Abs (byBPImprovement); _partCount = _partCount + 1)
+	{
+		if (_partCount)
+		{
+			currentAIC = currentAIC - byBPImprovement [_partCount];
+			ci 		   = byBPImprovement [_partCount];
+			bpLocs2    = byBPSplits		 [_partCount];
+			pxPerSpan  = 406/allData.sites;
+			sp		   = "<table style = 'padding: 0px; spacing: 0px;'><tr>";
+			
+			prv 	   = Rows (bpLocs2);
+			bpLocs	   = {1,prv+1};
+			for (k = 0; k < prv; k=k+1)
+			{
+				bpLocs[k]	 = bppMap[bpLocs2[k]];
+			}
+			
+			bpLocs[prv]  = allData.sites-1;
+			prv 	     = 1;
+			
+			for (k=0; k<Columns (bpLocs); k=k+1)
+			{
+				sp = sp + "<td style = 'width:"+
+					 pxPerSpan*(bpLocs[k]-prv+1)$1+
+					 "px; background-color: "+
+					 colorList[k%Columns(colorList)]+
+					 "; color: "+
+					 fcolorList[k%Columns(colorList)]+
+					 "; text-align: right; font-size: 10px;'>";
+					 
+				if (k<Columns (bpLocs)-1)
+				{
+					sp = sp + (bpLocs[k] + 1);	
+				}
+				else
+				{
+					sp = sp + "&nbsp";	
+				}
+				sp = sp + "</td>";
+				prv = bpLocs[k];
+			}	
+			sp = sp + "</tr></table>";
+		}
+		else
+		{
+			ci 		   = "";
+			sp		   = "<table><tr><td style = 'font-size:10px;width: 406px;background-color:"+colorList[0]+"; color:"+fcolorList[0]+"'>1-"+allData.sites+"</td></tr></table>";
+		}
+		htmlAICTable * ("\n<tr><td>"+ _partCount+ 
+							  "</td><td><div style = 'width: "+100*currentAIC/byBPImprovement [0]$1+"%; background-color: purple; color: white;'>"+currentAIC+ 
+							  "</div></td><td>"+ ci+ 
+							  "</td><td>"+ sp+
+							  "</td></tr>");
+		
+	}
+
+	htmlAICTable * "\n</table></div></body></html>";
+	htmlAICTable * 0;
+	return htmlAICTable;
+}
diff --git a/res/TemplateBatchFiles/GARDProcessor.bf b/res/TemplateBatchFiles/GARDProcessor.bf
new file mode 100644
index 0000000..df611fe
--- /dev/null
+++ b/res/TemplateBatchFiles/GARDProcessor.bf
@@ -0,0 +1,768 @@
+VERBOSITY_LEVEL = -1;
+
+SetDialogPrompt ("Please load a nucleotide data file:");
+DataSet 	ds = ReadDataFile (PROMPT_FOR_FILE);
+baselineDSPath = LAST_FILE_PATH;
+
+SetDialogPrompt ("Please load a GA partition analysis result file:");
+fscanf  (PROMPT_FOR_FILE,REWIND,"Lines",partLines);
+
+readPCount = Columns (partLines)/2-1;
+fprintf (stdout, "\nLoaded ", readPCount , " partitions\n");
+
+resp = 4;
+
+global betaP = 1;
+global betaQ = 1;
+betaP:>0.05;betaP:<85;
+betaQ:>0.05;betaQ:<85;
+
+category pc = (resp-1, EQUAL, MEAN, 
+				_x_^(betaP-1)*(1-_x_)^(betaQ-1)/Beta(betaP,betaQ), /* density */
+				IBeta(_x_,betaP,betaQ), /*CDF*/
+				0, 				   /*left bound*/
+				1, 			   /*right bound*/
+				IBeta(_x_,betaP+1,betaQ)*betaP/(betaP+betaQ)
+			   );
+
+
+global alpha = .5;
+alpha:>0.01;alpha:<100;
+category c = (resp, pc, MEAN, 
+				GammaDist(_x_,alpha,alpha), 
+				CGammaDist(_x_,alpha,alpha), 
+				0 , 
+		  	    1e25,
+		  	    CGammaDist(_x_,alpha+1,alpha)
+		  	 );
+
+global		 AC = 1;
+global		 AT = 1;
+global		 CG = 1;
+global		 CT = 1;
+global		 GT = 1;
+
+GTR_Matrix = {{*,AC*t*c,t*c,AT*t*c}
+			 {AC*t*c,*,CG*t*c,CT*t*c}
+			 {t*c,CG*t*c,*,GT*t*c}
+			 {AT*t*c,CT*t*c,GT*t*c,*}};
+
+/*AT:=AC;
+CG:=AC;
+CT:=1;
+GT:=AC;*/
+
+DataSetFilter	filteredData = CreateFilter (ds,1);
+
+bppMap = {};
+for (h=0; h<filteredData.sites; h=h+1)
+{
+	filterString = "" + h;
+	DataSetFilter siteFilter = CreateFilter (filteredData,1,filterString);
+
+	HarvestFrequencies (f1, siteFilter, 1, 1, 0); 
+	m1 = 0;
+	for (mpiNode=0; (mpiNode < 4) && (m1<=1) ; mpiNode=mpiNode+1)
+	{
+		if (f1[mpiNode]>0)
+		{
+			m1=m1+1;
+		}
+	}	
+	if (m1>1)
+	{
+		bppMap[Abs(bppMap)] = h;
+	}
+}
+
+fprintf (stdout, "\nSequences :", filteredData.species,
+				 "\nSites     :", filteredData.sites,
+				 "\nVariable  :", Abs(bppMap), "\n"); 
+
+HarvestFrequencies (baseFreqs,ds,1,1,1);
+
+fprintf (stdout, "\n\nf(A) = ", baseFreqs[0],
+				 "\nf(C) = ", baseFreqs[1],
+				 "\nf(G) = ", baseFreqs[2],
+				 "\nf(T) = ", baseFreqs[3],"\n");
+				
+Model GTR_Model =  (GTR_Matrix, baseFreqs, 1);
+
+InferTreeTopology   (0);
+treeString 	= TreeMatrix2TreeString(0);
+Tree givenTree = treeString;
+
+LikelihoodFunction singlePart = (filteredData, givenTree);
+Optimize (res, singlePart);
+
+baseParams = res[1][2];
+
+if (baseParams>0)
+{
+
+	ConstraintString = "";
+	ConstraintString*256;
+	for (h=0; h<baseParams; h=h+1)
+	{
+		GetString (v,singlePart,h);
+		ConstraintString * (v+":="+v+"__;\n");
+	}
+	ConstraintString*0;
+	ExecuteCommands (ConstraintString);
+}
+
+nullCAIC = -2(res[1][0]-res[1][1]*filteredData.sites/(filteredData.sites-res[1][1]-1));
+
+fprintf  (stdout, "\n\nc-AIC = ", nullCAIC, "\n", singlePart);
+
+m1 = computeMeanDivergence ("givenTree");
+
+fprintf  (stdout, "\nMean divergence : ", m1*100, "%\n");
+
+fprintf  (stdout, "\n\nFitting a single-tree, multiple partition model\n");
+
+USE_DISTANCES = 0;
+
+lfDef = "";
+lfDef * 128;
+lfDef  * "LikelihoodFunction multiPart  = (";
+
+for (pccounter = 0; pccounter < readPCount; pccounter = pccounter + 1)
+{
+	ExecuteCommands ("DataSetFilter part_" + pccounter + " = CreateFilter (ds, 1, \"" + partLines[2+pccounter*2] + "\");");
+	ExecuteCommands ("Tree tree_" + pccounter + " = treeString;");
+	if (pccounter)
+	{
+		lfDef * ",";
+		ExecuteCommands ("global S_"+pccounter+"=1;\nReplicateConstraint (\"this1.?.?:=S_"+pccounter+"*this2.?.?\",tree_"+pccounter+",tree_0);");
+	}
+	lfDef  * ("part_"+pccounter+",tree_"+pccounter);
+}
+lfDef  * ");";
+lfDef  * 0;
+ExecuteCommands (lfDef);
+Optimize (res2, multiPart);
+myDF2 = baseParams + res2[1][1];
+intCAIC = -2(res2[1][0]-myDF2*filteredData.sites/(filteredData.sites-myDF2-1));
+fprintf (stdout, multiPart);
+
+USE_DISTANCES = 0;
+
+lfDef = "";
+lfDef * 128;
+lfDef  * "LikelihoodFunction multiPart  = (";
+
+fprintf  (stdout, "\n\nFitting a mutilple tree, multiple partition model\n");
+
+for (pccounter = 0; pccounter < readPCount; pccounter = pccounter + 1)
+{
+	ExecuteCommands ("DataSetFilter part_" + pccounter + " = CreateFilter (ds, 1, \"" + partLines[2+pccounter*2] + "\");");
+	ExecuteCommands ("Tree tree_" + pccounter + " = " + partLines[pccounter*2+3] + ";");
+	if (pccounter)
+	{
+		lfDef * ",";
+	}
+	lfDef  * ("part_"+pccounter+",tree_"+pccounter);
+}
+lfDef  * ");";
+lfDef  * 0;
+ExecuteCommands (lfDef);
+Optimize (res, multiPart);
+
+fprintf (stdout, multiPart);
+
+lfout = baselineDSPath + "_multi.fit";
+LIKELIHOOD_FUNCTION_OUTPUT = 7;
+fprintf (lfout, CLEAR_FILE, multiPart);
+LIKELIHOOD_FUNCTION_OUTPUT = 2;
+
+myDF = baseParams + res[1][1];
+
+fullCAIC = -2(res[1][0]-myDF*filteredData.sites/(filteredData.sites-myDF-1));
+
+fprintf  (stdout, "\n\nVersus the single partition model: c-AIC = ", fullCAIC, "\nDelta AIC = ", nullCAIC-fullCAIC,"\n\n");
+fprintf  (stdout, "\n\nVersus the single tree/multiple partition model: Delta AIC = ", intCAIC-fullCAIC,"\n\n");
+
+bpLocations = {readPCount, 1}; 
+for (pccounter = 0; pccounter <  readPCount; pccounter = pccounter + 1)
+{
+	if (pccounter)
+	{
+		bpLocations[pccounter] = siteCount + bpLocations[pccounter-1];
+	}
+	ExecuteCommands ("siteCount = part_" + pccounter + ".sites;");
+	fprintf (stdout, "Partition ", pccounter+1, " : ", siteCount, " sites\n");
+}
+
+pairWiseSplitMatch = {readPCount,readPCount};
+
+for (pccounter = 0; pccounter <  readPCount; pccounter = pccounter + 1)
+{
+	for (pc2 = pccounter+1; pc2 <  readPCount; pc2 = pc2 + 1)
+	{
+		ExecuteCommands ("siteCount = compareTreesForSplits(\"tree_" +pccounter + "\",\"tree_"+pc2+"\");");
+		pairWiseSplitMatch[pccounter][pc2] = siteCount[2]/Min(siteCount[0],siteCount[1]);
+	}
+}
+
+/* now do SH testing */
+
+conditionals 	 = {};
+likelihoodScores = {readPCount,readPCount};
+pairwiseP		 = {readPCount,readPCount};
+
+treeSplitMatches 	 = 0;
+khIterations		 = 10000;
+
+if (OPTIMIZATION_PRECISION == 0)
+{
+	cutThreshold		= 0.001;
+}
+else
+{
+	cutThreshold		= 2 * OPTIMIZATION_PRECISION;
+}
+
+
+for (pccounter = 0; pccounter <  readPCount; pccounter = pccounter + 1)
+{
+	for (pc2 = 0; pc2 <  readPCount; pc2 = pc2 + 1)
+	{
+		if (Abs(pc2-pccounter) <= 1)
+		{
+			DataSetFilter 		aPart = CreateFilter (ds,1,partLines[pccounter*2+2]);
+			Tree		  		aTree = partLines[pc2*2+3];
+			LikelihoodFunction	aLF	= (aPart,aTree);
+			
+			fprintf				(stdout, "\n\nFitting tree ", pc2+1, " to partition ", pccounter+1, "\n");
+			Optimize			(aRes, aLF);	
+			fprintf				(stdout, aLF);
+			LIKELIHOOD_FUNCTION_OUTPUT = 2;
+			GetInformation		(cI,c);
+			cI					= cI[1][-1];
+			ConstructCategoryMatrix (conds, aLF);
+			conds				= Log(cI*conds);
+			conditionals		[pccounter*readPCount+pc2] = conds;
+			likelihoodScores	[pccounter][pc2] = aRes[1][0];
+			treeSplitMatches    = treeSplitMatches + pairWiseSplitMatch[pccounter][pc2];
+		}
+	}
+	
+	fprintf (stdout, "\nKH Testing partition ", pccounter+1, "\n");
+	partTreeConds = conditionals[pccounter*readPCount+pccounter];
+	
+	for (pc2 = 0; pc2 <  readPCount; pc2 = pc2 + 1)
+	{
+		if (Abs(pc2-pccounter) == 1)
+		{
+			otherPartTree = conditionals[pccounter*readPCount+pc2];
+			baseLRT = 2*(likelihoodScores[pccounter][pccounter]-likelihoodScores[pccounter][pc2]);
+			fprintf (stdout, "Tree ", pc2+1, " base LRT = ", baseLRT, ". p-value = ");
+			textMx = testLRT(partTreeConds,otherPartTree,khIterations) % 0;
+			for (kk=khIterations-1; kk>=0; kk=kk-1)
+			{	
+				if (textMx[kk] < baseLRT)
+				{
+					break;
+				}
+			}
+			pval = Max(1,(khIterations-1-kk))/khIterations;
+			fprintf (stdout, pval , "\n");
+			pairwiseP[pccounter][pc2] = pval;
+		}
+	}
+}
+
+treeSplitMatches = treeSplitMatches*2/readPCount/(readPCount-1);
+totalComparisons = (readPCount-1)*2;
+threshP			 = 0.01/totalComparisons;
+
+bypvalue         = {{0.01, 0}{0.05, 0}{0.1, 0}} * (1/totalComparisons);
+
+
+fprintf (stdout, "\nBreakpoint | LHS Raw p | LHS adjusted p | RHS Raw p | RHS adjusted p \n");
+
+for (pccounter = 1; pccounter <  readPCount; pccounter = pccounter + 1)
+{
+	lhs     = pairwiseP[pccounter][pccounter-1];
+	rhs     = pairwiseP[pccounter-1][pccounter];
+						 
+	for (k = 0; k < Rows (bypvalue); k = k + 1)
+	{
+		threshP = bypvalue[k][0];
+		if (lhs <= threshP && rhs <= threshP)
+		{
+			bypvalue[k][1] = bypvalue[k][1] + 1;
+		}
+	}
+	fprintf (stdout, Format(bpLocations[pccounter],10,0), " | ",
+					 Format(lhs,9,5), " | ",
+					 Format(Min(1,lhs*totalComparisons),14,5), " | ",
+					 Format(rhs,9,5), " | ",
+					 Format(Min(1,rhs*totalComparisons),14,5), "\n");
+}
+
+fprintf (stdout, "\n");
+for (k = 0; k < Rows (bypvalue); k = k + 1)
+{
+	fprintf (stdout, "At p = ", bypvalue[k][0]*totalComparisons, " there are ", bypvalue[k][1], " significant breakpoints\n");
+}
+fprintf (stdout, "\nMean splits identify: ",treeSplitMatches, "\n" );
+
+
+
+
+
+
+
+/* AUX STUFF */
+
+/*lfDef = "";
+lfDef * 128;
+lfDef  * "LikelihoodFunction multiPart2  = (";
+
+for (pccounter = 0; pccounter < readPCount; pccounter = pccounter + 1)
+{
+	ExecuteCommands ("DataSetFilter part2_" + pccounter + " = CreateFilter (ds, 1, \"" + partLines[pccounter*2+2] + "\");");
+	ExecuteCommands ("Tree tree2_" + pccounter + " = " + treeString + ";");
+	if (pccounter)
+	{
+		lfDef * ",";
+	}
+	lfDef  * ("part2_"+pccounter+",tree2_"+pccounter);
+}
+
+lfDef  * ");";
+lfDef  * 0;
+ExecuteCommands (lfDef);
+Optimize (res, multiPart2);
+
+fprintf (stdout, multiPart2);
+
+full2CAIC = -2(res[1][0]-res[1][1]*filteredData.sites/(filteredData.sites-res[1][1]-1));
+fprintf  (stdout, "\n\nc-AIC = ", full2CAIC, "\nDelta Alt-AIC = ", full2CAIC-fullCAIC,"\n\n");*/
+
+
+/* ________________________________________________________________________________________________*/
+
+
+function InitializeDistances (dummy)
+{
+	HarvestFrequencies (_dNucFreq,filteredData,1,1,0);
+	_d_fR = _dNucFreq[0]+_dNucFreq[2];
+	_d_fY = _dNucFreq[1]+_dNucFreq[3];
+	
+	if (_dNucFreq[0] == 0 || _dNucFreq[1] == 0 || _dNucFreq[2] == 0 || _dNucFreq[3] == 0)
+	{
+		_useK2P = 1;
+	}
+	else
+	{
+		_d_TN_K1 = 2*_dNucFreq[0]*_dNucFreq[2]/_d_fR;
+		_d_TN_K2 = 2*_dNucFreq[1]*_dNucFreq[3]/_d_fY;
+		_d_TN_K3 = 2*(_d_fR*_d_fY-_dNucFreq[0]*_dNucFreq[2]*_d_fY/_d_fR-_dNucFreq[1]*_dNucFreq[3]*_d_fR/_d_fY);
+		_useK2P = 0;
+	}
+	
+	
+	summingVector = {{1}{1}{1}{1}};
+
+	return 0;
+}
+
+/* ________________________________________________________________________________________________*/
+
+function ComputeDistanceFormula (s1,s2)
+{
+	GetDataInfo (siteDifferenceCount, filteredData, s1, s2, DIST);
+	
+	totalSitesCompared = Transpose(summingVector)*(siteDifferenceCount*summingVector);
+	totalSitesCompared = totalSitesCompared[0];
+	
+	if (_useK2P)
+	{
+		_dTransitionCounts 	 =    siteDifferenceCount[0][2]+siteDifferenceCount[2][0]  /* A-G and G-A */
+								 +siteDifferenceCount[1][3]+siteDifferenceCount[3][1]; /* C-T and T-C */
+							
+		_dTransversionCounts = (siteDifferenceCount[0][0]+siteDifferenceCount[1][1]+siteDifferenceCount[2][2]+siteDifferenceCount[3][3])+_dTransitionCounts;
+		
+		_dTransitionCounts	 = _dTransitionCounts/totalSitesCompared;
+		_dTransversionCounts = 1-_dTransversionCounts/totalSitesCompared;
+		
+		_d1C = 1-2*_dTransitionCounts-_dTransversionCounts;
+		_d2C = 1-2*_dTransversionCounts;
+		
+		if (_d1C>0 && _d2C>0)
+		{
+			return -(0.5*Log(_d1C)+.25*Log(_d2C));	
+		}
+	}
+	else
+	{
+		_dAGCounts 	 =    siteDifferenceCount[0][2]+siteDifferenceCount[2][0]  /* A-G and G-A */;
+		_dCTCounts	 = 	  siteDifferenceCount[1][3]+siteDifferenceCount[3][1]; /* C-T and T-C */
+							
+		_dTransversionCounts = (siteDifferenceCount[0][0]+siteDifferenceCount[1][1]+siteDifferenceCount[2][2]+
+								siteDifferenceCount[3][3])+_dAGCounts+_dCTCounts;
+		
+		_dAGCounts	 = _dAGCounts/totalSitesCompared;
+		_dCTCounts	 = _dCTCounts/totalSitesCompared;
+		
+		_dTransversionCounts = 1-_dTransversionCounts/totalSitesCompared;
+		
+		_d1C = 1-_dAGCounts/_d_TN_K1-0.5*_dTransversionCounts/_d_fR;
+		_d2C = 1-_dCTCounts/_d_TN_K2-0.5*_dTransversionCounts/_d_fY;
+		_d3C = 1-0.5*_dTransversionCounts/_d_fY/_d_fR;
+		
+		if ((_d1C>0)&&(_d2C>0)&&(_d3C>0))
+		{
+			return -_d_TN_K1*Log(_d1C)-_d_TN_K2*Log(_d2C)-_d_TN_K3*Log(_d3C);
+		}
+	}
+	
+	return 1000;
+}
+
+/* ________________________________________________________________________________________________*/
+
+function TreeMatrix2TreeString (doLengths)
+{
+	treeString = "";
+	p = 0;
+	k = 0;
+	m = treeNodes[0][1];
+	n = treeNodes[0][0];
+	d = treeString*(Rows(treeNodes)*25);
+
+	while (m)
+	{	
+		if (m>p)
+		{
+			if (p)
+			{
+				d = treeString*",";
+			}
+			for (j=p;j<m;j=j+1)
+			{
+				d = treeString*"(";
+			}
+		}
+		else
+		{
+			if (m<p)
+			{
+				for (j=m;j<p;j=j+1)
+				{
+					d = treeString*")";
+				}
+			}	
+			else
+			{
+				d = treeString*",";
+			}	
+		}
+		if (n<filteredData.species)
+		{
+			GetString (nodeName, filteredData, n);
+			d = treeString*nodeName;
+		}
+		if (doLengths>.5)
+		{
+			nodeName = ":"+treeNodes[k][2];
+			d = treeString*nodeName;
+		}
+		k=k+1;
+		p=m;
+		n=treeNodes[k][0];
+		m=treeNodes[k][1];
+	}
+
+	for (j=m;j<p;j=j+1)
+	{
+		d = treeString*")";
+	}
+	
+	d=treeString*0;
+	return treeString;
+}
+
+/* ________________________________________________________________________________________________*/
+
+function InferTreeTopology(verbFlag)
+{
+	distanceMatrix = {filteredData.species,filteredData.species};
+	dummy = InitializeDistances (0);
+		
+	for (i = 0; i<filteredData.species; i=i+1)
+	{
+		for (j = i+1; j<filteredData.species; j = j+1)
+		{
+			distanceMatrix[i][j] = ComputeDistanceFormula (i,j);
+		}
+	}
+
+	MESSAGE_LOGGING 		 	= 1;
+	cladesMade 					= 1;
+	
+
+	if (filteredData.species == 2)
+	{
+		d1 = distanceMatrix[0][1]/2;
+		treeNodes = {{0,1,d1__},
+					 {1,1,d1__},
+					 {2,0,0}};
+					 
+		cladesInfo = {{2,0}};
+	}
+	else
+	{
+		if (filteredData.species == 3)
+		{
+			d1 = (distanceMatrix[0][1]+distanceMatrix[0][2]-distanceMatrix[1][2])/2;
+			d2 = (distanceMatrix[0][1]-distanceMatrix[0][2]+distanceMatrix[1][2])/2;
+			d3 = (distanceMatrix[1][2]+distanceMatrix[0][2]-distanceMatrix[0][1])/2;
+			treeNodes = {{0,1,d1__},
+						 {1,1,d2__},
+						 {2,1,d3__}
+						 {3,0,0}};
+						 
+			cladesInfo = {{3,0}};		
+		}
+		else
+		{	
+			njm = (distanceMatrix > methodIndex)>=filteredData.species;
+				
+			treeNodes 		= {2*(filteredData.species+1),3};
+			cladesInfo	    = {filteredData.species-1,2};
+			
+			for (i=Rows(treeNodes)-1; i>=0; i=i-1)
+			{
+				treeNodes[i][0] = njm[i][0];
+				treeNodes[i][1] = njm[i][1];
+				treeNodes[i][2] = njm[i][2];
+			}
+
+			for (i=Rows(cladesInfo)-1; i>=0; i=i-1)
+			{
+				cladesInfo[i][0] = njm[i][3];
+				cladesInfo[i][1] = njm[i][4];
+			}
+			
+			njm = 0;
+		}
+	}
+	distanceMatrix = 0;
+	
+	return 1.0;
+}
+
+/* ________________________________________________________________________________________________*/
+
+function computeMeanDivergence (treeID)
+{
+	ExecuteCommands ("treeAVL2="+treeID+"^0;leafCount=TipCount("+treeID+")");
+	multFactors = {};
+	
+	for (k=1; k<Abs(treeAVL2); k=k+1)
+	{
+		aNode = treeAVL2[k];
+		aNodeName = aNode["Name"];
+		parentIndex = aNode["Parent"];
+		k2 = Abs(aNode["Children"]);
+		if (k2)
+		{
+			currentDepth = aNode["Below"];
+			multFactors[aNodeName] = currentDepth;		
+			if (parentIndex > 0)
+			{
+				pInfo = treeAVL2[parentIndex];
+				pInfo ["Below"] = pInfo ["Below"] + currentDepth;
+				treeAVL2[parentIndex] = pInfo;
+			}
+		}
+		else
+		{
+			multFactors[aNodeName] = 1;
+			pInfo = treeAVL2[parentIndex];
+			pInfo ["Below"] = pInfo ["Below"] + 1;
+			treeAVL2[parentIndex] = pInfo;
+		}
+	}
+
+	pKeys 			= Rows(multFactors);
+
+	for (k=0; k<Columns(pKeys); k=k+1)
+	{
+		aNodeName = pKeys[k];
+		multFactors[aNodeName] = multFactors[aNodeName] * (leafCount-multFactors[aNodeName]);
+	}
+	
+	ExecuteCommands ("bNames = BranchName   ("+treeID+",-1);");
+	ExecuteCommands ("bLen   = BranchLength ("+treeID+",-1);");
+	
+	sum = 0;
+	bc  = Columns(bNames)-1;
+	
+	for (k=0; k<bc; k=k+1)
+	{
+		aNodeName = bNames[k];
+		sum = sum + bLen[k]*multFactors[aNodeName];
+	}	
+	return sum/(leafCount*(leafCount-1)*0.5);
+}
+
+/* ________________________________________________________________________________________________*/
+
+function compareTreesForSplits (tName, tName2)
+{
+	/* obtain an AVL data structure of the tree, post-order layout */
+
+	ExecuteCommands   ("_astavl_="+tName+"^1;");
+	_tree_size_ = Abs (_astavl_);
+
+
+	nodeMapAVL = {};
+	
+	for (_a_node = 2; _a_node < _tree_size_; _a_node = _a_node + 1)
+	{
+		_node_info = _astavl_[_a_node];
+		myDegree = Abs(_node_info["Children"]);
+		
+		if (myDegree == 0)
+		{
+			nodeName = _node_info["Name"];
+			nodeMapAVL [nodeName] = Abs(nodeMapAVL)+1;
+		}
+	}
+	
+	split1 = getSplits(0);
+	ExecuteCommands   ("_astavl_="+tName2+"^1;");
+	_tree_size_ = Abs (_astavl_);
+	split2 = getSplits(0);
+	
+	s1c = Abs(split1);
+	s2c = Abs(split2);
+		
+	matches = {};
+	match1  = {};
+	match2  = {};
+	for (r1 = 0; r1 < s1c; r1 = r1 + 1)
+	{
+		if (match1[r1] == 0)
+		{
+			for (r2 = 0; r2 < s2c; r2 = r2 + 1)
+			{
+				if (match2[r2] == 0)
+				{
+					splitCheck = compareSplits (split1[r1],split2[r2]);
+					if (splitCheck)
+					{
+						mr = {{r1,r2}};
+						matches [Abs(matches)] = mr;
+						match1[r1] = 1;
+						match2[r2] = 1;
+					}
+				}
+			}
+		}
+	}
+	
+	
+	return {{s1c,s2c,Abs(matches)}};
+}
+
+/* ________________________________________________________________________________________________*/
+
+function getSplits (dummy)
+{
+	treeSplits = {};
+	for (_a_node = 2; _a_node < _tree_size_; _a_node = _a_node + 1)
+	{
+		_node_info = _astavl_[_a_node];
+		myDegree = Abs(_node_info["Children"]);
+		myDepth  = _node_info["Depth"];
+		
+			
+		if (myDegree && _node_info["Length"]>0)
+		{
+			nodeName = _node_info["Name"];
+			aSplit = {Abs(nodeMapAVL),1};
+			for (_b_node = _a_node + 1; _b_node < _tree_size_; _b_node = _b_node + 1)
+			{
+				_bnode_info = _astavl_[_b_node];
+					if (_bnode_info["Depth"] <= myDepth)
+				{
+					break;
+				}
+				if (Abs(_bnode_info["Children"])==0)
+				{
+					_bnode_info = _bnode_info["Name"];
+					_bnode_info = nodeMapAVL[_bnode_info];
+					if (_bnode_info == 0)
+					{
+						fprintf (stdout, "Error: extraneous node name\n");
+						return 0;
+					}
+					aSplit [_bnode_info-1] = 1;
+				}
+			}
+			treeSplits [Abs(treeSplits)] = aSplit;
+		}
+	}
+	return treeSplits;
+}
+
+/* ________________________________________________________________________________________________*/
+
+function compareSplits (s1, s2)
+{
+	sl            = Rows(s1);
+	positiveCheck = (s1[0] == s2[0]);
+	for (k=1; k<sl; k=k+1)
+	{
+		if (s1[k] != s2[k])
+		{
+			if (positiveCheck)
+			{
+				return 0;
+			}
+		}
+		else
+		{
+			if (!positiveCheck)
+			{
+				return 0;
+			}
+		}
+	}
+	return -1+2*positiveCheck;	
+}
+
+/*--------------------------------------------------------------------------------------*/
+
+function testLRT (vec1, vec2, itCount)
+{
+	size1 = Columns(vec1);
+	
+	jvec	= {2,size1};
+	resMx1	= {itCount,1};
+	resMx2	= {itCount,1};
+	
+	for (k=0; k<size1; k=k+1)
+	{
+		jvec	[0][k] = vec1[k];
+		jvec	[1][k] = vec2[k];
+	}
+	
+	
+	for (k=0; k<itCount; k=k+1)
+	{
+		resampled = Random(jvec,1);
+		resMx1[k] = +(resampled[0][-1]);
+		resMx2[k] = +(resampled[1][-1]);
+        SetParameter (STATUS_BAR_STATUS_STRING, "Drawing resampled likelihoods for segments " + pccounter + " and " + pc2 + "("+k+"/"+itCound+" done)",0);
+	}
+	
+	resMx = (resMx1-resMx2)*2;
+    return resMx + (+resMx) * (-1/itCount);
+}
diff --git a/res/TemplateBatchFiles/GARD_GA_CHC.ibf b/res/TemplateBatchFiles/GARD_GA_CHC.ibf
new file mode 100644
index 0000000..cc97624
--- /dev/null
+++ b/res/TemplateBatchFiles/GARD_GA_CHC.ibf
@@ -0,0 +1,446 @@
+/*---------------------------------------------------------------------------------------------------------------------------------------------
+  SPAWN INITIAL POPULATION; IT IS STORED AS GENERATING MATRICES
+---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+resultProcessingContext = 0;
+compressedString 		= {};
+optimizeBLFlag 			= 1;
+
+if (currentBPC == startAtBreakpoint)
+{
+	for (individual=0; individual<(populationSize-1) && individual<Abs(predef); individual = individual + 1)
+	{
+		aChild = Transpose(MakeStringCanonical (predef[individual],rateClassesCount));
+		aaRateMultipliers = StringToMatrix(aChild);
+		sortedScores[individual+1][1] = individual+1;
+		currentPopulation[individual+1] = aChild;
+		cString = aChild;
+		RunASample (compressedString[rateClassesCount-1],individual+1);
+	}
+
+	optimizeBLFlag = 0;
+}
+
+hitCount = 0;
+
+for (individual=individual+1; individual<populationSize && (currentBPC == startAtBreakpoint || individual < populationSize $ 2); individual=individual+1)
+{
+	cString 						= IsChildViable (SpawnRandomString(rateClassesCount));
+	aaRateMultipliers 				= StringToMatrix(cString);
+	sortedScores[individual][1] 	= individual;
+	currentPopulation[individual] 	= cString;
+	RunASample (compressedString[rateClassesCount-1],individual);
+}
+
+CleanUpMPI (0);
+
+sortedScores = sortedScores%0;
+sampleProbs = {populationSize,1};
+
+doMutation = 0;
+
+lastImprovedGeneration   = 0;
+lastBestAIC		  		 = 1e100;
+lastBranchAIC		     = currentBEST_IC;
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------
+  RUNS THE CHC;
+---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+for (generation=0; generation<generationCount; generation=generation+1)
+{	
+	timeSoFar = Time(1)-startTimer;
+	timeLeft  = maxTimeAllowed - timeSoFar;
+	if (timeLeft < 0)
+	{
+		break;
+	}
+	
+	percDone = 100*(generation-lastImprovedGeneration)/stoppingCriterion$1;		  	
+
+	byBPImprovement [currentBPC] = currentBEST_IC+sortedScores[populationSize-1][0];
+	byBPSplits		[currentBPC] = ConvertToPart (currentPopulation[populationSize-1]);
+
+	fprintf (stdout, "\nGENERATION ", generation+2, " with ", currentBPC, " breakpoints (~",percDone,"% converged)\n");
+						   
+	fprintf (stdout, "Breakpoints    c-AIC  Delta c-AIC");
+	for (_lc = 0; _lc < currentBPC; _lc = _lc+1)
+	{
+		fprintf (stdout, " [BP ", Format (_lc+1, 6,0), "]");
+	}
+	fprintf (stdout, "\n");
+	
+	lastCAIC = byBPImprovement[0];
+	for (_partCount = 0; _partCount <Abs (byBPImprovement); _partCount = _partCount + 1)
+	{
+		if (_partCount)
+		{
+			fprintf (stdout, Format (_partCount, 11, 0)," ", Format (lastCAIC-byBPImprovement [_partCount],8,2), "  ", Format (byBPImprovement [_partCount],11,3) );
+			bpLocs2    = byBPSplits		 [_partCount];
+			for (_lc = 0; _lc < Rows(bpLocs2); _lc = _lc+1)
+			{
+				fprintf (stdout, "  ", Format (bppMap[bpLocs2[_lc]], 9,0), " ");
+			}
+			fprintf (stdout, "\n");
+			lastCAIC = lastCAIC-byBPImprovement [_partCount];
+		}
+		else
+		{
+			fprintf (stdout, Format (_partCount, 11, 0)," ", Format (byBPImprovement [_partCount],8,2), "\n");
+		}
+		
+	}
+
+	percDone = 100*(generation-lastImprovedGeneration)/stoppingCriterion$1;		  	
+			  	
+	fprintf (stdout, "GA has considered        ", Abs (MasterList)-current_BPP_done_counter, "/", Format(totalModelCounter,12,0), " (", Abs (MasterList) ," over all runs) unique models\n",
+					 "Total run time           ", timeSoFar$3600, " hrs ", timeSoFar%3600$60, " mins ", timeSoFar%60, " seconds\n",
+					 "Throughput               ", Format (Abs(MasterList)/timeSoFar, 5, 2), " models/second\n", 
+					 "Allocated time remaining ", timeLeft$3600, " hrs ", timeLeft%3600$60, " mins ", timeLeft%60, " seconds (approx. ", Abs(MasterList)/timeSoFar*timeLeft, " more models.)\n");
+	
+						  
+	if ((generation+1) % annealingPhase == 0)
+	{
+		mutationProb = Max(0.01,mutationProb*mutationProbDecrease);
+	}
+	doRepop = 1;
+	doLocalMutation = generation-lastImprovedGeneration;
+	doLocalMutation = doLocalMutation*((doLocalMutation % localMutationInterval) == 0);
+	if (doMutation || doLocalMutation)
+	{
+		resultProcessingContext = 0;
+		if (doLocalMutation)
+		{
+			mutProb = localMutationRate;
+		}
+		else
+		{
+			mutProb = mutationProb;
+		}
+		for (individual=populationSize-2; individual>=0; individual=individual-1)
+		{
+			goOn = 1;
+			hitCount = 0;
+			while (goOn)
+			{
+				mpos = 0;
+				goOn 	= 0;
+				if (!doLocalMutation)
+				{
+					cString = currentPopulation[individual];
+				}
+				else
+				{
+					cString = currentPopulation[populationSize-1];
+				}
+				for (h=0; h<stateVectorDimension; h=h+1)
+				{
+					if (Random(0,1)<mutProb)
+					{
+						 newVal = cString[h];
+						 while (newVal == cString[h])
+						 {
+						 	newVal = Random (0,rateClassesCount)$1;
+						 }
+						 cString[h] = newVal;
+						 mpos = mpos + 1;
+					}
+				}
+				for (v=0; v<populationSize; v=v+1)
+				{
+					if (Abs(cString-currentPopulation[v])==0)
+					{
+						if (hitCount < 20)
+						{
+							hitCount = hitCount+1;
+							goOn = 1;
+						}
+						else
+						{
+							hitCount = 0;
+							goOn = 0;
+						}
+						break;
+					}
+				}
+			}
+			if (verboseFlag)
+			{
+				fprintf (stdout, "Mutated ", Format (mpos, 4, 0), " position in individual ", individual+1, "\n");
+			}
+			cString = IsChildViable		  (MakeStringCanonical (cString,rateClassesCount));
+			aaRateMultipliers = StringToMatrix(cString);
+			sortedScores[individual][1] = individual;
+			currentPopulation[individual] = cString;
+			RunASample (compressedString[rateClassesCount-1],individual);
+		}		
+		CleanUpMPI (0);
+		doMutation = 0;
+		sortedScores = sortedScores%0;
+	}
+	/* compute selection probabilities */
+	/*ExportAMatrix (modelFile,StringToMatrix(currentPopulation[populationSize-1]),1);*/
+	resultProcessingContext = 1;
+	fitnessSum = 0;
+	intermediateProbs = {populationSize+produceOffspring,2};
+        
+    if (matingChoice == 3)
+    {
+		lmatingChoice = Random(0,2.9999999999999)$1;
+	}
+	else
+	{
+		lmatingChoice = matingChoice;
+	}
+	
+	for (individual=0; individual<populationSize; individual=individual+1)
+	{
+		if (lmatingChoice==0)
+		{
+			sampleProbs[individual] = Exp((sortedScores[individual][0]-sortedScores[populationSize-1][0])/2);
+		}
+		else
+		{
+			if (lmatingChoice == 1)
+			{
+				sampleProbs[individual] = 1;		
+			}
+			else
+			{
+				sampleProbs[individual] = 2*(individual+1);					
+			}
+		}
+		intermediateProbs[individual][0] = sortedScores[individual][0];
+		intermediateProbs[individual][1] = sortedScores[individual][1];
+		fitnessSum = fitnessSum + sampleProbs[individual];
+	}
+	
+	genBestAIC = -sortedScores[populationSize-1][0];
+	
+	if (verboseFlag)
+	{
+    	fprintf (stdout, "\n", lastBranchAIC, "\t", genBestAIC, "\n");
+	}
+	
+	if (genBestAIC + 0.001 < lastBestAIC)
+	{
+		if (lastBranchAIC-genBestAIC > 10)
+		{
+			UpdateBL (0);
+			lastBranchAIC = -sortedScores[populationSize-1][0];
+			intermediateProbs[populationSize-1][0] = -lastBranchAIC;
+			genBestAIC = lastBestAIC;
+		}
+		lastBestAIC = -sortedScores[populationSize-1][0];
+		lastImprovedGeneration = generation;
+	} 
+	else
+	{
+		if (generation-lastImprovedGeneration>=stoppingCriterion)
+		{
+			break;
+		}
+	}
+	
+	sampleProbs = sampleProbs*(1/fitnessSum);
+	
+	if (verboseFlag)
+	{
+		fprintf (stdout, "\nMating probabilities\n");
+		for (individual=0; individual<populationSize; individual=individual+1)
+		{
+			if (verboseFlag)
+			{
+				fprintf (stdout, "Individual ", Format(individual,3,0), ", sorted ", Format(sortedScores[individual][1],3,0), ". c-AIC: ", 
+								  Format (sortedScores[individual][0], 8, 3), ", mating prob ", Format (sampleProbs[individual],6,4), ".\n");
+			}
+		}
+	}
+	
+	children 	   = {};
+	pairwiseCounts = {populationSize,populationSize};
+
+	for (individual=0; individual<produceOffspring; individual=individual+1)
+	{
+		/* pick two individuals to produce offspring */
+		/* pick 1st parent */
+		h 			       = Random (0,1);
+		fitnessSum		   = sampleProbs[0];
+		v = 0;
+		while (fitnessSum < h)
+		{
+			v = v+1;
+			fitnessSum = fitnessSum + sampleProbs[v];
+		}
+
+		p1 			   = sortedScores[v][1];
+		ps1			   = currentPopulation[p1];
+		goOn 		   = 1;
+		
+		disallowedProbs 	= sampleProbs[v];
+		
+		for (sampleTry = 0; (sampleTry < maxSampleTries) && goOn; sampleTry = sampleTry + 1)
+		{
+			goOn 		   = 0;
+			if (disallowedProbs<1)
+			{
+				h 			   = Random (0,1-disallowedProbs);
+				if (v == 0)
+				{
+					fitnessSum	   = 0;			
+				}
+				else
+				{
+					fitnessSum	   = sampleProbs[0];
+				}
+				
+				v2 = 0;
+				while (fitnessSum < h)
+				{
+					v2 = v2 + 1;
+					if (v2 == populationSize)
+					{
+						while (v2==v)
+						{
+							v2 = Min(Random (0,populationSize)$1,populationSize-1);
+						}
+						break;
+					}
+					if (v2!=v)
+					{
+						fitnessSum = fitnessSum + sampleProbs[v2];
+					}
+				}	
+			}
+			else
+			{
+				v2 = v;
+				while (v2==v)
+				{
+					v2 = Min(Random (0,populationSize)$1,populationSize-1);
+				}
+			}
+			
+			if (v2 == populationSize)
+			{
+				goOn = 1;
+				continue;
+			}
+			
+			while (pairwiseCounts[v][v2] > familyControlSize)
+			{
+				v2 =  Min(Random (0,populationSize)$1,populationSize-1);
+			}
+			
+			p2 = sortedScores[v2][1];
+			ps2			   = currentPopulation[p2];
+			fitnessSum 	   = 0;
+			
+			for (h=0; h<stateVectorDimension; h=h+1)
+			{
+				if (ps1[h] != ps2[h])
+				{
+					fitnessSum = fitnessSum+1;
+					/*if (incestDistance<fitnessSum)
+					{
+						break;
+					}*/
+				}
+			}
+			if (incestDistance>=fitnessSum)
+			{
+				goOn = 1;
+			}
+			else
+			{
+				pairwiseCounts[v][v2] = pairwiseCounts[v][v2] + 1;
+				pairwiseCounts[v2][v] = pairwiseCounts[v2][v] + 1;
+			}
+		}
+		
+		if (sampleTry == maxSampleTries)
+		{
+			doMutation = 1;
+			generation = generation - 1;
+			CleanUpMPI (0);
+			doRepop = 0;
+			break;
+		}
+		else
+		{
+			if (verboseFlag)
+			{
+				fprintf (stdout, "Mating ", p1, " and ", p2, ". Difference of ", fitnessSum, " positions\n");
+			}
+			aChild = {stateVectorDimension,1};
+			for (h=0; h<stateVectorDimension; h=h+1)
+			{
+				if (ps1[h] == ps2[h])
+				{
+					aChild[h] = ps1[h];
+				}
+				else
+				{
+					if (Random(0,1)<0.5)
+					{
+						aChild[h] = ps1[h];
+					}
+					else
+					{
+						aChild[h] = ps2[h];					
+					}
+				}
+			}
+			aChild = MakeStringCanonical (aChild,rateClassesCount);
+			aChild = IsChildViable (aChild);
+			aaRateMultipliers = StringToMatrix(aChild);
+			intermediateProbs[populationSize+individual][1] = populationSize+individual;
+			children  [individual] = aChild;
+			cString = aChild;
+			RunASample (compressedString[rateClassesCount-1],populationSize+individual);
+		}
+	}
+	CleanUpMPI (0);
+	if (doRepop)
+	{
+		newPop = {};
+		intermediateProbs = intermediateProbs%0;
+		for (h=produceOffspring; h<populationSize+produceOffspring; h=h+1)
+		{
+			v = intermediateProbs[h][1];
+			sortedScores[h-produceOffspring][1] = h-produceOffspring;
+			sortedScores[h-produceOffspring][0] = intermediateProbs[h][0];		
+			if (v<populationSize)
+			{
+				newPop[h-produceOffspring] = currentPopulation[v];
+			}
+			else
+			{
+				newPop[h-produceOffspring] = children[v-populationSize];
+			}
+		}
+		for (h=0; h<populationSize; h=h+1)
+		{
+			currentPopulation[h] = newPop[h];
+		}
+		
+		h = Abs((sortedScores[populationSize-1][0]-sortedScores[0][0])/sortedScores[0][0]);
+		if (verboseFlag)
+		{
+			fprintf (stdout, "Diversity level: ", h, " (hypermutation threshold: ", mutationThreshhold, ")\n");	
+		}
+		if (h<mutationThreshhold)
+		{
+			if (verboseFlag)
+			{
+				fprintf (stdout, "\nTriggered hypermutation...\n");
+			}
+			doMutation = 1;
+			generation = generation - 1;
+		}
+	}
+	if (Abs(MasterList)-current_BPP_done_counter >= totalModelCounter)
+	{
+		break;
+	}
+}
diff --git a/res/TemplateBatchFiles/GARecomb.bf b/res/TemplateBatchFiles/GARecomb.bf
new file mode 100644
index 0000000..3c27bd9
--- /dev/null
+++ b/res/TemplateBatchFiles/GARecomb.bf
@@ -0,0 +1,973 @@
+partCount				= 2;
+
+produceOffspring		= MPI_NODE_COUNT-1;
+populationSize  		= 2*produceOffspring;
+incestDistance  		= 0;
+generationCount		  	= 5000;
+maxSampleTries			= populationSize*10;
+mutationThreshhold		= 0.0001;
+mutationProb			= 0.15;
+mutationProbDecrease	= 0.95;
+annealingPhase			= 100;
+SHORT_MPI_RETURN		= 1;
+totalSampleCounter		= 0;
+localMutationRate		= 0.05;
+localMutationInterval	= 20;
+shortestAllowedSegment  = 20;
+
+stoppingCriterion		= 100;
+sampleCount				= 0;
+familyControlSize		= produceOffspring$6;
+
+verboseFlag				= 0;
+stateVectorDimension    = 120;
+rateClassesCount		= 2;
+
+/* ________________________________________________________________________________________________*/
+
+MasterList				= {};
+REPLACE_TREE_STRUCTURE  = 1;
+bppMap					= {};
+SHORT_MPI_RETURN		= 1;
+totalBitSize			= 0;
+
+/* ________________________________________________________________________________________________*/
+
+
+function InitializeDistances (dummy)
+{
+	HarvestFrequencies (_dNucFreq,filteredData,1,1,0);
+	_d_fR = _dNucFreq[0]+_dNucFreq[2];
+	_d_fY = _dNucFreq[1]+_dNucFreq[3];
+	
+	if (_dNucFreq[0] == 0 || _dNucFreq[1] == 0 || _dNucFreq[2] == 0 || _dNucFreq[3] == 0)
+	{
+		_useK2P = 1;
+	}
+	else
+	{
+		_d_TN_K1 = 2*_dNucFreq[0]*_dNucFreq[2]/_d_fR;
+		_d_TN_K2 = 2*_dNucFreq[1]*_dNucFreq[3]/_d_fY;
+		_d_TN_K3 = 2*(_d_fR*_d_fY-_dNucFreq[0]*_dNucFreq[2]*_d_fY/_d_fR-_dNucFreq[1]*_dNucFreq[3]*_d_fR/_d_fY);
+		_useK2P = 0;
+	}
+	
+	
+	summingVector = {{1}{1}{1}{1}};
+
+	return 0;
+}
+
+/* ________________________________________________________________________________________________*/
+
+function ComputeDistanceFormula (s1,s2)
+{
+	GetDataInfo (siteDifferenceCount, filteredData, s1, s2, DIST);
+	
+	totalSitesCompared = Transpose(summingVector)*(siteDifferenceCount*summingVector);
+	totalSitesCompared = totalSitesCompared[0];
+	
+	if (_useK2P)
+	{
+		_dTransitionCounts 	 =    siteDifferenceCount[0][2]+siteDifferenceCount[2][0]  /* A-G and G-A */
+								 +siteDifferenceCount[1][3]+siteDifferenceCount[3][1]; /* C-T and T-C */
+							
+		_dTransversionCounts = (siteDifferenceCount[0][0]+siteDifferenceCount[1][1]+siteDifferenceCount[2][2]+siteDifferenceCount[3][3])+_dTransitionCounts;
+		
+		_dTransitionCounts	 = _dTransitionCounts/totalSitesCompared;
+		_dTransversionCounts = 1-_dTransversionCounts/totalSitesCompared;
+		
+		_d1C = 1-2*_dTransitionCounts-_dTransversionCounts;
+		_d2C = 1-2*_dTransversionCounts;
+		
+		if (_d1C>0 && _d2C>0)
+		{
+			return -(0.5*Log(_d1C)+.25*Log(_d2C));	
+		}
+	}
+	else
+	{
+		_dAGCounts 	 =    siteDifferenceCount[0][2]+siteDifferenceCount[2][0]  /* A-G and G-A */;
+		_dCTCounts	 = 	  siteDifferenceCount[1][3]+siteDifferenceCount[3][1]; /* C-T and T-C */
+							
+		_dTransversionCounts = (siteDifferenceCount[0][0]+siteDifferenceCount[1][1]+siteDifferenceCount[2][2]+
+								siteDifferenceCount[3][3])+_dAGCounts+_dCTCounts;
+		
+		_dAGCounts	 = _dAGCounts/totalSitesCompared;
+		_dCTCounts	 = _dCTCounts/totalSitesCompared;
+		
+		_dTransversionCounts = 1-_dTransversionCounts/totalSitesCompared;
+		
+		_d1C = 1-_dAGCounts/_d_TN_K1-0.5*_dTransversionCounts/_d_fR;
+		_d2C = 1-_dCTCounts/_d_TN_K2-0.5*_dTransversionCounts/_d_fY;
+		_d3C = 1-0.5*_dTransversionCounts/_d_fY/_d_fR;
+		
+		if ((_d1C>0)&&(_d2C>0)&&(_d3C>0))
+		{
+			return -_d_TN_K1*Log(_d1C)-_d_TN_K2*Log(_d2C)-_d_TN_K3*Log(_d3C);
+		}
+	}
+	
+	return 1000;
+}
+
+
+/* ________________________________________________________________________________________________*/
+
+function TreeMatrix2TreeString (doLengths)
+{
+	treeString = "";
+	p = 0;
+	k = 0;
+	m = treeNodes[0][1];
+	n = treeNodes[0][0];
+	d = treeString*(Rows(treeNodes)*25);
+
+	while (m)
+	{	
+		if (m>p)
+		{
+			if (p)
+			{
+				d = treeString*",";
+			}
+			for (j=p;j<m;j=j+1)
+			{
+				d = treeString*"(";
+			}
+		}
+		else
+		{
+			if (m<p)
+			{
+				for (j=m;j<p;j=j+1)
+				{
+					d = treeString*")";
+				}
+			}	
+			else
+			{
+				d = treeString*",";
+			}	
+		}
+		if (n<filteredData.species)
+		{
+			GetString (nodeName, filteredData, n);
+			d = treeString*nodeName;
+		}
+		if (doLengths>.5)
+		{
+			nodeName = ":"+treeNodes[k][2];
+			d = treeString*nodeName;
+		}
+		k=k+1;
+		p=m;
+		n=treeNodes[k][0];
+		m=treeNodes[k][1];
+	}
+
+	for (j=m;j<p;j=j+1)
+	{
+		d = treeString*")";
+	}
+	
+	d=treeString*0;
+	return treeString;
+}
+
+/* ________________________________________________________________________________________________*/
+
+
+
+function InferTreeTopology(verbFlag)
+{
+	distanceMatrix = {filteredData.species,filteredData.species};
+	dummy = InitializeDistances (0);
+		
+	for (i = 0; i<filteredData.species; i=i+1)
+	{
+		for (j = i+1; j<filteredData.species; j = j+1)
+		{
+			distanceMatrix[i][j] = ComputeDistanceFormula (i,j);
+		}
+	}
+
+	MESSAGE_LOGGING 		 	= 1;
+	cladesMade 					= 1;
+	
+
+	if (filteredData.species == 2)
+	{
+		d1 = distanceMatrix[0][1]/2;
+		treeNodes = {{0,1,d1__},
+					 {1,1,d1__},
+					 {2,0,0}};
+					 
+		cladesInfo = {{2,0}};
+	}
+	else
+	{
+		if (filteredData.species == 3)
+		{
+			d1 = (distanceMatrix[0][1]+distanceMatrix[0][2]-distanceMatrix[1][2])/2;
+			d2 = (distanceMatrix[0][1]-distanceMatrix[0][2]+distanceMatrix[1][2])/2;
+			d3 = (distanceMatrix[1][2]+distanceMatrix[0][2]-distanceMatrix[0][1])/2;
+			treeNodes = {{0,1,d1__},
+						 {1,1,d2__},
+						 {2,1,d3__}
+						 {3,0,0}};
+						 
+			cladesInfo = {{3,0}};		
+		}
+		else
+		{	
+			njm = (distanceMatrix > methodIndex)>=filteredData.species;
+				
+			treeNodes 		= {2*(filteredData.species+1),3};
+			cladesInfo	    = {filteredData.species-1,2};
+			
+			for (i=Rows(treeNodes)-1; i>=0; i=i-1)
+			{
+				treeNodes[i][0] = njm[i][0];
+				treeNodes[i][1] = njm[i][1];
+				treeNodes[i][2] = njm[i][2];
+			}
+
+			for (i=Rows(cladesInfo)-1; i>=0; i=i-1)
+			{
+				cladesInfo[i][0] = njm[i][3];
+				cladesInfo[i][1] = njm[i][4];
+			}
+			
+			njm = 0;
+		}
+	}
+	distanceMatrix = 0;
+	
+	return 1.0;
+}
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function StringToMatrix (zz)
+{
+	return zz;
+}
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function ExportAMatrix (fileName, rateMatrix,dummy)
+{
+	if (dummy == 1)
+	{
+		return 0;
+	}
+	
+	sortedBP = ConvertToPart (rateMatrix);
+	
+	if (dataType)
+	{
+		bpF = 0;
+	}	
+	else
+	{
+		bpF = -1;
+	}
+	ConstraintString = "";
+	ConstraintString * 8192;
+	
+	for (h=0; h<v; h=h+1)
+	{
+		bpF2 = sortedBP[h];
+		bpF2 = bppMap[bpF2];
+		if (dataType)
+		{
+			filterString = ""+(3*bpF)+"-"+(3*bpF2-1);
+		}
+		else
+		{
+			filterString = ""+(bpF+1)+"-"+bpF2;		
+		}
+		DataSetFilter filteredData = CreateFilter(ds,1,filterString);
+		InferTreeTopology (0);
+		treeString=TreeMatrix2TreeString(0);
+		ConstraintString * (filterString+"\n"+treeString+"\n\n");
+		bpF = bpF2;
+	}
+	
+	if ((bpF2<ds.sites && (dataType == 0)) || (3*bpF2<ds.sites && dataType))
+	{
+		if (dataType)
+		{
+			filterString = ""+(3*bpF2)+"-"+(ds.sites-1);
+		}
+		else
+		{
+			filterString = ""+(bpF2+1)+"-"+(ds.sites-1);
+		}
+		DataSetFilter filteredData = CreateFilter(ds,1,filterString);
+		InferTreeTopology (0);
+		treeString=TreeMatrix2TreeString(0);
+		ConstraintString * (filterString+"\n"+treeString+"\n\n");
+	}
+
+	ConstraintString * 0;
+	
+	fprintf (fileName, CLEAR_FILE,ConstraintString);
+	return 0;
+}
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function CleanUpMPI (dummy)
+{
+	if (MPI_NODE_COUNT>1)
+	{
+		while (1)
+		{
+			for (nodeCounter = 0; nodeCounter < MPI_NODE_COUNT-1; nodeCounter = nodeCounter+1)
+			{
+				if (MPINodeState[nodeCounter][0]==1)
+				{
+					fromNode = ReceiveJobs (0,0);
+					break;	
+				}
+			}
+			if (nodeCounter == MPI_NODE_COUNT-1)
+			{
+				break;
+			}
+		}			
+	}
+	return 0;
+}
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function ReceiveJobs (sendOrNot, ji)
+{
+	if (MPI_NODE_COUNT>1)
+	{
+		MPIReceive (-1, fromNode, result_String);
+		mji = MPINodeState[fromNode-1][1];
+		
+		if (sendOrNot)
+		{
+			MPISend (fromNode,lf);
+			MPINodeState[fromNode-1][1] = ji;			
+		}
+		else
+		{
+			MPINodeState[fromNode-1][0] = 0;
+			MPINodeState[fromNode-1][1] = -1;		
+		}
+		ExecuteCommands (result_String);
+		myDF  = lf_MLES[1][1]+baseParams;
+		myAIC = 2*(lf_MLES[1][0]-myDF*(baseSites/(baseSites-myDF-1)));
+		ji = mji;
+	}
+	else
+	{
+		myDF  = res[1][1]+baseParams;
+		myAIC = 2*(res[1][0]-myDF*(baseSites/(baseSites-myDF-1)));
+	}
+	
+	sortedBP = {{-1}};
+	if (resultProcessingContext==0)
+	{
+		sortedScores[ji][0] = myAIC;
+		if (ji>=0)
+		{
+			jobPrint = ConvertToPartString (currentPopulation[ji]);
+			sortedBP = ConvertToPart (currentPopulation[ji]);
+			v = Rows (sortedBP);
+		}
+		if (verboseFlag)
+		{
+			fprintf (stdout, "Individual ",ji," AIC-c = ",-myAIC," ");
+		}
+	}
+	else
+	{
+		intermediateProbs[ji][0] = myAIC;	
+		if (ji>=0)
+		{
+			jobPrint = ConvertToPartString (children[ji-populationSize]);
+			sortedBP = ConvertToPart (children[ji-populationSize]);
+			v = Rows (sortedBP);
+		}
+		if (verboseFlag)
+		{
+			fprintf (stdout, "Offspring ",ji," AIC-c = ",-myAIC," ");
+		}
+	}
+	
+	if (sortedBP[0]>=0)
+	{
+		if (dataType)
+		{
+			bpF = 0;
+		}
+		else
+		{
+			bpF = -1;
+		}
+		filterString = "";
+		for (h=0; h<v; h=h+1)
+		{
+			bpF2 = sortedBP[h];
+			bpF2 = bppMap[bpF2];
+			if (dataType)
+			{
+				filterString = filterString+" "+(3*bpF)+"-"+(3*bpF2-1);
+			}
+			else
+			{
+				filterString = filterString+" "+(bpF+1)+"-"+bpF2;			
+			}
+			bpF = bpF2;
+		}
+		
+		if ((bpF2<ds.sites && (dataType == 0)) || (bpF2<3*ds.sites && dataType))
+		{
+			if (dataType)
+			{
+				filterString = filterString+" "+(3*bpF2)+"-"+(ds.sites-1);
+			}
+			else
+			{
+				filterString = filterString+" "+(bpF2+1)+"-"+(ds.sites-1);			
+			}
+		}
+
+		if (verboseFlag)
+		{
+			fprintf (stdout, " ", filterString, "\n");
+		}
+
+		MasterList [jobPrint] = myAIC;
+	}
+	return fromNode-1;
+}
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+compressedString = {{1,1}};
+
+function MakeStringCanonical (someString, dummy)
+{
+	return someString;
+}
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function ConvertToPart (pString)
+{
+	partitionHits    = {};
+	h = 0; 
+	v = bppSize;
+	
+	for (mpiNode=0; mpiNode<partCount; mpiNode=mpiNode+1)
+	{
+		aBP    = 0;
+		bpF	   = 2^(bppSize-1);
+		
+		for (; h<v; h=h+1)
+		{
+			aBP = aBP + bpF*(0+pString[h]);
+			bpF = bpF/2;
+		}
+		
+		if (aBP>Abs(bppMap))
+		{
+			aBP = aBP - 2^(bppSize-1);
+		}
+		
+		v = v + bppSize;
+		
+		if (partitionHits[aBP] == 0)
+		{
+			partitionHits[aBP] = 1;
+		}
+	}
+
+	meKeys	 = Rows(partitionHits);
+	
+	v = Columns(meKeys);
+	
+	sortedBP = {v,1};
+	
+	for (h=0; h<v; h=h+1)
+	{
+		sortedBP [h] = 0+meKeys[h];
+	}
+	sortedBP = sortedBP % 0;
+	return sortedBP;
+}
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function ConvertToPartString (pString)
+{
+	sortedBP = ConvertToPart (pString);
+	if (dataType)
+	{
+		bpF = 0;	
+	}
+	else
+	{
+		bpF = -1;
+	}
+	
+	minPartLength 	  = 1e100;
+	
+	_ConstraintString = "";
+	_ConstraintString * 256;
+	
+
+	for (h=0; h<v; h=h+1)
+	{
+		bpF2 = sortedBP[h];
+		bpF2 = bppMap[bpF2];
+		if ((h>0) + sortedBP[h])
+		{
+			if (h)
+			{
+				_ConstraintString * ",";
+			}
+			if (dataType)
+			{
+				_ConstraintString * (""+(3*bpF)+"-"+(3*bpF2-1));		
+				curSegLength = 3*(bpF2-bpF);
+			}		
+			else
+			{
+				_ConstraintString * (""+(bpF+1)+"-"+bpF2);		
+				curSegLength = bpF2-bpF;
+			}
+			bpF = bpF2;
+		}
+		else
+		{
+			bpF2 = 0;
+			curSegLength = 0;
+		}
+		if (curSegLength < minPartLength && curSegLength>0)
+		{
+			minPartLength = curSegLength;
+		}
+	}
+	
+	if ((bpF2<ds.sites && (dataType == 0)) || (bpF2<3*ds.sites && dataType))
+	{
+		if (dataType)
+		{
+			_ConstraintString * (","+(3*bpF2)+"-"+(ds.sites-1));
+			curSegLength = ds.sites-3*bpF2;
+		}
+		else
+		{
+			_ConstraintString * (","+(bpF2+1)+"-"+(ds.sites-1));		
+			curSegLength = ds.sites-bpF2;
+		}
+		if (curSegLength < minPartLength && curSegLength>0)
+		{
+			minPartLength = curSegLength;
+		}
+	}
+
+	_ConstraintString * 0;
+	return _ConstraintString;
+}
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function RunASample (dummy,jobIndex)
+{	
+	sortedBP = ConvertToPart (cString);
+	v = Rows (sortedBP);
+
+	if (dataType)
+	{
+		bpF = 0;	
+	}
+	else
+	{
+		bpF = -1;
+	}
+	ConstraintString = "";
+	LikelihoodFunctionString = "";
+	ConstraintString * 8192;
+	LikelihoodFunctionString * 256;
+	LikelihoodFunctionString* "LikelihoodFunction lf=(";
+	
+
+	for (h=0; h<v; h=h+1)
+	{
+		bpF2 = sortedBP[h];
+		bpF2 = bppMap[bpF2];
+		if (dataType)
+		{
+			filterString = ""+(3*bpF)+"-"+(3*bpF2-1);
+		}
+		else
+		{
+			filterString = ""+(bpF+1)+"-"+bpF2;		
+		}
+		ConstraintString * ("DataSetFilter filteredData = CreateFilter(ds,1,\""+filterString+"\");");
+		if (dataType)
+		{
+			ConstraintString * ("DataSetFilter filteredData"+h+" = CreateFilter (ds,3,\""+filterString+"\",\"\",GeneticCodeExclusions);");		
+		}
+		else
+		{
+			ConstraintString * ("DataSetFilter filteredData"+h+" = CreateFilter (ds,1,\""+filterString+"\");");
+		}
+		ConstraintString * ("InferTreeTopology (0);treeString=TreeMatrix2TreeString(0);Tree givenTree"+h+" = treeString;");
+							
+		if (h)
+		{
+			LikelihoodFunctionString * ",";
+		}
+		LikelihoodFunctionString * ("filteredData" + h + ",givenTree"+h);
+		bpF = bpF2;
+	}
+	
+	if ((bpF2<ds.sites && (dataType == 0)) || (bpF2<3*ds.sites && dataType))
+	{
+		if (dataType)
+		{
+			filterString = ""+(3*bpF2)+"-"+(ds.sites-1);
+		}
+		else
+		{
+			filterString = ""+(bpF2+1)+"-"+(ds.sites-1);		
+		}
+
+		ConstraintString * ("DataSetFilter filteredData = CreateFilter(ds,1,\""+filterString+"\");");
+		if (dataType)
+		{
+			ConstraintString * ("DataSetFilter filteredData"+h+" = CreateFilter (ds,3,\""+filterString+"\",\"\",GeneticCodeExclusions);");		
+		}
+		else
+		{
+			ConstraintString * ("DataSetFilter filteredData"+h+" = CreateFilter (ds,1,\""+filterString+"\");");
+		}
+		ConstraintString * ("InferTreeTopology (0);treeString=TreeMatrix2TreeString(0);Tree givenTree"+h+" = treeString;");
+
+		LikelihoodFunctionString * (",filteredData" + h + ",givenTree"+h);
+	}
+
+
+	LikelihoodFunctionString * (");");
+
+	ConstraintString * 0;
+	LikelihoodFunctionString * 0;
+	
+	partMap = ConvertToPartString (cString);
+	myAIC = MasterList[partMap];
+	if (myAIC<0)
+	{		
+		if (resultProcessingContext==0)
+		{
+			sortedScores[jobIndex][0] = myAIC;
+			if (verboseFlag)
+			{
+				fprintf (stdout, "Individual ",jobIndex," AIC-c = ",-myAIC, "\n");
+			}
+		}
+		else
+		{
+			intermediateProbs[jobIndex][0] = myAIC;	
+			if (verboseFlag)
+			{
+				fprintf (stdout, "Offspring ",jobIndex," AIC-c = ",-myAIC,"\n");
+			}
+		}	
+	}
+	else
+	{
+		ExecuteCommands (ConstraintString);
+		ExecuteCommands (LikelihoodFunctionString);
+		if ((MPI_NODE_COUNT>1) && (jobIndex>=0))
+		{
+			for (mpiNode = 0; mpiNode < MPI_NODE_COUNT-1; mpiNode = mpiNode+1)
+			{
+				if (MPINodeState[mpiNode][0]==0)
+				{
+					break;	
+				}
+			}
+			if (mpiNode==MPI_NODE_COUNT-1)
+			{
+				mpiNode = ReceiveJobs (1,jobIndex);
+			}
+			else
+			{
+				MPISend (mpiNode+1,lf);
+				MPINodeState[mpiNode][0] = 1;
+				MPINodeState[mpiNode][1] = jobIndex;
+			}
+		}
+		else
+		{
+			Optimize (res,lf);
+			if (jobIndex>=0)
+			{
+				mpiNode = ReceiveJobs (1, jobIndex);
+			}
+			else
+			{
+				myAIC = 2*(res[1][0]-res[1][1]-baseParams);
+			}
+		}
+	}
+	return 0;	
+}
+
+
+
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function SpawnRandomString (clsCnt)
+{
+	rModel = {totalBitSize,1};
+	for (h=0; h<totalBitSize; h=h+1)
+	{
+		rModel[h] = Random(0,2)$1;
+	}
+	return rModel;
+}
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function IsChildViable (putativeChild)
+{
+	sampleString = 	ConvertToPartString (putativeChild);
+
+	myAIC = MasterList[sampleString];
+	testChild = putativeChild;
+	mutPassCount = 1;
+	while ((myAIC<(-0.1) || minPartLength<shortestAllowedSegment)&& mutPassCount < 25)
+	{
+		if (verboseFlag > 1)
+		{
+			fprintf (stdout,"Adjusting the child to avoid a duplicate. Min(fragment) = ",minPartLength,".  Pass ", mutPassCount, "\n");
+		}
+		
+		mutPassCount = mutPassCount + 1;
+		
+		sampleString = Min(Random(0,stateVectorDimension)$1,stateVectorDimension-1);
+		myAIC = testChild[sampleString];
+		
+		newValue = Random (0,rateClassesCount-0.0000001)$1;
+		
+		while (newValue == myAIC)
+		{
+			newValue = Random (0,rateClassesCount-0.0000001)$1;
+		}
+		
+		testChild [sampleString] = newValue;
+		sampleString = 	ConvertToPartString (testChild);
+		myAIC = MasterList[sampleString];
+	}
+	return testChild;
+}
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function UpdateBL (dummy)
+{
+	return 0;
+}
+
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+
+ChoiceList (dataType,"Data type",1,SKIP_NONE,"Nucleotide","Nucleotide data.",
+				     "Codon","Codon (several available genetic codes).");
+
+if (dataType<0) 
+{
+	return;
+}
+
+if (dataType==0)
+{
+	SetDialogPrompt 	  		  ("Locate a nucleotide data  file:");
+}
+else
+{
+	SetDialogPrompt 	  		  ("Locate a codon data file:");
+}
+
+DataSet 		ds  		 = ReadDataFile (PROMPT_FOR_FILE);
+fprintf (stdout, "\nRead ", ds.species, " sequences and ", ds.sites, " sites.\n");
+DataSetFilter	filteredData = CreateFilter(ds,1);
+
+InferTreeTopology (0);
+treeString = TreeMatrix2TreeString(0);
+
+/* find "informative sites" */
+
+if (dataType==0)
+{
+	for (h=0; h<filteredData.sites; h=h+1)
+	{
+		filterString = "" + h;
+		DataSetFilter siteFilter = CreateFilter (filteredData,1,filterString);
+
+		HarvestFrequencies (f1, siteFilter, 1, 1, 0);
+		m1 = 0;
+		for (mpiNode=0; (mpiNode < 4) && (m1<=1) ; mpiNode=mpiNode+1)
+		{
+			if (f1[mpiNode]>0)
+			{
+				m1=m1+1;
+			}
+		}	
+		if (m1>1)
+		{
+			bppMap[Abs(bppMap)] = h;
+		}
+	}
+}
+else
+{
+	incFileName = HYPHY_LIB_DIRECTORY+"TemplateBatchFiles"+DIRECTORY_SEPARATOR+"TemplateModels"+DIRECTORY_SEPARATOR+"chooseGeneticCode.def";
+	ExecuteCommands  ("#include \""+incFileName+"\";");
+	
+	DataSetFilter filteredData = CreateFilter (ds,3,"","",GeneticCodeExclusions);
+	for (h=0; h<filteredData.sites; h=h+1)
+	{
+		filterString = "" + 3*h + "-" + (3*h+2);
+		DataSetFilter siteFilter = CreateFilter (filteredData,3,filterString,"",GeneticCodeExclusions);
+
+		HarvestFrequencies (f1, siteFilter, 3, 3, 1);
+		m1 = 0;
+		for (mpiNode=0; (mpiNode < 64) && (m1<=1); mpiNode=mpiNode+1)
+		{
+			if (f1[mpiNode]>0)
+			{
+				m1=m1+1;
+			}
+		}	
+		if (m1>1)
+		{
+			bppMap[Abs(bppMap)] = h;
+		}
+	}
+}
+
+bppSize = (Log(Abs(bppMap))/Log(2)+1)$1;
+fprintf (stdout, "\nThere are ",Abs(bppMap)," potential breakpoints. Bit size of the sample is ", bppSize,".\n");
+
+fprintf (stdout, "How many breakpoints?");
+fscanf (stdin, "Number", partCount);
+
+h = Abs(bppMap);
+
+if (h <= partCount)
+{
+	fprintf (stdout, "\nThere are too few potential break points to support ", partCount-1, " recombination events.\n");
+	return 0;
+}
+
+totalModelCounter = 1;
+kf = 1;
+
+for (k=1; k <= partCount; k=k+1)
+{
+	totalModelCounter = totalModelCounter * (h-k);
+	kf = kf * k;
+} 
+totalModelCounter = totalModelCounter / kf;
+fprintf (stdout, "\nThere are ", Format(totalModelCounter,20,0), " total possible models.\n");
+
+totalBitSize = bppSize * partCount;
+stateVectorDimension = totalBitSize;
+
+SelectTemplateModel (filteredData);
+
+SetDialogPrompt ("Save the best model to:");
+fprintf (PROMPT_FOR_FILE,CLEAR_FILE);
+modelFile = LAST_FILE_PATH;
+
+Tree givenTree = treeString;
+
+branchNames	  = BranchName (givenTree,-1);
+LikelihoodFunction lf = (filteredData,givenTree);
+
+Optimize 				(res,lf);
+
+/* check parameter counts */
+
+
+currentPopulation  = {};
+sortedScores	   = {populationSize,2};
+baseSites		   = filteredData.sites;
+baseParams 		   = res[1][2];
+
+sortedScores[0][0] = 2*(res[1][0]-res[1][1]*(baseSites/(baseSites-res[1][1]-1)));
+sortedScores[0][1] = 0;
+
+
+currentPopulation [0] = {totalBitSize,1};
+fprintf (stdout, "\n______________SINGLE RATE______________\n",lf,"\nAIC=",-sortedScores[0][0],"\n");
+
+perPartParameterCount = (res[1][1]-res[1][2]);
+if (baseParams + (partCount+1) * perPartParameterCount >= baseSites - 1)
+{
+	fprintf (stdout, "\nERROR: Too few sites/sequences for c-AIC inference\n");	
+	nullAICFile = modelFile + ".NULL_AIC";
+	fprintf (nullAICFile,CLEAR_FILE,-sortedScores[0][0]);
+
+	nullAICFile = modelFile + ".BEST_AIC";
+	fprintf (nullAICFile,CLEAR_FILE,-sortedScores[0][0]);
+	return 0;
+}
+	
+if (baseParams>0)
+{
+
+	ConstraintString = "";
+	ConstraintString*256;
+	for (h=0; h<baseParams; h=h+1)
+	{
+		GetString (v,lf,h);
+		ConstraintString * (v+":="+v+"__;\n");
+	}
+	ConstraintString*0;
+	ExecuteCommands (ConstraintString);
+}
+
+ibfPath = HYPHY_LIB_DIRECTORY + "TemplateBatchFiles" + DIRECTORY_SEPARATOR + "GA_CHC.ibf";
+ExecuteCommands ("#include \"" + ibfPath + "\";");
+
+
+ExportAMatrix (modelFile,currentPopulation[populationSize-1],0);
+
+nullAICFile = modelFile + ".NULL_AIC";
+fprintf (nullAICFile,CLEAR_FILE,crapAIC);
+
+nullAICFile = modelFile + ".BEST_AIC";
+fprintf (nullAICFile,CLEAR_FILE,lastBestAIC);
+
+modelFile = modelFile + ".samples";
+
+masterKeys = Rows(MasterList);
+outString = "";
+outString * 65536;
+for (h=Rows(masterKeys)*Columns(masterKeys)-1; h>=0; h=h-1)
+{
+	aKey = masterKeys[h];
+	outString * (""+(-MasterList[aKey])+"\n");
+	outString * aKey;
+	outString * "\n";
+}
+outString * 0;
+fprintf (modelFile,CLEAR_FILE,outString);
+
+fprintf (stdout, "\n\nGA search explored ", Abs(MasterList), "/", Format(totalModelCounter,20,0), "(", Format (Abs(MasterList)/totalModelCounter*100,10,8),"%) models.\n");
diff --git a/res/TemplateBatchFiles/GA_CHC.ibf b/res/TemplateBatchFiles/GA_CHC.ibf
new file mode 100644
index 0000000..99e1b20
--- /dev/null
+++ b/res/TemplateBatchFiles/GA_CHC.ibf
@@ -0,0 +1,458 @@
+resultProcessingContext = 0;
+if (branchUpdateThreshold == 0)
+{
+	branchUpdateThreshold = 10;
+}
+
+if (autoStepFlag == 0 || (rateClassesCount == startWithRateClasses))
+{
+	crapAIC 		 = -sortedScores[0][0];
+	fprintf (stdout, "Baseline Model Fit\nc-AIC = ", crapAIC , "\nStarting the GA now...\n");
+	startTimer		 = Time (1);
+
+	if (MPI_NODE_COUNT>1)
+	{
+		MPINodeState = {MPI_NODE_COUNT-1,3};
+	}
+
+	/*---------------------------------------------------------------------------------------------------------------------------------------------
+	  SPAWN INITIAL POPULATION; IT IS STORED AS GENERATING MATRICES
+	---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+	optimizeBLFlag = 1;
+
+	for (individual=0; individual<(populationSize-1) && individual<Abs(predef); individual = individual + 1)
+	{
+		aChild = Transpose(MakeStringCanonical (predef[individual],rateClassesCount));
+		aaRateMultipliers = StringToMatrix(aChild);
+		sortedScores[individual+1][1] = individual+1;
+		currentPopulation[individual+1] = aChild;
+		cString = aChild;
+		RunASample (compressedString[rateClassesCount-1],individual+1);
+	}
+
+	optimizeBLFlag = 0;
+	lastBranchAIC		     = crapAIC;
+	finishedGenerations		 = 0;
+}
+else
+{
+	finishedGenerations	 = finishedGenerations + generationCount;
+}
+/*CleanUpMPI (0);*/
+
+hitCount = 0;
+for (individual=individual+1; individual<populationSize && (autoStepFlag == 0 || individual < populationSize $ 2 || rateClassesCount == startWithRateClasses); individual=individual+1)
+{
+	goOn = 1;
+	while (goOn)
+	{
+		goOn = 0;
+		cString = SpawnRandomString(rateClassesCount);
+		for (v=0; v<individual; v=v+1)
+		{
+			if (Abs(cString-currentPopulation[v])==0)
+			{
+				if (hitCount < 20)
+				{
+					goOn = 1;
+					hitCount = hitCount + 1;
+				}
+				else
+				{
+					hitCount = 0;
+				}
+				break;
+			}
+		}
+	}
+	aaRateMultipliers = StringToMatrix(cString);
+	sortedScores[individual][1] = individual;
+	currentPopulation[individual] = cString;
+	RunASample (compressedString[rateClassesCount-1],individual);
+}
+
+CleanUpMPI (0);
+
+sortedScores = sortedScores%0;
+sampleProbs = {populationSize,1};
+
+doMutation = 0;
+
+lastImprovedGeneration   = 0;
+lastBestAIC		  		 = 1e100;
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------
+  RUNS THE CHC;
+---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+for (generation=0; generation<generationCount; generation=generation+1)
+{	
+	timeSoFar = Time(1)-startTimer;
+	
+	if (Abs (addOnLine))
+	{
+		fprintf (stdout, "Generation ", generation+2, addOnLine);
+	}
+	else
+	{
+		fprintf (stdout, "Generation ", generation+2);	
+	}
+	
+	fprintf (stdout, 
+						   "\nBest c-AIC found far is ", -sortedScores[populationSize-1][0], 
+						   "\nThis is a ", crapAIC+sortedScores[populationSize-1][0], " improvement over the single-rate model",
+						   "\nGA has considered ", Abs (MasterList), " unique models so far",
+						   "\nTotal run time so far is ", timeSoFar$3600, " hrs ", timeSoFar%3600$60, " mins ", timeSoFar%60, " seconds",
+						   "\nAverage cluster time per generation is ", Format(timeSoFar/(finishedGenerations+generation+1),5, 2), " seconds",
+						   "\nAverage CPU time per model is ", Format (timeSoFar/Abs(MasterList), 5, 2), " seconds ",
+						   "\nConvergence criterion: ", generation-lastImprovedGeneration,"/", stoppingCriterion, "\n"); 
+
+	if ((generation+1) % annealingPhase == 0)
+	{
+		mutationProb = Max(0.01,mutationProb*mutationProbDecrease);
+	}
+	doRepop = 1;
+	doLocalMutation = generation-lastImprovedGeneration;
+	doLocalMutation = doLocalMutation*((doLocalMutation % localMutationInterval) == 0);
+	if (doMutation || doLocalMutation)
+	{
+		resultProcessingContext = 0;
+		if (doLocalMutation)
+		{
+			mutProb = localMutationRate;
+		}
+		else
+		{
+			mutProb = mutationProb;
+		}
+		currentPopulationTrapper = {};
+		for (v=0; v<populationSize; v=v+1)
+		{
+			currentPopulationTrapper [currentPopulation[v]] = 1;
+		}
+		
+		for (individual=populationSize-2; individual>=0; individual=individual-1)
+		{
+			goOn = 1;
+			hitCount = 0;
+			while (goOn)
+			{
+				mpos = 0;
+				goOn 	= 0;
+				if (!doLocalMutation)
+				{
+					cString = currentPopulation[individual];
+				}
+				else
+				{
+					cString = currentPopulation[populationSize-1];
+				}
+				
+				if (verboseFlag)
+				{
+					cString2 = cString["Random(0,rateClassesCount)$1"]["Random(0,1)<mutProb"];
+					mpos = Abs(cString-cString2);
+					cString = cString2;
+				}
+				else
+				{
+					cString = cString["Random(0,rateClassesCount)$1"]["Random(0,1)<mutProb"];
+				}
+				
+				if (currentPopulationTrapper[cString])
+				{
+					if (hitCount < 20)
+					{
+						hitCount = hitCount+1;
+						goOn = 1;
+					}
+					else
+					{
+						hitCount = 0;
+						goOn = 0;
+					}
+				}
+
+			}
+			if (verboseFlag)
+			{
+				fprintf (stdout, "Mutated ", Format (mpos, 4, 0), " position in individual ", individual+1, "\n");
+			}
+			cString 					  = IsChildViable(MakeStringCanonical (cString,rateClassesCount));
+			aaRateMultipliers 			  = StringToMatrix(cString);
+			sortedScores[individual][1]   = individual;
+			currentPopulation[individual] = cString;
+			RunASample 						(compressedString[rateClassesCount-1],individual);
+			currentPopulationTrapper		[cString] = 1;
+		}		
+		CleanUpMPI (0);
+		doMutation = 0;
+		sortedScores = sortedScores%0;
+	}
+	/* compute selection probabilities */
+	ExportAMatrix (modelFile,StringToMatrix(currentPopulation[populationSize-1]),1,1);
+	resultProcessingContext = 1;
+	fitnessSum = 0;
+	intermediateProbs = {populationSize+produceOffspring,2};
+        
+    if (matingChoice == 3)
+    {
+		lmatingChoice = Random(0,2.9999999999999)$1;
+	}
+	else
+	{
+		lmatingChoice = matingChoice;
+	}
+	
+	for (individual=0; individual<populationSize; individual=individual+1)
+	{
+		if (lmatingChoice==0)
+		{
+			sampleProbs[individual] = Exp((sortedScores[individual][0]-sortedScores[populationSize-1][0])/2);
+		}
+		else
+		{
+			if (lmatingChoice == 1)
+			{
+				sampleProbs[individual] = 1;		
+			}
+			else
+			{
+				sampleProbs[individual] = 2*(individual+1);					
+			}
+		}
+		intermediateProbs[individual][0] = sortedScores[individual][0];
+		intermediateProbs[individual][1] = sortedScores[individual][1];
+		fitnessSum = fitnessSum + sampleProbs[individual];
+	}
+	
+	genBestAIC = -sortedScores[populationSize-1][0];
+	
+	if (verboseFlag)
+	{
+    	fprintf (stdout, "\n", lastBranchAIC, "\t", genBestAIC, "\n");
+	}
+	
+	if (genBestAIC + 0.001 < lastBestAIC)
+	{
+		if (lastBranchAIC-genBestAIC > branchUpdateThreshold)
+		{
+			UpdateBL (0);
+			lastBranchAIC = -sortedScores[populationSize-1][0];
+			intermediateProbs[populationSize-1][0] = -lastBranchAIC;
+			genBestAIC = lastBestAIC;
+		}
+		lastBestAIC = -sortedScores[populationSize-1][0];
+		lastImprovedGeneration = generation;
+	} 
+	else
+	{
+		if (generation-lastImprovedGeneration>=stoppingCriterion)
+		{
+			break;
+		}
+	}
+	
+	sampleProbs = sampleProbs*(1/fitnessSum);
+	
+	if (verboseFlag)
+	{
+		fprintf (stdout, "\nMating probabilities\n");
+		for (individual=0; individual<populationSize; individual=individual+1)
+		{
+			if (verboseFlag)
+			{
+				fprintf (stdout, "Individual ", Format(individual,3,0), ", sorted ", Format(sortedScores[individual][1],3,0), ". c-AIC: ", 
+								  Format (sortedScores[individual][0], 8, 3), ", mating prob ", Format (sampleProbs[individual],6,4), ".\n");
+			}
+		}
+	}
+	
+	children 	   = {};
+	pairwiseCounts = {populationSize,populationSize};
+
+	for (individual=0; individual<produceOffspring; individual=individual+1)
+	{
+		/* pick two individuals to produce offspring */
+		/* pick 1st parent */
+		h 			       = Random (0,1);
+		fitnessSum		   = sampleProbs[0];
+		v = 0;
+		while (fitnessSum < h)
+		{
+			v = v+1;
+			fitnessSum = fitnessSum + sampleProbs[v];
+		}
+
+		p1 			   = sortedScores[v][1];
+		ps1			   = currentPopulation[p1];
+		goOn 		   = 1;
+		
+		disallowedProbs 	= sampleProbs[v];
+		
+		for (sampleTry = 0; (sampleTry < maxSampleTries) && goOn; sampleTry = sampleTry + 1)
+		{
+			goOn 		   = 0;
+			if (disallowedProbs<1)
+			{
+				h 			   = Random (0,1-disallowedProbs);
+				if (v == 0)
+				{
+					fitnessSum	   = 0;			
+				}
+				else
+				{
+					fitnessSum	   = sampleProbs[0];
+				}
+				
+				v2 = 0;
+				while (fitnessSum < h)
+				{
+					v2 = v2 + 1;
+					if (v2 == populationSize)
+					{
+						while (v2==v)
+						{
+							v2 = Min(Random (0,populationSize)$1,populationSize-1);
+						}
+						break;
+					}
+					if (v2!=v)
+					{
+						fitnessSum = fitnessSum + sampleProbs[v2];
+					}
+				}	
+			}
+			else
+			{
+				v2 = v;
+				while (v2==v)
+				{
+					v2 = Min(Random (0,populationSize)$1,populationSize-1);
+				}
+			}
+			
+			if (v2 == populationSize)
+			{
+				goOn = 1;
+				continue;
+			}
+			
+			while (pairwiseCounts[v][v2] > familyControlSize)
+			{
+				v2 =  Min(Random (0,populationSize)$1,populationSize-1);
+			}
+			
+			p2 = sortedScores[v2][1];
+			ps2			   = currentPopulation[p2];
+			fitnessSum 	   = 0;
+			
+			for (h=0; h<stateVectorDimension; h=h+1)
+			{
+				if (ps1[h] != ps2[h])
+				{
+					fitnessSum = fitnessSum+1;
+					/*if (incestDistance<fitnessSum)
+					{
+						break;
+					}*/
+				}
+			}
+			if (incestDistance>=fitnessSum)
+			{
+				goOn = 1;
+			}
+			else
+			{
+				pairwiseCounts[v][v2] = pairwiseCounts[v][v2] + 1;
+				pairwiseCounts[v2][v] = pairwiseCounts[v2][v] + 1;
+			}
+		}
+		
+		if (sampleTry == maxSampleTries)
+		{
+			doMutation = 1;
+			/*
+			generation = generation - 1;
+			*/
+			CleanUpMPI (0);
+			doRepop = 0;
+			break;
+		}
+		else
+		{
+			if (verboseFlag)
+			{
+				fprintf (stdout, "Mating ", p1, " and ", p2, ". Difference of ", fitnessSum, " positions\n");
+			}
+			
+			cString = {stateVectorDimension,1} ["ps1[_MATRIX_ELEMENT_ROW_]+(ps2[_MATRIX_ELEMENT_ROW_]-ps1[_MATRIX_ELEMENT_ROW_])*(Random(0,1)<0.5)"];
+				/*for (h=0; h<stateVectorDimension; h=h+1)
+				{
+					if (ps1[h] == ps2[h])
+					{
+						cString[h] = ps1[h];
+					}
+					else
+					{
+						if (Random(0,1)<0.5)
+						{
+							cString[h] = ps1[h];
+						}
+						else
+						{
+							cString[h] = ps2[h];					
+						}
+					}
+				}*/
+				
+			cString 										= IsChildViable(MakeStringCanonical (cString,rateClassesCount));
+			aaRateMultipliers 								= StringToMatrix(cString);
+			intermediateProbs[populationSize+individual][1] = populationSize+individual;
+			children  [individual] 							= cString;
+			RunASample 										  (compressedString[rateClassesCount-1],populationSize+individual);
+		}
+	}
+	CleanUpMPI (0);
+	if (doRepop)
+	{
+		newPop = {};
+		intermediateProbs = intermediateProbs%0;
+		for (h=produceOffspring; h<populationSize+produceOffspring; h=h+1)
+		{
+			v = intermediateProbs[h][1];
+			sortedScores[h-produceOffspring][1] = h-produceOffspring;
+			sortedScores[h-produceOffspring][0] = intermediateProbs[h][0];		
+			if (v<populationSize)
+			{
+				newPop[h-produceOffspring] = currentPopulation[v];
+			}
+			else
+			{
+				newPop[h-produceOffspring] = children[v-populationSize];
+			}
+		}
+		for (h=0; h<populationSize; h=h+1)
+		{
+			currentPopulation[h] = newPop[h];
+		}
+		
+		h = Abs((sortedScores[populationSize-1][0]-sortedScores[0][0])/sortedScores[0][0]);
+		if (verboseFlag)
+		{
+			fprintf (stdout, "Diversity level: ", h, " (hypermutation threshold: ", mutationThreshhold, ")\n");	
+		}
+		if (h<mutationThreshhold)
+		{
+			if (verboseFlag)
+			{
+				fprintf (stdout, "\nTriggered hypermutation...\n");
+			}
+			doMutation = 1;
+			/*
+			generation = generation - 1;
+			*/
+		}
+	}
+}
diff --git a/res/TemplateBatchFiles/GA_CHC_Binary.ibf b/res/TemplateBatchFiles/GA_CHC_Binary.ibf
new file mode 100644
index 0000000..692ccbf
--- /dev/null
+++ b/res/TemplateBatchFiles/GA_CHC_Binary.ibf
@@ -0,0 +1,599 @@
+if (branchUpdateThreshold == 0)
+{
+	branchUpdateThreshold = 10;
+}
+
+crapAIC 		 = -sortedScores[0][0];
+
+fprintf (stdout, "Baseline Model Fit\nc-AIC = ", crapAIC , "\nStarting the GA now...\n");
+
+startTimer		 = Time (1);
+
+if (MPI_NODE_COUNT>1)
+{
+	MPINodeState = {MPI_NODE_COUNT-1,3};
+}
+
+/*---------------------------------------------------------------------------*/
+
+function addNumbers (n1,n2,digits,theBase)
+{
+	n3 			 = {1,digits};
+	
+	carryOverBit = 0;
+	for (litter = digits-1; litter >=0 ; litter = litter - 1)
+	{
+		carryOverBit = n1[litter]+n2[litter]+carryOverBit;
+		if (carryOverBit>=theBase)
+		{
+			n3[litter] = carryOverBit-theBase;
+			carryOverBit = 1;
+		}
+		else
+		{
+			n3[litter] = carryOverBit;
+			carryOverBit = 0;
+		}
+	}
+	return n3;
+}
+
+/*---------------------------------------------------------------------------*/
+
+function multNumbersByDig (n1,digits,theBase,mBy)
+{
+	_n3 			 = {1,digits+1};
+	
+	carryOverBit = 0;
+	for (litter = digits; litter >0 ; litter = litter - 1)
+	{
+		carryOverBit = n1[litter-1]*mBy+carryOverBit;
+		if (carryOverBit>=theBase)
+		{
+			_n3[litter] = carryOverBit%theBase;
+			carryOverBit = carryOverBit$theBase;
+		}
+		else
+		{
+			_n3[litter] = carryOverBit;
+			carryOverBit = 0;
+		}
+	}
+	_n3[0] = carryOverBit;
+	
+	return _n3;
+}
+
+/*---------------------------------------------------------------------------*/
+
+function multNumbers (n1,n2,digits,digits2,digits3,theBase)
+{
+	n3 			 = {1,digits2};
+	
+	shift = digits2-digits-1;
+	
+	cachedDigs = {};
+	
+	for (litterOut = digits3-1; litterOut >=0; litterOut = litterOut - 1)
+	{
+		d = n1[litterOut];
+		if (d)
+		{
+			dv = cachedDigs[d];
+			if (Abs(dv) == 0)
+			{
+				dv = multNumbersByDig (n2,digits,theBase,d);
+				cachedDigs[d] = dv;
+			}
+			
+			carryOverBit = 0;
+			for (litter = digits; litter >=0 ; litter = litter - 1)
+			{
+				carryOverBit = n3[litter+shift]+dv[litter]+carryOverBit;
+				if (carryOverBit>=theBase)
+				{
+					n3[litter+shift] = carryOverBit-theBase;
+					carryOverBit = 1;
+				}
+				else
+				{
+					n3[litter+shift] = carryOverBit;
+					carryOverBit = 0;
+				}
+			}
+		}
+		if (carryOverBit)
+		{
+			n3[shift-1] = carryOverBit;
+		}
+		shift = shift - 1;
+	}
+	return n3;
+}
+
+/*---------------------------------------------------------------------------*/
+/*from base2 to base 1*/
+
+function convertBase (vect1, base1, base2, length1)
+{
+	/*
+	fprintf (stdout, "Enter convertBase\n");
+	*/
+	baseBits   = (Log(base2)/Log(base1));
+	convLength = baseBits*length1;
+	if (convLength $ 1 != convLength)
+	{
+		convLength = convLength$1+1;
+	}
+	
+	baseBits = baseBits+1;
+	if (baseBits != Log(base2)/Log(base1))
+	{
+		baseBits = baseBits + 1;
+	}
+	
+	digits    = {};
+	digitVect = {1,baseBits};
+	oneVect   = {1,baseBits};
+	oneVect	    [baseBits-1] = 1;
+	
+	for (k=0; k<base2; k=k+1)
+	{
+		digits[k] = digitVect;
+		digitVect = addNumbers(digitVect,oneVect,baseBits,base1);
+	}
+	
+	if (carryOverBit)
+	{
+		vi = {1,baseBits+1};
+		vi[0] = carryOverBit;
+		for (k=0; k<baseBits; k=k+1)
+		{
+			vi[k+1] = digitVect[k];
+		}	
+		digitVect = vi;
+	}
+	
+	outVect     = {1, convLength};
+	outVect[convLength-1] = 1;
+	
+	output		= {1, convLength};
+	
+	for (vi = length1-1; vi >=0 ; vi = vi-1)
+	{
+		aNumber = vect1[vi];
+		if (aNumber)
+		{
+			aNumber = digits[aNumber];
+			toAdd   = multNumbers (aNumber, outVect, convLength, convLength, baseBits, base1);
+			output  = addNumbers (toAdd, output, convLength, base1);
+		}
+		outVect = multNumbers (digitVect, outVect, convLength, convLength, Columns(digitVect), base1);
+	}
+	/*
+	fprintf (stdout, "Converted a vector (", length1, ") from base ", base2, " to base ", base1," output lentgh ", Columns (output), "\n");
+	*/
+	return output;
+}
+
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------
+  SPAWN INITIAL POPULATION; IT IS STORED AS GENERATING MATRICES
+---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+resultProcessingContext = 0;
+
+
+for (individual=0; individual<(populationSize-1) && individual<Abs(predef); individual = individual + 1)
+{
+	aChild = Transpose(MakeStringCanonical (predef[individual],rateClassesCount));
+	aaRateMultipliers = StringToMatrix(aChild);
+	sortedScores[individual+1][1] = individual+1;
+	currentPopulation[individual+1] = aChild;
+	cString = aChild;
+	RunASample (compressedString[rateClassesCount-1],individual+1);
+}
+
+for (individual=individual+1; individual<populationSize; individual=individual+1)
+{
+	goOn = 1;
+	while (goOn)
+	{
+		goOn = 0;
+		cString = SpawnRandomString(rateClassesCount);
+		for (v=0; v<individual; v=v+1)
+		{
+			if (Abs(cString-currentPopulation[v])==0)
+			{
+				goOn = 1;
+				break;
+			}
+		}
+	}
+	aaRateMultipliers = StringToMatrix(cString);
+	sortedScores[individual][1] = individual;
+	currentPopulation[individual] = cString;
+	RunASample (compressedString[rateClassesCount-1],individual);
+}
+
+CleanUpMPI (0);
+
+sortedScores = sortedScores%0;
+sampleProbs = {populationSize,1};
+
+doMutation = 0;
+
+lastImprovedGeneration = 0;
+lastBestAIC		       = 1e100;
+lastBranchAIC		   = crapAIC;
+
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------
+  RUNS THE CHC;
+---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+for (generation=0; generation<generationCount; generation=generation+1)
+{	
+	timeSoFar = Time(1)-startTimer;
+	fprintf (stdout, "Generation ", generation+2, 
+						   "\nBest c-AIC found far is ", -sortedScores[populationSize-1][0], 
+						   "\nThis is a ", crapAIC+sortedScores[populationSize-1][0], " improvement over the single-rate model",
+						   "\nGA has considered ", Abs (MasterList), " unique models so far",
+						   "\nTotal run time so far is ", timeSoFar$3600, " hrs ", timeSoFar%3600$60, " mins ", timeSoFar%60, " seconds",
+						   "\nAverage cluster time per generation is ", Format(timeSoFar/(generation+1),5, 2), " seconds",
+						   "\nAverage CPU time per model is ", Format (timeSoFar/Abs(MasterList), 5, 2), " seconds ",
+						   "\nConvergence criterion: ", generation-lastImprovedGeneration,"/", stoppingCriterion, "\n"); 
+
+	if ((generation+1) % annealingPhase == 0)
+	{
+		mutationProb = Max(0.01,mutationProb*mutationProbDecrease);
+	}
+	doRepop = 1;
+	doLocalMutation = generation-lastImprovedGeneration;
+	doLocalMutation = doLocalMutation*((doLocalMutation % localMutationInterval) == 0);
+	if (doMutation || doLocalMutation)
+	{
+		resultProcessingContext = 0;
+		if (doLocalMutation)
+		{
+			mutProb = localMutationRate;
+		}
+		else
+		{
+			mutProb = mutationProb;
+		}
+		for (individual=populationSize-2; individual>=0; individual=individual-1)
+		{
+			goOn = 1;
+			while (goOn)
+			{
+				mpos = 0;
+				goOn 	= 0;
+				if (doLocalMutation)
+				{
+					cString = currentPopulation[individual];
+				}
+				else
+				{
+					cString = currentPopulation[populationSize-1];
+				}
+				for (h=0; h<stateVectorDimension; h=h+1)
+				{
+					if (Random(0,1)<mutProb)
+					{
+						 newVal = cString[h];
+						 while (newVal == cString[h])
+						 {
+						 	newVal = Random (0,rateClassesCount)$1;
+						 }
+						 cString[h] = newVal;
+						 mpos = mpos + 1;
+					}
+				}
+				for (v=0; v<populationSize; v=v+1)
+				{
+					if (Abs(cString-currentPopulation[v])==0)
+					{
+						goOn = 1;
+						break;
+					}
+				}
+			}
+			if (verboseFlag)
+			{
+				fprintf (stdout, "Mutated ", Format (mpos, 4, 0), " position in individual ", individual+1, "\n");
+			}
+			cString = MakeStringCanonical (cString,rateClassesCount);
+			aaRateMultipliers = StringToMatrix(cString);
+			sortedScores[individual][1] = individual;
+			currentPopulation[individual] = cString;
+			RunASample (compressedString[rateClassesCount-1],individual);
+		}		
+		CleanUpMPI (0);
+		doMutation = 0;
+		sortedScores = sortedScores%0;
+	}
+	/* compute selection probabilities */
+	ExportAMatrix (modelFile,StringToMatrix(currentPopulation[populationSize-1]),1);
+	resultProcessingContext = 1;
+	fitnessSum = 0;
+	intermediateProbs = {populationSize+produceOffspring,2};
+        
+    if (matingChoice == 3)
+    {
+		lmatingChoice = Random(0,2.9999999999999)$1;
+	}
+	else
+	{
+		lmatingChoice = matingChoice;
+	}
+	
+	for (individual=0; individual<populationSize; individual=individual+1)
+	{
+		if (lmatingChoice==0)
+		{
+			sampleProbs[individual] = Exp((sortedScores[individual][0]-sortedScores[populationSize-1][0])/2);
+		}
+		else
+		{
+			if (lmatingChoice == 1)
+			{
+				sampleProbs[individual] = 1;		
+			}
+			else
+			{
+				sampleProbs[individual] = 2*(individual+1);					
+			}
+		}
+		intermediateProbs[individual][0] = sortedScores[individual][0];
+		intermediateProbs[individual][1] = sortedScores[individual][1];
+		fitnessSum = fitnessSum + sampleProbs[individual];
+	}
+	
+	genBestAIC = -sortedScores[populationSize-1][0];
+	
+        fprintf (stdout, "\n", lastBranchAIC, "\t", genBestAIC, "\n");
+
+	if (genBestAIC + 0.001 < lastBestAIC)
+	{
+		if (lastBranchAIC-genBestAIC > branchUpdateThreshold)
+		{
+			UpdateBL (0);
+			lastBranchAIC = -sortedScores[populationSize-1][0];
+			intermediateProbs[populationSize-1][0] = -lastBranchAIC;
+			genBestAIC = lastBestAIC;
+		}
+		lastBestAIC = -sortedScores[populationSize-1][0];
+		lastImprovedGeneration = generation;
+	} 
+	else
+	{
+		if (generation-lastImprovedGeneration>=stoppingCriterion)
+		{
+			break;
+		}
+	}
+	
+	sampleProbs = sampleProbs*(1/fitnessSum);
+	
+	if (verboseFlag)
+	{
+		fprintf (stdout, "\nMating probabilities\n");
+		for (individual=0; individual<populationSize; individual=individual+1)
+		{
+			fprintf (stdout, "Individual ", Format(individual,3,0), ", sorted ", Format(sortedScores[individual][1],3,0), ". c-AIC: ", 
+							  Format (sortedScores[individual][0], 8, 3), ", mating prob ", Format (sampleProbs[individual],6,4), ".\n");
+		}
+	}
+	
+	children 	   = {};
+	pairwiseCounts = {populationSize,populationSize};
+	convertedVectors = {};
+
+	for (individual=0; individual<produceOffspring; individual=individual+1)
+	{
+		/* pick two individuals to produce offspring */
+		/* pick 1st parent */
+		
+		h 			       = Random (0,1);
+		fitnessSum		   = sampleProbs[0];
+		v = 0;
+		while (fitnessSum < h)
+		{
+			v = v+1;
+			fitnessSum = fitnessSum + sampleProbs[v];
+		}
+
+		p1 			   = sortedScores[v][1];
+		ps1			   = convertedVectors[p1];
+		if (Abs(ps1) == 0)
+		{
+			ps1 = convertBase(currentPopulation[p1],2,rateClassesCount,stateVectorDimension);
+			convertedVectors[p1] = ps1;
+		}
+		goOn 		   = 1;
+		
+		disallowedProbs 	= sampleProbs[v];
+		
+		for (sampleTry = 0; (sampleTry < maxSampleTries) && goOn; sampleTry = sampleTry + 1)
+		{
+			goOn 		   = 0;
+			if (disallowedProbs<1)
+			{
+				h 			   = Random (0,1-disallowedProbs);
+				if (v == 0)
+				{
+					fitnessSum	   = 0;			
+				}
+				else
+				{
+					fitnessSum	   = sampleProbs[0];
+				}
+				
+				v2 = 0;
+				while (fitnessSum < h)
+				{
+					v2 = v2 + 1;
+					if (v2 == populationSize)
+					{
+						while (v2==v)
+						{
+							v2 = Min(Random (0,populationSize)$1,populationSize-1);
+						}
+						break;
+					}
+					if (v2!=v)
+					{
+						fitnessSum = fitnessSum + sampleProbs[v2];
+					}
+				}	
+			}
+			else
+			{
+				v2 = v;
+				while (v2==v)
+				{
+					v2 = Min(Random (0,populationSize)$1,populationSize-1);
+				}
+			}
+			
+			if (v2 == populationSize)
+			{
+				goOn = 1;
+				continue;
+			}
+			
+			while (pairwiseCounts[v][v2] > familyControlSize)
+			{
+				v2 =  Min(Random (0,populationSize)$1,populationSize-1);
+			}
+			
+			p2			   = sortedScores[v2][1];
+			ps2			   = convertedVectors[p2];
+			if (Abs(ps2) == 0)
+			{
+				ps2 = convertBase(currentPopulation[p2],2,rateClassesCount,stateVectorDimension);
+				convertedVectors[p2] = ps2;
+			}
+			fitnessSum 	   = 0;
+			
+			matingDimension = Min(Columns(ps1),Columns(ps2));
+			
+			for (h=matingDimension-1; h>=0; h=h-1)
+			{
+				if (ps1[h] != ps2[h])
+				{
+					fitnessSum = fitnessSum+1;
+					/*if (incestDistance<fitnessSum)
+					{
+						break;
+					}*/
+				}
+			}
+			if (incestDistance>=fitnessSum)
+			{
+				goOn = 1;
+			}
+			else
+			{
+				pairwiseCounts[v][v2] = pairwiseCounts[v][v2] + 1;
+				pairwiseCounts[v2][v] = pairwiseCounts[v2][v] + 1;
+			}
+		}
+		
+		if (sampleTry == maxSampleTries)
+		{
+			doMutation = 1;
+			generation = generation - 1;
+			CleanUpMPI (0);
+			doRepop = 0;
+			break;
+		}
+		else
+		{
+			if (verboseFlag)
+			{
+				fprintf (stdout, "Mating ", p1, " and ", p2, ". Difference of ", fitnessSum, " positions\n");
+			}
+			aChild = {matingDimension,1};
+			for (h=matingDimension-1; h>=0; h=h-1)
+			{
+				if (ps1[h] == ps2[h])
+				{
+					aChild[h] = ps1[h];
+				}
+				else
+				{
+					if (Random(0,1)<0.5)
+					{
+						aChild[h] = ps1[h];
+					}
+					else
+					{
+						aChild[h] = ps2[h];					
+					}
+				}
+			}
+			aChild = convertBase(aChild,rateClassesCount,2,matingDimension);
+			if (Columns(aChild)>stateVectorDimension)
+			{
+				aC2 = {stateVectorDimension,1};
+				for (h=0; h<stateVectorDimension;h=h+1)
+				{
+					aC2[h] = aChild[h+1];
+				}
+				aChild = aC2;
+				aC2 = 0;
+			}
+			else
+			{
+				aChild = Transpose (aChild);
+			}
+			aChild = MakeStringCanonical (aChild,rateClassesCount);
+			aaRateMultipliers = StringToMatrix(aChild);
+			intermediateProbs[populationSize+individual][1] = populationSize+individual;
+			children  [individual] = aChild;
+			cString = aChild;
+			RunASample (compressedString[rateClassesCount-1],populationSize+individual);
+		}
+	}
+	CleanUpMPI (0);
+	if (doRepop)
+	{
+		newPop = {};
+		intermediateProbs = intermediateProbs%0;
+		for (h=produceOffspring; h<populationSize+produceOffspring; h=h+1)
+		{
+			v = intermediateProbs[h][1];
+			sortedScores[h-produceOffspring][1] = h-produceOffspring;
+			sortedScores[h-produceOffspring][0] = intermediateProbs[h][0];		
+			if (v<populationSize)
+			{
+				newPop[h-produceOffspring] = currentPopulation[v];
+			}
+			else
+			{
+				newPop[h-produceOffspring] = children[v-populationSize];
+			}
+		}
+		for (h=0; h<populationSize; h=h+1)
+		{
+			currentPopulation[h] = newPop[h];
+		}
+		
+		h = Abs((sortedScores[populationSize-1][0]-sortedScores[0][0])/sortedScores[0][0]);
+		if (verboseFlag)
+		{
+			fprintf (stdout, "Diversity level: ", h, " (hypermutation threshold: ", mutationThreshhold, ")\n");	
+		}
+		if (h<mutationThreshhold)
+		{
+			if (verboseFlag)
+			{
+				fprintf (stdout, "\nTriggered hypermutation...\n");
+			}
+			doMutation = 1;
+			generation = generation - 1;
+		}
+	}
+}
diff --git a/res/TemplateBatchFiles/GA_CHC_kernel.ibf b/res/TemplateBatchFiles/GA_CHC_kernel.ibf
new file mode 100644
index 0000000..a9a4054
--- /dev/null
+++ b/res/TemplateBatchFiles/GA_CHC_kernel.ibf
@@ -0,0 +1,447 @@
+resultProcessingContext = 0;
+if (branchUpdateThreshold == 0)
+{
+	branchUpdateThreshold = 10;
+}
+
+if (autoStepFlag == 0 || (rateClassesCount == startWithRateClasses))
+{
+	crapAIC 		 = -sortedScores[0][0];
+	fprintf (stdout, "Baseline Model Fit\nc-AIC = ", crapAIC , "\nStarting the GA now...\n");
+	startTimer		 = Time (1);
+
+	if (MPI_NODE_COUNT>1)
+	{
+		MPINodeState = {MPI_NODE_COUNT-1,3};
+	}
+
+	/*---------------------------------------------------------------------------------------------------------------------------------------------
+	  SPAWN INITIAL POPULATION; IT IS STORED AS GENERATING MATRICES
+	---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+	optimizeBLFlag = 1;
+
+	for (individual=0; individual<(populationSize-1) && individual<Abs(predef); individual = individual + 1)
+	{
+		aChild = Transpose(MakeStringCanonical (predef[individual],rateClassesCount));
+		aaRateMultipliers = StringToMatrix(aChild);
+		sortedScores[individual+1][1] = individual+1;
+		currentPopulation[individual+1] = aChild;
+		cString = aChild;
+		RunASample (compressedString[rateClassesCount-1],individual+1);
+	}
+
+	optimizeBLFlag = 0;
+	lastBranchAIC		     = crapAIC;
+	finishedGenerations		 = 0;
+}
+else
+{
+	finishedGenerations	 = finishedGenerations + generationCount;
+}
+/*CleanUpMPI (0);*/
+
+hitCount = 0;
+for (individual=individual+1; individual<populationSize && (autoStepFlag == 0 || individual < populationSize $ 2 || rateClassesCount == startWithRateClasses); individual=individual+1)
+{
+	goOn = 1;
+	while (goOn)
+	{
+		goOn = 0;
+		cString = SpawnRandomString(rateClassesCount);
+		for (v=0; v<individual; v=v+1)
+		{
+			if (Abs(cString-currentPopulation[v])==0)
+			{
+				if (hitCount < 20)
+				{
+					goOn = 1;
+					hitCount = hitCount + 1;
+				}
+				else
+				{
+					hitCount = 0;
+				}
+				break;
+			}
+		}
+	}
+	aaRateMultipliers = StringToMatrix(cString);
+	sortedScores[individual][1] = individual;
+	currentPopulation[individual] = cString;
+	RunASample (compressedString[rateClassesCount-1],individual);
+}
+
+CleanUpMPI (0);
+
+sortedScores = sortedScores%0;
+sampleProbs = {populationSize,1};
+
+doMutation = 0;
+
+lastImprovedGeneration   = 0;
+lastBestAIC		  		 = 1e100;
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------
+  RUNS THE CHC;
+---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+for (generation=0; generation<generationCount; generation=generation+1)
+{	
+	timeSoFar = Time(1)-startTimer;
+	
+	if (Abs (addOnLine))
+	{
+		fprintf (stdout, "Generation ", generation+2, addOnLine);
+	}
+	else
+	{
+		fprintf (stdout, "Generation ", generation+2);	
+	}
+	
+	fprintf (stdout, 
+						   "\nBest c-AIC found far is ", -sortedScores[populationSize-1][0], 
+						   "\nThis is a ", crapAIC+sortedScores[populationSize-1][0], " improvement over the single-cluster model",
+						   "\nGA has considered ", Abs (MasterList), " unique models so far",
+						   "\nTotal run time so far is ", timeSoFar$3600, " hrs ", timeSoFar%3600$60, " mins ", timeSoFar%60, " seconds",
+						   "\nAverage cluster time per generation is ", Format(timeSoFar/(finishedGenerations+generation+1),5, 2), " seconds",
+						   "\nAverage CPU time per model is ", Format (timeSoFar/Abs(MasterList), 5, 2), " seconds ",
+						   "\nConvergence criterion: ", generation-lastImprovedGeneration,"/", stoppingCriterion, "\n"); 
+
+	if ((generation+1) % annealingPhase == 0)
+	{
+		mutationProb = Max(0.01,mutationProb*mutationProbDecrease);
+	}
+	doRepop = 1;
+	doLocalMutation = generation-lastImprovedGeneration;
+	doLocalMutation = doLocalMutation*((doLocalMutation % localMutationInterval) == 0);
+	if (doMutation || doLocalMutation)
+	{
+		resultProcessingContext = 0;
+		if (doLocalMutation)
+		{
+			mutProb = localMutationRate;
+		}
+		else
+		{
+			mutProb = mutationProb;
+		}
+		for (individual=populationSize-2; individual>=0; individual=individual-1)
+		{
+			goOn = 1;
+			hitCount = 0;
+			while (goOn)
+			{
+				mpos = 0;
+				goOn 	= 0;
+				if (!doLocalMutation)
+				{
+					cString = currentPopulation[individual];
+				}
+				else
+				{
+					cString = currentPopulation[populationSize-1];
+				}
+				for (h=0; h<stateVectorDimension; h=h+1)
+				{
+					if (Random(0,1)<mutProb)
+					{
+						 newVal = cString[h];
+						 while (newVal == cString[h])
+						 {
+						 	newVal = Random (0,rateClassesCount)$1;
+						 }
+						 cString[h] = newVal;
+						 mpos = mpos + 1;
+					}
+				}
+				for (v=0; v<populationSize; v=v+1)
+				{
+					if (Abs(cString-currentPopulation[v])==0)
+					{
+						if (hitCount < 20)
+						{
+							hitCount = hitCount+1;
+							goOn = 1;
+						}
+						else
+						{
+							hitCount = 0;
+							goOn = 0;
+						}
+						break;
+					}
+				}
+			}
+			if (verboseFlag)
+			{
+				fprintf (stdout, "Mutated ", Format (mpos, 4, 0), " position in individual ", individual+1, "\n");
+			}
+			cString 					  = IsChildViable(MakeStringCanonical (cString,rateClassesCount));
+			aaRateMultipliers 			  = StringToMatrix(cString);
+			sortedScores[individual][1]   = individual;
+			currentPopulation[individual] = cString;
+			RunASample (compressedString[rateClassesCount-1],individual);
+		}		
+		CleanUpMPI (0);
+		doMutation = 0;
+		sortedScores = sortedScores%0;
+	}
+	/* compute selection probabilities */
+	resultProcessingContext = 1;
+	fitnessSum = 0;
+	intermediateProbs = {populationSize+produceOffspring,2};
+        
+    if (matingChoice == 3)
+    {
+		lmatingChoice = Random(0,2.9999999999999)$1;
+	}
+	else
+	{
+		lmatingChoice = matingChoice;
+	}
+	
+	for (individual=0; individual<populationSize; individual=individual+1)
+	{
+		if (lmatingChoice==0)
+		{
+			sampleProbs[individual] = Exp((sortedScores[individual][0]-sortedScores[populationSize-1][0])/2);
+		}
+		else
+		{
+			if (lmatingChoice == 1)
+			{
+				sampleProbs[individual] = 1;		
+			}
+			else
+			{
+				sampleProbs[individual] = 2*(individual+1);					
+			}
+		}
+		intermediateProbs[individual][0] = sortedScores[individual][0];
+		intermediateProbs[individual][1] = sortedScores[individual][1];
+		fitnessSum = fitnessSum + sampleProbs[individual];
+	}
+	
+	genBestAIC = -sortedScores[populationSize-1][0];
+	
+	if (verboseFlag)
+	{
+    	fprintf (stdout, "\n", lastBranchAIC, "\t", genBestAIC, "\n");
+	}
+	
+	if (genBestAIC + 0.001 < lastBestAIC)
+	{
+		if (lastBranchAIC-genBestAIC > branchUpdateThreshold)
+		{
+			UpdateBL (0);
+			lastBranchAIC = -sortedScores[populationSize-1][0];
+			intermediateProbs[populationSize-1][0] = -lastBranchAIC;
+			genBestAIC = lastBestAIC;
+		}
+		lastBestAIC = -sortedScores[populationSize-1][0];
+		lastImprovedGeneration = generation;
+	} 
+	else
+	{
+		if (generation-lastImprovedGeneration>=stoppingCriterion)
+		{
+			break;
+		}
+	}
+	
+	sampleProbs = sampleProbs*(1/fitnessSum);
+	
+	if (verboseFlag)
+	{
+		fprintf (stdout, "\nMating probabilities\n");
+		for (individual=0; individual<populationSize; individual=individual+1)
+		{
+			if (verboseFlag)
+			{
+				fprintf (stdout, "Individual ", Format(individual,3,0), ", sorted ", Format(sortedScores[individual][1],3,0), ". c-AIC: ", 
+								  Format (sortedScores[individual][0], 8, 3), ", mating prob ", Format (sampleProbs[individual],6,4), ".\n");
+			}
+		}
+	}
+	
+	children 	   = {};
+	pairwiseCounts = {populationSize,populationSize};
+
+	for (individual=0; individual<produceOffspring; individual=individual+1)
+	{
+		/* pick two individuals to produce offspring */
+		/* pick 1st parent */
+		h 			       = Random (0,1);
+		fitnessSum		   = sampleProbs[0];
+		v = 0;
+		while (fitnessSum < h)
+		{
+			v = v+1;
+			fitnessSum = fitnessSum + sampleProbs[v];
+		}
+
+		p1 			   = sortedScores[v][1];
+		ps1			   = currentPopulation[p1];
+		goOn 		   = 1;
+		
+		disallowedProbs 	= sampleProbs[v];
+		
+		for (sampleTry = 0; (sampleTry < maxSampleTries) && goOn; sampleTry = sampleTry + 1)
+		{
+			goOn 		   = 0;
+			if (disallowedProbs<1)
+			{
+				h 			   = Random (0,1-disallowedProbs);
+				if (v == 0)
+				{
+					fitnessSum	   = 0;			
+				}
+				else
+				{
+					fitnessSum	   = sampleProbs[0];
+				}
+				
+				v2 = 0;
+				while (fitnessSum < h)
+				{
+					v2 = v2 + 1;
+					if (v2 == populationSize)
+					{
+						while (v2==v)
+						{
+							v2 = Min(Random (0,populationSize)$1,populationSize-1);
+						}
+						break;
+					}
+					if (v2!=v)
+					{
+						fitnessSum = fitnessSum + sampleProbs[v2];
+					}
+				}	
+			}
+			else
+			{
+				v2 = v;
+				while (v2==v)
+				{
+					v2 = Min(Random (0,populationSize)$1,populationSize-1);
+				}
+			}
+			
+			if (v2 == populationSize)
+			{
+				goOn = 1;
+				continue;
+			}
+			
+			while (pairwiseCounts[v][v2] > familyControlSize)
+			{
+				v2 =  Min(Random (0,populationSize)$1,populationSize-1);
+			}
+			
+			p2 = sortedScores[v2][1];
+			ps2			   = currentPopulation[p2];
+			fitnessSum 	   = 0;
+			
+			for (h=0; h<stateVectorDimension; h=h+1)
+			{
+				if (ps1[h] != ps2[h])
+				{
+					fitnessSum = fitnessSum+1;
+					/*if (incestDistance<fitnessSum)
+					{
+						break;
+					}*/
+				}
+			}
+			if (incestDistance>=fitnessSum)
+			{
+				goOn = 1;
+			}
+			else
+			{
+				pairwiseCounts[v][v2] = pairwiseCounts[v][v2] + 1;
+				pairwiseCounts[v2][v] = pairwiseCounts[v2][v] + 1;
+			}
+		}
+		
+		if (sampleTry == maxSampleTries)
+		{
+			doMutation = 1;
+			generation = generation - 1;
+			CleanUpMPI (0);
+			doRepop = 0;
+			break;
+		}
+		else
+		{
+			if (verboseFlag)
+			{
+				fprintf (stdout, "Mating ", p1, " and ", p2, ". Difference of ", fitnessSum, " positions\n");
+			}
+			cString = {stateVectorDimension,1};
+			for (h=0; h<stateVectorDimension; h=h+1)
+			{
+				if (ps1[h] == ps2[h])
+				{
+					cString[h] = ps1[h];
+				}
+				else
+				{
+					if (Random(0,1)<0.5)
+					{
+						cString[h] = ps1[h];
+					}
+					else
+					{
+						cString[h] = ps2[h];					
+					}
+				}
+			}
+			cString 										= IsChildViable(MakeStringCanonical (cString,rateClassesCount));
+			aaRateMultipliers 								= StringToMatrix(cString);
+			intermediateProbs[populationSize+individual][1] = populationSize+individual;
+			children  [individual] 							= cString;
+			RunASample 										  (compressedString[rateClassesCount-1],populationSize+individual);
+		}
+	}
+	CleanUpMPI (0);
+	if (doRepop)
+	{
+		newPop = {};
+		intermediateProbs = intermediateProbs%0;
+		for (h=produceOffspring; h<populationSize+produceOffspring; h=h+1)
+		{
+			v = intermediateProbs[h][1];
+			sortedScores[h-produceOffspring][1] = h-produceOffspring;
+			sortedScores[h-produceOffspring][0] = intermediateProbs[h][0];		
+			if (v<populationSize)
+			{
+				newPop[h-produceOffspring] = currentPopulation[v];
+			}
+			else
+			{
+				newPop[h-produceOffspring] = children[v-populationSize];
+			}
+		}
+		for (h=0; h<populationSize; h=h+1)
+		{
+			currentPopulation[h] = newPop[h];
+		}
+		
+		h = Abs((sortedScores[populationSize-1][0]-sortedScores[0][0])/sortedScores[0][0]);
+		if (verboseFlag)
+		{
+			fprintf (stdout, "Diversity level: ", h, " (hypermutation threshold: ", mutationThreshhold, ")\n");	
+		}
+		if (h<mutationThreshhold)
+		{
+			if (verboseFlag)
+			{
+				fprintf (stdout, "\nTriggered hypermutation...\n");
+			}
+			doMutation = 1;
+		}
+	}
+}
diff --git a/res/TemplateBatchFiles/GUI/crayolaColors.def b/res/TemplateBatchFiles/GUI/crayolaColors.def
new file mode 100644
index 0000000..8129e7e
--- /dev/null
+++ b/res/TemplateBatchFiles/GUI/crayolaColors.def
@@ -0,0 +1 @@
+CrayolaColors = 
diff --git a/res/TemplateBatchFiles/Gateaux.bf b/res/TemplateBatchFiles/Gateaux.bf
new file mode 100644
index 0000000..b2ec353
--- /dev/null
+++ b/res/TemplateBatchFiles/Gateaux.bf
@@ -0,0 +1,332 @@
+RequireVersion ("2.0020110101");
+
+ExecuteAFile  (HYPHY_LIB_DIRECTORY+"TemplateBatchFiles"+DIRECTORY_SEPARATOR+"TemplateModels"+DIRECTORY_SEPARATOR+"chooseGeneticCode.def");
+ExecuteAFile  (HYPHY_LIB_DIRECTORY+"TemplateBatchFiles"+DIRECTORY_SEPARATOR+"2RatesAnalyses"+DIRECTORY_SEPARATOR+"MG94xREVxBivariate.mdl");
+
+s_rateMin    = 0.01;
+s_rateMax    = 1.00;
+
+ns_rateMin    = 0.01;
+ns_rateMax    = 5.00;
+
+SetDialogPrompt ("Choose a model fit:");
+ExecuteAFile (PROMPT_FOR_FILE);
+outFile = LAST_FILE_PATH;
+GetInformation(vars,"^P_[0-9]+");
+rateCount = Columns (vars)+2;
+
+GetString 		(lfInfo, lf, -1);
+fileCount = 	Columns(lfInfo["Trees"])/(rateCount-1);
+
+LF_NEXUS_EXPORT_EXTRA = "bivariateFitHasMultipleCladeRates = " + bivariateFitHasMultipleCladeRates + ";";
+
+fprintf (stdout, "\nLoaded a fit on ", fileCount, " data sets with ", rateCount-1, " rates\n");
+
+timerCap = 0;
+while (timerCap < 1)
+{
+	fprintf (stdout, "\nSeconds (x3) to spend looking for directional improvement in fit (>=1, or -1 to search a fixed grid)?");
+	fscanf	(stdin, "Number",timerCap);
+	if (timerCap == (-1))
+	{
+		break;
+	}
+}
+
+if (timerCap < 0)
+{
+	fprintf (stdout, "Sampling 355 directions...\n");
+}
+else
+{
+	fprintf (stdout, "Allocated ", timerCap*3, " seconds for approximate search...\n");
+}
+
+LFCompute (lf,LF_START_COMPUTE);
+LFCompute (lf,res);
+LFCompute (lf,LF_DONE_COMPUTE);
+
+fprintf (stdout, "\nBaseline likelihood:", res);
+
+totalCodonCount = 0;
+for (fileID = 1; fileID <= fileCount; fileID = fileID + 1)
+{
+	ExecuteCommands		("totalCodonCount = totalCodonCount + filteredData_"+fileID+".sites;");
+}
+observedFreq       = {4,3};
+for (fileID = 1; fileID <= fileCount; fileID = fileID + 1)
+{
+	ExecuteCommands 	  ("HarvestFrequencies (tp, filteredData_"+fileID+",3,1,1);cfs=filteredData_"+fileID+".sites;");
+	observedFreq 		= observedFreq 		 + tp*(cfs/totalCodonCount);
+}
+
+ExecuteCommands ("global S_"+(rateCount-1)+"=0.5; global NS_"+(rateCount-1)+"=0.5;global P_"+(rateCount-1)+"=0.5;P_"+(rateCount-1)+":<1;");
+ExecuteCommands("PopulateModelMatrix(\"rate_matrix_"+(rateCount-1)+"\",observedFreq,\"S_\"+(rateCount-1)+\"/c_scale\",\"NS_\"+(rateCount-1)+\"/c_scale\");");
+ExecuteCommands("Model MG94MODEL_"+(rateCount-1)+"= (rate_matrix_"+(rateCount-1)+",vectorOfFrequencies,0);global P_"+(rateCount-1)+"=1/"+totalCodonCount+";");
+
+for (_modelID = 1; _modelID <  bivariateFitHasMultipleCladeRates; _modelID += 1)
+{
+    _cladeRate = "clade_" + _modelID + "_NS_" + (rateCount-1);
+    ExecuteCommands ("global " + _cladeRate + "= 1;");
+    ExecuteCommands("PopulateModelMatrix(\"rate_matrix_clade_"+_modelID + "_" + (rateCount-1)+"\",observedFreq,\"S_\"+(rateCount-1)+\"/c_scale\",\"" + _cladeRate + "*NS_\"+(rateCount-1)+\"/c_scale\");");
+    ExecuteCommands("Model MG94MODEL_CLADE"+_modelID + "_"+ (rateCount-1)+"= (rate_matrix_clade_"+_modelID + "_" + (rateCount-1)+",vectorOfFrequencies,0);");
+}
+
+for (fileID = 1; fileID <= fileCount; fileID = fileID + 1)
+{
+	ExecuteCommands ("treeString = \"\"+ tree_"+ fileID+ "_0;");
+	ExecuteCommands ("Tree tree_" + fileID + "_" + (rateCount-1) + "= treeString;");
+	ExecuteCommands ("ReplicateConstraint (\"this1.?.synRate:=this2.?.synRate\",tree_"+fileID+"_"+(rateCount-1)+",tree_"+fileID+"_0);");
+}
+
+lfDef	  = {};
+
+for (fileID = 0; fileID < fileCount; fileID = fileID + 1)
+{
+	lfDef[fileID] = "";
+	lfDef[fileID] * 1024;
+	lfDef[fileID] * "Log(";
+}
+
+ps 			 = {rateCount,1};
+
+for (mi = 0; mi < rateCount -2; mi=mi+1)
+{
+	ExecuteCommands ("ps["+mi+"]="+"P_"+(mi+1)+";");
+}
+
+scaler		 = 1-1/totalCodonCount;
+freqValueMatrix    = {rateCount,1};
+freqStrMatrix      = {rateCount,1};
+freqValueMatrix    = freqValueMatrix["scaler"];
+
+for (mi=0; mi<rateCount-2; mi=mi+1)
+{
+	freqStrMatrix[mi]   = "";
+	for (mi2 = 0; mi2 < mi; mi2=mi2+1)
+	{
+		freqValueMatrix[mi] = freqValueMatrix[mi] * (1-ps[mi2]);
+		freqStrMatrix[mi]   = freqStrMatrix[mi]+"(1-P_"+(mi2+1)+")*";
+	}
+	freqValueMatrix[mi] = freqValueMatrix[mi] * ps[mi];
+	freqStrMatrix[mi]   = freqStrMatrix[mi]+"P_"+(mi+1)+"";
+}
+
+freqStrMatrix[rateCount-2]   = "";
+freqStrMatrix[rateCount-1]   = "";
+
+
+for (mi2 = 0; mi2 < mi; mi2=mi2+1)
+{
+	freqValueMatrix[mi] = freqValueMatrix[mi] * (1-ps[mi2]);
+	freqStrMatrix[mi]   = freqStrMatrix[mi]+"(1-P_"+(mi2+1)+")*";
+}
+
+
+freqStrMatrix[rateCount-1] = freqStrMatrix[rateCount-2]+"(1-P_"+(rateCount-1)+")";
+freqStrMatrix[rateCount-2] = freqStrMatrix[rateCount-2]+"P_"+(rateCount-1);
+freqValueMatrix[rateCount-1] = 1-scaler;
+
+/* now solve for P_.. */
+
+P_1 = freqValueMatrix[0];
+runningTerm = 1-P_1;
+for (mi2 = 2; mi2 < rateCount-1; mi2=mi2+1)
+{
+	ExecuteCommands ("P_"+mi2+"=freqValueMatrix[mi2-1]/runningTerm;runningTerm=runningTerm*(1-P_"+mi2+");");
+}
+
+if (rateCount>2)
+{
+	ExecuteCommands ("P_"+(rateCount-1)+"=1-freqValueMatrix[rateCount-1]/runningTerm;");
+}
+
+lfParts = "";
+lfParts * 128;
+lfParts * "LikelihoodFunction lf = (";
+c_scalerS = "";
+
+for (mi=0; mi<rateCount; mi=mi+1)
+{
+	if (mi)
+	{
+		for (fileID = 0; fileID < fileCount; fileID = fileID + 1)
+		{
+			lfDef[fileID] * "+";
+		}
+		c_scalerS = c_scalerS+"+";
+	}
+
+	for (fileID = 0; fileID < fileCount; fileID = fileID + 1)
+	{
+		lfDef[fileID]*(""+freqStrMatrix[mi]+"*SITE_LIKELIHOOD["+(rateCount*fileID+mi)+"]");
+	}
+
+	c_scalerS = c_scalerS + freqStrMatrix[mi] + "*S_"+ mi;
+}
+
+for (fileID = 0; fileID < fileCount; fileID = fileID + 1)
+{
+	for (mi=0; mi<rateCount; mi=mi+1)
+	{
+		if (mi || fileID)
+		{
+			lfParts * ",";
+		}
+		lfParts * ("filteredData_"+(fileID+1)+",tree_"+(fileID+1)+"_"+mi);
+	}
+}
+
+lfParts * ",\"";
+
+for (fileID = 0; fileID < fileCount; fileID = fileID + 1)
+{
+	lfDef[fileID] * 0;
+	if (fileID)
+	{
+		lfParts * "+";
+	}
+	lfParts * (lfDef[fileID] + ")");
+}
+
+lfParts * "\");";
+lfParts * 0;
+
+ExecuteCommands ("c_scale:="+c_scalerS+";");
+ExecuteCommands (lfParts);
+
+timer = Time(0);
+
+LFCompute (lf,LF_START_COMPUTE);
+bestDiff = 0;
+bestS    = 0;
+bestNS   = 0;
+bestAlpha = 0;
+bestBeta  = 0;
+
+sampleCounter = 0;
+
+fprintf (stdout, "\nSampling negatively selected directions\n");
+
+if (timerCap > 0)
+{
+	while (Time(0)-timer <= timerCap)
+	{
+		v1 = Random(s_rateMin,s_rateMax);
+		v2 = Random(ns_rateMin,v1);
+		
+		checkASample (0);
+	}
+}
+else
+{
+	step = 1/16;
+	v1 = 0;
+	for (v1c = 0; v1c < 15; v1c = v1c + 1)
+	{
+		v1 = v1+step;
+		v2 = step/2; 
+		for (v2c = 0; v2c < v1c; v2c = v2c+1)
+		{
+			checkASample (0);	
+			v2 = v2 + step;
+		}
+	} 
+}
+
+timer = Time(0);
+fprintf (stdout, "\nSampling neutral directions\n");
+if (timerCap > 0)
+{
+	while (Time(0)-timer <= timerCap)
+	{
+		v1 = Random(s_rateMin,s_rateMax);
+		v2 = v1;
+		
+		checkASample (0);
+	}
+}
+else
+{
+	step = 0.02;
+	v1 = 0;
+	for (v1c = 0; v1c < 50; v1c = v1c + 1)
+	{
+		v1 = v1 + step;
+		v2 = v1;
+		
+		checkASample (0);
+	}	
+}	
+
+timer = Time(0);
+fprintf (stdout, "\nSampling positively selected directions\n");
+if (timerCap > 0)
+{
+	while (Time(0)-timer <= timerCap)
+	{
+		v1 = Random(s_rateMin,s_rateMax);
+		v2 = Random(v1,ns_rateMax);
+		checkASample (0);
+	}
+}
+else
+{
+	step  = 0.1;
+	step2 = 0.25;
+	
+	v1 = 0.05;
+	for (v1c = 0; v1c < 10; v1c = v1c + 1)
+	{
+		v2 = v1+step; 
+		for (v2c = 0; v2c < 20; v2c = v2c+1)
+		{
+			checkASample (0);	
+			v2 = v2 + step2;
+		}
+		v1 = v1+step;
+	} 
+}
+
+LFCompute (lf,LF_DONE_COMPUTE);
+
+fprintf (stdout, "\nExamined ", sampleCounter, " directions...\n");
+
+if (bestDiff > 0)
+{
+	fprintf (stdout, "\nFound a likelihood improvement in the direction (", bestS, ",", bestNS, ")\n");
+	slfo = LIKELIHOOD_FUNCTION_OUTPUT;
+	LIKELIHOOD_FUNCTION_OUTPUT = 7;
+	outFile = outFile+"."+rateCount;
+	ExecuteCommands ("S_"+(rateCount-1)+"=bestAlpha;NS_"+(rateCount-1)+"=bestBeta;");
+	fprintf(outFile,CLEAR_FILE,lf);
+	LIKELIHOOD_FUNCTION_OUTPUT = slfo;
+}
+else
+{
+	fprintf (stdout, "\nFailed to find an improvement...\n");
+}
+
+bivariateReturnAVL 			= {};
+bivariateReturnAVL ["DIFF"] = bestDiff;
+
+return bivariateReturnAVL;
+
+/*------------------------------------------------------------------------------------------------------------*/
+
+function checkASample (dummy)
+{
+	ExecuteCommands ("S_"+(rateCount-1)+"=v1;NS_"+(rateCount-1)+"=v2;");
+	LFCompute (lf,res_n);
+	if (res_n-res > bestDiff)
+	{
+		fprintf (stdout, "synRate = ", Format (v1,10,5), " nonSynRate = ", Format (v2,10,5), " Log Likelihood Diff: ", Format (res_n-res,10,5), "\n");
+		bestDiff 	= res_n-res;
+		bestS 		= v1/c_scale;
+		bestNS 		= v2/c_scale;
+		bestAlpha 	= v1;
+		bestBeta  	= v2;
+	}
+	sampleCounter = sampleCounter + 1;
+	return 0;
+}
diff --git a/res/TemplateBatchFiles/Gateaux2.bf b/res/TemplateBatchFiles/Gateaux2.bf
new file mode 100644
index 0000000..e1088ff
--- /dev/null
+++ b/res/TemplateBatchFiles/Gateaux2.bf
@@ -0,0 +1,302 @@
+incFileName = HYPHY_LIB_DIRECTORY+"TemplateBatchFiles"+DIRECTORY_SEPARATOR+"TemplateModels"+DIRECTORY_SEPARATOR+"chooseGeneticCode.def";
+ExecuteCommands  ("#include \""+incFileName+"\";");
+
+incFileName = HYPHY_LIB_DIRECTORY+"TemplateBatchFiles"+DIRECTORY_SEPARATOR+"2RatesAnalyses"+DIRECTORY_SEPARATOR+"MG94xREVxBivariate.mdl";
+ExecuteCommands  ("#include \""+incFileName+"\";");
+
+s_rateMin    = 0.01;
+s_rateMax    = 1.00;
+
+ns_rateMin    = 0.01;
+ns_rateMax    = 5.00;
+
+SetDialogPrompt ("Choose a model fit:");
+fscanf (PROMPT_FOR_FILE, "Raw", inFile);
+outFile = LAST_FILE_PATH;
+
+ExecuteCommands (inFile);
+GetInformation(vars,"^P_[0-9]+");
+rateCount = Columns (vars)+2;
+
+fprintf (stdout, "\nLoaded a fit with ", rateCount-1, " rates\n");
+
+ChoiceList (searchKind, "Search directions:", 1, SKIP_NONE,
+						"All", "Search all directions",
+						"Negative", "Only dS > dN directions",
+						"Neutral", "Only dS = dN directions",
+						"Positive", "Only dS < dN directions");
+						
+if (searchKind < 0)
+{
+	return 0;
+}
+
+timerCap = 0;
+while (timerCap < 1)
+{
+	fprintf (stdout, "\nSeconds (x3) to spend looking for directional improvement in fit (>=1, or -1 to search a fixed grid)?");
+	fscanf	(stdin, "Number",timerCap);
+	if (timerCap == (-1))
+	{
+		break;
+	}
+}
+
+if (timerCap < 0)
+{
+	fprintf (stdout, "Sampling 355 directions...\n");
+}
+else
+{
+	fprintf (stdout, "Allocated ", timerCap*3, " seconds for approximate search...\n");
+}
+
+LFCompute (lf,LF_START_COMPUTE);
+LFCompute (lf,res);
+LFCompute (lf,LF_DONE_COMPUTE);
+
+fprintf (stdout, "\nBaseline likelihood:", res);
+
+HarvestFrequencies (observedFreq,	   filteredData,3,1,1);
+ExecuteCommands ("global S_"+(rateCount-1)+"=0.5; global NS_"+(rateCount-1)+"=0.5;global P_"+(rateCount-1)+"=0.5;P_"+(rateCount-1)+":<1;");
+ExecuteCommands("PopulateModelMatrix(\"rate_matrix_"+(rateCount-1)+"\",observedFreq,\"S_\"+(rateCount-1)+\"/c_scale\",\"NS_\"+(rateCount-1)+\"/c_scale\");");
+ExecuteCommands("Model MG94model_"+(rateCount-1)+"= (rate_matrix_"+(rateCount-1)+",vectorOfFrequencies,0);");
+ExecuteCommands ("Tree tree_"+(rateCount-1)+"="+tree_0+";");
+ExecuteCommands ("ReplicateConstraint (\"this1.?.synRate:=this2.?.synRate\",tree_"+(rateCount-1)+",tree_0);global P_"+(rateCount-1)+"=1/"+filteredData.sites+";");
+
+lfDef1 	  = "";
+lfDef1 	  * 1024;
+lfDef1 	  * "\"Log(";
+
+ps 			 = {rateCount,1};
+
+for (mi = 0; mi < rateCount -2; mi=mi+1)
+{
+	ExecuteCommands ("ps["+mi+"]="+"P_"+(mi+1)+";");
+}
+
+scaler		 = 1-1/filteredData.sites;
+freqValueMatrix    = {rateCount,1};
+freqStrMatrix      = {rateCount,1};
+freqValueMatrix    = freqValueMatrix["scaler"];
+
+for (mi=0; mi<rateCount-2; mi=mi+1)
+{
+	freqStrMatrix[mi]   = "";
+	for (mi2 = 0; mi2 < mi; mi2=mi2+1)
+	{
+		freqValueMatrix[mi] = freqValueMatrix[mi] * (1-ps[mi2]);
+		freqStrMatrix[mi]   = freqStrMatrix[mi]+"(1-P_"+(mi2+1)+")*";
+	}
+	freqValueMatrix[mi] = freqValueMatrix[mi] * ps[mi];
+	freqStrMatrix[mi]   = freqStrMatrix[mi]+"P_"+(mi+1)+"";
+}
+
+freqStrMatrix[rateCount-2]   = "";
+freqStrMatrix[rateCount-1]   = "";
+
+
+for (mi2 = 0; mi2 < mi; mi2=mi2+1)
+{
+	freqValueMatrix[mi] = freqValueMatrix[mi] * (1-ps[mi2]);
+	freqStrMatrix[mi]   = freqStrMatrix[mi]+"(1-P_"+(mi2+1)+")*";
+}
+
+
+freqStrMatrix[rateCount-1] = freqStrMatrix[rateCount-2]+"(1-P_"+(rateCount-1)+")";
+freqStrMatrix[rateCount-2] = freqStrMatrix[rateCount-2]+"P_"+(rateCount-1);
+freqValueMatrix[rateCount-1] = 1-scaler;
+
+/* now solve for P_.. */
+
+P_1 = freqValueMatrix[0];
+runningTerm = 1-P_1;
+for (mi2 = 2; mi2 < rateCount-1; mi2=mi2+1)
+{
+	ExecuteCommands ("P_"+mi2+"=freqValueMatrix[mi2-1]/runningTerm;runningTerm=runningTerm*(1-P_"+mi2+");");
+}
+ExecuteCommands ("P_"+(rateCount-1)+"=1-freqValueMatrix[rateCount-1]/runningTerm;");
+
+lfParts = "LikelihoodFunction lf = (filteredData,tree_0";
+c_scalerS = "";
+for (mi=0; mi<rateCount; mi=mi+1)
+{
+	if (mi)
+	{
+		lfDef1 * "+";
+		c_scalerS = c_scalerS+"+";
+	}
+	c_scalerS = c_scalerS + freqStrMatrix[mi] + "*S_"+ mi;
+	lfDef1*(""+freqStrMatrix[mi]+"*SITE_LIKELIHOOD["+mi+"]");
+	if (mi)
+	{
+		lfParts = lfParts + ",filteredData,tree_"+mi;
+	}
+}
+
+lfDef1*0;
+
+ExecuteCommands ("c_scale:="+c_scalerS+";");
+ExecuteCommands (lfParts + "," + lfDef1 + ")\");");
+
+timer = Time(0);
+
+LFCompute (lf,LF_START_COMPUTE);
+bestDiff = 0;
+bestS    = 0;
+bestNS   = 0;
+bestAlpha = 0;
+bestBeta  = 0;
+
+sampleCounter = 0;
+
+if (searchKind == 0 || searchKind == 1)
+{
+	fprintf (stdout, "\nSampling negatively selected directions\n");
+
+	if (timerCap > 0)
+	{
+		while (Time(0)-timer <= timerCap)
+		{
+			v1 = Random(s_rateMin,s_rateMax);
+			v2 = Random(ns_rateMin,v1);
+			
+			checkASample (0);
+		}
+	}
+	else
+	{
+		step = 1/16;
+		v1 = 0;
+		for (v1c = 0; v1c < 15; v1c = v1c + 1)
+		{
+			v1 = v1+step;
+			v2 = step/2; 
+			for (v2c = 0; v2c < v1c; v2c = v2c+1)
+			{
+				checkASample (0);	
+				v2 = v2 + step;
+			}
+		} 
+	}
+}
+
+if (searchKind == 0 || searchKind == 2)
+{
+	timer = Time(0);
+	fprintf (stdout, "\nSampling neutral directions\n");
+	if (timerCap > 0)
+	{
+		while (Time(0)-timer <= timerCap)
+		{
+			v1 = Random(s_rateMin,s_rateMax);
+			v2 = v1;
+			
+			checkASample (0);
+		}
+	}
+	else
+	{
+		step = 0.02;
+		v1 = 0;
+		for (v1c = 0; v1c < 50; v1c = v1c + 1)
+		{
+			v1 = v1 + step;
+			v2 = v1;
+			
+			checkASample (0);
+		}	
+	}	
+}
+
+if (searchKind == 0 || searchKind == 3)
+{
+	timer = Time(0);
+	fprintf (stdout, "\nSampling positively selected directions\n");
+	if (timerCap > 0)
+	{
+		while (Time(0)-timer <= timerCap)
+		{
+			v1 = Random(s_rateMin,s_rateMax);
+			v2 = Random(v1,ns_rateMax);
+			checkASample (0);
+		}
+	}
+	else
+	{
+		step  = 0.1;
+		step2 = 0.25;
+		
+		v1 = 0.05;
+		for (v1c = 0; v1c < 10; v1c = v1c + 1)
+		{
+			v2 = v1+step; 
+			for (v2c = 0; v2c < 20; v2c = v2c+1)
+			{
+				checkASample (0);	
+				v2 = v2 + step2;
+			}
+		} 
+		v1 = v1+step;
+	}
+}
+
+LFCompute (lf,LF_DONE_COMPUTE);
+
+fprintf (stdout, "\nExamined ", sampleCounter, " directions...\n");
+
+if (bestDiff > 0)
+{
+	fprintf (stdout, "\nFound a likelihood improvement in the direction (", bestS, ",", bestNS, ")\n");
+	slfo = LIKELIHOOD_FUNCTION_OUTPUT;
+	LIKELIHOOD_FUNCTION_OUTPUT = 7;
+	outFile = outFile+"."+rateCount;
+	ExecuteCommands ("S_"+(rateCount-1)+"=bestAlpha;NS_"+(rateCount-1)+"=bestBeta;");
+	if (searchKind == 1 || searchKind == 3)
+	{
+		ExecuteCommands ("global R_"+(rateCount-1)+
+						 "=NS_"+(rateCount-1)+
+						 "/S_"+(rateCount-1)+";NS_"+(rateCount-1)+":=R_"+(rateCount-1)+"*S_"+(rateCount-1)+";");
+		if (searchKind == 1)
+		{
+			ExecuteCommands ("R_"+(rateCount-1)+":<1.0;\n")
+		}
+		else
+		{
+			ExecuteCommands ("R_"+(rateCount-1)+":>1.0;\n")	
+		}
+	}
+	else
+	{
+		if (searchKind == 2)
+		{
+			ExecuteCommands ("NS_"+(rateCount-1)+":=S_"+(rateCount-1)+";");
+		}
+	}
+	fprintf(outFile,CLEAR_FILE,lf);
+	LIKELIHOOD_FUNCTION_OUTPUT = slfo;
+}
+else
+{
+	fprintf (stdout, "\nFailed to find an improvement...\n");
+}
+
+
+/*------------------------------------------------------------------------------------------------------------*/
+
+function checkASample (dummy)
+{
+	ExecuteCommands ("S_"+(rateCount-1)+"=v1;NS_"+(rateCount-1)+"=v2;");
+	LFCompute (lf,res_n);
+	if (res_n-res > bestDiff)
+	{
+		fprintf (stdout, "synRate = ", Format (v1,10,5), " nonSynRate = ", Format (v2,10,5), " Log Likelihood Diff: ", Format (res_n-res,10,5), "\n");
+		bestDiff 	= res_n-res;
+		bestS 		= v1/c_scale;
+		bestNS 		= v2/c_scale;
+		bestAlpha 	= v1;
+		bestBeta  	= v2;
+	}
+	sampleCounter = sampleCounter + 1;
+	return 0;
+}
diff --git a/res/TemplateBatchFiles/GateauxMR.bf b/res/TemplateBatchFiles/GateauxMR.bf
new file mode 100644
index 0000000..167def9
--- /dev/null
+++ b/res/TemplateBatchFiles/GateauxMR.bf
@@ -0,0 +1,328 @@
+RequireVersion ("0.9920060817");
+
+
+s_rateMin    = 0.01;
+s_rateMax    = 1.00;
+
+ns_rateMin    = 0.01;
+ns_rateMax    = 5.00;
+
+SetDialogPrompt ("Choose a model fit:");
+ExecuteAFile (PROMPT_FOR_FILE);
+
+if (bivariateFitHasMultipleCladeRates>1)
+{
+    LF_NEXUS_EXPORT_EXTRA = "bivariateFitHasMultipleCladeRates = " + bivariateFitHasMultipleCladeRates + ";";
+    INCLUDE_MODEL_SPECS = 1;
+}
+
+outFile = LAST_FILE_PATH;
+GetInformation(vars,"^P_[0-9]+");
+rateCount = Columns (vars)+2;
+
+GetString 		(lfInfo, lf, -1);
+fileCount = 	Columns(lfInfo["Trees"])/(rateCount-1);
+
+fprintf (stdout, "\nLoaded a fit on ", fileCount, " data sets with ", rateCount-1, " rates\n");
+
+timerCap = 0;
+while (timerCap < 1)
+{
+	fprintf (stdout, "\nSeconds (x3) to spend looking for directional improvement in fit (>=1, or -1 to search a fixed grid)?");
+	fscanf	(stdin, "Number",timerCap);
+	if (timerCap == (-1))
+	{
+		break;
+	}
+}
+
+if (timerCap < 0)
+{
+	fprintf (stdout, "Sampling 355 directions...\n");
+}
+else
+{
+	fprintf (stdout, "Allocated ", timerCap*3, " seconds for approximate search...\n");
+}
+
+LFCompute (lf,LF_START_COMPUTE);
+LFCompute (lf,res);
+LFCompute (lf,LF_DONE_COMPUTE);
+
+fprintf (stdout, "\nBaseline likelihood:", res);
+
+
+ExecuteCommands ("global S_"+(rateCount-1)+"=0.5; global NS_"+(rateCount-1)+"=0.5;global P_"+(rateCount-1)+"=0.5;P_"+(rateCount-1)+":<1;");
+ExecuteCommands("PopulateModelMatrix(\"rate_matrix_"+(rateCount-1)+"\",paramFreqs,\"S_\"+(rateCount-1)+\"/c_scale\",\"NS_\"+(rateCount-1)+\"/c_scale\",aaRateMultipliers);");
+ExecuteCommands("Model MG94MODEL_"+(rateCount-1)+"= (rate_matrix_"+(rateCount-1)+",vectorOfFrequencies,0);global P_"+(rateCount-1)+"=1/"+totalCodonCount+";");
+
+for (_modelID = 1; _modelID <  bivariateFitHasMultipleCladeRates; _modelID += 1)
+{
+    _cladeRate = "clade_" + _modelID + "_NS_" + (rateCount-1);
+    ExecuteCommands ("global " + _cladeRate + " = 1");
+    ExecuteCommands("PopulateModelMatrix(\"rate_matrix_clade_"+_modelID + "_" + (rateCount-1)+"\",observedFreq,\"S_\"+(rateCount-1)+\"/c_scale\",\"" + _cladeRate + "*NS_\"+(rateCount-1)+\"/c_scale\",aaRateMultipliers);");
+    ExecuteCommands("Model MG94MODEL_ "+ (rateCount-1)+"_CLADE_"+_modelID + "= (rate_matrix_clade_"+_modelID + "_" + (rateCount-1)+",vectorOfFrequencies,0);");
+}
+
+for (fileID = 1; fileID <= fileCount; fileID = fileID + 1)
+{
+	ExecuteCommands ("treeString = \"\"+tree_"+ fileID+ "_0;");
+    if (bivariateFitHasMultipleCladeRates>1)
+    {
+        treeString = treeString ^ {{"MG94MODEL_0","MG94MODEL_" + (rateCount-1)}};
+    }
+	ExecuteCommands ("Tree tree_" + fileID + "_" + (rateCount-1) + "= treeString;");
+	ExecuteCommands ("ReplicateConstraint (\"this1.?.synRate:=this2.?.synRate\",tree_"+fileID+"_"+(rateCount-1)+",tree_"+fileID+"_0);");
+}
+
+lfDef	  = {};
+
+for (fileID = 0; fileID < fileCount; fileID = fileID + 1)
+{
+	lfDef[fileID] = "";
+	lfDef[fileID] * 1024;
+	lfDef[fileID] * "Log(";
+}
+
+ps 			 = {rateCount,1};
+
+for (mi = 0; mi < rateCount -2; mi=mi+1)
+{
+	ExecuteCommands ("ps["+mi+"]="+"P_"+(mi+1)+";");
+}
+
+scaler		 = 1-1/totalCodonCount;
+freqValueMatrix    = {rateCount,1};
+freqStrMatrix      = {rateCount,1};
+freqValueMatrix    = freqValueMatrix["scaler"];
+
+for (mi=0; mi<rateCount-2; mi=mi+1)
+{
+	freqStrMatrix[mi]   = "";
+	for (mi2 = 0; mi2 < mi; mi2=mi2+1)
+	{
+		freqValueMatrix[mi] = freqValueMatrix[mi] * (1-ps[mi2]);
+		freqStrMatrix[mi]   = freqStrMatrix[mi]+"(1-P_"+(mi2+1)+")*";
+	}
+	freqValueMatrix[mi] = freqValueMatrix[mi] * ps[mi];
+	freqStrMatrix[mi]   = freqStrMatrix[mi]+"P_"+(mi+1)+"";
+}
+
+freqStrMatrix[rateCount-2]   = "";
+freqStrMatrix[rateCount-1]   = "";
+
+
+for (mi2 = 0; mi2 < mi; mi2=mi2+1)
+{
+	freqValueMatrix[mi] = freqValueMatrix[mi] * (1-ps[mi2]);
+	freqStrMatrix[mi]   = freqStrMatrix[mi]+"(1-P_"+(mi2+1)+")*";
+}
+
+
+freqStrMatrix[rateCount-1] = freqStrMatrix[rateCount-2]+"(1-P_"+(rateCount-1)+")";
+freqStrMatrix[rateCount-2] = freqStrMatrix[rateCount-2]+"P_"+(rateCount-1);
+freqValueMatrix[rateCount-1] = 1-scaler;
+
+/* now solve for P_.. */
+
+P_1 = freqValueMatrix[0];
+runningTerm = 1-P_1;
+for (mi2 = 2; mi2 < rateCount-1; mi2=mi2+1)
+{
+	ExecuteCommands ("P_"+mi2+"=freqValueMatrix[mi2-1]/runningTerm;runningTerm=runningTerm*(1-P_"+mi2+");");
+}
+
+if (rateCount>2)
+{
+	ExecuteCommands ("P_"+(rateCount-1)+"=1-freqValueMatrix[rateCount-1]/runningTerm;");
+}
+
+lfParts = "";
+lfParts * 128;
+lfParts * "LikelihoodFunction lf = (";
+c_scalerS = "";
+
+for (mi=0; mi<rateCount; mi=mi+1)
+{
+	if (mi)
+	{
+		for (fileID = 0; fileID < fileCount; fileID = fileID + 1)
+		{
+			lfDef[fileID] * "+";
+		}
+		c_scalerS = c_scalerS+"+";
+	}
+
+	for (fileID = 0; fileID < fileCount; fileID = fileID + 1)
+	{
+		lfDef[fileID]*(""+freqStrMatrix[mi]+"*SITE_LIKELIHOOD["+(rateCount*fileID+mi)+"]");
+	}
+
+	c_scalerS = c_scalerS + freqStrMatrix[mi] + "*S_"+ mi;
+}
+
+for (fileID = 0; fileID < fileCount; fileID = fileID + 1)
+{
+	for (mi=0; mi<rateCount; mi=mi+1)
+	{
+		if (mi || fileID)
+		{
+			lfParts * ",";
+		}
+		lfParts * ("filteredData_"+(fileID+1)+",tree_"+(fileID+1)+"_"+mi);
+	}
+}
+
+lfParts * ",\"";
+
+for (fileID = 0; fileID < fileCount; fileID = fileID + 1)
+{
+	lfDef[fileID] * 0;
+	if (fileID)
+	{
+		lfParts * "+";
+	}
+	lfParts * (lfDef[fileID] + ")");
+}
+
+lfParts * "\");";
+lfParts * 0;
+
+ExecuteCommands ("c_scale:="+c_scalerS+";");
+ExecuteCommands (lfParts);
+
+timer = Time(0);
+
+LFCompute (lf,LF_START_COMPUTE);
+bestDiff = 0;
+bestS    = 0;
+bestNS   = 0;
+bestAlpha = 0;
+bestBeta  = 0;
+
+sampleCounter = 0;
+
+fprintf (stdout, "\nSampling negatively selected directions\n");
+
+if (timerCap > 0)
+{
+	while (Time(0)-timer <= timerCap)
+	{
+		v1 = Random(s_rateMin,s_rateMax);
+		v2 = Random(ns_rateMin,v1);
+		
+		checkASample ();
+	}
+}
+else
+{
+	step = 1/16;
+	v1 = 0;
+	for (v1c = 0; v1c < 15; v1c = v1c + 1)
+	{
+		v1 = v1+step;
+		v2 = step/2; 
+		for (v2c = 0; v2c < v1c; v2c = v2c+1)
+		{
+			checkASample ();	
+			v2 = v2 + step;
+		}
+	} 
+}
+
+timer = Time(0);
+fprintf (stdout, "\nSampling neutral directions\n");
+if (timerCap > 0)
+{
+	while (Time(0)-timer <= timerCap)
+	{
+		v1 = Random(s_rateMin,s_rateMax);
+		v2 = v1;
+		
+		checkASample ();
+	}
+}
+else
+{
+	step = 0.02;
+	v1 = 0;
+	for (v1c = 0; v1c < 50; v1c = v1c + 1)
+	{
+		v1 = v1 + step;
+		v2 = v1;
+		
+		checkASample ();
+	}	
+}	
+
+timer = Time(0);
+fprintf (stdout, "\nSampling positively selected directions\n");
+if (timerCap > 0)
+{
+	while (Time(0)-timer <= timerCap)
+	{
+		v1 = Random(s_rateMin,s_rateMax);
+		v2 = Random(v1,ns_rateMax);
+		checkASample ();
+	}
+}
+else
+{
+	step  = 0.1;
+	step2 = 0.25;
+	
+	v1 = 0.05;
+	for (v1c = 0; v1c < 10; v1c = v1c + 1)
+	{
+		v2 = v1+step; 
+		for (v2c = 0; v2c < 20; v2c = v2c+1)
+		{
+			checkASample ();	
+			v2 = v2 + step2;
+		}
+		v1 = v1+step;
+	} 
+}
+
+LFCompute (lf,LF_DONE_COMPUTE);
+
+fprintf (stdout, "\nExamined ", sampleCounter, " directions...\n");
+
+if (bestDiff > 0)
+{
+	fprintf (stdout, "\nFound a likelihood improvement in the direction (", bestS, ",", bestNS, ")\n");
+	slfo = LIKELIHOOD_FUNCTION_OUTPUT;
+	LIKELIHOOD_FUNCTION_OUTPUT = 7;
+	outFile = outFile+"."+rateCount;
+	ExecuteCommands ("S_"+(rateCount-1)+"=bestAlpha;NS_"+(rateCount-1)+"=bestBeta;");
+	fprintf(outFile,CLEAR_FILE,lf);
+	LIKELIHOOD_FUNCTION_OUTPUT = slfo;
+}
+else
+{
+	fprintf (stdout, "\nFailed to find an improvement...\n");
+}
+
+bivariateReturnAVL 			= {};
+bivariateReturnAVL ["DIFF"] = bestDiff;
+
+return bivariateReturnAVL;
+
+/*------------------------------------------------------------------------------------------------------------*/
+
+function checkASample ()
+{
+	ExecuteCommands ("S_"+(rateCount-1)+"=v1;NS_"+(rateCount-1)+"=v2;");
+	LFCompute (lf,res_n);
+	if (res_n-res > bestDiff)
+	{
+		fprintf (stdout, "synRate = ", Format (v1,10,5), " nonSynRate = ", Format (v2,10,5), " Log Likelihood Diff: ", Format (res_n-res,10,5), "\n");
+		bestDiff 	= res_n-res;
+		bestS 		= v1/c_scale;
+		bestNS 		= v2/c_scale;
+		bestAlpha 	= v1;
+		bestBeta  	= v2;
+	}
+	sampleCounter = sampleCounter + 1;
+	return 0;
+}
diff --git a/res/TemplateBatchFiles/KHTest.bf b/res/TemplateBatchFiles/KHTest.bf
new file mode 100644
index 0000000..c158750
--- /dev/null
+++ b/res/TemplateBatchFiles/KHTest.bf
@@ -0,0 +1,317 @@
+VERBOSITY_LEVEL = -1;
+ALLOW_SEQUENCE_MISMATCH = 1;
+
+fprintf(stdout,"\n ---- RUNNING KH ALTERNATIVE TOPOLOGY TEST ---- \n");
+
+ChoiceList (dataType,"Data type",1,SKIP_NONE,"Nucleotide/Protein","Nucleotide or amino-acid (protein).",
+				     "Codon","Codon (several available genetic codes).");
+
+if (dataType<0) 
+{
+	return;
+}
+
+if (dataType)
+{
+	NICETY_LEVEL = 3;
+	SetDialogPrompt ("Please choose a codon data file:");
+	#include "TemplateModels/chooseGeneticCode.def";
+}
+else
+{
+	SetDialogPrompt ("Please choose a nucleotide or amino-acid data file:");
+}
+
+DataSet ds = ReadDataFile (PROMPT_FOR_FILE);
+fprintf (stdout,"The following data were read:\n",ds,"\n");
+
+ChoiceList (compType,"Comparison Kind",1,SKIP_NONE,"Full Alignment","Compare the trees applied to the full alignment.",
+				     "Recombination Test","Compare the trees on 2 parts of the alignment, reversing their roles before and after the breakpoint.");
+
+
+if (compType<0) 
+{
+	return;
+}
+
+if (dataType)
+{
+	DataSetFilter filteredData = CreateFilter (ds,3,"","",GeneticCodeExclusions);
+}
+else
+{
+	DataSetFilter filteredData = CreateFilter (ds,1);
+}
+
+
+SelectTemplateModel(filteredData);
+
+firstTreeString  = "";
+secondTreeString = "";
+
+if (Rows(NEXUS_FILE_TREE_MATRIX)>=2)
+{
+	ChoiceList (tc,"Choose first tree",1,SKIP_NONE,NEXUS_FILE_TREE_MATRIX);
+	if (tc>=0)
+	{
+		firstTreeString = NEXUS_FILE_TREE_MATRIX[tc][1];
+		skipMx = {{tc__}};
+		ChoiceList (tc,"Choose second tree",1,skipMx,NEXUS_FILE_TREE_MATRIX);
+		if (tc>=0)
+		{
+			secondTreeString = NEXUS_FILE_TREE_MATRIX[tc][1];		
+		}
+	}
+	else
+	{
+		ChoiceList (tc,"Choose second tree",1,SKIP_NONE,NEXUS_FILE_TREE_MATRIX);	
+		if (tc>=0)
+		{
+			secondTreeString = NEXUS_FILE_TREE_MATRIX[tc][1];		
+		}
+	}
+}
+else
+{
+	SetDialogPrompt ("Load a tree for the first partition");
+	fscanf (PROMPT_FOR_FILE, "String", firstTreeString);
+	SetDialogPrompt ("Load a tree for the second partition");
+	fscanf (PROMPT_FOR_FILE, "String", secondTreeString);
+}
+
+if (Abs(firstTreeString) == 0)
+{
+	SetDialogPrompt ("Locate the file with the first tree:");
+	fscanf 			(PROMPT_FOR_FILE,"Tree",firstTree);
+}
+else
+{
+	Tree firstTree = firstTreeString;
+}
+
+if (Abs(secondTreeString) == 0)
+{
+	SetDialogPrompt ("Locate the file with the second tree:");
+	fscanf 			(PROMPT_FOR_FILE,"Tree",secondTree);
+}
+else
+{
+	Tree secondTree = secondTreeString;
+}
+
+if (firstTree == secondTree)
+{
+	fprintf (stdout, "\nERROR: The two trees cannot be equal\n");
+	return 0;
+}
+
+firstTreeString  = ""+firstTree;
+secondTreeString = ""+secondTree;
+
+fprintf (stdout, "\nFirst tree:\n",firstTreeString, "\n\nSecond Tree:\n",secondTreeString,"\n");
+
+itCount = 0;
+while (itCount<1)
+{
+	fprintf (stdout, "\nHow many bootstrap replicates should be done (>0):");
+	fscanf (stdin, "Number", itCount);
+}
+
+labels = {{"Resampled LRT"}};
+
+if (compType)
+{
+	breakPoint = 0;
+	if (dataType)
+	{
+		pPrompt = "codons";
+	}
+	else
+	{
+		pPrompt = "bp";	
+	}
+	while (breakPoint<1 || breakPoint > filteredData.sites-2)
+	{
+		fprintf (stdout, "\nEnter the location of the breakpoint (0-based and measured in ", pPrompt, "). Valid locations are [1-", filteredData.sites-3, "]:");
+		fscanf (stdin, "Number", breakPoint);
+	}
+	fprintf (stdout, "\nUsing the breakpoint at ", breakPoint, "-th ", pPrompt, "\n");
+	if (dataType)
+	{
+		DataSetFilter filteredData1 = CreateFilter (ds,3,siteIndex<3*breakPoint,"",GeneticCodeExclusions);
+		DataSetFilter filteredData2 = CreateFilter (ds,3,siteIndex>=3*breakPoint,"",GeneticCodeExclusions);
+	}
+	else
+	{
+		DataSetFilter filteredData1 = CreateFilter (ds,1,siteIndex<breakPoint);
+		DataSetFilter filteredData2 = CreateFilter (ds,1,siteIndex>=breakPoint);	
+	}
+	LikelihoodFunction lf1_1 = (filteredData1,firstTree);
+	Optimize (res1_1, lf1_1);
+	ConstructCategoryMatrix (v1,lf1_1,COMPLETE);
+	fprintf (stdout, "\n\n1). FITTING TREE 1 TO PARTITION 1\n", lf1_1);
+	LikelihoodFunction lf1_2 = (filteredData1,secondTree);
+	Optimize (res1_2, lf1_2);
+	ConstructCategoryMatrix (v2,lf1_2,COMPLETE);
+	fprintf (stdout, "\n\n2). FITTING TREE 2 TO PARTITION 1\n", lf1_2);
+	LikelihoodFunction lf2_1 = (filteredData2,firstTree);
+	Optimize (res2_1, lf2_1);
+	ConstructCategoryMatrix (v3,lf2_1,COMPLETE);
+	fprintf (stdout, "\n\n3). FITTING TREE 1 TO PARTITION 2\n", lf2_1);
+	LikelihoodFunction lf2_2 = (filteredData2,secondTree);
+	Optimize (res2_2, lf2_2);
+	ConstructCategoryMatrix (v4,lf2_2,COMPLETE);
+	fprintf (stdout, "\n\n4). FITTING TREE 2 TO PARTITION 2\n", lf2_2);
+	
+	LRT1 = 2*(res1_1[1][0]-res1_2[1][0]);
+	LRT2 = 2*(res2_2[1][0]-res2_1[1][0]);
+	
+	fprintf (stdout, "\n\nSUMMARY:\n\n\tPARTITION 1 LRT = ",LRT1, "\n\tPARTITION 2 LRT = ", LRT2);
+	if (LRT1 < 0 || LRT2 < 0)
+	{
+		fprintf (stdout, "\n\nERROR: Both LRTs were expeceted to be positive.\nPlease check your trees and partition");
+		return 0;
+	}
+	
+	test1 = testLRT (v1,v2)%0;
+	
+	for (k=0; k<Columns(v1); k=k+1)
+	{
+		if (test1[k]>0)
+		{
+			break;
+		}
+	}	
+	
+	fprintf (stdout, "\n\nEstimated p-value for the FIRST partition (based on ", itCount," replicates): ", Format(k/itCount,10,4));
+	
+	
+	OpenWindow (CHARTWINDOW,{{"Simulated LRT for the First Partition"}
+		{"labels"}
+		{"test1"}
+		{"Step Plot"}
+		{"Index"}
+		{labels[0]}
+		{"Index"}
+		{"LRT"}
+		{"LRT"}
+		{""}
+		{""+LRT1}
+		{""}
+		{"10;1.309;0.785398"}
+		{"Times:12:0;Times:10:0;Times:14:2"}
+		{"0;0;16777215;5000268;0;0;6750054;11842740;13158600;14474460;0;3947580;16777215;5000268;11776947;10066329;9199669;7018159;1460610;16748822;11184810;14173291;14173291"}
+		{"16"}
+		},
+		"(SCREEN_WIDTH-30)/2;(SCREEN_HEIGHT-50)/2;10;40");
+	
+	test2 = testLRT (v4,v3)%0;
+
+	for (k=0; k<Columns(v3); k=k+1)
+	{
+		if (test2[k]>0)
+		{
+			break;
+		}
+	}	
+	
+	fprintf (stdout, "\n\nEstimated p-value for the SECOND partition (based on ", itCount," replicates): ", Format(k/itCount,10,4),"\n");
+	OpenWindow (CHARTWINDOW,{{"Simulated LRT for the Second Partition"}
+		{"labels"}
+		{"test2"}
+		{"Step Plot"}
+		{"Index"}
+		{labels[0]}
+		{"Index"}
+		{"LRT"}
+		{"LRT"}
+		{""}
+		{""+LRT2}
+		{""}
+		{"10;1.309;0.785398"}
+		{"Times:12:0;Times:10:0;Times:14:2"}
+		{"0;0;16777215;5000268;0;0;6750054;11842740;13158600;14474460;0;3947580;16777215;5000268;11776947;10066329;9199669;7018159;1460610;16748822;11184810;14173291;14173291"}
+		{"16"}
+		},
+		"(SCREEN_WIDTH-30)/2;(SCREEN_HEIGHT-50)/2;20+(SCREEN_WIDTH)/2;40");
+}
+else
+{
+	LikelihoodFunction		 lf1 = (filteredData,firstTree);
+	Optimize				 (res1, lf1);
+	ConstructCategoryMatrix  (v1,lf1,COMPLETE);
+	fprintf					 (stdout, "\n\n1). FITTING TREE 1 TO THE DATA\n", lf1);
+	LikelihoodFunction lf2 = (filteredData,secondTree);
+	Optimize				 (res2, lf2);
+	ConstructCategoryMatrix  (v2,lf2,COMPLETE);
+	fprintf					 (stdout, "\n\n2). FITTING TREE 2 TO THE DATA\n", lf2);
+
+	LRT1					 = 2*(res1[1][0]-res2[1][0]);
+	
+	fprintf (stdout, "\n\nSUMMARY:\n\n\tLRT = ",LRT1);
+	if (LRT1 < 0)
+	{
+		fprintf (stdout, "\n\nERROR: The LRTs was expeceted to be positive.\nPlease check your trees and alignment (or swap the trees)");
+		return 0;
+	}
+
+
+	test1 = testLRT (v1,v2)%0;
+	for (k=0; k<Columns(v1); k=k+1)
+	{
+		if (test1[k]>0)
+		{
+			break;
+		}
+	}	
+	
+	fprintf (stdout, "\n\nEstimated p-value for  (based on ", itCount," replicates): ", Format(k/itCount,10,4),"\n");
+	OpenWindow (CHARTWINDOW,{{"Simulated LRT"}
+		{"labels"}
+		{"test1"}
+		{"Step Plot"}
+		{"Index"}
+		{labels[0]}
+		{"Index"}
+		{"LRT"}
+		{"LRT"}
+		{""}
+		{""+LRT1}
+		{""}
+		{"10;1.309;0.785398"}
+		{"Times:12:0;Times:10:0;Times:14:2"}
+		{"0;0;16777215;5000268;0;0;6750054;11842740;13158600;14474460;0;3947580;16777215;5000268;11776947;10066329;9199669;7018159;1460610;16748822;11184810;14173291;14173291"}
+		{"16"}
+		},
+		"(SCREEN_WIDTH-30)/2;(SCREEN_HEIGHT-50)/2;20+(SCREEN_WIDTH)/2;40");
+}
+
+/*--------------------------------------------------------------------------------------*/
+
+function testLRT (vec1, vec2)
+{
+	size1 = Columns(vec1);
+	
+	sumVec1 = {size1,1};
+	jvec	= {2,size1};
+	resMx1	= {itCount,1};
+	resMx2	= {itCount,1};
+	
+	for (k=0; k<size1; k=k+1)
+	{
+		sumVec1 [k]	   = 1;
+		jvec	[0][k] = Log(vec1[k]);
+		jvec	[1][k] = Log(vec2[k]);
+	}
+	
+	
+	for (k=0; k<itCount; k=k+1)
+	{
+		resampled = Random(jvec,1);
+		resampled = resampled*sumVec1;
+		resMx1[k] = resampled[0];
+		resMx2[k] = resampled[1];
+	}
+	
+	return (resMx1-resMx2)*2;
+}
diff --git a/res/TemplateBatchFiles/Kernel_PCA.bf b/res/TemplateBatchFiles/Kernel_PCA.bf
new file mode 100644
index 0000000..12c8fb4
--- /dev/null
+++ b/res/TemplateBatchFiles/Kernel_PCA.bf
@@ -0,0 +1,62 @@
+ExecuteAFile 			("Kernel_support.ibf");
+read_kernel_matrix 		(0);
+
+SetDialogPrompt 		("Write component variance explained to:");
+DEFAULT_FILE_SAVE_NAME = "KPCA_components.csv";
+fprintf 		 		(PROMPT_FOR_FILE,CLEAR_FILE,KEEP_OPEN,"Component,% Explained Variance");
+varianceCompPath		= LAST_FILE_PATH;
+
+SetDialogPrompt 		  ("Write rotated datapoints to:");
+DEFAULT_FILE_SAVE_NAME  = "KPCA_projections.csv";
+fprintf 		 		  (PROMPT_FOR_FILE,CLEAR_FILE,KEEP_OPEN,"Point");
+projectionPath			= LAST_FILE_PATH;
+
+kernelPCAOut 			= perform_kernel_PCA (kernel_matrix);
+
+normEV					= kernelPCAOut["E-Vectors"];
+components				= Rows (normEV);
+eval					= kernelPCAOut["E-Values"];
+rotated 				= kernelPCAOut["Rotated"];
+
+fprintf (stdout, "Found ", components, " significant components\n");
+
+columnHeaders = {1,components};
+
+for (k=0; k<components; k=k+1)
+{
+	fprintf (varianceCompPath, "\n", k+1, ",", 100*eval[k]);
+	fprintf (projectionPath, ",Component_", k+1);
+	columnHeaders[k] = "Component "+(k+1) + "[" + (100*eval[k]) + "%]";
+}
+
+fprintf (varianceCompPath, CLOSE_FILE);
+
+for (k=0; k<points; k=k+1)
+{
+	fprintf (projectionPath, "\n", names[k+1]);
+	for (k2=0; k2<components; k2=k2+1)
+	{
+		fprintf (projectionPath, ",", rotated[k][k2]);
+	}
+}
+
+fprintf (projectionPath,CLOSE_FILE);
+
+OpenWindow (CHARTWINDOW,{{"PCA projections"}
+			{"columnHeaders"}
+			{"rotated"}
+			{"Scatterplot"}
+			{columnHeaders[0]}
+			{columnHeaders[1]}
+			{"1st component"}
+			{""}
+			{"2nd component"}
+			{"0"}
+			{""}
+			{"-1;-1"}
+			{"10;1.309;0.785398"}
+			{"Times:12:0;Times:10:0;Times:12:2"}
+			{"0;0;16777215;16777215;0;0;6579300;11842740;13158600;14474460;0;3947580;16777215;16711680;6845928;16771158;2984993;9199669;7018159;1460610;16748822;11184810;14173291"}
+			{"16,0,0"}
+			},
+			"671;681;70;70");
diff --git a/res/TemplateBatchFiles/Kernel_k_means.bf b/res/TemplateBatchFiles/Kernel_k_means.bf
new file mode 100644
index 0000000..2a97c9a
--- /dev/null
+++ b/res/TemplateBatchFiles/Kernel_k_means.bf
@@ -0,0 +1,245 @@
+ExecuteAFile 	("Kernel_support.ibf");
+read_kernel_matrix (0);
+
+fprintf (stdout, "How many clusters?");
+fscanf (stdin,"Number",rateClassesCount);
+	
+DEFAULT_FILE_SAVE_NAME = "K-means.csv";
+
+SetDialogPrompt ("Write CSV clusters to:");
+fprintf 		 (PROMPT_FOR_FILE,CLEAR_FILE,KEEP_OPEN,"Gene,Cluster\n");
+
+
+autoStepFlag	 = 0;
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+produceOffspring		= 16;
+populationSize  		= 2*produceOffspring;
+incestDistance  		= 0;
+generationCount		  	= 5000;
+maxSampleTries			= populationSize*10;
+mutationThreshhold		= 0.0001;
+mutationProb			= 0.10;
+mutationProbDecrease	= 1.0;
+annealingPhase			= 100;
+totalSampleCounter		= 0;
+localMutationRate		= 0.05;
+localMutationInterval	= 20;
+
+stoppingCriterion		= 20;
+sampleCount				= 0;
+familyControlSize		= produceOffspring$6;
+
+predef   				= {};
+
+MasterList				= {};
+verboseFlag				= 0;
+stateVectorDimension    = points;
+branchUpdateThreshold   = generationCount;
+
+k_trace					= mx_diag (kernel_matrix);
+
+currentPopulation	  = {};
+currentPopulation [0] = {stateVectorDimension,1};
+crapAIC			   	  = dualMeans(kernel_matrix,1,currentPopulation[0]);
+sortedScores	      = {populationSize,2};
+sortedScores[0][0]    = crapAIC;
+sortedScores[0][1]    = 0;
+
+ExecuteAFile ("GA_CHC_kernel.ibf");
+
+dualMeans 	 (kernel_matrix, rateClassesCount, currentPopulation[populationSize-1]);
+allocation = distances[-1][0];
+
+byCluster  = {};
+
+for (k=0; k<points; k=k+1)
+{
+	fprintf (LAST_FILE_PATH,names[k+1],",",allocation[k],"\n");
+	byCluster [allocation[k]] = byCluster [allocation[k]]+1;
+}
+
+columnHeaders = {{"Cluster ID"}};
+
+OpenWindow (CHARTWINDOW,{{"Kernel k-means cluster allocation"}
+						{"columnHeaders"}
+						{"allocation"}
+						{"Scatterplot"}
+						{"Index"}
+						{"Cluster ID"}
+						{"Data set ID"}
+						{""}
+						{"Cluster ID"}
+						{"0"}
+						{""}
+						{"-1;-1"}
+						{"10;1.309;0.785398"}
+						{"Times:12:0;Times:10:0;Times:12:2"}
+						{"0;0;16777215;16777215;0;0;6579300;11842740;13158600;14474460;0;3947580;16777215;0;6845928;16771158;2984993;9199669;7018159;1460610;16748822;11184810;14173291"}
+						{"16,0,0"}
+						},
+						"572;516;37;51");
+		
+fprintf (stdout, "Cluster size report:\n");
+
+for (k=0; k<rateClassesCount; k=k+1)
+{
+	fprintf (stdout, "\tCluster ", Format(k+1,3,0), " has ", Format (byCluster[k],5,0), " points\n"); 
+}
+
+fprintf (LAST_FILE_PATH,CLOSE_FILE);
+
+/*------------------------------------------------------------------------------*/
+	
+function dualMeans (K,N,initVector)
+{
+	K_dim = Rows(K);
+	A	  = {K_dim,N};
+	/* random initial assignment */
+	distances = {K_dim,2};
+	for (_k = 0; _k < K_dim; _k=_k+1)
+	{
+		distances[_k][0] = initVector[_k];
+		A[_k][distances[_k][0]] = 1;
+	}
+	
+	goOn = 1;
+
+	while (goOn)
+	{
+	  goOn = 0;
+	  /*E = A * diag(1./sum(A));*/
+	  E = A * diag ((sum(A))["1./_MATRIX_ELEMENT_VALUE_"]);
+	  Z = {K_dim,1}["1"] * Transpose(mx_diag (Transpose(E)*K*E)) - K*E*2.0;
+	  
+	  for (k = 0; k < K_dim; k=k+1)
+	  {
+	  		min     = 1e100;
+	  		min_idx = 0;
+	  		
+	  		for (k2 = 0; k2 < N; k2=k2+1)
+	  		{
+	  			if (Z[k][k2] < min)
+	  			{
+	  				min = Z[k][k2];
+	  				min_idx = k2;
+	  			}
+	  		}
+	  		
+	  		
+	  		distances[k][1] = min;
+	  		
+	  		if (min_idx != distances[k][0])
+	  		{
+	  			A[k][min_idx] 		  = 1;
+	  			A[k][distances[k][0]] = 0;
+	  			distances[k][0] = min_idx;
+	  			goOn = 1;
+	  		}
+	  }
+	}
+	
+	return  -Abs(k_trace+distances[-1][1]);
+}
+
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function MatrixToString (rateMatrix)
+{
+	outString = "";
+	outString * 256;
+	for (h=0; h<stateVectorDimension; h=h+1)
+	{
+		outString * (","+rateMatrix[h]);				
+	}
+	outString * 0;
+	return outString;
+}
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function SpawnRandomString (clsCnt)
+{
+	rModel = {stateVectorDimension,1};
+	for (h=0; h<stateVectorDimension; h=h+1)
+	{
+		rModel[h] = Random(0,clsCnt)$1;
+	}
+	
+	return MakeStringCanonical(rModel,clsCnt);
+}
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function MakeStringCanonical (randomModel, classCount)
+{
+	compressedString = randomModel%0;
+	return randomModel;
+}
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function UpdateBL (dummy)
+{
+	return 0;
+}
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function RunASample (modelDF, jobIndex)
+{
+	sampleString = MatrixToString (cString);
+	myAIC 		 = MasterList[sampleString];
+	
+	if (myAIC > 0.1)
+	{
+		if (resultProcessingContext==0)
+		{
+			sortedScores[jobIndex][0] = myAIC;
+		}
+		else
+		{
+			intermediateProbs[jobIndex][0] = myAIC;	
+		}			
+		return 0;
+	}
+	
+	myAIC   = dualMeans (kernel_matrix,rateClassesCount,cString);
+	ReceiveJobs (1, jobIndex);
+	return 0;
+}
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function IsChildViable (v)
+{
+	return v;
+}
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function ReceiveJobs (sendOrNot, ji)
+{
+	if (resultProcessingContext==0)
+	{
+		sortedScores[ji][0] = myAIC;
+	}
+	else
+	{
+		intermediateProbs[ji][0] = myAIC;	
+	}
+	if (ji>=0)
+	{
+		if (resultProcessingContext==0)
+		{
+			MasterList [MatrixToString (currentPopulation[ji])] = myAIC;
+		}
+		else
+		{
+			MasterList [MatrixToString (children[ji-populationSize])] = myAIC;
+		}
+	}
+	return fromNode-1;
+}
+
diff --git a/res/TemplateBatchFiles/Kernel_support.ibf b/res/TemplateBatchFiles/Kernel_support.ibf
new file mode 100644
index 0000000..5692967
--- /dev/null
+++ b/res/TemplateBatchFiles/Kernel_support.ibf
@@ -0,0 +1,177 @@
+/*----------------------------------------------*/
+
+function diag (v)
+{
+	vd = Max (Rows(v), Columns(v));
+	diagMx = {vd,vd};
+	for (_v = 0; _v < vd; _v = _v + 1)
+	{
+		diagMx[_v][_v] = v[_v];
+	}
+	return diagMx;
+}
+
+/*----------------------------------------------*/
+
+function mx_diag (v)
+{
+	vd = Min (Rows(v), Columns(v));
+	diagMx = {vd,1};
+	for (_v = 0; _v < vd; _v = _v + 1)
+	{
+		diagMx[_v] = v[_v][_v];
+	}
+	return diagMx;
+}
+
+/*-----------------------------------------------*/
+
+function sum (mx)
+{
+	rd = Rows(mx);
+	cd = Columns (mx);
+	col_sum = {1,cd};
+	for (_c = 0; _c < cd; _c = _c + 1)
+	{
+		_s = 0;
+		for (_r = 0; _r < rd; _r = _r+1)
+		{
+			_s = _s + mx[_r][_c];
+		}
+		col_sum [_c] = _s;
+	}
+	return col_sum;
+}
+
+/*-----------------------------------------------*/
+
+function table (vec1, vec2)
+{
+	if (Rows(vec1) == Rows(vec2) && Columns (vec1) == 1 && Columns (vec2) == 1)
+	{
+		maxV = 0;
+		rd = Rows(vec1);
+		for (_r = 0; _r < rd; _r = _r+1)
+		{
+			maxV = Max (maxV, Max(vec1[_r],vec2[_r]));
+		}	
+		tableOut = {maxV+1, maxV+1};
+		for (_r = 0; _r < rd; _r = _r+1)
+		{
+			tableOut[vec1[_r]][vec2[_r]] = tableOut[vec1[_r]][vec2[_r]] + 1;
+		}	
+		return tableOut;
+	}
+	else
+	{
+		return 0;
+	} 
+}
+
+/*-----------------------------------------------*/
+
+function read_kernel_matrix (dummy)
+{
+	SetDialogPrompt ("Please locate a .csv with the kernel matrix");
+	ExecuteAFile (HYPHY_LIB_DIRECTORY + "TemplateBatchFiles" + DIRECTORY_SEPARATOR + "Utility" + DIRECTORY_SEPARATOR + "ReadDelimitedFiles.bf");
+	kern_AVL = ReadCSVTable ("",2);
+	
+	kernel_matrix = kern_AVL[1];
+	names		  = kern_AVL[0];
+	points		  = Rows(kernel_matrix);
+	fprintf (stdout, "Read ", points, " points\n");
+	return points;
+}
+
+/*-----------------------------------------------*/
+
+function matrix_to_kernel (distances)
+{
+	/* subtract the diagonal */
+	points		   = Rows (distances);
+	norm_distances = distances-
+					 distances["_MATRIX_ELEMENT_VALUE_ * (_MATRIX_ELEMENT_ROW_ == _MATRIX_ELEMENT_COLUMN_)"];
+	
+	/* convert to a kernel matrix */
+	
+	sigma 		  = 1;
+	kernel_matrix = norm_distances["Exp (-(_MATRIX_ELEMENT_VALUE_^2)/(2*sigma))"];
+	
+	/* check for eigen negative eigenvalues */
+	
+	kernel_eig    = Eigensystem(kernel_matrix);
+	min_ev		  = 1e100;
+	for (k=0; k < points; k=k+1)
+	{
+		min_ev = Min (min_ev,(kernel_eig[0])[k]);
+	}
+	if (min_ev < 0)
+	{
+		scaled_diag = {points, points};
+		
+		for (k=0; k < points; k=k+1)
+		{
+			scaled_diag[k][k] = (kernel_eig[0])[k] - min_ev;
+		}
+		kernel_matrix = kernel_eig[1]*scaled_diag*Transpose(kernel_eig[1]);
+	}
+	return kernel_matrix;
+}
+
+
+/*-----------------------------------------------*/
+
+function perform_kernel_PCA (kernel_matrix)
+{
+	points = Rows (kernel_matrix);
+
+	one_matrix = {points,points} ["1/points__"];
+	K_hat 	   = kernel_matrix - one_matrix*kernel_matrix-kernel_matrix * one_matrix 
+							   + one_matrix*kernel_matrix*one_matrix;
+							   
+	for (r=0; r<points; r=r+1)
+	{
+		for (c=r+1; c<points; c=c+1)
+		{
+			m = 0.5(K_hat[r][c]+K_hat[c][r]);
+			K_hat[r][c] = m;
+			K_hat[c][r] = m;
+		}
+	}
+							   
+	pca  				   = Eigensystem (K_hat);
+	eval 				   = pca[0];
+	evect				   = pca[1];
+	/* count meaningful components */
+
+	k = 0;
+	while (eval[k]>0.001 && k < points)
+	{
+		k=k+1;
+	}
+	components = k;
+		
+	/* normalize the eigenvectors */
+	normEV 		= {components, points};
+	normEigs	= {components, 1};
+	
+	evalSum = (((Transpose(eval))["1"])*eval)[0];
+	
+	for (k=0; k<components; k=k+1)
+	{
+		evk 		= (evect[-1][k])*(1/eval[k]);
+		normEigs[k] = eval[k]/evalSum; 
+		for (k2=0; k2<points; k2=k2+1)
+		{
+			normEV [k][k2] = evk[k2];
+		}
+	}
+	
+	kPCA_AVL = {};
+	kPCA_AVL ["E-Values"]  = normEigs;
+	kPCA_AVL ["E-Vectors"] = normEV;
+	kPCA_AVL ["Rotated"]   = Transpose(normEV*K_hat);
+	
+	return    kPCA_AVL;
+	
+}
diff --git a/res/TemplateBatchFiles/LHT.bf b/res/TemplateBatchFiles/LHT.bf
new file mode 100644
index 0000000..9b36471
--- /dev/null
+++ b/res/TemplateBatchFiles/LHT.bf
@@ -0,0 +1,207 @@
+
+/* A Likelihood Ratio Test to detect conflicting phylogentic signal
+  Huelsenbeck and Bull, 1996 */
+/* implemented by Olivier Fedrigo Feb. 23 2006 */
+
+
+fprintf(stdout,"\n\n+----------------------------------------------------------------------------------------------+\n");
+fprintf(stdout,"| A Likelihood Ratio Test to detect conflicting phylogenetic signal Huelsenbeck and Bull, 1996 |\n");
+fprintf(stdout,"|            implemented by Olivier Fedrigo Sep. 23 2006             |\n");
+fprintf(stdout,"+----------------------------------------------------------------------------------------------+\n\n");
+nreplicates=10;
+fprintf(stdout,"\nHow many replicates?");
+fscanf(stdin,"Number",nreplicates);
+fprintf(stdout,"\n",nreplicates," bootstrap replicates will be performed\n");
+
+SetDialogPrompt ("Please locate a partitioned NEXUS file:");
+DataSet ds = ReadDataFile (PROMPT_FOR_FILE);
+DataSetFilter filteredData = CreateFilter (ds,1);
+fprintf (stdout, "\nLoaded a ", filteredData.species, " sequence alignment with ", filteredData.sites," sites\n");
+
+SelectTemplateModel(filteredData);
+
+/*check if there are any partitions.*/
+
+partitionsFound = partitionsFound;
+
+fprintf (stdout,"\n\n",partitionsFound," character sets found\n");
+if (partitionsFound==0)
+{
+	fprintf (stdout, "\n\nPlease add character sets to your NEXUS file...");
+	return 0;
+}
+else
+{
+	for (part=0; part<partitionsFound; part=part+1)
+	{
+	    fprintf (stdout,DATA_FILE_PARTITION_MATRIX[0][part],"\n");
+	    fprintf (stdout,DATA_FILE_PARTITION_MATRIX[1][part],"\n\n");
+	}
+}
+
+/*check if there are any trees*/
+fprintf (stdout,"\n\n",Rows(NEXUS_FILE_TREE_MATRIX)," trees found\n");
+if (partitionsFound>Rows(NEXUS_FILE_TREE_MATRIX))
+{
+    fprintf (stdout, "\n\nPlease add trees to your nexus file...");
+    return 0;
+}
+
+ntree=Rows(NEXUS_FILE_TREE_MATRIX);
+listOfTree	=	{ntree,1};
+likList		=	{partitionsFound,1};
+listOfLk	=	{partitionsFound,ntree};
+bestLk		=	{partitionsFound,1};
+bestTree	=	{partitionsFound,1};
+bestLk2		=	{partitionsFound,1};
+globalLk	=	{ntree,1};
+
+/*GET LIKELIHOOD FOR TREES FOR ALL PARTITIONS AND CHOOSE THE BEST TREE*/    
+for (part=0; part<partitionsFound; part=part+1)
+{
+  DataSetFilter dsf=CreateFilter (ds,1,DATA_FILE_PARTITION_MATRIX[1][part]);
+  if (FREQUENCY_SENSITIVE) /*get the base frequency independently for each partition*/
+  {
+      HarvestFrequencies (baseFreqs, dsf, 1,1,1);
+      MBF = PopulateModelMatrix ("filterModelMatrix", baseFreqs);
+      Model filterModel = (filterModelMatrix, baseFreqs, MBF);
+  }
+  
+  fprintf(stdout,"Analysis for partition ",DATA_FILE_PARTITION_MATRIX[0][part]," given trees:\n");
+  for (i=0; i<ntree; i=i+1)
+  {
+		Tree uniqueTree=NEXUS_FILE_TREE_MATRIX[i][1];
+		LikelihoodFunction lf = (dsf,uniqueTree);
+		Optimize (mles,lf);
+		if (part==0) 
+			{fprintf(stdout,lf);}
+		listOfLk[part][i]=mles[1][0];
+		if (i==0)
+		{
+			bestLk[part]=mles[1][0];
+			bestTree[part]=i;
+		}
+		else
+		{
+			if (bestLk[part]<mles[1][0])
+			{
+				bestLk[part]=mles[1][0];
+				bestTree[part]=i;
+			}
+		}
+	}
+}
+
+/* GET LK1 and LK2 AND CHOOSE THE BEST TREE*/
+lk2=0;  /*H1: unconstrained different tree for different partition*/
+for (part=0; part<partitionsFound; part=part+1) {lk2=lk2+bestLk[part];}
+
+lk1=0;  /*H0: constrained same tree for different partition*/
+for (i=0; i<ntree; i=i+1)
+{
+	globalLk[i]=0;
+	for (part=0; part<partitionsFound; part=part+1) 
+	{
+		globalLk[i]=globalLk[i]+listOfLk[part][i];
+	}
+	if (i==0)
+	{
+		lk1=globalLk[i];
+		theBestTree=i;
+	}
+	else
+	{
+		if (lk1<globalLk[i])
+		{
+			lk1=globalLk[i];
+			theBestTree=i;
+		}
+	}
+}
+
+fprintf (stdout,"\n| Tree n.  |");
+for (i=0;i<partitionsFound;i=i+1) 
+{
+	fprintf(stdout," ",DATA_FILE_PARTITION_MATRIX[0][i],"\t|");
+}
+fprintf (stdout," Total\n");
+for (j=0; j<ntree; j=j+1)
+{
+	fprintf (stdout,"| ",NEXUS_FILE_TREE_MATRIX[j][0]," |");
+	for (i=0;i<partitionsFound;i=i+1)
+	{
+		fprintf(stdout," ",Format(listOfLk[i][j],10,10));
+		if (listOfLk[i][j]==bestLk[i]) {fprintf(stdout,"*\t|");} else {fprintf(stdout,"\t|");}
+	}
+	fprintf(stdout," ",Format(globalLk[j],10,10));
+	if (globalLk[j]==lk1) {fprintf(stdout,"*\n");} else {fprintf(stdout,"\n");}
+}
+
+fprintf(stdout,"\n");
+fprintf(stdout,"L0= ",Format(lk1,10,10),"\n");
+fprintf(stdout,"L1= ",Format(lk2,10,10),"\n");
+lnlikDelta= 2*(lk2-lk1);
+fprintf(stdout,"LRT= ",Format(lnlikDelta,10,10),"\n\n");
+
+/*PARAMETRIC BOOTSTRAP*/    
+count=0;
+
+for (replicate=0;replicate<nreplicates;replicate=replicate+1)
+{
+	lk1=0;
+	lk2=0;
+	for (part=0; part<partitionsFound; part=part+1)
+	{
+		DataSetFilter dsf=CreateFilter (ds,1,DATA_FILE_PARTITION_MATRIX[1][part]);
+		if (FREQUENCY_SENSITIVE)
+		{
+			HarvestFrequencies (baseFreqs, dsf, 1,1,1);
+			MBF = PopulateModelMatrix ("filterModelMatrix", baseFreqs);
+			Model filterModel = (filterModelMatrix, baseFreqs, MBF);
+		}
+		Tree uniqueTree=NEXUS_FILE_TREE_MATRIX[theBestTree][1];
+		LikelihoodFunction lf = (dsf,uniqueTree);
+		Optimize (mles,lf);
+
+		/*simulate constrained different partition*/
+		DataSet simData = SimulateDataSet(lf);
+		DataSetFilter simDataf=CreateFilter (simData,1);     
+		if (FREQUENCY_SENSITIVE)
+		{
+			HarvestFrequencies (baseFreqs, simDataf, 1,1,1);
+			MBF = PopulateModelMatrix ("filterModelMatrix", baseFreqs);
+			Model filterModel = (filterModelMatrix, baseFreqs, MBF);
+		}
+
+		/*H0: constrained same tree for different partition*/ 
+		Tree globalTree=NEXUS_FILE_TREE_MATRIX[theBestTree][1];
+		LikelihoodFunction lfsim = (simDataf,globalTree);
+		Optimize (mles,lfsim);
+		lk1=lk1+mles[1][0];  
+
+		/*H1: unconstrained difffeent tree for different partition*/
+		for (i=0; i<ntree; i=i+1)
+		{
+			Tree uniqueTree=NEXUS_FILE_TREE_MATRIX[i][1];
+			LikelihoodFunction lfsim2 = (simDataf,uniqueTree);
+			Optimize (mles,lfsim2);
+			if (i==0) {bestLk=mles[1][0];} else {bestLk=Max(bestLk,mles[1][0]);}
+		}
+		lk2=lk2+bestLk;
+	}
+	simLRT = 2*(lk2-lk1);
+	if (simLRT>0)
+	{
+		fprintf(stdout,"replicate ",replicate,"- ",simLRT,"\n");
+	}
+	else
+	{
+		fprintf(stdout,"replicate ",replicate,"- 0.00000 *",simLRT,"\n");
+	}
+	if (lnlikDelta>simLRT) 
+	{
+		count = count+1;
+	}
+}
+/*If your observed lnlikDelta is greater than 95% of the simulated LRT's, then reject the null hypothesis (that the partitions share the same tree) at the 5% level. negative LRTs are forced to be 0*/
+fprintf(stdout,"\n\n*** P-value (Parametric BS)= ",Format(1.0-(count/nreplicates),10,10),"\n");
diff --git a/res/TemplateBatchFiles/LRTRecombTest.bf b/res/TemplateBatchFiles/LRTRecombTest.bf
new file mode 100644
index 0000000..8e93502
--- /dev/null
+++ b/res/TemplateBatchFiles/LRTRecombTest.bf
@@ -0,0 +1,309 @@
+VERBOSITY_LEVEL = -1;
+ALLOW_SEQUENCE_MISMATCH = 1;
+
+fprintf(stdout,"\n ---- RUNNING KH ALTERNATIVE TOPOLOGY TEST ---- \n");
+
+ChoiceList (dataType,"Data type",1,SKIP_NONE,"Nucleotide/Protein","Nucleotide or amino-acid (protein).",
+				     "Codon","Codon (several available genetic codes).");
+
+if (dataType<0) 
+{
+	return;
+}
+
+if (dataType)
+{
+	NICETY_LEVEL = 3;
+	SetDialogPrompt ("Please choose a codon data file:");
+	#include "TemplateModels/chooseGeneticCode.def";
+}
+else
+{
+	SetDialogPrompt ("Please choose a nucleotide or amino-acid data file:");
+}
+
+DataSet ds = ReadDataFile (PROMPT_FOR_FILE);
+fprintf (stdout,"The following data were read:\n",ds,"\n");
+
+ChoiceList (compType,"Comparison Kind",1,SKIP_NONE,"Full Alignment","Compare the trees applied to the full alignment.",
+				     "Recombination Test","Compare the trees on 2 parts of the alignment, reversing their roles before and after the breakpoint.");
+
+
+if (compType<0) 
+{
+	return;
+}
+
+if (dataType)
+{
+	DataSetFilter filteredData = CreateFilter (ds,3,"","",GeneticCodeExclusions);
+}
+else
+{
+	DataSetFilter filteredData = CreateFilter (ds,1);
+}
+
+
+SelectTemplateModel(filteredData);
+
+firstTreeString  = "";
+secondTreeString = "";
+
+if (Rows(NEXUS_FILE_TREE_MATRIX)>=2)
+{
+	ChoiceList (tc,"Choose first tree",1,SKIP_NONE,NEXUS_FILE_TREE_MATRIX);
+	if (tc>=0)
+	{
+		firstTreeString = NEXUS_FILE_TREE_MATRIX[tc][1];
+		skipMx = {{tc__}};
+		ChoiceList (tc,"Choose second tree",1,skipMx,NEXUS_FILE_TREE_MATRIX);
+		if (tc>=0)
+		{
+			secondTreeString = NEXUS_FILE_TREE_MATRIX[tc][1];		
+		}
+	}
+	else
+	{
+		ChoiceList (tc,"Choose second tree",1,SKIP_NONE,NEXUS_FILE_TREE_MATRIX);	
+		if (tc>=0)
+		{
+			secondTreeString = NEXUS_FILE_TREE_MATRIX[tc][1];		
+		}
+	}
+}
+
+if (Abs(firstTreeString) == 0)
+{
+	SetDialogPrompt ("Locate the file with the first tree:");
+	fscanf 			(PROMPT_FOR_FILE,"Tree",firstTree);
+}
+else
+{
+	Tree firstTree = firstTreeString;
+}
+
+if (Abs(secondTreeString) == 0)
+{
+	SetDialogPrompt ("Locate the file with the second tree:");
+	fscanf 			(PROMPT_FOR_FILE,"Tree",secondTree);
+}
+else
+{
+	Tree secondTree = secondTreeString;
+}
+
+if (firstTree == secondTree)
+{
+	fprintf (stdout, "\nERROR: The two trees cannot be equal\n");
+	return 0;
+}
+
+firstTreeString  = ""+firstTree;
+secondTreeString = ""+secondTree;
+
+fprintf (stdout, "\nFirst tree:\n",firstTreeString, "\n\nSecond Tree:\n",secondTreeString,"\n");
+
+itCount = 0;
+while (itCount<1)
+{
+	fprintf (stdout, "\nHow many bootstrap replicates should be done (>0):");
+	fscanf (stdin, "Number", itCount);
+}
+
+labels = {{"Resampled LRT"}};
+
+if (compType)
+{
+	breakPoint = 0;
+	if (dataType)
+	{
+		pPrompt = "codons";
+	}
+	else
+	{
+		pPrompt = "bp";	
+	}
+	while (breakPoint<1 || breakPoint > filteredData.sites-2)
+	{
+		fprintf (stdout, "\nEnter the location of the breakpoint (0-based and measured in ", pPrompt, "). Valid locations are [1-", filteredData.sites-3, "]:");
+		fscanf (stdin, "Number", breakPoint);
+	}
+	fprintf (stdout, "\nUsing the breakpoint at ", breakPoint, "-th ", pPrompt, "\n");
+	if (dataType)
+	{
+		DataSetFilter filteredData1 = CreateFilter (ds,3,siteIndex<3*breakPoint,"",GeneticCodeExclusions);
+		DataSetFilter filteredData2 = CreateFilter (ds,3,siteIndex>=3*breakPoint,"",GeneticCodeExclusions);
+	}
+	else
+	{
+		DataSetFilter filteredData1 = CreateFilter (ds,1,siteIndex<breakPoint);
+		DataSetFilter filteredData2 = CreateFilter (ds,1,siteIndex>=breakPoint);	
+	}
+	LikelihoodFunction lf1_1 = (filteredData1,firstTree);
+	Optimize (res1_1, lf1_1);
+	ConstructCategoryMatrix (v1,lf1_1,COMPLETE);
+	fprintf (stdout, "\n\n1). FITTING TREE 1 TO PARTITION 1\n", lf1_1);
+	LikelihoodFunction lf1_2 = (filteredData1,secondTree);
+	Optimize (res1_2, lf1_2);
+	ConstructCategoryMatrix (v2,lf1_2,COMPLETE);
+	fprintf (stdout, "\n\n2). FITTING TREE 2 TO PARTITION 1\n", lf1_2);
+	LikelihoodFunction lf2_1 = (filteredData2,firstTree);
+	Optimize (res2_1, lf2_1);
+	ConstructCategoryMatrix (v3,lf2_1,COMPLETE);
+	fprintf (stdout, "\n\n3). FITTING TREE 1 TO PARTITION 2\n", lf2_1);
+	LikelihoodFunction lf2_2 = (filteredData2,secondTree);
+	Optimize (res2_2, lf2_2);
+	ConstructCategoryMatrix (v4,lf2_2,COMPLETE);
+	fprintf (stdout, "\n\n4). FITTING TREE 2 TO PARTITION 2\n", lf2_2);
+	
+	LRT1 = 2*(res1_1[1][0]-res1_2[1][0]);
+	LRT2 = 2*(res2_2[1][0]-res2_1[1][0]);
+	
+	fprintf (stdout, "\n\nSUMMARY:\n\n\tPARTITION 1 LRT = ",LRT1, "\n\tPARTITION 2 LRT = ", LRT2);
+	if (LRT1 < 0 || LRT2 < 0)
+	{
+		fprintf (stdout, "\n\nERROR: Both LRTs were expeceted to be positive.\nPlease check your trees and partition");
+		return 0;
+	}
+	
+	test1 = testLRT (v1,v2)%0;
+	
+	for (k=0; k<Columns(v1); k=k+1)
+	{
+		if (test1[k]>0)
+		{
+			break;
+		}
+	}	
+	
+	fprintf (stdout, "\n\nEstimated p-value for the FIRST partition (based on ", itCount," replicates): ", Format(k/itCount,10,4));
+	
+	
+	OpenWindow (CHARTWINDOW,{{"Simulated LRT for the First Partition"}
+		{"labels"}
+		{"test1"}
+		{"Step Plot"}
+		{"Index"}
+		{labels[0]}
+		{"Index"}
+		{"LRT"}
+		{"LRT"}
+		{""}
+		{""+LRT1}
+		{""}
+		{"10;1.309;0.785398"}
+		{"Times:12:0;Times:10:0;Times:14:2"}
+		{"0;0;16777215;5000268;0;0;6750054;11842740;13158600;14474460;0;3947580;0;5000268;11776947;10066329;9199669;7018159;1460610;16748822;11184810;14173291"}
+		{"16"}
+		},
+		"(SCREEN_WIDTH-30)/2;(SCREEN_HEIGHT-50)/2;10;40");
+	
+	test2 = testLRT (v4,v3)%0;
+
+	for (k=0; k<Columns(v3); k=k+1)
+	{
+		if (test2[k]>0)
+		{
+			break;
+		}
+	}	
+	
+	fprintf (stdout, "\n\nEstimated p-value for the SECOND partition (based on ", itCount," replicates): ", Format(k/itCount,10,4),"\n");
+	OpenWindow (CHARTWINDOW,{{"Simulated LRT for the Second Partition"}
+		{"labels"}
+		{"test2"}
+		{"Step Plot"}
+		{"Index"}
+		{labels[0]}
+		{"Index"}
+		{"LRT"}
+		{"LRT"}
+		{""}
+		{""+LRT2}
+		{""}
+		{"10;1.309;0.785398"}
+		{"Times:12:0;Times:10:0;Times:14:2"}
+		{"0;0;16777215;5000268;0;0;6750054;11842740;13158600;14474460;0;3947580;0;5000268;11776947;10066329;9199669;7018159;1460610;16748822;11184810;14173291"}
+		{"16"}
+		},
+		"(SCREEN_WIDTH-30)/2;(SCREEN_HEIGHT-50)/2;20+(SCREEN_WIDTH)/2;40");
+}
+else
+{
+	LikelihoodFunction lf1 = (filteredData,firstTree);
+	Optimize (res1, lf1);
+	ConstructCategoryMatrix (v1,lf1,COMPLETE);
+	fprintf (stdout, "\n\n1). FITTING TREE 1 TO THE DATA\n", lf1);
+	LikelihoodFunction lf2 = (filteredData,secondTree);
+	Optimize (res2, lf2);
+	ConstructCategoryMatrix (v1,lf2,COMPLETE);
+	fprintf (stdout, "\n\n2). FITTING TREE 2 TO THE DATA1\n", lf2);
+
+	LRT1 = 2*(res1[1][0]-res2[1][0]);
+	
+	fprintf (stdout, "\n\nSUMMARY:\n\n\tLRT = ",LRT1);
+	if (LRT1 < 0)
+	{
+		fprintf (stdout, "\n\nERROR: The LRTs was expeceted to be positive.\nPlease check your trees and alignemt");
+		return 0;
+	}
+
+
+	test1 = testLRT (v1,v2)%0;
+	for (k=0; k<Columns(v1); k=k+1)
+	{
+		if (test1[k]>0)
+		{
+			break;
+		}
+	}	
+	fprintf (stdout, "\n\nEstimated p-value for  (based on ", itCount," replicates): ", Format(k/itCount,10,4),"\n");
+	OpenWindow (CHARTWINDOW,{{"Simulated LRT"}
+		{"labels"}
+		{"test1"}
+		{"Step Plot"}
+		{"Index"}
+		{labels[0]}
+		{"Index"}
+		{"LRT"}
+		{"LRT"}
+		{""}
+		{""+LRT1}
+		{""}
+		{"10;1.309;0.785398"}
+		{"Times:12:0;Times:10:0;Times:14:2"}
+		{"0;0;16777215;5000268;0;0;6750054;11842740;13158600;14474460;0;3947580;13421772;5000268;11776947;10066329;9199669;7018159;1460610;16748822;11184810;14173291;14173291"}
+		{"16"}
+		},
+		"(SCREEN_WIDTH-30)/2;(SCREEN_HEIGHT-50)/2;20+(SCREEN_WIDTH)/2;40");
+}
+
+/*--------------------------------------------------------------------------------------*/
+
+function testLRT (vec1, vec2)
+{
+	size1 = Columns(vec1);
+	
+	sumVec1 = {size1,1};
+	jvec	= {2,size1};
+	resMx1	= {itCount,1};
+	resMx2	= {itCount,1};
+	
+	for (k=0; k<size1; k=k+1)
+	{
+		sumVec1 [k]	   = 1;
+		jvec	[0][k] = Log(vec1[k]);
+		jvec	[1][k] = Log(vec2[k]);
+	}
+	
+	
+	for (k=0; k<itCount; k=k+1)
+	{
+		resampled = Random(jvec,1);
+		resampled = resampled*sumVec1;
+		resMx1[k] = resampled[0];
+		resMx2[k] = resampled[1];
+	}
+	
+	return (resMx1-resMx2)*2;
+}
diff --git a/res/TemplateBatchFiles/LZ_Complexity.bf b/res/TemplateBatchFiles/LZ_Complexity.bf
new file mode 100644
index 0000000..9249307
--- /dev/null
+++ b/res/TemplateBatchFiles/LZ_Complexity.bf
@@ -0,0 +1,78 @@
+SetDialogPrompt ("Please specify a nucleotide or amino-acid data file:");
+
+DataSet ds = ReadDataFile (PROMPT_FOR_FILE);
+DataSetFilter filteredData = CreateFilter (ds,1);
+
+fprintf (stdout, "\nRead ",  filteredData.species, " sequences.\n");
+
+GetInformation (actualSequences,filteredData);
+
+LZContent = {Rows(actualSequences),3};
+
+labels    = {1,4};
+seqNameLabel = "Sequence Name";
+labels [0] = "Sequence Length";
+labels [1] = "Character entropy";
+labels [2] = "Lempel-Ziv Complexity";
+
+maxLength = 14;
+
+for (seqCounter = 0; seqCounter < Rows(actualSequences); seqCounter = seqCounter+1)
+{
+	GetString (seqName, filteredData, seqCounter);
+	seqLength = Abs(seqName);
+	if (seqLength > maxLength)
+	{
+		maxLength = seqLength;
+	}
+	seqNameLabel = seqNameLabel + ";" + seqName;
+	aSeq = actualSequences[seqCounter];
+	for (siteCounter = Abs(aSeq)-1; siteCounter>0; siteCounter=siteCounter-1)
+	{
+		if (aSeq[siteCounter]!="?")
+		{
+			break;
+		}
+	}
+	DataSetFilter seqFilter = CreateFilter (ds,1,"",speciesIndex==seqCounter);
+	HarvestFrequencies (seqFreq,seqFilter,1,1,0);
+	seqFreq = Transpose (seqFreq)*(Log(seqFreq)*(1/Log(2)));
+	actualSequences[seqCounter] = aSeq[0][siteCounter];
+	LZContent [seqCounter][0] = siteCounter;
+	LZContent [seqCounter][1] = -seqFreq[0];
+	LZContent [seqCounter][2] = Exp (actualSequences[seqCounter]);
+}
+
+labels[3] = seqNameLabel;
+OpenWindow (CHARTWINDOW,{{"Sequence Complexity"}
+						   {"labels"},
+						   {"LZContent"},
+						   {"Bar Chart"},
+						   {"Index"},
+						   {labels[2]},
+						   {""},
+						   {""},
+						   {labels[2]},
+						   {""}},
+						   "SCREEN_WIDTH-300;SCREEN_HEIGHT-200;100;100");
+
+
+stringOfSpaces = "";
+stringOfSpaces * maxLength;
+for (seqCounter = 0; seqCounter < maxLength; seqCounter = seqCounter + 1)
+{
+	stringOfSpaces * " ";
+}
+stringOfSpaces * 0;
+
+fprintf (stdout, "\nSequence Name", stringOfSpaces[0][maxLength-14], "\tLength\tEntropy\tLZ Complexity\n");
+
+for (seqCounter = 0; seqCounter < Rows(actualSequences); seqCounter = seqCounter+1)
+{
+	GetString (seqName, filteredData, seqCounter);
+	fprintf (stdout, seqName, stringOfSpaces[0][maxLength-Abs(seqName)-1], "\t", 
+			Format (LZContent[seqCounter][0],6,0), "\t",
+			Format (LZContent[seqCounter][1],7,5), "\t",
+			Format (LZContent[seqCounter][2],12,4), "\n"
+			);
+}
diff --git a/res/TemplateBatchFiles/LocalBranchSiteTest.bf b/res/TemplateBatchFiles/LocalBranchSiteTest.bf
new file mode 100644
index 0000000..60ca04d
--- /dev/null
+++ b/res/TemplateBatchFiles/LocalBranchSiteTest.bf
@@ -0,0 +1,373 @@
+/* 1. include a file to define the genetic code
+   Note the use of base directory and path forming variables to make this analysis 
+   independent of directory placement
+ */
+
+ExecuteAFile  (HYPHY_LIB_DIRECTORY+"TemplateBatchFiles"+DIRECTORY_SEPARATOR+"TemplateModels"+DIRECTORY_SEPARATOR+"chooseGeneticCode.def");
+ExecuteAFile  (HYPHY_LIB_DIRECTORY+"TemplateBatchFiles"+DIRECTORY_SEPARATOR+"Utility"+DIRECTORY_SEPARATOR+"GrabBag.bf");
+
+/* 2. load a codon partition  */
+
+SetDialogPrompt 			("Please locate a coding alignment:");
+DataSet 	  ds		   = ReadDataFile (PROMPT_FOR_FILE);
+DataSetFilter filteredData = CreateFilter (ds,3,"","",GeneticCodeExclusions);
+coding_path = LAST_FILE_PATH;
+
+fprintf (stdout, "\nLoaded a ", filteredData.species, " sequence alignment with ", filteredData.sites, " codons from\n",coding_path,"\n");
+
+/* 3. include a file to prompt for a tree */
+
+incFileName = HYPHY_LIB_DIRECTORY+"TemplateBatchFiles"+DIRECTORY_SEPARATOR+"queryTree.bf";
+ExecuteCommands  ("#include \""+incFileName+"\";");
+
+/* 4. Compute nucleotide counts by position for the F3x4 estimator */
+
+COUNT_GAPS_IN_FREQUENCIES = 0;
+HarvestFrequencies (baseFreqs,filteredData,3,1,1);
+COUNT_GAPS_IN_FREQUENCIES = 1;
+
+fprintf (stdout, "\nBase composition:\n\tA: ", Format (baseFreqs[0][0],10,5),",",Format (baseFreqs[0][1],10,5),",",Format (baseFreqs[0][2],10,5),
+								    "\n\tC: ", Format (baseFreqs[1][0],10,5),",",Format (baseFreqs[1][1],10,5),",",Format (baseFreqs[1][2],10,5), 
+									"\n\tG: ", Format (baseFreqs[2][0],10,5),",",Format (baseFreqs[2][1],10,5),",",Format (baseFreqs[2][2],10,5), 
+									"\n\tT: ", Format (baseFreqs[3][0],10,5),",",Format (baseFreqs[3][1],10,5),",",Format (baseFreqs[3][2],10,5), "\n");
+										  
+
+
+/* 6. define the GY94 rate matrix; for now each branch will have it's own
+   dS and dN, we will constrain them later */
+
+global kappa_inv = 1;
+
+ModelMatrixDimension = 64;
+for (h = 0; h<64; h=h+1) 
+{
+	if (_Genetic_Code[h]==10) /* stop codon */
+	{
+		ModelMatrixDimension = ModelMatrixDimension-1;
+	}
+}
+
+GY_Matrix = {ModelMatrixDimension,ModelMatrixDimension};
+hshift = 0;
+for (h=0; h<64; h=h+1)
+{
+	if (_Genetic_Code[h]==10) 
+	{
+		hshift = hshift+1;
+	}
+	else
+	{
+		vshift = hshift;
+		for (v = h+1; v<64; v=v+1)
+		{
+			diff = v-h;
+			if (_Genetic_Code[v]==10) 
+			{
+				vshift = vshift+1;
+			}
+			else
+			{
+			  	if ((h$4==v$4)||((diff%4==0)&&(h$16==v$16))||(diff%16==0)) /* one step */
+			  	{
+			  		if (h$4==v$4)
+			  		{
+			  			transition = v%4;
+			  			transition2= h%4;
+			  		}
+			  		else
+			  		{
+			  			if(diff%16==0)
+			  			{
+			  				transition = v$16;
+			  				transition2= h$16;
+			  			}
+			  			else
+			  			{
+			  				transition = v%16$4;
+			  				transition2= h%16$4;
+			  			}
+			  		}
+			  		if (_Genetic_Code[0][h]==_Genetic_Code[0][v]) /* synonymous */
+			  		{
+			  			if (Abs(transition-transition2)%2) /* transversion */
+			  			{
+			  				GY_Matrix[h-hshift][v-vshift] := kappa_inv*synRate;
+			  				GY_Matrix[v-vshift][h-hshift] := kappa_inv*synRate;
+			  			}
+			  			else
+			  			{
+			  				GY_Matrix[h-hshift][v-vshift] := synRate;
+			  				GY_Matrix[v-vshift][h-hshift] := synRate;			  			
+			  			}
+				  	}
+			  		else
+			  		{
+			  			if (Abs(transition-transition2)%2) /* transversion */
+			  			{
+			  				GY_Matrix[h-hshift][v-vshift] := kappa_inv*nonSynRate;
+			  				GY_Matrix[v-vshift][h-hshift] := kappa_inv*nonSynRate;
+			  			}
+			  			else
+			  			{
+			  				GY_Matrix[h-hshift][v-vshift] := nonSynRate;
+			  				GY_Matrix[v-vshift][h-hshift] := nonSynRate;			  			
+			  			}
+		  			}
+			  	}
+			 }
+		 }
+	}	
+}
+
+/*8. build codon frequencies (use the F3x4 estimator) */
+
+PIStop = 1.0;
+codonFreqs = {ModelMatrixDimension,1};
+hshift = 0;
+
+for (h=0; h<64; h=h+1)
+{
+	first  = h$16;
+	second = h%16$4;
+	third  = h%4;
+	if (_Genetic_Code[h]==10) 
+	{
+		hshift = hshift+1;
+		PIStop = PIStop-baseFreqs[first][0]*baseFreqs[second][1]*baseFreqs[third][2];
+		continue; 
+	}
+	codonFreqs[h-hshift]=baseFreqs[first][0]*baseFreqs[second][1]*baseFreqs[third][2];
+}
+
+codonFreqs = codonFreqs*(1.0/PIStop);
+
+/*9. define the codon model */
+
+Model 		CodonModel = (GY_Matrix,codonFreqs,1);
+
+/*10. Approximate kappa and branch lengths using an HKY85 fit */
+
+HKY85_Matrix = {{*,t*kappa_inv,t,t*kappa_inv}
+				{t*kappa_inv,*,kappa_inv*t,t}
+				{t,t*kappa_inv,*,kappa_inv*t}
+				{t*kappa_inv,t,kappa_inv*t,*}};
+			
+HarvestFrequencies (nucFreqs,ds,1,1,1);
+Model HKY85_Model = (HKY85_Matrix,nucFreqs,1);
+
+Tree		  nucTree = treeString;
+DataSetFilter nucData = CreateFilter (ds,1);
+
+fprintf 					 (stdout, "Obtaining nucleotide branch lengths and kappa to be used as starting values...\n");
+LikelihoodFunction	nuc_lf = (nucData,nucTree);
+Optimize					 (nuc_mle,nuc_lf);
+fprintf 					 (stdout, "\n", Format (nucTree,1,1), "\nkappa=", Format (1/kappa_inv,8,3), "\n");
+nucBL					   = BranchLength (nucTree,-1);
+nucBN					   = BranchName	  (nucTree,-1);
+nucBC					   = Columns (nucBN) - 1;
+
+sampleCount				   = filteredData.sites*filteredData.species;
+baseParamCount			   = nuc_mle[1][1] + 9;
+
+fixGlobalParameters		  ("nuc_lf");
+
+/* work out the contributions of synRate and non-synRate to branch lengths */
+
+synMultiplier = computeScaling (1,0);
+nsMultiplier  = computeScaling (0,1);
+
+fprintf						 (stdout, "Fitting (c-AIC) step-up local models to determine the appropriate number (and proportions) of rate classes\n");
+
+bestBIC					   = 1e100;
+bestBIC_classes			   = 0;
+currentRate				   = 1;
+
+currentLFDef			   = "LikelihoodFunction codonLF = (";
+
+UseModel				   (CodonModel);
+USE_LAST_RESULTS		   = 1;
+logLByRateClassC		   = {};
+p_thresh				   = 0.01;
+
+while(1)
+{
+	fprintf 			(stdout, "Model with ", currentRate, " classes\n");
+	/* define the new tree */
+	
+	ExecuteCommands 	("Tree codon_tree_" + currentRate + " = " + treeString);
+	/* copy nucleotide branch lengths to this tree, using a random [0.05-1.95] dN/dS assignment */
+	
+	
+	if (currentRate>1)
+	{
+		currentLFDef	  = currentLFDef+",";
+		for (k = 0; k < nucBC; k = k+1)
+		{
+			randomProp = Random (0.05, 1.95);
+			ExecuteCommands ("codon_tree_" + currentRate+ "." + nucBN[k] + ".synRate       =  3*" + codonBL[k] + "/(synMultiplier + nsMultiplier)");
+			ExecuteCommands ("codon_tree_" + currentRate+ "." + nucBN[k] + ".nonSynRate    := ((codon_tree_1." + nucBN[k] + ".synRate - codon_tree_" + currentRate + "." + nucBN[k] + ".synRate)* synMultiplier__ + codon_tree_1." + nucBN[k] + ".nonSynRate * nsMultiplier__)/nsMultiplier__;");
+		}	
+	}
+	else
+	{
+		for (k = 0; k < nucBC; k = k+1)
+		{
+			randomProp = Random (0.05, 1.95);
+			ExecuteCommands ("codon_tree_1." + nucBN[k] + ".synRate    = 3*" + nucBL[k] + "/(synMultiplier + randomProp*nsMultiplier)");
+			ExecuteCommands ("codon_tree_1." + nucBN[k] + ".nonSynRate = codon_tree_1." + nucBN[k] + ".synRate * randomProp");
+		}	
+	}
+	currentLFDef 		  = currentLFDef + "filteredData,codon_tree_" + currentRate;
+	if (currentRate > 1)
+	{
+		generate_gdd_freqs (currentRate, "mixingFreq", "lfMix", "PS", 1);
+		ExecuteCommands (currentLFDef + ",\"" + lfMix + "\");");
+	}
+	else
+	{
+		ExecuteCommands (currentLFDef + ");");
+		mixingFreq = {{"1"}};
+	}
+	Optimize (resCurrent, codonLF);
+	codonBL = BranchLength (codon_tree_1, -1);
+	myDF	= baseParamCount+nucBC*currentRate;
+	myBIC 	= 2*(myDF*sampleCount/(sampleCount-myDF-1)-resCurrent[1][0]);
+	fprintf (stdout, codonLF);
+	
+	logLByRateClassC [currentRate] = resCurrent[1][0];
+	
+	if (currentRate > 1)
+	{
+		LRT = 2(logLByRateClassC [currentRate]-logLByRateClassC [currentRate-1]);
+		pp  = 1-CChi2(LRT,nucBC+1);
+		fprintf (stdout, "\nAdvance rate class count p-value = ", pp, "\n");
+		if (pp > p_thresh)
+		{
+			break;	
+		}
+	}
+
+	bestBIC_classes = currentRate;
+	bestFreqs		= mixingFreq;
+	Export 			  (bestLF, codonLF);
+	currentRate 		  = currentRate+1;	
+}
+
+ExecuteCommands (bestLF);
+
+LFCompute (codonLF,LF_START_COMPUTE);
+LFCompute (codonLF,alt_res);
+LFCompute (codonLF,LF_DONE_COMPUTE);
+
+hasPS    = {};
+numFreqs = {bestBIC_classes,1};
+
+SetDialogPrompt ("Save to:");
+
+fprintf  		(PROMPT_FOR_FILE, CLEAR_FILE, KEEP_OPEN);
+summaryOut = 	LAST_FILE_PATH;
+
+fprintf (summaryOut, "Branch,LogL,p1,p2");
+
+for (branchID   = 0; branchID < bestBIC_classes; branchID = branchID + 1)
+{
+	ExecuteCommands ("numFreqs[branchID] = " + bestFreqs[branchID] + ";");
+	fprintf (summaryOut, ",synRate_",branchID+1,",nonSynRate_",branchID+1);
+}
+
+fprintf (summaryOut, "\nSummary,",alt_res,",,");
+
+for (branchID   = 0; branchID < bestBIC_classes; branchID = branchID + 1)
+{
+	ExecuteCommands ("numFreqs[branchID] = " + bestFreqs[branchID] + ";");
+	fprintf (summaryOut, ",", numFreqs[branchID], ",");
+}
+
+
+
+
+nullLogLByBranch = {};
+
+
+for (branchID   = 0; branchID < nucBC; branchID = branchID + 1)
+{
+	thisBranchName = nucBN [branchID];
+
+	fprintf (summaryOut, "\n", thisBranchName);
+
+	fprintf (stdout, "Branch ", thisBranchName, "\n");
+	
+	rateString = "";
+	rateString * 128;
+	
+	for (classCount = 1; classCount <= bestBIC_classes; classCount = classCount + 1)
+	{
+		ExecuteCommands ("beta = codon_tree_" + classCount + "." + thisBranchName + ".nonSynRate;alpha = codon_tree_" + classCount + "." + thisBranchName + ".synRate;");
+		if (beta>alpha)
+		{
+			hasPS[thisBranchName] = hasPS[thisBranchName]+1;
+		}
+		rateString * ("," + alpha + "," + beta);
+		fprintf (stdout, "\tClass ", classCount, " (p=", numFreqs[classCount-1], ")\n\t\tdN/dS = ", beta/alpha, "\n");
+	}
+	rateString * 0;
+	if (hasPS[thisBranchName])
+	{
+		fprintf (stdout, "Testing for significance...\n");
+		global branchRatio_1;
+		branchRatio_1 :< 1; 
+		ExecuteCommands ("branchRatio_1 = codon_tree_1." + thisBranchName + ".nonSynRate / codon_tree_1." + thisBranchName + ".synRate");
+		ExecuteCommands ("codon_tree_1." + thisBranchName + ".nonSynRate := branchRatio_1 * codon_tree_1." + thisBranchName + ".synRate");
+
+		for (classCount = 2; classCount <= bestBIC_classes; classCount = classCount + 1)
+		{
+			ExecuteCommands ("global branchRatio_" + classCount + ":< 1;");
+			ExecuteCommands ("branchRatio_" + classCount + " = codon_tree_" + classCount+ "." + thisBranchName + ".nonSynRate / codon_tree_" + classCount+ "." + thisBranchName + ".synRate");
+			ExecuteCommands ("codon_tree_" + classCount+ "." + thisBranchName + ".nonSynRate := branchRatio_" + classCount +" * codon_tree_" + classCount+ "." + thisBranchName + ".synRate");
+			ExecuteCommands ("codon_tree_" + classCount+ "." + thisBranchName + ".synRate    := (codon_tree_1." + thisBranchName + ".synRate*synMultiplier__ + codon_tree_1." + thisBranchName + ".nonSynRate*nsMultiplier__)/(synMultiplier__+nsMultiplier__*branchRatio_" + classCount + ");");
+		}
+		Optimize (res_null, codonLF);
+		nullLogLByBranch [thisBranchName] = res_null[1][0];
+		LRT = 2*(alt_res-res_null[1][0]);
+		p1  = 1-CChi2(LRT,hasPS[thisBranchName]);
+		p2  = 1-CChi2(LRT,bestBIC_classes);
+		
+		fprintf (summaryOut, ",", res_null[1][0],",", p1 , ",", p2);
+		fprintf (stdout, "\n\tLR test statistic = ", LRT, "\n\tp-value (less conservative) = ", p1, "\n\tp-value (more conservative) = ", p2, "\n");
+		ExecuteCommands (bestLF);
+	}
+	else
+	{
+		fprintf (summaryOut, ",,");
+	}
+	fprintf (summaryOut, rateString);
+}
+
+fprintf (summaryOut, CLOSE_FILE);
+
+
+
+
+
+
+/*---------------------------------*/
+
+function computeScaling (sR,nsR)
+{
+	sc = 0;
+	synRate    = sR;
+	nonSynRate = nsR;
+	GYMN	   = GY_Matrix;
+	for (h=0; h<ModelMatrixDimension; h=h+1)
+	{
+		lsum = 0;
+		for (v=0;v<ModelMatrixDimension; v=v+1)
+		{
+			lsum = lsum + GYMN[h][v] * (v!=h) * codonFreqs[v];
+		}
+		sc = sc + lsum * codonFreqs[h];
+	}
+	return sc;
+}
+
+	
diff --git a/res/TemplateBatchFiles/LocalMolClock.bf b/res/TemplateBatchFiles/LocalMolClock.bf
new file mode 100644
index 0000000..15d3c84
--- /dev/null
+++ b/res/TemplateBatchFiles/LocalMolClock.bf
@@ -0,0 +1,265 @@
+function PadString (padLength,padChar)
+{
+	for (padCounter=0;padCounter<padLength;padCounter=padCounter+1)
+	{
+		fprintf (stdout,padChar);
+	}
+	return padLength;
+}
+
+fprintf(stdout,"\n ---- RUNNING LOCAL MOLECULAR CLOCKS ANALYSIS ---- \n");
+
+ChoiceList (dataType,"Data type",1,SKIP_NONE,"Nucleotide/Protein","Nucleotide or amino-acid (protein).",
+				     "Codon","Codon (several available genetic codes).");
+
+if (dataType<0) 
+{
+	return;
+}
+if (dataType)
+{
+	NICETY_LEVEL = 3;
+	#include "TemplateModels/chooseGeneticCode.def";
+}
+
+SetDialogPrompt ("Choose the data file:");
+
+DataSet ds = ReadDataFile (PROMPT_FOR_FILE);
+
+fprintf (stdout,"The following data was read:\n",ds,"\n");
+
+if (dataType)
+{
+	DataSetFilter filteredData = CreateFilter (ds,3,"","",GeneticCodeExclusions);
+}
+else
+{
+	DataSetFilter filteredData = CreateFilter (ds,1);
+}
+
+SelectTemplateModel(filteredData);
+
+#include "queryTree.bf";
+
+global RelRatio;
+
+RelRatio = 1.0;
+
+relationString = ":=RelRatio*";
+
+parameter2Constrain = 0;
+
+if (Rows("LAST_MODEL_PARAMETER_LIST")>1)
+{
+	ChoiceList (parameter2Constrain, "Parameter(s) to constrain:",1,SKIP_NONE,LAST_MODEL_PARAMETER_LIST);
+
+	if (parameter2Constrain<0)
+	{
+		return;
+	}
+	if (parameter2Constrain==0)
+	{
+		parameter2ConstrainString = "";
+		for (parameter2Constrain=Rows("LAST_MODEL_PARAMETER_LIST")-1; parameter2Constrain; parameter2Constrain = parameter2Constrain-1)
+		{
+			GetString (funnyString,LAST_MODEL_PARAMETER_LIST,parameter2Constrain);
+			parameter2ConstrainString = parameter2ConstrainString + funnyString + ",";
+		}
+		GetString (funnyString,LAST_MODEL_PARAMETER_LIST,0);
+		parameter2ConstrainString = parameter2ConstrainString + funnyString;
+	}
+	else
+	{
+		GetString (parameter2ConstrainString,LAST_MODEL_PARAMETER_LIST,parameter2Constrain-1);
+	}
+}
+else
+{
+	GetString (parameter2ConstrainString,LAST_MODEL_PARAMETER_LIST,0);
+}
+
+/*internalNodes = BranchCount(givenTree);
+
+choiceMatrix = {internalNodes,2};
+
+for (bc=0; bc<internalNodes; bc=bc+1)
+{
+	choiceMatrix[bc][0] = BranchName(givenTree,bc);
+	choiceMatrix[bc][1] = "Internal Branch Rooting " + givenTree[bc];
+}
+
+ChoiceList  (bOption,"Choose root of subtree",1,NO_SKIP,choiceMatrix);
+
+if (bOption < 0)
+{
+	return -1;
+}*/
+
+
+LikelihoodFunction lf = (filteredData,givenTree);
+
+Optimize (res,lf);
+
+fprintf (stdout, "\n\nRESULTS WITHOUT THE CLOCK:\n",lf);
+
+fullModelLik = res[1][0];
+
+fullVars = res[1][1];
+
+/* now specify the constraints */
+
+fprintf (stdout, "\n\n\nRESULTS WITH LOCAL CLOCKS\n\n(*)   - Clock rejected at significance level 0.05\n(**)  - Clock rejected at significance level 0.01\n(***) - Clock rejected at significance level 0.001\n\n");
+
+Tree clockTree = treeString;
+
+intBranchCount  = BranchCount (clockTree);
+
+nodeLength = 10;
+
+for (nodeCounter = 0; nodeCounter < intBranchCount; nodeCounter = nodeCounter+1)
+{
+	anIntBranch   = BranchName (givenTree,nodeCounter);
+	anIntBranch   = Abs (anIntBranch)+2;
+	if (anIntBranch>nodeLength)
+	{
+		nodeLength = anIntBranch;
+	}
+}
+
+separator = "+----------";
+
+for (nodeCounter = 10; nodeCounter < nodeLength; nodeCounter = nodeCounter+1)
+{
+	separator = separator + "-";
+}
+
+separator = separator + "+--------------+-------------+------------+\n";
+
+fprintf (stdout, separator, "| Clock At ");
+dummy = PadString (nodeLength-10," ");
+fprintf (stdout, "| LR Statistic | Constraints |  P-Value   |\n",separator);
+
+if (MPI_NODE_COUNT>1)
+{
+	MPINodeState = {MPI_NODE_COUNT-1,1};
+	MPINodeRoot  = {MPI_NODE_COUNT-1,1};
+	MPINodeRoot[0]  = "";
+	OPTIMIZE_SUMMATION_ORDER = 0;
+}
+
+for (nodeCounter = 0; nodeCounter < intBranchCount; nodeCounter = nodeCounter+1)
+{
+	anIntBranch   = BranchName (givenTree,nodeCounter);
+	
+	ExecuteCommands ("MolecularClock (clockTree."+anIntBranch+","+parameter2ConstrainString+");");
+
+	LikelihoodFunction lfConstrained = (filteredData, clockTree);
+
+	if (MPI_NODE_COUNT>1)
+	{
+		for (mpiNode = 0; mpiNode < MPI_NODE_COUNT-1; mpiNode = mpiNode+1)
+		{
+			if (MPINodeState[mpiNode]==0)
+			{
+				break;	
+			}
+		}
+		
+		if (mpiNode==MPI_NODE_COUNT-1)
+		/* all nodes busy */
+		{
+			mpiNode = ReceiveJobs (1);
+		}
+		else
+		{
+			MPISend (mpiNode+1,lfConstrained);
+			MPINodeState[mpiNode] = 1;
+			MPINodeRoot[mpiNode] = anIntBranch;
+		}
+	}
+	else
+	{
+		Optimize (lfConstrained_MLES,lfConstrained);
+		dummy = ReceiveJobs (0);
+	}
+	
+	ClearConstraints (clockTree);
+}
+
+if (MPI_NODE_COUNT>1)
+{
+	while (1)
+	{
+		for (nodeCounter = 0; nodeCounter < MPI_NODE_COUNT-1; nodeCounter = nodeCounter+1)
+		{
+			if (MPINodeState[nodeCounter]==1)
+			{
+				fromNode = ReceiveJobs (0);
+				break;	
+			}
+		}
+		if (nodeCounter == MPI_NODE_COUNT-1)
+		{
+			break;
+		}
+	}	
+	OPTIMIZE_SUMMATION_ORDER = 1;
+}
+
+function ReceiveJobs (sendOrNot)
+{
+	if (MPI_NODE_COUNT>1)
+	{
+		MPIReceive (-1, fromNode, result_String);
+		anIntBranch2 = MPINodeRoot[fromNode-1];
+		if (sendOrNot)
+		{
+			MPISend (fromNode,lfConstrained);
+			MPINodeRoot[fromNode-1] = anIntBranch;
+		}
+		else
+		{
+			MPINodeState[fromNode-1] = 0;
+			MPINodeRoot[fromNode-1]  = "";
+		}
+		
+		anIntBranch = anIntBranch2;
+		
+		ExecuteCommands (result_String);
+	}
+	
+	lnLikDiff = 2(fullModelLik-lfConstrained_MLES[1][0]);
+
+	degFDiff = fullVars - lfConstrained_MLES[1][1];
+	
+	fprintf (stdout, "|", anIntBranch);
+
+	dummy = PadString (nodeLength-Abs(anIntBranch)," ");
+	
+	pValue = 1-CChi2(lnLikDiff,degFDiff);
+
+	fprintf (stdout, "| ", Format (lnLikDiff,12,6), " | ", Format (degFDiff,11,0), " | ", Format (pValue,10,8), " |");
+
+	if (pValue<0.001)
+	{
+		fprintf (stdout, " (***)");
+	}
+	else
+	{
+		if (pValue<0.01)
+		{
+			fprintf (stdout, " (**)");
+		}
+		else
+		{
+			if (pValue<0.05)
+			{
+				fprintf (stdout, " (*)");
+			}
+		}
+	}
+
+	fprintf (stdout, "\n",separator);
+			
+	return fromNode-1;
+}
diff --git a/res/TemplateBatchFiles/MEDS.bf b/res/TemplateBatchFiles/MEDS.bf
new file mode 100644
index 0000000..edb3e79
--- /dev/null
+++ b/res/TemplateBatchFiles/MEDS.bf
@@ -0,0 +1,479 @@
+RequireVersion ("2.0020101201");
+
+/*----------Branch-Site Directional Selection Analysis---------*/
+/*Usage: Takes an alignment and a tree (with foreground branches tagged with "{FG}"), a nucleotide model
+string ("010010" for HKY85, "012345" for REV), a range of sites to test, and a site reference shift,
+which allows for alignments that don't start where they should*/
+
+/*--Analysis Setup--*/
+
+
+fprintf (stdout, "\n[RUNNING MEDS (Models for Episodic Directional Selection). For help please refer to http://www.hyphy.org/wiki/MEDS ]\n");
+nucModelString 	= "012345";
+
+SetDialogPrompt ("Load a coding alignment");
+/*---------Loading alignment and tree files-------------------------------------*/
+
+DataSet 		myData = ReadDataFile (PROMPT_FOR_FILE);
+fprintf (stdout, "Loaded ", myData.species, " sequences with ", myData.sites, " sites from ",LAST_FILE_PATH,"\n");
+
+SetDialogPrompt ("Load an annotated tree file"); 
+fscanf 			(PROMPT_FOR_FILE, "Raw", treeString);
+
+SetDialogPrompt ("Specify the output (.csv) file"); 
+fprintf 		(PROMPT_FOR_FILE, CLEAR_FILE);
+
+outputFile 		= LAST_FILE_PATH;
+
+siteShift 		= -1;  /*Used to standardize codon positions. Remember HyPhy indexes from 0, so siteShift = -1 will report first codon as 1*/
+
+
+/*--Code Overview:--*/
+/*
+1) Estimate branch lengths by fitting a custom nuc model. These are used throughout.
+2) Fit foreground and background codon models, with all parameters except the nonsyn rate tied
+	between fg and bg. This is to get estimates of the nucleotide transition rates from a codon model.
+3) Site by site FEL directional selection analysis: Nuc transition rates are fixed from 2).
+	For each site, fit a positive selection null model that allows freely variable syn rate,
+	and nonsynBG rates but with nonsynFG constrained to equal syn. Fit a second positive selection
+	model, with nonsynFG unconstrained. An LRT is used to determine whether the unconstrained
+	positive selection model significantly outperformed the null. So far this is only positive
+	selection. The unconstrained positive selection model will be used as the null for tests of
+	directional selection. For each of 20 AAs, fit a seperate model that allows a rate multiplier
+	favouring substitutions towards that AA. This produces 20 nested models, so a set Bonferroni
+	corrected LRTs can be used to identify evidence of direction selection. This batch file outputs
+	p-values BEFORE Bonferroni correction.
+*/
+
+/*--Code--*/
+ACCEPT_ROOTED_TREES=1;
+_DO_TREE_REBALANCE_ = 0;
+COUNT_GAPS_IN_FREQUENCIES = 0;
+
+LoadFunctionLibrary ("chooseGeneticCode");
+countSenseCodons = + ({64,1}["IsStop(_MATRIX_ELEMENT_ROW_,_Genetic_Code)==0"]);
+
+
+/*---------Estimate Branch Lengths Using Nucleotide Model-----------------------*/
+DataSetFilter myFilter = CreateFilter (myData,1);
+HarvestFrequencies (obsNucFreqs, myFilter, 1, 1, 1);
+
+/*---------Begin Setting up custom nuc model---------------*/
+/*The parameters that the nucModelString indexes into*/
+nucBiasMult = {{"AC*","","AT*","CG*","CT*","GT*"}};
+
+/*Initialises and populates a matrix of string values nuc multipliers*/
+customRateString = {{"*","","",""}
+					{"","*","",""}
+					{"","","*",""}
+					{"","","","*"}
+				 };
+				 
+for (i=0; i<3; i+=1)
+{
+	shift = -(i == 0);
+	for(j=i+1;j<4;j += 1)
+	{
+		customRateString[i][j] = Eval ("nucBiasMult["+nucModelString[j+i+shift]+"]");
+		customRateString[j][i] = customRateString[i][j];
+	}
+}
+
+global AC = 1; global AT = 1; global CG = 1; global CT = 1; global GT = 1; 
+
+/*To set up a nucleotide model, populate a string version of the rate matrix*/
+modelDefString = "";
+modelDefString * 16384;
+
+modelDefString* "{" ;
+for (i=0; i<4; i += 1)
+{
+	modelDefString*("{");
+	for(j=0;j<4;j=j+1)
+	{
+		if(j>0)
+		{
+			modelDefString*(",");
+		}
+		if(i==j)
+		{
+			modelDefString*("*");
+		}
+		else
+		{
+			modelDefString*(customRateString[i][j]+"t");
+		}
+	}
+	modelDefString*"}";
+}
+modelDefString*"}";
+modelDefString*0;
+ExecuteCommands("nucModel = " + modelDefString);
+Model RT = (nucModel, obsNucFreqs);
+
+/*This is in case the treestring came with model assignments!*/
+Model FG = (nucModel, obsNucFreqs);
+
+/*-----------End of defining nuc model------------*/
+
+
+/*FIDDLING WITH THE ROOTING. This (commented out) code reroots on an internal branch and is only certain to work on trees with external branches marked FG. This is removed and now only rooted trees are accepted.*/
+/*
+Tree tempTree = treeString;
+treeString = RerootTree(treeString,BranchName(tempTree,0));
+*/
+Tree givenTree = treeString;
+
+fprintf (stdout, "\n\n[PHASE 1. Estimating Branch Lengths using a Nucleotide Model]\n");
+LikelihoodFunction theLikFun = (myFilter, givenTree, obsFreqs);
+Optimize (paramValues, theLikFun);
+fprintf (stdout, theLikFun);
+
+/*---------end nuc model fit----------*/
+
+/*---------Labels all branches containing branchID with the FG model. This code segment does nothing when the branches are explicitly tagged, and branchMatch doesn't match anything-------------*/
+/*--First populate a list of branches containing branchID. branchID could be regExp text--*/
+branchMatch = "DONTNAMEANYTAXATHISUNLESSYOUREALLYMEANIT"; /*This is a different (old) way to tag foreground branches - All terminal branches with any substring = branchMatch will get tagged. This is untested and explicit tree tagging is preffered*/
+branchID = branchMatch;
+BOInames = {};
+tips = TipCount(givenTree);
+loc = 0;
+for (i=0; i<tips; i=i+1)
+{
+	tempTipName = TipName(givenTree,i);
+	tempResult = tempTipName$branchID;
+	if (tempResult[1][1]>=0)
+		{
+			BOInames[loc] = TipName(givenTree,i);
+			loc=loc+1;
+		}
+}
+/*--use regular expressions to append the FG model text--*/
+numBOI = loc;
+newTreeString = treeString;
+
+fprintf (stdout, "The following branches were labeled as foreground: \n");
+
+for (i=0; i< numBOI; i=i+1)
+{
+	newTreeString = newTreeString^{{BOInames[i]}{BOInames[i]+"{FG}"}};
+	/*Just to check what I label*/
+	//fprintf (stdout, BOInames[i], "\n");
+}
+treeString = newTreeString;
+/*-----End branch labeling code-----*/
+
+/*---------------------Harvesting Frequencies-----------------------*/
+/*---A function that converts a nucFreqMatrix to a vector of freqs--*/
+function BuildCodonFrequencies (nucFreqMatrix)
+{
+	
+	PIStop = 1.0; 		/* denominator */
+	result = {countSenseCodons,1};    /* resulting codon frequencies */
+	hshift = 0;         /* how many stop codons have been counted so far */
+
+	for (h=0; h<64; h=h+1) /* loop over all possible codons */
+	{
+		first  = h$16;    /* Decompose a codon into 3 nucleotides. 
+							 The index of the first nucleotide (A=0,C=1,G=2,T=3) is found here,
+							 by doing integer division by 16  */
+		second = h%16$4;  /* The index of the second nucleotide. 
+							 First take the remainder of division by 16, i.e. positions 2 and 3
+							 and then extract position 2 by integer division by 4*/
+		third  = h%4;     /* The index of the third nucleotide.
+							 Remainder of integer division by 4*/
+							 
+						  /* in the end: h = 16*first + 4*second + third */
+							 
+		if (_Genetic_Code[h]==10) /* stop codon */ 
+		{
+			hshift = hshift+1; 
+			PIStop = PIStop-nucFreqMatrix[first][0]*nucFreqMatrix[second][1]*nucFreqMatrix[third][2]; /* adjust the denominator */
+		}
+		else
+		{
+			result[h-hshift] = nucFreqMatrix[first][0]*nucFreqMatrix[second][1]*nucFreqMatrix[third][2]; 
+											/* store the frequency for codon h. Notice the substraction of hshift to compensate
+											  for the absense of stop codons. The first codon affected by it is 
+											  TAC (h=49), which gets stored in result[48], because TAA (a stop codon) was skipped. */
+		}
+	}
+	return result*(1.0/PIStop);
+}
+DataSetFilter 		codonFilter  = CreateFilter	(myData,3,"","","TAA,TAG,TGA"); /* define the codon filter, excluding stop codons */
+HarvestFrequencies  (nuc3by4,myData,3,1,1); 			     /* collect position specific nucleotide frequencies */
+estimatedCodonFreqs = BuildCodonFrequencies(nuc3by4);
+/*----------------------Done with freqs-----------------------------------------*/
+
+
+/*----------------------Defines a function for creating a custom codon model--------------*/
+/*-------Usage: "PopulateModelMatrix ("ModelVarName",Freq3x4,targetAA,customRateString,"nonSynRateTag");"---*/
+/*specify targetAA = 21 if you don't want directional selection. NonSynRateTag allows one to control the
+name of the "nonsyn" rate variable by appending nonSynRateTag to the end. This allows having seperate foreground
+and background nonsyn rates. "customRateString" is NOT a PAUP specifier, but rather a matrix of string valued
+multiplers, derived above in the setup of the nuc model*/
+/*Part copypasta from MG94customCF3x4.mdl*/
+
+function PopulateModelMatrix (ModelMatrixName&, EFV, targetAA,customRateString,nonSynRateTag)
+{
+	ModelMatrixDimension = countSenseCodons;
+	_localNucBiasMult = customRateString;
+	ModelMatrixName = {ModelMatrixDimension,ModelMatrixDimension}; 
+	modelDefString = "";
+	modelDefString*16384;
+	hshift = 0;
+	for (h=0; h<64; h=h+1)
+	{
+		if (_Genetic_Code[h]==10) 
+		{
+			hshift = hshift+1;
+			continue; 
+		}
+		vshift = 0;
+		for (v = 0; v<64; v=v+1)
+		{
+			if(h==v)
+			{
+				continue;
+			}
+			diff = v-h;
+			if (_Genetic_Code[v]==10) 
+			{
+				vshift = vshift+1;
+				continue; 
+			}
+			nucPosInCodon = 2;
+			if ((h$4==v$4)||((diff%4==0)&&(h$16==v$16))||(diff%16==0)) /* differ by one subsitution only */
+			{
+				if (h$4==v$4) /* third position */
+				{
+					transition = v%4;
+					transition2= h%4;
+				}
+				else
+				{
+					if(diff%16==0) /* first position */
+					{
+						transition = v$16;
+						transition2= h$16;
+						nucPosInCodon = 0;
+					}
+					else   /* second position */
+					{
+						transition = v%16$4;
+						transition2= h%16$4;
+						nucPosInCodon = 1;
+					}
+				}
+				hs = Format(h-hshift,0,0);
+				vs = Format(v-vshift,0,0);
+				ts = Format(transition,0,0);
+				ts2= Format(transition2,0,0);
+				ps = Format(nucPosInCodon,0,0);
+				aa1 = _Genetic_Code[h];
+				aa2 = _Genetic_Code[v];
+				
+				synOrNon = "nonsyn"+ nonSynRateTag +"*";
+				if (aa1==aa2) {synOrNon = "syn*";}
+				targetAAmult = "";
+				if (aa2==targetAA) {targetAAmult = "((1/(1-omegaT))-1)*";} /*This is a different way of parameterizing the omegaT multiplier that improves optimization speed. Needs to be transformed back at the end*/
+				modelDefString*("ModelMatrixName["+hs+"]["+vs+"] := " + targetAAmult + synOrNon + "t*"+_localNucBiasMult[transition][transition2]+"EFV__["+ts+"]["+ps+"];\n");   /*EFV__["+ts+"]["+ps+"] multiplies the 3x4 equilibrium frequency of the column codon*/
+			}
+	    }
+    }		
+	modelDefString*0;
+	ExecuteCommands (modelDefString);
+	return 0;
+}
+/*--------------------End of custom codon model setup function-------------*/
+
+/* --------------------Set up the background model--------------------*/
+global syn = 1;
+global nonsyn=1;
+/*--Populate the transition matrix for the background codon model--*/
+PopulateModelMatrix ("MG94xCustomRateMatrix",nuc3by4,21,customRateString,"");   
+Model MG94xCustom = (MG94xCustomRateMatrix,estimatedCodonFreqs,0);
+
+/* -------------------Set up the foreground model-------------------------*/
+global nonsynFG=1;
+/*Populate the transition matrix for the foreground codon model*/
+PopulateModelMatrix ("MG94xCustomRateMatrixFG",nuc3by4,21,customRateString,"FG");  
+Model FG = (MG94xCustomRateMatrixFG,estimatedCodonFreqs,0);
+
+/*------------------Assign models to tree------------------------*/
+UseModel(MG94xCustom); /*This sets assigns background model to all unlabeled branches*/
+
+/*Just to check my {FG} tags!*/
+fprintf (stdout, treeString);
+
+Tree myTreeFG = treeString; /*treeString has "{FG}" appended to all foreground branches*/
+
+/*Forces all branch lengths to be those estimated by the nuc model*/
+ReplicateConstraint ("this1.?.t:=this2.?.t__",myTreeFG,givenTree);
+
+/*----------------Optimise likelihood function--------------------*/
+
+fprintf (stdout, "\n\n[PHASE 2. Estimating Substitution Parameters using the Global Codon Model]\n");
+
+LikelihoodFunction lf = (codonFilter, myTreeFG);
+Optimize (myRes, lf);
+fprintf (stdout, "\n", lf, "\n");
+
+/*--------Forever constrain nuc rates-------*/
+AC := AC__; AT := AT__; CG := CG__; CT := CT__; GT := GT__; 
+
+/*--------------Setting up the output file--------------------------*/
+fprintf (outputFile,CLEAR_FILE,"Site,NullLL,NullBgNonSyn,NullSyn,DivLL,Div_p,DivFgNonSyn,DivBgNonSyn,DivSyn,0LL,0p,0w,0FgNonSyn,0BgNonSyn,0Syn,1LL,1p,1w,1FgNonSyn,1BgNonSyn,1Syn,2LL,2p,2w,2FgNonSyn,2BgNonSyn,2Syn,3LL,3p,3w,3FgNonSyn,3BgNonSyn,3Syn,4LL,4p,4w,4FgNonSyn,4BgNonSyn,4Syn,5LL,5p,5w,5FgNonSyn,5BgNonSyn,5Syn,6LL,6p,6w,6FgNonSyn,6BgNonSyn,6Syn,7LL,7p,7w,7FgNonSyn,7BgNonSyn,7Syn,8LL,8p,8w,8FgNonSyn,8BgNonSyn,8Syn,9LL,9p,9w,9FgNonSyn,9BgNonSyn,9Syn,10LL,10p,10w,10FgNonSyn,10BgNonSyn [...]
+
+/*----------------------------For loop over sites-----------------------------------*/
+
+fprintf (stdout, "\n\n[PHASE 3. Testing for Directional Selection on Foreground Branches]\n");
+
+for(siteIn=1;siteIn<=codonFilter.sites;siteIn += 1)
+{
+	fprintf (stdout, "Working on site ", siteIn, "\n");
+	
+	/*-------------Allow user to select sites and options-------------*/
+	site = siteIn +siteShift;
+	siteString = "" + (site*3) + "-" + (site*3+2);
+	DataSetFilter siteFilter = CreateFilter (myData,3,siteString,"","TAA,TAG,TGA");
+	
+	/*-----Count Site Specific Codon and AA Freqs. This is just to exclude certain sites------*/
+	HarvestFrequencies (siteCodFreqs, siteFilter, 3, 3, 0);
+	AAfreqs = {21,1};
+	for (h=0; h<64; h=h+1) /* loop over all possible codons */
+	{
+		AAfreqs[ _Genetic_Code[h]] += siteCodFreqs[h];
+	}
+	
+	/*Count how many AA have frequencies greater than 0*/
+	numGrtZero = 0;
+	for (h=0; h<21; h=h+1) /* loop over all possible codons */
+	{
+		if(AAfreqs[h]>0)
+		{
+			numGrtZero = numGrtZero+1;
+		}
+	}
+	/*-------------Only test a site if there is more than one observed AA-------------*/
+	if(numGrtZero>1) 
+	{
+		AAlower = 0; AAupper = 20;
+	
+		AAlikes = {};
+		AAlikesOmegaTs = {};
+		AAlikesSyn = {};
+		AAlikesBgNonSyn = {};
+		AAlikesFgNonSyn = {};
+		
+		/*-------------------------loop over amino acid targets--------------------------------*/
+		for (AAcount=AAlower; AAcount<AAupper+1; AAcount=AAcount+1)
+		{
+			/*------Only test for directional selection towards observed AAs-------*/
+			if(AAfreqs[AAcount]>0) /*Stop codons are implicitly excluded*/
+			{
+				fprintf (stdout, "\tTesting target residue ", _hyphyAAOrdering[AAcount], "\n");
+				targetAA = AAcount;
+			
+				/* --------------------Construct Directional Model---------------------------------*/
+				global nonsynDIR=1;
+				global omegaT = 0.5; /*reparameterized. 0.5 = 1*/
+				PopulateModelMatrix ("MG94xCustomRateMatrixDIR",nuc3by4,targetAA,customRateString,"DIR");
+				Model FG = (MG94xCustomRateMatrixDIR,estimatedCodonFreqs,0);
+
+				UseModel(MG94xCustom); /*This assigns background model to all unlabeled branches*/
+				Tree myTreeFG = treeString;
+				
+				/*Forces all branch lengths to be those estimated by the nuc model*/
+				ReplicateConstraint ("this1.?.t:=this2.?.t__",myTreeFG,givenTree);
+				omegaT :<1; /*For the reparameterization*/
+				syn = 1; /*this is shared between foreground and background*/
+				nonsyn=1; /*background nonsyn rate*/
+				
+				LikelihoodFunction lf = (siteFilter, myTreeFG);
+				Optimize (mySiteRes, lf); 
+				/*fprintf (stdout, "\n", lf, "\n");*/
+				
+				unConstrainedRatio = mySiteRes[1][0];
+				AAlikes[AAcount] = unConstrainedRatio;
+				AAlikesOmegaTs[AAcount] = omegaT;
+				AAlikesSyn[AAcount] = syn;
+				AAlikesBgNonSyn[AAcount] = nonsyn;
+				AAlikesFgNonSyn[AAcount] = nonsynDIR;
+			}
+			else
+			{
+				fprintf (stdout, "\tSkipping unobserved target residue ", _hyphyAAOrdering[AAcount], "\n");
+				AAlikes[AAcount] = -99999999;
+				AAlikesOmegaTs[AAcount] = -99;
+				AAlikesSyn[AAcount] = -99;
+				AAlikesBgNonSyn[AAcount] = -99;
+				AAlikesFgNonSyn[AAcount] = -99;
+			}
+		}
+		
+		/*---------------------Set up model allowing non-neutral selection on FG---------------*/
+		syn = 1;
+		nonsyn=1;
+		nonsynDIR=1; /*Allow positive selection on FG*/
+		omegaT :=0.5; /*Constrain omegaT to 1 for null model - reparameterized*/
+		LikelihoodFunction lf = (siteFilter, myTreeFG);
+		Optimize (mySiteRes, lf);
+		constrainedRatioPos = mySiteRes[1][0];
+		DivFgNonSyn = nonsynDIR;
+		DivBgNonSyn = nonsyn;
+		DivSyn = syn;
+		/*--End non-neutral model--*/
+		
+		/*---------------------Set up null model forcing neutral selection on FG----------------*/
+		syn = 1;
+		nonsyn=1;
+		nonsynDIR:=syn; /*Force neutral selection on FG*/
+		omegaT :=0.5; /*Constrain omegaT to 1 for null model - reparameterized*/
+		LikelihoodFunction lf = (siteFilter, myTreeFG);
+		Optimize (mySiteRes, lf); 
+		/*fprintf (stdout, "\n", lf, "\n");*/
+		constrainedRatioNoPos = mySiteRes[1][0];
+		/*--End null model--*/
+		
+		/*-----------------------Display and Write Results------------------------*/
+		/*---"Site,NullLL,NullBgNonSyn,NullSyn,DivLL,Div_p,DivFgNonSyn,DivBgNonSyn,DivSyn,0LL,0p,0w,0FgNonSyn,0BgNonSyn,0Syn"---*/
+		outputString = ""+siteIn;
+		outputString = outputString + "," + constrainedRatioNoPos + "," + nonsyn + "," + syn;
+		fprintf (stdout, "\nTests for site ", siteIn,"\n");
+		
+		/*--First a test for general positive selection at the site--*/
+		lrtPosVsNoPos = 2*(constrainedRatioPos-constrainedRatioNoPos);
+		pValPosVsNoPos = 1-CChi2 (lrtPosVsNoPos, 1);
+		fprintf (stdout, "\tLikelihood Ratio Test for diversifying selection");
+		fprintf (stdout, ": ", lrtPosVsNoPos);
+		fprintf (stdout, "  p-value: ", pValPosVsNoPos, "\n");
+		
+		outputString = outputString + "," + constrainedRatioNoPos + "," + pValPosVsNoPos + "," + DivFgNonSyn + "," + DivBgNonSyn + "," + DivSyn;
+		
+		/*--Now test for directional selection vs positive selection--*/
+		fprintf (stdout, "\tTesting for directional selection againts null allowing positive selection in foreground", "\n");
+		for (AAcount=AAlower; AAcount<AAupper+1; AAcount=AAcount+1)
+		{
+			lrtScore = 2*(AAlikes[AAcount]-constrainedRatioPos);
+			pValues = 1-CChi2 (2*(AAlikes[AAcount]-constrainedRatioPos), 1);
+			if (AAfreqs[AAcount] > 0)
+			{
+				fprintf (stdout, "\tLikelihood Ratio Test for: ", _hyphyAAOrdering[AAcount]);
+				fprintf (stdout, "  : ", lrtScore);
+				fprintf (stdout, "  p-value: ", pValues, "\n");
+			}
+			outputString = outputString + "," + AAlikes[AAcount] + "," + pValues + "," + AAlikesOmegaTs[AAcount] + "," + AAlikesFgNonSyn[AAcount] + "," + AAlikesBgNonSyn[AAcount] + "," + AAlikesSyn[AAcount];
+		}
+		/*Testing for directional vs neutral selection can be done in post-processesing*/
+		fprintf (outputFile,"\n",outputString);
+		/*Clear constraints to test another site*/
+		ClearConstraints(omegaT)
+		ClearConstraints(nonsynDIR);
+	}
+	else
+	{
+		fprintf (stdout,"Skipped site ",siteIn," because it is invariable\n");
+	}
+	
+} /*End main loop*/
diff --git a/res/TemplateBatchFiles/MEME_mf.bf b/res/TemplateBatchFiles/MEME_mf.bf
new file mode 100644
index 0000000..6e6f394
--- /dev/null
+++ b/res/TemplateBatchFiles/MEME_mf.bf
@@ -0,0 +1,793 @@
+RequireVersion  ("2.0020110101");
+
+timer = Time(1);
+
+LoadFunctionLibrary ("GrabBag");
+LoadFunctionLibrary ("WriteDelimitedFiles");
+
+ExecuteAFile 		("qndhelper1_mf.ibf");
+
+SHORT_MPI_RETURN 	= 1;
+SAVE_FIT_TO_FILE = "";
+
+rOptions = 2;
+ExecuteAFile 		("qndhelper2_mf.ibf");
+
+fprintf (stdout, "\n");
+_in_dNdSPValue = prompt_for_a_value ("Significance level for Likelihood Ratio Tests",0.05,0,1,0);
+fprintf (stdout, "MEME will use test p-value of ", _in_dNdSPValue, "\n");
+
+saveNucs = {{AC__,AT__,CG__,CT__,GT__}};
+
+OPTIMIZATION_METHOD = 0;
+USE_LAST_RESULTS   = 1;
+
+ClearConstraints (AC,AT,CG,CT,GT);  
+
+for (k = 1; k <= fileCount; k+=1)
+{
+	ExecuteCommands ("ClearConstraints (codonTree_" + k + ");");
+	ExecuteCommands ("ReplicateConstraint(\"this1.?.nonSynRate:=dNdS*this2.?.synRate\",codonTree_"+k+",codonTree_"+k+")");
+}
+
+fprintf (stdout, "\n[MEME PHASE 0] Retuning branch lengths and nucleotide rates under the codon model...\n");
+
+finishedPatterns = 0;
+
+
+T0 = Time(1);
+Optimize (codonLF, lf);
+OPTIMIZATION_TIME_HARD_LIMIT = (Time(1)-T0)*4;
+
+AUTO_PARALLELIZE_OPTIMIZE = 0;
+fprintf (stdout, "Improved Log(L) BY ", codonLF[1][0]-resC[1][0], " points\n");
+OPTIMIZATION_METHOD = 4;
+
+LoadFunctionLibrary ("BranchSiteTemplate");
+
+global      mixingP     =         0.5; mixingP :< 1-1e-9; mixingP :> 1e-9;
+
+PopulateModelMatrix              ("MGMatrix1",  positionFrequencies, "alpha", "", "beta1");
+PopulateModelMatrix              ("MGMatrix2",  positionFrequencies, "alpha", "", "beta2");
+AC := saveNucs__[0];
+AT := saveNucs__[1];
+CG := saveNucs__[2];
+CT := saveNucs__[3];
+GT := saveNucs__[4];
+
+Model 		MG1		=		  ("Exp(MGMatrix1)*mixingP+Exp(MGMatrix2)*(1-mixingP)",codonFrequencies,EXPLICIT_FORM_MATRIX_EXPONENTIAL);
+Model       MGFEL   =         (MGMatrix2,codonFrequencies,0);
+
+global      sFactor   =  1;
+global      nsFactor1 =  1;
+nsFactor1               :< 1;
+global      nsFactor2 =  1;
+global      omega2    =  1;
+			omega2    :< 1;
+
+omega2    :> 0;
+nsFactor2 :> 0;
+nsFactor1 :> 0;
+sFactor   :> 0;
+
+
+doneSites    = {totalUniqueSites,8};
+fullSites    = {totalCodonCount,9};						
+labels       = {{"Beta-","Weight-","Beta+","Weight+","alpha","LRT","p-value","Full Log(L)"}};
+
+fprintf (stdout, "[MEME PHASE 1]. Fitting a codon model site-by-site\n",
+"| Codon |     Beta- |   Weight- |    Beta+  |   Weight+ |     alpha |      LRT  |   p-value |Full Log(L)|   Est. remaining time (secs)\n");
+
+
+if (MPI_NODE_COUNT > 1) { 								
+    MPINodeState 		= {MPI_NODE_COUNT-1,5};
+    haz_MPI             = 1;
+} else {
+    MPINodeState 		= {1,5};
+    haz_MPI             = 0;
+}
+
+treeLengths 		= {fileCount,1};
+MEME_RUN_TIMER    	= Time(1);
+
+vOffset  = 0;
+vuOffset = 0;
+alreadyDone   = {totalUniqueSites,1};
+timesPerSite  = {totalUniqueSites,4} ["(_MATRIX_ELEMENT_ROW_+1)*(_MATRIX_ELEMENT_COLUMN_==3)"];
+bySiteCache   = {totalUniqueSites, 3};
+
+LoadFunctionLibrary ("CodonTools.def");
+
+GetString (funcInfo, obtainBranchWiseEBEstimatesMPI, -1);
+funcText = "function " + funcInfo["ID"] + "(" + Join (",", funcInfo["Arguments"]) + ") { " + funcInfo ["Body"] + "}";
+
+
+_memeExtraNull = "SAVE_FIT_TO_FILE = \"`SAVE_FIT_TO_FILE`\";
+if (Abs (SAVE_FIT_TO_FILE)) {
+    LIKELIHOOD_FUNCTION_OUTPUT = 7;
+    saveLFTo = SAVE_FIT_TO_FILE + \".\" + fileID + \".\" + siteID + jobSuffix;
+    fprintf (saveLFTo, CLEAR_FILE, siteLikelihood);
+    LIKELIHOOD_FUNCTION_OUTPUT = 2;
+}
+";
+
+ _memeExtra = _memeExtraNull + funcText + 
+"_OBSERVED_S_ = " + _OBSERVED_S_ + ";\n" +
+"_OBSERVED_NS_ = " + _OBSERVED_NS_ + ";\n" +
+"MPI_NEXUS_FILE_RETURN = {};
+ MPI_NEXUS_FILE_RETURN [\"MLES\"]     = siteLikelihood_MLES;
+ _vtr = {{\"nsFactor1\", \"nsFactor2\", \"sFactor\", \"mixingP\"}};
+ MPI_NEXUS_FILE_RETURN [\"VALUES\"]   = {};
+ for (_k = 0; _k < Columns (_vtr); _k += 1) {
+    (MPI_NEXUS_FILE_RETURN [\"VALUES\"])[_vtr[_k]] = Eval (_vtr[_k]);
+ }
+ MPI_NEXUS_FILE_RETURN [\"BRANCHES\"] = obtainBranchWiseEBEstimatesMPI (sFactor, nsFactor1, nsFactor2, mixingP);
+";
+
+bySiteBranchReports = {};
+saveTreesForReports = {};
+
+for (fileID = 1; fileID <= fileCount; fileID = fileID+1)
+{
+	ClearConstraints (siteTree);
+	ClearConstraints (felTree);
+	UseModel		  (MG1);
+	Tree		   	  siteTree = treeStrings[fileID];
+	saveTreesForReports [fileID] = Eval("Format (codonTree_" + fileID +",1,1)");
+	UseModel		  (MGFEL);
+	Tree		   	  felTree = treeStrings[fileID];
+	
+	ExecuteCommands ("GetDataInfo  (dupInfo, filteredData_"+fileID+");");			
+	ExecuteCommands ("thisFilterSize  = filteredData_"+fileID+".sites;");			
+	ExecuteCommands ("thisFilterSizeU = filteredData_"+fileID+".unique_sites;");
+	
+	ExecuteCommands ("ReplicateConstraint (\"this1.?.alpha:=sFactor*this2.?.synRate__\",siteTree,codonTree_"+fileID+");");
+ 	ExecuteCommands ("ReplicateConstraint (\"this1.?.beta1:=nsFactor1*sFactor*this2.?.synRate__\",siteTree,codonTree_"+fileID+");");
+ 	ExecuteCommands ("ReplicateConstraint (\"this1.?.beta2:=nsFactor2*this2.?.synRate__\",siteTree,codonTree_"+fileID+");");
+                                
+ 	ExecuteCommands ("ReplicateConstraint (\"this1.?.alpha:=sFactor*this2.?.synRate__\",felTree,codonTree_"+fileID+");");
+ 	ExecuteCommands ("ReplicateConstraint (\"this1.?.beta2:=nsFactor2*this2.?.synRate__\",felTree,codonTree_"+fileID+");");
+
+	treeLengths [fileID-1] = + Eval("BranchLength(codonTree_"+fileID+",-1)");
+	
+	lfSpawnDone 	  = 0;
+	//debugVerboseFlag  = 1;
+	toDoList      	  = {};
+	
+	// populate the initial queue of things to do
+	
+	for (siteCount = 0; siteCount < thisFilterSize; siteCount += 1)
+	{
+		siteMap = dupInfo[siteCount] + vuOffset;
+		if (alreadyDone[siteMap] == 0)
+		{
+			alreadyDone[siteMap] = 1;				
+			filterString = "" + (siteCount*3) + "-" + (siteCount*3+2);
+			ExecuteCommands ("DataSetFilter siteFilter = CreateFilter (ds_"+fileID+",3,filterString,\"\",GeneticCodeExclusions);");
+			ExecuteCommands ("DataSetFilter felFilter = CreateFilter (ds_"+fileID+",3,filterString,\"\",GeneticCodeExclusions);");
+
+			HarvestFrequencies (f1, siteFilter, 3, 3, 0);
+			m1 = +(f1["_MATRIX_ELEMENT_VALUE_>0"]); // how many unique characters?
+			
+			if (lfSpawnDone == 0)
+			{
+				LikelihoodFunction siteLikelihood = (siteFilter, siteTree);	
+				LikelihoodFunction felLikelihood  = (felFilter, felTree);	
+				lfSpawnDone = 1;
+			}
+
+
+			if (m1>1)
+			{
+				toDoList ["FEL_" + siteCount] = {{siteCount__,siteMap__,siteCount__+vOffset__,2}}; // 2 in the 2nd column means FEL
+			}
+			else
+			{
+				doneSites[siteMap][4] = 1;											
+			}
+			
+		}
+		
+	}
+	
+	if (debugVerboseFlag)
+	{
+		fprintf (stdout, toDoList);
+	}   
+
+	while (SendJobMEME ()) 
+	{
+	
+	}
+					
+	vOffset 	= vOffset  + thisFilterSize;
+	vuOffset 	= vuOffset + thisFilterSizeU;
+}
+
+		
+vOffset  = 0;
+vuOffset = 0;
+
+alreadyDone = {totalUniqueSites,1};
+
+posSelected = 0;
+qValues = {totalCodonCount,2};
+
+codon_labels = {};
+
+for (siteCount = 0; siteCount < totalCodonCount; siteCount += 1){
+    qValues [siteCount][0] = siteCount;
+    qValues [siteCount][1] = fullSites[siteCount][6];
+    codon_labels + (siteCount+1);
+}
+
+qValues = qValues % 1;
+
+
+for (siteCount = 0; siteCount < totalCodonCount; siteCount += 1){
+    qValues [siteCount][1] = Min(1,qValues [siteCount][1] * (totalCodonCount) / (1+siteCount));
+}
+
+qValues = qValues % 0;
+
+for (siteCount = 0; siteCount < totalCodonCount; siteCount += 1){
+    fullSites[siteCount][8] = qValues[siteCount][1];			 
+}
+
+fprintf (stdout, "\nMEME analysis done\n");
+
+fprintf (stdout, "\n\n",
+"Codon |     Beta- |   Weight- |    Beta+  |   Weight+ |     alpha |      LRT  |   p-value |Full Log(L)|   q-value\n");
+
+
+for (fileID = 1; fileID <= fileCount; fileID = fileID+1)
+{
+	ExecuteCommands ("GetDataInfo  (dupInfo, filteredData_"+fileID+");");			
+	ExecuteCommands ("thisFilterSize  = filteredData_"+fileID+".sites;");			
+	ExecuteCommands ("thisFilterSizeU = filteredData_"+fileID+".unique_sites;");			
+	for (siteCount = 0; siteCount < thisFilterSize; siteCount = siteCount+1)
+	{
+		siteMap 	= dupInfo[siteCount];
+		ReportSiteMEME (siteCount+vOffset, siteMap+vuOffset, 0);	
+		if (fullSites[siteCount+vOffset][6] < =_in_dNdSPValue && fullSites[siteCount+vOffset][2]>fullSites[siteCount+vOffset][4]) {
+			posSelected += 1;
+		}
+	}
+	vOffset 	= vOffset  + thisFilterSize;
+	vuOffset 	= vuOffset + thisFilterSizeU;
+}
+
+
+_csv_result_labels = {{"Codon","beta1","weight1","beta2","weight2","alpha","LRT","pvalue","LogL","qvalue"}};
+
+SetDialogPrompt ("Save .csv file to");
+WriteSeparatedTable ("", _csv_result_labels, fullSites, codon_labels, ",");
+
+tree_results = LAST_FILE_PATH + ".branches";
+
+fprintf (tree_results, CLEAR_FILE, "Tree,Site,Branch,PosteriorProbability,EmpiricalBayesFactor,SynSubs,NonsynSubs");
+
+vOffset  = 0;
+vuOffset = 0;
+
+for (fileID = 1; fileID <= fileCount; fileID = fileID+1)
+{
+	ExecuteCommands ("GetDataInfo  (dupInfo, filteredData_"+fileID+");");			
+	ExecuteCommands ("thisFilterSize  = filteredData_"+fileID+".sites;");			
+	ExecuteCommands ("thisFilterSizeU = filteredData_"+fileID+".unique_sites;");			
+	for (siteCount = 0; siteCount < thisFilterSize; siteCount += 1)
+	{
+		siteMap =  dupInfo[siteCount]+vuOffset;
+        if (Abs (bySiteBranchReports [siteMap])) {
+                bNames = Rows (bySiteBranchReports [siteMap]);
+                for (branchCount = 0; branchCount < Columns(bNames); branchCount += 1) {
+                    fprintf (tree_results, "\n", fileID, ",", vOffset + siteCount+1, ",", bNames[branchCount], ",", Join (",",(bySiteBranchReports [siteMap])[bNames[branchCount]]));
+                }
+            }		
+	}
+	vOffset 	+= thisFilterSize;
+	vuOffset 	+= thisFilterSizeU;
+}
+
+fprintf (tree_results, CLOSE_FILE);
+
+/*------------------------------------------------------------------------*/
+
+function ReportSiteMEME (siteI, siteM, doEstimatedTime)
+{
+    // labels       = {{"beta1","beta2","weight1","weight2","alpha","LRT","p-value","Full Log(L)"}};
+	fullSites[siteI][0] = doneSites[siteM][0];   // beta1
+	fullSites[siteI][1] = doneSites[siteM][2];   // q1
+	fullSites[siteI][2] = doneSites[siteM][1];   // beta2
+	fullSites[siteI][3] = 1-doneSites[siteM][2]; // q2
+	fullSites[siteI][4] = doneSites[siteM][7];   // alpha
+	fullSites[siteI][5] = doneSites[siteM][3];   // LRT
+	fullSites[siteI][6] = doneSites[siteM][4];   // p-value
+	fullSites[siteI][7] = doneSites[siteM][5];   // Log L
+	
+	// index 8 is a q-value
+
+
+	/*fprintf (stdout, "| Codon: ", 		Format(siteI+1,4,0),
+					 "| Beta1: ", 		Format(fullSites[siteI][0],10,2),
+					 "| P(Beta1): ", 	Format(fullSites[siteI][2],5,2),
+					 "| Beta2: ", 		Format(fullSites[siteI][1],10,2),
+					 "| P(Beta2): ",	Format(fullSites[siteI][3],5,2),
+					 "| alpha: ",		Format(fullSites[siteI][4],10,2),
+					 "| LRT: ",			Format(fullSites[siteI][5],6,2),
+					 "| p: ",			Format(fullSites[siteI][6],5,2),		
+					 "| Log(L): ",		Format(fullSites[siteI][7],5,2));*/		
+
+	fprintf (stdout, "|", Format (siteI+1, 6,0));
+	for (mxI = 0; mxI < Columns (labels); mxI += 1) {
+		fprintf (stdout, " | ",Format(fullSites[siteI][mxI],8,2)," ");
+	}
+
+    if (doEstimatedTime) {
+	    fprintf (stdout, " | ",Format ((Time(1) - MEME_RUN_TIMER+1)*((totalUniqueSites-finishedPatterns+1)/(1+finishedPatterns)),10,1));
+	} else {
+		fprintf (stdout, " | ",Format(fullSites[siteI][8],8,2)," ");	
+	}
+	if (fullSites[siteI][6]<_in_dNdSPValue && fullSites[siteI][2]>fullSites[siteI][4]){
+		fprintf (stdout, " *P");		
+	}
+	fprintf (stdout, "\n");	
+	
+	return 0;
+}
+
+/*------------------------------------------------------------------------*/
+
+function fakeMPIReturnFromLF (lfID, res) {
+    ExecuteCommands ("GetString(lfInfo,`lfID`,-1)");
+    _fakeMPIAVL = {"VALUES" : {}};
+    _fakeMPIAVL["MLES"] = res;
+    avlKeys = {{"Local Independent","Global Independent"}};
+    for (_kID = 0; _kID < Columns (avlKeys); _kID += 1) {
+        key = avlKeys[_kID];    
+        for (_vID = 0; _vID < Columns (lfInfo[key]); _vID += 1) {
+            _vName = (lfInfo[key])[_vID];
+            (_fakeMPIAVL["VALUES"])[_vName] = Eval (_vName);
+        }
+    }
+    return _fakeMPIAVL;
+}
+
+/*------------------------------------------------------------------------*/
+
+function ReceiveJobsMEME ()
+{
+    if (haz_MPI) {
+	    MPIReceive (-1, fromNode, result_String);
+	} else {
+	    fromNode = 1;
+	}
+	
+	siteIndex 		= MPINodeState[fromNode-1][1];
+	siteNAF	  		= MPINodeState[fromNode-1][2];
+	siteIndexMap	= MPINodeState[fromNode-1][3];
+	siteFilterMap   = MPINodeState[fromNode-1][4];
+	
+ 	timesPerSite [siteIndexMap][siteNAF] = Time(1)-timesPerSite [siteIndexMap][siteNAF];
+
+    MPINodeState[fromNode-1][0] = 0;
+    MPINodeState[fromNode-1][1] = -1;		
+	
+	
+	
+    if (siteNAF == 1)
+	{	
+	    res                                 = Eval (result_String);
+	    siteLikelihood_MLES                 = res["MLES"];
+	    siteLikelihood_MLE_VALUES           = res["VALUES"];
+	    bySiteBranchReports [siteIndexMap]  = res["BRANCHES"];
+	}
+	else
+	{
+	    if (haz_MPI) {
+	        ExecuteCommands (result_String);
+	    } else {
+            res                                 = Eval (result_String);
+	        if (siteNAF < 2) {
+                siteLikelihood_MLES                 = res["MLES"];
+                siteLikelihood_MLE_VALUES           = res["VALUES"];
+	        } else {
+                felLikelihood_MLES                 = res["MLES"];
+                felLikelihood_MLE_VALUES           = res["VALUES"];
+	        
+	        }
+	    }
+	}
+		
+    if (siteNAF < 2)
+    {
+        nsf1V   = siteLikelihood_MLE_VALUES ["nsFactor1"];
+        nsf2V   = siteLikelihood_MLE_VALUES ["nsFactor2"];
+        omega2F = siteLikelihood_MLE_VALUES ["omega2"];
+
+        mixingF = siteLikelihood_MLE_VALUES ["mixingP"];
+        sFValue = siteLikelihood_MLE_VALUES ["sFactor"];
+    }
+    else
+    {
+        nsf2V   = felLikelihood_MLE_VALUES ["nsFactor2"];
+        sFValue = felLikelihood_MLE_VALUES ["sFactor"];
+    }
+	
+	if (siteNAF == 1) // alternative
+	{
+        doneSites[siteIndexMap][0] = nsf1V*sFValue;
+        doneSites[siteIndexMap][1] = nsf2V;
+        doneSites[siteIndexMap][2] = mixingF;
+        doneSites[siteIndexMap][6] = 1-mixingF;                                        
+        doneSites[siteIndexMap][7] = sFValue;
+		
+		doneSites[siteIndexMap][3] = doneSites[siteIndexMap][3]+2*siteLikelihood_MLES[1][0];
+		doneSites[siteIndexMap][5] = siteLikelihood_MLES[1][0];
+        
+        bySiteCache[siteIndexMap][0] = sFValue;
+        bySiteCache[siteIndexMap][1] = nsf1V;
+        bySiteCache[siteIndexMap][2] = mixingF;
+        
+        if (debugVerboseFlag)
+        {
+            fprintf (stdout, "[DEBUG: Received MEME alternative fit of site ", siteIndex, " from node ", fromNode, "]");
+            fprintf (stdout, "\n\talpha  = ", doneSites[siteIndexMap][7],
+                             "\n\tbeta1  = ", doneSites[siteIndexMap][0],
+                             "\n\tbeta2  = ", doneSites[siteIndexMap][1],
+                             "\n\tmixing = ", doneSites[siteIndexMap][2],
+                             "\n");
+        }
+
+
+       if (nsf2V > sFValue)
+        {
+            toDoList["MEME_NULL_" + siteIndex] = {{siteFilterMap__,siteIndexMap__,siteIndex__,0}};
+            if (debugVerboseFlag)
+            {
+                fprintf (stdout, "[DEBUG: Added null model fit for site ", siteIndex, " to the queue]\n");
+            }       
+        }
+        else
+        {
+			finishedPatterns 		  += 1;
+            doneSites[siteIndexMap][3] = 0;
+            doneSites[siteIndexMap][4] = -1;
+        }
+	}
+	else 
+    {
+        if (siteNAF == 2) // FEL
+        {
+            bySiteCache[siteIndexMap][0] = sFValue;
+            bySiteCache[siteIndexMap][1] = nsf2V;
+            toDoList ["MEME_ALT_" + siteIndex] = {{siteFilterMap__,siteIndexMap__,siteIndex__,1}};
+            if (debugVerboseFlag)
+            {
+                fprintf (stdout, "[DEBUG: Received FEL fit of site ", siteIndex, " from node ", fromNode, "]");
+                fprintf (stdout, "\n\talpha  = ", sFValue,
+                                 "\n\tbeta  = ", nsf2V,
+                                 "\n");
+            }
+            
+        }
+        else // null
+        {
+            doneSites[siteIndexMap][3] = doneSites[siteIndexMap][3]-2*siteLikelihood_MLES[1][0];	
+			finishedPatterns 		  += 1;
+            if (debugVerboseFlag)
+            {
+                fprintf (stdout, "[DEBUG: Received MEME NULL fit of site ", siteIndex, " from node ", fromNode, "]");
+                fprintf (stdout, "\n\talpha  = ",  sFValue,
+                                 "\n\tbeta1  = ",  nsf1V,
+                                 "\n\tomega2  = ", omega2F,
+                                 "\n\tmixing = ",  mixingF,
+                                 "\n");
+            }
+        }
+    }
+
+    if (siteNAF < 2)
+    {
+        if (doneSites[siteIndexMap][4] == 0)
+        {
+            doneSites[siteIndexMap][4] = -1;
+        }
+        else
+        {
+            if (doneSites[siteIndexMap][4] == (-1))
+            {
+                doneSites[siteIndexMap][4] = 0.67-0.67*(0.45*CChi2(doneSites[siteIndexMap][3],1)+0.55*CChi2(doneSites[siteIndexMap][3],2));						
+                ReportSiteMEME (siteIndex, siteIndexMap,1);
+            }
+        }
+    }
+	
+	return fromNode-1;
+}
+/*------------------------------------------------------------------------*/
+
+function SendJobMEME ()
+{
+    for (mpiNode = 0; mpiNode < Max(1,MPI_NODE_COUNT-1); mpiNode += 1) {
+        if (MPINodeState[mpiNode][0]==0)
+        {
+            break;	
+        }
+    }
+    
+    if (mpiNode == Max(1,MPI_NODE_COUNT-1)) {
+        mpiNode = ReceiveJobsMEME ();
+    }
+    
+    lastKey = Abs(toDoList);
+    
+    if (lastKey > 0)
+    {
+        lastKey  = toDoList ["INDEXORDER"][0];
+        theJob   = toDoList [lastKey];
+        toDoList - lastKey;
+
+        filterString = "" + (theJob[0]*3) + "-" + (theJob[0]*3+2);
+		ExecuteCommands ("DataSetFilter siteFilter = CreateFilter (ds_"+fileID+",3,filterString,\"\",GeneticCodeExclusions);");
+		ExecuteCommands ("DataSetFilter felFilter = CreateFilter (ds_"+fileID+",3,filterString,\"\",GeneticCodeExclusions);");
+        
+        if (theJob[3] == 2)
+        {
+            sFactor   = 1;
+            ClearConstraints (nsFactor2);
+            nsFactor2 :> 0;
+            nsFactor2 = dNdS;
+            OPTIMIZATION_METHOD = 0;
+            
+            if (haz_MPI) {
+                MPISend (mpiNode+1, felLikelihood);
+            } else {
+                Optimize (res, felLikelihood);
+                result_String = ""+fakeMPIReturnFromLF ("felLikelihood", res);
+            }
+            if (debugVerboseFlag) {
+                fprintf (stdout, "[DEBUG: Sending FEL fit of site ", theJob[0], " to node ", mpiNode+1, "]\n");
+            }
+        }
+        else
+        {
+            if (theJob[3] == 1)
+            {
+                sFactor   = bySiteCache[theJob[1]][0];
+                ClearConstraints (nsFactor2);
+                nsFactor2 :> 0;
+                nsFactor2 = bySiteCache[theJob[1]][1];
+                if (nsFactor2 > sFactor)
+                {
+                    nsFactor1    = 1;
+                    mixingP      = 0.25;
+                }
+                else
+                {
+                    nsFactor1    = nsFactor2/sFactor;
+                    if (nsFactor2 == 0)
+                    {
+                        nsFactor2    = sFactor*0.5;
+                        mixingP      = 0.05;
+                    }
+                    else
+                    {
+                        nsFactor2    = sFactor*1.5;
+                        mixingP      = 0.75;
+                    }
+                }
+                OPTIMIZATION_METHOD = 0;
+                if (haz_MPI) {
+                    LF_NEXUS_EXPORT_EXTRA = "fileID = " + fileID + ";siteID = " + theJob[0] + "; jobSuffix = \".alt\";" + _memeExtra;
+                    MPISend (mpiNode+1, siteLikelihood);
+                    LF_NEXUS_EXPORT_EXTRA = "";
+                } else {
+                    Optimize (res, siteLikelihood);
+                    result_String = fakeMPIReturnFromLF ("siteLikelihood", res);
+                    result_String ["BRANCHES"] = obtainBranchWiseEBEstimates (sFactor, nsFactor1, nsFactor2, mixingP,filterString);
+                    result_String = "" + result_String;
+                }
+                if (debugVerboseFlag)
+                {
+                    fprintf (stdout, "[DEBUG: Sending MEME fit of site ", theJob[0], " to node ", mpiNode+1, "]");
+                    fprintf (stdout, "\n\talpha  = ", sFactor,
+                                     "\n\tbeta1  = ", nsFactor1*sFactor,
+                                     "\n\tbeta2  = ", nsFactor2, 
+                                     "\n\tmixing = ", mixingP,
+                                     "\n");
+                }
+            }
+            else
+            {
+                sFactor      = bySiteCache[theJob[1]][0];
+                nsFactor1    = bySiteCache[theJob[1]][1];
+                mixingP      = bySiteCache[theJob[1]][2];
+                omega2       = 1;
+                nsFactor2    := omega2 * sFactor;
+                if (sFactor == 0) {
+                    sFactor = 0.001;
+                }
+                OPTIMIZATION_METHOD = 0;
+                if (haz_MPI) {
+                    LF_NEXUS_EXPORT_EXTRA = "fileID = " + fileID + ";siteID = " + theJob[0] + "; jobSuffix = \".null\";" + _memeExtraNull;
+                    MPISend (mpiNode+1, siteLikelihood);
+                    LF_NEXUS_EXPORT_EXTRA = "";
+                } else {
+                    Optimize (res, siteLikelihood);
+                    result_String = "" + fakeMPIReturnFromLF ("siteLikelihood", res);
+                }
+                if (debugVerboseFlag)
+                {
+                    fprintf (stdout, "[DEBUG: Sending MEME NULL fit of site ", theJob[0], " to node ", mpiNode+1, "]");
+                    fprintf (stdout, "\n\talpha  = ", sFactor,
+                                     "\n\tbeta1  = ", nsFactor1*sFactor,
+                                     "\n\tbeta2  = ", nsFactor2, 
+                                     "\n\tmixing = ", mixingP,
+                                     "\n");
+                }
+            }
+        }
+
+		timesPerSite [theJob[1]][1] = Time(1);
+
+ 		MPINodeState[mpiNode][0] = 1;
+		MPINodeState[mpiNode][1] = theJob[2];		
+		MPINodeState[mpiNode][2] = theJob[3];		
+		MPINodeState[mpiNode][3] = theJob[1];		
+        MPINodeState[mpiNode][4] = theJob[0];
+        
+        /*if (debugVerboseFlag)
+        {
+            fprintf (fileOut, CLEAR_FILE, MPI_LAST_SENT_MSG);
+        }*/
+    }
+    else
+    {
+        if (+(MPINodeState [-1][0]))
+        {
+            ReceiveJobsMEME();
+        }
+    }
+    
+    return +(MPINodeState [-1][0]) || Abs(toDoList);
+}
+
+// ------------------------------------------------------------------------------------
+// ------ MEME helper function --------------------------------------------------------
+
+function obtainBranchWiseEBEstimatesMPI (_sFactor,_nsFactor1,_nsFactor2,_mixingP) {
+        if (_nsFactor2 <= _sFactor || _mixingP == 1 || _mixingP == 0)
+        {
+            return {};
+        }
+        
+        sFactor   = _sFactor;
+        nsFactor1 = _nsFactor1;
+        nsFactor2 = _nsFactor2;
+        mixingP   = _mixingP;
+        
+        treeString = Format (siteTree,1,1);
+        
+        LoadFunctionLibrary ("AncestralMapper");
+        ancID = _buildAncestralCache ("siteLikelihood",0);
+        subMap = _tabulateSubstitutionsAtSiteByBranch (ancID,0);
+        _destroyAncestralCache (ancID);
+
+        Model 		MGLocalMix		=		  ("Exp(MGMatrix1)*lmp+Exp(MGMatrix2)*(1-lmp)",codonFrequencies,EXPLICIT_FORM_MATRIX_EXPONENTIAL);
+        Tree        perBranchTree 			= treeString;
+        ClearConstraints    (perBranchTree);
+        ReplicateConstraint ("this1.?.alpha:=this2.?.alpha__",perBranchTree,siteTree);
+        ReplicateConstraint ("this1.?.beta1:=this2.?.beta1__",perBranchTree,siteTree);
+        ReplicateConstraint ("this1.?.beta2:=this2.?.beta2__",perBranchTree,siteTree);
+        ReplicateConstraint ("this1.?.lmp:=_mixingP", perBranchTree);
+        
+        _bn = BranchName (perBranchTree, -1);
+        
+		LikelihoodFunction siteLikelihoodLoc = (siteFilter, perBranchTree);
+        LFCompute (siteLikelihoodLoc,LF_START_COMPUTE);
+        LFCompute (siteLikelihoodLoc,baseline);
+        
+        _totalBranchCount  = Columns (_bn) - 1;
+        posteriorEstimates = {};
+        
+        _priorOdds = (1-_mixingP)/_mixingP;
+        
+        for (k = 0; k < _totalBranchCount; k+=1)
+        {
+             _pname = "perBranchTree." + _bn[k] + ".lmp";
+            ExecuteCommands ("`_pname`=1");
+            LFCompute (siteLikelihoodLoc,LOGL0);
+            
+            MaxL     = -Max (LOGL0,baseline);
+            
+            baseline += MaxL;
+            LOGL0 = Exp(MaxL+LOGL0);
+            LOGL1 = (Exp(baseline) - _mixingP * LOGL0) / (1-_mixingP);
+            
+            ExecuteCommands ("`_pname`=_mixingP");
+            _posteriorProb = {{LOGL0 * _mixingP, LOGL1 * (1-_mixingP)}};
+            _posteriorProb = _posteriorProb * (1/(+_posteriorProb));
+            if ( _priorOdds != 0) {
+                eBF = _posteriorProb[1] / (1 - _posteriorProb[1]) / _priorOdds;
+            } else {
+                eBF = 1;
+            }
+            posteriorEstimates [_bn[k]] = {1,4};
+            (posteriorEstimates [_bn[k]])[0] = _posteriorProb[1];
+            (posteriorEstimates [_bn[k]])[1] = eBF;
+            (posteriorEstimates [_bn[k]])[2] = (subMap[_bn[k]])[0];
+            (posteriorEstimates [_bn[k]])[3] = (subMap[_bn[k]])[1];
+            baseline += -MaxL;
+        } 
+        
+        LFCompute (siteLikelihoodLoc,LF_DONE_COMPUTE);
+        
+         
+        return posteriorEstimates;
+}
+
+// ------ MEME helper function --------
+
+function obtainBranchWiseEBEstimates (_sFactor,_nsFactor1,_nsFactor2, _mixingP,filterString) {
+
+        ClearConstraints    (perBranchTree);
+        ReplicateConstraint ("this1.?.alpha:=_sFactor*this2.?.synRate__",perBranchTree,codonTree);
+        ReplicateConstraint ("this1.?.beta1:=_nsFactor1*sFactor*this2.?.synRate__",perBranchTree,codonTree);
+        ReplicateConstraint ("this1.?.beta2:=_nsFactor2*this2.?.synRate__",perBranchTree,codonTree);
+        ReplicateConstraint ("this1.?.lmp:=_mixingP", perBranchTree);
+        
+        
+        LoadFunctionLibrary ("AncestralMapper");
+        ancID = _buildAncestralCache ("siteLikelihood",0);
+        subMap = _tabulateSubstitutionsAtSiteByBranch (ancID,0);
+        _destroyAncestralCache (ancID);
+
+       _bn = BranchName (perBranchTree, -1);
+        
+        DataSetFilter locSiteFilter = CreateFilter (ds,3,filterString,"",GeneticCodeExclusions);
+        
+		LikelihoodFunction siteLikelihoodLoc = (locSiteFilter, perBranchTree);
+        LFCompute (siteLikelihoodLoc,LF_START_COMPUTE);
+        LFCompute (siteLikelihoodLoc,baseline);
+        
+        _totalBranchCount  = Columns (_bn) - 1;
+        posteriorEstimates = {};
+        
+        if (_mixingP != 1 && _mixingP != 0) {
+            _priorOdds = (1-_mixingP)/_mixingP;
+        } else {
+            _priorOdds = 0;
+        }
+        
+        for (k = 0; k < _totalBranchCount; k+=1)
+        {
+             _pname = "perBranchTree." + _bn[k] + ".lmp";
+            ExecuteCommands ("`_pname`=1");
+            LFCompute (siteLikelihoodLoc,LOGL0);
+            
+            MaxL     = -Max (LOGL0,baseline);
+            
+            baseline += MaxL;
+            LOGL0 = Exp(MaxL+LOGL0);
+            LOGL1 = (Exp(baseline) - _mixingP * LOGL0) / (1-_mixingP);
+            
+            ExecuteCommands ("`_pname`=_mixingP");
+            _posteriorProb = {{LOGL0 * _mixingP, LOGL1 * (1-_mixingP)}};
+            _posteriorProb = _posteriorProb * (1/(+_posteriorProb));
+            if ( _priorOdds != 0) {
+                eBF = _posteriorProb[1] / (1 - _posteriorProb[1]) / _priorOdds;
+            } else {
+                eBF = 1;
+            }
+            posteriorEstimates [_bn[k]] = {1,4};
+            (posteriorEstimates [_bn[k]])[0] = _posteriorProb[1];
+            (posteriorEstimates [_bn[k]])[1] = eBF;
+            (posteriorEstimates [_bn[k]])[2] = (subMap[_bn[k]])[0];
+            (posteriorEstimates [_bn[k]])[3] = (subMap[_bn[k]])[1];
+            baseline += -MaxL;
+        } 
+        LFCompute (siteLikelihoodLoc,LF_DONE_COMPUTE);
+        
+        return posteriorEstimates;
+}
diff --git a/res/TemplateBatchFiles/MFPSreader.def b/res/TemplateBatchFiles/MFPSreader.def
new file mode 100644
index 0000000..8de03c1
--- /dev/null
+++ b/res/TemplateBatchFiles/MFPSreader.def
@@ -0,0 +1,103 @@
+SetDialogPrompt ("Please select the file with subset lengths:");
+
+errorHeader = "\n\n************ ERROR **************\n";
+
+fscanf (PROMPT_FOR_FILE,"Number",thisLine);
+
+counter = 0;
+
+while (1)
+{
+	if (END_OF_FILE)
+	{
+		break;
+	}
+	fscanf (LAST_FILE_PATH,"Number",thisLine);
+	if (thisLine>0)
+	{
+		counter = counter+1;
+	}
+}
+
+if (counter==0)
+{
+	fprintf (stdout, errorHeader, "At least 1 data subset must be present in the index file.\n");
+	return;
+}
+
+fprintf (stdout,"\n>There are ",counter, " subsets specified in the index file.\n\n");
+
+partitionLengths = {counter,1};
+partitionTrees = {counter,1};
+
+counter = 0;
+expectedTipCounter = 0;
+
+fscanf (LAST_FILE_PATH,"Number",thisLine);
+
+while (1)
+{
+	if (END_OF_FILE)
+	{
+		break;
+	}
+	if (thisLine>0)
+	{
+		partitionLengths[counter] = thisLine;
+		expectedTipCounter = expectedTipCounter+thisLine;
+		counter = counter+1;
+		fprintf (stdout,"\tSubset ",counter, " has ", thisLine, " sequences.\n");	
+	}
+	fscanf (LAST_FILE_PATH,"Number",thisLine);
+}
+
+SetDialogPrompt ("Please select a codon data file:");
+
+DataSet 		ds = ReadDataFile (PROMPT_FOR_FILE);
+
+DataSetFilter   filteredData = CreateFilter (ds,3,"","",GeneticCodeExclusions);
+
+if (ds.species!=expectedTipCounter)
+{
+	fprintf (stdout, errorHeader, "The number of expected and actual sequences do not match (Read ",ds.species," sequences; expected ",expectedTipCounter, " sequences).");
+	return;
+}
+
+fprintf (stdout, "\n\n>Data\n\n",ds);
+
+SetDialogPrompt ("Please select the file with trees:");
+
+thisLine = "subsetTree0";
+fscanf (PROMPT_FOR_FILE,"Tree",thisLine&);
+PATHTOTREEFILE = LAST_FILE_PATH;
+counter = 1;
+
+fprintf (stdout, "\n\n>Trees\n\n");
+
+while (1)
+{
+	if (END_OF_FILE)
+	{
+		break;
+	}
+	fprintf(stdout,"\n\tTree ",counter," ", thisLine&);
+	ExecuteCommands ("partitionTrees[counter-1]:=\"\"+"+thisLine+";");
+	ExecuteCommands ("tipCount = tipCount+TipCount("+thisLine+");");
+	thisLine = "subsetTree"+counter;
+	fscanf (LAST_FILE_PATH,"Tree",thisLine&);
+	counter = counter+1;
+}
+
+if (counter-1!=Rows(partitionLengths))
+{
+	fprintf (stdout, errorHeader, "The number of trees and data subsets do not match (Read ",counter-1," trees).");
+	return;
+}
+
+if (tipCount!=expectedTipCounter)
+{
+	fprintf (stdout, errorHeader, "The total number of trees leaves and sequences do not match (Read ",tipCount," leaves and ",expectedTipCounter, " sequences).");
+	return;
+}
+
+numberOfSubsets = Rows (partitionLengths);
diff --git a/res/TemplateBatchFiles/MFPositiveSelection.bf b/res/TemplateBatchFiles/MFPositiveSelection.bf
new file mode 100644
index 0000000..f092bf1
--- /dev/null
+++ b/res/TemplateBatchFiles/MFPositiveSelection.bf
@@ -0,0 +1,1113 @@
+ModelNames = {{"Neutral",
+	  		  "Selection",
+			  "Discrete",
+			  "Freqs",
+			  "Gamma",
+			  "2 Gamma",
+			  "Beta",
+			  "Beta & w",
+			  "Beta & Gamma",
+			  "Beta & (Gamma+1)",
+			  "Beta & (Normal>1)",
+			  "0 & 2 (Normal>1)",
+			  "3 Normal",
+			  "RE: Lognormal",
+			  "RE: Gamma",
+			  "RE: Discrete"}};
+			  
+ParameterCount = {{0,
+	  		  	   1,
+			  	   3,
+			  	   4,
+			  	   2,
+			  	   4,
+			       2,
+			  	   4,
+			  	   5,
+			       5,
+			  	   5,
+			       5,
+			       6,
+			       1,
+			       2,
+			       4
+			       }};
+			       
+MAXIMUM_ITERATIONS_PER_VARIABLE = 2000;
+OPTIMIZATION_PRECISION = 0.001;
+			  
+function SetWDistribution (resp)
+{
+	if (rateType == 0)
+	{
+		global P = .5;
+		P:<1;
+		categFreqMatrix = {{P,1-P}};
+		categRateMatrix = {{0,1}};
+		category c = (2, categFreqMatrix , MEAN, ,categRateMatrix, 0, 1e25);
+	}
+	else
+	{
+		if (rateType == 1)
+		{
+			global P1 = 1/3;
+			global P2 = 0;
+			
+			P1:<1;
+			P2:<1;
+			
+			global W = 1;
+			categFreqMatrix = {{P1,(1-P1)*P2, (1-P1)*(1-P2)}} ;
+			categRateMatrix = {{0,1,W}};
+			category c = (3, categFreqMatrix , MEAN, ,categRateMatrix, 0, 1e25);
+		}		
+		else
+		{
+			if (rateType == 2)
+			{
+				global P1 = 1/3;
+				global P2 = .5;
+				P1:<1;
+				P2:<1;
+				global W1 = .25;
+				global R1 = 4;
+				global R2 = 3;
+				R1:>1;
+				R2:>1;
+				categFreqMatrix = {{P1,(1-P1)*P2, (1-P1)*(1-P2)}} ;
+				categRateMatrix = {{W1,W1*R1,W1*R1*R2}};
+				category c = (3, categFreqMatrix , MEAN, ,categRateMatrix, 0, 1e25);				
+			}
+			else
+			{
+				if (rateType == 3)
+				{
+					global P1 = 1/5;
+					global P2 = 1/4;
+					global P3 = 1/3;
+					global P4 = 1/2;
+					
+					P1:<1;
+					P2:<1;
+					P3:<1;
+					P4:<1;
+					
+					categFreqMatrix = {{P1,
+										(1-P1)P2,
+										(1-P1)(1-P2)*P3,
+										(1-P1)(1-P2)(1-P3)P4,
+										(1-P1)(1-P2)(1-P3)(1-P4)}} ;
+					categRateMatrix = {{0,1/3,2/3,1,3}};
+					category c = (5, categFreqMatrix , MEAN, ,categRateMatrix, 0, 1e25);				
+				}
+				else
+				{
+					if (rateType == 4)
+					{
+						global alpha = .5;
+						global beta = 1;
+						alpha:>0.01;alpha:<100;
+						beta:>0.01;
+						beta:<200;
+						category c = (resp, EQUAL, MEAN, GammaDist(_x_,alpha,beta), CGammaDist(_x_,alpha,beta), 0 , 
+				 			 		  1e25,CGammaDist(_x_,alpha+1,beta)*alpha/beta);
+					}
+					else
+					{
+						if (rateType == 5)
+						{
+							global alpha = .5;
+							global beta  =  1;
+							global alpha2=  .75;
+							global P	 = .5; 
+							alpha:>0.01;alpha:<100;
+							beta:>0.01;
+							beta:<200;
+							P:<1;
+							alpha2:>0.01;alpha2:<100;
+							category c = (resp, EQUAL, MEAN, P*GammaDist(_x_,alpha,beta) + (1-P)*GammaDist(_x_,alpha2,alpha2)
+														   , P*CGammaDist(_x_,alpha,beta) + (1-P)*CGammaDist(_x_,alpha2,alpha2), 
+														   0 , 1e25,
+														   P*CGammaDist(_x_,alpha+1,beta)*alpha/beta + (1-P)*CGammaDist(_x_,alpha2+1,alpha2));
+						}
+						else
+						{
+							if (rateType == 6)
+							{
+								global betaP = 1;
+								global betaQ = 1;
+								betaP:>0.05;betaP:<85;
+								betaQ:>0.05;betaQ:<85;
+								category c = (resp, EQUAL, MEAN, _x_^(betaP-1)*(1-_x_)^(betaQ-1)/Beta(betaP,betaQ), IBeta(_x_,betaP,betaQ), 0 , 
+						 			 		  1,IBeta(_x_,betaP+1,betaQ)*betaP/(betaP+betaQ));
+							}
+							else
+							{
+								if (rateType == 7)
+								{
+									global W = 2;
+									/*W:>1;*/
+									global P	 = 1-1/(resp+1);
+									global betaP = 1;
+									global betaQ = 2;
+									betaP:>0.05;
+									betaQ:>0.05;
+									betaP:<85;
+									betaQ:<85;
+									P:>0.0000001;
+									P:<0.9999999;
+									categFreqMatrix = {resp+1,1};
+									for (k=0; k<resp; k=k+1)
+									{
+										categFreqMatrix[k]:=P/resp__;
+									}
+									categFreqMatrix[resp]:=(1-P);
+									category c = (resp+1, categFreqMatrix, MEAN, 
+													P*_x_^(betaP-1)*(1-Min(_x_,1))^(betaQ-1)/Beta(betaP,betaQ)+W-W, 
+													P*IBeta(Min(_x_,1),betaP,betaQ)+(1-P)*(_x_>=W), 
+													0,1e25,
+													P*IBeta(Min(_x_,1),betaP+1,betaQ)*betaP/(betaP+betaQ)+(1-P)*W*(_x_>=W));
+								}
+								else
+								{
+									if (rateType == 8)
+									{
+										global P	 = .5;
+										global betaP = 1;
+										global betaQ = 2;
+										betaP:>0.05;betaP:<85;
+										betaQ:>0.05;betaQ:<85;
+										global alpha = .5;
+										global beta  = 1;
+										alpha:>0.01;alpha:<100;
+										beta:>0.01;										
+										beta:<200;
+										P:<1;
+										category c = (resp, EQUAL, MEAN, 
+															P*_x_^(betaP-1)*(1-Min(_x_,1))^(betaQ-1)/Beta(betaP,betaQ)+(1-P)*GammaDist(_x_,alpha,beta), 
+															P*IBeta(Min(_x_,1),betaP,betaQ)+(1-P)*CGammaDist(_x_,alpha,beta), 
+															0,1e25,
+															P*betaP/(betaP+betaQ)*IBeta(Min(_x_,1),betaP+1,betaQ)+(1-P)*alpha/beta*CGammaDist(_x_,alpha+1,beta));
+									}	
+									else
+									{
+										if (rateType == 9)
+										{
+											global P	 = .5;
+											P:<1;
+											global betaP = 1;
+											betaP:>0.05;betaP:<85;
+											global betaQ = 2;
+											betaQ:>0.05;betaQ:<85;
+											global alpha = .5;
+											alpha:>0.01;alpha:<100;
+											global beta  = 1;
+											beta:>0.01;beta:<500;
+											category c = (resp, EQUAL, MEAN, 
+																P*_x_^(betaP-1)*(1-Min(_x_,1))^(betaQ-1)/Beta(betaP,betaQ)+(1-P)*(_x_>1)*GammaDist(Max(1e-20,_x_-1),alpha,beta), 
+																P*IBeta(Min(_x_,1),betaP,betaQ)+(1-P)*CGammaDist(Max(_x_-1,0),alpha,beta), 
+																0,1e25,
+																P*betaP/(betaP+betaQ)*IBeta(Min(_x_,1),betaP+1,betaQ)+
+																		(1-P)*(alpha/beta*CGammaDist(Max(0,_x_-1),alpha+1,beta)+CGammaDist(Max(0,_x_-1),alpha,beta)));
+										}				
+										else
+										{
+											if (rateType == 10)
+											{
+												global P	 = .5;
+												global betaP = 1;
+												global betaQ = 2;
+												betaP:>0.05;
+												betaQ:>0.05;
+												betaP:<85;
+												betaQ:<85;
+												global mu = 3;
+												global sigma  = .01;
+												sigma:>0.0001;
+												sqrt2pi = Sqrt(8*Arctan(1));
+												P:<1;
+
+												category c = (resp, EQUAL, MEAN, 
+																P*_x_^(betaP-1)*(1-Min(_x_,1))^(betaQ-1)/Beta(betaP,betaQ)+
+																	(1-P)*(_x_>=1)*Exp(-(_x_-mu)(_x_-mu)/(2*sigma*sigma))/(sqrt2pi__*sigma)/ZCDF((mu-1)/sigma), 
+																P*IBeta(Min(_x_,1),betaP,betaQ)+(1-P)*(_x_>=1)*(1-ZCDF((mu-_x_)/sigma)/ZCDF((mu-1)/sigma)), 
+																0,1e25,
+																P*betaP/(betaP+betaQ)*IBeta(Min(_x_,1),betaP+1,betaQ)+
+																(1-P)*(_x_>=1)*(mu*(1-ZCDF((1-mu)/sigma)-ZCDF((mu-_x_)/sigma))+
+																sigma*(Exp((mu-1)(1-mu)/(2*sigma*sigma))-Exp((_x_-mu)(mu-_x_)/(2*sigma*sigma)))/sqrt2pi__)/ZCDF((mu-1)/sigma));
+											}				
+											else
+											{
+												if (rateType == 11)
+												{
+													global P	 = 1/3;
+													global P1    = .5;
+
+													global mu = 3;
+													global sigma  = .5;
+													sigma:>0.0001;
+													global sigma1  = 1;
+													sigma1:>0.0001;
+
+													sqrt2pi = Sqrt(8*Arctan(1));
+													P:<1;
+													P1:<1;
+													
+													categFreqMatrix = {resp+1,1};
+													for (k=1; k<=resp; k=k+1)
+													{
+														categFreqMatrix[k]:=(1-P)/resp__;
+													}
+													categFreqMatrix[0]:=P;
+
+													category c = (resp+1, categFreqMatrix, MEAN,
+																	(1-P)((1-P1)*Exp(-(_x_-mu)(_x_-mu)/(2*sigma1*sigma1))/(sqrt2pi__*sigma1)/ZCDF(mu/sigma1)+
+																			  P1*Exp(-(_x_-1)(_x_-1)/(2*sigma*sigma))/(sqrt2pi__*sigma)/ZCDF(1/sigma)), 
+																	P+(1-P)(_x_>1e-20)((1-P1)(1-ZCDF((mu-_x_)/sigma1)/ZCDF(mu/sigma1))+
+																						P1*(1-ZCDF((1-_x_)/sigma)/ZCDF(1/sigma))), 
+																	0,1e25,
+																	(1-P)((1-P1)(mu*(1-ZCDF(-mu/sigma1)-ZCDF((mu-_x_)/sigma1))+
+																	sigma1*(Exp(-mu*mu/(2*sigma1*sigma1))-Exp((_x_-mu)(mu-_x_)/(2*sigma1*sigma1)))/sqrt2pi__)/ZCDF(mu/sigma1)+
+																	P(1-ZCDF(-1/sigma)-ZCDF((1-_x_)/sigma)+
+																	sigma*(Exp(-1/(2*sigma*sigma))-Exp((_x_-1)(1-_x_)/(2*sigma*sigma)))/sqrt2pi__)/ZCDF(1/sigma))
+																 );
+												}
+												else		
+												{
+													if (rateType == 12)
+													{
+														global P	 = 1/3;
+														global P1    = .5;
+
+														global mu = 3;
+														global sigma  = .25;
+														global sigma1 = .5;
+														global sigma2 = 1;
+														sigma:>0.0001;
+														sigma1:>0.0001;
+														sigma2:>0.0001;
+
+														sqrt2pi = Sqrt(8*Arctan(1));
+														P:<1;
+														P1:<1;
+
+														category c = (resp, EQUAL , MEAN,
+																		2*P*Exp(-_x_^2/(2*sigma*sigma))+
+																		(1-P)((1-P1)*Exp((_x_-mu)(mu-_x_)/(2*sigma2*sigma2))/(sqrt2pi__*sigma2)/ZCDF(mu/sigma2)+
+																			  P1*Exp((1-_x_)(_x_-1)/(2*sigma1*sigma1))/(sqrt2pi__*sigma1)/ZCDF(1/sigma1)), 
+																		P*(1-2*ZCDF(-_x_/sigma))+
+																		(1-P)((1-P1)(1-ZCDF((mu-_x_)/sigma2)/ZCDF(mu/sigma2))+
+																			   P1*(1-ZCDF((1-_x_)/sigma1)/ZCDF(1/sigma1))), 
+																		0,1e25,
+																		2*P*sigma*(1-Exp(-_x_*_x_/(2*sigma*sigma)))/sqrt2pi__+
+																		(1-P)((1-P1)(mu*(1-ZCDF(-mu/sigma2)-ZCDF((mu-_x_)/sigma2))+
+																		sigma2*(Exp(-mu*mu/(2*sigma2*sigma2))-Exp((_x_-mu)(mu-_x_)/(2*sigma2*sigma2)))/sqrt2pi__)/ZCDF(mu/sigma2)+
+																		P1(1-ZCDF(-1/sigma1)-ZCDF((1-_x_)/sigma1)+
+																		sigma1*(Exp(-1/(2*sigma1*sigma1))-Exp((_x_-1)(1-_x_)/(2*sigma1*sigma1)))/sqrt2pi__)/ZCDF(mu/sigma1))
+																		);
+													}	
+													else
+													{
+														if (rateType == 13)
+														{
+																global sigma = .1;
+																sigma:>0.0001;sigma:<10;
+																sqrt2pi = Sqrt(8*Arctan(1));
+																global _x_:<1e200;
+																category c = (resp, EQUAL, MEAN, 
+																				Exp (-Log(_x_)*Log(_x_) / (2*sigma*sigma)) / (_x_*sigma*sqrt2pi__), /*density*/
+																				ZCDF (Log(_x_)/sigma), /*CDF*/
+																				1e-200, 			   /*left bound*/
+																				1e200, 			       /*right bound*/
+																		  	    Exp (.5*sigma^2)*ZCDF (Log(_x_)/sigma-sigma),
+																		  	    CONSTANT_ON_PARTITION
+																		  	 );														
+														}
+														else
+														{
+															if (rateType == 14)
+															{
+																global alpha = .5;
+																global beta = 1;
+																alpha:>0.01;alpha:<100;
+																beta:>0.01;
+																beta:<200;
+																category c = (resp, EQUAL, MEAN, GammaDist(_x_,alpha,beta), CGammaDist(_x_,alpha,beta), 0 , 
+														 			 		  1e25,CGammaDist(_x_,alpha+1,beta)*alpha/beta,CONSTANT_ON_PARTITION);
+															}
+															else
+															{
+																global P1 = 1/3;
+																global P2 = .5;
+																P1:<1;
+																P2:<1;
+																global W1 = .25;
+																global R1 = 4;
+																global R2 = 3;
+																R1:>1;
+																R2:>1;
+																categFreqMatrix = {{P1,(1-P1)*P2, (1-P1)*(1-P2)}} ;
+																categRateMatrix = {{W1,W1*R1,W1*R1*R2}};
+																category c = (3, categFreqMatrix , MEAN, ,categRateMatrix, 0, 1e25, ,CONSTANT_ON_PARTITION);				
+															}
+														}
+													}
+												}				
+											}				
+										}				
+									}						
+								}
+							}
+						}
+					}				
+				}	
+			}	
+		}	
+	}		
+	return 0;
+}
+
+/* ____________________________________________________________________________________________________________________*/
+
+function FrameText (frameChar,vertChar,parOff,theText)
+{
+	h = Abs (theText)+4;
+	fprintf (stdout,"\n");	
+	for (k=0; k<parOff; k=k+1)
+	{
+		fprintf (stdout," ");
+	}
+	for (k=0; k<h;k=k+1)
+	{
+		fprintf (stdout,frameChar);
+	}
+	fprintf (stdout,"\n");	
+	for (k=0; k<parOff; k=k+1)
+	{
+		fprintf (stdout," ");
+	}
+	fprintf (stdout,vertChar," ",theText," ",vertChar,"\n");
+	for (k=0; k<parOff; k=k+1)
+	{
+		fprintf (stdout," ");
+	}
+	for (k=0; k<h;k=k+1)
+	{
+		fprintf (stdout,frameChar);
+	}
+	fprintf (stdout,"\n");	
+	return 0;
+}
+
+/* ____________________________________________________________________________________________________________________*/
+
+function BuildCodonFrequencies4 (obsF)
+{
+	PIStop = 1.0;
+	result = {ModelMatrixDimension,1};
+	hshift = 0;
+
+	for (h=0; h<64; h=h+1)
+	{
+		first = h$16;
+		second = h%16$4;
+		third = h%4;
+		if (_Genetic_Code[h]==10) 
+		{
+			hshift = hshift+1;
+			PIStop = PIStop-obsF[first][0]*obsF[second][0]*obsF[third][0];
+			continue; 
+		}
+		result[h-hshift][0]=obsF[first][0]*obsF[second][0]*obsF[third][0];
+	}
+	return result*(1.0/PIStop);
+}
+
+/* ____________________________________________________________________________________________________________________*/
+
+function BuildCodonFrequencies12 (obsF)
+{
+	PIStop = 1.0;
+	result = {ModelMatrixDimension,1};
+	hshift = 0;
+
+	for (h=0; h<64; h=h+1)
+	{
+		first = h$16;
+		second = h%16$4;
+		third = h%4;
+		if (_Genetic_Code[h]==10) 
+		{
+			hshift = hshift+1;
+			PIStop = PIStop-obsF[first][0]*obsF[second][1]*obsF[third][2];
+			continue; 
+		}
+		result[h-hshift][0]=obsF[first][0]*obsF[second][1]*obsF[third][2];
+	}
+	return result*(1.0/PIStop);
+}
+/* ____________________________________________________________________________________________________________________*/
+
+
+function GetDistributionParameters (sigLevel)
+{
+	GetInformation (distrInfo,c);
+	D = Columns(distrInfo);
+	E = 0.0;
+	T = 0.0;
+	sampleVar = 0.0;
+	for (k=0; k<D; k=k+1)
+	{
+		T = distrInfo[0][k]*distrInfo[1][k];
+		E = E+T;
+		sampleVar = T*distrInfo[0][k]+sampleVar;
+	}
+	sampleVar = sampleVar-E*E;
+	fprintf  (LAST_FILE_PATH,"\n\n------------------------------------------------\n\ndN/dS = ",E, " (sample variance = ",sampleVar,")\n");
+	for (k=0; k<D; k=k+1)
+	{
+		fprintf (LAST_FILE_PATH,"\nRate[",Format(k+1,0,0),"]=",
+				 Format(distrInfo[0][k],12,8), " (weight=", Format(distrInfo[1][k],9,7),")");
+	}
+	
+	for (k=0; k<D; k=k+1)
+	{
+		if (distrInfo[0][k]>1) break;
+	}
+	if (k<D)
+	/* have rates > 1 */
+	{
+		ConstructCategoryMatrix(marginals,lf,COMPLETE);
+		
+		CC = Columns (marginals);
+		if (rateType>=13)
+		/* subset rate variation */
+		{
+			CC  = CC/numberOfSubsets;
+			
+			subsetMarginals = {D,numberOfSubsets};
+			for (v=0; v<numberOfSubsets; v=v+1)
+			{
+				for (l=0; l<D; l=l+1)
+				{
+					for (h=0; h<CC; h=h+1)
+					{
+						subsetMarginals[l][v] = subsetMarginals[l][v] + marginals[l][v*CC+h];
+					}
+				}
+			}
+			marginals = subsetMarginals;
+			subsetMarginals = 0;
+			fprintf  (LAST_FILE_PATH,"\n\n------------------------------------------------\n\n Subsets with dN/dS>1 (Posterior cutoff = ",sigLevel,")\n\n");
+			for (v=0; v<numberOfSubsets; v=v+1)
+			{
+				sampleVar = 0;
+				for (h=0; h<D; h=h+1)
+				{
+					sampleVar = sampleVar+distrInfo[1][h]*marginals[h][v];
+				}
+				positiveProb = 0;
+				for (l=k; l<D; l=l+1)
+				{
+					positiveProb = positiveProb+distrInfo[1][l]*marginals[l][v];
+				}
+				positiveProb = positiveProb/sampleVar;
+				marginals[0][v] = positiveProb;
+				if (positiveProb>=sigLevel)
+				{
+					fprintf (LAST_FILE_PATH,Format (v+1,0,0)," (",positiveProb,")\n");
+				}
+			}
+			fprintf  (LAST_FILE_PATH,"\n\n------------------------------------------------\n\n Subsets with dN/dS<=1 (Posterior cutoff = ",sigLevel,")\n\n");
+			for (v=0; v<numberOfSubsets; v=v+1)
+			{
+				if (marginals[0][v]<sigLevel)
+				{
+					fprintf (LAST_FILE_PATH,Format (v+1,0,0)," (",marginals[0][v],")\n");
+				}
+			}
+		}
+		else
+		{
+			fprintf  (LAST_FILE_PATH,"\n\n------------------------------------------------\n\n Sites with dN/dS>1 (Posterior cutoff = ",sigLevel,")\n\n");
+			for (v=0; v<CC; v=v+1)
+			{
+				sampleVar = 0;
+				for (h=0; h<D; h=h+1)
+				{
+					sampleVar = sampleVar+distrInfo[1][h]*marginals[h][v];
+				}
+				positiveProb = 0;
+				for (l=k; l<D; l=l+1)
+				{
+					positiveProb = positiveProb+distrInfo[1][l]*marginals[l][v];
+				}
+				positiveProb = positiveProb/sampleVar;
+				marginals[0][v] = positiveProb;
+				if (positiveProb>=sigLevel)
+				{
+					fprintf (LAST_FILE_PATH,Format (v+1,0,0)," (",positiveProb,")\n");
+				}
+			}
+			fprintf  (LAST_FILE_PATH,"\n\n------------------------------------------------\n\n Sites with dN/dS<=1 (Posterior cutoff = ",sigLevel,")\n\n");
+			for (v=0; v<CC; v=v+1)
+			{
+				if (marginals[0][v]<sigLevel)
+				{
+					fprintf (LAST_FILE_PATH,Format (v+1,0,0)," (",marginals[0][v],")\n");
+				}
+			}
+		}
+		marginals = 0;
+	}
+	else
+	{
+		fprintf  (LAST_FILE_PATH,"\n\n------------------------------------------------\n\n No rate classes with dN/dS>1.");
+	}
+	fprintf  (LAST_FILE_PATH,"\n\n------------------------------------------------\n\n");
+	return E;
+}
+
+/* ____________________________________________________________________________________________________________________*/
+
+function PopulateModelMatrix (ModelMatrixName&, EFV)
+{
+	ModelMatrixName = {ModelMatrixDimension,ModelMatrixDimension}; 
+
+	hshift = 0;
+	
+	if (modelType==0)
+	{
+		for (h=0; h<64; h=h+1)
+		{
+			if (_Genetic_Code[h]==10) 
+			{
+				hshift = hshift+1;
+				continue; 
+			}
+			vshift = hshift;
+			for (v = h+1; v<64; v=v+1)
+			{
+				diff = v-h;
+				if (_Genetic_Code[v]==10) 
+				{
+					vshift = vshift+1;
+					continue; 
+				}
+			  	if ((h$4==v$4)||((diff%4==0)&&(h$16==v$16))||(diff%16==0))
+			  	{
+			  		if (h$4==v$4)
+			  		{
+			  			transition = v%4;
+			  			transition2= h%4;
+			  		}
+			  		else
+			  		{
+			  			if(diff%16==0)
+			  			{
+			  				transition = v$16;
+			  				transition2= h$16;
+			  			}
+			  			else
+			  			{
+			  				transition = v%16$4;
+			  				transition2= h%16$4;
+			  			}
+			  		}
+			  		if (_Genetic_Code[0][h]==_Genetic_Code[0][v]) 
+			  		{
+			  			ModelMatrixName[h-hshift][v-vshift] := t*EFV__[transition__];
+			  			ModelMatrixName[v-vshift][h-hshift] := t*EFV__[transition2__];
+				  	}
+			  		else
+			  		{
+				  		ModelMatrixName[h-hshift][v-vshift] := c*t*EFV__[transition__];
+			  			ModelMatrixName[v-vshift][h-hshift] := c*t*EFV__[transition2__];
+		  			}
+			  	}
+			  }
+		}
+	}
+	else
+	{
+		if (modelType==1)
+		{
+			for (h=0; h<64; h=h+1)
+			{
+				if (_Genetic_Code[h]==10) 
+				{
+					hshift = hshift+1;
+					continue; 
+				}
+				vshift = hshift;
+				for (v = h+1; v<64; v=v+1)
+				{
+					diff = v-h;
+					if (_Genetic_Code[v]==10) 
+					{
+						vshift = vshift+1;
+						continue; 
+					}
+					nucPosInCodon = 2;
+				  	if ((h$4==v$4)||((diff%4==0)&&(h$16==v$16))||(diff%16==0))
+				  	{
+				  		if (h$4==v$4)
+				  		{
+				  			transition = v%4;
+				  			transition2= h%4;
+				  		}
+				  		else
+				  		{
+				  			if(diff%16==0)
+				  			{
+				  				transition = v$16;
+				  				transition2= h$16;
+								nucPosInCodon = 0;
+				  			}
+				  			else
+				  			{
+				  				transition = v%16$4;
+				  				transition2= h%16$4;
+								nucPosInCodon = 1;
+				  			}
+				  		}
+				  		if (_Genetic_Code[0][h]==_Genetic_Code[0][v]) 
+				  		{
+				  			ModelMatrixName[h-hshift][v-vshift] := t*EFV__[transition__][nucPosInCodon__];
+				  			ModelMatrixName[v-vshift][h-hshift] := t*EFV__[transition2__][nucPosInCodon__];
+					  	}
+				  		else
+				  		{
+					  		ModelMatrixName[h-hshift][v-vshift] := c*t*EFV__[transition__][nucPosInCodon__];
+				  			ModelMatrixName[v-vshift][h-hshift] := c*t*EFV__[transition2__][nucPosInCodon__];
+			  			}
+				  	}
+				  }
+			}
+		}
+		else
+		{
+			for (h=0; h<64; h=h+1)
+			{
+				if (_Genetic_Code[h]==10) 
+				{
+					hshift = hshift+1;
+					continue; 
+				}
+				vshift = hshift;
+				for (v = h+1; v<64; v=v+1)
+				{
+					diff = v-h;
+					if (_Genetic_Code[v]==10) 
+					{
+						vshift = vshift+1;
+						continue; 
+					}
+				  	if ((h$4==v$4)||((diff%4==0)&&(h$16==v$16))||(diff%16==0))
+				  	{
+				  		if (h$4==v$4)
+				  		{
+				  			transition = v%4;
+				  			transition2= h%4;
+				  		}
+				  		else
+				  		{
+				  			if(diff%16==0)
+				  			{
+				  				transition = v$16;
+				  				transition2= h$16;
+				  			}
+				  			else
+				  			{
+				  				transition = v%16$4;
+				  				transition2= h%16$4;
+				  			}
+				  		}
+				  		if (_Genetic_Code[0][h]==_Genetic_Code[0][v]) 
+				  		{
+				  			if (Abs(transition-transition2)%2)
+				  			{
+				  				ModelMatrixName[h-hshift][v-vshift] := kappa*t;
+				  				ModelMatrixName[v-vshift][h-hshift] := kappa*t;
+				  			}
+				  			else
+				  			{
+				  				ModelMatrixName[h-hshift][v-vshift] := t;
+				  				ModelMatrixName[v-vshift][h-hshift] := t;
+				  			}
+				  			
+					  	}
+				  		else
+				  		{
+				  			if (Abs(transition-transition2)%2)
+				  			{
+				  				ModelMatrixName[h-hshift][v-vshift] := kappa*c*t;
+				  				ModelMatrixName[v-vshift][h-hshift] := kappa*c*t;
+				  			}
+				  			else
+				  			{
+				  				ModelMatrixName[h-hshift][v-vshift] := c*t;
+				  				ModelMatrixName[v-vshift][h-hshift] := c*t;
+				  			}
+					  	}
+				  	}	
+				 }
+			}	
+		}
+	 }
+	 return (modelType>1);
+}
+
+/* ____________________________________________________________________________________________________________________*/
+
+function PopulateModelMatrix2 (ModelMatrixName&, EFV)
+{
+	ModelMatrixName = {ModelMatrixDimension,ModelMatrixDimension}; 
+
+	hshift = 0;
+	
+	for (h=0; h<64; h=h+1)
+	{
+		if (_Genetic_Code[h]==10) 
+		{
+			hshift = hshift+1;
+			continue; 
+		}
+		vshift = hshift;
+		for (v = h+1; v<64; v=v+1)
+		{
+			diff = v-h;
+			if (_Genetic_Code[v]==10) 
+			{
+				vshift = vshift+1;
+				continue; 
+			}
+		  	if ((h$4==v$4)||((diff%4==0)&&(h$16==v$16))||(diff%16==0))
+		  	{
+		  		if (h$4==v$4)
+		  		{
+		  			transition = v%4;
+		  			transition2= h%4;
+		  		}
+		  		else
+		  		{
+		  			if(diff%16==0)
+		  			{
+		  				transition = v$16;
+		  				transition2= h$16;
+		  			}
+		  			else
+		  			{
+		  				transition = v%16$4;
+		  				transition2= h%16$4;
+		  			}
+		  		}
+		  		if (_Genetic_Code[0][h]==_Genetic_Code[0][v]) 
+		  		{
+		  			if (Abs(transition-transition2)%2)
+		  			{
+		  				ExecuteCommands ("ModelMatrixName[h-hshift][v-vshift] := kappa"+l+"*t;ModelMatrixName[v-vshift][h-hshift] := kappa"+l+"*t;");
+		  			}
+		  			else
+		  			{
+		  				ModelMatrixName[h-hshift][v-vshift] := t;
+		  				ModelMatrixName[v-vshift][h-hshift] := t;
+		  			}
+		  			
+			  	}
+		  		else
+		  		{
+		  			if (Abs(transition-transition2)%2)
+		  			{
+		  				ExecuteCommands ("ModelMatrixName[h-hshift][v-vshift] := c*kappa"+l+"*t;ModelMatrixName[v-vshift][h-hshift] := c*kappa"+l+"*t;");
+		  			}
+		  			else
+		  			{
+		  				ModelMatrixName[h-hshift][v-vshift] := c*t;
+		  				ModelMatrixName[v-vshift][h-hshift] := c*t;
+		  			}
+			  	}
+		  	}	
+		 }
+	}	
+	return 1;
+}
+/* ____________________________________________________________________________________________________________________*/
+
+function spawnLikelihood (kappaSharedOrNot)
+{
+	if (kappaSharedOrNot)
+	{
+		for (l=0; l<numberOfSubsets;l=l+1)
+		{
+			if (modelType<=1)
+			{
+				ExecuteCommands ("modelMatrix"+l+" = 0;MULTIPLY_BY_FREQS = PopulateModelMatrix (\"modelMatrix"+l+"\", observedFreq"+l+");");
+			}
+			else
+			{
+				ExecuteCommands ("modelMatrix"+l+" = 0;MULTIPLY_BY_FREQS = PopulateModelMatrix2 (\"modelMatrix"+l+"\", observedFreq"+l+");");
+			}			
+			ExecuteCommands ("Model theModel"+l+" = (modelMatrix"+l+",vectorOfFrequencies"+l+",MULTIPLY_BY_FREQS);");
+			partitionTreeString=partitionTrees[l];
+			ExecuteCommands ("Tree subsetTree"+l+"=partitionTreeString;");
+		}	
+	}
+	else
+	{
+		MULTIPLY_BY_FREQS = PopulateModelMatrix ("modelMatrix", observedFreq);
+		Model theModel = (modelMatrix,vectorOfFrequencies,MULTIPLY_BY_FREQS);
+		for (v=0; v<numberOfSubsets;v=v+1)
+		{
+			partitionTreeString=partitionTrees[v];
+			ExecuteCommands ("Tree subsetTree"+v+"=partitionTreeString;");
+		}
+	}
+	lfSpawnString = "LikelihoodFunction lf = (";
+	for (v=0; v<numberOfSubsets;v=v+1)
+	{
+		if (v)
+		{
+			lfSpawnString = lfSpawnString+",";
+		}
+		lfSpawnString = lfSpawnString+"subsetFilter"+v+",subsetTree"+v;
+	}
+	lfSpawnString = lfSpawnString+");";
+	ExecuteCommands (lfSpawnString);
+	return 0;
+}
+
+
+/* ____________________________________________________________________________________________________________________*/
+
+NICETY_LEVEL = 3;
+
+#include "TemplateModels/chooseGeneticCode.def";
+
+ModelMatrixDimension = 64;
+for (h = 0 ;h<64; h=h+1)
+{
+	if (_Genetic_Code[h]==10)
+	{
+		ModelMatrixDimension = ModelMatrixDimension-1;
+	}
+}
+
+#include "MFPSreader.def";
+
+/* now spawn the dataset filters */
+
+
+lowerSeqBound = 0;
+for (modelType=0; modelType<numberOfSubsets; modelType = modelType+1)
+{
+	ExecuteCommands ("DataSetFilter   subsetFilter"+modelType+"= CreateFilter (ds,3,\"\",(speciesIndex>=lowerSeqBound)&&(speciesIndex<lowerSeqBound+partitionLengths[modelType]),GeneticCodeExclusions);");
+	lowerSeqBound = lowerSeqBound+partitionLengths[modelType];
+}
+
+chosenModelList = {17,1};
+
+ChoiceList (modelType,"Distributions",1,SKIP_NONE,
+			"Run All","Run all available dN/dS distributions",
+			"Run Custom","Choose from available dN/dS distributions.");
+			
+if (modelType<0)
+{
+	return;
+}
+
+if (modelType==0)
+{
+	for (rateType = 0; rateType<17; rateType=rateType+1)
+	{
+		chosenModelList[rateType][0] = 1;
+	}
+}
+else
+{
+	ChoiceList (modelTypes,"Distributions",0,SKIP_NONE,
+				"Single Rate","Single Rate",
+				"Neutral","Neutral",
+	  			"Selection","Selection",
+			    "Discrete","Discrete",
+			    "Freqs","Freqs",
+			    "Gamma","Gamma",
+			    "2 Gamma","2 Gamma",
+			    "Beta","Beta",
+			    "Beta & w","Beta & w",
+			    "Beta & Gamma","Beta & Gamma",
+			    "Beta & (Gamma+1)","Beta & (Gamma+1)",
+			    "Beta & (Normal>1)","Beta & (Normal>1)",
+			    "0 & 2 (Normal>1)","0 & 2 (Normal>1)",
+			    "3 Normal","3 Normal",
+			    "RE:Log normal","Random Effects: Log normal",
+			    "RE:Gamma","Random Effects: Gamma",
+			    "RE:Discrete","Random Effects: 3 bin Discrete");
+			    
+	if (modelTypes[0]<0)
+	{
+		return;
+	}
+	for (rateType = 0; rateType < Rows(modelTypes)*Columns(modelTypes); rateType = rateType + 1)
+	{
+		modelType = modelTypes[rateType];
+		chosenModelList[modelType] = 1;
+	}
+}
+
+ChoiceList (shareType,"Choose parameter sharing mode",1,SKIP_NONE,
+			"All","Share dN/dS, transversion/transition ratio (if applicable) and base frequencies for all subsets.",
+			"dN/dS Only","Share only dN/dS. Transversion/transition ratio (if applicable) and base frequencies are separate for each subset."
+);
+
+if (shareType<0)
+{
+	return;
+}
+
+ChoiceList (modelType,"Choose a model",1,SKIP_NONE,
+			"MG94 1x4","Muse-Gaut 94 model with 4(-1) nucleotide frequency parameters (intra-codon position independent).",
+			"MG94 3x4","Muse-Gaut 94 model with 12(-3) nucleotide frequency parameters (intra-codon position specific).",
+			"GY94 1x4","Goldman-Yang 94 model with 4(-1) nucleotide frequency parameters (intra-codon position independent).",
+			"GY94 3x4","Goldman-Yang 94 model with 12(-3) nucleotide frequency parameters (intra-codon position specific)."
+);
+
+if (modelType<0)
+{
+	return;
+}
+
+if ((modelType==0)||(modelType==2))
+{
+	if (shareType==0)
+	{
+		HarvestFrequencies (observedFreq,filteredData,1,1,0);
+		vectorOfFrequencies = BuildCodonFrequencies4 (observedFreq);
+	}
+	else
+	{
+		for (v=0; v<numberOfSubsets;v=v+1)
+		{
+			ExecuteCommands ("global kappa"+v+"=2.;HarvestFrequencies (observedFreq"+v+",subsetFilter"+v+",1,1,0);vectorOfFrequencies"+v+"= BuildCodonFrequencies4 (observedFreq"+v+");");
+		}		
+	}
+}
+else
+{
+	if (shareType==0)
+	{
+		HarvestFrequencies (observedFreq,filteredData,3,1,1);
+		vectorOfFrequencies = BuildCodonFrequencies12 (observedFreq);
+	}
+	else
+	{
+		for (v=0; v<numberOfSubsets;v=v+1)
+		{
+			ExecuteCommands ("global kappa"+v+"=2.;HarvestFrequencies (observedFreq"+v+",subsetFilter"+v+",3,1,1);vectorOfFrequencies"+v+"= BuildCodonFrequencies12 (observedFreq"+v+");");
+		}		
+	}
+}
+
+if (modelType>1)
+{	
+	global kappa = 2.;
+}
+
+fprintf (stdout, "\n\n\nChoose the cutoff (0 to 1) for posterior of dN/dS>1 for a site to be considered under selective pressure:");
+fscanf  (stdin, "Number",psigLevel);
+if ((psigLevel <= 0)||(psigLevel>1))
+{
+	psigLevel = .95;
+}
+fprintf (stdout, "\n>Using ", psigLevel , " cutoff\n");
+
+fprintf (stdout, "\nChoose the number of categories in discretized distributions:");
+fscanf  (stdin, "Number",categCount);
+categCount = categCount$1;
+if (categCount<=0)
+{
+	categCount = 8;
+}
+
+fprintf (stdout, "\n>Using ", Format (categCount,0,0), " categories.\n");
+
+SetDialogPrompt ("Write detailed results to:");
+
+fprintf (PROMPT_FOR_FILE,CLEAR_FILE);
+
+global c = 1.;
+
+dummyVar = FrameText ("-","|",2,"SUMMARY TABLE");
+tableSeparator =  "+-------------------------+----------------+---------------+-----+\n";
+fprintf (stdout, "\n\"p\" is the number of parameters in addition to the branch lengths.\nDetailed results including sites with dN/dS>1 will be written to\n",LAST_FILE_PATH,"\n\n");
+fprintf (stdout, tableSeparator,
+				 "| MODEL (Number & Desc)   | Log likelihood | 	   dN/dS     |  p  |\n",
+				 tableSeparator);
+				 
+cachedBranchLengths = {{-1,-1}};
+				 
+if (chosenModelList[0]>0)
+{
+	timer = Time(1);
+	fprintf (LAST_FILE_PATH,"\n*** RUNNING SINGLE RATE MODEL ***\n#################################\n");
+	dummy = spawnLikelihood (shareType);
+	Optimize (res,lf);
+	fprintf (LAST_FILE_PATH,"\n>Done in ", Time(1)-timer, " seconds \n\n");
+	fprintf (LAST_FILE_PATH,lf,"\n\n-----------------------------------\n\ndN/dS = ",c,"\n\n");
+
+	fprintf (stdout, "|  0. Single Rate Model   | ",Format (res[1][0],14,6)," | ",Format (c,13,8)," |  0  |\n",
+					 tableSeparator);
+					 
+	timer = res[1][1]-res[1][2];
+	cachedBranchLengths = {timer,1};
+	
+	for (rateType = timer; rateType < Columns(cachedBranchLengths); rateType = rateType+1)
+	{
+		cachedBranchLengths[rateType-timer][0] = res [0][rateType];
+	}
+}
+
+for (rateType = 0; rateType < 16; rateType = rateType + 1)
+{
+	if (chosenModelList[rateType+1]==0)
+	{
+		continue;
+	}
+	timer = Time(1);
+	dummy = SetWDistribution (categCount);
+	dummy = spawnLikelihood (shareType);
+	
+	fprintf (LAST_FILE_PATH,"\n*** RUNNING MODEL ", Format(rateType+1,0,0), " (",ModelNames[rateType],") ***\n######################################\n");
+	/*if (cachedBranchLengths[0][0]>=0.0)
+	{
+		v = ParameterCount[rateType];
+		if (modelType>1)
+		{
+			v=v+1;
+		}
+		for (h=0; h<Rows(cachedBranchLengths); h=h+1)
+		{
+			SetParameter (lf,h+v,cachedBranchLengths[h][0]);
+		}
+	}*/
+	Optimize (res,lf);
+	fprintf (LAST_FILE_PATH,"\n>Done in ",Time(1)-timer, " seconds \n\n", lf);
+	fprintf (stdout, "| ");
+	if (rateType<9)
+	{
+		fprintf (stdout," ");
+	}
+	fprintf (stdout, Format (rateType+1,0,0), ". ", ModelNames[rateType]);
+	for (dummy = Abs(ModelNames[rateType])+5; dummy<25; dummy = dummy+1)
+	{
+		fprintf (stdout," ");
+	}
+	dummy = GetDistributionParameters(psigLevel);
+	fprintf (stdout,"| ",Format (res[1][0],14,6)," | ",Format (dummy,13,8)," |  ",
+						 Format(ParameterCount[rateType],0,0),"  |\n",tableSeparator);
+
+	if (modelType>1)
+	{	
+		kappa = 2.;
+	}
+}
diff --git a/res/TemplateBatchFiles/MFPositiveSelectionPooled.bf b/res/TemplateBatchFiles/MFPositiveSelectionPooled.bf
new file mode 100644
index 0000000..997d33f
--- /dev/null
+++ b/res/TemplateBatchFiles/MFPositiveSelectionPooled.bf
@@ -0,0 +1,876 @@
+ModelNames = {{"Neutral",
+	  		  "Selection",
+			  "Discrete",
+			  "Freqs",
+			  "Gamma",
+			  "2 Gamma",
+			  "Beta",
+			  "Beta & w",
+			  "Beta & Gamma",
+			  "Beta & (Gamma+1)",
+			  "Beta & (Normal>1)",
+			  "0 & 2 (Normal>1)",
+			  "3 Normal"}};
+			  
+ParameterCount = {{0,
+	  		  	   1,
+			  	   3,
+			  	   4,
+			  	   2,
+			  	   4,
+			       2,
+			  	   4,
+			  	   5,
+			       5,
+			  	   5,
+			       5,
+			       6}};
+			       
+MAXIMUM_ITERATIONS_PER_VARIABLE = 2000;
+OPTIMIZATION_PRECISION = 0.001;
+			  
+function SetWDistribution (resp)
+{
+	if (rateType == 0)
+	{
+		global P = .5;
+		P:<1;
+		categFreqMatrix = {{P,1-P}};
+		categRateMatrix = {{0,1}};
+		category c = (2, categFreqMatrix , MEAN, ,categRateMatrix, 0, 1e25);
+	}
+	else
+	{
+		if (rateType == 1)
+		{
+			global P1 = 1/3;
+			global P2 = 0;
+			
+			P1:<1;
+			P2:<1;
+			
+			global W = 1;
+			categFreqMatrix = {{P1,(1-P1)*P2, (1-P1)*(1-P2)}} ;
+			categRateMatrix = {{0,1,W}};
+			category c = (3, categFreqMatrix , MEAN, ,categRateMatrix, 0, 1e25);
+		}		
+		else
+		{
+			if (rateType == 2)
+			{
+				global P1 = 1/3;
+				global P2 = .5;
+				P1:<1;
+				P2:<1;
+				global W1 = .25;
+				global R1 = 4;
+				global R2 = 3;
+				R1:>1;
+				R2:>1;
+				categFreqMatrix = {{P1,(1-P1)*P2, (1-P1)*(1-P2)}} ;
+				categRateMatrix = {{W1,W1*R1,W1*R1*R2}};
+				category c = (3, categFreqMatrix , MEAN, ,categRateMatrix, 0, 1e25);				
+			}
+			else
+			{
+				if (rateType == 3)
+				{
+					global P1 = 1/5;
+					global P2 = 1/4;
+					global P3 = 1/3;
+					global P4 = 1/2;
+					
+					P1:<1;
+					P2:<1;
+					P3:<1;
+					P4:<1;
+					
+					categFreqMatrix = {{P1,
+										(1-P1)P2,
+										(1-P1)(1-P2)*P3,
+										(1-P1)(1-P2)(1-P3)P4,
+										(1-P1)(1-P2)(1-P3)(1-P4)}} ;
+					categRateMatrix = {{0,1/3,2/3,1,3}};
+					category c = (5, categFreqMatrix , MEAN, ,categRateMatrix, 0, 1e25);				
+				}
+				else
+				{
+					if (rateType == 4)
+					{
+						global alpha = .5;
+						global beta = 1;
+						alpha:>0.01;alpha:<100;
+						beta:>0.01;
+						beta:<200;
+						category c = (resp, EQUAL, MEAN, GammaDist(_x_,alpha,beta), CGammaDist(_x_,alpha,beta), 0 , 
+				 			 		  1e25,CGammaDist(_x_,alpha+1,beta)*alpha/beta);
+					}
+					else
+					{
+						if (rateType == 5)
+						{
+							global alpha = .5;
+							global beta  =  1;
+							global alpha2=  .75;
+							global P	 = .5; 
+							alpha:>0.01;alpha:<100;
+							beta:>0.01;
+							beta:<200;
+							P:<1;
+							alpha2:>0.01;alpha2:<100;
+							category c = (resp, EQUAL, MEAN, P*GammaDist(_x_,alpha,beta) + (1-P)*GammaDist(_x_,alpha2,alpha2)
+														   , P*CGammaDist(_x_,alpha,beta) + (1-P)*CGammaDist(_x_,alpha2,alpha2), 
+														   0 , 1e25,
+														   P*CGammaDist(_x_,alpha+1,beta)*alpha/beta + (1-P)*CGammaDist(_x_,alpha2+1,alpha2));
+						}
+						else
+						{
+							if (rateType == 6)
+							{
+								global betaP = 1;
+								global betaQ = 1;
+								betaP:>0.05;betaP:<85;
+								betaQ:>0.05;betaQ:<85;
+								category c = (resp, EQUAL, MEAN, _x_^(betaP-1)*(1-_x_)^(betaQ-1)/Beta(betaP,betaQ), IBeta(_x_,betaP,betaQ), 0 , 
+						 			 		  1,IBeta(_x_,betaP+1,betaQ)*betaP/(betaP+betaQ));
+							}
+							else
+							{
+								if (rateType == 7)
+								{
+									global W = 2;
+									/*W:>1;*/
+									global P	 = 1-1/(resp+1);
+									global betaP = 1;
+									global betaQ = 2;
+									betaP:>0.05;
+									betaQ:>0.05;
+									betaP:<85;
+									betaQ:<85;
+									P:>0.0000001;
+									P:<0.9999999;
+									categFreqMatrix = {resp+1,1};
+									for (k=0; k<resp; k=k+1)
+									{
+										categFreqMatrix[k]:=P/resp__;
+									}
+									categFreqMatrix[resp]:=(1-P);
+									category c = (resp+1, categFreqMatrix, MEAN, 
+													P*_x_^(betaP-1)*(1-Min(_x_,1))^(betaQ-1)/Beta(betaP,betaQ)+W-W, 
+													P*IBeta(Min(_x_,1),betaP,betaQ)+(1-P)*(_x_>=W), 
+													0,1e25,
+													P*IBeta(Min(_x_,1),betaP+1,betaQ)*betaP/(betaP+betaQ)+(1-P)*W*(_x_>=W));
+								}
+								else
+								{
+									if (rateType == 8)
+									{
+										global P	 = .5;
+										global betaP = 1;
+										global betaQ = 2;
+										betaP:>0.05;betaP:<85;
+										betaQ:>0.05;betaQ:<85;
+										global alpha = .5;
+										global beta  = 1;
+										alpha:>0.01;alpha:<100;
+										beta:>0.01;										
+										beta:<200;
+										P:<1;
+										category c = (resp, EQUAL, MEAN, 
+															P*_x_^(betaP-1)*(1-Min(_x_,1))^(betaQ-1)/Beta(betaP,betaQ)+(1-P)*GammaDist(_x_,alpha,beta), 
+															P*IBeta(Min(_x_,1),betaP,betaQ)+(1-P)*CGammaDist(_x_,alpha,beta), 
+															0,1e25,
+															P*betaP/(betaP+betaQ)*IBeta(Min(_x_,1),betaP+1,betaQ)+(1-P)*alpha/beta*CGammaDist(_x_,alpha+1,beta));
+									}	
+									else
+									{
+										if (rateType == 9)
+										{
+											global P	 = .5;
+											P:<1;
+											global betaP = 1;
+											betaP:>0.05;betaP:<85;
+											global betaQ = 2;
+											betaQ:>0.05;betaQ:<85;
+											global alpha = .5;
+											alpha:>0.01;alpha:<100;
+											global beta  = 1;
+											beta:>0.01;beta:<500;
+											category c = (resp, EQUAL, MEAN, 
+																P*_x_^(betaP-1)*(1-Min(_x_,1))^(betaQ-1)/Beta(betaP,betaQ)+(1-P)*(_x_>1)*GammaDist(Max(1e-20,_x_-1),alpha,beta), 
+																P*IBeta(Min(_x_,1),betaP,betaQ)+(1-P)*CGammaDist(Max(_x_-1,0),alpha,beta), 
+																0,1e25,
+																P*betaP/(betaP+betaQ)*IBeta(Min(_x_,1),betaP+1,betaQ)+
+																		(1-P)*(alpha/beta*CGammaDist(Max(0,_x_-1),alpha+1,beta)+CGammaDist(Max(0,_x_-1),alpha,beta)));
+										}				
+										else
+										{
+											if (rateType == 10)
+											{
+												global P	 = .5;
+												global betaP = 1;
+												global betaQ = 2;
+												betaP:>0.05;
+												betaQ:>0.05;
+												betaP:<85;
+												betaQ:<85;
+												global mu = 3;
+												global sigma  = .01;
+												sigma:>0.0001;
+												sqrt2pi = Sqrt(8*Arctan(1));
+												P:<1;
+
+												category c = (resp, EQUAL, MEAN, 
+																P*_x_^(betaP-1)*(1-Min(_x_,1))^(betaQ-1)/Beta(betaP,betaQ)+
+																	(1-P)*(_x_>=1)*Exp(-(_x_-mu)(_x_-mu)/(2*sigma*sigma))/(sqrt2pi__*sigma)/ZCDF((mu-1)/sigma), 
+																P*IBeta(Min(_x_,1),betaP,betaQ)+(1-P)*(_x_>=1)*(1-ZCDF((mu-_x_)/sigma)/ZCDF((mu-1)/sigma)), 
+																0,1e25,
+																P*betaP/(betaP+betaQ)*IBeta(Min(_x_,1),betaP+1,betaQ)+
+																(1-P)*(_x_>=1)*(mu*(1-ZCDF((1-mu)/sigma)-ZCDF((mu-_x_)/sigma))+
+																sigma*(Exp((mu-1)(1-mu)/(2*sigma*sigma))-Exp((_x_-mu)(mu-_x_)/(2*sigma*sigma)))/sqrt2pi__)/ZCDF((mu-1)/sigma));
+											}				
+											else
+											{
+												if (rateType == 11)
+												{
+													global P	 = 1/3;
+													global P1    = .5;
+
+													global mu = 3;
+													global sigma  = .5;
+													sigma:>0.0001;
+													global sigma1  = 1;
+													sigma1:>0.0001;
+
+													sqrt2pi = Sqrt(8*Arctan(1));
+													P:<1;
+													P1:<1;
+													
+													categFreqMatrix = {resp+1,1};
+													for (k=1; k<=resp; k=k+1)
+													{
+														categFreqMatrix[k]:=(1-P)/resp__;
+													}
+													categFreqMatrix[0]:=P;
+
+													category c = (resp+1, categFreqMatrix, MEAN,
+																	(1-P)((1-P1)*Exp(-(_x_-mu)(_x_-mu)/(2*sigma1*sigma1))/(sqrt2pi__*sigma1)/ZCDF(mu/sigma1)+
+																			  P1*Exp(-(_x_-1)(_x_-1)/(2*sigma*sigma))/(sqrt2pi__*sigma)/ZCDF(1/sigma)), 
+																	P+(1-P)(_x_>1e-20)((1-P1)(1-ZCDF((mu-_x_)/sigma1)/ZCDF(mu/sigma1))+
+																						P1*(1-ZCDF((1-_x_)/sigma)/ZCDF(1/sigma))), 
+																	0,1e25,
+																	(1-P)((1-P1)(mu*(1-ZCDF(-mu/sigma1)-ZCDF((mu-_x_)/sigma1))+
+																	sigma1*(Exp(-mu*mu/(2*sigma1*sigma1))-Exp((_x_-mu)(mu-_x_)/(2*sigma1*sigma1)))/sqrt2pi__)/ZCDF(mu/sigma1)+
+																	P(1-ZCDF(-1/sigma)-ZCDF((1-_x_)/sigma)+
+																	sigma*(Exp(-1/(2*sigma*sigma))-Exp((_x_-1)(1-_x_)/(2*sigma*sigma)))/sqrt2pi__)/ZCDF(1/sigma))
+																 );
+												}
+												else		
+												{
+													if (rateType == 12)
+													{
+														global P	 = 1/3;
+														global P1    = .5;
+
+														global mu = 3;
+														global sigma  = .25;
+														global sigma1 = .5;
+														global sigma2 = 1;
+														sigma:>0.0001;
+														sigma1:>0.0001;
+														sigma2:>0.0001;
+
+														sqrt2pi = Sqrt(8*Arctan(1));
+														P:<1;
+														P1:<1;
+
+														category c = (resp, EQUAL , MEAN,
+																		2*P*Exp(-_x_^2/(2*sigma*sigma))+
+																		(1-P)((1-P1)*Exp((_x_-mu)(mu-_x_)/(2*sigma2*sigma2))/(sqrt2pi__*sigma2)/ZCDF(mu/sigma2)+
+																			  P1*Exp((1-_x_)(_x_-1)/(2*sigma1*sigma1))/(sqrt2pi__*sigma1)/ZCDF(1/sigma1)), 
+																		P*(1-2*ZCDF(-_x_/sigma))+
+																		(1-P)((1-P1)(1-ZCDF((mu-_x_)/sigma2)/ZCDF(mu/sigma2))+
+																			   P1*(1-ZCDF((1-_x_)/sigma1)/ZCDF(1/sigma1))), 
+																		0,1e25,
+																		2*P*sigma*(1-Exp(-_x_*_x_/(2*sigma*sigma)))/sqrt2pi__+
+																		(1-P)((1-P1)(mu*(1-ZCDF(-mu/sigma2)-ZCDF((mu-_x_)/sigma2))+
+																		sigma2*(Exp(-mu*mu/(2*sigma2*sigma2))-Exp((_x_-mu)(mu-_x_)/(2*sigma2*sigma2)))/sqrt2pi__)/ZCDF(mu/sigma2)+
+																		P1(1-ZCDF(-1/sigma1)-ZCDF((1-_x_)/sigma1)+
+																		sigma1*(Exp(-1/(2*sigma1*sigma1))-Exp((_x_-1)(1-_x_)/(2*sigma1*sigma1)))/sqrt2pi__)/ZCDF(mu/sigma1))
+																		);
+													}				
+												}				
+											}				
+										}				
+									}						
+								}
+							}
+						}
+					}				
+				}	
+			}	
+		}	
+	}		
+	return 0;
+}
+
+/* ____________________________________________________________________________________________________________________*/
+
+function FrameText (frameChar,vertChar,parOff,theText)
+{
+	h = Abs (theText)+4;
+	fprintf (stdout,"\n");	
+	for (k=0; k<parOff; k=k+1)
+	{
+		fprintf (stdout," ");
+	}
+	for (k=0; k<h;k=k+1)
+	{
+		fprintf (stdout,frameChar);
+	}
+	fprintf (stdout,"\n");	
+	for (k=0; k<parOff; k=k+1)
+	{
+		fprintf (stdout," ");
+	}
+	fprintf (stdout,vertChar," ",theText," ",vertChar,"\n");
+	for (k=0; k<parOff; k=k+1)
+	{
+		fprintf (stdout," ");
+	}
+	for (k=0; k<h;k=k+1)
+	{
+		fprintf (stdout,frameChar);
+	}
+	fprintf (stdout,"\n");	
+	return 0;
+}
+
+/* ____________________________________________________________________________________________________________________*/
+
+function BuildCodonFrequencies4 (obsF)
+{
+	PIStop = 1.0;
+	result = {ModelMatrixDimension,1};
+	hshift = 0;
+
+	for (h=0; h<64; h=h+1)
+	{
+		first = h$16;
+		second = h%16$4;
+		third = h%4;
+		if (_Genetic_Code[h]==10) 
+		{
+			hshift = hshift+1;
+			PIStop = PIStop-obsF[first][0]*obsF[second][0]*obsF[third][0];
+			continue; 
+		}
+		result[h-hshift][0]=obsF[first][0]*obsF[second][0]*obsF[third][0];
+	}
+	return result*(1.0/PIStop);
+}
+
+/* ____________________________________________________________________________________________________________________*/
+
+function BuildCodonFrequencies12 (obsF)
+{
+	PIStop = 1.0;
+	result = {ModelMatrixDimension,1};
+	hshift = 0;
+
+	for (h=0; h<64; h=h+1)
+	{
+		first = h$16;
+		second = h%16$4;
+		third = h%4;
+		if (_Genetic_Code[h]==10) 
+		{
+			hshift = hshift+1;
+			PIStop = PIStop-obsF[first][0]*obsF[second][1]*obsF[third][2];
+			continue; 
+		}
+		result[h-hshift][0]=obsF[first][0]*obsF[second][1]*obsF[third][2];
+	}
+	return result*(1.0/PIStop);
+}
+/* ____________________________________________________________________________________________________________________*/
+
+
+function GetDistributionParameters (sigLevel)
+{
+	GetInformation (distrInfo,c);
+	D = Columns(distrInfo);
+	E = 0.0;
+	T = 0.0;
+	sampleVar = 0.0;
+	for (k=0; k<D; k=k+1)
+	{
+		T = distrInfo[0][k]*distrInfo[1][k];
+		E = E+T;
+		sampleVar = T*distrInfo[0][k]+sampleVar;
+	}
+	sampleVar = sampleVar-E*E;
+
+	fprintf  (LAST_FILE_PATH,"\n\n------------------------------------------------\n\ndN/dS = ",E, " (sample variance = ",sampleVar,")\n");
+	for (k=0; k<D; k=k+1)
+	{
+		fprintf (LAST_FILE_PATH,"\nRate[",Format(k+1,0,0),"]=",
+				 Format(distrInfo[0][k],12,8), " (weight=", Format(distrInfo[1][k],9,7),")");
+	}
+	
+	for (k=0; k<D; k=k+1)
+	{
+		if (distrInfo[0][k]>1) break;
+	}
+	if (k<D)
+	/* have rates > 1 */
+	{
+		ConstructCategoryMatrix(marginals,lf,COMPLETE);
+		CC = Columns (marginals);
+		fprintf  (LAST_FILE_PATH,"\n\n------------------------------------------------\n\n Sites with dN/dS>1 (Posterior cutoff = ",sigLevel,")\n\n");
+		for (v=0; v<CC; v=v+1)
+		{
+			sampleVar = 0;
+			for (h=0; h<D; h=h+1)
+			{
+				sampleVar = sampleVar+distrInfo[1][h]*marginals[h][v];
+			}
+			positiveProb = 0;
+			for (l=k; l<D; l=l+1)
+			{
+				positiveProb = positiveProb+distrInfo[1][l]*marginals[l][v];
+			}
+			positiveProb = positiveProb/sampleVar;
+			marginals[0][v] = positiveProb;
+			if (positiveProb>=sigLevel)
+			{
+				fprintf (LAST_FILE_PATH,Format (v+1,0,0)," (",positiveProb,")\n");
+			}
+		}
+		fprintf  (LAST_FILE_PATH,"\n\n------------------------------------------------\n\n Sites with dN/dS<=1 (Posterior cutoff = ",sigLevel,")\n\n");
+		for (v=0; v<CC; v=v+1)
+		{
+			if (marginals[0][v]<sigLevel)
+			{
+				fprintf (LAST_FILE_PATH,Format (v+1,0,0)," (",marginals[0][v],")\n");
+			}
+		}
+		marginals = 0;
+	}
+	else
+	{
+		fprintf  (LAST_FILE_PATH,"\n\n------------------------------------------------\n\n No rate classes with dN/dS>1.");
+	}
+	fprintf  (LAST_FILE_PATH,"\n\n------------------------------------------------\n\n");
+	return E;
+}
+
+/* ____________________________________________________________________________________________________________________*/
+
+function PopulateModelMatrix (ModelMatrixName&, EFV)
+{
+	ModelMatrixName = {ModelMatrixDimension,ModelMatrixDimension}; 
+
+	hshift = 0;
+	
+	if (modelType==0)
+	{
+		for (h=0; h<64; h=h+1)
+		{
+			if (_Genetic_Code[h]==10) 
+			{
+				hshift = hshift+1;
+				continue; 
+			}
+			vshift = hshift;
+			for (v = h+1; v<64; v=v+1)
+			{
+				diff = v-h;
+				if (_Genetic_Code[v]==10) 
+				{
+					vshift = vshift+1;
+					continue; 
+				}
+			  	if ((h$4==v$4)||((diff%4==0)&&(h$16==v$16))||(diff%16==0))
+			  	{
+			  		if (h$4==v$4)
+			  		{
+			  			transition = v%4;
+			  			transition2= h%4;
+			  		}
+			  		else
+			  		{
+			  			if(diff%16==0)
+			  			{
+			  				transition = v$16;
+			  				transition2= h$16;
+			  			}
+			  			else
+			  			{
+			  				transition = v%16$4;
+			  				transition2= h%16$4;
+			  			}
+			  		}
+			  		if (_Genetic_Code[0][h]==_Genetic_Code[0][v]) 
+			  		{
+			  			ModelMatrixName[h-hshift][v-vshift] := t*EFV__[transition__];
+			  			ModelMatrixName[v-vshift][h-hshift] := t*EFV__[transition2__];
+				  	}
+			  		else
+			  		{
+				  		ModelMatrixName[h-hshift][v-vshift] := c*t*EFV__[transition__];
+			  			ModelMatrixName[v-vshift][h-hshift] := c*t*EFV__[transition2__];
+		  			}
+			  	}
+			  }
+		}
+	}
+	else
+	{
+		if (modelType==1)
+		{
+			for (h=0; h<64; h=h+1)
+			{
+				if (_Genetic_Code[h]==10) 
+				{
+					hshift = hshift+1;
+					continue; 
+				}
+				vshift = hshift;
+				for (v = h+1; v<64; v=v+1)
+				{
+					diff = v-h;
+					if (_Genetic_Code[v]==10) 
+					{
+						vshift = vshift+1;
+						continue; 
+					}
+					nucPosInCodon = 2;
+				  	if ((h$4==v$4)||((diff%4==0)&&(h$16==v$16))||(diff%16==0))
+				  	{
+				  		if (h$4==v$4)
+				  		{
+				  			transition = v%4;
+				  			transition2= h%4;
+				  		}
+				  		else
+				  		{
+				  			if(diff%16==0)
+				  			{
+				  				transition = v$16;
+				  				transition2= h$16;
+								nucPosInCodon = 0;
+				  			}
+				  			else
+				  			{
+				  				transition = v%16$4;
+				  				transition2= h%16$4;
+								nucPosInCodon = 1;
+				  			}
+				  		}
+				  		if (_Genetic_Code[0][h]==_Genetic_Code[0][v]) 
+				  		{
+				  			ModelMatrixName[h-hshift][v-vshift] := t*EFV__[transition__][nucPosInCodon__];
+				  			ModelMatrixName[v-vshift][h-hshift] := t*EFV__[transition2__][nucPosInCodon__];
+					  	}
+				  		else
+				  		{
+					  		ModelMatrixName[h-hshift][v-vshift] := c*t*EFV__[transition__][nucPosInCodon__];
+				  			ModelMatrixName[v-vshift][h-hshift] := c*t*EFV__[transition2__][nucPosInCodon__];
+			  			}
+				  	}
+				  }
+			}
+		}
+		else
+		{
+			for (h=0; h<64; h=h+1)
+			{
+				if (_Genetic_Code[h]==10) 
+				{
+					hshift = hshift+1;
+					continue; 
+				}
+				vshift = hshift;
+				for (v = h+1; v<64; v=v+1)
+				{
+					diff = v-h;
+					if (_Genetic_Code[v]==10) 
+					{
+						vshift = vshift+1;
+						continue; 
+					}
+				  	if ((h$4==v$4)||((diff%4==0)&&(h$16==v$16))||(diff%16==0))
+				  	{
+				  		if (h$4==v$4)
+				  		{
+				  			transition = v%4;
+				  			transition2= h%4;
+				  		}
+				  		else
+				  		{
+				  			if(diff%16==0)
+				  			{
+				  				transition = v$16;
+				  				transition2= h$16;
+				  			}
+				  			else
+				  			{
+				  				transition = v%16$4;
+				  				transition2= h%16$4;
+				  			}
+				  		}
+				  		if (_Genetic_Code[0][h]==_Genetic_Code[0][v]) 
+				  		{
+				  			if (Abs(transition-transition2)%2)
+				  			{
+				  				ModelMatrixName[h-hshift][v-vshift] := kappa*t;
+				  				ModelMatrixName[v-vshift][h-hshift] := kappa*t;
+				  			}
+				  			else
+				  			{
+				  				ModelMatrixName[h-hshift][v-vshift] := t;
+				  				ModelMatrixName[v-vshift][h-hshift] := t;
+				  			}
+				  			
+					  	}
+				  		else
+				  		{
+				  			if (Abs(transition-transition2)%2)
+				  			{
+				  				ModelMatrixName[h-hshift][v-vshift] := kappa*c*t;
+				  				ModelMatrixName[v-vshift][h-hshift] := kappa*c*t;
+				  			}
+				  			else
+				  			{
+				  				ModelMatrixName[h-hshift][v-vshift] := c*t;
+				  				ModelMatrixName[v-vshift][h-hshift] := c*t;
+				  			}
+					  	}
+				  	}	
+				 }
+			}	
+		}
+	 }
+	 return (modelType>1);
+}
+
+/* ____________________________________________________________________________________________________________________*/
+
+NICETY_LEVEL = 3;
+
+#include "TemplateModels/chooseGeneticCode.def";
+
+ModelMatrixDimension = 64;
+for (h = 0 ;h<64; h=h+1)
+{
+	if (_Genetic_Code[h]==10)
+	{
+		ModelMatrixDimension = ModelMatrixDimension-1;
+	}
+}
+
+NO_INTERNAL_LABELS = 1;
+#include "MFPSreader.def";
+
+DataSetFilter filteredData = CreateFilter (ds,3,"","",GeneticCodeExclusions);
+
+treeString = "(";
+
+for (h=0; h<numberOfSubsets; h=h+1)
+{
+	thisFileString = partitionTrees[h];
+
+	if (h)
+	{
+		treeString = treeString+","+thisFileString[1][Abs(thisFileString)-3];
+	}
+	else
+	{
+		treeString = treeString+thisFileString[1][Abs(thisFileString)-3];
+	}
+}
+NO_INTERNAL_LABELS = 0;
+
+treeString = treeString + ")";
+
+dummyVar = FrameText ("-","|",2,"POOLED TREE");
+
+fprintf (stdout, treeString, "\n\n");
+
+chosenModelList = {14,1};
+
+ChoiceList (modelType,"Distributions",1,SKIP_NONE,
+			"Run All","Run all available dN/dS distributions",
+			"Run Custom","Choose from available dN/dS distributions.");
+			
+if (modelType<0)
+{
+	return;
+}
+
+if (modelType==0)
+{
+	for (rateType = 0; rateType<14; rateType=rateType+1)
+	{
+		chosenModelList[rateType][0] = 1;
+	}
+}
+else
+{
+	ChoiceList (modelTypes,"Distributions",0,SKIP_NONE,
+				"Single Rate","Single Rate",
+				"Neutral","Neutral",
+	  			"Selection","Selection",
+			    "Discrete","Discrete",
+			    "Freqs","Freqs",
+			    "Gamma","Gamma",
+			    "2 Gamma","2 Gamma",
+			    "Beta","Beta",
+			    "Beta & w","Beta & w",
+			    "Beta & Gamma","Beta & Gamma",
+			    "Beta & (Gamma+1)","Beta & (Gamma+1)",
+			    "Beta & (Normal>1)","Beta & (Normal>1)",
+			    "0 & 2 (Normal>1)","0 & 2 (Normal>1)",
+			    "3 Normal","3 Normal");
+			    
+	if (modelTypes[0]<0)
+	{
+		return;
+	}
+	for (rateType = 0; rateType < Rows(modelTypes)*Columns(modelTypes); rateType = rateType + 1)
+	{
+		modelType = modelTypes[rateType];
+		chosenModelList[modelType] = 1;
+	}
+}
+
+ChoiceList (modelType,"Choose a model",1,SKIP_NONE,
+			"MG94 1x4","Muse-Gaut 94 model with 4(-1) nucleotide frequency parameters (intra-codon position independent).",
+			"MG94 3x4","Muse-Gaut 94 model with 12(-3) nucleotide frequency parameters (intra-codon position specific).",
+			"GY94 1x4","Goldman-Yang 94 model with 4(-1) nucleotide frequency parameters (intra-codon position independent).",
+			"GY94 3x4","Goldman-Yang 94 model with 12(-3) nucleotide frequency parameters (intra-codon position specific)."
+);
+
+if ((modelType==0)||(modelType==2))
+{
+	HarvestFrequencies (observedFreq,filteredData,1,1,0);
+	vectorOfFrequencies = BuildCodonFrequencies4 (observedFreq);
+}
+else
+{
+	HarvestFrequencies (observedFreq,filteredData,3,1,1);
+	vectorOfFrequencies = BuildCodonFrequencies12 (observedFreq);
+}
+
+if (modelType>1)
+{	
+	global kappa = 2.;
+}
+
+fprintf (stdout, "\nChoose the cutoff (0 to 1) for posterior of dN/dS>1 for a site to be considered under selective pressure:");
+fscanf  (stdin, "Number",psigLevel);
+if ((psigLevel <= 0)||(psigLevel>1))
+{
+	psigLevel = .95;
+}
+fprintf (stdout, "\n>Using ", psigLevel , " cutoff\n");
+
+fprintf (stdout, "\nChoose the number of categories in discretized distributions:");
+fscanf  (stdin, "Number",categCount);
+categCount = categCount$1;
+if (categCount<=0)
+{
+	categCount = 8;
+}
+
+fprintf (stdout, "\n>Using ", Format (categCount,0,0), " categories.\n");
+
+SetDialogPrompt ("Write detailed results to:");
+
+fprintf (PROMPT_FOR_FILE,CLEAR_FILE);
+
+global c = 1.;
+
+dummyVar = FrameText ("-","|",2,"SUMMARY TABLE");
+tableSeparator =  "+-------------------------+----------------+---------------+-----+\n";
+fprintf (stdout, "\n\"p\" is the number of parameters in addition to the branch lengths.\nDetailed results including sites with dN/dS>1 will be written to\n",LAST_FILE_PATH,"\n\n");
+fprintf (stdout, tableSeparator,
+				 "| MODEL (Number & Desc)   | Log likelihood | 	   dN/dS     |  p  |\n",
+				 tableSeparator);
+				 
+cachedBranchLengths = {{-1,-1}};
+				 
+if (chosenModelList[0]>0)
+{
+	timer = Time(1);
+	fprintf (LAST_FILE_PATH,"\n*** RUNNING SINGLE RATE MODEL ***\n#################################\n");
+	modelMatrix = 0;
+	MULTIPLY_BY_FREQS = PopulateModelMatrix ("modelMatrix", observedFreq);
+	Model theModel = (modelMatrix,vectorOfFrequencies,MULTIPLY_BY_FREQS);
+	Tree  givenTree = treeString;
+	LikelihoodFunction lf = (filteredData,givenTree);
+	Optimize (res,lf);
+	fprintf (LAST_FILE_PATH,"\n>Done in ", Time(1)-timer, " seconds \n\n");
+	fprintf (LAST_FILE_PATH,lf,"\n\n-----------------------------------\n\ndN/dS = ",c,"\n\n");
+
+	fprintf (stdout, "|  0. Single Rate Model   | ",Format (res[1][0],14,6)," | ",Format (c,13,8)," |  1  |\n",
+					 tableSeparator);
+					 
+	timer = res[1][1]-res[1][2];
+	cachedBranchLengths = {timer,1};
+	
+	for (rateType = timer; rateType < Columns(cachedBranchLengths); rateType = rateType+1)
+	{
+		cachedBranchLengths[rateType-timer][0] = res [0][rateType];
+	}
+}
+
+for (rateType = 0; rateType < 13; rateType = rateType + 1)
+{
+	if (chosenModelList[rateType+1]==0)
+	{
+		continue;
+	}
+	timer = Time(1);
+	dummy = SetWDistribution (categCount);
+	modelMatrix = 0;
+	MULTIPLY_BY_FREQS = PopulateModelMatrix ("modelMatrix", observedFreq);
+	Model theModel = (modelMatrix,vectorOfFrequencies,MULTIPLY_BY_FREQS);
+	Tree  givenTree = treeString;
+	fprintf (LAST_FILE_PATH,"\n*** RUNNING MODEL ", Format(rateType+1,0,0), " (",ModelNames[rateType],") ***\n######################################\n");
+	LikelihoodFunction lf = (filteredData,givenTree);
+	/*if (cachedBranchLengths[0][0]>=0.0)
+	{
+		v = ParameterCount[rateType];
+		if (modelType>1)
+		{
+			v=v+1;
+		}
+		for (h=0; h<Rows(cachedBranchLengths); h=h+1)
+		{
+			SetParameter (lf,h+v,cachedBranchLengths[h][0]);
+		}
+	}*/
+	Optimize (res,lf);
+	fprintf (LAST_FILE_PATH,"\n>Done in ",Time(1)-timer, " seconds \n\n", lf);
+	fprintf (stdout, "| ");
+	if (rateType<9)
+	{
+		fprintf (stdout," ");
+	}
+	fprintf (stdout, Format (rateType+1,0,0), ". ", ModelNames[rateType]);
+	for (dummy = Abs(ModelNames[rateType])+5; dummy<25; dummy = dummy+1)
+	{
+		fprintf (stdout," ");
+	}
+	dummy = GetDistributionParameters(psigLevel);
+	fprintf (stdout,"| ",Format (res[1][0],14,6)," | ",Format (dummy,13,8)," |  ",
+						 Format(ParameterCount[rateType],0,0),"  |\n",tableSeparator);
+
+	if (modelType>1)
+	{	
+		kappa = 2.;
+	}
+}
+
diff --git a/res/TemplateBatchFiles/MGvsGY.bf b/res/TemplateBatchFiles/MGvsGY.bf
new file mode 100644
index 0000000..4910930
--- /dev/null
+++ b/res/TemplateBatchFiles/MGvsGY.bf
@@ -0,0 +1,698 @@
+global		R;
+global     AC;
+global 	   AT;
+global     CG;
+global	   CT;
+global     GT;
+
+R  = 1;
+AT = 1;
+CG = 1;
+CT = 1;
+GT = 1;
+AC = 1;
+
+ModelMatrixDimension = 0;
+
+/*--------------------------------------------------------------------------------------*/
+
+function testLRT (vec1, vec2)
+{
+	size1 = Columns(vec1);
+	
+	sumVec1 = {size1,1};
+	jvec	= {2,size1};
+	resMx1	= {khSamples,1};
+	resMx2	= {khSamples,1};
+	
+	for (k=0; k<size1; k=k+1)
+	{
+		sumVec1 [k]	   = 1;
+		jvec	[0][k] = Log(vec1[k]);
+		jvec	[1][k] = Log(vec2[k]);
+	}
+	
+	
+	for (k=0; k<khSamples; k=k+1)
+	{
+		resampled = Random(jvec,1);
+		resampled = resampled*sumVec1;
+		resMx1[k] = resampled[0];
+		resMx2[k] = resampled[1];
+	}
+	
+	return (resMx1-resMx2)*2;
+}
+
+
+/*--------------------------------------------------------------------------------------------------------------------------------------*/
+
+function BuildCodonFrequencies (obsF)
+{
+	if (!ModelMatrixDimension)
+	{
+		ModelMatrixDimension = 64;
+		for (h = 0 ; h<64; h=h+1)
+		{
+			if (_Genetic_Code[h]==10)
+			{
+				ModelMatrixDimension = ModelMatrixDimension-1;
+			}
+		}
+	}
+	
+	PIStop = 1.0;
+	result = {ModelMatrixDimension,1};
+	hshift = 0;
+
+	for (h=0; h<64; h=h+1)
+	{
+		first = h$16;
+		second = h%16$4;
+		third = h%4;
+		if (_Genetic_Code[h]==10) 
+		{
+			hshift = hshift+1;
+			PIStop = PIStop-obsF[first][0]*obsF[second][1]*obsF[third][2];
+			continue; 
+		}
+		result[h-hshift][0]=obsF[first][0]*obsF[second][1]*obsF[third][2];
+	}
+	return result*(1.0/PIStop);
+}
+
+/*--------------------------------------------------------------------------------------------------------------------------------------*/
+
+function BuildCodonFrequencies2 (obsF)
+{
+	PIStop = 1.0;
+	result = {ModelMatrixDimension,1};
+	hshift = 0;
+
+	for (h=0; h<64; h=h+1)
+	{
+		first = h$16;
+		second = h%16$4;
+		third = h%4;
+		if (_Genetic_Code[h]==10) 
+		{
+			hshift = hshift+1;
+			PIStop = PIStop-obsF[first]*obsF[second]*obsF[third];
+			continue; 
+		}
+		result[h-hshift][0]=obsF[first]*obsF[second]*obsF[third];
+	}
+	return result*(1.0/PIStop);
+}
+
+/*--------------------------------------------------------------------------------------------------------------------------------------*/
+
+nucModelString = "nucModelMatrix = {{*,AC*t,t,AT*t}{AC*t,*,CG*t,CT*t}{t,CG*t,*,GT*t}{AT*t,CT*t,GT*t,*}};";
+
+/*--------------------------------------------------------------------------------------------------------------------------------------*/
+
+function PopulateModelMatrix (ModelMatrixName&, EFV, modelType)
+{
+	
+	ModelMatrixName = {ModelMatrixDimension,ModelMatrixDimension}; 
+	hshift = 0;
+
+	if (modelType == 0)
+	{
+		for (h=0; h<64; h=h+1)
+		{
+			if (_Genetic_Code[h]==10) 
+			{
+				hshift = hshift+1;
+				continue; 
+			}
+			vshift = hshift;
+			for (v = h+1; v<64; v=v+1)
+			{
+				diff = v-h;
+				if (_Genetic_Code[v]==10) 
+				{
+					vshift = vshift+1;
+					continue; 
+				}
+				nucPosInCodon = 2;
+				
+				if ((h$4==v$4)||((diff%4==0)&&(h$16==v$16))||(diff%16==0))
+				{
+					if (h$4==v$4)
+					{
+						transition = v%4;
+						transition2= h%4;
+					}
+					else
+					{
+						if(diff%16==0)
+						{
+							transition = v$16;
+							transition2= h$16;
+							nucPosInCodon = 0;
+						}
+						else
+						{
+							transition = v%16$4;
+							transition2= h%16$4;
+							nucPosInCodon = 1;
+						}
+					}
+					if (transition<transition2)
+					{
+						trSM = transition;
+						trLG = transition2;
+					}
+					else
+					{
+						trSM = transition2;
+						trLG = transition;
+					}
+					
+					if (trSM==0)
+					{
+						if (trLG==1)
+						{
+							if (_Genetic_Code[0][h]==_Genetic_Code[0][v]) 
+							{
+								ModelMatrixName[h-hshift][v-vshift] := AC*synRate*EFV__[transition__][nucPosInCodon__];
+								ModelMatrixName[v-vshift][h-hshift] := AC*synRate*EFV__[transition2__][nucPosInCodon__];
+							}
+							else
+							{
+								ModelMatrixName[h-hshift][v-vshift] := AC*R*synRate*EFV__[transition__][nucPosInCodon__];
+								ModelMatrixName[v-vshift][h-hshift] := AC*R*synRate*EFV__[transition2__][nucPosInCodon__];
+							}
+						}
+						else
+						{
+							if (trLG==2)
+							{
+								if (_Genetic_Code[0][h]==_Genetic_Code[0][v]) 
+								{
+									ModelMatrixName[h-hshift][v-vshift] := synRate*EFV__[transition__][nucPosInCodon__];
+									ModelMatrixName[v-vshift][h-hshift] := synRate*EFV__[transition2__][nucPosInCodon__];
+								}
+								else
+								{
+									ModelMatrixName[h-hshift][v-vshift] := R*synRate*EFV__[transition__][nucPosInCodon__];
+									ModelMatrixName[v-vshift][h-hshift] := R*synRate*EFV__[transition2__][nucPosInCodon__];
+								}							
+							}
+							else
+							{
+								if (_Genetic_Code[0][h]==_Genetic_Code[0][v]) 
+								{
+									ModelMatrixName[h-hshift][v-vshift] := AT*synRate*EFV__[transition__][nucPosInCodon__];
+									ModelMatrixName[v-vshift][h-hshift] := AT*synRate*EFV__[transition2__][nucPosInCodon__];
+								}
+								else
+								{
+									ModelMatrixName[h-hshift][v-vshift] := AT*R*synRate*EFV__[transition__][nucPosInCodon__];
+									ModelMatrixName[v-vshift][h-hshift] := AT*R*synRate*EFV__[transition2__][nucPosInCodon__];
+								}							
+							}
+						}
+					}
+					else
+					{
+						if (trSM==1)
+						{
+							if (trLG==2)
+							{
+								if (_Genetic_Code[0][h]==_Genetic_Code[0][v]) 
+								{
+									ModelMatrixName[h-hshift][v-vshift] := CG*synRate*EFV__[transition__][nucPosInCodon__];
+									ModelMatrixName[v-vshift][h-hshift] := CG*synRate*EFV__[transition2__][nucPosInCodon__];
+								}
+								else
+								{
+									ModelMatrixName[h-hshift][v-vshift] := CG*R*synRate*EFV__[transition__][nucPosInCodon__];
+									ModelMatrixName[v-vshift][h-hshift] := CG*R*synRate*EFV__[transition2__][nucPosInCodon__];
+								}
+							}
+							else
+							{
+								if (_Genetic_Code[0][h]==_Genetic_Code[0][v]) 
+								{
+									ModelMatrixName[h-hshift][v-vshift] := CT*synRate*EFV__[transition__][nucPosInCodon__];
+									ModelMatrixName[v-vshift][h-hshift] := CT*synRate*EFV__[transition2__][nucPosInCodon__];
+								}
+								else
+								{
+									ModelMatrixName[h-hshift][v-vshift] := CT*R*synRate*EFV__[transition__][nucPosInCodon__];
+									ModelMatrixName[v-vshift][h-hshift] := CT*R*synRate*EFV__[transition2__][nucPosInCodon__];
+								}							
+							}
+						}
+						else
+						{
+							if (_Genetic_Code[0][h]==_Genetic_Code[0][v]) 
+							{
+								ModelMatrixName[h-hshift][v-vshift] := GT*synRate*EFV__[transition__][nucPosInCodon__];
+								ModelMatrixName[v-vshift][h-hshift] := GT*synRate*EFV__[transition2__][nucPosInCodon__];
+							}
+							else
+							{
+								ModelMatrixName[h-hshift][v-vshift] := GT*R*synRate*EFV__[transition__][nucPosInCodon__];
+								ModelMatrixName[v-vshift][h-hshift] := GT*R*synRate*EFV__[transition2__][nucPosInCodon__];
+							}							
+						}
+					}
+				}
+		     }
+	    }		
+	}
+	else
+	{
+		for (h=0; h<64; h=h+1)
+		{
+			if (_Genetic_Code[h]==10) 
+			{
+				hshift = hshift+1;
+				continue; 
+			}
+			vshift = hshift;
+			for (v = h+1; v<64; v=v+1)
+			{
+				diff = v-h;
+				if (_Genetic_Code[v]==10) 
+				{
+					vshift = vshift+1;
+					continue; 
+				}
+				nucPosInCodon = 2;
+				
+				if ((h$4==v$4)||((diff%4==0)&&(h$16==v$16))||(diff%16==0))
+				{
+					if (h$4==v$4)
+					{
+						transition = v%4;
+						transition2= h%4;
+					}
+					else
+					{
+						if(diff%16==0)
+						{
+							transition = v$16;
+							transition2= h$16;
+							nucPosInCodon = 0;
+						}
+						else
+						{
+							transition = v%16$4;
+							transition2= h%16$4;
+							nucPosInCodon = 1;
+						}
+					}
+					if (transition<transition2)
+					{
+						trSM = transition;
+						trLG = transition2;
+					}
+					else
+					{
+						trSM = transition2;
+						trLG = transition;
+					}
+					
+					if (trSM==0)
+					{
+						if (trLG==1)
+						{
+							if (_Genetic_Code[0][h]==_Genetic_Code[0][v]) 
+							{
+								ModelMatrixName[h-hshift][v-vshift] := AC*synRate;
+								ModelMatrixName[v-vshift][h-hshift] := AC*synRate;
+							}
+							else
+							{
+								ModelMatrixName[h-hshift][v-vshift] := AC*R*synRate;
+								ModelMatrixName[v-vshift][h-hshift] := AC*R*synRate;
+							}
+						}
+						else
+						{
+							if (trLG==2)
+							{
+								if (_Genetic_Code[0][h]==_Genetic_Code[0][v]) 
+								{
+									ModelMatrixName[h-hshift][v-vshift] := synRate;
+									ModelMatrixName[v-vshift][h-hshift] := synRate;
+								}
+								else
+								{
+									ModelMatrixName[h-hshift][v-vshift] := R*synRate;
+									ModelMatrixName[v-vshift][h-hshift] := R*synRate;
+								}							
+							}
+							else
+							{
+								if (_Genetic_Code[0][h]==_Genetic_Code[0][v]) 
+								{
+									ModelMatrixName[h-hshift][v-vshift] := AT*synRate;
+									ModelMatrixName[v-vshift][h-hshift] := AT*synRate;
+								}
+								else
+								{
+									ModelMatrixName[h-hshift][v-vshift] := AT*R*synRate;
+									ModelMatrixName[v-vshift][h-hshift] := AT*R*synRate;
+								}							
+							}
+						}
+					}
+					else
+					{
+						if (trSM==1)
+						{
+							if (trLG==2)
+							{
+								if (_Genetic_Code[0][h]==_Genetic_Code[0][v]) 
+								{
+									ModelMatrixName[h-hshift][v-vshift] := CG*synRate;
+									ModelMatrixName[v-vshift][h-hshift] := CG*synRate;
+								}
+								else
+								{
+									ModelMatrixName[h-hshift][v-vshift] := CG*R*synRate;
+									ModelMatrixName[v-vshift][h-hshift] := CG*R*synRate;
+								}
+							}
+							else
+							{
+								if (_Genetic_Code[0][h]==_Genetic_Code[0][v]) 
+								{
+									ModelMatrixName[h-hshift][v-vshift] := CT*synRate;
+									ModelMatrixName[v-vshift][h-hshift] := CT*synRate;
+								}
+								else
+								{
+									ModelMatrixName[h-hshift][v-vshift] := CT*R*synRate;
+									ModelMatrixName[v-vshift][h-hshift] := CT*R*synRate;
+								}							
+							}
+						}
+						else
+						{
+							if (_Genetic_Code[0][h]==_Genetic_Code[0][v]) 
+							{
+								ModelMatrixName[h-hshift][v-vshift] := GT*synRate;
+								ModelMatrixName[v-vshift][h-hshift] := GT*synRate;
+							}
+							else
+							{
+								ModelMatrixName[h-hshift][v-vshift] := GT*R*synRate;
+								ModelMatrixName[v-vshift][h-hshift] := GT*R*synRate;
+							}							
+						}
+					}
+				}
+		     }
+	    }		
+		return 1;
+	}
+	return 0;
+}
+
+
+#include "TemplateModels/chooseGeneticCode.def";
+
+done = 0;
+while (!done)
+{
+	fprintf (stdout,"\nPlease enter a 6 character model designation (e.g:010010 defines HKY85):");
+	fscanf  (stdin,"String", modelDesc);
+	if (Abs(modelDesc)==6)
+	{	
+		done = 1;
+	}
+}			
+ModelTitle = modelDesc[0];
+			
+rateBiasTerms = {{"AC","1","AT","CG","CT","GT"}};
+paramCount	  = 0;
+
+modelConstraintString = "";
+
+for (customLoopCounter2=1; customLoopCounter2<6; customLoopCounter2=customLoopCounter2+1)
+{
+	for (customLoopCounter=0; customLoopCounter<customLoopCounter2; customLoopCounter=customLoopCounter+1)
+	{
+		if (modelDesc[customLoopCounter2]==modelDesc[customLoopCounter])
+		{
+			ModelTitle  = ModelTitle+modelDesc[customLoopCounter2];	
+			if (rateBiasTerms[customLoopCounter2] == "1")
+			{
+				modelConstraintString = modelConstraintString + rateBiasTerms[customLoopCounter]+":="+rateBiasTerms[customLoopCounter2]+";";
+			}
+			else
+			{
+				modelConstraintString = modelConstraintString + rateBiasTerms[customLoopCounter2]+":="+rateBiasTerms[customLoopCounter]+";";			
+			}
+			break;
+		}
+	}
+	if (customLoopCounter==customLoopCounter2)
+	{
+		ModelTitle = ModelTitle+modelDesc[customLoopCounter2];	
+	}
+}
+
+if (Abs(modelConstraintString))
+{
+	ExecuteCommands (modelConstraintString);
+}
+
+khSamples = -1;
+while (khSamples < 0)
+{
+	fprintf (stdout,"\nHow many samples should be generated for the KH test (0 to skip test):");
+	fscanf  (stdin,"Number", khSamples);
+}			
+
+ChoiceList (branchLengths,"Branch Lengths",1,SKIP_NONE,
+			"Codon Model","Jointly optimize rate parameters and branch lengths (slow and thorough)",
+			"Nucleotide Model","Estimate branch lengths once, using an appropriate nucleotide model (quick and dirty)."
+		    );
+
+if (branchLengths<0)
+{
+	return;
+}
+
+SetDialogPrompt ("Please specify a codon data file:");
+
+DataSet					 ds = ReadDataFile (PROMPT_FOR_FILE);
+DataSetFilter filteredData  = CreateFilter (ds,3,"","",GeneticCodeExclusions);
+HarvestFrequencies  (observedFreq ,filteredData,3,1,1);
+HarvestFrequencies  (observedFreqE,filteredData,1,1,1);
+
+vectorOfFrequencies 	= BuildCodonFrequencies  (observedFreq);
+vectorOfFrequencies1x4  = BuildCodonFrequencies2 (observedFreqE);
+HarvestFrequencies  (empiricalCodon,filteredData,3,3,0);
+
+cfm = {ModelMatrixDimension, 3};
+
+for (k=0; k<ModelMatrixDimension; k=k+1)
+{
+	cfm [k][0] = vectorOfFrequencies[k];
+	cfm [k][1] = vectorOfFrequencies1x4[k];
+	cfm [k][2] = empiricalCodon[k];
+}
+
+cL 	   = "Codon";
+labels = {{"F3x4","F1x4", "Empirical",""}};
+
+nucs = {{"A","C","G","T"}};
+
+k=0;
+for (p1=0; p1<4; p1=p1+1)
+{
+	for (p2=0; p2<4; p2=p2+1)
+	{
+		for (p3=0; p3<4; p3=p3+1)
+		{
+			if (_Genetic_Code[k] != 10)
+			{
+				cL = cL + ";" + nucs[p1] + nucs[p2] + nucs[p3];
+			}
+			k=k+1;
+		}
+	}
+}
+
+labels[3] = cL;
+
+OpenWindow (CHARTWINDOW,
+	{{"Codon Frequencies"}
+	{"labels"}
+	{"cfm"}
+	{"Bar Chart"}
+	{"Index"}
+	{labels[0]+";"+labels[1]+";"+labels[2]}
+	{"Codon Position"}
+	{""}
+	{"Proportion"}
+	{"3"}
+	{""}
+	{""}
+	{"10;1.309;0.785398"}
+	{"Times:12:0;Times:10:0;Times:14:2"}
+	{"0;0;16777215;5000268;0;0;6750054;11842740;13158600;14474460;0;3947580;13421772;8388608;32768;4194432;1644825;7018159;1460610;16748822;11184810;14173291;14173291"}
+	{"16"}
+	},
+	"(SCREEN_WIDTH-30);(SCREEN_HEIGHT-80)/2;20;SCREEN_HEIGHT/2");
+	
+
+fm = Transpose (observedFreq);
+labels = {{"A","C", "G","T","Position;1;2;3"}};
+OpenWindow (CHARTWINDOW,
+	{{"Nucleotide Frequencies"}
+	{"labels"}
+	{"fm"}
+	{"Bar Chart"}
+	{"Index"}
+	{"A;C;G;T"}
+	{"Codon Position"}
+	{""}
+	{"Proportion"}
+	{"3"}
+	{""}
+	{""}
+	{"10;1.309;0.785398"}
+	{"Times:12:0;Times:10:0;Times:14:2"}
+	{"0;0;16777215;5000268;0;0;6750054;11842740;13158600;14474460;0;3947580;13421772;8388608;32768;4194432;1644825;7018159;1460610;16748822;11184810;14173291;14173291"}
+	{"16"}
+	},
+	"(SCREEN_WIDTH-30)/2;(SCREEN_HEIGHT-80)/2;20;40");
+
+fprintf (stdout,"\n0). Read the data\n",ds);
+MG94Matrix = 0;
+PopulateModelMatrix ("MG94Matrix", observedFreq, 0);
+Model MG94Model = (MG94Matrix, vectorOfFrequencies, 0);
+
+_DO_TREE_REBALANCE_ = 1;
+
+#include "queryTree.bf";
+
+if (branchLengths)
+{
+	DataSetFilter nucFilter = CreateFilter (filteredData,1);
+	ExecuteCommands (nucModelString+"\nModel nucModel = (nucModelMatrix,observedFreqE);");
+
+	Tree  nucTree = treeString;
+	LikelihoodFunction nuc_lf = (nucFilter,nucTree);
+	Optimize (nuc_res, nuc_lf);
+	global codonFactor = 0.33;
+	
+}
+
+GY94Matrix = 0;
+PopulateModelMatrix ("GY94Matrix", observedFreq, 0);
+Model GY94Model = (GY94Matrix, vectorOfFrequencies, 1);
+
+Tree givenTreeGY = treeString;
+
+LikelihoodFunction lf_MG = (filteredData,givenTree);
+
+if (branchLengths)
+{
+	ClearConstraints (givenTree);
+	ReplicateConstraint ("this1.?.synRate:=this2.?.t__/codonFactor",givenTree,nucTree);
+}
+
+Optimize (resMG,lf_MG);
+ConstructCategoryMatrix (MGconditionals,lf_MG,COMPLETE);
+
+
+fprintf (stdout,"\n1). MG94x", ModelTitle, " fit\n", lf_MG, "\n");
+
+COVARIANCE_PARAMETER = "R";
+COVARIANCE_PRECISION = 0.95;
+CovarianceMatrix (MGR, lf_MG);
+
+LikelihoodFunction lf_GY = (filteredData,givenTreeGY);
+
+if (branchLengths)
+{
+	ClearConstraints (givenTree);
+	ReplicateConstraint ("this1.?.synRate:=this2.?.t__/codonFactor",givenTreeGY,nucTree);
+}
+
+Optimize (resGY,lf_GY);
+ConstructCategoryMatrix (GYconditionals,lf_GY,COMPLETE);
+CovarianceMatrix (GYR, lf_GY);
+
+fprintf (stdout,"\n2). GY94x", ModelTitle, " fit\n", lf_GY, "\n");
+
+fprintf (stdout, "\n3). Profile likelihood intervals on dN/dS\n",	
+				  "\tMG94: ", Format(MGR[0],10,5), " <= dN/dS (", Format(MGR[1],10,5), ") <= ", Format(MGR[2],10,5),"\n",
+				  "\tGY94: ", Format(GYR[0],10,5), " <= dN/dS (", Format(GYR[1],10,5), ") <= ", Format(GYR[2],10,5),"\n");
+
+siteWiseLikelihoods	= {filteredData.sites,3};
+
+MGbetter = 0;
+
+for (k=0; k < filteredData.sites; k=k+1)
+{
+	 siteWiseLikelihoods [k][0] = Log (MGconditionals[k]);
+	 siteWiseLikelihoods [k][1] = Log (GYconditionals[k]);
+	 siteWiseLikelihoods [k][2] = siteWiseLikelihoods [k][0]-siteWiseLikelihoods [k][1];
+	 if (siteWiseLikelihoods [k][2]>=0)
+	 {
+	 	MGbetter = MGbetter + 1;
+	 }
+}
+
+labels = {{"MG94 Log L","GY94 Log L", "MG94-GY94 Log L difference"}};
+OpenWindow (CHARTWINDOW,
+	{{"Site by site comparison"}
+	{"labels"}
+	{"siteWiseLikelihoods"}
+	{"Bar Chart"}
+	{"Index"}
+	{labels[2]}
+	{"Codon"}
+	{"LRT"}
+	{"Log L difference"}
+	{""}
+	{""}
+	{""}
+	{"10;1.309;0.785398"}
+	{"Times:12:0;Times:10:0;Times:14:2"}
+	{"0;0;16777215;5000268;0;0;6750054;11842740;13158600;14474460;0;3947580;13421772;5000268;11776947;10066329;9199669;7018159;1460610;16748822;11184810;14173291;14173291"}
+	{"16"}
+	},
+	"(SCREEN_WIDTH-30)/2;(SCREEN_HEIGHT-80)/2;20+(SCREEN_WIDTH)/2;40");
+}
+
+fprintf (stdout,"\n4). Site-by-site fits\n\tMG94 is better on ", MGbetter, "/", filteredData.sites, " codon columns\n");
+
+if (khSamples)
+{
+	fprintf (stdout,"\n5). Kishino-Hasegawa resampling test\n");
+
+	LRT1 = 2*(resMG[1][0]-resGY[1][0]);
+
+	if (LRT1>0)
+	{
+		fprintf (stdout, "\n\nSUMMARY:\n\n\tMG94 is better than GY94. LRT = ",LRT1);
+		test1 = testLRT (MGconditionals,GYconditionals)%0;
+	}
+	else
+	{
+		fprintf (stdout, "\n\nSUMMARY:\n\n\tGY94 is better than MG94. LRT = ",LRT1);
+		test1 = testLRT (GYconditionals,MGconditionals)%0;
+	}
+
+	for (k=0; k<Columns(GYconditionals); k=k+1)
+	{
+		if (test1[k]>0)
+		{
+			break;
+		}
+	}	
+	fprintf (stdout, "\n\nEstimated p-value for  (based on ", khSamples," replicates): ", Format(k/khSamples,10,4),"\n");
+
+}
diff --git a/res/TemplateBatchFiles/MaxChi2.bf b/res/TemplateBatchFiles/MaxChi2.bf
new file mode 100644
index 0000000..065c6f3
--- /dev/null
+++ b/res/TemplateBatchFiles/MaxChi2.bf
@@ -0,0 +1,245 @@
+R_2 = {{1,1}};
+C_2 = {{1}{1}};
+
+SetDialogPrompt ("Please specify a nucleotide or amino-acid data file:");
+
+DataSet ds = ReadDataFile (PROMPT_FOR_FILE);
+
+fprintf (stdout, "Read ", ds.species, " sequences and ", ds.sites, " sites.");
+
+/* find sites which are not constant */
+
+DataSetFilter filteredData = CreateFilter (ds,1,"/^(.)\1+$/");
+
+vsc = ds.sites-filteredData.sites;
+fprintf (stdout, " Found ", vsc, " variable sites");
+
+/* make a list of variable sites */
+
+k = 0;
+i = 0; 
+variableMap 	= {vsc,1};
+map 			= {};
+toVariableMap   = {};
+
+for (k2 = 0; k2 < ds.sites; k2=k2+1)
+{
+	if (filteredData.site_map[i] == k2)
+	{
+		if (i < filteredData.sites - 1)
+		{
+			i=i+1;
+		}
+	}
+	else
+	{
+		map[k2] = 1;
+		variableMap[k] = k2;
+		toVariableMap[k2] = k;
+		k = k+1;
+	}
+}
+
+pairDiffMap = {};
+
+DataSetFilter filteredData = CreateFilter (ds,1,map[siteIndex]);
+
+for (k=0; k<filteredData.species; k=k+1)
+{
+	for (k2=k+1; k2<filteredData.species; k2=k2+1)
+	{
+		DataSetFilter seqFilter    = CreateFilter (filteredData,1,"",speciesIndex == k || speciesIndex == k2);
+		DataSetFilter pairedFilter = CreateFilter (seqFilter,1,"/^(.)\1+$/");
+		mismatchSites = {1,filteredData.sites};	
+
+		i  = 0;
+		for (k3 = 0; k3 < filteredData.sites; k3=k3+1)
+		{
+			k4 = filteredData.site_map[k3];
+			if (pairedFilter.site_map[i] == k4)
+			{
+				if (i < pairedFilter.sites - 1) 
+				{
+					i=i+1;
+				}
+			}
+			else
+			{
+				k4 = toVariableMap[k4];
+				mismatchSites[k4] = 1;
+			}
+		}
+		
+		pairDiffMap[""+k+","+k2] = mismatchSites;
+	}
+}
+
+ChoiceList	(useFisherExact,"Test to use",1,SKIP_NONE,
+					   "Chi square",      "Compute association bias using the chi-squared approximation (faster).",
+					   "Fisher's exact",  "Compute association bias using Fisher's exact test approximation (slower)");
+
+if (useFisherExact<0)
+{
+	return 0;
+}
+
+minWindowSize  = promptForValue ("Minimum partition size ", 1, filteredData.sites-1,filteredData.sites$3,1);
+iterates	   = promptForValue ("Boostrap sample size ", 1, 100000000 ,1000,1);
+reportP	   	   = promptForValue ("p-value threshold ", 0, 1 ,0.05,0);
+
+SetDialogPrompt ("Save results to:");
+fprintf 		(PROMPT_FOR_FILE, CLEAR_FILE, "Sequence 1,Sequence 2,Breakpoint,Variable_Left,Variable_Right,Test p-value,Resampled p-value");
+saveTo	= LAST_FILE_PATH;
+
+windowCount	   = filteredData.sites-2*minWindowSize+1;
+
+unitVector	= {filteredData.sites,1};
+stencil  	= {filteredData.sites,1};
+
+pairTotal = filteredData.species*(filteredData.species-1)/2;
+completeReport = {pairTotal*windowCount,7};
+
+for (bppos = 0; bppos < filteredData.sites; bppos = bppos + 1)
+{
+	unitVector[bppos] = 1;
+}
+
+rowIndex  = 0;
+lastSpool = 0;
+
+timer = Time(0);
+pairCount = 0;
+
+for (k=0; k<filteredData.species; k=k+1)
+{
+	GetString (seq1,filteredData,k);
+	for (k2=k+1; k2<filteredData.species; k2=k2+1)
+	{
+		GetString (seq2,filteredData,k2);
+		if (pairCount)
+		{
+			fprintf (stdout, "\nPair (", k+1, ",", k2+1, "). Estimated Remaining Time (seconds): ", (Time(0)-timer)*(pairTotal-pairCount)/pairCount, "\n");
+		}
+		else
+		{
+			fprintf (stdout, "\nPair (", k+1, ",", k2+1, ")\n");		
+		}
+		pairCount = pairCount + 1;
+		pairwiseDiffs = pairDiffMap[""+k+","+k2];
+		td = pairwiseDiffs*unitVector;
+		td = td[0];
+		stencil  	= {filteredData.sites,1};
+		for (bppos = 0; bppos < minWindowSize; bppos = bppos + 1)
+		{
+			stencil[bppos] = 1;
+		}
+
+		for (bppos = minWindowSize-1; bppos < filteredData.sites-minWindowSize; bppos = bppos+1)
+		{
+			stencil[bppos] = 1;
+			completeReport[rowIndex][0] = k+1;
+			completeReport[rowIndex][1] = k2+1;
+			completeReport[rowIndex][2] = variableMap[bppos];
+			pdc = pairwiseDiffs*stencil;
+			pdc = pdc[0];
+			completeReport[rowIndex][3] = pdc;
+			completeReport[rowIndex][4] = td-pdc;
+			twoByTwo = {2,2};
+			twoByTwo[0][0] = pdc;
+			twoByTwo[0][1] = td-pdc;
+			twoByTwo[1][0] = bppos+1;
+			twoByTwo[1][1] = filteredData.sites-twoByTwo[1][0];
+			
+			myP = getP (twoByTwo);
+			
+			completeReport[rowIndex][5] = myP;
+			simP = 0;
+			for (it = 0; it < iterates; it=it+1)
+			{
+				randomized = Random(pairwiseDiffs,0);
+				pdc = randomized*stencil;
+				pdc = pdc[0];
+				twoByTwo[0][0] = pdc;
+				twoByTwo[0][1] = td-pdc;
+				simP2 = getP (twoByTwo);
+				if (simP2 <= myP)
+				{
+					simP = simP+1;
+				}
+			}
+			simP = simP / iterates;
+			completeReport[rowIndex][6] = simP;
+			if (simP <= reportP)
+			{
+				fprintf (stdout, "Pair (", k+1, ",", k2+1, ") position ", completeReport[rowIndex][2], " p-value:", simP, " (*)\n");
+			}
+			rowIndex = rowIndex+1;
+		}
+		outString = "";
+		outString * 512;
+		for (bppos = lastSpool; bppos < rowIndex; bppos = bppos+1)
+		{
+			outString * ("\n"+seq1+","+seq2+","+completeReport[bppos][2]+","+completeReport[bppos][3]+","+completeReport[bppos][4]+","
+						+completeReport[bppos][5]+","+completeReport[bppos][6]);
+		}
+		lastSpool = rowIndex;
+		outString * 0;
+		fprintf (saveTo, outString);
+	}
+}
+
+/*------------------------------------------------------------------------------------------------------------*/
+
+function getP (aMatrix)
+{
+	if (useFisherExact)
+	{
+		return CChi2(aMatrix,0);
+	}
+	else
+	{
+		R_S = aMatrix * C_2;
+		C_S = R_2*aMatrix;
+		T = C_S[0]+C_S[1];
+		
+		n_ij = R_S[0]*C_S[0]/T;
+		chi2Sum = (aMatrix[0][0]-n_ij)^2 / n_ij;
+		n_ij = R_S[0]*C_S[1]/T;
+		chi2Sum = chi2Sum + (aMatrix[0][1]-n_ij)^2 / n_ij;
+		n_ij = R_S[1]*C_S[0]/T;
+		chi2Sum = chi2Sum + (aMatrix[1][0]-n_ij)^2 / n_ij;
+		n_ij = R_S[1]*C_S[1]/T;
+		chi2Sum = chi2Sum + (aMatrix[1][1]-n_ij)^2 / n_ij;
+		
+		return 1-CChi2(chi2Sum,1);
+	}
+}
+
+/*------------------------------------------------------------------------------------------------------------*/
+
+function promptForValue (pString, minV, maxV, defV,roundMe)
+{
+	while (1)
+	{
+		inString = "";
+		fprintf (stdout, "\n", pString, "[", minV, "-", maxV,"] (default ", defV, "):");
+		fscanf (stdin, "String", inString); 
+		if (Abs(inString))
+		{
+			unitVector = (0+inString);
+			if (roundMe)
+			{
+				unitVector = unitVector $ 1;
+			}
+			if (unitVector >= minV && unitVector <= maxV)
+			{
+				return unitVector;
+			}
+		}
+		else
+		{
+			return defV;
+		}
+	}
+
+}
diff --git a/res/TemplateBatchFiles/MergeSequences.bf b/res/TemplateBatchFiles/MergeSequences.bf
new file mode 100644
index 0000000..f53e0b1
--- /dev/null
+++ b/res/TemplateBatchFiles/MergeSequences.bf
@@ -0,0 +1,37 @@
+SetDialogPrompt ("Please choose the first data file:");
+DataSet ds = ReadDataFile (PROMPT_FOR_FILE);
+fprintf (stdout, "\n\nData Set 1:\n", ds);
+
+if (IS_TREE_PRESENT_IN_DATA)
+{
+	fprintf (stdout, "\nTree In Data:", DATAFILE_TREE);
+}
+
+SetDialogPrompt ("Please choose the second data file:");
+DataSet ds2 = ReadDataFile (PROMPT_FOR_FILE);
+
+while (ds2.sites!=ds.sites)
+{
+	ChoiceList (userChoice,"Unequal sequence length",1,SKIP_NONE,
+				"Choose Again", "Choose another datafile to merge",
+				"Merge Anyway", "Pad the shorter sequences with deletions");
+	if (userChoice<0)
+	{
+		return;
+	}
+	if (userChoice==1)
+	{
+		break;
+	}
+	DataSet ds2 = ReadDataFile (PROMPT_FOR_FILE);
+}
+
+fprintf (stdout, "\n\nData Set 2:\n", ds2);
+
+DataSet dsCombined = Combine (purge,ds,ds2);
+fprintf (stdout, "\n\nMerged Data Set:\n", dsCombined);
+
+SetDialogPrompt ("Save resulting data set to:");
+DataSetFilter dsf = CreateFilter (dsCombined,1);
+
+fprintf (PROMPT_FOR_FILE,CLEAR_FILE,dsf);
diff --git a/res/TemplateBatchFiles/MergeSites.bf b/res/TemplateBatchFiles/MergeSites.bf
new file mode 100644
index 0000000..cb99640
--- /dev/null
+++ b/res/TemplateBatchFiles/MergeSites.bf
@@ -0,0 +1,37 @@
+SetDialogPrompt ("Please choose the first data file:");
+DataSet ds = ReadDataFile (PROMPT_FOR_FILE);
+fprintf (stdout, "\n\nData Set 1:\n", ds);
+
+if (IS_TREE_PRESENT_IN_DATA)
+{
+	fprintf (stdout, "\nTree In Data:", DATAFILE_TREE);
+}
+
+SetDialogPrompt ("Please choose the second data file:");
+DataSet ds2 = ReadDataFile (PROMPT_FOR_FILE);
+
+while (ds2.species!=ds.species)
+{
+	ChoiceList (userChoice,"Unequal number of sequences",1,SKIP_NONE,
+				"Choose Again", "Choose another datafile to merge",
+				"Merge Anyway", "Pad missing sequences with deletions");
+	if (userChoice<0)
+	{
+		return;
+	}
+	if (userChoice==1)
+	{
+		break;
+	}
+	DataSet ds2 = ReadDataFile (PROMPT_FOR_FILE);
+}
+
+fprintf (stdout, "\n\nData Set 2:\n", ds2);
+
+DataSet dsCombined = Concatenate (purge,ds,ds2);
+fprintf (stdout, "\n\nMerged Data Set:\n", dsCombined);
+
+SetDialogPrompt ("Save resulting data set to:");
+DataSetFilter dsf = CreateFilter (dsCombined,1);
+
+fprintf (PROMPT_FOR_FILE,CLEAR_FILE,dsf);
diff --git a/res/TemplateBatchFiles/ModelSelectorAAProcessor.bf b/res/TemplateBatchFiles/ModelSelectorAAProcessor.bf
new file mode 100644
index 0000000..8cf9fda
--- /dev/null
+++ b/res/TemplateBatchFiles/ModelSelectorAAProcessor.bf
@@ -0,0 +1,377 @@
+/****************************************************
+
+ModelSelectorAAProcessor.bf
+
+Sergei L Kosakovsky Pond (sergeilkp at mac.com)
+October 2007
+
+This HyPhy batch file is to be used to process
+the output for GA codon model selection runs.
+
+****************************************************/
+
+
+ExecuteAFile (HYPHY_LIB_DIRECTORY + "TemplateBatchFiles" + DIRECTORY_SEPARATOR + "Utility" + DIRECTORY_SEPARATOR + "GrabBag.bf");
+/* need this include to process file paths */
+
+ExecuteAFile (HYPHY_LIB_DIRECTORY + "TemplateBatchFiles" + DIRECTORY_SEPARATOR + "Utility" + DIRECTORY_SEPARATOR + "DescriptiveStatistics.bf");
+
+
+SetDialogPrompt ("Locate the .details file produced by the GA:");
+fscanf 			(PROMPT_FOR_FILE, "Raw", detailedFile);
+
+pathParts  	= splitFilePath(LAST_FILE_PATH);
+dir_prefix	= pathParts["DIRECTORY"];
+file_name   = pathParts["FILENAME"];
+
+
+/* splitFilePath is defined in GrabBag.bf */
+
+/*
+sscanf (detailedFile, "String", aminoacidOrdering); 
+*/
+
+aminoacidOrdering = "ACDEFGHIKLMNPQRSTVWY";
+/* read the 0-19 to amino-acid code indexing string */
+
+modelCount 		= 0;  /* how many models have been read */
+credibleModels	= 0;  /* how many models are credible   */
+
+classMatrices 	= {}; /* stores class allocation matrices for each model  */
+rateMatrices  	= {}; /* matrices storing c-AIC and rate estimates */
+AICScores		= {}; /* the c-AIC score for every model */
+rateClasses		= {}; /* how many rate classes are there for each model */
+compressedRates = {};
+
+topNCount		= 10;
+bestScore		= 1e100;
+bestModelID		= 0;
+bestRates		= 0;
+byRateClass		= {}; 
+evidenceRCut	= 0.01; /* smallest evidence ratio against the best model to be 
+						   included in the credible set */
+						   
+stateVectorDimension = 190;
+
+/*-----------------------------------------------------------------------------*/
+
+fprintf (stdout, "[PHASE 1.] Parsing the .details file\n");
+
+/* first pass to determine the best AIC score
+   and to identify the criterion for inclusion in the credible set of models
+*/
+
+while (!END_OF_FILE)
+{
+	sscanf (detailedFile, "Number,NMatrix,NMatrix",modelAIC,classMatrix, rateInfo);
+	
+	/* check for the end-of-file condition */
+	modelRates = Rows(rateInfo);
+	if (modelRates == 0)
+	{
+		break;
+	}
+	
+	byRateClass [modelRates]   = byRateClass[modelRates] + 1;
+	
+	if (modelAIC < bestScore)
+	{
+		bestScore   = modelAIC;	
+		bestModelID = modelCount;
+		bestRates	= modelRates;
+	}
+	
+	modelCount 				   = modelCount + 1;
+	
+}
+
+ratesRead   = avlKeysToMatrix (byRateClass);
+scoreCutoff = bestScore-2*Log(evidenceRCut);
+fprintf (stdout, "\tRead ", modelCount, " models\n",
+				 "\tBest score = ", bestScore," achieved with ", bestRates, " rates\n",
+				 "\tScore cutoff of ", scoreCutoff, " to be included in the credible set at ", evidenceRCut, " level \n",
+				 "\t", Abs (byRateClass), " different rate counts\n"
+				 );
+				 
+				 
+for (k=0; k<Abs(byRateClass); k=k+1)
+{
+	fprintf (stdout, "\t", Format(byRateClass[ratesRead[k]],8,0), " models with ", Format(ratesRead[k],4,0), " rate classes\n");
+}
+
+/* hack to reset END_OF_FILE */
+
+sscanf (aminoacidOrdering,"String",k);
+
+/*-----------------------------------------------------------------------------*/
+
+fprintf (stdout, "[PHASE 2.] Building the set of credible models\n");
+
+checkAIC = {modelCount,1};
+counter2 = 0;
+
+modelCount = 0;
+byRateClass		= {}; 
+
+while (!END_OF_FILE)
+{
+	sscanf (detailedFile, "Number,NMatrix,NMatrix",modelAIC, classMatrix, rateInfo);
+	
+	/* check for the end-of-file condition */
+	modelRates = Rows(rateInfo);
+	if (modelRates == 0)
+	{
+		break;
+	}
+	checkAIC[counter2] = modelAIC;
+	
+	counter2 = counter2 + 1;
+	if (modelAIC <= scoreCutoff) /* model is in the credible set */
+	{
+		if (modelAIC == bestScore)
+		{
+			bestModelID = modelCount;
+			bestNRates  = rateInfo;
+		}
+		
+		AICScores[modelCount] 		= modelAIC;
+		qMatrix						= classMatrix;
+		
+		byRateClass [modelRates]   = byRateClass[modelRates] + 1;
+		compressedM 			   = {stateVectorDimension,1};
+		/* stateVectorDimension is the number of valid one-step substitution rates */
+
+		k3 = 0;
+		for (k=0; k<20; k=k+1)
+		{
+			classMatrix[k][k] = -1;
+			qMatrix    [k][k] = -1;
+			
+			for (k2=k+1; k2<20; k2=k2+1)
+			{
+				qMatrix[k][k2]  = rateInfo[qMatrix[k][k2]];
+				compressedM[k3] = qMatrix[k][k2];
+				k3 = k3+1;
+				qMatrix[k2][k] = qMatrix[k][k2];
+			}
+		}
+
+		compressedRates[modelCount]		    	= compressedM;
+		
+		if (modelAIC == bestScore)
+		{
+			bestModelByRate = {};
+			for (k=0; k<stateVectorDimension; k=k+1)
+			{
+				bestModelByRate [compressedM[k]] = bestModelByRate [compressedM[k]] + 1;
+			}
+		}
+
+		classMatrices[modelCount]   			= classMatrix;
+		rateMatrices[modelCount]				= qMatrix;
+		modelCount 				    			= modelCount + 1;
+	}
+}
+
+ratesRead   = avlKeysToMatrix (byRateClass);
+fprintf (stdout, "\tFound ", modelCount, " credible models\n",
+				 "\t", Abs (byRateClass), " different rate counts\n");
+				 
+topNCount = Min (topNCount, modelCount);
+				 
+for (k=0; k<Abs(byRateClass); k=k+1)
+{
+	fprintf (stdout, "\t", Format(byRateClass[ratesRead[k]],8,0), " models with ", Format(ratesRead[k],4,0), " rate classes\n");
+}
+
+fprintf (stdout, "\tThe best model has the following rate class assignments\n");
+for (k=0; k<Abs(bestModelByRate); k=k+1)
+{
+	fprintf (stdout, "\tRate ", Format(bestNRates[k],8,4), " with ", Format(bestModelByRate[bestNRates[k]],4,0), " substitutions\n");
+}
+
+bestMatrix 	  = classMatrices[bestModelID];
+
+DEFAULT_FILE_SAVE_NAME = file_name + ".best_matrix";
+ExportAMatrix ("bestMatrix","","Save the best-scoring matrix to:");
+
+/*-----------------------------------------------------------------------------*/
+
+fprintf (stdout, "[PHASE 3.] Computing a model averaged numerical matrix\n");
+
+scalingFactorSum = 1;
+modelAveragedM	 = {20,20};
+akaikeWeights	 = {modelCount,1};
+
+for (k=0; k<modelCount; k=k+1)
+{
+	akaikeWeight = Exp((bestScore-AICScores[k])*0.5);
+	modelAveragedM = modelAveragedM + rateMatrices[k] * akaikeWeight;
+	akaikeWeights [k] = akaikeWeight;
+}
+
+modelAveragedM = modelAveragedM * (1/(-modelAveragedM[0][0]));
+akaikeWeights  = akaikeWeights*(1/({1,modelCount}["1"]*akaikeWeights)[0]);
+
+DEFAULT_FILE_SAVE_NAME = file_name + ".ma_matrix";
+ExportAMatrix ("modelAveragedM","","Save the numerical model-averaged rate matrix to:");
+
+/*-----------------------------------------------------------------------------*/
+
+fprintf (stdout, "[PHASE 4.] Computing variability in rate assignments\n");
+
+DEFAULT_FILE_SAVE_NAME = file_name + "_reliability.csv";
+SerDialogPrompt ("Save the top-N model .csv to:");
+fprintf (PROMPT_FOR_FILE,CLEAR_FILE,KEEP_OPEN,"AA1,AA2,Mean,Median,2.5%,97.5%,Variance,COV,Unreliable\n");
+
+for (aa1=0;aa1<20;aa1=aa1+1)
+{
+	for (aa2=aa1+1;aa2<20;aa2=aa2+1)
+	{
+		rateInfo = {modelCount,1};
+		for (k=0; k<modelCount; k=k+1)
+		{
+			rateInfo[k] = (rateMatrices[k])[aa1][aa2];
+		}
+		stats = GatherDescriptiveStats (rateInfo);
+		fprintf (LAST_FILE_PATH,"\n",aminoacidOrdering[aa1],",",
+									 aminoacidOrdering[aa2],",",
+									 stats["Mean"],",",
+									 stats["Median"],",",
+									 stats["2.5%"],",",
+									 stats["97.5%"],",",
+									 stats["Variance"],",",
+									 stats["COV"],",",
+									 stats["COV"] > 0.1
+									 );
+	}
+}
+
+fprintf (LAST_FILE_PATH,CLOSE_FILE);
+
+
+/*-----------------------------------------------------------------------------*/
+
+fprintf (stdout, "[PHASE 5.] Computing a 4-category approximation\n");
+
+binByType = {stateVectorDimension,4};
+
+for (k=0; k<modelCount; k=k+1)
+{
+	compressedM = compressedRates[k];
+	myAW		= akaikeWeights  [k];
+	for (aa1=0;aa1<stateVectorDimension;aa1=aa1+1)
+	{
+		if (compressedM[aa1] <0.1)
+		{
+			binByType [aa1][0] = binByType [aa1][0] + myAW;
+		}
+		else{
+			if (compressedM[aa1] <0.5)
+			{
+				binByType [aa1][1] = binByType [aa1][1] + myAW;
+			}
+			else{
+				if (compressedM[aa1] <1.25)
+				{
+					binByType [aa1][2] = binByType [aa1][2] + myAW;
+				}
+				else
+				{
+					binByType [aa1][3] = binByType [aa1][3] + myAW;
+				}
+			}
+		}
+	}
+}
+
+globbedMatrix = {20,20};
+
+k = 0;
+for (aa1=0;aa1<20;aa1=aa1+1)
+{
+	for (aa2=aa1+1;aa2<20;aa2=aa2+1)
+	{
+		maxV = 0; maxI = 0;
+		for (k2=0; k2<4; k2=k2+1){if (binByType[k][k2]>maxV) {maxV = binByType[k][k2]; maxI = k2;}} 
+		globbedMatrix[aa1][aa2] = maxI; 
+		globbedMatrix[aa2][aa1] = maxI; 
+		k=k+1;
+	}
+}
+
+DEFAULT_FILE_SAVE_NAME = file_name + ".4_matrix";
+ExportAMatrix ("globbedMatrix","","Save the 4-class matrix to:");
+
+/*-----------------------------------------------------------------------------*/
+
+fprintf (stdout, "[PHASE 6.] Computing the list of rates derived from top ",topNCount," models\n");
+
+topNList = ({modelCount,2}["_MATRIX_ELEMENT_ROW_*(_MATRIX_ELEMENT_COLUMN_)+AICScores[_MATRIX_ELEMENT_ROW_]*(_MATRIX_ELEMENT_COLUMN_==0)"])%0;
+
+DEFAULT_FILE_SAVE_NAME = file_name + "_topModels.csv";
+SerDialogPrompt ("Save the top-N model .csv to:");
+fprintf (PROMPT_FOR_FILE,CLEAR_FILE,KEEP_OPEN,"AA1,AA2,Rate,Model_Rank\n");
+
+for (aa1=0;aa1<20;aa1=aa1+1)
+{
+	for (aa2=aa1+1;aa2<20;aa2=aa2+1)
+	{
+		for (k=0; k<topNCount; k=k+1)
+		{
+			fprintf (LAST_FILE_PATH,"\n",aminoacidOrdering[aa1],",",aminoacidOrdering[aa2],",",(rateMatrices[topNList[k][1]])[aa1][aa2],",",k+1);
+		}
+	}
+}
+fprintf (LAST_FILE_PATH,CLOSE_FILE);
+
+return 0;
+
+
+/*-----------------------------------------------------------------------------*/
+
+fprintf (stdout, "[PHASE 7.] Finding stable structures in the set of credible models\n");
+
+consensusStructure = {stateVectorDimension,stateVectorDimension}; 
+					/* only one step-substitutions */
+
+bestMatrix = compressedRates[bestModelID];
+
+consensusStructure = consensusStructure["bestMatrix[_MATRIX_ELEMENT_ROW_]==bestMatrix[_MATRIX_ELEMENT_COLUMN_]"];
+
+
+for (k=0; k<modelCount; k=k+1)
+{
+	/*matchCount 	   = ({1,stateVectorDimension}["1"]*(consensusStructure*{stateVectorDimension,1}["1"]))[0];
+	matchCount 	   = (matchCount-stateVectorDimension)/2;
+	fprintf (stdout, k, ":", matchCount, "\n");*/
+	if (k!=bestModelID)
+	{
+		bestMatrix = compressedRates[k];
+		consensusStructure = consensusStructure$consensusStructure["bestMatrix[_MATRIX_ELEMENT_ROW_]==bestMatrix[_MATRIX_ELEMENT_COLUMN_]"];
+	}
+}
+
+matchCount 	   = ({1,stateVectorDimension}["1"]*(consensusStructure*{stateVectorDimension,1}["1"]))[0];
+matchCount 	   = (matchCount-stateVectorDimension)/2;
+
+
+/*-----------------------------------------------------------------------------*/
+
+function ExportAMatrix (theMatrix&, fileName, theprompt)
+{
+	if (Abs(fileName) == 0)
+	{
+		SetDialogPrompt (theprompt);
+		fprintf (PROMPT_FOR_FILE, CLEAR_FILE, KEEP_OPEN);
+		fileName = LAST_FILE_PATH;
+	}
+	else
+	{
+		fprintf (fileName, CLEAR_FILE, KEEP_OPEN);
+	}
+	
+	fprintf (fileName, aminoacidOrdering, "\n", theMatrix, CLOSE_FILE);
+	return 0;
+	
+}
diff --git a/res/TemplateBatchFiles/ModelSelectorBranch.bf b/res/TemplateBatchFiles/ModelSelectorBranch.bf
new file mode 100644
index 0000000..da8638a
--- /dev/null
+++ b/res/TemplateBatchFiles/ModelSelectorBranch.bf
@@ -0,0 +1,745 @@
+startWithRateClasses	= 2;
+maxRateClasses			= 10;
+rateClassesCount 		= startWithRateClasses; 
+autoStepFlag	 		= 1;
+
+modelSpawnPrefix = "";
+modelSpawnPrefix * 128;
+modelSpawnSuffix = "";
+modelSpawnSuffix * 128;
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+produceOffspring		= MPI_NODE_COUNT-1;
+populationSize  		= 2*produceOffspring;
+incestDistance  		= 0;
+generationCount		  	= 5000;
+maxSampleTries			= populationSize*10;
+mutationThreshhold		= 0.0001;
+mutationProb			= 0.15;
+mutationProbDecrease	= 0.95;
+annealingPhase			= 100;
+SHORT_MPI_RETURN		= 1;
+totalSampleCounter		= 0;
+localMutationRate		= 0.05;
+localMutationInterval	= 20;
+
+stoppingCriterion		= 30;
+sampleCount				= 0;
+familyControlSize		= produceOffspring$6;
+
+predef   				= {};
+MasterList				= {};
+verboseFlag				= 0;
+stateVectorDimension    = 190;
+
+predef   				= {};
+
+
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function ExportAMatrix2 (fileName, rateMatrix, aic_score, rateAVL)
+{
+	fprintf (fileName, aic_score, "\n{");
+	for (kr=0; kr<Rows (rateMatrix); kr=kr+1)
+	{
+		fprintf (fileName, "{", rateAVL["NSR"+rateMatrix[kr]], "}\n");
+	}
+	fprintf (fileName, "}\n");
+	return 0;
+}
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function ExportAMatrix (fileName, rateMatrix, doClear)
+{
+	outString = "";
+	outString * 256;
+	outString * "branchAssignments={};\n";
+	for (nodeCounter = 0; nodeCounter < stateVectorDimension; nodeCounter = nodeCounter+1)
+	{
+		outString * ("branchAssignments[\""+branchNames[nodeCounter]+"\"] = " + rateMatrix[nodeCounter] + ";\n");
+	}
+	outString * 0;
+	if (doClear)
+	{
+		fprintf (fileName, CLEAR_FILE,outString);
+	}
+	else
+	{
+		fprintf (fileName,"\n",outString);
+	}
+	return 0;
+}
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function MatrixToString (rateMatrix)
+{
+	outString = "";
+	outString * 256;
+	for (h=0; h<stateVectorDimension; h=h+1)
+	{
+		outString * (","+rateMatrix[h]);				
+	}
+	outString * 0;
+	return outString;
+}
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function CleanUpMPI (dummy)
+{
+	if (MPI_NODE_COUNT>1)
+	{
+		while (1)
+		{
+			for (nodeCounter = 0; nodeCounter < MPI_NODE_COUNT-1; nodeCounter = nodeCounter+1)
+			{
+				if (MPINodeState[nodeCounter][0]==1)
+				{
+					fromNode = ReceiveJobs (0,0);
+					break;	
+				}
+			}
+			if (nodeCounter == MPI_NODE_COUNT-1)
+			{
+				break;
+			}
+		}			
+	}
+	return 0;
+}
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function ReceiveJobs (sendOrNot, ji)
+{
+	if (MPI_NODE_COUNT>1)
+	{
+		MPIReceive (-1, fromNode, result_String);
+		mji = MPINodeState[fromNode-1][1];
+		mdf	= MPINodeState[fromNode-1][2];
+		
+		if (sendOrNot)
+		{
+			MPISend (fromNode,msg2Send);
+			MPINodeState[fromNode-1][1] = ji;			
+			MPINodeState[fromNode-1][2] = modelDF;			
+		}
+		else
+		{
+			MPINodeState[fromNode-1][0] = 0;
+			MPINodeState[fromNode-1][1] = -1;		
+		}
+		ExecuteCommands (result_String);
+		myDF	  = lf_MLES[1][1] + baseParams - 1;
+		myAIC 	  = 2*(lf_MLES[1][0]-myDF*sampleCount/(sampleCount-myDF-1));
+		myLFScore = lf_MLES[1][0];
+		/*fprintf (stdout, myLFScore, " ", lf_MLES[1][1], " ", myAIC, "\n");*/
+		ji = mji;
+	}
+	else
+	{
+		myDF	  = modelDF + baseParams;
+		myAIC 	  = 2*(lf_MLES[1][0]-myDF*sampleCount/(sampleCount-myDF-1));
+		myLFScore = res[1][0];
+	}
+	
+	if (resultProcessingContext==0)
+	{
+		sortedScores[ji][0] = myAIC;
+	}
+	else
+	{
+		intermediateProbs[ji][0] = myAIC;	
+	}
+	if (ji>=0)
+	{
+		if (resultProcessingContext==0)
+		{
+			ExportAMatrix2 (detailedResultPath,StringToMatrix(currentPopulation[ji]),myAIC,lf_MLE_VALUES);
+			sortedBP = MatrixToString (currentPopulation[ji]);
+			MasterList [sortedBP] = myAIC;
+		}
+		else
+		{
+			ExportAMatrix2 (detailedResultPath,StringToMatrix(children[ji-populationSize]),myAIC,lf_MLE_VALUES);	
+			sortedBP = MatrixToString (children[ji-populationSize]);
+			MasterList [sortedBP] = myAIC;
+		}
+		
+		/*fprintf (fpath,"\n{{",myLFScore,",",-myAIC);
+		if (MPI_NODE_COUNT > 1)
+		{
+			for (spoolC = 0; spoolC < lf_MLES[1][1]; spoolC = spoolC + 1)
+			{
+				aVal = lf_MLE_VALUES["NSR"+spoolC];
+				fprintf (fpath,",",aVal);
+			}
+		}		
+		else
+		{
+			for (spoolC = 0; spoolC < lf_MLES[1][1]; spoolC = spoolC + 1)
+			{
+				execCommand = "fprintf(fpath,\",\",NSR"+spoolC+");";
+				ExecuteCommands (execCommand);
+			}
+		}
+		fprintf (fpath,"\n}}\n");*/
+
+		totalSampleCounter = totalSampleCounter + 1;
+	}
+	return fromNode-1;
+}
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function RunASample (modelDF, jobIndex)
+{
+	sampleString = MatrixToString (cString);
+	myAIC = MasterList[sampleString];
+	
+	if (myAIC < (-0.1))
+	{
+		if (resultProcessingContext==0)
+		{
+			sortedScores[jobIndex][0] = myAIC;
+		}
+		else
+		{
+			intermediateProbs[jobIndex][0] = myAIC;	
+		}			
+		return 0;
+	}
+		
+	msg2Send = "";
+	msg2Send * 128;
+	msg2Send * ("presetBranchParameters = "+currentBLEstimates+";bClasses="+cString+";");
+	
+	msg2Send * modelSpawnPrefix;
+	msg2Send * ("AC:="+AC+";\n");
+	msg2Send * ("AT:="+AT+";\n");
+	msg2Send * ("CG:="+CG+";\n");
+	msg2Send * ("CT:="+CT+";\n");
+	msg2Send * ("GT:="+GT+";\n");
+	msg2Send * modelSpawnSuffix;
+	msg2Send * 0;
+	
+	
+	if ((MPI_NODE_COUNT>1) && (jobIndex>=0))
+	{
+		for (mpiNode = 0; mpiNode < MPI_NODE_COUNT-1; mpiNode = mpiNode+1)
+		{
+			if (MPINodeState[mpiNode][0]==0)
+			{
+				break;	
+			}
+		}
+		if (mpiNode==MPI_NODE_COUNT-1)
+		{
+			mpiNode = ReceiveJobs (1,jobIndex);
+		}
+		else
+		{
+			MPISend (mpiNode+1,msg2Send);
+			MPINodeState[mpiNode][0] = 1;
+			MPINodeState[mpiNode][1] = jobIndex;
+			MPINodeState[mpiNode][2] = modelDF;
+		}
+	}
+	else
+	{
+		Optimize (res,lf);
+		if (jobIndex>=0)
+		{
+			mpiNode = ReceiveJobs (1, jobIndex);
+		}
+		else
+		{
+			myAIC 	  = 2*(res[1][0]-(baseParams+modelDF)*sampleCount/(sampleCount-baseParams-modelDF-1));
+		}
+	}
+	return 0;
+}
+
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+
+function BuildCodonFrequencies (obsF)
+{
+	PIStop = 1.0;
+	result = {ModelMatrixDimension,1};
+	hshift = 0;
+
+	for (h=0; h<64; h=h+1)
+	{
+		first = h$16;
+		second = h%16$4;
+		third = h%4;
+		if (_Genetic_Code[h]==10) 
+		{
+			hshift = hshift+1;
+			PIStop = PIStop-obsF[first][0]*obsF[second][1]*obsF[third][2];
+			continue; 
+		}
+		result[h-hshift][0]=obsF[first][0]*obsF[second][1]*obsF[third][2];
+	}
+	return result*(1.0/PIStop);
+}
+
+
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function SpawnRandomString (clsCnt)
+{
+	rModel = {stateVectorDimension,1};
+	for (h=0; h<stateVectorDimension; h=h+1)
+	{
+		rModel[h] = Random(0,clsCnt)$1;
+	}
+	
+	return MakeStringCanonical(rModel,clsCnt);
+}
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function MakeStringCanonical (randomModel, classCount)
+{
+	compressedString = {classCount,1};
+	for (h=0; h<stateVectorDimension; h=h+1)
+	{
+		v = randomModel[h];
+		compressedString[v] = 1;
+	}
+	compressedString[0] = 0;
+	for (h=1; h<classCount; h=h+1)
+	{
+		compressedString[h] = compressedString[h]+compressedString[h-1];
+	}
+	for (h=0; h<stateVectorDimension; h=h+1)
+	{
+		v = randomModel[h];
+		v = compressedString[v];
+		randomModel[h] = v;
+	}
+	v = compressedString[classCount-1]+1;
+	if (v>1)
+	{
+		sortedOrder = {v,2};
+		for (h=0; h<v; h=h+1)
+		{
+			sortedOrder[h][0] = -1;
+		}
+		cc = 0;
+		for (h=0; h<stateVectorDimension; h=h+1)
+		{
+			hshift = randomModel[h];
+			if (sortedOrder[hshift][0] < 0)
+			{
+				sortedOrder[hshift][0] = cc;
+				sortedOrder[hshift][1] = hshift;
+				cc = cc+1;
+			}
+		}
+		sortedOrder = sortedOrder%1;
+		for (h=0; h<stateVectorDimension; h=h+1)
+		{
+			v = randomModel[h];
+			randomModel[h] = sortedOrder[v][0];
+		}
+		
+	}
+	return randomModel;
+}
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function StringToMatrix (stringSpec)
+{
+	return stringSpec;
+}
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function IsChildViable (putativeChild)
+{
+	sampleString = MatrixToString (putativeChild);
+	myAIC = MasterList[sampleString];
+	testChild = putativeChild;
+	mutPassCount = 1;
+	while (myAIC < (-0.1))
+	{
+		if (verboseFlag)
+		{
+			fprintf (stdout,"Adjusting the child to avoid a duplicate. Pass ", mutPassCount, "\n");
+		}
+		
+		mutPassCount = mutPassCount + 1;
+		
+		sampleString = Min(Random(0,stateVectorDimension)$1,stateVectorDimension-1);
+		myAIC = testChild[sampleString];
+		
+		newValue = Random (0,rateClassesCount-0.0000001)$1;
+		
+		while (newValue == myAIC)
+		{
+			newValue = Random (0,rateClassesCount-0.0000001)$1;
+		}
+		
+		testChild [sampleString] = newValue;
+		sampleString = MatrixToString (testChild);
+		myAIC = MasterList[sampleString];
+	}
+	return testChild;
+}
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function UpdateBL (dummy)
+{
+	bestInd							= sortedScores[populationSize-1][1];
+	dNdSBranchClasses 				= StringToMatrix(currentPopulation[bestInd]);
+	MG94custom = 0;
+	MULTIPLY_BY_FREQS 				= PopulateModelMatrix ("MG94custom", observedFreq);
+	Model MG94customModel 			= (MG94custom,vectorOfFrequencies,0);
+
+	AC=AC;
+	AT=AT;
+	CG=CG;
+	CT=CT;
+	GT=GT;
+	
+	Tree givenTree				    = treeString;
+	ClearConstraints				(givenTree);
+	ReplicateConstraint 			("this1.?.synRate:=3*this2.?.t", givenTree, nucTree); 
+	ClearConstraints				(givenTree);
+	
+	bNames  	 = BranchName (givenTree,-1);
+	
+	definedOrNot = {};
+	for (brCount = 0; brCount < stateVectorDimension; brCount = brCount + 1)
+	{
+		cbc	= dNdSBranchClasses[brCount];
+		if (definedOrNot[cbc] == 0)
+		{
+			definedOrNot[cbc] = 0;
+			ExecuteCommands ("global NSR"+cbc+"=1;");
+		}
+		tn = bNames[brCount];
+		ExecuteCommands ("givenTree." + tn + ".nonSynRate:= NSR" + cbc + "*givenTree." + tn +".synRate;");
+	}
+	
+	LikelihoodFunction 				lf = (filteredData,givenTree);
+	
+	if (filteredData.species > 10 && filteredData.unique_sites/(MPI_NODE_COUNT) > 20)
+	{
+		AUTO_PARALLELIZE_OPTIMIZE		= 1;
+	}
+	if (verboseFlag)
+	{
+		VERBOSITY_LEVEL 			= 1;
+	}
+	Optimize 						(res,lf);
+	AUTO_PARALLELIZE_OPTIMIZE		= 0;	
+	VERBOSITY_LEVEL 				= 0;
+	
+	AC:=AC__;
+	AT:=AT__;
+	CG:=CG__;
+	CT:=CT__;
+	GT:=GT__;
+
+	currentBLEstimates 						= BranchLength (givenTree,-1)*3;
+	myDF									= res[1][1] + 9;	
+	myAIC 	  								 = 2*(res[1][0]-myDF*sampleCount/(sampleCount-myDF-1));
+	fprintf									 (stdout, "\nUpdated BLs\nAICs: ", -myAIC, "\t",  -sortedScores[populationSize-1][0], "\n", lf, "\n");
+	sortedScores[populationSize-1][0] 		 = myAIC;
+	MasterList[sampleString] 				 = myAIC;
+	
+	return 0;
+}
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+incFileName = HYPHY_LIB_DIRECTORY+"TemplateBatchFiles"+DIRECTORY_SEPARATOR+"TemplateModels"+DIRECTORY_SEPARATOR+"chooseGeneticCode.def";
+ExecuteCommands  ("#include \""+incFileName+"\";");
+
+
+SetDialogPrompt 	  		  ("Locate a codon file:");
+DataSet 		ds  		 = ReadDataFile (PROMPT_FOR_FILE);
+DataSetFilter	filteredData = CreateFilter(ds,3,"","",GeneticCodeExclusions);
+
+fscanf			("_BMS_Aux.ibf", "Raw", sampleCount);
+ExecuteCommands (sampleCount);
+modelSpawnPrefix * sampleCount;
+modelSpawnPrefix * ("DataSet 	ds  = ReadDataFile (\"" + LAST_FILE_PATH + "\");\n");
+modelSpawnPrefix * ("GeneticCodeExclusions = \"" + GeneticCodeExclusions + "\";\n");
+modelSpawnPrefix * ("_Genetic_Code = " + _Genetic_Code + ";\n");
+modelSpawnPrefix * ("DataSetFilter	filteredData = CreateFilter(ds,3,\"\",\"\",GeneticCodeExclusions);\n");
+modelSpawnPrefix * 0;
+
+
+fprintf						  (stdout, "Model string for nucleotide biases:");
+fscanf						  (stdin,"String",modelDesc);
+
+sampleCount 				 = filteredData.sites;
+
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+
+global AC = 1;
+global AT = 1;
+global CG = 1;
+global CT = 1;
+global GT = 1;
+
+catCounterAL = {stateVectorDimension,1};
+
+MGCustomRateBiasTerms = {{"AC*","","AT*","CG*","CT*","GT*"}};	
+
+		
+paramCount	   = 0;
+_nucBiasTerms  = {4,4};
+
+_nucBiasTerms[0][0] = "";
+
+
+if (modelDesc[0]==modelDesc[1])
+{
+	MGCustomRateBiasTerms[0] = MGCustomRateBiasTerms[1];
+}
+
+_nucBiasTerms[1][0] = MGCustomRateBiasTerms[0];
+_nucBiasTerms[0][1] = MGCustomRateBiasTerms[0];
+_nucBiasTerms[2][0] = MGCustomRateBiasTerms[1];
+_nucBiasTerms[0][2] = MGCustomRateBiasTerms[1];
+
+h = 0;
+v = 3;
+
+for (customLoopCounter2=2; customLoopCounter2<6; customLoopCounter2=customLoopCounter2+1)
+{
+	for (customLoopCounter=0; customLoopCounter<customLoopCounter2; customLoopCounter=customLoopCounter+1)
+	{
+		if (modelDesc[customLoopCounter]==modelDesc[customLoopCounter2])
+		{
+			_nucBiasTerms[h][v] = MGCustomRateBiasTerms[customLoopCounter];
+			_nucBiasTerms[v][h] = MGCustomRateBiasTerms[customLoopCounter];
+			break;
+		}
+	}
+	if (customLoopCounter == customLoopCounter2)
+	{
+		_nucBiasTerms[h][v] = MGCustomRateBiasTerms[customLoopCounter2];
+		_nucBiasTerms[v][h] = MGCustomRateBiasTerms[customLoopCounter2];
+	}
+	
+	v = v+1;
+	if (v==4)
+	{
+		h=h+1;
+		v=h+1;
+	}
+}
+
+_nucRateMatrix = {4,4};
+
+modelSpawnPrefix * ("_nucBiasTerms = {4,4};_nucBiasTerms[0][0] = \"\";\n");
+
+for (customLoopCounter = 0; customLoopCounter < 4; customLoopCounter = customLoopCounter + 1)
+{
+	for (customLoopCounter2 = customLoopCounter+1; customLoopCounter2 < 4; customLoopCounter2 = customLoopCounter2 + 1)
+	{
+		ExecuteCommands ("_nucRateMatrix[" + customLoopCounter  + "][" + customLoopCounter2 + "]:=" + _nucBiasTerms[customLoopCounter][customLoopCounter2] + "t;");
+		ExecuteCommands ("_nucRateMatrix[" + customLoopCounter2 + "][" + customLoopCounter  + "]:=" + _nucBiasTerms[customLoopCounter2][customLoopCounter] + "t;");
+		modelSpawnPrefix * ("_nucBiasTerms[" + customLoopCounter + "][" + customLoopCounter2 + "] = \"" + _nucBiasTerms[customLoopCounter][customLoopCounter2] + "\";");
+		modelSpawnPrefix * ("_nucBiasTerms[" + customLoopCounter2 + "][" + customLoopCounter + "] = \"" + _nucBiasTerms[customLoopCounter2][customLoopCounter] + "\";");
+	}
+}
+
+
+DataSetFilter	nucFilter = CreateFilter(ds,1);
+HarvestFrequencies (nucFreq,nucFilter,1,1,1);
+Model 	nucModel = (_nucRateMatrix,nucFreq,1);
+
+incFileName = HYPHY_LIB_DIRECTORY+"TemplateBatchFiles"+DIRECTORY_SEPARATOR+"queryTree.bf";
+ExecuteAFile (incFileName);
+
+Tree 	nucTree = treeString;
+
+branchNames 		 = BranchName (nucTree,-1);
+stateVectorDimension = Columns (branchNames)-1;
+
+fprintf (stdout, "\nA total of ", stateVectorDimension, " branches\n");
+fprintf (stdout, "\nFitting a nucleotide model to approximate branch lengths...\n");
+
+LikelihoodFunction lf = (nucFilter,nucTree);
+Optimize (nuc_res,lf);
+
+currentBLEstimates   = BranchLength (nucTree,-1) * 3;
+
+fprintf (stdout, "\n", lf, "\n");
+
+HarvestFrequencies (observedFreq,filteredData,3,1,1);
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+SetDialogPrompt ("Save the best model to:");
+fprintf (PROMPT_FOR_FILE,CLEAR_FILE);
+modelFile = LAST_FILE_PATH;
+
+detailedResultPath = modelFile+".details";
+fprintf 		  (detailedResultPath,CLEAR_FILE,KEEP_OPEN,treeString,"\n");
+
+dNdSBranchClasses = {stateVectorDimension,1};
+
+MG94plain = 0;
+MULTIPLY_BY_FREQS 				= PopulateModelMatrix ("MG94plain", observedFreq);
+vectorOfFrequencies 			= BuildCodonFrequencies (observedFreq);
+modelSpawnPrefix 				* ("observedFreq = " + observedFreq + ";\n");
+modelSpawnPrefix 				* ("vectorOfFrequencies = " + vectorOfFrequencies + ";\n");
+modelSpawnPrefix				* ("global AC = 1; global AT = 1; global CG = 1; global CT = 1; global GT = 1;\n");
+modelSpawnPrefix				* 0;
+
+
+
+Model MG94plainmodel	 		= (MG94plain,vectorOfFrequencies,0);
+
+
+/*treeString	   =   DATAFILE_TREE;*/
+Tree givenTree =   treeString;
+
+modelSpawnSuffix *	("MULTIPLY_BY_FREQS = PopulateModelMatrix (\"MG94custom\", observedFreq);\n");
+modelSpawnSuffix *  ("Model MG94customModel = (MG94custom,vectorOfFrequencies,0);\n");
+modelSpawnSuffix *	("Tree givenTree2 = " + treeString + ";\n");
+modelSpawnSuffix *	("replicateBranchLengths (0);\nLikelihoodFunction lf = (filteredData,givenTree2);\n");
+modelSpawnSuffix *	("Optimize (lf_MLES,lf);\nreturn makeReturnValue(0);\n");
+modelSpawnSuffix *  0;
+
+global 		   codonBranchScaler = 1;
+ReplicateConstraint ("this1.?.synRate:=3*this2.?.t", givenTree, nucTree); 
+ClearConstraints(givenTree);
+LikelihoodFunction lf = (filteredData,givenTree);
+
+ChoiceList (matingChoice, "Mating Weights",1,SKIP_NONE,
+			"Akaike Weights","Individuals are chosen to reproduce with based on their Akaike weights.",
+			"Equiprobable", "All individuals are equally likely to mate.",
+			"Rank","Mating probabilities are proportional to the c-AIC rank of the individual",
+			"Random","One of the three mating schemes in picked at random for every generation");
+
+if (matingChoice<0)
+{
+	return 0;
+}
+
+ChoiceList (reprFlag, "Mating Representation",1,SKIP_NONE,
+			"General","Use n-ary representation (n=number of rate classes).",
+			"Binary", "Use binary representation");
+
+if (reprFlag<0)
+{
+	return 0;
+}
+
+
+currentPopulation  = {};
+USE_LAST_RESULTS=1;
+if (verboseFlag)
+{
+	VERBOSITY_LEVEL 				= 1;
+}
+if (filteredData.species > 10 && filteredData.unique_sites/(MPI_NODE_COUNT) > 20)
+{
+	AUTO_PARALLELIZE_OPTIMIZE		= 1;
+}
+
+global NS0 = 1;
+ReplicateConstraint ("this1.?.nonSynRate:=NS0*this2.?.synRate", givenTree, givenTree);
+
+Optimize (res,lf);
+AUTO_PARALLELIZE_OPTIMIZE = 0;
+
+currentBLEstimates   = BranchLength (givenTree,-1)*3;
+
+VERBOSITY_LEVEL  = 0;
+USE_LAST_RESULTS = 0;
+
+
+
+baseParams 		   = res[1][1]+9;
+fprintf (stdout, "\nBase model has ", baseParams, " parameters\n", lf);
+crapAIC			   = -2*(res[1][0]-baseParams*sampleCount/(sampleCount-baseParams-1));
+sortedScores	   = {populationSize,2};
+sortedScores[0][0] = -crapAIC;
+sortedScores[0][1] = 0;
+currentPopulation [0] = {stateVectorDimension,1};
+
+AC:=AC__;
+AT:=AT__;
+CG:=CG__;
+CT:=CT__;
+GT:=GT__;
+
+
+/* INCLUDE THE CHC CORE */
+
+ibfPath = HYPHY_LIB_DIRECTORY + "TemplateBatchFiles" + DIRECTORY_SEPARATOR + "GA_CHC.ibf";
+
+
+byBPImprovement		  = {};
+byBPImprovement[0]    = crapAIC;
+bestIndividualOverall = sortedScores[0][0];
+currentBEST_IC		  = crapAIC;
+
+maxRateClasses		  = Min(maxRateClasses,stateVectorDimension);
+
+for (currentBPC = startWithRateClasses; currentBPC < maxRateClasses; currentBPC = currentBPC + 1)
+{
+	rateClassesCount 		= currentBPC;
+	fprintf (stdout, "\n\nStarting GA with ", rateClassesCount, " rate classes\n");
+	addOnLine = " with " + rateClassesCount + " rate classes.";
+	
+	if (currentBPC > startWithRateClasses)
+	{
+		children = {};
+		individual = 0;
+		
+		for (individual=populationSize $ 2; individual<populationSize-1; individual=individual+1)
+		{
+			cString    = currentPopulation[populationSize-1];
+			toggleRate = Random (0,stateVectorDimension-0.00001)$1;
+			cString [toggleRate] = currentBPC-1;
+			cString 						= MakeStringCanonical(cString,rateClassesCount);
+			cString							= IsChildViable (cString);
+			sortedScores[individual][1] 	= individual;
+			currentPopulation[individual] 	= cString;
+			RunASample (compressedString[rateClassesCount-1],individual);
+		}
+	}
+	
+	
+	mutationProb = 0.15;
+	ExecuteAFile (ibfPath);
+	
+	kf						 = -sortedScores[populationSize-1][0];
+	
+	if (currentBEST_IC > kf)
+	{
+		currentBEST_IC = kf;
+	}
+	else
+	{
+		break;
+	}
+}
+
+
+/* try a consensus matrix */
+
+UpdateBL (0);
+ExportAMatrix (modelFile,StringToMatrix(currentPopulation[populationSize-1]),1);
+fprintf (detailedResultPath, CLOSE_FILE);
diff --git a/res/TemplateBatchFiles/ModelSelectorCodon.bf b/res/TemplateBatchFiles/ModelSelectorCodon.bf
new file mode 100644
index 0000000..2809fc2
--- /dev/null
+++ b/res/TemplateBatchFiles/ModelSelectorCodon.bf
@@ -0,0 +1,998 @@
+fprintf (stdout, "\nStart with this many rate classes:");
+fscanf  (stdin,  "Number", startWithRateClasses);
+
+rateClassesCount = startWithRateClasses; 
+autoStepFlag	 = 1;
+maxRateClasses   = 75;
+modelSpawnPrefix = "";
+modelSpawnPrefix * 128;
+modelSpawnSuffix = "";
+modelSpawnSuffix * 128;
+whichIC			 = 0;
+
+orderString				= "FLIMVSPTAYHQNKDECWRG";
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+produceOffspring		= MPI_NODE_COUNT-1;
+populationSize  		= 2*produceOffspring;
+incestDistance  		= 0;
+generationCount		  	= 5000;
+maxSampleTries			= populationSize*10;
+mutationThreshhold		= 0.0001;
+mutationProb			= 0.15;
+mutationProbDecrease	= 0.95;
+annealingPhase			= 100;
+SHORT_MPI_RETURN		= 1;
+totalSampleCounter		= 0;
+localMutationRate		= 0.05;
+localMutationInterval	= 20;
+
+stoppingCriterion		= 50;
+sampleCount				= 0;
+familyControlSize		= produceOffspring$6;
+
+predef   				= {};
+
+MasterList				= {};
+verboseFlag				= 0;
+stateVectorDimension    = 190;
+branchUpdateThreshold   = 50;
+
+predef   = {};
+/* charge  */
+predef[0] = {{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 0, 0, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 0, 0, 1, 1, 0, 1, 0, 1, 1, 0, 0, 0, 1, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1,  [...]
+/* polarity  */
+predef[1] = {{ 1, 1, 1, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1,  [...]
+/* polairty and size */
+predef[2] = {{ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 1, 1, 0,  [...]
+predef   = {};
+
+modelComplexityPenalty = 0;
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function StirlingNumberOf2ndKind (N,k)
+{
+	SN  :< 1e300;
+	kF	:< 1e300;
+	CF  :< 1e300;
+	
+	SN  = 0;
+	kF  = 1;
+	m1t = 1;
+	CF	= 1;
+	
+	for (i=0; i<k; i=i+1)
+	{
+		SN = SN + m1t*CF*(k-i)^N;
+		m1t = -m1t;
+		CF	= CF * (k-i)/(i+1);
+		kF = kF*(i+1);
+	}
+	
+	return SN/kF;
+}
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function returnIC (logL, df, sampleCount)
+{
+	if (whichIC)
+	{
+		return -2*logL + 2 * Log(sampleCount) * df + modelComplexityPenalty;
+	}
+	return -2*logL + 2*df * (sampleCount/(sampleCount-df-1));
+}
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function ExportAMatrix (fileName, rateMatrix, doClear, doOrderString)
+{
+	outString = "";
+	outString * 256;
+	
+	if (doOrderString)
+	{
+		outString * orderString;
+	}
+	
+	outString * "\n{";
+	for (h=0; h<21; h=h+1)
+	{
+		if (h!=10)
+		{
+			outString * "\n{";
+			for (v=0; v<h; v=v+1)
+			{
+				if (v!=10)
+				{
+					if (v)
+					{
+						outString * (","+rateMatrix[h][v]);
+					}
+					else
+					{
+						outString * (""+rateMatrix[h][v]);				
+					}
+				}
+			}
+			if (v)
+			{
+				outString * ",*";
+			}
+			else
+			{
+				outString * "*";				
+			}
+			for (v=h+1; v<21; v=v+1)
+			{
+				if (v!=10)
+				{
+					outString * (","+rateMatrix[h][v]);				
+				}
+			}
+			outString * "}";
+		}
+	}
+	outString * "\n}";
+	outString * 0;
+	if (doClear)
+	{
+		fprintf (fileName, CLEAR_FILE,outString);
+	}
+	else
+	{
+		fprintf (fileName,"\n",outString);
+	}
+	return 0;
+}
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function MatrixToString (rateMatrix)
+{
+	outString = "";
+	outString * 256;
+	for (h=0; h<stateVectorDimension; h=h+1)
+	{
+		outString * (","+rateMatrix[h]);				
+	}
+	outString * 0;
+	return outString;
+}
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function CleanUpMPI (dummy)
+{
+	if (MPI_NODE_COUNT>1)
+	{
+		while (1)
+		{
+			for (nodeCounter = 0; nodeCounter < MPI_NODE_COUNT-1; nodeCounter = nodeCounter+1)
+			{
+				if (MPINodeState[nodeCounter][0]==1)
+				{
+					fromNode = ReceiveJobs (0,0);
+					break;	
+				}
+			}
+			if (nodeCounter == MPI_NODE_COUNT-1)
+			{
+				break;
+			}
+		}			
+	}
+	return 0;
+}
+
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function ReceiveJobs (sendOrNot, ji)
+{
+	if (MPI_NODE_COUNT>1)
+	{
+		MPIReceive (-1, fromNode, result_String);
+		mji = MPINodeState[fromNode-1][1];
+		mdf	= MPINodeState[fromNode-1][2];
+		
+		if (sendOrNot)
+		{
+			MPISend (fromNode,msg2Send);
+			
+			/*
+			fprintf ("lastm.in", CLEAR_FILE, msg2Send);
+			*/
+			
+			MPINodeState[fromNode-1][1] = ji;			
+			MPINodeState[fromNode-1][2] = modelDF;			
+		}
+		else
+		{
+			MPINodeState[fromNode-1][0] = 0;
+			MPINodeState[fromNode-1][1] = -1;		
+		}
+		ExecuteCommands (result_String);
+		/*
+		fprintf ("last.in", CLEAR_FILE, result_String);
+		*/
+		myDF	  = lf_MLES[1][1] + baseParams - 1;
+		myAIC 	  = -returnIC (lf_MLES[1][0],myDF,sampleCount);
+		myLFScore = lf_MLES[1][0];
+		ji = mji;
+	}
+	else
+	{
+		myDF	  = modelDF + baseParams;
+		myAIC 	  = -returnIC (lf_MLES[1][0],myDF,sampleCount);
+		myLFScore = res[1][0];
+	}
+	
+	if (resultProcessingContext==0)
+	{
+		sortedScores[ji][0] = myAIC;
+	}
+	else
+	{
+		intermediateProbs[ji][0] = myAIC;	
+	}
+	if (ji>=0)
+	{
+		if (resultProcessingContext==0)
+		{
+			ExportAMatrix (detailsOutputFile,StringToMatrix(currentPopulation[ji]),0,0);
+			sortedBP = MatrixToString (currentPopulation[ji]);
+			MasterList [sortedBP] = myAIC;
+		}
+		else
+		{
+			ExportAMatrix (detailsOutputFile,StringToMatrix(children[ji-populationSize]),0,0);	
+			sortedBP = MatrixToString (children[ji-populationSize]);
+			MasterList [sortedBP] = myAIC;
+		}
+		
+		fprintf (detailsOutputFile,"\n{{",Format(myLFScore,25,10),",",myDF,",",Format(-myAIC,25,10));
+		if (MPI_NODE_COUNT > 1)
+		{
+			for (spoolC = 0; spoolC < lf_MLES[1][1]; spoolC = spoolC + 1)
+			{
+				aVal = lf_MLE_VALUES["NSR"+spoolC];
+				fprintf (detailsOutputFile,",",aVal);
+			}
+		}		
+		else
+		{
+			for (spoolC = 0; spoolC < lf_MLES[1][1]; spoolC = spoolC + 1)
+			{
+				execCommand = "fprintf(detailsOutputFile,\",\",NSR"+spoolC+");";
+				ExecuteCommands (execCommand);
+			}
+		}
+		fprintf (detailsOutputFile,"}}\n");
+
+		totalSampleCounter = totalSampleCounter + 1;
+	}
+	return fromNode-1;
+}
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function RunASample (modelDF, jobIndex)
+{
+	sampleString = MatrixToString (cString);
+	myAIC = MasterList[sampleString];
+	
+	if (myAIC < (-0.1))
+	{
+		if (resultProcessingContext==0)
+		{
+			sortedScores[jobIndex][0] = myAIC;
+		}
+		else
+		{
+			intermediateProbs[jobIndex][0] = myAIC;	
+		}			
+		return 0;
+	}
+		
+	msg2Send = "";
+	msg2Send * 128;
+	msg2Send * ("aaRateMultipliers = " + aaRateMultipliers + ";\n");
+	msg2Send * ("mgPlainFactor = \"" + mgPlainFactor + "\";\n");
+	msg2Send * ("presetBranchParameters = {}\n;");
+	
+	for (treeCount = 1; treeCount <= dataPartsRead; treeCount = treeCount + 1)
+	{
+		ExecuteCommands ("tcn = TipCount (codon_tree_"+treeCount+")-1; bcn = BranchCount (codon_tree_"+treeCount+")-1;");
+		msg2Send * ("presetBranchParameters["+treeCount+"] = {}\n;");
+		for (brCount = tcn; brCount >= 0; brCount = brCount - 1)
+		{
+			ExecuteCommands("tn = TipName (codon_tree_"+treeCount+", brCount);");
+			ExecuteCommands ("ssr = codon_tree_"+treeCount+"." + tn + ".synRate;");
+			msg2Send * ("(presetBranchParameters["+treeCount+"])[\"" + tn + "\"] = " + ssr + ";\n");
+		}
+		for (brCount = bcn; brCount >= 0; brCount = brCount - 1)
+		{
+			ExecuteCommands("tn = BranchName (codon_tree_"+treeCount+", brCount);");
+			ExecuteCommands ("ssr = codon_tree_"+treeCount+"." + tn + ".synRate;");
+			msg2Send * ("(presetBranchParameters["+treeCount+"])[\"" + tn + "\"] = " + ssr + ";\n");
+		}
+	}
+	
+	msg2Send * modelFreqSpec;
+	msg2Send * modelSpawnPrefix;
+	msg2Send * ("AC:="+AC+";\n");
+	msg2Send * ("AT:="+AT+";\n");
+	msg2Send * ("CG:="+CG+";\n");
+	msg2Send * ("CT:="+CT+";\n");
+	msg2Send * ("GT:="+GT+";\n");
+	msg2Send * modelSpawnSuffix;
+	msg2Send * 0;
+	
+	/* fprintf ("last.sent", CLEAR_FILE, msg2Send); */
+	
+	if ((MPI_NODE_COUNT>1) && (jobIndex>=0))
+	{
+		for (mpiNode = 0; mpiNode < MPI_NODE_COUNT-1; mpiNode = mpiNode+1)
+		{
+			if (MPINodeState[mpiNode][0]==0)
+			{
+				break;	
+			}
+		}
+		if (mpiNode==MPI_NODE_COUNT-1)
+		{
+			mpiNode = ReceiveJobs (1,jobIndex);
+		}
+		else
+		{
+			MPISend (mpiNode+1,msg2Send);
+			MPINodeState[mpiNode][0] = 1;
+			MPINodeState[mpiNode][1] = jobIndex;
+			MPINodeState[mpiNode][2] = modelDF;
+		}
+	}
+	else
+	{
+		Optimize (res,lf);
+		if (jobIndex>=0)
+		{
+			mpiNode = ReceiveJobs (1, jobIndex);
+		}
+		else
+		{
+			myAIC 	  = -returnIC (res[1][0],modelDF,sampleCount);
+ 		}
+	}
+	return 0;
+}
+
+
+
+
+
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function SpawnRandomString (clsCnt)
+{
+	rModel = {stateVectorDimension,1};
+	for (h=0; h<stateVectorDimension; h=h+1)
+	{
+		rModel[h] = Random(0,clsCnt)$1;
+	}
+	
+	return MakeStringCanonical(rModel,clsCnt);
+}
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function MakeStringCanonical (randomModel, classCount)
+{
+	compressedString = {classCount,1};
+	for (h=0; h<stateVectorDimension; h=h+1)
+	{
+		v = randomModel[h];
+		compressedString[v] = 1;
+	}
+	compressedString[0] = 0;
+	for (h=1; h<classCount; h=h+1)
+	{
+		compressedString[h] = compressedString[h]+compressedString[h-1];
+	}
+	for (h=0; h<stateVectorDimension; h=h+1)
+	{
+		v = randomModel[h];
+		v = compressedString[v];
+		randomModel[h] = v;
+	}
+	v = compressedString[classCount-1]+1;
+	if (v>1)
+	{
+		sortedOrder = {v,2};
+		for (h=0; h<v; h=h+1)
+		{
+			sortedOrder[h][0] = -1;
+		}
+		cc = 0;
+		for (h=0; h<stateVectorDimension; h=h+1)
+		{
+			hshift = randomModel[h];
+			if (sortedOrder[hshift][0] < 0)
+			{
+				sortedOrder[hshift][0] = cc;
+				sortedOrder[hshift][1] = hshift;
+				cc = cc+1;
+			}
+		}
+		sortedOrder = sortedOrder%1;
+		for (h=0; h<stateVectorDimension; h=h+1)
+		{
+			v = randomModel[h];
+			randomModel[h] = sortedOrder[v][0];
+		}
+		
+	}
+	return randomModel;
+}
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function StringToMatrix (stringSpec)
+{
+	matrixSpec = {21,21};
+	cc = 0;
+	
+	for (h=0; h<21; h=h+1)
+	{
+		for (v=h+1; v<21; v=v+1)
+		{
+			m_idx   = {{h,v}};
+			map_idx = mapUpTo2121[m_idx];
+			if (map_idx>0)
+			{
+				map_idx = 0+stringSpec[map_idx - 1];
+				matrixSpec[h][v] = map_idx;
+				matrixSpec[v][h] = map_idx;
+			}
+ 		}
+	}
+	return matrixSpec;
+}
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function IsChildViable (putativeChild)
+{
+	sampleString 	= MatrixToString (putativeChild);
+	myAIC 			= MasterList[sampleString];
+	testChild 		= putativeChild;
+	mutPassCount 	= 1;
+
+	partStringsMain  = {};
+	partStringsChild = {};
+	
+	for (_lc = 0; _lc < populationSize && myAIC > (-0.1); _lc = _lc + 1)
+	{
+		if (Rows (currentPopulation[_lc]))
+		{
+			if (partStringsMain[_lc] == 0)
+			{
+				partStringsMain[_lc] = MatrixToString (currentPopulation[_lc]);
+			}
+			myAIC = -(sampleString == partStringsMain[_lc]);
+		}
+	} 
+	for (_lc = 0; _lc < Abs(children) && myAIC > (-0.1); _lc = _lc + 1)
+	{
+		if (Rows (children[_lc]))
+		{	
+			if (partStringsChild[_lc] == 0)
+			{
+				partStringsChild [_lc] = MatrixToString (children[_lc]);
+			}
+			myAIC = -(sampleString == partStringsChild [_lc]);
+		}
+	} 
+
+	while (myAIC < (-0.1))
+	{
+		if (verboseFlag)
+		{
+			fprintf (stdout,"Adjusting the child to avoid a duplicate. Pass ", mutPassCount, "\n");
+		}
+		
+		mutPassCount = mutPassCount + 1;
+		
+		sampleString = Min(Random(0,stateVectorDimension)$1,stateVectorDimension-1);
+		myAIC 		 = testChild[sampleString];
+		
+		newValue 	 = Random (0,rateClassesCount-0.0000001)$1;
+		
+		while (newValue == myAIC)
+		{
+			newValue = Random (0,rateClassesCount-0.0000001)$1;
+		}
+		
+		testChild [sampleString] = newValue;
+		sampleString 			 = MatrixToString (testChild);
+		myAIC 					 = MasterList[sampleString];
+
+		if (myAIC > (-0.1))
+		{
+			for (_lc = 0; _lc < populationSize && myAIC > (-0.1); _lc = _lc + 1)
+			{
+				if (Rows (currentPopulation[_lc]))
+				{
+					myAIC = -(sampleString == partStringsMain[_lc]);
+				}
+			} 
+			for (_lc = 0; _lc < Abs(children) && myAIC > (-0.1); _lc = _lc + 1)
+			{
+				if (Rows (children[_lc]))
+				{	
+					myAIC = -(sampleString == partStringsChild [_lc]);
+				}
+			} 
+		
+		}
+	}
+	return testChild;
+}
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function UpdateBL (dummy)
+{
+	bestInd							= sortedScores[populationSize-1][1];
+	aaRateMultipliers 				= StringToMatrix(currentPopulation[bestInd]);
+	MULTIPLY_BY_FREQS 				= PopulateModelMatrix ("MG94MLEFREQS", paramFreqs,1);
+	Model MG94MLEFREQS_MODEL	    = ( MG94MLEFREQS, paramCodonFreqs, 0);
+
+	AC=AC;
+	AT=AT;
+	CG=CG;
+	CT=CT;
+	GT=GT;
+	
+	populateTrees ("codon_tree", dataPartsRead);
+	for (k=1; k<=dataPartsRead; k=k+1)
+	{
+		ExecuteCommands("ReplicateConstraint (\"this1.?.synRate:=3*this2.?.t\", codon_tree_"+k+", nuc_tree_"+k+");ClearConstraints(codon_tree_"+k+");");
+	}
+	ExecuteCommands(constructLF("lf","filteredData","codon_tree",dataPartsRead));
+	if (verboseFlag)
+	{
+		VERBOSITY_LEVEL 			= 1;
+	}
+	Optimize 						(res,lf);
+	VERBOSITY_LEVEL 				= 0;
+	
+	AC:=AC__;
+	AT:=AT__;
+	CG:=CG__;
+	CT:=CT__;
+	GT:=GT__;
+	
+	for (k = 0; k < 4; k = k+1)
+	{
+		for (p = 0; p < 3; p=p+1)
+		{
+			ExecuteCommands ("positionFrequencies[k][p] = " + paramFreqs[k][p]);
+		}
+	}
+		
+	vectorOfFrequencies                     = BuildCodonFrequencies (positionFrequencies);
+	modelFreqSpec							= "observedFreq = " + positionFrequencies + ";\nvectorOfFrequencies = " + vectorOfFrequencies + ";\n";
+	global									 mgPlainFactor = FindBranchLengthExpression(0,"MG94MLEFREQS");
+	
+	myLFScore								 = res[1][0];
+	myDF									 = res[1][1];	
+	myAIC 	  								 = -returnIC(res[1][0],myDF,sampleCount);
+	
+	fprintf									 (stdout, "\nUpdated BLs\nDF=", myDF,"\nDelta IC = ", Format(myAIC-sortedScores[populationSize-1][0],20,5), "\n", lf, "\n", positionFrequencies, "\n", mgPlainFactor, "\n");
+	sortedScores[populationSize-1][0] 		 = myAIC;
+	MasterList[sampleString] 				 = myAIC;
+			
+	ExportAMatrix (detailsOutputFile,StringToMatrix(currentPopulation[bestInd]),0,0);	
+	fprintf (detailsOutputFile,"\n{{",Format(myLFScore,25,10),",",myDF,",",Format(-myAIC,25,10));
+
+	for (spoolC = 0; spoolC <= myDF-baseParams; spoolC = spoolC + 1)
+	{
+		execCommand = "fprintf(detailsOutputFile,\",\",NSR"+spoolC+");";
+		ExecuteCommands (execCommand);
+	}
+	fprintf (detailsOutputFile,"}}\n");	
+
+	return 0;
+}
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+ExecuteAFile ("_MSCOneStep.ibf");
+
+fprintf (stdout, "\n", stateVectorDimension, " one step reachable states\n");
+
+ExecuteAFile 	("_MFReader_.ibf");
+
+dataPartsRead = fileCount;
+
+/* 
+data sets will be in ds_ID
+nuc filters 				- nucData_ID
+codon filters				- filteredData_ID
+trees 						- treeStrings[ID]
+   
+ID ranges from 1 to dataPartsRead
+*/
+
+/* print some temp files - one per part */
+
+if (Abs (_cmsShared) == 0)
+{
+	fscanf			("_CMS_Aux.ibf", "Raw", _cmsShared);
+}
+ExecuteCommands   (_cmsShared);
+modelSpawnPrefix * _cmsShared;
+modelSpawnPrefix * ("GeneticCodeExclusions = \"" + GeneticCodeExclusions + "\";\n");
+modelSpawnPrefix * ("_Genetic_Code = " + _Genetic_Code + ";\n");
+
+
+baseDataPath = LAST_FILE_PATH;
+for (k=1; k<=dataPartsRead; k=k+1)
+{
+	h				 				= baseDataPath + "." + k;
+	DATAFILE_TREE 					= treeStrings[k];
+	IS_TREE_PRESENT_IN_DATA 		= 1;
+	
+	ExecuteCommands ("fprintf (h, CLEAR_FILE, filteredData_" + k+ ");");
+	modelSpawnPrefix * ("DataSet 	ds_"+k+"  = ReadDataFile (\"" + h + "\");\n");
+	modelSpawnPrefix * ("DataSetFilter	filteredData_"+k+" = CreateFilter(ds_"+k+",3,\"\",\"\",GeneticCodeExclusions);\n");
+}
+
+modelSpawnPrefix * 0;
+
+
+fprintf						  (stdout, "\nModel string for nucleotide biases:");
+fscanf						  (stdin,"String",modelDesc);
+
+ExecuteAFile("Utility/GrabBag.bf");
+icSampleSizeMultiplier = prompt_for_a_value ("Select the sample size multiplier (x the number of characters)", 1, 0.1, 2.0, 0);
+
+
+sampleCount 				 = totalCharCount*icSampleSizeMultiplier;
+fprintf						  (stdout, "Using ", sampleCount, " as a sample count.\n");
+
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+
+global AC = 1;
+global AT = 1;
+global CG = 1;
+global CT = 1;
+global GT = 1;
+
+catCounterAL = {stateVectorDimension,1};
+
+MGCustomRateBiasTerms = {{"AC*","","AT*","CG*","CT*","GT*"}};	
+
+		
+paramCount	   = 0;
+_nucBiasTerms  = {4,4};
+
+_nucBiasTerms[0][0] = "";
+
+
+if (modelDesc[0]==modelDesc[1])
+{
+	MGCustomRateBiasTerms[0] = MGCustomRateBiasTerms[1];
+}
+
+_nucBiasTerms[1][0] = MGCustomRateBiasTerms[0];
+_nucBiasTerms[0][1] = MGCustomRateBiasTerms[0];
+_nucBiasTerms[2][0] = MGCustomRateBiasTerms[1];
+_nucBiasTerms[0][2] = MGCustomRateBiasTerms[1];
+
+h = 0;
+v = 3;
+
+for (customLoopCounter2=2; customLoopCounter2<6; customLoopCounter2=customLoopCounter2+1)
+{
+	for (customLoopCounter=0; customLoopCounter<customLoopCounter2; customLoopCounter=customLoopCounter+1)
+	{
+		if (modelDesc[customLoopCounter]==modelDesc[customLoopCounter2])
+		{
+			_nucBiasTerms[h][v] = MGCustomRateBiasTerms[customLoopCounter];
+			_nucBiasTerms[v][h] = MGCustomRateBiasTerms[customLoopCounter];
+			break;
+		}
+	}
+	if (customLoopCounter == customLoopCounter2)
+	{
+		_nucBiasTerms[h][v] = MGCustomRateBiasTerms[customLoopCounter2];
+		_nucBiasTerms[v][h] = MGCustomRateBiasTerms[customLoopCounter2];
+	}
+	
+	v = v+1;
+	if (v==4)
+	{
+		h=h+1;
+		v=h+1;
+	}
+}
+
+_nucRateMatrix = {4,4};
+
+modelSpawnPrefix * ("_nucBiasTerms = {4,4};_nucBiasTerms[0][0] = \"\";\n");
+
+for (customLoopCounter = 0; customLoopCounter < 4; customLoopCounter = customLoopCounter + 1)
+{
+	for (customLoopCounter2 = customLoopCounter+1; customLoopCounter2 < 4; customLoopCounter2 = customLoopCounter2 + 1)
+	{
+		ExecuteCommands ("_nucRateMatrix[" + customLoopCounter  + "][" + customLoopCounter2 + "]:=" + _nucBiasTerms[customLoopCounter][customLoopCounter2] + "t;");
+		ExecuteCommands ("_nucRateMatrix[" + customLoopCounter2 + "][" + customLoopCounter  + "]:=" + _nucBiasTerms[customLoopCounter2][customLoopCounter] + "t;");
+		modelSpawnPrefix * ("_nucBiasTerms[" + customLoopCounter + "][" + customLoopCounter2 + "] = \"" + _nucBiasTerms[customLoopCounter][customLoopCounter2] + "\";");
+		modelSpawnPrefix * ("_nucBiasTerms[" + customLoopCounter2 + "][" + customLoopCounter + "] = \"" + _nucBiasTerms[customLoopCounter2][customLoopCounter] + "\";");
+	}
+}
+
+
+fprintf (stdout, "\nFitting a nucleotide model to approximate branch lengths...\n");
+Model 	nucModel = (_nucRateMatrix,overallFrequencies,1);
+
+populateTrees ("nuc_tree", dataPartsRead);
+ExecuteCommands(constructLF ("lf","nucData","nuc_tree",dataPartsRead));
+
+Optimize (nuc_res,lf);
+
+fprintf (stdout, "\n", lf, "\n");
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+SetDialogPrompt ("Save the best model to:");
+fprintf (PROMPT_FOR_FILE,CLEAR_FILE);
+modelFile = LAST_FILE_PATH;
+
+detailsOutputFile = modelFile+".details";
+fprintf (detailsOutputFile,CLEAR_FILE,KEEP_OPEN,orderString,"\n");
+
+aaRateMultipliers = {21,21};
+
+
+icSampleSizeMultiplier = 1.0;
+
+ChoiceList (whichIC, "Which IC to use for scoring?",1,SKIP_NONE,
+			"c-AIC","Small sample AIC.",
+			"BIC", "BIC.");
+
+if (whichIC<0)
+{
+	return 0;
+}
+
+
+ChoiceList (matingChoice, "Mating Weights",1,SKIP_NONE,
+			"Akaike Weights","Individuals are chosen to reproduce with based on their Akaike weights.",
+			"Equiprobable", "All individuals are equally likely to mate.",
+			"Rank","Mating probabilities are proportional to the c-AIC rank of the individual",
+			"Random","One of the three mating schemes in picked at random for every generation");
+
+if (matingChoice<0)
+{
+	return 0;
+}
+
+ChoiceList (seedChoice, "Seeds",1,SKIP_NONE,
+			"Random","The entire starting population is seeded at random.",
+			"Load", "Load some predefined partitions",
+			"Completely Random","The entire starting population is seeded at random, skipping even hardwired presets."
+);
+
+if (seedChoice<0)
+{
+	return 0;
+}
+
+if (seedChoice == 2)
+{
+	predef = {};
+}
+
+ChoiceList (reprFlag, "Mating Representation",1,SKIP_NONE,
+			"General","Use n-ary representation (n=number of rate classes).",
+			"Binary", "Use binary representation");
+
+if (reprFlag<0)
+{
+	return 0;
+}
+
+if (seedChoice == 1)
+{
+	SetDialogPrompt ("File with partition specifications:");
+	END_OF_FILE = 0;
+	k = Abs(predef);
+	fscanf (PROMPT_FOR_FILE,"NMatrix",seeds);
+	predef[Abs(predef)] = seeds;
+	while (!END_OF_FILE)
+	{
+		fscanf (LAST_FILE_PATH,"NMatrix",seeds);
+		if (Abs(seeds))
+		{
+			predef[Abs(predef)] = seeds;
+		}
+	}
+	fprintf (stdout, "Loaded ", Abs(predef) - k, " model definitions\n");
+}
+
+
+
+
+observedFreq					= positionFrequencies;
+ConstructParametricFrequencies	 (positionFrequencies);
+PopulateModelMatrix				 ("MG94MLEFREQS",paramFreqs,1);
+BuildParametricCodonFrequencies	  (paramFreqs,"paramCodonFreqs");
+ 
+Model MG94MLEFREQS_MODEL	= ( MG94MLEFREQS, paramCodonFreqs, 0);
+
+populateTrees			("codon_tree", dataPartsRead);
+ 
+for (k=1; k<=dataPartsRead; k=k+1)
+{
+	ExecuteCommands("ReplicateConstraint (\"this1.?.synRate:=3*this2.?.t\", codon_tree_"+k+", nuc_tree_"+k+");ClearConstraints(codon_tree_"+k+");");
+}
+
+ExecuteCommands(constructLF ("lf","filteredData","codon_tree",dataPartsRead));
+
+currentPopulation  = {};
+USE_LAST_RESULTS=1;
+if (verboseFlag)
+{
+	VERBOSITY_LEVEL 				= 1;
+}
+Optimize (res,lf);
+
+fprintf  (stdout, lf);
+
+for (k = 0; k < 4; k = k+1)
+{
+	for (p = 0; p < 3; p=p+1)
+	{
+		ExecuteCommands ("positionFrequencies[k][p] = " + paramFreqs[k][p]);
+	}
+}
+	
+vectorOfFrequencies                     = BuildCodonFrequencies (positionFrequencies);
+mgPlainFactor							= FindBranchLengthExpression(0,"MG94MLEFREQS");
+fprintf									(stdout, positionFrequencies, "\n", mgPlainFactor,"\n");
+
+/*
+MULTIPLY_BY_FREQS                       = PopulateModelMatrix ("MG94plain", positionFrequencies,0);
+*/
+
+modelFreqSpec							= "observedFreq = " + positionFrequencies + ";\nvectorOfFrequencies = " + vectorOfFrequencies + ";\n";
+modelSpawnPrefix						* ("global AC = 1; global AT = 1; global CG = 1; global CT = 1; global GT = 1;\n");
+modelSpawnPrefix						* 0;
+modelSpawnSuffix						* ("MULTIPLY_BY_FREQS = PopulateModelMatrix (\"MG94custom\", observedFreq,0);\n");
+modelSpawnSuffix						* ("Model MG94customModel = (MG94custom,vectorOfFrequencies,0);\n");
+
+for (k=1; k<=dataPartsRead; k=k+1)
+{
+	modelSpawnSuffix *	("Tree codon_tree_"+k+" = " + treeStrings[k] + ";\n");
+	modelSpawnSuffix *	("replicateBranchLengths ("+k+");");
+}
+
+modelSpawnSuffix *	("\nExecuteCommands(constructLF(\"lf\",\"filteredData\",\"codon_tree\","+dataPartsRead+"));\nOptimize (lf_MLES,lf);\nreturn makeReturnValue(0);\n");
+modelSpawnSuffix *  0;
+
+
+VERBOSITY_LEVEL = 0;
+USE_LAST_RESULTS=0;
+
+
+baseParams 		   = res[1][1];
+fprintf 			(stdout, "\nBase model has ", baseParams, " parameters\n", lf);
+crapAIC			   = returnIC (res[1][0], baseParams, sampleCount);
+
+sortedScores	   = {populationSize,2};
+sortedScores[0][0] = -crapAIC;
+sortedScores[0][1] = 0;
+currentPopulation [0] = {stateVectorDimension,1};
+
+ExportAMatrix (detailsOutputFile,StringToMatrix(currentPopulation[0]),0,0);
+fprintf		  (detailsOutputFile,"\n{{",Format(res[1][0],25,10),",",baseParams,",",Format(crapAIC,25,10));
+ExecuteCommands ("fprintf(detailsOutputFile,\",\",NSR0);");
+fprintf (detailsOutputFile,"}}\n");
+
+
+AC:=AC__;
+AT:=AT__;
+CG:=CG__;
+CT:=CT__;
+GT:=GT__;
+
+
+
+
+/* INCLUDE THE CHC CORE */
+
+if (reprFlag)
+{
+	ibfPath = HYPHY_LIB_DIRECTORY + "TemplateBatchFiles" + DIRECTORY_SEPARATOR + "GA_CHC_Binary.ibf";
+}
+else
+{
+	ibfPath = HYPHY_LIB_DIRECTORY + "TemplateBatchFiles" + DIRECTORY_SEPARATOR + "GA_CHC.ibf";
+}
+
+byBPImprovement		  = {};
+byBPImprovement[0]    = crapAIC;
+bestIndividualOverall = sortedScores[0][0];
+currentBEST_IC		  = crapAIC;
+
+
+for (currentBPC = startWithRateClasses; currentBPC < maxRateClasses; currentBPC = currentBPC + 1)
+{
+	rateClassesCount 		= currentBPC;
+	fprintf (stdout, "\n\nStarting GA with ", rateClassesCount, " rate classes\n");
+	addOnLine = " with " + rateClassesCount + " rate classes.";
+	
+	/*
+	modelComplexityPenalty = Log(StirlingNumberOf2ndKind (stateVectorDimension, currentBPC));
+	*/
+	
+	fprintf (stdout, "[INFO: MODEL COMPLEXITY PENALTY TERM SET TO ", modelComplexityPenalty, "]\n");
+	
+	if (currentBPC > startWithRateClasses)
+	{
+		children = {};
+		for (individual=populationSize $ 2; individual<populationSize-1; individual=individual+1)
+		{
+			cString    = currentPopulation[individual];
+			toggleRate = Random (0,currentBPC-1.00001)$1;
+			for (bitP = 0; bitP < stateVectorDimension; bitP = bitP + 1)
+			{
+				if (cString [bitP] == toggleRate)
+				{
+					if (Random(0,1)<0.5)
+					{
+						cString [bitP] = currentBPC-1;
+					}
+				}
+			}
+			cString = MakeStringCanonical(cString,currentBPC);
+			aaRateMultipliers = StringToMatrix(cString);
+			sortedScores[individual][1] = individual;
+			currentPopulation[individual] = cString;
+			RunASample (compressedString[rateClassesCount-1],individual);
+		}
+	}	
+	
+	mutationProb = 0.15;
+	ExecuteCommands ("#include \"" + ibfPath + "\";");
+	
+	kf						 = -sortedScores[populationSize-1][0];
+	
+	if (currentBEST_IC > kf)
+	{
+		currentBEST_IC = kf;
+	}
+	else
+	{
+		break;
+	}
+}
+
+
+/* try a consensus matrix */
+
+ExportAMatrix (modelFile,StringToMatrix(currentPopulation[populationSize-1]),1,1);
+fpath = modelFile+".bestAIC";
+
+fprintf (fpath, CLEAR_FILE, -sortedScores[populationSize-1][0]);
+fprintf (detailsOutputFile,CLOSE_FILE);
+
+
diff --git a/res/TemplateBatchFiles/ModelSelectorCodon.ibf b/res/TemplateBatchFiles/ModelSelectorCodon.ibf
new file mode 100644
index 0000000..d09ab6c
--- /dev/null
+++ b/res/TemplateBatchFiles/ModelSelectorCodon.ibf
@@ -0,0 +1,44 @@
+_codonModelTableDefinitions = 
+{
+
+"DATASET": {"ID":					"INTEGER PRIMARY KEY UNIQUE", 
+			  "IMPORT_PATH":		"TEXT",
+			  "SEQUENCES":			"INTEGER",
+			  "SITES":				"INTEGER",
+			  "PARTITIONS":			"INTEGER",
+			  "GENETIC_CODE":		"INTEGER",
+			  "CHECKSUM":			"INTEGER",
+			  "DESCRIPTION":		"TEXT"
+			 },
+
+"PARTITIONS": {"ID":				"INTEGER",
+			   "PARTITION_INDEX":	"INTEGER",
+			   "ALIGNMENT":			"TEXT",
+			   "TREE":				"TEXT"},
+			   
+"MODEL_STATS": {"ID":				"INTEGER",
+				"TOTAL" :			"INTEGER",
+				"CREDIBLE":			"INTEGER",
+				"CLOUD10" :			"INTEGER",
+				"CLOUD5":			"INTEGER",
+				"CLOUD1":			"INTEGER",
+				"TWO":				"INTEGER",
+				"THREE":			"INTEGER",
+				"FOUR":				"INTEGER",
+				"FIVE":				"INTEGER",
+				"SIX":				"INTEGER",
+				"SEVEN":			"INTEGER",
+				"EIGHT":			"INTEGER",
+				"NINE":				"INTEGER",
+				"TENPLUS":			"INTEGER"},
+			   
+"BEST_MODELS": {"ID":				"INTEGER",
+				"RESIDUE1":			"CHAR",
+				"RESIDUE2":			"CHAR",
+				"BEST_CLASS":		"INTEGER",
+				"AVERAGED_CLASS":	"REAL",
+			 	"BINNED_CLASS":		"INTEGER",
+				"CONSENSUS_CLASS":  "INTEGER"	
+			   }
+			   
+};
diff --git a/res/TemplateBatchFiles/ModelSelectorCodonProcessor.bf b/res/TemplateBatchFiles/ModelSelectorCodonProcessor.bf
new file mode 100644
index 0000000..9784dff
--- /dev/null
+++ b/res/TemplateBatchFiles/ModelSelectorCodonProcessor.bf
@@ -0,0 +1,945 @@
+/****************************************************
+
+ModelSelectorCodonProcessor.bf
+
+Sergei L Kosakovsky Pond (sergeilkp at mac.com)
+May 2007-Aug 2009
+
+This HyPhy batch file is to be used to process
+the output for GA codon model selection runs.
+
+****************************************************/
+
+_BF_RESULTS = {};
+
+
+ExecuteAFile  ("ModelSelectorCodon.ibf");
+
+
+
+/****************************************************/
+
+autoSave = 1; /* do not prompt the user for file names */
+
+ExecuteAFile (HYPHY_LIB_DIRECTORY + "TemplateBatchFiles" + DIRECTORY_SEPARATOR + "Utility" + DIRECTORY_SEPARATOR + "DBTools.ibf");
+/* need this include to generate output tables file paths */
+
+ExecuteAFile (HYPHY_LIB_DIRECTORY + "TemplateBatchFiles" + DIRECTORY_SEPARATOR + "Utility" + DIRECTORY_SEPARATOR + "GrabBag.bf");
+/* need this include to process file paths */
+
+ExecuteAFile (HYPHY_LIB_DIRECTORY + "TemplateBatchFiles" + DIRECTORY_SEPARATOR + "Utility" + DIRECTORY_SEPARATOR + "DescriptiveStatistics.bf");
+
+ExecuteAFile (HYPHY_LIB_DIRECTORY + "TemplateBatchFiles" + DIRECTORY_SEPARATOR + "_MSCOneStep.ibf");
+/* need this include to determine all 1-to-1 substitutions */
+
+ExecuteAFile(HYPHY_LIB_DIRECTORY+"TemplateBatchFiles"+DIRECTORY_SEPARATOR+"Utility"+DIRECTORY_SEPARATOR+"PostScript.bf");
+	
+lcapFile = HYPHY_LIB_DIRECTORY+"TemplateBatchFiles"+DIRECTORY_SEPARATOR+"TemplateModels"+DIRECTORY_SEPARATOR+"EmpiricalAA" + DIRECTORY_SEPARATOR+"LCAP";
+fscanf (lcapFile,"NMatrix,NMatrix,NMatrix,NMatrix,NMatrix", lcap1,lcap2,lcap3,lcap4,lcap5);
+
+
+/*SetDialogPrompt   ("Locate the database file to create/add to:");
+resultsDatabase = _openCacheDB ("");
+
+if (_TableExists (resultsDatabase,"DATASET"))
+{*/
+
+	SetDialogPrompt ("Locate the .details file produced by the GA:");
+	fscanf 			(PROMPT_FOR_FILE, "Raw", detailedFile);
+
+	pathParts		= splitFilePath(LAST_FILE_PATH);
+	dir_prefix		= pathParts["DIRECTORY"];
+	file_name		= pathParts["FILENAME"];
+
+
+	/* splitFilePath is defined in GrabBag.bf */
+
+	sscanf (detailedFile, "String", aminoacidOrdering); 
+	/* read the 0-19 to amino-acid code indexing string */
+
+	modelCount 		= 0;  /* how many models have been read */
+	credibleModels	= 0;  /* how many models are credible   */
+
+	classMatrices 	= {}; /* stores class allocation matrices for each model  */
+	rateMatrices  	= {}; /* matrices storing c-AIC and rate estimates */
+	AICScores		= {}; /* the c-AIC score for every model */
+	rateClasses		= {}; /* how many rate classes are there for each model */
+	compressedRates = {};
+
+	topNCount		= 10;
+	bestScore		= 1e100;
+	bestModelID		= 0;
+	bestRates		= 0;
+	byRateClass		= {}; 
+	evidenceRCut	= 0.01; /* smallest evidence ratio against the best model to be 
+							   included in the credible set */
+
+	/*-----------------------------------------------------------------------------*/
+
+	fprintf (stdout, "[PHASE 1.] Parsing the .details file\n");
+
+	/* first pass to determine the best AIC score
+	   and to identify the criterion for inclusion in the credible set of models
+	*/
+	
+	byRateBestIC = {};
+
+	ScoreProfile = {};
+	
+	while (!END_OF_FILE)
+	{
+		sscanf (detailedFile, "NMatrix,NMatrix",classMatrix, rateInfo);
+		
+		/* check for the end-of-file condition */
+		rateCount = Columns(rateInfo);
+		if (rateCount == 0)
+		{
+			break;
+		}
+		
+		modelAIC				   = rateInfo[2];
+		modelRates				   = Columns(rateInfo)-3;
+		if (byRateBestIC[modelRates] == 0)
+		{
+			byRateBestIC[modelRates] = rateInfo[0];
+		}
+		else
+		{
+			byRateBestIC[modelRates] = Max(rateInfo[0],byRateBestIC[modelRates]);
+		}
+		byRateClass [modelRates]   = byRateClass[modelRates] + 1;
+		
+		if (modelAIC < bestScore)
+		{
+			bestScore   = modelAIC;	
+			bestModelID = modelCount;
+			bestRates	= modelRates;
+		}
+		
+		ScoreProfile[modelCount]   = modelAIC;
+		modelCount 				   = modelCount + 1;
+		
+	}
+	
+	ScoreProfileM = avlToMatrix ("ScoreProfile"); ScoreProfile = 0;
+
+	ratesRead   = avlKeysToMatrix (byRateClass);
+	scoreCutoff = bestScore-2*Log(evidenceRCut);
+	fprintf (stdout, "\tRead ", modelCount, " models\n",
+					 "\tBest score = ", Format(bestScore,15,4), " achieved with ", bestRates, " rates\n",
+					 "\tScore cutoff of ", scoreCutoff, " to be included in the credible set at ", evidenceRCut, " level \n",
+					 "\t", Abs (byRateClass), " different rate counts\n"
+					 );
+					 
+	
+	_BF_RESULTS ["TOTAL MODEL COUNT"]				= modelCount;
+	_BF_RESULTS ["BEST MODEL SCORE"]				= Format(bestScore,15,4);
+	_BF_RESULTS ["BEST MODEL RATE COUNT"]			= bestRates;
+	_BF_RESULTS ["SCORE CUTOFF"]					= evidenceRCut;
+					 				 
+	for (k=0; k<Abs(byRateClass); k=k+1)
+	{
+		fprintf (stdout, "\t", Format(byRateClass[ratesRead[k]],8,0), " models with ", Format(ratesRead[k],4,0), " rate classes\n");
+	}
+	
+	sscanf (detailedFile, REWIND, "String", k); 
+
+	/*-----------------------------------------------------------------------------*/
+
+	fprintf (stdout, "[PHASE 2.] Building the set of credible models\n");
+
+	modelCount = 0;
+	byRateClass		= {}; 
+
+	while (!END_OF_FILE)
+	{
+		sscanf (detailedFile, "NMatrix,NMatrix",classMatrix, rateInfo);
+		
+		/* check for the end-of-file condition */
+		rateCount = Columns(rateInfo);
+		if (rateCount == 0)
+		{
+			break;
+		}
+		modelAIC				   		= rateInfo[2];
+		if (modelAIC <= scoreCutoff) /* model is in the credible set */
+		{
+			if (modelAIC == bestScore)
+			{
+				bestModelID = modelCount;
+				bestNRates  = rateInfo;
+			}
+			
+			AICScores[modelCount] 		= modelAIC;
+			qMatrix						= classMatrix;
+			
+			modelRates				   = Columns(rateInfo)-3;
+			byRateClass [modelRates]   = byRateClass[modelRates] + 1;
+			compressedM 			   = {stateVectorDimension,1};
+			/* stateVectorDimension is the number of valid one-step substitution rates */
+
+			k3 = 0;
+			for (k=0; k<20; k=k+1)
+			{
+				classMatrix[k][k] = -1;
+				qMatrix    [k][k] = -1;
+				
+				for (k2=k+1; k2<20; k2=k2+1)
+				{
+					if (isOneStepSub[k][k2])
+					{
+						qMatrix[k][k2]  = rateInfo[3+qMatrix[k][k2]];
+						compressedM[k3] = qMatrix[k][k2];
+						k3 = k3+1;
+					}
+					else
+					{
+						qMatrix[k][k2]     = -1;
+						classMatrix[k][k2] = -1;
+						classMatrix[k2][k] = -1;
+					}
+					qMatrix[k2][k] = qMatrix[k][k2];
+				}
+			}
+
+			compressedRates[modelCount]		    	= compressedM;
+			
+			if (modelAIC == bestScore)
+			{
+				bestModelByRate     = {};
+				bestCompressedMR    = {stateVectorDimension,1};
+				
+				k3 = 0;
+				for (k=0; k<20; k=k+1)
+				{
+					for (k2=k+1; k2<20; k2=k2+1)
+					{
+						if (isOneStepSub[k][k2])
+						{
+							bestCompressedMR[k3] = classMatrix[k][k2];
+							k3 = k3+1;
+						}
+						qMatrix[k2][k] = qMatrix[k][k2];
+					}
+				}
+					
+				for (k=0; k<stateVectorDimension; k=k+1)
+				{
+					bestModelByRate [compressedM[k]] = bestModelByRate [compressedM[k]] + 1;
+				}
+				
+			}
+
+			classMatrices[modelCount]   			= classMatrix;
+			rateMatrices[modelCount]				= qMatrix;
+			modelCount 				    			= modelCount + 1;
+		}
+	}
+
+	ratesRead   = avlKeysToMatrix (byRateClass);
+	fprintf (stdout, "\tFound ", modelCount, " credible models\n",
+					 "\t", Abs (byRateClass), " different rate counts\n");
+					 
+
+	_BF_RESULTS ["CREDIBLE MODELS"]					= modelCount;
+	_BF_RESULTS ["ONE STEP SUBSTITUTIONS"]			= stateVectorDimension;
+	
+	
+		
+	for (k=0; k<Abs(byRateClass); k=k+1)
+	{
+		fprintf (stdout, "\t", Format(byRateClass[ratesRead[k]],8,0), " models with ", Format(ratesRead[k],4,0), " rate classes\n");
+		fprintf (stdout, "\t Best model score in this class: ", byRateBestIC[ratesRead[k]], "\n");
+	}
+
+	fprintf (stdout, "\tThe best model has the following rate class assignments\n");
+	for (k=0; k<Abs(bestModelByRate); k=k+1)
+	{
+		fprintf (stdout, "\tRate ", Format(bestNRates[k+3],8,4), " with ", Format(bestModelByRate[bestNRates[k+3]],4,0), " substitutions\n");
+	}
+
+	bestClassMatrix 	  = classMatrices[bestModelID];
+	bestRateMatrix		  = rateMatrices [bestModelID];
+
+	DEFAULT_FILE_SAVE_NAME = file_name + ".best_matrix";
+	ExportAMatrix ("bestClassMatrix","","Save the best-scoring matrix to:");
+
+	/*-----------------------------------------------------------------------------*/
+
+	fprintf (stdout, "[PHASE 3.] Computing a model averaged numerical matrix\n");
+
+	scalingFactorSum = 1;
+	modelAveragedM	 = {20,20};
+	akaikeWeights	 = {modelCount,1};
+
+	for (k=0; k<modelCount; k=k+1)
+	{
+		akaikeWeight = Exp((bestScore-AICScores[k])*0.5);
+		modelAveragedM = modelAveragedM + rateMatrices[k] * akaikeWeight;
+		akaikeWeights [k] = akaikeWeight;
+	}
+
+	modelAveragedM = modelAveragedM * (1/(-modelAveragedM[0][0]));
+	akaikeWeights  = akaikeWeights*(1/({1,modelCount}["1"]*akaikeWeights)[0]);
+
+
+	_BF_RESULTS ["BEST MATRIX"]						= {};
+	
+	//aminoacidOrdering;
+	k3 = 0;
+	
+	for (k=0; k<20; k=k+1)
+	{
+		for (k2=k+1; k2<20; k2=k2+1)
+		{
+			if (isOneStepSub[k][k2])
+			{
+				thisRecord = {"FROM": aminoacidOrdering[k], "TO": aminoacidOrdering[k2], 
+							  "CLASS": bestCompressedMR[k3],
+							  "NUMERIC": bestNRates [bestCompressedMR[k3]+3],
+							  "AVERAGED": modelAveragedM [k][k2]};
+				_BF_RESULTS ["BEST MATRIX"] + thisRecord;			
+				k3 = k3+1;
+			}
+			qMatrix[k2][k] = qMatrix[k][k2];
+		}
+	}
+				
+	DEFAULT_FILE_SAVE_NAME = file_name + ".ma_matrix";
+	ExportAMatrix ("modelAveragedM","","Save the numerical model-averaged rate matrix to:");
+
+	DEFAULT_FILE_SAVE_NAME = file_name + ".ma_matrix.ps";
+	SerDialogPrompt ("Save the PS plot for the model-averaged rate matrixto:");
+	if (autoSave)
+	{
+		fileName = dir_prefix + DEFAULT_FILE_SAVE_NAME;
+		fprintf (fileName,CLEAR_FILE);	
+	}
+	else
+	{
+		fprintf (PROMPT_FOR_FILE,CLEAR_FILE);
+		fileName = LAST_FILE_PATH;
+	}
+	
+	fprintf (fileName, rateMatrixToPS (aminoacidOrdering, modelAveragedM, "model-averaged model"));
+
+
+	/*-----------------------------------------------------------------------------*/
+
+	polarity = {};
+	charge   = {};
+	stanfel	 = {};
+	
+	storeProfile ("charge","RHK",1);
+	storeProfile ("charge","DE",-1);
+	storeProfile ("charge","ANCQGILMFPSTWYV",0);
+	
+	storeProfile ("polarity","RNDCQEGHKSTY",1);
+	storeProfile ("polarity","AILMFPWV",0);
+	
+	storeProfile ("stanfel","ACGILMPSTV",1);
+	storeProfile ("stanfel","DENQ",2);
+	storeProfile ("stanfel","FWY",3);
+	storeProfile ("stanfel","HKR",4);
+
+	fprintf (stdout, "[PHASE 4.] Computing rates vs structure assignments\n");
+
+	DEFAULT_FILE_SAVE_NAME = file_name + "_reliability.csv";
+	SerDialogPrompt ("Save the top-N model .csv to:");
+	if (autoSave)
+	{
+		fileName = dir_prefix + DEFAULT_FILE_SAVE_NAME;
+		fprintf (fileName,CLEAR_FILE,KEEP_OPEN,"AA1,AA2,Structural,Averaged,StanfelChange,PolarityChange,ChargeChange,ChemicalComposition,Polarity,Volume,IsoelectricPoint,Hydropathy");	
+	}
+	else
+	{
+		fprintf (PROMPT_FOR_FILE,CLEAR_FILE,KEEP_OPEN,"AA1,AA2,Structural,Averaged,StanfelChange,PolarityChange,ChargeChange,ChemicalComposition,Polarity,Volume,IsoelectricPoint,Hydropathy");
+		fileName = LAST_FILE_PATH;
+	}
+	for (aa1=0;aa1<20;aa1=aa1+1)
+	{
+		for (aa2=aa1+1;aa2<20;aa2=aa2+1)
+		{
+			if (isOneStepSub[aa1][aa2])
+			{
+				stats = GatherDescriptiveStats (rateInfo);
+				aal1 = aminoacidOrdering[aa1];
+				aal2 = aminoacidOrdering[aa2];
+				fprintf (fileName,"\n",aal1,",",
+											 aal2,",",
+											 bestRateMatrix[aa1][aa2],",",
+											 modelAveragedM[aa1][aa2],",",
+											 stanfel[aal1] == stanfel[aal2],",",
+											 polarity[aal1] == polarity[aal2],",",
+											 charge[aal1] == charge[aal2],",",										 
+											 Abs(lcap1[aa1][aa2]),",",
+											 Abs(lcap2[aa1][aa2]),",",
+											 Abs(lcap3[aa1][aa2]),",",
+											 Abs(lcap4[aa1][aa2]),",",
+											 Abs(lcap5[aa1][aa2])
+											 );
+			}
+		}
+	}
+
+	fprintf (fileName,CLOSE_FILE);
+
+	/*fprintf (stdout, "[PHASE 4.] Computing variability in rate assignments\n");
+
+	DEFAULT_FILE_SAVE_NAME = file_name + "_reliability.csv";
+	SerDialogPrompt ("Save the top-N model .csv to:");
+	if (autoSave)
+	{
+		fileName = dir_prefix + DEFAULT_FILE_SAVE_NAME;
+		fprintf (fileName,CLEAR_FILE,KEEP_OPEN,"AA1,AA2,Mean,Median,2.5%,97.5%,Variance,COV,Unreliable\n");	
+	}
+	else
+	{
+		fprintf (PROMPT_FOR_FILE,CLEAR_FILE,KEEP_OPEN,"AA1,AA2,Mean,Median,2.5%,97.5%,Variance,COV,Unreliable\n");
+		fileName = LAST_FILE_PATH;
+	}
+	for (aa1=0;aa1<20;aa1=aa1+1)
+	{
+		for (aa2=aa1+1;aa2<20;aa2=aa2+1)
+		{
+			if (isOneStepSub[aa1][aa2])
+			{
+				rateInfo = {modelCount,1};
+				for (k=0; k<modelCount; k=k+1)
+				{
+					rateInfo[k] = (rateMatrices[k])[aa1][aa2];
+				}
+				stats = GatherDescriptiveStats (rateInfo);
+				fprintf (fileName,"\n",aminoacidOrdering[aa1],",",
+											 aminoacidOrdering[aa2],",",
+											 stats["Mean"],",",
+											 stats["Median"],",",
+											 stats["2.5%"],",",
+											 stats["97.5%"],",",
+											 stats["Variance"],",",
+											 stats["COV"],",",
+											 stats["COV"] > 0.1
+											 );
+			}
+		}
+	}
+
+	fprintf (fileName,CLOSE_FILE);*/
+
+
+	/*-----------------------------------------------------------------------------*/
+
+	fprintf (stdout, "[PHASE 5.] Computing a 4-category [0-0.1,0.1-0.5,0.5-1,1+] approximation\n");
+
+	binByType = {stateVectorDimension,4};
+
+	for (k=0; k<modelCount; k=k+1)
+	{
+		compressedM = compressedRates[k];
+		myAW		= akaikeWeights  [k];
+		for (aa1=0;aa1<stateVectorDimension;aa1=aa1+1)
+		{
+			if (compressedM[aa1] < 0.1)
+			{
+				binByType [aa1][0] = binByType [aa1][0] + myAW;
+			}
+			else{
+				if (compressedM[aa1] < 0.5)
+				{
+					binByType [aa1][1] = binByType [aa1][1] + myAW;
+				}
+				else{
+					if (compressedM[aa1] < 1.00)
+					{
+						binByType [aa1][2] = binByType [aa1][2] + myAW;
+					}
+					else
+					{
+						binByType [aa1][3] = binByType [aa1][3] + myAW;
+					}
+				}
+			}
+		}
+	}
+
+	globbedMatrix = {20,20};
+	shortToLong   = {stateVectorDimension,1};
+
+	k = 0;
+	for (aa1=0;aa1<20;aa1=aa1+1)
+	{
+		for (aa2=aa1+1;aa2<20;aa2=aa2+1)
+		{
+			if (isOneStepSub[aa1][aa2])
+			{
+				maxV = 0; maxI = 0;
+				for (k2=0; k2<4; k2=k2+1){if (binByType[k][k2]>maxV) {maxV = binByType[k][k2]; maxI = k2;}} 
+				globbedMatrix[aa1][aa2] = maxI; 
+				globbedMatrix[aa2][aa1] = maxI; 
+				shortToLong [k] = aminoacidOrdering[aa1]+aminoacidOrdering[aa2];
+				k=k+1;
+			}
+		}
+	}
+
+	DEFAULT_FILE_SAVE_NAME = file_name + ".4_matrix";
+	ExportAMatrix ("globbedMatrix","","Save the 4-class matrix to:");
+
+	/*-----------------------------------------------------------------------------*/
+
+	fprintf (stdout, "[PHASE 6.] Computing the list of rates derived from top ",topNCount," models\n");
+
+	topNList = ({modelCount,2}["_MATRIX_ELEMENT_ROW_*(_MATRIX_ELEMENT_COLUMN_)+AICScores[_MATRIX_ELEMENT_ROW_]*(_MATRIX_ELEMENT_COLUMN_==0)"])%0;
+
+	DEFAULT_FILE_SAVE_NAME = file_name + "_topModels.csv";
+	SetDialogPrompt ("Save the top-N model .csv to:");
+	if (autoSave)
+	{
+		fileName = dir_prefix + DEFAULT_FILE_SAVE_NAME;
+		fprintf (fileName,CLEAR_FILE,KEEP_OPEN,"AA1,AA2,Rate,Model_Rank\n");
+	}
+	else
+	{
+		fprintf (PROMPT_FOR_FILE,CLEAR_FILE,KEEP_OPEN,"AA1,AA2,Rate,Model_Rank\n");
+		fileName = LAST_FILE_PATH;
+	}
+	for (aa1=0;aa1<20;aa1=aa1+1)
+	{
+		for (aa2=aa1+1;aa2<20;aa2=aa2+1)
+		{
+			if (isOneStepSub[aa1][aa2])
+			{
+				for (k=0; k<topNCount; k=k+1)
+				{
+					fprintf (fileName,"\n",aminoacidOrdering[aa1],",",aminoacidOrdering[aa2],",",(rateMatrices[topNList[k][1]])[aa1][aa2],",",k+1);
+				}
+			}
+		}
+	}
+	fprintf (fileName,CLOSE_FILE);
+	
+	DEFAULT_FILE_SAVE_NAME = file_name + "_init.models";
+	SetDialogPrompt ("Save the top-N models in a format suitable for seeding another GA run:");
+	if (autoSave)
+	{
+		fileName = dir_prefix + DEFAULT_FILE_SAVE_NAME;
+		fprintf (fileName,CLEAR_FILE,KEEP_OPEN);
+	}
+	else
+	{
+		fprintf (PROMPT_FOR_FILE,CLEAR_FILE,KEEP_OPEN);	
+		fileName = LAST_FILE_PATH;
+	}
+	for (k3=0; k3<topNCount; k3=k3+1)
+	{
+		fprintf (fileName,ConvertMatrixToStateVector(classMatrices[topNList[k3][1]]),"\n");
+	}
+	fprintf (fileName,CLOSE_FILE);
+
+
+	/*-----------------------------------------------------------------------------*/
+
+	fprintf (stdout, "[PHASE 7.] Finding stable structures in the set of credible models\n");
+
+	consensusStructure = {stateVectorDimension,stateVectorDimension}; 
+						/* only one step-substitutions */
+
+	bestMatrix = compressedRates[bestModelID];
+
+	consensusStructure = consensusStructure["bestMatrix[_MATRIX_ELEMENT_ROW_]==bestMatrix[_MATRIX_ELEMENT_COLUMN_]"]*akaikeWeights  [bestModelID];
+
+
+	for (k=0; k<modelCount; k=k+1)
+	{
+		/*matchCount 	   = ({1,stateVectorDimension}["1"]*(consensusStructure*{stateVectorDimension,1}["1"]))[0];
+		matchCount 	   = (matchCount-stateVectorDimension)/2;
+		fprintf (stdout, k, ":", matchCount, "\n");*/
+		
+		if (k!=bestModelID)
+		{
+			akaikeWeight       = Exp((bestScore-AICScores[k])*0.5);
+			bestMatrix         = compressedRates[k];
+			consensusStructure = consensusStructure + (consensusStructure["bestMatrix[_MATRIX_ELEMENT_ROW_]==bestMatrix[_MATRIX_ELEMENT_COLUMN_]"])*akaikeWeights  [k];
+		}
+	}
+	
+	clusterSupport = {stateVectorDimension,1};
+	
+	for (k = 0; k < stateVectorDimension; k=k+1)
+	{
+		myRate = bestCompressedMR[k];
+		for (k2 = 0; k2 < stateVectorDimension; k2 = k2 + 1)
+		{
+			if (k2 != k && myRate == bestCompressedMR[k2])
+			{
+				clusterSupport[k] = clusterSupport[k] + consensusStructure[k][k2];
+			}
+		}
+		bmr = (bestModelByRate[bestNRates[myRate+3]]);
+		if (bmr>1)
+		{
+			clusterSupport[k] = clusterSupport[k]/(bestModelByRate[bestNRates[myRate+3]]-1);
+		}
+	}
+
+	
+
+	graphs = {};
+	aaByNode ={};
+	for (k = 0; k < bestRates; k = k+1)
+	{
+		graphs[k] = ""; graphs[k] * 128; graphs[k] * ("subgraph cluster_G"+k+"{label = \"Rate = " + bestNRates[k+3]+ "\" fontsize = \"24\" penwidth=\"0\"; \n\n");
+		aaByNode[k] = {};
+	}
+
+	/*for (k=0; k<20; k=k+1)
+	{
+		graphString * ("\nsubgraph cluster_"+k+"{\n\""+aminoacidOrdering[k]+"\"[ shape = \"record\" label = \" <r0> ");
+		for (k2 = 1; k2 < bestRates; k2=k2+1)
+		{
+			graphString * ("| <r" + k2 + ">");
+		}
+		graphString * ( "\"]; label = \""+aminoacidOrdering[k]+"\";} \n");	
+	}
+	
+	for (k=0; k<20; k=k+1)
+	{	
+		for (k2=k+1; k2<20; k2 = k2+1)
+		{
+			ratePlug = bestClassMatrix[k][k2];
+			if (ratePlug >=0)
+			{
+				graphString * ( aminoacidOrdering[k] + ": r" + ratePlug  +" -- " + aminoacidOrdering[k2] + ": r"+ratePlug + ";\n");
+			}
+		}
+	}*/
+	
+	
+	k3 = 0;
+	for (k=0; k<20; k=k+1)
+	{	
+		for (k2=k+1; k2<20; k2 = k2+1)
+		{
+			ratePlug = bestClassMatrix[k][k2];
+			if (ratePlug >=0)
+			{
+				if ((aaByNode[ratePlug])[k] == 0)
+				{
+					(aaByNode[ratePlug])[k] = 1; 
+					graphs[ratePlug] * ("" + aminoacidOrdering[k] + ratePlug + 
+						"[label = \"" + 
+						aminoacidOrdering[k] + 
+						"\"" +
+						residueStyle(stanfel[aminoacidOrdering[k]],polarity[aminoacidOrdering[k]],charge[aminoacidOrdering[k]]) +
+						"];");
+				}
+				if ((aaByNode[ratePlug])[k2] == 0)
+				{
+					(aaByNode[ratePlug])[k2] = 1; 
+					graphs[ratePlug] * ("" + aminoacidOrdering[k2] + ratePlug + 
+						"[label = \"" + 
+						aminoacidOrdering[k2] + 
+						"\"" +
+						residueStyle(stanfel[aminoacidOrdering[k2]],polarity[aminoacidOrdering[k2]],charge[aminoacidOrdering[k2]]) +
+						"];");
+				}
+				if (clusterSupport[k3] < 0.5)
+				{
+					style = "dotted";
+				}
+				else
+				{
+					if (clusterSupport[k3] < .9)
+					{
+						style = "dashed";
+					}				
+					else
+					{
+						style = "solid";
+					}
+				}
+				
+				graphs[ratePlug] * ( aminoacidOrdering[k]  + ratePlug + " -- " + aminoacidOrdering[k2] + ratePlug+ " [style = \""+style+"\" label = \""+Format(modelAveragedM[k][k2],5,2)+"\"];\n");
+				
+				k3 = k3+1;
+			}
+		}
+	}
+	
+	sortBestRates = {bestRates,2}["_MATRIX_ELEMENT_ROW_"];
+	for (k=0; k<bestRates; k=k+1)
+	{
+		sortBestRates[k][1]=bestNRates[k+3];
+	}
+	sortBestRates = sortBestRates % 1;
+	
+	for (k = 0; k < bestRates; k = k+1)
+	{
+		graphs[k] * "}\n\n"; graphs[k] * 0; 
+	}
+
+	SetDialogPrompt ("Save the GraphViz .dot file to:");
+	DEFAULT_FILE_SAVE_NAME = file_name + ".dot";
+	if (autoSave)
+	{
+		fileName = dir_prefix + DEFAULT_FILE_SAVE_NAME;
+		fprintf (fileName,CLEAR_FILE,KEEP_OPEN);
+	}
+	else
+	{
+		fprintf (PROMPT_FOR_FILE,CLEAR_FILE,KEEP_OPEN);	
+		fileName = LAST_FILE_PATH;
+	}
+	
+	fprintf (fileName, "graph G{remincross = \"true\" rankdir=\"LR\" size = \"12,12\";\nnode [fontsize=14,width=".4", height=".4", margin=0];graph[fontsize=14];");
+	
+	for (k = 0; k < bestRates; k = k+1)
+	{
+		fprintf (fileName, graphs[sortBestRates[k][0]],"\n"); 
+	}
+	
+	fprintf (fileName, "\n}", CLOSE_FILE);
+
+
+/*}
+
+else
+{
+	fprintf (stdout, "[ERROR] The database file must contain the 'DATASET' table storing alignment records"); 
+}
+
+_closeCacheDB (resultsDatabase);
+*/
+
+/*-----------------------------------------------------------------------------*/
+/*-----------------------------------------------------------------------------*/
+/*-----------------------------------------------------------------------------*/
+
+function ExportAMatrix				(theMatrix&, fileName, theprompt)
+{
+	if (Abs(fileName) == 0)
+	{
+		if (autoSave)
+		{
+			fileName = dir_prefix+DEFAULT_FILE_SAVE_NAME;
+			fprintf (fileName, CLEAR_FILE);
+		}
+		else
+		{
+			SetDialogPrompt (theprompt);
+			fprintf (PROMPT_FOR_FILE, CLEAR_FILE, KEEP_OPEN);
+			fileName = LAST_FILE_PATH;
+		}
+	}
+	else
+	{
+		fprintf (fileName, CLEAR_FILE, KEEP_OPEN);
+	}
+	
+	fprintf (fileName, aminoacidOrdering, "\n", theMatrix, CLOSE_FILE);
+	return 0;
+	
+}
+
+function ConvertMatrixToStateVector (theMatrix)
+{
+	vector = {1,stateVectorDimension};
+	for (k = 0; k < 20; k=k+1)
+	{
+		for (k2 = k+1; k2<20; k2=k2+1)
+		{
+			if (matrixToVectorMap[k][k2]>=0)
+			{
+				vector[matrixToVectorMap[k][k2]] = theMatrix[k][k2];
+			}
+		}
+	}
+	return vector;
+}
+
+function 	storeProfile (recp&, string, value)
+{
+	for (h=0; h<Abs(string); h=h+1)
+	{
+		recp[string[h]] = value;
+	}
+	return 0;
+}
+
+function 	residueStyle (s,p,c)
+{
+	if (s == 1)
+	{
+		 color = "#B03060";
+		 labelcolor = "#FFFFFF";
+	}
+	if (s == 2)
+	{
+		 color = "#00A86B";
+		 labelcolor = "#000000";
+	}
+	if (s == 3)
+	{
+		 color = "#FF8C00";
+		 labelcolor = "#000000";
+	}
+	if (s == 4)
+	{
+		 color = "#4B0082";
+		 labelcolor = "#FFFFFF";
+	}
+	
+	if (p == 0)
+	{
+		if (c == 0)
+		{
+			shape = "rect";
+		}
+		else
+		{
+			if (c == 1)
+			{
+				shape = "trapezium";
+			}
+			else
+			{
+				shape = "invtrapezium";
+			}
+		}
+	}
+	else
+	{
+		if (c == 0)
+		{
+			shape = "diamond";
+		}
+		else
+		{
+			if (c == 1)
+			{
+				shape = "triangle";
+			}
+			else
+			{
+				shape = "invtriangle";
+			}
+		}	
+	}
+	
+	return " style=\"filled\" color=\"" + color + "\" fontcolor=\"" + labelcolor + "\" shape=\"" + shape + "\"";
+}
+
+
+function rateMatrixToPS (chars,rateMatrix, title)
+{
+	
+	codon_order = "FLIMVSPTAYHQNKDECWRG";
+	codon_idx   = {};
+	
+	for (k=0; k<=20; k=k+1)
+	{
+		codon_idx[codon_order[k]] = k;
+	}
+	
+	psFigure = "";
+	psFigure * 8192;
+
+	psFigure * _HYPSPageHeader (445,500, "Protein Rate Matrix Plot");
+	psFigure * "\n";
+	psFigure * _HYPSSetFont ("Times-Roman", 12);
+	psFigure * "\n";
+	psFigure * _HYPSTextCommands(0);
+
+	psFigure * "/box {\n0 20 rlineto \n20 0 rlineto \n0 -20 rlineto \nclosepath } def\n 0 30 translate\n";
+	
+	offset = 24;
+	
+	maxVal = Max(rateMatrix,0);
+	
+	
+	
+	charsToCodonOrder 	= {};
+	
+	for (k=0; k<=20; k=k+1)
+	{
+		charsToCodonOrder[k] = codon_idx[chars[k]];
+	}
+	
+	reordering = {};
+	reordering["A"] = 0;
+	reordering["C"] = 1;
+	reordering["G"] = 2;
+	reordering["I"] = 3;
+	reordering["L"] = 4;
+	reordering["M"] = 5;
+	reordering["P"] = 6;
+	reordering["S"] = 7;
+	reordering["T"] = 8;
+	reordering["V"] = 9;
+	reordering["D"] = 10;
+	reordering["E"] = 11;
+	reordering["N"] = 12;
+	reordering["Q"] = 13;
+	reordering["F"] = 14;
+	reordering["W"] = 15;
+	reordering["Y"] = 16;
+	reordering["H"] = 17;
+	reordering["K"] = 18;
+	reordering["R"] = 19;
+	
+	rk = Rows (reordering);
+	
+	for (h=0; h<20; h=h+1)
+	{
+		h2 = reordering[chars[h]];
+		label = rk[h];
+		psFigure * ("0 setgray\n10 "+(offset+(19-h)*20+6)+" \n("+label+") centertext\n");
+		psFigure * ("0 setgray\n"+(offset+410)+" "+(offset+(19-h)*20+6)+" ("+label+") centertext\n");
+		psFigure * ("0 setgray\n"+(offset+h*20+10)+" 10 ("+label+") centertext\n");
+		psFigure * ("0 setgray\n"+(offset+h*20+10)+" "+(405+offset)+" ("+label+") centertext\n");
+		for (v=0; v<20; v=v+1)
+		{
+			if (h!=v)
+			{
+				v2 = reordering[chars[v]];
+				label2 = chars[v];
+				psFigure * ("newpath\n"+(offset+v2*20)+" "+(offset+(19-h2)*20)+" moveto\n");
+				greyColor = 1-rateMatrix[h][v]/maxVal;
+				psFigure * (""+greyColor+" setgray\nbox fill\n");
+				if (isOneStepSub[charsToCodonOrder[h]][charsToCodonOrder[v]])
+				{
+					if (greyColor>0.5)
+					{
+						psFigure * ("0 setgray\n");
+					}
+					else
+					{
+						psFigure * ("1 setgray\n");				
+					}
+					psFigure * ("\nnewpath\n"+(offset+v2*20+10)+" "+(offset+(19-h2)*20+10)+" 5 0 360 arc\n\nstroke\nclosepath\n");
+				}
+			}
+		}
+	}
+	
+	psFigure * ("\n"+offset+" "+offset+" translate\n0 setgray\nnewpath\n0 0 moveto\n0 400 lineto\n400 400 lineto\n400 0 lineto\n0 0 lineto\nstroke\nclosepath");
+	
+	psFigure * ("\n\nnewpath\n0 200 moveto\n200 200 lineto\n200 400 lineto\nstroke");
+	psFigure * ("\n\nnewpath\n200 120 moveto\n200 200 lineto\n280 200 lineto\n280 120 lineto\nclosepath stroke");
+	psFigure * ("\n\nnewpath\n280 120 moveto\n340 120 lineto\n340 60 lineto\n280 60 lineto\nclosepath stroke");
+	psFigure * ("\n\nnewpath\n340 60 moveto\n400 60 lineto\n400 0 lineto\n340 0 lineto\nclosepath stroke");
+	psFigure * ("\n0 -30 translate\n 225.5 460 (Rate matrix plot for " + title + ") centertext\n 0 -20 translate\n");
+	tableText = {3,1};
+	tableText [0] = "Shading indicates relative substitution rates (black = max, white = 0)";
+	tableText [1] = "Circles show residue pairs that can be exchanged with one nucleotide substitution";
+	tableText [2] = "Amino-acids are grouped into 4 Stanfel classification clusters";
+	psFigure * _HYPSTextTable (400,30,12,tableText,tableText["0"]);
+	psFigure * ("\nshowpage");
+	psFigure * 0;
+	return psFigure;
+}
+
+
+/*-----------------------------------------------------------------------------*/
+/*-----------------------------------------------------------------------------*/
+/*-----------------------------------------------------------------------------*/
diff --git a/res/TemplateBatchFiles/ModelSelectorRNA.bf b/res/TemplateBatchFiles/ModelSelectorRNA.bf
new file mode 100644
index 0000000..6cfc73d
--- /dev/null
+++ b/res/TemplateBatchFiles/ModelSelectorRNA.bf
@@ -0,0 +1,596 @@
+fprintf (stdout, "\nHow many rate classes?");
+fscanf  (stdin,  "Number", rateClassesCount);
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+produceOffspring		= MPI_NODE_COUNT-1;
+populationSize  		= 2*produceOffspring;
+incestDistance  		= 0;
+generationCount		  	= 5000;
+maxSampleTries			= populationSize*10;
+mutationThreshhold		= 0.0001;
+mutationProb			= 0.15;
+mutationProbDecrease	= 0.95;
+annealingPhase			= 100;
+SHORT_MPI_RETURN		= 1;
+totalSampleCounter		= 0;
+localMutationRate		= 0.05;
+localMutationInterval	= 20;
+
+stoppingCriterion		= 100;
+sampleCount			= 0;
+familyControlSize		= produceOffspring$6;
+
+predef   = {};
+
+MasterList				= {};
+verboseFlag				= 1;
+stateVectorDimension    = 120;
+
+predef [0] = {{1,1,1,1,0,0,0,1,0,0,0,1,0,0,0,1,1,0,1,0,0,0,1,0,0,0,1,0,0,1,0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,1,0,0,0,1,0,0,0,1,1,1,1,1,0,0,0,1,0,0,0,1,1,0,1,0,0,0,1,0,0,1,0,0,1,0,0,0,1,0,0,0,0,1,0,0,0,1,1,1,1,1,0,0,0,1,1,0,1,0,0,1,0,0,1,0,0,0,0,1,1,1,1,1,1,1}};
+
+if (rateClassesCount>3)
+{
+	predef [1] = {{2,2,1,2,0,0,0,2,0,0,0,1,0,0,0,2,1,0,2,0,0,0,1,0,0,0,2,0,0,1,0,0,1,0,0,0,2,0,0,0,1,0,0,0,0,1,0,0,0,3,0,0,0,1,2,1,2,2,0,0,0,1,0,0,0,1,2,0,1,0,0,0,2,0,0,1,0,0,1,0,0,0,3,0,0,0,0,1,0,0,0,2,1,2,1,1,0,0,0,1,3,0,1,0,0,1,0,0,1,0,0,0,0,1,1,3,1,1,2,1}};
+}
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function ExportAMatrix (fileName, rateMatrix,doClear)
+{
+	outString = "";
+	outString * 256;
+	outString * "\n{";
+	for (h=0; h<16; h=h+1)
+	{
+		outString * "\n{";
+		for (v=0; v<h; v=v+1)
+		{
+			if (v)
+			{
+				outString * (","+rateMatrix[h][v]);
+			}
+			else
+			{
+				outString * (""+rateMatrix[h][v]);				
+			}
+		}
+		if (v)
+		{
+			outString * ",*";
+		}
+		else
+		{
+			outString * "*";				
+		}
+		for (v=h+1; v<16; v=v+1)
+		{
+			outString * (","+rateMatrix[h][v]);				
+		}
+		outString * "}";
+	}
+	outString * "\n}";
+	outString * 0;
+	if (doClear)
+	{
+		fprintf (fileName, CLEAR_FILE,outString);
+	}
+	else
+	{
+		fprintf (fileName,"\n",outString);
+	}
+	return 0;
+}
+
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function MatrixToString (rateMatrix)
+{
+	outString = "";
+	outString * 256;
+	for (h=0; h<120; h=h+1)
+	{
+		outString * (","+rateMatrix[h]);				
+	}
+	outString * 0;
+	return outString;
+}
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function CleanUpMPI (dummy)
+{
+	if (MPI_NODE_COUNT>1)
+	{
+		while (1)
+		{
+			for (nodeCounter = 0; nodeCounter < MPI_NODE_COUNT-1; nodeCounter = nodeCounter+1)
+			{
+				if (MPINodeState[nodeCounter][0]==1)
+				{
+					fromNode = ReceiveJobs (0,0);
+					break;	
+				}
+			}
+			if (nodeCounter == MPI_NODE_COUNT-1)
+			{
+				break;
+			}
+		}			
+	}
+	return 0;
+}
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function ReceiveJobs (sendOrNot, ji)
+{
+	if (MPI_NODE_COUNT>1)
+	{
+		MPIReceive (-1, fromNode, result_String);
+		mji = MPINodeState[fromNode-1][1];
+		mdf	= MPINodeState[fromNode-1][2];
+		
+		if (sendOrNot)
+		{
+			MPISend (fromNode,lf);
+			MPINodeState[fromNode-1][1] = ji;			
+			MPINodeState[fromNode-1][2] = modelDF;			
+		}
+		else
+		{
+			MPINodeState[fromNode-1][0] = 0;
+			MPINodeState[fromNode-1][1] = -1;		
+		}
+		ExecuteCommands (result_String);
+		myDF	  = mdf;
+		myAIC 	  = 2*(lf_MLES[1][0]-(baseParams+mdf)*sampleCount/(sampleCount-baseParams-mdf-1));
+		myLFScore = lf_MLES[1][0];
+		ji = mji;
+	}
+	else
+	{
+		myDF	  = modelDF;
+		myAIC 	  = 2*(res[1][0]-(baseParams+myDF)*sampleCount/(sampleCount-baseParams-myDF-1));
+		myLFScore = res[1][0];
+	}
+	
+	if (resultProcessingContext==0)
+	{
+		sortedScores[ji][0] = myAIC;
+	}
+	else
+	{
+		intermediateProbs[ji][0] = myAIC;	
+	}
+	if (ji>=0)
+	{
+		fpath = modelFile+".details";
+		if (resultProcessingContext==0)
+		{
+			ExportAMatrix (fpath,StringToMatrix(currentPopulation[ji]),0);
+			sortedBP = MatrixToString (currentPopulation[ji]);
+			MasterList [sortedBP] = myAIC;
+		}
+		else
+		{
+			ExportAMatrix (fpath,StringToMatrix(children[ji-populationSize]),0);	
+			sortedBP = MatrixToString (children[ji-populationSize]);
+			MasterList [sortedBP] = myAIC;
+		}
+		fprintf (fpath,"\n{{",myLFScore,",",-myAIC);
+		if (MPI_NODE_COUNT > 1)
+		{
+			/*fprintf (stdout, lf_MLE_VALUES);*/
+			for (spoolC = 0; spoolC <= myDF; spoolC = spoolC + 1)
+			{
+				aVal = lf_MLE_VALUES["R_"+spoolC];
+				fprintf (fpath,",",aVal);
+			}
+		}		
+		else
+		{
+			for (spoolC = 0; spoolC <= myDF; spoolC = spoolC + 1)
+			{
+				execCommand = "fprintf(fpath,\",\",R_"+spoolC+");";
+				ExecuteCommands (execCommand);
+			}
+		}
+		fprintf (fpath,"\n}}\n");
+		fpath = modelFile+".AIC";
+		if (totalSampleCounter)
+		{
+			fprintf (fpath,"\n",-myAIC);
+		}
+		else
+		{
+			fprintf (fpath,CLEAR_FILE,"\n",-myAIC);		
+		}
+		totalSampleCounter = totalSampleCounter + 1;
+	}
+	return fromNode-1;
+}
+
+/*outCounter = 0;*/
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function RunASample (modelDF, jobIndex)
+{
+	sampleString = MatrixToString (cString);
+	myAIC = MasterList[sampleString];
+	
+	if (myAIC < (-0.1))
+	{
+		if (resultProcessingContext==0)
+		{
+			sortedScores[jobIndex][0] = myAIC;
+		}
+		else
+		{
+			intermediateProbs[jobIndex][0] = myAIC;	
+		}			
+	}
+	else
+	{
+		AAModelMatrix 					= 0;
+		MULTIPLY_BY_FREQS 				= PopulateModelMatrix ("AAModelMatrix", vectorOfFrequencies);
+		Model AAModel	     			= (AAModelMatrix,vectorOfFrequencies,1);
+		Tree givenTree2 = treeString;
+		if (optimizeBLFlag < 1)
+		{
+			ReplicateConstraint("this1.?.t:=Null_Scaler__*this2.?.t__/branchLengthScaler",givenTree2,givenTree);
+		}
+		LikelihoodFunction lf = (filteredData,givenTree2);
+		if ((MPI_NODE_COUNT>1) && (jobIndex>=0))
+		{
+			for (mpiNode = 0; mpiNode < MPI_NODE_COUNT-1; mpiNode = mpiNode+1)
+			{
+				if (MPINodeState[mpiNode][0]==0)
+				{
+					break;	
+				}
+			}
+			if (mpiNode==MPI_NODE_COUNT-1)
+			{
+				mpiNode = ReceiveJobs (1,jobIndex);
+			}
+			else
+			{
+				MPISend (mpiNode+1,lf);
+				/*fName = "spool."+outCounter;
+				fprintf (fName,CLEAR_FILE,MPI_LAST_SENT_MSG);
+				outCounter = outCounter + 1;*/
+				MPINodeState[mpiNode][0] = 1;
+				MPINodeState[mpiNode][1] = jobIndex;
+				MPINodeState[mpiNode][2] = modelDF;
+			}
+		}
+		else
+		{
+			/*LIKELIHOOD_FUNCTION_OUTPUT = 6;
+			fprintf ("spool",CLEAR_FILE,lf);*/
+			Optimize (res,lf);
+			if (jobIndex>=0)
+			{
+				mpiNode = ReceiveJobs (1, jobIndex);
+			}
+			else
+			{
+				myAIC 	  = 2*(res[1][0]-(baseParams+modelDF)*sampleCount/(sampleCount-baseParams-modelDF-1));
+			}
+		}
+	}
+	return 0;	
+}
+
+
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function PopulateModelMatrix (ModelMatrixName&, EFV)
+{
+	ModelMatrixName = {16,16}; 
+
+	hshift = 0;
+	
+	modelDefString = "";
+	modelDefString*16384;
+	globalDefString = "";
+	globalDefString*128;
+	
+	catCounterAL = {};
+	
+	/* build a branch length constraint */
+	
+	global meanOneConstraint = 1;
+	meanOneConstraintString = "";
+	
+	for (aa1 = 0; aa1 < 15; aa1 = aa1+1)
+	{
+		for (aa2 = aa1+1; aa2 < 16; aa2 = aa2+1)
+		{
+			bt = aaRateMultipliers[aa1][aa2];
+			if (catCounterAL[bt] == 0)
+			{
+				globalDefString*("\nglobal R_"+bt+"=1;");
+				meanOneConstraintString = meanOneConstraintString + "+R_"+bt;
+			}
+			catCounterAL[bt] = catCounterAL[bt]+2*EFV[aa2]*EFV[aa1];
+			bt = "R_"+bt+"*meanOneConstraint*";
+			modelDefString*("ModelMatrixName["+aa1+"]["+aa2+"] := "+bt+"t;\nModelMatrixName["+aa2+"]["+aa1+"] := "+bt+"t;\n");
+		}	
+    }		
+	modelDefString*0;
+	/*bt = aaRateMultipliers[0][3];
+	globalDefString*("\nR_"+bt+":=1;\n");*/
+	globalDefString*0;
+	ExecuteCommands (globalDefString);
+	ExecuteCommands (modelDefString);
+	ExecuteCommands ("global meanOneConstraint:=1/("+meanOneConstraintString[1][Abs(meanOneConstraintString)-1]+");");
+	
+	modelDefString = "";
+	modelDefString*128;
+	modelDefString*("global branchLengthScaler := "+catCounterAL[0]+"*R_0");
+	
+	for (aa1 = 1; aa1 < Abs(catCounterAL); aa1 = aa1+1)
+	{
+		modelDefString * ("+" + catCounterAL[aa1]+"*R_" + aa1);
+	}
+	modelDefString*0;
+	ExecuteCommands (modelDefString+";");
+	return 0;
+}
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function SpawnRandomString (clsCnt)
+{
+	rModel = {120,1};
+	for (h=0; h<120; h=h+1)
+	{
+		rModel[h] = Random(0,clsCnt)$1;
+	}
+	
+	return MakeStringCanonical(rModel,clsCnt);
+}
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function MakeStringCanonical (randomModel, classCount)
+{
+	compressedString = {classCount,1};
+	for (h=0; h<120; h=h+1)
+	{
+		v = randomModel[h];
+		compressedString[v] = 1;
+	}
+	compressedString[0] = 0;
+	for (h=1; h<classCount; h=h+1)
+	{
+		compressedString[h] = compressedString[h]+compressedString[h-1];
+	}
+	for (h=0; h<120; h=h+1)
+	{
+		v = randomModel[h];
+		v = compressedString[v];
+		randomModel[h] = v;
+	}
+	v = compressedString[classCount-1]+1;
+	if (v>1)
+	{
+		sortedOrder = {v,2};
+		for (h=0; h<v; h=h+1)
+		{
+			sortedOrder[h][0] = -1;
+		}
+		cc = 0;
+		for (h=0; h<120; h=h+1)
+		{
+			hshift = randomModel[h];
+			if (sortedOrder[hshift][0] < 0)
+			{
+				sortedOrder[hshift][0] = cc;
+				sortedOrder[hshift][1] = hshift;
+				cc = cc+1;
+			}
+		}
+		sortedOrder = sortedOrder%1;
+		for (h=0; h<120; h=h+1)
+		{
+			v = randomModel[h];
+			randomModel[h] = sortedOrder[v][0];
+		}
+		
+	}
+	return randomModel;
+}
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function StringToMatrix (stringSpec)
+{
+	matrixSpec = {16,16};
+	cc = 0;
+	for (h=0; h<16; h=h+1)
+	{
+		for (v=h+1; v<16; v=v+1)
+		{
+			matrixSpec[h][v] = stringSpec[cc];
+			matrixSpec[v][h] = stringSpec[cc];
+			cc = cc+1;
+		}
+	}
+	return matrixSpec;
+}
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function IsChildViable (putativeChild)
+{
+	sampleString = MatrixToString (putativeChild);
+	myAIC = MasterList[sampleString];
+	testChild = putativeChild;
+	mutPassCount = 1;
+	while (myAIC < (-0.1))
+	{
+		if (verboseFlag)
+		{
+			fprintf (stdout,"Adjusting the child to avoid a duplicate. Pass ", mutPassCount, "\n");
+		}
+		
+		mutPassCount = mutPassCount + 1;
+		
+		sampleString = Min(Random(0,stateVectorDimension)$1,stateVectorDimension-1);
+		myAIC = testChild[sampleString];
+		
+		newValue = Random (0,rateClassesCount-0.0000001)$1;
+		
+		while (newValue == myAIC)
+		{
+			newValue = Random (0,rateClassesCount-0.0000001)$1;
+		}
+		
+		testChild [sampleString] = newValue;
+		sampleString = MatrixToString (testChild);
+		myAIC = MasterList[sampleString];
+	}
+	return testChild;
+}
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function UpdateBL (dummy)
+{
+	bestInd							= sortedScores[populationSize-1][1];
+	aaRateMultipliers 				= StringToMatrix(currentPopulation[bestInd]);
+	AAModelMatrix 					= 0;
+	MULTIPLY_BY_FREQS 				= PopulateModelMatrix ("AAModelMatrix", vectorOfFrequencies);
+	Model AAModel	     			= (AAModelMatrix,vectorOfFrequencies,1);
+	Tree givenTree				    = treeString;
+	LikelihoodFunction 				lf = (filteredData,givenTree);
+	
+	fprintf 						(progressFile,"\nUpdating branch lengths...");
+	Optimize (res,lf);
+	global Null_Scaler 				= 	branchLengthScaler;
+	
+	myAIC 	  = 2*(res[1][0]-(res[1][1])*sampleCount/(sampleCount-res[1][1]-1));
+	fprintf							(stdout, "\nUpdated BLs\nAICs: ", -myAIC, "\t",  -sortedScores[populationSize-1][0], "\n", lf, "\n");
+	sortedScores[populationSize-1][0] 		 = myAIC;
+	MasterList[sampleString] 				 = myAIC;
+	
+	return 0;
+}
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+
+
+SetDialogPrompt 	  		  ("Locate a dinucleotide file:");
+DataSet 		ds  		 = ReadDataFile (PROMPT_FOR_FILE);
+DataSetFilter	filteredData = CreateFilter(ds,2);
+
+sampleCount 				 = filteredData.sites;
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+HarvestFrequencies (vectorOfFrequencies,filteredData,2,2,0);
+
+SetDialogPrompt ("Save the best model to:");
+fprintf (PROMPT_FOR_FILE,CLEAR_FILE);
+modelFile = LAST_FILE_PATH;
+
+fpath = modelFile+".details";
+fprintf (fpath,CLEAR_FILE);
+
+aaRateMultipliers = {16,16};
+
+aa_plain = 0;
+MULTIPLY_BY_FREQS 				= PopulateModelMatrix ("aa_plain", vectorOfFrequencies);
+Model AAPlainModel		 		= (aa_plain,vectorOfFrequencies,1);
+
+incFileName = HYPHY_LIB_DIRECTORY+"TemplateBatchFiles"+DIRECTORY_SEPARATOR+"queryTree.bf";
+ExecuteCommands  ("#include \""+incFileName+"\";");
+LikelihoodFunction lf = (filteredData,givenTree);
+
+ChoiceList (matingChoice, "Mating Weights",1,SKIP_NONE,
+			"Akaike Weights","Individuals are chosen to reproduce with based on their Akaike weights.",
+			"Equiprobable", "All individuals are equally likely to mate.",
+			"Rank","Mating probabilities are proportional to the c-AIC rank of the individual",
+			"Random","One of the three mating schemes in picked at random for every generation");
+
+if (matingChoice<0)
+{
+	return 0;
+}
+
+ChoiceList (seedChoice, "Seeds",1,SKIP_NONE,
+			"Random","The entire starting population is seeded at random.",
+			"Load", "Load some predefined partitions",
+			"Completely Random","The entire starting population is seeded at random, skipping even hardwired presets."
+);
+
+if (seedChoice<0)
+{
+	return 0;
+}
+
+if (seedChoice == 2)
+{
+	predef = {};
+}
+
+ChoiceList (reprFlag, "Mating Representation",1,SKIP_NONE,
+			"General","Use n-ary representation (n=number of rate classes).",
+			"Binary", "Use binary representation");
+
+if (reprFlag<0)
+{
+	return 0;
+}
+
+if (seedChoice == 1)
+{
+	SetDialogPrompt ("File with partition specifications:");
+	END_OF_FILE = 0;
+	fscanf (PROMPT_FOR_FILE,"NMatrix",seeds);
+	predef[Abs(predef)] = seeds;
+	while (!END_OF_FILE)
+	{
+		fscanf (LAST_FILE_PATH,"NMatrix",seeds);
+		if (Abs(seeds))
+		{
+			predef[Abs(predef)] = seeds;
+		}
+	}
+}
+
+currentPopulation  = {};
+Optimize (res,lf);
+baseParams = res[1][1];
+sortedScores	   = {populationSize,2};
+sortedScores[0][0] = 2*(res[1][0]-baseParams*sampleCount/(sampleCount-baseParams-1));
+sortedScores[0][1] = 0;
+currentPopulation [0] = {stateVectorDimension,1};
+
+global Null_Scaler = branchLengthScaler;
+
+
+/* INCLUDE THE CHC CORE */
+
+if (reprFlag)
+{
+	ibfPath = HYPHY_LIB_DIRECTORY + "TemplateBatchFiles" + DIRECTORY_SEPARATOR + "GA_CHC_Binary.ibf";
+}
+else
+{
+	ibfPath = HYPHY_LIB_DIRECTORY + "TemplateBatchFiles" + DIRECTORY_SEPARATOR + "GA_CHC.ibf";
+}
+ExecuteCommands ("#include \"" + ibfPath + "\";");
+
+/* try a consensus matrix */
+
+ExportAMatrix (modelFile,StringToMatrix(currentPopulation[populationSize-1]),1);
+fpath = modelFile+".bestAIC";
+
+fprintf (fpath, CLEAR_FILE, -sortedScores[populationSize-1][0]);
diff --git a/res/TemplateBatchFiles/ModelSelectorRNA_1.bf b/res/TemplateBatchFiles/ModelSelectorRNA_1.bf
new file mode 100644
index 0000000..61123eb
--- /dev/null
+++ b/res/TemplateBatchFiles/ModelSelectorRNA_1.bf
@@ -0,0 +1,798 @@
+fprintf (stdout, "\nHow many rate classes?");
+fscanf  (stdin,  "Number", rateClassesCount);
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+produceOffspring		= MPI_NODE_COUNT-1;
+populationSize  		= 2*produceOffspring;
+incestDistance  		= 0;
+generationCount		  	= 5000;
+maxSampleTries			= populationSize*10;
+mutationThreshhold		= 0.0001;
+mutationProb			= 0.15;
+mutationProbDecrease	= 0.95;
+annealingPhase			= 100;
+SHORT_MPI_RETURN		= 1;
+totalSampleCounter		= 0;
+localMutationRate		= 0.05;
+localMutationInterval	= 20;
+
+stoppingCriterion		= 100;
+sampleCount			= 0;
+familyControlSize		= produceOffspring$6;
+
+predef   = {};
+
+MasterList				= {};
+verboseFlag				= 1;
+stateVectorDimension    = 48;
+
+map48To120 = 
+{
+{                 0}
+{                 1}
+{                 2}
+{                 3}
+{                 7}
+{                11}
+{                15}
+{                16}
+{                18}
+{                22}
+{                26}
+{                29}
+{                32}
+{                36}
+{                40}
+{                45}
+{                49}
+{                53}
+{                54}
+{                55}
+{                56}
+{                57}
+{                61}
+{                65}
+{                66}
+{                68}
+{                72}
+{                75}
+{                78}
+{                82}
+{                87}
+{                91}
+{                92}
+{                93}
+{                94}
+{                95}
+{                99}
+{               100}
+{               102}
+{               105}
+{               108}
+{               113}
+{               114}
+{               115}
+{               116}
+{               117}
+{               118}
+{               119}
+};
+
+map120To48 = {
+{                 0}
+{                 1}
+{                 2}
+{                 3}
+{                -1}
+{                -1}
+{                -1}
+{                 4}
+{                -1}
+{                -1}
+{                -1}
+{                 5}
+{                -1}
+{                -1}
+{                -1}
+{                 6}
+{                 7}
+{                -1}
+{                 8}
+{                -1}
+{                -1}
+{                -1}
+{                 9}
+{                -1}
+{                -1}
+{                -1}
+{                10}
+{                -1}
+{                -1}
+{                11}
+{                -1}
+{                -1}
+{                12}
+{                -1}
+{                -1}
+{                -1}
+{                13}
+{                -1}
+{                -1}
+{                -1}
+{                14}
+{                -1}
+{                -1}
+{                -1}
+{                -1}
+{                15}
+{                -1}
+{                -1}
+{                -1}
+{                16}
+{                -1}
+{                -1}
+{                -1}
+{                17}
+{                18}
+{                19}
+{                20}
+{                21}
+{                -1}
+{                -1}
+{                -1}
+{                22}
+{                -1}
+{                -1}
+{                -1}
+{                23}
+{                24}
+{                -1}
+{                25}
+{                -1}
+{                -1}
+{                -1}
+{                26}
+{                -1}
+{                -1}
+{                27}
+{                -1}
+{                -1}
+{                28}
+{                -1}
+{                -1}
+{                -1}
+{                29}
+{                -1}
+{                -1}
+{                -1}
+{                -1}
+{                30}
+{                -1}
+{                -1}
+{                -1}
+{                31}
+{                32}
+{                33}
+{                34}
+{                35}
+{                -1}
+{                -1}
+{                -1}
+{                36}
+{                37}
+{                -1}
+{                38}
+{                -1}
+{                -1}
+{                39}
+{                -1}
+{                -1}
+{                40}
+{                -1}
+{                -1}
+{                -1}
+{                -1}
+{                41}
+{                42}
+{                43}
+{                44}
+{                45}
+{                46}
+{                47}
+};
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function ExportAMatrix (fileName, rateMatrix,doClear)
+{
+	outString = "";
+	outString * 256;
+	outString * "\n{";
+	cc = 0;
+	for (h=0; h<16; h=h+1)
+	{
+		outString * "\n{";
+		for (v=0; v<h; v=v+1)
+		{
+			rateEntry = rateMatrix[h][v];
+			
+			if (rateEntry<0)
+			{
+				rateEntry = "\"\"";
+			}
+			
+			if (v)
+			{
+				outString * (","+rateEntry);
+			}
+			else
+			{
+				outString * (""+rateEntry);				
+			}
+		}
+		if (v)
+		{
+			outString * ",*";
+		}
+		else
+		{
+			outString * "*";				
+		}
+		for (v=h+1; v<16; v=v+1)
+		{
+			rateEntry = rateMatrix[h][v];
+			
+			if (rateEntry<0)
+			{
+				rateEntry = "\"\"";
+			}
+			outString * (","+rateEntry);				
+		}
+		outString * "}";
+	}
+	outString * "\n}";
+	outString * 0;
+	if (doClear)
+	{
+		fprintf (fileName, CLEAR_FILE,outString);
+	}
+	else
+	{
+		fprintf (fileName,"\n",outString);
+	}
+	return 0;
+}
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function MatrixToString (rateMatrix)
+{
+	outString = "";
+	outString * 256;
+	for (h=0; h<stateVectorDimension; h=h+1)
+	{
+		outString * (","+rateMatrix[h]);				
+	}
+	outString * 0;
+	return outString;
+}
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function CleanUpMPI (dummy)
+{
+	if (MPI_NODE_COUNT>1)
+	{
+		while (1)
+		{
+			for (nodeCounter = 0; nodeCounter < MPI_NODE_COUNT-1; nodeCounter = nodeCounter+1)
+			{
+				if (MPINodeState[nodeCounter][0]==1)
+				{
+					fromNode = ReceiveJobs (0,0);
+					break;	
+				}
+			}
+			if (nodeCounter == MPI_NODE_COUNT-1)
+			{
+				break;
+			}
+		}			
+	}
+	return 0;
+}
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function ReceiveJobs (sendOrNot, ji)
+{
+	if (MPI_NODE_COUNT>1)
+	{
+		MPIReceive (-1, fromNode, result_String);
+		mji = MPINodeState[fromNode-1][1];
+		mdf	= MPINodeState[fromNode-1][2];
+		
+		if (sendOrNot)
+		{
+			MPISend (fromNode,lf);
+			MPINodeState[fromNode-1][1] = ji;			
+			MPINodeState[fromNode-1][2] = modelDF;			
+		}
+		else
+		{
+			MPINodeState[fromNode-1][0] = 0;
+			MPINodeState[fromNode-1][1] = -1;		
+		}
+		ExecuteCommands (result_String);
+		myDF	  = mdf;
+		myAIC 	  = 2*(lf_MLES[1][0]-(baseParams+mdf)*sampleCount/(sampleCount-baseParams-mdf-1));
+		myLFScore = lf_MLES[1][0];
+		ji = mji;
+	}
+	else
+	{
+		myDF	  = modelDF;
+		myAIC 	  = 2*(res[1][0]-(baseParams+myDF)*sampleCount/(sampleCount-baseParams-myDF-1));
+		myLFScore = res[1][0];
+	}
+	
+	if (resultProcessingContext==0)
+	{
+		sortedScores[ji][0] = myAIC;
+	}
+	else
+	{
+		intermediateProbs[ji][0] = myAIC;	
+	}
+	if (ji>=0)
+	{
+		fpath = modelFile+".details";
+		if (resultProcessingContext==0)
+		{
+			ExportAMatrix (fpath,StringToMatrix(currentPopulation[ji]),0);
+			sortedBP = MatrixToString (currentPopulation[ji]);
+			MasterList [sortedBP] = myAIC;
+		}
+		else
+		{
+			ExportAMatrix (fpath,StringToMatrix(children[ji-populationSize]),0);	
+			sortedBP = MatrixToString (children[ji-populationSize]);
+			MasterList [sortedBP] = myAIC;
+		}
+		fprintf (fpath,"\n{{",myLFScore,",",-myAIC);
+		if (MPI_NODE_COUNT > 1)
+		{
+			/*fprintf (stdout, lf_MLE_VALUES);*/
+			for (spoolC = 0; spoolC <= myDF; spoolC = spoolC + 1)
+			{
+				aVal = lf_MLE_VALUES["R_"+spoolC];
+				fprintf (fpath,",",aVal);
+			}
+		}		
+		else
+		{
+			for (spoolC = 0; spoolC <= myDF; spoolC = spoolC + 1)
+			{
+				execCommand = "fprintf(fpath,\",\",R_"+spoolC+");";
+				ExecuteCommands (execCommand);
+			}
+		}
+		fprintf (fpath,"\n}}\n");
+		fpath = modelFile+".AIC";
+		if (totalSampleCounter)
+		{
+			fprintf (fpath,"\n",-myAIC);
+		}
+		else
+		{
+			fprintf (fpath,CLEAR_FILE,"\n",-myAIC);		
+		}
+		totalSampleCounter = totalSampleCounter + 1;
+	}
+	return fromNode-1;
+}
+
+/*outCounter = 0;*/
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function RunASample (modelDF, jobIndex)
+{
+	sampleString = MatrixToString (cString);
+	myAIC = MasterList[sampleString];
+	
+	if (myAIC < (-0.1))
+	{
+		if (resultProcessingContext==0)
+		{
+			sortedScores[jobIndex][0] = myAIC;
+		}
+		else
+		{
+			intermediateProbs[jobIndex][0] = myAIC;	
+		}			
+	}
+	else
+	{
+		AAModelMatrix 					= 0;
+		MULTIPLY_BY_FREQS 				= PopulateModelMatrix ("AAModelMatrix", vectorOfFrequencies);
+		Model AAModel	     			= (AAModelMatrix,vectorOfFrequencies,1);
+		Tree givenTree2 = treeString;
+		if (optimizeBLFlag < 1)
+		{
+			ReplicateConstraint("this1.?.t:=Null_Scaler__*this2.?.t__/branchLengthScaler",givenTree2,givenTree);
+		}
+		LikelihoodFunction lf = (filteredData,givenTree2);
+		if ((MPI_NODE_COUNT>1) && (jobIndex>=0))
+		{
+			for (mpiNode = 0; mpiNode < MPI_NODE_COUNT-1; mpiNode = mpiNode+1)
+			{
+				if (MPINodeState[mpiNode][0]==0)
+				{
+					break;	
+				}
+			}
+			if (mpiNode==MPI_NODE_COUNT-1)
+			{
+				mpiNode = ReceiveJobs (1,jobIndex);
+			}
+			else
+			{
+				MPISend (mpiNode+1,lf);
+				/*fName = "spool."+outCounter;
+				fprintf (fName,CLEAR_FILE,MPI_LAST_SENT_MSG);
+				outCounter = outCounter + 1;*/
+				MPINodeState[mpiNode][0] = 1;
+				MPINodeState[mpiNode][1] = jobIndex;
+				MPINodeState[mpiNode][2] = modelDF;
+			}
+		}
+		else
+		{
+			/*LIKELIHOOD_FUNCTION_OUTPUT = 6;
+			fprintf ("spool",CLEAR_FILE,lf);*/
+			Optimize (res,lf);
+			if (jobIndex>=0)
+			{
+				mpiNode = ReceiveJobs (1, jobIndex);
+			}
+			else
+			{
+				myAIC 	  = 2*(res[1][0]-(baseParams+modelDF)*sampleCount/(sampleCount-baseParams-modelDF-1));
+			}
+		}
+	}
+	return 0;	
+}
+
+
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function PopulateModelMatrix (ModelMatrixName&, EFV)
+{
+	ModelMatrixName = {16,16}; 
+
+	hshift = 0;
+	
+	modelDefString = "";
+	modelDefString*16384;
+	globalDefString = "";
+	globalDefString*128;
+	
+	catCounterAL = {};
+	
+	/* build a branch length constraint */
+	
+	for (aa1 = 0; aa1 < 15; aa1 = aa1+1)
+	{
+		for (aa2 = aa1+1; aa2 < 16; aa2 = aa2+1)
+		{
+			bt = aaRateMultipliers[aa1][aa2];
+			if (aa1$4!=aa2$4 && aa1%4!=aa2%4 )
+			{
+				if (bt>=0)
+				{
+					fprintf (stdout, "\nInternal inconsistency at position ", aa1, ",", aa2, ". Should be -1, but is ", bt, " instead.\n");
+				}	
+			}
+			else
+			{
+				if (bt<0)
+				{
+					fprintf (stdout, "\nInternal inconsistency at position ", aa1, ",", aa2, ". Should be >=0, but is ", bt, " instead.\n");
+				}				
+			}
+			if (bt >= 0)
+			{
+				if (catCounterAL[bt] == 0)
+				{
+					globalDefString*("\nglobal R_"+bt+"=1;");
+				}
+				catCounterAL[bt] = catCounterAL[bt]+2*EFV[aa2]*EFV[aa1];
+				bt = "R_"+bt+"*";
+				modelDefString*("ModelMatrixName["+aa1+"]["+aa2+"] := "+bt+"t;\nModelMatrixName["+aa2+"]["+aa1+"] := "+bt+"t;\n");
+			}
+		}	
+    }		
+	modelDefString*0;
+	bt = aaRateMultipliers[0][3];
+	globalDefString*("\nR_"+bt+":=1;\n");
+	globalDefString*0;
+	ExecuteCommands (globalDefString);
+	ExecuteCommands (modelDefString);
+	
+	modelDefString = "";
+	modelDefString*128;
+	modelDefString*("global branchLengthScaler := "+catCounterAL[0]+"*R_0");
+	
+	for (aa1 = 1; aa1 < Abs(catCounterAL); aa1 = aa1+1)
+	{
+		modelDefString * ("+" + catCounterAL[aa1]+"*R_" + aa1);
+	}
+	modelDefString*0;
+	ExecuteCommands (modelDefString+";");
+	return 0;
+}
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function SpawnRandomString (clsCnt)
+{
+	rModel = {stateVectorDimension,1};
+	for (h=0; h<stateVectorDimension; h=h+1)
+	{
+		rModel[h] = Random(0,clsCnt)$1;
+	}
+	
+	return MakeStringCanonical(rModel,clsCnt);
+}
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function MakeStringCanonical (randomModel, classCount)
+{
+	compressedString = {classCount,1};
+	for (h=0; h<stateVectorDimension; h=h+1)
+	{
+		v = randomModel[h];
+		compressedString[v] = 1;
+	}
+	compressedString[0] = 0;
+	for (h=1; h<classCount; h=h+1)
+	{
+		compressedString[h] = compressedString[h]+compressedString[h-1];
+	}
+	for (h=0; h<stateVectorDimension; h=h+1)
+	{
+		v = randomModel[h];
+		v = compressedString[v];
+		randomModel[h] = v;
+	}
+	v = compressedString[classCount-1]+1;
+	if (v>1)
+	{
+		sortedOrder = {v,2};
+		for (h=0; h<v; h=h+1)
+		{
+			sortedOrder[h][0] = -1;
+		}
+		cc = 0;
+		for (h=0; h<stateVectorDimension; h=h+1)
+		{
+			hshift = randomModel[h];
+			if (sortedOrder[hshift][0] < 0)
+			{
+				sortedOrder[hshift][0] = cc;
+				sortedOrder[hshift][1] = hshift;
+				cc = cc+1;
+			}
+		}
+		sortedOrder = sortedOrder%1;
+		for (h=0; h<stateVectorDimension; h=h+1)
+		{
+			v = randomModel[h];
+			randomModel[h] = sortedOrder[v][0];
+		}
+		
+	}
+	return randomModel;
+}
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function StringToMatrix (stringSpec)
+{
+	matrixSpec = {16,16};
+	cc = 0;
+	for (h=0; h<16; h=h+1)
+	{
+		for (v=h+1; v<16; v=v+1)
+		{
+			cc2 = map120To48 [cc];
+			if (cc2>=0)
+			{
+				matrixSpec[h][v] = stringSpec[cc2];
+				matrixSpec[v][h] = stringSpec[cc2];
+			}
+			else
+			{
+				matrixSpec[h][v] = -1;
+				matrixSpec[v][h] = -1;
+			}
+			cc = cc+1;
+		}
+	}
+	return matrixSpec;
+}
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function IsChildViable (putativeChild)
+{
+	sampleString = MatrixToString (putativeChild);
+	myAIC = MasterList[sampleString];
+	testChild = putativeChild;
+	mutPassCount = 1;
+	while (myAIC < (-0.1))
+	{
+		if (verboseFlag)
+		{
+			fprintf (stdout,"Adjusting the child to avoid a duplicate. Pass ", mutPassCount, "\n");
+		}
+		
+		mutPassCount = mutPassCount + 1;
+		
+		sampleString = Min(Random(0,stateVectorDimension)$1,stateVectorDimension-1);
+		myAIC = testChild[sampleString];
+		
+		newValue = Random (0,rateClassesCount-0.0000001)$1;
+		
+		while (newValue == myAIC)
+		{
+			newValue = Random (0,rateClassesCount-0.0000001)$1;
+		}
+		
+		testChild [sampleString] = newValue;
+		sampleString = MatrixToString (testChild);
+		myAIC = MasterList[sampleString];
+	}
+	return testChild;
+}
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function UpdateBL (dummy)
+{
+	bestInd							= sortedScores[populationSize-1][1];
+	aaRateMultipliers 				= StringToMatrix(currentPopulation[bestInd]);
+	AAModelMatrix 					= 0;
+	MULTIPLY_BY_FREQS 				= PopulateModelMatrix ("AAModelMatrix", vectorOfFrequencies);
+	Model AAModel	     			= (AAModelMatrix,vectorOfFrequencies,1);
+	Tree givenTree				    = treeString;
+	LikelihoodFunction 				lf = (filteredData,givenTree);
+	
+	fprintf 						(progressFile,"\nUpdating branch lengths...");
+	Optimize (res,lf);
+	global Null_Scaler 				= 	branchLengthScaler;
+	
+	myAIC 	  = 2*(res[1][0]-(res[1][1])*sampleCount/(sampleCount-res[1][1]-1));
+	fprintf							(stdout, "\nUpdated BLs\nAICs: ", -myAIC, "\t",  -sortedScores[populationSize-1][0], "\n", lf, "\n");
+	sortedScores[populationSize-1][0] 		 = myAIC;
+	MasterList[sampleString] 				 = myAIC;
+	
+	return 0;
+}
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+
+
+SetDialogPrompt 	  		  ("Locate a dinucleotide file:");
+DataSet 		ds  		 = ReadDataFile (PROMPT_FOR_FILE);
+DataSetFilter	filteredData = CreateFilter(ds,2);
+
+sampleCount 				 = filteredData.sites;
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+HarvestFrequencies (vectorOfFrequencies,filteredData,2,2,0);
+
+SetDialogPrompt ("Save the best model to:");
+fprintf (PROMPT_FOR_FILE,CLEAR_FILE);
+modelFile = LAST_FILE_PATH;
+
+fpath = modelFile+".details";
+fprintf (fpath,CLEAR_FILE);
+
+aaRateMultipliers = StringToMatrix({48,1});
+
+aa_plain = 0;
+MULTIPLY_BY_FREQS 				= PopulateModelMatrix ("aa_plain", vectorOfFrequencies);
+Model AAPlainModel		 		= (aa_plain,vectorOfFrequencies,1);
+
+incFileName = HYPHY_LIB_DIRECTORY+"TemplateBatchFiles"+DIRECTORY_SEPARATOR+"queryTree.bf";
+ExecuteCommands  ("#include \""+incFileName+"\";");
+LikelihoodFunction lf = (filteredData,givenTree);
+
+ChoiceList (matingChoice, "Mating Weights",1,SKIP_NONE,
+			"Akaike Weights","Individuals are chosen to reproduce with based on their Akaike weights.",
+			"Equiprobable", "All individuals are equally likely to mate.",
+			"Rank","Mating probabilities are proportional to the c-AIC rank of the individual",
+			"Random","One of the three mating schemes in picked at random for every generation");
+
+if (matingChoice<0)
+{
+	return 0;
+}
+
+ChoiceList (seedChoice, "Seeds",1,SKIP_NONE,
+			"Random","The entire starting population is seeded at random.",
+			"Load", "Load some predefined partitions",
+			"Completely Random","The entire starting population is seeded at random, skipping even hardwired presets."
+);
+
+if (seedChoice<0)
+{
+	return 0;
+}
+
+if (seedChoice == 2)
+{
+	predef = {};
+}
+
+ChoiceList (reprFlag, "Mating Representation",1,SKIP_NONE,
+			"General","Use n-ary representation (n=number of rate classes).",
+			"Binary", "Use binary representation");
+
+if (reprFlag<0)
+{
+	return 0;
+}
+
+if (seedChoice == 1)
+{
+	SetDialogPrompt ("File with partition specifications:");
+	END_OF_FILE = 0;
+	fscanf (PROMPT_FOR_FILE,"NMatrix",seeds);
+	predef[Abs(predef)] = seeds;
+	while (!END_OF_FILE)
+	{
+		fscanf (LAST_FILE_PATH,"NMatrix",seeds);
+		if (Abs(seeds))
+		{
+			predef[Abs(predef)] = seeds;
+		}
+	}
+}
+
+currentPopulation  = {};
+Optimize (res,lf);
+baseParams = res[1][1];
+sortedScores	   = {populationSize,2};
+sortedScores[0][0] = 2*(res[1][0]-baseParams*sampleCount/(sampleCount-baseParams-1));
+sortedScores[0][1] = 0;
+currentPopulation [0] = {stateVectorDimension,1};
+
+global Null_Scaler = branchLengthScaler;
+
+
+/* INCLUDE THE CHC CORE */
+
+if (reprFlag)
+{
+	ibfPath = HYPHY_LIB_DIRECTORY + "TemplateBatchFiles" + DIRECTORY_SEPARATOR + "GA_CHC_Binary.ibf";
+}
+else
+{
+	ibfPath = HYPHY_LIB_DIRECTORY + "TemplateBatchFiles" + DIRECTORY_SEPARATOR + "GA_CHC.ibf";
+}
+ExecuteCommands ("#include \"" + ibfPath + "\";");
+
+/* try a consensus matrix */
+
+ExportAMatrix (modelFile,StringToMatrix(currentPopulation[populationSize-1]),1);
+fpath = modelFile+".bestAIC";
+
+fprintf (fpath, CLEAR_FILE, -sortedScores[populationSize-1][0]);
diff --git a/res/TemplateBatchFiles/ModelTest.bf b/res/TemplateBatchFiles/ModelTest.bf
new file mode 100644
index 0000000..622de47
--- /dev/null
+++ b/res/TemplateBatchFiles/ModelTest.bf
@@ -0,0 +1,725 @@
+/* first define global variables for the rate matrix */
+
+	global AC = 1;
+	global AT = 1;
+	global CG = 1;
+	global CT = 1;
+	global GT = 1;
+
+/* this is the matrix which does not include rate variation */
+
+	Q_Matrix = {{*,AC*t,t,AT*t}
+				{AC*t,*,CG*t,CT*t}
+				{t,CG*t,*,GT*t}
+				{AT*t,CT*t,GT*t,*}};
+			
+/* this is the matrix which does not include rate variation */
+
+	Q_Matrix_RV = {{*,AC*t*c,t*c,AT*t*c}
+				  {AC*t*c,*,CG*t*c,CT*t*c}
+				  {t*c,CG*t*c,*,GT*t*c}
+				  {AT*t*c,CT*t*c,GT*t*c,*}};
+			
+/* a utility matrix used to prepare variable constraints */
+
+	RateBiasTerms = {{"AC","1","AT","CG","CT","GT"}};	
+
+/* model fit cache: an associative array index by the full model name;
+   each entry is an associative array with three keys:
+   
+   	"LogL" 		- the log-likelihood score of the model
+   	"DF"   		- the number of model parameters
+   	"FitInfo"	- serialized likelihood function for the model
+*/
+
+	modelCache = {};
+
+/* 
+	model names and corresponding constraint strings;
+	the first column are names with equal base frequencies,
+	the second column are names with unequal base frequencies
+*/
+
+	 modelNameStrings = {{"JC69","F81"},
+						 {"K80","HKY85"},
+						 {"TrNef","TrN"},
+						 {"K81","K81uf"},
+						 {"TIMef","TIM"},
+						 {"TVMef","TVM"},
+						 {"SYM","GTR"}};
+
+	 modelStringsMap 	 = {};
+	 
+	 modelStringsMap ["000000"] = 0;
+	 modelStringsMap ["010010"] = 1;
+	 modelStringsMap ["010020"] = 2;
+	 modelStringsMap ["012210"] = 3;
+	 modelStringsMap ["012230"] = 4;
+	 modelStringsMap ["012310"] = 5;
+	 modelStringsMap ["012345"] = 6;
+	 
+	 modelStrings	= Rows (modelStringsMap); /* keys of modelStringsMap */
+                
+/* include this for directory functions */
+
+	ExecuteAFile  (HYPHY_LIB_DIRECTORY+"TemplateBatchFiles"+DIRECTORY_SEPARATOR+"Utility"+DIRECTORY_SEPARATOR+"GrabBag.bf");
+
+/**************************************************************************	
+Generate a function name from the model string, gamma type and base frequencies
+**************************************************************************/
+
+function generateModelDescriptor (modelSpecString, gammaType, freqsType)
+{
+	modelName = modelNameStrings[modelStringsMap[modelSpecString]][freqsType];
+	if (gammaType == 1)
+	{
+		return modelName + "+G";
+	}
+	if (gammaType == 2)
+	{
+		return modelName + "+G+I";
+	}
+	if (gammaType == 3)
+	{
+		return modelName + "+I";
+	}
+	return modelName;
+}
+
+ 
+/**************************************************************************/
+/* run a model with the rate matrix given in modelSpecString,
+   rate variation options given by gammaType (0: none, 1: gamma, 2: gamma+Inv, 3: Inv)
+   freqsVector contains the 4x1 vector of base frequencies to use
+   
+   returns a model description string
+*/
+	
+/**************************************************************************/
+function runAModel (modelSpecString, gammaType, freqsType)
+{
+	/* first check to see if the model has already been fitted */
+	
+	modelDescriptionString = generateModelDescriptor (modelSpecString, gammaType, freqsType);
+	
+	if (Abs (modelCache[modelDescriptionString]))
+	/* already done */
+	{
+		return modelDescriptionString;
+	}
+
+	/* 
+		clear parameter constraints 1st and then set them according 
+	    to the 6-char modelSpecString (as in 010010 for HKY85)
+	*/
+	
+	ClearConstraints (AC,AT,CG,CT,GT);
+	
+	/* generate a constraint string based on modelSpecString */
+	
+	CustomModelConstraintString = "";
+	CustomModelConstraintString * 128;
+
+	for (customLoopCounter2=1; customLoopCounter2<6; customLoopCounter2=customLoopCounter2+1)
+	{
+		for (customLoopCounter=0; customLoopCounter<customLoopCounter2; customLoopCounter=customLoopCounter+1)
+		{
+			if (modelSpecString[customLoopCounter2]==modelSpecString[customLoopCounter])
+			{
+				if (RateBiasTerms[customLoopCounter2] == "1")
+				{
+					CustomModelConstraintString * (RateBiasTerms[customLoopCounter]+":="+RateBiasTerms[customLoopCounter2]+";");
+				}
+				else
+				{
+					CustomModelConstraintString * (RateBiasTerms[customLoopCounter2]+":="+RateBiasTerms[customLoopCounter]+";");			
+				}
+				break;
+			}
+		}
+	}	
+	CustomModelConstraintString * 0;
+
+	/* define rate variation */
+	if (gammaType==1)
+	{
+		global alpha = .5;
+		alpha:>0.01;alpha:<100;
+		category c = (classCount, EQUAL, MEAN, 
+						GammaDist(_x_,alpha,alpha), 
+						CGammaDist(_x_,alpha,alpha), 
+						0 , 
+				  	    1e25,
+				  	    CGammaDist(_x_,alpha+1,alpha)
+				  	 );
+	}
+	else
+	{
+		if (gammaType==2)
+		{
+			global alpha   = .5;
+			alpha:>0.01;alpha:<100;
+
+			global P;
+			P :< 1-(1e-10);
+			P = 1/(classCount+1);
+			
+			global beta = 1;
+			beta:>0.01;
+			beta:<200;
+
+			beta := (1-P)*alpha;
+			
+			catFreqMatrix = {classCount+1,1};
+			catFreqMatrix [0] := P;
+			
+			for (h=1; h<=classCount;h=h+1)
+			{
+				catFreqMatrix [h] := (1-P)/classCount__;
+			}
+			
+			category c = (classCount+1, catFreqMatrix, MEAN, 
+					(1-P)*GammaDist(_x_,alpha,beta)*(_x_>0), 
+					(1-P)*CGammaDist(_x_,alpha,beta)*(_x_>0)+P, 
+					0, 
+			  	    1e25,
+			  	    (1-P)*CGammaDist(_x_,alpha+1,beta)*(alpha/beta)*(_x_>0)
+			  	 );
+		}	
+		else
+		{
+			if (gammaType==3)
+			{
+				global P;
+				P :< 1-(1e-10);
+				P = 1/2;
+				
+				catFreqMatrix = {2,1};
+				catFreqMatrix [0] := P;
+				catFreqMatrix [1] := (1-P);
+				
+				catRateMatrix = {{0,1/(1-P)}};
+				
+				category c = (2, catFreqMatrix, MEAN, 
+								, 
+								catRateMatrix, 
+								0, 
+						  	    1e25,
+						  	 );
+			}	
+		}
+	}
+
+	if (freqsType == 0)
+	{
+		freqsVector = equal_EFV;
+	}
+	else
+	{
+		freqsVector = PI_EFV;
+	}
+	
+	if (gammaType)
+	{
+		Model currentModel = (Q_Matrix_RV, freqsVector);
+	}
+	else
+	{
+		Model currentModel = (Q_Matrix, freqsVector);	
+	}
+	
+	if (Abs(CustomModelConstraintString)) /* have constraints */
+	{
+		ExecuteCommands (CustomModelConstraintString);
+	}
+	
+	Tree MTTree 		  = treeString;
+	LikelihoodFunction lf = (filteredData, MTTree);
+	Optimize 				(res,lf);
+	
+	/* cache model results */
+	
+	modelCache[modelDescriptionString] = {};
+	(modelCache[modelDescriptionString])["LogL"]    = res[1][0];
+	(modelCache[modelDescriptionString])["DF"]      = res[1][1] + 3*freqsType; 
+							/* add extra parameters for the frequencies if needed */
+	
+ 	/* export a serialized version of the likelihood function */
+ 	   
+	Export (lfInfo, lf);
+	(modelCache[modelDescriptionString])["FitInfo"] = lfInfo;
+	
+	return   modelDescriptionString;
+}
+
+/*************************************************************************
+
+	Compare two models, using the chi_1^2 or 0.5(chi_1^2+chi_0^2) test 
+	statistic, returning the p-value
+	
+	model2 is assumed to be the alternative, model1 is assumed to be the null
+	
+	If reportFlag is set, print the result of model comparison
+
+*************************************************************************/
+
+function compareTwoModels (model1, gamma1, freqs1, model2, gamma2, freqs2, useChiBar, reportFlag)
+{	
+	modelString1 = runAModel (model1, gamma1, freqs1);
+	modelString2 = runAModel (model2, gamma2, freqs2);
+
+	LRT	   = 2*((modelCache[modelString2])["LogL"]-(modelCache[modelString1])["LogL"]);
+	DEGF   = (modelCache[modelString2])["DF"]-(modelCache[modelString1])["DF"];
+		
+	if (useChiBar)
+	{
+		pV =  .5-.5*CChi2(LRT,DEGF);	
+	}
+	else
+	{
+		pV = 1-CChi2(LRT,DEGF);
+	}
+	
+	if (reportFlag)
+	{
+		reportTest (model1, gamma1, freqs1, model2, gamma2, freqs2, pV);
+	}
+	return pV;
+}
+
+/*************************************************************************
+	Report the results of model testing
+*************************************************************************/
+
+function reportTest (model1, gamma1, freqs1, model2, gamma2, freqs2, pValue)
+{
+	modelName1 = generateModelDescriptor (model1, gamma1, freqs1);
+	modelName2 = generateModelDescriptor (model2, gamma2, freqs2);
+
+	fprintf (stdout, "\n\tNull:", modelName1, "\n\t\tLog-likelihood = ", Format((modelCache[modelString1])["LogL"],12,4),
+														", ", (modelCache[modelString1])["DF"], " parameters."); 
+														
+	fprintf (stdout, "\n\tAlt :", modelName2, "\n\t\tLog-likelihood = ", Format((modelCache[modelString2])["LogL"],12,4), 
+														", ", (modelCache[modelString2])["DF"], " parameters."); 
+														
+	fprintf (stdout, "\n\n\tLR statistic       : ", 2*((modelCache[modelString2])["LogL"]-(modelCache[modelString1])["LogL"]),
+					 "\n\tDegrees of freedom : ",(modelCache[modelString2])["DF"]-(modelCache[modelString1])["DF"],
+					 "\n\tp-Value            : ", pValue);
+	
+	if (pValue<rejectAt)
+	{
+		fprintf (stdout, "\n\n\tNull hypothesis rejected\n\t", modelName2, " chosen.\n");
+		return modelName2;
+	}
+	else
+	{
+		fprintf (stdout, "\n\n\tNull hypothesis accepted\n\t", modelName1, " chosen.\n");
+		return modelName1;
+	}	
+	return 1;
+}     
+
+/*************************************************************************
+print model information
+*************************************************************************/
+
+function printModelDescription (modelString, gammaRate, modelFreq)
+{
+	sep =            "+---+-------------+-------------+-------------+-------------+\n";
+	fprintf (stdout, "Rate matrix\n", 
+					 sep,
+					 "|   |      A      |      C      |      G      |      T      |\n",
+					 sep,
+					 "| A |      *      | ",Format(AC,11,5)," | ", Format(1.0,11,5), " | ", Format(AT,11,5), " |\n",
+					 sep,
+					 "| C | ",Format(AC,11,5)," |      *      | ", Format(CG,11,5), " | ", Format(CT,11,5), " |\n",
+					 sep,
+					 "| G | ",Format(1,11,5), " | ",  Format(CG,11,5), " |      *      | ", Format(GT,11,5), " |\n",
+					 sep,
+					 "| T | ",Format(AT,11,5), " | ",  Format(CT,11,5), " | ",  Format(GT,11,5)," |      *      |\n",
+					 sep);
+						 
+	fprintf (stdout, "\nBase frequencies",
+					 "\nA = ", Format (freqsVector[0],10,4),
+					 "\nC = ", Format (freqsVector[1],10,4),
+					 "\nG = ", Format (freqsVector[2],10,4),
+					 "\nT = ", Format (freqsVector[3],10,4), "\n");
+					 
+	if (gammaRate)
+	{
+		fprintf (stdout, "\nRate variation");
+		GetInformation 		(catInfo, c);
+		for (idx = 0; idx < Columns (catInfo); idx = idx + 1)
+		{
+			fprintf (stdout, "\nRate ",Format (idx+1,5,0), " = ", Format (catInfo[0][idx], 10,5), " (weight = ", Format (catInfo[1][idx], 10,5), ")");
+		}
+		fprintf (stdout, "\n");
+	}
+	
+	return 1;
+}
+
+/*************************************************************************
+echo instructions of how to choose the model using the custom model 
+*************************************************************************/
+
+
+function echoModelSpec (modelString, modelRate, modelFreq)
+{
+	fprintf (stdout, "\n\nTo define this model (if it isn't predefined) for analyses,\nUse 'Custom' model with the following options:\n",
+					 "Model String:", modelString, "\n");
+					 
+	fprintf (stdout, "Model Options: ");
+	if (modelRate==0)
+	{
+		fprintf (stdout, "Global");
+	}
+	else
+	{
+		if (modelRate==1)
+		{
+			fprintf (stdout, "Rate Variation, then choose the Gamma distribution");
+		}
+		else
+		{
+			if (modelRate==2)
+			{
+				fprintf (stdout, "Rate Variation, then choose the Gamma+Inv distribution");
+			}
+			else
+			{
+				if (modelRate==3)
+				{
+					fprintf (stdout, "Rate Variation, then choose the Inv Class distribution");
+				}
+			}
+		}
+	}
+	fprintf (stdout, "\nEquilibrium Frequencies Option: ");
+	if (modelFreq)
+	{
+		fprintf (stdout, "Observed\n\n");	
+	}
+	else
+	{
+		fprintf (stdout, "Equal\n\n");	
+	}
+	return 1;
+}   
+
+                    
+
+/**************************************************************************/
+
+function doHierarchicalTest (echoFlag)
+{
+	if (echoFlag)
+	{
+		fprintf (stdout, "\n\n****** RUNNING HIERARCHICAL MODEL TESTING ******\n\n");
+	}
+
+	chosenMatrix = 0;
+	chosenRates  = 0;
+	chosenFreqs  = 0;
+	chosen2		 = 0;
+	chosen3      = 0;
+	chosen4		 = 0;
+	
+	/* do the frequencies test */
+	
+	if (echoFlag)
+	{
+		fprintf (stdout,"\n1). Checking for equilibrium frequencies equality.\n");
+	}
+
+	pVal 		=  compareTwoModels (modelStrings[0],0,0,modelStrings[0],0,1,0, echoFlag);
+	chosenFreqs = (pVal<rejectAt);
+	
+	/* do the tr=tv test */
+	
+	if (echoFlag)
+	{
+		fprintf (stdout,"\n2). Checking for equality of transition and transversion rates.\n");
+	}
+	
+	pVal 		=  compareTwoModels (modelStrings[0],0,chosenFreqs,modelStrings[1],0,chosenFreqs,0, echoFlag);
+	
+	chosen2 = (pVal<rejectAt);
+		
+	if (chosen2)
+	/* finetune the matrix */
+	{
+		if (echoFlag)
+		{
+			fprintf (stdout,"\n3). Checking for equality of A<->G and C<->T (transition) rates.\n");
+		}
+		pVal =  compareTwoModels (modelStrings[1],0,chosenFreqs,modelStrings[2],0,chosenFreqs,0, echoFlag);
+		chosen3 = (pVal<rejectAt);
+				
+		if (echoFlag)
+		{
+			fprintf (stdout,"\n4). Checking whether there are 1 or 2 transversion rates.\n");
+		}
+		
+		pVal =  compareTwoModels (modelStrings[1+chosen3],0,chosenFreqs,modelStrings[3+chosen3],0,chosenFreqs,0, echoFlag);
+		
+		chosen4      = (pVal<rejectAt);
+		chosenMatrix = 1+chosen3+2*chosen4;
+		if (chosen4)
+		/* fine tune some more */
+		{
+			if (echoFlag)
+			{
+				fprintf (stdout,"\n5). Checking whether there are 2 or 4 transversion rates.\n");
+			}
+			pVal =  compareTwoModels (modelStrings[3+chosen3],0,chosenFreqs,modelStrings[5+chosen3],0,chosenFreqs,0, echoFlag);
+			chosenMatrix = 3+chosen3+2*(pVal<rejectAt);
+		}
+		else
+		{
+			if (echoFlag)
+			{
+				fprintf (stdout,"\n...Skipping step 5...\n");
+			}
+		}
+	}
+	else
+	{
+		if (echoFlag)
+		{
+			fprintf (stdout,"\n...Skipping steps 3 through 6...\n");
+		}
+		chosenMatrix = 0;
+	}
+	
+	if (echoFlag)
+	{
+		fprintf (stdout,"\n6). Checking for evidence of rate variation.\n");
+	}
+	pVal =  compareTwoModels (modelStrings[chosenMatrix],0,chosenFreqs,modelStrings[chosenMatrix],1,chosenFreqs,1, echoFlag);
+	
+	if (echoFlag)
+	{
+			fprintf (stdout,"\n7). Checking for evidence of an invariant rate class.\n");
+	}
+	if (pVal<rejectAt)
+	/* accept rate variation */
+	{
+		pVal =  compareTwoModels (modelStrings[chosenMatrix],1,chosenFreqs,modelStrings[chosenMatrix],2,chosenFreqs,1, echoFlag);
+		if (pVal<rejectAt)
+		{
+			chosenRates = 2;
+		}
+		else
+		{
+			chosenRates = 1;
+		}
+	}
+	else
+	{
+		pVal =  compareTwoModels (modelStrings[chosenMatrix],0,chosenFreqs,modelStrings[chosenMatrix],3,chosenFreqs,1, echoFlag);
+		if (pVal<rejectAt)
+		{
+			chosenRates = 3;
+		}
+		else
+		{
+			chosenRates = 0;
+		}	
+	}
+	return 0;
+}
+
+/**************************************************************************/
+
+function doAICTest (echoFlag)
+{
+	if (echoFlag)
+	{
+		fprintf (stdout, "\n\n****** RUNNING AIC BASED MODEL SELECTION ******\n\n");
+	}
+	aicScore = 1e100;
+	
+	if (echoFlag)
+	{	
+		fprintf (stdout,"\n|  Model     | # prm |    lnL    |    AIC     |\n",
+				          "|------------|-------|-----------|------------|");   
+	}		
+	for (k=0; k<Columns(modelStrings); k=k+1)
+	{
+		for (i=0; i<2; i=i+1) /* freqOption */
+		{
+			for (j=0; j<4; j=j+1) /* gammaOption */
+			{
+				thisModelName = runAModel (modelStrings[k],j,i);
+				
+				modelLL	 = (modelCache[thisModelName])["LogL"];
+				modelDF  = (modelCache[thisModelName])["DF"];
+				
+				modelAIC = 2*(modelDF-modelLL);
+								
+				if (echoFlag)
+				{
+					while (Abs(thisModelName)<11)
+					{
+						thisModelName = thisModelName+" ";						
+					}
+					fprintf (stdout, "\n| ", thisModelName, "| ", Format (modelDF,5,0),
+										   " | ", Format (modelLL,9,3), " | ", Format (modelAIC,10,3), " |");
+				}
+				if (modelAIC < aicScore)
+				/* best model so far */
+				{
+					aicFreqs   = i;
+					aicRates   = j;
+					aicMatrix  = k;
+					aicScore = modelAIC;
+					if (echoFlag)
+					{
+						fprintf (stdout, " *");
+					}
+				}
+			}
+		}
+	}
+	if (echoFlag)
+	{
+		fprintf (stdout,"\n|------------|-------|-----------|------------|");   
+	}
+	
+	return 0;
+}
+
+/**************************************************************************/
+/* MAIN BODY 															  */
+/**************************************************************************/
+
+OPTIMIZE_SUMMATION_ORDER = 1;
+
+fprintf (stdout, "\n+--------------------------------+\n",
+				 "| RUNNING MODEL TESTING ANALYSIS |\n",
+				 "| Based on the program ModelTest |\n",
+				 "|              by                |\n",
+				 "|        David  Posada           |\n",
+				 "|             and                |\n",
+				 "|        Keith Crandall          |\n",
+				 "|                                |\n",
+				 "|    If you use this analysis,   |\n",
+				 "| be sure to cite the original   |\n",
+				 "| reference, which can be found  |\n",
+				 "| in Bioinformatics (1998)       |\n",
+				 "| Vol 14, ppg. 817-818           |\n",
+				 "+--------------------------------+\n");
+
+fprintf			  (stdout, "\nTesting space includes ", Abs(modelStringsMap)*8, " models\n");
+
+SetDialogPrompt   ("Please specify a nucleotide data file:");
+DataSet ds    	= ReadDataFile (PROMPT_FOR_FILE);
+
+dataFilePath	= LAST_FILE_PATH;
+DataSetFilter 	  filteredData = CreateFilter (ds,1);
+fprintf (stdout, "\n\nData read from \"",dataFilePath,"\"\n",ds,"\n");
+
+filePathComponents = splitFilePath (dataFilePath);
+
+HarvestFrequencies (PI_EFV,filteredData,1,1,1);
+equal_EFV = {{.25}{.25}{.25}{.25}};
+
+#include "queryTree.bf";
+
+classCount = 0;
+while (classCount<=0)
+{
+	fprintf (stdout, "\nNumber of rate classes in rate variation models (e.g. 4):");
+	fscanf  (stdin,"Number", classCount);
+	classCount = classCount $ 1; /* truncate the number */
+}
+
+KEEP_OPTIMAL_ORDER = 1;
+MESSAGE_LOGGING    = 0;
+USE_LAST_RESULTS   = 1;
+
+ChoiceList (runType,"Model Selection Method",1,SKIP_NONE,
+			"Hierarchical Test","Perform a series of nested model comparisons to select the model.",
+			"AIC Test","Obtain MLEs for each model, and select the best one using Akaike Information Criterion.",
+			"Both","Run the AIC test, followed by the Hierarchical test");
+			
+if (runType<0)
+{
+	return;
+}
+
+modelNum		   = 0;
+rejectCount 	   = 0;
+
+if (runType != 1) /* need to run hierarchical testing */
+{
+	rejectAt = 0;
+
+	while ((rejectAt<=0)||(rejectAt>=1))
+	{
+		fprintf (stdout, "\nModel rejection level (e.g. 0.05):");
+		fscanf  (stdin,"Number", rejectAt);
+	}
+}
+
+if (runType)
+{
+	doAICTest (1);
+	aicMdl = generateModelDescriptor (modelStrings[aicMatrix],aicRates,aicFreqs);
+	fprintf (stdout, "\n\nAIC-based model: ",aicMdl,", AIC = ", aicScore);
+}
+
+if (runType!=1)
+{
+	hMdl = doHierarchicalTest (1);
+}
+
+
+
+OPTIMIZE_SUMMATION_ORDER = 0;
+
+if (runType!=1)
+{
+	hMdl = generateModelDescriptor (modelStrings[chosenMatrix],chosenRates,chosenFreqs);
+	ExecuteCommands ((modelCache[hMdl])["FitInfo"]);
+	DEFAULT_FILE_SAVE_NAME = filePathComponents["FILENAME"] + "_hierarchicalFit.bf";
+	SetDialogPrompt ("Save hierarchical fit to:");
+	fprintf (PROMPT_FOR_FILE,CLEAR_FILE,(modelCache[hMdl])["FitInfo"]);
+	fprintf (stdout, "\n\n ******* Hierarchical Testing based model (",hMdl,") ******** \n\n");
+	printModelDescription (modelStrings[chosenMatrix],chosenRates,chosenFreqs);
+	echoModelSpec	 	  (modelStrings[chosenMatrix], chosenRates, chosenFreqs);
+}
+
+
+if (runType)
+{
+	if (runType == 2)
+	{
+		if (aicMdl != hMdl)
+		{
+			ExecuteCommands ((modelCache[aicMdl])["FitInfo"]);
+			DEFAULT_FILE_SAVE_NAME = filePathComponents["FILENAME"] + "_aicFit.bf";
+			SetDialogPrompt ("Save AIC-based fit to:");
+			fprintf (PROMPT_FOR_FILE,CLEAR_FILE,(modelCache[aicMdl])["FitInfo"]);
+		}
+		else
+		{
+			fprintf (stdout, "\nAIC based testing concurs with hierarchical testing\n");
+			OPTIMIZE_SUMMATION_ORDER = 1;
+			return 0;
+		}
+	}
+	else
+	{
+		ExecuteCommands ((modelCache[aicMdl])["FitInfo"]);
+		DEFAULT_FILE_SAVE_NAME = filePathComponents["FILENAME"] + "_aicFit.bf";
+		SetDialogPrompt ("Save AIC-based fit to:");
+		fprintf (PROMPT_FOR_FILE,CLEAR_FILE,(modelCache[aicMdl])["FitInfo"]);
+	}
+	fprintf (stdout, "\n\n ******* AIC based model (",aicMdl,") ******** \n\n");
+	printModelDescription (modelStrings[aicMatrix],aicRates,aicFreqs);
+	echoModelSpec	 	  (modelStrings[aicMatrix],aicRates,aicFreqs);
+}
+
+OPTIMIZE_SUMMATION_ORDER = 1;
diff --git a/res/TemplateBatchFiles/MolClockAllRoots.bf b/res/TemplateBatchFiles/MolClockAllRoots.bf
new file mode 100644
index 0000000..5485f8f
--- /dev/null
+++ b/res/TemplateBatchFiles/MolClockAllRoots.bf
@@ -0,0 +1,267 @@
+/*-------------------------------------------------------------------------------*/
+
+function PadString (padLength,padChar)
+{
+	for (padCounter=0;padCounter<padLength;padCounter=padCounter+1)
+	{
+		fprintf (stdout,padChar);
+	}
+	return padLength;
+}
+
+/*-------------------------------------------------------------------------------*/
+
+fprintf(stdout,"\n ---- RUNNING MOLECULAR CLOCKS ANALYSIS ---- \n");
+
+ChoiceList (dataType,"Data type",1,SKIP_NONE,"Nucleotide/Protein","Nucleotide or amino-acid (protein).",
+				     "Codon","Codon (several available genetic codes).");
+
+if (dataType<0) 
+{
+	return;
+}
+if (dataType)
+{
+	NICETY_LEVEL = 3;
+	#include "TemplateModels/chooseGeneticCode.def";
+}
+
+SetDialogPrompt ("Choose the data file:");
+
+DataSet ds = ReadDataFile (PROMPT_FOR_FILE);
+
+fprintf (stdout,"The following data was read:\n",ds,"\n");
+
+if (dataType)
+{
+	DataSetFilter filteredData = CreateFilter (ds,3,"","",GeneticCodeExclusions);
+}
+else
+{
+	DataSetFilter filteredData = CreateFilter (ds,1);
+}
+
+SelectTemplateModel(filteredData);
+
+#include "queryTree.bf";
+
+parameter2Constrain = 0;
+
+if (Rows("LAST_MODEL_PARAMETER_LIST")>1)
+{
+	ChoiceList (parameter2Constrain, "Parameter(s) to constrain:",1,SKIP_NONE,LAST_MODEL_PARAMETER_LIST);
+
+	if (parameter2Constrain<0)
+	{
+		return;
+	}
+	if (parameter2Constrain==0)
+	{
+		parameter2ConstrainString = "";
+		for (parameter2Constrain=Rows("LAST_MODEL_PARAMETER_LIST")-1; parameter2Constrain; parameter2Constrain = parameter2Constrain-1)
+		{
+			GetString (funnyString,LAST_MODEL_PARAMETER_LIST,parameter2Constrain);
+			parameter2ConstrainString = parameter2ConstrainString + funnyString + ",";
+		}
+		GetString (funnyString,LAST_MODEL_PARAMETER_LIST,0);
+		parameter2ConstrainString = parameter2ConstrainString + funnyString;
+	}
+	else
+	{
+		GetString (parameter2ConstrainString,LAST_MODEL_PARAMETER_LIST,parameter2Constrain-1);
+	}
+}
+else
+{
+	GetString (parameter2ConstrainString,LAST_MODEL_PARAMETER_LIST,0);
+}
+
+LikelihoodFunction lf = (filteredData,givenTree);
+
+Optimize (res,lf);
+
+fprintf (stdout, "\n\nRESULTS WITHOUT THE CLOCK:\n",lf);
+
+fullModelLik = res[1][0];
+
+fullVars = res[1][1];
+
+/* now specify the constraints */
+
+fprintf (stdout, "\n\n\nRESULTS FOR DIFFERENT ROOTINGS\n\n(*)   - Clock rejected at significance level 0.05\n(**)  - Clock rejected at significance level 0.01\n(***) - Clock rejected at significance level 0.001\n\n");
+
+intBranchCount  = BranchCount (givenTree);
+leafBranchCount = TipCount	  (givenTree);
+
+nodeLength = 11;
+
+for (nodeCounter = 0; nodeCounter < intBranchCount; nodeCounter = nodeCounter+1)
+{
+	anIntBranch   = BranchName (givenTree,nodeCounter);
+	anIntBranch   = Abs (anIntBranch)+2;
+	if (anIntBranch>nodeLength)
+	{
+		nodeLength = anIntBranch;
+	}
+}
+
+for (nodeCounter = 0; nodeCounter < leafBranchCount; nodeCounter = nodeCounter+1)
+{
+	anIntBranch   = TipName (givenTree,nodeCounter);
+	anIntBranch   = Abs (anIntBranch)+2;
+	if (anIntBranch>nodeLength)
+	{
+		nodeLength = anIntBranch;
+	}
+}
+
+separator = "+-----------";
+
+for (nodeCounter = 10; nodeCounter < nodeLength; nodeCounter = nodeCounter+1)
+{
+	separator = separator + "-";
+}
+
+separator = separator + "+--------------+-------------+------------+\n";
+
+fprintf (stdout, separator, "| Rooted At ");
+dummy = PadString (nodeLength-10," ");
+fprintf (stdout, "| LR Statistic | Constraints |  P-Value   |\n",separator);
+
+if (MPI_NODE_COUNT>1)
+{
+	MPINodeState = {MPI_NODE_COUNT-1,1};
+	MPINodeRoot  = {MPI_NODE_COUNT-1,1};
+	MPINodeRoot[0]  = "";
+	OPTIMIZE_SUMMATION_ORDER = 0;
+}
+
+for (nodeCounter = 0; nodeCounter < intBranchCount+leafBranchCount; nodeCounter = nodeCounter+1)
+{
+	if (nodeCounter<intBranchCount)
+	{
+		anIntBranch   = BranchName (givenTree,nodeCounter);
+	}
+	else
+	{
+		anIntBranch   = TipName (givenTree,nodeCounter-intBranchCount);	
+	}
+	
+	aRerootedTree = RerootTree (givenTree, anIntBranch);
+	
+	Tree		clockTree = aRerootedTree;
+	
+	ExecuteCommands ("MolecularClock (clockTree,"+parameter2ConstrainString+");");
+
+	LikelihoodFunction lfConstrained = (filteredData, clockTree);
+	
+	if (MPI_NODE_COUNT>1)
+	{
+		for (mpiNode = 0; mpiNode < MPI_NODE_COUNT-1; mpiNode = mpiNode+1)
+		{
+			if (MPINodeState[mpiNode]==0)
+			{
+				break;	
+			}
+		}
+		
+		if (mpiNode==MPI_NODE_COUNT-1)
+		/* all nodes busy */
+		{
+			mpiNode = ReceiveJobs (1);
+		}
+		else
+		{
+			MPISend (mpiNode+1,lfConstrained);
+			MPINodeState[mpiNode] = 1;
+			MPINodeRoot[mpiNode] = anIntBranch;
+		}
+	}
+	else
+	{
+		Optimize (lfConstrained_MLES,lfConstrained);
+		dummy = ReceiveJobs (0);
+	}
+}
+
+if (MPI_NODE_COUNT>1)
+{
+	while (1)
+	{
+		for (nodeCounter = 0; nodeCounter < MPI_NODE_COUNT-1; nodeCounter = nodeCounter+1)
+		{
+			if (MPINodeState[nodeCounter]==1)
+			{
+				fromNode = ReceiveJobs (0);
+				break;	
+			}
+		}
+		if (nodeCounter == MPI_NODE_COUNT-1)
+		{
+			break;
+		}
+	}	
+	OPTIMIZE_SUMMATION_ORDER = 1;
+}
+
+/*-------------------------------------------------------------------------------*/
+
+function ReceiveJobs (sendOrNot)
+{
+	if (MPI_NODE_COUNT>1)
+	{
+		MPIReceive (-1, fromNode, result_String);
+		anIntBranch2 = MPINodeRoot[fromNode-1];
+		if (sendOrNot)
+		{
+			MPISend (fromNode,lfConstrained);
+			MPINodeRoot[fromNode-1] = anIntBranch;
+		}
+		else
+		{
+			MPINodeState[fromNode-1] = 0;
+			MPINodeRoot[fromNode-1]  = "";
+		}
+		
+		anIntBranch = anIntBranch2;
+		
+		ExecuteCommands (result_String);
+	}
+	
+	lnLikDiff = 2(fullModelLik-lfConstrained_MLES[1][0]);
+
+	degFDiff = fullVars - lfConstrained_MLES[1][1];
+	
+	fprintf (stdout, "| ", anIntBranch);
+
+	dummy = PadString (nodeLength-Abs(anIntBranch)," ");
+	
+	pValue = 1-CChi2(lnLikDiff,degFDiff);
+
+	fprintf (stdout, "| ", Format (lnLikDiff,12,6), " | ", Format (degFDiff,11,0), " | ", Format (pValue,10,8), " |");
+
+	if (pValue<0.001)
+	{
+		fprintf (stdout, " (***)");
+	}
+	else
+	{
+		if (pValue<0.01)
+		{
+			fprintf (stdout, " (**)");
+		}
+		else
+		{
+			if (pValue<0.05)
+			{
+				fprintf (stdout, " (*)");
+			}
+		}
+	}
+
+	fprintf (stdout, "\n",separator);
+			
+	return fromNode-1;
+}
+
+
diff --git a/res/TemplateBatchFiles/MolecularClock.bf b/res/TemplateBatchFiles/MolecularClock.bf
new file mode 100644
index 0000000..92606d2
--- /dev/null
+++ b/res/TemplateBatchFiles/MolecularClock.bf
@@ -0,0 +1,147 @@
+#include "molclockBootstrap.bf";
+
+RESTORE_GLOBALS 	= 1;
+_DO_TREE_REBALANCE_ = 0;
+VERBOSITY_LEVEL     = -1;
+
+function RestoreGlobalValues (lfIndex)
+{
+	if (lfIndex==0)
+	{
+		for (i=0;i<SAVE_GLOBALS;i=i+1)
+		{
+			SetParameter (lf,i,globalSpoolMatrix[i]);
+		}
+	}
+	if (lfIndex==1)
+	{
+		for (i=0;i<SAVE_GLOBALS2;i=i+1)
+		{
+			SetParameter (lfConstrained,i,globalSpoolMatrix2[i]);
+		}
+	}
+	return 0;
+}
+
+
+
+fprintf(stdout,"\n ---- RUNNING MOLECULAR CLOCK ANALYSIS ---- \n");
+
+ChoiceList (dataType,"Data type",1,SKIP_NONE,"Nucleotide/Protein","Nucleotide or amino-acid (protein).",
+				     "Codon","Codon (several available genetic codes).");
+
+if (dataType<0) 
+{
+	return;
+}
+if (dataType)
+{
+	NICETY_LEVEL = 3;
+	#include "TemplateModels/chooseGeneticCode.def";
+}
+
+SetDialogPrompt ("Choose the data file:");
+
+DataSet ds = ReadDataFile (PROMPT_FOR_FILE);
+
+fprintf (stdout,"The following data was read:\n",ds,"\n");
+
+if (dataType)
+{
+	DataSetFilter filteredData = CreateFilter (ds,3,"","",GeneticCodeExclusions);
+}
+else
+{
+	DataSetFilter filteredData = CreateFilter (ds,1);
+}
+
+SelectTemplateModel(filteredData);
+
+#include "queryTree.bf";
+
+global RelRatio;
+
+RelRatio = 1.0;
+
+relationString = ":=RelRatio*";
+
+parameter2Constrain = 0;
+
+if (Rows("LAST_MODEL_PARAMETER_LIST")>1)
+{
+	ChoiceList (parameter2Constrain, "Parameter(s) to constrain:",1,SKIP_NONE,LAST_MODEL_PARAMETER_LIST);
+
+	if (parameter2Constrain<0)
+	{
+		return;
+	}
+	if (parameter2Constrain==0)
+	{
+		parameter2ConstrainString = "";
+		for (parameter2Constrain=Rows("LAST_MODEL_PARAMETER_LIST")-1; parameter2Constrain; parameter2Constrain = parameter2Constrain-1)
+		{
+			GetString (funnyString,LAST_MODEL_PARAMETER_LIST,parameter2Constrain);
+			parameter2ConstrainString = parameter2ConstrainString + funnyString + ",";
+		}
+		GetString (funnyString,LAST_MODEL_PARAMETER_LIST,0);
+		parameter2ConstrainString = parameter2ConstrainString + funnyString;
+	}
+	else
+	{
+		GetString (parameter2ConstrainString,LAST_MODEL_PARAMETER_LIST,parameter2Constrain-1);
+	}
+}
+else
+{
+	GetString (parameter2ConstrainString,LAST_MODEL_PARAMETER_LIST,0);
+}
+
+timer = Time(0);
+
+LikelihoodFunction lf = (filteredData,givenTree);
+
+Optimize (res,lf);
+
+separator = "*-----------------------------------------------------------*";
+
+fprintf (stdout, "\n", separator, "\nRESULTS WITHOUT THE CLOCK:\n",lf);
+
+fullModelLik = res[1][0];
+
+fullVars = res[1][1];
+
+/* now specify the constraint */
+
+Tree clockTree = treeString;
+
+ExecuteCommands ("MolecularClock (clockTree,"+parameter2ConstrainString+");");
+
+LikelihoodFunction lfConstrained = (filteredData, clockTree);
+
+USE_LAST_RESULTS = 1;
+Optimize (res1,lfConstrained);
+USE_LAST_RESULTS = 0;
+
+SAVE_GLOBALS = res1[1][2];
+
+if (SAVE_GLOBALS)
+{
+	globalSpoolMatrix = {1,SAVE_GLOBALS};
+
+	for (i=0;i<SAVE_GLOBALS;i=i+1)
+	{
+		globalSpoolMatrix[i]=res1[0][i];
+	}
+}
+
+fprintf (stdout, "\n", separator,"\n\nRESULTS WITH THE CLOCK:\n",lfConstrained);
+
+lnLikDiff = 2(fullModelLik-res1[1][0]);
+
+degFDiff = fullVars - res1[1][1];
+
+fprintf (stdout, "\n", separator,"\n\n-2(Ln Likelihood Ratio)=",lnLikDiff,"\n","Constrained parameters:",Format(degFDiff,0,0));
+
+fprintf (stdout, "\nP-Value:",1-CChi2(lnLikDiff,degFDiff));
+
+fprintf (stdout, "\nCPU time taken: ", Time(0)-timer, " seconds.\n");
diff --git a/res/TemplateBatchFiles/NeighborJoining.bf b/res/TemplateBatchFiles/NeighborJoining.bf
new file mode 100644
index 0000000..a778647
--- /dev/null
+++ b/res/TemplateBatchFiles/NeighborJoining.bf
@@ -0,0 +1,189 @@
+ChoiceList (distanceChoice, "Distance Computation",1,SKIP_NONE,
+			"Distance formulae","Use one of the predefined distance measures based on data comparisons. Fast.",
+			"Full likelihood","Estimate distances using pairwise MLE. More choices but slow.",
+			"Use existing matrix","Load a HyPhy distance matrix for the data file");
+			
+if (distanceChoice < 0)
+{
+	return 0;
+}
+
+#include "distanceMethodNPBootstrap.bf";
+
+if (distanceChoice == 2)
+{
+	IS_NPBOOTSTRAP_AVAILABLE = 0;
+}
+
+ChoiceList (dataType,"Data type",1,SKIP_NONE,"Nucleotide/Protein","Nucleotide or amino-acid (protein).",
+				     "Codon","Codon (several available genetic codes).");
+
+A_DISTANCE_METHOD   = 1;
+
+
+if (dataType<0) 
+{
+	return;
+}
+if (dataType)
+{
+	NICETY_LEVEL = 3;
+	SetDialogPrompt ("Please choose a codon data file:");
+	#include "TemplateModels/chooseGeneticCode.def";
+}
+else
+{
+	SetDialogPrompt ("Please choose a nucleotide or amino-acid data file:");
+}
+
+
+DataSet ds = ReadDataFile (PROMPT_FOR_FILE);
+
+if (dataType)
+{
+	DataSetFilter filteredData = CreateFilter (ds,3,"","",GeneticCodeExclusions);
+}
+else
+{
+	DataSetFilter filteredData = CreateFilter (ds,1,"","");
+}
+
+if (distanceChoice == 1)
+{
+	SelectTemplateModel(filteredData);
+}
+
+ChoiceList (methodIndex,"Negative Branch Lengths",1,SKIP_NONE,
+			"Keep Negative","Negative Branch Lengths are Allowed.",
+			"Force Zero","Negative Branch Lengths are Forced to 0.");			
+if (methodIndex<0)
+{
+	return;
+}
+
+
+function InferTreeTopology(verbFlag)
+{
+	distanceMatrix = {ds.species,ds.species};
+
+	if (distanceChoice)
+	{
+		if (distanceChoice == 2)
+		{
+			SetDialogPrompt ("Load the distance matrix");
+			fscanf (PROMPT_FOR_FILE,"NMatrix",distanceMatrix);
+			if ((Rows(distanceMatrix) != ds.species)||(Columns(distanceMatrix) != ds.species))
+			{
+				fprintf (stdout, "\nThe dimensions of the distance matrix are incompatible with the data set.\n");
+				return  0;
+			}
+		}
+		else
+		{
+			if (verbFlag)
+			{
+				fprintf (stdout,"\nHYPHY Kernel is computing pairwise maximum likelihood distance estimates. A total of ", Format(ds.species*(ds.species-1)/2,0,0),
+							   " estimations will be performed.\n");
+			}
+
+			_pddVF = 1;
+			ExecuteAFile ("pairwiseDistanceEstimator.ibf");
+		}
+	}
+	else
+	{
+		#include "chooseDistanceFormula.def";
+		
+		dummy = InitializeDistances (0);
+		
+		for (i = 0; i<ds.species; i=i+1)
+		{
+			for (j = i+1; j<ds.species; j = j+1)
+			{
+				distanceMatrix[i][j] = ComputeDistanceFormula (i,j);
+			}
+		}
+	}
+
+	MESSAGE_LOGGING 		 	= 1;
+	cladesMade 					= 1;
+	
+
+	if (ds.species == 2)
+	{
+		d1 = distanceMatrix[0][1]/2;
+		treeNodes = {{0,1,d1__},
+					 {1,1,d1__},
+					 {2,0,0}};
+					 
+		cladesInfo = {{2,0}};
+	}
+	else
+	{
+		if (ds.species == 3)
+		{
+			d1 = (distanceMatrix[0][1]+distanceMatrix[0][2]-distanceMatrix[1][2])/2;
+			d2 = (distanceMatrix[0][1]-distanceMatrix[0][2]+distanceMatrix[1][2])/2;
+			d3 = (distanceMatrix[1][2]+distanceMatrix[0][2]-distanceMatrix[0][1])/2;
+			treeNodes = {{0,1,d1__},
+						 {1,1,d2__},
+						 {2,1,d3__}
+						 {3,0,0}};
+						 
+			cladesInfo = {{3,0}};		
+		}
+		else
+		{	
+			njm = (distanceMatrix > methodIndex)>=ds.species;
+				
+			treeNodes 		= {2*(ds.species+1),3};
+			cladesInfo	    = {ds.species-1,2};
+			
+			for (i=Rows(treeNodes)-1; i>=0; i=i-1)
+			{
+				treeNodes[i][0] = njm[i][0];
+				treeNodes[i][1] = njm[i][1];
+				treeNodes[i][2] = njm[i][2];
+			}
+
+			for (i=Rows(cladesInfo)-1; i>=0; i=i-1)
+			{
+				cladesInfo[i][0] = njm[i][3];
+				cladesInfo[i][1] = njm[i][4];
+			}
+			
+			njm = 0;
+		}
+	}
+	distanceMatrix = 0;
+	
+	return 1.0;
+}
+
+
+DISTANCE_PROMPTS  = 1;
+p = InferTreeTopology(1.0);
+DISTANCE_PROMPTS = 0;
+
+/* now with the treeNodes matrix ready we can convert it into a Newick string */
+
+treeString = TreeMatrix2TreeString (1);
+
+fprintf (stdout,"\n\n --------------------- INFERRED TREE --------------------- \n\n", treeString);
+
+fprintf (stdout, "\n\n***********Save this tree to a file (y/n)?");
+
+fscanf  (stdin, "String", resp);
+
+if ((resp!="n")&&(resp!="N"))
+{
+	SetDialogPrompt ("Write tree string to:");
+	fprintf (PROMPT_FOR_FILE,CLEAR_FILE,treeString,";");
+}
+
+UseModel (USE_NO_MODEL);
+
+Tree Inferred_Tree = treeString; 
+
+bestTreeNodes = treeNodes;
+
diff --git a/res/TemplateBatchFiles/NielsenYang.bf b/res/TemplateBatchFiles/NielsenYang.bf
new file mode 100644
index 0000000..cc5fedb
--- /dev/null
+++ b/res/TemplateBatchFiles/NielsenYang.bf
@@ -0,0 +1,1209 @@
+ModelNames = {{"Neutral",
+	  		  "Selection",
+			  "Discrete",
+			  "Freqs",
+			  "Gamma",
+			  "2 Gamma",
+			  "Beta",
+			  "Beta & w",
+			  "Beta & Gamma",
+			  "Beta & (Gamma+1)",
+			  "Beta & (Normal>1)",
+			  "0 & 2 (Normal>1)",
+			  "3 Normal",
+			  "Gamma mod Beta",
+			  "Beta & 1"}};
+			  			       
+MAXIMUM_ITERATIONS_PER_VARIABLE = 2000;
+OPTIMIZATION_PRECISION 			= 0.001;
+
+modelLL							= {};
+			  
+/*-------------------------------------------------------------------------------*/
+
+function PromptForAParameter (promptString, leftBound, rightBound, midx)
+{
+	if (noMorePrompting)
+	{
+		return -1;
+		
+	}
+	
+	value = leftBound - 1;
+	while ((value < leftBound)||(value > rightBound))
+	{
+		fprintf (stdout, "\n[", ModelNames[midx], "] ", promptString, " in [", leftBound, ",", rightBound, "] (-2 to quit):");
+		fscanf	(stdin , "Number", value);
+		if (value == (-2))
+		{
+			noMorePrompting = -1;
+			return -1;
+		}
+	}
+	
+	return value;
+}
+
+/*-------------------------------------------------------------------------------*/
+
+function PromptForWeights (promptString, wc,  midx)
+{
+	resMx = {wc,1};
+	if (noMorePrompting)
+	{
+		return resMx;
+	}
+	
+	wci	  = 0;
+	currentMax = 1;
+		
+	for (widx = 0; (widx < wc-1)&&(currentMax>0); widx = widx+1)
+	{
+		resMx[wci] = PromptForAParameter (promptString[wci], 0, currentMax, midx);
+		if (resMx[wci] == (-1))
+		{
+			return resMx;
+		}
+		currentMax = currentMax - resMx[wci];
+		wci = wci+1;
+	}
+	
+	
+	leftOver = (1-resMx[0]);
+	
+	for (widx = 1; widx < wc-1; widx = widx+1)
+	{
+		if (leftOver == 0)
+		{
+			return resMx;
+		}
+		resMx [widx] = resMx [widx]/leftOver;
+		leftOver = leftOver*(1-resMx[widx]);
+	}
+	
+	return resMx;
+}
+
+/*-------------------------------------------------------------------------------*/
+
+function WriteSnapshot (modelIdx)
+{
+	likOF = LIKELIHOOD_FUNCTION_OUTPUT;
+	LIKELIHOOD_FUNCTION_OUTPUT = 6;
+	SPOOL_FILE = SUMMARY_FILE+"_MODEL_"+modelIdx+".nex";
+	fprintf (SPOOL_FILE, CLEAR_FILE, lf);
+	LIKELIHOOD_FUNCTION_OUTPUT = likOF;
+	return 0;
+}
+
+/*-------------------------------------------------------------------------------*/
+
+function PromptForModelParameter (modelIdx)
+{
+	noMorePrompting = 0;
+	if (modelIdx == 0)
+	{
+		global P = PromptForAParameter ("Weight for the '0' rate class", 0, 1, modelIdx);
+	}
+	else
+	{
+		if (modelIdx == 1)
+		{
+			promptMx  = {{"Weight for the '0' rate class", "Weight for the '1' rate class"}};
+			wtMx	  = PromptForWeights (promptMx, 3, modelIdx);
+			global P1 = wtMx[0];
+			global P2 = wtMx[1];
+			global W = PromptForAParameter ("Adjustable rate value", 0, 10000 , modelIdx);
+		}		
+		else
+		{
+			if (modelIdx == 2)
+			{
+				promptMx  = {{"Weight for the lowest rate class", "Weight for the middle rate class"}};
+				wtMx	  = PromptForWeights (promptMx, 3, modelIdx);
+				global P1 = wtMx[0];
+				global P2 = wtMx[1];
+
+				global R_1 = PromptForAParameter ("Lowest Rate Value",  0,  10000 , modelIdx);
+				global W1  = PromptForAParameter ("Middle Rate Value", R_1, 10000 , modelIdx);
+				global R_2 = PromptForAParameter ("Highest Rate Value", W1, 10000 , modelIdx);
+
+				R_1	= R_1/W1;
+				R_2 = R_2/W1;
+			}
+			else
+			{
+				if (modelIdx == 3)
+				{
+					promptMx  = {{"Weight for the '0' rate class", "Weight for the '1/3' rate class", "Weight for the '2/3' rate class",  
+								  "Weight for the '1' rate class"}};
+
+					wtMx	  = PromptForWeights (promptMx, 5, modelIdx);
+					global P1 = wtMx[0];
+					global P2 = wtMx[1];
+					global P3 = wtMx[2];
+					global P4 = wtMx[3];
+				}
+				else
+				{
+					if ((modelIdx == 4)||(modelIdx == 5))
+					{
+						global alpha = PromptForAParameter ("Alpha parameter for the gamma distribution", 0.01, 100 , modelIdx);
+						global beta  = PromptForAParameter ("Beta  parameter for the gamma distribution", 0.01, 200 , modelIdx);
+						if (modelIdx == 5)
+						{
+							global alpha2 = PromptForAParameter ("Alpha parameter for the 2nd gamma distribution", 0.01, 100 , modelIdx);
+						}
+					}
+					else
+					{
+						if ((modelIdx == 6)||(modelIdx == 7)||(modelIdx == 8)||(modelIdx == 9)||(modelIdx == 10)||(modelIdx == 14))
+						{
+							global betaP = PromptForAParameter ("P parameter for the beta distribution", 0.05, 85 , modelIdx);
+							global betaQ = PromptForAParameter ("Q parameter for the beta distribution", 0.05, 85 , modelIdx);
+							global P 	 = PromptForAParameter ("Mixture weight for the beta distribution", 0, 1, modelIdx);
+							if (modelIdx == 7)
+							{
+								global W = PromptForAParameter ("Value for omega", 1, 10000 , modelIdx);
+							}
+							if ((modelIdx == 8)||(modelIdx == 9))
+							{
+								global alpha = PromptForAParameter ("Alpha parameter for the gamma distribution", 0.01, 100 , modelIdx);
+							}
+							if (modelIdx == 9)
+							{
+								global beta = PromptForAParameter ("Beta parameter for the gamma distribution", 0.01, 500 , modelIdx);
+							}
+							if (modelIdx == 10)
+							{
+								global mu 	 = PromptForAParameter ("mu parameter for the normal distribution", 0, 10000 , modelIdx);
+								global sigma = PromptForAParameter ("sigma parameter for the normal distribution", 0.0001, 10000 , modelIdx);
+							}
+							if (modelIdx == 14)
+							{
+								global W := 1;
+							}
+						}
+						else
+						{
+							if (modelIdx == 11)
+							{
+								promptMx  = {{"Weight for the '0' rate class", "Weight for the first normal in the mixture"}};
+								wtMx	  = PromptForWeights (promptMx, 3, modelIdx);
+								P 		  = wtMx[0];
+								P1		  = wtMx[1];
+								
+								global mu 	  = PromptForAParameter ("mu parameter for the first     normal distribution", 0, 10000 , modelIdx);
+								global sigma  = PromptForAParameter ("sigma parameter for the first  normal distribution", 0.0001, 10000 , modelIdx);
+								global sigma1 = PromptForAParameter ("sigma parameter for the second normal distribution", 0.0001, 10000 , modelIdx);
+							}
+							else
+							{
+								if (modelIdx == 12)
+								{
+									promptMx  = {{"Weight for the first normal in the mixture", "Weight for the second normal in the mixture"}};
+									wtMx	  = PromptForWeights (promptMx, 3, modelIdx);
+									P 		  = wtMx[0];
+									P1		  = wtMx[1];
+							
+									global mu 	  = PromptForAParameter ("mu parameter for the first     normal distribution", 0, 10000 , modelIdx);
+									global sigma  = PromptForAParameter ("sigma parameter for the first  normal distribution", 0.0001, 10000 , modelIdx);
+									global sigma1 = PromptForAParameter ("sigma parameter for the second normal distribution", 0.0001, 10000 , modelIdx);
+									global sigma2 = PromptForAParameter ("sigma parameter for the third normal distribution", 0.0001, 10000 , modelIdx);
+								}
+								if (modelIdx == 13)
+								{
+									global alpha = PromptForAParameter ("Alpha parameter for the gamma distribution", 0.01, 100 , modelIdx);
+									global beta  = PromptForAParameter ("Beta  parameter for the gamma distribution", 0.01, 200 , modelIdx);
+									global betaP = PromptForAParameter ("P parameter for the beta distribution", 0.05, 85 , modelIdx);
+									global betaQ = PromptForAParameter ("Q parameter for the beta distribution", 0.05, 85 , modelIdx);
+								}
+							}
+						}
+					}				
+				}	
+			}	
+		}	
+	}		
+	return noMorePrompting;	
+}
+
+#include "TemplateModels/Yang2000Distributions.def";
+
+/* ____________________________________________________________________________________________________________________*/
+
+function FrameText (frameChar,vertChar,parOff,theText)
+{
+	h = Abs (theText)+4;
+	fprintf (stdout,"\n");	
+	for (k=0; k<parOff; k=k+1)
+	{
+		fprintf (stdout," ");
+	}
+	for (k=0; k<h;k=k+1)
+	{
+		fprintf (stdout,frameChar);
+	}
+	fprintf (stdout,"\n");	
+	for (k=0; k<parOff; k=k+1)
+	{
+		fprintf (stdout," ");
+	}
+	fprintf (stdout,vertChar," ",theText," ",vertChar,"\n");
+	for (k=0; k<parOff; k=k+1)
+	{
+		fprintf (stdout," ");
+	}
+	for (k=0; k<h;k=k+1)
+	{
+		fprintf (stdout,frameChar);
+	}
+	fprintf (stdout,"\n");	
+	return 0;
+}
+
+/* ____________________________________________________________________________________________________________________*/
+
+function BuildCodonFrequencies4 (obsF)
+{
+	PIStop = 1.0;
+	result = {ModelMatrixDimension,1};
+	hshift = 0;
+
+	for (h=0; h<64; h=h+1)
+	{
+		first = h$16;
+		second = h%16$4;
+		third = h%4;
+		if (_Genetic_Code[h]==10) 
+		{
+			hshift = hshift+1;
+			PIStop = PIStop-obsF[first][0]*obsF[second][0]*obsF[third][0];
+			continue; 
+		}
+		result[h-hshift][0]=obsF[first][0]*obsF[second][0]*obsF[third][0];
+	}
+	return result*(1.0/PIStop);
+}
+
+/* ____________________________________________________________________________________________________________________*/
+
+function BuildCodonFrequencies12 (obsF)
+{
+	PIStop = 1.0;
+	result = {ModelMatrixDimension,1};
+	hshift = 0;
+
+	for (h=0; h<64; h=h+1)
+	{
+		first = h$16;
+		second = h%16$4;
+		third = h%4;
+		if (_Genetic_Code[h]==10) 
+		{
+			hshift = hshift+1;
+			PIStop = PIStop-obsF[first][0]*obsF[second][1]*obsF[third][2];
+			continue; 
+		}
+		result[h-hshift][0]=obsF[first][0]*obsF[second][1]*obsF[third][2];
+	}
+	return result*(1.0/PIStop);
+}
+/* ____________________________________________________________________________________________________________________*/
+
+
+function GetDistributionParameters (sigLevel)
+{
+	GetInformation (distrInfo,c);
+	D = Columns(distrInfo);
+	E = 0.0;
+	T = 0.0;
+	sampleVar = 0.0;
+	for (k=0; k<D; k=k+1)
+	{
+		T = distrInfo[0][k]*distrInfo[1][k];
+		E = E+T;
+		sampleVar = T*distrInfo[0][k]+sampleVar;
+	}
+	sampleVar = sampleVar-E*E;
+
+	fprintf  (SUMMARY_FILE,"\n\n------------------------------------------------\n\ndN/dS = ",E, " (sample variance = ",sampleVar,")\n");
+	for (k=0; k<D; k=k+1)
+	{
+		fprintf (SUMMARY_FILE,"\nRate[",Format(k+1,0,0),"]=",
+				 Format(distrInfo[0][k],12,8), " (weight=", Format(distrInfo[1][k],9,7),")");
+	}
+	
+	for (k=0; k<D; k=k+1)
+	{
+		if (distrInfo[0][k]>1) break;
+	}
+	ConstructCategoryMatrix(marginals_1,lf,COMPLETE);
+	CC = Columns (marginals_1);
+	if (k<D)
+	/* have rates > 1 */
+	{
+		marginals = marginals_1;
+		fprintf  (SUMMARY_FILE,"\n\n------------------------------------------------\n\n Sites with dN/dS>1 (Posterior cutoff = ",sigLevel,")\n\n");
+		for (v=0; v<CC; v=v+1)
+		{
+			sampleVar = 0;
+			for (h=0; h<D; h=h+1)
+			{
+				sampleVar = sampleVar+distrInfo[1][h]*marginals[h][v];
+			}
+			positiveProb = 0;
+			for (l=k; l<D; l=l+1)
+			{
+				positiveProb = positiveProb+distrInfo[1][l]*marginals[l][v];
+			}
+			positiveProb = positiveProb/sampleVar;
+			marginals[0][v] = positiveProb;
+			if (positiveProb>=sigLevel)
+			{
+				fprintf (SUMMARY_FILE,Format (v+1,0,0)," (",positiveProb,")\n");
+			}
+		}
+		fprintf  (SUMMARY_FILE,"\n\n------------------------------------------------\n\n Sites with dN/dS<=1 (Posterior cutoff = ",sigLevel,")\n\n");
+		for (v=0; v<CC; v=v+1)
+		{
+			if (marginals[0][v]<sigLevel)
+			{
+				fprintf (SUMMARY_FILE,Format (v+1,0,0)," (",marginals[0][v],")\n");
+			}
+		}
+		marginals = 0;
+	}
+	else
+	{
+		fprintf  (SUMMARY_FILE,"\n\n------------------------------------------------\n\n No rate classes with dN/dS>1.");
+	}
+	fprintf  (SUMMARY_FILE,"\n\n------------------------------------------------\n\nTabulated Posteriors for Each Site\nSites in Columns, Rate Classes in Rows\nImport the following part into a data processing program\nfor further analysis\n\n");
+	for (v=0; v<CC; v=v+1)
+	{
+		sampleVar = 0;
+		for (h=0; h<D; h=h+1)
+		{
+			sampleVar = sampleVar+distrInfo[1][h]*marginals_1[h][v];
+		}
+		for (l=0; l<D; l=l+1)
+		{
+			marginals_1[l][v] = distrInfo[1][l]*marginals_1[l][v]/sampleVar;
+		}
+	}
+	outString = "Rate/Site";
+	for (v=0; v<D; v=v+1)
+	{
+		outString = outString + "\tRate=" + distrInfo[0][v];
+	}	
+	
+	for (v=0; v<CC; v=v+1)
+	{
+		outString = outString + "\n" + (v+1);
+		for (h=0; h<D; h=h+1)
+		{
+			outString = outString + "\t" + marginals_1[h][v];
+		}
+	}
+
+	fprintf  (SUMMARY_FILE,"\n", outString,"\n");
+	
+	marginals_1 = 0;
+	
+	return E;
+}
+
+/* ____________________________________________________________________________________________________________________*/
+
+function PopulateModelMatrix (ModelMatrixName&, EFV)
+{
+	ModelMatrixName = {ModelMatrixDimension,ModelMatrixDimension}; 
+
+	hshift = 0;
+	
+	if (modelType==0)
+	{
+		for (h=0; h<64; h=h+1)
+		{
+			if (_Genetic_Code[h]==10) 
+			{
+				hshift = hshift+1;
+				continue; 
+			}
+			vshift = hshift;
+			for (v = h+1; v<64; v=v+1)
+			{
+				diff = v-h;
+				if (_Genetic_Code[v]==10) 
+				{
+					vshift = vshift+1;
+					continue; 
+				}
+			  	if ((h$4==v$4)||((diff%4==0)&&(h$16==v$16))||(diff%16==0))
+			  	{
+			  		if (h$4==v$4)
+			  		{
+			  			transition = v%4;
+			  			transition2= h%4;
+			  		}
+			  		else
+			  		{
+			  			if(diff%16==0)
+			  			{
+			  				transition = v$16;
+			  				transition2= h$16;
+			  			}
+			  			else
+			  			{
+			  				transition = v%16$4;
+			  				transition2= h%16$4;
+			  			}
+			  		}
+			  		if (_Genetic_Code[0][h]==_Genetic_Code[0][v]) 
+			  		{
+			  			ModelMatrixName[h-hshift][v-vshift] := t*EFV__[transition__];
+			  			ModelMatrixName[v-vshift][h-hshift] := t*EFV__[transition2__];
+				  	}
+			  		else
+			  		{
+				  		ModelMatrixName[h-hshift][v-vshift] := c*t*EFV__[transition__];
+			  			ModelMatrixName[v-vshift][h-hshift] := c*t*EFV__[transition2__];
+		  			}
+			  	}
+			  }
+		}
+	}
+	else
+	{
+		if (modelType==1)
+		{
+			for (h=0; h<64; h=h+1)
+			{
+				if (_Genetic_Code[h]==10) 
+				{
+					hshift = hshift+1;
+					continue; 
+				}
+				vshift = hshift;
+				for (v = h+1; v<64; v=v+1)
+				{
+					diff = v-h;
+					if (_Genetic_Code[v]==10) 
+					{
+						vshift = vshift+1;
+						continue; 
+					}
+					nucPosInCodon = 2;
+				  	if ((h$4==v$4)||((diff%4==0)&&(h$16==v$16))||(diff%16==0))
+				  	{
+				  		if (h$4==v$4)
+				  		{
+				  			transition = v%4;
+				  			transition2= h%4;
+				  		}
+				  		else
+				  		{
+				  			if(diff%16==0)
+				  			{
+				  				transition = v$16;
+				  				transition2= h$16;
+								nucPosInCodon = 0;
+				  			}
+				  			else
+				  			{
+				  				transition = v%16$4;
+				  				transition2= h%16$4;
+								nucPosInCodon = 1;
+				  			}
+				  		}
+				  		if (_Genetic_Code[0][h]==_Genetic_Code[0][v]) 
+				  		{
+				  			ModelMatrixName[h-hshift][v-vshift] := t*EFV__[transition__][nucPosInCodon__];
+				  			ModelMatrixName[v-vshift][h-hshift] := t*EFV__[transition2__][nucPosInCodon__];
+					  	}
+				  		else
+				  		{
+					  		ModelMatrixName[h-hshift][v-vshift] := c*t*EFV__[transition__][nucPosInCodon__];
+				  			ModelMatrixName[v-vshift][h-hshift] := c*t*EFV__[transition2__][nucPosInCodon__];
+			  			}
+				  	}
+				  }
+			}
+		}
+		else
+		{
+			if (modelType<4)
+			{
+				for (h=0; h<64; h=h+1)
+				{
+					if (_Genetic_Code[h]==10) 
+					{
+						hshift = hshift+1;
+						continue; 
+					}
+					vshift = hshift;
+					for (v = h+1; v<64; v=v+1)
+					{
+						diff = v-h;
+						if (_Genetic_Code[v]==10) 
+						{
+							vshift = vshift+1;
+							continue; 
+						}
+					  	if ((h$4==v$4)||((diff%4==0)&&(h$16==v$16))||(diff%16==0))
+					  	{
+					  		if (h$4==v$4)
+					  		{
+					  			transition = v%4;
+					  			transition2= h%4;
+					  		}
+					  		else
+					  		{
+					  			if(diff%16==0)
+					  			{
+					  				transition = v$16;
+					  				transition2= h$16;
+					  			}
+					  			else
+					  			{
+					  				transition = v%16$4;
+					  				transition2= h%16$4;
+					  			}
+					  		}
+					  		if (_Genetic_Code[0][h]==_Genetic_Code[0][v]) 
+					  		{
+					  			if (Abs(transition-transition2)%2)
+					  			{
+					  				ModelMatrixName[h-hshift][v-vshift] := kappa*t;
+					  				ModelMatrixName[v-vshift][h-hshift] := kappa*t;
+					  			}
+					  			else
+					  			{
+					  				ModelMatrixName[h-hshift][v-vshift] := t;
+					  				ModelMatrixName[v-vshift][h-hshift] := t;
+					  			}
+					  			
+						  	}
+					  		else
+					  		{
+					  			if (Abs(transition-transition2)%2)
+					  			{
+					  				ModelMatrixName[h-hshift][v-vshift] := kappa*c*t;
+					  				ModelMatrixName[v-vshift][h-hshift] := kappa*c*t;
+					  			}
+					  			else
+					  			{
+					  				ModelMatrixName[h-hshift][v-vshift] := c*t;
+					  				ModelMatrixName[v-vshift][h-hshift] := c*t;
+					  			}
+						  	}
+					  	}	
+					 }
+				}	
+			}
+			else
+			{
+				for (h=0; h<64; h=h+1)
+				{
+					if (_Genetic_Code[h]==10) 
+					{
+						hshift = hshift+1;
+						continue; 
+					}
+					vshift = hshift;
+					for (v = h+1; v<64; v=v+1)
+					{
+						diff = v-h;
+						if (_Genetic_Code[v]==10) 
+						{
+							vshift = vshift+1;
+							continue; 
+						}
+						nucPosInCodon = 2;
+					  	if ((h$4==v$4)||((diff%4==0)&&(h$16==v$16))||(diff%16==0))
+					  	{
+					  		if (h$4==v$4)
+					  		{
+					  			transition = v%4;
+					  			transition2= h%4;
+					  		}
+					  		else
+					  		{
+					  			if(diff%16==0)
+					  			{
+					  				transition = v$16;
+					  				transition2= h$16;
+									nucPosInCodon = 0;
+					  			}
+					  			else
+					  			{
+					  				transition = v%16$4;
+					  				transition2= h%16$4;
+									nucPosInCodon = 1;
+					  			}
+					  		}
+					  		
+					  		if (modelType == 4)
+					  		{
+					  			nucPosInCodon = 0;
+					  		}
+					  		
+					  		rateKind = mSpecMatrix[transition][transition2];
+					  		
+					  		if (rateKind == 1)
+					  		{
+						  		if (_Genetic_Code[0][h]==_Genetic_Code[0][v]) 
+						  		{
+						  			ModelMatrixName[h-hshift][v-vshift] := AC*synRate*EFV__[transition__][nucPosInCodon__];
+						  			ModelMatrixName[v-vshift][h-hshift] := AC*synRate*EFV__[transition2__][nucPosInCodon__];
+							  	}
+						  		else
+						  		{
+							  		ModelMatrixName[h-hshift][v-vshift] := AC*c*synRate*EFV__[transition__][nucPosInCodon__];
+						  			ModelMatrixName[v-vshift][h-hshift] := AC*c*synRate*EFV__[transition2__][nucPosInCodon__];
+					  			}
+					  		}
+					  		else
+					  		{
+						  		if (rateKind == 2)
+						  		{
+							  		if (_Genetic_Code[0][h]==_Genetic_Code[0][v]) 
+							  		{
+							  			ModelMatrixName[h-hshift][v-vshift] := synRate*EFV__[transition__][nucPosInCodon__];
+							  			ModelMatrixName[v-vshift][h-hshift] := synRate*EFV__[transition2__][nucPosInCodon__];
+								  	}
+							  		else
+							  		{
+								  		ModelMatrixName[h-hshift][v-vshift] := c*synRate*EFV__[transition__][nucPosInCodon__];
+							  			ModelMatrixName[v-vshift][h-hshift] := c*synRate*EFV__[transition2__][nucPosInCodon__];
+						  			}
+						  		}
+						  		else
+						  		{
+							  		if (rateKind == 3)
+							  		{
+								  		if (_Genetic_Code[0][h]==_Genetic_Code[0][v]) 
+								  		{
+								  			ModelMatrixName[h-hshift][v-vshift] := AT*synRate*EFV__[transition__][nucPosInCodon__];
+								  			ModelMatrixName[v-vshift][h-hshift] := AT*synRate*EFV__[transition2__][nucPosInCodon__];
+									  	}
+								  		else
+								  		{
+									  		ModelMatrixName[h-hshift][v-vshift] := AT*c*synRate*EFV__[transition__][nucPosInCodon__];
+								  			ModelMatrixName[v-vshift][h-hshift] := AT*c*synRate*EFV__[transition2__][nucPosInCodon__];
+							  			}
+							  		}
+							  		else
+							  		{
+								  		if (rateKind == 4)
+								  		{
+									  		if (_Genetic_Code[0][h]==_Genetic_Code[0][v]) 
+									  		{
+									  			ModelMatrixName[h-hshift][v-vshift] := CG*synRate*EFV__[transition__][nucPosInCodon__];
+									  			ModelMatrixName[v-vshift][h-hshift] := CG*synRate*EFV__[transition2__][nucPosInCodon__];
+										  	}
+									  		else
+									  		{
+										  		ModelMatrixName[h-hshift][v-vshift] := CG*c*synRate*EFV__[transition__][nucPosInCodon__];
+									  			ModelMatrixName[v-vshift][h-hshift] := CG*c*synRate*EFV__[transition2__][nucPosInCodon__];
+								  			}
+								  		}
+								  		else
+								  		{
+									  		if (rateKind == 5)
+									  		{
+										  		if (_Genetic_Code[0][h]==_Genetic_Code[0][v]) 
+										  		{
+										  			ModelMatrixName[h-hshift][v-vshift] := CT*synRate*EFV__[transition__][nucPosInCodon__];
+										  			ModelMatrixName[v-vshift][h-hshift] := CT*synRate*EFV__[transition2__][nucPosInCodon__];
+											  	}
+										  		else
+										  		{
+											  		ModelMatrixName[h-hshift][v-vshift] := CT*c*synRate*EFV__[transition__][nucPosInCodon__];
+										  			ModelMatrixName[v-vshift][h-hshift] := CT*c*synRate*EFV__[transition2__][nucPosInCodon__];
+									  			}
+									  		}
+									  		else
+									  		{
+										  		if (_Genetic_Code[0][h]==_Genetic_Code[0][v]) 
+										  		{
+										  			ModelMatrixName[h-hshift][v-vshift] := GT*synRate*EFV__[transition__][nucPosInCodon__];
+										  			ModelMatrixName[v-vshift][h-hshift] := GT*synRate*EFV__[transition2__][nucPosInCodon__];
+											  	}
+										  		else
+										  		{
+											  		ModelMatrixName[h-hshift][v-vshift] := GT*c*synRate*EFV__[transition__][nucPosInCodon__];
+										  			ModelMatrixName[v-vshift][h-hshift] := GT*c*synRate*EFV__[transition2__][nucPosInCodon__];
+									  			}
+									  		}
+									  	}
+								  	}
+							  	}
+						  	}
+					  	}
+					}
+				}	
+			}
+		}
+	 }
+	 return ((modelType>1)&&(modelType<4));
+}
+
+/* ____________________________________________________________________________________________________________________*/
+
+NICETY_LEVEL = 3;
+
+#include "TemplateModels/chooseGeneticCode.def";
+
+ModelMatrixDimension = 64;
+for (h = 0 ;h<64; h=h+1)
+{
+	if (_Genetic_Code[h]==10)
+	{
+		ModelMatrixDimension = ModelMatrixDimension-1;
+	}
+}
+
+SetDialogPrompt ("Please specify a codon data file:");
+
+DataSet ds = ReadDataFile (PROMPT_FOR_FILE);
+
+DataSetFilter filteredData = CreateFilter (ds,3,"","",GeneticCodeExclusions);
+
+dummyVar = FrameText ("-","|",2,"READ THE FOLLOWING DATA");
+
+fprintf (stdout,"\n",ds);
+
+if (IS_TREE_PRESENT_IN_DATA)
+{
+	fprintf (stdout, "\n\nA tree was found in the data file:\n",DATAFILE_TREE,"\n\nWould you like to use it:(Y/N)?");
+	fscanf (stdin, "String", response);
+	if ((response=="n")||(response=="N"))
+	{
+		IS_TREE_PRESENT_IN_DATA = 0;
+	}
+	else
+	{
+		treeString = DATAFILE_TREE;
+		IS_TREE_PRESENT_IN_DATA = 1;
+	}
+	fprintf (stdout, "\n\n");
+
+}
+
+if (!IS_TREE_PRESENT_IN_DATA)
+{
+	SetDialogPrompt ("Please select a tree file for the data:");
+	fscanf (PROMPT_FOR_FILE, "String", treeString);
+}
+
+treeString = RerootTree (treeString,0);
+
+chosenModelList = {16,1};
+
+ChoiceList (modelType,"Distributions",1,SKIP_NONE,
+			"Run All","Run all available dN/dS distributions",
+			"Run Custom","Choose from available dN/dS distributions.");
+			
+if (modelType<0)
+{
+	return;
+}
+
+if (modelType==0)
+{
+	for (rateType = 0; rateType<16; rateType=rateType+1)
+	{
+		chosenModelList[rateType][0] = 1;
+	}
+}
+else
+{
+	ChoiceList (modelTypes,"Distributions",0,SKIP_NONE,
+				"Single Rate","Single Rate",
+				"Neutral","Neutral",
+	  			"Selection","Selection",
+			    "Discrete","Discrete",
+			    "Freqs","Freqs",
+			    "Gamma","Gamma",
+			    "2 Gamma","2 Gamma",
+			    "Beta","Beta",
+			    "Beta & w","Beta & w",
+			    "Beta & Gamma","Beta & Gamma",
+			    "Beta & (Gamma+1)","Beta & (Gamma+1)",
+			    "Beta & (Normal>1)","Beta & (Normal>1)",
+			    "0 & 2 (Normal>1)","0 & 2 (Normal>1)",
+			    "3 Normal","3 Normal",
+			    "Gamma mod Beta","Two parameter gamma partitioned by a two parameter beta",
+			    "Beta & 1", "Discrete beta and a point mass at one. The M8a model from PAML.");
+			    
+	if (modelTypes[0]<0)
+	{
+		return;
+	}
+	
+	ChoiceList (initValue,"Initial Values",1,SKIP_NONE,
+			    "Default", "Use default initial values for distribution parameters",
+			    "Custom", "Enter custom initial values for distribution parameters");
+			    
+	if (initValue<0)
+	{
+		return;
+	}
+
+	for (rateType = 0; rateType < Rows(modelTypes)*Columns(modelTypes); rateType = rateType + 1)
+	{
+		modelType = modelTypes[rateType];
+		chosenModelList[modelType] = 1;
+	}
+}
+
+
+if (initValue)
+{
+	for (rateType = 0; rateType<15; rateType=rateType+1)
+	{
+		if (chosenModelList[rateType+1]==1)
+		{
+			if (PromptForModelParameter (rateType))
+			{
+				return 0;
+			}
+		}
+	}
+}
+
+
+ChoiceList (modelType,"Choose a model",1,SKIP_NONE,
+			"MG94 1x4","Muse-Gaut 94 model with 4(-1) nucleotide frequency parameters (intra-codon position independent).",
+			"MG94 3x4","Muse-Gaut 94 model with 12(-3) nucleotide frequency parameters (intra-codon position specific).",
+			"GY94 1x4","Goldman-Yang 94 model with 4(-1) nucleotide frequency parameters (intra-codon position independent).",
+			"GY94 3x4","Goldman-Yang 94 model with 12(-3) nucleotide frequency parameters (intra-codon position specific).",
+			"MG94 Custom 1x4", "Muse-Gaut 94 crossed with an arbitrary nucelotide substitution model with 4(-1) nucleotide frequency parameters (intra-codon position independent).",
+			"MG94 Custom 3x4", "Muse-Gaut 94 crossed with an arbitrary nucelotide substitution model with 12(-3) nucleotide frequency parameters (intra-codon position specific)."
+);
+
+
+if ((modelType==0)||(modelType==2)||(modelType==4))
+{
+	freqParamCount = 3;
+	HarvestFrequencies (observedFreq,filteredData,1,1,0);
+	vectorOfFrequencies = BuildCodonFrequencies4 (observedFreq);
+}
+else
+{
+	freqParamCount = 9;
+	HarvestFrequencies (observedFreq,filteredData,3,1,1);
+	vectorOfFrequencies = BuildCodonFrequencies12 (observedFreq);
+}
+
+if (modelType>3)
+{
+	global AC=1;
+	global AT=1;
+	global CG=1;
+	global CT=1;
+	global GT=1;
+
+	done = 0;
+
+	while (!done)
+	{
+		fprintf (stdout,"\nPlease enter a 6 character model designation (e.g:010010 defines HKY85):");
+		fscanf  (stdin,"String", modelDesc);
+		if (Abs(modelDesc)==6)
+		{	
+			done = 1;
+		}
+	}
+	
+	done = 0;
+	mSpecMatrix = {{*,1,2,3}{1,*,4,5}{2,4,*,6}{3,5,6,*}};
+
+	rateBiasTerms = {{"AC","1","AT","CG","CT","GT"}};
+	paramCount	  = 0;
+
+	modelConstraintString = "";
+
+	for (customLoopCounter2=1; customLoopCounter2<6; customLoopCounter2=customLoopCounter2+1)
+	{
+		for (customLoopCounter=0; customLoopCounter<customLoopCounter2; customLoopCounter=customLoopCounter+1)
+		{
+			if (modelDesc[customLoopCounter2]==modelDesc[customLoopCounter])
+			{
+					if (rateBiasTerms[customLoopCounter2] == "1")
+				{
+					modelConstraintString = modelConstraintString + rateBiasTerms[customLoopCounter]+":="+rateBiasTerms[customLoopCounter2]+";";
+				}
+				else
+				{
+					modelConstraintString = modelConstraintString + rateBiasTerms[customLoopCounter2]+":="+rateBiasTerms[customLoopCounter]+";";			
+				}
+				break;
+			}
+		}
+	}	
+
+	if (Abs(modelConstraintString))
+	{
+		ExecuteCommands (modelConstraintString);
+	}
+}
+else
+{
+	if (modelType>1)
+	{	
+		global kappa = 2.;
+	}
+}
+
+fprintf (stdout, "\nChoose the cutoff (0 to 1) for posterior of dN/dS>1 for a site to be considered under selective pressure:");
+fscanf  (stdin, "Number",psigLevel);
+if ((psigLevel <= 0)||(psigLevel>1))
+{
+	psigLevel = .95;
+}
+fprintf (stdout, "\n>Using ", psigLevel , " cutoff\n");
+
+for (rateType = 5; rateType < 16; rateType = rateType + 1)
+{
+	if (chosenModelList[rateType]==1)
+	{
+		categCount = -1;
+		while (categCount <= 0)
+		{
+			fprintf (stdout, "\nChoose the number of categories in discretized distributions:");
+			fscanf  (stdin, "Number",categCount);
+			categCount = categCount$1;
+		}
+		break;		
+	}
+}
+
+fprintf (stdout, "\n>Using ", Format (categCount,0,0), " categories.\n");
+
+SetDialogPrompt ("Write detailed results to:");
+fprintf 		(PROMPT_FOR_FILE,CLEAR_FILE);
+SUMMARY_FILE = LAST_FILE_PATH;
+
+ClearConstraints (c);
+global c = 1.;
+
+dummyVar = FrameText ("-","|",2,"SUMMARY TABLE");
+tableSeparator =  "+-------------------------+----------------+---------------+---------+\n";
+fprintf (stdout, "\n\"p\" is the number of estimated model parameters.\nDetailed results including sites with dN/dS>1 will be written to\n",SUMMARY_FILE,"\n\n");
+fprintf (stdout, tableSeparator,
+				 "| MODEL (Number & Desc)   | Log likelihood |     dN/dS     |    p    |\n",
+				                                             
+				 tableSeparator);
+				 
+cachedBranchLengths = {{-1,-1}};
+			
+rateType = -1;
+
+if (MPI_NODE_COUNT>1)
+{
+	MPINodeState = {MPI_NODE_COUNT-1,3};
+	OPTIMIZE_SUMMATION_ORDER = 0;
+}
+				 
+if (chosenModelList[0]>0)
+{
+	timer = Time(1);
+	modelMatrix = 0;
+	MULTIPLY_BY_FREQS = PopulateModelMatrix ("modelMatrix", observedFreq);
+	Model theModel = (modelMatrix,vectorOfFrequencies,MULTIPLY_BY_FREQS);
+	Tree  givenTree = treeString;
+	DataSetFilter filteredData = CreateFilter (ds,3,"","",GeneticCodeExclusions);
+	LikelihoodFunction lf 	   = (filteredData,givenTree);
+					 
+	if (MPI_NODE_COUNT>1)
+	{
+		for (mpiNode = 0; mpiNode < MPI_NODE_COUNT-1; mpiNode = mpiNode+1)
+		{
+			if (MPINodeState[mpiNode][0]==0)
+			{
+				break;	
+			}
+		}
+		
+		if (mpiNode==MPI_NODE_COUNT-1)
+		/* all nodes busy */
+		{
+			mpiNode = ReceiveJobs (1);
+		}
+		else
+		{
+			MPISend (mpiNode+1,lf);
+			MPINodeState[mpiNode][0] = 1;
+			MPINodeState[mpiNode][1] = rateType;
+			MPINodeState[mpiNode][2] = Time(1);
+		}
+	}
+	else
+	{
+		timer = Time(1);
+		Optimize (res,lf);
+		ReceiveJobs (0);
+	}
+
+	/*timer = res[1][1]-res[1][2];
+	cachedBranchLengths = {timer,1};
+	
+	for (rateType = timer; rateType < Columns(cachedBranchLengths); rateType = rateType+1)
+	{
+		cachedBranchLengths[rateType-timer][0] = res [0][rateType];
+	}*/
+}
+
+for (rateType = 0; rateType < 15; rateType = rateType + 1)
+{
+	if (chosenModelList[rateType+1]==0)
+	{
+		continue;
+	}
+
+	SetWDistribution (categCount);
+	modelMatrix = 0;
+	MULTIPLY_BY_FREQS = PopulateModelMatrix ("modelMatrix", observedFreq);
+	Model theModel = (modelMatrix,vectorOfFrequencies,MULTIPLY_BY_FREQS);
+	Tree  givenTree = treeString;
+	DataSetFilter filteredData = CreateFilter (ds,3,"","",GeneticCodeExclusions);
+	LikelihoodFunction lf = (filteredData,givenTree);
+
+	if (MPI_NODE_COUNT>1)
+	{
+		for (mpiNode = 0; mpiNode < MPI_NODE_COUNT-1; mpiNode = mpiNode+1)
+		{
+			if (MPINodeState[mpiNode][0]==0)
+			{
+				break;	
+			}
+		}
+		
+		if (mpiNode==MPI_NODE_COUNT-1)
+		/* all nodes busy */
+		{
+			mpiNode = ReceiveJobs (1);
+		}
+		else
+		{
+			MPISend (mpiNode+1,lf);
+			MPINodeState[mpiNode][0] = 1;
+			MPINodeState[mpiNode][1] = rateType;
+			MPINodeState[mpiNode][2] = Time(1);
+		}
+	}
+	else
+	{
+		timer = Time(1);
+		Optimize (res,lf);
+		ReceiveJobs (0);
+	}
+
+	if (modelType>1)
+	{	
+		kappa = 2.;
+	}
+}
+
+if (MPI_NODE_COUNT>1)
+{
+	while (1)
+	{
+		for (nodeCounter = 0; nodeCounter < MPI_NODE_COUNT-1; nodeCounter = nodeCounter+1)
+		{
+			if (MPINodeState[nodeCounter][0]==1)
+			{
+				fromNode = ReceiveJobs (0);
+				break;	
+			}
+		}
+		if (nodeCounter == MPI_NODE_COUNT-1)
+		{
+			break;
+		}
+	}	
+	OPTIMIZE_SUMMATION_ORDER = 1;
+}
+
+/* ____________________________________________________________________________________________________________________*/
+
+function ReceiveJobs (sendOrNot)
+{
+	if (MPI_NODE_COUNT>1)
+	{
+		MPIReceive (-1, fromNode, result_String);
+		rateType2 = MPINodeState[fromNode-1][1];
+		timer     = MPINodeState[fromNode-1][2];
+		
+		if (sendOrNot)
+		{
+			MPISend (fromNode,lf);
+			MPINodeState[fromNode-1][1] = rateType;
+			MPINodeState[fromNode-1][2] = Time(1);
+		}
+		else
+		{
+			MPINodeState[fromNode-1][0] = 0;
+			MPINodeState[fromNode-1][1] = 0;
+			MPINodeState[fromNode-1][2] = 0;
+		}
+		
+		rateType3 = rateType;
+		rateType  = rateType2;
+		
+		if (rateType < 0)
+		{
+			ClearConstraints (c);
+		}
+				
+		ExecuteCommands (result_String);
+				
+		res = lf_MLES;
+	}
+	
+	WriteSnapshot (rateType);
+
+	GetString  (lfInfo,lf,-1);
+
+	degFCount = Columns (lfInfo["Global Independent"])+
+				Columns (lfInfo["Local Independent"])-1+
+				freqParamCount;
+	
+	if (rateType>=0)
+	{
+		fprintf (SUMMARY_FILE,"\n*** RUNNING MODEL ", Format(rateType+1,0,0), " (",ModelNames[rateType],") ***\n######################################\n");
+		fprintf (SUMMARY_FILE,"\n>Done in ",Time(1)-timer, " seconds \n\n", lf);
+		fprintf (stdout, "| ");
+		if (rateType<9)
+		{
+			fprintf (stdout," ");
+		}
+		fprintf (stdout, Format (rateType+1,0,0), ". ", ModelNames[rateType]);
+		for (dummy = Abs(ModelNames[rateType])+5; dummy<25; dummy = dummy+1)
+		{
+			fprintf (stdout," ");
+		}
+		fprintf (stdout,"| ",Format (res[1][0],14,6)," | ",Format (GetDistributionParameters(psigLevel),13,8)," |  ",
+							 Format(degFCount,5,0),"  |\n",tableSeparator);
+	}
+	else
+	{
+		fprintf (SUMMARY_FILE,"\n*** RUNNING SINGLE RATE MODEL ***\n#################################\n");
+		fprintf (SUMMARY_FILE,"\n>Done in ", Time(1)-timer, " seconds \n\n");
+		fprintf (SUMMARY_FILE,lf,"\n\n-----------------------------------\n\ndN/dS = ",c,"\n\n");
+
+		fprintf (stdout, "|  0. Single Rate Model   | ",Format (res[1][0],14,6)," | ",Format (c,13,8)," |  ",Format(degFCount,5,0),"  |\n",
+					 		 tableSeparator);
+	}
+	
+	modelLL [rateType] = res[1][0];
+						 
+	if (MPI_NODE_COUNT>1)
+	{
+		rateType  = rateType3;
+	}
+
+	return fromNode-1;
+}
diff --git a/res/TemplateBatchFiles/NucModelCompare.bf b/res/TemplateBatchFiles/NucModelCompare.bf
new file mode 100644
index 0000000..597c5dd
--- /dev/null
+++ b/res/TemplateBatchFiles/NucModelCompare.bf
@@ -0,0 +1,1087 @@
+RequireVersion ("0.9920061127");
+
+/* 
+	This file takes a nucleotide data set and a tree (either from the data file or from a separate 	file) and computes maximum likelihood estimates for every possible 4x4 reversible model on that data and tree.
+
+		We use the string (v1,v2,v3,v4,v5,v6), where and v1..6 = 0..5
+   to encode a 4x4 symmetric transition matrix with entries
+   [*  v1  v2  v3]
+   [-  *   v4  v5]
+   [-  -   *   v6]
+   [-  -   -   * ]
+   
+   		For instance: (010010) encodes HKY85.
+   		
+   		For each model the following information is reported:
+   		- Model string. (e.g. (012345) for the GRM)
+   		- Number of model parameters
+   		- Max ln-likelihood for the model
+   		- Likelihood ratio statistic (as a sub-model of the GRM)
+   		- AIC
+   		- P-Value for the Likelihood Ratio Test.
+   		
+   
+   Sergei L. Kosakovsky Pond, Summer 2002.
+   
+*/ 
+
+VERBOSITY_LEVEL = -1;
+
+function checkEmbedding (_m1, _m2)
+{
+	for (r=0; r<6; r=r+1)
+	{
+		if (_m2[r]<_m1[r])
+		{
+			/*fprintf (stdout,_m1," ", _m2, " Reject 1 at position ",r,"\n");*/
+			return 0;
+		}
+		if (_m2[r]>_m1[r])
+		{
+			for (r2 = 0; r2 < 6; r2 = r2+1)
+			{
+				if ((_m2[r2]==_m2[r])&&(_m1[r2]!=_m1[r]))
+				{
+					/*fprintf (stdout,_m1," ", _m2, " Reject 2 at positions ",r,r2,"\n");*/
+					return 0;
+				}
+			}
+		}
+	}
+	return 1;
+}
+
+function ReceiveJobs (sendOrNot)
+{
+	if (MPI_NODE_COUNT>1)
+	{
+		MPIReceive (-1, fromNode, result_String);
+		jobModelNum = MPINodeState[fromNode-1][1];
+		vv1 = MPINodeState[fromNode-1][2];
+		vv2 = MPINodeState[fromNode-1][3];
+		vv3 = MPINodeState[fromNode-1][4];
+		vv4 = MPINodeState[fromNode-1][5];
+		vv5 = MPINodeState[fromNode-1][6];
+		vv6 = MPINodeState[fromNode-1][7];
+		if (sendOrNot)
+		{
+			MPISend (fromNode,lf);
+			MPINodeState[fromNode-1][1] = modelNum;		
+			MPINodeState[fromNode-1][2] = v1;
+			MPINodeState[fromNode-1][3] = v2;
+			MPINodeState[fromNode-1][4] = v3;
+			MPINodeState[fromNode-1][5] = v4;
+			MPINodeState[fromNode-1][6] = v5;
+			MPINodeState[fromNode-1][7] = v6;
+		}
+		else
+		{
+			MPINodeState[fromNode-1][0] = 0;
+			MPINodeState[fromNode-1][1] = -1;		
+		}
+		
+		ExecuteCommands (result_String);
+	}
+	else
+	{
+		jobModelNum = modelNum;
+	}
+	
+	if (jobModelNum == 0)
+	{
+		stdl = lf_MLES[1][0];
+		fullnp = lf_MLES[1][1]+totalBranchCount+3;
+		fprintf(stdout,"\n(012345) Full Model ln-lik =  ",stdl,". Parameter Count=",Format(fullnp,0,0)," AIC = ", 2*(fullnp-stdl),"\n\n");
+
+
+		resultCache [0][0] = 1;
+		resultCache [0][1] = 2;
+		resultCache [0][2] = 3;
+		resultCache [0][3] = 4;
+		resultCache [0][4] = 5;
+		resultCache [0][5] = lf_MLES[1][0];
+		resultCache [0][6] = lf_MLES[1][1]+totalBranchCount+3;
+		resultCache [0][7] = 0;
+		resultCache [0][8] = 0;
+		if (modelType)
+		{
+			resultCache [0][9] = AC;
+			resultCache [0][10] = AT;
+			resultCache [0][11] = CG;
+			resultCache [0][12] = CT;
+			resultCache [0][13] = GT;
+		}
+		
+		if (doFitSave)
+		{
+			slfo = LIKELIHOOD_FUNCTION_OUTPUT;
+			LIKELIHOOD_FUNCTION_OUTPUT = 6;
+			NEW_FILE_NAME = BASE_PATH+".012345";
+			fprintf (NEW_FILE_NAME,CLEAR_FILE,lf);
+			LIKELIHOOD_FUNCTION_OUTPUT = slfo;
+		}
+
+		fprintf (stdout,"\n#   |  Model   | # prm |    lnL    |      LRT       |    AIC     |   P-Value        |");   
+		fprintf (stdout,"\n----|----------|-------|-----------|----------------|------------|------------------|");   
+
+		if (MPI_NODE_COUNT>1)
+		{
+			for (h=1; h<203; h=h+1)
+			{
+				lnL = resultCache[h][5];
+				
+				if (lnL<0)
+				{
+					np = resultCache[h][6];
+					LRT = -2*(lnL-stdl);
+					if (LRT<0)
+					{
+						LRT = 0;
+					}
+					AIC = -2*lnL+2*np;
+					PRINT_DIGITS = 3;
+					fprintf (stdout,"\n",h);
+					PRINT_DIGITS = 1;
+					fprintf (stdout," | (",0, resultCache[h][0], resultCache[h][1], resultCache[h][2], resultCache[h][3], resultCache[h][4],") | ");
+					fprintf (stdout,Format (np,5,0));
+					PRINT_DIGITS = 8;
+					fprintf (stdout, " |  ",lnL," | ",Format(LRT,14,3), " |  ", AIC, "  |  ");
+					
+					PRINT_DIGITS = 15;
+					if (LRT==0)
+					{
+						pValue = 1;					
+					}
+					else
+					{
+						pValue = 1-CChi2(LRT,fullnp-np);
+					}
+					fprintf (stdout,pValue," |");
+					resultCache [jobModelNum][7] = pValue;
+					if (pValue<rejectAt)
+					{
+						rejectCount = rejectCount+1;
+						resultCache [jobModelNum][8] = 0;
+					}
+					else
+					{
+						resultCache [jobModelNum][8] = 1;					
+					}
+					
+					if (pValue<rejectAt)
+					{
+						fprintf (stdout,"(*)");
+					}				
+				}
+			}
+		}
+		
+		return fromNode-1;
+	}
+	else
+	{
+		if ((MPI_NODE_COUNT>1)&&(resultCache[0][5]>=0))
+		{
+			resultCache [jobModelNum][0] = vv2;
+			resultCache [jobModelNum][1] = vv3;
+			resultCache [jobModelNum][2] = vv4;
+			resultCache [jobModelNum][3] = vv5;
+			resultCache [jobModelNum][4] = vv6;
+			resultCache [jobModelNum][5] = lf_MLES[1][0];
+			resultCache [jobModelNum][6] = lf_MLES[1][1]+totalBranchCount+3;
+			
+			if (modelType)
+			{
+				resultCache [jobModelNum][9] = AC;
+				resultCache [jobModelNum][10] = AT;
+				resultCache [jobModelNum][11] = CG;
+				resultCache [jobModelNum][12] = CT;
+				resultCache [jobModelNum][13] = GT;
+			}
+			/*slfo = LIKELIHOOD_FUNCTION_OUTPUT;
+			LIKELIHOOD_FUNCTION_OUTPUT = 6;
+			NEW_FILE_NAME = BASE_PATH+".0"+Format(resultCache[h][0],1,0);
+			NEW_FILE_NAME = NEW_FILE_NAME+Format(resultCache[h][1],1,0);
+			NEW_FILE_NAME = NEW_FILE_NAME+Format(resultCache[h][2],1,0);
+			NEW_FILE_NAME = NEW_FILE_NAME+Format(resultCache[h][3],1,0);
+			NEW_FILE_NAME = NEW_FILE_NAME+Format(resultCache[h][4],1,0);
+			fprintf (NEW_FILE_NAME,CLEAR_FILE,lf);
+			LIKELIHOOD_FUNCTION_OUTPUT = slfo;*/
+			
+			return fromNode - 1;
+		}
+	}
+
+	np = lf_MLES[1][1]+totalBranchCount+3;
+	lnL = lf_MLES[1][0];
+	LRT = -2*(lnL-stdl);
+	if (LRT<0)
+	{
+		LRT = 0;
+	}
+	AIC = -2*lnL+2*np;
+	PRINT_DIGITS = 3;
+	fprintf (stdout,"\n",jobModelNum);
+	PRINT_DIGITS = 1;
+	fprintf (stdout," | (",vv1,vv2,vv3,vv4,vv5,vv6,") | ");
+	fprintf (stdout,Format (np,5,0));
+	PRINT_DIGITS = 8;
+	fprintf (stdout, " |  ",lnL," | ",Format(LRT,14,3), " |  ", AIC, "  |  ");
+		
+	if (doFitSave)
+	{
+		slfo = LIKELIHOOD_FUNCTION_OUTPUT;
+		LIKELIHOOD_FUNCTION_OUTPUT = 6;
+		NEW_FILE_NAME = BASE_PATH+".0" + Format(vv2,1,0);
+		NEW_FILE_NAME = NEW_FILE_NAME  + Format(vv3,1,0);
+		NEW_FILE_NAME = NEW_FILE_NAME  + Format(vv4,1,0);
+		NEW_FILE_NAME = NEW_FILE_NAME  + Format(vv5,1,0);
+		NEW_FILE_NAME = NEW_FILE_NAME  + Format(vv6,1,0);
+		
+		fprintf (NEW_FILE_NAME,CLEAR_FILE,lf);
+		LIKELIHOOD_FUNCTION_OUTPUT = slfo;
+	}
+
+	PRINT_DIGITS = 15;
+	if (LRT==0)
+	{
+		pValue = 1;					
+	}
+	else
+	{
+		pValue = 1-CChi2(LRT,fullnp-np);
+	}
+	fprintf (stdout,pValue," |");
+	
+	resultCache [jobModelNum][0] = vv2;
+	resultCache [jobModelNum][1] = vv3;
+	resultCache [jobModelNum][2] = vv4;
+	resultCache [jobModelNum][3] = vv5;
+	resultCache [jobModelNum][4] = vv6;
+	resultCache [jobModelNum][5] = lf_MLES[1][0];
+	resultCache [jobModelNum][6] = lf_MLES[1][1]+totalBranchCount+3;
+	resultCache [jobModelNum][7] = pValue;
+	if (modelType)
+	{
+		if (MPI_NODE_COUNT>1)
+		{
+			resultCache [jobModelNum][9]  = lf_MLE_VALUES["AC"];
+			resultCache [jobModelNum][10] = lf_MLE_VALUES["AT"];
+			resultCache [jobModelNum][11] = lf_MLE_VALUES["CG"];
+			resultCache [jobModelNum][12] = lf_MLE_VALUES["CT"];
+			resultCache [jobModelNum][13] = lf_MLE_VALUES["GT"];
+		}
+		else
+		{
+			resultCache [jobModelNum][9] = AC;
+			resultCache [jobModelNum][10] = AT;
+			resultCache [jobModelNum][11] = CG;
+			resultCache [jobModelNum][12] = CT;
+			resultCache [jobModelNum][13] = GT;		
+		}
+	}
+	if (pValue<rejectAt)
+	{
+		rejectCount = rejectCount+1;
+		resultCache [jobModelNum][8] = 0;
+	}
+	else
+	{
+		resultCache [jobModelNum][8] = 1;					
+	}
+	
+	if (pValue<rejectAt)
+	{
+		fprintf (stdout,"(*)");
+	}
+			
+	return fromNode-1;
+}
+
+
+function printModelMatrix (modelString)
+{
+	
+	if (modelType)
+	{
+		mstrConv = "1";
+		for (v2 = 1; v2 < 6; v2 = v2+1)
+		{
+			if (modelString[v2]=="0")
+			{
+				mstrConv = mstrConv+"1";
+			}
+			else
+			{
+				if (modelString[v2]=="1")
+				{
+					mstrConv = mstrConv+"B";
+				}
+				else
+				{
+					if (modelString[v2]=="2")
+					{
+						mstrConv = mstrConv+"C";
+					}
+					else
+					{
+						if (modelString[v2]=="3")
+						{
+							mstrConv = mstrConv+"D";
+						}
+						else
+						{
+							if (modelString[v2]=="4")
+							{
+								mstrConv = mstrConv+"E";
+							}
+							else
+							{
+								mstrConv = mstrConv+"F";
+							}
+						}
+					}
+				}
+			}
+		}
+		sep = "+---+-----+-----+-----+-----+\n";
+		fprintf (stdout, sep,
+						 "|   |  A  |  C  |  G  |  T  |\n",
+						 sep,
+						 "| A |  *  | ", mstrConv[0], "*t | ", mstrConv[1], "*t | ", mstrConv[2], "*t |\n",
+						 sep,
+						 "| C | ", mstrConv[0], "*t |  *  | ", mstrConv[3], "*t | ", mstrConv[4], "*t |\n",
+						 sep,
+						 "| G | ", mstrConv[1], "*t | " , mstrConv[3], "*t |  *  | ", mstrConv[5], "*t |\n",
+						 sep,
+						 "| T | ", mstrConv[2], "*t | " , mstrConv[4], "*t | ", mstrConv[5], "*t |  *  |\n",
+						 sep);
+						 
+	
+	}
+	else
+	{
+		mstrConv = "a";
+		for (v2 = 1; v2 < 6; v2 = v2+1)
+		{
+			if (modelString[v2]=="0")
+			{
+				mstrConv = mstrConv+"a";
+			}
+			else
+			{
+				if (modelString[v2]=="1")
+				{
+					mstrConv = mstrConv+"b";
+				}
+				else
+				{
+					if (modelString[v2]=="2")
+					{
+						mstrConv = mstrConv+"c";
+					}
+					else
+					{
+						if (modelString[v2]=="3")
+						{
+							mstrConv = mstrConv+"d";
+						}
+						else
+						{
+							if (modelString[v2]=="4")
+							{
+								mstrConv = mstrConv+"e";
+							}
+							else
+							{
+								mstrConv = mstrConv+"f";
+							}
+						}
+					}
+				}
+			}
+		}
+		sep = "+---+-----+-----+-----+-----+\n";
+		fprintf (stdout, sep,
+						 "|   |  A  |  C  |  G  |  T  |\n",
+						 sep,
+						 "| A |  *  |  ", mstrConv[0], "  |  ", mstrConv[1], "  |  ", mstrConv[2], "  |\n",
+						 sep,
+						 "| C |  ", mstrConv[0], "  |  *  |  ", mstrConv[3], "  |  ", mstrConv[4], "  |\n",
+						 sep,
+						 "| G |  ", mstrConv[1], "  |  " , mstrConv[3], "  |  *  |  ", mstrConv[5], "  |\n",
+						 sep,
+						 "| T |  ", mstrConv[2], "  |  " , mstrConv[4], "  |  ", mstrConv[5], "  |  *  |\n",
+						 sep);
+						 
+	}
+	return 1;
+}
+
+function  setElement (h,v,cc)
+{
+	if (modelType==0)
+	{
+		if (cc==0)
+		{
+			m[h][v]:=a;
+			m[v][h]:=a;
+		}
+		else
+		{
+			if (cc==1)
+			{
+				m[h][v]:=b;
+				m[v][h]:=b;
+			}
+			else
+			{
+				if (cc==2)
+				{
+					m[h][v]:=c;
+					m[v][h]:=c;
+				}
+				else
+				{
+					if (cc==3)
+					{
+						m[h][v]:=d;
+						m[v][h]:=d;
+					}
+					else
+					{
+						if (cc==4)
+						{
+							m[h][v]:=e;
+							m[v][h]:=e;
+						}
+						else
+						{
+							m[h][v]:=f;
+							m[v][h]:=f;
+						}
+					}
+				}
+			}
+		}
+	}
+	return 1;
+}
+
+#include "TemplateModels/modelParameters.mdl";
+
+m={4,4};
+
+m[0][1]:=a;
+m[1][0]:=a;
+
+branchLengths = 0;
+
+if (modelType > 0)
+{
+	ChoiceList (branchLengths,"Estimate Branch Lengths",1,SKIP_NONE,
+				"Every Time","Branch lengths are reestimated for every model.",
+				"Once","Branch lenghts obtained from the general reversible model are reused for subsequent models."
+		       );
+
+	if (branchLengths<0)
+	{
+		return;
+	}
+
+	global AC = 1;
+	global AT = 1;
+	global CG = 1;
+	global CT = 1;
+	global GT = 1;
+	
+	if (modelType == 1)
+	{
+		m = {{*,AC*t,t,AT*t}
+			 {AC*t,*,CG*t,CT*t}
+			 {t,CG*t,*,GT*t}
+			 {AT*t,CT*t,GT*t,*}};
+	}
+	else
+	{
+		if (modelType == 2)
+		{
+			/*m[0][1]:=c*t;
+			m[1][0]:=c*t;*/
+			#include "TemplateModels/defineGamma.mdl";
+		}
+		else
+		{
+			if (modelType == 3)
+			{
+				/*m[0][1]:=c*t;
+				m[1][0]:=c*t;*/
+				#include "TemplateModels/defineHM.mdl";
+			}
+		}
+		m = {{*,AC*c*t,c*t,AT*c*t}
+			 {AC*c*t,*,CG*c*t,CT*c*t}
+			 {c*t,CG*c*t,*,GT*c*t}
+			 {AT*c*t,CT*c*t,GT*c*t,*}};
+	}
+}
+else
+{
+	r = setElement (0,2,1);
+	r = setElement (0,3,2);
+	r = setElement (1,2,3);
+	r = setElement (1,3,4);
+	r = setElement (2,3,5);
+}
+
+SetDialogPrompt ("Please specify a nucleotide data file:");
+
+DataSet ds = ReadDataFile (PROMPT_FOR_FILE);
+DataSetFilter nucData = CreateFilter (ds,1);
+
+HarvestFrequencies (pi,nucData,1,1,1);
+
+_DO_TREE_REBALANCE_ = 1;
+#include "queryTree.bf";
+
+rejectAt = 0;
+
+while (rejectAt<=0 || rejectAt>=1 )
+{
+	fprintf (stdout, "\nModel rejection level (e.g. 0.05):");
+	fscanf  (stdin,"Number", rejectAt);
+}
+
+ChoiceList (doFitSave, "Save each of the 203 fits?", 1, SKIP_NONE, "No", "Do not write out the files", "Yes", "Save each of the 203 files to a separate file");
+if (doFitSave<0)
+{
+	return 0;
+}
+
+SetDialogPrompt ("Save summary and results to:");
+fprintf (PROMPT_FOR_FILE, CLEAR_FILE);
+BASE_PATH = LAST_FILE_PATH;
+
+
+KEEP_OPTIMAL_ORDER = 1;
+MESSAGE_LOGGING    = 0;
+
+totalBranchCount = 0;
+modelNum	= 0;
+rejectCount = 0;
+resultCache = {203,14};
+
+
+Model currentModel = (m,pi);
+Tree tr = treeString;
+LikelihoodFunction lf = (nucData, tr, pi);
+
+meanDiv = -1;
+
+if (MPI_NODE_COUNT>1)
+{
+	MPINodeState = {MPI_NODE_COUNT-1,8};
+	SHORT_MPI_RETURN		 = 1;
+	OPTIMIZE_SUMMATION_ORDER = 0;
+	if (branchLengths > 0)
+	{
+		AUTO_PARALLELIZE_OPTIMIZE = 1;
+		Optimize 	(lf_MLES,lf);
+		AUTO_PARALLELIZE_OPTIMIZE = 0;
+		smnc = MPI_NODE_COUNT;
+		MPI_NODE_COUNT = 1;
+		ReceiveJobs (0);
+		MPI_NODE_COUNT = smnc;
+		
+	}
+	else
+	{
+		MPISend (1,lf);
+		MPINodeState[0][0] = 1;
+		MPINodeState[0][1] = modelNum;
+	}
+}
+else
+{
+	Optimize (lf_MLES,lf);
+	vv1 = 0;
+	vv2 = 0;
+	vv3 = 0;
+	vv4 = 0;
+	vv5 = 0;
+	vv6 = 0;
+	dummy = ReceiveJobs (0);
+}
+
+if (branchLengths)
+{
+	totalBranchCount     = TipCount(tr) + BranchCount (tr);
+	stashedLengths		 = {totalBranchCount,1};
+	
+	branchNames = BranchName (givenTree,-1);
+	
+	pia = pi[0];
+	pic = pi[1];
+	pig = pi[2];
+	pit = pi[3];
+	
+	global totalFactor := AC*(2*pia__*pic__)+2*pia__*pig__+(2*pia__*pit__)*AT+
+							 (2*pic__*pig__)*CG+(2*pic__*pit__)*CT+(2*pig__*pit__)*GT;
+							 
+	for (v2 = 0; v2 < totalBranchCount; v2 = v2+1)
+	{
+		stashedLengths [v2] = BranchLength(tr,v2);
+	}
+}
+
+rateBiasTerms = {{"AC","1","AT","CG","CT","GT"}};
+
+for (v2=0; v2<=1; v2=v2+1)
+{
+	for (v3=0; v3<=v2+1; v3=v3+1)
+	{
+		if (v3>v2)
+		{
+			ub4 = v3;
+		}
+		else
+		{
+			ub4 = v2;
+		}
+		for (v4=0; v4<=ub4+1; v4=v4+1)
+		{
+			if (v4>=ub4)
+			{
+				ub5 = v4;
+			}
+			else
+			{
+				ub5 = ub4;
+			}
+			for (v5=0; v5<=ub5+1; v5=v5+1)
+			{
+				if (v5>ub5)
+				{
+					ub6 = v5;
+				}
+				else
+				{
+					ub6 = ub5;
+				}
+				for (v6=0; v6<=ub6+1; v6=v6+1)
+				{
+					if (v6==5)
+					{
+						break;
+					}
+					
+					if (modelType > 0)
+					{
+						paramCount	  = 0;
+
+						modelDesc = "0"+Format(v2,1,0);
+						modelDesc = modelDesc+Format(v3,1,0);
+						modelDesc = modelDesc+Format(v4,1,0);
+						modelDesc = modelDesc+Format(v5,1,0);
+						modelDesc = modelDesc+Format(v6,1,0);
+						
+						modelConstraintString = "";
+						
+						AC = 1;
+						AT = 1;
+						CG = 1;
+						CT = 1;
+						GT = 1;
+
+						for (customLoopCounter2=1; customLoopCounter2<6; customLoopCounter2=customLoopCounter2+1)
+						{
+							for (customLoopCounter=0; customLoopCounter<customLoopCounter2; customLoopCounter=customLoopCounter+1)
+							{
+								if (modelDesc[customLoopCounter2]==modelDesc[customLoopCounter])
+								{
+									if (rateBiasTerms[customLoopCounter2] == "1")
+									{
+										modelConstraintString = modelConstraintString + rateBiasTerms[customLoopCounter]+":="+rateBiasTerms[customLoopCounter2]+";";
+									}
+									else
+									{
+										modelConstraintString = modelConstraintString + rateBiasTerms[customLoopCounter2]+":="+rateBiasTerms[customLoopCounter]+";";			
+									}
+									break;
+								}
+							}
+						}	
+
+						if (Abs(modelConstraintString))
+						{
+							ExecuteCommands (modelConstraintString);
+						}
+					}
+					else
+					{
+						r = setElement 		(0,2,v2);
+						r = setElement 		(0,3,v3);
+						r = setElement 		(1,2,v4);
+						r = setElement 		(1,3,v5);
+						r = setElement 		(2,3,v6);
+					}
+									
+					Model currentModel = (m,pi);
+					if (modelType == 0)
+					{
+						Tree tr = (dummy,dummy2);
+					}
+					Tree tr = treeString;
+					if (branchLengths)
+					{
+						for (mpiNode = 0; mpiNode < totalBranchCount; mpiNode = mpiNode+1)
+						{
+							eCommand = "tr."+branchNames[mpiNode]+".t:="+Format(stashedLengths [mpiNode],20,12)+"/totalFactor";
+							ExecuteCommands (eCommand);
+						}
+					}
+					
+					LikelihoodFunction lf = (nucData, tr);
+					
+					modelNum = modelNum+1;
+					if (MPI_NODE_COUNT>1)
+					{
+						for (mpiNode = 0; mpiNode < MPI_NODE_COUNT-1; mpiNode = mpiNode+1)
+						{
+							if (MPINodeState[mpiNode][0]==0)
+							{
+								break;	
+							}
+						}
+						
+						if (mpiNode==MPI_NODE_COUNT-1)
+						/* all nodes busy */
+						{
+							mpiNode = ReceiveJobs (1);
+						}
+						else
+						{
+							MPISend (mpiNode+1,lf);
+							MPINodeState[mpiNode][0] = 1;
+							MPINodeState[mpiNode][1] = modelNum;
+							MPINodeState[mpiNode][2] = v1;
+							MPINodeState[mpiNode][3] = v2;
+							MPINodeState[mpiNode][4] = v3;
+							MPINodeState[mpiNode][5] = v4;
+							MPINodeState[mpiNode][6] = v5;
+							MPINodeState[mpiNode][7] = v6;
+						}
+					}
+					else
+					{
+						Optimize (lf_MLES,lf);
+						vv1 = v1;
+						vv2 = v2;
+						vv3 = v3;
+						vv4 = v4;
+						vv5 = v5;
+						vv6 = v6;
+						dummy = ReceiveJobs (0);
+					}
+				}
+			}
+		}
+	}
+
+}
+
+if (MPI_NODE_COUNT>1)
+{
+	while (1)
+	{
+		for (nodeCounter = 0; nodeCounter < MPI_NODE_COUNT-1; nodeCounter = nodeCounter+1)
+		{
+			if (MPINodeState[nodeCounter][0]==1)
+			{
+				fromNode = ReceiveJobs (0);
+				break;	
+			}
+		}
+		if (nodeCounter == MPI_NODE_COUNT-1)
+		{
+			break;
+		}
+	}	
+	OPTIMIZE_SUMMATION_ORDER = 1;
+}
+
+PRINT_DIGITS = 0;
+
+fprintf (stdout, "\n\n--------------------------\n   (*) => p-Value < ", rejectAt, "\nRejected ", rejectCount, " models.\n");
+
+
+if (rejectCount<202)
+{
+
+	fprintf (stdout, "\nPerforming nested tests on the remaining models...\n");
+
+	done = 0;
+	while (!done)
+	{
+		done = 1;
+		for (v2=1; v2<203; v2=v2+1)
+		{
+			if (resultCache[v2][8])
+			{
+				modelString = "0";
+				for (v3 = 0; v3<5; v3=v3+1)
+				{
+					modelString = modelString + resultCache [v2][v3];
+				}
+				for (v3 = v2+1; v3<203; v3 = v3+1)
+				{
+					if (resultCache[v3][8])
+					{
+						modelString2 = "0";
+						for (v4 = 0; v4<5; v4=v4+1)
+						{
+							modelString2 = modelString2 + resultCache [v3][v4];
+						}	
+						if (checkEmbedding (modelString, modelString2))
+						{
+							fprintf (stdout,"H: (", modelString,") A: (", modelString2, "). ");
+							done = 0;
+							LRT = 2*(resultCache[v3][5]-resultCache[v2][5]);
+							npd = resultCache[v3][6]-resultCache[v2][6];
+							if (LRT<0)
+							{
+								pValue = 1;
+							}
+							else
+							{
+								pValue = 1-CChi2(LRT,npd);
+							}
+							fprintf (stdout," P-Value=", Format (pValue,10,3));
+							if (pValue<rejectAt)
+							{
+								fprintf (stdout,". Rejected H.\n");
+								resultCache[v2][8] = 0;
+								break;
+							}
+							else
+							{
+								fprintf (stdout,". Failed to reject H. Discarding A.\n");
+								resultCache[v3][8] = 0;
+							}
+						}
+					}
+				}
+			}
+		}
+	}
+
+	fprintf (BASE_PATH,CLEAR_FILE,"\n\nRemaining models:\n\n#   |  Model   | # prm |    lnL    |      LRT       |    AIC     |   P-Value        |");
+	fprintf (BASE_PATH,"\n----|----------|-------|-----------|----------------|------------|------------------|");
+	
+	fprintf (stdout,"\n\nRemaining models:\n\n#   |  Model   | # prm |    lnL    |      LRT       |    AIC     |   P-Value        |");   
+	fprintf (stdout,"\n----|----------|-------|-----------|----------------|------------|------------------|"); 
+	
+	modelNum = 0;  
+	v5 = 1e10;
+	v4 = 0;
+	
+	for (v2=1; v2<203; v2=v2+1)
+	{
+		if (resultCache[v2][8])
+		{
+			np  = resultCache[v2][6];
+			lnL = resultCache[v2][5];
+			AIC = -2*lnL+2*np;
+			modelNum = 0;
+			modelString = "0";
+			for (v3 = 0; v3<5; v3=v3+1)
+			{
+				modelString = modelString + resultCache [v2][v3];
+			}
+			LRT = -2*(lnL-stdl);
+			if (LRT<0)
+			{
+				LRT = 0;
+			}
+			modelNum = modelNum + 1;
+			PRINT_DIGITS = 3;
+			fprintf (stdout,"\n",v2);
+			fprintf (BASE_PATH,"\n",v2);
+			PRINT_DIGITS = 1;
+			fprintf (stdout," | (",0,resultCache[v2][0],resultCache[v2][1],resultCache[v2][2],resultCache[v2][3],resultCache[v2][4],") | ");
+			fprintf (stdout,Format (np,5,0));
+			fprintf (BASE_PATH," | (",0,resultCache[v2][0],resultCache[v2][1],resultCache[v2][2],resultCache[v2][3],resultCache[v2][4],") | ");
+			fprintf (BASE_PATH,Format (np,5,0));
+			PRINT_DIGITS = 8;
+			fprintf (stdout, " |  ",lnL," | ",Format(LRT,14,3), " |  ", AIC, "  |  ", );
+			fprintf (BASE_PATH, " |  ",lnL," | ",Format(LRT,14,3), " |  ", AIC, "  |  ", );
+			PRINT_DIGITS = 15;
+			if (LRT==0)
+			{
+				pValue = 1;					
+			}
+			else
+			{
+				pValue = 1-CChi2(LRT,fullnp-np);
+			}
+			if (AIC<v5)
+			{
+				v5 = AIC;
+				v4 = v2;
+			}
+			fprintf (stdout,pValue," |");
+			fprintf (BASE_PATH,pValue," |");	
+		}
+		
+	}
+	
+
+	PRINT_DIGITS = 0;
+	modelString = "0";
+	for (v3 = 0; v3<5; v3=v3+1)
+	{
+		modelString = modelString + Format(resultCache [v4][v3],0,0);
+	}
+	
+	fprintf (stdout, "\n\nAIC based winner: (", modelString, ") with AIC = ", v5, "\n\n");
+	fprintf (BASE_PATH, "\n\nAIC based winner: (", modelString, ") with AIC = ", v5, "\n\n");
+	
+	bestModelString = modelString;
+	
+	printModelMatrix (modelString);
+	
+	modelString2 = "";
+	if (modelString == "000000")
+	{
+		modelString2 = "F81";
+	}
+	if (modelString == "010010")
+	{
+		modelString2 = "HKY85";
+	}
+	if (modelString == "010020")
+	{
+		modelString2 = "TrN";
+	}
+	if (Abs(modelString2))
+	{
+		fprintf (stdout, "\nThis model is better known as:", modelString2, "\n");
+		fprintf (BASE_PATH, "\nThis model is better known as:", modelString2, "\n");
+	}
+
+}
+else
+{
+	fprintf (stdout, "\nGeneral Reversible Model is the winner!\n");
+	fprintf (BASE_PATH, "\nGeneral Reversible Model is the winner!\n");
+	bestModelString = "012345";
+}
+
+if (modelType)
+{
+	modelAICs = {203,2};
+	modelAICs[0][0] = 2*(-resultCache[0][5]+resultCache[0][6]+Log(nucData.sites));
+	modelAICs[0][1] = 0;
+
+	for (v2=1; v2<203; v2=v2+1)
+	{
+		modelAICs[v2][0] = 2*(resultCache[v2][6]-resultCache[v2][5]+Log(nucData.sites));
+		modelAICs[v2][1] = v2;
+	}
+
+	modelAICs = modelAICs%0;
+	v3 = 1;
+
+	/* compute Akaike weights */
+
+	for (v2=1; v2<203; v2=v2+1)
+	{
+		v4 = Exp(0.5*(modelAICs[0][0]-modelAICs[v2][0]));
+		modelAICs[v2][0] = v4;
+		v3 = v3+v4;
+	}
+
+	modelAICs[0][0] = 1;
+
+	for (v2=0; v2<203; v2=v2+1)
+	{
+		modelAICs[v2][0] = modelAICs[v2][0]/v3;
+	}
+
+
+
+
+	/* now compute model averaged stuff */
+
+	modelAveragedRates   = {5,1};
+	modelAveragedEqual	 = {6,6};
+
+	for (v2=0; v2<203; v2=v2+1)
+	{
+		v3  = modelAICs[v2][1];
+		AIC = modelAICs[v2][0];
+		for (v4 = 0; v4 < 5; v4 = v4 + 1)
+		{
+			aRate = resultCache[v3][9+v4];
+			modelAveragedRates[v4] = modelAveragedRates[v4] + aRate*AIC;
+			if (aRate == 1)
+			{
+				modelAveragedEqual[1][v4+(v4>0)] = modelAveragedEqual[1][v4+(v4>0)] + AIC;
+				modelAveragedEqual[v4+(v4>0)][1] = modelAveragedEqual[v4+(v4>0)][1] + AIC;
+			}
+		} 
+		for (v4=1; v4<5; v4=v4+1)
+		{
+			for (v5=0; v5<v4; v5=v5+1)
+			{
+				if (resultCache[v3][9+v4] == resultCache[v3][9+v5])
+				{
+					modelAveragedEqual[v4+(v4>0)][v5+(v5>0)] = modelAveragedEqual[v4+(v4>0)][v5+(v5>0)] + AIC;
+					modelAveragedEqual[v5+(v5>0)][v4+(v4>0)] = modelAveragedEqual[v5+(v5>0)][v4+(v4>0)] + AIC;
+				}
+			}	
+		}
+	}
+
+	fprintf (stdout, "\nModel averaged rates relative to AG (REV estimates):\n\tAC = ", Format(modelAveragedRates[0],8,4),"\t(",Format(resultCache[0][9],8,4),")",
+										    "\n\tAT = ", Format(modelAveragedRates[1],8,4),"\t(",Format(resultCache[0][10],8,4),")",
+										    "\n\tCG = ", Format(modelAveragedRates[2],8,4),"\t(",Format(resultCache[0][11],8,4),")",
+										    "\n\tCT = ", Format(modelAveragedRates[3],8,4),"\t(",Format(resultCache[0][12],8,4),")",
+										    "\n\tGT = ", Format(modelAveragedRates[4],8,4),"\t(",Format(resultCache[0][13],8,4),")\n");
+										    
+	fprintf (BASE_PATH, "\nModel averaged rates relative to AG (REV estimates):\n\tAC = ", Format(modelAveragedRates[0],8,4),"\t(",Format(resultCache[0][9],8,4),")",
+										    "\n\tAT = ", Format(modelAveragedRates[1],8,4),"\t(",Format(resultCache[0][10],8,4),")",
+										    "\n\tCG = ", Format(modelAveragedRates[2],8,4),"\t(",Format(resultCache[0][11],8,4),")",
+										    "\n\tCT = ", Format(modelAveragedRates[3],8,4),"\t(",Format(resultCache[0][12],8,4),")",
+										    "\n\tGT = ", Format(modelAveragedRates[4],8,4),"\t(",Format(resultCache[0][13],8,4),")\n");
+
+	rateAssignments = {6,1};
+	for (v2 = 0; v2 < 6; v2 = v2+1)
+	{
+		v4 = rateAssignments[v2];
+		
+		for (v3 = v2 + 1; v3 < 6; v3 = v3+1)
+		{
+			v5 = rateAssignments[v3];
+			if (v4 == v5)
+			{
+				if (modelAveragedEqual[v2][v3]<0.0005)
+				{
+					rateAssignments[v3] = rateAssignments[v3]+1;
+				}
+			}
+		}
+	}
+	
+	modelString = "";
+	for (v2=0;v2<6;v2=v2+1)
+	{
+		modelString = modelString+Format(rateAssignments[v2],1,0);
+	}
+
+	fprintf (stdout, "\n\nModel averaged selection: (", modelString, ")\n\n");
+	fprintf (BASE_PATH, "\n\nModel averaged selection: (", modelString, ")\n\n");
+	printModelMatrix (modelString);
+	
+}
+
diff --git a/res/TemplateBatchFiles/PARRIS.bf b/res/TemplateBatchFiles/PARRIS.bf
new file mode 100644
index 0000000..6658e4a
--- /dev/null
+++ b/res/TemplateBatchFiles/PARRIS.bf
@@ -0,0 +1,1427 @@
+ModelMatrixDimension = 0;
+
+baselineOutput   = "";
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function computeExpSubWeights (dum)
+{
+	rateTypeWeights     = {6,2};
+	rateTypeWeightsGY94 = {6,2};
+		
+	hshift = 0;
+
+	for (h=0; h<64; h=h+1)
+	{
+		if (_Genetic_Code[h]==10) 
+		{
+			continue; 
+		}
+		for (h=0; h<64; h=h+1)
+		{
+			if (_Genetic_Code[h]==10) 
+			{
+				hshift = hshift+1;
+				continue; 
+			}
+			vshift = hshift;
+			for (v = h+1; v<64; v=v+1)
+			{
+				diff = v-h;
+				if (_Genetic_Code[v]==10) 
+				{
+					vshift = vshift+1;
+					continue; 
+				}
+				nucPosInCodon = 2;
+				if ((h$4==v$4)||((diff%4==0)&&(h$16==v$16))||(diff%16==0))
+				{
+					if (h$4==v$4)
+					{
+						transition = v%4;
+						transition2= h%4;
+					}
+					else
+					{
+						if(diff%16==0)
+						{
+							transition = v$16;
+							transition2= h$16;
+							nucPosInCodon = 0;
+						}
+						else
+						{
+							transition = v%16$4;
+							transition2= h%16$4;
+							nucPosInCodon = 1;
+						}
+					}
+					
+					mxIndex = 0;
+					if (transition<transition2)
+					{
+						t1 = transition;
+						t2 = transition2;
+					}
+					else
+					{
+						t1 = transition2;
+						t2 = transition;
+					}
+					
+					if (t1 == 0)
+					{
+						mxIndex = t2-1;
+					}
+					else
+					{
+						if (t1 == 1)
+						{
+							mxIndex = 1+t2;
+						}
+						else
+						{
+							mxIndex = 5;
+						}
+					}
+					
+					t1 = (_Genetic_Code[0][h]!=_Genetic_Code[0][v]);
+					rateTypeWeights[mxIndex][t1] = rateTypeWeights[mxIndex][t1]+
+												   vectorOfFrequencies[h-hshift]*observedFreq[transition][nucPosInCodon]+
+												   vectorOfFrequencies[v-vshift]*observedFreq[transition2][nucPosInCodon];
+					rateTypeWeightsGY94[mxIndex][t1] = rateTypeWeightsGY94[mxIndex][t1]+
+												   2*vectorOfFrequencies[h-hshift]*vectorOfFrequencies[v-vshift];
+				}
+		   }
+	    }		
+	}
+	return 0;		
+}
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------------*/
+
+/* echoCatVar: calculate category mean and variance; output distribution info */ 
+function echoCatVar (distrInfo)
+{
+	DD = Columns(distrInfo);
+	EE = 0.0;
+	sampleVar = 0.0;
+	cumulative_weight = 0.0;
+	median = -1;
+	for (k=0; k<DD; k=k+1)
+	{
+		T = distrInfo[0][k]*distrInfo[1][k];
+		EE = EE+T;
+		sampleVar = T*distrInfo[0][k]+sampleVar;
+		cumulative_weight = cumulative_weight + distrInfo[1][k];
+		if (cumulative_weight >= 0.5 && median < 0)
+		{
+		    median = distrInfo[0][k];
+		}
+	}
+		
+	sampleVar = sampleVar-EE*EE;
+	
+	fprintf  (distribOutput,"\n------------------------------------------------\n\nSample mean = ",EE, " (sample variance = ",sampleVar,", median = ",median,")\n");
+
+	for (k=0; k<DD; k=k+1)
+	{
+		fprintf (distribOutput,"\nRate[",Format(k,0,0),"]=",Format(distrInfo[0][k],12,8), " (weight=", 
+						  Format(distrInfo[1][k],9,7),")");
+	}
+	fprintf  (distribOutput,"\n------------------------------------------------\n\n");
+	return EE;
+}
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function echoRatio (distrInfo, distrInfo2)
+{
+	D1 = Columns(distrInfo);
+	D2 = Columns(distrInfo2);
+		
+	ratioInfo = {3,D1*D2};
+	
+	for (k=0; k<D1; k=k+1)
+	{
+		EE = k*D2;
+		for (k2 = 0; k2<D2; k2=k2+1)
+		{
+			ratioInfo [0][EE+k2] = distrInfo[0][k]/distrInfo2[0][k2];
+			ratioInfo [1][EE+k2] = distrInfo[1][k]*distrInfo2[1][k2];
+			ratioInfo [2][EE+k2] = k2*D1+k;
+		}
+	}
+	
+	done = 0;
+	EE = D1*D2;
+	while (!done)
+	{
+		done = 1;
+		for (k=1; k<EE; k=k+1)
+		{
+			if (ratioInfo [0][k] < ratioInfo[0][k-1])
+			{
+				DD = ratioInfo [0][k];
+				ratioInfo [0][k] = ratioInfo [0][k-1];
+				ratioInfo [0][k-1] = DD;
+				DD = ratioInfo [1][k];
+				ratioInfo [1][k] = ratioInfo [1][k-1];
+				ratioInfo [1][k-1] = DD;
+				DD = ratioInfo [2][k];
+				ratioInfo [2][k] = ratioInfo [2][k-1];
+				ratioInfo [2][k-1] = DD;
+				done = 0;
+			}
+		}
+	}
+	return echoCatVar (ratioInfo);
+}
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------------*/
+
+/* F3x4 empirical frequency estimation; obsF is a 4x3 matrix containing position-specific nucleotide frequencies: */
+function BuildCodonFrequencies (obsF) 
+{
+	PIStop = 1.0;
+	result = {ModelMatrixDimension,1};
+	hshift = 0;
+
+	for (h=0; h<64; h=h+1)
+	{
+		first = h$16;
+		second = h%16$4;
+		third = h%4;
+		if (_Genetic_Code[h]==10) 
+		{
+			hshift = hshift+1;
+			PIStop = PIStop-obsF[first][0]*obsF[second][1]*obsF[third][2];
+			continue; 
+		}
+		result[h-hshift][0]=obsF[first][0]*obsF[second][1]*obsF[third][2];
+	}
+	return result*(1.0/PIStop);
+}
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------------*/
+fprintf (stdout, "\n+--------------------------------+\n",
+                   "|     PARRIS SELECTION TEST      |\n",
+                   "|          written by            |\n",
+                   "|       Konrad Scheffler         |\n",
+                   "|             and                |\n",
+                   "|        Cathal Seoighe          |\n",
+                   "|                                |\n",
+                   "|    If you use this analysis    |\n",
+                   "| in a publication, please cite  |\n",
+                   "|  Bioinformatics, 22:2493�2499  |\n",
+                   "+--------------------------------+\n");
+
+
+#include "TemplateModels/chooseGeneticCode.def";
+#include "_MFReader_.ibf";
+
+/* _MFReader_ stores position-specific nucleotide frequencies in positionFrequencies (4x3)
+   and overall nucleotide frequencies in overallFrequencies (4x1). */
+observedFreq = positionFrequencies;
+
+/* Input whether to optimise branch lengths in codon model or use pre-optimised nucleotide model branch lengths: */
+ChoiceList (branchLengths,"Branch Lengths",1,SKIP_NONE,
+			"Codon Model","Jointly optimize rate parameters and branch lengths (slow and thorough)",
+			"Nucleotide Model","Estimate branch lengths once, using an appropriate nucleotide model (quick and dirty)."
+		    );
+		    
+if (branchLengths<0)
+{
+	return 0;
+}
+
+/* Input type of underlying nucleotide model (optionally with "multi") and set up constraints: */
+/* (In earlier versions these options were input as modelChoice using a single ChoiceList.) */
+modelConstraintString = "";
+
+ChoiceList (MGGYChoice, "Options for handling equilibrium frequencies",1,SKIP_NONE,
+	                "MG", "Muse-Gaut 94: rates are proportional to position-specific target nucleotide frequency.",
+	                "GY", "Goldman-Yang 94: rates are proportional to target codon frequency (F3x4 estimate)."
+           );
+
+if (MGGYChoice<0)
+{
+	return 0;
+}
+
+ChoiceList (nucModelChoice, "Nucleotide Rate Matrix Options",1,SKIP_NONE,
+			"Jukes-Cantor",	 "Single rate type (all substitutions equally likely).",
+			"HKY85","Two rate types (transition/transverion ratio parameter kappa).",
+			"REV","Fully reversible model (6 rate types - recommended rate matrix)",
+			"Custom","Arbitrary nucleotide reversible model, except F81."
+           );
+
+if (nucModelChoice<0)
+{
+	return 0;
+}
+
+ChoiceList (AAModelChoice, "Options for multiple classes of non-synonymous substitutions",1,SKIP_NONE,
+                 	    "Single","Only one class of non-synonymous substitutions (standard model).",
+	                    "Multi","Multiple classes of non-synonymous substitutions.",
+	                    "NMulti","Multi with numerical bias corrections for various amino-acid substitutions."
+           );
+
+if (AAModelChoice<0)
+{
+	return 0;
+}
+
+modelInFile = "2RatesAnalyses/MG94GY94xREV_PARRIS_syn3.mdl";
+if (MGGYChoice == 0)
+{
+    ModelTitle = "MG94";
+}
+else
+{
+    ModelTitle = "GY94";
+}
+
+if (nucModelChoice == 0)
+{
+	modelConstraintString = "AC:=1;AT:=1;CG:=1;CT:=1;GT:=1"; 
+}
+else
+{
+	if (nucModelChoice == 1)
+	{
+		modelConstraintString = "CT:=1;AT:=AC;CG:=AC;GT:=AC"; 
+		ModelTitle = ModelTitle+"xHKY85";
+	}
+	else
+	{
+		if (nucModelChoice == 3)
+		{
+			done = 0;
+			while (!done)
+			{
+				fprintf (stdout,"\nPlease enter a 6 character model designation (e.g:010010 defines HKY85):");
+				fscanf  (stdin,"String", modelDesc);
+				if (Abs(modelDesc)==6)
+				{	
+					done = 1;
+				}
+			}			
+			ModelTitle = ModelTitle+modelDesc[0];
+						
+			rateBiasTerms = {{"AC","1","AT","CG","CT","GT"}};
+			paramCount	  = 0;
+
+			modelConstraintString = "";
+
+			for (customLoopCounter2=1; customLoopCounter2<6; customLoopCounter2=customLoopCounter2+1)
+			{
+				for (customLoopCounter=0; customLoopCounter<customLoopCounter2; customLoopCounter=customLoopCounter+1)
+				{
+					if (modelDesc[customLoopCounter2]==modelDesc[customLoopCounter])
+					{
+						ModelTitle  = ModelTitle+modelDesc[customLoopCounter2];	
+						if (rateBiasTerms[customLoopCounter2] == "1")
+						{
+							modelConstraintString = modelConstraintString + rateBiasTerms[customLoopCounter]+":="+rateBiasTerms[customLoopCounter2]+";";
+						}
+						else
+						{
+							modelConstraintString = modelConstraintString + rateBiasTerms[customLoopCounter2]+":="+rateBiasTerms[customLoopCounter]+";";			
+						}
+						break;
+					}
+				}
+				if (customLoopCounter==customLoopCounter2)
+				{
+					ModelTitle = ModelTitle+modelDesc[customLoopCounter2];	
+				}
+			}	
+		}
+		else
+		{
+		    ModelTitle = ModelTitle+"xREV";
+		}
+	}
+			
+	if (AAModelChoice > 0)
+	{
+	    fprintf(stdout, "Warning: running untested multi code!");
+	    if (AAModelChoice == 2)
+	    {
+		ModelTitle = ModelTitle+"xNMulti";
+		_AA_RM_NUMERIC = 2;
+	    }
+	    else
+	    {
+		ModelTitle = ModelTitle+"xMulti";
+	    }
+            #include "TemplateModels/MGwAA.ibf";
+	    rateKeys = Rows (aaRateClassIDs);
+	    userAARateMultipliers = {21,21};
+	    if (AAModelChoice == 2)
+	    {
+		_AA_RM_NUMERIC = 0;
+		for (h=0; h<21;h=h+1)
+		{
+		    for (v=0; v<21; v=v+1)
+		    {
+			userAARateMultipliers[h][v] = "R*" + aaRateMultipliers[h][v] + "*";
+			userAARateMultipliers[v][h] = "R*" + aaRateMultipliers[v][h] + "*";
+		    }
+		}								
+	    }
+	    else
+	    {
+		for (aaIndex = 0; aaIndex < Abs(aaRateClassIDs); aaIndex = aaIndex+1)
+		{
+		    ExecuteCommands ("global DN_"+rateKeys[aaIndex]+" = 1;");
+		}
+		for (h=0; h<21;h=h+1)
+		{
+		    for (v=0; v<21; v=v+1)
+		    {
+			userAARateMultipliers[h][v] = "DN_" + aaRateMultipliers[h][v] + "*";
+			userAARateMultipliers[v][h] = "DN_" + aaRateMultipliers[v][h] + "*";
+		    }
+		}								
+	    }
+	}
+}
+
+ChoiceList (rateVarModelChoice, "Rate Variation Models",1,SKIP_NONE,
+			     "Constant","Constant Rate Model: no rate variation across sites.", /* index 0 */
+			     "Proportional","Proportional Variable Rates Model: dS and dN vary along the sequence, but dN = R*dS for every site. Recommended model.",
+			     "Nonsynonymous","Non-synonymous Variable Rates Model: dS = 1 for every site, while dN is drawn from a given distribution.",
+			     "Dual","Dual Variable Rates Model: dS and dN are drawn from a bivariate distribution (independent or correlated components).",
+			     "Lineage Dual","Lineage Dual Variable Rates Model:  dS and dN are drawn from a bivariate distribution (independent or correlated components), plus each lineage has an adjustment factor for the E[dN]/E[dS]."
+			     );
+			    
+if (rateVarModelChoice<0)
+{
+    return 0;
+}
+	
+/* For models with dual rate variation, input whether NonSynRate should be independent or a multiplicative funtion of synRate, and whether to model synonymous rate variation at the codon level (syn1) or the nucleotide level (syn3): */
+multiplicativeNonSynRate = 0;
+nucSynVar = 0;
+if (rateVarModelChoice >= 3)
+{
+    ChoiceList (multiplicativeNonSynRate, "Independent or multiplicative nonsynonymous rate",1,SKIP_NONE,
+		"Independent","Nonsynonymous rate is independent of synonymous rate.",
+		"Multiplicative","Nonsynonymous rate is omega multiplied by synonymous rate."
+	       );
+    if (multiplicativeNonSynRate<0)
+    {
+	return 0;
+    }
+
+    ChoiceList (nucSynVar, "Codon or nucleotide level synonymous rate variation",1,SKIP_NONE,
+		"Codon (syn1)","1 synonymous rate per codon.",
+		"Nucleotide (syn3)","3 synonymous rates per codon.",
+		/*"syn2", "2 independent synonymous rates per codon (2nd pos is avg of 1st and 3rd)"*/
+	    );
+    if (nucSynVar<0)
+    {
+	return 0;
+    }    
+}
+
+/* Input list of models to be run (out of various rate variation options): */
+/* (chosenModelList will contain nonzero entries for selected models) */
+num_models = 8;
+chosenModelList = {num_models,1};
+
+ChoiceList (modelChoice,"Distribution Options",1,SKIP_NONE,
+			"Run All","Run all available models.",
+			"Run Custom","Choose some of the available models.",
+	                "PARRIS","Run PARRIS model comparison.");
+			
+if (modelChoice<0)
+{
+	return 0;
+}
+
+if (modelChoice==2)
+{
+    for (mi = 0; mi<5; mi=mi+1)
+    {
+		chosenModelList[mi][0] = 0;
+    }
+    chosenModelList[5][0] = 1;
+    chosenModelList[6][0] = 1;
+    resp = 3; /* nr of synonymous rate classes (not used for PARRIS models except in output and postprocessing) */
+    resp2 = 3; /* nr of nonsynonymous rate classes (in alternative model) (not used for PARRIS models except in output and postprocessing) */
+	USE_LAST_RESULTS = 1;
+}
+else
+{
+
+/* Input nrs of rate classes: (presumably unused when they don't apply) */
+    resp  = 0;
+    resp2 = 0;
+
+    while (resp<2)
+    {
+	fprintf (stdout,"Number of synonymous (and single variable rate models) rate classes (>=2):");
+	fscanf  (stdin, "Number", resp);
+    }
+
+    while (resp2<2)
+    {
+	fprintf (stdout,"Number of non-synonymous rate classes (>=2):");
+	fscanf  (stdin, "Number", resp2);
+    }
+			
+    if (modelChoice==0)
+    {
+	for (mi = 0; mi<num_models; mi=mi+1)
+	{
+		chosenModelList[mi][0] = 1;
+	}
+    }
+    else
+    {
+
+/* Input distribution options: */
+/* M3 is similar to Independent Discrete, differences being that it fixes the nr of rate categories and that it
+   allow use of syn3 files. Independent Discrete is the older (KP) implementation and does not support syn3. */
+ 
+	ChoiceList (distribChoices, "Distribution Option",0,SKIP_NONE,
+			"Syn:Gamma, Non-syn:Gamma",	 "Both syn and non-syn rates are drawn from the gamma distributions for all models.",
+			"Syn:Gamma, Non-syn:Inv+Gamma","Rates are drawn from the gamma distributions for Proportional and Nonsynonymous. For Dual and Local Dual, syn rates are drawn from the gamma distribution, and non-syn rates - from Inv+Gamma.",
+			"Independent Discrete", "Independent General Discrete Distributions (Recommended setting)",
+			"Correlated Discrete", "Correlated General Discrete Distributions",
+			"Non-positive Discrete", "General Discrete Distribution for dS, and dN, but constrained so that dN<=dS. Useful to perform a LRT for presence of selection in an alignment",
+	                "M1a", "General Discrete Distribution for dS (3 cat), M1a omega distribution",
+	                "M2a", "General Discrete Distribution for dS (3 cat), M2a omega distribution",
+		        "M3", "General Discrete Distribution for dS (3 cat), M3 omega distribution (3 cat)");	
+
+			
+	if (distribChoices[0] < 0)
+	{
+	    return 0;
+	}
+	
+	for (mi = 0; mi < Rows(distribChoices)*Columns(distribChoices); mi = mi + 1)
+	{
+	    modelChoice = distribChoices[mi];
+	    chosenModelList[modelChoice] = 1;
+	}	
+    }
+}
+modelNamesShort = {{"GamGam","GamIGam","Discrete","CorrDiscrete","NPDiscrete","M1a","M2a", "M3"}};
+
+
+/* Input whether to use default or randomised initial values for rate distribution parameters: */
+ChoiceList (randomizeInitValues, "Initial Value Options",1,SKIP_NONE,
+			"Default",	 "Use default inital values for rate distribution parameters.",
+			"Randomized",	 "Select initial values for rate distribution parameters at random.");
+
+
+if (randomizeInitValues < 0)
+{
+	return 0;
+}
+
+/* This variable is dereferenced in the unused function SetCodonNorm in the MG and GY model definition files, where it is used to scale codonFactor; keep it set to 1 and it will have no effect even if SetCodonNorm is used: */
+fudgeFactor = 1.0;
+
+
+SetDialogPrompt ("Save summary result file to:");
+fprintf (PROMPT_FOR_FILE,CLEAR_FILE);
+baselineOutput = LAST_FILE_PATH;
+
+distribOutput = baselineOutput + ".distributions";
+fprintf (distribOutput,CLEAR_FILE);
+
+
+/* Don't know why this is negated: */
+if (branchLengths)
+{
+	branchLengths = -branchLengths;
+}
+
+
+/* Output stuff: */
+separator = "+--------------------+----------------+---------------+-----------------+------------------+-----------+-----+-----------+\n";
+
+fprintf (stdout, "\n\nRUNNING ",ModelTitle," MODEL COMPARISONS on ",fileCount, " files\n\n",
+	 "\n\n########### ",resp,"x",resp2," CLASSES ###########\n\n", separator,
+	    "|       Model        | Log Likelihood | Synonymous CV |  NS Exp and CV  |  N/S Exp and CV  |  P-Value  | Prm |    AIC    |\n", separator);
+
+fprintf (baselineOutput,  "\n\nRUNNING ",ModelTitle," MODEL COMPARISONS on ",dataFilePath, "\n\n",
+	 "\n\n########### ",resp,"x",resp2," CLASSES ###########\n\n", separator,
+	 "|       Model        | Log Likelihood | Synonymous CV |  NS Exp and CV  |  N/S Exp and CV  |  P-Value  | Prm |    AIC    |\n", separator);
+
+
+modelNames = {{"| Gamma, Gamma       |",
+	       "| Gamma, Inv+Gamma   |",
+	       "| Independent Discr  |",
+	       "| Correlated Discr   |",
+	       "| Non-positive Discr |",
+	       "| discr(3), M1a      |",
+	       "| discr(3), M2a      |",
+               "| discr(3), discr(3) |"}};
+			   
+
+if (MPI_NODE_COUNT>1)
+/* Check to see if we are running with more than one MPI node.
+   If not - bail to single CPU execution */			   
+{
+	MPINodeState = {MPI_NODE_COUNT-1,2};
+	
+	/* One of the nodes (0) will be the dispatcher, and
+	   for every other node, we need to store two values:
+	   whether it is busy or not (0 or 1), and 
+	   an integer (from 0 to 5) to indicate which model
+	   (M0-M5) the node is working on */
+	   
+	OPTIMIZE_SUMMATION_ORDER = 0;
+	
+	/* the master node will be creating likelihood functions, 
+	but not evaluating them - thus there is no need to perform
+	the extra step of optimizing data column ordering for faster
+	likelihood evaluations */
+}
+
+doNucFit = 1;
+
+for (midx = 0; midx<num_models; midx=midx+1)
+{
+	if (chosenModelList[midx])
+	{
+
+/* Depending on distribution option, read category definitions from file: */
+/* for gamma models, read from file into categDef1 (for syn distribution) and categDef2 
+   (for nonsyn distribution) variables;
+   for discrete models, execute generator file which will create these variables (randomizeInitValues is used).
+   The category definitions are string variables to be executed in the mdl files. */
+	    if (midx<2) /* gamma rate models */
+	    {
+		fscanf ("2RatesAnalyses/gamma1.def","Raw",categDef1);
+
+		if (midx == 0)
+		{
+		    fscanf ("2RatesAnalyses/gamma2.def","Raw",categDef2);
+		}
+		else
+		{
+		    fscanf ("2RatesAnalyses/gamma2+Inv.def","Raw",categDef2);
+		}
+	    }
+	    else
+	    {
+		if (midx < 5) /* general discrete rate models */
+		{
+		    if (midx < 4)
+		    {
+			correlationOn = (distribChoice>2);
+			fscanf ("2RatesAnalyses/discreteGenerator.bf","Raw",tempstr);
+		    }
+		    else
+		    {
+			fscanf ("2RatesAnalyses/discreteGeneratorNoPS.bf","Raw",tempstr);	
+		    }
+		    ExecuteCommands (tempstr);
+		}
+		else /* PARRIS rate models */
+		{
+		    if (nucSynVar)
+		    {
+			fscanf ("2RatesAnalyses/PARRIS_syn3.def","Raw",categDef1);
+		    }
+		    else
+		    {
+			fscanf ("2RatesAnalyses/PARRIS_synvar.def","Raw",categDef1);
+		    }
+
+		    if (midx == 5) /* null (M1a omega distrib) */
+		    {
+			fscanf ("2RatesAnalyses/PARRIS_M1.def","Raw",categDef2);
+		    }
+		    if (midx == 6) /* alternative (M2a omega distrib) */
+		    {
+			fscanf ("2RatesAnalyses/PARRIS_M2.def","Raw",categDef2);
+		    }		    
+		    if (midx == 7) /* PARRIS discrete (M3 omega distrib) */
+		    {
+			fscanf ("2RatesAnalyses/PARRIS_M3.def","Raw",categDef2);
+		    }
+		}
+	    }
+
+/* execute model file: */
+	    ExecuteAFile (modelInFile);
+	    
+	    if (Abs(modelConstraintString))
+	    {
+			ExecuteCommands (modelConstraintString);
+	    }
+
+	    
+	    theRateMatrix = 0;
+	    
+	    MULTIPLY_BY_FREQS = PopulateModelMatrix ("theRateMatrix", observedFreq, rateVarModelChoice);
+	    vectorOfFrequencies = BuildCodonFrequencies (observedFreq);
+	    
+	    if (doNucFit) /* Fit nucleotide model to optimise branch lengths if this hasn't been done already: */
+	    {
+		ExecuteCommands (nucModelString+"\nModel nucModel = (nucModelMatrix,overallFrequencies);");
+		
+		populateTrees   ("nucTree", fileCount);
+		ExecuteCommands (constructLF ("nuc_lf", "nucData", "nucTree", fileCount));
+		Optimize (nuc_res, nuc_lf);
+		
+		computeExpSubWeights (0);		
+		global codonFactor = 0.33;
+		
+		/* Count nr of branch lengths optimised: */
+		totNumBranchLengths = 0;
+		for (fileID = 1; fileID <= fileCount; fileID = fileID + 1)
+		{
+		    ExecuteCommands ("totNumBranchLengths = totNumBranchLengths + TipCount (nucTree_"+fileID+") + BranchCount (nucTree_"+fileID+");");
+		}
+
+		doNucFit = 0;
+	    }
+	    
+	    Model theModel = (theRateMatrix,vectorOfFrequencies,MULTIPLY_BY_FREQS);
+	    populateTrees     ("givenTree", fileCount);
+	    
+	    
+	    for (fileID = 1; fileID <= fileCount; fileID = fileID + 1)
+	    {
+			if (branchLengths)
+			{
+				ExecuteCommands ("ClearConstraints (givenTree_" + fileID + ");");
+				ExecuteCommands ("ReplicateConstraint (\"this1.?.synRate:=this2.?.t__/codonFactor\",givenTree_" + fileID + ",nucTree_" + fileID + ");");
+			}
+			else
+			{
+				bnames = Eval ("BranchName (givenTree_"+fileID+",-1)");
+				for (lc = 0; lc < Columns (bnames) - 1; lc = lc+1)
+				{
+					ExecuteCommands ("givenTree_" + fileID + "." + bnames[lc] + ".synRate=nucTree_" + fileID + "." + bnames[lc] + ".t/codonFactor;");
+				}
+			}
+	    }
+	    
+	    ExecuteCommands (constructLF ("lf", "filteredData", "givenTree", fileCount));
+	    
+	    if (midx >= 4) /* nonpositive discrete distribution and PARRIS models */
+	    {
+			R := 1;
+	    }	
+		
+	    if (MPI_NODE_COUNT>1)
+	    {
+		/* look for an idle node */
+		for (mpiNode = 0; mpiNode < MPI_NODE_COUNT-1; mpiNode = mpiNode+1)
+		{
+		    if (MPINodeState[mpiNode][0]==0)
+		    {
+			break;	
+		    }
+		}
+		
+		if (mpiNode==MPI_NODE_COUNT-1)
+		    /* all nodes busy */
+		{
+		    /* wait for some node to complete and send out current job */
+		    mpiNode = ReceiveJobs (1);
+		}
+		else
+		{
+		    /* send the job to an idle node; update node state */
+		    MPISend (mpiNode+1,lf);
+		    MPINodeState[mpiNode][0] = 1;
+		    MPINodeState[mpiNode][1] = midx;
+		}
+	    }
+	    else
+	    {
+		/* Non-MPI execution */
+			Optimize (res,lf);
+			modelIndex = midx;
+			ReceiveJobs (0);
+	    }
+	}
+}
+
+if (MPI_NODE_COUNT>1)
+/* wait for all the jobs to finish, process their results */
+{
+	while (1)
+	{
+		for (nodeCounter = 0; nodeCounter < MPI_NODE_COUNT-1; nodeCounter = nodeCounter+1)
+		{
+			if (MPINodeState[nodeCounter][0]==1)
+			{
+				fromNode = ReceiveJobs (0);
+				break;	
+			}
+		}
+		if (nodeCounter == MPI_NODE_COUNT-1)
+		{
+			break;
+		}
+	}	
+	OPTIMIZE_SUMMATION_ORDER = 1;
+}
+
+/* ____________________________________________________________________________________________________________________*/
+
+function ReceiveJobs (sendOrNot)
+
+/* This function receieves and processes 
+   model results. The parameter is a boolean,
+   set to 1 if there are jobs waiting to be sent to
+   an MPI node */
+{
+	if (MPI_NODE_COUNT>1)
+	{
+
+	    /* Fetch completed job (waiting if necessary); send new job if one is waiting; update node status; 
+	       reconstruct likelihood function and result matrix from completed job as if it had run locally. */
+
+		MPIReceive (-1, fromNode, result_String);
+		modelIndex = MPINodeState[fromNode-1][1];
+		
+		if (sendOrNot)
+		{
+			/* send the likelihood function to the node which just finished */
+			MPISend (fromNode,lf);
+			MPINodeState[fromNode-1][1] = midx;
+		}
+		else
+		{
+			/* mark the node as idle */
+			MPINodeState[fromNode-1][0] = 0;
+			MPINodeState[fromNode-1][1] = 0;
+		}
+		
+		/* reset category variables */
+		/* (we are about to build the likelihood function of the completed job, 
+		   which may be incompatible with constraints still in place from the previous lf) */
+
+		if (rateVarModelChoice)
+		{
+			ClearConstraints (c);
+		}
+		if (rateVarModelChoice>2)
+		{
+			ClearConstraints (d);
+			if (nucSynVar)
+			{
+			    ClearConstraints (c1,c2,c3);
+			}
+		}
+		
+		/* build the likelihood function lf with MLE parameter values
+		   just returned from an MPI node. MLE matrix is returned 
+		   in lf_MLES. */
+		   		
+		ExecuteCommands (result_String);
+				
+		/* store the result matrix */
+		res = lf_MLES;
+	}
+	
+
+	/* res[1][1] contains the number of independent parameters optimised. If branchlengths were fixed but
+	   previously optimised on a nucleotide model, we need to add these, minus 1 for the codonFactor 
+	   (tree length scaling) parameter: */
+	if (branchLengths)
+	{
+		res[1][1] = res[1][1] + totNumBranchLengths - 1;
+	}
+
+	/* Initialise output files, output whole-sequence results: */
+	LIKELIHOOD_FUNCTION_OUTPUT = 6;
+
+	fprintf (stdout, modelNames[modelIndex], " ", Format (res[1][0],14,5));
+	fprintf (baselineOutput, modelNames[modelIndex], " ", Format (res[1][0],14,5));
+	
+	fitOutFile = baselineOutput + "." + modelNamesShort[modelIndex] + ".fit";
+       	fprintf (fitOutFile,CLEAR_FILE,lf);
+
+	if (rateVarModelChoice) /* Create output file for marginals if a category variable exists */
+	{
+		marginalOutFile = baselineOutput + "." + modelNamesShort[modelIndex] + ".marginals";
+		fprintf (marginalOutFile,CLEAR_FILE);
+	}
+	
+	fprintf (distribOutput, modelNames[modelIndex]);
+	if (rateVarModelChoice==0) /* No site-to-site rate variation: just output mean omega (variance of category variable is zero when only a single category exists */
+	{
+		EE = 0;
+		sampleVar = 0;
+		fprintf (stdout, " |      N/A      | ", Format (R,7,5) , ",", Format (sampleVar,7,5), " | ", Format (R,7,5) , ",", Format (sampleVar,8,5), " | ");
+		fprintf (baselineOutput, " |      N/A      | ", Format (R,7,5) , ",", Format (sampleVar,7,5), " | ", Format (R,7,5) , ",", Format (sampleVar,8,5), " | ");
+	}
+	else
+	{
+	    /* For models with category variables, calculate and output category mean and variance information: */
+		if (rateVarModelChoice==2) /* Nonsynonymous rate variation only */
+		{
+		        GetInformation(NSdistrInfo,d);
+			DD = Columns (NSdistrInfo);
+			for (EE=0; EE<DD; EE=EE+1)
+			{
+				NSdistrInfo[0][EE] = R*NSdistrInfo[0][EE];
+			}
+			
+			EE  = echoCatVar (NSdistrInfo);
+			fprintf (marginalOutFile, NSdistrInfo);
+			
+			fprintf (stdout, " |      N/A      | ", Format (EE,7,5) , ",", Format (Sqrt(sampleVar)/EE,7,5), " | ", Format (EE,7,5) , ",", Format (Sqrt(sampleVar)/EE,8,5), " | ");
+			fprintf (baselineOutput, " |      N/A      | ", Format (EE,7,5) , ",", Format (Sqrt(sampleVar)/EE,7,5), " | ", Format (EE,7,5) , ",", Format (Sqrt(sampleVar)/EE,8,5), " | ");
+		}  
+		else /* Model has synonymous rate variation */
+		{
+		    if (nucSynVar) /*syn3 */
+		    {
+			GetInformation(synDistrInfo,c1); /* for syn3 all 3 category variables are identical, so still only need to call this for one of them */
+		    }
+		    else /* syn1 */
+		    {
+			GetInformation(synDistrInfo,c);
+		    }
+		    fprintf (marginalOutFile, synDistrInfo);
+		    EE  = echoCatVar (synDistrInfo);
+		    synmedian = median;
+		    fprintf (stdout, " | ",Format (Sqrt(sampleVar),13,8)," | ");
+		    fprintf (baselineOutput, " | ",Format (Sqrt(sampleVar),13,8)," | ");
+			
+		    if (rateVarModelChoice>=3) /* Synonymous and nonsynonymous rate variation */
+		    {
+			GetInformation(NSdistrInfo,d);
+			DD = Columns (NSdistrInfo);
+			for (EE=0; EE<DD; EE=EE+1)
+			{
+			    NSdistrInfo[0][EE] = R*NSdistrInfo[0][EE];
+			}
+			fprintf (marginalOutFile, NSdistrInfo);
+			EEN  = echoCatVar (NSdistrInfo);
+			varN = sampleVar;
+			EER  = echoRatio  (NSdistrInfo,synDistrInfo);
+			varR = sampleVar;
+			
+			fprintf (stdout,  Format (EEN,7,5) , ",", Format (Sqrt(varN)/EEN,7,5), " | ",Format (EER,7,5) , ",", Format (Sqrt(varR)/EER,8,5), " | ");	
+			fprintf (baselineOutput, Format (EEN,7,5) , ",", Format (Sqrt(varN)/EEN,7,5), " | ",Format (EER,7,5) , ",", Format (Sqrt(varR)/EER,8,5), " | ");	
+					
+		    }
+		    else /* Proportional model: Nonsynonymous rate variation is just a scaled version of synonymous rate variation. */
+		    {
+			fprintf (stdout, Format (EE*R,7,5) , ",", Format (Sqrt(sampleVar)/EE,7,5), " | ", Format (R,7,5) , ",", Format (0,8,5), " | ");
+			fprintf (baselineOutput, Format (EE*R,7,5) , ",", Format (Sqrt(sampleVar)/EE,7,5), " | ", Format (R,7,5) , ",", Format (0,8,5), " | ");
+		    }
+		}
+	}
+		
+	/* Likelihood ratio tests: */
+	if (modelIndex == 5)
+	{
+	    nullLL = res[1][0];
+	    nullPC = res[1][1];
+	}
+	/* we don't know that alternative returned before null, so we won't print the p-value in the MPI mode: */
+	if ((modelIndex == 6)&&(MPI_NODE_COUNT<=1))
+	{
+	    fprintf (stdout, Format (1-CChi2(2*(res[1][0]-nullLL),res[1][1]-nullPC),9,7), " |");
+	    fprintf (baselineOutput, Format (1-CChi2(2*(res[1][0]-nullLL),res[1][1]-nullPC),9,7), " |");
+	}
+	else
+	{
+	    fprintf (stdout,"   N/A    |");
+	    fprintf (baselineOutput, "   N/A    |");
+	}
+
+	/* Output parameter count and AIC scores: */
+	fprintf (stdout, Format (res[1][1],5,0), "|", Format (2*(res[1][1]-res[1][0]),11,2),"|");
+	fprintf (baselineOutput, Format (res[1][1],5,0), "|", Format (2*(res[1][1]-res[1][0]),11,2),"|");
+	fprintf (stdout, "\n",separator);
+	fprintf (baselineOutput, "\n",separator);
+
+	/* Site-specific posterior analysis: */
+	if (rateVarModelChoice  > 1 && nucSynVar < 2) /* Models with independent nonsynonymous rate variation */
+	{
+	    sigLevel = 0.95;
+	    D = Columns(NSdistrInfo);
+	    for (k=0; k<D; k=k+1)
+	    {
+		if (NSdistrInfo[0][k]>1) break;
+	    }
+	    ConstructCategoryMatrix(site_likelihoods,lf,COMPLETE);
+	    CC = Columns (site_likelihoods);
+	    DD = Rows (site_likelihoods);
+	    /* set up variable order information:
+	       (ordernum[n] is the number of the nth variable in site_likelihoods, 
+	       where omega (d) is variable 0 and c (synRate, for syn1) or 
+	       c1, c2, c3 (for syn3) are variables 1 or 1-3): */
+	    GetInformation (order_ID, lf);
+	    if (rateVarModelChoice < 3)
+	    {
+		ordernum = {{0}};
+		order0 = 0;
+	    } else {
+		if (!nucSynVar) /* syn1 */
+		{
+		    if (order_ID[0] == "d")
+		    {
+			ordernum = {{0,1}}; /* first variable is nonsyn (0), second is syn (1) */
+		    } else {
+			ordernum = {{1,0}}; /* first variable is syn (1), second is nonsyn (0) */
+		    }
+		    order0 = ordernum[0];
+		    order1 = ordernum[1];
+		}
+		else /* syn3 */
+		{
+		    if (multiplicativeNonSynRate)
+		    {
+			ordernum = {1,4};
+			for (posnum = 0; posnum < 4; posnum = posnum+1)
+			{
+			    if (order_ID[posnum] == "d")
+			    {
+				ordernum[posnum] = 0;
+			    }
+			    if (order_ID[posnum] == "c1")
+			    {
+				ordernum[posnum] = 1;
+			    }
+			    if (order_ID[posnum] == "c2")
+			    {
+				ordernum[posnum] = 2;
+			    }
+			    if (order_ID[posnum] == "c3")
+			    {
+				ordernum[posnum] = 3;
+			    }
+			}
+			order0 = ordernum[0];
+			order1 = ordernum[1];
+			order2 = ordernum[2];
+			order3 = ordernum[3];
+		    }
+		    else /* Independent syn3: c2 is not used. */
+		    {
+			ordernum = {1,3};
+			for (posnum = 0; posnum < 3; posnum = posnum+1)
+			{
+			    if (order_ID[posnum] == "d")
+			    {
+				ordernum[posnum] = 0;
+			    }
+			    if (order_ID[posnum] == "c1")
+			    {
+				ordernum[posnum] = 1;
+			    }
+			    if (order_ID[posnum] == "c3")
+			    {
+				ordernum[posnum] = 2;
+			    }
+			}
+			order0 = ordernum[0];
+			order1 = ordernum[1];
+			order2 = ordernum[2];
+		    }
+		}
+	    }
+
+	    if (k<D)
+		/* have rates > 1 */
+	    {
+		fprintf  (marginalOutFile,"\n\n------------------------------------------------\n\n Sites with dN/dS > 1 (Posterior cutoff = ",sigLevel,")\n\n");
+	    }
+	    else
+	    {
+		fprintf  (marginalOutFile,"\n\n------------------------------------------------\n\n No rate classes with dN/dS>1.");
+	    }
+
+	    /* allocate memory for data structures: */
+	    site_posteriors = {DD,CC};
+	    negprobs = {1,CC}; /* vector for storing site-specific negative selection probs */
+	    negsynprobs = {1,CC}; /* vector for storing site-specific negative synonymous selection probs */
+	    negsynprobs_1 = {1,CC};
+	    negsynprobs_2 = {1,CC};
+	    negsynprobs_3 = {1,CC};
+	    omega_marginals = {D,CC};
+	    synrate_marginals = {resp,CC};
+	    synrate_1_marginals = {resp,CC};
+	    synrate_2_marginals = {resp,CC};
+	    synrate_3_marginals = {resp,CC};
+
+	    for (v=0; v<CC; v=v+1) /* loop over sites */
+	    {
+		totProb = 0;
+		positiveProb = 0;
+		negativeProb = 0;
+		negSynProb = 0;
+		negSynProb_1 = 0;
+		negSynProb_2 = 0;
+		negSynProb_3 = 0;
+
+		/* initialise index and dimensions variables: */
+		indexes = {{0, 0, 0, 0}};
+		if (rateVarModelChoice < 3)
+		{
+		    dimensions = {{D}};
+		} 
+		else 
+		{
+		    if (!nucSynVar) /* syn1 */
+		    {
+			dimensions = {{D, resp}};
+		    }
+		    else /* syn3 */
+		    {
+			dimensions = {{D, resp, resp, resp}};
+		    }
+		}   
+
+		/* loop through all category combinations */
+		for (h=0; h<DD; h=h+1) 
+		{
+		    idx0 = indexes[0]; /* index for nonsynonymous rate */
+		    idx1 = indexes[1]; /* index for synonymous rate 1, etc */
+		    idx2 = indexes[2];
+		    idx3 = indexes[3];
+
+		    if (rateVarModelChoice < 3)
+		    {
+			site_posteriors[h][v] = NSdistrInfo[1][h]*site_likelihoods[h][v];
+		    }
+		    else
+		    {
+			if (!nucSynVar) /* syn1 */
+			{
+			    site_posteriors[h][v] = NSdistrInfo[1][idx0]*synDistrInfo[1][idx1]*site_likelihoods[h][v];
+			}
+			else /* syn3 */
+			{
+			    if (multiplicativeNonSynRate)
+			    {
+				site_posteriors[h][v] = NSdistrInfo[1][idx0]*synDistrInfo[1][idx1]*synDistrInfo[1][idx2]*synDistrInfo[1][idx3]*site_likelihoods[h][v];
+			    }
+			    else
+			    {
+				site_posteriors[h][v] = NSdistrInfo[1][idx0]*synDistrInfo[1][idx1]*synDistrInfo[1][idx2]*site_likelihoods[h][v];
+			    }				
+			}
+		    }
+		    totProb = totProb + site_posteriors[h][v]; /* accumulate conditional posteriors, summing to probability of data at this site */
+
+		    /* Accumulate all marginals of interest: */
+		    if (NSdistrInfo[0][idx0]>1) /* positive AA selection category */
+		    {
+			positiveProb = positiveProb + site_posteriors[h][v];
+		    }
+		    if (NSdistrInfo[0][idx0]<1) /* purifying AA selection category */
+		    {
+			negativeProb = negativeProb + site_posteriors[h][v];
+		    }
+		    if (rateVarModelChoice >= 3)
+		    {
+			if (!nucSynVar) /* syn1 */
+			{
+			    if (synDistrInfo[0][idx1]<synmedian) /* purifying nuc-level (synonymous) selection category (whole codon) */
+			    {
+				negSynProb = negSynProb + site_posteriors[h][v];
+			    }
+			    omega_marginals[idx0][v] = omega_marginals[idx0][v] + site_posteriors[h][v];
+			    synrate_marginals[idx1][v] = synrate_marginals[idx1][v] + site_posteriors[h][v];
+			}
+			else /* syn3 */
+			{
+			    if (synDistrInfo[0][idx1]<synmedian) /* purifying nuc-level (synonymous) selection category (position 1) */
+			    {
+				negSynProb_1 = negSynProb_1 + site_posteriors[h][v];
+			    }
+			    if (synDistrInfo[0][idx2]<synmedian) /* purifying nuc-level (synonymous) selection category (position 2) */
+			    {
+				negSynProb_2 = negSynProb_2 + site_posteriors[h][v];
+			    }
+			    if (multiplicativeNonSynRate)
+			    {
+				if (synDistrInfo[0][idx3]<synmedian) /* purifying nuc-level (synonymous) selection category (position 3) */
+				{
+				    negSynProb_3 = negSynProb_3 + site_posteriors[h][v];
+				}
+			    }
+			    omega_marginals[idx0][v] = omega_marginals[idx0][v] + site_posteriors[h][v];
+			    synrate_1_marginals[idx1][v] = synrate_1_marginals[idx1][v] + site_posteriors[h][v];
+			    synrate_2_marginals[idx2][v] = synrate_2_marginals[idx2][v] + site_posteriors[h][v];
+			    if (multiplicativeNonSynRate)
+			    {
+				synrate_3_marginals[idx3][v] = synrate_3_marginals[idx3][v] + site_posteriors[h][v];
+			    }
+			}
+		    }
+
+		    /* keep track of individual category variable indices: */
+		    if (rateVarModelChoice < 3)
+		    {
+			indexes[0] = indexes[0]+1;
+		    } else {
+			if (!nucSynVar) /* syn1 */
+			{
+			    indexes[order1] = indexes[order1]+1; /* increment index for second variable in category matrix */
+			    if (indexes[order1] == dimensions[order1])
+			    {
+				indexes[order1] = 0;
+				indexes[order0] = indexes[order0]+1;
+			    }
+			}
+			else /* syn3 */
+			{
+			    if (multiplicativeNonSynRate)
+			    {
+				indexes[order3] = indexes[order3]+1;
+				if (indexes[order3] == dimensions[order3])
+				{
+				    indexes[order3] = 0;
+				    indexes[order2] = indexes[order2]+1;
+				    if (indexes[order2] == dimensions[order2])
+				    {
+					indexes[order2] = 0;
+					indexes[order1] = indexes[order1]+1;
+					if (indexes[order1] == dimensions[order1])
+					{
+					    indexes[order1] = 0;
+					    indexes[order0] = indexes[order0]+1;
+					}
+				    }
+				}
+			    }
+			    else /* independent syn3: only 3 category variables */
+			    {
+				indexes[order2] = indexes[order2]+1;
+				if (indexes[order2] == dimensions[order2])
+				{
+				    indexes[order2] = 0;
+				    indexes[order1] = indexes[order1]+1;
+				    if (indexes[order1] == dimensions[order1])
+				    {
+					indexes[order1] = 0;
+					indexes[order0] = indexes[order0]+1;
+				    }
+				}
+			    }
+			}
+		    }
+		} /* for h */
+
+		positiveProb = positiveProb/totProb;
+		negprobs[0][v] = negativeProb/totProb;
+		if (rateVarModelChoice >= 3)
+		{
+		    if (!nucSynVar) /* syn1 */
+		    {
+			negsynprobs[0][v] = negSynProb/totProb;
+			for (h = 0; h < D; h=h+1)
+			{
+			    omega_marginals[h][v] = omega_marginals[h][v]/totProb;
+			}
+			for (h = 0; h < resp; h=h+1)
+			{
+			    synrate_marginals[h][v] = synrate_marginals[h][v]/totProb;
+			}
+		    }
+		    else /* syn3 */
+		    {
+			negsynprobs_1[0][v] = negSynProb_1/totProb;
+			negsynprobs_2[0][v] = negSynProb_2/totProb;
+			if (multiplicativeNonSynRate)
+			{
+			    negsynprobs_3[0][v] = negSynProb_3/totProb;
+			}
+			for (h = 0; h < D; h=h+1)
+			{
+			    omega_marginals[h][v] = omega_marginals[h][v]/totProb;
+			}
+			for (h = 0; h < resp; h=h+1)
+			{
+			    synrate_1_marginals[h][v] = synrate_1_marginals[h][v]/totProb;
+			    synrate_2_marginals[h][v] = synrate_2_marginals[h][v]/totProb;
+			    if (multiplicativeNonSynRate)
+			    {
+				synrate_3_marginals[h][v] = synrate_3_marginals[h][v]/totProb;
+			    }
+			}
+		    }
+		}
+
+		for (h=0; h<DD; h=h+1)
+		{
+		    site_posteriors[h][v] = site_posteriors[h][v]/totProb;
+		}
+		if (positiveProb>=sigLevel)
+		{
+		    fprintf (marginalOutFile,Format (v+1,0,0)," (",positiveProb,")\n");
+		}
+	    } /* for v */
+
+	    fprintf  (marginalOutFile,"\n\n------------------------------------------------\n\n Sites with dN/dS < 1 (Posterior cutoff = ",sigLevel,")\n\n");
+	    for (v=0; v<CC; v=v+1)
+	    {
+		if (negprobs[0][v]>=sigLevel)
+		{
+		    fprintf (marginalOutFile,Format (v+1,0,0)," (",negprobs[0][v],")\n");
+		}
+	    }
+
+	    if (rateVarModelChoice >= 3)
+	    {
+		if (!nucSynVar) /* syn1 */
+		{
+		    fprintf  (marginalOutFile,"\n\n------------------------------------------------\n\n Codon sites under purifying synonymous selection (Posterior cutoff = ",sigLevel,")\n\n");
+		    for (v=0; v<CC; v=v+1)
+		    {
+			if (negsynprobs[0][v]>=sigLevel)
+			{
+			    fprintf (marginalOutFile,Format (v+1,0,0)," (",negsynprobs[0][v],")\n");
+			}
+		    }
+		}
+		else /* syn3 */
+		{
+		    fprintf  (marginalOutFile,"\n\n------------------------------------------------\n\n Nucleotide sites under purifying synonymous selection (Posterior cutoff = ",sigLevel,")\n\n");
+		    fprintf  (marginalOutFile,"Position 1:\n\n");
+		    for (v=0; v<CC; v=v+1)
+		    {
+			if (negsynprobs_1[0][v]>=sigLevel)
+			{
+			    fprintf (marginalOutFile,Format (v+1,0,0)," (",negsynprobs_1[0][v],")\n");
+			}
+		    }
+		    if (multiplicativeNonSynRate)
+		    {
+			fprintf  (marginalOutFile,"\nPosition 2:\n\n");
+		    }
+		    else
+		    {
+			fprintf  (marginalOutFile,"\nPosition 3:\n\n");
+		    }
+		    for (v=0; v<CC; v=v+1)
+		    {
+			if (negsynprobs_2[0][v]>=sigLevel)
+			{
+			    fprintf (marginalOutFile,Format (v+1,0,0)," (",negsynprobs_2[0][v],")\n");
+			}
+		    }
+		    if (multiplicativeNonSynRate)
+		    {
+			fprintf  (marginalOutFile,"\nPosition 3:\n\n");
+			for (v=0; v<CC; v=v+1)
+			{
+			    if (negsynprobs_3[0][v]>=sigLevel)
+			    {
+				fprintf (marginalOutFile,Format (v+1,0,0)," (",negsynprobs_3[0][v],")\n");
+			    }
+			}
+		    }
+		}
+	    }
+
+
+/* tabulate posteriors for omega and synRate rate classes */
+
+	    fprintf  (marginalOutFile,"\n\n------------------------------------------------\n\nTabulated Posteriors for Each Site\nSites in Columns, Rate Classes in Rows\nImport the following part into a data processing program\nfor further analysis\n\n");
+	    if (rateVarModelChoice < 3)
+	    {
+		outString = "Omega/Site";
+		for (v=0; v<D; v=v+1)
+		{
+		    outString = outString + "\tOmega=" + NSdistrInfo[0][v];
+		}	
+	    
+		for (v=0; v<CC; v=v+1)
+		{
+		    outString = outString + "\n" + (v+1);
+		    for (h=0; h<D; h=h+1)
+		    {
+			outString = outString + "\t" + site_posteriors[h][v];
+		    }
+		}
+	    }	    
+
+	    if (rateVarModelChoice >= 3)
+	    {
+		outString = "Rates/Site";
+		for (v=0; v<D; v=v+1)
+		{
+		    outString = outString + "\tOmega=" + NSdistrInfo[0][v];
+		}	
+		if (!nucSynVar) /* syn1 */
+		{
+		    for (v=0; v<resp; v=v+1)
+		    {
+			outString = outString + "\tS=" + synDistrInfo[0][v];
+		    }	
+		    
+		    for (v=0; v<CC; v=v+1)
+		    {
+			outString = outString + "\n" + (v+1);
+			for (h=0; h<D; h=h+1)
+			{
+			    outString = outString + "\t" + omega_marginals[h][v];
+			}
+			for (h=0; h<resp; h=h+1)
+			{
+			    outString = outString + "\t" + synrate_marginals[h][v];
+			}
+		    }
+		}
+		else /* syn3 */
+		{
+		    for (v=0; v<resp; v=v+1)
+		    {
+			outString = outString + "\tS_pos1=" + synDistrInfo[0][v];
+		    }	
+		    if (multiplicativeNonSynRate)
+		    {
+			for (v=0; v<resp; v=v+1)
+			{
+			    outString = outString + "\tS_pos2=" + synDistrInfo[0][v];
+			}	
+		    }
+		    for (v=0; v<resp; v=v+1)
+		    {
+			outString = outString + "\tS_pos3=" + synDistrInfo[0][v];
+		    }	
+	    
+		    for (v=0; v<CC; v=v+1)
+		    {
+			outString = outString + "\n" + (v+1);
+			for (h=0; h<D; h=h+1)
+			{
+			    outString = outString + "\t" + omega_marginals[h][v];
+			}
+			for (h=0; h<resp; h=h+1)
+			{
+			    outString = outString + "\t" + synrate_1_marginals[h][v];
+			}
+			for (h=0; h<resp; h=h+1)
+			{
+			    outString = outString + "\t" + synrate_2_marginals[h][v];
+			}
+			if (multiplicativeNonSynRate)
+			{
+			    for (h=0; h<resp; h=h+1)
+			    {
+				outString = outString + "\t" + synrate_3_marginals[h][v];
+			    }
+			}
+		    }
+		}
+	    }	    
+	    fprintf  (marginalOutFile,"\n", outString,"\n");
+
+	    site_posteriors = 0;
+	} /* if rateVarModelChoice */
+	
+	return fromNode-1;
+}
diff --git a/res/TemplateBatchFiles/PairwiseDNDS.bf b/res/TemplateBatchFiles/PairwiseDNDS.bf
new file mode 100644
index 0000000..e69de29
diff --git a/res/TemplateBatchFiles/PairwiseRelativeRate.bf b/res/TemplateBatchFiles/PairwiseRelativeRate.bf
new file mode 100644
index 0000000..1143f88
--- /dev/null
+++ b/res/TemplateBatchFiles/PairwiseRelativeRate.bf
@@ -0,0 +1,331 @@
+ALLOW_SEQUENCE_MISMATCH = 1;
+VERBOSITY_LEVEL = -1;
+
+fprintf(stdout,"\n ---- RUNNING PAIRWISE RELATIVE RATE ANALYSIS ---- \n");
+
+ChoiceList (dataType,"Data type",1,SKIP_NONE,"Nucleotide/Protein","Nucleotide or amino-acid (protein).",
+				     "Codon","Codon (several available genetic codes).");
+
+if (dataType<0) 
+{
+	return;
+}
+
+if (dataType)
+{
+	NICETY_LEVEL = 3;
+	SetDialogPrompt ("Please choose a codon data file:");
+	#include "TemplateModels/chooseGeneticCode.def";
+}
+else
+{
+	SetDialogPrompt ("Please choose a nucleotide or amino-acid data file:");
+}
+
+speciesCount = 0;
+
+if ((OPTIMIZATION_PRECISION==0)||(OPTIMIZATION_PRECISION>0.001))
+{
+	OPTIMIZATION_PRECISION = 0.001;
+}
+
+while (speciesCount < 3)
+{
+	SetDialogPrompt ("Choose a data file with 3 or more sequences");
+	DataSet ds = ReadDataFile (PROMPT_FOR_FILE);
+	speciesCount = ds.species;
+}
+
+ChoiceList (thirdSpec,"Choose the outgroup:",1,SKIP_NONE,ds);
+
+if (thirdSpec<0)
+{
+	return;
+}
+
+GetString (outgroupName,ds,thirdSpec);
+
+if (dataType)
+{
+	DataSetFilter filteredData = CreateFilter (ds,3);
+}
+else
+{
+	DataSetFilter filteredData = CreateFilter (ds,1);
+}
+
+SelectTemplateModel(filteredData);
+
+relationString = ":=";
+
+#include "selectModelParameters.bf";
+
+SetDialogPrompt ("Save full results to:");
+
+modelParameterCount = Rows("LAST_MODEL_PARAMETER_LIST");
+
+fprintf (PROMPT_FOR_FILE,CLEAR_FILE);
+
+MESSAGE_LOGGING = 0;
+
+maxLength = 0;
+
+
+for (firstSpec = 0; firstSpec < speciesCount; firstSpec = firstSpec+1)
+{
+	GetString (firstName,ds,firstSpec);
+
+	tLength = Abs(outgroupName)+Abs(firstName);
+	
+	for (secondSpec = firstSpec+1; secondSpec < speciesCount; secondSpec = secondSpec+1)
+	{
+		GetString (secondName,ds,secondSpec);
+		tLength2 = tLength + Abs (secondName) + 30;
+		if (tLength2>maxLength)
+		{
+			maxLength = tLength2;
+		}
+	}
+}
+
+maxLength = maxLength+6;
+fprintf(stdout,"\n\n In the summary table below, branch lengths denote");
+
+if (parameter2Constrain)
+{
+	fprintf (stdout," the value of parameter ", funnyString, " for that branch.");
+}
+else
+{
+	fprintf (stdout," the expected number of substituions per that branch.");
+}
+
+fprintf (stdout,"\n\n (*)   corresponds to the .05 significance level\n (**)  corresponds to the .01 significance level\n (***) corresponds to the .001 significance level.\n\n");
+
+fprintf (stdout,"\n\n  Taxa Triplet");
+
+for (tLength = 15; tLength<maxLength; tLength=tLength+1)
+{
+	fprintf (stdout," ");
+}
+
+fprintf (stdout,"      LRT        P-Value \n");
+
+separatorString = "-";
+
+for (tLength = 0; tLength<=maxLength; tLength=tLength+1)
+{
+	separatorString = separatorString + "-";
+}
+
+separatorString = separatorString + "+";
+
+for (tLength = 0; tLength<12; tLength=tLength+1)
+{
+	separatorString = separatorString + "-";
+}
+
+separatorString = separatorString + "+";
+
+for (tLength = 0; tLength<12; tLength=tLength+1)
+{
+	separatorString = separatorString + "-";
+}
+
+
+
+tLength2 = 0;
+
+for (firstSpec = 0; firstSpec < speciesCount; firstSpec = firstSpec+1)
+{
+
+	if (firstSpec == thirdSpec)
+	{
+		continue;
+	}
+	
+	fprintf (stdout,separatorString);
+
+	GetString (firstName,ds,firstSpec);
+	
+	for (secondSpec = firstSpec+1; secondSpec < speciesCount; secondSpec = secondSpec+1)
+	{
+		if (secondSpec == thirdSpec)
+		{
+			continue;
+		}
+		
+		if (dataType)
+		{
+			DataSetFilter filteredData = CreateFilter (ds,3,"",(speciesIndex==firstSpec)||(speciesIndex==secondSpec)||(speciesIndex==thirdSpec),GeneticCodeExclusions);
+		}
+		else
+		{
+			DataSetFilter filteredData = CreateFilter (ds,1,"",(speciesIndex==firstSpec)||(speciesIndex==secondSpec)||(speciesIndex==thirdSpec));
+		}
+
+		HarvestFrequencies (rrEFV,filteredData,1,1,1);
+		
+		if (FREQUENCY_SENSITIVE)
+		{
+			rrModelMatrix = 0;
+			if (USE_POSITION_SPECIFIC_FREQS)
+			{
+				HarvestFrequencies (vectorOfFrequencies,filteredData,3,1,1);
+			}
+			MULTIPLY_BY_FREQS = PopulateModelMatrix ("rrModelMatrix",rrEFV);
+			if (dataType)
+			{
+				rrCodonEFV = BuildCodonFrequencies (rrEFV);
+				Model rrModel = (rrModelMatrix,rrCodonEFV,MULTIPLY_BY_FREQS);	
+			}
+			else
+			{
+				Model rrModel = (rrModelMatrix,rrEFV,MULTIPLY_BY_FREQS);
+			}	
+		}
+		
+		if ((firstSpec<thirdSpec)&&(secondSpec<thirdSpec))
+		{
+			treeString = "(FirstSpecies,SecondSpecies,OutGroup)";
+			i1 = 0;
+			i2 = 1;
+			i3 = 2;
+		}
+		else
+		{
+			if ((firstSpec>thirdSpec)&&(secondSpec>thirdSpec))
+			{
+				treeString = "(OutGroup,FirstSpecies,SecondSpecies)";
+				i1 = 1;
+				i2 = 2;
+				i3 = 0;
+			}
+			else
+			{
+				treeString = "(FirstSpecies,OutGroup,SecondSpecies)";
+				i1 = 0;
+				i2 = 2;
+				i3 = 1;
+			}
+		}
+
+		Tree threeTaxaTree = treeString;
+
+		LikelihoodFunction lf = (filteredData,threeTaxaTree);
+
+		Optimize (res,lf);
+
+		Tree constrained3TaxaTree = treeString;
+
+		/* now specify the constraint */
+
+		LikelihoodFunction lfConstrained = (filteredData,constrained3TaxaTree);
+
+		ReplicateConstraint (constraintString,constrained3TaxaTree.FirstSpecies, constrained3TaxaTree.SecondSpecies);
+
+		Optimize (res1,lfConstrained);
+
+		lnLikDiff = -2(res1[1][0]-res[1][0]);
+
+		degFDiff = res[1][1]-res1[1][1];
+		
+		if (lnLikDiff>0)
+		{
+			pValue = 1.0-CChi2(lnLikDiff,degFDiff);
+		}
+		else
+		{
+			pValue = 1;
+			fprintf (MESSAGE_LOG,"\nA negative LRT statistic encoutered. You may want to increase the optimization precision settings to resolve numerical apporximation errors");
+		}
+
+		GetString (secondName,ds,secondSpec);
+		
+		if (parameter2Constrain==0)
+		{
+			b_out = BranchLength(threeTaxaTree,i3);
+			b_1 = BranchLength(threeTaxaTree,i1);
+			b_2 = BranchLength(threeTaxaTree,i2);
+		}
+		else
+		{
+			b_out = res[0][modelParameterCount*i3+parameter2Constrain-1];
+			b_1 = res[0][modelParameterCount*i1+parameter2Constrain-1];
+			b_2 = res[0][modelParameterCount*i2+parameter2Constrain-1];
+		}
+		
+		printTreeString = "("+outgroupName+":"+b_out+",("
+		+firstName+":"+b_1+","+secondName+":"+b_2+"))";
+
+		fprintf (stdout, "\n", printTreeString);
+		
+		for (tLength=Abs(printTreeString);tLength<maxLength;tLength=tLength+1)
+		{
+			fprintf (stdout," ");
+		}
+		
+		fprintf (stdout, "  | ", Format(lnLikDiff,9,4),"  | ", pValue );
+		
+		if (pValue<0.05)
+		{
+			if (pValue<0.01)
+			{
+				if (pValue<0.001)
+				{
+				    fprintf (stdout," (***) ");
+				}
+				else
+				{
+			     	fprintf (stdout," (**) ");
+			    }
+			}
+			else
+			{
+			     fprintf (stdout," (*) ");			
+			}
+		}
+		if (!tLength2)
+		{
+			tLength2 = 1;
+			dataDimension = Columns(res);
+			fprintf (LAST_FILE_PATH,",,,Unconstrained Optimizations");
+			for (i=0;i<dataDimension;i=i+1)
+			{
+				fprintf	  (LAST_FILE_PATH,", ");
+			}
+			fprintf (LAST_FILE_PATH,"Constrained Optimizations");
+			for (i=0;i<dataDimension;i=i+1)
+			{
+				fprintf	  (LAST_FILE_PATH,", ");
+			}
+			fprintf (LAST_FILE_PATH,"\nOutgroup,Taxon 1,Taxon 2,Ln-likelihood");
+			for (i=0;i<dataDimension;i=i+1)
+			{
+				GetString (argName,lf,i);
+				fprintf	  (LAST_FILE_PATH,",",argName);
+			}
+			fprintf (LAST_FILE_PATH,",Ln-likelihood");
+			for (i=0;i<dataDimension;i=i+1)
+			{
+				GetString (argName,lfConstrained,i);
+				fprintf	  (LAST_FILE_PATH,",",argName);
+			}	
+			fprintf (LAST_FILE_PATH,",LR,P-Value");
+		}	
+		fprintf (LAST_FILE_PATH,"\n",outgroupName,",",firstName,",",secondName,",",res[1][0]);
+		for (i=0;i<dataDimension;i=i+1)
+		{
+			fprintf (LAST_FILE_PATH,",",res[0][i]);
+		}
+		fprintf (LAST_FILE_PATH,",",res1[1][0]);
+		for (i=0;i<dataDimension;i=i+1)
+		{
+			fprintf (LAST_FILE_PATH,",",res1[0][i]);
+		}
+		fprintf (LAST_FILE_PATH,",",lnLikDiff ,",",pValue);
+	}
+	fprintf (stdout,"\n");
+}
+
+MESSAGE_LOGGING = 1;
diff --git a/res/TemplateBatchFiles/PairwiseRelativeRatio.bf b/res/TemplateBatchFiles/PairwiseRelativeRatio.bf
new file mode 100644
index 0000000..0e4746d
--- /dev/null
+++ b/res/TemplateBatchFiles/PairwiseRelativeRatio.bf
@@ -0,0 +1,373 @@
+fprintf(stdout,"\n ---- RUNNING PAIRWISE RELATIVE RATIO ANALYSIS ---- \n");
+
+ChoiceList (dataType,"Data type",1,SKIP_NONE,"Nucleotide/Protein","Nucleotide or amino-acid (protein).",
+				     "Codon","Codon (several available genetic codes).");
+
+if (dataType<0) 
+{
+	return;
+}
+
+if (dataType)
+{
+	NICETY_LEVEL = 3;
+	ChoiceList (codeTables,"Genetic Code",1,SKIP_NONE,"Same Code","All files use the same genetic code. The index file contains file names only. ",
+				     	"Different Codes","Each file name line in the index file is followed by a line with a HYPHY genetic table index. See Help for details.");
+	if (codeTables<0)
+	{
+		return;
+	}
+	if (codeTables>0)
+	{
+		skipCodeSelectionStep = 1;
+	}
+	#include "TemplateModels/chooseGeneticCode.def";
+}
+
+#include "readIndexFile.bf";
+
+fileCount = Rows(stringMatrix);
+
+if (fileCount<=1)
+{
+	fprintf (stdout,"\n\n\n****** EMPTY INDEX FILE - NOTHING TO DO! **********\n\n\n");
+	return;
+}
+
+/* read the first file */
+
+DataSet ds = ReadDataFile (stringMatrix[0]);
+
+referenceSpecCount = ds.species;
+
+treeRead = 0;
+
+if (IS_TREE_PRESENT_IN_DATA)
+{
+	treeString = DATAFILE_TREE;
+	treeRead = 1;
+}
+
+fprintf(stdout,"\n File 1:",stringMatrix[0]," - ", Format (ds.species,0,0)," sequences, ", Format (ds.sites,0,0)," sites.");
+
+for (counter = 1; counter<fileCount; counter = counter+1)
+{
+	DataSet ds2 = ReadDataFile (stringMatrix[counter]);
+	if (ds2.species!=referenceSpecCount)
+	{
+		fprintf (stdout,"\n\n\n****** SEQUENCE COUNT MISMATCH **********\n");
+		fprintf (stdout,"\n\n File ",stringMatrix[counter]," had ",Format(ds2.species,0,0)," sequences, whereas ",Format(referenceSpecCount,0,0)," were expected.\n\n\n");
+		return;
+	}
+	fprintf(stdout,"\n File ",Format(counter+1,0,0),":",stringMatrix[counter]," - ", Format (ds2.species,0,0)," sequences, ", Format (ds2.sites,0,0)," sites.");
+	if (!treeRead)
+	{
+		if (IS_TREE_PRESENT_IN_DATA)
+		{
+			treeString = DATAFILE_TREE;
+			treeRead = 1;
+		}
+	}
+}
+
+fprintf (stdout,"\n\n** All data files were read successfully **\n\n");
+
+if (dataType)
+{
+	if (codeTables)
+	{
+		dummy = ApplyGeneticCodeTable (codeTableMatrix[0]);
+		ModelMatrixDimension = 0;
+	}
+	DataSetFilter filteredData = CreateFilter (ds,3,"","",GeneticCodeExclusions);
+}
+else
+{
+	DataSetFilter filteredData = CreateFilter (ds,1);
+}
+
+
+if (treeRead)
+{
+	fprintf (stdout, "\n\nA tree was found in the data file:\n",treeString,"\n\nWould you like to use it:(Y/N)?");
+	fscanf (stdin, "String", response);
+	if ((response=="n")||(response=="N"))
+	{
+		treeRead = 0;
+	}
+	fprintf (stdout, "\n\n");
+}
+
+if (!treeRead)
+{
+	SetDialogPrompt ("Please select a tree file for the data:");
+	fscanf (PROMPT_FOR_FILE, "String", treeString);	
+}
+
+SelectTemplateModel(filteredData);
+
+global  RelRatio;
+
+relationString = ":=RelRatio*";
+
+#include "selectModelParameters.bf";
+
+SetDialogPrompt ("Save full results to:");
+
+modelParameterCount = Rows("LAST_MODEL_PARAMETER_LIST");
+
+fprintf (PROMPT_FOR_FILE,CLEAR_FILE);
+
+tabulatedFileName = LAST_FILE_PATH;
+
+
+singleFileResults = {fileCount,1};
+
+fprintf (stdout,"\n\n***** RUNNING SINGLE FILE ANALYSES *****\n\n");
+
+fullParameterCount = 0;
+
+/*MESSAGE_LOGGING = 0;*/
+
+OPTIMIZATION_PRECISION = OPTIMIZATION_PRECISION/10;
+
+timer = Time(0);
+
+for (counter = 1; counter<= fileCount; counter = counter+1)
+{
+	HarvestFrequencies (vectorOfFrequencies,filteredData,1,1,1);
+	/*fprintf (stdout,"\n",GeneticCodeExclusions,"\n",_Genetic_Code,"\n");*/
+	if (FREQUENCY_SENSITIVE)
+	{
+		modelMatrix = 0;
+		if (USE_POSITION_SPECIFIC_FREQS)
+		{
+			HarvestFrequencies (vectorOfFrequencies,filteredData,3,1,1);
+		}
+		MULTIPLY_BY_FREQS = PopulateModelMatrix ("modelMatrix",vectorOfFrequencies);
+		if (dataType)
+		{
+			CodonEFV = BuildCodonFrequencies (vectorOfFrequencies);
+			Model RRmodel = (modelMatrix,CodonEFV,MULTIPLY_BY_FREQS);
+		}
+		else
+		{
+			Model RRmodel = (modelMatrix,vectorOfFrequencies,MULTIPLY_BY_FREQS);
+		}	
+	}	
+	Tree firstFileTree = treeString;
+	
+	LikelihoodFunction lf = (filteredData,firstFileTree);
+	Optimize (res,lf);
+
+	if (counter<fileCount)
+	{
+		DataSet ds = ReadDataFile (stringMatrix[counter]);
+		if (dataType)
+		{
+			if (codeTables)
+			{
+				dummy = ApplyGeneticCodeTable (codeTableMatrix[counter]);
+				ModelMatrixDimension = 0;
+			}
+			DataSetFilter filteredData = CreateFilter (ds,3,"","",GeneticCodeExclusions);
+		}
+		else
+		{
+			DataSetFilter filteredData = CreateFilter (ds,1);
+		}	
+	}
+	else
+	{
+		fullParameterCount = res[1][1];
+	}
+	singleFileResults [counter-1] = res[1][0];
+	fprintf (stdout,"\nFile ",stringMatrix[counter-1]," : ln-likelihood = ",res[1][0]);
+	if (counter==1)
+	{
+		if (codeTables)
+		{
+			fprintf (tabulatedFileName,"\n\nSingle File Results\n\nFile Number,File Path,Code Table,Ln-Likelihood");
+		}		
+		else
+		{
+			fprintf (tabulatedFileName,"\n\nSingle File Results\n\nFile Number,File Path,Ln-Likelihood");
+		}
+		dataDimension = Columns(res);
+		for (counter3 = 0; counter3 < dataDimension; counter3=counter3+1)
+		{
+			GetString (thisLine,lf,counter3);
+			fprintf (tabulatedFileName,",",thisLine);
+		}
+	}
+	
+	if (codeTables)
+	{
+		fprintf (tabulatedFileName,"\n",Format(counter,0,0),",",stringMatrix[counter-1],",",Format(codeTableMatrix[counter-1],0,0),",",res[1][0]);	
+	}
+	else
+	{
+		fprintf (tabulatedFileName,"\n",Format(counter,0,0),",",stringMatrix[counter-1],",",res[1][0]);	
+	}
+	for (counter3 = 0; counter3 < dataDimension; counter3=counter3+1)
+	{
+		fprintf (tabulatedFileName,",",res[0][counter3]);
+	}
+}
+
+/*OPTIMIZATION_PRECISION = OPTIMIZATION_PRECISION*10;*/
+
+timer = (Time(0)-timer)/fileCount;
+
+counter = fileCount*(fileCount+1)/2;
+
+fprintf (stdout,"\n\n***** RUNNING PAIRWISE CONSTRAINED ANALYSES (",Format(counter,0,0), " PAIR) *****\n");
+
+timer = counter*timer*2.5;
+
+fprintf (stdout,"\n***** ESTIMATED TIME TO COMPLETE ALL ANALYSES: ",Format(timer$3600,0,0)," hours, ",Format((timer%3600)$60+1,0,0), " minutes. *****\n\n");
+
+fprintf(stdout,"\n\n In the summary table below");
+
+fprintf (stdout,"\n\n (*)   corresponds to the .05 significance level\n (**)  corresponds to the .01 significance level\n (***) corresponds to the .001 significance level.\n\n");
+
+separator = "+--------+--------+--------------+--------------+";
+fprintf (stdout,separator,"\n| File 1 | File 2 |      LRT     |    P-Value   |\n",separator);
+for (counter = 0; counter< fileCount; counter = counter+1)
+{
+	DataSet ds = ReadDataFile (stringMatrix[counter]);
+	if (dataType)
+	{
+		if (codeTables)
+		{
+			dummy = ApplyGeneticCodeTable (codeTableMatrix[counter]);
+			ModelMatrixDimension = 0;
+		}
+		DataSetFilter filteredData = CreateFilter (ds,3,"","",GeneticCodeExclusions);
+	}
+	else
+	{
+		DataSetFilter filteredData = CreateFilter (ds,1);
+	}		
+	HarvestFrequencies (vectorOfFrequencies,filteredData,1,1,1);
+	if (FREQUENCY_SENSITIVE)
+	{
+		modelMatrix = 0;
+		if (USE_POSITION_SPECIFIC_FREQS)
+		{
+			HarvestFrequencies (vectorOfFrequencies,filteredData,3,1,1);
+		}
+		MULTIPLY_BY_FREQS = PopulateModelMatrix ("modelMatrix",vectorOfFrequencies);
+		if (dataType)
+		{
+			CodonEFV = BuildCodonFrequencies (vectorOfFrequencies);
+			Model RRmodel = (modelMatrix,CodonEFV,MULTIPLY_BY_FREQS);
+		}
+		else
+		{
+			Model RRmodel = (modelMatrix,vectorOfFrequencies,MULTIPLY_BY_FREQS);
+		}	
+	}	
+	Tree firstFileTree = treeString;
+	for (counter2 = counter+1; counter2< fileCount; counter2 = counter2+1)
+	{
+		fprintf (stdout,"\n| ",Format (counter+1,6,0)," | ", Format (counter2+1,6,0));
+		DataSet ds2 = ReadDataFile (stringMatrix[counter2]);
+		if (dataType)
+		{
+			if (codeTables)
+			{
+				dummy = ApplyGeneticCodeTable (codeTableMatrix[counter2]);
+				ModelMatrixDimension = 0;
+			}
+			DataSetFilter filteredData2 = CreateFilter (ds2,3,"","",GeneticCodeExclusions);
+		}
+		else
+		{
+			DataSetFilter filteredData2 = CreateFilter (ds2,1);
+		}		
+		HarvestFrequencies (vectorOfFrequencies2,filteredData2,1,1,1);
+		if (FREQUENCY_SENSITIVE)
+		{
+			modelMatrix2 = 0;
+			if (USE_POSITION_SPECIFIC_FREQS)
+			{
+				HarvestFrequencies (vectorOfFrequencies2,filteredData2,3,1,1);
+			}
+			MULTIPLY_BY_FREQS = PopulateModelMatrix ("modelMatrix2",vectorOfFrequencies2);
+			if (dataType)
+			{
+				CodonEFV2 = BuildCodonFrequencies (vectorOfFrequencies2);
+				Model RRmodel2 = (modelMatrix2,CodonEFV2,MULTIPLY_BY_FREQS);
+			}
+			else
+			{
+				Model RRmodel2 = (modelMatrix2,vectorOfFrequencies2,MULTIPLY_BY_FREQS);
+			}	
+		}	
+		
+		Tree secondFileTree = treeString;	
+			
+		ReplicateConstraint (constraintString,secondFileTree,firstFileTree);
+
+		LikelihoodFunction lfConstrained = (filteredData2,secondFileTree,filteredData,firstFileTree);
+		
+		Optimize (res1,lfConstrained);
+			
+		LRT = 2*(singleFileResults[counter]+singleFileResults[counter2]-res1[1][0]);
+
+		degFDiff = 2*fullParameterCount-res1[1][1];
+		
+		if (LRT>0)
+		{
+			pValue = 1.0-CChi2(LRT,degFDiff);
+		}
+		else
+		{
+			pValue = 1;
+			fprintf (MESSAGE_LOG,"\nA negative LRT statistic encoutered. You may want to increase the optimization precision settings to resolve numerical apporximation errors");
+		}
+		
+		fprintf (stdout," | ",Format (LRT,12,5)," | ", Format (pValue,12,8)," |");	
+		
+		if (pValue<0.05)
+		{
+			if (pValue<0.01)
+			{
+				if (pValue<0.001)
+				{
+				    fprintf (stdout," (***) ");
+				}
+				else
+				{
+			     	fprintf (stdout," (**) ");
+			    }
+			}
+			else
+			{
+			     fprintf (stdout," (*) ");			
+			}
+		}
+		
+		if ((counter==0)&&(counter2==1))
+		{
+			fprintf (tabulatedFileName,"\n\nRelative Ratio Tests\n\nFile 1,File 2,Ln-Likelihood,LRT,pValue");
+			dataDimension = Columns(res1);
+			for (counter3 = 0; counter3 < dataDimension; counter3=counter3+1)
+			{
+				GetString (thisLine,lfConstrained,counter3);
+				fprintf (tabulatedFileName,",",thisLine);
+			}
+		}
+		
+		fprintf (tabulatedFileName,"\n",Format(counter+1,0,0),",",Format(counter2+1,0,0),",",res1[1][0],",",LRT,",",pValue);
+		for (counter3 = 0; counter3 < dataDimension; counter3=counter3+1)
+		{
+			fprintf (tabulatedFileName,",",res1[0][counter3]);
+		}
+	}
+}
+
+fprintf (stdout,"\n",separator,"\n");
+
+MESSAGE_LOGGING = 1;
diff --git a/res/TemplateBatchFiles/PairwiseSiteDiversity.bf b/res/TemplateBatchFiles/PairwiseSiteDiversity.bf
new file mode 100644
index 0000000..7eddbdf
--- /dev/null
+++ b/res/TemplateBatchFiles/PairwiseSiteDiversity.bf
@@ -0,0 +1,202 @@
+distanceChoice = 0;
+
+ChoiceList (dataType,"Data type",1,SKIP_NONE,"Nucleotide/Protein","Nucleotide or amino-acid (protein).",
+				     "Codon","Codon (several available genetic codes).");
+
+if (dataType<0) 
+{
+	return;
+}
+
+if (dataType)
+{
+	NICETY_LEVEL = 3;
+	SetDialogPrompt ("Please choose a codon data file:");
+	#include "TemplateModels/chooseGeneticCode.def";
+}
+else
+{
+	SetDialogPrompt ("Please choose a nucleotide or amino-acid data file:");
+}
+
+
+DataSet ds = ReadDataFile (PROMPT_FOR_FILE);
+
+if (dataType)
+{
+	DataSetFilter fullData 	   = CreateFilter (ds,3,"","",GeneticCodeExclusions);
+	DataSetFilter filteredData = CreateFilter (ds,3,"","",GeneticCodeExclusions);
+}
+else
+{
+	DataSetFilter fullData = CreateFilter (ds,1);
+	DataSetFilter filteredData = CreateFilter (ds,1);
+}
+
+sampleCount = 0;
+
+while (sampleCount < 2)
+{
+	fprintf (stdout,"\nHow many samples are there in the data file(>=2)?");
+	fscanf  (stdin, "Number", sampleCount);
+}
+
+sampleSize = {sampleCount, 1};
+
+samplesDone  = 0;
+totalSamples = 0;
+
+while (samplesDone < sampleCount-1)
+{
+	thisSample = 0;
+	while (thisSample <= 0)
+	{
+		fprintf (stdout,"\nHow many sequences are in sample ", samplesDone+1, " (between 1 and ", ds.species-totalSamples,")?");
+		fscanf  (stdin, "Number", thisSample);
+	}
+	sampleSize [samplesDone] = thisSample;
+	totalSamples = totalSamples + thisSample;
+	samplesDone= samplesDone + 1;
+}
+
+sampleSize [samplesDone] = ds.species-totalSamples;
+
+fprintf (stdout,"\n\nUsing these sample sizes:\n");
+
+for (samplesDone = 0; samplesDone < sampleCount; samplesDone = samplesDone + 1)
+{
+	fprintf (stdout, "Sample ", samplesDone + 1, " : ", sampleSize [samplesDone], "\n");
+}
+
+DISTANCE_PROMPTS = 1;
+
+withinSampleDiversity = {sampleCount, fullData.sites};
+
+#include "chooseDistanceFormula.def";
+
+fprintf (stdout, "\n\nComputing within sample site-by-site diversities\n\n");
+
+firstSequence = 0;
+
+dummy = InitializeDistances (0);
+
+for (samplesDone = 0; samplesDone < sampleCount; samplesDone = samplesDone + 1)
+{
+	fprintf (stdout, "\nProcessing sample ", samplesDone+1, "\n");
+
+	seqCount     = sampleSize[samplesDone];
+	lastSequence = firstSequence + seqCount;
+	
+	for (sitesDone = 0; sitesDone < fullData.sites; sitesDone = sitesDone + 1)
+	{
+		meanDistance = 0;
+		seqFilter  = ""+(firstSequence)+"-"+(lastSequence-1);
+		
+		if (dataType)
+		{
+			siteFilter = ""+(3*sitesDone)+"-"+(3*sitesDone+2);
+			DataSetFilter filteredData = CreateFilter (ds,3,siteFilter,seqFilter,GeneticCodeExclusions);
+		}
+		else
+		{
+			siteFilter = ""+sitesDone;
+			DataSetFilter filteredData = CreateFilter (ds,1,siteFilter,seqFilter);
+		}
+		
+		for (sequence1 = 0; sequence1 < seqCount-1; sequence1 = sequence1 + 1)
+		{
+			for (sequence2 = sequence1 + 1; sequence2 < seqCount; sequence2 = sequence2 + 1)
+			{
+				meanDistance = meanDistance + ComputeDistanceFormula (sequence1, sequence2);
+			}
+		}
+		
+		withinSampleDiversity [samplesDone][sitesDone] = 2*meanDistance/seqCount/(seqCount-1);
+		/*fprintf (stdout, "\nSite ", Format (sitesDone+1,5,0), ":", Format (withinSampleDiversity [samplesDone][sitesDone],8,4));*/
+	}
+	
+	firstSequence = lastSequence;
+}
+
+
+fprintf (stdout, "\n\nComputing between sample site-by-site diversities\n\n");
+
+firstSequence = 0;
+
+betweenSampleDiversity = {sampleCount*(sampleCount-1)/2, fullData.sites};
+
+pComp = 0;
+
+for (samplesDone = 0; samplesDone < sampleCount-1; samplesDone = samplesDone + 1)
+{
+	firstSequence2  = firstSequence;
+	seqCount 	    = sampleSize[samplesDone];
+	lastSequence    = firstSequence + seqCount;
+	firstSequence2  = lastSequence;
+
+	for (samplesDone2 = samplesDone+1; samplesDone2 < sampleCount; samplesDone2 = samplesDone2 + 1)
+	{
+		seqCount2 	   = sampleSize[samplesDone2];
+		lastSequence2  = firstSequence2 + seqCount2;
+		
+		fprintf (stdout, "\nProcessing samples ", samplesDone+1, " and ", samplesDone2 +1 ,"\n");
+
+		lastSequence = firstSequence + seqCount;
+		
+		for (sitesDone = 0; sitesDone < fullData.sites; sitesDone = sitesDone + 1)
+		{
+			meanDistance = 0;
+			seqFilter  = ""+(firstSequence)+"-"+(lastSequence-1)+","+(firstSequence2)+"-"+(lastSequence2-1);
+			
+			if (dataType)
+			{
+				siteFilter = ""+(3*sitesDone)+"-"+(3*sitesDone+2);
+				DataSetFilter filteredData = CreateFilter (ds,3,siteFilter,seqFilter,GeneticCodeExclusions);
+			}
+			else
+			{
+				siteFilter = ""+sitesDone;
+				DataSetFilter filteredData = CreateFilter (ds,1,siteFilter,seqFilter);
+			}
+			
+			for (sequence1 = 0; sequence1 < seqCount; sequence1 = sequence1 + 1)
+			{
+				for (sequence2 = seqCount; sequence2 < seqCount+seqCount2; sequence2 = sequence2 + 1)
+				{
+					meanDistance = meanDistance + ComputeDistanceFormula (sequence1, sequence2);
+				}
+			}
+			
+			betweenSampleDiversity [pComp][sitesDone] = meanDistance/seqCount/seqCount2;
+		}
+		firstSequence2 = lastSequence2;
+		pComp = pComp+1;
+	}
+	firstSequence = lastSequence;
+}
+
+fprintf (stdout, "\n\nGenerating Results\n\n");
+
+pComp = 0;
+
+outString = "";
+p = outString*256000;
+p = outString*"Sample1\tSample2\tSize1\tSize2\tCodon\tDiv1\tDiv2\tDivBetween\n";
+
+for (samplesDone = 0; samplesDone < sampleCount-1; samplesDone = samplesDone + 1)
+{
+	for (samplesDone2 = samplesDone+1; samplesDone2 < sampleCount; samplesDone2 = samplesDone2 + 1)	
+	{
+		for (codonCount=0; codonCount < fullData.sites; codonCount = codonCount + 1)
+		{
+			p=outString*(""+(samplesDone+1)+"\t"+(samplesDone2+1)+"\t"+sampleSize[samplesDone]+"\t"+sampleSize[samplesDone2]+"\t"+(codonCount+1)+"\t"+
+							 withinSampleDiversity[samplesDone][codonCount]+"\t"+withinSampleDiversity[samplesDone2][codonCount]+"\t"+betweenSampleDiversity[pComp][codonCount]+"\n");
+		}
+		pComp = pComp+1;
+	}
+	p=outString*"\n";
+}
+
+p = outString*0;
+SetDialogPrompt ("Write results to:");
+fprintf (PROMPT_FOR_FILE,CLEAR_FILE,outString);
diff --git a/res/TemplateBatchFiles/PartitionDataFile.bf b/res/TemplateBatchFiles/PartitionDataFile.bf
new file mode 100644
index 0000000..b97004c
--- /dev/null
+++ b/res/TemplateBatchFiles/PartitionDataFile.bf
@@ -0,0 +1,45 @@
+SetDialogPrompt ("Please choose a data file to partition:");
+
+ChoiceList (SKIP_OMISSIONS,"Deletions",1,SKIP_NONE,"Keep Deletions","Deletions will NOT be filtered from the data.",
+			"Skip Deletions","Deletions will be pruned out and NOT included in the converted file.");
+
+
+if (SKIP_OMISSIONS<0)
+{
+	fprintf (stdout, "\n\nExecution Canceled...");
+}
+
+DataSet bigDataSet = ReadDataFile (PROMPT_FOR_FILE);
+
+if (IS_TREE_PRESENT_IN_DATA)
+{
+	fprintf (stdout, "\nTree In Data:", DATAFILE_TREE);
+}
+fprintf (stdout, "\nRead:\n", bigDataSet);
+
+ChoiceList (DATA_FILE_PRINT_FORMAT,"Output Format",1,SKIP_NONE,"# sequential","Sequential format with taxa names preceded by #",
+			"# interleaved","Interleaved format with taxa names preceded by #",
+			"PHYLIP sequential","PHYLIP Sequential Format. Taxa names are chopped at 10 characters.",
+			"PHYLIP interleaved","PHYLIP Interleaved Format. Taxa names are chopped at 10 characters.",
+			"NEXUS sequential, labels","NEXUS sequential format with taxa labels present in the data matrix.",
+			"NEXUS interleaved, labels","NEXUS interleaved format with taxa labels present in the data matrix.",
+			"NEXUS sequential, no labels","NEXUS sequential format without taxa labels in the data matrix.",
+			"NEXUS interleaved, no labels","NEXUS interleaved format without taxa labels in the data matrix.");
+
+if (DATA_FILE_PRINT_FORMAT<0)
+{
+	fprintf (stdout, "\n\nExecution Canceled...");
+}
+else
+{
+	fprintf (stdout,"\n\nPartition starts at site (0-based):");
+	fscanf  (stdin,"Number",beginPart);
+	fprintf (stdout,"\nPartition ends at site (0-based):");
+	fscanf  (stdin,"Number",endPart);
+	
+	DataSetFilter dsf = CreateFilter (bigDataSet,1,(siteIndex>=beginPart)&&(siteIndex<=endPart));
+
+	SetDialogPrompt ("Write to file:");
+	
+	fprintf (PROMPT_FOR_FILE, CLEAR_FILE, dsf);
+}
diff --git a/res/TemplateBatchFiles/PartitionRateComparison.bf b/res/TemplateBatchFiles/PartitionRateComparison.bf
new file mode 100644
index 0000000..35c5aa3
--- /dev/null
+++ b/res/TemplateBatchFiles/PartitionRateComparison.bf
@@ -0,0 +1,800 @@
+ModelMatrixDimension = 0;
+
+baselineOutput   = "";
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function computeModelBranchLengthExpression (freqVector)
+{
+	rateTypeWeights     = {6,2};
+	rateTypeWeightsGY94 = {6,2};
+		
+	hshift = 0;
+
+	for (h=0; h<64; h=h+1)
+	{
+		if (_Genetic_Code[h]==10) 
+		{
+			continue; 
+		}
+		for (h=0; h<64; h=h+1)
+		{
+			if (_Genetic_Code[h]==10) 
+			{
+				hshift = hshift+1;
+				continue; 
+			}
+			vshift = hshift;
+			for (v = h+1; v<64; v=v+1)
+			{
+				diff = v-h;
+				if (_Genetic_Code[v]==10) 
+				{
+					vshift = vshift+1;
+					continue; 
+				}
+				nucPosInCodon = 2;
+				if ((h$4==v$4)||((diff%4==0)&&(h$16==v$16))||(diff%16==0))
+				{
+					if (h$4==v$4)
+					{
+						transition = v%4;
+						transition2= h%4;
+					}
+					else
+					{
+						if(diff%16==0)
+						{
+							transition = v$16;
+							transition2= h$16;
+							nucPosInCodon = 0;
+						}
+						else
+						{
+							transition = v%16$4;
+							transition2= h%16$4;
+							nucPosInCodon = 1;
+						}
+					}
+					
+					mxIndex = 0;
+					if (transition<transition2)
+					{
+						t1 = transition;
+						t2 = transition2;
+					}
+					else
+					{
+						t1 = transition2;
+						t2 = transition;
+					}
+					
+					if (t1 == 0)
+					{
+						mxIndex = t2-1;
+					}
+					else
+					{
+						if (t1 == 1)
+						{
+							mxIndex = 1+t2;
+						}
+						else
+						{
+							mxIndex = 5;
+						}
+					}
+					
+					t1 = (_Genetic_Code[0][h]!=_Genetic_Code[0][v]);
+					rateTypeWeights[mxIndex][t1] = rateTypeWeights[mxIndex][t1]+
+												   freqVector[h-hshift]*freqVector[transition][nucPosInCodon]+
+												   freqVector[v-vshift]*freqVector[transition2][nucPosInCodon];
+					rateTypeWeightsGY94[mxIndex][t1] = rateTypeWeightsGY94[mxIndex][t1]+
+												   2*freqVector[h-hshift]*freqVector[v-vshift];
+				}
+		   }
+	    }		
+	}
+	return 0;		
+}
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function echoCatVar (distrInfo)
+{
+	DD = Columns(distrInfo);
+	EE = 0.0;
+	sampleVar = 0.0;
+	for (k=0; k<DD; k=k+1)
+	{
+		EE = distrInfo[0][k]*distrInfo[1][k]+EE;
+		sampleVar = sampleVar+distrInfo[0][k]*distrInfo[0][k]*distrInfo[1][k];
+	}
+		
+	sampleVar = sampleVar-EE*EE;
+	
+	fprintf  (distribOutput,"\n\n------------------------------------------------\n\nSample mean = ",EE, " (sample variance = ",sampleVar,")\n");
+	for (k=0; k<DD; k=k+1)
+	{
+		fprintf (distribOutput,"\nRate[",Format(k,0,0),"]=",Format(distrInfo[0][k],12,8), " (weight=", 
+						  Format(distrInfo[1][k],9,7),")");
+	}
+	return EE;
+}
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function echoRatio (distrInfo, distrInfo2)
+{
+	D1 = Columns(distrInfo);
+	D2 = Columns(distrInfo2);
+		
+	ratioInfo = {3,D1*D2};
+	
+	for (k=0; k<D1; k=k+1)
+	{
+		EE = k*D2;
+		for (k2 = 0; k2<D2; k2=k2+1)
+		{
+			ratioInfo [0][EE+k2] = distrInfo[0][k]/distrInfo2[0][k2];
+			ratioInfo [1][EE+k2] = distrInfo[1][k]*distrInfo2[1][k2];
+			ratioInfo [2][EE+k2] = k2*D1+k;
+		}
+	}
+	
+	done = 0;
+	EE = D1*D2;
+	while (!done)
+	{
+		done = 1;
+		for (k=1; k<EE; k=k+1)
+		{
+			if (ratioInfo [0][k] < ratioInfo[0][k-1])
+			{
+				DD = ratioInfo [0][k];
+				ratioInfo [0][k] = ratioInfo [0][k-1];
+				ratioInfo [0][k-1] = DD;
+				DD = ratioInfo [1][k];
+				ratioInfo [1][k] = ratioInfo [1][k-1];
+				ratioInfo [1][k-1] = DD;
+				DD = ratioInfo [2][k];
+				ratioInfo [2][k] = ratioInfo [2][k-1];
+				ratioInfo [2][k-1] = DD;
+				done = 0;
+			}
+		}
+	}
+	return echoCatVar (ratioInfo);
+}
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function BuildCodonFrequencies (obsF)
+{
+	PIStop = 1.0;
+	result = {ModelMatrixDimension,1};
+	hshift = 0;
+
+	for (h=0; h<64; h=h+1)
+	{
+		first = h$16;
+		second = h%16$4;
+		third = h%4;
+		if (_Genetic_Code[h]==10) 
+		{
+			hshift = hshift+1;
+			PIStop = PIStop-obsF[first][0]*obsF[second][1]*obsF[third][2];
+			continue; 
+		}
+		result[h-hshift][0]=obsF[first][0]*obsF[second][1]*obsF[third][2];
+	}
+	return result*(1.0/PIStop);
+}
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------------*/
+
+
+SetDialogPrompt ("Please specify a codon data file:");
+
+DataSet ds = ReadDataFile (PROMPT_FOR_FILE);
+dataFilePath = LAST_FILE_PATH;
+fprintf (stdout,"\n______________READ THE FOLLOWING DATA______________\n",ds);
+
+#include "TemplateModels/chooseGeneticCode.def";
+
+DataSetFilter filteredData = CreateFilter (ds,3,"","",GeneticCodeExclusions);
+
+HarvestFrequencies (observedFreq,	   filteredData,3,1,1);
+
+#include "queryTree.bf";
+
+ChoiceList (branchLengths,"Branch Lengths",1,SKIP_NONE,
+			"Codon Model","Jointly optimize rate parameters and branch lengths (slow and thorough)",
+			"Nucleotide Model","Estimate branch lengths once, using an appropriate nucleotide model (quick and dirty)."
+		    );
+
+if (branchLengths<0)
+{
+	return;
+}
+
+modelConstraintString = "";
+
+ChoiceList (modelChoice, "Rate Matrix Options",1,SKIP_NONE,
+			"MG94",	 "Standard Muse-Gaut 94 model.",
+			"MG94xHKY85","MG94 with the transition/transverion ratio parameter kappa.",
+			"MG94xREV","MG94 with 5 additional parameters for each type of nucleotide substitution ratio. (Recommended Rate Matrix)",
+			"MG94xCustom","MG94 crossed with an arbitrary nucelotide reversible model, except F81.",
+			/*"MG94xCustomxAA","MG94 crossed with an arbitrary nucelotide reversible model and an arbitrary amino-acid bias profile.",*/
+			"GY94","Goldman-Yang, 94 model (similar to MG94xHKY85)"
+);
+
+if (modelChoice<0)
+{
+	return;
+}
+
+marginalOutFile = "2RatesAnalyses/MG94xREV.mdl";
+if (modelChoice == 0)
+{
+	modelConstraintString = "AC:=1;AT:=1;CG:=1;CT:=1;GT:=1"; 
+	ModelTitle = "MG94";
+}
+else
+{
+	if (modelChoice == 1)
+	{
+		modelConstraintString = "CT:=1;AT:=AC;CG:=AC;GT:=AC"; 
+		ModelTitle = "MG94xHKY85";
+	}
+	else
+	{
+		if (modelChoice == 3)
+		{
+			done = 0;
+			while (!done)
+			{
+				fprintf (stdout,"\nPlease enter a 6 character model designation (e.g:010010 defines HKY85):");
+				fscanf  (stdin,"String", modelDesc);
+				if (Abs(modelDesc)==6)
+				{	
+					done = 1;
+				}
+			}			
+			ModelTitle = "MG94x"+modelDesc[0];
+						
+			rateBiasTerms = {{"AC","1","AT","CG","CT","GT"}};
+			paramCount	  = 0;
+
+			modelConstraintString = "";
+
+			for (customLoopCounter2=1; customLoopCounter2<6; customLoopCounter2=customLoopCounter2+1)
+			{
+				for (customLoopCounter=0; customLoopCounter<customLoopCounter2; customLoopCounter=customLoopCounter+1)
+				{
+					if (modelDesc[customLoopCounter2]==modelDesc[customLoopCounter])
+					{
+						ModelTitle  = ModelTitle+modelDesc[customLoopCounter2];	
+						if (rateBiasTerms[customLoopCounter2] == "1")
+						{
+							modelConstraintString = modelConstraintString + rateBiasTerms[customLoopCounter]+":="+rateBiasTerms[customLoopCounter2]+";";
+						}
+						else
+						{
+							modelConstraintString = modelConstraintString + rateBiasTerms[customLoopCounter2]+":="+rateBiasTerms[customLoopCounter]+";";			
+						}
+						break;
+					}
+				}
+				if (customLoopCounter==customLoopCounter2)
+				{
+					ModelTitle = ModelTitle+modelDesc[customLoopCounter2];	
+				}
+			}	
+		}
+		else
+		{
+			if (modelChoice == 4)
+			{
+				marginalOutFile = "2RatesAnalyses/GY94.mdl";
+				ModelTitle = "GY94";
+			}
+			else
+			{
+				ModelTitle = "MG94xREV";
+			}
+		}			
+	}
+}
+
+chosenModelList = {5,1};
+
+ChoiceList (modelChoice,"Rate Variation Options",1,SKIP_NONE,
+			"Run All","Run all available models.",
+			"Run Custom","Choose some of the available models.");
+			
+if (modelChoice<0)
+{
+	return;
+}
+
+if (modelChoice==0)
+{
+	for (mi = 0; mi<5; mi=mi+1)
+	{
+		chosenModelList[mi][0] = 1;
+	}
+}
+else
+{
+	ChoiceList (modelTypes,"Rate Variation Models",0,SKIP_NONE,
+				"Constant","Constant Rate Model: no rate variation across sites.", /* index 0 */
+				"Proportional","Proportional Variable Rates Model: dS and dN vary along the sequence, but dN = R*dS for every site",
+				"Nonsynonymous","Non-synonymous Variable Rates Model: dS = 1 for every site, while dN is drawn from a given distribution.",
+				"Dual","Dual Variable Rates Model: dS and dN are drawn from a bivariate distribution (independent or correlated components). Recommened model.",
+				"Lineage Dual","Lineage Dual Variable Rates Model:  dS and dN are drawn from a bivariate distribution (independent or correlated components), plus each lineage has an adjustment factor for the E[dN]/E[dS]."
+			    );
+			    
+	if (modelTypes[0]<0)
+	{
+		return;
+	}
+	
+	for (mi = 0; mi < Rows(modelTypes)*Columns(modelTypes); mi = mi + 1)
+	{
+		modelChoice = modelTypes[mi];
+		chosenModelList[modelChoice] = 1;
+	}	
+}
+
+modelNamesShort = {{"Constant","Proportional","Nonsynonymous","Dual","LineageDual"}};
+
+
+ChoiceList (modelChoice, "Distribution Option",1,SKIP_NONE,
+			"Syn:Gamma, Non-syn:Gamma",	 "Both syn and non-syn rates are drawn from the gamma distributions for all models.",
+			"Syn:Gamma, Non-syn:Inv+Gamma","Syn and non-syn rates are drawn from the gamma distributions for Proportional and Nonsynonymous. For Dual and Local Dual, syn rates are drawn from the gamma distribution, and non-syn rates - from Inv+Gamma.",
+			"Independent Discrete", "Independent General Discrete Distributions (Recommended setting)",
+			"Correlated Discrete", "Correlated General Discrete Distributions");
+			
+			
+if (modelChoice < 0)
+{
+	return;
+}
+
+ChoiceList (randomizeInitValues, "Initial Value Options",1,SKIP_NONE,
+			"Default",	 "Use default inital values for rate distribution parameters.",
+			"Randomized",	 "Select initial values for rate distribution parameters at random.");
+
+
+if (randomizeInitValues < 0)
+{
+	return;
+}
+
+resp  = 0;
+resp2 = 0;
+
+while (resp<2)
+{
+	fprintf (stdout,"Number of synonymous (and single variable rate modles) rate classes (>=2):");
+	fscanf  (stdin, "Number", resp);
+}
+
+while (resp2<2)
+{
+	fprintf (stdout,"Number of non-synonymous rate classes (>=2):");
+	fscanf  (stdin, "Number", resp2);
+}
+			
+fudgeFactor = 1.0;
+
+if (modelChoice<2)
+{
+	fscanf ("2RatesAnalyses/gamma1.def","Raw",categDef1);
+
+	if (modelChoice == 0)
+	{
+		fscanf ("2RatesAnalyses/gamma2.def","Raw",categDef2);
+	}
+	else
+	{
+		fscanf ("2RatesAnalyses/gamma2+Inv.def","Raw",categDef2);
+	}
+}
+else
+{
+	correlationOn = (modelChoice>2);
+	fscanf ("2RatesAnalyses/discreteGenerator.bf","Raw",mi);
+	ExecuteCommands (mi);
+}
+
+ExecuteCommands ("#include \""+marginalOutFile+"\";");
+
+if (Abs(modelConstraintString))
+{
+	ExecuteCommands (modelConstraintString);
+}
+
+
+SetDialogPrompt ("Save summary result file to:");
+fprintf (PROMPT_FOR_FILE,CLEAR_FILE);
+baselineOutput = LAST_FILE_PATH;
+
+distribOutput = baselineOutput + ".distributions";
+fprintf (distribOutput,CLEAR_FILE);
+
+
+
+if (branchLengths)
+{
+	branchLengths = -branchLengths;
+}
+
+separator =      "+---------------------+---------------------+---------------+-------------------+-------------------+---------------+-----+-----------+\n";
+
+fprintf (stdout, "\n\nRUNNING ",ModelTitle," MODEL COMPARISONS on ",dataFilePath, "\n\n",
+				 "\n\n########### ",resp,"x",resp2," CLASSES ###########\n\n",
+				 separator,
+				 "|       Model         |   Log Likelihood    | Synonymous CV |  NS Exp and CV    |  N/S Exp and CV   |    P-Value    | Prm |    AIC    |\n",
+				 separator);
+
+fprintf (baselineOutput,  "\n\nRUNNING ",ModelTitle," MODEL COMPARISONS on ",dataFilePath, "\n\n",
+						   "\n\n########### ",resp,"x",resp2," CLASSES ###########\n\n",
+				 separator,
+				 "|       Model         |   Log Likelihood    | Synonymous CV |  NS Exp and CV    |  N/S Exp and CV   |    P-Value    | Prm |    AIC    |\n",
+				 separator);
+
+lastLikValue = 0;
+R = 1;
+
+modelNames = {{"| Constant Rates      |",
+			   "| Prop. Var. Rates    |",
+			   "| Var. N.Syn. Rates   |",
+			   "| Dual Variable Rates |",
+			   "| Dual V.R. + Lineage |"}};
+			   
+
+
+if (MPI_NODE_COUNT>1)
+/* Check to see if we are running with more than one MPI node.
+   If not - bail to single CPU execution */			   
+{
+	MPINodeState = {MPI_NODE_COUNT-1,2};
+	
+	/* One of the nodes (0) will be the dispatcher, and
+	   for every other node, we need to store two values:
+	   whether it is busy or not (0 or 1), and 
+	   an integer (from 0 to 5) to indicate which model
+	   (M0-M5) the node is working on */
+	   
+	OPTIMIZE_SUMMATION_ORDER = 0;
+	
+	/* the master node will be creating likelihood functions, 
+	but not evaluating them - thus there is no need to perform
+	the extra step of optimizing data column ordering for faster
+	likelihood evaluations */
+}
+
+doNucFit = 1;
+
+for (mi = 0; mi<5; mi=mi+1)
+{
+	if (chosenModelList[mi])
+	{
+		theRateMatrix = 0;
+
+		MULTIPLY_BY_FREQS = PopulateModelMatrix ("theRateMatrix", observedFreq, mi);
+		vectorOfFrequencies = BuildCodonFrequencies (observedFreq);
+		
+		if (doNucFit)
+		{
+			HarvestFrequencies 					   (observedFreqSingle,filteredData,1,1,1);
+			DataSetFilter nucFilter = CreateFilter (filteredData,1);
+			ExecuteCommands (nucModelString+"\nModel nucModel = (nucModelMatrix,observedFreqSingle);");
+
+			Tree  nucTree = treeString;
+			LikelihoodFunction nuc_lf = (nucFilter,nucTree);
+			Optimize (nuc_res, nuc_lf);
+			
+			computeExpSubWeights (0);		
+			global codonFactor = 0.33;
+						
+			doNucFit = 0;
+		}
+			
+		Model MG94model = (theRateMatrix,vectorOfFrequencies,MULTIPLY_BY_FREQS);
+		
+		Tree  givenTree = treeString;
+		if (branchLengths)
+		{
+			ClearConstraints (givenTree);
+			ReplicateConstraint ("this1.?.synRate:=this2.?.t__/codonFactor",givenTree,nucTree);
+		}
+		else
+		{
+			lbc = TipCount (givenTree);
+			initString = "";
+			for (lc = 0; lc < lbc; lc = lc+1)
+			{
+				bn = TipName (givenTree,lc);
+				initString = initString + "givenTree." + bn + ".synRate=nucTree." + bn + ".t/codonFactor;";
+			}	
+			lbc = BranchCount (givenTree);
+			for (lc = 0; lc < lbc; lc = lc+1)
+			{
+				bn = BranchName (givenTree,lc);
+				initString = initString + "givenTree." + bn + ".synRate=nucTree." + bn + ".t/codonFactor;";
+			}	
+			ExecuteCommands (initString);
+			initString = "";
+			
+		}
+
+		LikelihoodFunction lf = (filteredData,givenTree);
+		
+		if (MPI_NODE_COUNT>1)
+		{
+			/* look for an idle node */
+			for (mpiNode = 0; mpiNode < MPI_NODE_COUNT-1; mpiNode = mpiNode+1)
+			{
+				if (MPINodeState[mpiNode][0]==0)
+				{
+					break;	
+				}
+			}
+			
+			if (mpiNode==MPI_NODE_COUNT-1)
+			/* all nodes busy */
+			{
+				/* wait for some node to complete and send out current job */
+				mpiNode = ReceiveJobs (1);
+			}
+			else
+			{
+				/* send the job to an idle node; update node state */
+				MPISend (mpiNode+1,lf);
+				MPINodeState[mpiNode][0] = 1;
+				MPINodeState[mpiNode][1] = mi;
+			}
+		}
+		else
+		{
+			/* Non-MPI execution */
+			Optimize (res,lf);
+			modelIndex = mi;
+			dummy = ReceiveJobs (0);
+		}
+	}
+}
+
+if (MPI_NODE_COUNT>1)
+/* wait for all the jobs to finish, process their results */
+{
+	while (1)
+	{
+		for (nodeCounter = 0; nodeCounter < MPI_NODE_COUNT-1; nodeCounter = nodeCounter+1)
+		{
+			if (MPINodeState[nodeCounter][0]==1)
+			{
+				fromNode = ReceiveJobs (0);
+				break;	
+			}
+		}
+		if (nodeCounter == MPI_NODE_COUNT-1)
+		{
+			break;
+		}
+	}	
+	OPTIMIZE_SUMMATION_ORDER = 1;
+}
+
+/* ____________________________________________________________________________________________________________________*/
+
+function ReceiveJobs (sendOrNot)
+
+/* This function receieves and processes 
+   model results. The parameter is a boolean,
+   set to 1 if there are jobs waiting to be sent to
+   an MPI node */
+{
+	if (MPI_NODE_COUNT>1)
+	{
+		MPIReceive (-1, fromNode, result_String);
+		modelIndex = MPINodeState[fromNode-1][1];
+		
+		if (sendOrNot)
+		{
+			/* send the likelihood function to the node which just finished */
+			MPISend (fromNode,lf);
+			MPINodeState[fromNode-1][1] = mi;
+		}
+		else
+		{
+			/* mark the node as idle */
+			MPINodeState[fromNode-1][0] = 0;
+			MPINodeState[fromNode-1][1] = 0;
+		}
+		
+		/* reset category variables */
+		if (modelIndex)
+		{
+			ClearConstraints (c);
+		}
+		if (modelIndex>2)
+		{
+			ClearConstraints (d);
+		}
+		
+		/* build the likelihood function lf with MLE parameter values
+		   just returned from an MPI node. MLE matrix is returned 
+		   in lf_MLES. */
+		   		
+		ExecuteCommands (result_String);
+				
+		/* store the result matrix */
+		res = lf_MLES;
+	}
+	
+	
+	if (branchLengths)
+	{
+		res[1][1] = res[1][1] + TipCount (givenTree) + BranchCount (givenTree) - 1;
+	}
+
+	LIKELIHOOD_FUNCTION_OUTPUT = 6;
+
+	fprintf (stdout, modelNames[modelIndex], " ", Format (res[1][0],19,5));
+	fprintf (baselineOutput, modelNames[modelIndex], " ", Format (res[1][0],19,5));
+	
+	marginalOutFile = baselineOutput + "." + modelNamesShort[modelIndex] + ".fit";
+	
+	fprintf (marginalOutFile,CLEAR_FILE,lf);
+
+	if (modelIndex)
+	{
+		marginalOutFile = baselineOutput + "." + modelNamesShort[modelIndex] + ".marginals";
+		fprintf (marginalOutFile,CLEAR_FILE);
+	}
+	
+	fprintf (distribOutput, "\n", modelNames[modelIndex]);
+	if (modelIndex==0)
+	{
+		EE = 0;
+		sampleVar = 0;
+		fprintf (stdout, " |      N/A      | ", Format (R,8,5) , ",", Format (sampleVar,8,5), " | ", Format (R,8,5) , ",", Format (sampleVar,8,5), " | ");
+		fprintf (baselineOutput, " |      N/A      | ", Format (R,8,5) , ",", Format (sampleVar,8,5), " | ", Format (R,8,5) , ",", Format (sampleVar,8,5), " | ");
+	}
+	else
+	{
+		GetInformation(dI,c);
+		if (modelIndex==2)
+		{
+			DD = Columns (dI);
+			for (EE=0; EE<DD; EE=EE+1)
+			{
+				dI[0][EE] = R*dI[0][EE];
+			}
+			
+			NVRMLL = res[1][0];
+			NVRMPC = res[1][1];
+			
+			EE  = echoCatVar (dI);
+			fprintf (marginalOutFile, dI);
+			
+			fprintf (stdout, " |      N/A      | ", Format (EE,8,5) , ",", Format (Sqrt(sampleVar)/EE,8,5), " | ", Format (EE,8,5) , ",", Format (Sqrt(sampleVar)/EE,8,5), " | ");
+			fprintf (baselineOutput, " |      N/A      | ", Format (EE,8,5) , ",", Format (Sqrt(sampleVar)/EE,8,5), " | ", Format (EE,8,5) , ",", Format (Sqrt(sampleVar)/EE,8,5), " | ");
+		}  
+		else
+		{
+			fprintf (marginalOutFile, dI);
+			EE  = echoCatVar (dI);
+			fprintf (stdout, " | ",Format (Sqrt(sampleVar),13,8)," | ");
+			fprintf (baselineOutput, " | ",Format (Sqrt(sampleVar),13,8)," | ");
+			
+			if (modelIndex>=3)
+			{
+				GetInformation(dI2,d);
+				if (modelIndex!=5)
+				{
+					DD = Columns (dI2);
+					for (EE=0; EE<DD; EE=EE+1)
+					{
+						dI2[0][EE] = R*dI2[0][EE];
+					}
+				}
+				fprintf (marginalOutFile, dI2);
+				EEN  = echoCatVar (dI2);
+				varN = sampleVar;
+				EER  = echoRatio  (dI2,dI);
+				varR = sampleVar;
+				
+				fprintf (stdout,  Format (EEN,8,5) , ",", Format (Sqrt(varN)/EEN,8,5), " | ",Format (EER,8,5) , ",", Format (Sqrt(varR)/EER,8,5), " | ");	
+				fprintf (baselineOutput, Format (EEN,8,5) , ",", Format (Sqrt(varN)/EEN,8,5), " | ",Format (EER,8,5) , ",", Format (Sqrt(varR)/EER,8,5), " | ");	
+					
+				if (modelIndex==3)
+				{
+					DVRMLL = res[1][0];
+					DVRMPC = res[1][1];
+					/* we don't know that DVRM returned before M4, so we won't print the p-value in the MPI mode */
+					if ((chosenModelList[2])&&(MPI_NODE_COUNT<=1))
+					{
+						pVal = 1-CChi2(2*(DVRMLL-NVRMLL),DVRMPC-NVRMPC);
+						fprintf (stdout, Format (pVal,13,8), " |");
+						fprintf (baselineOutput, Format (pVal,13,8), " |");
+					}
+					else
+					{
+						fprintf (stdout,"     N/A      |");
+						fprintf (baselineOutput, "     N/A      |");
+					}
+				}
+			}
+			else
+			{
+				fprintf (stdout, Format (EE*R,8,5) , ",", Format (Sqrt(sampleVar)/EE,8,5), " | ", Format (R,8,5) , ",", Format (0,8,5), " | ");
+				fprintf (baselineOutput, Format (EE*R,8,5) , ",", Format (Sqrt(sampleVar)/EE,8,5), " | ", Format (R,8,5) , ",", Format (0,8,5), " | ");
+			}
+		}
+	}
+		
+	if (modelIndex==4) /* local rates */
+	{
+		/* we don't know that DVRM returned before M4, so we won't print the p-value in the MPI mode */
+		if ((chosenModelList[3])&&(MPI_NODE_COUNT<=1))
+		{
+			fprintf (stdout, Format (1-CChi2(2*(res[1][0]-DVRMLL),res[1][1]-DVRMPC),13,8), " |");
+			fprintf (baselineOutput, Format (1-CChi2(2*(res[1][0]-DVRMLL),res[1][1]-DVRMPC),13,8), " |");
+		}
+		else
+		{
+			fprintf (stdout,"     N/A      |");
+			fprintf (baselineOutput, "     N/A      |");
+		}
+	}
+	else
+	{
+		if (modelIndex < 3)
+		{
+			fprintf (stdout,"     N/A      |");
+			fprintf (baselineOutput,"     N/A      |");
+		}
+	}
+	
+	fprintf (stdout, Format (res[1][1],5,0), "|", Format (2*(res[1][1]-res[1][0]),11,2),"|");
+	fprintf (baselineOutput, Format (res[1][1],5,0), "|", Format (2*(res[1][1]-res[1][0]),11,2),"|");
+	fprintf (stdout, "\n",separator);
+	fprintf (baselineOutput, "\n",separator);
+	if (modelIndex)
+	{
+		ConstructCategoryMatrix(marginals,lf,COMPLETE);
+		
+		if (modelIndex>=3)
+		{
+			GetInformation (categVarIDs,lf);
+			if (categVarIDs[0]!="c")
+			{
+				marginalsCorrected = marginals;
+				fprintf (MESSAGE_LOG,"Adjusting marginal matrix rows.\n"); 
+				for (h=0; h<Columns(marginals); h=h+1)
+				{
+					transition = 0;
+					for (diff=0; diff<resp; diff = diff+1)
+					{
+						for (v=diff; v<Rows(marginals); v=v+resp)
+						{
+							marginalsCorrected[transition][h] = marginals[v][h];
+							transition = transition+1;
+						}
+					}
+				}
+				marginals = marginalsCorrected;
+			}
+		}
+
+		fprintf (marginalOutFile,marginals);
+	}
+	lastLikValue = res[1][0];	
+	
+	return fromNode-1;
+}
diff --git a/res/TemplateBatchFiles/Phylohandbook.bf b/res/TemplateBatchFiles/Phylohandbook.bf
new file mode 100644
index 0000000..74378e2
--- /dev/null
+++ b/res/TemplateBatchFiles/Phylohandbook.bf
@@ -0,0 +1,2 @@
+GetURL (thePage,"http://www.hyphy.org/phylohandbook/AnalysesIndex.bf");
+ExecuteCommands (thePage);
diff --git a/res/TemplateBatchFiles/Plato.bf b/res/TemplateBatchFiles/Plato.bf
new file mode 100644
index 0000000..f8f3d35
--- /dev/null
+++ b/res/TemplateBatchFiles/Plato.bf
@@ -0,0 +1,313 @@
+/************************************************************************************/
+/* A Likelihood Method for the Detection of Selection and Recombination using Nucleotide Sequences 
+	-Grassly and Holmes, 1997
+  HBL implementation by Olivier Fedrigo (ofedrigo at duke.edu) 
+  October 2006
+*/
+
+RequireVersion ("0.9920060901");
+
+VERBOSITY_LEVEL		  = -1; /* HELPS REDUCE GUI REFRESH OVERHEAD */
+ACCEPT_BRANCH_LENGTHS = 1;
+ACCEPT_ROOTED_TREES   = 1;
+nreps=100;
+
+fprintf			(stdout, "Partial Likelihood Anomalies detected Through Optimization - PLATO\nVersion 2.0\n(c) Copyright, 1998 Nick Grassly and Andrew Rambaut\nDepartment of Zoology, University of Oxford\nSouth Parks Road, Oxford OX1 3PS, U.K.\n");
+
+SetDialogPrompt ("Please locate an alignment file:");
+DataSet 			nucleotideSequences = ReadDataFile (PROMPT_FOR_FILE);
+DataSetFilter       filteredData 	    = CreateFilter (nucleotideSequences,1);
+HarvestFrequencies (observedFreqs, filteredData, 1, 1, 1);
+
+fprintf (stdout, "\nLoaded a ", filteredData.species, " sequence alignment with ", filteredData.sites,"\n");
+fprintf (stdout, "\nBase composition:\n\tA: ", Format (observedFreqs[0],10,5),
+									"\n\tC: ", Format (observedFreqs[1],10,5),
+									"\n\tG: ", Format (observedFreqs[2],10,5),
+									"\n\tT: ", Format (observedFreqs[3],10,5), "\n\n");
+									
+ExecuteAFile (HYPHY_LIB_DIRECTORY+"TemplateBatchFiles"+DIRECTORY_SEPARATOR+"queryTree.bf");
+SelectTemplateModel(filteredData);
+
+/*CALCULATE ML PARAMETERS AND LIKELIHOOD PER SITES*/
+Tree givenTree				= treeString;
+LikelihoodFunction theLnLik = (filteredData, givenTree);
+Optimize 					  (paramValues, theLnLik);
+
+/* SLKP: NEED TO SAVE GLOBAL VARIABLES; OTHERWISE THEY WILL BE OVERWRITTEN
+   DURING OPTIMIZATIONS FROM SIMULATED DATA */
+   
+GetString 			  (likelihoodInfo, theLnLik, -1);   
+globalVariableList 	= likelihoodInfo["Global Independent"];
+globalVariableCount	= Columns (globalVariableList);
+
+if (globalVariableCount)
+{
+	stashed_GV = {globalVariableCount,1};
+	for (vc = 0; vc < globalVariableCount; vc = vc + 1)
+	{
+		ExecuteCommands ("stashed_GV[vc]="+globalVariableList[vc]+";");
+	}
+}
+
+
+ConstructCategoryMatrix		  (L, theLnLik, COMPLETE);
+
+/* SLKP: If there are category variables involved in the model, one needs to collapse site likelihoods 
+   conditional on the value of the category into an averaged value at a site */
+ 
+if (Rows(L)>1)
+{
+	catVars 	= likelihoodInfo["Categories"];
+	catVarCount = Columns 		(catVars);
+	
+	if (catVarCount > 1)
+	{
+		fprintf (stdout, "ERROR: only one category variable can be handled by this code\n");
+		return 0;
+	}
+
+	ExecuteCommands ("GetInformation (catWeight,"+catVars[vc]+");");
+	L = catWeight[1][-1]*L;
+}
+
+/* END SLKP */
+
+fprintf						  (stdout,"\nML parameters estimated. Log(L) = ", paramValues[1][0], "\n");
+
+/*CALCULATE THE RATIO: (SUM OF LIKELIHOOD INSIDE THE WINDOW PER SITE)/(SUM OF LIKELIHOOD OUTSITE THE WINDOW PER SITE)*/
+/*FOR EACH WINDOW SIZE (FROM 5bp TO HALF OF THE DATASET*/
+fprintf(stdout,"Actual surface \n");
+
+smin			=	5;
+smax			=	filteredData.sites$2;
+liktable		=	getSurface(smin,smax,filteredData.sites,paramValues[1][0],L);
+
+/*DO THE SAME THING FOR SIMULATIONS. 100 SIMULATION, FOR EACH ITERATE TAKE THE MAXIMAL VALUE FOR A GIVEN WINDOW SIZE*/
+fprintf			(stdout,"Simulating \n");
+winLikList		=	{nreps,smax};
+for (simCounter=0;simCounter<nreps;simCounter=simCounter+1)
+{
+	Tree simTree=treeString;
+	ClearConstraints(simTree);
+	/* SLKP: NEED TO RESTORE GLOBAL VARIABLES BEFORE SIMULATION */
+	if (globalVariableCount)
+	{
+		for (vc = 0; vc < globalVariableCount; vc = vc + 1)
+		{
+			ExecuteCommands (globalVariableList[vc]+"=stashed_GV[vc];");
+		}
+	}	 
+	DataSet simData				=	SimulateDataSet(theLnLik);
+	DataSetFilter simFilter		=	CreateFilter(simData,1);
+	HarvestFrequencies				(simFreqs,simFilter,1,1,1);
+	LikelihoodFunction simLik 	= (simFilter,simTree,simFreqs);
+	Optimize (simParamValues,simLik);
+	ConstructCategoryMatrix (Lsim,simLik, COMPLETE);
+	if (catVarCount == 1)
+	{
+		ExecuteCommands ("GetInformation (catWeight,"+catVars[vc]+");");
+		Lsim = catWeight[1][-1]*Lsim;
+	}
+	fprintf(stdout,"Replicate #",simCounter,"\nTree -ln Likelihood = ",simParamValues[1][0],"\n");
+	liktableTemp=getSurface(smin,smax,simFilter.sites,simParamValues[1][0],Lsim);
+	for (sp=0;sp<simFilter.sites-smin;sp=sp+1)
+	{
+		for (s=0;s<smax-smin+1;s=s+1) {winLikList[simCounter][s]=Max(liktableTemp[s][sp],winLikList[simCounter][s]);}
+	}
+}
+
+fprintf(stdout,"\nSimulations done\n");
+
+/*CALCULATE MEAN AND VARIANCE OF SIMUALTIONS FOR EACH WINDOW SIZE*/
+fprintf(stdout,"Calculate mean and variance \n");
+mean		=	{smax,1};
+variance	=	{smax,1};
+sumsq=0.0; sums=0.0;
+
+for (i=0;i<(smax-smin+1);i=i+1)
+{
+	sumsq=0.0; sums=0.0;
+	for(j=0;j<nreps;j=j+1)
+	{
+		sums=sums+winLikList[j][i];
+		sumsq=sumsq+((winLikList[j][i])*(winLikList[j][i]));
+	}
+	variance[i]=((sumsq-((sums*sums)/nreps))/(nreps-1));
+	mean[i]=sums/nreps;
+	windowsize=i+smin;
+}
+
+/*CALCULATE Z-VALUES*/       
+fprintf(stdout,"Results \n");
+alpha=0.05/(smax-smin+1);
+Z={smax,filteredData.sites};
+for(i=0;i<(smax-smin+1);i=i+1)
+  {
+     for(j=0;j<(filteredData.sites+1-i-smin);j=j+1)
+          {
+        Z[i][j]=(liktable[i][j]-mean[i])/(Sqrt(variance[i]));
+        }
+      }
+fprintf(stdout,"\nZ values calculated\n");
+
+/*DETERMINE CUTOFF*/
+fprintf(stdout, "\nBonferroni-corrected significance level for alpha=0.05: ", alpha,"\n");
+Z_cutOff=-normZval(alpha);
+fprintf(stdout, "Z-values greater than ",Z_cutOff," are significant\n\n");
+
+/* GET THE BEST SCORE*/
+temp=0.0;
+for (i=smin;i<=smax;i=i+1)
+{
+	for (j=0;j<(filteredData.sites+1-i);j=j+1)
+	{
+		if (Z[i-smin][j]>temp && Z[i-smin][j]>Z_cutOff)
+		{
+			temp=Z[i-smin][j];
+			size=i;
+			sp=j;
+		}
+	}
+
+}
+
+map={filteredData.sites,1};
+if (temp>Z_cutOff) /*IF THE BEST Z-SCORE IS SMALLER THAN THE CUTOFF THEN NO NEED TO DO IT*/
+{
+	while (temp>Z_cutOff)
+	{
+		for (i=sp;i<(sp+size);i=i+1) {map[i]=1;}
+		fprintf(stdout,Format(sp+1,5,0)," - ",Format(sp+size,5,0)," : ",Format(Z[size-smin][site],6,2),"\n");
+		temp=0.0;
+		for (i=smin;i<=smax;i=i+1)
+		{
+			for (j=0;j<(filteredData.sites-i+1);j=j+1)
+			{
+			if (Z[i-smin][j]>temp && Z[i-smin][j]>Z_cutOff)
+			{
+				check=0;
+				for (n=j;n<(j+i);n=n+1) {check=check+map[n];}
+				if (check==0) /*RECORD A GOOD SCORE ONLY IF NONE OF ITS SITES HAS BEEN INCLUDED IN AN PREVIOUS BETTER SCORE*/
+				{
+					temp=Z[i-smin][j];
+					size=i;
+					sp=j;
+				}
+			}
+			}
+		}
+	}
+}
+else
+{
+    fprintf(stdout, "No anomalous regions found\n");
+}
+
+fprintf(stdout,"\nFinished\n");
+
+        
+/************************************************************************************/
+
+function normZval(P)
+  {
+     /*modified from Fortran algorithm AS241
+    APPL. STATIST. (1988) VOL. 37, NO. 3, 477-484.
+ Produces the normal deviate Z corresponding to a given lower
+       tail area of P; Z is accurate to about 1 part in 10e7.*/    
+  SPLIT1 = 0.425;
+  SPLIT2 = 5.0;
+  CONST1 = 0.180625;
+  CONST2 = 1.6;
+  /*Coefficients for P close to 0.5*/
+  A0 = 3.3871327179;
+     A1 = 50.434271938;
+  A2 = 159.29113202;
+  A3 = 59.109374720;
+  B1 = 17.895169469;
+  B2 = 78.757757664;
+  B3 = 67.187563600;
+  /*Coefficients for P not close to 0, 0.5 or 1.*/
+  C0 = 1.4234372777;
+   C1 = 2.7568153900;
+  C2 = 1.3067284816;
+  C3 = 0.17023821103;
+  D1 = 0.73700164250;
+  D2 = 0.12021132975;
+  /*Coefficients for P near 0 or 1.*/
+      E0 = 6.6579051150;
+      E1 = 3.0812263860;
+  E2 = 0.42868294337;
+  E3 = 0.017337203997;
+  F1 = 0.24197894225;
+  F2 = 0.012258202635;
+      Q=P-0.5;
+        if(Abs(Q)<=SPLIT1)
+          {
+              Rx=CONST1-(Q*Q);
+                x=Q*((((((A3*Rx)+A2)*Rx)+A1)*Rx)+A0)/((((((B3*Rx)+B2)*Rx)+B1)*Rx)+1.0);
+                return x;
+         }
+  else {if(Q<0.0) {Rx=P;} else {Rx=1.0-P;}}
+  if(Rx<=0.0) {return 0.0;}    
+         Rx=Sqrt(-Log(Rx));
+        if(Rx<=SPLIT2)
+         {
+        Rx=Rx-CONST2;
+        x=(((C3*Rx+C2)*Rx+C1)*Rx+C0)/((D2*Rx+D1)*Rx+1.0);
+        }
+       else
+         {
+              Rx=Rx-SPLIT2;
+    x=(((E3*Rx+E2)*Rx+E1)*Rx+E0)/((F2*Rx+F1)*Rx+1.0);
+      }
+       if(Q<0.0) {x = -x;}
+   return x;
+  }
+
+/************************************************************************************/
+
+function getSurface(windowMin,windowMax,nsites,MLS,Likelihood)
+{
+    /*CALCULATE THE RATIO: (SUM OF Likelihood INSIDE THE WINDOW PER SITE)/(SUM OF Likelihood OUTSITE THE WINDOW PER SITE)*/
+  	/*FOR EACH WINDOW SIZE (FROM windowMin TO windowMax FOR A DATASET WITH nsites AND MLS*/
+  	
+  	timer 		= 	Time(1);
+    temp		=	{windowMax,nsites};
+    loopUB  	= 	nsites-windowMin+1;
+    windowSpan 	=   windowMax-windowMin+1;
+    loggedL		=   Log (Likelihood);
+    
+    for 	(sp=0;sp<loopUB;sp=sp+1)
+	{
+		/*
+		window	=	0;
+		loopUB2 = windowMin+sp;
+		for (s=sp;s<loopUB2;s=s+1) 
+		{	
+			window=window+Log(Likelihood[s]);
+		}*/
+		
+		/* SLKP: matrix hackery to do the same as above; 
+		   speeds things up quite a bit
+		   see Examples/BatchLanguage/MatrixIndexing.bf */
+		   
+		logExtract = loggedL[{{0,sp}}][{{0,windowMin+sp-1}}];
+		window  = (logExtract*Transpose(logExtract["1"]))[0];
+		
+		temp[0][sp]= 	window/windowMin / ((MLS-window) / (nsites-windowMin));
+		
+		localWS = Min (windowSpan, nsites-sp-windowMin-1);
+		i		   =	1;
+		while (i<=localWS)
+		{
+			cww			=   windowMin+i;
+			window		=	window+loggedL[sp+cww];
+			temp[i][sp]	=	(window/cww)/((MLS-window)/(nsites-cww));
+			i			=	i+1;
+		}
+	}
+	
+	fprintf(stdout,"\nML surface done in ", Time(1)-timer, " seconds\n");      
+	return temp;
+}
+/************************************************************************************/
diff --git a/res/TemplateBatchFiles/PositiveSelectionLI.bf b/res/TemplateBatchFiles/PositiveSelectionLI.bf
new file mode 100644
index 0000000..60df29d
--- /dev/null
+++ b/res/TemplateBatchFiles/PositiveSelectionLI.bf
@@ -0,0 +1,1810 @@
+ModelNames = {{"Neutral",
+	  		  "Selection",
+			  "Discrete",
+			  "Freqs",
+			  "Gamma",
+			  "2 Gamma",
+			  "Beta",
+			  "Beta & w",
+			  "Beta & Gamma",
+			  "Beta & (Gamma+1)",
+			  "Beta & (Normal>1)",
+			  "0 & 2 (Normal>1)",
+			  "3 Normal"}};
+			       
+MAXIMUM_ITERATIONS_PER_VARIABLE = 2000;
+OPTIMIZATION_PRECISION = 0.001;
+
+
+/*-------------------------------------------------------------------------------*/
+
+function  setElement (h,v,cc)
+{	
+	mSpecMatrix[h][v]=cc+1;
+	mSpecMatrix[v][h]=cc+1;
+	return 1;
+}
+
+/*-------------------------------------------------------------------------------*/
+
+function  reportModelType (modelType, prefix, customString)
+{	
+	modelType = modelType$2;
+	if (modelType == 0)
+	{
+		ms = "MG94";
+	}
+	else
+	{
+		if (modelType == 1)
+		{
+			ms = "GY94";
+		}
+		else
+		{
+			ms = "MG94 custom " + customString; 
+		}
+	}
+	fprintf (summaryFile, "Using ", ms, " model for ", prefix,"\n");
+	fprintf (stdout, "Using ", ms, " model for ", prefix,"\n");
+	return 1;
+}
+
+/*-------------------------------------------------------------------------------*/
+
+function  defineCustomModel (dummy)
+{
+	done = 0;
+
+	while (!done)
+	{
+		fprintf (stdout,"\nPlease enter a 6 character model designation (e.g:010010 defines HKY85):");
+		fscanf  (stdin,"String", modelDesc);
+		if (Abs(modelDesc)==6)
+		{	
+			done = 1;
+		}
+	}
+	
+	done = 0;
+	mSpecMatrix = {{*,1,1,1}{1,*,1,1}{1,1,*,1}{1,1,1,*}};
+
+	elementAssignments = {{0,0,0,0,0,0}};
+	paramCount = 1;
+	r=setElement (0,1,0);
+
+	for (j=1; j<6; j=j+1)
+	{
+		for (i=0; i<j; i=i+1)
+		{
+			if (modelDesc[j]==modelDesc[i])
+			{
+				elementAssignments[j]=elementAssignments[i];
+				if (j<3)
+				{
+					r=setElement (0,j+1,elementAssignments[i]);
+				}
+				else
+				{
+					if (j<5)
+					{
+						r=setElement (1,j-1,elementAssignments[i]);
+					}
+					else
+					{
+						r=setElement (2,3,elementAssignments[i]);
+					}
+				}
+				break;
+			}
+		}
+		if (i==j)
+		{
+			if (j<3)
+			{
+				r=setElement (0,j+1,paramCount);
+			}
+			else
+			{
+				if (j<5)
+				{
+					r=setElement (1,j-1,paramCount);
+				}
+				else
+				{
+					r=setElement (2,3,paramCount);
+				}
+			}
+			elementAssignments[j] = paramCount;
+			paramCount = paramCount+1;
+		}
+	}
+	return 0;
+}
+
+/*-------------------------------------------------------------------------------*/
+
+function defineNumberOfCategories (rateType)
+{
+	resp = 0;
+	if (rateType > 3)
+	{
+		while (resp<2)
+		{
+			fprintf (stdout, "Choose the number of classes in the discretized distribution (>=2):");
+			fscanf  (stdin, "Number", resp);
+		}
+	}
+	return resp;
+}
+			  
+/*-------------------------------------------------------------------------------*/
+
+function SetWDistributionLeaves (rateType)
+{
+	resp = defineNumberOfCategories (rateType);
+	
+	if (rateType == 0)
+	{
+		global P_leaves = .5;
+		P_leaves:<1;
+		categFreqMatrix_leaves = {{P_leaves,1-P_leaves}};
+		categRateMatrix_leaves = {{0,1}};
+		category category_leaves = (2, categFreqMatrix_leaves , MEAN, ,categRateMatrix_leaves, 0, 1e25);
+	}
+	else
+	{
+		if (rateType == 1)
+		{
+			global P1_leaves = 1/3;
+			global P2_leaves = 0;
+			
+			P1_leaves:<1;
+			P2_leaves:<1;
+			
+			global W_leaves = .5;
+			categFreqMatrix_leaves = {{P1_leaves,(1-P1_leaves)*P2_leaves, (1-P1_leaves)*(1-P2_leaves)}} ;
+			categRateMatrix_leaves = {{0,1,W_leaves}};
+			category category_leaves = (3, categFreqMatrix_leaves , MEAN, ,categRateMatrix_leaves, 0, 1e25);
+		}		
+		else
+		{
+			if (rateType == 2)
+			{
+				global P1_leaves = 1/3;
+				global P2_leaves = .5;
+				P1_leaves:<1;
+				P2_leaves:<1;
+				global W1_leaves = .25;
+				global R_1_leaves = 4;
+				global R_2_leaves = 3;
+				R_1_leaves:<1;
+				R_2_leaves:>1;
+				categFreqMatrix_leaves = {{P1_leaves,(1-P1_leaves)*P2_leaves, (1-P1_leaves)*(1-P2_leaves)}} ;
+				categRateMatrix_leaves = {{W1_leaves*R_1_leaves,W1_leaves,W1_leaves*R_2_leaves}};
+				category category_leaves = (3, categFreqMatrix_leaves , MEAN, ,categRateMatrix_leaves, 0, 1e25);				
+			}
+			else
+			{
+				if (rateType == 3)
+				{
+					global P1_leaves = 1/5;
+					global P2_leaves = 1/4;
+					global P3_leaves = 1/3;
+					global P4_leaves = 1/2;
+					
+					P1_leaves:<1;
+					P2_leaves:<1;
+					P3_leaves:<1;
+					P4_leaves:<1;
+					
+					categFreqMatrix_leaves = {{P1_leaves,
+										(1-P1_leaves)P2_leaves,
+										(1-P1_leaves)(1-P2_leaves)*P3_leaves,
+										(1-P1_leaves)(1-P2_leaves)(1-P3_leaves)P4_leaves,
+										(1-P1_leaves)(1-P2_leaves)(1-P3_leaves)(1-P4_leaves)}} ;
+					categRateMatrix_leaves = {{0,1/3,2/3,1,3}};
+					category category_leaves = (5, categFreqMatrix_leaves , MEAN, ,categRateMatrix_leaves, 0, 1e25);				
+				}
+				else
+				{
+					if (rateType == 4)
+					{
+						global alpha_leaves = .5;
+						global beta_leaves = 1;
+						alpha_leaves:>0.01;alpha_leaves:<100;
+						beta_leaves:>0.01;
+						beta_leaves:<200;
+						category category_leaves = (resp, EQUAL, MEAN, GammaDist(_x_,alpha_leaves,beta_leaves), CGammaDist(_x_,alpha_leaves,beta_leaves), 0 , 
+				 			 		  1e25,CGammaDist(_x_,alpha_leaves+1,beta_leaves)*alpha_leaves/beta_leaves);
+					}
+					else
+					{
+						if (rateType == 5)
+						{
+							global alpha_leaves = .5;
+							global beta_leaves  =  1;
+							global alpha2_leaves=  .75;
+							global P_leaves	 = .5; 
+							alpha_leaves:>0.01;alpha_leaves:<100;
+							beta_leaves:>0.01;
+							beta_leaves:<200;
+							P_leaves:<1;
+							alpha2_leaves:>0.01;alpha2_leaves:<100;
+							category category_leaves = (resp, EQUAL, MEAN, P_leaves*GammaDist(_x_,alpha_leaves,beta_leaves) + (1-P_leaves)*GammaDist(_x_,alpha2_leaves,alpha2_leaves)
+														   , P_leaves*CGammaDist(_x_,alpha_leaves,beta_leaves) + (1-P_leaves)*CGammaDist(_x_,alpha2_leaves,alpha2_leaves), 
+														   0 , 1e25,
+														   P_leaves*CGammaDist(_x_,alpha_leaves+1,beta_leaves)*alpha_leaves/beta_leaves + (1-P_leaves)*CGammaDist(_x_,alpha2_leaves+1,alpha2_leaves));
+						}
+						else
+						{
+							if (rateType == 6)
+							{
+								global betaP_leaves = 1;
+								global betaQ_leaves = 1;
+								betaP_leaves:>0.05;betaP_leaves:<85;
+								betaQ_leaves:>0.05;betaQ_leaves:<85;
+								category category_leaves = (resp, EQUAL, MEAN, _x_^(betaP_leaves-1)*(1-_x_)^(betaQ_leaves-1)/Beta(betaP_leaves,betaQ_leaves), IBeta(_x_,betaP_leaves,betaQ_leaves), 0 , 
+						 			 		  1,IBeta(_x_,betaP_leaves+1,betaQ_leaves)*betaP_leaves/(betaP_leaves+betaQ_leaves));
+							}
+							else
+							{
+								if (rateType == 7)
+								{
+									global W_leaves = 2;
+									W_leaves:>1;
+									global P_leaves	 = 1-1/(resp+1);
+									global betaP_leaves = 1;
+									global betaQ_leaves = 2;
+									betaP_leaves:>0.05;
+									betaQ_leaves:>0.05;
+									betaP_leaves:<85;
+									betaQ_leaves:<85;
+									P_leaves:>0.0000001;
+									P_leaves:<0.9999999;
+									categFreqMatrix_leaves = {resp+1,1};
+									for (k=0; k<resp; k=k+1)
+									{
+										categFreqMatrix_leaves[k]:=P_leaves/resp__;
+									}
+									categFreqMatrix_leaves[resp]:=(1-P_leaves);
+									category category_leaves = (resp+1, categFreqMatrix_leaves, MEAN, 
+													P_leaves*_x_^(betaP_leaves-1)*(1-Min(_x_,1))^(betaQ_leaves-1)/Beta(betaP_leaves,betaQ_leaves)+W_leaves-W_leaves, 
+													P_leaves*IBeta(Min(_x_,1),betaP_leaves,betaQ_leaves)+(1-P_leaves)*(_x_>=W_leaves), 
+													0,1e25,
+													P_leaves*IBeta(Min(_x_,1),betaP_leaves+1,betaQ_leaves)*betaP_leaves/(betaP_leaves+betaQ_leaves)+(1-P_leaves)*W_leaves*(_x_>=W_leaves));
+								}
+								else
+								{
+									if (rateType == 8)
+									{
+										global P_leaves	 = .5;
+										global betaP_leaves = 1;
+										global betaQ_leaves = 2;
+										betaP_leaves:>0.05;betaP_leaves:<85;
+										betaQ_leaves:>0.05;betaQ_leaves:<85;
+										global alpha_leaves = .5;
+										global beta_leaves  = 1;
+										alpha_leaves:>0.01;alpha_leaves:<100;
+										beta_leaves:>0.01;										
+										beta_leaves:<200;
+										P_leaves:<1;
+										category category_leaves = (resp, EQUAL, MEAN, 
+															P_leaves*_x_^(betaP_leaves-1)*(1-Min(_x_,1))^(betaQ_leaves-1)/Beta(betaP_leaves,betaQ_leaves)+(1-P_leaves)*GammaDist(_x_,alpha_leaves,beta_leaves), 
+															P_leaves*IBeta(Min(_x_,1),betaP_leaves,betaQ_leaves)+(1-P_leaves)*CGammaDist(_x_,alpha_leaves,beta_leaves), 
+															0,1e25,
+															P_leaves*betaP_leaves/(betaP_leaves+betaQ_leaves)*IBeta(Min(_x_,1),betaP_leaves+1,betaQ_leaves)+(1-P_leaves)*alpha_leaves/beta_leaves*CGammaDist(_x_,alpha_leaves+1,beta_leaves));
+									}	
+									else
+									{
+										if (rateType == 9)
+										{
+											global P_leaves	 = .5;
+											P_leaves:<1;
+											global betaP_leaves = 1;
+											betaP_leaves:>0.05;betaP_leaves:<85;
+											global betaQ_leaves = 2;
+											betaQ_leaves:>0.05;betaQ_leaves:<85;
+											global alpha_leaves = .5;
+											alpha_leaves:>0.01;alpha_leaves:<100;
+											global beta_leaves  = 1;
+											beta_leaves:>0.01;beta_leaves:<500;
+											category category_leaves = (resp, EQUAL, MEAN, 
+																P_leaves*_x_^(betaP_leaves-1)*(1-Min(_x_,1))^(betaQ_leaves-1)/Beta(betaP_leaves,betaQ_leaves)+(1-P_leaves)*(_x_>1)*GammaDist(Max(1e-20,_x_-1),alpha_leaves,beta_leaves), 
+																P_leaves*IBeta(Min(_x_,1),betaP_leaves,betaQ_leaves)+(1-P_leaves)*CGammaDist(Max(_x_-1,0),alpha_leaves,beta_leaves), 
+																0,1e25,
+																P_leaves*betaP_leaves/(betaP_leaves+betaQ_leaves)*IBeta(Min(_x_,1),betaP_leaves+1,betaQ_leaves)+
+																		(1-P_leaves)*(alpha_leaves/beta_leaves*CGammaDist(Max(0,_x_-1),alpha_leaves+1,beta_leaves)+CGammaDist(Max(0,_x_-1),alpha_leaves,beta_leaves)));
+										}				
+										else
+										{
+											if (rateType == 10)
+											{
+												global P_leaves	 = .5;
+												global betaP_leaves = 1;
+												global betaQ_leaves = 2;
+												betaP_leaves:>0.05;
+												betaQ_leaves:>0.05;
+												betaP_leaves:<85;
+												betaQ_leaves:<85;
+												global mu_leaves = 3;
+												global sigma_leaves  = .01;
+												sigma_leaves:>0.0001;
+												sqrt2pi = Sqrt(8*Arctan(1));
+												P_leaves:<1;
+
+												category category_leaves = (resp, EQUAL, MEAN, 
+																P_leaves*_x_^(betaP_leaves-1)*(1-Min(_x_,1))^(betaQ_leaves-1)/Beta(betaP_leaves,betaQ_leaves)+
+																	(1-P_leaves)*(_x_>=1)*Exp(-(_x_-mu_leaves)(_x_-mu_leaves)/(2*sigma_leaves*sigma_leaves))/(sqrt2pi__*sigma_leaves)/ZCDF((mu_leaves-1)/sigma_leaves), 
+																P_leaves*IBeta(Min(_x_,1),betaP_leaves,betaQ_leaves)+(1-P_leaves)*(_x_>=1)*(1-ZCDF((mu_leaves-_x_)/sigma_leaves)/ZCDF((mu_leaves-1)/sigma_leaves)), 
+																0,1e25,
+																P_leaves*betaP_leaves/(betaP_leaves+betaQ_leaves)*IBeta(Min(_x_,1),betaP_leaves+1,betaQ_leaves)+
+																(1-P_leaves)*(_x_>=1)*(mu_leaves*(1-ZCDF((1-mu_leaves)/sigma_leaves)-ZCDF((mu_leaves-_x_)/sigma_leaves))+
+																sigma_leaves*(Exp((mu_leaves-1)(1-mu_leaves)/(2*sigma_leaves*sigma_leaves))-Exp((_x_-mu_leaves)(mu_leaves-_x_)/(2*sigma_leaves*sigma_leaves)))/sqrt2pi__)/ZCDF((mu_leaves-1)/sigma_leaves));
+											}				
+											else
+											{
+												if (rateType == 11)
+												{
+													global P_leaves	 = 1/3;
+													global P1_leaves    = .5;
+
+													global mu_leaves = 3;
+													global sigma_leaves  = .5;
+													sigma_leaves:>0.0001;
+													global sigma1_leaves  = 1;
+													sigma1_leaves:>0.0001;
+
+													sqrt2pi = Sqrt(8*Arctan(1));
+													P_leaves:<1;
+													P1_leaves:<1;
+													
+													categFreqMatrix_leaves = {resp+1,1};
+													for (k=1; k<=resp; k=k+1)
+													{
+														categFreqMatrix_leaves[k]:=(1-P_leaves)/resp__;
+													}
+													categFreqMatrix_leaves[0]:=P_leaves;
+
+													category category_leaves = (resp+1, categFreqMatrix_leaves, MEAN,
+																	(1-P_leaves)((1-P1_leaves)*Exp(-(_x_-mu_leaves)(_x_-mu_leaves)/(2*sigma1_leaves*sigma1_leaves))/(sqrt2pi__*sigma1_leaves)/ZCDF(mu_leaves/sigma1_leaves)+
+																			  P1_leaves*Exp(-(_x_-1)(_x_-1)/(2*sigma_leaves*sigma_leaves))/(sqrt2pi__*sigma_leaves)/ZCDF(1/sigma_leaves)), 
+																	P_leaves+(1-P_leaves)(_x_>1e-20)((1-P1_leaves)(1-ZCDF((mu_leaves-_x_)/sigma1_leaves)/ZCDF(mu_leaves/sigma1_leaves))+
+																						P1_leaves*(1-ZCDF((1-_x_)/sigma_leaves)/ZCDF(1/sigma_leaves))), 
+																	0,1e25,
+																	(1-P_leaves)((1-P1_leaves)(mu_leaves*(1-ZCDF(-mu_leaves/sigma1_leaves)-ZCDF((mu_leaves-_x_)/sigma1_leaves))+
+																	sigma1_leaves*(Exp(-mu_leaves*mu_leaves/(2*sigma1_leaves*sigma1_leaves))-Exp((_x_-mu_leaves)(mu_leaves-_x_)/(2*sigma1_leaves*sigma1_leaves)))/sqrt2pi__)/ZCDF(mu_leaves/sigma1_leaves)+
+																	P_leaves(1-ZCDF(-1/sigma_leaves)-ZCDF((1-_x_)/sigma_leaves)+
+																	sigma_leaves*(Exp(-1/(2*sigma_leaves*sigma_leaves))-Exp((_x_-1)(1-_x_)/(2*sigma_leaves*sigma_leaves)))/sqrt2pi__)/ZCDF(1/sigma_leaves))
+																 );
+												}
+												else		
+												{
+													if (rateType == 12)
+													{
+														global P_leaves	 = 1/3;
+														global P1_leaves    = .5;
+
+														global mu_leaves = 3;
+														global sigma_leaves  = .25;
+														global sigma1_leaves = .5;
+														global sigma2_leaves = 1;
+														sigma_leaves:>0.0001;
+														sigma1_leaves:>0.0001;
+														sigma2_leaves:>0.0001;
+
+														sqrt2pi = Sqrt(8*Arctan(1));
+														P_leaves:<1;
+														P1_leaves:<1;
+
+														category category_leaves = (resp, EQUAL , MEAN,
+																		2*P_leaves*Exp(-_x_^2/(2*sigma_leaves*sigma_leaves))+
+																		(1-P_leaves)((1-P1_leaves)*Exp((_x_-mu_leaves)(mu_leaves-_x_)/(2*sigma2_leaves*sigma2_leaves))/(sqrt2pi__*sigma2_leaves)/ZCDF(mu_leaves/sigma2_leaves)+
+																			  P1_leaves*Exp((1-_x_)(_x_-1)/(2*sigma1_leaves*sigma1_leaves))/(sqrt2pi__*sigma1_leaves)/ZCDF(1/sigma1_leaves)), 
+																		P_leaves*(1-2*ZCDF(-_x_/sigma_leaves))+
+																		(1-P_leaves)((1-P1_leaves)(1-ZCDF((mu_leaves-_x_)/sigma2_leaves)/ZCDF(mu_leaves/sigma2_leaves))+
+																			   P1_leaves*(1-ZCDF((1-_x_)/sigma1_leaves)/ZCDF(1/sigma1_leaves))), 
+																		0,1e25,
+																		2*P_leaves*sigma_leaves*(1-Exp(-_x_*_x_/(2*sigma_leaves*sigma_leaves)))/sqrt2pi__+
+																		(1-P_leaves)((1-P1_leaves)(mu_leaves*(1-ZCDF(-mu_leaves/sigma2_leaves)-ZCDF((mu_leaves-_x_)/sigma2_leaves))+
+																		sigma2_leaves*(Exp(-mu_leaves*mu_leaves/(2*sigma2_leaves*sigma2_leaves))-Exp((_x_-mu_leaves)(mu_leaves-_x_)/(2*sigma2_leaves*sigma2_leaves)))/sqrt2pi__)/ZCDF(mu_leaves/sigma2_leaves)+
+																		P1_leaves(1-ZCDF(-1/sigma1_leaves)-ZCDF((1-_x_)/sigma1_leaves)+
+																		sigma1_leaves*(Exp(-1/(2*sigma1_leaves*sigma1_leaves))-Exp((_x_-1)(1-_x_)/(2*sigma1_leaves*sigma1_leaves)))/sqrt2pi__)/ZCDF(mu_leaves/sigma1_leaves))
+																		);
+													}				
+												}				
+											}				
+										}				
+									}						
+								}
+							}
+						}
+					}				
+				}	
+			}	
+		}	
+	}		
+	return 0;
+}
+
+/*-------------------------------------------------------------------------------*/
+
+function ConstrainRateDistributionLeaves (rateType)
+{
+	if (rateType == 0)
+	{
+		P_leaves:=P_inodes;
+	}
+	else
+	{
+		if (rateType == 1)
+		{
+			P1_leaves := P1_inodes;
+			P2_leaves := P2_inodes;
+		}		
+		else
+		{
+			if (rateType == 2)
+			{
+				P1_leaves  := P1_inodes;
+				P2_leaves  := P2_inodes;
+				W1_leaves  := W1_inodes;
+				R_1_leaves := R_1_inodes;
+				R_2_leaves := R_2_inodes;
+			}
+			else
+			{
+				if (rateType == 3)
+				{
+					P1_leaves := P1_inodes;
+					P2_leaves := P2_inodes;
+					P3_leaves := P3_inodes;
+					P4_leaves := P4_inodes;
+				}
+				else
+				{
+					if (rateType == 4)
+					{
+						alpha_leaves := alpha_inodes;
+						beta_leaves  := beta_inodes;
+						
+					}
+					else
+					{
+						if (rateType == 5)
+						{
+							alpha_leaves :=  alpha_inodes;
+							beta_leaves  :=  beta_inodes;
+							alpha2_leaves:=  alpha2_inodes;
+							P_leaves	 :=  P_leaves; 
+						}
+						else
+						{
+							if (rateType == 6)
+							{
+								betaP_leaves := betaP_inodes;
+								betaQ_leaves := betaQ_inodes;
+							}
+							else
+							{
+								if (rateType == 7)
+								{
+									W_leaves     := W_inodes;
+									P_leaves	 := P_inodes;
+									betaP_leaves := betaP_inodes;
+									betaQ_leaves := betaQ_inodes;
+								}
+								else
+								{
+									if (rateType == 8)
+									{
+										P_leaves	 := P_inodes;
+										betaP_leaves := betaP_inodes;
+										betaQ_leaves := betaQ_inodes;
+										alpha_leaves := alpha_inodes;
+										beta_leaves  := beta_inodes;
+									}	
+									else
+									{
+										if (rateType == 9)
+										{
+											P_leaves	 := P_inodes;
+											betaP_leaves := betaP_inodes;
+											betaQ_leaves := betaQ_inodes;
+											alpha_leaves := alpha_inodes;
+											beta_leaves  := beta_inodes;
+										}				
+										else
+										{
+											if (rateType == 10)
+											{
+												P_leaves	 := P_inodes;
+												betaP_leaves := betaP_inodes;
+												betaQ_leaves := betaQ_inodes;
+												mu_leaves =  := mu_inodes;
+												sigma_leaves := sigma_inodes;
+											}				
+											else
+											{
+												if (rateType == 11)
+												{
+													P_leaves	 := P_inodes;
+													P1_leaves    := P1_inodes;
+													mu_leaves    := mu_inodes;
+													sigma_leaves := sigma_inodes;
+													sigma1_leaves:= sigma1_inodes;
+												}
+												else		
+												{
+													if (rateType == 12)
+													{
+														P_leaves	  := P_inodes;
+														P1_leaves     := P1_inodes;
+														mu_leaves     := mu_inodes;
+														sigma_leaves  := sigma_inodes;
+														sigma1_leaves := sigma1_inodes;
+														sigma2_leaves := sigma2_inodes;
+													}				
+												}				
+											}				
+										}				
+									}						
+								}
+							}
+						}
+					}				
+				}	
+			}	
+		}	
+	}		
+	return 0;
+}
+
+/*-------------------------------------------------------------------------------*/
+
+function SetWDistributionINodes (rateType)
+{
+	resp = defineNumberOfCategories (rateType);
+	
+	if (rateType == 0)
+	{
+		global P_inodes = .5;
+		P_inodes:<1;
+		categFreqMatrix_inodes = {{P_inodes,1-P_inodes}};
+		categRateMatrix_inodes = {{0,1}};
+		category category_inodes = (2, categFreqMatrix_inodes , MEAN, ,categRateMatrix_inodes, 0, 1e25);
+	}
+	else
+	{
+		if (rateType == 1)
+		{
+			global P1_inodes = 1/3;
+			global P2_inodes = 0;
+			
+			P1_inodes:<1;
+			P2_inodes:<1;
+			
+			global W_inodes = .5;
+			categFreqMatrix_inodes = {{P1_inodes,(1-P1_inodes)*P2_inodes, (1-P1_inodes)*(1-P2_inodes)}} ;
+			categRateMatrix_inodes = {{0,1,W_inodes}};
+			category category_inodes = (3, categFreqMatrix_inodes , MEAN, ,categRateMatrix_inodes, 0, 1e25);
+		}		
+		else
+		{
+			if (rateType == 2)
+			{
+				global P1_inodes = 1/3;
+				global P2_inodes = .5;
+				P1_inodes:<1;
+				P2_inodes:<1;
+				global W1_inodes = .25;
+				global R_1_inodes = 4;
+				global R_2_inodes = 3;
+				R_1_inodes:<1;
+				R_2_inodes:>1;
+				categFreqMatrix_inodes = {{P1_inodes,(1-P1_inodes)*P2_inodes, (1-P1_inodes)*(1-P2_inodes)}} ;
+				categRateMatrix_inodes = {{W1_inodes*R_1_inodes,W1_inodes,W1_inodes*R_2_inodes}};
+				category category_inodes = (3, categFreqMatrix_inodes , MEAN, ,categRateMatrix_inodes, 0, 1e25);				
+			}
+			else
+			{
+				if (rateType == 3)
+				{
+					global P1_inodes = 1/5;
+					global P2_inodes = 1/4;
+					global P3_inodes = 1/3;
+					global P4_inodes = 1/2;
+					
+					P1_inodes:<1;
+					P2_inodes:<1;
+					P3_inodes:<1;
+					P4_inodes:<1;
+					
+					categFreqMatrix_inodes = {{P1_inodes,
+										(1-P1_inodes)P2_inodes,
+										(1-P1_inodes)(1-P2_inodes)*P3_inodes,
+										(1-P1_inodes)(1-P2_inodes)(1-P3_inodes)P4_inodes,
+										(1-P1_inodes)(1-P2_inodes)(1-P3_inodes)(1-P4_inodes)}} ;
+					categRateMatrix_inodes = {{0,1/3,2/3,1,3}};
+					category category_inodes = (5, categFreqMatrix_inodes , MEAN, ,categRateMatrix_inodes, 0, 1e25);				
+				}
+				else
+				{
+					if (rateType == 4)
+					{
+						global alpha_inodes = .5;
+						global beta_inodes = 1;
+						alpha_inodes:>0.01;alpha_inodes:<100;
+						beta_inodes:>0.01;
+						beta_inodes:<200;
+						category category_inodes = (resp, EQUAL, MEAN, GammaDist(_x_,alpha_inodes,beta_inodes), CGammaDist(_x_,alpha_inodes,beta_inodes), 0 , 
+				 			 		  1e25,CGammaDist(_x_,alpha_inodes+1,beta_inodes)*alpha_inodes/beta_inodes);
+					}
+					else
+					{
+						if (rateType == 5)
+						{
+							global alpha_inodes = .5;
+							global beta_inodes  =  1;
+							global alpha2_inodes=  .75;
+							global P_inodes	 = .5; 
+							alpha_inodes:>0.01;alpha_inodes:<100;
+							beta_inodes:>0.01;
+							beta_inodes:<200;
+							P_inodes:<1;
+							alpha2_inodes:>0.01;alpha2_inodes:<100;
+							category category_inodes = (resp, EQUAL, MEAN, P_inodes*GammaDist(_x_,alpha_inodes,beta_inodes) + (1-P_inodes)*GammaDist(_x_,alpha2_inodes,alpha2_inodes)
+														   , P_inodes*CGammaDist(_x_,alpha_inodes,beta_inodes) + (1-P_inodes)*CGammaDist(_x_,alpha2_inodes,alpha2_inodes), 
+														   0 , 1e25,
+														   P_inodes*CGammaDist(_x_,alpha_inodes+1,beta_inodes)*alpha_inodes/beta_inodes + (1-P_inodes)*CGammaDist(_x_,alpha2_inodes+1,alpha2_inodes));
+						}
+						else
+						{
+							if (rateType == 6)
+							{
+								global betaP_inodes = 1;
+								global betaQ_inodes = 1;
+								betaP_inodes:>0.05;betaP_inodes:<85;
+								betaQ_inodes:>0.05;betaQ_inodes:<85;
+								category category_inodes = (resp, EQUAL, MEAN, _x_^(betaP_inodes-1)*(1-_x_)^(betaQ_inodes-1)/Beta(betaP_inodes,betaQ_inodes), IBeta(_x_,betaP_inodes,betaQ_inodes), 0 , 
+						 			 		  1,IBeta(_x_,betaP_inodes+1,betaQ_inodes)*betaP_inodes/(betaP_inodes+betaQ_inodes));
+							}
+							else
+							{
+								if (rateType == 7)
+								{
+									global W_inodes = 2;
+									W_inodes:>1;
+									global P_inodes	 = 1-1/(resp+1);
+									global betaP_inodes = 1;
+									global betaQ_inodes = 2;
+									betaP_inodes:>0.05;
+									betaQ_inodes:>0.05;
+									betaP_inodes:<85;
+									betaQ_inodes:<85;
+									P_inodes:>0.0000001;
+									P_inodes:<0.9999999;
+									categFreqMatrix_inodes = {resp+1,1};
+									for (k=0; k<resp; k=k+1)
+									{
+										categFreqMatrix_inodes[k]:=P_inodes/resp__;
+									}
+									categFreqMatrix_inodes[resp]:=(1-P_inodes);
+									category category_inodes = (resp+1, categFreqMatrix_inodes, MEAN, 
+													P_inodes*_x_^(betaP_inodes-1)*(1-Min(_x_,1))^(betaQ_inodes-1)/Beta(betaP_inodes,betaQ_inodes)+W_inodes-W_inodes, 
+													P_inodes*IBeta(Min(_x_,1),betaP_inodes,betaQ_inodes)+(1-P_inodes)*(_x_>=W_inodes), 
+													0,1e25,
+													P_inodes*IBeta(Min(_x_,1),betaP_inodes+1,betaQ_inodes)*betaP_inodes/(betaP_inodes+betaQ_inodes)+(1-P_inodes)*W_inodes*(_x_>=W_inodes));
+								}
+								else
+								{
+									if (rateType == 8)
+									{
+										global P_inodes	 = .5;
+										global betaP_inodes = 1;
+										global betaQ_inodes = 2;
+										betaP_inodes:>0.05;betaP_inodes:<85;
+										betaQ_inodes:>0.05;betaQ_inodes:<85;
+										global alpha_inodes = .5;
+										global beta_inodes  = 1;
+										alpha_inodes:>0.01;alpha_inodes:<100;
+										beta_inodes:>0.01;										
+										beta_inodes:<200;
+										P_inodes:<1;
+										category category_inodes = (resp, EQUAL, MEAN, 
+															P_inodes*_x_^(betaP_inodes-1)*(1-Min(_x_,1))^(betaQ_inodes-1)/Beta(betaP_inodes,betaQ_inodes)+(1-P_inodes)*GammaDist(_x_,alpha_inodes,beta_inodes), 
+															P_inodes*IBeta(Min(_x_,1),betaP_inodes,betaQ_inodes)+(1-P_inodes)*CGammaDist(_x_,alpha_inodes,beta_inodes), 
+															0,1e25,
+															P_inodes*betaP_inodes/(betaP_inodes+betaQ_inodes)*IBeta(Min(_x_,1),betaP_inodes+1,betaQ_inodes)+(1-P_inodes)*alpha_inodes/beta_inodes*CGammaDist(_x_,alpha_inodes+1,beta_inodes));
+									}	
+									else
+									{
+										if (rateType == 9)
+										{
+											global P_inodes	 = .5;
+											P_inodes:<1;
+											global betaP_inodes = 1;
+											betaP_inodes:>0.05;betaP_inodes:<85;
+											global betaQ_inodes = 2;
+											betaQ_inodes:>0.05;betaQ_inodes:<85;
+											global alpha_inodes = .5;
+											alpha_inodes:>0.01;alpha_inodes:<100;
+											global beta_inodes  = 1;
+											beta_inodes:>0.01;beta_inodes:<500;
+											category category_inodes = (resp, EQUAL, MEAN, 
+																P_inodes*_x_^(betaP_inodes-1)*(1-Min(_x_,1))^(betaQ_inodes-1)/Beta(betaP_inodes,betaQ_inodes)+(1-P_inodes)*(_x_>1)*GammaDist(Max(1e-20,_x_-1),alpha_inodes,beta_inodes), 
+																P_inodes*IBeta(Min(_x_,1),betaP_inodes,betaQ_inodes)+(1-P_inodes)*CGammaDist(Max(_x_-1,0),alpha_inodes,beta_inodes), 
+																0,1e25,
+																P_inodes*betaP_inodes/(betaP_inodes+betaQ_inodes)*IBeta(Min(_x_,1),betaP_inodes+1,betaQ_inodes)+
+																		(1-P_inodes)*(alpha_inodes/beta_inodes*CGammaDist(Max(0,_x_-1),alpha_inodes+1,beta_inodes)+CGammaDist(Max(0,_x_-1),alpha_inodes,beta_inodes)));
+										}				
+										else
+										{
+											if (rateType == 10)
+											{
+												global P_inodes	 = .5;
+												global betaP_inodes = 1;
+												global betaQ_inodes = 2;
+												betaP_inodes:>0.05;
+												betaQ_inodes:>0.05;
+												betaP_inodes:<85;
+												betaQ_inodes:<85;
+												global mu_inodes = 3;
+												global sigma_inodes  = .01;
+												sigma_inodes:>0.0001;
+												sqrt2pi = Sqrt(8*Arctan(1));
+												P_inodes:<1;
+
+												category category_inodes = (resp, EQUAL, MEAN, 
+																P_inodes*_x_^(betaP_inodes-1)*(1-Min(_x_,1))^(betaQ_inodes-1)/Beta(betaP_inodes,betaQ_inodes)+
+																	(1-P_inodes)*(_x_>=1)*Exp(-(_x_-mu_inodes)(_x_-mu_inodes)/(2*sigma_inodes*sigma_inodes))/(sqrt2pi__*sigma_inodes)/ZCDF((mu_inodes-1)/sigma_inodes), 
+																P_inodes*IBeta(Min(_x_,1),betaP_inodes,betaQ_inodes)+(1-P_inodes)*(_x_>=1)*(1-ZCDF((mu_inodes-_x_)/sigma_inodes)/ZCDF((mu_inodes-1)/sigma_inodes)), 
+																0,1e25,
+																P_inodes*betaP_inodes/(betaP_inodes+betaQ_inodes)*IBeta(Min(_x_,1),betaP_inodes+1,betaQ_inodes)+
+																(1-P_inodes)*(_x_>=1)*(mu_inodes*(1-ZCDF((1-mu_inodes)/sigma_inodes)-ZCDF((mu_inodes-_x_)/sigma_inodes))+
+																sigma_inodes*(Exp((mu_inodes-1)(1-mu_inodes)/(2*sigma_inodes*sigma_inodes))-Exp((_x_-mu_inodes)(mu_inodes-_x_)/(2*sigma_inodes*sigma_inodes)))/sqrt2pi__)/ZCDF((mu_inodes-1)/sigma_inodes));
+											}				
+											else
+											{
+												if (rateType == 11)
+												{
+													global P_inodes	 = 1/3;
+													global P1_inodes    = .5;
+
+													global mu_inodes = 3;
+													global sigma_inodes  = .5;
+													sigma_inodes:>0.0001;
+													global sigma1_inodes  = 1;
+													sigma1_inodes:>0.0001;
+
+													sqrt2pi = Sqrt(8*Arctan(1));
+													P_inodes:<1;
+													P1_inodes:<1;
+													
+													categFreqMatrix_inodes = {resp+1,1};
+													for (k=1; k<=resp; k=k+1)
+													{
+														categFreqMatrix_inodes[k]:=(1-P_inodes)/resp__;
+													}
+													categFreqMatrix_inodes[0]:=P_inodes;
+
+													category category_inodes = (resp+1, categFreqMatrix_inodes, MEAN,
+																	(1-P_inodes)((1-P1_inodes)*Exp(-(_x_-mu_inodes)(_x_-mu_inodes)/(2*sigma1_inodes*sigma1_inodes))/(sqrt2pi__*sigma1_inodes)/ZCDF(mu_inodes/sigma1_inodes)+
+																			  P1_inodes*Exp(-(_x_-1)(_x_-1)/(2*sigma_inodes*sigma_inodes))/(sqrt2pi__*sigma_inodes)/ZCDF(1/sigma_inodes)), 
+																	P_inodes+(1-P_inodes)(_x_>1e-20)((1-P1_inodes)(1-ZCDF((mu_inodes-_x_)/sigma1_inodes)/ZCDF(mu_inodes/sigma1_inodes))+
+																						P1_inodes*(1-ZCDF((1-_x_)/sigma_inodes)/ZCDF(1/sigma_inodes))), 
+																	0,1e25,
+																	(1-P_inodes)((1-P1_inodes)(mu_inodes*(1-ZCDF(-mu_inodes/sigma1_inodes)-ZCDF((mu_inodes-_x_)/sigma1_inodes))+
+																	sigma1_inodes*(Exp(-mu_inodes*mu_inodes/(2*sigma1_inodes*sigma1_inodes))-Exp((_x_-mu_inodes)(mu_inodes-_x_)/(2*sigma1_inodes*sigma1_inodes)))/sqrt2pi__)/ZCDF(mu_inodes/sigma1_inodes)+
+																	P_inodes(1-ZCDF(-1/sigma_inodes)-ZCDF((1-_x_)/sigma_inodes)+
+																	sigma_inodes*(Exp(-1/(2*sigma_inodes*sigma_inodes))-Exp((_x_-1)(1-_x_)/(2*sigma_inodes*sigma_inodes)))/sqrt2pi__)/ZCDF(1/sigma_inodes))
+																 );
+												}
+												else		
+												{
+													if (rateType == 12)
+													{
+														global P_inodes	 = 1/3;
+														global P1_inodes    = .5;
+
+														global mu_inodes = 3;
+														global sigma_inodes  = .25;
+														global sigma1_inodes = .5;
+														global sigma2_inodes = 1;
+														sigma_inodes:>0.0001;
+														sigma1_inodes:>0.0001;
+														sigma2_inodes:>0.0001;
+
+														sqrt2pi = Sqrt(8*Arctan(1));
+														P_inodes:<1;
+														P1_inodes:<1;
+
+														category category_inodes = (resp, EQUAL , MEAN,
+																		2*P_inodes*Exp(-_x_^2/(2*sigma_inodes*sigma_inodes))+
+																		(1-P_inodes)((1-P1_inodes)*Exp((_x_-mu_inodes)(mu_inodes-_x_)/(2*sigma2_inodes*sigma2_inodes))/(sqrt2pi__*sigma2_inodes)/ZCDF(mu_inodes/sigma2_inodes)+
+																			  P1_inodes*Exp((1-_x_)(_x_-1)/(2*sigma1_inodes*sigma1_inodes))/(sqrt2pi__*sigma1_inodes)/ZCDF(1/sigma1_inodes)), 
+																		P_inodes*(1-2*ZCDF(-_x_/sigma_inodes))+
+																		(1-P_inodes)((1-P1_inodes)(1-ZCDF((mu_inodes-_x_)/sigma2_inodes)/ZCDF(mu_inodes/sigma2_inodes))+
+																			   P1_inodes*(1-ZCDF((1-_x_)/sigma1_inodes)/ZCDF(1/sigma1_inodes))), 
+																		0,1e25,
+																		2*P_inodes*sigma_inodes*(1-Exp(-_x_*_x_/(2*sigma_inodes*sigma_inodes)))/sqrt2pi__+
+																		(1-P_inodes)((1-P1_inodes)(mu_inodes*(1-ZCDF(-mu_inodes/sigma2_inodes)-ZCDF((mu_inodes-_x_)/sigma2_inodes))+
+																		sigma2_inodes*(Exp(-mu_inodes*mu_inodes/(2*sigma2_inodes*sigma2_inodes))-Exp((_x_-mu_inodes)(mu_inodes-_x_)/(2*sigma2_inodes*sigma2_inodes)))/sqrt2pi__)/ZCDF(mu_inodes/sigma2_inodes)+
+																		P1_inodes(1-ZCDF(-1/sigma1_inodes)-ZCDF((1-_x_)/sigma1_inodes)+
+																		sigma1_inodes*(Exp(-1/(2*sigma1_inodes*sigma1_inodes))-Exp((_x_-1)(1-_x_)/(2*sigma1_inodes*sigma1_inodes)))/sqrt2pi__)/ZCDF(mu_inodes/sigma1_inodes))
+																		);
+													}				
+												}				
+											}				
+										}				
+									}						
+								}
+							}
+						}
+					}				
+				}	
+			}	
+		}	
+	}		
+	return 0;
+}
+
+/* ____________________________________________________________________________________________________________________*/
+
+function FrameText (frameChar,vertChar,parOff,theText)
+{
+	h = Abs (theText)+4;
+	fprintf (stdout,"\n");	
+	for (k=0; k<parOff; k=k+1)
+	{
+		fprintf (stdout," ");
+	}
+	for (k=0; k<h;k=k+1)
+	{
+		fprintf (stdout,frameChar);
+	}
+	fprintf (stdout,"\n");	
+	for (k=0; k<parOff; k=k+1)
+	{
+		fprintf (stdout," ");
+	}
+	fprintf (stdout,vertChar," ",theText," ",vertChar,"\n");
+	for (k=0; k<parOff; k=k+1)
+	{
+		fprintf (stdout," ");
+	}
+	for (k=0; k<h;k=k+1)
+	{
+		fprintf (stdout,frameChar);
+	}
+	fprintf (stdout,"\n");	
+	return 0;
+}
+
+/* ____________________________________________________________________________________________________________________*/
+
+function BuildCodonFrequencies4 (obsF)
+{
+	PIStop = 1.0;
+	result = {ModelMatrixDimension,1};
+	hshift = 0;
+
+	for (h=0; h<64; h=h+1)
+	{
+		first = h$16;
+		second = h%16$4;
+		third = h%4;
+		if (_Genetic_Code[h]==10) 
+		{
+			hshift = hshift+1;
+			PIStop = PIStop-obsF[first][0]*obsF[second][0]*obsF[third][0];
+			continue; 
+		}
+		result[h-hshift][0]=obsF[first][0]*obsF[second][0]*obsF[third][0];
+	}
+	return result*(1.0/PIStop);
+}
+
+/* ____________________________________________________________________________________________________________________*/
+
+function BuildCodonFrequencies12 (obsF)
+{
+	PIStop = 1.0;
+	result = {ModelMatrixDimension,1};
+	hshift = 0;
+
+	for (h=0; h<64; h=h+1)
+	{
+		first = h$16;
+		second = h%16$4;
+		third = h%4;
+		if (_Genetic_Code[h]==10) 
+		{
+			hshift = hshift+1;
+			PIStop = PIStop-obsF[first][0]*obsF[second][1]*obsF[third][2];
+			continue; 
+		}
+		result[h-hshift][0]=obsF[first][0]*obsF[second][1]*obsF[third][2];
+	}
+	return result*(1.0/PIStop);
+}
+
+/* ____________________________________________________________________________________________________________________*/
+
+function PopulateModelMatrix (ModelMatrixName&, EFV, modelType, catVar&,kappa&,R1&,R2&,R3&,R4&,R5&)
+{
+	ModelMatrixName = {ModelMatrixDimension,ModelMatrixDimension}; 
+
+	hshift = 0;
+	
+	if (modelType==0)
+	{
+		for (h=0; h<64; h=h+1)
+		{
+			if (_Genetic_Code[h]==10) 
+			{
+				hshift = hshift+1;
+				continue; 
+			}
+			vshift = hshift;
+			for (v = h+1; v<64; v=v+1)
+			{
+				diff = v-h;
+				if (_Genetic_Code[v]==10) 
+				{
+					vshift = vshift+1;
+					continue; 
+				}
+			  	if ((h$4==v$4)||((diff%4==0)&&(h$16==v$16))||(diff%16==0))
+			  	{
+			  		if (h$4==v$4)
+			  		{
+			  			transition = v%4;
+			  			transition2= h%4;
+			  		}
+			  		else
+			  		{
+			  			if(diff%16==0)
+			  			{
+			  				transition = v$16;
+			  				transition2= h$16;
+			  			}
+			  			else
+			  			{
+			  				transition = v%16$4;
+			  				transition2= h%16$4;
+			  			}
+			  		}
+			  		if (_Genetic_Code[0][h]==_Genetic_Code[0][v]) 
+			  		{
+			  			ModelMatrixName[h-hshift][v-vshift] := t*EFV__[transition__];
+			  			ModelMatrixName[v-vshift][h-hshift] := t*EFV__[transition2__];
+				  	}
+			  		else
+			  		{
+				  		ModelMatrixName[h-hshift][v-vshift] := catVar*t*EFV__[transition__];
+			  			ModelMatrixName[v-vshift][h-hshift] := catVar*t*EFV__[transition2__];
+		  			}
+			  	}
+			  }
+		}
+	}
+	else
+	{
+		if (modelType==1)
+		{
+			for (h=0; h<64; h=h+1)
+			{
+				if (_Genetic_Code[h]==10) 
+				{
+					hshift = hshift+1;
+					continue; 
+				}
+				vshift = hshift;
+				for (v = h+1; v<64; v=v+1)
+				{
+					diff = v-h;
+					if (_Genetic_Code[v]==10) 
+					{
+						vshift = vshift+1;
+						continue; 
+					}
+					nucPosInCodon = 2;
+				  	if ((h$4==v$4)||((diff%4==0)&&(h$16==v$16))||(diff%16==0))
+				  	{
+				  		if (h$4==v$4)
+				  		{
+				  			transition = v%4;
+				  			transition2= h%4;
+				  		}
+				  		else
+				  		{
+				  			if(diff%16==0)
+				  			{
+				  				transition = v$16;
+				  				transition2= h$16;
+								nucPosInCodon = 0;
+				  			}
+				  			else
+				  			{
+				  				transition = v%16$4;
+				  				transition2= h%16$4;
+								nucPosInCodon = 1;
+				  			}
+				  		}
+				  		if (_Genetic_Code[0][h]==_Genetic_Code[0][v]) 
+				  		{
+				  			ModelMatrixName[h-hshift][v-vshift] := t*EFV__[transition__][nucPosInCodon__];
+				  			ModelMatrixName[v-vshift][h-hshift] := t*EFV__[transition2__][nucPosInCodon__];
+					  	}
+				  		else
+				  		{
+					  		ModelMatrixName[h-hshift][v-vshift] := catVar*t*EFV__[transition__][nucPosInCodon__];
+				  			ModelMatrixName[v-vshift][h-hshift] := catVar*t*EFV__[transition2__][nucPosInCodon__];
+			  			}
+				  	}
+				  }
+			}
+		}
+		else
+		{
+			if (modelType<4)
+			{
+				for (h=0; h<64; h=h+1)
+				{
+					if (_Genetic_Code[h]==10) 
+					{
+						hshift = hshift+1;
+						continue; 
+					}
+					vshift = hshift;
+					for (v = h+1; v<64; v=v+1)
+					{
+						diff = v-h;
+						if (_Genetic_Code[v]==10) 
+						{
+							vshift = vshift+1;
+							continue; 
+						}
+					  	if ((h$4==v$4)||((diff%4==0)&&(h$16==v$16))||(diff%16==0))
+					  	{
+					  		if (h$4==v$4)
+					  		{
+					  			transition = v%4;
+					  			transition2= h%4;
+					  		}
+					  		else
+					  		{
+					  			if(diff%16==0)
+					  			{
+					  				transition = v$16;
+					  				transition2= h$16;
+					  			}
+					  			else
+					  			{
+					  				transition = v%16$4;
+					  				transition2= h%16$4;
+					  			}
+					  		}
+					  		if (_Genetic_Code[0][h]==_Genetic_Code[0][v]) 
+					  		{
+					  			if (Abs(transition-transition2)%2)
+					  			{
+					  				ModelMatrixName[h-hshift][v-vshift] := kappa*t;
+					  				ModelMatrixName[v-vshift][h-hshift] := kappa*t;
+					  			}
+					  			else
+					  			{
+					  				ModelMatrixName[h-hshift][v-vshift] := t;
+					  				ModelMatrixName[v-vshift][h-hshift] := t;
+					  			}
+					  			
+						  	}
+					  		else
+					  		{
+					  			if (Abs(transition-transition2)%2)
+					  			{
+					  				ModelMatrixName[h-hshift][v-vshift] := kappa*catVar*t;
+					  				ModelMatrixName[v-vshift][h-hshift] := kappa*catVar*t;
+					  			}
+					  			else
+					  			{
+					  				ModelMatrixName[h-hshift][v-vshift] := catVar*t;
+					  				ModelMatrixName[v-vshift][h-hshift] := catVar*t;
+					  			}
+						  	}
+					  	}	
+					 }
+				}	
+			}
+			else
+			{
+				for (h=0; h<64; h=h+1)
+				{
+					if (_Genetic_Code[h]==10) 
+					{
+						hshift = hshift+1;
+						continue; 
+					}
+					vshift = hshift;
+					for (v = h+1; v<64; v=v+1)
+					{
+						diff = v-h;
+						if (_Genetic_Code[v]==10) 
+						{
+							vshift = vshift+1;
+							continue; 
+						}
+						nucPosInCodon = 2;
+					  	if ((h$4==v$4)||((diff%4==0)&&(h$16==v$16))||(diff%16==0))
+					  	{
+					  		if (h$4==v$4)
+					  		{
+					  			transition = v%4;
+					  			transition2= h%4;
+					  		}
+					  		else
+					  		{
+					  			if(diff%16==0)
+					  			{
+					  				transition = v$16;
+					  				transition2= h$16;
+									nucPosInCodon = 0;
+					  			}
+					  			else
+					  			{
+					  				transition = v%16$4;
+					  				transition2= h%16$4;
+									nucPosInCodon = 1;
+					  			}
+					  		}
+					  		
+					  		if (modelType == 4)
+					  		{
+					  			nucPosInCodon = 0;
+					  		}
+					  		
+					  		rateKind = mSpecMatrix[transition][transition2];
+					  		
+					  		if (rateKind == 1)
+					  		{
+						  		if (_Genetic_Code[0][h]==_Genetic_Code[0][v]) 
+						  		{
+						  			ModelMatrixName[h-hshift][v-vshift] := synRate*EFV__[transition__][nucPosInCodon__];
+						  			ModelMatrixName[v-vshift][h-hshift] := synRate*EFV__[transition2__][nucPosInCodon__];
+							  	}
+						  		else
+						  		{
+							  		ModelMatrixName[h-hshift][v-vshift] := catVar*synRate*EFV__[transition__][nucPosInCodon__];
+						  			ModelMatrixName[v-vshift][h-hshift] := catVar*synRate*EFV__[transition2__][nucPosInCodon__];
+					  			}
+					  		}
+					  		else
+					  		{
+						  		if (rateKind == 2)
+						  		{
+							  		if (_Genetic_Code[0][h]==_Genetic_Code[0][v]) 
+							  		{
+							  			ModelMatrixName[h-hshift][v-vshift] := R1*synRate*EFV__[transition__][nucPosInCodon__];
+							  			ModelMatrixName[v-vshift][h-hshift] := R1*synRate*EFV__[transition2__][nucPosInCodon__];
+								  	}
+							  		else
+							  		{
+								  		ModelMatrixName[h-hshift][v-vshift] := R1*catVar*synRate*EFV__[transition__][nucPosInCodon__];
+							  			ModelMatrixName[v-vshift][h-hshift] := R1*catVar*synRate*EFV__[transition2__][nucPosInCodon__];
+						  			}
+						  		}
+						  		else
+						  		{
+							  		if (rateKind == 3)
+							  		{
+								  		if (_Genetic_Code[0][h]==_Genetic_Code[0][v]) 
+								  		{
+								  			ModelMatrixName[h-hshift][v-vshift] := R2*synRate*EFV__[transition__][nucPosInCodon__];
+								  			ModelMatrixName[v-vshift][h-hshift] := R2*synRate*EFV__[transition2__][nucPosInCodon__];
+									  	}
+								  		else
+								  		{
+									  		ModelMatrixName[h-hshift][v-vshift] := R2*catVar*synRate*EFV__[transition__][nucPosInCodon__];
+								  			ModelMatrixName[v-vshift][h-hshift] := R2*catVar*synRate*EFV__[transition2__][nucPosInCodon__];
+							  			}
+							  		}
+							  		else
+							  		{
+								  		if (rateKind == 4)
+								  		{
+									  		if (_Genetic_Code[0][h]==_Genetic_Code[0][v]) 
+									  		{
+									  			ModelMatrixName[h-hshift][v-vshift] := R3*synRate*EFV__[transition__][nucPosInCodon__];
+									  			ModelMatrixName[v-vshift][h-hshift] := R3*synRate*EFV__[transition2__][nucPosInCodon__];
+										  	}
+									  		else
+									  		{
+										  		ModelMatrixName[h-hshift][v-vshift] := R3*catVar*synRate*EFV__[transition__][nucPosInCodon__];
+									  			ModelMatrixName[v-vshift][h-hshift] := R3*catVar*synRate*EFV__[transition2__][nucPosInCodon__];
+								  			}
+								  		}
+								  		else
+								  		{
+									  		if (rateKind == 5)
+									  		{
+										  		if (_Genetic_Code[0][h]==_Genetic_Code[0][v]) 
+										  		{
+										  			ModelMatrixName[h-hshift][v-vshift] := R4*synRate*EFV__[transition__][nucPosInCodon__];
+										  			ModelMatrixName[v-vshift][h-hshift] := R4*synRate*EFV__[transition2__][nucPosInCodon__];
+											  	}
+										  		else
+										  		{
+											  		ModelMatrixName[h-hshift][v-vshift] := R4*catVar*synRate*EFV__[transition__][nucPosInCodon__];
+										  			ModelMatrixName[v-vshift][h-hshift] := R4*catVar*synRate*EFV__[transition2__][nucPosInCodon__];
+									  			}
+									  		}
+									  		else
+									  		{
+										  		if (_Genetic_Code[0][h]==_Genetic_Code[0][v]) 
+										  		{
+										  			ModelMatrixName[h-hshift][v-vshift] := R5*synRate*EFV__[transition__][nucPosInCodon__];
+										  			ModelMatrixName[v-vshift][h-hshift] := R5*synRate*EFV__[transition2__][nucPosInCodon__];
+											  	}
+										  		else
+										  		{
+											  		ModelMatrixName[h-hshift][v-vshift] := R5*catVar*synRate*EFV__[transition__][nucPosInCodon__];
+										  			ModelMatrixName[v-vshift][h-hshift] := R5*catVar_inodes*synRate*EFV__[transition2__][nucPosInCodon__];
+									  			}
+									  		}
+									  	}
+								  	}
+							  	}
+						  	}
+					  	}
+					}
+				}	
+			}
+		}
+	 }
+	 return ((modelType>1)&&(modelType<4));
+}
+
+/* ____________________________________________________________________________________________________________________*/
+
+
+function GetDistributionParameters (distrInfo, infix)
+{
+	D = Columns(distrInfo);
+	E = 0.0;
+	T = 0.0;
+	sampleVar = 0.0;
+	for (k=0; k<D; k=k+1)
+	{
+		T = distrInfo[0][k]*distrInfo[1][k];
+		E = E+T;
+		sampleVar = T*distrInfo[0][k]+sampleVar;
+	}
+	sampleVar = sampleVar-E*E;
+
+	fprintf  (summaryFile,"\n\n---------------",infix,"-------------------\n\nExpected Value = ",E, " (sample variance = ",sampleVar,")\n");
+	fprintf  (stdout,"\n\n---------------",infix,"-------------------\n\nExpected Value = ",E, " (sample variance = ",sampleVar,")\n");
+	for (k=0; k<D; k=k+1)
+	{
+		fprintf (stdout,"\nRate[",Format(k+1,0,0),"]=",
+				 Format(distrInfo[0][k],12,8), " (weight=", Format(distrInfo[1][k],9,7),")");
+		fprintf (summaryFile,"\nRate[",Format(k+1,0,0),"]=",
+				 Format(distrInfo[0][k],12,8), " (weight=", Format(distrInfo[1][k],9,7),")");
+	}
+	
+	for (k=0; k<D; k=k+1)
+	{
+		if (distrInfo[0][k]>1) break;
+	}
+	
+	return (D-k);
+}
+
+
+/* ____________________________________________________________________________________________________________________*/
+
+NICETY_LEVEL = 3;
+
+/* ----- Define genetic code and the appropriate state space dimensions ----- */
+
+#include "TemplateModels/chooseGeneticCode.def";
+
+ModelMatrixDimension = 64;
+for (h = 0 ;h<64; h=h+1)
+{
+	if (_Genetic_Code[h]==10)
+	{
+		ModelMatrixDimension = ModelMatrixDimension-1;
+	}
+}
+
+SetDialogPrompt ("Please specify a codon data file:");
+
+DataSet ds = ReadDataFile (PROMPT_FOR_FILE);
+
+dataFile   = LAST_FILE_PATH;
+
+DataSetFilter filteredData = CreateFilter (ds,3,"","",GeneticCodeExclusions);
+
+dummyVar = FrameText ("-","|",2,"READ THE FOLLOWING DATA");
+
+fprintf (stdout,"\n",ds);
+
+/* ----- Read the tree and assign different models to leaves and internal nodes ----- */
+
+if (IS_TREE_PRESENT_IN_DATA)
+{
+	fprintf (stdout, "\n\nA tree was found in the data file:\n",DATAFILE_TREE,"\n\nWould you like to use it:(Y/N)?");
+	fscanf (stdin, "String", response);
+	if ((response=="n")||(response=="N"))
+	{
+		IS_TREE_PRESENT_IN_DATA = 0;
+	}
+	else
+	{
+		treeString = DATAFILE_TREE;
+		IS_TREE_PRESENT_IN_DATA = 1;
+	}
+	fprintf (stdout, "\n\n");
+
+}
+
+if (!IS_TREE_PRESENT_IN_DATA)
+{
+	SetDialogPrompt ("Please select a tree file for the data:");
+	fscanf (PROMPT_FOR_FILE, "String", treeString);
+}
+
+treeString = RerootTree (treeString,0);
+
+newTreeString = treeString[0];
+
+dummy = 0;
+
+for (sI=1; sI<Abs(treeString); sI = sI+1)
+{
+	tC = treeString[sI];
+	if ((tC == ",")||(tC == ")"))
+	{
+		if (treeString[sI-1]!=")")
+		{
+			newTreeString = newTreeString + "{LeafModel}" + tC;
+			continue;
+		}
+		else
+		{
+			dummy = 1;
+		}
+	}
+	newTreeString = newTreeString+tC;
+}
+
+if (dummy == 0)
+{
+	fprintf (stdout, "\n********* ERROR ***********\nThe tree must have at least one internal branch for this analysis to make sense\n\n");
+	return 0;
+}
+
+treeString = newTreeString;
+newTreeString = "";
+
+fprintf (stdout, "RUNNING BIVARIATE (LEAVES AND INTERNAL NODES) POSITIVE SELECTION ANALYSIS ON\n", dataFile, "\n\n");
+
+/* ----- Output files ----- */
+
+fprintf (stdout, "\nThis analysis will write out two output files, one with MLEs and other summary data,\nand the other with marginal likelihoods for each site suitable for further data processing.\n");
+
+SetDialogPrompt ("Please select a file to write summary data to:");
+fprintf (PROMPT_FOR_FILE,CLEAR_FILE,"RUNNING BIVARIATE (LEAVES AND INTERNAL NODES) POSITIVE SELECTION ANALYSIS ON\n", dataFile, "\n\n");
+summaryFile = LAST_FILE_PATH;
+
+SetDialogPrompt ("Please select a file to write marginal likelihood data to:");
+fprintf (PROMPT_FOR_FILE,CLEAR_FILE);
+marginalFile = LAST_FILE_PATH;
+
+/* ----- User selection phase for rate distribution ----- */
+
+ChoiceList (rateSelection,"Rate variation for leaves and internal nodes.",1,SKIP_NONE,
+			"Independent","Rate distributions are chosen independently.",
+			"Constrained","Rate distributions are the same. Rates are still sampled independently for leaves and internal nodes at each site.");
+		    
+
+ChoiceList (rate4Leaves,"Rate distribution for leaves",1,SKIP_NONE,
+			"Neutral","Neutral",
+  			"Selection","Selection",
+		    "Discrete","Discrete",
+		    "Freqs","Freqs",
+		    "Gamma","Gamma",
+		    "2 Gamma","2 Gamma",
+		    "Beta","Beta",
+		    "Beta & w","Beta & w",
+		    "Beta & Gamma","Beta & Gamma",
+		    "Beta & (Gamma+1)","Beta & (Gamma+1)",
+		    "Beta & (Normal>1)","Beta & (Normal>1)",
+		    "0 & 2 (Normal>1)","0 & 2 (Normal>1)",
+		    "3 Normal","3 Normal");
+
+if (rate4Leaves < 0)
+{
+	return 0;
+}
+
+dummy = SetWDistributionLeaves (rate4Leaves);
+fprintf (stdout, "Using \"",ModelNames[rate4Leaves], "\" distribution for leaf nodes\n");
+fprintf (summaryFile, "Using \"",ModelNames[rate4Leaves], "\" distribution for leaf nodes\n");
+
+if (resp>0)
+{
+	fprintf (stdout, \nUsing ", 	   Format (resp,0,0), " discretized categories.\n");
+	fprintf (summaryFile, \nUsing ", Format (resp,0,0), " discretized categories.\n");
+}
+
+if (rateSelection == 0)
+{
+	ChoiceList (rate4inodes,"Rate distribution for internal nodes",1,SKIP_NONE,
+				"Neutral","Neutral",
+	  			"Selection","Selection",
+			    "Discrete","Discrete",
+			    "Freqs","Freqs",
+			    "Gamma","Gamma",
+			    "2 Gamma","2 Gamma",
+			    "Beta","Beta",
+			    "Beta & w","Beta & w",
+			    "Beta & Gamma","Beta & Gamma",
+			    "Beta & (Gamma+1)","Beta & (Gamma+1)",
+			    "Beta & (Normal>1)","Beta & (Normal>1)",
+			    "0 & 2 (Normal>1)","0 & 2 (Normal>1)",
+			    "3 Normal","3 Normal");
+			    
+	if (rate4inodes < 0)
+	{
+		return 0;
+	}
+
+}
+else
+{
+	rate4inodes = rate4Leaves'
+}
+
+dummy = SetWDistributionINodes (rate4inodes);
+fprintf (stdout, "Using \"",ModelNames[rate4inodes], "\" distribution for internal nodes\n");
+fprintf (summaryFile, "Using \"",ModelNames[rate4inodes], "\" distribution for internal nodes\n");
+
+if (resp>0)
+{
+	fprintf (stdout, "\nUsing ", 	   Format (resp,0,0), " discretized categories.\n");
+	fprintf (summaryFile, "\nUsing ", Format (resp,0,0), " discretized categories.\n");
+}
+
+if (rateSelection == 1)
+{
+	dummy = ConstrainRateDistributionLeaves (rate4Leaves);
+}
+
+ChoiceList (modelSelection,"Select models for leaves and internal nodes.",1,SKIP_NONE,
+			"Independent","Model choices for are made independently. Equilibrium frequencies are the same.",
+			"Constrained","Rate matrices AND model parameters are the same.");
+
+
+if (modelSelection < 0)
+{
+	return 0;
+}
+
+/* ----- User selection phase for the models ----- */
+
+ChoiceList (modelTypeL,"Choose a model for leaves",1,SKIP_NONE,
+			"MG94 1x4","Muse-Gaut 94 model with 4(-1) nucleotide frequency parameters (intra-codon position independent).",
+			"MG94 3x4","Muse-Gaut 94 model with 12(-3) nucleotide frequency parameters (intra-codon position specific).",
+			"GY94 1x4","Goldman-Yang 94 model with 4(-1) nucleotide frequency parameters (intra-codon position independent).",
+			"GY94 3x4","Goldman-Yang 94 model with 12(-3) nucleotide frequency parameters (intra-codon position specific).",
+			"MG94 Custom 1x4", "Muse-Gaut 94 crossed with an arbitrary nucelotide substitution model with 4(-1) nucleotide frequency parameters (intra-codon position independent).",
+			"MG94 Custom 3x4", "Muse-Gaut 94 crossed with an arbitrary nucelotide substitution model with 12(-3) nucleotide frequency parameters (intra-codon position specific)."
+);
+		    
+if (modelTypeL<0)
+{
+	return 0;
+}
+
+if ((modelTypeL==0)||(modelTypeL==2)||(modelTypeL==4))
+{
+	HarvestFrequencies (observedFreq,filteredData,1,1,0);
+	vectorOfFrequencies = BuildCodonFrequencies4 (observedFreq);
+}
+else
+{
+	HarvestFrequencies (observedFreq,filteredData,3,1,1);
+	vectorOfFrequencies = BuildCodonFrequencies12 (observedFreq);
+}
+
+if (modelTypeL>3)
+{
+	dummy = defineCustomModel (0);
+}
+
+LeafModelM = 0;
+INodeModelM = 0;
+
+dummy = reportModelType (modelTypeL," leaf nodes ", modelDesc);
+
+if (modelSelection==1)
+{
+	global R1 = 1;
+	global R2 = 1;
+	global R3 = 1;
+	global R4 = 1;
+	global R5 = 1;
+	global kappa = 1;
+	dummy = PopulateModelMatrix ("LeafModelM",observedFreq,modelTypeL,"category_leaves", "kappa","R1","R2","R3","R4","R5");
+	Model 	LeafModel = (LeafModelM,vectorOfFrequencies,dummy);
+	dummy = PopulateModelMatrix ("INodeModelM",observedFreq,modelTypeL,"category_inodes", "kappa","R1","R2","R3","R4","R5");
+	Model 	INodeModel = (INodeModelM,vectorOfFrequencies,dummy);
+	dummy = reportModelType (modelTypeL," internal nodes ", modelDesc);
+}
+else
+{
+	global R1_leaves 	= 1;
+	global R2_leaves 	= 1;
+	global R3_leaves 	= 1;
+	global R4_leaves 	= 1;
+	global R5_leaves 	= 1;
+	global kappa_leaves = 1;
+
+	global R1_inodes 	= 1;
+	global R2_inodes 	= 1;
+	global R3_inodes 	= 1;
+	global R4_inodes 	= 1;
+	global R5_inodes 	= 1;
+	global kappa_inodes = 1;
+
+	dummy = PopulateModelMatrix ("LeafModelM",observedFreq,modelTypeL,"category_leaves", "kappa_leaves","R1_leaves","R2_leaves","R3_leaves","R4_leaves","R5_leaves");
+	Model 	LeafModel = (LeafModelM,vectorOfFrequencies,dummy);
+
+	ChoiceList (modelTypeI,"Choose a model for internal nodes",1,SKIP_NONE,
+				"MG94","Muse-Gaut 94 model.",
+				"GY94","Goldman-Yang 94 model",
+				"MG94 Custom", "Muse-Gaut 94 crossed with an arbitrary nucelotide substitution model.");
+
+	if (modelTypeI<0)
+	{
+		return 0;
+	}
+	modelTypeI = modelTypeI * 2;
+
+	if (modelTypeI>3)
+	{
+		dummy = defineCustomModel (0);
+	}
+
+	dummy = PopulateModelMatrix ("INodeModelM",observedFreq,modelTypeI,"category_inodes", "kappa_inodes","R1_inodes","R2_inodes","R3_inodes","R4_inodes","R5_inodes");
+	Model 	INodeModel = (INodeModelM,vectorOfFrequencies,dummy);
+	dummy = reportModelType (modelTypeI," internal nodes ", modelDesc);
+}
+
+
+fprintf (stdout, "\nChoose the cutoff (0 to 1) for posterior of dN/dS>1 for a site to be considered under selective pressure:");
+fscanf  (stdin, "Number",psigLevel);
+if ((psigLevel <= 0)||(psigLevel>1))
+{
+	psigLevel = .95;
+}
+fprintf (stdout, "\n>Using ", psigLevel , " cutoff\n");
+fprintf (summaryFile, "\nUsing ", psigLevel , " cutoff for positive selection.\n");
+				 
+Tree  givenTree 	  = treeString;
+LikelihoodFunction lf = (filteredData,givenTree);
+timer = Time(1);
+Optimize (res,lf);
+
+dummyVar = FrameText ("-","|",2,"RESULTS");
+fprintf (stdout     , lf, "\n");
+fprintf (summaryFile,"\n\n*** RESULTS ***\n\n", lf, "\n");
+
+GetInformation (leavesInfo,category_leaves);
+GetInformation (inodesInfo,category_inodes);
+
+lCategs    = Columns (leavesInfo);
+iCategs    = Columns (inodesInfo);
+mCategs	   = lCategs * iCategs;
+
+ConstructCategoryMatrix(marginals,lf,COMPLETE);
+
+GetInformation (categVarIDs,lf);
+
+if (categVarIDs[0]!="category_leaves")
+{
+	marginalsCorrected = marginals;
+	fprintf (MESSAGE_LOG,"\n.Adjusting marginal matrix rows.\n"); 
+	for (h=0; h<Columns(marginals); h=h+1)
+	{
+		transition = 0;
+		for (diff=0; diff<iCategs; diff = diff+1)
+		{
+			for (v=diff; v<mCategs; v=v+iCategs)
+			{
+				marginalsCorrected[transition][h] = marginals[v][h];
+				transition = transition+1;
+			}
+		}
+	}
+	marginals = marginalsCorrected;
+	marginalsCorrected = 0;
+}
+
+fprintf (marginalFile, leavesInfo, inodesInfo, marginals);
+
+leafOver1  = GetDistributionParameters (leavesInfo, " LEAF NODES RATE DISTRIBUTION ");
+inodeOver1 = GetDistributionParameters (inodesInfo, " INTERNAL NODES RATE DISTRIBUTION ");
+
+if ((inodeOver1<1)&&(leafOver1<1))
+{
+	fprintf (stdout, "\nRATES>1 ARE PRESENT NEITHER IN LEAVES NOR IN INTERNAL NODES.\n");
+	fprintf (summaryFile, "\nRATES>1 ARE PRESENT NEITHER IN LEAVES NOR IN INTERNAL NODES.\n");
+	return 0;
+}
+
+colm = Columns(marginals);
+
+
+resultMatrix = {colm, 3};
+weightMatrix = {1, mCategs};
+
+for (c1 = 0; c1 < lCategs; c1 = c1 + 1)
+{
+	for (c2 = 0; c2 < iCategs; c2 = c2 + 1)
+	{
+		weightMatrix [c1 * iCategs + c2] = leavesInfo[1][c1] * inodesInfo[1][c2];
+	}
+}
+
+fprintf (stdout, weightMatrix, "\n\n");
+
+for (c1 = 0; c1 < colm; c1 = c1+1)
+{
+	E = 0;
+	for (c2 = 0; c2 < mCategs; c2 = c2 + 1)
+	{
+		E = E + weightMatrix[c2] * marginals[c2][c1];
+	}
+	resultMatrix [c1][2] = E;
+}
+
+if (leafOver1>0)
+{
+	for (c1 = 0; c1 < colm; c1 = c1+1)
+	{
+		E = 0;
+		for (c2 = (lCategs-leafOver1)*iCategs; c2 < mCategs; c2 = c2+1)
+		{
+			E = E + weightMatrix[c2] * marginals[c2][c1];
+		}
+		resultMatrix[c1][0] = E/resultMatrix[c1][2];
+	}
+}
+else
+{
+	fprintf (stdout, "\n\nRATES>1 ARE NOT PRESENT IN LEAVES.\n\n");
+	fprintf (summaryFile, "\n\nRATES>1 ARE NOT PRESENT IN LEAVES.\n\n");
+}
+
+if (inodeOver1>0)
+{
+	for (c1 = 0; c1 < colm; c1 = c1+1)
+	{
+		E = 0;
+		for (c2 = (iCategs-inodeOver1); c2 < mCategs; c2 = c2+iCategs)
+		{
+			E = E + weightMatrix[c2] * marginals[c2][c1];
+		}
+		resultMatrix[c1][1] = E/resultMatrix[c1][2];
+	}
+}
+else
+{
+	fprintf (stdout, "\n\nRATES>1 ARE NOT PRESENT IN INTERNAL NODES.\n");
+	fprintf (summaryFile, "\n\nRATES>1 ARE NOT PRESENT IN INTERNAL NODES.\n");
+}
+
+
+dummyVar = FrameText ("-","|",2,"POSITIVE SELECTION RESULT TABLE");
+fprintf (summaryFile, "\n\nPOSITIVE SELECTION RESULT TABLE\n\n");
+
+fprintf (stdout, "Site  P{Leaf dN/dS >= 1} P{Internal Node dN/dS >= 1} PS (Level ", psigLevel, ")\n",
+				 "                                                     LI\n");
+fprintf (summaryFile, "Site  P{Leaf dN/dS >= 1} P{Internal Node dN/dS >= 1} PS (Level ", psigLevel, ")\n",
+				 "                                                     LI\n");
+				 
+if (inodeOver1>0)
+{
+	if (leafOver1>0)
+	{
+		for (c1 = 0; c1 < colm; c1 = c1+1)
+		{
+			if (resultMatrix[c1][0]>=psigLevel)
+			{
+				pss = "+";
+			}
+			else
+			{
+				pss = "-";
+			}
+			if (resultMatrix[c1][1]>=psigLevel)
+			{
+				pss = pss+"+";
+			}
+			else
+			{
+				pss = pss+"-";
+			}
+			
+			fprintf (stdout, Format (c1+1,4,0), " ", Format (resultMatrix[c1][0], 18, 5), "  ", Format (resultMatrix[c1][0], 28, 5), " ", pss, "\n");
+			fprintf (summaryFile, Format (c1+1,4,0), " ", Format (resultMatrix[c1][0], 18, 5), "  ", Format (resultMatrix[c1][0], 28, 5), " ", pss, "\n");
+		}
+	}
+	else
+	{
+		for (c1 = 0; c1 < colm; c1 = c1+1)
+		{
+			pss = "*";
+			
+			if (resultMatrix[c1][1]>=psigLevel)
+			{
+				pss = pss+"+";
+			}
+			else
+			{
+				pss = pss+"-";
+			}
+			
+			fprintf (stdout, Format (c1+1,4,0), " ", Format (0, 18, 5), " ", Format (resultMatrix[c1][0], 28, 5), " ", pss, "\n");
+			fprintf (summaryFile, Format (c1+1,4,0), " ", Format (0, 18, 5), " ", Format (resultMatrix[c1][0], 28, 5), " ", pss, "\n");
+		}
+	
+	}
+}
+else
+{
+	for (c1 = 0; c1 < colm; c1 = c1+1)
+	{
+		if (resultMatrix[c1][0]>=psigLevel)
+		{
+			pss = "+";
+		}
+		else
+		{
+			pss = "-";
+		}
+		pss = pss+"*";
+		
+		fprintf (stdout, Format (c1+1,4,0), " ", Format (resultMatrix[c1][0], 18, 5), " ", Format (0, 28, 5), " ", pss, "\n");
+		fprintf (summaryFile, Format (c1+1,4,0), " ", Format (resultMatrix[c1][0], 18, 5), " ", Format (0, 28, 5), " ", pss, "\n");
+	}
+}
+
+
+resultMatrix2 = {colm, 2};
+
+for (c2=0; c2<colm; c2=c2+1)
+{	
+	resultMatrix2[c2][0] = resultMatrix[c2][0];
+	resultMatrix2[c2][1] = resultMatrix[c2][1];
+}
+
+labelMatrix = {1,2};
+labelMatrix[0] = "Leaves";
+labelMatrix[1] = "Internal Nodes";
+
+OpenWindow (CHARTWINDOW,{{"Prob dN/dS>1"}
+						   {"labelMatrix"},
+						   {"resultMatrix2"},
+						   {"Contrast Bars"},
+						   {"Index"},
+						   {labelMatrix[0]+";"+labelMatrix[1]},
+						   {"Site"},
+						   {""},
+						   {"Prob dN/dS>1"},
+						   {"0"}},
+						   "SCREEN_WIDTH-60;SCREEN_HEIGHT-50;30;50");
+
diff --git a/res/TemplateBatchFiles/QuickSelectionDetection.bf b/res/TemplateBatchFiles/QuickSelectionDetection.bf
new file mode 100644
index 0000000..2c2c2e3
--- /dev/null
+++ b/res/TemplateBatchFiles/QuickSelectionDetection.bf
@@ -0,0 +1,1727 @@
+ExecuteAFile ("qndhelper1.ibf");
+LoadFunctionLibrary ("GrabBag");
+
+REPLACE_TREE_STRUCTURE = 1;
+
+
+ChoiceList  (rOptions,"dN/dS bias parameter options",1,NO_SKIP,
+			 "Neutral","dN/dS=1",
+			 "User","Custom dN/dS value",
+			 "Estimate", "Estimate from data with branch corrections(slower).",
+			 "Estimate + CI", "Estimate dN/dS and a 95% confidence interval from data (slower).",
+			 "Estimate dN/dS only", "Estimate from data without branch corrections."
+);
+	
+
+if (rOptions < 0)
+{
+	return;
+}
+
+if (rOptions == 1)
+{
+	RR = -1.0;
+	while (RR<=0.0)
+	{
+		fprintf (stdout, "\nEnter the value for dNdS = dN/dS (>0):");
+		fscanf 	(stdin,"Number",RR);
+	}
+	dNdS = RR;
+}
+
+ChoiceList  (cOptions,"Ancestor Counting Options",1,NO_SKIP,
+			/*0*/ "Single Ancestor Counting","Use the most likely ancestor state",
+			/*1*/ "Weighted Ancestor Counting","Weigh the contributions of every possible ancestral state (slow)",
+			/*2*/ "Sample Ancestal States","Generate a sample of ancestral state reconstructions to assess single ancestor reliability",
+			/*3*/ "Process Sampled Ancestal States","Process a previously generated sample of ancestral state reconstructions to assess single ancestor reliability",
+			/*4*/ "One rate FEL","Fixed effects site-by-site likelihood estimation. dS is held constant across sites.",
+			/*5*/ "Two rate FEL","Fixed effects site-by-site likelihood estimation. dS adjusted across sites.",
+			/*6*/ "Rate Distribution","Obtain a site-specific distribution of dN and dS, under the assumption that E[dS] = 1. Also obtain an upper bound on rate-variation model likelihood scores.",
+			/*7*/ "Full site-by-site LRT","Each site has a separate dN AND branch lengths. Experimental and VERY slow.",
+			/*8*/ "Multirate FEL","Fixed effects site-by-site likelihood estimation, where non-synonymous rates are split into several classes",
+			/*9*/ "BGM co-evolution","Use a Bayesian graphical model fitted to site substitution patterns to detect co-evolving sites",
+            /*10*/ "MEME", "Mixed effects model of evolution to search for evidence of episodic selection at indvidual sites [EXPERIMENTAL, March 2011]");
+
+
+if (cOptions < 0)
+{
+	return;
+}
+
+#include "qndhelper2.ibf";
+
+fprintf (stdout, "\n\nPhase 4: Ancestral State Reconstruction and Counting\n\n");
+
+
+pooledFreqs = {4,1};
+
+for (k=0; k<4; k=k+1)
+{
+	pooledFreqs[k] = (positionFrequencies[k][0]+positionFrequencies[k][1]+positionFrequencies[k][2])/3;
+}
+
+_EFV_MATRIX0_ = {{1,AC__*pooledFreqs[1],pooledFreqs[2],AT__*pooledFreqs[3]}
+				{AC__*pooledFreqs[0],1,CG__*pooledFreqs[2],CT__*pooledFreqs[3]}
+				{pooledFreqs[0],CG__*pooledFreqs[3],1,GT__*pooledFreqs[3]}
+				{AT__*pooledFreqs[0],CT__*pooledFreqs[3],GT__*pooledFreqs[2],1}};
+
+_EFV_MATRIX1_ 			= _EFV_MATRIX0_;
+_EFV_MATRIX2_ 			= _EFV_MATRIX0_;
+useCustomCountingBias 	= 1;
+
+if (cOptions == 9) // BGM
+{
+		ExecuteAFile ("Distances/CodonToolsMain.def");
+		ExecuteAFile ("BGM.bf");
+		_bgm_data = obtainBGMParameters ("lf");
+		if (Abs(_bgm_data) == 0)
+		{
+			return 0;
+		}
+		
+		ml_bgm_results			= runBGM (_bgm_data);
+		
+		_resamples				= _bgm_data ["RESAMPLE"];
+		_sample_results			= {};
+		_site_map				= _bgm_data["MAP"];
+		_null_map				= {};
+		for (_it = 0; _it < Abs(_site_map); _it = _it+1)
+		{
+			_null_map[_it] = _it;
+		}
+		
+		
+		if (_resamples>0)
+		{
+			_bgm_data["MAP"] = _null_map;
+			for (_it = 0; _it < _resamples; _it = _it + 1)
+			{
+				_bgm_data["MATRIX"]   = obtainSubstitutionMatrix("lf", 1, _site_map, _OBSERVED_NS_);
+				handleMPIBGM (_bgm_data, _it);
+			}
+		}
+												
+		if (_resamples>0 && MPI_NODE_COUNT>1)
+		{
+			bgm_MPI = {MPI_NODE_COUNT-1,1}["-1"];
+			left_to_do = Transpose(bgm_MPI["1"]) * bgm_MPI["_MATRIX_ELEMENT_VALUE_>=0"];
+			for (_it = 0; _it < left_to_do[0]; _it = _it + 1)
+			{
+				handleMPIBGM (0,-1);
+			}
+		}
+
+		columnHeaders = {{"LogL"}};
+		trace = ml_bgm_results[{{0,0}}][{{BGM_MCMC_SAMPLES-1,0}}];	
+		traceStats = GatherDescriptiveStats (trace);
+		rangeY = traceStats["Max"]-traceStats["Min"];
+		if (rangeY == 0)
+		{
+			traceStats["Min"] = traceStats["Min"]-0.5;
+			traceStats["Max"] = traceStats["Max"]+0.5;	
+		}
+		else
+		{
+			traceStats["Min"] = traceStats["Min"]-rangeY;
+			traceStats["Max"] = traceStats["Max"]+rangeY;	
+		}
+		
+		columnHeaders = {{"LogL"}};
+		
+		OpenWindow (CHARTWINDOW,{{"MCMC Trace"}
+				{"columnHeaders"}
+				{"trace"}
+				{"Scatterplot"}
+				{"Index"}
+				{"LogL"}
+				{"Sample"}
+				{""}
+				{"LogL"}
+				{"0"}
+				{""+traceStats["Mean"]}
+				{"-1;-1"}
+				{"10;1.309;0.785398"}
+				{"Times:12:0;Times:10:0;Times:12:2"}
+				{"0;0;16777215;13421772;0;0;16711680;11842740;13158600;14474460;0;3947580;16777215;0;6845928;16771158;2984993;9199669;7018159;1460610;16748822;11184810;14173291"}
+				{"16,"+traceStats["Min"]+","+traceStats["Max"]}
+				},
+				"(SCREEN_WIDTH-30)/3;(SCREEN_HEIGHT-50)/2;10;SCREEN_HEIGHT/2+25");
+				
+		/* now process the edges */
+		
+		nodeCount			= Abs(_site_map);
+		highProbEdges       = {};
+		overHalf		    = {};
+		edgeCount			= nodeCount*(nodeCount-1)$2;
+		
+		allEdges			= {edgeCount,5+3(_resamples > 0)};
+		h2 = 0;
+		
+		SetDialogPrompt		("Spool posterior edge probabilities (as .csv) to");
+		DEFAULT_FILE_SAVE_NAME = "Edge_support.csv";
+		
+		fprintf 			(PROMPT_FOR_FILE,CLEAR_FILE,KEEP_OPEN,"Site1,Site2,Site1->Site2,Site2->Site1,Site1<->Site2");
+		
+		if (_resamples > 0)
+		{
+			fprintf (LAST_FILE_PATH, ",Support for Site1->Site2,Support for Site1->Site2,Support for Site1<->Site2");
+		}
+		
+		for (h=0; h<nodeCount; h=h+1)
+		{
+			for (v=h+1; v<nodeCount; v=v+1)
+			{
+				allEdges[h2][0] = _site_map[h]+1;
+				allEdges[h2][1] = _site_map[v]+1;
+				allEdges[h2][2] = ml_bgm_results[h*nodeCount+v][1];
+				allEdges[h2][3] = ml_bgm_results[v*nodeCount+h][1];
+				allEdges[h2][4] = allEdges[h2][2]+allEdges[h2][3];
+				if (_resamples > 0)
+				{
+					for (_i = 0; _i < _resamples; _i = _i+1)
+					{
+						_ss   = {{(_sample_results[_i])[h*nodeCount+v][1],
+								  (_sample_results[_i])[v*nodeCount+h][1],
+								  0}};
+						_ss [2] = _ss[0] + _ss[1];
+						for (k = 0; k < 3; k=k+1)
+						{
+							allEdges[h2][5+k] = allEdges[h2][5+k]+_ss[k];
+						}
+					}
+					for (k = 0; k < 3; k=k+1)
+					{
+						allEdges[h2][5+k] = allEdges[h2][5+k]/_resamples;
+					}
+				}
+				
+				if (allEdges[h2][4]>=0.95)
+				{
+					highProbEdges[Abs(highProbEdges)] = allEdges[h2][-1];
+				}
+				else
+				{
+					if (allEdges[h2][4]>=0.5)
+					{
+						overHalf[Abs(overHalf)] = allEdges[h2][-1];
+					}				
+				}
+				fprintf (LAST_FILE_PATH,"\n",allEdges[h2][0],",",allEdges[h2][1],",",allEdges[h2][2],",",allEdges[h2][3],",",allEdges[h2][4]);
+				if (_resamples > 0)
+				{
+					for (k=5; k<Columns(allEdges);k=k+1)
+					{
+						fprintf (LAST_FILE_PATH,",",allEdges[h2][k]);
+					}
+				}
+				h2=h2+1;
+			}
+		}
+		fprintf (LAST_FILE_PATH,CLOSE_FILE);
+		
+		if (Abs(highProbEdges))
+		{
+			fprintf (stdout, "Found ", Abs(highProbEdges), " with high (>=0.95) posterior edge support\n");
+		}
+		else
+		{
+			fprintf (stdout, "Found ", 0, " edges with high (>=0.95) posterior support\n",
+							 "Reporting ", Abs(overHalf), " edges with weak (>=0.5) posterior support\n");
+			highProbEdges = overHalf;
+		}
+		
+		reportableEdges = Abs(highProbEdges);
+		if (reportableEdges)
+		{
+			if (_resamples)
+			{
+				fprintf (stdout, "Site 1  Site 2 Edge 1->2 (support) Edge 2->1/ (support) Total; Edge 1<->2 (support)\n");			
+			}
+			else
+			{
+				fprintf (stdout, "Site 1  Site 2 Edge 1->2 Edge 2->1 Total; Edge 1<->2\n");
+			}
+			for (h=0; h<reportableEdges; h=h+1)
+			{
+				fprintf (stdout, Format ((highProbEdges[h])[0],6,0), " ",
+								 Format ((highProbEdges[h])[1],7,0), " ");
+								 
+				if (Columns(highProbEdges[h])>5)
+				{
+					for (k=0; k<3; k=k+1)
+					{
+						fprintf (stdout,Format ((highProbEdges[h])[2+k],9,4), " (", Format ((highProbEdges[h])[5+k],7,3), ")");
+					}
+					fprintf (stdout, "\n");
+				}
+				else
+				{
+					 fprintf (stdout,Format ((highProbEdges[h])[2],9,4), " ",
+									 Format ((highProbEdges[h])[3],9,4), " ",
+									 Format ((highProbEdges[h])[4],18,4), "\n");
+				}
+			}
+			
+			SetDialogPrompt		("Spool a .DOT graph file (display using GraphViz)");
+			DEFAULT_FILE_SAVE_NAME = "BGM.dot";
+			fprintf (PROMPT_FOR_FILE,CLEAR_FILE,KEEP_OPEN);
+			xinches = 8;
+			yinches = 11;
+			
+			isDirected = (num_parents>1);
+			
+			if (isDirected)
+			{
+				fprintf (LAST_FILE_PATH, "di");
+			}
+			
+			fprintf (LAST_FILE_PATH, "graph G{\nratio = \"fill\"; size = \"",xinches,",",yinches,"\"; margin = \"0,0\"; page = \"",xinches,",",yinches,"\";\n node [shape=box]; ");
+			
+			nodeList = {};
+			edges    = "";
+			edges 	 * 128;
+			
+			for (k=0; k < reportableEdges; k=k+1)
+			{
+				node1 = (highProbEdges[k])[0];
+				node2 = (highProbEdges[k])[1];
+				checkNode (node1);
+				checkNode (node2);
+				if (isDirected)
+				{
+					p1 = (highProbEdges[k])[2];
+					p2 = (highProbEdges[k])[3];
+					
+					if (p2>p1)
+					{	
+						n = node2;
+						node2 = node1;
+						node1 = n;
+					}
+					if (_resamples == 0)
+					{
+						edges * ("" + node1 + " -> " + node2 + " [label = \"" + Format (p1,4,2) + "/" + Format (p2,4,2) + "\"]\n");
+					}
+					else
+					{
+						edges * ("" + node1 + " -> " + node2 + " [label = \"" + Format (p1,4,2) + "(" + Format ((highProbEdges[k])[5],4,2) + ")/" + Format (p2,4,2) + "(" + Format ((highProbEdges[k])[6],4,2) + ")\"]\n");					
+					}
+				}
+				else
+				{
+					if (_resamples == 0)
+					{
+						edges * ("" + node1 + " -- " + node2 + " [label = \"" + Format ((highProbEdges[k])[4],4,2) + "\"]\n");
+					}
+					else
+					{
+						edges * ("" + node1 + " -- " + node2 + " [label = \"" + Format ((highProbEdges[k])[4],4,2) + "(" + Format ((highProbEdges[k])[7],4,2) + ")\"]\n");					
+					}
+				}	
+			} 
+			edges 	 * 0;
+			fprintf (LAST_FILE_PATH, "\n", edges, "\n}", CLOSE_FILE);
+		}
+		
+		
+		colMin = 0;
+		colMax = 1;
+		numberOfBins = 50;
+		matrixOfCounts = {numberOfBins, 5};
+		colMax = (colMax-colMin)/numberOfBins;
+	
+		if (colMax==0)
+		{
+			colMax = 0;
+		}
+	
+		for (counter=0; counter < edgeCount; counter = counter+1)
+		{
+			term = Min(((allEdges [counter][4]-colMin)/colMax)$1,numberOfBins-1);
+			matrixOfCounts [term][2] = matrixOfCounts [term][2]+1;
+		}
+		
+		term = 0;
+	
+		for (counter=0; counter < numberOfBins; counter = counter+1)
+		{
+			matrixOfCounts [counter][0] = colMin;
+			term2 = matrixOfCounts [counter][2]/edgeCount;
+			matrixOfCounts [counter][3] = term2;
+			term = term+term2;
+			matrixOfCounts [counter][4] = term;
+			colMin = colMin + colMax;
+			matrixOfCounts [counter][1] = colMin;
+		}
+	
+		labelMatrix = {{"Bin Left Bound","Bin Right Bound", "Raw Count", "Bin Weight", "Cumulative Weight"}};
+		promptString = "Edge Support Posterior Probabilities Histogram";
+		OpenWindow (CHARTWINDOW,{{promptString}
+								   {"labelMatrix"},
+								   {"matrixOfCounts"},
+								   {"Bar Chart"},
+								   {labelMatrix[0]},
+								   {labelMatrix[3]},
+								   {"Posterior Edge Probability"},
+								   {""},
+								   {"Weight"},
+									{"0"}
+									{""}
+									{"-1;-1"}
+									{"10;1.309;0.785398"}
+									{"Times:12:0;Times:10:0;Times:12:2"}
+									{"0;0;16777215;1644825;0;0;6579300;11842740;13158600;14474460;0;3947580;16777215;5000268;6845928;16771158;2984993;9199669;7018159;1460610;16748822;11184810;14173291"}
+									{"16,0,0"}
+									},
+								   "(SCREEN_WIDTH-60)/2;(SCREEN_HEIGHT-50)/2;(SCREEN_WIDTH-60)/2;50");
+	return 0;
+}
+
+if (cOptions == 0) // SLAC
+{
+	synRate = 1;
+	dNdS    = dNdS+1;
+	cBeta   = 0;
+    
+	for (h=0; h<ModelMatrixDimension; h=h+1)
+	{
+		cBeta = cBeta - CodonMatrix[h][h]*codonFrequencies[h];
+	}
+    
+	dNdS 	= dNdS-1;
+	cBeta   = cBeta-blCodon;
+	cAlpha  = blCodon-dNdS*cBeta;
+	
+    branchNames = BranchName (codonTree,-1);
+ 	codonT	= 0;
+    
+    for (h = 0; h < Columns (branchNames) - 1; h+=1)
+    {
+        codonT += Eval ("codonTree."+branchNames[h]+".synRate");
+    }	
+	
+	ChoiceList  (slacOptions,"SLAC Options",1,NO_SKIP,
+				 "Full tree","Analyze the entire tree",
+				 "Tips vs Internals","Analyze terminal and internal branches separately");
+				 
+	if (slacOptions < 0)
+	{	
+		return;
+	}
+
+	if (slacOptions)
+	{
+		ExecuteAFile("SGIvL.bf");
+	}
+	else
+	{
+		ExecuteAFile("SGEmulator.bf");
+		
+		ChoiceList  (cOptions,"Rate class estimator",1,NO_SKIP,
+                    "Skip","Skip the estimation of number of dS and dN rate classes",
+                    "Count","Obtain approximate numbers of dS and dN rate classes supported by the data");
+				 
+		if (cOptions>0)
+		{
+			v = Rows(resultMatrix);
+			scaledRates = {v,2};
+			
+			p  = 1/(codonT*cAlpha);
+			p2 = 1/(codonT*cBeta);
+			
+			cd1 = + (resultMatrix[-1][0]*p);
+			cd2 = + (resultMatrix[-1][1]*p2);
+			
+			p   = p*v/cd1;
+			p2  = p2*dNdS*v/cd2;
+
+			for (h=0; h<v; h=h+1)
+			{
+				scaledRates [h][0] = resultMatrix[h][0]*p;
+				scaledRates [h][1] = resultMatrix[h][1]*p2;
+			}
+			
+			global SMult  = 1;
+			global NSMult = dNdS;
+			
+			dNdS := NSMult/SMult;
+			
+			ClearConstraints (codonTree);
+			ReplicateConstraint ("this1.?.synRate:=SMult*this2.?.synRate__",codonTree,codonTree);
+
+			h = 0.00001;
+			LFCompute (lf,LF_START_COMPUTE);
+			LFCompute (lf,c1);
+			SMult = 1+h;
+			LFCompute (lf,c2);
+			SMult = 1-h;
+			LFCompute (lf,c3);
+			ce = -(c2+c3-2*c1)/(4*h*h)/filteredData.sites;
+			SMult = 1;
+			dNdS = dNdS+h;
+			LFCompute (lf,c2);
+			dNdS = dNdS-2*h;
+			LFCompute (lf,c3);
+			dNdS = dNdS+h;
+			nce = -(c2+c3-2*c1)/(4*h*h)/filteredData.sites;
+
+			fprintf (stdout, "\nApproximate synonymous Information per site: ", ce , "\n"
+							 ,"Approximate non-synonymous Information per site: ", nce , "\n");
+							 
+			LFCompute (lf,LF_DONE_COMPUTE);
+			rateClassCounter (0, ce, "synonymous");
+			rateClassCounter (1, nce, "non-synonymous");
+		}
+	}
+}
+else
+{
+    if (cOptions == 1) // WANC
+	{
+		ExecuteAFile ("WANC.bf");
+	}
+	else
+	{
+        if (cOptions == 2) // Sampler
+		{
+            sampleCount = prompt_for_a_value ("How many ancestral samples should be generated?",1000,1,1e26,1);
+			SetDialogPrompt ("Save data replicates to:");
+			fprintf (PROMPT_FOR_FILE,CLEAR_FILE);
+			FILE_PATH = LAST_FILE_PATH;
+			
+			for (sampleCounter = 1; sampleCounter <= sampleCount; sampleCounter = sampleCounter + 1)
+			{
+				DataSet		  simAnc  = SampleAncestors (lf);
+				DataSetFilter ancData = CreateFilter (simAnc,3,"","",GeneticCodeExclusions);
+				multFact = ancData.sites*3*ancData.species;
+				if (sampleCounter > 1)
+				{
+					fPath = FILE_PATH + "_" + sampleCounter;
+				}
+				else
+				{
+					fPath = FILE_PATH;
+				}
+				fprintf (fPath, CLEAR_FILE, ancData);
+				HarvestFrequencies (nucSimF,  simAnc,1,1,0);
+				fprintf (stdout, "\n\nIteration ", sampleCounter, " nucleotide composition\n",
+								 "A:",nucSimF[0]*multFact, "\n",
+								 "C:",nucSimF[1]*multFact, "\n",
+								 "G:",nucSimF[2]*multFact, "\n",
+								 "T:",nucSimF[3]*multFact, "\n");
+			}
+		}
+		else
+		{
+            if (cOptions == 3) // Sample processor
+			{
+				ExecuteAFile ("SGASimProcessor.bf");
+			}
+			else
+			{
+				GetDataInfo    (dupInfo, filteredData);
+				alreadyDone = {filteredData.unique_sites,1};
+				_lfUBEST	= {filteredData.sites,1};
+				
+				if (cOptions == 6)
+				{
+					global			sFactor = 1;
+					global			nFactor = 1;
+					
+					nFactor:<100;
+					sFactor:<100;
+					
+					ExecuteAFile ("qndhelper3.ibf");
+
+					doneSites    = {filteredData.unique_sites,4};
+					fullSites    = {filteredData.sites,4};
+					Tree		   siteTree = treeString;
+					
+					ReplicateConstraint ("this1.?.synRate   :=sFactor*this2.?.synRate__",siteTree,codonTree);
+					ReplicateConstraint ("this1.?.nonSynRate:=nFactor*this2.?.synRate__",siteTree,codonTree);
+					labels = {{"dS","dN","Log[L]"}};
+					
+					if (MPI_NODE_COUNT<=1)
+					{
+						for (siteCount = 0; siteCount < filteredData.sites; siteCount = siteCount+1)
+						{
+							siteMap = dupInfo[siteCount];
+							if (alreadyDone[siteMap] == 0)
+							{
+								filterString = "" + (siteCount*3) + "-" + (siteCount*3+2);
+								DataSetFilter siteFilter = CreateFilter (ds,3,filterString,"",GeneticCodeExclusions);
+								HarvestFrequencies (f1, siteFilter, 3, 3, 0);
+                                m1 = +(f1["_MATRIX_ELEMENT_VALUE_>0"]); // how many unique characters in this site?
+
+								
+								if (m1>1)
+								{															
+                                    LikelihoodFunction siteLikelihood = (siteFilter, siteTree);
+									sFactor = 1;
+									nFactor	= 1;
+									Optimize (site_res, siteLikelihood);
+									alreadyDone[siteMap]  = 1;
+									doneSites[siteMap][0] = sFactor;
+									doneSites[siteMap][1] = nFactor;
+									doneSites[siteMap][2] = site_res[1][0];
+								}
+								else
+								{
+									sFactor = 0;
+									nFactor = 0;
+									LFCompute (siteLikelihood,LF_START_COMPUTE);
+									LFCompute (siteLikelihood,constLF);
+									LFCompute (siteLikelihood,LF_DONE_COMPUTE);									
+									doneSites[siteMap][0] = sFactor;
+									doneSites[siteMap][1] = nFactor;
+									doneSites[siteMap][2] = constLF;
+								}
+							}
+							ReportSite3 (siteCount, siteMap);				 
+						}	
+					}
+					else
+					{
+						MPINodeState = {MPI_NODE_COUNT-1,2};
+						for (siteCount = 0; siteCount < filteredData.sites; siteCount = siteCount+1)
+						{
+							siteMap = dupInfo[siteCount];
+							if (alreadyDone[siteMap] == 0)
+							{
+								alreadyDone[siteMap] = 1;			
+									
+								filterString = "" + (siteCount*3) + "-" + (siteCount*3+2);
+								DataSetFilter siteFilter = CreateFilter (filteredData,3,filterString,"",GeneticCodeExclusions);
+								HarvestFrequencies (f1, siteFilter, 3, 3, 0);
+								
+                                m1 = +(f1["_MATRIX_ELEMENT_VALUE_>0"]); // how many unique characters in this site?
+								
+								if (m1>1)
+								{			
+                                    LikelihoodFunction siteLikelihood = (siteFilter, siteTree);	
+									sFactor = 1;
+									nFactor	= 1;
+									
+									for (mpiNode = 0; mpiNode < MPI_NODE_COUNT-1; mpiNode = mpiNode+1)
+									{
+										if (MPINodeState[mpiNode][0]==0)
+										{
+											break;	
+										}
+									}
+									
+									if (mpiNode==MPI_NODE_COUNT-1)
+									{
+										mpiNode = ReceiveJobs3 (1);
+									}
+									else
+									{
+										MPISend (mpiNode+1,siteLikelihood);
+										MPINodeState[mpiNode][0] = 1;
+										MPINodeState[mpiNode][1] = siteCount;
+									}
+								}
+								else
+								{
+									sFactor = 0;
+									nFactor = 0;
+									LFCompute (siteLikelihood,LF_START_COMPUTE);
+									LFCompute (siteLikelihood,constLF);
+									LFCompute (siteLikelihood,LF_DONE_COMPUTE);									
+									doneSites[siteMap][0] = sFactor;
+									doneSites[siteMap][1] = nFactor;
+									doneSites[siteMap][2] = constLF;
+									ReportSite3 (siteCount, siteMap);								
+								}
+							}
+						}					
+						while (1)
+						{
+							for (nodeCounter = 0; nodeCounter < MPI_NODE_COUNT-1; nodeCounter = nodeCounter+1)
+							{
+								if (MPINodeState[nodeCounter][0]==1)
+								{
+									fromNode = ReceiveJobs3 (0);
+									break;	
+								}
+							}
+							if (nodeCounter == MPI_NODE_COUNT-1)
+							{
+								break;
+							}
+						}					
+						fprintf (stdout, "\n\n\n");
+						for (siteCount = 0; siteCount < filteredData.sites; siteCount = siteCount+1)
+						{
+							siteMap = dupInfo[siteCount];
+							dummy = ReportSite3 (siteCount, siteMap);				 
+						}
+					}
+				
+					nodeCounter = 0;
+					likelihoodBound = 0;
+
+					for (siteCount = 0; siteCount < filteredData.sites; siteCount = siteCount+1)
+					{
+						nodeCounter 		= nodeCounter + fullSites[siteCount][0];
+						likelihoodBound		= likelihoodBound + fullSites[siteCount][2];
+					}
+					
+					nodeCounter = nodeCounter/filteredData.sites; 
+
+					for (siteCount = 0; siteCount < filteredData.sites; siteCount = siteCount+1)
+					{
+						fullSites[siteCount][0] = fullSites[siteCount][0]/nodeCounter;
+						fullSites[siteCount][1] = fullSites[siteCount][1]/nodeCounter;
+					}
+					
+					OpenWindow (CHARTWINDOW,{{"Data Rates"}
+											   {"labels"},
+											   {"fullSites"},
+											   {"Contrast Bars"},
+											   {"Index"},
+											   {labels[0]+";"+labels[1]},
+											   {"Site Index"},
+											   {labels[1]},
+											   {labels[0]},
+											   {"0"}},
+											   "SCREEN_WIDTH-60;SCREEN_HEIGHT-50;30;50");
+											   
+					SetDialogPrompt ("Save rate results to:");
+					
+					fprintf (stdout, "\n\nApproximate likelihood upper bound = ", likelihoodBound,"\n");
+					siteCount = Columns (fullSites);
+					fprintf (PROMPT_FOR_FILE,CLEAR_FILE,labels[0]);
+					for (nodeCounter=1; nodeCounter<siteCount; nodeCounter=nodeCounter+1)
+					{
+						fprintf (LAST_FILE_PATH,",",labels[nodeCounter]);
+					}
+					
+					for (nodeCounter=0; nodeCounter < Rows (fullSites); nodeCounter = nodeCounter+1)
+					{
+						fprintf (LAST_FILE_PATH,"\n",fullSites[nodeCounter][0]);
+						for (mpiNode=1; mpiNode<siteCount; mpiNode=mpiNode+1)
+						{
+							fprintf (LAST_FILE_PATH,",",fullSites[nodeCounter][mpiNode]);
+						}
+					}									
+				}
+				else
+				{
+                    
+					pValue = prompt_for_a_value ("Significance level for Likelihood Ratio Tests",0.1,0.0,1.0,0);
+					
+                    if (cOptions == 4 || cOptions == 7) // Single rate of full LRT
+					{
+						Tree		   siteTree = treeString;
+						doneSites    = {filteredData.unique_sites,4};
+						fullSites    = {filteredData.sites,4};
+						if (cOptions != 7)
+						{
+							ReplicateConstraint ("this1.?.synRate:=this2.?.synRate__",siteTree,codonTree);						
+						}
+						else
+						{
+							OPTIMIZATION_PRECISION = 0.0001;
+						}
+						
+						labels = {{"dN/dS","LRT","p-value","Log(L)"}};
+						
+						if (MPI_NODE_COUNT <= 1)
+						{
+							for (siteCount = 0; siteCount < filteredData.sites; siteCount = siteCount+1)
+							{
+								siteMap = dupInfo[siteCount];
+								if (alreadyDone[siteMap] == 0)
+								{
+									alreadyDone[siteMap] = 1;					
+									filterString = "";
+									filterString = filterString + (siteCount*3) + "-" + (siteCount*3+2);
+									DataSetFilter siteFilter = CreateFilter (filteredData,3,filterString,"",GeneticCodeExclusions);
+
+									HarvestFrequencies (f1, siteFilter, 3, 3, 0);
+									m1 = 0;
+									for (mpiNode=0; mpiNode < 64; mpiNode=mpiNode+1)
+									{
+										if (f1[mpiNode]>0)
+										{
+											m1=m1+1;
+										}
+									}	
+									
+									if (m1>1)
+									{
+										LikelihoodFunction siteLikelihood = (siteFilter, siteTree);
+										if (cOptions < 7)
+										{
+											dNdS = 1;
+											LFCompute (siteLikelihood,LF_START_COMPUTE);
+											LFCompute (siteLikelihood,nullLF);
+											Optimize (site_res, siteLikelihood);
+										}
+										else
+										{
+											ReplicateConstraint ("this1.?.synRate:=this2.?.synRate__",siteTree,codonTree);						
+											ClearConstraints (siteTree);
+											dNdS := 1;
+											Optimize (site_resN, siteLikelihood);
+											nullLF = site_resN[1][0];
+											dNdS = 1;
+											Optimize (site_res, siteLikelihood);
+										}
+										doneSites[siteMap][0] = dNdS;
+										doneSites[siteMap][1] = 2*(site_res[1][0]-nullLF);
+										doneSites[siteMap][2] = (1-CChi2(doneSites[siteMap][1],1))/2;	
+										doneSites[siteMap][3] = site_res[1][0];	
+									}
+									else
+									{
+										doneSites[siteMap][0] = 1;
+										doneSites[siteMap][1] = 0;
+										doneSites[siteMap][2] = 1.;										
+										doneSites[siteMap][3] = 0.;										
+									}
+								}
+								dummy = ReportSite1 (siteCount, siteMap);				 
+							}
+						}
+						else
+						{
+							MPINodeState = {MPI_NODE_COUNT-1,3};
+							for (siteCount = 0; siteCount < filteredData.sites; siteCount = siteCount+1)
+							{
+								siteMap = dupInfo[siteCount];
+								if (alreadyDone[siteMap] == 0)
+								{
+									alreadyDone[siteMap] = 1;				
+									filterString = "";
+									filterString = filterString + (siteCount*3) + "-" + (siteCount*3+2);
+									DataSetFilter siteFilter = CreateFilter (filteredData,3,filterString,"",GeneticCodeExclusions);
+									
+									HarvestFrequencies (f1, siteFilter, 3, 3, 0);
+									m1 = 0;
+									for (mpiNode=0; mpiNode < 64; mpiNode=mpiNode+1)
+									{
+										if (f1[mpiNode]>0)
+										{
+											m1=m1+1;
+										}
+									}	
+									
+									
+									if (m1>1)
+									{
+										if (cOptions == 7)
+										{
+											ReplicateConstraint ("this1.?.synRate:=this2.?.synRate__",siteTree,codonTree);						
+											ClearConstraints (siteTree);
+										}
+										LikelihoodFunction siteLikelihood = (siteFilter, siteTree);				
+										for (mpiNode = 0; mpiNode < MPI_NODE_COUNT-1; mpiNode = mpiNode+1)
+										{
+											if (MPINodeState[mpiNode][0]==0)
+											{
+												break;	
+											}
+										}
+										
+										if (mpiNode==MPI_NODE_COUNT-1)
+										/* all nodes busy */
+										{
+											if (cOptions == 7)
+											{
+												mpiNode = ReceiveJobs4 (1,1);										
+											}
+											else
+											{
+												mpiNode = ReceiveJobs1 (1);
+											}
+										}
+										else
+										{
+											MPISend (mpiNode+1,siteLikelihood);
+											MPINodeState[mpiNode][0] = 1;
+											MPINodeState[mpiNode][1] = siteCount;
+											MPINodeState[mpiNode][2] = 1;
+										}
+										
+										if (cOptions == 7)
+										{
+											ReplicateConstraint ("this1.?.synRate:=this2.?.synRate__",siteTree,codonTree);						
+											ClearConstraints (siteTree);
+											dNdS := 1;
+											for (mpiNode = 0; mpiNode < MPI_NODE_COUNT-1; mpiNode = mpiNode+1)
+											{
+												if (MPINodeState[mpiNode][0]==0)
+												{
+													break;	
+												}
+											}
+											
+											if (mpiNode==MPI_NODE_COUNT-1)
+											/* all nodes busy */
+											{
+												mpiNode = ReceiveJobs4 (1,0);
+											}
+											else
+											{
+												MPISend (mpiNode+1,siteLikelihood);
+												MPINodeState[mpiNode][0] = 1;
+												MPINodeState[mpiNode][1] = siteCount;
+												MPINodeState[mpiNode][2] = 0;
+											}
+											dNdS = 1;
+										}
+									}
+									else
+									{
+										doneSites[siteMap][0] = 1;
+										doneSites[siteMap][2] = 1;										
+									}
+								}
+							}					
+							while (1)
+							{
+								for (nodeCounter = 0; nodeCounter < MPI_NODE_COUNT-1; nodeCounter = nodeCounter+1)
+								{
+									if (MPINodeState[nodeCounter][0]==1)
+									{
+										if (cOptions == 7)
+										{
+											fromNode = ReceiveJobs4 (0,0);										
+										}
+										else
+										{
+											fromNode = ReceiveJobs1 (0);
+										}
+										break;	
+									}
+								}
+								if (nodeCounter == MPI_NODE_COUNT-1)
+								{
+									break;
+								}
+							}					
+							fprintf (stdout, "\n\n\n");
+							for (siteCount = 0; siteCount < filteredData.sites; siteCount = siteCount+1)
+							{
+								ReportSite1 (siteCount, dupInfo[siteCount]);				 
+							}
+						}
+					}
+					else
+					{
+						SHORT_MPI_RETURN = 1;
+						FEL_RUN_TIMER    = Time(1);
+						FEL_MASTER_TIMER = Time(0);
+						
+						if (cOptions == 5)
+						{
+							ChoiceList  (brOptions,"Branch Options",1,NO_SKIP,
+												 "All","Test for non-neutral evolution on all branches",
+												 "Internal Only","Test for non-neutral evolution on internal branches only",
+												 "A subtree only","Test for non-neutral evolution on a given subtree only only",
+												 "Custom subset","Pick the set of branches which should be tested for presence of selection");
+											 
+							if (brOptions < 0)
+							{
+								return 0;
+							}
+						}
+                        
+                       // VERBOSITY_LEVEL = 10;
+					
+						if (cOptions == 5)
+						{
+                        
+                            OPTIMIZATION_METHOD = 0;
+                            USE_LAST_RESULTS   = 1;
+                            ClearConstraints (codonTree,AC,AT,CG,CT,GT); 
+ 
+                            fprintf (stdout, "\n[RETUNING BRANCH LENGTHS AND NUCLEOTIDE RATES UNDER THE CODON MODEL]\n");
+                            Optimize (codonLF, lf);
+                            fprintf (stdout, "IMPROVED Log(L) BY ", codonLF[1][0]-resC[1][0], " POINTS\n");
+                            AC:=AC__;AT:=AT__;CG:=CG__;CT:=CT__;GT:=GT__;
+                            
+                            OPTIMIZATION_METHOD = 4;
+                                                      
+							ExecuteAFile ("qndhelper3.ibf");				
+							global			sFactor = 1;
+							global			nFactor = 1;
+							
+							if (brOptions > 0)
+							{
+								doneSites    = {filteredData.unique_sites,8};
+								fullSites    = {filteredData.sites,8};						
+								labels = {{"dN","dS","dN/dS","dS=dN","LRT","p-value","Full Log(L)","dN_other"}};
+							}
+							else
+							{
+								doneSites    = {filteredData.unique_sites,7};
+								fullSites    = {filteredData.sites,7};
+								labels = {{"dN","dS","dN/dS","dS=dN","LRT","p-value","Full Log(L)"}};
+							}
+
+							Tree		   siteTree = treeString;
+							
+							ReplicateConstraint ("this1.?.synRate   :=sFactor*this2.?.synRate__",siteTree,codonTree);
+							if (brOptions == 1)
+							{
+								global nFactorOther = 1;
+								ReplicateConstraint ("this1.Node?.nonSynRate:=nFactor*this2.Node?.synRate__",siteTree,codonTree);
+								ReplicateConstraint ("this1.?.nonSynRate:=nFactorOther*this2.?.synRate__",siteTree,codonTree);
+							}
+							else
+							{
+								if (brOptions == 2)
+								{
+									mxTreeSpec = {5,1};
+									mxTreeSpec [0] = "givenTree";
+									mxTreeSpec [1] = "8240";
+									mxTreeSpec [2] = "10,40,-10,-175,1";
+									mxTreeSpec [3] = "";
+									mxTreeSpec [4] = "";
+									OpenWindow (TREEWINDOW, mxTreeSpec);							
+									internalNodes = BranchCount(siteTree);
+									choiceMatrix = {internalNodes,2};
+									for (bc=0; bc<internalNodes; bc=bc+1)
+									{
+										choiceMatrix[bc][0] = BranchName(siteTree,bc);
+										choiceMatrix[bc][1] = "Internal Branch Rooting " + siteTree[bc];
+									}
+									ChoiceList  (stOption,"Choose root of subtree",1,NO_SKIP,choiceMatrix);
+
+									if (stOption < 0)
+									{
+										return -1;
+									}
+
+									ExecuteCommands("ReplicateConstraint(\"this1.?.nonSynRate:=nFactor*this2.?.synRate__\",siteTree."+BranchName(siteTree,stOption)+",codonTree."+BranchName(givenTree,stOption)+");");																					      
+									global nFactorOther = 1;
+									ReplicateConstraint ("this1.?.nonSynRate:=nFactorOther*this2.?.synRate__",siteTree,codonTree);
+								}
+								else
+								{
+									if (brOptions == 3)
+									{
+										mxTreeSpec = {5,1};
+										mxTreeSpec [0] = "givenTree";
+										mxTreeSpec [1] = "8240";
+										mxTreeSpec [2] = "10,40,-10,-175,1";
+										mxTreeSpec [3] = "";
+										mxTreeSpec [4] = "";
+										OpenWindow (TREEWINDOW, mxTreeSpec);							
+										internalNodes = BranchCount(siteTree);
+										leafNodes	  = TipCount (siteTree);
+										choiceMatrix = {leafNodes+internalNodes,2};
+										for (bc=0; bc<leafNodes; bc=bc+1)
+										{
+											choiceMatrix[bc][0] = TipName(siteTree,bc);
+											choiceMatrix[bc][1] = "Taxon " + choiceMatrix[bc][0];
+										}
+										for (bc=0; bc<internalNodes; bc=bc+1)
+										{
+											choiceMatrix[bc+leafNodes][0] = BranchName(siteTree,bc);
+											choiceMatrix[bc+leafNodes][1] = "Internal Branch Rooting " + siteTree[bc];
+										}
+										ChoiceList  (stOption,"Choose branches to test",0,NO_SKIP,choiceMatrix);
+
+										if (stOption[0] < 0)
+										{
+											return -1;
+										}
+										
+										fprintf (stdout, "\nSite-by-site selection will be tested along the following subset of branches:\n");
+										for (bc=0; bc<Columns(stOption) * Rows(stOption); bc=bc+1)
+										{
+											bc2 = stOption[bc];
+											bc2 = choiceMatrix[bc2][0];
+											ExecuteCommands("siteTree."+bc2+".nonSynRate:=nFactor*siteTree."+bc2+".synRate;");		
+											fprintf (stdout, bc2,"\n");																		      
+										}
+
+										global nFactorOther = 1;
+										ReplicateConstraint ("this1.?.nonSynRate:=nFactorOther*this2.?.synRate__",siteTree,codonTree);
+											
+									}
+									else
+									{
+										ReplicateConstraint ("this1.?.nonSynRate:=nFactor*this2.?.synRate__",siteTree,codonTree);											
+									}											
+								}
+							}
+						}
+						else
+						{
+                            if (cOptions == 8)
+                            {
+                                ExecuteCommands ("qndhelper4.ibf");	
+                                brOptions = 1;									
+                                global			sFactor      = 1;
+                                global			nFactor      = 1;
+                                global 			nFactorOther = 1;
+                                
+                                doneSites    = {filteredData.unique_sites,8};
+                                fullSites    = {filteredData.sites,8};						
+                                labels = {{"dN","dS","dN/dS","dS=dN","LRT","p-value","Full Log(L)","dN_other"}};
+    
+
+                                Tree		   siteTree = treeString;
+                                
+                                ReplicateConstraint ("this1.?.synRate   :=sFactor*this2.?.synRate__",siteTree,codonTree);
+                                ExecuteCommands ("ReplicateConstraint(\"this1.?."+_rateLabelToTest+":=nFactor*this2.?.synRate__\",siteTree,codonTree)");
+                                for (k=0; k<Abs (aaRateClassIDs)-1; k=k+1)
+                                {
+                                    ReplicateConstraint ("this1.?.?:=nFactorOther*this2.?.synRate__",siteTree,codonTree);
+                                }
+                            }
+                            else // MEME
+                            {
+                            
+                                fprintf (stdout, "Save individual fit files to disk (CAUTION: will create 3x the number of sites files, [Y/N])");
+                                fscanf  (stdin, "String", saveFiles);
+                                if ((saveFiles[0]&&1) == "Y") {
+                                    SetDialogPrompt ("Enter a prefix path for the fit files. Each file will be suffixed as .site.[alt|null]");
+                                    fprintf (PROMPT_FOR_FILE, CLEAR_FILE);
+                                    SAVE_FIT_TO_FILE = LAST_FILE_PATH;
+                                }
+                                else {
+                                    SAVE_FIT_TO_FILE = "";
+                                }
+                            
+                                // save AC, AT, CG, CT and GT
+                                saveNucs = {{AC__,AT__,CG__,CT__,GT__}};
+                                LoadFunctionLibrary("BranchSiteTemplate");
+                                
+                                ClearConstraints (codonTree,AC,AT,CG,CT,GT); 
+                                LoadFunctionLibrary ("CodonTools.def");
+    
+                                ASSUME_REVERSIBLE_MODELS = 1;
+                                 
+                                OPTIMIZATION_METHOD     = 0;
+                                USE_LAST_RESULTS        = 1;
+                                
+                                fprintf (stdout, "\n[RETUNING BRANCH LENGTHS AND NUCLEOTIDE RATES UNDER THE CODON MODEL]\n");
+                                
+                                T0 = Time(1);
+                                
+                                //AUTO_PARALLELIZE_OPTIMIZE = 4;
+                                Optimize (codonLF, lf);
+                                //AUTO_PARALLELIZE_OPTIMIZE = 0;
+                                
+                                OPTIMIZATION_TIME_HARD_LIMIT = (Time(1)-T0)*4;
+                                
+                                fprintf (stdout, "IMPROVED Log(L) BY ", codonLF[1][0]-resC[1][0], " POINTS\n");
+                                
+                                OPTIMIZATION_METHOD = 4;
+
+                                global      omega1      =         0.5; omega1 :< 1;
+                                global      omega2      =         1.5; 
+                                global      mixingP     =         0.5; mixingP :< 1-1e-9; mixingP :> 1e-9;
+                                PopulateModelMatrix              ("MGMatrix1",  positionFrequencies, "alpha", "", "beta1");
+                                PopulateModelMatrix              ("MGMatrix2",  positionFrequencies, "alpha", "", "beta2");
+                                AC := saveNucs__[0];
+                                AT := saveNucs__[1];
+                                CG := saveNucs__[2];
+                                CT := saveNucs__[3];
+                                GT := saveNucs__[4];
+                                
+                                Model 		MG1		=		  ("Exp(MGMatrix1)*mixingP+Exp(MGMatrix2)*(1-mixingP)",codonFrequencies,EXPLICIT_FORM_MATRIX_EXPONENTIAL);
+                                Tree	    siteTree = treeString;
+                                Model       MGFEL   =         (MGMatrix2,codonFrequencies,0);
+                                Tree        felTree =  treeString;
+                                
+                                Model 		MGLocalMix		=		  ("Exp(MGMatrix1)*lmp+Exp(MGMatrix2)*(1-lmp)",codonFrequencies,EXPLICIT_FORM_MATRIX_EXPONENTIAL);
+                                Tree        perBranchTree 			= treeString;
+
+
+                                global      sFactor   =  1;
+                                global      nsFactor1 =  1;
+                                nsFactor1               :< 1;
+                                global      nsFactor2 =  1;
+                                global      omega2    =  1;
+                                            omega2    :< 1;
+                                
+                                omega2    :> 0;
+                                nsFactor2 :> 0;
+                                nsFactor1 :> 0;
+                                sFactor   :> 0;
+
+                                doneSites    = {filteredData.unique_sites,8};
+                                fullSites    = {filteredData.sites,9};						
+                                labels       = {{"beta1","beta2","weight1","weight2","Length_scaler","LRT","p-value","q-value","Full Log(L)"}};
+
+ 								ReplicateConstraint ("this1.?.alpha:=sFactor*this2.?.synRate__",siteTree,codonTree);
+ 								ReplicateConstraint ("this1.?.beta1:=nsFactor1*sFactor*this2.?.synRate__",siteTree,codonTree);
+ 								ReplicateConstraint ("this1.?.beta2:=nsFactor2*this2.?.synRate__",siteTree,codonTree);
+                                
+ 								ReplicateConstraint ("this1.?.alpha:=sFactor*this2.?.synRate__",felTree,codonTree);
+ 								ReplicateConstraint ("this1.?.beta2:=nsFactor2*this2.?.synRate__",felTree,codonTree);
+						   
+						        bySiteBranchReports = {};
+                            }
+						}
+					
+						if (MPI_NODE_COUNT<=1)
+						{
+							for (siteCount = 0; siteCount < filteredData.sites; siteCount += 1)
+							{
+								siteMap = dupInfo[siteCount];
+								if (alreadyDone[siteMap] == 0)
+								{
+									alreadyDone[siteMap] = 1;					
+									filterString = "" + (siteCount*3) + "-" + (siteCount*3+2);
+									DataSetFilter siteFilter = CreateFilter (ds,3,filterString,"",GeneticCodeExclusions);
+									
+									HarvestFrequencies (f1, siteFilter, 3, 3, 0);
+                                    m1 = +(f1["_MATRIX_ELEMENT_VALUE_>0"]); // how many unique characters in this site?
+																		
+									if (m1>1)
+									{
+										LikelihoodFunction siteLikelihood = (siteFilter, siteTree);
+                                        sFactor      = 1;
+                                       
+                                        if (cOptions == 10)
+                                        {
+                                            nsFactor1 = Min(dNdS,0.9);
+                                            nsFactor2 = 1.5;
+                                            mixingP   = 0.9;
+                                            ClearConstraints (nsFactor2);
+                                            //omega2 = 1.0;
+                                        }
+                                        else
+                                        {
+                                            nFactor	     = 1;
+                                            nFactorOther = 1;
+                                        }
+                                        
+ 										Optimize (site_res, siteLikelihood);
+                                        
+                                        if (cOptions == 10)
+                                        {
+                                            doneSites[siteMap][0] = nsFactor1;
+                                            doneSites[siteMap][1] = nsFactor2;
+                                            doneSites[siteMap][2] = mixingP;
+                                            doneSites[siteMap][6] = 1-mixingP;                                        
+                                            doneSites[siteMap][7] = sFactor;
+                                                                                        
+                                            if (nsFactor2 > sFactor && mixingP < 1) // only test for selection if the point estimate is > 1
+                                            {
+                                                bySiteBranchReports [siteMap] = obtainBranchWiseEBEstimates (sFactor, nsFactor1, nsFactor2, mixingP,filterString);
+                                                omega2     = 1;
+                                                nsFactor2 := omega2 * sFactor;
+                                                if (sFactor == 0)
+                                                {
+                                                    sFactor = 0.001;
+                                                }
+                                                Optimize (site_resN, siteLikelihood);
+                                                //LIKELIHOOD_FUNCTION_OUTPUT = 7;
+                                                //fprintf ("/Users/sergei/Desktop/null.fit", CLEAR_FILE, siteLikelihood);
+                                           }
+                                            else
+                                            {
+                                                site_resN = site_res;
+                                            }
+                                        }
+                                        else
+                                        {
+                                            doneSites[siteMap][0] = nFactor;
+                                            doneSites[siteMap][1] = sFactor;
+                                        
+                                            sFactor 	= (sFactor+nFactor)/2;
+                                            nFactor := sFactor;
+                                            Optimize (site_resN, siteLikelihood);
+                                            doneSites[siteMap][2] = sFactor;
+                                      }
+										
+										
+										doneSites[siteMap][3] = 2*(site_res[1][0]-site_resN[1][0]);
+										doneSites[siteMap][4] = 1-CChi2(doneSites[siteMap][3],1);															
+										doneSites[siteMap][5] = site_res[1][0];		
+                                        
+                                        if (cOptions != 10)
+                                        {													
+                                            doneSites[siteMap][6] = doneSites[siteMap][0]/doneSites[siteMap][1];	
+                                            if (brOptions > 0)
+                                            {
+                                                doneSites[siteMap][7] = nFactorOther;
+                                            }	
+										}
+
+ 									}
+									else
+									{
+                                        // all other columns are 0
+										doneSites[siteMap][4] = 1;															
+									}	
+								}
+                                
+                                if (cOptions == 10)
+                                {
+                                    ReportSiteMEME (siteCount, siteMap, -1);
+                                }
+                                else
+                                {
+                                    ReportSite2 (siteCount, siteMap);				 
+                                }
+                            }	
+						}
+						else
+						{
+							MPINodeState     = {MPI_NODE_COUNT-1,4};
+                            
+                            if (cOptions == 10)
+                            {
+                                bySiteCache      = {filteredData.sites, 3};
+                                toDoList         = {};
+                                
+                                lfSpawnDone      = 0;
+                                //debugVerboseFlag = 0;
+                                
+                                // populate the initial queue of things to do
+                                
+                                for (siteCount = 0; siteCount < filteredData.sites; siteCount += 1)
+                                {
+                                    siteMap = dupInfo[siteCount];
+                                    if (alreadyDone[siteMap] == 0)
+                                    {
+                                        alreadyDone[siteMap] = 1;				
+                                        filterString = "" + (siteCount*3) + "-" + (siteCount*3+2);
+                                        DataSetFilter siteFilter = CreateFilter (filteredData,3,filterString,"",GeneticCodeExclusions);
+                                       
+                                        
+                                        HarvestFrequencies (f1, siteFilter, 3, 3, 0);
+                                        m1 = +(f1["_MATRIX_ELEMENT_VALUE_>0"]); // how many unique characters?
+                                        if (m1>1)
+                                        {
+                                            toDoList ["FEL_" + siteCount] = {{siteCount__,2}}; // 2 in the 2nd column means FEL
+                                            if (lfSpawnDone == 0)
+                                            {
+                                                LikelihoodFunction siteLikelihood = (siteFilter, siteTree);	
+                                                LikelihoodFunction felLikelihood  = (siteFilter, felTree);	
+                                                lfSpawnDone = 1;
+                                            }
+                                        }
+                                        else
+                                        {
+                                            doneSites[siteMap][4] = 1;									
+                                        }
+                                    }
+                                    
+                                }
+                                
+                                if (debugVerboseFlag)
+                                {
+                                    fprintf (stdout, toDoList);
+                                }   
+                                GetString (funcInfo, obtainBranchWiseEBEstimatesMPI, -1);
+                                funcText = "function " + funcInfo["ID"] + "(" + Join (",", funcInfo["Arguments"]) + ") { " + funcInfo ["Body"] + "}";
+
+                                //debugVerboseFlag = 1;
+        
+                                _memeExtraNull = "SAVE_FIT_TO_FILE = \"`SAVE_FIT_TO_FILE`\";
+                                if (Abs (SAVE_FIT_TO_FILE)) {
+                                    LIKELIHOOD_FUNCTION_OUTPUT = 7;
+                                    saveLFTo = SAVE_FIT_TO_FILE + \".\" + siteID + jobSuffix;
+                                    fprintf (saveLFTo, CLEAR_FILE, siteLikelihood);
+                                    LIKELIHOOD_FUNCTION_OUTPUT = 2;
+                                }
+                                ";
+
+                                 _memeExtra = _memeExtraNull + funcText + 
+                                "_OBSERVED_S_ = " + _OBSERVED_S_ + ";\n" +
+                                "_OBSERVED_NS_ = " + _OBSERVED_NS_ + ";\n" +
+                                "MPI_NEXUS_FILE_RETURN = {};
+                                 MPI_NEXUS_FILE_RETURN [\"MLES\"]     = siteLikelihood_MLES;
+                                 _vtr = {{\"nsFactor1\", \"nsFactor2\", \"sFactor\", \"mixingP\"}};
+                                 MPI_NEXUS_FILE_RETURN [\"VALUES\"]   = {};
+                                 for (_k = 0; _k < Columns (_vtr); _k += 1) {
+                                    (MPI_NEXUS_FILE_RETURN [\"VALUES\"])[_vtr[_k]] = Eval (_vtr[_k]);
+                                 }
+                                 MPI_NEXUS_FILE_RETURN [\"BRANCHES\"] = obtainBranchWiseEBEstimatesMPI (sFactor, nsFactor1, nsFactor2, mixingP);
+                                ";
+                                while (MPISendJobMEME ()) 
+                                {
+                                
+                                }
+                            }
+                            else
+                            {
+                            
+                                lfSpawnDone = 0;
+                                for (siteCount = 0; siteCount < filteredData.sites; siteCount += 1)
+                                {
+                                    siteMap = dupInfo[siteCount];
+                                    if (alreadyDone[siteMap] == 0)
+                                    {
+                                        alreadyDone[siteMap] = 1;				
+                                        filterString = "" + (siteCount*3) + "-" + (siteCount*3+2);
+                                        DataSetFilter siteFilter = CreateFilter (filteredData,3,filterString,"",GeneticCodeExclusions);
+
+                                        HarvestFrequencies (f1, siteFilter, 3, 3, 0);
+                                        m1 = +(f1["_MATRIX_ELEMENT_VALUE_>0"]); // how many unique characters?
+                                        
+                                        if (m1>1)
+                                        {
+                                            if (lfSpawnDone == 0)
+                                            {
+                                                LikelihoodFunction siteLikelihood = (siteFilter, siteTree);	
+                                                lfSpawnDone = 1;
+                                            }
+                                                        
+                                            sFactor      = 1;
+                                            nFactor	     = 1;
+     
+                                            for (mpiNode = 0; mpiNode < MPI_NODE_COUNT-1; mpiNode = mpiNode+1)
+                                            {
+                                                if (MPINodeState[mpiNode][0]==0)
+                                                {
+                                                    break;	
+                                                }
+                                            }
+                                            
+                                            if (mpiNode==MPI_NODE_COUNT-1)
+                                            // all nodes busy 
+                                            {
+                                                mpiNode = ReceiveJobs2 (1,1);
+                                            }
+                                            else
+                                            {
+                                                MPISend (mpiNode+1,siteLikelihood);
+                                                MPINodeState[mpiNode][0] = 1;
+                                                MPINodeState[mpiNode][1] = siteCount;
+                                                MPINodeState[mpiNode][2] = 1;
+                                                MPINodeState[mpiNode][3] = MPINodeState[mpiNode][3] + 1;
+                                            }
+                                            sFactor 	= (sFactor+nFactor)/2;
+                                            nFactor := sFactor;
+      
+                                            for (mpiNode = 0; mpiNode < MPI_NODE_COUNT-1; mpiNode = mpiNode+1)
+                                            {
+                                                if (MPINodeState[mpiNode][0]==0)
+                                                {
+                                                    break;	
+                                                }
+                                            }
+                                            
+                                                        
+                                            if (mpiNode==MPI_NODE_COUNT-1)
+                                            {
+                                                mpiNode = ReceiveJobs2 (1,0);
+                                            }
+                                            else
+                                            {
+                                                MPISend (mpiNode+1,siteLikelihood);
+                                                MPINodeState[mpiNode][0] = 1;
+                                                MPINodeState[mpiNode][1] = siteCount;
+                                                MPINodeState[mpiNode][2] = 0;
+                                            }
+                                        }
+                                        else
+                                        {
+                                            doneSites[siteMap][4] = 1;									
+                                        }
+                                    }
+                                }	                           
+
+                                while (1)
+                                {
+                                    for (nodeCounter = 0; nodeCounter < MPI_NODE_COUNT-1; nodeCounter = nodeCounter+1)
+                                    {
+                                        if (MPINodeState[nodeCounter][0]==1)
+                                        {
+                                            fromNode = ReceiveJobs2 (0,0);
+                                            break;	
+                                        }
+                                    }
+                                    if (nodeCounter == MPI_NODE_COUNT-1)
+                                    {
+                                        break;
+                                    }
+                                }			
+                            }		
+                            
+							fprintf (stdout, "\n\n\n");
+                            if (cOptions == 10) {
+                                qValues = {filteredData.sites,2};
+                                
+                                for (siteCount = 0; siteCount < filteredData.sites; siteCount += 1){
+                                    qValues [siteCount][0] = siteCount;
+                                    qValues [siteCount][1] = doneSites[dupInfo[siteCount]][4];
+                                }
+                                
+                                qValues = qValues % 1;
+                                for (siteCount = 0; siteCount < filteredData.sites; siteCount += 1){
+                                    qValues [siteCount][1] = Min(1,qValues [siteCount][1] * (filteredData.sites)/(1+siteCount));
+                                }
+                                
+                                qValues = qValues % 0;
+                                for (siteCount = 0; siteCount < filteredData.sites; siteCount += 1) {
+                                    ReportSiteMEME (siteCount, dupInfo[siteCount], qValues[siteCount][1]);				 
+                                }
+                                
+                            
+                            } else {
+                                for (siteCount = 0; siteCount < filteredData.sites; siteCount += 1)
+                                {
+                                    siteMap = dupInfo[siteCount];
+                                    ReportSite2 (siteCount, siteMap);				 
+                                }
+                            }
+						}
+					}
+					
+                    if (cOptions != 10)
+                    {
+                        OpenWindow (CHARTWINDOW,{{"FEL Results"}
+                                                    {"labels"},
+                                                    {"fullSites"},
+                                                    {"Bar Chart"},
+                                                    {"Index"},
+                                                    {labels[0]},
+                                                    {"Site Index"},
+                                                    {""},
+                                                    {labels[0]},
+                                                    {"0"}
+                                                    {""}
+                                                    {"-1;-1"}
+                                                    {"10;1.309;0.785398"}
+                                                    {"Times:12:0;Times:10:0;Times:12:2"}
+                                                    {"0;0;16777215;1644825;0;0;6579300;11842740;13158600;14474460;0;3947580;16777215;5000268;6845928;16771158;2984993;9199669;7018159;1460610;16748822;11184810;14173291"}
+                                                    {"16,0,0"}
+                                                    },
+                                                    "(SCREEN_WIDTH-60)/2;(SCREEN_HEIGHT-50)/2;(SCREEN_WIDTH-60)/2;50");
+                    }
+					SHORT_MPI_RETURN = 0;
+											   
+					fprintf (stdout, "\n\nWall-clock run-time (seconds): ", Time(1) - FEL_RUN_TIMER, 
+									 "\nProcess time on the master node: ", Time(0) - FEL_MASTER_TIMER,
+									 "\nMPI nodes used: ", MPI_NODE_COUNT, "\n",
+									 "\nWall-clock time per site (seconds): ", (Time(1) - FEL_RUN_TIMER)/filteredData.unique_sites, "\n");
+									 
+							
+					/*if (MPI_NODE_COUNT>1)
+					{		 
+						unitVector = {1,MPI_NODE_COUNT-1};
+						unitVector = unitVector["1"]*MPINodeState;				 
+						for (nodeCounter = 0; nodeCounter < MPI_NODE_COUNT-1; nodeCounter = nodeCounter+1)
+						{
+							fprintf (stdout, "Node ", Format(nodeCounter+1,5,0), " processed: ", Format(MPINodeState[nodeCounter][3],5,0), 
+												   "(", Format(MPINodeState[nodeCounter][3]*100/unitVector[3],6,3),"%)  jobs\n"); 
+						}
+					}*/
+					
+					SetDialogPrompt ("Save site-by-site LRT results to:");
+					
+					siteCount = Columns (fullSites);
+					
+					fprintf (PROMPT_FOR_FILE,CLEAR_FILE,labels[0]);
+					csvFILE = LAST_FILE_PATH;
+					
+					
+					outString = "";
+					outString * 8192;
+					
+					for (nodeCounter=1; nodeCounter<siteCount; nodeCounter=nodeCounter+1)
+					{
+						outString * ("," + labels[nodeCounter]);
+					}
+					
+					for (nodeCounter=0; nodeCounter < Rows (fullSites); nodeCounter = nodeCounter+1)
+					{
+						outString * ("\n"+fullSites[nodeCounter][0]);
+						for (mpiNode=1; mpiNode<siteCount; mpiNode=mpiNode+1)
+						{
+							outString * (","+fullSites[nodeCounter][mpiNode]);
+						}
+					}
+					outString * 0;
+					fprintf (csvFILE, outString);
+					outString = 0;
+					
+                    if (cOptions == 10) {
+					    byBranchResultsFile = LAST_FILE_PATH + ".branches";
+					    fprintf (byBranchResultsFile, CLEAR_FILE, KEEP_OPEN, Format (codonTree,1,1), "\n<<<<<<<<<<<<<<<<<<<<<<<<\n", "Site,Branch,PosteriorProbability,EmpiricalBayesFactor,SynSubs,NonsynSubs");
+                        for (siteCount = 0; siteCount < Rows (fullSites); siteCount = siteCount+1)
+                        {
+                            siteMap = dupInfo[siteCount];
+                            if (Abs (bySiteBranchReports [siteMap])) {
+                                bNames = Rows (bySiteBranchReports [siteMap]);
+                                for (branchCount = 0; branchCount < Columns(bNames); branchCount += 1) {
+                                    fprintf (byBranchResultsFile, "\n", siteCount+1, ",", bNames[branchCount], ",", Join (",",(bySiteBranchReports [siteMap])[bNames[branchCount]]));
+                                }
+                            }
+                        }
+                        fprintf (byBranchResultsFile, CLOSE_FILE);
+                       			
+                    }
+                }
+			}
+		}
+	}
+}
+
+useCustomCountingBias = 0;
+
+/*****************************************************************************/
+
+function  DoNCategoryFitK (weightMatrix)
+{
+	breakPointMatrix = (SELECTED_CHART_DATA == weightMatrix);
+	return breakPointMatrix[3][0];
+}
+
+/*****************************************************************************/
+
+function rateClassCounter (cIdx, varC, descriptor)
+{
+	rateMx = scaledRates%cIdx;
+
+	dataPoints = Rows(rateMx);
+	temp_data_vector = {2, dataPoints};
+	
+	currentIndex = 0;
+
+	temp_data_vector[0][0] = rateMx[0][cIdx];
+	temp_data_vector[1][0] = 1;
+
+	for (nextIndex = 1; nextIndex < dataPoints; nextIndex = nextIndex + 1)
+	{
+		if (rateMx[nextIndex][cIdx]!=rateMx[nextIndex-1][cIdx])
+		{
+			currentIndex = currentIndex+1;
+			temp_data_vector[0][currentIndex] = rateMx[nextIndex][cIdx];
+		}
+		temp_data_vector[1][currentIndex] = temp_data_vector[1][currentIndex] + 1;
+	}
+
+	SELECTED_CHART_DATA = {2, currentIndex+1};
+
+	for (nextIndex = 0; nextIndex <= currentIndex; nextIndex = nextIndex + 1)
+	{
+		SELECTED_CHART_DATA[0][nextIndex] = temp_data_vector[0][nextIndex];
+		SELECTED_CHART_DATA[1][nextIndex] = temp_data_vector[1][nextIndex];
+	}
+
+
+	temp_data_vector = 0;
+	normal_sigma 	 = .25;
+	lastMax 		 = -100000000000;
+
+	fprintf (stdout, 	  "\nDoing a very approximate fit with ", descriptor, " rates .\n");
+
+	PROFILE_MEAN_VAR_MULT = 1/varC;
+
+	for (resp = 2; resp <= Columns(SELECTED_CHART_DATA); resp = resp+1)
+	{
+		freqStrMx    = {resp,1};
+		freqStrMx[0] = "APS_1";
+
+		for (mi=1; mi<resp-1; mi=mi+1)
+		{
+			freqStrMx[mi] = "";
+			for (mi2=1;mi2<=mi;mi2=mi2+1)
+			{
+				freqStrMx[mi] = freqStrMx[mi]+"(1-APS_"+mi2+")";		
+			}
+			freqStrMx[mi] = freqStrMx[mi]+"APS_"+(mi+1);	
+		}	
+
+		freqStrMx[mi] = "";
+		for (mi2=1;mi2<mi;mi2=mi2+1)
+		{
+			freqStrMx[mi] = freqStrMx[mi]+"(1-APS_"+mi2+")";		
+		}
+		freqStrMx[mi] = freqStrMx[mi]+"(1-APS_"+mi+")";	
+		mx = {resp,1};
+		
+		execString = "";
+		for (resp2 = 0; resp2 < resp; resp2 = resp2 + 1)
+		{
+			if (resp2)
+			{
+					execString = execString + "global APS_"+resp2+":>0;APS_"+resp2+":<1;";
+			}
+			execString = execString + "mx[" + resp2 + "]:=" + freqStrMx[resp2] + ";";
+		}
+		ExecuteCommands (execString);
+		
+		
+		bF = {{0}{-1e100}};
+		
+		for (k=0; k<10; k=k+1)
+		{
+			execString = "";
+			rM = {resp-1,1};
+			for (resp2 = 1; resp2 < resp; resp2 = resp2 + 1)
+			{	
+				rM [resp2-1] = Random(0,1);
+				execString = execString +"APS_"+resp2+"=rM["+(resp2-1)+"];";
+			}
+			ExecuteCommands (execString);		
+			Optimize (bestFit, DoNCategoryFitK(mx));
+			if (bestFit[1][0]>bF[1][0])
+			{
+				bF = bestFit;
+				smx = mx;
+				sbp = breakPointMatrix;
+			}
+		}
+		
+		bestFit = bF;
+		mx = smx;
+		breakPointMatrix = sbp;
+		
+		/*fprintf (stdout, Format (resp,3,0), " rate classes: Log(L) = ", bestFit[1][0], " \n");*/
+		mi = 0;
+		for (resp2 = 0; resp2 < resp; resp2 = resp2+1)
+		{
+			mi = mi + breakPointMatrix[2][resp2]*mx[resp2];
+		}
+
+		cI_R = {2,resp};
+
+		for (resp2 = 0; resp2 < resp; resp2 = resp2+1)
+		{
+			cI_R[0][resp2] = breakPointMatrix[2][resp2]/mi;
+			cI_R[1][resp2] = mx[resp2];
+			/*fprintf (stdout, "Class ", Format (resp2+1,3,0), " : ",  Format (cI_R[0][resp2], 8, 5), " weight = ", Format (cI_R[1][resp2], 8, 5), "\n");*/
+		}	
+		
+		if (bestFit[1][0] - lastMax < 2)
+		{
+			break;
+		}
+		saveBPM = breakPointMatrix;
+		saveMx	= mx;
+		lastMax = bestFit[1][0];
+	}
+
+	resp = resp-1;
+
+	fprintf (stdout, "\n\nFitted ", resp, " ", descriptor, " categories to the data\n\n");
+
+	if (varC==0)
+	{
+		mi = 0;
+		for (resp2 = 0; resp2 < resp; resp2 = resp2+1)
+		{
+			mi = mi + saveBPM[2][resp2]*saveMx[resp2];
+		}
+	}
+	else
+	{
+		mi = mi+1;
+	}
+
+	cI_R = {2,resp};
+
+	for (resp2 = 0; resp2 < resp; resp2 = resp2+1)
+	{
+		cI_R[0][resp2] = saveBPM[2][resp2]/mi;
+		cI_R[1][resp2] = saveMx[resp2];
+		fprintf (stdout, "Class ", Format (resp2+1,3,0), " : ",  Format (cI_R[0][resp2], 8, 5), " weight = ", Format (cI_R[1][resp2], 8, 5), "\n");
+	}
+	
+	return resp;
+}
diff --git a/res/TemplateBatchFiles/QuickSelectionDetectionMF.bf b/res/TemplateBatchFiles/QuickSelectionDetectionMF.bf
new file mode 100644
index 0000000..6fdfec8
--- /dev/null
+++ b/res/TemplateBatchFiles/QuickSelectionDetectionMF.bf
@@ -0,0 +1,384 @@
+RequireVersion ("2.12");
+
+ExecuteAFile ("qndhelper1_mf.ibf");
+LoadFunctionLibrary ("GrabBag.bf");
+
+REPLACE_TREE_STRUCTURE = 1;
+
+
+ChoiceList  (rOptions,"dN/dS bias parameter options",1,NO_SKIP,
+			 "Neutral","dN/dS=1",
+			 "User","Custom dN/dS value",
+			 "Estimate", "Estimate from data with branch corrections(slower).",
+			 "Estimate + CI", "Estimate dN/dS and a 95% confidence interval from data (slower).",
+			 "Estimate dN/dS only", "Estimate from data without branch corrections."
+);
+	
+
+if (rOptions < 0) {
+	return;
+}
+
+if (rOptions == 1) {
+    RR = prompt_for_a_value ("Enter the value for dNdS",0.25,0,10000,0);
+	dNdS = RR;
+}
+
+ChoiceList  (cOptions,"Which method?",1,NO_SKIP,
+			 "SLAC","Single likelihood ancestor counting",
+			 "FEL","Fixed effects likelihood",
+			 "MEME","Mixed effects model of evolution");
+
+
+if (cOptions < 0) {
+	return;
+}
+
+ExecuteAFile("qndhelper2_mf.ibf");
+
+fprintf (stdout, "\n\nPhase 4: Selection Analysis\n\n");
+
+
+pooledFreqs = {4,1};
+
+for (k=0; k<4; k+=1) {
+	pooledFreqs[k] = (+positionFrequencies[k][-1])/3;
+}
+
+_EFV_MATRIX0_ = {{1,AC__*pooledFreqs[1],pooledFreqs[2],AT__*pooledFreqs[3]}
+				{AC__*pooledFreqs[0],1,CG__*pooledFreqs[2],CT__*pooledFreqs[3]}
+				{pooledFreqs[0],CG__*pooledFreqs[3],1,GT__*pooledFreqs[3]}
+				{AT__*pooledFreqs[0],CT__*pooledFreqs[3],GT__*pooledFreqs[2],1}};
+
+_EFV_MATRIX1_ = _EFV_MATRIX0_;
+_EFV_MATRIX2_ = _EFV_MATRIX0_;				
+useCustomCountingBias = 1;
+
+if (cOptions == 0) {		
+	ExecuteAFile("SGEmulator_MF.bf");
+}
+else { // FEL 
+    pValue = prompt_for_a_value ("Significance level for Likelihood Ratio Tests",0.1,0,1,0)
+					
+	SHORT_MPI_RETURN = 1;
+	FEL_RUN_TIMER    = Time(1);
+	FEL_MASTER_TIMER = Time(0);
+			
+	ChoiceList  (brOptions,"Branch Options",1,NO_SKIP,
+						 "All","Test for non-neutral evolution on all branches",
+						 "Internal Only","Test for non-neutral evolution on internal branches only");
+					 
+	if (brOptions < 0) {
+		return 0;
+	}
+
+	ExecuteCommands ("#include\"qndhelper3.ibf\";");				
+	global			sFactor = 1;
+	global			nFactor = 1;
+	
+	if (brOptions > 0)
+	{
+		doneSites    = {totalUniqueSites,8};
+		fullSites    = {totalCodonCount ,8};						
+		labels = {{"dN","dS","dN/dS","dS=dN","LRT","p-value","Full Log(L)","dN_other"}};
+	}
+	else
+	{
+		doneSites    = {totalUniqueSites,7};
+		fullSites    = {totalCodonCount ,7};
+		labels = {{"dN","dS","dN/dS","dS=dN","LRT","p-value","Full Log(L)"}};
+	}
+	
+	if (MPI_NODE_COUNT>1)
+	{
+		MPINodeState = {MPI_NODE_COUNT-1,5};
+	}
+	
+	vOffset  = 0;
+	vuOffset = 0;
+	
+	alreadyDone = {totalUniqueSites,1};
+	
+	for (fileID = 1; fileID <= fileCount; fileID = fileID+1)
+	{
+		ClearConstraints (siteTree);
+		Tree		   	  siteTree = treeStrings[fileID];
+		
+		ExecuteCommands ("GetDataInfo  (dupInfo, filteredData_"+fileID+");");			
+		ExecuteCommands ("thisFilterSize  = filteredData_"+fileID+".sites;");			
+		ExecuteCommands ("thisFilterSizeU = filteredData_"+fileID+".unique_sites;");			
+		
+		fprintf (stdout, "\nWorking on file ", fileID, " with ", thisFilterSize, " codons (", thisFilterSizeU, " unique patterns)\n");
+		
+		ExecuteCommands ("ReplicateConstraint(\"this1.?.synRate:=sFactor*this2.?.synRate__\",siteTree,codonTree_"+fileID+");");
+		
+		if (brOptions == 1)
+		{
+			global nFactorOther = 1;
+			ExecuteCommands ("ReplicateConstraint(\"this1.Node?.nonSynRate:=nFactor*this2.Node?.synRate__\",siteTree,codonTree_"+fileID+");");
+			ExecuteCommands ("ReplicateConstraint(\"this1.?.nonSynRate:=nFactorOther*this2.?.synRate__\",siteTree,codonTree_"+fileID+");");
+		}
+		else
+		{
+			ExecuteCommands ("ReplicateConstraint(\"this1.?.nonSynRate:=nFactor*this2.?.synRate__\",siteTree,codonTree_"+fileID+");");
+		}
+		
+		lfSpawnDone = 0;
+					
+		if (MPI_NODE_COUNT<=1)
+		{
+			for (siteCount = 0; siteCount < thisFilterSize; siteCount = siteCount+1)
+			{
+				siteMap = dupInfo[siteCount];
+				if (alreadyDone[siteMap+vuOffset] == 0)
+				{
+					alreadyDone[siteMap+vuOffset] = 1;					
+					filterString 		 = "";
+					filterString 		 = filterString + (siteCount*3) + "-" + (siteCount*3+2);
+					ExecuteCommands ("DataSetFilter siteFilter = CreateFilter (ds_"+fileID+",3,filterString,\"\",GeneticCodeExclusions);");
+					
+					HarvestFrequencies (f1, siteFilter, 3, 3, 0);
+					m1 = 0;
+					for (mpiNode=0; mpiNode < 64; mpiNode=mpiNode+1)
+					{
+						if (f1[mpiNode]>0)
+						{
+							m1=m1+1;
+						}
+					}
+					
+					siteMap = siteMap + vuOffset;
+					if (m1>1)
+					{
+						if (lfSpawnDone == 0)
+						{
+							LikelihoodFunction siteLikelihood = (siteFilter, siteTree);
+							lfSpawnDone = 1;
+						}
+						
+						sFactor = 1;
+						nFactor	= 1;
+						Optimize (site_res, siteLikelihood);
+						doneSites[siteMap][0] = nFactor;
+						doneSites[siteMap][1] = sFactor;
+						m1 = sFactor+nFactor;
+						sFactor 	= m1/2;
+						nFactor:=sFactor;
+						Optimize (site_resN, siteLikelihood);
+						
+						doneSites[siteMap][2] = sFactor;
+						doneSites[siteMap][3] = 2*(site_res[1][0]-site_resN[1][0]);
+						doneSites[siteMap][4] = 1-CChi2(doneSites[siteMap][3],1);															
+						doneSites[siteMap][5] = site_res[1][0];															
+						doneSites[siteMap][6] = doneSites[siteMap][0]/doneSites[siteMap][1];	
+						if (brOptions > 0)
+						{
+							doneSites[siteMap][7] = nFactorOther;
+						}													
+					}
+					else
+					{	
+						doneSites[siteMap][0] = 0;
+						doneSites[siteMap][1] = 0;
+						doneSites[siteMap][2] = 0;
+						doneSites[siteMap][3] = 0;
+						doneSites[siteMap][4] = 1;															
+						doneSites[siteMap][5] = 0;
+						if (brOptions > 0)
+						{
+							doneSites[siteMap][7] = 0;
+						}
+					}	
+				}
+				else
+				{
+					siteMap = siteMap + vuOffset;
+				}
+				dummy = ReportSite2 (siteCount+vOffset, siteMap);				 
+			}	
+		}
+		else
+		{
+			
+			for (siteCount = 0; siteCount < thisFilterSize; siteCount = siteCount+1)
+			{
+				siteMap = dupInfo[siteCount];
+				if (alreadyDone[siteMap+vuOffset] == 0)
+				{
+					filterString = "";
+					filterString = filterString + (siteCount*3) + "-" + (siteCount*3+2);
+					ExecuteCommands ("DataSetFilter siteFilter = CreateFilter (ds_"+fileID+",3,filterString,\"\",GeneticCodeExclusions);");
+
+					HarvestFrequencies (f1, siteFilter, 3, 3, 0);
+					m1 = 0;
+					for (mpiNode=0; mpiNode < 64; mpiNode=mpiNode+1)
+					{
+						if (f1[mpiNode]>0)
+						{
+							m1=m1+1;
+						}
+					}
+					
+					siteMap = siteMap + vuOffset;
+					alreadyDone[siteMap] = 1;				
+					if (m1>1)
+					{
+						sFactor = 1;
+						nFactor	= 1;
+						
+						if (lfSpawnDone == 0)
+						{
+							LikelihoodFunction siteLikelihood = (siteFilter, siteTree);	
+							LIKELIHOOD_FUNCTION_OUTPUT = 7;
+							lfSpawnDone = 1;
+						}
+									
+						for (mpiNode = 0; mpiNode < MPI_NODE_COUNT-1; mpiNode = mpiNode+1)
+						{
+							if (MPINodeState[mpiNode][0]==0)
+							{
+								break;	
+							}
+						}
+						
+						if (mpiNode==MPI_NODE_COUNT-1)
+						{
+							mpiNode = ReceiveJobs2 (1,1,siteCount+vOffset,siteMap);
+						}
+						else
+						{
+							MPISend (mpiNode+1,siteLikelihood);
+							MPINodeState[mpiNode][0] = 1;
+							MPINodeState[mpiNode][1] = siteCount+vOffset;
+							MPINodeState[mpiNode][2] = 1;
+							MPINodeState[mpiNode][3] = siteMap;
+							MPINodeState[mpiNode][4] = MPINodeState[mpiNode][4] + 1;
+							
+						}
+						
+						m1 = sFactor+nFactor;
+						sFactor 	= m1/2;
+						nFactor:=sFactor;
+
+						for (mpiNode = 0; mpiNode < MPI_NODE_COUNT-1; mpiNode = mpiNode+1)
+						{
+							if (MPINodeState[mpiNode][0]==0)
+							{
+								break;	
+							}
+						}
+						
+						if (mpiNode==MPI_NODE_COUNT-1)
+						{
+							mpiNode = ReceiveJobs2 (1,0,siteCount+vOffset,siteMap);
+						}
+						else
+						{
+							MPISend (mpiNode+1,siteLikelihood);
+							MPINodeState[mpiNode][0] = 1;
+							MPINodeState[mpiNode][1] = siteCount+vOffset;
+							MPINodeState[mpiNode][3] = siteMap;
+							MPINodeState[mpiNode][2] = 0;
+						}
+					}
+					else
+					{
+	                    doneSites[siteMap][0] = 0;
+	                    doneSites[siteMap][1] = 0;
+	                    doneSites[siteMap][2] = 0;
+	                    doneSites[siteMap][3] = 0;
+	                    doneSites[siteMap][4] = 1;									
+					}
+				}
+			}					
+		}
+		vOffset 	= vOffset  + thisFilterSize;
+		vuOffset 	= vuOffset + thisFilterSizeU;
+	}
+		
+	if (MPI_NODE_COUNT>1)
+	{
+		while (1)
+		{
+			for (nodeCounter = 0; nodeCounter < MPI_NODE_COUNT-1; nodeCounter = nodeCounter+1)
+			{
+				if (MPINodeState[nodeCounter][0]==1)
+				{
+					fromNode = ReceiveJobs2 (0,0,0,0);
+					break;	
+				}
+			}
+			if (nodeCounter == MPI_NODE_COUNT-1)
+			{
+				break;
+			}
+		}					
+		fprintf (stdout, "\n\n\n");
+		vOffset  = 0;
+		vuOffset = 0;
+		
+		alreadyDone = {totalUniqueSites,1};
+		
+		for (fileID = 1; fileID <= fileCount; fileID = fileID+1)
+		{
+			ClearConstraints (siteTree);
+			ExecuteCommands ("GetDataInfo  (dupInfo, filteredData_"+fileID+");");			
+			ExecuteCommands ("thisFilterSize  = filteredData_"+fileID+".sites;");			
+			ExecuteCommands ("thisFilterSizeU = filteredData_"+fileID+".unique_sites;");			
+			for (siteCount = 0; siteCount < thisFilterSize; siteCount = siteCount+1)
+			{
+				siteMap = dupInfo[siteCount];
+				dummy = ReportSite2 (siteCount+vOffset, siteMap+vuOffset);				 
+			}
+			vOffset 	= vOffset  + thisFilterSize;
+			vuOffset 	= vuOffset + thisFilterSizeU;
+		}
+	}
+
+	OpenWindow (CHARTWINDOW,{{"FEL Results"}
+							   {"labels"},
+							   {"fullSites"},
+							   {"Bar Chart"},
+							   {"Index"},
+							   {labels[0]},
+							   {"Site Index"},
+							   {""},
+							   {labels[0]},
+							   {"0"}},
+							   "SCREEN_WIDTH-60;SCREEN_HEIGHT-50;30;50");
+							   
+	SHORT_MPI_RETURN = 0;
+							   
+	fprintf (stdout, "\n\nWall-clock run-time (seconds): ", Time(1) - FEL_RUN_TIMER, 
+					 "\nProcess time on the master node: ", Time(0) - FEL_MASTER_TIMER,
+					 "\nMPI nodes used: ", MPI_NODE_COUNT, "\n",
+					 "\nWall-clock time per site (seconds): ", (Time(1) - FEL_RUN_TIMER)/totalUniqueSites, "\n");
+					 
+			
+	SetDialogPrompt ("Save site-by-site LRT results to:");
+	
+	siteCount = Columns (fullSites);
+	fprintf (PROMPT_FOR_FILE,CLEAR_FILE,labels[0]);
+	
+	outString = "";
+	outString * 8192;
+	
+	for (nodeCounter=1; nodeCounter<siteCount; nodeCounter=nodeCounter+1)
+	{
+		outString * ("," + labels[nodeCounter]);
+	}
+	
+	for (nodeCounter=0; nodeCounter < Rows (fullSites); nodeCounter = nodeCounter+1)
+	{
+		outString * ("\n"+fullSites[nodeCounter][0]);
+		for (mpiNode=1; mpiNode<siteCount; mpiNode=mpiNode+1)
+		{
+			outString * (","+fullSites[nodeCounter][mpiNode]);
+		}
+	}
+	outString * 0;
+	fprintf (LAST_FILE_PATH, outString);
+	outString = 0;
+}
+
+useCustomCountingBias = 0;
diff --git a/res/TemplateBatchFiles/RELAX.bf b/res/TemplateBatchFiles/RELAX.bf
new file mode 100644
index 0000000..3190f44
--- /dev/null
+++ b/res/TemplateBatchFiles/RELAX.bf
@@ -0,0 +1,724 @@
+RequireVersion ("2.220141023");
+
+
+VERBOSITY_LEVEL				= 0;
+//LF_SMOOTHING_SCALER         = 0.1;
+
+LoadFunctionLibrary("GrabBag");
+LoadFunctionLibrary("CF3x4");
+LoadFunctionLibrary("TreeTools");
+
+
+// namespace 'utility' for convenience functions 
+LoadFunctionLibrary("lib2014/UtilityFunctions.bf");
+
+// namespace 'io' for interactive/datamonkey i/o functions
+LoadFunctionLibrary("lib2014/IOFunctions.bf");
+
+LoadFunctionLibrary ("lib2014/models/codon/MG_REV.bf");
+
+// namespace 'estimators' for various estimator related functions
+LoadFunctionLibrary("lib2014/tasks/estimators.bf");
+
+
+LoadFunctionLibrary("BranchSiteTemplate");
+/*------------------------------------------------------------------------------ 
+    BranchSiteTemplate Defines
+
+    BuildCodonFrequencies (obsF);
+    PopulateModelMatrix (ModelMatrixName&, EFV, synrateP, globalP, nonsynRateP);
+
+------------------------------------------------------------------------------*/
+
+RELAX.settings = {"GTR" : 1, 
+                  "LocalMG" : 1,
+                  "Estimate GTR" : 1};
+
+RELAX.timers  = {6,1};
+
+
+relax.taskTimerStart (0);
+
+RELAX.json    = {"fits" : {},
+                  "timers" : {},
+                  "relaxation-test" : None
+                  };
+
+RELAX.test            = "RELAX.test";
+RELAX.reference       = "RELAX.reference";
+RELAX.unclassified    = "RELAX.unclassified";
+RELAX.relaxation_parameter        = "RELAX.K";
+
+term.RELAX.k          = "relaxation coefficient";
+
+/*------------------------------------------------------------------------------*/
+
+
+io.displayAnalysisBanner ({"info" : "RELAX (a random effects test of selection relaxation)
+                            uses a random effects branch-site model framework 
+                            to test whether a set of 'Test' branches evolves under relaxed 
+                            selection relative to a set of 'Reference' branches (R), as measured
+                            by the relaxation parameter (K).",
+                           "version" : "1.00",
+                           RELAX.reference : "In revision, preprint at xxx",
+                           "authors" : "Sergei L Kosakovsky Pond, Ben Murrell, Steven Weaver and the UCSD viral evolution group",
+                           "contact" : "spond at ucsd.edu",
+                           "requirements" : "in-frame codon alignment and a phylogenetic tree, with at least two groups of branches defined using the {} notation (one group can be defined as all unlabeled branches)"         
+                          } );
+
+
+
+
+                  
+
+relax.codon_data_info     = utility.promptForGeneticCodeAndAlignment ("RELAX.codon_data", "RELAX.codon_filter");
+relax.sample_size         = relax.codon_data_info["sites"] * relax.codon_data_info["sequences"];
+
+
+relax.codon_data_info["json"] = relax.codon_data_info["file"] + ".RELAX.json";
+io.reportProgressMessage ("RELAX", "Loaded an MSA with " + relax.codon_data_info["sequences"] + " sequences and " + relax.codon_data_info["sites"] + " codons from '" + relax.codon_data_info["file"] + "'");
+
+relax.codon_frequencies     = utility.defineFrequencies ("RELAX.codon_filter");
+relax.tree 	  = utility.loadAnnotatedTopology (1);
+
+relax.selected_branches = relax.io.defineBranchSets (relax.tree);
+RELAX.has_unclassified = utility.array.find (Rows (relax.selected_branches), RELAX.unclassified) >= 0;
+
+RELAX.json ["partition"] = relax.selected_branches;
+RELAX.json ["tree"] = relax.tree ["string"];
+
+io.reportProgressMessage ("RELAX", "Selected " + Abs (relax.selected_branches[RELAX.test]) + " branches as the test set: " + Join (",", Rows (relax.selected_branches[RELAX.test])));
+
+
+ChoiceList  (RELAX.runModel,"Analysis type",1,NO_SKIP,
+            "All", "[Default] Fit descriptive models AND run the relax test (4 models)",
+            "Minimal", "Run only the RELAX test (2 models)"
+            );
+
+if (RELAX.runModel < 0) {
+    return;
+}
+
+relax.taskTimerStart (1);
+
+if (RELAX.settings["GTR"]) {
+    io.reportProgressMessage ("RELAX", "Obtaining branch lengths under the GTR model");
+    relax.gtr_results = estimators.fitGTR     ("RELAX.codon_filter", relax.tree, None);
+    io.reportProgressMessage ("RELAX", "Log(L) = " + relax.gtr_results["LogL"]);
+    estimators.fixSubsetOfEstimates (relax.gtr_results, relax.gtr_results["global"]);
+} else {
+    relax.gtr_results = None;
+}
+
+if (RELAX.settings["LocalMG"] && RELAX.runModel == 0) {
+  io.reportProgressMessage ("RELAX", "Obtaining  omega and branch length estimates under the local MG94xGTR model");
+  relax.local_mg_results  = estimators.fitMGREV     (relax.codon_data_info, relax.tree, {"model-type" : terms.local}, relax.gtr_results);
+  io.reportProgressMessage ("RELAX", "Log(L) = " + relax.local_mg_results["LogL"]);
+  estimators.fixSubsetOfEstimates (relax.local_mg_results, relax.local_mg_results["global"]);
+} else {
+  relax.local_mg_results = relax.gtr_results;
+}
+
+io.reportProgressMessage ("RELAX", "Obtaining omega and branch length estimates under the partitioned MG94xGTR model");
+relax.mg_results  = estimators.fitMGREV     (relax.codon_data_info, relax.tree, {"model-type" : terms.local, "partitioned-omega" : 1, "fixed-branch-proportions": 1}, relax.local_mg_results);
+relax.taskTimerStop (1);
+
+relax.mg_results_rate =                      
+                     {"Reference"   : {{relax.extract_global_MLE (relax.mg_results, RELAX.reference),1}},
+                      "Test"        : {{relax.extract_global_MLE (relax.mg_results, RELAX.test),1}}};
+                      
+
+
+
+io.reportProgressMessage ("RELAX", "Log(L) = " + relax.mg_results["LogL"]);
+
+
+relax.json_store_lf (RELAX.json, "Partitioned MG94xREV", 
+                     relax.mg_results["LogL"], relax.mg_results["parameters"] + 5,
+                     RELAX.timers[1],
+                     relax._aux.extract_branch_info ((relax.mg_results["branch lengths"])[0], "relax.branch.length"),
+                     relax._aux.extract_branch_info ((relax.mg_results["branch lengths"])[0], "relax.branch.omega"),
+                     relax.mg_results_rate,
+                     None,
+                     "ω"
+                    );
+relax.json_spool (RELAX.json, relax.codon_data_info["json"]);
+
+relax.taskTimerStart (2);
+
+RELAX.model_assignment             = {};
+RELAX.model_specification          = {};
+
+RELAX.reference.model      = relax.io.define_a_bsrel_model (RELAX.reference, relax.codon_frequencies, relax.extract_global_MLE (relax.mg_results, RELAX.reference) ,1);
+RELAX.model_assignment[RELAX.reference] = RELAX.reference.model["id"];
+RELAX.model_specification[RELAX.reference.model["id"]] = RELAX.reference.model;
+
+RELAX.test.model           = relax.io.define_a_bsrel_model (RELAX.test, relax.codon_frequencies, relax.extract_global_MLE (relax.mg_results, RELAX.test) ,1);
+RELAX.model_assignment[RELAX.test] = RELAX.test.model["id"];
+RELAX.model_specification[RELAX.test.model["id"]] = RELAX.test.model;
+
+parameters.constrainSets (RELAX.reference.model ["omegas"], RELAX.test.model ["omegas"]);
+parameters.constrainSets (RELAX.reference.model ["f"], RELAX.test.model ["f"]);
+
+if (RELAX.has_unclassified) {
+    RELAX.unclassified.model = relax.io.define_a_bsrel_model (RELAX.unclassified, relax.codon_frequencies, relax.extract_global_MLE (relax.mg_results, RELAX.test) ,1);
+    RELAX.model_assignment[RELAX.unclassified] = RELAX.unclassified.model["id"];
+    RELAX.model_specification[RELAX.unclassified.model["id"]] = RELAX.unclassified.model;
+    
+    parameters.constrainSets (RELAX.reference.model ["omegas"], RELAX.unclassified.model ["omegas"]);
+    parameters.constrainSets (RELAX.reference.model ["f"], RELAX.unclassified.model ["f"]);
+    
+}
+
+model.applyModelToTree          ("RELAX.tree", relax.tree, RELAX.model_assignment, relax.selected_branches);
+
+ASSUME_REVERSIBLE_MODELS = 1;
+LikelihoodFunction relax.LF = (RELAX.codon_filter, RELAX.tree);
+
+global RELAX.branch_scaler = 4;
+RELAX.proportional_constraint = "RELAX.branch_scaler";
+
+if (RELAX.settings["Estimate GTR"] != 1) {
+    estimators.fixSubsetOfEstimates   (relax.mg_results, relax.mg_results["global"]);
+}
+
+estimators.applyExistingEstimates ("relax.LF",  RELAX.model_specification, relax.mg_results);
+
+USE_LAST_RESULTS       = 1;
+
+if (RELAX.runModel == 0) {
+
+    io.reportProgressMessage ("RELAX", "Two-stage fit of the general descriptive model (separate relaxation parameter for each branch)");
+
+    OPTIMIZATION_PRECISION = 0.1;
+
+    Optimize (relax.MLE.general_descriptive, relax.LF);
+
+    OPTIMIZATION_PRECISION = 0.001;
+    parameters.unconstrain_parameter_set ("relax.LF", {{terms.lf.local.constrained}});
+
+    Optimize (relax.MLE.general_descriptive, relax.LF);
+    io.reportProgressMessage ("RELAX", "Log(L) = " + relax.MLE.general_descriptive[1][0]);
+    
+    relax.general_descriptive = estimators.extractMLEs ("relax.LF", RELAX.model_specification);   
+    relax.add_scores (relax.general_descriptive, relax.MLE.general_descriptive);
+
+    relax.taskTimerStop (2);
+
+    relax.json_store_lf (RELAX.json, "General Descriptive", 
+                         relax.general_descriptive["LogL"], relax.general_descriptive["parameters"],
+                         RELAX.timers[2],
+                         relax._aux.extract_branch_info ((relax.general_descriptive["branch lengths"])[0], "relax.branch.length"),
+                         relax._aux.extract_branch_info ((relax.general_descriptive["branch lengths"])[0], "relax.branch.local_k"),
+                         {"All" : relax.getRateDistribution (RELAX.reference.model, 1)},
+                         None,
+                         "k"
+                        );
+    relax.json_spool (RELAX.json, relax.codon_data_info["json"]);
+    
+} else {
+    parameters.unconstrain_parameter_set ("relax.LF", {{terms.lf.local.constrained}});
+}
+
+
+
+   
+//io.spoolLF ("relax.LF", "/Volumes/home-raid/Desktop/explore", None);
+
+
+if (RELAX.has_unclassified) {
+    parameters.removeConstraint (RELAX.unclassified.model ["omegas"]);
+    parameters.removeConstraint (RELAX.unclassified.model ["f"]);
+}
+
+relax.taskTimerStart (3);
+io.reportProgressMessage ("RELAX", "Fitting the RELAX null model");
+
+
+//io.spoolLF ("relax.LF", "/Volumes/home-raid/Desktop/null", None);
+
+RELAX.null = relax.define.null ("RELAX.tree", RELAX.reference.model, relax.selected_branches);
+
+Optimize (relax.MLE.null, relax.LF);
+io.reportProgressMessage ("RELAX", "Log(L) = " + relax.MLE.null[1][0]);
+
+
+relax.null = estimators.extractMLEs ("relax.LF", RELAX.model_specification);   
+relax.add_scores (relax.null, relax.MLE.null);
+
+relax.taskTimerStop (3);
+
+relax.omega_distributions = {};
+relax.omega_distributions["Test"] = relax.getRateDistribution (RELAX.test.model, 1);
+relax.omega_distributions["Reference"] =  relax.getRateDistribution (RELAX.reference.model, 1);
+                             
+if (RELAX.has_unclassified) {
+    relax.omega_distributions ["Unclassified"] = relax.getRateDistribution (RELAX.unclassified.model, 1);
+}
+
+//io.spoolLF ("relax.LF", "/Volumes/home-raid/Desktop/null", None);
+
+relax.json_store_lf (RELAX.json, "Null", 
+                     relax.null["LogL"], relax.null["parameters"],
+                     RELAX.timers[3],
+                     relax._aux.extract_branch_info ((relax.null["branch lengths"])[0], "relax.branch.length"),
+                     relax._aux.extract_branch_info ((relax.null["branch lengths"])[0], "relax.branch.local_k"),
+                     relax.omega_distributions,
+                     1,
+                     "k"
+                    );
+                    
+relax.json_spool (RELAX.json, relax.codon_data_info["json"]);
+
+io.reportProgressMessage ("RELAX", "Fitting the RELAX alternative model");
+
+relax.taskTimerStart (4);
+parameters.removeConstraint (RELAX.relaxation_parameter);
+Optimize (relax.MLE.alt, relax.LF);
+io.reportProgressMessage ("RELAX", "Log(L) = " + relax.MLE.alt[1][0] + ". Relaxation parameter K = " + Eval (RELAX.relaxation_parameter));
+
+LIKELIHOOD_FUNCTION_OUTPUT = 7;
+fprintf (relax.codon_data_info["file"] + ".alternative.fit", CLEAR_FILE, relax.LF);
+LIKELIHOOD_FUNCTION_OUTPUT = 2;
+
+
+relax.alt = estimators.extractMLEs ("relax.LF", RELAX.model_specification);   
+relax.add_scores (relax.alt, relax.MLE.alt);
+
+RELAX.json ["relaxation-test"] = relax.runLRT (relax.alt["LogL"], relax.null["LogL"]);
+
+io.reportProgressMessage ("RELAX", "Likelihood ratio test for relaxation on Test branches, p = " + (RELAX.json ["relaxation-test"])["p"]);
+ 
+relax.taskTimerStop  (4);
+
+
+relax.omega_distributions["Test"] = relax.getRateDistribution (RELAX.null, Eval (RELAX.relaxation_parameter));
+relax.omega_distributions["Reference"] =  relax.getRateDistribution (RELAX.null, 1);
+
+if (RELAX.has_unclassified) {
+    relax.omega_distributions ["Unclassified"] = relax.getRateDistribution (RELAX.unclassified.model, 1);
+}
+
+relax.json_store_lf (RELAX.json, "Alternative", 
+                     relax.alt["LogL"], relax.alt["parameters"],
+                     RELAX.timers[4],
+                     relax._aux.extract_branch_info ((relax.alt["branch lengths"])[0], "relax.branch.length"),
+                     relax._aux.extract_branch_info ((relax.alt["branch lengths"])[0], "relax.branch.local_k"),
+                     relax.omega_distributions,
+                     Eval (RELAX.relaxation_parameter),
+                     "k"
+                    );
+
+
+if (RELAX.runModel == 0) {
+
+    relax.taskTimerStart  (5);
+
+    parameters.removeConstraint (RELAX.test.model ["omegas"]);
+    parameters.removeConstraint (RELAX.test.model ["f"]);
+    parameters.setConstraint    (RELAX.relaxation_parameter, Eval (RELAX.relaxation_parameter), "");
+
+
+    io.reportProgressMessage ("RELAX", "Fitting the RELAX partitioned exploratory model");
+    Optimize (relax.MLE.part.expl, relax.LF);
+    io.reportProgressMessage ("RELAX", "Log(L) = " + relax.MLE.part.expl [1][0]);
+
+    LIKELIHOOD_FUNCTION_OUTPUT = 7;
+    fprintf (relax.codon_data_info["file"] + ".partitioned_descriptive.fit", CLEAR_FILE, relax.LF);
+    LIKELIHOOD_FUNCTION_OUTPUT = 2;
+
+    relax.part.expl = estimators.extractMLEs ("relax.LF", RELAX.model_specification);   
+
+    relax.omega_distributions["Test"]       = relax.getRateDistribution (RELAX.test.model,Eval (RELAX.relaxation_parameter));
+    relax.omega_distributions["Reference"] =  relax.getRateDistribution (RELAX.reference.model, 1);
+
+    if (RELAX.has_unclassified) {
+        relax.omega_distributions ["Unclassified"] = relax.getRateDistribution (RELAX.unclassified.model, 1);
+    }
+
+    relax.add_scores (relax.part.expl, relax.MLE.part.expl);
+
+    relax.taskTimerStop  (5);
+    relax.json_store_lf (RELAX.json, "Partitioned Exploratory", 
+                         relax.part.expl["LogL"], relax.part.expl["parameters"],
+                         RELAX.timers[5],
+                         relax._aux.extract_branch_info ((relax.part.expl["branch lengths"])[0], "relax.branch.length"),
+                         None,
+                         relax.omega_distributions,
+                         None,
+                         ""
+                        );
+}
+
+
+relax.taskTimerStop  (0);
+
+
+(RELAX.json ["timers"])["Overall"]                  = RELAX.timers[0];
+(RELAX.json ["timers"])["Preliminaries"]            = RELAX.timers[1];
+(RELAX.json ["timers"])["General Descriptive"]      = RELAX.timers[2];
+(RELAX.json ["timers"])["Null"]                     = RELAX.timers[3];
+(RELAX.json ["timers"])["Alternative"]              = RELAX.timers[4];
+(RELAX.json ["timers"])["Partitioned Descriptive"]  = RELAX.timers[5];
+
+relax.json_spool (RELAX.json, relax.codon_data_info["json"]);
+
+//------------------------------------------------------------------------------ 
+// HELPER FUNCTIONS FROM THIS POINT ON
+//------------------------------------------------------------------------------ 
+
+function relax.extract_global_MLE (fit, id) {
+    return ((fit["global"])[id])["MLE"];
+}
+
+function relax.branch.length (branch_info) {
+    return branch_info["MLE"];
+}
+
+function relax.branch.omega  (branch_info) {
+    return parameters.normalize_ratio ((branch_info[terms.nonsynonymous_rate])["MLE"], (branch_info[terms.synonymous_rate])["MLE"]);
+}
+
+function relax.branch.local_k  (branch_info) {
+    return (branch_info[term.RELAX.k])["MLE"];
+}
+
+function relax._aux.extract_branch_info.callback (key, value) {
+    relax._aux.extract_branch_info_result [key] = utility.callFunction (callback, {"0" : "value"});
+}
+
+function relax._aux.extract_branch_info (branch_spec, callback) {
+    relax._aux.extract_branch_info_result = {};
+    branch_spec ["relax._aux.extract_branch_info.callback"][""];
+    return relax._aux.extract_branch_info_result;
+}
+
+
+//------------------------------------------------------------------------------ 
+function relax.getRateDistribution (model_description, K) {
+  relax.getRateInformation.rate_classes = Abs (model_description["omegas"]);
+  relax.getRateInformation.omega_info = {relax.getRateInformation.rate_classes,2};
+  
+  for (relax.getRateInformation.k = 0; relax.getRateInformation.k < relax.getRateInformation.rate_classes; relax.getRateInformation.k += 1) {
+    relax.getRateInformation.omega_info[relax.getRateInformation.k][0] = Eval ((model_description["omegas"])[relax.getRateInformation.k])^K;
+    relax.getRateInformation.omega_info[relax.getRateInformation.k][1] = Eval ((model_description["weights"])[relax.getRateInformation.k]);
+  }
+  return relax.getRateInformation.omega_info % 0;
+}
+
+
+
+//------------------------------------------------------------------------------ 
+function relax.define.null._aux (key, value) {
+    //fprintf (stdout, "`tree_id`.`key`.`relax.define.null.local` := `relax.define.null.global`\n");
+    ExecuteCommands ("`tree_id`.`key`.`relax.define.null.local` := `relax.define.null.global`");  
+}
+
+//------------------------------------------------------------------------------ 
+function relax.define.null (tree_id, general_model, partition) {
+    RELAX.null = general_model;
+    parameters.removeConstraint ((general_model["omegas"])[2]);
+    
+    relax.define.null.local = ((general_model["parameters"])["local"])[term.RELAX.k];
+
+    //fprintf (stdout, "\n**", relax.define.null.par , "\n");
+    relax.define.null.global = "1";
+    (partition[RELAX.reference])["relax.define.null._aux"][""];
+    
+    parameters.setConstraint (RELAX.relaxation_parameter, 1, terms.global);
+    relax.define.null.global = RELAX.relaxation_parameter;
+
+    (partition[RELAX.test])["relax.define.null._aux"][""];
+    
+    ((general_model["parameters"])["global"])[RELAX.relaxation_parameter] = RELAX.relaxation_parameter;
+    
+    return RELAX.null;
+}
+
+
+
+//------------------------------------------------------------------------------ 
+function relax.add_scores (desc, mles) {
+    if (Type (mles) == "Matrix") {
+        desc ["LogL"] = mles[1][0];
+        desc ["parameters"] = mles[1][1] + 9 + 5 * (RELAX.settings["Estimate GTR"] != 1);
+    }
+}
+
+//------------------------------------------------------------------------------ 
+function relax.runLRT (ha, h0) {
+    return {"LR" : 2*(ha-h0),
+            "p" : 1-CChi2 (2*(ha-h0),1)};
+}
+
+
+//------------------------------------------------------------------------------ 
+function relax._aux.define_bsrel_model (id,Q,weights,freqs) {
+    rate_count = Abs (Q);
+    components = {};
+    length = "";
+    Eval ("`id`_eqf = freqs");
+
+    for (k = 0; k < rate_count; k+=1) {
+        components[k] = "Exp(" + Q[k] + ")*" + weights[k];
+        ExecuteCommands ("Model busted._aux.define_bsrel_model_bl = (" + Q[k] + ",`id`_eqf,0)");
+        GetString (blExp, busted._aux.define_bsrel_model_bl, -1);
+        if (k) {
+            length += "+";
+        }
+        length += "(`blExp`)*" + weights[k];
+    }
+    
+    ExecuteCommands ("Model `id` =(\"" + Join("+",components) + "\",`id`_eqf,EXPLICIT_FORM_MATRIX_EXPONENTIAL);");
+    return length;
+}
+
+
+
+//------------------------------------------------------------------------------ 
+
+function relax.io.evaluator (key, value) {
+    fprintf (stdout, key, "->", Eval (value), "\n");
+}
+
+//------------------------------------------------------------------------------ 
+function relax.io.define_a_bsrel_model (id, frequencies, mean_omega, do_local) {
+
+    model_parameters = {"parameters" : {"global" : {}, "local" : {}}, "omegas" : {}, "weights" : {}, "f" : {}, "Q" : {}, "length" : ""};
+    
+    model_parameters["omegas"] = parameters.generate_sequential_names ("`id`.omega",    3, "_");
+    model_parameters["f"]      = parameters.generate_sequential_names ("`id`.aux_freq", 2, "_");
+    
+    parameters.declareGlobal    (model_parameters["f"], None);
+    parameters.setRange         (model_parameters["f"], terms.range01);
+
+    parameters.declareGlobal    (model_parameters["omegas"], None);
+    
+    
+    model_parameters["weights"] = parameters.helper.stick_breaking (model_parameters["f"], {{0.7,0.25,0.05}});
+    
+    relax.init_omegas = {{0.05,0.25,4}};
+    relax.init_omegas = relax.init_omegas * (1/ parameters.mean (relax.init_omegas, model_parameters["weights"], Abs (model_parameters["omegas"])));
+
+    parameters.setRange ((model_parameters["omegas"])[0], terms.range01);
+    parameters.set_value ((model_parameters["omegas"])[0], relax.init_omegas[0]);
+    
+    parameters.setRange ((model_parameters["omegas"])[1], terms.range01);
+    parameters.set_value ((model_parameters["omegas"])[1], relax.init_omegas[1]);
+    
+    parameters.setRange ((model_parameters["omegas"])[2], terms.range_gte1);
+    parameters.set_value ((model_parameters["omegas"])[2], relax.init_omegas[2]);
+    
+    if (do_local) {
+        parameters.setConstraint ((model_parameters["omegas"])[2], " 1/" + ((model_parameters["omegas"])[0]) + "/" + ((model_parameters["omegas"])[1]) , "");
+        relax.io.define_a_bsrel_model_r = {"LB" : 1e-4, "UB" : 1};        
+        parameters.setRange ((model_parameters["omegas"])[1], relax.io.define_a_bsrel_model_r);
+    }
+    
+
+   local_k :< 50;
+      
+    for (k = 1; k <= 3; k +=1) {
+        ((model_parameters["parameters"])["global"])[relax.define_omega_term (k)] = (model_parameters["omegas"])[k-1];
+        if (k < 3) {
+            ((model_parameters["parameters"])["global"])[relax.define_weight_term (k)] = (model_parameters["f"])[k-1];
+        }
+    
+        model_parameters["Q"] + ("Q_`id`_" + k);
+        if (do_local) {
+            PopulateModelMatrix			  ((model_parameters["Q"])[k-1],  frequencies["nucleotide"], "t", "Min (1000," + (model_parameters["omegas"])[k-1] +"^local_k)", "");        
+        } else {
+            PopulateModelMatrix			  ((model_parameters["Q"])[k-1],  frequencies["nucleotide"], "t", (model_parameters["omegas"])[k-1], "");
+        }
+    }
+    
+    model_parameters["id"] = "`id`_model";
+    model_parameters["length-expression"] = relax._aux.define_bsrel_model ("`id`_model", model_parameters["Q"], model_parameters["weights"], frequencies["codon"]);
+    
+    ((model_parameters["parameters"])["global"])[terms.nucleotideRate ("A","C")] = "AC";
+    ((model_parameters["parameters"])["global"])[terms.nucleotideRate ("A","T")] = "AT";
+    ((model_parameters["parameters"])["global"])[terms.nucleotideRate ("C","G")] = "CG";
+    ((model_parameters["parameters"])["global"])[terms.nucleotideRate ("C","T")] = "CT";
+    ((model_parameters["parameters"])["global"])[terms.nucleotideRate ("G","T")] = "GT";
+    
+    model_parameters["set-branch-length"] = "relax.aux.copy_branch_length";
+    
+    model_parameters["length parameter"] = "t";
+    ((model_parameters["parameters"])[terms.local])[terms.timeParameter ()] = "t";
+    if (do_local) {
+        ((model_parameters["parameters"])[terms.local])[term.RELAX.k] = "local_k";
+    }   
+    model_parameters["get-branch-length"] = "relax.aux.retrieve_branch_length";
+    return model_parameters;
+}
+
+//------------------------------------------------------------------------------ 
+
+
+function relax.aux.retrieve_branch_length (model, tree, node) {
+    relax.aux.retrieve_branch_length.locals = Columns ((model_parameters["parameters"])[terms.local]);
+    for (relax.aux.retrieve_branch_length.i = 0; relax.aux.retrieve_branch_length.i < Columns (relax.aux.retrieve_branch_length.locals); relax.aux.retrieve_branch_length.i += 1) {
+        Eval (relax.aux.retrieve_branch_length.locals[relax.aux.retrieve_branch_length.i] + " = `tree`.`node`." + relax.aux.retrieve_branch_length.locals[relax.aux.retrieve_branch_length.i]);
+    }
+    return Eval (model["length-expression"]);
+}
+
+//------------------------------------------------------------------------------ 
+
+function relax.aux.copy_branch_length (model, value, parameter) {
+
+    relax.aux.copy_branch_length.t = ((model["parameters"])["local"])[terms.timeParameter ()];
+    relax.aux.copy_branch_length.k = ((model["parameters"])["local"])[term.RELAX.k];
+    
+    if (Abs (RELAX.proportional_constraint)) {
+        Eval ("`parameter`.`relax.aux.copy_branch_length.t` := `RELAX.proportional_constraint` * " + value);        
+    } else {
+        Eval ("`parameter`.`relax.aux.copy_branch_length.t` = " + value);
+    }
+    
+    if (Type (relax.aux.copy_branch_length.k) == "String") {
+        Eval ("`parameter`.`relax.aux.copy_branch_length.k` = 1");
+    }
+}
+
+function relax._aux.io.countBranchSets (key, value) {
+    available_models[value] += 1;
+    return None;
+}
+
+function relax._aux.io.mapBranchSets (key, value) {
+    /*if (Abs (value) == 0) {
+        value = RELAX.unclassified;
+    }*/
+    (relax.tree ["model_map"])[key] = branch_set[value];
+    (return_set[branch_set[value]])[key] = 1;
+    return None;
+}
+
+function relax.handle.unlabeled (label) {
+    if (label == "Unlabeled branches") {
+        return "";
+    } else {
+        return label;
+    }
+}
+
+//------------------------------------------------------------------------------ 
+function relax.io.defineBranchSets (relax.tree) {
+    
+    available_models        = {};
+    branch_set              = {};
+    
+    
+    for (k = 0; k < Columns (relax.tree["model_list"]); k += 1) {
+        available_models  [(relax.tree["model_list"])[k]] = 0;
+    }
+    
+    (relax.tree["model_map"])["relax._aux.io.countBranchSets"][""];
+    
+     
+    list_models = Rows (available_models); // get keys    
+    io.checkAssertion ("Columns (list_models) > 1", "The tree string must include at least one two sets of branches, at least one of which is annotated using {}");
+    
+    option_count = Columns (list_models);
+        
+    selectTheseForTesting = {option_count,2};
+    for (k = 0; k < Columns (list_models); k+=1) {
+        if (list_models[k] != "") {
+            selectTheseForTesting [k][0] = list_models[k];
+            selectTheseForTesting [k][1] = "Set " + list_models [k] + " with " + available_models[list_models[k]] + " branches";
+        } else {
+            selectTheseForTesting [k][0] = "Unlabeled branches";
+            selectTheseForTesting [k][1] = "Set of " + available_models[list_models [k]] + " unlabeled branches";
+        }
+    }
+    
+    
+    ChoiceList  (fgSet,"Choose the set of branches to test for relaxed selection (T set)",1,NO_SKIP,selectTheseForTesting);
+    
+    return_set = {};
+    
+    if (fgSet >= 0) {
+        branch_set [relax.handle.unlabeled(selectTheseForTesting[fgSet][0])] = RELAX.test;
+        return_set [RELAX.test] = {};
+        if (option_count > 2) {
+            ChoiceList  (bgSet,"Choose the set of reference branches (R set)",1,fgSet,selectTheseForTesting);    
+            if (bgSet < 0) {
+                return {};
+            }    
+            for (k = 0; k < option_count; k+=1) {
+                if (k != bgSet && k != fgSet) {
+                    branch_set [relax.handle.unlabeled(selectTheseForTesting[k][0])] = RELAX.unclassified;
+                    return_set [RELAX.unclassified] = {};
+                    break;
+                }
+            }
+        }
+        else {
+            
+            bgSet = 1-fgSet;
+        }
+        branch_set [relax.handle.unlabeled(selectTheseForTesting[bgSet][0])] = RELAX.reference;
+        return_set [RELAX.reference] = {};
+     }
+         
+    (relax.tree["model_map"])["relax._aux.io.mapBranchSets"][""];
+    relax.tree["model_list"] = Columns (relax.tree["model_map"]);
+    //fprintf (stdout, "\n", relax.tree, "\n", return_set, "\n");
+    
+    return return_set;
+    
+}
+
+
+//------------------------------------------------------------------------------------------------------------------------
+
+function relax.taskTimerStart (index) {
+    RELAX.timers[index] = Time(1);
+}
+
+function relax.taskTimerStop (index) {
+    RELAX.timers[index] = Time(1) - RELAX.timers[index];
+}
+
+//------------------------------------------------------------------------------------------------------------------------
+
+function relax.getIC (logl,params,samples) {
+    return -2*logl + 2*samples/(samples-params-1)*params;
+}
+
+//------------------------------------------------------------------------------------------------------------------------
+
+lfunction relax.define_omega_term (cat) {
+    return "Omega for category " + cat;
+}
+
+lfunction relax.define_weight_term (cat) {
+    return "Omega frequency parameter " + cat;
+}
+
+//------------------------------------------------------------------------------------------------------------------------
+
+function relax.json_spool (json, file) {
+    USE_JSON_FOR_MATRIX = 1;
+    fprintf (file, CLEAR_FILE, json);
+    USE_JSON_FOR_MATRIX = 0;
+
+}
+
+//------------------------------------------------------------------------------------------------------------------------
+
+function relax.json_store_lf (json, name, ll, df, time, branch_length, branch_annotation, omega_distribution, K, annotation_tag) {
+
+    (json["fits"])[name] = {"log-likelihood"     : ll,
+                            "parameters"         : df,
+                            "AIC-c"              : relax.getIC (ll, df, relax.sample_size),
+                            "runtime"            : time,
+                            "branch-lengths"     : branch_length,
+                            "branch-annotations" : branch_annotation,
+                            "rate-distributions" : omega_distribution, 
+                            "K" : K, 
+                            "annotation-tag" : annotation_tag, 
+                            "display-order" : Abs (json["fits"])};
+                            
+ }
diff --git a/res/TemplateBatchFiles/RateClassCounter.bf b/res/TemplateBatchFiles/RateClassCounter.bf
new file mode 100644
index 0000000..50a005d
--- /dev/null
+++ b/res/TemplateBatchFiles/RateClassCounter.bf
@@ -0,0 +1,918 @@
+REPLACE_TREE_STRUCTURE = 1;
+/*****************************************************************************/
+function echoCatVar (distrInfo)
+{
+	D = Columns(distrInfo);
+	E = 0.0;
+	for (k=0; k<D; k=k+1)
+	{
+		E = distrInfo[0][k]*distrInfo[1][k]+E;
+	}
+	sampleVar = 0.0;
+	for (k=0; k<D; k=k+1)
+	{
+		sampleVar = sampleVar+(distrInfo[0][k]-E)*(distrInfo[0][k]-E);
+	}
+	sampleVar = sampleVar/(D-1);
+	fprintf  (stdout,"\n\nSample mean = ",E, " (sample variance = ",sampleVar,")\n");
+	for (k=0; k<D; k=k+1)
+	{
+		fprintf (stdout,"\nRate[",Format(k,0,0),"]=",Format(distrInfo[0][k],12,8), " (weight=", 
+						  Format(distrInfo[1][k],9,7),")");
+	}
+	fprintf (stdout,"\n------------------------------------------------\n");
+	return 0.0;
+}
+
+/*****************************************************************************/
+
+function fitASite (t)
+{
+	return (treePath < rateMatrix*t) - t;
+}
+
+
+/*****************************************************************************/
+function doNCatLFit (useApprox, resp)
+{
+	gdDefString = "";
+	gdDefString * 1024;
+	for (mi=1; mi<=resp; mi=mi+1)
+	{
+		gdDefString*("global PS_"+mi+" = 1/"+((resp+1)-mi)+";\nPS_"+mi+":<1;\n");
+	}
+	
+	gdDefString*("\n\nglobal RS_1 = Random(0,0.5);\nRS_1:<1;RS_1:>0.000000001;\n");
+
+	for (mi=3; mi<=resp; mi=mi+1)
+	{
+		gdDefString*("global RS_"+mi+" = Random(1,2);"+"\nRS_"+mi+":>1;RS_"+mi+":<100000;\n");
+	} 
+
+	rateStrMx    = {resp,1};
+	rateStrMx[0] = "RS_1";
+	rateStrMx[1] = "1";
+
+	for (mi=3; mi<=resp; mi=mi+1)
+	{
+		rateStrMx[mi-1] = rateStrMx[mi-2]+"*RS_"+mi;
+	} 	
+
+	freqStrMx    = {resp,1};
+	freqStrMx[0] = "PS_1";
+
+	for (mi=1; mi<resp-1; mi=mi+1)
+	{
+		freqStrMx[mi] = "";
+		for (mi2=1;mi2<=mi;mi2=mi2+1)
+		{
+			freqStrMx[mi] = freqStrMx[mi]+"(1-PS_"+mi2+")";		
+		}
+		freqStrMx[mi] = freqStrMx[mi]+"PS_"+(mi+1);	
+	}	
+
+	freqStrMx[mi] = "";
+	for (mi2=1;mi2<mi;mi2=mi2+1)
+	{
+		freqStrMx[mi] = freqStrMx[mi]+"(1-PS_"+mi2+")";		
+	}
+	freqStrMx[mi] = freqStrMx[mi]+"(1-PS_"+mi+")";	
+
+
+	gdDefString*("\n\nglobal c_scale:="+rateStrMx[0]+"*"+freqStrMx[0]);
+
+	for (mi=1; mi<resp; mi=mi+1)
+	{
+		gdDefString*("+"+rateStrMx[mi]+"*"+freqStrMx[mi]);
+	}
+
+	gdDefString*(";\ncategFreqMatrix={{"+freqStrMx[0]);
+
+	for (mi=1; mi<resp; mi=mi+1)
+	{
+		gdDefString*(","+freqStrMx[mi]);
+	}
+
+	gdDefString*("}};\ncategRateMatrix={{"+rateStrMx[0]+"/c_scale");
+
+	for (mi=1; mi<resp; mi=mi+1)
+	{
+		gdDefString*(","+rateStrMx[mi]+"/c_scale");
+	}
+
+	gdDefString*("}};\n\ncategory c  = ("+resp+", categFreqMatrix , MEAN, ,categRateMatrix, 0, 1e25);\n\n");
+	gdDefString*0;
+	
+	ExecuteCommands (gdDefString);
+
+	if (Abs(useApprox)>0)
+	{
+		mi = Columns (useApprox);
+		
+		RS_1 = useApprox[0][0]/useApprox[0][1];
+		
+		if (mi>2)
+		{
+			RS_3 = useApprox[0][2]/useApprox[0][1];
+		}
+		
+		for (mpiNode = 4; mpiNode < mi; mpiNode = mpiNode+1)
+		{
+			ExecuteCommands ("RS_"+(mpiNode+1)+"="+useApprox[0][mpiNode]/useApprox[0][mpiNode-1]+";");
+		}
+
+		mi2 = 1-useApprox[1][0];
+
+		for (mpiNode = 1; mpiNode < mi; mpiNode = mpiNode+1)
+		{
+			useApprox[1][mpiNode] = useApprox[1][mpiNode]/mi2;
+			mi2 = mi2*(1-useApprox[1][mpiNode]);
+			if (mi2 == 0)
+			{
+				break;
+			}
+		}
+
+		for (mpiNode = 0; mpiNode < mi; mpiNode = mpiNode+1)
+		{
+			ExecuteCommands ("PS_"+(mpiNode+1)+"="+useApprox[1][mpiNode]+";");
+		}
+
+	}
+
+	Tree		   testTree = treeString;
+	if (branchLengths)
+	{
+		for (mpiNode = 0; mpiNode < totalBranchCount; mpiNode = mpiNode+1)
+		{
+			eCommand = "testTree."+branchNames[mpiNode]+".t:="+Format(stashedLengths [mpiNode],20,12)+"/totalFactor";
+			ExecuteCommands (eCommand);
+		}	
+	}
+
+	fprintf (stdout, "\n\nFitting ", resp, " rate classes\n");
+	/*fprintf (stdout, gdDefString, "\n")
+	fprintf (stdout, LIST_ALL_VARIABLES, "\n");
+	fscanf (stdin,"String", d);*/
+	LikelihoodFunction lfR = (filteredData,testTree);
+	Optimize (resR,lfR);
+	
+	slfo = LIKELIHOOD_FUNCTION_OUTPUT;
+	LIKELIHOOD_FUNCTION_OUTPUT = 7;
+	
+	fName = pathPrefix + "."+ resp;
+	fprintf (fName, CLEAR_FILE, lfR);
+
+	LIKELIHOOD_FUNCTION_OUTPUT = slfo;
+	
+	if (branchLengths)
+	{
+		AICScore = 2*(resR[1][1]+res[1][1]-res[1][2]-resR[1][0]);
+	}
+	else
+	{
+		AICScore = 2*(resR[1][1]-resR[1][0]);	
+	}
+	
+	fprintf (stdout, "\nLikelihood = ", resR[1][0], "\nAIC Score:", AICScore);
+	GetInformation (cI, c);
+	echoCatVar (cI);
+	ClearConstraints (c);
+	return 0;
+
+}
+
+/*****************************************************************************/
+
+function  DoNCategoryFitK (weightMatrix)
+{
+	breakPointMatrix = (SELECTED_CHART_DATA == weightMatrix);
+	return breakPointMatrix[3][0];
+}
+
+/*****************************************************************************/
+
+function  DoNCategoryFit (weightMatrix)
+{
+	weightClasses	 = Rows(weightMatrix);
+	breakPointMatrix = {3,weightClasses};
+	
+	runningSum 		= 0;
+	targetSum  		= weightMatrix[0];
+	currentIndex 	= 0;
+	currentSlider	= 0;
+	runningSize		= 1;
+	valueSum		= 0;
+	currentSpan		= SELECTED_CHART_DATA[1][currentIndex];
+	
+	measCount 		= Columns (SELECTED_CHART_DATA);
+	
+	
+	while (currentIndex < measCount - 1)
+	{
+		runningSum = runningSum + SELECTED_CHART_DATA[1][currentIndex]/dataPoints;
+		
+		if ((runningSum >= targetSum)||(measCount-currentIndex <= weightClasses - currentSlider))
+		{
+			breakPointMatrix[0][currentSlider] = currentIndex;
+			breakPointMatrix[1][currentSlider] = runningSize;
+			breakPointMatrix[2][currentSlider] = (SELECTED_CHART_DATA[0][currentIndex]*SELECTED_CHART_DATA[1][currentIndex]+valueSum)/(currentSpan+SELECTED_CHART_DATA[1][currentIndex]);	
+			runningSize   = 1;	
+			valueSum	  = 0;
+			currentSlider = currentSlider + 1;
+			targetSum 	  = targetSum + weightMatrix[currentSlider];
+			currentSpan	  = 0;
+		}	
+		else
+		{
+			valueSum	= valueSum	  + SELECTED_CHART_DATA[0][currentIndex]*SELECTED_CHART_DATA[1][currentIndex];
+			runningSize = runningSize + 1;
+			currentSpan = currentSpan + SELECTED_CHART_DATA[1][currentIndex];
+		}
+		currentIndex = currentIndex + 1;
+	}
+
+	currentSpan	  = currentSpan + SELECTED_CHART_DATA[1][currentIndex];
+	valueSum = valueSum	+ SELECTED_CHART_DATA[0][currentIndex]*SELECTED_CHART_DATA[1][currentIndex];
+	breakPointMatrix[0][currentSlider] = currentIndex;
+	breakPointMatrix[1][currentSlider] = runningSize;	
+	breakPointMatrix[2][currentSlider] = valueSum/currentSpan;	
+	
+		
+	currentIndex 	= 0;
+	currentSlider	= 0;
+	runningOffset	= 0;
+	
+	logLikelihood	= 0;
+	valueSum		= Rows(weightMatrix);
+	
+	while (currentSlider < valueSum)
+	{
+		classSize 	= breakPointMatrix[1][currentSlider];
+		classWeight = weightMatrix[currentSlider];
+			
+		if (classWeight > 0.0)
+		{
+			if (classSize == 1)
+			{
+				logLikelihood = logLikelihood + SELECTED_CHART_DATA[1][runningOffset] * Log (weightMatrix[currentSlider]);
+			}
+			else
+			{
+				classMean 		= breakPointMatrix[2][currentSlider];
+				classNorm 		= 0;
+				currentIndex 	= runningOffset+classSize;
+					
+				REWEIGHTED_MATRIX = {measCount,1};
+				for (reslider = runningOffset; reslider < currentIndex; reslider = reslider+1)
+				{
+					targetSum = SELECTED_CHART_DATA[0][reslider];
+					targetSum = Exp(-(targetSum-classMean)^2/(2*Abs(classMean)));		
+					if (targetSum==0)
+					{
+						targetSum = 1e-50;
+					}
+					REWEIGHTED_MATRIX[reslider] = targetSum;
+					classNorm = classNorm + targetSum;
+				}
+				
+				REWEIGHTED_MATRIX = Log (REWEIGHTED_MATRIX * (classWeight/classNorm));								
+				for (reslider = runningOffset; reslider < currentIndex; reslider = reslider+1)
+				{
+					logLikelihood = logLikelihood + REWEIGHTED_MATRIX[reslider]*SELECTED_CHART_DATA[1][reslider];
+				}
+			}
+		}
+		else
+		{
+			if (classSize>0)
+			{
+				return -(1e100);
+			}
+		}
+		runningOffset = runningOffset + classSize;
+		currentSlider = currentSlider + 1;
+	}
+	
+	return logLikelihood;
+}
+
+/*****************************************************************************/
+
+SetDialogPrompt ("Please specify a nucleotide file:");
+
+DataSet ds = ReadDataFile (PROMPT_FOR_FILE);
+DataSetFilter filteredData = CreateFilter (ds,1);
+
+fprintf (stdout,"\n______________READ THE FOLLOWING DATA______________\n",ds);
+
+global AC 	= 1;
+global AT 	= 1;
+global CG 	= 1;
+global CT 	= 1;
+global GT 	= 1;
+global c;
+
+NucleotideMatrix	 = {{*,AC*t,t,AT*t}{AC*t,*,CG*t,CT*t}{t,CG*t,*,GT*t}{AT*t,CT*t,GT*t,*}};
+NucleotideMatrixC	 = {{*,AC*t*c,t*c,AT*t*c}{AC*t*c,*,CG*t*c,CT*t*c}{t*c,CG*t*c,*,GT*t*c}{AT*t*c,CT*t*c,GT*t*c,*}};
+
+modelDesc = "";
+
+done = 0;
+while (!done)
+{
+	fprintf (stdout,"\nPlease enter a 6 character model designation (e.g:010010 defines HKY85):");
+	fscanf  (stdin,"String", modelDesc);
+	if (Abs(modelDesc)==6)
+	{	
+		done = 1;
+	}
+}			
+
+rateBiasTerms = {{"AC","1","AT","CG","CT","GT"}};
+paramCount	  = 0;
+
+modelConstraintString = "";
+
+for (customLoopCounter2=1; customLoopCounter2<6; customLoopCounter2=customLoopCounter2+1)
+{
+	for (customLoopCounter=0; customLoopCounter<customLoopCounter2; customLoopCounter=customLoopCounter+1)
+	{
+		if (modelDesc[customLoopCounter2]==modelDesc[customLoopCounter])
+		{
+			if (rateBiasTerms[customLoopCounter2] == "1")
+			{
+				modelConstraintString = modelConstraintString + rateBiasTerms[customLoopCounter]+":="+rateBiasTerms[customLoopCounter2]+";";
+			}
+			else
+			{
+				modelConstraintString = modelConstraintString + rateBiasTerms[customLoopCounter2]+":="+rateBiasTerms[customLoopCounter]+";";			
+			}
+			break;
+		}
+	}
+}	
+
+if (Abs(modelConstraintString))
+{
+	ExecuteCommands (modelConstraintString);
+}
+	
+ChoiceList (branchLengths,"Estimate Branch Lengths",1,SKIP_NONE,
+			"Every Time","Branch lengths are reestimated for every model.",
+			"Once","Branch lenghts obtained from the single rate model are reused for subsequent models."
+	       );
+
+if (branchLengths<0)
+{
+	return;
+}
+
+SetDialogPrompt ("Save Analysis Results to");
+fprintf (PROMPT_FOR_FILE, CLEAR_FILE);
+pathPrefix = LAST_FILE_PATH;
+
+HarvestFrequencies (overallFrequencies,  filteredData,1,1,0);
+Model NucModel = (NucleotideMatrix, overallFrequencies, 1);
+
+pia = overallFrequencies[0];
+pic = overallFrequencies[1];
+pig = overallFrequencies[2];
+pit = overallFrequencies[3];
+
+	
+_DO_TREE_REBALANCE_ = 1;
+#include "queryTree.bf";
+LikelihoodFunction lf = (filteredData,givenTree);
+Optimize (res,lf);
+fprintf (stdout, "\nSingle Rate fit\n",lf,"\n");
+fprintf (pathPrefix, "\nSingle Rate fit\n",lf,"\n");
+
+DataSet dsA					= ReconstructAncestors (lf);
+DataSetFilter filteredDataA = CreateFilter (dsA,1);
+
+seqToBranchMap = {stateCharCount,1};
+
+DataSet		   dsJoint = Combine(dsA,ds);
+DataSetFilter filteredDataJ = CreateFilter (dsJoint,1);
+
+branchNames = BranchName (givenTree,-1);
+h = Columns (branchNames);
+
+seqToBranchMap 	= {h, 2};
+
+for (k=0; k<filteredData.species; k=k+1)
+{
+	GetString (seqName, filteredData, k);
+	seqToBranchMap[k][0] = -1;
+	for (v=0; v<h; v=v+1)
+	{
+		if (branchNames[v] % seqName)
+		{
+			seqToBranchMap[k][0] = v;
+			seqToBranchMap[v][1] = k;
+			break;
+		}
+	}
+}
+
+
+
+seqToBranchMap[filteredData.species][0] = h-1;
+seqToBranchMap[h-1][1] = filteredData.species;
+
+for (k=1; k<filteredDataA.species; k=k+1)
+{
+	GetString (seqName, filteredDataA, k);
+	seqToBranchMap[filteredData.species+k][0] = -1;
+	for (v=0; v<h; v=v+1)
+	{
+		if (branchNames[v] % seqName)
+		{
+			seqToBranchMap[k+filteredData.species][0] = v;
+			seqToBranchMap[v][1] = k+filteredData.species;
+			break;
+		}
+	}
+}
+
+treePath = {3,Columns(branchNames)-1};
+for (v=Columns(branchNames)-2; v>=0; v=v-1)
+{
+	ExecuteCommands ("treePath[2]["+v+"]=givenTree."+branchNames[v]+".t;");
+}
+
+/* get codon matrix */
+
+codonInfo  = {filteredData.species, filteredData.unique_sites};
+codonInfo2 = {filteredDataA.species, filteredDataA.unique_sites};
+
+GetDataInfo    (dupInfo, filteredData);
+GetDataInfo	   (dupInfoA, filteredDataA);
+GetDataInfo	   (dupInfoJ, filteredDataJ);
+
+doneSites = {1,filteredDataJ.unique_sites};
+
+for (h=filteredDataJ.unique_sites-1; h>=0; h=h-1)
+{
+	doneSites  [h] = -1;
+}
+
+stateCharCount = 4;
+
+matrixTrick  = {1,stateCharCount};
+matrixTrick2 = {1,stateCharCount};
+
+for (h=Columns(matrixTrick)-1; h>=0; h=h-1)
+{
+	matrixTrick  [h] = h;
+	matrixTrick2 [h] = 1;
+}
+
+for (v=0; v<filteredData.unique_sites;v=v+1)
+{
+	for (h=0; h<filteredData.species;h=h+1)
+	{
+		GetDataInfo (siteInfo, filteredData, h, v);
+		_SITE_ES_COUNT = matrixTrick2 * siteInfo; 
+		if (_SITE_ES_COUNT[0] == 1)
+		{
+			siteInfo = matrixTrick * siteInfo;
+			codonInfo[h][v] = siteInfo[0];
+		}
+		else
+		{
+			codonInfo[h][v] = -1;
+		}
+	}
+}
+
+for (v=0; v<filteredDataA.unique_sites;v=v+1)
+{
+	for (h=0; h<filteredDataA.species;h=h+1)
+	{
+		GetDataInfo (siteInfo, filteredDataA, h, v);
+		siteInfo = matrixTrick * siteInfo;
+		codonInfo2[h][v] = siteInfo[0];
+	}
+}
+
+_SITE_RESULTS = {4,filteredData.sites};
+flatTreeRep	  = Abs (givenTree);
+
+resultMatrix = {filteredData.sites,2};
+
+t = 1;
+rateMatrix = NucleotideMatrix*{4,4{0,0,pia}{1,1,pic}{2,2,pig}{3,3,pit}};
+
+rateMatrix[0][0] = -rateMatrix[0][1]-rateMatrix[0][2]-rateMatrix[0][3];
+rateMatrix[1][1] = -rateMatrix[1][0]-rateMatrix[1][2]-rateMatrix[1][3];
+rateMatrix[2][2] = -rateMatrix[2][0]-rateMatrix[2][1]-rateMatrix[2][3];
+rateMatrix[3][3] = -rateMatrix[3][0]-rateMatrix[3][1]-rateMatrix[3][2];
+
+siteRate:>0;
+
+svl = VERBOSITY_LEVEL;
+VERBOSITY_LEVEL = -1;
+
+rateSum = 0;
+
+/* estimate the second derivative on the overall rate */
+
+LFCompute (lf,LF_START_COMPUTE);
+LFCompute (lf,c1);
+h = 0.00001;
+for (v=Columns(branchNames)-2; v>=0; v=v-1)
+{
+	ExecuteCommands ("givenTree."+branchNames[v]+".t = givenTree."+branchNames[v]+".t*(1+h);");
+}
+LFCompute (lf,c2);
+for (v=Columns(branchNames)-2; v>=0; v=v-1)
+{
+	ExecuteCommands ("givenTree."+branchNames[v]+".t = givenTree."+branchNames[v]+".t*(1-h)/(1+h);");
+}
+LFCompute (lf,c3);
+for (v=Columns(branchNames)-2; v>=0; v=v-1)
+{
+	ExecuteCommands ("givenTree."+branchNames[v]+".t = givenTree."+branchNames[v]+".t/(1-h);");
+}
+LFCompute (lf,LF_DONE_COMPUTE);
+
+ce = -(c2+c3-2*c1)/(4*h*h)/filteredData.sites;
+
+fprintf (stdout, "\nApproximate Information per site: ", ce , "\n");
+fprintf (pathPrefix, "\nApproximate Information per site: ", ce , "\n");
+
+
+for (v=0; v<filteredData.sites;v=v+1)
+{
+	c3 = dupInfoJ[v];
+	if (doneSites[c3]>=0)
+	{
+		resultMatrix[v][0] = doneSites[c3];
+		resultMatrix[v][1] = doneSites[c3];
+		rateSum = rateSum+doneSites[c3];
+		
+	}
+	else
+	{
+		k = filteredData.species+1;
+		c1 = dupInfoA[v];
+		for (h=1; h<filteredDataA.species; h=h+1)
+		{
+			p1 = seqToBranchMap[k][0];
+			p2 = flatTreeRep[p1];
+			p2 = seqToBranchMap[p2][1]-filteredData.species;
+			
+			treePath[0][p1] = codonInfo2[h] [c1];
+			treePath[1][p1] = codonInfo2[p2][c1];;
+			
+			k=k+1;
+		}
+		
+		c2 = dupInfo[v];
+		for (h=0; h<filteredData.species; h=h+1)
+		{
+			p1 = seqToBranchMap[h][0];
+			p2 = flatTreeRep[p1];
+			p2 = seqToBranchMap[p2][1]-filteredData.species;
+			
+			cd2 = codonInfo2[p2][c1];
+			cd1 =  codonInfo[h] [c2];
+			
+			treePath[0][p1] = cd2;
+			treePath[1][p1] = cd1;
+			
+			if (cd1<0)
+			{
+				GetDataInfo    (ambInfo, filteredData, h, c2);	
+				weightFactor = 0;
+				tempMx = -1;
+				ambInfo  	 = ambInfo$overallFrequencies;
+				for (k=0; k<stateCharCount; k=k+1)
+				{
+					if (ambInfo[k]>weightFactor)
+					{
+						weightFactor = ambInfo[k];
+						tempMx = k;
+					}
+				}
+				if (tempMx>=0)
+				{
+					treePath[1][p1] = tempMx;
+				}
+				else
+				{
+					treePath[1][p1] = cd2;			
+				}
+			}
+		}
+		
+		Optimize (tFit,fitASite(siteRate));
+		
+		h = tFit[0][0];
+		
+		resultMatrix[v][0] = h;
+		resultMatrix[v][1] = h;
+		
+		rateSum = rateSum+h;
+		doneSites[c3] = h;
+	}
+}
+
+resultMatrix = resultMatrix*(filteredData.sites/rateSum);
+resultMatrix = resultMatrix%1;
+
+dataPoints = Rows(resultMatrix);
+temp_data_vector = {2, dataPoints};
+currentIndex = 0;
+
+temp_data_vector[0][0] = resultMatrix[0][1];
+temp_data_vector[1][0] = 1;
+
+for (nextIndex = 1; nextIndex < dataPoints; nextIndex = nextIndex + 1)
+{
+	if (resultMatrix[nextIndex][1]!=resultMatrix[nextIndex-1][1])
+	{
+		currentIndex = currentIndex+1;
+		temp_data_vector[0][currentIndex] = resultMatrix[nextIndex][1];
+	}
+	temp_data_vector[1][currentIndex] = temp_data_vector[1][currentIndex] + 1;
+}
+
+SELECTED_CHART_DATA = {2, currentIndex+1};
+
+for (nextIndex = 0; nextIndex <= currentIndex; nextIndex = nextIndex + 1)
+{
+	SELECTED_CHART_DATA[0][nextIndex] = temp_data_vector[0][nextIndex];
+	SELECTED_CHART_DATA[1][nextIndex] = temp_data_vector[1][nextIndex];
+}
+
+
+temp_data_vector = 0;
+normal_sigma 	 = .25;
+lastMax 		 = -100000000000;
+
+fprintf (stdout, "\nDoing a very approximate fit.\n");
+fprintf (pathPrefix, "\nDoing a very approximate fit.\n");
+
+PROFILE_MEAN_VAR_MULT = 0.25/ce;
+
+for (resp = 2; resp <= Columns(SELECTED_CHART_DATA); resp = resp+1)
+{
+	freqStrMx    = {resp,1};
+	freqStrMx[0] = "APS_1";
+
+	for (mi=1; mi<resp-1; mi=mi+1)
+	{
+		freqStrMx[mi] = "";
+		for (mi2=1;mi2<=mi;mi2=mi2+1)
+		{
+			freqStrMx[mi] = freqStrMx[mi]+"(1-APS_"+mi2+")";		
+		}
+		freqStrMx[mi] = freqStrMx[mi]+"APS_"+(mi+1);	
+	}	
+
+	freqStrMx[mi] = "";
+	for (mi2=1;mi2<mi;mi2=mi2+1)
+	{
+		freqStrMx[mi] = freqStrMx[mi]+"(1-APS_"+mi2+")";		
+	}
+	freqStrMx[mi] = freqStrMx[mi]+"(1-APS_"+mi+")";	
+	mx = {resp,1};
+	
+	execString = "";
+	for (resp2 = 0; resp2 < resp; resp2 = resp2 + 1)
+	{
+		if (resp2)
+		{
+			/*execString = execString + "APS_"+resp2+":>0;APS_"+resp2+":<1;APS_"+resp2+"=1/"+(resp-resp2+1)+";";*/
+			execString = execString + "global APS_"+resp2+":>0;APS_"+resp2+":<1;";
+		}
+		execString = execString + "mx[" + resp2 + "]:=" + freqStrMx[resp2] + ";";
+	}
+	ExecuteCommands (execString);
+	
+	
+	bF = {{0}{-1e100}};
+	
+	for (k=0; k<10; k=k+1)
+	{
+		execString = "";
+		rM = {resp-1,1};
+		for (resp2 = 1; resp2 < resp; resp2 = resp2 + 1)
+		{	
+			rM [resp2-1] = Random(0,1);
+			execString = execString +"APS_"+resp2+"=rM["+(resp2-1)+"];";
+		}
+		ExecuteCommands (execString);		
+		Optimize (bestFit, DoNCategoryFitK(mx));
+		if (bestFit[1][0]>bF[1][0])
+		{
+			bF = bestFit;
+			smx = mx;
+			sbp = breakPointMatrix;
+		}
+	}
+	
+	bestFit = bF;
+	mx = smx;
+	breakPointMatrix = sbp;
+	
+	fprintf (stdout, Format (resp,3,0), " rate classes: Log(L) = ", bestFit[1][0], " \n");
+	fprintf (pathPrefix, Format (resp,3,0), " rate classes: Log(L) = ", bestFit[1][0], " \n");
+	mi = 0;
+	for (resp2 = 0; resp2 < resp; resp2 = resp2+1)
+	{
+		mi = mi + breakPointMatrix[2][resp2]*mx[resp2];
+	}
+
+	cI_R = {2,resp};
+
+	for (resp2 = 0; resp2 < resp; resp2 = resp2+1)
+	{
+		cI_R[0][resp2] = breakPointMatrix[2][resp2]/mi;
+		cI_R[1][resp2] = mx[resp2];
+		fprintf (stdout, "Class ", Format (resp2+1,3,0), " : ",  Format (cI_R[0][resp2], 8, 5), " weight = ", Format (cI_R[1][resp2], 8, 5), "\n");
+		fprintf (pathPrefix, "Class ", Format (resp2+1,3,0), " : ",  Format (cI_R[0][resp2], 8, 5), " weight = ", Format (cI_R[1][resp2], 8, 5), "\n");
+	}	
+	
+	if (bestFit[1][0] - lastMax < 2)
+	{
+		break;
+	}
+	saveBPM = breakPointMatrix;
+	saveMx	= mx;
+	lastMax = bestFit[1][0];
+}
+
+resp = resp-1;
+
+fprintf (stdout, "\n\nFitted ", resp, " categories to the data\n\n");
+fprintf (pathPrefix, "\n\nFitted ", resp, " categories to the data\n\n");
+
+mi = 0;
+for (resp2 = 0; resp2 < resp; resp2 = resp2+1)
+{
+	mi = mi + saveBPM[2][resp2]*saveMx[resp2];
+}
+
+cI_R = {2,resp};
+
+for (resp2 = 0; resp2 < resp; resp2 = resp2+1)
+{
+	cI_R[0][resp2] = saveBPM[2][resp2]/mi;
+	cI_R[1][resp2] = saveMx[resp2];
+	fprintf (stdout, "Class ", Format (resp2+1,3,0), " : ",  Format (cI_R[0][resp2], 8, 5), " weight = ", Format (cI_R[1][resp2], 8, 5), "\n");
+	fprintf (pathPrefix, "Class ", Format (resp2+1,3,0), " : ",  Format (cI_R[0][resp2], 8, 5), " weight = ", Format (cI_R[1][resp2], 8, 5), "\n");
+}
+
+VERBOSITY_LEVEL = svl;
+
+if (branchLengths)
+{
+	totalBranchCount     = TipCount(givenTree) + BranchCount (givenTree);
+	stashedLengths		 = {totalBranchCount,1};
+	
+	branchNames = BranchName (givenTree,-1);
+	
+	
+	global totalFactor := AC*(2*pia__*pic__)+2*pia__*pig__+(2*pia__*pit__)*AT+
+							 (2*pic__*pig__)*CG+(2*pic__*pit__)*CT+(2*pig__*pit__)*GT;
+							 
+	for (v2 = 0; v2 < totalBranchCount; v2 = v2+1)
+	{
+		stashedLengths [v2] = BranchLength(givenTree,v2);
+	}
+}
+
+Model NucModelC   = (NucleotideMatrixC, overallFrequencies, 1);
+
+doNCatLFit (cI_R, resp);
+
+/*labelMatrix =     {1,2};
+labelMatrix[0] = "Observed Changes";
+labelMatrix[1] = "Scaled Changes";
+
+
+OpenWindow (CHARTWINDOW,{{"Site Subs"}
+						   {"labelMatrix"},
+						   {"resultMatrix"},
+						   {"Bar Chart"},
+						   {"Index"},
+						   {labelMatrix[1]},
+						   {"Site Index"},
+						   {""},
+						   {"Scaled Subs"},
+						   {"0"}},
+						   "SCREEN_WIDTH-60;SCREEN_HEIGHT-50;30;50");*/
+
+
+go_up   = 1;
+
+lastAICScore = AICScore;
+
+while (resp>2)
+{
+	resp = resp-1;
+	doNCatLFit (0, resp);
+	fprintf (stdout, "\nLikelihood = ", resR[1][0], "\nAIC Score:", AICScore);
+	fprintf (pathPrefix, "\nLikelihood = ", resR[1][0], "\nAIC Score:", AICScore);
+	
+	if (lastAICScore < AICScore)
+	{
+		resp = resp+1;
+		break;
+	}
+	else
+	{
+		lastAICScore = AICScore;
+		go_up = 0;
+	}			
+}
+
+
+while (go_up && resp>=2)
+{
+	resp = resp+1;
+	doNCatLFit (0, resp);
+		
+	fprintf (stdout, "\nLikelihood = ", resR[1][0], "\nAIC Score:", AICScore);
+	fprintf (pathPrefix, "\nLikelihood = ", resR[1][0], "\nAIC Score:", AICScore);
+	
+	if (lastAICScore < AICScore)
+	{
+		break;
+	}
+	else
+	{
+		lastAICScore = AICScore;
+	}				
+}
+
+if (resp>2)
+{
+	resp = resp-1;
+}
+
+global betaP = 1;
+global betaQ = 1;
+betaP:>0.05;betaP:<85;
+betaQ:>0.05;betaQ:<85;
+category pc = (resp-1, EQUAL, MEAN, 
+				_x_^(betaP-1)*(1-_x_)^(betaQ-1)/Beta(betaP,betaQ), 
+				IBeta(_x_,betaP,betaQ), 
+				0, 				   
+				1, 			  
+				IBeta(_x_,betaP+1,betaQ)*betaP/(betaP+betaQ)
+);
+
+global alpha = .5;
+alpha:>0.01;alpha:<100;
+category c = (resp, pc, MEAN, 
+				GammaDist(_x_,alpha,alpha), 
+				CGammaDist(_x_,alpha,alpha), 
+				0 , 
+		  	    1e25,
+		  	    CGammaDist(_x_,alpha+1,alpha)
+		  	 );
+
+Tree		   testTree = treeString;
+if (branchLengths)
+{
+	for (mpiNode = 0; mpiNode < totalBranchCount; mpiNode = mpiNode+1)
+	{
+		eCommand = "testTree."+branchNames[mpiNode]+".t:="+Format(stashedLengths [mpiNode],20,12)+"/totalFactor";
+		ExecuteCommands (eCommand);
+	}	
+}
+
+
+fprintf (stdout, "\n\nFitting gamma mod beta with ", resp, " rate classes\n");
+fprintf (pathPrefix, "\n\nFitting gamma mod beta with ", resp, " rate classes\n");
+LikelihoodFunction lfR = (filteredData,testTree);
+
+
+Optimize (resR,lfR);
+
+slfo = LIKELIHOOD_FUNCTION_OUTPUT;
+LIKELIHOOD_FUNCTION_OUTPUT = 7;
+
+fName = pathPrefix + ".gammaModBeta."+ resp;
+fprintf (fName, CLEAR_FILE, lfR);
+
+LIKELIHOOD_FUNCTION_OUTPUT = slfo;
+
+if (branchLengths)
+{
+	AICScore = 2*(resR[1][1]+res[1][1]-res[1][2]-resR[1][0]);
+}
+else
+{
+	AICScore = 2*(resR[1][1]-resR[1][0]);	
+}
+
+fprintf (stdout, "\nLikelihood = ", resR[1][0], "\nAIC Score:", AICScore);
+fprintf (pathPrefix, "\nLikelihood = ", resR[1][0], "\nAIC Score:", AICScore);
+GetInformation (cI, c);
+echoCatVar (cI);
diff --git a/res/TemplateBatchFiles/ReduceDataSetMatrix.bf b/res/TemplateBatchFiles/ReduceDataSetMatrix.bf
new file mode 100644
index 0000000..c684a0f
--- /dev/null
+++ b/res/TemplateBatchFiles/ReduceDataSetMatrix.bf
@@ -0,0 +1,405 @@
+#include "SequentialAddition.ibf";
+
+/*___________________________________________________________________________________________________________*/
+
+function FindMaxDistance (rIndex, fIndex)
+{
+	max 	= 0;
+	oldIdx 	= 0;
+	for (k=0; k<rIndex; k=k+1)
+	{
+		t = distanceMatrix[rIndex][k];
+		if (t>max)
+		{
+			oldIdx = min;
+			max = t;
+			min = k;
+		}
+	}
+	for (k=rIndex+1; k<mDim; k=k+1)
+	{
+		t = distanceMatrix[rIndex][k];
+		if (t>max)
+		{
+			oldIdx = min;
+			max = t;
+			min = k;
+		}
+	}
+	if (min == fIndex)
+	{
+		return oldIdx;
+	}
+	return min;
+}
+/*___________________________________________________________________________________________________________*/
+
+function PadString (padLength,padChar)
+{
+	for (padCounter=0;padCounter<padLength;padCounter=padCounter+1)
+	{
+		fprintf (stdout,padChar);
+	}
+	return padLength;
+}
+
+/*___________________________________________________________________________________________________________*/
+
+function	PrintASCIITable (dataMatrix, titleMatrix)
+{
+	columnWidths = {1,Columns(titleMatrix)};
+	for (counter1=0; counter1<Columns(titleMatrix); counter1 = counter1+1)
+	{
+		counter2 = Abs (titleMatrix[0][counter1])+2;
+		if (counter2<12)
+		{
+			counter2 = 12;
+		}
+		columnWidths[0][counter1] = counter2;
+	}
+	fprintf (stdout, "\n");
+	for (counter2 = 0; counter2 < Columns (titleMatrix); counter2 = counter2+1)
+	{
+		fprintf (stdout,"+-");
+		dummy = PadString (columnWidths[0][counter2],"-");
+		fprintf (stdout,"-");
+	}
+	fprintf (stdout,"+\n| ");
+	
+	for (counter1=0; counter1<Columns(titleMatrix); counter1 = counter1+1)
+	{
+		fprintf (stdout, titleMatrix[counter1]);
+		dummy = PadString (columnWidths[0][counter1]-Abs(titleMatrix[counter1])," ");
+		fprintf (stdout, " | ");
+	}
+	
+	fprintf (stdout, "\n");
+	
+	for (counter1=-1; counter1<Rows(dataMatrix); counter1 = counter1 + 1)
+	{
+		if (counter1>=0)
+		{
+			fprintf (stdout,"| ");
+			fprintf (stdout,Format(counter1+1,columnWidths[0][0],0));
+			for (counter2 = 1; counter2 < Columns (titleMatrix); counter2 = counter2+1)
+			{
+				fprintf (stdout," | ");
+				fprintf (stdout,Format(dataMatrix[counter1][counter2-1],columnWidths[0][counter2],-1));
+			}
+			fprintf (stdout," ");
+			fprintf (stdout, "|\n");
+		}
+		for (counter2 = 0; counter2 < Columns (titleMatrix); counter2 = counter2+1)
+		{
+			fprintf (stdout,"+-");
+			dummy = PadString (columnWidths[0][counter2],"-");
+			fprintf (stdout,"-");
+		}
+		fprintf (stdout, "+\n");
+	}
+	
+	return 1;
+}
+
+/*___________________________________________________________________________________________________________*/
+
+ChoiceList (dataType,"Data type",1,SKIP_NONE,"Nucleotide/Protein","Nucleotide or amino-acid (protein).",
+				     "Codon","Codon (several available genetic codes).");
+
+if (dataType<0) 
+{
+	return;
+}
+if (dataType)
+{
+	SetDialogPrompt ("Please choose a codon data file:");
+	#include "TemplateModels/chooseGeneticCode.def";
+}
+else
+{
+	SetDialogPrompt ("Please choose a nucleotide or amino-acid data file:");
+}
+
+
+DataSet ds = ReadDataFile (PROMPT_FOR_FILE);
+
+if (dataType)
+{
+	DataSetFilter filteredData = CreateFilter (ds,3,"","",GeneticCodeExclusions);
+}
+else
+{
+	DataSetFilter filteredData = CreateFilter (ds,1,"","");
+}
+
+SelectTemplateModel	(filteredData);
+
+SetDialogPrompt 	("Load a distance matrix:");
+
+fscanf (PROMPT_FOR_FILE,"Matrix",distanceMatrix);
+
+/* compute some matrix statistics */
+
+sum  = 0;
+sum2 = 0;
+max	 = 0;
+min  = 1e100;
+
+mDim = Rows (distanceMatrix);
+dDim = mDim*(mDim-1)/2;
+
+
+for (r=0; r< mDim; r=r+1)
+{
+	for (c=r+1; c<mDim; c=c+1)
+	{
+		t = distanceMatrix[r][c];
+		sum  = sum  + t;
+		if (t<min)
+		{
+			min = t;
+		}
+		if (t>max)
+		{
+			max = t;
+		}
+	}
+}
+
+sum = sum/dDim;
+r   = (max-min)/25;
+
+histogramTable = {25,4};
+histogramTable[0][1] = r;
+
+for (c=1; c<25;c=c+1)
+{
+	histogramTable[c][0] = histogramTable[c-1][1];
+	histogramTable[c][1] = histogramTable[c-1][1] + r;
+}
+
+for (r=0; r< mDim; r=r+1)
+{
+	for (c=r+1; c<mDim; c=c+1)
+	{
+		t = distanceMatrix[r][c];
+		sum2  = sum2+(t-sum)*(t-sum);
+		t = t-min;
+		k = 0;
+		while (histogramTable[k][1]<t)
+		{
+			k=k+1;
+		}
+		histogramTable[k][2] = histogramTable[k][2] + 1;
+	}
+}
+
+for (c=0; c<25;c=c+1)
+{
+	histogramTable[c][3] = histogramTable[c][2]/dDim;
+}
+
+fprintf (stdout, "\nDistance matrix info:\n",
+				 "Mean        : ", sum, "\n",
+				 "Variance    : ", sum2/(dDim-1), "\n",
+				 "Minimum     : ", min, "\n",
+				 "Maximum     : ", max, "\n");
+
+labels = {{"Bin","From","To", "Count", "Proportion"}};
+
+dummy = PrintASCIITable (histogramTable, labels);
+
+clumping = -1;
+
+while (clumping <= 0)
+{
+	fprintf (stdout, "Please enter the clustering threshold (>=0):");
+	fscanf  (stdin,"Number",clumping);
+}
+
+stillInPlay = {mDim,1};
+
+for (r=0; r<mDim; r=r+1)
+{
+	stillInPlay[r] = 1;
+}	
+
+reductionAmount = 0;
+
+SetDialogPrompt ("Save smaller data set to:");
+
+fprintf (PROMPT_FOR_FILE,CLEAR_FILE);
+compactedSeqFile = LAST_FILE_PATH;
+
+GetInformation (dataCharacters, filteredData);
+
+for (rowCount=0; rowCount<mDim; rowCount=rowCount+1)
+{
+	if (stillInPlay[rowCount])
+	{
+		putativeClump     = {mDim,1};
+		putativeClumpSize = 1;
+		putativeClump[0]  = rowCount;
+		for (c=0; c<mDim; c=c+1)
+		{
+			if (stillInPlay[c] && (c!=rowCount))
+			{
+				t = distanceMatrix[rowCount][c];
+				if (t <= clumping)
+				{
+					putativeClump[putativeClumpSize] = c;
+					putativeClumpSize = putativeClumpSize+1;
+				}
+			}
+		}
+		
+		if (putativeClumpSize>1)
+		{
+			/* check pairwise distances */
+			for (c=1; c<putativeClumpSize; c=c+1)
+			{
+				min = putativeClump[c];
+				if (min>=0)
+				{
+					for (t=c+1;t<putativeClumpSize;t=t+1)
+					{
+						k = putativeClump[t];
+						if (k>=0)
+						{
+							max = distanceMatrix[k][min];
+							if (max>clumping)
+							{
+								putativeClump[t] = -1;
+							}
+						}
+					}
+				}
+			}
+			
+			GetString (sName,ds,putativeClump[0]);
+			fprintf (stdout, "\n",sName);
+			stillInPlay[rowCount] 	= 0;
+			actualClumpSize = 1;
+			actualClump 	= {putativeClumpSize,1};
+			for (c=1; c<putativeClumpSize; c=c+1)
+			{
+				min = putativeClump[c];
+				if (min>=0)
+				{
+					GetString (sName,ds,min);
+					fprintf (stdout, ",", sName);
+					stillInPlay[min] = 0;
+					reductionAmount = reductionAmount+1;
+					actualClump[actualClumpSize] = min;
+					actualClumpSize = actualClumpSize+1;
+				}
+			}
+			fprintf (stdout, "\n");
+			nSName = "";
+			if (actualClumpSize == 2)
+			/* add 2 sequences for the outgroup */
+			{
+				s1 	 = actualClump[0];
+				s2 	 = actualClump[1];
+				
+				GetString (sName, ds, s1);
+				aTreeString = "(("+sName+",";
+				nSName = sName;
+				GetString (sName, ds, s2);
+				nSName = nSName+"_"+sName;
+				aTreeString = aTreeString+sName+"),";
+				o1  = FindMaxDistance (s1,-1);
+				GetString (sName, ds, o1);
+				aTreeString = aTreeString+sName+",";
+				o2  = FindMaxDistance (s2,o1);
+				GetString (sName, ds, o2);
+				aTreeString = aTreeString+sName+")";
+				pString = ""+s1+(","+s2)+(","+o1)+(","+o2);
+				getIndex = 1;
+			}
+			else
+			{
+				if (actualClumpSize == 3)
+				{
+					s1 	 = actualClump[0];
+					s2 	 = actualClump[1];
+					o1 	 = actualClump[2];
+					
+					GetString (sName, ds, s1);
+					nSName = sName;
+					aTreeString = "("+sName+",";
+					GetString (sName, ds, s2);
+					nSName = nSName+"_"+sName;
+					aTreeString = aTreeString+sName+",";
+					GetString (sName, ds, o1);
+					nSName = nSName+"_"+sName;
+					aTreeString = aTreeString+sName+")";
+					pString = ""+s1+(","+s2)+(","+o1);
+					getIndex = 0;				
+				}
+				else
+				{
+					pString = ""+actualClump[0];
+					GetString (nSName, ds, actualClump[0]);
+					for (k=1; k<actualClumpSize; k=k+1)
+					{
+						GetString (sName, ds, actualClump[k]);
+						nSName = nSName+"_"+sName;
+						pString = pString+(","+actualClump[k]);
+					}
+					if (dataType)
+					{
+						DataSetFilter filteredData = CreateFilter (ds,3,"",pString,GeneticCodeExclusions);
+					}
+					else
+					{
+						DataSetFilter filteredData = CreateFilter (ds,1,"",pString);
+					}
+					randomOption 	   = 0;
+					haveTreeConstraint = 0;
+					doNNIOption		   = 1;
+					nniPeriod		   = 1;
+					methodIndex		   = 0;
+					first3Taxa		   = {{0,1,2}};
+					k		   		   = InferTreeTopology (0.0);
+					aTreeString		   = bestTree;
+					getIndex 		   = 0;				
+				}
+			}
+			
+			/*fprintf (stdout, "\n", aTreeString, "\n", pString);*/
+			Tree aTree = aTreeString;
+			if (dataType)
+			{
+				DataSetFilter filteredData = CreateFilter (ds,3,"",pString,GeneticCodeExclusions);
+			}
+			else
+			{
+				DataSetFilter filteredData = CreateFilter (ds,1,"",pString);
+			}
+			LikelihoodFunction lfClump = (filteredData,aTree);
+			DataSet 		   aDS 	   = ReconstructAncestors (lfClump);
+			if (dataType)
+			{
+				DataSetFilter filteredData = CreateFilter (aDS,3,"","",GeneticCodeExclusions);
+			}
+			else
+			{
+				DataSetFilter filteredData = CreateFilter (aDS,1,"","");
+			}
+			GetInformation 	  (aDataCharacters, filteredData);
+			GetString (sName,aDS,getIndex);
+			fprintf (compactedSeqFile,">",nSName,"\n",aDataCharacters[getIndex],"\n");
+		}
+		else
+		{
+			GetString (sName,ds,rowCount);
+			fprintf (compactedSeqFile,">",sName,"\n",dataCharacters[rowCount],"\n");
+		}
+	}
+}
+
+fprintf (stdout, "\nTotal sequences pruned: ", reductionAmount,"\n");
+
+distanceMatrix = 0;
+dataCharacters = 0;
diff --git a/res/TemplateBatchFiles/RelativeRate.bf b/res/TemplateBatchFiles/RelativeRate.bf
new file mode 100644
index 0000000..31c6a03
--- /dev/null
+++ b/res/TemplateBatchFiles/RelativeRate.bf
@@ -0,0 +1,163 @@
+VERBOSITY_LEVEL = -1;
+ALLOW_SEQUENCE_MISMATCH = 1;
+
+#include "relrateBootstrap.bf";
+
+fprintf(stdout,"\n ---- RUNNING RELATIVE RATE ANALYSIS ---- \n");
+
+ChoiceList (dataType,"Data type",1,SKIP_NONE,"Nucleotide/Protein","Nucleotide or amino-acid (protein).",
+				     "Codon","Codon (several available genetic codes).");
+
+if (dataType<0) 
+{
+	return;
+}
+if (dataType)
+{
+	NICETY_LEVEL = 3;
+	SetDialogPrompt ("Please choose a codon data file:");
+	#include "TemplateModels/chooseGeneticCode.def";
+}
+else
+{
+	SetDialogPrompt ("Please choose a nucleotide or amino-acid data file:");
+}
+
+fileCount = 0;
+speciesCount = 0;
+
+if ((OPTIMIZATION_PRECISION==0)||(OPTIMIZATION_PRECISION>0.001))
+{
+	OPTIMIZATION_PRECISION = 0.001;
+}
+
+while (speciesCount < 3)
+{
+	if (fileCount>=1)
+	{
+		SetDialogPrompt ("Please choose an additional data file:");
+		DataSet ds2 = ReadDataFile (PROMPT_FOR_FILE);
+		speciesCount = speciesCount + ds2.species;
+		DataSet ds = Combine (ds,ds2);
+	}
+	else
+	{
+		DataSet ds = ReadDataFile (PROMPT_FOR_FILE);
+		speciesCount = speciesCount + ds.species;
+	}
+	
+	fileCount = fileCount+1;
+}
+
+firstSpec = 0;
+secondSpec = 1;
+thirdSpec = 2;
+fprintf (stdout,"The following data were read:\n",ds,"\n");
+
+if (speciesCount>3) 
+{
+	speciesNames = {1,3};
+	ChoiceList (twoSpec, "Choose 2 taxa to share rates:",2,SKIP_NONE,ds);
+	if (twoSpec[0]<0)
+	{
+		return ;
+	}
+	firstSpec = twoSpec[0];
+	secondSpec = twoSpec[1];
+	ChoiceList (thirdSpec, "Choose the outgroup:",1,twoSpec,ds);
+	
+}
+else
+	{		
+		ChoiceList (thirdSpec,"Choose the outgroup:",1,SKIP_NONE,ds);
+		
+		if (thirdSpec == 1)
+		{
+			firstSpec = 0;
+			secondSpec = 2;
+		}
+		else
+		{
+			if (thirdSpec == 2)
+			{
+				firstSpec = 0;
+				secondSpec = 1;
+			}
+			else
+			{
+				firstSpec = 1;
+				secondSpec = 2;
+				thirdSpec = 0;
+			}
+
+		}
+			
+	}
+
+		
+if (dataType)
+{
+	DataSetFilter filteredData = CreateFilter (ds,3,"",(speciesIndex==firstSpec)||(speciesIndex==secondSpec)||(speciesIndex==thirdSpec),GeneticCodeExclusions);
+}
+else
+{
+	DataSetFilter filteredData = CreateFilter (ds,1,"",(speciesIndex==firstSpec)||(speciesIndex==secondSpec)||(speciesIndex==thirdSpec));
+}
+
+SelectTemplateModel(filteredData);
+
+if ((firstSpec<thirdSpec)&&(secondSpec<thirdSpec))
+{
+	treeString = "(Ingroup1,Ingroup2,OutGroup)";
+}
+else
+{
+	if ((firstSpec>thirdSpec)&&(secondSpec>thirdSpec))
+	{
+		treeString = "(OutGroup,Ingroup1,Ingroup2)";
+	}
+	else
+	{
+		treeString = "(Ingroup1,OutGroup,Ingroup2)";
+	}
+}
+
+relationString = ":=";
+
+#include "selectModelParameters.bf";
+
+Tree threeTaxaTree = treeString;
+
+LikelihoodFunction lf = (filteredData,threeTaxaTree);
+
+GetString (specName,ds,thirdSpec);
+fprintf (stdout,"\nOutgroup = ",specName);
+GetString (specName,ds,firstSpec);
+fprintf (stdout,"\nIngroup1 = ",specName);
+GetString (specName,ds,secondSpec);
+fprintf (stdout,"\nIngroup2 = ",specName);
+
+
+Optimize (res,lf);
+
+fprintf (stdout, "\n_________________RESULTS_________________\n\nFull Model Results:\n",lf);
+
+Tree constrained3TaxaTree = treeString;
+
+/* now specify the constraint */
+
+LikelihoodFunction lfConstrained = (filteredData,constrained3TaxaTree);
+
+ReplicateConstraint (constraintString,constrained3TaxaTree.Ingroup1, constrained3TaxaTree.Ingroup2);
+
+Optimize (res1,lfConstrained);
+
+fprintf (stdout, "\n\nConstrained Model Results:\n",lfConstrained);
+
+lnLikDiff = -2(res1[1][0]-res[1][0]);
+
+degFDiff = res[1][1]-res1[1][1];
+
+fprintf (stdout, "\n\n-2(Ln Likelihood Difference)=",lnLikDiff,"\n","Difference in number of parameters:",Format(degFDiff,0,0));
+
+fprintf (stdout, "\nP-Value:",1-CChi2(lnLikDiff,degFDiff));
diff --git a/res/TemplateBatchFiles/RelativeRateL.bf b/res/TemplateBatchFiles/RelativeRateL.bf
new file mode 100644
index 0000000..15b4624
--- /dev/null
+++ b/res/TemplateBatchFiles/RelativeRateL.bf
@@ -0,0 +1,340 @@
+#include "relrateBootstrapL.bf";
+
+fprintf(stdout,"\n ---- RUNNING dN/dS RELATIVE RATE ANALYSIS ---- \n");
+
+NICETY_LEVEL = 3;
+SetDialogPrompt ("Please choose a codon data file:");
+#include "TemplateModels/chooseGeneticCode.def";
+
+fileCount = 0;
+speciesCount = 0;
+
+if ((OPTIMIZATION_PRECISION==0)||(OPTIMIZATION_PRECISION>0.001))
+{
+	OPTIMIZATION_PRECISION = 0.001;
+}
+
+while (speciesCount < 3)
+{
+	if (fileCount>=1)
+	{
+		SetDialogPrompt ("Please choose an additional data file:");
+		DataSet ds2 = ReadDataFile (PROMPT_FOR_FILE);
+		speciesCount = speciesCount + ds2.species;
+		DataSet ds = Combine (ds,ds2);
+	}
+	else
+	{
+		DataSet ds = ReadDataFile (PROMPT_FOR_FILE);
+		speciesCount = speciesCount + ds.species;
+	}
+	
+	fileCount = fileCount+1;
+}
+
+firstSpec = 0;
+secondSpec = 1;
+thirdSpec = 2;
+fprintf (stdout,"The following data was read:\n",ds,"\n");
+
+if (speciesCount>3) 
+{
+	speciesNames = {1,3};
+	ChoiceList (twoSpec, "Choose 2 taxa to share rates:",2,SKIP_NONE,ds);
+	if (twoSpec[0]<0)
+	{
+		return ;
+	}
+	firstSpec = twoSpec[0];
+	secondSpec = twoSpec[1];
+	ChoiceList (thirdSpec, "Choose the outgroup:",1,twoSpec,ds);
+	
+}
+else
+	{		
+		ChoiceList (thirdSpec,"Choose the outgroup:",1,SKIP_NONE,ds);
+		
+		if (thirdSpec == 1)
+		{
+			firstSpec = 0;
+			secondSpec = 2;
+		}
+		else
+		{
+			if (thirdSpec == 2)
+			{
+				firstSpec = 0;
+				secondSpec = 1;
+			}
+			else
+			{
+				firstSpec = 1;
+				secondSpec = 2;
+				thirdSpec = 0;
+			}
+
+		}
+			
+	}
+
+		
+DataSetFilter filteredData = CreateFilter (ds,3,"",(speciesIndex==firstSpec)||(speciesIndex==secondSpec)||(speciesIndex==thirdSpec),GeneticCodeExclusions);
+
+ChoiceList (modelType,"Select Model Frequencies",1,SKIP_NONE,
+			"1x4","MG94 with 3 frequency parameters",
+			"3x4","MG94 with 9 frequency parameters");
+
+if (modelType<0)
+{
+	return;
+}
+
+/* Explicit model definition */
+ModelMatrixDimension = 0;
+
+function BuildCodonFrequencies (obsF)
+{
+	PIStop = 1.0;
+	result = {ModelMatrixDimension,1};
+	hshift = 0;
+
+	if (modelType)
+	/* 9 freqs */
+	{
+		for (h=0; h<64; h=h+1)
+		{
+			first = h$16;
+			second = h%16$4;
+			third = h%4;
+			if (_Genetic_Code[h]==10) 
+			{
+				hshift = hshift+1;
+				PIStop = PIStop-obsF[first][0]*obsF[second][1]*obsF[third][2];
+				continue; 
+			}
+			result[h-hshift][0]=obsF[first][0]*obsF[second][1]*obsF[third][2];
+		}
+		return result*(1.0/PIStop);
+	}
+	else
+	/* 3 freqs */
+	{
+
+		for (h=0; h<64; h=h+1)
+		{
+			first = h$16;
+			second = h%16$4;
+			third = h%4;
+			if (_Genetic_Code[h]==10) 
+			{
+				hshift = hshift+1;
+				PIStop = PIStop-obsF[first][0]*obsF[second][0]*obsF[third][0];
+				continue; 
+			}
+			result[h-hshift][0]=obsF[first][0]*obsF[second][0]*obsF[third][0];
+		}
+		return result*(1.0/PIStop);
+	}
+}
+
+function PopulateModelMatrix (ModelMatrixName&, EFV)
+{
+	if (!ModelMatrixDimension)
+	{
+		ModelMatrixDimension = 64;
+		for (h = 0 ;h<64; h=h+1)
+		{
+			if (_Genetic_Code[h]==10)
+			{
+				ModelMatrixDimension = ModelMatrixDimension-1;
+			}
+		}
+	}
+	ModelMatrixName = {ModelMatrixDimension,ModelMatrixDimension}; 
+
+	hshift = 0;
+
+	if (modelType == 0)
+	{
+		for (h=0; h<64; h=h+1)
+		{
+			if (_Genetic_Code[h]==10) 
+			{
+				hshift = hshift+1;
+				continue; 
+			}
+			vshift = hshift;
+			for (v = h+1; v<64; v=v+1)
+			{
+				diff = v-h;
+				if (_Genetic_Code[v]==10) 
+				{
+					vshift = vshift+1;
+					continue; 
+				}
+			  	if ((h$4==v$4)||((diff%4==0)&&(h$16==v$16))||(diff%16==0))
+			  	{
+			  		if (h$4==v$4)
+			  		{
+			  			transition = v%4;
+			  			transition2= h%4;
+			  		}
+			  		else
+			  		{
+			  			if(diff%16==0)
+			  			{
+			  				transition = v$16;
+			  				transition2= h$16;
+			  			}
+			  			else
+			  			{
+			  				transition = v%16$4;
+			  				transition2= h%16$4;
+			  			}
+			  		}
+			  		if (_Genetic_Code[0][h]==_Genetic_Code[0][v]) 
+			  		{
+			  			ModelMatrixName[h-hshift][v-vshift] := synRate*EFV__[transition__][0];
+			  			ModelMatrixName[v-vshift][h-hshift] := synRate*EFV__[transition2__][0];
+				  	}
+			  		else
+			  		{
+				  		ModelMatrixName[h-hshift][v-vshift] := nonSynRate*EFV__[transition__][0];
+			  			ModelMatrixName[v-vshift][h-hshift] := nonSynRate*EFV__[transition2__][0];
+		  			}
+			  	}
+			}
+		}
+	}
+	else
+	{
+		for (h=0; h<64; h=h+1)
+		{
+			if (_Genetic_Code[h]==10) 
+			{
+				hshift = hshift+1;
+				continue; 
+			}
+			vshift = hshift;
+			for (v = h+1; v<64; v=v+1)
+			{
+				diff = v-h;
+				if (_Genetic_Code[v]==10) 
+				{
+					vshift = vshift+1;
+					continue; 
+				}
+				nucPosInCodon = 2;
+			  	if ((h$4==v$4)||((diff%4==0)&&(h$16==v$16))||(diff%16==0))
+			  	{
+			  		if (h$4==v$4)
+			  		{
+			  			transition = v%4;
+			  			transition2= h%4;
+			  		}
+			  		else
+			  		{
+			  			if(diff%16==0)
+			  			{
+			  				transition = v$16;
+			  				transition2= h$16;
+							nucPosInCodon = 0;
+			  			}
+			  			else
+			  			{
+			  				transition = v%16$4;
+			  				transition2= h%16$4;
+							nucPosInCodon = 1;
+			  			}
+			  		}
+			  		if (_Genetic_Code[0][h]==_Genetic_Code[0][v]) 
+			  		{
+			  			ModelMatrixName[h-hshift][v-vshift] := synRate*EFV__[transition__][nucPosInCodon__];
+			  			ModelMatrixName[v-vshift][h-hshift] := synRate*EFV__[transition2__][nucPosInCodon__];
+				  	}
+			  		else
+			  		{
+				  		ModelMatrixName[h-hshift][v-vshift] := nonSynRate*EFV__[transition__][nucPosInCodon__];
+			  			ModelMatrixName[v-vshift][h-hshift] := nonSynRate*EFV__[transition2__][nucPosInCodon__];
+		  			}
+			  	}
+			  }
+		}
+	}
+	return 0;
+}
+
+if (modelType)
+{
+	HarvestFrequencies (observedFreq,filteredData,3,1,1);
+}
+else
+{
+	HarvestFrequencies (observedFreq,filteredData,1,1,0);
+}
+
+MG94 = 0;
+
+MULTIPLY_BY_FREQS = PopulateModelMatrix ("MG94", observedFreq);
+
+vectorOfFrequencies = BuildCodonFrequencies (observedFreq);
+
+Model MG94model = (MG94,vectorOfFrequencies,0);
+
+/* define the tree with fixed species names */
+
+if ((firstSpec<thirdSpec)&&(secondSpec<thirdSpec))
+{
+	treeString = "(Ingroup1,Ingroup2,OutGroup)";
+}
+else
+{
+	if ((firstSpec>thirdSpec)&&(secondSpec>thirdSpec))
+	{
+		treeString = "(OutGroup,Ingroup1,Ingroup2)";
+	}
+	else
+	{
+		treeString = "(Ingroup1,OutGroup,Ingroup2)";
+	}
+}
+
+Tree threeTaxaTree = treeString;
+
+LikelihoodFunction lf = (filteredData,threeTaxaTree);
+
+GetString (specName,ds,thirdSpec);
+fprintf (stdout,"\nOutgroup = ",specName);
+GetString (specName,ds,firstSpec);
+fprintf (stdout,"\nIngroup1 = ",specName);
+GetString (specName,ds,secondSpec);
+fprintf (stdout,"\nIngroup2 = ",specName);
+
+
+Optimize (res,lf);
+
+fprintf (stdout, "\n_________________RESULTS_________________\n\nFULL MODEL RESULTS\n******************\n\n",lf);
+
+Tree constrained3TaxaTree = treeString;
+
+/* now specify the constraint */
+
+LikelihoodFunction lfConstrained = (filteredData,constrained3TaxaTree);
+
+global		R;
+
+constrained3TaxaTree.Ingroup1.nonSynRate := R*constrained3TaxaTree.Ingroup1.synRate;
+constrained3TaxaTree.Ingroup2.nonSynRate := R*constrained3TaxaTree.Ingroup2.synRate;
+
+Optimize (res1,lfConstrained);
+
+fprintf (stdout, "\n\nCONSTRAINED MODEL RESULTS\n*************************\n\n",lfConstrained);
+
+lnLikDiff = -2(res1[1][0]-res[1][0]);
+
+degFDiff = res[1][1]-res1[1][1];
+
+fprintf (stdout, "\n\nLik. ratio statistic = ",lnLikDiff,"\n",
+					 "Degrees of freedom   = ",Format(degFDiff,0,0));
+
+fprintf (stdout, "\nChi2 Derived P-Value = ",1-CChi2(lnLikDiff,degFDiff));
diff --git a/res/TemplateBatchFiles/RelativeRatio.bf b/res/TemplateBatchFiles/RelativeRatio.bf
new file mode 100644
index 0000000..db91042
--- /dev/null
+++ b/res/TemplateBatchFiles/RelativeRatio.bf
@@ -0,0 +1,258 @@
+#include "relratioBootstrap.bf";
+
+RESTORE_GLOBALS = 1;
+
+function RestoreGlobalValues (lfIndex)
+{
+	if (lfIndex==0)
+	{
+		for (i=0;i<SAVE_GLOBALS;i=i+1)
+		{
+			SetParameter (lf,i,globalSpoolMatrix[i]);
+		}
+	}
+	if (lfIndex==1)
+	{
+		for (i=0;i<SAVE_GLOBALS;i=i+1)
+		{
+			SetParameter (lf2,i,globalSpoolMatrix1[i]);
+		}
+	}
+	if (lfIndex==2)
+	{
+		for (i=0;i<SAVE_GLOBALS2;i=i+1)
+		{
+			SetParameter (lfConstrained,i,globalSpoolMatrix2[i]);
+		}
+	}
+	return 0;
+}
+
+fprintf(stdout,"\n ---- RUNNING RELATIVE RATIO ANALYSIS ---- \n");
+
+ChoiceList (dataType,"Data type",1,SKIP_NONE,"Nucleotide/Protein","Nucleotide or amino-acid (protein).",
+				     "Codon","Codon (several available genetic codes).");
+
+if (dataType<0) 
+{
+	return;
+}
+if (dataType)
+{
+	NICETY_LEVEL = 3;
+	#include "TemplateModels/chooseGeneticCode.def";
+}
+
+SetDialogPrompt ("Choose the 1st data file:");
+
+DataSet ds = ReadDataFile (PROMPT_FOR_FILE);
+
+SetDialogPrompt ("Choose the 2nd data file:");
+
+treeRead = 0;
+
+if (IS_TREE_PRESENT_IN_DATA)
+{
+	treeString = DATAFILE_TREE;
+	treeRead = 1;
+}
+
+DataSet ds2 = ReadDataFile (PROMPT_FOR_FILE);
+
+while (ds2.species<ds1.species)
+{
+	SetDialogPrompt ("Too few taxa in 2nd file. Choose again:");
+	DataSet ds2 = ReadDataFile (PROMPT_FOR_FILE);
+}
+
+fprintf (stdout,"The following data was read:\n",ds,"\n", ds2,"\n");
+
+if (dataType)
+{
+	DataSetFilter filteredData = CreateFilter (ds,3,"","",GeneticCodeExclusions);
+}
+else
+{
+	DataSetFilter filteredData = CreateFilter (ds,1);
+}
+
+SelectTemplateModel(filteredData);
+
+if (treeRead)
+{
+	fprintf (stdout, "\n\nA tree was found in the data file:\n",treeString,"\n\nWould you like to use it:(Y/N)?");
+	fscanf (stdin, "String", response);
+	if ((response=="n")||(response=="N"))
+	{
+		treeRead = 0;
+	}
+	fprintf (stdout, "\n\n");
+}
+
+if (!treeRead)
+{
+	SetDialogPrompt ("Please select a tree file for the data:");
+
+	fscanf (PROMPT_FOR_FILE, "String", treeString);
+	
+}
+
+global RelRatio = 1.0;
+
+relationString = ":=RelRatio*";
+
+#include "selectModelParameters.bf";
+
+Tree tr1  = treeString;
+Tree tr1c = treeString;
+
+LikelihoodFunction lf = (filteredData,tr1);
+
+Optimize (res,lf);
+
+SAVE_GLOBALS = res[1][2];
+
+if (SAVE_GLOBALS)
+{
+	globalSpoolMatrix = {1,SAVE_GLOBALS};
+	for (i=0;i<SAVE_GLOBALS;i=i+1)
+	{
+		globalSpoolMatrix[i]=res[0][i];
+	}
+}
+
+separator = "*-----------------------------------------------------------*";
+
+fprintf (stdout, "\n", separator, "\nFULL MODEL RESULTS:\nDataset 1:",lf);
+
+fullModelLik = res[1][0];
+
+fullVars = 2*res[1][1];
+
+if (dataType)
+{
+	DataSetFilter filteredData2 = CreateFilter (ds2,3,"",speciesIndex<ds.species,GeneticCodeExclusions);
+}
+else
+{
+	DataSetFilter filteredData2 = CreateFilter (ds2,1,"",speciesIndex<ds.species);
+}
+
+HarvestFrequencies (vectorOfFrequencies2,filteredData2,1,1,0);
+
+if (FREQUENCY_SENSITIVE)
+{
+	modelMatrix2 = 0;
+	if (USE_POSITION_SPECIFIC_FREQS)
+	{
+		HarvestFrequencies (vectorOfFrequencies2,filteredData2,3,1,1);
+	}
+	MULTIPLY_BY_FREQS = PopulateModelMatrix ("modelMatrix2",vectorOfFrequencies2);
+	if (dataType)
+	{
+		CodonEFV2 = BuildCodonFrequencies (vectorOfFrequencies2);
+		Model model2 = (modelMatrix2,CodonEFV2,MULTIPLY_BY_FREQS);
+	}
+	else
+	{
+		Model model2 = (modelMatrix2,vectorOfFrequencies2,MULTIPLY_BY_FREQS);
+	}	
+}
+
+Tree tr2  = treeString;
+Tree tr2c = treeString;
+
+LikelihoodFunction lf2 = (filteredData2,tr2);
+
+Optimize (res2,lf2);
+
+if (SAVE_GLOBALS)
+{
+	globalSpoolMatrix1 = {1,SAVE_GLOBALS};
+	for (i=0;i<SAVE_GLOBALS;i=i+1)
+	{
+		globalSpoolMatrix1[i]=res2[0][i];
+	}
+}
+
+fullModelLik = fullModelLik+res2[1][0];
+
+fullModelParam = 2*res[1][1];
+
+fprintf (stdout, "\n\nDataset 2:",lf2, "\n\nJoint ln-likelihood=",fullModelLik);
+
+
+/* now specify the constraint */
+
+if (FREQUENCY_SENSITIVE)
+{
+	modelMatrix1 = 0;
+	MULTIPLY_BY_FREQS = PopulateModelMatrix ("modelMatrix1",vectorOfFrequencies);
+	if (dataType)
+	{
+		CodonEFV = BuildCodonFrequencies (vectorOfFrequencies);
+		Model model1 = (modelMatrix1,CodonEFV,MULTIPLY_BY_FREQS);
+	}
+	else
+	{
+		Model model1 = (modelMatrix1,vectorOfFrequencies,MULTIPLY_BY_FREQS);
+	}	
+}
+
+ReplicateConstraint (constraintString,tr2c,tr1c);
+
+/*
+mxTreeSpec = {5,1};
+mxTreeSpec [0] = "tr2c";
+mxTreeSpec [1] = "8240";
+mxTreeSpec [2] = "10,40,-10,-175,1";
+mxTreeSpec [3] = "";
+mxTreeSpec [4] = "";
+OpenWindow (TREEWINDOW, mxTreeSpec);							
+internalNodes = BranchCount(tr2c);
+leafNodes	  = TipCount (tr2c);
+choiceMatrix = {leafNodes+internalNodes,2};
+for (bc=0; bc<leafNodes; bc=bc+1)
+{
+	choiceMatrix[bc][0] = TipName(tr2c,bc);
+	choiceMatrix[bc][1] = "Taxon " + choiceMatrix[bc][0];
+}
+for (bc=0; bc<internalNodes; bc=bc+1)
+{
+	choiceMatrix[bc+leafNodes][0] = BranchName(tr2c,bc);
+	choiceMatrix[bc+leafNodes][1] = "Internal Branch Rooting " + tr2c[bc];
+}
+ChoiceList  (stOption,"Do not constrain:",0,NO_SKIP,choiceMatrix);
+
+if (stOption[0] >= 0)
+{
+	for (k=0; k<Columns (stOption) * Rows (stOption); k=k+1)
+	{
+		ExecuteCommands ("ClearConstraints (tr2c."+choiceMatrix[(stOption[k])][0]+");");
+	}
+}
+*/
+
+LikelihoodFunction lfConstrained = (filteredData2,tr2c,filteredData,tr1c);
+
+Optimize (res1,lfConstrained);
+
+SAVE_GLOBALS2 = res1[1][2];
+
+globalSpoolMatrix2 = {1,SAVE_GLOBALS2};
+
+for (i=0;i<SAVE_GLOBALS2;i=i+1)
+{
+	globalSpoolMatrix2[i]=res1[0][i];
+}
+
+fprintf (stdout, "\n", separator,"\n\nCONSTRAINED MODEL RESULTS:\n",lfConstrained);
+
+lnLikDiff = 2(fullModelLik-res1[1][0]);
+
+degFDiff = fullModelParam-res1[1][1];
+
+fprintf (stdout, "\n", separator,"\n\n-2(Ln Likelihood Ratio)=",lnLikDiff,"\n","Constrained parameters:",Format(degFDiff,0,0));
+
+fprintf (stdout, "\nP-Value:",1-CChi2(lnLikDiff,degFDiff));
+
diff --git a/res/TemplateBatchFiles/SGASimProcessor.bf b/res/TemplateBatchFiles/SGASimProcessor.bf
new file mode 100644
index 0000000..25799a5
--- /dev/null
+++ b/res/TemplateBatchFiles/SGASimProcessor.bf
@@ -0,0 +1,547 @@
+#include "binomial.ibf";
+
+/*----------------------------------------------------------------------------*/
+
+
+ChoiceList (ambChoice, "Treatment of Ambiguities",1,SKIP_NONE,
+			"Averaged","All possible resolutions are considered and averaged.",
+			"Resolved","The most frequent (for that site) resolution is chosen.");
+
+if (ambChoice<0)
+{
+	return;
+}
+
+if (useCustomCountingBias)
+{
+	incFileName = "Distances/CodonToolsMain.def";
+}
+else
+{
+	incFileName = "Distances/CodonTools.def";
+}
+
+ExecuteCommands  ("#include \""+incFileName+"\";");
+
+SetDialogPrompt ("Please specify the first simulated file:");
+
+DataSet 	  dsA 		   = ReadDataFile (PROMPT_FOR_FILE);
+FILE_BASE 				   = LAST_FILE_PATH;
+
+iterates = 0;
+
+while (iterates<1)
+{
+	fprintf (stdout, "\nHow many data files should I process?");
+	fscanf  (stdin, "Number", iterates);
+}
+
+it 	  = 2;
+itidx = 0;
+
+tailEnds = -1;
+
+while ((tailEnds<=0) || (tailEnds >=.5))
+{
+	fprintf (stdout, "\nDistribution tails to tabulate (from 0 to 0.5)?");
+	fscanf  (stdin, "Number", tailEnds);
+}
+
+tailEnds = tailEnds * 100;
+
+ESResultMatrix = {iterates,filteredData.sites};
+ENResultMatrix = {iterates,filteredData.sites};
+OSResultMatrix = {iterates,filteredData.sites};
+ONResultMatrix = {iterates,filteredData.sites};
+dNmdS		   = {iterates,filteredData.sites};
+pValuesPS	   = {iterates,filteredData.sites};
+pValuesNS	   = {iterates,filteredData.sites};
+
+while (1)
+{
+	DataSetFilter filteredDataA = CreateFilter (dsA,3,"","",GeneticCodeExclusions);
+
+	HarvestFrequencies			  (observedCEFV,filteredData,3,3,0);
+	seqToBranchMap 				= {stateCharCount,1};
+
+	DataSet		   dsJoint = Combine(dsA,ds);
+	DataSetFilter filteredDataJ = CreateFilter (dsJoint,3,"","",GeneticCodeExclusions);
+
+	hShift = 0;
+
+	for (k=0; k<64; k=k+1)
+	{
+		if (_Genetic_Code[k]==10)
+		{
+			hShift = hShift+1;
+		}
+		else
+		{
+			seqToBranchMap[k-hShift] = observedCEFV[k];
+		}
+	}
+
+	observedCEFV = seqToBranchMap;
+
+
+	branchNames = BranchName (givenTree,-1);
+	h = Columns (branchNames);
+
+	seqToBranchMap 	= {h, 2};
+	/* maps sequence names to branch order in column 1 
+	   and the other way around in column 2 */
+
+	for (k=0; k<filteredData.species; k=k+1)
+	{
+		GetString (seqName, filteredData, k);
+		seqToBranchMap[k][0] = -1;
+		for (v=0; v<h; v=v+1)
+		{
+			if (branchNames[v] % seqName)
+			{
+				seqToBranchMap[k][0] = v;
+				seqToBranchMap[v][1] = k;
+				break;
+			}
+		}
+	}
+	
+
+	seqToBranchMap[filteredData.species][0] = h-1;
+	seqToBranchMap[h-1][1] = filteredData.species;
+
+	for (k=1; k<filteredDataA.species; k=k+1)
+	{
+		GetString (seqName, filteredDataA, k);
+		seqToBranchMap[filteredData.species+k][0] = -1;
+		for (v=0; v<h; v=v+1)
+		{
+			if (branchNames[v] % seqName)
+			{
+				seqToBranchMap[k+filteredData.species][0] = v;
+				seqToBranchMap[v][1] = k+filteredData.species;
+				break;
+			}
+		}
+	}
+
+	/* total tree length */
+
+	totalTreeLength = 0;
+	branchLengths   = BranchLength(givenTree,-1);
+
+	for (v=Columns(branchLengths)-1; v>=0; v=v-1)
+	{
+		totalTreeLength = totalTreeLength + branchLengths[v];
+	}
+
+	/* get codon matrix */
+
+	codonInfo  = {filteredData.species, filteredData.unique_sites};
+	codonInfo2 = {filteredDataA.species, filteredDataA.unique_sites};
+
+	GetDataInfo    (dupInfo, filteredData);
+	GetDataInfo	   (dupInfoA, filteredDataA);
+
+	matrixTrick  = {1,stateCharCount};
+	matrixTrick2 = {1,stateCharCount};
+
+	for (h=Columns(matrixTrick)-1; h>=0; h=h-1)
+	{
+		matrixTrick  [h] = h;
+		matrixTrick2 [h] = 1;
+	}
+
+	for (v=0; v<filteredData.unique_sites;v=v+1)
+	{
+		for (h=0; h<filteredData.species;h=h+1)
+		{
+			GetDataInfo (siteInfo, filteredData, h, v);
+			_SITE_ES_COUNT = matrixTrick2 * siteInfo; 
+			if (_SITE_ES_COUNT[0] == 1)
+			{
+				siteInfo = matrixTrick * siteInfo;
+				codonInfo[h][v] = siteInfo[0];
+			}
+			else
+			{
+				codonInfo[h][v] = -1;
+			}
+		}
+	}
+
+	for (v=0; v<filteredDataA.unique_sites;v=v+1)
+	{
+		for (h=0; h<filteredDataA.species;h=h+1)
+		{
+			GetDataInfo (siteInfo, filteredDataA, h, v);
+			siteInfo = matrixTrick * siteInfo;
+			codonInfo2[h][v] = siteInfo[0];
+		}
+	}
+
+	_SITE_RESULTS = {4,filteredData.sites};
+	flatTreeRep	  = Abs (givenTree);
+
+	resultMatrix = {filteredData.sites,4};
+
+	for (v=0; v<filteredData.sites;v=v+1)
+	/*for (v=0; v<1;v=v+1)*/
+	{
+		_SITE_ES_COUNT = {stateCharCount,stateCharCount};
+		_SITE_EN_COUNT = {stateCharCount,stateCharCount};
+		_SITE_OS_COUNT = {stateCharCount,stateCharCount};
+		_SITE_ON_COUNT = {stateCharCount,stateCharCount};
+		
+		/* do internal nodes first */
+		
+		k = filteredData.species+1;
+		
+		/* first sequence is always the root */
+		c1 = dupInfoA[v];
+		if (codonInfo2[1][c1] >= stateCharCount)
+		{
+			continue;
+		}
+		for (h=1; h<filteredDataA.species; h=h+1)
+		{
+			p1 = seqToBranchMap[k][0];
+			p2 = flatTreeRep[p1];
+			p2 = seqToBranchMap[p2][1]-filteredData.species;
+			
+			branchFactor = branchLengths[p1]/totalTreeLength;
+			
+			cd1 = codonInfo2[h] [c1];
+			cd2 = codonInfo2[p2][c1];
+						
+			_SITE_OS_COUNT[cd1][cd2] = _SITE_OS_COUNT[cd1][cd2] + 1;		
+			_SITE_ON_COUNT[cd1][cd2] = _SITE_ON_COUNT[cd1][cd2] + 1;		
+			_SITE_ES_COUNT[cd1][cd2] = _SITE_ES_COUNT[cd1][cd2] + branchFactor;		
+			_SITE_EN_COUNT[cd1][cd2] = _SITE_EN_COUNT[cd1][cd2] + branchFactor;		
+			
+			k=k+1;
+		}
+		
+		/* now do the leaves */
+		
+		observedCEFV = {{0}};
+		
+		c2 = dupInfo[v];
+		for (h=0; h<filteredData.species; h=h+1)
+		{
+			p1 = seqToBranchMap[h][0];
+			p2 = flatTreeRep[p1];
+			p2 = seqToBranchMap[p2][1]-filteredData.species;
+			
+			cd2 = codonInfo2[p2][c1];
+			cd1 = codonInfo[h] [c2];
+			
+			branchFactor = branchLengths[p1]/totalTreeLength;
+
+			if (cd1>=0)
+			/* no ambiguities */
+			{				
+				_SITE_OS_COUNT[cd1][cd2] = _SITE_OS_COUNT[cd1][cd2] + 1;		
+				_SITE_ON_COUNT[cd1][cd2] = _SITE_ON_COUNT[cd1][cd2] + 1;		
+				_SITE_ES_COUNT[cd1][cd2] = _SITE_ES_COUNT[cd1][cd2] + branchFactor;		
+				_SITE_EN_COUNT[cd1][cd2] = _SITE_EN_COUNT[cd1][cd2] + branchFactor;		
+			}	
+			else
+			/* ambiguities here */
+			{
+				GetDataInfo    (ambInfo, filteredData, h, c2);	
+				if (Rows(observedCEFV) == 1)
+				{
+					siteFilter = ""+(v*3)+"-"+(v*3+2);
+					DataSetFilter filteredDataSite = CreateFilter (dsJoint,3,siteFilter,"",GeneticCodeExclusions);
+					HarvestFrequencies			  (observedCEFV,filteredDataSite,3,3,0);
+					tempMx = {stateCharCount,1};
+
+					hShift = 0;
+
+					for (k=0; k<64; k=k+1)
+					{
+						if (_Genetic_Code[k]==10)
+						{
+							hShift = hShift+1;
+						}
+						else
+						{
+							tempMx[k-hShift] = observedCEFV[k];
+						}
+					}	
+					observedCEFV = tempMx;		
+				}
+				
+				ambInfo  	 = ambInfo$observedCEFV;
+				if (ambChoice)
+				{
+					weightFactor = 0;
+					tempMx = -1;
+					for (k=0; k<stateCharCount; k=k+1)
+					{
+						if (ambInfo[k]>weightFactor)
+						{
+							weightFactor = ambInfo[k];
+							tempMx = k;
+						}
+					}
+					if (tempMx>=0)
+					{
+						_SITE_OS_COUNT[tempMx][cd2] = _SITE_OS_COUNT[tempMx][cd2] + 1;		
+						_SITE_ON_COUNT[tempMx][cd2] = _SITE_ON_COUNT[tempMx][cd2] + 1 ;		
+						_SITE_ES_COUNT[tempMx][cd2] = _SITE_ES_COUNT[tempMx][cd2] + branchFactor;		
+						_SITE_EN_COUNT[tempMx][cd2] = _SITE_EN_COUNT[tempMx][cd2] + branchFactor;		
+					}
+				}
+				else
+				{
+					weightFactor = matrixTrick2*ambInfo;
+					weightFactor = weightFactor[0];
+					if (weightFactor)
+					{
+						ambInfo		 = ambInfo * (1/weightFactor);
+						for (k=0; k<stateCharCount; k=k+1)
+						{
+							weightFactor = ambInfo[k];
+							if (weightFactor>0)
+							{
+								_SITE_OS_COUNT[k][cd2] = _SITE_OS_COUNT[k][cd2] + weightFactor;		
+								_SITE_ON_COUNT[k][cd2] = _SITE_ON_COUNT[k][cd2] + weightFactor;		
+								_SITE_ES_COUNT[k][cd2] = _SITE_ES_COUNT[k][cd2] + weightFactor*branchFactor;		
+								_SITE_EN_COUNT[k][cd2] = _SITE_EN_COUNT[k][cd2] + weightFactor*branchFactor;		
+							}
+						}
+					}
+				}
+			}
+		}
+		
+		_SITE_OS_COUNT = matrixTrick2*(_OBSERVED_S_$_SITE_OS_COUNT)*Transpose(matrixTrick2);
+		_SITE_ON_COUNT = matrixTrick2*(_OBSERVED_NS_$_SITE_ON_COUNT)*Transpose(matrixTrick2);
+		_SITE_ES_COUNT = matrixTrick2*(_PAIRWISE_S_$_SITE_ES_COUNT)*Transpose(matrixTrick2);
+		_SITE_EN_COUNT = matrixTrick2*(_PAIRWISE_NS_$_SITE_EN_COUNT)*Transpose(matrixTrick2);
+		
+		OSResultMatrix[itidx][v] = _SITE_OS_COUNT[0];
+		ONResultMatrix[itidx][v] = _SITE_ON_COUNT[0];
+		ESResultMatrix[itidx][v] = _SITE_ES_COUNT[0];
+		ENResultMatrix[itidx][v] = _SITE_EN_COUNT[0];
+		
+		weight = _SITE_EN_COUNT[0]+_SITE_ES_COUNT[0];
+		
+		p = _SITE_ES_COUNT[0]/weight;
+		p2 = OSResultMatrix[itidx][v]+ONResultMatrix[itidx][v];
+		ds = OSResultMatrix[itidx][v]/ESResultMatrix[itidx][v];
+		dn = ONResultMatrix[itidx][v]/ENResultMatrix[itidx][v];
+		
+		if (ESResultMatrix[itidx][v])
+		{
+			dNmdS[itidx][v] = dn-ds;	
+		}
+		
+		if (p2)
+		{
+			pv  = extendedBinTail (p2,p,OSResultMatrix[itidx][v]);
+			if (OSResultMatrix[itidx][v]>=1)
+			{
+				pv2 = 1-pv+(pv-extendedBinTail(p2,p,OSResultMatrix[itidx][v]-1));
+			}
+			else
+			{
+				pv2 = 1-pv+(pv-extendedBinTail (p2,p,0));
+			}
+			pValuesPS[itidx][v] = pv;
+			pValuesNS[itidx][v] = pv2;
+		}				
+	}
+	if (it <= iterates)
+	{		
+		fprintf (stdout, "\nIterate ", it, "/", iterates);
+		fName = FILE_BASE+"_"+it;
+		DataSet 	  dsA 		   = ReadDataFile (fName);
+		it = it+1;
+		itidx = itidx + 1;
+	}
+	else
+	{
+		break;
+	}
+}
+
+fprintf (stdout, "\n");
+
+/* generate medians and tailEnd% and (100-tailEnd)% profiles */
+
+statisticalOverview = {filteredData.sites,12};
+
+tailEnd1 = " "+tailEnds+"%";
+tailEnd2 = " "+(100-tailEnds)+"%";
+
+sovLabels = {{"","ES Median","","","EN Median","","","OS Median","","","ON Median",""}};
+
+sovLabels[0]  = "ES"+tailEnd1;
+sovLabels[2]  = "ES"+tailEnd2;
+sovLabels[3]  = "EN"+tailEnd1;
+sovLabels[5]  = "EN"+tailEnd2;
+sovLabels[6]  = "OS"+tailEnd1;
+sovLabels[8]  = "OS"+tailEnd2;
+sovLabels[9]  = "ON"+tailEnd1;
+sovLabels[11] = "ON"+tailEnd2;
+
+ColumnToSort = {iterates,1};
+
+lowBar  = (iterates*tailEnds*0.01)$1;
+highBar = (iterates*(100-tailEnds)*0.01)$1;
+
+/*if ((iterates*9)%10==0)
+{
+	highBar = highBar-1;
+}*/
+
+median	= iterates$2;
+doAv	= (iterates%2==0);
+
+for (v=0;v<filteredData.sites;v=v+1)
+{
+	for (h=0;h<iterates;h=h+1)
+	{
+		ColumnToSort[h]=ESResultMatrix[h][v];
+	}
+	ColumnToSort = ColumnToSort%0;
+	statisticalOverview[v][0] = ColumnToSort[lowBar];
+	statisticalOverview[v][2] = ColumnToSort[highBar];
+	if (doAv)
+	{
+		statisticalOverview[v][1] = (ColumnToSort[median]+ColumnToSort[median+1])/2;	
+	}
+	else
+	{
+		statisticalOverview[v][1] = ColumnToSort[median];
+	}
+}
+
+for (v=0;v<filteredData.sites;v=v+1)
+{
+	for (h=0;h<iterates;h=h+1)
+	{
+		ColumnToSort[h]=ENResultMatrix[h][v];
+	}
+	/*dummy = doTheSort (iterates);*/
+	ColumnToSort = ColumnToSort%0;
+	statisticalOverview[v][3] = ColumnToSort[lowBar];
+	statisticalOverview[v][5] = ColumnToSort[highBar];
+	if (doAv)
+	{
+		statisticalOverview[v][4] = (ColumnToSort[median]+ColumnToSort[median+1])/2;	
+	}
+	else
+	{
+		statisticalOverview[v][4] = ColumnToSort[median];
+	}
+}
+
+for (v=0;v<filteredData.sites;v=v+1)
+{
+	for (h=0;h<iterates;h=h+1)
+	{
+		ColumnToSort[h]=OSResultMatrix[h][v];
+	}
+	ColumnToSort = ColumnToSort%0;
+	statisticalOverview[v][6] = ColumnToSort[lowBar];
+	statisticalOverview[v][8] = ColumnToSort[highBar];
+	if (doAv)
+	{
+		statisticalOverview[v][7] = (ColumnToSort[median]+ColumnToSort[median+1])/2;	
+	}
+	else
+	{
+		statisticalOverview[v][7] = ColumnToSort[median];
+	}
+}
+
+for (v=0;v<filteredData.sites;v=v+1)
+{
+	for (h=0;h<iterates;h=h+1)
+	{
+		ColumnToSort[h]=ONResultMatrix[h][v];
+	}
+	ColumnToSort = ColumnToSort%0;
+	statisticalOverview[v][9] = ColumnToSort[lowBar];
+	statisticalOverview[v][11] = ColumnToSort[highBar];
+	if (doAv)
+	{
+		statisticalOverview[v][10] = (ColumnToSort[median]+ColumnToSort[median+1])/2;	
+	}
+	else
+	{
+		statisticalOverview[v][10] = ColumnToSort[median];
+	}
+}
+
+selLabelMatrix = {1,filteredData.sites};
+
+for (h=1; h<=filteredData.sites;h=h+1)
+{
+	selLabelMatrix[h-1] = "Site " + h;
+}
+
+OpenWindow (CHARTWINDOW,{{"Simulated ES"}
+						   {"selLabelMatrix"},
+						   {"ESResultMatrix"},
+						   {"None"},
+						   {"Index"},
+						   {""},
+						   {""},
+						   {""},
+						   {""},
+						   {"0"}},
+						   "(SCREEN_WIDTH-60)/2;(SCREEN_HEIGHT-60)/2;15;30");
+
+OpenWindow (CHARTWINDOW,{{"Simulated EN"}
+						   {"selLabelMatrix"},
+						   {"ENResultMatrix"},
+						   {"None"},
+						   {"Index"},
+						   {""},
+						   {""},
+						   {""},
+						   {""},
+						   {"0"}},
+						   "(SCREEN_WIDTH-60)/2;(SCREEN_HEIGHT-60)/2;30+(SCREEN_WIDTH-60)/2;30");
+
+OpenWindow (CHARTWINDOW,{{"Simulated OS"}
+						   {"selLabelMatrix"},
+						   {"OSResultMatrix"},
+						   {"None"},
+						   {"Index"},
+						   {""},
+						   {""},
+						   {""},
+						   {""},
+						   {"0"}},
+						   "(SCREEN_WIDTH-60)/2;(SCREEN_HEIGHT-60)/2;15;45+(SCREEN_HEIGHT-60)/2");
+
+OpenWindow (CHARTWINDOW,{{"Simulated ON"}
+						   {"selLabelMatrix"},
+						   {"ONResultMatrix"},
+						   {"None"},
+						   {"Index"},
+						   {""},
+						   {""},
+						   {""},
+						   {""},
+						   {"0"}},
+						   "(SCREEN_WIDTH-60)/2;(SCREEN_HEIGHT-60)/2;30+(SCREEN_WIDTH-60)/2;45+(SCREEN_HEIGHT-60)/2");
+
+OpenWindow (CHARTWINDOW,{{"Summary"}
+						   {"sovLabels"},
+						   {"statisticalOverview"},
+						   {"Line Plot"},
+						   {"Index"},
+						   {""},
+						   {""},
+						   {""},
+						   {""},
+						   {"0"}},
+						   "(SCREEN_WIDTH-200);(SCREEN_HEIGHT-200);100;100");
+
diff --git a/res/TemplateBatchFiles/SGEmulator.bf b/res/TemplateBatchFiles/SGEmulator.bf
new file mode 100644
index 0000000..54baca8
--- /dev/null
+++ b/res/TemplateBatchFiles/SGEmulator.bf
@@ -0,0 +1,919 @@
+#include "binomial.ibf";
+
+/*___________________________________________________________________________________________________________*/
+
+function PadString (padLength,padChar)
+{
+	padString = "";
+	d=padString*padLength;
+	for (padCounter=0;padCounter<padLength;padCounter=padCounter+1)
+	{
+		d=padString*padChar;
+	}
+	d=padString*0;
+	fprintf (stdout,padString);
+	return padString;
+}
+
+/*___________________________________________________________________________________________________________*/
+
+function	PrintASCIITable (dataMatrix, titleMatrix)
+{
+	columnWidths = {1,Columns(titleMatrix)};
+	for (counter1=0; counter1<Columns(titleMatrix); counter1 = counter1+1)
+	{
+		counter2 = Abs (titleMatrix[0][counter1])+2;
+		if (counter2<12)
+		{
+			counter2 = 12;
+		}
+		columnWidths[0][counter1] = counter2;
+	}
+	fprintf (stdout, "\n");
+	for (counter2 = 0; counter2 < Columns (titleMatrix); counter2 = counter2+1)
+	{
+		fprintf (stdout,"+-");
+		dummy = PadString (columnWidths[0][counter2],"-");
+		fprintf (stdout,"-");
+	}
+	fprintf (stdout,"+\n| ");
+	
+	for (counter1=0; counter1<Columns(titleMatrix); counter1 = counter1+1)
+	{
+		fprintf (stdout, titleMatrix[counter1]);
+		dummy = PadString (columnWidths[0][counter1]-Abs(titleMatrix[counter1])," ");
+		fprintf (stdout, " | ");
+	}
+	
+	fprintf (stdout, "\n");
+	
+	for (counter1=-1; counter1<Rows(dataMatrix); counter1 = counter1 + 1)
+	{
+		if (counter1>=0)
+		{
+			fprintf (stdout,"| ");
+			fprintf (stdout,Format(counter1+1,columnWidths[0][0],0));
+			for (counter2 = 1; counter2 < Columns (titleMatrix); counter2 = counter2+1)
+			{
+				fprintf (stdout," | ");
+				fprintf (stdout,Format(dataMatrix[counter1][counter2-1],columnWidths[0][counter2],-1));
+			}
+			fprintf (stdout," ");
+			fprintf (stdout, "|\n");
+		}
+		for (counter2 = 0; counter2 < Columns (titleMatrix); counter2 = counter2+1)
+		{
+			fprintf (stdout,"+-");
+			dummy = PadString (columnWidths[0][counter2],"-");
+			fprintf (stdout,"-");
+		}
+		fprintf (stdout, "+\n");
+	}
+	
+	return 1;
+}
+
+/*___________________________________________________________________________________________________________*/
+
+function mergeSimulatedNulls (nullAVL1, nullAVL2)
+{
+	nullAVLJoint = {};
+	
+	ccode = Abs(nullAVL1);
+	
+	for (counter1 = 0; counter1 < ccode; counter1 = counter1 + 1)
+	{
+		av1 		= nullAVL1[counter1];
+		av2 		= nullAVL2[counter1];
+		avJ 		= {};
+		doneKeys 	= {};
+		keys1		= Rows(av1);
+		keys2 		= Rows(av2);
+		keyC		= Columns(keys1);
+		
+		for (counter2 = 0; counter2 < keyC; counter2 = counter2 + 1)
+		{
+			key1Value = keys1[counter2];
+			mx1 = av1[key1Value];
+			mx2 = av2[key1Value];
+			if (Abs(mx2))
+			{
+				/* merge the two matrices */
+				
+				d = Rows(mx1);
+				mx3 = {d,2};
+				mx3 [0][0] = mx1[0][0] + mx2[0][0];
+				w1 = mx1[0][0] / mx3 [0][0];
+				w2 = mx2[0][0] / mx3 [0][0];
+				
+				for (counter3 = 1; counter3 < d; counter3 = counter3 + 1)
+				{
+					mx3[counter3][0] = mx1[counter3][0];
+					mx3[counter3][1] = mx1[counter3][1]*w1 + mx2[counter3][1]*w2;
+				}
+				avJ [key1Value] = mx3;
+			}
+			else
+			{
+				avJ [key1Value] = mx1;
+			}
+			doneKeys[key1Value] = 1;
+		}		
+
+		keyC		= Columns(keys2);
+		for (counter2 = 0; counter2 < keyC; counter2 = counter2 + 1)
+		{
+			key1Value = keys2[counter2];
+			if (doneKeys[key1Value] < 0.5)
+			{
+				avJ [key1Value] = av2[key1Value];
+			}
+		}
+		
+		nullAVLJoint[counter1] = avJ;
+	}
+	
+	return nullAVLJoint;
+}
+
+/*___________________________________________________________________________________________________________*/
+
+nucCharacters="ACGT";
+function codonString (ccode)
+{
+	return nucCharacters[ccode$16]+nucCharacters[(ccode%16)$4]+nucCharacters[ccode%4];
+}
+
+/*___________________________________________________________________________________________________________*/
+
+function	PrintTableToFile (dataMatrix, titleMatrix, promptOrNot)
+{
+	SetDialogPrompt ("Export tab separated data to:");
+	
+	if (promptOrNot)
+	{
+		fprintf (PROMPT_FOR_FILE, CLEAR_FILE);
+	}
+	
+	bufferString = "";
+	bufferString * 8192;
+	bufferString * titleMatrix[0][0];
+
+	for (counter1=1; counter1<Columns(titleMatrix); counter1 = counter1+1)
+	{
+		bufferString * ("\t"+titleMatrix[0][counter1]);
+	}
+	
+	for (counter1=0; counter1<Rows(dataMatrix); counter1 = counter1 + 1)
+	{
+		bufferString * ("\n"+dataMatrix[counter1][0]);
+		for (counter2 = 1; counter2 < Columns (dataMatrix); counter2 = counter2+1)
+		{
+		    bufferString * ("\t"+dataMatrix[counter1][counter2]);
+		}
+	}
+	
+	bufferString * 0;
+	fprintf (LAST_FILE_PATH,bufferString);
+	bufferString = 0;
+	
+	return 1;
+}
+
+/*----------------------------------------------------------------------------*/
+
+if (pipeThroughFlag == 0)
+{
+	ChoiceList (ambChoice, "Treatment of Ambiguities",1,SKIP_NONE,
+				"Averaged","All possible resolutions are considered and averaged.",
+				"Resolved","The most frequent (for that site) resolution is chosen.");
+
+	if (ambChoice<0)
+	{
+		return;
+	}
+
+	if (useCustomCountingBias)
+	{
+		incFileName = "Distances/CodonToolsMain.def";
+	}
+	else
+	{
+		incFileName = "Distances/CodonTools.def";
+	}
+
+	ExecuteCommands  ("#include \""+incFileName+"\";");
+	
+	ChoiceList	(distribChoice, "Test Statistic",1,SKIP_NODE,
+				 "Approximate", "Use the approximate extended binomial distribution (fast)",
+				 "Simulated Null", "Dynamically generate the null distribution from the data (very slow).");
+	
+	if (distribChoice < 0)
+	{
+		return;
+	}
+}
+
+
+if (distribChoice > 0)
+{
+	STORE_ROOT_SUPPORT = 1;
+}
+
+DataSet dsA					= ReconstructAncestors (lf);
+
+if (distribChoice > 0)
+{
+	STORE_ROOT_SUPPORT = 0;
+	SUPPORT_MATRIX_LIST = Transpose (SUPPORT_MATRIX_LIST[0]);
+}
+DataSetFilter filteredDataA = CreateFilter (dsA,3,"","",GeneticCodeExclusions);
+
+HarvestFrequencies			  (observedCEFV,filteredData,3,3,0);
+seqToBranchMap = {stateCharCount,1};
+
+DataSet		   dsJoint = Combine(dsA,ds);
+DataSetFilter filteredDataJ = CreateFilter (dsJoint,3,"","",GeneticCodeExclusions);
+
+hShift = 0;
+
+for (k=0; k<64; k=k+1)
+{
+	if (_Genetic_Code[k]==10)
+	{
+		hShift = hShift+1;
+	}
+	else
+	{
+		seqToBranchMap[k-hShift] = observedCEFV[k];
+	}
+}
+
+observedCEFV = seqToBranchMap;
+
+
+branchNames = BranchName (givenTree,-1);
+h = Columns (branchNames);
+
+seqToBranchMap 	= {h, 2};
+/* maps sequence names to branch order in column 1 
+   and the other way around in column 2 */
+
+for (k=0; k<filteredData.species; k=k+1)
+{
+	GetString (seqName, filteredData, k);
+	seqToBranchMap[k][0] = -1;
+	for (v=0; v<h; v=v+1)
+	{
+		if (branchNames[v] % seqName)
+		{
+			seqToBranchMap[k][0] = v;
+			seqToBranchMap[v][1] = k;
+			break;
+		}
+	}
+}
+
+seqToBranchMap[filteredData.species][0] = h-1;
+seqToBranchMap[h-1][1] = filteredData.species;
+
+for (k=1; k<filteredDataA.species; k=k+1)
+{
+	GetString (seqName, filteredDataA, k);
+	seqToBranchMap[filteredData.species+k][0] = -1;
+	for (v=0; v<h; v=v+1)
+	{
+		if (branchNames[v] % seqName)
+		{
+			seqToBranchMap[k+filteredData.species][0] = v;
+			seqToBranchMap[v][1] = k+filteredData.species;
+			break;
+		}
+	}
+}
+
+/*for (k=0; k<Rows(seqToBranchMap); k=k+1)
+{
+	v = seqToBranchMap[k][0];
+	fprintf (stdout, "\n", branchNames[v], "=>");
+	if (k<filteredData.species)
+	{
+		GetString (seqName, filteredData, k);
+	}
+	else
+	{
+		GetString (seqName, filteredDataA, k-filteredData.species);
+	}
+	fprintf (stdout, seqName);	
+}
+
+fprintf (stdout, "\n\n");
+
+for (k=0; k<Rows(seqToBranchMap); k=k+1)
+{
+	fprintf (stdout, "\n", branchNames[k], "=>");
+	v = seqToBranchMap[k][1];
+	if (v<filteredData.species)
+	{
+		GetString (seqName, filteredData, v);
+	}
+	else
+	{
+		GetString (seqName, filteredDataA, v-filteredData.species);
+	}
+	fprintf (stdout, seqName);	
+}
+
+fprintf (stdout, "\n\n");
+
+return 0;*/
+
+/* total tree length */
+
+totalTreeLength = 0;
+branchLengths   = BranchLength(givenTree,-1);
+
+for (v=Columns(branchLengths)-1; v>=0; v=v-1)
+{
+	totalTreeLength = totalTreeLength + branchLengths[v];
+}
+
+/* get codon matrix */
+
+codonInfo  = {filteredData.species, filteredData.unique_sites};
+codonInfo2 = {filteredDataA.species, filteredDataA.unique_sites};
+
+GetDataInfo    (dupInfo, filteredData);
+GetDataInfo	   (dupInfoA, filteredDataA);
+
+matrixTrick  = {1,stateCharCount};
+matrixTrick2 = {1,stateCharCount};
+matrixTrick  = matrixTrick["_MATRIX_ELEMENT_COLUMN_"];
+matrixTrick2 = matrixTrick2["1"];
+
+for (v=0; v<filteredData.unique_sites;v=v+1)
+{
+	for (h=0; h<filteredData.species;h=h+1)
+	{
+		GetDataInfo (siteInfo, filteredData, h, v);
+		_SITE_ES_COUNT = matrixTrick2 * siteInfo; 
+		if (_SITE_ES_COUNT[0] == 1)
+		{
+			siteInfo = matrixTrick * siteInfo;
+			codonInfo[h][v] = siteInfo[0];
+		}
+		else
+		{
+			codonInfo[h][v] = -1;
+		}
+	}
+}
+
+for (v=0; v<filteredDataA.unique_sites;v=v+1)
+{
+	for (h=0; h<filteredDataA.species;h=h+1)
+	{
+		GetDataInfo (siteInfo, filteredDataA, h, v);
+		if ((matrixTrick2*siteInfo)[0] > 1)
+		{
+			codonInfo2[h][v] = -1;
+		}
+		else
+		{
+			codonInfo2[h][v] = (matrixTrick * siteInfo)[0];
+		}
+	}
+}
+
+_SITE_RESULTS = {4,filteredData.sites};
+flatTreeRep	  = Abs (givenTree);
+
+resultMatrix = {filteredData.sites,12};
+perBranchMatrix = {Columns(branchNames),2};
+
+
+
+if (distribChoice)
+{
+	dNdS = 	1;
+	branchLengthsNeutral   = BranchLength(codonTree,-1);
+	branchNamesList		   = BranchName (codonTree,-1);
+	
+	ClearConstraints (codonTree);
+	/*fprintf (stdout, "\nTree before: ", Format (codonTree,1,1),"\n");*/
+	
+	for (v=Columns(branchLengthsNeutral)-1; v>=0; v=v-1)
+	{
+		ExecuteCommands ("codonTree."+branchNamesList[v]+".synRate = codonTree."+branchNamesList[v]+".synRate*branchLengths[v]/branchLengthsNeutral[v];"); 
+	}	
+	
+	/*fprintf (stdout, "\nTree after: ", Format (codonTree,1,1),"\n");*/
+
+	fprintf (stdout, "Simulating the null distribution for average branch lengths...\n");
+	
+	GetNeutralNull (simulatedNullAVL1, lf, _OBSERVED_S_, _OBSERVED_NS_, 33333);
+
+	for (v=Columns(branchLengthsNeutral)-1; v>=0; v=v-1)
+	{
+		ExecuteCommands ("codonTree."+branchNamesList[v]+".synRate = codonTree."+branchNamesList[v]+".synRate*0.125"); 
+	}	
+
+	fprintf (stdout, "Simulating the null distribution for short branch lengths...\n");
+	GetNeutralNull (simulatedNullAVL2, lf, _OBSERVED_S_, _OBSERVED_NS_, 33333);
+	
+	simulatedNullAVL = mergeSimulatedNulls(simulatedNullAVL1,simulatedNullAVL2); 
+	
+	for (v=Columns(branchLengthsNeutral)-1; v>=0; v=v-1)
+	{
+		ExecuteCommands ("codonTree."+branchNamesList[v]+".synRate = codonTree."+branchNamesList[v]+".synRate*32"); 
+	}	
+
+	fprintf (stdout, "Simulating the null distribution for long branch lengths...\n");
+	GetNeutralNull (simulatedNullAVL3, lf, _OBSERVED_S_, _OBSERVED_NS_, 33333);
+	simulatedNullAVL = mergeSimulatedNulls(simulatedNullAVL,simulatedNullAVL3); 
+}
+
+for (v=0; v<filteredData.sites;v=v+1)
+{
+	_SITE_ES_COUNT = {stateCharCount,stateCharCount};
+	_SITE_EN_COUNT = {stateCharCount,stateCharCount};
+	_SITE_OS_COUNT = {stateCharCount,stateCharCount};
+	_SITE_ON_COUNT = {stateCharCount,stateCharCount};
+	
+	/* do internal nodes first */
+	
+	k = filteredData.species+1;
+	
+	/* first sequence is always the root */
+	c1 = dupInfoA[v];
+	if (codonInfo2[1][c1] >= stateCharCount)
+	{
+		continue;
+	}
+	for (h=1; h<filteredDataA.species; h=h+1)
+	{
+		p1 = seqToBranchMap[k][0];
+		p2 = flatTreeRep[p1];
+		p2 = seqToBranchMap[p2][1]-filteredData.species;
+		
+		branchFactor = branchLengths[p1]/totalTreeLength;
+		
+		cd1 = codonInfo2[h] [c1];
+		cd2 = codonInfo2[p2][c1];
+		
+		if (cd1 >= 0 && cd2 >= 0)
+		{
+			_SITE_OS_COUNT[cd1][cd2] = _SITE_OS_COUNT[cd1][cd2] + 1;		
+			_SITE_ON_COUNT[cd1][cd2] = _SITE_ON_COUNT[cd1][cd2] + 1;		
+			_SITE_ES_COUNT[cd1][cd2] = _SITE_ES_COUNT[cd1][cd2] + branchFactor;		
+			_SITE_EN_COUNT[cd1][cd2] = _SITE_EN_COUNT[cd1][cd2] + branchFactor;		
+			
+			if (_PAIRWISE_S_[cd1][cd2])
+			{
+				perBranchMatrix[p1][0] = perBranchMatrix[p1][0]+_OBSERVED_S_[cd1][cd2]/_PAIRWISE_S_[cd1][cd2];
+			}
+			perBranchMatrix[p1][1] = perBranchMatrix[p1][1]+_OBSERVED_NS_[cd1][cd2]/_PAIRWISE_NS_[cd1][cd2];
+		}
+		k=k+1;
+	}
+	
+	/* now do the leaves */
+	
+	observedCEFV = {{0}};
+	
+	c2 = dupInfo[v];
+	for (h=0; h<filteredData.species; h=h+1)
+	{
+		p1 = seqToBranchMap[h][0];
+		p2 = flatTreeRep[p1];
+		p2 = seqToBranchMap[p2][1]-filteredData.species;
+		
+		cd2 = codonInfo2[p2][c1];
+		cd1 = codonInfo[h] [c2];
+		
+		branchFactor = branchLengths[p1]/totalTreeLength;
+
+		if (cd1>=0)
+		/* no ambiguities */
+		{
+			/*p2 = flatTreeRep[p1];
+			fprintf (stdout, "Change from ", codonString (cd1), " to ", codonString (cd2), " along ", branchNames[p1], " and ", branchNames[p2], "(",branchFactor,")\n");
+			*/
+			_SITE_OS_COUNT[cd1][cd2] = _SITE_OS_COUNT[cd1][cd2] + 1;		
+			_SITE_ON_COUNT[cd1][cd2] = _SITE_ON_COUNT[cd1][cd2] + 1;		
+			_SITE_ES_COUNT[cd1][cd2] = _SITE_ES_COUNT[cd1][cd2] + branchFactor;		
+			_SITE_EN_COUNT[cd1][cd2] = _SITE_EN_COUNT[cd1][cd2] + branchFactor;		
+
+			if (_PAIRWISE_S_[cd1][cd2])
+			{
+				perBranchMatrix[p1][0] = perBranchMatrix[p1][0]+_OBSERVED_S_[cd1][cd2]/_PAIRWISE_S_[cd1][cd2];
+			}
+			perBranchMatrix[p1][1] = perBranchMatrix[p1][1]+_OBSERVED_NS_[cd1][cd2]/_PAIRWISE_NS_[cd1][cd2];
+		}	
+		else
+		/* ambiguities here */
+		{
+			GetDataInfo    (ambInfo, filteredData, h, c2);	
+			if (Rows(observedCEFV) == 1)
+			{
+				siteFilter = ""+(v*3)+"-"+(v*3+2);
+				DataSetFilter filteredDataSite = CreateFilter (dsJoint,3,siteFilter,"",GeneticCodeExclusions);
+				HarvestFrequencies			  (observedCEFV,filteredDataSite,3,3,0);
+				tempMx = {stateCharCount,1};
+
+				hShift = 0;
+
+				for (k=0; k<64; k=k+1)
+				{
+					if (_Genetic_Code[k]==10)
+					{
+						hShift = hShift+1;
+					}
+					else
+					{
+						tempMx[k-hShift] = observedCEFV[k];
+					}
+				}	
+				observedCEFV = tempMx;		
+			}
+			
+			weightFactor = matrixTrick2*ambInfo;
+			if (weightFactor[0]<stateCharCount)
+			{
+				ambInfo  	 = ambInfo$observedCEFV;
+				
+				if (ambChoice)
+				{
+					weightFactor = 0;
+					tempMx = -1;
+					for (k=0; k<stateCharCount; k=k+1)
+					{
+						if (ambInfo[k]>weightFactor)
+						{
+							weightFactor = ambInfo[k];
+							tempMx = k;
+						}
+					}
+					if (tempMx>=0)
+					{
+						_SITE_OS_COUNT[tempMx][cd2] = _SITE_OS_COUNT[tempMx][cd2] + 1;		
+						_SITE_ON_COUNT[tempMx][cd2] = _SITE_ON_COUNT[tempMx][cd2] + 1 ;		
+						_SITE_ES_COUNT[tempMx][cd2] = _SITE_ES_COUNT[tempMx][cd2] + branchFactor;		
+						_SITE_EN_COUNT[tempMx][cd2] = _SITE_EN_COUNT[tempMx][cd2] + branchFactor;		
+						if (_PAIRWISE_S_[tempMx][cd2])
+						{
+							perBranchMatrix[p1][0] = perBranchMatrix[p1][0]+_OBSERVED_S_[tempMx][cd2]/_PAIRWISE_S_[tempMx][cd2];
+						}
+						perBranchMatrix[p1][1] = perBranchMatrix[p1][1]+_OBSERVED_NS_[tempMx][cd2]/_PAIRWISE_NS_[tempMx][cd2];
+					}
+				}
+				else
+				{
+					weightFactor = matrixTrick2*ambInfo;
+					weightFactor = weightFactor[0];
+					if (weightFactor)
+					{
+						ambInfo		 = ambInfo * (1/weightFactor);
+						for (k=0; k<stateCharCount; k=k+1)
+						{
+							weightFactor = ambInfo[k];
+							if (weightFactor>0)
+							{
+								_SITE_OS_COUNT[k][cd2] = _SITE_OS_COUNT[k][cd2] + weightFactor;		
+								_SITE_ON_COUNT[k][cd2] = _SITE_ON_COUNT[k][cd2] + weightFactor;		
+								_SITE_ES_COUNT[k][cd2] = _SITE_ES_COUNT[k][cd2] + weightFactor*branchFactor;		
+								_SITE_EN_COUNT[k][cd2] = _SITE_EN_COUNT[k][cd2] + weightFactor*branchFactor;
+										
+								if (_PAIRWISE_S_[k][cd2])
+								{
+									perBranchMatrix[p1][0] = perBranchMatrix[p1][0]+weightFactor*_OBSERVED_S_[k][cd2]/_PAIRWISE_S_[k][cd2];
+								}
+								perBranchMatrix[p1][1] = perBranchMatrix[p1][1]+weightFactor*_OBSERVED_NS_[k][cd2]/_PAIRWISE_NS_[k][cd2];
+							}
+						}
+					}
+				}
+			}
+		}
+	}
+	
+	_SITE_OS_COUNT = matrixTrick2*(_OBSERVED_S_$_SITE_OS_COUNT)*Transpose(matrixTrick2);
+	_SITE_ON_COUNT = matrixTrick2*(_OBSERVED_NS_$_SITE_ON_COUNT)*Transpose(matrixTrick2);
+	_SITE_ES_COUNT = matrixTrick2*(_PAIRWISE_S_$_SITE_ES_COUNT)*Transpose(matrixTrick2);
+	_SITE_EN_COUNT = matrixTrick2*(_PAIRWISE_NS_$_SITE_EN_COUNT)*Transpose(matrixTrick2);
+	
+	resultMatrix[v][0] = _SITE_OS_COUNT[0];
+	resultMatrix[v][1] = _SITE_ON_COUNT[0];
+	resultMatrix[v][2] = _SITE_ES_COUNT[0];
+	resultMatrix[v][3] = _SITE_EN_COUNT[0];
+	
+	weight = _SITE_EN_COUNT[0]+_SITE_ES_COUNT[0];
+	
+	p = _SITE_ES_COUNT[0]/weight;
+	
+	resultMatrix[v][5] = p;
+	
+	p2 = resultMatrix[v][0]+resultMatrix[v][1];
+	
+	resultMatrix[v][7] = resultMatrix[v][1]/resultMatrix[v][3];
+	
+	if (resultMatrix[v][2])
+	{
+		resultMatrix[v][6]  = resultMatrix[v][0]/resultMatrix[v][2];
+		resultMatrix[v][8]  = resultMatrix[v][7]-resultMatrix[v][6];	
+		resultMatrix[v][11] = resultMatrix[v][8]/totalTreeLength;	
+	}
+	
+	if (p2)
+	{
+		resultMatrix[v][4]  = resultMatrix[v][0]/p2;		
+		if (distribChoice)
+		{
+			p3 = p2$1;
+			p4 = ((resultMatrix[v][0]*6)+0.5)$1;
+			
+			waP          = 0;
+			waN			 = 0;
+
+			if (p3 != p2)
+			{
+				/* use averaging */
+				fprintf (stdout, "Interpolating at site ", v, ": ", p3, " ", p3+1, " ", p2, "\n");
+				
+				w1 = p2-p3;
+				w2 = 1-w1;
+				
+				for (kk2 = 0; kk2 < stateCharCount; kk2 = kk2+1)
+				{			
+					ambInfo = SUPPORT_MATRIX_LIST[kk2][v];
+					if (ambInfo>0.000001)
+					{
+						subMatrixAVL = simulatedNullAVL[kk2];
+						subMatrixAVL1 = subMatrixAVL[p3];
+						subMatrixAVL2 = subMatrixAVL[p3+1];
+						if (Abs(subMatrixAVL1) && Abs(subMatrixAVL2))
+						{
+							pv1 = subMatrixAVL1[p4+1][1];
+							pv2 = subMatrixAVL2[p4+1][1];
+							if (subMatrixAVL1[0][0] >= 100 && subMatrixAVL2[0][0] >= 100)
+							{
+								waP = waP + (pv1*w1+pv2*w2)*ambInfo;
+								if (p4 == 0)
+								{
+									waN = waN + ambInfo;
+								}
+								else
+								{
+									waN = waN + (1 + w1*(pv1 - 2*subMatrixAVL1[p4][1]) + w2*(pv2 - 2*subMatrixAVL2[p4][1])) * ambInfo;
+								}
+							}
+							else
+							{
+								fprintf (stdout, "Bailing at site ", v, " codon ", kk2, " sim count ", subMatrixAVL[0][0], "\n");
+								break;
+							}
+						}
+						else
+						{
+							fprintf (stdout, "Bailing at site ", v, " codon ", kk2 , " sim count 0 \n");
+							break;					
+						}
+					}
+				}				
+			}
+			else
+			{
+				for (kk2 = 0; kk2 < stateCharCount; kk2 = kk2+1)
+				{			
+					ambInfo = SUPPORT_MATRIX_LIST[kk2][v];
+					if (ambInfo>0.000001)
+					{
+						subMatrixAVL = simulatedNullAVL[kk2];
+						subMatrixAVL = subMatrixAVL[p3];
+						if (Abs(subMatrixAVL))
+						{
+							if (subMatrixAVL[0][0] >= 100)
+							{
+								waP = waP + subMatrixAVL[p4+1][1]*ambInfo;
+								if (p4 == 0)
+								{
+									waN = waN + ambInfo;
+								}
+								else
+								{
+									waN = waN + (1 + subMatrixAVL[p4+1][1] - 2*subMatrixAVL[p4][1]) * ambInfo;
+								}
+							}
+							else
+							{
+								fprintf (stdout, "Bailing at site ", v, " codon ", kk2, " sim count ", subMatrixAVL[0][0], "\n");
+								break;
+							}
+						}
+						else
+						{
+							fprintf (stdout, "Bailing at site ", v, " codon ", kk2 , " sim count 0 \n");
+							break;					
+						}
+					}
+				}						
+			}
+
+
+
+			if (kk2 == stateCharCount)
+			{
+				resultMatrix[v][9]  = waP;
+				resultMatrix[v][10] = waN;
+				continue;
+			}
+		}
+		resultMatrix[v][9]  = extendedBinTail (p2,p,resultMatrix[v][0]);
+		if (resultMatrix[v][0]>=1)
+		{
+			resultMatrix[v][10] = 1-extendedBinTail(p2,p,resultMatrix[v][0]-1);
+		}
+		else
+		{
+			resultMatrix[v][10] = 1-extendedBinTail (p2,p,0);
+		}
+	}		
+}
+
+perBranchMatrix = perBranchMatrix * (1/filteredData.sites);
+if (pipeThroughFlag == 0)
+{
+
+	labelMatrix =     {1,12};
+	labelMatrix[0] = "Observed S Changes";
+	labelMatrix[1] = "Observed NS Changes";
+	labelMatrix[2] = "E[S Sites]";
+	labelMatrix[3] = "E[NS Sites]";
+	labelMatrix[4] = "Observed S. Prop.";
+	labelMatrix[5] = "P{S}";
+	labelMatrix[6] = "dS";
+	labelMatrix[7] = "dN";
+	labelMatrix[8] = "dN-dS";
+	labelMatrix[9]  = "P{S leq. observed}";
+	labelMatrix[10] = "P{S geq. observed}";
+	labelMatrix[11] = "Scaled dN-dS";
+
+	sigLevel = -1;
+	
+	fprintf (stdout, "\nTotal codon tree length (subs/nuc/unit time): ", Format (totalTreeLength,10,5), "\n");
+
+	while ((sigLevel<=0)||(sigLevel>=1))
+	{
+		fprintf (stdout, "\nSignificance level for a site to be classified as positively/negatively selected?");
+		fscanf  (stdin, "Number", sigLevel);
+	}
+
+	posSelected = 0;
+	negSelected = 0;
+
+	p = Rows(resultMatrix);
+
+	for (p2=0; p2<p; p2=p2+1)
+	{
+		v = resultMatrix [p2][8];
+		if (v>0)
+		{
+			if (resultMatrix [p2][9] < sigLevel)
+			{
+				posSelected = posSelected+1;
+			}
+		}
+		else
+		{
+			if (v<0)
+			{
+				if (resultMatrix [p2][10] < sigLevel)
+				{
+					negSelected = negSelected+1;
+				}
+			}
+		}
+	}
+
+	selLabelMatrix = {{"Index","Site Index","dN-dS","p-value"}};
+
+	if (posSelected)
+	{
+		psMatrix = {posSelected, 3};
+		h = 0;
+		for (p2=0; p2<p; p2=p2+1)
+		{
+			v = resultMatrix [p2][8];
+			if (v>0)
+			{
+				if (resultMatrix [p2][9] < sigLevel)
+				{
+					psMatrix[h][0] = p2+1;
+					psMatrix[h][1] = v;
+					psMatrix[h][2] = resultMatrix [p2][9];
+					h = h+1;
+				}
+			}
+		}
+		
+		fprintf (stdout,"\n******* FOUND ", posSelected, " POSITIVELY SELECTED SITES ********\n\n");
+		dummy = PrintASCIITable  (psMatrix, selLabelMatrix);
+	}
+	else
+	{
+		fprintf (stdout,"\n******* FOUND NO POSITIVELY SELECTED SITES ********\n\n");
+	}
+
+	if (negSelected)
+	{
+		psMatrix = {negSelected, 3};
+		h = 0;
+		for (p2=0; p2<p; p2=p2+1)
+		{
+			v = resultMatrix [p2][8];
+			if (v<0)
+			{
+				if (resultMatrix [p2][10] < sigLevel)
+				{
+					psMatrix[h][0] = p2+1;
+					psMatrix[h][1] = v;
+					psMatrix[h][2] = resultMatrix [p2][10];
+					h = h+1;
+				}
+			}
+		}
+		
+		fprintf (stdout,"\n******* FOUND ", negSelected, " NEGATIVELY SELECTED SITES ********\n\n");
+		dummy = PrintASCIITable  (psMatrix, selLabelMatrix);
+	}
+	else
+	{
+		fprintf (stdout,"\n******* FOUND NO NEGATIVELY SELECTED SITES ********\n\n");
+	}
+
+	ChoiceList (outputChoice, "Output Options",1,SKIP_NONE,
+				"ASCII Table",	 "Output is printed to the console as an ASCII table.",
+				"Export to File","Output is spooled to a tab separated file.",
+				"Chart","A HYPHY chart window is displayed (Mac/Doze Only).");
+	if (outputChoice<0)
+	{
+		return;
+	}
+
+	if (outputChoice==0)
+	{
+		dummy = PrintASCIITable  (resultMatrix, labelMatrix);
+	}
+	else
+	{
+		if (outputChoice == 1)
+		{
+			SetDialogPrompt ("Save result table to");
+			dummy = PrintTableToFile  (resultMatrix, labelMatrix, !pipeThroughFlag);
+		}
+		else
+		{
+			OpenWindow (CHARTWINDOW,{{"Rates by sites"}
+									{"labelMatrix"}
+									{"resultMatrix"}
+									{"Contrast Bars"}
+									{"Index"}
+									{labelMatrix[6]+";"+labelMatrix[7]}
+									{"Site Index"}
+									{"dN"}
+									{"dS"}
+									{"0"}
+									{""}
+									{"-1;-1"}
+									{"10;1.309;0.785398"}
+									{"Times:12:0;Times:10:0;Times:12:2"}
+									{"0;0;16777215;1644825;0;0;6579300;11842740;13158600;14474460;0;3947580;16777215;5000268;6845928;16771158;2984993;9199669;7018159;1460610;16748822;11184810;14173291"}
+									{"16,0,0"}
+									},
+									"(SCREEN_WIDTH-60)/2;(SCREEN_HEIGHT-50)/2;50;50");
+		}
+	}
+	
+	defString = "";
+	defString * 8192;
+	for (h=Rows(perBranchMatrix)-2; h>=0; h=h-1)
+	{
+		defString * ("_branchScaledTree."+branchNames[h]+".dS = "+perBranchMatrix[h][0]);
+		defString * (";_branchScaledTree."+branchNames[h]+".dN = "+perBranchMatrix[h][1]+";");
+		if (perBranchMatrix[h][1]+perBranchMatrix[h][0])
+		{
+			defString * ("_branchScaledTree."+branchNames[h]+".dNdS = "+Min(perBranchMatrix[h][1]/perBranchMatrix[h][0],5)+";");
+		}
+		else
+		{
+			defString * ("_branchScaledTree."+branchNames[h]+".dNdS = 0;");
+		}
+	}
+	defString * 0;
+	ExecuteCommands (defString);
+	UseModel (USE_NO_MODEL);
+	REPLACE_TREE_STRUCTURE = 1;
+	Tree _branchScaledTree = ""+givenTree;
+	REPLACE_TREE_STRUCTURE = 0;
+	OpenWindow (TREEWINDOW,{{"_branchScaledTree"}{"8211"}{""}{"dNdS"}},"SCREEN_WIDTH/2-30;SCREEN_HEIGHT-120;100;100");
+}
diff --git a/res/TemplateBatchFiles/SGEmulator_MF.bf b/res/TemplateBatchFiles/SGEmulator_MF.bf
new file mode 100644
index 0000000..3a1c739
--- /dev/null
+++ b/res/TemplateBatchFiles/SGEmulator_MF.bf
@@ -0,0 +1,741 @@
+#include "binomial.ibf";
+
+/*___________________________________________________________________________________________________________*/
+
+function PadString (padLength,padChar)
+{
+	padString = "";
+	d=padString*padLength;
+	for (padCounter=0;padCounter<padLength;padCounter=padCounter+1)
+	{
+		d=padString*padChar;
+	}
+	d=padString*0;
+	fprintf (stdout,padString);
+	return padString;
+}
+
+/*___________________________________________________________________________________________________________*/
+
+function	PrintASCIITable (dataMatrix, titleMatrix)
+{
+	columnWidths = {1,Columns(titleMatrix)};
+	for (counter1=0; counter1<Columns(titleMatrix); counter1 = counter1+1)
+	{
+		counter2 = Abs (titleMatrix[0][counter1])+2;
+		if (counter2<12)
+		{
+			counter2 = 12;
+		}
+		columnWidths[0][counter1] = counter2;
+	}
+	fprintf (stdout, "\n");
+	for (counter2 = 0; counter2 < Columns (titleMatrix); counter2 = counter2+1)
+	{
+		fprintf (stdout,"+-");
+		dummy = PadString (columnWidths[0][counter2],"-");
+		fprintf (stdout,"-");
+	}
+	fprintf (stdout,"+\n| ");
+	
+	for (counter1=0; counter1<Columns(titleMatrix); counter1 = counter1+1)
+	{
+		fprintf (stdout, titleMatrix[counter1]);
+		dummy = PadString (columnWidths[0][counter1]-Abs(titleMatrix[counter1])," ");
+		fprintf (stdout, " | ");
+	}
+	
+	fprintf (stdout, "\n");
+	
+	for (counter1=-1; counter1<Rows(dataMatrix); counter1 = counter1 + 1)
+	{
+		if (counter1>=0)
+		{
+			fprintf (stdout,"| ");
+			fprintf (stdout,Format(counter1+1,columnWidths[0][0],0));
+			for (counter2 = 1; counter2 < Columns (titleMatrix); counter2 = counter2+1)
+			{
+				fprintf (stdout," | ");
+				fprintf (stdout,Format(dataMatrix[counter1][counter2-1],columnWidths[0][counter2],-1));
+			}
+			fprintf (stdout," ");
+			fprintf (stdout, "|\n");
+		}
+		for (counter2 = 0; counter2 < Columns (titleMatrix); counter2 = counter2+1)
+		{
+			fprintf (stdout,"+-");
+			dummy = PadString (columnWidths[0][counter2],"-");
+			fprintf (stdout,"-");
+		}
+		fprintf (stdout, "+\n");
+	}
+	
+	return 1;
+}
+
+/*___________________________________________________________________________________________________________*/
+
+nucCharacters="ACGT";
+function codonString (ccode)
+{
+	return nucCharacters[ccode$16]+nucCharacters[(ccode%16)$4]+nucCharacters[ccode%4];
+}
+
+/*___________________________________________________________________________________________________________*/
+
+function	PrintTableToFile (dataMatrix, titleMatrix, promptOrNot)
+{
+	SetDialogPrompt ("Export tab separated data to:");
+	
+	if (promptOrNot)
+	{
+		fprintf (PROMPT_FOR_FILE, CLEAR_FILE);
+	}
+	
+	bufferString = "";
+	bufferString * 8192;
+	bufferString * titleMatrix[0][0];
+
+	for (counter1=1; counter1<Columns(titleMatrix); counter1 = counter1+1)
+	{
+		bufferString * ("\t"+titleMatrix[0][counter1]);
+	}
+	
+	for (counter1=0; counter1<Rows(dataMatrix); counter1 = counter1 + 1)
+	{
+		bufferString * ("\n"+dataMatrix[counter1][0]);
+		for (counter2 = 1; counter2 < Columns (dataMatrix); counter2 = counter2+1)
+		{
+		    bufferString * ("\t"+dataMatrix[counter1][counter2]);
+		}
+	}
+	
+	bufferString * 0;
+	fprintf (LAST_FILE_PATH,bufferString);
+	bufferString = 0;
+	
+	return 1;
+}
+
+/*----------------------------------------------------------------------------*/
+
+ChoiceList (ambChoice, "Treatment of Ambiguities",1,SKIP_NONE,
+			"Averaged","All possible resolutions are considered and averaged.",
+			"Resolved","The most frequent (for that site) resolution is chosen.");
+
+if (ambChoice<0)
+{
+	return;
+}
+
+if (useCustomCountingBias)
+{
+	ExecuteAFile("Distances/CodonToolsMain.def");
+}
+else
+{
+	ExecuteAFile("Distances/CodonTools.def");
+}
+
+observedCEFV 		  = {64,1};
+for (fileID = 1; fileID <= fileCount; fileID = fileID + 1)
+{
+	ExecuteCommands 	  		("HarvestFrequencies (tp, filteredData_"+fileID+",3,3,0);cfs = filteredData_"+fileID+".sites;");
+	observedCEFV 				= observedCEFV 		 + tp*(cfs/totalCodonCount);
+}
+
+
+seqToBranchMap 				  			= {stateCharCount,1};
+hShift = 0;
+for (k=0; k<64; k=k+1)
+{
+	if (_Genetic_Code[k]==10)
+	{
+		hShift = hShift+1;
+	}
+	else
+	{
+		seqToBranchMap[k-hShift] = observedCEFV[k];
+	}
+}
+observedCEFV = seqToBranchMap;
+
+vOffset 	 = 0;
+resultMatrix = {totalCodonCount,12};
+
+treeLengthArray = {};
+
+for (fileID = 1; fileID <= fileCount; fileID = fileID + 1)
+{
+	ExecuteCommands ("LikelihoodFunction tempLF = (filteredData_"+fileID+",codonTree_"+fileID+");");
+	DataSet 		dsA		 				= ReconstructAncestors (tempLF);
+	ExecuteCommands ("DataSet		   	dsJoint 				= Combine(dsA,ds_"+fileID+");");
+	ExecuteCommands ("DataSetFilter		filteredData 			= CreateFilter (ds_"+fileID+",3,\"\",\"\",GeneticCodeExclusions);");
+	
+	DataSetFilter 	filteredDataA = CreateFilter (dsA,3,"","",GeneticCodeExclusions);
+	DataSetFilter  filteredDataJ  = CreateFilter (dsJoint,3,"","",GeneticCodeExclusions);
+
+	ExecuteCommands ("branchNames = BranchName (codonTree_"+fileID+",-1);");
+	h 			= Columns (branchNames);
+
+	seqToBranchMap 	= {h, 2};
+	/* maps sequence names to branch order in column 1 
+	   and the other way around in column 2 */
+
+	for (k=0; k<filteredData.species; k=k+1)
+	{
+		GetString (seqName, filteredData, k);
+		seqToBranchMap[k][0] = -1;
+		for (v=0; v<h; v=v+1)
+		{
+			if (branchNames[v] % seqName)
+			{
+				seqToBranchMap[k][0] = v;
+				seqToBranchMap[v][1] = k;
+				break;
+			}
+		}
+	}
+
+	seqToBranchMap[filteredData.species][0] = h-1;
+	seqToBranchMap[h-1][1] = filteredData.species;
+
+	for (k=1; k<filteredDataA.species; k=k+1)
+	{
+		GetString (seqName, filteredDataA, k);
+		seqToBranchMap[filteredData.species+k][0] = -1;
+		for (v=0; v<h; v=v+1)
+		{
+			if (branchNames[v] % seqName)
+			{
+				seqToBranchMap[k+filteredData.species][0] = v;
+				seqToBranchMap[v][1] = k+filteredData.species;
+				break;
+			}
+		}
+	}
+
+
+	/* total tree length */
+
+	totalTreeLength = 0;
+	
+	ExecuteCommands ("branchLengths   = BranchLength(nucTree_"+fileID+",-1);");
+	for (v=Columns(branchLengths)-1; v>=0; v=v-1)
+	{
+		totalTreeLength = totalTreeLength + branchLengths[v];
+	}
+	
+	treeLengthArray [fileID] = totalTreeLength;
+
+	/* get codon matrix */
+
+	codonInfo  = {filteredData.species, filteredData.unique_sites};
+	codonInfo2 = {filteredDataA.species, filteredDataA.unique_sites};
+
+	GetDataInfo    (dupInfo, filteredData);
+	GetDataInfo	   (dupInfoA, filteredDataA);
+
+	matrixTrick  = {1,stateCharCount};
+	matrixTrick2 = {1,stateCharCount};
+	matrixTrick  = matrixTrick["_MATRIX_ELEMENT_COLUMN_"];
+	matrixTrick2 = matrixTrick2["1"];
+
+	for (v=0; v<filteredData.unique_sites;v=v+1)
+	{
+		for (h=0; h<filteredData.species;h=h+1)
+		{
+			GetDataInfo (siteInfo, filteredData, h, v);
+			_SITE_ES_COUNT = matrixTrick2 * siteInfo; 
+			if (_SITE_ES_COUNT[0] == 1)
+			{
+				siteInfo = matrixTrick * siteInfo;
+				codonInfo[h][v] = siteInfo[0];
+			}
+			else
+			{
+				codonInfo[h][v] = -1;
+			}
+		}
+	}
+
+	for (v=0; v<filteredDataA.unique_sites;v=v+1)
+	{
+		for (h=0; h<filteredDataA.species;h=h+1)
+		{
+			GetDataInfo (siteInfo, filteredDataA, h, v);
+			if ((matrixTrick2*siteInfo)[0] > 1)
+			{
+				codonInfo2[h][v] = -1;
+			}
+			else
+			{
+				codonInfo2[h][v] = (matrixTrick * siteInfo)[0];
+			}
+		}
+	}
+	_SITE_RESULTS = {4,filteredData.sites};
+	ExecuteCommands ("flatTreeRep	  = Abs (nucTree_"+fileID+");");
+
+	perBranchMatrix = {Columns(branchNames),2};
+
+	for (v=0; v<filteredData.sites;v=v+1)
+	{
+		_SITE_ES_COUNT = {stateCharCount,stateCharCount};
+		_SITE_EN_COUNT = {stateCharCount,stateCharCount};
+		_SITE_OS_COUNT = {stateCharCount,stateCharCount};
+		_SITE_ON_COUNT = {stateCharCount,stateCharCount};
+		
+		/* do internal nodes first */
+		
+		k = filteredData.species+1;
+		
+		/* first sequence is always the root */
+		c1 = dupInfoA[v];
+		if (codonInfo2[1][c1] >= stateCharCount)
+		{
+			continue;
+		}
+		for (h=1; h<filteredDataA.species; h=h+1)
+		{
+			p1 = seqToBranchMap[k][0];
+			p2 = flatTreeRep[p1];
+			p2 = seqToBranchMap[p2][1]-filteredData.species;
+			
+			branchFactor = branchLengths[p1]/totalTreeLength;
+			
+			cd1 = codonInfo2[h] [c1];
+			cd2 = codonInfo2[p2][c1];
+			
+			if (cd1 >= 0 && cd2 >= 0)
+			{
+				_SITE_OS_COUNT[cd1][cd2] = _SITE_OS_COUNT[cd1][cd2] + 1;		
+				_SITE_ON_COUNT[cd1][cd2] = _SITE_ON_COUNT[cd1][cd2] + 1;		
+				_SITE_ES_COUNT[cd1][cd2] = _SITE_ES_COUNT[cd1][cd2] + branchFactor;		
+				_SITE_EN_COUNT[cd1][cd2] = _SITE_EN_COUNT[cd1][cd2] + branchFactor;		
+				
+				if (_PAIRWISE_S_[cd1][cd2])
+				{
+					perBranchMatrix[p1][0] = perBranchMatrix[p1][0]+_OBSERVED_S_[cd1][cd2]/_PAIRWISE_S_[cd1][cd2];
+				}
+				perBranchMatrix[p1][1] = perBranchMatrix[p1][1]+_OBSERVED_NS_[cd1][cd2]/_PAIRWISE_NS_[cd1][cd2];
+			}
+			
+			k=k+1;
+		}
+		
+		/* now do the leaves */
+		
+		observedCEFV = {{0}};
+		
+		c2 = dupInfo[v];
+		for (h=0; h<filteredData.species; h=h+1)
+		{
+			p1 = seqToBranchMap[h][0];
+			p2 = flatTreeRep[p1];
+			p2 = seqToBranchMap[p2][1]-filteredData.species;
+			
+			cd2 = codonInfo2[p2][c1];
+			cd1 = codonInfo[h] [c2];
+			
+			branchFactor = branchLengths[p1]/totalTreeLength;
+
+			if (cd1>=0)
+			/* no ambiguities */
+			{
+				/*p2 = flatTreeRep[p1];
+				fprintf (stdout, "Change from ", codonString (cd1), " to ", codonString (cd2), " along ", branchNames[p1], " and ", branchNames[p2], "(",branchFactor,")\n");
+				*/
+				_SITE_OS_COUNT[cd1][cd2] = _SITE_OS_COUNT[cd1][cd2] + 1;		
+				_SITE_ON_COUNT[cd1][cd2] = _SITE_ON_COUNT[cd1][cd2] + 1;		
+				_SITE_ES_COUNT[cd1][cd2] = _SITE_ES_COUNT[cd1][cd2] + branchFactor;		
+				_SITE_EN_COUNT[cd1][cd2] = _SITE_EN_COUNT[cd1][cd2] + branchFactor;		
+
+				if (_PAIRWISE_S_[cd1][cd2])
+				{
+					perBranchMatrix[p1][0] = perBranchMatrix[p1][0]+_OBSERVED_S_[cd1][cd2]/_PAIRWISE_S_[cd1][cd2];
+				}
+				perBranchMatrix[p1][1] = perBranchMatrix[p1][1]+_OBSERVED_NS_[cd1][cd2]/_PAIRWISE_NS_[cd1][cd2];
+			}	
+			else
+			/* ambiguities here */
+			{
+				GetDataInfo    (ambInfo, filteredData, h, c2);	
+				if (Rows(observedCEFV) == 1)
+				{
+					siteFilter = ""+(v*3)+"-"+(v*3+2);
+					DataSetFilter filteredDataSite = CreateFilter (dsJoint,3,siteFilter,"",GeneticCodeExclusions);
+					HarvestFrequencies			  (observedCEFV,filteredDataSite,3,3,0);
+					tempMx = {stateCharCount,1};
+
+					hShift = 0;
+
+					for (k=0; k<64; k=k+1)
+					{
+						if (_Genetic_Code[k]==10)
+						{
+							hShift = hShift+1;
+						}
+						else
+						{
+							tempMx[k-hShift] = observedCEFV[k];
+						}
+					}	
+					observedCEFV = tempMx;		
+				}
+				
+				weightFactor = matrixTrick2*ambInfo;
+				if (weightFactor[0]<stateCharCount)
+				{
+					ambInfo  	 = ambInfo$observedCEFV;
+					
+					if (ambChoice)
+					{
+						weightFactor = 0;
+						tempMx = -1;
+						for (k=0; k<stateCharCount; k=k+1)
+						{
+							if (ambInfo[k]>weightFactor)
+							{
+								weightFactor = ambInfo[k];
+								tempMx = k;
+							}
+						}
+						if (tempMx>=0)
+						{
+							_SITE_OS_COUNT[tempMx][cd2] = _SITE_OS_COUNT[tempMx][cd2] + 1;		
+							_SITE_ON_COUNT[tempMx][cd2] = _SITE_ON_COUNT[tempMx][cd2] + 1 ;		
+							_SITE_ES_COUNT[tempMx][cd2] = _SITE_ES_COUNT[tempMx][cd2] + branchFactor;		
+							_SITE_EN_COUNT[tempMx][cd2] = _SITE_EN_COUNT[tempMx][cd2] + branchFactor;		
+							if (_PAIRWISE_S_[tempMx][cd2])
+							{
+								perBranchMatrix[p1][0] = perBranchMatrix[p1][0]+_OBSERVED_S_[tempMx][cd2]/_PAIRWISE_S_[tempMx][cd2];
+							}
+							perBranchMatrix[p1][1] = perBranchMatrix[p1][1]+_OBSERVED_NS_[tempMx][cd2]/_PAIRWISE_NS_[tempMx][cd2];
+						}
+					}
+					else
+					{
+						weightFactor = matrixTrick2*ambInfo;
+						weightFactor = weightFactor[0];
+						if (weightFactor)
+						{
+							ambInfo		 = ambInfo * (1/weightFactor);
+							for (k=0; k<stateCharCount; k=k+1)
+							{
+								weightFactor = ambInfo[k];
+								if (weightFactor>0)
+								{
+									_SITE_OS_COUNT[k][cd2] = _SITE_OS_COUNT[k][cd2] + weightFactor;		
+									_SITE_ON_COUNT[k][cd2] = _SITE_ON_COUNT[k][cd2] + weightFactor;		
+									_SITE_ES_COUNT[k][cd2] = _SITE_ES_COUNT[k][cd2] + weightFactor*branchFactor;		
+									_SITE_EN_COUNT[k][cd2] = _SITE_EN_COUNT[k][cd2] + weightFactor*branchFactor;
+											
+									if (_PAIRWISE_S_[k][cd2])
+									{
+										perBranchMatrix[p1][0] = perBranchMatrix[p1][0]+weightFactor*_OBSERVED_S_[k][cd2]/_PAIRWISE_S_[k][cd2];
+									}
+									perBranchMatrix[p1][1] = perBranchMatrix[p1][1]+weightFactor*_OBSERVED_NS_[k][cd2]/_PAIRWISE_NS_[k][cd2];
+								}
+							}
+						}
+					}
+				}
+			}
+		}
+		
+		_SITE_OS_COUNT = matrixTrick2*(_OBSERVED_S_$_SITE_OS_COUNT)*Transpose(matrixTrick2);
+		_SITE_ON_COUNT = matrixTrick2*(_OBSERVED_NS_$_SITE_ON_COUNT)*Transpose(matrixTrick2);
+		_SITE_ES_COUNT = matrixTrick2*(_PAIRWISE_S_$_SITE_ES_COUNT)*Transpose(matrixTrick2);
+		_SITE_EN_COUNT = matrixTrick2*(_PAIRWISE_NS_$_SITE_EN_COUNT)*Transpose(matrixTrick2);
+		
+		shiftedV = v+vOffset;
+		
+		resultMatrix[shiftedV][0] = _SITE_OS_COUNT[0];
+		resultMatrix[shiftedV][1] = _SITE_ON_COUNT[0];
+		resultMatrix[shiftedV][2] = _SITE_ES_COUNT[0];
+		resultMatrix[shiftedV][3] = _SITE_EN_COUNT[0];
+		
+		weight = _SITE_EN_COUNT[0]+_SITE_ES_COUNT[0];
+		
+		p = _SITE_ES_COUNT[0]/weight;
+		
+		resultMatrix[shiftedV][5] = p;
+		
+		p2 = resultMatrix[shiftedV][0]+resultMatrix[shiftedV][1];
+		
+		resultMatrix[shiftedV][7] = resultMatrix[shiftedV][1]/resultMatrix[shiftedV][3];
+		
+		if (resultMatrix[shiftedV][2])
+		{
+			resultMatrix[shiftedV][6]  = resultMatrix[shiftedV][0]/resultMatrix[shiftedV][2];
+			resultMatrix[shiftedV][8]  = resultMatrix[shiftedV][7]-resultMatrix[shiftedV][6];	
+			resultMatrix[shiftedV][11] = resultMatrix[shiftedV][8]/totalTreeLength;	
+		}
+		
+		if (p2)
+		{
+			resultMatrix[shiftedV][4]  = resultMatrix[shiftedV][0]/p2;		
+			if (distribChoice)
+			{
+				p3 = p2$1;
+				p4 = ((resultMatrix[shiftedV][0]*6)+0.5)$1;
+				
+				waP          = 0;
+				waN			 = 0;
+
+				if (p3 != p2)
+				{
+					/* use averaging */
+					fprintf (stdout, "Interpolating at site ", v, ": ", p3, " ", p3+1, " ", p2, "\n");
+					
+					w1 = p2-p3;
+					w2 = 1-w1;
+					
+					for (kk2 = 0; kk2 < stateCharCount; kk2 = kk2+1)
+					{			
+						ambInfo = SUPPORT_MATRIX_LIST[kk2][v];
+						if (ambInfo>0.000001)
+						{
+							subMatrixAVL = simulatedNullAVL[kk2];
+							subMatrixAVL1 = subMatrixAVL[p3];
+							subMatrixAVL2 = subMatrixAVL[p3+1];
+							if (Abs(subMatrixAVL1) && Abs(subMatrixAVL2))
+							{
+								pv1 = subMatrixAVL1[p4+1][1];
+								pv2 = subMatrixAVL2[p4+1][1];
+								if (subMatrixAVL1[0][0] >= 100 && subMatrixAVL2[0][0] >= 100)
+								{
+									waP = waP + (pv1*w1+pv2*w2)*ambInfo;
+									if (p4 == 0)
+									{
+										waN = waN + ambInfo;
+									}
+									else
+									{
+										waN = waN + (1 + w1*(pv1 - 2*subMatrixAVL1[p4][1]) + w2*(pv2 - 2*subMatrixAVL2[p4][1])) * ambInfo;
+									}
+								}
+								else
+								{
+									fprintf (stdout, "Bailing at site ", v, " codon ", kk2, " sim count ", subMatrixAVL[0][0], "\n");
+									break;
+								}
+							}
+							else
+							{
+								fprintf (stdout, "Bailing at site ", v, " codon ", kk2 , " sim count 0 \n");
+								break;					
+							}
+						}
+					}				
+				}
+				else
+				{
+					for (kk2 = 0; kk2 < stateCharCount; kk2 = kk2+1)
+					{			
+						ambInfo = SUPPORT_MATRIX_LIST[kk2][v];
+						if (ambInfo>0.000001)
+						{
+							subMatrixAVL = simulatedNullAVL[kk2];
+							subMatrixAVL = subMatrixAVL[p3];
+							if (Abs(subMatrixAVL))
+							{
+								if (subMatrixAVL[0][0] >= 100)
+								{
+									waP = waP + subMatrixAVL[p4+1][1]*ambInfo;
+									if (p4 == 0)
+									{
+										waN = waN + ambInfo;
+									}
+									else
+									{
+										waN = waN + (1 + subMatrixAVL[p4+1][1] - 2*subMatrixAVL[p4][1]) * ambInfo;
+									}
+								}
+								else
+								{
+									fprintf (stdout, "Bailing at site ", v, " codon ", kk2, " sim count ", subMatrixAVL[0][0], "\n");
+									break;
+								}
+							}
+							else
+							{
+								fprintf (stdout, "Bailing at site ", v, " codon ", kk2 , " sim count 0 \n");
+								break;					
+							}
+						}
+					}						
+				}
+
+
+
+				if (kk2 == stateCharCount)
+				{
+					resultMatrix[shiftedV][9]  = waP;
+					resultMatrix[shiftedV][10] = waN;
+					continue;
+				}
+			}
+			resultMatrix[shiftedV][9]  = extendedBinTail (p2,p,resultMatrix[shiftedV][0]);
+			if (resultMatrix[shiftedV][0]>=1)
+			{
+				resultMatrix[shiftedV][10] = 1-extendedBinTail(p2,p,resultMatrix[shiftedV][0]-1);
+			}
+			else
+			{
+				resultMatrix[shiftedV][10] = 1-extendedBinTail (p2,p,0);
+			}
+		}		
+	}
+	vOffset = vOffset + filteredData.sites;
+}
+
+perBranchMatrix = perBranchMatrix * (1/totalCodonCount);
+labelMatrix =     {1,12};
+labelMatrix[0] = "Observed S Changes";
+labelMatrix[1] = "Observed NS Changes";
+labelMatrix[2] = "E[S Sites]";
+labelMatrix[3] = "E[NS Sites]";
+labelMatrix[4] = "Observed S. Prop.";
+labelMatrix[5] = "P{S}";
+labelMatrix[6] = "dS";
+labelMatrix[7] = "dN";
+labelMatrix[8] = "dN-dS";
+labelMatrix[9]  = "P{S leq. observed}";
+labelMatrix[10] = "P{S geq. observed}";
+labelMatrix[11] = "Scaled dN-dS";
+
+sigLevel = -1;
+
+for (fileID = 1; fileID <= fileCount; fileID = fileID + 1)
+{
+	fprintf (stdout, "\nTotal length (subs/nuc/unit time) for tree ", fileID, ": ", Format (treeLengthArray[fileID],10,5));
+}
+
+fprintf (stdout, "\n");
+
+while ((sigLevel<=0)||(sigLevel>=1))
+{
+	fprintf (stdout, "\nSignificance level for a site to be classified as positively/negatively selected?");
+	fscanf  (stdin, "Number", sigLevel);
+}
+
+posSelected = 0;
+negSelected = 0;
+
+p = Rows(resultMatrix);
+
+for (p2=0; p2<p; p2=p2+1)
+{
+	v = resultMatrix [p2][8];
+	if (v>0)
+	{
+		if (resultMatrix [p2][9] < sigLevel)
+		{
+			posSelected = posSelected+1;
+		}
+	}
+	else
+	{
+		if (v<0)
+		{
+			if (resultMatrix [p2][10] < sigLevel)
+			{
+				negSelected = negSelected+1;
+			}
+		}
+	}
+}
+
+selLabelMatrix = {{"Index","Site Index","dN-dS","p-value"}};
+
+if (posSelected)
+{
+	psMatrix = {posSelected, 3};
+	h = 0;
+	for (p2=0; p2<p; p2=p2+1)
+	{
+		v = resultMatrix [p2][8];
+		if (v>0)
+		{
+			if (resultMatrix [p2][9] < sigLevel)
+			{
+				psMatrix[h][0] = p2+1;
+				psMatrix[h][1] = v;
+				psMatrix[h][2] = resultMatrix [p2][9];
+				h = h+1;
+			}
+		}
+	}
+	
+	fprintf (stdout,"\n******* FOUND ", posSelected, " POSITIVELY SELECTED SITES ********\n\n");
+	dummy = PrintASCIITable  (psMatrix, selLabelMatrix);
+}
+else
+{
+	fprintf (stdout,"\n******* FOUND NO POSITIVELY SELECTED SITES ********\n\n");
+}
+
+if (negSelected)
+{
+	psMatrix = {negSelected, 3};
+	h = 0;
+	for (p2=0; p2<p; p2=p2+1)
+	{
+		v = resultMatrix [p2][8];
+		if (v<0)
+		{
+			if (resultMatrix [p2][10] < sigLevel)
+			{
+				psMatrix[h][0] = p2+1;
+				psMatrix[h][1] = v;
+				psMatrix[h][2] = resultMatrix [p2][10];
+				h = h+1;
+			}
+		}
+	}
+	
+	fprintf (stdout,"\n******* FOUND ", negSelected, " NEGATIVELY SELECTED SITES ********\n\n");
+	dummy = PrintASCIITable  (psMatrix, selLabelMatrix);
+}
+else
+{
+	fprintf (stdout,"\n******* FOUND NO NEGATIVELY SELECTED SITES ********\n\n");
+}
+
+ChoiceList (outputChoice, "Output Options",1,SKIP_NONE,
+			"ASCII Table",	 "Output is printed to the console as an ASCII table.",
+			"Export to File","Output is spooled to a tab separated file.",
+			"Chart","A HYPHY chart window is displayed (Mac/Doze Only).");
+if (outputChoice<0)
+{
+	return;
+}
+
+if (outputChoice==0)
+{
+	dummy = PrintASCIITable  (resultMatrix, labelMatrix);
+}
+else
+{
+	if (outputChoice == 1)
+	{
+		SetDialogPrompt ("Save result table to");
+		dummy = PrintTableToFile  (resultMatrix, labelMatrix, !pipeThroughFlag);
+	}
+	else
+	{
+		OpenWindow (CHARTWINDOW,{{"Rates by sites"}
+								   {"labelMatrix"},
+								   {"resultMatrix"},
+								   {"Contrast Bars"},
+								   {"Index"},
+								   {labelMatrix[6]+";"+labelMatrix[7]},
+								   {"Site Index"},
+								   {"dN"},
+								   {"dS"},
+								   {"0"}},
+								   "SCREEN_WIDTH-60;SCREEN_HEIGHT-50;30;50");
+	}
+}
diff --git a/res/TemplateBatchFiles/SGIvL.bf b/res/TemplateBatchFiles/SGIvL.bf
new file mode 100644
index 0000000..d38f7bb
--- /dev/null
+++ b/res/TemplateBatchFiles/SGIvL.bf
@@ -0,0 +1,758 @@
+#include "binomial.ibf";
+
+/*___________________________________________________________________________________________________________*/
+
+function PadString (padLength,padChar)
+{
+	padString = "";
+	d=padString*padLength;
+	for (padCounter=0;padCounter<padLength;padCounter=padCounter+1)
+	{
+		d=padString*padChar;
+	}
+	d=padString*0;
+	fprintf (stdout,padString);
+	return padString;
+}
+
+/*___________________________________________________________________________________________________________*/
+
+function	PrintASCIITable (dataMatrix, titleMatrix)
+{
+	columnWidths = {1,Columns(titleMatrix)};
+	for (counter1=0; counter1<Columns(titleMatrix); counter1 = counter1+1)
+	{
+		counter2 = Abs (titleMatrix[0][counter1])+2;
+		if (counter2<12)
+		{
+			counter2 = 12;
+		}
+		columnWidths[0][counter1] = counter2;
+	}
+	fprintf (stdout, "\n");
+	for (counter2 = 0; counter2 < Columns (titleMatrix); counter2 = counter2+1)
+	{
+		fprintf (stdout,"+-");
+		dummy = PadString (columnWidths[0][counter2],"-");
+		fprintf (stdout,"-");
+	}
+	fprintf (stdout,"+\n| ");
+	
+	for (counter1=0; counter1<Columns(titleMatrix); counter1 = counter1+1)
+	{
+		fprintf (stdout, titleMatrix[counter1]);
+		dummy = PadString (columnWidths[0][counter1]-Abs(titleMatrix[counter1])," ");
+		fprintf (stdout, " | ");
+	}
+	
+	fprintf (stdout, "\n");
+	
+	for (counter1=-1; counter1<Rows(dataMatrix); counter1 = counter1 + 1)
+	{
+		if (counter1>=0)
+		{
+			fprintf (stdout,"| ");
+			fprintf (stdout,Format(counter1+1,columnWidths[0][0],0));
+			for (counter2 = 1; counter2 < Columns (titleMatrix); counter2 = counter2+1)
+			{
+				fprintf (stdout," | ");
+				fprintf (stdout,Format(dataMatrix[counter1][counter2-1],columnWidths[0][counter2],-1));
+			}
+			fprintf (stdout," ");
+			fprintf (stdout, "|\n");
+		}
+		for (counter2 = 0; counter2 < Columns (titleMatrix); counter2 = counter2+1)
+		{
+			fprintf (stdout,"+-");
+			dummy = PadString (columnWidths[0][counter2],"-");
+			fprintf (stdout,"-");
+		}
+		fprintf (stdout, "+\n");
+	}
+	
+	return 1;
+}
+
+/*___________________________________________________________________________________________________________*/
+
+nucCharacters="ACGT";
+function codonString (ccode)
+{
+	return nucCharacters[ccode$16]+nucCharacters[(ccode%16)$4]+nucCharacters[ccode%4];
+}
+
+/*___________________________________________________________________________________________________________*/
+
+function	PrintTableToFile (dataMatrix, titleMatrix, promptOrNot)
+{
+	SetDialogPrompt ("Export tab separated data to:");
+	
+	if (promptOrNot)
+	{
+		fprintf (PROMPT_FOR_FILE, CLEAR_FILE);
+	}
+	
+	fprintf (LAST_FILE_PATH, titleMatrix[0][0]);
+
+	for (counter1=1; counter1<Columns(titleMatrix); counter1 = counter1+1)
+	{
+		fprintf (LAST_FILE_PATH, "\t", titleMatrix[0][counter1]);
+	}
+	
+	for (counter1=0; counter1<Rows(dataMatrix); counter1 = counter1 + 1)
+	{
+		fprintf (LAST_FILE_PATH,"\n",dataMatrix[counter1][0]);
+		for (counter2 = 1; counter2 < Columns (dataMatrix); counter2 = counter2+1)
+		{
+			fprintf (LAST_FILE_PATH,"\t",dataMatrix[counter1][counter2]);
+		}
+	}
+	
+	return 1;
+}
+
+/*----------------------------------------------------------------------------*/
+
+if (pipeThroughFlag == 0)
+{
+	ChoiceList (ambChoice, "Treatment of Ambiguities",1,SKIP_NONE,
+				"Averaged","All possible resolutions are considered and averaged.",
+				"Resolved","The most frequent (for that site) resolution is chosen.");
+
+	if (ambChoice<0)
+	{
+		return;
+	}
+
+	if (useCustomCountingBias)
+	{
+		incFileName = "Distances/CodonToolsMain.def";
+	}
+	else
+	{
+		incFileName = "Distances/CodonTools.def";
+	}
+
+	ExecuteCommands  ("#include \""+incFileName+"\";");
+}
+
+
+
+DataSet dsA					= ReconstructAncestors (lf);
+DataSetFilter filteredDataA = CreateFilter (dsA,3,"","",GeneticCodeExclusions);
+
+HarvestFrequencies			  (observedCEFV,filteredData,3,3,0);
+seqToBranchMap = {stateCharCount,1};
+
+DataSet		   dsJoint = Combine(dsA,ds);
+DataSetFilter filteredDataJ = CreateFilter (dsJoint,3,"","",GeneticCodeExclusions);
+
+hShift = 0;
+
+for (k=0; k<64; k=k+1)
+{
+	if (_Genetic_Code[k]==10)
+	{
+		hShift = hShift+1;
+	}
+	else
+	{
+		seqToBranchMap[k-hShift] = observedCEFV[k];
+	}
+}
+
+observedCEFV = seqToBranchMap;
+
+
+branchNames = BranchName (givenTree,-1);
+h = Columns (branchNames);
+
+seqToBranchMap 	= {h, 2};
+/* maps sequence names to branch order in column 1 
+   and the other way around in column 2 */
+
+for (k=0; k<filteredData.species; k=k+1)
+{
+	GetString (seqName, filteredData, k);
+	seqToBranchMap[k][0] = -1;
+	for (v=0; v<h; v=v+1)
+	{
+		if (branchNames[v] % seqName)
+		{
+			seqToBranchMap[k][0] = v;
+			seqToBranchMap[v][1] = k;
+			break;
+		}
+	}
+}
+
+seqToBranchMap[filteredData.species][0] = h-1;
+seqToBranchMap[h-1][1] = filteredData.species;
+
+internalBranchNames = {};
+
+for (k=1; k<filteredDataA.species; k=k+1)
+{
+	GetString (seqName, filteredDataA, k);
+	internalBranchNames[seqName] = 1;
+	seqToBranchMap[filteredData.species+k][0] = -1;
+	for (v=0; v<h; v=v+1)
+	{
+		if (branchNames[v] % seqName)
+		{
+			seqToBranchMap[k+filteredData.species][0] = v;
+			seqToBranchMap[v][1] = k+filteredData.species;
+			break;
+		}
+	}
+}
+
+/* total tree length */
+
+totalTreeLength = 0;
+branchLengths   = BranchLength(givenTree,-1);
+terminalBL 	    = 0;
+internalBL		= 0;
+
+for (v=Columns(branchLengths)-1; v>=0; v=v-1)
+{
+	totalTreeLength = totalTreeLength + branchLengths[v];
+	bName = branchNames[v];
+	if (internalBranchNames[bName])
+	{
+		internalBL = internalBL + branchLengths[v];
+	}
+}
+
+terminalBL = totalTreeLength - internalBL;
+
+/* get codon matrix */
+
+codonInfo  = {filteredData.species, filteredData.unique_sites};
+codonInfo2 = {filteredDataA.species, filteredDataA.unique_sites};
+
+GetDataInfo    (dupInfo, filteredData);
+GetDataInfo	   (dupInfoA, filteredDataA);
+
+matrixTrick  = {1,stateCharCount};
+matrixTrick2 = {1,stateCharCount};
+
+for (h=Columns(matrixTrick)-1; h>=0; h=h-1)
+{
+	matrixTrick  [h] = h;
+	matrixTrick2 [h] = 1;
+}
+
+for (v=0; v<filteredData.unique_sites;v=v+1)
+{
+	for (h=0; h<filteredData.species;h=h+1)
+	{
+		GetDataInfo (siteInfo, filteredData, h, v);
+		_SITE_ES_COUNT = matrixTrick2 * siteInfo; 
+		if (_SITE_ES_COUNT[0] == 1)
+		{
+			siteInfo = matrixTrick * siteInfo;
+			codonInfo[h][v] = siteInfo[0];
+		}
+		else
+		{
+			codonInfo[h][v] = -1;
+		}
+	}
+}
+
+for (v=0; v<filteredDataA.unique_sites;v=v+1)
+{
+	for (h=0; h<filteredDataA.species;h=h+1)
+	{
+		GetDataInfo (siteInfo, filteredDataA, h, v);
+		siteInfo = matrixTrick * siteInfo;
+		codonInfo2[h][v] = siteInfo[0];
+	}
+}
+
+_SITE_RESULTS = {4,filteredData.sites};
+flatTreeRep	  = Abs (givenTree);
+
+resultMatrix  = {filteredData.sites,12};
+resultMatrixInternal = {filteredData.sites,12};
+
+for (v=0; v<filteredData.sites;v=v+1)
+{
+	_SITE_ES_COUNT = {stateCharCount,stateCharCount};
+	_SITE_EN_COUNT = {stateCharCount,stateCharCount};
+	_SITE_OS_COUNT = {stateCharCount,stateCharCount};
+	_SITE_ON_COUNT = {stateCharCount,stateCharCount};
+	
+	_SITE_ES_COUNTInternals = {stateCharCount,stateCharCount};
+	_SITE_EN_COUNTInternals = {stateCharCount,stateCharCount};
+	_SITE_OS_COUNTInternals = {stateCharCount,stateCharCount};
+	_SITE_ON_COUNTInternals = {stateCharCount,stateCharCount};
+
+	/* do internal nodes first */
+	
+	k = filteredData.species+1;
+	
+	/* first sequence is always the root */
+	c1 = dupInfoA[v];
+	if (codonInfo2[1][c1] >= stateCharCount)
+	{
+		continue;
+	}
+	for (h=1; h<filteredDataA.species; h=h+1)
+	{
+		p1 = seqToBranchMap[k][0];
+		p2 = flatTreeRep[p1];
+		p2 = seqToBranchMap[p2][1]-filteredData.species;
+		
+		branchFactor = branchLengths[p1]/internalBL;
+		
+		cd1 = codonInfo2[h] [c1];
+		cd2 = codonInfo2[p2][c1];
+		
+		if (cd1 >= 0 && cd2 >= 0)
+		{
+            _SITE_OS_COUNTInternals[cd1][cd2] = _SITE_OS_COUNTInternals[cd1][cd2] + 1;		
+            _SITE_ON_COUNTInternals[cd1][cd2] = _SITE_ON_COUNTInternals[cd1][cd2] + 1;		
+            _SITE_ES_COUNTInternals[cd1][cd2] = _SITE_ES_COUNTInternals[cd1][cd2] + branchFactor;		
+            _SITE_EN_COUNTInternals[cd1][cd2] = _SITE_EN_COUNTInternals[cd1][cd2] + branchFactor;		
+		}
+        		
+		k=k+1;
+	}
+	
+	/* now do the leaves */
+	
+	observedCEFV = {{0}};
+	
+	c2 = dupInfo[v];
+	for (h=0; h<filteredData.species; h=h+1)
+	{
+		p1 = seqToBranchMap[h][0];
+		p2 = flatTreeRep[p1];
+		p2 = seqToBranchMap[p2][1]-filteredData.species;
+		
+		cd2 = codonInfo2[p2][c1];
+		cd1 = codonInfo[h] [c2];
+		
+		branchFactor = branchLengths[p1]/terminalBL;
+
+		if (cd1>=0)
+		/* no ambiguities */
+		{
+			_SITE_OS_COUNT[cd1][cd2] = _SITE_OS_COUNT[cd1][cd2] + 1;		
+			_SITE_ON_COUNT[cd1][cd2] = _SITE_ON_COUNT[cd1][cd2] + 1;		
+			_SITE_ES_COUNT[cd1][cd2] = _SITE_ES_COUNT[cd1][cd2] + branchFactor;		
+			_SITE_EN_COUNT[cd1][cd2] = _SITE_EN_COUNT[cd1][cd2] + branchFactor;		
+
+		}	
+		else
+		/* ambiguities here */
+		{
+			GetDataInfo    (ambInfo, filteredData, h, c2);	
+			if (Rows(observedCEFV) == 1)
+			{
+				siteFilter = ""+(v*3)+"-"+(v*3+2);
+				DataSetFilter filteredDataSite = CreateFilter (dsJoint,3,siteFilter,"",GeneticCodeExclusions);
+				HarvestFrequencies			  (observedCEFV,filteredDataSite,3,3,0);
+				tempMx = {stateCharCount,1};
+
+				hShift = 0;
+
+				for (k=0; k<64; k=k+1)
+				{
+					if (_Genetic_Code[k]==10)
+					{
+						hShift = hShift+1;
+					}
+					else
+					{
+						tempMx[k-hShift] = observedCEFV[k];
+					}
+				}	
+				observedCEFV = tempMx;		
+			}
+			
+			weightFactor = matrixTrick2*ambInfo;
+			if (weightFactor[0]<stateCharCount)
+			{
+				ambInfo  	 = ambInfo$observedCEFV;
+				
+				if (ambChoice)
+				{
+					weightFactor = 0;
+					tempMx = -1;
+					for (k=0; k<stateCharCount; k=k+1)
+					{
+						if (ambInfo[k]>weightFactor)
+						{
+							weightFactor = ambInfo[k];
+							tempMx = k;
+						}
+					}
+					if (tempMx>=0)
+					{
+						_SITE_OS_COUNT[tempMx][cd2] = _SITE_OS_COUNT[tempMx][cd2] + 1;		
+						_SITE_ON_COUNT[tempMx][cd2] = _SITE_ON_COUNT[tempMx][cd2] + 1 ;		
+						_SITE_ES_COUNT[tempMx][cd2] = _SITE_ES_COUNT[tempMx][cd2] + branchFactor;		
+						_SITE_EN_COUNT[tempMx][cd2] = _SITE_EN_COUNT[tempMx][cd2] + branchFactor;		
+					}
+				}
+				else
+				{
+					weightFactor = matrixTrick2*ambInfo;
+					weightFactor = weightFactor[0];
+					if (weightFactor)
+					{
+						ambInfo		 = ambInfo * (1/weightFactor);
+						for (k=0; k<stateCharCount; k=k+1)
+						{
+							weightFactor = ambInfo[k];
+							if (weightFactor>0)
+							{
+								_SITE_OS_COUNT[k][cd2] = _SITE_OS_COUNT[k][cd2] + weightFactor;		
+								_SITE_ON_COUNT[k][cd2] = _SITE_ON_COUNT[k][cd2] + weightFactor;		
+								_SITE_ES_COUNT[k][cd2] = _SITE_ES_COUNT[k][cd2] + weightFactor*branchFactor;		
+								_SITE_EN_COUNT[k][cd2] = _SITE_EN_COUNT[k][cd2] + weightFactor*branchFactor;
+							}
+						}
+					}
+				}
+			}
+		}
+	}
+	
+	_SITE_OS_COUNT = matrixTrick2*(_OBSERVED_S_$_SITE_OS_COUNT)*Transpose(matrixTrick2);
+	_SITE_ON_COUNT = matrixTrick2*(_OBSERVED_NS_$_SITE_ON_COUNT)*Transpose(matrixTrick2);
+	_SITE_ES_COUNT = matrixTrick2*(_PAIRWISE_S_$_SITE_ES_COUNT)*Transpose(matrixTrick2);
+	_SITE_EN_COUNT = matrixTrick2*(_PAIRWISE_NS_$_SITE_EN_COUNT)*Transpose(matrixTrick2);
+	
+	resultMatrix[v][0] = _SITE_OS_COUNT[0];
+	resultMatrix[v][1] = _SITE_ON_COUNT[0];
+	resultMatrix[v][2] = _SITE_ES_COUNT[0];
+	resultMatrix[v][3] = _SITE_EN_COUNT[0];
+	
+	weight = _SITE_EN_COUNT[0]+_SITE_ES_COUNT[0];
+	
+	p = _SITE_ES_COUNT[0]/weight;
+	
+	resultMatrix[v][5] = p;
+	
+	p2 = resultMatrix[v][0]+resultMatrix[v][1];
+	
+	resultMatrix[v][7] = resultMatrix[v][1]/resultMatrix[v][3];
+	
+	if (resultMatrix[v][2])
+	{
+		resultMatrix[v][6]  = resultMatrix[v][0]/resultMatrix[v][2];
+		resultMatrix[v][8]  = resultMatrix[v][7]-resultMatrix[v][6];	
+		resultMatrix[v][11] = resultMatrix[v][8]/totalTreeLength;	
+	}
+	
+	if (p2)
+	{
+		resultMatrix[v][4]  = resultMatrix[v][0]/p2;		
+		resultMatrix[v][9]  = extendedBinTail (p2,p,resultMatrix[v][0]);
+		if (resultMatrix[v][0]>=1)
+		{
+			resultMatrix[v][10] = 1-extendedBinTail(p2,p,resultMatrix[v][0]-1);
+		}
+		else
+		{
+			resultMatrix[v][10] = 1-extendedBinTail (p2,p,0);
+		}
+	}		
+
+	_SITE_OS_COUNTInternals = matrixTrick2*(_OBSERVED_S_$_SITE_OS_COUNTInternals)*Transpose(matrixTrick2);
+	_SITE_ON_COUNTInternals = matrixTrick2*(_OBSERVED_NS_$_SITE_ON_COUNTInternals)*Transpose(matrixTrick2);
+	_SITE_ES_COUNTInternals = matrixTrick2*(_PAIRWISE_S_$_SITE_ES_COUNTInternals)*Transpose(matrixTrick2);
+	_SITE_EN_COUNTInternals = matrixTrick2*(_PAIRWISE_NS_$_SITE_EN_COUNTInternals)*Transpose(matrixTrick2);
+	
+	resultMatrixInternal[v][0] = _SITE_OS_COUNTInternals[0];
+	resultMatrixInternal[v][1] = _SITE_ON_COUNTInternals[0];
+	resultMatrixInternal[v][2] = _SITE_ES_COUNTInternals[0];
+	resultMatrixInternal[v][3] = _SITE_EN_COUNTInternals[0];
+	
+	weight = _SITE_EN_COUNTInternals[0]+_SITE_ES_COUNTInternals[0];
+	
+	p = _SITE_ES_COUNTInternals[0]/weight;
+	
+	resultMatrixInternal[v][5] = p;
+	
+	p2 = resultMatrixInternal[v][0]+resultMatrixInternal[v][1];
+	
+	resultMatrixInternal[v][7] = resultMatrixInternal[v][1]/resultMatrixInternal[v][3];
+	
+	if (resultMatrixInternal[v][2])
+	{
+		resultMatrixInternal[v][6]  = resultMatrixInternal[v][0]/resultMatrixInternal[v][2];
+		resultMatrixInternal[v][8]  = resultMatrixInternal[v][7]-resultMatrixInternal[v][6];	
+		resultMatrixInternal[v][11] = resultMatrixInternal[v][8]/totalTreeLength;	
+	}
+	
+	if (p2)
+	{
+		resultMatrixInternal[v][4]  = resultMatrixInternal[v][0]/p2;		
+		resultMatrixInternal[v][9]  = extendedBinTail (p2,p,resultMatrixInternal[v][0]);
+		if (resultMatrixInternal[v][0]>=1)
+		{
+			resultMatrixInternal[v][10] = 1-extendedBinTail(p2,p,resultMatrixInternal[v][0]-1);
+		}
+		else
+		{
+			resultMatrixInternal[v][10] = 1-extendedBinTail (p2,p,0);
+		}
+	}		
+}
+
+labelMatrix =     {1,12};
+labelMatrix[0] = "Observed S Changes";
+labelMatrix[1] = "Observed NS Changes";
+labelMatrix[2] = "E[S Sites]";
+labelMatrix[3] = "E[NS Sites]";
+labelMatrix[4] = "Observed S. Prop.";
+labelMatrix[5] = "P{S}";
+labelMatrix[6] = "dS";
+labelMatrix[7] = "dN";
+labelMatrix[8] = "dN-dS";
+labelMatrix[9]  = "P{S leq. observed}";
+labelMatrix[10] = "P{S geq. observed}";
+labelMatrix[11] = "Scaled dN-dS";
+
+sigLevel = -1;
+
+while ((sigLevel<=0)||(sigLevel>=1))
+{
+	fprintf (stdout, "\nSignificance level for a site to be classified as positively/negatively selected?");
+	fscanf  (stdin, "Number", sigLevel);
+}
+
+posSelected = 0;
+negSelected = 0;
+
+p = Rows(resultMatrix);
+
+for (p2=0; p2<p; p2=p2+1)
+{
+	v = resultMatrix [p2][8];
+	if (v>0)
+	{
+		if (resultMatrix [p2][9] < sigLevel)
+		{
+			posSelected = posSelected+1;
+		}
+	}
+	else
+	{
+		if (v<0)
+		{
+			if (resultMatrix [p2][10] < sigLevel)
+			{
+				negSelected = negSelected+1;
+			}
+		}
+	}
+}
+
+selLabelMatrix = {{"Index","Site Index","dN-dS","p-value"}};
+
+if (posSelected)
+{
+	psMatrix = {posSelected, 3};
+	h = 0;
+	for (p2=0; p2<p; p2=p2+1)
+	{
+		v = resultMatrix [p2][8];
+		if (v>0)
+		{
+			if (resultMatrix [p2][9] < sigLevel)
+			{
+				psMatrix[h][0] = p2+1;
+				psMatrix[h][1] = v;
+				psMatrix[h][2] = resultMatrix [p2][9];
+				h = h+1;
+			}
+		}
+	}
+	
+	fprintf (stdout,"\n******* FOUND ", posSelected, " POSITIVELY SELECTED SITES ALONG TERMINAL BRANCHES ********\n\n");
+	dummy = PrintASCIITable  (psMatrix, selLabelMatrix);
+}
+else
+{
+	fprintf (stdout,"\n******* FOUND NO POSITIVELY SELECTED SITES ALONG TERMINAL BRANCHES ********\n\n");
+}
+
+if (negSelected)
+{
+	psMatrix = {negSelected, 3};
+	h = 0;
+	for (p2=0; p2<p; p2=p2+1)
+	{
+		v = resultMatrix [p2][8];
+		if (v<0)
+		{
+			if (resultMatrix [p2][10] < sigLevel)
+			{
+				psMatrix[h][0] = p2+1;
+				psMatrix[h][1] = v;
+				psMatrix[h][2] = resultMatrix [p2][10];
+				h = h+1;
+			}
+		}
+	}
+	
+	fprintf (stdout,"\n******* FOUND ", negSelected, " NEGATIVELY SELECTED SITES ALONG TERMINAL BRANCHES ********\n\n");
+	dummy = PrintASCIITable  (psMatrix, selLabelMatrix);
+}
+else
+{
+	fprintf (stdout,"\n******* FOUND NO NEGATIVELY SELECTED SITES ALONG TERMINAL BRANCHES ********\n\n");
+}
+
+ChoiceList (outputChoice, "Output Options",1,SKIP_NONE,
+			"ASCII Table",	 "Output is printed to the console as an ASCII table.",
+			"Export to File","Output is spooled to a tab separated file.",
+			"Chart","A HYPHY chart window is displayed (Mac/Doze Only).");
+			
+if (outputChoice<0)
+{
+	return;
+}
+
+if (outputChoice==0)
+{
+	dummy = PrintASCIITable  (resultMatrix, labelMatrix);
+}
+else
+{
+	if (outputChoice == 1)
+	{
+		SetDialogPrompt ("Save result table to:");
+		dummy = PrintTableToFile  (resultMatrix, labelMatrix, !pipeThroughFlag);
+	}
+	else
+	{
+		OpenWindow (CHARTWINDOW,{{"SLAC Results For Terminal Branches"}
+								   {"labelMatrix"},
+								   {"resultMatrix"},
+								   {"Contrast Bars"},
+								   {"Index"},
+								   {labelMatrix[6]+";"+labelMatrix[7]},
+								   {"Site Index"},
+								   {"dN"},
+								   {"dS"},
+								   {"0"}},
+								   "SCREEN_WIDTH-60;SCREEN_HEIGHT-50;30;50");
+	}
+}
+
+posSelected = 0;
+negSelected = 0;
+
+p = Rows(resultMatrixInternal);
+
+for (p2=0; p2<p; p2=p2+1)
+{
+	v = resultMatrixInternal [p2][8];
+	if (v>0)
+	{
+		if (resultMatrixInternal [p2][9] < sigLevel)
+		{
+			posSelected = posSelected+1;
+		}
+	}
+	else
+	{
+		if (v<0)
+		{
+			if (resultMatrixInternal [p2][10] < sigLevel)
+			{
+				negSelected = negSelected+1;
+			}
+		}
+	}
+}
+
+selLabelMatrix = {{"Index","Site Index","dN-dS","p-value"}};
+
+if (posSelected)
+{
+	psMatrix = {posSelected, 3};
+	h = 0;
+	for (p2=0; p2<p; p2=p2+1)
+	{
+		v = resultMatrixInternal [p2][8];
+		if (v>0)
+		{
+			if (resultMatrixInternal [p2][9] < sigLevel)
+			{
+				psMatrix[h][0] = p2+1;
+				psMatrix[h][1] = v;
+				psMatrix[h][2] = resultMatrixInternal [p2][9];
+				h = h+1;
+			}
+		}
+	}
+	
+	fprintf (stdout,"\n******* FOUND ", posSelected, " POSITIVELY SELECTED SITES ALONG INTERNAL BRANCHES ********\n\n");
+	dummy = PrintASCIITable  (psMatrix, selLabelMatrix);
+}
+else
+{
+	fprintf (stdout,"\n******* FOUND NO POSITIVELY SELECTED SITES ALONG INTERNAL BRANCHES ********\n\n");
+}
+
+if (negSelected)
+{
+	psMatrix = {negSelected, 3};
+	h = 0;
+	for (p2=0; p2<p; p2=p2+1)
+	{
+		v = resultMatrixInternal [p2][8];
+		if (v<0)
+		{
+			if (resultMatrixInternal [p2][10] < sigLevel)
+			{
+				psMatrix[h][0] = p2+1;
+				psMatrix[h][1] = v;
+				psMatrix[h][2] = resultMatrixInternal [p2][10];
+				h = h+1;
+			}
+		}
+	}
+	
+	fprintf (stdout,"\n******* FOUND ", negSelected, " NEGATIVELY SELECTED SITES ALONG INTERNAL BRANCHES ********\n\n");
+	dummy = PrintASCIITable  (psMatrix, selLabelMatrix);
+}
+else
+{
+	fprintf (stdout,"\n******* FOUND NO NEGATIVELY SELECTED SITES ALONG INTERNAL BRANCHES ********\n\n");
+}
+
+if (outputChoice==0)
+{
+	dummy = PrintASCIITable  (resultMatrixInternal, labelMatrix);
+}
+else
+{
+	if (outputChoice == 1)
+	{
+		SetDialogPrompt ("Save results for internal branches to:");
+		dummy = PrintTableToFile  (resultMatrixInternal, labelMatrix, !pipeThroughFlag);
+	}
+	else
+	{
+		OpenWindow (CHARTWINDOW,{{"SLAC Results For Internal Branches"}
+								   {"labelMatrix"},
+								   {"resultMatrixInternal"},
+								   {"Contrast Bars"},
+								   {"Index"},
+								   {labelMatrix[6]+";"+labelMatrix[7]},
+								   {"Site Index"},
+								   {"dN"},
+								   {"dS"},
+								   {"0"}},
+								   "SCREEN_WIDTH-60;SCREEN_HEIGHT-50;30;50");
+	}
+}
diff --git a/res/TemplateBatchFiles/SSRatesTest.bf b/res/TemplateBatchFiles/SSRatesTest.bf
new file mode 100644
index 0000000..995ab57
--- /dev/null
+++ b/res/TemplateBatchFiles/SSRatesTest.bf
@@ -0,0 +1,116 @@
+/* This batch file will test whether elevated substitution rates are strand specific.
+In some ssDNA viruses, the virus is in a ss state sufficiently long for it to be subject to 
+oxidative deamination. Oxidative deamination results in elevated rates of 
+C-T; G-A and G-T. C-T and G-A are complimentary mutations, but G-T has a C-A complement. A 
+test of strand specific substitution rates therefore involves a likelihood ratio test of
+a model in which rates are constrained to their complement (ie C-T := G-A) versus a model in
+which all rates are independent.
+*/
+
+function printModelDescription ( gammaRate, freqsVector, strandGTR )
+{
+if ( strandGTR ) {
+	sep =            "+---+-------------+-------------+-------------+-------------+\n";
+	fprintf (stdout, "Rate matrix\n", 
+					 sep,
+					 "|   |      A      |      C      |      G      |      T      |\n",
+					 sep,
+					 "| A |      *      | ",Format(AC,11,5)," | ", Format(1.0,11,5), " | ", Format(AT,11,5), " |\n",
+					 sep,
+					 "| C | ",Format(GT,11,5)," |      *      | ", Format(CG,11,5), " | ", Format(CT,11,5), " |\n",
+					 sep,
+					 "| G | ",Format(CT,11,5), " | ",  Format(CG,11,5), " |      *      | ", Format(GT,11,5), " |\n",
+					 sep,
+					 "| T | ",Format(AT,11,5), " | ",  Format(AG,11,5), " | ",  Format(AC,11,5)," |      *      |\n",
+					 sep);
+						 
+	}
+	else {
+		sep =            "+---+-------------+-------------+-------------+-------------+\n";
+	fprintf (stdout, "Rate matrix\n", 
+					 sep,
+					 "|   |      A      |      C      |      G      |      T      |\n",
+					 sep,
+					 "| A |      *      | ",Format(AC,11,5)," | ", Format(1.0,11,5), " | ", Format(AT,11,5), " |\n",
+					 sep,
+					 "| C | ",Format(AC,11,5)," |      *      | ", Format(CG,11,5), " | ", Format(CT,11,5), " |\n",
+					 sep,
+					 "| G | ",Format(1,11,5), " | ",  Format(CG,11,5), " |      *      | ", Format(GT,11,5), " |\n",
+					 sep,
+					 "| T | ",Format(AT,11,5), " | ",  Format(CT,11,5), " | ",  Format(GT,11,5)," |      *      |\n",
+					 sep);
+	}
+	fprintf (stdout, "\nBase frequencies",
+					 "\nA = ", Format (freqsVector[0],10,4),
+					 "\nC = ", Format (freqsVector[1],10,4),
+					 "\nG = ", Format (freqsVector[2],10,4),
+					 "\nT = ", Format (freqsVector[3],10,4), "\n");
+					 
+	if (gammaRate>1) /* gamma or HMM*/
+	{
+		fprintf (stdout, "\nRate variation");
+		GetInformation 		(catInfo, c);
+		for (idx = 0; idx < Columns (catInfo); idx = idx + 1)
+		{
+			fprintf (stdout, "\nRate ",Format (idx+1,5,0), " = ", Format (catInfo[0][idx], 10,5), " (weight = ", Format (catInfo[1][idx], 10,5), ")");
+		}
+		fprintf (stdout, "\n");
+	}
+	
+	return 1;
+}
+
+SetDialogPrompt ("Select a nucleotide alignment");
+DataSet 		ds = ReadDataFile(PROMPT_FOR_FILE);
+fprintf			(stdout, "Read an alignment with ", ds.species, " sequences and ", ds.sites, " sites\n");
+ExecuteAFile 	(HYPHY_LIB_DIRECTORY + "TemplateBatchFiles" + DIRECTORY_SEPARATOR + "queryTree.bf");
+
+DataSetFilter filteredData = CreateFilter (ds,1);
+
+fprintf ( stdout, "Select parameter settings for the complement constrained GRM model\n" );
+incFileName = HYPHY_LIB_DIRECTORY + "TemplateBatchFiles" + DIRECTORY_SEPARATOR +  "TemplateModels" + DIRECTORY_SEPARATOR + "STGRM.mdl";
+ExecuteCommands ( "#include  \"" + incFileName + "\";" );
+Export ( Modelstring, USE_LAST_MODEL );
+fprintf ( stdout, Modelstring, "\n" );
+Tree STGRMTree = treeString;
+LikelihoodFunction lf_STGRM = ( filteredData, STGRMTree );
+Optimize ( res_STGRM, lf_STGRM );
+totalBranchCount = TipCount(STGRMTree) + BranchCount ( STGRMTree );
+ll_STGRM = res_STGRM [ 1 ][ 0 ];
+aic_STGRM = -2*ll_STGRM + 2*(res_STGRM [ 1 ][ 1 ] + totalBranchCount + 3);
+
+if ( modelType >= 1 ) {
+	fprintf ( stdout, "\nstrand specific General reversible model optimised parameters\n" );
+	fprintf ( stdout, "---------------------------------------------------------------\n" );
+	printModelDescription ( modelType, vectorOfFrequencies, 1 );
+	fprintf ( stdout, "\n" );
+}
+
+fprintf ( stdout, "Select parameter settings for the NRM model\n" );
+incFileName = HYPHY_LIB_DIRECTORY + "TemplateBatchFiles" + DIRECTORY_SEPARATOR +  "TemplateModels" + DIRECTORY_SEPARATOR + "NRM-Freqs.mdl";
+ExecuteCommands ( "#include  \"" + incFileName + "\";" );
+Export ( Modelstring, USE_LAST_MODEL );
+fprintf ( stdout, Modelstring, "\n" );
+Tree NRMTree = treeString;
+LikelihoodFunction lf_NRM = ( filteredData, NRMTree );
+Optimize ( res_NRM, lf_NRM );
+ll_NRM = res_NRM [ 1 ][ 0 ];
+aic_NRM = -2*ll_NRM + 2*(res_NRM [ 1 ][ 1 ] + totalBranchCount + 3);
+
+if ( modelType >= 1 ) {
+	fprintf ( stdout, "\nstrand specific General reversible model optimised parameters\n" );
+	fprintf ( stdout, "---------------------------------------------------------------\n" );
+	printModelDescription ( modelType, vectorOfFrequencies, 1 );
+	fprintf ( stdout, "\n" );
+}
+
+fprintf ( stdout, "Model comparison\n" );
+fprintf ( stdout, "--------------------\n" );
+fprintf ( stdout, "stGRM: logLk = ", ll_STGRM, "; AIC = ", aic_STGRM, "; Parameters = ", res_STGRM [ 1 ][ 1 ] + totalBranchCount + 3, "\n" );
+fprintf ( stdout, "NRM: logLk = ", ll_NRM, "; AIC = ", aic_NRM, "; Parameters = ", res_NRM [ 1 ][ 1 ] + totalBranchCount + 3, "\n" );
+
+fprintf ( stdout, "Likelihood ratio test statistic = ", 2*(ll_NRM-ll_STGRM), "; P = ", 1-CChi2 ( 2*(ll_NRM-ll_STGRM), res_NRM[1][1]-res_STGRM[1][1] ), "\n" ); 
+
+
+
+
diff --git a/res/TemplateBatchFiles/SampleProcessor.bf b/res/TemplateBatchFiles/SampleProcessor.bf
new file mode 100644
index 0000000..2dd887f
--- /dev/null
+++ b/res/TemplateBatchFiles/SampleProcessor.bf
@@ -0,0 +1,1340 @@
+distributionM1 		= {{0}};
+distributionM2 		= {{0}};
+distributionSynM3   = {{0}};
+distributionNSM3    = {{0}};
+distributionSynM4   = {{0}};
+distributionNSM4    = {{0}};
+distributionSynM5   = {{0}};
+distributionNSM5    = {{0}};
+marginalsM1         = {{0}};
+marginalsM2         = {{0}};
+marginalsM3         = {{0}};
+marginalsM4         = {{0}};
+marginalsM5         = {{0}};
+
+modelNamesShort = {{"Constant","Proportional","Nonsynonymous","Dual","Lineage Dual"}};
+
+
+/*___________________________________________________________________________________________________________*/
+
+function  PromptForMarginals (modelID)
+{
+	promptString = "Marginal Distribution for "+ modelNamesShort [modelID];
+	
+	SetDialogPrompt (promptString);
+	
+	if (modelID==1)
+	{
+		fscanf (PROMPT_FOR_FILE,"Matrix,Matrix",distributionM1,marginalsM1);
+	}
+	if (modelID==2)
+	{
+		fscanf (PROMPT_FOR_FILE,"Matrix,Matrix",distributionM2,marginalsM2);
+	}
+	if (modelID==3)
+	{
+		fscanf (PROMPT_FOR_FILE,"Matrix,Matrix,Matrix",distributionSynM3,distributionNSM3,marginalsM3);
+	}
+	if (modelID==4)
+	{
+		fscanf (PROMPT_FOR_FILE,"Matrix,Matrix,Matrix",distributionSynM4,distributionNSM4,marginalsM4);
+	}
+	if (modelID==5)
+	{
+		fscanf (PROMPT_FOR_FILE,"Matrix,Matrix,Matrix",distributionSynM5,distributionNSM5,marginalsM5);
+	}
+	
+	return 1;
+}
+
+/*___________________________________________________________________________________________________________*/
+
+function ComputeRateClasses (modelID, binRates)
+{
+	dummy = PromptForMarginals (modelID);
+	
+	if (modelID==1)
+	{
+		marginalMatrix = marginalsM1;
+		distribMatrix  = distributionM1;
+		divTerm		   = Columns (distributionM1);
+	}
+	if (modelID==2)
+	{
+		marginalMatrix = marginalsM2;
+		distribMatrix  = distributionM2;
+		divTerm		   = Columns (distributionM2);
+	}
+	if (modelID==3)
+	{
+		marginalMatrix = marginalsM3;
+		distribMatrixS = distributionSynM3;
+		distribMatrixN = distributionNSM3;
+		divTerm		   = Columns (distributionNSM3);
+	}
+	if (modelID==4)
+	{
+		distribMatrixS = distributionSynM4;
+		distribMatrixN = distributionNSM4;
+		marginalMatrix = marginalsM4;
+		divTerm		   = Columns (distributionNSM4);
+	}
+		
+	if ((Rows(marginalMatrix)==0)||(Columns(marginalMatrix)==0))
+	{
+		fprintf (stdout, "\n***ERROR:Invalid marginal likelihood matrix***\n");
+	}
+	else
+	{
+		if (modelID<=2)
+		{
+			rateAssignmentMatrix = {Columns(marginalMatrix),1};
+			for (counter1 = 0; counter1 < Columns (marginalMatrix); counter1=counter1+1)
+			{
+				columnMax = 0.0;
+				maxColumn = 0;
+				
+				for (counter2 = 0; counter2 < Rows (marginalMatrix); counter2 = counter2+1)
+				{
+					tempVal = marginalMatrix[counter2][counter1];
+					if (tempVal>columnMax)
+					{
+						columnMax  = tempVal;
+						maxColumn  = counter2; 
+	 				}
+				}
+				rateAssignmentMatrix[counter1][0] = maxColumn;
+			}
+			if (binRates)
+			{
+				titleMatrix = {divTerm,2};
+				for (counter2 = 0; counter2 < Rows (rateAssignmentMatrix); counter2 = counter2 + 1)
+				{
+				 	counter1 = rateAssignmentMatrix[counter2];
+				 	titleMatrix[counter1][1] = titleMatrix[counter1][1] + 1;
+				}
+				
+				for (counter1=0; counter1 < divTerm; counter1 = counter1+1)
+				{
+					titleMatrix[counter1][0] = distribMatrix[0][counter1];
+				}
+
+				rateAssignmentMatrix = titleMatrix;
+				titleMatrix	= {{"Rate Class","Rate","Sites In Class"}};
+			}
+			else
+			{
+				titleMatrix	= {{"Site Index","Rate Class"}};
+			}
+		}
+		else
+		{
+			rateAssignmentMatrix = {Columns(marginalMatrix),2};
+			for (counter1 = 0; counter1 < Columns (marginalMatrix); counter1=counter1+1)
+			{
+				columnMax = 0.0;
+				maxColumn = 0;
+				
+				for (counter2 = 0; counter2 < Rows (marginalMatrix); counter2 = counter2+1)
+				{
+					tempVal = marginalMatrix[counter2][counter1];
+					if (tempVal>columnMax)
+					{
+						columnMax  = tempVal;
+						maxColumn  = counter2; 
+	 				}
+				}
+				rateAssignmentMatrix[counter1][0] = maxColumn$divTerm;
+				rateAssignmentMatrix[counter1][1] = maxColumn%divTerm;
+			}
+			if (binRates)
+			{
+				if (Columns (distribMatrixS) >= Columns (distribMatrixN))
+				{
+					titleMatrix = {Rows(marginalMatrix)/divTerm,divTerm+2};
+					for (counter2 = 0; counter2 < Rows (rateAssignmentMatrix); counter2 = counter2 + 1)
+					{
+					 	counter1 = rateAssignmentMatrix[counter2][0];
+					 	counter3 = rateAssignmentMatrix[counter2][1];
+					 	
+					 	titleMatrix[counter1][counter3] = titleMatrix[counter1][counter3] + 1;
+					}
+					rateAssignmentMatrix = titleMatrix;
+					titleMatrix	= {1,Columns(rateAssignmentMatrix)+1};
+					titleMatrix[0] = "Syn Class";
+					for (counter1 = 1; counter1 <= Columns(distribMatrixN); counter1 = counter1+1)
+					{
+						titleMatrix[counter1] = "NS Rate = "+ distribMatrixN[0][counter1-1];
+					}
+					titleMatrix[counter1] = "Non-Syn Rates";
+					for (counter2 = 0; counter2 < Columns (distribMatrixN); counter2 = counter2+1)
+					{
+						rateAssignmentMatrix [counter2][counter1-1] = distribMatrixN[0][counter2];
+					}
+					
+					titleMatrix[counter1+1] = "Syn Rates";
+					for (counter2 = 0; counter2 < Columns (distribMatrixS); counter2 = counter2+1)
+					{
+						rateAssignmentMatrix [counter2][counter1] = distribMatrixS[0][counter2];
+					}
+				}
+				else
+				{
+					divTerm = Columns (distribMatrixS);
+					
+					titleMatrix = {Rows(marginalMatrix)/divTerm,divTerm+2};
+					for (counter2 = 0; counter2 < Rows (rateAssignmentMatrix); counter2 = counter2 + 1)
+					{
+					 	counter1 = rateAssignmentMatrix[counter2][0];
+					 	counter3 = rateAssignmentMatrix[counter2][1];
+					 	
+					 	titleMatrix[counter3][counter1] = titleMatrix[counter3][counter1] + 1;
+					}
+					
+					rateAssignmentMatrix = titleMatrix;
+					titleMatrix	= {1,Columns(rateAssignmentMatrix)+1};
+					titleMatrix[0] = "Non-Syn Class";
+					for (counter1 = 1; counter1 <= Columns(distribMatrixS); counter1 = counter1+1)
+					{
+						titleMatrix[counter1] = "Syn Rate = "+ distribMatrixS[0][counter1-1];
+					}
+					titleMatrix[counter1] = "Syn Rates";
+					for (counter2 = 0; counter2 < Columns (distribMatrixS); counter2 = counter2+1)
+					{
+						rateAssignmentMatrix [counter2][counter1-1] = distribMatrixS[0][counter2];
+					}
+					
+					titleMatrix[counter1+1] = "Non-Syn Rates";
+					for (counter2 = 0; counter2 < Columns (distribMatrixN); counter2 = counter2+1)
+					{
+						rateAssignmentMatrix [counter2][counter1] = distribMatrixN[0][counter2];
+					}				
+				}
+			}
+			else
+			{
+				titleMatrix	= {{"Site Index","Syn Rate Class","Non-syn Rate Class"}};
+			}
+		}
+		
+		if (outputChoice == 0)
+		{
+			dummy = PrintASCIITable (rateAssignmentMatrix, titleMatrix);
+		}
+		if (outputChoice == 1)
+		{
+			dummy = PrintTableToFile (rateAssignmentMatrix, titleMatrix,1);
+		}
+		if (outputChoice == 2)
+		{
+			labelMatrix = {1,Columns(titleMatrix)-1};
+			for (counter1 = 0; counter1 < Columns (labelMatrix); counter1 = counter1+1)
+			{
+				labelMatrix[0][counter1] = titleMatrix[0][counter1+1];
+			}
+			
+			if (modelID<=2)
+			{
+				if (binRates)
+				{
+					promptString = "Class Histogram for " + modelNamesShort[modelID];
+					OpenWindow (CHARTWINDOW,{{promptString}
+										   {"labelMatrix"}
+										   {"rateAssignmentMatrix"}
+										   {"Bar Chart"}
+										   {labelMatrix[0]}
+										   {labelMatrix[1]}
+										   {titleMatrix[0]}
+										   {""}
+										   {titleMatrix[1]}
+										   {"0"}},
+										   "SCREEN_WIDTH-60;SCREEN_HEIGHT-50;30;50");
+				}				
+				else
+				{
+					promptString = "Class Assignments for " + modelNamesShort[modelID];
+					OpenWindow (CHARTWINDOW,{{promptString}
+										   {"labelMatrix"}
+										   {"rateAssignmentMatrix"}
+										   {"Bar Chart"}
+										   {"Index"}
+										   {labelMatrix[0]}
+										   {titleMatrix[0]}
+										   {""}
+										   {titleMatrix[1]}
+										   {"0"}},
+										   "SCREEN_WIDTH-60;SCREEN_HEIGHT-50;30;50");
+				}
+			}
+			else
+			{
+				if (binRates)
+				{
+					promptString = "";
+					for (counter1 = 1; counter1 < Columns(rateAssignmentMatrix)-2; counter1 = counter1+1)
+					{
+						promptString = promptString+titleMatrix[counter1]+";";
+					}
+					promptString = promptString+titleMatrix[Columns(rateAssignmentMatrix)-2];
+					scaleString = ""+(Columns (rateAssignmentMatrix)-1)+";"+(Columns (rateAssignmentMatrix));
+					OpenWindow (CHARTWINDOW,{{"Class Histogram for " + modelNamesShort[modelID]}
+											   {"labelMatrix"},
+											   {"rateAssignmentMatrix"},
+											   {"3D Histogram"},
+											   {"Index"},
+											   {promptString},
+											   {"A"},
+											   {"B"},
+											   {"C"},
+											   {"3"},
+											   {""}
+											   {scaleString}},
+											   "SCREEN_WIDTH-60;SCREEN_HEIGHT-50;30;50");
+				}
+				else
+				{
+					OpenWindow (CHARTWINDOW,{{"Class Assignments for " + modelNamesShort[modelID]}
+											   {"labelMatrix"},
+											   {"rateAssignmentMatrix"},
+											   {"Contrast Bars"},
+											   {"Index"},
+											   {"Syn Rate Class;Non-syn Rate Class"},
+											   {titleMatrix[0]},
+											   {titleMatrix[2]},
+											   {titleMatrix[1]},
+											   {"0"}},
+											   "SCREEN_WIDTH-60;SCREEN_HEIGHT-50;30;50");
+				}
+			}
+			
+		}
+	}
+	return 1;
+}
+
+/*___________________________________________________________________________________________________________*/
+
+function ComputePosteriorRates (modelID)
+{
+	dummy = PromptForMarginals (modelID);
+	
+	if (modelID==1)
+	{
+		marginalMatrix = marginalsM1;
+		divTerm		   = Columns (distributionM1);
+		distribMX	   = distributionM1;
+	}
+	if (modelID==2)
+	{
+		marginalMatrix = marginalsM2;
+		divTerm		   = Columns (distributionM2);
+		distribMX	   = distributionM2;
+	}
+	if (modelID==3)
+	{
+		marginalMatrix = marginalsM3;
+		divTerm		   = Columns (distributionNSM3);
+		distribMXS	   = distributionSynM3;
+		distribMXN	   = distributionNSM3;
+	}
+	if (modelID==4)
+	{
+		marginalMatrix = marginalsM4;
+		divTerm		   = Columns (distributionNSM4);
+		distribMXS	   = distributionSynM4;
+		distribMXN	   = distributionNSM4;
+	}
+		
+	rMMX  = Rows(marginalMatrix);
+	
+	if ((rMMX==0)||(Columns(marginalMatrix)==0))
+	{
+		fprintf (stdout, "\n***ERROR:Invalid marginal likelihood matrix***\n");
+	}
+	else
+	{
+		if (modelID<=2)
+		{
+			rateAssignmentMatrix = {Columns(marginalMatrix),1};
+			for (counter1 = 0; counter1 < Columns (marginalMatrix); counter1=counter1+1)
+			{
+				columnSum = 0;				
+				for (counter2 = 0; counter2 < rMMX; counter2 = counter2+1)
+				{
+					tempVal   = marginalMatrix [counter2][counter1];
+					columnSum = columnSum + tempVal*distribMX[1][counter2];
+					marginalMatrix [counter2][counter1] = tempVal * distribMX[1][counter2];
+				}
+				
+				tempVal   = 0;
+				
+				for (counter2 = 0; counter2 < rMMX; counter2 = counter2+1)
+				{
+					tempVal   = tempVal + distribMX[0][counter2]*marginalMatrix [counter2][counter1]/columnSum;
+				}
+				rateAssignmentMatrix[counter1][0] = tempVal;
+			}
+			if (modelID==1)
+			{
+				titleMatrix	= {{"Site Index","E[S|i]"}};
+			}
+			else
+			{
+				titleMatrix	= {{"Site Index","E[N|i]"}};			
+			}
+		}
+		else
+		{
+			rateAssignmentMatrix = {Columns(marginalMatrix),2};
+			for (counter1 = 0; counter1 < Columns (marginalMatrix); counter1=counter1+1)
+			{
+				columnSum = 0;				
+				for (counter2 = 0; counter2 < rMMX; counter2 = counter2+1)
+				{
+					tempVal   = marginalMatrix [counter2][counter1];
+					entryWeight = distribMXS[1][counter2$divTerm] * distribMXN[1][counter2%divTerm];
+					columnSum = columnSum + tempVal*entryWeight;
+					marginalMatrix [counter2][counter1] = tempVal * entryWeight;
+				}
+				
+				for (counter2 = 0; counter2 < rMMX; counter2 = counter2+1)
+				{
+					marginalMatrix [counter2][counter1] = marginalMatrix [counter2][counter1]/columnSum;
+				}
+				
+				tempVal = 0;
+				
+				for (counter2 = 0; counter2 < rMMX; )
+				{
+					columnSum = 0;
+					for (counter3 = counter2; counter3 < counter2+divTerm; counter3 = counter3+1)
+					{
+						columnSum = columnSum +  marginalMatrix [counter3][counter1];
+					}
+					tempVal = tempVal + columnSum * distribMXS[0][counter2$divTerm];
+					counter2 = counter2 + divTerm;
+				}
+				
+				rateAssignmentMatrix[counter1][0] = tempVal;
+				
+				tempVal = 0;
+				
+				for (counter2 = 0; counter2 < divTerm; counter2 = counter2+1)
+				{
+					columnSum = 0;
+					for (counter3 = counter2; counter3 < rMMX; counter3 = counter3+divTerm)
+					{
+						columnSum = columnSum +  marginalMatrix [counter3][counter1];
+					}
+					tempVal = tempVal + columnSum * distribMXN[0][counter2];
+				}
+				
+				rateAssignmentMatrix[counter1][1] = tempVal;
+			}
+			titleMatrix	= {{"Site Index","E[S|i]","E[N|i]"}};			
+		}
+		
+		if (outputChoice == 0)
+		{
+			dummy = PrintASCIITable (rateAssignmentMatrix, titleMatrix);
+		}
+		if (outputChoice == 1)
+		{
+			dummy = PrintTableToFile (rateAssignmentMatrix, titleMatrix,1);
+		}
+		if (outputChoice == 2)
+		{
+			labelMatrix = {1,Columns(titleMatrix)-1};
+			for (counter1 = 0; counter1 < Columns (labelMatrix); counter1 = counter1+1)
+			{
+				labelMatrix[0][counter1] = titleMatrix[0][counter1+1];
+			}
+			
+			promptString = "Expected Posterior Rates for " + modelNamesShort[modelID];
+			if (modelID<=2)
+			{
+				OpenWindow (CHARTWINDOW,{{promptString}
+										   {"labelMatrix"},
+										   {"rateAssignmentMatrix"},
+										   {"Bar Chart"},
+										   {"Index"},
+										   {labelMatrix[0]},
+										   {titleMatrix[0]},
+										   {""},
+										   {titleMatrix[1]},
+										   {"0"}},
+										   "SCREEN_WIDTH-60;SCREEN_HEIGHT-50;30;50");
+			}
+			else
+			{
+				promptString2 = labelMatrix[0]+";"+labelMatrix[1];
+				OpenWindow (CHARTWINDOW,{{promptString}
+										   {"labelMatrix"},
+										   {"rateAssignmentMatrix"},
+										   {"Contrast Bars"},
+										   {"Index"},
+										   {promptString2},
+										   {titleMatrix[0]},
+										   {titleMatrix[2]},
+										   {titleMatrix[1]},
+										   {"0"}},
+										   "SCREEN_WIDTH-60;SCREEN_HEIGHT-50;30;50");
+			}
+			
+		}
+	}
+	return 1;
+}
+
+/*___________________________________________________________________________________________________________*/
+
+function ComputePositiveSelection (modelID, sitesOnly)
+{
+	dummy = PromptForMarginals (modelID);
+	
+	if (modelID==2)
+	{
+		marginalMatrix = marginalsM2;
+		divTerm		   = Columns (distributionM2);
+		distribMX	   = distributionM2;
+	}
+	if (modelID==3)
+	{
+		marginalMatrix = marginalsM3;
+		divTerm		   = Columns (distributionNSM3);
+		distribMXS	   = distributionSynM3;
+		distribMXN	   = distributionNSM3;
+	}
+	if (modelID==4)
+	{
+		marginalMatrix = marginalsM4;
+		divTerm		   = Columns (distributionNSM4);
+		distribMXS	   = distributionSynM4;
+		distribMXN	   = distributionNSM4;
+	}
+	
+	if (sitesOnly > .5)
+	{
+		if (psChoice)
+		{
+			thresh = 0;
+			while (thresh<=1.)
+			{
+				fprintf (stdout, "Select the threshold for the Bayes factor on P{N/S>1} (>1) for a site to be marked as positively selected:");
+				fscanf  (stdin,"Number",thresh);
+			}
+			thresh = Log (thresh);
+		}
+		else
+		{
+			thresh = -1;
+			while ((thresh<0)||(thresh>1))
+			{
+				fprintf (stdout, "Select the threshold for P{N/S>1} for a site to be marked as positively selected:");
+				fscanf  (stdin,"Number",thresh);
+			}
+		}
+	}
+		
+	rMMX  = Rows(marginalMatrix);
+	
+	if ((rMMX==0)||(Columns(marginalMatrix)==0))
+	{
+		fprintf (stdout, "\n***ERROR:Invalid marginal likelihood matrix***\n");
+	}
+	else
+	{
+			
+		if (sitesOnly > .5)
+		{
+			if (psChoice)
+			{
+				titleMatrix	= {{"Counter","Site Index","P[NS/S>1|s]"}};
+			}			
+			else
+			{
+				titleMatrix	= {{"Counter","Site Index","Log[BF{NS/S>1|s}]"}};
+			}
+		}		
+		else
+		{
+			if (psChoice)
+			{
+				titleMatrix	= {{"Codon","Log[BF{NS/S>1|s}]","Log[BF{NS/S<=1|s}]"}};
+			}			
+			else
+			{
+				titleMatrix	= {{"Codon","P[NS/S>1|s]","P[NS/S<=1|s]"}};
+			}
+		}
+			
+		if (modelID==2)
+		{
+			distribMXR = distribMX;
+		}
+		else
+		{
+			D1 = Columns(distribMXN);
+			D2 = Columns(distribMXS);
+				
+			distribMXR = {2,D1*D2};
+			
+			for (k=0; k<D2; k=k+1)
+			{
+				E = k*D1;
+				for (k2 = 0; k2<D1; k2=k2+1)
+				{
+					distribMXR [0][E+k2] = distribMXN[0][k2]/distribMXS[0][k];
+					distribMXR [1][E+k2] = distribMXN[1][k2]*distribMXS[1][k];
+				}
+			}
+		}
+		
+		
+		counter3 	 = 0;
+		ratesOverOne = {Columns(distribMXR),1};
+		
+		for (counter1=0; counter1<Columns(distribMXR); counter1=counter1+1)
+		{
+			if (distribMXR [0][counter1]>1)
+			{
+				ratesOverOne[counter3][0] = counter1;
+				counter3 = counter3 + 1;
+			}
+		}
+		
+		if (counter3==0)
+		{
+			fprintf (stdout, "\nThere are no rates with N/S > 1 and thus P{N/S>1|i} = 0 for all sites \n\n");
+			return 1;
+		}
+				
+		if (psChoice)
+		{
+			priorOdds = 0;
+			for (k=0; k<Columns(distribMXR); k=k+1)
+			{
+				if (distribMXR [0][k]>=1)
+				{
+					priorOdds = priorOdds + distribMXR [1][k];
+				}
+			}
+			priorOdds = priorOdds/(1-priorOdds);
+		}
+		
+		if (sitesOnly>.5)
+		{
+			E = 0;
+			rateAssignmentMatrix = {Columns(marginalMatrix),2};
+			for (counter1 = 0; counter1 < Columns (marginalMatrix); counter1=counter1+1)
+			{
+				columnSum = 0;				
+				for (counter2 = 0; counter2 < rMMX; counter2 = counter2+1)
+				{
+					tempVal   = marginalMatrix [counter2][counter1];
+					columnSum = columnSum + tempVal*distribMXR[1][counter2];
+					marginalMatrix [counter2][counter1] = tempVal * distribMXR[1][counter2];
+				}
+				
+				tempVal   = 0;
+				
+				for (counter2 = 0; counter2 < counter3; counter2 = counter2+1)
+				{
+					indexVal  = ratesOverOne [counter2][0];
+					tempVal   = tempVal + marginalMatrix [indexVal][counter1];
+				}
+				tempVal = tempVal/columnSum;
+				
+				if (psChoice)
+				{
+					tempVal = Log(tempVal/(1-tempVal)/priorOdds);
+				}
+				
+				if (tempVal>=thresh)
+				{
+					rateAssignmentMatrix[E][0] = counter1+1;
+					rateAssignmentMatrix[E][1] = tempVal;
+					E = E+1;
+				}
+			}
+			
+			if (E==0)
+			{
+				fprintf (stdout, "\nThere are no sites with P{N/S>1|i} >= ",thresh, "\n\n");
+				return 1;
+			}
+			
+			ratesOverOne = {E,2};
+			for (counter1 = 0; counter1 < E; counter1 = counter1+1)
+			{
+				ratesOverOne[counter1][0] = rateAssignmentMatrix[counter1][0];
+				ratesOverOne[counter1][1] = rateAssignmentMatrix[counter1][1];
+			}		
+			rateAssignmentMatrix = ratesOverOne;
+			ratesOverOne = 0;
+		}		
+		else
+		{
+			rateAssignmentMatrix = {Columns(marginalMatrix),2};
+			for (counter1 = 0; counter1 < Columns (marginalMatrix); counter1=counter1+1)
+			{
+				columnSum = 0;				
+				for (counter2 = 0; counter2 < rMMX; counter2 = counter2+1)
+				{
+					tempVal   = marginalMatrix [counter2][counter1];
+					columnSum = columnSum + tempVal*distribMXR[1][counter2];
+					marginalMatrix [counter2][counter1] = tempVal * distribMXR[1][counter2];
+				}
+				
+				tempVal   = 0;
+				
+				for (counter2 = 0; counter2 < counter3; counter2 = counter2+1)
+				{
+					indexVal  = ratesOverOne [counter2][0];
+					tempVal   = tempVal + marginalMatrix [indexVal][counter1];
+				}
+				if (psChoice)
+				{
+					tempVal = tempVal/columnSum;
+					rateAssignmentMatrix[counter1][0] = Max(Log(tempVal/(1-tempVal)/priorOdds),0);
+					rateAssignmentMatrix[counter1][1] = Max(-Log(tempVal/(1-tempVal)/priorOdds),0);
+				}
+				else
+				{
+					rateAssignmentMatrix[counter1][0] = tempVal/columnSum;
+					rateAssignmentMatrix[counter1][1] = 1-tempVal/columnSum;
+				}
+			}
+		}
+		
+		
+
+		if (outputChoice == 0)
+		{
+			dummy = PrintASCIITable (rateAssignmentMatrix, titleMatrix);
+		}
+		if (outputChoice == 1)
+		{
+			dummy = PrintTableToFile (rateAssignmentMatrix, titleMatrix,1);
+		}
+		if (outputChoice == 2)
+		{
+			labelMatrix = {1,Columns(titleMatrix)-1};
+			for (counter1 = 0; counter1 < Columns (labelMatrix); counter1 = counter1+1)
+			{
+				labelMatrix[0][counter1] = titleMatrix[0][counter1+1];
+			}
+			
+			if (sitesOnly>.5)
+			{
+				promptString = "Positively Selected Sites for " + modelNamesShort[modelID];
+				OpenWindow (CHARTWINDOW,{{promptString}
+										   {"labelMatrix"},
+										   {"rateAssignmentMatrix"},
+										   {"Bar Chart"},
+										   {labelMatrix[0]},
+										   {labelMatrix[1]},
+										   {titleMatrix[0]},
+										   {""},
+										   {titleMatrix[1]},
+										   {"0"}},
+										   "SCREEN_WIDTH-60;SCREEN_HEIGHT-50;30;50");			
+			}			
+			else
+			{
+				if (psChoice)
+				{
+					promptString = "Log of Bayes Factor for P{N/S>1} for " + modelNamesShort[modelID];				
+				}
+				else
+				{
+					promptString = "P{N/S>1|i} for " + modelNamesShort[modelID];
+				}
+				OpenWindow (CHARTWINDOW,{{promptString}
+										   {"labelMatrix"},
+										   {"rateAssignmentMatrix"},
+										   {"Contrast Bars"},
+										   {"Index"},
+										   {labelMatrix[0]+";"+labelMatrix[1]},
+										   {titleMatrix[0]},
+										   {titleMatrix[2]},
+										   {titleMatrix[1]},
+										   {"0"}},
+										   "SCREEN_WIDTH-60;SCREEN_HEIGHT-50;30;50");			
+			}
+			
+			
+		}
+	}
+	return 1;
+}
+
+
+/*___________________________________________________________________________________________________________*/
+
+function ComputePRatio (modelID)
+{
+	dummy = PromptForMarginals (modelID);
+	
+	if (modelID==3)
+	{
+		marginalMatrix = marginalsM3;
+		divTerm		   = Columns (distributionNSM3);
+		distribMXS	   = distributionSynM3;
+		distribMXN	   = distributionNSM3;
+	}
+	if (modelID==4)
+	{
+		marginalMatrix = marginalsM4;
+		divTerm		   = Columns (distributionNSM4);
+		distribMXS	   = distributionSynM4;
+		distribMXN	   = distributionNSM4;
+	}
+		
+	rMMX  = Rows(marginalMatrix);
+	
+	if ((rMMX==0)||(Columns(marginalMatrix)==0))
+	{
+		fprintf (stdout, "\n***ERROR:Invalid marginal likelihood matrix***\n");
+	}
+	else
+	{
+			
+		titleMatrix	= {{"Site Index","P[NS/S>1|i]"}};
+		
+		D1 = Columns(distribMXN);
+		D2 = Columns(distribMXS);
+			
+		distribMXR = {2,D1*D2};
+		distribMXD = {2,D1*D2};
+		
+		for (k=0; k<D2; k=k+1)
+		{
+			E = k*D1;
+			for (k2 = 0; k2<D1; k2=k2+1)
+			{
+				distribMXR [0][E+k2] = distribMXN[0][k2]/distribMXS[0][k];
+				distribMXR [1][E+k2] = distribMXN[1][k2]*distribMXS[1][k];
+				distribMXD [0][E+k2] = distribMXN[0][k2]-distribMXS[0][k];
+				distribMXD [1][E+k2] = distribMXN[1][k2]*distribMXS[1][k];
+			}
+		}
+		
+		titleMatrix	= {{"Site Index","E[dN/dS|i]","E[dN-dS|i]"}};
+
+		rateAssignmentMatrix = {Columns(marginalMatrix),2};
+		
+		for (counter1 = 0; counter1 < Columns (marginalMatrix); counter1=counter1+1)
+		{
+			columnSum  = 0;				
+
+			for (counter2 = 0; counter2 < rMMX; counter2 = counter2+1)
+			{
+				tempVal   = marginalMatrix [counter2][counter1];
+				columnSum = columnSum + tempVal*distribMXR[1][counter2];
+				marginalMatrix [counter2][counter1] = tempVal * distribMXR[1][counter2];
+			}
+			
+			tempVal    = 0;
+			tempVal2   = 0;
+			
+			for (counter2 = 0; counter2 < rMMX; counter2 = counter2+1)
+			{
+				tempVal   = tempVal  + distribMXR[0][counter2]*marginalMatrix [counter2][counter1];
+				tempVal2  = tempVal2 + distribMXD[0][counter2]*marginalMatrix [counter2][counter1];
+			}
+			
+			rateAssignmentMatrix[counter1][0] = tempVal/columnSum;
+			rateAssignmentMatrix[counter1][1] = tempVal2/columnSum;
+		}
+
+		if (outputChoice == 0)
+		{
+			dummy = PrintASCIITable (rateAssignmentMatrix, titleMatrix);
+		}
+		if (outputChoice == 1)
+		{
+			dummy = PrintTableToFile (rateAssignmentMatrix, titleMatrix,1);
+		}
+		if (outputChoice == 2)
+		{
+			labelMatrix = {1,Columns(titleMatrix)-1};
+			for (counter1 = 0; counter1 < Columns (labelMatrix); counter1 = counter1+1)
+			{
+				labelMatrix[0][counter1] = titleMatrix[0][counter1+1];
+			}
+			
+			promptString = "Posterior dN dS Ratio and Difference for " + modelNamesShort[modelID];
+			OpenWindow (CHARTWINDOW,{{promptString}
+									   {"labelMatrix"},
+									   {"rateAssignmentMatrix"},
+									   {"Bar Chart"},
+									   {"Index"},
+									   {labelMatrix[0]},
+									   {titleMatrix[0]},
+									   {""},
+									   {titleMatrix[1]},
+									   {"0"}},
+									   "SCREEN_WIDTH-60;SCREEN_HEIGHT-50;30;50");			
+			
+		}
+	}
+	return 1;
+}
+
+
+/*___________________________________________________________________________________________________________*/
+
+function ComputeCDF (modelID)
+{
+	dummy = PromptForMarginals (modelID);
+		
+	if (modelID==1)
+	{
+		divTerm		   = Columns (distributionM1);
+		distribMX	   = distributionM1;
+	}
+	if (modelID==2)
+	{
+		divTerm		   = Columns (distributionM2);
+		distribMX	   = distributionM2;
+	}
+	if (modelID==3)
+	{
+		divTerm		   = Columns (distributionNSM3);
+		distribMXS	   = distributionSynM3;
+		distribMXN	   = distributionNSM3;
+	}
+	if (modelID==4)
+	{
+		divTerm		   = Columns (distributionNSM4);
+		distribMXS	   = distributionSynM4;
+		distribMXN	   = distributionNSM4;
+	}
+		
+	if (modelID<=2)
+	{
+		rateAssignmentMatrix = {Columns(distribMX)+1,2};
+		for (counter1 = 1; counter1 < Rows (rateAssignmentMatrix); counter1=counter1+1)
+		{
+			rateAssignmentMatrix[counter1][0] = distribMX[0][counter1-1];
+			rateAssignmentMatrix[counter1][1] = rateAssignmentMatrix[counter1-1][1]+distribMX[1][counter1-1];
+		}
+		titleMatrix	= {{"Class","Rate","CDF"}};
+	}
+	else
+	{
+		rateAssignmentMatrixS = {Columns(distribMXS)+1,2};
+		for (counter1 = 1; counter1 < Rows (rateAssignmentMatrixS); counter1=counter1+1)
+		{
+			rateAssignmentMatrixS[counter1][0] = distribMXS[0][counter1-1];
+			rateAssignmentMatrixS[counter1][1] = rateAssignmentMatrixS[counter1-1][1]+distribMXS[1][counter1-1];
+		}
+		rateAssignmentMatrixN = {Columns(distribMXN)+1,2};
+		for (counter1 = 1; counter1 < Rows (rateAssignmentMatrixN); counter1=counter1+1)
+		{
+			rateAssignmentMatrixN[counter1][0] = distribMXN[0][counter1-1];
+			rateAssignmentMatrixN[counter1][1] = rateAssignmentMatrixN[counter1-1][1]+distribMXN[1][counter1-1];
+		}
+		
+		D1 = Columns(distribMXN);
+		D2 = Columns(distribMXS);
+			
+		distribMXR = {2,D1*D2};
+		
+		for (k=0; k<D1; k=k+1)
+		{
+			E = k*D2;
+			for (k2 = 0; k2<D2; k2=k2+1)
+			{
+				distribMXR [0][E+k2] = distribMXN[0][k]/distribMXS[0][k2];
+				distribMXR [1][E+k2] = distribMXN[1][k]*distribMXS[1][k2];
+			}
+		}
+		
+		E = D1*D2;
+		
+		done = 0;
+		
+		while (!done)
+		{
+			done = 1;
+			for (k=1; k<E; k=k+1)
+			{
+				if (distribMXR [0][k] < distribMXR[0][k-1])
+				{
+					D = distribMXR [0][k];
+					distribMXR [0][k] = distribMXR [0][k-1];
+					distribMXR [0][k-1] = D;
+					D = distribMXR [1][k];
+					distribMXR [1][k] = distribMXR [1][k-1];
+					distribMXR [1][k-1] = D;
+					done = 0;
+				}
+				else
+				{
+					if (distribMXR [0][k] == distribMXR[0][k-1])
+					{
+						distribMXR[1][k-1] = distribMXR[1][k-1]+distribMXR[1][k];
+						for (k2=k+1;k2<E;k2=k2+1)
+						{
+							distribMXR[0][k2-1] = distribMXR[0][k2];
+							distribMXR[1][k2-1] = distribMXR[1][k2];
+						}
+						E = E-1;
+					}
+				}
+			}
+		}
+
+		if (E<D1*D2)
+		{
+			ratioInfoSwap = {2,E};
+			for (k=0; k<E; k=k+1)
+			{
+				ratioInfoSwap[0][k] = distribMXR[0][k];
+				ratioInfoSwap[1][k] = distribMXR[1][k];
+			}
+			distribMXR = ratioInfoSwap;
+			ratioInfoSwap = 0;
+		}
+		
+		rateAssignmentMatrixR = {Columns(distribMXR)+1,2};
+		RatioCDFString = "";
+		RatioCDFString * 128;
+		for (counter1 = 1; counter1 < Rows (rateAssignmentMatrixR); counter1=counter1+1)
+		{
+			rateAssignmentMatrixR[counter1][0] = distribMXR[0][counter1-1];
+			rateAssignmentMatrixR[counter1][1] = rateAssignmentMatrixR[counter1-1][1]+distribMXR[1][counter1-1];
+			RatioCDFString * ("+"+distribMXR[1][counter1-1]+"*(_x_>="+distribMXR[0][counter1-1]+")");
+		}
+		RatioCDFString * 0;
+		RatioCDFString = RatioCDFString[1][Abs(RatioCDFString)-1];
+		
+		titleMatrix	= {{"Class","Rate","CDF"}};
+	}
+	
+	if (outputChoice == 0)
+	{
+		if (modelID<=2)
+		{
+			dummy = PrintASCIITable  (rateAssignmentMatrix, titleMatrix);
+		}
+		else
+		{
+			fprintf (stdout, "\nSynonymous CDF\n\n");
+			dummy = PrintASCIITable  (rateAssignmentMatrixS, titleMatrix);
+			fprintf (stdout, "\nNonsynonymous CDF\n\n");
+			dummy = PrintASCIITable  (rateAssignmentMatrixN, titleMatrix);
+			fprintf (stdout, "\nNS/Syn Ratio CDF\n\n");
+			dummy = PrintASCIITable  (rateAssignmentMatrixR, titleMatrix);
+		}
+	}
+	if (outputChoice == 1)
+	{
+		if (modelID<=2)
+		{
+			dummy = PrintTableToFile (rateAssignmentMatrix, titleMatrix,1);
+		}
+		else
+		{
+			SetDialogPrompt ("Export tab separated data to:");
+			fprintf (PROMPT_FOR_FILE,CLEAR_FILE, "\nSynonymous CDF\n\n");
+			dummy = PrintTableToFile  (rateAssignmentMatrixS, titleMatrix,0);
+			fprintf (LAST_FILE_PATH, "\nNonsynonymous CDF\n\n");
+			dummy = PrintTableToFile (rateAssignmentMatrixN, titleMatrix,0);
+			fprintf (LAST_FILE_PATH, "\nNS/Syn Ratio CDF\n\n");
+			dummy = PrintTableToFile  (rateAssignmentMatrixR, titleMatrix,0);
+		}
+	}
+	if (outputChoice == 2)
+	{
+		labelMatrix = {1,Columns(titleMatrix)-1};
+		for (counter1 = 0; counter1 < Columns (labelMatrix); counter1 = counter1+1)
+		{
+			labelMatrix[0][counter1] = titleMatrix[0][counter1+1];
+		}
+		
+		if (modelID<=2)
+		{
+			promptString = "Discrete Rate Distribution for " + modelNamesShort[modelID];
+			OpenWindow (CHARTWINDOW,{{promptString}
+									   {"labelMatrix"},
+									   {"rateAssignmentMatrix"},
+									   {"Step Plot"},
+									   {labelMatrix[0]},
+									   {labelMatrix[1]},
+									   {labelMatrix[0]},
+									   {""},
+									   {labelMatrix[1]},
+									   {"0"}},
+									   "SCREEN_WIDTH-60;SCREEN_HEIGHT-50;30;50");
+		}
+		else
+		{
+			promptString = "Discrete Syn Rate Distribution for " + modelNamesShort[modelID];
+			OpenWindow (CHARTWINDOW,{{promptString}
+									   {"labelMatrix"},
+									   {"rateAssignmentMatrixS"},
+									   {"Step Plot"},
+									   {labelMatrix[0]},
+									   {labelMatrix[1]},
+									   {labelMatrix[0]},
+									   {""},
+									   {labelMatrix[1]},
+									   {"0"}},
+									   "SCREEN_WIDTH/2-20;SCREEN_HEIGHT/2-25;30;50");
+									   
+			promptString = "Discrete Non-Syn Rate Distribution for " + modelNamesShort[modelID];
+			OpenWindow (CHARTWINDOW,{{promptString}
+									   {"labelMatrix"},
+									   {"rateAssignmentMatrixN"},
+									   {"Step Plot"},
+									   {labelMatrix[0]},
+									   {labelMatrix[1]},
+									   {labelMatrix[0]},
+									   {""},
+									   {labelMatrix[1]},
+									   {"0"}},
+									   "SCREEN_WIDTH/2-20;SCREEN_HEIGHT/2-25;SCREEN_WIDTH/2;50");
+									   
+			promptString = "Discrete Non-Syn/Syn Rate Distribution for " + modelNamesShort[modelID];
+			OpenWindow (CHARTWINDOW,{{promptString}
+									   {"labelMatrix"},
+									   {"rateAssignmentMatrixR"},
+									   {"Step Plot"},
+									   {labelMatrix[0]},
+									   {labelMatrix[1]},
+									   {labelMatrix[0]},
+									   {""},
+									   {labelMatrix[1]},
+									   {"0"}},
+									   "SCREEN_WIDTH-60;SCREEN_HEIGHT/2-25;30;50+SCREEN_HEIGHT/2");
+		}
+		
+	}
+	return 1;
+}
+
+/*___________________________________________________________________________________________________________*/
+
+function PadString (padLength,padChar)
+{
+	for (padCounter=0;padCounter<padLength;padCounter=padCounter+1)
+	{
+		fprintf (stdout,padChar);
+	}
+	return padLength;
+}
+
+/*___________________________________________________________________________________________________________*/
+
+function	PrintASCIITable (dataMatrix, titleMatrix)
+{
+	columnWidths = {1,Columns(titleMatrix)};
+	for (counter1=0; counter1<Columns(titleMatrix); counter1 = counter1+1)
+	{
+		counter2 = Abs (titleMatrix[0][counter1])+2;
+		if (counter2<12)
+		{
+			counter2 = 12;
+		}
+		columnWidths[0][counter1] = counter2;
+	}
+	fprintf (stdout, "\n");
+	for (counter2 = 0; counter2 < Columns (titleMatrix); counter2 = counter2+1)
+	{
+		fprintf (stdout,"+-");
+		dummy = PadString (columnWidths[0][counter2],"-");
+		fprintf (stdout,"-");
+	}
+	fprintf (stdout,"+\n| ");
+	
+	for (counter1=0; counter1<Columns(titleMatrix); counter1 = counter1+1)
+	{
+		fprintf (stdout, titleMatrix[counter1]);
+		dummy = PadString (columnWidths[0][counter1]-Abs(titleMatrix[counter1])," ");
+		fprintf (stdout, " | ");
+	}
+	
+	fprintf (stdout, "\n");
+	
+	for (counter1=-1; counter1<Rows(dataMatrix); counter1 = counter1 + 1)
+	{
+		if (counter1>=0)
+		{
+			fprintf (stdout,"| ");
+			fprintf (stdout,Format(counter1+1,columnWidths[0][0],0));
+			for (counter2 = 1; counter2 < Columns (titleMatrix); counter2 = counter2+1)
+			{
+				fprintf (stdout," | ");
+				fprintf (stdout,Format(dataMatrix[counter1][counter2-1],columnWidths[0][counter2],-1));
+			}
+			fprintf (stdout," ");
+			fprintf (stdout, "|\n");
+		}
+		for (counter2 = 0; counter2 < Columns (titleMatrix); counter2 = counter2+1)
+		{
+			fprintf (stdout,"+-");
+			dummy = PadString (columnWidths[0][counter2],"-");
+			fprintf (stdout,"-");
+		}
+		fprintf (stdout, "+\n");
+	}
+	
+	return 1;
+}
+
+/*___________________________________________________________________________________________________________*/
+
+function	PrintTableToFile (dataMatrix, titleMatrix, promptOrNot)
+{
+	SetDialogPrompt ("Export tab separated data to:");
+	
+	if (promptOrNot)
+	{
+		fprintf (PROMPT_FOR_FILE, CLEAR_FILE);
+	}
+	
+	fprintf (LAST_FILE_PATH, titleMatrix[0][0]);
+
+	for (counter1=1; counter1<Columns(titleMatrix); counter1 = counter1+1)
+	{
+		fprintf (LAST_FILE_PATH, "\t", titleMatrix[0][counter1]);
+	}
+	
+	fprintf (LAST_FILE_PATH, "\n");
+
+	for (counter1=0; counter1<Rows(dataMatrix); counter1 = counter1 + 1)
+	{
+		fprintf (LAST_FILE_PATH,counter1+1);
+		for (counter2 = 1; counter2 < Columns (titleMatrix); counter2 = counter2+1)
+		{
+			fprintf (LAST_FILE_PATH,"\t",dataMatrix[counter1][counter2-1]);
+		}
+		fprintf (LAST_FILE_PATH,"\n");
+	}
+	
+	return 1;
+}
+
+/*___________________________________________________________________________________________________________*/
+
+ChoiceList (actionChoice, 					  "Available Actions",1,SKIP_NONE,
+			"Rate classes",		 			  "Compute the rate class assignments at each site for the selected model.",
+			"Rate histogram",	 			  "Compute the rate class histogram for the selected model.",
+			"Posterior rates",	 			  "Compute the posterior distribution of expected rate for the selected model.",
+			"Positive Selection",			  "Compute the posterior probability  of {NS Rate > Syn Rate} at each site for the selected model.",			
+			"Distributions",	 			  "Display discrete rate distribution functions.",
+			"Posterior Ratio",	 			  "Display expected posterior dN/dS ratio for dual rate variation models.",
+			"Find Positively Selected Sites", "Find    positively selected sites.");
+			
+if (actionChoice<0)
+{
+	return;
+}
+
+if ((actionChoice==3)||(actionChoice==6))
+{
+	ChoiceList (psChoice, 					  	  "Detection method",1,SKIP_NONE,
+				"Absolute threshold",		 	  "Use the absolute value for posterior P{N/S>=1}.",
+				"Bayes Factor",	 		  		  "Use the Bayes factor: Posterior Odds P{N/S>=1}/Prior Odds P{N/S>=1}.");
+				
+	if (psChoice<0)
+	{
+		return;
+	}
+}
+
+if ((actionChoice!=3)&&(actionChoice!=5)&&(actionChoice!=6))
+{
+	ChoiceList (modelChoice,"Rate Variation Models",1,SKIP_NONE,
+				"Proportional","Proportional Variable Rates Model: dS and dN vary along the sequence, but dN = R*dS for every site",
+				"Nonsynonymous","Non-synonymous Variable Rates Model: dS = 1 for every site, while dN is drawn from a given distribution.",
+				"Dual","Dual Variable Rates Model: dS and dN are drawn from a bivariate distribution (independent or correlated components).",
+				"Lineage Dual","Lineage+Dual Variable Rates Model:  dS and dN are drawn from a bivariate distribution (independent or correlated components), plus each lineage has an adjustment factor for the E[dN]/E[dS]."
+			    );
+	
+	if (modelChoice<0)
+	{
+		return;
+	}
+}
+else
+{
+	if ((actionChoice == 3)||(actionChoice == 6))
+	{
+		ChoiceList (modelChoice,"Rate Variation Models",1,SKIP_NONE,
+					"Nonsynonymous","Non-synonymous Variable Rates Model: dS = 1 for every site, while dN is drawn from a given distribution.",
+					"Dual","Dual Variable Rates Model: dS and dN are drawn from a bivariate distribution (independent or correlated components). Recommened model.",
+					"Lineage Dual","Lineage+Dual Variable Rates Model:  dS and dN are drawn from a bivariate distribution (independent or correlated components), plus each lineage has an adjustment factor for the E[dN]/E[dS]."
+				    );
+	
+		if (modelChoice<0)
+		{
+			return;
+		}
+		
+		modelChoice = modelChoice+1;
+	}
+	else
+	{
+		ChoiceList (modelChoice,"Rate Variation Models",1,SKIP_NONE,
+					"Dual","Dual Variable Rates Model: dS and dN are drawn from a bivariate distribution (independent or correlated components). Recommened model.",
+					"Lineage Dual","Lineage+Dual Variable Rates Model:  dS and dN are drawn from a bivariate distribution (independent or correlated components), plus each lineage has an adjustment factor for the E[dN]/E[dS]."
+			    );
+	
+		if (modelChoice<0)
+		{
+			return;
+		}
+		
+		modelChoice = modelChoice+2;
+	}	
+}
+
+ChoiceList (outputChoice, "Output Options",1,SKIP_NONE,
+			"ASCII Table",	 "Output is printed to the console as an ASCII table.",
+			"Export to File","Output is spooled to a tab separated file.",
+			"Chart","A HYPHY chart window is displayed (GUI versions only).");
+
+if (outputChoice<0)
+{
+	return;
+}
+			
+if (actionChoice < 2)
+{
+	dummy = ComputeRateClasses 		(modelChoice+1,actionChoice);
+	return;
+}
+
+if (actionChoice == 2)
+{
+	dummy = ComputePosteriorRates 	(modelChoice+1);
+	return;
+}
+
+if (actionChoice == 3)
+{
+	dummy = ComputePositiveSelection(modelChoice+1,0);
+	return;
+}
+
+if (actionChoice == 4)
+{
+	dummy = ComputeCDF				(modelChoice+1);
+	return;
+}
+
+if (actionChoice == 5)
+{
+	dummy = ComputePRatio			(modelChoice+1);
+	return;
+}
+
+if (actionChoice == 6)
+{
+	dummy = ComputePositiveSelection(modelChoice+1,1);
+	return;
+}
diff --git a/res/TemplateBatchFiles/Samplers/lhc.bf b/res/TemplateBatchFiles/Samplers/lhc.bf
new file mode 100644
index 0000000..7edd401
--- /dev/null
+++ b/res/TemplateBatchFiles/Samplers/lhc.bf
@@ -0,0 +1,233 @@
+RequireVersion ("2.220140505");
+
+/*---------------------------------------------------------------------------------------------------------------------*/
+LoadFunctionLibrary ("GrabBag");
+
+varCount = Abs (COVARIANCE_PARAMETER);
+usedVars = Rows(COVARIANCE_PARAMETER);
+
+inflationFactor = prompt_for_a_value ("Inflation factor for profile likelihood bounds", 2.0, 0.0, 1000.0, 0);
+
+fprintf (stdout, "\nObtaining profile likeihood bounds...\n");
+
+svpc = COVARIANCE_PRECISION;
+COVARIANCE_PRECISION = 0.975;
+FindRoot (_std_factor, ZCDF (x) - COVARIANCE_PRECISION, x, 0, 10000);
+
+
+useMPIFlag = MPI_NODE_COUNT > 2 && MPI_NODE_ID == 0 ;
+
+if (useMPIFlag && varCount > 1)
+{
+	availableComputeNodes = Min(MPI_NODE_COUNT - 1,varCount);
+	
+	currentIndex = 0;
+	
+	mapper		 = {};
+	dispatched   = {};
+	
+	for (k = 0; k < varCount; k+=1) {
+		mapper [usedVars[k]] = k;
+	}
+	
+	for (nodeIndex = 0; nodeIndex < availableComputeNodes; nodeIndex += 1) {
+		localCovarianceParameters = {};
+		for (currentIndex = nodeIndex; currentIndex < varCount; currentIndex += availableComputeNodes) {
+			localCovarianceParameters[usedVars[currentIndex]] = 1;
+		}
+		
+		LF_NEXUS_EXPORT_EXTRA = "COVARIANCE_PARAMETER = " + localCovarianceParameters + 
+							  ";\nCOVARIANCE_PRECISION = 0.95;\nCovarianceMatrix (MPI_NEXUS_FILE_RETURN, `LF_NAME`);fprintf (stdout, MPI_NEXUS_FILE_RETURN);";
+		
+		ExecuteCommands ("Export (lfString, `LF_NAME`);");
+		dispatched [nodeIndex+1] = localCovarianceParameters;
+		MPISend (nodeIndex+1, lfString);
+	}
+	
+	covMx = {varCount, 7};
+	
+	for (nodeIndex = 0; nodeIndex < availableComputeNodes; nodeIndex += 1) {
+		MPIReceive  (-1, fromNode, res);
+		Eval ("nodeMx="+res);
+		varNames = Rows(dispatched [fromNode]);
+		for (k = 0; k < Columns (varNames); k+=1)
+		{
+			k2			 = mapper[varNames[k]];
+			for (k3 = 0; k3 < 7; k3+=1) {
+			    covMx [k2][k3] = nodeMx[k][k3];
+			}
+		}
+	}
+}
+else {
+	ExecuteCommands ("CovarianceMatrix (covMx, `LF_NAME`);");
+}
+
+
+profileString = "";
+profileString * 128;
+profileString * "Parameter, Lower Bound, MLE, Upper Bound, Lower LRT Significance, Upper LRT Significance, Effective Lower Bound, Effective Upper Bound";
+for (k=0; k<varCount; k+=1) {
+    profileString * ("\n"+usedVars[k]+","+Join(",", covMx[k][-1]));
+}
+profileString * 0;
+
+k = baseResPath+".profile";
+fprintf (k,CLEAR_FILE,profileString);
+profileString = 0;
+
+
+COVARIANCE_PRECISION = svpc;
+stashedValues = {varCount,4};
+
+assignmentString = "";
+assignmentString * 256;
+
+variableValues     = {};
+
+fscanf ("lhc_supp.ibf", REWIND, "Raw", sampleInstructions);
+
+availableComputeNodes = MPI_NODE_COUNT - 1;
+
+if (useMPIFlag)
+{
+	variablesToExport = {{"SAMPLE_N",
+	                      "SAMPLE_M",
+						  "SAMPLE_LEFT",
+						  "SAMPLE_RIGHT",
+						  "leftSpan",
+						  "leftSTD",
+						  "rightSpan",
+						  "rightSTD",
+						  "currentVarValue"}};
+	MPI_NODE_STATUS = {availableComputeNodes, 1}["-1"];
+}
+
+for (k=0; k<varCount; k+=1) {
+	aKey 			    = usedVars[k];
+	ExecuteCommands ("GetInformation(varRange,"+aKey+")");
+	stashedValues[k][0] = covMx[k][1];
+	/* compute the variance of the approximate normal to the left */
+	
+	FindRoot (_std_factor_left, ZCDF (x) - covMx[k][3], x, 0, 10000);
+	FindRoot (_std_factor_right, ZCDF (x) - covMx[k][4], x, 0, 10000);
+
+	
+	leftSTD 		= (covMx[k][1]-covMx[k][5]) * inflationFactor;
+	rightSTD		= (covMx[k][6]-covMx[k][1]) * inflationFactor;
+	
+	
+	if (leftSTD) {
+		SAMPLE_LEFT = Min(1,(covMx[k][1]-varRange[1])/leftSTD);
+		leftSpan	= Min(covMx[k][1]-varRange[1],leftSTD);
+	}
+	else {
+		SAMPLE_LEFT = 0;
+	}
+	
+	if (rightSTD) {
+		SAMPLE_RIGHT = Min(1,(varRange[2]-covMx[k][1])/rightSTD);
+		rightSpan	 = Min(varRange[2]-covMx[k][1],rightSTD);
+	}
+	else
+	{
+		SAMPLE_RIGHT = 0;
+	}
+	
+	leftSTD = leftSTD / _std_factor_left;
+	rightSTD = rightSTD / _std_factor_right;
+    
+	// (stdout, covMx[k][-1], "\n", _std_factor_left, ":", leftSTD, ":", SAMPLE_LEFT, ":", leftSpan, " // ", _std_factor_right, ":", rightSTD, ":", SAMPLE_RIGHT, ":", rightSpan, "\n");
+	
+	//assert (0);
+
+	currentVarValue     = covMx[k][1];
+	stashedValues[k][1] = Max(covMx[k][1]-(covMx[k][1]-covMx[k][5])*inflationFactor,varRange[1]);
+	stashedValues[k][2] = Min(covMx[k][1]+(covMx[k][6]-covMx[k][1])*inflationFactor,varRange[2]);
+	stashedValues[k][3] = (stashedValues[k][2]-stashedValues[k][1])/SAMPLE_N;
+	assignmentString * (aKey+ "=generatedSamples[itCount]["+k+"];\n");
+
+	if (useMPIFlag && varCount > 1)
+	{
+		stringToExport = exportVarList (variablesToExport) + 
+						 sampleInstructions + 
+						 "return thisVarValues;";
+						 
+						 
+		for (nodeIndex = 0; nodeIndex < availableComputeNodes; nodeIndex += 1)
+		{
+			if (MPI_NODE_STATUS [nodeIndex] < 0)
+			{
+				MPISend (nodeIndex+1, stringToExport);
+				MPI_NODE_STATUS [nodeIndex] = k;
+				fprintf (stdout, "Sending variable ", aKey, " to node ", nodeIndex + 1, "\n");
+				break;
+			}
+		}	
+		if (nodeIndex == availableComputeNodes)
+		{
+			ReceiveLHC (1);
+		}
+	}
+	else
+	{
+		fprintf			(stdout, "Preparing sampling grid for ", aKey, " over [", covMx[k][1] - leftSpan, "-", covMx[k][1] + rightSpan, "]\n");		 
+		ExecuteCommands (sampleInstructions);
+	}
+	
+
+	variableValues[k]   = thisVarValues;
+}
+
+if (useMPIFlag && availableComputeNodes)
+{
+	leftOver = +MPI_NODE_STATUS["_MATRIX_ELEMENT_VALUE_>=0"];
+
+	for (nodeIndex = 0; nodeIndex < leftOver; nodeIndex += 1)
+	{
+		ReceiveLHC (0);
+	}
+}
+
+assignmentString * 0;
+
+//fprintf		(stdout, varCount, "\n", Rows (variableValues), "\n");
+
+varCount	= Rows (covMx);
+generatedSamples = {SAMPLE_N,varCount};
+indexVector		 = {1,SAMPLE_N}["_MATRIX_ELEMENT_COLUMN_"];
+
+fprintf (stdout, "\nDrawing the LHC sample points...\n");
+
+generatedSamples = generatedSamples["(variableValues[_MATRIX_ELEMENT_COLUMN_])[_MATRIX_ELEMENT_ROW_]"];
+generatedSamples = Random(generatedSamples,"LHS");
+
+//fprintf ("/tmp/cubedump.bf", CLEAR_FILE, "generatedSamples = ", generatedSamples, ";\nnames = ", usedVars, ";\n", assignmentString, "\n");
+
+#include "srs.ibf";
+
+//------------------------------------------------------------------------------
+
+function ReceiveLHC (sendOnwards)
+{
+	MPIReceive									(-1, fromNode, res);
+	
+	Eval										("thisVarValue="+res);
+	variableValues								[MPI_NODE_STATUS[fromNode-1]] = thisVarValue;
+	
+	fprintf (stdout, "Received variable ", usedVars[MPI_NODE_STATUS[fromNode-1]], " from node ", fromNode, "\n");
+	
+	if (sendOnwards)
+	{
+		fprintf (stdout, "Sending variable ", aKey, " to node ", fromNode, "\n");
+		MPISend (fromNode, stringToExport);
+		MPI_NODE_STATUS [fromNode-1] = k;	
+	}
+	else
+	{
+		MPI_NODE_STATUS								[fromNode-1] = -1;
+	}
+	
+	return 0;
+}
+
diff --git a/res/TemplateBatchFiles/Samplers/lhc_supp.ibf b/res/TemplateBatchFiles/Samplers/lhc_supp.ibf
new file mode 100644
index 0000000..eab7dd5
--- /dev/null
+++ b/res/TemplateBatchFiles/Samplers/lhc_supp.ibf
@@ -0,0 +1,48 @@
+thisVarValues = {SAMPLE_N,1};
+
+if (SAMPLE_LEFT + SAMPLE_RIGHT)
+{
+	SAMPLE_LEFT  = SAMPLE_N * (SAMPLE_LEFT)/(SAMPLE_LEFT+SAMPLE_RIGHT) $1;
+	SAMPLE_RIGHT = SAMPLE_N - SAMPLE_LEFT;
+
+	if (SAMPLE_LEFT)
+	{
+		if (SAMPLE_LEFT == SAMPLE_N)
+		{
+			SAMPLE_LEFT = SAMPLE_LEFT-1;
+		}
+		
+		weight = 1/SAMPLE_LEFT*(ZCDF (leftSpan/leftSTD)-ZCDF(0));
+		
+		FindRoot(z, ZCDF(x/leftSTD)-0.5-weight,x,0,leftSpan);
+		thisVarValues[SAMPLE_LEFT-1] = z;
+
+		for (ss = SAMPLE_LEFT-2; ss >= 0; ss = ss - 1)
+		{
+			FindRoot(z, ZCDF(x/leftSTD)-ZCDF(thisVarValues[ss+1]/leftSTD)-weight,x,thisVarValues[ss+1],leftSpan);
+			thisVarValues[ss] = z;
+		}
+		for (ss = SAMPLE_LEFT-1; ss >= 0; ss = ss - 1)
+		{
+			thisVarValues[ss] = currentVarValue - thisVarValues[ss];
+		}
+	}	
+	if (SAMPLE_RIGHT)
+	{
+		weight = 1/SAMPLE_RIGHT*(ZCDF (rightSpan/rightSTD)-ZCDF(0));
+		for (ss = SAMPLE_LEFT+1; ss < SAMPLE_N; ss = ss + 1)
+		{
+			FindRoot(z, ZCDF(x/rightSTD)-ZCDF(thisVarValues[ss-1]/rightSTD)-weight,x,thisVarValues[ss-1],rightSpan);
+			thisVarValues[ss] = z;
+		}
+		for (ss = SAMPLE_LEFT+1; ss < SAMPLE_N; ss = ss + 1)
+		{
+			thisVarValues[ss] += currentVarValue;
+		}
+	}	
+}
+else
+{
+	thisVarValues = thisVarValues["currentVarValue"];
+}
+thisVarValues [SAMPLE_LEFT] = currentVarValue;
diff --git a/res/TemplateBatchFiles/Samplers/sir.bf b/res/TemplateBatchFiles/Samplers/sir.bf
new file mode 100644
index 0000000..aa3dbcf
--- /dev/null
+++ b/res/TemplateBatchFiles/Samplers/sir.bf
@@ -0,0 +1,135 @@
+/*---------------------------------------------------------------------------------------------------------------------*/
+
+pi_const = 3.141592653589793;
+
+/*---------------------------------------------------------------------------------------------------------------------*/
+
+function x2ymap (x,l,u, m)
+{	
+	if (m==1)
+		return Log(x-l);
+	else
+	{
+		x = (x-l)/(u-l);
+		return Log(x/(1-x));
+	}
+}
+
+/*---------------------------------------------------------------------------------------------------------------------*/
+
+function  y2xmap (y,l,u, m)
+{
+	if (m==1)
+		return Exp(y)+l;
+	else
+	{
+		x = Exp(y)/(1+Exp(y));
+		return x*(u-l)+l;
+	}
+}
+
+/*---------------------------------------------------------------------------------------------------------------------*/
+
+function CholeskyDecomposition (aMatrix)
+{
+	matrixDim = Rows(aMatrix);
+	_CholeskyL_ 	 =     {matrixDim,matrixDim};
+	for (i=0; i<matrixDim; i=i+1)
+	{
+		for (j=i; j<matrixDim; j=j+1)
+		{
+			k = i-1;
+			for (sum=aMatrix[i][j]; k>=0; k=k-1)
+			{
+				sum = sum - aMatrix[i][k]*aMatrix[j][k];
+			}
+			if (i==j)
+			{
+				if (sum<=0)
+				{
+					fprintf (stdout, "\nMatrix passed to CholeskyDecomposition was not positive definite\n");
+					return 0;
+				}
+				_CholeskyL_[i][i] = Sqrt (sum);
+			}
+			else
+			{
+				_CholeskyL_[j][i] = sum/_CholeskyL_[i][i];
+			}
+		}
+	}
+	return _CholeskyL_;
+}
+
+/*---------------------------------------------------------------------------------------------------------------------*/
+
+varCount = Abs(COVARIANCE_PARAMETER);
+stashedValues = {varCount,4};
+MeanVector    = {varCount,1};
+
+usedVars = Rows(COVARIANCE_PARAMETER);
+
+
+smif = USE_INTERVAL_MAPPING;
+svpc = COVARIANCE_PRECISION;
+USE_INTERVAL_MAPPING = 1;
+COVARIANCE_PRECISION = 2;
+
+ExecuteCommands ("CovarianceMatrix (covMx, "+LF_NAME+");");
+
+COVARIANCE_PRECISION = svpc;
+USE_INTERVAL_MAPPING = smif;
+
+assignmentString = "";
+assignmentString * 256;
+
+for (k=0; k<varCount; k=k+1)
+{
+	aKey = usedVars[k];
+	GetInformation(varInfo,aKey);
+	stashedValues[k][0] = varInfo[0];
+	stashedValues[k][1] = varInfo[1];
+	stashedValues[k][2] = varInfo[2];
+	stashedValues[k][3] = INTERVAL_MAPPING_METHOD[aKey];
+	MeanVector[k] = x2ymap(varInfo[0],varInfo[1],varInfo[2],stashedValues[k][3]);
+	assignmentString * (aKey+ "=generatedSamples[itCount]["+k+"];\n");
+}
+
+assignmentString * 0;
+
+varCount	= Rows (covMx);
+generatedSamples = {SAMPLE_N,varCount};
+
+LT = CholeskyDecomposition(covMx);
+
+
+if (Abs(LT))
+{
+	fprintf (stdout, "Generating approximate normal samples...\n");
+	timer = Time (0);
+	for (itCount = 0; itCount < SAMPLE_N; itCount = itCount + 1)
+	{
+		sampleVector = {varCount,1};
+		
+		for (coord = 0; coord < varCount; coord = coord+1)
+		{
+			_cdfCut = Random(0,1);
+			FindRoot (stdNormal,ZCDF(x)-_cdfCut,x,-10,10);
+			sampleVector[coord] = stdNormal;
+		}
+		
+		sampleVector = LT*sampleVector+MeanVector;
+
+		for (coord = 0; coord < varCount; coord = coord+1)
+		{
+			generatedSamples[itCount][coord] = y2xmap(sampleVector[coord],stashedValues[coord][1],stashedValues[coord][2],stashedValues[coord][3]);
+		}
+		
+		if ((1+itCount) % 500 == 0)
+		{
+			fprintf (stdout, itCount+1, "/", SAMPLE_N, " samples done. Estimated remaining time: ",Format (((SAMPLE_N-itCount-1)/(itCount+1))*(Time(0)-timer),5,2)," seconds \n");
+		}
+	}
+	
+    #include "srs.ibf";
+}
diff --git a/res/TemplateBatchFiles/Samplers/srs.ibf b/res/TemplateBatchFiles/Samplers/srs.ibf
new file mode 100644
index 0000000..ecd0806
--- /dev/null
+++ b/res/TemplateBatchFiles/Samplers/srs.ibf
@@ -0,0 +1,339 @@
+/*___________________________________________________________________________________________________________*/
+
+function	PrintTableToFile (dataMatrix, titleMatrix, promptOrNot)
+{
+	SetDialogPrompt ("Export tab separated data to:");
+	
+	if (promptOrNot)
+	{
+		fprintf (baseResPath, CLEAR_FILE, KEEP_OPEN);
+	}
+	
+	fprintf (baseResPath, "Sample\t", titleMatrix[0][0]);
+
+	for (counter1=1; counter1<Columns(titleMatrix); counter1 = counter1+1)
+	{
+		fprintf (baseResPath, "\t", titleMatrix[0][counter1]);
+	}
+	
+	fprintf (baseResPath, "\n");
+
+	for (counter1=0; counter1<Rows(dataMatrix); counter1 = counter1 + 1)
+	{
+		fprintf (baseResPath,counter1+1);
+		for (counter2 = 0; counter2 < Columns (titleMatrix); counter2 = counter2+1)
+		{
+			fprintf (baseResPath,"\t",dataMatrix[counter1][counter2]);
+		}
+		fprintf (baseResPath,"\n");
+	}
+	if (promptOrNot)
+	{
+		fprintf (baseResPath, CLOSE_FILE);
+	}
+	
+	return 1;
+}
+/*___________________________________________________________________________________________________________*/
+
+
+
+fprintf (stdout, "\n\nComputing likelihood weights (this may take a while)...\n");
+
+scores 				= {SAMPLE_N,2};
+bestScore 			= -1e25;
+extras				= {};
+
+
+timer				= Time (1);
+
+extraPopulator		= 0;
+
+
+if (MPI_NODE_ID == 0 && Abs(_ADD_TO_SRS_) == 2 && Type (_ADD_TO_SRS_) == "AssociativeList")
+{
+	extraPopulator = 1;
+}
+
+if (MPI_NODE_COUNT > 1 && MPI_NODE_ID == 0 && SAMPLE_N >= MPI_NODE_COUNT)
+{
+	PRESERVE_SLAVE_NODE_STATE = 1;
+	samplesPerNode = SAMPLE_N$MPI_NODE_COUNT;
+	nodeRanges	   = {MPI_NODE_COUNT,2};
+	done		   = 0;
+	for (itCount = 1; itCount < MPI_NODE_COUNT;  itCount = itCount + 1)
+	{
+		if (extraPopulator)
+		{
+			LF_NEXUS_EXPORT_EXTRA = _ADD_TO_SRS_["INIT"];
+			LF_EXTRA			  = "(MPI_NEXUS_FILE_RETURN[1])[itCount]=" + _ADD_TO_SRS_["EVAL"] + ";\n";
+		}
+		else
+		{
+			LF_NEXUS_EXPORT_EXTRA = "";
+			LF_EXTRA			  = "";
+		}
+	
+		LF_NEXUS_EXPORT_EXTRA	+= "LFCompute("+
+							    LF_NAME+
+							    ",LF_START_COMPUTE);SAMPLE_N="+
+							    samplesPerNode+
+							    ";assignmentString=\""+
+							    assignmentString+"\";";
+							    
+		from				= done;
+		to					= done+samplesPerNode-1;
+		mpiGenSamples = 	generatedSamples[{{from,0}}][{{to,Columns(generatedSamples)-1}}];
+		LF_NEXUS_EXPORT_EXTRA	= LF_NEXUS_EXPORT_EXTRA + "generatedSamples="+mpiGenSamples+";MPI_NEXUS_FILE_RETURN={};MPI_NEXUS_FILE_RETURN[0]={SAMPLE_N,1};MPI_NEXUS_FILE_RETURN[1]={};\nfor (itCount = 0; itCount < SAMPLE_N; itCount = itCount + 1)\n\t"
+							 +"{ExecuteCommands (assignmentString);LFCompute ("+LF_NAME+",lfWeight);(MPI_NEXUS_FILE_RETURN[0])[itCount]=lfWeight;`LF_EXTRA`}\nLFCompute ("+LF_NAME+",LF_DONE_COMPUTE);\n";
+		
+		ExecuteCommands 	("Export(lfExport,"+LF_NAME+");");
+		
+		MPISend				(itCount, lfExport);
+		
+		done				= done+samplesPerNode;
+		nodeRanges			[itCount][0] = from;
+		nodeRanges			[itCount][1] = to;
+		fprintf				(stdout, "[SENT RANGE ", from+1, " - ", to + 1, " TO MPI NODE ", itCount, "]\n");
+	}
+	ExecuteCommands ("LFCompute ("+LF_NAME+",LF_START_COMPUTE);");
+	toDo = SAMPLE_N-done+1;
+	if (extraPopulator)
+	{
+		ExecuteCommands (_ADD_TO_SRS_["INIT"]);
+	}
+	for (itCount = done; itCount < SAMPLE_N; itCount = itCount + 1)
+	{
+		ExecuteCommands (assignmentString+"LFCompute ("+LF_NAME+",lfWeight);");
+		scores[itCount][0] = lfWeight;
+		if (extraPopulator)
+		{
+			extras[itCount]	   = Eval (_ADD_TO_SRS_["EVAL"]);
+		}
+		if ((1+itCount-done) % 100 == 0)
+		{
+			fprintf (stdout, itCount+1, "/", SAMPLE_N, " evaluations done. Estimated remaining time: ",Format (((SAMPLE_N-itCount-1)/(itCount+1-done))*(Time(1)-timer),5,2)," seconds \n");
+		}
+	}
+	for (itCount = 1; itCount < MPI_NODE_COUNT;  itCount = itCount + 1)
+	{
+		MPIReceive (-1,fromNode,res);
+		ExecuteCommands ("mpiRes="+res);
+		for (sampleCount = 0; sampleCount < Rows(mpiRes[0]); sampleCount = sampleCount + 1)
+		{
+			scores[sampleCount+nodeRanges[fromNode][0]][0] = (mpiRes[0])[sampleCount];
+			extras[sampleCount+nodeRanges[fromNode][0]][0] = (mpiRes[1])[sampleCount];
+		}
+		fprintf				(stdout, "[GOT RANGE ", nodeRanges[fromNode][0]+1, " - ", nodeRanges[fromNode][0]+Rows(mpiRes[0]), " FROM MPI NODE ", fromNode, "]\n");
+	}
+	for (itCount = 0; itCount < SAMPLE_N; itCount = itCount + 1)
+	{
+		bestScore = Max(bestScore,scores[itCount][0]);
+	}
+	fprintf				(stdout, "[BEST SCORE = ",bestScore,"]\n");
+}
+else
+{
+	ExecuteCommands ("LFCompute ("+LF_NAME+",LF_START_COMPUTE);");
+	if (extraPopulator)
+	{
+		ExecuteCommands (_ADD_TO_SRS_["INIT"]);
+	}
+	for (itCount = 0; itCount < SAMPLE_N; itCount = itCount + 1)
+	{
+		ExecuteCommands (assignmentString+"LFCompute ("+LF_NAME+",lfWeight);");
+		scores[itCount][0] = lfWeight;
+		if (extraPopulator)
+		{
+			extras[itCount]	   = Eval (_ADD_TO_SRS_["EVAL"]);
+		}
+				
+		if (sMarginals>1)
+		{
+			ExecuteCommands ("ConstructCategoryMatrix(catmat,"+LF_NAME+",COMPLETE);");	
+			for (sit=0; sit < Columns(catVarList); sit = sit+1)
+			{
+				ExecuteCommands ("GetInformation(catVarInfo," + catVarList[sit] + ");");
+				fprintf (marginalOutFileAll,"\n",catVarInfo);
+			}
+			fprintf (marginalOutFileAll,"\n",catmat);
+			fprintf (marginalOutFileLF, "\n",lfWeight);
+		}
+	
+		if (lfWeight > bestScore)
+		{
+			bestScore = lfWeight;
+		}
+		
+		if ((1+itCount) % 100 == 0)
+		{
+			fprintf (stdout, itCount+1, "/", SAMPLE_N, " evaluations done. Estimated remaining time: ",Format (((SAMPLE_N-itCount-1)/(itCount+1))*(Time(1)-timer),5,2)," seconds \n");
+		}
+	}
+}
+
+/* restore to original values */
+
+for (k=0; k<varCount; k=k+1)
+{
+	aKey = usedVars[k];
+	ExecuteCommands (aKey + "=" + stashedValues[k][0] + ";");
+}	
+
+_resamplerReturn = {};
+_resamplerReturn["RAW_SAMPLES"] = generatedSamples; 
+_resamplerReturn["SCORES"] 		= scores; 
+_resamplerReturn["EXTRAS"]		= 0;
+
+if (extraPopulator)
+{
+	_resamplerReturn["EXTRAS"] = {};
+}
+
+ExecuteCommands ("LFCompute ("+LF_NAME+",LF_DONE_COMPUTE);");
+
+fprintf (stdout, "\n\nResampling...\n");
+coord = 0; /* this is the current sum of all weighting factors */
+for (itCount = 0; itCount < SAMPLE_N; itCount = itCount + 1)
+{
+	scores[itCount][0] = Exp(scores[itCount][0]-bestScore);
+	coord = coord + scores[itCount][0];
+}
+
+N_eff = 0;
+
+for (itCount = 0; itCount < SAMPLE_N; itCount = itCount + 1)
+{
+	N_eff = N_eff + (scores[itCount][0]/coord)^2;
+}
+
+fprintf (stdout, "Estimated effective sample size: ", 1/N_eff, "\n\n");
+
+j = 0;
+sampledPoints = {SAMPLE_M,varCount+1};
+
+timer = Time (1);
+
+if (sMarginals)
+{
+	ExecuteCommands ("LFCompute ("+LF_NAME+",LF_START_COMPUTE);");
+}
+
+/* resampling loop */
+
+for (itCount = 0; itCount < SAMPLE_M; itCount = itCount + 1)
+{
+	sum 				= Random(0,1);
+	runningSum     		= 0;
+	
+	local_scores		= scores;
+	local_scale			= 0;
+	
+	for (k=0; k<SAMPLE_N;k=k+1)
+	{
+		if (scores[k][1] == 0)
+		{
+			local_scores[k][0] = scores[k][0]/(coord-(itCount+1)*scores[k][0]);
+			if (local_scores[k][0] < 0)
+			{
+				local_scores = scores;
+				local_scale  = coord;
+				break;
+			}
+			local_scale = local_scale + local_scores[k][0];
+		}
+	}
+
+	lastValidIndex 		= 0;
+	
+	for (k=0; k<SAMPLE_N && runningSum < sum;k=k+1)
+	{
+		if (local_scores[k][1] == 0)
+		/* can still sample this point */
+		{
+			lastValidIndex = k;
+			runningSum = runningSum + local_scores[k][0] / local_scale; 
+		}
+	}
+			
+	sampledPoints[j][0] = Log(scores[lastValidIndex][0])+bestScore;
+	
+	for (k = 0; k < varCount; k=k+1)
+	{
+		sampledPoints[j][k+1] = generatedSamples[lastValidIndex][k];	
+	}
+	
+	if (extraPopulator)
+	{
+		(_resamplerReturn["EXTRAS"])[j] = extras[lastValidIndex];
+	}
+	
+	coord = coord - scores[lastValidIndex][0];
+	scores[lastValidIndex][1] = 1;
+	j 						  = j+1;
+
+	if (sMarginals)
+	{
+		sit = itCount;
+		itCount = lastValidIndex;
+		ExecuteCommands (assignmentString+"LFCompute ("+LF_NAME+",lfWeight);ConstructCategoryMatrix(catmat,"+LF_NAME+",COMPLETE);");	
+		itCount = sit;
+		for (sit=0; sit < Columns(catVarList); sit = sit+1)
+		{
+			ExecuteCommands ("GetInformation(catVarInfo," + catVarList[sit] + ");");
+			fprintf (marginalOutFile,"\n",catVarInfo);
+		}
+		fprintf (marginalOutFile,"\n",catmat);
+	}
+
+	if ((1+itCount) % 100 == 0)
+	{
+		fprintf (stdout, itCount+1, "/", SAMPLE_M, " samples drawn. Estimated remaining time: ",Format (((SAMPLE_M-itCount-1)/(itCount+1))*(Time(1)-timer),5,2)," seconds \n");
+	}
+}
+
+
+if (sMarginals)
+{
+	for (k=0; k<varCount; k=k+1)
+	{
+		aKey = usedVars[k];
+		ExecuteCommands (aKey + "=" + stashedValues[k][0] + ";");
+	}	
+	ExecuteCommands ("LFCompute ("+LF_NAME+",LF_DONE_COMPUTE);");
+}
+
+
+labelMatrix = {1,varCount+1};
+
+labelMatrix[0] = "-Log(L)";
+
+_resamplerReturn ["LABELS"] = {};
+(_resamplerReturn ["LABELS"])[0] = labelMatrix[0];
+
+for (k = 0; k < varCount; k=k+1)
+{
+	labelMatrix[k+1] = usedVars[k];	
+	(_resamplerReturn ["LABELS"])[k+1] = usedVars[k];
+}
+
+/* open a chart window */
+
+PrintTableToFile (sampledPoints, labelMatrix, 1);
+
+OpenWindow (CHARTWINDOW,{{"Sampled parameter values"}
+					   {"labelMatrix"},
+					   {"sampledPoints"},
+					   {""},
+					   {"Index"},
+					   {""},
+					   {""},
+					   {""},
+					   {""},
+					   {"3"}},
+					   "(SCREEN_WIDTH-200);(SCREEN_HEIGHT-200);80;100");
+		
+
+_resamplerReturn ["VALUES"] = sampledPoints;
+					   
+return _resamplerReturn;
diff --git a/res/TemplateBatchFiles/SandNSAmbigs.bf b/res/TemplateBatchFiles/SandNSAmbigs.bf
new file mode 100644
index 0000000..e48ed50
--- /dev/null
+++ b/res/TemplateBatchFiles/SandNSAmbigs.bf
@@ -0,0 +1,455 @@
+ExecuteAFile  ( HYPHY_LIB_DIRECTORY+"TemplateBatchFiles"+DIRECTORY_SEPARATOR+"TemplateModels"+DIRECTORY_SEPARATOR+"chooseGeneticCode.def");
+
+/*___________________________________________________________________________________________________________*/
+
+_S_NS_POSITIONS_ = {3,64};
+
+hShift = 0;
+
+for (h=0; h<64; h=h+1)
+{
+	myAA = _Genetic_Code[h];
+	
+	if (myAA != 10) /* not a stop codon */
+	{
+		norm_factor  = 0.0;
+		sSites	 	 = 0.0;
+		nsSites 	 = 0.0;
+		
+		/* first position change */
+		/* actual first position */
+		
+		p1 = h$16; /* 0->A, 1->C, 2->G, 3->T */
+		p2 = h%16; /* remainder - i.e. positions 2 and 3*/
+				
+		for (n1 = 0; n1 < 4; n1=n1+1)
+		{
+			if (n1 != p1) /* a change */
+			{
+				/* new codon */
+				nc = n1*16 + p2;
+				newAA = _Genetic_Code[nc];
+				
+				if (newAA!=10) /* not a stop codon */
+				{
+					if (newAA == myAA) /* syn. change */
+					{
+						sSites = sSites + 1;
+					}
+					else
+					{
+						nsSites = nsSites + 1;
+					}
+					norm_factor = norm_factor + 1;
+				}
+			}
+		}
+		
+		if (norm_factor)
+		{
+			_S_NS_POSITIONS_[0][h-hShift] = _S_NS_POSITIONS_[0][h-hShift] + sSites;
+			_S_NS_POSITIONS_[1][h-hShift] = _S_NS_POSITIONS_[1][h-hShift] + nsSites;
+			_S_NS_POSITIONS_[2][h-hShift] = _S_NS_POSITIONS_[2][h-hShift] + norm_factor;
+		}
+		
+		norm_factor  = 0.0;
+		sSites	 	 = 0.0;
+		nsSites 	 = 0.0;
+
+		/* second position change */
+		/* actual second position */
+		
+		p1 = (h%16)$4;
+		p2 = (h$16)*16+h%4; /* remainder - i.e. positions 1 and 3*/
+		
+		for (n1 = 0; n1 < 4; n1=n1+1)
+		{
+			if (n1 != p1) /* a change */
+			{
+				/* new codon */
+				nc = n1*4 + p2;
+				newAA = _Genetic_Code[nc];
+				
+				if (newAA!=10) /* not a stop codon */
+				{
+					if (newAA == myAA) /* syn. change */
+					{
+						sSites = sSites + 1;
+					}
+					else
+					{
+						nsSites = nsSites + 1;
+					}
+					norm_factor = norm_factor + 1;
+				}
+			}
+		}
+
+		/* 3rd position change */
+		/* actual 3rd position */
+		
+		if (norm_factor)
+		{
+			_S_NS_POSITIONS_[0][h-hShift] = _S_NS_POSITIONS_[0][h-hShift] + sSites;
+			_S_NS_POSITIONS_[1][h-hShift] = _S_NS_POSITIONS_[1][h-hShift] + nsSites;
+			_S_NS_POSITIONS_[2][h-hShift] = _S_NS_POSITIONS_[2][h-hShift] + norm_factor;
+		}
+		
+		norm_factor  = 0.0;
+		sSites	 	 = 0.0;
+		nsSites 	 = 0.0;
+
+		p1 = h%4;
+		p2 = (h$4)*4; /* remainder - i.e. positions 1 and 2*/
+		
+		for (n1 = 0; n1 < 4; n1=n1+1)
+		{
+			if (n1 != p1) /* a change */
+			{
+				/* new codon */
+				nc = n1 + p2;
+				newAA = _Genetic_Code[nc];
+				
+				if (newAA!=10) /* not a stop codon */
+				{
+					if (newAA == myAA) /* syn. change */
+					{
+						sSites = sSites + 1;
+					}
+					else
+					{
+						nsSites = nsSites + 1;
+					}
+					norm_factor = norm_factor + 1;
+				}
+			}
+		}
+		
+		if (norm_factor)
+		{
+			_S_NS_POSITIONS_[0][h-hShift] = _S_NS_POSITIONS_[0][h-hShift] + sSites;
+			_S_NS_POSITIONS_[1][h-hShift] = _S_NS_POSITIONS_[1][h-hShift] + nsSites;
+			_S_NS_POSITIONS_[2][h-hShift] = _S_NS_POSITIONS_[2][h-hShift] + norm_factor;
+		}
+	}
+	else
+	{
+		hShift = hShift+1;
+	}
+}
+
+senseCodons = 64-hShift;
+
+/*___________________________________________________________________________________________________________*/
+
+function PadString (padLength,padChar)
+{
+	padString = "";
+	d=padString*padLength;
+	for (padCounter=0;padCounter<padLength;padCounter=padCounter+1)
+	{
+		d=padString*padChar;
+	}
+	d=padString*0;
+	fprintf (stdout,padString);
+	return padString;
+}
+
+
+/*----------------------------------------------------------------------------*/
+
+
+SetDialogPrompt				("Select a data file:");
+
+DataSet		  ds		   = ReadDataFile	(PROMPT_FOR_FILE);
+DataSetFilter filteredData = CreateFilter   (ds,3,"","",GeneticCodeExclusions);
+HarvestFrequencies			  (observedCEFV,filteredData,3,3,0);
+
+hShift = 0;
+
+stateCharCount = 0;
+
+for (k=0; k<64; k=k+1)
+{
+	if (_Genetic_Code[k]!=10)
+	{
+		stateCharCount = stateCharCount + 1;
+	}
+}
+
+hShift = 0;
+
+seqToBranchMap = {stateCharCount,1};
+codeRemap	   = {stateCharCount,1};
+
+for (k=0; k<64; k=k+1)
+{
+	if (_Genetic_Code[k]==10)
+	{
+		hShift = hShift+1;
+	}
+	else
+	{
+		seqToBranchMap[k-hShift] = observedCEFV[k];
+		codeRemap	  [k-hShift] = k;
+	}
+}
+
+observedCEFV = seqToBranchMap;
+
+
+matrixTrick  = {1,stateCharCount};
+matrixTrick2 = {1,stateCharCount};
+
+for (h=Columns(matrixTrick)-1; h>=0; h=h-1)
+{
+	matrixTrick  [h] = h;
+	matrixTrick2 [h] = 1;
+}
+
+ChoiceList (allowed, "Allowed ambiguities",1,SKIP_NONE,
+			"2",	 		"Two way ambiguities only",
+			"2,3", 		 	"Two and three way ambiguities only.",
+			"All",	 		"All ambiguities");
+
+if (allowed < 0)
+{
+	return;
+}
+
+allowedChars = "";
+
+if (allowed == 0)
+{
+	allowedChars = "ACGTUKMRSWY";
+}
+else
+{
+	if (allowed == 1)
+	{
+		allowedChars = "ACGTUKMRSWYBDHV";
+	}
+}
+
+allowedStates = {};
+
+for (v=0; v<Abs(allowedChars); v=v+1)
+{
+	h = allowedChars[v];
+	allowedStates[h] = 1;
+}
+
+SetDialogPrompt				("Specify output file:");
+
+fprintf (PROMPT_FOR_FILE,CLEAR_FILE,"Sequence ,Site, Synonymous Ambigs, Non-Synonymous Ambigs, Ambiguous Codon,Syn neighbors, Non-syn neighbors, Sense neighbors\n");
+
+codonInfo  = {filteredData.species, filteredData.unique_sites};
+
+disallowed  = 0;
+siteLookups = {filteredData.unique_sites, senseCodons};
+
+for (v=0; v<filteredData.unique_sites;v=v+1)
+{
+	for (h=0; h<filteredData.species;h=h+1)
+	{
+		GetDataInfo (siteInfo, filteredData, h, v);
+		_SITE_ES_COUNT = matrixTrick2 * siteInfo; 
+		if (_SITE_ES_COUNT[0] == 1)
+		{
+			siteInfo 		   = matrixTrick * siteInfo;
+			k2 				   = siteInfo[0];
+			codonInfo[h][v]    = k2;
+			siteLookups[v][k2] = 1;
+		}
+		else
+		{
+			codonInfo[h][v] = -1;
+		}
+	}
+}
+
+GetDataInfo    (dupInfo, filteredData);
+GetInformation (sequenceData, filteredData);
+
+_SITE_RESULTS = {4,filteredData.sites};
+
+ambigList 		  = {};
+ambigTabulator	  = {};
+
+fprintf (stdout, "Sequence\tSyn Ambigs\tNon-syn ambigs\tTotal ambigs\n");
+
+
+for (h=0; h<filteredData.species; h=h+1)
+{		
+	outString  = "";
+	outString2 = "";
+	dummy = outString*1024;
+	GetString (seqName,filteredData,h);
+	
+	fprintf (stdout, "\n", seqName,"\t");
+	
+	seqString = sequenceData[h];
+	tsCount    = 0;
+	tnsCount   = 0;
+	
+	for (v=0; v<filteredData.sites;v=v+1)
+	{
+		c2  = dupInfo[v];
+		cd1 = codonInfo [h]  [c2];
+		
+		if (cd1>=0)
+		/* no ambiguities */
+		{
+			outString*(seqName+","+(v+1)+",0,0,No ambiguities,"+_S_NS_POSITIONS_[0][cd1]+","+_S_NS_POSITIONS_[1][cd1]+","+_S_NS_POSITIONS_[2][cd1]+"\n");
+		}	
+		else
+		{
+						
+			aCodon = seqString[v*3][v*3+2];
+			ambigTabulator[aCodon] = ambigTabulator[aCodon]+1;
+			if (Abs(ambigList[aCodon]) == 0)
+			{
+				sCount 	= aCodon[0];
+				nsCount	= aCodon[1];
+				cd1		= aCodon[2];
+				
+				sCount  = allowedStates[sCount];
+				nsCount = allowedStates[nsCount];
+				cd1		= allowedStates[cd1];
+				
+				if ((allowed>1)||(sCount&&nsCount&&cd1))
+				{
+					nsCount = 0;
+					sCount	= 0;
+					sSites  = 0;
+					nsSites = 0;
+					
+					
+					GetDataInfo (ambInfo , filteredData, h, c2);
+					ambInfo  	 = ambInfo$observedCEFV;
+					weightFactor = (matrixTrick2*ambInfo)[0];
+					if (weightFactor)
+					{
+						ambInfo		 = ambInfo * (1/weightFactor);
+						resolutions  = {};
+						for (k=0; k<stateCharCount; k=k+1)
+						{
+							if (ambInfo[k]>0)
+							{
+								resolutions[Abs(resolutions)] = k;
+							}
+						}
+						
+						cd1 = Abs(resolutions);
+						
+						if (cd1)
+						{
+							weightFactor = 0;
+							for (k=0; k<cd1;k=k+1)
+							{
+								f1 = resolutions[k];
+								sSites  = sSites  + _S_NS_POSITIONS_[0][f1];
+								nsSites = nsSites + _S_NS_POSITIONS_[1][f1];
+								c2 = codeRemap [f1];
+								c2 = _Genetic_Code[c2];
+								
+								for (k2=k+1;k2<cd1; k2=k2+1)
+								{
+									f2 = resolutions[k2];
+									
+									dummy = ambInfo[f1]*ambInfo[f2];
+									weightFactor = weightFactor + dummy;
+									
+									f2 = codeRemap[f2];
+																			
+									if (c2 == _Genetic_Code[f2])
+									{
+										sCount = sCount + dummy;
+									}
+									else
+									{
+										nsCount = nsCount + dummy;
+									}
+								}
+							}
+						}
+						
+						sCount = sCount/weightFactor;
+						nsCount = nsCount/weightFactor;
+						sSites  = sSites/cd1;
+						nsSites  = nsSites/cd1;
+					}
+				}
+				else
+				{
+					nsCount = 0;
+					sCount	= 0;
+					sSites  = 0;
+					nsSites = 0;
+					disallowed = disallowed + 1;
+				}
+				
+				cd1 = {5,1};
+				cd1[0] = sCount;
+				cd1[1] = nsCount;
+				cd1[2] = sSites;
+				cd1[3] = nsSites;
+				cd1[4] = 1;
+				ambigList[aCodon] = cd1;
+			}
+			else
+			{
+				cd1 = ambigList[aCodon];
+				sCount  = cd1[0];
+				nsCount = cd1[1];
+				sSites  = cd1[2];
+				nsSites = cd1[3];
+			}
+			
+			outString*(seqName+","+(v+1)+","+sCount+","+nsCount+","+aCodon+","+sSites+","+nsSites+","+(sSites+nsSites)+"\n");
+			tsCount  = tsCount  + sCount;
+			tnsCount = tnsCount + nsCount;
+		}
+	}
+	
+	outString*0;
+	fprintf (LAST_FILE_PATH, outString);
+	fprintf (stdout, tsCount, "\t", tnsCount, "\t", tsCount + tnsCount);
+}
+
+fprintf (stdout, "\n\n");
+
+fprintf (stdout, "\nA total of ", Abs(ambigList), " distinct ambiguous patterns were found\n", disallowed, " were disallowed");
+
+cd1 = Rows(ambigTabulator);
+k 	= Columns (cd1);
+cd2 = {k,2};
+
+for (h=0; h<k; h=h+1)
+{
+	k2  = cd1[h];
+	cd2 [h][0] = h;
+	cd2 [h][1] = ambigTabulator[k2];
+}
+
+cd2 = cd2%1;
+
+fprintf (stdout, "\n\nAmbiguities:\n\n");
+
+for (h=k-1; h>=0; h=h-1)
+{
+	v  = cd2[h][0];
+	k2 = cd1[v];
+	
+	fprintf (stdout, k2);
+	k2 = ambigList [k2];
+	if (k2[2]+k2[3] == 0)
+	{
+		fprintf (stdout, " Disallowed "); 
+	}
+	else
+	{
+		fprintf (stdout, "            "); 
+	}
+	fprintf (stdout, Format(cd2[h][1],10,0), " instances\n");
+}
diff --git a/res/TemplateBatchFiles/SelectionLRT.bf b/res/TemplateBatchFiles/SelectionLRT.bf
new file mode 100644
index 0000000..8be42b7
--- /dev/null
+++ b/res/TemplateBatchFiles/SelectionLRT.bf
@@ -0,0 +1,367 @@
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+
+function BuildCodonFrequencies (obsF)
+{
+	PIStop = 1.0;
+	result = {ModelMatrixDimension,1};
+	hshift = 0;
+
+	for (h=0; h<64; h=h+1)
+	{
+		first = h$16;
+		second = h%16$4;
+		third = h%4;
+		if (_Genetic_Code[h]==10) 
+		{
+			hshift = hshift+1;
+			PIStop = PIStop-obsF[first][0]*obsF[second][1]*obsF[third][2];
+			continue; 
+		}
+		result[h-hshift][0]=obsF[first][0]*obsF[second][1]*obsF[third][2];
+	}
+	return result*(1.0/PIStop);
+}
+
+ModelMatrixDimension = 0;
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function PopulateModelMatrix (ModelMatrixName&, EFV)
+{
+	if (!ModelMatrixDimension)
+	{
+		ModelMatrixDimension = 64;
+		for (h = 0 ;h<64; h=h+1)
+		{
+			if (_Genetic_Code[h]==10)
+			{
+				ModelMatrixDimension = ModelMatrixDimension-1;
+			}
+		}
+	}
+	
+	ModelMatrixName = {ModelMatrixDimension,ModelMatrixDimension}; 
+
+	hshift = 0;
+	
+	modelDefString = "";
+	modelDefString*16384;
+	
+	for (h=0; h<64; h=h+1)
+	{
+		if (_Genetic_Code[h]==10) 
+		{
+			hshift = hshift+1;
+			continue; 
+		}
+		vshift = hshift;
+		for (v = h+1; v<64; v=v+1)
+		{
+			diff = v-h;
+			if (_Genetic_Code[v]==10) 
+			{
+				vshift = vshift+1;
+				continue; 
+			}
+			nucPosInCodon = 2;
+			if ((h$4==v$4)||((diff%4==0)&&(h$16==v$16))||(diff%16==0))
+			{
+				if (h$4==v$4)
+				{
+					transition = v%4;
+					transition2= h%4;
+				}
+				else
+				{
+					if(diff%16==0)
+					{
+						transition = v$16;
+						transition2= h$16;
+						nucPosInCodon = 0;
+					}
+					else
+					{
+						transition = v%16$4;
+						transition2= h%16$4;
+						nucPosInCodon = 1;
+					}
+				}
+				hs = Format(h-hshift,0,0);
+				vs = Format(v-vshift,0,0);
+				ts = Format(transition,0,0);
+				ts2= Format(transition2,0,0);
+				ps = Format(nucPosInCodon,0,0);
+				aa1 = _Genetic_Code[0][h];
+				aa2 = _Genetic_Code[0][v];
+				if (aa1==aa2) 
+				{
+					modelDefString*("ModelMatrixName["+hs+"]["+vs+"] := "+_nucBiasTerms[transition][transition2]+"synRate*EFV__["+ts+"]["+ps+"];\n"+
+													 "ModelMatrixName["+vs+"]["+hs+"] := "+_nucBiasTerms[transition][transition2]+"synRate*EFV__["+ts2+"]["+ps+"];\n");
+				}
+				else
+				{
+					modelDefString*("ModelMatrixName["+hs+"]["+vs+"] := "+_nucBiasTerms[transition][transition2]+"nonSynRate*EFV__["+ts+"]["+ps+"];\n"+
+													 "ModelMatrixName["+vs+"]["+hs+"] := "+_nucBiasTerms[transition][transition2]+"nonSynRate*EFV__["+ts2+"]["+ps+"];\n");	
+				}
+			}
+	    }
+    }		
+	modelDefString*0;
+	ExecuteCommands (modelDefString);
+	return 0;
+}
+
+
+
+
+incFileName = HYPHY_LIB_DIRECTORY+"TemplateBatchFiles"+DIRECTORY_SEPARATOR+"TemplateModels"+DIRECTORY_SEPARATOR+"chooseGeneticCode.def";
+ExecuteCommands  ("#include \""+incFileName+"\";");
+
+SetDialogPrompt 	  		  ("Locate a codon file:");
+DataSet 		ds  		 = ReadDataFile (PROMPT_FOR_FILE);
+DataSetFilter	filteredData = CreateFilter(ds,3,"","",GeneticCodeExclusions);
+
+
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+global AC = 1;
+global AT = 1;
+global CG = 1;
+global CT = 1;
+global GT = 1;
+
+catCounterAL = {totalBranches,1};
+
+MGCustomRateBiasTerms = {{"AC*","","AT*","CG*","CT*","GT*"}};	
+
+done = 0;
+while (!done)
+{
+	fprintf (stdout,"\nPlease enter a 6 character model designation (e.g:010010 defines HKY85):");
+	fscanf  (stdin,"String", modelDesc);
+	if (Abs(modelDesc)==6)
+	{	
+		done = 1;
+	}
+}			
+
+		
+paramCount	  = 0;
+_nucBiasTerms = {4,4};
+_nucBiasTerms[0][0] = "";
+
+
+if (modelDesc[0]==modelDesc[1])
+{
+	MGCustomRateBiasTerms[0] = MGCustomRateBiasTerms[1];
+}
+
+_nucBiasTerms[1][0] = MGCustomRateBiasTerms[0];
+_nucBiasTerms[0][1] = MGCustomRateBiasTerms[0];
+_nucBiasTerms[2][0] = MGCustomRateBiasTerms[1];
+_nucBiasTerms[0][2] = MGCustomRateBiasTerms[1];
+
+h = 0;
+v = 3;
+
+for (customLoopCounter2=2; customLoopCounter2<6; customLoopCounter2=customLoopCounter2+1)
+{
+	for (customLoopCounter=0; customLoopCounter<customLoopCounter2; customLoopCounter=customLoopCounter+1)
+	{
+		if (modelDesc[customLoopCounter]==modelDesc[customLoopCounter2])
+		{
+			_nucBiasTerms[h][v] = MGCustomRateBiasTerms[customLoopCounter];
+			_nucBiasTerms[v][h] = MGCustomRateBiasTerms[customLoopCounter];
+			break;
+		}
+	}
+	if (customLoopCounter == customLoopCounter2)
+	{
+		_nucBiasTerms[h][v] = MGCustomRateBiasTerms[customLoopCounter2];
+		_nucBiasTerms[v][h] = MGCustomRateBiasTerms[customLoopCounter2];
+	}
+	
+	v = v+1;
+	if (v==4)
+	{
+		h=h+1;
+		v=h+1;
+	}
+}
+
+HarvestFrequencies (observedFreq,filteredData,3,1,1);
+
+MG94plain = 0;
+MULTIPLY_BY_FREQS 				= PopulateModelMatrix ("MG94", observedFreq);
+vectorOfFrequencies 			= BuildCodonFrequencies (observedFreq);
+Model MG94_Model		 		= (MG94,vectorOfFrequencies,0);
+
+global 		  dNdS0 = 1;
+
+_DO_TREE_REBALANCE_ = 0;
+incFileName = HYPHY_LIB_DIRECTORY+"TemplateBatchFiles"+DIRECTORY_SEPARATOR+"queryTree.bf";
+ExecuteCommands  ("#include \""+incFileName+"\";");
+
+internalNodes = BranchCount(givenTree);
+
+choiceMatrix = {internalNodes,2};
+
+for (bc=0; bc<internalNodes; bc=bc+1)
+{
+	choiceMatrix[bc][0] = BranchName(givenTree,bc);
+	choiceMatrix[bc][1] = "Internal Branch Rooting " + givenTree[bc];
+}
+
+
+ChoiceList  (bOption,"Choose root of subtree",1,NO_SKIP,choiceMatrix);
+
+if (bOption < 0)
+{
+	return -1;
+}
+
+breakBranch = "givenTree."+BranchName (givenTree,bOption);
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+global dNdS_A 	   = 1;
+global dNdS_B 	   = 1;
+global dNdS_Branch = 1;
+
+ClearConstraints(givenTree);
+ExecuteCommands ("ReplicateConstraint(\"this1.?.nonSynRate:=dNdS_A*this2.?.synRate\","+breakBranch+","+breakBranch+");");
+ReplicateConstraint("this1.?.nonSynRate:=dNdS_B*this2.?.synRate",givenTree,givenTree);
+ExecuteCommands (breakBranch+".nonSynRate:=dNdS_Branch*"+breakBranch+".synRate;");
+
+dNdS_B:=dNdS_A;
+dNdS_Branch:=dNdS_A;
+
+LikelihoodFunction lfNull = (filteredData, givenTree);
+fprintf (stdout, "\nPHASE 1: One dN/dS model\n\n");
+
+Optimize (res000, lfNull);
+
+fprintf (stdout, lfNull, "\n");
+
+COVARIANCE_PARAMETER = "dNdS_A";
+COVARIANCE_PRECISION = 0.95;
+CovarianceMatrix (cmx, lfNull);
+
+fprintf (stdout, "\nError bounds on global dN/dS: ",Format (cmx[0],10,4),"<",Format (cmx[1],10,4),"<",Format (cmx[2],10,4),"\n");
+
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+dNdS_Branch = dNdS_Branch;
+
+fprintf (stdout, "\nPHASE 2: Separating Branch Versus Two Clades\n\n");
+Optimize (res100, lfNull); 
+fprintf (stdout, lfNull, "\n");
+
+COVARIANCE_PARAMETER = "dNdS_A";
+COVARIANCE_PRECISION = 0.95;
+CovarianceMatrix (cmx, lfNull);
+
+fprintf (stdout, "\nError bounds on clades dN/dS: ",Format (cmx[0],10,4),"<",Format (cmx[1],10,4),"<",Format (cmx[2],10,4),"\n");
+
+COVARIANCE_PARAMETER = "dNdS_Branch";
+COVARIANCE_PRECISION = 0.95;
+CovarianceMatrix (cmx, lfNull);
+
+fprintf (stdout, "Error bounds on branch dN/dS: ",Format (cmx[0],10,4),"<",Format (cmx[1],10,4),"<",Format (cmx[2],10,4),"\n");
+
+p1 = 1-CChi2(2*(res100[1][0]-res000[1][0]),1);
+fprintf (stdout, "\nLRT p-value vs the single rate model = ", p1, "\n\n");
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+fprintf (stdout, "\nPHASE 3: Clade A (subtree) and branch vs Clade B\n\n");
+
+dNdS_Branch:=dNdS_A;
+dNdS_B = dNdS_B;
+
+Optimize (res110, lfNull); 
+fprintf (stdout, lfNull, "\n");
+
+
+COVARIANCE_PARAMETER = "dNdS_A";
+COVARIANCE_PRECISION = 0.95;
+CovarianceMatrix (cmx, lfNull);
+fprintf (stdout, "\nError bounds on clade A + branch dN/dS: ",Format (cmx[0],10,4),"<",Format (cmx[1],10,4),"<",Format (cmx[2],10,4),"\n");
+
+COVARIANCE_PARAMETER = "dNdS_B";
+COVARIANCE_PRECISION = 0.95;
+CovarianceMatrix (cmx, lfNull);
+fprintf (stdout, "Error bounds on clade B dN/dS: ",Format (cmx[0],10,4),"<",Format (cmx[1],10,4),"<",Format (cmx[2],10,4),"\n");
+
+p1 = 1-CChi2(2*(res110[1][0]-res000[1][0]),1);
+fprintf (stdout, "\nLRT p-value vs the single rate model = ", p1, "\n\n");
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+dNdS_Branch:=dNdS_B;
+
+fprintf (stdout, "\nPHASE 4: Clade A (subtree) vs branch and Clade B\n\n");
+
+Optimize (res101, lfNull); 
+fprintf (stdout, lfNull, "\n");
+
+COVARIANCE_PARAMETER = "dNdS_A";
+COVARIANCE_PRECISION = 0.95;
+CovarianceMatrix (cmx, lfNull);
+fprintf (stdout, "\nError bounds on clade A dN/dS: ",Format (cmx[0],10,4),"<",Format (cmx[1],10,4),"<",Format (cmx[2],10,4),"\n");
+
+COVARIANCE_PARAMETER = "dNdS_B";
+COVARIANCE_PRECISION = 0.95;
+CovarianceMatrix (cmx, lfNull);
+fprintf (stdout, "Error bounds on clade B + branch dN/dS: ",Format (cmx[0],10,4),"<",Format (cmx[1],10,4),"<",Format (cmx[2],10,4),"\n");
+
+p1 = 1-CChi2(2*(res101[1][0]-res000[1][0]),1);
+fprintf (stdout, "\nLRT p-value vs the single rate model = ", p1, "\n\n");
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+dNdS_Branch = dNdS_Branch;
+
+fprintf (stdout, "\nPHASE 5: Clade A, Clade B and branch\n\n");
+
+Optimize (res111, lfNull); 
+fprintf (stdout, lfNull, "\n");
+
+COVARIANCE_PARAMETER = "dNdS_A";
+COVARIANCE_PRECISION = 0.95;
+CovarianceMatrix (cmx, lfNull);
+
+fprintf (stdout, "\nError bounds on clade A (subtree) dN/dS: ",Format (cmx[0],10,4),"<",Format (cmx[1],10,4),"<",Format (cmx[2],10,4),"\n");
+
+COVARIANCE_PARAMETER = "dNdS_B";
+COVARIANCE_PRECISION = 0.95;
+CovarianceMatrix (cmx, lfNull);
+
+fprintf (stdout, "Error bounds on clade B dN/dS: ",Format (cmx[0],10,4),"<",Format (cmx[1],10,4),"<",Format (cmx[2],10,4),"\n");
+
+COVARIANCE_PARAMETER = "dNdS_Branch";
+COVARIANCE_PRECISION = 0.95;
+CovarianceMatrix (cmx, lfNull);
+
+fprintf (stdout, "Error bounds on branch dN/dS: ",Format (cmx[0],10,4),"<",Format (cmx[1],10,4),"<",Format (cmx[2],10,4),"\n");
+
+p1 = 1-CChi2(2*(res111[1][0]-res000[1][0]),2);
+fprintf (stdout, "\nLRT p-value vs the single rate model = ", p1, "\n\n");
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+
+fprintf (stdout, "\n+-------+",
+				 "\n|SUMMARY|",
+				 "\n+-------+\n");
+
+fprintf (stdout, "\nPHASE 1 AIC: ", Format(2*(res000[1][1]-res000[1][0]),20,5));
+fprintf (stdout, "\nPHASE 2 AIC: ", Format(2*(res100[1][1]-res100[1][0]),20,5));
+fprintf (stdout, "\nPHASE 3 AIC: ", Format(2*(res110[1][1]-res110[1][0]),20,5));
+fprintf (stdout, "\nPHASE 4 AIC: ", Format(2*(res101[1][1]-res101[1][0]),20,5));
+fprintf (stdout, "\nPHASE 5 AIC: ", Format(2*(res111[1][1]-res111[1][0]),20,5),"\n");
+
+
diff --git a/res/TemplateBatchFiles/SeqAlignShared.ibf b/res/TemplateBatchFiles/SeqAlignShared.ibf
new file mode 100644
index 0000000..1c99fc3
--- /dev/null
+++ b/res/TemplateBatchFiles/SeqAlignShared.ibf
@@ -0,0 +1,783 @@
+alignOptions = {};
+
+alignOptions ["SEQ_ALIGN_CHARACTER_MAP"]="ARNDCQEGHILKMFPSTWYV";
+
+ChoiceList (refSeq,"Scoring Matrix",1,SKIP_NONE,"BLOSUM62","Default BLAST BLOSUM62 matrix",
+												"HIV 5%","Empirically derived 5% divergence HIV matrix",
+												"HIV 25%","Empirically derived 25% divergence HIV matrix",
+												"HIV 50%","Empirically derived 50% divergence HIV matrix");
+
+if (refSeq < 0)
+{
+	return 0;
+	
+}
+if (refSeq == 0)
+{
+/*
+# Divergence level: 0.38
+# Matrix from: TeraMonkey:Users:sergei:hyphy:trunk:TemplateBatchFiles:TemplateModels:EmpiricalAA:BLOSUM62
+# Expected score: -0.548341 Entropy: 4.88752 bits
+     A   R   N   D   C   Q   E   G   H   I   L   K   M   F   P   S   T   W   Y   V   B   Z   X   *
+A    6  -3  -4  -4  -2  -2  -2  -1  -3  -3  -3  -2  -2  -4  -2   0  -1  -5  -3  -1  -4  -2  -2  -7
+R   -3   8  -2  -4  -6   0  -2  -5  -2  -6  -4   1  -3  -5  -4  -2  -3  -5  -3  -5  -3  -1  -2  -7
+N   -4  -2   8   0  -5  -1  -2  -2   0  -6  -6  -1  -4  -5  -4   0  -1  -7  -4  -5   6  -2  -2  -7
+D   -4  -4   0   8  -6  -2   0  -3  -3  -5  -6  -2  -6  -6  -3  -1  -3  -7  -6  -6   6   0  -3  -7
+C   -2  -6  -5  -6  10  -5  -7  -5  -5  -3  -3  -6  -3  -5  -5  -2  -2  -4  -4  -2  -5  -6  -4  -7
+Q   -2   0  -1  -2  -5   8   1  -4   0  -6  -4   0  -1  -6  -3  -1  -2  -3  -3  -4  -1   6  -2  -7
+E   -2  -2  -2   0  -7   1   7  -4  -1  -6  -5   0  -4  -6  -3  -1  -2  -5  -4  -4   0   6  -2  -7
+G   -1  -5  -2  -3  -5  -4  -4   7  -4  -7  -6  -3  -5  -5  -4  -2  -4  -4  -5  -6  -2  -4  -4  -7
+H   -3  -2   0  -3  -5   0  -1  -4  10  -6  -5  -2  -3  -3  -4  -2  -4  -5   0  -6  -1  -1  -3  -7
+I   -3  -6  -6  -5  -3  -6  -6  -7  -6   6   0  -5   0  -1  -5  -5  -2  -5  -3   2  -5  -6  -2  -7
+L   -3  -4  -6  -6  -3  -4  -5  -6  -5   0   6  -5   1  -1  -5  -5  -3  -3  -3   0  -6  -5  -2  -7
+K   -2   1  -1  -2  -6   0   0  -3  -2  -5  -5   7  -3  -6  -2  -1  -2  -5  -3  -4  -2   0  -2  -7
+M   -2  -3  -4  -6  -3  -1  -4  -5  -3   0   1  -3   9  -1  -5  -3  -2  -3  -3   0  -5  -2  -1  -7
+F   -4  -5  -5  -6  -5  -6  -6  -5  -3  -1  -1  -6  -1   8  -6  -4  -4   0   1  -3  -6  -6  -3  -7
+P   -2  -4  -4  -3  -5  -3  -3  -4  -4  -5  -5  -2  -5  -6   9  -2  -3  -6  -5  -4  -4  -3  -4  -7
+S    0  -2   0  -1  -2  -1  -1  -2  -2  -5  -5  -1  -3  -4  -2   7   0  -5  -3  -4  -1  -1  -2  -7
+T   -1  -3  -1  -3  -2  -2  -2  -4  -4  -2  -3  -2  -2  -4  -3   0   7  -4  -3  -1  -2  -2  -2  -7
+W   -5  -5  -7  -7  -4  -3  -5  -4  -5  -5  -3  -5  -3   0  -6  -5  -4  12   0  -6  -7  -4  -4  -7
+Y   -3  -3  -4  -6  -4  -3  -4  -5   0  -3  -3  -3  -3   1  -5  -3  -3   0   9  -3  -5  -3  -2  -7
+V   -1  -5  -5  -6  -2  -4  -4  -6  -6   2   0  -4   0  -3  -4  -4  -1  -6  -3   6  -6  -4  -2  -7
+B   -4  -3   6   6  -5  -1   0  -2  -1  -5  -6  -2  -5  -6  -4  -1  -2  -7  -5  -6   7  -1  -3  -7
+Z   -2  -1  -2   0  -6   6   6  -4  -1  -6  -5   0  -2  -6  -3  -1  -2  -4  -3  -4  -1   7  -2  -7
+X   -2  -2  -2  -3  -4  -2  -2  -4  -3  -2  -2  -2  -1  -3  -4  -2  -2  -4  -2  -2  -3  -2  -2  -7
+*   -7  -7  -7  -7  -7  -7  -7  -7  -7  -7  -7  -7  -7  -7  -7  -7  -7  -7  -7  -7  -7  -7  -7   1
+*/
+
+scoreMatrix = 
+	{
+	{                 6,                -3,                -4,                -4,                -2,                -2,                -2,                -1,                -3,                -3,                -3,                -2,                -2,                -4,                -2,                 0,                -1,                -5,                -3,                -1,                -4,                -2,                -2,                -7}
+	{                -3,                 8,                -2,                -4,                -6,                 0,                -2,                -5,                -2,                -6,                -4,                 1,                -3,                -5,                -4,                -2,                -3,                -5,                -3,                -5,                -3,                -1,                -2,                -7}
+	{                -4,                -2,                 8,                 0,                -5,                -1,                -2,                -2,                 0,                -6,                -6,                -1,                -4,                -5,                -4,                 0,                -1,                -7,                -4,                -5,                 6,                -2,                -2,                -7}
+	{                -4,                -4,                 0,                 8,                -6,                -2,                 0,                -3,                -3,                -5,                -6,                -2,                -6,                -6,                -3,                -1,                -3,                -7,                -6,                -6,                 6,                 0,                -3,                -7}
+	{                -2,                -6,                -5,                -6,                10,                -5,                -7,                -5,                -5,                -3,                -3,                -6,                -3,                -5,                -5,                -2,                -2,                -4,                -4,                -2,                -5,                -6,                -4,                -7}
+	{                -2,                 0,                -1,                -2,                -5,                 8,                 1,                -4,                 0,                -6,                -4,                 0,                -1,                -6,                -3,                -1,                -2,                -3,                -3,                -4,                -1,                 6,                -2,                -7}
+	{                -2,                -2,                -2,                 0,                -7,                 1,                 7,                -4,                -1,                -6,                -5,                 0,                -4,                -6,                -3,                -1,                -2,                -5,                -4,                -4,                 0,                 6,                -2,                -7}
+	{                -1,                -5,                -2,                -3,                -5,                -4,                -4,                 7,                -4,                -7,                -6,                -3,                -5,                -5,                -4,                -2,                -4,                -4,                -5,                -6,                -2,                -4,                -4,                -7}
+	{                -3,                -2,                 0,                -3,                -5,                 0,                -1,                -4,                10,                -6,                -5,                -2,                -3,                -3,                -4,                -2,                -4,                -5,                 0,                -6,                -1,                -1,                -3,                -7}
+	{                -3,                -6,                -6,                -5,                -3,                -6,                -6,                -7,                -6,                 6,                 0,                -5,                 0,                -1,                -5,                -5,                -2,                -5,                -3,                 2,                -5,                -6,                -2,                -7}
+	{                -3,                -4,                -6,                -6,                -3,                -4,                -5,                -6,                -5,                 0,                 6,                -5,                 1,                -1,                -5,                -5,                -3,                -3,                -3,                 0,                -6,                -5,                -2,                -7}
+	{                -2,                 1,                -1,                -2,                -6,                 0,                 0,                -3,                -2,                -5,                -5,                 7,                -3,                -6,                -2,                -1,                -2,                -5,                -3,                -4,                -2,                 0,                -2,                -7}
+	{                -2,                -3,                -4,                -6,                -3,                -1,                -4,                -5,                -3,                 0,                 1,                -3,                 9,                -1,                -5,                -3,                -2,                -3,                -3,                 0,                -5,                -2,                -1,                -7}
+	{                -4,                -5,                -5,                -6,                -5,                -6,                -6,                -5,                -3,                -1,                -1,                -6,                -1,                 8,                -6,                -4,                -4,                 0,                 1,                -3,                -6,                -6,                -3,                -7}
+	{                -2,                -4,                -4,                -3,                -5,                -3,                -3,                -4,                -4,                -5,                -5,                -2,                -5,                -6,                 9,                -2,                -3,                -6,                -5,                -4,                -4,                -3,                -4,                -7}
+	{                 0,                -2,                 0,                -1,                -2,                -1,                -1,                -2,                -2,                -5,                -5,                -1,                -3,                -4,                -2,                 7,                 0,                -5,                -3,                -4,                -1,                -1,                -2,                -7}
+	{                -1,                -3,                -1,                -3,                -2,                -2,                -2,                -4,                -4,                -2,                -3,                -2,                -2,                -4,                -3,                 0,                 7,                -4,                -3,                -1,                -2,                -2,                -2,                -7}
+	{                -5,                -5,                -7,                -7,                -4,                -3,                -5,                -4,                -5,                -5,                -3,                -5,                -3,                 0,                -6,                -5,                -4,                12,                 0,                -6,                -7,                -4,                -4,                -7}
+	{                -3,                -3,                -4,                -6,                -4,                -3,                -4,                -5,                 0,                -3,                -3,                -3,                -3,                 1,                -5,                -3,                -3,                 0,                 9,                -3,                -5,                -3,                -2,                -7}
+	{                -1,                -5,                -5,                -6,                -2,                -4,                -4,                -6,                -6,                 2,                 0,                -4,                 0,                -3,                -4,                -4,                -1,                -6,                -3,                 6,                -6,                -4,                -2,                -7}
+	{                -4,                -3,                 6,                 6,                -5,                -1,                 0,                -2,                -1,                -5,                -6,                -2,                -5,                -6,                -4,                -1,                -2,                -7,                -5,                -6,                 7,                -1,                -3,                -7}
+	{                -2,                -1,                -2,                 0,                -6,                 6,                 6,                -4,                -1,                -6,                -5,                 0,                -2,                -6,                -3,                -1,                -2,                -4,                -3,                -4,                -1,                 7,                -2,                -7}
+	{                -2,                -2,                -2,                -3,                -4,                -2,                -2,                -4,                -3,                -2,                -2,                -2,                -1,                -3,                -4,                -2,                -2,                -4,                -2,                -2,                -3,                -2,                -2,                -7}
+	{                -7,                -7,                -7,                -7,                -7,                -7,                -7,                -7,                -7,                -7,                -7,                -7,                -7,                -7,                -7,                -7,                -7,                -7,                -7,                -7,                -7,                -7,                -7,                 1}
+	};
+}
+
+if (refSeq == 1)
+{
+
+// HIV-1 between 5%
+/*
+     A   R   N   D   C   Q   E   G   H   I   L   K   M   F   P   S   T   W   Y   V   B   Z   X   *
+A    8 -13 -16  -8 -15 -17  -8  -7 -16 -14 -14 -17 -16 -20  -7  -7  -2 -23 -23  -4 -10 -10  -8 -24
+R  -13   8 -12 -20 -12  -6 -15  -6  -3 -11 -11  -1  -7 -21  -9  -6  -7 -10 -18 -16 -14  -8  -7 -24
+N  -16 -12   9  -1 -15 -11 -14 -12  -4 -11 -20  -4 -19 -20 -17  -2  -4 -24  -8 -18   7 -12  -7 -24
+D   -8 -20  -1   9 -22 -19  -3  -7  -8 -19 -22 -15 -22 -23 -19 -11 -13 -23 -11  -9   7  -4  -7 -24
+C  -15 -12 -15 -22  11 -23 -23 -10 -13 -19 -15 -21 -22  -3 -20  -5 -10  -7  -4 -12 -17 -23  -9 -24
+Q  -17  -6 -11 -19 -23   8  -7 -17  -4 -20  -8  -4 -13 -20  -5 -15 -13 -20 -15 -20 -12   6  -8 -24
+E   -8 -15 -14  -3 -23  -7   8  -6 -15 -20 -23  -5 -14 -24 -20 -19 -13 -23 -17  -9  -5   6  -9 -24
+G   -7  -6 -12  -7 -10 -17  -6   7 -19 -20 -22 -11 -21 -13 -20  -5 -12  -9 -22 -10  -8  -7  -9 -24
+H  -16  -3  -4  -8 -13  -4 -15 -19  11 -16  -8 -14 -19 -13  -7 -12 -10 -17  -1 -22  -5  -6  -7 -24
+I  -14 -11 -11 -19 -19 -20 -20 -20 -16   7  -4 -13  -3  -6 -17  -9  -3 -22 -15  -1 -12 -20  -7 -24
+L  -14 -11 -20 -22 -15  -8 -23 -22  -8  -4   7 -16  -5  -3  -7 -10 -16 -10 -15  -8 -21 -11  -9 -24
+K  -17  -1  -4 -15 -21  -4  -5 -11 -14 -13 -16   8  -9 -19 -17 -11  -5 -20 -22 -13  -6  -5  -6 -24
+M  -16  -7 -19 -22 -22 -13 -14 -21 -19  -3  -5  -9  11 -13 -20 -18  -5 -16 -23  -4 -20 -14  -7 -24
+F  -20 -21 -20 -23  -3 -20 -24 -13 -13  -6  -3 -19 -13  10 -19 -10 -18 -10  -2 -10 -21 -22  -8 -24
+P   -7  -9 -17 -19 -20  -5 -20 -20  -7 -17  -7 -17 -20 -19   9  -5  -8 -18 -18 -20 -18  -8  -9 -24
+S   -7  -6  -2 -11  -5 -15 -19  -5 -12  -9 -10 -11 -18 -10  -5   8  -3 -19 -11 -16  -4 -17  -7 -24
+T   -2  -7  -4 -13 -10 -13 -13 -12 -10  -3 -16  -5  -5 -18  -8  -3   8 -23 -16 -10  -6 -13  -6 -24
+W  -23 -10 -24 -23  -7 -20 -23  -9 -17 -22 -10 -20 -16 -10 -18 -19 -23  10  -9 -23 -23 -21 -12 -24
+Y  -23 -18  -8 -11  -4 -15 -17 -22  -1 -15 -15 -22 -23  -2 -18 -11 -16  -9  10 -18  -9 -16  -9 -24
+V   -4 -16 -18  -9 -12 -20  -9 -10 -22  -1  -8 -13  -4 -10 -20 -16 -10 -23 -18   8 -11 -11  -7 -24
+B  -10 -14   7   7 -17 -12  -5  -8  -5 -12 -21  -6 -20 -21 -18  -4  -6 -23  -9 -11   8  -6  -8 -24
+Z  -10  -8 -12  -4 -23   6   6  -7  -6 -20 -11  -5 -14 -22  -8 -17 -13 -21 -16 -11  -6   7  -9 -24
+X   -8  -7  -7  -7  -9  -8  -9  -9  -7  -7  -9  -6  -7  -8  -9  -7  -6 -12  -9  -7  -8  -9  -8 -24
+*  -24 -24 -24 -24 -24 -24 -24 -24 -24 -24 -24 -24 -24 -24 -24 -24 -24 -24 -24 -24 -24 -24 -24   1
+*/
+	scoreMatrix = 
+		{
+		{                 8,               -13,               -16,                -8,               -15,               -17,                -8,                -7,               -16,               -14,               -14,               -17,               -16,               -20,                -7,                -7,                -2,               -23,               -23,                -4,               -10,               -10,                -8,               -24}
+		{               -13,                 8,               -12,               -20,               -12,                -6,               -15,                -6,                -3,               -11,               -11,                -1,                -7,               -21,                -9,                -6,                -7,               -10,               -18,               -16,               -14,                -8,                -7,               -24}
+		{               -16,               -12,                 9,                -1,               -15,               -11,               -14,               -12,                -4,               -11,               -20,                -4,               -19,               -20,               -17,                -2,                -4,               -24,                -8,               -18,                 7,               -12,                -7,               -24}
+		{                -8,               -20,                -1,                 9,               -22,               -19,                -3,                -7,                -8,               -19,               -22,               -15,               -22,               -23,               -19,               -11,               -13,               -23,               -11,                -9,                 7,                -4,                -7,               -24}
+		{               -15,               -12,               -15,               -22,                11,               -23,               -23,               -10,               -13,               -19,               -15,               -21,               -22,                -3,               -20,                -5,               -10,                -7,                -4,               -12,               -17,               -23,                -9,               -24}
+		{               -17,                -6,               -11,               -19,               -23,                 8,                -7,               -17,                -4,               -20,                -8,                -4,               -13,               -20,                -5,               -15,               -13,               -20,               -15,               -20,               -12,                 6,                -8,               -24}
+		{                -8,               -15,               -14,                -3,               -23,                -7,                 8,                -6,               -15,               -20,               -23,                -5,               -14,               -24,               -20,               -19,               -13,               -23,               -17,                -9,                -5,                 6,                -9,               -24}
+		{                -7,                -6,               -12,                -7,               -10,               -17,                -6,                 7,               -19,               -20,               -22,               -11,               -21,               -13,               -20,                -5,               -12,                -9,               -22,               -10,                -8,                -7,                -9,               -24}
+		{               -16,                -3,                -4,                -8,               -13,                -4,               -15,               -19,                11,               -16,                -8,               -14,               -19,               -13,                -7,               -12,               -10,               -17,                -1,               -22,                -5,                -6,                -7,               -24}
+		{               -14,               -11,               -11,               -19,               -19,               -20,               -20,               -20,               -16,                 7,                -4,               -13,                -3,                -6,               -17,                -9,                -3,               -22,               -15,                -1,               -12,               -20,                -7,               -24}
+		{               -14,               -11,               -20,               -22,               -15,                -8,               -23,               -22,                -8,                -4,                 7,               -16,                -5,                -3,                -7,               -10,               -16,               -10,               -15,                -8,               -21,               -11,                -9,               -24}
+		{               -17,                -1,                -4,               -15,               -21,                -4,                -5,               -11,               -14,               -13,               -16,                 8,                -9,               -19,               -17,               -11,                -5,               -20,               -22,               -13,                -6,                -5,                -6,               -24}
+		{               -16,                -7,               -19,               -22,               -22,               -13,               -14,               -21,               -19,                -3,                -5,                -9,                11,               -13,               -20,               -18,                -5,               -16,               -23,                -4,               -20,               -14,                -7,               -24}
+		{               -20,               -21,               -20,               -23,                -3,               -20,               -24,               -13,               -13,                -6,                -3,               -19,               -13,                10,               -19,               -10,               -18,               -10,                -2,               -10,               -21,               -22,                -8,               -24}
+		{                -7,                -9,               -17,               -19,               -20,                -5,               -20,               -20,                -7,               -17,                -7,               -17,               -20,               -19,                 9,                -5,                -8,               -18,               -18,               -20,               -18,                -8,                -9,               -24}
+		{                -7,                -6,                -2,               -11,                -5,               -15,               -19,                -5,               -12,                -9,               -10,               -11,               -18,               -10,                -5,                 8,                -3,               -19,               -11,               -16,                -4,               -17,                -7,               -24}
+		{                -2,                -7,                -4,               -13,               -10,               -13,               -13,               -12,               -10,                -3,               -16,                -5,                -5,               -18,                -8,                -3,                 8,               -23,               -16,               -10,                -6,               -13,                -6,               -24}
+		{               -23,               -10,               -24,               -23,                -7,               -20,               -23,                -9,               -17,               -22,               -10,               -20,               -16,               -10,               -18,               -19,               -23,                10,                -9,               -23,               -23,               -21,               -12,               -24}
+		{               -23,               -18,                -8,               -11,                -4,               -15,               -17,               -22,                -1,               -15,               -15,               -22,               -23,                -2,               -18,               -11,               -16,                -9,                10,               -18,                -9,               -16,                -9,               -24}
+		{                -4,               -16,               -18,                -9,               -12,               -20,                -9,               -10,               -22,                -1,                -8,               -13,                -4,               -10,               -20,               -16,               -10,               -23,               -18,                 8,               -11,               -11,                -7,               -24}
+		{               -10,               -14,                 7,                 7,               -17,               -12,                -5,                -8,                -5,               -12,               -21,                -6,               -20,               -21,               -18,                -4,                -6,               -23,                -9,               -11,                 8,                -6,                -8,               -24}
+		{               -10,                -8,               -12,                -4,               -23,                 6,                 6,                -7,                -6,               -20,               -11,                -5,               -14,               -22,                -8,               -17,               -13,               -21,               -16,               -11,                -6,                 7,                -9,               -24}
+		{                -8,                -7,                -7,                -7,                -9,                -8,                -9,                -9,                -7,                -7,                -9,                -6,                -7,                -8,                -9,                -7,                -6,               -12,                -9,                -7,                -8,                -9,                -8,               -24}
+		{               -24,               -24,               -24,               -24,               -24,               -24,               -24,               -24,               -24,               -24,               -24,               -24,               -24,               -24,               -24,               -24,               -24,               -24,               -24,               -24,               -24,               -24,               -24,                 1}
+		};
+
+}
+
+if (refSeq == 2)
+{
+
+// HIV-1 between 25%
+/*
+# Divergence level: 0.25
+# Matrix from: TeraMonkey:Users:sergei:hyphy:trunk:TemplateBatchFiles:TemplateModels:EmpiricalAA:HIVBetween
+# Expected score: -1.40621 Entropy: 5.90658 bits
+     A   R   N   D   C   Q   E   G   H   I   L   K   M   F   P   S   T   W   Y   V   B   Z   X   *
+A    7  -7  -7  -4 -10 -11  -4  -3 -10  -6  -9  -9  -7 -13  -3  -2   1 -16 -15   0  -5  -5  -3 -17
+R   -7   7  -5 -11  -8  -2  -7  -2   0  -6  -6   2  -3 -12  -4  -2  -2  -5  -9 -10  -7  -3  -3 -17
+N   -7  -5   8   2  -9  -6  -6  -7   0  -6 -12   0 -10 -12  -9   1   0 -17  -3 -10   6  -6  -3 -17
+D   -4 -11   2   8 -14 -10   0  -2  -3 -11 -15  -7 -13 -15 -13  -5  -6 -16  -6  -5   7   0  -3 -17
+C  -10  -8  -9 -14  11 -16 -15  -5  -7 -11  -9 -13 -14   0 -12  -1  -6  -2   0  -8 -10 -16  -5 -17
+Q  -11  -2  -6 -10 -16   8  -2 -10   0 -12  -4   0  -8 -12  -1  -9  -8 -14  -9 -13  -7   6  -4 -17
+E   -4  -7  -6   0 -15  -2   7  -1  -9 -12 -15  -1 -10 -17 -13 -11  -8 -15 -12  -5   0   6  -4 -17
+G   -3  -2  -7  -2  -5 -10  -1   7 -10 -11 -14  -6 -12  -9 -11  -1  -7  -5 -14  -5  -4  -3  -4 -17
+H  -10   0   0  -3  -7   0  -9 -10  10 -10  -4  -5 -10  -6  -3  -6  -6 -11   2 -14  -1  -2  -3 -17
+I   -6  -6  -6 -11 -11 -12 -12 -11 -10   7   0  -7   0  -2 -10  -4   0 -14  -9   2  -7 -12  -2 -17
+L   -9  -6 -12 -15  -9  -4 -15 -14  -4   0   6 -10   0   0  -3  -5  -8  -6  -8  -4 -13  -6  -4 -17
+K   -9   2   0  -7 -13   0  -1  -6  -5  -7 -10   7  -4 -14  -9  -5  -1 -12 -13  -9  -1  -1  -2 -17
+M   -7  -3 -10 -13 -14  -8 -10 -12 -10   0   0  -4  10  -7 -11  -9  -1 -11 -15   0 -11  -9  -3 -17
+F  -13 -12 -12 -15   0 -12 -17  -9  -6  -2   0 -14  -7  10 -11  -5 -10  -5   1  -5 -13 -14  -3 -17
+P   -3  -4  -9 -13 -12  -1 -13 -11  -3 -10  -3  -9 -11 -11   8  -1  -3 -13 -11 -12 -10  -3  -5 -17
+S   -2  -2   1  -5  -1  -9 -11  -1  -6  -4  -5  -5  -9  -5  -1   8   0 -12  -6  -9   0 -10  -3 -17
+T    1  -2   0  -6  -6  -8  -8  -7  -6   0  -8  -1  -1 -10  -3   0   7 -16 -10  -4  -2  -8  -2 -17
+W  -16  -5 -17 -16  -2 -14 -15  -5 -11 -14  -6 -12 -11  -5 -13 -12 -16  10  -4 -16 -16 -14  -8 -17
+Y  -15  -9  -3  -6   0  -9 -12 -14   2  -9  -8 -13 -15   1 -11  -6 -10  -4  10 -12  -4 -10  -4 -17
+V    0 -10 -10  -5  -8 -13  -5  -5 -14   2  -4  -9   0  -5 -12  -9  -4 -16 -12   7  -7  -7  -3 -17
+B   -5  -7   6   7 -10  -7   0  -4  -1  -7 -13  -1 -11 -13 -10   0  -2 -16  -4  -7   7  -2  -4 -17
+Z   -5  -3  -6   0 -16   6   6  -3  -2 -12  -6  -1  -9 -14  -3 -10  -8 -14 -10  -7  -2   6  -4 -17
+X   -3  -3  -3  -3  -5  -4  -4  -4  -3  -2  -4  -2  -3  -3  -5  -3  -2  -8  -4  -3  -4  -4  -3 -17
+*  -17 -17 -17 -17 -17 -17 -17 -17 -17 -17 -17 -17 -17 -17 -17 -17 -17 -17 -17 -17 -17 -17 -17   1
+
+*/
+	scoreMatrix = 
+	{
+	{                 7,                -7,                -7,                -4,               -10,               -11,                -4,                -3,               -10,                -6,                -9,                -9,                -7,               -13,                -3,                -2,                 1,               -16,               -15,                 0,                -5,                -5,                -3,               -17}
+	{                -7,                 7,                -5,               -11,                -8,                -2,                -7,                -2,                 0,                -6,                -6,                 2,                -3,               -12,                -4,                -2,                -2,                -5,                -9,               -10,                -7,                -3,                -3,               -17}
+	{                -7,                -5,                 8,                 2,                -9,                -6,                -6,                -7,                 0,                -6,               -12,                 0,               -10,               -12,                -9,                 1,                 0,               -17,                -3,               -10,                 6,                -6,                -3,               -17}
+	{                -4,               -11,                 2,                 8,               -14,               -10,                 0,                -2,                -3,               -11,               -15,                -7,               -13,               -15,               -13,                -5,                -6,               -16,                -6,                -5,                 7,                 0,                -3,               -17}
+	{               -10,                -8,                -9,               -14,                11,               -16,               -15,                -5,                -7,               -11,                -9,               -13,               -14,                 0,               -12,                -1,                -6,                -2,                 0,                -8,               -10,               -16,                -5,               -17}
+	{               -11,                -2,                -6,               -10,               -16,                 8,                -2,               -10,                 0,               -12,                -4,                 0,                -8,               -12,                -1,                -9,                -8,               -14,                -9,               -13,                -7,                 6,                -4,               -17}
+	{                -4,                -7,                -6,                 0,               -15,                -2,                 7,                -1,                -9,               -12,               -15,                -1,               -10,               -17,               -13,               -11,                -8,               -15,               -12,                -5,                 0,                 6,                -4,               -17}
+	{                -3,                -2,                -7,                -2,                -5,               -10,                -1,                 7,               -10,               -11,               -14,                -6,               -12,                -9,               -11,                -1,                -7,                -5,               -14,                -5,                -4,                -3,                -4,               -17}
+	{               -10,                 0,                 0,                -3,                -7,                 0,                -9,               -10,                10,               -10,                -4,                -5,               -10,                -6,                -3,                -6,                -6,               -11,                 2,               -14,                -1,                -2,                -3,               -17}
+	{                -6,                -6,                -6,               -11,               -11,               -12,               -12,               -11,               -10,                 7,                 0,                -7,                 0,                -2,               -10,                -4,                 0,               -14,                -9,                 2,                -7,               -12,                -2,               -17}
+	{                -9,                -6,               -12,               -15,                -9,                -4,               -15,               -14,                -4,                 0,                 6,               -10,                 0,                 0,                -3,                -5,                -8,                -6,                -8,                -4,               -13,                -6,                -4,               -17}
+	{                -9,                 2,                 0,                -7,               -13,                 0,                -1,                -6,                -5,                -7,               -10,                 7,                -4,               -14,                -9,                -5,                -1,               -12,               -13,                -9,                -1,                -1,                -2,               -17}
+	{                -7,                -3,               -10,               -13,               -14,                -8,               -10,               -12,               -10,                 0,                 0,                -4,                10,                -7,               -11,                -9,                -1,               -11,               -15,                 0,               -11,                -9,                -3,               -17}
+	{               -13,               -12,               -12,               -15,                 0,               -12,               -17,                -9,                -6,                -2,                 0,               -14,                -7,                10,               -11,                -5,               -10,                -5,                 1,                -5,               -13,               -14,                -3,               -17}
+	{                -3,                -4,                -9,               -13,               -12,                -1,               -13,               -11,                -3,               -10,                -3,                -9,               -11,               -11,                 8,                -1,                -3,               -13,               -11,               -12,               -10,                -3,                -5,               -17}
+	{                -2,                -2,                 1,                -5,                -1,                -9,               -11,                -1,                -6,                -4,                -5,                -5,                -9,                -5,                -1,                 8,                 0,               -12,                -6,                -9,                 0,               -10,                -3,               -17}
+	{                 1,                -2,                 0,                -6,                -6,                -8,                -8,                -7,                -6,                 0,                -8,                -1,                -1,               -10,                -3,                 0,                 7,               -16,               -10,                -4,                -2,                -8,                -2,               -17}
+	{               -16,                -5,               -17,               -16,                -2,               -14,               -15,                -5,               -11,               -14,                -6,               -12,               -11,                -5,               -13,               -12,               -16,                10,                -4,               -16,               -16,               -14,                -8,               -17}
+	{               -15,                -9,                -3,                -6,                 0,                -9,               -12,               -14,                 2,                -9,                -8,               -13,               -15,                 1,               -11,                -6,               -10,                -4,                10,               -12,                -4,               -10,                -4,               -17}
+	{                 0,               -10,               -10,                -5,                -8,               -13,                -5,                -5,               -14,                 2,                -4,                -9,                 0,                -5,               -12,                -9,                -4,               -16,               -12,                 7,                -7,                -7,                -3,               -17}
+	{                -5,                -7,                 6,                 7,               -10,                -7,                 0,                -4,                -1,                -7,               -13,                -1,               -11,               -13,               -10,                 0,                -2,               -16,                -4,                -7,                 7,                -2,                -4,               -17}
+	{                -5,                -3,                -6,                 0,               -16,                 6,                 6,                -3,                -2,               -12,                -6,                -1,                -9,               -14,                -3,               -10,                -8,               -14,               -10,                -7,                -2,                 6,                -4,               -17}
+	{                -3,                -3,                -3,                -3,                -5,                -4,                -4,                -4,                -3,                -2,                -4,                -2,                -3,                -3,                -5,                -3,                -2,                -8,                -4,                -3,                -4,                -4,                -3,               -17}
+	{               -17,               -17,               -17,               -17,               -17,               -17,               -17,               -17,               -17,               -17,               -17,               -17,               -17,               -17,               -17,               -17,               -17,               -17,               -17,               -17,               -17,               -17,               -17,                 1}
+	};
+
+
+}
+
+if (refSeq == 3)
+{
+/*
+# Divergence level: 0.5
+# Matrix from: TeraMonkey:Users:sergei:hyphy:trunk:TemplateBatchFiles:TemplateModels:EmpiricalAA:HIVBetween
+# Expected score: -0.849814 Entropy: 4.53171 bits
+     A   R   N   D   C   Q   E   G   H   I   L   K   M   F   P   S   T   W   Y   V   B   Z   X   *
+A    7  -5  -4  -2  -7  -8  -2  -1  -8  -2  -6  -5  -4  -9  -1  -1   2 -13 -12   1  -3  -4  -2 -13
+R   -5   6  -2  -7  -6   0  -4   0   1  -4  -4   3  -1  -9  -3   0  -1  -4  -6  -7  -4  -1  -1 -13
+N   -4  -2   7   3  -6  -3  -3  -4   0  -4  -8   0  -7  -8  -5   2   0 -13  -2  -7   6  -3  -1 -13
+D   -2  -7   3   8 -10  -6   2  -1  -1  -8 -12  -4 -10 -11  -9  -2  -4 -12  -4  -4   6   0  -2 -13
+C   -7  -6  -6 -10  11 -12 -12  -3  -4  -7  -6  -9 -10   2  -8   0  -4   0   1  -6  -7 -12  -3 -13
+Q   -8   0  -3  -6 -12   7  -1  -7   1  -8  -2   0  -6  -8   0  -6  -5 -11  -6 -10  -5   5  -2 -13
+E   -2  -4  -3   2 -12  -1   7   0  -6  -8 -11   0  -7 -13  -9  -7  -5 -12  -9  -3   0   5  -2 -13
+G   -1   0  -4  -1  -3  -7   0   7  -7  -8 -10  -3  -9  -7  -8   0  -4  -3 -10  -4  -2  -1  -3 -13
+H   -8   1   0  -1  -4   1  -6  -7   9  -7  -2  -2  -7  -3  -1  -3  -4  -8   3 -10   0  -1  -1 -13
+I   -2  -4  -4  -8  -7  -8  -8  -8  -7   6   0  -5   2   0  -7  -3   0 -11  -7   3  -5  -8  -1 -13
+L   -6  -4  -8 -12  -6  -2 -11 -10  -2   0   6  -7   0   1  -1  -4  -5  -4  -5  -1 -10  -5  -3 -13
+K   -5   3   0  -4  -9   0   0  -3  -2  -5  -7   6  -3 -11  -6  -2   0  -9  -9  -6   0   0  -1 -13
+M   -4  -1  -7 -10 -10  -6  -7  -9  -7   2   0  -3  10  -4  -7  -6   0  -9 -10   1  -8  -6  -1 -13
+F   -9  -9  -8 -11   2  -8 -13  -7  -3   0   1 -11  -4   9  -7  -4  -7  -3   3  -3  -9 -10  -2 -13
+P   -1  -3  -5  -9  -8   0  -9  -8  -1  -7  -1  -6  -7  -7   8   0  -1 -11  -8  -8  -7  -2  -3 -13
+S   -1   0   2  -2   0  -6  -7   0  -3  -3  -4  -2  -6  -4   0   7   1  -9  -4  -6   0  -6  -1 -13
+T    2  -1   0  -4  -4  -5  -5  -4  -4   0  -5   0   0  -7  -1   1   6 -12  -7  -1   0  -5  -1 -13
+W  -13  -4 -13 -12   0 -11 -12  -3  -8 -11  -4  -9  -9  -3 -11  -9 -12  10  -2 -12 -12 -11  -6 -13
+Y  -12  -6  -2  -4   1  -6  -9 -10   3  -7  -5  -9 -10   3  -8  -4  -7  -2   9  -9  -3  -7  -3 -13
+V    1  -7  -7  -4  -6 -10  -3  -4 -10   3  -1  -6   1  -3  -8  -6  -1 -12  -9   6  -5  -5  -1 -13
+B   -3  -4   6   6  -7  -5   0  -2   0  -5 -10   0  -8  -9  -7   0   0 -12  -3  -5   7   0  -2 -13
+Z   -4  -1  -3   0 -12   5   5  -1  -1  -8  -5   0  -6 -10  -2  -6  -5 -11  -7  -5   0   6  -3 -13
+X   -2  -1  -1  -2  -3  -2  -2  -3  -1  -1  -3  -1  -1  -2  -3  -1  -1  -6  -3  -1  -2  -3  -2 -13
+*  -13 -13 -13 -13 -13 -13 -13 -13 -13 -13 -13 -13 -13 -13 -13 -13 -13 -13 -13 -13 -13 -13 -13   1
+
+*/
+	scoreMatrix = 
+	{
+	{                 7,                -5,                -4,                -2,                -7,                -8,                -2,                -1,                -8,                -2,                -6,                -5,                -4,                -9,                -1,                -1,                 2,               -13,               -12,                 1,                -3,                -4,                -2,               -13}
+	{                -5,                 6,                -2,                -7,                -6,                 0,                -4,                 0,                 1,                -4,                -4,                 3,                -1,                -9,                -3,                 0,                -1,                -4,                -6,                -7,                -4,                -1,                -1,               -13}
+	{                -4,                -2,                 7,                 3,                -6,                -3,                -3,                -4,                 0,                -4,                -8,                 0,                -7,                -8,                -5,                 2,                 0,               -13,                -2,                -7,                 6,                -3,                -1,               -13}
+	{                -2,                -7,                 3,                 8,               -10,                -6,                 2,                -1,                -1,                -8,               -12,                -4,               -10,               -11,                -9,                -2,                -4,               -12,                -4,                -4,                 6,                 0,                -2,               -13}
+	{                -7,                -6,                -6,               -10,                11,               -12,               -12,                -3,                -4,                -7,                -6,                -9,               -10,                 2,                -8,                 0,                -4,                 0,                 1,                -6,                -7,               -12,                -3,               -13}
+	{                -8,                 0,                -3,                -6,               -12,                 7,                -1,                -7,                 1,                -8,                -2,                 0,                -6,                -8,                 0,                -6,                -5,               -11,                -6,               -10,                -5,                 5,                -2,               -13}
+	{                -2,                -4,                -3,                 2,               -12,                -1,                 7,                 0,                -6,                -8,               -11,                 0,                -7,               -13,                -9,                -7,                -5,               -12,                -9,                -3,                 0,                 5,                -2,               -13}
+	{                -1,                 0,                -4,                -1,                -3,                -7,                 0,                 7,                -7,                -8,               -10,                -3,                -9,                -7,                -8,                 0,                -4,                -3,               -10,                -4,                -2,                -1,                -3,               -13}
+	{                -8,                 1,                 0,                -1,                -4,                 1,                -6,                -7,                 9,                -7,                -2,                -2,                -7,                -3,                -1,                -3,                -4,                -8,                 3,               -10,                 0,                -1,                -1,               -13}
+	{                -2,                -4,                -4,                -8,                -7,                -8,                -8,                -8,                -7,                 6,                 0,                -5,                 2,                 0,                -7,                -3,                 0,               -11,                -7,                 3,                -5,                -8,                -1,               -13}
+	{                -6,                -4,                -8,               -12,                -6,                -2,               -11,               -10,                -2,                 0,                 6,                -7,                 0,                 1,                -1,                -4,                -5,                -4,                -5,                -1,               -10,                -5,                -3,               -13}
+	{                -5,                 3,                 0,                -4,                -9,                 0,                 0,                -3,                -2,                -5,                -7,                 6,                -3,               -11,                -6,                -2,                 0,                -9,                -9,                -6,                 0,                 0,                -1,               -13}
+	{                -4,                -1,                -7,               -10,               -10,                -6,                -7,                -9,                -7,                 2,                 0,                -3,                10,                -4,                -7,                -6,                 0,                -9,               -10,                 1,                -8,                -6,                -1,               -13}
+	{                -9,                -9,                -8,               -11,                 2,                -8,               -13,                -7,                -3,                 0,                 1,               -11,                -4,                 9,                -7,                -4,                -7,                -3,                 3,                -3,                -9,               -10,                -2,               -13}
+	{                -1,                -3,                -5,                -9,                -8,                 0,                -9,                -8,                -1,                -7,                -1,                -6,                -7,                -7,                 8,                 0,                -1,               -11,                -8,                -8,                -7,                -2,                -3,               -13}
+	{                -1,                 0,                 2,                -2,                 0,                -6,                -7,                 0,                -3,                -3,                -4,                -2,                -6,                -4,                 0,                 7,                 1,                -9,                -4,                -6,                 0,                -6,                -1,               -13}
+	{                 2,                -1,                 0,                -4,                -4,                -5,                -5,                -4,                -4,                 0,                -5,                 0,                 0,                -7,                -1,                 1,                 6,               -12,                -7,                -1,                 0,                -5,                -1,               -13}
+	{               -13,                -4,               -13,               -12,                 0,               -11,               -12,                -3,                -8,               -11,                -4,                -9,                -9,                -3,               -11,                -9,               -12,                10,                -2,               -12,               -12,               -11,                -6,               -13}
+	{               -12,                -6,                -2,                -4,                 1,                -6,                -9,               -10,                 3,                -7,                -5,                -9,               -10,                 3,                -8,                -4,                -7,                -2,                 9,                -9,                -3,                -7,                -3,               -13}
+	{                 1,                -7,                -7,                -4,                -6,               -10,                -3,                -4,               -10,                 3,                -1,                -6,                 1,                -3,                -8,                -6,                -1,               -12,                -9,                 6,                -5,                -5,                -1,               -13}
+	{                -3,                -4,                 6,                 6,                -7,                -5,                 0,                -2,                 0,                -5,               -10,                 0,                -8,                -9,                -7,                 0,                 0,               -12,                -3,                -5,                 7,                 0,                -2,               -13}
+	{                -4,                -1,                -3,                 0,               -12,                 5,                 5,                -1,                -1,                -8,                -5,                 0,                -6,               -10,                -2,                -6,                -5,               -11,                -7,                -5,                 0,                 6,                -3,               -13}
+	{                -2,                -1,                -1,                -2,                -3,                -2,                -2,                -3,                -1,                -1,                -3,                -1,                -1,                -2,                -3,                -1,                -1,                -6,                -3,                -1,                -2,                -3,                -2,               -13}
+	{               -13,               -13,               -13,               -13,               -13,               -13,               -13,               -13,               -13,               -13,               -13,               -13,               -13,               -13,               -13,               -13,               -13,               -13,               -13,               -13,               -13,               -13,               -13,                 1}
+	};
+
+}
+
+
+alignOptions ["SEQ_ALIGN_SCORE_MATRIX"] = 	scoreMatrix[{{0,0}}][{{19,19}}];
+alignOptions ["SEQ_ALIGN_GAP_OPEN"]		= 	40;
+alignOptions ["SEQ_ALIGN_GAP_OPEN2"]	= 	20;
+alignOptions ["SEQ_ALIGN_GAP_EXTEND"]	= 	10;
+alignOptions ["SEQ_ALIGN_GAP_EXTEND2"]	= 	5;
+alignOptions ["SEQ_ALIGN_AFFINE"]		=   1;
+
+ChoiceList (refSeq,"Prefix/Suffix Indels",1,SKIP_NONE,"No penalty","Do not penalize prefix and suffix Indels","Normal penalty","Treat prefix and suffix indels as any other indels");
+if (refSeq < 0)
+{
+	return 0;
+}
+
+alignOptions ["SEQ_ALIGN_NO_TP"]		=   1-refSeq;
+
+if (_skipPredefsSeqAlignShared == 0)
+{
+	predefSeqNames = {{"First in file", "Use the first sequence in the data file as a reference"}
+					  {"Longest in file", "Use the longest sequence in the data file as the reference"}
+					 /*0*/ {"HXB2_env", "Use HIV-1 HXB2 reference strain envelope sequence (K03455)"}
+					 /*1*/ {"HXB2_nef", "Use HIV-1 HXB2 reference strain NEF sequence (K03455)"}
+					 /*2*/ {"HXB2_gag", "Use HIV-1 HXB2 reference strain gag sequence (K03455)"} 
+					 /*3*/ {"HXB2_vpr", "Use HIV-1 HXB2 reference strain vpr sequence (K03455)"} 
+					 /*4*/ {"HXB2_vif", "Use HIV-1 HXB2 reference strain vif sequence (K03455)"} 
+					 /*5*/ {"HXB2_vpu", "Use HIV-1 HXB2 reference strain vpu sequence (K03455)"} 
+					 /*6*/ {"HXB2_pr", "Use HIV-1 HXB2 reference strain protease sequence (K03455)"} 
+					 /*7*/ {"HXB2_rt", "Use HIV-1 HXB2 reference strain reverse transcriptase sequence (K03455)"} 
+					 /*8*/ {"HXB2_int", "Use HIV-1 HXB2 reference strain integrase sequence (K03455)"} 
+					 /*9*/ {"HXB2_rev", "Use HIV-1 HXB2 reference strain rev (exons 1 and 2)sequence (K03455)"} 
+					/*10*/ {"HXB2_tat", "Use HIV-1 HXB2 reference strain tat (exons 1 and 2) sequence (K03455)"} 
+					/*11*/ {"HXB2_prrt", "Use HIV-1 HXB2 reference strain protease+rt sequence (K03455)"}
+					/*12*/ {"NL4_3prrt", "Use HIV-1 NL4-3 reference strain pr+rt sequence"} 
+					/*13*/ {"HXB2_pol",  "Use HIV-1 HXB2 reference strain pol (starting at pr) sequence (K03455)"}
+									  };
+					  
+					  
+	predefSeqNames2 = {{"No", "No reference coordinate sequences"}
+					 /*0*/ {"HXB2_env", "Use HIV-1 HXB2 reference strain envelope sequence (K03455)"}
+					 /*1*/ {"HXB2_nef", "Use HIV-1 HXB2 reference strain NEF sequence (K03455)"}
+					 /*2*/ {"HXB2_gag", "Use HIV-1 HXB2 reference strain gag sequence (K03455)"} 
+					 /*3*/ {"HXB2_vpr", "Use HIV-1 HXB2 reference strain vpr sequence (K03455)"} 
+					 /*4*/ {"HXB2_vif", "Use HIV-1 HXB2 reference strain vif sequence (K03455)"} 
+					 /*5*/ {"HXB2_vpu", "Use HIV-1 HXB2 reference strain vpu sequence (K03455)"} 
+					 /*6*/ {"HXB2_pr", "Use HIV-1 HXB2 reference strain protease sequence (K03455)"} 
+					 /*7*/ {"HXB2_rt", "Use HIV-1 HXB2 reference strain reverse transcriptase sequence (K03455)"} 
+					 /*8*/ {"HXB2_int", "Use HIV-1 HXB2 reference strain integrase sequence (K03455)"} 
+					 /*9*/ {"HXB2_rev", "Use HIV-1 HXB2 reference strain rev (exons 1 and 2)sequence (K03455)"} 
+					/*10*/ {"HXB2_tat", "Use HIV-1 HXB2 reference strain tat (exons 1 and 2) sequence (K03455)"} 
+					/*11*/ {"HXB2_prrt", "Use HIV-1 HXB2 reference strain protease+rt sequence (K03455)"} 
+					/*12*/ {"NL4_3prrt", "Use HIV-1 NL4-3 reference strain pr+rt sequence"} 
+					/*13*/ {"HXB2_pol",  "Use HIV-1 HXB2 reference strain pol (starting at pr) sequence (K03455)"}
+					  };
+	
+	RefSeqs = {};
+	RefSeqs [0] = "ATGAGAGTGAAGGAGAAATATCAGCACTTGTGGAGATGGGGGTGGAGATGGGGCACCATGCTCCTTGGGATGTTGATGATCTGTAGTGCTACAGAAAAATTGTGGGTCACAGTCTATTATGGGGTACCTGTGTGGAAGGAAGCAACCACCACTCTATTTTGTGCATCAGATGCTAAAGCATATGATACAGAGGTACATAATGTTTGGGCCACACATGCCTGTGTACCCACAGACCCCAACCCACAAGAAGTAGTATTGGTAAATGTGACAGAAAATTTTAACATGTGGAAAAATGACATGGTAGAACAGATGCATGAGGATATAATCAGTTTATGGGATCAAAGCCTAAAGCCATGTGTAAAATTAACCCCACTCTGTGTTAGTTTAAAGTGCACTGATTTGAAGAATGATACTAATACCAATAGTAGTAGCGGGAGAATGATAATGGAGAAAGGAGAGATAAAAAACTGCTCTTT [...]
+	RefSeqs [1] = "ATGGGTGGCAAGTGGTCAAAAAGTAGTGTGATTGGATGGCCTACTGTAAGGGAAAGAATGAGACGAGCTGAGCCAGCAGCAGATAGGGTGGGAGCAGCATCTCGAGACCTGGAAAAACATGGAGCAATCACAAGTAGCAATACAGCAGCTACCAATGCTGCTTGTGCCTGGCTAGAAGCACAAGAGGAGGAGGAGGTGGGTTTTCCAGTCACACCTCAGGTACCTTTAAGACCAATGACTTACAAGGCAGCTGTAGATCTTAGCCACTTTTTAAAAGAAAAGGGGGGACTGGAAGGGCTAATTCACTCCCAAAGAAGACAAGATATCCTTGATCTGTGGATCTACCACACACAAGGCTACTTCCCTGAT---CAGAACTACACACCAGGGCCAGGGGTCAGATATCCACTGACCTTTGGATGGTGCTACAAGCTAGTACCAGTTGAGCCAGATAAGATAGAAGAGGCCAATAAAGG [...]
+	RefSeqs [2] = "ATGGGTGCGAGAGCGTCAGTATTAAGCGGGGGAGAATTAGATCGATGGGAAAAAATTCGGTTAAGGCCAGGGGGAAAGAAAAAATATAAATTAAAACATATAGTATGGGCAAGCAGGGAGCTAGAACGATTCGCAGTTAATCCTGGCCTGTTAGAAACATCAGAAGGCTGTAGACAAATACTGGGACAGCTACAACCATCCCTTCAGACAGGATCAGAAGAACTTAGATCATTATATAATACAGTAGCAACCCTCTATTGTGTGCATCAAAGGATAGAGATAAAAGACACCAAGGAAGCTTTAGACAAGATAGAGGAAGAGCAAAACAAAAGTAAGAAAAAAGCACAGCAAGCAGCAGCTGACACAGGACACAGCAATCAGGTCAGCCAAAATTACCCTATAGTGCAGAACATCCAGGGGCAAATGGTACATCAGGCCATATCACCTAGAACTTTAAATGCATGGGTAAAAGTAGT [...]
+	RefSeqs [3] = "ATGGAACAAGCCCCAGAAGACCAAGGGCCACAGAGGGAGCCACACAATGAATGGACACTAGAGCTTTTAGAGGAGCTTAAGAATGAAGCTGTTAGACATTTTCCTAGGATTTGGCTCCATGGCTTAGGGCAACATATCTATGAAACTTATGGGGATACTTGGGCAGGAGTGGAAGCCATAATAAGAATTCTGCAACAACTGCTGTTTATCCATTTTCAGAATTGGGTGTCGACA---CAGAATAGGCGTTACTCGACAGAGGAGAGCAAGAAATGGAGCCAG---ATC";				  
+	RefSeqs [4] = "ATGGAAAACAGATGGCAGGTGATGATTGTGTGGCAAGTAGACAGGATGAGGATTAGAACATGGAAAAGTTTAGTAAAACACCATATGTATGTTTCAGGGAAAGCTAGGGGATGGTTTTATAGACATCACTATGAAAGCCCTCATCCAAGAATAAGTTCAGAAGTACACATCCCACTAGGGGATGCTAGATTGGTAATAACAACATATTGGGGTCTGCATACAGGAGAAAGAGACTGGCATTTGGGTCAGGGAGTCTCCATAGAATGGAGGAAAAAGAGATATAGCACACAAGTAGACCCTGAACTAGCAGACCAACTAATTCATCTGTATTACTTTGACTGTTTTTCAGACTCTGCTATAAGAAAGGCCTTATTAGGACACATAGTTAGCCCTAGGTGTGAATATCAAGCAGGACATAACAAGGTAGGATCTCTACAATACTTGGCACTAGCAGCATTAATAACACCAAAAAAGAT [...]
+	RefSeqs [5] = "ACGCAACCTATACCAATAGTAGCAATAGTAGCATTAGTAGTAGCAATAATAATAGCAATAGTTGTGTGGTCCATAGTAATCATAGAATATAGGAAAATATTAAGACAAAGAAAAATAGACAGGTTAATTGATAGACTAATAGAAAGAGCAGAAGACAGTGGCAATGAGAGTGAAGGAGAAATATCAGCACTTGTGGAGATGGGGGTGGAGATGGGGCACCATGCTCCTTGGGATGTTGATGATC";				  
+	RefSeqs [6] = "CCTCAGGTCACTCTTTGGCAACGACCCCTCGTCACAATAAAGATAGGGGGGCAACTAAAGGAAGCTCTATTAGATACAGGAGCAGATGATACAGTATTAGAAGAAATGAGTTTGCCAGGAAGATGGAAACCAAAAATGATAGGGGGAATTGGAGGTTTTATCAAAGTAAGACAGTATGATCAGATACTCATAGAAATCTGTGGACATAAAGCTATAGGTACAGTATTAGTAGGACCTACACCTGTCAACATAATTGGAAGAAATCTGTTGACTCAGATTGGTTGCACTTTAAATTTT";				  
+	RefSeqs [7] = "CCCATTAGCCCTATTGAGACTGTACCAGTAAAATTAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAATAAAAGCATTAGTAGAAATTTGTACAGAGATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAAGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGATGGAAAGGATCACCAGCAAT [...]
+	RefSeqs [8] = "TTTTTAGATGGAATAGATAAGGCCCAAGATGAACATGAGAAATATCACAGTAATTGGAGAGCAATGGCTAGTGATTTTAACCTGCCACCTGTAGTAGCAAAAGAAATAGTAGCCAGCTGTGATAAATGTCAGCTAAAAGGAGAAGCCATGCATGGACAAGTAGACTGTAGTCCAGGAATATGGCAACTAGATTGTACACATTTAGAAGGAAAAGTTATCCTGGTAGCAGTTCATGTAGCCAGTGGATATATAGAAGCAGAAGTTATTCCAGCAGAAACAGGGCAGGAAACAGCATATTTTCTTTTAAAATTAGCAGGAAGATGGCCAGTAAAAACAATACATACTGACAATGGCAGCAATTTCACCGGTGCTACGGTTAGGGCCGCCTGTTGGTGGGCGGGAATCAAGCAGGAATTTGGAATTCCCTACAATCCCCAAAGTCAAGGAGTAGTAGAATCTATGAATAAAGAATTAAA [...]
+	RefSeqs [9] = "ATGGCAGGAAGAAGCGGAGACAGCGACGAAGAGCTCATCAGAACAGTCAGACTCATCAAGCTTCTCTAACCCACCTCCCAACCCCGAGGGGACCCGACAGGCCCGAAGGAATAGAAGAAGAAGGTGGAGAGAGAGACAGAGACAGATCCATTCGATTAGTGAACGGATCCTTGGCACTTATCTGGGACGATCTGCGGAGCCTGTGCCTCTTCAGCTACCACCGCTTGAGAGACTTACTCTTGATTGTAACGAGGATTGTGGAACTTCTGGGACGCAGGGGGTGGGAAGCCCTCAAATATTGGTGGAATCTCCTACAGTATTGGAGTCAGGAACTAAAGA";
+	RefSeqs[10] = "ATGGAGCCAGTAGATCCTAGACTAGAGCCCTGGAAGCATCCAGGAAGTCAGCCTAAAACTGCTTGTACCAATTGCTATTGTAAAAAGTGTTGCTTTCATTGCCAAGTTTGTTTCATAACAAAAGCCTTAGGCATCTCCTATGGCAGGAAGAAGCGGAGACAGCGACGAAGAGCTCATCAGAACAGTCAGACTCATCAAGCTTCTCTATCAAAGCAACCCACCTCCCAACCCCGAGGGGACCCGACAGGCCCGAAGGAATAGAAGAAGAAGGTGGAGAGAGAGACAGAGACAGATCCATTCGAT";
+	RefSeqs[11] = "CCTCAGGTCACTCTTTGGCAACGACCCCTCGTCACAATAAAGATAGGGGGGCAACTAAAGGAAGCTCTATTAGATACAGGAGCAGATGATACAGTATTAGAAGAAATGAGTTTGCCAGGAAGATGGAAACCAAAAATGATAGGGGGAATTGGAGGTTTTATCAAAGTAAGACAGTATGATCAGATACTCATAGAAATCTGTGGACATAAAGCTATAGGTACAGTATTAGTAGGACCTACACCTGTCAACATAATTGGAAGAAATCTGTTGACTCAGATTGGTTGCACTTTAAATTTTCCCATTAGCCCTATTGAGACTGTACCAGTAAAATTAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAATAAAAGCATTAGTAGAAATTTGTACAGAGATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGT [...]
+	RefSeqs[12] = "CCTCAGATCACTCTTTGGCAGCGACCCCTCGTCACAATAAAGATAGGGGGGCAATTAAAGGAAGCTCTATTAGATACAGGAGCAGATGATACAGTATTAGAAGAAATGAATTTGCCAGGAAGATGGAAACCAAAAATGATAGGGGGAATTGGAGGTTTTATCAAAGTAGGACAGTATGATCAGATACTCATAGAAATCTGCGGACATAAAGCTATAGGTACAGTATTAGTAGGACCTACACCTGTCAACATAATTGGAAGAAATCTGTTGACTCAGATTGGCTGCACTTTAAATTTTCCCATTAGTCCTATTGAGACTGTACCAGTAAAATTAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAATAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGT [...]
+	RefSeqs[13] = "CCTCAGGTCACTCTTTGGCAACGACCCCTCGTCACAATAAAGATAGGGGGGCAACTAAAGGAAGCTCTATTAGATACAGGAGCAGATGATACAGTATTAGAAGAAATGAGTTTGCCAGGAAGATGGAAACCAAAAATGATAGGGGGAATTGGAGGTTTTATCAAAGTAAGACAGTATGATCAGATACTCATAGAAATCTGTGGACATAAAGCTATAGGTACAGTATTAGTAGGACCTACACCTGTCAACATAATTGGAAGAAATCTGTTGACTCAGATTGGTTGCACTTTAAATTTTCCCATTAGCCCTATTGAGACTGTACCAGTAAAATTAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAATAAAAGCATTAGTAGAAATTTGTACAGAGATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGT [...]
+	
+	ChoiceList (refSeq,"Choose a reference sequence",1,SKIP_NONE,predefSeqNames);
+	if (refSeq < 0)
+	{
+		return 0;
+	}
+}
+
+//---------------------------------------------------------------------------------------------------------------------
+
+function _handleAlignment (dataSetName, writeToFiles)
+{
+	result = {};
+
+	ExecuteCommands	("DataSetFilter  _alignmentHandlerFilter 	= CreateFilter	("+dataSetName+",1);");
+	GetInformation (UnalignedSeqs,_alignmentHandlerFilter );
+	
+	//preprocess sequences 
+
+	unalSequenceCount = Rows(UnalignedSeqs)*Columns(UnalignedSeqs);
+	GetString (sequenceNames, unal, -1);
+
+	longestSequence   	= 0;
+	longestSequenceIDX	= 0;
+
+	for (seqCounter = 0; seqCounter < unalSequenceCount; seqCounter = seqCounter+1)
+	{
+		UnalignedSeqs[seqCounter] = ((UnalignedSeqs[seqCounter]^{{"[^a-zA-Z]",""}})^{{"^N+",""}})^{{"N+$",""}};
+		
+		if (doLongestSequence)
+		{
+			if (doLongestSequence == 1 || seqCounter != unalSequenceCount-1)
+			{
+				if (Abs (UnalignedSeqs[seqCounter]) > longestSequence)
+				{
+					longestSequence    = Abs (UnalignedSeqs[seqCounter]);
+					longestSequenceIDX = seqCounter;
+				}
+			}
+		}
+	}
+
+	if (doLongestSequence)
+	{
+		fprintf			 (stdout, "\nSelected sequence ", sequenceNames[longestSequenceIDX], " as reference.");
+		if (longestSequenceIDX > 0)
+		{
+			p1 				 = UnalignedSeqs[0];
+			UnalignedSeqs[0] = UnalignedSeqs[longestSequenceIDX];
+			UnalignedSeqs[longestSequenceIDX] = p1;
+			p1 				 = sequenceNames[0];
+			sequenceNames[0] = sequenceNames[longestSequenceIDX];
+			sequenceNames[longestSequenceIDX] = p1;
+		}
+	}
+
+
+
+	/* determine reading frames	*/
+	ProteinSequences = {};
+	AllTranslations  = {};
+	ReadingFrames	 = {};
+	StopCodons		 = {};
+	StopPositions    = {};
+	didRC			 = {};
+
+	fprintf (stdout, "\nDetecting reading frames for each sequence...\n");
+	frameCounter  = {3,1};
+	stillHasStops = {};
+
+	for (seqCounter = 0; seqCounter < unalSequenceCount; seqCounter += 1)
+	{
+		aSeq   = UnalignedSeqs[seqCounter];
+		seqLen = Abs(aSeq)-2;
+		
+		minStops = 1e20;
+		tString  = "";
+		rFrame   = 0;
+		
+		for (rc = 0; rc <= doRC; rc += 1)
+		{
+			stopPosn = {3,2};
+			allTran  = {3,1};
+			if (rc)
+			{
+				aSeq = nucleotideReverseComplement (aSeq)
+			}
+			for (offset = 0; offset < 3; offset += 1)
+			{
+				translString = translateCodonToAA (aSeq, codonToAAMap, offset);
+				stopPos = translString||"X";
+				if (stopPos[0]>=0)
+				{
+					stopCount = Rows(stopPos)$2;
+					stopPosn[offset][0] = stopPos[0];
+					stopPosn[offset][1] = stopPos[stopCount*2-1];
+				}
+				else
+				{
+					stopCount = 0;
+				}
+				if (stopCount<minStops)
+				{
+					if (rc)
+					{
+						UnalignedSeqs[seqCounter] = aSeq;
+						didRC[seqCounter]		  = 1;
+					}
+					minStops = stopCount;
+					rFrame   = offset;
+					tString  = translString;
+				}
+				allTran[offset] = translString;
+			}
+		}
+		
+		ReadingFrames[seqCounter] 		= rFrame;
+		ProteinSequences[seqCounter]	= tString;
+		frameCounter[rFrame] 			= frameCounter[rFrame]+1;
+		StopPositions[seqCounter]		= stopPosn;
+		AllTranslations [seqCounter]	= allTran;
+		
+		if (minStops>0)
+		{
+			stillHasStops[Abs(stillHasStops)] = seqCounter;
+			assert (seqCounter > 0, "Reference sequence must not contain frameshifts\n");
+		}
+	}
+
+	s1 = ProteinSequences[0];
+
+	fprintf (stdout, "\nFound:\n\t", frameCounter[0], 
+					 " sequences in reading frame 1\n\t",frameCounter[1], 
+					 " sequences in reading frame 2\n\t",frameCounter[2], 
+					 " sequences in reading frame 3\n\n",
+					 "There were ", Abs(stillHasStops), " sequences with apparent frameshift/sequencing errors\n");
+
+	skipSeqs = {};
+
+	for (k=0; k<Abs(stillHasStops); k += 1)
+	{
+		seqCounter = stillHasStops[k];
+		seqName = sequenceNames[seqCounter];
+		fprintf (stdout,"Sequence ", seqCounter+1, " (", seqName, ") seems to have");
+		stopPosn = StopPositions[seqCounter];
+		
+		fStart = -1;
+		fEnd   = -1;
+		fMin   = 1e10;
+		frame1 = 0;
+		frame2 = 0;
+		
+		checkFramePosition (stopPosn[0][1],stopPosn[1][0],0,1);
+		checkFramePosition (stopPosn[1][1],stopPosn[0][0],1,0);
+		checkFramePosition (stopPosn[0][1],stopPosn[2][0],0,2);
+		checkFramePosition (stopPosn[2][1],stopPosn[0][0],2,0);
+		checkFramePosition (stopPosn[2][1],stopPosn[1][0],2,1);
+		checkFramePosition (stopPosn[1][1],stopPosn[2][0],1,2);
+		
+		if (fStart>=0)
+		{
+			allTran = AllTranslations[seqCounter];
+			useq    				   = UnalignedSeqs[seqCounter];
+			fprintf (stdout, " a shift from frame ", frame2+1, " to frame ", frame1+1, " between a.a. positions ", fStart, " and ", fEnd, ".");
+			fStart2 = Max(fStart-1,0);
+			fEnd2   = Min(fEnd+1,Min(Abs(allTran[frame1]),Abs(allTran[frame2]))-1);
+			tempString = allTran[frame2];
+			fprintf (stdout, "\n\tRegion ", fStart2, "-", fEnd2, " in frame  ", frame2+1, ":\n\t", tempString[fStart2][fEnd2]);
+			fprintf (stdout, "\n\t", useq[3*fStart2+frame2][3*fEnd2+frame2-1]);
+			tempString = allTran[frame1];
+			fprintf (stdout, "\n\tRegion ", fStart2, "-", fEnd2, " in frame  ", frame1+1, ":\n\t", tempString[fStart2][fEnd2]);
+			fprintf (stdout, "\n\t", useq[3*fStart2+frame1][3*fEnd2+frame1-1]);
+			fprintf (stdout, "\n\t\tAttempting to resolve by alignment to reference. ");
+			
+			f1s = allTran[frame1];
+			f2s = allTran[frame2];
+			f1l = Abs(f1s);
+			
+			bestScore  = -1e10;
+			bestSplice = -1;
+			
+			for (k2=fStart; k2<fEnd; k2=k2+1)
+			{
+				s2 = f2s[0][k2]+f1s[k2+1][Abs(f1s)];
+				inStr = {{s1,s2}};
+				AlignSequences(aligned, inStr, alignOptions);
+				aligned = aligned[0];
+				aligned = aligned[0];
+				if (aligned > bestScore)
+				{
+					bestScore = aligned;
+					bestSplice = k2;
+					bestString = s2;
+				}
+			}
+			fprintf (stdout, "Best splice site appears to be at a.a. position ", bestSplice, "\n");
+			/* update best spliced string */
+			
+			ProteinSequences[seqCounter] = bestString;
+			ReadingFrames[seqCounter]    = 0;
+			
+			UnalignedSeqs[seqCounter]  = useq[frame2][frame2+3*bestSplice+2] + useq[frame1+3*bestSplice+3][Abs(useq)-1] + "---";
+		}
+		else
+		{
+			
+			fprintf (stdout, " multiple frameshifts\n");
+			skipSeqs[seqCounter] = 1;
+		}	
+	}
+
+	SeqAlignments 	 = {};
+	startingPosition = {unalSequenceCount,2};
+	refLength = Abs(ProteinSequences[0]);
+	refInsertions	 = {refLength+1,1};
+
+	fprintf (stdout,"\nPerforming pairwise alignment with reference sequences\n");
+
+	alignmentScores = {};
+
+	for (seqCounter = 1; seqCounter < unalSequenceCount; seqCounter += 1)
+	{
+		if (skipSeqs[seqCounter] == 0)
+		{
+			s2 			 = ProteinSequences[seqCounter];
+			inStr 		 = {{s1,s2}};
+			AlignSequences(aligned, inStr, alignOptions);
+			aligned = aligned[0];
+			SeqAlignments[seqCounter] = aligned;
+			alignmentScores +  aligned[0]/Abs(aligned[1]);
+			aligned = aligned[1];
+			myStartingPosition = aligned$"[^-]";
+			myEndingPosition  = Abs (aligned)-1;
+			
+			while (aligned[myEndingPosition]=="-")
+			{
+				myEndingPosition = myEndingPosition - 1;
+			}
+			
+			myStartingPosition = myStartingPosition[0];
+			startingPosition[seqCounter][0] = myStartingPosition;
+			startingPosition[seqCounter][1] = myEndingPosition;
+			aligned = aligned[myStartingPosition][myEndingPosition];
+			
+			refInsert = aligned||"-+";
+			if (refInsert[0]>0)
+			{
+				insCount = Rows (refInsert)/2;
+				offset = 0;
+				for (insN = 0; insN < insCount; insN = insN+1)
+				{
+					insPos 		= refInsert[insN*2];
+					insLength	= refInsert[insN*2+1]-insPos+1;
+					insPos 		= insPos-offset;
+					if (refInsertions[insPos]<insLength)
+					{
+						refInsertions[insPos]=insLength;
+					}
+					offset = offset + insLength;
+				}
+			}
+		}
+	}
+
+	alignmentScoresM = avlToMatrix  ("alignmentScores");
+	LoadFunctionLibrary				("DescriptiveStatistics.bf");
+	distInfo = 						GatherDescriptiveStats (alignmentScoresM);
+	distInfo["Mean"] - 2*distInfo["Std.Dev"];
+	
+	fprintf (stdout,"\nMerging pairwise alignments into a MSA\n");
+
+	fullRefSeq = "";
+	fullRefSeq * refLength;
+	fullRefSeq * (s1[0]);
+
+
+	s1N = UnalignedSeqs[0];
+
+	fullRefSeqN = "";
+	fullRefSeqN * (3*refLength);
+	fullRefSeqN * (s1N[0][2]);
+
+	frameShift = ReadingFrames[0];
+
+	for (seqCounter=1;seqCounter<refLength;seqCounter=seqCounter+1)
+	{
+		gapCount = refInsertions[seqCounter];
+		for (k=0; k<gapCount;k=k+1)
+		{
+			fullRefSeq*("-");
+			fullRefSeqN*("---");
+		}	
+		fullRefSeq  * (s1[seqCounter]);
+		fullRefSeqN * (s1N[frameShift+seqCounter*3][frameShift+seqCounter*3+2]);
+	}
+
+	fullRefSeq * 0;
+	fullRefSeqN * 0;
+
+	refLength = Abs(fullRefSeq);
+
+	seqName=sequenceNames[0];
+	if (writeToFiles)
+	{
+	
+		SetDialogPrompt ("Save alignment to:");
+		fprintf (PROMPT_FOR_FILE,CLEAR_FILE,">",seqName,"\n",fullRefSeq);
+		fName = LAST_FILE_PATH;
+		fNameC = fName+".nuc";
+		fprintf (fNameC,CLEAR_FILE,">",seqName,"\n",fullRefSeqN);
+	}
+	else
+	{
+		result [seqName] = fullRefSeqN;
+	}
+	
+	
+	alCounter		= 0;
+
+	for (seqCounter = 1; seqCounter < unalSequenceCount; seqCounter += 1)
+	{
+		if (skipSeqs[seqCounter] == 0)
+		{
+			if (skipOutliers == 0 && alignmentScoresM[alCounter] < lowerCuttoff)
+			{
+				seqName=sequenceNames[seqCounter];
+				fprintf (stdout, "Sequence ", seqName ," was skipped because of a poor alignment score.\n");
+				skipSeqs[seqCounter] = 1;
+				alCounter = alCounter + 1;
+				continue;
+			}
+			alCounter = alCounter + 1;
+			seqName=sequenceNames[seqCounter];
+			aligned = SeqAlignments[seqCounter];
+			
+			aligned1 = aligned[1];
+			aligned2 = aligned[2];
+			
+			s2 = startingPosition[seqCounter][0];
+			e2 = startingPosition[seqCounter][1];
+			
+			gappedSeq = "";
+			gappedSeq * Abs(aligned2);
+
+			
+			k=0;
+			
+			while (k<refLength)
+			{
+				while (fullRefSeq[k]!=aligned1[s2])
+				{
+					gappedSeq*("-");
+					k=k+1;
+				}
+				gappedSeq*(aligned2[s2]);
+				s2=s2+1;
+				k=k+1;
+			}
+
+			gappedSeq * 0;
+
+			gappedSeqN = "";
+			gappedSeqN * (3*Abs(aligned2));
+			
+			frameShift = ReadingFrames[seqCounter];
+
+			s1N 	= UnalignedSeqs[seqCounter];
+			s2N		= ProteinSequences[seqCounter];
+			s2 		= startingPosition[seqCounter][0];
+			k 		= 0;
+			e2		= Abs(gappedSeq);
+			k = 0;
+			while  (k<e2)
+			{
+				while ((s2N[s2]!=gappedSeq[k])&&(k<e2))
+				{
+					gappedSeqN * ("---");
+					k=k+1;
+				}
+				if (k<e2)
+				{
+					gappedSeqN * s1N[frameShift+s2*3][frameShift+s2*3+2];
+					s2 = s2+1;
+					k=k+1;
+				}
+			}
+			gappedSeqN * 0;
+
+			if (writeToFiles)
+			{
+				if (refSeq2 && seqCounter == unalSequenceCount-1)
+				{
+					fscanf  (fName, "Raw", soFar);
+					fprintf (fName, CLEAR_FILE,">",seqName,"\n",gappedSeq,"\n",soFar);
+					fscanf  (fNameC, "Raw", soFar);
+					fprintf (fNameC,CLEAR_FILE,">",seqName,"\n",gappedSeqN,"\n",soFar);		
+					
+				}
+				else
+				{
+					fprintf (fName,"\n>",seqName,"\n",gappedSeq);
+					fprintf (fNameC,"\n>",seqName,"\n",gappedSeqN);		
+				}
+			}
+			else
+			{
+				result [seqName] = gappedSeqN;
+			}
+		}
+	}
+
+	if (Abs(skipSeqs) && writeToFiles)
+	{
+		fName = fName+".bad";
+		for (seqCounter = 1; seqCounter < unalSequenceCount; seqCounter = seqCounter+1)
+		{
+			if (skipSeqs[seqCounter])
+			{
+				seqName=sequenceNames[seqCounter];
+				fprintf (fName,">",seqName,"\n",UnalignedSeqs[seqCounter],"\n");
+			}
+		}
+	}
+	
+	return result;
+}
+
+//---------------------------------------------------------------------------------------------------------------------
+
+
+function checkFramePosition (pos1, pos2, fr1, fr2)
+{
+	fSpan  = pos2-pos1;
+	
+	if (fSpan>1) // first followed by second
+	{
+		if (fSpan < fMin)
+		{
+			fMin = fSpan;
+			frame1 = fr1;
+			frame2 = fr2;
+			fStart = pos1+1;
+			fEnd   = pos2;
+		}
+	}	
+	return 0;
+}
+
diff --git a/res/TemplateBatchFiles/SeqAlignment.bf b/res/TemplateBatchFiles/SeqAlignment.bf
new file mode 100644
index 0000000..6420518
--- /dev/null
+++ b/res/TemplateBatchFiles/SeqAlignment.bf
@@ -0,0 +1,54 @@
+RequireVersion ("2.0020100903");
+ExecuteAFile   ("Utility/GrabBag.bf");
+
+#include		"SeqAlignShared.ibf";
+
+ASSERTION_BEHAVIOR = 1;
+
+/* END ALIGNMENT SETTINGS */
+
+SetDialogPrompt 		("Sequence File:");
+doLongestSequence = 	(refSeq==1);
+
+if (refSeq > 1)
+{
+	DataSet        unal2 			= ReadDataFile 	(PROMPT_FOR_FILE);
+	refSeq = ">" + predefSeqNames [refSeq][0] + "\n" + RefSeqs[refSeq-2];
+	DataSet		   refD = ReadFromString (refSeq);
+	DataSet        unal = Combine (refD,unal2);
+}
+else
+{
+	ChoiceList (refSeq2,"Insert a coordinate reference sequence?",1,SKIP_NONE,predefSeqNames2);
+	assert (refSeq2 >= 0, "Reference sequence selection"); 
+	if (refSeq2)
+	{
+		DataSet        unal2 			= ReadDataFile 	(PROMPT_FOR_FILE);
+		refSeq = ">" + predefSeqNames [refSeq2][0] + "\n" + RefSeqs[refSeq2-1];
+		DataSet		   refD = ReadFromString (refSeq);
+		DataSet        unal = Combine (unal2,refD);
+		if (doLongestSequence)
+		{
+			doLongestSequence = 2;
+		}
+	}
+	else
+	{
+		DataSet        unal 			= ReadDataFile 	(PROMPT_FOR_FILE);
+	}
+}
+
+
+
+
+ChoiceList (skipOutliers,"Include outliers?",		1,SKIP_NONE,"No","Skip sequences with unusually poor alignment scores","Yes","Include all alignable sequences");
+assert (skipOutliers >= 0, "Outlier handling selection"); 
+
+ChoiceList (doRC,		 "Try reverse complements?",1,SKIP_NONE,"No","Only align in the provided direction","Yes","Try both each sequences and its reverse complement.");
+assert	 (doRC >= 0, "Reverse complement selection"); 
+
+// build codon translation table
+ExecuteAFile       ("TemplateModels/chooseGeneticCode.def");
+codonToAAMap		= defineCodonToAA();
+
+_handleAlignment ("unal",1);
diff --git a/res/TemplateBatchFiles/SeqAlignmentCodon.bf b/res/TemplateBatchFiles/SeqAlignmentCodon.bf
new file mode 100644
index 0000000..c7c60d6
--- /dev/null
+++ b/res/TemplateBatchFiles/SeqAlignmentCodon.bf
@@ -0,0 +1,7 @@
+LoadFunctionLibrary ("SeqAlignmentCodonShared");
+checkReferenceSequenceForStopCodons = 1;
+doCodonAlignment        = 1;
+LoadFunctionLibrary ("SeqAlignmentNucShared");
+
+
+
diff --git a/res/TemplateBatchFiles/SeqAlignmentCodonShared.ibf b/res/TemplateBatchFiles/SeqAlignmentCodonShared.ibf
new file mode 100644
index 0000000..5ec5ca1
--- /dev/null
+++ b/res/TemplateBatchFiles/SeqAlignmentCodonShared.ibf
@@ -0,0 +1,212 @@
+/* START ALIGNMENT SETTINGS */
+
+if (!_HY_NUC_CODON_HAVE_SCORE_MATRIX || Type(scoreMatrix)!="Matrix" || Rows (scoreMatrix) != 64)
+{
+	LoadFunctionLibrary ("chooseGeneticCode");
+	LoadFunctionLibrary ("SeqAlignShared");
+	alignOptions ["SEQ_ALIGN_CHARACTER_MAP"]="ACGT";
+	LoadFunctionLibrary ("GrabBag");
+	protScoreMatrix = alignOptions["SEQ_ALIGN_SCORE_MATRIX"];
+	no_tp = alignOptions["SEQ_ALIGN_NO_TP"];
+
+	alignOptions = {};
+	
+	
+	
+    
+ 	protLetters = "ARNDCQEGHILKMFPSTWYV";
+   _cdnaln_cdnScoreMatrix = pSM2cSM(protScoreMatrix, protLetters);
+	
+	
+	alignOptions ["SEQ_ALIGN_SCORE_MATRIX"] = 	_cdnaln_cdnScoreMatrix;
+	maxScore = Max (protScoreMatrix,0);
+	minScore = Min (protScoreMatrix,0);
+	
+	alignOptions ["SEQ_ALIGN_GAP_OPEN"]		= 	2*Max(maxScore,-minScore);
+	alignOptions ["SEQ_ALIGN_GAP_OPEN2"]	= 	2*Max(maxScore,-minScore);
+	alignOptions ["SEQ_ALIGN_GAP_EXTEND"]	= 	1;
+	alignOptions ["SEQ_ALIGN_GAP_EXTEND2"]	= 	1;
+	alignOptions ["SEQ_ALIGN_FRAMESHIFT"]	= 	3*Max(maxScore,-minScore);
+	alignOptions ["SEQ_ALIGN_CODON_ALIGN"]	= 	1;
+	alignOptions ["SEQ_ALIGN_CHARACTER_MAP"]=  "ACGT";
+	alignOptions ["SEQ_ALIGN_NO_TP"]        =  no_tp;
+   
+    _cdnaln_partialScoreMatrices = cSM2partialSMs(_cdnaln_cdnScoreMatrix,0);
+    
+    alignOptions ["SEQ_ALIGN_PARTIAL_3x1_SCORES"] = _cdnaln_partialScoreMatrices["3x1"];
+    alignOptions ["SEQ_ALIGN_PARTIAL_3x2_SCORES"] = _cdnaln_partialScoreMatrices["3x2"];
+    alignOptions ["SEQ_ALIGN_PARTIAL_3x4_SCORES"] = _cdnaln_partialScoreMatrices["3x4"];
+    alignOptions ["SEQ_ALIGN_PARTIAL_3x5_SCORES"] = _cdnaln_partialScoreMatrices["3x5"];
+        
+}
+
+function Uppercase( _str )
+{
+    _upstr = _str && 1;
+    _upstr * 0;
+    return _upstr;
+}
+
+function _cdn_alignment_cleanup (reference, query, offset_nuc) {
+    too_short = 0;
+    too_long  = 0;
+    span      = 0; // how many nucleotides in the reference were covered by non-gaps
+    _seqL     = Abs (reference);
+    
+    ref_cleaned = ""; ref_cleaned * 128; 
+    qry_cleaned = ""; qry_cleaned * 128;
+    
+    _codon_in_reference = 0;
+    
+	for ( _rcidx = 0; _rcidx < _seqL; _rcidx += 1 ) {
+	    _del1 = reference [_rcidx] != (reference [_rcidx]&&1);
+	    if (_del1) {
+	        too_short += 1;
+	        _codon_in_reference += 1;
+	        ref_cleaned * (reference [_rcidx]&&1);
+	        qry_cleaned * (query [_rcidx]&&1);
+	    } else {
+	        _del1 = query [_rcidx] != (query [_rcidx]&&1);
+	        if (_del1) {
+	            if (_seqL-_rcidx < 3 && _codon_in_reference % 3 == 0) {
+	                break;
+	            }
+	            too_long += 1;
+	        } else {
+                ref_cleaned * (reference [_rcidx]&&1);
+                qry_cleaned * (query [_rcidx]&&1);
+                span += 1;	            
+                _codon_in_reference +=1;
+	        }
+	    }
+	}
+	/*for (;_rcidx < _seqL; _rcidx += 1 ) {
+        ref_cleaned * (reference [_rcidx]&&1);
+        qry_cleaned * (query [_rcidx]&&1);
+    }*/
+	ref_cleaned * 0; qry_cleaned * 0;
+	
+	return {"REF": ref_cleaned, "QRY": qry_cleaned, "TOO_SHORT" : too_short, "TOO_LONG": too_long, "SPAN": span};
+}
+
+
+// -------------------------------------------------------------------------- //
+
+
+function cSM2partialSMs(_cdnScoreMatrix, penalties)
+{
+    m3x5  =  { 65, 640 };
+    m3x4  =  { 65, 256 };
+    m3x2  =  { 65,  48 };
+    m3x1  =  { 65,  12 };
+
+    // minor penalties to make mismatch not entirely free
+    
+    if (Rows(penalties)*Columns(penalties) == 4) {
+        p3x1 = penalties [0];
+        p3x2 = penalties [1];
+        p3x4 = penalties [2];
+        p3x5 = penalties [3];
+    } else {    
+        p3x5 = 0;
+        p3x4 = 0;
+        p3x2 = 0;
+        p3x1 = 0;
+    }
+    for ( thisCodon = 0; thisCodon < 64; thisCodon += 1 ) {
+        for ( d1 = 0; d1 < 4; d1 += 1 ) {
+            max100 = -1e100;
+            max010 = -1e100;
+            max001 = -1e100;
+
+            for ( d2 = 0; d2 < 4; d2 += 1 ) {
+                partialCodon = 4 * d1 + d2;
+                max110 = -1e100;
+                max101 = -1e100;
+                max011 = -1e100;
+
+                for ( d3 = 0; d3 < 4; d3 += 1 ) {
+                    thisCodon2 = 4 * partialCodon + d3;
+                    thisScore = _cdnScoreMatrix[ thisCodon ][ thisCodon2 ];
+
+                    // this is the trivial and stupid way of doing it, but it should work
+                    m3x5[ thisCodon ][ 10 * thisCodon2 + 0 ] = thisScore - p3x5;
+                    m3x5[ thisCodon ][ 10 * thisCodon2 + 1 ] = thisScore - p3x5;
+                    m3x5[ thisCodon ][ 10 * thisCodon2 + 2 ] = thisScore - p3x5;
+                    m3x5[ thisCodon ][ 10 * thisCodon2 + 3 ] = thisScore - p3x5;
+                    m3x5[ thisCodon ][ 10 * thisCodon2 + 4 ] = thisScore - p3x5;
+                    m3x5[ thisCodon ][ 10 * thisCodon2 + 5 ] = thisScore - p3x5;
+                    m3x5[ thisCodon ][ 10 * thisCodon2 + 6 ] = thisScore - p3x5;
+                    m3x5[ thisCodon ][ 10 * thisCodon2 + 7 ] = thisScore - p3x5;
+                    m3x5[ thisCodon ][ 10 * thisCodon2 + 8 ] = thisScore - p3x5;
+                    m3x5[ thisCodon ][ 10 * thisCodon2 + 9 ] = thisScore - p3x5;
+
+                    m3x4[ thisCodon ][ 4 * thisCodon2 + 0 ] = thisScore - p3x4;
+                    m3x4[ thisCodon ][ 4 * thisCodon2 + 1 ] = thisScore - p3x4;
+                    m3x4[ thisCodon ][ 4 * thisCodon2 + 2 ] = thisScore - p3x4;
+                    m3x4[ thisCodon ][ 4 * thisCodon2 + 3 ] = thisScore - p3x4;
+
+                    // d1 is 1
+                    max100 = Max( max100, _cdnScoreMatrix[ thisCodon ][ 16 * d1 + 4 * d2 + d3 ] );
+                    max010 = Max( max010, _cdnScoreMatrix[ thisCodon ][ 16 * d2 + 4 * d1 + d3 ] );
+                    max001 = Max( max001, _cdnScoreMatrix[ thisCodon ][ 16 * d2 + 4 * d3 + d1 ] );
+
+                    // d1 and d2 are 1
+                    max110 = Max( max110, _cdnScoreMatrix[ thisCodon ][ 16 * d1 + 4 * d2 + d3 ] );
+                    max101 = Max( max101, _cdnScoreMatrix[ thisCodon ][ 16 * d1 + 4 * d3 + d2 ] );
+                    max011 = Max( max011, _cdnScoreMatrix[ thisCodon ][ 16 * d3 + 4 * d1 + d2 ] );
+                }
+
+                m3x2[ thisCodon ][ 3 * partialCodon + 0 ] = max110 - p3x2;
+                m3x2[ thisCodon ][ 3 * partialCodon + 1 ] = max101 - p3x2;
+                m3x2[ thisCodon ][ 3 * partialCodon + 2 ] = max011 - p3x2;
+            }
+
+            m3x1[ thisCodon ][ 3 * d1 + 0 ] = max100 - p3x1;
+            m3x1[ thisCodon ][ 3 * d1 + 1 ] = max010 - p3x1;
+            m3x1[ thisCodon ][ 3 * d1 + 2 ] = max001 - p3x1;
+        }
+    }
+    return { "3x1": m3x1, "3x2": m3x2, "3x4": m3x4, "3x5": m3x5 };
+}
+
+function pSM2cSM(_scorematrix, _letters)
+{
+    LoadFunctionLibrary( "GrabBag" );
+
+    _cdnScoreMatrix  = { 65,65 };
+    _mapping      = mapStrings( _hyphyAAOrdering, _letters );
+    for ( _k = 0; _k < 64; _k += 1 ) {
+        _mappedK = _mapping[ _Genetic_Code[ _k ] ];
+        if ( _mappedK >= 0) {
+            for ( _k2 = _k; _k2 < 64; _k2 += 1 ) {
+                _mappedK2 = _mapping[ _Genetic_Code[ _k2 ] ];
+                if ( _mappedK2 >= 0 ) {
+                    _aScore = _scorematrix[ _mappedK ][ _mappedK2 ];
+                    if ( _mappedK == _mappedK2 && _k2 > _k ) {
+                        _aScore = _aScore - 1;
+                    }
+                } else {
+                    // stop codons don't match anything
+                    _aScore = -1e4;
+                }
+                _cdnScoreMatrix[ _k ][ _k2 ] = _aScore;
+                _cdnScoreMatrix[ _k2 ][ _k ] = _aScore;
+            }
+        } else {
+            for ( _k2 = _k; _k2 < 64; _k2 += 1 ) {
+                _mappedK2 = _mapping[ _Genetic_Code[ _k2 ] ];
+                if ( _mappedK2 < 0 ) {
+                    // don't penalize stop codons matching themselves
+                    _cdnScoreMatrix[ _k ][ _k2 ] = 0;
+                    _cdnScoreMatrix[ _k2 ][ _k ] = 0;
+                } else {
+                    _cdnScoreMatrix[ _k ][ _k2 ] = -1e4;
+                    _cdnScoreMatrix[ _k2 ][ _k ] = -1e4;
+                }
+            }
+        }
+    }
+
+    return _cdnScoreMatrix;
+}
diff --git a/res/TemplateBatchFiles/SeqAlignmentNuc.bf b/res/TemplateBatchFiles/SeqAlignmentNuc.bf
new file mode 100644
index 0000000..242c22c
--- /dev/null
+++ b/res/TemplateBatchFiles/SeqAlignmentNuc.bf
@@ -0,0 +1,101 @@
+/* START ALIGNMENT SETTINGS */
+
+
+
+if (!_HY_NUC_ALIGN_HAVE_SCORE_MATRIX || Type(scoreMatrix)!="Matrix" || Rows (scoreMatrix) != 4)
+{
+	alignOptions = {};
+	scoreMatrix = {
+	{5,-4,-4,-4}
+	{-4,5,-4,-4}
+	{-4,-4,5,-4}
+	{-4,-4,-4,5}
+	};
+	alignOptions ["SEQ_ALIGN_SCORE_MATRIX"] = 	scoreMatrix;
+	alignOptions ["SEQ_ALIGN_GAP_OPEN"]		= 	10;
+	alignOptions ["SEQ_ALIGN_GAP_OPEN2"]	= 	5;
+	alignOptions ["SEQ_ALIGN_GAP_EXTEND"]	= 	1;
+	alignOptions ["SEQ_ALIGN_GAP_EXTEND2"]	= 	1;
+	alignOptions ["SEQ_ALIGN_AFFINE"]		=   1;
+}
+
+alignOptions ["SEQ_ALIGN_CHARACTER_MAP"]="ACGT";
+
+
+
+
+ChoiceList (refSeq,"Prefix/Suffix Indels",1,SKIP_NONE,"No penalty","Do not penalize prefix and suffix Indels","Normal penalty","Treat prefix and suffix indels as any other indels");
+if (refSeq < 0)
+{
+	return 0;
+}
+
+alignOptions ["SEQ_ALIGN_NO_TP"]		=   1-refSeq;
+
+/* END ALIGNMENT SETTINGS */
+
+
+/* REFERENCE SEQUENCES OPTIONS */
+
+predefSeqNames = {{"First in file", "Use the first sequence in the data file as a reference"}
+				  {"Longest in file", "Use the longest sequence in the data file as the reference"}
+				 /*0*/ {"HXB2_env", "Use HIV-1 HXB2 reference strain envelope sequence (K03455)"}
+				 /*1*/ {"HXB2_nef", "Use HIV-1 HXB2 reference strain NEF sequence (K03455)"}
+				 /*2*/ {"HXB2_gag", "Use HIV-1 HXB2 reference strain gag sequence (K03455)"} 
+				 /*3*/ {"HXB2_vpr", "Use HIV-1 HXB2 reference strain vpr sequence (K03455)"} 
+				 /*4*/ {"HXB2_vif", "Use HIV-1 HXB2 reference strain vif sequence (K03455)"} 
+				 /*5*/ {"HXB2_vpu", "Use HIV-1 HXB2 reference strain vpu sequence (K03455)"} 
+				 /*6*/ {"HXB2_pr", "Use HIV-1 HXB2 reference strain protease sequence (K03455)"} 
+				 /*7*/ {"HXB2_rt", "Use HIV-1 HXB2 reference strain reverse transcriptase sequence (K03455)"} 
+				 /*8*/ {"HXB2_int", "Use HIV-1 HXB2 reference strain integrase sequence (K03455)"} 
+				 /*9*/ {"HXB2_rev", "Use HIV-1 HXB2 reference strain rev (exons 1 and 2)sequence (K03455)"} 
+				/*10*/ {"HXB2_tat", "Use HIV-1 HXB2 reference strain tat (exons 1 and 2) sequence (K03455)"} 
+				/*11*/ {"HXB2_prrt", "Use HIV-1 HXB2 reference strain protease+rt sequence (K03455)"}
+				/*12*/ {"NL4_3prrt", "Use HIV-1 NL4-3 reference strain pr+rt sequence"} 
+				/*13*/ {"HXB2_pol",  "Use HIV-1 HXB2 reference strain pol (starting at pr) sequence (K03455)"}
+				  				  };
+				  
+				  
+predefSeqNames2 = {{"No", "No reference coordinate sequences"}
+				 /*0*/ {"HXB2_env", "Use HIV-1 HXB2 reference strain envelope sequence (K03455)"}
+				 /*1*/ {"HXB2_nef", "Use HIV-1 HXB2 reference strain NEF sequence (K03455)"}
+				 /*2*/ {"HXB2_gag", "Use HIV-1 HXB2 reference strain gag sequence (K03455)"} 
+				 /*3*/ {"HXB2_vpr", "Use HIV-1 HXB2 reference strain vpr sequence (K03455)"} 
+				 /*4*/ {"HXB2_vif", "Use HIV-1 HXB2 reference strain vif sequence (K03455)"} 
+				 /*5*/ {"HXB2_vpu", "Use HIV-1 HXB2 reference strain vpu sequence (K03455)"} 
+				 /*6*/ {"HXB2_pr", "Use HIV-1 HXB2 reference strain protease sequence (K03455)"} 
+				 /*7*/ {"HXB2_rt", "Use HIV-1 HXB2 reference strain reverse transcriptase sequence (K03455)"} 
+				 /*8*/ {"HXB2_int", "Use HIV-1 HXB2 reference strain integrase sequence (K03455)"} 
+				 /*9*/ {"HXB2_rev", "Use HIV-1 HXB2 reference strain rev (exons 1 and 2)sequence (K03455)"} 
+				/*10*/ {"HXB2_tat", "Use HIV-1 HXB2 reference strain tat (exons 1 and 2) sequence (K03455)"} 
+				/*11*/ {"HXB2_prrt", "Use HIV-1 HXB2 reference strain protease+rt sequence (K03455)"} 
+				/*12*/ {"NL4_3prrt", "Use HIV-1 NL4-3 reference strain pr+rt sequence"} 
+				/*13*/ {"HXB2_pol",  "Use HIV-1 HXB2 reference strain pol (starting at pr) sequence (K03455)"}
+				  };
+
+RefSeqs = {};
+RefSeqs [0] = "ATGAGAGTGAAGGAGAAATATCAGCACTTGTGGAGATGGGGGTGGAGATGGGGCACCATGCTCCTTGGGATGTTGATGATCTGTAGTGCTACAGAAAAATTGTGGGTCACAGTCTATTATGGGGTACCTGTGTGGAAGGAAGCAACCACCACTCTATTTTGTGCATCAGATGCTAAAGCATATGATACAGAGGTACATAATGTTTGGGCCACACATGCCTGTGTACCCACAGACCCCAACCCACAAGAAGTAGTATTGGTAAATGTGACAGAAAATTTTAACATGTGGAAAAATGACATGGTAGAACAGATGCATGAGGATATAATCAGTTTATGGGATCAAAGCCTAAAGCCATGTGTAAAATTAACCCCACTCTGTGTTAGTTTAAAGTGCACTGATTTGAAGAATGATACTAATACCAATAGTAGTAGCGGGAGAATGATAATGGAGAAAGGAGAGATAAAAAACTGCTCTTTC [...]
+RefSeqs [1] = "ATGGGTGGCAAGTGGTCAAAAAGTAGTGTGATTGGATGGCCTACTGTAAGGGAAAGAATGAGACGAGCTGAGCCAGCAGCAGATAGGGTGGGAGCAGCATCTCGAGACCTGGAAAAACATGGAGCAATCACAAGTAGCAATACAGCAGCTACCAATGCTGCTTGTGCCTGGCTAGAAGCACAAGAGGAGGAGGAGGTGGGTTTTCCAGTCACACCTCAGGTACCTTTAAGACCAATGACTTACAAGGCAGCTGTAGATCTTAGCCACTTTTTAAAAGAAAAGGGGGGACTGGAAGGGCTAATTCACTCCCAAAGAAGACAAGATATCCTTGATCTGTGGATCTACCACACACAAGGCTACTTCCCTGAT---CAGAACTACACACCAGGGCCAGGGGTCAGATATCCACTGACCTTTGGATGGTGCTACAAGCTAGTACCAGTTGAGCCAGATAAGATAGAAGAGGCCAATAAAGGA [...]
+RefSeqs [2] = "ATGGGTGCGAGAGCGTCAGTATTAAGCGGGGGAGAATTAGATCGATGGGAAAAAATTCGGTTAAGGCCAGGGGGAAAGAAAAAATATAAATTAAAACATATAGTATGGGCAAGCAGGGAGCTAGAACGATTCGCAGTTAATCCTGGCCTGTTAGAAACATCAGAAGGCTGTAGACAAATACTGGGACAGCTACAACCATCCCTTCAGACAGGATCAGAAGAACTTAGATCATTATATAATACAGTAGCAACCCTCTATTGTGTGCATCAAAGGATAGAGATAAAAGACACCAAGGAAGCTTTAGACAAGATAGAGGAAGAGCAAAACAAAAGTAAGAAAAAAGCACAGCAAGCAGCAGCTGACACAGGACACAGCAATCAGGTCAGCCAAAATTACCCTATAGTGCAGAACATCCAGGGGCAAATGGTACATCAGGCCATATCACCTAGAACTTTAAATGCATGGGTAAAAGTAGTA [...]
+RefSeqs [3] = "ATGGAACAAGCCCCAGAAGACCAAGGGCCACAGAGGGAGCCACACAATGAATGGACACTAGAGCTTTTAGAGGAGCTTAAGAATGAAGCTGTTAGACATTTTCCTAGGATTTGGCTCCATGGCTTAGGGCAACATATCTATGAAACTTATGGGGATACTTGGGCAGGAGTGGAAGCCATAATAAGAATTCTGCAACAACTGCTGTTTATCCATTTTCAGAATTGGGTGTCGACATAGCAGAATAGGCGTTACTCGACAGAGGAGAGCAAGAAATGGAGCCAGTAGATCC";				  
+RefSeqs [4] = "ATGGAAAACAGATGGCAGGTGATGATTGTGTGGCAAGTAGACAGGATGAGGATTAGAACATGGAAAAGTTTAGTAAAACACCATATGTATGTTTCAGGGAAAGCTAGGGGATGGTTTTATAGACATCACTATGAAAGCCCTCATCCAAGAATAAGTTCAGAAGTACACATCCCACTAGGGGATGCTAGATTGGTAATAACAACATATTGGGGTCTGCATACAGGAGAAAGAGACTGGCATTTGGGTCAGGGAGTCTCCATAGAATGGAGGAAAAAGAGATATAGCACACAAGTAGACCCTGAACTAGCAGACCAACTAATTCATCTGTATTACTTTGACTGTTTTTCAGACTCTGCTATAAGAAAGGCCTTATTAGGACACATAGTTAGCCCTAGGTGTGAATATCAAGCAGGACATAACAAGGTAGGATCTCTACAATACTTGGCACTAGCAGCATTAATAACACCAAAAAAGATA [...]
+RefSeqs [5] = "ACGCAACCTATACCAATAGTAGCAATAGTAGCATTAGTAGTAGCAATAATAATAGCAATAGTTGTGTGGTCCATAGTAATCATAGAATATAGGAAAATATTAAGACAAAGAAAAATAGACAGGTTAATTGATAGACTAATAGAAAGAGCAGAAGACAGTGGCAATGAGAGTGAAGGAGAAATATCAGCACTTGTGGAGATGGGGGTGGAGATGGGGCACCATGCTCCTTGGGATGTTGATGATC";				  
+RefSeqs [6] = "CCTCAGGTCACTCTTTGGCAACGACCCCTCGTCACAATAAAGATAGGGGGGCAACTAAAGGAAGCTCTATTAGATACAGGAGCAGATGATACAGTATTAGAAGAAATGAGTTTGCCAGGAAGATGGAAACCAAAAATGATAGGGGGAATTGGAGGTTTTATCAAAGTAAGACAGTATGATCAGATACTCATAGAAATCTGTGGACATAAAGCTATAGGTACAGTATTAGTAGGACCTACACCTGTCAACATAATTGGAAGAAATCTGTTGACTCAGATTGGTTGCACTTTAAATTTT";				  
+RefSeqs [7] = "CCCATTAGCCCTATTGAGACTGTACCAGTAAAATTAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAATAAAAGCATTAGTAGAAATTTGTACAGAGATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAAGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGATGGAAAGGATCACCAGCAATA [...]
+RefSeqs [8] = "TTTTTAGATGGAATAGATAAGGCCCAAGATGAACATGAGAAATATCACAGTAATTGGAGAGCAATGGCTAGTGATTTTAACCTGCCACCTGTAGTAGCAAAAGAAATAGTAGCCAGCTGTGATAAATGTCAGCTAAAAGGAGAAGCCATGCATGGACAAGTAGACTGTAGTCCAGGAATATGGCAACTAGATTGTACACATTTAGAAGGAAAAGTTATCCTGGTAGCAGTTCATGTAGCCAGTGGATATATAGAAGCAGAAGTTATTCCAGCAGAAACAGGGCAGGAAACAGCATATTTTCTTTTAAAATTAGCAGGAAGATGGCCAGTAAAAACAATACATACTGACAATGGCAGCAATTTCACCGGTGCTACGGTTAGGGCCGCCTGTTGGTGGGCGGGAATCAAGCAGGAATTTGGAATTCCCTACAATCCCCAAAGTCAAGGAGTAGTAGAATCTATGAATAAAGAATTAAAG [...]
+RefSeqs [9] = "ATGGCAGGAAGAAGCGGAGACAGCGACGAAGAGCTCATCAGAACAGTCAGACTCATCAAGCTTCTCTAACCCACCTCCCAACCCCGAGGGGACCCGACAGGCCCGAAGGAATAGAAGAAGAAGGTGGAGAGAGAGACAGAGACAGATCCATTCGATTAGTGAACGGATCCTTGGCACTTATCTGGGACGATCTGCGGAGCCTGTGCCTCTTCAGCTACCACCGCTTGAGAGACTTACTCTTGATTGTAACGAGGATTGTGGAACTTCTGGGACGCAGGGGGTGGGAAGCCCTCAAATATTGGTGGAATCTCCTACAGTATTGGAGTCAGGAACTAAAGA";
+RefSeqs[10] = "ATGGAGCCAGTAGATCCTAGACTAGAGCCCTGGAAGCATCCAGGAAGTCAGCCTAAAACTGCTTGTACCAATTGCTATTGTAAAAAGTGTTGCTTTCATTGCCAAGTTTGTTTCATAACAAAAGCCTTAGGCATCTCCTATGGCAGGAAGAAGCGGAGACAGCGACGAAGAGCTCATCAGAACAGTCAGACTCATCAAGCTTCTCTATCAAAGCAACCCACCTCCCAACCCCGAGGGGACCCGACAGGCCCGAAGGAATAGAAGAAGAAGGTGGAGAGAGAGACAGAGACAGATCCATTCGAT";
+RefSeqs[11] = "CCTCAGGTCACTCTTTGGCAACGACCCCTCGTCACAATAAAGATAGGGGGGCAACTAAAGGAAGCTCTATTAGATACAGGAGCAGATGATACAGTATTAGAAGAAATGAGTTTGCCAGGAAGATGGAAACCAAAAATGATAGGGGGAATTGGAGGTTTTATCAAAGTAAGACAGTATGATCAGATACTCATAGAAATCTGTGGACATAAAGCTATAGGTACAGTATTAGTAGGACCTACACCTGTCAACATAATTGGAAGAAATCTGTTGACTCAGATTGGTTGCACTTTAAATTTTCCCATTAGCCCTATTGAGACTGTACCAGTAAAATTAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAATAAAAGCATTAGTAGAAATTTGTACAGAGATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTA [...]
+RefSeqs[12] = "CCTCAGATCACTCTTTGGCAGCGACCCCTCGTCACAATAAAGATAGGGGGGCAATTAAAGGAAGCTCTATTAGATACAGGAGCAGATGATACAGTATTAGAAGAAATGAATTTGCCAGGAAGATGGAAACCAAAAATGATAGGGGGAATTGGAGGTTTTATCAAAGTAGGACAGTATGATCAGATACTCATAGAAATCTGCGGACATAAAGCTATAGGTACAGTATTAGTAGGACCTACACCTGTCAACATAATTGGAAGAAATCTGTTGACTCAGATTGGCTGCACTTTAAATTTTCCCATTAGTCCTATTGAGACTGTACCAGTAAAATTAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAATAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTA [...]
+RefSeqs[13] = "CCTCAGGTCACTCTTTGGCAACGACCCCTCGTCACAATAAAGATAGGGGGGCAACTAAAGGAAGCTCTATTAGATACAGGAGCAGATGATACAGTATTAGAAGAAATGAGTTTGCCAGGAAGATGGAAACCAAAAATGATAGGGGGAATTGGAGGTTTTATCAAAGTAAGACAGTATGATCAGATACTCATAGAAATCTGTGGACATAAAGCTATAGGTACAGTATTAGTAGGACCTACACCTGTCAACATAATTGGAAGAAATCTGTTGACTCAGATTGGTTGCACTTTAAATTTTCCCATTAGCCCTATTGAGACTGTACCAGTAAAATTAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAATAAAAGCATTAGTAGAAATTTGTACAGAGATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTA [...]
+
+
+ChoiceList (refSeq,"Choose a reference sequence",1,SKIP_NONE,predefSeqNames);
+if (refSeq < 0)
+{
+	return 0;
+}
+
+checkReferenceSequenceForStopCodons = 0;
+LoadFunctionLibrary ("SeqAlignmentNucShared");
+
diff --git a/res/TemplateBatchFiles/SeqAlignmentNucShared.ibf b/res/TemplateBatchFiles/SeqAlignmentNucShared.ibf
new file mode 100644
index 0000000..2244d75
--- /dev/null
+++ b/res/TemplateBatchFiles/SeqAlignmentNucShared.ibf
@@ -0,0 +1,290 @@
+SetDialogPrompt ("Sequence File:");
+
+doLongestSequence = 	(refSeq==1);
+
+if (refSeq > 1)
+{
+	DataSet        unal2 			= ReadDataFile 	(PROMPT_FOR_FILE);
+	refSeq = ">" + predefSeqNames [refSeq][0] + "\n" + RefSeqs[refSeq-2];
+	DataSet		   refD = ReadFromString (refSeq);
+	DataSet        unal = Combine (refD,unal2);
+}
+else
+{
+	
+	ChoiceList (refSeq2,"Insert a coordinate reference sequence?",1,SKIP_NONE,predefSeqNames2);
+	if (refSeq2 < 0)
+	{
+		return 0;
+	}
+	if (refSeq2)
+	{
+		DataSet        unal2 			= ReadDataFile 	(PROMPT_FOR_FILE);
+		refSeq = ">" + predefSeqNames [refSeq2][0] + "\n" + RefSeqs[refSeq2-1];
+		DataSet		   refD = ReadFromString (refSeq);
+		DataSet        unal = Combine (unal2,refD);
+        if (doLongestSequence)
+		{
+			doLongestSequence = 2;
+		}
+    }
+	else
+	{
+		DataSet        unal 			= ReadDataFile 	(PROMPT_FOR_FILE);
+	}
+}
+
+ChoiceList (doRC,"Try reverse complements?",1,SKIP_NONE,"No","Only align in the provided direction","Yes","Try both each sequences and its reverse complement.");
+if (doRC < 0)
+{
+	return 0;
+}
+
+DataSetFilter  filteredData 	= CreateFilter	(unal,1);
+
+ExecuteAFile ("Utility/NJ.bf");
+ExecuteAFile ("Utility/GrabBag.bf");
+GetInformation (UnalignedSeqs,filteredData);
+
+COUNT_GAPS_IN_FREQUENCIES = 0;
+InitializeDistances		   ();
+
+refSeqID = 0;
+maxL	 = 0;
+
+seqCount = Rows(UnalignedSeqs) * Columns(UnalignedSeqs);
+/* preprocess sequences */
+
+for (seqCounter = 0; seqCounter < seqCount; seqCounter = seqCounter+1)
+{
+	aSeq = UnalignedSeqs[seqCounter];
+	
+	UnalignedSeqs[seqCounter] = aSeq^{{"[^a-zA-Z]",""}};
+	//UnalignedSeqs[seqCounter] = UnalignedSeqs[seqCounter]^{{"^N+",""}};
+	//UnalignedSeqs[seqCounter] = UnalignedSeqs[seqCounter]^{{"N+$",""}};
+
+    if (doLongestSequence > 0 && seqCounter < seqCount - (refSeq2 > 0))
+	{
+		if (Abs (UnalignedSeqs[seqCounter]) > maxL)
+		{
+			maxL	 = Abs (UnalignedSeqs[seqCounter]);
+			refSeqID = seqCounter;
+		}
+	}
+    
+}
+
+s1 = UnalignedSeqs[refSeqID];
+
+if (checkReferenceSequenceForStopCodons)
+{
+    codonToAAMap		= defineCodonToAA();
+    isValid = 0;
+    for (offset = 0; offset < 3; offset +=1)
+    {
+        translString = translateCodonToAA (s1, codonToAAMap, offset);
+        stopPos = translString||"X";
+        if (stopPos[0] < 0)
+        {
+            isValid = 1;
+            break;
+        }
+    }
+    if (!isValid && doRC)
+    {
+        s1 = nucleotideReverseComplement(s1);
+        for (offset = 0; offset < 3; offset +=1)
+        {
+            translString = translateCodonToAA (s1, codonToAAMap, offset);
+            stopPos = translString||"X";
+            if (stopPos[0] < 0)
+            {
+                isValid = 1;
+                break;
+            }
+        }
+    }
+    assert (isValid, "The reference sequence must not contain stop codons in at least one of the frames");
+    s1 = s1[offset][offset+((Abs(s1)-offset)$3)*3-1];
+    UnalignedSeqs[refSeqID] = s1;
+}
+
+refLength 		 = Abs(UnalignedSeqs[refSeqID]);
+
+if (doLongestSequence > 0)
+{
+	GetString (refname, filteredData, refSeqID);
+	fprintf (stdout, "Set the reference sequence to ", refname, " (length = ", refLength, ")\n");
+}
+
+SeqAlignments 	 = {};
+startingPosition = {seqCount,2};
+refInsertions	 = {refLength+1,1};
+
+fprintf (stdout,"\nPerforming pairwise alignment with reference sequences\n");
+
+//pairwiseDistances = {seqCount,1};
+
+//fprintf (TEMP_FILE_NAME, CLEAR_FILE, KEEP_OPEN);
+//checkPointFile = LAST_FILE_PATH;
+	
+	
+for (seqCounter = 0; seqCounter < seqCount; seqCounter += 1) {
+    if (seqCounter == refSeqID) {
+        continue;
+    }
+
+	s2 			 = UnalignedSeqs[seqCounter];
+	inStr 		 = {{s1,s2}};
+	AlignSequences(aligned, inStr, alignOptions);
+    
+	if (doRC) {
+		s2c = nucleotideReverseComplement (s2);
+		inStr 		 = {{s1,s2c}};
+		AlignSequences(aligned_rc, inStr, alignOptions);
+		if ((aligned_rc[0])[0] > (aligned[0])[0]) {
+			UnalignedSeqs[seqCounter] = s2c;
+			aligned = aligned_rc;
+		}
+	}
+	
+	
+
+	
+	//GetString (seqName,unal,seqCounter);
+   // fprintf (checkPointFile, "\n>ref\n", aligned[1], "\n>", seqName, "\n", aligned[2]); 
+    
+	if (doCodonAlignment) {
+        fixed = _cdn_alignment_cleanup ((aligned[0])[1], (aligned[0])[2],0);
+        
+        assert (Abs (fixed["REF"])%3 == 0);
+        assert (  (((aligned[0])[1] ^ {{"-",""}})&&1) == (((fixed["REF"]) ^ {{"-",""}})&&1), "Internal error correcting codon-based frameshifts:\n\n" + aligned[0] + "\n" + fixed + "\n");
+        
+        (aligned[0])[1] = fixed["REF"];
+        (aligned[0])[2] = fixed["QRY"];
+	}
+	
+	aligned = aligned[0];
+	SeqAlignments[seqCounter] = aligned;
+    
+    
+	aligned = aligned[1];
+	
+	myStartingPosition = aligned$"[^-]";
+	myEndingPosition  = Abs (aligned)-1;
+	
+	
+	while (aligned[myEndingPosition]=="-") {
+		myEndingPosition = myEndingPosition - 1;
+	}
+	
+	
+	startingPosition [seqCounter][0] = myStartingPosition[1];
+	startingPosition [seqCounter][1] = myEndingPosition;
+
+	refInsert = aligned||"-+";
+	if (refInsert[0]>=0) {
+		insCount = Rows (refInsert)/2;
+		offset = 0;
+		for (insN = 0; insN < insCount; insN = insN+1) {
+			insPos 		= refInsert[insN*2];
+			insLength	= refInsert[insN*2+1]-insPos+1;
+			insPos 		= insPos-offset;
+			if (refInsertions[insPos]<insLength) {
+				refInsertions[insPos]=insLength;
+			}
+			offset += insLength;
+		}
+	}
+	SetParameter (STATUS_BAR_STATUS_STRING, "Performing pairwise alignment with reference sequences ("+seqCounter+"/"+seqCount+" done)",0);
+}
+
+//fprintf (checkPointFile, CLOSE_FILE);
+
+/* produce a fully gapped reference sequence */
+
+fprintf (stdout,"\nMerging pairwise alignments into a MSA\n");
+
+fullRefSeq = "";
+fullRefSeq * refLength;
+fullRefSeq * (s1[0]);
+
+
+for (seqCounter=1;seqCounter<refLength;seqCounter+=1) {
+	gapCount = refInsertions[seqCounter];
+	for (k=0; k<gapCount;k=k+1)
+	{
+		fullRefSeq*("-");
+	}	
+	fullRefSeq  * (s1[seqCounter]);
+}
+
+fullRefSeq * 0;
+
+refLength = Abs(fullRefSeq);
+
+SetDialogPrompt ("Save alignment to:");
+
+GetString (seqName,unal,refSeqID);
+fprintf (PROMPT_FOR_FILE,CLEAR_FILE,">",seqName,"\n",fullRefSeq);
+fName = LAST_FILE_PATH;
+
+//fprintf (stdout, startingPosition, "\n", refInsertions, "\n");
+
+for (seqCounter = 0; seqCounter < seqCount; seqCounter += 1)
+{
+    if (seqCounter == refSeqID) {
+        continue;
+    }
+    
+	GetString (seqName,unal,seqCounter);
+	aligned = SeqAlignments[seqCounter];
+	
+	aligned1 = aligned[1];
+	aligned2 = aligned[2];
+	
+	s2 = startingPosition[seqCounter][0];
+	e2 = startingPosition[seqCounter][1];
+	
+	gappedSeq = "";
+	gappedSeq * Abs(aligned2);
+    
+	k=0;
+	
+	/*if (seqName == "D61_1959") {
+	    fprintf (stdout, "\n*** ", seqCounter, " ***\n");
+	}*/
+	
+	while (k<refLength)
+	{
+	    /*if (seqCounter == 10) {
+	        fprintf (stdout, k, "/", s2, " ", fullRefSeq[k]&&1, ":", aligned1[s2]&&1, ":", aligned2[s2]&&1, "\n");
+	    }*/
+		while ((fullRefSeq[k]&&1)!=(aligned1[s2]&&1) && k < refLength) {
+			gappedSeq*("-");
+			k += 1;
+		}
+		if (k == refLength) {
+			break;
+		}
+		gappedSeq*(aligned2[s2]);
+		s2 += 1;
+		k  += 1;
+	}
+
+	gappedSeq * 0;
+	/*if (seqCounter == 31) {
+        fprintf (stdout, "\n", startingPosition[seqCounter][0], "\n\n",fullRefSeq,"\n\n", aligned1, "\n\n", aligned2, "\n\n", gappedSeq, "\n\n");
+    }*/
+
+	if (refSeq2 && seqCounter == seqCount-1) {
+		fscanf (fName, "Raw", soFar);
+		fprintf (fName, CLEAR_FILE,">",seqName,"\n",gappedSeq,"\n",soFar);
+		
+	}
+	else {
+		fprintf (fName,"\n>",seqName,"\n",gappedSeq);
+	}
+}
+
+
diff --git a/res/TemplateBatchFiles/SeqAlignmentProt.bf b/res/TemplateBatchFiles/SeqAlignmentProt.bf
new file mode 100644
index 0000000..51dfb65
--- /dev/null
+++ b/res/TemplateBatchFiles/SeqAlignmentProt.bf
@@ -0,0 +1,232 @@
+ExecuteAFile 					("Utility/GrabBag.bf");
+
+/* START ALIGNMENT SETTINGS */
+
+#include "SeqAlignShared.ibf";
+
+/* END ALIGNMENT SETTINGS */
+
+
+/* REFERENCE SEQUENCES OPTIONS */
+
+SetDialogPrompt 		("Sequence File:");
+
+doLongestSequence = 	(refSeq==1);
+
+/* build codon translation table */
+
+
+
+
+if (refSeq > 1)
+{
+    LoadFunctionLibrary ("chooseGeneticCode");
+    codonToAAMap		= defineCodonToAA();
+	DataSet        unal2 			= ReadDataFile 	(PROMPT_FOR_FILE);
+	refSeq = ">" + predefSeqNames [refSeq][0] + "\n" + translateCodonToAA (RefSeqs[refSeq-2], codonToAAMap, 0);
+	DataSet		   refD = ReadFromString (refSeq);
+	DataSet        unal = Combine (refD,unal2);
+}
+else
+{
+	ChoiceList (refSeq2,"Insert a coordinate reference sequence?",1,SKIP_NONE,predefSeqNames2);
+	if (refSeq2 < 0)
+	{
+		return 0;
+	}
+	if (refSeq2)
+	{
+		skipCodeSelectionStep = 1;
+		ApplyGeneticCodeTable (0);
+		
+		DataSet        unal2 			= ReadDataFile 	(PROMPT_FOR_FILE);
+		refSeq = ">" + predefSeqNames [refSeq2][0] + "\n" + translateCodonToAA (RefSeqs[refSeq2-1], codonToAAMap, 0);
+		DataSet		   refD = ReadFromString (refSeq);
+		DataSet        unal = Combine (unal2,refD);
+		if (doLongestSequence)
+		{
+			doLongestSequence = 2;
+		}
+	}
+	else
+	{
+		DataSet        unal 			= ReadDataFile 	(PROMPT_FOR_FILE);
+	}
+}
+
+
+DataSetFilter  filteredData 	= CreateFilter	(unal,1);
+
+ExecuteAFile ("Utility/GrabBag.bf");
+
+GetInformation (UnalignedSeqs,filteredData);
+
+COUNT_GAPS_IN_FREQUENCIES = 0;
+InitializeDistances		   (0);
+
+seqCount = Rows(UnalignedSeqs) * Columns(UnalignedSeqs);
+/* preprocess sequences */
+
+
+refSeqID = 0;
+maxL	 = 0;
+
+for (seqCounter = 0; seqCounter < seqCount; seqCounter = seqCounter+1)
+{
+	aSeq = UnalignedSeqs[seqCounter];
+	UnalignedSeqs[seqCounter] = aSeq^{{"[^a-zA-Z]",""}};
+	if (doLongestSequence > 0 && seqCounter < seqCount - (refSeq2 > 0))
+	{
+		if (Abs (UnalignedSeqs[seqCounter]) > maxL)
+		{
+			maxL	 = Abs (UnalignedSeqs[seqCounter]);
+			refSeqID = seqCounter;
+		}
+	}
+}
+
+refLength 		 = Abs(UnalignedSeqs[refSeqID]);
+s1 = UnalignedSeqs[refSeqID];
+
+if (doLongestSequence > 0)
+{
+	GetString (refname, filteredData, refSeqID);
+	fprintf (stdout, "Set the reference sequence to ", refname, " (length = ", refLength, ")\n");
+}
+
+SeqAlignments 	 = {};
+startingPosition = {seqCount,2};
+refInsertions	 = {refLength,1};
+
+fprintf (stdout,"\nPerforming pairwise alignment with reference sequences\n");
+
+//pairwiseDistances = {seqCount,1};
+
+for (seqCounter = 0; seqCounter < seqCount; seqCounter = seqCounter+1)
+{
+	if (seqCounter == refSeqID)
+	{
+		continue;
+	}
+	
+	s2 			 = UnalignedSeqs[seqCounter];
+	inStr 		 = {{s1,s2}};
+	AlignSequences(aligned, inStr, alignOptions);
+	
+	aligned = aligned[0];
+	SeqAlignments[seqCounter] = aligned;
+	aligned = aligned[1];
+	
+	myStartingPosition = aligned$"[^-]";
+	myEndingPosition  = Abs (aligned)-1;
+	while (aligned[myEndingPosition]=="-")
+	{
+		myEndingPosition = myEndingPosition - 1;
+	}
+	myStartingPosition = myStartingPosition[0];
+	startingPosition[seqCounter][0] = myStartingPosition;
+	startingPosition[seqCounter][1] = myEndingPosition;
+	aligned = aligned[myStartingPosition][myEndingPosition];
+	cleanedAlignedSeq = ((SeqAlignments[seqCounter])[2])[myStartingPosition][myEndingPosition]^{{"N","-"}};
+	pairOfSequences = ">1\n" + cleanedAlignedSeq + "\n>2\n" + aligned;
+	refInsert = aligned||"-+";
+	if (refInsert[0]>0)
+	{
+		insCount = Rows (refInsert)/2;
+		offset = 0;
+		for (insN = 0; insN < insCount; insN = insN+1)
+		{
+			insPos 		= refInsert[insN*2];
+			insLength	= refInsert[insN*2+1]-insPos+1;
+			insPos 		= insPos-offset;
+			if (refInsertions[insPos]<insLength)
+			{
+				refInsertions[insPos]=insLength;
+			}
+			offset = offset + insLength;
+		}
+	}
+	SetParameter (STATUS_BAR_STATUS_STRING, "Performing pairwise alignment with reference sequences ("+seqCounter+"/"+seqCount+" done)",0);
+}
+
+/* produce a fully gapped reference sequence */
+
+fprintf (stdout,"\nMerging pairwise alignments into a MSA\n");
+
+fullRefSeq = "";
+fullRefSeq * refLength;
+fullRefSeq * (s1[0]);
+
+
+for (seqCounter=1;seqCounter<refLength;seqCounter=seqCounter+1)
+{
+	gapCount = refInsertions[seqCounter];
+	for (k=0; k<gapCount;k=k+1)
+	{
+		fullRefSeq*("-");
+	}	
+	fullRefSeq  * (s1[seqCounter]);
+}
+
+fullRefSeq * 0;
+
+refLength = Abs(fullRefSeq);
+
+SetDialogPrompt ("Save alignment to:");
+
+GetString (seqName,unal,refSeqID);
+fprintf (PROMPT_FOR_FILE,CLEAR_FILE,">",seqName,"\n",fullRefSeq);
+fName = LAST_FILE_PATH;
+
+for (seqCounter = 0; seqCounter < seqCount; seqCounter = seqCounter+1)
+{
+	if (seqCounter == refSeqID)
+	{
+		continue;
+	}
+	GetString (seqName,unal,seqCounter);
+	aligned = SeqAlignments[seqCounter];
+	
+	aligned1 = aligned[1];
+	aligned2 = aligned[2];
+	
+	s2 = startingPosition[seqCounter][0];
+	e2 = startingPosition[seqCounter][1];
+	
+	gappedSeq = "";
+	gappedSeq * Abs(aligned2);
+
+	
+	k=0;
+	
+	while (k<refLength)
+	{
+		while (fullRefSeq[k]!=aligned1[s2] && k < refLength)
+		{
+			gappedSeq*("-");
+			k=k+1;
+		}
+		if (k == refLength)
+		{
+			break;
+		}
+		gappedSeq*(aligned2[s2]);
+		s2=s2+1;
+		k=k+1;
+	}
+
+	gappedSeq * 0;
+
+
+	if (refSeq2 && seqCounter == seqCount-1)
+	{
+		fscanf (fName, "Raw", soFar);
+		fprintf (fName, CLEAR_FILE,">",seqName,"\n",gappedSeq,"\n",soFar);
+		
+	}
+	else
+	{
+		fprintf (fName,"\n>",seqName,"\n",gappedSeq);
+	}
+}
+
diff --git a/res/TemplateBatchFiles/SeqAlignmentTop75.bf b/res/TemplateBatchFiles/SeqAlignmentTop75.bf
new file mode 100644
index 0000000..f61b7c9
--- /dev/null
+++ b/res/TemplateBatchFiles/SeqAlignmentTop75.bf
@@ -0,0 +1,638 @@
+/* START ALIGNMENT SETTINGS */
+
+alignOptions = {};
+
+alignOptions ["SEQ_ALIGN_CHARACTER_MAP"]="ARNDCQEGHILKMFPSTWYV";
+
+ChoiceList (refSeq,"Scoring Matrix",1,SKIP_NONE,"BLOSUM62","Default BLAST BLOSUM62 matrix",
+												"HIV 5%","Empirically derived 5% divergence HIV matrix",
+												"HIV 25%","Empirically derived 25% divergence HIV matrix",
+												"HIV 50%","Empirically derived 50% divergence HIV matrix");
+
+if (refSeq < 0)
+{
+	return 0;
+	
+}
+if (refSeq == 0)
+{
+	scoreMatrix = {
+	{7,-3,-3,-3,-1,-2,-2,0,-3,-3,-3,-1,-2,-4,-1,2,0,-5,-4,-1}
+	{-3,9,-1,-3,-6,1,-1,-4,0,-5,-4,3,-3,-5,-3,-2,-2,-5,-4,-4}
+	{-3,-1,9,2,-5,0,-1,-1,1,-6,-6,0,-4,-6,-4,1,0,-7,-4,-5}
+	{-3,-3,2,10,-7,-1,2,-3,-2,-7,-7,-2,-6,-6,-3,-1,-2,-8,-6,-6}
+	{-1,-6,-5,-7,13,-5,-7,-6,-7,-2,-3,-6,-3,-4,-6,-2,-2,-5,-5,-2}
+	{-2,1,0,-1,-5,9,3,-4,1,-5,-4,2,-1,-5,-3,-1,-1,-4,-3,-4}
+	{-2,-1,-1,2,-7,3,8,-4,0,-6,-6,1,-4,-6,-2,-1,-2,-6,-5,-4}
+	{0,-4,-1,-3,-6,-4,-4,9,-4,-7,-7,-3,-5,-6,-5,-1,-3,-6,-6,-6}
+	{-3,0,1,-2,-7,1,0,-4,12,-6,-5,-1,-4,-2,-4,-2,-3,-4,3,-5}
+	{-3,-5,-6,-7,-2,-5,-6,-7,-6,7,2,-5,2,-1,-5,-4,-2,-5,-3,4}
+	{-3,-4,-6,-7,-3,-4,-6,-7,-5,2,6,-4,3,0,-5,-4,-3,-4,-2,1}
+	{-1,3,0,-2,-6,2,1,-3,-1,-5,-4,8,-3,-5,-2,-1,-1,-6,-4,-4}
+	{-2,-3,-4,-6,-3,-1,-4,-5,-4,2,3,-3,9,0,-4,-3,-1,-3,-3,1}
+	{-4,-5,-6,-6,-4,-5,-6,-6,-2,-1,0,-5,0,10,-6,-4,-4,0,4,-2}
+	{-1,-3,-4,-3,-6,-3,-2,-5,-4,-5,-5,-2,-4,-6,12,-2,-3,-7,-6,-4}
+	{2,-2,1,-1,-2,-1,-1,-1,-2,-4,-4,-1,-3,-4,-2,7,2,-6,-3,-3}
+	{0,-2,0,-2,-2,-1,-2,-3,-3,-2,-3,-1,-1,-4,-3,2,8,-5,-3,0}
+	{-5,-5,-7,-8,-5,-4,-6,-6,-4,-5,-4,-6,-3,0,-7,-6,-5,16,3,-5}
+	{-4,-4,-4,-6,-5,-3,-5,-6,3,-3,-2,-4,-3,4,-6,-3,-3,3,11,-3}
+	{-1,-4,-5,-6,-2,-4,-4,-6,-5,4,1,-4,1,-2,-4,-3,0,-5,-3,7}
+	};
+}
+
+if (refSeq == 1)
+{
+	scoreMatrix = 
+{
+{                11,                 0,                 2,                 2,                -2,                 3,                -1,                 1,                 0,                -1,                 1,                 0,                 3,                -2,                 0,                 3,                 7,                 5,                -5,                -4}
+{                 0,                15,                -2,                -4,                 8,                 2,                 2,                -1,                -2,                 0,                -1,                 0,                -1,                -4,                 0,                 5,                 2,                 0,                 5,                 7}
+{                 2,                -2,                12,                 6,                -3,                 4,                 4,                -2,                 1,                -5,                -2,                 7,                -2,                -1,                -1,                 2,                 1,                 2,                -4,                 2}
+{                 2,                -4,                 6,                10,                -5,                 4,                 0,                -3,                 4,                -5,                 0,                 1,                -3,                 3,                 0,                -1,                 0,                 1,                -4,                -2}
+{                -2,                 8,                -3,                -5,                14,                 0,                 2,                 4,                -3,                 5,                 2,                -1,                -1,                -2,                -2,                 2,                 0,                 2,                 3,                 8}
+{                 3,                 2,                 4,                 4,                 0,                10,                -1,                -2,                 1,                -4,                -2,                 0,                -2,                -1,                 3,                 4,                 0,                 1,                 2,                -3}
+{                -1,                 2,                 4,                 0,                 2,                -1,                15,                 0,                 2,                 2,                 0,                 6,                 4,                 6,                 6,                 2,                 2,                -3,                 0,                 9}
+{                 1,                -1,                -2,                -3,                 4,                -2,                 0,                10,                 0,                 4,                 7,                 1,                -1,                -2,                 0,                 2,                 5,                 7,                -4,                 0}
+{                 0,                -2,                 1,                 4,                -3,                 1,                 2,                 0,                11,                -2,                 3,                 5,                 0,                 5,                 7,                 2,                 4,                 0,                -2,                -2}
+{                -1,                 0,                -5,                -5,                 5,                -4,                 2,                 4,                -2,                 9,                 5,                -3,                 2,                 2,                 0,                 1,                 0,                 2,                 1,                 0}
+{                 1,                -1,                -2,                 0,                 2,                -2,                 0,                 7,                 3,                 5,                15,                 0,                 0,                 0,                 4,                 0,                 5,                 6,                 0,                -2}
+{                 0,                 0,                 7,                 1,                -1,                 0,                 6,                 1,                 5,                -3,                 0,                12,                 0,                 1,                 2,                 7,                 5,                -1,                -5,                 4}
+{                 3,                -1,                -2,                -3,                -1,                -2,                 4,                -1,                 0,                 2,                 0,                 0,                12,                 5,                 2,                 5,                 3,                -2,                -2,                -1}
+{                -2,                -4,                -1,                 3,                -2,                -1,                 6,                -2,                 5,                 2,                 0,                 1,                 5,                11,                 4,                 0,                 0,                -3,                -3,                 0}
+{                 0,                 0,                -1,                 0,                -2,                 3,                 6,                 0,                 7,                 0,                 4,                 2,                 2,                 4,                10,                 4,                 3,                -1,                 2,                 0}
+{                 3,                 5,                 2,                -1,                 2,                 4,                 2,                 2,                 2,                 1,                 0,                 7,                 5,                 0,                 4,                11,                 6,                 0,                -2,                 2}
+{                 7,                 2,                 1,                 0,                 0,                 0,                 2,                 5,                 4,                 0,                 5,                 5,                 3,                 0,                 3,                 6,                11,                 2,                -4,                 0}
+{                 5,                 0,                 2,                 1,                 2,                 1,                -3,                 7,                 0,                 2,                 6,                -1,                -2,                -3,                -1,                 0,                 2,                11,                -5,                -2}
+{                -5,                 5,                -4,                -4,                 3,                 2,                 0,                -4,                -2,                 1,                 0,                -5,                -2,                -3,                 2,                -2,                -4,                -5,                14,                 3}
+{                -4,                 7,                 2,                -2,                 8,                -3,                 9,                 0,                -2,                 0,                -2,                 4,                -1,                 0,                 0,                 2,                 0,                -2,                 3,                14}
+};
+
+}
+
+if (refSeq == 2)
+{
+	scoreMatrix = 
+{
+{                11,                -2,                 1,                 0,                -5,                 1,                -3,                -1,                -3,                -3,                -2,                -2,                 1,                -4,                -1,                 2,                 5,                 4,                -8,                -7}
+{                -2,                16,                -6,                -7,                 6,                 0,                 0,                -4,                -6,                -3,                -5,                -2,                -4,                -7,                -1,                 4,                 0,                 0,                 3,                 6}
+{                 1,                -6,                12,                 4,                -6,                 2,                 2,                -5,                -2,                -8,                -5,                 6,                -5,                -4,                -5,                 0,                -1,                 0,                -7,                 0}
+{                 0,                -7,                 4,                10,                -8,                 2,                -2,                -6,                 2,                -8,                -2,                -1,                -6,                 1,                -2,                -5,                -2,                 0,                -7,                -4}
+{                -5,                 6,                -6,                -8,                14,                -1,                 0,                 2,                -5,                 4,                 0,                -4,                -4,                -5,                -6,                 0,                -4,                 0,                 1,                 7}
+{                 1,                 0,                 2,                 2,                -1,                10,                -4,                -6,                 0,                -8,                -5,                -1,                -5,                -4,                 2,                 2,                -1,                 0,                 0,                -7}
+{                -3,                 0,                 2,                -2,                 0,                -4,                15,                -3,                 0,                 1,                -2,                 5,                 3,                 4,                 5,                 0,                 0,                -6,                -2,                 7}
+{                -1,                -4,                -5,                -6,                 2,                -6,                -3,                10,                -1,                 2,                 5,                 0,                -4,                -6,                 0,                 0,                 4,                 5,                -7,                -2}
+{                -3,                -6,                -2,                 2,                -5,                 0,                 0,                -1,                11,                -4,                 1,                 4,                -3,                 4,                 5,                 0,                 3,                -2,                -5,                -6}
+{                -3,                -3,                -8,                -8,                 4,                -8,                 1,                 2,                -4,                 9,                 3,                -6,                 1,                 0,                -1,                 0,                -3,                 0,                 0,                -2}
+{                -2,                -5,                -5,                -2,                 0,                -5,                -2,                 5,                 1,                 3,                15,                -3,                -4,                -1,                 2,                -3,                 4,                 4,                -2,                -6}
+{                -2,                -2,                 6,                -1,                -4,                -1,                 5,                 0,                 4,                -6,                -3,                12,                -3,                 0,                 0,                 5,                 4,                -4,                -8,                 2}
+{                 1,                -4,                -5,                -6,                -4,                -5,                 3,                -4,                -3,                 1,                -4,                -3,                12,                 3,                 0,                 3,                 1,                -5,                -4,                -4}
+{                -4,                -7,                -4,                 1,                -5,                -4,                 4,                -6,                 4,                 0,                -1,                 0,                 3,                12,                 2,                -2,                -1,                -6,                -5,                -2}
+{                -1,                -1,                -5,                -2,                -6,                 2,                 5,                 0,                 5,                -1,                 2,                 0,                 0,                 2,                11,                 2,                 2,                -4,                 0,                -3}
+{                 2,                 4,                 0,                -5,                 0,                 2,                 0,                 0,                 0,                 0,                -3,                 5,                 3,                -2,                 2,                12,                 4,                -3,                -5,                 0}
+{                 5,                 0,                -1,                -2,                -4,                -1,                 0,                 4,                 3,                -3,                 4,                 4,                 1,                -1,                 2,                 4,                11,                 0,                -7,                -3}
+{                 4,                 0,                 0,                 0,                 0,                 0,                -6,                 5,                -2,                 0,                 4,                -4,                -5,                -6,                -4,                -3,                 0,                11,                -8,                -5}
+{                -8,                 3,                -7,                -7,                 1,                 0,                -2,                -7,                -5,                 0,                -2,                -8,                -4,                -5,                 0,                -5,                -7,                -8,                14,                 2}
+{                -7,                 6,                 0,                -4,                 7,                -7,                 7,                -2,                -6,                -2,                -6,                 2,                -4,                -2,                -3,                 0,                -3,                -5,                 2,                14}
+};
+
+}
+
+if (refSeq == 3)
+{
+	scoreMatrix = 
+{
+{                10,                 1,                 4,                 3,                 0,                 4,                 0,                 3,                 1,                 0,                 3,                 3,                 4,                 0,                 2,                 5,                 7,                 6,                -2,                -1}
+{                 1,                15,                 0,                -2,                 9,                 3,                 4,                 0,                 0,                 1,                 0,                 2,                 0,                -1,                 2,                 6,                 3,                 2,                 6,                 8}
+{                 4,                 0,                12,                 7,                -1,                 5,                 5,                 0,                 3,                -3,                 0,                 8,                 0,                 1,                 0,                 4,                 3,                 3,                -2,                 3}
+{                 3,                -2,                 7,                10,                -3,                 5,                 1,                 0,                 5,                -3,                 0,                 3,                 0,                 4,                 2,                 0,                 1,                 2,                -2,                 0}
+{                 0,                 9,                -1,                -3,                13,                 1,                 5,                 5,                -1,                 6,                 4,                 0,                 1,                 0,                 0,                 3,                 1,                 3,                 4,                 9}
+{                 4,                 3,                 5,                 5,                 1,                10,                 1,                 0,                 3,                -2,                 0,                 2,                 0,                 0,                 4,                 5,                 2,                 2,                 3,                -1}
+{                 0,                 4,                 5,                 1,                 5,                 1,                14,                 1,                 4,                 3,                 2,                 7,                 5,                 7,                 7,                 4,                 3,                 0,                 1,                10}
+{                 3,                 0,                 0,                 0,                 5,                 0,                 1,                 9,                 1,                 5,                 7,                 2,                 0,                 0,                 2,                 3,                 6,                 7,                -1,                 1}
+{                 1,                 0,                 3,                 5,                -1,                 3,                 4,                 1,                10,                 0,                 4,                 6,                 1,                 6,                 8,                 3,                 5,                 1,                 0,                 0}
+{                 0,                 1,                -3,                -3,                 6,                -2,                 3,                 5,                 0,                 9,                 6,                 0,                 4,                 3,                 1,                 2,                 1,                 3,                 2,                 2}
+{                 3,                 0,                 0,                 0,                 4,                 0,                 2,                 7,                 4,                 6,                15,                 2,                 1,                 2,                 5,                 2,                 6,                 7,                 0,                 0}
+{                 3,                 2,                 8,                 3,                 0,                 2,                 7,                 2,                 6,                 0,                 2,                11,                 2,                 3,                 4,                 7,                 6,                 0,                -2,                 5}
+{                 4,                 0,                 0,                 0,                 1,                 0,                 5,                 0,                 1,                 4,                 1,                 2,                12,                 6,                 3,                 6,                 4,                 0,                -1,                 0}
+{                 0,                -1,                 1,                 4,                 0,                 0,                 7,                 0,                 6,                 3,                 2,                 3,                 6,                11,                 5,                 1,                 2,                -1,                -1,                 2}
+{                 2,                 2,                 0,                 2,                 0,                 4,                 7,                 2,                 8,                 1,                 5,                 4,                 3,                 5,                10,                 5,                 4,                 0,                 3,                 1}
+{                 5,                 6,                 4,                 0,                 3,                 5,                 4,                 3,                 3,                 2,                 2,                 7,                 6,                 1,                 5,                11,                 6,                 1,                 0,                 3}
+{                 7,                 3,                 3,                 1,                 1,                 2,                 3,                 6,                 5,                 1,                 6,                 6,                 4,                 2,                 4,                 6,                10,                 4,                -2,                 1}
+{                 6,                 2,                 3,                 2,                 3,                 2,                 0,                 7,                 1,                 3,                 7,                 0,                 0,                -1,                 0,                 1,                 4,                10,                -2,                 0}
+{                -2,                 6,                -2,                -2,                 4,                 3,                 1,                -1,                 0,                 2,                 0,                -2,                -1,                -1,                 3,                 0,                -2,                -2,                13,                 5}
+{                -1,                 8,                 3,                 0,                 9,                -1,                10,                 1,                 0,                 2,                 0,                 5,                 0,                 2,                 1,                 3,                 1,                 0,                 5,                14}
+};
+
+}
+
+
+alignOptions ["SEQ_ALIGN_SCORE_MATRIX"] = 	scoreMatrix;
+alignOptions ["SEQ_ALIGN_GAP_OPEN"]		= 	40;
+alignOptions ["SEQ_ALIGN_GAP_OPEN2"]	= 	20;
+alignOptions ["SEQ_ALIGN_GAP_EXTEND"]	= 	10;
+alignOptions ["SEQ_ALIGN_GAP_EXTEND2"]	= 	5;
+alignOptions ["SEQ_ALIGN_AFFINE"]		=   1;
+
+ChoiceList (refSeq,"Prefix/Suffix Indels",1,SKIP_NONE,"No penalty","Do not penalize prefix and suffix Indels","Normal penalty","Treat prefix and suffix indels as any other indels");
+if (refSeq < 0)
+{
+	return 0;
+}
+
+alignOptions ["SEQ_ALIGN_NO_TP"]		=   1-refSeq;
+
+/* END ALIGNMENT SETTINGS */
+
+
+/* REFERENCE SEQUENCES OPTIONS */
+
+predefSeqNames = {{"First in file", "Use the first sequence in the data file as a reference"}
+				 /*0*/ {"HXB2_env", "Use HIV-1 HXB2 reference strain envelope sequence (K03455)"}
+				 /*1*/ {"HXB2_nef", "Use HIV-1 HXB2 reference strain NEF sequence (K03455)"}
+				 /*2*/ {"HXB2_gag", "Use HIV-1 HXB2 reference strain gag sequence (K03455)"} 
+				 /*3*/ {"HXB2_vpr", "Use HIV-1 HXB2 reference strain vpr sequence (K03455)"} 
+				 /*4*/ {"HXB2_vif", "Use HIV-1 HXB2 reference strain vif sequence (K03455)"} 
+				 /*5*/ {"HXB2_vpu", "Use HIV-1 HXB2 reference strain vpu sequence (K03455)"} 
+				 /*6*/ {"HXB2_pr", "Use HIV-1 HXB2 reference strain protease sequence (K03455)"} 
+				 /*7*/ {"HXB2_rt", "Use HIV-1 HXB2 reference strain reverse transcriptase sequence (K03455)"} 
+				 /*8*/ {"HXB2_int", "Use HIV-1 HXB2 reference strain integrase sequence (K03455)"} 
+				 /*9*/ {"HXB2_rev", "Use HIV-1 HXB2 reference strain rev (exons 1 and 2)sequence (K03455)"} 
+				/*10*/ {"HXB2_tat", "Use HIV-1 HXB2 reference strain tat (exons 1 and 2) sequence (K03455)"} 
+				/*11*/ {"HXB2_prrt", "Use HIV-1 HXB2 reference strain protease+rt sequence (K03455)"}
+				/*12*/ {"NL4_3prrt", "Use HIV-1 NL4-3 reference strain pr+rt sequence"} 
+				  				  };
+				  
+				  
+predefSeqNames2 = {{"No", "No reference coordinate sequences"}
+				 /*0*/ {"HXB2_env", "Use HIV-1 HXB2 reference strain envelope sequence (K03455)"}
+				 /*1*/ {"HXB2_nef", "Use HIV-1 HXB2 reference strain NEF sequence (K03455)"}
+				 /*2*/ {"HXB2_gag", "Use HIV-1 HXB2 reference strain gag sequence (K03455)"} 
+				 /*3*/ {"HXB2_vpr", "Use HIV-1 HXB2 reference strain vpr sequence (K03455)"} 
+				 /*4*/ {"HXB2_vif", "Use HIV-1 HXB2 reference strain vif sequence (K03455)"} 
+				 /*5*/ {"HXB2_vpu", "Use HIV-1 HXB2 reference strain vpu sequence (K03455)"} 
+				 /*6*/ {"HXB2_pr", "Use HIV-1 HXB2 reference strain protease sequence (K03455)"} 
+				 /*7*/ {"HXB2_rt", "Use HIV-1 HXB2 reference strain reverse transcriptase sequence (K03455)"} 
+				 /*8*/ {"HXB2_int", "Use HIV-1 HXB2 reference strain integrase sequence (K03455)"} 
+				 /*9*/ {"HXB2_rev", "Use HIV-1 HXB2 reference strain rev (exons 1 and 2)sequence (K03455)"} 
+				/*10*/ {"HXB2_tat", "Use HIV-1 HXB2 reference strain tat (exons 1 and 2) sequence (K03455)"} 
+				/*11*/ {"HXB2_prrt", "Use HIV-1 HXB2 reference strain protease+rt sequence (K03455)"} 
+				/*12*/ {"NL4_3prrt", "Use HIV-1 NL4-3 reference strain pr+rt sequence"} 
+				  };
+
+RefSeqs = {};
+RefSeqs [0] = "ATGAGAGTGAAGGAGAAATATCAGCACTTGTGGAGATGGGGGTGGAGATGGGGCACCATGCTCCTTGGGATGTTGATGATCTGTAGTGCTACAGAAAAATTGTGGGTCACAGTCTATTATGGGGTACCTGTGTGGAAGGAAGCAACCACCACTCTATTTTGTGCATCAGATGCTAAAGCATATGATACAGAGGTACATAATGTTTGGGCCACACATGCCTGTGTACCCACAGACCCCAACCCACAAGAAGTAGTATTGGTAAATGTGACAGAAAATTTTAACATGTGGAAAAATGACATGGTAGAACAGATGCATGAGGATATAATCAGTTTATGGGATCAAAGCCTAAAGCCATGTGTAAAATTAACCCCACTCTGTGTTAGTTTAAAGTGCACTGATTTGAAGAATGATACTAATACCAATAGTAGTAGCGGGAGAATGATAATGGAGAAAGGAGAGATAAAAAACTGCTCTTTC [...]
+RefSeqs [1] = "ATGGGTGGCAAGTGGTCAAAAAGTAGTGTGATTGGATGGCCTACTGTAAGGGAAAGAATGAGACGAGCTGAGCCAGCAGCAGATAGGGTGGGAGCAGCATCTCGAGACCTGGAAAAACATGGAGCAATCACAAGTAGCAATACAGCAGCTACCAATGCTGCTTGTGCCTGGCTAGAAGCACAAGAGGAGGAGGAGGTGGGTTTTCCAGTCACACCTCAGGTACCTTTAAGACCAATGACTTACAAGGCAGCTGTAGATCTTAGCCACTTTTTAAAAGAAAAGGGGGGACTGGAAGGGCTAATTCACTCCCAAAGAAGACAAGATATCCTTGATCTGTGGATCTACCACACACAAGGCTACTTCCCTGAT---CAGAACTACACACCAGGGCCAGGGGTCAGATATCCACTGACCTTTGGATGGTGCTACAAGCTAGTACCAGTTGAGCCAGATAAGATAGAAGAGGCCAATAAAGGA [...]
+RefSeqs [2] = "ATGGGTGCGAGAGCGTCAGTATTAAGCGGGGGAGAATTAGATCGATGGGAAAAAATTCGGTTAAGGCCAGGGGGAAAGAAAAAATATAAATTAAAACATATAGTATGGGCAAGCAGGGAGCTAGAACGATTCGCAGTTAATCCTGGCCTGTTAGAAACATCAGAAGGCTGTAGACAAATACTGGGACAGCTACAACCATCCCTTCAGACAGGATCAGAAGAACTTAGATCATTATATAATACAGTAGCAACCCTCTATTGTGTGCATCAAAGGATAGAGATAAAAGACACCAAGGAAGCTTTAGACAAGATAGAGGAAGAGCAAAACAAAAGTAAGAAAAAAGCACAGCAAGCAGCAGCTGACACAGGACACAGCAATCAGGTCAGCCAAAATTACCCTATAGTGCAGAACATCCAGGGGCAAATGGTACATCAGGCCATATCACCTAGAACTTTAAATGCATGGGTAAAAGTAGTA [...]
+RefSeqs [3] = "ATGGAACAAGCCCCAGAAGACCAAGGGCCACAGAGGGAGCCACACAATGAATGGACACTAGAGCTTTTAGAGGAGCTTAAGAATGAAGCTGTTAGACATTTTCCTAGGATTTGGCTCCATGGCTTAGGGCAACATATCTATGAAACTTATGGGGATACTTGGGCAGGAGTGGAAGCCATAATAAGAATTCTGCAACAACTGCTGTTTATCCATTTTCAGAATTGGGTGTCGACATAGCAGAATAGGCGTTACTCGACAGAGGAGAGCAAGAAATGGAGCCAGTAGATCC";				  
+RefSeqs [4] = "ATGGAAAACAGATGGCAGGTGATGATTGTGTGGCAAGTAGACAGGATGAGGATTAGAACATGGAAAAGTTTAGTAAAACACCATATGTATGTTTCAGGGAAAGCTAGGGGATGGTTTTATAGACATCACTATGAAAGCCCTCATCCAAGAATAAGTTCAGAAGTACACATCCCACTAGGGGATGCTAGATTGGTAATAACAACATATTGGGGTCTGCATACAGGAGAAAGAGACTGGCATTTGGGTCAGGGAGTCTCCATAGAATGGAGGAAAAAGAGATATAGCACACAAGTAGACCCTGAACTAGCAGACCAACTAATTCATCTGTATTACTTTGACTGTTTTTCAGACTCTGCTATAAGAAAGGCCTTATTAGGACACATAGTTAGCCCTAGGTGTGAATATCAAGCAGGACATAACAAGGTAGGATCTCTACAATACTTGGCACTAGCAGCATTAATAACACCAAAAAAGATA [...]
+RefSeqs [5] = "ACGCAACCTATACCAATAGTAGCAATAGTAGCATTAGTAGTAGCAATAATAATAGCAATAGTTGTGTGGTCCATAGTAATCATAGAATATAGGAAAATATTAAGACAAAGAAAAATAGACAGGTTAATTGATAGACTAATAGAAAGAGCAGAAGACAGTGGCAATGAGAGTGAAGGAGAAATATCAGCACTTGTGGAGATGGGGGTGGAGATGGGGCACCATGCTCCTTGGGATGTTGATGATC";				  
+RefSeqs [6] = "CCTCAGGTCACTCTTTGGCAACGACCCCTCGTCACAATAAAGATAGGGGGGCAACTAAAGGAAGCTCTATTAGATACAGGAGCAGATGATACAGTATTAGAAGAAATGAGTTTGCCAGGAAGATGGAAACCAAAAATGATAGGGGGAATTGGAGGTTTTATCAAAGTAAGACAGTATGATCAGATACTCATAGAAATCTGTGGACATAAAGCTATAGGTACAGTATTAGTAGGACCTACACCTGTCAACATAATTGGAAGAAATCTGTTGACTCAGATTGGTTGCACTTTAAATTTT";				  
+RefSeqs [7] = "CCCATTAGCCCTATTGAGACTGTACCAGTAAAATTAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAATAAAAGCATTAGTAGAAATTTGTACAGAGATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAAGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGATGGAAAGGATCACCAGCAATA [...]
+RefSeqs [8] = "TTTTTAGATGGAATAGATAAGGCCCAAGATGAACATGAGAAATATCACAGTAATTGGAGAGCAATGGCTAGTGATTTTAACCTGCCACCTGTAGTAGCAAAAGAAATAGTAGCCAGCTGTGATAAATGTCAGCTAAAAGGAGAAGCCATGCATGGACAAGTAGACTGTAGTCCAGGAATATGGCAACTAGATTGTACACATTTAGAAGGAAAAGTTATCCTGGTAGCAGTTCATGTAGCCAGTGGATATATAGAAGCAGAAGTTATTCCAGCAGAAACAGGGCAGGAAACAGCATATTTTCTTTTAAAATTAGCAGGAAGATGGCCAGTAAAAACAATACATACTGACAATGGCAGCAATTTCACCGGTGCTACGGTTAGGGCCGCCTGTTGGTGGGCGGGAATCAAGCAGGAATTTGGAATTCCCTACAATCCCCAAAGTCAAGGAGTAGTAGAATCTATGAATAAAGAATTAAAG [...]
+RefSeqs [9] = "ATGGCAGGAAGAAGCGGAGACAGCGACGAAGAGCTCATCAGAACAGTCAGACTCATCAAGCTTCTCTAACCCACCTCCCAACCCCGAGGGGACCCGACAGGCCCGAAGGAATAGAAGAAGAAGGTGGAGAGAGAGACAGAGACAGATCCATTCGATTAGTGAACGGATCCTTGGCACTTATCTGGGACGATCTGCGGAGCCTGTGCCTCTTCAGCTACCACCGCTTGAGAGACTTACTCTTGATTGTAACGAGGATTGTGGAACTTCTGGGACGCAGGGGGTGGGAAGCCCTCAAATATTGGTGGAATCTCCTACAGTATTGGAGTCAGGAACTAAAGA";
+RefSeqs[10] = "ATGGAGCCAGTAGATCCTAGACTAGAGCCCTGGAAGCATCCAGGAAGTCAGCCTAAAACTGCTTGTACCAATTGCTATTGTAAAAAGTGTTGCTTTCATTGCCAAGTTTGTTTCATAACAAAAGCCTTAGGCATCTCCTATGGCAGGAAGAAGCGGAGACAGCGACGAAGAGCTCATCAGAACAGTCAGACTCATCAAGCTTCTCTATCAAAGCAACCCACCTCCCAACCCCGAGGGGACCCGACAGGCCCGAAGGAATAGAAGAAGAAGGTGGAGAGAGAGACAGAGACAGATCCATTCGAT";
+RefSeqs[11] = "CCTCAGGTCACTCTTTGGCAACGACCCCTCGTCACAATAAAGATAGGGGGGCAACTAAAGGAAGCTCTATTAGATACAGGAGCAGATGATACAGTATTAGAAGAAATGAGTTTGCCAGGAAGATGGAAACCAAAAATGATAGGGGGAATTGGAGGTTTTATCAAAGTAAGACAGTATGATCAGATACTCATAGAAATCTGTGGACATAAAGCTATAGGTACAGTATTAGTAGGACCTACACCTGTCAACATAATTGGAAGAAATCTGTTGACTCAGATTGGTTGCACTTTAAATTTTCCCATTAGCCCTATTGAGACTGTACCAGTAAAATTAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAATAAAAGCATTAGTAGAAATTTGTACAGAGATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTA [...]
+RefSeqs[12] = "CCTCAGATCACTCTTTGGCAGCGACCCCTCGTCACAATAAAGATAGGGGGGCAATTAAAGGAAGCTCTATTAGATACAGGAGCAGATGATACAGTATTAGAAGAAATGAATTTGCCAGGAAGATGGAAACCAAAAATGATAGGGGGAATTGGAGGTTTTATCAAAGTAGGACAGTATGATCAGATACTCATAGAAATCTGCGGACATAAAGCTATAGGTACAGTATTAGTAGGACCTACACCTGTCAACATAATTGGAAGAAATCTGTTGACTCAGATTGGCTGCACTTTAAATTTTCCCATTAGTCCTATTGAGACTGTACCAGTAAAATTAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAATAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTA [...]
+
+ChoiceList (refSeq,"Choose a reference sequence",1,SKIP_NONE,predefSeqNames);
+if (refSeq < 0)
+{
+	return 0;
+}
+
+SetDialogPrompt ("Sequence File:");
+
+if (refSeq > 0)
+{
+	DataSet        unal2 			= ReadDataFile 	(PROMPT_FOR_FILE);
+	refSeq = ">" + predefSeqNames [refSeq][0] + "\n" + RefSeqs[refSeq-1];
+	DataSet		   refD = ReadFromString (refSeq);
+	DataSet        unal = Combine (refD,unal2);
+}
+else
+{
+	
+	ChoiceList (refSeq2,"Insert a coordinate reference sequence?",1,SKIP_NONE,predefSeqNames2);
+	if (refSeq2 < 0)
+	{
+		return 0;
+	}
+	if (refSeq2)
+	{
+		DataSet        unal2 			= ReadDataFile 	(PROMPT_FOR_FILE);
+		refSeq = ">" + predefSeqNames [refSeq2][0] + "\n" + RefSeqs[refSeq2-1];
+		DataSet		   refD = ReadFromString (refSeq);
+		DataSet        unal = Combine (unal2,refD);
+	}
+	else
+	{
+		DataSet        unal 			= ReadDataFile 	(PROMPT_FOR_FILE);
+	}
+}
+
+ChoiceList (skipOutliers,"Include outliers?",1,SKIP_NONE,"No","Skip sequences with unusually poor alignment scores","Yes","Include all alignable sequences");
+
+if (skipOutliers<0)
+{
+	return 0;
+}
+
+DataSetFilter  filteredData 	= CreateFilter	(unal,1);
+
+GetInformation (UnalignedSeqs,filteredData);
+/* preprocess sequences */
+
+unalSequenceCount = Rows(UnalignedSeqs)*Columns(UnalignedSeqs);
+
+for (seqCounter = 0; seqCounter < unalSequenceCount; seqCounter = seqCounter+1)
+{
+	aSeq = UnalignedSeqs[seqCounter];
+	/*for (siteCounter = Abs(aSeq)-1; siteCounter>0; siteCounter=siteCounter-1)
+	{
+		if (aSeq[siteCounter]!="?")
+		{
+			break;
+		}
+	}
+	UnalignedSeqs[seqCounter] = aSeq[0][siteCounter];*/
+	UnalignedSeqs[seqCounter] = aSeq^{{"[^a-zA-Z]",""}};
+	UnalignedSeqs[seqCounter] = UnalignedSeqs[seqCounter]^{{"^N+",""}};
+	UnalignedSeqs[seqCounter] = UnalignedSeqs[seqCounter]^{{"N+$",""}};
+}
+
+/* build codon translation table */
+
+incFileName = HYPHY_LIB_DIRECTORY+"TemplateBatchFiles"+DIRECTORY_SEPARATOR+"TemplateModels"+DIRECTORY_SEPARATOR+"chooseGeneticCode.def";
+ExecuteCommands  ("#include \""+incFileName+"\";");
+
+codonToAAMap = {};
+codeToAA 	 = "FLIMVSPTAYXHQNKDECWRG";
+
+nucChars = "ACGT";
+
+for (p1=0; p1<64; p1=p1+1)
+{
+	codon = nucChars[p1$16]+nucChars[p1%16$4]+nucChars[p1%4];
+	ccode = _Genetic_Code[p1];
+	codonToAAMap[codon] = codeToAA[ccode];
+}
+
+/* determine reading frames	*/
+ProteinSequences = {};
+AllTranslations  = {};
+ReadingFrames	 = {};
+StopCodons		 = {};
+StopPositions    = {};
+
+fprintf (stdout, "\nDetecting reading frames for each sequence...\n");
+frameCounter  = {3,1};
+stillHasStops = {};
+
+for (seqCounter = 0; seqCounter < unalSequenceCount; seqCounter = seqCounter+1)
+{
+	aSeq = UnalignedSeqs[seqCounter];
+	seqLen = Abs(aSeq)-2;
+	
+	minStops = 1e20;
+	tString = "";
+	rFrame = 0;
+	
+	stopPosn = {3,2};
+	allTran  = {3,1};
+	for (offset = 0; offset < 3; offset = offset+1)
+	{
+		translString = "";
+		translString * (seqLen/3+1);
+		for (seqPos = offset; seqPos < seqLen; seqPos = seqPos+3)
+		{
+			codon = aSeq[seqPos][seqPos+2];
+			prot = codonToAAMap[codon];
+			if (Abs(prot))
+			{
+				translString * prot;
+			}
+			else
+			{
+				translString * "?";
+			}
+		} 
+		translString * 0;
+		translString = translString^{{"X$","?"}};
+		stopPos = translString||"X";
+		if (stopPos[0]>=0)
+		{
+			stopCount = Rows(stopPos)$2;
+			stopPosn[offset][0] = stopPos[0];
+			stopPosn[offset][1] = stopPos[stopCount*2-1];
+		}
+		else
+		{
+			stopCount = 0;
+		}
+		if (stopCount<minStops)
+		{
+			minStops = stopCount;
+			rFrame = offset;
+			tString = translString;
+		}
+		allTran[offset] = translString;
+	}
+	ReadingFrames[seqCounter] 		= rFrame;
+	ProteinSequences[seqCounter]	= tString;
+	frameCounter[rFrame] 			= frameCounter[rFrame]+1;
+	StopPositions[seqCounter]		= stopPosn;
+	AllTranslations [seqCounter]	= allTran;
+	
+	if (minStops>0)
+	{
+		stillHasStops[Abs(stillHasStops)] = seqCounter;
+		if (seqCounter == 0)
+		{
+			fprintf (stdout, "Reference sequence must not contain frameshifts\n");
+			return 0;
+		}
+	}
+}
+
+s1 = ProteinSequences[0];
+
+fprintf (stdout, "\nFound:\n\t", frameCounter[0], " sequences in reading frame 1\n\t",frameCounter[1], " sequences in reading frame 2\n\t",frameCounter[2], " sequences in reading frame 3\n\nThere were ", Abs(stillHasStops), " sequences with apparent frameshift/sequencing errors\n");
+
+skipSeqs = {};
+
+for (k=0; k<Abs(stillHasStops); k=k+1)
+{
+	seqCounter = stillHasStops[k];
+	GetString (seqName, unal, seqCounter);
+	fprintf (stdout,"Sequence ", seqCounter+1, " (", seqName, ") seems to have");
+	stopPosn = StopPositions[seqCounter];
+	
+	fStart = -1;
+	fEnd   = -1;
+	fMin   = 1e10;
+	frame1 = 0;
+	frame2 = 0;
+	
+	checkFramePosition (stopPosn[0][1],stopPosn[1][0],0,1);
+	checkFramePosition (stopPosn[1][1],stopPosn[0][0],1,0);
+	checkFramePosition (stopPosn[0][1],stopPosn[2][0],0,2);
+	checkFramePosition (stopPosn[2][1],stopPosn[0][0],2,0);
+	checkFramePosition (stopPosn[2][1],stopPosn[1][0],2,1);
+	checkFramePosition (stopPosn[1][1],stopPosn[2][0],1,2);
+	
+	if (fStart>=0)
+	{
+		allTran = AllTranslations[seqCounter];
+		useq    				   = UnalignedSeqs[seqCounter];
+		fprintf (stdout, " a shift from frame ", frame2+1, " to frame ", frame1+1, " between a.a. positions ", fStart, " and ", fEnd, ".");
+		fStart2 = Max(fStart-1,0);
+		fEnd2   = Min(fEnd+1,Min(Abs(allTran[frame1]),Abs(allTran[frame2]))-1);
+		tempString = allTran[frame2];
+		fprintf (stdout, "\n\tRegion ", fStart2, "-", fEnd2, " in frame  ", frame2+1, ":\n\t", tempString[fStart2][fEnd2]);
+		fprintf (stdout, "\n\t", useq[3*fStart2+frame2][3*fEnd2+frame2-1]);
+		tempString = allTran[frame1];
+		fprintf (stdout, "\n\tRegion ", fStart2, "-", fEnd2, " in frame  ", frame1+1, ":\n\t", tempString[fStart2][fEnd2]);
+		fprintf (stdout, "\n\t", useq[3*fStart2+frame1][3*fEnd2+frame1-1]);
+		fprintf (stdout, "\n\t\tAttempting to resolve by alignment to reference. ");
+		
+		f1s = allTran[frame1];
+		f2s = allTran[frame2];
+		f1l = Abs(f1s);
+		
+		bestScore  = -1e10;
+		bestSplice = -1;
+		
+		for (k2=fStart; k2<fEnd; k2=k2+1)
+		{
+			s2 = f2s[0][k2]+f1s[k2+1][Abs(f1s)];
+			inStr = {{s1,s2}};
+			AlignSequences(aligned, inStr, alignOptions);
+			aligned = aligned[0];
+			aligned = aligned[0];
+			if (aligned > bestScore)
+			{
+				bestScore = aligned;
+				bestSplice = k2;
+				bestString = s2;
+			}
+		}
+		fprintf (stdout, "Best splice site appears to be at a.a. position ", bestSplice, "\n");
+		/* update best spliced string */
+		
+		ProteinSequences[seqCounter] = bestString;
+		ReadingFrames[seqCounter]    = 0;
+		
+		UnalignedSeqs[seqCounter]  = useq[frame2][frame2+3*bestSplice+2] + useq[frame1+3*bestSplice+3][Abs(useq)-1] + "---";
+	}
+	else
+	{
+		
+		fprintf (stdout, " multiple frameshifts\n");
+		skipSeqs[seqCounter] = 1;
+	}	
+}
+
+SeqAlignments 	 = {};
+startingPosition = {unalSequenceCount,2};
+refLength = Abs(ProteinSequences[0]);
+refInsertions	 = {refLength,1};
+
+fprintf (stdout,"\nPerforming pairwise alignment with reference sequences\n");
+
+alignmentScores = {unalSequenceCount-1,2};
+
+for (seqCounter = 1; seqCounter < unalSequenceCount; seqCounter = seqCounter+1)
+{
+	if (skipSeqs[seqCounter] == 0)
+	{
+		s2 			 = ProteinSequences[seqCounter];
+		inStr 		 = {{s1,s2}};
+		AlignSequences(aligned, inStr, alignOptions);
+		aligned = aligned[0];
+		SeqAlignments[seqCounter] = aligned;
+		alignmentScores[seqCounter-1][0] = aligned[0];
+		alignmentScores[seqCounter-1][1] = seqCounter;
+		aligned = aligned[1];
+		myStartingPosition = aligned$"[^-]";
+		myEndingPosition  = Abs (aligned)-1;
+		while (aligned[myEndingPosition]=="-")
+		{
+			myEndingPosition = myEndingPosition - 1;
+		}
+		myStartingPosition = myStartingPosition[0];
+		startingPosition[seqCounter][0] = myStartingPosition;
+		startingPosition[seqCounter][1] = myEndingPosition;
+		aligned = aligned[myStartingPosition][myEndingPosition];
+		refInsert = aligned||"-+";
+		if (refInsert[0]>0)
+		{
+			insCount = Rows (refInsert)/2;
+			offset = 0;
+			for (insN = 0; insN < insCount; insN = insN+1)
+			{
+				insPos 		= refInsert[insN*2];
+				insLength	= refInsert[insN*2+1]-insPos+1;
+				insPos 		= insPos-offset;
+				if (refInsertions[insPos]<insLength)
+				{
+					refInsertions[insPos]=insLength;
+				}
+				offset = offset + insLength;
+			}
+		}
+	}
+}
+
+alignmentScores = alignmentScores%0;
+
+/* produce a fully gapped reference sequence */
+
+fprintf (stdout,"\nMerging pairwise alignments into a MSA\n");
+
+fullRefSeq = "";
+fullRefSeq * refLength;
+fullRefSeq * (s1[0]);
+
+
+s1N = UnalignedSeqs[0];
+
+fullRefSeqN = "";
+fullRefSeqN * (3*refLength);
+fullRefSeqN * (s1N[0][2]);
+
+frameShift = ReadingFrames[0];
+
+for (seqCounter=1;seqCounter<refLength;seqCounter=seqCounter+1)
+{
+	gapCount = refInsertions[seqCounter];
+	for (k=0; k<gapCount;k=k+1)
+	{
+		fullRefSeq*("-");
+		fullRefSeqN*("---");
+	}	
+	fullRefSeq  * (s1[seqCounter]);
+	fullRefSeqN * (s1N[frameShift+seqCounter*3][frameShift+seqCounter*3+2]);
+}
+
+fullRefSeq * 0;
+fullRefSeqN * 0;
+
+refLength = Abs(fullRefSeq);
+
+SetDialogPrompt ("Save alignment to:");
+
+GetString (seqName,unal,0);
+fprintf (PROMPT_FOR_FILE,CLEAR_FILE,">",seqName,"\n",fullRefSeq);
+fName = LAST_FILE_PATH;
+fNameC = fName+".nuc";
+fprintf (fNameC,CLEAR_FILE,">",seqName,"\n",fullRefSeqN);
+
+
+/*for (seqCounter = 1; seqCounter < unalSequenceCount; seqCounter = seqCounter+1)*/
+for (seqID = 0; seqID < 75; seqID = seqID + 1)
+{
+	seqCounter = alignmentScores[unalSequenceCount-2-seqID][1];
+	if (skipSeqs[seqCounter] == 0)
+	{
+		GetString (seqName,unal,seqCounter);
+		aligned = SeqAlignments[seqCounter];
+		
+		aligned1 = aligned[1];
+		aligned2 = aligned[2];
+		
+		s2 = startingPosition[seqCounter][0];
+		e2 = startingPosition[seqCounter][1];
+		
+		gappedSeq = "";
+		gappedSeq * Abs(aligned2);
+
+		
+		k=0;
+		
+		while (k<refLength)
+		{
+			while (fullRefSeq[k]!=aligned1[s2])
+			{
+				gappedSeq*("-");
+				k=k+1;
+			}
+			gappedSeq*(aligned2[s2]);
+			s2=s2+1;
+			k=k+1;
+		}
+
+		gappedSeq * 0;
+
+		gappedSeqN = "";
+		gappedSeqN * (3*Abs(aligned2));
+		
+		frameShift = ReadingFrames[seqCounter];
+
+		s1N 	= UnalignedSeqs[seqCounter];
+		s2N		= ProteinSequences[seqCounter];
+		s2 		= startingPosition[seqCounter][0];
+		k 		= 0;
+		e2		= Abs(gappedSeq);
+		k = 0;
+		while  (k<e2)
+		{
+			while ((s2N[s2]!=gappedSeq[k])&&(k<e2))
+			{
+				gappedSeqN * ("---");
+				k=k+1;
+			}
+			if (k<e2)
+			{
+				gappedSeqN * s1N[frameShift+s2*3][frameShift+s2*3+2];
+				s2 = s2+1;
+				k=k+1;
+			}
+		}
+		gappedSeqN * 0;
+
+		if (refSeq2 && seqCounter == unalSequenceCount-1)
+		{
+			fscanf (fName, "Raw", soFar);
+			fprintf (fName, CLEAR_FILE,">",seqName,"\n",gappedSeq,"\n",soFar);
+			fscanf (fNameC, "Raw", soFar);
+			fprintf (fNameC,CLEAR_FILE,">",seqName,"\n",gappedSeqN,"\n",soFar);		
+			
+		}
+		else
+		{
+			fprintf (fName,"\n>",seqName,"\n",gappedSeq);
+			fprintf (fNameC,"\n>",seqName,"\n",gappedSeqN);		
+		}
+	}
+}
+
+if (Abs(skipSeqs))
+{
+	fName = fName+".bad";
+	for (seqCounter = 1; seqCounter < unalSequenceCount; seqCounter = seqCounter+1)
+	{
+		if (skipSeqs[seqCounter])
+		{
+			GetString (seqName,unal,seqCounter);
+			fprintf (fName,">",seqName,"\n",UnalignedSeqs[seqCounter],"\n");
+		}
+	}
+}
+
+function checkFramePosition (pos1, pos2, fr1, fr2)
+{
+	fSpan  = pos2-pos1;
+	
+	if (fSpan>1) /* first followed by second*/
+	{
+		if (fSpan < fMin)
+		{
+			fMin = fSpan;
+			frame1 = fr1;
+			frame2 = fr2;
+			fStart = pos1+1;
+			fEnd   = pos2;
+		}
+	}	
+	return 0;
+}
+
diff --git a/res/TemplateBatchFiles/SequentialAddition.bf b/res/TemplateBatchFiles/SequentialAddition.bf
new file mode 100644
index 0000000..a5980c7
--- /dev/null
+++ b/res/TemplateBatchFiles/SequentialAddition.bf
@@ -0,0 +1,191 @@
+RequireVersion ("0.9920061122");
+
+#include "SequentialAddition.ibf";
+
+/*---------------------------------------------------------------*/
+
+ChoiceList (dataType,"Data type",1,SKIP_NONE,"Nucleotide/Protein","Nucleotide or amino-acid (protein).",
+				     "Codon","Codon (several available genetic codes).");
+
+if (dataType<0) 
+{
+	return;
+}
+
+
+MESSAGE_LOGGING = 0;
+twHasBeenOpened = 0;
+
+if (dataType)
+{
+	NICETY_LEVEL = 3;
+	SetDialogPrompt ("Please choose a codon data file:");
+	#include "TemplateModels/chooseGeneticCode.def";
+}
+else
+{
+	SetDialogPrompt ("Please choose a nucleotide or amino-acid data file:");
+}
+
+
+DataSet ds = ReadDataFile (PROMPT_FOR_FILE);
+
+ChoiceList (randomOption,"Addition Order",1,SKIP_NONE,
+			"Given Order","The sequences will be added in the order they appear in the data file.",
+			"Random Order","The order of addition will be random.");
+
+
+if (randomOption<0)
+{
+	return;
+}
+
+ChoiceList (haveTreeConstraint,"Topology Constraint",1,SKIP_NONE,
+			"No Constraint","No restrictions on topology.",
+			"Use Constraint","Use a topological constraint during tree searches.");
+
+
+if (haveTreeConstraint<0)
+{
+	return;
+}
+
+if (haveTreeConstraint)
+{
+	SetDialogPrompt ("Please select a topology constraint file:");
+	fscanf (PROMPT_FOR_FILE, "String", _topologyPatternString);
+	Tree _topologyPattern = _topologyPatternString;
+}
+
+
+ChoiceList (doNNIOption,"Branch Swapping",1,SKIP_NONE,
+			"No Swapping","No branch swapping is performed.",
+			"Complete NNI","Nearest neighbor interchange is performed after EACH sequence is added. Order (sequences)^2 additional trees are examined.",
+			"Complete SPR","Subtree pruning and regrafting is performed after EACH sequence is added. Order (sequences)^3 additional trees are examined.",
+			"Global NNI","Nearest neighbor interchange is performed after ALL the sequences have been added. Order (sequences)^1 additional trees are examined.",
+			"Global SPR","Subtree pruning and regrafting is performed after ALL the sequences have been added. Order (sequences)^2 additional trees are examined.",
+			"NNI+SPR","Nearest neighbor interchange is performed after EACH sequence is added. Subtree pruning and regrafting performed on the final tree. Order (sequences)^2 additional trees are examined.");
+
+
+if (doNNIOption<0)
+{
+	return;
+}
+
+if (doNNIOption == 1)
+{
+	nniPeriod = 0;
+	while (nniPeriod <= 0)
+	{
+		fprintf (stdout, "\nDo NNI every time this many branches are added (>=1):");
+		fscanf  (stdin, "Number", nniPeriod);
+	}
+}
+
+if (dataType)
+{
+	DataSetFilter filteredData = CreateFilter (ds,3,"","",GeneticCodeExclusions);
+}
+else
+{
+	DataSetFilter filteredData = CreateFilter (ds,1,"","");
+}
+
+SelectTemplateModel(filteredData);
+
+ExecuteAFile ("globalChecker.ibf");
+
+ChoiceList (methodIndex,"Starting 3 taxa tree",1,SKIP_NONE,
+			"First 3","The starting 3 taxa tree will comprise first 3 taxa from the data file.",
+			"Choose 3","User selects 3 taxa for the starting 3 taxa tree.",
+			"Best 3","The starting 3 taxa tree will be chosen by selecting the ML estimation among all possible 3 taxa trees. Warning: there are O(n^3) 3 taxa trees for n sequences.",
+			"Random","Select 3 random starting sequences.");
+
+/* begin by selecting the best 3-taxa tree */
+if (methodIndex<0)
+{
+	return;
+}
+
+first3Taxa = {3,1};
+
+if (methodIndex == 0)
+{
+	first3Taxa = first3Taxa["_MATRIX_ELEMENT_ROW_"];
+}
+else
+{
+	if (methodIndex == 1)
+	{
+		ChoiceList (first3Taxa, "Choose 3 taxa for the starting tree:",3,SKIP_NONE,ds);
+		if (first3Taxa[0]<0)
+		{
+			return ;
+		}
+	}
+}
+
+if (pCount > 0)
+{
+
+	ChoiceList (globalParameters,"Global parameters",1,SKIP_NONE,
+				"Estimate always", "Re-estimate global model parameters (e.g. rate variation parameters, substitution biases etc) for each tree. This option can be quite slow, and global parameter estimates may be unreliable for small trees, leading to possible biases.",
+				"Get from a user tree", "Estimate global model parameters (e.g. rate variation parameters, substitution biases etc) from a user tree (e.g. NJ), and hold them constant for the rest of the search. This option has the advantage of big speed gains, and is based on the assumption that global model parameters are robust to some errors in the tree. This assumption could be wrong in pathological cases, however."
+				);
+		
+			
+	if (globalParameters < 0)
+	{
+		return ;
+	}
+
+	if (globalParameters == 1)
+	{
+		fprintf					(stdout, "\n[WILL USE GLOBAL ESTIMATES FROM A USER-PROVIDED TREE]\n");
+		ExecuteAFile 			("queryTree.bf");
+		fprintf					(stdout, "\n[OBTAINING GLOBAL PARAMETER ESTIMATES]\n");
+		LikelihoodFunction 		apprxLF = (filteredData, givenTree);
+		Optimize 			    (arg, apprxLF);
+		
+		for (k=0; k<pCount; k=k+1)
+		{
+			ExecuteCommands ("_param_val = " + globalParamList[k] + ";");
+			fprintf (stdout, "\t", globalParamList[k], " = ", _param_val, "\n");
+			ExecuteCommands (globalParamList[k] + ":=" + _param_val + ";");
+		}
+	}
+}
+
+l = InferTreeTopology (1.0);
+
+if (l)
+{
+	fprintf (stdout,"\n\n --------------------- RESULTS --------------------- \n\n");
+	fprintf (stdout,"BestTree =", bestTree);
+
+	Tree				Inferred_Tree = bestTree;
+	LikelihoodFunction  lf 			  = (filteredData, Inferred_Tree);
+
+	Optimize (res,lf);
+	fprintf (stdout, "\n",lf,"\n\n***********Save this tree to a file (y/n)?");
+
+	fscanf  (stdin, "String", resp);
+	OpenWindow (TREEWINDOW, {{"Inferred_Tree"}});
+
+	if ((resp!="n")&&(resp!="N"))
+	{
+		SetDialogPrompt ("Write tree string to:");
+		fprintf (PROMPT_FOR_FILE,CLEAR_FILE,bestTree,";");
+	}
+
+	saveTreeNodes = {2*(ds.species+1),3};
+	for (i=2*ds.species+1;i>=0;i=i-1)
+	{
+		saveTreeNodes[i][0] = bestTreeNodes[i][0];
+		saveTreeNodes[i][1] = bestTreeNodes[i][1];
+	}
+}
+
+
+
+
diff --git a/res/TemplateBatchFiles/SequentialAddition.ibf b/res/TemplateBatchFiles/SequentialAddition.ibf
new file mode 100644
index 0000000..42c72a2
--- /dev/null
+++ b/res/TemplateBatchFiles/SequentialAddition.ibf
@@ -0,0 +1,618 @@
+#include "heuristicMethodNPBootstrap.bf";
+#include "branchSwappingFunctions.bf";
+				
+/*---------------------------------------------------------------*/
+
+function ReceiveJobs (sendOrNot, nni_flagrj)
+{
+	if (MPI_NODE_COUNT>1)
+	{
+		MPIReceive (-1, fromNode, result_String);
+		
+		_thisTree	 = 	MPITreeStrings[fromNode-1];
+
+		_tempStorage = {2*taxonCounter-1,2};
+		_tempStorage2 = {taxonCounter-2,2};
+		_cindex		 = 2*(fromNode-1);
+		
+		for (_rc = 0; _rc < 2*taxonCounter-1; _rc = _rc + 1)
+		{
+			_tempStorage[_rc][0] = MPINodeTree[_rc][_cindex];
+			_tempStorage[_rc][1] = MPINodeTree[_rc][_cindex+1];
+		}
+
+		for (_rc = 0; _rc < taxonCounter-2; _rc = _rc + 1)
+		{
+			_tempStorage2[_rc][0] = MPINodeClades[_rc][_cindex];
+			_tempStorage2[_rc][1] = MPINodeClades[_rc][_cindex+1];
+		}
+		
+		if (sendOrNot)
+		{
+			MPITreeStrings[fromNode-1] = thisTree;
+			MPISend (fromNode,lf);
+			for (_rc = 0; _rc < 2*taxonCounter-1; _rc = _rc + 1)
+			{
+				MPINodeTree[_rc][_cindex] 	= treeNodes[_rc][2];
+			    MPINodeTree[_rc][_cindex+1] = treeNodes[_rc][3];
+			}
+
+			for (_rc = 0; _rc < taxonCounter-2; _rc = _rc + 1)
+			{
+				MPINodeClades[_rc][_cindex] 	= cladesInfo[_rc][2];
+			    MPINodeClades[_rc][_cindex+1]   = cladesInfo[_rc][3];
+			}
+		}
+		else
+		{
+			MPINodeState[fromNode-1]    = 0;
+		}
+		
+		for (_rc = 0; _rc < 2*taxonCounter-1; _rc = _rc + 1)
+		{
+			treeNodes[_rc][2] = _tempStorage[_rc][0];
+			treeNodes[_rc][3] = _tempStorage[_rc][1];
+		}
+		
+		for (_rc = 0; _rc < taxonCounter-2; _rc = _rc + 1)
+		{
+			cladesInfo[_rc][2] = _tempStorage2[_rc][0];
+			cladesInfo[_rc][3] = _tempStorage2[_rc][1];
+		}
+
+		/*thisTree = TreeMatrix2TreeString (2,0);*/
+		thisTree = _thisTree;
+		ExecuteCommands (result_String);
+		res = lf_MLES;
+		fprintf (stdout, "\nReceived a tree from node: ", fromNode-1,"  =>   ", res[1][0]);
+	}
+	
+	dummy = CheckForImprovement(nni_flagrj);
+
+	return fromNode-1;
+}
+
+/*---------------------------------------------------------------*/
+
+function CheckForImprovement (nni_flagcfi)
+{
+	if (res[1][0]>bestValue)
+	{
+		bestValue = res[1][0];
+		bestTree = thisTree;
+		if (nni_flagcfi)
+		{
+			nniDidBetter = 1;
+			if (verbFlag)
+			{
+				OpenWindow (TREEWINDOW, {{"Inferred_Tree"}});
+				fprintf (stdout, "\n\tRestarting NNI on the better tree.");
+			}
+			for (l4=2*taxonCounter-2;l4>=0;l4=l4-1)
+			{
+				bestTreeNodes[l4][0]= treeNodes[l4][2];
+				bestTreeNodes[l4][1]= treeNodes[l4][3];
+				treeNodes[l4][0]    = treeNodes[l4][2];
+				treeNodes[l4][1]    = treeNodes[l4][3];
+			}
+			for (l4=0; l4<taxonCounter-2; l4=l4+1)
+			{
+				bestCladesInfo[l4][0]= cladesInfo[l4][2];
+				bestCladesInfo[l4][1]= cladesInfo[l4][3];
+				cladesInfo[l4][0]    = cladesInfo[l4][2];
+				cladesInfo[l4][1]    = cladesInfo[l4][3];
+			}
+			l = 0;
+			while (cladesInfo[l][1])
+			{
+				l = l+1;
+			}				
+			l2 = -1;		
+		}
+		else
+		{
+			for (l=2*taxonCounter-2;l>=0;l=l-1)
+			{
+				bestTreeNodes[l][0]=treeNodes[l][2];
+				bestTreeNodes[l][1]=treeNodes[l][3];
+			}
+			for (l=0; l<taxonCounter-2; l=l+1)
+			{
+				bestCladesInfo[l][0]=cladesInfo[l][2];
+				bestCladesInfo[l][1]=cladesInfo[l][3];
+			}
+			if (verbFlag)
+			{
+				GetString (nodeName, filteredData, taxonIndex);
+				mxTreeSpec = {5,1};
+				mxTreeSpec [0] = "Inferred_Tree";
+				mxTreeSpec [3] = "";
+				mxTreeSpec [4] = "Inferred_Tree."+nodeName;
+				if (twHasBeenOpened)
+				{
+					mxTreeSpec [1] = "";
+					mxTreeSpec [2] = "";
+				}
+				else
+				{
+					mxTreeSpec [1] = "8211";
+					mxTreeSpec [2] = "10,40,-10,-175,1";
+					twHasBeenOpened = 1;
+				}
+				OpenWindow (TREEWINDOW, mxTreeSpec );
+			}
+		}
+	}
+	return 0;
+}
+
+/*---------------------------------------------------------------*/
+function SendOffTreeJob (nni_flag)
+{
+	LikelihoodFunction lf = (smallerFilter, Inferred_Tree);
+					
+	if (MPI_NODE_COUNT>1)
+	{
+		for (mpiNode = 0; mpiNode < MPI_NODE_COUNT-1; mpiNode = mpiNode+1)
+		{
+			if (MPINodeState[mpiNode]==0)
+			{
+				break;	
+			}
+		}
+		
+		if (mpiNode==MPI_NODE_COUNT-1)
+		/* all nodes busy */
+		{
+			mpiNode = ReceiveJobs (1, nni_flag);
+		}
+		else
+		{
+			MPISend (mpiNode+1,lf);
+			MPINodeState[mpiNode] = 1;
+			MPITreeStrings[mpiNode] = thisTree;
+			_cindex		 = 2*mpiNode;
+			
+			for (_rc = 0; _rc < 2*taxonCounter-1; _rc = _rc + 1)
+			{
+				MPINodeTree[_rc][_cindex] 	= treeNodes[_rc][2];
+			    MPINodeTree[_rc][_cindex+1] = treeNodes[_rc][3];
+			}
+			for (_rc = 0; _rc < taxonCounter-2; _rc = _rc + 1)
+			{
+				MPINodeClades[_rc][_cindex] 	= cladesInfo[_rc][2];
+			    MPINodeClades[_rc][_cindex+1]   = cladesInfo[_rc][3];
+			}
+		}
+	}
+	else
+	{
+		Optimize (res, lf);
+		mpiNode = CheckForImprovement (nni_flag);
+		if (verbFlag)
+		{
+			fprintf (stdout, " => ", res[1][0]);
+		}
+	}
+	
+	return 0;
+}
+
+/*---------------------------------------------------------------*/
+
+function InferTreeTopology (verbFlag)
+{
+	if (filteredData.species <= 3)
+	{
+		fprintf (stdout, "Input file contained 3 or fewer sequences - not much inference to be done!\n");
+		return 0;
+	}
+	if (randomOption==1)
+	/* randomize sequence order */
+	{
+		treeNodes  = {filteredData.species,1};
+		cladesInfo = {filteredData.species,1};
+		
+		for (currentTaxon=0; currentTaxon < filteredData.species; currentTaxon = currentTaxon+1)
+		{
+			cladesInfo [currentTaxon] = currentTaxon;	
+		}
+		
+		currentTaxon = filteredData.species-1;
+		
+		while (currentTaxon>=0)
+		{
+			i = Random (0,currentTaxon+1) $ 1;
+			shift = 0;
+			for (s = 0; s<filteredData.species; s=s+1)
+			{
+				if (cladesInfo[s]>=0)
+				{
+					shift = shift+1;
+				}
+				if (i == shift - 1)
+				{
+					treeNodes[filteredData.species-1-currentTaxon] = cladesInfo[s];
+					cladesInfo [s] = -1;
+					break;
+				}
+			}
+			currentTaxon = currentTaxon - 1;
+		}
+		
+		/*reshuffledOrder = "";
+		for (currentTaxon = 0; currentTaxon < filteredData.species-1; currentTaxon = currentTaxon+1)
+		{
+			reshuffledOrder = reshuffledOrder + treeNodes[currentTaxon] + ",";
+		}
+		reshuffledOrder = reshuffledOrder + treeNodes[currentTaxon];*/
+		
+		if (verbFlag)
+		{
+			fprintf (stdout,"\n\t Sequence order randomized as follows:\n");
+			for (currentTaxon = 0; currentTaxon < filteredData.species; currentTaxon = currentTaxon+1)
+			{
+				GetString (nodeName, filteredData, treeNodes[currentTaxon]);
+				fprintf (stdout,nodeName,"\n");
+			}
+			fprintf (stdout,"\n");
+		}
+		
+				
+		additionOrder = treeNodes;
+		if (methodIndex == 0)
+		{
+			first3Taxa[0] = additionOrder[0];
+			first3Taxa[1] = additionOrder[1];
+			first3Taxa[2] = additionOrder[2];
+		}
+	}
+	else
+	{
+		additionOrder = {filteredData.species,1};
+		for (currentTaxon = 0; currentTaxon < filteredData.species; currentTaxon = currentTaxon+1)
+		{
+			additionOrder [currentTaxon] = currentTaxon;
+		}
+	}
+
+	treeNodes 		= {2*(filteredData.species+1),4};
+	bestTreeNodes 	= {2*(filteredData.species+1),2};
+
+	
+	cladesInfo 	    = {filteredData.species,4};
+	bestCladesInfo  = {filteredData.species,2};
+
+	if (MPI_NODE_COUNT>1)
+	{
+		MPINodeState 	= {MPI_NODE_COUNT-1,1};
+		MPINodeTree  	= {2*(filteredData.species+1),2*(MPI_NODE_COUNT-1)};
+		MPINodeClades   = {filteredData.species,2*(MPI_NODE_COUNT-1)};
+		MPITreeStrings	= {MPI_NODE_COUNT-1,1};
+		MPITreeStrings[0] = "";
+	}
+
+	currentTaxon = 0;
+
+	treeNodes[0][0]=0;
+	treeNodes[0][1]=1;
+	treeNodes[1][0]=1;
+	treeNodes[1][1]=1;
+	treeNodes[2][0]=2;
+	treeNodes[2][1]=1;
+	treeNodes[3][0]=filteredData.species;
+	treeNodes[3][1]=0;
+	cladesInfo[0][0]=0;
+	cladesInfo[0][1]=4;
+
+	bestTree="";
+	bestValue=-1e20;
+
+
+
+	svl = VERBOSITY_LEVEL;
+	VERBOSITY_LEVEL = -1;
+
+	if (verbFlag)
+	{
+		fprintf (stdout, "**** Running sequential addition on ", LAST_FILE_PATH, " ****");
+		if (haveTreeConstraint)
+		{
+			fprintf (stdout, "\n****** Using the constraint specified by ******\n",_topologyPatternString ,"\n\n");
+		}
+	}
+	if (methodIndex == 2)
+	{
+		if (verbFlag)
+		{
+			fprintf (stdout, "\nSTEP 0). Searching for the best 3 taxa tree.");
+			fprintf (stdout, "\n\t", Format (filteredData.species*(filteredData.species-1)*(filteredData.species-2)/6,0,0)," trees will be examined.\n");
+		}
+		for (i=0; i<filteredData.species-2; i=i+1)
+		{
+			for (s=i+1;s<filteredData.species-1;s=s+1)
+			{
+				for (shift=s+1;shift<filteredData.species; shift=shift+1)
+				{
+					treeNodes[0][0]=i;
+					treeNodes[0][1]=1;
+					treeNodes[1][0]=s;
+					treeNodes[1][1]=1;
+					treeNodes[2][0]=shift;
+					treeNodes[2][1]=1;		
+					thisTree = TreeMatrix2TreeString (0,0);
+					Tree    Inferred_Tree = thisTree;
+					if (dataType)
+					{
+						DataSetFilter smallFilter = CreateFilter (filteredData,3,"",(speciesIndex==i)||(speciesIndex==s)||(speciesIndex==shift),GeneticCodeExclusions);
+					}
+					else
+					{
+						DataSetFilter smallFilter = CreateFilter (filteredData,1,"",(speciesIndex==i)||(speciesIndex==s)||(speciesIndex==shift));
+					}
+					LikelihoodFunction lf = (smallFilter, Inferred_Tree);
+					Optimize (res,lf);
+					if (res[1][0]>bestValue)
+					{
+						first3Taxa[0]=i;
+						first3Taxa[1]=s;
+						first3Taxa[2]=shift;
+						
+						bestValue = res[1][0];
+						bestTree = thisTree;
+					}
+				}
+			}
+		}
+
+		if (verbFlag)
+		{
+			fprintf (stdout,"\n\t Best 3 taxa tree is ", bestTree, " with log likelihood of ", bestValue);
+		}
+	}
+	else
+	{
+		if (methodIndex == 3)
+		{
+			first3Taxa[0] = Random (0,filteredData.species) $ 1;
+			first3Taxa[1] = first3Taxa[0];
+			while (first3Taxa[1] == first3Taxa[0])
+			{
+				first3Taxa[1] = Random (0,filteredData.species) $ 1;
+			}
+			first3Taxa[2] = first3Taxa[0];
+			while ((first3Taxa[2] == first3Taxa[0])||(first3Taxa[2] == first3Taxa[1]))
+			{
+				first3Taxa[2] = Random (0,filteredData.species) $ 1;
+			}
+			if (verbFlag)
+			{
+				fprintf (stdout,"\n\t Random 3 taxa tree selected: (");
+				for (currentTaxon = 0; currentTaxon < 3; currentTaxon = currentTaxon+1)
+				{
+					GetString (nodeName, filteredData, first3Taxa[currentTaxon]);
+					fprintf (stdout,nodeName);
+					if (currentTaxon<2)
+					{
+						fprintf (stdout, ",");
+					}
+				}
+				fprintf (stdout,")\n");
+			}
+		}
+	}
+
+	treeNodes[0][0]=first3Taxa[0];
+	treeNodes[1][0]=first3Taxa[1];
+	treeNodes[2][0]=first3Taxa[2];
+
+	currentTaxon = 0;
+	taxonCounter = 3;
+	
+	filterSeqString = "";
+	
+	filterSeqString = filterSeqString + first3Taxa[0];
+	filterSeqString = filterSeqString + "," + first3Taxa[1];
+	filterSeqString = filterSeqString + "," + first3Taxa[2];
+
+	while (currentTaxon<filteredData.species)
+	{
+		taxonIndex = additionOrder [currentTaxon];
+		/* decide which taxon will be added next */
+		if ((taxonIndex!=first3Taxa[0])&&(taxonIndex!=first3Taxa[1])&&(taxonIndex!=first3Taxa[2]))
+		{
+			GetString (nodeName, filteredData, taxonIndex);
+			
+			if (verbFlag)
+			{
+				fprintf (stdout, "\n\n\nSTEP ",Format(taxonCounter-2,0,0),"/",Format(filteredData.species-3,0,0),"). Adding taxon:", nodeName);
+			}
+			/* attempt to insert this taxon into current tree */
+			/* produce a new data set filter */
+			filterSeqString = filterSeqString + "," + taxonIndex;
+			if (dataType)
+			{
+				DataSetFilter smallerFilter = CreateFilter (filteredData,3,"",filterSeqString,GeneticCodeExclusions);
+			}
+			else
+			{
+				DataSetFilter smallerFilter = CreateFilter (filteredData,1,"",filterSeqString);
+			}
+			bestValue=-1e20;
+			treesConsidered = 0;
+			for (t_count=0; t_count<2*taxonCounter-3; t_count=t_count+1)
+			/* loop over all branches */
+			{	
+				i = 0;
+				shift = 0;
+				while (treeNodes[i][1])
+				{
+					if (i==t_count)
+					{
+						currentLevel = taxonCounter-3;
+						shift = 2;
+						if (treeNodes[i][0]<filteredData.species)
+						/* simple branch */
+						{
+							treeNodes[i][2]=treeNodes[i][0];
+							treeNodes[i][3]=treeNodes[i][1]+1;
+							treeNodes[i+1][2]=taxonIndex;
+							treeNodes[i+1][3]=treeNodes[i][1]+1;
+							treeNodes[i+2][2]= taxonCounter+ filteredData.species-3;
+							treeNodes[i+2][3]=treeNodes[i][1];
+							cladesInfo[currentLevel][2] = i;
+							cladesInfo[currentLevel][3] = 3;					
+						}
+						else
+						{
+							/* update node depths for the entire clade now*/
+							l = treeNodes[i][0]-filteredData.species;
+							s = cladesInfo[l][0];
+							/*fprintf (stdout,"\n",i," ",cladesInfo[l][1],treeNodes, cladesInfo,"\n");*/
+							for (p=s+cladesInfo[l][1]-1; p>=s; p=p-1)
+							{
+								treeNodes[i][2]=treeNodes[i][0];
+								treeNodes[i][3]=treeNodes[i][1]+1;						
+								i=i-1;
+							}
+							i=i+cladesInfo[l][1];
+							/* new clade record */
+							cladesInfo[currentLevel][2] = cladesInfo[l][0];
+							cladesInfo[currentLevel][3] = cladesInfo[l][1]+2;
+							/* now we need to insert two more nodes */
+							treeNodes[i+1][2]=taxonIndex;
+							treeNodes[i+1][3]=treeNodes[i][1]+1;
+							treeNodes[i+2][2]=currentLevel+filteredData.species;
+							treeNodes[i+2][3]=treeNodes[i][1];
+						}
+						for (p=0; p<currentLevel; p=p+1)
+						{
+							if (cladesInfo[p][0]>i)
+							{
+								cladesInfo[p][2] = cladesInfo[p][0]+2;
+							}
+							else
+							{
+								cladesInfo[p][2] = cladesInfo[p][0];
+							}
+							
+							if ((cladesInfo[p][0]<=i)&&((cladesInfo[p][0]+cladesInfo[p][1])>i+1))
+							{
+								cladesInfo[p][3] = cladesInfo[p][1]+2;
+							}
+							else
+							{
+								cladesInfo[p][3] = cladesInfo[p][1];
+							}
+						}				
+					}
+					else
+					{
+						treeNodes[i+shift][2]=treeNodes[i][0];
+						treeNodes[i+shift][3]=treeNodes[i][1];
+					}
+					i = i+1;
+				}
+				
+				treeNodes[i+2][2]=treeNodes[i][0];
+				treeNodes[i+2][3]=treeNodes[i][1];
+				
+				thisTree = TreeMatrix2TreeString (2,0);
+				
+				if ((verbFlag)&&(MPI_NODE_COUNT<2))
+				{
+					fprintf (stdout, "\n\tTree ",thisTree);
+				}
+				
+				Tree    Inferred_Tree = thisTree;
+				
+				
+				if (haveTreeConstraint)
+				{
+					if ((Inferred_Tree<=_topologyPattern) == 0)
+					{
+						if (verbFlag)
+						{
+							fprintf (stdout, " => Rejected by the topology constraint.");
+						}
+						continue;
+					}
+					else
+					{
+						if (verbFlag)
+						{
+							fprintf (stdout, " => Accepted by the topology constraint.");
+						}
+					}
+				}
+				
+				dummy = SendOffTreeJob (0);
+				
+				treesConsidered = treesConsidered + 1;
+
+			}
+			
+			if (MPI_NODE_COUNT>1)
+			{
+				while (1)
+				{
+					for (nodeCounter = 0; nodeCounter < MPI_NODE_COUNT-1; nodeCounter = nodeCounter+1)
+					{
+						if (MPINodeState[nodeCounter]==1)
+						{
+							fromNode = ReceiveJobs (0,0);
+							break;	
+						}
+					}
+					if (nodeCounter == MPI_NODE_COUNT-1)
+					{
+						break;
+					}
+				}	
+			}	
+	
+			if (treesConsidered == 0)
+			{
+				fprintf (stdout, "\n***** NO TREES MATCHED THE TREE CONSTRAINT. PLEASE CHECK THAT SEQUENCE NAMES MATCH *****\n");
+				VERBOSITY_LEVEL = svl;
+				return 0;
+			}
+			for (l=2*taxonCounter-2;l>=0;l=l-1)
+			{
+				treeNodes[l][0]=bestTreeNodes[l][0];
+				treeNodes[l][1]=bestTreeNodes[l][1];
+			}
+			for (l=0; l<taxonCounter-2; l=l+1)
+			{
+				cladesInfo[l][0]=bestCladesInfo[l][0];
+				cladesInfo[l][1]=bestCladesInfo[l][1];
+			}
+
+			if (verbFlag)
+			{
+				fprintf (stdout,"\n\n\t Best ", Format(taxonCounter+1,0,0)," taxa tree is ", bestTree, " with log likelihood of ", bestValue);
+			}
+			if (((doNNIOption<=2)||((doNNIOption>2)&&(taxonCounter==filteredData.species-1)))&&(taxonCounter>3)&&(doNNIOption)||(doNNIOption==5))
+			{
+				starDecomposition = 0;
+				if ((doNNIOption==1)||(doNNIOption==3)||((doNNIOption==5)&&(taxonCounter<filteredData.species-1)))
+				/* NNI */
+				{
+					if (((doNNIOption==1)&&((taxonCounter-2)%nniPeriod > 0)&&(taxonCounter<filteredData.species-1)) == 0)
+					{
+						#include "doNNISwap.bf";
+					}
+				}
+				else
+				/* SPR */
+				{
+					#include "doSPRSwap.bf";
+				}
+			}
+			taxonCounter = taxonCounter+1;
+		}
+		currentTaxon = currentTaxon+1;
+	}
+	VERBOSITY_LEVEL = svl;
+	return 1.0;
+}
diff --git a/res/TemplateBatchFiles/SimilarityPlot.bf b/res/TemplateBatchFiles/SimilarityPlot.bf
new file mode 100644
index 0000000..7cac9b4
--- /dev/null
+++ b/res/TemplateBatchFiles/SimilarityPlot.bf
@@ -0,0 +1,167 @@
+ExecuteAFile (HYPHY_LIB_DIRECTORY + "TemplateBatchFiles" + DIRECTORY_SEPARATOR + "Utility" 
+								   + DIRECTORY_SEPARATOR + "GrabBag.bf"); 
+
+ExecuteAFile (HYPHY_LIB_DIRECTORY + "TemplateBatchFiles" + DIRECTORY_SEPARATOR + "Utility" 
+								   + DIRECTORY_SEPARATOR + "NJ.bf"); 
+
+SetDialogPrompt ("Please select a data set to process:");
+DataSet			 ds  		  = ReadDataFile	(PROMPT_FOR_FILE);
+DataSetFilter	 filteredData = CreateFilter	(ds,1);
+
+fprintf (stdout, "[READ ", filteredData.species, " SEQUENCES AND ", filteredData.sites, " SITES]\n");
+
+windowSize  	= prompt_for_a_value ("Window size", 100, Min(50,ds.sites), ds.sites, 1);
+windowStride	= prompt_for_a_value ("Window stride", windowSize$5, 1, windowSize, 1);
+
+ChoiceList	 	(whichSequence, "Which Sequence Is The Query?", 1, SKIP_NONE, ds);
+
+if (whichSequence < 0)
+{
+	return 0;
+}
+
+GetString	 			(seqNames, ds, -1);
+DISTANCE_PROMPTS 		= 1;
+ExecuteAFile 			(HYPHY_LIB_DIRECTORY + "TemplateBatchFiles" + DIRECTORY_SEPARATOR + "chooseDistanceFormula.def");
+
+querySequenceName 	= seqNames[whichSequence] && 1;
+
+fprintf		 		(stdout, "\n[SCREENING ", querySequenceName, " USING WINDOW WIDTH ",  windowSize, " AND WINDOW STRIDE ", windowStride, "]\n");
+fprintf		 		(stdout, "[DISTANCE METRICS READ FROM ", whichFile, "]\n");
+
+
+ChoiceList	 		(doNPBS, "Include NJ bootstrap", 1, SKIP_NONE, "No", "Only plot pairwise genetic distances over sliding windows","Yes","For each window, determine if there is sufficient phylogenetic evidence to cluster the query with one of the reference sequences");
+if (doNPBS < 0)
+{
+	return 0;
+} 
+
+if (doNPBS == 1)
+{
+	npbsCutoff  	= prompt_for_a_value ("Bootstrap support", 70, 0, 100, 1);
+}
+
+InitializeDistances (0);
+
+steps 	= (ds.sites - windowSize)$windowStride+1;
+
+gdInfo  	  = {steps, ds.species+2};
+columnHeaders = {1, ds.species+2};
+columnHeaders [0] = "Left";
+columnHeaders [1] = "Right";
+columnHeaders [2] = "Midpoint";
+columnPlots = "";
+
+columnIdx  		 = 3;
+
+for (seqID = 0; seqID < ds.species; seqID = seqID + 1)
+{
+	if (seqID != whichSequence)
+	{
+		columnHeaders[columnIdx] = seqNames[seqID];
+		columnIdx = columnIdx + 1;
+		columnPlots = columnPlots + seqNames[seqID] + ";";
+	}
+}
+
+DO_NOT_CALL_INITIALIZE_DISTANCES = 1;
+
+if (doNPBS)
+{
+	fprintf (stdout, "Clustering and bootstrap support on each window interval\n");
+}
+
+for 	  (aStep = 0; aStep < steps; aStep = aStep+1)
+{
+	leftEdge = aStep * windowStride;
+	rightEdge = leftEdge + windowSize;
+	
+	DataSetFilter	 filteredData = CreateFilter	(ds,1,siteIndex >= leftEdge && siteIndex < rightEdge);
+	columnIdx  		 = 3;
+	gdInfo[aStep][0] = leftEdge;
+	gdInfo[aStep][1] = rightEdge;
+	gdInfo[aStep][2] = 0.5(leftEdge+rightEdge);
+	
+	for (seqID = 0; seqID < ds.species; seqID = seqID + 1)
+	{
+		if (seqID != whichSequence)
+		{
+			gdInfo[aStep][columnIdx] = ComputeDistanceFormula (seqID, whichSequence);
+			columnIdx = columnIdx + 1;
+		}
+	}
+	
+	if (doNPBS)
+	{
+		siblingName 	= getNJNeighbor (InferTreeTopology(1));
+		bsSupport		= 0;
+		
+		for (repID = 0; repID < 100; repID = repID + 1)
+		{
+			DataSetFilter	 	filteredData = Bootstrap	(ds,1,siteIndex >= leftEdge && siteIndex < rightEdge);
+			simSN 				= getNJNeighbor (InferTreeTopology(1));
+			bsSupport			= bsSupport + (simSN == siblingName);
+		}
+		intervalSpec = "[" + leftEdge + "-" + rightEdge + "]";
+		if (bsSupport >= npbsCutoff)
+		{
+			fprintf (stdout, intervalSpec, " : ", siblingName, "\n");
+		}
+		else
+		{
+			fprintf (stdout, intervalSpec, " : Ambiguous \n");		
+		}
+	}
+	
+}
+
+OpenWindow (CHARTWINDOW,{{"Similarity Plot for " + seqNames[whichSequence]}
+						{"columnHeaders"}
+						{"gdInfo"}
+						{"Scatterplot"}
+						{"Midpoint"}
+						{columnPlots}
+						{"Midpoint, bp"}
+						{""}
+						{"Genetic distance"}
+						{"3"}
+						{""}
+						{"-1;-1"}
+						{"10;1.309;0.785398"}
+						{"Times:12:0;Times:10:0;Times:12:2"}
+						{"0;0;16777215;1644825;0;0;6579300;11842740;13158600;14474460;0;3947580;16777215;15670812;6845928;16771158;2984993;9199669;7018159;1460610;16748822;11184810;14173291"}
+						{"16,0,0"}
+						},
+						"(SCREEN_WIDTH-60)/2;(SCREEN_HEIGHT-50)/2;100;100");
+						
+				
+/*----------------------------------------------------------------------------*/
+
+function getNJNeighbor (treeString)
+{
+	Tree njTree = treeString;
+	njTreeAVL   = njTree ^ 0;
+	
+	/* find the query node */
+	
+	for (k = 1; k < Abs(njTreeAVL); k=k+1)
+	{
+		nodeName = (njTreeAVL[k])["Name"] && 1;
+		if (nodeName == querySequenceName)
+		{
+			break;
+		}
+	}
+	p 		= (njTreeAVL[k])["Parent"];
+	pn 		= njTreeAVL[p];
+	if (((pn["Children"])[0]) == k)
+	{
+		sn = (pn["Children"])[1];
+	}
+	else
+	{
+		sn = (pn["Children"])[0];
+	}
+	pn = njTreeAVL[sn];
+	return pn["Name"];
+}
diff --git a/res/TemplateBatchFiles/SimmondsAI.bf b/res/TemplateBatchFiles/SimmondsAI.bf
new file mode 100644
index 0000000..a168b9c
--- /dev/null
+++ b/res/TemplateBatchFiles/SimmondsAI.bf
@@ -0,0 +1,337 @@
+RequireVersion ("0.9920060601");
+VERBOSITY_LEVEL = -1;
+
+/*************************************************************************************************/
+
+function compute1mf 	  (aNum)
+{
+	maxV = Max (maxV,aNum);
+	sumV = sumV + aNum;
+	return aNum;
+}
+
+/*************************************************************************************************/
+
+function computeSimmondsD (leafAssignmentVector, mapVec, catCount)
+{
+	_d           = 0;
+	_currentLeaf = 0;
+	for (_nodeIdx = 1; _nodeIdx < Abs (treeAVL); _nodeIdx = _nodeIdx + 1)
+	{
+		_currentNode 	= treeAVL[_nodeIdx];
+		_childrenCount  = Abs (_currentNode["Children"]);
+		_parentNode		= _currentNode ["Parent"];
+		if (_parentNode)
+		{
+			if (Columns((treeAVL[_parentNode])["Counts"])==0)
+			{
+				(treeAVL[_parentNode])["Counts"] = {1,catCount};
+			}
+			if (_childrenCount) /* internal node */
+			{
+				(treeAVL[_parentNode])["N"] = (treeAVL[_parentNode])["N"]+_currentNode["N"];
+				_currentCounts = _currentNode["Counts"];
+				(treeAVL[_parentNode])["Counts"] = (treeAVL[_parentNode])["Counts"] + 
+												  _currentCounts;
+												  
+				maxV = 0;
+				sumV = 0;
+				_currentCounts ["compute1mf(_MATRIX_ELEMENT_VALUE_)"];
+				/*fprintf (stdout, 1-maxV/sumV, "\n");*/
+				_d = _d + (1-maxV/sumV)*2^(1-_currentNode["N"]);
+			
+			}
+			else /* terminal node */
+			{
+				(treeAVL[_parentNode])["N"] = (treeAVL[_parentNode])["N"]+1;
+				((treeAVL[_parentNode])["Counts"])[leafAssignmentVector[mapVec[_currentLeaf]]] =
+				((treeAVL[_parentNode])["Counts"])[leafAssignmentVector[mapVec[_currentLeaf]]] + 1; 
+				_currentLeaf = _currentLeaf + 1;
+			}
+		}
+	}
+	
+	return _d;
+}
+
+/*************************************************************************************************/
+
+SetDialogPrompt ("Load a nucleotide sequence file:");
+
+DataSet ds = ReadDataFile (PROMPT_FOR_FILE);
+leafCount  = ds.species;
+
+fprintf (stdout, "Read file: ", ds,"\n");
+
+DataSetFilter filteredData = CreateFilter (ds,1);
+
+goOn = 1;
+
+kindCount = 0;
+while (kindCount < 2)
+{
+	fprintf (stdout, "How many sequence types: (>=2):");
+	fscanf  (stdin, "Number", kindCount);
+	kindCount = kindCount $ 1;
+}
+
+goOn  = 1;
+
+seqNamesInFile = {};
+choiceMatrix   = {leafCount,2};
+
+for (specIndex = 0; specIndex < leafCount; specIndex = specIndex + 1)
+{
+	GetString (specName, ds, specIndex);
+	seqNamesInFile[specName] = specIndex;
+	choiceMatrix[specIndex][0] = specName;
+	choiceMatrix[specIndex][1] = "Use "+specName+" as the outgroup";
+}
+
+ChoiceList (rerootAt, "Outgroup", 1, SKIP_NONE, choiceMatrix);
+
+if (rerootAt < 0)
+{
+	return 0;
+}
+
+choiceMatrix = choiceMatrix[rerootAt][0];
+
+fprintf (stdout, "Using ", choiceMatrix, " as outgroup\n");
+
+ACCEPT_ROOTED_TREES = 1;
+
+while (goOn)
+{
+	defClades 	 = 0;
+	clades  	 = {};
+	strings 	 = {};
+	matchedSoFar = {leafCount,1};
+	leafAllocs 	 = {1,leafCount};
+
+	while (defClades < kindCount)
+	{
+
+		st     = "";
+		aClade = {};
+		
+		if (defClades < kindCount-1)
+		{
+			fprintf (stdout,"\nEnter a reg exp used to define clade ",defClades+1,":");
+			fscanf  (stdin,"String",theRegExp);
+
+			for (specIndex = 0; specIndex < leafCount; specIndex = specIndex + 1)
+			{
+				GetString (specName, ds, specIndex);
+				specMatch = specName $ theRegExp;
+				
+				if (specMatch[0]>=0 && matchedSoFar[specIndex] == 0)
+				{
+					aClade [specName] = 1;
+					if (Abs(st))
+					{
+						st = st + "," + specName;
+					}
+					else
+					{
+						st = specName;
+					}
+					
+					matchedSoFar [specIndex] = 1;
+					leafAllocs   [specIndex] = defClades;
+				}
+			}
+		}
+		else
+		{
+			for (specIndex = 0; specIndex < leafCount; specIndex = specIndex + 1)
+			{
+				if (matchedSoFar[specIndex] == 0)
+				{
+					GetString (specName, ds, specIndex);
+					aClade [specName] = 1;
+					if (Abs(st))
+					{
+						st = st + "," + specName;
+					}
+					else
+					{
+						st = specName;
+					}
+					matchedSoFar [specIndex] = 1;
+					leafAllocs   [specIndex] = kindCount-1;
+				}
+			}		
+		}
+		
+		if (Abs(aClade) == 0)
+		{
+			fprintf (stdout, "ERROR: an empty clade for reg-exp ", goOn, "\n");
+			defClades = kindCount;
+			break;
+		}
+		else
+		{
+			fprintf (stdout, "Matched: ",st,"\n");	
+		}
+		strings[Abs(strings)] = st;
+		clades [Abs(clades) ] = aClade;
+		defClades = defClades + 1;
+	}
+
+	if (Abs(clades) == kindCount)
+	{
+		for (k=0; k<kindCount; k=k+1)
+		{
+			aClade = clades[k];
+			clASize = Abs(aClade);
+			fprintf (stdout, "\nSet ",k+1," (TYPE ",k+1,") includes ", clASize," sequences:\n");
+			cladeKeys = Rows (aClade);
+			for (specIndex = 0; specIndex < clASize; specIndex = specIndex + 1)
+			{
+				fprintf (stdout, "\t", cladeKeys[specIndex],"\n");
+			}
+		}
+		
+		fprintf (stdout, "\nIs this partitioning correct (y/n)");
+		fscanf (stdin, "String", goOn);
+		goOn = (goOn[0] == "n" || goOn[0] == "N");
+	}
+	else
+	{
+		goOn = 1;
+	}
+}
+
+/*descriptives = {};*/
+for (k=0; k<kindCount; k=k+1)
+{
+	/*fprintf (stdout, "Please enter a descriptive name for TYPE ",k+1," sequences:");
+	fscanf	(stdin, "String", className);
+	descriptives [k] = className;*/
+
+	fprintf (stdout, "\nProportion of sequences in group ",k,": ", Abs(clades[k])/leafCount, "\n");
+}
+
+k = HYPHY_LIB_DIRECTORY + "TemplateBatchFiles" + DIRECTORY_SEPARATOR + "Utility" + DIRECTORY_SEPARATOR + "NJ.bf";
+ExecuteCommands ("#include \""+k+"\";");
+ts	 = InferTreeTopology (0);
+Tree givenTree = ts;
+ts	 = RerootTree (givenTree, choiceMatrix);
+Tree givenTree = ts;
+/*fprintf (stdout, givenTree, "\n");*/
+
+
+fprintf		(stdout, "How many relabelings per sample (default 10):?");
+fscanf		(stdin, "String",s);
+shuffleIt	= 0 + s;
+if (shuffleIt < 1)
+{
+	shuffleIt = 10;
+}
+
+fprintf		(stdout, "How many tree bootstrap samples (default 100):?");
+fscanf		(stdin, "String",s);
+treeIt	= 0 + s;
+if (treeIt < 1)
+{
+	treeIt = 100;
+}
+
+fprintf		(stdout, "Proportion of reshufflings less associated than the sample needed for significance (default 2/3)?");
+fscanf		(stdin, "String",s);
+propSig 	= 0 + s;
+if (propSig <= 0 || propSig>=1)
+{
+	propSig = 2/3;
+}
+
+fprintf (stdout, "Using ", treeIt, " tree bootstraps and ", shuffleIt, " relabelings per sample with significance called at ", propSig, "\n");
+
+treeAVL 	= givenTree^0;
+treeAVL2 	= givenTree^1;
+
+baseD		= runATreeSample (0);
+fprintf   	(stdout, "\nBaseline d = ", baseD[0], "\n");
+
+totalRes    = {treeIt,3};
+
+totalRes[0][0] = baseD[0];
+totalRes[0][1] = baseD[1];
+totalRes[0][2] = baseD[2];
+
+fprintf		(stdout, "Running tree simulations...\n");
+meanO 		= baseD[0];
+meanS		= baseD[1];
+sigB		= (propSig < baseD[2]);
+
+for (it = 0; it < treeIt-1; it = it + 1)
+{
+	DataSetFilter filteredData = Bootstrap (ds,1);
+	ts	 = InferTreeTopology (0);
+	Tree givenTree = ts;
+	ts	 = RerootTree (givenTree, choiceMatrix);
+	Tree givenTree = ts;
+	treeAVL 	= givenTree^0;
+	treeAVL2 	= givenTree^1;
+	simD		= runATreeSample (0);
+	totalRes[it+1][0] = simD[0];
+	totalRes[it+1][1] = simD[1];
+	totalRes[it+1][2] = simD[2];
+	meanO = meanO + simD[0];
+	meanS = meanS + simD[1];
+	sigB  = sigB + (propSig < simD[2]);
+}
+
+fprintf (stdout, "\n\nAssociation Index: ", meanO/meanS, "\nBootstrap significance :" , sigB, "/", treeIt, "\n");
+
+columnHeaders = {{"Observed","Mean Control","Proportion Control d > Observed d"}};
+
+OpenWindow (CHARTWINDOW,{{"Simmonds AI Summary"}
+		{"columnHeaders"}
+		{"totalRes"}
+		{"Scatterplot"}
+		{"Observed"}
+		{"Mean Control"}
+		{"Observed d"}
+		{""}
+		{"Control d"}
+		{"0"}
+		{"_x_"}
+		{"-1;-1"}
+		{"10;1.309;0.785398"}
+		{"Times:12:0;Times:10:0;Times:12:2"}
+		{"0;0;16777215;0;0;0;6579300;11842740;13158600;14474460;0;3947580;16777215;15670812;6845928;16771158;2984993;9199669;7018159;1460610;16748822;11184810;14173291"}
+		{"16,0,0"}
+		},
+		"925;642;70;70");
+		
+ACCEPT_ROOTED_TREES = 0;
+
+/*************************************************************************************************/
+
+function runATreeSample (dummy)
+{
+	mapVec	    = {1,leafCount}["_MATRIX_ELEMENT_COLUMN_"];
+	myLeafAlloc = {1,leafCount};
+	for (_k = 0; _k < leafCount; _k = _k + 1)
+	{
+		leafName = TipName (givenTree,_k);
+		myLeafAlloc [_k] = leafAllocs [seqNamesInFile[leafName]];
+	}
+	baseD 		= computeSimmondsD (myLeafAlloc, mapVec, kindCount);
+	gte 		= 0;
+	meanRat		= 0;
+	for (_k=0; _k<shuffleIt; _k = _k + 1)
+	{
+		treeAVL 	= givenTree^0;
+		rsD			= computeSimmondsD (myLeafAlloc, Random(mapVec,0), kindCount);
+		if (rsD > baseD) 
+		{
+			gte = gte +1;
+		}
+		meanRat		= meanRat + rsD;
+	}	
+	outMx = {{baseD, meanRat/shuffleIt, gte/shuffleIt}};
+	return outMx;
+}
diff --git a/res/TemplateBatchFiles/SimpleMutationCounter.bf b/res/TemplateBatchFiles/SimpleMutationCounter.bf
new file mode 100644
index 0000000..b24445e
--- /dev/null
+++ b/res/TemplateBatchFiles/SimpleMutationCounter.bf
@@ -0,0 +1,261 @@
+ChoiceList (ambChoice, "Treatment of Ambiguities",1,SKIP_NONE,
+			"Averaged","All possible resolutions are considered and averaged.",
+			"Resolved","The most frequent (for that site) resolution is chosen.");
+
+if (ambChoice<0)
+{
+	return;
+}
+
+if (useCustomCountingBias)
+{
+	incFileName = "Distances/CodonToolsMain.def";
+}
+else
+{
+	incFileName = "Distances/CodonTools.def";
+}
+
+ExecuteAFile (incFileName);
+	
+DataSet dsA					= ReconstructAncestors (lf);
+DataSetFilter filteredDataA = CreateFilter (dsA,3,"","",GeneticCodeExclusions);
+
+HarvestFrequencies			  (observedCEFV,filteredData,3,3,0);
+seqToBranchMap 				  = {stateCharCount,1};
+
+DataSet		   dsJoint = Combine(dsA,ds);
+DataSetFilter filteredDataJ = CreateFilter (dsJoint,3,"","",GeneticCodeExclusions);
+
+hShift = 0;
+
+for (k=0; k<64; k=k+1)
+{
+	if (_Genetic_Code[k]==10)
+	{
+		hShift = hShift+1;
+	}
+	else
+	{
+		seqToBranchMap[k-hShift] = observedCEFV[k];
+	}
+}
+
+observedCEFV = seqToBranchMap;
+
+
+branchNames = BranchName (givenTree,-1);
+h = Columns (branchNames);
+
+seqToBranchMap 	= {h, 2};
+/* maps sequence names to branch order in column 1 
+   and the other way around in column 2 */
+
+for (k=0; k<filteredData.species; k=k+1)
+{
+	GetString (seqName, filteredData, k);
+	seqToBranchMap[k][0] = -1;
+	for (v=0; v<h; v=v+1)
+	{
+		if (branchNames[v] % seqName)
+		{
+			seqToBranchMap[k][0] = v;
+			seqToBranchMap[v][1] = k;
+			break;
+		}
+	}
+}
+
+seqToBranchMap[filteredData.species][0] = h-1;
+seqToBranchMap[h-1][1] = filteredData.species;
+
+for (k=1; k<filteredDataA.species; k=k+1)
+{
+	GetString (seqName, filteredDataA, k);
+	seqToBranchMap[filteredData.species+k][0] = -1;
+	for (v=0; v<h; v=v+1)
+	{
+		if (branchNames[v] % seqName)
+		{
+			seqToBranchMap[k+filteredData.species][0] = v;
+			seqToBranchMap[v][1] = k+filteredData.species;
+			break;
+		}
+	}
+}
+
+/* get codon matrix */
+
+codonInfo  = {filteredData.species, filteredData.unique_sites};
+codonInfo2 = {filteredDataA.species, filteredDataA.unique_sites};
+
+GetDataInfo    (dupInfo, filteredData);
+GetDataInfo	   (dupInfoA, filteredDataA);
+
+matrixTrick  = {1,stateCharCount};
+matrixTrick2 = {1,stateCharCount};
+
+for (h=Columns(matrixTrick)-1; h>=0; h=h-1)
+{
+	matrixTrick  [h] = h;
+	matrixTrick2 [h] = 1;
+}
+
+for (v=0; v<filteredData.unique_sites;v=v+1)
+{
+	for (h=0; h<filteredData.species;h=h+1)
+	{
+		GetDataInfo (siteInfo, filteredData, h, v);
+		_SITE_ES_COUNT = matrixTrick2 * siteInfo; 
+		if (_SITE_ES_COUNT[0] == 1)
+		{
+			siteInfo = matrixTrick * siteInfo;
+			codonInfo[h][v] = siteInfo[0];
+		}
+		else
+		{
+			codonInfo[h][v] = -1;
+		}
+	}
+}
+
+for (v=0; v<filteredDataA.unique_sites;v=v+1)
+{
+	for (h=0; h<filteredDataA.species;h=h+1)
+	{
+		GetDataInfo (siteInfo, filteredDataA, h, v);
+		siteInfo = matrixTrick * siteInfo;
+		codonInfo2[h][v] = siteInfo[0];
+	}
+}
+
+_SITE_RESULTS = {Rows(seqToBranchMap)-1,filteredData.sites};
+flatTreeRep	  = Abs (givenTree);
+
+
+for (v=0; v<filteredData.sites;v=v+1)
+{	
+	/* do internal nodes first */
+	
+	k = filteredData.species+1;
+	
+	/* first sequence is always the root */
+	c1 = dupInfoA[v];
+	if (codonInfo2[1][c1] >= stateCharCount)
+	{
+		continue;
+	}
+	for (h=1; h<filteredDataA.species; h=h+1)
+	{
+		p1 = seqToBranchMap[k][0];
+		p2 = flatTreeRep[p1];
+		p2 = seqToBranchMap[p2][1]-filteredData.species;
+		
+		cd1 = codonInfo2[h] [c1];
+		cd2 = codonInfo2[p2][c1];
+		
+		if (_OBSERVED_NS_[cd1][cd2] > 0.5)
+		{
+			_SITE_RESULTS[p1][v] = 1; 
+		}		
+		k=k+1;
+	}
+	
+	/* now do the leaves */
+	
+	observedCEFV = {{0}};
+	
+	c2 = dupInfo[v];
+	for (h=0; h<filteredData.species; h=h+1)
+	{
+		p1 = seqToBranchMap[h][0];
+		p2 = flatTreeRep[p1];
+		p2 = seqToBranchMap[p2][1]-filteredData.species;
+		
+		cd2 = codonInfo2[p2][c1];
+		cd1 = codonInfo[h] [c2];
+		
+		observedCEFV = {{0}};
+		
+		if (cd1>=0)
+		/* no ambiguities */
+		{
+			if (_OBSERVED_NS_[cd1][cd2] > 0.5)
+			{
+				_SITE_RESULTS[p1][v] = 1; 
+			}		
+		}	
+		else
+		/* ambiguities here */
+		{
+			GetDataInfo    (ambInfo, filteredData, h, c2);	
+			if (Rows(observedCEFV) == 1)
+			{
+				siteFilter = ""+(v*3)+"-"+(v*3+2);
+				DataSetFilter filteredDataSite = CreateFilter (dsJoint,3,siteFilter,"",GeneticCodeExclusions);
+				HarvestFrequencies			  (observedCEFV,filteredDataSite,3,3,0);
+				tempMx = {stateCharCount,1};
+
+				hShift = 0;
+
+				for (k=0; k<64; k=k+1)
+				{
+					if (_Genetic_Code[k]==10)
+					{
+						hShift = hShift+1;
+					}
+					else
+					{
+						tempMx[k-hShift] = observedCEFV[k];
+					}
+				}	
+				observedCEFV = tempMx;		
+			}
+			
+			weightFactor = matrixTrick2*ambInfo;
+			if (weightFactor[0]<stateCharCount)
+			{
+				ambInfo  	 = ambInfo$observedCEFV;
+				
+				if (ambChoice)
+				{
+					weightFactor = 0;
+					tempMx = -1;
+					for (k=0; k<stateCharCount; k=k+1)
+					{
+						if (ambInfo[k]>weightFactor)
+						{
+							weightFactor = ambInfo[k];
+							tempMx = k;
+						}
+					}
+					if (tempMx>=0)
+					{
+						if (_OBSERVED_NS_[tempMx][cd2] > 0.5)
+						{
+							_SITE_RESULTS[p1][v] = 1; 
+						}		
+					}
+				}
+				else
+				{
+					weightFactor = matrixTrick2*ambInfo;
+					weightFactor = weightFactor[0];
+					if (weightFactor)
+					{
+						ambInfo		 = ambInfo * (1/weightFactor);
+						wk			 = 0;
+						for (k=0; k<stateCharCount; k=k+1)
+						{
+							wk = wk + _OBSERVED_NS_[k][cd2]*ambInfo[k];
+						}
+						if (wk > 0.5)
+						{
+							_SITE_RESULTS[p1][v] = 1; 
+						}		
+					}
+				}
+			}
+		}
+	}	
+}
diff --git a/res/TemplateBatchFiles/SingleBreakpointRecomb-2.bf b/res/TemplateBatchFiles/SingleBreakpointRecomb-2.bf
new file mode 100644
index 0000000..7df8ed8
--- /dev/null
+++ b/res/TemplateBatchFiles/SingleBreakpointRecomb-2.bf
@@ -0,0 +1,726 @@
+partCount				= 2;
+
+/* ________________________________________________________________________________________________*/
+
+REPLACE_TREE_STRUCTURE  = 1;
+SHORT_MPI_RETURN		= 1;
+
+/*--------------------------------------------------------------------------------------*/
+
+function testLRT (vec1, vec2)
+{
+	size1 = Columns(vec1);
+	
+	sumVec1 = {size1,1};
+	jvec	= {2,size1};
+	resMx1	= {itCount,1};
+	resMx2	= {itCount,1};
+	
+	for (k=0; k<size1; k=k+1)
+	{
+		sumVec1 [k]	   = 1;
+		jvec	[0][k] = Log(vec1[k]);
+		jvec	[1][k] = Log(vec2[k]);
+	}
+	
+	
+	for (k=0; k<itCount; k=k+1)
+	{
+		resampled = Random(jvec,1);
+		resampled = resampled*sumVec1;
+		resMx1[k] = resampled[0];
+		resMx2[k] = resampled[1];
+	}
+	
+	resMx1 = (resMx1-resMx2)*2;
+	resMx1 = resMx1 % 0;
+	for (k=0; k<Rows(resMx1); k=k+1)
+	{
+		if (resMx1[k]>0)
+		{
+			break;
+		}
+	}	
+	return k/itCount;
+}
+
+/* ________________________________________________________________________________________________*/
+
+
+function InitializeDistances (dummy)
+{
+	HarvestFrequencies (_dNucFreq,filteredData,1,1,0);
+	_d_fR = _dNucFreq[0]+_dNucFreq[2];
+	_d_fY = _dNucFreq[1]+_dNucFreq[3];
+
+	_d_TN_K1 = 2*_dNucFreq[0]*_dNucFreq[2]/_d_fR;
+	_d_TN_K2 = 2*_dNucFreq[1]*_dNucFreq[3]/_d_fY;
+	_d_TN_K3 = 2*(_d_fR*_d_fY-_dNucFreq[0]*_dNucFreq[2]*_d_fY/_d_fR-_dNucFreq[1]*_dNucFreq[3]*_d_fR/_d_fY);
+	
+	return 0;
+}
+
+/* ________________________________________________________________________________________________*/
+
+function ComputeDistanceFormula (s1,s2)
+{
+	GetDataInfo (siteDifferenceCount, filteredData, s1, s2, DIST);
+	
+	_dAGCounts 	 =    siteDifferenceCount[0][2]+siteDifferenceCount[2][0]  /* A-G and G-A */;
+	_dCTCounts	 = 	  siteDifferenceCount[1][3]+siteDifferenceCount[3][1]; /* C-T and T-C */
+						
+	_dTransversionCounts = (siteDifferenceCount[0][0]+siteDifferenceCount[1][1]+siteDifferenceCount[2][2]+
+							siteDifferenceCount[3][3])+_dAGCounts+_dCTCounts;
+	
+	_dAGCounts	 = _dAGCounts/filteredData.sites;
+	_dCTCounts	 = _dCTCounts/filteredData.sites;
+	
+	_dTransversionCounts = 1-_dTransversionCounts/filteredData.sites;
+	
+	_d1C = 1-_dAGCounts/_d_TN_K1-0.5*_dTransversionCounts/_d_fR;
+	_d2C = 1-_dCTCounts/_d_TN_K2-0.5*_dTransversionCounts/_d_fY;
+	_d3C = 1-0.5*_dTransversionCounts/_d_fY/_d_fR;
+	
+	if ((_d1C>0)&&(_d2C>0)&&(_d3C>0))
+	{
+		return -_d_TN_K1*Log(_d1C)-_d_TN_K2*Log(_d2C)-_d_TN_K3*Log(_d3C);
+	}
+	
+	return 1000;
+}
+
+/* ________________________________________________________________________________________________*/
+
+function TreeMatrix2TreeString (doLengths)
+{
+	treeString = "";
+	p = 0;
+	k = 0;
+	m = treeNodes[0][1];
+	n = treeNodes[0][0];
+	d = treeString*(Rows(treeNodes)*25);
+
+	while (m)
+	{	
+		if (m>p)
+		{
+			if (p)
+			{
+				d = treeString*",";
+			}
+			for (j=p;j<m;j=j+1)
+			{
+				d = treeString*"(";
+			}
+		}
+		else
+		{
+			if (m<p)
+			{
+				for (j=m;j<p;j=j+1)
+				{
+					d = treeString*")";
+				}
+			}	
+			else
+			{
+				d = treeString*",";
+			}	
+		}
+		if (n<filteredData.species)
+		{
+			GetString (nodeName, filteredData, n);
+			d = treeString*nodeName;
+		}
+		if (doLengths>.5)
+		{
+			nodeName = ":"+treeNodes[k][2];
+			d = treeString*nodeName;
+		}
+		k=k+1;
+		p=m;
+		n=treeNodes[k][0];
+		m=treeNodes[k][1];
+	}
+
+	for (j=m;j<p;j=j+1)
+	{
+		d = treeString*")";
+	}
+	
+	d=treeString*0;
+	return treeString;
+}
+
+/* ________________________________________________________________________________________________*/
+
+function InferTreeTopology(verbFlag)
+{
+	distanceMatrix = {filteredData.species,filteredData.species};
+	dummy = InitializeDistances (0);
+		
+	for (i = 0; i<filteredData.species; i=i+1)
+	{
+		for (j = i+1; j<filteredData.species; j = j+1)
+		{
+			distanceMatrix[i][j] = ComputeDistanceFormula (i,j);
+		}
+	}
+
+	MESSAGE_LOGGING 		 	= 1;
+	cladesMade 					= 1;
+	
+
+	if (filteredData.species == 2)
+	{
+		d1 = distanceMatrix[0][1]/2;
+		treeNodes = {{0,1,d1__},
+					 {1,1,d1__},
+					 {2,0,0}};
+					 
+		cladesInfo = {{2,0}};
+	}
+	else
+	{
+		if (filteredData.species == 3)
+		{
+			d1 = (distanceMatrix[0][1]+distanceMatrix[0][2]-distanceMatrix[1][2])/2;
+			d2 = (distanceMatrix[0][1]-distanceMatrix[0][2]+distanceMatrix[1][2])/2;
+			d3 = (distanceMatrix[1][2]+distanceMatrix[0][2]-distanceMatrix[0][1])/2;
+			treeNodes = {{0,1,d1__},
+						 {1,1,d2__},
+						 {2,1,d3__}
+						 {3,0,0}};
+						 
+			cladesInfo = {{3,0}};		
+		}
+		else
+		{	
+			njm = (distanceMatrix > methodIndex)>=filteredData.species;
+				
+			treeNodes 		= {2*(filteredData.species+1),3};
+			cladesInfo	    = {filteredData.species-1,2};
+			
+			for (i=Rows(treeNodes)-1; i>=0; i=i-1)
+			{
+				treeNodes[i][0] = njm[i][0];
+				treeNodes[i][1] = njm[i][1];
+				treeNodes[i][2] = njm[i][2];
+			}
+
+			for (i=Rows(cladesInfo)-1; i>=0; i=i-1)
+			{
+				cladesInfo[i][0] = njm[i][3];
+				cladesInfo[i][1] = njm[i][4];
+			}
+			
+			njm = 0;
+		}
+	}
+	distanceMatrix = 0;
+	
+	return 1.0;
+}
+
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function CleanUpMPI (dummy)
+{
+	if (MPI_NODE_COUNT>1)
+	{
+		while (1)
+		{
+			for (nodeCounter = 0; nodeCounter < MPI_NODE_COUNT-1; nodeCounter = nodeCounter+1)
+			{
+				if (MPINodeState[nodeCounter][0]==1)
+				{
+					fromNode = ReceiveJobs (0,0,0);
+					break;	
+				}
+			}
+			if (nodeCounter == MPI_NODE_COUNT-1)
+			{
+				break;
+			}
+		}			
+		if (khOption)
+		{
+			for (bpi=0; bpi<Abs(bppMap); bpi=bpi+1)
+			{
+				bpv = bppMap[bpi];
+				if (ResamplesDone[bpv] == 0)
+				{
+					if (Abs (MatrixList1[bpi]) && Abs (MatrixList2[bpi]))
+					{
+						runKHResampler (bpi);
+					}
+				}
+			}		
+		}
+	}
+	return 0;
+}
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function ReceiveJobs (sendOrNot, ji, jobKind)
+{
+	if (MPI_NODE_COUNT>1)
+	{
+		MPIReceive (-1, fromNode, result_String);
+		mji = MPINodeState[fromNode-1][1];
+		mjk = MPINodeState[fromNode-1][2];
+		
+		if (sendOrNot)
+		{
+			MPISend (fromNode,lf);
+			MPINodeState[fromNode-1][1] = ji;			
+			MPINodeState[fromNode-1][2] = jobKind;			
+		}
+		else
+		{
+			MPINodeState[fromNode-1][0] = 0;
+			MPINodeState[fromNode-1][1] = -1;		
+			MPINodeState[fromNode-1][2] = 0;		
+		}
+		
+		ExecuteCommands (result_String);
+		myDF 	= lf_MLES[1][1]+baseParams;
+		myAICc  = -2*(lf_MLES[1][0]-myDF*(baseSites/(baseSites-myDF-1)));
+		myAIC   = -2*(lf_MLES[1][0]-myDF);
+		myBIC	= -2*(lf_MLES[1][0]-myDF*Log(baseSites));
+		ji = mji;
+		jobKind = mjk; 
+	}
+	else
+	{
+		myDF 	= res[1][1]+baseParams;
+		myAICc  = -2*(res[1][0]-myDF*(baseSites/(baseSites-myDF-1)));
+		myAIC   = -2*(res[1][0]-myDF);
+		myBIC	= -2*(res[1][0]-myDF*Log(baseSites));
+	}
+	
+	if (jobKind == 2)
+	{
+		ConstructCategoryMatrix (siteLikelihoods, lf2, COMPLETE);		
+		MatrixList2 [ji] = siteLikelihoods;
+	}
+	else
+	{
+		fprintf (stdout, "\nBreakpoint at position ", Format(bppMap[ji],6,0), ". dAIC =  ", Format(nullAIC-myAIC,10,2), " dAICc = ",Format(nullAICc-myAICc,10,2)," dBIC = ",Format(nullBIC-myBIC,10,2), );	
+	
+		MasterList [ji-1][0] = ji;
+		MasterList [ji-1][1] = myAIC;
+		MasterList [ji-1][2] = myAICc;
+		MasterList [ji-1][3] = myBIC;
+		if (jobKind == 1)
+		{
+			ConstructCategoryMatrix (siteLikelihoods, lf, COMPLETE);		
+			runKHResampler (ji,siteLikelihoods);
+		}	
+	}
+	
+	return fromNode-1;
+}
+
+
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function RunASample (jobIndex)
+{	
+
+	ConstraintString = "";
+	LikelihoodFunctionString = "";
+	ConstraintString * 8192;
+	
+	bpF2 = bppMap[jobIndex];
+	if (dataType)
+	{
+		filterString = "0-"+(3*bpF2-1);
+	}
+	else
+	{
+		filterString = "0-"+bpF2;		
+	}
+	
+	ConstraintString * ("DataSetFilter filteredData = CreateFilter(ds,1,\""+filterString+"\");");
+	if (dataType)
+	{
+		ConstraintString * ("DataSetFilter filteredData0 = CreateFilter (ds,3,\""+filterString+"\",\"\",GeneticCodeExclusions);");		
+	}
+	else
+	{
+		ConstraintString * ("DataSetFilter filteredData0 = CreateFilter (ds,1,\""+filterString+"\");");
+	}
+	
+	ConstraintString * ("InferTreeTopology (0);treeString=TreeMatrix2TreeString(0);Tree givenTree0 = treeString;");
+					
+	
+	if (dataType)
+	{
+		filterString = ""+(3*bpF2)+"-"+(ds.sites-1);
+	}
+	else
+	{
+		filterString = ""+(bpF2+1)+"-"+(ds.sites-1);		
+	}
+
+	ConstraintString * ("DataSetFilter filteredData = CreateFilter(ds,1,\""+filterString+"\");");
+	if (dataType)
+	{
+		ConstraintString * ("DataSetFilter filteredData1 = CreateFilter (ds,3,\""+filterString+"\",\"\",GeneticCodeExclusions);");		
+	}
+	else
+	{
+		ConstraintString * ("DataSetFilter filteredData1 = CreateFilter (ds,1,\""+filterString+"\");");
+	}
+	ConstraintString * ("InferTreeTopology (0);treeString=TreeMatrix2TreeString(0);Tree givenTree1 = treeString;");
+	ConstraintString * 0;
+
+	ExecuteCommands (ConstraintString);
+	
+	fprintf (treeFilePath1,bpF2, "\t", Format (givenTree0,0,0), "\n");
+	fprintf (treeFilePath2,bpF2, "\t", Format (givenTree1,0,0), "\n");
+
+	LikelihoodFunction lf  = (filteredData0,givenTree0,filteredData1,givenTree1);
+	
+		
+	if ((MPI_NODE_COUNT>1) && (jobIndex>=0))
+	{
+		for (mpiNode = 0; mpiNode < MPI_NODE_COUNT-1; mpiNode = mpiNode+1)
+		{
+			if (MPINodeState[mpiNode][0]==0)
+			{
+				break;	
+			}
+		}
+		if (mpiNode==MPI_NODE_COUNT-1)
+		{
+			mpiNode = ReceiveJobs (1,jobIndex,0);
+		}
+		else
+		{
+			MPISend (mpiNode+1,lf);
+			MPINodeState[mpiNode][0] = 1;
+			MPINodeState[mpiNode][1] = jobIndex;
+		}
+	}
+	else
+	{
+		Optimize (res,lf);
+		
+		if (jobIndex>=0)
+		{
+			mpiNode = ReceiveJobs (1, jobIndex, khOption);
+			if (khOption)
+			{
+				LikelihoodFunction lf2 = (filteredData0,givenTree1,filteredData1,givenTree0);
+				Optimize (res2,lf2);
+				mpiNode = ReceiveJobs (1, jobIndex, 2);
+			}
+		}
+		else
+		{
+			myAIC = 2*(res[1][0]-res[1][1]-baseParams);
+		}
+	}
+	return 0;	
+}
+
+
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+
+/*ChoiceList (dataType,"Data type",1,SKIP_NONE,"Nucleotide","Nucleotide data.",
+				     "Codon","Codon (several available genetic codes).");
+
+if (dataType<0) 
+{
+	return;
+}*/
+
+dataType = 0;
+
+if (dataType==0)
+{
+	SetDialogPrompt 	  		  ("Locate a multi-alignment nucleotide data  file:");
+}
+else
+{
+	SetDialogPrompt 	  		  ("Locate a multi-alignment codon data file:");
+}
+
+fscanf  (PROMPT_FOR_FILE,"Lines",inFile);
+
+alignmentStride = 11;
+alignmentCount	= Columns (inFile)/alignmentStride;
+fprintf (stdout, "Read ", alignmentCount, " alignments.\n");
+
+alStr    = 0;
+khOption = 0;
+
+resultMatrix = {alignmentCount, 6};
+
+for (alignmentIndex = 0; alignmentIndex < alignmentCount; alignmentIndex = alignmentIndex + 1)
+{
+	fprintf (stdout, "Working on alignment ", alignmentIndex+1, "\n");
+	
+	bppMap					= {};
+	
+	alignmentString = "";
+	alignmentString * 1024;
+	for (inStr=0; inStr < alignmentStride; inStr = inStr+1)
+	{
+		alignmentString * (inFile[alStr] + "\n");
+		alStr = alStr + 1;
+	}
+	alignmentString * 0;
+	
+	DataSet 		ds  		 = ReadFromString (alignmentString);
+	DataSetFilter	filteredData = CreateFilter(ds,1);
+
+	siteCount = filteredData.sites;
+
+	InferTreeTopology (0);
+	treeString = TreeMatrix2TreeString(0);
+
+	baseSites  = filteredData.sites;
+
+	/* find "informative sites" */
+
+	if (dataType==0)
+	{
+		for (h=0; h<filteredData.sites; h=h+1)
+		{
+			filterString = "" + h;
+			DataSetFilter siteFilter = CreateFilter (filteredData,1,filterString);
+			HarvestFrequencies (f1, siteFilter, 1, 1, 0);
+			m1 = 0;
+			for (mpiNode=0; (mpiNode < 4) && (m1<=1) ; mpiNode=mpiNode+1)
+			{
+				if (f1[mpiNode]>0)
+				{
+					m1=m1+1;
+				}
+			}	
+			if (m1>1)
+			{
+				bppMap[Abs(bppMap)] = h;
+			}
+		}
+	}
+	else
+	{
+		incFileName = HYPHY_LIB_DIRECTORY+"TemplateBatchFiles"+DIRECTORY_SEPARATOR+"TemplateModels"+DIRECTORY_SEPARATOR+"chooseGeneticCode.def";
+		ExecuteCommands  ("#include \""+incFileName+"\";");
+		
+		DataSetFilter filteredData = CreateFilter (ds,3,"","",GeneticCodeExclusions);
+		for (h=0; h<filteredData.sites; h=h+1)
+		{
+			filterString = "" + 3*h + "-" + (3*h+2);
+			DataSetFilter siteFilter = CreateFilter (filteredData,3,filterString,"",GeneticCodeExclusions);
+
+			HarvestFrequencies (f1, siteFilter, 3, 3, 1);
+			m1 = 0;
+			for (mpiNode=0; (mpiNode < 64) && (m1<=1); mpiNode=mpiNode+1)
+			{
+				if (f1[mpiNode]>0)
+				{
+					m1=m1+1;
+				}
+			}	
+			if (m1>1)
+			{
+				bppMap[Abs(bppMap)] = h;
+			}
+		}
+	}
+
+	if (Abs(bppMap) <= partCount)
+	{
+		fprintf (stdout, "\nThere are too few potential break points to support ", partCount-1, " recombination events.\n");
+		return 0;
+	}
+
+	bppSize = (Log(Abs(bppMap))/Log(2)+1)$1;
+	fprintf (stdout, "\nThere are ",Abs(bppMap)," potential breakpoints.\n");
+
+	/*ChoiceList (khOption,"KH Testing",1,SKIP_NONE,"Skip","Use only AIC to measure goodness of fit.",
+					     "Run","Verify conflicting phylogenetic signal with KH resampling.");
+
+
+	if (khOption < 0)
+	{
+		return 0;
+	}
+
+	if (khOption == 1)
+	{
+		itCount = 0;
+		while (itCount < 1)
+		{
+			fprintf (stdout, "How many KH samples should be drawn per breakpoint ?");
+			fscanf (stdin, "Number", itCount);
+		}
+		SHORT_MPI_RETURN = 0;	
+	}*/
+
+	if (alignmentIndex == 0)
+	{
+		SelectTemplateModel (filteredData);	
+	}
+	else
+	{
+		HarvestFrequencies (vectorOfFrequencies,filteredData,1,1,1);
+		mbf = PopulateModelMatrix ("myMatrix",vectorOfFrequencies);
+		Model myModel = (myMatrix,vectorOfFrequencies,mbf);
+	}
+
+	/*SetDialogPrompt ("Save results to:");*/
+
+	/*fprintf (PROMPT_FOR_FILE,CLEAR_FILE);
+
+	resFilePath = LAST_FILE_PATH;
+	treeFilePath1 = resFilePath + ".trees1";
+	treeFilePath2 = resFilePath + ".trees2";
+
+	fprintf (treeFilePath1,CLEAR_FILE);
+	fprintf (treeFilePath2,CLEAR_FILE);
+	if (khOption)
+	{
+		khFilePath = resFilePath + ".kh";
+		fprintf (khFilePath, CLEAR_FILE, "Breakpoint, Part 1 KH p-value, Part 2 KH p-value\n");
+	}*/
+
+	Tree givenTree = treeString;
+
+	branchNames	  = BranchName (givenTree,-1);
+	LikelihoodFunction lf = (filteredData,givenTree);
+	Optimize (res,lf);
+	currentPopulation  = {};
+	baseParams = res[1][2] + 3; /* for frequencies */
+	
+	myDF	 = res[1][1];
+	nullAIC  = -2*(res[1][0]-myDF);
+	nullAICc = -2*(res[1][0]-myDF*(baseSites/(baseSites-myDF-1)));
+	nullBIC	 = -2*(res[1][0]-myDF*Log(baseSites));
+	
+	MasterList    = {Abs(bppMap)-1,4};
+	MatrixList1   = {};
+	MatrixList2   = {};
+	ResamplesDone = {};
+
+	fprintf (stdout, "\n1). Single partition analysis\n",lf,"\nAIC=",nullAIC,"\n\n2). Looking for a breakpoint...\n");
+
+		
+	if (baseParams>0)
+	{
+
+		ConstraintString = "";
+		ConstraintString*256;
+		for (h=0; h<baseParams; h=h+1)
+		{
+			GetString (v,lf,h);
+			ConstraintString * (v+":="+v+"__;\n");
+		}
+		ConstraintString*0;
+		ExecuteCommands (ConstraintString);
+	}
+	if (MPI_NODE_COUNT>1)
+	{
+		MPINodeState = {MPI_NODE_COUNT-1,3};
+	}
+
+
+	for (individual=1; individual<Abs(bppMap); individual=individual+1)
+	{
+		RunASample (individual);
+	}
+
+	CleanUpMPI (0);
+
+	/* process the results */
+
+	sortedScores = MasterList % 1;
+	
+	fprintf (stdout, "\nAIC");
+	
+	if (sortedScores[0][1] < nullAIC)
+	{
+		individual = sortedScores[0][0];
+		fprintf (stdout, "\n\nBest supported breakpoing is located at position ", bppMap[individual], "\nAIC = ", sortedScores[0][1], " : an imrovement of ", 
+					     nullAIC - sortedScores[0][1], " AIC points\n");
+		resultMatrix [alignmentIndex][0] = bppMap[individual];
+		resultMatrix [alignmentIndex][1] = nullAIC - sortedScores[0][1];
+	}
+	else
+	{
+		fprintf (stdout, "\n\nThere seems to be NO recombination in this alignment\n\n");
+		resultMatrix [alignmentIndex][0] = -1;
+		resultMatrix [alignmentIndex][1] = 0;
+	}
+
+	sortedScores = MasterList % 2;
+	
+	fprintf (stdout, "\nAIC-c");
+	
+	if (sortedScores[0][2] < nullAICc)
+	{
+		individual = sortedScores[0][0];
+		fprintf (stdout, "\n\nBest supported breakpoing is located at position ", bppMap[individual], "\nAIC = ", sortedScores[0][2], " : an imrovement of ", 
+					     nullAICc - sortedScores[0][2], " AIC points\n");
+		resultMatrix [alignmentIndex][2] = bppMap[individual];
+		resultMatrix [alignmentIndex][3] = nullAICc - sortedScores[0][1];
+	}
+	else
+	{
+		fprintf (stdout, "\n\nThere seems to be NO recombination in this alignment\n\n");
+		resultMatrix [alignmentIndex][2] = -1;
+		resultMatrix [alignmentIndex][3] = 0;
+	}
+	
+	sortedScores = MasterList % 3;
+	
+	fprintf (stdout, "\nBIC");
+	
+	if (sortedScores[0][3] < nullBIC)
+	{
+		individual = sortedScores[0][0];
+		fprintf (stdout, "\n\nBest supported breakpoing is located at position ", bppMap[individual], "\nAIC = ", sortedScores[0][3], " : an imrovement of ", 
+					     nullBIC - sortedScores[0][3], " AIC points\n");
+		resultMatrix [alignmentIndex][4] = bppMap[individual];
+		resultMatrix [alignmentIndex][5] = nullBIC - sortedScores[0][3];
+	}
+	else
+	{
+		fprintf (stdout, "\n\nThere seems to be NO recombination in this alignment\n\n");
+		resultMatrix [alignmentIndex][4] = -1;
+		resultMatrix [alignmentIndex][5] = 0;
+	}	
+}
+
+columnHeaders = {{"AIC site","dAIC","AICc site","dAICc","BIC site","dBIC",";1;2;3;4;5;6;7;8;9;10;11;12;13;14;15;16;17;18;19;20;21;22;23;24;25;26;27;28;29;30;31;32;33;34;35;36;37;38;39;40;41;42;43;44;45;46;47;48;49;50;51;52;53;54;55;56;57;58;59;60;61;62;63;64;65;66;67;68;69;70;71;72;73;74;75;76;77;78;79;80;81;82;83;84;85;86;87;88;89;90;91;92;93;94;95;96;97;98;99;100"}};
+OpenWindow (CHARTWINDOW,{{"Recombination Run"}
+		{"columnHeaders"}
+		{"resultMatrix"}
+		{"Scatterplot"}
+		{"Index"}
+		{"AIC site;AICc site;BIC site"}
+		{""}
+		{""}
+		{""}
+		{"0"}
+		{""}
+		{"0;0"}
+		{"10;1.309;0.785398"}
+		{"Times:12:0;Times:10:0;Times:12:2"}
+		{"0;0;13816530;16777215;0;0;6579300;11842740;13158600;14474460;0;3947580;16777215;15670812;6845928;16771158;2984993;9199669;7018159;1460610;16748822;11184810;14173291"}
+		{"16,0,0"}
+		},
+		"816;639;70;70");
+		
+SetDialogPrompt ("Save results to:");
+fprintf (PROMPT_FOR_FILE,CLEAR_FILE,resultMatrix);
diff --git a/res/TemplateBatchFiles/SingleBreakpointRecomb.bf b/res/TemplateBatchFiles/SingleBreakpointRecomb.bf
new file mode 100644
index 0000000..1a9139b
--- /dev/null
+++ b/res/TemplateBatchFiles/SingleBreakpointRecomb.bf
@@ -0,0 +1,1183 @@
+partCount				= 2;
+
+/* ________________________________________________________________________________________________*/
+
+REPLACE_TREE_STRUCTURE  = 1;
+bppMap					= {};
+tree1AVL				= {};
+tree2AVL				= {};
+SHORT_MPI_RETURN		= 1;
+VERBOSITY_LEVEL			= -1;
+
+/*--------------------------------------------------------------------------------------*/
+
+function testLRT (vec1, vec2)
+{
+	size1 = Columns(vec1);
+	
+	sumVec1 = {size1,1};
+	jvec	= {2,size1};
+	resMx1	= {itCount,1};
+	resMx2	= {itCount,1};
+	
+	for (k=0; k<size1; k=k+1)
+	{
+		sumVec1 [k]	   = 1;
+		jvec	[0][k] = Log(vec1[k]);
+		jvec	[1][k] = Log(vec2[k]);
+	}
+	
+	
+	for (k=0; k<itCount; k=k+1)
+	{
+		resampled = Random(jvec,1);
+		resampled = resampled*sumVec1;
+		resMx1[k] = resampled[0];
+		resMx2[k] = resampled[1];
+	}
+	
+	resMx1 = (resMx1-resMx2)*2;
+	resMx1 = resMx1 % 0;
+	for (k=0; k<Rows(resMx1); k=k+1)
+	{
+		if (resMx1[k]>0)
+		{
+			break;
+		}
+	}	
+	return k/itCount;
+}
+
+/* ________________________________________________________________________________________________*/
+
+
+function InitializeDistances (dummy)
+{
+	HarvestFrequencies (_dNucFreq,filteredData,1,1,0);
+	_d_fR = _dNucFreq[0]+_dNucFreq[2];
+	_d_fY = _dNucFreq[1]+_dNucFreq[3];
+	
+	if (_dNucFreq[0] == 0 || _dNucFreq[1] == 0 || _dNucFreq[2] == 0 || _dNucFreq[3] == 0)
+	{
+		_useK2P = 1;
+	}
+	else
+	{
+		_d_TN_K1 = 2*_dNucFreq[0]*_dNucFreq[2]/_d_fR;
+		_d_TN_K2 = 2*_dNucFreq[1]*_dNucFreq[3]/_d_fY;
+		_d_TN_K3 = 2*(_d_fR*_d_fY-_dNucFreq[0]*_dNucFreq[2]*_d_fY/_d_fR-_dNucFreq[1]*_dNucFreq[3]*_d_fR/_d_fY);
+		_useK2P = 0;
+	}
+	
+	
+	summingVector = {{1}{1}{1}{1}};
+
+	return 0;
+}
+
+/* ________________________________________________________________________________________________*/
+
+function ComputeDistanceFormula (s1,s2)
+{
+	GetDataInfo (siteDifferenceCount, filteredData, s1, s2, DIST);
+	
+	totalSitesCompared = Transpose(summingVector)*(siteDifferenceCount*summingVector);
+	totalSitesCompared = totalSitesCompared[0];
+	
+	if (_useK2P)
+	{
+		_dTransitionCounts 	 =    siteDifferenceCount[0][2]+siteDifferenceCount[2][0]  /* A-G and G-A */
+								 +siteDifferenceCount[1][3]+siteDifferenceCount[3][1]; /* C-T and T-C */
+							
+		_dTransversionCounts = (siteDifferenceCount[0][0]+siteDifferenceCount[1][1]+siteDifferenceCount[2][2]+siteDifferenceCount[3][3])+_dTransitionCounts;
+		
+		_dTransitionCounts	 = _dTransitionCounts/totalSitesCompared;
+		_dTransversionCounts = 1-_dTransversionCounts/totalSitesCompared;
+		
+		_d1C = 1-2*_dTransitionCounts-_dTransversionCounts;
+		_d2C = 1-2*_dTransversionCounts;
+		
+		if (_d1C>0 && _d2C>0)
+		{
+			return -(0.5*Log(_d1C)+.25*Log(_d2C));	
+		}
+	}
+	else
+	{
+		_dAGCounts 	 =    siteDifferenceCount[0][2]+siteDifferenceCount[2][0]  /* A-G and G-A */;
+		_dCTCounts	 = 	  siteDifferenceCount[1][3]+siteDifferenceCount[3][1]; /* C-T and T-C */
+							
+		_dTransversionCounts = (siteDifferenceCount[0][0]+siteDifferenceCount[1][1]+siteDifferenceCount[2][2]+
+								siteDifferenceCount[3][3])+_dAGCounts+_dCTCounts;
+		
+		_dAGCounts	 = _dAGCounts/totalSitesCompared;
+		_dCTCounts	 = _dCTCounts/totalSitesCompared;
+		
+		_dTransversionCounts = 1-_dTransversionCounts/totalSitesCompared;
+		
+		_d1C = 1-_dAGCounts/_d_TN_K1-0.5*_dTransversionCounts/_d_fR;
+		_d2C = 1-_dCTCounts/_d_TN_K2-0.5*_dTransversionCounts/_d_fY;
+		_d3C = 1-0.5*_dTransversionCounts/_d_fY/_d_fR;
+		
+		if ((_d1C>0)&&(_d2C>0)&&(_d3C>0))
+		{
+			return -_d_TN_K1*Log(_d1C)-_d_TN_K2*Log(_d2C)-_d_TN_K3*Log(_d3C);
+		}
+	}
+	
+	return 1000;
+}
+
+/* ________________________________________________________________________________________________*/
+
+function TreeMatrix2TreeString (doLengths)
+{
+	treeString = "";
+	p = 0;
+	k = 0;
+	m = treeNodes[0][1];
+	n = treeNodes[0][0];
+	d = treeString*(Rows(treeNodes)*25);
+
+	while (m)
+	{	
+		if (m>p)
+		{
+			if (p)
+			{
+				d = treeString*",";
+			}
+			for (j=p;j<m;j=j+1)
+			{
+				d = treeString*"(";
+			}
+		}
+		else
+		{
+			if (m<p)
+			{
+				for (j=m;j<p;j=j+1)
+				{
+					d = treeString*")";
+				}
+			}	
+			else
+			{
+				d = treeString*",";
+			}	
+		}
+		if (n<filteredData.species)
+		{
+			GetString (nodeName, filteredData, n);
+			d = treeString*nodeName;
+		}
+		if (doLengths>.5)
+		{
+			nodeName = ":"+treeNodes[k][2];
+			d = treeString*nodeName;
+		}
+		k=k+1;
+		p=m;
+		n=treeNodes[k][0];
+		m=treeNodes[k][1];
+	}
+
+	for (j=m;j<p;j=j+1)
+	{
+		d = treeString*")";
+	}
+	
+	d=treeString*0;
+	return treeString;
+}
+
+/* ________________________________________________________________________________________________*/
+
+function InferTreeTopology(verbFlag)
+{
+	distanceMatrix = {filteredData.species,filteredData.species};
+	dummy = InitializeDistances (0);
+		
+	for (i = 0; i<filteredData.species; i=i+1)
+	{
+		for (j = i+1; j<filteredData.species; j = j+1)
+		{
+			distanceMatrix[i][j] = ComputeDistanceFormula (i,j);
+		}
+	}
+
+	MESSAGE_LOGGING 		 	= 1;
+	cladesMade 					= 1;
+	
+
+	if (filteredData.species == 2)
+	{
+		d1 = distanceMatrix[0][1]/2;
+		treeNodes = {{0,1,d1__},
+					 {1,1,d1__},
+					 {2,0,0}};
+					 
+		cladesInfo = {{2,0}};
+	}
+	else
+	{
+		if (filteredData.species == 3)
+		{
+			d1 = (distanceMatrix[0][1]+distanceMatrix[0][2]-distanceMatrix[1][2])/2;
+			d2 = (distanceMatrix[0][1]-distanceMatrix[0][2]+distanceMatrix[1][2])/2;
+			d3 = (distanceMatrix[1][2]+distanceMatrix[0][2]-distanceMatrix[0][1])/2;
+			treeNodes = {{0,1,d1__},
+						 {1,1,d2__},
+						 {2,1,d3__}
+						 {3,0,0}};
+						 
+			cladesInfo = {{3,0}};		
+		}
+		else
+		{	
+			njm = (distanceMatrix > methodIndex)>=filteredData.species;
+				
+			treeNodes 		= {2*(filteredData.species+1),3};
+			cladesInfo	    = {filteredData.species-1,2};
+			
+			for (i=Rows(treeNodes)-1; i>=0; i=i-1)
+			{
+				treeNodes[i][0] = njm[i][0];
+				treeNodes[i][1] = njm[i][1];
+				treeNodes[i][2] = njm[i][2];
+			}
+
+			for (i=Rows(cladesInfo)-1; i>=0; i=i-1)
+			{
+				cladesInfo[i][0] = njm[i][3];
+				cladesInfo[i][1] = njm[i][4];
+			}
+			
+			njm = 0;
+		}
+	}
+	distanceMatrix = 0;
+	
+	return 1.0;
+}
+
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function CleanUpMPI (dummy)
+{
+	if (MPI_NODE_COUNT>1)
+	{
+		while (1)
+		{
+			for (nodeCounter = 0; nodeCounter < MPI_NODE_COUNT-1; nodeCounter = nodeCounter+1)
+			{
+				if (MPINodeState[nodeCounter][0]==1)
+				{
+					fromNode = ReceiveJobs (0,0,0);
+					break;	
+				}
+			}
+			if (nodeCounter == MPI_NODE_COUNT-1)
+			{
+				break;
+			}
+		}			
+		if (khOption)
+		{
+			for (bpi=0; bpi<Abs(bppMap); bpi=bpi+1)
+			{
+				bpv = bppMap[bpi];
+				if (ResamplesDone[bpv] == 0)
+				{
+					if (Abs (MatrixList1[bpi]) && Abs (MatrixList2[bpi]))
+					{
+						runKHResampler (bpi);
+					}
+				}
+			}		
+		}
+	}
+	return 0;
+}
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function runKHResampler (ji)
+{
+	psize1 = bppMap[ji]+1;
+	psize2 = siteCount - psize1;
+	v1_1 = {1,psize1};
+	v1_2 = {1,psize1};
+	v2_1 = {1,psize2};
+	v2_2 = {1,psize2};
+	s1 	 = MatrixList1[ji];
+	s2 	 = MatrixList2[ji];
+	L_L  = {2,1};
+	for (i = 0; i < psize1; i=i+1)
+	{
+		v1_1[i] = s1[i];
+		v1_2[i] = s2[i];
+		L_L[0] = L_L[0]+Log(s1[i]/s2[i]);
+	}
+	for (i = 0; i < psize2; i=i+1)
+	{
+		i2 = i+psize1;
+		v2_1[i] = s1[i2];
+		v2_2[i] = s2[i2];
+		L_L[1] = L_L[1]+Log(s1[i2]/s2[i2]);
+	}
+	MasterList[ji-1][2] = testLRT (v1_1,v1_2);
+	MasterList[ji-1][3] = testLRT (v2_1,v2_2);
+	ResamplesDone[ji] = 1;
+	
+	fprintf (stdout, "\nKH::::Breakpoint at position ", psize1-1, ". Part 1 p=",  MasterList[ji-1][2], " (delta LnL = ", L_L[0],
+														"). Part 2 p=", MasterList[ji-1][3], " (delta LnL = ", L_L[1],")\n");
+	fprintf (khFilePath, psize1-1, ",", MasterList[ji-1][2], ",", L_L[0], ",", MasterList[ji-1][3], ",", L_L[1], "\n");
+	
+	return 0;
+}
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function ReceiveJobs (sendOrNot, ji, jobKind)
+{
+	if (MPI_NODE_COUNT>1)
+	{
+		MPIReceive (-1, fromNode, result_String);
+		mji = MPINodeState[fromNode-1][1];
+		mjk = MPINodeState[fromNode-1][2];
+		
+		if (sendOrNot)
+		{
+			if (jobKind < 2)
+			{
+				MPISend (fromNode,lf);
+			}
+			else
+			{
+				MPISend (fromNode,lf2);
+			}
+			MPINodeState[fromNode-1][1] = ji;			
+			MPINodeState[fromNode-1][2] = jobKind;			
+		}
+		else
+		{
+			MPINodeState[fromNode-1][0] = 0;
+			MPINodeState[fromNode-1][1] = -1;		
+			MPINodeState[fromNode-1][2] = 0;		
+		}
+		
+		ExecuteCommands (result_String);
+		ji = mji;
+		jobKind = mjk; 
+		if (jobKind < 2)
+		{
+			myDF 	= lf_MLES[1][1]+baseParams;
+			myAICc  = -2*(lf_MLES[1][0]-myDF*(baseSites/(baseSites-myDF-1)));
+			myAIC   = -2*(lf_MLES[1][0]-myDF);
+			myBIC	= -2*(lf_MLES[1][0]-myDF*Log(baseSites));
+		}
+	}
+	else
+	{
+		if (jobKind < 2)
+		{
+			myDF 	= res[1][1]+baseParams;
+			myAICc  = -2*(res[1][0]-myDF*(baseSites/(baseSites-myDF-1)));
+			myAIC   = -2*(res[1][0]-myDF);
+			myBIC	= -2*(res[1][0]-myDF*Log(baseSites));
+		}
+	}
+	
+	if (jobKind == 2)
+	{
+		ConstructCategoryMatrix (siteLikelihoods, lf2, COMPLETE);		
+		MatrixList2 [ji] = siteLikelihoods;
+	}
+	else
+	{
+		fprintf (stdout, "\nBreakpoint at position ", Format(bppMap[ji],6,0), ". dAIC =  ", Format(nullAIC-myAIC,10,2), " dAICc = ",Format(nullAICc-myAICc,10,2)," dBIC = ",Format(nullBIC-myBIC,10,2), );	
+		fprintf (resFilePath, bppMap[ji], ",", myAIC, ",", nullAIC-myAIC, "\n");
+	
+		MasterList [ji-1][0] = ji;
+		MasterList [ji-1][1] = myAIC;
+		MasterList [ji-1][4] = myAICc;
+		MasterList [ji-1][5] = myBIC;
+		if (jobKind == 1)
+		{
+			ConstructCategoryMatrix (siteLikelihoods, lf, COMPLETE);		
+			MatrixList1 [ji] = siteLikelihoods;	
+		}	
+	}
+	
+	if (jobKind)
+	{
+		for (bpi=0; bpi<Abs(bppMap); bpi=bpi+1)
+		{
+			if (ResamplesDone[bpi] == 0)
+			{
+				if (Abs (MatrixList1[bpi]) > 0 && Abs (MatrixList2[bpi]) > 0)
+				{
+					runKHResampler (bpi);
+				}
+			}
+		}
+	}
+	return fromNode-1;
+}
+
+
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function RunASample (jobIndex)
+{	
+
+	ConstraintString = "";
+	LikelihoodFunctionString = "";
+	ConstraintString * 8192;
+	
+	bpF2 = bppMap[jobIndex];
+	if (dataType)
+	{
+		filterString = "0-"+(3*bpF2-1);
+	}
+	else
+	{
+		filterString = "0-"+bpF2;		
+	}
+	
+	ConstraintString * ("DataSetFilter filteredData = CreateFilter(ds,1,\""+filterString+"\");");
+	if (dataType)
+	{
+		ConstraintString * ("DataSetFilter filteredData0 = CreateFilter (ds,3,\""+filterString+"\",\"\",GeneticCodeExclusions);");		
+	}
+	else
+	{
+		ConstraintString * ("DataSetFilter filteredData0 = CreateFilter (ds,1,\""+filterString+"\");");
+	}
+	
+	ConstraintString * ("InferTreeTopology (0);treeString=TreeMatrix2TreeString(0);Tree givenTree0 = treeString;");
+					
+	
+	if (dataType)
+	{
+		filterString = ""+(3*bpF2)+"-"+(ds.sites-1);
+	}
+	else
+	{
+		filterString = ""+(bpF2+1)+"-"+(ds.sites-1);		
+	}
+
+	ConstraintString * ("DataSetFilter filteredData = CreateFilter(ds,1,\""+filterString+"\");");
+	if (dataType)
+	{
+		ConstraintString * ("DataSetFilter filteredData1 = CreateFilter (ds,3,\""+filterString+"\",\"\",GeneticCodeExclusions);");		
+	}
+	else
+	{
+		ConstraintString * ("DataSetFilter filteredData1 = CreateFilter (ds,1,\""+filterString+"\");");
+	}
+	ConstraintString * ("InferTreeTopology (0);treeString=TreeMatrix2TreeString(0);Tree givenTree1 = treeString;");
+	ConstraintString * 0;
+
+	ExecuteCommands (ConstraintString);
+	
+	fprintf (treeFilePath1,bpF2, "\t", Format (givenTree0,0,0), "\n");
+	tree1AVL [jobIndex] = Format(givenTree0,0,0);
+	fprintf (treeFilePath2,bpF2, "\t", Format (givenTree1,0,0), "\n");
+	tree2AVL [jobIndex] = Format(givenTree1,0,0);
+
+	if ((MPI_NODE_COUNT>1) && (jobIndex>=0))
+	{
+		OPTIMIZE_SUMMATION_ORDER = 0;
+	}
+	LikelihoodFunction lf  = (filteredData0,givenTree0,filteredData1,givenTree1);
+	
+	if (khOption > 1)
+	{
+		Tree j_tree_0 = baseTreeString;
+		Tree j_tree_1 = baseTreeString;
+	}
+	
+		
+	if ((MPI_NODE_COUNT>1) && (jobIndex>=0))
+	{
+		OPTIMIZE_SUMMATION_ORDER = 1;
+		for (mpiNode = 0; mpiNode < MPI_NODE_COUNT-1; mpiNode = mpiNode+1)
+		{
+			if (MPINodeState[mpiNode][0]==0)
+			{
+				break;	
+			}
+		}
+		if (mpiNode==MPI_NODE_COUNT-1)
+		{
+			mpiNode = ReceiveJobs (1,jobIndex,khOption>0);
+		}
+		else
+		{
+			MPISend (mpiNode+1,lf);
+			MPINodeState[mpiNode][0] = 1;
+			MPINodeState[mpiNode][1] = jobIndex;
+			MPINodeState[mpiNode][2] = khOption>0;
+		}
+		
+		if (khOption)
+		{
+			if (khOption == 1)
+			{
+				LikelihoodFunction lf2 = (filteredData0,givenTree1,filteredData1,givenTree0);
+			}
+			else
+			{
+				LikelihoodFunction lf2 = (filteredData0,j_tree_0,filteredData1,j_tree_1);			
+			}
+			
+			for (mpiNode = 0; mpiNode < MPI_NODE_COUNT-1; mpiNode = mpiNode+1)
+			{
+				if (MPINodeState[mpiNode][0]==0)
+				{
+					break;	
+				}
+			}
+			if (mpiNode==MPI_NODE_COUNT-1)
+			{
+				mpiNode = ReceiveJobs (1,jobIndex,2);
+			}
+			else
+			{
+				MPISend (mpiNode+1,lf2);
+				MPINodeState[mpiNode][0] = 1;
+				MPINodeState[mpiNode][1] = jobIndex;
+				MPINodeState[mpiNode][2] = 2;
+			}		
+		}
+	}
+	else
+	{
+		Optimize (res,lf);
+		
+		if (jobIndex>=0)
+		{
+			mpiNode = ReceiveJobs (1, jobIndex, khOption>0);
+			if (khOption)
+			{
+				if (khOption == 1)
+				{
+					LikelihoodFunction lf2 = (filteredData0,givenTree1,filteredData1,givenTree0);
+				}
+				else
+				{
+					LikelihoodFunction lf2 = (filteredData0,j_tree_0,filteredData1,j_tree_1);			
+				}
+				Optimize (res2,lf2);
+				mpiNode = ReceiveJobs (1, jobIndex, 2);
+			}
+		}
+		else
+		{
+			myAIC = 2*(res[1][0]-res[1][1]-baseParams);
+		}
+	}
+	return 0;	
+}
+
+
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+
+ChoiceList (dataType,"Data type",1,SKIP_NONE,"Nucleotide","Nucleotide data.",
+				     "Codon","Codon (several available genetic codes).");
+
+if (dataType<0) 
+{
+	return;
+}
+
+if (dataType==0)
+{
+	SetDialogPrompt 	  		  ("Locate a nucleotide data  file:");
+}
+else
+{
+	SetDialogPrompt 	  		  ("Locate a codon data file:");
+}
+
+DataSet 		ds  		 = ReadDataFile (PROMPT_FOR_FILE);
+
+DataSetFilter	filteredData = CreateFilter(ds,1);
+
+
+siteCount = filteredData.sites;
+
+InferTreeTopology (0);
+treeString = TreeMatrix2TreeString(0);
+
+/* find "informative sites" */
+
+if (dataType==0)
+{
+	for (h=0; h<filteredData.sites; h=h+1)
+	{
+		filterString = "" + h;
+		DataSetFilter siteFilter = CreateFilter (filteredData,1,filterString);
+
+		HarvestFrequencies (f1, siteFilter, 1, 1, 0);
+		m1 = 0;
+		for (mpiNode=0; (mpiNode < 4) && (m1<=1) ; mpiNode=mpiNode+1)
+		{
+			if (f1[mpiNode]>0)
+			{
+				m1=m1+1;
+			}
+		}	
+		if (m1>1)
+		{
+			bppMap[Abs(bppMap)] = h;
+		}
+	}
+}
+else
+{
+	incFileName = HYPHY_LIB_DIRECTORY+"TemplateBatchFiles"+DIRECTORY_SEPARATOR+"TemplateModels"+DIRECTORY_SEPARATOR+"chooseGeneticCode.def";
+	ExecuteCommands  ("#include \""+incFileName+"\";");
+	
+	DataSetFilter filteredData = CreateFilter (ds,3,"","",GeneticCodeExclusions);
+	for (h=0; h<filteredData.sites; h=h+1)
+	{
+		filterString = "" + 3*h + "-" + (3*h+2);
+		DataSetFilter siteFilter = CreateFilter (filteredData,3,filterString,"",GeneticCodeExclusions);
+
+		HarvestFrequencies (f1, siteFilter, 3, 3, 1);
+		m1 = 0;
+		for (mpiNode=0; (mpiNode < 64) && (m1<=1); mpiNode=mpiNode+1)
+		{
+			if (f1[mpiNode]>0)
+			{
+				m1=m1+1;
+			}
+		}	
+		if (m1>1)
+		{
+			bppMap[Abs(bppMap)] = h;
+		}
+	}
+}
+
+if (Abs(bppMap) <= partCount)
+{
+	fprintf (stdout, "\nThere are too few potential break points to support ", partCount-1, " recombination events.\n");
+	return 0;
+}
+
+bppSize = (Log(Abs(bppMap))/Log(2)+1)$1;
+fprintf (stdout, "\nThere are ",Abs(bppMap)," potential breakpoints.\n");
+
+ChoiceList (khOption,"KH Testing",1,SKIP_NONE,"Skip","Use only AIC to measure goodness of fit.",
+				     "Run 1","Verify conflicting phylogenetic signal with KH resampling, swapping trees between partitions for the test",
+				     "Run 2","Verify conflicting phylogenetic signal with KH resampling, using the joint tree as the null.");
+
+
+if (khOption < 0)
+{
+	return 0;
+}
+
+if (khOption > 0)
+{
+	itCount = 0;
+	while (itCount < 1)
+	{
+		fprintf (stdout, "How many KH samples should be drawn per breakpoint ?");
+		fscanf (stdin, "Number", itCount);
+	}
+	SHORT_MPI_RETURN = 0;	
+}
+
+SelectTemplateModel (filteredData);
+
+SetDialogPrompt ("Save results to:");
+
+fprintf (PROMPT_FOR_FILE,CLEAR_FILE);
+
+resFilePath = LAST_FILE_PATH;
+treeFilePath1 = resFilePath + ".trees1";
+treeFilePath2 = resFilePath + ".trees2";
+
+fprintf (treeFilePath1,CLEAR_FILE);
+fprintf (treeFilePath2,CLEAR_FILE);
+if (khOption)
+{
+	khFilePath = resFilePath + ".kh";
+	fprintf (khFilePath, CLEAR_FILE, "Breakpoint, Part 1 KH p-value, Part 1 Delta LogL, Part 2 KH p-value, Part 2 Delta LogL\n");
+}
+
+baseTreeString = treeString;
+Tree givenTree = treeString;
+
+branchNames	  = BranchName (givenTree,-1);
+LikelihoodFunction lf = (filteredData,givenTree);
+Optimize (res,lf);
+currentPopulation  = {};
+
+baseSites  = filteredData.sites;
+baseParams = res[1][2] + 3; /* for frequencies */
+
+myDF	 = res[1][1];
+nullAIC  = -2*(res[1][0]-myDF);
+nullAICc = -2*(res[1][0]-myDF*(baseSites/(baseSites-myDF-1)));
+nullBIC	 = -2*(res[1][0]-myDF*Log(baseSites));
+
+MasterList    = {Abs(bppMap)-1,6};
+MatrixList1   = {};
+MatrixList2   = {};
+ResamplesDone = {};
+
+fprintf (stdout, "\n1). Single partition analysis\n",lf,
+				 "\n AIC  = ",nullAIC,  "\n",
+				 "\nc-AIC = ",nullAICc, "\n",
+				 "\n BIC  = ",nullBIC,  "\n",
+				 "2). Looking for a breakpoint...\n");
+
+baseParams = res[1][2];
+	
+if (baseParams>0)
+{
+
+	ConstraintString = "";
+	ConstraintString*256;
+	for (h=0; h<baseParams; h=h+1)
+	{
+		GetString (v,lf,h);
+		ConstraintString * (v+":="+v+"__;\n");
+	}
+	ConstraintString*0;
+	ExecuteCommands (ConstraintString);
+}
+if (MPI_NODE_COUNT>1)
+{
+	MPINodeState = {MPI_NODE_COUNT-1,3};
+}
+
+
+for (individual=1; individual<Abs(bppMap); individual=individual+1)
+{
+	RunASample (individual);
+}
+
+CleanUpMPI (0);
+
+/* process the results */
+
+sortedScores = MasterList % 1;
+
+fprintf (stdout, "\nAIC");
+
+if (sortedScores[0][1] < nullAIC)
+{
+	individual = sortedScores[0][0];
+	fprintf (stdout, "\n\nBest supported breakpoint is located at position ", bppMap[individual], "\nAIC = ", sortedScores[0][1], " : an improvement of ", 
+				     nullAIC - sortedScores[0][1], " AIC points\n");
+	bpF2 = bppMap[individual];
+	compactResultPath = resFilePath + "_AIC.splits";
+	fprintf (compactResultPath, CLEAR_FILE, "\n\n0-", bpF2, "\n", tree1AVL[individual], "\n", bpF2+1,"-", ds.sites-1, "\n", tree2AVL[individual]);
+}
+else
+{
+	fprintf (stdout, "\n\nThere seems to be NO recombination in this alignment\n\n");
+}
+
+sortedScores = MasterList % 4;
+
+fprintf (stdout, "\nAIC-c");
+
+if (sortedScores[0][4] < nullAICc)
+{
+	individual = sortedScores[0][0];
+	fprintf (stdout, "\n\nBest supported breakpoint is located at position ", bppMap[individual], "\nAIC = ", sortedScores[0][4], " : an improvement of ", 
+				     nullAICc - sortedScores[0][4], " AIC points\n");
+	bpF2 = bppMap[individual];
+	compactResultPath = resFilePath + "_cAIC.splits";
+	fprintf (compactResultPath, CLEAR_FILE, "\n\n0-", bpF2, "\n", tree1AVL[individual], "\n", bpF2+1,"-", ds.sites-1, "\n", tree2AVL[individual]);
+}
+else
+{
+	fprintf (stdout, "\n\nThere seems to be NO recombination in this alignment\n\n");
+}
+
+sortedScores = MasterList % 5;
+
+fprintf (stdout, "\nBIC");
+
+if (sortedScores[0][5] < nullBIC)
+{
+	individual = sortedScores[0][0];
+	fprintf (stdout, "\n\nBest supported breakpoint is located at position ", bppMap[individual], "\nAIC = ", sortedScores[0][5], " : an improvement of ", 
+				     nullBIC - sortedScores[0][5], " AIC points\n");
+	bpF2 = bppMap[individual];
+	compactResultPath = resFilePath + "_BIC.splits";
+	fprintf (compactResultPath, CLEAR_FILE, "\n\n0-", bpF2, "\n", tree1AVL[individual], "\n", bpF2+1,"-", ds.sites-1, "\n", tree2AVL[individual]);
+}
+else
+{
+	fprintf (stdout, "\n\nThere seems to be NO recombination in this alignment\n\n");
+}	
+	
+return 0;
+
+
+
+ChoiceList (dataType,"Verify by LRT",1,SKIP_NONE,"Sure","Verify the statistical significance of the breakpoint using the likelihood ratio test; this may be slow",
+				     "Skip","Skip the LRT");
+				     
+if (dataType != 0)
+{
+	return 0;
+}
+
+itCount = 0;
+while (itCount < 1)
+{
+	fprintf (stdout, "How many samples should be used to tabulate the LRT statistic ?");
+	fscanf (stdin, "Number", itCount);
+}
+
+bestTree1 = tree1AVL[individual];
+bestTree2 = tree2AVL[individual];
+
+if (dataType)
+{
+	DataSetFilter filter1 = CreateFilter (ds,3,siteIndex<3*bpF2,,GeneticCodeExclusions);
+	DataSetFilter filter2 = CreateFilter (ds,3,siteIndex>=3*bpF2,,GeneticCodeExclusions);
+}
+else
+{
+	DataSetFilter filter1 = CreateFilter (ds,1,siteIndex<=bpF2);
+	DataSetFilter filter2 = CreateFilter (ds,1,siteIndex>bpF2);
+}
+
+SelectTemplateModel (filteredData);
+
+lrtFilePath = resFilePath + ".lrt";
+fprintf (lrtFilePath, CLEAR_FILE);
+
+fprintf (stdout, "\nFitting the null hypothesis (same tree, different models)\n");
+
+if (FREQUENCY_SENSITIVE)
+{
+	HarvestFrequencies (partFreqs1,filter1,1+2*USE_POSITION_SPECIFIC_FREQS,1,1);
+	HarvestFrequencies (partFreqs2,filter2,1+2*USE_POSITION_SPECIFIC_FREQS,1,1);
+
+	MULTIPLY_BY_FREQS = PopulateModelMatrix ("partMatrix1",partFreqs1);
+	MULTIPLY_BY_FREQS = PopulateModelMatrix ("partMatrix2",partFreqs2);
+	
+	if (dataType)
+	{
+		codonEFV1 = BuildCodonFrequencies (partFreqs1);
+		codonEFV2 = BuildCodonFrequencies (partFreqs2);
+		Model partModel1 = (partMatrix1,codonEFV1,MULTIPLY_BY_FREQS);	
+		Model partModel2 = (partMatrix2,codonEFV2,MULTIPLY_BY_FREQS);	
+	}
+	else
+	{
+		Model partModel1 = (partMatrix1,partFreqs1,MULTIPLY_BY_FREQS);	
+		Model partModel2 = (partMatrix2,partFreqs2,MULTIPLY_BY_FREQS);	
+	}	
+}
+else
+{
+	fprintf (stdout, "ERROR: Models which do not incorporate empirical base frequencies have not yet been included in this analysis\n\n");
+	return 0;
+}
+
+UseModel (partModel1);
+Tree	 part1TreeNull = baseTreeString;
+LikelihoodFunction lf_null_1 = (filter1, part1TreeNull);
+Optimize (res_null_1, lf_null_1);
+fprintf (stdout, "\nPart 1 fit:\n",lf_null_1);
+
+UseModel (partModel2);
+Tree	 part2TreeNull = baseTreeString;
+LikelihoodFunction lf_null_2 = (filter2, part2TreeNull);
+Optimize (res_null_2, lf_null_2);
+fprintf (stdout, "\n\nPart 2 fit:\n",lf_null_2);
+
+fprintf (stdout, "\n\nFitting the alternative hypothesis (different tree, different models)\n");
+
+UseModel (partModel1);
+Tree	 part1TreeAlt = bestTree1;
+LikelihoodFunction lf = (filter1, part1TreeAlt);
+Optimize (res_alt_1, lf);
+fprintf (stdout, "\nPart 1 fit:\n",lf);
+
+UseModel (partModel2);
+Tree	 part2TreeAlt = bestTree2;
+LikelihoodFunction lf = (filter2, part2TreeAlt);
+Optimize (res_alt_2, lf);
+fprintf (stdout, "\n\nPart 2 fit:\n",lf);
+
+obsLRT = 2(res_alt_1[1][0]+res_alt_2[1][0]-res_null_1[1][0]-res_null_2[1][0]);
+fprintf (stdout, "\n\nObserved LRT:", obsLRT, "\n\n"); 
+
+fprintf (stdout, "\nStarting the simulations...\n"
+				 "\nSimulation     LRT Running p-value\n");
+
+fprintf (lrtFilePath, "Simulation, LRT\n");
+fprintf (lrtFilePath, "Observed", obsLRT, "\n");
+
+SimLRTs = {itCount,5};
+
+SHORT_MPI_RETURN = 1;
+finishedIterates = 0;
+runningPValue	 = 0;
+
+LIKELIHOOD_FUNCTION_OUTPUT = 6;
+
+for (itCounter=0; itCounter<itCount; itCounter=itCounter+1)
+{
+	/* restore global variables of lf_null_1 */
+	for (k2 = 0; k2 < res_null_1[1][2]; k2 = k2+1)
+	{
+		SetParameter (lf_null_1,k2,res_null_1[0][k2]);
+	}
+	
+	/* simulate null data in partition 1 */
+	DataSet simmed1 = SimulateDataSet (lf_null_1); 
+	/*fprintf (stdout, "Simulation ", itCounter,"/1\n",lf_null_1);*/
+
+	/* restore global variables of lf_null_2 */
+	for (k2 = 0; k2 < res_null_2[1][2]; k2 = k2+1)
+	{
+		SetParameter (lf_null_2,k2,res_null_2[0][k2]);
+	}
+	/*fprintf (stdout, "Simulation ", itCounter,"/2\n",lf_null_2);*/
+	
+	/* simulate null data in partition 2 */
+	DataSet simmed2 = SimulateDataSet		(lf_null_2); 
+	
+	DataSetFilter filteredData = CreateFilter (simmed1,1);
+	InferTreeTopology (0);
+	simTree1 = TreeMatrix2TreeString(0);
+	
+	seqNameMap = {};
+	GetInformation (filterStrings, filteredData);
+	/* merge the alignments first, by appropriately mapping sequence names */
+	for (k2 = 0; k2 < filteredData.species; k2=k2+1)
+	{
+		GetString (seqName, filteredData, k2);
+		seqNameMap [seqName] = filterStrings[k2];
+	}
+
+	DataSetFilter filteredData = CreateFilter (simmed2,1);
+	InferTreeTopology (0);
+	simTree2 = TreeMatrix2TreeString(0);
+	
+	GetInformation (filterStrings, filteredData);
+	/* merge the alignments first, by appropriately mapping sequence names */
+	for (k2 = 0; k2 < filteredData.species; k2=k2+1)
+	{
+		GetString (seqName, filteredData, k2);
+		seqNameMap [seqName] = seqNameMap [seqName]+filterStrings[k2];
+	}
+	
+	assembledString = "";
+	assembledString * 8192;
+	
+	seqNames = Rows (seqNameMap);
+	
+	for (k2 = 0; k2 < Abs (seqNameMap); k2 = k2+1)
+	{
+		seqName = seqNames[k2];
+		assembledString * (">"+seqName+"\n");
+		assembledString * seqNameMap[seqName];
+		assembledString * "\n";
+	}
+	assembledString * 0;
+	DataSet jointD = ReadFromString (assembledString);
+	DataSetFilter filteredData = CreateFilter (jointD,1);
+	InferTreeTopology (0);
+	simTreeJ = TreeMatrix2TreeString(0);
+	
+	/* make a joint tree as well */
+
+	if (dataType)
+	{
+		DataSetFilter simFilter1 = CreateFilter (simmed1,3,"","",GeneticCodeExclusions);
+		DataSetFilter simFilter2 = CreateFilter (simmed2,3,"","",GeneticCodeExclusions);
+	}
+	else
+	{
+		DataSetFilter simFilter1 = CreateFilter (simmed1,1);
+		DataSetFilter simFilter2 = CreateFilter (simmed2,1);
+	}
+
+	if (FREQUENCY_SENSITIVE)
+	{
+		HarvestFrequencies (simFreqs1,simFilter1,1+2*USE_POSITION_SPECIFIC_FREQS,1,1);
+		HarvestFrequencies (simFreqs2,simFilter2,1+2*USE_POSITION_SPECIFIC_FREQS,1,1);
+
+		MULTIPLY_BY_FREQS = PopulateModelMatrix ("simMatrix1",simFreqs1);
+		MULTIPLY_BY_FREQS = PopulateModelMatrix ("simMatrix2",simFreqs2);
+		
+		if (dataType)
+		{
+			simCodonEFV1 = BuildCodonFrequencies (simFreqs1);
+			simCodonEFV2 = BuildCodonFrequencies (simFreqs2);
+			Model simModel1 = (simMatrix1,simCodonEFV1,MULTIPLY_BY_FREQS);	
+			Model simModel2 = (simMatrix2,simCodonEFV2,MULTIPLY_BY_FREQS);	
+		}
+		else
+		{
+			Model simModel1 = (simMatrix1,simFreqs1,MULTIPLY_BY_FREQS);	
+			Model simModel2 = (simMatrix2,simFreqs2,MULTIPLY_BY_FREQS);	
+		}	
+	}
+	RunASample_LRT (itCounter,0);
+	RunASample_LRT (itCounter,1);
+	RunASample_LRT (itCounter,2);
+	RunASample_LRT (itCounter,3);
+}
+
+CleanUpMPI_LRT (0);
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function RunASample_LRT (iterateIndex, lfKind)
+{	
+
+	if (lfKind == 0) /* null 1st part */
+	{
+		UseModel (simModel1);
+		Tree	 daTree = simTreeJ;
+		LikelihoodFunction lf = (simFilter1, daTree);
+	}
+	if (lfKind == 1) /* null 2nd part */
+	{
+		UseModel (simModel2);
+		Tree	 daTree = simTreeJ;
+		LikelihoodFunction lf = (simFilter2, daTree);
+	}	
+	if (lfKind == 2) /* alt 1st part */
+	{
+		UseModel (simModel1);
+		Tree	 daTree = simTree1;
+		LikelihoodFunction lf = (simFilter1, daTree);
+	}
+	if (lfKind == 3) /* alt 2nd part */
+	{
+		UseModel (simModel2);
+		Tree	 daTree = simTree2;
+		LikelihoodFunction lf = (simFilter2, daTree);
+	}
+	
+		
+	if ((MPI_NODE_COUNT>1) && (jobIndex>=0))
+	{
+		for (mpiNode = 0; mpiNode < MPI_NODE_COUNT-1; mpiNode = mpiNode+1)
+		{
+			if (MPINodeState[mpiNode][0]==0)
+			{
+				break;	
+			}
+		}
+		if (mpiNode==MPI_NODE_COUNT-1)
+		{
+			mpiNode = ReceiveJobs_LRT (1,iterateIndex,lfKind);
+		}
+		else
+		{
+			MPISend (mpiNode+1,lf);
+			MPINodeState[mpiNode][0] = 1;
+			MPINodeState[mpiNode][1] = iterateIndex;
+			MPINodeState[mpiNode][2] = lfKind;
+		}
+	}
+	else
+	{
+		Optimize (lf_MLES,lf);
+		/*fName = lrtFilePath + "." + iterateIndex + "." + lfKind;
+		fprintf (fName, CLEAR_FILE,lf);*/
+		mpiNode = ReceiveJobs_LRT (0,iterateIndex,lfKind);
+	}
+	return 0;	
+}
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function CleanUpMPI_LRT (dummy)
+{
+	if (MPI_NODE_COUNT>1)
+	{
+		while (1)
+		{
+			for (nodeCounter = 0; nodeCounter < MPI_NODE_COUNT-1; nodeCounter = nodeCounter+1)
+			{
+				if (MPINodeState[nodeCounter][0]==1)
+				{
+					fromNode = ReceiveJobs_LRT (0,0,0);
+					break;	
+				}
+			}
+			if (nodeCounter == MPI_NODE_COUNT-1)
+			{
+				break;
+			}
+		}			
+	}
+	return 0;
+}
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function ReceiveJobs_LRT (sendOrNot, ji, jobKind)
+{
+	if (MPI_NODE_COUNT>1)
+	{
+		MPIReceive (-1, fromNode, result_String);
+		mji = MPINodeState[fromNode-1][1];
+		mjk = MPINodeState[fromNode-1][2];
+		
+		if (sendOrNot)
+		{
+			MPISend (fromNode,lf);
+			/*fTemp = resFilePath + "." + ji + "." + jobKind;
+			fprintf (fTemp, CLEAR_FILE, MPI_LAST_SENT_MSG);*/
+			MPINodeState[fromNode-1][1] = ji;			
+			MPINodeState[fromNode-1][2] = jobKind;			
+		}
+		else
+		{
+			MPINodeState[fromNode-1][0] = 0;
+			MPINodeState[fromNode-1][1] = -1;		
+			MPINodeState[fromNode-1][2] = 0;		
+		}
+		
+		ExecuteCommands (result_String);
+		
+		ji = mji;
+		jobKind = mjk; 
+	}
+
+	SimLRTs[ji][jobKind] = lf_MLES[1][0];
+	
+	if (SimLRTs[ji][0]<0 && SimLRTs[ji][1]<0 && SimLRTs[ji][2]<0 && SimLRTs[ji][3]<0)
+	{
+		finishedIterates = finishedIterates + 1;
+		/* finished an iterate */	
+		SimLRTs[ji][4] = 2*(SimLRTs[ji][2]+SimLRTs[ji][3]-SimLRTs[ji][0]-SimLRTs[ji][1]);
+		if (SimLRTs[ji][4] > obsLRT)
+		{
+			runningPValue = runningPValue + 1;
+		}
+		fprintf (stdout, Format (finishedIterates,10,0), " ",
+						 Format (SimLRTs[ji][4], 7, 3), " ",
+						 Format (runningPValue/finishedIterates, 15, 6), "\n");
+						 
+		fprintf (lrtFilePath,  Format (finishedIterates,10,0), ",",Format (SimLRTs[ji][4], 7, 3),"\n");
+	}
+	
+	return fromNode-1;
+}
diff --git a/res/TemplateBatchFiles/SiteRates.bf b/res/TemplateBatchFiles/SiteRates.bf
new file mode 100644
index 0000000..a4e0542
--- /dev/null
+++ b/res/TemplateBatchFiles/SiteRates.bf
@@ -0,0 +1,226 @@
+/*------------------------------------------------------------------------*/
+
+function ReportSite (siteI, siteM)
+{
+	fullSites[siteI][0] = doneSites[siteM][0];
+	fullSites[siteI][1] = doneSites[siteM][1];
+
+
+	fprintf (stdout, "Site ", Format(siteI+1,4,0),
+					 " Rate = ", Format(fullSites[siteI][0],7,4),
+					 " Log(L) ", Format(fullSites[siteI][1],7,4),"\n");		
+					 
+	return 0;
+}
+
+/*------------------------------------------------------------------------*/
+
+function ReceiveJobs (sendOrNot)
+{
+	MPIReceive (-1, fromNode, result_String);
+	
+	siteIndex = MPINodeState[fromNode-1][1];
+	
+	if (sendOrNot)
+	{
+		MPISend (fromNode,siteLikelihood);
+		MPINodeState[fromNode-1][1] = siteCount;			
+	}
+	else
+	{
+		MPINodeState[fromNode-1][0] = 0;
+		MPINodeState[fromNode-1][1] = -1;		
+	}
+	
+	siteMap = dupInfo[siteIndex];
+	
+	ExecuteCommands (result_String);
+	
+	doneSites[siteMap][0] = siteRate;
+	doneSites[siteMap][1] = siteLikelihood_MLES[1][0];
+
+	ReportSite (siteIndex, siteMap);
+	
+	return fromNode-1;
+}
+
+/*------------------------------------------------------------------------*/
+
+SetDialogPrompt ("Please specify a nucleotide or amino-acid data file:");
+
+DataSet ds = ReadDataFile (PROMPT_FOR_FILE);
+DataSetFilter filteredData = CreateFilter (ds,1);
+
+fprintf (stdout,"\n______________READ THE FOLLOWING DATA______________\n",ds);
+
+categoriesUsed = 0;
+
+SelectTemplateModel(filteredData);
+
+if (categoriesUsed)
+{
+	fprintf (stdout,"\nPlease use only models without explicit rate variation components for this analysis\n");
+}
+else
+{
+	_DO_TREE_REBALANCE_ = 1;
+	#include "queryTree.bf";
+	LikelihoodFunction lf = (filteredData,givenTree);
+	Optimize (resNull,lf);
+	fprintf (stdout, "\n\nGlobal fit",lf);
+	
+	fprintf (stdout, "\n\nSite by site fits:\n\n");
+
+	global siteRate = 1;
+	siteRate:<100;
+	
+	doneSites    = {filteredData.unique_sites,2};
+	fullSites    = {filteredData.sites,2};
+	Tree		   siteTree = treeString;
+	
+	GetDataInfo    (dupInfo, filteredData);
+	alreadyDone	= {};
+	
+	ReplicateConstraint ("this1.?.?:=siteRate*this2.?.?__",siteTree,givenTree);
+	
+	ExecuteAFile (HYPHY_LIB_DIRECTORY+"TemplateBatchFiles" + DIRECTORY_SEPARATOR + "Utility" + DIRECTORY_SEPARATOR + "GrabBag.bf");
+	fixGlobalParameters  ("lf");
+		
+	labels = {{"Rate","Log[L]"}};
+	
+	if (MPI_NODE_COUNT<=1)
+	{
+		VERBOSITY_LEVEL = -1;
+		for (siteCount = 0; siteCount < filteredData.sites; siteCount = siteCount+1)
+		{
+			siteMap = dupInfo[siteCount];
+			if (alreadyDone[siteMap] == 0)
+			{
+				filterString = "" + siteCount;
+				DataSetFilter siteFilter = CreateFilter (ds,1,filterString);
+				LikelihoodFunction siteLikelihood = (siteFilter, siteTree);
+				siteRate = 1;
+				Optimize (site_res, siteLikelihood);
+				alreadyDone[siteMap]  = 1;
+				doneSites[siteMap][0] = siteRate;
+				doneSites[siteMap][1] = site_res[1][0];
+			}
+			dummy = ReportSite (siteCount, siteMap);				 
+		}	
+		VERBOSITY_LEVEL = 0;
+	}
+	else
+	{
+		MPINodeState = {MPI_NODE_COUNT-1,2};
+		for (siteCount = 0; siteCount < filteredData.sites; siteCount = siteCount+1)
+		{
+			siteMap = dupInfo[siteCount];
+			if (alreadyDone[siteMap] == 0)
+			{
+				filterString = "" + siteCount;
+				DataSetFilter siteFilter = CreateFilter (ds,1,filterString);
+				LikelihoodFunction siteLikelihood = (siteFilter, siteTree);				
+				alreadyDone[siteMap] = 1;				
+				siteRate = 1;
+				
+				for (mpiNode = 0; mpiNode < MPI_NODE_COUNT-1; mpiNode = mpiNode+1)
+				{
+					if (MPINodeState[mpiNode][0]==0)
+					{
+						break;	
+					}
+				}
+				
+				if (mpiNode==MPI_NODE_COUNT-1)
+				/* all nodes busy */
+				{
+					mpiNode = ReceiveJobs (1);
+				}
+				else
+				{
+					MPISend (mpiNode+1,siteLikelihood);
+					MPINodeState[mpiNode][0] = 1;
+					MPINodeState[mpiNode][1] = siteCount;
+				}
+			}
+		}					
+		while (1)
+		{
+			for (nodeCounter = 0; nodeCounter < MPI_NODE_COUNT-1; nodeCounter = nodeCounter+1)
+			{
+				if (MPINodeState[nodeCounter][0]==1)
+				{
+					fromNode = ReceiveJobs (0);
+					break;	
+				}
+			}
+			if (nodeCounter == MPI_NODE_COUNT-1)
+			{
+				break;
+			}
+		}					
+		fprintf (stdout, "\n\n");
+		for (siteCount = 0; siteCount < filteredData.sites; siteCount = siteCount+1)
+		{
+			siteMap = dupInfo[siteCount];
+			dummy = ReportSite (siteCount, siteMap);				 
+		}
+	}
+
+	nodeCounter = 0;
+	likelihoodBound = 0;
+
+	for (siteCount = 0; siteCount < filteredData.sites; siteCount = siteCount+1)
+	{
+		nodeCounter 		= nodeCounter     + fullSites[siteCount][0];
+		likelihoodBound		= likelihoodBound + fullSites[siteCount][1];
+	}
+
+	nodeCounter = nodeCounter/filteredData.sites; 
+
+	for (siteCount = 0; siteCount < filteredData.sites; siteCount = siteCount+1)
+	{
+		fullSites[siteCount][0] = fullSites[siteCount][0]/nodeCounter;
+	}
+
+	OpenWindow (CHARTWINDOW,{{"Data Rates"}
+							   {"labels"},
+							   {"fullSites"},
+							   {"Bar Chart"},
+							   {"Index"},
+							   {labels[0]},
+							   {"Site Index"},
+							   {""},
+							   {labels[0]},
+							   {"0"}},
+							   "SCREEN_WIDTH-60;SCREEN_HEIGHT-50;30;50");
+							   
+
+	fprintf (stdout, "\n\nLikelihood lower bound = ", resNull[1][0]," AIC=", 2*(resNull[1][1]-resNull[1][0]), "\n");
+	fprintf (stdout, "\n\nApproximate likelihood upper bound = ", likelihoodBound," AIC=", 2*(resNull[1][1]+filteredData.unique_sites-likelihoodBound), "\n");
+
+
+	SetDialogPrompt ("Save rate results to:");
+	siteCount = Columns (fullSites);
+	fprintf (PROMPT_FOR_FILE,CLEAR_FILE,labels[0]);
+	for (nodeCounter=1; nodeCounter<siteCount; nodeCounter=nodeCounter+1)
+	{
+		fprintf (LAST_FILE_PATH,",",labels[nodeCounter]);
+	}
+
+	for (nodeCounter=0; nodeCounter < Rows (fullSites); nodeCounter = nodeCounter+1)
+	{
+		fprintf (LAST_FILE_PATH,"\n",fullSites[nodeCounter][0]);
+		for (mpiNode=1; mpiNode<siteCount; mpiNode=mpiNode+1)
+		{
+			fprintf (LAST_FILE_PATH,",",fullSites[nodeCounter][mpiNode]);
+		}
+	}					
+
+	for (siteCount = 0; siteCount < resNull[1][2]; siteCount = siteCount+1)
+	{
+		GetString (globalVarName,lf,siteCount);
+		ExecuteCommands (globalVarName+"="+globalVarName+";");
+	}
+	
+}
diff --git a/res/TemplateBatchFiles/SiteRates2.bf b/res/TemplateBatchFiles/SiteRates2.bf
new file mode 100644
index 0000000..4530565
--- /dev/null
+++ b/res/TemplateBatchFiles/SiteRates2.bf
@@ -0,0 +1,273 @@
+/*------------------------------------------------------------------------*/
+
+function ReportSite (siteI, siteM)
+{
+	fullSites[siteI][0] = doneSites[siteM][0]*scalingFactor; 
+	fullSites[siteI][1] = doneSites[siteM][1];
+
+
+	fprintf (stdout, "Site ", Format(siteI+1,4,0),
+					 " Rate = ", Format(fullSites[siteI][0],7,4),
+					 " Log(L) ", Format(fullSites[siteI][1],7,4),"\n");		
+					 
+	return 0;
+}
+
+/*------------------------------------------------------------------------*/
+
+function ReceiveJobs (sendOrNot)
+{
+	MPIReceive (-1, fromNode, result_String);
+	
+	siteIndex = MPINodeState[fromNode-1][1];
+	
+	if (sendOrNot)
+	{
+		MPISend (fromNode,siteLikelihood);
+		MPINodeState[fromNode-1][1] = siteCount;			
+	}
+	else
+	{
+		MPINodeState[fromNode-1][0] = 0;
+		MPINodeState[fromNode-1][1] = -1;		
+	}
+	
+	siteMap = dupInfo[siteIndex];
+	
+	ExecuteCommands (result_String);
+	
+	doneSites[siteMap][0] = siteRate;
+	doneSites[siteMap][1] = siteLikelihood_MLES[1][0];
+
+	ReportSite (siteIndex, siteMap);
+	
+	return fromNode-1;
+}
+
+/*------------------------------------------------------------------------*/
+
+/*--------------------------------------------------------------------*/
+/* 
+	MAIN BODY 
+*/
+/*--------------------------------------------------------------------*/
+
+SetDialogPrompt ("Please specify a nucleotide or amino-acid data file:");
+
+DataSet ds = ReadDataFile (PROMPT_FOR_FILE);
+DataSetFilter filteredData = CreateFilter (ds,1);
+
+fprintf (stdout,"\n______________READ THE FOLLOWING DATA______________\n",ds);
+
+categoriesUsed = 0;
+
+SelectTemplateModel(filteredData); /*Prompts the user to select a template model */
+
+if (categoriesUsed)
+{
+	fprintf (stdout,"\nPlease use only models without explicit rate variation components for this analysis\n");
+}
+else
+{
+	_DO_TREE_REBALANCE_ = 1;
+	
+	#include "queryTree.bf"; 	/*Is this part doing something or just indicating use this class*/
+	
+	global rateX = 1;
+	ClearConstraints ( givenTree );
+	ReplicateConstraint ("this1.?.?:=rateX*this2.?.?__",givenTree,givenTree);
+
+	LikelihoodFunction lf = (filteredData,givenTree);
+	
+	Optimize (resNull,lf); 		/*resNull is the identifier of the matrix which receives the results*/
+	
+	fprintf (stdout, "\n\nGlobal fit",lf);
+	fprintf (stdout, "\n\nSite by site fits:\n\n");
+
+	global siteRate = 1;
+	/*siteRate:<100;*/ 				/*It is a arbitrary value?*/
+	
+	doneSites    = {filteredData.unique_sites,2}; /* Getting the different site patterns. Whats is the parameter 2?*/
+	fullSites    = {filteredData.sites,2};
+	Tree		   siteTree = treeString;
+	
+	GetDataInfo    (dupInfo, filteredData);
+	alreadyDone	= {};
+	
+	
+	/* SLKP: need to constrain global parameters here! */
+	
+	
+	ReplicateConstraint ("this1.?.?:=siteRate*this2.?.?__",siteTree,givenTree);
+	
+	
+	
+	UseModel(USE_NO_MODEL);
+	Tree 	 referenceTree = treeString;
+	
+	refL = BranchLength(referenceTree,-1);
+	estL = BranchLength(givenTree,-1);
+	
+	referenceLength = 0;
+	estimatedLength = 0;
+	
+	for (i=0; i< Columns(refL); i=i+1)
+	{
+	   referenceLength = referenceLength + refL[i];
+	   estimatedLength = estimatedLength + estL[i];
+	}
+		
+ 	scalingFactor = estimatedLength/referenceLength;
+ 	fprintf (stdout, "\nEstimated tree length (expected subs): ", estimatedLength,
+ 					 "\nReference tree length (units time): ", referenceLength,
+ 					 "\nScaling factor: ", scalingFactor, "\n");
+ 	
+	
+	ExecuteAFile (HYPHY_LIB_DIRECTORY+"TemplateBatchFiles" + DIRECTORY_SEPARATOR + "Utility" + DIRECTORY_SEPARATOR + "GrabBag.bf");
+	fixGlobalParameters  ("lf");
+	
+	labels = {{"Rate","Log[L]"}};
+	
+	if (MPI_NODE_COUNT<=1) /*MPI_NODE_COUNT numberof nodes in MPI which are available*/
+	{
+		VERBOSITY_LEVEL = -1;
+		for (siteCount = 0; siteCount < filteredData.sites; siteCount = siteCount+1)
+		{
+			siteMap = dupInfo[siteCount];
+			if (alreadyDone[siteMap] == 0)
+			{
+				filterString = "" + siteCount;
+				DataSetFilter siteFilter = CreateFilter (ds,1,filterString);
+				LikelihoodFunction siteLikelihood = (siteFilter, siteTree);
+				siteRate = 1;
+				Optimize (site_res, siteLikelihood);
+				alreadyDone[siteMap]  = 1;
+				siteLengths = BranchLength (siteTree,-1);
+				doneSites[siteMap][0] = siteRate;
+				doneSites[siteMap][1] = site_res[1][0];/*Loglikelihood*/
+			}
+			dummy = ReportSite (siteCount, siteMap);				 
+		}	
+		
+		
+		
+		VERBOSITY_LEVEL = 0;
+	}
+	else
+	{
+		MPINodeState = {MPI_NODE_COUNT-1,2};
+		for (siteCount = 0; siteCount < filteredData.sites; siteCount = siteCount+1)
+		{
+			siteMap = dupInfo[siteCount];
+			if (alreadyDone[siteMap] == 0)
+			{
+				filterString = "" + siteCount;
+				DataSetFilter siteFilter = CreateFilter (ds,1,filterString);
+				LikelihoodFunction siteLikelihood = (siteFilter, siteTree);				
+				alreadyDone[siteMap] = 1;				
+				siteRate = 1;
+				
+				for (mpiNode = 0; mpiNode < MPI_NODE_COUNT-1; mpiNode = mpiNode+1)
+				{
+					if (MPINodeState[mpiNode][0]==0)
+					{
+						break;	
+					}
+				}
+				
+				if (mpiNode==MPI_NODE_COUNT-1)
+				/* all nodes busy */
+				{
+					mpiNode = ReceiveJobs (1);
+				}
+				else
+				{
+					MPISend (mpiNode+1,siteLikelihood);
+					MPINodeState[mpiNode][0] = 1;
+					MPINodeState[mpiNode][1] = siteCount;
+				}
+			}
+		}					
+		while (1)
+		{
+			for (nodeCounter = 0; nodeCounter < MPI_NODE_COUNT-1; nodeCounter = nodeCounter+1)
+			{
+				if (MPINodeState[nodeCounter][0]==1)
+				{
+					fromNode = ReceiveJobs (0);
+					break;	
+				}
+			}
+			if (nodeCounter == MPI_NODE_COUNT-1)
+			{
+				break;
+			}
+		}					
+		fprintf (stdout, "\n\n");
+		for (siteCount = 0; siteCount < filteredData.sites; siteCount = siteCount+1)
+		{
+			siteMap = dupInfo[siteCount];
+			dummy = ReportSite (siteCount, siteMap);				 
+		}
+	}
+
+	nodeCounter = 0;
+	likelihoodBound = 0;
+
+	for (siteCount = 0; siteCount < filteredData.sites; siteCount = siteCount+1)
+	{
+		nodeCounter 		= nodeCounter     + fullSites[siteCount][0];
+		likelihoodBound		= likelihoodBound + fullSites[siteCount][1];
+	}
+
+	nodeCounter = nodeCounter/filteredData.sites; 
+
+	for (siteCount = 0; siteCount < filteredData.sites; siteCount = siteCount+1)
+	{
+		fullSites[siteCount][0] = fullSites[siteCount][0]/nodeCounter;
+	}
+
+/*Creates a windows with the output*/
+	OpenWindow (CHARTWINDOW,{{"Data Rates"}
+							   {"labels"},
+							   {"fullSites"},
+							   {"Bar Chart"},
+							   {"Index"},
+							   {labels[0]},
+							   {"Site Index"},
+							   {""},
+							   {labels[0]},
+							   {"0"}},
+							   "SCREEN_WIDTH-60;SCREEN_HEIGHT-50;30;50");
+							   
+
+	fprintf (stdout, "\n\nLikelihood lower bound = ", resNull[1][0]," AIC=", 2*(resNull[1][1]-resNull[1][0]), "\n");
+	fprintf (stdout, "\n\nApproximate likelihood upper bound = ", likelihoodBound," AIC=", 2*(resNull[1][1]+filteredData.unique_sites-likelihoodBound), "\n");
+
+/*Printing the results*/
+	SetDialogPrompt ("Save rate results to:");
+	siteCount = Columns (fullSites);
+	fprintf (PROMPT_FOR_FILE,CLEAR_FILE,labels[0]);
+	for (nodeCounter=1; nodeCounter<siteCount; nodeCounter=nodeCounter+1)
+	{
+		fprintf (LAST_FILE_PATH,",",labels[nodeCounter]);
+	}
+
+	for (nodeCounter=0; nodeCounter < Rows (fullSites); nodeCounter = nodeCounter+1)
+	{
+		fprintf (LAST_FILE_PATH,"\n",fullSites[nodeCounter][0]);
+		for (mpiNode=1; mpiNode<siteCount; mpiNode=mpiNode+1)
+		{
+			fprintf (LAST_FILE_PATH,",",fullSites[nodeCounter][mpiNode]);
+		}
+	}					
+
+	
+	for (siteCount = 0; siteCount < resNull[1][2]; siteCount = siteCount+1)
+	{
+		GetString (globalVarName,lf,siteCount);
+		ExecuteCommands (globalVarName+"="+globalVarName+";");
+	}
+	
+		
+}
diff --git a/res/TemplateBatchFiles/SlatkinMaddison-2parts.bf b/res/TemplateBatchFiles/SlatkinMaddison-2parts.bf
new file mode 100644
index 0000000..6b8e9f7
--- /dev/null
+++ b/res/TemplateBatchFiles/SlatkinMaddison-2parts.bf
@@ -0,0 +1,395 @@
+/*--------------------------------------------------- */
+
+function factorial (x)
+{
+	res = 1;
+	for (x2 = 2; x2 <= x; x2=x2+1)
+	{
+		res = res * x2;
+	}
+	return res;
+}
+
+/*--------------------------------------------------- */
+
+function computeMigrationEvents (assignmentVector)
+{
+
+	assignmentMatrices = {};
+	nodeState 		   = {};
+
+	for (specIndex = 0; specIndex < leafCount; specIndex = specIndex + 1)
+	{
+		if (assignmentVector[specIndex])
+		{
+			aMx = {{1,1}{1,0}};
+		}
+		else
+		{
+			aMx = {{0,0}{0,1}};	
+		}
+		specName = TipName (givenTree, specIndex);
+		assignmentMatrices [specName] = aMx;
+	}
+
+	for (node = 1; node < treeSize; node = node + 1)
+	{
+		nodeInfo 		= treeAVL[node];
+		nodeChildren	= nodeInfo ["Children"];
+		cCount			= Abs(nodeChildren);
+		
+		if (cCount)
+		{
+			localMatrices = {};
+			
+			nodeName = nodeInfo["Name"];
+			
+			/*fprintf (stdout, "\n at ----------\nNode ", nodeName, "\n");*/
+			for (s1 = 0; s1<cCount; s1=s1+1)
+			{
+				childIndex = nodeChildren[s1];
+				childIndex = treeAVL	 [childIndex];
+				childName  = childIndex  ["Name"];
+				localMatrices[s1] = assignmentMatrices[childName];
+				/*fprintf (stdout, "\nChild ", childName, localMatrices[s1], "\n");*/
+			}
+			
+			twoWay = {2,1};
+			for (s2 = 0; s2 < 2; s2 = s2+1)
+			{
+				lc = 0;
+				for (s3 = 0; s3<cCount; s3=s3+1)
+				{
+					aMx = localMatrices[s3];
+					lc = lc + aMx[1][s2];
+				}
+				twoWay[s2] = lc;
+			}
+			
+			/*fprintf (stdout, ">> TWO-WAY ", twoWay, "\n");*/
+
+			if (nodeInfo["Parent"])
+			{
+				aMx = {2,2};
+				if (twoWay[1]+1<twoWay[0])
+				{
+					aMx[0][0]=1;
+					aMx[1][0]=twoWay[1]+1;
+				}
+				else
+				{
+					aMx[0][0]=0;
+					aMx[1][0]=twoWay[0];		
+				}
+				
+				if (twoWay[0]+1<twoWay[1])
+				{
+					aMx[0][1]=0;
+					aMx[1][1]=twoWay[0]+1;
+				}
+				else
+				{
+					aMx[0][1]=1;
+					aMx[1][1]=twoWay[1];		
+				}
+				
+				/*fprintf (stdout, "NODE MATRIX", aMx, "\n");*/
+				assignmentMatrices [nodeName] = aMx;
+			}
+			else
+			{
+				totalCost = Min(twoWay[0], twoWay[1]);
+				nodeState [nodeName] = (twoWay[1]<twoWay[0]);
+			}
+		}
+	}
+	return totalCost;
+}
+
+/*--------------------------------------------------- */
+
+function spoolBranchClass (classTag, classAVL)
+{
+	k2 = Abs(classAVL);
+	if (k2)
+	{
+		classSpool = "";
+		classSpool * 256;
+		classSpool * ("_branchClasses[\"" + classTag + "\"]={{");
+		classSpool * ("\""+classAVL[0]+"\"");
+		for (k=1; k<k2;k=k+1)
+		{
+			classSpool * (",\""+classAVL[k]+"\"");
+		}
+		classSpool * ("}};\n");
+		classSpool * 0;
+		fprintf (LAST_FILE_PATH, classSpool);
+	}
+	return k2;
+}
+/*--------------------------------------------------- */
+
+
+SetDialogPrompt ("Load a Newick tree file");
+ACCEPT_ROOTED_TREES = 1;
+fscanf (PROMPT_FOR_FILE,"Tree",givenTree);
+ACCEPT_ROOTED_TREES = 0;
+leafCount = TipCount (givenTree);
+
+fprintf (stdout, "Read tree: ", Format (givenTree,0,0),"\n");
+goOn = 1;
+
+while (goOn)
+{
+	leafAllocs = {1,leafCount};
+
+	fprintf (stdout,"\nEnter a reg exp to separate the sequences into two clades:");
+	fscanf  (stdin,"String",theRegExp);
+
+	cladeA = {};
+	cladeB = {};
+
+	st1 = "";
+	st2 = "";
+
+
+	for (specIndex = 0; specIndex < leafCount; specIndex = specIndex + 1)
+	{
+		specName = TipName (givenTree, specIndex);
+		specMatch = specName $ theRegExp;
+		
+		if (specMatch[0]>=0)
+		{
+			cladeA [specName] = 1;
+			if (Abs(st1))
+			{
+				st1 = st1 + "," + specName;
+			}
+			else
+			{
+				st1 = specName;
+			}
+			
+		}
+		else
+		{
+			leafAllocs[specIndex] = 1;
+			cladeB [specName] = 1;
+			
+			if (Abs(st2))
+			{
+				st2 = st2 + "," + specName;
+			}
+			else
+			{
+				st2 = specName;
+			}
+		}
+	}
+	
+	clASize = Abs (cladeA);
+	clBSize = Abs (cladeB);
+	
+	if (clASize == 0 || clBSize == 0 || clASize + clBSize < ds.species)
+	{
+		fprintf (stdout, "\nERROR: invalid sequence partitionings - one of the clades is empty or there were duplicate sequence names\n");
+		return 0;
+	}
+
+	fprintf (stdout, "\nSet 1 (TYPE 1) includes ", clASize," sequences:\n");
+	cladeKeys = Rows (cladeA);
+	for (specIndex = 0; specIndex < clASize; specIndex = specIndex + 1)
+	{
+		fprintf (stdout, "\t", cladeKeys[specIndex],"\n");
+	}
+
+	fprintf (stdout, "\nSet 2 (TYPE 2) includes ", clBSize," sequences:\n");
+	cladeKeys = Rows (cladeB);
+	for (specIndex = 0; specIndex < clBSize; specIndex = specIndex + 1)
+	{
+		fprintf (stdout, "\t", cladeKeys[specIndex],"\n");
+	}
+	
+	fprintf (stdout, "\nIs this partitioning correct (y/n)");
+	fscanf (stdin, "String", goOn);
+	goOn = (goOn[0] == "n" || goOn[0] == "N");
+}
+f_1 = clASize/leafCount;
+f_2 = clBSize/leafCount;
+
+fprintf (stdout, "Please enter a descriptive name for TYPE 1 sequences:");
+fscanf	(stdin, "String", class1Name);
+
+fprintf (stdout, "Please enter a descriptive name for TYPE 2 sequences:");
+fscanf	(stdin, "String", class2Name);
+
+fprintf (stdout, "\nProportion of ",class1Name," sequences: ", f_1,
+				 "\nProportion of ",class2Name," sequences: ", f_2,"\n");
+
+
+
+
+treeAVL 	= givenTree^0;
+treeAVL2 	= givenTree^1;
+treeSize    = Abs (treeAVL);
+
+observedEvents = computeMigrationEvents (leafAllocs);
+
+fprintf (stdout, "\nInferred ", observedEvents, " migration events\n");
+
+transitionNodes12 = {};
+transitionNodes21 = {};
+type1Nodes		  = {};
+type2Nodes		  = {};
+
+for (node = 2; node < treeSize; node = node + 1)
+{
+	nodeInfo 		= treeAVL2[node];
+	nodeChildren	= nodeInfo ["Children"];
+	parentNode = nodeInfo["Parent"];
+	parentNode = treeAVL2[parentNode];
+	parentNode = parentNode["Name"];
+	parentNode = nodeState[parentNode];
+	nodeName   = nodeInfo["Name"];
+	myState    = assignmentMatrices[nodeName];
+	myState    = myState[0][parentNode];
+	if (parentNode != myState)
+	{
+		if (parentNode == 0)
+		{
+			transitionNodes12[Abs(transitionNodes12)] = nodeName;
+		}
+		else
+		{
+			transitionNodes21[Abs(transitionNodes21)] = nodeName;		
+		}
+	}
+	else
+	{
+		if (parentNode == 0)
+		{
+			type1Nodes[Abs(type1Nodes)] = nodeName;
+		}
+		else
+		{
+			type2Nodes[Abs(type2Nodes)] = nodeName;		
+		}
+	}
+	nodeState [nodeName] = myState;
+}
+
+if (Abs(transitionNodes12)+Abs(transitionNodes21))
+{
+	fprintf (stdout, "\nThe following branches have migration events:\n\n");
+	if (Abs(transitionNodes12))
+	{
+		fprintf (stdout, "\n",class1Name," --> ",class2Name,"\n");
+		for (node = 0; node < Abs(transitionNodes12); node = node + 1)
+		{
+			fprintf (stdout, transitionNodes12[node], "\n");
+		}
+	}
+	
+	if (Abs(transitionNodes21))
+	{
+		fprintf (stdout, "\n",class2Name," --> ",class1Name,"\n");
+		for (node = 0; node < Abs(transitionNodes21); node = node + 1)
+		{
+			fprintf (stdout, transitionNodes21[node], "\n");
+		}
+	}
+}
+
+SetDialogPrompt ("Write a tree with branch partitions to:");
+fprintf (PROMPT_FOR_FILE,CLEAR_FILE,"Tree theTree=", Format (givenTree,1,0),";\n_branchClasses={};\n");
+
+spoolBranchClass(class1Name,type1Nodes);
+spoolBranchClass(class2Name,type2Nodes);
+spoolBranchClass(class1Name+"->"+class2Name,transitionNodes12);
+spoolBranchClass(class2Name+"->"+class1Name,transitionNodes21);
+
+
+ChoiceList (resample,"Permutation Test",1,SKIP_NONE,
+					 "Skip","Do not perform a permutation test.",
+				     "Most certainly","Randomly allocate sequences into classes and tabulate the distribution of migration events.");
+				 
+
+if (resample < 1)
+{
+	return 0;
+}
+
+sampleCount = 0;
+totalPossible = factorial(leafCount)/factorial(clASize)/factorial (clBSize);
+while (sampleCount < 1)
+{
+	fprintf (stdout, "\nHow many permutations would you like to perform (total of ", totalPossible, " unique permutations available)?");
+	fscanf (stdin,"Number",sampleCount);
+}
+
+histogram = {};
+
+step = sampleCount$20;
+for (sampleID = 0; sampleID < sampleCount; sampleID = sampleID + 1)
+{
+	aSample = Random(leafAllocs,0);
+	k = computeMigrationEvents(aSample);
+	histogram[k] = histogram[k] + 1;
+
+	if ((sampleID+1)%step == 0)
+	{
+		fprintf (stdout, Format ((sampleID+1)*100/sampleCount, 6, 2), "% done\n");
+	}
+}
+
+k2 = Abs (histogram);
+countMatrix = {k2,3};
+s1 = Rows (histogram);
+for (sampleID = 0; sampleID < k2; sampleID = sampleID+1)
+{
+	s2 = 0+s1[sampleID];
+	countMatrix[sampleID][0] = s2;
+	countMatrix[sampleID][1] = histogram[s2];
+}
+
+countMatrix = countMatrix % 0;
+pVal = 0;
+
+for (sampleID = 0; sampleID < k2; sampleID = sampleID+1)
+{
+	if (countMatrix[sampleID][0] <= observedEvents)
+	{
+		pVal = pVal+countMatrix[sampleID][1];
+	}
+	if (sampleID)
+	{
+		countMatrix[sampleID][2] = countMatrix[sampleID][1]/sampleCount + countMatrix[sampleID-1][2];
+	}
+	else
+	{
+		countMatrix[sampleID][2] = countMatrix[sampleID][1]/sampleCount;	
+	}
+}
+
+fprintf (stdout, "\n\nProb{as many or fewer migration events by chance} = ", pVal/sampleCount,"\n\n");
+
+labels = {{"Events","Count","Cumulative Weight"}};
+
+OpenWindow (CHARTWINDOW,{{"Simulated distribution of migration events"}
+		{"labels"}
+		{"countMatrix"}
+		{"Bar Chart"}
+		{"Events"}
+		{"Count"}
+		{"Number of Events"}
+		{""}
+		{"Counts"}
+		{""}
+		{""}
+		{"-1;-1"}
+		{"10;1.309;0.785398"}
+		{"Times:14:0;Times:12:0;Times:14:1"}
+		{"16777215;16777215;16512;11776947;0;16777215;16711680;11842740;13158600;14474460;0;3947580;79;16744448;16777215;2984993;9199669;7018159;1460610;16748822;11184810;14173291;14173291"}
+		{"16"}
+		},
+		"SCREEN_WIDTH-100;SCREEN_HEIGHT-100;50;50");
diff --git a/res/TemplateBatchFiles/SlatkinMaddison.bf b/res/TemplateBatchFiles/SlatkinMaddison.bf
new file mode 100644
index 0000000..95351c2
--- /dev/null
+++ b/res/TemplateBatchFiles/SlatkinMaddison.bf
@@ -0,0 +1,463 @@
+/*--------------------------------------------------- */
+
+function factorial (x)
+{
+	res = 1;
+	for (x2 = 2; x2 <= x; x2=x2+1)
+	{
+		res = res * x2;
+	}
+	return res;
+}
+
+/*--------------------------------------------------- */
+
+function computeMigrationEvents (assignmentVector)
+{
+
+	assignmentMatrices = {};
+	nodeState 		   = {};
+
+	for (specIndex = 0; specIndex < leafCount; specIndex = specIndex + 1)
+	{
+		aMx = {2,kindCount};
+		s2  = assignmentVector[specIndex];
+		for (k=0; k<kindCount; k=k+1)
+		{
+			aMx[0][k] = s2;
+			aMx[1][k] = 1-(k==s2);	
+		}
+
+		specName = TipName (givenTree, specIndex);
+		assignmentMatrices [specName] = aMx;
+	}
+
+	for (node = 1; node < treeSize; node = node + 1)
+	{
+		nodeInfo 		= treeAVL[node];
+		nodeChildren	= nodeInfo ["Children"];
+		cCount			= Abs(nodeChildren);
+		
+		if (cCount)
+		{
+			localMatrices = {};
+			
+			nodeName = nodeInfo["Name"];
+			
+			/*
+			fprintf (stdout, "\n at ----------\nNode ", nodeName, "\n");
+			*/
+			
+			for (s1 = 0; s1<cCount; s1=s1+1)
+			{
+				childIndex = nodeChildren[s1];
+				childIndex = treeAVL	 [childIndex];
+				childName  = childIndex  ["Name"];
+				localMatrices[s1] = assignmentMatrices[childName];
+				/*
+				fprintf (stdout, "\nChild ", childName, localMatrices[s1], "\n");
+				*/
+			}
+			
+			twoWay = {kindCount,1};
+			
+			for (s2 = 0; s2 < kindCount; s2 = s2+1)
+			{
+				lc = 0;
+				for (s3 = 0; s3<cCount; s3=s3+1)
+				{
+					aMx = localMatrices[s3];
+					lc  = lc + aMx[1][s2];
+				}
+				twoWay[s2] = lc;
+			}
+			
+			/*
+			fprintf (stdout, ">> TWO-WAY ", twoWay, "\n");
+			*/
+			
+			if (nodeInfo["Parent"])
+			{
+				aMx = {2,kindCount};
+				
+				for (s2 = 0; s2 < kindCount; s2 = s2+1)
+				{
+					minV = 1e100;
+					minI = 0;
+					
+					for (s3 = 0; s3 < kindCount; s3 = s3+1)
+					{
+						aCost = (s3!=s2) + twoWay[s3];
+						if (minV > aCost)
+						{
+							minV  = aCost;
+							minI  = s3;
+						}	
+					}
+					
+					aMx[0][s2] = minI;
+					aMx[1][s2] = minV;
+				}
+				
+				/*
+				fprintf (stdout, "NODE MATRIX", aMx, "\n");
+				*/
+				assignmentMatrices [nodeName] = aMx;
+			}
+			else
+			{
+				totalCost = 1e100;
+				nodeState [nodeName] = 0;
+				
+				
+				for (s2 = 0; s2 < kindCount; s2 = s2+1)
+				{
+					if (twoWay[s2] < totalCost)
+					{
+						totalCost = twoWay[s2];
+						nodeState [nodeName] = s2;
+					}	
+				}
+			}
+		}
+	}
+	return totalCost;
+}
+
+/*--------------------------------------------------- */
+
+function spoolBranchClass (classTag, classAVL, doPrint)
+{
+	k2 = Abs(classAVL);
+	if (k2)
+	{
+		classSpool = "";
+		classSpool * 256;
+		classSpool * ("_branchClasses[\"" + classTag + "\"]={{");
+		classSpool * ("\""+classAVL[0]+"\"");
+		if (doPrint)
+		{
+			fprintf (stdout, classAVL[0], "\n");
+		}
+		for (k=1; k<k2;k=k+1)
+		{
+			classSpool * (",\""+classAVL[k]+"\"");
+			if (doPrint)
+			{
+				fprintf (stdout, classAVL[k], "\n");
+			}
+		}
+		classSpool * ("}};\n");
+		classSpool * 0;
+		fprintf (LAST_FILE_PATH, classSpool);
+	}
+	return k2;
+}
+/*--------------------------------------------------- */
+
+
+SetDialogPrompt ("Load a Newick tree file");
+ACCEPT_ROOTED_TREES = 1;
+fscanf (PROMPT_FOR_FILE,"Tree",givenTree);
+ACCEPT_ROOTED_TREES = 0;
+leafCount = TipCount (givenTree);
+
+fprintf (stdout, "Read tree: ", Format (givenTree,0,0),"\n");
+goOn = 1;
+
+kindCount = 0;
+while (kindCount < 2)
+{
+	fprintf (stdout, "How many sequence types: (>=2):");
+	fscanf  (stdin, "Number", kindCount);
+	kindCount = kindCount $ 1;
+}
+
+goOn  = 1;
+
+
+while (goOn)
+{
+	defClades 	 = 0;
+	clades  	 = {};
+	strings 	 = {};
+	matchedSoFar = {leafCount,1};
+	leafAllocs 	 = {1,leafCount};
+
+	while (defClades < kindCount)
+	{
+
+		st     = "";
+		aClade = {};
+		
+		if (defClades < kindCount-1)
+		{
+			fprintf (stdout,"\nEnter a reg exp used to define clade ",defClades+1,":");
+			fscanf  (stdin,"String",theRegExp);
+
+			for (specIndex = 0; specIndex < leafCount; specIndex = specIndex + 1)
+			{
+				specName = TipName (givenTree, specIndex);
+				specMatch = specName $ theRegExp;
+				
+				if (specMatch[0]>=0 && matchedSoFar[specIndex] == 0)
+				{
+					aClade [specName] = 1;
+					if (Abs(st))
+					{
+						st = st + "," + specName;
+					}
+					else
+					{
+						st = specName;
+					}
+					
+					matchedSoFar [specIndex] = 1;
+					leafAllocs   [specIndex] = defClades;
+				}
+			}
+		}
+		else
+		{
+			for (specIndex = 0; specIndex < leafCount; specIndex = specIndex + 1)
+			{
+				if (matchedSoFar[specIndex] == 0)
+				{
+					specName = TipName (givenTree, specIndex);
+					aClade [specName] = 1;
+					if (Abs(st))
+					{
+						st = st + "," + specName;
+					}
+					else
+					{
+						st = specName;
+					}
+					matchedSoFar [specIndex] = 1;
+					leafAllocs   [specIndex] = kindCount-1;
+				}
+			}		
+		}
+		
+		if (Abs(aClade) == 0)
+		{
+			fprintf (stdout, "ERROR: an empty clade for reg-exp ", goOn, "\n");
+			defClades = kindCount;
+			break;
+		}
+		else
+		{
+			fprintf (stdout, "Matched: ",st,"\n");	
+		}
+		strings[Abs(strings)] = st;
+		clades [Abs(clades) ] = aClade;
+		defClades = defClades + 1;
+	}
+
+	if (Abs(clades) == kindCount)
+	{
+		for (k=0; k<kindCount; k=k+1)
+		{
+			aClade = clades[k];
+			clASize = Abs(aClade);
+			fprintf (stdout, "\nSet ",k+1," (TYPE ",k+1,") includes ", clASize," sequences:\n");
+			cladeKeys = Rows (aClade);
+			for (specIndex = 0; specIndex < clASize; specIndex = specIndex + 1)
+			{
+				fprintf (stdout, "\t", cladeKeys[specIndex],"\n");
+			}
+		}
+		
+		fprintf (stdout, "\nIs this partitioning correct (y/n)");
+		fscanf (stdin, "String", goOn);
+		goOn = (goOn[0] == "n" || goOn[0] == "N");
+	}
+	else
+	{
+		goOn = 1;
+	}
+}
+
+descriptives = {};
+for (k=0; k<kindCount; k=k+1)
+{
+	fprintf (stdout, "Please enter a descriptive name for TYPE ",k+1," sequences:");
+	fscanf	(stdin, "String", className);
+	descriptives [k] = className;
+
+	fprintf (stdout, "\nProportion of ",className," sequences: ", Abs(clades[k])/leafCount, "\n");
+}
+
+treeAVL 	= givenTree^0;
+treeAVL2 	= givenTree^1;
+treeSize    = Abs (treeAVL);
+
+observedEvents = computeMigrationEvents (leafAllocs);
+
+fprintf (stdout, "\nInferred ", observedEvents, " migration events\n");
+
+SetDialogPrompt ("Write a tree with branch partitions to:");
+fprintf (PROMPT_FOR_FILE,CLEAR_FILE,"Tree theTree=", Format (givenTree,1,0),";\n_branchClasses={};\n");
+
+transitions = {};
+sameState   = {};
+
+for (node = 2; node < treeSize; node = node + 1)
+{
+	nodeInfo 		= treeAVL2[node];
+	nodeChildren	= nodeInfo ["Children"];
+	parentNode 		= nodeInfo["Parent"];
+	parentNode 		= treeAVL2[parentNode];
+	parentNode 		= parentNode["Name"];
+	parentNode 		= nodeState[parentNode];
+	nodeName   		= nodeInfo["Name"];
+	myState    		= assignmentMatrices[nodeName];
+	myState    		= myState[0][parentNode];
+	
+	if (parentNode != myState)
+	{
+		aKey = descriptives[parentNode] + " --> " + descriptives[myState];
+		aList = transitions[aKey];
+		if (Abs(aList) == 0)
+		{
+			aList = {};
+		}
+		aList[Abs(aList)] = nodeName;
+		transitions[aKey] = aList;
+	}
+	else
+	{
+		aKey = descriptives[parentNode];
+		aList = sameState[aKey];
+		if (Abs(aList) == 0)
+		{
+			aList = {};
+		}
+		aList[Abs(aList)] = nodeName;
+		sameState[aKey] = aList;
+	}
+	nodeState [nodeName] = myState;
+}
+
+returnAVL = {"MIGRATIONS": Abs(transitions)};
+
+if (Abs(transitions))
+{
+	fprintf (stdout, "\nThe following branches have migration events:\n\n");
+	
+	keys = Rows (transitions);
+	
+	for (cc = 0; cc < Columns (keys); cc = cc + 1)
+	{
+		aKey = keys[cc];
+		fprintf (stdout, "\n", aKey, ":\n");
+		aList = transitions[aKey];
+		spoolBranchClass(aKey,aList,1);
+	}
+}
+
+if (Abs(sameState))
+{
+	keys = Rows (sameState);
+	
+	for (cc = 0; cc < Columns (keys); cc = cc + 1)
+	{
+		aKey = keys[cc];
+		aList = sameState[aKey];
+		spoolBranchClass(aKey,aList,0);
+	}
+}
+
+
+ChoiceList (resample,"Permutation Test",1,SKIP_NONE,
+					 "Skip","Do not perform a permutation test.",
+				     "Most certainly","Randomly allocate sequences into classes and tabulate the distribution of migration events.");
+				 
+
+if (resample)
+{
+	sampleCount = 0;
+	totalPossible = factorial(leafCount);
+	
+	for (k=0; k<kindCount; k=k+1)
+	{
+		totalPossible = totalPossible/factorial(Abs(clades[k]));
+	}
+	
+	while (sampleCount < 1)
+	{
+		fprintf (stdout, "\nHow many permutations would you like to perform (total of ", totalPossible, " unique permutations available)?");
+		fscanf (stdin,"Number",sampleCount);
+	}
+	
+	histogram = {};
+	
+	step = sampleCount$20;
+	for (sampleID = 0; sampleID < sampleCount; sampleID = sampleID + 1)
+	{
+		aSample = Random(leafAllocs,0);
+		k = computeMigrationEvents(aSample);
+		histogram[k] = histogram[k] + 1;
+	
+		if ((sampleID+1)%step == 0)
+		{
+			fprintf (stdout, Format ((sampleID+1)*100/sampleCount, 6, 2), "% done\n");
+		}
+	}
+	
+	k2 = Abs (histogram);
+	countMatrix = {k2,3};
+	s1 = Rows (histogram);
+	for (sampleID = 0; sampleID < k2; sampleID = sampleID+1)
+	{
+		s2 = 0+s1[sampleID];
+		countMatrix[sampleID][0] = s2;
+		countMatrix[sampleID][1] = histogram[s2];
+	}
+	
+	countMatrix = countMatrix % 0;
+	pVal = 0;
+	
+	for (sampleID = 0; sampleID < k2; sampleID = sampleID+1)
+	{
+		if (countMatrix[sampleID][0] <= observedEvents)
+		{
+			pVal = pVal+countMatrix[sampleID][1];
+		}
+		if (sampleID)
+		{
+			countMatrix[sampleID][2] = countMatrix[sampleID][1]/sampleCount + countMatrix[sampleID-1][2];
+		}
+		else
+		{
+			countMatrix[sampleID][2] = countMatrix[sampleID][1]/sampleCount;	
+		}
+	}
+	
+	fprintf (stdout, "\n\nProb{as many or fewer migration events by chance} = ", pVal/sampleCount,"\n\n");
+	
+	labels = {{"Events","Count","Cumulative Weight"}};
+	
+	OpenWindow (CHARTWINDOW,{{"Simulated distribution of migration events"}
+			{"labels"}
+			{"countMatrix"}
+			{"Bar Chart"}
+			{"Events"}
+			{"Count"}
+			{"Number of Events"}
+			{""}
+			{"Counts"}
+			{""}
+			{""}
+			{"-1;-1"}
+			{"10;1.309;0.785398"}
+			{"Times:14:0;Times:12:0;Times:14:1"}
+			{"16777215;16777215;16512;11776947;0;16777215;16711680;11842740;13158600;14474460;0;3947580;79;16744448;16777215;2984993;9199669;7018159;1460610;16748822;11184810;14173291;14173291"}
+			{"16"}
+			},
+			"SCREEN_WIDTH-100;SCREEN_HEIGHT-100;50;50");
+			
+	returnAVL["p"] = pVal/sampleCount;
+}
+
+return returnAVL;
\ No newline at end of file
diff --git a/res/TemplateBatchFiles/SlidingNucWindow.bf b/res/TemplateBatchFiles/SlidingNucWindow.bf
new file mode 100644
index 0000000..88c35f4
--- /dev/null
+++ b/res/TemplateBatchFiles/SlidingNucWindow.bf
@@ -0,0 +1,104 @@
+SetDialogPrompt ("Please choose a nucleotide or amino-acid data file:");
+DataSet 	    ds 			 = ReadDataFile (PROMPT_FOR_FILE);
+DataSetFilter   filteredData = CreateFilter (ds,1);
+DataSetFilter   allData		 = CreateFilter (ds,1);
+
+ChoiceList	  (refSequence,"Reference Sequence", 1, SKIP_NONE, filteredData);
+
+if (refSequence < 0)
+{
+	return 0;
+}
+
+windowSize = -1;
+while (windowSize < 1 || windowSize > filteredData.sites)
+{
+	fprintf (stdout, "Sliding Window Size [1-", filteredData.sites, "]:");
+	fscanf (stdin,"Number", windowSize);
+	windowSize = windowSize $ 1;
+}
+
+if (windowSize<filteredData.sites)
+{
+	windowStride = -1;
+	while (windowStride < 1 || windowStride > filteredData.sites-windowSize)
+	{
+		fprintf (stdout, "Sliding Window Stride [1-", filteredData.sites-windowSize, "]:");
+		fscanf (stdin,"Number", windowStride);
+		windowStride = windowStride $ 1;
+	}
+}
+else
+{
+	windowStride = 1;
+}
+
+DISTANCE_PROMPTS = 1;
+#include "chooseDistanceFormula.def";
+dummy = InitializeDistances (0);
+
+totalWindows   = ((filteredData.sites-windowSize)/windowStride+0.5)$1+1;
+distanceMatrix = {totalWindows,allData.species};
+labelMatrix	   = {1,allData.species};
+labelMatrix[0] = "Midpoint";
+
+doneSkip = 0;
+
+for (si = 0; si < allData.species ; si = si+1)
+{
+	if (si == refSequence)
+	{
+		doneSkip = 1;
+	}
+	else
+	{
+		GetString (seqName, allData, si);
+		labelMatrix[si+1-doneSkip] = seqName;
+	}
+}
+
+currentStart = 0;
+
+for (wc = 0; wc < totalWindows; wc = wc+1)
+{
+	currentEnd	 = currentStart + windowSize - 1;
+	fprintf (stdout, currentStart, "-", currentEnd, "\n");
+	distanceMatrix[wc][0] = ((currentEnd+currentStart)*0.5+0.5)$1;
+	DataSetFilter filteredData = CreateFilter (ds, 1, siteIndex >= currentStart && siteIndex < currentEnd);
+	doneSkip = 0;
+	for (si = 0; si < allData.species ; si = si+1)
+	{
+		if (si == refSequence)
+		{
+			doneSkip = 1;
+		}
+		else
+		{
+			k = ComputeDistanceFormula (si,refSequence);
+			distanceMatrix [wc][1+si-doneSkip] = k;
+		}
+	}
+	currentStart = currentStart + windowStride;
+}
+
+OpenWindow (CHARTWINDOW,{{"Sliding Window Distance"}
+		{"labelMatrix"}
+		{"distanceMatrix"}
+		{"None"}
+		{"Index"}
+		{"None"}
+		{""}
+		{""}
+		{""}
+		{"0"}
+		{""}
+		{"0;0"}
+		{"10;1.309;0.785398"}
+		{"Times:12:0;Times:10:0;Times:12:2"}
+		{"0;0;13816530;16777215;0;0;6579300;11842740;13158600;14474460;0;3947580;16777215;15670812;6845928;16771158;2984993;9199669;7018159;1460610;16748822;11184810;14173291"}
+		{"16,0,0"}
+		},
+		"1046;657;70;70");
+
+
+	
diff --git a/res/TemplateBatchFiles/SlidingWindowAnalysis.bf b/res/TemplateBatchFiles/SlidingWindowAnalysis.bf
new file mode 100644
index 0000000..61620d8
--- /dev/null
+++ b/res/TemplateBatchFiles/SlidingWindowAnalysis.bf
@@ -0,0 +1,277 @@
+fprintf(stdout,"\n ---- RUNNING SLIDING DATA WINDOW ANALYSIS ---- \n");
+
+ChoiceList (dataType,"Data type",1,SKIP_NONE,"Nucleotide/Protein","Nucleotide or amino-acid (protein).",
+				     "Codon","Codon (several available genetic codes).");
+
+if (dataType<0) 
+{
+	return;
+}
+
+if (dataType)
+{
+	SetDialogPrompt ("Please choose a codon data file:");
+	#include "TemplateModels/chooseGeneticCode.def";
+}
+else
+{
+	SetDialogPrompt ("Please choose a nucleotide or amino-acid data file:");
+}
+
+DataSet ds = ReadDataFile (PROMPT_FOR_FILE);
+
+fprintf (stdout,"\n\n**** Read file ", LAST_FILE_PATH," ****\n**** ", Format(ds.sites,0,0)," sites (", 
+				Format(ds.unique_sites,0,0)," of them are distinct), and ", Format(ds.species,0,0), " species. ****"); 
+
+if (IS_TREE_PRESENT_IN_DATA)
+{
+	treeString = DATAFILE_TREE;
+	fprintf (stdout, "\n\nA tree was found in the data file:\n",treeString,"\n\nWould you like to use it:(Y/N)?");
+	fscanf (stdin, "String", response);
+	if ((response=="n")||(response=="N"))
+	{
+		IS_TREE_PRESENT_IN_DATA = 0;
+	}
+	fprintf (stdout, "\n\n");
+}
+
+if (!IS_TREE_PRESENT_IN_DATA)
+{
+	SetDialogPrompt ("Please select a tree file for the data:");
+	fscanf (PROMPT_FOR_FILE, "String", treeString);
+}
+
+if (dataType)
+{
+	DataSetFilter filteredData = CreateFilter (ds,3);
+}
+else
+{
+	DataSetFilter filteredData = CreateFilter (ds,1);
+}
+
+SetDialogPrompt		("Save results to:");
+fprintf 			(PROMPT_FOR_FILE,CLEAR_FILE);
+SelectTemplateModel (filteredData);
+
+windowWidth:>0;
+windowShift:>0;
+
+windowWidth = 0;
+windowShift = 0;
+
+if (dataType)
+{
+	while (windowWidth<3 || windowWidth> filteredData.sites*3-3 || windowWidth%3)
+	{
+		fprintf (stdout,"\nEnter the width (in bp, divisble by 3) of the data window [3-",filteredData.sites*3-3,"]:");
+		fscanf  (stdin,"Number",windowWidth);
+	}
+	firstTime = filteredData.sites*3-windowWidth;
+	while (windowShift<3 || windowShift> firstTime || windowShift%3)
+	{
+		fprintf (stdout,"\nEnter the stride (in bp, divisble by 3) at each step [3-",firstTime,"]:");
+		fscanf  (stdin,"Number",windowShift);
+	}
+}
+else
+{
+	while (windowWidth<1 || windowWidth> filteredData.sites-1)
+	{
+		fprintf (stdout,"\nEnter the width (in bp) of the data window [1-",filteredData.sites-1,"]:");
+		fscanf  (stdin,"Number",windowWidth);
+	}
+	firstTime = filteredData.sites-windowWidth;
+	while (windowShift<1 || windowShift> firstTime)
+	{
+		fprintf (stdout,"\nEnter the stride (in bp) at each step [1-",firstTime,"]:");
+		fscanf  (stdin,"Number",windowShift);
+	}
+}
+
+fprintf (stdout,"\n");
+
+MESSAGE_LOGGING = 0;
+VERBOSITY_LEVEL = -1;
+
+firstTime = 1;
+
+if (MPI_NODE_COUNT>1)
+{
+	MPINodeState  = {MPI_NODE_COUNT-1,1};
+	MPINodeBounds = {MPI_NODE_COUNT-1,2};
+	OPTIMIZE_SUMMATION_ORDER = 0;
+}
+
+for (currentStart = 0; currentStart < ds.sites; currentStart = currentStart + windowShift)
+{
+	currentEnd = currentStart + windowWidth;
+	if (currentEnd>=ds.sites)
+	{
+		currentEnd = ds.sites - 1;
+	}
+	
+	if (dataType)
+	{
+		DataSetFilter filteredData = CreateFilter (ds,3,(siteIndex>=currentStart)&&(siteIndex<=currentEnd),"",GeneticCodeExclusions);
+	}
+	else
+	{
+		DataSetFilter filteredData = CreateFilter (ds,1,(siteIndex>=currentStart)&&(siteIndex<=currentEnd));
+	}
+
+	HarvestFrequencies (swEFV,filteredData,1,1,1);
+	
+	if (FREQUENCY_SENSITIVE)
+	{
+		swModelMatrix = 0;
+		if (USE_POSITION_SPECIFIC_FREQS)
+		{
+			HarvestFrequencies (swEFV,filteredData,3,1,1);
+		}
+		MULTIPLY_BY_FREQS = PopulateModelMatrix ("swModelMatrix",swEFV);
+		if (dataType)
+		{
+			swCodonEFV    = BuildCodonFrequencies (swEFV);
+			Model swModel = (swModelMatrix,swCodonEFV,MULTIPLY_BY_FREQS);	
+		}
+		else
+		{
+			Model swModel = (swModelMatrix,swEFV,MULTIPLY_BY_FREQS);
+		}	
+	}
+	
+	Tree dataTree 		  = treeString;
+	LikelihoodFunction lf = (filteredData,dataTree);
+
+	if (MPI_NODE_COUNT>1)
+	{
+		for (mpiNode = 0; mpiNode < MPI_NODE_COUNT-1; mpiNode = mpiNode+1)
+		{
+			if (MPINodeState[mpiNode]==0)
+			{
+				break;	
+			}
+		}
+		
+		if (mpiNode==MPI_NODE_COUNT-1)
+		/* all nodes busy */
+		{
+			mpiNode = ReceiveJobs (1);
+		}
+		else
+		{
+			MPISend (mpiNode+1,lf);
+			MPINodeState[mpiNode] = 1;
+			MPINodeBounds[mpiNode][0] = currentStart;
+			MPINodeBounds[mpiNode][1] = currentEnd;
+		}
+	}
+	else
+	{
+		Optimize (lf_MLES,lf);
+		segmentStart = currentStart;
+		segmentEnd   = currentEnd;
+		dummy = ReceiveJobs (0);
+	}
+}
+
+if (MPI_NODE_COUNT>1)
+{
+	while (1)
+	{
+		for (nodeCounter = 0; nodeCounter < MPI_NODE_COUNT-1; nodeCounter = nodeCounter+1)
+		{
+			if (MPINodeState[nodeCounter]==1)
+			{
+				fromNode = ReceiveJobs (0);
+				break;	
+			}
+		}
+		if (nodeCounter == MPI_NODE_COUNT-1)
+		{
+			break;
+		}
+	}	
+	OPTIMIZE_SUMMATION_ORDER = 1;
+	
+	for (nodeCounter = 0; nodeCounter*windowShift < ds.sites; nodeCounter=nodeCounter+1)
+	{
+		fprintf (LAST_FILE_PATH,"\n",Format(nodeCounter*windowShift,0,0)," , ",
+									 Format(Min((1+nodeCounter)*windowShift,ds.sites-1),0,0),",",MPI_Results_Cache[dataDimension][nodeCounter]);	
+		
+		for (i=0;i<dataDimension;i=i+1)
+		{
+			fprintf (LAST_FILE_PATH,",",MPI_Results_Cache[i][nodeCounter]);
+		}			
+	}
+}
+
+
+function ReceiveJobs (sendOrNot)
+{
+	if (MPI_NODE_COUNT>1)
+	{
+		MPIReceive (-1, fromNode, result_String);
+		
+		segmentStart = MPINodeBounds[fromNode-1][0];
+		segmentEnd   = MPINodeBounds[fromNode-1][1];
+		
+		if (sendOrNot)
+		{
+			MPISend (fromNode,lf);
+			MPINodeBounds[fromNode-1][0] = currentStart;
+			MPINodeBounds[fromNode-1][1] = currentEnd;
+		}
+		else
+		{
+			MPINodeState[fromNode-1] = 0;
+			MPINodeBounds[fromNode-1][0] = -1;
+			MPINodeBounds[fromNode-1][1] = -1;
+		}
+		ExecuteCommands (result_String);
+	}
+	
+	if (firstTime)
+	{
+		firstTime = 0;
+		
+		dataDimension = Columns(lf_MLES);
+		
+		fprintf (LAST_FILE_PATH,"\nStarting bp,Ending bp,Ln-likelihood");
+		for (i=0;i<dataDimension;i=i+1)
+		{
+			GetString (argName,lf,i);
+			fprintf	  (LAST_FILE_PATH,",",argName);
+		}
+		
+		if (MPI_NODE_COUNT>1)
+		{
+			MPI_Results_Cache = {dataDimension+1,ds.sites$windowShift+1};
+		}
+	}	
+	
+	fprintf (stdout,"Finshed Segment ",Format(segmentStart,0,0)," - ",Format(segmentEnd,0,0),"\n");
+	if (MPI_NODE_COUNT<2)
+	{
+		fprintf (LAST_FILE_PATH,"\n",Format(segmentStart,0,0)," , ",Format(segmentEnd,0,0),",",lf_MLES[1][0]);
+		
+		for (i=0;i<dataDimension;i=i+1)
+		{
+			fprintf (LAST_FILE_PATH,",",lf_MLES[0][i]);
+		}			
+	}
+	else
+	{
+		cacheIndex = segmentStart $ windowShift;
+		for (i=0;i<dataDimension;i=i+1)
+		{
+			MPI_Results_Cache[i][cacheIndex] = lf_MLES[0][i];
+		}			
+		MPI_Results_Cache[i][cacheIndex] = lf_MLES[1][0];
+	}
+	return fromNode-1;
+}
+
+
+MESSAGE_LOGGING = 1;
diff --git a/res/TemplateBatchFiles/SplitSequencesByPattern.bf b/res/TemplateBatchFiles/SplitSequencesByPattern.bf
new file mode 100644
index 0000000..6c12234
--- /dev/null
+++ b/res/TemplateBatchFiles/SplitSequencesByPattern.bf
@@ -0,0 +1,51 @@
+ExecuteAFile 					(HYPHY_LIB_DIRECTORY + "TemplateBatchFiles" + DIRECTORY_SEPARATOR + "Utility" + DIRECTORY_SEPARATOR + "ReadDelimitedFiles.bf");
+
+SetDialogPrompt 		("Please choose a data file:");
+
+DataSet 				ds = ReadDataFile (PROMPT_FOR_FILE);
+fprintf 				(stdout, "\n\nData Read:\n", ds);
+fprintf					(stdout, "\nA regular expression to split with");
+fscanf					(stdin,"String",regExp);
+
+DataSetFilter	    	allData = CreateFilter (ds,1);
+GetString				(taxonNames,allData,-1);
+
+splitIDs = {};
+usedNames = {};
+
+for (k=0; k<allData.species; k=k+1)
+{
+	newName = normalizeSequenceID (taxonNames[k], "usedNames");
+	if (newName != taxonNames[k])
+	{
+		SetParameter (ds,k,newName);
+	}
+}
+
+GetString				(taxonNames,allData,-1);
+
+for (k=0; k<allData.species; k=k+1)
+{
+	match = taxonNames[k]$regExp;
+	if (match[0]>=0)
+	{
+		matchTo = (taxonNames[k])[match[0]][match[1]];
+		if (Abs(splitIDs[matchTo]) == 0)
+		{
+			splitIDs[matchTo] = {};
+		}
+		(splitIDs[matchTo])[k+1] = 1;
+	}
+}
+
+basePath = LAST_FILE_PATH;
+
+keys = Rows(splitIDs);
+
+for (k=0; k<Columns(keys); k=k+1)
+{
+	fileOut = basePath + "." + keys[k];
+	DataSetFilter splitDF = CreateFilter (ds,1,"",(splitIDs[keys[k]])[speciesIndex+1]);
+	fprintf (fileOut,CLEAR_FILE,splitDF);
+	fprintf (stdout, keys[k], " matched ", splitDF.species, " sequences\n");
+}
diff --git a/res/TemplateBatchFiles/StarDecomposition.bf b/res/TemplateBatchFiles/StarDecomposition.bf
new file mode 100644
index 0000000..e2e8b7a
--- /dev/null
+++ b/res/TemplateBatchFiles/StarDecomposition.bf
@@ -0,0 +1,566 @@
+MESSAGE_LOGGING = 0;
+twHasBeenOpened = 0;
+
+#include "heuristicMethodNPBootstrap.bf";
+#include "branchSwappingFunctions.bf";
+
+ChoiceList (doNNIOption,"Branch Swapping",1,SKIP_NONE,
+			"No Swapping","No branch swapping is performed.",
+			"Global NNI","Nearest neighbor interchange is performed after ALL the sequences have been added. Order (sequences)^1 additional trees are examined.",
+			"Global SPR","Subtree pruning and regrafting is performed after ALL the sequences have been added. Order (sequences)^2 additional trees are examined.");
+
+if (doNNIOption<0)
+{
+	return;
+}
+ChoiceList (dataType,"Data type",1,SKIP_NONE,"Nucleotide/Protein","Nucleotide or amino-acid (protein).",
+				     "Codon","Codon (several available genetic codes).");
+
+if (dataType<0) 
+{
+	return;
+}
+
+if (dataType)
+{
+	NICETY_LEVEL = 3;
+	SetDialogPrompt ("Please choose a codon data file:");
+	#include "TemplateModels/chooseGeneticCode.def";
+}
+else
+{
+	SetDialogPrompt ("Please choose a nucleotide or amino-acid data file:");
+}
+
+
+DataSet ds = ReadDataFile (PROMPT_FOR_FILE);
+
+if (dataType)
+{
+	DataSetFilter filteredData = CreateFilter (ds,3,"","",GeneticCodeExclusions);
+}
+else
+{
+	DataSetFilter filteredData = CreateFilter (ds,1,"","");
+}
+
+haveTreeConstraint = 0;
+
+function InferTreeTopology (verbFlag)
+{
+	treeNodes = {2*(ds.species+1),4};
+	/* stores previous best tree in columns 0 and 1, and current working tree in columns 2,3 */
+	bestTreeNodes = {2*(ds.species+1),2};
+	/* holder for current best tree */
+
+	cladesInfo = {ds.species,4};
+	/* stores previous best tree clade info in columns 0 and 1, and current working tree clade info in columns 2,3 */
+	bestCladesInfo = {ds.species,2};
+	/* holder for current best tree */
+
+	eligibleNodesCount = ds.species;
+	eligibleNodes = {ds.species,1};
+
+	done = false;
+
+	for (k=0; k<ds.species; k=k+1)
+	{
+		treeNodes[k][0] = k;
+		treeNodes[k][1] = 1;
+		eligibleNodes[k] = k;
+	}
+
+	treeNodes[ds.species][0] = ds.species;
+	treeNodes[ds.species][1] = 0;
+
+	cladesInfo[0][0]=0;
+	cladesInfo[0][1]=ds.species+1;
+
+	bestTree="";
+	bestValue=-1e20;
+
+	currentTaxon = 0;
+	taxonCounter = 3;
+	cladesCount = 1;
+
+	if (verbFlag)
+	{
+		fprintf (stdout, "**** Running star decomposition on ", LAST_FILE_PATH, " ****");
+	}
+	while (eligibleNodesCount>3)
+	{
+		bestNode1 = 0;
+		bestNode2 = 0;
+		/* stores the nodes which will be grouped at this stage */
+		
+		if (verbFlag)
+		{
+			fprintf (stdout, "\n\n\nSTEP ",Format(ds.species-eligibleNodesCount+1,0,0),"/",Format(ds.species-3,0,0),"). ");
+		}
+		bestValue=-1e20;
+		if (eligibleNodesCount>4)
+		{
+			loop1 = 0;
+			if (verbFlag)
+			{
+				fprintf (stdout, Format((eligibleNodesCount-1)*eligibleNodesCount/2,0,0), " trees for this step.\n");
+			}
+		}
+		else
+		{
+			loop1 = 1;
+			if (verbFlag)
+			{
+				fprintf (stdout, Format(3,0,0), " trees for this step.\n");
+			}
+		}
+		for (; loop1 < eligibleNodesCount-1; loop1 = loop1+1)
+		{
+			for (loop2 = loop1+1; loop2 < eligibleNodesCount; loop2 = loop2+1)
+			{
+				n = eligibleNodes[loop1];
+				m = eligibleNodes[loop2];
+				
+				/* 3 cases to consider */
+				/* first - see what happens when both nodes grouped are leaves */
+				if ((n<ds.species)&&(m<ds.species))
+				{
+					/* a few things to do here:
+					   copy all nodes from the old tree to the new tree excluding the two being added
+					   add a new clade at the end of the tree
+					   update clade lengths of the original tree
+					*/
+					i=0;
+					shift = 0;
+					/* copying nodes other than n and m */
+					while (treeNodes[i][1])
+					{
+						p = treeNodes[i][0];
+						if ((p!=m)&&(p!=n))
+						{
+							treeNodes[i-shift][2]=treeNodes[i][0];
+							treeNodes[i-shift][3]=treeNodes[i][1];
+						}
+						else
+						{
+							shift = shift+1;
+						}
+						i = i+1;
+					}
+					
+					i = i-2;
+					treeNodes[i][2]=m;
+					treeNodes[i][3]=2;
+					i = i+1;
+					treeNodes[i][2]=n;
+					treeNodes[i][3]=2;
+					i = i+1;
+					treeNodes[i][2]=cladesCount+ds.species;
+					treeNodes[i][3]=1;
+					i = i+1;
+					treeNodes[i][2]=treeNodes[i-1][0];
+					treeNodes[i][3]=treeNodes[i-1][1];
+					
+					cladesInfo[cladesCount][2] = i-3;
+					cladesInfo[cladesCount][3] = 3;
+					
+					/* copy all clades - all existing clades will have their tree positions shifted by 2 to the left, except
+					   for the "global clade", i.e the entire tree.*/
+					   
+					cladesInfo[0][2] = cladesInfo[0][0];
+					cladesInfo[0][3] = cladesInfo[0][1]+1;
+					
+					i = 1;
+					while (cladesInfo[i][1])
+					{
+						cladesInfo[i][2] = cladesInfo[i][0]-2;
+						cladesInfo[i][3] = cladesInfo[i][1];
+						i = i+1;
+					}				
+				}
+				else
+				{
+					if ((n<ds.species)||(m<ds.species))
+					{
+						/* one node is a leaf, and the other one is "proper" clade */
+						/* arrage so that n is the leaf */
+						if (m<n)
+						{
+							i=m;
+							m=n;
+							n=i;
+						}
+						/* again - a few things to do 
+						   copy the tree except for the leaf, which is added at the end of the existing clade
+						   shift clade info if necessary
+						*/
+						m = m-ds.species;
+						i=0;
+						shift = 0;
+						j = 0;
+						s = cladesInfo[m][0]+cladesInfo[m][1];
+						t_count = cladesInfo[m][0];
+						/* copying nodes other than n, adding leaf at the end of the clade*/
+						while (1)
+						{
+							p = treeNodes[i][0];
+							if (p==n)
+							{
+								shift = -1;
+							}
+							else
+							{	
+								if (i==s)
+								/* insert new node and new clade*/
+								{
+									treeNodes[i-1][2] = n;
+									treeNodes[i-1][3] = 2;
+									treeNodes[i][2] = cladesCount+ds.species;
+									treeNodes[i][3] = 1;
+									cladesInfo[cladesCount][2] = cladesInfo[m][0]-1;
+									cladesInfo[cladesCount][3] = cladesInfo[m][1]+2;
+									shift = 1;
+									j = 0;
+								}
+								else 
+								{
+									if (i==t_count)
+									{
+										j=1;
+										/* send nodes of clade m one level deeper */
+									}
+								}
+								treeNodes[i+shift][2]=treeNodes[i][0];
+								treeNodes[i+shift][3]=treeNodes[i][1]+j;							
+							}
+							if (treeNodes[i][1]==0) 
+							{
+								break;
+							}
+							i = i+1;
+						}
+						
+						treeNodes[i+1][2]=treeNodes[i][0];
+						treeNodes[i+1][3]=treeNodes[i][1];							
+						
+						/* last thing to do:
+							copy/update clade info matrix => clades starting before newly added clade will
+							get shifted 1 to the left (their starting location)
+							clades starting after the enlarged will be shifted to the right 1.
+						*/
+						s = cladesInfo[m][0]+cladesInfo[m][1];
+						t_count = cladesInfo[m][0];
+						for (k=1; k<cladesCount; k=k+1)
+						{
+							if (cladesInfo[k][0]<=t_count)
+							{
+								cladesInfo[k][2] = cladesInfo[k][0]-1;
+							}
+							else
+							{
+								cladesInfo[k][2] = cladesInfo[k][0]+1;
+							}
+							cladesInfo[k][3] = cladesInfo[k][1];
+						}
+						
+						cladesInfo[0][2]=0;
+						cladesInfo[0][3]=cladesInfo[0][1]+1;
+						
+					}
+					else
+					/* both nodes are "proper" clades 
+					   Arrange that node n is to the left of node m. */
+					{
+						/* start up the merging procedure */
+						/* copy all nodes of the tree up to the beginning of the first clade */
+						m = m-ds.species;
+						n = n-ds.species;
+						if (cladesInfo[m][0]<cladesInfo[n][0])
+						{
+							i=m;
+							m=n;
+							n=i;
+						}
+						for (k=cladesInfo[n][0]-1;k>=0; k=k-1)
+						{
+							treeNodes[k][2] = treeNodes[k][0];
+							treeNodes[k][3] = treeNodes[k][1];
+						}
+						/* copy the nodes of the first clade sending them one level deeper */
+
+						for (k=cladesInfo[n][0]+cladesInfo[n][1]-1;k>=cladesInfo[n][0]; k=k-1)
+						{
+							treeNodes[k][2] = treeNodes[k][0];
+							treeNodes[k][3] = treeNodes[k][1]+1;
+						}
+						/* copy the nodes of the 2nd clade sending them one level deeper */
+						p = cladesInfo[m][0];
+						s = cladesInfo[n][0]+cladesInfo[n][1]+cladesInfo[m][1];
+							
+						for (k=cladesInfo[n][0]+cladesInfo[n][1];k<s; k=k+1)
+						{
+							treeNodes[k][2] = treeNodes[p][0];
+							treeNodes[k][3] = treeNodes[p][1]+1;
+							p = p+1;
+						}
+						
+						/* add new node */
+						
+						treeNodes[s][2]=ds.species+cladesCount;
+						treeNodes[s][3]=1;
+						
+						k=s+1;
+						
+						/* copy the nodes between the first and second clades */
+						
+						p = cladesInfo[m][0];
+						for (j=cladesInfo[n][0]+cladesInfo[n][1]; j<p; j=j+1)
+						{
+							treeNodes[k][2]=treeNodes[j][0];
+							treeNodes[k][3]=treeNodes[j][1];
+							k=k+1;
+						}
+											
+						/* finally, copy all the nodes after the end of the 2nd clade */
+						for (j=cladesInfo[m][0]+cladesInfo[m][1]; treeNodes[j][1]; j=j+1)
+						{
+							treeNodes[k][2]=treeNodes[j][0];
+							treeNodes[k][3]=treeNodes[j][1];
+							k=k+1;
+						}
+						
+						k=cladesInfo[0][1];
+						/*copy root*/
+						treeNodes[k][2]=treeNodes[k-1][0];
+						treeNodes[k][3]=treeNodes[k-1][1];
+						
+						/* create new clade info */
+						cladesInfo[cladesCount][2] = cladesInfo[n][0];
+						cladesInfo[cladesCount][3] = cladesInfo[n][1]+cladesInfo[m][1]+1;
+						
+						/* lastly - update info for other clades */
+						s = cladesInfo[n][0];
+						p = cladesInfo[n][1]+s;
+						t_count = cladesInfo[m][0];
+						j = cladesInfo[m][1]+1;
+						for (k=0; k<cladesCount; k=k+1)
+						{
+							cladesInfo[k][3] = cladesInfo[k][1];
+							l = cladesInfo[k][0];
+							if (l<=s)
+							{
+								cladesInfo[k][2] = l;
+							}
+							else
+							{
+								if ((l>=p)&&(l<t_count))
+								{
+									cladesInfo[k][2] = l+j;
+								}
+								else
+								{
+									if (l>=t_count+j-1)
+									{
+										cladesInfo[k][2] = l+1;
+									}
+									else
+									{
+										if (l>=t_count)
+										{
+											cladesInfo[k][2] = l-t_count+p;
+										}
+										else
+										{
+											cladesInfo[k][2] = l;
+										}
+									}
+								}
+							}
+						}
+						cladesInfo[m][2] = p;
+						cladesInfo[0][3] = cladesInfo[0][1]+1;
+					}
+				}
+				
+				thisTree = TreeMatrix2TreeString (2,0);
+				if (verbFlag)
+				{
+					fprintf (stdout, "\n\tTree ",thisTree);
+				}				
+				Tree    Inferred_Tree = thisTree;
+				LikelihoodFunction lf = (filteredData, Inferred_Tree);
+			    if (categoriesUsed) {alpha = 0.5;}
+				Optimize (res,lf);
+				if (res[1][0]>bestValue)
+				{
+					bestValue = res[1][0];
+					bestTree = thisTree;
+					bestNode1 = eligibleNodes[loop1];
+					bestNode2 = eligibleNodes[loop2];
+					
+					for (l=0;treeNodes[l][3];l=l+1)
+					{
+						bestTreeNodes[l][0]=treeNodes[l][2];
+						bestTreeNodes[l][1]=treeNodes[l][3];
+					}
+					
+					bestTreeNodes[l][0]=treeNodes[l][2];
+					bestTreeNodes[l][1]=treeNodes[l][3];
+									
+					for (l=0; l<=cladesCount; l=l+1)
+					{
+						bestCladesInfo[l][0]=cladesInfo[l][2];
+						bestCladesInfo[l][1]=cladesInfo[l][3];
+					}
+					if (verbFlag)
+					{
+						mxTreeSpec = {4,1};
+						mxTreeSpec [0] = "Inferred_Tree";
+						mxTreeSpec [3] = "";
+						if (twHasBeenOpened)
+						{
+							mxTreeSpec [1] = "";
+							mxTreeSpec [2] = "";
+						}
+						else
+						{
+							mxTreeSpec [1] = "8211";
+							mxTreeSpec [2] = "10,40,-10,-175,1";
+							twHasBeenOpened = 1;
+						}
+						OpenWindow (TREEWINDOW, mxTreeSpec );
+					}
+
+				}
+				if (verbFlag)
+				{
+					fprintf (stdout, " =>", res[1][0]);
+				}
+			}
+
+		}
+		
+
+		/* update eligible nodes lists */
+		shift = 0;
+		for (l=0;l<eligibleNodesCount;l=l+1)
+		{
+			if ((eligibleNodes[l]==bestNode1)||(eligibleNodes[l]==bestNode2))
+			{
+				shift = shift+1;
+			}
+			else
+			{
+				eligibleNodes[l-shift]=eligibleNodes[l];
+			}
+		}
+		eligibleNodesCount = eligibleNodesCount-1;
+		eligibleNodes[eligibleNodesCount-1]=cladesCount+ds.species;
+		
+		for (l=0;bestTreeNodes[l][1];l=l+1)
+		{
+			treeNodes[l][0]=bestTreeNodes[l][0];
+			treeNodes[l][1]=bestTreeNodes[l][1];
+		}
+
+		treeNodes[l][0]=bestTreeNodes[l][0];
+		treeNodes[l][1]=bestTreeNodes[l][1];
+		
+		for (l=0; l<=cladesCount; l=l+1)
+		{
+			cladesInfo[l][0]=bestCladesInfo[l][0];
+			cladesInfo[l][1]=bestCladesInfo[l][1];
+		}
+		
+		if (verbFlag)
+		{
+			if (bestNode1<ds.species)
+			{
+				GetString (s1,ds,bestNode1);
+			}
+			else
+			{
+				s1 = "Node"+Format(bestNode1,0,0);
+			}
+			if (bestNode2<ds.species)
+			{
+				GetString (s2,ds,bestNode2);
+			}
+			else
+			{
+				s2 = "Node"+Format(bestNode2,0,0);
+			}
+			fprintf (stdout,"\n\n\t ----> Best tree obtained by grouping ",s1," and ", s2, " is\n", bestTree, " with log likelihood of ", bestValue);
+		}
+		cladesCount = cladesCount+1;
+	}
+	
+	if (doNNIOption)
+	{
+		taxonCounter = ds.species;
+		/* strip the root off for compatibility */
+		for (l=Rows(treeNodes)-1; l>0; l=l-1)
+		{
+			if (treeNodes[l][0]>=ds.species)
+			{
+				if (treeNodes[l][0] == ds.species)
+				{
+					treeNodes[l][0] = 0;
+				}
+				else
+				{
+					treeNodes[l][0] = treeNodes[l][0]-1;
+				}
+			}
+		}
+		for (l=0; l<Rows(cladesInfo)-1; l=l+1)
+		{
+			cladesInfo[l][0] = cladesInfo[l+1][0];
+			cladesInfo[l][1] = cladesInfo[l+1][1];
+		}
+		cladesInfo[l][0] = 0;
+		cladesInfo[l][1] = 0;
+		
+		starDecomposition = 1;
+		if (doNNIOption==1)
+		{
+			#include "doNNISwap.bf";
+		}
+		else
+		{
+			#include "doSPRSwap.bf";
+		}
+	}
+	return 1;
+}
+
+l = InferTreeTopology (1.0);
+
+fprintf (stdout,"\n\n --------------------- RESULTS --------------------- \n\n");
+fprintf (stdout,"BestTree =", bestTree);
+
+Tree	Inferred_Tree = bestTree;
+LikelihoodFunction lf = (filteredData, Inferred_Tree);
+if (categoriesUsed) {alpha = 0.5;}
+Optimize (res,lf);
+
+if (verbFlag)
+{
+	OpenWindow (TREEWINDOW, {{"Inferred_Tree"}} );
+}
+
+fprintf (stdout, "\n",lf, "\n\n***********Save this tree to a file (y/n)?");
+fscanf  (stdin, "String", resp);
+
+if ((resp!="n")&&(resp!="N"))
+{
+	SetDialogPrompt ("Write tree string to:");
+	fprintf (PROMPT_FOR_FILE,CLEAR_FILE,bestTree,";");
+}
+
+saveTreeNodes = {2*(ds.species+1),3};
+for (i=2*ds.species+1;i>=0;i=i-1)
+{
+	saveTreeNodes[i][0] = bestTreeNodes[i][0];
+	saveTreeNodes[i][1] = bestTreeNodes[i][1];
+}
diff --git a/res/TemplateBatchFiles/StrandGRMTest.bf b/res/TemplateBatchFiles/StrandGRMTest.bf
new file mode 100644
index 0000000..edc39de
--- /dev/null
+++ b/res/TemplateBatchFiles/StrandGRMTest.bf
@@ -0,0 +1,109 @@
+/* will do a test of a standard GRM against a strand complimentary GRM using AIC 
+strand complimentary GRM has AC := TG not AC := CA
+
+Wayne Delport
+*/
+
+
+function printModelDescription ( gammaRate, freqsVector, strandGTR )
+{
+if ( strandGTR ) {
+	sep =            "+---+-------------+-------------+-------------+-------------+\n";
+	fprintf (stdout, "Rate matrix\n", 
+					 sep,
+					 "|   |      A      |      C      |      G      |      T      |\n",
+					 sep,
+					 "| A |      *      | ",Format(AC,11,5)," | ", Format(1.0,11,5), " | ", Format(AT,11,5), " |\n",
+					 sep,
+					 "| C | ",Format(GT,11,5)," |      *      | ", Format(CG,11,5), " | ", Format(CT,11,5), " |\n",
+					 sep,
+					 "| G | ",Format(CT,11,5), " | ",  Format(CG,11,5), " |      *      | ", Format(GT,11,5), " |\n",
+					 sep,
+					 "| T | ",Format(AT,11,5), " | ",  Format(AG,11,5), " | ",  Format(AC,11,5)," |      *      |\n",
+					 sep);
+						 
+	}
+	else {
+		sep =            "+---+-------------+-------------+-------------+-------------+\n";
+	fprintf (stdout, "Rate matrix\n", 
+					 sep,
+					 "|   |      A      |      C      |      G      |      T      |\n",
+					 sep,
+					 "| A |      *      | ",Format(AC,11,5)," | ", Format(1.0,11,5), " | ", Format(AT,11,5), " |\n",
+					 sep,
+					 "| C | ",Format(AC,11,5)," |      *      | ", Format(CG,11,5), " | ", Format(CT,11,5), " |\n",
+					 sep,
+					 "| G | ",Format(1,11,5), " | ",  Format(CG,11,5), " |      *      | ", Format(GT,11,5), " |\n",
+					 sep,
+					 "| T | ",Format(AT,11,5), " | ",  Format(CT,11,5), " | ",  Format(GT,11,5)," |      *      |\n",
+					 sep);
+	}
+	fprintf (stdout, "\nBase frequencies",
+					 "\nA = ", Format (freqsVector[0],10,4),
+					 "\nC = ", Format (freqsVector[1],10,4),
+					 "\nG = ", Format (freqsVector[2],10,4),
+					 "\nT = ", Format (freqsVector[3],10,4), "\n");
+					 
+	if (gammaRate>1) /* gamma or HMM*/
+	{
+		fprintf (stdout, "\nRate variation");
+		GetInformation 		(catInfo, c);
+		for (idx = 0; idx < Columns (catInfo); idx = idx + 1)
+		{
+			fprintf (stdout, "\nRate ",Format (idx+1,5,0), " = ", Format (catInfo[0][idx], 10,5), " (weight = ", Format (catInfo[1][idx], 10,5), ")");
+		}
+		fprintf (stdout, "\n");
+	}
+	
+	return 1;
+}
+
+SetDialogPrompt ("Select a nucleotide alignment");
+DataSet 		ds = ReadDataFile(PROMPT_FOR_FILE);
+fprintf			(stdout, "Read an alignment with ", ds.species, " sequences and ", ds.sites, " sites\n");
+ExecuteAFile 	(HYPHY_LIB_DIRECTORY + "TemplateBatchFiles" + DIRECTORY_SEPARATOR + "queryTree.bf");
+
+DataSetFilter filteredData = CreateFilter (ds,1);
+
+fprintf ( stdout, "Select parameter settings for GRM model:\n" );
+incFileName = HYPHY_LIB_DIRECTORY + "TemplateBatchFiles" + DIRECTORY_SEPARATOR +  "TemplateModels" + DIRECTORY_SEPARATOR + "GRM.mdl";
+ExecuteCommands ( "#include  \"" + incFileName + "\";" );
+Export ( Modelstring, USE_LAST_MODEL );
+fprintf ( stdout, Modelstring, "\n" );
+Tree GRMTree = treeString;
+LikelihoodFunction lf_GRM = ( filteredData, GRMTree );
+Optimize ( res_GRM, lf_GRM );
+totalBranchCount = TipCount(GRMTree) + BranchCount ( GRMTree );
+ll_GRM = res_GRM [ 1 ][ 0 ];
+aic_GRM = -2*ll_GRM + 2*(res_GRM [ 1 ][ 1 ] + totalBranchCount + 3);
+
+if ( modelType >= 1 ) {
+	fprintf ( stdout, "\nGeneral reversible model optimised parameters\n" );
+	fprintf ( stdout,   "---------------------------------------------\n" );
+	printModelDescription ( modelType, vectorOfFrequencies, 0 );
+	fprintf ( stdout, "\n" );
+}
+
+fprintf ( stdout, "Select parameter settings for stGRM model:\n" );
+incFileName = HYPHY_LIB_DIRECTORY + "TemplateBatchFiles" + DIRECTORY_SEPARATOR +  "TemplateModels" + DIRECTORY_SEPARATOR + "STGRM.mdl";
+ExecuteCommands ( "#include  \"" + incFileName + "\";" );
+Export ( Modelstring, USE_LAST_MODEL );
+fprintf ( stdout, Modelstring, "\n" );
+Tree STGRMTree = treeString;
+LikelihoodFunction lf_STGRM = ( filteredData, STGRMTree );
+Optimize ( res_STGRM, lf_STGRM );
+ll_STGRM = res_STGRM [ 1 ][ 0 ];
+aic_STGRM = -2*ll_STGRM + 2*(res_STGRM [ 1 ][ 1 ] + totalBranchCount + 3);
+
+if ( modelType >= 1 ) {
+	fprintf ( stdout, "\nstrand specific General reversible model optimised parameters\n" );
+	fprintf ( stdout, "---------------------------------------------------------------\n" );
+	printModelDescription ( modelType, vectorOfFrequencies, 1 );
+	fprintf ( stdout, "\n" );
+}
+
+fprintf ( stdout, "AIC model comparison\n" );
+fprintf ( stdout, "--------------------\n" );
+fprintf ( stdout, "GRM: logLk = ", ll_GRM, "; AIC = ", aic_GRM, "; Parameters = ", res_GRM [ 1 ][ 1 ] + totalBranchCount + 3, "\n" );
+fprintf ( stdout, "stGRM: logLk = ", ll_STGRM, "; AIC = ", aic_STGRM, "; Parameters = ", res_STGRM [ 1 ][ 1 ] + totalBranchCount + 3, "\n" );
+
diff --git a/res/TemplateBatchFiles/StripStopCodons.bf b/res/TemplateBatchFiles/StripStopCodons.bf
new file mode 100644
index 0000000..c68ec61
--- /dev/null
+++ b/res/TemplateBatchFiles/StripStopCodons.bf
@@ -0,0 +1,103 @@
+#include "TemplateModels/chooseGeneticCode.def";
+
+SetDialogPrompt ("Please choose a codon data file:");
+
+DataSet ds = ReadDataFile (PROMPT_FOR_FILE);
+fprintf (stdout, "\n\nData Read:\n", ds);
+
+if (IS_TREE_PRESENT_IN_DATA)
+{
+	fprintf (stdout, "\nTree In Data:", DATAFILE_TREE);
+}
+
+DataSetFilter	    all64 = CreateFilter (ds, 3, "", "");
+
+stopCodonTemplate   	= {1,64};
+nonStopCodonTemplate	= {1,64};
+
+for (stateCount=0; stateCount<64; stateCount=stateCount+1)
+{
+	if (_Genetic_Code[stateCount] == 10)
+	{
+		stopCodonTemplate[stateCount] = 1;
+	}
+	else
+	{
+		nonStopCodonTemplate[stateCount] = 1;
+	}
+}
+
+validSequences 			= "";
+dummy					= validSequences*512;
+
+sequenceNames = {all64.species, 1};
+
+for (sequenceIndex = 0; sequenceIndex < all64.species; sequenceIndex = sequenceIndex+1)
+{
+	GetString (replacementString, all64, sequenceIndex);
+	sequenceNames[sequenceIndex] = replacementString;
+}
+
+GetInformation (sequenceData, all64);
+GetDataInfo    (duplicateMapper, all64);
+
+goodSequences	  = 0;
+
+for (sequenceIndex = 0; sequenceIndex < all64.species; sequenceIndex = sequenceIndex+1)
+{
+	fprintf (stdout, "\nSequence ", Format(sequenceIndex+1,7,0),"/",all64.species," : "); 
+	stopCodonCount     = 0;
+	
+	for (siteIndex = 0; siteIndex < all64.unique_sites; siteIndex = siteIndex+1)
+	{
+		GetDataInfo (siteInfo, all64, sequenceIndex, siteIndex);
+		siteInfo1 = stopCodonTemplate*siteInfo;
+		siteInfo2 = nonStopCodonTemplate*siteInfo;
+		if (siteInfo1[0]>0 && siteInfo2[0] == 0)
+		{
+			stopCodonCount 	= stopCodonCount+1;
+			break;
+		}
+	}
+	
+	if (stopCodonCount)
+	{
+		fprintf (stdout, " STOP CODONS.");		
+	}
+	else
+	{
+		if (goodSequences == 0)
+		{
+			dummy	= validSequences*(""+sequenceIndex);
+		}
+		else
+		{
+			dummy	= validSequences*(","+sequenceIndex);		
+		}
+		fprintf (stdout, " CLEAN.");
+		goodSequences = goodSequences + 1;	
+	}
+}
+
+dummy	= validSequences*0;
+
+if (goodSequences<all64.species)
+{
+	if (goodSequences == 0)
+	{
+		fprintf (stdout, "\n\nEvery sequence had stop codons!\n\n");
+	}
+	else
+	{
+		fprintf (stdout, "\n\nKept ", goodSequences, "/",all64.species," sequences.\n\n");
+		DataSetFilter	    all64 = CreateFilter (ds, 1, "", validSequences);
+		SetDialogPrompt ("Save cleaned data to:");
+		fprintf 		(PROMPT_FOR_FILE, CLEAR_FILE, all64);
+	}
+}
+else
+{
+	fprintf (stdout, "\n\nNo stop codons found\n\n");
+}
+
+sequenceData = 0;
diff --git a/res/TemplateBatchFiles/SubtreeSelectionComparison.bf b/res/TemplateBatchFiles/SubtreeSelectionComparison.bf
new file mode 100644
index 0000000..eca1524
--- /dev/null
+++ b/res/TemplateBatchFiles/SubtreeSelectionComparison.bf
@@ -0,0 +1,385 @@
+SHORT_MPI_RETURN = 1;
+
+/*------------------------------------------------------------------------*/
+
+function ReportSiteST (siteI, siteM)
+{
+	fullSites[siteI][0] = doneSites[siteM][0];
+	fullSites[siteI][1] = doneSites[siteM][1];
+	fullSites[siteI][2] = doneSites[siteM][2];
+	fullSites[siteI][3] = doneSites[siteM][0]/doneSites[siteM][2];
+	fullSites[siteI][4] = doneSites[siteM][1]/doneSites[siteM][2];
+	
+	fullSites[siteI][5] = doneSites[siteM][3];
+	fullSites[siteI][6] = doneSites[siteM][4];
+	fullSites[siteI][7] = doneSites[siteM][3]/doneSites[siteM][4];
+	fullSites[siteI][8] = doneSites[siteM][5];
+	fullSites[siteI][9] = doneSites[siteM][6];
+
+
+	fprintf (stdout, "Site ", Format(siteI+1,4,0)," dN Tree= ", Format(fullSites[siteI][0],6,3),
+					 " dN Clade ", Format(fullSites[siteI][1],6,3),
+					 " dS = ", Format(fullSites[siteI][2],6,3),
+					 " Joint dN ",Format(fullSites[siteI][5],6,3),
+					 " Joint dS ",Format(fullSites[siteI][6],6,3),
+					 " LRT ", Format(fullSites[siteI][8],6,3),
+					 " p-value = ",Format(fullSites[siteI][9],7,4));		
+					 
+	if (fullSites[siteI][9]<pValue)
+	{
+		fprintf (stdout, " *");
+	}
+	fprintf (stdout, "\n");
+	return 0;
+}
+
+/*------------------------------------------------------------------------*/
+
+function ReceiveJobsST (sendOrNot, nullAlt)
+{
+	MPIReceive (-1, fromNode, result_String);
+	
+	siteIndex = MPINodeState[fromNode-1][1];
+	siteNA	  = MPINodeState[fromNode-1][2];
+	
+	if (sendOrNot)
+	{
+		MPISend (fromNode,siteLikelihood);
+		MPINodeState[fromNode-1][1] = siteCount;			
+		MPINodeState[fromNode-1][2] = nullAlt;			
+	}
+	else
+	{
+		MPINodeState[fromNode-1][0] = 0;
+		MPINodeState[fromNode-1][1] = -1;		
+	}
+	
+	siteMap = dupInfo[siteIndex];
+	
+	/*
+	echoFile = "echo."+siteIndex+"."+siteNA;
+	fprintf (echoFile,CLEAR_FILE,result_String);
+	*/
+	
+	ExecuteCommands (result_String);
+	
+	if (siteNA)
+	{
+		doneSites[siteMap][0] = siteLikelihood_MLE_VALUES["nFactor_Tree"];
+		doneSites[siteMap][1] = siteLikelihood_MLE_VALUES ["nFactor_Clade"];
+		doneSites[siteMap][2] = siteLikelihood_MLE_VALUES ["sFactor"];
+		doneSites[siteMap][5] = doneSites[siteMap][5]+2*siteLikelihood_MLES[1][0];
+	}
+	else
+	{
+		doneSites[siteMap][5] = doneSites[siteMap][5]-2*siteLikelihood_MLES[1][0];	
+		doneSites[siteMap][4] = siteLikelihood_MLE_VALUES["sFactor"];
+		doneSites[siteMap][3] = siteLikelihood_MLE_VALUES["nFactor_Tree"];
+	}
+
+	if (doneSites[siteMap][6] == 0)
+	{
+		doneSites[siteMap][6] = -1;
+	}
+	else
+	{
+		if (doneSites[siteMap][6] == (-1))
+		{
+			doneSites[siteMap][6] = 1-CChi2(doneSites[siteMap][5],1);						
+			dummy = ReportSiteST (siteIndex, siteMap);
+		}
+	}
+	
+	return fromNode-1;
+}
+
+/*------------------------------------------------------------------------*/
+
+stdr = _DO_TREE_REBALANCE_;
+_DO_TREE_REBALANCE_ = 0;
+
+#include "qndhelper1.ibf";
+
+_DO_TREE_REBALANCE_ = stdr;
+
+
+fprintf (stdout,"\n\n______________READ THE FOLLOWING DATA______________\n",ds,
+				"\n\nPhase 1:Nucleotide Model (",ModelTitle,") Model Fit\n\n");
+
+
+if (nrChoice == 0)
+{
+	LikelihoodFunction nucLF = (nucData,givenTree);
+	Optimize (res,nucLF);
+	stashLOF = LIKELIHOOD_FUNCTION_OUTPUT ;
+	LIKELIHOOD_FUNCTION_OUTPUT  = 6;
+	fprintf (NUC_FILE_PATH,nucLF);
+	LIKELIHOOD_FUNCTION_OUTPUT  = stashLOF;
+}
+
+mxTreeSpec = {5,1};
+mxTreeSpec [0] = "givenTree";
+mxTreeSpec [1] = "8240";
+mxTreeSpec [2] = "10,40,-10,-175,1";
+mxTreeSpec [3] = "";
+mxTreeSpec [4] = "";
+OpenWindow (TREEWINDOW, mxTreeSpec);
+
+
+#include "qndhelper3.ibf";
+
+global			sFactor 	  = 1;
+global			nFactor_Tree  = 1;
+global			nFactor_Clade = 1;
+
+doneSites    = {filteredData.unique_sites,7};
+fullSites    = {filteredData.sites,10};
+Tree		   siteTree = treeString;
+
+
+
+/* display the tree */
+
+ChoiceList  (stOption,"Branch Subset",1,NO_SKIP,"Subtree","Select a subtree rooted at an internal node",
+												"Internal vs Tips", "Internal nodes vs leaves of the tree");
+												
+if (stOptions < 0)
+{
+	return 0;
+}
+												
+ReplicateConstraint ("this1.?.synRate   :=sFactor*this2.?.t__",siteTree,givenTree);
+
+if (stOption == 0)
+{
+	internalNodes = BranchCount(siteTree);
+
+	choiceMatrix = {internalNodes,2};
+
+	for (bc=0; bc<internalNodes; bc=bc+1)
+	{
+		choiceMatrix[bc][0] = BranchName(siteTree,bc);
+		choiceMatrix[bc][1] = "Internal Branch Rooting " + siteTree[bc];
+	}
+
+	ChoiceList  (bOption,"Choose root of subtree",1,NO_SKIP,choiceMatrix);
+
+	if (bOption < 0)
+	{
+		return -1;
+	}
+
+	cladeConstraintCommand = "ReplicateConstraint(\"this1.?.nonSynRate:=nFactor_Clade*this2.?.t__\",siteTree."+BranchName(siteTree,bOption)+",givenTree."+BranchName(givenTree,bOption)+");";																					      
+}
+else
+{
+	cladeConstraintCommand = "";
+	cladeConstraintCommand * 8192;
+	internalNodes = BranchCount(siteTree);
+	for (bc=0; bc<internalNodes; bc=bc+1)
+	{
+		ibn = BranchName(siteTree,bc);
+		cladeConstraintCommand * ("siteTree."+ibn+".nonSynRate:=nFactor_Clade*givenTree."+ibn+".t__;\n");
+	}
+	cladeConstraintCommand * 0;
+}
+
+pValue = 0;
+while ((pValue<=0)||(pValue>=1))
+{	
+	fprintf (stdout, "\nSignificance level for Likelihood Ratio Tests (between 0 and 1)?");
+	fscanf  (stdin,"Number", pValue);
+}
+GetDataInfo    (dupInfo, filteredData);
+fprintf (stdout, "\n");
+
+
+
+ExecuteCommands (cladeConstraintCommand);
+ReplicateConstraint ("this1.?.nonSynRate:=nFactor_Tree*this2.?.t__",siteTree,givenTree);
+
+
+labels = {{"dN Tree","dN Clade", "dS","dN/dS Tree", "dN/dS Clade",  "dN Tree = dN Clade", "Joint dS", "Joint dN/dS", "LRT","p-value"}};
+
+if (MPI_NODE_COUNT<=1)
+{
+	for (siteCount = 0; siteCount < filteredData.sites; siteCount = siteCount+1)
+	{
+		siteMap = dupInfo[siteCount];
+		if (doneSites[siteMap][0] == 0)
+		{
+			filterString = "";
+			filterString = filterString + (siteCount*3) + "-" + (siteCount*3+2);
+			DataSetFilter siteFilter = CreateFilter (ds,3,filterString,"",GeneticCodeExclusions);
+			HarvestFrequencies (f1, siteFilter, 3, 3, 0);
+			m1 = 0;
+			for (mpiNode=0; mpiNode < 64; mpiNode=mpiNode+1)
+			{
+				if (f1[mpiNode]>0)
+				{
+					m1=m1+1;
+				}
+			}	
+			
+			if (m1>1)
+			{
+				LikelihoodFunction siteLikelihood = (siteFilter, siteTree);
+				sFactor = 1;
+				nFactor_Clade	= 1;
+				nFactor_Tree	= 1;
+				Optimize (site_res, siteLikelihood);
+				doneSites[siteMap][0] = nFactor_Tree;
+				doneSites[siteMap][1] = nFactor_Clade;
+				doneSites[siteMap][2] = sFactor;
+				nFactor_Clade:=nFactor_Tree;
+				Optimize (site_resN, siteLikelihood);
+				doneSites[siteMap][4] = sFactor;
+				doneSites[siteMap][3] = nFactor_Tree;
+				doneSites[siteMap][5] = 2*(site_res[1][0]-site_resN[1][0]);
+				doneSites[siteMap][6] = 1-CChi2(doneSites[siteMap][5],1);		
+			}
+			else
+			{
+				doneSites[siteMap][0] = 1;
+				doneSites[siteMap][6] = 1;
+			}				
+		}
+		dummy = ReportSiteST (siteCount, siteMap);		
+	}	
+}
+else
+{
+	MPINodeState = {MPI_NODE_COUNT-1,3};
+	alreadyDone = {filteredData.unique_sites,1};
+	for (siteCount = 0; siteCount < filteredData.sites; siteCount = siteCount+1)
+	{
+		siteMap = dupInfo[siteCount];
+		if (alreadyDone[siteMap] == 0)
+		{
+			filterString = "";
+			filterString = filterString + (siteCount*3) + "-" + (siteCount*3+2);
+			DataSetFilter siteFilter = CreateFilter (filteredData,3,filterString,"",GeneticCodeExclusions);
+			
+			HarvestFrequencies (f1, siteFilter, 3, 3, 0);
+			m1 = 0;
+			for (mpiNode=0; mpiNode < 64; mpiNode=mpiNode+1)
+			{
+				if (f1[mpiNode]>0)
+				{
+					m1=m1+1;
+				}
+			}	
+			
+			alreadyDone[siteMap] = 1;				
+			
+			if (m1>1)
+			{
+				LikelihoodFunction siteLikelihood = (siteFilter, siteTree);				
+				sFactor = 1;
+				nFactor_Clade	= 1;
+				nFactor_Tree	= 1;
+				for (mpiNode = 0; mpiNode < MPI_NODE_COUNT-1; mpiNode = mpiNode+1)
+				{
+					if (MPINodeState[mpiNode][0]==0)
+					{
+						break;	
+					}
+				}
+				
+				if (mpiNode==MPI_NODE_COUNT-1)
+				/* all nodes busy */
+				{
+					mpiNode = ReceiveJobsST (1,1);
+				}
+				else
+				{
+					MPISend (mpiNode+1,siteLikelihood);
+					MPINodeState[mpiNode][0] = 1;
+					MPINodeState[mpiNode][1] = siteCount;
+					MPINodeState[mpiNode][2] = 1;
+				}
+				
+				nFactor_Clade:=nFactor_Tree;
+
+				for (mpiNode = 0; mpiNode < MPI_NODE_COUNT-1; mpiNode = mpiNode+1)
+				{
+					if (MPINodeState[mpiNode][0]==0)
+					{
+						break;	
+					}
+				}
+				
+				DataSetFilter siteFilter = CreateFilter (filteredData,3,filterString,"",GeneticCodeExclusions);
+				LikelihoodFunction siteLikelihood = (siteFilter, siteTree);				
+				if (mpiNode==MPI_NODE_COUNT-1)
+				/* all nodes busy */
+				{
+					mpiNode = ReceiveJobsST (1,0);
+				}
+				else
+				{
+					MPISend (mpiNode+1,siteLikelihood);
+					MPINodeState[mpiNode][0] = 1;
+					MPINodeState[mpiNode][1] = siteCount;
+					MPINodeState[mpiNode][2] = 0;
+				}
+			}
+			else
+			{
+				doneSites[siteMap][6] = 1;
+				ReportSiteST (siteCount, siteMap);				 
+			}				
+		}
+	}					
+	while (1)
+	{
+		for (nodeCounter = 0; nodeCounter < MPI_NODE_COUNT-1; nodeCounter = nodeCounter+1)
+		{
+			if (MPINodeState[nodeCounter][0]==1)
+			{
+				fromNode = ReceiveJobsST (0,0);
+				break;	
+			}
+		}
+		if (nodeCounter == MPI_NODE_COUNT-1)
+		{
+			break;
+		}
+	}					
+	fprintf (stdout, "\n\n\n");
+	for (siteCount = 0; siteCount < filteredData.sites; siteCount = siteCount+1)
+	{
+		siteMap = dupInfo[siteCount];
+		dummy = ReportSiteST (siteCount, siteMap);				 
+	}
+}
+
+OpenWindow (CHARTWINDOW,{{"ALS Results"}
+					   {"labels"},
+					   {"fullSites"},
+					   {"Bar Chart"},
+					   {"Index"},
+					   {labels[0]},
+					   {"Site Index"},
+					   {""},
+					   {labels[0]},
+					   {"0"}},
+					   "SCREEN_WIDTH-60;SCREEN_HEIGHT-50;30;50");
+					   
+SetDialogPrompt ("Save site-by-site LRT results to:");
+
+siteCount = Columns (fullSites);
+fprintf (PROMPT_FOR_FILE,CLEAR_FILE,labels[0]);
+for (nodeCounter=1; nodeCounter<siteCount; nodeCounter=nodeCounter+1)
+{
+	fprintf (LAST_FILE_PATH,",",labels[nodeCounter]);
+}
+
+for (nodeCounter=0; nodeCounter < Rows (fullSites); nodeCounter = nodeCounter+1)
+{
+	fprintf (LAST_FILE_PATH,"\n",fullSites[nodeCounter][0]);
+	for (mpiNode=1; mpiNode<siteCount; mpiNode=mpiNode+1)
+	{
+		fprintf (LAST_FILE_PATH,",",fullSites[nodeCounter][mpiNode]);
+	}
+}
diff --git a/res/TemplateBatchFiles/TemplateModels/190 b/res/TemplateBatchFiles/TemplateModels/190
new file mode 100644
index 0000000..447c323
--- /dev/null
+++ b/res/TemplateBatchFiles/TemplateModels/190
@@ -0,0 +1,23 @@
+FLIMVSPTAYHQNKDECWRG
+{
+{0,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18}
+{0,0,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36}
+{1,19,0,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53}
+{2,20,37,0,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69}
+{3,21,38,54,0,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84}
+{4,22,39,55,70,0,85,86,87,88,89,90,91,92,93,94,95,96,97,98}
+{5,23,40,56,71,85,0,99,100,101,102,103,104,105,106,107,108,109,110,111}
+{6,24,41,57,72,86,99,0,112,113,114,115,116,117,118,119,120,121,122,123}
+{7,25,42,58,73,87,100,112,0,124,125,126,127,128,129,130,131,132,133,134}
+{8,26,43,59,74,88,101,113,124,0,135,136,137,138,139,140,141,142,143,144}
+{9,27,44,60,75,89,102,114,125,135,0,145,146,147,148,149,150,151,152,153}
+{10,28,45,61,76,90,103,115,126,136,145,0,154,155,156,157,158,159,160,161}
+{11,29,46,62,77,91,104,116,127,137,146,154,0,162,163,164,165,166,167,168}
+{12,30,47,63,78,92,105,117,128,138,147,155,162,0,169,170,171,172,173,174}
+{13,31,48,64,79,93,106,118,129,139,148,156,163,169,0,175,176,177,178,179}
+{14,32,49,65,80,94,107,119,130,140,149,157,164,170,175,0,180,181,182,183}
+{15,33,50,66,81,95,108,120,131,141,150,158,165,171,176,180,0,184,185,186}
+{16,34,51,67,82,96,109,121,132,142,151,159,166,172,177,181,184,0,187,188}
+{17,35,52,68,83,97,110,122,133,143,152,160,167,173,178,182,185,187,0,189}
+{18,36,53,69,84,98,111,123,134,144,153,161,168,174,179,183,186,188,189,0}
+}
diff --git a/res/TemplateBatchFiles/TemplateModels/BranchSiteTemplate.mdl b/res/TemplateBatchFiles/TemplateModels/BranchSiteTemplate.mdl
new file mode 100644
index 0000000..d5c0de9
--- /dev/null
+++ b/res/TemplateBatchFiles/TemplateModels/BranchSiteTemplate.mdl
@@ -0,0 +1,227 @@
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function BuildCodonFrequencies (obsF)
+{
+	PIStop = 1.0;
+	model_dim = CountSenseCodons (_Genetic_Code);
+	result = {model_dim,1};
+	hshift = 0;
+
+	for (h=0; h<64; h += 1)
+	{
+		first  = h$16;
+		second = h%16$4;
+		third  = h%4;
+		if (_Genetic_Code[h]==10) 
+		{
+			hshift = hshift+1;
+			PIStop = PIStop-obsF[first][0]*obsF[second][1]*obsF[third][2];
+		} else {
+		    result[h-hshift][0]=obsF[first][0]*obsF[second][1]*obsF[third][2];
+		}
+	}
+	return result*(1.0/PIStop);
+}
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+global AC = 1;
+global AT = 1;
+global CG = 1;
+global CT = 1;
+global GT = 1;
+
+MGCustomRateBiasTerms = {{"AC*","","AT*","CG*","CT*","GT*"}};	
+
+_nucBiasTerms = {4,4};
+_nucBiasTerms[0][0] = "";
+
+hv = 0;
+
+for (h=0; h<4; h=h+1)
+{
+	for (v=h+1; v<4; v=v+1)
+	{
+		_nucBiasTerms[h][v] = MGCustomRateBiasTerms[hv];
+		_nucBiasTerms[v][h] = MGCustomRateBiasTerms[hv];
+		hv = hv + 1;	
+	}
+}
+
+h=0;
+v=0;
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function PopulateModelMatrix (ModelMatrixName&, EFV, synrateP, globalP, nonsynRateP)
+{
+    ModelMatrixDimension = CountSenseCodons (_Genetic_Code);
+	
+	ModelMatrixName = {ModelMatrixDimension,ModelMatrixDimension}; 
+
+	hshift = 0;
+	
+	modelDefString = "";
+	modelDefString*16384;
+	
+	catCounterAL = {};
+	
+	for (h=0; h<64; h=h+1)
+	{
+		if (_Genetic_Code[h]==10) 
+		{
+			hshift = hshift+1;
+			continue; 
+		}
+		vshift = hshift;
+		for (v = h+1; v<64; v=v+1)
+		{
+			diff = v-h;
+			if (_Genetic_Code[v]==10) 
+			{
+				vshift = vshift+1;
+				continue; 
+			}
+			nucPosInCodon = 2;
+			if ((h$4==v$4)||((diff%4==0)&&(h$16==v$16))||(diff%16==0))
+			{
+				if (h$4==v$4)
+				{
+					transition = v%4;
+					transition2= h%4;
+				}
+				else
+				{
+					if(diff%16==0)
+					{
+						transition = v$16;
+						transition2= h$16;
+						nucPosInCodon = 0;
+					}
+					else
+					{
+						transition = v%16$4;
+						transition2= h%16$4;
+						nucPosInCodon = 1;
+					}
+				}
+				hs  = Format(h-hshift,0,0);
+				vs  = Format(v-vshift,0,0);
+				ts  = Format(transition,0,0);
+				ts2 = Format(transition2,0,0);
+				ps  = Format(nucPosInCodon,0,0);
+				aa1 = _Genetic_Code[0][h];
+				aa2 = _Genetic_Code[0][v];
+				if (aa1==aa2) 
+				{
+					modelDefString*("ModelMatrixName["+hs+"]["+vs+"] := "+_nucBiasTerms[transition][transition2]+""+synrateP+"*EFV__["+ts+"]["+ps+"];\n"+
+									"ModelMatrixName["+vs+"]["+hs+"] := "+_nucBiasTerms[transition][transition2]+""+synrateP+"*EFV__["+ts2+"]["+ps+"];\n");
+				}
+				else
+				{
+					if (Abs(globalP))
+					{
+						modelDefString*("ModelMatrixName["+hs+"]["+vs+"] := "+_nucBiasTerms[transition][transition2]+""+synrateP+"*"+globalP+"*EFV__["+ts+"]["+ps+"];\n"+
+										"ModelMatrixName["+vs+"]["+hs+"] := "+_nucBiasTerms[transition][transition2]+""+synrateP+"*"+globalP+"*EFV__["+ts2+"]["+ps+"];\n");	
+					
+					}
+					else
+					{
+						modelDefString*("ModelMatrixName["+hs+"]["+vs+"] := "+_nucBiasTerms[transition][transition2]+""+nonsynRateP+"*EFV__["+ts+"]["+ps+"];\n"+
+										"ModelMatrixName["+vs+"]["+hs+"] := "+_nucBiasTerms[transition][transition2]+""+nonsynRateP+"*EFV__["+ts2+"]["+ps+"];\n");	
+					}
+				}
+			}
+	    }
+    }		
+	modelDefString*0;
+	ExecuteCommands (modelDefString);
+	return 0;
+}
+
+//--------------------------------------------------------------------------------------------------------------
+
+lfunction extractBranchInformation (treeID, _omega_pattern, _model_prefix, _freq_prefix, _freq_vector, _do_mult) {
+    _branchNames   = BranchName(^treeID,-1);
+    _branchCount   = Columns (_branchNames) - 1;
+
+    _toReturn         = {"Names": {}, "Props": {_branchCount,2}};  // cat count, branch length
+    _brLenExpressions = {};
+    _brLenLocals      = {};
+    
+    for (_i = 0; _i < _branchCount; _i += 1) {
+        _expression = treeID + "\\." + _branchNames[_i] + "\\." + _omega_pattern;
+        ExecuteCommands("GetInformation (_matchedVars, \"`_expression`\")");
+        _catCount = Columns (_matchedVars);
+        _toReturn ["Names"] + _branchNames[_i];
+        (_toReturn["Props"])[_i][0] = _catCount;
+        
+        if (_catCount > 0) {
+            _brLen     = 0;
+            _totalWeight = 0;
+            for (_c = 1; _c <= _catCount; _c += 1) {
+                _modelID = _model_prefix + _c;
+                if (Abs (_brLenExpressions[_modelID]) == 0) {
+                    Model _internal = (^_modelID, ^_freq_vector, _do_mult);
+                    GetString (_bl, _internal, -1);
+                    _brLenExpressions [_modelID] = _bl;
+                    _localParameters = {};
+                    _p = 1;
+                    GetString (_locP, _internal, 0);
+                    while (_locP != None) {
+                        _localParameters + _locP; 
+                        GetString (_locP, _internal, _p);
+                        _p += 1;
+                    }
+                    _brLenLocals [_modelID] = _localParameters;
+                }
+                                
+                for (_lpc = 0; _lpc < Abs (_brLenLocals [_modelID]); _lpc += 1) {
+                    local_var = (_brLenLocals [_modelID])[_lpc];
+                    var_ref   =  treeID + "." + _branchNames[_i] + "." + (_brLenLocals [_modelID])[_lpc];
+                    Eval (local_var + "=" + ^var_ref);
+                }
+                _thisModelLength = Eval (_brLenExpressions[_modelID]);
+                
+                if (_c < _catCount) {
+                    var_ref = treeID + "." + _branchNames[_i] + "." + _freq_prefix + _c;
+                    _freqW = ^var_ref;
+                } else {
+                    var_ref = treeID + "." + _branchNames[_i] + "." + _freq_prefix + (_c-1);
+                    _freqW = 1.;
+                }
+                
+                _thisModelWeight = (1-_totalWeight)*_freqW;            
+                _totalWeight += _thisModelWeight;
+                _brLen += _thisModelWeight * _thisModelLength;            
+            }
+        } else {
+            _brLen = 3 * BranchLength (^treeID, _branchNames[_i]);
+        }
+        
+        (_toReturn["Props"]) [_i][1] = _brLen/3;
+    }
+    
+    
+    return _toReturn;   
+}
+
+lfunction extractBranchLengthsFromBSREL (treeID) {
+    _mleLengths  = extractBranchInformation (treeID, "omega[0-9]+", "MGMatrix", "Paux", "codon3x4", 0);
+    _brLenByName = {};
+     for (k = 0; k < Abs (_mleLengths["Names"]); k+=1) {
+        _brLenByName[(_mleLengths["Names"])[k]] = (_mleLengths["Props"])[k][1];
+    }
+    return _brLenByName;
+    
+}
+
+lfunction extractBranchLengthsFromBSREL_SRV (treeID) {
+    _mleLengths  = extractBranchInformation (treeID, "nonsyn[0-9]+", "MGMatrix", "Paux", "codon3x4", 0);
+    _brLenByName = {};
+     for (k = 0; k < Abs (_mleLengths["Names"]); k+=1) {
+        _brLenByName[(_mleLengths["Names"])[k]] = (_mleLengths["Props"])[k][1];
+    }
+    return _brLenByName;
+    
+}
diff --git a/res/TemplateBatchFiles/TemplateModels/CF3x4.bf b/res/TemplateBatchFiles/TemplateModels/CF3x4.bf
new file mode 100644
index 0000000..32001ba
--- /dev/null
+++ b/res/TemplateBatchFiles/TemplateModels/CF3x4.bf
@@ -0,0 +1,121 @@
+function CF3x4 (observed3x4,stopCodons)
+{
+	global p11 :< 1; p11:>0;
+	global p12 :< 1; p12:>0;
+	global p13 :< 1; p13:>0;
+	global p21 :< 1; p21:>0;
+	global p22 :< 1; p22:>0;
+	global p23 :< 1; p23:>0;
+	global p31 :< 1; p31:>0;
+	global p32 :< 1; p32:>0;
+	global p33 :< 1; p33:>0;
+	
+	N = {4,3};
+	
+	n1A : = p11;
+	p11 = observed3x4[0][0];
+	n1C : = (1-p11)*p12;
+	p12 = observed3x4[1][0]/(1-p11);
+	n1G : = (1-p11)*(1-p12)*p13;
+	p13 = observed3x4[2][0]/(1-p11)/(1-p21);
+	n1T : = (1-p11)*(1-p12)*(1-p13);
+
+	n2A : = p21;
+	p21 = observed3x4[0][1];
+	n2C : = (1-p21)*p22;
+	p22 = observed3x4[1][1]/(1-p21);
+	n2G : = (1-p21)*(1-p22)*p23;
+	p23 = observed3x4[2][1]/(1-p21)/(1-p22);
+	n2T : = (1-p21)*(1-p22)*(1-p23);
+
+	n3A : = p31;
+	p31 = observed3x4[0][2];
+	n3C : = (1-p31)*p32;
+	p32 = observed3x4[1][2]/(1-p31);
+	n3G : = (1-p31)*(1-p32)*p33;
+	p33 = observed3x4[2][2]/(1-p31)/(1-p32);
+	n3T : = (1-p31)*(1-p32)*(1-p33);
+	
+	stopCount 		= (Abs(stopCodons)+1)$4;
+	charMap   		= {"A":0,"C":1,"G":2, "T": 3};
+	revMap			= {{"A","C","G","T"}};
+	stopComposition = {stopCount,3};
+	
+	SDef =""; SDef * 128; SDef * "1";
+	
+	for (i = 0; i < stopCount; i = i+1)
+	{
+		SDef * "-";
+		for (j = 0; j < 3; j = j+1)
+		{
+			stopComposition[i][j] = charMap[stopCodons[4*i+j]];
+			if (j)
+			{
+				SDef * "*";
+			}
+			SDef * ("n"+(j+1)+stopCodons[4*i+j]);
+		}
+	}
+	
+	SDef * 0;
+	
+	ExecuteCommands ("global S:=`SDef`");
+	
+	SDef = {4,3};
+	for (i = 0; i<4; i=i+1)
+	{
+		for (j = 0; j<3; j=j+1)
+		{
+			SDef[i][j] = "";
+		}
+	}
+	
+	for (k = 0; k < stopCount; k = k+1)
+	{
+		SDef[stopComposition[k][0]][0] = SDef[stopComposition[k][0]][0] + 
+										 "-" +
+										 "n2" + revMap[stopComposition[k][1]] +
+										 "*n3" + revMap[stopComposition[k][2]];
+		SDef[stopComposition[k][1]][1] = SDef[stopComposition[k][1]][1] + 
+										 "-" +
+										 "n1" + revMap[stopComposition[k][0]] +
+										 "*n3" + revMap[stopComposition[k][2]];
+		SDef[stopComposition[k][2]][2] = SDef[stopComposition[k][2]][2] + 
+										 "-" +
+										 "n1" + revMap[stopComposition[k][0]] +
+										 "*n2" + revMap[stopComposition[k][1]];
+	}
+
+	for (i = 0; i<4; i=i+1)
+	{
+		for (j = 0; j<3; j=j+1)
+		{
+			if (Abs (SDef[i][j]))
+			{
+				ExecuteCommands ("N[i][j] := n"+(j+1)+revMap[i] + "*(1" + SDef[i][j] + ")/S;");
+			}
+			else
+			{
+				ExecuteCommands ("N[i][j] := n"+(j+1)+revMap[i] + "/S;");			
+			}
+		}
+	}
+
+	calc = 0;
+	
+	norm1 = {3,1}["1"];
+	norm2 = {1,4}["1"];
+	
+	
+	Optimize (res, _CF3x4_minimizer(p11,p12,p13,p21,p22,p23,p31,p32,p33));
+	
+	return {{n1A__,n2A__,n3A__}{n1C__,n2C__,n3C__}{n1G__,n2G__,n3G__}{n1T__,n2T__,n3T__}};
+}
+
+function _CF3x4_minimizer (p11,p12,p13,p21,p22,p23,p31,p32,p33)
+{
+	calc = calc + 1;
+	error = N-observed3x4;
+	error = error$error;
+	return  -(norm2*error*norm1)[0];
+}
diff --git a/res/TemplateBatchFiles/TemplateModels/Custom_AA.mdl b/res/TemplateBatchFiles/TemplateModels/Custom_AA.mdl
new file mode 100644
index 0000000..57a0eb5
--- /dev/null
+++ b/res/TemplateBatchFiles/TemplateModels/Custom_AA.mdl
@@ -0,0 +1,154 @@
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+
+/* ADD NEW RATE CLASS MATRICES HERE */
+
+allowedAACharacters = "ACDEFGHIKLMNPQRSTVWY";
+
+	
+SetDialogPrompt ("Locate an amino-acid profile matrix file:");
+fscanf (PROMPT_FOR_FILE,"String,Matrix",mapString,aaRateMatrix);
+W_MATRIX_FILE = LAST_FILE_PATH;
+
+
+
+if (Abs(mapString) == 20 && Rows(aaRateMatrix) == 20 && Columns(aaRateMatrix) == 20)
+{
+	/* check to see that all characters have been mapped */
+	checkAAMap   = {}; /* associative array */
+	for (aaIndex = 0; aaIndex < 20; aaIndex = aaIndex+1)
+	{
+		aChar = allowedAACharacters[aaIndex];
+		checkAAMap[aChar] = aaIndex+1;
+	
+	}
+
+	AAMap = {};
+	for (aaIndex = 0; aaIndex < 20; aaIndex = aaIndex+1)
+	{
+		aChar = mapString[aaIndex];
+		daIndex = checkAAMap[aChar];
+		if (daIndex==0)
+		{
+			fprintf (stdout, "\nAmino-acid ordering provided in the file is invalid - could be duplicate or missing characters\n");
+			return 0;
+		}
+		else
+		{
+			AAMap[aaIndex] = daIndex-1;
+			checkAAMap[aChar] = 0;
+		}
+	}
+	
+	/*symmetrize the matrix*/
+	
+	for (aaIndex = 0; aaIndex < 19; aaIndex = aaIndex+1)
+	{
+		for (aaIndex2 = aaIndex+1; aaIndex2 < 20; aaIndex2 = aaIndex2+1)
+		{
+			aaRateMatrix[aaIndex2][aaIndex] = aaRateMatrix[aaIndex][aaIndex2];
+		}
+	}
+	
+	/* reindex the matrix */
+	
+	aaRateMultipliers = {20,20};
+	
+	aaRateClassIDs = {};
+	
+	for (aaIndex = 0; aaIndex < 19; aaIndex = aaIndex+1)
+	{
+		mappedIndex = AAMap[aaIndex];
+		for (aaIndex2 = aaIndex+1; aaIndex2 < 20; aaIndex2 = aaIndex2+1)
+		{
+			mappedIndex2 								 = AAMap[aaIndex2];
+			rateLabel 									 = aaRateMatrix[aaIndex][aaIndex2]$1;
+			aaRateMultipliers[mappedIndex][mappedIndex2] = rateLabel;
+			aaRateMultipliers[mappedIndex2][mappedIndex] = rateLabel;
+			
+			if (aaRateClassIDs[rateLabel] == 0)
+			{
+				aaRateClassIDs[rateLabel] = 1;
+			}
+		}
+	}
+	
+	aaRateMatrix = 0;
+	
+}
+else
+{
+	fprintf (stdout, "\nExpected a string of 20 characters followed by a 20x20 matrix\n");
+	return 0;
+}
+
+#include "modelParameters2.mdl";
+
+if (modelType == 1)
+{
+	#include "defineGamma.mdl";
+}
+
+if (modelType == 2)
+{
+	#include "defineHM.mdl";
+}
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function PopulateModelMatrix (ModelMatrixName&, EFV)
+{
+	ModelMatrixName = {20,20}; 
+	
+	modelDefString = "";
+	modelDefString*16384;
+	
+	catCounterAL = {};
+	
+	unitRateIdx = aaRateMultipliers[7][9];
+	
+	for (aa1 = 0; aa1 < 19; aa1 = aa1+1)
+	{
+		for (aa2 = aa1+1; aa2 < 20; aa2 = aa2+1)
+		{
+			bt = aaRateMultipliers[aa1][aa2];
+			if (catCounterAL[bt] == 0)
+			{
+				catCounterAL[bt] = 1;
+				if (bt != unitRateIdx)
+				{
+					modelDefString*("\nglobal R_"+bt+"=1;\n");
+				}				
+			}
+			if (bt!=unitRateIdx)
+			{
+				bt = "R_"+bt+"*";
+			}
+			else
+			{
+				bt = "";
+			}
+
+			if(modelType)
+			{
+				modelDefString*("ModelMatrixName["+aa1+"]["+aa2+"] := c*"+bt+"t;\nModelMatrixName["+aa2+"]["+aa1+"] := c*"+bt+"t;\n");
+			}
+			else
+			{
+				modelDefString*("ModelMatrixName["+aa1+"]["+aa2+"] := "+bt+"t;\nModelMatrixName["+aa2+"]["+aa1+"] := "+bt+"t;\n");			
+			}
+		}	
+    }		
+	modelDefString*0;
+	ExecuteCommands (modelDefString);
+	return 0;
+}
+
+_customAAModelMatrix = 0;
+HarvestFrequencies (vectorOfFrequencies,filteredData,1,1,0);
+
+MULTIPLY_BY_FREQS = PopulateModelMatrix ("_customAAModelMatrix",vectorOfFrequencies);
+
+Model _customAAModel = (_customAAModelMatrix, vectorOfFrequencies);
+
+FREQUENCY_SENSITIVE = 1;
diff --git a/res/TemplateBatchFiles/TemplateModels/Custom_AA_empirical.mdl b/res/TemplateBatchFiles/TemplateModels/Custom_AA_empirical.mdl
new file mode 100644
index 0000000..b4d1c66
--- /dev/null
+++ b/res/TemplateBatchFiles/TemplateModels/Custom_AA_empirical.mdl
@@ -0,0 +1,168 @@
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+
+/* ADD NEW RATE CLASS MATRICES HERE */
+
+allowedAACharacters = "ACDEFGHIKLMNPQRSTVWY";
+
+	
+SetDialogPrompt ("Locate an amino-acid profile matrix file:");
+
+mapString = "";
+aaRateMatrix = {20,20};
+vectorOfFrequencies = {20,1};
+
+fscanf (PROMPT_FOR_FILE,"String,NMatrix,NMatrix",mapString,aaRateMatrix,vectorOfFrequencies);
+W_MATRIX_FILE = LAST_FILE_PATH;
+
+
+if (Abs(mapString) == 20 && Rows(aaRateMatrix) == 20 && Columns(aaRateMatrix) == 20 && Rows(vectorOfFrequencies) == 20)
+{
+	/* check to see that all characters have been mapped */
+	checkAAMap   = {}; /* associative array */
+	for (aaIndex = 0; aaIndex < 20; aaIndex = aaIndex+1)
+	{
+		aChar = allowedAACharacters[aaIndex];
+		checkAAMap[aChar] = aaIndex+1;
+	
+	}
+
+	AAMap = {};
+	for (aaIndex = 0; aaIndex < 20; aaIndex = aaIndex+1)
+	{
+		aChar = mapString[aaIndex];
+		daIndex = checkAAMap[aChar];
+		if (daIndex==0)
+		{
+			fprintf (stdout, "\nAmino-acid ordering provided in the file is invalid - could be duplicate or missing characters\n");
+			return 0;
+		}
+		else
+		{
+			AAMap[aaIndex] = daIndex-1;
+			checkAAMap[aChar] = 0;
+		}
+	}
+	
+	/*symmetrize the matrix*/
+	
+	for (aaIndex = 0; aaIndex < 19; aaIndex = aaIndex+1)
+	{
+		for (aaIndex2 = aaIndex+1; aaIndex2 < 20; aaIndex2 = aaIndex2+1)
+		{
+			aaRateMatrix[aaIndex2][aaIndex] = aaRateMatrix[aaIndex][aaIndex2];
+		}
+	}
+	
+	/* reindex the matrix */
+	
+	aaRateMultipliers = {20,20};
+	
+	for (aaIndex = 0; aaIndex < 19; aaIndex = aaIndex+1)
+	{
+		mappedIndex = AAMap[aaIndex];
+		for (aaIndex2 = aaIndex+1; aaIndex2 < 20; aaIndex2 = aaIndex2+1)
+		{
+			mappedIndex2 								 = AAMap[aaIndex2];
+			rateLabel 									 = aaRateMatrix[aaIndex][aaIndex2];
+			aaRateMultipliers[mappedIndex][mappedIndex2] = rateLabel;
+			aaRateMultipliers[mappedIndex2][mappedIndex] = rateLabel;
+		}
+	}
+	
+	aaRateMatrix = 0;
+	
+}
+else
+{
+	fprintf (stdout, "\nExpected a string of 20 characters followed by a 20x20 rate matrix and a 20x1 frequencies matrix\n");
+	return 0;
+}
+
+ChoiceList	     (_freqsOption,"Base frequencies",1,SKIP_NONE, "Empirical","Use empirical frequencies provided by the model",
+															   "Estimated","Estimate frequencies from the alignment (the +F option)",
+															   "ML Estimates","Estimate frequencies as model parameters (19 free parameters)");
+															  
+if (_freqsOption < 0)
+{
+	return 0;	
+}
+else
+{
+	if (_freqsOption == 1 && SKIP_FREQ_HARVESTING == 0)
+	{
+		HarvestFrequencies 		 (vectorOfFrequencies,filteredData,1,1,0);
+	}
+	if (_freqsOption == 2)
+	{
+		HarvestFrequencies 		 	  (vf,filteredData,1,1,0);
+		vectorOfFrequencies 		= {20,1};
+		global freqNormalizer 		= 1;
+		freqNormalizerStr			= "";
+		for (k = 0; k< 20; k=k+1)
+		{
+			ExecuteCommands ("global freqParam_" + k + "=vf[k]; freqParam_" + k + ":<1;");
+			if (k)
+			{
+				freqNormalizerStr = freqNormalizerStr + "+";
+			}
+			freqNormalizerStr = freqNormalizerStr + "freqParam_" + k;
+			ExecuteCommands ("vectorOfFrequencies[k] := freqParam_" + k + "/freqNormalizer");
+		}	
+		ExecuteCommands ("freqNormalizer := " + freqNormalizerStr);
+	}
+	
+}
+
+
+#include "modelParameters2.mdl";
+
+if (modelType == 1)
+{
+	#include "defineGamma.mdl";
+}
+
+if (modelType == 2)
+{
+	#include "defineHM.mdl";
+}
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function PopulateModelMatrix (ModelMatrixName&, EFV)
+{
+	ModelMatrixName = {20,20}; 
+	
+	modelDefString = "";
+	modelDefString*16384;
+	
+	catCounterAL = {};
+	
+	unitRateIdx = aaRateMultipliers[7][9];
+	
+	for (aa1 = 0; aa1 < 19; aa1 = aa1+1)
+	{
+		for (aa2 = aa1+1; aa2 < 20; aa2 = aa2+1)
+		{
+			bt = 0+aaRateMultipliers[aa1][aa2];
+		
+			if(modelType)
+			{
+				modelDefString*("ModelMatrixName["+aa1+"]["+aa2+"] := c*"+bt+"*t;\nModelMatrixName["+aa2+"]["+aa1+"] := c*"+bt+"*t;\n");
+			}
+			else
+			{
+				modelDefString*("ModelMatrixName["+aa1+"]["+aa2+"] := "+bt+"*t;\nModelMatrixName["+aa2+"]["+aa1+"] := "+bt+"*t;\n");			
+			}
+		}	
+    }		
+	modelDefString*0;
+	ExecuteCommands (modelDefString);
+	return 0;
+}
+
+_customAAModelMatrix = 0;
+
+MULTIPLY_BY_FREQS = PopulateModelMatrix ("_customAAModelMatrix",vectorOfFrequencies);
+Model _customAAModel = (_customAAModelMatrix, vectorOfFrequencies);
+FREQUENCY_SENSITIVE = 0;
diff --git a/res/TemplateBatchFiles/TemplateModels/Dayhoff.mdl b/res/TemplateBatchFiles/TemplateModels/Dayhoff.mdl
new file mode 100644
index 0000000..8ee1191
--- /dev/null
+++ b/res/TemplateBatchFiles/TemplateModels/Dayhoff.mdl
@@ -0,0 +1,832 @@
+/* This file defines the transition matrix for the Dayhoff model for amino-acids.
+   The file should be used as follows:
+   
+   1) Read Data File and create datafilter filteredData
+   2) #include this file (or use SelectTemplateModel(filteredData);)
+   3) Define the tree
+   4) Proceed with the likelihood function using 'equalFreqs' as the vector to pass to the constructor.
+   
+   This model has the following signature:
+   	#Short:Dayhoff#
+   	#Desc:Dayhoff model for amino-acids#
+   	#Dimension:20#
+    #DataType:aminoacid#
+   	#FileName:Dayhoff.mdl#
+   
+   12/20/1999  by Sergei L. Kosakovsky Pond
+*/
+
+#include "modelParameters2.mdl";
+
+if (!SKIP_MODEL_PARAMETER_LIST)
+{
+	if (modelType == 1)
+	{
+		#include "defineGamma.mdl";
+	}	
+	if (modelType == 2)
+	{
+		#include "defineHM.mdl";
+	}
+}
+
+function PopulateModelMatrix (ModelMatrixName&, EFV)
+{
+	ModelMatrixName = {20,20};
+	if (categoriesUsed)
+	{
+        ModelMatrixName[0][1] := t*c*0.036;
+        ModelMatrixName[1][0] := t*c*0.036;
+        ModelMatrixName[0][2] := t*c*0.12;
+        ModelMatrixName[2][0] := t*c*0.12;
+        ModelMatrixName[0][3] := t*c*0.198;
+        ModelMatrixName[3][0] := t*c*0.198;
+        ModelMatrixName[0][4] := t*c*0.018;
+        ModelMatrixName[4][0] := t*c*0.018;
+        ModelMatrixName[0][5] := t*c*0.24;
+        ModelMatrixName[5][0] := t*c*0.24;
+        ModelMatrixName[0][6] := t*c*0.023;
+        ModelMatrixName[6][0] := t*c*0.023;
+        ModelMatrixName[0][7] := t*c*0.065;
+        ModelMatrixName[7][0] := t*c*0.065;
+        ModelMatrixName[0][8] := t*c*0.026;
+        ModelMatrixName[8][0] := t*c*0.026;
+        ModelMatrixName[0][9] := t*c*0.041;
+        ModelMatrixName[9][0] := t*c*0.041;
+        ModelMatrixName[0][10] := t*c*0.072;
+        ModelMatrixName[10][0] := t*c*0.072;
+        ModelMatrixName[0][11] := t*c*0.098;
+        ModelMatrixName[11][0] := t*c*0.098;
+        ModelMatrixName[0][12] := t*c*0.25;
+        ModelMatrixName[12][0] := t*c*0.25;
+        ModelMatrixName[0][13] := t*c*0.089;
+        ModelMatrixName[13][0] := t*c*0.089;
+        ModelMatrixName[0][14] := t*c*0.027;
+        ModelMatrixName[14][0] := t*c*0.027;
+        ModelMatrixName[0][15] := t*c*0.409;
+        ModelMatrixName[15][0] := t*c*0.409;
+        ModelMatrixName[0][16] := t*c*0.371;
+        ModelMatrixName[16][0] := t*c*0.371;
+        ModelMatrixName[0][17] := t*c*0.208;
+        ModelMatrixName[17][0] := t*c*0.208;
+        ModelMatrixName[0][18] := t*c*0;
+        ModelMatrixName[18][0] := t*c*0;
+        ModelMatrixName[0][19] := t*c*0.024;
+        ModelMatrixName[19][0] := t*c*0.024;
+        ModelMatrixName[1][2] := t*c*0;
+        ModelMatrixName[2][1] := t*c*0;
+        ModelMatrixName[1][3] := t*c*0;
+        ModelMatrixName[3][1] := t*c*0;
+        ModelMatrixName[1][4] := t*c*0;
+        ModelMatrixName[4][1] := t*c*0;
+        ModelMatrixName[1][5] := t*c*0.011;
+        ModelMatrixName[5][1] := t*c*0.011;
+        ModelMatrixName[1][6] := t*c*0.028;
+        ModelMatrixName[6][1] := t*c*0.028;
+        ModelMatrixName[1][7] := t*c*0.044;
+        ModelMatrixName[7][1] := t*c*0.044;
+        ModelMatrixName[1][8] := t*c*0;
+        ModelMatrixName[8][1] := t*c*0;
+        ModelMatrixName[1][9] := t*c*0;
+        ModelMatrixName[9][1] := t*c*0;
+        ModelMatrixName[1][10] := t*c*0;
+        ModelMatrixName[10][1] := t*c*0;
+        ModelMatrixName[1][11] := t*c*0;
+        ModelMatrixName[11][1] := t*c*0;
+        ModelMatrixName[1][12] := t*c*0.019;
+        ModelMatrixName[12][1] := t*c*0.019;
+        ModelMatrixName[1][13] := t*c*0;
+        ModelMatrixName[13][1] := t*c*0;
+        ModelMatrixName[1][14] := t*c*0.023;
+        ModelMatrixName[14][1] := t*c*0.023;
+        ModelMatrixName[1][15] := t*c*0.161;
+        ModelMatrixName[15][1] := t*c*0.161;
+        ModelMatrixName[1][16] := t*c*0.016;
+        ModelMatrixName[16][1] := t*c*0.016;
+        ModelMatrixName[1][17] := t*c*0.049;
+        ModelMatrixName[17][1] := t*c*0.049;
+        ModelMatrixName[1][18] := t*c*0;
+        ModelMatrixName[18][1] := t*c*0;
+        ModelMatrixName[1][19] := t*c*0.096;
+        ModelMatrixName[19][1] := t*c*0.096;
+        ModelMatrixName[2][3] := t*c*1.153;
+        ModelMatrixName[3][2] := t*c*1.153;
+        ModelMatrixName[2][4] := t*c*0;
+        ModelMatrixName[4][2] := t*c*0;
+        ModelMatrixName[2][5] := t*c*0.125;
+        ModelMatrixName[5][2] := t*c*0.125;
+        ModelMatrixName[2][6] := t*c*0.086;
+        ModelMatrixName[6][2] := t*c*0.086;
+        ModelMatrixName[2][7] := t*c*0.024;
+        ModelMatrixName[7][2] := t*c*0.024;
+        ModelMatrixName[2][8] := t*c*0.071;
+        ModelMatrixName[8][2] := t*c*0.071;
+        ModelMatrixName[2][9] := t*c*0;
+        ModelMatrixName[9][2] := t*c*0;
+        ModelMatrixName[2][10] := t*c*0;
+        ModelMatrixName[10][2] := t*c*0;
+        ModelMatrixName[2][11] := t*c*0.905;
+        ModelMatrixName[11][2] := t*c*0.905;
+        ModelMatrixName[2][12] := t*c*0.013;
+        ModelMatrixName[12][2] := t*c*0.013;
+        ModelMatrixName[2][13] := t*c*0.134;
+        ModelMatrixName[13][2] := t*c*0.134;
+        ModelMatrixName[2][14] := t*c*0;
+        ModelMatrixName[14][2] := t*c*0;
+        ModelMatrixName[2][15] := t*c*0.095;
+        ModelMatrixName[15][2] := t*c*0.095;
+        ModelMatrixName[2][16] := t*c*0.066;
+        ModelMatrixName[16][2] := t*c*0.066;
+        ModelMatrixName[2][17] := t*c*0.018;
+        ModelMatrixName[17][2] := t*c*0.018;
+        ModelMatrixName[2][18] := t*c*0;
+        ModelMatrixName[18][2] := t*c*0;
+        ModelMatrixName[2][19] := t*c*0;
+        ModelMatrixName[19][2] := t*c*0;
+        ModelMatrixName[3][4] := t*c*0;
+        ModelMatrixName[4][3] := t*c*0;
+        ModelMatrixName[3][5] := t*c*0.081;
+        ModelMatrixName[5][3] := t*c*0.081;
+        ModelMatrixName[3][6] := t*c*0.043;
+        ModelMatrixName[6][3] := t*c*0.043;
+        ModelMatrixName[3][7] := t*c*0.061;
+        ModelMatrixName[7][3] := t*c*0.061;
+        ModelMatrixName[3][8] := t*c*0.083;
+        ModelMatrixName[8][3] := t*c*0.083;
+        ModelMatrixName[3][9] := t*c*0.011;
+        ModelMatrixName[9][3] := t*c*0.011;
+        ModelMatrixName[3][10] := t*c*0.03;
+        ModelMatrixName[10][3] := t*c*0.03;
+        ModelMatrixName[3][11] := t*c*0.148;
+        ModelMatrixName[11][3] := t*c*0.148;
+        ModelMatrixName[3][12] := t*c*0.051;
+        ModelMatrixName[12][3] := t*c*0.051;
+        ModelMatrixName[3][13] := t*c*0.716;
+        ModelMatrixName[13][3] := t*c*0.716;
+        ModelMatrixName[3][14] := t*c*0.001;
+        ModelMatrixName[14][3] := t*c*0.001;
+        ModelMatrixName[3][15] := t*c*0.079;
+        ModelMatrixName[15][3] := t*c*0.079;
+        ModelMatrixName[3][16] := t*c*0.034;
+        ModelMatrixName[16][3] := t*c*0.034;
+        ModelMatrixName[3][17] := t*c*0.037;
+        ModelMatrixName[17][3] := t*c*0.037;
+        ModelMatrixName[3][18] := t*c*0;
+        ModelMatrixName[18][3] := t*c*0;
+        ModelMatrixName[3][19] := t*c*0.022;
+        ModelMatrixName[19][3] := t*c*0.022;
+        ModelMatrixName[4][5] := t*c*0.015;
+        ModelMatrixName[5][4] := t*c*0.015;
+        ModelMatrixName[4][6] := t*c*0.048;
+        ModelMatrixName[6][4] := t*c*0.048;
+        ModelMatrixName[4][7] := t*c*0.196;
+        ModelMatrixName[7][4] := t*c*0.196;
+        ModelMatrixName[4][8] := t*c*0;
+        ModelMatrixName[8][4] := t*c*0;
+        ModelMatrixName[4][9] := t*c*0.157;
+        ModelMatrixName[9][4] := t*c*0.157;
+        ModelMatrixName[4][10] := t*c*0.092;
+        ModelMatrixName[10][4] := t*c*0.092;
+        ModelMatrixName[4][11] := t*c*0.014;
+        ModelMatrixName[11][4] := t*c*0.014;
+        ModelMatrixName[4][12] := t*c*0.011;
+        ModelMatrixName[12][4] := t*c*0.011;
+        ModelMatrixName[4][13] := t*c*0;
+        ModelMatrixName[13][4] := t*c*0;
+        ModelMatrixName[4][14] := t*c*0.014;
+        ModelMatrixName[14][4] := t*c*0.014;
+        ModelMatrixName[4][15] := t*c*0.046;
+        ModelMatrixName[15][4] := t*c*0.046;
+        ModelMatrixName[4][16] := t*c*0.013;
+        ModelMatrixName[16][4] := t*c*0.013;
+        ModelMatrixName[4][17] := t*c*0.012;
+        ModelMatrixName[17][4] := t*c*0.012;
+        ModelMatrixName[4][18] := t*c*0.076;
+        ModelMatrixName[18][4] := t*c*0.076;
+        ModelMatrixName[4][19] := t*c*0.698;
+        ModelMatrixName[19][4] := t*c*0.698;
+        ModelMatrixName[5][6] := t*c*0.01;
+        ModelMatrixName[6][5] := t*c*0.01;
+        ModelMatrixName[5][7] := t*c*0;
+        ModelMatrixName[7][5] := t*c*0;
+        ModelMatrixName[5][8] := t*c*0.027;
+        ModelMatrixName[8][5] := t*c*0.027;
+        ModelMatrixName[5][9] := t*c*0.007;
+        ModelMatrixName[9][5] := t*c*0.007;
+        ModelMatrixName[5][10] := t*c*0.017;
+        ModelMatrixName[10][5] := t*c*0.017;
+        ModelMatrixName[5][11] := t*c*0.139;
+        ModelMatrixName[11][5] := t*c*0.139;
+        ModelMatrixName[5][12] := t*c*0.034;
+        ModelMatrixName[12][5] := t*c*0.034;
+        ModelMatrixName[5][13] := t*c*0.028;
+        ModelMatrixName[13][5] := t*c*0.028;
+        ModelMatrixName[5][14] := t*c*0.009;
+        ModelMatrixName[14][5] := t*c*0.009;
+        ModelMatrixName[5][15] := t*c*0.234;
+        ModelMatrixName[15][5] := t*c*0.234;
+        ModelMatrixName[5][16] := t*c*0.03;
+        ModelMatrixName[16][5] := t*c*0.03;
+        ModelMatrixName[5][17] := t*c*0.054;
+        ModelMatrixName[17][5] := t*c*0.054;
+        ModelMatrixName[5][18] := t*c*0;
+        ModelMatrixName[18][5] := t*c*0;
+        ModelMatrixName[5][19] := t*c*0;
+        ModelMatrixName[19][5] := t*c*0;
+        ModelMatrixName[6][7] := t*c*0.007;
+        ModelMatrixName[7][6] := t*c*0.007;
+        ModelMatrixName[6][8] := t*c*0.026;
+        ModelMatrixName[8][6] := t*c*0.026;
+        ModelMatrixName[6][9] := t*c*0.044;
+        ModelMatrixName[9][6] := t*c*0.044;
+        ModelMatrixName[6][10] := t*c*0;
+        ModelMatrixName[10][6] := t*c*0;
+        ModelMatrixName[6][11] := t*c*0.535;
+        ModelMatrixName[11][6] := t*c*0.535;
+        ModelMatrixName[6][12] := t*c*0.094;
+        ModelMatrixName[12][6] := t*c*0.094;
+        ModelMatrixName[6][13] := t*c*0.606;
+        ModelMatrixName[13][6] := t*c*0.606;
+        ModelMatrixName[6][14] := t*c*0.24;
+        ModelMatrixName[14][6] := t*c*0.24;
+        ModelMatrixName[6][15] := t*c*0.035;
+        ModelMatrixName[15][6] := t*c*0.035;
+        ModelMatrixName[6][16] := t*c*0.022;
+        ModelMatrixName[16][6] := t*c*0.022;
+        ModelMatrixName[6][17] := t*c*0.044;
+        ModelMatrixName[17][6] := t*c*0.044;
+        ModelMatrixName[6][18] := t*c*0.027;
+        ModelMatrixName[18][6] := t*c*0.027;
+        ModelMatrixName[6][19] := t*c*0.127;
+        ModelMatrixName[19][6] := t*c*0.127;
+        ModelMatrixName[7][8] := t*c*0.046;
+        ModelMatrixName[8][7] := t*c*0.046;
+        ModelMatrixName[7][9] := t*c*0.257;
+        ModelMatrixName[9][7] := t*c*0.257;
+        ModelMatrixName[7][10] := t*c*0.336;
+        ModelMatrixName[10][7] := t*c*0.336;
+        ModelMatrixName[7][11] := t*c*0.077;
+        ModelMatrixName[11][7] := t*c*0.077;
+        ModelMatrixName[7][12] := t*c*0.012;
+        ModelMatrixName[12][7] := t*c*0.012;
+        ModelMatrixName[7][13] := t*c*0.018;
+        ModelMatrixName[13][7] := t*c*0.018;
+        ModelMatrixName[7][14] := t*c*0.064;
+        ModelMatrixName[14][7] := t*c*0.064;
+        ModelMatrixName[7][15] := t*c*0.024;
+        ModelMatrixName[15][7] := t*c*0.024;
+        ModelMatrixName[7][16] := t*c*0.192;
+        ModelMatrixName[16][7] := t*c*0.192;
+        ModelMatrixName[7][17] := t*c*0.889;
+        ModelMatrixName[17][7] := t*c*0.889;
+        ModelMatrixName[7][18] := t*c*0;
+        ModelMatrixName[18][7] := t*c*0;
+        ModelMatrixName[7][19] := t*c*0.037;
+        ModelMatrixName[19][7] := t*c*0.037;
+        ModelMatrixName[8][9] := t*c*0.018;
+        ModelMatrixName[9][8] := t*c*0.018;
+        ModelMatrixName[8][10] := t*c*0.243;
+        ModelMatrixName[10][8] := t*c*0.243;
+        ModelMatrixName[8][11] := t*c*0.318;
+        ModelMatrixName[11][8] := t*c*0.318;
+        ModelMatrixName[8][12] := t*c*0.033;
+        ModelMatrixName[12][8] := t*c*0.033;
+        ModelMatrixName[8][13] := t*c*0.153;
+        ModelMatrixName[13][8] := t*c*0.153;
+        ModelMatrixName[8][14] := t*c*0.464;
+        ModelMatrixName[14][8] := t*c*0.464;
+        ModelMatrixName[8][15] := t*c*0.096;
+        ModelMatrixName[15][8] := t*c*0.096;
+        ModelMatrixName[8][16] := t*c*0.136;
+        ModelMatrixName[16][8] := t*c*0.136;
+        ModelMatrixName[8][17] := t*c*0.01;
+        ModelMatrixName[17][8] := t*c*0.01;
+        ModelMatrixName[8][18] := t*c*0;
+        ModelMatrixName[18][8] := t*c*0;
+        ModelMatrixName[8][19] := t*c*0.013;
+        ModelMatrixName[19][8] := t*c*0.013;
+        ModelMatrixName[9][10] := t*c*0.527;
+        ModelMatrixName[10][9] := t*c*0.527;
+        ModelMatrixName[9][11] := t*c*0.034;
+        ModelMatrixName[11][9] := t*c*0.034;
+        ModelMatrixName[9][12] := t*c*0.032;
+        ModelMatrixName[12][9] := t*c*0.032;
+        ModelMatrixName[9][13] := t*c*0.073;
+        ModelMatrixName[13][9] := t*c*0.073;
+        ModelMatrixName[9][14] := t*c*0.015;
+        ModelMatrixName[14][9] := t*c*0.015;
+        ModelMatrixName[9][15] := t*c*0.017;
+        ModelMatrixName[15][9] := t*c*0.017;
+        ModelMatrixName[9][16] := t*c*0.033;
+        ModelMatrixName[16][9] := t*c*0.033;
+        ModelMatrixName[9][17] := t*c*0.175;
+        ModelMatrixName[17][9] := t*c*0.175;
+        ModelMatrixName[9][18] := t*c*0.046;
+        ModelMatrixName[18][9] := t*c*0.046;
+        ModelMatrixName[9][19] := t*c*0.028;
+        ModelMatrixName[19][9] := t*c*0.028;
+        ModelMatrixName[10][11] := t*c*0.001;
+        ModelMatrixName[11][10] := t*c*0.001;
+        ModelMatrixName[10][12] := t*c*0.017;
+        ModelMatrixName[12][10] := t*c*0.017;
+        ModelMatrixName[10][13] := t*c*0.114;
+        ModelMatrixName[13][10] := t*c*0.114;
+        ModelMatrixName[10][14] := t*c*0.09;
+        ModelMatrixName[14][10] := t*c*0.09;
+        ModelMatrixName[10][15] := t*c*0.062;
+        ModelMatrixName[15][10] := t*c*0.062;
+        ModelMatrixName[10][16] := t*c*0.104;
+        ModelMatrixName[16][10] := t*c*0.104;
+        ModelMatrixName[10][17] := t*c*0.258;
+        ModelMatrixName[17][10] := t*c*0.258;
+        ModelMatrixName[10][18] := t*c*0;
+        ModelMatrixName[18][10] := t*c*0;
+        ModelMatrixName[10][19] := t*c*0;
+        ModelMatrixName[19][10] := t*c*0;
+        ModelMatrixName[11][12] := t*c*0.042;
+        ModelMatrixName[12][11] := t*c*0.042;
+        ModelMatrixName[11][13] := t*c*0.103;
+        ModelMatrixName[13][11] := t*c*0.103;
+        ModelMatrixName[11][14] := t*c*0.032;
+        ModelMatrixName[14][11] := t*c*0.032;
+        ModelMatrixName[11][15] := t*c*0.495;
+        ModelMatrixName[15][11] := t*c*0.495;
+        ModelMatrixName[11][16] := t*c*0.229;
+        ModelMatrixName[16][11] := t*c*0.229;
+        ModelMatrixName[11][17] := t*c*0.015;
+        ModelMatrixName[17][11] := t*c*0.015;
+        ModelMatrixName[11][18] := t*c*0.023;
+        ModelMatrixName[18][11] := t*c*0.023;
+        ModelMatrixName[11][19] := t*c*0.095;
+        ModelMatrixName[19][11] := t*c*0.095;
+        ModelMatrixName[12][13] := t*c*0.153;
+        ModelMatrixName[13][12] := t*c*0.153;
+        ModelMatrixName[12][14] := t*c*0.103;
+        ModelMatrixName[14][12] := t*c*0.103;
+        ModelMatrixName[12][15] := t*c*0.245;
+        ModelMatrixName[15][12] := t*c*0.245;
+        ModelMatrixName[12][16] := t*c*0.078;
+        ModelMatrixName[16][12] := t*c*0.078;
+        ModelMatrixName[12][17] := t*c*0.048;
+        ModelMatrixName[17][12] := t*c*0.048;
+        ModelMatrixName[12][18] := t*c*0;
+        ModelMatrixName[18][12] := t*c*0;
+        ModelMatrixName[12][19] := t*c*0;
+        ModelMatrixName[19][12] := t*c*0;
+        ModelMatrixName[13][14] := t*c*0.246;
+        ModelMatrixName[14][13] := t*c*0.246;
+        ModelMatrixName[13][15] := t*c*0.056;
+        ModelMatrixName[15][13] := t*c*0.056;
+        ModelMatrixName[13][16] := t*c*0.053;
+        ModelMatrixName[16][13] := t*c*0.053;
+        ModelMatrixName[13][17] := t*c*0.035;
+        ModelMatrixName[17][13] := t*c*0.035;
+        ModelMatrixName[13][18] := t*c*0;
+        ModelMatrixName[18][13] := t*c*0;
+        ModelMatrixName[13][19] := t*c*0;
+        ModelMatrixName[19][13] := t*c*0;
+        ModelMatrixName[14][15] := t*c*0.154;
+        ModelMatrixName[15][14] := t*c*0.154;
+        ModelMatrixName[14][16] := t*c*0.026;
+        ModelMatrixName[16][14] := t*c*0.026;
+        ModelMatrixName[14][17] := t*c*0.024;
+        ModelMatrixName[17][14] := t*c*0.024;
+        ModelMatrixName[14][18] := t*c*0.201;
+        ModelMatrixName[18][14] := t*c*0.201;
+        ModelMatrixName[14][19] := t*c*0.008;
+        ModelMatrixName[19][14] := t*c*0.008;
+        ModelMatrixName[15][16] := t*c*0.55;
+        ModelMatrixName[16][15] := t*c*0.55;
+        ModelMatrixName[15][17] := t*c*0.03;
+        ModelMatrixName[17][15] := t*c*0.03;
+        ModelMatrixName[15][18] := t*c*0.075;
+        ModelMatrixName[18][15] := t*c*0.075;
+        ModelMatrixName[15][19] := t*c*0.034;
+        ModelMatrixName[19][15] := t*c*0.034;
+        ModelMatrixName[16][17] := t*c*0.157;
+        ModelMatrixName[17][16] := t*c*0.157;
+        ModelMatrixName[16][18] := t*c*0;
+        ModelMatrixName[18][16] := t*c*0;
+        ModelMatrixName[16][19] := t*c*0.042;
+        ModelMatrixName[19][16] := t*c*0.042;
+        ModelMatrixName[17][18] := t*c*0;
+        ModelMatrixName[18][17] := t*c*0;
+        ModelMatrixName[17][19] := t*c*0.028;
+        ModelMatrixName[19][17] := t*c*0.028;
+        ModelMatrixName[18][19] := t*c*0.061;
+        ModelMatrixName[19][18] := t*c*0.061;
+
+	}
+	else
+	{
+        ModelMatrixName[0][1] := t*0.036;
+        ModelMatrixName[1][0] := t*0.036;
+        ModelMatrixName[0][2] := t*0.12;
+        ModelMatrixName[2][0] := t*0.12;
+        ModelMatrixName[0][3] := t*0.198;
+        ModelMatrixName[3][0] := t*0.198;
+        ModelMatrixName[0][4] := t*0.018;
+        ModelMatrixName[4][0] := t*0.018;
+        ModelMatrixName[0][5] := t*0.24;
+        ModelMatrixName[5][0] := t*0.24;
+        ModelMatrixName[0][6] := t*0.023;
+        ModelMatrixName[6][0] := t*0.023;
+        ModelMatrixName[0][7] := t*0.065;
+        ModelMatrixName[7][0] := t*0.065;
+        ModelMatrixName[0][8] := t*0.026;
+        ModelMatrixName[8][0] := t*0.026;
+        ModelMatrixName[0][9] := t*0.041;
+        ModelMatrixName[9][0] := t*0.041;
+        ModelMatrixName[0][10] := t*0.072;
+        ModelMatrixName[10][0] := t*0.072;
+        ModelMatrixName[0][11] := t*0.098;
+        ModelMatrixName[11][0] := t*0.098;
+        ModelMatrixName[0][12] := t*0.25;
+        ModelMatrixName[12][0] := t*0.25;
+        ModelMatrixName[0][13] := t*0.089;
+        ModelMatrixName[13][0] := t*0.089;
+        ModelMatrixName[0][14] := t*0.027;
+        ModelMatrixName[14][0] := t*0.027;
+        ModelMatrixName[0][15] := t*0.409;
+        ModelMatrixName[15][0] := t*0.409;
+        ModelMatrixName[0][16] := t*0.371;
+        ModelMatrixName[16][0] := t*0.371;
+        ModelMatrixName[0][17] := t*0.208;
+        ModelMatrixName[17][0] := t*0.208;
+        ModelMatrixName[0][18] := t*0;
+        ModelMatrixName[18][0] := t*0;
+        ModelMatrixName[0][19] := t*0.024;
+        ModelMatrixName[19][0] := t*0.024;
+        ModelMatrixName[1][2] := t*0;
+        ModelMatrixName[2][1] := t*0;
+        ModelMatrixName[1][3] := t*0;
+        ModelMatrixName[3][1] := t*0;
+        ModelMatrixName[1][4] := t*0;
+        ModelMatrixName[4][1] := t*0;
+        ModelMatrixName[1][5] := t*0.011;
+        ModelMatrixName[5][1] := t*0.011;
+        ModelMatrixName[1][6] := t*0.028;
+        ModelMatrixName[6][1] := t*0.028;
+        ModelMatrixName[1][7] := t*0.044;
+        ModelMatrixName[7][1] := t*0.044;
+        ModelMatrixName[1][8] := t*0;
+        ModelMatrixName[8][1] := t*0;
+        ModelMatrixName[1][9] := t*0;
+        ModelMatrixName[9][1] := t*0;
+        ModelMatrixName[1][10] := t*0;
+        ModelMatrixName[10][1] := t*0;
+        ModelMatrixName[1][11] := t*0;
+        ModelMatrixName[11][1] := t*0;
+        ModelMatrixName[1][12] := t*0.019;
+        ModelMatrixName[12][1] := t*0.019;
+        ModelMatrixName[1][13] := t*0;
+        ModelMatrixName[13][1] := t*0;
+        ModelMatrixName[1][14] := t*0.023;
+        ModelMatrixName[14][1] := t*0.023;
+        ModelMatrixName[1][15] := t*0.161;
+        ModelMatrixName[15][1] := t*0.161;
+        ModelMatrixName[1][16] := t*0.016;
+        ModelMatrixName[16][1] := t*0.016;
+        ModelMatrixName[1][17] := t*0.049;
+        ModelMatrixName[17][1] := t*0.049;
+        ModelMatrixName[1][18] := t*0;
+        ModelMatrixName[18][1] := t*0;
+        ModelMatrixName[1][19] := t*0.096;
+        ModelMatrixName[19][1] := t*0.096;
+        ModelMatrixName[2][3] := t*1.153;
+        ModelMatrixName[3][2] := t*1.153;
+        ModelMatrixName[2][4] := t*0;
+        ModelMatrixName[4][2] := t*0;
+        ModelMatrixName[2][5] := t*0.125;
+        ModelMatrixName[5][2] := t*0.125;
+        ModelMatrixName[2][6] := t*0.086;
+        ModelMatrixName[6][2] := t*0.086;
+        ModelMatrixName[2][7] := t*0.024;
+        ModelMatrixName[7][2] := t*0.024;
+        ModelMatrixName[2][8] := t*0.071;
+        ModelMatrixName[8][2] := t*0.071;
+        ModelMatrixName[2][9] := t*0;
+        ModelMatrixName[9][2] := t*0;
+        ModelMatrixName[2][10] := t*0;
+        ModelMatrixName[10][2] := t*0;
+        ModelMatrixName[2][11] := t*0.905;
+        ModelMatrixName[11][2] := t*0.905;
+        ModelMatrixName[2][12] := t*0.013;
+        ModelMatrixName[12][2] := t*0.013;
+        ModelMatrixName[2][13] := t*0.134;
+        ModelMatrixName[13][2] := t*0.134;
+        ModelMatrixName[2][14] := t*0;
+        ModelMatrixName[14][2] := t*0;
+        ModelMatrixName[2][15] := t*0.095;
+        ModelMatrixName[15][2] := t*0.095;
+        ModelMatrixName[2][16] := t*0.066;
+        ModelMatrixName[16][2] := t*0.066;
+        ModelMatrixName[2][17] := t*0.018;
+        ModelMatrixName[17][2] := t*0.018;
+        ModelMatrixName[2][18] := t*0;
+        ModelMatrixName[18][2] := t*0;
+        ModelMatrixName[2][19] := t*0;
+        ModelMatrixName[19][2] := t*0;
+        ModelMatrixName[3][4] := t*0;
+        ModelMatrixName[4][3] := t*0;
+        ModelMatrixName[3][5] := t*0.081;
+        ModelMatrixName[5][3] := t*0.081;
+        ModelMatrixName[3][6] := t*0.043;
+        ModelMatrixName[6][3] := t*0.043;
+        ModelMatrixName[3][7] := t*0.061;
+        ModelMatrixName[7][3] := t*0.061;
+        ModelMatrixName[3][8] := t*0.083;
+        ModelMatrixName[8][3] := t*0.083;
+        ModelMatrixName[3][9] := t*0.011;
+        ModelMatrixName[9][3] := t*0.011;
+        ModelMatrixName[3][10] := t*0.03;
+        ModelMatrixName[10][3] := t*0.03;
+        ModelMatrixName[3][11] := t*0.148;
+        ModelMatrixName[11][3] := t*0.148;
+        ModelMatrixName[3][12] := t*0.051;
+        ModelMatrixName[12][3] := t*0.051;
+        ModelMatrixName[3][13] := t*0.716;
+        ModelMatrixName[13][3] := t*0.716;
+        ModelMatrixName[3][14] := t*0.001;
+        ModelMatrixName[14][3] := t*0.001;
+        ModelMatrixName[3][15] := t*0.079;
+        ModelMatrixName[15][3] := t*0.079;
+        ModelMatrixName[3][16] := t*0.034;
+        ModelMatrixName[16][3] := t*0.034;
+        ModelMatrixName[3][17] := t*0.037;
+        ModelMatrixName[17][3] := t*0.037;
+        ModelMatrixName[3][18] := t*0;
+        ModelMatrixName[18][3] := t*0;
+        ModelMatrixName[3][19] := t*0.022;
+        ModelMatrixName[19][3] := t*0.022;
+        ModelMatrixName[4][5] := t*0.015;
+        ModelMatrixName[5][4] := t*0.015;
+        ModelMatrixName[4][6] := t*0.048;
+        ModelMatrixName[6][4] := t*0.048;
+        ModelMatrixName[4][7] := t*0.196;
+        ModelMatrixName[7][4] := t*0.196;
+        ModelMatrixName[4][8] := t*0;
+        ModelMatrixName[8][4] := t*0;
+        ModelMatrixName[4][9] := t*0.157;
+        ModelMatrixName[9][4] := t*0.157;
+        ModelMatrixName[4][10] := t*0.092;
+        ModelMatrixName[10][4] := t*0.092;
+        ModelMatrixName[4][11] := t*0.014;
+        ModelMatrixName[11][4] := t*0.014;
+        ModelMatrixName[4][12] := t*0.011;
+        ModelMatrixName[12][4] := t*0.011;
+        ModelMatrixName[4][13] := t*0;
+        ModelMatrixName[13][4] := t*0;
+        ModelMatrixName[4][14] := t*0.014;
+        ModelMatrixName[14][4] := t*0.014;
+        ModelMatrixName[4][15] := t*0.046;
+        ModelMatrixName[15][4] := t*0.046;
+        ModelMatrixName[4][16] := t*0.013;
+        ModelMatrixName[16][4] := t*0.013;
+        ModelMatrixName[4][17] := t*0.012;
+        ModelMatrixName[17][4] := t*0.012;
+        ModelMatrixName[4][18] := t*0.076;
+        ModelMatrixName[18][4] := t*0.076;
+        ModelMatrixName[4][19] := t*0.698;
+        ModelMatrixName[19][4] := t*0.698;
+        ModelMatrixName[5][6] := t*0.01;
+        ModelMatrixName[6][5] := t*0.01;
+        ModelMatrixName[5][7] := t*0;
+        ModelMatrixName[7][5] := t*0;
+        ModelMatrixName[5][8] := t*0.027;
+        ModelMatrixName[8][5] := t*0.027;
+        ModelMatrixName[5][9] := t*0.007;
+        ModelMatrixName[9][5] := t*0.007;
+        ModelMatrixName[5][10] := t*0.017;
+        ModelMatrixName[10][5] := t*0.017;
+        ModelMatrixName[5][11] := t*0.139;
+        ModelMatrixName[11][5] := t*0.139;
+        ModelMatrixName[5][12] := t*0.034;
+        ModelMatrixName[12][5] := t*0.034;
+        ModelMatrixName[5][13] := t*0.028;
+        ModelMatrixName[13][5] := t*0.028;
+        ModelMatrixName[5][14] := t*0.009;
+        ModelMatrixName[14][5] := t*0.009;
+        ModelMatrixName[5][15] := t*0.234;
+        ModelMatrixName[15][5] := t*0.234;
+        ModelMatrixName[5][16] := t*0.03;
+        ModelMatrixName[16][5] := t*0.03;
+        ModelMatrixName[5][17] := t*0.054;
+        ModelMatrixName[17][5] := t*0.054;
+        ModelMatrixName[5][18] := t*0;
+        ModelMatrixName[18][5] := t*0;
+        ModelMatrixName[5][19] := t*0;
+        ModelMatrixName[19][5] := t*0;
+        ModelMatrixName[6][7] := t*0.007;
+        ModelMatrixName[7][6] := t*0.007;
+        ModelMatrixName[6][8] := t*0.026;
+        ModelMatrixName[8][6] := t*0.026;
+        ModelMatrixName[6][9] := t*0.044;
+        ModelMatrixName[9][6] := t*0.044;
+        ModelMatrixName[6][10] := t*0;
+        ModelMatrixName[10][6] := t*0;
+        ModelMatrixName[6][11] := t*0.535;
+        ModelMatrixName[11][6] := t*0.535;
+        ModelMatrixName[6][12] := t*0.094;
+        ModelMatrixName[12][6] := t*0.094;
+        ModelMatrixName[6][13] := t*0.606;
+        ModelMatrixName[13][6] := t*0.606;
+        ModelMatrixName[6][14] := t*0.24;
+        ModelMatrixName[14][6] := t*0.24;
+        ModelMatrixName[6][15] := t*0.035;
+        ModelMatrixName[15][6] := t*0.035;
+        ModelMatrixName[6][16] := t*0.022;
+        ModelMatrixName[16][6] := t*0.022;
+        ModelMatrixName[6][17] := t*0.044;
+        ModelMatrixName[17][6] := t*0.044;
+        ModelMatrixName[6][18] := t*0.027;
+        ModelMatrixName[18][6] := t*0.027;
+        ModelMatrixName[6][19] := t*0.127;
+        ModelMatrixName[19][6] := t*0.127;
+        ModelMatrixName[7][8] := t*0.046;
+        ModelMatrixName[8][7] := t*0.046;
+        ModelMatrixName[7][9] := t*0.257;
+        ModelMatrixName[9][7] := t*0.257;
+        ModelMatrixName[7][10] := t*0.336;
+        ModelMatrixName[10][7] := t*0.336;
+        ModelMatrixName[7][11] := t*0.077;
+        ModelMatrixName[11][7] := t*0.077;
+        ModelMatrixName[7][12] := t*0.012;
+        ModelMatrixName[12][7] := t*0.012;
+        ModelMatrixName[7][13] := t*0.018;
+        ModelMatrixName[13][7] := t*0.018;
+        ModelMatrixName[7][14] := t*0.064;
+        ModelMatrixName[14][7] := t*0.064;
+        ModelMatrixName[7][15] := t*0.024;
+        ModelMatrixName[15][7] := t*0.024;
+        ModelMatrixName[7][16] := t*0.192;
+        ModelMatrixName[16][7] := t*0.192;
+        ModelMatrixName[7][17] := t*0.889;
+        ModelMatrixName[17][7] := t*0.889;
+        ModelMatrixName[7][18] := t*0;
+        ModelMatrixName[18][7] := t*0;
+        ModelMatrixName[7][19] := t*0.037;
+        ModelMatrixName[19][7] := t*0.037;
+        ModelMatrixName[8][9] := t*0.018;
+        ModelMatrixName[9][8] := t*0.018;
+        ModelMatrixName[8][10] := t*0.243;
+        ModelMatrixName[10][8] := t*0.243;
+        ModelMatrixName[8][11] := t*0.318;
+        ModelMatrixName[11][8] := t*0.318;
+        ModelMatrixName[8][12] := t*0.033;
+        ModelMatrixName[12][8] := t*0.033;
+        ModelMatrixName[8][13] := t*0.153;
+        ModelMatrixName[13][8] := t*0.153;
+        ModelMatrixName[8][14] := t*0.464;
+        ModelMatrixName[14][8] := t*0.464;
+        ModelMatrixName[8][15] := t*0.096;
+        ModelMatrixName[15][8] := t*0.096;
+        ModelMatrixName[8][16] := t*0.136;
+        ModelMatrixName[16][8] := t*0.136;
+        ModelMatrixName[8][17] := t*0.01;
+        ModelMatrixName[17][8] := t*0.01;
+        ModelMatrixName[8][18] := t*0;
+        ModelMatrixName[18][8] := t*0;
+        ModelMatrixName[8][19] := t*0.013;
+        ModelMatrixName[19][8] := t*0.013;
+        ModelMatrixName[9][10] := t*0.527;
+        ModelMatrixName[10][9] := t*0.527;
+        ModelMatrixName[9][11] := t*0.034;
+        ModelMatrixName[11][9] := t*0.034;
+        ModelMatrixName[9][12] := t*0.032;
+        ModelMatrixName[12][9] := t*0.032;
+        ModelMatrixName[9][13] := t*0.073;
+        ModelMatrixName[13][9] := t*0.073;
+        ModelMatrixName[9][14] := t*0.015;
+        ModelMatrixName[14][9] := t*0.015;
+        ModelMatrixName[9][15] := t*0.017;
+        ModelMatrixName[15][9] := t*0.017;
+        ModelMatrixName[9][16] := t*0.033;
+        ModelMatrixName[16][9] := t*0.033;
+        ModelMatrixName[9][17] := t*0.175;
+        ModelMatrixName[17][9] := t*0.175;
+        ModelMatrixName[9][18] := t*0.046;
+        ModelMatrixName[18][9] := t*0.046;
+        ModelMatrixName[9][19] := t*0.028;
+        ModelMatrixName[19][9] := t*0.028;
+        ModelMatrixName[10][11] := t*0.001;
+        ModelMatrixName[11][10] := t*0.001;
+        ModelMatrixName[10][12] := t*0.017;
+        ModelMatrixName[12][10] := t*0.017;
+        ModelMatrixName[10][13] := t*0.114;
+        ModelMatrixName[13][10] := t*0.114;
+        ModelMatrixName[10][14] := t*0.09;
+        ModelMatrixName[14][10] := t*0.09;
+        ModelMatrixName[10][15] := t*0.062;
+        ModelMatrixName[15][10] := t*0.062;
+        ModelMatrixName[10][16] := t*0.104;
+        ModelMatrixName[16][10] := t*0.104;
+        ModelMatrixName[10][17] := t*0.258;
+        ModelMatrixName[17][10] := t*0.258;
+        ModelMatrixName[10][18] := t*0;
+        ModelMatrixName[18][10] := t*0;
+        ModelMatrixName[10][19] := t*0;
+        ModelMatrixName[19][10] := t*0;
+        ModelMatrixName[11][12] := t*0.042;
+        ModelMatrixName[12][11] := t*0.042;
+        ModelMatrixName[11][13] := t*0.103;
+        ModelMatrixName[13][11] := t*0.103;
+        ModelMatrixName[11][14] := t*0.032;
+        ModelMatrixName[14][11] := t*0.032;
+        ModelMatrixName[11][15] := t*0.495;
+        ModelMatrixName[15][11] := t*0.495;
+        ModelMatrixName[11][16] := t*0.229;
+        ModelMatrixName[16][11] := t*0.229;
+        ModelMatrixName[11][17] := t*0.015;
+        ModelMatrixName[17][11] := t*0.015;
+        ModelMatrixName[11][18] := t*0.023;
+        ModelMatrixName[18][11] := t*0.023;
+        ModelMatrixName[11][19] := t*0.095;
+        ModelMatrixName[19][11] := t*0.095;
+        ModelMatrixName[12][13] := t*0.153;
+        ModelMatrixName[13][12] := t*0.153;
+        ModelMatrixName[12][14] := t*0.103;
+        ModelMatrixName[14][12] := t*0.103;
+        ModelMatrixName[12][15] := t*0.245;
+        ModelMatrixName[15][12] := t*0.245;
+        ModelMatrixName[12][16] := t*0.078;
+        ModelMatrixName[16][12] := t*0.078;
+        ModelMatrixName[12][17] := t*0.048;
+        ModelMatrixName[17][12] := t*0.048;
+        ModelMatrixName[12][18] := t*0;
+        ModelMatrixName[18][12] := t*0;
+        ModelMatrixName[12][19] := t*0;
+        ModelMatrixName[19][12] := t*0;
+        ModelMatrixName[13][14] := t*0.246;
+        ModelMatrixName[14][13] := t*0.246;
+        ModelMatrixName[13][15] := t*0.056;
+        ModelMatrixName[15][13] := t*0.056;
+        ModelMatrixName[13][16] := t*0.053;
+        ModelMatrixName[16][13] := t*0.053;
+        ModelMatrixName[13][17] := t*0.035;
+        ModelMatrixName[17][13] := t*0.035;
+        ModelMatrixName[13][18] := t*0;
+        ModelMatrixName[18][13] := t*0;
+        ModelMatrixName[13][19] := t*0;
+        ModelMatrixName[19][13] := t*0;
+        ModelMatrixName[14][15] := t*0.154;
+        ModelMatrixName[15][14] := t*0.154;
+        ModelMatrixName[14][16] := t*0.026;
+        ModelMatrixName[16][14] := t*0.026;
+        ModelMatrixName[14][17] := t*0.024;
+        ModelMatrixName[17][14] := t*0.024;
+        ModelMatrixName[14][18] := t*0.201;
+        ModelMatrixName[18][14] := t*0.201;
+        ModelMatrixName[14][19] := t*0.008;
+        ModelMatrixName[19][14] := t*0.008;
+        ModelMatrixName[15][16] := t*0.55;
+        ModelMatrixName[16][15] := t*0.55;
+        ModelMatrixName[15][17] := t*0.03;
+        ModelMatrixName[17][15] := t*0.03;
+        ModelMatrixName[15][18] := t*0.075;
+        ModelMatrixName[18][15] := t*0.075;
+        ModelMatrixName[15][19] := t*0.034;
+        ModelMatrixName[19][15] := t*0.034;
+        ModelMatrixName[16][17] := t*0.157;
+        ModelMatrixName[17][16] := t*0.157;
+        ModelMatrixName[16][18] := t*0;
+        ModelMatrixName[18][16] := t*0;
+        ModelMatrixName[16][19] := t*0.042;
+        ModelMatrixName[19][16] := t*0.042;
+        ModelMatrixName[17][18] := t*0;
+        ModelMatrixName[18][17] := t*0;
+        ModelMatrixName[17][19] := t*0.028;
+        ModelMatrixName[19][17] := t*0.028;
+        ModelMatrixName[18][19] := t*0.061;
+        ModelMatrixName[19][18] := t*0.061;
+	}
+	return 1;
+}
+
+
+equalFreqs={20,1};
+equalFreqs[0][0]=0.087127;
+equalFreqs[14][0]=0.040904;
+equalFreqs[11][0]=0.040432;
+equalFreqs[2][0]=0.046872;
+equalFreqs[1][0]=0.033474;
+equalFreqs[13][0]=0.038255;
+equalFreqs[3][0]=0.04953;
+equalFreqs[5][0]=0.088612;
+equalFreqs[6][0]=0.033618;
+equalFreqs[7][0]=0.036886;
+equalFreqs[9][0]=0.085357;
+equalFreqs[8][0]=0.080482;
+equalFreqs[10][0]=0.014753;
+equalFreqs[4][0]=0.039772;
+equalFreqs[12][0]=0.05068;
+equalFreqs[15][0]=0.069577;
+equalFreqs[16][0]=0.058542;
+equalFreqs[18][0]=0.010494;
+equalFreqs[19][0]=0.029916;
+equalFreqs[17][0]=0.064718;
+
+dayhoffModel = 0;
+MULTIPLY_BY_FREQS = PopulateModelMatrix ("dayhoffModel",equalFreqs);
+Model DayhoffModel = (dayhoffModel, equalFreqs, MULTIPLY_BY_FREQS);
+FREQUENCY_SENSITIVE = 0;
diff --git a/res/TemplateBatchFiles/TemplateModels/Dayhoff_F.mdl b/res/TemplateBatchFiles/TemplateModels/Dayhoff_F.mdl
new file mode 100644
index 0000000..76cfdd6
--- /dev/null
+++ b/res/TemplateBatchFiles/TemplateModels/Dayhoff_F.mdl
@@ -0,0 +1,812 @@
+/* This file defines the transition matrix for the Dayhoff model for amino-acids.
+   The file should be used as follows:
+   
+   1) Read Data File and create datafilter filteredData
+   2) #include this file (or use SelectTemplateModel(filteredData);)
+   3) Define the tree
+   4) Proceed with the likelihood function using 'equalFreqs' as the vector to pass to the constructor.
+   
+   This model has the following signature:
+   	#Short:Dayhoff#
+   	#Desc:Dayhoff model for amino-acids#
+   	#Dimension:20#
+    #DataType:aminoacid#
+   	#FileName:Dayhoff.mdl#
+   
+   12/20/1999  by Sergei L. Kosakovsky Pond
+*/
+
+#include "modelParameters2.mdl";
+
+if (!SKIP_MODEL_PARAMETER_LIST)
+{
+	if (modelType == 1)
+	{
+		#include "defineGamma.mdl";
+	}	
+	if (modelType == 2)
+	{
+		#include "defineHM.mdl";
+	}
+}
+function PopulateModelMatrix (ModelMatrixName&, EFV)
+{
+	ModelMatrixName = {20,20};
+	if (categoriesUsed)
+	{
+        ModelMatrixName[0][1] := t*c*0.036;
+        ModelMatrixName[1][0] := t*c*0.036;
+        ModelMatrixName[0][2] := t*c*0.12;
+        ModelMatrixName[2][0] := t*c*0.12;
+        ModelMatrixName[0][3] := t*c*0.198;
+        ModelMatrixName[3][0] := t*c*0.198;
+        ModelMatrixName[0][4] := t*c*0.018;
+        ModelMatrixName[4][0] := t*c*0.018;
+        ModelMatrixName[0][5] := t*c*0.24;
+        ModelMatrixName[5][0] := t*c*0.24;
+        ModelMatrixName[0][6] := t*c*0.023;
+        ModelMatrixName[6][0] := t*c*0.023;
+        ModelMatrixName[0][7] := t*c*0.065;
+        ModelMatrixName[7][0] := t*c*0.065;
+        ModelMatrixName[0][8] := t*c*0.026;
+        ModelMatrixName[8][0] := t*c*0.026;
+        ModelMatrixName[0][9] := t*c*0.041;
+        ModelMatrixName[9][0] := t*c*0.041;
+        ModelMatrixName[0][10] := t*c*0.072;
+        ModelMatrixName[10][0] := t*c*0.072;
+        ModelMatrixName[0][11] := t*c*0.098;
+        ModelMatrixName[11][0] := t*c*0.098;
+        ModelMatrixName[0][12] := t*c*0.25;
+        ModelMatrixName[12][0] := t*c*0.25;
+        ModelMatrixName[0][13] := t*c*0.089;
+        ModelMatrixName[13][0] := t*c*0.089;
+        ModelMatrixName[0][14] := t*c*0.027;
+        ModelMatrixName[14][0] := t*c*0.027;
+        ModelMatrixName[0][15] := t*c*0.409;
+        ModelMatrixName[15][0] := t*c*0.409;
+        ModelMatrixName[0][16] := t*c*0.371;
+        ModelMatrixName[16][0] := t*c*0.371;
+        ModelMatrixName[0][17] := t*c*0.208;
+        ModelMatrixName[17][0] := t*c*0.208;
+        ModelMatrixName[0][18] := t*c*0;
+        ModelMatrixName[18][0] := t*c*0;
+        ModelMatrixName[0][19] := t*c*0.024;
+        ModelMatrixName[19][0] := t*c*0.024;
+        ModelMatrixName[1][2] := t*c*0;
+        ModelMatrixName[2][1] := t*c*0;
+        ModelMatrixName[1][3] := t*c*0;
+        ModelMatrixName[3][1] := t*c*0;
+        ModelMatrixName[1][4] := t*c*0;
+        ModelMatrixName[4][1] := t*c*0;
+        ModelMatrixName[1][5] := t*c*0.011;
+        ModelMatrixName[5][1] := t*c*0.011;
+        ModelMatrixName[1][6] := t*c*0.028;
+        ModelMatrixName[6][1] := t*c*0.028;
+        ModelMatrixName[1][7] := t*c*0.044;
+        ModelMatrixName[7][1] := t*c*0.044;
+        ModelMatrixName[1][8] := t*c*0;
+        ModelMatrixName[8][1] := t*c*0;
+        ModelMatrixName[1][9] := t*c*0;
+        ModelMatrixName[9][1] := t*c*0;
+        ModelMatrixName[1][10] := t*c*0;
+        ModelMatrixName[10][1] := t*c*0;
+        ModelMatrixName[1][11] := t*c*0;
+        ModelMatrixName[11][1] := t*c*0;
+        ModelMatrixName[1][12] := t*c*0.019;
+        ModelMatrixName[12][1] := t*c*0.019;
+        ModelMatrixName[1][13] := t*c*0;
+        ModelMatrixName[13][1] := t*c*0;
+        ModelMatrixName[1][14] := t*c*0.023;
+        ModelMatrixName[14][1] := t*c*0.023;
+        ModelMatrixName[1][15] := t*c*0.161;
+        ModelMatrixName[15][1] := t*c*0.161;
+        ModelMatrixName[1][16] := t*c*0.016;
+        ModelMatrixName[16][1] := t*c*0.016;
+        ModelMatrixName[1][17] := t*c*0.049;
+        ModelMatrixName[17][1] := t*c*0.049;
+        ModelMatrixName[1][18] := t*c*0;
+        ModelMatrixName[18][1] := t*c*0;
+        ModelMatrixName[1][19] := t*c*0.096;
+        ModelMatrixName[19][1] := t*c*0.096;
+        ModelMatrixName[2][3] := t*c*1.153;
+        ModelMatrixName[3][2] := t*c*1.153;
+        ModelMatrixName[2][4] := t*c*0;
+        ModelMatrixName[4][2] := t*c*0;
+        ModelMatrixName[2][5] := t*c*0.125;
+        ModelMatrixName[5][2] := t*c*0.125;
+        ModelMatrixName[2][6] := t*c*0.086;
+        ModelMatrixName[6][2] := t*c*0.086;
+        ModelMatrixName[2][7] := t*c*0.024;
+        ModelMatrixName[7][2] := t*c*0.024;
+        ModelMatrixName[2][8] := t*c*0.071;
+        ModelMatrixName[8][2] := t*c*0.071;
+        ModelMatrixName[2][9] := t*c*0;
+        ModelMatrixName[9][2] := t*c*0;
+        ModelMatrixName[2][10] := t*c*0;
+        ModelMatrixName[10][2] := t*c*0;
+        ModelMatrixName[2][11] := t*c*0.905;
+        ModelMatrixName[11][2] := t*c*0.905;
+        ModelMatrixName[2][12] := t*c*0.013;
+        ModelMatrixName[12][2] := t*c*0.013;
+        ModelMatrixName[2][13] := t*c*0.134;
+        ModelMatrixName[13][2] := t*c*0.134;
+        ModelMatrixName[2][14] := t*c*0;
+        ModelMatrixName[14][2] := t*c*0;
+        ModelMatrixName[2][15] := t*c*0.095;
+        ModelMatrixName[15][2] := t*c*0.095;
+        ModelMatrixName[2][16] := t*c*0.066;
+        ModelMatrixName[16][2] := t*c*0.066;
+        ModelMatrixName[2][17] := t*c*0.018;
+        ModelMatrixName[17][2] := t*c*0.018;
+        ModelMatrixName[2][18] := t*c*0;
+        ModelMatrixName[18][2] := t*c*0;
+        ModelMatrixName[2][19] := t*c*0;
+        ModelMatrixName[19][2] := t*c*0;
+        ModelMatrixName[3][4] := t*c*0;
+        ModelMatrixName[4][3] := t*c*0;
+        ModelMatrixName[3][5] := t*c*0.081;
+        ModelMatrixName[5][3] := t*c*0.081;
+        ModelMatrixName[3][6] := t*c*0.043;
+        ModelMatrixName[6][3] := t*c*0.043;
+        ModelMatrixName[3][7] := t*c*0.061;
+        ModelMatrixName[7][3] := t*c*0.061;
+        ModelMatrixName[3][8] := t*c*0.083;
+        ModelMatrixName[8][3] := t*c*0.083;
+        ModelMatrixName[3][9] := t*c*0.011;
+        ModelMatrixName[9][3] := t*c*0.011;
+        ModelMatrixName[3][10] := t*c*0.03;
+        ModelMatrixName[10][3] := t*c*0.03;
+        ModelMatrixName[3][11] := t*c*0.148;
+        ModelMatrixName[11][3] := t*c*0.148;
+        ModelMatrixName[3][12] := t*c*0.051;
+        ModelMatrixName[12][3] := t*c*0.051;
+        ModelMatrixName[3][13] := t*c*0.716;
+        ModelMatrixName[13][3] := t*c*0.716;
+        ModelMatrixName[3][14] := t*c*0.001;
+        ModelMatrixName[14][3] := t*c*0.001;
+        ModelMatrixName[3][15] := t*c*0.079;
+        ModelMatrixName[15][3] := t*c*0.079;
+        ModelMatrixName[3][16] := t*c*0.034;
+        ModelMatrixName[16][3] := t*c*0.034;
+        ModelMatrixName[3][17] := t*c*0.037;
+        ModelMatrixName[17][3] := t*c*0.037;
+        ModelMatrixName[3][18] := t*c*0;
+        ModelMatrixName[18][3] := t*c*0;
+        ModelMatrixName[3][19] := t*c*0.022;
+        ModelMatrixName[19][3] := t*c*0.022;
+        ModelMatrixName[4][5] := t*c*0.015;
+        ModelMatrixName[5][4] := t*c*0.015;
+        ModelMatrixName[4][6] := t*c*0.048;
+        ModelMatrixName[6][4] := t*c*0.048;
+        ModelMatrixName[4][7] := t*c*0.196;
+        ModelMatrixName[7][4] := t*c*0.196;
+        ModelMatrixName[4][8] := t*c*0;
+        ModelMatrixName[8][4] := t*c*0;
+        ModelMatrixName[4][9] := t*c*0.157;
+        ModelMatrixName[9][4] := t*c*0.157;
+        ModelMatrixName[4][10] := t*c*0.092;
+        ModelMatrixName[10][4] := t*c*0.092;
+        ModelMatrixName[4][11] := t*c*0.014;
+        ModelMatrixName[11][4] := t*c*0.014;
+        ModelMatrixName[4][12] := t*c*0.011;
+        ModelMatrixName[12][4] := t*c*0.011;
+        ModelMatrixName[4][13] := t*c*0;
+        ModelMatrixName[13][4] := t*c*0;
+        ModelMatrixName[4][14] := t*c*0.014;
+        ModelMatrixName[14][4] := t*c*0.014;
+        ModelMatrixName[4][15] := t*c*0.046;
+        ModelMatrixName[15][4] := t*c*0.046;
+        ModelMatrixName[4][16] := t*c*0.013;
+        ModelMatrixName[16][4] := t*c*0.013;
+        ModelMatrixName[4][17] := t*c*0.012;
+        ModelMatrixName[17][4] := t*c*0.012;
+        ModelMatrixName[4][18] := t*c*0.076;
+        ModelMatrixName[18][4] := t*c*0.076;
+        ModelMatrixName[4][19] := t*c*0.698;
+        ModelMatrixName[19][4] := t*c*0.698;
+        ModelMatrixName[5][6] := t*c*0.01;
+        ModelMatrixName[6][5] := t*c*0.01;
+        ModelMatrixName[5][7] := t*c*0;
+        ModelMatrixName[7][5] := t*c*0;
+        ModelMatrixName[5][8] := t*c*0.027;
+        ModelMatrixName[8][5] := t*c*0.027;
+        ModelMatrixName[5][9] := t*c*0.007;
+        ModelMatrixName[9][5] := t*c*0.007;
+        ModelMatrixName[5][10] := t*c*0.017;
+        ModelMatrixName[10][5] := t*c*0.017;
+        ModelMatrixName[5][11] := t*c*0.139;
+        ModelMatrixName[11][5] := t*c*0.139;
+        ModelMatrixName[5][12] := t*c*0.034;
+        ModelMatrixName[12][5] := t*c*0.034;
+        ModelMatrixName[5][13] := t*c*0.028;
+        ModelMatrixName[13][5] := t*c*0.028;
+        ModelMatrixName[5][14] := t*c*0.009;
+        ModelMatrixName[14][5] := t*c*0.009;
+        ModelMatrixName[5][15] := t*c*0.234;
+        ModelMatrixName[15][5] := t*c*0.234;
+        ModelMatrixName[5][16] := t*c*0.03;
+        ModelMatrixName[16][5] := t*c*0.03;
+        ModelMatrixName[5][17] := t*c*0.054;
+        ModelMatrixName[17][5] := t*c*0.054;
+        ModelMatrixName[5][18] := t*c*0;
+        ModelMatrixName[18][5] := t*c*0;
+        ModelMatrixName[5][19] := t*c*0;
+        ModelMatrixName[19][5] := t*c*0;
+        ModelMatrixName[6][7] := t*c*0.007;
+        ModelMatrixName[7][6] := t*c*0.007;
+        ModelMatrixName[6][8] := t*c*0.026;
+        ModelMatrixName[8][6] := t*c*0.026;
+        ModelMatrixName[6][9] := t*c*0.044;
+        ModelMatrixName[9][6] := t*c*0.044;
+        ModelMatrixName[6][10] := t*c*0;
+        ModelMatrixName[10][6] := t*c*0;
+        ModelMatrixName[6][11] := t*c*0.535;
+        ModelMatrixName[11][6] := t*c*0.535;
+        ModelMatrixName[6][12] := t*c*0.094;
+        ModelMatrixName[12][6] := t*c*0.094;
+        ModelMatrixName[6][13] := t*c*0.606;
+        ModelMatrixName[13][6] := t*c*0.606;
+        ModelMatrixName[6][14] := t*c*0.24;
+        ModelMatrixName[14][6] := t*c*0.24;
+        ModelMatrixName[6][15] := t*c*0.035;
+        ModelMatrixName[15][6] := t*c*0.035;
+        ModelMatrixName[6][16] := t*c*0.022;
+        ModelMatrixName[16][6] := t*c*0.022;
+        ModelMatrixName[6][17] := t*c*0.044;
+        ModelMatrixName[17][6] := t*c*0.044;
+        ModelMatrixName[6][18] := t*c*0.027;
+        ModelMatrixName[18][6] := t*c*0.027;
+        ModelMatrixName[6][19] := t*c*0.127;
+        ModelMatrixName[19][6] := t*c*0.127;
+        ModelMatrixName[7][8] := t*c*0.046;
+        ModelMatrixName[8][7] := t*c*0.046;
+        ModelMatrixName[7][9] := t*c*0.257;
+        ModelMatrixName[9][7] := t*c*0.257;
+        ModelMatrixName[7][10] := t*c*0.336;
+        ModelMatrixName[10][7] := t*c*0.336;
+        ModelMatrixName[7][11] := t*c*0.077;
+        ModelMatrixName[11][7] := t*c*0.077;
+        ModelMatrixName[7][12] := t*c*0.012;
+        ModelMatrixName[12][7] := t*c*0.012;
+        ModelMatrixName[7][13] := t*c*0.018;
+        ModelMatrixName[13][7] := t*c*0.018;
+        ModelMatrixName[7][14] := t*c*0.064;
+        ModelMatrixName[14][7] := t*c*0.064;
+        ModelMatrixName[7][15] := t*c*0.024;
+        ModelMatrixName[15][7] := t*c*0.024;
+        ModelMatrixName[7][16] := t*c*0.192;
+        ModelMatrixName[16][7] := t*c*0.192;
+        ModelMatrixName[7][17] := t*c*0.889;
+        ModelMatrixName[17][7] := t*c*0.889;
+        ModelMatrixName[7][18] := t*c*0;
+        ModelMatrixName[18][7] := t*c*0;
+        ModelMatrixName[7][19] := t*c*0.037;
+        ModelMatrixName[19][7] := t*c*0.037;
+        ModelMatrixName[8][9] := t*c*0.018;
+        ModelMatrixName[9][8] := t*c*0.018;
+        ModelMatrixName[8][10] := t*c*0.243;
+        ModelMatrixName[10][8] := t*c*0.243;
+        ModelMatrixName[8][11] := t*c*0.318;
+        ModelMatrixName[11][8] := t*c*0.318;
+        ModelMatrixName[8][12] := t*c*0.033;
+        ModelMatrixName[12][8] := t*c*0.033;
+        ModelMatrixName[8][13] := t*c*0.153;
+        ModelMatrixName[13][8] := t*c*0.153;
+        ModelMatrixName[8][14] := t*c*0.464;
+        ModelMatrixName[14][8] := t*c*0.464;
+        ModelMatrixName[8][15] := t*c*0.096;
+        ModelMatrixName[15][8] := t*c*0.096;
+        ModelMatrixName[8][16] := t*c*0.136;
+        ModelMatrixName[16][8] := t*c*0.136;
+        ModelMatrixName[8][17] := t*c*0.01;
+        ModelMatrixName[17][8] := t*c*0.01;
+        ModelMatrixName[8][18] := t*c*0;
+        ModelMatrixName[18][8] := t*c*0;
+        ModelMatrixName[8][19] := t*c*0.013;
+        ModelMatrixName[19][8] := t*c*0.013;
+        ModelMatrixName[9][10] := t*c*0.527;
+        ModelMatrixName[10][9] := t*c*0.527;
+        ModelMatrixName[9][11] := t*c*0.034;
+        ModelMatrixName[11][9] := t*c*0.034;
+        ModelMatrixName[9][12] := t*c*0.032;
+        ModelMatrixName[12][9] := t*c*0.032;
+        ModelMatrixName[9][13] := t*c*0.073;
+        ModelMatrixName[13][9] := t*c*0.073;
+        ModelMatrixName[9][14] := t*c*0.015;
+        ModelMatrixName[14][9] := t*c*0.015;
+        ModelMatrixName[9][15] := t*c*0.017;
+        ModelMatrixName[15][9] := t*c*0.017;
+        ModelMatrixName[9][16] := t*c*0.033;
+        ModelMatrixName[16][9] := t*c*0.033;
+        ModelMatrixName[9][17] := t*c*0.175;
+        ModelMatrixName[17][9] := t*c*0.175;
+        ModelMatrixName[9][18] := t*c*0.046;
+        ModelMatrixName[18][9] := t*c*0.046;
+        ModelMatrixName[9][19] := t*c*0.028;
+        ModelMatrixName[19][9] := t*c*0.028;
+        ModelMatrixName[10][11] := t*c*0.001;
+        ModelMatrixName[11][10] := t*c*0.001;
+        ModelMatrixName[10][12] := t*c*0.017;
+        ModelMatrixName[12][10] := t*c*0.017;
+        ModelMatrixName[10][13] := t*c*0.114;
+        ModelMatrixName[13][10] := t*c*0.114;
+        ModelMatrixName[10][14] := t*c*0.09;
+        ModelMatrixName[14][10] := t*c*0.09;
+        ModelMatrixName[10][15] := t*c*0.062;
+        ModelMatrixName[15][10] := t*c*0.062;
+        ModelMatrixName[10][16] := t*c*0.104;
+        ModelMatrixName[16][10] := t*c*0.104;
+        ModelMatrixName[10][17] := t*c*0.258;
+        ModelMatrixName[17][10] := t*c*0.258;
+        ModelMatrixName[10][18] := t*c*0;
+        ModelMatrixName[18][10] := t*c*0;
+        ModelMatrixName[10][19] := t*c*0;
+        ModelMatrixName[19][10] := t*c*0;
+        ModelMatrixName[11][12] := t*c*0.042;
+        ModelMatrixName[12][11] := t*c*0.042;
+        ModelMatrixName[11][13] := t*c*0.103;
+        ModelMatrixName[13][11] := t*c*0.103;
+        ModelMatrixName[11][14] := t*c*0.032;
+        ModelMatrixName[14][11] := t*c*0.032;
+        ModelMatrixName[11][15] := t*c*0.495;
+        ModelMatrixName[15][11] := t*c*0.495;
+        ModelMatrixName[11][16] := t*c*0.229;
+        ModelMatrixName[16][11] := t*c*0.229;
+        ModelMatrixName[11][17] := t*c*0.015;
+        ModelMatrixName[17][11] := t*c*0.015;
+        ModelMatrixName[11][18] := t*c*0.023;
+        ModelMatrixName[18][11] := t*c*0.023;
+        ModelMatrixName[11][19] := t*c*0.095;
+        ModelMatrixName[19][11] := t*c*0.095;
+        ModelMatrixName[12][13] := t*c*0.153;
+        ModelMatrixName[13][12] := t*c*0.153;
+        ModelMatrixName[12][14] := t*c*0.103;
+        ModelMatrixName[14][12] := t*c*0.103;
+        ModelMatrixName[12][15] := t*c*0.245;
+        ModelMatrixName[15][12] := t*c*0.245;
+        ModelMatrixName[12][16] := t*c*0.078;
+        ModelMatrixName[16][12] := t*c*0.078;
+        ModelMatrixName[12][17] := t*c*0.048;
+        ModelMatrixName[17][12] := t*c*0.048;
+        ModelMatrixName[12][18] := t*c*0;
+        ModelMatrixName[18][12] := t*c*0;
+        ModelMatrixName[12][19] := t*c*0;
+        ModelMatrixName[19][12] := t*c*0;
+        ModelMatrixName[13][14] := t*c*0.246;
+        ModelMatrixName[14][13] := t*c*0.246;
+        ModelMatrixName[13][15] := t*c*0.056;
+        ModelMatrixName[15][13] := t*c*0.056;
+        ModelMatrixName[13][16] := t*c*0.053;
+        ModelMatrixName[16][13] := t*c*0.053;
+        ModelMatrixName[13][17] := t*c*0.035;
+        ModelMatrixName[17][13] := t*c*0.035;
+        ModelMatrixName[13][18] := t*c*0;
+        ModelMatrixName[18][13] := t*c*0;
+        ModelMatrixName[13][19] := t*c*0;
+        ModelMatrixName[19][13] := t*c*0;
+        ModelMatrixName[14][15] := t*c*0.154;
+        ModelMatrixName[15][14] := t*c*0.154;
+        ModelMatrixName[14][16] := t*c*0.026;
+        ModelMatrixName[16][14] := t*c*0.026;
+        ModelMatrixName[14][17] := t*c*0.024;
+        ModelMatrixName[17][14] := t*c*0.024;
+        ModelMatrixName[14][18] := t*c*0.201;
+        ModelMatrixName[18][14] := t*c*0.201;
+        ModelMatrixName[14][19] := t*c*0.008;
+        ModelMatrixName[19][14] := t*c*0.008;
+        ModelMatrixName[15][16] := t*c*0.55;
+        ModelMatrixName[16][15] := t*c*0.55;
+        ModelMatrixName[15][17] := t*c*0.03;
+        ModelMatrixName[17][15] := t*c*0.03;
+        ModelMatrixName[15][18] := t*c*0.075;
+        ModelMatrixName[18][15] := t*c*0.075;
+        ModelMatrixName[15][19] := t*c*0.034;
+        ModelMatrixName[19][15] := t*c*0.034;
+        ModelMatrixName[16][17] := t*c*0.157;
+        ModelMatrixName[17][16] := t*c*0.157;
+        ModelMatrixName[16][18] := t*c*0;
+        ModelMatrixName[18][16] := t*c*0;
+        ModelMatrixName[16][19] := t*c*0.042;
+        ModelMatrixName[19][16] := t*c*0.042;
+        ModelMatrixName[17][18] := t*c*0;
+        ModelMatrixName[18][17] := t*c*0;
+        ModelMatrixName[17][19] := t*c*0.028;
+        ModelMatrixName[19][17] := t*c*0.028;
+        ModelMatrixName[18][19] := t*c*0.061;
+        ModelMatrixName[19][18] := t*c*0.061;
+
+	}
+	else
+	{
+        ModelMatrixName[0][1] := t*0.036;
+        ModelMatrixName[1][0] := t*0.036;
+        ModelMatrixName[0][2] := t*0.12;
+        ModelMatrixName[2][0] := t*0.12;
+        ModelMatrixName[0][3] := t*0.198;
+        ModelMatrixName[3][0] := t*0.198;
+        ModelMatrixName[0][4] := t*0.018;
+        ModelMatrixName[4][0] := t*0.018;
+        ModelMatrixName[0][5] := t*0.24;
+        ModelMatrixName[5][0] := t*0.24;
+        ModelMatrixName[0][6] := t*0.023;
+        ModelMatrixName[6][0] := t*0.023;
+        ModelMatrixName[0][7] := t*0.065;
+        ModelMatrixName[7][0] := t*0.065;
+        ModelMatrixName[0][8] := t*0.026;
+        ModelMatrixName[8][0] := t*0.026;
+        ModelMatrixName[0][9] := t*0.041;
+        ModelMatrixName[9][0] := t*0.041;
+        ModelMatrixName[0][10] := t*0.072;
+        ModelMatrixName[10][0] := t*0.072;
+        ModelMatrixName[0][11] := t*0.098;
+        ModelMatrixName[11][0] := t*0.098;
+        ModelMatrixName[0][12] := t*0.25;
+        ModelMatrixName[12][0] := t*0.25;
+        ModelMatrixName[0][13] := t*0.089;
+        ModelMatrixName[13][0] := t*0.089;
+        ModelMatrixName[0][14] := t*0.027;
+        ModelMatrixName[14][0] := t*0.027;
+        ModelMatrixName[0][15] := t*0.409;
+        ModelMatrixName[15][0] := t*0.409;
+        ModelMatrixName[0][16] := t*0.371;
+        ModelMatrixName[16][0] := t*0.371;
+        ModelMatrixName[0][17] := t*0.208;
+        ModelMatrixName[17][0] := t*0.208;
+        ModelMatrixName[0][18] := t*0;
+        ModelMatrixName[18][0] := t*0;
+        ModelMatrixName[0][19] := t*0.024;
+        ModelMatrixName[19][0] := t*0.024;
+        ModelMatrixName[1][2] := t*0;
+        ModelMatrixName[2][1] := t*0;
+        ModelMatrixName[1][3] := t*0;
+        ModelMatrixName[3][1] := t*0;
+        ModelMatrixName[1][4] := t*0;
+        ModelMatrixName[4][1] := t*0;
+        ModelMatrixName[1][5] := t*0.011;
+        ModelMatrixName[5][1] := t*0.011;
+        ModelMatrixName[1][6] := t*0.028;
+        ModelMatrixName[6][1] := t*0.028;
+        ModelMatrixName[1][7] := t*0.044;
+        ModelMatrixName[7][1] := t*0.044;
+        ModelMatrixName[1][8] := t*0;
+        ModelMatrixName[8][1] := t*0;
+        ModelMatrixName[1][9] := t*0;
+        ModelMatrixName[9][1] := t*0;
+        ModelMatrixName[1][10] := t*0;
+        ModelMatrixName[10][1] := t*0;
+        ModelMatrixName[1][11] := t*0;
+        ModelMatrixName[11][1] := t*0;
+        ModelMatrixName[1][12] := t*0.019;
+        ModelMatrixName[12][1] := t*0.019;
+        ModelMatrixName[1][13] := t*0;
+        ModelMatrixName[13][1] := t*0;
+        ModelMatrixName[1][14] := t*0.023;
+        ModelMatrixName[14][1] := t*0.023;
+        ModelMatrixName[1][15] := t*0.161;
+        ModelMatrixName[15][1] := t*0.161;
+        ModelMatrixName[1][16] := t*0.016;
+        ModelMatrixName[16][1] := t*0.016;
+        ModelMatrixName[1][17] := t*0.049;
+        ModelMatrixName[17][1] := t*0.049;
+        ModelMatrixName[1][18] := t*0;
+        ModelMatrixName[18][1] := t*0;
+        ModelMatrixName[1][19] := t*0.096;
+        ModelMatrixName[19][1] := t*0.096;
+        ModelMatrixName[2][3] := t*1.153;
+        ModelMatrixName[3][2] := t*1.153;
+        ModelMatrixName[2][4] := t*0;
+        ModelMatrixName[4][2] := t*0;
+        ModelMatrixName[2][5] := t*0.125;
+        ModelMatrixName[5][2] := t*0.125;
+        ModelMatrixName[2][6] := t*0.086;
+        ModelMatrixName[6][2] := t*0.086;
+        ModelMatrixName[2][7] := t*0.024;
+        ModelMatrixName[7][2] := t*0.024;
+        ModelMatrixName[2][8] := t*0.071;
+        ModelMatrixName[8][2] := t*0.071;
+        ModelMatrixName[2][9] := t*0;
+        ModelMatrixName[9][2] := t*0;
+        ModelMatrixName[2][10] := t*0;
+        ModelMatrixName[10][2] := t*0;
+        ModelMatrixName[2][11] := t*0.905;
+        ModelMatrixName[11][2] := t*0.905;
+        ModelMatrixName[2][12] := t*0.013;
+        ModelMatrixName[12][2] := t*0.013;
+        ModelMatrixName[2][13] := t*0.134;
+        ModelMatrixName[13][2] := t*0.134;
+        ModelMatrixName[2][14] := t*0;
+        ModelMatrixName[14][2] := t*0;
+        ModelMatrixName[2][15] := t*0.095;
+        ModelMatrixName[15][2] := t*0.095;
+        ModelMatrixName[2][16] := t*0.066;
+        ModelMatrixName[16][2] := t*0.066;
+        ModelMatrixName[2][17] := t*0.018;
+        ModelMatrixName[17][2] := t*0.018;
+        ModelMatrixName[2][18] := t*0;
+        ModelMatrixName[18][2] := t*0;
+        ModelMatrixName[2][19] := t*0;
+        ModelMatrixName[19][2] := t*0;
+        ModelMatrixName[3][4] := t*0;
+        ModelMatrixName[4][3] := t*0;
+        ModelMatrixName[3][5] := t*0.081;
+        ModelMatrixName[5][3] := t*0.081;
+        ModelMatrixName[3][6] := t*0.043;
+        ModelMatrixName[6][3] := t*0.043;
+        ModelMatrixName[3][7] := t*0.061;
+        ModelMatrixName[7][3] := t*0.061;
+        ModelMatrixName[3][8] := t*0.083;
+        ModelMatrixName[8][3] := t*0.083;
+        ModelMatrixName[3][9] := t*0.011;
+        ModelMatrixName[9][3] := t*0.011;
+        ModelMatrixName[3][10] := t*0.03;
+        ModelMatrixName[10][3] := t*0.03;
+        ModelMatrixName[3][11] := t*0.148;
+        ModelMatrixName[11][3] := t*0.148;
+        ModelMatrixName[3][12] := t*0.051;
+        ModelMatrixName[12][3] := t*0.051;
+        ModelMatrixName[3][13] := t*0.716;
+        ModelMatrixName[13][3] := t*0.716;
+        ModelMatrixName[3][14] := t*0.001;
+        ModelMatrixName[14][3] := t*0.001;
+        ModelMatrixName[3][15] := t*0.079;
+        ModelMatrixName[15][3] := t*0.079;
+        ModelMatrixName[3][16] := t*0.034;
+        ModelMatrixName[16][3] := t*0.034;
+        ModelMatrixName[3][17] := t*0.037;
+        ModelMatrixName[17][3] := t*0.037;
+        ModelMatrixName[3][18] := t*0;
+        ModelMatrixName[18][3] := t*0;
+        ModelMatrixName[3][19] := t*0.022;
+        ModelMatrixName[19][3] := t*0.022;
+        ModelMatrixName[4][5] := t*0.015;
+        ModelMatrixName[5][4] := t*0.015;
+        ModelMatrixName[4][6] := t*0.048;
+        ModelMatrixName[6][4] := t*0.048;
+        ModelMatrixName[4][7] := t*0.196;
+        ModelMatrixName[7][4] := t*0.196;
+        ModelMatrixName[4][8] := t*0;
+        ModelMatrixName[8][4] := t*0;
+        ModelMatrixName[4][9] := t*0.157;
+        ModelMatrixName[9][4] := t*0.157;
+        ModelMatrixName[4][10] := t*0.092;
+        ModelMatrixName[10][4] := t*0.092;
+        ModelMatrixName[4][11] := t*0.014;
+        ModelMatrixName[11][4] := t*0.014;
+        ModelMatrixName[4][12] := t*0.011;
+        ModelMatrixName[12][4] := t*0.011;
+        ModelMatrixName[4][13] := t*0;
+        ModelMatrixName[13][4] := t*0;
+        ModelMatrixName[4][14] := t*0.014;
+        ModelMatrixName[14][4] := t*0.014;
+        ModelMatrixName[4][15] := t*0.046;
+        ModelMatrixName[15][4] := t*0.046;
+        ModelMatrixName[4][16] := t*0.013;
+        ModelMatrixName[16][4] := t*0.013;
+        ModelMatrixName[4][17] := t*0.012;
+        ModelMatrixName[17][4] := t*0.012;
+        ModelMatrixName[4][18] := t*0.076;
+        ModelMatrixName[18][4] := t*0.076;
+        ModelMatrixName[4][19] := t*0.698;
+        ModelMatrixName[19][4] := t*0.698;
+        ModelMatrixName[5][6] := t*0.01;
+        ModelMatrixName[6][5] := t*0.01;
+        ModelMatrixName[5][7] := t*0;
+        ModelMatrixName[7][5] := t*0;
+        ModelMatrixName[5][8] := t*0.027;
+        ModelMatrixName[8][5] := t*0.027;
+        ModelMatrixName[5][9] := t*0.007;
+        ModelMatrixName[9][5] := t*0.007;
+        ModelMatrixName[5][10] := t*0.017;
+        ModelMatrixName[10][5] := t*0.017;
+        ModelMatrixName[5][11] := t*0.139;
+        ModelMatrixName[11][5] := t*0.139;
+        ModelMatrixName[5][12] := t*0.034;
+        ModelMatrixName[12][5] := t*0.034;
+        ModelMatrixName[5][13] := t*0.028;
+        ModelMatrixName[13][5] := t*0.028;
+        ModelMatrixName[5][14] := t*0.009;
+        ModelMatrixName[14][5] := t*0.009;
+        ModelMatrixName[5][15] := t*0.234;
+        ModelMatrixName[15][5] := t*0.234;
+        ModelMatrixName[5][16] := t*0.03;
+        ModelMatrixName[16][5] := t*0.03;
+        ModelMatrixName[5][17] := t*0.054;
+        ModelMatrixName[17][5] := t*0.054;
+        ModelMatrixName[5][18] := t*0;
+        ModelMatrixName[18][5] := t*0;
+        ModelMatrixName[5][19] := t*0;
+        ModelMatrixName[19][5] := t*0;
+        ModelMatrixName[6][7] := t*0.007;
+        ModelMatrixName[7][6] := t*0.007;
+        ModelMatrixName[6][8] := t*0.026;
+        ModelMatrixName[8][6] := t*0.026;
+        ModelMatrixName[6][9] := t*0.044;
+        ModelMatrixName[9][6] := t*0.044;
+        ModelMatrixName[6][10] := t*0;
+        ModelMatrixName[10][6] := t*0;
+        ModelMatrixName[6][11] := t*0.535;
+        ModelMatrixName[11][6] := t*0.535;
+        ModelMatrixName[6][12] := t*0.094;
+        ModelMatrixName[12][6] := t*0.094;
+        ModelMatrixName[6][13] := t*0.606;
+        ModelMatrixName[13][6] := t*0.606;
+        ModelMatrixName[6][14] := t*0.24;
+        ModelMatrixName[14][6] := t*0.24;
+        ModelMatrixName[6][15] := t*0.035;
+        ModelMatrixName[15][6] := t*0.035;
+        ModelMatrixName[6][16] := t*0.022;
+        ModelMatrixName[16][6] := t*0.022;
+        ModelMatrixName[6][17] := t*0.044;
+        ModelMatrixName[17][6] := t*0.044;
+        ModelMatrixName[6][18] := t*0.027;
+        ModelMatrixName[18][6] := t*0.027;
+        ModelMatrixName[6][19] := t*0.127;
+        ModelMatrixName[19][6] := t*0.127;
+        ModelMatrixName[7][8] := t*0.046;
+        ModelMatrixName[8][7] := t*0.046;
+        ModelMatrixName[7][9] := t*0.257;
+        ModelMatrixName[9][7] := t*0.257;
+        ModelMatrixName[7][10] := t*0.336;
+        ModelMatrixName[10][7] := t*0.336;
+        ModelMatrixName[7][11] := t*0.077;
+        ModelMatrixName[11][7] := t*0.077;
+        ModelMatrixName[7][12] := t*0.012;
+        ModelMatrixName[12][7] := t*0.012;
+        ModelMatrixName[7][13] := t*0.018;
+        ModelMatrixName[13][7] := t*0.018;
+        ModelMatrixName[7][14] := t*0.064;
+        ModelMatrixName[14][7] := t*0.064;
+        ModelMatrixName[7][15] := t*0.024;
+        ModelMatrixName[15][7] := t*0.024;
+        ModelMatrixName[7][16] := t*0.192;
+        ModelMatrixName[16][7] := t*0.192;
+        ModelMatrixName[7][17] := t*0.889;
+        ModelMatrixName[17][7] := t*0.889;
+        ModelMatrixName[7][18] := t*0;
+        ModelMatrixName[18][7] := t*0;
+        ModelMatrixName[7][19] := t*0.037;
+        ModelMatrixName[19][7] := t*0.037;
+        ModelMatrixName[8][9] := t*0.018;
+        ModelMatrixName[9][8] := t*0.018;
+        ModelMatrixName[8][10] := t*0.243;
+        ModelMatrixName[10][8] := t*0.243;
+        ModelMatrixName[8][11] := t*0.318;
+        ModelMatrixName[11][8] := t*0.318;
+        ModelMatrixName[8][12] := t*0.033;
+        ModelMatrixName[12][8] := t*0.033;
+        ModelMatrixName[8][13] := t*0.153;
+        ModelMatrixName[13][8] := t*0.153;
+        ModelMatrixName[8][14] := t*0.464;
+        ModelMatrixName[14][8] := t*0.464;
+        ModelMatrixName[8][15] := t*0.096;
+        ModelMatrixName[15][8] := t*0.096;
+        ModelMatrixName[8][16] := t*0.136;
+        ModelMatrixName[16][8] := t*0.136;
+        ModelMatrixName[8][17] := t*0.01;
+        ModelMatrixName[17][8] := t*0.01;
+        ModelMatrixName[8][18] := t*0;
+        ModelMatrixName[18][8] := t*0;
+        ModelMatrixName[8][19] := t*0.013;
+        ModelMatrixName[19][8] := t*0.013;
+        ModelMatrixName[9][10] := t*0.527;
+        ModelMatrixName[10][9] := t*0.527;
+        ModelMatrixName[9][11] := t*0.034;
+        ModelMatrixName[11][9] := t*0.034;
+        ModelMatrixName[9][12] := t*0.032;
+        ModelMatrixName[12][9] := t*0.032;
+        ModelMatrixName[9][13] := t*0.073;
+        ModelMatrixName[13][9] := t*0.073;
+        ModelMatrixName[9][14] := t*0.015;
+        ModelMatrixName[14][9] := t*0.015;
+        ModelMatrixName[9][15] := t*0.017;
+        ModelMatrixName[15][9] := t*0.017;
+        ModelMatrixName[9][16] := t*0.033;
+        ModelMatrixName[16][9] := t*0.033;
+        ModelMatrixName[9][17] := t*0.175;
+        ModelMatrixName[17][9] := t*0.175;
+        ModelMatrixName[9][18] := t*0.046;
+        ModelMatrixName[18][9] := t*0.046;
+        ModelMatrixName[9][19] := t*0.028;
+        ModelMatrixName[19][9] := t*0.028;
+        ModelMatrixName[10][11] := t*0.001;
+        ModelMatrixName[11][10] := t*0.001;
+        ModelMatrixName[10][12] := t*0.017;
+        ModelMatrixName[12][10] := t*0.017;
+        ModelMatrixName[10][13] := t*0.114;
+        ModelMatrixName[13][10] := t*0.114;
+        ModelMatrixName[10][14] := t*0.09;
+        ModelMatrixName[14][10] := t*0.09;
+        ModelMatrixName[10][15] := t*0.062;
+        ModelMatrixName[15][10] := t*0.062;
+        ModelMatrixName[10][16] := t*0.104;
+        ModelMatrixName[16][10] := t*0.104;
+        ModelMatrixName[10][17] := t*0.258;
+        ModelMatrixName[17][10] := t*0.258;
+        ModelMatrixName[10][18] := t*0;
+        ModelMatrixName[18][10] := t*0;
+        ModelMatrixName[10][19] := t*0;
+        ModelMatrixName[19][10] := t*0;
+        ModelMatrixName[11][12] := t*0.042;
+        ModelMatrixName[12][11] := t*0.042;
+        ModelMatrixName[11][13] := t*0.103;
+        ModelMatrixName[13][11] := t*0.103;
+        ModelMatrixName[11][14] := t*0.032;
+        ModelMatrixName[14][11] := t*0.032;
+        ModelMatrixName[11][15] := t*0.495;
+        ModelMatrixName[15][11] := t*0.495;
+        ModelMatrixName[11][16] := t*0.229;
+        ModelMatrixName[16][11] := t*0.229;
+        ModelMatrixName[11][17] := t*0.015;
+        ModelMatrixName[17][11] := t*0.015;
+        ModelMatrixName[11][18] := t*0.023;
+        ModelMatrixName[18][11] := t*0.023;
+        ModelMatrixName[11][19] := t*0.095;
+        ModelMatrixName[19][11] := t*0.095;
+        ModelMatrixName[12][13] := t*0.153;
+        ModelMatrixName[13][12] := t*0.153;
+        ModelMatrixName[12][14] := t*0.103;
+        ModelMatrixName[14][12] := t*0.103;
+        ModelMatrixName[12][15] := t*0.245;
+        ModelMatrixName[15][12] := t*0.245;
+        ModelMatrixName[12][16] := t*0.078;
+        ModelMatrixName[16][12] := t*0.078;
+        ModelMatrixName[12][17] := t*0.048;
+        ModelMatrixName[17][12] := t*0.048;
+        ModelMatrixName[12][18] := t*0;
+        ModelMatrixName[18][12] := t*0;
+        ModelMatrixName[12][19] := t*0;
+        ModelMatrixName[19][12] := t*0;
+        ModelMatrixName[13][14] := t*0.246;
+        ModelMatrixName[14][13] := t*0.246;
+        ModelMatrixName[13][15] := t*0.056;
+        ModelMatrixName[15][13] := t*0.056;
+        ModelMatrixName[13][16] := t*0.053;
+        ModelMatrixName[16][13] := t*0.053;
+        ModelMatrixName[13][17] := t*0.035;
+        ModelMatrixName[17][13] := t*0.035;
+        ModelMatrixName[13][18] := t*0;
+        ModelMatrixName[18][13] := t*0;
+        ModelMatrixName[13][19] := t*0;
+        ModelMatrixName[19][13] := t*0;
+        ModelMatrixName[14][15] := t*0.154;
+        ModelMatrixName[15][14] := t*0.154;
+        ModelMatrixName[14][16] := t*0.026;
+        ModelMatrixName[16][14] := t*0.026;
+        ModelMatrixName[14][17] := t*0.024;
+        ModelMatrixName[17][14] := t*0.024;
+        ModelMatrixName[14][18] := t*0.201;
+        ModelMatrixName[18][14] := t*0.201;
+        ModelMatrixName[14][19] := t*0.008;
+        ModelMatrixName[19][14] := t*0.008;
+        ModelMatrixName[15][16] := t*0.55;
+        ModelMatrixName[16][15] := t*0.55;
+        ModelMatrixName[15][17] := t*0.03;
+        ModelMatrixName[17][15] := t*0.03;
+        ModelMatrixName[15][18] := t*0.075;
+        ModelMatrixName[18][15] := t*0.075;
+        ModelMatrixName[15][19] := t*0.034;
+        ModelMatrixName[19][15] := t*0.034;
+        ModelMatrixName[16][17] := t*0.157;
+        ModelMatrixName[17][16] := t*0.157;
+        ModelMatrixName[16][18] := t*0;
+        ModelMatrixName[18][16] := t*0;
+        ModelMatrixName[16][19] := t*0.042;
+        ModelMatrixName[19][16] := t*0.042;
+        ModelMatrixName[17][18] := t*0;
+        ModelMatrixName[18][17] := t*0;
+        ModelMatrixName[17][19] := t*0.028;
+        ModelMatrixName[19][17] := t*0.028;
+        ModelMatrixName[18][19] := t*0.061;
+        ModelMatrixName[19][18] := t*0.061;
+	}
+	return 1;
+}
+
+
+
+
+HarvestFrequencies (vectorOfFrequencies,filteredData,1,1,0);
+dayhoffModelF = 0;
+MULTIPLY_BY_FREQS = PopulateModelMatrix ("dayhoffModelF",vectorOfFrequencies);
+Model DayhoffModel = (dayhoffModelF, vectorOfFrequencies, MULTIPLY_BY_FREQS);
+FREQUENCY_SENSITIVE = 1;
diff --git a/res/TemplateBatchFiles/TemplateModels/Default b/res/TemplateBatchFiles/TemplateModels/Default
new file mode 100644
index 0000000..b33ca8d
--- /dev/null
+++ b/res/TemplateBatchFiles/TemplateModels/Default
@@ -0,0 +1,25 @@
+GASCDPNTEVQHMLIKRFYW
+
+{
+{*,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}
+{1,*,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}
+{1,1,*,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}
+{1,1,1,*,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}
+{1,1,1,1,*,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}
+{1,1,1,1,1,*,1,1,1,1,1,1,1,1,1,1,1,1,1,1}
+{1,1,1,1,1,1,*,1,1,1,1,1,1,1,1,1,1,1,1,1}
+{1,1,1,1,1,1,1,*,1,1,1,1,1,1,1,1,1,1,1,1}
+{1,1,1,1,1,1,1,1,*,1,1,1,1,1,1,1,1,1,1,1}
+{1,1,1,1,1,1,1,1,1,*,1,1,1,1,1,1,1,1,1,1}
+{1,1,1,1,1,1,1,1,1,1,*,1,1,1,1,1,1,1,1,1}
+{1,1,1,1,1,1,1,1,1,1,1,*,1,1,1,1,1,1,1,1}
+{1,1,1,1,1,1,1,1,1,1,1,1,*,1,1,1,1,1,1,1}
+{1,1,1,1,1,1,1,1,1,1,1,1,1,*,1,1,1,1,1,1}
+{1,1,1,1,1,1,1,1,1,1,1,1,1,1,*,1,1,1,1,1}
+{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,*,1,1,1,1}
+{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,*,1,1,1}
+{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,*,1,1}
+{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,*,1}
+{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,*}
+}
+
diff --git a/res/TemplateBatchFiles/TemplateModels/ECM+F+omega.mdl b/res/TemplateBatchFiles/TemplateModels/ECM+F+omega.mdl
new file mode 100644
index 0000000..e523596
--- /dev/null
+++ b/res/TemplateBatchFiles/TemplateModels/ECM+F+omega.mdl
@@ -0,0 +1,154 @@
+/*	this file defines the ECM model as reported in Kosiol, Holmes & Goldman (2007). Molecular Biology and Evolution 24:1464-1479 
+
+	09/03/2009
+	
+	Coded by Gordon Botha
+	Tweaked by Wayne Delport
+*/
+
+
+
+NUC_LETTERS = "ACGT";
+AA = "FLIMVSPTAY*HQNKDECWRG";
+
+CODONS = {64, 1};	
+for (i = 0; i < 64; i = i + 1)
+{
+	CODONS [i] = NUC_LETTERS[i$16] + NUC_LETTERS [(i%16)$4] + NUC_LETTERS [i%4];
+}
+
+ECMmodelType = 2; /* 0 for ECM, 1 for ECM+F, 2 for ECM+F+w */
+
+ModelMatrixDimension = 0;
+
+function BuildCodonFrequencies (obsF)
+{
+	PIStop = 1.0;
+	result = {ModelMatrixDimension,1};
+	hshift = 0;
+
+	for (h=0; h<64; h=h+1)
+	{
+		first = h$16;
+		second = h%16$4;
+		third = h%4;
+		if (_Genetic_Code[h]==10) 
+		{
+			hshift = hshift+1;
+			PIStop = PIStop-obsF[first][0]*obsF[second][0]*obsF[third][0];
+			continue; 
+		}
+		result[h-hshift][0]=obsF[first][0]*obsF[second][0]*obsF[third][0];
+	}
+	return result*(1.0/PIStop);
+}
+
+function PopulateModelMatrix (ModelMatrixName& )
+{		
+
+	ModelMatrixName = {ModelMatrixDimension,ModelMatrixDimension}; 
+	hshift = 0;
+	if (ECMmodelType > 1)		/* model where omega is implemented for the first time, ECM + F + omega */
+	{
+		global globalVariable_omega = 0.192;		/* value initialised as omega_E, p 1476 of paper */
+	}
+	else {
+		global globalVariable_omega := 1;
+	}
+	for (h=0; h<64; h=h+1)
+	{
+		if (_Genetic_Code[h]==10) 
+		{
+			hshift = hshift+1;
+			continue; 
+		}
+		vshift = hshift;
+		for (v = h+1; v<64; v=v+1)
+		{
+			if (_Genetic_Code[v]==10) 
+			{
+				vshift = vshift+1;
+				continue; 
+			}
+			hs = h-hshift;
+			vs = v-vshift;
+			if ( _Genetic_Code [ v ] == _Genetic_Code [ h ] )
+			{
+				ModelMatrixName[hs][vs] := _numericRateMatrix__[hs__][vs__]*t;
+				ModelMatrixName[vs][hs] := _numericRateMatrix__[hs__][vs__]*t;
+			}
+			else
+			{
+				ModelMatrixName[hs][vs] := globalVariable_omega*_numericRateMatrix__[hs__][vs__]*t;
+				ModelMatrixName[vs][hs] := globalVariable_omega*_numericRateMatrix__[hs__][vs__]*t;
+			}
+		}
+	}
+	return 1;
+}
+
+fprintf ( stdout, "\n\nAllow multiple substitutions between codons? (Y/N)" );
+fscanf ( stdin, "String", msubs );
+
+if ( ( msubs == "Y" ) || ( msubs == "y" )  ) {
+	incFileName = HYPHY_LIB_DIRECTORY + "TemplateBatchFiles" + DIRECTORY_SEPARATOR + "TemplateModels" + DIRECTORY_SEPARATOR + "EmpiricalCodon" + DIRECTORY_SEPARATOR + "KHG_ECMu";
+}
+else {
+	incFileName = HYPHY_LIB_DIRECTORY + "TemplateBatchFiles" + DIRECTORY_SEPARATOR + "TemplateModels" + DIRECTORY_SEPARATOR + "EmpiricalCodon" + DIRECTORY_SEPARATOR + "KHG_ECM";
+}
+
+fscanf ( incFileName, "Matrix,NMatrix,NMatrix", KHG_codonOrder, KHG_RateMatrix, KHG_vof );
+
+ModelMatrixDimension = 0;
+for ( i = 0; i < 64; i = i + 1 ) {
+	if ( _Genetic_Code [ i ] != 10 ) {
+		ModelMatrixDimension = ModelMatrixDimension + 1;
+	}
+}
+
+/*array of codon indeces in the KHG model*/
+CodonCompare = { ModelMatrixDimension, 1 };
+ishit = 0;
+for ( i = 0; i < 64; i = i + 1 ) {
+	if ( _Genetic_Code [ i ] == 10 ) {
+		ishit = ishit + 1;
+	}	
+	else {
+		query = CODONS [ i ];
+		got = 0;
+		j = 0;
+		while ( ( got == 0 ) && ( j < Columns(KHG_codonOrder) ) ) {
+			if ( query == KHG_codonOrder [ j ] ) {
+				/* fprintf ( stdout, query, " ", KHG_codonOrder [ j ], "\n" ); */
+				got = 1;
+				CodonCompare [ i-ishit ] = j;
+			}
+			j = j + 1;
+		}
+	}
+}
+
+_numericRateMatrix = { ModelMatrixDimension, ModelMatrixDimension }; /* codons to be ordered as in HYPHY*/
+ECM_Freqs = { ModelMatrixDimension, 1 };
+for ( i = 0; i < ModelMatrixDimension; i = i + 1 ) {
+	ECM_Freqs [ i ] = KHG_vof [ CodonCompare [ i ] ];	
+	for ( j = i + 1; j < ModelMatrixDimension; j = j + 1 ) {
+		_numericRateMatrix [ i ][ j ] = KHG_RateMatrix [ CodonCompare [ i ] ][ CodonCompare [ j ] ];
+		_numericRateMatrix [ j ][ i ] = KHG_RateMatrix [ CodonCompare [ j ] ][ CodonCompare [ i ] ];
+	}
+}
+
+if ( ECMmodelType > 0 ) { /* Use F61 frequencies as per KHG */
+	COUNT_GAPS_IN_FREQUENCIES = 0;
+	HarvestFrequencies (observedFreq,filteredData,3,3,1);
+	vectorOfFrequencies = Transpose(observedFreq[Transpose(_Genetic_Code["_MATRIX_ELEMENT_VALUE_!=10"])]); /* cough, cough, cough....HACK! */
+}
+else {
+	vectorOfFrequencies = ECM_Freqs;
+}
+
+ECM = 0;
+PopulateModelMatrix ( "ECM" );
+Model ECMModel = ( ECM, vectorOfFrequencies, 1 );
+
+
diff --git a/res/TemplateBatchFiles/TemplateModels/ECM+F.mdl b/res/TemplateBatchFiles/TemplateModels/ECM+F.mdl
new file mode 100644
index 0000000..f4aeed3
--- /dev/null
+++ b/res/TemplateBatchFiles/TemplateModels/ECM+F.mdl
@@ -0,0 +1,152 @@
+/*	this file defines the ECM model as reported in Kosiol, Holmes & Goldman (2007). Molecular Biology and Evolution 24:1464-1479 
+
+	09/03/2009
+	
+	Coded by Gordon Botha
+	Tweaked by Wayne Delport
+*/
+
+NUC_LETTERS = "ACGT";
+AA = "FLIMVSPTAY*HQNKDECWRG";
+
+CODONS = {64, 1};	
+for (i = 0; i < 64; i = i + 1)
+{
+	CODONS [i] = NUC_LETTERS[i$16] + NUC_LETTERS [(i%16)$4] + NUC_LETTERS [i%4];
+}
+
+ECMmodelType = 1; /* 0 for ECM, 1 for ECM+F, 2 for ECM+F+w */
+
+ModelMatrixDimension = 0;
+
+function BuildCodonFrequencies (obsF)
+{
+	PIStop = 1.0;
+	result = {ModelMatrixDimension,1};
+	hshift = 0;
+
+	for (h=0; h<64; h=h+1)
+	{
+		first = h$16;
+		second = h%16$4;
+		third = h%4;
+		if (_Genetic_Code[h]==10) 
+		{
+			hshift = hshift+1;
+			PIStop = PIStop-obsF[first][0]*obsF[second][0]*obsF[third][0];
+			continue; 
+		}
+		result[h-hshift][0]=obsF[first][0]*obsF[second][0]*obsF[third][0];
+	}
+	return result*(1.0/PIStop);
+}
+
+function PopulateModelMatrix (ModelMatrixName& )
+{		
+
+	ModelMatrixName = {ModelMatrixDimension,ModelMatrixDimension}; 
+	hshift = 0;
+	if (ECMmodelType > 1)		/* model where omega is implemented for the first time, ECM + F + omega */
+	{
+		global globalVariable_omega = 0.192;		/* value initialised as omega_E, p 1476 of paper */
+	}
+	else {
+		global globalVariable_omega := 1;
+	}
+	for (h=0; h<64; h=h+1)
+	{
+		if (_Genetic_Code[h]==10) 
+		{
+			hshift = hshift+1;
+			continue; 
+		}
+		vshift = hshift;
+		for (v = h+1; v<64; v=v+1)
+		{
+			if (_Genetic_Code[v]==10) 
+			{
+				vshift = vshift+1;
+				continue; 
+			}
+			hs = h-hshift;
+			vs = v-vshift;
+			if ( _Genetic_Code [ v ] == _Genetic_Code [ h ] )
+			{
+				ModelMatrixName[hs][vs] := _numericRateMatrix__[hs__][vs__]*t;
+				ModelMatrixName[vs][hs] := _numericRateMatrix__[hs__][vs__]*t;
+			}
+			else
+			{
+				ModelMatrixName[hs][vs] := globalVariable_omega*_numericRateMatrix__[hs__][vs__]*t;
+				ModelMatrixName[vs][hs] := globalVariable_omega*_numericRateMatrix__[hs__][vs__]*t;
+			}
+		}
+	}
+	return 1;
+}
+
+fprintf ( stdout, "\n\nAllow multiple substitutions between codons? (Y/N)" );
+fscanf ( stdin, "String", msubs );
+
+if ( ( msubs == "Y" ) || ( msubs == "y" )  ) {
+	incFileName = HYPHY_LIB_DIRECTORY + "TemplateBatchFiles" + DIRECTORY_SEPARATOR + "TemplateModels" + DIRECTORY_SEPARATOR + "EmpiricalCodon" + DIRECTORY_SEPARATOR + "KHG_ECMu";
+}
+else {
+	incFileName = HYPHY_LIB_DIRECTORY + "TemplateBatchFiles" + DIRECTORY_SEPARATOR + "TemplateModels" + DIRECTORY_SEPARATOR + "EmpiricalCodon" + DIRECTORY_SEPARATOR + "KHG_ECM";
+}
+
+fscanf ( incFileName, "Matrix,NMatrix,NMatrix", KHG_codonOrder, KHG_RateMatrix, KHG_vof );
+
+ModelMatrixDimension = 0;
+for ( i = 0; i < 64; i = i + 1 ) {
+	if ( _Genetic_Code [ i ] != 10 ) {
+		ModelMatrixDimension = ModelMatrixDimension + 1;
+	}
+}
+
+/*array of codon indeces in the KHG model*/
+CodonCompare = { ModelMatrixDimension, 1 };
+ishit = 0;
+for ( i = 0; i < 64; i = i + 1 ) {
+	if ( _Genetic_Code [ i ] == 10 ) {
+		ishit = ishit + 1;
+	}	
+	else {
+		query = CODONS [ i ];
+		got = 0;
+		j = 0;
+		while ( ( got == 0 ) && ( j < Columns(KHG_codonOrder) ) ) {
+			if ( query == KHG_codonOrder [ j ] ) {
+				/* fprintf ( stdout, query, " ", KHG_codonOrder [ j ], "\n" ); */
+				got = 1;
+				CodonCompare [ i-ishit ] = j;
+			}
+			j = j + 1;
+		}
+	}
+}
+
+_numericRateMatrix = { ModelMatrixDimension, ModelMatrixDimension }; /* codons to be ordered as in HYPHY*/
+ECM_Freqs = { ModelMatrixDimension, 1 };
+for ( i = 0; i < ModelMatrixDimension; i = i + 1 ) {
+	ECM_Freqs [ i ] = KHG_vof [ CodonCompare [ i ] ];	
+	for ( j = i + 1; j < ModelMatrixDimension; j = j + 1 ) {
+		_numericRateMatrix [ i ][ j ] = KHG_RateMatrix [ CodonCompare [ i ] ][ CodonCompare [ j ] ];
+		_numericRateMatrix [ j ][ i ] = KHG_RateMatrix [ CodonCompare [ j ] ][ CodonCompare [ i ] ];
+	}
+}
+
+if ( ECMmodelType > 0 ) { /* Use F61 frequencies as per KHG */
+	COUNT_GAPS_IN_FREQUENCIES = 0;
+	HarvestFrequencies (observedFreq,filteredData,3,3,1);
+	vectorOfFrequencies = Transpose(observedFreq[Transpose(_Genetic_Code["_MATRIX_ELEMENT_VALUE_!=10"])]); /* cough, cough, cough....HACK! */
+}
+else {
+	vectorOfFrequencies = ECM_Freqs;
+}
+
+ECM = 0;
+PopulateModelMatrix ( "ECM" );
+Model ECMModel = ( ECM, vectorOfFrequencies, 1 );
+
+
diff --git a/res/TemplateBatchFiles/TemplateModels/ECM+F3x4.mdl b/res/TemplateBatchFiles/TemplateModels/ECM+F3x4.mdl
new file mode 100644
index 0000000..e2ad0df
--- /dev/null
+++ b/res/TemplateBatchFiles/TemplateModels/ECM+F3x4.mdl
@@ -0,0 +1,180 @@
+/*	this file defines the ECM model as reported in Kosiol, Holmes & Goldman (2007). Molecular Biology and Evolution 24:1464-1479 
+
+	09/03/2009
+	
+	
+	This model is ECM with F3x4 frequency parameters, not defined in KHG but used for comparative purposes.
+	
+	Coded by Gordon Botha
+	Tweaked by Wayne Delport
+*/
+
+ECMmodelType = 0;
+
+NUC_LETTERS = "ACGT";
+AA = "FLIMVSPTAY*HQNKDECWRG";
+
+CODONS = {64, 1};	
+for (i = 0; i < 64; i = i + 1)
+{
+	CODONS [i] = NUC_LETTERS[i$16] + NUC_LETTERS [(i%16)$4] + NUC_LETTERS [i%4];
+}
+
+function BuildCodonFrequencies (obsF)
+{
+	PIStop = 1.0;
+	result = {ModelMatrixDimension,1};
+	hshift = 0;
+
+	for (h=0; h<64; h=h+1)
+	{
+		first = h$16;
+		second = h%16$4;
+		third = h%4;
+		if (_Genetic_Code[h]==10) 
+		{
+			hshift = hshift+1;
+			PIStop = PIStop-obsF[first][0]*obsF[second][1]*obsF[third][2];
+			continue; 
+		}
+		result[h-hshift][0]=obsF[first][0]*obsF[second][1]*obsF[third][2];
+	}
+	return result*(1.0/PIStop);
+}
+function PopulateModelMatrix (ModelMatrixName&, VOF )
+{		
+
+	ModelMatrixName = {ModelMatrixDimension,ModelMatrixDimension}; 
+	hshift = 0;
+	
+	modelDefString = "";
+	modelDefString*16384;
+	
+	if (ECMmodelType > 1)		/* model where omega is implemented for the first time, ECM + F + omega */
+	{
+		global globalVariable_omega = 0.192;		/* value initialised as omega_E, p 1476 of paper */
+	}
+	else {
+		global globalVariable_omega := 1;
+	}
+	
+	for (h=0; h<64; h=h+1)
+	{
+		if (_Genetic_Code[h]==10) 
+		{
+			hshift = hshift+1;
+			continue; 
+		}
+		vshift = hshift;
+		for (v = h+1; v<64; v=v+1)
+		{
+			diff = v-h;
+			if (_Genetic_Code[v]==10) 
+			{
+				vshift = vshift+1;
+				continue; 
+			}
+			nucPosInCodon = 2;
+			if ((h$4==v$4)||((diff%4==0)&&(h$16==v$16))||(diff%16==0))
+			{
+				if (h$4==v$4)
+				{
+					transition = v%4;
+					transition2= h%4;
+				}
+				else
+				{
+					if(diff%16==0)
+					{
+						transition = v$16;
+						transition2= h$16;
+						nucPosInCodon = 0;
+					}
+					else
+					{
+						transition = v%16$4;
+						transition2= h%16$4;
+						nucPosInCodon = 1;
+					}
+				}
+				hs = h-hshift;
+				vs = v-vshift;
+				ts = Format(transition,0,0);
+				ts2= Format(transition2,0,0);
+				ps = Format(nucPosInCodon,0,0);
+				aa1 = _Genetic_Code[0][h];
+				aa2 = _Genetic_Code[0][v];
+			
+				if ( aa1 == aa2 )
+				{
+					modelDefString*("ModelMatrixName["+hs+"]["+vs+"] := " + _numericRateMatrix[hs][vs] + "*" + VOF[transition][nucPosInCodon]+"*t;\n"+
+								"ModelMatrixName["+vs+"]["+hs+"] := " + _numericRateMatrix[hs][vs] + "*" + VOF[transition2][nucPosInCodon]+"*t;\n");
+				}
+				else
+				{
+					modelDefString*("ModelMatrixName["+hs+"]["+vs+"] := globalVariable_omega*" + _numericRateMatrix[hs][vs] + "*" + VOF[transition][nucPosInCodon]+"*t;\n"+
+								"ModelMatrixName["+vs+"]["+hs+"] := globalVariable_omega*" + _numericRateMatrix[hs][vs] + "*" + VOF[transition2][nucPosInCodon]+"*t;\n");
+				}
+			}
+		}
+	}
+	modelDefString*0;
+	/*fprintf ( stdout, modelDefString, "\n" );*/
+	ExecuteCommands (modelDefString);
+	return 0;
+}
+
+incFileName = HYPHY_LIB_DIRECTORY + "TemplateBatchFiles" + DIRECTORY_SEPARATOR + "TemplateModels" + DIRECTORY_SEPARATOR + "EmpiricalCodon" + DIRECTORY_SEPARATOR + "KHG_ECM";
+fscanf ( incFileName, "Matrix,NMatrix,NMatrix", KHG_codonOrder, KHG_RateMatrix, KHG_vof );
+
+ModelMatrixDimension = 0;
+for ( i = 0; i < 64; i = i + 1 ) {
+	if ( _Genetic_Code [ i ] != 10 ) {
+		ModelMatrixDimension = ModelMatrixDimension + 1;
+	}
+}
+
+/*array of codon indeces in the KHG model*/
+CodonCompare = { ModelMatrixDimension, 1 };
+ishit = 0;
+for ( i = 0; i < 64; i = i + 1 ) {
+	if ( _Genetic_Code [ i ] == 10 ) {
+		ishit = ishit + 1;
+	}	
+	else {
+		query = CODONS [ i ];
+		got = 0;
+		j = 0;
+		while ( ( got == 0 ) && ( j < Columns(KHG_codonOrder) ) ) {
+			if ( query == KHG_codonOrder [ j ] ) {
+				/* fprintf ( stdout, query, " ", KHG_codonOrder [ j ], "\n" ); */
+				got = 1;
+				CodonCompare [ i-ishit ] = j;
+			}
+			j = j + 1;
+		}
+	}
+}
+
+_numericRateMatrix = { ModelMatrixDimension, ModelMatrixDimension }; /* codons to be ordered as in HYPHY*/
+for ( i = 0; i < ModelMatrixDimension; i = i + 1 ) {
+	for ( j = i + 1; j < ModelMatrixDimension; j = j + 1 ) {
+		_numericRateMatrix [ i ][ j ] = KHG_RateMatrix [ CodonCompare [ i ] ][ CodonCompare [ j ] ];
+		_numericRateMatrix [ j ][ i ] = KHG_RateMatrix [ CodonCompare [ j ] ][ CodonCompare [ i ] ];
+	}
+}
+
+HarvestFrequencies (observedFreq,filteredData,3,1,1);
+
+		
+ECM = 0;
+MULTIPLY_BY_FREQS = PopulateModelMatrix ( "ECM", observedFreq );
+vectorOfFrequencies = BuildCodonFrequencies (observedFreq);
+
+Model ECMModel = ( ECM, vectorOfFrequencies, MULTIPLY_BY_FREQS );
+/*
+Export ( modelString, ECMModel );
+fprintf ( stdout, modelString, "\n" );
+*/
+
+
diff --git a/res/TemplateBatchFiles/TemplateModels/ECM+MLFREQS.mdl b/res/TemplateBatchFiles/TemplateModels/ECM+MLFREQS.mdl
new file mode 100644
index 0000000..0544678
--- /dev/null
+++ b/res/TemplateBatchFiles/TemplateModels/ECM+MLFREQS.mdl
@@ -0,0 +1,162 @@
+/*	this file defines the ECM model as reported in Kosiol, Holmes & Goldman (2007). Molecular Biology and Evolution 24:1464-1479 
+
+	09/03/2009
+	
+	
+	This model is ECM with ML estimated frequency parameters, not defined in KHG but used for comparative purposes.
+	
+	Coded by Gordon Botha
+	Tweaked by Wayne Delport
+*/
+
+ECMmodelType = 0;
+
+NUC_LETTERS = "ACGT";
+AA = "FLIMVSPTAY*HQNKDECWRG";
+
+CODONS = {64, 1};	
+for (i = 0; i < 64; i = i + 1)
+{
+	CODONS [i] = NUC_LETTERS[i$16] + NUC_LETTERS [(i%16)$4] + NUC_LETTERS [i%4];
+}
+
+function PopulateModelMatrix (ModelMatrixName&, VOF )
+{		
+
+	ModelMatrixName = {ModelMatrixDimension,ModelMatrixDimension}; 
+	hshift = 0;
+	
+	modelDefString = "";
+	modelDefString*16384;
+	
+	if (ECMmodelType > 1)		/* model where omega is implemented for the first time, ECM + F + omega */
+	{
+		global globalVariable_omega = 0.192;		/* value initialised as omega_E, p 1476 of paper */
+	}
+	else {
+		global globalVariable_omega := 1;
+	}
+	
+	for (h=0; h<64; h=h+1)
+	{
+		if (_Genetic_Code[h]==10) 
+		{
+			hshift = hshift+1;
+			continue; 
+		}
+		vshift = hshift;
+		for (v = h+1; v<64; v=v+1)
+		{
+			diff = v-h;
+			if (_Genetic_Code[v]==10) 
+			{
+				vshift = vshift+1;
+				continue; 
+			}
+			nucPosInCodon = 2;
+			if ((h$4==v$4)||((diff%4==0)&&(h$16==v$16))||(diff%16==0))
+			{
+				if (h$4==v$4)
+				{
+					transition = v%4;
+					transition2= h%4;
+				}
+				else
+				{
+					if(diff%16==0)
+					{
+						transition = v$16;
+						transition2= h$16;
+						nucPosInCodon = 0;
+					}
+					else
+					{
+						transition = v%16$4;
+						transition2= h%16$4;
+						nucPosInCodon = 1;
+					}
+				}
+				hs = h-hshift;
+				vs = v-vshift;
+				ts = Format(transition,0,0);
+				ts2= Format(transition2,0,0);
+				ps = Format(nucPosInCodon,0,0);
+				aa1 = _Genetic_Code[0][h];
+				aa2 = _Genetic_Code[0][v];
+			
+				if ( aa1 == aa2 )
+				{
+					modelDefString*("ModelMatrixName["+hs+"]["+vs+"] := " + _numericRateMatrix[hs][vs] + "*" + VOF[transition][nucPosInCodon]+"*t;\n"+
+								"ModelMatrixName["+vs+"]["+hs+"] := " + _numericRateMatrix[hs][vs] + "*" + VOF[transition2][nucPosInCodon]+"*t;\n");
+				}
+				else
+				{
+					modelDefString*("ModelMatrixName["+hs+"]["+vs+"] := globalVariable_omega*" + _numericRateMatrix[hs][vs] + "*" + VOF[transition][nucPosInCodon]+"*t;\n"+
+								"ModelMatrixName["+vs+"]["+hs+"] := globalVariable_omega*" + _numericRateMatrix[hs][vs] + "*" + VOF[transition2][nucPosInCodon]+"*t;\n");
+				}
+			}
+		}
+	}
+	modelDefString*0;
+	/*fprintf ( stdout, modelDefString, "\n" );*/
+	ExecuteCommands (modelDefString);
+	return 0;
+}
+
+incFileName = HYPHY_LIB_DIRECTORY + "TemplateBatchFiles" + DIRECTORY_SEPARATOR + "TemplateModels" + DIRECTORY_SEPARATOR + "EmpiricalCodon" + DIRECTORY_SEPARATOR + "KHG_ECM";
+fscanf ( incFileName, "Matrix,NMatrix,NMatrix", KHG_codonOrder, KHG_RateMatrix, KHG_vof );
+
+ModelMatrixDimension = 0;
+for ( i = 0; i < 64; i = i + 1 ) {
+	if ( _Genetic_Code [ i ] != 10 ) {
+		ModelMatrixDimension = ModelMatrixDimension + 1;
+	}
+}
+
+/*array of codon indeces in the KHG model*/
+CodonCompare = { ModelMatrixDimension, 1 };
+ishit = 0;
+for ( i = 0; i < 64; i = i + 1 ) {
+	if ( _Genetic_Code [ i ] == 10 ) {
+		ishit = ishit + 1;
+	}	
+	else {
+		query = CODONS [ i ];
+		got = 0;
+		j = 0;
+		while ( ( got == 0 ) && ( j < Columns(KHG_codonOrder) ) ) {
+			if ( query == KHG_codonOrder [ j ] ) {
+				/* fprintf ( stdout, query, " ", KHG_codonOrder [ j ], "\n" ); */
+				got = 1;
+				CodonCompare [ i-ishit ] = j;
+			}
+			j = j + 1;
+		}
+	}
+}
+
+_numericRateMatrix = { ModelMatrixDimension, ModelMatrixDimension }; /* codons to be ordered as in HYPHY*/
+for ( i = 0; i < ModelMatrixDimension; i = i + 1 ) {
+	for ( j = i + 1; j < ModelMatrixDimension; j = j + 1 ) {
+		_numericRateMatrix [ i ][ j ] = KHG_RateMatrix [ CodonCompare [ i ] ][ CodonCompare [ j ] ];
+		_numericRateMatrix [ j ][ i ] = KHG_RateMatrix [ CodonCompare [ j ] ][ CodonCompare [ i ] ];
+	}
+}
+
+HarvestFrequencies (observedFreq,filteredData,3,1,1);
+#include "MGFreqsEstimator.ibf";
+
+		
+ECM = 0;
+MULTIPLY_BY_FREQS = PopulateModelMatrix ( "ECM", paramFreqs );
+FREQUENCY_SENSITIVE = 1;
+BuildCodonFrequencies (paramFreqs,"vectorOfFrequencies");
+
+Model ECMModel = ( ECM, vectorOfFrequencies, MULTIPLY_BY_FREQS );
+
+/*
+Export ( modelString, ECMModel );
+fprintf ( stdout, modelString, "\n" );
+*/
+
+USE_POSITION_SPECIFIC_FREQS = 1;
diff --git a/res/TemplateBatchFiles/TemplateModels/ECM.mdl b/res/TemplateBatchFiles/TemplateModels/ECM.mdl
new file mode 100644
index 0000000..4f30170
--- /dev/null
+++ b/res/TemplateBatchFiles/TemplateModels/ECM.mdl
@@ -0,0 +1,154 @@
+/*	this file defines the ECM model as reported in Kosiol, Holmes & Goldman (2007). Molecular Biology and Evolution 24:1464-1479 
+
+	09/03/2009
+	
+	Coded by Gordon Botha
+	Tweaked by Wayne Delport
+*/
+
+NUC_LETTERS = "ACGT";
+AA = "FLIMVSPTAY*HQNKDECWRG";
+
+CODONS = {64, 1};	
+for (i = 0; i < 64; i = i + 1)
+{
+	CODONS [i] = NUC_LETTERS[i$16] + NUC_LETTERS [(i%16)$4] + NUC_LETTERS [i%4];
+}
+
+ECMmodelType = 0; /* 0 for ECM, 1 for ECM+F, 2 for ECM+F+w */
+
+ModelMatrixDimension = 0;
+
+function BuildCodonFrequencies (obsF)
+{
+	PIStop = 1.0;
+	result = {ModelMatrixDimension,1};
+	hshift = 0;
+
+	for (h=0; h<64; h=h+1)
+	{
+		first = h$16;
+		second = h%16$4;
+		third = h%4;
+		if (_Genetic_Code[h]==10) 
+		{
+			hshift = hshift+1;
+			PIStop = PIStop-obsF[first][0]*obsF[second][0]*obsF[third][0];
+			continue; 
+		}
+		result[h-hshift][0]=obsF[first][0]*obsF[second][0]*obsF[third][0];
+	}
+	return result*(1.0/PIStop);
+}
+
+function PopulateModelMatrix (ModelMatrixName& )
+{		
+
+	ModelMatrixName = {ModelMatrixDimension,ModelMatrixDimension}; 
+	hshift = 0;
+	if (ECMmodelType > 1)		/* model where omega is implemented for the first time, ECM + F + omega */
+	{
+		global globalVariable_omega = 0.192;		/* value initialised as omega_E, p 1476 of paper */
+	}
+	else {
+		global globalVariable_omega := 1;
+	}
+	
+	for (h=0; h<64; h=h+1)
+	{
+		if (_Genetic_Code[h]==10) 
+		{
+			hshift = hshift+1;
+			continue; 
+		}
+		vshift = hshift;
+		for (v = h+1; v<64; v=v+1)
+		{
+			if (_Genetic_Code[v]==10) 
+			{
+			vshift = vshift+1;
+			continue; 
+			}
+			hs = h-hshift;
+			vs = v-vshift;
+			if ( _Genetic_Code [ v ] == _Genetic_Code [ h ] )
+			{
+				ModelMatrixName[hs][vs] := _numericRateMatrix__[hs__][vs__]*t;
+				ModelMatrixName[vs][hs] := _numericRateMatrix__[hs__][vs__]*t;
+			}
+			else
+			{
+				ModelMatrixName[hs][vs] := globalVariable_omega*_numericRateMatrix__[hs__][vs__]*t;
+				ModelMatrixName[vs][hs] := globalVariable_omega*_numericRateMatrix__[hs__][vs__]*t;
+			}
+		}
+	}
+	return 1;
+}
+
+fprintf ( stdout, "\n\nAllow multiple substitutions between codons? (Y/N)" );
+fscanf ( stdin, "String", msubs );
+
+if ( ( msubs == "Y" ) || ( msubs == "y" )  ) {
+	incFileName = HYPHY_LIB_DIRECTORY + "TemplateBatchFiles" + DIRECTORY_SEPARATOR + "TemplateModels" + DIRECTORY_SEPARATOR + "EmpiricalCodon" + DIRECTORY_SEPARATOR + "KHG_ECMu";
+}
+else {
+	incFileName = HYPHY_LIB_DIRECTORY + "TemplateBatchFiles" + DIRECTORY_SEPARATOR + "TemplateModels" + DIRECTORY_SEPARATOR + "EmpiricalCodon" + DIRECTORY_SEPARATOR + "KHG_ECM";
+}
+
+
+fscanf ( incFileName, "Matrix,NMatrix,NMatrix", KHG_codonOrder, KHG_RateMatrix, KHG_vof );
+
+ModelMatrixDimension = 0;
+for ( i = 0; i < 64; i = i + 1 ) {
+	if ( _Genetic_Code [ i ] != 10 ) {
+		ModelMatrixDimension = ModelMatrixDimension + 1;
+	}
+}
+
+/*array of codon indeces in the KHG model*/
+CodonCompare = { ModelMatrixDimension, 1 };
+ishit = 0;
+for ( i = 0; i < 64; i = i + 1 ) {
+	if ( _Genetic_Code [ i ] == 10 ) {
+		ishit = ishit + 1;
+	}	
+	else {
+		query = CODONS [ i ];
+		got = 0;
+		j = 0;
+		while ( ( got == 0 ) && ( j < Columns(KHG_codonOrder) ) ) {
+			if ( query == KHG_codonOrder [ j ] ) {
+				/* fprintf ( stdout, query, " ", KHG_codonOrder [ j ], "\n" ); */
+				got = 1;
+				CodonCompare [ i-ishit ] = j;
+			}
+			j = j + 1;
+		}
+	}
+}
+
+_numericRateMatrix = { ModelMatrixDimension, ModelMatrixDimension }; /* codons to be ordered as in HYPHY*/
+ECM_Freqs = { ModelMatrixDimension, 1 };
+for ( i = 0; i < ModelMatrixDimension; i = i + 1 ) {
+	ECM_Freqs [ i ] = KHG_vof [ CodonCompare [ i ] ];	
+	for ( j = i + 1; j < ModelMatrixDimension; j = j + 1 ) {
+		_numericRateMatrix [ i ][ j ] = KHG_RateMatrix [ CodonCompare [ i ] ][ CodonCompare [ j ] ];
+		_numericRateMatrix [ j ][ i ] = KHG_RateMatrix [ CodonCompare [ j ] ][ CodonCompare [ i ] ];
+	}
+}
+
+if ( ECMmodelType > 0 ) { /* Use F61 frequencies as per KHG */
+	COUNT_GAPS_IN_FREQUENCIES = 0;
+	HarvestFrequencies (observedFreq,filteredData,3,3,1);
+	vectorOfFrequencies = Transpose(observedFreq[Transpose(_Genetic_Code["_MATRIX_ELEMENT_VALUE_!=10"])]); /* cough, cough, cough....HACK! */
+}
+else {
+	vectorOfFrequencies = ECM_Freqs;
+}
+
+ECM = 0;
+PopulateModelMatrix ( "ECM" );
+Model ECMModel = ( ECM, vectorOfFrequencies, 1 );
+
+
diff --git a/res/TemplateBatchFiles/TemplateModels/EIAA.mdl b/res/TemplateBatchFiles/TemplateModels/EIAA.mdl
new file mode 100644
index 0000000..eb506d3
--- /dev/null
+++ b/res/TemplateBatchFiles/TemplateModels/EIAA.mdl
@@ -0,0 +1,74 @@
+/* This file defines the transition matrix for the equal input model for amino-acids.
+   The file should be used as follows:
+   
+   1) Read Data File and create datafilter filteredData
+   2) #include this file (or use SelectTemplateModel(filteredData);)
+   3) Define the tree
+   4) Proceed with the likelihood function using 'vectorOfFrequencies' as the vector to pass to the constructor.
+   
+   This model has the following signature:
+   	#Short:EqualInput#
+   	#Desc:Dayfoff model for amino-acids#
+   	#Dimension:20#
+    #DataType:aminoacid#
+   	#FileName:EIAA.mdl#
+   
+   08/18/1999  by Sergei L. Kosakovsky Pond
+*/
+
+NICETY_LEVEL = 2;
+
+#include "modelParameters2.mdl";
+
+if (!SKIP_MODEL_PARAMETER_LIST)
+{
+	if (modelType == 1)
+	{
+		#include "defineGamma.mdl";
+	}	
+	if (modelType == 2)
+	{
+		#include "defineHM.mdl";
+	}
+}
+
+function PopulateModelMatrix (ModelMatrixName&, EFV)
+{
+
+	ModelMatrixName = {20,20};
+	
+	if (modelType==0)
+	{
+		for (counter1=0; counter1<19;counter1=counter1+1)
+		{
+			for (counter2=counter1+1; counter2<20; counter2=counter2+1)
+			{
+				ModelMatrixName[counter1][counter2]:=t;
+				ModelMatrixName[counter2][counter1]:=t;			
+			}
+		}
+	}
+	else
+	{
+		for (counter1=0; counter1<19;counter1=counter1+1)
+		{
+			for (counter2=counter1+1; counter2<20; counter2=counter2+1)
+			{
+				ModelMatrixName[counter1][counter2]:=c*t;
+				ModelMatrixName[counter2][counter1]:=c*t;			
+			}
+		}
+	}
+	
+	return 1;
+}
+
+EEAA = 0;
+
+HarvestFrequencies (vectorOfFrequencies,filteredData,1,1,0);
+
+MULTIPLY_BY_FREQS = PopulateModelMatrix ("EEAA",vectorOfFrequencies);
+
+Model EqualInputModel = (EEAA, vectorOfFrequencies);
+
+FREQUENCY_SENSITIVE = 1;
diff --git a/res/TemplateBatchFiles/TemplateModels/EIAAFreq.mdl b/res/TemplateBatchFiles/TemplateModels/EIAAFreq.mdl
new file mode 100644
index 0000000..09596dc
--- /dev/null
+++ b/res/TemplateBatchFiles/TemplateModels/EIAAFreq.mdl
@@ -0,0 +1,120 @@
+/* This file defines the transition matrix for the equal input model for amino-acids.
+   The file should be used as follows:
+   
+   1) Read Data File and create datafilter filteredData
+   2) #include this file (or use SelectTemplateModel(filteredData);)
+   3) Define the tree
+   4) Proceed with the likelihood function using 'vectorOfFrequencies' as the vector to pass to the constructor.
+   
+   This model has the following signature:
+   	#Short:EqualInput#
+   	#Desc:Dayfoff model for amino-acids#
+   	#Dimension:20#
+    #DataType:aminoacid#
+   	#FileName:EIAA.mdl#
+   
+   08/18/1999  by Sergei L. Kosakovsky Pond
+*/
+
+NICETY_LEVEL = 2;
+aaCodes = {{"A",
+"C",
+"D",
+"E",
+"F",
+"G",
+"H",
+"I",
+"K",
+"L",
+"M",
+"N",
+"P",
+"Q",
+"R",
+"S",
+"T",
+"V",
+"W",
+"Y"}};
+
+
+#include "modelParameters2.mdl";
+
+if (!SKIP_MODEL_PARAMETER_LIST)
+{
+	if (modelType == 1)
+	{
+		#include "defineGamma.mdl";
+	}	
+	if (modelType == 2)
+	{
+		#include "defineHM.mdl";
+	}
+}
+
+function PopulateModelMatrix (ModelMatrixName&, EFV)
+{
+
+	ModelMatrixName = {20,20};
+	
+	if (modelType==0)
+	{
+		for (counter1=0; counter1<19;counter1=counter1+1)
+		{
+			for (counter2=counter1+1; counter2<20; counter2=counter2+1)
+			{
+				ModelMatrixName[counter1][counter2]:=a;
+				ModelMatrixName[counter2][counter1]:=a;			
+			}
+		}
+	}
+	else
+	{
+		for (counter1=0; counter1<19;counter1=counter1+1)
+		{
+			for (counter2=counter1+1; counter2<20; counter2=counter2+1)
+			{
+				ModelMatrixName[counter1][counter2]:=c*a;
+				ModelMatrixName[counter2][counter1]:=c*a;			
+			}
+		}
+	}
+	
+	return 0;
+}
+
+commandString = "";
+
+for (rI = 0; rI < 20; rI = rI+1)
+{
+	commandString = commandString + "global P_" + aaCodes[rI] + "=0.05;\n";
+}
+
+ExecuteCommands (commandString);
+
+vectorOfFrequencies = {20,1};
+
+commandString = "global EFV_Norm:=P_A";
+for (rI = 1; rI < 20; rI = rI+1)
+{
+	commandString = commandString+"+P_"+aaCodes[rI];
+}
+
+ExecuteCommands (commandString+";");
+vectorOfFrequencies[0]:=P_A/EFV_Norm;
+
+for (rI = 1; rI < 20; rI = rI+1)
+{
+	commandString = "vectorOfFrequencies["+rI+"]:=P_"+aaCodes[rI]+"/EFV_Norm;";
+	ExecuteCommands (commandString);
+}
+
+
+EEAA = 0;
+
+MULTIPLY_BY_FREQS = PopulateModelMatrix ("EEAA",vectorOfFrequencies);
+
+Model EqualInputModel = (EEAA, vectorOfFrequencies);
+
+FREQUENCY_SENSITIVE = 0;
diff --git a/res/TemplateBatchFiles/TemplateModels/EX.dat b/res/TemplateBatchFiles/TemplateModels/EX.dat
new file mode 100644
index 0000000..9f9e949
--- /dev/null
+++ b/res/TemplateBatchFiles/TemplateModels/EX.dat
@@ -0,0 +1,23 @@
+ACDEFGHIKLMNPQRSTVWY
+{
+{0,0.3861,0.2753,0.3931,0.284,0.3783,0.3464,0.3227,0.4069,0.3305,0.3878,0.4033,0.3243,0.3999,0.3667,0.4338,0.3821,0.3704,0.0968,0.3242}
+{0.3861,0,0.2788,0.3164,0.224,0.2695,0.3068,0.3537,0.3134,0.3643,0.3159,0.2292,0.3076,0.3834,0.2403,0.3574,0.312,0.3702,0.1371,0.1896}
+{0.2753,0.2788,0,0.3873,0.2158,0.241,0.2736,0.178,0.2439,0.2145,0.2999,0.2036,0.2256,0.2569,0.2373,0.2806,0.2176,0.1907,0.1026,0.1988}
+{0.3931,0.3164,0.3873,0,0.235,0.2982,0.3579,0.2181,0.2951,0.2371,0.2712,0.2573,0.2726,0.3998,0.263,0.3484,0.2251,0.2245,0.0948,0.2845}
+{0.284,0.224,0.2158,0.235,0,0.1487,0.2873,0.299,0.2527,0.3257,0.321,0.1998,0.2445,0.3379,0.1842,0.2722,0.2712,0.221,0.3114,0.3489}
+{0.3783,0.2695,0.241,0.2982,0.1487,0,0.2747,0.1464,0.3529,0.1983,0.2104,0.3425,0.2422,0.3308,0.2078,0.3534,0.2933,0.2449,0.1677,0.2456}
+{0.3464,0.3068,0.2736,0.3579,0.2873,0.2747,0,0.2178,0.3511,0.3059,0.2907,0.2422,0.3131,0.3664,0.2669,0.3568,0.2388,0.2531,0.1482,0.2219}
+{0.3227,0.3537,0.178,0.2181,0.299,0.1464,0.2178,0,0.2266,0.3887,0.3567,0.1778,0.154,0.2289,0.1259,0.2048,0.1954,0.5095,0.073,0.3227}
+{0.4069,0.3134,0.2439,0.2951,0.2527,0.3529,0.3511,0.2266,0,0.2125,0.2744,0.2948,0.2416,0.4007,0.3783,0.3222,0.344,0.2365,0.1426,0.2777}
+{0.3305,0.3643,0.2145,0.2371,0.3257,0.1983,0.3059,0.3887,0.2125,0,0.4449,0.2155,0.186,0.3053,0.2049,0.2419,0.2377,0.3116,0.1633,0.3103}
+{0.3878,0.3159,0.2999,0.2712,0.321,0.2104,0.2907,0.3567,0.2744,0.4449,0,0.3476,0.1305,0.4199,0.1097,0.3454,0.1928,0.458,0.4588,0.3142}
+{0.4033,0.2292,0.2036,0.2573,0.1998,0.3425,0.2422,0.1778,0.2948,0.2155,0.3476,0,0.2868,0.3026,0.2335,0.3618,0.2857,0.1945,0.1202,0.2186}
+{0.3243,0.3076,0.2256,0.2726,0.2445,0.2422,0.3131,0.154,0.2416,0.186,0.1305,0.2868,0,0.2741,0.199,0.309,0.1996,0.222,0.1854,0.2505}
+{0.3999,0.3834,0.2569,0.3998,0.3379,0.3308,0.3664,0.2289,0.4007,0.3053,0.4199,0.3026,0.2741,0,0.332,0.3956,0.3149,0.3125,0.1054,0.3632}
+{0.3667,0.2403,0.2373,0.263,0.1842,0.2078,0.2669,0.1259,0.3783,0.2049,0.1097,0.2335,0.199,0.332,0,0.3153,0.2808,0.1899,0.0928,0.2981}
+{0.4338,0.3574,0.2806,0.3484,0.2722,0.3534,0.3568,0.2048,0.3222,0.2419,0.3454,0.3618,0.309,0.3956,0.3153,0,0.4221,0.3289,0.1107,0.2472}
+{0.3821,0.312,0.2176,0.2251,0.2712,0.2933,0.2388,0.1954,0.344,0.2377,0.1928,0.2857,0.1996,0.3149,0.2808,0.4221,0,0.3777,0.0577,0.2597}
+{0.3704,0.3702,0.1907,0.2245,0.221,0.2449,0.2531,0.5095,0.2365,0.3116,0.458,0.1945,0.222,0.3125,0.1899,0.3289,0.3777,0,0.2505,0.2086}
+{0.0968,0.1371,0.1026,0.0948,0.3114,0.1677,0.1482,0.073,0.1426,0.1633,0.4588,0.1202,0.1854,0.1054,0.0928,0.1107,0.0577,0.2505,0,0.2866}
+{0.3242,0.1896,0.1988,0.2845,0.3489,0.2456,0.2219,0.3227,0.2777,0.3103,0.3142,0.2186,0.2505,0.3632,0.2981,0.2472,0.2597,0.2086,0.2866,0}
+}
diff --git a/res/TemplateBatchFiles/TemplateModels/EX.mdl b/res/TemplateBatchFiles/TemplateModels/EX.mdl
new file mode 100644
index 0000000..2ed1d7a
--- /dev/null
+++ b/res/TemplateBatchFiles/TemplateModels/EX.mdl
@@ -0,0 +1,790 @@
+#include "modelParameters2.mdl";
+
+if (modelType == 1)
+{
+	#include "defineGamma.mdl";
+}
+
+if (modelType == 2)
+{
+	#include "defineHM.mdl";
+}
+
+function PopulateModelMatrix (ModelMatrixName&, EFV)
+{	
+	global beta = 1;
+	ModelMatrixName = {20,20};
+	if (categoriesUsed)
+	{
+       	ModelMatrixName[14][0]:=t*(0.3667)^(beta*c);
+		ModelMatrixName[0][14]:=t*(0.3667)^(beta*c);
+		ModelMatrixName[11][0]:=t*(0.4033)^(beta*c);
+		ModelMatrixName[0][11]:=t*(0.4033)^(beta*c);
+		ModelMatrixName[11][14]:=t*(0.2335)^(beta*c);
+		ModelMatrixName[14][11]:=t*(0.2335)^(beta*c);
+		ModelMatrixName[2][0]:=t*(0.2753)^(beta*c);
+		ModelMatrixName[0][2]:=t*(0.2753)^(beta*c);
+		ModelMatrixName[2][14]:=t*(0.2373)^(beta*c);
+		ModelMatrixName[14][2]:=t*(0.2373)^(beta*c);
+		ModelMatrixName[2][11]:=t*(0.2036)^(beta*c);
+		ModelMatrixName[11][2]:=t*(0.2036)^(beta*c);
+		ModelMatrixName[1][0]:=t*(0.3861)^(beta*c);
+		ModelMatrixName[0][1]:=t*(0.3861)^(beta*c);
+		ModelMatrixName[1][14]:=t*(0.2403)^(beta*c);
+		ModelMatrixName[14][1]:=t*(0.2403)^(beta*c);
+		ModelMatrixName[1][11]:=t*(0.2292)^(beta*c);
+		ModelMatrixName[11][1]:=t*(0.2292)^(beta*c);
+		ModelMatrixName[1][2]:=t*(0.2788)^(beta*c);
+		ModelMatrixName[2][1]:=t*(0.2788)^(beta*c);
+		ModelMatrixName[13][0]:=t*(0.3999)^(beta*c);
+		ModelMatrixName[0][13]:=t*(0.3999)^(beta*c);
+		ModelMatrixName[13][14]:=t*(0.332)^(beta*c);
+		ModelMatrixName[14][13]:=t*(0.332)^(beta*c);
+		ModelMatrixName[13][11]:=t*(0.3026)^(beta*c);
+		ModelMatrixName[11][13]:=t*(0.3026)^(beta*c);
+		ModelMatrixName[13][2]:=t*(0.2569)^(beta*c);
+		ModelMatrixName[2][13]:=t*(0.2569)^(beta*c);
+		ModelMatrixName[13][1]:=t*(0.3834)^(beta*c);
+		ModelMatrixName[1][13]:=t*(0.3834)^(beta*c);
+		ModelMatrixName[3][0]:=t*(0.3931)^(beta*c);
+		ModelMatrixName[0][3]:=t*(0.3931)^(beta*c);
+		ModelMatrixName[3][14]:=t*(0.263)^(beta*c);
+		ModelMatrixName[14][3]:=t*(0.263)^(beta*c);
+		ModelMatrixName[3][11]:=t*(0.2573)^(beta*c);
+		ModelMatrixName[11][3]:=t*(0.2573)^(beta*c);
+		ModelMatrixName[3][2]:=t*(0.3873)^(beta*c);
+		ModelMatrixName[2][3]:=t*(0.3873)^(beta*c);
+		ModelMatrixName[3][1]:=t*(0.3164)^(beta*c);
+		ModelMatrixName[1][3]:=t*(0.3164)^(beta*c);
+		ModelMatrixName[3][13]:=t*(0.3998)^(beta*c);
+		ModelMatrixName[13][3]:=t*(0.3998)^(beta*c);
+		ModelMatrixName[5][0]:=t*(0.3783)^(beta*c);
+		ModelMatrixName[0][5]:=t*(0.3783)^(beta*c);
+		ModelMatrixName[5][14]:=t*(0.2078)^(beta*c);
+		ModelMatrixName[14][5]:=t*(0.2078)^(beta*c);
+		ModelMatrixName[5][11]:=t*(0.3425)^(beta*c);
+		ModelMatrixName[11][5]:=t*(0.3425)^(beta*c);
+		ModelMatrixName[5][2]:=t*(0.241)^(beta*c);
+		ModelMatrixName[2][5]:=t*(0.241)^(beta*c);
+		ModelMatrixName[5][1]:=t*(0.2695)^(beta*c);
+		ModelMatrixName[1][5]:=t*(0.2695)^(beta*c);
+		ModelMatrixName[5][13]:=t*(0.3308)^(beta*c);
+		ModelMatrixName[13][5]:=t*(0.3308)^(beta*c);
+		ModelMatrixName[5][3]:=t*(0.2982)^(beta*c);
+		ModelMatrixName[3][5]:=t*(0.2982)^(beta*c);
+		ModelMatrixName[6][0]:=t*(0.3464)^(beta*c);
+		ModelMatrixName[0][6]:=t*(0.3464)^(beta*c);
+		ModelMatrixName[6][14]:=t*(0.2669)^(beta*c);
+		ModelMatrixName[14][6]:=t*(0.2669)^(beta*c);
+		ModelMatrixName[6][11]:=t*(0.2422)^(beta*c);
+		ModelMatrixName[11][6]:=t*(0.2422)^(beta*c);
+		ModelMatrixName[6][2]:=t*(0.2736)^(beta*c);
+		ModelMatrixName[2][6]:=t*(0.2736)^(beta*c);
+		ModelMatrixName[6][1]:=t*(0.3068)^(beta*c);
+		ModelMatrixName[1][6]:=t*(0.3068)^(beta*c);
+		ModelMatrixName[6][13]:=t*(0.3664)^(beta*c);
+		ModelMatrixName[13][6]:=t*(0.3664)^(beta*c);
+		ModelMatrixName[6][3]:=t*(0.3579)^(beta*c);
+		ModelMatrixName[3][6]:=t*(0.3579)^(beta*c);
+		ModelMatrixName[6][5]:=t*(0.2747)^(beta*c);
+		ModelMatrixName[5][6]:=t*(0.2747)^(beta*c);
+		ModelMatrixName[7][0]:=t*(0.3227)^(beta*c);
+		ModelMatrixName[0][7]:=t*(0.3227)^(beta*c);
+		ModelMatrixName[7][14]:=t*(0.1259)^(beta*c);
+		ModelMatrixName[14][7]:=t*(0.1259)^(beta*c);
+		ModelMatrixName[7][11]:=t*(0.1778)^(beta*c);
+		ModelMatrixName[11][7]:=t*(0.1778)^(beta*c);
+		ModelMatrixName[7][2]:=t*(0.178)^(beta*c);
+		ModelMatrixName[2][7]:=t*(0.178)^(beta*c);
+		ModelMatrixName[7][1]:=t*(0.3537)^(beta*c);
+		ModelMatrixName[1][7]:=t*(0.3537)^(beta*c);
+		ModelMatrixName[7][13]:=t*(0.2289)^(beta*c);
+		ModelMatrixName[13][7]:=t*(0.2289)^(beta*c);
+		ModelMatrixName[7][3]:=t*(0.2181)^(beta*c);
+		ModelMatrixName[3][7]:=t*(0.2181)^(beta*c);
+		ModelMatrixName[7][5]:=t*(0.1464)^(beta*c);
+		ModelMatrixName[5][7]:=t*(0.1464)^(beta*c);
+		ModelMatrixName[7][6]:=t*(0.2178)^(beta*c);
+		ModelMatrixName[6][7]:=t*(0.2178)^(beta*c);
+		ModelMatrixName[9][0]:=t*(0.3305)^(beta*c);
+		ModelMatrixName[0][9]:=t*(0.3305)^(beta*c);
+		ModelMatrixName[9][14]:=t*(0.2049)^(beta*c);
+		ModelMatrixName[14][9]:=t*(0.2049)^(beta*c);
+		ModelMatrixName[9][11]:=t*(0.2155)^(beta*c);
+		ModelMatrixName[11][9]:=t*(0.2155)^(beta*c);
+		ModelMatrixName[9][2]:=t*(0.2145)^(beta*c);
+		ModelMatrixName[2][9]:=t*(0.2145)^(beta*c);
+		ModelMatrixName[9][1]:=t*(0.3643)^(beta*c);
+		ModelMatrixName[1][9]:=t*(0.3643)^(beta*c);
+		ModelMatrixName[9][13]:=t*(0.3053)^(beta*c);
+		ModelMatrixName[13][9]:=t*(0.3053)^(beta*c);
+		ModelMatrixName[9][3]:=t*(0.2371)^(beta*c);
+		ModelMatrixName[3][9]:=t*(0.2371)^(beta*c);
+		ModelMatrixName[9][5]:=t*(0.1983)^(beta*c);
+		ModelMatrixName[5][9]:=t*(0.1983)^(beta*c);
+		ModelMatrixName[9][6]:=t*(0.3059)^(beta*c);
+		ModelMatrixName[6][9]:=t*(0.3059)^(beta*c);
+		ModelMatrixName[9][7]:=t*(0.3887)^(beta*c);
+		ModelMatrixName[7][9]:=t*(0.3887)^(beta*c);
+		ModelMatrixName[8][0]:=t*(0.4069)^(beta*c);
+		ModelMatrixName[0][8]:=t*(0.4069)^(beta*c);
+		ModelMatrixName[8][14]:=t*(0.3783)^(beta*c);
+		ModelMatrixName[14][8]:=t*(0.3783)^(beta*c);
+		ModelMatrixName[8][11]:=t*(0.2948)^(beta*c);
+		ModelMatrixName[11][8]:=t*(0.2948)^(beta*c);
+		ModelMatrixName[8][2]:=t*(0.2439)^(beta*c);
+		ModelMatrixName[2][8]:=t*(0.2439)^(beta*c);
+		ModelMatrixName[8][1]:=t*(0.3134)^(beta*c);
+		ModelMatrixName[1][8]:=t*(0.3134)^(beta*c);
+		ModelMatrixName[8][13]:=t*(0.4007)^(beta*c);
+		ModelMatrixName[13][8]:=t*(0.4007)^(beta*c);
+		ModelMatrixName[8][3]:=t*(0.2951)^(beta*c);
+		ModelMatrixName[3][8]:=t*(0.2951)^(beta*c);
+		ModelMatrixName[8][5]:=t*(0.3529)^(beta*c);
+		ModelMatrixName[5][8]:=t*(0.3529)^(beta*c);
+		ModelMatrixName[8][6]:=t*(0.3511)^(beta*c);
+		ModelMatrixName[6][8]:=t*(0.3511)^(beta*c);
+		ModelMatrixName[8][7]:=t*(0.2266)^(beta*c);
+		ModelMatrixName[7][8]:=t*(0.2266)^(beta*c);
+		ModelMatrixName[8][9]:=t*(0.2125)^(beta*c);
+		ModelMatrixName[9][8]:=t*(0.2125)^(beta*c);
+		ModelMatrixName[10][0]:=t*(0.3878)^(beta*c);
+		ModelMatrixName[0][10]:=t*(0.3878)^(beta*c);
+		ModelMatrixName[10][14]:=t*(0.1097)^(beta*c);
+		ModelMatrixName[14][10]:=t*(0.1097)^(beta*c);
+		ModelMatrixName[10][11]:=t*(0.3476)^(beta*c);
+		ModelMatrixName[11][10]:=t*(0.3476)^(beta*c);
+		ModelMatrixName[10][2]:=t*(0.2999)^(beta*c);
+		ModelMatrixName[2][10]:=t*(0.2999)^(beta*c);
+		ModelMatrixName[10][1]:=t*(0.3159)^(beta*c);
+		ModelMatrixName[1][10]:=t*(0.3159)^(beta*c);
+		ModelMatrixName[10][13]:=t*(0.4199)^(beta*c);
+		ModelMatrixName[13][10]:=t*(0.4199)^(beta*c);
+		ModelMatrixName[10][3]:=t*(0.2712)^(beta*c);
+		ModelMatrixName[3][10]:=t*(0.2712)^(beta*c);
+		ModelMatrixName[10][5]:=t*(0.2104)^(beta*c);
+		ModelMatrixName[5][10]:=t*(0.2104)^(beta*c);
+		ModelMatrixName[10][6]:=t*(0.2907)^(beta*c);
+		ModelMatrixName[6][10]:=t*(0.2907)^(beta*c);
+		ModelMatrixName[10][7]:=t*(0.3567)^(beta*c);
+		ModelMatrixName[7][10]:=t*(0.3567)^(beta*c);
+		ModelMatrixName[10][9]:=t*(0.4449)^(beta*c);
+		ModelMatrixName[9][10]:=t*(0.4449)^(beta*c);
+		ModelMatrixName[10][8]:=t*(0.2744)^(beta*c);
+		ModelMatrixName[8][10]:=t*(0.2744)^(beta*c);
+		ModelMatrixName[4][0]:=t*(0.284)^(beta*c);
+		ModelMatrixName[0][4]:=t*(0.284)^(beta*c);
+		ModelMatrixName[4][14]:=t*(0.1842)^(beta*c);
+		ModelMatrixName[14][4]:=t*(0.1842)^(beta*c);
+		ModelMatrixName[4][11]:=t*(0.1998)^(beta*c);
+		ModelMatrixName[11][4]:=t*(0.1998)^(beta*c);
+		ModelMatrixName[4][2]:=t*(0.2158)^(beta*c);
+		ModelMatrixName[2][4]:=t*(0.2158)^(beta*c);
+		ModelMatrixName[4][1]:=t*(0.224)^(beta*c);
+		ModelMatrixName[1][4]:=t*(0.224)^(beta*c);
+		ModelMatrixName[4][13]:=t*(0.3379)^(beta*c);
+		ModelMatrixName[13][4]:=t*(0.3379)^(beta*c);
+		ModelMatrixName[4][3]:=t*(0.235)^(beta*c);
+		ModelMatrixName[3][4]:=t*(0.235)^(beta*c);
+		ModelMatrixName[4][5]:=t*(0.1487)^(beta*c);
+		ModelMatrixName[5][4]:=t*(0.1487)^(beta*c);
+		ModelMatrixName[4][6]:=t*(0.2873)^(beta*c);
+		ModelMatrixName[6][4]:=t*(0.2873)^(beta*c);
+		ModelMatrixName[4][7]:=t*(0.299)^(beta*c);
+		ModelMatrixName[7][4]:=t*(0.299)^(beta*c);
+		ModelMatrixName[4][9]:=t*(0.3257)^(beta*c);
+		ModelMatrixName[9][4]:=t*(0.3257)^(beta*c);
+		ModelMatrixName[4][8]:=t*(0.2527)^(beta*c);
+		ModelMatrixName[8][4]:=t*(0.2527)^(beta*c);
+		ModelMatrixName[4][10]:=t*(0.321)^(beta*c);
+		ModelMatrixName[10][4]:=t*(0.321)^(beta*c);
+		ModelMatrixName[12][0]:=t*(0.3243)^(beta*c);
+		ModelMatrixName[0][12]:=t*(0.3243)^(beta*c);
+		ModelMatrixName[12][14]:=t*(0.199)^(beta*c);
+		ModelMatrixName[14][12]:=t*(0.199)^(beta*c);
+		ModelMatrixName[12][11]:=t*(0.2868)^(beta*c);
+		ModelMatrixName[11][12]:=t*(0.2868)^(beta*c);
+		ModelMatrixName[12][2]:=t*(0.2256)^(beta*c);
+		ModelMatrixName[2][12]:=t*(0.2256)^(beta*c);
+		ModelMatrixName[12][1]:=t*(0.3076)^(beta*c);
+		ModelMatrixName[1][12]:=t*(0.3076)^(beta*c);
+		ModelMatrixName[12][13]:=t*(0.2741)^(beta*c);
+		ModelMatrixName[13][12]:=t*(0.2741)^(beta*c);
+		ModelMatrixName[12][3]:=t*(0.2726)^(beta*c);
+		ModelMatrixName[3][12]:=t*(0.2726)^(beta*c);
+		ModelMatrixName[12][5]:=t*(0.2422)^(beta*c);
+		ModelMatrixName[5][12]:=t*(0.2422)^(beta*c);
+		ModelMatrixName[12][6]:=t*(0.3131)^(beta*c);
+		ModelMatrixName[6][12]:=t*(0.3131)^(beta*c);
+		ModelMatrixName[12][7]:=t*(0.154)^(beta*c);
+		ModelMatrixName[7][12]:=t*(0.154)^(beta*c);
+		ModelMatrixName[12][9]:=t*(0.186)^(beta*c);
+		ModelMatrixName[9][12]:=t*(0.186)^(beta*c);
+		ModelMatrixName[12][8]:=t*(0.2416)^(beta*c);
+		ModelMatrixName[8][12]:=t*(0.2416)^(beta*c);
+		ModelMatrixName[12][10]:=t*(0.1305)^(beta*c);
+		ModelMatrixName[10][12]:=t*(0.1305)^(beta*c);
+		ModelMatrixName[12][4]:=t*(0.2445)^(beta*c);
+		ModelMatrixName[4][12]:=t*(0.2445)^(beta*c);
+		ModelMatrixName[15][0]:=t*(0.4338)^(beta*c);
+		ModelMatrixName[0][15]:=t*(0.4338)^(beta*c);
+		ModelMatrixName[15][14]:=t*(0.3153)^(beta*c);
+		ModelMatrixName[14][15]:=t*(0.3153)^(beta*c);
+		ModelMatrixName[15][11]:=t*(0.3618)^(beta*c);
+		ModelMatrixName[11][15]:=t*(0.3618)^(beta*c);
+		ModelMatrixName[15][2]:=t*(0.2806)^(beta*c);
+		ModelMatrixName[2][15]:=t*(0.2806)^(beta*c);
+		ModelMatrixName[15][1]:=t*(0.3574)^(beta*c);
+		ModelMatrixName[1][15]:=t*(0.3574)^(beta*c);
+		ModelMatrixName[15][13]:=t*(0.3956)^(beta*c);
+		ModelMatrixName[13][15]:=t*(0.3956)^(beta*c);
+		ModelMatrixName[15][3]:=t*(0.3484)^(beta*c);
+		ModelMatrixName[3][15]:=t*(0.3484)^(beta*c);
+		ModelMatrixName[15][5]:=t*(0.3534)^(beta*c);
+		ModelMatrixName[5][15]:=t*(0.3534)^(beta*c);
+		ModelMatrixName[15][6]:=t*(0.3568)^(beta*c);
+		ModelMatrixName[6][15]:=t*(0.3568)^(beta*c);
+		ModelMatrixName[15][7]:=t*(0.2048)^(beta*c);
+		ModelMatrixName[7][15]:=t*(0.2048)^(beta*c);
+		ModelMatrixName[15][9]:=t*(0.2419)^(beta*c);
+		ModelMatrixName[9][15]:=t*(0.2419)^(beta*c);
+		ModelMatrixName[15][8]:=t*(0.3222)^(beta*c);
+		ModelMatrixName[8][15]:=t*(0.3222)^(beta*c);
+		ModelMatrixName[15][10]:=t*(0.3454)^(beta*c);
+		ModelMatrixName[10][15]:=t*(0.3454)^(beta*c);
+		ModelMatrixName[15][4]:=t*(0.2722)^(beta*c);
+		ModelMatrixName[4][15]:=t*(0.2722)^(beta*c);
+		ModelMatrixName[15][12]:=t*(0.309)^(beta*c);
+		ModelMatrixName[12][15]:=t*(0.309)^(beta*c);
+		ModelMatrixName[16][0]:=t*(0.3821)^(beta*c);
+		ModelMatrixName[0][16]:=t*(0.3821)^(beta*c);
+		ModelMatrixName[16][14]:=t*(0.2808)^(beta*c);
+		ModelMatrixName[14][16]:=t*(0.2808)^(beta*c);
+		ModelMatrixName[16][11]:=t*(0.2857)^(beta*c);
+		ModelMatrixName[11][16]:=t*(0.2857)^(beta*c);
+		ModelMatrixName[16][2]:=t*(0.2176)^(beta*c);
+		ModelMatrixName[2][16]:=t*(0.2176)^(beta*c);
+		ModelMatrixName[16][1]:=t*(0.312)^(beta*c);
+		ModelMatrixName[1][16]:=t*(0.312)^(beta*c);
+		ModelMatrixName[16][13]:=t*(0.3149)^(beta*c);
+		ModelMatrixName[13][16]:=t*(0.3149)^(beta*c);
+		ModelMatrixName[16][3]:=t*(0.2251)^(beta*c);
+		ModelMatrixName[3][16]:=t*(0.2251)^(beta*c);
+		ModelMatrixName[16][5]:=t*(0.2933)^(beta*c);
+		ModelMatrixName[5][16]:=t*(0.2933)^(beta*c);
+		ModelMatrixName[16][6]:=t*(0.2388)^(beta*c);
+		ModelMatrixName[6][16]:=t*(0.2388)^(beta*c);
+		ModelMatrixName[16][7]:=t*(0.1954)^(beta*c);
+		ModelMatrixName[7][16]:=t*(0.1954)^(beta*c);
+		ModelMatrixName[16][9]:=t*(0.2377)^(beta*c);
+		ModelMatrixName[9][16]:=t*(0.2377)^(beta*c);
+		ModelMatrixName[16][8]:=t*(0.344)^(beta*c);
+		ModelMatrixName[8][16]:=t*(0.344)^(beta*c);
+		ModelMatrixName[16][10]:=t*(0.1928)^(beta*c);
+		ModelMatrixName[10][16]:=t*(0.1928)^(beta*c);
+		ModelMatrixName[16][4]:=t*(0.2712)^(beta*c);
+		ModelMatrixName[4][16]:=t*(0.2712)^(beta*c);
+		ModelMatrixName[16][12]:=t*(0.1996)^(beta*c);
+		ModelMatrixName[12][16]:=t*(0.1996)^(beta*c);
+		ModelMatrixName[16][15]:=t*(0.4221)^(beta*c);
+		ModelMatrixName[15][16]:=t*(0.4221)^(beta*c);
+		ModelMatrixName[18][0]:=t*(0.0968)^(beta*c);
+		ModelMatrixName[0][18]:=t*(0.0968)^(beta*c);
+		ModelMatrixName[18][14]:=t*(0.0928)^(beta*c);
+		ModelMatrixName[14][18]:=t*(0.0928)^(beta*c);
+		ModelMatrixName[18][11]:=t*(0.1202)^(beta*c);
+		ModelMatrixName[11][18]:=t*(0.1202)^(beta*c);
+		ModelMatrixName[18][2]:=t*(0.1026)^(beta*c);
+		ModelMatrixName[2][18]:=t*(0.1026)^(beta*c);
+		ModelMatrixName[18][1]:=t*(0.1371)^(beta*c);
+		ModelMatrixName[1][18]:=t*(0.1371)^(beta*c);
+		ModelMatrixName[18][13]:=t*(0.1054)^(beta*c);
+		ModelMatrixName[13][18]:=t*(0.1054)^(beta*c);
+		ModelMatrixName[18][3]:=t*(0.0948)^(beta*c);
+		ModelMatrixName[3][18]:=t*(0.0948)^(beta*c);
+		ModelMatrixName[18][5]:=t*(0.1677)^(beta*c);
+		ModelMatrixName[5][18]:=t*(0.1677)^(beta*c);
+		ModelMatrixName[18][6]:=t*(0.1482)^(beta*c);
+		ModelMatrixName[6][18]:=t*(0.1482)^(beta*c);
+		ModelMatrixName[18][7]:=t*(0.073)^(beta*c);
+		ModelMatrixName[7][18]:=t*(0.073)^(beta*c);
+		ModelMatrixName[18][9]:=t*(0.1633)^(beta*c);
+		ModelMatrixName[9][18]:=t*(0.1633)^(beta*c);
+		ModelMatrixName[18][8]:=t*(0.1426)^(beta*c);
+		ModelMatrixName[8][18]:=t*(0.1426)^(beta*c);
+		ModelMatrixName[18][10]:=t*(0.4588)^(beta*c);
+		ModelMatrixName[10][18]:=t*(0.4588)^(beta*c);
+		ModelMatrixName[18][4]:=t*(0.3114)^(beta*c);
+		ModelMatrixName[4][18]:=t*(0.3114)^(beta*c);
+		ModelMatrixName[18][12]:=t*(0.1854)^(beta*c);
+		ModelMatrixName[12][18]:=t*(0.1854)^(beta*c);
+		ModelMatrixName[18][15]:=t*(0.1107)^(beta*c);
+		ModelMatrixName[15][18]:=t*(0.1107)^(beta*c);
+		ModelMatrixName[18][16]:=t*(0.0577)^(beta*c);
+		ModelMatrixName[16][18]:=t*(0.0577)^(beta*c);
+		ModelMatrixName[19][0]:=t*(0.3242)^(beta*c);
+		ModelMatrixName[0][19]:=t*(0.3242)^(beta*c);
+		ModelMatrixName[19][14]:=t*(0.2981)^(beta*c);
+		ModelMatrixName[14][19]:=t*(0.2981)^(beta*c);
+		ModelMatrixName[19][11]:=t*(0.2186)^(beta*c);
+		ModelMatrixName[11][19]:=t*(0.2186)^(beta*c);
+		ModelMatrixName[19][2]:=t*(0.1988)^(beta*c);
+		ModelMatrixName[2][19]:=t*(0.1988)^(beta*c);
+		ModelMatrixName[19][1]:=t*(0.1896)^(beta*c);
+		ModelMatrixName[1][19]:=t*(0.1896)^(beta*c);
+		ModelMatrixName[19][13]:=t*(0.3632)^(beta*c);
+		ModelMatrixName[13][19]:=t*(0.3632)^(beta*c);
+		ModelMatrixName[19][3]:=t*(0.2845)^(beta*c);
+		ModelMatrixName[3][19]:=t*(0.2845)^(beta*c);
+		ModelMatrixName[19][5]:=t*(0.2456)^(beta*c);
+		ModelMatrixName[5][19]:=t*(0.2456)^(beta*c);
+		ModelMatrixName[19][6]:=t*(0.2219)^(beta*c);
+		ModelMatrixName[6][19]:=t*(0.2219)^(beta*c);
+		ModelMatrixName[19][7]:=t*(0.3227)^(beta*c);
+		ModelMatrixName[7][19]:=t*(0.3227)^(beta*c);
+		ModelMatrixName[19][9]:=t*(0.3103)^(beta*c);
+		ModelMatrixName[9][19]:=t*(0.3103)^(beta*c);
+		ModelMatrixName[19][8]:=t*(0.2777)^(beta*c);
+		ModelMatrixName[8][19]:=t*(0.2777)^(beta*c);
+		ModelMatrixName[19][10]:=t*(0.3142)^(beta*c);
+		ModelMatrixName[10][19]:=t*(0.3142)^(beta*c);
+		ModelMatrixName[19][4]:=t*(0.3489)^(beta*c);
+		ModelMatrixName[4][19]:=t*(0.3489)^(beta*c);
+		ModelMatrixName[19][12]:=t*(0.2505)^(beta*c);
+		ModelMatrixName[12][19]:=t*(0.2505)^(beta*c);
+		ModelMatrixName[19][15]:=t*(0.2472)^(beta*c);
+		ModelMatrixName[15][19]:=t*(0.2472)^(beta*c);
+		ModelMatrixName[19][16]:=t*(0.2597)^(beta*c);
+		ModelMatrixName[16][19]:=t*(0.2597)^(beta*c);
+		ModelMatrixName[19][18]:=t*(0.2866)^(beta*c);
+		ModelMatrixName[18][19]:=t*(0.2866)^(beta*c);
+		ModelMatrixName[17][0]:=t*(0.3704)^(beta*c);
+		ModelMatrixName[0][17]:=t*(0.3704)^(beta*c);
+		ModelMatrixName[17][14]:=t*(0.1899)^(beta*c);
+		ModelMatrixName[14][17]:=t*(0.1899)^(beta*c);
+		ModelMatrixName[17][11]:=t*(0.1945)^(beta*c);
+		ModelMatrixName[11][17]:=t*(0.1945)^(beta*c);
+		ModelMatrixName[17][2]:=t*(0.1907)^(beta*c);
+		ModelMatrixName[2][17]:=t*(0.1907)^(beta*c);
+		ModelMatrixName[17][1]:=t*(0.3702)^(beta*c);
+		ModelMatrixName[1][17]:=t*(0.3702)^(beta*c);
+		ModelMatrixName[17][13]:=t*(0.3125)^(beta*c);
+		ModelMatrixName[13][17]:=t*(0.3125)^(beta*c);
+		ModelMatrixName[17][3]:=t*(0.2245)^(beta*c);
+		ModelMatrixName[3][17]:=t*(0.2245)^(beta*c);
+		ModelMatrixName[17][5]:=t*(0.2449)^(beta*c);
+		ModelMatrixName[5][17]:=t*(0.2449)^(beta*c);
+		ModelMatrixName[17][6]:=t*(0.2531)^(beta*c);
+		ModelMatrixName[6][17]:=t*(0.2531)^(beta*c);
+		ModelMatrixName[17][7]:=t*(0.5095)^(beta*c);
+		ModelMatrixName[7][17]:=t*(0.5095)^(beta*c);
+		ModelMatrixName[17][9]:=t*(0.3116)^(beta*c);
+		ModelMatrixName[9][17]:=t*(0.3116)^(beta*c);
+		ModelMatrixName[17][8]:=t*(0.2365)^(beta*c);
+		ModelMatrixName[8][17]:=t*(0.2365)^(beta*c);
+		ModelMatrixName[17][10]:=t*(0.458)^(beta*c);
+		ModelMatrixName[10][17]:=t*(0.458)^(beta*c);
+		ModelMatrixName[17][4]:=t*(0.221)^(beta*c);
+		ModelMatrixName[4][17]:=t*(0.221)^(beta*c);
+		ModelMatrixName[17][12]:=t*(0.222)^(beta*c);
+		ModelMatrixName[12][17]:=t*(0.222)^(beta*c);
+		ModelMatrixName[17][15]:=t*(0.3289)^(beta*c);
+		ModelMatrixName[15][17]:=t*(0.3289)^(beta*c);
+		ModelMatrixName[17][16]:=t*(0.3777)^(beta*c);
+		ModelMatrixName[16][17]:=t*(0.3777)^(beta*c);
+		ModelMatrixName[17][18]:=t*(0.2505)^(beta*c);
+		ModelMatrixName[18][17]:=t*(0.2505)^(beta*c);
+		ModelMatrixName[17][19]:=t*(0.2086)^(beta*c);
+		ModelMatrixName[19][17]:=t*(0.2086)^(beta*c);
+	}
+	else
+	{
+       	ModelMatrixName[14][0]:=t*(0.3667)^beta;
+		ModelMatrixName[0][14]:=t*(0.3667)^beta;
+		ModelMatrixName[11][0]:=t*(0.4033)^beta;
+		ModelMatrixName[0][11]:=t*(0.4033)^beta;
+		ModelMatrixName[11][14]:=t*(0.2335)^beta;
+		ModelMatrixName[14][11]:=t*(0.2335)^beta;
+		ModelMatrixName[2][0]:=t*(0.2753)^beta;
+		ModelMatrixName[0][2]:=t*(0.2753)^beta;
+		ModelMatrixName[2][14]:=t*(0.2373)^beta;
+		ModelMatrixName[14][2]:=t*(0.2373)^beta;
+		ModelMatrixName[2][11]:=t*(0.2036)^beta;
+		ModelMatrixName[11][2]:=t*(0.2036)^beta;
+		ModelMatrixName[1][0]:=t*(0.3861)^beta;
+		ModelMatrixName[0][1]:=t*(0.3861)^beta;
+		ModelMatrixName[1][14]:=t*(0.2403)^beta;
+		ModelMatrixName[14][1]:=t*(0.2403)^beta;
+		ModelMatrixName[1][11]:=t*(0.2292)^beta;
+		ModelMatrixName[11][1]:=t*(0.2292)^beta;
+		ModelMatrixName[1][2]:=t*(0.2788)^beta;
+		ModelMatrixName[2][1]:=t*(0.2788)^beta;
+		ModelMatrixName[13][0]:=t*(0.3999)^beta;
+		ModelMatrixName[0][13]:=t*(0.3999)^beta;
+		ModelMatrixName[13][14]:=t*(0.332)^beta;
+		ModelMatrixName[14][13]:=t*(0.332)^beta;
+		ModelMatrixName[13][11]:=t*(0.3026)^beta;
+		ModelMatrixName[11][13]:=t*(0.3026)^beta;
+		ModelMatrixName[13][2]:=t*(0.2569)^beta;
+		ModelMatrixName[2][13]:=t*(0.2569)^beta;
+		ModelMatrixName[13][1]:=t*(0.3834)^beta;
+		ModelMatrixName[1][13]:=t*(0.3834)^beta;
+		ModelMatrixName[3][0]:=t*(0.3931)^beta;
+		ModelMatrixName[0][3]:=t*(0.3931)^beta;
+		ModelMatrixName[3][14]:=t*(0.263)^beta;
+		ModelMatrixName[14][3]:=t*(0.263)^beta;
+		ModelMatrixName[3][11]:=t*(0.2573)^beta;
+		ModelMatrixName[11][3]:=t*(0.2573)^beta;
+		ModelMatrixName[3][2]:=t*(0.3873)^beta;
+		ModelMatrixName[2][3]:=t*(0.3873)^beta;
+		ModelMatrixName[3][1]:=t*(0.3164)^beta;
+		ModelMatrixName[1][3]:=t*(0.3164)^beta;
+		ModelMatrixName[3][13]:=t*(0.3998)^beta;
+		ModelMatrixName[13][3]:=t*(0.3998)^beta;
+		ModelMatrixName[5][0]:=t*(0.3783)^beta;
+		ModelMatrixName[0][5]:=t*(0.3783)^beta;
+		ModelMatrixName[5][14]:=t*(0.2078)^beta;
+		ModelMatrixName[14][5]:=t*(0.2078)^beta;
+		ModelMatrixName[5][11]:=t*(0.3425)^beta;
+		ModelMatrixName[11][5]:=t*(0.3425)^beta;
+		ModelMatrixName[5][2]:=t*(0.241)^beta;
+		ModelMatrixName[2][5]:=t*(0.241)^beta;
+		ModelMatrixName[5][1]:=t*(0.2695)^beta;
+		ModelMatrixName[1][5]:=t*(0.2695)^beta;
+		ModelMatrixName[5][13]:=t*(0.3308)^beta;
+		ModelMatrixName[13][5]:=t*(0.3308)^beta;
+		ModelMatrixName[5][3]:=t*(0.2982)^beta;
+		ModelMatrixName[3][5]:=t*(0.2982)^beta;
+		ModelMatrixName[6][0]:=t*(0.3464)^beta;
+		ModelMatrixName[0][6]:=t*(0.3464)^beta;
+		ModelMatrixName[6][14]:=t*(0.2669)^beta;
+		ModelMatrixName[14][6]:=t*(0.2669)^beta;
+		ModelMatrixName[6][11]:=t*(0.2422)^beta;
+		ModelMatrixName[11][6]:=t*(0.2422)^beta;
+		ModelMatrixName[6][2]:=t*(0.2736)^beta;
+		ModelMatrixName[2][6]:=t*(0.2736)^beta;
+		ModelMatrixName[6][1]:=t*(0.3068)^beta;
+		ModelMatrixName[1][6]:=t*(0.3068)^beta;
+		ModelMatrixName[6][13]:=t*(0.3664)^beta;
+		ModelMatrixName[13][6]:=t*(0.3664)^beta;
+		ModelMatrixName[6][3]:=t*(0.3579)^beta;
+		ModelMatrixName[3][6]:=t*(0.3579)^beta;
+		ModelMatrixName[6][5]:=t*(0.2747)^beta;
+		ModelMatrixName[5][6]:=t*(0.2747)^beta;
+		ModelMatrixName[7][0]:=t*(0.3227)^beta;
+		ModelMatrixName[0][7]:=t*(0.3227)^beta;
+		ModelMatrixName[7][14]:=t*(0.1259)^beta;
+		ModelMatrixName[14][7]:=t*(0.1259)^beta;
+		ModelMatrixName[7][11]:=t*(0.1778)^beta;
+		ModelMatrixName[11][7]:=t*(0.1778)^beta;
+		ModelMatrixName[7][2]:=t*(0.178)^beta;
+		ModelMatrixName[2][7]:=t*(0.178)^beta;
+		ModelMatrixName[7][1]:=t*(0.3537)^beta;
+		ModelMatrixName[1][7]:=t*(0.3537)^beta;
+		ModelMatrixName[7][13]:=t*(0.2289)^beta;
+		ModelMatrixName[13][7]:=t*(0.2289)^beta;
+		ModelMatrixName[7][3]:=t*(0.2181)^beta;
+		ModelMatrixName[3][7]:=t*(0.2181)^beta;
+		ModelMatrixName[7][5]:=t*(0.1464)^beta;
+		ModelMatrixName[5][7]:=t*(0.1464)^beta;
+		ModelMatrixName[7][6]:=t*(0.2178)^beta;
+		ModelMatrixName[6][7]:=t*(0.2178)^beta;
+		ModelMatrixName[9][0]:=t*(0.3305)^beta;
+		ModelMatrixName[0][9]:=t*(0.3305)^beta;
+		ModelMatrixName[9][14]:=t*(0.2049)^beta;
+		ModelMatrixName[14][9]:=t*(0.2049)^beta;
+		ModelMatrixName[9][11]:=t*(0.2155)^beta;
+		ModelMatrixName[11][9]:=t*(0.2155)^beta;
+		ModelMatrixName[9][2]:=t*(0.2145)^beta;
+		ModelMatrixName[2][9]:=t*(0.2145)^beta;
+		ModelMatrixName[9][1]:=t*(0.3643)^beta;
+		ModelMatrixName[1][9]:=t*(0.3643)^beta;
+		ModelMatrixName[9][13]:=t*(0.3053)^beta;
+		ModelMatrixName[13][9]:=t*(0.3053)^beta;
+		ModelMatrixName[9][3]:=t*(0.2371)^beta;
+		ModelMatrixName[3][9]:=t*(0.2371)^beta;
+		ModelMatrixName[9][5]:=t*(0.1983)^beta;
+		ModelMatrixName[5][9]:=t*(0.1983)^beta;
+		ModelMatrixName[9][6]:=t*(0.3059)^beta;
+		ModelMatrixName[6][9]:=t*(0.3059)^beta;
+		ModelMatrixName[9][7]:=t*(0.3887)^beta;
+		ModelMatrixName[7][9]:=t*(0.3887)^beta;
+		ModelMatrixName[8][0]:=t*(0.4069)^beta;
+		ModelMatrixName[0][8]:=t*(0.4069)^beta;
+		ModelMatrixName[8][14]:=t*(0.3783)^beta;
+		ModelMatrixName[14][8]:=t*(0.3783)^beta;
+		ModelMatrixName[8][11]:=t*(0.2948)^beta;
+		ModelMatrixName[11][8]:=t*(0.2948)^beta;
+		ModelMatrixName[8][2]:=t*(0.2439)^beta;
+		ModelMatrixName[2][8]:=t*(0.2439)^beta;
+		ModelMatrixName[8][1]:=t*(0.3134)^beta;
+		ModelMatrixName[1][8]:=t*(0.3134)^beta;
+		ModelMatrixName[8][13]:=t*(0.4007)^beta;
+		ModelMatrixName[13][8]:=t*(0.4007)^beta;
+		ModelMatrixName[8][3]:=t*(0.2951)^beta;
+		ModelMatrixName[3][8]:=t*(0.2951)^beta;
+		ModelMatrixName[8][5]:=t*(0.3529)^beta;
+		ModelMatrixName[5][8]:=t*(0.3529)^beta;
+		ModelMatrixName[8][6]:=t*(0.3511)^beta;
+		ModelMatrixName[6][8]:=t*(0.3511)^beta;
+		ModelMatrixName[8][7]:=t*(0.2266)^beta;
+		ModelMatrixName[7][8]:=t*(0.2266)^beta;
+		ModelMatrixName[8][9]:=t*(0.2125)^beta;
+		ModelMatrixName[9][8]:=t*(0.2125)^beta;
+		ModelMatrixName[10][0]:=t*(0.3878)^beta;
+		ModelMatrixName[0][10]:=t*(0.3878)^beta;
+		ModelMatrixName[10][14]:=t*(0.1097)^beta;
+		ModelMatrixName[14][10]:=t*(0.1097)^beta;
+		ModelMatrixName[10][11]:=t*(0.3476)^beta;
+		ModelMatrixName[11][10]:=t*(0.3476)^beta;
+		ModelMatrixName[10][2]:=t*(0.2999)^beta;
+		ModelMatrixName[2][10]:=t*(0.2999)^beta;
+		ModelMatrixName[10][1]:=t*(0.3159)^beta;
+		ModelMatrixName[1][10]:=t*(0.3159)^beta;
+		ModelMatrixName[10][13]:=t*(0.4199)^beta;
+		ModelMatrixName[13][10]:=t*(0.4199)^beta;
+		ModelMatrixName[10][3]:=t*(0.2712)^beta;
+		ModelMatrixName[3][10]:=t*(0.2712)^beta;
+		ModelMatrixName[10][5]:=t*(0.2104)^beta;
+		ModelMatrixName[5][10]:=t*(0.2104)^beta;
+		ModelMatrixName[10][6]:=t*(0.2907)^beta;
+		ModelMatrixName[6][10]:=t*(0.2907)^beta;
+		ModelMatrixName[10][7]:=t*(0.3567)^beta;
+		ModelMatrixName[7][10]:=t*(0.3567)^beta;
+		ModelMatrixName[10][9]:=t*(0.4449)^beta;
+		ModelMatrixName[9][10]:=t*(0.4449)^beta;
+		ModelMatrixName[10][8]:=t*(0.2744)^beta;
+		ModelMatrixName[8][10]:=t*(0.2744)^beta;
+		ModelMatrixName[4][0]:=t*(0.284)^beta;
+		ModelMatrixName[0][4]:=t*(0.284)^beta;
+		ModelMatrixName[4][14]:=t*(0.1842)^beta;
+		ModelMatrixName[14][4]:=t*(0.1842)^beta;
+		ModelMatrixName[4][11]:=t*(0.1998)^beta;
+		ModelMatrixName[11][4]:=t*(0.1998)^beta;
+		ModelMatrixName[4][2]:=t*(0.2158)^beta;
+		ModelMatrixName[2][4]:=t*(0.2158)^beta;
+		ModelMatrixName[4][1]:=t*(0.224)^beta;
+		ModelMatrixName[1][4]:=t*(0.224)^beta;
+		ModelMatrixName[4][13]:=t*(0.3379)^beta;
+		ModelMatrixName[13][4]:=t*(0.3379)^beta;
+		ModelMatrixName[4][3]:=t*(0.235)^beta;
+		ModelMatrixName[3][4]:=t*(0.235)^beta;
+		ModelMatrixName[4][5]:=t*(0.1487)^beta;
+		ModelMatrixName[5][4]:=t*(0.1487)^beta;
+		ModelMatrixName[4][6]:=t*(0.2873)^beta;
+		ModelMatrixName[6][4]:=t*(0.2873)^beta;
+		ModelMatrixName[4][7]:=t*(0.299)^beta;
+		ModelMatrixName[7][4]:=t*(0.299)^beta;
+		ModelMatrixName[4][9]:=t*(0.3257)^beta;
+		ModelMatrixName[9][4]:=t*(0.3257)^beta;
+		ModelMatrixName[4][8]:=t*(0.2527)^beta;
+		ModelMatrixName[8][4]:=t*(0.2527)^beta;
+		ModelMatrixName[4][10]:=t*(0.321)^beta;
+		ModelMatrixName[10][4]:=t*(0.321)^beta;
+		ModelMatrixName[12][0]:=t*(0.3243)^beta;
+		ModelMatrixName[0][12]:=t*(0.3243)^beta;
+		ModelMatrixName[12][14]:=t*(0.199)^beta;
+		ModelMatrixName[14][12]:=t*(0.199)^beta;
+		ModelMatrixName[12][11]:=t*(0.2868)^beta;
+		ModelMatrixName[11][12]:=t*(0.2868)^beta;
+		ModelMatrixName[12][2]:=t*(0.2256)^beta;
+		ModelMatrixName[2][12]:=t*(0.2256)^beta;
+		ModelMatrixName[12][1]:=t*(0.3076)^beta;
+		ModelMatrixName[1][12]:=t*(0.3076)^beta;
+		ModelMatrixName[12][13]:=t*(0.2741)^beta;
+		ModelMatrixName[13][12]:=t*(0.2741)^beta;
+		ModelMatrixName[12][3]:=t*(0.2726)^beta;
+		ModelMatrixName[3][12]:=t*(0.2726)^beta;
+		ModelMatrixName[12][5]:=t*(0.2422)^beta;
+		ModelMatrixName[5][12]:=t*(0.2422)^beta;
+		ModelMatrixName[12][6]:=t*(0.3131)^beta;
+		ModelMatrixName[6][12]:=t*(0.3131)^beta;
+		ModelMatrixName[12][7]:=t*(0.154)^beta;
+		ModelMatrixName[7][12]:=t*(0.154)^beta;
+		ModelMatrixName[12][9]:=t*(0.186)^beta;
+		ModelMatrixName[9][12]:=t*(0.186)^beta;
+		ModelMatrixName[12][8]:=t*(0.2416)^beta;
+		ModelMatrixName[8][12]:=t*(0.2416)^beta;
+		ModelMatrixName[12][10]:=t*(0.1305)^beta;
+		ModelMatrixName[10][12]:=t*(0.1305)^beta;
+		ModelMatrixName[12][4]:=t*(0.2445)^beta;
+		ModelMatrixName[4][12]:=t*(0.2445)^beta;
+		ModelMatrixName[15][0]:=t*(0.4338)^beta;
+		ModelMatrixName[0][15]:=t*(0.4338)^beta;
+		ModelMatrixName[15][14]:=t*(0.3153)^beta;
+		ModelMatrixName[14][15]:=t*(0.3153)^beta;
+		ModelMatrixName[15][11]:=t*(0.3618)^beta;
+		ModelMatrixName[11][15]:=t*(0.3618)^beta;
+		ModelMatrixName[15][2]:=t*(0.2806)^beta;
+		ModelMatrixName[2][15]:=t*(0.2806)^beta;
+		ModelMatrixName[15][1]:=t*(0.3574)^beta;
+		ModelMatrixName[1][15]:=t*(0.3574)^beta;
+		ModelMatrixName[15][13]:=t*(0.3956)^beta;
+		ModelMatrixName[13][15]:=t*(0.3956)^beta;
+		ModelMatrixName[15][3]:=t*(0.3484)^beta;
+		ModelMatrixName[3][15]:=t*(0.3484)^beta;
+		ModelMatrixName[15][5]:=t*(0.3534)^beta;
+		ModelMatrixName[5][15]:=t*(0.3534)^beta;
+		ModelMatrixName[15][6]:=t*(0.3568)^beta;
+		ModelMatrixName[6][15]:=t*(0.3568)^beta;
+		ModelMatrixName[15][7]:=t*(0.2048)^beta;
+		ModelMatrixName[7][15]:=t*(0.2048)^beta;
+		ModelMatrixName[15][9]:=t*(0.2419)^beta;
+		ModelMatrixName[9][15]:=t*(0.2419)^beta;
+		ModelMatrixName[15][8]:=t*(0.3222)^beta;
+		ModelMatrixName[8][15]:=t*(0.3222)^beta;
+		ModelMatrixName[15][10]:=t*(0.3454)^beta;
+		ModelMatrixName[10][15]:=t*(0.3454)^beta;
+		ModelMatrixName[15][4]:=t*(0.2722)^beta;
+		ModelMatrixName[4][15]:=t*(0.2722)^beta;
+		ModelMatrixName[15][12]:=t*(0.309)^beta;
+		ModelMatrixName[12][15]:=t*(0.309)^beta;
+		ModelMatrixName[16][0]:=t*(0.3821)^beta;
+		ModelMatrixName[0][16]:=t*(0.3821)^beta;
+		ModelMatrixName[16][14]:=t*(0.2808)^beta;
+		ModelMatrixName[14][16]:=t*(0.2808)^beta;
+		ModelMatrixName[16][11]:=t*(0.2857)^beta;
+		ModelMatrixName[11][16]:=t*(0.2857)^beta;
+		ModelMatrixName[16][2]:=t*(0.2176)^beta;
+		ModelMatrixName[2][16]:=t*(0.2176)^beta;
+		ModelMatrixName[16][1]:=t*(0.312)^beta;
+		ModelMatrixName[1][16]:=t*(0.312)^beta;
+		ModelMatrixName[16][13]:=t*(0.3149)^beta;
+		ModelMatrixName[13][16]:=t*(0.3149)^beta;
+		ModelMatrixName[16][3]:=t*(0.2251)^beta;
+		ModelMatrixName[3][16]:=t*(0.2251)^beta;
+		ModelMatrixName[16][5]:=t*(0.2933)^beta;
+		ModelMatrixName[5][16]:=t*(0.2933)^beta;
+		ModelMatrixName[16][6]:=t*(0.2388)^beta;
+		ModelMatrixName[6][16]:=t*(0.2388)^beta;
+		ModelMatrixName[16][7]:=t*(0.1954)^beta;
+		ModelMatrixName[7][16]:=t*(0.1954)^beta;
+		ModelMatrixName[16][9]:=t*(0.2377)^beta;
+		ModelMatrixName[9][16]:=t*(0.2377)^beta;
+		ModelMatrixName[16][8]:=t*(0.344)^beta;
+		ModelMatrixName[8][16]:=t*(0.344)^beta;
+		ModelMatrixName[16][10]:=t*(0.1928)^beta;
+		ModelMatrixName[10][16]:=t*(0.1928)^beta;
+		ModelMatrixName[16][4]:=t*(0.2712)^beta;
+		ModelMatrixName[4][16]:=t*(0.2712)^beta;
+		ModelMatrixName[16][12]:=t*(0.1996)^beta;
+		ModelMatrixName[12][16]:=t*(0.1996)^beta;
+		ModelMatrixName[16][15]:=t*(0.4221)^beta;
+		ModelMatrixName[15][16]:=t*(0.4221)^beta;
+		ModelMatrixName[18][0]:=t*(0.0968)^beta;
+		ModelMatrixName[0][18]:=t*(0.0968)^beta;
+		ModelMatrixName[18][14]:=t*(0.0928)^beta;
+		ModelMatrixName[14][18]:=t*(0.0928)^beta;
+		ModelMatrixName[18][11]:=t*(0.1202)^beta;
+		ModelMatrixName[11][18]:=t*(0.1202)^beta;
+		ModelMatrixName[18][2]:=t*(0.1026)^beta;
+		ModelMatrixName[2][18]:=t*(0.1026)^beta;
+		ModelMatrixName[18][1]:=t*(0.1371)^beta;
+		ModelMatrixName[1][18]:=t*(0.1371)^beta;
+		ModelMatrixName[18][13]:=t*(0.1054)^beta;
+		ModelMatrixName[13][18]:=t*(0.1054)^beta;
+		ModelMatrixName[18][3]:=t*(0.0948)^beta;
+		ModelMatrixName[3][18]:=t*(0.0948)^beta;
+		ModelMatrixName[18][5]:=t*(0.1677)^beta;
+		ModelMatrixName[5][18]:=t*(0.1677)^beta;
+		ModelMatrixName[18][6]:=t*(0.1482)^beta;
+		ModelMatrixName[6][18]:=t*(0.1482)^beta;
+		ModelMatrixName[18][7]:=t*(0.073)^beta;
+		ModelMatrixName[7][18]:=t*(0.073)^beta;
+		ModelMatrixName[18][9]:=t*(0.1633)^beta;
+		ModelMatrixName[9][18]:=t*(0.1633)^beta;
+		ModelMatrixName[18][8]:=t*(0.1426)^beta;
+		ModelMatrixName[8][18]:=t*(0.1426)^beta;
+		ModelMatrixName[18][10]:=t*(0.4588)^beta;
+		ModelMatrixName[10][18]:=t*(0.4588)^beta;
+		ModelMatrixName[18][4]:=t*(0.3114)^beta;
+		ModelMatrixName[4][18]:=t*(0.3114)^beta;
+		ModelMatrixName[18][12]:=t*(0.1854)^beta;
+		ModelMatrixName[12][18]:=t*(0.1854)^beta;
+		ModelMatrixName[18][15]:=t*(0.1107)^beta;
+		ModelMatrixName[15][18]:=t*(0.1107)^beta;
+		ModelMatrixName[18][16]:=t*(0.0577)^beta;
+		ModelMatrixName[16][18]:=t*(0.0577)^beta;
+		ModelMatrixName[19][0]:=t*(0.3242)^beta;
+		ModelMatrixName[0][19]:=t*(0.3242)^beta;
+		ModelMatrixName[19][14]:=t*(0.2981)^beta;
+		ModelMatrixName[14][19]:=t*(0.2981)^beta;
+		ModelMatrixName[19][11]:=t*(0.2186)^beta;
+		ModelMatrixName[11][19]:=t*(0.2186)^beta;
+		ModelMatrixName[19][2]:=t*(0.1988)^beta;
+		ModelMatrixName[2][19]:=t*(0.1988)^beta;
+		ModelMatrixName[19][1]:=t*(0.1896)^beta;
+		ModelMatrixName[1][19]:=t*(0.1896)^beta;
+		ModelMatrixName[19][13]:=t*(0.3632)^beta;
+		ModelMatrixName[13][19]:=t*(0.3632)^beta;
+		ModelMatrixName[19][3]:=t*(0.2845)^beta;
+		ModelMatrixName[3][19]:=t*(0.2845)^beta;
+		ModelMatrixName[19][5]:=t*(0.2456)^beta;
+		ModelMatrixName[5][19]:=t*(0.2456)^beta;
+		ModelMatrixName[19][6]:=t*(0.2219)^beta;
+		ModelMatrixName[6][19]:=t*(0.2219)^beta;
+		ModelMatrixName[19][7]:=t*(0.3227)^beta;
+		ModelMatrixName[7][19]:=t*(0.3227)^beta;
+		ModelMatrixName[19][9]:=t*(0.3103)^beta;
+		ModelMatrixName[9][19]:=t*(0.3103)^beta;
+		ModelMatrixName[19][8]:=t*(0.2777)^beta;
+		ModelMatrixName[8][19]:=t*(0.2777)^beta;
+		ModelMatrixName[19][10]:=t*(0.3142)^beta;
+		ModelMatrixName[10][19]:=t*(0.3142)^beta;
+		ModelMatrixName[19][4]:=t*(0.3489)^beta;
+		ModelMatrixName[4][19]:=t*(0.3489)^beta;
+		ModelMatrixName[19][12]:=t*(0.2505)^beta;
+		ModelMatrixName[12][19]:=t*(0.2505)^beta;
+		ModelMatrixName[19][15]:=t*(0.2472)^beta;
+		ModelMatrixName[15][19]:=t*(0.2472)^beta;
+		ModelMatrixName[19][16]:=t*(0.2597)^beta;
+		ModelMatrixName[16][19]:=t*(0.2597)^beta;
+		ModelMatrixName[19][18]:=t*(0.2866)^beta;
+		ModelMatrixName[18][19]:=t*(0.2866)^beta;
+		ModelMatrixName[17][0]:=t*(0.3704)^beta;
+		ModelMatrixName[0][17]:=t*(0.3704)^beta;
+		ModelMatrixName[17][14]:=t*(0.1899)^beta;
+		ModelMatrixName[14][17]:=t*(0.1899)^beta;
+		ModelMatrixName[17][11]:=t*(0.1945)^beta;
+		ModelMatrixName[11][17]:=t*(0.1945)^beta;
+		ModelMatrixName[17][2]:=t*(0.1907)^beta;
+		ModelMatrixName[2][17]:=t*(0.1907)^beta;
+		ModelMatrixName[17][1]:=t*(0.3702)^beta;
+		ModelMatrixName[1][17]:=t*(0.3702)^beta;
+		ModelMatrixName[17][13]:=t*(0.3125)^beta;
+		ModelMatrixName[13][17]:=t*(0.3125)^beta;
+		ModelMatrixName[17][3]:=t*(0.2245)^beta;
+		ModelMatrixName[3][17]:=t*(0.2245)^beta;
+		ModelMatrixName[17][5]:=t*(0.2449)^beta;
+		ModelMatrixName[5][17]:=t*(0.2449)^beta;
+		ModelMatrixName[17][6]:=t*(0.2531)^beta;
+		ModelMatrixName[6][17]:=t*(0.2531)^beta;
+		ModelMatrixName[17][7]:=t*(0.5095)^beta;
+		ModelMatrixName[7][17]:=t*(0.5095)^beta;
+		ModelMatrixName[17][9]:=t*(0.3116)^beta;
+		ModelMatrixName[9][17]:=t*(0.3116)^beta;
+		ModelMatrixName[17][8]:=t*(0.2365)^beta;
+		ModelMatrixName[8][17]:=t*(0.2365)^beta;
+		ModelMatrixName[17][10]:=t*(0.458)^beta;
+		ModelMatrixName[10][17]:=t*(0.458)^beta;
+		ModelMatrixName[17][4]:=t*(0.221)^beta;
+		ModelMatrixName[4][17]:=t*(0.221)^beta;
+		ModelMatrixName[17][12]:=t*(0.222)^beta;
+		ModelMatrixName[12][17]:=t*(0.222)^beta;
+		ModelMatrixName[17][15]:=t*(0.3289)^beta;
+		ModelMatrixName[15][17]:=t*(0.3289)^beta;
+		ModelMatrixName[17][16]:=t*(0.3777)^beta;
+		ModelMatrixName[16][17]:=t*(0.3777)^beta;
+		ModelMatrixName[17][18]:=t*(0.2505)^beta;
+		ModelMatrixName[18][17]:=t*(0.2505)^beta;
+		ModelMatrixName[17][19]:=t*(0.2086)^beta;
+		ModelMatrixName[19][17]:=t*(0.2086)^beta;
+	}
+	return 1;
+}
+
+EXMatrix = 0;
+HarvestFrequencies (vectorOfFrequencies,filteredData,1,1,0);
+MULTIPLY_BY_FREQS = PopulateModelMatrix ("EXMatrix",vectorOfFrequencies);
+Model EXModel = (EXMatrix, vectorOfFrequencies, MULTIPLY_BY_FREQS);
+FREQUENCY_SENSITIVE = 1;
diff --git a/res/TemplateBatchFiles/TemplateModels/EmpiricalAA/BLOSUM62 b/res/TemplateBatchFiles/TemplateModels/EmpiricalAA/BLOSUM62
new file mode 100644
index 0000000..a7fbf94
--- /dev/null
+++ b/res/TemplateBatchFiles/TemplateModels/EmpiricalAA/BLOSUM62
@@ -0,0 +1,44 @@
+ACDEFGHIKLMNPQRSTVWY
+{{             0,      1.303535,    0.48495393,     1.0454644,    0.44013616,     1.7462815,    0.63948549,    0.54096789,     1.1564011,    0.71428283,     1.1193994,    0.43337417,     1.0475419,     1.0711393,    0.65693948,     3.8615945,     1.5438708,     1.9533219,    0.41591773,    0.64124014}
+{      1.303535,             0,    0.21502738,    0.12566555,    0.39404158,    0.37338648,     0.3161155,    0.69185257,    0.25452836,     0.7426983,    0.68541952,    0.35477601,    0.31785688,    0.29445836,    0.20341156,     1.0688918,    0.99982473,    0.99671866,    0.47111731,    0.41984475}
+{    0.48495393,    0.21502738,             0,      3.358511,    0.25153905,    0.71290493,    0.69475307,    0.37370124,    0.92180573,    0.19475553,    0.19876464,     2.8393049,    0.65233056,     1.0633181,     0.4472786,     1.4131384,    0.83407539,    0.23046689,    0.12976916,    0.23340692}
+{     1.0454644,    0.12566555,      3.358511,             0,    0.26018026,    0.37818708,     1.4525454,    0.16682449,     2.5021053,    0.33269283,    0.49589436,     1.1075517,    0.82726879,      4.936413,     1.2147684,     1.5802228,     0.9563132,    0.46807223,    0.36395141,    0.53277193}
+{    0.44013616,    0.39404158,    0.25153905,    0.26018026,             0,    0.32871194,    0.63796076,     1.3547516,    0.23831978,     1.8435613,     1.5837601,    0.31683257,    0.20856441,    0.12888696,    0.33181742,    0.48215563,    0.43588755,     0.7483026,     1.8520301,     6.0241909}
+{     1.7462815,    0.37338648,    0.71290493,    0.37818708,    0.32871194,             0,    0.48200517,    0.16901037,    0.67144988,    0.19438909,    0.41020074,     1.2105704,     0.4500662,    0.54449218,    0.37388658,     1.3475794,    0.57269658,    0.22619155,    0.45388069,    0.27504297}
+{    0.63948549,     0.3161155,    0.69475307,     1.4525454,    0.63796076,    0.48200517,             0,     0.2256359,    0.91293016,    0.31077108,    0.87882787,     2.1557516,    0.47053064,      2.174358,     1.3000939,    0.99732337,    0.52267199,    0.17995624,    0.26896532,     3.7668301}
+{    0.54096789,    0.69185257,    0.37370124,    0.16682449,     1.3547516,    0.16901037,     0.2256359,             0,    0.36266389,      3.473989,     3.0042095,     0.2526878,    0.34673734,    0.21088984,    0.20717028,     0.3192282,      1.052734,     7.4211019,    0.30533691,    0.60232181}
+{     1.1564011,    0.25452836,    0.92180573,     2.5021053,    0.23831978,    0.67144988,    0.91293016,    0.36266389,             0,    0.39782078,    0.95806668,     1.4224087,     0.9351407,     3.5224823,     4.8312335,     1.5643952,     1.1641455,    0.44475551,    0.29663824,    0.64104978}
+{    0.71428283,     0.7426983,    0.19475553,    0.33269283,     1.8435613,    0.19438909,    0.31077108,      3.473989,    0.39782078,             0,      5.384295,    0.18918118,    0.33441646,    0.51850245,    0.55597883,    0.31514327,    0.81717612,     1.9922773,    0.61737282,    0.72430877}
+{     1.1193994,    0.68541952,    0.19876464,    0.49589436,     1.5837601,    0.41020074,    0.87882787,     3.0042095,    0.95806668,      5.384295,             0,    0.57895113,    0.40545751,     2.2275308,    0.87827562,     0.8202685,     1.3290279,     2.2998099,    0.79292782,    0.84969523}
+{    0.43337417,    0.35477601,     2.8393049,     1.1075517,    0.31683257,     1.2105704,     2.1557516,     0.2526878,     1.4224087,    0.18918118,    0.57895113,             0,    0.44185252,     1.6421167,     1.1584059,     2.5928839,      1.694756,    0.27933131,    0.17096189,    0.48054395}
+{     1.0475419,    0.31785688,    0.65233056,    0.82726879,    0.20856441,     0.4500662,    0.47053064,    0.34673734,     0.9351407,    0.33441646,    0.40545751,    0.44185252,             0,    0.76656194,    0.40010946,     1.0438399,    0.89770254,    0.44365726,    0.22518625,    0.32981803}
+{     1.0711393,    0.29445836,     1.0633181,      4.936413,    0.12888696,    0.54449218,      2.174358,    0.21088984,     3.5224823,    0.51850245,     2.2275308,     1.6421167,    0.76656194,             0,     2.6971062,     1.7275207,     1.1405792,    0.47390418,    0.67735274,    0.85621969}
+{    0.65693948,    0.20341156,     0.4472786,     1.2147684,    0.33181742,    0.37388658,     1.3000939,    0.20717028,     4.8312335,    0.55597883,    0.87827562,     1.1584059,    0.40010946,     2.6971062,             0,     1.0024602,    0.81664586,     0.3914085,    0.38068909,    0.64330325}
+{     3.8615945,     1.0688918,     1.4131384,     1.5802228,    0.48215563,     1.3475794,    0.99732337,     0.3192282,     1.5643952,    0.31514327,     0.8202685,     2.5928839,     1.0438399,     1.7275207,     1.0024602,             0,     4.5994902,    0.50170677,    0.34635361,    0.71136771}
+{     1.5438708,    0.99982473,    0.83407539,     0.9563132,    0.43588755,    0.57269658,    0.52267199,      1.052734,     1.1641455,    0.81717612,     1.3290279,      1.694756,    0.89770254,     1.1405792,    0.81664586,     4.5994902,             0,     2.0116236,     0.4581388,    0.71517005}
+{     1.9533219,    0.99671866,    0.23046689,    0.46807223,     0.7483026,    0.22619155,    0.17995624,     7.4211019,    0.44475551,     1.9922773,     2.2998099,    0.27933131,    0.44365726,    0.47390418,     0.3914085,    0.50170677,     2.0116236,             0,    0.23794835,    0.89283509}
+{    0.41591773,    0.47111731,    0.12976916,    0.36395141,     1.8520301,    0.45388069,    0.26896532,    0.30533691,    0.29663824,    0.61737282,    0.79292782,    0.17096189,    0.22518625,    0.67735274,    0.38068909,    0.34635361,     0.4581388,    0.23794835,             0,     3.6199276}
+{    0.64124014,    0.41984475,    0.23340692,    0.53277193,     6.0241909,    0.27504297,     3.7668301,    0.60232181,    0.64104978,    0.72430877,    0.84969523,    0.48054395,    0.32981803,    0.85621969,    0.64330325,    0.71136771,    0.71517005,    0.89283509,     3.6199276,             0}
+}
+
+{{         0.074}
+{         0.025}
+{         0.054}
+{         0.054}
+{         0.047}
+{         0.074}
+{         0.026}
+{         0.068}
+{         0.058}
+{         0.099}
+{         0.025}
+{         0.045}
+{         0.039}
+{         0.034}
+{         0.052}
+{         0.057}
+{         0.051}
+{         0.073}
+{         0.013}
+{         0.032}
+}
diff --git a/res/TemplateBatchFiles/TemplateModels/EmpiricalAA/Dayhoff b/res/TemplateBatchFiles/TemplateModels/EmpiricalAA/Dayhoff
new file mode 100644
index 0000000..d339183
--- /dev/null
+++ b/res/TemplateBatchFiles/TemplateModels/EmpiricalAA/Dayhoff
@@ -0,0 +1,46 @@
+ACDEFGHIKLMNPQRSTVWY
+
+{{             0,    0.35794081,      1.193136,     1.9686744,     0.1789704,      2.386272,     0.2286844,    0.64628201,     0.2585128,    0.40765481,    0.71588161,    0.97439441,        2.4857,    0.88490921,     0.2684556,     4.0666053,     3.6887789,     2.0681024,             0,     0.2386272}
+{    0.35794081,             0,             0,             0,             0,     0.1093708,     0.2783984,    0.43748321,             0,             0,             0,             0,     0.1889132,             0,     0.2286844,     1.6007908,     0.1590848,    0.48719721,             0,    0.95450881}
+{      1.193136,             0,             0,     11.464049,             0,       1.24285,    0.85508081,     0.2386272,    0.70593881,             0,             0,     8.9982341,     0.1292564,     1.3323352,             0,    0.94456601,    0.65622481,     0.1789704,             0,             0}
+{     1.9686744,             0,     11.464049,             0,             0,    0.80536681,    0.42754041,    0.60651081,    0.82525241,     0.1093708,      0.298284,     1.4715344,    0.50708281,     7.1190449,  0.0099428001,    0.78548121,     0.3380552,    0.36788361,             0,     0.2187416}
+{     0.1789704,             0,             0,             0,             0,      0.149142,    0.47725441,     1.9487888,             0,     1.5610196,    0.91473761,     0.1391992,     0.1093708,             0,     0.1391992,    0.45736881,     0.1292564,     0.1193136,    0.75565281,     6.9400745}
+{      2.386272,     0.1093708,       1.24285,    0.80536681,      0.149142,             0,   0.099428001,             0,     0.2684556,   0.069599601,     0.1690276,     1.3820492,     0.3380552,     0.2783984,   0.089485201,     2.3266152,      0.298284,    0.53691121,             0,             0}
+{     0.2286844,     0.2783984,    0.85508081,    0.42754041,    0.47725441,   0.099428001,             0,   0.069599601,     0.2585128,    0.43748321,             0,     5.3193981,    0.93462321,     6.0253369,      2.386272,    0.34799801,     0.2187416,    0.43748321,     0.2684556,     1.2627356}
+{    0.64628201,    0.43748321,     0.2386272,    0.60651081,     1.9487888,             0,   0.069599601,             0,    0.45736881,     2.5552996,     3.3407808,    0.76559561,     0.1193136,     0.1789704,    0.63633921,     0.2386272,     1.9090176,     8.8391493,             0,    0.36788361}
+{     0.2585128,             0,    0.70593881,    0.82525241,             0,     0.2684556,     0.2585128,    0.45736881,             0,     0.1789704,     2.4161004,     3.1618104,     0.3281124,     1.5212484,     4.6134593,    0.95450881,     1.3522208,   0.099428001,             0,     0.1292564}
+{    0.40765481,             0,             0,     0.1093708,     1.5610196,   0.069599601,    0.43748321,     2.5552996,     0.1789704,             0,     5.2398557,     0.3380552,     0.3181696,    0.72582441,      0.149142,     0.1690276,     0.3281124,       1.73999,    0.45736881,     0.2783984}
+{    0.71588161,             0,             0,      0.298284,    0.91473761,     0.1690276,             0,     3.3407808,     2.4161004,     5.2398557,             0,  0.0099428001,     0.1690276,     1.1334792,    0.89485201,    0.61645361,     1.0340512,     2.5652424,             0,             0}
+{    0.97439441,             0,     8.9982341,     1.4715344,     0.1391992,     1.3820492,     5.3193981,    0.76559561,     3.1618104,     0.3380552,  0.0099428001,             0,    0.41759761,     1.0241084,     0.3181696,     4.9216861,     2.2769012,      0.149142,     0.2286844,    0.94456601}
+{        2.4857,     0.1889132,     0.1292564,    0.50708281,     0.1093708,     0.3380552,    0.93462321,     0.1193136,     0.3281124,     0.3181696,     0.1690276,    0.41759761,             0,     1.5212484,     1.0241084,      2.435986,    0.77553841,    0.47725441,             0,             0}
+{    0.88490921,             0,     1.3323352,     7.1190449,             0,     0.2783984,     6.0253369,     0.1789704,     1.5212484,    0.72582441,     1.1334792,     1.0241084,     1.5212484,             0,     2.4459288,    0.55679681,    0.52696841,    0.34799801,             0,             0}
+{     0.2684556,     0.2286844,             0,  0.0099428001,     0.1391992,   0.089485201,      2.386272,    0.63633921,     4.6134593,      0.149142,    0.89485201,     0.3181696,     1.0241084,     2.4459288,             0,     1.5311912,     0.2585128,     0.2386272,     1.9985028,   0.079542401}
+{     4.0666053,     1.6007908,    0.94456601,    0.78548121,    0.45736881,     2.3266152,    0.34799801,     0.2386272,    0.95450881,     0.1690276,    0.61645361,     4.9216861,      2.435986,    0.55679681,     1.5311912,             0,     5.4685401,      0.298284,    0.74571001,     0.3380552}
+{     3.6887789,     0.1590848,    0.65622481,     0.3380552,     0.1292564,      0.298284,     0.2187416,     1.9090176,     1.3522208,     0.3281124,     1.0340512,     2.2769012,    0.77553841,    0.52696841,     0.2585128,     5.4685401,             0,     1.5610196,             0,    0.41759761}
+{     2.0681024,    0.48719721,     0.1789704,    0.36788361,     0.1193136,    0.53691121,    0.43748321,     8.8391493,   0.099428001,       1.73999,     2.5652424,      0.149142,    0.47725441,    0.34799801,     0.2386272,      0.298284,     1.5610196,             0,             0,     0.2783984}
+{             0,             0,             0,             0,    0.75565281,             0,     0.2684556,             0,             0,    0.45736881,             0,     0.2286844,             0,             0,     1.9985028,    0.74571001,             0,             0,             0,    0.60651081}
+{     0.2386272,    0.95450881,             0,     0.2187416,     6.9400745,             0,     1.2627356,    0.36788361,     0.1292564,     0.2783984,             0,    0.94456601,             0,             0,   0.079542401,     0.3380552,    0.41759761,     0.2783984,    0.60651081,             0}
+}
+
+
+{{      0.087127}
+{      0.033474}
+{      0.046872}
+{       0.04953}
+{      0.039772}
+{      0.088612}
+{      0.033618}
+{      0.036886}
+{      0.080482}
+{      0.085357}
+{      0.014753}
+{      0.040432}
+{       0.05068}
+{      0.038255}
+{      0.040904}
+{      0.069577}
+{      0.058542}
+{      0.064718}
+{      0.010494}
+{      0.029916}
+}
diff --git a/res/TemplateBatchFiles/TemplateModels/EmpiricalAA/H5N1 b/res/TemplateBatchFiles/TemplateModels/EmpiricalAA/H5N1
new file mode 100644
index 0000000..611abcc
--- /dev/null
+++ b/res/TemplateBatchFiles/TemplateModels/EmpiricalAA/H5N1
@@ -0,0 +1,46 @@
+ACDEFGHIKLMNPQRSTVWY
+
+{
+{                 0,  0.00737645186885,    0.279155435413,    0.406328262746,  0.00595340005769,    0.387388703905,    0.209131578889,  0.00472357732923,  0.00501635269627,   0.0041719191089,  0.00608492993366,   0.0225167235452,      0.3632188174,  0.00595442384398,   0.0045831163284,     1.87515483835,     9.69394397674,     4.16849481971,  0.00753534964968,  0.00675627826387}
+{  0.00737645186885,                 0,  0.00910635298289,   0.0062433164347,   0.0105248563886,    0.777746089929,   0.0166064007319,  0.00720742092464,  0.00791202113001,  0.00599736938167,   0.0109430309074,  0.00809910246756,   0.0103780238111,   0.0105280565279,     1.13190149692,    0.310071110628,  0.00784557084159,  0.00783141613095,    0.710574518084,     2.73635777849}
+{    0.279155435413,  0.00910635298289,                 0,     2.83539145079,  0.00703145106825,      2.1961947991,    0.480746023942,  0.00537776462236,  0.00576053663288,    0.032812109315,    0.126171806073,     11.0245132263,  0.00696561017628,  0.00703287924716,  0.00519645017696,  0.00472582004057,  0.00572523125534,    0.169926054025,  0.00934974777746,    0.604868235781}
+{    0.406328262746,   0.0062433164347,     2.83539145079,                 0,  0.00519275528643,     1.77899951316,  0.00633791625862,  0.00423175270339,     3.12345556697,  0.00378354218306,  0.00529254041027,  0.00452420537209,  0.00515675829428,    0.233049619564,  0.00411866874736,     0.01099399064,  0.00444398483248,    0.313835300317,  0.00635677016146,  0.00579323150819}
+{  0.00595340005769,   0.0105248563886,  0.00703145106825,  0.00519275528643,                 0,  0.00558618533343,   0.0107965180664,    0.304704550752,  0.00629744078011,     3.38937582965,  0.00807838812905,  0.00641538950654,  0.00776625630646,   0.0078499712304,  0.00562940111631,     1.12567093288,  0.00625527160098,    0.524105518542,   0.0108513439328,     2.37970588523}
+{    0.387388703905,    0.777746089929,      2.1961947991,     1.77899951316,  0.00558618533343,                 0,  0.00693396604289,  0.00448942348976,   0.0303899645338,   0.0039882007452,  0.00570183210861,  0.00481996618445,   0.0055445489363,  0.00558708670789,     2.09697110302,     2.79100343449,  0.00472901972087,    0.465266990546,    0.419346252505,  0.00628724103264}
+{    0.209131578889,   0.0166064007319,    0.480746023942,  0.00633791625862,   0.0107965180664,  0.00693396604289,                 0,  0.00733378882537,  0.00806456575513,    0.355420625121,   0.0112370103005,     2.39049314081,     1.52561378699,     8.18879443104,     3.80903090167,  0.00617254284341,  0.00799553960529,  0.00798083909265,   0.0174340387473,     14.3708707574}
+{  0.00472357732923,  0.00720742092464,  0.00537776462236,  0.00423175270339,    0.304704550752,  0.00448942348976,  0.00733378882537,                 0,     0.21414109227,     1.85305431869,     7.57522483658,    0.223147047021,  0.00579727348874,  0.00584379370962,    0.278994994037,    0.313342590879,     7.43906262961,     15.5734109147,  0.00735904503188,  0.00661420127222}
+{  0.00501635269627,  0.00791202113001,  0.00576053663288,     3.12345556697,  0.00629744078011,   0.0303899645338,  0.00806456575513,     0.21414109227,                 0,  0.00433799461282,    0.428226447959,     2.52323969023,  0.00624457694165,     2.20226076053,      10.935047612,    0.239004850873,    0.836661581357,  0.00522268704722,  0.00809511653856,    0.041960884819}
+{   0.0041719191089,  0.00599736938167,    0.032812109315,  0.00378354218306,     3.38937582965,   0.0039882007452,    0.355420625121,     1.85305431869,  0.00433799461282,                 0,     1.90573637677,  0.00439363875985,     1.89809822648,     1.24649814935,   0.0563815375938,    0.626138483991,  0.00431794293167,     1.46787106752,    0.169926054025,    0.250554948765}
+{  0.00608492993366,   0.0109430309074,    0.126171806073,  0.00529254041027,  0.00807838812905,  0.00570183210861,   0.0112370103005,     7.57522483658,    0.428226447959,     1.90573637677,                 0,  0.00656838743567,  0.00799160203455,  0.00808027331965,    0.512591467857,  0.00517672290983,    0.899423250401,     4.87295599677,    0.787470437949,  0.00963147006419}
+{   0.0225167235452,  0.00809910246756,     11.0245132263,  0.00452420537209,  0.00641538950654,  0.00481996618445,     2.39049314081,    0.223147047021,     2.52323969023,  0.00439363875985,  0.00656838743567,                 0,  0.00636053550785,   0.0064165783674,  0.00485210568272,     6.25468076836,     1.33726153829,  0.00530355325386,  0.00829106393793,     2.27081780958}
+{      0.3632188174,   0.0103780238111,  0.00696561017628,  0.00515675829428,  0.00776625630646,   0.0055445489363,     1.52561378699,  0.00579727348874,  0.00624457694165,     1.89809822648,  0.00799160203455,  0.00636053550785,                 0,     1.12690821938,    0.274019805171,     6.32883243737,     1.14806933978,  0.00619425856879,    0.010695327906,  0.00919105752329}
+{  0.00595442384398,   0.0105280565279,  0.00703287924716,    0.233049619564,   0.0078499712304,  0.00558708670789,     8.18879443104,  0.00584379370962,     2.20226076053,     1.24649814935,  0.00808027331965,   0.0064165783674,     1.12690821938,                 0,     2.49207823426,  0.00508196359338,    0.100394868408,  0.00624739734664,   0.0108547457242,    0.173106897108}
+{   0.0045831163284,     1.13190149692,  0.00519645017696,  0.00411866874736,  0.00562940111631,     2.09697110302,     3.80903090167,    0.278994994037,      10.935047612,   0.0563815375938,    0.512591467857,  0.00485210568272,    0.274019805171,     2.49207823426,                 0,    0.642779771549,    0.230640000623,   0.0205788771781,    0.609806640046,    0.019881168666}
+{     1.87515483835,    0.310071110628,  0.00472582004057,     0.01099399064,     1.12567093288,     2.79100343449,  0.00617254284341,    0.313342590879,    0.239004850873,    0.626138483991,  0.00517672290983,     6.25468076836,     6.32883243737,  0.00508196359338,    0.642779771549,                 0,     1.32700688868,  0.00435766174687,    0.157578157656,    0.360710247206}
+{     9.69394397674,  0.00784557084159,  0.00572523125534,  0.00444398483248,  0.00625527160098,  0.00472901972087,  0.00799553960529,     7.43906262961,    0.836661581357,  0.00431794293167,    0.899423250401,     1.33726153829,     1.14806933978,    0.100394868408,    0.230640000623,     1.32700688868,                 0,  0.00519365005885,  0.00802556867327,  0.00714773799102}
+{     4.16849481971,  0.00783141613095,    0.169926054025,    0.313835300317,    0.524105518542,    0.465266990546,  0.00798083909265,     15.5734109147,  0.00522268704722,     1.46787106752,     4.87295599677,  0.00530355325386,  0.00619425856879,  0.00624739734664,   0.0205788771781,  0.00435766174687,  0.00519365005885,                 0,  0.00801075763331,  0.00713598742338}
+{  0.00753534964968,    0.710574518084,  0.00934974777746,  0.00635677016146,   0.0108513439328,    0.419346252505,   0.0174340387473,  0.00735904503188,  0.00809511653856,    0.169926054025,    0.787470437949,  0.00829106393793,    0.010695327906,   0.0108547457242,    0.609806640046,    0.157578157656,  0.00802556867327,  0.00801075763331,                 0,   0.0138516195907}
+{  0.00675627826387,     2.73635777849,    0.604868235781,  0.00579323150819,     2.37970588523,  0.00628724103264,     14.3708707574,  0.00661420127222,    0.041960884819,    0.250554948765,  0.00963147006419,     2.27081780958,  0.00919105752329,    0.173106897108,    0.019881168666,    0.360710247206,  0.00714773799102,  0.00713598742338,   0.0138516195907,                 0}
+}
+
+{{   0.062002929}
+{   0.018616068}
+{   0.046688028}
+{   0.076634934}
+{    0.03788657}
+{   0.068569287}
+{    0.01719435}
+{   0.063893633}
+{   0.056545782}
+{   0.080541097}
+{   0.035727391}
+{   0.054809617}
+{   0.038685993}
+{   0.037869395}
+{   0.067752047}
+{   0.079148788}
+{   0.057182387}
+{   0.057319387}
+{   0.016916056}
+{   0.026016262}
+}
diff --git a/res/TemplateBatchFiles/TemplateModels/EmpiricalAA/HIVBetween b/res/TemplateBatchFiles/TemplateModels/EmpiricalAA/HIVBetween
new file mode 100644
index 0000000..e617567
--- /dev/null
+++ b/res/TemplateBatchFiles/TemplateModels/EmpiricalAA/HIVBetween
@@ -0,0 +1,47 @@
+ACDEFGHIKLMNPQRSTVWY
+
+{
+{0,0.123758,1.45504,1.48135,0.0141269,2.13536,0.0847613,0.005,0.005,0.215256,0.0186643,0.005,2.12217,0.0551128,0.307507,2.46633,15.9183,7.61428,0.005,0.005}
+{0.123758,0,0.005,0.005,9.29815,0.897871,0.240073,0.005,0.005,0.129777,0.005,0.0860642,0.005,0.005,0.351721,4.69314,0.739969,0.420027,2.63277,7.57932}
+{1.45504,0.005,0,10.5872,0.005,2.83806,1.9169,0.0176792,0.005,0.00876048,0.005,17.6612,0.0342658,0.005,0.005,0.52823,0.274724,1.04793,0.005,0.674653}
+{1.48135,0.005,10.5872,0,0.005,3.92775,0.11974,0.00609079,4.61482,0.005,0.175789,0.0792633,0.0120226,2.5602,0.0749218,0.005,0.289774,1.02847,0.005,0.0792633}
+{0.0141269,9.29815,0.005,0.005,0,0.291561,0.145558,3.39836,0.0342658,8.52484,0.188025,0.005,0.005,0.005,0.005,0.956472,0.0141269,0.723274,0.829343,15.34}
+{2.13536,0.897871,2.83806,3.92775,0.291561,0,0.005,0.005,0.521705,0.005,0.005,0.323401,0.005,0.0619137,3.65345,4.38041,0.369615,0.953155,1.21674,0.005}
+{0.0847613,0.240073,1.9169,0.11974,0.145558,0.005,0,0.103111,0.005,1.74171,0.005,7.64585,2.45318,7.05545,9.04044,0.382747,0.711594,0.005,0.0695179,18.6943}
+{0.005,0.005,0.0176792,0.00609079,3.39836,0.005,0.103111,0,0.322319,5.95879,11.2065,0.680565,0.0410593,0.005,0.677289,1.21803,8.61217,17.7389,0.005,0.148168}
+{0.005,0.005,0.005,4.61482,0.0342658,0.521705,0.005,0.322319,0,0.0814995,1.28246,7.90443,0.0313862,6.54737,20.45,0.504111,4.67142,0.265829,0.005,0.005}
+{0.215256,0.129777,0.00876048,0.005,8.52484,0.005,1.74171,5.95879,0.0814995,0,5.31961,0.005,2.07757,1.49456,0.701427,0.927656,0.0437673,1.41036,0.748843,0.111986}
+{0.0186643,0.005,0.005,0.175789,0.188025,0.005,0.005,11.2065,1.28246,5.31961,0,0.005,0.005,0.303676,2.51394,0.005,4.94026,6.8532,0.089078,0.005}
+{0.005,0.0860642,17.6612,0.0792633,0.005,0.323401,7.64585,0.680565,7.90443,0.005,0.005,0,0.00739578,0.672052,0.295543,13.1447,6.88667,0.026656,0.005,1.76417}
+{2.12217,0.005,0.0342658,0.0120226,0.005,0.005,2.45318,0.0410593,0.0313862,2.07757,0.005,0.00739578,0,4.47211,1.28355,5.37762,2.01417,0.005,0.0444506,0.0304381}
+{0.0551128,0.005,0.005,2.5602,0.005,0.0619137,7.05545,0.005,6.54737,1.49456,0.303676,0.672052,4.47211,0,3.4215,0.116311,0.243589,0.0209153,0.026656,0.113033}
+{0.307507,0.351721,0.005,0.0749218,0.005,3.65345,9.04044,0.677289,20.45,0.701427,2.51394,0.295543,1.28355,3.4215,0,3.4791,2.86868,0.0812454,0.991338,0.00991826}
+{2.46633,4.69314,0.52823,0.005,0.956472,4.38041,0.382747,1.21803,0.504111,0.927656,0.005,13.1447,5.37762,0.116311,3.4791,0,8.93107,0.0749218,0.0248728,0.648024}
+{15.9183,0.739969,0.274724,0.289774,0.0141269,0.369615,0.711594,8.61217,4.67142,0.0437673,4.94026,6.88667,2.01417,0.243589,2.86868,8.93107,0,0.709226,0.005,0.105652}
+{7.61428,0.420027,1.04793,1.02847,0.723274,0.953155,0.005,17.7389,0.265829,1.41036,6.8532,0.026656,0.005,0.0209153,0.0812454,0.0749218,0.709226,0,0.005,0.0410593}
+{0.005,2.63277,0.005,0.005,0.829343,1.21674,0.0695179,0.005,0.005,0.748843,0.089078,0.005,0.0444506,0.026656,0.991338,0.0248728,0.005,0.005,0,1.28022}
+{0.005,7.57932,0.674653,0.0792633,15.34,0.005,18.6943,0.148168,0.005,0.111986,0.005,1.76417,0.0304381,0.113033,0.00991826,0.648024,0.105652,0.0410593,1.28022,0}
+}
+
+{
+{   0.060490222}
+{   0.020075899}
+{   0.042109048}
+{   0.071567447}
+{   0.028809447}
+{   0.072308239}
+{   0.022293943}
+{   0.069730629}
+{   0.056968211}
+{   0.098851122}
+{   0.019768318}
+{   0.044127815}
+{   0.046025282}
+{   0.053606488}
+{   0.066039665}
+{    0.05060433}
+{   0.053636813}
+{   0.061625237}
+{   0.033011601}
+{   0.028350243}
+}
diff --git a/res/TemplateBatchFiles/TemplateModels/EmpiricalAA/HIVWithin b/res/TemplateBatchFiles/TemplateModels/EmpiricalAA/HIVWithin
new file mode 100644
index 0000000..bc9359f
--- /dev/null
+++ b/res/TemplateBatchFiles/TemplateModels/EmpiricalAA/HIVWithin
@@ -0,0 +1,47 @@
+ACDEFGHIKLMNPQRSTVWY
+
+{
+{0,0.167653,4.43521,5.56325,0.597923,1.8685,0.005,0.005,0.592784,0.16024,0.005,0.617509,1.00981,0.005,0.0744808,8.5942,24.1422,24.8094,0.005,0.005}
+{0.167653,0,0.005,0.005,0.362959,0.0489798,0.005,0.005,0.005,0.005,0.005,0.0604932,0.005,0.005,2.86364,1.12195,0.005,0.005,5.49894,8.34835}
+{4.43521,0.005,0,12.1233,0.005,10.3969,2.31779,0.145124,0.894313,0.005,0.005,29.4087,0.005,0.005,0.0674539,0.427881,0.630395,2.91786,0.005,2.28154}
+{5.56325,0.005,12.1233,0,0.005,14.7801,0.005,0.0390512,23.9626,0.129839,0.005,0.201526,0.005,3.20656,0.0251632,0.005,0.458743,2.19952,0.005,0.005}
+{0.597923,0.362959,0.005,0.005,0,0.005,0.005,1.48288,0.005,7.48781,0.005,0.005,0.0342252,0.005,0.005,4.27939,0.114512,2.28,0.005,4.12728}
+{1.8685,0.0489798,10.3969,14.7801,0.005,0,0.005,0.005,0.279425,0.0489798,0.0489798,0.0604932,0.005,0.0604932,13.4379,6.27966,0.0489798,2.79622,2.8258,0.005}
+{0.005,0.005,2.31779,0.005,0.005,0.005,0,0.005,0.22406,1.76382,0.005,8.59876,13.9444,18.5465,6.84405,0.725157,0.95956,0.827479,0.005,47.4889}
+{0.005,0.005,0.145124,0.0390512,1.48288,0.005,0.005,0,0.817481,9.10246,17.3064,0.987028,0.005,0.0342252,1.34069,0.740091,9.36345,24.8231,0.005,0.114512}
+{0.592784,0.005,0.894313,23.9626,0.005,0.279425,0.22406,0.817481,0,0.005,4.09564,10.6655,0.111928,13.0705,39.8897,0.005,4.04802,0.128065,0.005,0.005}
+{0.16024,0.005,0.005,0.129839,7.48781,0.0489798,1.76382,9.10246,0.005,0,11.3839,0.005,9.83095,2.89048,0.586757,6.14396,0.005,2.95344,1.37031,0.005}
+{0.005,0.005,0.005,0.005,0.005,0.0489798,0.005,17.3064,4.09564,11.3839,0,0.201526,0.005,0.005,3.28652,0.392575,7.41313,14.7683,0.005,0.579198}
+{0.617509,0.0604932,29.4087,0.201526,0.005,0.0604932,8.59876,0.987028,10.6655,0.005,0.201526,0,0.344848,0.342068,0.16024,14.5699,4.54206,0.0744808,0.005,5.06475}
+{1.00981,0.005,0.005,0.005,0.0342252,0.005,13.9444,0.005,0.111928,9.83095,0.005,0.344848,0,3.04502,0.404723,14.249,4.33701,0.005,0.005,0.005}
+{0.005,0.005,0.005,3.20656,0.005,0.0604932,18.5465,0.0342252,13.0705,2.89048,0.005,0.342068,3.04502,0,10.6746,0.16024,0.203091,0.005,0.0443298,0.005}
+{0.0744808,2.86364,0.0674539,0.0251632,0.005,13.4379,6.84405,1.34069,39.8897,0.586757,3.28652,0.16024,0.404723,10.6746,0,8.35024,0.928203,0.279425,5.96564,0.005}
+{8.5942,1.12195,0.427881,0.005,4.27939,6.27966,0.725157,0.740091,0.005,6.14396,0.392575,14.5699,14.249,0.16024,8.35024,0,6.34079,0.862637,1.10156,0.933142}
+{24.1422,0.005,0.630395,0.458743,0.114512,0.0489798,0.95956,9.36345,4.04802,0.005,7.41313,4.54206,4.33701,0.203091,0.928203,6.34079,0,0.005,0.005,0.490608}
+{24.8094,0.005,2.91786,2.19952,2.28,2.79622,0.827479,24.8231,0.128065,2.95344,14.7683,0.0744808,0.005,0.005,0.279425,0.862637,0.005,0,0.005,1.35482}
+{0.005,5.49894,0.005,0.005,0.005,2.8258,0.005,0.005,0.005,1.37031,0.005,0.005,0.005,0.0443298,5.96564,1.10156,0.005,0.005,0,0.005}
+{0.005,8.34835,2.28154,0.005,4.12728,0.005,47.4889,0.114512,0.005,0.005,0.579198,5.06475,0.005,0.005,0.005,0.933142,0.490608,1.35482,0.005,0}
+}
+
+{
+{0.0377494}
+{0.0240105}
+{0.0342034}
+{0.0618606}
+{0.0422741}
+{0.0838496}
+{0.0156076}
+{0.0983641}
+{0.0641682}
+{0.0577867}
+{0.0158419}
+{0.0891129}
+{0.0458601}
+{0.0437824}
+{0.057321}
+{0.0550846}
+{0.0813774}
+{0.0515639}
+{0.019597}
+{0.0205847}
+}
diff --git a/res/TemplateBatchFiles/TemplateModels/EmpiricalAA/IAV b/res/TemplateBatchFiles/TemplateModels/EmpiricalAA/IAV
new file mode 100644
index 0000000..7bfd330
--- /dev/null
+++ b/res/TemplateBatchFiles/TemplateModels/EmpiricalAA/IAV
@@ -0,0 +1,46 @@
+ACDEFGHIKLMNPQRSTVWY
+
+{{             0,  0.0073764548,    0.27915518,    0.40632826,  0.0059534039,    0.38738925,    0.20913214,  0.0047235831,  0.0050163532,  0.0041719227,  0.0060849339,   0.022516715,    0.36321923,  0.0059544239,   0.004583123,     1.8751512,     9.6939463,     4.1684927,  0.0075353549,  0.0067562844}
+{  0.0073764548,             0,  0.0091063559,   0.006243324,   0.010524907,     0.7777465,   0.016606411,  0.0072074247,  0.0079120251,  0.0059973739,   0.010943007,  0.0080991052,   0.010378007,   0.010528107,     1.1319007,     0.3100712,  0.0078455751,  0.0078314251,    0.71057546,     2.7363618}
+{    0.27915518,  0.0091063559,             0,     2.8353918,  0.0070314545,     2.1961914,    0.48074631,  0.0053777635,  0.0057605437,   0.032812121,    0.12617208,     11.024507,  0.0069656145,  0.0070328845,  0.0051964534,  0.0047258231,  0.0057252337,    0.16992611,   0.009349756,    0.60486839}
+{    0.40632826,   0.006243324,     2.8353918,             0,  0.0051927634,     1.7790012,  0.0063379241,  0.0042317527,      3.123462,  0.0037835424,  0.0052925434,  0.0045242129,  0.0051567633,    0.23305015,  0.0041186727,   0.010994007,  0.0044439829,     0.3138352,  0.0063567741,  0.0057932337}
+{  0.0059534039,   0.010524907,  0.0070314545,  0.0051927634,             0,  0.0055861936,   0.010796507,     0.3047052,  0.0062974441,     3.3893822,  0.0080783952,  0.0064153941,   0.007766265,  0.0078499751,  0.0056294036,     1.1256707,   0.006255274,    0.52410634,   0.010851307,     2.3797115}
+{    0.38738925,     0.7777465,     2.1961914,     1.7790012,  0.0055861936,             0,  0.0069339745,  0.0044894229,    0.03039002,  0.0039882026,  0.0057018337,  0.0048199731,  0.0055445536,  0.0055870936,     2.0969714,     2.7910018,  0.0047290231,     0.4652673,    0.41934627,  0.0062872441}
+{    0.20913214,   0.016606411,    0.48074631,  0.0063379241,   0.010796507,  0.0069339745,             0,  0.0073337947,  0.0080645752,    0.35542123,   0.011237007,     2.3904915,      1.525611,     8.1887953,     3.8090325,   0.006172544,  0.0079955452,  0.0079808452,   0.017434011,     14.370909}
+{  0.0047235831,  0.0072074247,  0.0053777635,  0.0042317527,     0.3047052,  0.0044894229,  0.0073337947,             0,    0.21414114,     1.8530512,     7.5752249,    0.22314714,  0.0057972737,  0.0058437938,    0.27899518,     0.3133432,     7.4390648,      15.57341,  0.0073590548,  0.0066142043}
+{  0.0050163532,  0.0079120251,  0.0057605437,      3.123462,  0.0062974441,    0.03039002,  0.0080645752,    0.21414114,             0,  0.0043379928,    0.42822628,     2.5232416,   0.006244584,     2.2022614,     10.935007,    0.23900515,    0.83666254,  0.0052226934,  0.0080951252,   0.041960927}
+{  0.0041719227,  0.0059973739,   0.032812121,  0.0037835424,     3.3893822,  0.0039882026,    0.35542123,     1.8530512,  0.0043379928,             0,     1.9057412,  0.0043936428,     1.8981012,     1.2465008,   0.056381536,     0.6261384,  0.0043179428,     1.4678709,    0.16992611,    0.25055516}
+{  0.0060849339,   0.010943007,    0.12617208,  0.0052925434,  0.0080783952,  0.0057018337,   0.011237007,     7.5752249,    0.42822628,     1.9057412,             0,  0.0065683942,  0.0079916052,  0.0080802752,    0.51259133,  0.0051767233,    0.89942358,     4.8729632,    0.78747051,  0.0096314762}
+{   0.022516715,  0.0080991052,     11.024507,  0.0045242129,  0.0064153941,  0.0048199731,     2.3904915,    0.22314714,     2.5232416,  0.0043936428,  0.0065683942,             0,  0.0063605441,  0.0064165842,  0.0048521131,      6.254684,     1.3372609,  0.0053035534,  0.0082910654,     2.2708215}
+{    0.36321923,   0.010378007,  0.0069656145,  0.0051567633,   0.007766265,  0.0055445536,      1.525611,  0.0057972737,   0.006244584,     1.8981012,  0.0079916052,  0.0063605441,             0,     1.1269107,    0.27402018,     6.3288341,     1.1480707,   0.006194264,   0.010695307,  0.0091910659}
+{  0.0059544239,   0.010528107,  0.0070328845,    0.23305015,  0.0078499751,  0.0055870936,     8.1887953,  0.0058437938,     2.2022614,     1.2465008,  0.0080802752,  0.0064165842,     1.1269107,             0,     2.4920816,  0.0050819633,    0.10039506,   0.006247404,   0.010854707,    0.17310711}
+{   0.004583123,     1.1319007,  0.0051964534,  0.0041186727,  0.0056294036,     2.0969714,     3.8090325,    0.27899518,     10.935007,   0.056381536,    0.51259133,  0.0048521131,    0.27402018,     2.4920816,             0,    0.64278042,    0.23064015,   0.020578913,    0.60980739,   0.019881213}
+{     1.8751512,     0.3100712,  0.0047258231,   0.010994007,     1.1256707,     2.7910018,   0.006172544,     0.3133432,    0.23900515,     0.6261384,  0.0051767233,      6.254684,     6.3288341,  0.0050819633,    0.64278042,             0,     1.3270109,  0.0043576628,     0.1575781,    0.36071023}
+{     9.6939463,  0.0078455751,  0.0057252337,  0.0044439829,   0.006255274,  0.0047290231,  0.0079955452,     7.4390648,    0.83666254,  0.0043179428,    0.89942358,     1.3372609,     1.1480707,    0.10039506,    0.23064015,     1.3270109,             0,  0.0051936534,  0.0080255752,  0.0071477446}
+{     4.1684927,  0.0078314251,    0.16992611,     0.3138352,    0.52410634,     0.4652673,  0.0079808452,      15.57341,  0.0052226934,     1.4678709,     4.8729632,  0.0053035534,   0.006194264,   0.006247404,   0.020578913,  0.0043576628,  0.0051936534,             0,  0.0080107652,  0.0071359946}
+{  0.0075353549,    0.71057546,   0.009349756,  0.0063567741,   0.010851307,    0.41934627,   0.017434011,  0.0073590548,  0.0080951252,    0.16992611,    0.78747051,  0.0082910654,   0.010695307,   0.010854707,    0.60980739,     0.1575781,  0.0080255752,  0.0080107652,             0,   0.013851609}
+{  0.0067562844,     2.7363618,    0.60486839,  0.0057932337,     2.3797115,  0.0062872441,     14.370909,  0.0066142043,   0.041960927,    0.25055516,  0.0096314762,     2.2708215,  0.0091910659,    0.17310711,   0.019881213,    0.36071023,  0.0071477446,  0.0071359946,   0.013851609,             0}
+}
+
+
+{{   0.062002929}
+{   0.018616068}
+{   0.046688028}
+{   0.076634934}
+{    0.03788657}
+{   0.068569287}
+{    0.01719435}
+{   0.063893633}
+{   0.056545782}
+{   0.080541097}
+{   0.035727391}
+{   0.054809617}
+{   0.038685993}
+{   0.037869395}
+{   0.067752047}
+{   0.079148788}
+{   0.057182387}
+{   0.057319387}
+{   0.016916056}
+{   0.026016262}
+}
diff --git a/res/TemplateBatchFiles/TemplateModels/EmpiricalAA/JTT b/res/TemplateBatchFiles/TemplateModels/EmpiricalAA/JTT
new file mode 100644
index 0000000..a463496
--- /dev/null
+++ b/res/TemplateBatchFiles/TemplateModels/EmpiricalAA/JTT
@@ -0,0 +1,47 @@
+ACDEFGHIKLMNPQRSTVWY
+
+{
+{                 0,     0.55642220522,    0.804824975408,     1.04329163479,    0.149041662113,     1.77856383454,    0.268274991803,     0.35769998907,    0.347763878263,    0.298083324225,    0.536549983605,    0.536549983605,     1.92760549666,    0.566358316028,    0.576294426835,     3.75584988524,     4.71965263357,     2.96096102064,   0.0894249972676,    0.109297218883}
+{     0.55642220522,                 0,   0.0993611080751,   0.0496805540375,    0.775016642986,    0.586230537643,    0.685591645718,    0.168913883728,   0.0695527756526,    0.228530548573,    0.308019435033,    0.337827767455,    0.139105551305,   0.0894249972676,     1.12278052125,     2.21575271007,    0.417316653915,    0.616038870065,     1.14265274286,     2.07664715877}
+{    0.804824975408,   0.0993611080751,                 0,     7.62099698936,     0.03974444323,     1.29169440498,     1.11284441044,    0.109297218883,    0.258338880995,   0.0695527756526,    0.149041662113,     5.24626650636,    0.149041662113,    0.486869429568,     0.15897777292,    0.586230537643,    0.377572210685,    0.308019435033,     0.03974444323,    0.457061097145}
+{     1.04329163479,   0.0496805540375,     7.62099698936,                 0,   0.0496805540375,     1.18239718609,    0.258338880995,     0.11923332969,     1.79843605616,   0.0894249972676,    0.178849994535,    0.576294426835,    0.178849994535,     3.20936379082,    0.288147213418,    0.298083324225,     0.31795554584,    0.447124986338,   0.0993611080751,   0.0695527756526}
+{    0.149041662113,    0.775016642986,     0.03974444323,   0.0496805540375,                 0,   0.0496805540375,      0.3974444323,    0.884313861868,     0.03974444323,     2.46415548026,    0.427252764723,   0.0993611080751,    0.168913883728,     0.03974444323,   0.0496805540375,    0.914122194291,     0.11923332969,    0.616038870065,    0.526613872798,     5.32575539282}
+{     1.77856383454,    0.586230537643,     1.29169440498,     1.18239718609,   0.0496805540375,                 0,    0.228530548573,    0.059616664845,    0.268274991803,    0.059616664845,    0.139105551305,    0.804824975408,     0.23846665938,    0.258338880995,     1.36124718063,     1.99715827231,    0.327891656648,    0.466997207953,    0.546486094413,   0.0794888864601}
+{    0.268274991803,    0.685591645718,     1.11284441044,    0.258338880995,      0.3974444323,    0.228530548573,                 0,     0.15897777292,    0.447124986338,     0.55642220522,    0.327891656648,     3.88501932574,     1.14265274286,     5.93185815208,     3.25904434486,    0.725336088948,    0.457061097145,    0.109297218883,   0.0794888864601,      5.6933914927}
+{     0.35769998907,    0.168913883728,    0.109297218883,     0.11923332969,    0.884313861868,    0.059616664845,     0.15897777292,                 0,    0.208658326958,     2.27536937492,      4.7593970768,    0.466997207953,   0.0993611080751,   0.0894249972676,    0.218594437765,      0.3974444323,     2.43434714784,     9.54860248601,   0.0894249972676,     0.31795554584}
+{    0.347763878263,   0.0695527756526,    0.258338880995,     1.79843605616,     0.03974444323,    0.268274991803,    0.447124986338,    0.208658326958,                 0,    0.139105551305,    0.645847202488,     2.61319714237,    0.208658326958,     2.90134435579,     6.41872758165,    0.466997207953,     1.02341941317,    0.139105551305,   0.0993611080751,   0.0794888864601}
+{    0.298083324225,    0.228530548573,   0.0695527756526,   0.0894249972676,     2.46415548026,    0.059616664845,     0.55642220522,     2.27536937492,    0.139105551305,                 0,     3.85521099331,     0.11923332969,     1.01348330237,    0.715399978141,    0.377572210685,    0.586230537643,    0.248402770188,     1.78849994535,     0.51667776199,     0.23846665938}
+{    0.536549983605,    0.308019435033,    0.149041662113,    0.178849994535,    0.427252764723,    0.139105551305,    0.327891656648,      4.7593970768,    0.645847202488,     3.85521099331,                 0,    0.298083324225,     0.15897777292,    0.427252764723,     0.43718887553,    0.288147213418,      2.2455610425,     3.20936379082,     0.23846665938,    0.178849994535}
+{    0.536549983605,    0.337827767455,     5.24626650636,    0.576294426835,   0.0993611080751,    0.804824975408,     3.88501932574,    0.466997207953,     2.61319714237,     0.11923332969,    0.298083324225,                 0,    0.149041662113,    0.854505529446,    0.447124986338,     4.99786373618,     2.30517770734,     0.15897777292,   0.0794888864601,    0.695527756526}
+{     1.92760549666,    0.139105551305,    0.149041662113,    0.178849994535,    0.168913883728,     0.23846665938,     1.14265274286,   0.0993611080751,    0.208658326958,     1.01348330237,     0.15897777292,    0.149041662113,                 0,     1.62952217243,    0.735272199756,     2.83179158014,     1.17246107529,    0.228530548573,    0.059616664845,   0.0993611080751}
+{    0.566358316028,   0.0894249972676,    0.486869429568,     3.20936379082,     0.03974444323,    0.258338880995,     5.93185815208,   0.0894249972676,     2.90134435579,    0.715399978141,    0.427252764723,    0.854505529446,     1.62952217243,                 0,     3.08019435033,    0.526613872798,    0.506741651183,     0.19872221615,    0.178849994535,     0.23846665938}
+{    0.576294426835,     1.12278052125,     0.15897777292,    0.288147213418,   0.0496805540375,     1.36124718063,     3.25904434486,    0.218594437765,     6.41872758165,    0.377572210685,     0.43718887553,    0.447124986338,    0.735272199756,     3.08019435033,                 0,     1.00354719156,     0.63591109168,    0.168913883728,     1.25194996175,     0.19872221615}
+{     3.75584988524,     2.21575271007,    0.586230537643,    0.298083324225,    0.914122194291,     1.99715827231,    0.725336088948,      0.3974444323,    0.466997207953,    0.586230537643,    0.288147213418,     4.99786373618,     2.83179158014,    0.526613872798,     1.00354719156,                 0,     4.73952485518,    0.377572210685,    0.347763878263,    0.625974980873}
+{     4.71965263357,    0.417316653915,    0.377572210685,     0.31795554584,     0.11923332969,    0.327891656648,    0.457061097145,     2.43434714784,     1.02341941317,    0.248402770188,      2.2455610425,     2.30517770734,     1.17246107529,    0.506741651183,     0.63591109168,     4.73952485518,                 0,     1.11284441044,     0.11923332969,    0.208658326958}
+{     2.96096102064,    0.616038870065,    0.308019435033,    0.447124986338,    0.616038870065,    0.466997207953,    0.109297218883,     9.54860248601,    0.139105551305,     1.78849994535,     3.20936379082,     0.15897777292,    0.228530548573,     0.19872221615,    0.168913883728,    0.377572210685,     1.11284441044,                 0,    0.248402770188,     0.15897777292}
+{   0.0894249972676,     1.14265274286,     0.03974444323,   0.0993611080751,    0.526613872798,    0.546486094413,   0.0794888864601,   0.0894249972676,   0.0993611080751,     0.51667776199,     0.23846665938,   0.0794888864601,    0.059616664845,    0.178849994535,     1.25194996175,    0.347763878263,     0.11923332969,    0.248402770188,                 0,    0.705463867333}
+{    0.109297218883,     2.07664715877,    0.457061097145,   0.0695527756526,     5.32575539282,   0.0794888864601,      5.6933914927,     0.31795554584,   0.0794888864601,     0.23846665938,    0.178849994535,    0.695527756526,   0.0993611080751,     0.23846665938,     0.19872221615,    0.625974980873,    0.208658326958,     0.15897777292,    0.705463867333,                 0}
+}
+
+{
+{          0.076748}
+{          0.019803}
+{          0.051544}
+{           0.06183}
+{          0.040126}
+{          0.073152}
+{          0.022944}
+{          0.053761}
+{          0.058676}
+{          0.091904}
+{          0.023826}
+{          0.042645}
+{          0.050901}
+{          0.040752}
+{          0.051691}
+{          0.068765}
+{          0.058565}
+{          0.066005}
+{          0.014261}
+{          0.032102}
+}
diff --git a/res/TemplateBatchFiles/TemplateModels/EmpiricalAA/LCAP b/res/TemplateBatchFiles/TemplateModels/EmpiricalAA/LCAP
new file mode 100755
index 0000000..2d13098
--- /dev/null
+++ b/res/TemplateBatchFiles/TemplateModels/EmpiricalAA/LCAP
@@ -0,0 +1,126 @@
+{
+{0,-3.393820842134687e-07,-6.375554477688894e-07,-8.907562668580837e-07,-1.094725804340335e-06,-2.028967155512082,-0.5572525570598992,-1.014484366021713,-1.413598203048316e-06,-0.2857712000989017,-0.8287337843854353,-1.271676856789708,-1.900370338338977,-0.4715209888767928,-1.971812628137546,-1.314541971239933,-3.929336089850321,-0.1857511673138668,-0.9287528458482001,-1.057349341603808}
+{3.393820842134687e-07,0,-2.981733635554207e-07,-5.51374182644615e-07,-7.553437201268665e-07,-2.028966816129998,-0.557252217677815,-1.014484026639629,-1.074216118834848e-06,-0.2857708607168175,-0.8287334450033511,-1.271676517407624,-1.900369998956893,-0.4715206494947086,-1.971812288755462,-1.314541631857849,-3.929335750468237,-0.1857508279317825,-0.9287525064661158,-1.057349002221723}
+{6.375554477688894e-07,2.981733635554207e-07,0,-2.532008190891943e-07,-4.571703565714458e-07,-2.028966517956635,-0.5572519195044514,-1.014483728466266,-7.760427552794269e-07,-0.2857705625434539,-0.8287331468299876,-1.27167621923426,-1.900369700783529,-0.4715203513213451,-1.971811990582098,-1.314541333684485,-3.929335452294873,-0.185750529758419,-0.9287522082927523,-1.05734870404836}
+{8.907562668580837e-07,5.51374182644615e-07,2.532008190891943e-07,0,-2.039695374822514e-07,-2.028966264755815,-0.5572516663036323,-1.014483475265446,-5.228419361902326e-07,-0.2857703093426348,-0.8287328936291685,-1.271675966033441,-1.90036944758271,-0.471520098120526,-1.971811737381279,-1.314541080483666,-3.929335199094054,-0.1857502765575999,-0.9287519550919332,-1.057348450847541}
+{1.094725804340335e-06,7.553437201268665e-07,4.571703565714458e-07,2.039695374822514e-07,0,-2.028966060786278,-0.5572514623340948,-1.014483271295909,-3.188723987079811e-07,-0.2857701053730973,-0.828732689659631,-1.271675762063904,-1.900369243613173,-0.4715198941509885,-1.971811533411742,-1.314540876514129,-3.929334995124517,-0.1857500725880624,-0.9287517511223957,-1.057348246878003}
+{2.028967155512082,2.028966816129998,2.028966517956635,2.028966264755815,2.028966060786278,0,1.471714598452183,1.014482789490369,2.028965741913879,1.743195955413181,1.200233371126647,0.757290298722374,0.1285968171731051,1.557446166635289,0.05715452737453619,0.714425184272149,-1.900368934338239,1.843215988198216,1.100214309663882,0.9716178139082745}
+{0.5572525570598992,0.557252217677815,0.5572519195044514,0.5572516663036323,0.5572514623340948,-1.471714598452183,0,-0.4572318089618141,0.5572511434616961,0.2714813569609975,-0.2714812273255361,-0.714424299729809,-1.343117781279078,0.08573156818310634,-1.414560071077647,-0.7572894141800339,-3.372083532790422,0.3715013897460324,-0.3715002887883009,-0.5000967845439084}
+{1.014484366021713,1.014484026639629,1.014483728466266,1.014483475265446,1.014483271295909,-1.014482789490369,0.4572318089618141,0,1.01448295242351,0.7287131659228117,0.185750581636278,-0.2571924907679949,-0.8858859723172637,0.5429633771449205,-0.9573282621158327,-0.3000576052182199,-2.914851723828608,0.8287331987078466,0.08573152017351321,-0.04286497558209432}
+{1.413598203048316e-06,1.074216118834848e-06,7.760427552794269e-07,5.228419361902326e-07,3.188723987079811e-07,-2.028965741913879,-0.5572511434616961,-1.01448295242351,0,-0.2857697865006986,-0.8287323707872323,-1.271675443191505,-1.900368924740774,-0.4715195752785898,-1.971811214539343,-1.31454055764173,-3.929334676252118,-0.1857497537156637,-0.928751432249997,-1.057347928005605}
+{0.2857712000989017,0.2857708607168175,0.2857705625434539,0.2857703093426348,0.2857701053730973,-1.743195955413181,-0.2714813569609975,-0.7287131659228117,0.2857697865006986,0,-0.5429625842865337,-0.9859056566908065,-1.614599138240076,-0.1857497887778912,-1.686041428038644,-1.028770771141031,-3.643564889751419,0.1000200327850349,-0.6429816457492984,-0.7715781415049059}
+{0.8287337843854353,0.8287334450033511,0.8287331468299876,0.8287328936291685,0.828732689659631,-1.200233371126647,0.2714812273255361,-0.185750581636278,0.8287323707872323,0.5429625842865337,0,-0.4429430724042729,-1.071636553953542,0.3572127955086425,-1.143078843752111,-0.4858081868544978,-3.100602305464886,0.6429826170715686,-0.1000190614627648,-0.2286155572183723}
+{1.271676856789708,1.271676517407624,1.27167621923426,1.271675966033441,1.271675762063904,-0.757290298722374,0.714424299729809,0.2571924907679949,1.271675443191505,0.9859056566908065,0.4429430724042729,0,-0.6286934815492689,0.8001558679129154,-0.7001357713478378,-0.04286511445022495,-2.657659233060613,1.085925689475841,0.3429240109415082,0.2143275151859006}
+{1.900370338338977,1.900369998956893,1.900369700783529,1.90036944758271,1.900369243613173,-0.1285968171731051,1.343117781279078,0.8858859723172637,1.900368924740774,1.614599138240076,1.071636553953542,0.6286934815492689,0,1.428849349462184,-0.07144228979856893,0.5858283670990438,-2.028965751511344,1.71461917102511,0.971617492490777,0.8430209967351694}
+{0.4715209888767928,0.4715206494947086,0.4715203513213451,0.471520098120526,0.4715198941509885,-1.557446166635289,-0.08573156818310634,-0.5429633771449205,0.4715195752785898,0.1857497887778912,-0.3572127955086425,-0.8001558679129154,-1.428849349462184,0,-1.500291639260753,-0.8430209823631403,-3.457815100973528,0.2857698215629261,-0.4572318569714072,-0.5858283527270147}
+{1.971812628137546,1.971812288755462,1.971811990582098,1.971811737381279,1.971811533411742,-0.05715452737453619,1.414560071077647,0.9573282621158327,1.971811214539343,1.686041428038644,1.143078843752111,0.7001357713478378,0.07144228979856893,1.500291639260753,0,0.6572706568976128,-1.957523461712775,1.786061460823679,1.043059782289346,0.9144632865337383}
+{1.314541971239933,1.314541631857849,1.314541333684485,1.314541080483666,1.314540876514129,-0.714425184272149,0.7572894141800339,0.3000576052182199,1.31454055764173,1.028770771141031,0.4858081868544978,0.04286511445022495,-0.5858283670990438,0.8430209823631403,-0.6572706568976128,0,-2.614794118610388,1.128790803926066,0.385789125391733,0.2571926296361255}
+{3.929336089850321,3.929335750468237,3.929335452294873,3.929335199094054,3.929334995124517,1.900368934338239,3.372083532790422,2.914851723828608,3.929334676252118,3.643564889751419,3.100602305464886,2.657659233060613,2.028965751511344,3.457815100973528,1.957523461712775,2.614794118610388,0,3.743584922536454,3.000583244002121,2.871986748246513}
+{0.1857511673138668,0.1857508279317825,0.185750529758419,0.1857502765575999,0.1857500725880624,-1.843215988198216,-0.3715013897460324,-0.8287331987078466,0.1857497537156637,-0.1000200327850349,-0.6429826170715686,-1.085925689475841,-1.71461917102511,-0.2857698215629261,-1.786061460823679,-1.128790803926066,-3.743584922536454,0,-0.7430016785343333,-0.8715981742899408}
+{0.9287528458482001,0.9287525064661158,0.9287522082927523,0.9287519550919332,0.9287517511223957,-1.100214309663882,0.3715002887883009,-0.08573152017351321,0.928751432249997,0.6429816457492984,0.1000190614627648,-0.3429240109415082,-0.971617492490777,0.4572318569714072,-1.043059782289346,-0.385789125391733,-3.000583244002121,0.7430016785343333,0,-0.1285964957556075}
+{1.057349341603808,1.057349002221723,1.05734870404836,1.057348450847541,1.057348246878003,-0.9716178139082745,0.5000967845439084,0.04286497558209432,1.057347928005605,0.7715781415049059,0.2286155572183723,-0.2143275151859006,-0.8430209967351694,0.5858283527270147,-0.9144632865337383,-0.2571926296361255,-2.871986748246513,0.8715981742899408,0.1285964957556075,0}
+}
+
+
+
+
+{
+{0,0.1115032012910158,-8.799709894091734e-08,-0.185838884186984,-0.2601744574959486,-1.486710158053884,-1.040697230288078,-1.263703709336849,-1.077864929739406,-0.3716776505432602,-1.932722995767998,-1.969890729250555,-2.378735924811361,-2.267232615128872,-2.89908440956258,-2.638910118010186,-0.11150337800768,-0.07433564122746383,-1.9698907296639,-1.412374539157715}
+{-0.1115032012910158,0,-0.1115032892881147,-0.2973420854779998,-0.3716776587869643,-1.5982133593449,-1.152200431579093,-1.375206910627865,-1.189368131030422,-0.4831808518342759,-2.044226197059014,-2.081393930541571,-2.490239126102376,-2.378735816419888,-3.010587610853595,-2.750413319301201,-0.2230065792986957,-0.1858388425184796,-2.081393930954916,-1.523877740448731}
+{8.799709894091734e-08,0.1115032892881147,0,-0.1858387961898851,-0.2601743694988496,-1.486710070056785,-1.040697142290979,-1.26370362133975,-1.077864841742307,-0.3716775625461612,-1.932722907770899,-1.969890641253456,-2.378735836814261,-2.267232527131773,-2.89908432156548,-2.638910030013087,-0.111503290010581,-0.07433555323036489,-1.969890641666801,-1.412374451160616}
+{0.185838884186984,0.2973420854779998,0.1858387961898851,0,-0.07433557330896456,-1.3008712738669,-0.8548583461010936,-1.077864825149865,-0.8920260455524223,-0.1858387663562762,-1.746884111581014,-1.784051845063571,-2.192897040624376,-2.081393730941888,-2.713245525375595,-2.453071233823202,0.07433550617930407,0.1115032429595202,-1.784051845476916,-1.226535654970731}
+{0.2601744574959486,0.3716776587869643,0.2601743694988496,0.07433557330896456,0,-1.226535700557936,-0.780522772792129,-1.0035292518409,-0.8176904722434577,-0.1115031930473116,-1.67254853827205,-1.709716271754606,-2.118561467315412,-2.007058157632923,-2.638909952066631,-2.378735660514237,0.1486710794882686,0.1858388162684848,-1.709716272167951,-1.152200081661767}
+{1.486710158053884,1.5982133593449,1.486710070056785,1.3008712738669,1.226535700557936,0,0.4460129277658069,0.2230064487170355,0.4088452283144781,1.115032507510624,-0.446012837714114,-0.4831805711966704,-0.892025766757476,-0.7805224570749874,-1.412374251508695,-1.152199959956302,1.375206780046204,1.412374516826421,-0.4831805716100154,0.07433561889616935}
+{1.040697230288078,1.152200431579093,1.040697142290979,0.8548583461010936,0.780522772792129,-0.4460129277658069,0,-0.2230064790487714,-0.03716769945132872,0.6690195797448174,-0.8920257654799209,-0.9291934989624773,-1.338038694523283,-1.226535384840794,-1.858387179274502,-1.598212887722108,0.9291938522803976,0.9663615890606138,-0.9291934993758223,-0.3716773088696375}
+{1.263703709336849,1.375206910627865,1.26370362133975,1.077864825149865,1.0035292518409,-0.2230064487170355,0.2230064790487714,0,0.1858387795974426,0.8920260587935888,-0.6690192864311495,-0.7061870199137059,-1.115032215474511,-1.003528905792023,-1.63538070022573,-1.375206408673337,1.152200331329169,1.189368068109385,-0.7061870203270509,-0.1486708298208662}
+{1.077864929739406,1.189368131030422,1.077864841742307,0.8920260455524223,0.8176904722434577,-0.4088452283144781,0.03716769945132872,-0.1858387795974426,0,0.7061872791961461,-0.8548580660285922,-0.8920257995111486,-1.300870995071954,-1.189367685389465,-1.821219479823173,-1.56104518827078,0.9663615517317263,1.003529288511942,-0.8920257999244936,-0.3345096094183088}
+{0.3716776505432602,0.4831808518342759,0.3716775625461612,0.1858387663562762,0.1115031930473116,-1.115032507510624,-0.6690195797448174,-0.8920260587935888,-0.7061872791961461,0,-1.561045345224738,-1.598213078707295,-2.0070582742681,-1.895554964585612,-2.527406759019319,-2.267232467466926,0.2601742725355802,0.2973420093157964,-1.59821307912064,-1.040696888614455}
+{1.932722995767998,2.044226197059014,1.932722907770899,1.746884111581014,1.67254853827205,0.446012837714114,0.8920257654799209,0.6690192864311495,0.8548580660285922,1.561045345224738,0,-0.03716773348255642,-0.446012929043362,-0.3345096193608733,-0.966361413794581,-0.7061871222421875,1.821219617760319,1.858387354540535,-0.03716773389590144,0.5203484566102834}
+{1.969890729250555,2.081393930541571,1.969890641253456,1.784051845063571,1.709716271754606,0.4831805711966704,0.9291934989624773,0.7061870199137059,0.8920257995111486,1.598213078707295,0.03716773348255642,0,-0.4088451955608056,-0.2973418858783169,-0.9291936803120245,-0.6690193887596311,1.858387351242875,1.895555088023091,-4.133450248744452e-10,0.5575161900928398}
+{2.378735924811361,2.490239126102376,2.378735836814261,2.192897040624376,2.118561467315412,0.892025766757476,1.338038694523283,1.115032215474511,1.300870995071954,2.0070582742681,0.446012929043362,0.4088451955608056,0,0.1115033096824887,-0.520348484751219,-0.2601741931988255,2.26723254680368,2.304400283583897,0.4088451951474605,0.9663613856536453}
+{2.267232615128872,2.378735816419888,2.267232527131773,2.081393730941888,2.007058157632923,0.7805224570749874,1.226535384840794,1.003528905792023,1.189367685389465,1.895554964585612,0.3345096193608733,0.2973418858783169,-0.1115033096824887,0,-0.6318517944337076,-0.3716775028813142,2.155729237121192,2.192896973901408,0.2973418854649719,0.8548580759711566}
+{2.89908440956258,3.010587610853595,2.89908432156548,2.713245525375595,2.638909952066631,1.412374251508695,1.858387179274502,1.63538070022573,1.821219479823173,2.527406759019319,0.966361413794581,0.9291936803120245,0.520348484751219,0.6318517944337076,0,0.2601742915523935,2.787581031554899,2.824748768335116,0.9291936798986795,1.486709870404864}
+{2.638910118010186,2.750413319301201,2.638910030013087,2.453071233823202,2.378735660514237,1.152199959956302,1.598212887722108,1.375206408673337,1.56104518827078,2.267232467466926,0.7061871222421875,0.6690193887596311,0.2601741931988255,0.3716775028813142,-0.2601742915523935,0,2.527406740002506,2.564574476782722,0.669019388346286,1.226535578852471}
+{0.11150337800768,0.2230065792986957,0.111503290010581,-0.07433550617930407,-0.1486710794882686,-1.375206780046204,-0.9291938522803976,-1.152200331329169,-0.9663615517317263,-0.2601742725355802,-1.821219617760319,-1.858387351242875,-2.26723254680368,-2.155729237121192,-2.787581031554899,-2.527406740002506,0,0.03716773678021612,-1.85838735165622,-1.300871161150035}
+{0.07433564122746383,0.1858388425184796,0.07433555323036489,-0.1115032429595202,-0.1858388162684848,-1.412374516826421,-0.9663615890606138,-1.189368068109385,-1.003529288511942,-0.2973420093157964,-1.858387354540535,-1.895555088023091,-2.304400283583897,-2.192896973901408,-2.824748768335116,-2.564574476782722,-0.03716773678021612,0,-1.895555088436436,-1.338038897930251}
+{1.9698907296639,2.081393930954916,1.969890641666801,1.784051845476916,1.709716272167951,0.4831805716100154,0.9291934993758223,0.7061870203270509,0.8920257999244936,1.59821307912064,0.03716773389590144,4.133450248744452e-10,-0.4088451951474605,-0.2973418854649719,-0.9291936798986795,-0.669019388346286,1.85838735165622,1.895555088436436,0,0.5575161905061847}
+{1.412374539157715,1.523877740448731,1.412374451160616,1.226535654970731,1.152200081661767,-0.07433561889616935,0.3716773088696375,0.1486708298208662,0.3345096094183088,1.040696888614455,-0.5203484566102834,-0.5575161900928398,-0.9663613856536453,-0.8548580759711566,-1.486709870404864,-1.226535578852471,1.300871161150035,1.338038897930251,-0.5575161905061847,0}
+}
+
+
+
+
+{
+{0,0.4889063302948724,0.4889062726897263,0.6285938160725824,1.117500358282264,2.328126158736036,2.316485506019842,1.652969416188796,2.351407389931214,-0.09312535172789205,0.8381251112488046,1.09421906606742,1.769375806791651,0.3026559367587582,1.815938381576733,1.140781693232735,1.792657158966981,-0.8846876470864475,0.1862497118328355,3.003282977989235}
+{-0.4889063302948724,0,-5.760514609765011e-08,0.13968748577771,0.6285940279873914,1.839219828441164,1.82757917572497,1.164063085893924,1.862501059636342,-0.5820316820227645,0.3492187809539322,0.6053127357725474,1.280469476496778,-0.1862503935361142,1.327032051281861,0.651875362937863,1.303750828672108,-1.37359397738132,-0.302656618462037,2.514376647694363}
+{-0.4889062726897263,5.760514609765011e-08,0,0.139687543382856,0.6285940855925375,1.83921988604631,1.827579233330116,1.16406314349907,1.862501117241488,-0.5820316244176184,0.3492188385590783,0.6053127933776935,1.280469534101924,-0.1862503359309681,1.327032108887007,0.6518754205430091,1.303750886277254,-1.373593919776174,-0.3026565608568909,2.514376705299509}
+{-0.6285938160725824,-0.13968748577771,-0.139687543382856,0,0.4889065422096814,1.699532342663454,1.68789168994726,1.024375600116214,1.722813573858632,-0.7217191678004744,0.2095312951762222,0.4656252499948375,1.140781990719068,-0.3259378793138241,1.187344565504151,0.512187877160153,1.164063342894398,-1.51328146315903,-0.4423441042397469,2.374689161916653}
+{-1.117500358282264,-0.6285940279873914,-0.6285940855925375,-0.4889065422096814,0,1.210625800453772,1.198985147737579,0.5354690579065327,1.23390703164895,-1.210625710010156,-0.2793752470334592,-0.02328129221484396,0.6518754485093867,-0.8148444215235056,0.6984380232944692,0.02328133495047165,0.675156800684717,-2.002188005368711,-0.9312506464494283,1.885782619706971}
+{-2.328126158736036,-1.839219828441164,-1.83921988604631,-1.699532342663454,-1.210625800453772,0,-0.01164065271619386,-0.6751567425472398,0.023281231195178,-2.421251510463928,-1.490001047487232,-1.233907092668616,-0.5587503519443857,-2.025470221977278,-0.5121877771593032,-1.187344465503301,-0.5354689997690555,-3.212813805822484,-2.141876446903201,0.6751568192531989}
+{-2.316485506019842,-1.82757917572497,-1.827579233330116,-1.68789168994726,-1.198985147737579,0.01164065271619386,0,-0.6635160898310459,0.03492188391137185,-2.409610857747734,-1.478360394771038,-1.222266439952423,-0.5471096992281919,-2.013829569261084,-0.5005471244431093,-1.175703812787107,-0.5238283470528616,-3.20117315310629,-2.130235794187007,0.6867974719693928}
+{-1.652969416188796,-1.164063085893924,-1.16406314349907,-1.024375600116214,-0.5354690579065327,0.6751567425472398,0.6635160898310459,0,0.6984379737424178,-1.746094767916688,-0.8148443049399918,-0.5587503501213766,0.1164063906028541,-1.350313479430038,0.1629689653879366,-0.5121877229560611,0.1396877427781843,-2.537657063275244,-1.466719704355961,1.350313561800439}
+{-2.351407389931214,-1.862501059636342,-1.862501117241488,-1.722813573858632,-1.23390703164895,-0.023281231195178,-0.03492188391137185,-0.6984379737424178,0,-2.444532741659106,-1.51328227868241,-1.257188323863794,-0.5820315831395637,-2.048751453172456,-0.5354690083544812,-1.210625696698479,-0.5587502309642335,-3.236095037017662,-2.165157678098379,0.6518755880580209}
+{0.09312535172789205,0.5820316820227645,0.5820316244176184,0.7217191678004744,1.210625710010156,2.421251510463928,2.409610857747734,1.746094767916688,2.444532741659106,0,0.9312504629766967,1.187344417795312,1.862501158519543,0.3957812884866503,1.909063733304625,1.233907044960628,1.885782510694873,-0.7915622953585555,0.2793750635607275,3.096408329717127}
+{-0.8381251112488046,-0.3492187809539322,-0.3492188385590783,-0.2095312951762222,0.2793752470334592,1.490001047487232,1.478360394771038,0.8148443049399918,1.51328227868241,-0.9312504629766967,0,0.2560939548186152,0.9312506955428459,-0.5354691744900464,0.9778132703279285,0.3026565819839309,0.9545320477181762,-1.722812758335252,-0.6518753994159692,2.165157866740431}
+{-1.09421906606742,-0.6053127357725474,-0.6053127933776935,-0.4656252499948375,0.02328129221484396,1.233907092668616,1.222266439952423,0.5587503501213766,1.257188323863794,-1.187344417795312,-0.2560939548186152,0,0.6751567407242307,-0.7915631293086616,0.7217193155093132,0.04656262716531562,0.6984380928995609,-1.978906713153867,-0.9079693542345844,1.909063911921815}
+{-1.769375806791651,-1.280469476496778,-1.280469534101924,-1.140781990719068,-0.6518754485093867,0.5587503519443857,0.5471096992281919,-0.1164063906028541,0.5820315831395637,-1.862501158519543,-0.9312506955428459,-0.6751567407242307,0,-1.466719870032892,0.04656257478508252,-0.6285941135589151,0.02328135217533023,-2.654063453878098,-1.583126094958815,1.233907171197585}
+{-0.3026559367587582,0.1862503935361142,0.1862503359309681,0.3259378793138241,0.8148444215235056,2.025470221977278,2.013829569261084,1.350313479430038,2.048751453172456,-0.3957812884866503,0.5354691744900464,0.7915631293086616,1.466719870032892,0,1.513282444817975,0.8381257564739771,1.490001222208222,-1.187343583845206,-0.1164062249259228,2.700627041230477}
+{-1.815938381576733,-1.327032051281861,-1.327032108887007,-1.187344565504151,-0.6984380232944692,0.5121877771593032,0.5005471244431093,-0.1629689653879366,0.5354690083544812,-1.909063733304625,-0.9778132703279285,-0.7217193155093132,-0.04656257478508252,-1.513282444817975,0,-0.6751566883439977,-0.02328122260975229,-2.70062602866318,-1.629688669743897,1.187344596412502}
+{-1.140781693232735,-0.651875362937863,-0.6518754205430091,-0.512187877160153,-0.02328133495047165,1.187344465503301,1.175703812787107,0.5121877229560611,1.210625696698479,-1.233907044960628,-0.3026565819839309,-0.04656262716531562,0.6285941135589151,-0.8381257564739771,0.6751566883439977,0,0.6518754657342454,-2.025469340319183,-0.9545319813998999,1.8625012847565}
+{-1.792657158966981,-1.303750828672108,-1.303750886277254,-1.164063342894398,-0.675156800684717,0.5354689997690555,0.5238283470528616,-0.1396877427781843,0.5587502309642335,-1.885782510694873,-0.9545320477181762,-0.6984380928995609,-0.02328135217533023,-1.490001222208222,0.02328122260975229,-0.6518754657342454,0,-2.677344806053428,-1.606407447134145,1.210625819022254}
+{0.8846876470864475,1.37359397738132,1.373593919776174,1.51328146315903,2.002188005368711,3.212813805822484,3.20117315310629,2.537657063275244,3.236095037017662,0.7915622953585555,1.722812758335252,1.978906713153867,2.654063453878098,1.187343583845206,2.70062602866318,2.025469340319183,2.677344806053428,0,1.070937358919283,3.887970625075683}
+{-0.1862497118328355,0.302656618462037,0.3026565608568909,0.4423441042397469,0.9312506464494283,2.141876446903201,2.130235794187007,1.466719704355961,2.165157678098379,-0.2793750635607275,0.6518753994159692,0.9079693542345844,1.583126094958815,0.1164062249259228,1.629688669743897,0.9545319813998999,1.606407447134145,-1.070937358919283,0,2.817033266156399}
+{-3.003282977989235,-2.514376647694363,-2.514376705299509,-2.374689161916653,-1.885782619706971,-0.6751568192531989,-0.6867974719693928,-1.350313561800439,-0.6518755880580209,-3.096408329717127,-2.165157866740431,-1.909063911921815,-1.233907171197585,-2.700627041230477,-1.187344596412502,-1.8625012847565,-1.210625819022254,-3.887970625075683,-2.817033266156399,0}
+}
+
+
+
+
+{
+{0,-0.2830168446917243,-0.3056582009442229,-0.1471687822616149,-0.2716961649123439,-0.1132067380996698,-0.4641475819952325,-0.3849028765767559,-0.2943375009562609,-0.1018860727516711,-1.19433096466828,-0.09622573997693365,0.03962233502200896,-2.411303354256459,1.533951102667188,1.279235982399619,0.2320737860647026,-0.2320737944685611,-2.988657327050933,-0.2773564875844434}
+{0.2830168446917243,0,-0.02264135625249857,0.1358480624301094,0.01132067977938037,0.1698101065920545,-0.1811307373035082,-0.1018860318850316,-0.01132065626453657,0.1811307719400533,-0.9113141199765554,0.1867911047147907,0.3226391797137333,-2.128286509564735,1.816967947358912,1.562252827091343,0.515090630756427,0.05094305022316319,-2.705640482359208,0.005660357107280911}
+{0.3056582009442229,0.02264135625249857,0,0.158489418682608,0.03396203603187894,0.1924514628445531,-0.1584893810510096,-0.07924467563253304,0.01132069998796199,0.2037721281925518,-0.8886727637240569,0.2094324609672893,0.3452805359662319,-2.105645153312236,1.839609303611411,1.584894183343842,0.5377319870089255,0.07358440647566175,-2.68299912610671,0.02830171335977948}
+{0.1471687822616149,-0.1358480624301094,-0.158489418682608,0,-0.124527382650729,0.03396204416194512,-0.3169787997336176,-0.237734094315141,-0.147168718694646,0.04528270950994384,-1.047162182406665,0.05094304228468127,0.1867911172836239,-2.264134571994844,1.681119884928803,1.426404764661234,0.3792425683263175,-0.08490501220694623,-2.841488544789318,-0.1301877053228285}
+{0.2716961649123439,-0.01132067977938037,-0.03396203603187894,0.124527382650729,0,0.1584894268126742,-0.1924514170828885,-0.113206711664412,-0.02264133604391694,0.1698100921606729,-0.9226347997559359,0.1754704249354103,0.3113184999343529,-2.139607189344115,1.805647267579532,1.550932147311963,0.5037699509770466,0.03962237044378282,-2.716961162138589,-0.005660322672099462}
+{0.1132067380996698,-0.1698101065920545,-0.1924514628445531,-0.03396204416194512,-0.1584894268126742,0,-0.3509408438955627,-0.2716961384770861,-0.1811307628565911,0.01132066534799872,-1.08112422656861,0.01698099812273615,0.1528290731216788,-2.298096616156789,1.647157840766858,1.392442720499289,0.3452805241643724,-0.1188670563688913,-2.875450588951263,-0.1641497494847736}
+{0.4641475819952325,0.1811307373035082,0.1584893810510096,0.3169787997336176,0.1924514170828885,0.3509408438955627,0,0.07924470541847657,0.1698100810389716,0.3622615092435614,-0.7301833826730473,0.3679218420182989,0.5037699170172415,-1.947155772261226,1.998098684662421,1.743383564394851,0.6962213680599352,0.2320737875266713,-2.5245097450557,0.1867910944107891}
+{0.3849028765767559,0.1018860318850316,0.07924467563253304,0.237734094315141,0.113206711664412,0.2716961384770861,-0.07924470541847657,0,0.09056537562049502,0.2830168038250849,-0.8094280880915239,0.2886771365998223,0.4245252115987649,-2.026400477679703,1.918853979243944,1.664138858976375,0.6169766626414586,0.1528290821081948,-2.603754450474177,0.1075463889923125}
+{0.2943375009562609,0.01132065626453657,-0.01132069998796199,0.147168718694646,0.02264133604391694,0.1811307628565911,-0.1698100810389716,-0.09056537562049502,0,0.1924514282045898,-0.8999934637120189,0.1981117609793273,0.3339598359782699,-2.116965853300198,1.828288603623449,1.57357348335588,0.5264112870209635,0.06226370648769976,-2.694319826094672,0.01698101337181748}
+{0.1018860727516711,-0.1811307719400533,-0.2037721281925518,-0.04528270950994384,-0.1698100921606729,-0.01132066534799872,-0.3622615092435614,-0.2830168038250849,-0.1924514282045898,0,-1.092444891916609,0.005660332774737431,0.14150840777368,-2.309417281504788,1.635837175418859,1.38112205515129,0.3339598588163737,-0.1301877217168901,-2.886771254299262,-0.1754704148327723}
+{1.19433096466828,0.9113141199765554,0.8886727637240569,1.047162182406665,0.9226347997559359,1.08112422656861,0.7301833826730473,0.8094280880915239,0.8999934637120189,1.092444891916609,0,1.098105224691346,1.233953299690289,-1.216972389588179,2.728282067335468,2.473566947067899,1.426404750732982,0.9622571701997187,-1.794326362382653,0.9169744770838364}
+{0.09622573997693365,-0.1867911047147907,-0.2094324609672893,-0.05094304228468127,-0.1754704249354103,-0.01698099812273615,-0.3679218420182989,-0.2886771365998223,-0.1981117609793273,-0.005660332774737431,-1.098105224691346,0,0.1358480749989426,-2.315077614279526,1.630176842644122,1.375461722376553,0.3282995260416363,-0.1358480544916275,-2.892431587073999,-0.1811307476075098}
+{-0.03962233502200896,-0.3226391797137333,-0.3452805359662319,-0.1867911172836239,-0.3113184999343529,-0.1528290731216788,-0.5037699170172415,-0.4245252115987649,-0.3339598359782699,-0.14150840777368,-1.233953299690289,-0.1358480749989426,0,-2.450925689278468,1.494328767645179,1.23961364737761,0.1924514510426937,-0.2716961294905701,-3.028279662072942,-0.3169788226064524}
+{2.411303354256459,2.128286509564735,2.105645153312236,2.264134571994844,2.139607189344115,2.298096616156789,1.947155772261226,2.026400477679703,2.116965853300198,2.309417281504788,1.216972389588179,2.315077614279526,2.450925689278468,0,3.945254456923647,3.690539336656078,2.643377140321162,2.179229559787898,-0.5773539727944739,2.133946866672015}
+{-1.533951102667188,-1.816967947358912,-1.839609303611411,-1.681119884928803,-1.805647267579532,-1.647157840766858,-1.998098684662421,-1.918853979243944,-1.828288603623449,-1.635837175418859,-2.728282067335468,-1.630176842644122,-1.494328767645179,-3.945254456923647,0,-0.2547151202675693,-1.301877316602486,-1.766024897135749,-4.522608429718121,-1.811307590251632}
+{-1.279235982399619,-1.562252827091343,-1.584894183343842,-1.426404764661234,-1.550932147311963,-1.392442720499289,-1.743383564394851,-1.664138858976375,-1.57357348335588,-1.38112205515129,-2.473566947067899,-1.375461722376553,-1.23961364737761,-3.690539336656078,0.2547151202675693,0,-1.047162196334916,-1.51130977686818,-4.267893309450551,-1.556592469984062}
+{-0.2320737860647026,-0.515090630756427,-0.5377319870089255,-0.3792425683263175,-0.5037699509770466,-0.3452805241643724,-0.6962213680599352,-0.6169766626414586,-0.5264112870209635,-0.3339598588163737,-1.426404750732982,-0.3282995260416363,-0.1924514510426937,-2.643377140321162,1.301877316602486,1.047162196334916,0,-0.4641475805332638,-3.220731113115636,-0.5094302736491461}
+{0.2320737944685611,-0.05094305022316319,-0.07358440647566175,0.08490501220694623,-0.03962237044378282,0.1188670563688913,-0.2320737875266713,-0.1528290821081948,-0.06226370648769976,0.1301877217168901,-0.9622571701997187,0.1358480544916275,0.2716961294905701,-2.179229559787898,1.766024897135749,1.51130977686818,0.4641475805332638,0,-2.756583532582372,-0.04528269311588228}
+{2.988657327050933,2.705640482359208,2.68299912610671,2.841488544789318,2.716961162138589,2.875450588951263,2.5245097450557,2.603754450474177,2.694319826094672,2.886771254299262,1.794326362382653,2.892431587073999,3.028279662072942,0.5773539727944739,4.522608429718121,4.267893309450551,3.220731113115636,2.756583532582372,0,2.711300839466489}
+{0.2773564875844434,-0.005660357107280911,-0.02830171335977948,0.1301877053228285,0.005660322672099462,0.1641497494847736,-0.1867910944107891,-0.1075463889923125,-0.01698101337181748,0.1754704148327723,-0.9169744770838364,0.1811307476075098,0.3169788226064524,-2.133946866672015,1.811307590251632,1.556592469984062,0.5094302736491461,0.04528269311588228,-2.711300839466489,0}
+}
+
+
+
+
+{
+{0,-0.3347871402420541,-0.5691382672841141,0.3013085010413148,-0.4687022620585899,1.205234045603435,1.473063846562595,1.171755354920994,0.3347872796140969,1.372627696206954,2.008723429140831,2.109159597155772,2.109159591198414,2.243074476730188,2.109159579374921,2.109159574832968,0.1004361982300506,1.238712775050439,2.443946798611479,1.071319161192444}
+{0.3347871402420541,0,-0.23435112704206,0.6360956412833689,-0.1339151218165358,1.540021185845489,1.80785098680465,1.506542495163048,0.6695744198561511,1.707414836449008,2.343510569382885,2.443946737397827,2.443946731440469,2.577861616972242,2.443946719616975,2.443946715075022,0.4352233384721047,1.573499915292493,2.778733938853533,1.406106301434498}
+{0.5691382672841141,0.23435112704206,0,0.8704467683254289,0.1004360052255242,1.774372312887549,2.042202113846709,1.740893622205108,0.903925546898211,1.941765963491068,2.577861696424945,2.678297864439886,2.678297858482528,2.812212744014302,2.678297846659035,2.678297842117082,0.6695744655141647,1.807851042334553,3.013085065895593,1.640457428476558}
+{-0.3013085010413148,-0.6360956412833689,-0.8704467683254289,0,-0.7700107630999047,0.9039255445621198,1.171755345521281,0.8704468538796787,0.03347877857278214,1.071319195165639,1.707414928099516,1.807851096114458,1.807851090157099,1.941765975688873,1.807851078333606,1.807851073791653,-0.2008723028112642,0.937404274009124,2.142638297570164,0.7700106601511294}
+{0.4687022620585899,0.1339151218165358,-0.1004360052255242,0.7700107630999047,0,1.673936307662025,1.941766108621185,1.640457616979583,0.8034895416726868,1.841329958265544,2.477425691199421,2.577861859214362,2.577861853257004,2.711776738788778,2.577861841433511,2.577861836891558,0.5691384602886405,1.707415037109029,2.912649060670069,1.540021423251034}
+{-1.205234045603435,-1.540021185845489,-1.774372312887549,-0.9039255445621198,-1.673936307662025,0,0.2678298009591608,-0.03347869068244116,-0.8704467659893377,0.1673936506035192,0.803489383537396,0.9039255515523378,0.9039255455949796,1.037840431126753,0.9039255337714865,0.9039255292295333,-1.104797847373384,0.03347872944700409,1.238712753008044,-0.1339148844109904}
+{-1.473063846562595,-1.80785098680465,-2.042202113846709,-1.171755345521281,-1.941766108621185,-0.2678298009591608,0,-0.3013084916416019,-1.138276566948498,-0.1004361503556416,0.5356595825782351,0.636095750593177,0.6360957446358189,0.7700106301675924,0.6360957328123258,0.6360957282703725,-1.372627648332545,-0.2343510715121567,0.9708829520488835,-0.4017446853701512}
+{-1.171755354920994,-1.506542495163048,-1.740893622205108,-0.8704468538796787,-1.640457616979583,0.03347869068244116,0.3013084916416019,0,-0.8369680753068965,0.2008723412859603,0.8369680742198371,0.9374042422347789,0.9374042362774208,1.071319121809194,0.9374042244539277,0.9374042199119744,-1.071319156690943,0.06695742012944525,1.272191443690486,-0.1004361937285492}
+{-0.3347872796140969,-0.6695744198561511,-0.903925546898211,-0.03347877857278214,-0.8034895416726868,0.8704467659893377,1.138276566948498,0.8369680753068965,0,1.037840416592857,1.673936149526734,1.774372317541675,1.774372311584317,1.908287197116091,1.774372299760824,1.774372295218871,-0.2343510813840464,0.9039254954363418,2.109159518997382,0.7365318815783473}
+{-1.372627696206954,-1.707414836449008,-1.941765963491068,-1.071319195165639,-1.841329958265544,-0.1673936506035192,0.1004361503556416,-0.2008723412859603,-1.037840416592857,0,0.6360957329338768,0.7365319009488186,0.7365318949914604,0.870446780523234,0.7365318831679674,0.7365318786260141,-1.272191497976903,-0.1339149211565151,1.071319102404525,-0.3013085350145095}
+{-2.008723429140831,-2.343510569382885,-2.577861696424945,-1.707414928099516,-2.477425691199421,-0.803489383537396,-0.5356595825782351,-0.8369680742198371,-1.673936149526734,-0.6360957329338768,0,0.1004361680149418,0.1004361620575837,0.2343510475893572,0.1004361502340906,0.1004361456921373,-1.90828723091078,-0.7700106540903918,0.4352233694706483,-0.9374042679483864}
+{-2.109159597155772,-2.443946737397827,-2.678297864439886,-1.807851096114458,-2.577861859214362,-0.9039255515523378,-0.636095750593177,-0.9374042422347789,-1.774372317541675,-0.7365319009488186,-0.1004361680149418,0,-5.957358162334003e-09,0.1339148795744154,-1.778085123582684e-08,-2.232280449376844e-08,-2.008723398925722,-0.8704468221053336,0.3347872014557065,-1.037840435963328}
+{-2.109159591198414,-2.443946731440469,-2.678297858482528,-1.807851090157099,-2.577861853257004,-0.9039255455949796,-0.6360957446358189,-0.9374042362774208,-1.774372311584317,-0.7365318949914604,-0.1004361620575837,5.957358162334003e-09,0,0.1339148855317736,-1.182349307349284e-08,-1.636544633143444e-08,-2.008723392968363,-0.8704468161479755,0.3347872074130647,-1.03784043000597}
+{-2.243074476730188,-2.577861616972242,-2.812212744014302,-1.941765975688873,-2.711776738788778,-1.037840431126753,-0.7700106301675924,-1.071319121809194,-1.908287197116091,-0.870446780523234,-0.2343510475893572,-0.1339148795744154,-0.1339148855317736,0,-0.1339148973552666,-0.1339149018972199,-2.142638278500137,-1.004361701679749,0.2008723218812911,-1.171755315537744}
+{-2.109159579374921,-2.443946719616975,-2.678297846659035,-1.807851078333606,-2.577861841433511,-0.9039255337714865,-0.6360957328123258,-0.9374042244539277,-1.774372299760824,-0.7365318831679674,-0.1004361502340906,1.778085123582684e-08,1.182349307349284e-08,0.1339148973552666,0,-4.5419532579416e-09,-2.008723381144871,-0.8704468043244824,0.3347872192365577,-1.037840418182477}
+{-2.109159574832968,-2.443946715075022,-2.678297842117082,-1.807851073791653,-2.577861836891558,-0.9039255292295333,-0.6360957282703725,-0.9374042199119744,-1.774372295218871,-0.7365318786260141,-0.1004361456921373,2.232280449376844e-08,1.636544633143444e-08,0.1339149018972199,4.5419532579416e-09,0,-2.008723376602918,-0.8704467997825291,0.334787223778511,-1.037840413640524}
+{-0.1004361982300506,-0.4352233384721047,-0.6695744655141647,0.2008723028112642,-0.5691384602886405,1.104797847373384,1.372627648332545,1.071319156690943,0.2343510813840464,1.272191497976903,1.90828723091078,2.008723398925722,2.008723392968363,2.142638278500137,2.008723381144871,2.008723376602918,0,1.138276576820388,2.343510600381428,0.9708829629623936}
+{-1.238712775050439,-1.573499915292493,-1.807851042334553,-0.937404274009124,-1.707415037109029,-0.03347872944700409,0.2343510715121567,-0.06695742012944525,-0.9039254954363418,0.1339149211565151,0.7700106540903918,0.8704468221053336,0.8704468161479755,1.004361701679749,0.8704468043244824,0.8704467997825291,-1.138276576820388,0,1.20523402356104,-0.1673936138579945}
+{-2.443946798611479,-2.778733938853533,-3.013085065895593,-2.142638297570164,-2.912649060670069,-1.238712753008044,-0.9708829520488835,-1.272191443690486,-2.109159518997382,-1.071319102404525,-0.4352233694706483,-0.3347872014557065,-0.3347872074130647,-0.2008723218812911,-0.3347872192365577,-0.334787223778511,-2.343510600381428,-1.20523402356104,0,-1.372627637419035}
+{-1.071319161192444,-1.406106301434498,-1.640457428476558,-0.7700106601511294,-1.540021423251034,0.1339148844109904,0.4017446853701512,0.1004361937285492,-0.7365318815783473,0.3013085350145095,0.9374042679483864,1.037840435963328,1.03784043000597,1.171755315537744,1.037840418182477,1.037840413640524,-0.9708829629623936,0.1673936138579945,1.372627637419035,0}
+}
diff --git a/res/TemplateBatchFiles/TemplateModels/EmpiricalAA/LG b/res/TemplateBatchFiles/TemplateModels/EmpiricalAA/LG
new file mode 100644
index 0000000..3eefd9b
--- /dev/null
+++ b/res/TemplateBatchFiles/TemplateModels/EmpiricalAA/LG
@@ -0,0 +1,44 @@
+ACDEFGHIKLMNPQRSTVWY
+{{             0,     2.4890837,    0.39514435,     1.0385443,    0.25370059,      2.066039,    0.35885784,    0.14982985,    0.53651783,    0.39533733,     1.1240347,    0.27681832,     1.1776509,    0.96989392,    0.42509245,     4.7271804,     2.1395006,     2.5478697,    0.18071662,    0.21895908}
+{     2.4890837,             0,   0.062555906,   0.003499274,     1.1052511,    0.56926458,    0.64054259,    0.32062657,   0.013265853,    0.59400724,    0.89367979,    0.52876813,   0.075381891,   0.084808359,    0.53455088,     2.7844772,     1.1434797,       1.95929,    0.67012807,     1.1655316}
+{    0.39514435,   0.062555906,             0,      5.243868,    0.01741582,     0.8449254,     0.9271141,    0.01069023,     0.2829585,   0.015075551,   0.025548356,     5.0761471,    0.39445605,    0.52338552,    0.12395413,     1.2402744,    0.42585978,   0.037967113,   0.029890093,    0.13510725}
+{     1.0385443,   0.003499274,      5.243868,             0,   0.018811039,    0.34884696,    0.42388087,   0.044265021,     1.8071764,   0.069672559,    0.17373539,    0.54171192,    0.41940891,     4.1285897,    0.36396992,    0.61197284,    0.60454457,    0.24503411,   0.077852072,    0.12003742}
+{    0.25370059,     1.1052511,    0.01741582,   0.018811039,             0,   0.089585483,    0.68213848,     1.1127262,   0.023918071,     2.5926917,     1.7988525,   0.089525087,   0.094463956,   0.035855056,   0.052721535,    0.36181849,    0.16500105,    0.65468292,     2.4571204,     7.8038994}
+{      2.066039,    0.56926458,     0.8449254,    0.34884696,   0.089585483,             0,    0.31148391,  0.0087054516,    0.29663617,    0.04426053,    0.13953789,     1.4376449,    0.19696132,    0.26795876,    0.39019229,     1.7399898,    0.12983619,    0.07670085,    0.26849133,   0.054678753}
+{    0.35885784,    0.64054259,     0.9271141,    0.42388087,    0.68213848,    0.31148391,             0,    0.10888195,    0.69726378,     0.3663167,    0.44247196,     4.5092364,    0.50885055,     4.8135036,     2.4266008,     0.9900121,    0.58426218,    0.11901337,    0.59705339,     5.3068322}
+{    0.14982985,    0.32062657,    0.01069023,   0.044265021,     1.1127262,  0.0087054516,    0.10888195,             0,    0.15906847,     4.1450659,     4.2736062,    0.19150282,    0.07828126,   0.072854177,    0.12699054,   0.064105457,     1.0337382,     10.649104,    0.11166008,    0.23252269}
+{    0.53651783,   0.013265853,     0.2829585,     1.8071764,   0.023918071,    0.29663617,    0.69726378,    0.15906847,             0,    0.13749964,    0.65660428,     2.1450773,    0.39032178,     3.2342926,     6.3260657,    0.74868243,     1.1368625,    0.18520165,   0.049905553,    0.13193188}
+{    0.39533733,    0.59400724,   0.015075551,   0.069672559,     2.5926917,    0.04426053,     0.3663167,     4.1450659,    0.13749964,             0,      6.312356,    0.06842664,    0.24906001,    0.58245637,    0.30184773,     0.1822869,    0.30293571,      1.702745,    0.61963194,    0.29964768}
+{     1.1240347,    0.89367979,   0.025548356,    0.17373539,     1.7988525,    0.13953789,    0.44247196,     4.2736062,    0.65660428,      6.312356,             0,    0.37100375,   0.099848702,     1.6725683,    0.48413321,    0.34695977,     2.0203655,     1.8987176,    0.69617497,    0.48130595}
+{    0.27681832,    0.52876813,     5.0761471,    0.54171192,   0.089525087,     1.4376449,     4.5092364,    0.19150282,     2.1450773,    0.06842664,    0.37100375,             0,    0.16178707,     1.6957511,    0.75187754,     4.0083573,     2.0006785,    0.08368748,   0.045375965,    0.61202438}
+{     1.1776509,   0.075381891,    0.39445605,    0.41940891,   0.094463956,    0.19696132,    0.50885055,    0.07828126,    0.39032178,    0.24906001,   0.099848702,    0.16178707,             0,    0.62429374,    0.33253337,     1.3381318,    0.57146773,    0.29650076,   0.095130632,   0.089613415}
+{    0.96989392,   0.084808359,    0.52338552,     4.1285897,   0.035855056,    0.26795876,     4.8135036,   0.072854177,     3.2342926,    0.58245637,     1.6725683,     1.6957511,    0.62429374,             0,      2.807907,     1.2238279,      1.080136,    0.21033229,    0.23619896,    0.25733597}
+{    0.42509245,    0.53455088,    0.12395413,    0.36396992,   0.052721535,    0.39019229,     2.4266008,    0.12699054,     6.3260657,    0.30184773,    0.48413321,    0.75187754,    0.33253337,      2.807907,             0,    0.85815097,    0.57898665,    0.17088738,     0.5936072,    0.31443952}
+{     4.7271804,     2.7844772,     1.2402744,    0.61197284,    0.36181849,     1.7399898,     0.9900121,   0.064105457,    0.74868243,     0.1822869,    0.34695977,     4.0083573,     1.3381318,     1.2238279,    0.85815097,             0,     6.4722771,   0.098368473,    0.24886188,    0.40054664}
+{     2.1395006,     1.1434797,    0.42585978,    0.60454457,    0.16500105,    0.12983619,    0.58426218,     1.0337382,     1.1368625,    0.30293571,     2.0203655,     2.0006785,    0.57146773,      1.080136,    0.57898665,     6.4722771,             0,     2.1881575,    0.14082482,    0.24584051}
+{     2.5478697,       1.95929,   0.037967113,    0.24503411,    0.65468292,    0.07670085,    0.11901337,     10.649104,    0.18520165,      1.702745,     1.8987176,    0.08368748,    0.29650076,    0.21033229,    0.17088738,   0.098368473,     2.1881575,             0,    0.18950974,    0.24931339}
+{    0.18071662,    0.67012807,   0.029890093,   0.077852072,     2.4571204,    0.26849133,    0.59705339,    0.11166008,   0.049905553,    0.61963194,    0.69617497,   0.045375965,   0.095130632,    0.23619896,     0.5936072,    0.24886188,    0.14082482,    0.18950974,             0,     3.1518138}
+{    0.21895908,     1.1655316,    0.13510725,    0.12003742,     7.8038994,   0.054678753,     5.3068322,    0.23252269,    0.13193188,    0.29964768,    0.48130595,    0.61202438,   0.089613415,    0.25733597,    0.31443952,    0.40054664,    0.24584051,    0.24931339,     3.1518138,             0}
+}
+
+{{      0.079066}
+{     0.0129369}
+{     0.0530516}
+{     0.0715863}
+{     0.0423017}
+{     0.0573372}
+{     0.0223546}
+{     0.0621565}
+{     0.0646003}
+{      0.099081}
+{     0.0229506}
+{     0.0419774}
+{     0.0440395}
+{     0.0407668}
+{     0.0559413}
+{     0.0611971}
+{     0.0532871}
+{     0.0691469}
+{     0.0120656}
+{     0.0341554}
+}
diff --git a/res/TemplateBatchFiles/TemplateModels/EmpiricalAA/MtArt b/res/TemplateBatchFiles/TemplateModels/EmpiricalAA/MtArt
new file mode 100644
index 0000000..eada8cd
--- /dev/null
+++ b/res/TemplateBatchFiles/TemplateModels/EmpiricalAA/MtArt
@@ -0,0 +1,44 @@
+ACDEFGHIKLMNPQRSTVWY
+{{             0,     1.9305426,  0.0076005616,  0.0015201123,     0.0988073,     1.5201123,  0.0015201123,     0.1976146,  0.0015201123,   0.030402246,    0.91966795,  0.0015201123,    0.37242752,  0.0015201123,  0.0015201123,     5.1151779,      1.854537,     2.5841909,  0.0015201123,  0.0076005616}
+{     1.9305426,             0,   0.083606177,  0.0015201123,     1.3985033,    0.61564549,   0.091206739,    0.47883538,  0.0015201123,    0.60044436,     2.3713752,    0.74485503,  0.0015201123,  0.0015201123,    0.27362022,     5.0467729,     1.3909028,     2.6601965,    0.16721235,    0.54724043}
+{  0.0076005616,   0.083606177,             0,     6.5516841,  0.0015201123,   0.091206739,  0.0015201123,   0.053203931,   0.015201123,  0.0076005616,  0.0015201123,     3.8002808,  0.0015201123,  0.0015201123,   0.030402246,    0.33442471,  0.0015201123,  0.0015201123,  0.0015201123,  0.0015201123}
+{  0.0015201123,  0.0015201123,     6.5516841,             0,  0.0015201123,    0.33442471,    0.11400842,   0.053203931,    0.80565953,   0.015201123,  0.0015201123,     1.3909028,   0.060804493,     1.9913471,  0.0015201123,    0.23561741,    0.32682415,    0.10640786,   0.083606177,   0.060804493}
+{     0.0988073,     1.3985033,  0.0015201123,  0.0015201123,             0,  0.0076005616,    0.10640786,    0.89686627,   0.083606177,     1.9989477,     2.4473808,    0.15201123,    0.11400842,  0.0015201123,   0.038002808,    0.27362022,    0.10640786,     0.3952292,    0.41043032,     6.0196448}
+{     1.5201123,    0.61564549,   0.091206739,    0.33442471,  0.0076005616,             0,  0.0015201123,   0.022801685,  0.0015201123,  0.0076005616,    0.42563145,    0.91966795,  0.0015201123,   0.022801685,  0.0015201123,     1.7177269,  0.0015201123,   0.022801685,   0.015201123,   0.068405054}
+{  0.0015201123,   0.091206739,  0.0015201123,    0.11400842,    0.10640786,  0.0015201123,             0,  0.0015201123,  0.0015201123,   0.045603369,  0.0015201123,     1.3681011,  0.0076005616,     2.3865763,    0.31162302,   0.083606177,    0.14441067,  0.0015201123,  0.0015201123,     1.4517073}
+{     0.1976146,    0.47883538,   0.053203931,   0.053203931,    0.89686627,   0.022801685,  0.0015201123,             0,   0.022801685,     3.9142892,     3.9142892,    0.15961179,  0.0015201123,   0.083606177,   0.015201123,   0.053203931,     1.5505146,     14.099042,  0.0015201123,   0.091206739}
+{  0.0015201123,  0.0015201123,   0.015201123,    0.80565953,   0.083606177,  0.0015201123,  0.0015201123,   0.022801685,             0,   0.030402246,    0.80565953,     3.5494623,    0.12920955,      2.652596,     1.5885174,     1.0944809,    0.53203931,     0.1976146,    0.12160899,     0.8892657}
+{   0.030402246,    0.60044436,  0.0076005616,   0.015201123,     1.9989477,  0.0076005616,   0.045603369,     3.9142892,   0.030402246,             0,      6.726497,     0.0988073,   0.091206739,    0.12160899,   0.015201123,   0.060804493,    0.36482696,    0.64604773,    0.15961179,    0.15201123}
+{    0.91966795,     2.3713752,  0.0015201123,  0.0015201123,     2.4473808,    0.42563145,  0.0015201123,     3.9142892,    0.80565953,      6.726497,             0,    0.60044436,   0.038002808,    0.50923763,   0.038002808,     0.8512629,     2.1965623,     2.1357578,    0.53963987,    0.53963987}
+{  0.0015201123,    0.74485503,     3.8002808,     1.3909028,    0.15201123,    0.91966795,     1.3681011,    0.15961179,     3.5494623,     0.0988073,    0.60044436,             0,    0.12920955,     1.9913471,  0.0015201123,     3.0250235,     1.2616932,    0.17481292,   0.060804493,      1.907741}
+{    0.37242752,  0.0015201123,  0.0015201123,   0.060804493,    0.11400842,  0.0015201123,  0.0076005616,  0.0015201123,    0.12920955,   0.091206739,   0.038002808,    0.12920955,             0,     0.2964219,  0.0015201123,    0.66124886,    0.35722639,    0.24321797,  0.0015201123,    0.13681011}
+{  0.0015201123,  0.0015201123,  0.0015201123,     1.9913471,  0.0015201123,   0.022801685,     2.3865763,   0.083606177,      2.652596,    0.12160899,    0.50923763,     1.9913471,     0.2964219,             0,     1.1704865,     0.3952292,    0.33442471,  0.0015201123,   0.053203931,    0.66124886}
+{  0.0015201123,    0.27362022,   0.030402246,  0.0015201123,   0.038002808,  0.0015201123,    0.31162302,   0.015201123,     1.5885174,   0.015201123,   0.038002808,  0.0015201123,  0.0015201123,     1.1704865,             0,   0.022801685,  0.0015201123,  0.0015201123,  0.0015201123,   0.030402246}
+{     5.1151779,     5.0467729,    0.33442471,    0.23561741,    0.27362022,     1.7177269,   0.083606177,   0.053203931,     1.0944809,   0.060804493,     0.8512629,     3.0250235,    0.66124886,     0.3952292,   0.022801685,             0,     5.0163706,    0.46363426,   0.015201123,    0.22801685}
+{      1.854537,     1.3909028,  0.0015201123,    0.32682415,    0.10640786,  0.0015201123,    0.14441067,     1.5505146,    0.53203931,    0.36482696,     2.1965623,     1.2616932,    0.35722639,    0.33442471,  0.0015201123,     5.0163706,             0,     4.1347055,  0.0015201123,    0.34962583}
+{     2.5841909,     2.6601965,  0.0015201123,    0.10640786,     0.3952292,   0.022801685,  0.0015201123,     14.099042,     0.1976146,    0.64604773,     2.1357578,    0.17481292,    0.24321797,  0.0015201123,  0.0015201123,    0.46363426,     4.1347055,             0,  0.0015201123,   0.015201123}
+{  0.0015201123,    0.16721235,  0.0015201123,   0.083606177,    0.41043032,   0.015201123,  0.0015201123,  0.0015201123,    0.12160899,    0.15961179,    0.53963987,   0.060804493,  0.0015201123,   0.053203931,  0.0015201123,   0.015201123,  0.0015201123,  0.0015201123,             0,    0.28882134}
+{  0.0076005616,    0.54724043,  0.0015201123,   0.060804493,     6.0196448,   0.068405054,     1.4517073,   0.091206739,     0.8892657,    0.15201123,    0.53963987,      1.907741,    0.13681011,    0.66124886,   0.030402246,    0.22801685,    0.34962583,   0.015201123,    0.28882134,             0}
+}
+
+{{      0.054116}
+{      0.009709}
+{       0.02016}
+{      0.024289}
+{      0.088668}
+{      0.068183}
+{      0.024518}
+{      0.092639}
+{      0.021718}
+{      0.148658}
+{      0.061453}
+{      0.039903}
+{      0.041826}
+{      0.018781}
+{      0.018227}
+{       0.09103}
+{      0.049194}
+{      0.057701}
+{      0.029786}
+{      0.039443}
+}
diff --git a/res/TemplateBatchFiles/TemplateModels/EmpiricalAA/VT b/res/TemplateBatchFiles/TemplateModels/EmpiricalAA/VT
new file mode 100644
index 0000000..f7503a3
--- /dev/null
+++ b/res/TemplateBatchFiles/TemplateModels/EmpiricalAA/VT
@@ -0,0 +1,44 @@
+ACDEFGHIKLMNPQRSTVWY
+{{             0,    0.64975153,    0.75782385,     1.6233056,    0.33339162,     2.5043471,    0.22491344,    0.63728715,     1.1239527,     1.2136557,    0.60464137,    0.56904884,     1.1408101,     0.8862662,    0.66625734,     5.1938222,     2.5091031,     3.5183383,   0.086627631,    0.24883329}
+{    0.64975153,             0,   0.029476088,    0.01520821,    0.14612857,    0.14541118,   0.047716794,    0.13261239,   0.011624091,    0.26211796,   0.067709544,     0.0785848,   0.031831203,   0.012332912,   0.090677628,    0.50094773,    0.22725427,    0.46825337,   0.022099206,     0.1223945}
+{    0.75782385,   0.029476088,             0,     4.5714975,   0.047379532,    0.89093642,    0.38371219,   0.033497503,     0.7462655,    0.17395551,   0.034817968,     2.5249515,    0.45748387,    0.58832706,    0.30065153,       1.31909,    0.50931353,    0.13938906,   0.032562889,     0.1476634}
+{     1.6233056,    0.01520821,     4.5714975,             0,   0.080508334,    0.71581478,     0.2985565,    0.13315829,     2.5398367,    0.43422139,    0.16761042,    0.77289201,    0.58630349,     2.7466124,    0.72951389,     1.1605084,    0.91754578,    0.58840137,   0.053858955,    0.15776981}
+{    0.33339162,    0.14612857,   0.047379532,   0.080508334,             0,    0.14331615,    0.22810028,    0.91752292,    0.10935563,     2.7052349,    0.49460836,    0.11366572,    0.12165424,   0.074983533,    0.12166853,    0.39476465,    0.24542923,    0.70690308,    0.36598595,     2.5685125}
+{     2.5043471,    0.14541118,    0.89093642,    0.71581478,    0.14331615,             0,    0.16614705,    0.14601996,    0.55231724,      0.248819,    0.13307541,     1.0347299,    0.35581666,    0.36772942,    0.44857216,     1.7515965,     0.3894685,    0.23602307,   0.068566989,    0.10737493}
+{    0.22491344,   0.047716794,    0.38371219,     0.2985565,    0.22810028,    0.16614705,             0,   0.057274443,    0.43821994,    0.29596702,   0.060469853,    0.82888029,    0.22548507,    0.90180596,    0.60925442,    0.47847125,    0.28900743,    0.19599755,   0.057188699,    0.81750772}
+{    0.63728715,    0.13261239,   0.033497503,    0.13315829,    0.91752292,    0.14601996,   0.057274443,             0,    0.26632516,     5.9732165,     1.4114825,    0.24930203,    0.15661798,    0.15606064,    0.23296771,    0.23313062,     1.0763445,     10.444905,   0.099903732,    0.24647817}
+{     1.1239527,   0.011624091,     0.7462655,     2.5398367,    0.10935563,    0.55231724,    0.43821994,    0.26632516,             0,    0.57507096,    0.27573704,     1.4378203,     0.6067907,     2.1099083,     5.0184462,     1.1434653,     1.2765807,    0.41325116,   0.066654887,    0.19632338}
+{     1.2136557,    0.26211796,    0.17395551,    0.43422139,     2.7052349,      0.248819,    0.29596702,     5.9732165,    0.57507096,             0,     3.1601608,    0.19791251,    0.48526793,    0.69604497,    0.54980493,    0.61443625,    0.69517895,     3.8229769,    0.23848107,    0.54259668}
+{    0.60464137,   0.067709544,   0.034817968,    0.16761042,    0.49460836,    0.13307541,   0.060469853,     1.4114825,    0.27573704,     3.1601608,             0,     0.1641149,   0.029618996,    0.34526723,    0.25131702,    0.25870534,    0.52763998,    0.87833484,   0.062933578,    0.20928223}
+{    0.56904884,     0.0785848,     2.5249515,    0.77289201,    0.11366572,     1.0347299,    0.82888029,    0.24930203,     1.4378203,    0.19791251,     0.1641149,             0,    0.23995874,    0.78799161,    0.60248918,     2.4209921,     1.3469541,     0.1424044,   0.029893378,    0.26657382}
+{     1.1408101,   0.031831203,    0.45748387,    0.58630349,    0.12165424,    0.35581666,    0.22548507,    0.15661798,     0.6067907,    0.48526793,   0.029618996,    0.23995874,             0,    0.44750035,    0.36721495,     1.2302358,    0.59204551,    0.36960151,   0.041683242,   0.091583661}
+{     0.8862662,   0.012332912,    0.58832706,     2.7466124,   0.074983533,    0.36772942,    0.90180596,    0.15606064,     2.1099083,    0.69604497,    0.34526723,    0.78799161,    0.44750035,             0,     1.4112481,     1.0232658,    0.71165618,    0.32018983,   0.060729945,    0.17876006}
+{    0.66625734,   0.090677628,    0.30065153,    0.72951389,    0.12166853,    0.44857216,    0.60925442,    0.23296771,     5.0184462,    0.54980493,    0.25131702,    0.60248918,    0.36721495,     1.4112481,             0,    0.83551405,    0.58337389,     0.3233881,    0.13266669,    0.27726901}
+{     5.1938222,    0.50094773,       1.31909,     1.1605084,    0.39476465,     1.7515965,    0.47847125,    0.23313062,     1.1434653,    0.61443625,    0.25870534,     2.4209921,     1.2302358,     1.0232658,    0.83551405,             0,     5.0525382,     0.3649856,    0.10270186,    0.34863413}
+{     2.5091031,    0.22725427,    0.50931353,    0.91754578,    0.24542923,     0.3894685,    0.28900743,     1.0763445,     1.2765807,    0.69517895,    0.52763998,     1.3469541,    0.59204551,    0.71165618,    0.58337389,     5.0525382,             0,     2.1160933,   0.058411986,    0.27042946}
+{     3.5183383,    0.46825337,    0.13938906,    0.58840137,    0.70690308,    0.23602307,    0.19599755,     10.444905,    0.41325116,     3.8229769,    0.87833484,     0.1424044,    0.36960151,    0.32018983,     0.3233881,     0.3649856,     2.1160933,             0,   0.063262265,    0.35936362}
+{   0.086627631,   0.022099206,   0.032562889,   0.053858955,    0.36598595,   0.068566989,   0.057188699,   0.099903732,   0.066654887,    0.23848107,   0.062933578,   0.029893378,   0.041683242,   0.060729945,    0.13266669,    0.10270186,   0.058411986,   0.063262265,             0,    0.35654263}
+{    0.24883329,     0.1223945,     0.1476634,    0.15776981,     2.5685125,    0.10737493,    0.81750772,    0.24647817,    0.19632338,    0.54259668,    0.20928223,    0.26657382,   0.091583661,    0.17876006,    0.27726901,    0.34863413,    0.27042946,    0.35936362,    0.35654263,             0}
+}
+
+{{      0.078837}
+{      0.015175}
+{      0.053066}
+{      0.061924}
+{      0.043296}
+{      0.070852}
+{      0.023082}
+{      0.062056}
+{      0.057324}
+{      0.096371}
+{      0.023771}
+{      0.042313}
+{      0.043911}
+{      0.036713}
+{      0.051238}
+{      0.063403}
+{      0.055897}
+{      0.073101}
+{      0.013272}
+{      0.034399}
+}
diff --git a/res/TemplateBatchFiles/TemplateModels/EmpiricalAA/WAG b/res/TemplateBatchFiles/TemplateModels/EmpiricalAA/WAG
new file mode 100644
index 0000000..499e467
--- /dev/null
+++ b/res/TemplateBatchFiles/TemplateModels/EmpiricalAA/WAG
@@ -0,0 +1,46 @@
+ACDEFGHIKLMNPQRSTVWY
+
+{{             0,     1.0778935,    0.77559021,     1.6612245,    0.22091657,     1.4868683,     0.3326492,    0.20290785,    0.95113883,    0.41761915,    0.93773799,    0.53509197,     1.5097789,    0.95358645,    0.57888169,     3.5376947,     2.2261372,     2.1053381,    0.11873463,    0.25265511}
+{     1.0778935,             0,   0.031794957,   0.022409254,    0.41772815,    0.32185884,    0.26129975,     0.1785591,   0.077699735,    0.40331655,    0.40981713,    0.27839019,    0.11482107,    0.10371096,    0.55434597,     1.4773619,     0.5383852,     1.0517623,    0.75257724,    0.57076257}
+{    0.77559021,   0.031794957,             0,     6.4798665,   0.049044345,    0.90844245,    0.97675797,   0.041389651,    0.50361636,   0.089003736,    0.10889127,     5.6982448,    0.44497904,    0.64732272,     0.1545978,     1.1248278,    0.39342696,    0.15987786,    0.13619238,    0.34183853}
+{     1.6612245,   0.022409254,     6.4798665,             0,   0.085151286,    0.59582679,    0.59825129,    0.13370313,     2.7123989,    0.16190137,    0.33072678,    0.99409945,    0.71614032,     5.7402938,    0.46090348,    0.73984364,    0.86350325,    0.61788185,    0.16430903,    0.20602304}
+{    0.22091657,    0.41772815,   0.049044345,   0.085151286,             0,   0.052403307,    0.71300894,      1.111929,   0.093234727,     2.2199042,      1.249584,    0.10092344,    0.16943781,    0.10486838,    0.10779661,    0.57296246,     0.1804148,    0.68207174,     1.6053816,     6.7738789}
+{     1.4868683,    0.32185884,    0.90844245,    0.59582679,   0.052403307,             0,    0.26175955,   0.031957835,    0.39205615,   0.064339199,    0.18272072,     1.1812916,    0.25563024,    0.34639356,    0.61361419,     1.4082602,    0.23701508,    0.19651859,    0.35367038,    0.10873405}
+{     0.3326492,    0.26129975,    0.97675797,    0.59825129,    0.71300894,    0.26175955,             0,    0.14503257,    0.93452073,    0.52419162,    0.42415275,     4.1521776,    0.73067082,     4.5067366,       2.24297,    0.77681898,    0.49674253,     0.1242185,    0.27556997,      4.065239}
+{    0.20290785,     0.1785591,   0.041389651,    0.13370313,      1.111929,   0.031957835,    0.14503257,             0,    0.33986656,     3.3279784,      4.468255,    0.58167944,    0.10487664,    0.11955777,    0.19623717,    0.33525868,     1.5303607,     8.2085642,    0.22300415,    0.44097564}
+{    0.95113883,   0.077699735,    0.50361636,     2.7123989,   0.093234727,    0.39205615,    0.93452073,    0.33986656,             0,    0.27030774,    0.98053676,     3.1611501,     0.5844706,     4.0877664,      5.616393,     1.0150182,     1.4556569,    0.32055773,    0.14431347,     0.1398625}
+{    0.41761915,    0.40331655,   0.089003736,    0.16190137,     2.2199042,   0.064339199,    0.52419162,     3.3279784,    0.27030774,             0,      5.094365,    0.13804048,    0.43643382,    0.91254165,    0.52231213,    0.36180931,    0.34279314,     1.8894846,    0.69825052,    0.41835575}
+{    0.93773799,    0.40981713,    0.10889127,    0.33072678,      1.249584,    0.18272072,    0.42415275,      4.468255,    0.98053676,      5.094365,             0,    0.20803598,    0.17981231,     1.6217751,    0.71698922,    0.51836158,     1.5911913,      2.160375,    0.54124242,    0.44964968}
+{    0.53509197,    0.27839019,     5.6982448,    0.99409945,    0.10092344,     1.1812916,     4.1521776,    0.58167944,     3.1611501,    0.13804048,    0.20803598,             0,    0.20474044,      1.620074,    0.66680464,     4.1710055,     2.1305774,    0.20596326,   0.075477713,     1.1397745}
+{     1.5097789,    0.11482107,    0.44497904,    0.71614032,    0.16943781,    0.25563024,    0.73067082,    0.10487664,     0.5844706,    0.43643382,    0.17981231,    0.20474044,             0,    0.97958876,    0.71313446,     1.6931625,    0.83476594,    0.33047904,    0.14630758,    0.22674363}
+{    0.95358645,    0.10371096,    0.64732272,     5.7402938,    0.10486838,    0.34639356,     4.5067366,    0.11955777,     4.0877664,    0.91254165,     1.6217751,      1.620074,    0.97958876,             0,     3.1858014,     1.0798159,    0.90040922,    0.31619891,    0.22641927,    0.23898507}
+{    0.57888169,    0.55434597,     0.1545978,    0.46090348,    0.10779661,    0.61361419,       2.24297,    0.19623717,      5.616393,    0.52231213,    0.71698922,    0.66680464,    0.71313446,     3.1858014,             0,     1.2848054,    0.58186442,    0.26431948,     1.2215503,      0.400423}
+{     3.5376947,     1.4773619,     1.1248278,    0.73984364,    0.57296246,     1.4082602,    0.77681898,    0.33525868,     1.0150182,    0.36180931,    0.51836158,     4.1710055,     1.6931625,     1.0798159,     1.2848054,             0,     4.5947982,    0.24426315,    0.54967533,    0.82595977}
+{     2.2261372,     0.5383852,    0.39342696,    0.86350325,     0.1804148,    0.23701508,    0.49674253,     1.5303607,     1.4556569,    0.34279314,     1.5911913,     2.1305774,    0.83476594,    0.90040922,    0.58186442,     4.5947982,             0,     1.4569683,     0.1163534,    0.30556412}
+{     2.1053381,     1.0517623,    0.15987786,    0.61788185,    0.68207174,    0.19651859,     0.1242185,     8.2085642,    0.32055773,     1.8894846,      2.160375,    0.20596326,    0.33047904,    0.31619891,    0.26431948,    0.24426315,     1.4569683,             0,    0.38346139,    0.33031388}
+{    0.11873463,    0.75257724,    0.13619238,    0.16430903,     1.6053816,    0.35367038,    0.27556997,    0.22300415,    0.14431347,    0.69825052,    0.54124242,   0.075477713,    0.14630758,    0.22641927,     1.2215503,    0.54967533,     0.1163534,    0.38346139,             0,     2.6084557}
+{    0.25265511,    0.57076257,    0.34183853,    0.20602304,     6.7738789,    0.10873405,      4.065239,    0.44097564,     0.1398625,    0.41835575,    0.44964968,     1.1397745,    0.22674363,    0.23898507,      0.400423,    0.82595977,    0.30556412,    0.33031388,     2.6084557,             0}
+}
+
+
+{{     0.0866279}
+{     0.0193078}
+{     0.0570451}
+{     0.0580589}
+{     0.0384319}
+{     0.0832518}
+{     0.0244313}
+{      0.048466}
+{     0.0620286}
+{      0.086209}
+{     0.0195027}
+{     0.0390894}
+{     0.0457631}
+{     0.0367281}
+{      0.043972}
+{     0.0695179}
+{     0.0610127}
+{     0.0708956}
+{     0.0143859}
+{     0.0352742}
+}
diff --git a/res/TemplateBatchFiles/TemplateModels/EmpiricalAA/cpREV b/res/TemplateBatchFiles/TemplateModels/EmpiricalAA/cpREV
new file mode 100644
index 0000000..5876ad7
--- /dev/null
+++ b/res/TemplateBatchFiles/TemplateModels/EmpiricalAA/cpREV
@@ -0,0 +1,44 @@
+ACDEFGHIKLMNPQRSTVWY
+{{             0,     1.2816975,    0.33527215,    0.95600458,    0.13027718,     1.2740342,     0.1264455,    0.27779692,    0.45213844,    0.37742065,    0.35443056,    0.43489587,    0.93876201,    0.30078701,    0.20116329,     4.6746517,     2.5672267,     1.8545339,   0.026821772,    0.10728709}
+{     1.2816975,             0,   0.019158408,   0.019158408,     1.3909005,    0.58049978,    0.84488581,    0.53643544,   0.091960361,    0.75867297,    0.30461869,     1.0307224,    0.54601464,   0.019158408,      1.576737,      4.465825,     1.1035243,     1.1341778,    0.83339077,     2.8086227}
+{    0.33527215,   0.019158408,             0,     7.0713686,   0.042148499,     0.8257274,    0.63414332,   0.019158408,    0.78932643,   0.019158408,    0.09004452,     8.4967541,    0.32569294,    0.76633634,   0.082381156,     1.1303461,    0.50961366,    0.14368806,   0.034485135,    0.53835128}
+{    0.95600458,   0.019158408,     7.0713686,             0,    0.27779692,    0.72610368,    0.31036622,    0.28354444,     5.0367456,    0.15709895,    0.21649002,     2.0212121,    0.35443056,     5.9812551,    0.29120781,     1.0881976,    0.70694527,    0.38316817,    0.12069797,     0.2720494}
+{    0.13027718,     1.3909005,   0.042148499,    0.27779692,             0,   0.047896021,    0.24331179,    0.86979174,    0.13794054,     2.4292862,    0.62647996,    0.18583656,   0.082381156,   0.019158408,    0.10153956,    0.93301449,    0.28354444,    0.60732155,    0.89661351,     4.5405428}
+{     1.2740342,    0.58049978,     0.8257274,    0.72610368,   0.047896021,             0,   0.036400976,   0.076633634,    0.50386614,   0.038316817,   0.040232658,     1.2510441,   0.053643544,    0.25480683,    0.46554933,      1.323846,    0.17625736,    0.17434152,    0.15709895,   0.019158408}
+{     0.1264455,    0.84488581,    0.63414332,    0.31036622,    0.24331179,   0.036400976,             0,   0.055559384,    0.58433146,     0.1264455,   0.019158408,     2.6917564,    0.29120781,      2.431202,     1.3698262,    0.58049978,   0.061306907,   0.047896021,    0.13219302,     3.7761223}
+{    0.27779692,    0.53643544,   0.019158408,    0.28354444,    0.86979174,   0.076633634,   0.055559384,             0,    0.66096509,     3.3431423,       3.39487,    0.32186126,    0.22415338,    0.17625736,    0.26055435,    0.41382162,     1.9924745,     9.1902885,   0.080465315,    0.17050984}
+{    0.45213844,   0.091960361,    0.78932643,     5.0367456,    0.13794054,    0.50386614,    0.58433146,    0.66096509,             0,     0.4176533,    0.36975728,     4.6554933,    0.57858393,     6.3471807,     8.5867987,     1.6629499,     1.7587419,    0.47704437,   0.019158408,    0.47321269}
+{    0.37742065,    0.75867297,   0.019158408,    0.15709895,     2.4292862,   0.038316817,     0.1264455,     3.3431423,     0.4176533,             0,      2.588301,    0.21649002,    0.41956914,    0.54793048,    0.38891569,    0.98857388,    0.29887117,     1.6572023,    0.30461869,    0.36209392}
+{    0.35443056,    0.30461869,    0.09004452,    0.21649002,    0.62647996,   0.040232658,   0.019158408,       3.39487,    0.36975728,      2.588301,             0,    0.11686629,    0.19158408,    0.38699985,    0.23948011,     0.1781732,     1.2357173,     0.9100244,    0.16476231,    0.41190578}
+{    0.43489587,     1.0307224,     8.4967541,     2.0212121,    0.18583656,     1.2510441,     2.6917564,    0.32186126,     4.6554933,    0.21649002,    0.11686629,             0,    0.33144047,     1.4713658,    0.68395518,     3.9945282,     2.6687663,    0.15901479,   0.076633634,      1.444544}
+{    0.93876201,    0.54601464,    0.32569294,    0.35443056,   0.082381156,   0.053643544,    0.29120781,    0.22415338,    0.57858393,    0.41956914,    0.19158408,    0.33144047,             0,    0.61881659,    0.16667815,     2.3028407,    0.49811862,    0.23373258,   0.093876201,    0.18583656}
+{    0.30078701,   0.019158408,    0.76633634,     5.9812551,   0.019158408,    0.25480683,      2.431202,    0.17625736,     6.3471807,    0.54793048,    0.38699985,     1.4713658,    0.61881659,             0,     3.3431423,    0.75867297,    0.46171764,    0.10345541,    0.10153956,    0.74909377}
+{    0.20116329,      1.576737,   0.082381156,    0.29120781,    0.10153956,    0.46554933,     1.3698262,    0.26055435,     8.5867987,    0.38891569,    0.23948011,    0.68395518,    0.16667815,     3.3431423,             0,    0.73759872,    0.60157402,    0.17625736,    0.44064339,    0.61881659}
+{     4.6746517,      4.465825,     1.1303461,     1.0881976,    0.93301449,      1.323846,    0.58049978,    0.41382162,     1.6629499,    0.98857388,     0.1781732,     3.9945282,     2.3028407,    0.75867297,    0.73759872,             0,     4.1209737,    0.31994542,    0.13985638,     1.0000689}
+{     2.5672267,     1.1035243,    0.50961366,    0.70694527,    0.28354444,    0.17625736,   0.061306907,     1.9924745,     1.7587419,    0.29887117,     1.2357173,     2.6687663,    0.49811862,    0.46171764,    0.60157402,     4.1209737,             0,      1.456039,   0.055559384,     0.1360247}
+{     1.8545339,     1.1341778,    0.14368806,    0.38316817,    0.60732155,    0.17434152,   0.047896021,     9.1902885,    0.47704437,     1.6572023,     0.9100244,    0.15901479,    0.23373258,    0.10345541,    0.17625736,    0.31994542,      1.456039,             0,   0.019158408,    0.22798506}
+{   0.026821772,    0.83339077,   0.034485135,    0.12069797,    0.89661351,    0.15709895,    0.13219302,   0.080465315,   0.019158408,    0.30461869,    0.16476231,   0.076633634,   0.093876201,    0.10153956,    0.44064339,    0.13985638,   0.055559384,   0.019158408,             0,    0.66288093}
+{    0.10728709,     2.8086227,    0.53835128,     0.2720494,     4.5405428,   0.019158408,     3.7761223,    0.17050984,    0.47321269,    0.36209392,    0.41190578,      1.444544,    0.18583656,    0.74909377,    0.61881659,     1.0000689,     0.1360247,    0.22798506,    0.66288093,             0}
+}
+
+{{         0.076}
+{         0.009}
+{         0.037}
+{         0.049}
+{         0.051}
+{         0.084}
+{         0.025}
+{         0.081}
+{          0.05}
+{         0.101}
+{         0.022}
+{         0.041}
+{         0.043}
+{         0.038}
+{         0.062}
+{         0.062}
+{         0.054}
+{         0.066}
+{         0.018}
+{         0.031}
+}
diff --git a/res/TemplateBatchFiles/TemplateModels/EmpiricalAA/modellist.ibf b/res/TemplateBatchFiles/TemplateModels/EmpiricalAA/modellist.ibf
new file mode 100644
index 0000000..179568c
--- /dev/null
+++ b/res/TemplateBatchFiles/TemplateModels/EmpiricalAA/modellist.ibf
@@ -0,0 +1,168 @@
+modelList = {};
+
+index = 0;
+/* Dayhoff */
+modelList [index] = {};
+(modelList [index])["Name"] 	       = "Dayhoff";
+(modelList [index])["Description"]     = "PAM-based. Derived from pairwise comparisons and phylogenetic comparisons of 71 groups of closely related proteins (1572 total point accepted mutations).";
+(modelList [index])["Reference"]       = "Dayhoff MO, Schwartz RM , Orcutt BC (1978) A model of evolutionary change in proteins.  Pp. 345-352 in M. O. Dayhoff, ed. Atlas of protein sequence and structure. Vol. 5, suppl. 3.";
+(modelList [index])["URL"]		       = "http://www-math.mit.edu/~lippert/18.417/papers/dayhoffetal1978.pdf";
+(modelList [index])["File"]            = "Dayhoff";
+(modelList [index])["GeneticCode"] 	   =  0;
+(modelList [index])["HasFrequencies"]  =  1;
+
+index = 1;
+/* JTT */
+modelList [index] = {};
+(modelList [index])["Name"] 	   		= "JTT (Jones,Taylor,Thornton)";
+(modelList [index])["Description"] 		= "PAM-based. Derived from pairwise comparisons of SWISSPROT sequences at 85% or greater (approximate) similarity.";
+(modelList [index])["Reference"]   		= "Jones DT, Taylor WR, and Thornton JM (1992) The rapid generation of mutation data matrices from protein sequences. Comput. Appl. Biosci. 8: 275-282.";
+(modelList [index])["URL"]		   		= "http://bioinformatics.oxfordjournals.org/cgi/content/abstract/8/3/275";
+(modelList [index])["File"]        		= "JTT";
+(modelList [index])["GeneticCode"] 		=  0;
+(modelList [index])["HasFrequencies"] 	=  1;
+
+index = 2;
+/* WAG */
+modelList [index] = {};
+(modelList [index])["Name"] 	   		= "WAG (Whelan and Goldman)";
+(modelList [index])["Description"] 		= "ML-based. Inferred from globular protein sequences comprising 3,905 amino acid sequences split into 182 protein families.";
+(modelList [index])["Reference"]   		= "Whelan, S. and Goldman N  (2001)  A general empirical model of protein evolution derived from multiple protein families using a maximum likelihood approach.  Mol. Bio. Evol. 18:691-699.";
+(modelList [index])["URL"]		   		= "http://mbe.oxfordjournals.org/cgi/content/full/18/5/691";
+(modelList [index])["File"]        		= "WAG";
+(modelList [index])["GeneticCode"] 		=  0;
+(modelList [index])["HasFrequencies"] 	=  1;
+
+index = 3;
+/* rtREV */
+modelList [index] = {};
+(modelList [index])["Name"] 	   		= "rtREV (reverse transcriptase)";
+(modelList [index])["Description"] 		= "ML-based. Inferred from 33 amino acid sequences from the retroviral Pol proteins.";
+(modelList [index])["Reference"]   		= "Dimmic MW, Rest JS, Mindell DP, Goldstein RA (2002) rtREV: an amino acid substitution matrix for inference of retrovirus and reverse transcriptase phylogeny. J Mol Evol. 55(1):65-73";
+(modelList [index])["URL"]		   		= "http://www.springerlink.com/content/rbg67l8yc12yh7hv/";
+(modelList [index])["File"]        		= "rtREV";
+(modelList [index])["GeneticCode"] 		=  0;
+(modelList [index])["HasFrequencies"] 	=  1;
+
+index = 4;
+/* HIVBetween */
+modelList [index] = {};
+(modelList [index])["Name"] 	   		= "HIV (between hosts)";
+(modelList [index])["Description"] 		= "ML-based. Inferred from 1025 sequences representing 8 HIV genes.";
+(modelList [index])["Reference"]   		= "Nickle DC, Heath L, Jensen MA, Gilbert PB, Mullins JI, Kosakovsky Pond SL (2007) HIV-specific probabilistic models of protein evolution. PLoS ONE 2(6): e503";
+(modelList [index])["URL"]		   		= "http://www.pubmedcentral.nih.gov/articlerender.fcgi?artid=1876811";
+(modelList [index])["File"]        		= "HIVBetween";
+(modelList [index])["GeneticCode"] 		=  0;
+(modelList [index])["HasFrequencies"] 	=  1;
+
+index = 5;
+/* HIVWithin */
+modelList [index] = {};
+(modelList [index])["Name"] 	   		= "HIV (within host)";
+(modelList [index])["Description"] 		= "ML-based. Inferred jointly from 48 patient clonal sequence alignments (encompassing portions of the env gene from 32 patients, from the pro gene from 8, and from the pol gene from 7 patients).";
+(modelList [index])["Reference"]   		= "Nickle DC, Heath L, Jensen MA, Gilbert PB, Mullins JI, Kosakovsky Pond SL (2007) HIV-specific probabilistic models of protein evolution. PLoS ONE 2(6): e503";
+(modelList [index])["URL"]		   		= "http://www.pubmedcentral.nih.gov/articlerender.fcgi?artid=1876811";
+(modelList [index])["File"]        		= "HIVWithin";
+(modelList [index])["GeneticCode"] 		=  0;
+(modelList [index])["HasFrequencies"] 	=  1;
+
+index = 6;
+/* IAV */
+modelList [index] = {};
+(modelList [index])["Name"] 	   		= "IAV (Influenza A virus)";
+(modelList [index])["Description"] 		= "ML-based. Inferred jointly from 1035 sequences representing 8 genomic segments of H5N1 IAV sequences.";
+(modelList [index])["Reference"]   		= "Kosakovsky Pond SL, Poon AFY, Leigh Brown AJ, Frost SDW (2008)  A maximum likelihood method for detecting directional evolution in protein sequences and its application to Influenza A virus. Mol. Biol. Evol. (in press)";
+(modelList [index])["URL"]		   		= "";
+(modelList [index])["File"]        		= "IAV";
+(modelList [index])["GeneticCode"] 		=  0;
+(modelList [index])["HasFrequencies"] 	=  1;
+
+index = 7;
+/* mtMAM */
+modelList [index] = {};
+(modelList [index])["Name"] 	   		= "mtMAM (mammalian mitochondrial)";
+(modelList [index])["Description"] 		= "ML-based. Inferred from 12 mtDNA proteins from 20 mammalian species.";
+(modelList [index])["Reference"]   		= "Cao Y, Janke A, Waddell PJ, Westerman M, Takenaka O, Murata S, Okada N, Paabo S, and Hasegawa M (1998) Conflict among individual mitochondrial proteins in resolving the phylogeny of eutherian orders. J Mol Evol 47: 307-322.";
+(modelList [index])["URL"]		   		= "http://www.springerlink.com/content/vry44fkm8ev5l73v/";
+(modelList [index])["File"]        		= "mtMAM";
+(modelList [index])["GeneticCode"] 		=  1;
+(modelList [index])["HasFrequencies"] 	=  1;
+
+index = 8;
+/* mtREV24 */
+modelList [index] = {};
+(modelList [index])["Name"] 	   		= "mtREV24 (vertebrate mitochondrial)";
+(modelList [index])["Description"] 		= "ML-based. Inferred from complete mtDNA data from 20 vertebrate species.";
+(modelList [index])["Reference"]   		= "Adachi, J, and Hasegawa, M (1996) Model of amino acid substitution in proteins encoded by mitochondrial DNA. J. Mol. Evol. 42: 459-468.";
+(modelList [index])["URL"]		   		= "http://www.springerlink.com/content/jd1aj3krrn1bhjpb/fulltext.pdf";
+(modelList [index])["File"]        		= "mtREV24";
+(modelList [index])["GeneticCode"] 		=  1;
+(modelList [index])["HasFrequencies"] 	=  1;
+
+index = 9;
+/* cpREV */
+modelList [index] = {};
+(modelList [index])["Name"] 	   		= "cpREV (chloroplast)";
+(modelList [index])["Description"] 		= "ML-based. Inferred from 9,957 amino acid sites of 45 proteins encoded in the plastid genomes of Cyanophora, a diatom, a rhodophyte (red algae), a euglenophyte, and five land plants.";
+(modelList [index])["Reference"]   		= "Adachi J, Waddell P, Martin W and Hasegawa M (2000) Plastid genome phylogeny and a model of amino acid substitution for proteins encoded by chloroplast DNA. J. Mol. Evol. 50:348-358.";
+(modelList [index])["URL"]		   		= "http://www.springerlink.com/content/ledt3at2br74db2a/";
+(modelList [index])["File"]        		= "cpREV";
+(modelList [index])["GeneticCode"] 		=  0;
+(modelList [index])["HasFrequencies"] 	=  1;
+
+index = 10;
+/* VT */
+modelList [index] = {};
+(modelList [index])["Name"] 	   		= "VT (Vingron and Muller)";
+(modelList [index])["Description"] 		= "Rate matrix resolvent method. Inferred from SYSTERS (1998) database of aligned protein families (~2.7 million pairs of aligned residues).";
+(modelList [index])["Reference"]   		= "Muller, T and Vingron, M (2000) Modeling Amino Acid Replacement. J. Comp. Biol. 7(6): 761-776.";
+(modelList [index])["URL"]		   		= "http://www.liebertonline.com/doi/pdfplus/10.1089/10665270050514918";
+(modelList [index])["File"]        		= "VT";
+(modelList [index])["GeneticCode"] 		=  0;
+(modelList [index])["HasFrequencies"] 	=  1;
+
+index = 11;
+/* MtArt */
+modelList [index] = {};
+(modelList [index])["Name"] 	   		= "MtArt (arthropoda mitochondrial)";
+(modelList [index])["Description"] 		= "ML based. This model has been derived from 36 arthropoda mitochondrial genomes.";
+(modelList [index])["Reference"]   		= "Abascal F, Posada D, Zardoya R. (2007) MtArt: A new model of amino acid replacement for Arthropoda. Mol. Biol. Evol 24:1-5";
+(modelList [index])["URL"]		   		= "http://darwin.uvigo.es/download/papers/50.mtArt07.pdf";
+(modelList [index])["File"]        		= "MtArt";
+(modelList [index])["GeneticCode"] 		=  1;
+(modelList [index])["HasFrequencies"] 	=  1;
+
+index = 12;
+/* BLOSUM 62 */
+modelList [index] = {};
+(modelList [index])["Name"] 	   		= "BLOSUM62";
+(modelList [index])["Description"] 		= "PAM based. Inferred from  504 nonredundant groups of proteins catalogued in Prosite 8.0 keyed to Swiss-Prot 20";
+(modelList [index])["Reference"]   		= "Henikoff S and Henikoff JG (1992) Amino Acid Substitution Matrices from Protein Blocks. PNAS USA 89:10915-1091";
+(modelList [index])["URL"]		   		= "http://www.pnas.org/cgi/reprint/89/22/10915";
+(modelList [index])["File"]        		= "BLOSUM62";
+(modelList [index])["GeneticCode"] 		=  0;
+(modelList [index])["HasFrequencies"] 	=  1;
+
+index = 13;
+/* LG */
+modelList [index] = {};
+(modelList [index])["Name"] 	   		= "LG (Le and Gascuel)";
+(modelList [index])["Description"] 		= "ML-Based. Inferred from 3912 alignments from Pfam, comprising 50,000 sequences and 6.5 million residues overall";
+(modelList [index])["Reference"]   		= "Le SQ and Gascuel O (2008) An Improved General Amino-Acid Replacement Matrix. Mol Bio Evol doi:10.1093/molbev/msn067 ";
+(modelList [index])["URL"]		   		= "http://mbe.oxfordjournals.org/cgi/content/abstract/msn067";
+(modelList [index])["File"]        		= "LG";
+(modelList [index])["GeneticCode"] 		=  0;
+(modelList [index])["HasFrequencies"] 	=  1;
+
+/*----------------------------------------*/
+function	generateSelectionList		()
+{
+	availableModels = Abs (modelList);
+	matrixWithChoices = {availableModels,2};
+	for (_k = 0; _k < availableModels; _k = _k+1)
+	{
+		matrixWithChoices[_k][0] = (modelList[_k])["Name"];
+		matrixWithChoices[_k][1] = (modelList[_k])["Description"];
+	}
+	return matrixWithChoices;
+}
diff --git a/res/TemplateBatchFiles/TemplateModels/EmpiricalAA/mtMAM b/res/TemplateBatchFiles/TemplateModels/EmpiricalAA/mtMAM
new file mode 100644
index 0000000..27b3762
--- /dev/null
+++ b/res/TemplateBatchFiles/TemplateModels/EmpiricalAA/mtMAM
@@ -0,0 +1,46 @@
+ACDEFGHIKLMNPQRSTVWY
+
+{{             0,             0,   0.092947176,             0,             0,    0.65907998,   0.067597946,    0.63373075,             0,    0.17744461,    0.64218049,   0.016899487,    0.44783639,             0,    0.27039178,     2.8898122,     5.7542752,     3.3629978,   0.042248716,             0}
+{             0,             0,             0,             0,   0.059148203,             0,     2.5771717,    0.34643947,             0,    0.22814307,             0,             0,             0,             0,     1.5716523,     2.9320609,    0.96327073,             0,    0.54923331,     4.4783639}
+{   0.092947176,             0,             0,     4.8079039,   0.042248716,    0.66752972,   0.092947176,             0,             0,             0,             0,     7.3005782,   0.016899487,    0.41403742,             0,    0.13519589,             0,   0.084497433,             0,             0}
+{             0,             0,     4.8079039,             0,             0,    0.18589435,    0.18589435,             0,     1.8166948,             0,             0,             0,             0,     2.3152297,             0,    0.17744461,   0.033798973,    0.16899487,             0,             0}
+{             0,   0.059148203,   0.042248716,             0,             0,             0,             0,    0.48163537,             0,     2.0786368,   0.092947176,    0.05069846,    0.14364564,             0,             0,     0.7604769,   0.067597946,    0.05069846,             0,     5.7627249}
+{    0.65907998,             0,    0.66752972,    0.18589435,             0,             0,             0,             0,             0,             0,             0,    0.39713793,             0,             0,    0.15209538,    0.94637125,             0,   0.042248716,             0,  0.0084497433}
+{   0.067597946,     2.5771717,   0.092947176,    0.18589435,             0,             0,             0,             0,             0,    0.21969333,             0,     3.8699824,    0.44783639,     4.6473588,     1.9603404,    0.16899487,  0.0084497433,             0,             0,     12.885859}
+{    0.63373075,    0.34643947,             0,             0,    0.48163537,             0,             0,             0,    0.05069846,     1.9603404,      3.194003,    0.16054512,   0.042248716,             0,             0,             0,     3.0419076,      18.75843,             0,    0.13519589}
+{             0,             0,             0,     1.8166948,             0,             0,             0,    0.05069846,             0,   0.033798973,    0.49853485,     3.4474953,    0.15209538,     2.0448379,    0.42248716,    0.54923331,    0.42248716,             0,             0,     0.5661328}
+{    0.17744461,    0.22814307,             0,             0,     2.0786368,             0,    0.21969333,     1.9603404,   0.033798973,             0,     5.1458937,             0,    0.36333896,    0.16899487,    0.05069846,      0.625281,    0.28729127,    0.84497433,    0.10139692,    0.21124358}
+{    0.64218049,             0,             0,             0,   0.092947176,             0,             0,      3.194003,    0.49853485,     5.1458937,             0,    0.17744461,             0,    0.18589435,             0,    0.39713793,     5.8387726,     7.0301864,    0.10984666,             0}
+{   0.016899487,             0,     7.3005782,             0,    0.05069846,    0.39713793,     3.8699824,    0.16054512,     3.4474953,             0,    0.17744461,             0,    0.27884153,   0.067597946,   0.033798973,     3.7685855,    0.92947176,             0,    0.05069846,       1.31816}
+{    0.44783639,             0,   0.016899487,             0,    0.14364564,             0,    0.44783639,   0.042248716,    0.15209538,    0.36333896,             0,    0.27884153,             0,    0.43093691,    0.07604769,     1.7068481,    0.65907998,             0,   0.059148203,   0.067597946}
+{             0,             0,    0.41403742,     2.3152297,             0,             0,     4.6473588,             0,     2.0448379,    0.16899487,    0.18589435,   0.067597946,    0.43093691,             0,     2.0786368,     0.2534923,             0,    0.27884153,             0,    0.45628614}
+{    0.27039178,     1.5716523,             0,             0,             0,    0.15209538,     1.9603404,             0,    0.42248716,    0.05069846,             0,   0.033798973,    0.07604769,     2.0786368,             0,    0.02534923,             0,             0,    0.13519589,             0}
+{     2.8898122,     2.9320609,    0.13519589,    0.17744461,     0.7604769,    0.94637125,    0.16899487,             0,    0.54923331,      0.625281,    0.39713793,     3.7685855,     1.7068481,     0.2534923,    0.02534923,             0,     5.1881424,             0,    0.14364564,    0.90412253}
+{     5.7542752,    0.96327073,             0,   0.033798973,   0.067597946,             0,  0.0084497433,     3.0419076,    0.42248716,    0.28729127,     5.8387726,    0.92947176,    0.65907998,             0,             0,     5.1881424,             0,     2.0025892,             0,             0}
+{     3.3629978,             0,   0.084497433,    0.16899487,    0.05069846,   0.042248716,             0,      18.75843,             0,    0.84497433,     7.0301864,             0,             0,    0.27884153,             0,             0,     2.0025892,             0,             0,             0}
+{   0.042248716,    0.54923331,             0,             0,             0,             0,             0,             0,             0,    0.10139692,    0.10984666,    0.05069846,   0.059148203,             0,    0.13519589,    0.14364564,             0,             0,             0,    0.11829641}
+{             0,     4.4783639,             0,             0,     5.7627249,  0.0084497433,     12.885859,    0.13519589,     0.5661328,    0.21124358,             0,       1.31816,   0.067597946,    0.45628614,             0,    0.90412253,             0,             0,    0.11829641,             0}
+}
+
+
+{{        0.0692}
+{        0.0065}
+{        0.0186}
+{        0.0236}
+{        0.0611}
+{        0.0557}
+{        0.0277}
+{        0.0905}
+{        0.0221}
+{        0.1675}
+{        0.0561}
+{          0.04}
+{        0.0536}
+{        0.0238}
+{        0.0184}
+{        0.0725}
+{         0.087}
+{        0.0428}
+{        0.0293}
+{         0.034}
+}
diff --git a/res/TemplateBatchFiles/TemplateModels/EmpiricalAA/mtREV24 b/res/TemplateBatchFiles/TemplateModels/EmpiricalAA/mtREV24
new file mode 100644
index 0000000..83a838a
--- /dev/null
+++ b/res/TemplateBatchFiles/TemplateModels/EmpiricalAA/mtREV24
@@ -0,0 +1,46 @@
+ACDEFGHIKLMNPQRSTVWY
+
+{{             0,    0.51439477,    0.15166623,   0.083858541,   0.054675349,     1.0360858,    0.11930734,    0.82819872,   0.071756065,    0.21852983,     1.2177934,    0.23131872,    0.46615675,   0.016308197,       0.19896,     3.3291063,     4.1261531,     1.6742484,   0.016308197,   0.055619594}
+{    0.51439477,             0,   0.016308197,   0.016308197,    0.60769559,    0.26359264,     1.2144453,    0.53842816,   0.016308197,    0.22016065,    0.05304453,     0.5058982,    0.26831224,    0.64580459,    0.88690823,      2.377996,     1.5447303,   0.016308197,    0.28839741,     2.1867498}
+{    0.15166623,   0.016308197,             0,      5.008769,   0.042744599,    0.48727098,    0.97840536,   0.037251346,   0.019827342,   0.016308197,   0.016308197,     6.8183755,    0.11527318,    0.47448209,   0.016308197,    0.59241644,    0.24041707,   0.016308197,    0.17046306,    0.18205166}
+{   0.083858541,   0.016308197,      5.008769,             0,   0.022917256,    0.24273446,    0.42160928,   0.028410672,     2.6939347,   0.016308197,   0.016308197,    0.54117446,    0.11012322,     2.6913743,   0.016308197,    0.46958963,    0.12720393,    0.18144989,   0.016308197,    0.11261234}
+{   0.054675349,    0.60769559,   0.042744599,   0.022917256,             0,   0.016308197,    0.41337038,    0.72674543,   0.055276143,     1.8545029,     0.7795318,    0.13046557,    0.14857631,    0.16402621,   0.040255479,    0.55181719,    0.29054357,   0.054503787,   0.067292838,     3.9961931}
+{     1.0360858,    0.26359264,    0.48727098,    0.24273446,   0.016308197,             0,   0.016308197,   0.051327929,    0.19509822,   0.020685643,   0.016308197,    0.45748732,   0.016308197,   0.057936989,    0.19767328,     1.0808893,   0.095875073,   0.021715668,    0.09372924,   0.027552209}
+{    0.11930734,     1.2144453,    0.97840536,    0.42160928,    0.41337038,   0.016308197,             0,    0.10523076,     1.0958244,   0.098621699,    0.10274164,     4.2584126,    0.52332188,     4.9988863,      1.418213,    0.66485908,     0.3843581,   0.016308197,   0.060769559,     5.7519825}
+{    0.82819872,    0.53842816,   0.037251346,   0.028410672,    0.72674543,   0.051327929,    0.10523076,             0,    0.16797443,     2.8246612,     4.4459569,    0.23260707,    0.17707277,    0.07158434,   0.016308197,    0.40942217,     3.1623387,      10.49682,   0.016308197,    0.21466805}
+{   0.071756065,   0.016308197,   0.019827342,     2.6939347,   0.055276143,    0.19509822,     1.0958244,    0.16797443,             0,    0.12771895,    0.78425302,     5.2246243,    0.43002105,     3.9961931,     1.2136739,    0.90802245,     1.1701555,   0.016308197,    0.20599862,    0.43920583}
+{    0.21852983,    0.22016065,   0.016308197,   0.016308197,     1.8545029,   0.020685643,   0.098621699,     2.8246612,    0.12771895,             0,     4.6137682,    0.13012229,    0.34418938,    0.34075488,    0.13372721,    0.63181378,      1.084924,    0.78682809,    0.27844126,     0.3789503}
+{     1.2177934,    0.05304453,   0.016308197,   0.016308197,     0.7795318,   0.016308197,    0.10274164,     4.4459569,    0.78425302,     4.6137682,             0,    0.56143087,    0.16170865,    0.40658944,   0.016308197,    0.95411594,     4.5334177,     3.3263503,    0.18634235,    0.34298747}
+{    0.23131872,     0.5058982,     6.8183755,    0.54117446,    0.13046557,    0.45748732,     4.2584126,    0.23260707,     5.2246243,    0.13012229,    0.56143087,             0,    0.62923872,     1.4897114,    0.11364236,     4.2434743,     2.0467602,   0.016308197,   0.091669189,     1.6424963}
+{    0.46615675,    0.26831224,    0.11527318,    0.11012322,    0.14857631,   0.016308197,    0.52332188,    0.17707277,    0.43002105,    0.34418938,    0.16170865,    0.62923872,             0,      1.178396,    0.20290821,     1.4582969,     1.1005456,   0.070640258,   0.036135539,    0.13913468}
+{   0.016308197,    0.64580459,    0.47448209,     2.6913743,    0.16402621,   0.057936989,     4.9988863,    0.07158434,     3.9961931,    0.34075488,    0.40658944,     1.4897114,      1.178396,             0,     1.8968227,     0.4644395,    0.81480969,    0.16308197,   0.016308197,    0.33320255}
+{       0.19896,    0.88690823,   0.016308197,   0.016308197,   0.040255479,    0.19767328,      1.418213,   0.016308197,     1.2136739,    0.13372721,   0.016308197,    0.11364236,    0.20290821,     1.8968227,             0,   0.051842942,   0.017853235,   0.065576074,    0.18840207,   0.016308197}
+{     3.3291063,      2.377996,    0.59241644,    0.46958963,    0.55181719,     1.0808893,    0.66485908,    0.40942217,    0.90802245,    0.63181378,    0.95411594,     4.2434743,     1.4582969,     0.4644395,   0.051842942,             0,     5.1260087,   0.016308197,    0.33114283,    0.55722499}
+{     4.1261531,     1.5447303,    0.24041707,    0.12720393,    0.29054357,   0.095875073,     0.3843581,     3.1623387,     1.1701555,      1.084924,     4.5334177,     2.0467602,     1.1005456,    0.81480969,   0.017853235,     5.1260087,             0,     1.7556263,   0.085746704,    0.33242954}
+{     1.6742484,   0.016308197,   0.016308197,    0.18144989,   0.054503787,   0.021715668,   0.016308197,      10.49682,   0.016308197,    0.78682809,     3.3263503,   0.016308197,   0.070640258,    0.16308197,   0.065576074,   0.016308197,     1.7556263,             0,   0.046092182,   0.016308197}
+{   0.016308197,    0.28839741,    0.17046306,   0.016308197,   0.067292838,    0.09372924,   0.060769559,   0.016308197,    0.20599862,    0.27844126,    0.18634235,   0.091669189,   0.036135539,   0.016308197,    0.18840207,    0.33114283,   0.085746704,   0.046092182,             0,    0.22531078}
+{   0.055619594,     2.1867498,    0.18205166,    0.11261234,     3.9961931,   0.027552209,     5.7519825,    0.21466805,    0.43920583,     0.3789503,    0.34298747,     1.6424963,    0.13913468,    0.33320255,   0.016308197,    0.55722499,    0.33242954,   0.016308197,    0.22531078,             0}
+}
+
+
+{{         0.072}
+{         0.006}
+{         0.019}
+{         0.024}
+{         0.061}
+{         0.056}
+{         0.028}
+{         0.088}
+{         0.023}
+{         0.169}
+{         0.054}
+{         0.039}
+{         0.054}
+{         0.025}
+{         0.019}
+{         0.072}
+{         0.086}
+{         0.043}
+{         0.029}
+{         0.033}
+}
diff --git a/res/TemplateBatchFiles/TemplateModels/EmpiricalAA/rtREV b/res/TemplateBatchFiles/TemplateModels/EmpiricalAA/rtREV
new file mode 100644
index 0000000..73b0358
--- /dev/null
+++ b/res/TemplateBatchFiles/TemplateModels/EmpiricalAA/rtREV
@@ -0,0 +1,46 @@
+ACDEFGHIKLMNPQRSTVWY
+
+{{             0,     4.7941598,    0.10920665,    0.88457052,   0.010920665,     1.4742885,    0.32761931,   0.010920665,    0.41498424,    0.49142864,     2.5663485,     0.5569525,      1.059303,    0.34946038,    0.37130145,     5.0234917,     2.8175228,      2.151363,   0.054603196,    0.60063464}
+{     4.7941598,             0,   0.010920665,   0.010920665,    0.76444397,    0.52419025,     1.3541555,     1.1357448,    0.17472987,     1.2012719,     1.7036204,     1.3978402,   0.010920665,    0.76444397,     1.0046971,    0.81904988,     1.2777137,     3.2215872,    0.60063464,     1.4306038}
+{    0.10920665,   0.010920665,             0,     5.9189834,   0.010920665,    0.66615979,    0.99377588,   0.010920665,    0.21841266,   0.054603196,   0.010920665,     4.1935207,    0.60063464,    0.85180697,    0.32761931,     1.4852032,    0.60063464,   0.065523861,   0.010920665,   0.010920665}
+{    0.88457052,   0.010920665,     5.9189834,             0,   0.010920665,    0.76444397,    0.37130145,   0.010920665,     1.5398091,    0.22933319,   0.010920665,    0.86272816,    0.56787303,      4.062473,    0.10920665,     1.0374606,     0.8954917,    0.38222199,    0.18565105,   0.010920665}
+{   0.010920665,    0.76444397,   0.010920665,   0.010920665,             0,   0.076444397,     1.5398091,    0.69892333,    0.15288879,     1.9547947,     2.6973963,    0.53511078,    0.12012719,   0.010920665,   0.076444397,    0.21841266,    0.75352279,     1.0046971,     1.9875582,     11.106293}
+{     1.4742885,    0.52419025,    0.66615979,    0.76444397,   0.076444397,             0,    0.74260161,   0.010920665,    0.32761931,   0.032761931,     0.4040637,     1.0265394,    0.18565105,    0.19657158,    0.44774585,     1.6599357,   0.076444397,   0.032761931,    0.25117491,    0.22933319}
+{    0.32761931,     1.3541555,    0.99377588,    0.37130145,     1.5398091,    0.74260161,             0,    0.37130145,    0.82997106,     0.5569525,     1.2667925,     3.4946038,     0.4805081,     4.2262842,     0.9828547,     1.9984729,    0.53511078,   0.010920665,    0.52419025,     3.3526349}
+{   0.010920665,     1.1357448,   0.010920665,   0.010920665,    0.69892333,   0.010920665,    0.37130145,             0,    0.37130145,     4.2044419,     4.0952365,    0.38222199,    0.10920665,    0.36038091,    0.26209545,   0.043682531,    0.78628634,     11.444817,    0.42590478,    0.28393652}
+{    0.41498424,    0.17472987,    0.21841266,     1.5398091,    0.15288879,    0.32761931,    0.82997106,    0.37130145,             0,    0.25117491,     1.4633673,     1.3432408,    0.46958756,     3.3744772,     6.4759056,    0.84088579,     1.2012719,    0.20749212,   0.065523861,   0.010920665}
+{    0.49142864,     1.2012719,   0.054603196,    0.22933319,     1.9547947,   0.032761931,     0.5569525,     4.2044419,    0.25117491,             0,     6.3448901,    0.16380933,    0.24025373,    0.58971411,    0.19657158,    0.26209545,    0.27301598,     1.2231142,    0.51326971,    0.69892333}
+{     2.5663485,     1.7036204,   0.010920665,   0.010920665,     2.6973963,     0.4040637,     1.2667925,     4.0952365,     1.4633673,     6.3448901,             0,   0.010920665,   0.010920665,     1.7254628,    0.62247636,   0.010920665,     1.4306038,     2.5772697,      1.212193,     0.8081287}
+{     0.5569525,     1.3978402,     4.1935207,    0.86272816,    0.53511078,     1.0265394,     3.4946038,    0.38222199,     1.3432408,    0.16380933,   0.010920665,             0,    0.36038091,     2.5772697,    0.38222199,      3.210666,     1.6162509,    0.22933319,    0.17472987,    0.30577759}
+{      1.059303,   0.010920665,    0.60063464,    0.56787303,    0.12012719,    0.18565105,     0.4805081,    0.10920665,    0.46958756,    0.24025373,   0.010920665,    0.36038091,             0,    0.74260161,    0.26209545,     1.4633673,    0.67708097,    0.27301598,    0.09828547,    0.15288879}
+{    0.34946038,    0.76444397,    0.85180697,      4.062473,   0.010920665,    0.19657158,     4.2262842,    0.36038091,     3.3744772,    0.58971411,     1.7254628,     2.5772697,    0.74260161,             0,     2.4134585,     2.4571432,      1.594415,    0.39314252,    0.10920665,    0.49142864}
+{    0.37130145,     1.0046971,    0.32761931,    0.10920665,   0.076444397,    0.44774585,     0.9828547,    0.26209545,     6.4759056,    0.19657158,    0.62247636,    0.38222199,    0.26209545,     2.4134585,             0,     1.1139024,    0.69892333,    0.31669813,    0.14196826,    0.51326971}
+{     5.0234917,    0.81904988,     1.4852032,     1.0374606,    0.21841266,     1.6599357,     1.9984729,   0.043682531,    0.84088579,    0.26209545,   0.010920665,      3.210666,     1.4633673,     2.4571432,     1.1139024,             0,     7.3277577,    0.42590478,    0.15288879,    0.33853984}
+{     2.8175228,     1.2777137,    0.60063464,     0.8954917,    0.75352279,   0.076444397,    0.53511078,    0.78628634,     1.2012719,    0.27301598,     1.4306038,     1.6162509,    0.67708097,      1.594415,    0.69892333,     7.3277577,             0,     2.1404418,   0.010920665,    0.37130145}
+{      2.151363,     3.2215872,   0.065523861,    0.38222199,     1.0046971,   0.032761931,   0.010920665,     11.444817,    0.20749212,     1.2231142,     2.5772697,    0.22933319,    0.27301598,    0.39314252,    0.31669813,    0.42590478,     2.1404418,             0,    0.28393652,    0.64431743}
+{   0.054603196,    0.60063464,   0.010920665,    0.18565105,     1.9875582,    0.25117491,    0.52419025,    0.42590478,   0.065523861,    0.51326971,      1.212193,    0.17472987,    0.09828547,    0.10920665,    0.14196826,    0.15288879,   0.010920665,    0.28393652,             0,     1.9220311}
+{    0.60063464,     1.4306038,   0.010920665,   0.010920665,     11.106293,    0.22933319,     3.3526349,    0.28393652,   0.010920665,    0.69892333,     0.8081287,    0.30577759,    0.15288879,    0.49142864,    0.51326971,    0.33853984,    0.37130145,    0.64431743,     1.9220311,             0}
+}
+
+
+{{        0.0646}
+{        0.0114}
+{        0.0422}
+{        0.0607}
+{        0.0287}
+{        0.0639}
+{        0.0273}
+{        0.0679}
+{        0.0751}
+{        0.1018}
+{         0.015}
+{        0.0376}
+{        0.0681}
+{        0.0606}
+{        0.0453}
+{        0.0488}
+{        0.0622}
+{        0.0619}
+{        0.0251}
+{        0.0318}
+}
diff --git a/res/TemplateBatchFiles/TemplateModels/EmpiricalCodon/KHG_ECM b/res/TemplateBatchFiles/TemplateModels/EmpiricalCodon/KHG_ECM
new file mode 100644
index 0000000..81631e4
--- /dev/null
+++ b/res/TemplateBatchFiles/TemplateModels/EmpiricalCodon/KHG_ECM
@@ -0,0 +1,71 @@
+{ 
+{ "TTT", "TTC", "TTA", "TTG", "TCT", "TCC", "TCA", "TCG", "TAT", "TAC", "TGT", "TGC", "TGG", "CTT", "CTC", "CTA", "CTG", "CCT", "CCC", "CCA", "CCG", "CAT", "CAC", "CAA", "CAG", "CGT", "CGC", "CGA", "CGG", "ATT", "ATC", "ATA", "ATG", "ACT", "ACC", "ACA", "ACG", "AAT", "AAC", "AAA", "AAG", "AGT", "AGC", "AGA", "AGG", "GTT", "GTC", "GTA", "GTG", "GCT", "GCC", "GCA", "GCG", "GAT", "GAC", "GAA", "GAG", "GGT", "GGC", "GGA", "GGG" } 
+}
+
+{
+{0, 11.192024, 1.315610, 5.427076, 1.658051, 0.000000, 0.000000, 0.000000, 6.610894, 0.000000, 3.347364, 0.000000, 0.000000, 2.090751, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.682029, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 2.261813, 0.000000, 0.000000, 0.000000, 0.00000 [...]
+{11.192024, , 0.010896, 4.756288, 0.000000, 1.913571, 0.000000, 0.000000, 0.000000, 5.177930, 0.000000, 1.558523, 0.000000, 0.000000, 2.266373, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.786043, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.923392, 0.000000, 0.000000, 0.000000 [...]
+{1.315610, 0.010896, , 24.748755, 0.000000, 0.000000, 2.952332, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 75.752638, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 10.116588, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 2.362720, 0.000000, 0.0000 [...]
+{5.427076, 4.756288, 24.748755, , 0.000000, 0.000000, 0.000000, 8.126914, 0.000000, 0.000000, 0.000000, 0.000000, 5.369644, 0.000000, 0.000000, 0.000000, 20.877218, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 7.911096, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 2.022101, 0.00000 [...]
+{1.658051, 0.000000, 0.000000, 0.000000, , 13.889102, 44.407955, 17.057443, 2.206054, 0.000000, 6.191481, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.769355, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 38.229100, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 5.540 [...]
+{0.000000, 1.913571, 0.000000, 0.000000, 13.889102, , 13.681751, 65.097021, 0.000000, 5.615472, 0.000000, 9.339206, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 2.704601, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 15.793595, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000 [...]
+{0.000000, 0.000000, 2.952332, 0.000000, 44.407955, 13.681751, , 12.991861, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 3.312811, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 6.033932, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.0000 [...]
+{0.000000, 0.000000, 0.000000, 8.126914, 17.057443, 65.097021, 12.991861, , 0.000000, 0.000000, 0.000000, 0.000000, 4.662001, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.303480, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 17.103904, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000 [...]
+{6.610894, 0.000000, 0.000000, 0.000000, 2.206054, 0.000000, 0.000000, 0.000000, , 19.942818, 0.582084, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 3.444964, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 2.245405, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000 [...]
+{0.000000, 5.177930, 0.000000, 0.000000, 0.000000, 5.615472, 0.000000, 0.000000, 19.942818, , 0.000000, 0.144278, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 7.087801, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.228361, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000 [...]
+{3.347364, 0.000000, 0.000000, 0.000000, 6.191481, 0.000000, 0.000000, 0.000000, 0.582084, 0.000000, , 44.777964, 0.677177, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.617091, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 4.719489, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000 [...]
+{0.000000, 1.558523, 0.000000, 0.000000, 0.000000, 9.339206, 0.000000, 0.000000, 0.000000, 0.144278, 44.777964, , 0.073268, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.632945, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 2.047654, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000 [...]
+{0.000000, 0.000000, 0.000000, 5.369644, 0.000000, 0.000000, 0.000000, 4.662001, 0.000000, 0.000000, 0.677177, 0.073268, , 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 3.026086, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.825082, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, [...]
+{2.090751, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, , 8.905484, 56.803876, 8.432339, 1.263838, 0.000000, 0.000000, 0.000000, 1.583116, 0.000000, 0.000000, 0.000000, 0.779565, 0.000000, 0.000000, 0.000000, 4.301225, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 2.473623, 0.000000, 0.000000, 0.000000, 0.000000 [...]
+{0.000000, 2.266373, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 8.905484, , 7.811205, 22.078564, 0.000000, 1.389735, 0.000000, 0.000000, 0.000000, 3.230751, 0.000000, 0.000000, 0.000000, 2.250770, 0.000000, 0.000000, 0.000000, 6.381841, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 5.914972, 0.000000, 0.000000, 0.000000 [...]
+{0.000000, 0.000000, 75.752638, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 56.803876, 7.811205, , 5.650116, 0.000000, 0.000000, 1.393680, 0.000000, 0.000000, 0.000000, 7.419058, 0.000000, 0.000000, 0.000000, 3.023939, 0.000000, 0.000000, 0.000000, 5.134459, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 3.737489, 0.000000, 0.00000 [...]
+{0.000000, 0.000000, 0.000000, 20.877218, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 8.432339, 22.078564, 5.650116, , 0.000000, 0.000000, 0.000000, 0.477616, 0.000000, 0.000000, 0.000000, 1.812540, 0.000000, 0.000000, 0.000000, 1.462945, 0.000000, 0.000000, 0.000000, 2.570123, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 2.164805, 0.00000 [...]
+{0.000000, 0.000000, 0.000000, 0.000000, 1.769355, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.263838, 0.000000, 0.000000, 0.000000, , 17.461627, 35.480963, 8.407091, 1.021682, 0.000000, 0.000000, 0.000000, 0.334165, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 6.578976, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.15918 [...]
+{0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 2.704601, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.389735, 0.000000, 0.000000, 17.461627, , 12.053827, 28.557939, 0.000000, 3.774544, 0.000000, 0.000000, 0.000000, 1.699302, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.434550, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.0000 [...]
+{0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 3.312811, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.393680, 0.000000, 35.480963, 12.053827, , 11.295213, 0.000000, 0.000000, 5.381868, 0.000000, 0.000000, 0.000000, 1.693662, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.925575, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.0000 [...]
+{0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.303480, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.477616, 8.407091, 28.557939, 11.295213, , 0.000000, 0.000000, 0.000000, 1.794388, 0.000000, 0.000000, 0.000000, 3.144296, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.238450, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.00000 [...]
+{0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 3.444964, 0.000000, 0.000000, 0.000000, 0.000000, 1.583116, 0.000000, 0.000000, 0.000000, 1.021682, 0.000000, 0.000000, 0.000000, , 28.086160, 3.440380, 1.086327, 3.019726, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 5.004762, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000 [...]
+{0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 7.087801, 0.000000, 0.000000, 0.000000, 0.000000, 3.230751, 0.000000, 0.000000, 0.000000, 3.774544, 0.000000, 0.000000, 28.086160, , 1.918904, 5.369463, 0.000000, 7.016899, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 4.105602, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000 [...]
+{0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 7.419058, 0.000000, 0.000000, 0.000000, 5.381868, 0.000000, 3.440380, 1.918904, , 14.959151, 0.000000, 0.000000, 6.415757, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 6.404436, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000 [...]
+{0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.812540, 0.000000, 0.000000, 0.000000, 1.794388, 1.086327, 5.369463, 14.959151, , 0.000000, 0.000000, 0.000000, 19.920977, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 2.715692, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.00000 [...]
+{0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.617091, 0.000000, 0.000000, 0.779565, 0.000000, 0.000000, 0.000000, 0.334165, 0.000000, 0.000000, 0.000000, 3.019726, 0.000000, 0.000000, 0.000000, , 14.603857, 99.459951, 30.804750, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 3.834666, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.0000 [...]
+{0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.632945, 0.000000, 0.000000, 2.250770, 0.000000, 0.000000, 0.000000, 1.699302, 0.000000, 0.000000, 0.000000, 7.016899, 0.000000, 0.000000, 14.603857, , 14.930266, 79.483730, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 5.033630, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.0000 [...]
+{0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 3.023939, 0.000000, 0.000000, 0.000000, 1.693662, 0.000000, 0.000000, 0.000000, 6.415757, 0.000000, 99.459951, 14.930266, , 13.919752, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 92.372238, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000 [...]
+{0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 3.026086, 0.000000, 0.000000, 0.000000, 1.462945, 0.000000, 0.000000, 0.000000, 3.144296, 0.000000, 0.000000, 0.000000, 19.920977, 30.804750, 79.483730, 13.919752, , 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 133.296291, 0.000000, 0.000000, 0.000000, 0.000000, 0.0 [...]
+{1.682029, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 4.301225, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, , 10.140728, 18.298900, 1.281784, 2.801564, 0.000000, 0.000000, 0.000000, 0.501054, 0.000000, 0.000000, 0.000000, 0.578118, 0.000000, 0.000000, 0.000000, 7.096281, 0.000000, 0.000000, 0.000000, 0.00000 [...]
+{0.000000, 0.786043, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 6.381841, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 10.140728, , 4.623936, 1.303951, 0.000000, 2.231468, 0.000000, 0.000000, 0.000000, 0.292691, 0.000000, 0.000000, 0.000000, 0.437779, 0.000000, 0.000000, 0.000000, 10.137337, 0.000000, 0.000000, 0.00000 [...]
+{0.000000, 0.000000, 10.116588, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 5.134459, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 18.298900, 4.623936, , 2.082128, 0.000000, 0.000000, 4.962350, 0.000000, 0.000000, 0.000000, 2.647620, 0.000000, 0.000000, 0.000000, 1.903175, 0.000000, 0.000000, 0.000000, 25.294298, 0.000000, 0.0000 [...]
+{0.000000, 0.000000, 0.000000, 7.911096, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 2.570123, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.281784, 1.303951, 2.082128, , 0.000000, 0.000000, 0.000000, 8.155285, 0.000000, 0.000000, 0.000000, 0.975074, 0.000000, 0.000000, 0.000000, 2.231662, 0.000000, 0.000000, 0.000000, 2.078444, 0.000000, [...]
+{0.000000, 0.000000, 0.000000, 0.000000, 38.229100, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 6.578976, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 2.801564, 0.000000, 0.000000, 0.000000, , 6.035740, 28.307876, 19.578982, 11.715476, 0.000000, 0.000000, 0.000000, 39.399322, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 5.10 [...]
+{0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 15.793595, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.434550, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 2.231468, 0.000000, 0.000000, 6.035740, , 6.967655, 38.414969, 0.000000, 2.134740, 0.000000, 0.000000, 0.000000, 21.337943, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.0000 [...]
+{0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 6.033932, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.925575, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 4.962350, 0.000000, 28.307876, 6.967655, , 12.678802, 0.000000, 0.000000, 3.919360, 0.000000, 0.000000, 0.000000, 0.754055, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.00000 [...]
+{0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 17.103904, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.238450, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 8.155285, 19.578982, 38.414969, 12.678802, , 0.000000, 0.000000, 0.000000, 5.869857, 0.000000, 0.000000, 0.000000, 22.577271, 0.000000, 0.000000, 0.000000, 0.000000, 0.00 [...]
+{0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 2.245405, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 5.004762, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.501054, 0.000000, 0.000000, 0.000000, 11.715476, 0.000000, 0.000000, 0.000000, , 13.863648, 4.929483, 1.010212, 16.623529, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.0000 [...]
+{0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.228361, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 4.105602, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.292691, 0.000000, 0.000000, 0.000000, 2.134740, 0.000000, 0.000000, 13.863648, , 0.366267, 0.982893, 0.000000, 7.784768, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000 [...]
+{0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 6.404436, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 2.647620, 0.000000, 0.000000, 0.000000, 3.919360, 0.000000, 4.929483, 0.366267, , 10.762877, 0.000000, 0.000000, 8.423762, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000 [...]
+{0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 2.715692, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.975074, 0.000000, 0.000000, 0.000000, 5.869857, 1.010212, 0.982893, 10.762877, , 0.000000, 0.000000, 0.000000, 21.000358, 0.000000, 0.000000, 0.000000, 0.000000, 0.00000 [...]
+{0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 4.719489, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 3.834666, 0.000000, 0.000000, 0.000000, 0.578118, 0.000000, 0.000000, 0.000000, 39.399322, 0.000000, 0.000000, 0.000000, 16.623529, 0.000000, 0.000000, 0.000000, , 26.637668, 1.792245, 3.324581, 0.000000, 0.000000, 0.000000, 0.000000, 0.0000 [...]
+{0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 2.047654, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 5.033630, 0.000000, 0.000000, 0.000000, 0.437779, 0.000000, 0.000000, 0.000000, 21.337943, 0.000000, 0.000000, 0.000000, 7.784768, 0.000000, 0.000000, 26.637668, , 0.120900, 6.011970, 0.000000, 0.000000, 0.000000, 0.000000, 0.00000 [...]
+{0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 92.372238, 0.000000, 0.000000, 0.000000, 1.903175, 0.000000, 0.000000, 0.000000, 0.754055, 0.000000, 0.000000, 0.000000, 8.423762, 0.000000, 1.792245, 0.120900, , 36.292705, 0.000000, 0.000000, 0.000000, 0.000000, 0.00000 [...]
+{0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.825082, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 133.296291, 0.000000, 0.000000, 0.000000, 2.231662, 0.000000, 0.000000, 0.000000, 22.577271, 0.000000, 0.000000, 0.000000, 21.000358, 3.324581, 6.011970, 36.292705, , 0.000000, 0.000000, 0.000000, 0.000000, 0.00 [...]
+{2.261813, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 2.473623, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 7.096281, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, , 6.669955, 26.045078, 8.901167, 3.682092 [...]
+{0.000000, 1.923392, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 5.914972, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 10.137337, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 6.669955, , 3.531461, 21.657664, 0.00000 [...]
+{0.000000, 0.000000, 2.362720, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 3.737489, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 25.294298, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 26.045078, 3.531461, , 11.898141, 0.0000 [...]
+{0.000000, 0.000000, 0.000000, 2.022101, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 2.164805, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 2.078444, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 8.901167, 21.657664, 11.898141, , 0.00000 [...]
+{0.000000, 0.000000, 0.000000, 0.000000, 5.540052, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.159185, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 5.107629, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 3.682092, 0.000000, 0.000000, 0.000000, , [...]
+{0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 7.675838, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 3.120189, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 2.312255, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 4.308415, 0.000000, 0.000000, 6 [...]
+{0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 9.880382, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 2.923972, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 3.064069, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 6.291148, 0.000000, 2 [...]
+{0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 21.863158, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 6.034856, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 25.461549, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 6.166554, [...]
+{0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.367553, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.383706, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 6.091654, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.352915, 0.000000, 0.000000, 0.000000, 0 [...]
+{0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.294702, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 3.006827, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 3.686074, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.208522, 0.000000, 0.000000, 0 [...]
+{0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 4.485369, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 2.811398, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.277861, 0.000000, 0 [...]
+{0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 7.686782, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 2.090641, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.476105, 0 [...]
+{0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.104727, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.041150, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 10.590780, 0.000000, 0.000000, 0.000000, 0.503385, 0.000000, 0.000000, 0.000000,  [...]
+{0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.552851, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.252470, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 4.285543, 0.000000, 0.000000, 0.000000, 0.542717, 0.000000, 0.000000, 0 [...]
+{0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.091041, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.432410, 0.000000, 0.000000, 0.000000, 0.702411, 0.000000, 0 [...]
+{0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.810856, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 4.803738, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 5.388514, 0.000000, 0.000000, 0.000000, 0.302501, 0 [...]
+}
+
+{ 
+{0.022103, 0.021383, 0.016387, 0.015425, 0.011880, 0.011131, 0.009750, 0.008956, 0.015965, 0.015782, 0.006025, 0.007029, 0.011880, 0.014467, 0.017386, 0.007600, 0.028839, 0.010007, 0.010100, 0.010642, 0.011843, 0.011097, 0.011703, 0.016076, 0.020211, 0.008311, 0.014148, 0.004800, 0.007837, 0.025576, 0.023441, 0.013551, 0.020102, 0.013424, 0.020201, 0.015528, 0.012142, 0.023006, 0.020171, 0.030001, 0.026344, 0.010142, 0.011679, 0.010372, 0.008195, 0.019047, 0.018938, 0.010901, 0.022747, 0 [...]
+}
diff --git a/res/TemplateBatchFiles/TemplateModels/EmpiricalCodon/KHG_ECMu b/res/TemplateBatchFiles/TemplateModels/EmpiricalCodon/KHG_ECMu
new file mode 100644
index 0000000..6c17304
--- /dev/null
+++ b/res/TemplateBatchFiles/TemplateModels/EmpiricalCodon/KHG_ECMu
@@ -0,0 +1,72 @@
+{ 
+{ "TTT", "TTC", "TTA", "TTG", "TCT", "TCC", "TCA", "TCG", "TAT", "TAC", "TGT", "TGC", "TGG", "CTT", "CTC", "CTA", "CTG", "CCT", "CCC", "CCA", "CCG", "CAT", "CAC", "CAA", "CAG", "CGT", "CGC", "CGA", "CGG", "ATT", "ATC", "ATA", "ATG", "ACT", "ACC", "ACA", "ACG", "AAT", "AAC", "AAA", "AAG", "AGT", "AGC", "AGA", "AGG", "GTT", "GTC", "GTA", "GTG", "GCT", "GCC", "GCA", "GCG", "GAT", "GAC", "GAA", "GAG", "GGT", "GGC", "GGA", "GGG" } 
+}
+
+{
+{0, 16.011531, 2.395822, 1.204356, 0.773935, 0.030074, 0.278090, 0.034137, 4.317981, 0.481042, 0.733587, 0.045951, 0.786871, 2.016257, 0.083684, 1.036474, 0.073550, 0.324368, 0.000140, 0.025217, 0.004063, 0.638696, 0.000467, 0.126320, 0.009760, 0.143832, 0.000000, 0.030121, 0.000934, 1.119411, 0.056038, 1.075187, 0.679370, 0.497293, 0.000093, 0.079948, 0.008032, 0.263567, 0.000093, 0.148268, 0.013122, 0.225554, 0.000093, 0.140516, 0.083310, 0.863970, 0.026338, 0.565566, 0.068927, 0.48356 [...]
+{16.011531, 0, 0.151858, 0.675537, 0.052602, 0.656004, 0.056677, 0.198277, 0.503397, 4.483501, 0.076912, 0.561620, 1.183337, 0.207692, 2.306110, 0.198558, 1.341144, 0.000141, 0.285635, 0.006558, 0.079161, 0.001312, 0.761771, 0.016628, 0.107218, 0.000094, 0.200806, 0.016020, 0.027355, 0.059956, 1.006045, 0.064968, 0.800602, 0.000141, 0.371541, 0.010539, 0.036489, 0.000094, 0.143614, 0.005996, 0.043609, 0.000047, 0.166706, 0.012600, 0.056771, 0.065905, 0.946136, 0.047403, 0.371072, 0.00023 [...]
+{2.395822, 0.151858, 0, 18.541946, 0.249707, 0.011609, 1.184813, 0.010188, 0.798582, 0.033529, 0.645571, 0.040012, 0.271072, 12.035723, 1.373823, 27.219895, 1.045943, 0.001358, 0.000000, 0.261069, 0.000000, 0.026551, 0.000123, 0.576476, 0.000000, 0.000741, 0.000000, 0.136647, 0.000000, 2.130663, 0.042112, 5.159075, 1.418466, 0.012473, 0.000062, 0.871568, 0.000062, 0.271628, 0.002840, 0.612660, 0.000062, 0.010929, 0.000432, 0.423774, 0.000247, 0.748196, 0.005990, 2.299543, 0.024699, 0.008 [...]
+{1.204356, 0.675537, 18.541946, 0, 0.274990, 0.158873, 0.611887, 0.694091, 0.337279, 0.177833, 0.395942, 0.240632, 0.632947, 11.161511, 5.651603, 16.560966, 12.455337, 0.003499, 0.000382, 0.005535, 0.112999, 0.040275, 0.002163, 0.007508, 0.250748, 0.003054, 0.000064, 0.001527, 0.127696, 1.292935, 0.478019, 1.065537, 3.062807, 0.015652, 0.002990, 0.011134, 0.586818, 0.077878, 0.060699, 0.004963, 0.333780, 0.009289, 0.005790, 0.001718, 0.506841, 0.529619, 0.140867, 0.762425, 1.108802, 0.03 [...]
+{0.773935, 0.052602, 0.249707, 0.274990, 0, 23.655090, 35.921779, 11.510965, 0.688169, 0.069588, 1.811753, 0.138244, 0.069758, 0.277929, 0.000085, 0.000678, 0.000000, 2.846677, 0.101204, 0.487542, 0.021444, 1.253945, 0.000593, 0.508308, 0.049246, 0.660622, 0.000000, 0.006103, 0.000085, 0.172403, 0.000000, 0.000424, 0.093491, 4.693944, 0.196983, 2.018483, 0.361164, 1.773102, 0.003390, 0.340991, 0.156468, 12.169045, 0.094762, 0.047890, 0.063994, 0.563995, 0.000085, 0.001356, 0.000254, 3.99 [...]
+{0.030074, 0.656004, 0.011609, 0.158873, 23.655090, 0, 15.982573, 35.359077, 0.047115, 0.524116, 0.343463, 1.323765, 0.081312, 0.000186, 0.342813, 0.000186, 0.001022, 0.196358, 2.487136, 0.138742, 0.371063, 0.002137, 1.144692, 0.080383, 0.423382, 0.001208, 0.685812, 0.004089, 0.004832, 0.000000, 0.115975, 0.000000, 0.042282, 0.487317, 3.829580, 0.409721, 1.562591, 0.000929, 1.118208, 0.020909, 0.251650, 0.083636, 10.892976, 0.002044, 0.028715, 0.000186, 0.396897, 0.000279, 0.001394, 0.77 [...]
+{0.278090, 0.056677, 1.184813, 0.611887, 35.921779, 15.982573, 0, 17.424222, 0.341791, 0.070809, 0.751980, 0.121937, 0.195833, 0.000289, 0.000096, 0.496046, 0.000000, 0.544474, 0.072352, 3.121656, 0.064924, 0.128111, 0.014470, 2.066955, 0.002122, 0.000579, 0.000000, 0.557015, 0.000000, 0.000386, 0.000096, 0.403435, 0.246094, 2.297807, 0.150107, 5.709933, 0.516594, 0.872084, 0.187826, 1.496628, 0.004438, 5.964323, 1.049877, 1.094736, 0.009261, 0.002219, 0.000096, 0.813720, 0.000772, 1.825 [...]
+{0.034137, 0.198277, 0.010188, 0.694091, 11.510965, 35.359077, 17.424222, 0, 0.058136, 0.213967, 0.143447, 0.493179, 0.410046, 0.000000, 0.000344, 0.000115, 0.266943, 0.078776, 0.432520, 0.151589, 2.075226, 0.073730, 0.114551, 0.002179, 1.519211, 0.001720, 0.032106, 0.003211, 1.903571, 0.000000, 0.000344, 0.000000, 0.527005, 0.199748, 2.395833, 0.349846, 4.919174, 0.040706, 0.725836, 0.000459, 0.768607, 0.681575, 9.818281, 0.000115, 0.514392, 0.000115, 0.001261, 0.000115, 0.451899, 0.250 [...]
+{4.317981, 0.503397, 0.798582, 0.337279, 0.688169, 0.047115, 0.341791, 0.058136, 0, 24.177765, 0.822999, 0.068342, 1.140051, 0.485469, 0.000116, 0.016650, 0.004815, 0.337879, 0.000116, 0.032140, 0.004177, 3.088481, 0.265766, 0.486281, 0.092070, 0.534375, 0.000116, 0.043917, 0.003713, 0.352731, 0.000116, 0.573013, 0.294368, 0.599932, 0.000116, 0.208041, 0.042119, 0.747870, 0.046586, 0.467136, 0.072867, 0.506470, 0.000116, 0.424321, 0.200499, 0.571505, 0.000116, 0.236179, 0.009630, 0.37030 [...]
+{0.481042, 4.483501, 0.033529, 0.177833, 0.069588, 0.524116, 0.070809, 0.213967, 24.177765, 0, 0.054860, 0.628438, 1.421996, 0.000299, 0.622089, 0.011978, 0.308859, 0.000479, 0.310416, 0.025873, 0.037372, 0.340541, 3.193996, 0.079236, 0.332396, 0.001377, 0.604541, 0.051686, 0.081931, 0.000180, 0.255975, 0.025454, 0.300354, 0.000599, 0.393545, 0.053363, 0.177757, 0.042762, 0.487814, 0.042942, 0.140864, 0.000180, 0.346890, 0.060909, 0.269510, 0.000359, 0.582801, 0.060430, 0.116309, 0.00041 [...]
+{0.733587, 0.076912, 0.645571, 0.395942, 1.811753, 0.343463, 0.751980, 0.143447, 0.822999, 0.054860, 0, 56.838378, 0.264556, 0.543240, 0.000466, 0.020649, 0.002639, 0.239715, 0.000000, 0.002795, 0.000155, 0.634065, 0.000155, 0.163174, 0.057910, 0.726908, 0.012886, 0.232728, 0.023909, 0.431456, 0.000311, 0.069555, 0.298091, 1.089585, 0.000776, 0.415775, 0.053874, 0.360038, 0.000932, 0.099519, 0.011489, 2.007768, 0.248099, 0.144388, 0.122186, 1.598824, 0.001087, 0.754233, 0.126844, 1.89986 [...]
+{0.045951, 0.561620, 0.040012, 0.240632, 0.138244, 1.323765, 0.121937, 0.493179, 0.068342, 0.628438, 56.838378, 0, 0.210115, 0.000674, 0.674176, 0.021578, 0.265948, 0.000270, 0.215779, 0.010250, 0.004585, 0.001483, 0.483076, 0.032232, 0.105597, 0.077815, 0.516927, 0.166150, 0.183143, 0.000405, 0.309643, 0.012138, 0.324613, 0.001483, 0.806071, 0.061227, 0.173298, 0.000135, 0.325422, 0.004316, 0.034794, 0.181794, 1.372357, 0.030883, 0.070533, 0.004316, 1.273908, 0.086986, 0.530278, 0.01173 [...]
+{0.786871, 1.183337, 0.271072, 0.632947, 0.069758, 0.081312, 0.195833, 0.410046, 1.140051, 1.421996, 0.264556, 0.210115, 0, 0.010122, 0.113701, 0.017106, 0.504866, 0.061833, 0.032564, 0.070308, 0.215788, 0.195073, 0.369273, 0.055163, 0.247490, 0.019696, 0.176476, 0.146501, 1.135910, 0.078312, 0.136849, 0.170041, 0.321642, 0.035939, 0.037822, 0.060421, 0.362681, 0.074859, 0.053908, 0.051005, 0.105226, 0.139046, 0.167138, 0.145245, 0.496706, 0.038763, 0.092044, 0.058616, 0.277072, 0.035860 [...]
+{2.016257, 0.207692, 12.035723, 11.161511, 0.277929, 0.000186, 0.000289, 0.000000, 0.485469, 0.000299, 0.543240, 0.000674, 0.010122, 0, 15.874441, 21.437257, 4.802017, 0.822643, 0.026571, 0.065669, 0.007978, 0.664866, 0.058614, 0.529045, 0.079119, 0.663877, 0.016022, 0.424607, 0.039428, 3.330793, 0.390190, 1.260239, 1.220020, 0.831215, 0.000396, 0.000857, 0.000264, 0.259380, 0.000330, 0.060922, 0.039362, 0.322807, 0.000330, 0.004747, 0.009560, 1.897150, 0.105361, 0.509595, 0.091844, 0.87 [...]
+{0.083684, 2.306110, 1.373823, 5.651603, 0.000085, 0.342813, 0.000096, 0.000344, 0.000116, 0.622089, 0.000466, 0.674176, 0.113701, 15.874441, 0, 8.808275, 15.484088, 0.036254, 0.648769, 0.016609, 0.118229, 0.057328, 0.617694, 0.071794, 0.422671, 0.068758, 0.544828, 0.112395, 0.640495, 0.184010, 3.765697, 0.136148, 1.434579, 0.000060, 0.897490, 0.000119, 0.000595, 0.000000, 0.187880, 0.002143, 0.022384, 0.000060, 0.300513, 0.000060, 0.000952, 0.072866, 2.720153, 0.031730, 0.477439, 0.0004 [...]
+{1.036474, 0.198558, 27.219895, 16.560966, 0.000678, 0.000186, 0.496046, 0.000115, 0.016650, 0.011978, 0.020649, 0.021578, 0.017106, 21.437257, 8.808275, 0, 8.319767, 0.181411, 0.040087, 1.073790, 0.016442, 0.438648, 0.059927, 1.205738, 0.105449, 0.134394, 0.005436, 0.918198, 0.040902, 1.328581, 0.203017, 4.400610, 1.635281, 0.004348, 0.000679, 0.944560, 0.000408, 0.019568, 0.014540, 0.433620, 0.000679, 0.009512, 0.002718, 0.409432, 0.000951, 0.555104, 0.043756, 2.047159, 0.173122, 0.004 [...]
+{0.073550, 1.341144, 1.045943, 12.455337, 0.000000, 0.001022, 0.000000, 0.266943, 0.004815, 0.308859, 0.002639, 0.265948, 0.504866, 4.802017, 15.484088, 8.319767, 0, 0.014388, 0.149771, 0.040917, 0.495176, 0.044742, 0.330036, 0.033372, 0.703795, 0.015019, 0.563956, 0.041969, 0.794366, 0.089308, 2.469249, 0.048882, 2.236557, 0.000070, 0.073657, 0.000070, 0.733202, 0.000140, 0.034916, 0.000035, 0.133032, 0.000105, 0.017300, 0.000000, 0.040320, 0.011580, 1.085170, 0.020529, 2.262490, 0.0007 [...]
+{0.324368, 0.000141, 0.001358, 0.003499, 2.846677, 0.196358, 0.544474, 0.078776, 0.337879, 0.000479, 0.239715, 0.000270, 0.061833, 0.822643, 0.036254, 0.181411, 0.014388, 0, 23.496083, 40.922701, 10.291826, 0.775254, 0.061583, 0.435109, 0.107434, 0.500433, 0.002398, 0.352807, 0.009880, 0.292855, 0.000096, 0.002014, 0.081631, 1.050363, 0.044125, 0.368538, 0.079712, 0.787340, 0.000959, 0.247195, 0.220816, 1.035015, 0.001247, 0.011511, 0.060432, 0.708395, 0.000192, 0.001151, 0.000384, 1.272 [...]
+{0.000140, 0.285635, 0.000000, 0.000382, 0.101204, 2.487136, 0.072352, 0.432520, 0.000116, 0.310416, 0.000000, 0.215779, 0.032564, 0.026571, 0.648769, 0.040087, 0.149771, 23.496083, 0, 15.426733, 33.453780, 0.091276, 0.730306, 0.074846, 0.529594, 0.124232, 0.563799, 0.154017, 0.897101, 0.000096, 0.270274, 0.000000, 0.008455, 0.053805, 0.870967, 0.026230, 0.435243, 0.000192, 0.532092, 0.012394, 0.303613, 0.000288, 1.337629, 0.000384, 0.033244, 0.000192, 0.760090, 0.000192, 0.001537, 0.073 [...]
+{0.025217, 0.006558, 0.261069, 0.005535, 0.487542, 0.138742, 3.121656, 0.151589, 0.032140, 0.025873, 0.002795, 0.010250, 0.070308, 0.065669, 0.016609, 1.073790, 0.040917, 40.922701, 15.426733, 0, 15.127582, 0.286252, 0.089835, 1.052040, 0.184327, 0.063413, 0.001702, 0.626603, 0.010300, 0.002597, 0.000448, 0.480521, 0.042006, 0.345545, 0.027138, 1.018005, 0.083475, 0.096104, 0.074161, 1.042457, 0.012002, 0.021048, 0.005195, 0.493508, 0.009225, 0.009225, 0.000537, 0.732111, 0.000717, 0.346 [...]
+{0.004063, 0.079161, 0.000000, 0.112999, 0.021444, 0.371063, 0.064924, 2.075226, 0.004177, 0.037372, 0.000155, 0.004585, 0.215788, 0.007978, 0.118229, 0.016442, 0.495176, 10.291826, 33.453780, 15.127582, 0, 0.054021, 0.364129, 0.063366, 0.715716, 0.044676, 0.798346, 0.091073, 1.164525, 0.000246, 0.021723, 0.000000, 0.193459, 0.011476, 0.527094, 0.015001, 0.962295, 0.002705, 0.095418, 0.000410, 0.561523, 0.001066, 0.104681, 0.000000, 0.273876, 0.000246, 0.031642, 0.000082, 0.602428, 0.013 [...]
+{0.638696, 0.001312, 0.026551, 0.040275, 1.253945, 0.002137, 0.128111, 0.073730, 3.088481, 0.340541, 0.634065, 0.001483, 0.195073, 0.664866, 0.057328, 0.438648, 0.044742, 0.775254, 0.091276, 0.286252, 0.054021, 0, 38.685701, 2.473439, 1.106179, 2.460976, 0.170088, 1.353860, 0.316372, 0.193328, 0.000469, 0.040109, 0.323588, 0.898794, 0.001125, 0.082373, 0.076938, 2.691226, 0.460970, 0.899262, 0.324525, 1.293228, 0.005060, 0.411115, 0.140943, 0.338207, 0.000375, 0.019586, 0.032237, 0.42058 [...]
+{0.000467, 0.761771, 0.000123, 0.002163, 0.000593, 1.144692, 0.014470, 0.114551, 0.265766, 3.193996, 0.000155, 0.483076, 0.369273, 0.058614, 0.617694, 0.059927, 0.330036, 0.061583, 0.730306, 0.089835, 0.364129, 38.685701, 0, 0.751904, 2.503268, 0.277265, 2.478358, 0.526904, 2.208430, 0.000000, 0.127899, 0.000272, 0.163406, 0.000272, 0.969387, 0.021920, 0.103080, 0.188587, 2.203539, 0.143479, 0.571469, 0.000453, 1.282522, 0.025544, 0.169022, 0.000091, 0.491034, 0.002808, 0.044112, 0.00009 [...]
+{0.126320, 0.016628, 0.576476, 0.007508, 0.508308, 0.080383, 2.066955, 0.002179, 0.486281, 0.079236, 0.163174, 0.032232, 0.055163, 0.529045, 0.071794, 1.205738, 0.033372, 0.435109, 0.074846, 1.052040, 0.063366, 2.473439, 0.751904, 0, 17.923045, 1.164262, 0.148940, 4.725840, 0.299978, 0.078926, 0.010543, 0.390087, 0.443617, 0.374419, 0.066519, 1.660885, 0.002854, 1.759732, 0.377447, 3.215817, 0.461383, 1.177718, 0.232701, 1.242140, 0.003786, 0.150804, 0.006757, 0.606945, 0.000466, 0.27295 [...]
+{0.009760, 0.107218, 0.000000, 0.250748, 0.049246, 0.423382, 0.002122, 1.519211, 0.092070, 0.332396, 0.057910, 0.105597, 0.247490, 0.079119, 0.422671, 0.105449, 0.703795, 0.107434, 0.529594, 0.184327, 0.715716, 1.106179, 2.503268, 17.923045, 0, 0.340811, 2.029914, 0.617320, 4.718199, 0.003859, 0.105885, 0.000048, 0.834976, 0.029088, 0.617464, 0.001302, 1.766961, 0.206851, 0.985145, 0.285384, 2.285052, 0.083261, 1.418383, 0.000289, 1.148387, 0.009600, 0.069320, 0.000145, 0.475496, 0.04090 [...]
+{0.143832, 0.000094, 0.000741, 0.003054, 0.660622, 0.001208, 0.000579, 0.001720, 0.534375, 0.001377, 0.726908, 0.077815, 0.019696, 0.663877, 0.068758, 0.134394, 0.015019, 0.500433, 0.124232, 0.063413, 0.044676, 2.460976, 0.277265, 1.164262, 0.340811, 0, 27.244097, 39.595443, 12.868484, 0.076434, 0.000118, 0.000000, 0.028736, 0.344601, 0.001060, 0.000589, 0.004593, 0.682254, 0.003180, 1.769879, 0.560831, 0.772349, 0.387941, 17.450524, 6.798629, 0.336828, 0.000589, 0.000353, 0.001413, 0.32 [...]
+{0.000000, 0.200806, 0.000000, 0.000064, 0.000000, 0.685812, 0.000000, 0.032106, 0.000116, 0.604541, 0.012886, 0.516927, 0.176476, 0.016022, 0.544828, 0.005436, 0.563956, 0.002398, 0.563799, 0.001702, 0.798346, 0.170088, 2.478358, 0.148940, 2.029914, 27.244097, 0, 12.677657, 35.563093, 0.000000, 0.238839, 0.000000, 0.029786, 0.000000, 1.481721, 0.000000, 0.014243, 0.000068, 0.863191, 0.296358, 2.721043, 0.018146, 1.320875, 1.113671, 4.087042, 0.000000, 0.648523, 0.000000, 0.003287, 0.000 [...]
+{0.030121, 0.016020, 0.136647, 0.001527, 0.006103, 0.004089, 0.557015, 0.003211, 0.043917, 0.051686, 0.232728, 0.166150, 0.146501, 0.424607, 0.112395, 0.918198, 0.041969, 0.352807, 0.154017, 0.626603, 0.091073, 1.353860, 0.526904, 4.725840, 0.617320, 39.595443, 12.677657, 0, 30.574631, 0.000416, 0.001248, 0.121855, 0.015596, 0.001040, 0.002079, 0.360575, 0.002911, 0.009981, 0.016636, 3.065510, 0.034519, 0.530881, 0.354545, 31.949764, 15.287419, 0.003743, 0.001871, 0.255147, 0.000832, 0.0 [...]
+{0.000934, 0.027355, 0.000000, 0.127696, 0.000085, 0.004832, 0.000000, 1.903571, 0.003713, 0.081931, 0.023909, 0.183143, 1.135910, 0.039428, 0.640495, 0.040902, 0.794366, 0.009880, 0.897101, 0.010300, 1.164525, 0.316372, 2.208430, 0.299978, 4.718199, 12.868484, 35.563093, 30.574631, 0, 0.000000, 0.003064, 0.000000, 0.408680, 0.000000, 0.017774, 0.000000, 2.985421, 0.000981, 0.065212, 0.011032, 3.832200, 0.025006, 1.360141, 2.418859, 18.531553, 0.000000, 0.005026, 0.000000, 0.701399, 0.00 [...]
+{1.119411, 0.059956, 2.130663, 1.292935, 0.172403, 0.000000, 0.000386, 0.000000, 0.352731, 0.000180, 0.431456, 0.000405, 0.078312, 3.330793, 0.184010, 1.328581, 0.089308, 0.292855, 0.000096, 0.002597, 0.000246, 0.193328, 0.000000, 0.078926, 0.003859, 0.076434, 0.000000, 0.000416, 0.000000, 0, 13.609310, 16.415611, 1.155098, 1.266654, 0.034573, 0.296014, 0.090674, 0.239388, 0.025405, 0.221536, 0.041440, 0.359183, 0.031140, 0.116039, 0.093542, 6.546163, 0.458622, 2.581654, 0.953353, 0.5363 [...]
+{0.056038, 1.006045, 0.042112, 0.478019, 0.000000, 0.115975, 0.000096, 0.000344, 0.000116, 0.255975, 0.000311, 0.309643, 0.136849, 0.390190, 3.765697, 0.203017, 2.469249, 0.000096, 0.270274, 0.000448, 0.021723, 0.000469, 0.127899, 0.010543, 0.105885, 0.000118, 0.238839, 0.001248, 0.003064, 13.609310, 0, 5.784672, 1.428293, 0.075878, 1.066285, 0.048902, 0.311759, 0.014351, 0.175491, 0.023020, 0.116405, 0.018727, 0.238533, 0.012331, 0.062369, 0.575921, 7.487816, 0.313779, 3.487342, 0.00025 [...]
+{1.075187, 0.064968, 5.159075, 1.065537, 0.000424, 0.000000, 0.403435, 0.000000, 0.573013, 0.025454, 0.069555, 0.012138, 0.170041, 1.260239, 0.136148, 4.400610, 0.048882, 0.002014, 0.000000, 0.480521, 0.000000, 0.040109, 0.000272, 0.390087, 0.000048, 0.000000, 0.000000, 0.121855, 0.000000, 16.415611, 5.784672, 0, 2.230691, 0.351882, 0.016701, 2.260424, 0.154441, 0.256283, 0.020837, 0.667397, 0.056267, 0.269862, 0.021539, 0.780008, 0.317466, 2.577578, 0.154207, 11.271062, 0.911193, 0.0017 [...]
+{0.679370, 0.800602, 1.418466, 3.062807, 0.093491, 0.042282, 0.246094, 0.527005, 0.294368, 0.300354, 0.298091, 0.324613, 0.321642, 1.220020, 1.434579, 1.635281, 2.236557, 0.081631, 0.008455, 0.042006, 0.193459, 0.323588, 0.163406, 0.443617, 0.834976, 0.028736, 0.029786, 0.015596, 0.408680, 1.155098, 1.428293, 2.230691, 0, 0.419831, 0.433759, 0.853779, 1.376727, 0.208924, 0.219170, 0.275355, 0.497593, 0.306375, 0.304581, 0.305714, 0.905810, 0.430124, 0.350473, 0.569076, 1.399673, 0.451134 [...]
+{0.497293, 0.000141, 0.012473, 0.015652, 4.693944, 0.487317, 2.297807, 0.199748, 0.599932, 0.000599, 1.089585, 0.001483, 0.035939, 0.831215, 0.000060, 0.004348, 0.000070, 1.050363, 0.053805, 0.345545, 0.011476, 0.898794, 0.000272, 0.374419, 0.029088, 0.344601, 0.000000, 0.001040, 0.000000, 1.266654, 0.075878, 0.351882, 0.419831, 0, 13.991583, 31.915858, 12.116657, 2.057449, 0.296066, 0.878163, 0.291009, 4.943439, 0.622868, 0.432918, 0.309656, 2.898791, 0.001027, 0.009008, 0.003635, 2.359 [...]
+{0.000093, 0.371541, 0.000062, 0.002990, 0.196983, 3.829580, 0.150107, 2.395833, 0.000116, 0.393545, 0.000776, 0.806071, 0.037822, 0.000396, 0.897490, 0.000679, 0.073657, 0.044125, 0.870967, 0.027138, 0.527094, 0.001125, 0.969387, 0.066519, 0.617464, 0.001060, 1.481721, 0.002079, 0.017774, 0.034573, 1.066285, 0.016701, 0.433759, 13.991583, 0, 8.373639, 28.470047, 0.067554, 1.346385, 0.089476, 0.623366, 0.275865, 4.699375, 0.021698, 0.140701, 0.003020, 2.862216, 0.001957, 0.089643, 0.1201 [...]
+{0.079948, 0.010539, 0.871568, 0.011134, 2.018483, 0.409721, 5.709933, 0.349846, 0.208041, 0.053363, 0.415775, 0.061227, 0.060421, 0.000857, 0.000119, 0.944560, 0.000070, 0.368538, 0.026230, 1.018005, 0.015001, 0.082373, 0.021920, 1.660885, 0.001302, 0.000589, 0.000000, 0.360575, 0.000000, 0.296014, 0.048902, 2.260424, 0.853779, 31.915858, 8.373639, 0, 19.459275, 1.243753, 0.259909, 1.523251, 0.256174, 2.397415, 0.441084, 1.316696, 0.511968, 0.056250, 0.002515, 3.879355, 0.011433, 0.3241 [...]
+{0.008032, 0.036489, 0.000062, 0.586818, 0.361164, 1.562591, 0.516594, 4.919174, 0.042119, 0.177757, 0.053874, 0.173298, 0.362681, 0.000264, 0.000595, 0.000408, 0.733202, 0.079712, 0.435243, 0.083475, 0.962295, 0.076938, 0.103080, 0.002854, 1.766961, 0.004593, 0.014243, 0.002911, 2.985421, 0.090674, 0.311759, 0.154441, 1.376727, 12.116657, 28.470047, 19.459275, 0, 0.224397, 0.822133, 0.199589, 1.144639, 0.563566, 2.871848, 0.087905, 0.765495, 0.004868, 0.010298, 0.002528, 3.092500, 0.108 [...]
+{0.263567, 0.000094, 0.271628, 0.077878, 1.773102, 0.000929, 0.872084, 0.040706, 0.747870, 0.042762, 0.360038, 0.000135, 0.074859, 0.259380, 0.000000, 0.019568, 0.000140, 0.787340, 0.000192, 0.096104, 0.002705, 2.691226, 0.188587, 1.759732, 0.206851, 0.682254, 0.000068, 0.009981, 0.000981, 0.239388, 0.014351, 0.256283, 0.208924, 2.057449, 0.067554, 1.243753, 0.224397, 0, 17.634677, 2.075154, 0.524647, 4.971507, 0.643789, 0.936840, 0.454347, 0.318595, 0.000000, 0.008844, 0.000628, 0.64316 [...]
+{0.000093, 0.143614, 0.002840, 0.060699, 0.003390, 1.118208, 0.187826, 0.725836, 0.046586, 0.487814, 0.000932, 0.325422, 0.053908, 0.000330, 0.187880, 0.014540, 0.034916, 0.000959, 0.532092, 0.074161, 0.095418, 0.460970, 2.203539, 0.377447, 0.985145, 0.003180, 0.863191, 0.016636, 0.065212, 0.025405, 0.175491, 0.020837, 0.219170, 0.296066, 1.346385, 0.259909, 0.822133, 17.634677, 0, 0.413957, 1.038682, 0.586685, 4.127466, 0.273855, 0.600415, 0.000295, 0.215492, 0.002362, 0.013582, 0.00132 [...]
+{0.148268, 0.005996, 0.612660, 0.004963, 0.340991, 0.020909, 1.496628, 0.000459, 0.467136, 0.042942, 0.099519, 0.004316, 0.051005, 0.060922, 0.002143, 0.433620, 0.000035, 0.247195, 0.012394, 1.042457, 0.000410, 0.899262, 0.143479, 3.215817, 0.285384, 1.769879, 0.296358, 3.065510, 0.011032, 0.221536, 0.023020, 0.667397, 0.275355, 0.878163, 0.089476, 1.523251, 0.199589, 2.075154, 0.413957, 0, 12.931524, 1.293860, 0.334224, 5.815294, 1.868194, 0.201480, 0.001930, 0.708204, 0.000193, 0.21624 [...]
+{0.013122, 0.043609, 0.000062, 0.333780, 0.156468, 0.251650, 0.004438, 0.768607, 0.072867, 0.140864, 0.011489, 0.034794, 0.105226, 0.039362, 0.022384, 0.000679, 0.133032, 0.220816, 0.303613, 0.012002, 0.561523, 0.324525, 0.571469, 0.461383, 2.285052, 0.560831, 2.721043, 0.034519, 3.832200, 0.041440, 0.116405, 0.056267, 0.497593, 0.291009, 0.623366, 0.256174, 1.144639, 0.524647, 1.038682, 12.931524, 0, 0.389004, 0.928876, 1.197614, 7.316623, 0.072138, 0.056145, 0.000524, 0.311885, 0.26866 [...]
+{0.225554, 0.000047, 0.010929, 0.009289, 12.169045, 0.083636, 5.964323, 0.681575, 0.506470, 0.000180, 2.007768, 0.181794, 0.139046, 0.322807, 0.000060, 0.009512, 0.000105, 1.035015, 0.000288, 0.021048, 0.001066, 1.293228, 0.000453, 1.177718, 0.083261, 0.772349, 0.018146, 0.530881, 0.025006, 0.359183, 0.018727, 0.269862, 0.306375, 4.943439, 0.275865, 2.397415, 0.563566, 4.971507, 0.586685, 1.293860, 0.389004, 0, 28.579806, 1.644621, 1.477696, 0.501456, 0.000097, 0.006305, 0.001358, 2.3230 [...]
+{0.000093, 0.166706, 0.000432, 0.005790, 0.094762, 10.892976, 1.049877, 9.818281, 0.000116, 0.346890, 0.248099, 1.372357, 0.167138, 0.000330, 0.300513, 0.002718, 0.017300, 0.001247, 1.337629, 0.005195, 0.104681, 0.005060, 1.282522, 0.232701, 1.418383, 0.387941, 1.320875, 0.354545, 1.360141, 0.031140, 0.238533, 0.021539, 0.304581, 0.622868, 4.699375, 0.441084, 2.871848, 0.643789, 4.127466, 0.334224, 0.928876, 28.579806, 0, 0.403913, 1.286990, 0.000219, 0.381287, 0.000657, 0.004160, 0.0053 [...]
+{0.140516, 0.012600, 0.423774, 0.001718, 0.047890, 0.002044, 1.094736, 0.000115, 0.424321, 0.060909, 0.144388, 0.030883, 0.145245, 0.004747, 0.000060, 0.409432, 0.000000, 0.011511, 0.000384, 0.493508, 0.000000, 0.411115, 0.025544, 1.242140, 0.000289, 17.450524, 1.113671, 31.949764, 2.418859, 0.116039, 0.012331, 0.780008, 0.305714, 0.432918, 0.021698, 1.316696, 0.087905, 0.936840, 0.273855, 5.815294, 1.197614, 1.644621, 0.403913, 0, 43.916187, 0.032116, 0.000205, 0.560642, 0.000103, 0.013 [...]
+{0.083310, 0.056771, 0.000247, 0.506841, 0.063994, 0.028715, 0.009261, 0.514392, 0.200499, 0.269510, 0.122186, 0.070533, 0.496706, 0.009560, 0.000952, 0.000951, 0.040320, 0.060432, 0.033244, 0.009225, 0.273876, 0.140943, 0.169022, 0.003786, 1.148387, 6.798629, 4.087042, 15.287419, 18.531553, 0.093542, 0.062369, 0.317466, 0.905810, 0.309656, 0.140701, 0.511968, 0.765495, 0.454347, 0.600415, 1.868194, 7.316623, 1.477696, 1.286990, 43.916187, 0, 0.051709, 0.002062, 0.002062, 0.314379, 0.045 [...]
+{0.863970, 0.065905, 0.748196, 0.529619, 0.563995, 0.000186, 0.002219, 0.000115, 0.571505, 0.000359, 1.598824, 0.004316, 0.038763, 1.897150, 0.072866, 0.555104, 0.011580, 0.708395, 0.000192, 0.009225, 0.000246, 0.338207, 0.000091, 0.150804, 0.009600, 0.336828, 0.000000, 0.003743, 0.000000, 6.546163, 0.575921, 2.577578, 0.430124, 2.898791, 0.003020, 0.056250, 0.004868, 0.318595, 0.000295, 0.201480, 0.072138, 0.501456, 0.000219, 0.032116, 0.051709, 0, 10.956917, 25.313949, 8.832621, 2.6004 [...]
+{0.026338, 0.946136, 0.005990, 0.140867, 0.000085, 0.396897, 0.000096, 0.001261, 0.000116, 0.582801, 0.001087, 1.273908, 0.092044, 0.105361, 2.720153, 0.043756, 1.085170, 0.000192, 0.760090, 0.000537, 0.031642, 0.000375, 0.491034, 0.006757, 0.069320, 0.000589, 0.648523, 0.001871, 0.005026, 0.458622, 7.487816, 0.154207, 0.350473, 0.001027, 2.862216, 0.002515, 0.010298, 0.000000, 0.215492, 0.001930, 0.056145, 0.000097, 0.381287, 0.000205, 0.002062, 10.956917, 0, 5.637509, 18.744445, 0.1319 [...]
+{0.565566, 0.047403, 2.299543, 0.762425, 0.001356, 0.000279, 0.813720, 0.000115, 0.236179, 0.060430, 0.754233, 0.086986, 0.058616, 0.509595, 0.031730, 2.047159, 0.020529, 0.001151, 0.000192, 0.732111, 0.000082, 0.019586, 0.002808, 0.606945, 0.000145, 0.000353, 0.000000, 0.255147, 0.000000, 2.581654, 0.313779, 11.271062, 0.569076, 0.009008, 0.001957, 3.879355, 0.002528, 0.008844, 0.002362, 0.708204, 0.000524, 0.006305, 0.000657, 0.560642, 0.002062, 25.313949, 5.637509, 0, 13.945647, 0.662 [...]
+{0.068927, 0.371072, 0.024699, 1.108802, 0.000254, 0.001394, 0.000772, 0.451899, 0.009630, 0.116309, 0.126844, 0.530278, 0.277072, 0.091844, 0.477439, 0.173122, 2.262490, 0.000384, 0.001537, 0.000717, 0.602428, 0.032237, 0.044112, 0.000466, 0.475496, 0.001413, 0.003287, 0.000832, 0.701399, 0.953353, 3.487342, 0.911193, 1.399673, 0.003635, 0.089643, 0.011433, 3.092500, 0.000628, 0.013582, 0.000193, 0.311885, 0.001358, 0.004160, 0.000103, 0.314379, 8.832621, 18.744445, 13.945647, 0, 0.1522 [...]
+{0.483563, 0.000234, 0.008892, 0.035630, 3.994417, 0.771771, 1.825878, 0.250545, 0.370309, 0.000419, 1.899865, 0.011733, 0.035860, 0.879741, 0.000417, 0.004077, 0.000772, 1.272426, 0.073021, 0.346978, 0.013526, 0.420580, 0.000091, 0.272950, 0.040907, 0.324227, 0.000000, 0.001871, 0.000000, 0.536332, 0.000253, 0.001795, 0.451134, 2.359362, 0.120121, 0.324162, 0.108501, 0.643160, 0.001329, 0.216244, 0.268662, 2.323091, 0.005328, 0.013852, 0.045374, 2.600428, 0.131929, 0.662578, 0.152215, 0 [...]
+{0.000093, 0.512203, 0.000000, 0.001654, 0.111968, 3.452570, 0.084218, 1.978448, 0.000058, 0.380788, 0.000466, 1.514097, 0.044178, 0.000132, 1.191514, 0.000136, 0.103766, 0.022062, 1.394892, 0.013077, 0.971148, 0.000562, 0.696016, 0.018814, 0.634927, 0.000236, 1.610248, 0.000416, 0.020471, 0.000040, 0.536362, 0.000000, 0.169264, 0.038559, 2.159328, 0.019665, 0.498504, 0.000045, 0.565968, 0.005500, 0.373948, 0.000485, 2.214735, 0.000000, 0.001768, 0.046583, 2.620833, 0.028569, 0.682579, 9 [...]
+{0.109975, 0.016535, 1.041312, 0.019406, 1.931350, 0.558500, 4.380679, 0.505677, 0.176829, 0.034737, 0.806554, 0.297371, 0.031466, 0.002374, 0.000357, 0.741135, 0.000351, 0.335924, 0.069754, 1.236457, 0.087384, 0.039265, 0.004982, 1.274118, 0.002219, 0.000589, 0.000068, 0.286547, 0.000123, 0.002262, 0.000589, 0.983926, 0.517896, 0.381796, 0.077341, 2.735831, 0.318574, 0.084620, 0.041435, 0.923644, 0.004382, 0.126382, 0.063353, 0.461729, 0.004420, 0.718719, 0.092405, 3.415722, 0.415718, 2 [...]
+{0.005884, 0.074851, 0.000000, 0.220908, 0.103323, 1.262618, 0.150589, 4.658653, 0.027035, 0.106187, 0.028567, 0.586111, 0.446015, 0.000066, 0.000893, 0.000000, 1.524024, 0.014101, 0.417565, 0.017824, 1.950083, 0.080124, 0.190037, 0.001165, 1.544626, 0.001531, 0.083744, 0.000624, 3.409178, 0.000081, 0.004629, 0.000078, 0.837302, 0.023862, 0.728891, 0.049848, 2.866325, 0.003771, 0.068501, 0.000482, 0.759132, 0.006402, 0.200205, 0.000000, 0.187832, 0.054049, 0.968351, 0.081861, 2.211488, 5 [...]
+{0.064397, 0.000000, 0.042112, 0.038557, 1.120532, 0.003717, 0.348448, 0.117533, 0.223763, 0.015452, 0.099985, 0.000135, 0.028249, 0.129492, 0.000000, 0.012366, 0.000491, 0.661776, 0.000769, 0.147873, 0.031560, 0.746792, 0.046739, 0.706782, 0.130873, 0.162525, 0.000000, 0.007070, 0.000368, 0.066966, 0.000042, 0.001171, 0.059065, 0.928969, 0.000559, 0.092988, 0.042595, 3.529593, 0.371685, 0.604859, 0.188097, 1.702817, 0.012481, 0.030474, 0.015763, 0.153418, 0.007112, 0.078381, 0.011491, 0 [...]
+{0.000000, 0.055366, 0.000062, 0.006808, 0.000254, 1.023142, 0.007428, 0.670108, 0.010037, 0.184704, 0.000000, 0.071612, 0.066384, 0.000066, 0.135255, 0.001359, 0.015686, 0.000096, 0.976175, 0.003672, 0.644235, 0.100928, 0.975727, 0.121389, 0.928319, 0.000236, 0.915505, 0.009981, 0.150527, 0.000000, 0.032447, 0.000000, 0.011379, 0.000158, 1.013424, 0.003354, 0.095207, 0.167041, 2.729647, 0.053168, 0.426684, 0.000388, 2.005334, 0.000718, 0.008986, 0.004101, 0.119062, 0.006776, 0.041280, 0 [...]
+{0.084945, 0.006464, 0.287373, 0.005472, 0.330481, 0.085680, 1.265487, 0.002179, 0.257122, 0.043721, 0.028878, 0.003641, 0.009966, 0.039560, 0.002679, 0.313495, 0.000140, 0.184749, 0.105112, 0.890822, 0.005410, 0.452442, 0.106069, 3.081614, 0.536567, 0.034978, 0.025678, 0.440217, 0.000858, 0.038612, 0.009174, 0.361403, 0.033994, 0.251423, 0.109664, 1.164866, 0.003464, 0.975582, 0.193544, 2.258321, 0.308851, 0.832592, 0.308372, 0.668173, 0.004420, 0.276499, 0.042565, 0.469281, 0.055025, 0 [...]
+{0.010974, 0.034428, 0.000000, 0.159955, 0.042380, 0.283432, 0.001061, 1.029128, 0.042815, 0.136432, 0.014439, 0.013216, 0.137634, 0.004220, 0.010061, 0.000136, 0.176300, 0.034437, 0.294294, 0.001791, 0.990330, 0.159217, 0.566034, 0.343314, 3.036767, 0.007891, 0.528692, 0.001040, 2.171984, 0.003312, 0.031984, 0.000078, 0.262465, 0.033581, 0.360196, 0.000838, 1.447392, 0.149578, 0.372719, 0.159248, 1.563846, 0.129098, 0.822643, 0.000410, 1.195790, 0.049842, 0.245019, 0.053017, 0.362328, 0 [...]
+{0.164659, 0.000141, 0.000741, 0.003881, 0.976185, 0.001951, 0.011673, 0.007109, 0.130940, 0.000120, 0.420899, 0.045044, 0.039313, 0.169777, 0.000060, 0.000272, 0.000175, 0.418802, 0.000288, 0.002508, 0.001312, 0.388156, 0.000091, 0.042812, 0.003377, 0.241197, 0.004656, 0.042005, 0.011768, 0.069995, 0.000000, 0.000156, 0.027479, 0.380374, 0.000112, 0.000534, 0.000374, 1.322234, 0.005905, 0.048730, 0.021649, 2.382451, 0.326035, 0.037657, 0.047437, 0.164143, 0.016776, 0.072521, 0.024883, 1 [...]
+{0.000000, 0.172889, 0.000000, 0.000191, 0.000085, 0.880032, 0.000289, 0.356038, 0.000058, 0.127388, 0.007608, 0.309374, 0.105305, 0.000000, 0.240505, 0.000000, 0.047268, 0.000096, 0.636916, 0.000090, 0.395771, 0.000843, 0.566759, 0.016193, 0.336277, 0.021435, 0.676049, 0.008942, 0.703728, 0.000283, 0.055425, 0.000000, 0.018603, 0.000000, 0.518903, 0.000000, 0.006459, 0.001122, 1.110726, 0.002863, 0.176224, 0.054025, 2.392606, 0.000821, 0.012227, 0.002050, 0.201477, 0.001557, 0.051048, 0 [...]
+{0.113991, 0.018315, 0.201112, 0.001082, 0.012121, 0.001951, 1.720919, 0.001720, 0.082323, 0.029826, 0.197641, 0.061497, 0.073682, 0.000330, 0.000060, 0.165784, 0.000070, 0.003549, 0.000384, 0.556204, 0.000164, 0.097554, 0.004982, 0.551493, 0.000289, 0.015310, 0.000753, 0.247245, 0.010419, 0.000283, 0.000084, 0.194319, 0.037724, 0.002449, 0.000112, 0.466770, 0.000187, 0.909861, 0.280400, 0.713961, 0.001760, 1.179053, 0.298738, 0.938439, 0.165587, 0.080337, 0.009773, 0.324696, 0.016839, 0 [...]
+{0.018773, 0.032039, 0.000000, 0.175861, 0.002797, 0.002974, 0.003376, 2.163175, 0.007948, 0.014314, 0.105884, 0.183952, 0.381671, 0.000066, 0.000119, 0.000000, 0.185038, 0.001918, 0.001441, 0.001254, 0.703092, 0.084060, 0.053714, 0.003029, 0.634203, 0.043222, 0.097165, 0.143481, 0.590833, 0.000081, 0.000295, 0.000078, 0.410199, 0.000553, 0.000447, 0.000610, 0.716441, 0.194964, 0.293884, 0.001158, 0.744000, 0.684968, 1.149846, 0.069567, 1.558784, 0.032177, 0.064227, 0.074536, 0.276276, 0 [...]
+}
+
+{ 
+{0.021414, 0.021349, 0.016195, 0.015717, 0.011798, 0.010761, 0.010366, 0.008721, 0.017237, 0.016697, 0.006441, 0.007415, 0.012744, 0.015167, 0.016798, 0.007359, 0.028497, 0.010425, 0.010408, 0.011165, 0.012199, 0.010671, 0.011040, 0.017168, 0.020730, 0.008491, 0.014604, 0.004809, 0.008158, 0.024759, 0.023762, 0.012814, 0.021180, 0.012656, 0.017882, 0.013120, 0.010682, 0.022276, 0.020321, 0.031090, 0.026699, 0.010310, 0.013701, 0.009746, 0.006788, 0.019020, 0.018419, 0.010921, 0.022626, 0 [...]
+}
+
diff --git a/res/TemplateBatchFiles/TemplateModels/F81.mdl b/res/TemplateBatchFiles/TemplateModels/F81.mdl
new file mode 100644
index 0000000..e5df156
--- /dev/null
+++ b/res/TemplateBatchFiles/TemplateModels/F81.mdl
@@ -0,0 +1,54 @@
+/* This file defines the transition matrix for the F81 model
+   The file should be used as follows:
+   
+   1) Read Data File and create datafilter filteredData
+   2) #include this file (or use SelectTemplateModel(filteredData);)
+   3) Define the tree
+   4) Proceed with the likelihood function using 'vectorOfFrequencies' as the vector to pass to the constructor.
+   
+   This model has the following signature:
+    #Short:F81#
+   	#Desc:Felsenstein 81 (F81). Gamma variation optional.#
+   	#Dimension:4#
+    #DataType:nucleotide#
+   	#FileName:F81.mdl#
+   
+   08/18/1999  by Sergei L. Kosakovsky Pond
+*/
+
+#include "modelParameters2.mdl";
+
+if (modelType > 0)
+{
+	if (modelType == 1)
+	{
+		#include "defineGamma.mdl";
+	}
+	if (modelType == 2)
+	{
+		#include "defineHM.mdl";
+	}
+}
+
+function PopulateModelMatrix (ModelMatrixName&, EFV)
+{
+	if (modelType == 0)
+	{
+		ModelMatrixName = {{*,t,t,t}{t,*,t,t}{t,t,*,t}{t,t,t,*}};
+	}
+	else
+	{
+		ModelMatrixName = {{*,t*c,t*c,t*c}{t*c,*,t*c,t*c}{t*c,t*c,*,t*c}{t*c,t*c,t*c,*}};
+	}
+	return 1;
+}
+
+F81 = 0;
+
+HarvestFrequencies (vectorOfFrequencies, filteredData,1,1,0);
+
+MULTIPLY_BY_FREQS = PopulateModelMatrix ("F81",vectorOfFrequencies);
+
+Model F81model = (F81, vectorOfFrequencies, MULTIPLY_BY_FREQS);
+
+FREQUENCY_SENSITIVE = 1;
diff --git a/res/TemplateBatchFiles/TemplateModels/F81_binary.mdl b/res/TemplateBatchFiles/TemplateModels/F81_binary.mdl
new file mode 100644
index 0000000..9e73ec9
--- /dev/null
+++ b/res/TemplateBatchFiles/TemplateModels/F81_binary.mdl
@@ -0,0 +1,49 @@
+/* This file defines the transition matrix for the F81 model
+   The file should be used as follows:
+   
+   1) Read Data File and create datafilter filteredData
+   2) #include this file (or use SelectTemplateModel(filteredData);)
+   3) Define the tree
+   4) Proceed with the likelihood function using 'vectorOfFrequencies' as the vector to pass to the constructor.
+   
+   This model has the following signature:
+    #Short:F81#
+   	#Desc:Felsenstein 81 (F81). Gamma variation optional.#
+   	#Dimension:2#
+    #DataType:binary
+   	#FileName:F81_binary.mdl#
+   
+   10/02/2007  by Sergei L. Kosakovsky Pond
+*/
+
+#include "modelParameters2.mdl";
+
+if (modelType > 0)
+{
+	if (modelType == 1)
+	{
+		#include "defineGamma.mdl";
+	}
+	if (modelType == 2)
+	{
+		#include "defineHM.mdl";
+	}
+}
+
+function PopulateModelMatrix (ModelMatrixName&, EFV)
+{
+	if (modelType == 0)
+	{
+		ModelMatrixName = {{*,t}{t,*}};
+	}
+	else
+	{
+		ModelMatrixName = {{*,t*c}{t*c,*}};
+	}
+	return 1;
+}
+
+HarvestFrequencies (vectorOfFrequencies, filteredData,1,1,0);
+MULTIPLY_BY_FREQS = PopulateModelMatrix ("F81_Binary",vectorOfFrequencies);
+Model F81Bmodel = (F81_Binary, vectorOfFrequencies, MULTIPLY_BY_FREQS);
+FREQUENCY_SENSITIVE = 1;
diff --git a/res/TemplateBatchFiles/TemplateModels/F84.mdl b/res/TemplateBatchFiles/TemplateModels/F84.mdl
new file mode 100644
index 0000000..f5c9eff
--- /dev/null
+++ b/res/TemplateBatchFiles/TemplateModels/F84.mdl
@@ -0,0 +1,96 @@
+/* This file defines the transition matrix for the F84 model
+   The file should be used as follows:
+   
+   1) Read Data File and create datafilter filteredData
+   2) #include this file (or use SelectTemplateModel(filteredData);)
+   3) Define the tree
+   4) Proceed with the likelihood function using 'vectorOfFrequencies' as the vector to pass to the constructor.
+   
+   This model has the following signature:
+    #Short:F84#
+   	#Desc:Felsenstein 84. Gamma variation optional.#
+   	#Dimension:4#
+    #DataType:nucleotide#
+   	#FileName:F84.mdl#
+   
+   08/18/1999  by Sergei L. Kosakovsky Pond
+   Modified on 03/06/2000 to comply with the new model syntax
+*/
+
+HarvestFrequencies (vectorOfFrequencies, filteredData,1,1,0);
+
+
+global K = 1;
+
+
+#include "modelParameters2.mdl";
+
+if (modelType > 0)
+{
+	global alpha = .5;
+	alpha:>0.01;alpha:<100;
+	if (modelType == 1)
+	{
+		#include "defineGamma.mdl";
+	}
+	if (modelType == 2)
+	{
+		#include "defineHM.mdl";
+	}
+}
+
+function PopulateModelMatrix (ModelMatrixName&, EFV)
+{	
+	if (!EMBED_FREQUENCY_DEPENDENCE)
+	{
+		piA = EFV[0][0];
+		piC = EFV[1][0];
+		piG = EFV[2][0];
+		piT = EFV[3][0];
+		piY = piC+piT;
+		piR = piA+piG;
+		
+		if (modelType == 0)
+		{
+			ModelMatrixName = {{*,t*piC__,t*piG__*(1+K/piR__),t*piT__}{t*piA__,*,t*piG__,t*piT__*(1+K/piY__)}
+	       	 				   {t*(1+K/piR__)*piA__,t*piC__,*,t*piT__}{t*piA__,t*piC__*(1+K/piY__),t*piG__,*}};		
+		}
+		else
+		{
+			ModelMatrixName = {{*,c*t*piC__,c*t*piG__*(1+K/piR__),c*t*piT__}{c*t*piA__,*,c*t*piG__,c*t*piT__*(1+K/piY__)}
+		       {c*t*(1+K/piR__)*piA__,c*t*piC__,*,c*t*piT__}{c*t*piA__,c*t*piC__*(1+K/piY__),c*t*piG__,*}};
+		}
+	}
+	else
+	{
+		piA := vectorOfFrequencies[0];
+		piC := vectorOfFrequencies[1];
+		piG := vectorOfFrequencies[2];
+		piT := vectorOfFrequencies[3];
+		piY := piC+piT;
+		piR := piA+piG;
+		
+		if (modelType == 0)
+		{
+			ModelMatrixName = {{*,t*piC,t*piG*(1+K/piR),t*piT}{t*piA,*,t*piG,t*piT*(1+K/piY)}
+	       	 				   {t*(1+K/piR)*piA,t*piC,*,t*piT}{t*piA,t*piC*(1+K/piY),t*piG,*}};		
+		}
+		else
+		{
+			ModelMatrixName = {{*,c*t*piC,c*t*piG*(1+K/piR),c*t*piT}{c*t*piA,*,c*t*piG,c*t*piT*(1+K/piY)}
+		       {c*t*(1+K/piR)*piA,c*t*piC,*,c*t*piT}{c*t*piA,c*t*piC*(1+K/piY),c*t*piG,*}};
+		}
+	}
+	
+	return 0;
+}
+
+F84 = {4,4};
+
+MULTIPLY_BY_FREQUENCIES = PopulateModelMatrix ("F84", vectorOfFrequencies);
+
+FREQUENCY_SENSITIVE = 1;
+
+Model F84model = (F84,vectorOfFrequencies,0);
+
+
diff --git a/res/TemplateBatchFiles/TemplateModels/F84P.mdl b/res/TemplateBatchFiles/TemplateModels/F84P.mdl
new file mode 100644
index 0000000..fd47425
--- /dev/null
+++ b/res/TemplateBatchFiles/TemplateModels/F84P.mdl
@@ -0,0 +1,146 @@
+/* This file defines the transition matrix for the F84 model
+   The file should be used as follows:
+   
+   1) Read Data File and create datafilter filteredData
+   2) #include this file (or use SelectTemplateModel(filteredData);)
+   3) Define the tree
+   4) Proceed with the likelihood function using 'vectorOfFrequencies' as the vector to pass to the constructor.
+   
+   This model has the following signature:
+    #Short:F84P#
+   	#Desc:Felsenstein 84 (PHYLIP dnaml compatible version). Gamma variation optional.#
+   	#Dimension:4#
+    #DataType:nucleotide#
+   	#FileName:F84P.mdl#
+   
+   08/18/1999  by Sergei L. Kosakovsky Pond
+   Modified on 03/06/2000 to comply with the new model syntax
+*/
+
+HarvestFrequencies (vectorOfFrequencies, filteredData,1,1,0);
+
+
+global K = 1;
+global R = 1;
+
+
+ChoiceList (modelType,"Model Options",1,SKIP_NONE,
+		"Single Rate Class","Rates are fixed.",
+		"Multiple Rate Classes","Rates come from several classes (user will define the classes)."
+);
+	
+if (modelType<0)
+{
+	return;
+}
+
+if (modelType > 0)
+{
+	resp = 0;
+	while (resp<=0)
+	{
+		fprintf (stdout,"\nHow many rate classes should we have?");
+		fscanf  (stdin,"Number", resp);
+	}
+	
+	classMatrix = {resp,1};
+	
+	for (k=0;k<resp;k=k+1)
+	{
+		fprintf (stdout,"Rate for the ",Format(k+1,0,0)," class:");
+		fscanf  (stdin,"Number",classRate);
+		classMatrix[k]:= classRate__;
+	}
+	
+	fprintf (stdout,"\n\n Using the following rates:", classMatrix);
+	
+	fprintf (stdout,"\nCustom probabilities for rate classes (n=all equally probable,y=define your own)?");
+	
+	fscanf  (stdin,"String", fr);
+	
+	if ((fr=="y")||(fr=="Y"))
+	{
+		sum = 0;
+		cFreqMatrix = {resp,1};
+		for (k=0;k<resp-1;k=k+1)
+		{
+			fprintf (stdout,"Probability for the ",Format(k+1,0,0)," class[0,",1.0-sum,"]:");
+			fscanf  (stdin,"Number",classRate);
+			sum = sum+classRate;
+			if ((sum>1)||(classRate<0))
+			{
+				fprintf (stdout,"\nThis is an invalid choice! Try again!\n");
+				k=k-1;
+				sum = sum-classRate;
+			}
+			else
+			{
+				cFreqMatrix[k] = classRate;
+			}
+		}
+		cFreqMatrix[k] = 1-sum;
+		fprintf (stdout,"\n\n Using the following class probabilities:", cFreqMatrix);
+		category c = (resp, cFreqMatrix, MEAN, , classMatrix , 0 , 1e25);
+	}
+	else
+	{
+		category c = (resp, EQUAL, MEAN, , classMatrix , 0 , 1e25);
+	}
+	
+	categoriesUsed = 1;
+}
+
+piY = vectorOfFrequencies[1]+vectorOfFrequencies[3];
+piR = vectorOfFrequencies[0]+vectorOfFrequencies[2];
+a =  (vectorOfFrequencies[0]*vectorOfFrequencies[2]+vectorOfFrequencies[1]*vectorOfFrequencies[3])/(piR*piY);
+
+R = 0;
+
+while (R<a)
+{
+	fprintf (stdout, "\nPlease enter the transition/transvertion ratio desired. For this data set R must be at least ",a,". Ratio=?");
+	fscanf (stdin,"Number",R);
+}
+
+function PopulateModelMatrix (ModelMatrixName&, EFV)
+{	
+	if (!EMBED_FREQUENCY_DEPENDENCE)
+	{
+		piA = EFV[0][0];
+		piC = EFV[1][0];
+		piG = EFV[2][0];
+		piT = EFV[3][0];
+		piY = piC+piT;
+		piR = piA+piG;
+		
+		K = (R*piR*piY-piA*piG-piC*piT)/(piA*piG/piR+piC*piT/piY);
+		
+		if (modelType == 0)
+		{
+			ModelMatrixName = {{*,a*piC__,a*piG__*(1+K__/piR__),a*piT__}{a*piA__,*,a*piG__,a*piT__*(1+K__/piY__)}
+	       	 				   {a*(1+K__/piR__)*piA__,a*piC__,*,a*piT__}{a*piA__,a*piC__*(1+K__/piY__),a*piG__,*}};		
+		}
+		else
+		{
+			ModelMatrixName = {{*,c*a*piC__,c*a*piG__*(1+K__/piR__),c*a*piT__}{c*a*piA__,*,c*a*piG__,c*a*piT__*(1+K__/piY__)}
+		       {c*a*(1+K__/piR__)*piA__,c*a*piC__,*,c*a*piT__}{c*a*piA__,c*a*piC__*(1+K__/piY__),c*a*piG__,*}};
+		}
+	}
+	else
+	{
+		fprintf (stdout, "\nSorry, this model cannot be used for frequency estimation. Try general F84 instead.");
+		return 0;
+	}
+	
+	return 0;
+}
+
+F84P = {4,4};
+
+MULTIPLY_BY_FREQUENCIES = PopulateModelMatrix ("F84P", vectorOfFrequencies);
+
+FREQUENCY_SENSITIVE = 1;
+
+Model F84Pmodel = (F84P,vectorOfFrequencies,0);
+
+
diff --git a/res/TemplateBatchFiles/TemplateModels/GRM.mdl b/res/TemplateBatchFiles/TemplateModels/GRM.mdl
new file mode 100644
index 0000000..d0eeb33
--- /dev/null
+++ b/res/TemplateBatchFiles/TemplateModels/GRM.mdl
@@ -0,0 +1,71 @@
+/* This file defines the transition matrix for the General Reversible model
+   The file should be used as follows:
+   
+   1) Read Data File and create datafilter filteredData
+   2) #include this file (or use SelectTemplateModel(filteredData);)
+   3) Define the tree
+   4) Proceed with the likelihood function using 'vectorOfFrequencies' as the vector to pass to the constructor.
+   
+   This model has the following signature:
+    #Short:GRM#
+   	#Desc:General Reversible Model. Local or global parameters. Possible Gamma Variation.#
+   	#Dimension:4#
+    #DataType:nucleotide#
+   	#FileName:GRM.mdl#
+   
+   08/18/1999  by Sergei L. Kosakovsky Pond
+   Modified on 03/06/2000 to comply with the new Model syntax.
+*/
+
+#include "modelParameters.mdl";
+
+if (modelType >= 1)
+{
+	global AC = 1;
+	global AT = 1;
+	global CG = 1;
+	global CT = 1;
+	global GT = 1;
+	
+	if (modelType == 2)
+	{
+		#include "defineGamma.mdl";
+	}
+	if (modelType == 3)
+	{
+		#include "defineHM.mdl";
+	}
+}
+
+function PopulateModelMatrix (ModelMatrixName&, EFV)
+{
+	if (modelType == 0)
+	{
+		ModelMatrixName = {{*,a,b,c}{a,*,d,e}{b,d,*,f}{c,e,f,*}};
+	}
+	else
+	{
+		if (modelType<2)
+		{
+			ModelMatrixName = {{*,AC*mu,mu,AT*mu}{AC*mu,*,CG*mu,CT*mu}{mu,CG*mu,*,GT*mu}{AT*mu,CT*mu,GT*mu,*}};
+		}
+		else
+		{
+			ModelMatrixName = {{*,AC*mu*c,mu*c,AT*mu*c}{AC*mu*c,*,CG*mu*c,CT*mu*c}{mu*c,CG*mu*c,*,GT*mu*c}{AT*mu*c,CT*mu*c,GT*mu*c,*}};
+		}
+	}
+	return 1;
+}
+
+GRM = 0;
+
+if (SKIP_HARVEST_FREQ == 0)
+{
+	HarvestFrequencies (vectorOfFrequencies, filteredData,1,1,0);
+}
+
+MULTIPLY_BY_FREQS = PopulateModelMatrix ("GRM",vectorOfFrequencies);
+
+Model GRMModel = (GRM, vectorOfFrequencies, MULTIPLY_BY_FREQS);
+
+FREQUENCY_SENSITIVE = 1;
diff --git a/res/TemplateBatchFiles/TemplateModels/GY94.ibf b/res/TemplateBatchFiles/TemplateModels/GY94.ibf
new file mode 100644
index 0000000..237f0f1
--- /dev/null
+++ b/res/TemplateBatchFiles/TemplateModels/GY94.ibf
@@ -0,0 +1,238 @@
+/* defines a sparse transition probabilities matrix 
+ now we'll go through the matrix and assign the elements based on syn/non-syn status*/
+
+function PopulateModelMatrix (ModelMatrixName&, EFV)
+{
+	ModelMatrixName = {ModelMatrixDimension,ModelMatrixDimension}; 
+
+	hshift = 0;
+
+	if (!ModelMatrixDimension)
+	{
+		ModelMatrixDimension = 64;
+		for (h = 0 ;h<64; h=h+1)
+		{
+			if (_Genetic_Code[h]==10)
+			{
+				ModelMatrixDimension = ModelMatrixDimension-1;
+			}
+		}
+	}
+	
+	ModelMatrixName = {ModelMatrixDimension,ModelMatrixDimension}; 
+
+	hshift = 0;
+
+	if (modelType == 0)
+	{
+		for (h=0; h<64; h=h+1)
+		{
+			if (_Genetic_Code[h]==10) 
+			{
+				hshift = hshift+1;
+				continue; 
+			}
+			vshift = hshift;
+			for (v = h+1; v<64; v=v+1)
+			{
+				diff = v-h;
+				if (_Genetic_Code[v]==10) 
+				{
+					vshift = vshift+1;
+					continue; 
+				}
+
+				if ((h$4==v$4)||((diff%4==0)&&(h$16==v$16))||(diff%16==0))
+				{
+					if (h$4==v$4)
+					{
+						transition = v%4;
+						transition2= h%4;
+					}
+					else
+					{
+						if(diff%16==0)
+						{
+							transition = v$16;
+							transition2= h$16;
+						}
+						else
+						{
+							transition = v%16$4;
+							transition2= h%16$4;
+						}
+					}
+					if (_Genetic_Code[0][h]==_Genetic_Code[0][v]) 
+					{
+			  			if (Abs(transition-transition2)%2)
+			  			{
+							ModelMatrixName[h-hshift][v-vshift] := synRate*kappa;
+							ModelMatrixName[v-vshift][h-hshift] := synRate*kappa;
+			  			}
+			  			else
+			  			{
+							ModelMatrixName[h-hshift][v-vshift] := synRate;
+							ModelMatrixName[v-vshift][h-hshift] := synRate;
+			  			}
+					}
+					else
+					{
+			  			if (Abs(transition-transition2)%2)
+			  			{
+							ModelMatrixName[h-hshift][v-vshift] := nonSynRate*kappa;
+							ModelMatrixName[v-vshift][h-hshift] := nonSynRate*kappa;
+			  			}
+			  			else
+			  			{
+							ModelMatrixName[h-hshift][v-vshift] := nonSynRate;
+							ModelMatrixName[v-vshift][h-hshift] := nonSynRate;
+			  			}
+					}
+				}
+		   }
+	    }		
+	}
+	else
+	{
+		if (modelType == 1)
+		{
+			for (h=0; h<64; h=h+1)
+			{
+				if (_Genetic_Code[h]==10) 
+				{
+					hshift = hshift+1;
+					continue; 
+				}
+				vshift = hshift;
+				for (v = h+1; v<64; v=v+1)
+				{
+					diff = v-h;
+					if (_Genetic_Code[v]==10) 
+					{
+						vshift = vshift+1;
+						continue; 
+					}
+					nucPosInCodon = 2;
+					if ((h$4==v$4)||((diff%4==0)&&(h$16==v$16))||(diff%16==0))
+					{
+						if (h$4==v$4)
+						{
+							transition = v%4;
+							transition2= h%4;
+						}
+						else
+						{
+							if(diff%16==0)
+							{
+								transition = v$16;
+								transition2= h$16;
+							}
+							else
+							{
+								transition = v%16$4;
+								transition2= h%16$4;
+							}
+						}
+						if (_Genetic_Code[0][h]==_Genetic_Code[0][v]) 
+						{
+				  			if (Abs(transition-transition2)%2)
+				  			{
+								ModelMatrixName[h-hshift][v-vshift] := synRate*kappa;
+								ModelMatrixName[v-vshift][h-hshift] := synRate*kappa;
+				  			}
+				  			else
+				  			{
+								ModelMatrixName[h-hshift][v-vshift] := synRate;
+								ModelMatrixName[v-vshift][h-hshift] := synRate;
+				  			}
+						}
+						else
+						{
+				  			if (Abs(transition-transition2)%2)
+				  			{
+								ModelMatrixName[h-hshift][v-vshift] := R*synRate*kappa;
+								ModelMatrixName[v-vshift][h-hshift] := R*synRate*kappa;
+				  			}
+				  			else
+				  			{
+								ModelMatrixName[h-hshift][v-vshift] := R*synRate;
+								ModelMatrixName[v-vshift][h-hshift] := R*synRate;
+				  			}
+						}
+					}
+			   }
+			 }
+		}
+		else
+		{
+			for (h=0; h<64; h=h+1)
+			{
+				if (_Genetic_Code[h]==10) 
+				{
+					hshift = hshift+1;
+					continue; 
+				}
+				vshift = hshift;
+				for (v = h+1; v<64; v=v+1)
+				{
+					diff = v-h;
+					if (_Genetic_Code[v]==10) 
+					{
+						vshift = vshift+1;
+						continue; 
+					}
+					nucPosInCodon = 2;
+					if ((h$4==v$4)||((diff%4==0)&&(h$16==v$16))||(diff%16==0))
+					{
+						if (h$4==v$4)
+						{
+							transition = v%4;
+							transition2= h%4;
+						}
+						else
+						{
+							if(diff%16==0)
+							{
+								transition = v$16;
+								transition2= h$16;
+							}
+							else
+							{
+								transition = v%16$4;
+								transition2= h%16$4;
+							}
+						}
+						if (_Genetic_Code[0][h]==_Genetic_Code[0][v]) 
+						{
+				  			if (Abs(transition-transition2)%2)
+				  			{
+								ModelMatrixName[h-hshift][v-vshift] := c*synRate*kappa;
+								ModelMatrixName[v-vshift][h-hshift] := c*synRate*kappa;
+				  			}
+				  			else
+				  			{
+								ModelMatrixName[h-hshift][v-vshift] := c*synRate;
+								ModelMatrixName[v-vshift][h-hshift] := c*synRate;
+				  			}
+						}
+						else
+						{
+				  			if (Abs(transition-transition2)%2)
+				  			{
+								ModelMatrixName[h-hshift][v-vshift] := c*R*synRate*kappa;
+								ModelMatrixName[v-vshift][h-hshift] := c*R*synRate*kappa;
+				  			}
+				  			else
+				  			{
+								ModelMatrixName[h-hshift][v-vshift] := c*R*synRate;
+								ModelMatrixName[v-vshift][h-hshift] := c*R*synRate;
+				  			}
+						}
+					}
+			   }
+			 }
+		}
+	}
+	
+	return 1;
+}
diff --git a/res/TemplateBatchFiles/TemplateModels/GY94.mdl b/res/TemplateBatchFiles/TemplateModels/GY94.mdl
new file mode 100644
index 0000000..9aa6ea6
--- /dev/null
+++ b/res/TemplateBatchFiles/TemplateModels/GY94.mdl
@@ -0,0 +1,100 @@
+/* This file defines the transition matrix for the Goldman-Yang 94 model.
+   The file should be used as follows:
+   
+   1) Read Data File and create datafilter filteredData
+   2) #include this file (or use SelectTemplateModel(filteredData);)
+   3) Define the tree
+   4) Proceed with the likelihood function using 'vectorOfFrequencies' as the vector to pass to the constructor.
+   
+   This model has the following signature:
+   	#Short:GY94#
+   	#Desc:Goldman-Yang 94 codon model. Local or global dS/dN ratios. Possible Gamma Variation.#
+   	#Dimension:*#
+    #DataType:codon#
+   	#FileName:GY94.mdl#
+   
+   04/09/2000  by Sergei L. Kosakovsky Pond
+*/
+
+ModelMatrixDimension = 0;
+
+if (!ModelMatrixDimension)
+{
+	ModelMatrixDimension = 64;
+	for (h = 0 ;h<64; h=h+1)
+	{
+		if (_Genetic_Code[h]==10)
+		{
+			ModelMatrixDimension = ModelMatrixDimension-1;
+		}
+	}
+}
+
+function BuildCodonFrequencies (obsF)
+{
+	PIStop = 1.0;
+	result = {ModelMatrixDimension,1};
+	hshift = 0;
+
+	for (h=0; h<64; h=h+1)
+	{
+		first = h$16;
+		second = h%16$4;
+		third = h%4;
+		if (_Genetic_Code[h]==10) 
+		{
+			hshift = hshift+1;
+			PIStop = PIStop-obsF[first][0]*obsF[second][0]*obsF[third][0];
+			continue; 
+		}
+		result[h-hshift][0]=obsF[first][0]*obsF[second][0]*obsF[third][0];
+	}
+	return result*(1.0/PIStop);
+}
+
+
+if (!SKIP_MODEL_PARAMETER_LIST)
+{
+	#include "modelParameters.mdl";
+}
+
+if (modelType<0)
+{
+	return;
+}
+
+if (SKIP_HARVEST_FREQ == 0)
+{
+	HarvestFrequencies (observedFreq,filteredData,1,1,0);
+}
+
+global kappa = 1;
+
+if (modelType>0)
+{
+	global R = .5;
+	
+	if (modelType == 2)
+	{
+		#include "defineGamma.mdl";
+	}
+	if (modelType == 3)
+	{
+		#include "defineHM.mdl";
+	}
+}
+
+
+#include "GY94.ibf";
+
+
+GY94 = 0;
+
+vectorOfFrequencies = BuildCodonFrequencies (observedFreq);
+
+MULTIPLY_BY_FREQS = PopulateModelMatrix ("GY94", observedFreq);
+
+FREQUENCY_SENSITIVE = 1;
+
+Model GY94model = (GY94,vectorOfFrequencies,1);
+
diff --git a/res/TemplateBatchFiles/TemplateModels/GY94customF3x4.mdl b/res/TemplateBatchFiles/TemplateModels/GY94customF3x4.mdl
new file mode 100644
index 0000000..296f097
--- /dev/null
+++ b/res/TemplateBatchFiles/TemplateModels/GY94customF3x4.mdl
@@ -0,0 +1,275 @@
+/* This file defines the transition matrix for the Goldman-Yang 94 model x an arbitrary 4x4 rate matrix
+   for nucleotide substituions.
+   
+   The file should be used as follows:
+   
+   1) Read Data File and create datafilter filteredData
+   2) #include this file (or use SelectTemplateModel(filteredData);)
+   3) Define the tree
+   4) Proceed with the likelihood function using 'vectorOfFrequencies' as the vector to pass to the constructor.
+   
+   This model has the following signature:
+   	#Short:MG94custom#
+   	#Desc:Muse-Gaut 94 x an arbitrary 4x4 rate matrix and 9 (3x4) frequency parameters. Possible Gamma Variation.#
+   	#Dimension:*#
+    #DataType:codon#
+   	#FileName:MG94custom.mdl#
+   
+   04/18/2002  by Sergei L. Kosakovsky Pond
+*/
+
+ModelMatrixDimension = 0;
+
+_MG94GlobalSuffix    = "";
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+_nucBiasMultipliers     = {{""   ,"AC*",""   ,"AT*"}
+						   {"AC*",""   ,"CG*","CT*"}
+						   {""   ,"CG*",""   ,"GT*"}
+						   {"AT*","CT*","GT*","" }
+						  };
+
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function makeLocalRateMult (_nbm)
+{
+	_localNucBiasMult = _nbm;
+	
+	for (h=0; h<4; h=h+1)
+	{
+		for (v=h+1; v<4; v=v+1)
+		{
+			aa1 = _nucBiasMultipliers[h][v];
+			if (Abs(aa1))
+			{
+				_gv = aa1[0][Abs(aa1)-2]+_MG94GlobalSuffix;
+				ExecuteCommands ("global "+_gv+"=1;\n");
+				_localNucBiasMult [h][v] = "*"+_gv;
+				_localNucBiasMult [v][h] = "*"+_gv;
+			}
+		}
+	}
+	return _localNucBiasMult;
+}
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function PopulateModelMatrix (ModelMatrixName&, EFV)
+{
+	if (!ModelMatrixDimension)
+	{
+		ModelMatrixDimension = 64 - (_Genetic_Code["_MATRIX_ELEMENT_VALUE_ == 10"]*Transpose(_Genetic_Code["1"]))[0];
+	}
+	
+	_localNucBiasMult = makeLocalRateMult(_nucBiasMultipliers);
+		
+	ModelMatrixName = {ModelMatrixDimension,ModelMatrixDimension}; 
+	
+	synCatRateMult 	  = "synRate";
+	nonsynCatRateMult = "nonSynRate";
+	if (modelType)
+	{
+		ExecuteCommands ("global R"+_MG94GlobalSuffix+"=1;");
+		nonsynCatRateMult =  "R"+_MG94GlobalSuffix+"*" + synCatRateMult;
+		if (modelType > 1)
+		{
+			synCatRateMult 	      = "c"+_MG94GlobalSuffix+"*" +synCatRateMult ;
+			nonsynCatRateMult 	  = "c"+_MG94GlobalSuffix+"*" +nonsynCatRateMult;
+		}
+	}
+		
+	modelDefString = "";
+	modelDefString*16384;
+	
+	hshift = 0;
+	
+	for (h=0; h<64; h=h+1)
+	{
+		if (_Genetic_Code[h]==10) 
+		{
+			hshift = hshift+1;
+			continue; 
+		}
+		vshift = hshift;
+		for (v = h+1; v<64; v=v+1)
+		{
+			diff = v-h;
+			if (_Genetic_Code[v]==10) 
+			{
+				vshift = vshift+1;
+				continue; 
+			}
+			nucPosInCodon = 2;
+			if ((h$4==v$4)||((diff%4==0)&&(h$16==v$16))||(diff%16==0))
+			{
+				if (h$4==v$4)
+				{
+					transition = v%4;
+					transition2= h%4;
+				}
+				else
+				{
+					if(diff%16==0)
+					{
+						transition = v$16;
+						transition2= h$16;
+						nucPosInCodon = 0;
+					}
+					else
+					{
+						transition = v%16$4;
+						transition2= h%16$4;
+						nucPosInCodon = 1;
+					}
+				}
+				hs = Format(h-hshift,0,0);
+				vs = Format(v-vshift,0,0);
+				ts = Format(transition,0,0);
+				ts2= Format(transition2,0,0);
+				ps = Format(nucPosInCodon,0,0);
+				aa1 = _Genetic_Code[0][h];
+				aa2 = _Genetic_Code[0][v];
+				
+				if (aa1==aa2) 
+				{
+					modelDefString*("ModelMatrixName["+hs+"]["+vs+"] := "+synCatRateMult+_localNucBiasMult[transition][transition2]+";\n"+
+													 "ModelMatrixName["+vs+"]["+hs+"] := "+synCatRateMult+_localNucBiasMult[transition][transition2]+";\n");
+				}
+				else
+				{
+					modelDefString*("ModelMatrixName["+hs+"]["+vs+"] := "+nonsynCatRateMult+_localNucBiasMult[transition][transition2]+";\n"+
+													 "ModelMatrixName["+vs+"]["+hs+"] := "+nonsynCatRateMult+_localNucBiasMult[transition][transition2]+";\n");						
+				}
+			}
+	    }
+    }		
+	modelDefString*0;
+	ExecuteCommands (modelDefString);
+
+	if (Abs(MGCustomModelConstraintString))
+	{
+		ExecuteCommands (MGCustomModelConstraintString);
+	}
+	return 0;
+}
+
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function PrepAConstraint 	   (modelDesc)
+{
+	MGCustomModelConstraintString = "";
+	MGCustomModelConstraintString * 128;
+
+	for (customLoopCounter2=1; customLoopCounter2<6; customLoopCounter2=customLoopCounter2+1)
+	{
+		for (customLoopCounter=0; customLoopCounter<customLoopCounter2; customLoopCounter=customLoopCounter+1)
+		{
+			if (modelDesc[customLoopCounter2]==modelDesc[customLoopCounter])
+			{
+				if (MGCustomRateBiasTerms[customLoopCounter2] == "1")
+				{
+					MGCustomModelConstraintString * (MGCustomRateBiasTerms[customLoopCounter]+_MG94GlobalSuffix+":="+MGCustomRateBiasTerms[customLoopCounter2]+";");
+				}
+				else
+				{
+					if (MGCustomRateBiasTerms[customLoopCounter] == "1")
+					{
+						MGCustomModelConstraintString * (MGCustomRateBiasTerms[customLoopCounter2]+_MG94GlobalSuffix+":="+MGCustomRateBiasTerms[customLoopCounter]+";");			
+					}
+					else
+					{
+						MGCustomModelConstraintString * (MGCustomRateBiasTerms[customLoopCounter2]+_MG94GlobalSuffix+":="+MGCustomRateBiasTerms[customLoopCounter]+_MG94GlobalSuffix+";");			
+					}
+					
+				}
+				break;
+			}
+		}
+	}	
+	
+	MGCustomModelConstraintString * 0;
+	
+	return 0;
+}
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function BuildCodonFrequencies (obsF)
+{
+	PIStop = 1.0;
+	result = {ModelMatrixDimension,1};
+	hshift = 0;
+
+	for (h=0; h<64; h=h+1)
+	{
+		first = h$16;
+		second = h%16$4;
+		third = h%4;
+		if (_Genetic_Code[h]==10) 
+		{
+			hshift = hshift+1;
+			PIStop = PIStop-obsF[first][0]*obsF[second][1]*obsF[third][2];
+			continue; 
+		}
+		result[h-hshift][0]=obsF[first][0]*obsF[second][1]*obsF[third][2];
+	}
+	return result*(1.0/PIStop);
+}
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+categoriesUsed = 0;
+
+if (!SKIP_MODEL_PARAMETER_LIST)
+{
+	#include "modelParameters.mdl";
+}
+
+sharedFlag = 1;
+
+if (modelType > 1)
+{
+	categoriesUsed = 1;
+	if (modelType == 2)
+	{
+		#include "defineGamma.mdl";
+	}
+	if (modelType == 3)
+	{
+		#include "defineHM.mdl";
+	}
+}
+
+if (!SKIP_MODEL_PARAMETER_LIST)
+{
+	done = 0;
+	while (!done)
+	{
+		fprintf (stdout,"\nPlease enter a 6 character model designation (e.g:010010 defines HKY85):");
+		fscanf  (stdin,"String", modelDesc);
+		if (Abs(modelDesc)==6)
+		{	
+			done = 1;
+		}
+	}	
+}		
+			
+MGCustomRateBiasTerms = {{"AC","1","AT","CG","CT","GT"}};
+
+PrepAConstraint	(modelDesc);
+
+if (!SKIP_HARVEST_FREQ)
+{
+	HarvestFrequencies (observedFreq,filteredData,3,1,1);
+}
+
+NICETY_LEVEL = 3;
+
+MULTIPLY_BY_FREQS		= PopulateModelMatrix ("GY94custom", observedFreq);
+FREQUENCY_SENSITIVE		= 1;
+vectorOfFrequencies		= BuildCodonFrequencies (observedFreq);
+Model GY94customModel   = (GY94custom,vectorOfFrequencies,1);
+
+USE_POSITION_SPECIFIC_FREQS = 1;
diff --git a/res/TemplateBatchFiles/TemplateModels/GY94w9.mdl b/res/TemplateBatchFiles/TemplateModels/GY94w9.mdl
new file mode 100644
index 0000000..86c8469
--- /dev/null
+++ b/res/TemplateBatchFiles/TemplateModels/GY94w9.mdl
@@ -0,0 +1,118 @@
+/* This file defines the transition matrix for the Goldman-Yang 94 model.
+   The file should be used as follows:
+   
+   1) Read Data File and create datafilter filteredData
+   2) #include this file (or use SelectTemplateModel(filteredData);)
+   3) Define the tree
+   4) Proceed with the likelihood function using 'vectorOfFrequencies' as the vector to pass to the constructor.
+   
+   This model has the following signature:
+   	#Short:GY94w9#
+   	#Desc:Goldman-Yang 94 codon model with 9 frequency parameters. Local or global dS/dN ratios. Possible Gamma Variation.#
+   	#Dimension:*#
+    #DataType:codon#
+   	#FileName:GY94w9.mdl#
+   
+   04/09/2000  by Sergei L. Kosakovsky Pond
+*/
+
+ModelMatrixDimension = 0;
+
+if (!ModelMatrixDimension)
+{
+	ModelMatrixDimension = 64;
+	for (h = 0 ;h<64; h=h+1)
+	{
+		if (_Genetic_Code[h]==10)
+		{
+			ModelMatrixDimension = ModelMatrixDimension-1;
+		}
+	}
+}
+
+function BuildCodonFrequencies (obsF)
+{
+	PIStop = 1.0;
+	result = {ModelMatrixDimension,1};
+	hshift = 0;
+
+	for (h=0; h<64; h=h+1)
+	{
+		first = h$16;
+		second = h%16$4;
+		third = h%4;
+		if (_Genetic_Code[h]==10) 
+		{
+			hshift = hshift+1;
+			PIStop = PIStop-obsF[first][0]*obsF[second][1]*obsF[third][2];
+			continue; 
+		}
+		result[h-hshift][0]=obsF[first][0]*obsF[second][1]*obsF[third][2];
+		/*result[h-hshift][0]=1/61;*/
+	}
+	return result*(1.0/PIStop);
+	/*return result;*/
+}
+
+
+
+if (!SKIP_MODEL_PARAMETER_LIST)
+{
+	#include "modelParameters.mdl";
+}
+
+if (modelType<0)
+{
+	return;
+}
+
+
+
+if (!SKIP_HARVEST_FREQ)
+{
+	HarvestFrequencies (observedFreq,filteredData,3,1,1);
+}
+
+global kappa = 1;
+
+if (modelType>0)
+{
+	global R = .5;
+	
+	if (modelType == 2)
+	{
+		#include "defineGamma.mdl";
+	}
+	if (modelType == 3)
+	{
+		#include "defineHM.mdl";
+	}
+}
+
+#include "GY94.ibf";
+
+GY94w9 = 0;
+
+vectorOfFrequencies = BuildCodonFrequencies (observedFreq);
+
+MULTIPLY_BY_FREQS = PopulateModelMatrix ("GY94w9", observedFreq);
+
+FREQUENCY_SENSITIVE = 1;
+
+Model GY94model = (GY94w9,vectorOfFrequencies,MULTIPLY_BY_FREQS);
+
+USE_POSITION_SPECIFIC_FREQS = 1;
+
+function GetBranchDNDS (shortName)
+{
+	sR  = "givenTree."+shortName+".R";
+	sR = valueGrab (sR);
+	if (sR>0.0)
+	{
+		return 1/sR;
+	}
+	else
+	{
+		return "Infinite";
+	}
+}
diff --git a/res/TemplateBatchFiles/TemplateModels/HIVbetween+F.mdl b/res/TemplateBatchFiles/TemplateModels/HIVbetween+F.mdl
new file mode 100644
index 0000000..518df6f
--- /dev/null
+++ b/res/TemplateBatchFiles/TemplateModels/HIVbetween+F.mdl
@@ -0,0 +1,10 @@
+#include "HIVbetween.ibf";
+
+if (SKIP_FREQ_HARVESTING == 0)
+{
+	HarvestFrequencies 		 (vectorOfFrequencies,filteredData,1,1,0);
+}
+HIVBetweenMatrix	    = 0;
+MULTIPLY_BY_FREQS 	    = PopulateModelMatrix ("HIVBetweenMatrix",vectorOfFrequencies);
+Model HIVBetweenModel 	= (HIVBetweenMatrix, vectorOfFrequencies, MULTIPLY_BY_FREQS);
+FREQUENCY_SENSITIVE     = 1;
diff --git a/res/TemplateBatchFiles/TemplateModels/HIVbetween.ibf b/res/TemplateBatchFiles/TemplateModels/HIVbetween.ibf
new file mode 100644
index 0000000..ded3e54
--- /dev/null
+++ b/res/TemplateBatchFiles/TemplateModels/HIVbetween.ibf
@@ -0,0 +1,64 @@
+#include "modelParameters2.mdl";
+
+if (!SKIP_MODEL_PARAMETER_LIST)
+{
+	if (modelType == 1)
+	{
+		#include "defineGamma.mdl";
+	}	
+	if (modelType == 2)
+	{
+		#include "defineHM.mdl";
+	}
+}
+
+_numericRateMatrix = {
+{0,0.123758,1.45504,1.48135,0.0141269,2.13536,0.0847613,0.005,0.005,0.215256,0.0186643,0.005,2.12217,0.0551128,0.307507,2.46633,15.9183,7.61428,0.005,0.005}
+{0.123758,0,0.005,0.005,9.29815,0.897871,0.240073,0.005,0.005,0.129777,0.005,0.0860642,0.005,0.005,0.351721,4.69314,0.739969,0.420027,2.63277,7.57932}
+{1.45504,0.005,0,10.5872,0.005,2.83806,1.9169,0.0176792,0.005,0.00876048,0.005,17.6612,0.0342658,0.005,0.005,0.52823,0.274724,1.04793,0.005,0.674653}
+{1.48135,0.005,10.5872,0,0.005,3.92775,0.11974,0.00609079,4.61482,0.005,0.175789,0.0792633,0.0120226,2.5602,0.0749218,0.005,0.289774,1.02847,0.005,0.0792633}
+{0.0141269,9.29815,0.005,0.005,0,0.291561,0.145558,3.39836,0.0342658,8.52484,0.188025,0.005,0.005,0.005,0.005,0.956472,0.0141269,0.723274,0.829343,15.34}
+{2.13536,0.897871,2.83806,3.92775,0.291561,0,0.005,0.005,0.521705,0.005,0.005,0.323401,0.005,0.0619137,3.65345,4.38041,0.369615,0.953155,1.21674,0.005}
+{0.0847613,0.240073,1.9169,0.11974,0.145558,0.005,0,0.103111,0.005,1.74171,0.005,7.64585,2.45318,7.05545,9.04044,0.382747,0.711594,0.005,0.0695179,18.6943}
+{0.005,0.005,0.0176792,0.00609079,3.39836,0.005,0.103111,0,0.322319,5.95879,11.2065,0.680565,0.0410593,0.005,0.677289,1.21803,8.61217,17.7389,0.005,0.148168}
+{0.005,0.005,0.005,4.61482,0.0342658,0.521705,0.005,0.322319,0,0.0814995,1.28246,7.90443,0.0313862,6.54737,20.45,0.504111,4.67142,0.265829,0.005,0.005}
+{0.215256,0.129777,0.00876048,0.005,8.52484,0.005,1.74171,5.95879,0.0814995,0,5.31961,0.005,2.07757,1.49456,0.701427,0.927656,0.0437673,1.41036,0.748843,0.111986}
+{0.0186643,0.005,0.005,0.175789,0.188025,0.005,0.005,11.2065,1.28246,5.31961,0,0.005,0.005,0.303676,2.51394,0.005,4.94026,6.8532,0.089078,0.005}
+{0.005,0.0860642,17.6612,0.0792633,0.005,0.323401,7.64585,0.680565,7.90443,0.005,0.005,0,0.00739578,0.672052,0.295543,13.1447,6.88667,0.026656,0.005,1.76417}
+{2.12217,0.005,0.0342658,0.0120226,0.005,0.005,2.45318,0.0410593,0.0313862,2.07757,0.005,0.00739578,0,4.47211,1.28355,5.37762,2.01417,0.005,0.0444506,0.0304381}
+{0.0551128,0.005,0.005,2.5602,0.005,0.0619137,7.05545,0.005,6.54737,1.49456,0.303676,0.672052,4.47211,0,3.4215,0.116311,0.243589,0.0209153,0.026656,0.113033}
+{0.307507,0.351721,0.005,0.0749218,0.005,3.65345,9.04044,0.677289,20.45,0.701427,2.51394,0.295543,1.28355,3.4215,0,3.4791,2.86868,0.0812454,0.991338,0.00991826}
+{2.46633,4.69314,0.52823,0.005,0.956472,4.38041,0.382747,1.21803,0.504111,0.927656,0.005,13.1447,5.37762,0.116311,3.4791,0,8.93107,0.0749218,0.0248728,0.648024}
+{15.9183,0.739969,0.274724,0.289774,0.0141269,0.369615,0.711594,8.61217,4.67142,0.0437673,4.94026,6.88667,2.01417,0.243589,2.86868,8.93107,0,0.709226,0.005,0.105652}
+{7.61428,0.420027,1.04793,1.02847,0.723274,0.953155,0.005,17.7389,0.265829,1.41036,6.8532,0.026656,0.005,0.0209153,0.0812454,0.0749218,0.709226,0,0.005,0.0410593}
+{0.005,2.63277,0.005,0.005,0.829343,1.21674,0.0695179,0.005,0.005,0.748843,0.089078,0.005,0.0444506,0.026656,0.991338,0.0248728,0.005,0.005,0,1.28022}
+{0.005,7.57932,0.674653,0.0792633,15.34,0.005,18.6943,0.148168,0.005,0.111986,0.005,1.76417,0.0304381,0.113033,0.00991826,0.648024,0.105652,0.0410593,1.28022,0}
+};
+
+function PopulateModelMatrix (ModelMatrixName&, EFV)
+{
+	ModelMatrixName = {20,20};
+	if (categoriesUsed)
+	{
+		for (ri = 0; ri < 20; ri = ri+1)
+		{
+			for (ci = ri+1; ci < 20; ci = ci+1)
+			{
+				ModelMatrixName[ri][ci] := _numericRateMatrix__[ri__][ci__] * c * t;
+				ModelMatrixName[ci][ri] := _numericRateMatrix__[ri__][ci__] * c * t;
+			}
+		}
+	}
+	else
+	{
+		for (ri = 0; ri < 20; ri = ri+1)
+		{
+			for (ci = ri+1; ci < 20; ci = ci+1)
+			{
+				ModelMatrixName[ri][ci] := _numericRateMatrix__[ri__][ci__] * t;
+				ModelMatrixName[ci][ri] := _numericRateMatrix__[ri__][ci__] * t;
+			}
+		}
+	}
+	return 1;
+}
diff --git a/res/TemplateBatchFiles/TemplateModels/HIVbetween.mdl b/res/TemplateBatchFiles/TemplateModels/HIVbetween.mdl
new file mode 100644
index 0000000..6410282
--- /dev/null
+++ b/res/TemplateBatchFiles/TemplateModels/HIVbetween.mdl
@@ -0,0 +1,32 @@
+#include "HIVbetween.ibf";
+
+equalFreqs=
+
+{
+{   0.060490222}
+{   0.020075899}
+{   0.042109048}
+{   0.071567447}
+{   0.028809447}
+{   0.072308239}
+{   0.022293943}
+{   0.069730629}
+{   0.056968211}
+{   0.098851122}
+{   0.019768318}
+{   0.044127815}
+{   0.046025282}
+{   0.053606488}
+{   0.066039665}
+{    0.05060433}
+{   0.053636813}
+{   0.061625237}
+{   0.033011601}
+{   0.028350243}
+};
+
+
+HIVBetweenMatrix	    = 0;
+MULTIPLY_BY_FREQS 	    = PopulateModelMatrix ("HIVBetweenMatrix",equalFreqs);
+Model HIVBetweenModel 	= (HIVBetweenMatrix, equalFreqs, MULTIPLY_BY_FREQS);
+FREQUENCY_SENSITIVE     = 0;
diff --git a/res/TemplateBatchFiles/TemplateModels/HIVwithin+F.mdl b/res/TemplateBatchFiles/TemplateModels/HIVwithin+F.mdl
new file mode 100644
index 0000000..331cc53
--- /dev/null
+++ b/res/TemplateBatchFiles/TemplateModels/HIVwithin+F.mdl
@@ -0,0 +1,10 @@
+#include "HIVwithin.ibf";
+
+if (SKIP_FREQ_HARVESTING == 0)
+{
+	HarvestFrequencies 		 (vectorOfFrequencies,filteredData,1,1,0);
+}
+HIVWithinMatrix	    	= 0;
+MULTIPLY_BY_FREQS 	    = PopulateModelMatrix ("HIVWithinMatrix",vectorOfFrequencies);
+Model HIVWithinModel 	= (HIVWithinMatrix, vectorOfFrequencies, MULTIPLY_BY_FREQS);
+FREQUENCY_SENSITIVE     = 1;
diff --git a/res/TemplateBatchFiles/TemplateModels/HIVwithin.ibf b/res/TemplateBatchFiles/TemplateModels/HIVwithin.ibf
new file mode 100644
index 0000000..9288728
--- /dev/null
+++ b/res/TemplateBatchFiles/TemplateModels/HIVwithin.ibf
@@ -0,0 +1,71 @@
+#include "modelParameters2.mdl";
+
+if (!SKIP_MODEL_PARAMETER_LIST)
+{
+	if (modelType == 1)
+	{
+		#include "defineGamma.mdl";
+	}	
+	if (modelType == 2)
+	{
+		#include "defineHM.mdl";
+	}
+}
+
+/*--------------------------------------------------------------------------------------------*/
+
+_numericRateMatrix = 
+{
+{0,0.167653,4.43521,5.56325,0.597923,1.8685,0.005,0.005,0.592784,0.16024,0.005,0.617509,1.00981,0.005,0.0744808,8.5942,24.1422,24.8094,0.005,0.005}
+{0.167653,0,0.005,0.005,0.362959,0.0489798,0.005,0.005,0.005,0.005,0.005,0.0604932,0.005,0.005,2.86364,1.12195,0.005,0.005,5.49894,8.34835}
+{4.43521,0.005,0,12.1233,0.005,10.3969,2.31779,0.145124,0.894313,0.005,0.005,29.4087,0.005,0.005,0.0674539,0.427881,0.630395,2.91786,0.005,2.28154}
+{5.56325,0.005,12.1233,0,0.005,14.7801,0.005,0.0390512,23.9626,0.129839,0.005,0.201526,0.005,3.20656,0.0251632,0.005,0.458743,2.19952,0.005,0.005}
+{0.597923,0.362959,0.005,0.005,0,0.005,0.005,1.48288,0.005,7.48781,0.005,0.005,0.0342252,0.005,0.005,4.27939,0.114512,2.28,0.005,4.12728}
+{1.8685,0.0489798,10.3969,14.7801,0.005,0,0.005,0.005,0.279425,0.0489798,0.0489798,0.0604932,0.005,0.0604932,13.4379,6.27966,0.0489798,2.79622,2.8258,0.005}
+{0.005,0.005,2.31779,0.005,0.005,0.005,0,0.005,0.22406,1.76382,0.005,8.59876,13.9444,18.5465,6.84405,0.725157,0.95956,0.827479,0.005,47.4889}
+{0.005,0.005,0.145124,0.0390512,1.48288,0.005,0.005,0,0.817481,9.10246,17.3064,0.987028,0.005,0.0342252,1.34069,0.740091,9.36345,24.8231,0.005,0.114512}
+{0.592784,0.005,0.894313,23.9626,0.005,0.279425,0.22406,0.817481,0,0.005,4.09564,10.6655,0.111928,13.0705,39.8897,0.005,4.04802,0.128065,0.005,0.005}
+{0.16024,0.005,0.005,0.129839,7.48781,0.0489798,1.76382,9.10246,0.005,0,11.3839,0.005,9.83095,2.89048,0.586757,6.14396,0.005,2.95344,1.37031,0.005}
+{0.005,0.005,0.005,0.005,0.005,0.0489798,0.005,17.3064,4.09564,11.3839,0,0.201526,0.005,0.005,3.28652,0.392575,7.41313,14.7683,0.005,0.579198}
+{0.617509,0.0604932,29.4087,0.201526,0.005,0.0604932,8.59876,0.987028,10.6655,0.005,0.201526,0,0.344848,0.342068,0.16024,14.5699,4.54206,0.0744808,0.005,5.06475}
+{1.00981,0.005,0.005,0.005,0.0342252,0.005,13.9444,0.005,0.111928,9.83095,0.005,0.344848,0,3.04502,0.404723,14.249,4.33701,0.005,0.005,0.005}
+{0.005,0.005,0.005,3.20656,0.005,0.0604932,18.5465,0.0342252,13.0705,2.89048,0.005,0.342068,3.04502,0,10.6746,0.16024,0.203091,0.005,0.0443298,0.005}
+{0.0744808,2.86364,0.0674539,0.0251632,0.005,13.4379,6.84405,1.34069,39.8897,0.586757,3.28652,0.16024,0.404723,10.6746,0,8.35024,0.928203,0.279425,5.96564,0.005}
+{8.5942,1.12195,0.427881,0.005,4.27939,6.27966,0.725157,0.740091,0.005,6.14396,0.392575,14.5699,14.249,0.16024,8.35024,0,6.34079,0.862637,1.10156,0.933142}
+{24.1422,0.005,0.630395,0.458743,0.114512,0.0489798,0.95956,9.36345,4.04802,0.005,7.41313,4.54206,4.33701,0.203091,0.928203,6.34079,0,0.005,0.005,0.490608}
+{24.8094,0.005,2.91786,2.19952,2.28,2.79622,0.827479,24.8231,0.128065,2.95344,14.7683,0.0744808,0.005,0.005,0.279425,0.862637,0.005,0,0.005,1.35482}
+{0.005,5.49894,0.005,0.005,0.005,2.8258,0.005,0.005,0.005,1.37031,0.005,0.005,0.005,0.0443298,5.96564,1.10156,0.005,0.005,0,0.005}
+{0.005,8.34835,2.28154,0.005,4.12728,0.005,47.4889,0.114512,0.005,0.005,0.579198,5.06475,0.005,0.005,0.005,0.933142,0.490608,1.35482,0.005,0}
+};
+
+/*--------------------------------------------------------------------------------------------*/
+
+function PopulateModelMatrix (ModelMatrixName&, EFV)
+{
+	ModelMatrixName = {20,20};
+	if (categoriesUsed)
+	{
+		for (ri = 0; ri < 20; ri = ri+1)
+		{
+			for (ci = ri+1; ci < 20; ci = ci+1)
+			{
+				ModelMatrixName[ri][ci] := _numericRateMatrix__[ri__][ci__] * c * t;
+				ModelMatrixName[ci][ri] := _numericRateMatrix__[ri__][ci__] * c * t;
+			}
+		}
+	}
+	else
+	{
+		for (ri = 0; ri < 20; ri = ri+1)
+		{
+			for (ci = ri+1; ci < 20; ci = ci+1)
+			{
+				ModelMatrixName[ri][ci] := _numericRateMatrix__[ri__][ci__] * t;
+				ModelMatrixName[ci][ri] := _numericRateMatrix__[ri__][ci__] * t;
+			}
+		}
+	}
+	return 1;
+}
+
+/*--------------------------------------------------------------------------------------------*/
diff --git a/res/TemplateBatchFiles/TemplateModels/HIVwithin.mdl b/res/TemplateBatchFiles/TemplateModels/HIVwithin.mdl
new file mode 100644
index 0000000..0c378b5
--- /dev/null
+++ b/res/TemplateBatchFiles/TemplateModels/HIVwithin.mdl
@@ -0,0 +1,31 @@
+#include "HIVwithin.ibf";
+
+equalFreqs=
+{
+{0.0377494}
+{0.0240105}
+{0.0342034}
+{0.0618606}
+{0.0422741}
+{0.0838496}
+{0.0156076}
+{0.0983641}
+{0.0641682}
+{0.0577867}
+{0.0158419}
+{0.0891129}
+{0.0458601}
+{0.0437824}
+{0.057321}
+{0.0550846}
+{0.0813774}
+{0.0515639}
+{0.019597}
+{0.0205847}
+};
+
+
+HIVWithinMatrix	    	= 0;
+MULTIPLY_BY_FREQS 	    = PopulateModelMatrix ("HIVWithinMatrix",equalFreqs);
+Model HIVWithinModel 	= (HIVWithinMatrix, equalFreqs, MULTIPLY_BY_FREQS);
+FREQUENCY_SENSITIVE     = 0;
diff --git a/res/TemplateBatchFiles/TemplateModels/HKY85.mdl b/res/TemplateBatchFiles/TemplateModels/HKY85.mdl
new file mode 100644
index 0000000..bb2f80f
--- /dev/null
+++ b/res/TemplateBatchFiles/TemplateModels/HKY85.mdl
@@ -0,0 +1,61 @@
+/* This file defines the transition matrix for the Hasegawa et al.,1985 (HKY85)
+   The file should be used as follows:
+   
+   1) Read Data File and create datafilter filteredData
+   2) #include this file (or use SelectTemplateModel(filteredData);)
+   3) Define the tree
+   4) Proceed with the likelihood function using 'vectorOfFrequencies' as the vector to pass to the constructor.
+   
+   This model has the following signature:
+    #Short:HKY85#
+   	#Desc:Hasegawa et al.,1985. Local or global parameters. Possible Gamma Variation.#
+   	#Dimension:4#
+    #DataType:nucleotide#
+   	#FileName:HKY85.mdl#
+   
+   08/18/1999  by Sergei L. Kosakovsky Pond
+   Modified on 03/06/2000 to comply with the new Model syntax.
+*/
+
+#include "modelParameters.mdl";
+
+if (modelType >= 1)
+{
+	global R = 1;
+	
+	if (modelType == 2)
+	{
+		#include "defineGamma.mdl";
+	}
+	if (modelType == 3)
+	{
+		#include "defineHM.mdl";
+	}
+}
+
+function PopulateModelMatrix (ModelMatrixName&, EFV)
+{
+	if (modelType == 0) {
+		ModelMatrixName = {{*,a,b,a}{a,*,a,b}{b,a,*,a}{a,b,a,*}};
+	}
+	else
+	{
+		if (modelType<2) {
+			ModelMatrixName = {{*,R*a,a,R*a}{R*a,*,R*a,a}{a,R*a,*,R*a}{R*a,a,R*a,*}};
+		}
+		else {
+			ModelMatrixName = {{*,R*a*c,a*c,R*a*c}{R*a*c,*,R*a*c,a*c}{a*c,R*a*c,*,R*a*c}{R*a*c,a*c,R*a*c,*}};
+		}
+	}
+	return 1;
+}
+
+HKY85 = 0;
+
+HarvestFrequencies (vectorOfFrequencies, filteredData,1,1,0);
+
+MULTIPLY_BY_FREQS = PopulateModelMatrix ("HKY85",vectorOfFrequencies);
+
+Model HKY85Model = (HKY85, vectorOfFrequencies, MULTIPLY_BY_FREQS);
+
+FREQUENCY_SENSITIVE = 1;
diff --git a/res/TemplateBatchFiles/TemplateModels/JC69.mdl b/res/TemplateBatchFiles/TemplateModels/JC69.mdl
new file mode 100644
index 0000000..39d5625
--- /dev/null
+++ b/res/TemplateBatchFiles/TemplateModels/JC69.mdl
@@ -0,0 +1,56 @@
+/* This file defines the transition matrix for the Jukes-Cantor 69 model 
+   The file should be used as follows:
+   
+   1) Read Data File and create datafilter filteredData
+   2) #include this file (or use SelectTemplateModel(filteredData);)
+   3) Define the tree
+   4) Proceed with the likelihood function using 'vectorOfFrequencies' as the vector to pass to the constructor.
+   
+   This model has the following signature:
+    #Short:JC69#
+   	#Desc:Jukes-Cantor 1969. Gamma variation possible.#
+   	#Dimension:4#
+   	#DataType:nucleotide#
+   	#FileName:JC69.mdl#
+   
+   08/18/1999  by Sergei L. Kosakovsky Pond
+*/
+
+equalFreqs = {{.25}{.25}{.25}{.25}};
+
+#include "modelParameters2.mdl";
+
+if (modelType>0)
+{
+	if (modelType == 1)
+	{
+		#include "defineGamma.mdl";
+	}
+	if (modelType == 2)
+	{
+		#include "defineHM.mdl";
+	}
+}
+
+function PopulateModelMatrix (ModelMatrixName&, EFV)
+{
+	if (modelType == 0)
+	{
+		ModelMatrixName = {{*,a,a,a}{a,*,a,a}{a,a,*,a}{a,a,a,*}};
+	}
+	else
+	{
+		ModelMatrixName = {{*,a*c,a*c,a*c}{a*c,*,a*c,a*c}{a*c,a*c,*,a*c}{a*c,a*c,a*c,*}};
+	}
+	return 1;
+}
+
+JC69 = 0;
+
+MULTIPLY_BY_FREQS = PopulateModelMatrix ("JC69",equalFreqs);
+
+Model JC69Model = (JC69, equalFreqs, MULTIPLY_BY_FREQS);
+
+FREQUENCY_SENSITIVE = 0;
+
+DUPLICATE_MODELS_OK = 1;
diff --git a/res/TemplateBatchFiles/TemplateModels/JC69_binary.mdl b/res/TemplateBatchFiles/TemplateModels/JC69_binary.mdl
new file mode 100644
index 0000000..a45d569
--- /dev/null
+++ b/res/TemplateBatchFiles/TemplateModels/JC69_binary.mdl
@@ -0,0 +1,51 @@
+/* This file defines the transition matrix for the Jukes-Cantor 69 model 
+   The file should be used as follows:
+   
+   1) Read Data File and create datafilter filteredData
+   2) #include this file (or use SelectTemplateModel(filteredData);)
+   3) Define the tree
+   4) Proceed with the likelihood function using 'vectorOfFrequencies' as the vector to pass to the constructor.
+   
+   This model has the following signature:
+    #Short:JC69#
+   	#Desc:Jukes-Cantor 1969. Gamma variation possible.#
+   	#Dimension:2#
+   	#DataType:binary
+   	#FileName:JC69_binary.mdl#
+   
+   10/02/2007  by Sergei L. Kosakovsky Pond
+*/
+
+equalFreqs = {{.5}{.5}};
+
+#include "modelParameters2.mdl";
+
+if (modelType>0)
+{
+	if (modelType == 1)
+	{
+		#include "defineGamma.mdl";
+	}
+	if (modelType == 2)
+	{
+		#include "defineHM.mdl";
+	}
+}
+
+function PopulateModelMatrix (ModelMatrixName&, EFV)
+{
+	if (modelType == 0)
+	{
+		ModelMatrixName = {{*,t}{t,*}};
+	}
+	else
+	{
+		ModelMatrixName = {{*,t*c}{t*c,*}};
+	}
+	return 1;
+}
+
+MULTIPLY_BY_FREQS = PopulateModelMatrix ("JC69_Binary",equalFreqs);
+Model JC69BModel = (JC69_Binary, equalFreqs, MULTIPLY_BY_FREQS);
+FREQUENCY_SENSITIVE = 0;
+DUPLICATE_MODELS_OK = 1;
diff --git a/res/TemplateBatchFiles/TemplateModels/Jones.mdl b/res/TemplateBatchFiles/TemplateModels/Jones.mdl
new file mode 100644
index 0000000..ed94df8
--- /dev/null
+++ b/res/TemplateBatchFiles/TemplateModels/Jones.mdl
@@ -0,0 +1,839 @@
+/* This file defines the transition matrix for the Dayhoff model for amino-acids.
+   The file should be used as follows:
+   
+   1) Read Data File and create datafilter filteredData
+   2) #include this file (or use SelectTemplateModel(filteredData);)
+   3) Define the tree
+   4) Proceed with the likelihood function using 'vectorOfFrequencies' as the vector to pass to the constructor.
+   
+   This model has the following signature:
+   	#Short:Jones#
+   	#Desc:Jones Model (based on SWISSPROT Version 22 data)#
+   	#Dimension:20#
+    #DataType:aminoacid#
+   	#FileName:Jones.mdl#
+   
+   12/20/1999  by Sergei L. Kosakovsky Pond
+*/
+
+#include "modelParameters2.mdl";
+
+if (!SKIP_MODEL_PARAMETER_LIST)
+{
+	if (modelType == 1)
+	{
+		#include "defineGamma.mdl";
+	}	
+	if (modelType == 2)
+	{
+		#include "defineHM.mdl";
+	}
+}
+
+
+NICETY_LEVEL = 2;
+
+function PopulateModelMatrix (ModelMatrixName&, EFV)
+{
+
+	ModelMatrixName = {20,20};
+	
+	if (categoriesUsed)
+	{
+        ModelMatrixName[0][1] := t*c*0.056;
+        ModelMatrixName[1][0] := t*c*0.056;
+        ModelMatrixName[0][2] := t*c*0.081;
+        ModelMatrixName[2][0] := t*c*0.081;
+        ModelMatrixName[0][3] := t*c*0.105;
+        ModelMatrixName[3][0] := t*c*0.105;
+        ModelMatrixName[0][4] := t*c*0.015;
+        ModelMatrixName[4][0] := t*c*0.015;
+        ModelMatrixName[0][5] := t*c*0.179;
+        ModelMatrixName[5][0] := t*c*0.179;
+        ModelMatrixName[0][6] := t*c*0.027;
+        ModelMatrixName[6][0] := t*c*0.027;
+        ModelMatrixName[0][7] := t*c*0.036;
+        ModelMatrixName[7][0] := t*c*0.036;
+        ModelMatrixName[0][8] := t*c*0.035;
+        ModelMatrixName[8][0] := t*c*0.035;
+        ModelMatrixName[0][9] := t*c*0.03;
+        ModelMatrixName[9][0] := t*c*0.03;
+        ModelMatrixName[0][10] := t*c*0.054;
+        ModelMatrixName[10][0] := t*c*0.054;
+        ModelMatrixName[0][11] := t*c*0.054;
+        ModelMatrixName[11][0] := t*c*0.054;
+        ModelMatrixName[0][12] := t*c*0.194;
+        ModelMatrixName[12][0] := t*c*0.194;
+        ModelMatrixName[0][13] := t*c*0.057;
+        ModelMatrixName[13][0] := t*c*0.057;
+        ModelMatrixName[0][14] := t*c*0.058;
+        ModelMatrixName[14][0] := t*c*0.058;
+        ModelMatrixName[0][15] := t*c*0.378;
+        ModelMatrixName[15][0] := t*c*0.378;
+        ModelMatrixName[0][16] := t*c*0.475;
+        ModelMatrixName[16][0] := t*c*0.475;
+        ModelMatrixName[0][17] := t*c*0.298;
+        ModelMatrixName[17][0] := t*c*0.298;
+        ModelMatrixName[0][18] := t*c*0.009;
+        ModelMatrixName[18][0] := t*c*0.009;
+        ModelMatrixName[0][19] := t*c*0.011;
+        ModelMatrixName[19][0] := t*c*0.011;
+        ModelMatrixName[1][2] := t*c*0.01;
+        ModelMatrixName[2][1] := t*c*0.01;
+        ModelMatrixName[1][3] := t*c*0.005;
+        ModelMatrixName[3][1] := t*c*0.005;
+        ModelMatrixName[1][4] := t*c*0.078;
+        ModelMatrixName[4][1] := t*c*0.078;
+        ModelMatrixName[1][5] := t*c*0.059;
+        ModelMatrixName[5][1] := t*c*0.059;
+        ModelMatrixName[1][6] := t*c*0.069;
+        ModelMatrixName[6][1] := t*c*0.069;
+        ModelMatrixName[1][7] := t*c*0.017;
+        ModelMatrixName[7][1] := t*c*0.017;
+        ModelMatrixName[1][8] := t*c*0.007;
+        ModelMatrixName[8][1] := t*c*0.007;
+        ModelMatrixName[1][9] := t*c*0.023;
+        ModelMatrixName[9][1] := t*c*0.023;
+        ModelMatrixName[1][10] := t*c*0.031;
+        ModelMatrixName[10][1] := t*c*0.031;
+        ModelMatrixName[1][11] := t*c*0.034;
+        ModelMatrixName[11][1] := t*c*0.034;
+        ModelMatrixName[1][12] := t*c*0.014;
+        ModelMatrixName[12][1] := t*c*0.014;
+        ModelMatrixName[1][13] := t*c*0.009;
+        ModelMatrixName[13][1] := t*c*0.009;
+        ModelMatrixName[1][14] := t*c*0.113;
+        ModelMatrixName[14][1] := t*c*0.113;
+        ModelMatrixName[1][15] := t*c*0.223;
+        ModelMatrixName[15][1] := t*c*0.223;
+        ModelMatrixName[1][16] := t*c*0.042;
+        ModelMatrixName[16][1] := t*c*0.042;
+        ModelMatrixName[1][17] := t*c*0.062;
+        ModelMatrixName[17][1] := t*c*0.062;
+        ModelMatrixName[1][18] := t*c*0.115;
+        ModelMatrixName[18][1] := t*c*0.115;
+        ModelMatrixName[1][19] := t*c*0.209;
+        ModelMatrixName[19][1] := t*c*0.209;
+        ModelMatrixName[2][3] := t*c*0.767;
+        ModelMatrixName[3][2] := t*c*0.767;
+        ModelMatrixName[2][4] := t*c*0.004;
+        ModelMatrixName[4][2] := t*c*0.004;
+        ModelMatrixName[2][5] := t*c*0.13;
+        ModelMatrixName[5][2] := t*c*0.13;
+        ModelMatrixName[2][6] := t*c*0.112;
+        ModelMatrixName[6][2] := t*c*0.112;
+        ModelMatrixName[2][7] := t*c*0.011;
+        ModelMatrixName[7][2] := t*c*0.011;
+        ModelMatrixName[2][8] := t*c*0.026;
+        ModelMatrixName[8][2] := t*c*0.026;
+        ModelMatrixName[2][9] := t*c*0.007;
+        ModelMatrixName[9][2] := t*c*0.007;
+        ModelMatrixName[2][10] := t*c*0.015;
+        ModelMatrixName[10][2] := t*c*0.015;
+        ModelMatrixName[2][11] := t*c*0.528;
+        ModelMatrixName[11][2] := t*c*0.528;
+        ModelMatrixName[2][12] := t*c*0.015;
+        ModelMatrixName[12][2] := t*c*0.015;
+        ModelMatrixName[2][13] := t*c*0.049;
+        ModelMatrixName[13][2] := t*c*0.049;
+        ModelMatrixName[2][14] := t*c*0.016;
+        ModelMatrixName[14][2] := t*c*0.016;
+        ModelMatrixName[2][15] := t*c*0.059;
+        ModelMatrixName[15][2] := t*c*0.059;
+        ModelMatrixName[2][16] := t*c*0.038;
+        ModelMatrixName[16][2] := t*c*0.038;
+        ModelMatrixName[2][17] := t*c*0.031;
+        ModelMatrixName[17][2] := t*c*0.031;
+        ModelMatrixName[2][18] := t*c*0.004;
+        ModelMatrixName[18][2] := t*c*0.004;
+        ModelMatrixName[2][19] := t*c*0.046;
+        ModelMatrixName[19][2] := t*c*0.046;
+        ModelMatrixName[3][4] := t*c*0.005;
+        ModelMatrixName[4][3] := t*c*0.005;
+        ModelMatrixName[3][5] := t*c*0.119;
+        ModelMatrixName[5][3] := t*c*0.119;
+        ModelMatrixName[3][6] := t*c*0.026;
+        ModelMatrixName[6][3] := t*c*0.026;
+        ModelMatrixName[3][7] := t*c*0.012;
+        ModelMatrixName[7][3] := t*c*0.012;
+        ModelMatrixName[3][8] := t*c*0.181;
+        ModelMatrixName[8][3] := t*c*0.181;
+        ModelMatrixName[3][9] := t*c*0.009;
+        ModelMatrixName[9][3] := t*c*0.009;
+        ModelMatrixName[3][10] := t*c*0.018;
+        ModelMatrixName[10][3] := t*c*0.018;
+        ModelMatrixName[3][11] := t*c*0.058;
+        ModelMatrixName[11][3] := t*c*0.058;
+        ModelMatrixName[3][12] := t*c*0.018;
+        ModelMatrixName[12][3] := t*c*0.018;
+        ModelMatrixName[3][13] := t*c*0.323;
+        ModelMatrixName[13][3] := t*c*0.323;
+        ModelMatrixName[3][14] := t*c*0.029;
+        ModelMatrixName[14][3] := t*c*0.029;
+        ModelMatrixName[3][15] := t*c*0.03;
+        ModelMatrixName[15][3] := t*c*0.03;
+        ModelMatrixName[3][16] := t*c*0.032;
+        ModelMatrixName[16][3] := t*c*0.032;
+        ModelMatrixName[3][17] := t*c*0.045;
+        ModelMatrixName[17][3] := t*c*0.045;
+        ModelMatrixName[3][18] := t*c*0.01;
+        ModelMatrixName[18][3] := t*c*0.01;
+        ModelMatrixName[3][19] := t*c*0.007;
+        ModelMatrixName[19][3] := t*c*0.007;
+        ModelMatrixName[4][5] := t*c*0.005;
+        ModelMatrixName[5][4] := t*c*0.005;
+        ModelMatrixName[4][6] := t*c*0.04;
+        ModelMatrixName[6][4] := t*c*0.04;
+        ModelMatrixName[4][7] := t*c*0.089;
+        ModelMatrixName[7][4] := t*c*0.089;
+        ModelMatrixName[4][8] := t*c*0.004;
+        ModelMatrixName[8][4] := t*c*0.004;
+        ModelMatrixName[4][9] := t*c*0.248;
+        ModelMatrixName[9][4] := t*c*0.248;
+        ModelMatrixName[4][10] := t*c*0.043;
+        ModelMatrixName[10][4] := t*c*0.043;
+        ModelMatrixName[4][11] := t*c*0.01;
+        ModelMatrixName[11][4] := t*c*0.01;
+        ModelMatrixName[4][12] := t*c*0.017;
+        ModelMatrixName[12][4] := t*c*0.017;
+        ModelMatrixName[4][13] := t*c*0.004;
+        ModelMatrixName[13][4] := t*c*0.004;
+        ModelMatrixName[4][14] := t*c*0.005;
+        ModelMatrixName[14][4] := t*c*0.005;
+        ModelMatrixName[4][15] := t*c*0.092;
+        ModelMatrixName[15][4] := t*c*0.092;
+        ModelMatrixName[4][16] := t*c*0.012;
+        ModelMatrixName[16][4] := t*c*0.012;
+        ModelMatrixName[4][17] := t*c*0.062;
+        ModelMatrixName[17][4] := t*c*0.062;
+        ModelMatrixName[4][18] := t*c*0.053;
+        ModelMatrixName[18][4] := t*c*0.053;
+        ModelMatrixName[4][19] := t*c*0.536;
+        ModelMatrixName[19][4] := t*c*0.536;
+        ModelMatrixName[5][6] := t*c*0.023;
+        ModelMatrixName[6][5] := t*c*0.023;
+        ModelMatrixName[5][7] := t*c*0.006;
+        ModelMatrixName[7][5] := t*c*0.006;
+        ModelMatrixName[5][8] := t*c*0.027;
+        ModelMatrixName[8][5] := t*c*0.027;
+        ModelMatrixName[5][9] := t*c*0.006;
+        ModelMatrixName[9][5] := t*c*0.006;
+        ModelMatrixName[5][10] := t*c*0.014;
+        ModelMatrixName[10][5] := t*c*0.014;
+        ModelMatrixName[5][11] := t*c*0.081;
+        ModelMatrixName[11][5] := t*c*0.081;
+        ModelMatrixName[5][12] := t*c*0.024;
+        ModelMatrixName[12][5] := t*c*0.024;
+        ModelMatrixName[5][13] := t*c*0.026;
+        ModelMatrixName[13][5] := t*c*0.026;
+        ModelMatrixName[5][14] := t*c*0.137;
+        ModelMatrixName[14][5] := t*c*0.137;
+        ModelMatrixName[5][15] := t*c*0.201;
+        ModelMatrixName[15][5] := t*c*0.201;
+        ModelMatrixName[5][16] := t*c*0.033;
+        ModelMatrixName[16][5] := t*c*0.033;
+        ModelMatrixName[5][17] := t*c*0.047;
+        ModelMatrixName[17][5] := t*c*0.047;
+        ModelMatrixName[5][18] := t*c*0.055;
+        ModelMatrixName[18][5] := t*c*0.055;
+        ModelMatrixName[5][19] := t*c*0.008;
+        ModelMatrixName[19][5] := t*c*0.008;
+        ModelMatrixName[6][7] := t*c*0.016;
+        ModelMatrixName[7][6] := t*c*0.016;
+        ModelMatrixName[6][8] := t*c*0.045;
+        ModelMatrixName[8][6] := t*c*0.045;
+        ModelMatrixName[6][9] := t*c*0.056;
+        ModelMatrixName[9][6] := t*c*0.056;
+        ModelMatrixName[6][10] := t*c*0.033;
+        ModelMatrixName[10][6] := t*c*0.033;
+        ModelMatrixName[6][11] := t*c*0.391;
+        ModelMatrixName[11][6] := t*c*0.391;
+        ModelMatrixName[6][12] := t*c*0.115;
+        ModelMatrixName[12][6] := t*c*0.115;
+        ModelMatrixName[6][13] := t*c*0.597;
+        ModelMatrixName[13][6] := t*c*0.597;
+        ModelMatrixName[6][14] := t*c*0.328;
+        ModelMatrixName[14][6] := t*c*0.328;
+        ModelMatrixName[6][15] := t*c*0.073;
+        ModelMatrixName[15][6] := t*c*0.073;
+        ModelMatrixName[6][16] := t*c*0.046;
+        ModelMatrixName[16][6] := t*c*0.046;
+        ModelMatrixName[6][17] := t*c*0.011;
+        ModelMatrixName[17][6] := t*c*0.011;
+        ModelMatrixName[6][18] := t*c*0.008;
+        ModelMatrixName[18][6] := t*c*0.008;
+        ModelMatrixName[6][19] := t*c*0.573;
+        ModelMatrixName[19][6] := t*c*0.573;
+        ModelMatrixName[7][8] := t*c*0.021;
+        ModelMatrixName[8][7] := t*c*0.021;
+        ModelMatrixName[7][9] := t*c*0.229;
+        ModelMatrixName[9][7] := t*c*0.229;
+        ModelMatrixName[7][10] := t*c*0.479;
+        ModelMatrixName[10][7] := t*c*0.479;
+        ModelMatrixName[7][11] := t*c*0.047;
+        ModelMatrixName[11][7] := t*c*0.047;
+        ModelMatrixName[7][12] := t*c*0.01;
+        ModelMatrixName[12][7] := t*c*0.01;
+        ModelMatrixName[7][13] := t*c*0.009;
+        ModelMatrixName[13][7] := t*c*0.009;
+        ModelMatrixName[7][14] := t*c*0.022;
+        ModelMatrixName[14][7] := t*c*0.022;
+        ModelMatrixName[7][15] := t*c*0.04;
+        ModelMatrixName[15][7] := t*c*0.04;
+        ModelMatrixName[7][16] := t*c*0.245;
+        ModelMatrixName[16][7] := t*c*0.245;
+        ModelMatrixName[7][17] := t*c*0.961;
+        ModelMatrixName[17][7] := t*c*0.961;
+        ModelMatrixName[7][18] := t*c*0.009;
+        ModelMatrixName[18][7] := t*c*0.009;
+        ModelMatrixName[7][19] := t*c*0.032;
+        ModelMatrixName[19][7] := t*c*0.032;
+        ModelMatrixName[8][9] := t*c*0.014;
+        ModelMatrixName[9][8] := t*c*0.014;
+        ModelMatrixName[8][10] := t*c*0.065;
+        ModelMatrixName[10][8] := t*c*0.065;
+        ModelMatrixName[8][11] := t*c*0.263;
+        ModelMatrixName[11][8] := t*c*0.263;
+        ModelMatrixName[8][12] := t*c*0.021;
+        ModelMatrixName[12][8] := t*c*0.021;
+        ModelMatrixName[8][13] := t*c*0.292;
+        ModelMatrixName[13][8] := t*c*0.292;
+        ModelMatrixName[8][14] := t*c*0.646;
+        ModelMatrixName[14][8] := t*c*0.646;
+        ModelMatrixName[8][15] := t*c*0.047;
+        ModelMatrixName[15][8] := t*c*0.047;
+        ModelMatrixName[8][16] := t*c*0.103;
+        ModelMatrixName[16][8] := t*c*0.103;
+        ModelMatrixName[8][17] := t*c*0.014;
+        ModelMatrixName[17][8] := t*c*0.014;
+        ModelMatrixName[8][18] := t*c*0.01;
+        ModelMatrixName[18][8] := t*c*0.01;
+        ModelMatrixName[8][19] := t*c*0.008;
+        ModelMatrixName[19][8] := t*c*0.008;
+        ModelMatrixName[9][10] := t*c*0.388;
+        ModelMatrixName[10][9] := t*c*0.388;
+        ModelMatrixName[9][11] := t*c*0.012;
+        ModelMatrixName[11][9] := t*c*0.012;
+        ModelMatrixName[9][12] := t*c*0.102;
+        ModelMatrixName[12][9] := t*c*0.102;
+        ModelMatrixName[9][13] := t*c*0.072;
+        ModelMatrixName[13][9] := t*c*0.072;
+        ModelMatrixName[9][14] := t*c*0.038;
+        ModelMatrixName[14][9] := t*c*0.038;
+        ModelMatrixName[9][15] := t*c*0.059;
+        ModelMatrixName[15][9] := t*c*0.059;
+        ModelMatrixName[9][16] := t*c*0.025;
+        ModelMatrixName[16][9] := t*c*0.025;
+        ModelMatrixName[9][17] := t*c*0.18;
+        ModelMatrixName[17][9] := t*c*0.18;
+        ModelMatrixName[9][18] := t*c*0.052;
+        ModelMatrixName[18][9] := t*c*0.052;
+        ModelMatrixName[9][19] := t*c*0.024;
+        ModelMatrixName[19][9] := t*c*0.024;
+        ModelMatrixName[10][11] := t*c*0.03;
+        ModelMatrixName[11][10] := t*c*0.03;
+        ModelMatrixName[10][12] := t*c*0.016;
+        ModelMatrixName[12][10] := t*c*0.016;
+        ModelMatrixName[10][13] := t*c*0.043;
+        ModelMatrixName[13][10] := t*c*0.043;
+        ModelMatrixName[10][14] := t*c*0.044;
+        ModelMatrixName[14][10] := t*c*0.044;
+        ModelMatrixName[10][15] := t*c*0.029;
+        ModelMatrixName[15][10] := t*c*0.029;
+        ModelMatrixName[10][16] := t*c*0.226;
+        ModelMatrixName[16][10] := t*c*0.226;
+        ModelMatrixName[10][17] := t*c*0.323;
+        ModelMatrixName[17][10] := t*c*0.323;
+        ModelMatrixName[10][18] := t*c*0.024;
+        ModelMatrixName[18][10] := t*c*0.024;
+        ModelMatrixName[10][19] := t*c*0.018;
+        ModelMatrixName[19][10] := t*c*0.018;
+        ModelMatrixName[11][12] := t*c*0.015;
+        ModelMatrixName[12][11] := t*c*0.015;
+        ModelMatrixName[11][13] := t*c*0.086;
+        ModelMatrixName[13][11] := t*c*0.086;
+        ModelMatrixName[11][14] := t*c*0.045;
+        ModelMatrixName[14][11] := t*c*0.045;
+        ModelMatrixName[11][15] := t*c*0.503;
+        ModelMatrixName[15][11] := t*c*0.503;
+        ModelMatrixName[11][16] := t*c*0.232;
+        ModelMatrixName[16][11] := t*c*0.232;
+        ModelMatrixName[11][17] := t*c*0.016;
+        ModelMatrixName[17][11] := t*c*0.016;
+        ModelMatrixName[11][18] := t*c*0.008;
+        ModelMatrixName[18][11] := t*c*0.008;
+        ModelMatrixName[11][19] := t*c*0.07;
+        ModelMatrixName[19][11] := t*c*0.07;
+        ModelMatrixName[12][13] := t*c*0.164;
+        ModelMatrixName[13][12] := t*c*0.164;
+        ModelMatrixName[12][14] := t*c*0.074;
+        ModelMatrixName[14][12] := t*c*0.074;
+        ModelMatrixName[12][15] := t*c*0.285;
+        ModelMatrixName[15][12] := t*c*0.285;
+        ModelMatrixName[12][16] := t*c*0.118;
+        ModelMatrixName[16][12] := t*c*0.118;
+        ModelMatrixName[12][17] := t*c*0.023;
+        ModelMatrixName[17][12] := t*c*0.023;
+        ModelMatrixName[12][18] := t*c*0.006;
+        ModelMatrixName[18][12] := t*c*0.006;
+        ModelMatrixName[12][19] := t*c*0.01;
+        ModelMatrixName[19][12] := t*c*0.01;
+        ModelMatrixName[13][14] := t*c*0.31;
+        ModelMatrixName[14][13] := t*c*0.31;
+        ModelMatrixName[13][15] := t*c*0.053;
+        ModelMatrixName[15][13] := t*c*0.053;
+        ModelMatrixName[13][16] := t*c*0.051;
+        ModelMatrixName[16][13] := t*c*0.051;
+        ModelMatrixName[13][17] := t*c*0.02;
+        ModelMatrixName[17][13] := t*c*0.02;
+        ModelMatrixName[13][18] := t*c*0.018;
+        ModelMatrixName[18][13] := t*c*0.018;
+        ModelMatrixName[13][19] := t*c*0.024;
+        ModelMatrixName[19][13] := t*c*0.024;
+        ModelMatrixName[14][15] := t*c*0.101;
+        ModelMatrixName[15][14] := t*c*0.101;
+        ModelMatrixName[14][16] := t*c*0.064;
+        ModelMatrixName[16][14] := t*c*0.064;
+        ModelMatrixName[14][17] := t*c*0.017;
+        ModelMatrixName[17][14] := t*c*0.017;
+        ModelMatrixName[14][18] := t*c*0.126;
+        ModelMatrixName[18][14] := t*c*0.126;
+        ModelMatrixName[14][19] := t*c*0.02;
+        ModelMatrixName[19][14] := t*c*0.02;
+        ModelMatrixName[15][16] := t*c*0.477;
+        ModelMatrixName[16][15] := t*c*0.477;
+        ModelMatrixName[15][17] := t*c*0.038;
+        ModelMatrixName[17][15] := t*c*0.038;
+        ModelMatrixName[15][18] := t*c*0.035;
+        ModelMatrixName[18][15] := t*c*0.035;
+        ModelMatrixName[15][19] := t*c*0.063;
+        ModelMatrixName[19][15] := t*c*0.063;
+        ModelMatrixName[16][17] := t*c*0.112;
+        ModelMatrixName[17][16] := t*c*0.112;
+        ModelMatrixName[16][18] := t*c*0.012;
+        ModelMatrixName[18][16] := t*c*0.012;
+        ModelMatrixName[16][19] := t*c*0.021;
+        ModelMatrixName[19][16] := t*c*0.021;
+        ModelMatrixName[17][18] := t*c*0.025;
+        ModelMatrixName[18][17] := t*c*0.025;
+        ModelMatrixName[17][19] := t*c*0.016;
+        ModelMatrixName[19][17] := t*c*0.016;
+        ModelMatrixName[18][19] := t*c*0.071;
+        ModelMatrixName[19][18] := t*c*0.071;
+	}
+	else
+	{
+		ModelMatrixName[0][1] := t*0.056;
+        ModelMatrixName[1][0] := t*0.056;
+        ModelMatrixName[0][2] := t*0.081;
+        ModelMatrixName[2][0] := t*0.081;
+        ModelMatrixName[0][3] := t*0.105;
+        ModelMatrixName[3][0] := t*0.105;
+        ModelMatrixName[0][4] := t*0.015;
+        ModelMatrixName[4][0] := t*0.015;
+        ModelMatrixName[0][5] := t*0.179;
+        ModelMatrixName[5][0] := t*0.179;
+        ModelMatrixName[0][6] := t*0.027;
+        ModelMatrixName[6][0] := t*0.027;
+        ModelMatrixName[0][7] := t*0.036;
+        ModelMatrixName[7][0] := t*0.036;
+        ModelMatrixName[0][8] := t*0.035;
+        ModelMatrixName[8][0] := t*0.035;
+        ModelMatrixName[0][9] := t*0.03;
+        ModelMatrixName[9][0] := t*0.03;
+        ModelMatrixName[0][10] := t*0.054;
+        ModelMatrixName[10][0] := t*0.054;
+        ModelMatrixName[0][11] := t*0.054;
+        ModelMatrixName[11][0] := t*0.054;
+        ModelMatrixName[0][12] := t*0.194;
+        ModelMatrixName[12][0] := t*0.194;
+        ModelMatrixName[0][13] := t*0.057;
+        ModelMatrixName[13][0] := t*0.057;
+        ModelMatrixName[0][14] := t*0.058;
+        ModelMatrixName[14][0] := t*0.058;
+        ModelMatrixName[0][15] := t*0.378;
+        ModelMatrixName[15][0] := t*0.378;
+        ModelMatrixName[0][16] := t*0.475;
+        ModelMatrixName[16][0] := t*0.475;
+        ModelMatrixName[0][17] := t*0.298;
+        ModelMatrixName[17][0] := t*0.298;
+        ModelMatrixName[0][18] := t*0.009;
+        ModelMatrixName[18][0] := t*0.009;
+        ModelMatrixName[0][19] := t*0.011;
+        ModelMatrixName[19][0] := t*0.011;
+        ModelMatrixName[1][2] := t*0.01;
+        ModelMatrixName[2][1] := t*0.01;
+        ModelMatrixName[1][3] := t*0.005;
+        ModelMatrixName[3][1] := t*0.005;
+        ModelMatrixName[1][4] := t*0.078;
+        ModelMatrixName[4][1] := t*0.078;
+        ModelMatrixName[1][5] := t*0.059;
+        ModelMatrixName[5][1] := t*0.059;
+        ModelMatrixName[1][6] := t*0.069;
+        ModelMatrixName[6][1] := t*0.069;
+        ModelMatrixName[1][7] := t*0.017;
+        ModelMatrixName[7][1] := t*0.017;
+        ModelMatrixName[1][8] := t*0.007;
+        ModelMatrixName[8][1] := t*0.007;
+        ModelMatrixName[1][9] := t*0.023;
+        ModelMatrixName[9][1] := t*0.023;
+        ModelMatrixName[1][10] := t*0.031;
+        ModelMatrixName[10][1] := t*0.031;
+        ModelMatrixName[1][11] := t*0.034;
+        ModelMatrixName[11][1] := t*0.034;
+        ModelMatrixName[1][12] := t*0.014;
+        ModelMatrixName[12][1] := t*0.014;
+        ModelMatrixName[1][13] := t*0.009;
+        ModelMatrixName[13][1] := t*0.009;
+        ModelMatrixName[1][14] := t*0.113;
+        ModelMatrixName[14][1] := t*0.113;
+        ModelMatrixName[1][15] := t*0.223;
+        ModelMatrixName[15][1] := t*0.223;
+        ModelMatrixName[1][16] := t*0.042;
+        ModelMatrixName[16][1] := t*0.042;
+        ModelMatrixName[1][17] := t*0.062;
+        ModelMatrixName[17][1] := t*0.062;
+        ModelMatrixName[1][18] := t*0.115;
+        ModelMatrixName[18][1] := t*0.115;
+        ModelMatrixName[1][19] := t*0.209;
+        ModelMatrixName[19][1] := t*0.209;
+        ModelMatrixName[2][3] := t*0.767;
+        ModelMatrixName[3][2] := t*0.767;
+        ModelMatrixName[2][4] := t*0.004;
+        ModelMatrixName[4][2] := t*0.004;
+        ModelMatrixName[2][5] := t*0.13;
+        ModelMatrixName[5][2] := t*0.13;
+        ModelMatrixName[2][6] := t*0.112;
+        ModelMatrixName[6][2] := t*0.112;
+        ModelMatrixName[2][7] := t*0.011;
+        ModelMatrixName[7][2] := t*0.011;
+        ModelMatrixName[2][8] := t*0.026;
+        ModelMatrixName[8][2] := t*0.026;
+        ModelMatrixName[2][9] := t*0.007;
+        ModelMatrixName[9][2] := t*0.007;
+        ModelMatrixName[2][10] := t*0.015;
+        ModelMatrixName[10][2] := t*0.015;
+        ModelMatrixName[2][11] := t*0.528;
+        ModelMatrixName[11][2] := t*0.528;
+        ModelMatrixName[2][12] := t*0.015;
+        ModelMatrixName[12][2] := t*0.015;
+        ModelMatrixName[2][13] := t*0.049;
+        ModelMatrixName[13][2] := t*0.049;
+        ModelMatrixName[2][14] := t*0.016;
+        ModelMatrixName[14][2] := t*0.016;
+        ModelMatrixName[2][15] := t*0.059;
+        ModelMatrixName[15][2] := t*0.059;
+        ModelMatrixName[2][16] := t*0.038;
+        ModelMatrixName[16][2] := t*0.038;
+        ModelMatrixName[2][17] := t*0.031;
+        ModelMatrixName[17][2] := t*0.031;
+        ModelMatrixName[2][18] := t*0.004;
+        ModelMatrixName[18][2] := t*0.004;
+        ModelMatrixName[2][19] := t*0.046;
+        ModelMatrixName[19][2] := t*0.046;
+        ModelMatrixName[3][4] := t*0.005;
+        ModelMatrixName[4][3] := t*0.005;
+        ModelMatrixName[3][5] := t*0.119;
+        ModelMatrixName[5][3] := t*0.119;
+        ModelMatrixName[3][6] := t*0.026;
+        ModelMatrixName[6][3] := t*0.026;
+        ModelMatrixName[3][7] := t*0.012;
+        ModelMatrixName[7][3] := t*0.012;
+        ModelMatrixName[3][8] := t*0.181;
+        ModelMatrixName[8][3] := t*0.181;
+        ModelMatrixName[3][9] := t*0.009;
+        ModelMatrixName[9][3] := t*0.009;
+        ModelMatrixName[3][10] := t*0.018;
+        ModelMatrixName[10][3] := t*0.018;
+        ModelMatrixName[3][11] := t*0.058;
+        ModelMatrixName[11][3] := t*0.058;
+        ModelMatrixName[3][12] := t*0.018;
+        ModelMatrixName[12][3] := t*0.018;
+        ModelMatrixName[3][13] := t*0.323;
+        ModelMatrixName[13][3] := t*0.323;
+        ModelMatrixName[3][14] := t*0.029;
+        ModelMatrixName[14][3] := t*0.029;
+        ModelMatrixName[3][15] := t*0.03;
+        ModelMatrixName[15][3] := t*0.03;
+        ModelMatrixName[3][16] := t*0.032;
+        ModelMatrixName[16][3] := t*0.032;
+        ModelMatrixName[3][17] := t*0.045;
+        ModelMatrixName[17][3] := t*0.045;
+        ModelMatrixName[3][18] := t*0.01;
+        ModelMatrixName[18][3] := t*0.01;
+        ModelMatrixName[3][19] := t*0.007;
+        ModelMatrixName[19][3] := t*0.007;
+        ModelMatrixName[4][5] := t*0.005;
+        ModelMatrixName[5][4] := t*0.005;
+        ModelMatrixName[4][6] := t*0.04;
+        ModelMatrixName[6][4] := t*0.04;
+        ModelMatrixName[4][7] := t*0.089;
+        ModelMatrixName[7][4] := t*0.089;
+        ModelMatrixName[4][8] := t*0.004;
+        ModelMatrixName[8][4] := t*0.004;
+        ModelMatrixName[4][9] := t*0.248;
+        ModelMatrixName[9][4] := t*0.248;
+        ModelMatrixName[4][10] := t*0.043;
+        ModelMatrixName[10][4] := t*0.043;
+        ModelMatrixName[4][11] := t*0.01;
+        ModelMatrixName[11][4] := t*0.01;
+        ModelMatrixName[4][12] := t*0.017;
+        ModelMatrixName[12][4] := t*0.017;
+        ModelMatrixName[4][13] := t*0.004;
+        ModelMatrixName[13][4] := t*0.004;
+        ModelMatrixName[4][14] := t*0.005;
+        ModelMatrixName[14][4] := t*0.005;
+        ModelMatrixName[4][15] := t*0.092;
+        ModelMatrixName[15][4] := t*0.092;
+        ModelMatrixName[4][16] := t*0.012;
+        ModelMatrixName[16][4] := t*0.012;
+        ModelMatrixName[4][17] := t*0.062;
+        ModelMatrixName[17][4] := t*0.062;
+        ModelMatrixName[4][18] := t*0.053;
+        ModelMatrixName[18][4] := t*0.053;
+        ModelMatrixName[4][19] := t*0.536;
+        ModelMatrixName[19][4] := t*0.536;
+        ModelMatrixName[5][6] := t*0.023;
+        ModelMatrixName[6][5] := t*0.023;
+        ModelMatrixName[5][7] := t*0.006;
+        ModelMatrixName[7][5] := t*0.006;
+        ModelMatrixName[5][8] := t*0.027;
+        ModelMatrixName[8][5] := t*0.027;
+        ModelMatrixName[5][9] := t*0.006;
+        ModelMatrixName[9][5] := t*0.006;
+        ModelMatrixName[5][10] := t*0.014;
+        ModelMatrixName[10][5] := t*0.014;
+        ModelMatrixName[5][11] := t*0.081;
+        ModelMatrixName[11][5] := t*0.081;
+        ModelMatrixName[5][12] := t*0.024;
+        ModelMatrixName[12][5] := t*0.024;
+        ModelMatrixName[5][13] := t*0.026;
+        ModelMatrixName[13][5] := t*0.026;
+        ModelMatrixName[5][14] := t*0.137;
+        ModelMatrixName[14][5] := t*0.137;
+        ModelMatrixName[5][15] := t*0.201;
+        ModelMatrixName[15][5] := t*0.201;
+        ModelMatrixName[5][16] := t*0.033;
+        ModelMatrixName[16][5] := t*0.033;
+        ModelMatrixName[5][17] := t*0.047;
+        ModelMatrixName[17][5] := t*0.047;
+        ModelMatrixName[5][18] := t*0.055;
+        ModelMatrixName[18][5] := t*0.055;
+        ModelMatrixName[5][19] := t*0.008;
+        ModelMatrixName[19][5] := t*0.008;
+        ModelMatrixName[6][7] := t*0.016;
+        ModelMatrixName[7][6] := t*0.016;
+        ModelMatrixName[6][8] := t*0.045;
+        ModelMatrixName[8][6] := t*0.045;
+        ModelMatrixName[6][9] := t*0.056;
+        ModelMatrixName[9][6] := t*0.056;
+        ModelMatrixName[6][10] := t*0.033;
+        ModelMatrixName[10][6] := t*0.033;
+        ModelMatrixName[6][11] := t*0.391;
+        ModelMatrixName[11][6] := t*0.391;
+        ModelMatrixName[6][12] := t*0.115;
+        ModelMatrixName[12][6] := t*0.115;
+        ModelMatrixName[6][13] := t*0.597;
+        ModelMatrixName[13][6] := t*0.597;
+        ModelMatrixName[6][14] := t*0.328;
+        ModelMatrixName[14][6] := t*0.328;
+        ModelMatrixName[6][15] := t*0.073;
+        ModelMatrixName[15][6] := t*0.073;
+        ModelMatrixName[6][16] := t*0.046;
+        ModelMatrixName[16][6] := t*0.046;
+        ModelMatrixName[6][17] := t*0.011;
+        ModelMatrixName[17][6] := t*0.011;
+        ModelMatrixName[6][18] := t*0.008;
+        ModelMatrixName[18][6] := t*0.008;
+        ModelMatrixName[6][19] := t*0.573;
+        ModelMatrixName[19][6] := t*0.573;
+        ModelMatrixName[7][8] := t*0.021;
+        ModelMatrixName[8][7] := t*0.021;
+        ModelMatrixName[7][9] := t*0.229;
+        ModelMatrixName[9][7] := t*0.229;
+        ModelMatrixName[7][10] := t*0.479;
+        ModelMatrixName[10][7] := t*0.479;
+        ModelMatrixName[7][11] := t*0.047;
+        ModelMatrixName[11][7] := t*0.047;
+        ModelMatrixName[7][12] := t*0.01;
+        ModelMatrixName[12][7] := t*0.01;
+        ModelMatrixName[7][13] := t*0.009;
+        ModelMatrixName[13][7] := t*0.009;
+        ModelMatrixName[7][14] := t*0.022;
+        ModelMatrixName[14][7] := t*0.022;
+        ModelMatrixName[7][15] := t*0.04;
+        ModelMatrixName[15][7] := t*0.04;
+        ModelMatrixName[7][16] := t*0.245;
+        ModelMatrixName[16][7] := t*0.245;
+        ModelMatrixName[7][17] := t*0.961;
+        ModelMatrixName[17][7] := t*0.961;
+        ModelMatrixName[7][18] := t*0.009;
+        ModelMatrixName[18][7] := t*0.009;
+        ModelMatrixName[7][19] := t*0.032;
+        ModelMatrixName[19][7] := t*0.032;
+        ModelMatrixName[8][9] := t*0.014;
+        ModelMatrixName[9][8] := t*0.014;
+        ModelMatrixName[8][10] := t*0.065;
+        ModelMatrixName[10][8] := t*0.065;
+        ModelMatrixName[8][11] := t*0.263;
+        ModelMatrixName[11][8] := t*0.263;
+        ModelMatrixName[8][12] := t*0.021;
+        ModelMatrixName[12][8] := t*0.021;
+        ModelMatrixName[8][13] := t*0.292;
+        ModelMatrixName[13][8] := t*0.292;
+        ModelMatrixName[8][14] := t*0.646;
+        ModelMatrixName[14][8] := t*0.646;
+        ModelMatrixName[8][15] := t*0.047;
+        ModelMatrixName[15][8] := t*0.047;
+        ModelMatrixName[8][16] := t*0.103;
+        ModelMatrixName[16][8] := t*0.103;
+        ModelMatrixName[8][17] := t*0.014;
+        ModelMatrixName[17][8] := t*0.014;
+        ModelMatrixName[8][18] := t*0.01;
+        ModelMatrixName[18][8] := t*0.01;
+        ModelMatrixName[8][19] := t*0.008;
+        ModelMatrixName[19][8] := t*0.008;
+        ModelMatrixName[9][10] := t*0.388;
+        ModelMatrixName[10][9] := t*0.388;
+        ModelMatrixName[9][11] := t*0.012;
+        ModelMatrixName[11][9] := t*0.012;
+        ModelMatrixName[9][12] := t*0.102;
+        ModelMatrixName[12][9] := t*0.102;
+        ModelMatrixName[9][13] := t*0.072;
+        ModelMatrixName[13][9] := t*0.072;
+        ModelMatrixName[9][14] := t*0.038;
+        ModelMatrixName[14][9] := t*0.038;
+        ModelMatrixName[9][15] := t*0.059;
+        ModelMatrixName[15][9] := t*0.059;
+        ModelMatrixName[9][16] := t*0.025;
+        ModelMatrixName[16][9] := t*0.025;
+        ModelMatrixName[9][17] := t*0.18;
+        ModelMatrixName[17][9] := t*0.18;
+        ModelMatrixName[9][18] := t*0.052;
+        ModelMatrixName[18][9] := t*0.052;
+        ModelMatrixName[9][19] := t*0.024;
+        ModelMatrixName[19][9] := t*0.024;
+        ModelMatrixName[10][11] := t*0.03;
+        ModelMatrixName[11][10] := t*0.03;
+        ModelMatrixName[10][12] := t*0.016;
+        ModelMatrixName[12][10] := t*0.016;
+        ModelMatrixName[10][13] := t*0.043;
+        ModelMatrixName[13][10] := t*0.043;
+        ModelMatrixName[10][14] := t*0.044;
+        ModelMatrixName[14][10] := t*0.044;
+        ModelMatrixName[10][15] := t*0.029;
+        ModelMatrixName[15][10] := t*0.029;
+        ModelMatrixName[10][16] := t*0.226;
+        ModelMatrixName[16][10] := t*0.226;
+        ModelMatrixName[10][17] := t*0.323;
+        ModelMatrixName[17][10] := t*0.323;
+        ModelMatrixName[10][18] := t*0.024;
+        ModelMatrixName[18][10] := t*0.024;
+        ModelMatrixName[10][19] := t*0.018;
+        ModelMatrixName[19][10] := t*0.018;
+        ModelMatrixName[11][12] := t*0.015;
+        ModelMatrixName[12][11] := t*0.015;
+        ModelMatrixName[11][13] := t*0.086;
+        ModelMatrixName[13][11] := t*0.086;
+        ModelMatrixName[11][14] := t*0.045;
+        ModelMatrixName[14][11] := t*0.045;
+        ModelMatrixName[11][15] := t*0.503;
+        ModelMatrixName[15][11] := t*0.503;
+        ModelMatrixName[11][16] := t*0.232;
+        ModelMatrixName[16][11] := t*0.232;
+        ModelMatrixName[11][17] := t*0.016;
+        ModelMatrixName[17][11] := t*0.016;
+        ModelMatrixName[11][18] := t*0.008;
+        ModelMatrixName[18][11] := t*0.008;
+        ModelMatrixName[11][19] := t*0.07;
+        ModelMatrixName[19][11] := t*0.07;
+        ModelMatrixName[12][13] := t*0.164;
+        ModelMatrixName[13][12] := t*0.164;
+        ModelMatrixName[12][14] := t*0.074;
+        ModelMatrixName[14][12] := t*0.074;
+        ModelMatrixName[12][15] := t*0.285;
+        ModelMatrixName[15][12] := t*0.285;
+        ModelMatrixName[12][16] := t*0.118;
+        ModelMatrixName[16][12] := t*0.118;
+        ModelMatrixName[12][17] := t*0.023;
+        ModelMatrixName[17][12] := t*0.023;
+        ModelMatrixName[12][18] := t*0.006;
+        ModelMatrixName[18][12] := t*0.006;
+        ModelMatrixName[12][19] := t*0.01;
+        ModelMatrixName[19][12] := t*0.01;
+        ModelMatrixName[13][14] := t*0.31;
+        ModelMatrixName[14][13] := t*0.31;
+        ModelMatrixName[13][15] := t*0.053;
+        ModelMatrixName[15][13] := t*0.053;
+        ModelMatrixName[13][16] := t*0.051;
+        ModelMatrixName[16][13] := t*0.051;
+        ModelMatrixName[13][17] := t*0.02;
+        ModelMatrixName[17][13] := t*0.02;
+        ModelMatrixName[13][18] := t*0.018;
+        ModelMatrixName[18][13] := t*0.018;
+        ModelMatrixName[13][19] := t*0.024;
+        ModelMatrixName[19][13] := t*0.024;
+        ModelMatrixName[14][15] := t*0.101;
+        ModelMatrixName[15][14] := t*0.101;
+        ModelMatrixName[14][16] := t*0.064;
+        ModelMatrixName[16][14] := t*0.064;
+        ModelMatrixName[14][17] := t*0.017;
+        ModelMatrixName[17][14] := t*0.017;
+        ModelMatrixName[14][18] := t*0.126;
+        ModelMatrixName[18][14] := t*0.126;
+        ModelMatrixName[14][19] := t*0.02;
+        ModelMatrixName[19][14] := t*0.02;
+        ModelMatrixName[15][16] := t*0.477;
+        ModelMatrixName[16][15] := t*0.477;
+        ModelMatrixName[15][17] := t*0.038;
+        ModelMatrixName[17][15] := t*0.038;
+        ModelMatrixName[15][18] := t*0.035;
+        ModelMatrixName[18][15] := t*0.035;
+        ModelMatrixName[15][19] := t*0.063;
+        ModelMatrixName[19][15] := t*0.063;
+        ModelMatrixName[16][17] := t*0.112;
+        ModelMatrixName[17][16] := t*0.112;
+        ModelMatrixName[16][18] := t*0.012;
+        ModelMatrixName[18][16] := t*0.012;
+        ModelMatrixName[16][19] := t*0.021;
+        ModelMatrixName[19][16] := t*0.021;
+        ModelMatrixName[17][18] := t*0.025;
+        ModelMatrixName[18][17] := t*0.025;
+        ModelMatrixName[17][19] := t*0.016;
+        ModelMatrixName[19][17] := t*0.016;
+        ModelMatrixName[18][19] := t*0.071;
+        ModelMatrixName[19][18] := t*0.071;
+    }
+	return 1;
+}
+
+
+equalFreqs={20,1};
+equalFreqs[0][0]=0.076748;
+equalFreqs[14][0]=0.051691;
+equalFreqs[11][0]=0.042645;
+equalFreqs[2][0]=0.051544;
+equalFreqs[1][0]=0.019803;
+equalFreqs[13][0]=0.040752;
+equalFreqs[3][0]=0.06183;
+equalFreqs[5][0]=0.073152;
+equalFreqs[6][0]=0.022944;
+equalFreqs[7][0]=0.053761;
+equalFreqs[9][0]=0.091904;
+equalFreqs[8][0]=0.058676;
+equalFreqs[10][0]=0.023826;
+equalFreqs[4][0]=0.040126;
+equalFreqs[12][0]=0.050901;
+equalFreqs[15][0]=0.068765;
+equalFreqs[16][0]=0.058565;
+equalFreqs[18][0]=0.014261;
+equalFreqs[19][0]=0.032102;
+equalFreqs[17][0]=0.066005;
+
+jonesModel = 0;
+
+MULTIPLY_BY_FREQS = PopulateModelMatrix ("jonesModel",equalFreqs);
+
+Model JonesModel = (jonesModel, equalFreqs, MULTIPLY_BY_FREQS);
+
+FREQUENCY_SENSITIVE = 0;
diff --git a/res/TemplateBatchFiles/TemplateModels/Jones_F.mdl b/res/TemplateBatchFiles/TemplateModels/Jones_F.mdl
new file mode 100644
index 0000000..b49a359
--- /dev/null
+++ b/res/TemplateBatchFiles/TemplateModels/Jones_F.mdl
@@ -0,0 +1,804 @@
+#include "modelParameters2.mdl";
+
+if (!SKIP_MODEL_PARAMETER_LIST)
+{
+	if (modelType == 1)
+	{
+		#include "defineGamma.mdl";
+	}	
+	if (modelType == 2)
+	{
+		#include "defineHM.mdl";
+	}
+}
+
+
+NICETY_LEVEL = 2;
+
+function PopulateModelMatrix (ModelMatrixName&, EFV)
+{
+
+	ModelMatrixName = {20,20};
+	
+	if (categoriesUsed)
+	{
+        ModelMatrixName[0][1] := t*c*0.056;
+        ModelMatrixName[1][0] := t*c*0.056;
+        ModelMatrixName[0][2] := t*c*0.081;
+        ModelMatrixName[2][0] := t*c*0.081;
+        ModelMatrixName[0][3] := t*c*0.105;
+        ModelMatrixName[3][0] := t*c*0.105;
+        ModelMatrixName[0][4] := t*c*0.015;
+        ModelMatrixName[4][0] := t*c*0.015;
+        ModelMatrixName[0][5] := t*c*0.179;
+        ModelMatrixName[5][0] := t*c*0.179;
+        ModelMatrixName[0][6] := t*c*0.027;
+        ModelMatrixName[6][0] := t*c*0.027;
+        ModelMatrixName[0][7] := t*c*0.036;
+        ModelMatrixName[7][0] := t*c*0.036;
+        ModelMatrixName[0][8] := t*c*0.035;
+        ModelMatrixName[8][0] := t*c*0.035;
+        ModelMatrixName[0][9] := t*c*0.03;
+        ModelMatrixName[9][0] := t*c*0.03;
+        ModelMatrixName[0][10] := t*c*0.054;
+        ModelMatrixName[10][0] := t*c*0.054;
+        ModelMatrixName[0][11] := t*c*0.054;
+        ModelMatrixName[11][0] := t*c*0.054;
+        ModelMatrixName[0][12] := t*c*0.194;
+        ModelMatrixName[12][0] := t*c*0.194;
+        ModelMatrixName[0][13] := t*c*0.057;
+        ModelMatrixName[13][0] := t*c*0.057;
+        ModelMatrixName[0][14] := t*c*0.058;
+        ModelMatrixName[14][0] := t*c*0.058;
+        ModelMatrixName[0][15] := t*c*0.378;
+        ModelMatrixName[15][0] := t*c*0.378;
+        ModelMatrixName[0][16] := t*c*0.475;
+        ModelMatrixName[16][0] := t*c*0.475;
+        ModelMatrixName[0][17] := t*c*0.298;
+        ModelMatrixName[17][0] := t*c*0.298;
+        ModelMatrixName[0][18] := t*c*0.009;
+        ModelMatrixName[18][0] := t*c*0.009;
+        ModelMatrixName[0][19] := t*c*0.011;
+        ModelMatrixName[19][0] := t*c*0.011;
+        ModelMatrixName[1][2] := t*c*0.01;
+        ModelMatrixName[2][1] := t*c*0.01;
+        ModelMatrixName[1][3] := t*c*0.005;
+        ModelMatrixName[3][1] := t*c*0.005;
+        ModelMatrixName[1][4] := t*c*0.078;
+        ModelMatrixName[4][1] := t*c*0.078;
+        ModelMatrixName[1][5] := t*c*0.059;
+        ModelMatrixName[5][1] := t*c*0.059;
+        ModelMatrixName[1][6] := t*c*0.069;
+        ModelMatrixName[6][1] := t*c*0.069;
+        ModelMatrixName[1][7] := t*c*0.017;
+        ModelMatrixName[7][1] := t*c*0.017;
+        ModelMatrixName[1][8] := t*c*0.007;
+        ModelMatrixName[8][1] := t*c*0.007;
+        ModelMatrixName[1][9] := t*c*0.023;
+        ModelMatrixName[9][1] := t*c*0.023;
+        ModelMatrixName[1][10] := t*c*0.031;
+        ModelMatrixName[10][1] := t*c*0.031;
+        ModelMatrixName[1][11] := t*c*0.034;
+        ModelMatrixName[11][1] := t*c*0.034;
+        ModelMatrixName[1][12] := t*c*0.014;
+        ModelMatrixName[12][1] := t*c*0.014;
+        ModelMatrixName[1][13] := t*c*0.009;
+        ModelMatrixName[13][1] := t*c*0.009;
+        ModelMatrixName[1][14] := t*c*0.113;
+        ModelMatrixName[14][1] := t*c*0.113;
+        ModelMatrixName[1][15] := t*c*0.223;
+        ModelMatrixName[15][1] := t*c*0.223;
+        ModelMatrixName[1][16] := t*c*0.042;
+        ModelMatrixName[16][1] := t*c*0.042;
+        ModelMatrixName[1][17] := t*c*0.062;
+        ModelMatrixName[17][1] := t*c*0.062;
+        ModelMatrixName[1][18] := t*c*0.115;
+        ModelMatrixName[18][1] := t*c*0.115;
+        ModelMatrixName[1][19] := t*c*0.209;
+        ModelMatrixName[19][1] := t*c*0.209;
+        ModelMatrixName[2][3] := t*c*0.767;
+        ModelMatrixName[3][2] := t*c*0.767;
+        ModelMatrixName[2][4] := t*c*0.004;
+        ModelMatrixName[4][2] := t*c*0.004;
+        ModelMatrixName[2][5] := t*c*0.13;
+        ModelMatrixName[5][2] := t*c*0.13;
+        ModelMatrixName[2][6] := t*c*0.112;
+        ModelMatrixName[6][2] := t*c*0.112;
+        ModelMatrixName[2][7] := t*c*0.011;
+        ModelMatrixName[7][2] := t*c*0.011;
+        ModelMatrixName[2][8] := t*c*0.026;
+        ModelMatrixName[8][2] := t*c*0.026;
+        ModelMatrixName[2][9] := t*c*0.007;
+        ModelMatrixName[9][2] := t*c*0.007;
+        ModelMatrixName[2][10] := t*c*0.015;
+        ModelMatrixName[10][2] := t*c*0.015;
+        ModelMatrixName[2][11] := t*c*0.528;
+        ModelMatrixName[11][2] := t*c*0.528;
+        ModelMatrixName[2][12] := t*c*0.015;
+        ModelMatrixName[12][2] := t*c*0.015;
+        ModelMatrixName[2][13] := t*c*0.049;
+        ModelMatrixName[13][2] := t*c*0.049;
+        ModelMatrixName[2][14] := t*c*0.016;
+        ModelMatrixName[14][2] := t*c*0.016;
+        ModelMatrixName[2][15] := t*c*0.059;
+        ModelMatrixName[15][2] := t*c*0.059;
+        ModelMatrixName[2][16] := t*c*0.038;
+        ModelMatrixName[16][2] := t*c*0.038;
+        ModelMatrixName[2][17] := t*c*0.031;
+        ModelMatrixName[17][2] := t*c*0.031;
+        ModelMatrixName[2][18] := t*c*0.004;
+        ModelMatrixName[18][2] := t*c*0.004;
+        ModelMatrixName[2][19] := t*c*0.046;
+        ModelMatrixName[19][2] := t*c*0.046;
+        ModelMatrixName[3][4] := t*c*0.005;
+        ModelMatrixName[4][3] := t*c*0.005;
+        ModelMatrixName[3][5] := t*c*0.119;
+        ModelMatrixName[5][3] := t*c*0.119;
+        ModelMatrixName[3][6] := t*c*0.026;
+        ModelMatrixName[6][3] := t*c*0.026;
+        ModelMatrixName[3][7] := t*c*0.012;
+        ModelMatrixName[7][3] := t*c*0.012;
+        ModelMatrixName[3][8] := t*c*0.181;
+        ModelMatrixName[8][3] := t*c*0.181;
+        ModelMatrixName[3][9] := t*c*0.009;
+        ModelMatrixName[9][3] := t*c*0.009;
+        ModelMatrixName[3][10] := t*c*0.018;
+        ModelMatrixName[10][3] := t*c*0.018;
+        ModelMatrixName[3][11] := t*c*0.058;
+        ModelMatrixName[11][3] := t*c*0.058;
+        ModelMatrixName[3][12] := t*c*0.018;
+        ModelMatrixName[12][3] := t*c*0.018;
+        ModelMatrixName[3][13] := t*c*0.323;
+        ModelMatrixName[13][3] := t*c*0.323;
+        ModelMatrixName[3][14] := t*c*0.029;
+        ModelMatrixName[14][3] := t*c*0.029;
+        ModelMatrixName[3][15] := t*c*0.03;
+        ModelMatrixName[15][3] := t*c*0.03;
+        ModelMatrixName[3][16] := t*c*0.032;
+        ModelMatrixName[16][3] := t*c*0.032;
+        ModelMatrixName[3][17] := t*c*0.045;
+        ModelMatrixName[17][3] := t*c*0.045;
+        ModelMatrixName[3][18] := t*c*0.01;
+        ModelMatrixName[18][3] := t*c*0.01;
+        ModelMatrixName[3][19] := t*c*0.007;
+        ModelMatrixName[19][3] := t*c*0.007;
+        ModelMatrixName[4][5] := t*c*0.005;
+        ModelMatrixName[5][4] := t*c*0.005;
+        ModelMatrixName[4][6] := t*c*0.04;
+        ModelMatrixName[6][4] := t*c*0.04;
+        ModelMatrixName[4][7] := t*c*0.089;
+        ModelMatrixName[7][4] := t*c*0.089;
+        ModelMatrixName[4][8] := t*c*0.004;
+        ModelMatrixName[8][4] := t*c*0.004;
+        ModelMatrixName[4][9] := t*c*0.248;
+        ModelMatrixName[9][4] := t*c*0.248;
+        ModelMatrixName[4][10] := t*c*0.043;
+        ModelMatrixName[10][4] := t*c*0.043;
+        ModelMatrixName[4][11] := t*c*0.01;
+        ModelMatrixName[11][4] := t*c*0.01;
+        ModelMatrixName[4][12] := t*c*0.017;
+        ModelMatrixName[12][4] := t*c*0.017;
+        ModelMatrixName[4][13] := t*c*0.004;
+        ModelMatrixName[13][4] := t*c*0.004;
+        ModelMatrixName[4][14] := t*c*0.005;
+        ModelMatrixName[14][4] := t*c*0.005;
+        ModelMatrixName[4][15] := t*c*0.092;
+        ModelMatrixName[15][4] := t*c*0.092;
+        ModelMatrixName[4][16] := t*c*0.012;
+        ModelMatrixName[16][4] := t*c*0.012;
+        ModelMatrixName[4][17] := t*c*0.062;
+        ModelMatrixName[17][4] := t*c*0.062;
+        ModelMatrixName[4][18] := t*c*0.053;
+        ModelMatrixName[18][4] := t*c*0.053;
+        ModelMatrixName[4][19] := t*c*0.536;
+        ModelMatrixName[19][4] := t*c*0.536;
+        ModelMatrixName[5][6] := t*c*0.023;
+        ModelMatrixName[6][5] := t*c*0.023;
+        ModelMatrixName[5][7] := t*c*0.006;
+        ModelMatrixName[7][5] := t*c*0.006;
+        ModelMatrixName[5][8] := t*c*0.027;
+        ModelMatrixName[8][5] := t*c*0.027;
+        ModelMatrixName[5][9] := t*c*0.006;
+        ModelMatrixName[9][5] := t*c*0.006;
+        ModelMatrixName[5][10] := t*c*0.014;
+        ModelMatrixName[10][5] := t*c*0.014;
+        ModelMatrixName[5][11] := t*c*0.081;
+        ModelMatrixName[11][5] := t*c*0.081;
+        ModelMatrixName[5][12] := t*c*0.024;
+        ModelMatrixName[12][5] := t*c*0.024;
+        ModelMatrixName[5][13] := t*c*0.026;
+        ModelMatrixName[13][5] := t*c*0.026;
+        ModelMatrixName[5][14] := t*c*0.137;
+        ModelMatrixName[14][5] := t*c*0.137;
+        ModelMatrixName[5][15] := t*c*0.201;
+        ModelMatrixName[15][5] := t*c*0.201;
+        ModelMatrixName[5][16] := t*c*0.033;
+        ModelMatrixName[16][5] := t*c*0.033;
+        ModelMatrixName[5][17] := t*c*0.047;
+        ModelMatrixName[17][5] := t*c*0.047;
+        ModelMatrixName[5][18] := t*c*0.055;
+        ModelMatrixName[18][5] := t*c*0.055;
+        ModelMatrixName[5][19] := t*c*0.008;
+        ModelMatrixName[19][5] := t*c*0.008;
+        ModelMatrixName[6][7] := t*c*0.016;
+        ModelMatrixName[7][6] := t*c*0.016;
+        ModelMatrixName[6][8] := t*c*0.045;
+        ModelMatrixName[8][6] := t*c*0.045;
+        ModelMatrixName[6][9] := t*c*0.056;
+        ModelMatrixName[9][6] := t*c*0.056;
+        ModelMatrixName[6][10] := t*c*0.033;
+        ModelMatrixName[10][6] := t*c*0.033;
+        ModelMatrixName[6][11] := t*c*0.391;
+        ModelMatrixName[11][6] := t*c*0.391;
+        ModelMatrixName[6][12] := t*c*0.115;
+        ModelMatrixName[12][6] := t*c*0.115;
+        ModelMatrixName[6][13] := t*c*0.597;
+        ModelMatrixName[13][6] := t*c*0.597;
+        ModelMatrixName[6][14] := t*c*0.328;
+        ModelMatrixName[14][6] := t*c*0.328;
+        ModelMatrixName[6][15] := t*c*0.073;
+        ModelMatrixName[15][6] := t*c*0.073;
+        ModelMatrixName[6][16] := t*c*0.046;
+        ModelMatrixName[16][6] := t*c*0.046;
+        ModelMatrixName[6][17] := t*c*0.011;
+        ModelMatrixName[17][6] := t*c*0.011;
+        ModelMatrixName[6][18] := t*c*0.008;
+        ModelMatrixName[18][6] := t*c*0.008;
+        ModelMatrixName[6][19] := t*c*0.573;
+        ModelMatrixName[19][6] := t*c*0.573;
+        ModelMatrixName[7][8] := t*c*0.021;
+        ModelMatrixName[8][7] := t*c*0.021;
+        ModelMatrixName[7][9] := t*c*0.229;
+        ModelMatrixName[9][7] := t*c*0.229;
+        ModelMatrixName[7][10] := t*c*0.479;
+        ModelMatrixName[10][7] := t*c*0.479;
+        ModelMatrixName[7][11] := t*c*0.047;
+        ModelMatrixName[11][7] := t*c*0.047;
+        ModelMatrixName[7][12] := t*c*0.01;
+        ModelMatrixName[12][7] := t*c*0.01;
+        ModelMatrixName[7][13] := t*c*0.009;
+        ModelMatrixName[13][7] := t*c*0.009;
+        ModelMatrixName[7][14] := t*c*0.022;
+        ModelMatrixName[14][7] := t*c*0.022;
+        ModelMatrixName[7][15] := t*c*0.04;
+        ModelMatrixName[15][7] := t*c*0.04;
+        ModelMatrixName[7][16] := t*c*0.245;
+        ModelMatrixName[16][7] := t*c*0.245;
+        ModelMatrixName[7][17] := t*c*0.961;
+        ModelMatrixName[17][7] := t*c*0.961;
+        ModelMatrixName[7][18] := t*c*0.009;
+        ModelMatrixName[18][7] := t*c*0.009;
+        ModelMatrixName[7][19] := t*c*0.032;
+        ModelMatrixName[19][7] := t*c*0.032;
+        ModelMatrixName[8][9] := t*c*0.014;
+        ModelMatrixName[9][8] := t*c*0.014;
+        ModelMatrixName[8][10] := t*c*0.065;
+        ModelMatrixName[10][8] := t*c*0.065;
+        ModelMatrixName[8][11] := t*c*0.263;
+        ModelMatrixName[11][8] := t*c*0.263;
+        ModelMatrixName[8][12] := t*c*0.021;
+        ModelMatrixName[12][8] := t*c*0.021;
+        ModelMatrixName[8][13] := t*c*0.292;
+        ModelMatrixName[13][8] := t*c*0.292;
+        ModelMatrixName[8][14] := t*c*0.646;
+        ModelMatrixName[14][8] := t*c*0.646;
+        ModelMatrixName[8][15] := t*c*0.047;
+        ModelMatrixName[15][8] := t*c*0.047;
+        ModelMatrixName[8][16] := t*c*0.103;
+        ModelMatrixName[16][8] := t*c*0.103;
+        ModelMatrixName[8][17] := t*c*0.014;
+        ModelMatrixName[17][8] := t*c*0.014;
+        ModelMatrixName[8][18] := t*c*0.01;
+        ModelMatrixName[18][8] := t*c*0.01;
+        ModelMatrixName[8][19] := t*c*0.008;
+        ModelMatrixName[19][8] := t*c*0.008;
+        ModelMatrixName[9][10] := t*c*0.388;
+        ModelMatrixName[10][9] := t*c*0.388;
+        ModelMatrixName[9][11] := t*c*0.012;
+        ModelMatrixName[11][9] := t*c*0.012;
+        ModelMatrixName[9][12] := t*c*0.102;
+        ModelMatrixName[12][9] := t*c*0.102;
+        ModelMatrixName[9][13] := t*c*0.072;
+        ModelMatrixName[13][9] := t*c*0.072;
+        ModelMatrixName[9][14] := t*c*0.038;
+        ModelMatrixName[14][9] := t*c*0.038;
+        ModelMatrixName[9][15] := t*c*0.059;
+        ModelMatrixName[15][9] := t*c*0.059;
+        ModelMatrixName[9][16] := t*c*0.025;
+        ModelMatrixName[16][9] := t*c*0.025;
+        ModelMatrixName[9][17] := t*c*0.18;
+        ModelMatrixName[17][9] := t*c*0.18;
+        ModelMatrixName[9][18] := t*c*0.052;
+        ModelMatrixName[18][9] := t*c*0.052;
+        ModelMatrixName[9][19] := t*c*0.024;
+        ModelMatrixName[19][9] := t*c*0.024;
+        ModelMatrixName[10][11] := t*c*0.03;
+        ModelMatrixName[11][10] := t*c*0.03;
+        ModelMatrixName[10][12] := t*c*0.016;
+        ModelMatrixName[12][10] := t*c*0.016;
+        ModelMatrixName[10][13] := t*c*0.043;
+        ModelMatrixName[13][10] := t*c*0.043;
+        ModelMatrixName[10][14] := t*c*0.044;
+        ModelMatrixName[14][10] := t*c*0.044;
+        ModelMatrixName[10][15] := t*c*0.029;
+        ModelMatrixName[15][10] := t*c*0.029;
+        ModelMatrixName[10][16] := t*c*0.226;
+        ModelMatrixName[16][10] := t*c*0.226;
+        ModelMatrixName[10][17] := t*c*0.323;
+        ModelMatrixName[17][10] := t*c*0.323;
+        ModelMatrixName[10][18] := t*c*0.024;
+        ModelMatrixName[18][10] := t*c*0.024;
+        ModelMatrixName[10][19] := t*c*0.018;
+        ModelMatrixName[19][10] := t*c*0.018;
+        ModelMatrixName[11][12] := t*c*0.015;
+        ModelMatrixName[12][11] := t*c*0.015;
+        ModelMatrixName[11][13] := t*c*0.086;
+        ModelMatrixName[13][11] := t*c*0.086;
+        ModelMatrixName[11][14] := t*c*0.045;
+        ModelMatrixName[14][11] := t*c*0.045;
+        ModelMatrixName[11][15] := t*c*0.503;
+        ModelMatrixName[15][11] := t*c*0.503;
+        ModelMatrixName[11][16] := t*c*0.232;
+        ModelMatrixName[16][11] := t*c*0.232;
+        ModelMatrixName[11][17] := t*c*0.016;
+        ModelMatrixName[17][11] := t*c*0.016;
+        ModelMatrixName[11][18] := t*c*0.008;
+        ModelMatrixName[18][11] := t*c*0.008;
+        ModelMatrixName[11][19] := t*c*0.07;
+        ModelMatrixName[19][11] := t*c*0.07;
+        ModelMatrixName[12][13] := t*c*0.164;
+        ModelMatrixName[13][12] := t*c*0.164;
+        ModelMatrixName[12][14] := t*c*0.074;
+        ModelMatrixName[14][12] := t*c*0.074;
+        ModelMatrixName[12][15] := t*c*0.285;
+        ModelMatrixName[15][12] := t*c*0.285;
+        ModelMatrixName[12][16] := t*c*0.118;
+        ModelMatrixName[16][12] := t*c*0.118;
+        ModelMatrixName[12][17] := t*c*0.023;
+        ModelMatrixName[17][12] := t*c*0.023;
+        ModelMatrixName[12][18] := t*c*0.006;
+        ModelMatrixName[18][12] := t*c*0.006;
+        ModelMatrixName[12][19] := t*c*0.01;
+        ModelMatrixName[19][12] := t*c*0.01;
+        ModelMatrixName[13][14] := t*c*0.31;
+        ModelMatrixName[14][13] := t*c*0.31;
+        ModelMatrixName[13][15] := t*c*0.053;
+        ModelMatrixName[15][13] := t*c*0.053;
+        ModelMatrixName[13][16] := t*c*0.051;
+        ModelMatrixName[16][13] := t*c*0.051;
+        ModelMatrixName[13][17] := t*c*0.02;
+        ModelMatrixName[17][13] := t*c*0.02;
+        ModelMatrixName[13][18] := t*c*0.018;
+        ModelMatrixName[18][13] := t*c*0.018;
+        ModelMatrixName[13][19] := t*c*0.024;
+        ModelMatrixName[19][13] := t*c*0.024;
+        ModelMatrixName[14][15] := t*c*0.101;
+        ModelMatrixName[15][14] := t*c*0.101;
+        ModelMatrixName[14][16] := t*c*0.064;
+        ModelMatrixName[16][14] := t*c*0.064;
+        ModelMatrixName[14][17] := t*c*0.017;
+        ModelMatrixName[17][14] := t*c*0.017;
+        ModelMatrixName[14][18] := t*c*0.126;
+        ModelMatrixName[18][14] := t*c*0.126;
+        ModelMatrixName[14][19] := t*c*0.02;
+        ModelMatrixName[19][14] := t*c*0.02;
+        ModelMatrixName[15][16] := t*c*0.477;
+        ModelMatrixName[16][15] := t*c*0.477;
+        ModelMatrixName[15][17] := t*c*0.038;
+        ModelMatrixName[17][15] := t*c*0.038;
+        ModelMatrixName[15][18] := t*c*0.035;
+        ModelMatrixName[18][15] := t*c*0.035;
+        ModelMatrixName[15][19] := t*c*0.063;
+        ModelMatrixName[19][15] := t*c*0.063;
+        ModelMatrixName[16][17] := t*c*0.112;
+        ModelMatrixName[17][16] := t*c*0.112;
+        ModelMatrixName[16][18] := t*c*0.012;
+        ModelMatrixName[18][16] := t*c*0.012;
+        ModelMatrixName[16][19] := t*c*0.021;
+        ModelMatrixName[19][16] := t*c*0.021;
+        ModelMatrixName[17][18] := t*c*0.025;
+        ModelMatrixName[18][17] := t*c*0.025;
+        ModelMatrixName[17][19] := t*c*0.016;
+        ModelMatrixName[19][17] := t*c*0.016;
+        ModelMatrixName[18][19] := t*c*0.071;
+        ModelMatrixName[19][18] := t*c*0.071;
+	}
+	else
+	{
+		ModelMatrixName[0][1] := t*0.056;
+        ModelMatrixName[1][0] := t*0.056;
+        ModelMatrixName[0][2] := t*0.081;
+        ModelMatrixName[2][0] := t*0.081;
+        ModelMatrixName[0][3] := t*0.105;
+        ModelMatrixName[3][0] := t*0.105;
+        ModelMatrixName[0][4] := t*0.015;
+        ModelMatrixName[4][0] := t*0.015;
+        ModelMatrixName[0][5] := t*0.179;
+        ModelMatrixName[5][0] := t*0.179;
+        ModelMatrixName[0][6] := t*0.027;
+        ModelMatrixName[6][0] := t*0.027;
+        ModelMatrixName[0][7] := t*0.036;
+        ModelMatrixName[7][0] := t*0.036;
+        ModelMatrixName[0][8] := t*0.035;
+        ModelMatrixName[8][0] := t*0.035;
+        ModelMatrixName[0][9] := t*0.03;
+        ModelMatrixName[9][0] := t*0.03;
+        ModelMatrixName[0][10] := t*0.054;
+        ModelMatrixName[10][0] := t*0.054;
+        ModelMatrixName[0][11] := t*0.054;
+        ModelMatrixName[11][0] := t*0.054;
+        ModelMatrixName[0][12] := t*0.194;
+        ModelMatrixName[12][0] := t*0.194;
+        ModelMatrixName[0][13] := t*0.057;
+        ModelMatrixName[13][0] := t*0.057;
+        ModelMatrixName[0][14] := t*0.058;
+        ModelMatrixName[14][0] := t*0.058;
+        ModelMatrixName[0][15] := t*0.378;
+        ModelMatrixName[15][0] := t*0.378;
+        ModelMatrixName[0][16] := t*0.475;
+        ModelMatrixName[16][0] := t*0.475;
+        ModelMatrixName[0][17] := t*0.298;
+        ModelMatrixName[17][0] := t*0.298;
+        ModelMatrixName[0][18] := t*0.009;
+        ModelMatrixName[18][0] := t*0.009;
+        ModelMatrixName[0][19] := t*0.011;
+        ModelMatrixName[19][0] := t*0.011;
+        ModelMatrixName[1][2] := t*0.01;
+        ModelMatrixName[2][1] := t*0.01;
+        ModelMatrixName[1][3] := t*0.005;
+        ModelMatrixName[3][1] := t*0.005;
+        ModelMatrixName[1][4] := t*0.078;
+        ModelMatrixName[4][1] := t*0.078;
+        ModelMatrixName[1][5] := t*0.059;
+        ModelMatrixName[5][1] := t*0.059;
+        ModelMatrixName[1][6] := t*0.069;
+        ModelMatrixName[6][1] := t*0.069;
+        ModelMatrixName[1][7] := t*0.017;
+        ModelMatrixName[7][1] := t*0.017;
+        ModelMatrixName[1][8] := t*0.007;
+        ModelMatrixName[8][1] := t*0.007;
+        ModelMatrixName[1][9] := t*0.023;
+        ModelMatrixName[9][1] := t*0.023;
+        ModelMatrixName[1][10] := t*0.031;
+        ModelMatrixName[10][1] := t*0.031;
+        ModelMatrixName[1][11] := t*0.034;
+        ModelMatrixName[11][1] := t*0.034;
+        ModelMatrixName[1][12] := t*0.014;
+        ModelMatrixName[12][1] := t*0.014;
+        ModelMatrixName[1][13] := t*0.009;
+        ModelMatrixName[13][1] := t*0.009;
+        ModelMatrixName[1][14] := t*0.113;
+        ModelMatrixName[14][1] := t*0.113;
+        ModelMatrixName[1][15] := t*0.223;
+        ModelMatrixName[15][1] := t*0.223;
+        ModelMatrixName[1][16] := t*0.042;
+        ModelMatrixName[16][1] := t*0.042;
+        ModelMatrixName[1][17] := t*0.062;
+        ModelMatrixName[17][1] := t*0.062;
+        ModelMatrixName[1][18] := t*0.115;
+        ModelMatrixName[18][1] := t*0.115;
+        ModelMatrixName[1][19] := t*0.209;
+        ModelMatrixName[19][1] := t*0.209;
+        ModelMatrixName[2][3] := t*0.767;
+        ModelMatrixName[3][2] := t*0.767;
+        ModelMatrixName[2][4] := t*0.004;
+        ModelMatrixName[4][2] := t*0.004;
+        ModelMatrixName[2][5] := t*0.13;
+        ModelMatrixName[5][2] := t*0.13;
+        ModelMatrixName[2][6] := t*0.112;
+        ModelMatrixName[6][2] := t*0.112;
+        ModelMatrixName[2][7] := t*0.011;
+        ModelMatrixName[7][2] := t*0.011;
+        ModelMatrixName[2][8] := t*0.026;
+        ModelMatrixName[8][2] := t*0.026;
+        ModelMatrixName[2][9] := t*0.007;
+        ModelMatrixName[9][2] := t*0.007;
+        ModelMatrixName[2][10] := t*0.015;
+        ModelMatrixName[10][2] := t*0.015;
+        ModelMatrixName[2][11] := t*0.528;
+        ModelMatrixName[11][2] := t*0.528;
+        ModelMatrixName[2][12] := t*0.015;
+        ModelMatrixName[12][2] := t*0.015;
+        ModelMatrixName[2][13] := t*0.049;
+        ModelMatrixName[13][2] := t*0.049;
+        ModelMatrixName[2][14] := t*0.016;
+        ModelMatrixName[14][2] := t*0.016;
+        ModelMatrixName[2][15] := t*0.059;
+        ModelMatrixName[15][2] := t*0.059;
+        ModelMatrixName[2][16] := t*0.038;
+        ModelMatrixName[16][2] := t*0.038;
+        ModelMatrixName[2][17] := t*0.031;
+        ModelMatrixName[17][2] := t*0.031;
+        ModelMatrixName[2][18] := t*0.004;
+        ModelMatrixName[18][2] := t*0.004;
+        ModelMatrixName[2][19] := t*0.046;
+        ModelMatrixName[19][2] := t*0.046;
+        ModelMatrixName[3][4] := t*0.005;
+        ModelMatrixName[4][3] := t*0.005;
+        ModelMatrixName[3][5] := t*0.119;
+        ModelMatrixName[5][3] := t*0.119;
+        ModelMatrixName[3][6] := t*0.026;
+        ModelMatrixName[6][3] := t*0.026;
+        ModelMatrixName[3][7] := t*0.012;
+        ModelMatrixName[7][3] := t*0.012;
+        ModelMatrixName[3][8] := t*0.181;
+        ModelMatrixName[8][3] := t*0.181;
+        ModelMatrixName[3][9] := t*0.009;
+        ModelMatrixName[9][3] := t*0.009;
+        ModelMatrixName[3][10] := t*0.018;
+        ModelMatrixName[10][3] := t*0.018;
+        ModelMatrixName[3][11] := t*0.058;
+        ModelMatrixName[11][3] := t*0.058;
+        ModelMatrixName[3][12] := t*0.018;
+        ModelMatrixName[12][3] := t*0.018;
+        ModelMatrixName[3][13] := t*0.323;
+        ModelMatrixName[13][3] := t*0.323;
+        ModelMatrixName[3][14] := t*0.029;
+        ModelMatrixName[14][3] := t*0.029;
+        ModelMatrixName[3][15] := t*0.03;
+        ModelMatrixName[15][3] := t*0.03;
+        ModelMatrixName[3][16] := t*0.032;
+        ModelMatrixName[16][3] := t*0.032;
+        ModelMatrixName[3][17] := t*0.045;
+        ModelMatrixName[17][3] := t*0.045;
+        ModelMatrixName[3][18] := t*0.01;
+        ModelMatrixName[18][3] := t*0.01;
+        ModelMatrixName[3][19] := t*0.007;
+        ModelMatrixName[19][3] := t*0.007;
+        ModelMatrixName[4][5] := t*0.005;
+        ModelMatrixName[5][4] := t*0.005;
+        ModelMatrixName[4][6] := t*0.04;
+        ModelMatrixName[6][4] := t*0.04;
+        ModelMatrixName[4][7] := t*0.089;
+        ModelMatrixName[7][4] := t*0.089;
+        ModelMatrixName[4][8] := t*0.004;
+        ModelMatrixName[8][4] := t*0.004;
+        ModelMatrixName[4][9] := t*0.248;
+        ModelMatrixName[9][4] := t*0.248;
+        ModelMatrixName[4][10] := t*0.043;
+        ModelMatrixName[10][4] := t*0.043;
+        ModelMatrixName[4][11] := t*0.01;
+        ModelMatrixName[11][4] := t*0.01;
+        ModelMatrixName[4][12] := t*0.017;
+        ModelMatrixName[12][4] := t*0.017;
+        ModelMatrixName[4][13] := t*0.004;
+        ModelMatrixName[13][4] := t*0.004;
+        ModelMatrixName[4][14] := t*0.005;
+        ModelMatrixName[14][4] := t*0.005;
+        ModelMatrixName[4][15] := t*0.092;
+        ModelMatrixName[15][4] := t*0.092;
+        ModelMatrixName[4][16] := t*0.012;
+        ModelMatrixName[16][4] := t*0.012;
+        ModelMatrixName[4][17] := t*0.062;
+        ModelMatrixName[17][4] := t*0.062;
+        ModelMatrixName[4][18] := t*0.053;
+        ModelMatrixName[18][4] := t*0.053;
+        ModelMatrixName[4][19] := t*0.536;
+        ModelMatrixName[19][4] := t*0.536;
+        ModelMatrixName[5][6] := t*0.023;
+        ModelMatrixName[6][5] := t*0.023;
+        ModelMatrixName[5][7] := t*0.006;
+        ModelMatrixName[7][5] := t*0.006;
+        ModelMatrixName[5][8] := t*0.027;
+        ModelMatrixName[8][5] := t*0.027;
+        ModelMatrixName[5][9] := t*0.006;
+        ModelMatrixName[9][5] := t*0.006;
+        ModelMatrixName[5][10] := t*0.014;
+        ModelMatrixName[10][5] := t*0.014;
+        ModelMatrixName[5][11] := t*0.081;
+        ModelMatrixName[11][5] := t*0.081;
+        ModelMatrixName[5][12] := t*0.024;
+        ModelMatrixName[12][5] := t*0.024;
+        ModelMatrixName[5][13] := t*0.026;
+        ModelMatrixName[13][5] := t*0.026;
+        ModelMatrixName[5][14] := t*0.137;
+        ModelMatrixName[14][5] := t*0.137;
+        ModelMatrixName[5][15] := t*0.201;
+        ModelMatrixName[15][5] := t*0.201;
+        ModelMatrixName[5][16] := t*0.033;
+        ModelMatrixName[16][5] := t*0.033;
+        ModelMatrixName[5][17] := t*0.047;
+        ModelMatrixName[17][5] := t*0.047;
+        ModelMatrixName[5][18] := t*0.055;
+        ModelMatrixName[18][5] := t*0.055;
+        ModelMatrixName[5][19] := t*0.008;
+        ModelMatrixName[19][5] := t*0.008;
+        ModelMatrixName[6][7] := t*0.016;
+        ModelMatrixName[7][6] := t*0.016;
+        ModelMatrixName[6][8] := t*0.045;
+        ModelMatrixName[8][6] := t*0.045;
+        ModelMatrixName[6][9] := t*0.056;
+        ModelMatrixName[9][6] := t*0.056;
+        ModelMatrixName[6][10] := t*0.033;
+        ModelMatrixName[10][6] := t*0.033;
+        ModelMatrixName[6][11] := t*0.391;
+        ModelMatrixName[11][6] := t*0.391;
+        ModelMatrixName[6][12] := t*0.115;
+        ModelMatrixName[12][6] := t*0.115;
+        ModelMatrixName[6][13] := t*0.597;
+        ModelMatrixName[13][6] := t*0.597;
+        ModelMatrixName[6][14] := t*0.328;
+        ModelMatrixName[14][6] := t*0.328;
+        ModelMatrixName[6][15] := t*0.073;
+        ModelMatrixName[15][6] := t*0.073;
+        ModelMatrixName[6][16] := t*0.046;
+        ModelMatrixName[16][6] := t*0.046;
+        ModelMatrixName[6][17] := t*0.011;
+        ModelMatrixName[17][6] := t*0.011;
+        ModelMatrixName[6][18] := t*0.008;
+        ModelMatrixName[18][6] := t*0.008;
+        ModelMatrixName[6][19] := t*0.573;
+        ModelMatrixName[19][6] := t*0.573;
+        ModelMatrixName[7][8] := t*0.021;
+        ModelMatrixName[8][7] := t*0.021;
+        ModelMatrixName[7][9] := t*0.229;
+        ModelMatrixName[9][7] := t*0.229;
+        ModelMatrixName[7][10] := t*0.479;
+        ModelMatrixName[10][7] := t*0.479;
+        ModelMatrixName[7][11] := t*0.047;
+        ModelMatrixName[11][7] := t*0.047;
+        ModelMatrixName[7][12] := t*0.01;
+        ModelMatrixName[12][7] := t*0.01;
+        ModelMatrixName[7][13] := t*0.009;
+        ModelMatrixName[13][7] := t*0.009;
+        ModelMatrixName[7][14] := t*0.022;
+        ModelMatrixName[14][7] := t*0.022;
+        ModelMatrixName[7][15] := t*0.04;
+        ModelMatrixName[15][7] := t*0.04;
+        ModelMatrixName[7][16] := t*0.245;
+        ModelMatrixName[16][7] := t*0.245;
+        ModelMatrixName[7][17] := t*0.961;
+        ModelMatrixName[17][7] := t*0.961;
+        ModelMatrixName[7][18] := t*0.009;
+        ModelMatrixName[18][7] := t*0.009;
+        ModelMatrixName[7][19] := t*0.032;
+        ModelMatrixName[19][7] := t*0.032;
+        ModelMatrixName[8][9] := t*0.014;
+        ModelMatrixName[9][8] := t*0.014;
+        ModelMatrixName[8][10] := t*0.065;
+        ModelMatrixName[10][8] := t*0.065;
+        ModelMatrixName[8][11] := t*0.263;
+        ModelMatrixName[11][8] := t*0.263;
+        ModelMatrixName[8][12] := t*0.021;
+        ModelMatrixName[12][8] := t*0.021;
+        ModelMatrixName[8][13] := t*0.292;
+        ModelMatrixName[13][8] := t*0.292;
+        ModelMatrixName[8][14] := t*0.646;
+        ModelMatrixName[14][8] := t*0.646;
+        ModelMatrixName[8][15] := t*0.047;
+        ModelMatrixName[15][8] := t*0.047;
+        ModelMatrixName[8][16] := t*0.103;
+        ModelMatrixName[16][8] := t*0.103;
+        ModelMatrixName[8][17] := t*0.014;
+        ModelMatrixName[17][8] := t*0.014;
+        ModelMatrixName[8][18] := t*0.01;
+        ModelMatrixName[18][8] := t*0.01;
+        ModelMatrixName[8][19] := t*0.008;
+        ModelMatrixName[19][8] := t*0.008;
+        ModelMatrixName[9][10] := t*0.388;
+        ModelMatrixName[10][9] := t*0.388;
+        ModelMatrixName[9][11] := t*0.012;
+        ModelMatrixName[11][9] := t*0.012;
+        ModelMatrixName[9][12] := t*0.102;
+        ModelMatrixName[12][9] := t*0.102;
+        ModelMatrixName[9][13] := t*0.072;
+        ModelMatrixName[13][9] := t*0.072;
+        ModelMatrixName[9][14] := t*0.038;
+        ModelMatrixName[14][9] := t*0.038;
+        ModelMatrixName[9][15] := t*0.059;
+        ModelMatrixName[15][9] := t*0.059;
+        ModelMatrixName[9][16] := t*0.025;
+        ModelMatrixName[16][9] := t*0.025;
+        ModelMatrixName[9][17] := t*0.18;
+        ModelMatrixName[17][9] := t*0.18;
+        ModelMatrixName[9][18] := t*0.052;
+        ModelMatrixName[18][9] := t*0.052;
+        ModelMatrixName[9][19] := t*0.024;
+        ModelMatrixName[19][9] := t*0.024;
+        ModelMatrixName[10][11] := t*0.03;
+        ModelMatrixName[11][10] := t*0.03;
+        ModelMatrixName[10][12] := t*0.016;
+        ModelMatrixName[12][10] := t*0.016;
+        ModelMatrixName[10][13] := t*0.043;
+        ModelMatrixName[13][10] := t*0.043;
+        ModelMatrixName[10][14] := t*0.044;
+        ModelMatrixName[14][10] := t*0.044;
+        ModelMatrixName[10][15] := t*0.029;
+        ModelMatrixName[15][10] := t*0.029;
+        ModelMatrixName[10][16] := t*0.226;
+        ModelMatrixName[16][10] := t*0.226;
+        ModelMatrixName[10][17] := t*0.323;
+        ModelMatrixName[17][10] := t*0.323;
+        ModelMatrixName[10][18] := t*0.024;
+        ModelMatrixName[18][10] := t*0.024;
+        ModelMatrixName[10][19] := t*0.018;
+        ModelMatrixName[19][10] := t*0.018;
+        ModelMatrixName[11][12] := t*0.015;
+        ModelMatrixName[12][11] := t*0.015;
+        ModelMatrixName[11][13] := t*0.086;
+        ModelMatrixName[13][11] := t*0.086;
+        ModelMatrixName[11][14] := t*0.045;
+        ModelMatrixName[14][11] := t*0.045;
+        ModelMatrixName[11][15] := t*0.503;
+        ModelMatrixName[15][11] := t*0.503;
+        ModelMatrixName[11][16] := t*0.232;
+        ModelMatrixName[16][11] := t*0.232;
+        ModelMatrixName[11][17] := t*0.016;
+        ModelMatrixName[17][11] := t*0.016;
+        ModelMatrixName[11][18] := t*0.008;
+        ModelMatrixName[18][11] := t*0.008;
+        ModelMatrixName[11][19] := t*0.07;
+        ModelMatrixName[19][11] := t*0.07;
+        ModelMatrixName[12][13] := t*0.164;
+        ModelMatrixName[13][12] := t*0.164;
+        ModelMatrixName[12][14] := t*0.074;
+        ModelMatrixName[14][12] := t*0.074;
+        ModelMatrixName[12][15] := t*0.285;
+        ModelMatrixName[15][12] := t*0.285;
+        ModelMatrixName[12][16] := t*0.118;
+        ModelMatrixName[16][12] := t*0.118;
+        ModelMatrixName[12][17] := t*0.023;
+        ModelMatrixName[17][12] := t*0.023;
+        ModelMatrixName[12][18] := t*0.006;
+        ModelMatrixName[18][12] := t*0.006;
+        ModelMatrixName[12][19] := t*0.01;
+        ModelMatrixName[19][12] := t*0.01;
+        ModelMatrixName[13][14] := t*0.31;
+        ModelMatrixName[14][13] := t*0.31;
+        ModelMatrixName[13][15] := t*0.053;
+        ModelMatrixName[15][13] := t*0.053;
+        ModelMatrixName[13][16] := t*0.051;
+        ModelMatrixName[16][13] := t*0.051;
+        ModelMatrixName[13][17] := t*0.02;
+        ModelMatrixName[17][13] := t*0.02;
+        ModelMatrixName[13][18] := t*0.018;
+        ModelMatrixName[18][13] := t*0.018;
+        ModelMatrixName[13][19] := t*0.024;
+        ModelMatrixName[19][13] := t*0.024;
+        ModelMatrixName[14][15] := t*0.101;
+        ModelMatrixName[15][14] := t*0.101;
+        ModelMatrixName[14][16] := t*0.064;
+        ModelMatrixName[16][14] := t*0.064;
+        ModelMatrixName[14][17] := t*0.017;
+        ModelMatrixName[17][14] := t*0.017;
+        ModelMatrixName[14][18] := t*0.126;
+        ModelMatrixName[18][14] := t*0.126;
+        ModelMatrixName[14][19] := t*0.02;
+        ModelMatrixName[19][14] := t*0.02;
+        ModelMatrixName[15][16] := t*0.477;
+        ModelMatrixName[16][15] := t*0.477;
+        ModelMatrixName[15][17] := t*0.038;
+        ModelMatrixName[17][15] := t*0.038;
+        ModelMatrixName[15][18] := t*0.035;
+        ModelMatrixName[18][15] := t*0.035;
+        ModelMatrixName[15][19] := t*0.063;
+        ModelMatrixName[19][15] := t*0.063;
+        ModelMatrixName[16][17] := t*0.112;
+        ModelMatrixName[17][16] := t*0.112;
+        ModelMatrixName[16][18] := t*0.012;
+        ModelMatrixName[18][16] := t*0.012;
+        ModelMatrixName[16][19] := t*0.021;
+        ModelMatrixName[19][16] := t*0.021;
+        ModelMatrixName[17][18] := t*0.025;
+        ModelMatrixName[18][17] := t*0.025;
+        ModelMatrixName[17][19] := t*0.016;
+        ModelMatrixName[19][17] := t*0.016;
+        ModelMatrixName[18][19] := t*0.071;
+        ModelMatrixName[19][18] := t*0.071;
+    }
+	return 1;
+}
+
+
+if (SKIP_FREQ_HARVESTING == 0)
+{
+	HarvestFrequencies 		 (vectorOfFrequencies,filteredData,1,1,0);
+}
+
+jonesModelF = 0;
+
+MULTIPLY_BY_FREQS = PopulateModelMatrix ("jonesModelF",vectorOfFrequencies);
+
+Model JonesModel = (jonesModelF, vectorOfFrequencies, MULTIPLY_BY_FREQS);
+
+FREQUENCY_SENSITIVE = 1;
diff --git a/res/TemplateBatchFiles/TemplateModels/K2P.mdl b/res/TemplateBatchFiles/TemplateModels/K2P.mdl
new file mode 100644
index 0000000..5d30d98
--- /dev/null
+++ b/res/TemplateBatchFiles/TemplateModels/K2P.mdl
@@ -0,0 +1,64 @@
+/* This file defines the transition matrix for the Kimura 2 parameter model
+   The file should be used as follows:
+   
+   1) Read Data File and create datafilter filteredData
+   2) #include this file (or use SelectTemplateModel(filteredData);)
+   3) Define the tree
+   4) Proceed with the likelihood function using 'vectorOfFrequencies' as the vector to pass to the constructor.
+   
+   This model has the following signature:
+    #Short:K2P#
+   	#Desc:Kimura 2 parameter (K2P). Local or global parameters. Possible Gamma Variation.#
+   	#Dimension:4#
+    #DataType:nucleotide#
+   	#FileName:K2P.mdl#
+   
+   08/18/1999  by Sergei L. Kosakovsky Pond
+*/
+
+equalFreqs = {{.25}{.25}{.25}{.25}};
+
+#include "modelParameters.mdl";
+
+if (modelType>0)
+{
+	global R = 1.;
+	if (modelType == 2)
+	{
+		#include "defineGamma.mdl";
+	}
+	if (modelType == 3)
+	{
+		#include "defineHM.mdl";
+	}
+}
+
+function PopulateModelMatrix (ModelMatrixName&, EFV)
+{
+	if (modelType == 0)
+	{
+		ModelMatrixName = {{*,a,b,a}{a,*,a,b}{b,a,*,a}{a,b,a,*}};
+	}
+	else
+	{
+		if (modelType<2)
+		{
+			ModelMatrixName = {{*,a,R*a,a}{a,*,a,R*a}{R*a,a,*,a}{a,R*a,a,*}};
+		}
+		else
+		{
+			ModelMatrixName = {{*,a*c,R*a*c,a*c}{a*c,*,a*c,R*a*c}{R*a*c,a*c,*,a*c}{a*c,R*a*c,a*c,*}};
+		}
+	}
+	return 1;
+}
+
+K2P = 0;
+
+MULTIPLY_BY_FREQS = PopulateModelMatrix ("K2P",equalFreqs);
+
+Model K2PModel = (K2P, equalFreqs, MULTIPLY_BY_FREQS);
+
+FREQUENCY_SENSITIVE = 0;
+
+DUPLICATE_MODELS_OK = 1;
diff --git a/res/TemplateBatchFiles/TemplateModels/K3ST.mdl b/res/TemplateBatchFiles/TemplateModels/K3ST.mdl
new file mode 100644
index 0000000..d30a531
--- /dev/null
+++ b/res/TemplateBatchFiles/TemplateModels/K3ST.mdl
@@ -0,0 +1,64 @@
+/* This file defines the transition matrix for the Kimura(1981) 3 substitution type model.
+   The file should be used as follows:
+   
+   1) Read Data File and create datafilter filteredData
+   2) #include this file (or use SelectTemplateModel(filteredData);)
+   3) Define the tree
+   4) Proceed with the likelihood function using 'vectorOfFrequencies' as the vector to pass to the constructor.
+   
+   This model has the following signature:
+    #Short:K3ST#
+   	#Desc:Kimura(1981) 3 substitution type model. Local or global parameters. Possible Gamma Variation.#
+   	#Dimension:4#
+    #DataType:nucleotide#
+   	#FileName:K3ST.mdl#
+   
+   04/04/2000  by Sergei L. Kosakovsky Pond
+*/
+
+#include "modelParameters.mdl";
+
+if (modelType >= 1)
+{
+	global R1 = 1.;
+	global R2 = 1.;
+	
+	if (modelType == 2)
+	{
+		#include "defineGamma.mdl";
+	}
+	if (modelType == 3)
+	{
+		#include "defineHM.mdl";
+	}
+}
+
+function PopulateModelMatrix (ModelMatrixName&, EFV)
+{
+	if (modelType == 0)
+	{
+		ModelMatrixName = {{*,a,b,c}{a,*,c,b}{b,c,*,a}{c,b,a,*}};
+	}
+	else
+	{
+		if (modelType<2)
+		{
+			ModelMatrixName = {{*,R1*b,b,R2*b}{R1*b,*,R2*b,b}{b,R2*b,*,R1*b}{R2*b,b,R1*b,*}};
+		}
+		else
+		{
+			ModelMatrixName = {{*,R1*b*c,b*c,R2*b*c}{R1*b*c,*,R2*b*c,b*c}{b*c,R2*b*c,*,R1*b*c}{R2*b*c,b*c,R1*b*c,*}};
+		}
+	}
+	return 1;
+}
+
+K3ST = 0;
+
+vectorOfFrequencies = {{.25}{.25}{.25}{.25}};
+
+MULTIPLY_BY_FREQS = PopulateModelMatrix ("K3ST",vectorOfFrequencies);
+
+Model K3STModel = (K3ST, vectorOfFrequencies, MULTIPLY_BY_FREQS);
+
+FREQUENCY_SENSITIVE = 0;
diff --git a/res/TemplateBatchFiles/TemplateModels/LCAP.mdl b/res/TemplateBatchFiles/TemplateModels/LCAP.mdl
new file mode 100644
index 0000000..efb914e
--- /dev/null
+++ b/res/TemplateBatchFiles/TemplateModels/LCAP.mdl
@@ -0,0 +1,315 @@
+/*	Implementation of the Linear Combination of Amino Acid Properties model by Conant, Wagner & Stadler 2006
+
+	Conant, G.C. and P.F. Stadler, Solvent exposure imparts similar selective pressures across a range of yeast proteins. Mol Biol Evol, 2009. 26(5): p. 1155-61.
+	Conant, G.C., G.P. Wagner, and P.F. Stadler, Modeling amino acid substitution patterns in orthologous and paralogous genes. Mol Phylogenet Evol, 2007. 42(2): p. 298-307.
+
+	Thanks to Gavin Conant for supplying amino acid property matrices
+	
+	09/04/2009 by Wayne "die boer" Delport
+
+*/
+
+USE_ADAPTIVE_VARIABLE_STEP = 1;
+
+numProps = 5; /* number of amino acid property matrices included in the LCAP file */
+
+incFileName = HYPHY_LIB_DIRECTORY + "TemplateBatchFiles" + DIRECTORY_SEPARATOR + "TemplateModels" + DIRECTORY_SEPARATOR + "EmpiricalAA" + DIRECTORY_SEPARATOR + "LCAP";
+fscanf ( incFileName, "NMatrix,NMatrix,NMatrix,NMatrix,NMatrix", prop_0, prop_1, prop_2, prop_3, prop_4 );
+
+/* order as in LCAP file from Gavin Conant : Chemical Composition, Polarity, Volume, Iso-electric point, Hydropathy */
+
+function BuildCodonFrequencies1x4 (obsF)
+{
+	if (!ModelMatrixDimension)
+	{
+		ModelMatrixDimension = 64 - (_Genetic_Code["_MATRIX_ELEMENT_VALUE_ == 10"]*Transpose(_Genetic_Code["1"]))[0];
+	}
+
+	PIStop = 1.0;
+	result = {ModelMatrixDimension,1};
+	hshift = 0;
+
+	for (h=0; h<64; h=h+1)
+	{
+		first = h$16;
+		second = h%16$4;
+		third = h%4;
+		if (_Genetic_Code[h]==10) 
+		{
+			hshift = hshift+1;
+			PIStop = PIStop-obsF[first]*obsF[second]*obsF[third];
+			continue; 
+		}
+		result[h-hshift]=obsF[first]*obsF[second]*obsF[third];
+	}
+	return result*(1.0/PIStop);
+}
+
+function BuildCodonFrequencies3x4 (obsF)
+{
+	if (!ModelMatrixDimension)
+	{
+		ModelMatrixDimension = 64 - (_Genetic_Code["_MATRIX_ELEMENT_VALUE_ == 10"]*Transpose(_Genetic_Code["1"]))[0];
+	}
+
+	PIStop = 1.0;
+	result = {ModelMatrixDimension,1};
+	hshift = 0;
+
+	for (h=0; h<64; h=h+1)
+	{
+		first = h$16;
+		second = h%16$4;
+		third = h%4;
+		if (_Genetic_Code[h]==10) 
+		{
+			hshift = hshift+1;
+			PIStop = PIStop-obsF[first][0]*obsF[second][1]*obsF[third][2];
+			continue; 
+		}
+		result[h-hshift][0]=obsF[first][0]*obsF[second][1]*obsF[third][2];
+	}
+	return result*(1.0/PIStop);
+}
+												  
+function PopulateModelMatrix (ModelMatrixName&, EFV, freqs)
+{
+	if (!ModelMatrixDimension)
+	{
+		ModelMatrixDimension = 64 - (_Genetic_Code["_MATRIX_ELEMENT_VALUE_ == 10"]*Transpose(_Genetic_Code["1"]))[0];
+	}
+		
+	ModelMatrixName = {ModelMatrixDimension,ModelMatrixDimension}; 
+	
+	synCatRateMult 	  = "synRate*";
+	nonsynCatRateMult = "synRate*";
+	global C = 0.5; C :> -10000;
+	
+	modelDefString = "";
+	modelDefString*16384;
+	
+	for ( aaprop = 0; aaprop < numProps; aaprop = aaprop + 1 ) {
+		ExecuteCommands ( "global alpha_" + aaprop + " = 0.5; global alpha_" + aaprop + " :> -10000;" );
+	}
+	
+	hshift = 0;
+	
+	for (h=0; h<64; h=h+1)
+	{
+		if (_Genetic_Code[h]==10) 
+		{
+			hshift = hshift+1;
+			continue; 
+		}
+		vshift = hshift;
+		for (v = h+1; v<64; v=v+1)
+		{
+			diff = v-h;
+			if (_Genetic_Code[v]==10) 
+			{
+				vshift = vshift+1;
+				continue; 
+			}
+			nucPosInCodon = 2;
+			if ((h$4==v$4)||((diff%4==0)&&(h$16==v$16))||(diff%16==0))
+			{
+				if (h$4==v$4)
+				{
+					transition = v%4;
+					transition2= h%4;
+				}
+				else
+				{
+					if(diff%16==0)
+					{
+						transition = v$16;
+						transition2= h$16;
+						nucPosInCodon = 0;
+					}
+					else
+					{
+						transition = v%16$4;
+						transition2= h%16$4;
+						nucPosInCodon = 1;
+					}
+				}
+				hs = Format(h-hshift,0,0);
+				vs = Format(v-vshift,0,0);
+				ts = Format(transition,0,0);
+				ts2= Format(transition2,0,0);
+				ps = Format(nucPosInCodon,0,0);
+				aa1 = _Genetic_Code[0][h];
+				aa2 = _Genetic_Code[0][v];
+				
+				
+				/*Conant does not have stop AA in the matrices, so we need to adjust for aa > 10 */
+				if ( aa1 < 10 ) {
+					caa1 = aa1;
+				}
+				else {
+					caa1 = aa1 - 1;
+				}
+				if ( aa2 < 10 ) {
+					caa2 = aa2;
+				}
+				else {
+					caa2 = aa2 - 1;
+				}
+				
+				/* add in the amino acid property multipliers */
+				aapropMultiplier = "";
+				for ( aaprop = 0; aaprop < numProps; aaprop = aaprop + 1 ) {
+					propMultiString = "";
+					propMultiString * ( "propMulti = Abs(prop_" + aaprop + "[" + caa1 + "][" + caa2 + "]);" );
+					propMultiString*0;
+					ExecuteCommands ( propMultiString );
+					if ( aaprop == 0 ) {
+						aapropMultiplier * ("Exp( C + alpha_" + aaprop + "*" + propMulti + "" );
+					}
+					else {
+						aapropMultiplier * ("+ alpha_" + aaprop + "*" + propMulti + "" );
+					}
+					
+				}
+				aapropMultiplier * ( ")" );
+				
+				if ( freqs < 2 ) {
+					if ( freqs == 0 ) {
+						ps = 0;
+					}
+				
+					if (aa1==aa2) 
+					{
+						modelDefString*("ModelMatrixName["+hs+"]["+vs+"] := "+synCatRateMult+_nucBiasTerms[transition][transition2]+"EFV__["+ts+"]["+ps+"];\n"+
+													 "ModelMatrixName["+vs+"]["+hs+"] := "+synCatRateMult+_nucBiasTerms[transition][transition2]+"EFV__["+ts2+"]["+ps+"];\n");
+					}
+					else
+					{
+						modelDefString*("ModelMatrixName["+hs+"]["+vs+"] := "+nonsynCatRateMult+_nucBiasTerms[transition][transition2]+"EFV__["+ts+"]["+ps+"]*" + aapropMultiplier + ";\n"+
+													 "ModelMatrixName["+vs+"]["+hs+"] := "+nonsynCatRateMult+_nucBiasTerms[transition][transition2]+"EFV__["+ts2+"]["+ps+"]*" + aapropMultiplier + ";\n");						
+					}
+				}
+				else {
+					if (aa1==aa2) 
+					{
+						modelDefString*("ModelMatrixName["+hs+"]["+vs+"] := "+synCatRateMult+_nucBiasTerms[transition][transition2]+"1;\n"+
+													 "ModelMatrixName["+vs+"]["+hs+"] := "+synCatRateMult+_nucBiasTerms[transition][transition2]+"1;\n");
+					}
+					else
+					{
+						modelDefString*("ModelMatrixName["+hs+"]["+vs+"] := "+nonsynCatRateMult+_nucBiasTerms[transition][transition2]+aapropMultiplier + "*1;\n"+
+													 "ModelMatrixName["+vs+"]["+hs+"] := "+nonsynCatRateMult+_nucBiasTerms[transition][transition2]+aapropMultiplier + "*1;\n");						
+					}
+				}
+			}
+	    }
+    }		
+	modelDefString*0;
+	/*fprintf ( stdout, modelDefString );*/
+	ExecuteCommands (modelDefString);
+	
+	return freqs == 2;
+}
+
+ ChoiceList (freqType,"Choose a frequency parameterisation",1,SKIP_NONE,
+			"F1x4","Empirical nucleotide frequencies",
+			"F3x4","Empirical position specific nucleotide frequencies",
+			"F61","Empirical codon frequencies",
+			"ML3x4","Maximum likelihood estimated position specific frequencies");
+
+
+fprintf						  (stdout, "\nModel string for nucleotide biases: (eg: 010010 for HKY85)");
+fscanf						  (stdin,"String",modelDesc);
+
+
+MGCustomRateBiasTerms = {{"AC*","","AT*","CG*","CT*","GT*"}};	
+
+		
+paramCount	   = 0;
+_nucBiasTerms  = {4,4};
+
+_nucBiasTerms[0][0] = "";
+
+
+if (modelDesc[0]==modelDesc[1])
+{
+	MGCustomRateBiasTerms[0] = MGCustomRateBiasTerms[1];
+}
+
+_nucBiasTerms[1][0] = MGCustomRateBiasTerms[0];
+_nucBiasTerms[0][1] = MGCustomRateBiasTerms[0];
+_nucBiasTerms[2][0] = MGCustomRateBiasTerms[1];
+_nucBiasTerms[0][2] = MGCustomRateBiasTerms[1];
+
+h = 0;
+v = 3;
+
+for (customLoopCounter2=2; customLoopCounter2<6; customLoopCounter2=customLoopCounter2+1)
+{
+	for (customLoopCounter=0; customLoopCounter<customLoopCounter2; customLoopCounter=customLoopCounter+1)
+	{
+		if (modelDesc[customLoopCounter]==modelDesc[customLoopCounter2])
+		{
+			_nucBiasTerms[h][v] = MGCustomRateBiasTerms[customLoopCounter];
+			_nucBiasTerms[v][h] = MGCustomRateBiasTerms[customLoopCounter];
+			break;
+		}
+	}
+	if (customLoopCounter == customLoopCounter2)
+	{
+		_nucBiasTerms[h][v] = MGCustomRateBiasTerms[customLoopCounter2];
+		_nucBiasTerms[v][h] = MGCustomRateBiasTerms[customLoopCounter2];
+	}
+	
+	v = v+1;
+	if (v==4)
+	{
+		h=h+1;
+		v=h+1;
+	}
+}
+
+prev = "";
+for ( i = 0; i < Columns ( _nucBiasTerms ); i = i + 1 ) {
+	for ( j = 0; j < Rows ( _nucBiasTerms ); j = j + 1 ) {
+		if ( Abs ( _nucBiasTerms [i][j] ) ) {
+			nucPair = _nucBiasTerms [i][j];
+			if ( prev != nucPair ) {
+				ExecuteCommands ( "global " + nucPair[0][Abs(nucPair)-2] + " = 1;" );
+				prev = nucPair;
+			}
+		}
+	}
+}
+
+if ( freqType < 1 ) {
+	HarvestFrequencies (observedFreq,filteredData,1,1,1);
+	vectorOfFrequencies = BuildCodonFrequencies1x4 (observedFreq);
+}
+else {
+	if ( freqType == 1 ) { /* F3x4*/
+		HarvestFrequencies ( observedFreq, filteredData, 3,1,1);
+		vectorOfFrequencies = BuildCodonFrequencies3x4 (observedFreq);
+	}
+	if ( freqType == 2 ) { /* F61 */
+ 		COUNT_GAPS_IN_FREQUENCIES = 0;
+		HarvestFrequencies (observedFreq,filteredData,3,3,1);
+		vectorOfFrequencies = Transpose(observedFreq[Transpose(_Genetic_Code["_MATRIX_ELEMENT_VALUE_!=10"])]); /* cough, cough, cough ... HACK! */
+	}
+	if ( freqType == 3 ) { /*MLF3x4*/
+		if (!ModelMatrixDimension)
+		{
+			ModelMatrixDimension = 64 - (_Genetic_Code["_MATRIX_ELEMENT_VALUE_ == 10"]*Transpose(_Genetic_Code["1"]))[0];
+		}
+		HarvestFrequencies ( observedFreq, filteredData, 3,1,1);
+		#include "MGFreqsEstimator.ibf";
+		BuildCodonFrequencies (paramFreqs,"vectorOfFrequencies");
+	}
+}
+
+MULTIPLY_BY_FREQS = PopulateModelMatrix ("LCAP", observedFreq, freqType);
+Model LCAPModel = (LCAP,vectorOfFrequencies,MULTIPLY_BY_FREQS);
+Export ( modelString, LCAPModel );
+fprintf ( stdout, modelString, "\n" );
+
+fprintf ( stdout, "alpha parameters in order (0-4) are Chemical Composition, Polarity, Volume, Iso-electric point, Hydropathy\n" );
diff --git a/res/TemplateBatchFiles/TemplateModels/MEC.mdl b/res/TemplateBatchFiles/TemplateModels/MEC.mdl
new file mode 100644
index 0000000..38e5cd0
--- /dev/null
+++ b/res/TemplateBatchFiles/TemplateModels/MEC.mdl
@@ -0,0 +1,319 @@
+/* this file defines the MEC model from 
+
+A Combined Empirical and Mechanistic Codon Model
+By Adi Doron-Faigenboim and Tal Pupko 
+Mol. Biol. Evol. 24(2):388�397. 2007
+
+v0.1 20100520 SLKP spond at ucsd.edu 
+
+*/
+
+
+
+global T_R   = 1; 	/* the global rate for 1 transition substitutions */
+global T_V   = 1; 	/* the global rate for 1 transversion substitutions */
+global T_RR  = 1;	/* the global rate for 2 transition substitutions */
+global T_VV  = 1;	/* the global rate for 2 transversion substitutions */
+global T_RV  = 1;	/* the global rate for 1 transversion/1 transversion substitutions */
+global T_SUB = 1;	/* the global rate for 3-nucleotide substitutions */
+
+global omega = 1; 	/* the global dN/dS rate */
+global F	 = 0.5; /* the mixing proportion of the neutral/empirical model */
+
+F:<1.0;
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function PopulateModelMatrix (ModelMatrixName&, CodonFreqs, AAFreqs, AAOrdering, AARates, categoriesUsed)
+
+/* input
+		ModelMatrixName : the ID to store the populated matrix into 
+		CodonFreqs	    : Frequencies of sense codons
+		
+		AAFreqs			: Frequencies of the 20 amino-acids (in the _hyphy ordering including the stop codon; 
+						  this is auto-generated by BuildCodonFrequencies )
+						  
+		AAOrdering		: The ordering of amino-acids in the rate matrix
+		AARates			: A 20x20 rate matrix for the amino-acids
+		categoriesUsed		: set to != 0 to include rate variation in omega
+		
+*/
+
+{
+	
+	ModelMatrixName = {ModelMatrixDimension,ModelMatrixDimension}; 
+	
+	ModelMatrixName [0][0] = ""; /* a hack to force ModelMatrixName into strings */
+		
+	/* define a map from the internal HyPhy ordering of AA to what is found in AAFreqs and AARates*/
+	
+	_aaMapping = {};
+	
+	for (h = 0; h < 20; h = h+1)
+	{
+		_aaMapping [AAOrdering[h]] = h;
+	}
+	
+	modelDefString = "";
+	modelDefString * 256;
+	
+	substitutionTypeStrings = {{"T_R","T_V","T_RR","T_VV","T_RV","T_SUB"}};
+	
+	byAA	= {}; 
+		/* store the contributions of each substitution type, index by AA pair */
+	
+	hshift = 0;
+	for (h=0; h<64; h=h+1)
+	{
+		if (IsStop(h,_Genetic_Code)) 
+		{
+			hshift = hshift+1;
+			continue; 
+		}
+		codeH = _hyphyAAOrdering[_Genetic_Code[h]];
+		vshift = hshift;
+		for (v = h+1; v<64; v=v+1)
+		{
+			if (IsStop(v,_Genetic_Code)) 
+			{
+				vshift = vshift+1;
+				continue; 
+			}
+			
+			codeV = _hyphyAAOrdering[_Genetic_Code[v]];
+			
+			codonProps = CompareCodonProperties (h,v,_Genetic_Code);
+			
+			tiCount = 0;
+			tvCount = 0;
+			
+			for (_p = 1; _p <= 3; _p = _p+1)
+			{
+				_titv = IsTransition (codonProps[_p]);
+				tiCount = tiCount + (_titv > 0);
+				tvCount = tvCount + (_titv < 0);
+			}
+			
+			if (tiCount + tvCount == 3)
+			{
+				idx = 5;
+			}
+			else
+			{
+				if (tiCount == 2)
+				{
+					idx = 2;
+				}
+				else
+				{
+					if (tvCount == 2)
+					{
+						idx = 3;
+					}
+					else
+					{
+						if (tiCount + tvCount == 2)
+						{
+							idx = 4;
+						}
+						else
+						{
+							if (tiCount == 1)
+							{
+								idx = 0;
+							}
+							else
+							{
+								idx = 1;
+							}
+						}
+					}
+				}
+			}
+			
+			if (codeH != codeV)
+			{
+				if (codeH < codeV)
+				{
+					codeToken = codeH + codeV;
+				}
+				else
+				{
+					codeToken = codeV + codeH;
+				}
+				if (Rows(byAA[codeToken]) == 0) /* not seen this pair yet */
+				{
+					byAA[codeToken] = {1,6}; 
+						/* 1-transition, 1-transversion, 2-transitions, 2-transversions,1-each,3-subs;
+						   multiplicative factors in front of the global rates
+						*/
+				}	
+				(byAA [codeToken])[idx] = (byAA [codeToken])[idx] + 2*CodonFreqs[h-hshift]*CodonFreqs[v-vshift];
+			}
+			ModelMatrixName[h-hshift][v-vshift] = "t*" + substitutionTypeStrings[idx];
+	    }
+    }	
+    
+    /* pass 2 to define amino-acid correction weights on a per-residue pair basis */
+    aaExpressions = {};
+    hshift = 0;
+	for (h=0; h<64; h=h+1)
+	{
+		if (IsStop(h,_Genetic_Code)) 
+		{
+			hshift = hshift+1;
+			continue; 
+		}
+		codeH = _hyphyAAOrdering[_Genetic_Code[h]];
+		vshift = hshift;
+		for (v = h+1; v<64; v=v+1)
+		{
+			if (IsStop(v,_Genetic_Code)) 
+			{
+				vshift = vshift+1;
+				continue; 
+			}
+			
+			codeV = _hyphyAAOrdering[_Genetic_Code[v]];  
+			if (codeH != codeV)
+			{
+				if (codeH < codeV)
+				{
+					codeToken = codeH + codeV;
+				}
+				else
+				{
+					codeToken = codeV + codeH;
+				}
+				if (Abs(aaExpressions[codeToken]) == 0) /* not seen this pair yet */
+				{
+					exprStr = "";
+					for (idx = 0; idx < 6; idx = idx+1)
+					{
+						if ((byAA[codeToken])[idx] > 0.)
+						{
+							exprStr = exprStr + substitutionTypeStrings[idx] + "*" + (byAA[codeToken])[idx] + "+"; 
+						}
+					}
+					
+					aaRate = AARates[_aaMapping[codeH]][_aaMapping[codeV]];
+					aaExpressions[codeToken] = "" + aaRate * AAFreqs[_Genetic_Code[h]] + "/(" + exprStr[0][Abs(exprStr)-2] + ")";
+				}	
+				
+				if (categoriesUsed)
+				{
+					ModelMatrixName[h-hshift][v-vshift] = ModelMatrixName[h-hshift][v-vshift] + "*(c*F*"+aaExpressions[codeToken]+"+(1-F))";
+				}
+				else
+				{
+					ModelMatrixName[h-hshift][v-vshift] = ModelMatrixName[h-hshift][v-vshift] + "*(omega*F*"+aaExpressions[codeToken]+"+(1-F))";
+				}
+			}
+		}
+	}
+    
+    modelDefString * "ModelMatrixName = {ModelMatrixDimension,ModelMatrixDimension}; "; 
+    
+    hshift = 0;
+	for (h=0; h<64; h=h+1)
+	{
+		if (IsStop(h,_Genetic_Code)) 
+		{
+			hshift = hshift+1;
+			continue; 
+		}
+		codeH = _hyphyAAOrdering[_Genetic_Code[h]];
+		vshift = hshift;
+		for (v = h+1; v<64; v=v+1)
+		{
+			if (IsStop(v,_Genetic_Code)) 
+			{
+				vshift = vshift+1;
+				continue; 
+			}
+			
+			modelDefString * ("ModelMatrixName["+(h-hshift)+"]["+(v-vshift)+"] := " + ModelMatrixName[h-hshift][v-vshift] + ";\n");
+			modelDefString * ("ModelMatrixName["+(v-vshift)+"]["+(h-hshift)+"] := " + ModelMatrixName[h-hshift][v-vshift] + ";\n");
+		}
+	}
+	
+    modelDefString * 0;    
+	ExecuteCommands (modelDefString);
+   	return 1;
+
+}
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function BuildCodonFrequencies (obsF, AAFreqs&)
+{
+	PIStop  = 1.0;
+	result  = {ModelMatrixDimension,1};
+	hshift  = 0;
+
+	AAFreqs = {21,1};
+
+	for (h=0; h<64; h=h+1)
+	{
+		first  = h$16;
+		second = h%16$4;
+		third  = h%4;
+		myCode = _Genetic_Code[h];
+		if (myCode==10) 
+		{
+			hshift = hshift+1;
+			PIStop = PIStop-obsF[first][0]*obsF[second][1]*obsF[third][2];
+			continue; 
+		}
+		result[h-hshift]=obsF[first][0]*obsF[second][1]*obsF[third][2];
+		AAFreqs[myCode] = AAFreqs[myCode] + result[h-hshift];
+	}
+	
+	AAFreqs = AAFreqs*(1.0/PIStop);
+	return result*(1.0/PIStop);
+}
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+if (!SKIP_MODEL_PARAMETER_LIST)
+{
+	categoriesUsed = 0;
+	ExecuteAFile ("TemplateModels/EmpiricalAA/modellist.ibf");
+	
+	models = generateSelectionList();
+	
+	ChoiceList (whichModel,"Protein Model Component", 1, SKIP_NONE,models );
+	
+	if (whichModel < 0)
+	{
+		return 0;
+	}
+	models = "TemplateModels/EmpiricalAA/"+ (modelList[whichModel])["File"];
+	fscanf (models, "String,NMatrix", modelOrdering, modelMatrix);
+
+	#include "modelParameters4.mdl";
+
+	if (rateType >= 1)
+	{
+		ExecuteAFile ("TemplateModels/EmpiricalAA/modellist.ibf");
+		ExecuteAFile ("Utility/GrabBag.bf");
+		ExecuteAFile ("TemplateModels/Yang2000Distributions.def");
+		rateType = rateType - 1;
+		SetWDistribution (prompt_for_a_value ("\nNumber of rate categories",10,2,15,1));
+		categoriesUsed = 1;
+	}	
+}
+
+
+ModelMatrixDimension = 64 - (_Genetic_Code["_MATRIX_ELEMENT_VALUE_ == 10"]*Transpose(_Genetic_Code["1"]))[0];
+
+if (!SKIP_HARVEST_FREQ)
+{
+	HarvestFrequencies (observedFreq,filteredData,3,1,1);
+}
+
+vectorOfFrequencies			= BuildCodonFrequencies (observedFreq, "AA");
+MULTIPLY_BY_FREQS			= PopulateModelMatrix ("MECMatrix", vectorOfFrequencies, AA, modelOrdering, modelMatrix, categoriesUsed);
+Model MEC_Model 			= (MECMatrix,vectorOfFrequencies,1);
+
+USE_POSITION_SPECIFIC_FREQS = 1;
diff --git a/res/TemplateBatchFiles/TemplateModels/MG94.mdl b/res/TemplateBatchFiles/TemplateModels/MG94.mdl
new file mode 100644
index 0000000..b172ccb
--- /dev/null
+++ b/res/TemplateBatchFiles/TemplateModels/MG94.mdl
@@ -0,0 +1,277 @@
+/* This file defines the transition matrix for the Muse-Gaut 94 model.
+   The file should be used as follows:
+   
+   1) Read Data File and create datafilter filteredData
+   2) #include this file (or use SelectTemplateModel(filteredData);)
+   3) Define the tree
+   4) Proceed with the likelihood function using 'vectorOfFrequencies' as the vector to pass to the constructor.
+   
+   This model has the following signature:
+   	#Short:MG94#
+   	#Desc:Muse-Gaut 94 codon model. Local or global parameters. Possible Gamma Variation.#
+   	#Dimension:*#
+    #DataType:codon#
+   	#FileName:MG94.mdl#
+   
+   08/18/1999  by Sergei L. Kosakovsky Pond
+*/
+
+ModelMatrixDimension = 0;
+
+function GetBranchDNDS (shortName)
+{
+	sR  = "givenTree."+shortName+".synRate";
+	nsR = "givenTree."+shortName+".nonSynRate";
+	sR = valueGrab (sR);
+	nsR = valueGrab (nsR);
+	if (sR > 0.0)
+	{
+		return nsR/sR;
+	}
+	else
+	{
+		return "Infinite";
+	}
+}
+
+function BuildCodonFrequencies (obsF)
+{
+	PIStop = 1.0;
+	result = {ModelMatrixDimension,1};
+	hshift = 0;
+
+	for (h=0; h<64; h=h+1)
+	{
+		first = h$16;
+		second = h%16$4;
+		third = h%4;
+		if (_Genetic_Code[h]==10) 
+		{
+			hshift = hshift+1;
+			PIStop = PIStop-obsF[first][0]*obsF[second][0]*obsF[third][0];
+			continue; 
+		}
+		result[h-hshift][0]=obsF[first][0]*obsF[second][0]*obsF[third][0];
+	}
+	return result*(1.0/PIStop);
+}
+
+#include "modelParameters.mdl";
+
+HarvestFrequencies (observedFreq,filteredData,1,1,0);
+
+NICETY_LEVEL = 3;
+
+if (modelType>0)
+{
+	global R = .5;
+	
+	if (modelType == 2)
+	{
+		#include "defineGamma.mdl";
+	}
+	if (modelType == 3)
+	{
+		#include "defineHM.mdl";
+	}
+}
+
+/* defines a sparse transition probabilities matrix 
+ now we'll go through the matrix and assign the elements based on syn/non-syn status*/
+
+function PopulateModelMatrix (ModelMatrixName&, EFV)
+{
+	if (!ModelMatrixDimension)
+	{
+		ModelMatrixDimension = 64;
+		for (h = 0 ;h<64; h=h+1)
+		{
+			if (_Genetic_Code[h]==10)
+			{
+				ModelMatrixDimension = ModelMatrixDimension-1;
+			}
+		}
+	}
+	ModelMatrixName = {ModelMatrixDimension,ModelMatrixDimension}; 
+
+	hshift = 0;
+
+	if (modelType == 0)
+	{
+		for (h=0; h<64; h=h+1)
+		{
+			if (_Genetic_Code[h]==10) 
+			{
+				hshift = hshift+1;
+				continue; 
+			}
+			vshift = hshift;
+			for (v = h+1; v<64; v=v+1)
+			{
+				diff = v-h;
+				if (_Genetic_Code[v]==10) 
+				{
+					vshift = vshift+1;
+					continue; 
+				}
+			  	if ((h$4==v$4)||((diff%4==0)&&(h$16==v$16))||(diff%16==0))
+			  	{
+			  		if (h$4==v$4)
+			  		{
+			  			transition = v%4;
+			  			transition2= h%4;
+			  		}
+			  		else
+			  		{
+			  			if(diff%16==0)
+			  			{
+			  				transition = v$16;
+			  				transition2= h$16;
+			  			}
+			  			else
+			  			{
+			  				transition = v%16$4;
+			  				transition2= h%16$4;
+			  			}
+			  		}
+			  		if (_Genetic_Code[0][h]==_Genetic_Code[0][v]) 
+			  		{
+			  			ModelMatrixName[h-hshift][v-vshift] := synRate*EFV__[transition__][0];
+			  			ModelMatrixName[v-vshift][h-hshift] := synRate*EFV__[transition2__][0];
+				  	}
+			  		else
+			  		{
+				  		ModelMatrixName[h-hshift][v-vshift] := nonSynRate*EFV__[transition__][0];
+			  			ModelMatrixName[v-vshift][h-hshift] := nonSynRate*EFV__[transition2__][0];
+		  			}
+			  	}
+			}
+		}
+	}
+	else
+	{
+		if (modelType == 1)
+		{
+			for (h=0; h<64; h=h+1)
+				{
+					if (_Genetic_Code[h]==10) 
+					{
+						hshift = hshift+1;
+						continue; 
+					}
+					vshift = hshift;
+					for (v = h+1; v<64; v=v+1)
+					{
+						diff = v-h;
+						if (_Genetic_Code[v]==10) 
+						{
+							vshift = vshift+1;
+							continue; 
+						}
+					  	if ((h$4==v$4)||((diff%4==0)&&(h$16==v$16))||(diff%16==0))
+					  	{
+					  		if (h$4==v$4)
+					  		{
+					  			transition = v%4;
+					  			transition2= h%4;
+					  		}
+					  		else
+					  		{
+					  			if(diff%16==0)
+					  			{
+					  				transition = v$16;
+					  				transition2= h$16;
+					  			}
+					  			else
+					  			{
+					  				transition = v%16$4;
+					  				transition2= h%16$4;
+					  			}
+					  		}
+					  		if (_Genetic_Code[0][h]==_Genetic_Code[0][v]) 
+					  		{
+					  			ModelMatrixName[h-hshift][v-vshift] := synRate*EFV__[transition__][0];
+					  			ModelMatrixName[v-vshift][h-hshift] := synRate*EFV__[transition2__][0];
+						  	}
+					  		else
+					  		{
+						  		ModelMatrixName[h-hshift][v-vshift] := R*synRate*EFV__[transition__][0];
+					  			ModelMatrixName[v-vshift][h-hshift] := R*synRate*EFV__[transition2__][0];
+				  			}
+					  	}
+					  }
+				}	
+		}
+		else
+		{
+			for (h=0; h<64; h=h+1)
+			{
+				if (_Genetic_Code[h]==10) 
+				{
+					hshift = hshift+1;
+					continue; 
+				}
+				vshift = hshift;
+				for (v = h+1; v<64; v=v+1)
+				{
+					diff = v-h;
+					if (_Genetic_Code[v]==10) 
+					{
+						vshift = vshift+1;
+						continue; 
+					}
+				  	if ((h$4==v$4)||((diff%4==0)&&(h$16==v$16))||(diff%16==0))
+				  	{
+				  		if (h$4==v$4)
+				  		{
+				  			transition = v%4;
+				  			transition2= h%4;
+				  		}
+				  		else
+				  		{
+				  			if(diff%16==0)
+				  			{
+				  				transition = v$16;
+				  				transition2= h$16;
+				  			}
+				  			else
+				  			{
+				  				transition = v%16$4;
+				  				transition2= h%16$4;
+				  			}
+				  		}
+				  		if (_Genetic_Code[0][h]==_Genetic_Code[0][v]) 
+				  		{
+				  			ModelMatrixName[h-hshift][v-vshift] := synRate*c*EFV__[transition__][0];
+				  			ModelMatrixName[v-vshift][h-hshift] := synRate*c*EFV__[transition2__][0];
+					  	}
+				  		else
+				  		{
+					  		ModelMatrixName[h-hshift][v-vshift] := R*synRate*c*EFV__[transition__][0];
+				  			ModelMatrixName[v-vshift][h-hshift] := R*synRate*c*EFV__[transition2__][0];
+			  			}
+				   }
+			   }		
+		    }
+		}
+	}
+	
+	return 0;
+}
+
+MG94 = 0;
+
+MULTIPLY_BY_FREQS = PopulateModelMatrix ("MG94", observedFreq);
+
+FREQUENCY_SENSITIVE = 1;
+
+vectorOfFrequencies = BuildCodonFrequencies (observedFreq);
+
+Model MG94model = (MG94,vectorOfFrequencies,0);
+
+if (modelType == 0)
+{
+	IS_DNDS_AVAILABLE = 1;
+}
+
+
diff --git a/res/TemplateBatchFiles/TemplateModels/MG94custom.mdl b/res/TemplateBatchFiles/TemplateModels/MG94custom.mdl
new file mode 100644
index 0000000..9ae7345
--- /dev/null
+++ b/res/TemplateBatchFiles/TemplateModels/MG94custom.mdl
@@ -0,0 +1,377 @@
+/* This file defines the transition matrix for the Muse-Gaut 94 model x an arbitrary 4x4 rate matrix
+   for nucleotide substituions.
+   
+   The file should be used as follows:
+   
+   1) Read Data File and create datafilter filteredData
+   2) #include this file (or use SelectTemplateModel(filteredData);)
+   3) Define the tree
+   4) Proceed with the likelihood function using 'vectorOfFrequencies' as the vector to pass to the constructor.
+   
+   This model has the following signature:
+   	#Short:MG94custom#
+   	#Desc:Muse-Gaut 94 x an arbitrary 4x4 rate matrix and 9 (3x4) frequency parameters. Possible Gamma Variation.#
+   	#Dimension:*#
+    #DataType:codon#
+   	#FileName:MG94custom.mdl#
+   
+   04/18/2002  by Sergei L. Kosakovsky Pond
+*/
+
+ModelMatrixDimension = 0;
+
+_MG94GlobalSuffix    = "";
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+_nucBiasMultipliers     = {{""   ,"AC*",""   ,"AT*"}
+						   {"AC*",""   ,"CG*","CT*"}
+						   {""   ,"CG*",""   ,"GT*"}
+						   {"AT*","CT*","GT*","" }
+						  };
+
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function makeLocalRateMult (_nbm)
+{
+	_localNucBiasMult = _nbm;
+	
+	for (h=0; h<4; h=h+1)
+	{
+		for (v=h+1; v<4; v=v+1)
+		{
+			aa1 = _nucBiasMultipliers[h][v];
+			if (Abs(aa1))
+			{
+				_gv = aa1[0][Abs(aa1)-2]+_MG94GlobalSuffix;
+				ExecuteCommands ("global "+_gv+"=1;\n");
+				_localNucBiasMult [h][v] = _gv + "*";
+				_localNucBiasMult [v][h] = _gv + "*";
+			}
+		}
+	}
+	return _localNucBiasMult;
+}
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function PopulateModelMatrix (ModelMatrixName&, EFV)
+{
+	if (!ModelMatrixDimension)
+	{
+		ModelMatrixDimension = 64 - (_Genetic_Code["_MATRIX_ELEMENT_VALUE_ == 10"]*Transpose(_Genetic_Code["1"]))[0];
+	}
+	
+	_localNucBiasMult = makeLocalRateMult(_nucBiasMultipliers);
+		
+	ModelMatrixName = {ModelMatrixDimension,ModelMatrixDimension}; 
+	
+	synCatRateMult 	  = "synRate*";
+	nonsynCatRateMult = "nonSynRate*";
+	if (modelType)
+	{
+		ExecuteCommands ("global R"+_MG94GlobalSuffix+"=1;");
+		nonsynCatRateMult = synCatRateMult + "R"+_MG94GlobalSuffix+"*";
+		if (modelType > 1)
+		{
+			synCatRateMult 	      = synCatRateMult    + "c"+_MG94GlobalSuffix+"*";
+			nonsynCatRateMult 	  = nonsynCatRateMult + "c"+_MG94GlobalSuffix+"*";
+		}
+	}
+		
+	modelDefString = "";
+	modelDefString*16384;
+	
+	hshift = 0;
+	
+	for (h=0; h<64; h=h+1)
+	{
+		if (_Genetic_Code[h]==10) 
+		{
+			hshift = hshift+1;
+			continue; 
+		}
+		vshift = hshift;
+		for (v = h+1; v<64; v=v+1)
+		{
+			diff = v-h;
+			if (_Genetic_Code[v]==10) 
+			{
+				vshift = vshift+1;
+				continue; 
+			}
+			nucPosInCodon = 2;
+			if ((h$4==v$4)||((diff%4==0)&&(h$16==v$16))||(diff%16==0))
+			{
+				if (h$4==v$4)
+				{
+					transition = v%4;
+					transition2= h%4;
+				}
+				else
+				{
+					if(diff%16==0)
+					{
+						transition = v$16;
+						transition2= h$16;
+						nucPosInCodon = 0;
+					}
+					else
+					{
+						transition = v%16$4;
+						transition2= h%16$4;
+						nucPosInCodon = 1;
+					}
+				}
+				hs = Format(h-hshift,0,0);
+				vs = Format(v-vshift,0,0);
+				ts = Format(transition,0,0);
+				ts2= Format(transition2,0,0);
+				ps = Format(nucPosInCodon,0,0);
+				aa1 = _Genetic_Code[0][h];
+				aa2 = _Genetic_Code[0][v];
+				
+				if (aa1==aa2) 
+				{
+					modelDefString*("ModelMatrixName["+hs+"]["+vs+"] := "+synCatRateMult+_localNucBiasMult[transition][transition2]+"EFV__["+ts+"]["+ps+"];\n"+
+													 "ModelMatrixName["+vs+"]["+hs+"] := "+synCatRateMult+_localNucBiasMult[transition][transition2]+"EFV__["+ts2+"]["+ps+"];\n");
+				}
+				else
+				{
+					modelDefString*("ModelMatrixName["+hs+"]["+vs+"] := "+nonsynCatRateMult+_localNucBiasMult[transition][transition2]+"EFV__["+ts+"]["+ps+"];\n"+
+													 "ModelMatrixName["+vs+"]["+hs+"] := "+nonsynCatRateMult+_localNucBiasMult[transition][transition2]+"EFV__["+ts2+"]["+ps+"];\n");						
+				}
+			}
+	    }
+    }		
+	modelDefString*0;
+	ExecuteCommands (modelDefString);
+
+	if (Abs(MGCustomModelConstraintString))
+	{
+		ExecuteCommands (MGCustomModelConstraintString);
+	}
+	return 0;
+}
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function GetBranchLengthExpression (ModelMatrixName&,EFV,vof)
+{	
+	_branchLengthExpression = {};
+	
+	_sTags  = {};
+	_nsTags = {};
+		
+	hshift = 0;
+	
+	_localNucBiasMult = makeLocalRateMult(_nucBiasMultipliers);
+
+	for (h=0; h<64; h=h+1)
+	{
+		if (_Genetic_Code[h]==10) 
+		{
+			hshift = hshift+1;
+			continue; 
+		}
+		vshift = hshift;
+		for (v = h+1; v<64; v=v+1)
+		{
+			diff = v-h;
+			if (_Genetic_Code[v]==10) 
+			{
+				vshift = vshift+1;
+				continue; 
+			}
+			nucPosInCodon = 2;
+			if ((h$4==v$4)||((diff%4==0)&&(h$16==v$16))||(diff%16==0))
+			{
+				if (h$4==v$4)
+				{
+					transition = v%4;
+					transition2= h%4;
+				}
+				else
+				{
+					if(diff%16==0)
+					{
+						transition = v$16;
+						transition2= h$16;
+						nucPosInCodon = 0;
+					}
+					else
+					{
+						transition = v%16$4;
+						transition2= h%16$4;
+						nucPosInCodon = 1;
+					}
+				}
+
+				aa1 = _Genetic_Code[0][h];
+				aa2 = _Genetic_Code[0][v];
+				
+				key 	= _localNucBiasMult[transition][transition2];
+				if (aa1==aa2) 
+				{
+					_sTags [key] = _sTags [key] + EFV[transition][nucPosInCodon]*vof[h-hshift]+
+												  EFV[transition2][nucPosInCodon]*vof[v-vshift];
+				
+				}
+				else
+				{
+					_nsTags [key] = _nsTags [key] + EFV[transition][nucPosInCodon]*vof[h-hshift]+
+												  EFV[transition2][nucPosInCodon]*vof[v-vshift];
+				}
+			}
+	    }
+    }		
+    
+    _branchLengthExpression["S"]  = "";
+    _branchLengthExpression["S"] * 128;
+    _branchLengthExpression["NS"] = "";
+    _branchLengthExpression["NS"] * 128;
+    
+    _keys = Rows (_sTags);
+    _branchLengthExpression["S"] * ("("+_keys[0]+_sTags[_keys[0]]);
+    for (h=1; h<Columns (_keys); h=h+1)
+    {
+    	_branchLengthExpression["S"] * ("+"+_keys[h]+_sTags[_keys[h]]);
+    }
+    _branchLengthExpression["S"] * ")";
+    _branchLengthExpression["S"] * 0;
+	
+    _keys = Rows (_nsTags);
+    _branchLengthExpression["NS"] * ("("+_keys[0]+_nsTags[_keys[0]]);
+    for (h=1; h<Columns (_keys); h=h+1)
+    {
+    	_branchLengthExpression["NS"] * ("+"+_keys[h]+_nsTags[_keys[h]]);
+    }
+    _branchLengthExpression["NS"] * ")";
+    _branchLengthExpression["NS"] * 0;
+
+	return _branchLengthExpression;
+}
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function PrepAConstraint 	   (modelDesc)
+{
+	MGCustomModelConstraintString = "";
+	MGCustomModelConstraintString * 128;
+
+	for (customLoopCounter2=1; customLoopCounter2<6; customLoopCounter2=customLoopCounter2+1)
+	{
+		for (customLoopCounter=0; customLoopCounter<customLoopCounter2; customLoopCounter=customLoopCounter+1)
+		{
+			if (modelDesc[customLoopCounter2]==modelDesc[customLoopCounter])
+			{
+				if (MGCustomRateBiasTerms[customLoopCounter2] == "1")
+				{
+					MGCustomModelConstraintString * (MGCustomRateBiasTerms[customLoopCounter]+_MG94GlobalSuffix+":="+MGCustomRateBiasTerms[customLoopCounter2]+";");
+				}
+				else
+				{
+					if (MGCustomRateBiasTerms[customLoopCounter] == "1")
+					{
+						MGCustomModelConstraintString * (MGCustomRateBiasTerms[customLoopCounter2]+_MG94GlobalSuffix+":="+MGCustomRateBiasTerms[customLoopCounter]+";");			
+					}
+					else
+					{
+						MGCustomModelConstraintString * (MGCustomRateBiasTerms[customLoopCounter2]+_MG94GlobalSuffix+":="+MGCustomRateBiasTerms[customLoopCounter]+_MG94GlobalSuffix+";");			
+					}
+					
+				}
+				break;
+			}
+		}
+	}	
+	
+	MGCustomModelConstraintString * 0;
+	
+	return 0;
+}
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function BuildCodonFrequencies (obsF)
+{
+	PIStop = 1.0;
+	result = {ModelMatrixDimension,1};
+	hshift = 0;
+
+	for (h=0; h<64; h=h+1)
+	{
+		first = h$16;
+		second = h%16$4;
+		third = h%4;
+		if (_Genetic_Code[h]==10) 
+		{
+			hshift = hshift+1;
+			PIStop = PIStop-obsF[first][0]*obsF[second][1]*obsF[third][2];
+			continue; 
+		}
+		result[h-hshift][0]=obsF[first][0]*obsF[second][1]*obsF[third][2];
+	}
+	return result*(1.0/PIStop);
+}
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+categoriesUsed = 0;
+
+if (!SKIP_MODEL_PARAMETER_LIST)
+{
+	#include "modelParameters.mdl";
+}
+
+sharedFlag = 1;
+
+if (modelType > 1)
+{
+	categoriesUsed = 1;
+	if (modelType == 2)
+	{
+		#include "defineGamma.mdl";
+	}
+	if (modelType == 3)
+	{
+		#include "defineHM.mdl";
+	}
+}
+
+if (!SKIP_MODEL_PARAMETER_LIST)
+{
+	done = 0;
+	while (!done)
+	{
+		fprintf (stdout,"\nPlease enter a 6 character model designation (e.g:010010 defines HKY85):");
+		fscanf  (stdin,"String", modelDesc);
+		if (Abs(modelDesc)==6)
+		{	
+			done = 1;
+		}
+	}	
+}		
+			
+MGCustomRateBiasTerms = {{"AC","1","AT","CG","CT","GT"}};
+
+PrepAConstraint	(modelDesc);
+
+if (!SKIP_HARVEST_FREQ)
+{
+	HarvestFrequencies (observedFreq,filteredData,3,1,1);
+}
+
+NICETY_LEVEL = 3;
+
+MG94custom = 0;
+
+MULTIPLY_BY_FREQS = PopulateModelMatrix ("MG94custom", observedFreq);
+
+FREQUENCY_SENSITIVE = 1;
+
+vectorOfFrequencies = BuildCodonFrequencies (observedFreq);
+
+Model MG94customModel = (MG94custom,vectorOfFrequencies,0);
+
+USE_POSITION_SPECIFIC_FREQS = 1;
diff --git a/res/TemplateBatchFiles/TemplateModels/MG94customCF3x4.mdl b/res/TemplateBatchFiles/TemplateModels/MG94customCF3x4.mdl
new file mode 100644
index 0000000..06a2ab6
--- /dev/null
+++ b/res/TemplateBatchFiles/TemplateModels/MG94customCF3x4.mdl
@@ -0,0 +1,378 @@
+/* This file defines the transition matrix for the Muse-Gaut 94 model x an arbitrary 4x4 rate matrix
+   for nucleotide substituions.
+   
+   The file should be used as follows:
+   
+   1) Read Data File and create datafilter filteredData
+   2) #include this file (or use SelectTemplateModel(filteredData);)
+   3) Define the tree
+   4) Proceed with the likelihood function using 'vectorOfFrequencies' as the vector to pass to the constructor.
+   
+   This model has the following signature:
+   	#Short:MG94custom#
+   	#Desc:Muse-Gaut 94 x an arbitrary 4x4 rate matrix and 9 (3x4) frequency parameters. Possible Gamma Variation.#
+   	#Dimension:*#
+    #DataType:codon#
+   	#FileName:MG94custom.mdl#
+   
+   12/23/2009  by Sergei L. Kosakovsky Pond
+*/
+
+ModelMatrixDimension = 0;
+
+_MG94GlobalSuffix    = "";
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+_nucBiasMultipliers     = {{""   ,"AC*",""   ,"AT*"}
+						   {"AC*",""   ,"CG*","CT*"}
+						   {""   ,"CG*",""   ,"GT*"}
+						   {"AT*","CT*","GT*","" }
+						  };
+
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function makeLocalRateMult (_nbm)
+{
+	_localNucBiasMult = _nbm;
+	
+	for (h=0; h<4; h=h+1)
+	{
+		for (v=h+1; v<4; v=v+1)
+		{
+			aa1 = _nucBiasMultipliers[h][v];
+			if (Abs(aa1))
+			{
+				_gv = aa1[0][Abs(aa1)-2]+_MG94GlobalSuffix;
+				ExecuteCommands ("global "+_gv+"=1;\n");
+				_localNucBiasMult [h][v] = _gv + "*";
+				_localNucBiasMult [v][h] = _gv + "*";
+			}
+		}
+	}
+	return _localNucBiasMult;
+}
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function PopulateModelMatrix (ModelMatrixName&, EFV)
+{
+	if (!ModelMatrixDimension)
+	{
+		ModelMatrixDimension = 64 - (_Genetic_Code["_MATRIX_ELEMENT_VALUE_ == 10"]*Transpose(_Genetic_Code["1"]))[0];
+	}
+	
+	_localNucBiasMult = makeLocalRateMult(_nucBiasMultipliers);
+		
+	ModelMatrixName = {ModelMatrixDimension,ModelMatrixDimension}; 
+	
+	synCatRateMult 	  = "synRate*";
+	nonsynCatRateMult = "nonSynRate*";
+	if (modelType)
+	{
+		ExecuteCommands ("global R"+_MG94GlobalSuffix+"=1;");
+		nonsynCatRateMult = synCatRateMult + "R"+_MG94GlobalSuffix+"*";
+		if (modelType > 1)
+		{
+			synCatRateMult 	      = synCatRateMult    + "c"+_MG94GlobalSuffix+"*";
+			nonsynCatRateMult 	  = nonsynCatRateMult + "c"+_MG94GlobalSuffix+"*";
+		}
+	}
+		
+	modelDefString = "";
+	modelDefString*16384;
+	
+	hshift = 0;
+	
+	for (h=0; h<64; h=h+1)
+	{
+		if (_Genetic_Code[h]==10) 
+		{
+			hshift = hshift+1;
+			continue; 
+		}
+		vshift = hshift;
+		for (v = h+1; v<64; v=v+1)
+		{
+			diff = v-h;
+			if (_Genetic_Code[v]==10) 
+			{
+				vshift = vshift+1;
+				continue; 
+			}
+			nucPosInCodon = 2;
+			if ((h$4==v$4)||((diff%4==0)&&(h$16==v$16))||(diff%16==0))
+			{
+				if (h$4==v$4)
+				{
+					transition = v%4;
+					transition2= h%4;
+				}
+				else
+				{
+					if(diff%16==0)
+					{
+						transition = v$16;
+						transition2= h$16;
+						nucPosInCodon = 0;
+					}
+					else
+					{
+						transition = v%16$4;
+						transition2= h%16$4;
+						nucPosInCodon = 1;
+					}
+				}
+				hs = Format(h-hshift,0,0);
+				vs = Format(v-vshift,0,0);
+				ts = Format(transition,0,0);
+				ts2= Format(transition2,0,0);
+				ps = Format(nucPosInCodon,0,0);
+				aa1 = _Genetic_Code[0][h];
+				aa2 = _Genetic_Code[0][v];
+				
+				if (aa1==aa2) 
+				{
+					modelDefString*("ModelMatrixName["+hs+"]["+vs+"] := "+synCatRateMult+_localNucBiasMult[transition][transition2]+"EFV__["+ts+"]["+ps+"];\n"+
+													 "ModelMatrixName["+vs+"]["+hs+"] := "+synCatRateMult+_localNucBiasMult[transition][transition2]+"EFV__["+ts2+"]["+ps+"];\n");
+				}
+				else
+				{
+					modelDefString*("ModelMatrixName["+hs+"]["+vs+"] := "+nonsynCatRateMult+_localNucBiasMult[transition][transition2]+"EFV__["+ts+"]["+ps+"];\n"+
+													 "ModelMatrixName["+vs+"]["+hs+"] := "+nonsynCatRateMult+_localNucBiasMult[transition][transition2]+"EFV__["+ts2+"]["+ps+"];\n");						
+				}
+			}
+	    }
+    }		
+	modelDefString*0;
+	ExecuteCommands (modelDefString);
+
+	if (Abs(MGCustomModelConstraintString))
+	{
+		ExecuteCommands (MGCustomModelConstraintString);
+	}
+	return 0;
+}
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function GetBranchLengthExpression (ModelMatrixName&,EFV,vof)
+{	
+	_branchLengthExpression = {};
+	
+	_sTags  = {};
+	_nsTags = {};
+		
+	hshift = 0;
+	
+	_localNucBiasMult = makeLocalRateMult(_nucBiasMultipliers);
+
+	for (h=0; h<64; h=h+1)
+	{
+		if (_Genetic_Code[h]==10) 
+		{
+			hshift = hshift+1;
+			continue; 
+		}
+		vshift = hshift;
+		for (v = h+1; v<64; v=v+1)
+		{
+			diff = v-h;
+			if (_Genetic_Code[v]==10) 
+			{
+				vshift = vshift+1;
+				continue; 
+			}
+			nucPosInCodon = 2;
+			if ((h$4==v$4)||((diff%4==0)&&(h$16==v$16))||(diff%16==0))
+			{
+				if (h$4==v$4)
+				{
+					transition = v%4;
+					transition2= h%4;
+				}
+				else
+				{
+					if(diff%16==0)
+					{
+						transition = v$16;
+						transition2= h$16;
+						nucPosInCodon = 0;
+					}
+					else
+					{
+						transition = v%16$4;
+						transition2= h%16$4;
+						nucPosInCodon = 1;
+					}
+				}
+
+				aa1 = _Genetic_Code[0][h];
+				aa2 = _Genetic_Code[0][v];
+				
+				key 	= _localNucBiasMult[transition][transition2];
+				if (aa1==aa2) 
+				{
+					_sTags [key] = _sTags [key] + EFV[transition][nucPosInCodon]*vof[h-hshift]+
+												  EFV[transition2][nucPosInCodon]*vof[v-vshift];
+				
+				}
+				else
+				{
+					_nsTags [key] = _nsTags [key] + EFV[transition][nucPosInCodon]*vof[h-hshift]+
+												  EFV[transition2][nucPosInCodon]*vof[v-vshift];
+				}
+			}
+	    }
+    }		
+    
+    _branchLengthExpression["S"]  = "";
+    _branchLengthExpression["S"] * 128;
+    _branchLengthExpression["NS"] = "";
+    _branchLengthExpression["NS"] * 128;
+    
+    _keys = Rows (_sTags);
+    _branchLengthExpression["S"] * ("("+_keys[0]+_sTags[_keys[0]]);
+    for (h=1; h<Columns (_keys); h=h+1)
+    {
+    	_branchLengthExpression["S"] * ("+"+_keys[h]+_sTags[_keys[h]]);
+    }
+    _branchLengthExpression["S"] * ")";
+    _branchLengthExpression["S"] * 0;
+	
+    _keys = Rows (_nsTags);
+    _branchLengthExpression["NS"] * ("("+_keys[0]+_nsTags[_keys[0]]);
+    for (h=1; h<Columns (_keys); h=h+1)
+    {
+    	_branchLengthExpression["NS"] * ("+"+_keys[h]+_nsTags[_keys[h]]);
+    }
+    _branchLengthExpression["NS"] * ")";
+    _branchLengthExpression["NS"] * 0;
+
+	return _branchLengthExpression;
+}
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function PrepAConstraint 	   (modelDesc)
+{
+	MGCustomModelConstraintString = "";
+	MGCustomModelConstraintString * 128;
+
+	for (customLoopCounter2=1; customLoopCounter2<6; customLoopCounter2=customLoopCounter2+1)
+	{
+		for (customLoopCounter=0; customLoopCounter<customLoopCounter2; customLoopCounter=customLoopCounter+1)
+		{
+			if (modelDesc[customLoopCounter2]==modelDesc[customLoopCounter])
+			{
+				if (MGCustomRateBiasTerms[customLoopCounter2] == "1")
+				{
+					MGCustomModelConstraintString * (MGCustomRateBiasTerms[customLoopCounter]+_MG94GlobalSuffix+":="+MGCustomRateBiasTerms[customLoopCounter2]+";");
+				}
+				else
+				{
+					if (MGCustomRateBiasTerms[customLoopCounter] == "1")
+					{
+						MGCustomModelConstraintString * (MGCustomRateBiasTerms[customLoopCounter2]+_MG94GlobalSuffix+":="+MGCustomRateBiasTerms[customLoopCounter]+";");			
+					}
+					else
+					{
+						MGCustomModelConstraintString * (MGCustomRateBiasTerms[customLoopCounter2]+_MG94GlobalSuffix+":="+MGCustomRateBiasTerms[customLoopCounter]+_MG94GlobalSuffix+";");			
+					}
+					
+				}
+				break;
+			}
+		}
+	}	
+	
+	MGCustomModelConstraintString * 0;
+	
+	return 0;
+}
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+categoriesUsed = 0;
+
+if (!SKIP_MODEL_PARAMETER_LIST)
+{
+	#include "modelParameters.mdl";
+}
+
+sharedFlag = 1;
+
+if (modelType > 1)
+{
+	categoriesUsed = 1;
+	if (modelType == 2)
+	{
+		#include "defineGamma.mdl";
+	}
+	if (modelType == 3)
+	{
+		#include "defineHM.mdl";
+	}
+}
+
+if (!SKIP_MODEL_PARAMETER_LIST)
+{
+	done = 0;
+	while (!done)
+	{
+		fprintf (stdout,"\nPlease enter a 6 character model designation (e.g:010010 defines HKY85):");
+		fscanf  (stdin,"String", modelDesc);
+		if (Abs(modelDesc)==6)
+		{	
+			done = 1;
+		}
+	}	
+}		
+
+
+			
+MGCustomRateBiasTerms = {{"AC","1","AT","CG","CT","GT"}};
+
+PrepAConstraint	(modelDesc);
+
+if (!SKIP_HARVEST_FREQ)
+{
+	#include "CF3x4.bf";
+	HarvestFrequencies (observedFreq,filteredData,3,1,1);
+	observedFreq   		= CF3x4 (observedFreq,GeneticCodeExclusions);
+}
+
+FREQUENCY_SENSITIVE = 1;
+
+MULTIPLY_BY_FREQS 	= PopulateModelMatrix ("MG94custom", observedFreq);
+vectorOfFrequencies = BuildCodonFrequencies (observedFreq);
+
+Model MG94customModel = (MG94custom,vectorOfFrequencies,0);
+
+USE_POSITION_SPECIFIC_FREQS = 1;
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function BuildCodonFrequencies (obsF)
+{
+	PIStop = 1.0;
+	result = {ModelMatrixDimension,1};
+	hshift = 0;
+
+	for (h=0; h<64; h=h+1)
+	{
+		first = h$16;
+		second = h%16$4;
+		third = h%4;
+		if (_Genetic_Code[h]==10) 
+		{
+			hshift = hshift+1;
+			PIStop = PIStop-obsF[first][0]*obsF[second][1]*obsF[third][2];
+			continue; 
+		}
+		result[h-hshift][0]=obsF[first][0]*obsF[second][1]*obsF[third][2];
+	}
+	return result*(1.0/PIStop);
+}
diff --git a/res/TemplateBatchFiles/TemplateModels/MG94customF1x4.mdl b/res/TemplateBatchFiles/TemplateModels/MG94customF1x4.mdl
new file mode 100644
index 0000000..238a9dd
--- /dev/null
+++ b/res/TemplateBatchFiles/TemplateModels/MG94customF1x4.mdl
@@ -0,0 +1,378 @@
+/* This file defines the transition matrix for the Muse-Gaut 94 model x an arbitrary 4x4 rate matrix
+   for nucleotide substituions.
+   
+   The file should be used as follows:
+   
+   1) Read Data File and create datafilter filteredData
+   2) #include this file (or use SelectTemplateModel(filteredData);)
+   3) Define the tree
+   4) Proceed with the likelihood function using 'vectorOfFrequencies' as the vector to pass to the constructor.
+   
+   This model has the following signature:
+   	#Short:MG94custom#
+   	#Desc:Muse-Gaut 94 x an arbitrary 4x4 rate matrix and 9 (3x4) frequency parameters. Possible Gamma Variation.#
+   	#Dimension:*#
+    #DataType:codon#
+   	#FileName:MG94custom.mdl#
+   
+   04/18/2002  by Sergei L. Kosakovsky Pond
+*/
+
+ModelMatrixDimension = 0;
+
+_MG94GlobalSuffix    = "";
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+_nucBiasMultipliers     = {{""   ,"AC*",""   ,"AT*"}
+						   {"AC*",""   ,"CG*","CT*"}
+						   {""   ,"CG*",""   ,"GT*"}
+						   {"AT*","CT*","GT*","" }
+						  };
+
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function makeLocalRateMult (_nbm)
+{
+	_localNucBiasMult = _nbm;
+	
+	for (h=0; h<4; h=h+1)
+	{
+		for (v=h+1; v<4; v=v+1)
+		{
+			aa1 = _nucBiasMultipliers[h][v];
+			if (Abs(aa1))
+			{
+				_gv = aa1[0][Abs(aa1)-2]+_MG94GlobalSuffix;
+				ExecuteCommands ("global "+_gv+"=1;\n");
+				_localNucBiasMult [h][v] = _gv + "*";
+				_localNucBiasMult [v][h] = _gv + "*";
+			}
+		}
+	}
+	return _localNucBiasMult;
+}
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function PopulateModelMatrix (ModelMatrixName&, EFV)
+{
+	if (!ModelMatrixDimension)
+	{
+		ModelMatrixDimension = 64 - (_Genetic_Code["_MATRIX_ELEMENT_VALUE_ == 10"]*Transpose(_Genetic_Code["1"]))[0];
+	}
+	
+	_localNucBiasMult = makeLocalRateMult(_nucBiasMultipliers);
+		
+	ModelMatrixName = {ModelMatrixDimension,ModelMatrixDimension}; 
+	
+	synCatRateMult 	  = "synRate*";
+	nonsynCatRateMult = "nonSynRate*";
+	if (modelType)
+	{
+		ExecuteCommands ("global R"+_MG94GlobalSuffix+"=1;");
+		nonsynCatRateMult = synCatRateMult + "R"+_MG94GlobalSuffix+"*";
+		if (modelType > 1)
+		{
+			synCatRateMult 	      = synCatRateMult    + "c"+_MG94GlobalSuffix+"*";
+			nonsynCatRateMult 	  = nonsynCatRateMult + "c"+_MG94GlobalSuffix+"*";
+		}
+	}
+		
+	modelDefString = "";
+	modelDefString*16384;
+	
+	hshift = 0;
+	
+	for (h=0; h<64; h=h+1)
+	{
+		if (_Genetic_Code[h]==10) 
+		{
+			hshift = hshift+1;
+			continue; 
+		}
+		vshift = hshift;
+		for (v = h+1; v<64; v=v+1)
+		{
+			diff = v-h;
+			if (_Genetic_Code[v]==10) 
+			{
+				vshift = vshift+1;
+				continue; 
+			}
+			nucPosInCodon = 2;
+			if ((h$4==v$4)||((diff%4==0)&&(h$16==v$16))||(diff%16==0))
+			{
+				if (h$4==v$4)
+				{
+					transition = v%4;
+					transition2= h%4;
+				}
+				else
+				{
+					if(diff%16==0)
+					{
+						transition = v$16;
+						transition2= h$16;
+						nucPosInCodon = 0;
+					}
+					else
+					{
+						transition = v%16$4;
+						transition2= h%16$4;
+						nucPosInCodon = 1;
+					}
+				}
+				hs = Format(h-hshift,0,0);
+				vs = Format(v-vshift,0,0);
+				ts = Format(transition,0,0);
+				ts2= Format(transition2,0,0);
+				ps = Format(nucPosInCodon,0,0);
+				aa1 = _Genetic_Code[0][h];
+				aa2 = _Genetic_Code[0][v];
+				
+				if (aa1==aa2) 
+				{
+					modelDefString*("ModelMatrixName["+hs+"]["+vs+"] := "+synCatRateMult+_localNucBiasMult[transition][transition2]+"EFV__["+ts+"]["+ps+"];\n"+
+													 "ModelMatrixName["+vs+"]["+hs+"] := "+synCatRateMult+_localNucBiasMult[transition][transition2]+"EFV__["+ts2+"]["+ps+"];\n");
+				}
+				else
+				{
+					modelDefString*("ModelMatrixName["+hs+"]["+vs+"] := "+nonsynCatRateMult+_localNucBiasMult[transition][transition2]+"EFV__["+ts+"]["+ps+"];\n"+
+													 "ModelMatrixName["+vs+"]["+hs+"] := "+nonsynCatRateMult+_localNucBiasMult[transition][transition2]+"EFV__["+ts2+"]["+ps+"];\n");						
+				}
+			}
+	    }
+    }		
+	modelDefString*0;
+	ExecuteCommands (modelDefString);
+
+	if (Abs(MGCustomModelConstraintString))
+	{
+		ExecuteCommands (MGCustomModelConstraintString);
+	}
+	return 0;
+}
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function GetBranchLengthExpression (ModelMatrixName&,EFV,vof)
+{	
+	_branchLengthExpression = {};
+	
+	_sTags  = {};
+	_nsTags = {};
+		
+	hshift = 0;
+	
+	_localNucBiasMult = makeLocalRateMult(_nucBiasMultipliers);
+
+	for (h=0; h<64; h=h+1)
+	{
+		if (_Genetic_Code[h]==10) 
+		{
+			hshift = hshift+1;
+			continue; 
+		}
+		vshift = hshift;
+		for (v = h+1; v<64; v=v+1)
+		{
+			diff = v-h;
+			if (_Genetic_Code[v]==10) 
+			{
+				vshift = vshift+1;
+				continue; 
+			}
+			nucPosInCodon = 2;
+			if ((h$4==v$4)||((diff%4==0)&&(h$16==v$16))||(diff%16==0))
+			{
+				if (h$4==v$4)
+				{
+					transition = v%4;
+					transition2= h%4;
+				}
+				else
+				{
+					if(diff%16==0)
+					{
+						transition = v$16;
+						transition2= h$16;
+						nucPosInCodon = 0;
+					}
+					else
+					{
+						transition = v%16$4;
+						transition2= h%16$4;
+						nucPosInCodon = 1;
+					}
+				}
+
+				aa1 = _Genetic_Code[0][h];
+				aa2 = _Genetic_Code[0][v];
+				
+				key 	= _localNucBiasMult[transition][transition2];
+				if (aa1==aa2) 
+				{
+					_sTags [key] = _sTags [key] + EFV[transition][nucPosInCodon]*vof[h-hshift]+
+												  EFV[transition2][nucPosInCodon]*vof[v-vshift];
+				
+				}
+				else
+				{
+					_nsTags [key] = _nsTags [key] + EFV[transition][nucPosInCodon]*vof[h-hshift]+
+												  EFV[transition2][nucPosInCodon]*vof[v-vshift];
+				}
+			}
+	    }
+    }		
+    
+    _branchLengthExpression["S"]  = "";
+    _branchLengthExpression["S"] * 128;
+    _branchLengthExpression["NS"] = "";
+    _branchLengthExpression["NS"] * 128;
+    
+    _keys = Rows (_sTags);
+    _branchLengthExpression["S"] * ("("+_keys[0]+_sTags[_keys[0]]);
+    for (h=1; h<Columns (_keys); h=h+1)
+    {
+    	_branchLengthExpression["S"] * ("+"+_keys[h]+_sTags[_keys[h]]);
+    }
+    _branchLengthExpression["S"] * ")";
+    _branchLengthExpression["S"] * 0;
+	
+    _keys = Rows (_nsTags);
+    _branchLengthExpression["NS"] * ("("+_keys[0]+_nsTags[_keys[0]]);
+    for (h=1; h<Columns (_keys); h=h+1)
+    {
+    	_branchLengthExpression["NS"] * ("+"+_keys[h]+_nsTags[_keys[h]]);
+    }
+    _branchLengthExpression["NS"] * ")";
+    _branchLengthExpression["NS"] * 0;
+
+	return _branchLengthExpression;
+}
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function PrepAConstraint 	   (modelDesc)
+{
+	MGCustomModelConstraintString = "";
+	MGCustomModelConstraintString * 128;
+
+	for (customLoopCounter2=1; customLoopCounter2<6; customLoopCounter2=customLoopCounter2+1)
+	{
+		for (customLoopCounter=0; customLoopCounter<customLoopCounter2; customLoopCounter=customLoopCounter+1)
+		{
+			if (modelDesc[customLoopCounter2]==modelDesc[customLoopCounter])
+			{
+				if (MGCustomRateBiasTerms[customLoopCounter2] == "1")
+				{
+					MGCustomModelConstraintString * (MGCustomRateBiasTerms[customLoopCounter]+_MG94GlobalSuffix+":="+MGCustomRateBiasTerms[customLoopCounter2]+";");
+				}
+				else
+				{
+					if (MGCustomRateBiasTerms[customLoopCounter] == "1")
+					{
+						MGCustomModelConstraintString * (MGCustomRateBiasTerms[customLoopCounter2]+_MG94GlobalSuffix+":="+MGCustomRateBiasTerms[customLoopCounter]+";");			
+					}
+					else
+					{
+						MGCustomModelConstraintString * (MGCustomRateBiasTerms[customLoopCounter2]+_MG94GlobalSuffix+":="+MGCustomRateBiasTerms[customLoopCounter]+_MG94GlobalSuffix+";");			
+					}
+					
+				}
+				break;
+			}
+		}
+	}	
+	
+	MGCustomModelConstraintString * 0;
+	
+	return 0;
+}
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function BuildCodonFrequencies (obsF)
+{
+	PIStop = 1.0;
+	result = {ModelMatrixDimension,1};
+	hshift = 0;
+
+	for (h=0; h<64; h=h+1)
+	{
+		first = h$16;
+		second = h%16$4;
+		third = h%4;
+		if (_Genetic_Code[h]==10) 
+		{
+			hshift = hshift+1;
+			PIStop = PIStop-obsF[first]*obsF[second]*obsF[third];
+			continue; 
+		}
+		result[h-hshift]=obsF[first]*obsF[second]*obsF[third];
+	}
+	return result*(1.0/PIStop);
+}
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+categoriesUsed = 0;
+COUNT_GAPS_IN_FREQUENCIES = 0;
+
+if (!SKIP_MODEL_PARAMETER_LIST)
+{
+	#include "modelParameters.mdl";
+}
+
+sharedFlag = 1;
+
+if (modelType > 1)
+{
+	categoriesUsed = 1;
+	if (modelType == 2)
+	{
+		#include "defineGamma.mdl";
+	}
+	if (modelType == 3)
+	{
+		#include "defineHM.mdl";
+	}
+}
+
+if (!SKIP_MODEL_PARAMETER_LIST)
+{
+	done = 0;
+	while (!done)
+	{
+		fprintf (stdout,"\nPlease enter a 6 character model designation (e.g:010010 defines HKY85):");
+		fscanf  (stdin,"String", modelDesc);
+		if (Abs(modelDesc)==6)
+		{	
+			done = 1;
+		}
+	}	
+}		
+			
+MGCustomRateBiasTerms = {{"AC","1","AT","CG","CT","GT"}};
+
+PrepAConstraint	(modelDesc);
+
+if (!SKIP_HARVEST_FREQ)
+{
+	HarvestFrequencies (observedFreq,filteredData,1,1,1);
+}
+
+NICETY_LEVEL = 3;
+
+MG94custom = 0;
+
+MULTIPLY_BY_FREQS = PopulateModelMatrix ("MG94custom", observedFreq);
+
+FREQUENCY_SENSITIVE = 1;
+
+vectorOfFrequencies = BuildCodonFrequencies (observedFreq);
+
+Model MG94customModel = (MG94custom,vectorOfFrequencies,0);
+
+USE_POSITION_SPECIFIC_FREQS = 1;
diff --git a/res/TemplateBatchFiles/TemplateModels/MG94customFreqs.mdl b/res/TemplateBatchFiles/TemplateModels/MG94customFreqs.mdl
new file mode 100644
index 0000000..7aff26d
--- /dev/null
+++ b/res/TemplateBatchFiles/TemplateModels/MG94customFreqs.mdl
@@ -0,0 +1,351 @@
+/* This file defines the transition matrix for the Muse-Gaut 94 model x an arbitrary 4x4 rate matrix
+   for nucleotide substituions.
+   
+   The file should be used as follows:
+   
+   1) Read Data File and create datafilter filteredData
+   2) #include this file (or use SelectTemplateModel(filteredData);)
+   3) Define the tree
+   4) Proceed with the likelihood function using 'vectorOfFrequencies' as the vector to pass to the constructor.
+   
+   This model has the following signature:
+   	#Short:MG94custom#
+   	#Desc:Muse-Gaut 94 x an arbitrary 4x4 rate matrix and 9 (3x4) frequency parameters. Possible Gamma Variation.#
+   	#Dimension:*#
+    #DataType:codon#
+   	#FileName:MG94custom.mdl#
+   
+   04/18/2002  by Sergei L. Kosakovsky Pond
+*/
+
+ModelMatrixDimension = 0;
+
+_MG94GlobalSuffix    = "";
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+_nucBiasMultipliers     = {{""   ,"AC*",""   ,"AT*"}
+						   {"AC*",""   ,"CG*","CT*"}
+						   {""   ,"CG*",""   ,"GT*"}
+						   {"AT*","CT*","GT*","" }
+						  };
+
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function makeLocalRateMult (_nbm)
+{
+	_localNucBiasMult = _nbm;
+	
+	for (h=0; h<4; h=h+1)
+	{
+		for (v=h+1; v<4; v=v+1)
+		{
+			aa1 = _nucBiasMultipliers[h][v];
+			if (Abs(aa1))
+			{
+				_gv = aa1[0][Abs(aa1)-2]+_MG94GlobalSuffix;
+				ExecuteCommands ("global "+_gv+"=1;\n");
+				_localNucBiasMult [h][v] = _gv + "*";
+				_localNucBiasMult [v][h] = _gv + "*";
+			}
+		}
+	}
+	return _localNucBiasMult;
+}
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function PopulateModelMatrix (ModelMatrixName&, EFV)
+{
+	if (!ModelMatrixDimension)
+	{
+		ModelMatrixDimension = 64 - (_Genetic_Code["_MATRIX_ELEMENT_VALUE_ == 10"]*Transpose(_Genetic_Code["1"]))[0];
+	}
+	
+	_localNucBiasMult = makeLocalRateMult(_nucBiasMultipliers);
+		
+	ModelMatrixName = {ModelMatrixDimension,ModelMatrixDimension}; 
+	
+	synCatRateMult 	  = "synRate*";
+	nonsynCatRateMult = "nonSynRate*";
+	if (modelType)
+	{
+		ExecuteCommands ("global R"+_MG94GlobalSuffix+"=1;");
+		nonsynCatRateMult = synCatRateMult + "R"+_MG94GlobalSuffix+"*";
+		if (modelType > 1)
+		{
+			synCatRateMult 	      = synCatRateMult    + "c"+_MG94GlobalSuffix+"*";
+			nonsynCatRateMult 	  = nonsynCatRateMult + "c"+_MG94GlobalSuffix+"*";
+		}
+	}
+		
+	modelDefString = "";
+	modelDefString*16384;
+	
+	hshift = 0;
+	
+	for (h=0; h<64; h=h+1)
+	{
+		if (_Genetic_Code[h]==10) 
+		{
+			hshift = hshift+1;
+			continue; 
+		}
+		vshift = hshift;
+		for (v = h+1; v<64; v=v+1)
+		{
+			diff = v-h;
+			if (_Genetic_Code[v]==10) 
+			{
+				vshift = vshift+1;
+				continue; 
+			}
+			nucPosInCodon = 2;
+			if ((h$4==v$4)||((diff%4==0)&&(h$16==v$16))||(diff%16==0))
+			{
+				if (h$4==v$4)
+				{
+					transition = v%4;
+					transition2= h%4;
+				}
+				else
+				{
+					if(diff%16==0)
+					{
+						transition = v$16;
+						transition2= h$16;
+						nucPosInCodon = 0;
+					}
+					else
+					{
+						transition = v%16$4;
+						transition2= h%16$4;
+						nucPosInCodon = 1;
+					}
+				}
+				hs = Format(h-hshift,0,0);
+				vs = Format(v-vshift,0,0);
+				ts = Format(transition,0,0);
+				ts2= Format(transition2,0,0);
+				ps = Format(nucPosInCodon,0,0);
+				aa1 = _Genetic_Code[0][h];
+				aa2 = _Genetic_Code[0][v];
+				
+				if (aa1==aa2) 
+				{
+					modelDefString*("ModelMatrixName["+hs+"]["+vs+"] := "+synCatRateMult+_localNucBiasMult[transition][transition2]+EFV[transition][nucPosInCodon]+";\n"+
+													 "ModelMatrixName["+vs+"]["+hs+"] := "+synCatRateMult+_localNucBiasMult[transition][transition2]+EFV[transition2][nucPosInCodon]+";\n");
+				}
+				else
+				{
+					modelDefString*("ModelMatrixName["+hs+"]["+vs+"] := "+nonsynCatRateMult+_localNucBiasMult[transition][transition2]+EFV[transition][nucPosInCodon]+";\n"+
+													 "ModelMatrixName["+vs+"]["+hs+"] := "+nonsynCatRateMult+_localNucBiasMult[transition][transition2]+EFV[transition2][nucPosInCodon]+";\n");						
+				}
+			}
+	    }
+    }		
+	modelDefString*0;
+	ExecuteCommands (modelDefString);
+
+	if (Abs(MGCustomModelConstraintString))
+	{
+		ExecuteCommands (MGCustomModelConstraintString);
+	}
+	return 0;
+}
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function GetBranchLengthExpression (ModelMatrixName&,EFV,vof)
+{	
+	_branchLengthExpression = {};
+	
+	_sTags  = {};
+	_nsTags = {};
+		
+	hshift = 0;
+	
+	_localNucBiasMult = makeLocalRateMult(_nucBiasMultipliers);
+
+	for (h=0; h<64; h=h+1)
+	{
+		if (_Genetic_Code[h]==10) 
+		{
+			hshift = hshift+1;
+			continue; 
+		}
+		vshift = hshift;
+		for (v = h+1; v<64; v=v+1)
+		{
+			diff = v-h;
+			if (_Genetic_Code[v]==10) 
+			{
+				vshift = vshift+1;
+				continue; 
+			}
+			nucPosInCodon = 2;
+			if ((h$4==v$4)||((diff%4==0)&&(h$16==v$16))||(diff%16==0))
+			{
+				if (h$4==v$4)
+				{
+					transition = v%4;
+					transition2= h%4;
+				}
+				else
+				{
+					if(diff%16==0)
+					{
+						transition = v$16;
+						transition2= h$16;
+						nucPosInCodon = 0;
+					}
+					else
+					{
+						transition = v%16$4;
+						transition2= h%16$4;
+						nucPosInCodon = 1;
+					}
+				}
+
+				aa1 = _Genetic_Code[0][h];
+				aa2 = _Genetic_Code[0][v];
+				
+				key 	= _localNucBiasMult[transition][transition2];
+				if (aa1==aa2) 
+				{
+					_sTags [key] = _sTags [key] + EFV[transition][nucPosInCodon]*vof[h-hshift]+
+												  EFV[transition2][nucPosInCodon]*vof[v-vshift];
+				
+				}
+				else
+				{
+					_nsTags [key] = _nsTags [key] + EFV[transition][nucPosInCodon]*vof[h-hshift]+
+												  EFV[transition2][nucPosInCodon]*vof[v-vshift];
+				}
+			}
+	    }
+    }		
+    
+    _branchLengthExpression["S"]  = "";
+    _branchLengthExpression["S"] * 128;
+    _branchLengthExpression["NS"] = "";
+    _branchLengthExpression["NS"] * 128;
+    
+    _keys = Rows (_sTags);
+    _branchLengthExpression["S"] * ("("+_keys[0]+_sTags[_keys[0]]);
+    for (h=1; h<Columns (_keys); h=h+1)
+    {
+    	_branchLengthExpression["S"] * ("+"+_keys[h]+_sTags[_keys[h]]);
+    }
+    _branchLengthExpression["S"] * ")";
+    _branchLengthExpression["S"] * 0;
+	
+    _keys = Rows (_nsTags);
+    _branchLengthExpression["NS"] * ("("+_keys[0]+_nsTags[_keys[0]]);
+    for (h=1; h<Columns (_keys); h=h+1)
+    {
+    	_branchLengthExpression["NS"] * ("+"+_keys[h]+_nsTags[_keys[h]]);
+    }
+    _branchLengthExpression["NS"] * ")";
+    _branchLengthExpression["NS"] * 0;
+
+	return _branchLengthExpression;
+}
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function PrepAConstraint 	   (modelDesc)
+{
+	MGCustomModelConstraintString = "";
+	MGCustomModelConstraintString * 128;
+
+	for (customLoopCounter2=1; customLoopCounter2<6; customLoopCounter2=customLoopCounter2+1)
+	{
+		for (customLoopCounter=0; customLoopCounter<customLoopCounter2; customLoopCounter=customLoopCounter+1)
+		{
+			if (modelDesc[customLoopCounter2]==modelDesc[customLoopCounter])
+			{
+				if (MGCustomRateBiasTerms[customLoopCounter2] == "1")
+				{
+					MGCustomModelConstraintString * (MGCustomRateBiasTerms[customLoopCounter]+_MG94GlobalSuffix+":="+MGCustomRateBiasTerms[customLoopCounter2]+";");
+				}
+				else
+				{
+					if (MGCustomRateBiasTerms[customLoopCounter] == "1")
+					{
+						MGCustomModelConstraintString * (MGCustomRateBiasTerms[customLoopCounter2]+_MG94GlobalSuffix+":="+MGCustomRateBiasTerms[customLoopCounter]+";");			
+					}
+					else
+					{
+						MGCustomModelConstraintString * (MGCustomRateBiasTerms[customLoopCounter2]+_MG94GlobalSuffix+":="+MGCustomRateBiasTerms[customLoopCounter]+_MG94GlobalSuffix+";");			
+					}
+					
+				}
+				break;
+			}
+		}
+	}	
+	
+	MGCustomModelConstraintString * 0;
+	
+	return 0;
+}
+
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+categoriesUsed = 0;
+
+if (!SKIP_MODEL_PARAMETER_LIST)
+{
+	#include "modelParameters.mdl";
+}
+
+sharedFlag = 1;
+
+if (modelType > 1)
+{
+	categoriesUsed = 1;
+	if (modelType == 2)
+	{
+		#include "defineGamma.mdl";
+	}
+	if (modelType == 3)
+	{
+		#include "defineHM.mdl";
+	}
+}
+
+if (!SKIP_MODEL_PARAMETER_LIST)
+{
+	done = 0;
+	while (!done)
+	{
+		fprintf (stdout,"\nPlease enter a 6 character model designation (e.g:010010 defines HKY85):");
+		fscanf  (stdin,"String", modelDesc);
+		if (Abs(modelDesc)==6)
+		{	
+			done = 1;
+		}
+	}	
+}		
+			
+MGCustomRateBiasTerms = {{"AC","1","AT","CG","CT","GT"}};
+
+PrepAConstraint	(modelDesc);
+
+if (!SKIP_HARVEST_FREQ)
+{
+	HarvestFrequencies (observedFreq,filteredData,3,1,1);
+}
+
+
+#include 				  "MGFreqsEstimator.ibf";
+
+MULTIPLY_BY_FREQS 		= PopulateModelMatrix ("MG94customMLEFreqs", paramFreqs);
+FREQUENCY_SENSITIVE 	= 1;
+
+BuildCodonFrequencies (paramFreqs,"vectorOfFrequencies");
+Model MG94CustomModelMLEFreqs = (MG94customMLEFreqs,vectorOfFrequencies,0);
+
+USE_POSITION_SPECIFIC_FREQS = 1;
diff --git a/res/TemplateBatchFiles/TemplateModels/MG94wAA.mdl b/res/TemplateBatchFiles/TemplateModels/MG94wAA.mdl
new file mode 100644
index 0000000..97329f4
--- /dev/null
+++ b/res/TemplateBatchFiles/TemplateModels/MG94wAA.mdl
@@ -0,0 +1,273 @@
+/* This file defines the transition matrix for the Muse-Gaut 94 model x an arbitrary 4x4 rate matrix
+   for nucleotide substituions and multiple non-syn rates for various types of A.A. substitutions.
+   
+   02/05/2004  by Sergei L. Kosakovsky Pond
+*/
+
+ModelMatrixDimension = 0;
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function PopulateModelMatrix (ModelMatrixName&, EFV)
+{
+	if (!ModelMatrixDimension)
+	{
+		ModelMatrixDimension = 64;
+		for (h = 0 ;h<64; h=h+1)
+		{
+			if (_Genetic_Code[h]==10)
+			{
+				ModelMatrixDimension = ModelMatrixDimension-1;
+			}
+		}
+	}
+	
+	ModelMatrixName = {ModelMatrixDimension,ModelMatrixDimension}; 
+
+	hshift = 0;
+	
+	modelDefString = "";
+	modelDefString*16384;
+	
+	if (modelType > 0)
+	{
+		catCounterAL = {};
+		if (_AA_RM_NUMERIC > 1)
+		{
+			ExecuteCommands ("global NS_Scaler = 1;");
+		}
+	}
+	
+	for (h=0; h<64; h=h+1)
+	{
+		if (_Genetic_Code[h]==10) 
+		{
+			hshift = hshift+1;
+			continue; 
+		}
+		vshift = hshift;
+		for (v = h+1; v<64; v=v+1)
+		{
+			diff = v-h;
+			if (_Genetic_Code[v]==10) 
+			{
+				vshift = vshift+1;
+				continue; 
+			}
+			nucPosInCodon = 2;
+			if ((h$4==v$4)||((diff%4==0)&&(h$16==v$16))||(diff%16==0))
+			{
+				if (h$4==v$4)
+				{
+					transition = v%4;
+					transition2= h%4;
+				}
+				else
+				{
+					if(diff%16==0)
+					{
+						transition = v$16;
+						transition2= h$16;
+						nucPosInCodon = 0;
+					}
+					else
+					{
+						transition = v%16$4;
+						transition2= h%16$4;
+						nucPosInCodon = 1;
+					}
+				}
+				hs = Format(h-hshift,0,0);
+				vs = Format(v-vshift,0,0);
+				ts = Format(transition,0,0);
+				ts2= Format(transition2,0,0);
+				ps = Format(nucPosInCodon,0,0);
+				aa1 = _Genetic_Code[0][h];
+				aa2 = _Genetic_Code[0][v];
+				if (aa1==aa2) 
+				{
+					modelDefString*("ModelMatrixName["+hs+"]["+vs+"] := "+_nucBiasTerms[transition][transition2]+"synRate*EFV__["+ts+"]["+ps+"];\n"+
+													 "ModelMatrixName["+vs+"]["+hs+"] := "+_nucBiasTerms[transition][transition2]+"synRate*EFV__["+ts2+"]["+ps+"];\n");
+				}
+				else
+				{
+					if (modelType > 0)
+					{
+						if (_AA_RM_NUMERIC)
+						{
+							if (_AA_RM_NUMERIC > 1)
+							{
+								bt = "NS_Scaler*" + aaRateMultipliers[aa1][aa2];
+							}
+							else
+							{
+								bt = aaRateMultipliers[aa1][aa2];
+							}
+						}
+						else
+						{
+							bt = aaRateMultipliers[aa1][aa2];
+							if (catCounterAL[bt] == 0)
+							{
+								catCounterAL[bt] = 1;
+								modelDefString*("\nglobal NSClass"+bt+"=1;\n");
+							}
+							bt = "NSClass"+bt;
+						}
+						
+						modelDefString*("ModelMatrixName["+hs+"]["+vs+"] := "+_nucBiasTerms[transition][transition2]+bt+"*synRate*EFV__["+ts+"]["+ps+"];\n"+
+														 "ModelMatrixName["+vs+"]["+hs+"] := "+_nucBiasTerms[transition][transition2]+bt+"*synRate*EFV__["+ts2+"]["+ps+"];\n");	
+					}
+					else
+					{
+						bt = "nsClass"+aaRateMultipliers[aa1][aa2];
+						modelDefString*("ModelMatrixName["+hs+"]["+vs+"] := "+_nucBiasTerms[transition][transition2]+bt+"*synRate*EFV__["+ts+"]["+ps+"];\n"+
+														 "ModelMatrixName["+vs+"]["+hs+"] := "+_nucBiasTerms[transition][transition2]+bt+"*synRate*EFV__["+ts2+"]["+ps+"];\n");						
+					}			
+				}
+			}
+	    }
+    }		
+	modelDefString*0;
+	ExecuteCommands (modelDefString);
+	return 0;
+}
+
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function BuildCodonFrequencies (obsF)
+{
+	PIStop = 1.0;
+	result = {ModelMatrixDimension,1};
+	hshift = 0;
+
+	for (h=0; h<64; h=h+1)
+	{
+		first = h$16;
+		second = h%16$4;
+		third = h%4;
+		if (_Genetic_Code[h]==10) 
+		{
+			hshift = hshift+1;
+			PIStop = PIStop-obsF[first][0]*obsF[second][1]*obsF[third][2];
+			continue; 
+		}
+		result[h-hshift][0]=obsF[first][0]*obsF[second][1]*obsF[third][2];
+	}
+	return result*(1.0/PIStop);
+}
+
+#include "MGwAA.ibf";
+
+categoriesUsed = 0;
+
+
+if (!SKIP_MODEL_PARAMETER_LIST)
+{
+	#include "modelParameters.mdl";
+}
+
+global AC = 1;
+global AT = 1;
+global CG = 1;
+global CT = 1;
+global GT = 1;
+
+if (modelType >0)
+{
+	sharedFlag = 1;
+	if (modelType == 2)
+	{
+		categoriesUsed = 1;
+		#include "defineGamma.mdl";
+	}
+	if (modelType == 3)
+	{
+		categoriesUsed = 1;
+		#include "defineHM.mdl";
+	}
+}
+
+if (modelType > 1)
+{
+	MGCustomRateBiasTerms = {{"AC*c*","c*","AT*c*","CG*c*","CT*c*","GT*c*"}};
+}
+else
+{
+	MGCustomRateBiasTerms = {{"AC*","","AT*","CG*","CT*","GT*"}};	
+}
+
+if (!SKIP_MODEL_PARAMETER_LIST)
+{
+	done = 0;
+	while (!done)
+	{
+		fprintf (stdout,"\nPlease enter a 6 character model designation (e.g:010010 defines HKY85):");
+		fscanf  (stdin,"String", modelDesc);
+		if (Abs(modelDesc)==6)
+		{	
+			done = 1;
+		}
+	}	
+}					
+
+		
+paramCount	  = 0;
+_nucBiasTerms = {4,4};
+_nucBiasTerms[0][0] = "";
+
+
+if (modelDesc[0]==modelDesc[1])
+{
+	MGCustomRateBiasTerms[0] = MGCustomRateBiasTerms[1];
+}
+
+_nucBiasTerms[1][0] = MGCustomRateBiasTerms[0];
+_nucBiasTerms[0][1] = MGCustomRateBiasTerms[0];
+_nucBiasTerms[2][0] = MGCustomRateBiasTerms[1];
+_nucBiasTerms[0][2] = MGCustomRateBiasTerms[1];
+
+h = 0;
+v = 3;
+
+for (customLoopCounter2=2; customLoopCounter2<6; customLoopCounter2=customLoopCounter2+1)
+{
+	for (customLoopCounter=0; customLoopCounter<customLoopCounter2; customLoopCounter=customLoopCounter+1)
+	{
+		if (modelDesc[customLoopCounter]==modelDesc[customLoopCounter2])
+		{
+			_nucBiasTerms[h][v] = MGCustomRateBiasTerms[customLoopCounter];
+			_nucBiasTerms[v][h] = MGCustomRateBiasTerms[customLoopCounter];
+			break;
+		}
+	}
+	if (customLoopCounter == customLoopCounter2)
+	{
+		_nucBiasTerms[h][v] = MGCustomRateBiasTerms[customLoopCounter2];
+		_nucBiasTerms[v][h] = MGCustomRateBiasTerms[customLoopCounter2];
+	}
+	
+	v = v+1;
+	if (v==4)
+	{
+		h=h+1;
+		v=h+1;
+	}
+}
+
+
+if (!SKIP_HARVEST_FREQ)
+{
+	HarvestFrequencies (observedFreq,filteredData,3,1,1);
+}
+
+MULTIPLY_BY_FREQS = PopulateModelMatrix ("MG94custom", observedFreq);
+
+FREQUENCY_SENSITIVE = 1;
+
+vectorOfFrequencies = BuildCodonFrequencies (observedFreq);
+
+Model MG94customModel = (MG94custom,vectorOfFrequencies,0);
+
+USE_POSITION_SPECIFIC_FREQS = 1;
diff --git a/res/TemplateBatchFiles/TemplateModels/MG94wAAF61.mdl b/res/TemplateBatchFiles/TemplateModels/MG94wAAF61.mdl
new file mode 100644
index 0000000..b5e9eac
--- /dev/null
+++ b/res/TemplateBatchFiles/TemplateModels/MG94wAAF61.mdl
@@ -0,0 +1,244 @@
+/* This file defines the transition matrix for the Muse-Gaut 94 model x an arbitrary 4x4 rate matrix
+   for nucleotide substituions and multiple non-syn rates for various types of A.A. substitutions.
+   
+   02/05/2004  by Sergei L. Kosakovsky Pond
+*/
+
+ModelMatrixDimension = 0;
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function PopulateModelMatrix (ModelMatrixName&)
+{
+	if (!ModelMatrixDimension)
+	{
+		ModelMatrixDimension = 64;
+		for (h = 0 ;h<64; h=h+1)
+		{
+			if (_Genetic_Code[h]==10)
+			{
+				ModelMatrixDimension = ModelMatrixDimension-1;
+			}
+		}
+	}
+	
+	ModelMatrixName = {ModelMatrixDimension,ModelMatrixDimension}; 
+
+	hshift = 0;
+	
+	modelDefString = "";
+	modelDefString*16384;
+	
+	if (modelType > 0)
+	{
+		catCounterAL = {};
+		if (_AA_RM_NUMERIC > 1)
+		{
+			ExecuteCommands ("global NS_Scaler = 1;");
+		}
+	}
+	
+	for (h=0; h<64; h=h+1)
+	{
+		if (_Genetic_Code[h]==10) 
+		{
+			hshift = hshift+1;
+			continue; 
+		}
+		vshift = hshift;
+		for (v = h+1; v<64; v=v+1)
+		{
+			diff = v-h;
+			if (_Genetic_Code[v]==10) 
+			{
+				vshift = vshift+1;
+				continue; 
+			}
+			nucPosInCodon = 2;
+			if ((h$4==v$4)||((diff%4==0)&&(h$16==v$16))||(diff%16==0))
+			{
+				if (h$4==v$4)
+				{
+					transition = v%4;
+					transition2= h%4;
+				}
+				else
+				{
+					if(diff%16==0)
+					{
+						transition = v$16;
+						transition2= h$16;
+						nucPosInCodon = 0;
+					}
+					else
+					{
+						transition = v%16$4;
+						transition2= h%16$4;
+						nucPosInCodon = 1;
+					}
+				}
+				hs = Format(h-hshift,0,0);
+				vs = Format(v-vshift,0,0);
+				ts = Format(transition,0,0);
+				ts2= Format(transition2,0,0);
+				ps = Format(nucPosInCodon,0,0);
+				aa1 = _Genetic_Code[0][h];
+				aa2 = _Genetic_Code[0][v];
+				if (aa1==aa2) 
+				{
+					modelDefString*("ModelMatrixName["+hs+"]["+vs+"] := "+_nucBiasTerms[transition][transition2]+"synRate;\n"+
+													 "ModelMatrixName["+vs+"]["+hs+"] := "+_nucBiasTerms[transition][transition2]+"synRate;\n");
+				}
+				else
+				{
+					if (modelType > 0)
+					{
+						if (_AA_RM_NUMERIC)
+						{
+							if (_AA_RM_NUMERIC > 1)
+							{
+								bt = "NS_Scaler*" + aaRateMultipliers[aa1][aa2];
+							}
+							else
+							{
+								bt = aaRateMultipliers[aa1][aa2];
+							}
+						}
+						else
+						{
+							bt = aaRateMultipliers[aa1][aa2];
+							if (catCounterAL[bt] == 0)
+							{
+								catCounterAL[bt] = 1;
+								modelDefString*("\nglobal NSClass"+bt+"=1;\n");
+							}
+							bt = "NSClass"+bt;
+						}
+						
+						modelDefString*("ModelMatrixName["+hs+"]["+vs+"] := "+_nucBiasTerms[transition][transition2]+bt+"*synRate;\n"+
+														 "ModelMatrixName["+vs+"]["+hs+"] := "+_nucBiasTerms[transition][transition2]+bt+"*synRate;\n");
+					}
+					else
+					{
+						bt = "nsClass"+aaRateMultipliers[aa1][aa2];
+						modelDefString*("ModelMatrixName["+hs+"]["+vs+"] := "+_nucBiasTerms[transition][transition2]+bt+"*synRate;\n"+
+														 "ModelMatrixName["+vs+"]["+hs+"] := "+_nucBiasTerms[transition][transition2]+bt+"*synRate;\n");				
+					}			
+				}
+			}
+	    }
+    }		
+	modelDefString*0;
+	ExecuteCommands (modelDefString);
+	return 1;
+}
+
+
+
+#include "MGwAA.ibf";
+
+categoriesUsed = 0;
+
+#include "modelParameters.mdl";
+
+global AC = 1;
+global AT = 1;
+global CG = 1;
+global CT = 1;
+global GT = 1;
+
+if (modelType >0)
+{
+	sharedFlag = 1;
+	if (modelType == 2)
+	{
+		categoriesUsed = 1;
+		#include "defineGamma.mdl";
+	}
+	if (modelType == 3)
+	{
+		categoriesUsed = 1;
+		#include "defineHM.mdl";
+	}
+}
+
+if (modelType > 1)
+{
+	MGCustomRateBiasTerms = {{"AC*c*","c*","AT*c*","CG*c*","CT*c*","GT*c*"}};
+}
+else
+{
+	MGCustomRateBiasTerms = {{"AC*","","AT*","CG*","CT*","GT*"}};	
+}
+
+
+done = 0;
+while (!done)
+{
+	fprintf (stdout,"\nPlease enter a 6 character model designation (e.g:010010 defines HKY85):");
+	fscanf  (stdin,"String", modelDesc);
+	if (Abs(modelDesc)==6)
+	{	
+		done = 1;
+	}
+}			
+
+		
+paramCount	  = 0;
+_nucBiasTerms = {4,4};
+_nucBiasTerms[0][0] = "";
+
+
+if (modelDesc[0]==modelDesc[1])
+{
+	MGCustomRateBiasTerms[0] = MGCustomRateBiasTerms[1];
+}
+
+_nucBiasTerms[1][0] = MGCustomRateBiasTerms[0];
+_nucBiasTerms[0][1] = MGCustomRateBiasTerms[0];
+_nucBiasTerms[2][0] = MGCustomRateBiasTerms[1];
+_nucBiasTerms[0][2] = MGCustomRateBiasTerms[1];
+
+h = 0;
+v = 3;
+
+for (customLoopCounter2=2; customLoopCounter2<6; customLoopCounter2=customLoopCounter2+1)
+{
+	for (customLoopCounter=0; customLoopCounter<customLoopCounter2; customLoopCounter=customLoopCounter+1)
+	{
+		if (modelDesc[customLoopCounter]==modelDesc[customLoopCounter2])
+		{
+			_nucBiasTerms[h][v] = MGCustomRateBiasTerms[customLoopCounter];
+			_nucBiasTerms[v][h] = MGCustomRateBiasTerms[customLoopCounter];
+			break;
+		}
+	}
+	if (customLoopCounter == customLoopCounter2)
+	{
+		_nucBiasTerms[h][v] = MGCustomRateBiasTerms[customLoopCounter2];
+		_nucBiasTerms[v][h] = MGCustomRateBiasTerms[customLoopCounter2];
+	}
+	
+	v = v+1;
+	if (v==4)
+	{
+		h=h+1;
+		v=h+1;
+	}
+}
+
+
+
+MULTIPLY_BY_FREQS = PopulateModelMatrix ("MG94custom");
+
+FREQUENCY_SENSITIVE = 1;
+
+COUNT_GAPS_IN_FREQUENCIES = 0;
+
+HarvestFrequencies 			(observedFreq,filteredData,3,3,1);
+vectorOfFrequencies = Transpose(observedFreq[Transpose(_Genetic_Code["_MATRIX_ELEMENT_VALUE_!=10"])]); 
+/* cough, cough, cough....HACK! */
+
+Model MG94customModel = (MG94custom,vectorOfFrequencies,1);
+
+USE_POSITION_SPECIFIC_FREQS = 0;
diff --git a/res/TemplateBatchFiles/TemplateModels/MG94wAAF61multiple.mdl b/res/TemplateBatchFiles/TemplateModels/MG94wAAF61multiple.mdl
new file mode 100644
index 0000000..033d86d
--- /dev/null
+++ b/res/TemplateBatchFiles/TemplateModels/MG94wAAF61multiple.mdl
@@ -0,0 +1,265 @@
+/* this file defines a multi-rate model 
+   with multiple substitutions under the 
+   F61 parameterization
+
+v0.1 20100524 SLKP spond at ucsd.edu 
+
+*/
+
+ModelMatrixDimension = 0;
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function PopulateModelMatrix (ModelMatrixName&)
+{
+	if (!ModelMatrixDimension)
+	{
+		ModelMatrixDimension = 64;
+		for (h = 0 ;h<64; h=h+1)
+		{
+			if (_Genetic_Code[h]==10)
+			{
+				ModelMatrixDimension = ModelMatrixDimension-1;
+			}
+		}
+	}
+	
+	ModelMatrixName = {ModelMatrixDimension,ModelMatrixDimension}; 
+
+	hshift = 0;
+	
+	modelDefString = "";
+	modelDefString*16384;
+	
+	modelDefString * "global twoNSsubsRate = 1;\nglobal threeNSsubsRate = 1;\nglobal twoSYNsubsRate = 1;\nglobal threeSYNsubsRate = 1;\n";
+	
+	if (modelType > 0)
+	{
+		catCounterAL = {};
+		if (_AA_RM_NUMERIC > 1)
+		{
+			ExecuteCommands ("global NS_Scaler = 1;");
+		}
+	}
+	
+	for (h=0; h<64; h=h+1)
+	{
+		if (_Genetic_Code[h]==10) 
+		{
+			hshift = hshift+1;
+			continue; 
+		}
+		vshift = hshift;
+		for (v = h+1; v<64; v=v+1)
+		{
+			diff = v-h;
+			if (_Genetic_Code[v]==10) 
+			{
+				vshift = vshift+1;
+				continue; 
+			}
+			codonProps = CompareCodonProperties (h,v,_Genetic_Code);
+
+			aa1 = _Genetic_Code[h];
+			aa2 = _Genetic_Code[v];
+			hs = Format(h-hshift,0,0);
+			vs = Format(v-vshift,0,0);
+			
+			nucTerms = "";
+			
+			for (pos = 0; pos < 3; pos = pos + 1)
+			{
+				thisPosition = codonProps[1+pos];
+				if (thisPosition[0] != thisPosition [1])
+				{
+					nucTerms = nucTerms + _nucBiasTerms[thisPosition[0]][thisPosition[1]];
+				}
+			}
+						
+			if (codonProps["DIFFERENCES"] == 1)
+			{
+				if (aa1==aa2) 
+				{
+					modelDefString*("ModelMatrixName["+hs+"]["+vs+"] := "+nucTerms+"synRate;\n"+
+									"ModelMatrixName["+vs+"]["+hs+"] := "+nucTerms+"synRate;\n");
+				}
+				else
+				{
+					if (modelType > 0)
+					{
+						if (_AA_RM_NUMERIC)
+						{
+							if (_AA_RM_NUMERIC > 1)
+							{
+								bt = "NS_Scaler*" + aaRateMultipliers[aa1][aa2];
+							}
+							else
+							{
+								bt = aaRateMultipliers[aa1][aa2];
+							}
+						}
+						else
+						{
+							bt = aaRateMultipliers[aa1][aa2];
+							if (catCounterAL[bt] == 0)
+							{
+								catCounterAL[bt] = 1;
+								modelDefString*("\nglobal NSClass"+bt+"=1;\n");
+							}
+							bt = "NSClass"+bt;
+						}
+						
+						modelDefString*("ModelMatrixName["+hs+"]["+vs+"] := "+nucTerms+bt+"*synRate;\n"+
+														 "ModelMatrixName["+vs+"]["+hs+"] := "+nucTerms+bt+"*synRate;\n");
+					}
+					else
+					{
+						bt = "nsClass"+aaRateMultipliers[aa1][aa2];
+						modelDefString*("ModelMatrixName["+hs+"]["+vs+"] := "+nucTerms+bt+"*synRate;\n"+
+														 "ModelMatrixName["+vs+"]["+hs+"] := "+nucTermsbt+"*synRate;\n");				
+					}			
+				}
+			}
+			else
+			{
+				if (aa1 == aa2)
+				{
+					if (codonProps["DIFFERENCES"] == 2)
+					{
+						term = "twoSYNsubsRate";
+					}
+					else
+					{
+						term = "threeSYNsubsRate";
+					}
+				}
+				else
+				{
+					if (codonProps["DIFFERENCES"] == 2)
+					{
+						term = "twoNSsubsRate";
+					}
+					else
+					{
+						term = "threeNSsubsRate";
+					}				
+				}
+				modelDefString*("ModelMatrixName["+hs+"]["+vs+"] := "+nucTerms+"synRate*"+term+";\n"+
+								"ModelMatrixName["+vs+"]["+hs+"] := "+nucTerms+"synRate*"+term+";\n");					
+			}
+	    }
+    }		
+    
+	modelDefString*0;
+	ExecuteCommands (modelDefString);
+	return 1;
+}
+
+
+
+#include "MGwAA.ibf";
+
+categoriesUsed = 0;
+
+#include "modelParameters.mdl";
+
+global AC = 1;
+global AT = 1;
+global CG = 1;
+global CT = 1;
+global GT = 1;
+
+if (modelType >0)
+{
+	sharedFlag = 1;
+	if (modelType == 2)
+	{
+		categoriesUsed = 1;
+		#include "defineGamma.mdl";
+	}
+	if (modelType == 3)
+	{
+		categoriesUsed = 1;
+		#include "defineHM.mdl";
+	}
+}
+
+if (modelType > 1)
+{
+	MGCustomRateBiasTerms = {{"AC*c*","c*","AT*c*","CG*c*","CT*c*","GT*c*"}};
+}
+else
+{
+	MGCustomRateBiasTerms = {{"AC*","","AT*","CG*","CT*","GT*"}};	
+}
+
+
+done = 0;
+while (!done)
+{
+	fprintf (stdout,"\nPlease enter a 6 character model designation (e.g:010010 defines HKY85):");
+	fscanf  (stdin,"String", modelDesc);
+	if (Abs(modelDesc)==6)
+	{	
+		done = 1;
+	}
+}			
+
+		
+paramCount	  = 0;
+_nucBiasTerms = {4,4};
+_nucBiasTerms[0][0] = "";
+
+
+if (modelDesc[0]==modelDesc[1])
+{
+	MGCustomRateBiasTerms[0] = MGCustomRateBiasTerms[1];
+}
+
+_nucBiasTerms[1][0] = MGCustomRateBiasTerms[0];
+_nucBiasTerms[0][1] = MGCustomRateBiasTerms[0];
+_nucBiasTerms[2][0] = MGCustomRateBiasTerms[1];
+_nucBiasTerms[0][2] = MGCustomRateBiasTerms[1];
+
+h = 0;
+v = 3;
+
+for (customLoopCounter2=2; customLoopCounter2<6; customLoopCounter2=customLoopCounter2+1)
+{
+	for (customLoopCounter=0; customLoopCounter<customLoopCounter2; customLoopCounter=customLoopCounter+1)
+	{
+		if (modelDesc[customLoopCounter]==modelDesc[customLoopCounter2])
+		{
+			_nucBiasTerms[h][v] = MGCustomRateBiasTerms[customLoopCounter];
+			_nucBiasTerms[v][h] = MGCustomRateBiasTerms[customLoopCounter];
+			break;
+		}
+	}
+	if (customLoopCounter == customLoopCounter2)
+	{
+		_nucBiasTerms[h][v] = MGCustomRateBiasTerms[customLoopCounter2];
+		_nucBiasTerms[v][h] = MGCustomRateBiasTerms[customLoopCounter2];
+	}
+	
+	v = v+1;
+	if (v==4)
+	{
+		h=h+1;
+		v=h+1;
+	}
+}
+
+
+
+MULTIPLY_BY_FREQS = PopulateModelMatrix ("MG94custom");
+
+FREQUENCY_SENSITIVE = 1;
+
+COUNT_GAPS_IN_FREQUENCIES = 0;
+
+HarvestFrequencies (observedFreq,filteredData,3,3,1);
+vectorOfFrequencies = Transpose(observedFreq[Transpose(_Genetic_Code["_MATRIX_ELEMENT_VALUE_!=10"])]); /* cough, cough, cough....HACK! */
+
+Model MG94customModel = (MG94custom,vectorOfFrequencies,1);
+
+USE_POSITION_SPECIFIC_FREQS = 0;
diff --git a/res/TemplateBatchFiles/TemplateModels/MG94wAAFreqs.mdl b/res/TemplateBatchFiles/TemplateModels/MG94wAAFreqs.mdl
new file mode 100644
index 0000000..ee81286
--- /dev/null
+++ b/res/TemplateBatchFiles/TemplateModels/MG94wAAFreqs.mdl
@@ -0,0 +1,241 @@
+/* This file defines the transition matrix for the Muse-Gaut 94 model x an arbitrary 4x4 rate matrix
+   for nucleotide substituions and multiple non-syn rates for various types of A.A. substitutions.
+   
+   02/05/2004  by Sergei L. Kosakovsky Pond
+*/
+
+ModelMatrixDimension = 0;
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function PopulateModelMatrix (ModelMatrixName&, EFV)
+{
+	if (!ModelMatrixDimension)
+	{
+		ModelMatrixDimension = 64;
+		for (h = 0 ;h<64; h=h+1)
+		{
+			if (_Genetic_Code[h]==10)
+			{
+				ModelMatrixDimension = ModelMatrixDimension-1;
+			}
+		}
+	}
+	
+	ModelMatrixName = {ModelMatrixDimension,ModelMatrixDimension}; 
+
+	hshift = 0;
+	
+	modelDefString = "";
+	modelDefString*16384;
+	
+	if (modelType > 0)
+	{
+		catCounterAL = {};
+		if (_AA_RM_NUMERIC > 1)
+		{
+			ExecuteCommands ("global NS_Scaler = 1;");
+		}
+	}
+	
+	for (h=0; h<64; h=h+1)
+	{
+		if (_Genetic_Code[h]==10) 
+		{
+			hshift = hshift+1;
+			continue; 
+		}
+		vshift = hshift;
+		for (v = h+1; v<64; v=v+1)
+		{
+			diff = v-h;
+			if (_Genetic_Code[v]==10) 
+			{
+				vshift = vshift+1;
+				continue; 
+			}
+			nucPosInCodon = 2;
+			if ((h$4==v$4)||((diff%4==0)&&(h$16==v$16))||(diff%16==0))
+			{
+				if (h$4==v$4)
+				{
+					transition = v%4;
+					transition2= h%4;
+				}
+				else
+				{
+					if(diff%16==0)
+					{
+						transition = v$16;
+						transition2= h$16;
+						nucPosInCodon = 0;
+					}
+					else
+					{
+						transition = v%16$4;
+						transition2= h%16$4;
+						nucPosInCodon = 1;
+					}
+				}
+				hs = Format(h-hshift,0,0);
+				vs = Format(v-vshift,0,0);
+				ts = Format(transition,0,0);
+				ts2= Format(transition2,0,0);
+				ps = Format(nucPosInCodon,0,0);
+				aa1 = _Genetic_Code[0][h];
+				aa2 = _Genetic_Code[0][v];
+				if (aa1==aa2) 
+				{
+					modelDefString*("ModelMatrixName["+hs+"]["+vs+"] := "+_nucBiasTerms[transition][transition2]+"synRate*"+EFV[transition][nucPosInCodon]+";\n"+
+													 "ModelMatrixName["+vs+"]["+hs+"] := "+_nucBiasTerms[transition][transition2]+"synRate*"+EFV[transition2][nucPosInCodon]+";\n");
+				}
+				else
+				{
+					if (modelType > 0)
+					{
+						if (_AA_RM_NUMERIC)
+						{
+							if (_AA_RM_NUMERIC > 1)
+							{
+								bt = "NS_Scaler*" + aaRateMultipliers[aa1][aa2];
+							}
+							else
+							{
+								bt = aaRateMultipliers[aa1][aa2];
+							}
+						}
+						else
+						{
+							bt = aaRateMultipliers[aa1][aa2];
+							if (catCounterAL[bt] == 0)
+							{
+								catCounterAL[bt] = 1;
+								modelDefString*("\nglobal NSClass"+bt+"=1;\n");
+							}
+							bt = "NSClass"+bt;
+						}
+						
+						modelDefString*("ModelMatrixName["+hs+"]["+vs+"] := "+_nucBiasTerms[transition][transition2]+bt+"*synRate*"+EFV[transition][nucPosInCodon]+";\n"+
+														 "ModelMatrixName["+vs+"]["+hs+"] := "+_nucBiasTerms[transition][transition2]+bt+"*synRate*"+EFV[transition2][nucPosInCodon]+";\n");
+					}
+					else
+					{
+						bt = "nsClass"+aaRateMultipliers[aa1][aa2];
+						modelDefString*("ModelMatrixName["+hs+"]["+vs+"] := "+_nucBiasTerms[transition][transition2]+bt+"*synRate*"+EFV[transition][nucPosInCodon]+";\n"+
+														 "ModelMatrixName["+vs+"]["+hs+"] := "+_nucBiasTerms[transition][transition2]+bt+"*synRate*"+EFV[transition2][nucPosInCodon]+";\n");				
+					}			
+				}
+			}
+	    }
+    }		
+	modelDefString*0;
+	ExecuteCommands (modelDefString);
+	return 0;
+}
+
+
+
+#include "MGwAA.ibf";
+
+categoriesUsed = 0;
+
+#include "modelParameters.mdl";
+
+global AC = 1;
+global AT = 1;
+global CG = 1;
+global CT = 1;
+global GT = 1;
+
+if (modelType >0)
+{
+	sharedFlag = 1;
+	if (modelType == 2)
+	{
+		categoriesUsed = 1;
+		#include "defineGamma.mdl";
+	}
+	if (modelType == 3)
+	{
+		categoriesUsed = 1;
+		#include "defineHM.mdl";
+	}
+}
+
+if (modelType > 1)
+{
+	MGCustomRateBiasTerms = {{"AC*c*","c*","AT*c*","CG*c*","CT*c*","GT*c*"}};
+}
+else
+{
+	MGCustomRateBiasTerms = {{"AC*","","AT*","CG*","CT*","GT*"}};	
+}
+
+
+done = 0;
+while (!done)
+{
+	fprintf (stdout,"\nPlease enter a 6 character model designation (e.g:010010 defines HKY85):");
+	fscanf  (stdin,"String", modelDesc);
+	if (Abs(modelDesc)==6)
+	{	
+		done = 1;
+	}
+}			
+
+		
+paramCount	  = 0;
+_nucBiasTerms = {4,4};
+_nucBiasTerms[0][0] = "";
+
+
+if (modelDesc[0]==modelDesc[1])
+{
+	MGCustomRateBiasTerms[0] = MGCustomRateBiasTerms[1];
+}
+
+_nucBiasTerms[1][0] = MGCustomRateBiasTerms[0];
+_nucBiasTerms[0][1] = MGCustomRateBiasTerms[0];
+_nucBiasTerms[2][0] = MGCustomRateBiasTerms[1];
+_nucBiasTerms[0][2] = MGCustomRateBiasTerms[1];
+
+h = 0;
+v = 3;
+
+for (customLoopCounter2=2; customLoopCounter2<6; customLoopCounter2=customLoopCounter2+1)
+{
+	for (customLoopCounter=0; customLoopCounter<customLoopCounter2; customLoopCounter=customLoopCounter+1)
+	{
+		if (modelDesc[customLoopCounter]==modelDesc[customLoopCounter2])
+		{
+			_nucBiasTerms[h][v] = MGCustomRateBiasTerms[customLoopCounter];
+			_nucBiasTerms[v][h] = MGCustomRateBiasTerms[customLoopCounter];
+			break;
+		}
+	}
+	if (customLoopCounter == customLoopCounter2)
+	{
+		_nucBiasTerms[h][v] = MGCustomRateBiasTerms[customLoopCounter2];
+		_nucBiasTerms[v][h] = MGCustomRateBiasTerms[customLoopCounter2];
+	}
+	
+	v = v+1;
+	if (v==4)
+	{
+		h=h+1;
+		v=h+1;
+	}
+}
+
+
+HarvestFrequencies (observedFreq,filteredData,3,1,1);
+
+#include "MGFreqsEstimator.ibf";
+
+MULTIPLY_BY_FREQS = PopulateModelMatrix ("MG94custom", paramFreqs);
+
+FREQUENCY_SENSITIVE = 1;
+BuildCodonFrequencies (paramFreqs,"vectorOfFrequencies");
+Model MG94customModel = (MG94custom,vectorOfFrequencies,0);
+
+USE_POSITION_SPECIFIC_FREQS = 1;
diff --git a/res/TemplateBatchFiles/TemplateModels/MG94wAAUserFreqs.mdl b/res/TemplateBatchFiles/TemplateModels/MG94wAAUserFreqs.mdl
new file mode 100644
index 0000000..25c8972
--- /dev/null
+++ b/res/TemplateBatchFiles/TemplateModels/MG94wAAUserFreqs.mdl
@@ -0,0 +1,247 @@
+/* This file defines the transition matrix for the Muse-Gaut 94 model x an arbitrary 4x4 rate matrix
+   for nucleotide substituions and multiple non-syn rates for various types of A.A. substitutions.
+   
+   02/05/2004  by Sergei L. Kosakovsky Pond
+*/
+
+ModelMatrixDimension = 0;
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function PopulateModelMatrix (ModelMatrixName& )
+{
+	if (!ModelMatrixDimension)
+	{
+		ModelMatrixDimension = 64;
+		for (h = 0 ;h<64; h=h+1)
+		{
+			if (_Genetic_Code[h]==10)
+			{
+				ModelMatrixDimension = ModelMatrixDimension-1;
+			}
+		}
+	}
+	
+	ModelMatrixName = {ModelMatrixDimension,ModelMatrixDimension}; 
+
+	hshift = 0;
+	
+	modelDefString = "";
+	modelDefString*16384;
+	
+	if (modelType > 0)
+	{
+		catCounterAL = {};
+		if (_AA_RM_NUMERIC > 1)
+		{
+			ExecuteCommands ("global NS_Scaler = 1;");
+		}
+	}
+	
+	for (h=0; h<64; h=h+1)
+	{
+		if (_Genetic_Code[h]==10) 
+		{
+			hshift = hshift+1;
+			continue; 
+		}
+		vshift = hshift;
+		for (v = h+1; v<64; v=v+1)
+		{
+			diff = v-h;
+			if (_Genetic_Code[v]==10) 
+			{
+				vshift = vshift+1;
+				continue; 
+			}
+			nucPosInCodon = 2;
+			if ((h$4==v$4)||((diff%4==0)&&(h$16==v$16))||(diff%16==0))
+			{
+				if (h$4==v$4)
+				{
+					transition = v%4;
+					transition2= h%4;
+				}
+				else
+				{
+					if(diff%16==0)
+					{
+						transition = v$16;
+						transition2= h$16;
+						nucPosInCodon = 0;
+					}
+					else
+					{
+						transition = v%16$4;
+						transition2= h%16$4;
+						nucPosInCodon = 1;
+					}
+				}
+				hs = Format(h-hshift,0,0);
+				vs = Format(v-vshift,0,0);
+				ts = Format(transition,0,0);
+				ts2= Format(transition2,0,0);
+				ps = Format(nucPosInCodon,0,0);
+				aa1 = _Genetic_Code[0][h];
+				aa2 = _Genetic_Code[0][v];
+				if (aa1==aa2) 
+				{
+					modelDefString*("ModelMatrixName["+hs+"]["+vs+"] := "+_nucBiasTerms[transition][transition2]+"synRate;\n"+
+													 "ModelMatrixName["+vs+"]["+hs+"] := "+_nucBiasTerms[transition][transition2]+"synRate;\n");
+				}
+				else
+				{
+					if (modelType > 0)
+					{
+						if (_AA_RM_NUMERIC)
+						{
+							if (_AA_RM_NUMERIC > 1)
+							{
+								bt = "NS_Scaler*" + aaRateMultipliers[aa1][aa2];
+							}
+							else
+							{
+								bt = aaRateMultipliers[aa1][aa2];
+							}
+						}
+						else
+						{
+							bt = aaRateMultipliers[aa1][aa2];
+							if (catCounterAL[bt] == 0)
+							{
+								catCounterAL[bt] = 1;
+								modelDefString*("\nglobal NSClass"+bt+"=1;\n");
+							}
+							bt = "NSClass"+bt;
+						}
+						
+						modelDefString*("ModelMatrixName["+hs+"]["+vs+"] := "+_nucBiasTerms[transition][transition2]+bt+"*synRate;\n"+
+														 "ModelMatrixName["+vs+"]["+hs+"] := "+_nucBiasTerms[transition][transition2]+bt+"*synRate;\n");
+					}
+					else
+					{
+						bt = "nsClass"+aaRateMultipliers[aa1][aa2];
+						modelDefString*("ModelMatrixName["+hs+"]["+vs+"] := "+_nucBiasTerms[transition][transition2]+bt+"*synRate;\n"+
+														 "ModelMatrixName["+vs+"]["+hs+"] := "+_nucBiasTerms[transition][transition2]+bt+"*synRate;\n");				
+					}			
+				}
+			}
+	    }
+    }		
+	modelDefString*0;
+	ExecuteCommands (modelDefString);
+	return 0;
+}
+
+
+
+#include "MGwAA.ibf";
+
+categoriesUsed = 0;
+
+#include "modelParameters.mdl";
+
+global AC = 1;
+global AT = 1;
+global CG = 1;
+global CT = 1;
+global GT = 1;
+
+if (modelType >0)
+{
+	sharedFlag = 1;
+	if (modelType == 2)
+	{
+		categoriesUsed = 1;
+		#include "defineGamma.mdl";
+	}
+	if (modelType == 3)
+	{
+		categoriesUsed = 1;
+		#include "defineHM.mdl";
+	}
+}
+
+if (modelType > 1)
+{
+	MGCustomRateBiasTerms = {{"AC*c*","c*","AT*c*","CG*c*","CT*c*","GT*c*"}};
+}
+else
+{
+	MGCustomRateBiasTerms = {{"AC*","","AT*","CG*","CT*","GT*"}};	
+}
+
+
+done = 0;
+while (!done)
+{
+	fprintf (stdout,"\nPlease enter a 6 character model designation (e.g:010010 defines HKY85):");
+	fscanf  (stdin,"String", modelDesc);
+	if (Abs(modelDesc)==6)
+	{	
+		done = 1;
+	}
+}			
+
+		
+paramCount	  = 0;
+_nucBiasTerms = {4,4};
+_nucBiasTerms[0][0] = "";
+
+
+if (modelDesc[0]==modelDesc[1])
+{
+	MGCustomRateBiasTerms[0] = MGCustomRateBiasTerms[1];
+}
+
+_nucBiasTerms[1][0] = MGCustomRateBiasTerms[0];
+_nucBiasTerms[0][1] = MGCustomRateBiasTerms[0];
+_nucBiasTerms[2][0] = MGCustomRateBiasTerms[1];
+_nucBiasTerms[0][2] = MGCustomRateBiasTerms[1];
+
+h = 0;
+v = 3;
+
+for (customLoopCounter2=2; customLoopCounter2<6; customLoopCounter2=customLoopCounter2+1)
+{
+	for (customLoopCounter=0; customLoopCounter<customLoopCounter2; customLoopCounter=customLoopCounter+1)
+	{
+		if (modelDesc[customLoopCounter]==modelDesc[customLoopCounter2])
+		{
+			_nucBiasTerms[h][v] = MGCustomRateBiasTerms[customLoopCounter];
+			_nucBiasTerms[v][h] = MGCustomRateBiasTerms[customLoopCounter];
+			break;
+		}
+	}
+	if (customLoopCounter == customLoopCounter2)
+	{
+		_nucBiasTerms[h][v] = MGCustomRateBiasTerms[customLoopCounter2];
+		_nucBiasTerms[v][h] = MGCustomRateBiasTerms[customLoopCounter2];
+	}
+	
+	v = v+1;
+	if (v==4)
+	{
+		h=h+1;
+		v=h+1;
+	}
+}
+
+
+HarvestFrequencies (observedFreq,filteredData,3,1,1);
+
+#include "MGFreqsEstimator.ibf";
+
+MULTIPLY_BY_FREQS = PopulateModelMatrix ("MG94custom" );
+
+FREQUENCY_SENSITIVE = 1;
+
+SetDialogPrompt ( "Select a user-defined frequency file in hyphy array format:" );
+fscanf ( PROMPT_FOR_FILE, "NMatrix", paramFreqs );
+BuildCodonFrequencies (paramFreqs,"vectorOfFrequencies");
+
+
+
+Model MG94customModel = (MG94custom,vectorOfFrequencies,1);
+
+USE_POSITION_SPECIFIC_FREQS = 1;
diff --git a/res/TemplateBatchFiles/TemplateModels/MG94wEX.mdl b/res/TemplateBatchFiles/TemplateModels/MG94wEX.mdl
new file mode 100644
index 0000000..39d5b3d
--- /dev/null
+++ b/res/TemplateBatchFiles/TemplateModels/MG94wEX.mdl
@@ -0,0 +1,238 @@
+/* This file defines the transition matrix for the Muse-Gaut 94 model x an acceptance function
+   
+   05/09/2005  by Sergei L. Kosakovsky Pond
+*/
+
+ModelMatrixDimension = 0;
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function PopulateModelMatrix (ModelMatrixName&, EFV)
+{
+	global exMean = 1;
+	
+	if (!ModelMatrixDimension)
+	{
+		ModelMatrixDimension = 64;
+		for (h = 0 ;h<64; h=h+1)
+		{
+			if (_Genetic_Code[h]==10)
+			{
+				ModelMatrixDimension = ModelMatrixDimension-1;
+			}
+		}
+	}
+	
+	ModelMatrixName = {ModelMatrixDimension,ModelMatrixDimension}; 
+
+	hshift = 0;
+	
+	modelDefString = "";
+	modelDefString*16384;
+	
+	if (modelType > 0)
+	{
+		catCounterAL = {};
+	}
+	
+	for (h=0; h<64; h=h+1)
+	{
+		if (_Genetic_Code[h]==10) 
+		{
+			hshift = hshift+1;
+			continue; 
+		}
+		vshift = hshift;
+		for (v = h+1; v<64; v=v+1)
+		{
+			diff = v-h;
+			if (_Genetic_Code[v]==10) 
+			{
+				vshift = vshift+1;
+				continue; 
+			}
+			nucPosInCodon = 2;
+			if ((h$4==v$4)||((diff%4==0)&&(h$16==v$16))||(diff%16==0))
+			{
+				if (h$4==v$4)
+				{
+					transition = v%4;
+					transition2= h%4;
+				}
+				else
+				{
+					if(diff%16==0)
+					{
+						transition = v$16;
+						transition2= h$16;
+						nucPosInCodon = 0;
+					}
+					else
+					{
+						transition = v%16$4;
+						transition2= h%16$4;
+						nucPosInCodon = 1;
+					}
+				}
+				hs = Format(h-hshift,0,0);
+				vs = Format(v-vshift,0,0);
+				ts = Format(transition,0,0);
+				ts2= Format(transition2,0,0);
+				ps = Format(nucPosInCodon,0,0);
+				aa1 = _Genetic_Code[0][h];
+				aa2 = _Genetic_Code[0][v];
+				if (aa1==aa2) 
+				{
+					modelDefString*("ModelMatrixName["+hs+"]["+vs+"] := "+_nucBiasTerms[transition][transition2]+"synRate*EFV__["+ts+"]["+ps+"];\n"+
+													 "ModelMatrixName["+vs+"]["+hs+"] := "+_nucBiasTerms[transition][transition2]+"synRate*EFV__["+ts2+"]["+ps+"];\n");
+				}
+				else
+				{
+					bt = aaRateMultipliers[aa1][aa2];
+					if (modelType > 0)
+					{
+						modelDefString*("ModelMatrixName["+hs+"]["+vs+"] := "+_nucBiasTerms[transition][transition2]+"synRate*"+bt+"^(exMean*c)*EFV__["+ts+"]["+ps+"];\n"+
+														 "ModelMatrixName["+vs+"]["+hs+"] := "+_nucBiasTerms[transition][transition2]+"synRate*"+bt+"^(exMean*c)*EFV__["+ts2+"]["+ps+"];\n");	
+					}
+					else
+					{
+						bt = aaRateMultipliers[aa1][aa2];
+						modelDefString*("ModelMatrixName["+hs+"]["+vs+"] := "+_nucBiasTerms[transition][transition2]+"synRate*"+bt+"^exMean*EFV__["+ts+"]["+ps+"];\n"+
+														 "ModelMatrixName["+vs+"]["+hs+"] := "+_nucBiasTerms[transition][transition2]+"synRate*"+bt+"^exMean*EFV__["+ts2+"]["+ps+"];\n");						
+					}			
+				}
+			}
+	    }
+    }		
+	modelDefString*0;
+	ExecuteCommands (modelDefString);
+	return 0;
+}
+
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function BuildCodonFrequencies (obsF)
+{
+	PIStop = 1.0;
+	result = {ModelMatrixDimension,1};
+	hshift = 0;
+
+	for (h=0; h<64; h=h+1)
+	{
+		first = h$16;
+		second = h%16$4;
+		third = h%4;
+		if (_Genetic_Code[h]==10) 
+		{
+			hshift = hshift+1;
+			PIStop = PIStop-obsF[first][0]*obsF[second][1]*obsF[third][2];
+			continue; 
+		}
+		result[h-hshift][0]=obsF[first][0]*obsF[second][1]*obsF[third][2];
+	}
+	return result*(1.0/PIStop);
+}
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+categoriesUsed = 0;
+
+#include "MGwEX.ibf";
+#include "modelParameters2.mdl";
+
+global AC = 1;
+global AT = 1;
+global CG = 1;
+global CT = 1;
+global GT = 1;
+
+sharedFlag = 1;
+if (modelType >0)
+{
+	if (modelType == 1)
+	{
+		categoriesUsed = 1;
+		#include "defineGamma.mdl";
+	}
+	if (modelType == 2)
+	{
+		categoriesUsed = 1;
+		#include "defineHM.mdl";
+	}
+}
+
+MGCustomRateBiasTerms = {{"AC*","","AT*","CG*","CT*","GT*"}};	
+
+done = 0;
+while (!done)
+{
+	fprintf (stdout,"\nPlease enter a 6 character model designation (e.g:010010 defines HKY85):");
+	fscanf  (stdin,"String", modelDesc);
+	if (Abs(modelDesc)==6)
+	{	
+		done = 1;
+	}
+}			
+
+		
+paramCount	  = 0;
+_nucBiasTerms = {4,4};
+_nucBiasTerms[0][0] = "";
+
+
+if (modelDesc[0]==modelDesc[1])
+{
+	MGCustomRateBiasTerms[0] = MGCustomRateBiasTerms[1];
+}
+
+_nucBiasTerms[1][0] = MGCustomRateBiasTerms[0];
+_nucBiasTerms[0][1] = MGCustomRateBiasTerms[0];
+_nucBiasTerms[2][0] = MGCustomRateBiasTerms[1];
+_nucBiasTerms[0][2] = MGCustomRateBiasTerms[1];
+
+h = 0;
+v = 3;
+
+for (customLoopCounter2=2; customLoopCounter2<6; customLoopCounter2=customLoopCounter2+1)
+{
+	for (customLoopCounter=0; customLoopCounter<customLoopCounter2; customLoopCounter=customLoopCounter+1)
+	{
+		if (modelDesc[customLoopCounter]==modelDesc[customLoopCounter2])
+		{
+			_nucBiasTerms[h][v] = MGCustomRateBiasTerms[customLoopCounter];
+			_nucBiasTerms[v][h] = MGCustomRateBiasTerms[customLoopCounter];
+			break;
+		}
+	}
+	if (customLoopCounter == customLoopCounter2)
+	{
+		_nucBiasTerms[h][v] = MGCustomRateBiasTerms[customLoopCounter2];
+		_nucBiasTerms[v][h] = MGCustomRateBiasTerms[customLoopCounter2];
+	}
+	
+	v = v+1;
+	if (v==4)
+	{
+		h=h+1;
+		v=h+1;
+	}
+}
+
+
+HarvestFrequencies (observedFreq,filteredData,3,1,1);
+
+
+NICETY_LEVEL = 3;
+
+MG94custom = 0;
+
+MULTIPLY_BY_FREQS = PopulateModelMatrix ("MG94custom", observedFreq);
+
+FREQUENCY_SENSITIVE = 1;
+
+vectorOfFrequencies = BuildCodonFrequencies (observedFreq);
+
+Model MG94customModel = (MG94custom,vectorOfFrequencies,0);
+
+USE_POSITION_SPECIFIC_FREQS = 1;
diff --git a/res/TemplateBatchFiles/TemplateModels/MG94with9freqs.mdl b/res/TemplateBatchFiles/TemplateModels/MG94with9freqs.mdl
new file mode 100644
index 0000000..836e1dc
--- /dev/null
+++ b/res/TemplateBatchFiles/TemplateModels/MG94with9freqs.mdl
@@ -0,0 +1,287 @@
+/* This file defines the transition matrix for the Muse-Gaut 94 model.
+   The file should be used as follows:
+   
+   1) Read Data File and create datafilter filteredData
+   2) #include this file (or use SelectTemplateModel(filteredData);)
+   3) Define the tree
+   4) Proceed with the likelihood function using 'vectorOfFrequencies' as the vector to pass to the constructor.
+   
+   This model has the following signature:
+   	#Short:MG94#
+   	#Desc:Muse-Gaut 94 codon model with nucleotide equilibrium frequencies varying based on their position in the codon (6 extra parameters). Local or global parameters. Possible Gamma Variation.#
+   	#Dimension:*#
+    #DataType:codon#
+   	#FileName:MG94.mdl#
+   
+   08/18/1999  by Sergei L. Kosakovsky Pond
+*/
+
+ModelMatrixDimension = 0;
+
+function BuildCodonFrequencies (obsF)
+{
+	PIStop = 1.0;
+	result = {ModelMatrixDimension,1};
+	hshift = 0;
+
+	for (h=0; h<64; h=h+1)
+	{
+		first = h$16;
+		second = h%16$4;
+		third = h%4;
+		if (_Genetic_Code[h]==10) 
+		{
+			hshift = hshift+1;
+			PIStop = PIStop-obsF[first][0]*obsF[second][1]*obsF[third][2];
+			continue; 
+		}
+		result[h-hshift][0]=obsF[first][0]*obsF[second][1]*obsF[third][2];
+	}
+	return result*(1.0/PIStop);
+}
+
+
+#include "modelParameters.mdl";
+
+HarvestFrequencies (observedFreq,filteredData,3,1,1);
+
+NICETY_LEVEL = 3;
+
+if (modelType>0)
+{
+	global R = 1;
+	if (modelType == 2)
+	{
+		#include "defineGamma.mdl";
+	}
+	if (modelType == 3)
+	{
+		#include "defineHM.mdl";
+	}
+}
+
+
+/* defines a sparse transition probabilities matrix 
+ now we'll go through the matrix and assign the elements based on syn/non-syn status*/
+
+function PopulateModelMatrix (ModelMatrixName&, EFV)
+{
+	if (!ModelMatrixDimension)
+	{
+		ModelMatrixDimension = 64;
+		for (h = 0 ;h<64; h=h+1)
+		{
+			if (_Genetic_Code[h]==10)
+			{
+				ModelMatrixDimension = ModelMatrixDimension-1;
+			}
+		}
+	}
+	ModelMatrixName = {ModelMatrixDimension,ModelMatrixDimension}; 
+
+	hshift = 0;
+
+	if (modelType == 0)
+	{
+		for (h=0; h<64; h=h+1)
+		{
+			if (_Genetic_Code[h]==10) 
+			{
+				hshift = hshift+1;
+				continue; 
+			}
+			vshift = hshift;
+			for (v = h+1; v<64; v=v+1)
+			{
+				diff = v-h;
+				if (_Genetic_Code[v]==10) 
+				{
+					vshift = vshift+1;
+					continue; 
+				}
+				nucPosInCodon = 2;
+			  	if ((h$4==v$4)||((diff%4==0)&&(h$16==v$16))||(diff%16==0))
+			  	{
+			  		if (h$4==v$4)
+			  		{
+			  			transition = v%4;
+			  			transition2= h%4;
+			  		}
+			  		else
+			  		{
+			  			if(diff%16==0)
+			  			{
+			  				transition = v$16;
+			  				transition2= h$16;
+							nucPosInCodon = 0;
+			  			}
+			  			else
+			  			{
+			  				transition = v%16$4;
+			  				transition2= h%16$4;
+							nucPosInCodon = 1;
+			  			}
+			  		}
+			  		if (_Genetic_Code[0][h]==_Genetic_Code[0][v]) 
+			  		{
+			  			ModelMatrixName[h-hshift][v-vshift] := synRate*EFV__[transition__][nucPosInCodon__];
+			  			ModelMatrixName[v-vshift][h-hshift] := synRate*EFV__[transition2__][nucPosInCodon__];
+				  	}
+			  		else
+			  		{
+				  		ModelMatrixName[h-hshift][v-vshift] := nonSynRate*EFV__[transition__][nucPosInCodon__];
+			  			ModelMatrixName[v-vshift][h-hshift] := nonSynRate*EFV__[transition2__][nucPosInCodon__];
+		  			}
+			  	}
+			  }
+		}
+	}
+	else
+	{
+		if (modelType == 1)
+		{
+			for (h=0; h<64; h=h+1)
+				{
+					if (_Genetic_Code[h]==10) 
+					{
+						hshift = hshift+1;
+						continue; 
+					}
+					vshift = hshift;
+					for (v = h+1; v<64; v=v+1)
+					{
+						diff = v-h;
+						if (_Genetic_Code[v]==10) 
+						{
+							vshift = vshift+1;
+							continue; 
+						}
+						nucPosInCodon = 2;
+					  	if ((h$4==v$4)||((diff%4==0)&&(h$16==v$16))||(diff%16==0))
+					  	{
+					  		if (h$4==v$4)
+					  		{
+					  			transition = v%4;
+					  			transition2= h%4;
+					  		}
+					  		else
+					  		{
+					  			if(diff%16==0)
+					  			{
+					  				transition = v$16;
+					  				transition2= h$16;
+									nucPosInCodon = 0;
+					  			}
+					  			else
+					  			{
+					  				transition = v%16$4;
+					  				transition2= h%16$4;
+									nucPosInCodon = 1;
+					  			}
+					  		}
+					  		if (_Genetic_Code[0][h]==_Genetic_Code[0][v]) 
+					  		{
+					  			ModelMatrixName[h-hshift][v-vshift] := synRate*EFV__[transition__][nucPosInCodon__];
+					  			ModelMatrixName[v-vshift][h-hshift] := synRate*EFV__[transition2__][nucPosInCodon__];
+						  	}
+					  		else
+					  		{
+						  		ModelMatrixName[h-hshift][v-vshift] := R*synRate*EFV__[transition__][nucPosInCodon__];
+					  			ModelMatrixName[v-vshift][h-hshift] := R*synRate*EFV__[transition2__][nucPosInCodon__];
+				  			}
+					  	}
+					  }
+				}	
+		}
+		else
+		{
+			for (h=0; h<64; h=h+1)
+				{
+					if (_Genetic_Code[h]==10) 
+					{
+						hshift = hshift+1;
+						continue; 
+					}
+					vshift = hshift;
+					for (v = h+1; v<64; v=v+1)
+					{
+						diff = v-h;
+						if (_Genetic_Code[v]==10) 
+						{
+							vshift = vshift+1;
+							continue; 
+						}
+					nucPosInCodon = 2;
+				  	if ((h$4==v$4)||((diff%4==0)&&(h$16==v$16))||(diff%16==0))
+					  	{
+					  		if (h$4==v$4)
+					  		{
+					  			transition = v%4;
+					  			transition2= h%4;
+					  		}
+					  		else
+					  		{
+					  			if(diff%16==0)
+					  			{
+									nucPosInCodon = 0;
+					  				transition = v$16;
+					  				transition2= h$16;
+					  			}
+					  			else
+					  			{
+									nucPosInCodon = 1;
+					  				transition = v%16$4;
+					  				transition2= h%16$4;
+					  			}
+					  		}
+					  		if (_Genetic_Code[0][h]==_Genetic_Code[0][v]) 
+					  		{
+					  			ModelMatrixName[h-hshift][v-vshift] := synRate*c*EFV__[transition__][nucPosInCodon__];
+					  			ModelMatrixName[v-vshift][h-hshift] := synRate*c*EFV__[transition2__][nucPosInCodon__];
+						  	}
+					  		else
+					  		{
+						  		ModelMatrixName[h-hshift][v-vshift] := R*synRate*c*EFV__[transition__][nucPosInCodon__];
+					  			ModelMatrixName[v-vshift][h-hshift] := R*synRate*c*EFV__[transition2__][nucPosInCodon__];
+				  			}
+					  	}
+					  }
+				}		
+		}
+	}
+	
+	return 0;
+}
+
+MG94 = 0;
+
+MULTIPLY_BY_FREQS = PopulateModelMatrix ("MG94", observedFreq);
+
+FREQUENCY_SENSITIVE = 1;
+
+vectorOfFrequencies = BuildCodonFrequencies (observedFreq);
+
+Model MG94model = (MG94,vectorOfFrequencies,0);
+
+USE_POSITION_SPECIFIC_FREQS = 1;
+
+if (modelType == 0)
+{
+	IS_DNDS_AVAILABLE = 1;
+}
+
+function GetBranchDNDS (shortName)
+{
+	sR  = "givenTree."+shortName+".synRate";
+	nsR = "givenTree."+shortName+".nonSynRate";
+	sR = valueGrab (sR);
+	nsR = valueGrab (nsR);
+	if (sR > 0.0)
+	{
+		return nsR/sR;
+	}
+	else
+	{
+		return "Infinite";
+	}
+}
diff --git a/res/TemplateBatchFiles/TemplateModels/MG94x2.mdl b/res/TemplateBatchFiles/TemplateModels/MG94x2.mdl
new file mode 100644
index 0000000..15caeeb
--- /dev/null
+++ b/res/TemplateBatchFiles/TemplateModels/MG94x2.mdl
@@ -0,0 +1,396 @@
+/* This file defines the transition matrix for the Muse-Gaut 94 model x an arbitrary 4x4 rate matrix
+   for nucleotide substituions.
+   
+   The file should be used as follows:
+   
+   1) Read Data File and create datafilter filteredData
+   2) #include this file (or use SelectTemplateModel(filteredData);)
+   3) Define the tree
+   4) Proceed with the likelihood function using 'vectorOfFrequencies' as the vector to pass to the constructor.
+   
+   This model has the following signature:
+   	#Short:MG94custom#
+   	#Desc:Muse-Gaut 94 x an arbitrary 4x4 rate matrix and 9 (3x4) frequency parameters. Possible Gamma Variation.#
+   	#Dimension:*#
+    #DataType:codon#
+   	#FileName:MG94custom.mdl#
+   
+   04/18/2002  by Sergei L. Kosakovsky Pond
+*/
+
+ModelMatrixDimension = 0;
+
+global		R;
+global     AC;
+global 	   AT;
+global     CG;
+global	   CT;
+global     GT;
+
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function PopulateModelMatrix (ModelMatrixName&, EFV)
+{
+	if (!ModelMatrixDimension)
+	{
+		ModelMatrixDimension = 64;
+		for (h = 0 ;h<64; h=h+1)
+		{
+			if (_Genetic_Code[h]==10)
+			{
+				ModelMatrixDimension = ModelMatrixDimension-1;
+			}
+		}
+	}
+	
+	R  = R;
+	AT = AT;
+	CG = CG;
+	CT = CT;
+	GT = GT;
+	AC = AC;
+
+	ModelMatrixName = {ModelMatrixDimension,ModelMatrixDimension}; 
+	ExecuteCommands (categDef1);
+	ExecuteCommands (categDef2);
+ 	
+ 	hshift = 0;
+ 	
+	for (h=0; h<64; h=h+1)
+	{
+		if (_Genetic_Code[h]==10) 
+		{
+			hshift = hshift+1;
+			continue; 
+		}
+		vshift = hshift;
+		for (v = h+1; v<64; v=v+1)
+		{
+			diff = v-h;
+			if (_Genetic_Code[v]==10) 
+			{
+				vshift = vshift+1;
+				continue; 
+			}
+			nucPosInCodon = 2;
+			if ((h$4==v$4)||((diff%4==0)&&(h$16==v$16))||(diff%16==0))
+			{
+				if (h$4==v$4)
+				{
+					transition = v%4;
+					transition2= h%4;
+				}
+				else
+				{
+					if(diff%16==0)
+					{
+						transition = v$16;
+						transition2= h$16;
+						nucPosInCodon = 0;
+					}
+					else
+					{
+						transition = v%16$4;
+						transition2= h%16$4;
+						nucPosInCodon = 1;
+					}
+				}
+				
+				if (transition<transition2)
+				{
+					trSM = transition;
+					trLG = transition2;
+				}
+				else
+				{
+					trSM = transition2;
+					trLG = transition;
+				}
+				
+				if (trSM==0)
+				{
+					if (trLG==1)
+					{
+						if (_Genetic_Code[0][h]==_Genetic_Code[0][v]) 
+						{
+							ModelMatrixName[h-hshift][v-vshift] := AC*c*synRate*EFV__[transition__][nucPosInCodon__];
+							ModelMatrixName[v-vshift][h-hshift] := AC*c*synRate*EFV__[transition2__][nucPosInCodon__];
+						}
+						else
+						{
+				  			if (modelType!=4)
+				  			{
+					  			ModelMatrixName[h-hshift][v-vshift] := AC*R*synRate*d*EFV__[transition__][nucPosInCodon__];
+				  				ModelMatrixName[v-vshift][h-hshift] := AC*R*synRate*d*EFV__[transition2__][nucPosInCodon__];
+				  			}
+				  			else
+				  			{
+							  	ModelMatrixName[h-hshift][v-vshift] := AC*r*synRate*d*EFV__[transition__][nucPosInCodon__];
+					  			ModelMatrixName[v-vshift][h-hshift] := AC*r*synRate*d*EFV__[transition2__][nucPosInCodon__];
+				  			}
+						}
+					}
+					else
+					{
+						if (trLG==2)
+						{
+							if (_Genetic_Code[0][h]==_Genetic_Code[0][v]) 
+							{
+								ModelMatrixName[h-hshift][v-vshift] := c*synRate*EFV__[transition__][nucPosInCodon__];
+								ModelMatrixName[v-vshift][h-hshift] := c*synRate*EFV__[transition2__][nucPosInCodon__];
+							}
+							else
+							{
+					  			if (modelType!=4)
+					  			{
+						  			ModelMatrixName[h-hshift][v-vshift] := R*synRate*d*EFV__[transition__][nucPosInCodon__];
+					  				ModelMatrixName[v-vshift][h-hshift] := R*synRate*d*EFV__[transition2__][nucPosInCodon__];
+					  			}
+					  			else
+					  			{
+								  	ModelMatrixName[h-hshift][v-vshift] := r*synRate*d*EFV__[transition__][nucPosInCodon__];
+						  			ModelMatrixName[v-vshift][h-hshift] := r*synRate*d*EFV__[transition2__][nucPosInCodon__];
+					  			}
+							}							
+						}
+						else
+						{
+							if (_Genetic_Code[0][h]==_Genetic_Code[0][v]) 
+							{
+								ModelMatrixName[h-hshift][v-vshift] := AT*c*synRate*EFV__[transition__][nucPosInCodon__];
+								ModelMatrixName[v-vshift][h-hshift] := AT*c*synRate*EFV__[transition2__][nucPosInCodon__];
+							}
+							else
+							{
+					  			if (modelType!=4)
+					  			{
+						  			ModelMatrixName[h-hshift][v-vshift] := AT*R*synRate*d*EFV__[transition__][nucPosInCodon__];
+					  				ModelMatrixName[v-vshift][h-hshift] := AT*R*synRate*d*EFV__[transition2__][nucPosInCodon__];
+					  			}
+					  			else
+					  			{
+								  	ModelMatrixName[h-hshift][v-vshift] := AT*r*synRate*d*EFV__[transition__][nucPosInCodon__];
+						  			ModelMatrixName[v-vshift][h-hshift] := AT*r*synRate*d*EFV__[transition2__][nucPosInCodon__];
+					  			}
+							}							
+						}
+					}
+				}
+				else
+				{
+					if (trSM==1)
+					{
+						if (trLG==2)
+						{
+							if (_Genetic_Code[0][h]==_Genetic_Code[0][v]) 
+							{
+								ModelMatrixName[h-hshift][v-vshift] := CG*c*synRate*EFV__[transition__][nucPosInCodon__];
+								ModelMatrixName[v-vshift][h-hshift] := CG*c*synRate*EFV__[transition2__][nucPosInCodon__];
+							}
+							else
+							{
+					  			if (modelType!=4)
+					  			{
+						  			ModelMatrixName[h-hshift][v-vshift] := CG*R*synRate*d*EFV__[transition__][nucPosInCodon__];
+					  				ModelMatrixName[v-vshift][h-hshift] := CG*R*synRate*d*EFV__[transition2__][nucPosInCodon__];
+					  			}
+					  			else
+					  			{
+								  	ModelMatrixName[h-hshift][v-vshift] := CG*r*synRate*d*EFV__[transition__][nucPosInCodon__];
+						  			ModelMatrixName[v-vshift][h-hshift] := CG*r*synRate*d*EFV__[transition2__][nucPosInCodon__];
+					  			}
+							}
+						}
+						else
+						{
+							if (_Genetic_Code[0][h]==_Genetic_Code[0][v]) 
+							{
+								ModelMatrixName[h-hshift][v-vshift] := CT*c*synRate*EFV__[transition__][nucPosInCodon__];
+								ModelMatrixName[v-vshift][h-hshift] := CT*c*synRate*EFV__[transition2__][nucPosInCodon__];
+							}
+							else
+							{
+					  			if (modelType!=4)
+					  			{
+						  			ModelMatrixName[h-hshift][v-vshift] := CT*R*synRate*d*EFV__[transition__][nucPosInCodon__];
+					  				ModelMatrixName[v-vshift][h-hshift] := CT*R*synRate*d*EFV__[transition2__][nucPosInCodon__];
+					  			}
+					  			else
+					  			{
+								  	ModelMatrixName[h-hshift][v-vshift] := CT*r*synRate*d*EFV__[transition__][nucPosInCodon__];
+						  			ModelMatrixName[v-vshift][h-hshift] := CT*r*synRate*d*EFV__[transition2__][nucPosInCodon__];
+					  			}
+							}							
+						}
+					}
+					else
+					{
+						if (_Genetic_Code[0][h]==_Genetic_Code[0][v]) 
+						{
+							ModelMatrixName[h-hshift][v-vshift] := GT*c*synRate*EFV__[transition__][nucPosInCodon__];
+							ModelMatrixName[v-vshift][h-hshift] := GT*c*synRate*EFV__[transition2__][nucPosInCodon__];
+						}
+						else
+						{
+				  			if (modelType!=4)
+				  			{
+					  			ModelMatrixName[h-hshift][v-vshift] := GT*R*synRate*d*EFV__[transition__][nucPosInCodon__];
+				  				ModelMatrixName[v-vshift][h-hshift] := GT*R*synRate*d*EFV__[transition2__][nucPosInCodon__];
+				  			}
+				  			else
+				  			{
+							  	ModelMatrixName[h-hshift][v-vshift] := GT*r*synRate*d*EFV__[transition__][nucPosInCodon__];
+					  			ModelMatrixName[v-vshift][h-hshift] := GT*r*synRate*d*EFV__[transition2__][nucPosInCodon__];
+				  			}
+						}							
+					}
+				}
+			}
+	   }
+	}
+
+	if (Abs(MGCustomModelConstraintString))
+	{
+		ExecuteCommands (MGCustomModelConstraintString);
+	}
+	return 0;
+}
+
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function BuildCodonFrequencies (obsF)
+{
+	PIStop = 1.0;
+	result = {ModelMatrixDimension,1};
+	hshift = 0;
+
+	for (h=0; h<64; h=h+1)
+	{
+		first = h$16;
+		second = h%16$4;
+		third = h%4;
+		if (_Genetic_Code[h]==10) 
+		{
+			hshift = hshift+1;
+			PIStop = PIStop-obsF[first][0]*obsF[second][1]*obsF[third][2];
+			continue; 
+		}
+		result[h-hshift][0]=obsF[first][0]*obsF[second][1]*obsF[third][2];
+	}
+	return result*(1.0/PIStop);
+}
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+categoriesUsed = 2;
+sharedFlag 	   = 1;
+
+
+
+if (!SKIP_MODEL_PARAMETER_LIST)
+{
+	ChoiceList (modelChoice, "Distribution Option",1,SKIP_NONE,
+				"Syn:Gamma, Non-syn:Gamma",	 "Both syn and non-syn rates are drawn from the gamma distributions for all models.",
+				"Syn:Gamma, Non-syn:Inv+Gamma","Syn and non-syn rates are drawn from the gamma distributions for all models for PVRM and NSRV. For DVRM and LDVRM, syn rates are drawn from the gamma distribution, and non-syn rates - from Inv+Gamma.",
+				"Independent Discrete", "Independent General Discrete Distributions (Recommended setting)",
+				"Correlated Discrete", "Correlated General Discrete Distributions");
+				
+				
+	if (modelChoice < 0)
+	{
+		return;
+	}
+
+	resp  = 0;
+	resp2 = 0;
+
+	while (resp<2)
+	{
+		fprintf (stdout,"\nNumber of synonymous rate classes (>=2):");
+		fscanf  (stdin, "Number", resp);
+	}
+
+	while (resp2<2)
+	{
+		fprintf (stdout,"\nNumber of non-synonymous rate classes (>=2):");
+		fscanf  (stdin, "Number", resp2);
+	}
+
+	if (modelChoice<2)
+	{
+		fscanf ("../2RatesAnalyses/gamma1.def","Raw",categDef1);
+
+		if (modelChoice == 0)
+		{
+			fscanf ("../2RatesAnalyses/gamma2.def","Raw",categDef2);
+		}
+		else
+		{
+			fscanf ("../2RatesAnalyses/gamma2+Inv.def","Raw",categDef2);
+		}
+	}
+	else
+	{
+		correlationOn = (modelChoice>3);
+		fscanf ("2RatesAnalyses/discreteGenerator.bf","Raw",mi);
+		ExecuteCommands (mi);
+	}
+
+	done = 0;
+	while (!done)
+	{
+		fprintf (stdout,"\nPlease enter a 6 character model designation (e.g:010010 defines HKY85):");
+		fscanf  (stdin,"String", modelDesc);
+		if (Abs(modelDesc)==6)
+		{	
+			done = 1;
+		}
+	}	
+}		
+			
+MGCustomRateBiasTerms = {{"AC","1","AT","CG","CT","GT"}};
+paramCount	  = 0;
+
+MGCustomModelConstraintString = "";
+
+for (customLoopCounter2=1; customLoopCounter2<6; customLoopCounter2=customLoopCounter2+1)
+{
+	for (customLoopCounter=0; customLoopCounter<customLoopCounter2; customLoopCounter=customLoopCounter+1)
+	{
+		if (modelDesc[customLoopCounter2]==modelDesc[customLoopCounter])
+		{
+			if (MGCustomRateBiasTerms[customLoopCounter2] == "1")
+			{
+				MGCustomModelConstraintString = MGCustomModelConstraintString + MGCustomRateBiasTerms[customLoopCounter]+":="+MGCustomRateBiasTerms[customLoopCounter2]+";";
+			}
+			else
+			{
+				MGCustomModelConstraintString = MGCustomModelConstraintString + MGCustomRateBiasTerms[customLoopCounter2]+":="+MGCustomRateBiasTerms[customLoopCounter]+";";			
+			}
+			break;
+		}
+	}
+}				
+
+if (!SKIP_HARVEST_FREQ)
+{
+	HarvestFrequencies (observedFreq,filteredData,3,1,1);
+}
+
+NICETY_LEVEL = 3;
+
+MG94custom = 0;
+
+MULTIPLY_BY_FREQS = PopulateModelMatrix ("MG94custom", observedFreq);
+
+FREQUENCY_SENSITIVE = 1;
+
+vectorOfFrequencies = BuildCodonFrequencies (observedFreq);
+
+Model MG94customModel = (MG94custom,vectorOfFrequencies,0);
+
+USE_POSITION_SPECIFIC_FREQS = 1;
+
+_rateDescriptors = {{"Synonymous rates","Non-synonymous rates"}};
diff --git a/res/TemplateBatchFiles/TemplateModels/MGFreqsEstimator.ibf b/res/TemplateBatchFiles/TemplateModels/MGFreqsEstimator.ibf
new file mode 100644
index 0000000..d17ccd3
--- /dev/null
+++ b/res/TemplateBatchFiles/TemplateModels/MGFreqsEstimator.ibf
@@ -0,0 +1,66 @@
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function BuildCodonFrequencies (obsF, freqMx&)
+{
+	result = {ModelMatrixDimension,1};
+	hshift = 0;
+	normString = "1";
+
+	for (h=0; h<64; h=h+1)
+	{
+		first = h$16;
+		second = h%16$4;
+		third = h%4;
+		if (_Genetic_Code[h]==10) 
+		{
+			hshift = hshift+1;
+			normString = normString + "-" + obsF[first][0] + "*" + obsF[second][1]+ "*" +obsF[third][2];
+			continue; 
+		}
+		result[h-hshift]=obsF[first][0] + "*" + obsF[second][1]+ "*" +obsF[third][2];
+	}
+	
+	freqMx = {ModelMatrixDimension,1};
+	
+	hshift = 0;
+	for (h=0; h<64; h=h+1)
+	{
+		first = h$16;
+		second = h%16$4;
+		third = h%4;
+		if (_Genetic_Code[h]==10) 
+		{
+			hshift = hshift+1;
+		}
+		else
+		{
+			ExecuteCommands ("freqMx[h-hshift]:="+result[h-hshift]+"/("+normString+")");
+		}
+	}
+	return 0;
+}
+
+global A1:<1;
+global A2:<1;
+global A3:<1;
+global C1:<1;
+global C2:<1;
+global C3:<1;
+global G1:<1;
+global G2:<1;
+global G3:<1;
+A1 = observedFreq[0][0];
+A2 = observedFreq[0][1];
+A3 = observedFreq[0][2];
+C1 = observedFreq[1][0]/(1-A1);
+C2 = observedFreq[1][1]/(1-A2);
+C3 = observedFreq[1][2]/(1-A3);
+G1 = observedFreq[2][0]/(1-A1)/(1-C1);
+G2 = observedFreq[2][1]/(1-A2)/(1-C2);
+G3 = observedFreq[2][2]/(1-A3)/(1-C3);
+
+paramFreqs = {{"A1","A2","A3"}
+		     {"(1-A1)*C1","(1-A2)*C2","(1-A3)*C3"}
+		     {"(1-A1)*(1-C1)*G1","(1-A2)*(1-C2)*G2","(1-A3)*(1-C3)*G3"}
+		     {"(1-A1)*(1-C1)*(1-G1)","(1-A2)*(1-C2)*(1-G2)","(1-A3)*(1-C3)*(1-G3)"}};
diff --git a/res/TemplateBatchFiles/TemplateModels/MGwAA.ibf b/res/TemplateBatchFiles/TemplateModels/MGwAA.ibf
new file mode 100644
index 0000000..d1387c5
--- /dev/null
+++ b/res/TemplateBatchFiles/TemplateModels/MGwAA.ibf
@@ -0,0 +1,126 @@
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+
+/* ADD NEW RATE CLASS MATRICES HERE */
+AminoAcidClasses = {{"Default","Single non-synonymous rate class. All changes are equivalent"}
+					 {"PCH","PCH Model, based on polarity/charge/hydrophobicity"}
+				     {"S4","S4 Model, based on classification according to size"}
+				     {"190","Separate rate for every non-syn substitution"}
+				     {"Custom","Load a amino-acid profile from a file"}
+				     {"Numeric","Load a numeric amino-acid profile from a file"}
+				     {"Numeric+Correction","Load a numeric amino-acid profile from a file and add an overall scale correction"}
+				     };	
+				    
+/* END ADD NEW RATE CLASS MATRICES HERE */			    
+
+ChoiceList	(aaModelType,"Amino Acid Class Model",1,SKIP_NONE,AminoAcidClasses);
+
+if (aaModelType < 0)
+{
+	return 0;
+}
+
+_AA_RM_NUMERIC = 0;
+
+if (aaModelType >= Rows(AminoAcidClasses)-2)
+{
+	_AA_RM_NUMERIC = aaModelType - Rows(AminoAcidClasses) + 3;
+}
+
+allowedAACharacters = "FLIMVSPTAYHQNKDECWRG";
+if (aaModelType >= Rows(AminoAcidClasses)-3)
+{
+	SetDialogPrompt ("Locate an amino-acid profile matrix file:");
+	fscanf (PROMPT_FOR_FILE,REWIND,"String,Matrix",mapString,aaRateMatrix);
+	W_MATRIX_FILE = LAST_FILE_PATH;
+}
+else
+{
+	W_MATRIX_FILE = HYPHY_LIB_DIRECTORY+"TemplateBatchFiles"+DIRECTORY_SEPARATOR+"TemplateModels"+DIRECTORY_SEPARATOR+SELECTION_STRINGS;
+	fscanf (W_MATRIX_FILE,REWIND,"String,Matrix",mapString,aaRateMatrix);
+}
+
+
+if (Abs(mapString) == 20 && Rows(aaRateMatrix) == 20 && Columns(aaRateMatrix) == 20)
+{
+	/* check to see that all characters have been mapped */
+	checkAAMap   = {}; /* associative array */
+	for (aaIndex = 0; aaIndex < 20; aaIndex = aaIndex+1)
+	{
+		aChar = allowedAACharacters[aaIndex];
+		checkAAMap[aChar] = aaIndex+1;
+	
+	}
+
+	AAMap = {};
+	for (aaIndex = 0; aaIndex < 20; aaIndex = aaIndex+1)
+	{
+		aChar = mapString[aaIndex];
+		daIndex = checkAAMap[aChar];
+		if (daIndex==0)
+		{
+			fprintf (stdout, "\nAmino-acid ordering provided in the file is invalid - could be duplicate or missing characters\n");
+			return 0;
+		}
+		else
+		{
+			if (daIndex>10)
+			{
+				AAMap[aaIndex] = daIndex;
+			}
+			else
+			{
+				AAMap[aaIndex] = daIndex-1;			
+			}
+			checkAAMap[aChar] = 0;
+		}
+	}
+	
+	/*symmetrize the matrix*/
+	
+	for (aaIndex = 0; aaIndex < 19; aaIndex = aaIndex+1)
+	{
+		for (aaIndex2 = aaIndex+1; aaIndex2 < 20; aaIndex2 = aaIndex2+1)
+		{
+			aaRateMatrix[aaIndex2][aaIndex] = aaRateMatrix[aaIndex][aaIndex2];
+		}
+	}
+	
+	/* reindex the matrix */
+	
+	aaRateMultipliers = {21,21};
+	
+	aaRateClassIDs = {};
+	
+	for (aaIndex = 0; aaIndex < 19; aaIndex = aaIndex+1)
+	{
+		mappedIndex = AAMap[aaIndex];
+		for (aaIndex2 = aaIndex+1; aaIndex2 < 20; aaIndex2 = aaIndex2+1)
+		{
+			mappedIndex2 								 = AAMap[aaIndex2];
+			if (_AA_RM_NUMERIC < 1)
+			{
+				rateLabel 									 = aaRateMatrix[aaIndex][aaIndex2]$1;
+			}
+			else
+			{
+				rateLabel 									 = aaRateMatrix[aaIndex][aaIndex2];	
+			}
+			aaRateMultipliers[mappedIndex][mappedIndex2] = rateLabel;
+			aaRateMultipliers[mappedIndex2][mappedIndex] = rateLabel;
+			
+			if (aaRateClassIDs[rateLabel] == 0)
+			{
+				aaRateClassIDs[rateLabel] = 1;
+			}
+		}
+	}
+	
+	aaRateMatrix = 0;
+	
+}
+else
+{
+	fprintf (stdout, "\nExpected a string of 20 characters followed by a 20x20 matrix\n");
+	return 0;
+}
diff --git a/res/TemplateBatchFiles/TemplateModels/MGwEX.ibf b/res/TemplateBatchFiles/TemplateModels/MGwEX.ibf
new file mode 100644
index 0000000..3f185d9
--- /dev/null
+++ b/res/TemplateBatchFiles/TemplateModels/MGwEX.ibf
@@ -0,0 +1,106 @@
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+
+/* ADD NEW RATE CLASS MATRICES HERE */
+AminoAcidClasses = {{"EX.dat","Stoltzfus and Yampolsky exhangeability acceptance/rejection profile"}
+				     {"Custom","Load a custom profile"}};	
+				    
+/* END ADD NEW RATE CLASS MATRICES HERE */			    
+
+ChoiceList	(aaModelType,"Amino Acid Class Model",1,SKIP_NONE,AminoAcidClasses);
+
+if (aaModelType < 0)
+{
+	return 0;
+}
+
+allowedAACharacters = "FLIMVSPTAYHQNKDECWRG";
+if (aaModelType == Rows(AminoAcidClasses)-1)
+{
+	SetDialogPrompt ("Locate an amino-acid profile matrix file:");
+	fscanf (PROMPT_FOR_FILE,"String,Matrix",mapString,aaRateMatrix);
+	W_MATRIX_FILE = LAST_FILE_PATH;
+}
+else
+{
+	W_MATRIX_FILE = HYPHY_LIB_DIRECTORY+"TemplateBatchFiles"+DIRECTORY_SEPARATOR+"TemplateModels"+DIRECTORY_SEPARATOR+SELECTION_STRINGS;
+	fscanf (W_MATRIX_FILE,"String,NMatrix",mapString,aaRateMatrix);
+}
+
+
+if (Abs(mapString) == 20 && Rows(aaRateMatrix) == 20 && Columns(aaRateMatrix) == 20)
+{
+	/* check to see that all characters have been mapped */
+	checkAAMap   = {}; /* associative array */
+	for (aaIndex = 0; aaIndex < 20; aaIndex = aaIndex+1)
+	{
+		aChar = allowedAACharacters[aaIndex];
+		checkAAMap[aChar] = aaIndex+1;
+	
+	}
+
+	AAMap = {};
+	for (aaIndex = 0; aaIndex < 20; aaIndex = aaIndex+1)
+	{
+		aChar = mapString[aaIndex];
+		daIndex = checkAAMap[aChar];
+		if (daIndex==0)
+		{
+			fprintf (stdout, "\nAmino-acid ordering provided in the file is invalid - could be duplicate or missing characters\n");
+			return 0;
+		}
+		else
+		{
+			if (daIndex>10)
+			{
+				AAMap[aaIndex] = daIndex;
+			}
+			else
+			{
+				AAMap[aaIndex] = daIndex-1;			
+			}
+			checkAAMap[aChar] = 0;
+		}
+	}
+	
+	/*symmetrize the matrix*/
+	
+	for (aaIndex = 0; aaIndex < 19; aaIndex = aaIndex+1)
+	{
+		for (aaIndex2 = aaIndex+1; aaIndex2 < 20; aaIndex2 = aaIndex2+1)
+		{
+			aaRateMatrix[aaIndex2][aaIndex] = aaRateMatrix[aaIndex][aaIndex2];
+		}
+	}
+	
+	/* reindex the matrix */
+	
+	aaRateMultipliers = {21,21};
+	
+	aaRateClassIDs = {};
+	
+	for (aaIndex = 0; aaIndex < 19; aaIndex = aaIndex+1)
+	{
+		mappedIndex = AAMap[aaIndex];
+		for (aaIndex2 = aaIndex+1; aaIndex2 < 20; aaIndex2 = aaIndex2+1)
+		{
+			mappedIndex2 								 = AAMap[aaIndex2];
+			rateLabel 									 = aaRateMatrix[aaIndex][aaIndex2];
+			aaRateMultipliers[mappedIndex][mappedIndex2] = rateLabel;
+			aaRateMultipliers[mappedIndex2][mappedIndex] = rateLabel;
+			
+			if (aaRateClassIDs[rateLabel] == 0)
+			{
+				aaRateClassIDs[rateLabel] = 1;
+			}
+		}
+	}
+	
+	aaRateMatrix = 0;
+	
+}
+else
+{
+	fprintf (stdout, "\nExpected a string of 20 characters followed by a 20x20 matrix\n");
+	return 0;
+}
diff --git a/res/TemplateBatchFiles/TemplateModels/NRM+Freqs.mdl b/res/TemplateBatchFiles/TemplateModels/NRM+Freqs.mdl
new file mode 100644
index 0000000..205999c
--- /dev/null
+++ b/res/TemplateBatchFiles/TemplateModels/NRM+Freqs.mdl
@@ -0,0 +1,70 @@
+/* This file defines the transition matrix for the General Non-Reversible model without expicit frequency parameterization
+   The file should be used as follows:
+      
+   01/04/2006  by Sergei L. Kosakovsky Pond
+*/
+
+
+global AC = 1;
+global AT = 1;
+global CA = 1;
+global CG = 1;
+global CT = 1;
+global GA = 1;
+global GC = 1;
+global GT = 1;
+global TA = 1;
+global TC = 1;
+global TG = 1;
+
+
+function PopulateModelMatrix (ModelMatrixName&)
+{
+	/* All the global rate parameters are defined relative to 
+	the rate for A->G. For instance, CG represents the ratio
+	of the rates C->G/A->G. These parameters are also going
+	to be confounded with character frequency parameters */
+
+
+	ModelMatrixName = 
+			{{*,t*AC,t,t*AT}
+			 {t*CA,*,t*CG,t*CT}
+			 {t*GA,t*GC,*,t*GT}
+			 {t*TA,t*TC,t*TG,*}};
+			 
+	return 0;
+}
+
+NRM = 0;
+MULTIPLY_BY_FREQS = PopulateModelMatrix ("NRM");
+
+dynamicFreqs = {4,1};
+
+vectorOfFrequencies = {4,1};
+vectorOfFrequencies [0] := computeEQF (AC,AT,CG,CT,GT,CA,GA,TA,GC,TC,TG);
+vectorOfFrequencies [1] := dynamicFreqs[1];
+vectorOfFrequencies [2] := dynamicFreqs[2];
+vectorOfFrequencies [3] := dynamicFreqs[3];
+
+
+Model GRMModel = (NRM, vectorOfFrequencies, MULTIPLY_BY_FREQS);
+FREQUENCY_SENSITIVE = 0;
+
+/*--------------------------------------------------------*/
+
+ffunction computeEQF (dummy1,dummy2,dummy3,dummy4,dummy5,dummy6,dummy7,dummy8,dummy9,dummy10,dummy11)
+{
+	t = 1;
+	tempMatrix = NRM;
+	for (k=0; k<4; k=k+1)
+	{
+		tempMatrix[k][3] = 1;
+	}
+	tempMatrix = Inverse(tempMatrix);
+	for (k=0; k<4; k=k+1)
+	{
+		dynamicFreqs[k] = tempMatrix[3][k];
+	}
+	return dynamicFreqs[0];
+}
+
diff --git a/res/TemplateBatchFiles/TemplateModels/NRM.mdl b/res/TemplateBatchFiles/TemplateModels/NRM.mdl
new file mode 100644
index 0000000..36a1dc9
--- /dev/null
+++ b/res/TemplateBatchFiles/TemplateModels/NRM.mdl
@@ -0,0 +1,67 @@
+/* This file defines the transition matrix for the General Non-Reversible model
+   The file should be used as follows:
+   
+   1) Read Data File and create datafilter filteredData
+   2) #include this file (or use SelectTemplateModel(filteredData);)
+   3) Define the tree
+   4) Proceed with the likelihood function using 'vectorOfFrequencies' as the vector to pass to the constructor.
+   
+   This model has the following signature:
+    #Short:GRM#
+   	#Desc:General Reversible Model. Local or global parameters. Possible Gamma Variation.#
+   	#Dimension:4#
+    #DataType:nucleotide#
+   	#FileName:GRM.mdl#
+   
+   08/18/1999  by Sergei L. Kosakovsky Pond
+   Modified on 03/06/2000 to comply with the new Model syntax.
+*/
+
+function PopulateModelMatrix (ModelMatrixName&, EFV)
+{
+	/* frequency ratios */
+	 
+	r0 = EFV[0]/EFV[3];
+	r1 = EFV[1]/EFV[3];
+	r2 = EFV[2]/EFV[3];
+
+	/* All the global rate parameters are defined relative to 
+	the rate for A->G. For instance, CG represents the ratio
+	of the rates C->G/A->G. */
+
+	global AC = 1;
+	global AT = 1;
+	global CA = 1;
+	global CG = 1;
+	global CT = 1;
+	global GA = 1;
+	global GC = 1;
+	global GT = 1;
+
+	/* note that these constraints are 
+	satisfied if we restrict the model to the
+	general reversible case */
+
+	global TA:=AT+(AC-CA)*r1__+(1-GA)*r2__;
+	global TC:=CT+(CA-AC)*r0__+(CG-GC)*r2__;
+	global TG:=GT+(GA-1)*r0__+(GC-CG)*r1__;
+
+
+	ModelMatrixName = 
+			{{*,t*AC,t,t*AT}
+			 {t*CA,*,t*CG,t*CT}
+			 {t*GA,t*GC,*,t*GT}
+			 {t*TA,t*TC,t*TG,*}};
+			 
+	return 1;
+}
+
+NRM = 0;
+
+HarvestFrequencies (vectorOfFrequencies, filteredData,1,1,0);
+
+MULTIPLY_BY_FREQS = PopulateModelMatrix ("NRM",vectorOfFrequencies);
+
+Model GRMModel = (NRM, vectorOfFrequencies, MULTIPLY_BY_FREQS);
+
+FREQUENCY_SENSITIVE = 1;
diff --git a/res/TemplateBatchFiles/TemplateModels/PCH b/res/TemplateBatchFiles/TemplateModels/PCH
new file mode 100644
index 0000000..8fb3818
--- /dev/null
+++ b/res/TemplateBatchFiles/TemplateModels/PCH
@@ -0,0 +1,25 @@
+GASCDPNTEVQHMLIKRFYW
+
+{
+{*,2,2,2,2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1}
+{2,*,2,2,2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1}
+{2,2,*,2,2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1}
+{2,2,2,*,2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1}
+{2,2,2,2,*,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1}
+{2,2,2,2,2,*,2,2,1,1,1,1,1,1,1,1,1,1,1,1}
+{2,2,2,2,2,2,*,2,1,1,1,1,1,1,1,1,1,1,1,1}
+{2,2,2,2,2,2,2,*,1,1,1,1,1,1,1,1,1,1,1,1}
+{1,1,1,1,1,1,1,1,*,2,1,1,1,1,1,1,1,1,1,1}
+{1,1,1,1,1,1,1,1,2,*,1,1,1,1,1,1,1,1,1,1}
+{1,1,1,1,1,1,1,1,1,1,*,2,1,1,1,1,1,1,1,1}
+{1,1,1,1,1,1,1,1,1,1,2,*,1,1,1,1,1,1,1,1}
+{1,1,1,1,1,1,1,1,1,1,1,1,*,2,2,2,2,2,2,2}
+{1,1,1,1,1,1,1,1,1,1,1,1,2,*,2,2,2,2,2,2}
+{1,1,1,1,1,1,1,1,1,1,1,1,2,2,*,2,2,2,2,2}
+{1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,*,2,2,2,2}
+{1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,*,2,2,2}
+{1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,*,2,2}
+{1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,*,2}
+{1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,*}
+}
+
diff --git a/res/TemplateBatchFiles/TemplateModels/RNA16.mdl b/res/TemplateBatchFiles/TemplateModels/RNA16.mdl
new file mode 100644
index 0000000..f6ee4f0
--- /dev/null
+++ b/res/TemplateBatchFiles/TemplateModels/RNA16.mdl
@@ -0,0 +1,203 @@
+/* This file defines the transition matrix for the General Reversible model
+   The file should be used as follows:
+   
+   1) Read Data File and create datafilter filteredData
+   2) #include this file (or use SelectTemplateModel(filteredData);)
+   3) Define the tree
+   4) Proceed with the likelihood function using 'vectorOfFrequencies' as the vector to pass to the constructor.
+   
+   This model has the following signature:
+    #Short:RNA16
+   	#Desc:Model allowing for secondary structure constraints in the RNA evolution.#
+   	#Dimension:16#
+    #DataType:di-nucleotide#
+   	#FileName:RNA16.mdl#
+   
+   05/19/2005  by Sergei L. Kosakovsky Pond
+*/
+
+
+/*----------------------------------------------------------------------------------------------------*/
+
+modelType = 0;
+
+#include "modelParameters2.mdl";
+
+/* ADD NEW RATE CLASS MATRICES HERE */
+
+DiNucClasses = {{"RNAEqualInput","A 16x16 matrix with a single substitution rate. Not expected to fit the data well, and should only be used as a 'bad' model to compare other models to."}
+				{"RNAF81","A 16x16 matrix with a single substitution rate for single nucleotide substitutions and a zero rate for double substitutions. Not expected to fit the data well, and should only be used as a 'bad' model to compare other models to."}
+				{"RNA16A","5 rate parameters. Defined in Savill, Hoyle and Higgs. Genetics 157: 399-411."}
+				{"RNAREV_1","A subset of the general reversible model with 47 rate parameters, which disallows double instantaneous substitutions."}
+				{"RNAREV","A general reversible model with 119 rate parameters."}
+				{"Custom Esimated","Load a custom rate matrix from file. Rates estimated from the data."}
+				{"Custom Fixed","Load a custom rate matrix from file. Rates are fixed at the values read from the numeric matrix."}};
+					
+				    
+/* END ADD NEW RATE CLASS MATRICES HERE */			    
+
+ChoiceList	(dinucModelType,"Dinucleotide Rate Class Model",1,SKIP_NONE,DiNucClasses);
+
+if (dinucModelType < 0)
+{
+	return 0;
+}
+
+if (dinucModelType >= Rows(DiNucClasses)-2)
+{
+	SetDialogPrompt ("Locate an di-nucleotide rate profile matrix file:");
+	fscanf (PROMPT_FOR_FILE,"Matrix",diNucRateMatrix);
+	W_MATRIX_FILE = LAST_FILE_PATH;
+}
+else
+{
+	W_MATRIX_FILE = HYPHY_LIB_DIRECTORY+"TemplateBatchFiles"+DIRECTORY_SEPARATOR+"TemplateModels"+DIRECTORY_SEPARATOR+SELECTION_STRINGS;
+	fscanf (W_MATRIX_FILE,"Matrix",diNucRateMatrix);
+}
+
+if (Rows (diNucRateMatrix) != 16 || Columns (diNucRateMatrix) != 16)
+{
+	fprintf (stdout, "ERROR: A 16x16 matrix was expected, but not found in rate definition file\n");
+	return 0;
+}
+
+if (modelType == 1)
+{
+	#include "defineGamma.mdl";
+}
+if (modelType == 2)
+{
+	#include "defineHM.mdl";
+}
+
+
+ChoiceList  (freqResp,"Equilibrium Frequencies",1,NO_SKIP,
+			 "Dinucleotide counts","State frequencies are collected from observed dinucleotide counts.",
+			 "Nucleotide counts","State frequencies are estimates from products of respective nucleotide counts.",
+			 "Estimated","Frequencies are estimated by ML.");
+			 
+if (freqResp<0) 
+{
+	return 1;
+}
+else
+{
+	 if (freqResp == 0)
+	 {
+		HarvestFrequencies (vectorOfFrequencies, filteredData,2,2,0);
+		FREQUENCY_SENSITIVE = 1;
+	 }
+	 else
+	 {
+		vectorOfFrequencies = {16,1};
+	 	if (freqResp == 1)
+	 	{
+			HarvestFrequencies (obsFreqs,filteredData,2,1,1);
+			for (h=0; h<4; h=h+1)
+			{
+				for (v=0; v<4; v=v+1)
+				{
+					vectorOfFrequencies[h*4+v] = obsFreqs[h][0]*obsFreqs[v][1];
+				}
+			}
+			FREQUENCY_SENSITIVE = 1;
+	 	}
+	 	else
+	 	{
+			HarvestFrequencies (obsFreqs,filteredData,2,2,1);
+			v = "";
+			global f_weight = 1;
+
+			nucChar = "ACGT";
+
+			for (h=0;h<4;h=h+1)
+			{
+				for (h2=0;h2<4;h2=h2+1)
+				{
+					varName = "f_"+nucChar[h]+nucChar[h2];
+					idx = h*4+h2;
+					
+					ExecuteCommands ("global "+varName+"=obsFreqs[idx];"+varName+":<1;vectorOfFrequencies["+idx+"]:="+varName+"/f_weight;");
+					v = v + "+" + varName;
+				}
+			}
+			ExecuteCommands ("f_weight:="+v[1][Abs(v)-1]+";");	 		
+	 	}
+	 }
+}
+
+/*----------------------------------------------------------------------------------*/
+
+function PopulateModelMatrix (ModelMatrixName&, EFV)
+{
+	ModelMatrixName = {16,16};
+	global rate_Normalizer = 1;
+	
+	if (dinucModelType == Rows(DiNucClasses)-1)
+	{
+		rate_Norm = 0;
+		for (h=0; h<16; h=h+1)
+		{
+			for (v=h+1; v<16; v=v+1)
+			{
+				if (v!=h)
+				{
+					if (Abs("" + diNucRateMatrix[h][v]))
+					{
+						rateEntry = ""+diNucRateMatrix[h][v];
+						rate_Norm = rate_Norm + rateEntry;
+						
+						if (modelType>=1)
+						{
+							rateEntry = rateEntry + "*c";
+						}
+						
+						ExecuteCommands ("ModelMatrixName["+h+"]["+v+"]:="+rateEntry  +"*rate_Normalizer*t");
+						ExecuteCommands ("ModelMatrixName["+v+"]["+h+"]:="+rateEntry  +"*rate_Normalizer*t");
+					}
+				}
+			}
+		}
+		ExecuteCommands ("rate_Normalizer:=100./rate_Norm__;");
+	}
+	else
+	{
+		rate_Norm = "";
+		alreadyDefined = {};
+		for (h=0; h<16; h=h+1)
+		{
+			for (v=h+1; v<16; v=v+1)
+			{
+				if (v!=h)
+				{
+					if (Abs("" + diNucRateMatrix[h][v]))
+					{
+						rateEntry = "R_"+diNucRateMatrix[h][v];
+						if (alreadyDefined[rateEntry] == 0)
+						{
+							ExecuteCommands ("global "+rateEntry + "=1;");
+							rate_Norm = rate_Norm + "+" + rateEntry;
+							alreadyDefined[rateEntry] = 1;
+						}
+						
+						if (modelType>=1)
+						{
+							rateEntry = rateEntry + "*c";
+						}
+						
+						ExecuteCommands ("ModelMatrixName["+h+"]["+v+"]:="+rateEntry  +"*rate_Normalizer*t");
+						ExecuteCommands ("ModelMatrixName["+v+"]["+h+"]:="+rateEntry  +"*rate_Normalizer*t");
+					}
+				}
+			}
+		}
+		ExecuteCommands ("rate_Normalizer:=100./("+rate_Norm[1][Abs(rate_Norm)-1]+");");
+	}
+	
+	return 1;
+}
+
+/*----------------------------------------------------------------------------------*/
+
+MULTIPLY_BY_FREQS = PopulateModelMatrix ("RNA16",observedFreq);
+Model RNA16Model = (RNA16, vectorOfFrequencies, MULTIPLY_BY_FREQS);
diff --git a/res/TemplateBatchFiles/TemplateModels/RNA16A b/res/TemplateBatchFiles/TemplateModels/RNA16A
new file mode 100644
index 0000000..5a6dfa2
--- /dev/null
+++ b/res/TemplateBatchFiles/TemplateModels/RNA16A
@@ -0,0 +1,18 @@
+{
+{"0","epsilon","epsilon","gamma","epsilon","","","","epsilon","","","","gamma","","",""}
+{"epsilon","0","epsilon","gamma","","epsilon","","","","gamma","","","","epsilon","",""}
+{"epsilon","epsilon","0","gamma","","","gamma","","","","epsilon","","","","gamma",""}
+{"gamma","gamma","gamma","0","","","beta","gamma","","alpha_d","","alpha_s","beta","","beta","gamma"}
+{"epsilon","","","","0","epsilon","gamma","epsilon","epsilon","","","","gamma","","",""}
+{"","epsilon","","","epsilon","0","gamma","epsilon","","gamma","","","","epsilon","",""}
+{"","","gamma","beta","gamma","gamma","0","gamma","","beta","gamma","beta","alpha_d","","alpha_s",""}
+{"","","","gamma","epsilon","epsilon","gamma","0","","","","gamma","","","","epsilon"}
+{"epsilon","","","","epsilon","","","","0","gamma","epsilon","gamma","gamma","","",""}
+{"","gamma","","alpha_d","","gamma","beta","","gamma","0","gamma","alpha_s","beta","gamma","beta",""}
+{"","","epsilon","","","","gamma","","epsilon","gamma","0","gamma","","","gamma",""}
+{"","","","alpha_s","","","beta","gamma","gamma","alpha_s","gamma","0","beta","","beta","gamma"}
+{"gamma","","","beta","gamma","","alpha_d","","gamma","beta","","beta","0","gamma","alpha_s","gamma"}
+{"","epsilon","","","","epsilon","","","","gamma","","","gamma","0","gamma","epsilon"}
+{"","","gamma","beta","","","alpha_s","","","beta","gamma","beta","alpha_s","gamma","0","gamma"}
+{"","","","gamma","","","","epsilon","","","","gamma","gamma","epsilon","gamma","0"}
+}
diff --git a/res/TemplateBatchFiles/TemplateModels/RNA16SvH.mdl b/res/TemplateBatchFiles/TemplateModels/RNA16SvH.mdl
new file mode 100644
index 0000000..de76cda
--- /dev/null
+++ b/res/TemplateBatchFiles/TemplateModels/RNA16SvH.mdl
@@ -0,0 +1,143 @@
+/* This file defines the transition matrix for the General Reversible model
+   The file should be used as follows:
+   
+   1) Read Data File and create datafilter filteredData
+   2) #include this file (or use SelectTemplateModel(filteredData);)
+   3) Define the tree
+   4) Proceed with the likelihood function using 'vectorOfFrequencies' as the vector to pass to the constructor.
+   
+   This model has the following signature:
+    #Short:RNASvH16
+   	#Desc:Model allowing for secondary structure constraints in the RNA evolution.#
+   	#Dimension:16#
+    #DataType:di-nucleotide#
+   	#FileName:RNASvH16.mdl#
+   
+   05/19/2005  by Sergei L. Kosakovsky Pond
+*/
+
+
+/*----------------------------------------------------------------------------------------------------*/
+
+modelType = 0;
+
+#include "modelParameters2.mdl";
+
+if (dinucModelType < 0)
+{
+	return 0;
+}
+
+if (modelType == 1)
+{
+	#include "defineGamma.mdl";
+}
+if (modelType == 2)
+{
+	#include "defineHM.mdl";
+}
+
+global AC = 1;
+global AT = 1;
+global CG = 1;
+global CT = 1;
+global GT = 1;
+
+done = 0;
+while (!done)
+{
+	fprintf (stdout,"\nPlease enter a 6 character model designation (e.g:010010 defines HKY85):");
+	fscanf  (stdin,"String", modelDesc);
+	if (Abs(modelDesc)==6)
+	{	
+		done = 1;
+	}
+}			
+ModelTitle = "MG94x"+modelDesc[0];
+			
+rateBiasTerms   = {{"AC","1","AT","CG","CT","GT"}};
+
+rateMultipliers = {{"","AC*","","AT*"}
+				   {"AC*","","CG*","CT*"}
+				   {"","CG*","","GT*"}
+				   {"AT*","CT*","GT*",""}};
+paramCount	  = 0;
+
+modelConstraintString = "";
+
+for (customLoopCounter2=1; customLoopCounter2<6; customLoopCounter2=customLoopCounter2+1)
+{
+	for (customLoopCounter=0; customLoopCounter<customLoopCounter2; customLoopCounter=customLoopCounter+1)
+	{
+		if (modelDesc[customLoopCounter2]==modelDesc[customLoopCounter])
+		{
+			ModelTitle  = ModelTitle+modelDesc[customLoopCounter2];	
+			if (rateBiasTerms[customLoopCounter2] == "1")
+			{
+				modelConstraintString = modelConstraintString + rateBiasTerms[customLoopCounter]+":="+rateBiasTerms[customLoopCounter2]+";";
+			}
+			else
+			{
+				modelConstraintString = modelConstraintString + rateBiasTerms[customLoopCounter2]+":="+rateBiasTerms[customLoopCounter]+";";			
+			}
+			break;
+		}
+	}
+}	
+
+if (Abs(modelConstraintString))
+{
+	ExecuteCommands (modelConstraintString);
+}
+
+			
+/*----------------------------------------------------------------------------------*/
+
+function PopulateModelMatrix (ModelMatrixName&, EFV)
+{
+	ModelMatrixName = {16,16};
+	
+	for (h=0; h<16; h=h+1)
+	{
+		for (v=h+1; v<16; v=v+1)
+		{
+			fromNuc = -1;
+			toNuc   = -1;
+			cNuc    = -1;
+			if (h$4 == v$4) /* same 1st nuc */
+			{
+				toNuc   = v%4;
+				fromNuc = h%4;
+				cNuc    = h$4;
+			}
+			else
+			{
+				if (v%4 == h%4) /* same 2nd nuc */
+				{
+					toNuc   = v$4;
+					fromNuc = h$4;
+					cNuc	= h%4;
+				}
+			}
+			if (fromNuc >= 0)
+			{
+				rateMult  = rateMultipliers[fromNuc][toNuc] + "1/" + EFV[cNuc] + "*"; 
+				if (modelType >= 1)
+				{
+					rateMult = rateMult + "c*";
+				}	
+				ExecuteCommands ("ModelMatrixName["+h+"]["+v+"]:="+rateMult  +"t;");
+				ExecuteCommands ("ModelMatrixName["+v+"]["+h+"]:="+rateMult  +"t;");
+			}
+		}
+	}	
+	
+	return 1;
+}
+
+/*----------------------------------------------------------------------------------*/
+
+HarvestFrequencies (vectorOfFrequencies,filteredData,2,2,1);
+HarvestFrequencies (observedFreq, filteredData,1,1,0);
+MULTIPLY_BY_FREQS = PopulateModelMatrix ("RNA16SvH",observedFreq);
+Model RNA16SvHModel = (RNA16SvH, vectorOfFrequencies, MULTIPLY_BY_FREQS);
diff --git a/res/TemplateBatchFiles/TemplateModels/RNAEqualInput b/res/TemplateBatchFiles/TemplateModels/RNAEqualInput
new file mode 100644
index 0000000..c3ff74d
--- /dev/null
+++ b/res/TemplateBatchFiles/TemplateModels/RNAEqualInput
@@ -0,0 +1,19 @@
+
+{
+{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}
+{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}
+{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}
+{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}
+{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}
+{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}
+{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}
+{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}
+{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}
+{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}
+{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}
+{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}
+{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}
+{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}
+{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}
+{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}
+}
diff --git a/res/TemplateBatchFiles/TemplateModels/RNAF81 b/res/TemplateBatchFiles/TemplateModels/RNAF81
new file mode 100644
index 0000000..f747cb6
--- /dev/null
+++ b/res/TemplateBatchFiles/TemplateModels/RNAF81
@@ -0,0 +1,18 @@
+{
+{"0","0","0","0","0","","","","0","","","","0","","",""}
+{"0","0","0","0","","0","","","","0","","","","0","",""}
+{"0","0","0","0","","","0","","","","0","","","","0",""}
+{"0","0","0","0","","","","0","","","","0","","","","0"}
+{"0","","","","0","0","0","0","0","","","","0","","",""}
+{"","0","","","0","0","0","0","","0","","","","0","",""}
+{"","","0","","0","0","0","0","","","0","","","","0",""}
+{"","","","0","0","0","0","0","","","","0","","","","0"}
+{"0","","","","0","","","","0","0","0","0","0","","",""}
+{"","0","","","","0","","","0","0","0","0","","0","",""}
+{"","","0","","","","0","","0","0","0","0","","","0",""}
+{"","","","0","","","","0","0","0","0","0","","","","0"}
+{"0","","","","0","","","","0","","","","0","0","0","0"}
+{"","0","","","","0","","","","0","","","0","0","0","0"}
+{"","","0","","","","0","","","","0","","0","0","0","0"}
+{"","","","0","","","","0","","","","0","0","0","0","0"}
+}
diff --git a/res/TemplateBatchFiles/TemplateModels/RNAMuse95.mdl b/res/TemplateBatchFiles/TemplateModels/RNAMuse95.mdl
new file mode 100644
index 0000000..518fee4
--- /dev/null
+++ b/res/TemplateBatchFiles/TemplateModels/RNAMuse95.mdl
@@ -0,0 +1,164 @@
+/* This file defines the transition matrix for the General Reversible model
+   The file should be used as follows:
+   
+   1) Read Data File and create datafilter filteredData
+   2) #include this file (or use SelectTemplateModel(filteredData);)
+   3) Define the tree
+   4) Proceed with the likelihood function using 'vectorOfFrequencies' as the vector to pass to the constructor.
+   
+   This model has the following signature:
+    #Short:RNAMuse95
+   	#Desc:Model allowing for secondary structure constraints in the RNA evolution.#
+   	#Dimension:16#
+    #DataType:di-nucleotide#
+   	#FileName:RNAMuse95.mdl#
+   
+   05/17/2005  by Sergei L. Kosakovsky Pond
+*/
+
+_PairingsVector = {{
+0, /* AA - mispairing */
+0, /* AC - mispairing */
+0, /* AG - mispairing */
+1, /* AU - Watson-Crick */
+
+0, /* CA - mispairing */
+0, /* CC - mispairing */
+1, /* CG - Watson-Crick */
+0, /* CU - mispairing */
+
+0, /* GA - mispairing */
+1, /* GC - Watson-Crick */
+0, /* GG - mispairing */
+0, /* GU - mispairing */
+ 
+1, /* UA - Watson-Crick */
+0, /* UC - mispairing */
+0, /* UG - mispairing */
+0  /* UU - mispairing */
+}};
+
+/*----------------------------------------------------------------------------------------------------*/
+
+function BuildDinucFrequencies (result&,obsF)
+{
+	result = {16,1};
+	h = obsF[0]*obsF[3]+obsF[1]*obsF[2];
+	global freq_Mod := 1/(1+2*(h__*(R_gained/R_lost-1)));
+	for (h=0; h<4; h=h+1)
+	{
+		for (v=0; v<4; v=v+1)
+		{
+			idx = h*4+v;
+			if (_PairingsVector[idx])
+			{
+				result[idx] := freq_Mod*R_gained/R_lost*obsF__[h__]*obsF__[v__];
+			}
+			else
+			{
+				result[idx] := freq_Mod*obsF__[h__]*obsF__[v__];			
+			}
+		}
+	}
+	return result;
+}
+
+/*----------------------------------------------------------------------------------------------------*/
+
+_nucModMatrix = {{"","R_TVTS*","","R_TVTS*"}
+				 {"R_TVTS*","","R_TVTS*",""}
+				 {"","R_TVTS*","","R_TVTS*"}
+				 {"R_TVTS*","","R_TVTS*",""}};
+
+/*----------------------------------------------------------------------------------------------------*/
+
+modelType = 0;
+
+#include "modelParameters2.mdl";
+
+if (dinucModelType < 0)
+{
+	return 0;
+}
+
+if (modelType == 1)
+{
+	#include "defineGamma.mdl";
+}
+if (modelType == 2)
+{
+	#include "defineHM.mdl";
+}
+
+function PopulateModelMatrix (ModelMatrixName&, EFV)
+{
+	global R_TVTS   = 1;
+	global R_gained = 1;
+	global R_lost  := 1/R_gained;
+		   
+	ModelMatrixName = {16,16};
+	
+	for (h=0; h<16; h=h+1)
+	{
+		for (v=h+1; v<16; v=v+1)
+		{
+			if (v!=h)
+			{
+				fromNuc = -1;
+				toNuc   = -1;
+				if (h$4 == v$4) /* same 1st nuc */
+				{
+					toNuc   = v%4;
+					fromNuc = h%4;
+				}
+				else
+				{
+					if (v%4 == h%4) /* same 2nd nuc */
+					{
+						toNuc   = v$4;
+						fromNuc = h$4;
+					}
+				}
+				if (fromNuc >= 0)
+				{
+					rateMult  = "";
+					rateMult2 = "";
+					if (_PairingsVector[h]<_PairingsVector[v])
+					{
+						rateMult  = "R_gained*";
+						rateMult2 = "R_lost*";
+					}
+					else
+					{
+						if (_PairingsVector[h]>_PairingsVector[v])
+						{
+							rateMult   = "R_lost*";
+							rateMult2  = "R_gained*";
+						}
+					}
+					rateMult  = _nucModMatrix[fromNuc][toNuc]+rateMult;
+					rateMult2 = _nucModMatrix[fromNuc][toNuc]+rateMult2;
+					if (modelType >= 1)
+					{
+						rateMult  = rateMult  + "c*";
+						rateMult2 = rateMult2 + "c*";
+					}
+					
+					
+					ExecuteCommands ("ModelMatrixName["+h+"]["+v+"]:="+rateMult  +"t*EFV__["+toNuc+"];");
+					ExecuteCommands ("ModelMatrixName["+v+"]["+h+"]:="+rateMult2 +"t*EFV__["+fromNuc+"];");
+				}
+			}
+		}
+	}
+	
+	
+	return 0;
+}
+
+HarvestFrequencies (observedFreq,filteredData,1,1,1);
+
+MULTIPLY_BY_FREQS = PopulateModelMatrix ("M95",observedFreq);
+BuildDinucFrequencies ("vectorOfFrequencies",observedFreq);
+Model M95Model = (M95, vectorOfFrequencies, MULTIPLY_BY_FREQS);
+FREQUENCY_SENSITIVE = 1;
diff --git a/res/TemplateBatchFiles/TemplateModels/RNAREV b/res/TemplateBatchFiles/TemplateModels/RNAREV
new file mode 100644
index 0000000..a5b74c1
--- /dev/null
+++ b/res/TemplateBatchFiles/TemplateModels/RNAREV
@@ -0,0 +1,19 @@
+
+{
+{0,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14}
+{0,0,15,16,17,18,19,20,21,22,23,24,25,26,27,28}
+{1,15,0,29,30,31,32,33,34,35,36,37,38,39,40,41}
+{2,16,29,0,42,43,44,45,46,47,48,49,50,51,52,53}
+{3,17,30,42,0,54,55,56,57,58,59,60,61,62,63,64}
+{4,18,31,43,54,0,65,66,67,68,69,70,71,72,73,74}
+{5,19,32,44,55,65,0,75,76,77,78,79,80,81,82,83}
+{6,20,33,45,56,66,75,0,84,85,86,87,88,89,90,91}
+{7,21,34,46,57,67,76,84,0,92,93,94,95,96,97,98}
+{8,22,35,47,58,68,77,85,92,0,99,100,101,102,103,104}
+{9,23,36,48,59,69,78,86,93,99,0,105,106,107,108,109}
+{10,24,37,49,60,70,79,87,94,100,105,0,110,111,112,113}
+{11,25,38,50,61,71,80,88,95,101,106,110,0,114,115,116}
+{12,26,39,51,62,72,81,89,96,102,107,111,114,0,117,118}
+{13,27,40,52,63,73,82,90,97,103,108,112,115,117,0,119}
+{14,28,41,53,64,74,83,91,98,104,109,113,116,118,119,0}
+}
diff --git a/res/TemplateBatchFiles/TemplateModels/RNAREV_1 b/res/TemplateBatchFiles/TemplateModels/RNAREV_1
new file mode 100644
index 0000000..e74e8e7
--- /dev/null
+++ b/res/TemplateBatchFiles/TemplateModels/RNAREV_1
@@ -0,0 +1,19 @@
+
+{
+{"",0,1,2,3,"","","",4,"","","",5,"","",""}
+{0,"",6,7,"",8,"","","",9,"","","",10,"",""}
+{1,6,"",11,"","",12,"","","",13,"","","",14,""}
+{2,7,11,"","","","",15,"","","",16,"","","",17}
+{3,"","","","",18,19,20,21,"","","",22,"","",""}
+{"",8,"","",18,"",23,24,"",25,"","","",26,"",""}
+{"","",12,"",19,23,"",27,"","",28,"","","",29,""}
+{"","","",15,20,24,27,"","","","",30,"","","",31}
+{4,"","","",21,"","","","",32,33,34,35,"","",""}
+{"",9,"","","",25,"","",32,"",36,37,"",38,"",""}
+{"","",13,"","","",28,"",33,36,"",39,"","",40,""}
+{"","","",16,"","","",30,34,37,39,"","","","",41}
+{5,"","","",22,"","","",35,"","","","",42,43,44}
+{"",10,"","","",26,"","","",38,"","",42,"",45,46}
+{"","",14,"","","",29,"","","",40,"",43,45,"",47}
+{"","","",17,"","","",31,"","","",41,44,46,47,""}
+}
diff --git a/res/TemplateBatchFiles/TemplateModels/S4 b/res/TemplateBatchFiles/TemplateModels/S4
new file mode 100644
index 0000000..cd2cec7
--- /dev/null
+++ b/res/TemplateBatchFiles/TemplateModels/S4
@@ -0,0 +1,24 @@
+GASCDPNTEVQHMLIKRFYW
+
+{
+{*,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}
+{2,*,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}
+{2,2,*,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}
+{1,1,1,*,2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1}
+{1,1,1,2,*,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1}
+{1,1,1,2,2,*,2,2,1,1,1,1,1,1,1,1,1,1,1,1}
+{1,1,1,2,2,2,*,2,1,1,1,1,1,1,1,1,1,1,1,1}
+{1,1,1,2,2,2,2,*,1,1,1,1,1,1,1,1,1,1,1,1}
+{1,1,1,1,1,1,1,1,*,2,2,2,2,2,2,2,2,1,1,1}
+{1,1,1,1,1,1,1,1,2,*,2,2,2,2,2,2,2,1,1,1}
+{1,1,1,1,1,1,1,1,2,2,*,2,2,2,2,2,2,1,1,1}
+{1,1,1,1,1,1,1,1,2,2,2,*,2,2,2,2,2,1,1,1}
+{1,1,1,1,1,1,1,1,2,2,2,2,*,2,2,2,2,1,1,1}
+{1,1,1,1,1,1,1,1,2,2,2,2,2,*,2,2,2,1,1,1}
+{1,1,1,1,1,1,1,1,2,2,2,2,2,2,*,2,2,1,1,1}
+{1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,*,2,1,1,1}
+{1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,*,1,1,1}
+{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,*,2,2}
+{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,*,2}
+{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,*}
+}
diff --git a/res/TemplateBatchFiles/TemplateModels/STGRM.mdl b/res/TemplateBatchFiles/TemplateModels/STGRM.mdl
new file mode 100644
index 0000000..18a7fc9
--- /dev/null
+++ b/res/TemplateBatchFiles/TemplateModels/STGRM.mdl
@@ -0,0 +1,75 @@
+/* This file defines the transition matix for a strand GTR model.
+
+ie.
+GT := CA, and not GT := CA as in the standard GTR 
+CA := GT
+GA := CT
+GC := CG
+TA := AT
+TC := AG
+TG := AC
+
+The file should be used as follows:
+
+   1) Read Data File and create datafilter filteredData
+   2) #include this file (or use SelectTemplateModel(filteredData);)
+   3) Define the tree
+   4) Proceed with the likelihood function using 'vectorOfFrequencies' as the vector to pass to the constructor.
+   
+   This model has the following signature:
+    #Short:STGRM#
+   	#Desc:Strand General Reversible Model. Local or global parameters. Possible Gamma Variation.#
+   	#Dimension:4#
+    #DataType:nucleotide#
+   	#FileName:STGRM.mdl#
+   
+   04/28/2009  by Wayne Delport
+*/
+
+#include "modelParameters.mdl";
+if ( modelType >= 1 ) {
+	global AC = 1;
+	global AT = 1;
+	global CG = 1;
+	global CT = 1;
+	global GT = 1;
+	
+	if (modelType == 2)
+	{
+		#include "defineGamma.mdl";
+	}
+	if (modelType == 3)
+	{
+		#include "defineHM.mdl";
+	}
+}
+
+
+function PopulateModelMatrix ( ModelMatrixName& )
+{
+	if (modelType == 0)
+	{
+		ModelMatrixName = {{*,a,b,c}{f,*,d,e}{e,d,*,f}{c,b,a,*}};
+	}
+	else
+	{
+		if (modelType<2)
+		{
+			ModelMatrixName = {{*,AC*mu,mu,AT*mu}{GT*mu,*,CG*mu,CT*mu}{CT*mu,CG*mu,*,GT*mu}{AT*mu,mu,AC*mu,*}};
+		}
+		else
+		{
+			ModelMatrixName = {{*,AC*mu*c,mu*c,AT*mu*c}{GT*mu*c,*,CG*mu*c,CT*mu*c}{CT*mu*c,CG*mu*c,*,GT*mu*c}{AT*mu*c,mu*c,AC*mu*c,*}};
+		}
+	}
+	return 1;
+}
+
+STGRM = 0;
+HarvestFrequencies (vectorOfFrequencies, filteredData,1,1,0);
+
+MULTIPLY_BY_FREQS = PopulateModelMatrix ("STGRM");
+
+Model STGRMModel = (STGRM, vectorOfFrequencies, MULTIPLY_BY_FREQS);
+
+FREQUENCY_SENSITIVE = 1;
diff --git a/res/TemplateBatchFiles/TemplateModels/TrN.mdl b/res/TemplateBatchFiles/TemplateModels/TrN.mdl
new file mode 100644
index 0000000..55119c3
--- /dev/null
+++ b/res/TemplateBatchFiles/TemplateModels/TrN.mdl
@@ -0,0 +1,64 @@
+/* This file defines the transition matrix for the Tamura and Nei (1993) model
+   The file should be used as follows:
+   
+   1) Read Data File and create datafilter filteredData
+   2) #include this file (or use SelectTemplateModel(filteredData);)
+   3) Define the tree
+   4) Proceed with the likelihood function using 'vectorOfFrequencies' as the vector to pass to the constructor.
+   
+   This model has the following signature:
+    #Short:TrN#
+   	#Desc:Tamura and Nei 1993. Local or global parameters. Possible Gamma Variation.#
+   	#Dimension:4#
+    #DataType:nucleotide#
+   	#FileName:TrN.mdl#
+   
+   04/04/2000  by Sergei L. Kosakovsky Pond
+*/
+
+#include "modelParameters.mdl";
+
+if (modelType >= 1)
+{
+	global TRSV    = 1;
+	global TRST_CT = 1;
+	
+	if (modelType == 2)
+	{
+		#include "defineGamma.mdl";
+	}
+	if (modelType == 3)
+	{
+		#include "defineHM.mdl";
+	}
+}
+
+function PopulateModelMatrix (ModelMatrixName&, EFV)
+{
+	if (modelType == 0)
+	{
+		ModelMatrixName = {{*,a,b,a}{a,*,a,c}{b,a,*,a}{a,c,a,*}};
+	}
+	else
+	{
+		if (modelType<2)
+		{
+			ModelMatrixName = {{*,TRSV*t,t,TRSV*t}{TRSV*t,*,TRSV*t,TRST_CT*t}{t,TRSV*t,*,TRSV*t}{TRSV*t,TRST_CT*t,TRSV*t,*}};
+		}
+		else
+		{
+			ModelMatrixName = {{*,TRSV*t*c,t*c,TRSV*t*c}{TRSV*t*c,*,TRSV*t*c,TRST_CT*t*c}{t*c,TRSV*t*c,*,TRSV*t*c}{TRSV*t*c,TRST_CT*t*c,TRSV*t*c,*}};
+		}
+	}
+	return 1;
+}
+
+TrN = 0;
+
+HarvestFrequencies (vectorOfFrequencies, filteredData,1,1,0);
+
+MULTIPLY_BY_FREQS = PopulateModelMatrix ("TrN",vectorOfFrequencies);
+
+Model TrNModel = (TrN, vectorOfFrequencies, MULTIPLY_BY_FREQS);
+
+FREQUENCY_SENSITIVE = 1;
diff --git a/res/TemplateBatchFiles/TemplateModels/UniversalCode.def b/res/TemplateBatchFiles/TemplateModels/UniversalCode.def
new file mode 100644
index 0000000..442c9e3
--- /dev/null
+++ b/res/TemplateBatchFiles/TemplateModels/UniversalCode.def
@@ -0,0 +1,192 @@
+/* define various genetic code translation tables
+	
+   Table definitions used here can be found on the NCBI web page at
+   http://www3.ncbi.nlm.nih.gov/htbin-post/Taxonomy/wprintgc?mode=c#SG1
+
+*/
+
+/*
+  	here's how codes translate to aminoacids
+ 	
+ 	0 == Phe
+ 	1 == Leu
+ 	2 == Ile
+ 	3 == Met
+ 	4 == Val
+ 	5 == Ser
+ 	6 == Pro
+ 	7 == Thr
+ 	8 == Ala
+ 	9 == Tyr
+ 	10 == Stop
+ 	11 == His
+ 	12 == Gln
+ 	13 == Asn
+ 	14 == Lys
+ 	15 == Asp
+ 	16 == Glu
+ 	17 == Cys
+ 	18 == Trp
+ 	19 == Arg
+ 	20 == Gly
+ 	
+*/
+
+/* AAA,AAC,AAG....TTA,TTC,TTG,TTT - 64 all in all*/
+				
+_Genetic_Code = {
+	
+	{14,/*AAA*/ 13,/*AAC*/ 14,/*AAG*/  13,/*AAT*/
+	  7, /*ACA*/ 7, /*ACC*/ 7, /*ACG*/  7, /*ACT*/
+	 19, /*AGA*/ 5, /*AGC*/19, /*AGG*/  5, /*AGT*/
+	  2, /*ATA*/ 2, /*ATC*/	3, /*ATG*/  2, /*ATT*/
+	 12,/*CAA*/ 11,/*CAC*/ 12,/*CAG*/  11,/*CAT*/
+	  6, /*CCA*/ 6, /*CCC*/ 6, /*CCG*/  6, /*CCT*/
+	 19,/*CGA*/ 19,/*CGC*/ 19,/*CGG*/  19,/*CGT*/
+	  1, /*CTA*/ 1, /*CTG*/ 1, /*CTC*/  1, /*CTT*/
+	 16,/*GAA*/ 15,/*GAC*/ 16,/*GAG*/  15,/*GAT*/
+	  8, /*GCA*/ 8, /*GCC*/ 8, /*GCG*/  8, /*GCT*/
+	 20,/*GGA*/ 20,/*GGC*/ 20,/*GGG*/  20,/*GGT*/
+	  4, /*GTA*/ 4, /*GTC*/ 4, /*GTG*/  4, /*GTT*/
+	 10,/*TAA*/  9, /*TAC*/10,/*TAG*/   9, /*TAT*/
+	  5, /*TCA*/ 5, /*TCC*/ 5, /*TCG*/  5, /*TCT*/
+	 10,/*TGA*/ 17,/*TGC*/ 18,/*TGG*/  17,/*TGT*/
+	  1, /*TTA*/ 0, /*TTC*/ 1, /*TTG*/  0  /*TTT*/ }
+};
+				
+GeneticCodeExclusions = "TAA,TAG,TGA";
+
+/* defines model states which are not allowed, i.e. termination codons.
+   GeneticCodeExclusions string is used by DataSetFilter to
+   eliminate "illegal" states from the data */
+
+
+ChoiceList (modelType,"Choose Genetic Code",1,SKIP_NONE,
+			"Universal","Universal code. (Genebank transl_table=1).",
+			"Vertebrate mtDNA","Vertebrate mitochondrial DNA code. (Genebank transl_table=2).",
+			"Yeast mtDNA","Yeast mitochondrial DNA code. (Genebank transl_table=3).",
+			"Mold/Protozoan mtDNA","Mold, Protozoan and Coelenterate mitochondrial DNA and the Mycloplasma/Spiroplasma code. (Genebank transl_table=4).",
+			"Invertebrate mtDNA","Invertebrate mitochondrial DNA code. (Genebank transl_table=5).",
+			"Ciliate Nuclear","Ciliate, Dasycladacean and Hexamita Nuclear code. (Genebank transl_table=6).",
+			"Echinoderm mtDNA","Echinoderm mitochondrial DNA code. (Genebank transl_table=9).",
+			"Eupltoid Nuclear","Euplotid Nuclear code. (Genebank transl_table=10).",
+			"Alt. Yeast Nuclear","Alternative Yeast Nuclear code. (Genebank transl_table=12).",
+			"Ascidian mtDNA","Ascidian mitochondrial DNA code. (Genebank transl_table=13).",
+			"Flatworm mtDNA","Flatworm mitochondrial DNA code. (Genebank transl_table=14).",
+			"Blepharisma Nuclear","Blepharisma Nuclear code. (Genebank transl_table=15).",
+
+);			
+
+If (modelType < 0)
+{
+	return;
+}
+
+if (modelType == 1)
+/* Vertebrate mtDNA */
+{
+	_Genetic_Code [8] = 10; /* AGA => stop */
+	_Genetic_Code [10] = 10;/* AGG => stop */
+	_Genetic_Code [12] = 3; /* ATA => Met  */
+	_Genetic_Code [56] = 18;/* TGA => Trp  */
+	
+	GeneticCodeExclusions = "AGA,AGG,TAA,TAG";
+}
+
+if (modelType == 2)
+/* Yeast mtDNA */
+{
+	_Genetic_Code [12] = 3; /* ATA => Met */
+	_Genetic_Code [28] = 7; /* CTA => Thr */
+	_Genetic_Code [29] = 7; /* CTC => Thr */
+	_Genetic_Code [30] = 7; /* CTG => Thr */
+	_Genetic_Code [31] = 7; /* CTT => Thr */
+	_Genetic_Code [56] = 18;/* TGA => Trp */
+	
+	GeneticCodeExclusions = "TAA,TAG";
+}
+
+if (modelType == 3)
+/* Mold,Protozoan and Coelenterate mtDNA */
+{
+	_Genetic_Code [56] = 18;/* TGA => Trp */
+	GeneticCodeExclusions = "TAA,TAG";
+}
+
+if (modelType == 4)
+/* Invertebrate mtDNA */
+{
+	_Genetic_Code [8] = 5; /* AGA => Ser  */
+	_Genetic_Code [10] = 5;/* AGG => Ser  */
+	_Genetic_Code [12] = 3;/* ATA => Met  */
+	_Genetic_Code [56] = 18;/* TGA => Trp  */
+	
+	GeneticCodeExclusions = "TAA,TAG";
+}
+
+if (modelType == 5)
+/* Ciliate Nuclear Code */
+{
+	_Genetic_Code [48] = 12;/* TAA => Gln  */
+	_Genetic_Code [50] = 12;/* TAG => Gln  */
+	
+	GeneticCodeExclusions = "TGA";
+}
+
+if (modelType == 6)
+/* Echinoderm mtDNA */
+{
+	_Genetic_Code [0] = 13; /* AAA => Asn  */
+	_Genetic_Code [8] = 5;  /* AGA => Ser  */
+	_Genetic_Code [10] = 5; /* AGG => Ser  */
+	_Genetic_Code [56] = 18;/* TGA => Trp  */
+	
+	GeneticCodeExclusions = "TAA,TAG";
+}
+
+if (modelType == 7)
+/* Euplotid mtDNA */
+{
+	_Genetic_Code [56] = 17;/* TGA => Cys  */
+	
+	GeneticCodeExclusions = "TAA,TAG";
+}
+
+if (modelType == 8)
+/* Alternative Yeast Nuclear */
+{
+	_Genetic_Code [30] = 5;/* CTG => Ser  */
+	
+	GeneticCodeExclusions = "TAA,TAG,TGA";
+}
+
+if (modelType == 9)
+/* Ascidian mtDNA */
+{
+	_Genetic_Code [8] = 20;  /* AGA => Gly  */
+	_Genetic_Code [10] = 20; /* AGG => Gly  */
+	_Genetic_Code [12] = 3;  /* AGG => Met */
+	_Genetic_Code [56] = 18; /* TGA => Trp  */
+	
+	GeneticCodeExclusions = "TAA,TAG";
+}
+
+if (modelType == 10)
+/* Flatworm mtDNA */
+{
+	_Genetic_Code [0] = 13;  /* AAA => Asn  */
+	_Genetic_Code [8] = 5;   /* AGA => Ser  */
+	_Genetic_Code [10] = 5;  /* AGG => Ser  */
+	_Genetic_Code [48] = 9;  /* TAA => Tyr */
+	_Genetic_Code [56] = 18; /* TGA => Trp  */
+	
+	GeneticCodeExclusions = "TAG";
+}
+
+if (modelType == 11)
+/* Blepharisma Nuclear */
+{
+	_Genetic_Code [50] = 12;/* TAG => Gln  */
+	
+	GeneticCodeExclusions = "TAA,TGA";
+}
diff --git a/res/TemplateBatchFiles/TemplateModels/WAG.mdl b/res/TemplateBatchFiles/TemplateModels/WAG.mdl
new file mode 100644
index 0000000..77fcb80
--- /dev/null
+++ b/res/TemplateBatchFiles/TemplateModels/WAG.mdl
@@ -0,0 +1,814 @@
+#include "modelParameters2.mdl";
+
+if (!SKIP_MODEL_PARAMETER_LIST)
+{
+	if (modelType == 1)
+	{
+		#include "defineGamma.mdl";
+	}	
+	if (modelType == 2)
+	{
+		#include "defineHM.mdl";
+	}
+}
+
+function PopulateModelMatrix (ModelMatrixName&, EFV)
+{
+	ModelMatrixName = {20,20};
+	if (categoriesUsed)
+	{
+       ModelMatrixName[14][0]:=c*t*1.75252;
+ModelMatrixName[0][14]:=c*t*1.75252;
+ModelMatrixName[11][0]:=c*t*1.61995;
+ModelMatrixName[0][11]:=c*t*1.61995;
+ModelMatrixName[11][14]:=c*t*2.0187;
+ModelMatrixName[14][11]:=c*t*2.0187;
+ModelMatrixName[2][0]:=c*t*2.34804;
+ModelMatrixName[0][2]:=c*t*2.34804;
+ModelMatrixName[2][14]:=c*t*0.468033;
+ModelMatrixName[14][2]:=c*t*0.468033;
+ModelMatrixName[2][11]:=c*t*17.251;
+ModelMatrixName[11][2]:=c*t*17.251;
+ModelMatrixName[1][0]:=c*t*3.26324;
+ModelMatrixName[0][1]:=c*t*3.26324;
+ModelMatrixName[1][14]:=c*t*1.67824;
+ModelMatrixName[14][1]:=c*t*1.67824;
+ModelMatrixName[1][11]:=c*t*0.842805;
+ModelMatrixName[11][1]:=c*t*0.842805;
+ModelMatrixName[1][2]:=c*t*0.0962568;
+ModelMatrixName[2][1]:=c*t*0.0962568;
+ModelMatrixName[13][0]:=c*t*2.88691;
+ModelMatrixName[0][13]:=c*t*2.88691;
+ModelMatrixName[13][14]:=c*t*9.64477;
+ModelMatrixName[14][13]:=c*t*9.64477;
+ModelMatrixName[13][11]:=c*t*4.90465;
+ModelMatrixName[11][13]:=c*t*4.90465;
+ModelMatrixName[13][2]:=c*t*1.95972;
+ModelMatrixName[2][13]:=c*t*1.95972;
+ModelMatrixName[13][1]:=c*t*0.313977;
+ModelMatrixName[1][13]:=c*t*0.313977;
+ModelMatrixName[3][0]:=c*t*5.02923;
+ModelMatrixName[0][3]:=c*t*5.02923;
+ModelMatrixName[3][14]:=c*t*1.39535;
+ModelMatrixName[14][3]:=c*t*1.39535;
+ModelMatrixName[3][11]:=c*t*3.00956;
+ModelMatrixName[11][3]:=c*t*3.00956;
+ModelMatrixName[3][2]:=c*t*19.6173;
+ModelMatrixName[2][3]:=c*t*19.6173;
+ModelMatrixName[3][1]:=c*t*0.0678423;
+ModelMatrixName[1][3]:=c*t*0.0678423;
+ModelMatrixName[3][13]:=c*t*17.3783;
+ModelMatrixName[13][3]:=c*t*17.3783;
+ModelMatrixName[5][0]:=c*t*4.50138;
+ModelMatrixName[0][5]:=c*t*4.50138;
+ModelMatrixName[5][14]:=c*t*1.85767;
+ModelMatrixName[14][5]:=c*t*1.85767;
+ModelMatrixName[5][11]:=c*t*3.57627;
+ModelMatrixName[11][5]:=c*t*3.57627;
+ModelMatrixName[5][2]:=c*t*2.75024;
+ModelMatrixName[2][5]:=c*t*2.75024;
+ModelMatrixName[5][1]:=c*t*0.974403;
+ModelMatrixName[1][5]:=c*t*0.974403;
+ModelMatrixName[5][13]:=c*t*1.04868;
+ModelMatrixName[13][5]:=c*t*1.04868;
+ModelMatrixName[5][3]:=c*t*1.80382;
+ModelMatrixName[3][5]:=c*t*1.80382;
+ModelMatrixName[6][0]:=c*t*1.00707;
+ModelMatrixName[0][6]:=c*t*1.00707;
+ModelMatrixName[6][14]:=c*t*6.79042;
+ModelMatrixName[14][6]:=c*t*6.79042;
+ModelMatrixName[6][11]:=c*t*12.5704;
+ModelMatrixName[11][6]:=c*t*12.5704;
+ModelMatrixName[6][2]:=c*t*2.95706;
+ModelMatrixName[2][6]:=c*t*2.95706;
+ModelMatrixName[6][1]:=c*t*0.791065;
+ModelMatrixName[1][6]:=c*t*0.791065;
+ModelMatrixName[6][13]:=c*t*13.6438;
+ModelMatrixName[13][6]:=c*t*13.6438;
+ModelMatrixName[6][3]:=c*t*1.81116;
+ModelMatrixName[3][6]:=c*t*1.81116;
+ModelMatrixName[6][5]:=c*t*0.792457;
+ModelMatrixName[5][6]:=c*t*0.792457;
+ModelMatrixName[7][0]:=c*t*0.614288;
+ModelMatrixName[0][7]:=c*t*0.614288;
+ModelMatrixName[7][14]:=c*t*0.594093;
+ModelMatrixName[14][7]:=c*t*0.594093;
+ModelMatrixName[7][11]:=c*t*1.76099;
+ModelMatrixName[11][7]:=c*t*1.76099;
+ModelMatrixName[7][2]:=c*t*0.125304;
+ModelMatrixName[2][7]:=c*t*0.125304;
+ModelMatrixName[7][1]:=c*t*0.540574;
+ModelMatrixName[1][7]:=c*t*0.540574;
+ModelMatrixName[7][13]:=c*t*0.361952;
+ModelMatrixName[13][7]:=c*t*0.361952;
+ModelMatrixName[7][3]:=c*t*0.404776;
+ModelMatrixName[3][7]:=c*t*0.404776;
+ModelMatrixName[7][5]:=c*t*0.0967499;
+ModelMatrixName[5][7]:=c*t*0.0967499;
+ModelMatrixName[7][6]:=c*t*0.439075;
+ModelMatrixName[6][7]:=c*t*0.439075;
+ModelMatrixName[9][0]:=c*t*1.26431;
+ModelMatrixName[0][9]:=c*t*1.26431;
+ModelMatrixName[9][14]:=c*t*1.58126;
+ModelMatrixName[14][9]:=c*t*1.58126;
+ModelMatrixName[9][11]:=c*t*0.417907;
+ModelMatrixName[11][9]:=c*t*0.417907;
+ModelMatrixName[9][2]:=c*t*0.269452;
+ModelMatrixName[2][9]:=c*t*0.269452;
+ModelMatrixName[9][1]:=c*t*1.22101;
+ModelMatrixName[1][9]:=c*t*1.22101;
+ModelMatrixName[9][13]:=c*t*2.76265;
+ModelMatrixName[13][9]:=c*t*2.76265;
+ModelMatrixName[9][3]:=c*t*0.490144;
+ModelMatrixName[3][9]:=c*t*0.490144;
+ModelMatrixName[9][5]:=c*t*0.194782;
+ModelMatrixName[5][9]:=c*t*0.194782;
+ModelMatrixName[9][6]:=c*t*1.58695;
+ModelMatrixName[6][9]:=c*t*1.58695;
+ModelMatrixName[9][7]:=c*t*10.0752;
+ModelMatrixName[7][9]:=c*t*10.0752;
+ModelMatrixName[8][0]:=c*t*2.8795;
+ModelMatrixName[0][8]:=c*t*2.8795;
+ModelMatrixName[8][14]:=c*t*17.0032;
+ModelMatrixName[14][8]:=c*t*17.0032;
+ModelMatrixName[8][11]:=c*t*9.57014;
+ModelMatrixName[11][8]:=c*t*9.57014;
+ModelMatrixName[8][2]:=c*t*1.52466;
+ModelMatrixName[2][8]:=c*t*1.52466;
+ModelMatrixName[8][1]:=c*t*0.23523;
+ModelMatrixName[1][8]:=c*t*0.23523;
+ModelMatrixName[8][13]:=c*t*12.3754;
+ModelMatrixName[13][8]:=c*t*12.3754;
+ModelMatrixName[8][3]:=c*t*8.21158;
+ModelMatrixName[3][8]:=c*t*8.21158;
+ModelMatrixName[8][5]:=c*t*1.18692;
+ModelMatrixName[5][8]:=c*t*1.18692;
+ModelMatrixName[8][6]:=c*t*2.82919;
+ModelMatrixName[6][8]:=c*t*2.82919;
+ModelMatrixName[8][7]:=c*t*1.02892;
+ModelMatrixName[7][8]:=c*t*1.02892;
+ModelMatrixName[8][9]:=c*t*0.818336;
+ModelMatrixName[9][8]:=c*t*0.818336;
+ModelMatrixName[10][0]:=c*t*2.83893;
+ModelMatrixName[0][10]:=c*t*2.83893;
+ModelMatrixName[10][14]:=c*t*2.17063;
+ModelMatrixName[14][10]:=c*t*2.17063;
+ModelMatrixName[10][11]:=c*t*0.629813;
+ModelMatrixName[11][10]:=c*t*0.629813;
+ModelMatrixName[10][2]:=c*t*0.32966;
+ModelMatrixName[2][10]:=c*t*0.32966;
+ModelMatrixName[10][1]:=c*t*1.24069;
+ModelMatrixName[1][10]:=c*t*1.24069;
+ModelMatrixName[10][13]:=c*t*4.9098;
+ModelMatrixName[13][10]:=c*t*4.9098;
+ModelMatrixName[10][3]:=c*t*1.00125;
+ModelMatrixName[3][10]:=c*t*1.00125;
+ModelMatrixName[10][5]:=c*t*0.553173;
+ModelMatrixName[5][10]:=c*t*0.553173;
+ModelMatrixName[10][6]:=c*t*1.28409;
+ModelMatrixName[6][10]:=c*t*1.28409;
+ModelMatrixName[10][7]:=c*t*13.5273;
+ModelMatrixName[7][10]:=c*t*13.5273;
+ModelMatrixName[10][9]:=c*t*15.4228;
+ModelMatrixName[9][10]:=c*t*15.4228;
+ModelMatrixName[10][8]:=c*t*2.9685;
+ModelMatrixName[8][10]:=c*t*2.9685;
+ModelMatrixName[4][0]:=c*t*0.668808;
+ModelMatrixName[0][4]:=c*t*0.668808;
+ModelMatrixName[4][14]:=c*t*0.326346;
+ModelMatrixName[14][4]:=c*t*0.326346;
+ModelMatrixName[4][11]:=c*t*0.305538;
+ModelMatrixName[11][4]:=c*t*0.305538;
+ModelMatrixName[4][2]:=c*t*0.148478;
+ModelMatrixName[2][4]:=c*t*0.148478;
+ModelMatrixName[4][1]:=c*t*1.26464;
+ModelMatrixName[1][4]:=c*t*1.26464;
+ModelMatrixName[4][13]:=c*t*0.317481;
+ModelMatrixName[13][4]:=c*t*0.317481;
+ModelMatrixName[4][3]:=c*t*0.257789;
+ModelMatrixName[3][4]:=c*t*0.257789;
+ModelMatrixName[4][5]:=c*t*0.158647;
+ModelMatrixName[5][4]:=c*t*0.158647;
+ModelMatrixName[4][6]:=c*t*2.15858;
+ModelMatrixName[6][4]:=c*t*2.15858;
+ModelMatrixName[4][7]:=c*t*3.36628;
+ModelMatrixName[7][4]:=c*t*3.36628;
+ModelMatrixName[4][9]:=c*t*6.72059;
+ModelMatrixName[9][4]:=c*t*6.72059;
+ModelMatrixName[4][8]:=c*t*0.282261;
+ModelMatrixName[8][4]:=c*t*0.282261;
+ModelMatrixName[4][10]:=c*t*3.78302;
+ModelMatrixName[10][4]:=c*t*3.78302;
+ModelMatrixName[12][0]:=c*t*4.57074;
+ModelMatrixName[0][12]:=c*t*4.57074;
+ModelMatrixName[12][14]:=c*t*2.15896;
+ModelMatrixName[14][12]:=c*t*2.15896;
+ModelMatrixName[12][11]:=c*t*0.619836;
+ModelMatrixName[11][12]:=c*t*0.619836;
+ModelMatrixName[12][2]:=c*t*1.34714;
+ModelMatrixName[2][12]:=c*t*1.34714;
+ModelMatrixName[12][1]:=c*t*0.347612;
+ModelMatrixName[1][12]:=c*t*0.347612;
+ModelMatrixName[12][13]:=c*t*2.96563;
+ModelMatrixName[13][12]:=c*t*2.96563;
+ModelMatrixName[12][3]:=c*t*2.16806;
+ModelMatrixName[3][12]:=c*t*2.16806;
+ModelMatrixName[12][5]:=c*t*0.773901;
+ModelMatrixName[5][12]:=c*t*0.773901;
+ModelMatrixName[12][6]:=c*t*2.21205;
+ModelMatrixName[6][12]:=c*t*2.21205;
+ModelMatrixName[12][7]:=c*t*0.317506;
+ModelMatrixName[7][12]:=c*t*0.317506;
+ModelMatrixName[12][9]:=c*t*1.32127;
+ModelMatrixName[9][12]:=c*t*1.32127;
+ModelMatrixName[12][8]:=c*t*1.76944;
+ModelMatrixName[8][12]:=c*t*1.76944;
+ModelMatrixName[12][10]:=c*t*0.544368;
+ModelMatrixName[10][12]:=c*t*0.544368;
+ModelMatrixName[12][4]:=c*t*0.51296;
+ModelMatrixName[4][12]:=c*t*0.51296;
+ModelMatrixName[15][0]:=c*t*10.7101;
+ModelMatrixName[0][15]:=c*t*10.7101;
+ModelMatrixName[15][14]:=c*t*3.88965;
+ModelMatrixName[14][15]:=c*t*3.88965;
+ModelMatrixName[15][11]:=c*t*12.6274;
+ModelMatrixName[11][15]:=c*t*12.6274;
+ModelMatrixName[15][2]:=c*t*3.40533;
+ModelMatrixName[2][15]:=c*t*3.40533;
+ModelMatrixName[15][1]:=c*t*4.4726;
+ModelMatrixName[1][15]:=c*t*4.4726;
+ModelMatrixName[15][13]:=c*t*3.26906;
+ModelMatrixName[13][15]:=c*t*3.26906;
+ModelMatrixName[15][3]:=c*t*2.23982;
+ModelMatrixName[3][15]:=c*t*2.23982;
+ModelMatrixName[15][5]:=c*t*4.2634;
+ModelMatrixName[5][15]:=c*t*4.2634;
+ModelMatrixName[15][6]:=c*t*2.35176;
+ModelMatrixName[6][15]:=c*t*2.35176;
+ModelMatrixName[15][7]:=c*t*1.01497;
+ModelMatrixName[7][15]:=c*t*1.01497;
+ModelMatrixName[15][9]:=c*t*1.09535;
+ModelMatrixName[9][15]:=c*t*1.09535;
+ModelMatrixName[15][8]:=c*t*3.07289;
+ModelMatrixName[8][15]:=c*t*3.07289;
+ModelMatrixName[15][10]:=c*t*1.5693;
+ModelMatrixName[10][15]:=c*t*1.5693;
+ModelMatrixName[15][4]:=c*t*1.7346;
+ModelMatrixName[4][15]:=c*t*1.7346;
+ModelMatrixName[15][12]:=c*t*5.12592;
+ModelMatrixName[12][15]:=c*t*5.12592;
+ModelMatrixName[16][0]:=c*t*6.73946;
+ModelMatrixName[0][16]:=c*t*6.73946;
+ModelMatrixName[16][14]:=c*t*1.76155;
+ModelMatrixName[14][16]:=c*t*1.76155;
+ModelMatrixName[16][11]:=c*t*6.45016;
+ModelMatrixName[11][16]:=c*t*6.45016;
+ModelMatrixName[16][2]:=c*t*1.19107;
+ModelMatrixName[2][16]:=c*t*1.19107;
+ModelMatrixName[16][1]:=c*t*1.62992;
+ModelMatrixName[1][16]:=c*t*1.62992;
+ModelMatrixName[16][13]:=c*t*2.72592;
+ModelMatrixName[13][16]:=c*t*2.72592;
+ModelMatrixName[16][3]:=c*t*2.61419;
+ModelMatrixName[3][16]:=c*t*2.61419;
+ModelMatrixName[16][5]:=c*t*0.717545;
+ModelMatrixName[5][16]:=c*t*0.717545;
+ModelMatrixName[16][6]:=c*t*1.50385;
+ModelMatrixName[6][16]:=c*t*1.50385;
+ModelMatrixName[16][7]:=c*t*4.63305;
+ModelMatrixName[7][16]:=c*t*4.63305;
+ModelMatrixName[16][9]:=c*t*1.03778;
+ModelMatrixName[9][16]:=c*t*1.03778;
+ModelMatrixName[16][8]:=c*t*4.40689;
+ModelMatrixName[8][16]:=c*t*4.40689;
+ModelMatrixName[16][10]:=c*t*4.81721;
+ModelMatrixName[10][16]:=c*t*4.81721;
+ModelMatrixName[16][4]:=c*t*0.546192;
+ModelMatrixName[4][16]:=c*t*0.546192;
+ModelMatrixName[16][12]:=c*t*2.52719;
+ModelMatrixName[12][16]:=c*t*2.52719;
+ModelMatrixName[16][15]:=c*t*13.9104;
+ModelMatrixName[15][16]:=c*t*13.9104;
+ModelMatrixName[18][0]:=c*t*0.35946;
+ModelMatrixName[0][18]:=c*t*0.35946;
+ModelMatrixName[18][14]:=c*t*3.69815;
+ModelMatrixName[14][18]:=c*t*3.69815;
+ModelMatrixName[18][11]:=c*t*0.228503;
+ModelMatrixName[11][18]:=c*t*0.228503;
+ModelMatrixName[18][2]:=c*t*0.412312;
+ModelMatrixName[2][18]:=c*t*0.412312;
+ModelMatrixName[18][1]:=c*t*2.27837;
+ModelMatrixName[1][18]:=c*t*2.27837;
+ModelMatrixName[18][13]:=c*t*0.685467;
+ModelMatrixName[13][18]:=c*t*0.685467;
+ModelMatrixName[18][3]:=c*t*0.497433;
+ModelMatrixName[3][18]:=c*t*0.497433;
+ModelMatrixName[18][5]:=c*t*1.07071;
+ModelMatrixName[5][18]:=c*t*1.07071;
+ModelMatrixName[18][6]:=c*t*0.834267;
+ModelMatrixName[6][18]:=c*t*0.834267;
+ModelMatrixName[18][7]:=c*t*0.675128;
+ModelMatrixName[7][18]:=c*t*0.675128;
+ModelMatrixName[18][9]:=c*t*2.1139;
+ModelMatrixName[9][18]:=c*t*2.1139;
+ModelMatrixName[18][8]:=c*t*0.436898;
+ModelMatrixName[8][18]:=c*t*0.436898;
+ModelMatrixName[18][10]:=c*t*1.63857;
+ModelMatrixName[10][18]:=c*t*1.63857;
+ModelMatrixName[18][4]:=c*t*4.86017;
+ModelMatrixName[4][18]:=c*t*4.86017;
+ModelMatrixName[18][12]:=c*t*0.442935;
+ModelMatrixName[12][18]:=c*t*0.442935;
+ModelMatrixName[18][15]:=c*t*1.6641;
+ModelMatrixName[15][18]:=c*t*1.6641;
+ModelMatrixName[18][16]:=c*t*0.352251;
+ModelMatrixName[16][18]:=c*t*0.352251;
+ModelMatrixName[19][0]:=c*t*0.764894;
+ModelMatrixName[0][19]:=c*t*0.764894;
+ModelMatrixName[19][14]:=c*t*1.21225;
+ModelMatrixName[14][19]:=c*t*1.21225;
+ModelMatrixName[19][11]:=c*t*3.45058;
+ModelMatrixName[11][19]:=c*t*3.45058;
+ModelMatrixName[19][2]:=c*t*1.03489;
+ModelMatrixName[2][19]:=c*t*1.03489;
+ModelMatrixName[19][1]:=c*t*1.72794;
+ModelMatrixName[1][19]:=c*t*1.72794;
+ModelMatrixName[19][13]:=c*t*0.723509;
+ModelMatrixName[13][19]:=c*t*0.723509;
+ModelMatrixName[19][3]:=c*t*0.623719;
+ModelMatrixName[3][19]:=c*t*0.623719;
+ModelMatrixName[19][5]:=c*t*0.329184;
+ModelMatrixName[5][19]:=c*t*0.329184;
+ModelMatrixName[19][6]:=c*t*12.3072;
+ModelMatrixName[6][19]:=c*t*12.3072;
+ModelMatrixName[19][7]:=c*t*1.33502;
+ModelMatrixName[7][19]:=c*t*1.33502;
+ModelMatrixName[19][9]:=c*t*1.26654;
+ModelMatrixName[9][19]:=c*t*1.26654;
+ModelMatrixName[19][8]:=c*t*0.423423;
+ModelMatrixName[8][19]:=c*t*0.423423;
+ModelMatrixName[19][10]:=c*t*1.36128;
+ModelMatrixName[10][19]:=c*t*1.36128;
+ModelMatrixName[19][4]:=c*t*20.5074;
+ModelMatrixName[4][19]:=c*t*20.5074;
+ModelMatrixName[19][12]:=c*t*0.686449;
+ModelMatrixName[12][19]:=c*t*0.686449;
+ModelMatrixName[19][15]:=c*t*2.50053;
+ModelMatrixName[15][19]:=c*t*2.50053;
+ModelMatrixName[19][16]:=c*t*0.925072;
+ModelMatrixName[16][19]:=c*t*0.925072;
+ModelMatrixName[19][18]:=c*t*7.8969;
+ModelMatrixName[18][19]:=c*t*7.8969;
+ModelMatrixName[17][0]:=c*t*6.37375;
+ModelMatrixName[0][17]:=c*t*6.37375;
+ModelMatrixName[17][14]:=c*t*0.800207;
+ModelMatrixName[14][17]:=c*t*0.800207;
+ModelMatrixName[17][11]:=c*t*0.623538;
+ModelMatrixName[11][17]:=c*t*0.623538;
+ModelMatrixName[17][2]:=c*t*0.484018;
+ModelMatrixName[2][17]:=c*t*0.484018;
+ModelMatrixName[17][1]:=c*t*3.18413;
+ModelMatrixName[1][17]:=c*t*3.18413;
+ModelMatrixName[17][13]:=c*t*0.957268;
+ModelMatrixName[13][17]:=c*t*0.957268;
+ModelMatrixName[17][3]:=c*t*1.87059;
+ModelMatrixName[3][17]:=c*t*1.87059;
+ModelMatrixName[17][5]:=c*t*0.594945;
+ModelMatrixName[5][17]:=c*t*0.594945;
+ModelMatrixName[17][6]:=c*t*0.376062;
+ModelMatrixName[6][17]:=c*t*0.376062;
+ModelMatrixName[17][7]:=c*t*24.8508;
+ModelMatrixName[7][17]:=c*t*24.8508;
+ModelMatrixName[17][9]:=c*t*5.72027;
+ModelMatrixName[9][17]:=c*t*5.72027;
+ModelMatrixName[17][8]:=c*t*0.970464;
+ModelMatrixName[8][17]:=c*t*0.970464;
+ModelMatrixName[17][10]:=c*t*6.54037;
+ModelMatrixName[10][17]:=c*t*6.54037;
+ModelMatrixName[17][4]:=c*t*2.06492;
+ModelMatrixName[4][17]:=c*t*2.06492;
+ModelMatrixName[17][12]:=c*t*1.0005;
+ModelMatrixName[12][17]:=c*t*1.0005;
+ModelMatrixName[17][15]:=c*t*0.739488;
+ModelMatrixName[15][17]:=c*t*0.739488;
+ModelMatrixName[17][16]:=c*t*4.41086;
+ModelMatrixName[16][17]:=c*t*4.41086;
+ModelMatrixName[17][18]:=c*t*1.1609;
+ModelMatrixName[18][17]:=c*t*1.1609;
+ModelMatrixName[17][19]:=c*t*1;
+ModelMatrixName[19][17]:=c*t*1;
+	}
+	else
+	{
+       ModelMatrixName[14][0]:=t*1.75252;
+ModelMatrixName[0][14]:=t*1.75252;
+ModelMatrixName[11][0]:=t*1.61995;
+ModelMatrixName[0][11]:=t*1.61995;
+ModelMatrixName[11][14]:=t*2.0187;
+ModelMatrixName[14][11]:=t*2.0187;
+ModelMatrixName[2][0]:=t*2.34804;
+ModelMatrixName[0][2]:=t*2.34804;
+ModelMatrixName[2][14]:=t*0.468033;
+ModelMatrixName[14][2]:=t*0.468033;
+ModelMatrixName[2][11]:=t*17.251;
+ModelMatrixName[11][2]:=t*17.251;
+ModelMatrixName[1][0]:=t*3.26324;
+ModelMatrixName[0][1]:=t*3.26324;
+ModelMatrixName[1][14]:=t*1.67824;
+ModelMatrixName[14][1]:=t*1.67824;
+ModelMatrixName[1][11]:=t*0.842805;
+ModelMatrixName[11][1]:=t*0.842805;
+ModelMatrixName[1][2]:=t*0.0962568;
+ModelMatrixName[2][1]:=t*0.0962568;
+ModelMatrixName[13][0]:=t*2.88691;
+ModelMatrixName[0][13]:=t*2.88691;
+ModelMatrixName[13][14]:=t*9.64477;
+ModelMatrixName[14][13]:=t*9.64477;
+ModelMatrixName[13][11]:=t*4.90465;
+ModelMatrixName[11][13]:=t*4.90465;
+ModelMatrixName[13][2]:=t*1.95972;
+ModelMatrixName[2][13]:=t*1.95972;
+ModelMatrixName[13][1]:=t*0.313977;
+ModelMatrixName[1][13]:=t*0.313977;
+ModelMatrixName[3][0]:=t*5.02923;
+ModelMatrixName[0][3]:=t*5.02923;
+ModelMatrixName[3][14]:=t*1.39535;
+ModelMatrixName[14][3]:=t*1.39535;
+ModelMatrixName[3][11]:=t*3.00956;
+ModelMatrixName[11][3]:=t*3.00956;
+ModelMatrixName[3][2]:=t*19.6173;
+ModelMatrixName[2][3]:=t*19.6173;
+ModelMatrixName[3][1]:=t*0.0678423;
+ModelMatrixName[1][3]:=t*0.0678423;
+ModelMatrixName[3][13]:=t*17.3783;
+ModelMatrixName[13][3]:=t*17.3783;
+ModelMatrixName[5][0]:=t*4.50138;
+ModelMatrixName[0][5]:=t*4.50138;
+ModelMatrixName[5][14]:=t*1.85767;
+ModelMatrixName[14][5]:=t*1.85767;
+ModelMatrixName[5][11]:=t*3.57627;
+ModelMatrixName[11][5]:=t*3.57627;
+ModelMatrixName[5][2]:=t*2.75024;
+ModelMatrixName[2][5]:=t*2.75024;
+ModelMatrixName[5][1]:=t*0.974403;
+ModelMatrixName[1][5]:=t*0.974403;
+ModelMatrixName[5][13]:=t*1.04868;
+ModelMatrixName[13][5]:=t*1.04868;
+ModelMatrixName[5][3]:=t*1.80382;
+ModelMatrixName[3][5]:=t*1.80382;
+ModelMatrixName[6][0]:=t*1.00707;
+ModelMatrixName[0][6]:=t*1.00707;
+ModelMatrixName[6][14]:=t*6.79042;
+ModelMatrixName[14][6]:=t*6.79042;
+ModelMatrixName[6][11]:=t*12.5704;
+ModelMatrixName[11][6]:=t*12.5704;
+ModelMatrixName[6][2]:=t*2.95706;
+ModelMatrixName[2][6]:=t*2.95706;
+ModelMatrixName[6][1]:=t*0.791065;
+ModelMatrixName[1][6]:=t*0.791065;
+ModelMatrixName[6][13]:=t*13.6438;
+ModelMatrixName[13][6]:=t*13.6438;
+ModelMatrixName[6][3]:=t*1.81116;
+ModelMatrixName[3][6]:=t*1.81116;
+ModelMatrixName[6][5]:=t*0.792457;
+ModelMatrixName[5][6]:=t*0.792457;
+ModelMatrixName[7][0]:=t*0.614288;
+ModelMatrixName[0][7]:=t*0.614288;
+ModelMatrixName[7][14]:=t*0.594093;
+ModelMatrixName[14][7]:=t*0.594093;
+ModelMatrixName[7][11]:=t*1.76099;
+ModelMatrixName[11][7]:=t*1.76099;
+ModelMatrixName[7][2]:=t*0.125304;
+ModelMatrixName[2][7]:=t*0.125304;
+ModelMatrixName[7][1]:=t*0.540574;
+ModelMatrixName[1][7]:=t*0.540574;
+ModelMatrixName[7][13]:=t*0.361952;
+ModelMatrixName[13][7]:=t*0.361952;
+ModelMatrixName[7][3]:=t*0.404776;
+ModelMatrixName[3][7]:=t*0.404776;
+ModelMatrixName[7][5]:=t*0.0967499;
+ModelMatrixName[5][7]:=t*0.0967499;
+ModelMatrixName[7][6]:=t*0.439075;
+ModelMatrixName[6][7]:=t*0.439075;
+ModelMatrixName[9][0]:=t*1.26431;
+ModelMatrixName[0][9]:=t*1.26431;
+ModelMatrixName[9][14]:=t*1.58126;
+ModelMatrixName[14][9]:=t*1.58126;
+ModelMatrixName[9][11]:=t*0.417907;
+ModelMatrixName[11][9]:=t*0.417907;
+ModelMatrixName[9][2]:=t*0.269452;
+ModelMatrixName[2][9]:=t*0.269452;
+ModelMatrixName[9][1]:=t*1.22101;
+ModelMatrixName[1][9]:=t*1.22101;
+ModelMatrixName[9][13]:=t*2.76265;
+ModelMatrixName[13][9]:=t*2.76265;
+ModelMatrixName[9][3]:=t*0.490144;
+ModelMatrixName[3][9]:=t*0.490144;
+ModelMatrixName[9][5]:=t*0.194782;
+ModelMatrixName[5][9]:=t*0.194782;
+ModelMatrixName[9][6]:=t*1.58695;
+ModelMatrixName[6][9]:=t*1.58695;
+ModelMatrixName[9][7]:=t*10.0752;
+ModelMatrixName[7][9]:=t*10.0752;
+ModelMatrixName[8][0]:=t*2.8795;
+ModelMatrixName[0][8]:=t*2.8795;
+ModelMatrixName[8][14]:=t*17.0032;
+ModelMatrixName[14][8]:=t*17.0032;
+ModelMatrixName[8][11]:=t*9.57014;
+ModelMatrixName[11][8]:=t*9.57014;
+ModelMatrixName[8][2]:=t*1.52466;
+ModelMatrixName[2][8]:=t*1.52466;
+ModelMatrixName[8][1]:=t*0.23523;
+ModelMatrixName[1][8]:=t*0.23523;
+ModelMatrixName[8][13]:=t*12.3754;
+ModelMatrixName[13][8]:=t*12.3754;
+ModelMatrixName[8][3]:=t*8.21158;
+ModelMatrixName[3][8]:=t*8.21158;
+ModelMatrixName[8][5]:=t*1.18692;
+ModelMatrixName[5][8]:=t*1.18692;
+ModelMatrixName[8][6]:=t*2.82919;
+ModelMatrixName[6][8]:=t*2.82919;
+ModelMatrixName[8][7]:=t*1.02892;
+ModelMatrixName[7][8]:=t*1.02892;
+ModelMatrixName[8][9]:=t*0.818336;
+ModelMatrixName[9][8]:=t*0.818336;
+ModelMatrixName[10][0]:=t*2.83893;
+ModelMatrixName[0][10]:=t*2.83893;
+ModelMatrixName[10][14]:=t*2.17063;
+ModelMatrixName[14][10]:=t*2.17063;
+ModelMatrixName[10][11]:=t*0.629813;
+ModelMatrixName[11][10]:=t*0.629813;
+ModelMatrixName[10][2]:=t*0.32966;
+ModelMatrixName[2][10]:=t*0.32966;
+ModelMatrixName[10][1]:=t*1.24069;
+ModelMatrixName[1][10]:=t*1.24069;
+ModelMatrixName[10][13]:=t*4.9098;
+ModelMatrixName[13][10]:=t*4.9098;
+ModelMatrixName[10][3]:=t*1.00125;
+ModelMatrixName[3][10]:=t*1.00125;
+ModelMatrixName[10][5]:=t*0.553173;
+ModelMatrixName[5][10]:=t*0.553173;
+ModelMatrixName[10][6]:=t*1.28409;
+ModelMatrixName[6][10]:=t*1.28409;
+ModelMatrixName[10][7]:=t*13.5273;
+ModelMatrixName[7][10]:=t*13.5273;
+ModelMatrixName[10][9]:=t*15.4228;
+ModelMatrixName[9][10]:=t*15.4228;
+ModelMatrixName[10][8]:=t*2.9685;
+ModelMatrixName[8][10]:=t*2.9685;
+ModelMatrixName[4][0]:=t*0.668808;
+ModelMatrixName[0][4]:=t*0.668808;
+ModelMatrixName[4][14]:=t*0.326346;
+ModelMatrixName[14][4]:=t*0.326346;
+ModelMatrixName[4][11]:=t*0.305538;
+ModelMatrixName[11][4]:=t*0.305538;
+ModelMatrixName[4][2]:=t*0.148478;
+ModelMatrixName[2][4]:=t*0.148478;
+ModelMatrixName[4][1]:=t*1.26464;
+ModelMatrixName[1][4]:=t*1.26464;
+ModelMatrixName[4][13]:=t*0.317481;
+ModelMatrixName[13][4]:=t*0.317481;
+ModelMatrixName[4][3]:=t*0.257789;
+ModelMatrixName[3][4]:=t*0.257789;
+ModelMatrixName[4][5]:=t*0.158647;
+ModelMatrixName[5][4]:=t*0.158647;
+ModelMatrixName[4][6]:=t*2.15858;
+ModelMatrixName[6][4]:=t*2.15858;
+ModelMatrixName[4][7]:=t*3.36628;
+ModelMatrixName[7][4]:=t*3.36628;
+ModelMatrixName[4][9]:=t*6.72059;
+ModelMatrixName[9][4]:=t*6.72059;
+ModelMatrixName[4][8]:=t*0.282261;
+ModelMatrixName[8][4]:=t*0.282261;
+ModelMatrixName[4][10]:=t*3.78302;
+ModelMatrixName[10][4]:=t*3.78302;
+ModelMatrixName[12][0]:=t*4.57074;
+ModelMatrixName[0][12]:=t*4.57074;
+ModelMatrixName[12][14]:=t*2.15896;
+ModelMatrixName[14][12]:=t*2.15896;
+ModelMatrixName[12][11]:=t*0.619836;
+ModelMatrixName[11][12]:=t*0.619836;
+ModelMatrixName[12][2]:=t*1.34714;
+ModelMatrixName[2][12]:=t*1.34714;
+ModelMatrixName[12][1]:=t*0.347612;
+ModelMatrixName[1][12]:=t*0.347612;
+ModelMatrixName[12][13]:=t*2.96563;
+ModelMatrixName[13][12]:=t*2.96563;
+ModelMatrixName[12][3]:=t*2.16806;
+ModelMatrixName[3][12]:=t*2.16806;
+ModelMatrixName[12][5]:=t*0.773901;
+ModelMatrixName[5][12]:=t*0.773901;
+ModelMatrixName[12][6]:=t*2.21205;
+ModelMatrixName[6][12]:=t*2.21205;
+ModelMatrixName[12][7]:=t*0.317506;
+ModelMatrixName[7][12]:=t*0.317506;
+ModelMatrixName[12][9]:=t*1.32127;
+ModelMatrixName[9][12]:=t*1.32127;
+ModelMatrixName[12][8]:=t*1.76944;
+ModelMatrixName[8][12]:=t*1.76944;
+ModelMatrixName[12][10]:=t*0.544368;
+ModelMatrixName[10][12]:=t*0.544368;
+ModelMatrixName[12][4]:=t*0.51296;
+ModelMatrixName[4][12]:=t*0.51296;
+ModelMatrixName[15][0]:=t*10.7101;
+ModelMatrixName[0][15]:=t*10.7101;
+ModelMatrixName[15][14]:=t*3.88965;
+ModelMatrixName[14][15]:=t*3.88965;
+ModelMatrixName[15][11]:=t*12.6274;
+ModelMatrixName[11][15]:=t*12.6274;
+ModelMatrixName[15][2]:=t*3.40533;
+ModelMatrixName[2][15]:=t*3.40533;
+ModelMatrixName[15][1]:=t*4.4726;
+ModelMatrixName[1][15]:=t*4.4726;
+ModelMatrixName[15][13]:=t*3.26906;
+ModelMatrixName[13][15]:=t*3.26906;
+ModelMatrixName[15][3]:=t*2.23982;
+ModelMatrixName[3][15]:=t*2.23982;
+ModelMatrixName[15][5]:=t*4.2634;
+ModelMatrixName[5][15]:=t*4.2634;
+ModelMatrixName[15][6]:=t*2.35176;
+ModelMatrixName[6][15]:=t*2.35176;
+ModelMatrixName[15][7]:=t*1.01497;
+ModelMatrixName[7][15]:=t*1.01497;
+ModelMatrixName[15][9]:=t*1.09535;
+ModelMatrixName[9][15]:=t*1.09535;
+ModelMatrixName[15][8]:=t*3.07289;
+ModelMatrixName[8][15]:=t*3.07289;
+ModelMatrixName[15][10]:=t*1.5693;
+ModelMatrixName[10][15]:=t*1.5693;
+ModelMatrixName[15][4]:=t*1.7346;
+ModelMatrixName[4][15]:=t*1.7346;
+ModelMatrixName[15][12]:=t*5.12592;
+ModelMatrixName[12][15]:=t*5.12592;
+ModelMatrixName[16][0]:=t*6.73946;
+ModelMatrixName[0][16]:=t*6.73946;
+ModelMatrixName[16][14]:=t*1.76155;
+ModelMatrixName[14][16]:=t*1.76155;
+ModelMatrixName[16][11]:=t*6.45016;
+ModelMatrixName[11][16]:=t*6.45016;
+ModelMatrixName[16][2]:=t*1.19107;
+ModelMatrixName[2][16]:=t*1.19107;
+ModelMatrixName[16][1]:=t*1.62992;
+ModelMatrixName[1][16]:=t*1.62992;
+ModelMatrixName[16][13]:=t*2.72592;
+ModelMatrixName[13][16]:=t*2.72592;
+ModelMatrixName[16][3]:=t*2.61419;
+ModelMatrixName[3][16]:=t*2.61419;
+ModelMatrixName[16][5]:=t*0.717545;
+ModelMatrixName[5][16]:=t*0.717545;
+ModelMatrixName[16][6]:=t*1.50385;
+ModelMatrixName[6][16]:=t*1.50385;
+ModelMatrixName[16][7]:=t*4.63305;
+ModelMatrixName[7][16]:=t*4.63305;
+ModelMatrixName[16][9]:=t*1.03778;
+ModelMatrixName[9][16]:=t*1.03778;
+ModelMatrixName[16][8]:=t*4.40689;
+ModelMatrixName[8][16]:=t*4.40689;
+ModelMatrixName[16][10]:=t*4.81721;
+ModelMatrixName[10][16]:=t*4.81721;
+ModelMatrixName[16][4]:=t*0.546192;
+ModelMatrixName[4][16]:=t*0.546192;
+ModelMatrixName[16][12]:=t*2.52719;
+ModelMatrixName[12][16]:=t*2.52719;
+ModelMatrixName[16][15]:=t*13.9104;
+ModelMatrixName[15][16]:=t*13.9104;
+ModelMatrixName[18][0]:=t*0.35946;
+ModelMatrixName[0][18]:=t*0.35946;
+ModelMatrixName[18][14]:=t*3.69815;
+ModelMatrixName[14][18]:=t*3.69815;
+ModelMatrixName[18][11]:=t*0.228503;
+ModelMatrixName[11][18]:=t*0.228503;
+ModelMatrixName[18][2]:=t*0.412312;
+ModelMatrixName[2][18]:=t*0.412312;
+ModelMatrixName[18][1]:=t*2.27837;
+ModelMatrixName[1][18]:=t*2.27837;
+ModelMatrixName[18][13]:=t*0.685467;
+ModelMatrixName[13][18]:=t*0.685467;
+ModelMatrixName[18][3]:=t*0.497433;
+ModelMatrixName[3][18]:=t*0.497433;
+ModelMatrixName[18][5]:=t*1.07071;
+ModelMatrixName[5][18]:=t*1.07071;
+ModelMatrixName[18][6]:=t*0.834267;
+ModelMatrixName[6][18]:=t*0.834267;
+ModelMatrixName[18][7]:=t*0.675128;
+ModelMatrixName[7][18]:=t*0.675128;
+ModelMatrixName[18][9]:=t*2.1139;
+ModelMatrixName[9][18]:=t*2.1139;
+ModelMatrixName[18][8]:=t*0.436898;
+ModelMatrixName[8][18]:=t*0.436898;
+ModelMatrixName[18][10]:=t*1.63857;
+ModelMatrixName[10][18]:=t*1.63857;
+ModelMatrixName[18][4]:=t*4.86017;
+ModelMatrixName[4][18]:=t*4.86017;
+ModelMatrixName[18][12]:=t*0.442935;
+ModelMatrixName[12][18]:=t*0.442935;
+ModelMatrixName[18][15]:=t*1.6641;
+ModelMatrixName[15][18]:=t*1.6641;
+ModelMatrixName[18][16]:=t*0.352251;
+ModelMatrixName[16][18]:=t*0.352251;
+ModelMatrixName[19][0]:=t*0.764894;
+ModelMatrixName[0][19]:=t*0.764894;
+ModelMatrixName[19][14]:=t*1.21225;
+ModelMatrixName[14][19]:=t*1.21225;
+ModelMatrixName[19][11]:=t*3.45058;
+ModelMatrixName[11][19]:=t*3.45058;
+ModelMatrixName[19][2]:=t*1.03489;
+ModelMatrixName[2][19]:=t*1.03489;
+ModelMatrixName[19][1]:=t*1.72794;
+ModelMatrixName[1][19]:=t*1.72794;
+ModelMatrixName[19][13]:=t*0.723509;
+ModelMatrixName[13][19]:=t*0.723509;
+ModelMatrixName[19][3]:=t*0.623719;
+ModelMatrixName[3][19]:=t*0.623719;
+ModelMatrixName[19][5]:=t*0.329184;
+ModelMatrixName[5][19]:=t*0.329184;
+ModelMatrixName[19][6]:=t*12.3072;
+ModelMatrixName[6][19]:=t*12.3072;
+ModelMatrixName[19][7]:=t*1.33502;
+ModelMatrixName[7][19]:=t*1.33502;
+ModelMatrixName[19][9]:=t*1.26654;
+ModelMatrixName[9][19]:=t*1.26654;
+ModelMatrixName[19][8]:=t*0.423423;
+ModelMatrixName[8][19]:=t*0.423423;
+ModelMatrixName[19][10]:=t*1.36128;
+ModelMatrixName[10][19]:=t*1.36128;
+ModelMatrixName[19][4]:=t*20.5074;
+ModelMatrixName[4][19]:=t*20.5074;
+ModelMatrixName[19][12]:=t*0.686449;
+ModelMatrixName[12][19]:=t*0.686449;
+ModelMatrixName[19][15]:=t*2.50053;
+ModelMatrixName[15][19]:=t*2.50053;
+ModelMatrixName[19][16]:=t*0.925072;
+ModelMatrixName[16][19]:=t*0.925072;
+ModelMatrixName[19][18]:=t*7.8969;
+ModelMatrixName[18][19]:=t*7.8969;
+ModelMatrixName[17][0]:=t*6.37375;
+ModelMatrixName[0][17]:=t*6.37375;
+ModelMatrixName[17][14]:=t*0.800207;
+ModelMatrixName[14][17]:=t*0.800207;
+ModelMatrixName[17][11]:=t*0.623538;
+ModelMatrixName[11][17]:=t*0.623538;
+ModelMatrixName[17][2]:=t*0.484018;
+ModelMatrixName[2][17]:=t*0.484018;
+ModelMatrixName[17][1]:=t*3.18413;
+ModelMatrixName[1][17]:=t*3.18413;
+ModelMatrixName[17][13]:=t*0.957268;
+ModelMatrixName[13][17]:=t*0.957268;
+ModelMatrixName[17][3]:=t*1.87059;
+ModelMatrixName[3][17]:=t*1.87059;
+ModelMatrixName[17][5]:=t*0.594945;
+ModelMatrixName[5][17]:=t*0.594945;
+ModelMatrixName[17][6]:=t*0.376062;
+ModelMatrixName[6][17]:=t*0.376062;
+ModelMatrixName[17][7]:=t*24.8508;
+ModelMatrixName[7][17]:=t*24.8508;
+ModelMatrixName[17][9]:=t*5.72027;
+ModelMatrixName[9][17]:=t*5.72027;
+ModelMatrixName[17][8]:=t*0.970464;
+ModelMatrixName[8][17]:=t*0.970464;
+ModelMatrixName[17][10]:=t*6.54037;
+ModelMatrixName[10][17]:=t*6.54037;
+ModelMatrixName[17][4]:=t*2.06492;
+ModelMatrixName[4][17]:=t*2.06492;
+ModelMatrixName[17][12]:=t*1.0005;
+ModelMatrixName[12][17]:=t*1.0005;
+ModelMatrixName[17][15]:=t*0.739488;
+ModelMatrixName[15][17]:=t*0.739488;
+ModelMatrixName[17][16]:=t*4.41086;
+ModelMatrixName[16][17]:=t*4.41086;
+ModelMatrixName[17][18]:=t*1.1609;
+ModelMatrixName[18][17]:=t*1.1609;
+ModelMatrixName[17][19]:=t*1;
+ModelMatrixName[19][17]:=t*1;
+
+	}
+	return 1;
+}
+
+equalFreqs={20,1};
+
+equalFreqs[0]=0.0866279;
+equalFreqs[14]=0.043972;
+equalFreqs[11]=0.0390894;
+equalFreqs[2]=0.0570451;
+equalFreqs[1]=0.0193078;
+equalFreqs[13]=0.0367281;
+equalFreqs[3]=0.0580589;
+equalFreqs[5]=0.0832518;
+equalFreqs[6]=0.0244313;
+equalFreqs[7]=0.048466;
+equalFreqs[9]=0.086209;
+equalFreqs[8]=0.0620286;
+equalFreqs[10]=0.0195027;
+equalFreqs[4]=0.0384319;
+equalFreqs[12]=0.0457631;
+equalFreqs[15]=0.0695179;
+equalFreqs[16]=0.0610127;
+equalFreqs[18]=0.0143859;
+equalFreqs[19]=0.0352742;
+equalFreqs[17]=0.0708956;
+
+WAGMatrix = 0;
+MULTIPLY_BY_FREQS = PopulateModelMatrix ("WAGMatrix",equalFreqs);
+Model WAGModel = (WAGMatrix, equalFreqs, MULTIPLY_BY_FREQS);
+FREQUENCY_SENSITIVE = 0;
diff --git a/res/TemplateBatchFiles/TemplateModels/WAG_F.mdl b/res/TemplateBatchFiles/TemplateModels/WAG_F.mdl
new file mode 100644
index 0000000..d763fc3
--- /dev/null
+++ b/res/TemplateBatchFiles/TemplateModels/WAG_F.mdl
@@ -0,0 +1,792 @@
+#include "modelParameters2.mdl";
+
+if (!SKIP_MODEL_PARAMETER_LIST)
+{
+	if (modelType == 1)
+	{
+		#include "defineGamma.mdl";
+	}	
+	if (modelType == 2)
+	{
+		#include "defineHM.mdl";
+	}
+}
+
+function PopulateModelMatrix (ModelMatrixName&, EFV)
+{
+	ModelMatrixName = {20,20};
+	if (categoriesUsed)
+	{
+       ModelMatrixName[14][0]:=c*t*1.75252;
+ModelMatrixName[0][14]:=c*t*1.75252;
+ModelMatrixName[11][0]:=c*t*1.61995;
+ModelMatrixName[0][11]:=c*t*1.61995;
+ModelMatrixName[11][14]:=c*t*2.0187;
+ModelMatrixName[14][11]:=c*t*2.0187;
+ModelMatrixName[2][0]:=c*t*2.34804;
+ModelMatrixName[0][2]:=c*t*2.34804;
+ModelMatrixName[2][14]:=c*t*0.468033;
+ModelMatrixName[14][2]:=c*t*0.468033;
+ModelMatrixName[2][11]:=c*t*17.251;
+ModelMatrixName[11][2]:=c*t*17.251;
+ModelMatrixName[1][0]:=c*t*3.26324;
+ModelMatrixName[0][1]:=c*t*3.26324;
+ModelMatrixName[1][14]:=c*t*1.67824;
+ModelMatrixName[14][1]:=c*t*1.67824;
+ModelMatrixName[1][11]:=c*t*0.842805;
+ModelMatrixName[11][1]:=c*t*0.842805;
+ModelMatrixName[1][2]:=c*t*0.0962568;
+ModelMatrixName[2][1]:=c*t*0.0962568;
+ModelMatrixName[13][0]:=c*t*2.88691;
+ModelMatrixName[0][13]:=c*t*2.88691;
+ModelMatrixName[13][14]:=c*t*9.64477;
+ModelMatrixName[14][13]:=c*t*9.64477;
+ModelMatrixName[13][11]:=c*t*4.90465;
+ModelMatrixName[11][13]:=c*t*4.90465;
+ModelMatrixName[13][2]:=c*t*1.95972;
+ModelMatrixName[2][13]:=c*t*1.95972;
+ModelMatrixName[13][1]:=c*t*0.313977;
+ModelMatrixName[1][13]:=c*t*0.313977;
+ModelMatrixName[3][0]:=c*t*5.02923;
+ModelMatrixName[0][3]:=c*t*5.02923;
+ModelMatrixName[3][14]:=c*t*1.39535;
+ModelMatrixName[14][3]:=c*t*1.39535;
+ModelMatrixName[3][11]:=c*t*3.00956;
+ModelMatrixName[11][3]:=c*t*3.00956;
+ModelMatrixName[3][2]:=c*t*19.6173;
+ModelMatrixName[2][3]:=c*t*19.6173;
+ModelMatrixName[3][1]:=c*t*0.0678423;
+ModelMatrixName[1][3]:=c*t*0.0678423;
+ModelMatrixName[3][13]:=c*t*17.3783;
+ModelMatrixName[13][3]:=c*t*17.3783;
+ModelMatrixName[5][0]:=c*t*4.50138;
+ModelMatrixName[0][5]:=c*t*4.50138;
+ModelMatrixName[5][14]:=c*t*1.85767;
+ModelMatrixName[14][5]:=c*t*1.85767;
+ModelMatrixName[5][11]:=c*t*3.57627;
+ModelMatrixName[11][5]:=c*t*3.57627;
+ModelMatrixName[5][2]:=c*t*2.75024;
+ModelMatrixName[2][5]:=c*t*2.75024;
+ModelMatrixName[5][1]:=c*t*0.974403;
+ModelMatrixName[1][5]:=c*t*0.974403;
+ModelMatrixName[5][13]:=c*t*1.04868;
+ModelMatrixName[13][5]:=c*t*1.04868;
+ModelMatrixName[5][3]:=c*t*1.80382;
+ModelMatrixName[3][5]:=c*t*1.80382;
+ModelMatrixName[6][0]:=c*t*1.00707;
+ModelMatrixName[0][6]:=c*t*1.00707;
+ModelMatrixName[6][14]:=c*t*6.79042;
+ModelMatrixName[14][6]:=c*t*6.79042;
+ModelMatrixName[6][11]:=c*t*12.5704;
+ModelMatrixName[11][6]:=c*t*12.5704;
+ModelMatrixName[6][2]:=c*t*2.95706;
+ModelMatrixName[2][6]:=c*t*2.95706;
+ModelMatrixName[6][1]:=c*t*0.791065;
+ModelMatrixName[1][6]:=c*t*0.791065;
+ModelMatrixName[6][13]:=c*t*13.6438;
+ModelMatrixName[13][6]:=c*t*13.6438;
+ModelMatrixName[6][3]:=c*t*1.81116;
+ModelMatrixName[3][6]:=c*t*1.81116;
+ModelMatrixName[6][5]:=c*t*0.792457;
+ModelMatrixName[5][6]:=c*t*0.792457;
+ModelMatrixName[7][0]:=c*t*0.614288;
+ModelMatrixName[0][7]:=c*t*0.614288;
+ModelMatrixName[7][14]:=c*t*0.594093;
+ModelMatrixName[14][7]:=c*t*0.594093;
+ModelMatrixName[7][11]:=c*t*1.76099;
+ModelMatrixName[11][7]:=c*t*1.76099;
+ModelMatrixName[7][2]:=c*t*0.125304;
+ModelMatrixName[2][7]:=c*t*0.125304;
+ModelMatrixName[7][1]:=c*t*0.540574;
+ModelMatrixName[1][7]:=c*t*0.540574;
+ModelMatrixName[7][13]:=c*t*0.361952;
+ModelMatrixName[13][7]:=c*t*0.361952;
+ModelMatrixName[7][3]:=c*t*0.404776;
+ModelMatrixName[3][7]:=c*t*0.404776;
+ModelMatrixName[7][5]:=c*t*0.0967499;
+ModelMatrixName[5][7]:=c*t*0.0967499;
+ModelMatrixName[7][6]:=c*t*0.439075;
+ModelMatrixName[6][7]:=c*t*0.439075;
+ModelMatrixName[9][0]:=c*t*1.26431;
+ModelMatrixName[0][9]:=c*t*1.26431;
+ModelMatrixName[9][14]:=c*t*1.58126;
+ModelMatrixName[14][9]:=c*t*1.58126;
+ModelMatrixName[9][11]:=c*t*0.417907;
+ModelMatrixName[11][9]:=c*t*0.417907;
+ModelMatrixName[9][2]:=c*t*0.269452;
+ModelMatrixName[2][9]:=c*t*0.269452;
+ModelMatrixName[9][1]:=c*t*1.22101;
+ModelMatrixName[1][9]:=c*t*1.22101;
+ModelMatrixName[9][13]:=c*t*2.76265;
+ModelMatrixName[13][9]:=c*t*2.76265;
+ModelMatrixName[9][3]:=c*t*0.490144;
+ModelMatrixName[3][9]:=c*t*0.490144;
+ModelMatrixName[9][5]:=c*t*0.194782;
+ModelMatrixName[5][9]:=c*t*0.194782;
+ModelMatrixName[9][6]:=c*t*1.58695;
+ModelMatrixName[6][9]:=c*t*1.58695;
+ModelMatrixName[9][7]:=c*t*10.0752;
+ModelMatrixName[7][9]:=c*t*10.0752;
+ModelMatrixName[8][0]:=c*t*2.8795;
+ModelMatrixName[0][8]:=c*t*2.8795;
+ModelMatrixName[8][14]:=c*t*17.0032;
+ModelMatrixName[14][8]:=c*t*17.0032;
+ModelMatrixName[8][11]:=c*t*9.57014;
+ModelMatrixName[11][8]:=c*t*9.57014;
+ModelMatrixName[8][2]:=c*t*1.52466;
+ModelMatrixName[2][8]:=c*t*1.52466;
+ModelMatrixName[8][1]:=c*t*0.23523;
+ModelMatrixName[1][8]:=c*t*0.23523;
+ModelMatrixName[8][13]:=c*t*12.3754;
+ModelMatrixName[13][8]:=c*t*12.3754;
+ModelMatrixName[8][3]:=c*t*8.21158;
+ModelMatrixName[3][8]:=c*t*8.21158;
+ModelMatrixName[8][5]:=c*t*1.18692;
+ModelMatrixName[5][8]:=c*t*1.18692;
+ModelMatrixName[8][6]:=c*t*2.82919;
+ModelMatrixName[6][8]:=c*t*2.82919;
+ModelMatrixName[8][7]:=c*t*1.02892;
+ModelMatrixName[7][8]:=c*t*1.02892;
+ModelMatrixName[8][9]:=c*t*0.818336;
+ModelMatrixName[9][8]:=c*t*0.818336;
+ModelMatrixName[10][0]:=c*t*2.83893;
+ModelMatrixName[0][10]:=c*t*2.83893;
+ModelMatrixName[10][14]:=c*t*2.17063;
+ModelMatrixName[14][10]:=c*t*2.17063;
+ModelMatrixName[10][11]:=c*t*0.629813;
+ModelMatrixName[11][10]:=c*t*0.629813;
+ModelMatrixName[10][2]:=c*t*0.32966;
+ModelMatrixName[2][10]:=c*t*0.32966;
+ModelMatrixName[10][1]:=c*t*1.24069;
+ModelMatrixName[1][10]:=c*t*1.24069;
+ModelMatrixName[10][13]:=c*t*4.9098;
+ModelMatrixName[13][10]:=c*t*4.9098;
+ModelMatrixName[10][3]:=c*t*1.00125;
+ModelMatrixName[3][10]:=c*t*1.00125;
+ModelMatrixName[10][5]:=c*t*0.553173;
+ModelMatrixName[5][10]:=c*t*0.553173;
+ModelMatrixName[10][6]:=c*t*1.28409;
+ModelMatrixName[6][10]:=c*t*1.28409;
+ModelMatrixName[10][7]:=c*t*13.5273;
+ModelMatrixName[7][10]:=c*t*13.5273;
+ModelMatrixName[10][9]:=c*t*15.4228;
+ModelMatrixName[9][10]:=c*t*15.4228;
+ModelMatrixName[10][8]:=c*t*2.9685;
+ModelMatrixName[8][10]:=c*t*2.9685;
+ModelMatrixName[4][0]:=c*t*0.668808;
+ModelMatrixName[0][4]:=c*t*0.668808;
+ModelMatrixName[4][14]:=c*t*0.326346;
+ModelMatrixName[14][4]:=c*t*0.326346;
+ModelMatrixName[4][11]:=c*t*0.305538;
+ModelMatrixName[11][4]:=c*t*0.305538;
+ModelMatrixName[4][2]:=c*t*0.148478;
+ModelMatrixName[2][4]:=c*t*0.148478;
+ModelMatrixName[4][1]:=c*t*1.26464;
+ModelMatrixName[1][4]:=c*t*1.26464;
+ModelMatrixName[4][13]:=c*t*0.317481;
+ModelMatrixName[13][4]:=c*t*0.317481;
+ModelMatrixName[4][3]:=c*t*0.257789;
+ModelMatrixName[3][4]:=c*t*0.257789;
+ModelMatrixName[4][5]:=c*t*0.158647;
+ModelMatrixName[5][4]:=c*t*0.158647;
+ModelMatrixName[4][6]:=c*t*2.15858;
+ModelMatrixName[6][4]:=c*t*2.15858;
+ModelMatrixName[4][7]:=c*t*3.36628;
+ModelMatrixName[7][4]:=c*t*3.36628;
+ModelMatrixName[4][9]:=c*t*6.72059;
+ModelMatrixName[9][4]:=c*t*6.72059;
+ModelMatrixName[4][8]:=c*t*0.282261;
+ModelMatrixName[8][4]:=c*t*0.282261;
+ModelMatrixName[4][10]:=c*t*3.78302;
+ModelMatrixName[10][4]:=c*t*3.78302;
+ModelMatrixName[12][0]:=c*t*4.57074;
+ModelMatrixName[0][12]:=c*t*4.57074;
+ModelMatrixName[12][14]:=c*t*2.15896;
+ModelMatrixName[14][12]:=c*t*2.15896;
+ModelMatrixName[12][11]:=c*t*0.619836;
+ModelMatrixName[11][12]:=c*t*0.619836;
+ModelMatrixName[12][2]:=c*t*1.34714;
+ModelMatrixName[2][12]:=c*t*1.34714;
+ModelMatrixName[12][1]:=c*t*0.347612;
+ModelMatrixName[1][12]:=c*t*0.347612;
+ModelMatrixName[12][13]:=c*t*2.96563;
+ModelMatrixName[13][12]:=c*t*2.96563;
+ModelMatrixName[12][3]:=c*t*2.16806;
+ModelMatrixName[3][12]:=c*t*2.16806;
+ModelMatrixName[12][5]:=c*t*0.773901;
+ModelMatrixName[5][12]:=c*t*0.773901;
+ModelMatrixName[12][6]:=c*t*2.21205;
+ModelMatrixName[6][12]:=c*t*2.21205;
+ModelMatrixName[12][7]:=c*t*0.317506;
+ModelMatrixName[7][12]:=c*t*0.317506;
+ModelMatrixName[12][9]:=c*t*1.32127;
+ModelMatrixName[9][12]:=c*t*1.32127;
+ModelMatrixName[12][8]:=c*t*1.76944;
+ModelMatrixName[8][12]:=c*t*1.76944;
+ModelMatrixName[12][10]:=c*t*0.544368;
+ModelMatrixName[10][12]:=c*t*0.544368;
+ModelMatrixName[12][4]:=c*t*0.51296;
+ModelMatrixName[4][12]:=c*t*0.51296;
+ModelMatrixName[15][0]:=c*t*10.7101;
+ModelMatrixName[0][15]:=c*t*10.7101;
+ModelMatrixName[15][14]:=c*t*3.88965;
+ModelMatrixName[14][15]:=c*t*3.88965;
+ModelMatrixName[15][11]:=c*t*12.6274;
+ModelMatrixName[11][15]:=c*t*12.6274;
+ModelMatrixName[15][2]:=c*t*3.40533;
+ModelMatrixName[2][15]:=c*t*3.40533;
+ModelMatrixName[15][1]:=c*t*4.4726;
+ModelMatrixName[1][15]:=c*t*4.4726;
+ModelMatrixName[15][13]:=c*t*3.26906;
+ModelMatrixName[13][15]:=c*t*3.26906;
+ModelMatrixName[15][3]:=c*t*2.23982;
+ModelMatrixName[3][15]:=c*t*2.23982;
+ModelMatrixName[15][5]:=c*t*4.2634;
+ModelMatrixName[5][15]:=c*t*4.2634;
+ModelMatrixName[15][6]:=c*t*2.35176;
+ModelMatrixName[6][15]:=c*t*2.35176;
+ModelMatrixName[15][7]:=c*t*1.01497;
+ModelMatrixName[7][15]:=c*t*1.01497;
+ModelMatrixName[15][9]:=c*t*1.09535;
+ModelMatrixName[9][15]:=c*t*1.09535;
+ModelMatrixName[15][8]:=c*t*3.07289;
+ModelMatrixName[8][15]:=c*t*3.07289;
+ModelMatrixName[15][10]:=c*t*1.5693;
+ModelMatrixName[10][15]:=c*t*1.5693;
+ModelMatrixName[15][4]:=c*t*1.7346;
+ModelMatrixName[4][15]:=c*t*1.7346;
+ModelMatrixName[15][12]:=c*t*5.12592;
+ModelMatrixName[12][15]:=c*t*5.12592;
+ModelMatrixName[16][0]:=c*t*6.73946;
+ModelMatrixName[0][16]:=c*t*6.73946;
+ModelMatrixName[16][14]:=c*t*1.76155;
+ModelMatrixName[14][16]:=c*t*1.76155;
+ModelMatrixName[16][11]:=c*t*6.45016;
+ModelMatrixName[11][16]:=c*t*6.45016;
+ModelMatrixName[16][2]:=c*t*1.19107;
+ModelMatrixName[2][16]:=c*t*1.19107;
+ModelMatrixName[16][1]:=c*t*1.62992;
+ModelMatrixName[1][16]:=c*t*1.62992;
+ModelMatrixName[16][13]:=c*t*2.72592;
+ModelMatrixName[13][16]:=c*t*2.72592;
+ModelMatrixName[16][3]:=c*t*2.61419;
+ModelMatrixName[3][16]:=c*t*2.61419;
+ModelMatrixName[16][5]:=c*t*0.717545;
+ModelMatrixName[5][16]:=c*t*0.717545;
+ModelMatrixName[16][6]:=c*t*1.50385;
+ModelMatrixName[6][16]:=c*t*1.50385;
+ModelMatrixName[16][7]:=c*t*4.63305;
+ModelMatrixName[7][16]:=c*t*4.63305;
+ModelMatrixName[16][9]:=c*t*1.03778;
+ModelMatrixName[9][16]:=c*t*1.03778;
+ModelMatrixName[16][8]:=c*t*4.40689;
+ModelMatrixName[8][16]:=c*t*4.40689;
+ModelMatrixName[16][10]:=c*t*4.81721;
+ModelMatrixName[10][16]:=c*t*4.81721;
+ModelMatrixName[16][4]:=c*t*0.546192;
+ModelMatrixName[4][16]:=c*t*0.546192;
+ModelMatrixName[16][12]:=c*t*2.52719;
+ModelMatrixName[12][16]:=c*t*2.52719;
+ModelMatrixName[16][15]:=c*t*13.9104;
+ModelMatrixName[15][16]:=c*t*13.9104;
+ModelMatrixName[18][0]:=c*t*0.35946;
+ModelMatrixName[0][18]:=c*t*0.35946;
+ModelMatrixName[18][14]:=c*t*3.69815;
+ModelMatrixName[14][18]:=c*t*3.69815;
+ModelMatrixName[18][11]:=c*t*0.228503;
+ModelMatrixName[11][18]:=c*t*0.228503;
+ModelMatrixName[18][2]:=c*t*0.412312;
+ModelMatrixName[2][18]:=c*t*0.412312;
+ModelMatrixName[18][1]:=c*t*2.27837;
+ModelMatrixName[1][18]:=c*t*2.27837;
+ModelMatrixName[18][13]:=c*t*0.685467;
+ModelMatrixName[13][18]:=c*t*0.685467;
+ModelMatrixName[18][3]:=c*t*0.497433;
+ModelMatrixName[3][18]:=c*t*0.497433;
+ModelMatrixName[18][5]:=c*t*1.07071;
+ModelMatrixName[5][18]:=c*t*1.07071;
+ModelMatrixName[18][6]:=c*t*0.834267;
+ModelMatrixName[6][18]:=c*t*0.834267;
+ModelMatrixName[18][7]:=c*t*0.675128;
+ModelMatrixName[7][18]:=c*t*0.675128;
+ModelMatrixName[18][9]:=c*t*2.1139;
+ModelMatrixName[9][18]:=c*t*2.1139;
+ModelMatrixName[18][8]:=c*t*0.436898;
+ModelMatrixName[8][18]:=c*t*0.436898;
+ModelMatrixName[18][10]:=c*t*1.63857;
+ModelMatrixName[10][18]:=c*t*1.63857;
+ModelMatrixName[18][4]:=c*t*4.86017;
+ModelMatrixName[4][18]:=c*t*4.86017;
+ModelMatrixName[18][12]:=c*t*0.442935;
+ModelMatrixName[12][18]:=c*t*0.442935;
+ModelMatrixName[18][15]:=c*t*1.6641;
+ModelMatrixName[15][18]:=c*t*1.6641;
+ModelMatrixName[18][16]:=c*t*0.352251;
+ModelMatrixName[16][18]:=c*t*0.352251;
+ModelMatrixName[19][0]:=c*t*0.764894;
+ModelMatrixName[0][19]:=c*t*0.764894;
+ModelMatrixName[19][14]:=c*t*1.21225;
+ModelMatrixName[14][19]:=c*t*1.21225;
+ModelMatrixName[19][11]:=c*t*3.45058;
+ModelMatrixName[11][19]:=c*t*3.45058;
+ModelMatrixName[19][2]:=c*t*1.03489;
+ModelMatrixName[2][19]:=c*t*1.03489;
+ModelMatrixName[19][1]:=c*t*1.72794;
+ModelMatrixName[1][19]:=c*t*1.72794;
+ModelMatrixName[19][13]:=c*t*0.723509;
+ModelMatrixName[13][19]:=c*t*0.723509;
+ModelMatrixName[19][3]:=c*t*0.623719;
+ModelMatrixName[3][19]:=c*t*0.623719;
+ModelMatrixName[19][5]:=c*t*0.329184;
+ModelMatrixName[5][19]:=c*t*0.329184;
+ModelMatrixName[19][6]:=c*t*12.3072;
+ModelMatrixName[6][19]:=c*t*12.3072;
+ModelMatrixName[19][7]:=c*t*1.33502;
+ModelMatrixName[7][19]:=c*t*1.33502;
+ModelMatrixName[19][9]:=c*t*1.26654;
+ModelMatrixName[9][19]:=c*t*1.26654;
+ModelMatrixName[19][8]:=c*t*0.423423;
+ModelMatrixName[8][19]:=c*t*0.423423;
+ModelMatrixName[19][10]:=c*t*1.36128;
+ModelMatrixName[10][19]:=c*t*1.36128;
+ModelMatrixName[19][4]:=c*t*20.5074;
+ModelMatrixName[4][19]:=c*t*20.5074;
+ModelMatrixName[19][12]:=c*t*0.686449;
+ModelMatrixName[12][19]:=c*t*0.686449;
+ModelMatrixName[19][15]:=c*t*2.50053;
+ModelMatrixName[15][19]:=c*t*2.50053;
+ModelMatrixName[19][16]:=c*t*0.925072;
+ModelMatrixName[16][19]:=c*t*0.925072;
+ModelMatrixName[19][18]:=c*t*7.8969;
+ModelMatrixName[18][19]:=c*t*7.8969;
+ModelMatrixName[17][0]:=c*t*6.37375;
+ModelMatrixName[0][17]:=c*t*6.37375;
+ModelMatrixName[17][14]:=c*t*0.800207;
+ModelMatrixName[14][17]:=c*t*0.800207;
+ModelMatrixName[17][11]:=c*t*0.623538;
+ModelMatrixName[11][17]:=c*t*0.623538;
+ModelMatrixName[17][2]:=c*t*0.484018;
+ModelMatrixName[2][17]:=c*t*0.484018;
+ModelMatrixName[17][1]:=c*t*3.18413;
+ModelMatrixName[1][17]:=c*t*3.18413;
+ModelMatrixName[17][13]:=c*t*0.957268;
+ModelMatrixName[13][17]:=c*t*0.957268;
+ModelMatrixName[17][3]:=c*t*1.87059;
+ModelMatrixName[3][17]:=c*t*1.87059;
+ModelMatrixName[17][5]:=c*t*0.594945;
+ModelMatrixName[5][17]:=c*t*0.594945;
+ModelMatrixName[17][6]:=c*t*0.376062;
+ModelMatrixName[6][17]:=c*t*0.376062;
+ModelMatrixName[17][7]:=c*t*24.8508;
+ModelMatrixName[7][17]:=c*t*24.8508;
+ModelMatrixName[17][9]:=c*t*5.72027;
+ModelMatrixName[9][17]:=c*t*5.72027;
+ModelMatrixName[17][8]:=c*t*0.970464;
+ModelMatrixName[8][17]:=c*t*0.970464;
+ModelMatrixName[17][10]:=c*t*6.54037;
+ModelMatrixName[10][17]:=c*t*6.54037;
+ModelMatrixName[17][4]:=c*t*2.06492;
+ModelMatrixName[4][17]:=c*t*2.06492;
+ModelMatrixName[17][12]:=c*t*1.0005;
+ModelMatrixName[12][17]:=c*t*1.0005;
+ModelMatrixName[17][15]:=c*t*0.739488;
+ModelMatrixName[15][17]:=c*t*0.739488;
+ModelMatrixName[17][16]:=c*t*4.41086;
+ModelMatrixName[16][17]:=c*t*4.41086;
+ModelMatrixName[17][18]:=c*t*1.1609;
+ModelMatrixName[18][17]:=c*t*1.1609;
+ModelMatrixName[17][19]:=c*t*1;
+ModelMatrixName[19][17]:=c*t*1;
+	}
+	else
+	{
+       ModelMatrixName[14][0]:=t*1.75252;
+ModelMatrixName[0][14]:=t*1.75252;
+ModelMatrixName[11][0]:=t*1.61995;
+ModelMatrixName[0][11]:=t*1.61995;
+ModelMatrixName[11][14]:=t*2.0187;
+ModelMatrixName[14][11]:=t*2.0187;
+ModelMatrixName[2][0]:=t*2.34804;
+ModelMatrixName[0][2]:=t*2.34804;
+ModelMatrixName[2][14]:=t*0.468033;
+ModelMatrixName[14][2]:=t*0.468033;
+ModelMatrixName[2][11]:=t*17.251;
+ModelMatrixName[11][2]:=t*17.251;
+ModelMatrixName[1][0]:=t*3.26324;
+ModelMatrixName[0][1]:=t*3.26324;
+ModelMatrixName[1][14]:=t*1.67824;
+ModelMatrixName[14][1]:=t*1.67824;
+ModelMatrixName[1][11]:=t*0.842805;
+ModelMatrixName[11][1]:=t*0.842805;
+ModelMatrixName[1][2]:=t*0.0962568;
+ModelMatrixName[2][1]:=t*0.0962568;
+ModelMatrixName[13][0]:=t*2.88691;
+ModelMatrixName[0][13]:=t*2.88691;
+ModelMatrixName[13][14]:=t*9.64477;
+ModelMatrixName[14][13]:=t*9.64477;
+ModelMatrixName[13][11]:=t*4.90465;
+ModelMatrixName[11][13]:=t*4.90465;
+ModelMatrixName[13][2]:=t*1.95972;
+ModelMatrixName[2][13]:=t*1.95972;
+ModelMatrixName[13][1]:=t*0.313977;
+ModelMatrixName[1][13]:=t*0.313977;
+ModelMatrixName[3][0]:=t*5.02923;
+ModelMatrixName[0][3]:=t*5.02923;
+ModelMatrixName[3][14]:=t*1.39535;
+ModelMatrixName[14][3]:=t*1.39535;
+ModelMatrixName[3][11]:=t*3.00956;
+ModelMatrixName[11][3]:=t*3.00956;
+ModelMatrixName[3][2]:=t*19.6173;
+ModelMatrixName[2][3]:=t*19.6173;
+ModelMatrixName[3][1]:=t*0.0678423;
+ModelMatrixName[1][3]:=t*0.0678423;
+ModelMatrixName[3][13]:=t*17.3783;
+ModelMatrixName[13][3]:=t*17.3783;
+ModelMatrixName[5][0]:=t*4.50138;
+ModelMatrixName[0][5]:=t*4.50138;
+ModelMatrixName[5][14]:=t*1.85767;
+ModelMatrixName[14][5]:=t*1.85767;
+ModelMatrixName[5][11]:=t*3.57627;
+ModelMatrixName[11][5]:=t*3.57627;
+ModelMatrixName[5][2]:=t*2.75024;
+ModelMatrixName[2][5]:=t*2.75024;
+ModelMatrixName[5][1]:=t*0.974403;
+ModelMatrixName[1][5]:=t*0.974403;
+ModelMatrixName[5][13]:=t*1.04868;
+ModelMatrixName[13][5]:=t*1.04868;
+ModelMatrixName[5][3]:=t*1.80382;
+ModelMatrixName[3][5]:=t*1.80382;
+ModelMatrixName[6][0]:=t*1.00707;
+ModelMatrixName[0][6]:=t*1.00707;
+ModelMatrixName[6][14]:=t*6.79042;
+ModelMatrixName[14][6]:=t*6.79042;
+ModelMatrixName[6][11]:=t*12.5704;
+ModelMatrixName[11][6]:=t*12.5704;
+ModelMatrixName[6][2]:=t*2.95706;
+ModelMatrixName[2][6]:=t*2.95706;
+ModelMatrixName[6][1]:=t*0.791065;
+ModelMatrixName[1][6]:=t*0.791065;
+ModelMatrixName[6][13]:=t*13.6438;
+ModelMatrixName[13][6]:=t*13.6438;
+ModelMatrixName[6][3]:=t*1.81116;
+ModelMatrixName[3][6]:=t*1.81116;
+ModelMatrixName[6][5]:=t*0.792457;
+ModelMatrixName[5][6]:=t*0.792457;
+ModelMatrixName[7][0]:=t*0.614288;
+ModelMatrixName[0][7]:=t*0.614288;
+ModelMatrixName[7][14]:=t*0.594093;
+ModelMatrixName[14][7]:=t*0.594093;
+ModelMatrixName[7][11]:=t*1.76099;
+ModelMatrixName[11][7]:=t*1.76099;
+ModelMatrixName[7][2]:=t*0.125304;
+ModelMatrixName[2][7]:=t*0.125304;
+ModelMatrixName[7][1]:=t*0.540574;
+ModelMatrixName[1][7]:=t*0.540574;
+ModelMatrixName[7][13]:=t*0.361952;
+ModelMatrixName[13][7]:=t*0.361952;
+ModelMatrixName[7][3]:=t*0.404776;
+ModelMatrixName[3][7]:=t*0.404776;
+ModelMatrixName[7][5]:=t*0.0967499;
+ModelMatrixName[5][7]:=t*0.0967499;
+ModelMatrixName[7][6]:=t*0.439075;
+ModelMatrixName[6][7]:=t*0.439075;
+ModelMatrixName[9][0]:=t*1.26431;
+ModelMatrixName[0][9]:=t*1.26431;
+ModelMatrixName[9][14]:=t*1.58126;
+ModelMatrixName[14][9]:=t*1.58126;
+ModelMatrixName[9][11]:=t*0.417907;
+ModelMatrixName[11][9]:=t*0.417907;
+ModelMatrixName[9][2]:=t*0.269452;
+ModelMatrixName[2][9]:=t*0.269452;
+ModelMatrixName[9][1]:=t*1.22101;
+ModelMatrixName[1][9]:=t*1.22101;
+ModelMatrixName[9][13]:=t*2.76265;
+ModelMatrixName[13][9]:=t*2.76265;
+ModelMatrixName[9][3]:=t*0.490144;
+ModelMatrixName[3][9]:=t*0.490144;
+ModelMatrixName[9][5]:=t*0.194782;
+ModelMatrixName[5][9]:=t*0.194782;
+ModelMatrixName[9][6]:=t*1.58695;
+ModelMatrixName[6][9]:=t*1.58695;
+ModelMatrixName[9][7]:=t*10.0752;
+ModelMatrixName[7][9]:=t*10.0752;
+ModelMatrixName[8][0]:=t*2.8795;
+ModelMatrixName[0][8]:=t*2.8795;
+ModelMatrixName[8][14]:=t*17.0032;
+ModelMatrixName[14][8]:=t*17.0032;
+ModelMatrixName[8][11]:=t*9.57014;
+ModelMatrixName[11][8]:=t*9.57014;
+ModelMatrixName[8][2]:=t*1.52466;
+ModelMatrixName[2][8]:=t*1.52466;
+ModelMatrixName[8][1]:=t*0.23523;
+ModelMatrixName[1][8]:=t*0.23523;
+ModelMatrixName[8][13]:=t*12.3754;
+ModelMatrixName[13][8]:=t*12.3754;
+ModelMatrixName[8][3]:=t*8.21158;
+ModelMatrixName[3][8]:=t*8.21158;
+ModelMatrixName[8][5]:=t*1.18692;
+ModelMatrixName[5][8]:=t*1.18692;
+ModelMatrixName[8][6]:=t*2.82919;
+ModelMatrixName[6][8]:=t*2.82919;
+ModelMatrixName[8][7]:=t*1.02892;
+ModelMatrixName[7][8]:=t*1.02892;
+ModelMatrixName[8][9]:=t*0.818336;
+ModelMatrixName[9][8]:=t*0.818336;
+ModelMatrixName[10][0]:=t*2.83893;
+ModelMatrixName[0][10]:=t*2.83893;
+ModelMatrixName[10][14]:=t*2.17063;
+ModelMatrixName[14][10]:=t*2.17063;
+ModelMatrixName[10][11]:=t*0.629813;
+ModelMatrixName[11][10]:=t*0.629813;
+ModelMatrixName[10][2]:=t*0.32966;
+ModelMatrixName[2][10]:=t*0.32966;
+ModelMatrixName[10][1]:=t*1.24069;
+ModelMatrixName[1][10]:=t*1.24069;
+ModelMatrixName[10][13]:=t*4.9098;
+ModelMatrixName[13][10]:=t*4.9098;
+ModelMatrixName[10][3]:=t*1.00125;
+ModelMatrixName[3][10]:=t*1.00125;
+ModelMatrixName[10][5]:=t*0.553173;
+ModelMatrixName[5][10]:=t*0.553173;
+ModelMatrixName[10][6]:=t*1.28409;
+ModelMatrixName[6][10]:=t*1.28409;
+ModelMatrixName[10][7]:=t*13.5273;
+ModelMatrixName[7][10]:=t*13.5273;
+ModelMatrixName[10][9]:=t*15.4228;
+ModelMatrixName[9][10]:=t*15.4228;
+ModelMatrixName[10][8]:=t*2.9685;
+ModelMatrixName[8][10]:=t*2.9685;
+ModelMatrixName[4][0]:=t*0.668808;
+ModelMatrixName[0][4]:=t*0.668808;
+ModelMatrixName[4][14]:=t*0.326346;
+ModelMatrixName[14][4]:=t*0.326346;
+ModelMatrixName[4][11]:=t*0.305538;
+ModelMatrixName[11][4]:=t*0.305538;
+ModelMatrixName[4][2]:=t*0.148478;
+ModelMatrixName[2][4]:=t*0.148478;
+ModelMatrixName[4][1]:=t*1.26464;
+ModelMatrixName[1][4]:=t*1.26464;
+ModelMatrixName[4][13]:=t*0.317481;
+ModelMatrixName[13][4]:=t*0.317481;
+ModelMatrixName[4][3]:=t*0.257789;
+ModelMatrixName[3][4]:=t*0.257789;
+ModelMatrixName[4][5]:=t*0.158647;
+ModelMatrixName[5][4]:=t*0.158647;
+ModelMatrixName[4][6]:=t*2.15858;
+ModelMatrixName[6][4]:=t*2.15858;
+ModelMatrixName[4][7]:=t*3.36628;
+ModelMatrixName[7][4]:=t*3.36628;
+ModelMatrixName[4][9]:=t*6.72059;
+ModelMatrixName[9][4]:=t*6.72059;
+ModelMatrixName[4][8]:=t*0.282261;
+ModelMatrixName[8][4]:=t*0.282261;
+ModelMatrixName[4][10]:=t*3.78302;
+ModelMatrixName[10][4]:=t*3.78302;
+ModelMatrixName[12][0]:=t*4.57074;
+ModelMatrixName[0][12]:=t*4.57074;
+ModelMatrixName[12][14]:=t*2.15896;
+ModelMatrixName[14][12]:=t*2.15896;
+ModelMatrixName[12][11]:=t*0.619836;
+ModelMatrixName[11][12]:=t*0.619836;
+ModelMatrixName[12][2]:=t*1.34714;
+ModelMatrixName[2][12]:=t*1.34714;
+ModelMatrixName[12][1]:=t*0.347612;
+ModelMatrixName[1][12]:=t*0.347612;
+ModelMatrixName[12][13]:=t*2.96563;
+ModelMatrixName[13][12]:=t*2.96563;
+ModelMatrixName[12][3]:=t*2.16806;
+ModelMatrixName[3][12]:=t*2.16806;
+ModelMatrixName[12][5]:=t*0.773901;
+ModelMatrixName[5][12]:=t*0.773901;
+ModelMatrixName[12][6]:=t*2.21205;
+ModelMatrixName[6][12]:=t*2.21205;
+ModelMatrixName[12][7]:=t*0.317506;
+ModelMatrixName[7][12]:=t*0.317506;
+ModelMatrixName[12][9]:=t*1.32127;
+ModelMatrixName[9][12]:=t*1.32127;
+ModelMatrixName[12][8]:=t*1.76944;
+ModelMatrixName[8][12]:=t*1.76944;
+ModelMatrixName[12][10]:=t*0.544368;
+ModelMatrixName[10][12]:=t*0.544368;
+ModelMatrixName[12][4]:=t*0.51296;
+ModelMatrixName[4][12]:=t*0.51296;
+ModelMatrixName[15][0]:=t*10.7101;
+ModelMatrixName[0][15]:=t*10.7101;
+ModelMatrixName[15][14]:=t*3.88965;
+ModelMatrixName[14][15]:=t*3.88965;
+ModelMatrixName[15][11]:=t*12.6274;
+ModelMatrixName[11][15]:=t*12.6274;
+ModelMatrixName[15][2]:=t*3.40533;
+ModelMatrixName[2][15]:=t*3.40533;
+ModelMatrixName[15][1]:=t*4.4726;
+ModelMatrixName[1][15]:=t*4.4726;
+ModelMatrixName[15][13]:=t*3.26906;
+ModelMatrixName[13][15]:=t*3.26906;
+ModelMatrixName[15][3]:=t*2.23982;
+ModelMatrixName[3][15]:=t*2.23982;
+ModelMatrixName[15][5]:=t*4.2634;
+ModelMatrixName[5][15]:=t*4.2634;
+ModelMatrixName[15][6]:=t*2.35176;
+ModelMatrixName[6][15]:=t*2.35176;
+ModelMatrixName[15][7]:=t*1.01497;
+ModelMatrixName[7][15]:=t*1.01497;
+ModelMatrixName[15][9]:=t*1.09535;
+ModelMatrixName[9][15]:=t*1.09535;
+ModelMatrixName[15][8]:=t*3.07289;
+ModelMatrixName[8][15]:=t*3.07289;
+ModelMatrixName[15][10]:=t*1.5693;
+ModelMatrixName[10][15]:=t*1.5693;
+ModelMatrixName[15][4]:=t*1.7346;
+ModelMatrixName[4][15]:=t*1.7346;
+ModelMatrixName[15][12]:=t*5.12592;
+ModelMatrixName[12][15]:=t*5.12592;
+ModelMatrixName[16][0]:=t*6.73946;
+ModelMatrixName[0][16]:=t*6.73946;
+ModelMatrixName[16][14]:=t*1.76155;
+ModelMatrixName[14][16]:=t*1.76155;
+ModelMatrixName[16][11]:=t*6.45016;
+ModelMatrixName[11][16]:=t*6.45016;
+ModelMatrixName[16][2]:=t*1.19107;
+ModelMatrixName[2][16]:=t*1.19107;
+ModelMatrixName[16][1]:=t*1.62992;
+ModelMatrixName[1][16]:=t*1.62992;
+ModelMatrixName[16][13]:=t*2.72592;
+ModelMatrixName[13][16]:=t*2.72592;
+ModelMatrixName[16][3]:=t*2.61419;
+ModelMatrixName[3][16]:=t*2.61419;
+ModelMatrixName[16][5]:=t*0.717545;
+ModelMatrixName[5][16]:=t*0.717545;
+ModelMatrixName[16][6]:=t*1.50385;
+ModelMatrixName[6][16]:=t*1.50385;
+ModelMatrixName[16][7]:=t*4.63305;
+ModelMatrixName[7][16]:=t*4.63305;
+ModelMatrixName[16][9]:=t*1.03778;
+ModelMatrixName[9][16]:=t*1.03778;
+ModelMatrixName[16][8]:=t*4.40689;
+ModelMatrixName[8][16]:=t*4.40689;
+ModelMatrixName[16][10]:=t*4.81721;
+ModelMatrixName[10][16]:=t*4.81721;
+ModelMatrixName[16][4]:=t*0.546192;
+ModelMatrixName[4][16]:=t*0.546192;
+ModelMatrixName[16][12]:=t*2.52719;
+ModelMatrixName[12][16]:=t*2.52719;
+ModelMatrixName[16][15]:=t*13.9104;
+ModelMatrixName[15][16]:=t*13.9104;
+ModelMatrixName[18][0]:=t*0.35946;
+ModelMatrixName[0][18]:=t*0.35946;
+ModelMatrixName[18][14]:=t*3.69815;
+ModelMatrixName[14][18]:=t*3.69815;
+ModelMatrixName[18][11]:=t*0.228503;
+ModelMatrixName[11][18]:=t*0.228503;
+ModelMatrixName[18][2]:=t*0.412312;
+ModelMatrixName[2][18]:=t*0.412312;
+ModelMatrixName[18][1]:=t*2.27837;
+ModelMatrixName[1][18]:=t*2.27837;
+ModelMatrixName[18][13]:=t*0.685467;
+ModelMatrixName[13][18]:=t*0.685467;
+ModelMatrixName[18][3]:=t*0.497433;
+ModelMatrixName[3][18]:=t*0.497433;
+ModelMatrixName[18][5]:=t*1.07071;
+ModelMatrixName[5][18]:=t*1.07071;
+ModelMatrixName[18][6]:=t*0.834267;
+ModelMatrixName[6][18]:=t*0.834267;
+ModelMatrixName[18][7]:=t*0.675128;
+ModelMatrixName[7][18]:=t*0.675128;
+ModelMatrixName[18][9]:=t*2.1139;
+ModelMatrixName[9][18]:=t*2.1139;
+ModelMatrixName[18][8]:=t*0.436898;
+ModelMatrixName[8][18]:=t*0.436898;
+ModelMatrixName[18][10]:=t*1.63857;
+ModelMatrixName[10][18]:=t*1.63857;
+ModelMatrixName[18][4]:=t*4.86017;
+ModelMatrixName[4][18]:=t*4.86017;
+ModelMatrixName[18][12]:=t*0.442935;
+ModelMatrixName[12][18]:=t*0.442935;
+ModelMatrixName[18][15]:=t*1.6641;
+ModelMatrixName[15][18]:=t*1.6641;
+ModelMatrixName[18][16]:=t*0.352251;
+ModelMatrixName[16][18]:=t*0.352251;
+ModelMatrixName[19][0]:=t*0.764894;
+ModelMatrixName[0][19]:=t*0.764894;
+ModelMatrixName[19][14]:=t*1.21225;
+ModelMatrixName[14][19]:=t*1.21225;
+ModelMatrixName[19][11]:=t*3.45058;
+ModelMatrixName[11][19]:=t*3.45058;
+ModelMatrixName[19][2]:=t*1.03489;
+ModelMatrixName[2][19]:=t*1.03489;
+ModelMatrixName[19][1]:=t*1.72794;
+ModelMatrixName[1][19]:=t*1.72794;
+ModelMatrixName[19][13]:=t*0.723509;
+ModelMatrixName[13][19]:=t*0.723509;
+ModelMatrixName[19][3]:=t*0.623719;
+ModelMatrixName[3][19]:=t*0.623719;
+ModelMatrixName[19][5]:=t*0.329184;
+ModelMatrixName[5][19]:=t*0.329184;
+ModelMatrixName[19][6]:=t*12.3072;
+ModelMatrixName[6][19]:=t*12.3072;
+ModelMatrixName[19][7]:=t*1.33502;
+ModelMatrixName[7][19]:=t*1.33502;
+ModelMatrixName[19][9]:=t*1.26654;
+ModelMatrixName[9][19]:=t*1.26654;
+ModelMatrixName[19][8]:=t*0.423423;
+ModelMatrixName[8][19]:=t*0.423423;
+ModelMatrixName[19][10]:=t*1.36128;
+ModelMatrixName[10][19]:=t*1.36128;
+ModelMatrixName[19][4]:=t*20.5074;
+ModelMatrixName[4][19]:=t*20.5074;
+ModelMatrixName[19][12]:=t*0.686449;
+ModelMatrixName[12][19]:=t*0.686449;
+ModelMatrixName[19][15]:=t*2.50053;
+ModelMatrixName[15][19]:=t*2.50053;
+ModelMatrixName[19][16]:=t*0.925072;
+ModelMatrixName[16][19]:=t*0.925072;
+ModelMatrixName[19][18]:=t*7.8969;
+ModelMatrixName[18][19]:=t*7.8969;
+ModelMatrixName[17][0]:=t*6.37375;
+ModelMatrixName[0][17]:=t*6.37375;
+ModelMatrixName[17][14]:=t*0.800207;
+ModelMatrixName[14][17]:=t*0.800207;
+ModelMatrixName[17][11]:=t*0.623538;
+ModelMatrixName[11][17]:=t*0.623538;
+ModelMatrixName[17][2]:=t*0.484018;
+ModelMatrixName[2][17]:=t*0.484018;
+ModelMatrixName[17][1]:=t*3.18413;
+ModelMatrixName[1][17]:=t*3.18413;
+ModelMatrixName[17][13]:=t*0.957268;
+ModelMatrixName[13][17]:=t*0.957268;
+ModelMatrixName[17][3]:=t*1.87059;
+ModelMatrixName[3][17]:=t*1.87059;
+ModelMatrixName[17][5]:=t*0.594945;
+ModelMatrixName[5][17]:=t*0.594945;
+ModelMatrixName[17][6]:=t*0.376062;
+ModelMatrixName[6][17]:=t*0.376062;
+ModelMatrixName[17][7]:=t*24.8508;
+ModelMatrixName[7][17]:=t*24.8508;
+ModelMatrixName[17][9]:=t*5.72027;
+ModelMatrixName[9][17]:=t*5.72027;
+ModelMatrixName[17][8]:=t*0.970464;
+ModelMatrixName[8][17]:=t*0.970464;
+ModelMatrixName[17][10]:=t*6.54037;
+ModelMatrixName[10][17]:=t*6.54037;
+ModelMatrixName[17][4]:=t*2.06492;
+ModelMatrixName[4][17]:=t*2.06492;
+ModelMatrixName[17][12]:=t*1.0005;
+ModelMatrixName[12][17]:=t*1.0005;
+ModelMatrixName[17][15]:=t*0.739488;
+ModelMatrixName[15][17]:=t*0.739488;
+ModelMatrixName[17][16]:=t*4.41086;
+ModelMatrixName[16][17]:=t*4.41086;
+ModelMatrixName[17][18]:=t*1.1609;
+ModelMatrixName[18][17]:=t*1.1609;
+ModelMatrixName[17][19]:=t*1;
+ModelMatrixName[19][17]:=t*1;
+
+	}
+	return 1;
+}
+
+HarvestFrequencies (vectorOfFrequencies,filteredData,1,1,0);
+WAGMatrixF = 0;
+MULTIPLY_BY_FREQS = PopulateModelMatrix ("WAGMatrixF",vectorOfFrequencies);
+Model WAGModel = (WAGMatrixF, vectorOfFrequencies, MULTIPLY_BY_FREQS);
+FREQUENCY_SENSITIVE = 1;
diff --git a/res/TemplateBatchFiles/TemplateModels/Yang2000Distributions.def b/res/TemplateBatchFiles/TemplateModels/Yang2000Distributions.def
new file mode 100644
index 0000000..7a45c60
--- /dev/null
+++ b/res/TemplateBatchFiles/TemplateModels/Yang2000Distributions.def
@@ -0,0 +1,330 @@
+/*-------------------------------------------------------------------------------*/
+
+function SetWDistribution (resp)
+{
+	if (rateType == 0)
+	{
+		global P = .5;
+		P:<1;
+		global W = 0.1;
+		W :< 1;
+		categFreqMatrix = {{P,1-P}};
+		categRateMatrix = {{W,1}};
+		category c = (2, categFreqMatrix , MEAN, ,categRateMatrix, 0, 1e25);
+	}
+	else
+	{
+		if (rateType == 1)
+		{
+			global P1 = 1/3;
+			global P2 = 1/2;
+			
+			P1:<1;
+			P2:<1;
+			
+			global W_1 = 0.1;
+			W_1 :< 1;
+			global W_2 = 5;
+			W_2 :> 1;
+			categFreqMatrix = {{P1,(1-P1)*P2, (1-P1)*(1-P2)}} ;
+			categRateMatrix = {{W_1,1,W_2}};
+			category c = (3, categFreqMatrix , MEAN, ,categRateMatrix, 0, 1e25);
+		}		
+		else
+		{
+			if (rateType == 2)
+			{
+				global P1 = 1/3;
+				global P2 = .5;
+				P1:<1;
+				P2:<1;
+				global W1 = .25;
+				global R_1 = .5;
+				global R_2 = 3;
+				R_1:<1;
+				R_2:>1;
+				categFreqMatrix = {{P1,(1-P1)*P2, (1-P1)*(1-P2)}} ;
+				categRateMatrix = {{W1*R_1,W1,W1*R_2}};
+				category c = (3, categFreqMatrix , MEAN, ,categRateMatrix, 0, 1e25);				
+			}
+			else
+			{
+				if (rateType == 3)
+				{
+					global P1 = 1/5;
+					global P2 = 1/4;
+					global P3 = 1/3;
+					global P4 = 1/2;
+					
+					P1:<1;
+					P2:<1;
+					P3:<1;
+					P4:<1;
+					
+					categFreqMatrix = {{P1,
+										(1-P1)P2,
+										(1-P1)(1-P2)*P3,
+										(1-P1)(1-P2)(1-P3)P4,
+										(1-P1)(1-P2)(1-P3)(1-P4)}} ;
+					categRateMatrix = {{0,1/3,2/3,1,3}};
+					category c = (5, categFreqMatrix , MEAN, ,categRateMatrix, 0, 1e25);				
+				}
+				else
+				{
+					if (rateType == 4)
+					{
+						global alpha = .5;
+						global beta = 1;
+						alpha:>0.01;alpha:<100;
+						beta:>0.01;
+						beta:<200;
+						category c = (resp, EQUAL, MEAN, GammaDist(_x_,alpha,beta), CGammaDist(_x_,alpha,beta), 0 , 
+				 			 		  1e25,CGammaDist(_x_,alpha+1,beta)*alpha/beta);
+					}
+					else
+					{
+						if (rateType == 5)
+						{
+							global alpha = .5;
+							global beta  =  1;
+							global alpha2=  .75;
+							global P	 = .5; 
+							alpha:>0.01;alpha:<100;
+							beta:>0.01;
+							beta:<200;
+							P:<1;
+							alpha2:>0.01;alpha2:<100;
+							category c = (resp, EQUAL, MEAN, P*GammaDist(_x_,alpha,beta) + (1-P)*GammaDist(_x_,alpha2,alpha2)
+														   , P*CGammaDist(_x_,alpha,beta) + (1-P)*CGammaDist(_x_,alpha2,alpha2), 
+														   0 , 1e25,
+														   P*CGammaDist(_x_,alpha+1,beta)*alpha/beta + (1-P)*CGammaDist(_x_,alpha2+1,alpha2));
+						}
+						else
+						{
+							if (rateType == 6)
+							{
+								global betaP = 1;
+								global betaQ = 1;
+								betaP:>0.05;betaP:<85;
+								betaQ:>0.05;betaQ:<85;
+								category c = (resp, EQUAL, MEAN, _x_^(betaP-1)*(1-_x_)^(betaQ-1)/Beta(betaP,betaQ), IBeta(_x_,betaP,betaQ), 0 , 
+						 			 		  1,IBeta(_x_,betaP+1,betaQ)*betaP/(betaP+betaQ));
+							}
+							else
+							{
+								if (rateType == 7 || rateType == 14)
+								{
+									global W = 2;
+									W:>1;
+									global P	 = 1-1/(resp+1);
+									global betaP = 1;
+									global betaQ = 2;
+									betaP:>0.05;
+									betaQ:>0.05;
+									betaP:<85;
+									betaQ:<85;
+									P:>0.0000001;
+									P:<0.9999999;
+									categFreqMatrix = {resp+1,1};
+									for (k=0; k<resp; k=k+1)
+									{
+										categFreqMatrix[k]:=P/resp__;
+									}
+									categFreqMatrix[resp]:=(1-P);
+
+									if (rateType == 14)
+									{
+										W:=1;
+										category c = (resp+1, categFreqMatrix, MEAN, 
+														P*_x_^(betaP-1)*(1-Min(_x_,1))^(betaQ-1)/Beta(betaP,betaQ)+W-W, 
+														P*IBeta(Min(_x_,1),betaP,betaQ)+(1-P)*(_x_>=W), 
+														0,1,
+														P*IBeta(Min(_x_,1),betaP+1,betaQ)*betaP/(betaP+betaQ)+(1-P)*W*(_x_>=W));
+									}
+									else
+									{
+										category c = (resp+1, categFreqMatrix, MEAN, 
+														P*_x_^(betaP-1)*(1-Min(_x_,1))^(betaQ-1)/Beta(betaP,betaQ)+W-W, 
+														P*IBeta(Min(_x_,1),betaP,betaQ)+(1-P)*(_x_>=W), 
+														0,1e25,
+														P*IBeta(Min(_x_,1),betaP+1,betaQ)*betaP/(betaP+betaQ)+(1-P)*W*(_x_>=W));
+									}
+								}
+								else
+								{
+									if (rateType == 8)
+									{
+										global P	 = .5;
+										global betaP = 1;
+										global betaQ = 2;
+										betaP:>0.05;betaP:<85;
+										betaQ:>0.05;betaQ:<85;
+										global alpha = .5;
+										global beta  = 1;
+										alpha:>0.01;alpha:<100;
+										beta:>0.01;										
+										beta:<200;
+										P:<1;
+										category c = (resp, EQUAL, MEAN, 
+															P*_x_^(betaP-1)*(1-Min(_x_,1))^(betaQ-1)/Beta(betaP,betaQ)+(1-P)*GammaDist(_x_,alpha,beta), 
+															P*IBeta(Min(_x_,1),betaP,betaQ)+(1-P)*CGammaDist(_x_,alpha,beta), 
+															0,1e25,
+															P*betaP/(betaP+betaQ)*IBeta(Min(_x_,1),betaP+1,betaQ)+(1-P)*alpha/beta*CGammaDist(_x_,alpha+1,beta));
+									}	
+									else
+									{
+										if (rateType == 9)
+										{
+											global P	 = .5;
+											P:<1;
+											global betaP = 1;
+											betaP:>0.05;betaP:<85;
+											global betaQ = 2;
+											betaQ:>0.05;betaQ:<85;
+											global alpha = .5;
+											alpha:>0.01;alpha:<100;
+											global beta  = 1;
+											beta:>0.01;beta:<500;
+											category c = (resp, EQUAL, MEAN, 
+																P*_x_^(betaP-1)*(1-Min(_x_,1))^(betaQ-1)/Beta(betaP,betaQ)+(1-P)*(_x_>1)*GammaDist(Max(1e-20,_x_-1),alpha,beta), 
+																P*IBeta(Min(_x_,1),betaP,betaQ)+(1-P)*CGammaDist(Max(_x_-1,0),alpha,beta), 
+																0,1e25,
+																P*betaP/(betaP+betaQ)*IBeta(Min(_x_,1),betaP+1,betaQ)+
+																		(1-P)*(alpha/beta*CGammaDist(Max(0,_x_-1),alpha+1,beta)+CGammaDist(Max(0,_x_-1),alpha,beta)));
+										}				
+										else
+										{
+											if (rateType == 10)
+											{
+												global P	 = .5;
+												global betaP = 1;
+												global betaQ = 2;
+												betaP:>0.05;
+												betaQ:>0.05;
+												betaP:<85;
+												betaQ:<85;
+												global mu = 3;
+												global sigma  = .01;
+												sigma:>0.0001;
+												sqrt2pi = Sqrt(8*Arctan(1));
+												P:<1;
+
+												category c = (resp, EQUAL, MEAN, 
+																P*_x_^(betaP-1)*(1-Min(_x_,1))^(betaQ-1)/Beta(betaP,betaQ)+
+																	(1-P)*(_x_>=1)*Exp(-(_x_-mu)(_x_-mu)/(2*sigma*sigma))/(sqrt2pi__*sigma)/ZCDF((mu-1)/sigma), 
+																P*IBeta(Min(_x_,1),betaP,betaQ)+(1-P)*(_x_>=1)*(1-ZCDF((mu-_x_)/sigma)/ZCDF((mu-1)/sigma)), 
+																0,1e25,
+																P*betaP/(betaP+betaQ)*IBeta(Min(_x_,1),betaP+1,betaQ)+
+																(1-P)*(_x_>=1)*(mu*(1-ZCDF((1-mu)/sigma)-ZCDF((mu-_x_)/sigma))+
+																sigma*(Exp((mu-1)(1-mu)/(2*sigma*sigma))-Exp((_x_-mu)(mu-_x_)/(2*sigma*sigma)))/sqrt2pi__)/ZCDF((mu-1)/sigma));
+											}				
+											else
+											{
+												if (rateType == 11)
+												{
+													global P	 = 1/3;
+													global P1    = .5;
+
+													global mu = 3;
+													global sigma  = .5;
+													sigma:>0.0001;
+													global sigma1  = 1;
+													sigma1:>0.0001;
+
+													sqrt2pi = Sqrt(8*Arctan(1));
+													P:<1;
+													P1:<1;
+													
+													categFreqMatrix = {resp+1,1};
+													for (k=1; k<=resp; k=k+1)
+													{
+														categFreqMatrix[k]:=(1-P)/resp__;
+													}
+													categFreqMatrix[0]:=P;
+
+													category c = (resp+1, categFreqMatrix, MEAN,
+																	(1-P)((1-P1)*Exp(-(_x_-mu)(_x_-mu)/(2*sigma1*sigma1))/(sqrt2pi__*sigma1)/ZCDF(mu/sigma1)+
+																			  P1*Exp(-(_x_-1)(_x_-1)/(2*sigma*sigma))/(sqrt2pi__*sigma)/ZCDF(1/sigma)), 
+																	P+(1-P)(_x_>1e-20)((1-P1)(1-ZCDF((mu-_x_)/sigma1)/ZCDF(mu/sigma1))+
+																						P1*(1-ZCDF((1-_x_)/sigma)/ZCDF(1/sigma))), 
+																	0,1e25,
+																	(1-P)((1-P1)(mu*(1-ZCDF(-mu/sigma1)-ZCDF((mu-_x_)/sigma1))+
+																	sigma1*(Exp(-mu*mu/(2*sigma1*sigma1))-Exp((_x_-mu)(mu-_x_)/(2*sigma1*sigma1)))/sqrt2pi__)/ZCDF(mu/sigma1)+
+																	P(1-ZCDF(-1/sigma)-ZCDF((1-_x_)/sigma)+
+																	sigma*(Exp(-1/(2*sigma*sigma))-Exp((_x_-1)(1-_x_)/(2*sigma*sigma)))/sqrt2pi__)/ZCDF(1/sigma))
+																 );
+												}
+												else		
+												{
+													if (rateType == 12)
+													{
+														global P	 = 1/3;
+														global P1    = .5;
+
+														global mu = 3;
+														global sigma  = .25;
+														global sigma1 = .5;
+														global sigma2 = 1;
+														sigma:>0.0001;
+														sigma1:>0.0001;
+														sigma2:>0.0001;
+
+														sqrt2pi = Sqrt(8*Arctan(1));
+														P:<1;
+														P1:<1;
+
+														category c = (resp, EQUAL , MEAN,
+																		2*P*Exp(-_x_^2/(2*sigma*sigma))+
+																		(1-P)((1-P1)*Exp((_x_-mu)(mu-_x_)/(2*sigma2*sigma2))/(sqrt2pi__*sigma2)/ZCDF(mu/sigma2)+
+																			  P1*Exp((1-_x_)(_x_-1)/(2*sigma1*sigma1))/(sqrt2pi__*sigma1)/ZCDF(1/sigma1)), 
+																		P*(1-2*ZCDF(-_x_/sigma))+
+																		(1-P)((1-P1)(1-ZCDF((mu-_x_)/sigma2)/ZCDF(mu/sigma2))+
+																			   P1*(1-ZCDF((1-_x_)/sigma1)/ZCDF(1/sigma1))), 
+																		0,1e25,
+																		2*P*sigma*(1-Exp(-_x_*_x_/(2*sigma*sigma)))/sqrt2pi__+
+																		(1-P)((1-P1)(mu*(1-ZCDF(-mu/sigma2)-ZCDF((mu-_x_)/sigma2))+
+																		sigma2*(Exp(-mu*mu/(2*sigma2*sigma2))-Exp((_x_-mu)(mu-_x_)/(2*sigma2*sigma2)))/sqrt2pi__)/ZCDF(mu/sigma2)+
+																		P1(1-ZCDF(-1/sigma1)-ZCDF((1-_x_)/sigma1)+
+																		sigma1*(Exp(-1/(2*sigma1*sigma1))-Exp((_x_-1)(1-_x_)/(2*sigma1*sigma1)))/sqrt2pi__)/ZCDF(mu/sigma1))
+																		);
+													}
+													else
+													{				
+														if (rateType == 13)
+														{
+														
+															global betaP = 1;
+															global betaQ = 1;
+															betaP:>0.05;betaP:<85;
+															betaQ:>0.05;betaQ:<85;
+															category pc = (resp-1, EQUAL, MEAN, 
+																			_x_^(betaP-1)*(1-_x_)^(betaQ-1)/Beta(betaP,betaQ), /* density */
+																			IBeta(_x_,betaP,betaQ), /*CDF*/
+																			0, 				   /*left bound*/
+																			1, 			   /*right bound*/
+																			IBeta(_x_,betaP+1,betaQ)*betaP/(betaP+betaQ)
+															);
+
+															global alpha = .5;
+															global beta = 1;
+															alpha:>0.01;alpha:<100;
+															beta:>0.01;
+															beta:<200;
+															category c = (resp, pc, MEAN, GammaDist(_x_,alpha,beta), CGammaDist(_x_,alpha,beta), 0 , 
+													 			 		  1e25,CGammaDist(_x_,alpha+1,beta)*alpha/beta);
+														}
+													}
+												}				
+											}				
+										}				
+									}						
+								}
+							}
+						}
+					}				
+				}	
+			}	
+		}	
+	}		
+	return 0;
+}
diff --git a/res/TemplateBatchFiles/TemplateModels/chooseGeneticCode.def b/res/TemplateBatchFiles/TemplateModels/chooseGeneticCode.def
new file mode 100644
index 0000000..b3fcbe7
--- /dev/null
+++ b/res/TemplateBatchFiles/TemplateModels/chooseGeneticCode.def
@@ -0,0 +1,624 @@
+/* define various genetic code translation tables
+	
+   Table definitions used here can be found on the NCBI web page at
+   http://www3.ncbi.nlm.nih.gov/htbin-post/Taxonomy/wprintgc?mode=c#SG1
+
+  	here's how codes translate to aminoacids
+ 	
+ 	0 == Phe
+ 	1 == Leu
+ 	2 == Ile
+ 	3 == Met
+ 	4 == Val
+ 	5 == Ser
+ 	6 == Pro
+ 	7 == Thr
+ 	8 == Ala
+ 	9 == Tyr
+ 	10 == Stop
+ 	11 == His
+ 	12 == Gln
+ 	13 == Asn
+ 	14 == Lys
+ 	15 == Asp
+ 	16 == Glu
+ 	17 == Cys
+ 	18 == Trp
+ 	19 == Arg
+ 	20 == Gly
+ 	
+ 	AAA,AAC,AAG....TTA,TTC,TTG,TTT - 64 all in all*/
+				
+
+/* defines model states which are not allowed, i.e. termination codons.
+   GeneticCodeExclusions string is used by DataSetFilter to
+   eliminate "illegal" states from the data */
+
+
+
+_geneticCodeOptionMatrix   = 
+			{
+			{"Universal","Universal code. (Genebank transl_table=1)."}
+			{"Vertebrate mtDNA","Vertebrate mitochondrial DNA code. (Genebank transl_table=2)."}
+			{"Yeast mtDNA","Yeast mitochondrial DNA code. (Genebank transl_table=3)."}
+			{"Mold/Protozoan mtDNA","Mold, Protozoan and Coelenterate mitochondrial DNA and the Mycloplasma/Spiroplasma code. (Genebank transl_table=4)."}
+			{"Invertebrate mtDNA","Invertebrate mitochondrial DNA code. (Genebank transl_table=5)."}
+			{"Ciliate Nuclear","Ciliate, Dasycladacean and Hexamita Nuclear code. (Genebank transl_table=6)."}
+			{"Echinoderm mtDNA","Echinoderm mitochondrial DNA code. (Genebank transl_table=9)."}
+			{"Euplotid Nuclear","Euplotid Nuclear code. (Genebank transl_table=10)."}
+			{"Alt. Yeast Nuclear","Alternative Yeast Nuclear code. (Genebank transl_table=12)."}
+			{"Ascidian mtDNA","Ascidian mitochondrial DNA code. (Genebank transl_table=13)."}
+			{"Flatworm mtDNA","Flatworm mitochondrial DNA code. (Genebank transl_table=14)."}
+			{"Blepharisma Nuclear","Blepharisma Nuclear code. (Genebank transl_table=15)."}
+			{"Chlorophycean mtDNA","Chlorophycean Mitochondrial Code (transl_table=16)."}
+			{"Trematode mtDNA","Trematode Mitochondrial Code (transl_table=21)."}
+			{"Scenedesmus obliquus mtDNA","Scenedesmus obliquus mitochondrial Code (transl_table=22)."}
+			{"Thraustochytrium mtDNA","Thraustochytrium Mitochondrial Code (transl_table=23)."}
+			};
+			
+_genBankTranTableMap = {};
+_genBankTranTableMap ["1"] = "Universal";
+_genBankTranTableMap ["2"] = "Vertebrate mtDNA";
+_genBankTranTableMap ["3"] = "Yeast mtDNA";
+_genBankTranTableMap ["4"] = "Mold/Protozoan mtDNA";
+_genBankTranTableMap ["5"] = "Invertebrate mtDNA";
+_genBankTranTableMap ["6"] = "Ciliate Nuclear";
+_genBankTranTableMap ["9"] = "Echinoderm mtDNA";
+_genBankTranTableMap ["10"] = "Euplotid Nuclear";
+_genBankTranTableMap ["12"] = "Alt. Yeast Nuclear";
+_genBankTranTableMap ["13"] = "Ascidian mtDNA";
+_genBankTranTableMap ["14"] = "Flatworm mtDNA";
+_genBankTranTableMap ["15"] = "Blepharisma Nuclear";
+_genBankTranTableMap ["16"] = "Chlorophycean mtDNA";
+_genBankTranTableMap ["21"] = "Trematode mtDNA";
+_genBankTranTableMap ["22"] = "Scenedesmus obliquus mtDNA";
+_genBankTranTableMap ["23"] = "Thraustochytrium mtDNA";
+			
+_hyphyAAOrdering		   = "FLIMVSPTAYXHQNKDECWRG";
+_alphabeticalAAOrdering	   = "ACDEFGHIKLMNPQRSTVWY";
+
+_aaLetterToCode			   = {};
+
+_singleAALetterToFullName  = {
+"A": "Alanine",
+"C": "Cysteine",
+"D": "Aspartic Acid",
+"E": "Glutamic Acid",
+"F": "Phenylalanine",
+"G": "Glycine",
+"H": "Histidine",
+"I": "Isoleucine",
+"K": "Lysine",
+"L": "Leucine",
+"M": "Methionine",
+"N": "Aspargine",
+"P": "Proline",
+"Q": "Glutamine",
+"R": "Arginine",
+"S": "Serine",
+"T": "Theronine",
+"V": "Valine",
+"W": "Tryptophan",
+"Y": "Tyrosine",
+"X": "Stop Codon"
+};
+
+for (_idx = 0; _idx < Abs (_hyphyAAOrdering); _idx = _idx+1)
+{
+	_aaLetterToCode[_hyphyAAOrdering[_idx]] = _idx;
+}
+
+_geneticCodeNameToIndexMap = {};
+
+for (_idx = 0; _idx < Rows(_geneticCodeOptionMatrix); _idx = _idx+1)
+{
+	_geneticCodeNameToIndexMap[_geneticCodeOptionMatrix[_idx][0]] = _idx;
+}
+
+if (!skipCodeSelectionStep)
+{
+
+	ChoiceList (modelType,"Choose Genetic Code",1,SKIP_NONE,_geneticCodeOptionMatrix);			
+	
+	if (modelType < 0)
+	{
+		return;
+	}
+	
+	ApplyGeneticCodeTable (modelType);
+}
+
+/*----------------------------------------------------------------------------------------------------------*/
+
+function CountSenseCodons (code) {
+    sense_count = 0;
+    for (_idx = 0; _idx < 64; _idx += 1) {
+        if (IsStop (_idx, code) == 0) {
+            sense_count += 1;
+        }
+    }
+    return sense_count;
+}
+
+
+/*----------------------------------------------------------------------------------------------------------*/
+
+
+function ApplyGeneticCodeTable (myModelType)
+{
+	_Genetic_Code = {
+		
+		{14,/*AAA*/ 13,/*AAC*/ 14,/*AAG*/  13,/*AAT*/
+		  7, /*ACA*/ 7, /*ACC*/ 7, /*ACG*/  7, /*ACT*/
+		 19, /*AGA*/ 5, /*AGC*/19, /*AGG*/  5, /*AGT*/
+		  2, /*ATA*/ 2, /*ATC*/	3, /*ATG*/  2, /*ATT*/
+		 12,/*CAA*/ 11,/*CAC*/ 12,/*CAG*/  11,/*CAT*/
+		  6, /*CCA*/ 6, /*CCC*/ 6, /*CCG*/  6, /*CCT*/
+		 19,/*CGA*/ 19,/*CGC*/ 19,/*CGG*/  19,/*CGT*/
+		  1, /*CTA*/ 1, /*CTG*/ 1, /*CTC*/  1, /*CTT*/
+		 16,/*GAA*/ 15,/*GAC*/ 16,/*GAG*/  15,/*GAT*/
+		  8, /*GCA*/ 8, /*GCC*/ 8, /*GCG*/  8, /*GCT*/
+		 20,/*GGA*/ 20,/*GGC*/ 20,/*GGG*/  20,/*GGT*/
+		  4, /*GTA*/ 4, /*GTC*/ 4, /*GTG*/  4, /*GTT*/
+		 10,/*TAA*/  9, /*TAC*/10,/*TAG*/   9, /*TAT*/
+		  5, /*TCA*/ 5, /*TCC*/ 5, /*TCG*/  5, /*TCT*/
+		 10,/*TGA*/ 17,/*TGC*/ 18,/*TGG*/  17,/*TGT*/
+		  1, /*TTA*/ 0, /*TTC*/ 1, /*TTG*/  0  /*TTT*/ }
+	};
+					
+	GeneticCodeExclusions = "TAA,TAG,TGA";	
+	
+	if (myModelType == 1)
+	/* Vertebrate mtDNA */
+	{
+		_Genetic_Code [8] = 10; /* AGA => stop */
+		_Genetic_Code [10] = 10;/* AGG => stop */
+		_Genetic_Code [12] = 3; /* ATA => Met  */
+		_Genetic_Code [56] = 18;/* TGA => Trp  */
+		
+		GeneticCodeExclusions = "AGA,AGG,TAA,TAG";
+	}
+
+	if (myModelType == 2)
+	/* Yeast mtDNA */
+	{
+		_Genetic_Code [12] = 3; /* ATA => Met */
+		_Genetic_Code [28] = 7; /* CTA => Thr */
+		_Genetic_Code [29] = 7; /* CTC => Thr */
+		_Genetic_Code [30] = 7; /* CTG => Thr */
+		_Genetic_Code [31] = 7; /* CTT => Thr */
+		_Genetic_Code [56] = 18;/* TGA => Trp */
+		
+		GeneticCodeExclusions = "TAA,TAG";
+	}
+
+	if (myModelType == 3)
+	/* Mold,Protozoan and Coelenterate mtDNA */
+	{
+		_Genetic_Code [56] = 18;/* TGA => Trp */
+		GeneticCodeExclusions = "TAA,TAG";
+	}
+
+	if (myModelType == 4)
+	/* Invertebrate mtDNA */
+	{
+		_Genetic_Code [8] = 5; /* AGA => Ser  */
+		_Genetic_Code [10] = 5;/* AGG => Ser  */
+		_Genetic_Code [12] = 3;/* ATA => Met  */
+		_Genetic_Code [56] = 18;/* TGA => Trp  */
+		
+		GeneticCodeExclusions = "TAA,TAG";
+	}
+
+	if (myModelType == 5)
+	/* Ciliate Nuclear Code */
+	{
+		_Genetic_Code [48] = 12;/* TAA => Gln  */
+		_Genetic_Code [50] = 12;/* TAG => Gln  */
+		
+		GeneticCodeExclusions = "TGA";
+	}
+
+	if (myModelType == 6)
+	/* Echinoderm mtDNA */
+	{
+		_Genetic_Code [0] = 13; /* AAA => Asn  */
+		_Genetic_Code [8] = 5;  /* AGA => Ser  */
+		_Genetic_Code [10] = 5; /* AGG => Ser  */
+		_Genetic_Code [56] = 18;/* TGA => Trp  */
+		
+		GeneticCodeExclusions = "TAA,TAG";
+	}
+
+	if (myModelType == 7)
+	/* Euplotid mtDNA */
+	{
+		_Genetic_Code [56] = 17;/* TGA => Cys  */
+		
+		GeneticCodeExclusions = "TAA,TAG";
+	}
+
+	if (myModelType == 8)
+	/* Alternative Yeast Nuclear */
+	{
+		_Genetic_Code [30] = 5;/* CTG => Ser  */
+		
+		GeneticCodeExclusions = "TAA,TAG,TGA";
+	}
+
+	if (myModelType == 9)
+	/* Ascidian mtDNA */
+	{
+		_Genetic_Code [8] = 20;  /* AGA => Gly  */
+		_Genetic_Code [10] = 20; /* AGG => Gly  */
+		_Genetic_Code [12] = 3;  /* AGG => Met */
+		_Genetic_Code [56] = 18; /* TGA => Trp  */
+		
+		GeneticCodeExclusions = "TAA,TAG";
+	}
+
+	if (myModelType == 10)
+	/* Flatworm mtDNA */
+	{
+		_Genetic_Code [0] = 13;  /* AAA => Asn  */
+		_Genetic_Code [8] = 5;   /* AGA => Ser  */
+		_Genetic_Code [10] = 5;  /* AGG => Ser  */
+		_Genetic_Code [48] = 9;  /* TAA => Tyr */
+		_Genetic_Code [56] = 18; /* TGA => Trp  */
+		
+		GeneticCodeExclusions = "TAG";
+	}
+
+	if (myModelType == 11)
+	/* Blepharisma Nuclear */
+	{
+		_Genetic_Code [50] = 12;/* TAG => Gln  */
+		
+		GeneticCodeExclusions = "TAA,TGA";
+	}
+
+
+	if (myModelType == 12)
+	/* Chlorophycean Mitochondrial Code */
+	{
+		_Genetic_Code [50] = 1;/* TAG => Leu  */
+		
+		GeneticCodeExclusions = "TAA,TGA";
+	}
+
+	if (myModelType == 13)
+	/* Trematode Mitochondrial Code */
+	{
+		_Genetic_Code [56] = 18; /* TGA => Trp  */
+		_Genetic_Code [12] = 3;  /* ATA => Met  */
+		_Genetic_Code [8]  = 5;  /* AGA => Ser  */
+		_Genetic_Code [10] = 5;  /* AGG => Trp  */
+		_Genetic_Code [0]  = 13; /* AAA => Asn  */
+		
+		GeneticCodeExclusions = "TAA,TAG";
+	}
+
+	if (myModelType == 14)
+	/*  Scenedesmus obliquus mitochondrial Code */
+	{
+		_Genetic_Code [52] = 10;  /* TCA => Stop  */
+		_Genetic_Code [50] = 1;   /* TAG => Leu  */
+				
+		GeneticCodeExclusions = "TAA,TCA,TGA";
+	}
+
+	if (myModelType == 15)
+	/*  Thraustochytrium mtDNA */
+	{
+		_Genetic_Code [60] = 10;  /* TTA => Stop  */
+				
+		GeneticCodeExclusions = "TAA,TAG,TGA,TTA";
+	}
+
+	return  myModelType;
+}
+
+/*----------------------------------------------------------------------------------------------------------*/
+
+function mapCodonsToAAGivenMappingAux (codonSeq,aaSequence, mapping, this_many_mm) {
+    seqLen  = Abs (aaSequence);
+	translString = "";
+	translString * (seqLen);
+	seqLenN = Abs (codonSeq);
+	
+	aaPos     = 0;
+	seqPos    = 0;
+	codon     = codonSeq[seqPos][seqPos+2];
+	currentAA = mapping[codon];
+	mismatch_count = 0;
+	
+	for (aaPos = 0; aaPos < seqLen && seqPos < seqLenN; aaPos += 1)
+	{
+		advance = 1;
+		copy_codon = 1;
+		
+		if (currentAA != 0) {
+            if (aaSequence[aaPos] == "-") {
+                if (currentAA != "X") {
+                    translString * "---";
+                    advance = 0;
+                }
+            }
+            else {
+                mismatch_count += (aaSequence[aaPos] != currentAA);
+                if (this_many_mm == 1) {
+                    assert (mismatch_count < this_many_mm, "A mismatch between codon and protein sequences at position " + aaPos 
+                            + " : codon '" + codonSeq[seqPos][seqPos+2] + "'(" + aaSequence[aaPos] + ") a.a. '`currentAA`'");
+                } else {
+                    if (mismatch_count >= this_many_mm) {
+                        translString * 0;
+                        return None;
+                    }
+                }
+            }
+        } else {
+            copy_codon = 0;
+        }
+        
+		if (advance) {
+		    if (copy_codon) {
+		    	if (currentAA == "X") {
+                	translString * "---";
+                } else {
+                	translString * codon;                
+                }
+            } else {
+                //fprintf (stdout, "Skipping codon ", codon, "\n");
+                aaPos = aaPos -1;
+            }
+            seqPos    += 3;
+            codon     = codonSeq[seqPos][seqPos+2];
+            currentAA = mapping[codon];
+		}
+	} 
+	
+	
+	translString * 0;
+	
+	return translString;
+}
+
+/*----------------------------------------------------------------------------------------------------------*/
+
+function mapCodonsToAAGivenMapping (codonSeq,aaSequence, mapping) {
+    return mapCodonsToAAGivenMappingAux (codonSeq,aaSequence, mapping, 1);
+}
+
+
+/*----------------------------------------------------------------------------------------------------------*/
+
+function mapCodonsToAA (codonSeq,aaSequence) {
+	return mapCodonsToAAGivenMapping (codonSeq,aaSequence,defineCodonToAA ());
+}
+
+/*----------------------------------------------------------------------------------------------------------*/
+
+function mapCodonsToAAFuzzy (codonSeq,aaSequence, mismatches) {
+	return mapCodonsToAAGivenMappingAux (codonSeq,aaSequence,defineCodonToAA (),mismatches);
+}
+
+
+/*----------------------------------------------------------------------------------------------------------*/
+
+function CompareCodonProperties (codon1, codon2, code)
+/* given: 
+		 codon1 (a number between 0 and 63 in AAA...TTT encoding), 
+		 codon2 (same encoding),
+		 code (the genetic code)
+		 
+	returns a dictionary with the following keys:
+	
+		"NONSYNONYMOUS" : [BOOLEAN] set to 1 if codon1 <-> codon2 is a non-synynomous substitution, otherwise 0
+		"DIFFERENCES"   : [INTEGER 0,1,2,3] set to the number of nucleotide differences
+		"BY_POSITION"	: [BOOLEAN MATRIX] a 1x3 matrix, where the i-th entry is 1 if the corresponding nucleotide position is different between the codons
+		"1"				: [1x2 MATRIX]	   nucleotide substitution in position 1 (from -> to) encoded as an index into "ACGT"
+										   for example, codon1 = TCT, codon 2 = GCT, this matrix will be {{3,2}}
+
+		"2"				: ... same for the second position
+		"3"				: ... same for the third  position		
+*/		 
+
+{
+	_codonCompResult = {};
+	
+	_codonCompResult ["NONSYNONYMOUS"] = (code[codon1] != code[codon2]);
+	_codonCompResult ["BY_POSITION"]   = {1,3};
+	
+	for (_ci = 0; _ci < 3; _ci = _ci + 1)
+	{
+		
+		_positionMatrix = {1,2};
+		_positionMatrix [0] = codon1 % 4;
+		_positionMatrix [1] = codon2 % 4;
+	
+		_codonCompResult[1+_ci] = _positionMatrix;
+		(_codonCompResult ["BY_POSITION"])  [_ci] = (_positionMatrix [0] != _positionMatrix [1]);
+		
+		codon1 = codon1 $ 4;
+		codon2 = codon2 $ 4;
+	}
+	
+	_codonCompResult ["DIFFERENCES"] = (_codonCompResult ["BY_POSITION"])[0] + (_codonCompResult ["BY_POSITION"])[1] + (_codonCompResult ["BY_POSITION"])[2];
+	
+	return _codonCompResult;
+}
+
+/*----------------------------------------------------------------------------------------------------------*/
+
+function defineCodonToAA ()
+{	
+	codonToAAMap = {};
+	nucChars = "ACGT";
+	
+	for (p1=0; p1<64; p1=p1+1)
+	{
+		codonToAAMap[nucChars[p1$16]+nucChars[p1%16$4]+nucChars[p1%4]] = _hyphyAAOrdering[_Genetic_Code[p1]];
+	}
+	
+	return codonToAAMap;
+}
+
+/*----------------------------------------------------------------------------------------------------------*/
+
+function defineCodonToAAGivenCode (code)
+{	
+	codonToAAMap = {};
+	nucChars = "ACGT";
+	
+	for (p1=0; p1<64; p1+=1) {
+		codonToAAMap[nucChars[p1$16]+nucChars[p1%16$4]+nucChars[p1%4]] = _hyphyAAOrdering[code[p1]];
+	}
+	
+	return codonToAAMap;
+}
+
+/*----------------------------------------------------------------------------------------------------------*/
+
+function findAllCodonsForAA (aa)
+{	
+	codonsForAA = {};
+	
+	for (p1=0; p1<64; p1=p1+1)
+	{
+		if (_hyphyAAOrdering[_Genetic_Code[p1]] == aa) {
+		    codonsForAA [p1] = 1;
+		}
+	}
+	
+	return codonsForAA;
+}
+
+/*----------------------------------------------------------------------------------------------------------*/
+
+function RawToSense (code)
+/* 
+    given:
+    		genetic code,
+    
+    returns a 64x1 matrix mapping raw codons to sense codons only (stops are mapped to -1)
+*/
+{
+	_codonMap = {64,1};
+	
+	_cShift = 0;
+	for (_ci = 0; _ci < 64; _ci = _ci + 1)
+	{
+		if (code[_ci] == 10)
+		{
+			_cShift = _cShift + 1;
+			_codonMap [_ci] = -1;
+		}
+		else
+		{
+			_codonMap [_ci] = _ci - _cShift;
+		}
+	}
+	
+	return _codonMap;
+}
+
+
+/*----------------------------------------------------------------------------------------------------------*/
+
+function IsTransition (pair)
+/* 
+    given:
+    		a pair of nucleotides (as a 1x2 matrix, e.g. as returned by CompareCodonProperties["1"]),
+    
+    returns 1 if the substitution is a transition 
+    returns -1 if the substitution is a transversion
+    
+    RETURNS 0 IF NO SUBSTITUTION TOOK PLACE
+*/
+{
+	if (pair[0] != pair[1])
+	{
+		if (Abs(pair[0]-pair[1])%2 == 0)
+		{
+			return 1;
+		}
+		return -1;
+	}
+	return 0;
+}
+
+/*----------------------------------------------------------------------------------------------------------*/
+
+function IsStop (codon, code)
+
+/* 
+	given: 
+		 codon (a number between 0 and 63 in AAA...TTT encoding)
+		 code (the genetic code)
+		 
+	returns 
+		 whether or not the codon is a stop codon
+*/		 
+
+{
+	return code[codon] == 10;
+}
+
+/*----------------------------------------------------------------------------------------------------------*/
+
+function translateCodonToAA (codonSeq,mapping,offset)
+{
+	seqLen = Abs (codonSeq);
+	translString = "";
+	translString * (seqLen/3+1);
+	for (seqPos = offset; seqPos < seqLen; seqPos += 3) {
+		codon = codonSeq[seqPos][seqPos+2];
+		prot  = mapping[codon];
+		if (Abs(prot))
+		{
+			translString * prot;
+		}
+		else
+		{
+		    if (codon == "---") {
+			    translString * "-";
+		    } else {
+			    translString * "?";
+			}
+	    }
+	} 
+	translString * 0;
+	translString = translString^{{"X$","?"}};
+	
+	return translString;
+}
+
+
+
+/*----------------------------------------------------------------------------------------------------------*/
+
+lfunction ComputeCodonCodeToStringMap (genCode)
+{
+	_codonMap = {};
+	_nucLetters = "ACGT";
+	for (_idx = 0; _idx < Columns(genCode); _idx += 1) {
+		if (genCode[_idx] != 10) {
+		    _codonMap + (_nucLetters[_idx$16] + _nucLetters[(_idx%16)$4] + _nucLetters[_idx%4]);
+		}
+	}
+	return _codonMap;
+}
+
+/*----------------------------------------------------------------------------------------------------------*/
+
+lfunction ComputeCodonCodeToStringMapStop (genCode)
+{
+	_codonMap = {};
+	_nucLetters = "ACGT";
+	for (_idx = 0; _idx < Columns(genCode); _idx += 1) {
+		if (genCode[_idx] == 10) {
+			_codonMap + (_nucLetters[_idx$16] + _nucLetters[(_idx%16)$4] + _nucLetters[_idx%4]);
+		}
+	}
+	return _codonMap;
+}
diff --git a/res/TemplateBatchFiles/TemplateModels/custm4x4.mdl b/res/TemplateBatchFiles/TemplateModels/custm4x4.mdl
new file mode 100644
index 0000000..aa0430b
--- /dev/null
+++ b/res/TemplateBatchFiles/TemplateModels/custm4x4.mdl
@@ -0,0 +1,371 @@
+/* This file defines the transition matrix an arbitrary time reversible model.
+   The file should be used as follows:
+   
+   1) Read Data File and create datafilter filteredData
+   2) #include this file (or use SelectTemplateModel(filteredData);)
+   3) Define the tree
+   4) Proceed with the likelihood function using 'vectorOfFrequencies' as the vector to pass to the constructor.
+   
+   This model has the following signature:
+    #Short:Custom#
+   	#Desc:Custom 4x4 reversible model (defined as in 010023) with choice of several equilibrium frequencies options.#
+   	#Dimension:4#
+    #DataType:nucleotide#
+   	#FileName:custm4x4.mdl#
+   
+   12/17/1999  by Sergei L. Kosakovsky Pond
+   Modified    on 03/06/2000 to comply with new Model syntax. 
+   Fixed	   04/2002 to really comply with the new Model syntax :\
+*/
+
+function  setElement (h,v,cc)
+{	
+	mSpecMatrix[h][v]=cc+1;
+	mSpecMatrix[v][h]=cc+1;
+	return 1;
+}
+
+done = 0;
+
+while (!done)
+{
+	fprintf (stdout,"\nPlease enter a 6 character model designation (e.g:010010 defines HKY85):");
+	fscanf  (stdin,"String", modelDesc);
+	if (Abs(modelDesc)==6)
+	{	
+		done = 1;
+	}
+}
+
+sharedFlag = 0;
+categoriesUsed = 0;
+
+#include "modelParameters.mdl";
+
+if (modelType >0)
+{
+	sharedFlag = 1;
+	if (modelType == 2)
+	{
+		categoriesUsed = 1;
+		#include "defineGamma.mdl";
+	}
+	if (modelType == 3)
+	{
+		categoriesUsed = 1;
+		#include "defineHM.mdl";
+	}
+}
+
+if (sharedFlag)
+{
+	global AC=1;
+	global AT=1;
+	global CG=1;
+	global CT=1;
+	global GT=1;
+}
+
+
+mSpecMatrix = {{*,1,1,1}{1,*,1,1}{1,1,*,1}{1,1,1,*}};
+
+elementAssignments = {{0,0,0,0,0,0}};
+
+paramCount = 1;
+
+customLoopCounter3=setElement (0,1,0);
+
+for (customLoopCounter2=1; customLoopCounter2<6; customLoopCounter2=customLoopCounter2+1)
+{
+	for (customLoopCounter=0; customLoopCounter<customLoopCounter2; customLoopCounter=customLoopCounter+1)
+	{
+		if (modelDesc[customLoopCounter2]==modelDesc[customLoopCounter])
+		{
+			elementAssignments[customLoopCounter2]=elementAssignments[customLoopCounter];
+			if (customLoopCounter2<3)
+			{
+				customLoopCounter3=setElement (0,customLoopCounter2+1,elementAssignments[customLoopCounter]);
+			}
+			else
+			{
+				if (customLoopCounter2<5)
+				{
+					customLoopCounter3=setElement (1,customLoopCounter2-1,elementAssignments[customLoopCounter]);
+				}
+				else
+				{
+					customLoopCounter3=setElement (2,3,elementAssignments[customLoopCounter]);
+				}
+			}
+			break;
+		}
+	}
+	if (customLoopCounter==customLoopCounter2)
+	{
+		if (customLoopCounter2<3)
+		{
+			customLoopCounter3=setElement (0,customLoopCounter2+1,paramCount);
+		}
+		else
+		{
+			if (customLoopCounter2<5)
+			{
+				customLoopCounter3=setElement (1,customLoopCounter2-1,paramCount);
+			}
+			else
+			{
+				customLoopCounter3=setElement (2,3,paramCount);
+			}
+		}
+		elementAssignments[customLoopCounter2] = paramCount;
+		paramCount = paramCount+1;
+	}
+	
+}
+
+rateBiasTerms = {{"AC","1","AT","CG","CT","GT"}};
+
+/*------------------------------------------------------------------------------------*/
+
+function promptForUserValue (ParameterName)
+{
+	parValue = -1;
+	while (parValue < 0)
+	{
+		fprintf (stdout, "Enter the rate for ", ParameterName, " (relative to AG rate):");
+		fscanf  (stdin, "Number", parValue);
+	}
+	return parValue;
+}
+
+/*------------------------------------------------------------------------------------*/
+
+if (sharedFlag)
+{
+	ChoiceList  (rateResp,"Rate Parameters",1,NO_SKIP,
+				 "Estimated","Rate parameters are inferred by maximum likelihood.",
+				 "User","Rate parameters are fixed at user specified values");
+				 
+	if (rateResp<0)
+	{
+		return 1;
+	}
+	
+	if (rateResp == 1)
+	{
+		if (elementAssignments[1]!=elementAssignments[0])
+		{
+			AC = promptForUserValue ("AC");
+		}
+		for (customLoopCounter=2; customLoopCounter < 6; customLoopCounter = customLoopCounter + 1)
+		{
+			for (customLoopCounter2=0; customLoopCounter2 < customLoopCounter; customLoopCounter2 = customLoopCounter2 + 1)
+			{
+				if (elementAssignments[customLoopCounter2]==elementAssignments[customLoopCounter])
+				{
+					break;
+				}
+			}
+			
+			if (customLoopCounter2 == customLoopCounter)
+			{
+				customLoopCounter2 = promptForUserValue (rateBiasTerms[customLoopCounter]);
+				ExecuteCommands (rateBiasTerms[customLoopCounter]+"=customLoopCounter2;");
+			}
+		}
+	}
+}
+
+
+ChoiceList  (freqResp,"Equilibrium Frequencies",1,NO_SKIP,
+			 "Observed","Nucleotide frequencies collected from the data file will be used as equilibrium frequencies.",
+			 "Equal","Equal (.25) frequencies are used as equilibrium frequencies",
+			 "Custom","Define your own vector of frequencies.");
+			 
+if (freqResp<0) 
+{
+	return 1;
+}
+else
+{
+	 if (freqResp<1)
+	 {
+		HarvestFrequencies (vectorOfFrequencies, filteredData,1,1,0);
+		FREQUENCY_SENSITIVE = 1;
+	 }
+	 else
+	 {
+	 	if (freqResp<2)
+	 	{
+	 		equalFreqs = {{.25}{.25}{.25}{.25}};
+	 	}
+	 	else
+	 	{
+	 		userFreqs = {4,1};
+	 		while (1)
+	 		{
+	 			fprintf (stdout, "\nEnter the frequencies of A,C and G (T computed automatically). Use spaces to separate the entries:");
+	 			fscanf  (stdin, "Number,Number,Number",customLoopCounter,customLoopCounter2,customLoopCounter3);
+	 			if ((customLoopCounter>=0)&&(customLoopCounter2>=0)&&(customLoopCounter3>=0)&&(customLoopCounter+customLoopCounter2+customLoopCounter3<=1))
+	 			{
+	 				userFreqs[0][0]=customLoopCounter;
+	 				userFreqs[1][0]=customLoopCounter2;
+	 				userFreqs[2][0]=customLoopCounter3;
+	 				userFreqs[3][0]=1-customLoopCounter-customLoopCounter2-customLoopCounter3;
+	 				fprintf (stdout, "\nUsing the following frequencies:",userFreqs);
+	 				break;
+	 			}
+	 			else
+	 			{
+	 				fprintf (stdout, "\nInvalid choice of frequencies. Please try again");
+	 			}
+	 		}
+	 	}
+	 	
+	 }
+	 
+}
+
+function PopulateModelMatrix (ModelMatrixName&, EFV)
+{
+	ModelMatrixName = {4,4};
+	if (sharedFlag)
+	{
+		modelConstraintString = "";
+		
+		modelDesc = Format(mSpecMatrix[0][1],1,0)+Format(mSpecMatrix[0][2],1,0)+Format(mSpecMatrix[0][3],1,0)+Format(mSpecMatrix[1][2],1,0)+Format(mSpecMatrix[1][3],1,0)
+					+Format(mSpecMatrix[2][3],1,0);
+
+		AC = AC;
+		AT = AT;
+		CG = CG;
+		CT = CT;
+		GT = GT;
+
+		for (customLoopCounter2=1; customLoopCounter2<6; customLoopCounter2=customLoopCounter2+1)
+		{
+			for (customLoopCounter=0; customLoopCounter<customLoopCounter2; customLoopCounter=customLoopCounter+1)
+			{
+				if (modelDesc[customLoopCounter2]==modelDesc[customLoopCounter])
+				{
+					if (rateBiasTerms[customLoopCounter2] == "1")
+					{
+						modelConstraintString = modelConstraintString + rateBiasTerms[customLoopCounter]+":="+rateBiasTerms[customLoopCounter2]+";";
+					}
+					else
+					{
+						modelConstraintString = modelConstraintString + rateBiasTerms[customLoopCounter2]+":="+rateBiasTerms[customLoopCounter]+";";			
+					}
+					break;
+				}
+			}
+		}	
+
+		if (Abs(modelConstraintString))
+		{
+			ExecuteCommands (modelConstraintString);
+			if (rateResp==1)
+			{
+				AC:=AC__;
+				AT:=AT__;
+				CG:=CG__;
+				CT:=CT__;
+				GT:=GT__;
+			}
+		}
+		
+		if (categoriesUsed)
+		{
+			ModelMatrixName = 
+				 {{*,AC*c*t,c*t,AT*c*t}
+				 {AC*c*t,*,CG*c*t,CT*c*t}
+				 {c*t,CG*c*t,*,GT*c*t}
+				 {AT*c*t,CT*c*t,GT*c*t,*}};
+		}
+		else
+		{
+			ModelMatrixName = 
+				 {{*,AC*t,t,AT*t}
+				 {AC*t,*,CG*t,CT*t}
+				 {t,CG*t,*,GT*t}
+				 {AT*t,CT*t,GT*t,*}};
+		}
+	}
+	else
+	{
+		for (customLoopCounter=0;customLoopCounter<4;customLoopCounter=customLoopCounter+1)
+		{
+			for (customLoopCounter_2=customLoopCounter+1;customLoopCounter_2<4;customLoopCounter_2=customLoopCounter_2+1)
+			{
+				customLoopCounter_r = mSpecMatrix[customLoopCounter][customLoopCounter_2];
+				if (customLoopCounter_r==1)
+				{
+					ModelMatrixName[customLoopCounter][customLoopCounter_2]:=t_ac;
+					ModelMatrixName[customLoopCounter_2][customLoopCounter]:=t_ac;
+				}
+				else
+				{
+					if (customLoopCounter_r==2)
+					{
+						ModelMatrixName[customLoopCounter][customLoopCounter_2]:=t_ag;
+						ModelMatrixName[customLoopCounter_2][customLoopCounter]:=t_ag;
+					}
+					else
+					{
+						if (customLoopCounter_r==3)
+						{
+							ModelMatrixName[customLoopCounter][customLoopCounter_2]:=t_at;
+							ModelMatrixName[customLoopCounter_2][customLoopCounter]:=t_at;
+						}
+						else
+						{
+							if (customLoopCounter_r==4)
+							{
+								ModelMatrixName[customLoopCounter][customLoopCounter_2]:=t_cg;
+								ModelMatrixName[customLoopCounter_2][customLoopCounter]:=t_cg;
+							}
+							else
+							{
+								if (customLoopCounter_r==5)
+								{
+									ModelMatrixName[customLoopCounter][customLoopCounter_2]:=t_ct;
+									ModelMatrixName[customLoopCounter_2][customLoopCounter]:=t_ct;
+								}
+								else
+								{
+									ModelMatrixName[customLoopCounter][customLoopCounter_2]:=t_gt;
+									ModelMatrixName[customLoopCounter_2][customLoopCounter]:=t_gt;
+								}
+							}
+						}
+					}
+				}
+				
+			}
+		}
+	}	
+	return 1;
+}
+
+custom4x4matrix = 0;
+
+if (freqResp>0)
+{
+	if (freqResp<2)
+	{
+		MULTIPLY_BY_FREQS = PopulateModelMatrix ("custom4x4matrix",equalFreqs);
+		Model custom4x4 = (custom4x4matrix,equalFreqs,MULTIPLY_BY_FREQS);	
+	}
+	else
+	{
+		MULTIPLY_BY_FREQS = PopulateModelMatrix ("custom4x4matrix",userFreqs);
+		Model custom4x4 = (custom4x4matrix,userFreqs,MULTIPLY_BY_FREQS);	
+		equalFreqs = userFreqs; 
+		/* Hack. Used in rebuilding models in NJ and CLUSTER bootstrap */
+	}
+}
+else
+{
+	MULTIPLY_BY_FREQS = PopulateModelMatrix ("custom4x4matrix",vectorOfFrequencies);
+	Model custom4x4 = (custom4x4matrix,vectorOfFrequencies,MULTIPLY_BY_FREQS);	
+}
diff --git a/res/TemplateBatchFiles/TemplateModels/defineGamma.mdl b/res/TemplateBatchFiles/TemplateModels/defineGamma.mdl
new file mode 100644
index 0000000..5e09cd2
--- /dev/null
+++ b/res/TemplateBatchFiles/TemplateModels/defineGamma.mdl
@@ -0,0 +1,456 @@
+function GaussLaguerreQuardature (n,alf)
+{
+	GLMatrix = {n,2};
+	
+	mf = 1/(Gamma (n)*Gamma (alf+1));
+	
+	for (i=1; i<=n; i=i+1)
+	{
+		if (i==1)
+		{
+			z = (1+alf)*(3+0.92*alf)/(1+2.4*n+1.8*alf);
+		}
+		else
+		{
+			if (i==2)
+			{
+				z = z+(15+6.25*alf)/(1+.9*alf+2.5*n);
+			}
+			else
+			{
+				ai = i-2;
+				z = z+((1+2.55*ai)/(1.9*ai)+1.26*ai*alf/(1+3.5*ai))*(z-GLMatrix[i-3][0])/(1+0.3*alf);
+			}
+		}
+		for (its=1;its<=10;its=its+1)
+		{
+			p1 = 1;
+			p2 = 0;
+			for (j=1; j<=n; j=j+1)
+			{
+				p3 = p2;
+				p2 = p1;
+				p1 = ((2*j-1+alf-z)*p2-(j-1+alf)*p3)/j;
+			}
+			pp = (n*p1-(n+alf)*p2)/z;
+			z1 = z;
+			z  = z1-p1/pp;
+			if (Abs (z-z1)<1e-14)
+			{
+				break;
+			}
+		}
+		GLMatrix[i-1][0] = z;
+		GLMatrix[i-1][1] = -Gamma(alf+n)*mf/(pp*n*p2);
+	}
+	
+	for (i=0; i<n; i=i+1)
+	{
+		GLMatrix[i][0] = GLMatrix[i][0]/(alf+1);
+	}
+	
+	return GLMatrix;
+}
+
+ffunction		GammaQuadWeight (ind, alph, type)
+{
+	if (alph == cachedAlpha)
+	{
+		return cachedValues[ind][type];
+	}
+	cachedAlpha = alph;
+	if (ind == 0)
+	{
+		cachedValues = GaussLaguerreQuardature (resp, alph-1);
+	}
+	return cachedValues[ind][type];
+}
+
+/*_________________________________________________________________________________________________________________*/
+
+if (SKIP_DISTRIBUTION_CHOICE != 1)
+{
+
+ChoiceList (distribution,"Choose Distribution",1,SKIP_NONE,
+			/*0*/"Gamma","Gamma distribution with shape parameter alpha. Mean: alpha, variance: 1/alpha.",
+			/*1*/"Beta","Two-parameter beta distrubution. Mean: betaP/(betaQ+betaP), variance: betaP*betaQ/((betaP+betaQ)^2 (betaP+betaQ+1)).",
+			/*2*/"Normal(x>0)","Two-parameter normal distrubution restriced to x>0. Mean parameter: mu, variance parameter: sigma^2.",
+			/*3*/"Log normal","Unit mean log normal distribution with parameter sigma. Variance: 1/[exp(sigma^2)-1].",
+			/*4*/"Gamma+Inv","Gamma distribution with shape parameter alpha and mean 1/(1-P) and a zero rate class for invariable sites with weight P.",
+			/*5*/"Gamma Quadratures","Gamma distribution with shape parameter alpha. Mean: alpha, variance: 1/alpha. Discretized using Gauss-Laguerre quadratures, matching 2N-1 moments, with N = the number of rate classes.",
+			/*6*/"Inv Class","A mixture of point masses at 0 and 1, with proportions P and (1-P). Mean: (1-P), variance P(1-P). Parameters: P - the proportion of invariable sites.",
+			/*7*/"General Discrete","Unit mean general discrete.",
+			/*8*/"Beta-Gamma","Gamma distribution with shape parameter alpha partitioned by a beta distribution.",
+			/*9*/"Beta-Lognormal","Mean one log normal distribution with parameter sigma, partitioned by the beta. Variance: 1/[exp(sigma^2)-1].",
+			/*10*/"Normal(x>0) mod Beta","Normal (x>0) distribution with parameter sigma, partitioned by the beta. Mean parameter: mu, variance parameter: sigma^2.",
+			/*11*/"Beta-Uniform","Mean 1 piecewise uniform on [0,1] and [1,R] partitioned by the beta.",
+			/*12*/"Uniform","Mean 1 piecewise uniform on [0,1] and [1,R].",
+			/*13*/"Beta-(Gamma+Inv)","Mixture of gamma mod beta and an invariant class partitioned by the beta.",
+			);
+}
+
+if (distribution<0)
+{
+	return;
+}
+
+if (distribution!=6)
+{
+	fprintf (stdout,"\nHow many rate classes should we have?");
+	fscanf  (stdin,"Number", resp);
+}
+
+if (distribution==0)
+{
+	global alpha = .5;
+	alpha:>0.01;alpha:<100;
+	category c = (resp, EQUAL, MEAN, 
+					GammaDist(_x_,alpha,alpha), 
+					CGammaDist(_x_,alpha,alpha), 
+					0 , 
+			  	    1e25,
+			  	    CGammaDist(_x_,alpha+1,alpha)
+			  	 );
+}
+if (distribution==1)
+{
+	global betaP = 1;
+	global betaQ = 1;
+	betaP:>0.05;betaP:<85;
+	betaQ:>0.05;betaQ:<85;
+	category c = (resp, EQUAL, MEAN, 
+					_x_^(betaP-1)*(1-_x_)^(betaQ-1)/Beta(betaP,betaQ), /* density */
+					IBeta(_x_,betaP,betaQ), /*CDF*/
+					0, 				   /*left bound*/
+					1, 			   /*right bound*/
+					IBeta(_x_,betaP+1,betaQ)*betaP/(betaP+betaQ)
+			  	 );
+}
+if (distribution==2)
+{
+	global mu = 1;
+	global sigma  = .5;
+	sigma:>0.0001;
+
+	sqrt2pi = Sqrt(8*Arctan(1));
+	category c = (resp, EQUAL, MEAN, 
+					Exp((_x_-mu)^2/(2*sigma*sigma))/(sqrt2pi__*sigma)/ZCDF(mu/sigma), /* density */
+					(1-ZCDF((mu-_x_)/sigma))/ZCDF(mu/sigma), /*CDF*/
+					0, 				   /*left bound*/
+					1e25, 			   /*right bound*/
+					(mu*(1-ZCDF(-mu/sigma)-ZCDF((mu-_x_)/sigma))+
+				    sigma*(Exp(-mu*mu/(2*sigma*sigma))-
+				    Exp((_x_-mu)(mu-_x_)/(2*sigma*sigma)))/sqrt2pi__)/ZCDF(mu/sigma)
+			  	 );
+}
+if (distribution==3)
+{
+	global sigma = .1;
+	sigma:>0.0001;sigma:<10;
+	sqrt2pi = Sqrt(8*Arctan(1));
+	category c = (resp, EQUAL, MEAN, 
+					Exp(-0.5*(Log(_x_)+sigma^2/2)^2/sigma^2)/ (_x_*sigma*sqrt2pi__), /*density*/
+					ZCDF (Log(_x_)/sigma+0.5*sigma), /*CDF*/
+					1e-200, 			   /*left bound*/
+					1e200, 			       /*right bound*/
+					ZCDF (Log(_x_)/sigma-0.5*sigma)
+			  	 );
+}
+if (distribution==4)
+{
+	global alpha   = .5;
+	alpha:>0.01;alpha:<100;
+
+	global beta = 1;
+	beta:>0.01;
+	beta:<200;
+
+	global P;
+	P :< 1-(1e-10);
+	P = 1/(resp+1);
+	
+	beta := (1-P)*alpha;
+	
+	
+	catFreqMatrix = {resp+1,1};
+	catFreqMatrix [0] := P;
+	
+	for (h=1; h<=resp;h=h+1)
+	{
+		catFreqMatrix [h] := (1-P)/resp__;
+	}
+	
+	category c = (resp+1, catFreqMatrix, MEAN, 
+					(1-P)*GammaDist(_x_,alpha,beta)*(_x_>0), 
+					(1-P)*CGammaDist(_x_,alpha,beta)*(_x_>0)+P, 
+					0, 
+			  	    1e25,
+			  	    (1-P)*CGammaDist(_x_,alpha+1,beta)*(alpha/beta)*(_x_>0)
+			  	 );
+}
+if (distribution==5)
+{
+	cachedAlpha = -1;
+	
+	global alpha = .5;
+	alpha:>0.01;alpha:<100;
+	alpha 		= 1;
+
+	categFreqMatrix  = {resp,1};
+	categRateMatrix	 = {resp,1};
+
+	for (h=0; h<resp; h=h+1)
+	{
+		categFreqMatrix[h][0] := GammaQuadWeight(h__,alpha,1);
+		categRateMatrix[h][0] := GammaQuadWeight(h__,alpha,0);
+	}
+	
+	category c = (resp, categFreqMatrix , MEAN, ,categRateMatrix, 0, 1e25);	
+	
+}
+if (distribution==6)
+{
+	global P;
+	P :< 1-(1e-10);
+	P = 1/(resp+1);
+	
+	
+	catFreqMatrix = {2,1};
+	catFreqMatrix [0] := P;
+	catFreqMatrix [1] := (1-P);
+	
+	catRateMatrix = {{0,1}};
+	
+	category c = (2, catFreqMatrix, MEAN, , catRateMatrix, 0,  1e25);			  	 
+}
+
+if (distribution==7)
+{
+	gdDefString = "";
+	gdDefString * 1024;
+	for (mi=1; mi<resp; mi=mi+1)
+	{
+		gdDefString*("global PS_"+mi+" = 1/"+((resp+1)-mi)+";\nPS_"+mi+":<1;\n");
+	}
+	
+	gdDefString*("\n\nglobal RS_1 = .3;\nRS_1:<1;RS_1:>0.000000001;\n");
+
+	for (mi=3; mi<=resp; mi=mi+1)
+	{
+		gdDefString*("global RS_"+mi+" = 1.5;"+"\nRS_"+mi+":>1;RS_"+mi+":<100000;\n");
+	} 
+
+	rateStrMx    = {resp,1};
+	rateStrMx[0] = "RS_1";
+	rateStrMx[1] = "1";
+
+	for (mi=3; mi<=resp; mi=mi+1)
+	{
+		rateStrMx[mi-1] = rateStrMx[mi-2]+"*RS_"+mi;
+	} 	
+
+	freqStrMx    = {resp,1};
+	freqStrMx[0] = "PS_1";
+
+	for (mi=1; mi<resp-1; mi=mi+1)
+	{
+		freqStrMx[mi] = "";
+		for (mi2=1;mi2<=mi;mi2=mi2+1)
+		{
+			freqStrMx[mi] = freqStrMx[mi]+"(1-PS_"+mi2+")";		
+		}
+		freqStrMx[mi] = freqStrMx[mi]+"PS_"+(mi+1);	
+	}	
+
+	freqStrMx[mi] = "";
+	for (mi2=1;mi2<mi;mi2=mi2+1)
+	{
+		freqStrMx[mi] = freqStrMx[mi]+"(1-PS_"+mi2+")";		
+	}
+	freqStrMx[mi] = freqStrMx[mi]+"(1-PS_"+mi+")";	
+
+
+	gdDefString*("\n\nglobal c_scale:="+rateStrMx[0]+"*"+freqStrMx[0]);
+
+	for (mi=1; mi<resp; mi=mi+1)
+	{
+		gdDefString*("+"+rateStrMx[mi]+"*"+freqStrMx[mi]);
+	}
+
+	gdDefString*(";\ncategFreqMatrix={{"+freqStrMx[0]);
+
+	for (mi=1; mi<resp; mi=mi+1)
+	{
+		gdDefString*(","+freqStrMx[mi]);
+	}
+
+	gdDefString*("}};\ncategRateMatrix={{"+rateStrMx[0]+"/c_scale");
+
+	for (mi=1; mi<resp; mi=mi+1)
+	{
+		gdDefString*(","+rateStrMx[mi]+"/c_scale");
+	}
+
+	gdDefString*("}};\n\ncategory c  = ("+resp+", categFreqMatrix , MEAN, ,categRateMatrix, 0, 1e25);\n\n");
+	gdDefString*0;
+	ExecuteCommands (gdDefString);
+}
+
+if (distribution>7)
+{
+	global betaP = 1;
+	global betaQ = 1;
+	betaP:>0.05;betaP:<85;
+	betaQ:>0.05;betaQ:<85;
+	if (distribution<13)
+	{
+	category pc = (resp-1, EQUAL, MEAN, 
+					_x_^(betaP-1)*(1-_x_)^(betaQ-1)/Beta(betaP,betaQ), /* density */
+					IBeta(_x_,betaP,betaQ), /*CDF*/
+					0, 				   /*left bound*/
+					1, 			   /*right bound*/
+					IBeta(_x_,betaP+1,betaQ)*betaP/(betaP+betaQ)
+				   );
+	
+	
+	}
+	else
+	{
+	category pc = (resp, EQUAL, MEAN, 
+					_x_^(betaP-1)*(1-_x_)^(betaQ-1)/Beta(betaP,betaQ), /* density */
+					IBeta(_x_,betaP,betaQ), /*CDF*/
+					0, 				   /*left bound*/
+					1, 			   /*right bound*/
+					IBeta(_x_,betaP+1,betaQ)*betaP/(betaP+betaQ)
+				  );
+	
+	
+	}
+
+}
+
+if (distribution==8)
+{
+
+	global alpha = .5;
+	alpha:>0.01;alpha:<100;
+	category c = (resp, pc, MEAN, 
+					GammaDist(_x_,alpha,alpha), 
+					CGammaDist(_x_,alpha,alpha), 
+					0 , 
+			  	    1e25,
+			  	    CGammaDist(_x_,alpha+1,alpha)
+			  	 );
+}
+
+if (distribution==9)
+{
+	global sigma = .1;
+	sigma:>0.0001;sigma:<10;
+	sqrt2pi = Sqrt(8*Arctan(1));
+	category c = (resp, pc, MEAN, 
+					Exp(-0.5*(Log(_x_)+sigma^2/2)^2/sigma^2)/ (_x_*sigma*sqrt2pi__), /*density*/
+					ZCDF (Log(_x_)/sigma+0.5*sigma), /*CDF*/
+					1e-200, 			   /*left bound*/
+					1e200, 			       /*right bound*/
+					ZCDF (Log(_x_)/sigma-0.5*sigma)
+			  	 );
+}
+
+
+if (distribution==10)
+{
+	global mu = 1;
+	global sigma  = .5;
+	sigma:>0.0001;
+
+	sqrt2pi = Sqrt(8*Arctan(1));
+	category c = (resp, pc, MEAN, 
+					Exp((_x_-mu)^2/(2*sigma*sigma))/(sqrt2pi__*sigma)/ZCDF(mu/sigma), /* density */
+					(1-ZCDF((mu-_x_)/sigma))/ZCDF(mu/sigma), /*CDF*/
+					0, 				   /*left bound*/
+					1e25, 			   /*right bound*/
+					(mu*(1-ZCDF(-mu/sigma)-ZCDF((mu-_x_)/sigma))+
+				    sigma*(Exp(-mu*mu/(2*sigma*sigma))-
+				    Exp((_x_-mu)(mu-_x_)/(2*sigma*sigma)))/sqrt2pi__)/ZCDF(mu/sigma)
+			  	 );
+}
+
+
+
+if (distribution==11)
+{	
+	global	 RB = 5;
+	RB :> 1;
+	RB :< 1e25;
+	
+	category c = (resp, pc, MEAN, 
+					(_x_ <= 1)*(1-1/RB)+(_x_>1)*(_x_<=RB)/(RB^2-RB),
+					(_x_ <= 1)*(1-1/RB)*_x_+(_x_>1)*(_x_<=RB)*(1-1/RB+(_x_-1)/(RB^2-RB))+(_x_>RB), 
+					0, 			 
+					1e25, 	     
+					(_x_ <= 1)*(1-1/RB)*_x_^2/2+(_x_>1)*(_x_<=RB)*(1-1/RB+(_x_^2-1)/(RB^2-RB))/2+(_x_>RB)
+			  	 );
+}
+
+if (distribution==12)
+{	
+	global	 RB = 5;
+	RB :> 1;
+	RB :< 1e25;
+	
+	category c = (resp, EQUAL, MEAN, 
+					(_x_ <= 1)*(1-1/RB)+(_x_>1)*(_x_<=RB)/(RB^2-RB),
+					(_x_ <= 1)*(1-1/RB)*_x_+(_x_>1)*(_x_<=RB)*(1-1/RB+(_x_-1)/(RB^2-RB))+(_x_>RB), 
+					0, 			 
+					1e25, 	     
+					(_x_ <= 1)*(1-1/RB)*_x_^2/2+(_x_>1)*(_x_<=RB)*(1-1/RB+(_x_^2-1)/(RB^2-RB))/2+(_x_>RB)
+			  	 );
+	
+}
+
+if (distribution==13)
+{
+	/*global alpha = .5;
+	alpha:>0.01;alpha:<100;
+	global alpha_2 = 2.5;
+	alpha_2:>0.01;alpha_2:<100;
+	global P := 1/3;
+	P:<1;
+	category c = (resp, EQUAL, MEAN, 
+					P*GammaDist(_x_,alpha,alpha)+(1-P)*GammaDist(_x_,alpha_2,alpha_2), 
+					P*CGammaDist(_x_,alpha,alpha)+(1-P)*CGammaDist(_x_,alpha_2,alpha_2), 
+					0 , 
+			  	    1e25,
+			  	    P*CGammaDist(_x_,alpha+1,alpha)+(1-P)*CGammaDist(_x_,alpha_2+1,alpha_2)
+			  	 );*/
+			  	 
+	global alpha   = .5;
+	alpha:>0.01;alpha:<100;
+
+	global P;
+	P :< 1-(1e-10);
+	P = 1/(resp+1);
+	
+	
+	catFreqMatrix = {resp+1,1};
+	catFreqMatrix [0] := P;
+	
+	for (h=1; h<=resp;h=h+1)
+	{
+		catFreqMatrix [h] := (1-P)/resp__;
+	}
+	
+	category c = (resp+1, pc, MEAN, 
+					(1-P)*GammaDist(_x_,alpha,alpha)*(_x_>0), 
+					(1-P)*CGammaDist(_x_,alpha,alpha)*(_x_>0)+P, 
+					0, 
+			  	    1e25,
+			  	    (1-P)*CGammaDist(_x_,alpha+1,alpha)*(_x_>0)
+			  	 );
+
+}
+
+
+
+categoriesUsed = 1;
diff --git a/res/TemplateBatchFiles/TemplateModels/defineHM.mdl b/res/TemplateBatchFiles/TemplateModels/defineHM.mdl
new file mode 100644
index 0000000..e97fd92
--- /dev/null
+++ b/res/TemplateBatchFiles/TemplateModels/defineHM.mdl
@@ -0,0 +1,421 @@
+function GaussLaguerreQuardature (n,alf)
+{
+	GLMatrix = {n,2};
+	
+	mf = 1/(Gamma (n)*Gamma (alf+1));
+	
+	for (i=1; i<=n; i=i+1)
+	{
+		if (i==1)
+		{
+			z = (1+alf)*(3+0.92*alf)/(1+2.4*n+1.8*alf);
+		}
+		else
+		{
+			if (i==2)
+			{
+				z = z+(15+6.25*alf)/(1+.9*alf+2.5*n);
+			}
+			else
+			{
+				ai = i-2;
+				z = z+((1+2.55*ai)/(1.9*ai)+1.26*ai*alf/(1+3.5*ai))*(z-GLMatrix[i-3][0])/(1+0.3*alf);
+			}
+		}
+		for (its=1;its<=10;its=its+1)
+		{
+			p1 = 1;
+			p2 = 0;
+			for (j=1; j<=n; j=j+1)
+			{
+				p3 = p2;
+				p2 = p1;
+				p1 = ((2*j-1+alf-z)*p2-(j-1+alf)*p3)/j;
+			}
+			pp = (n*p1-(n+alf)*p2)/z;
+			z1 = z;
+			z  = z1-p1/pp;
+			if (Abs (z-z1)<1e-14)
+			{
+				break;
+			}
+		}
+		GLMatrix[i-1][0] = z;
+		GLMatrix[i-1][1] = -Gamma(alf+n)*mf/(pp*n*p2);
+	}
+	
+	for (i=0; i<n; i=i+1)
+	{
+		GLMatrix[i][0] = GLMatrix[i][0]/(alf+1);
+	}
+	
+	return GLMatrix;
+}
+
+ffunction		GammaQuadWeight (ind, alph, type)
+{
+	if (alph == cachedAlpha)
+	{
+		return cachedValues[ind][type];
+	}
+	cachedAlpha = alph;
+	if (ind == 0)
+	{
+		cachedValues = GaussLaguerreQuardature (resp, alph-1);
+	}
+	return cachedValues[ind][type];
+}
+
+/*_________________________________________________________________________________________________________________*/
+
+ChoiceList (distribution,"Choose Distribution",1,SKIP_NONE,
+			/*0*/"Gamma","Gamma distribution with shape parameter alpha. Mean: alpha, variance: 1/alpha.",
+			/*1*/"Beta","Two-parameter beta distrubution. Mean: betaP/(betaQ+betaP), variance: betaP*betaQ/((betaP+betaQ)^2 (betaP+betaQ+1)).",
+			/*2*/"Normal(x>0)","Two-parameter normal distrubution restriced to x>0. Mean parameter: mu, variance parameter: sigma^2.",
+			/*3*/"Log normal","Unit mean log normal distribution with parameter sigma. Variance: 1/[exp(sigma^2)-1].",
+			/*4*/"Gamma+Inv","Gamma distribution with shape parameter alpha and a zero rate class for invariable sites with weight P. Mean: (1-P), variance: (1-P)(1+alpha P)/alpha.",
+			/*5*/"Gamma Quadratures","Gamma distribution with shape parameter alpha. Mean: alpha, variance: 1/alpha. Discretized using Gauss-Laguerre quadratures, matching 2N-1 moments, with N = the number of rate classes.",
+			/*6*/"General Discrete","Unit mean general discrete.",
+			/*7*/"Gamma mod Beta","Gamma distribution with shape parameter alpha partitioned by a beta distribution.",
+			/*8*/"Lognormal mod Beta","Mean one log normal distribution with parameter sigma, partitioned by the beta. Variance: 1/[exp(sigma^2)-1].",
+			/*9*/"Normal(x>0) mod Beta","Normal (x>0) distribution with parameter sigma, partitioned by the beta. Mean parameter: mu, variance parameter: sigma^2.",
+			/*10*/"Uniform mod Beta","Mean 1 piecewise uniform on [0,1] and [1,R] partitioned by the beta.",
+			/*11*/"Uniform","Mean 1 piecewise uniform on [0,1] and [1,R].",
+			/*12*/"2 Gamma","Mixture of two mean 1 gammas.",
+			);
+
+if (distribution<0)
+{
+	return;
+}
+
+fprintf (stdout,"\nHow many rate classes should we have?");
+fscanf  (stdin,"Number", resp);
+
+eFreq = 1/resp;
+
+global lambda=.5;
+lambda:<1;
+
+hiddenMarkovM = {resp,resp};
+hiddenMarkovF = {resp,1};
+
+for (k=0; k<resp; k=k+1)
+{
+	hiddenMarkovM [k][k] := lambda+(1-lambda)/resp__;
+	hiddenMarkovF [k][1] := eFreq__;
+	
+	for (l=k+1;l<resp;l=l+1)
+	{
+		hiddenMarkovM [k][l] := (1-lambda)/resp__;
+		hiddenMarkovM [l][k] := (1-lambda)/resp__;
+	}
+}
+
+Model HMM = (hiddenMarkovM,hiddenMarkovF);
+
+
+if (distribution==0)
+{
+	global alpha = .5;
+	alpha:>0.01;alpha:<100;
+	category c = (resp, EQUAL, MEAN, 
+					GammaDist(_x_,alpha,alpha), 
+					CGammaDist(_x_,alpha,alpha), 
+					0 , 
+			  	    1e25,
+			  	    CGammaDist(_x_,alpha+1,alpha),
+			  	    HMM
+			  	 );
+}
+if (distribution==1)
+{
+	global betaP = 1;
+	global betaQ = 1;
+	betaP:>0.05;betaP:<85;
+	betaQ:>0.05;betaQ:<85;
+	category c = (resp, EQUAL, MEAN, 
+					_x_^(betaP-1)*(1-_x_)^(betaQ-1)/Beta(betaP,betaQ), /* density */
+					IBeta(_x_,betaP,betaQ), /*CDF*/
+					0, 				   /*left bound*/
+					1, 			   /*right bound*/
+					IBeta(_x_,betaP+1,betaQ)*betaP/(betaP+betaQ),
+					HMM
+			  	 );
+}
+if (distribution==2)
+{
+	global mu = 1;
+	global sigma  = .5;
+	sigma:>0.0001;
+
+	sqrt2pi = Sqrt(8*Arctan(1));
+	category c = (resp, EQUAL, MEAN, 
+					Exp((_x_-mu)^2/(2*sigma*sigma))/(sqrt2pi__*sigma)/ZCDF(mu/sigma), /* density */
+					(1-ZCDF((mu-_x_)/sigma))/ZCDF(mu/sigma), /*CDF*/
+					0, 				   /*left bound*/
+					1e25, 			   /*right bound*/
+					(mu*(1-ZCDF(-mu/sigma)-ZCDF((mu-_x_)/sigma))+
+				    sigma*(Exp(-mu*mu/(2*sigma*sigma))-
+				    Exp((_x_-mu)(mu-_x_)/(2*sigma*sigma)))/sqrt2pi__)/ZCDF(mu/sigma),
+				    HMM
+			  	 );
+}
+if (distribution==3)
+{
+	global sigma = .1;
+	sigma:>0.0001;sigma:<10;
+	sqrt2pi = Sqrt(8*Arctan(1));
+	category c = (resp, EQUAL, MEAN, 
+					Exp(-0.5*(Log(_x_)+sigma^2/2)^2/sigma^2)/ (_x_*sigma*sqrt2pi__), /*density*/
+					ZCDF (Log(_x_)/sigma+0.5*sigma), /*CDF*/
+					1e-200, 			   /*left bound*/
+					1e200, 			       /*right bound*/
+					ZCDF (Log(_x_)/sigma-0.5*sigma),
+					HMM
+			  	 );
+}
+if (distribution==4)
+{
+	global alpha   = .5;
+	alpha:>0.01;alpha:<100;
+
+	global P;
+	P :< 1-(1e-10);
+	P = 1/(resp+1);
+	
+	
+	catFreqMatrix = {resp+1,1};
+	catFreqMatrix [0] := P;
+	
+	for (h=1; h<=resp;h=h+1)
+	{
+		catFreqMatrix [h] := (1-P)/resp__;
+	}
+	
+	category c = (resp+1, catFreqMatrix, MEAN, 
+					(1-P)*GammaDist(_x_,alpha,alpha)*(_x_>0), 
+					(1-P)*CGammaDist(_x_,alpha,alpha)*(_x_>0)+P, 
+					0, 
+			  	    1e25,
+			  	    (1-P)*CGammaDist(_x_,alpha+1,alpha)*(_x_>0),
+			  	    HMM
+			  	 );
+			  	 
+}
+if (distribution==5)
+{
+	cachedAlpha = -1;
+	
+	global alpha = .5;
+	alpha:>0.01;alpha:<100;
+	alpha 		= 1;
+
+	categFreqMatrix  = {resp,1};
+	categRateMatrix	 = {resp,1};
+
+	for (h=0; h<resp; h=h+1)
+	{
+		categFreqMatrix[h][0] := GammaQuadWeight(h__,alpha,1);
+		categRateMatrix[h][0] := GammaQuadWeight(h__,alpha,0);
+	}
+	
+	category c = (resp, categFreqMatrix , MEAN, ,categRateMatrix, 0, 1e25, , HMM);	
+	
+}
+
+
+if (distribution==6)
+{
+	gdDefString = "";
+	gdDefString * 1024;
+	for (mi=1; mi<resp; mi=mi+1)
+	{
+		gdDefString*("global PS_"+mi+" = 1/"+((resp+1)-mi)+";\nPS_"+mi+":<1;\n");
+	}
+	
+	gdDefString*("\n\nglobal RS_1 = .3;\nRS_1:<1;RS_1:>0.000000001;\n");
+
+	for (mi=3; mi<=resp; mi=mi+1)
+	{
+		gdDefString*("global RS_"+mi+" = 1.5;"+"\nRS_"+mi+":>1;RS_"+mi+":<100000;\n");
+	} 
+
+	rateStrMx    = {resp,1};
+	rateStrMx[0] = "RS_1";
+	rateStrMx[1] = "1";
+
+	for (mi=3; mi<=resp; mi=mi+1)
+	{
+		rateStrMx[mi-1] = rateStrMx[mi-2]+"*RS_"+mi;
+	} 	
+
+	freqStrMx    = {resp,1};
+	freqStrMx[0] = "PS_1";
+
+	for (mi=1; mi<resp-1; mi=mi+1)
+	{
+		freqStrMx[mi] = "";
+		for (mi2=1;mi2<=mi;mi2=mi2+1)
+		{
+			freqStrMx[mi] = freqStrMx[mi]+"(1-PS_"+mi2+")";		
+		}
+		freqStrMx[mi] = freqStrMx[mi]+"PS_"+(mi+1);	
+	}	
+
+	freqStrMx[mi] = "";
+	for (mi2=1;mi2<mi;mi2=mi2+1)
+	{
+		freqStrMx[mi] = freqStrMx[mi]+"(1-PS_"+mi2+")";		
+	}
+	freqStrMx[mi] = freqStrMx[mi]+"(1-PS_"+mi+")";	
+
+
+	gdDefString*("\n\nglobal c_scale:="+rateStrMx[0]+"*"+freqStrMx[0]);
+
+	for (mi=1; mi<resp; mi=mi+1)
+	{
+		gdDefString*("+"+rateStrMx[mi]+"*"+freqStrMx[mi]);
+	}
+
+	gdDefString*(";\ncategFreqMatrix={{"+freqStrMx[0]);
+
+	for (mi=1; mi<resp; mi=mi+1)
+	{
+		gdDefString*(","+freqStrMx[mi]);
+	}
+
+	gdDefString*("}};\ncategRateMatrix={{"+rateStrMx[0]+"/c_scale");
+
+	for (mi=1; mi<resp; mi=mi+1)
+	{
+		gdDefString*(","+rateStrMx[mi]+"/c_scale");
+	}
+
+	gdDefString*("}};\n\ncategory c  = ("+resp+", categFreqMatrix , MEAN, ,categRateMatrix, 0, 1e25, , HMM);\n\n");
+	gdDefString*0;
+	ExecuteCommands (gdDefString);
+}
+
+if (distribution>6 && distribution<11)
+{
+	global betaP = 1;
+	global betaQ = 1;
+	betaP:>0.05;betaP:<85;
+	betaQ:>0.05;betaQ:<85;
+	category pc = (resp-1, EQUAL, MEAN, 
+					_x_^(betaP-1)*(1-_x_)^(betaQ-1)/Beta(betaP,betaQ), /* density */
+					IBeta(_x_,betaP,betaQ), /*CDF*/
+					0, 				   /*left bound*/
+					1, 			   /*right bound*/
+					IBeta(_x_,betaP+1,betaQ)*betaP/(betaP+betaQ)
+	);
+
+}
+
+if (distribution==7)
+{
+
+	global alpha = .5;
+	alpha:>0.01;alpha:<100;
+	category c = (resp, pc, MEAN, 
+					GammaDist(_x_,alpha,alpha), 
+					CGammaDist(_x_,alpha,alpha), 
+					0 , 
+			  	    1e25,
+			  	    CGammaDist(_x_,alpha+1,alpha),
+			  	    HMM
+			  	 );
+}
+
+if (distribution==8)
+{
+	global sigma = .1;
+	sigma:>0.0001;sigma:<10;
+	sqrt2pi = Sqrt(8*Arctan(1));
+	category c = (resp, pc, MEAN, 
+					Exp(-0.5*(Log(_x_)+sigma^2/2)^2/sigma^2)/ (_x_*sigma*sqrt2pi__), /*density*/
+					ZCDF (Log(_x_)/sigma+0.5*sigma), /*CDF*/
+					1e-200, 			   /*left bound*/
+					1e200, 			       /*right bound*/
+					ZCDF (Log(_x_)/sigma-0.5*sigma),
+					HMM
+			  	 );
+}
+
+
+if (distribution==9)
+{
+	global mu = 1;
+	global sigma  = .5;
+	sigma:>0.0001;
+
+	sqrt2pi = Sqrt(8*Arctan(1));
+	category c = (resp, pc, MEAN, 
+					Exp((_x_-mu)^2/(2*sigma*sigma))/(sqrt2pi__*sigma)/ZCDF(mu/sigma), /* density */
+					(1-ZCDF((mu-_x_)/sigma))/ZCDF(mu/sigma), /*CDF*/
+					0, 				   /*left bound*/
+					1e25, 			   /*right bound*/
+					(mu*(1-ZCDF(-mu/sigma)-ZCDF((mu-_x_)/sigma))+
+				    sigma*(Exp(-mu*mu/(2*sigma*sigma))-
+				    Exp((_x_-mu)(mu-_x_)/(2*sigma*sigma)))/sqrt2pi__)/ZCDF(mu/sigma),
+				    HMM
+			  	 );
+}
+
+
+
+if (distribution==10)
+{	
+	global	 RB = 5;
+	RB :> 1;
+	RB :< 1e25;
+	
+	category c = (resp, pc, MEAN, 
+					(_x_ <= 1)*(1-1/RB)+(_x_>1)*(_x_<=RB)/(RB^2-RB),
+					(_x_ <= 1)*(1-1/RB)*_x_+(_x_>1)*(_x_<=RB)*(1-1/RB+(_x_-1)/(RB^2-RB))+(_x_>RB), 
+					0, 			 
+					1e25, 	     
+					(_x_ <= 1)*(1-1/RB)*_x_^2/2+(_x_>1)*(_x_<=RB)*(1-1/RB+(_x_^2-1)/(RB^2-RB))/2+(_x_>RB),
+					HMM
+			  	 );
+}
+
+if (distribution==11)
+{	
+	global	 RB = 5;
+	RB :> 1;
+	RB :< 1e25;
+	
+	category c = (resp, EQUAL, MEAN, 
+					(_x_ <= 1)*(1-1/RB)+(_x_>1)*(_x_<=RB)/(RB^2-RB),
+					(_x_ <= 1)*(1-1/RB)*_x_+(_x_>1)*(_x_<=RB)*(1-1/RB+(_x_-1)/(RB^2-RB))+(_x_>RB), 
+					0, 			 
+					1e25, 	     
+					(_x_ <= 1)*(1-1/RB)*_x_^2/2+(_x_>1)*(_x_<=RB)*(1-1/RB+(_x_^2-1)/(RB^2-RB))/2+(_x_>RB),
+					HMM
+			  	 );
+	
+}
+
+if (distribution==12)
+{
+	global alpha = .5;
+	alpha:>0.01;alpha:<100;
+	global alpha_2 = 2.5;
+	alpha_2:>0.01;alpha_2:<100;
+	global P := 1/3;
+	P:<1;
+	category c = (resp, EQUAL, MEAN, 
+					P*GammaDist(_x_,alpha,alpha)+(1-P)*GammaDist(_x_,alpha_2,alpha_2), 
+					P*CGammaDist(_x_,alpha,alpha)+(1-P)*CGammaDist(_x_,alpha_2,alpha_2), 
+					0 , 
+			  	    1e25,
+			  	    P*CGammaDist(_x_,alpha+1,alpha)+(1-P)*CGammaDist(_x_,alpha_2+1,alpha_2),
+			  	    HMM
+			  	 );
+}
+
+
+
+categoriesUsed = 1;
diff --git a/res/TemplateBatchFiles/TemplateModels/fitness.mdl b/res/TemplateBatchFiles/TemplateModels/fitness.mdl
new file mode 100644
index 0000000..acedc2e
--- /dev/null
+++ b/res/TemplateBatchFiles/TemplateModels/fitness.mdl
@@ -0,0 +1,90 @@
+NICETY_LEVEL = 2;
+
+aaCodes = {{"A",
+"C",
+"D",
+"E",
+"F",
+"G",
+"H",
+"I",
+"K",
+"L",
+"M",
+"N",
+"P",
+"Q",
+"R",
+"S",
+"T",
+"V",
+"W",
+"Y"}};
+
+function PopulateModelMatrix (ModelMatrixName&, EFV)
+{
+	ModelMatrixName = {20,20};
+		
+	for (cI = 1; cI < 20; cI = cI+1)
+	{
+		commandString = "ModelMatrixName[0]["+cI+"]:=t*(1+(F_" + 
+						 aaCodes[cI] +  "<0)*(Exp(F_"+
+						 aaCodes[cI] + ")-1));\n" + 
+						 "ModelMatrixName["+cI+"][0]:=t*(1+(0>" + "F_" + 
+						 aaCodes[cI] + ")*(Exp(-F_"+
+						 aaCodes[cI] + ")-1));\n"; 
+		ExecuteCommands	 (commandString);
+	}
+
+	for (rI = 1; rI < 19; rI = rI+1)
+	{
+		for (cI = rI+1; cI < 20; cI = cI+1)
+		{
+			commandString = "ModelMatrixName["+rI+"]["+cI+"]:=t*(1+(F_" + 
+							 aaCodes[cI] + "<" + "F_" + 
+							 aaCodes[rI] + ")*(Exp(F_"+
+							 aaCodes[cI] + "-F_"+
+							 aaCodes[rI] + ")-1));\n" + 
+							 "ModelMatrixName["+cI+"]["+rI+"]:=t*(1+(F_" + 
+							 aaCodes[rI] + "<" + "F_" + 
+							 aaCodes[cI] + ")*(Exp(F_"+
+							 aaCodes[rI] + "-F_"+
+							 aaCodes[cI] + ")-1));\n"; 
+			ExecuteCommands	 (commandString);
+		}
+	}
+	
+	return 0;
+}
+
+commandString = "";
+
+for (rI = 1; rI < 20; rI = rI+1)
+{
+	commandString = commandString + "global F_" + aaCodes[rI] + 
+					"=0; F_" + aaCodes[rI] + ":>-1e10;\n";
+}
+
+ExecuteCommands (commandString);
+
+vectorOfFrequencies = {20,1};
+
+commandString = "global EFV_Norm:=1";
+for (rI = 1; rI < 20; rI = rI+1)
+{
+	commandString = commandString+"+Exp(F_"+aaCodes[rI]+")";
+}
+
+ExecuteCommands (commandString+";");
+vectorOfFrequencies[0]:=1/EFV_Norm;
+
+for (rI = 1; rI < 20; rI = rI+1)
+{
+	commandString = "vectorOfFrequencies["+rI+"]:=Exp(F_"+aaCodes[rI]+")/EFV_Norm;";
+	ExecuteCommands (commandString);
+}
+
+FitnessMatrix = 0;
+MULTIPLY_BY_FREQS = PopulateModelMatrix ("FitnessMatrix",vectorOfFrequencies);
+Model FitnessModel = (FitnessMatrix, vectorOfFrequencies, MULTIPLY_BY_FREQS);
+FREQUENCY_SENSITIVE = 0;
diff --git a/res/TemplateBatchFiles/TemplateModels/modelParameters.mdl b/res/TemplateBatchFiles/TemplateModels/modelParameters.mdl
new file mode 100644
index 0000000..9bbc3af
--- /dev/null
+++ b/res/TemplateBatchFiles/TemplateModels/modelParameters.mdl
@@ -0,0 +1,18 @@
+/* 
+	A utility file for multi-parameter models.
+*/
+
+if (!SKIP_MODEL_PARAMETER_LIST)
+{
+	ChoiceList (modelType,"Model Options",1,SKIP_NONE,
+				"Local","All model parameters are estimated independently for each branch.",
+				"Global","Model parameters are shared by all branches, branch lengths are estimated independently.",
+				"Global w/variation","Model parameters are shared by all branches, branch lengths come from a user-chosen distribution, whose parameters are estimated.",
+				"Global w/variation+HM","Model parameters are shared by all branches, branch lengths come from a user-chosen distribution, whose parameters is estimated; rates at adjacent sites are correlated via a simple Hidden Markov model with an autocorrelation parameter lambda."
+		       );
+}
+
+if (modelType<0)
+{
+	return;
+}
diff --git a/res/TemplateBatchFiles/TemplateModels/modelParameters2.mdl b/res/TemplateBatchFiles/TemplateModels/modelParameters2.mdl
new file mode 100644
index 0000000..2d10b25
--- /dev/null
+++ b/res/TemplateBatchFiles/TemplateModels/modelParameters2.mdl
@@ -0,0 +1,17 @@
+/* 
+	A utility file for multi-parameter models.
+*/
+
+if (!SKIP_MODEL_PARAMETER_LIST)
+{
+	ChoiceList (modelType,"Model Options",1,SKIP_NONE,
+				"Fixed Rates","Rates are fixed.",
+				"Rate variation","Branch lengths come from a user-chosen distribution, whose parameters are estimated.",
+				"Rate variation+HM","Branch lengths come from a user-chosen distribution, whose parameters is estimated; rates at adjacent sites are correlated via a simple Hidden Markov model with an autocorrelation parameter lambda."
+	);
+}
+
+if (modelType<0)
+{
+	return;
+}
diff --git a/res/TemplateBatchFiles/TemplateModels/modelParameters3.mdl b/res/TemplateBatchFiles/TemplateModels/modelParameters3.mdl
new file mode 100644
index 0000000..9e7562b
--- /dev/null
+++ b/res/TemplateBatchFiles/TemplateModels/modelParameters3.mdl
@@ -0,0 +1,18 @@
+/* 
+	A utility file for multi-parameter models.
+*/
+
+if (!SKIP_MODEL_PARAMETER_LIST)
+{
+	ChoiceList (modelType,"Model Options",1,SKIP_NONE,
+				"Local","All model parameters are estimated independently for each branch.",
+				"Global","Model parameters are shared by all branches, branch lengths are estimated independently.",
+				"Global w/gamma","Model parameters are shared by all branches, branch lengths come from a unit mean gamma distribution, whose shape is estimated.",
+				"Global w/options","Model parameters are shared by all branches, branch lengths come from one of the collection of predefined distributions."
+	);
+}
+
+if (modelType<0)
+{
+	return;
+}
diff --git a/res/TemplateBatchFiles/TemplateModels/modelParameters4.mdl b/res/TemplateBatchFiles/TemplateModels/modelParameters4.mdl
new file mode 100644
index 0000000..f8c6058
--- /dev/null
+++ b/res/TemplateBatchFiles/TemplateModels/modelParameters4.mdl
@@ -0,0 +1,28 @@
+/* 
+	A utility file for multi-parameter models.
+*/
+
+if (!SKIP_MODEL_PARAMETER_LIST)
+{
+	ChoiceList (rateType,"Rate Variation Options",1,SKIP_NONE,
+				"None","Single dN/dS",
+				"Neutral Model",   "dN/dS is either 0 (with probability p), or 1 (with probability 1-p).",
+				"Selection Model", "dN/dS is either 0 (with probability p1), 1 (with probability p2) or W (1-p1-p2).",
+				"Discrete Model",  "dN/dS comes from an uncontrained discrete distribution with 3 bins.",
+				"Frequencies",  "dN/dS comes from 5 bins (0,1/3,2/3,1,3) whose proportions are estimated.",
+				"Single Gamma", "dN/dS is drawn from a distretized two parameter (a,b) gamma.",
+				"Mixed Gamma", "dN/dS is drawn from a mixture of a distretized two parameter (a,b) gamma and a single parameter (a2,a2) gamma. ",
+				"Beta", "dN/dS is drawn from a two-parameter beta distribution.",
+				"Beta & w", "dN/dS is drawn from a mixture of a two-parameter beta distribution and a fixed rate class.",
+				"Beta & Gamma", "dN/dS is drawn from a mixture of a two-parameter beta distribution and a two-parameter gamma.",
+				"Beta & +1 Gamma", "dN/dS is drawn from a mixture of a two-parameter beta distribution and a two-parameter gamma shifted one to the right (x>=1).",
+				"Beta & Normal >1", "dN/dS is drawn from a mixture of a two-parameter beta distribution and a two-parameter normal truncated to x>0.",
+				"0 & 2 Normals >0", "dN/dS is drawn from a mixture of a unit mean normal and a two-parameter normal truncated to x>0 and the zero rate category.",
+				"3 Normals >0", "dN/dS is drawn from a mixture of a zero mean normal, a unit mean normal and a two-parameter normal truncated to x>0."		
+	);
+}
+
+if (rateType<0)
+{
+	return;
+}
diff --git a/res/TemplateBatchFiles/TemplateModels/modelParameters5.mdl b/res/TemplateBatchFiles/TemplateModels/modelParameters5.mdl
new file mode 100644
index 0000000..3fbba83
--- /dev/null
+++ b/res/TemplateBatchFiles/TemplateModels/modelParameters5.mdl
@@ -0,0 +1,17 @@
+/* 
+	A utility file for multi-parameter models.
+*/
+
+if (!SKIP_MODEL_PARAMETER_LIST)
+{
+	ChoiceList (modelType,"Model Options",1,SKIP_NONE,
+				"Global","Model parameters are shared by all branches, branch lengths are estimated independently.",
+				"Global w/variation","Model parameters are shared by all branches, branch lengths come from a user-chosen distribution, whose parameters are estimated.",
+				"Non-syn variation only","Model parameters are shared by all branches, branch lengths come from a user-chosen distribution, whose parameters are estimated. Only the non-syn/syn ratios have rate heterogeneity."
+		       );
+}
+
+if (modelType<0)
+{
+	return;
+}
diff --git a/res/TemplateBatchFiles/TemplateModels/models.lst b/res/TemplateBatchFiles/TemplateModels/models.lst
new file mode 100644
index 0000000..cfbf44d
--- /dev/null
+++ b/res/TemplateBatchFiles/TemplateModels/models.lst
@@ -0,0 +1,65 @@
+"Custom","Custom 4x4 reversible model (defined as in 010023) with choice of several equilibrium frequencies options.","4","nucleotide","custm4x4.mdl";
+"Custom_AA","Custom 20x20 reversible model (read from a file).","20","aminoacid","Custom_AA.mdl";
+"Custom_Empirical","Custom 20x20 empirical reversible model (read from a file).","20","aminoacid","Custom_AA_empirical.mdl";
+"Dayhoff","Dayfoff model for amino-acids","20","aminoacid","Dayhoff.mdl";
+"Dayhoff+F","Dayfoff model for amino-acids with empirical character frequencies","20","aminoacid","Dayhoff_F.mdl";
+"EqualInput","Equal input model for amino-acids","20","aminoacid","EIAA.mdl";
+"Empirical Protein","Select from a collection of empricial protein models","20","aminoacid","Empirical.mdl";
+"WAG","Whelan-Goldman model for amino-acids","20","aminoacid","WAG.mdl";
+"WAG+F","Whelan-Goldman model for amino-acids  with empirical character frequencies","20","aminoacid","WAG_F.mdl";
+"Jones","Jones et al Model (based on SWISSPROT Version 22 data)","20","aminoacid","Jones.mdl";
+"Jones+F","Jones Model (based on SWISSPROT Version 22 data) with empirical character frequencies","20","aminoacid","Jones_F.mdl";
+"Fitness","Fitness based model (Goldstein et al)","20","aminoacid","fitness.mdl";
+"rtREV","Matrix optimized for viral pol genes (specifically, reverse transcriptase). Dimmic et al JME (2002)55:65-73,","20","aminoacid","rtREV.mdl";
+"rtREV+F","Matrix optimized for viral pol genes (specifically, reverse transcriptase) with empirical character frequencies. Dimmic et al JME (2002)55:65-73,","20","aminoacid","rtREV_F.mdl";
+"REV","General Reversible model (189+branch lengths parameters!)","20","aminoacid","mtREV.mdl";
+"RedREV","General Reversible model reduced to allow non-zero rates only between a.a. separataed by a single nucleotide substitution","20","aminoacid","reducedREV.mdl";
+"F81","Felsenstein 81 (F81).Rate heterogeneity (and HM spatial correlation) optional.","4","nucleotide","F81.mdl";
+"F81B","Felsenstein 81 (F81) for binary data. Rate heterogeneity (and HM spatial correlation) optional.","2","binary","F81_binary.mdl";
+"F84","Felsenstein 84. Rate heterogeneity (and HM spatial correlation) optional.","4","nucleotide","F84.mdl";
+"F84P","Felsenstein 84, compatible with PHYLIP's dnaml version. User chooses ts/tv ratio. Rate heterogeneity (and HM spatial correlation) optional.","4","nucleotide","F84P.mdl";
+"GRM","General Reversible Model.Local or global parameters. Possible Rate heterogeneity (and HM spatial correlation).","4","nucleotide","GRM.mdl";
+"GY94","Goldman-Yang 94 codon model. Shared or independent dS/dN Possible Rate heterogeneity (and HM spatial correlation).","*","codon","GY94.mdl";
+"GY94w9","Goldman-Yang 94 codon model with nucleotide equilibrium frequencies varying based on their position in the codon (6 extra parameters). Shared or independent dS/dN Possible Rate heterogeneity (and HM spatial correlation).","*","codon","GY94w9.mdl";
+"GY94customF3x4","Goldman-Yang 94 codon model crossed with an arbitrary nucleotide model and the F3x4 frequency estimator. Shared or independent dS/dN Possible Rate heterogeneity (and HM spatial correlation).","*","codon","GY94customF3x4.mdl";
+"HKY85","Hasegawa et al.,1985. Local or global parameters. Possible Rate heterogeneity (and HM spatial correlation).","4","nucleotide","HKY85.mdl";
+"JC69","Jukes-Cantor 1969. Rate heterogeneity (and HM spatial correlation) optional.","4","nucleotide","JC69.mdl";
+"JC69B","Jukes-Cantor 1969 for binary data. Rate heterogeneity (and HM spatial correlation) optional.","2","binary","JC69_binary.mdl";
+"K2P","Kimura 2 parameter (K2P).Local or global parameters. Possible Rate heterogeneity (and HM spatial correlation).","4","nucleotide","K2P.mdl";
+"K3ST","Kimura(1981) 3 substitution type model. Local or global parameters. Possible Rate heterogeneity (and HM spatial correlation).","4","nucleotide","K3ST.mdl";
+"MG94","Muse-Gaut 94 codon model. Local or global parameters. Possible Rate heterogeneity (and HM spatial correlation).","*","codon","MG94.mdl";
+"MG94x2","Muse-Gaut 94+custom nucleotide biases codon model. Separate rate heterogeneity distributions for synonymous and non-synonymous changes.","*","codon","MG94x2.mdl";
+"MG94w9","Muse-Gaut 94 codon model with nucleotide equilibrium frequencies varying based on their position in the codon (6 extra parameters). Local or global parameters. Possible Rate heterogeneity (and HM spatial correlation).","*","codon","MG94with9freqs.mdl";
+"MG94custom","Muse-Gaut 94 crossed with a nucleotide substituion model. Possible Rate heterogeneity (and HM spatial correlation).","*","codon","MG94custom.mdl";
+"MG94customFreqs","Muse-Gaut 94 crossed with a nucleotide substituion model; 9 frequency parameters(positional nucleotide frequencies) are estimated from the data. Possible Rate heterogeneity (and HM spatial correlation).","*","codon","MG94customFreqs.mdl";
+"MG94customF1x4","Muse-Gaut 94 crossed with a nucleotide substituion model, using a simpler F1x4 codon frequency estimator. Possible Rate heterogeneity (and HM spatial correlation).","*","codon","MG94customF1x4.mdl";
+"MG94customCF3x4","Muse-Gaut 94 crossed with a nucleotide substituion model, using a corrected CF3x4 codon frequency estimator. Possible Rate heterogeneity (and HM spatial correlation).","*","codon","MG94customCF3x4.mdl";
+"MG94wAA","Muse-Gaut 94 crossed with a nucleotide substituion model AND several predefined non-synonymous substitution classes. Possible Rate heterogeneity (and HM spatial correlation).","*","codon","MG94wAA.mdl";
+"MG94wAAUserFreqs","Muse-Gaut 94 crossed with a nucleotide substituion model AND several predefined non-synonymous substitution classes. 9 frequency parameters(positional nucleotide frequencies) are defined by user (i.e. you). Possible Rate heterogeneity (and HM spatial correlation).","*","codon","MG94wAAUserFreqs.mdl";
+"MG94wAAFreqs","Muse-Gaut 94 crossed with a nucleotide substituion model AND several predefined non-synonymous substitution classes. 9 frequency parameters(positional nucleotide frequencies) are estimated from the data. Possible Rate heterogeneity (and HM spatial correlation).","*","codon","MG94wAAFreqs.mdl";
+"MG94wAAF61","Muse-Gaut 94 crossed with a nucleotide substituion model AND several predefined non-synonymous substitution classes. 61 codon frequency parameters are estimated in the model. Possible Rate heterogeneity (and HM spatial correlation).","*","codon","MG94wAAF61.mdl";
+"MG94wAAF61Multiple","Muse-Gaut 94 crossed with a nucleotide substituion model, several predefined non-synonymous substitution classes AND 4 separate rates for 2 and 3 step synonynymous and non-synonymous substitutions. 61 codon frequency parameters are estimated in the model. Possible Rate heterogeneity (and HM spatial correlation).","*","codon","MG94wAAF61multiple.mdl";
+"MG94wEX","Muse-Gaut 94 crossed with a nucleotide substituion model AND an acceptance bias based on the exhangeability metric by Stolzfus and Yampolsky.","*","codon","MG94wEX.mdl";
+"ECM","Kosiol, Holmes and Goldman Empirical Codon model estimated from Pandit alignments (MBE 24:1464)","*","codon","ECM.mdl";
+"ECM+F","Kosiol, Holmes & Goldman Empirical Codon model estimated from Pandit alignments with alignment specific F61 frequency parameters (MBE 24:1464)","*","codon","ECM+F.mdl";
+"ECM+F+omega","Kosiol, Holmes & Goldman Empirical Codon model estimated from Pandit alignments with alignment specific F61 frequency parameters and dNdS parameter (MBE 24:1464)","*","codon","ECM+F+omega.mdl";
+"ECM+MLFREQS","Kosiol, Holmes & Goldman Empirical Codon model estimated from Pandit alignments with 9 frequency parameters(positional nucleotide frequencies) estimated from the data.","*","codon","ECM+MLFREQS.mdl";
+"ECM+F3x4","Kosiol, Holmes & Goldman Empirical Codon model estimated from Pandit alignments with F3x4 frequency estimator","*","codon","ECM+F3x4.mdl";
+"LCAP","Linear Combination of Amino Acid Properties from Conant, Wagner and Stadler (MPE 42:298)","*","codon","LCAP.mdl";
+"MEC","Mixed empirical and mechanistic codon model of Doron-Faigenboim and Pupko (MBE 24:388-397)","*","codon","MEC.mdl";
+"NRM","Non reversible model, constrained to have observed counts as its equilibrium frequencies. 11 parameters (8 rate parameteres + 3 frequency parameters).","4","nucleotide","NRM.mdl";
+"NRM+Freqs","Non reversible model, NOT constrained to have observed counts as its equilibrium frequencies. 11 parameters.","4","nucleotide","NRM+Freqs.mdl";
+"TrN","Tamura and Nei 1993. Local or global parameters. Local or global parameters. Possible Rate heterogeneity (and HM spatial correlation).","4","nucleotide","TrN.mdl";
+"HIVBetween","Between patient empricial model for HIV","20","aminoacid","HIVbetween.mdl";
+"HIVBetween+F","Between patient empricial model for HIV with frequencies ","20","aminoacid","HIVbetween+F.mdl";
+"HIVWithin","Within patient empricial model for HIV","20","aminoacid","HIVwithin.mdl";
+"HIVWithin+F","Within patient empricial model for HIV with frequencies ","20","aminoacid","HIVwithin+F.mdl";
+"mtMAM","Empirical model for mammalian mtDNA genes. Yang, Z., R. Nielsen, and M. Hasegawa.  1998.  Models of amino acid substitution and applications to Mitochondrial protein evolution, MBE 15:1600-1611.","20","aminoacid","mtMAM.mdl";
+"mtMAM+F","Empirical model for mammalian mtDNA genes with emprically estimated base frequencies. Yang, Z., R. Nielsen, and M. Hasegawa.  1998.  Models of amino acid substitution and applications to Mitochondrial protein evolution, MBE 15:1600-1611.","20","aminoacid","mtMAM_F.mdl";
+"mtREV 24","Empirical model for mtDNA genes. Yang, Z., R. Nielsen, and M. Hasegawa.  1998.  Models of amino acid substitution and applications to Mitochondrial protein evolution, MBE 15:1600-1611.","20","aminoacid","mtREV_24.mdl";
+"mtREV 24+F","Empirical model for mtDNA genes with emprically estimated base frequencies. Adachi, J. and Hasegawa, M. (1996) MOLPHY version 2.3: programs for molecular phylogenetics based on maximum likelihood.  Computer Science Monographs of Institute of Statistical Mathematics 28:1-150.","20","aminoacid","mtREV_24_F.mdl";
+"EX","Exchangeability metric by Stolzfus and Yampolsky.","20","aminoacid","EX.mdl";
+"Muse95","Dinucleotide extension of HKY85. Basic model described in 'Evolutionary  Analyses of DNA Sequences  Subject  to Constraints on  Secondary  Structure' by Spencer V. Muse in Genetics 139 1429-1439  (March, 1995), augmented by site-to-site rate variation (optional).","16","dinucleotide","RNAMuse95.mdl";
+"RNA16","Any particular class of the general reversible model, including some predefined models.","16","dinucleotide","RNA16.mdl";
+"RNA16SvH","Any particular type of the REV model for nucleotides scaled to a 16x16 state space as in 'Toward Assigning Helical Regions in Alignments of Ribosomal RNA and Testing the Appropriateness of Evolutionary Models' by Michael Schoniger and Arndt von Haeseler, J Mol Evol (1999) 49:691�698.","16","dinucleotide","RNA16SvH.mdl";
+
diff --git a/res/TemplateBatchFiles/TemplateModels/mtMAM.mdl b/res/TemplateBatchFiles/TemplateModels/mtMAM.mdl
new file mode 100644
index 0000000..415ae05
--- /dev/null
+++ b/res/TemplateBatchFiles/TemplateModels/mtMAM.mdl
@@ -0,0 +1,518 @@
+#include "modelParameters2.mdl";
+
+if (!SKIP_MODEL_PARAMETER_LIST)
+{
+	if (modelType == 1)
+	{
+		#include "defineGamma.mdl";
+	}	
+	if (modelType == 2)
+	{
+		#include "defineHM.mdl";
+	}
+}
+
+function PopulateModelMatrix (ModelMatrixName&, EFV)
+{
+	ModelMatrixName = {20,20};
+	if (categoriesUsed)
+	{
+        ModelMatrixName[14][0]:=c*t*32;
+		ModelMatrixName[0][14]:=c*t*32;
+		ModelMatrixName[11][0]:=c*t*2;
+		ModelMatrixName[0][11]:=c*t*2;
+		ModelMatrixName[11][14]:=c*t*4;
+		ModelMatrixName[14][11]:=c*t*4;
+		ModelMatrixName[2][0]:=c*t*11;
+		ModelMatrixName[0][2]:=c*t*11;
+		ModelMatrixName[2][11]:=c*t*864;
+		ModelMatrixName[11][2]:=c*t*864;
+		ModelMatrixName[1][14]:=c*t*186;
+		ModelMatrixName[14][1]:=c*t*186;
+		ModelMatrixName[13][14]:=c*t*246;
+		ModelMatrixName[14][13]:=c*t*246;
+		ModelMatrixName[13][11]:=c*t*8;
+		ModelMatrixName[11][13]:=c*t*8;
+		ModelMatrixName[13][2]:=c*t*49;
+		ModelMatrixName[2][13]:=c*t*49;
+		ModelMatrixName[3][2]:=c*t*569;
+		ModelMatrixName[2][3]:=c*t*569;
+		ModelMatrixName[3][13]:=c*t*274;
+		ModelMatrixName[13][3]:=c*t*274;
+		ModelMatrixName[5][0]:=c*t*78;
+		ModelMatrixName[0][5]:=c*t*78;
+		ModelMatrixName[5][14]:=c*t*18;
+		ModelMatrixName[14][5]:=c*t*18;
+		ModelMatrixName[5][11]:=c*t*47;
+		ModelMatrixName[11][5]:=c*t*47;
+		ModelMatrixName[5][2]:=c*t*79;
+		ModelMatrixName[2][5]:=c*t*79;
+		ModelMatrixName[5][3]:=c*t*22;
+		ModelMatrixName[3][5]:=c*t*22;
+		ModelMatrixName[6][0]:=c*t*8;
+		ModelMatrixName[0][6]:=c*t*8;
+		ModelMatrixName[6][14]:=c*t*232;
+		ModelMatrixName[14][6]:=c*t*232;
+		ModelMatrixName[6][11]:=c*t*458;
+		ModelMatrixName[11][6]:=c*t*458;
+		ModelMatrixName[6][2]:=c*t*11;
+		ModelMatrixName[2][6]:=c*t*11;
+		ModelMatrixName[6][1]:=c*t*305;
+		ModelMatrixName[1][6]:=c*t*305;
+		ModelMatrixName[6][13]:=c*t*550;
+		ModelMatrixName[13][6]:=c*t*550;
+		ModelMatrixName[6][3]:=c*t*22;
+		ModelMatrixName[3][6]:=c*t*22;
+		ModelMatrixName[7][0]:=c*t*75;
+		ModelMatrixName[0][7]:=c*t*75;
+		ModelMatrixName[7][11]:=c*t*19;
+		ModelMatrixName[11][7]:=c*t*19;
+		ModelMatrixName[7][1]:=c*t*41;
+		ModelMatrixName[1][7]:=c*t*41;
+		ModelMatrixName[9][0]:=c*t*21;
+		ModelMatrixName[0][9]:=c*t*21;
+		ModelMatrixName[9][14]:=c*t*6;
+		ModelMatrixName[14][9]:=c*t*6;
+		ModelMatrixName[9][1]:=c*t*27;
+		ModelMatrixName[1][9]:=c*t*27;
+		ModelMatrixName[9][13]:=c*t*20;
+		ModelMatrixName[13][9]:=c*t*20;
+		ModelMatrixName[9][6]:=c*t*26;
+		ModelMatrixName[6][9]:=c*t*26;
+		ModelMatrixName[9][7]:=c*t*232;
+		ModelMatrixName[7][9]:=c*t*232;
+		ModelMatrixName[8][14]:=c*t*50;
+		ModelMatrixName[14][8]:=c*t*50;
+		ModelMatrixName[8][11]:=c*t*408;
+		ModelMatrixName[11][8]:=c*t*408;
+		ModelMatrixName[8][13]:=c*t*242;
+		ModelMatrixName[13][8]:=c*t*242;
+		ModelMatrixName[8][3]:=c*t*215;
+		ModelMatrixName[3][8]:=c*t*215;
+		ModelMatrixName[8][7]:=c*t*6;
+		ModelMatrixName[7][8]:=c*t*6;
+		ModelMatrixName[8][9]:=c*t*4;
+		ModelMatrixName[9][8]:=c*t*4;
+		ModelMatrixName[10][0]:=c*t*76;
+		ModelMatrixName[0][10]:=c*t*76;
+		ModelMatrixName[10][11]:=c*t*21;
+		ModelMatrixName[11][10]:=c*t*21;
+		ModelMatrixName[10][13]:=c*t*22;
+		ModelMatrixName[13][10]:=c*t*22;
+		ModelMatrixName[10][7]:=c*t*378;
+		ModelMatrixName[7][10]:=c*t*378;
+		ModelMatrixName[10][9]:=c*t*609;
+		ModelMatrixName[9][10]:=c*t*609;
+		ModelMatrixName[10][8]:=c*t*59;
+		ModelMatrixName[8][10]:=c*t*59;
+		ModelMatrixName[4][11]:=c*t*6;
+		ModelMatrixName[11][4]:=c*t*6;
+		ModelMatrixName[4][2]:=c*t*5;
+		ModelMatrixName[2][4]:=c*t*5;
+		ModelMatrixName[4][1]:=c*t*7;
+		ModelMatrixName[1][4]:=c*t*7;
+		ModelMatrixName[4][7]:=c*t*57;
+		ModelMatrixName[7][4]:=c*t*57;
+		ModelMatrixName[4][9]:=c*t*246;
+		ModelMatrixName[9][4]:=c*t*246;
+		ModelMatrixName[4][10]:=c*t*11;
+		ModelMatrixName[10][4]:=c*t*11;
+		ModelMatrixName[12][0]:=c*t*53;
+		ModelMatrixName[0][12]:=c*t*53;
+		ModelMatrixName[12][14]:=c*t*9;
+		ModelMatrixName[14][12]:=c*t*9;
+		ModelMatrixName[12][11]:=c*t*33;
+		ModelMatrixName[11][12]:=c*t*33;
+		ModelMatrixName[12][2]:=c*t*2;
+		ModelMatrixName[2][12]:=c*t*2;
+		ModelMatrixName[12][13]:=c*t*51;
+		ModelMatrixName[13][12]:=c*t*51;
+		ModelMatrixName[12][6]:=c*t*53;
+		ModelMatrixName[6][12]:=c*t*53;
+		ModelMatrixName[12][7]:=c*t*5;
+		ModelMatrixName[7][12]:=c*t*5;
+		ModelMatrixName[12][9]:=c*t*43;
+		ModelMatrixName[9][12]:=c*t*43;
+		ModelMatrixName[12][8]:=c*t*18;
+		ModelMatrixName[8][12]:=c*t*18;
+		ModelMatrixName[12][4]:=c*t*17;
+		ModelMatrixName[4][12]:=c*t*17;
+		ModelMatrixName[15][0]:=c*t*342;
+		ModelMatrixName[0][15]:=c*t*342;
+		ModelMatrixName[15][14]:=c*t*3;
+		ModelMatrixName[14][15]:=c*t*3;
+		ModelMatrixName[15][11]:=c*t*446;
+		ModelMatrixName[11][15]:=c*t*446;
+		ModelMatrixName[15][2]:=c*t*16;
+		ModelMatrixName[2][15]:=c*t*16;
+		ModelMatrixName[15][1]:=c*t*347;
+		ModelMatrixName[1][15]:=c*t*347;
+		ModelMatrixName[15][13]:=c*t*30;
+		ModelMatrixName[13][15]:=c*t*30;
+		ModelMatrixName[15][3]:=c*t*21;
+		ModelMatrixName[3][15]:=c*t*21;
+		ModelMatrixName[15][5]:=c*t*112;
+		ModelMatrixName[5][15]:=c*t*112;
+		ModelMatrixName[15][6]:=c*t*20;
+		ModelMatrixName[6][15]:=c*t*20;
+		ModelMatrixName[15][9]:=c*t*74;
+		ModelMatrixName[9][15]:=c*t*74;
+		ModelMatrixName[15][8]:=c*t*65;
+		ModelMatrixName[8][15]:=c*t*65;
+		ModelMatrixName[15][10]:=c*t*47;
+		ModelMatrixName[10][15]:=c*t*47;
+		ModelMatrixName[15][4]:=c*t*90;
+		ModelMatrixName[4][15]:=c*t*90;
+		ModelMatrixName[15][12]:=c*t*202;
+		ModelMatrixName[12][15]:=c*t*202;
+		ModelMatrixName[16][0]:=c*t*681;
+		ModelMatrixName[0][16]:=c*t*681;
+		ModelMatrixName[16][11]:=c*t*110;
+		ModelMatrixName[11][16]:=c*t*110;
+		ModelMatrixName[16][1]:=c*t*114;
+		ModelMatrixName[1][16]:=c*t*114;
+		ModelMatrixName[16][3]:=c*t*4;
+		ModelMatrixName[3][16]:=c*t*4;
+		ModelMatrixName[16][6]:=c*t*1;
+		ModelMatrixName[6][16]:=c*t*1;
+		ModelMatrixName[16][7]:=c*t*360;
+		ModelMatrixName[7][16]:=c*t*360;
+		ModelMatrixName[16][9]:=c*t*34;
+		ModelMatrixName[9][16]:=c*t*34;
+		ModelMatrixName[16][8]:=c*t*50;
+		ModelMatrixName[8][16]:=c*t*50;
+		ModelMatrixName[16][10]:=c*t*691;
+		ModelMatrixName[10][16]:=c*t*691;
+		ModelMatrixName[16][4]:=c*t*8;
+		ModelMatrixName[4][16]:=c*t*8;
+		ModelMatrixName[16][12]:=c*t*78;
+		ModelMatrixName[12][16]:=c*t*78;
+		ModelMatrixName[16][15]:=c*t*614;
+		ModelMatrixName[15][16]:=c*t*614;
+		ModelMatrixName[18][0]:=c*t*5;
+		ModelMatrixName[0][18]:=c*t*5;
+		ModelMatrixName[18][14]:=c*t*16;
+		ModelMatrixName[14][18]:=c*t*16;
+		ModelMatrixName[18][11]:=c*t*6;
+		ModelMatrixName[11][18]:=c*t*6;
+		ModelMatrixName[18][1]:=c*t*65;
+		ModelMatrixName[1][18]:=c*t*65;
+		ModelMatrixName[18][9]:=c*t*12;
+		ModelMatrixName[9][18]:=c*t*12;
+		ModelMatrixName[18][10]:=c*t*13;
+		ModelMatrixName[10][18]:=c*t*13;
+		ModelMatrixName[18][12]:=c*t*7;
+		ModelMatrixName[12][18]:=c*t*7;
+		ModelMatrixName[18][15]:=c*t*17;
+		ModelMatrixName[15][18]:=c*t*17;
+		ModelMatrixName[19][11]:=c*t*156;
+		ModelMatrixName[11][19]:=c*t*156;
+		ModelMatrixName[19][1]:=c*t*530;
+		ModelMatrixName[1][19]:=c*t*530;
+		ModelMatrixName[19][13]:=c*t*54;
+		ModelMatrixName[13][19]:=c*t*54;
+		ModelMatrixName[19][5]:=c*t*1;
+		ModelMatrixName[5][19]:=c*t*1;
+		ModelMatrixName[19][6]:=c*t*1525;
+		ModelMatrixName[6][19]:=c*t*1525;
+		ModelMatrixName[19][7]:=c*t*16;
+		ModelMatrixName[7][19]:=c*t*16;
+		ModelMatrixName[19][9]:=c*t*25;
+		ModelMatrixName[9][19]:=c*t*25;
+		ModelMatrixName[19][8]:=c*t*67;
+		ModelMatrixName[8][19]:=c*t*67;
+		ModelMatrixName[19][4]:=c*t*682;
+		ModelMatrixName[4][19]:=c*t*682;
+		ModelMatrixName[19][12]:=c*t*8;
+		ModelMatrixName[12][19]:=c*t*8;
+		ModelMatrixName[19][15]:=c*t*107;
+		ModelMatrixName[15][19]:=c*t*107;
+		ModelMatrixName[19][18]:=c*t*14;
+		ModelMatrixName[18][19]:=c*t*14;
+		ModelMatrixName[17][0]:=c*t*398;
+		ModelMatrixName[0][17]:=c*t*398;
+		ModelMatrixName[17][2]:=c*t*10;
+		ModelMatrixName[2][17]:=c*t*10;
+		ModelMatrixName[17][13]:=c*t*33;
+		ModelMatrixName[13][17]:=c*t*33;
+		ModelMatrixName[17][3]:=c*t*20;
+		ModelMatrixName[3][17]:=c*t*20;
+		ModelMatrixName[17][5]:=c*t*5;
+		ModelMatrixName[5][17]:=c*t*5;
+		ModelMatrixName[17][7]:=c*t*2220;
+		ModelMatrixName[7][17]:=c*t*2220;
+		ModelMatrixName[17][9]:=c*t*100;
+		ModelMatrixName[9][17]:=c*t*100;
+		ModelMatrixName[17][10]:=c*t*832;
+		ModelMatrixName[10][17]:=c*t*832;
+		ModelMatrixName[17][4]:=c*t*6;
+		ModelMatrixName[4][17]:=c*t*6;
+		ModelMatrixName[17][16]:=c*t*237;
+		ModelMatrixName[16][17]:=c*t*237;
+	}
+	else
+	{
+        ModelMatrixName[14][0]:=t*32;
+		ModelMatrixName[0][14]:=t*32;
+		ModelMatrixName[11][0]:=t*2;
+		ModelMatrixName[0][11]:=t*2;
+		ModelMatrixName[11][14]:=t*4;
+		ModelMatrixName[14][11]:=t*4;
+		ModelMatrixName[2][0]:=t*11;
+		ModelMatrixName[0][2]:=t*11;
+		ModelMatrixName[2][11]:=t*864;
+		ModelMatrixName[11][2]:=t*864;
+		ModelMatrixName[1][14]:=t*186;
+		ModelMatrixName[14][1]:=t*186;
+		ModelMatrixName[13][14]:=t*246;
+		ModelMatrixName[14][13]:=t*246;
+		ModelMatrixName[13][11]:=t*8;
+		ModelMatrixName[11][13]:=t*8;
+		ModelMatrixName[13][2]:=t*49;
+		ModelMatrixName[2][13]:=t*49;
+		ModelMatrixName[3][2]:=t*569;
+		ModelMatrixName[2][3]:=t*569;
+		ModelMatrixName[3][13]:=t*274;
+		ModelMatrixName[13][3]:=t*274;
+		ModelMatrixName[5][0]:=t*78;
+		ModelMatrixName[0][5]:=t*78;
+		ModelMatrixName[5][14]:=t*18;
+		ModelMatrixName[14][5]:=t*18;
+		ModelMatrixName[5][11]:=t*47;
+		ModelMatrixName[11][5]:=t*47;
+		ModelMatrixName[5][2]:=t*79;
+		ModelMatrixName[2][5]:=t*79;
+		ModelMatrixName[5][3]:=t*22;
+		ModelMatrixName[3][5]:=t*22;
+		ModelMatrixName[6][0]:=t*8;
+		ModelMatrixName[0][6]:=t*8;
+		ModelMatrixName[6][14]:=t*232;
+		ModelMatrixName[14][6]:=t*232;
+		ModelMatrixName[6][11]:=t*458;
+		ModelMatrixName[11][6]:=t*458;
+		ModelMatrixName[6][2]:=t*11;
+		ModelMatrixName[2][6]:=t*11;
+		ModelMatrixName[6][1]:=t*305;
+		ModelMatrixName[1][6]:=t*305;
+		ModelMatrixName[6][13]:=t*550;
+		ModelMatrixName[13][6]:=t*550;
+		ModelMatrixName[6][3]:=t*22;
+		ModelMatrixName[3][6]:=t*22;
+		ModelMatrixName[7][0]:=t*75;
+		ModelMatrixName[0][7]:=t*75;
+		ModelMatrixName[7][11]:=t*19;
+		ModelMatrixName[11][7]:=t*19;
+		ModelMatrixName[7][1]:=t*41;
+		ModelMatrixName[1][7]:=t*41;
+		ModelMatrixName[9][0]:=t*21;
+		ModelMatrixName[0][9]:=t*21;
+		ModelMatrixName[9][14]:=t*6;
+		ModelMatrixName[14][9]:=t*6;
+		ModelMatrixName[9][1]:=t*27;
+		ModelMatrixName[1][9]:=t*27;
+		ModelMatrixName[9][13]:=t*20;
+		ModelMatrixName[13][9]:=t*20;
+		ModelMatrixName[9][6]:=t*26;
+		ModelMatrixName[6][9]:=t*26;
+		ModelMatrixName[9][7]:=t*232;
+		ModelMatrixName[7][9]:=t*232;
+		ModelMatrixName[8][14]:=t*50;
+		ModelMatrixName[14][8]:=t*50;
+		ModelMatrixName[8][11]:=t*408;
+		ModelMatrixName[11][8]:=t*408;
+		ModelMatrixName[8][13]:=t*242;
+		ModelMatrixName[13][8]:=t*242;
+		ModelMatrixName[8][3]:=t*215;
+		ModelMatrixName[3][8]:=t*215;
+		ModelMatrixName[8][7]:=t*6;
+		ModelMatrixName[7][8]:=t*6;
+		ModelMatrixName[8][9]:=t*4;
+		ModelMatrixName[9][8]:=t*4;
+		ModelMatrixName[10][0]:=t*76;
+		ModelMatrixName[0][10]:=t*76;
+		ModelMatrixName[10][11]:=t*21;
+		ModelMatrixName[11][10]:=t*21;
+		ModelMatrixName[10][13]:=t*22;
+		ModelMatrixName[13][10]:=t*22;
+		ModelMatrixName[10][7]:=t*378;
+		ModelMatrixName[7][10]:=t*378;
+		ModelMatrixName[10][9]:=t*609;
+		ModelMatrixName[9][10]:=t*609;
+		ModelMatrixName[10][8]:=t*59;
+		ModelMatrixName[8][10]:=t*59;
+		ModelMatrixName[4][11]:=t*6;
+		ModelMatrixName[11][4]:=t*6;
+		ModelMatrixName[4][2]:=t*5;
+		ModelMatrixName[2][4]:=t*5;
+		ModelMatrixName[4][1]:=t*7;
+		ModelMatrixName[1][4]:=t*7;
+		ModelMatrixName[4][7]:=t*57;
+		ModelMatrixName[7][4]:=t*57;
+		ModelMatrixName[4][9]:=t*246;
+		ModelMatrixName[9][4]:=t*246;
+		ModelMatrixName[4][10]:=t*11;
+		ModelMatrixName[10][4]:=t*11;
+		ModelMatrixName[12][0]:=t*53;
+		ModelMatrixName[0][12]:=t*53;
+		ModelMatrixName[12][14]:=t*9;
+		ModelMatrixName[14][12]:=t*9;
+		ModelMatrixName[12][11]:=t*33;
+		ModelMatrixName[11][12]:=t*33;
+		ModelMatrixName[12][2]:=t*2;
+		ModelMatrixName[2][12]:=t*2;
+		ModelMatrixName[12][13]:=t*51;
+		ModelMatrixName[13][12]:=t*51;
+		ModelMatrixName[12][6]:=t*53;
+		ModelMatrixName[6][12]:=t*53;
+		ModelMatrixName[12][7]:=t*5;
+		ModelMatrixName[7][12]:=t*5;
+		ModelMatrixName[12][9]:=t*43;
+		ModelMatrixName[9][12]:=t*43;
+		ModelMatrixName[12][8]:=t*18;
+		ModelMatrixName[8][12]:=t*18;
+		ModelMatrixName[12][4]:=t*17;
+		ModelMatrixName[4][12]:=t*17;
+		ModelMatrixName[15][0]:=t*342;
+		ModelMatrixName[0][15]:=t*342;
+		ModelMatrixName[15][14]:=t*3;
+		ModelMatrixName[14][15]:=t*3;
+		ModelMatrixName[15][11]:=t*446;
+		ModelMatrixName[11][15]:=t*446;
+		ModelMatrixName[15][2]:=t*16;
+		ModelMatrixName[2][15]:=t*16;
+		ModelMatrixName[15][1]:=t*347;
+		ModelMatrixName[1][15]:=t*347;
+		ModelMatrixName[15][13]:=t*30;
+		ModelMatrixName[13][15]:=t*30;
+		ModelMatrixName[15][3]:=t*21;
+		ModelMatrixName[3][15]:=t*21;
+		ModelMatrixName[15][5]:=t*112;
+		ModelMatrixName[5][15]:=t*112;
+		ModelMatrixName[15][6]:=t*20;
+		ModelMatrixName[6][15]:=t*20;
+		ModelMatrixName[15][9]:=t*74;
+		ModelMatrixName[9][15]:=t*74;
+		ModelMatrixName[15][8]:=t*65;
+		ModelMatrixName[8][15]:=t*65;
+		ModelMatrixName[15][10]:=t*47;
+		ModelMatrixName[10][15]:=t*47;
+		ModelMatrixName[15][4]:=t*90;
+		ModelMatrixName[4][15]:=t*90;
+		ModelMatrixName[15][12]:=t*202;
+		ModelMatrixName[12][15]:=t*202;
+		ModelMatrixName[16][0]:=t*681;
+		ModelMatrixName[0][16]:=t*681;
+		ModelMatrixName[16][11]:=t*110;
+		ModelMatrixName[11][16]:=t*110;
+		ModelMatrixName[16][1]:=t*114;
+		ModelMatrixName[1][16]:=t*114;
+		ModelMatrixName[16][3]:=t*4;
+		ModelMatrixName[3][16]:=t*4;
+		ModelMatrixName[16][6]:=t*1;
+		ModelMatrixName[6][16]:=t*1;
+		ModelMatrixName[16][7]:=t*360;
+		ModelMatrixName[7][16]:=t*360;
+		ModelMatrixName[16][9]:=t*34;
+		ModelMatrixName[9][16]:=t*34;
+		ModelMatrixName[16][8]:=t*50;
+		ModelMatrixName[8][16]:=t*50;
+		ModelMatrixName[16][10]:=t*691;
+		ModelMatrixName[10][16]:=t*691;
+		ModelMatrixName[16][4]:=t*8;
+		ModelMatrixName[4][16]:=t*8;
+		ModelMatrixName[16][12]:=t*78;
+		ModelMatrixName[12][16]:=t*78;
+		ModelMatrixName[16][15]:=t*614;
+		ModelMatrixName[15][16]:=t*614;
+		ModelMatrixName[18][0]:=t*5;
+		ModelMatrixName[0][18]:=t*5;
+		ModelMatrixName[18][14]:=t*16;
+		ModelMatrixName[14][18]:=t*16;
+		ModelMatrixName[18][11]:=t*6;
+		ModelMatrixName[11][18]:=t*6;
+		ModelMatrixName[18][1]:=t*65;
+		ModelMatrixName[1][18]:=t*65;
+		ModelMatrixName[18][9]:=t*12;
+		ModelMatrixName[9][18]:=t*12;
+		ModelMatrixName[18][10]:=t*13;
+		ModelMatrixName[10][18]:=t*13;
+		ModelMatrixName[18][12]:=t*7;
+		ModelMatrixName[12][18]:=t*7;
+		ModelMatrixName[18][15]:=t*17;
+		ModelMatrixName[15][18]:=t*17;
+		ModelMatrixName[19][11]:=t*156;
+		ModelMatrixName[11][19]:=t*156;
+		ModelMatrixName[19][1]:=t*530;
+		ModelMatrixName[1][19]:=t*530;
+		ModelMatrixName[19][13]:=t*54;
+		ModelMatrixName[13][19]:=t*54;
+		ModelMatrixName[19][5]:=t*1;
+		ModelMatrixName[5][19]:=t*1;
+		ModelMatrixName[19][6]:=t*1525;
+		ModelMatrixName[6][19]:=t*1525;
+		ModelMatrixName[19][7]:=t*16;
+		ModelMatrixName[7][19]:=t*16;
+		ModelMatrixName[19][9]:=t*25;
+		ModelMatrixName[9][19]:=t*25;
+		ModelMatrixName[19][8]:=t*67;
+		ModelMatrixName[8][19]:=t*67;
+		ModelMatrixName[19][4]:=t*682;
+		ModelMatrixName[4][19]:=t*682;
+		ModelMatrixName[19][12]:=t*8;
+		ModelMatrixName[12][19]:=t*8;
+		ModelMatrixName[19][15]:=t*107;
+		ModelMatrixName[15][19]:=t*107;
+		ModelMatrixName[19][18]:=t*14;
+		ModelMatrixName[18][19]:=t*14;
+		ModelMatrixName[17][0]:=t*398;
+		ModelMatrixName[0][17]:=t*398;
+		ModelMatrixName[17][2]:=t*10;
+		ModelMatrixName[2][17]:=t*10;
+		ModelMatrixName[17][13]:=t*33;
+		ModelMatrixName[13][17]:=t*33;
+		ModelMatrixName[17][3]:=t*20;
+		ModelMatrixName[3][17]:=t*20;
+		ModelMatrixName[17][5]:=t*5;
+		ModelMatrixName[5][17]:=t*5;
+		ModelMatrixName[17][7]:=t*2220;
+		ModelMatrixName[7][17]:=t*2220;
+		ModelMatrixName[17][9]:=t*100;
+		ModelMatrixName[9][17]:=t*100;
+		ModelMatrixName[17][10]:=t*832;
+		ModelMatrixName[10][17]:=t*832;
+		ModelMatrixName[17][4]:=t*6;
+		ModelMatrixName[4][17]:=t*6;
+		ModelMatrixName[17][16]:=t*237;
+		ModelMatrixName[16][17]:=t*237;
+
+	}
+	return 1;
+}
+
+equalFreqs={20,1};
+
+equalFreqs[0]=0.0692;
+equalFreqs[14]=0.0184;
+equalFreqs[11]=0.04;
+equalFreqs[2]=0.0186;
+equalFreqs[1]=0.0065;
+equalFreqs[13]=0.0238;
+equalFreqs[3]=0.0236;
+equalFreqs[5]=0.0557;
+equalFreqs[6]=0.0277;
+equalFreqs[7]=0.0905;
+equalFreqs[9]=0.1675;
+equalFreqs[8]=0.0221;
+equalFreqs[10]=0.0561;
+equalFreqs[4]=0.0611;
+equalFreqs[12]=0.0536;
+equalFreqs[15]=0.0725;
+equalFreqs[16]=0.087;
+equalFreqs[18]=0.0293;
+equalFreqs[19]=0.034;
+equalFreqs[17]=0.0428;
+
+mtMAMMatrix = 0;
+MULTIPLY_BY_FREQS = PopulateModelMatrix ("mtMAMMatrix",equalFreqs);
+Model mtMAMModel = (mtMAMMatrix, equalFreqs, MULTIPLY_BY_FREQS);
+FREQUENCY_SENSITIVE = 0;
diff --git a/res/TemplateBatchFiles/TemplateModels/mtMAM_F.mdl b/res/TemplateBatchFiles/TemplateModels/mtMAM_F.mdl
new file mode 100644
index 0000000..ba2ec1f
--- /dev/null
+++ b/res/TemplateBatchFiles/TemplateModels/mtMAM_F.mdl
@@ -0,0 +1,499 @@
+#include "modelParameters2.mdl";
+
+if (!SKIP_MODEL_PARAMETER_LIST)
+{
+	if (modelType == 1)
+	{
+		#include "defineGamma.mdl";
+	}	
+	if (modelType == 2)
+	{
+		#include "defineHM.mdl";
+	}
+}
+function PopulateModelMatrix (ModelMatrixName&, EFV)
+{
+	ModelMatrixName = {20,20};
+	if (categoriesUsed)
+	{
+        ModelMatrixName[14][0]:=c*t*32;
+		ModelMatrixName[0][14]:=c*t*32;
+		ModelMatrixName[11][0]:=c*t*2;
+		ModelMatrixName[0][11]:=c*t*2;
+		ModelMatrixName[11][14]:=c*t*4;
+		ModelMatrixName[14][11]:=c*t*4;
+		ModelMatrixName[2][0]:=c*t*11;
+		ModelMatrixName[0][2]:=c*t*11;
+		ModelMatrixName[2][11]:=c*t*864;
+		ModelMatrixName[11][2]:=c*t*864;
+		ModelMatrixName[1][14]:=c*t*186;
+		ModelMatrixName[14][1]:=c*t*186;
+		ModelMatrixName[13][14]:=c*t*246;
+		ModelMatrixName[14][13]:=c*t*246;
+		ModelMatrixName[13][11]:=c*t*8;
+		ModelMatrixName[11][13]:=c*t*8;
+		ModelMatrixName[13][2]:=c*t*49;
+		ModelMatrixName[2][13]:=c*t*49;
+		ModelMatrixName[3][2]:=c*t*569;
+		ModelMatrixName[2][3]:=c*t*569;
+		ModelMatrixName[3][13]:=c*t*274;
+		ModelMatrixName[13][3]:=c*t*274;
+		ModelMatrixName[5][0]:=c*t*78;
+		ModelMatrixName[0][5]:=c*t*78;
+		ModelMatrixName[5][14]:=c*t*18;
+		ModelMatrixName[14][5]:=c*t*18;
+		ModelMatrixName[5][11]:=c*t*47;
+		ModelMatrixName[11][5]:=c*t*47;
+		ModelMatrixName[5][2]:=c*t*79;
+		ModelMatrixName[2][5]:=c*t*79;
+		ModelMatrixName[5][3]:=c*t*22;
+		ModelMatrixName[3][5]:=c*t*22;
+		ModelMatrixName[6][0]:=c*t*8;
+		ModelMatrixName[0][6]:=c*t*8;
+		ModelMatrixName[6][14]:=c*t*232;
+		ModelMatrixName[14][6]:=c*t*232;
+		ModelMatrixName[6][11]:=c*t*458;
+		ModelMatrixName[11][6]:=c*t*458;
+		ModelMatrixName[6][2]:=c*t*11;
+		ModelMatrixName[2][6]:=c*t*11;
+		ModelMatrixName[6][1]:=c*t*305;
+		ModelMatrixName[1][6]:=c*t*305;
+		ModelMatrixName[6][13]:=c*t*550;
+		ModelMatrixName[13][6]:=c*t*550;
+		ModelMatrixName[6][3]:=c*t*22;
+		ModelMatrixName[3][6]:=c*t*22;
+		ModelMatrixName[7][0]:=c*t*75;
+		ModelMatrixName[0][7]:=c*t*75;
+		ModelMatrixName[7][11]:=c*t*19;
+		ModelMatrixName[11][7]:=c*t*19;
+		ModelMatrixName[7][1]:=c*t*41;
+		ModelMatrixName[1][7]:=c*t*41;
+		ModelMatrixName[9][0]:=c*t*21;
+		ModelMatrixName[0][9]:=c*t*21;
+		ModelMatrixName[9][14]:=c*t*6;
+		ModelMatrixName[14][9]:=c*t*6;
+		ModelMatrixName[9][1]:=c*t*27;
+		ModelMatrixName[1][9]:=c*t*27;
+		ModelMatrixName[9][13]:=c*t*20;
+		ModelMatrixName[13][9]:=c*t*20;
+		ModelMatrixName[9][6]:=c*t*26;
+		ModelMatrixName[6][9]:=c*t*26;
+		ModelMatrixName[9][7]:=c*t*232;
+		ModelMatrixName[7][9]:=c*t*232;
+		ModelMatrixName[8][14]:=c*t*50;
+		ModelMatrixName[14][8]:=c*t*50;
+		ModelMatrixName[8][11]:=c*t*408;
+		ModelMatrixName[11][8]:=c*t*408;
+		ModelMatrixName[8][13]:=c*t*242;
+		ModelMatrixName[13][8]:=c*t*242;
+		ModelMatrixName[8][3]:=c*t*215;
+		ModelMatrixName[3][8]:=c*t*215;
+		ModelMatrixName[8][7]:=c*t*6;
+		ModelMatrixName[7][8]:=c*t*6;
+		ModelMatrixName[8][9]:=c*t*4;
+		ModelMatrixName[9][8]:=c*t*4;
+		ModelMatrixName[10][0]:=c*t*76;
+		ModelMatrixName[0][10]:=c*t*76;
+		ModelMatrixName[10][11]:=c*t*21;
+		ModelMatrixName[11][10]:=c*t*21;
+		ModelMatrixName[10][13]:=c*t*22;
+		ModelMatrixName[13][10]:=c*t*22;
+		ModelMatrixName[10][7]:=c*t*378;
+		ModelMatrixName[7][10]:=c*t*378;
+		ModelMatrixName[10][9]:=c*t*609;
+		ModelMatrixName[9][10]:=c*t*609;
+		ModelMatrixName[10][8]:=c*t*59;
+		ModelMatrixName[8][10]:=c*t*59;
+		ModelMatrixName[4][11]:=c*t*6;
+		ModelMatrixName[11][4]:=c*t*6;
+		ModelMatrixName[4][2]:=c*t*5;
+		ModelMatrixName[2][4]:=c*t*5;
+		ModelMatrixName[4][1]:=c*t*7;
+		ModelMatrixName[1][4]:=c*t*7;
+		ModelMatrixName[4][7]:=c*t*57;
+		ModelMatrixName[7][4]:=c*t*57;
+		ModelMatrixName[4][9]:=c*t*246;
+		ModelMatrixName[9][4]:=c*t*246;
+		ModelMatrixName[4][10]:=c*t*11;
+		ModelMatrixName[10][4]:=c*t*11;
+		ModelMatrixName[12][0]:=c*t*53;
+		ModelMatrixName[0][12]:=c*t*53;
+		ModelMatrixName[12][14]:=c*t*9;
+		ModelMatrixName[14][12]:=c*t*9;
+		ModelMatrixName[12][11]:=c*t*33;
+		ModelMatrixName[11][12]:=c*t*33;
+		ModelMatrixName[12][2]:=c*t*2;
+		ModelMatrixName[2][12]:=c*t*2;
+		ModelMatrixName[12][13]:=c*t*51;
+		ModelMatrixName[13][12]:=c*t*51;
+		ModelMatrixName[12][6]:=c*t*53;
+		ModelMatrixName[6][12]:=c*t*53;
+		ModelMatrixName[12][7]:=c*t*5;
+		ModelMatrixName[7][12]:=c*t*5;
+		ModelMatrixName[12][9]:=c*t*43;
+		ModelMatrixName[9][12]:=c*t*43;
+		ModelMatrixName[12][8]:=c*t*18;
+		ModelMatrixName[8][12]:=c*t*18;
+		ModelMatrixName[12][4]:=c*t*17;
+		ModelMatrixName[4][12]:=c*t*17;
+		ModelMatrixName[15][0]:=c*t*342;
+		ModelMatrixName[0][15]:=c*t*342;
+		ModelMatrixName[15][14]:=c*t*3;
+		ModelMatrixName[14][15]:=c*t*3;
+		ModelMatrixName[15][11]:=c*t*446;
+		ModelMatrixName[11][15]:=c*t*446;
+		ModelMatrixName[15][2]:=c*t*16;
+		ModelMatrixName[2][15]:=c*t*16;
+		ModelMatrixName[15][1]:=c*t*347;
+		ModelMatrixName[1][15]:=c*t*347;
+		ModelMatrixName[15][13]:=c*t*30;
+		ModelMatrixName[13][15]:=c*t*30;
+		ModelMatrixName[15][3]:=c*t*21;
+		ModelMatrixName[3][15]:=c*t*21;
+		ModelMatrixName[15][5]:=c*t*112;
+		ModelMatrixName[5][15]:=c*t*112;
+		ModelMatrixName[15][6]:=c*t*20;
+		ModelMatrixName[6][15]:=c*t*20;
+		ModelMatrixName[15][9]:=c*t*74;
+		ModelMatrixName[9][15]:=c*t*74;
+		ModelMatrixName[15][8]:=c*t*65;
+		ModelMatrixName[8][15]:=c*t*65;
+		ModelMatrixName[15][10]:=c*t*47;
+		ModelMatrixName[10][15]:=c*t*47;
+		ModelMatrixName[15][4]:=c*t*90;
+		ModelMatrixName[4][15]:=c*t*90;
+		ModelMatrixName[15][12]:=c*t*202;
+		ModelMatrixName[12][15]:=c*t*202;
+		ModelMatrixName[16][0]:=c*t*681;
+		ModelMatrixName[0][16]:=c*t*681;
+		ModelMatrixName[16][11]:=c*t*110;
+		ModelMatrixName[11][16]:=c*t*110;
+		ModelMatrixName[16][1]:=c*t*114;
+		ModelMatrixName[1][16]:=c*t*114;
+		ModelMatrixName[16][3]:=c*t*4;
+		ModelMatrixName[3][16]:=c*t*4;
+		ModelMatrixName[16][6]:=c*t*1;
+		ModelMatrixName[6][16]:=c*t*1;
+		ModelMatrixName[16][7]:=c*t*360;
+		ModelMatrixName[7][16]:=c*t*360;
+		ModelMatrixName[16][9]:=c*t*34;
+		ModelMatrixName[9][16]:=c*t*34;
+		ModelMatrixName[16][8]:=c*t*50;
+		ModelMatrixName[8][16]:=c*t*50;
+		ModelMatrixName[16][10]:=c*t*691;
+		ModelMatrixName[10][16]:=c*t*691;
+		ModelMatrixName[16][4]:=c*t*8;
+		ModelMatrixName[4][16]:=c*t*8;
+		ModelMatrixName[16][12]:=c*t*78;
+		ModelMatrixName[12][16]:=c*t*78;
+		ModelMatrixName[16][15]:=c*t*614;
+		ModelMatrixName[15][16]:=c*t*614;
+		ModelMatrixName[18][0]:=c*t*5;
+		ModelMatrixName[0][18]:=c*t*5;
+		ModelMatrixName[18][14]:=c*t*16;
+		ModelMatrixName[14][18]:=c*t*16;
+		ModelMatrixName[18][11]:=c*t*6;
+		ModelMatrixName[11][18]:=c*t*6;
+		ModelMatrixName[18][1]:=c*t*65;
+		ModelMatrixName[1][18]:=c*t*65;
+		ModelMatrixName[18][9]:=c*t*12;
+		ModelMatrixName[9][18]:=c*t*12;
+		ModelMatrixName[18][10]:=c*t*13;
+		ModelMatrixName[10][18]:=c*t*13;
+		ModelMatrixName[18][12]:=c*t*7;
+		ModelMatrixName[12][18]:=c*t*7;
+		ModelMatrixName[18][15]:=c*t*17;
+		ModelMatrixName[15][18]:=c*t*17;
+		ModelMatrixName[19][11]:=c*t*156;
+		ModelMatrixName[11][19]:=c*t*156;
+		ModelMatrixName[19][1]:=c*t*530;
+		ModelMatrixName[1][19]:=c*t*530;
+		ModelMatrixName[19][13]:=c*t*54;
+		ModelMatrixName[13][19]:=c*t*54;
+		ModelMatrixName[19][5]:=c*t*1;
+		ModelMatrixName[5][19]:=c*t*1;
+		ModelMatrixName[19][6]:=c*t*1525;
+		ModelMatrixName[6][19]:=c*t*1525;
+		ModelMatrixName[19][7]:=c*t*16;
+		ModelMatrixName[7][19]:=c*t*16;
+		ModelMatrixName[19][9]:=c*t*25;
+		ModelMatrixName[9][19]:=c*t*25;
+		ModelMatrixName[19][8]:=c*t*67;
+		ModelMatrixName[8][19]:=c*t*67;
+		ModelMatrixName[19][4]:=c*t*682;
+		ModelMatrixName[4][19]:=c*t*682;
+		ModelMatrixName[19][12]:=c*t*8;
+		ModelMatrixName[12][19]:=c*t*8;
+		ModelMatrixName[19][15]:=c*t*107;
+		ModelMatrixName[15][19]:=c*t*107;
+		ModelMatrixName[19][18]:=c*t*14;
+		ModelMatrixName[18][19]:=c*t*14;
+		ModelMatrixName[17][0]:=c*t*398;
+		ModelMatrixName[0][17]:=c*t*398;
+		ModelMatrixName[17][2]:=c*t*10;
+		ModelMatrixName[2][17]:=c*t*10;
+		ModelMatrixName[17][13]:=c*t*33;
+		ModelMatrixName[13][17]:=c*t*33;
+		ModelMatrixName[17][3]:=c*t*20;
+		ModelMatrixName[3][17]:=c*t*20;
+		ModelMatrixName[17][5]:=c*t*5;
+		ModelMatrixName[5][17]:=c*t*5;
+		ModelMatrixName[17][7]:=c*t*2220;
+		ModelMatrixName[7][17]:=c*t*2220;
+		ModelMatrixName[17][9]:=c*t*100;
+		ModelMatrixName[9][17]:=c*t*100;
+		ModelMatrixName[17][10]:=c*t*832;
+		ModelMatrixName[10][17]:=c*t*832;
+		ModelMatrixName[17][4]:=c*t*6;
+		ModelMatrixName[4][17]:=c*t*6;
+		ModelMatrixName[17][16]:=c*t*237;
+		ModelMatrixName[16][17]:=c*t*237;
+	}
+	else
+	{
+        ModelMatrixName[14][0]:=t*32;
+		ModelMatrixName[0][14]:=t*32;
+		ModelMatrixName[11][0]:=t*2;
+		ModelMatrixName[0][11]:=t*2;
+		ModelMatrixName[11][14]:=t*4;
+		ModelMatrixName[14][11]:=t*4;
+		ModelMatrixName[2][0]:=t*11;
+		ModelMatrixName[0][2]:=t*11;
+		ModelMatrixName[2][11]:=t*864;
+		ModelMatrixName[11][2]:=t*864;
+		ModelMatrixName[1][14]:=t*186;
+		ModelMatrixName[14][1]:=t*186;
+		ModelMatrixName[13][14]:=t*246;
+		ModelMatrixName[14][13]:=t*246;
+		ModelMatrixName[13][11]:=t*8;
+		ModelMatrixName[11][13]:=t*8;
+		ModelMatrixName[13][2]:=t*49;
+		ModelMatrixName[2][13]:=t*49;
+		ModelMatrixName[3][2]:=t*569;
+		ModelMatrixName[2][3]:=t*569;
+		ModelMatrixName[3][13]:=t*274;
+		ModelMatrixName[13][3]:=t*274;
+		ModelMatrixName[5][0]:=t*78;
+		ModelMatrixName[0][5]:=t*78;
+		ModelMatrixName[5][14]:=t*18;
+		ModelMatrixName[14][5]:=t*18;
+		ModelMatrixName[5][11]:=t*47;
+		ModelMatrixName[11][5]:=t*47;
+		ModelMatrixName[5][2]:=t*79;
+		ModelMatrixName[2][5]:=t*79;
+		ModelMatrixName[5][3]:=t*22;
+		ModelMatrixName[3][5]:=t*22;
+		ModelMatrixName[6][0]:=t*8;
+		ModelMatrixName[0][6]:=t*8;
+		ModelMatrixName[6][14]:=t*232;
+		ModelMatrixName[14][6]:=t*232;
+		ModelMatrixName[6][11]:=t*458;
+		ModelMatrixName[11][6]:=t*458;
+		ModelMatrixName[6][2]:=t*11;
+		ModelMatrixName[2][6]:=t*11;
+		ModelMatrixName[6][1]:=t*305;
+		ModelMatrixName[1][6]:=t*305;
+		ModelMatrixName[6][13]:=t*550;
+		ModelMatrixName[13][6]:=t*550;
+		ModelMatrixName[6][3]:=t*22;
+		ModelMatrixName[3][6]:=t*22;
+		ModelMatrixName[7][0]:=t*75;
+		ModelMatrixName[0][7]:=t*75;
+		ModelMatrixName[7][11]:=t*19;
+		ModelMatrixName[11][7]:=t*19;
+		ModelMatrixName[7][1]:=t*41;
+		ModelMatrixName[1][7]:=t*41;
+		ModelMatrixName[9][0]:=t*21;
+		ModelMatrixName[0][9]:=t*21;
+		ModelMatrixName[9][14]:=t*6;
+		ModelMatrixName[14][9]:=t*6;
+		ModelMatrixName[9][1]:=t*27;
+		ModelMatrixName[1][9]:=t*27;
+		ModelMatrixName[9][13]:=t*20;
+		ModelMatrixName[13][9]:=t*20;
+		ModelMatrixName[9][6]:=t*26;
+		ModelMatrixName[6][9]:=t*26;
+		ModelMatrixName[9][7]:=t*232;
+		ModelMatrixName[7][9]:=t*232;
+		ModelMatrixName[8][14]:=t*50;
+		ModelMatrixName[14][8]:=t*50;
+		ModelMatrixName[8][11]:=t*408;
+		ModelMatrixName[11][8]:=t*408;
+		ModelMatrixName[8][13]:=t*242;
+		ModelMatrixName[13][8]:=t*242;
+		ModelMatrixName[8][3]:=t*215;
+		ModelMatrixName[3][8]:=t*215;
+		ModelMatrixName[8][7]:=t*6;
+		ModelMatrixName[7][8]:=t*6;
+		ModelMatrixName[8][9]:=t*4;
+		ModelMatrixName[9][8]:=t*4;
+		ModelMatrixName[10][0]:=t*76;
+		ModelMatrixName[0][10]:=t*76;
+		ModelMatrixName[10][11]:=t*21;
+		ModelMatrixName[11][10]:=t*21;
+		ModelMatrixName[10][13]:=t*22;
+		ModelMatrixName[13][10]:=t*22;
+		ModelMatrixName[10][7]:=t*378;
+		ModelMatrixName[7][10]:=t*378;
+		ModelMatrixName[10][9]:=t*609;
+		ModelMatrixName[9][10]:=t*609;
+		ModelMatrixName[10][8]:=t*59;
+		ModelMatrixName[8][10]:=t*59;
+		ModelMatrixName[4][11]:=t*6;
+		ModelMatrixName[11][4]:=t*6;
+		ModelMatrixName[4][2]:=t*5;
+		ModelMatrixName[2][4]:=t*5;
+		ModelMatrixName[4][1]:=t*7;
+		ModelMatrixName[1][4]:=t*7;
+		ModelMatrixName[4][7]:=t*57;
+		ModelMatrixName[7][4]:=t*57;
+		ModelMatrixName[4][9]:=t*246;
+		ModelMatrixName[9][4]:=t*246;
+		ModelMatrixName[4][10]:=t*11;
+		ModelMatrixName[10][4]:=t*11;
+		ModelMatrixName[12][0]:=t*53;
+		ModelMatrixName[0][12]:=t*53;
+		ModelMatrixName[12][14]:=t*9;
+		ModelMatrixName[14][12]:=t*9;
+		ModelMatrixName[12][11]:=t*33;
+		ModelMatrixName[11][12]:=t*33;
+		ModelMatrixName[12][2]:=t*2;
+		ModelMatrixName[2][12]:=t*2;
+		ModelMatrixName[12][13]:=t*51;
+		ModelMatrixName[13][12]:=t*51;
+		ModelMatrixName[12][6]:=t*53;
+		ModelMatrixName[6][12]:=t*53;
+		ModelMatrixName[12][7]:=t*5;
+		ModelMatrixName[7][12]:=t*5;
+		ModelMatrixName[12][9]:=t*43;
+		ModelMatrixName[9][12]:=t*43;
+		ModelMatrixName[12][8]:=t*18;
+		ModelMatrixName[8][12]:=t*18;
+		ModelMatrixName[12][4]:=t*17;
+		ModelMatrixName[4][12]:=t*17;
+		ModelMatrixName[15][0]:=t*342;
+		ModelMatrixName[0][15]:=t*342;
+		ModelMatrixName[15][14]:=t*3;
+		ModelMatrixName[14][15]:=t*3;
+		ModelMatrixName[15][11]:=t*446;
+		ModelMatrixName[11][15]:=t*446;
+		ModelMatrixName[15][2]:=t*16;
+		ModelMatrixName[2][15]:=t*16;
+		ModelMatrixName[15][1]:=t*347;
+		ModelMatrixName[1][15]:=t*347;
+		ModelMatrixName[15][13]:=t*30;
+		ModelMatrixName[13][15]:=t*30;
+		ModelMatrixName[15][3]:=t*21;
+		ModelMatrixName[3][15]:=t*21;
+		ModelMatrixName[15][5]:=t*112;
+		ModelMatrixName[5][15]:=t*112;
+		ModelMatrixName[15][6]:=t*20;
+		ModelMatrixName[6][15]:=t*20;
+		ModelMatrixName[15][9]:=t*74;
+		ModelMatrixName[9][15]:=t*74;
+		ModelMatrixName[15][8]:=t*65;
+		ModelMatrixName[8][15]:=t*65;
+		ModelMatrixName[15][10]:=t*47;
+		ModelMatrixName[10][15]:=t*47;
+		ModelMatrixName[15][4]:=t*90;
+		ModelMatrixName[4][15]:=t*90;
+		ModelMatrixName[15][12]:=t*202;
+		ModelMatrixName[12][15]:=t*202;
+		ModelMatrixName[16][0]:=t*681;
+		ModelMatrixName[0][16]:=t*681;
+		ModelMatrixName[16][11]:=t*110;
+		ModelMatrixName[11][16]:=t*110;
+		ModelMatrixName[16][1]:=t*114;
+		ModelMatrixName[1][16]:=t*114;
+		ModelMatrixName[16][3]:=t*4;
+		ModelMatrixName[3][16]:=t*4;
+		ModelMatrixName[16][6]:=t*1;
+		ModelMatrixName[6][16]:=t*1;
+		ModelMatrixName[16][7]:=t*360;
+		ModelMatrixName[7][16]:=t*360;
+		ModelMatrixName[16][9]:=t*34;
+		ModelMatrixName[9][16]:=t*34;
+		ModelMatrixName[16][8]:=t*50;
+		ModelMatrixName[8][16]:=t*50;
+		ModelMatrixName[16][10]:=t*691;
+		ModelMatrixName[10][16]:=t*691;
+		ModelMatrixName[16][4]:=t*8;
+		ModelMatrixName[4][16]:=t*8;
+		ModelMatrixName[16][12]:=t*78;
+		ModelMatrixName[12][16]:=t*78;
+		ModelMatrixName[16][15]:=t*614;
+		ModelMatrixName[15][16]:=t*614;
+		ModelMatrixName[18][0]:=t*5;
+		ModelMatrixName[0][18]:=t*5;
+		ModelMatrixName[18][14]:=t*16;
+		ModelMatrixName[14][18]:=t*16;
+		ModelMatrixName[18][11]:=t*6;
+		ModelMatrixName[11][18]:=t*6;
+		ModelMatrixName[18][1]:=t*65;
+		ModelMatrixName[1][18]:=t*65;
+		ModelMatrixName[18][9]:=t*12;
+		ModelMatrixName[9][18]:=t*12;
+		ModelMatrixName[18][10]:=t*13;
+		ModelMatrixName[10][18]:=t*13;
+		ModelMatrixName[18][12]:=t*7;
+		ModelMatrixName[12][18]:=t*7;
+		ModelMatrixName[18][15]:=t*17;
+		ModelMatrixName[15][18]:=t*17;
+		ModelMatrixName[19][11]:=t*156;
+		ModelMatrixName[11][19]:=t*156;
+		ModelMatrixName[19][1]:=t*530;
+		ModelMatrixName[1][19]:=t*530;
+		ModelMatrixName[19][13]:=t*54;
+		ModelMatrixName[13][19]:=t*54;
+		ModelMatrixName[19][5]:=t*1;
+		ModelMatrixName[5][19]:=t*1;
+		ModelMatrixName[19][6]:=t*1525;
+		ModelMatrixName[6][19]:=t*1525;
+		ModelMatrixName[19][7]:=t*16;
+		ModelMatrixName[7][19]:=t*16;
+		ModelMatrixName[19][9]:=t*25;
+		ModelMatrixName[9][19]:=t*25;
+		ModelMatrixName[19][8]:=t*67;
+		ModelMatrixName[8][19]:=t*67;
+		ModelMatrixName[19][4]:=t*682;
+		ModelMatrixName[4][19]:=t*682;
+		ModelMatrixName[19][12]:=t*8;
+		ModelMatrixName[12][19]:=t*8;
+		ModelMatrixName[19][15]:=t*107;
+		ModelMatrixName[15][19]:=t*107;
+		ModelMatrixName[19][18]:=t*14;
+		ModelMatrixName[18][19]:=t*14;
+		ModelMatrixName[17][0]:=t*398;
+		ModelMatrixName[0][17]:=t*398;
+		ModelMatrixName[17][2]:=t*10;
+		ModelMatrixName[2][17]:=t*10;
+		ModelMatrixName[17][13]:=t*33;
+		ModelMatrixName[13][17]:=t*33;
+		ModelMatrixName[17][3]:=t*20;
+		ModelMatrixName[3][17]:=t*20;
+		ModelMatrixName[17][5]:=t*5;
+		ModelMatrixName[5][17]:=t*5;
+		ModelMatrixName[17][7]:=t*2220;
+		ModelMatrixName[7][17]:=t*2220;
+		ModelMatrixName[17][9]:=t*100;
+		ModelMatrixName[9][17]:=t*100;
+		ModelMatrixName[17][10]:=t*832;
+		ModelMatrixName[10][17]:=t*832;
+		ModelMatrixName[17][4]:=t*6;
+		ModelMatrixName[4][17]:=t*6;
+		ModelMatrixName[17][16]:=t*237;
+		ModelMatrixName[16][17]:=t*237;
+
+	}
+	return 1;
+}
+
+HarvestFrequencies (vectorOfFrequencies,filteredData,1,1,0);
+
+mtMAMMatrixF = 0;
+
+MULTIPLY_BY_FREQS = PopulateModelMatrix ("mtMAMMatrixF",vectorOfFrequencies);
+
+Model mtMAMModelF = (mtMAMMatrixF, vectorOfFrequencies, MULTIPLY_BY_FREQS);
+
+FREQUENCY_SENSITIVE = 1;
diff --git a/res/TemplateBatchFiles/TemplateModels/mtREV.mdl b/res/TemplateBatchFiles/TemplateModels/mtREV.mdl
new file mode 100644
index 0000000..211dd6f
--- /dev/null
+++ b/res/TemplateBatchFiles/TemplateModels/mtREV.mdl
@@ -0,0 +1,83 @@
+NICETY_LEVEL = 2;
+
+#include "modelParameters2.mdl";
+
+aaNames = {{"Alanine",
+"Cysteine",
+"Aspartic_Acid",
+"Glutamic_Acid",
+"Phenylalanine",
+"Glycine",
+"Histidine",
+"Isoleucine",
+"Lysine",
+"Leucine",
+"Methionine",
+"Asparagine",
+"Proline",
+"Glutamine",
+"Arginine",
+"Serine",
+"Threonine",
+"Valine",
+"Tryptophan",
+"Tyrosine"}};
+
+
+if (!SKIP_MODEL_PARAMETER_LIST)
+{
+	if (modelType == 1)
+	{
+		#include "defineGamma.mdl";
+	}
+	if (modelType == 2)
+	{
+		#include "defineHM.mdl";
+	}
+}
+
+function PopulateModelMatrix (ModelMatrixName&, EFV)
+{
+
+	ModelMatrixName = {20,20};
+	if (categoriesUsed)
+	{
+		for (k=0; k<19; k=k+1)
+		{
+			for (k2 = k+1; k2 < 20; k2=k2+1)
+			{
+				subString = aaNames[k]+aaNames[k2];
+				ExecuteCommands("global "+subString +"=1; ModelMatrixName[k][k2]:= c*t*"+subString+
+								";ModelMatrixName[k2][k]:= c*t*"+subString+";");
+			}
+		}       
+	}
+	else
+	{
+		for (k=0; k<19; k=k+1)
+		{
+			for (k2 = k+1; k2 < 20; k2=k2+1)
+			{
+				subString = aaNames[k]+aaNames[k2];
+				ExecuteCommands("global "+subString +"=1; ModelMatrixName[k][k2]:= t*"+subString+
+								";ModelMatrixName[k2][k]:= t*"+subString+";");
+			}
+		}       
+	}
+	
+	subString = aaNames[7]+aaNames[9];
+	ExecuteCommands(subString +":=1;");
+	return 1;
+}
+
+
+
+mtREVMatrix = 0;
+
+HarvestFrequencies (vectorOfFrequencies,filteredData,1,1,0);
+
+MULTIPLY_BY_FREQS = PopulateModelMatrix ("mtREVMatrix",equalFreqs);
+
+Model mtREVModel = (mtREVMatrix, vectorOfFrequencies, MULTIPLY_BY_FREQS);
+
+FREQUENCY_SENSITIVE = 1;
diff --git a/res/TemplateBatchFiles/TemplateModels/mtREV_24.mdl b/res/TemplateBatchFiles/TemplateModels/mtREV_24.mdl
new file mode 100644
index 0000000..39faa54
--- /dev/null
+++ b/res/TemplateBatchFiles/TemplateModels/mtREV_24.mdl
@@ -0,0 +1,814 @@
+#include "modelParameters2.mdl";
+
+if (!SKIP_MODEL_PARAMETER_LIST)
+{
+	if (modelType == 1)
+	{
+		#include "defineGamma.mdl";
+	}	
+	if (modelType == 2)
+	{
+		#include "defineHM.mdl";
+	}
+}
+
+function PopulateModelMatrix (ModelMatrixName&, EFV)
+{
+	ModelMatrixName = {20,20};
+	if (categoriesUsed)
+	{
+       	ModelMatrixName[14][0]:=c*t*12.2;
+	ModelMatrixName[0][14]:=c*t*12.2;
+	ModelMatrixName[11][0]:=c*t*14.1842;
+	ModelMatrixName[0][11]:=c*t*14.1842;
+	ModelMatrixName[11][14]:=c*t*6.96842;
+	ModelMatrixName[14][11]:=c*t*6.96842;
+	ModelMatrixName[2][0]:=c*t*9.3;
+	ModelMatrixName[0][2]:=c*t*9.3;
+	ModelMatrixName[2][14]:=c*t*1;
+	ModelMatrixName[14][2]:=c*t*1;
+	ModelMatrixName[2][11]:=c*t*418.095;
+	ModelMatrixName[11][2]:=c*t*418.095;
+	ModelMatrixName[1][0]:=c*t*31.5421;
+	ModelMatrixName[0][1]:=c*t*31.5421;
+	ModelMatrixName[1][14]:=c*t*54.3842;
+	ModelMatrixName[14][1]:=c*t*54.3842;
+	ModelMatrixName[1][11]:=c*t*31.0211;
+	ModelMatrixName[11][1]:=c*t*31.0211;
+	ModelMatrixName[1][2]:=c*t*1;
+	ModelMatrixName[2][1]:=c*t*1;
+	ModelMatrixName[13][0]:=c*t*1;
+	ModelMatrixName[0][13]:=c*t*1;
+	ModelMatrixName[13][14]:=c*t*116.311;
+	ModelMatrixName[14][13]:=c*t*116.311;
+	ModelMatrixName[13][11]:=c*t*91.3474;
+	ModelMatrixName[11][13]:=c*t*91.3474;
+	ModelMatrixName[13][2]:=c*t*29.0947;
+	ModelMatrixName[2][13]:=c*t*29.0947;
+	ModelMatrixName[13][1]:=c*t*39.6;
+	ModelMatrixName[1][13]:=c*t*39.6;
+	ModelMatrixName[3][0]:=c*t*5.14211;
+	ModelMatrixName[0][3]:=c*t*5.14211;
+	ModelMatrixName[3][14]:=c*t*1;
+	ModelMatrixName[14][3]:=c*t*1;
+	ModelMatrixName[3][11]:=c*t*33.1842;
+	ModelMatrixName[11][3]:=c*t*33.1842;
+	ModelMatrixName[3][2]:=c*t*307.132;
+	ModelMatrixName[2][3]:=c*t*307.132;
+	ModelMatrixName[3][1]:=c*t*1;
+	ModelMatrixName[1][3]:=c*t*1;
+	ModelMatrixName[3][13]:=c*t*165.032;
+	ModelMatrixName[13][3]:=c*t*165.032;
+	ModelMatrixName[5][0]:=c*t*63.5316;
+	ModelMatrixName[0][5]:=c*t*63.5316;
+	ModelMatrixName[5][14]:=c*t*12.1211;
+	ModelMatrixName[14][5]:=c*t*12.1211;
+	ModelMatrixName[5][11]:=c*t*28.0526;
+	ModelMatrixName[11][5]:=c*t*28.0526;
+	ModelMatrixName[5][2]:=c*t*29.8789;
+	ModelMatrixName[2][5]:=c*t*29.8789;
+	ModelMatrixName[5][1]:=c*t*16.1632;
+	ModelMatrixName[1][5]:=c*t*16.1632;
+	ModelMatrixName[5][13]:=c*t*3.55263;
+	ModelMatrixName[13][5]:=c*t*3.55263;
+	ModelMatrixName[5][3]:=c*t*14.8842;
+	ModelMatrixName[3][5]:=c*t*14.8842;
+	ModelMatrixName[6][0]:=c*t*7.31579;
+	ModelMatrixName[0][6]:=c*t*7.31579;
+	ModelMatrixName[6][14]:=c*t*86.9632;
+	ModelMatrixName[14][6]:=c*t*86.9632;
+	ModelMatrixName[6][11]:=c*t*261.121;
+	ModelMatrixName[11][6]:=c*t*261.121;
+	ModelMatrixName[6][2]:=c*t*59.9947;
+	ModelMatrixName[2][6]:=c*t*59.9947;
+	ModelMatrixName[6][1]:=c*t*74.4684;
+	ModelMatrixName[1][6]:=c*t*74.4684;
+	ModelMatrixName[6][13]:=c*t*306.526;
+	ModelMatrixName[13][6]:=c*t*306.526;
+	ModelMatrixName[6][3]:=c*t*25.8526;
+	ModelMatrixName[3][6]:=c*t*25.8526;
+	ModelMatrixName[6][5]:=c*t*1;
+	ModelMatrixName[5][6]:=c*t*1;
+	ModelMatrixName[7][0]:=c*t*50.7842;
+	ModelMatrixName[0][7]:=c*t*50.7842;
+	ModelMatrixName[7][14]:=c*t*1;
+	ModelMatrixName[14][7]:=c*t*1;
+	ModelMatrixName[7][11]:=c*t*14.2632;
+	ModelMatrixName[11][7]:=c*t*14.2632;
+	ModelMatrixName[7][2]:=c*t*2.28421;
+	ModelMatrixName[2][7]:=c*t*2.28421;
+	ModelMatrixName[7][1]:=c*t*33.0158;
+	ModelMatrixName[1][7]:=c*t*33.0158;
+	ModelMatrixName[7][13]:=c*t*4.38947;
+	ModelMatrixName[13][7]:=c*t*4.38947;
+	ModelMatrixName[7][3]:=c*t*1.74211;
+	ModelMatrixName[3][7]:=c*t*1.74211;
+	ModelMatrixName[7][5]:=c*t*3.14737;
+	ModelMatrixName[5][7]:=c*t*3.14737;
+	ModelMatrixName[7][6]:=c*t*6.45263;
+	ModelMatrixName[6][7]:=c*t*6.45263;
+	ModelMatrixName[9][0]:=c*t*13.4;
+	ModelMatrixName[0][9]:=c*t*13.4;
+	ModelMatrixName[9][14]:=c*t*8.2;
+	ModelMatrixName[14][9]:=c*t*8.2;
+	ModelMatrixName[9][11]:=c*t*7.97895;
+	ModelMatrixName[11][9]:=c*t*7.97895;
+	ModelMatrixName[9][2]:=c*t*1;
+	ModelMatrixName[2][9]:=c*t*1;
+	ModelMatrixName[9][1]:=c*t*13.5;
+	ModelMatrixName[1][9]:=c*t*13.5;
+	ModelMatrixName[9][13]:=c*t*20.8947;
+	ModelMatrixName[13][9]:=c*t*20.8947;
+	ModelMatrixName[9][3]:=c*t*1;
+	ModelMatrixName[3][9]:=c*t*1;
+	ModelMatrixName[9][5]:=c*t*1.26842;
+	ModelMatrixName[5][9]:=c*t*1.26842;
+	ModelMatrixName[9][6]:=c*t*6.04737;
+	ModelMatrixName[6][9]:=c*t*6.04737;
+	ModelMatrixName[9][7]:=c*t*173.205;
+	ModelMatrixName[7][9]:=c*t*173.205;
+	ModelMatrixName[8][0]:=c*t*4.4;
+	ModelMatrixName[0][8]:=c*t*4.4;
+	ModelMatrixName[8][14]:=c*t*74.4211;
+	ModelMatrixName[14][8]:=c*t*74.4211;
+	ModelMatrixName[8][11]:=c*t*320.368;
+	ModelMatrixName[11][8]:=c*t*320.368;
+	ModelMatrixName[8][2]:=c*t*1.21579;
+	ModelMatrixName[2][8]:=c*t*1.21579;
+	ModelMatrixName[8][1]:=c*t*1;
+	ModelMatrixName[1][8]:=c*t*1;
+	ModelMatrixName[8][13]:=c*t*245.042;
+	ModelMatrixName[13][8]:=c*t*245.042;
+	ModelMatrixName[8][3]:=c*t*165.189;
+	ModelMatrixName[3][8]:=c*t*165.189;
+	ModelMatrixName[8][5]:=c*t*11.9632;
+	ModelMatrixName[5][8]:=c*t*11.9632;
+	ModelMatrixName[8][6]:=c*t*67.1947;
+	ModelMatrixName[6][8]:=c*t*67.1947;
+	ModelMatrixName[8][7]:=c*t*10.3;
+	ModelMatrixName[7][8]:=c*t*10.3;
+	ModelMatrixName[8][9]:=c*t*7.83158;
+	ModelMatrixName[9][8]:=c*t*7.83158;
+	ModelMatrixName[10][0]:=c*t*74.6737;
+	ModelMatrixName[0][10]:=c*t*74.6737;
+	ModelMatrixName[10][14]:=c*t*1;
+	ModelMatrixName[14][10]:=c*t*1;
+	ModelMatrixName[10][11]:=c*t*34.4263;
+	ModelMatrixName[11][10]:=c*t*34.4263;
+	ModelMatrixName[10][2]:=c*t*1;
+	ModelMatrixName[2][10]:=c*t*1;
+	ModelMatrixName[10][1]:=c*t*3.25263;
+	ModelMatrixName[1][10]:=c*t*3.25263;
+	ModelMatrixName[10][13]:=c*t*24.9316;
+	ModelMatrixName[13][10]:=c*t*24.9316;
+	ModelMatrixName[10][3]:=c*t*1;
+	ModelMatrixName[3][10]:=c*t*1;
+	ModelMatrixName[10][5]:=c*t*1;
+	ModelMatrixName[5][10]:=c*t*1;
+	ModelMatrixName[10][6]:=c*t*6.3;
+	ModelMatrixName[6][10]:=c*t*6.3;
+	ModelMatrixName[10][7]:=c*t*272.621;
+	ModelMatrixName[7][10]:=c*t*272.621;
+	ModelMatrixName[10][9]:=c*t*282.911;
+	ModelMatrixName[9][10]:=c*t*282.911;
+	ModelMatrixName[10][8]:=c*t*48.0895;
+	ModelMatrixName[8][10]:=c*t*48.0895;
+	ModelMatrixName[4][0]:=c*t*3.35263;
+	ModelMatrixName[0][4]:=c*t*3.35263;
+	ModelMatrixName[4][14]:=c*t*2.46842;
+	ModelMatrixName[14][4]:=c*t*2.46842;
+	ModelMatrixName[4][11]:=c*t*8;
+	ModelMatrixName[11][4]:=c*t*8;
+	ModelMatrixName[4][2]:=c*t*2.62105;
+	ModelMatrixName[2][4]:=c*t*2.62105;
+	ModelMatrixName[4][1]:=c*t*37.2632;
+	ModelMatrixName[1][4]:=c*t*37.2632;
+	ModelMatrixName[4][13]:=c*t*10.0579;
+	ModelMatrixName[13][4]:=c*t*10.0579;
+	ModelMatrixName[4][3]:=c*t*1.40526;
+	ModelMatrixName[3][4]:=c*t*1.40526;
+	ModelMatrixName[4][5]:=c*t*1;
+	ModelMatrixName[5][4]:=c*t*1;
+	ModelMatrixName[4][6]:=c*t*25.3474;
+	ModelMatrixName[6][4]:=c*t*25.3474;
+	ModelMatrixName[4][7]:=c*t*44.5632;
+	ModelMatrixName[7][4]:=c*t*44.5632;
+	ModelMatrixName[4][9]:=c*t*113.716;
+	ModelMatrixName[9][4]:=c*t*113.716;
+	ModelMatrixName[4][8]:=c*t*3.38947;
+	ModelMatrixName[8][4]:=c*t*3.38947;
+	ModelMatrixName[4][10]:=c*t*47.8;
+	ModelMatrixName[10][4]:=c*t*47.8;
+	ModelMatrixName[12][0]:=c*t*28.5842;
+	ModelMatrixName[0][12]:=c*t*28.5842;
+	ModelMatrixName[12][14]:=c*t*12.4421;
+	ModelMatrixName[14][12]:=c*t*12.4421;
+	ModelMatrixName[12][11]:=c*t*38.5842;
+	ModelMatrixName[11][12]:=c*t*38.5842;
+	ModelMatrixName[12][2]:=c*t*7.06842;
+	ModelMatrixName[2][12]:=c*t*7.06842;
+	ModelMatrixName[12][1]:=c*t*16.4526;
+	ModelMatrixName[1][12]:=c*t*16.4526;
+	ModelMatrixName[12][13]:=c*t*72.2579;
+	ModelMatrixName[13][12]:=c*t*72.2579;
+	ModelMatrixName[12][3]:=c*t*6.75263;
+	ModelMatrixName[3][12]:=c*t*6.75263;
+	ModelMatrixName[12][5]:=c*t*1;
+	ModelMatrixName[5][12]:=c*t*1;
+	ModelMatrixName[12][6]:=c*t*32.0895;
+	ModelMatrixName[6][12]:=c*t*32.0895;
+	ModelMatrixName[12][7]:=c*t*10.8579;
+	ModelMatrixName[7][12]:=c*t*10.8579;
+	ModelMatrixName[12][9]:=c*t*21.1053;
+	ModelMatrixName[9][12]:=c*t*21.1053;
+	ModelMatrixName[12][8]:=c*t*26.3684;
+	ModelMatrixName[8][12]:=c*t*26.3684;
+	ModelMatrixName[12][10]:=c*t*9.91579;
+	ModelMatrixName[10][12]:=c*t*9.91579;
+	ModelMatrixName[12][4]:=c*t*9.11053;
+	ModelMatrixName[4][12]:=c*t*9.11053;
+	ModelMatrixName[15][0]:=c*t*204.137;
+	ModelMatrixName[0][15]:=c*t*204.137;
+	ModelMatrixName[15][14]:=c*t*3.17895;
+	ModelMatrixName[14][15]:=c*t*3.17895;
+	ModelMatrixName[15][11]:=c*t*260.205;
+	ModelMatrixName[11][15]:=c*t*260.205;
+	ModelMatrixName[15][2]:=c*t*36.3263;
+	ModelMatrixName[2][15]:=c*t*36.3263;
+	ModelMatrixName[15][1]:=c*t*145.816;
+	ModelMatrixName[1][15]:=c*t*145.816;
+	ModelMatrixName[15][13]:=c*t*28.4789;
+	ModelMatrixName[13][15]:=c*t*28.4789;
+	ModelMatrixName[15][3]:=c*t*28.7947;
+	ModelMatrixName[3][15]:=c*t*28.7947;
+	ModelMatrixName[15][5]:=c*t*66.2789;
+	ModelMatrixName[5][15]:=c*t*66.2789;
+	ModelMatrixName[15][6]:=c*t*40.7684;
+	ModelMatrixName[6][15]:=c*t*40.7684;
+	ModelMatrixName[15][7]:=c*t*25.1053;
+	ModelMatrixName[7][15]:=c*t*25.1053;
+	ModelMatrixName[15][9]:=c*t*38.7421;
+	ModelMatrixName[9][15]:=c*t*38.7421;
+	ModelMatrixName[15][8]:=c*t*55.6789;
+	ModelMatrixName[8][15]:=c*t*55.6789;
+	ModelMatrixName[15][10]:=c*t*58.5053;
+	ModelMatrixName[10][15]:=c*t*58.5053;
+	ModelMatrixName[15][4]:=c*t*33.8368;
+	ModelMatrixName[4][15]:=c*t*33.8368;
+	ModelMatrixName[15][12]:=c*t*89.4211;
+	ModelMatrixName[12][15]:=c*t*89.4211;
+	ModelMatrixName[16][0]:=c*t*253.011;
+	ModelMatrixName[0][16]:=c*t*253.011;
+	ModelMatrixName[16][14]:=c*t*1.09474;
+	ModelMatrixName[14][16]:=c*t*1.09474;
+	ModelMatrixName[16][11]:=c*t*125.505;
+	ModelMatrixName[11][16]:=c*t*125.505;
+	ModelMatrixName[16][2]:=c*t*14.7421;
+	ModelMatrixName[2][16]:=c*t*14.7421;
+	ModelMatrixName[16][1]:=c*t*94.7211;
+	ModelMatrixName[1][16]:=c*t*94.7211;
+	ModelMatrixName[16][13]:=c*t*49.9632;
+	ModelMatrixName[13][16]:=c*t*49.9632;
+	ModelMatrixName[16][3]:=c*t*7.8;
+	ModelMatrixName[3][16]:=c*t*7.8;
+	ModelMatrixName[16][5]:=c*t*5.87895;
+	ModelMatrixName[5][16]:=c*t*5.87895;
+	ModelMatrixName[16][6]:=c*t*23.5684;
+	ModelMatrixName[6][16]:=c*t*23.5684;
+	ModelMatrixName[16][7]:=c*t*193.911;
+	ModelMatrixName[7][16]:=c*t*193.911;
+	ModelMatrixName[16][9]:=c*t*66.5263;
+	ModelMatrixName[9][16]:=c*t*66.5263;
+	ModelMatrixName[16][8]:=c*t*71.7526;
+	ModelMatrixName[8][16]:=c*t*71.7526;
+	ModelMatrixName[16][10]:=c*t*277.984;
+	ModelMatrixName[10][16]:=c*t*277.984;
+	ModelMatrixName[16][4]:=c*t*17.8158;
+	ModelMatrixName[4][16]:=c*t*17.8158;
+	ModelMatrixName[16][12]:=c*t*67.4842;
+	ModelMatrixName[12][16]:=c*t*67.4842;
+	ModelMatrixName[16][15]:=c*t*314.321;
+	ModelMatrixName[15][16]:=c*t*314.321;
+	ModelMatrixName[18][0]:=c*t*1;
+	ModelMatrixName[0][18]:=c*t*1;
+	ModelMatrixName[18][14]:=c*t*11.5526;
+	ModelMatrixName[14][18]:=c*t*11.5526;
+	ModelMatrixName[18][11]:=c*t*5.62105;
+	ModelMatrixName[11][18]:=c*t*5.62105;
+	ModelMatrixName[18][2]:=c*t*10.4526;
+	ModelMatrixName[2][18]:=c*t*10.4526;
+	ModelMatrixName[18][1]:=c*t*17.6842;
+	ModelMatrixName[1][18]:=c*t*17.6842;
+	ModelMatrixName[18][13]:=c*t*1;
+	ModelMatrixName[13][18]:=c*t*1;
+	ModelMatrixName[18][3]:=c*t*1;
+	ModelMatrixName[3][18]:=c*t*1;
+	ModelMatrixName[18][5]:=c*t*5.74737;
+	ModelMatrixName[5][18]:=c*t*5.74737;
+	ModelMatrixName[18][6]:=c*t*3.72632;
+	ModelMatrixName[6][18]:=c*t*3.72632;
+	ModelMatrixName[18][7]:=c*t*1;
+	ModelMatrixName[7][18]:=c*t*1;
+	ModelMatrixName[18][9]:=c*t*17.0737;
+	ModelMatrixName[9][18]:=c*t*17.0737;
+	ModelMatrixName[18][8]:=c*t*12.6316;
+	ModelMatrixName[8][18]:=c*t*12.6316;
+	ModelMatrixName[18][10]:=c*t*11.4263;
+	ModelMatrixName[10][18]:=c*t*11.4263;
+	ModelMatrixName[18][4]:=c*t*4.12632;
+	ModelMatrixName[4][18]:=c*t*4.12632;
+	ModelMatrixName[18][12]:=c*t*2.21579;
+	ModelMatrixName[12][18]:=c*t*2.21579;
+	ModelMatrixName[18][15]:=c*t*20.3053;
+	ModelMatrixName[15][18]:=c*t*20.3053;
+	ModelMatrixName[18][16]:=c*t*5.25789;
+	ModelMatrixName[16][18]:=c*t*5.25789;
+	ModelMatrixName[19][0]:=c*t*3.41053;
+	ModelMatrixName[0][19]:=c*t*3.41053;
+	ModelMatrixName[19][14]:=c*t*1;
+	ModelMatrixName[14][19]:=c*t*1;
+	ModelMatrixName[19][11]:=c*t*100.716;
+	ModelMatrixName[11][19]:=c*t*100.716;
+	ModelMatrixName[19][2]:=c*t*11.1632;
+	ModelMatrixName[2][19]:=c*t*11.1632;
+	ModelMatrixName[19][1]:=c*t*134.089;
+	ModelMatrixName[1][19]:=c*t*134.089;
+	ModelMatrixName[19][13]:=c*t*20.4316;
+	ModelMatrixName[13][19]:=c*t*20.4316;
+	ModelMatrixName[19][3]:=c*t*6.90526;
+	ModelMatrixName[3][19]:=c*t*6.90526;
+	ModelMatrixName[19][5]:=c*t*1.68947;
+	ModelMatrixName[5][19]:=c*t*1.68947;
+	ModelMatrixName[19][6]:=c*t*352.705;
+	ModelMatrixName[6][19]:=c*t*352.705;
+	ModelMatrixName[19][7]:=c*t*13.1632;
+	ModelMatrixName[7][19]:=c*t*13.1632;
+	ModelMatrixName[19][9]:=c*t*23.2368;
+	ModelMatrixName[9][19]:=c*t*23.2368;
+	ModelMatrixName[19][8]:=c*t*26.9316;
+	ModelMatrixName[8][19]:=c*t*26.9316;
+	ModelMatrixName[19][10]:=c*t*21.0316;
+	ModelMatrixName[10][19]:=c*t*21.0316;
+	ModelMatrixName[19][4]:=c*t*245.042;
+	ModelMatrixName[4][19]:=c*t*245.042;
+	ModelMatrixName[19][12]:=c*t*8.53158;
+	ModelMatrixName[12][19]:=c*t*8.53158;
+	ModelMatrixName[19][15]:=c*t*34.1684;
+	ModelMatrixName[15][19]:=c*t*34.1684;
+	ModelMatrixName[19][16]:=c*t*20.3842;
+	ModelMatrixName[16][19]:=c*t*20.3842;
+	ModelMatrixName[19][18]:=c*t*13.8158;
+	ModelMatrixName[18][19]:=c*t*13.8158;
+	ModelMatrixName[17][0]:=c*t*102.663;
+	ModelMatrixName[0][17]:=c*t*102.663;
+	ModelMatrixName[17][14]:=c*t*4.02105;
+	ModelMatrixName[14][17]:=c*t*4.02105;
+	ModelMatrixName[17][11]:=c*t*1;
+	ModelMatrixName[11][17]:=c*t*1;
+	ModelMatrixName[17][2]:=c*t*1;
+	ModelMatrixName[2][17]:=c*t*1;
+	ModelMatrixName[17][1]:=c*t*1;
+	ModelMatrixName[1][17]:=c*t*1;
+	ModelMatrixName[17][13]:=c*t*10;
+	ModelMatrixName[13][17]:=c*t*10;
+	ModelMatrixName[17][3]:=c*t*11.1263;
+	ModelMatrixName[3][17]:=c*t*11.1263;
+	ModelMatrixName[17][5]:=c*t*1.33158;
+	ModelMatrixName[5][17]:=c*t*1.33158;
+	ModelMatrixName[17][6]:=c*t*1;
+	ModelMatrixName[6][17]:=c*t*1;
+	ModelMatrixName[17][7]:=c*t*643.653;
+	ModelMatrixName[7][17]:=c*t*643.653;
+	ModelMatrixName[17][9]:=c*t*48.2474;
+	ModelMatrixName[9][17]:=c*t*48.2474;
+	ModelMatrixName[17][8]:=c*t*1;
+	ModelMatrixName[8][17]:=c*t*1;
+	ModelMatrixName[17][10]:=c*t*203.968;
+	ModelMatrixName[10][17]:=c*t*203.968;
+	ModelMatrixName[17][4]:=c*t*3.34211;
+	ModelMatrixName[4][17]:=c*t*3.34211;
+	ModelMatrixName[17][12]:=c*t*4.33158;
+	ModelMatrixName[12][17]:=c*t*4.33158;
+	ModelMatrixName[17][15]:=c*t*1;
+	ModelMatrixName[15][17]:=c*t*1;
+	ModelMatrixName[17][16]:=c*t*107.653;
+	ModelMatrixName[16][17]:=c*t*107.653;
+	ModelMatrixName[17][18]:=c*t*2.82632;
+	ModelMatrixName[18][17]:=c*t*2.82632;
+	ModelMatrixName[17][19]:=c*t*1;
+	ModelMatrixName[19][17]:=c*t*1;
+	}
+	else
+	{
+       	ModelMatrixName[14][0]:=t*12.2;
+	ModelMatrixName[0][14]:=t*12.2;
+	ModelMatrixName[11][0]:=t*14.1842;
+	ModelMatrixName[0][11]:=t*14.1842;
+	ModelMatrixName[11][14]:=t*6.96842;
+	ModelMatrixName[14][11]:=t*6.96842;
+	ModelMatrixName[2][0]:=t*9.3;
+	ModelMatrixName[0][2]:=t*9.3;
+	ModelMatrixName[2][14]:=t*1;
+	ModelMatrixName[14][2]:=t*1;
+	ModelMatrixName[2][11]:=t*418.095;
+	ModelMatrixName[11][2]:=t*418.095;
+	ModelMatrixName[1][0]:=t*31.5421;
+	ModelMatrixName[0][1]:=t*31.5421;
+	ModelMatrixName[1][14]:=t*54.3842;
+	ModelMatrixName[14][1]:=t*54.3842;
+	ModelMatrixName[1][11]:=t*31.0211;
+	ModelMatrixName[11][1]:=t*31.0211;
+	ModelMatrixName[1][2]:=t*1;
+	ModelMatrixName[2][1]:=t*1;
+	ModelMatrixName[13][0]:=t*1;
+	ModelMatrixName[0][13]:=t*1;
+	ModelMatrixName[13][14]:=t*116.311;
+	ModelMatrixName[14][13]:=t*116.311;
+	ModelMatrixName[13][11]:=t*91.3474;
+	ModelMatrixName[11][13]:=t*91.3474;
+	ModelMatrixName[13][2]:=t*29.0947;
+	ModelMatrixName[2][13]:=t*29.0947;
+	ModelMatrixName[13][1]:=t*39.6;
+	ModelMatrixName[1][13]:=t*39.6;
+	ModelMatrixName[3][0]:=t*5.14211;
+	ModelMatrixName[0][3]:=t*5.14211;
+	ModelMatrixName[3][14]:=t*1;
+	ModelMatrixName[14][3]:=t*1;
+	ModelMatrixName[3][11]:=t*33.1842;
+	ModelMatrixName[11][3]:=t*33.1842;
+	ModelMatrixName[3][2]:=t*307.132;
+	ModelMatrixName[2][3]:=t*307.132;
+	ModelMatrixName[3][1]:=t*1;
+	ModelMatrixName[1][3]:=t*1;
+	ModelMatrixName[3][13]:=t*165.032;
+	ModelMatrixName[13][3]:=t*165.032;
+	ModelMatrixName[5][0]:=t*63.5316;
+	ModelMatrixName[0][5]:=t*63.5316;
+	ModelMatrixName[5][14]:=t*12.1211;
+	ModelMatrixName[14][5]:=t*12.1211;
+	ModelMatrixName[5][11]:=t*28.0526;
+	ModelMatrixName[11][5]:=t*28.0526;
+	ModelMatrixName[5][2]:=t*29.8789;
+	ModelMatrixName[2][5]:=t*29.8789;
+	ModelMatrixName[5][1]:=t*16.1632;
+	ModelMatrixName[1][5]:=t*16.1632;
+	ModelMatrixName[5][13]:=t*3.55263;
+	ModelMatrixName[13][5]:=t*3.55263;
+	ModelMatrixName[5][3]:=t*14.8842;
+	ModelMatrixName[3][5]:=t*14.8842;
+	ModelMatrixName[6][0]:=t*7.31579;
+	ModelMatrixName[0][6]:=t*7.31579;
+	ModelMatrixName[6][14]:=t*86.9632;
+	ModelMatrixName[14][6]:=t*86.9632;
+	ModelMatrixName[6][11]:=t*261.121;
+	ModelMatrixName[11][6]:=t*261.121;
+	ModelMatrixName[6][2]:=t*59.9947;
+	ModelMatrixName[2][6]:=t*59.9947;
+	ModelMatrixName[6][1]:=t*74.4684;
+	ModelMatrixName[1][6]:=t*74.4684;
+	ModelMatrixName[6][13]:=t*306.526;
+	ModelMatrixName[13][6]:=t*306.526;
+	ModelMatrixName[6][3]:=t*25.8526;
+	ModelMatrixName[3][6]:=t*25.8526;
+	ModelMatrixName[6][5]:=t*1;
+	ModelMatrixName[5][6]:=t*1;
+	ModelMatrixName[7][0]:=t*50.7842;
+	ModelMatrixName[0][7]:=t*50.7842;
+	ModelMatrixName[7][14]:=t*1;
+	ModelMatrixName[14][7]:=t*1;
+	ModelMatrixName[7][11]:=t*14.2632;
+	ModelMatrixName[11][7]:=t*14.2632;
+	ModelMatrixName[7][2]:=t*2.28421;
+	ModelMatrixName[2][7]:=t*2.28421;
+	ModelMatrixName[7][1]:=t*33.0158;
+	ModelMatrixName[1][7]:=t*33.0158;
+	ModelMatrixName[7][13]:=t*4.38947;
+	ModelMatrixName[13][7]:=t*4.38947;
+	ModelMatrixName[7][3]:=t*1.74211;
+	ModelMatrixName[3][7]:=t*1.74211;
+	ModelMatrixName[7][5]:=t*3.14737;
+	ModelMatrixName[5][7]:=t*3.14737;
+	ModelMatrixName[7][6]:=t*6.45263;
+	ModelMatrixName[6][7]:=t*6.45263;
+	ModelMatrixName[9][0]:=t*13.4;
+	ModelMatrixName[0][9]:=t*13.4;
+	ModelMatrixName[9][14]:=t*8.2;
+	ModelMatrixName[14][9]:=t*8.2;
+	ModelMatrixName[9][11]:=t*7.97895;
+	ModelMatrixName[11][9]:=t*7.97895;
+	ModelMatrixName[9][2]:=t*1;
+	ModelMatrixName[2][9]:=t*1;
+	ModelMatrixName[9][1]:=t*13.5;
+	ModelMatrixName[1][9]:=t*13.5;
+	ModelMatrixName[9][13]:=t*20.8947;
+	ModelMatrixName[13][9]:=t*20.8947;
+	ModelMatrixName[9][3]:=t*1;
+	ModelMatrixName[3][9]:=t*1;
+	ModelMatrixName[9][5]:=t*1.26842;
+	ModelMatrixName[5][9]:=t*1.26842;
+	ModelMatrixName[9][6]:=t*6.04737;
+	ModelMatrixName[6][9]:=t*6.04737;
+	ModelMatrixName[9][7]:=t*173.205;
+	ModelMatrixName[7][9]:=t*173.205;
+	ModelMatrixName[8][0]:=t*4.4;
+	ModelMatrixName[0][8]:=t*4.4;
+	ModelMatrixName[8][14]:=t*74.4211;
+	ModelMatrixName[14][8]:=t*74.4211;
+	ModelMatrixName[8][11]:=t*320.368;
+	ModelMatrixName[11][8]:=t*320.368;
+	ModelMatrixName[8][2]:=t*1.21579;
+	ModelMatrixName[2][8]:=t*1.21579;
+	ModelMatrixName[8][1]:=t*1;
+	ModelMatrixName[1][8]:=t*1;
+	ModelMatrixName[8][13]:=t*245.042;
+	ModelMatrixName[13][8]:=t*245.042;
+	ModelMatrixName[8][3]:=t*165.189;
+	ModelMatrixName[3][8]:=t*165.189;
+	ModelMatrixName[8][5]:=t*11.9632;
+	ModelMatrixName[5][8]:=t*11.9632;
+	ModelMatrixName[8][6]:=t*67.1947;
+	ModelMatrixName[6][8]:=t*67.1947;
+	ModelMatrixName[8][7]:=t*10.3;
+	ModelMatrixName[7][8]:=t*10.3;
+	ModelMatrixName[8][9]:=t*7.83158;
+	ModelMatrixName[9][8]:=t*7.83158;
+	ModelMatrixName[10][0]:=t*74.6737;
+	ModelMatrixName[0][10]:=t*74.6737;
+	ModelMatrixName[10][14]:=t*1;
+	ModelMatrixName[14][10]:=t*1;
+	ModelMatrixName[10][11]:=t*34.4263;
+	ModelMatrixName[11][10]:=t*34.4263;
+	ModelMatrixName[10][2]:=t*1;
+	ModelMatrixName[2][10]:=t*1;
+	ModelMatrixName[10][1]:=t*3.25263;
+	ModelMatrixName[1][10]:=t*3.25263;
+	ModelMatrixName[10][13]:=t*24.9316;
+	ModelMatrixName[13][10]:=t*24.9316;
+	ModelMatrixName[10][3]:=t*1;
+	ModelMatrixName[3][10]:=t*1;
+	ModelMatrixName[10][5]:=t*1;
+	ModelMatrixName[5][10]:=t*1;
+	ModelMatrixName[10][6]:=t*6.3;
+	ModelMatrixName[6][10]:=t*6.3;
+	ModelMatrixName[10][7]:=t*272.621;
+	ModelMatrixName[7][10]:=t*272.621;
+	ModelMatrixName[10][9]:=t*282.911;
+	ModelMatrixName[9][10]:=t*282.911;
+	ModelMatrixName[10][8]:=t*48.0895;
+	ModelMatrixName[8][10]:=t*48.0895;
+	ModelMatrixName[4][0]:=t*3.35263;
+	ModelMatrixName[0][4]:=t*3.35263;
+	ModelMatrixName[4][14]:=t*2.46842;
+	ModelMatrixName[14][4]:=t*2.46842;
+	ModelMatrixName[4][11]:=t*8;
+	ModelMatrixName[11][4]:=t*8;
+	ModelMatrixName[4][2]:=t*2.62105;
+	ModelMatrixName[2][4]:=t*2.62105;
+	ModelMatrixName[4][1]:=t*37.2632;
+	ModelMatrixName[1][4]:=t*37.2632;
+	ModelMatrixName[4][13]:=t*10.0579;
+	ModelMatrixName[13][4]:=t*10.0579;
+	ModelMatrixName[4][3]:=t*1.40526;
+	ModelMatrixName[3][4]:=t*1.40526;
+	ModelMatrixName[4][5]:=t*1;
+	ModelMatrixName[5][4]:=t*1;
+	ModelMatrixName[4][6]:=t*25.3474;
+	ModelMatrixName[6][4]:=t*25.3474;
+	ModelMatrixName[4][7]:=t*44.5632;
+	ModelMatrixName[7][4]:=t*44.5632;
+	ModelMatrixName[4][9]:=t*113.716;
+	ModelMatrixName[9][4]:=t*113.716;
+	ModelMatrixName[4][8]:=t*3.38947;
+	ModelMatrixName[8][4]:=t*3.38947;
+	ModelMatrixName[4][10]:=t*47.8;
+	ModelMatrixName[10][4]:=t*47.8;
+	ModelMatrixName[12][0]:=t*28.5842;
+	ModelMatrixName[0][12]:=t*28.5842;
+	ModelMatrixName[12][14]:=t*12.4421;
+	ModelMatrixName[14][12]:=t*12.4421;
+	ModelMatrixName[12][11]:=t*38.5842;
+	ModelMatrixName[11][12]:=t*38.5842;
+	ModelMatrixName[12][2]:=t*7.06842;
+	ModelMatrixName[2][12]:=t*7.06842;
+	ModelMatrixName[12][1]:=t*16.4526;
+	ModelMatrixName[1][12]:=t*16.4526;
+	ModelMatrixName[12][13]:=t*72.2579;
+	ModelMatrixName[13][12]:=t*72.2579;
+	ModelMatrixName[12][3]:=t*6.75263;
+	ModelMatrixName[3][12]:=t*6.75263;
+	ModelMatrixName[12][5]:=t*1;
+	ModelMatrixName[5][12]:=t*1;
+	ModelMatrixName[12][6]:=t*32.0895;
+	ModelMatrixName[6][12]:=t*32.0895;
+	ModelMatrixName[12][7]:=t*10.8579;
+	ModelMatrixName[7][12]:=t*10.8579;
+	ModelMatrixName[12][9]:=t*21.1053;
+	ModelMatrixName[9][12]:=t*21.1053;
+	ModelMatrixName[12][8]:=t*26.3684;
+	ModelMatrixName[8][12]:=t*26.3684;
+	ModelMatrixName[12][10]:=t*9.91579;
+	ModelMatrixName[10][12]:=t*9.91579;
+	ModelMatrixName[12][4]:=t*9.11053;
+	ModelMatrixName[4][12]:=t*9.11053;
+	ModelMatrixName[15][0]:=t*204.137;
+	ModelMatrixName[0][15]:=t*204.137;
+	ModelMatrixName[15][14]:=t*3.17895;
+	ModelMatrixName[14][15]:=t*3.17895;
+	ModelMatrixName[15][11]:=t*260.205;
+	ModelMatrixName[11][15]:=t*260.205;
+	ModelMatrixName[15][2]:=t*36.3263;
+	ModelMatrixName[2][15]:=t*36.3263;
+	ModelMatrixName[15][1]:=t*145.816;
+	ModelMatrixName[1][15]:=t*145.816;
+	ModelMatrixName[15][13]:=t*28.4789;
+	ModelMatrixName[13][15]:=t*28.4789;
+	ModelMatrixName[15][3]:=t*28.7947;
+	ModelMatrixName[3][15]:=t*28.7947;
+	ModelMatrixName[15][5]:=t*66.2789;
+	ModelMatrixName[5][15]:=t*66.2789;
+	ModelMatrixName[15][6]:=t*40.7684;
+	ModelMatrixName[6][15]:=t*40.7684;
+	ModelMatrixName[15][7]:=t*25.1053;
+	ModelMatrixName[7][15]:=t*25.1053;
+	ModelMatrixName[15][9]:=t*38.7421;
+	ModelMatrixName[9][15]:=t*38.7421;
+	ModelMatrixName[15][8]:=t*55.6789;
+	ModelMatrixName[8][15]:=t*55.6789;
+	ModelMatrixName[15][10]:=t*58.5053;
+	ModelMatrixName[10][15]:=t*58.5053;
+	ModelMatrixName[15][4]:=t*33.8368;
+	ModelMatrixName[4][15]:=t*33.8368;
+	ModelMatrixName[15][12]:=t*89.4211;
+	ModelMatrixName[12][15]:=t*89.4211;
+	ModelMatrixName[16][0]:=t*253.011;
+	ModelMatrixName[0][16]:=t*253.011;
+	ModelMatrixName[16][14]:=t*1.09474;
+	ModelMatrixName[14][16]:=t*1.09474;
+	ModelMatrixName[16][11]:=t*125.505;
+	ModelMatrixName[11][16]:=t*125.505;
+	ModelMatrixName[16][2]:=t*14.7421;
+	ModelMatrixName[2][16]:=t*14.7421;
+	ModelMatrixName[16][1]:=t*94.7211;
+	ModelMatrixName[1][16]:=t*94.7211;
+	ModelMatrixName[16][13]:=t*49.9632;
+	ModelMatrixName[13][16]:=t*49.9632;
+	ModelMatrixName[16][3]:=t*7.8;
+	ModelMatrixName[3][16]:=t*7.8;
+	ModelMatrixName[16][5]:=t*5.87895;
+	ModelMatrixName[5][16]:=t*5.87895;
+	ModelMatrixName[16][6]:=t*23.5684;
+	ModelMatrixName[6][16]:=t*23.5684;
+	ModelMatrixName[16][7]:=t*193.911;
+	ModelMatrixName[7][16]:=t*193.911;
+	ModelMatrixName[16][9]:=t*66.5263;
+	ModelMatrixName[9][16]:=t*66.5263;
+	ModelMatrixName[16][8]:=t*71.7526;
+	ModelMatrixName[8][16]:=t*71.7526;
+	ModelMatrixName[16][10]:=t*277.984;
+	ModelMatrixName[10][16]:=t*277.984;
+	ModelMatrixName[16][4]:=t*17.8158;
+	ModelMatrixName[4][16]:=t*17.8158;
+	ModelMatrixName[16][12]:=t*67.4842;
+	ModelMatrixName[12][16]:=t*67.4842;
+	ModelMatrixName[16][15]:=t*314.321;
+	ModelMatrixName[15][16]:=t*314.321;
+	ModelMatrixName[18][0]:=t*1;
+	ModelMatrixName[0][18]:=t*1;
+	ModelMatrixName[18][14]:=t*11.5526;
+	ModelMatrixName[14][18]:=t*11.5526;
+	ModelMatrixName[18][11]:=t*5.62105;
+	ModelMatrixName[11][18]:=t*5.62105;
+	ModelMatrixName[18][2]:=t*10.4526;
+	ModelMatrixName[2][18]:=t*10.4526;
+	ModelMatrixName[18][1]:=t*17.6842;
+	ModelMatrixName[1][18]:=t*17.6842;
+	ModelMatrixName[18][13]:=t*1;
+	ModelMatrixName[13][18]:=t*1;
+	ModelMatrixName[18][3]:=t*1;
+	ModelMatrixName[3][18]:=t*1;
+	ModelMatrixName[18][5]:=t*5.74737;
+	ModelMatrixName[5][18]:=t*5.74737;
+	ModelMatrixName[18][6]:=t*3.72632;
+	ModelMatrixName[6][18]:=t*3.72632;
+	ModelMatrixName[18][7]:=t*1;
+	ModelMatrixName[7][18]:=t*1;
+	ModelMatrixName[18][9]:=t*17.0737;
+	ModelMatrixName[9][18]:=t*17.0737;
+	ModelMatrixName[18][8]:=t*12.6316;
+	ModelMatrixName[8][18]:=t*12.6316;
+	ModelMatrixName[18][10]:=t*11.4263;
+	ModelMatrixName[10][18]:=t*11.4263;
+	ModelMatrixName[18][4]:=t*4.12632;
+	ModelMatrixName[4][18]:=t*4.12632;
+	ModelMatrixName[18][12]:=t*2.21579;
+	ModelMatrixName[12][18]:=t*2.21579;
+	ModelMatrixName[18][15]:=t*20.3053;
+	ModelMatrixName[15][18]:=t*20.3053;
+	ModelMatrixName[18][16]:=t*5.25789;
+	ModelMatrixName[16][18]:=t*5.25789;
+	ModelMatrixName[19][0]:=t*3.41053;
+	ModelMatrixName[0][19]:=t*3.41053;
+	ModelMatrixName[19][14]:=t*1;
+	ModelMatrixName[14][19]:=t*1;
+	ModelMatrixName[19][11]:=t*100.716;
+	ModelMatrixName[11][19]:=t*100.716;
+	ModelMatrixName[19][2]:=t*11.1632;
+	ModelMatrixName[2][19]:=t*11.1632;
+	ModelMatrixName[19][1]:=t*134.089;
+	ModelMatrixName[1][19]:=t*134.089;
+	ModelMatrixName[19][13]:=t*20.4316;
+	ModelMatrixName[13][19]:=t*20.4316;
+	ModelMatrixName[19][3]:=t*6.90526;
+	ModelMatrixName[3][19]:=t*6.90526;
+	ModelMatrixName[19][5]:=t*1.68947;
+	ModelMatrixName[5][19]:=t*1.68947;
+	ModelMatrixName[19][6]:=t*352.705;
+	ModelMatrixName[6][19]:=t*352.705;
+	ModelMatrixName[19][7]:=t*13.1632;
+	ModelMatrixName[7][19]:=t*13.1632;
+	ModelMatrixName[19][9]:=t*23.2368;
+	ModelMatrixName[9][19]:=t*23.2368;
+	ModelMatrixName[19][8]:=t*26.9316;
+	ModelMatrixName[8][19]:=t*26.9316;
+	ModelMatrixName[19][10]:=t*21.0316;
+	ModelMatrixName[10][19]:=t*21.0316;
+	ModelMatrixName[19][4]:=t*245.042;
+	ModelMatrixName[4][19]:=t*245.042;
+	ModelMatrixName[19][12]:=t*8.53158;
+	ModelMatrixName[12][19]:=t*8.53158;
+	ModelMatrixName[19][15]:=t*34.1684;
+	ModelMatrixName[15][19]:=t*34.1684;
+	ModelMatrixName[19][16]:=t*20.3842;
+	ModelMatrixName[16][19]:=t*20.3842;
+	ModelMatrixName[19][18]:=t*13.8158;
+	ModelMatrixName[18][19]:=t*13.8158;
+	ModelMatrixName[17][0]:=t*102.663;
+	ModelMatrixName[0][17]:=t*102.663;
+	ModelMatrixName[17][14]:=t*4.02105;
+	ModelMatrixName[14][17]:=t*4.02105;
+	ModelMatrixName[17][11]:=t*1;
+	ModelMatrixName[11][17]:=t*1;
+	ModelMatrixName[17][2]:=t*1;
+	ModelMatrixName[2][17]:=t*1;
+	ModelMatrixName[17][1]:=t*1;
+	ModelMatrixName[1][17]:=t*1;
+	ModelMatrixName[17][13]:=t*10;
+	ModelMatrixName[13][17]:=t*10;
+	ModelMatrixName[17][3]:=t*11.1263;
+	ModelMatrixName[3][17]:=t*11.1263;
+	ModelMatrixName[17][5]:=t*1.33158;
+	ModelMatrixName[5][17]:=t*1.33158;
+	ModelMatrixName[17][6]:=t*1;
+	ModelMatrixName[6][17]:=t*1;
+	ModelMatrixName[17][7]:=t*643.653;
+	ModelMatrixName[7][17]:=t*643.653;
+	ModelMatrixName[17][9]:=t*48.2474;
+	ModelMatrixName[9][17]:=t*48.2474;
+	ModelMatrixName[17][8]:=t*1;
+	ModelMatrixName[8][17]:=t*1;
+	ModelMatrixName[17][10]:=t*203.968;
+	ModelMatrixName[10][17]:=t*203.968;
+	ModelMatrixName[17][4]:=t*3.34211;
+	ModelMatrixName[4][17]:=t*3.34211;
+	ModelMatrixName[17][12]:=t*4.33158;
+	ModelMatrixName[12][17]:=t*4.33158;
+	ModelMatrixName[17][15]:=t*1;
+	ModelMatrixName[15][17]:=t*1;
+	ModelMatrixName[17][16]:=t*107.653;
+	ModelMatrixName[16][17]:=t*107.653;
+	ModelMatrixName[17][18]:=t*2.82632;
+	ModelMatrixName[18][17]:=t*2.82632;
+	ModelMatrixName[17][19]:=t*1;
+	ModelMatrixName[19][17]:=t*1;
+
+	}
+	return 1;
+}
+
+equalFreqs={20,1};
+
+equalFreqs[0]=0.072;
+equalFreqs[14]=0.019;
+equalFreqs[11]=0.039;
+equalFreqs[2]=0.019;
+equalFreqs[1]=0.006;
+equalFreqs[13]=0.025;
+equalFreqs[3]=0.024;
+equalFreqs[5]=0.056;
+equalFreqs[6]=0.028;
+equalFreqs[7]=0.088;
+equalFreqs[9]=0.169;
+equalFreqs[8]=0.023;
+equalFreqs[10]=0.054;
+equalFreqs[4]=0.061;
+equalFreqs[12]=0.054;
+equalFreqs[15]=0.072;
+equalFreqs[16]=0.086;
+equalFreqs[18]=0.029;
+equalFreqs[19]=0.033;
+equalFreqs[17]=0.043;
+
+mtREV_24Matrix = 0;
+MULTIPLY_BY_FREQS = PopulateModelMatrix ("mtREV_24Matrix",equalFreqs);
+Model mtREV_24Model = (mtREV_24Matrix, equalFreqs, MULTIPLY_BY_FREQS);
+FREQUENCY_SENSITIVE = 0;
diff --git a/res/TemplateBatchFiles/TemplateModels/mtREV_24_F.mdl b/res/TemplateBatchFiles/TemplateModels/mtREV_24_F.mdl
new file mode 100644
index 0000000..272423c
--- /dev/null
+++ b/res/TemplateBatchFiles/TemplateModels/mtREV_24_F.mdl
@@ -0,0 +1,793 @@
+#include "modelParameters2.mdl";
+
+if (!SKIP_MODEL_PARAMETER_LIST)
+{
+	if (modelType == 1)
+	{
+		#include "defineGamma.mdl";
+	}	
+	if (modelType == 2)
+	{
+		#include "defineHM.mdl";
+	}
+}
+
+function PopulateModelMatrix (ModelMatrixName&, EFV)
+{
+	ModelMatrixName = {20,20};
+	if (categoriesUsed)
+	{
+       	ModelMatrixName[14][0]:=c*t*12.2;
+	ModelMatrixName[0][14]:=c*t*12.2;
+	ModelMatrixName[11][0]:=c*t*14.1842;
+	ModelMatrixName[0][11]:=c*t*14.1842;
+	ModelMatrixName[11][14]:=c*t*6.96842;
+	ModelMatrixName[14][11]:=c*t*6.96842;
+	ModelMatrixName[2][0]:=c*t*9.3;
+	ModelMatrixName[0][2]:=c*t*9.3;
+	ModelMatrixName[2][14]:=c*t*1;
+	ModelMatrixName[14][2]:=c*t*1;
+	ModelMatrixName[2][11]:=c*t*418.095;
+	ModelMatrixName[11][2]:=c*t*418.095;
+	ModelMatrixName[1][0]:=c*t*31.5421;
+	ModelMatrixName[0][1]:=c*t*31.5421;
+	ModelMatrixName[1][14]:=c*t*54.3842;
+	ModelMatrixName[14][1]:=c*t*54.3842;
+	ModelMatrixName[1][11]:=c*t*31.0211;
+	ModelMatrixName[11][1]:=c*t*31.0211;
+	ModelMatrixName[1][2]:=c*t*1;
+	ModelMatrixName[2][1]:=c*t*1;
+	ModelMatrixName[13][0]:=c*t*1;
+	ModelMatrixName[0][13]:=c*t*1;
+	ModelMatrixName[13][14]:=c*t*116.311;
+	ModelMatrixName[14][13]:=c*t*116.311;
+	ModelMatrixName[13][11]:=c*t*91.3474;
+	ModelMatrixName[11][13]:=c*t*91.3474;
+	ModelMatrixName[13][2]:=c*t*29.0947;
+	ModelMatrixName[2][13]:=c*t*29.0947;
+	ModelMatrixName[13][1]:=c*t*39.6;
+	ModelMatrixName[1][13]:=c*t*39.6;
+	ModelMatrixName[3][0]:=c*t*5.14211;
+	ModelMatrixName[0][3]:=c*t*5.14211;
+	ModelMatrixName[3][14]:=c*t*1;
+	ModelMatrixName[14][3]:=c*t*1;
+	ModelMatrixName[3][11]:=c*t*33.1842;
+	ModelMatrixName[11][3]:=c*t*33.1842;
+	ModelMatrixName[3][2]:=c*t*307.132;
+	ModelMatrixName[2][3]:=c*t*307.132;
+	ModelMatrixName[3][1]:=c*t*1;
+	ModelMatrixName[1][3]:=c*t*1;
+	ModelMatrixName[3][13]:=c*t*165.032;
+	ModelMatrixName[13][3]:=c*t*165.032;
+	ModelMatrixName[5][0]:=c*t*63.5316;
+	ModelMatrixName[0][5]:=c*t*63.5316;
+	ModelMatrixName[5][14]:=c*t*12.1211;
+	ModelMatrixName[14][5]:=c*t*12.1211;
+	ModelMatrixName[5][11]:=c*t*28.0526;
+	ModelMatrixName[11][5]:=c*t*28.0526;
+	ModelMatrixName[5][2]:=c*t*29.8789;
+	ModelMatrixName[2][5]:=c*t*29.8789;
+	ModelMatrixName[5][1]:=c*t*16.1632;
+	ModelMatrixName[1][5]:=c*t*16.1632;
+	ModelMatrixName[5][13]:=c*t*3.55263;
+	ModelMatrixName[13][5]:=c*t*3.55263;
+	ModelMatrixName[5][3]:=c*t*14.8842;
+	ModelMatrixName[3][5]:=c*t*14.8842;
+	ModelMatrixName[6][0]:=c*t*7.31579;
+	ModelMatrixName[0][6]:=c*t*7.31579;
+	ModelMatrixName[6][14]:=c*t*86.9632;
+	ModelMatrixName[14][6]:=c*t*86.9632;
+	ModelMatrixName[6][11]:=c*t*261.121;
+	ModelMatrixName[11][6]:=c*t*261.121;
+	ModelMatrixName[6][2]:=c*t*59.9947;
+	ModelMatrixName[2][6]:=c*t*59.9947;
+	ModelMatrixName[6][1]:=c*t*74.4684;
+	ModelMatrixName[1][6]:=c*t*74.4684;
+	ModelMatrixName[6][13]:=c*t*306.526;
+	ModelMatrixName[13][6]:=c*t*306.526;
+	ModelMatrixName[6][3]:=c*t*25.8526;
+	ModelMatrixName[3][6]:=c*t*25.8526;
+	ModelMatrixName[6][5]:=c*t*1;
+	ModelMatrixName[5][6]:=c*t*1;
+	ModelMatrixName[7][0]:=c*t*50.7842;
+	ModelMatrixName[0][7]:=c*t*50.7842;
+	ModelMatrixName[7][14]:=c*t*1;
+	ModelMatrixName[14][7]:=c*t*1;
+	ModelMatrixName[7][11]:=c*t*14.2632;
+	ModelMatrixName[11][7]:=c*t*14.2632;
+	ModelMatrixName[7][2]:=c*t*2.28421;
+	ModelMatrixName[2][7]:=c*t*2.28421;
+	ModelMatrixName[7][1]:=c*t*33.0158;
+	ModelMatrixName[1][7]:=c*t*33.0158;
+	ModelMatrixName[7][13]:=c*t*4.38947;
+	ModelMatrixName[13][7]:=c*t*4.38947;
+	ModelMatrixName[7][3]:=c*t*1.74211;
+	ModelMatrixName[3][7]:=c*t*1.74211;
+	ModelMatrixName[7][5]:=c*t*3.14737;
+	ModelMatrixName[5][7]:=c*t*3.14737;
+	ModelMatrixName[7][6]:=c*t*6.45263;
+	ModelMatrixName[6][7]:=c*t*6.45263;
+	ModelMatrixName[9][0]:=c*t*13.4;
+	ModelMatrixName[0][9]:=c*t*13.4;
+	ModelMatrixName[9][14]:=c*t*8.2;
+	ModelMatrixName[14][9]:=c*t*8.2;
+	ModelMatrixName[9][11]:=c*t*7.97895;
+	ModelMatrixName[11][9]:=c*t*7.97895;
+	ModelMatrixName[9][2]:=c*t*1;
+	ModelMatrixName[2][9]:=c*t*1;
+	ModelMatrixName[9][1]:=c*t*13.5;
+	ModelMatrixName[1][9]:=c*t*13.5;
+	ModelMatrixName[9][13]:=c*t*20.8947;
+	ModelMatrixName[13][9]:=c*t*20.8947;
+	ModelMatrixName[9][3]:=c*t*1;
+	ModelMatrixName[3][9]:=c*t*1;
+	ModelMatrixName[9][5]:=c*t*1.26842;
+	ModelMatrixName[5][9]:=c*t*1.26842;
+	ModelMatrixName[9][6]:=c*t*6.04737;
+	ModelMatrixName[6][9]:=c*t*6.04737;
+	ModelMatrixName[9][7]:=c*t*173.205;
+	ModelMatrixName[7][9]:=c*t*173.205;
+	ModelMatrixName[8][0]:=c*t*4.4;
+	ModelMatrixName[0][8]:=c*t*4.4;
+	ModelMatrixName[8][14]:=c*t*74.4211;
+	ModelMatrixName[14][8]:=c*t*74.4211;
+	ModelMatrixName[8][11]:=c*t*320.368;
+	ModelMatrixName[11][8]:=c*t*320.368;
+	ModelMatrixName[8][2]:=c*t*1.21579;
+	ModelMatrixName[2][8]:=c*t*1.21579;
+	ModelMatrixName[8][1]:=c*t*1;
+	ModelMatrixName[1][8]:=c*t*1;
+	ModelMatrixName[8][13]:=c*t*245.042;
+	ModelMatrixName[13][8]:=c*t*245.042;
+	ModelMatrixName[8][3]:=c*t*165.189;
+	ModelMatrixName[3][8]:=c*t*165.189;
+	ModelMatrixName[8][5]:=c*t*11.9632;
+	ModelMatrixName[5][8]:=c*t*11.9632;
+	ModelMatrixName[8][6]:=c*t*67.1947;
+	ModelMatrixName[6][8]:=c*t*67.1947;
+	ModelMatrixName[8][7]:=c*t*10.3;
+	ModelMatrixName[7][8]:=c*t*10.3;
+	ModelMatrixName[8][9]:=c*t*7.83158;
+	ModelMatrixName[9][8]:=c*t*7.83158;
+	ModelMatrixName[10][0]:=c*t*74.6737;
+	ModelMatrixName[0][10]:=c*t*74.6737;
+	ModelMatrixName[10][14]:=c*t*1;
+	ModelMatrixName[14][10]:=c*t*1;
+	ModelMatrixName[10][11]:=c*t*34.4263;
+	ModelMatrixName[11][10]:=c*t*34.4263;
+	ModelMatrixName[10][2]:=c*t*1;
+	ModelMatrixName[2][10]:=c*t*1;
+	ModelMatrixName[10][1]:=c*t*3.25263;
+	ModelMatrixName[1][10]:=c*t*3.25263;
+	ModelMatrixName[10][13]:=c*t*24.9316;
+	ModelMatrixName[13][10]:=c*t*24.9316;
+	ModelMatrixName[10][3]:=c*t*1;
+	ModelMatrixName[3][10]:=c*t*1;
+	ModelMatrixName[10][5]:=c*t*1;
+	ModelMatrixName[5][10]:=c*t*1;
+	ModelMatrixName[10][6]:=c*t*6.3;
+	ModelMatrixName[6][10]:=c*t*6.3;
+	ModelMatrixName[10][7]:=c*t*272.621;
+	ModelMatrixName[7][10]:=c*t*272.621;
+	ModelMatrixName[10][9]:=c*t*282.911;
+	ModelMatrixName[9][10]:=c*t*282.911;
+	ModelMatrixName[10][8]:=c*t*48.0895;
+	ModelMatrixName[8][10]:=c*t*48.0895;
+	ModelMatrixName[4][0]:=c*t*3.35263;
+	ModelMatrixName[0][4]:=c*t*3.35263;
+	ModelMatrixName[4][14]:=c*t*2.46842;
+	ModelMatrixName[14][4]:=c*t*2.46842;
+	ModelMatrixName[4][11]:=c*t*8;
+	ModelMatrixName[11][4]:=c*t*8;
+	ModelMatrixName[4][2]:=c*t*2.62105;
+	ModelMatrixName[2][4]:=c*t*2.62105;
+	ModelMatrixName[4][1]:=c*t*37.2632;
+	ModelMatrixName[1][4]:=c*t*37.2632;
+	ModelMatrixName[4][13]:=c*t*10.0579;
+	ModelMatrixName[13][4]:=c*t*10.0579;
+	ModelMatrixName[4][3]:=c*t*1.40526;
+	ModelMatrixName[3][4]:=c*t*1.40526;
+	ModelMatrixName[4][5]:=c*t*1;
+	ModelMatrixName[5][4]:=c*t*1;
+	ModelMatrixName[4][6]:=c*t*25.3474;
+	ModelMatrixName[6][4]:=c*t*25.3474;
+	ModelMatrixName[4][7]:=c*t*44.5632;
+	ModelMatrixName[7][4]:=c*t*44.5632;
+	ModelMatrixName[4][9]:=c*t*113.716;
+	ModelMatrixName[9][4]:=c*t*113.716;
+	ModelMatrixName[4][8]:=c*t*3.38947;
+	ModelMatrixName[8][4]:=c*t*3.38947;
+	ModelMatrixName[4][10]:=c*t*47.8;
+	ModelMatrixName[10][4]:=c*t*47.8;
+	ModelMatrixName[12][0]:=c*t*28.5842;
+	ModelMatrixName[0][12]:=c*t*28.5842;
+	ModelMatrixName[12][14]:=c*t*12.4421;
+	ModelMatrixName[14][12]:=c*t*12.4421;
+	ModelMatrixName[12][11]:=c*t*38.5842;
+	ModelMatrixName[11][12]:=c*t*38.5842;
+	ModelMatrixName[12][2]:=c*t*7.06842;
+	ModelMatrixName[2][12]:=c*t*7.06842;
+	ModelMatrixName[12][1]:=c*t*16.4526;
+	ModelMatrixName[1][12]:=c*t*16.4526;
+	ModelMatrixName[12][13]:=c*t*72.2579;
+	ModelMatrixName[13][12]:=c*t*72.2579;
+	ModelMatrixName[12][3]:=c*t*6.75263;
+	ModelMatrixName[3][12]:=c*t*6.75263;
+	ModelMatrixName[12][5]:=c*t*1;
+	ModelMatrixName[5][12]:=c*t*1;
+	ModelMatrixName[12][6]:=c*t*32.0895;
+	ModelMatrixName[6][12]:=c*t*32.0895;
+	ModelMatrixName[12][7]:=c*t*10.8579;
+	ModelMatrixName[7][12]:=c*t*10.8579;
+	ModelMatrixName[12][9]:=c*t*21.1053;
+	ModelMatrixName[9][12]:=c*t*21.1053;
+	ModelMatrixName[12][8]:=c*t*26.3684;
+	ModelMatrixName[8][12]:=c*t*26.3684;
+	ModelMatrixName[12][10]:=c*t*9.91579;
+	ModelMatrixName[10][12]:=c*t*9.91579;
+	ModelMatrixName[12][4]:=c*t*9.11053;
+	ModelMatrixName[4][12]:=c*t*9.11053;
+	ModelMatrixName[15][0]:=c*t*204.137;
+	ModelMatrixName[0][15]:=c*t*204.137;
+	ModelMatrixName[15][14]:=c*t*3.17895;
+	ModelMatrixName[14][15]:=c*t*3.17895;
+	ModelMatrixName[15][11]:=c*t*260.205;
+	ModelMatrixName[11][15]:=c*t*260.205;
+	ModelMatrixName[15][2]:=c*t*36.3263;
+	ModelMatrixName[2][15]:=c*t*36.3263;
+	ModelMatrixName[15][1]:=c*t*145.816;
+	ModelMatrixName[1][15]:=c*t*145.816;
+	ModelMatrixName[15][13]:=c*t*28.4789;
+	ModelMatrixName[13][15]:=c*t*28.4789;
+	ModelMatrixName[15][3]:=c*t*28.7947;
+	ModelMatrixName[3][15]:=c*t*28.7947;
+	ModelMatrixName[15][5]:=c*t*66.2789;
+	ModelMatrixName[5][15]:=c*t*66.2789;
+	ModelMatrixName[15][6]:=c*t*40.7684;
+	ModelMatrixName[6][15]:=c*t*40.7684;
+	ModelMatrixName[15][7]:=c*t*25.1053;
+	ModelMatrixName[7][15]:=c*t*25.1053;
+	ModelMatrixName[15][9]:=c*t*38.7421;
+	ModelMatrixName[9][15]:=c*t*38.7421;
+	ModelMatrixName[15][8]:=c*t*55.6789;
+	ModelMatrixName[8][15]:=c*t*55.6789;
+	ModelMatrixName[15][10]:=c*t*58.5053;
+	ModelMatrixName[10][15]:=c*t*58.5053;
+	ModelMatrixName[15][4]:=c*t*33.8368;
+	ModelMatrixName[4][15]:=c*t*33.8368;
+	ModelMatrixName[15][12]:=c*t*89.4211;
+	ModelMatrixName[12][15]:=c*t*89.4211;
+	ModelMatrixName[16][0]:=c*t*253.011;
+	ModelMatrixName[0][16]:=c*t*253.011;
+	ModelMatrixName[16][14]:=c*t*1.09474;
+	ModelMatrixName[14][16]:=c*t*1.09474;
+	ModelMatrixName[16][11]:=c*t*125.505;
+	ModelMatrixName[11][16]:=c*t*125.505;
+	ModelMatrixName[16][2]:=c*t*14.7421;
+	ModelMatrixName[2][16]:=c*t*14.7421;
+	ModelMatrixName[16][1]:=c*t*94.7211;
+	ModelMatrixName[1][16]:=c*t*94.7211;
+	ModelMatrixName[16][13]:=c*t*49.9632;
+	ModelMatrixName[13][16]:=c*t*49.9632;
+	ModelMatrixName[16][3]:=c*t*7.8;
+	ModelMatrixName[3][16]:=c*t*7.8;
+	ModelMatrixName[16][5]:=c*t*5.87895;
+	ModelMatrixName[5][16]:=c*t*5.87895;
+	ModelMatrixName[16][6]:=c*t*23.5684;
+	ModelMatrixName[6][16]:=c*t*23.5684;
+	ModelMatrixName[16][7]:=c*t*193.911;
+	ModelMatrixName[7][16]:=c*t*193.911;
+	ModelMatrixName[16][9]:=c*t*66.5263;
+	ModelMatrixName[9][16]:=c*t*66.5263;
+	ModelMatrixName[16][8]:=c*t*71.7526;
+	ModelMatrixName[8][16]:=c*t*71.7526;
+	ModelMatrixName[16][10]:=c*t*277.984;
+	ModelMatrixName[10][16]:=c*t*277.984;
+	ModelMatrixName[16][4]:=c*t*17.8158;
+	ModelMatrixName[4][16]:=c*t*17.8158;
+	ModelMatrixName[16][12]:=c*t*67.4842;
+	ModelMatrixName[12][16]:=c*t*67.4842;
+	ModelMatrixName[16][15]:=c*t*314.321;
+	ModelMatrixName[15][16]:=c*t*314.321;
+	ModelMatrixName[18][0]:=c*t*1;
+	ModelMatrixName[0][18]:=c*t*1;
+	ModelMatrixName[18][14]:=c*t*11.5526;
+	ModelMatrixName[14][18]:=c*t*11.5526;
+	ModelMatrixName[18][11]:=c*t*5.62105;
+	ModelMatrixName[11][18]:=c*t*5.62105;
+	ModelMatrixName[18][2]:=c*t*10.4526;
+	ModelMatrixName[2][18]:=c*t*10.4526;
+	ModelMatrixName[18][1]:=c*t*17.6842;
+	ModelMatrixName[1][18]:=c*t*17.6842;
+	ModelMatrixName[18][13]:=c*t*1;
+	ModelMatrixName[13][18]:=c*t*1;
+	ModelMatrixName[18][3]:=c*t*1;
+	ModelMatrixName[3][18]:=c*t*1;
+	ModelMatrixName[18][5]:=c*t*5.74737;
+	ModelMatrixName[5][18]:=c*t*5.74737;
+	ModelMatrixName[18][6]:=c*t*3.72632;
+	ModelMatrixName[6][18]:=c*t*3.72632;
+	ModelMatrixName[18][7]:=c*t*1;
+	ModelMatrixName[7][18]:=c*t*1;
+	ModelMatrixName[18][9]:=c*t*17.0737;
+	ModelMatrixName[9][18]:=c*t*17.0737;
+	ModelMatrixName[18][8]:=c*t*12.6316;
+	ModelMatrixName[8][18]:=c*t*12.6316;
+	ModelMatrixName[18][10]:=c*t*11.4263;
+	ModelMatrixName[10][18]:=c*t*11.4263;
+	ModelMatrixName[18][4]:=c*t*4.12632;
+	ModelMatrixName[4][18]:=c*t*4.12632;
+	ModelMatrixName[18][12]:=c*t*2.21579;
+	ModelMatrixName[12][18]:=c*t*2.21579;
+	ModelMatrixName[18][15]:=c*t*20.3053;
+	ModelMatrixName[15][18]:=c*t*20.3053;
+	ModelMatrixName[18][16]:=c*t*5.25789;
+	ModelMatrixName[16][18]:=c*t*5.25789;
+	ModelMatrixName[19][0]:=c*t*3.41053;
+	ModelMatrixName[0][19]:=c*t*3.41053;
+	ModelMatrixName[19][14]:=c*t*1;
+	ModelMatrixName[14][19]:=c*t*1;
+	ModelMatrixName[19][11]:=c*t*100.716;
+	ModelMatrixName[11][19]:=c*t*100.716;
+	ModelMatrixName[19][2]:=c*t*11.1632;
+	ModelMatrixName[2][19]:=c*t*11.1632;
+	ModelMatrixName[19][1]:=c*t*134.089;
+	ModelMatrixName[1][19]:=c*t*134.089;
+	ModelMatrixName[19][13]:=c*t*20.4316;
+	ModelMatrixName[13][19]:=c*t*20.4316;
+	ModelMatrixName[19][3]:=c*t*6.90526;
+	ModelMatrixName[3][19]:=c*t*6.90526;
+	ModelMatrixName[19][5]:=c*t*1.68947;
+	ModelMatrixName[5][19]:=c*t*1.68947;
+	ModelMatrixName[19][6]:=c*t*352.705;
+	ModelMatrixName[6][19]:=c*t*352.705;
+	ModelMatrixName[19][7]:=c*t*13.1632;
+	ModelMatrixName[7][19]:=c*t*13.1632;
+	ModelMatrixName[19][9]:=c*t*23.2368;
+	ModelMatrixName[9][19]:=c*t*23.2368;
+	ModelMatrixName[19][8]:=c*t*26.9316;
+	ModelMatrixName[8][19]:=c*t*26.9316;
+	ModelMatrixName[19][10]:=c*t*21.0316;
+	ModelMatrixName[10][19]:=c*t*21.0316;
+	ModelMatrixName[19][4]:=c*t*245.042;
+	ModelMatrixName[4][19]:=c*t*245.042;
+	ModelMatrixName[19][12]:=c*t*8.53158;
+	ModelMatrixName[12][19]:=c*t*8.53158;
+	ModelMatrixName[19][15]:=c*t*34.1684;
+	ModelMatrixName[15][19]:=c*t*34.1684;
+	ModelMatrixName[19][16]:=c*t*20.3842;
+	ModelMatrixName[16][19]:=c*t*20.3842;
+	ModelMatrixName[19][18]:=c*t*13.8158;
+	ModelMatrixName[18][19]:=c*t*13.8158;
+	ModelMatrixName[17][0]:=c*t*102.663;
+	ModelMatrixName[0][17]:=c*t*102.663;
+	ModelMatrixName[17][14]:=c*t*4.02105;
+	ModelMatrixName[14][17]:=c*t*4.02105;
+	ModelMatrixName[17][11]:=c*t*1;
+	ModelMatrixName[11][17]:=c*t*1;
+	ModelMatrixName[17][2]:=c*t*1;
+	ModelMatrixName[2][17]:=c*t*1;
+	ModelMatrixName[17][1]:=c*t*1;
+	ModelMatrixName[1][17]:=c*t*1;
+	ModelMatrixName[17][13]:=c*t*10;
+	ModelMatrixName[13][17]:=c*t*10;
+	ModelMatrixName[17][3]:=c*t*11.1263;
+	ModelMatrixName[3][17]:=c*t*11.1263;
+	ModelMatrixName[17][5]:=c*t*1.33158;
+	ModelMatrixName[5][17]:=c*t*1.33158;
+	ModelMatrixName[17][6]:=c*t*1;
+	ModelMatrixName[6][17]:=c*t*1;
+	ModelMatrixName[17][7]:=c*t*643.653;
+	ModelMatrixName[7][17]:=c*t*643.653;
+	ModelMatrixName[17][9]:=c*t*48.2474;
+	ModelMatrixName[9][17]:=c*t*48.2474;
+	ModelMatrixName[17][8]:=c*t*1;
+	ModelMatrixName[8][17]:=c*t*1;
+	ModelMatrixName[17][10]:=c*t*203.968;
+	ModelMatrixName[10][17]:=c*t*203.968;
+	ModelMatrixName[17][4]:=c*t*3.34211;
+	ModelMatrixName[4][17]:=c*t*3.34211;
+	ModelMatrixName[17][12]:=c*t*4.33158;
+	ModelMatrixName[12][17]:=c*t*4.33158;
+	ModelMatrixName[17][15]:=c*t*1;
+	ModelMatrixName[15][17]:=c*t*1;
+	ModelMatrixName[17][16]:=c*t*107.653;
+	ModelMatrixName[16][17]:=c*t*107.653;
+	ModelMatrixName[17][18]:=c*t*2.82632;
+	ModelMatrixName[18][17]:=c*t*2.82632;
+	ModelMatrixName[17][19]:=c*t*1;
+	ModelMatrixName[19][17]:=c*t*1;
+	}
+	else
+	{
+       	ModelMatrixName[14][0]:=t*12.2;
+	ModelMatrixName[0][14]:=t*12.2;
+	ModelMatrixName[11][0]:=t*14.1842;
+	ModelMatrixName[0][11]:=t*14.1842;
+	ModelMatrixName[11][14]:=t*6.96842;
+	ModelMatrixName[14][11]:=t*6.96842;
+	ModelMatrixName[2][0]:=t*9.3;
+	ModelMatrixName[0][2]:=t*9.3;
+	ModelMatrixName[2][14]:=t*1;
+	ModelMatrixName[14][2]:=t*1;
+	ModelMatrixName[2][11]:=t*418.095;
+	ModelMatrixName[11][2]:=t*418.095;
+	ModelMatrixName[1][0]:=t*31.5421;
+	ModelMatrixName[0][1]:=t*31.5421;
+	ModelMatrixName[1][14]:=t*54.3842;
+	ModelMatrixName[14][1]:=t*54.3842;
+	ModelMatrixName[1][11]:=t*31.0211;
+	ModelMatrixName[11][1]:=t*31.0211;
+	ModelMatrixName[1][2]:=t*1;
+	ModelMatrixName[2][1]:=t*1;
+	ModelMatrixName[13][0]:=t*1;
+	ModelMatrixName[0][13]:=t*1;
+	ModelMatrixName[13][14]:=t*116.311;
+	ModelMatrixName[14][13]:=t*116.311;
+	ModelMatrixName[13][11]:=t*91.3474;
+	ModelMatrixName[11][13]:=t*91.3474;
+	ModelMatrixName[13][2]:=t*29.0947;
+	ModelMatrixName[2][13]:=t*29.0947;
+	ModelMatrixName[13][1]:=t*39.6;
+	ModelMatrixName[1][13]:=t*39.6;
+	ModelMatrixName[3][0]:=t*5.14211;
+	ModelMatrixName[0][3]:=t*5.14211;
+	ModelMatrixName[3][14]:=t*1;
+	ModelMatrixName[14][3]:=t*1;
+	ModelMatrixName[3][11]:=t*33.1842;
+	ModelMatrixName[11][3]:=t*33.1842;
+	ModelMatrixName[3][2]:=t*307.132;
+	ModelMatrixName[2][3]:=t*307.132;
+	ModelMatrixName[3][1]:=t*1;
+	ModelMatrixName[1][3]:=t*1;
+	ModelMatrixName[3][13]:=t*165.032;
+	ModelMatrixName[13][3]:=t*165.032;
+	ModelMatrixName[5][0]:=t*63.5316;
+	ModelMatrixName[0][5]:=t*63.5316;
+	ModelMatrixName[5][14]:=t*12.1211;
+	ModelMatrixName[14][5]:=t*12.1211;
+	ModelMatrixName[5][11]:=t*28.0526;
+	ModelMatrixName[11][5]:=t*28.0526;
+	ModelMatrixName[5][2]:=t*29.8789;
+	ModelMatrixName[2][5]:=t*29.8789;
+	ModelMatrixName[5][1]:=t*16.1632;
+	ModelMatrixName[1][5]:=t*16.1632;
+	ModelMatrixName[5][13]:=t*3.55263;
+	ModelMatrixName[13][5]:=t*3.55263;
+	ModelMatrixName[5][3]:=t*14.8842;
+	ModelMatrixName[3][5]:=t*14.8842;
+	ModelMatrixName[6][0]:=t*7.31579;
+	ModelMatrixName[0][6]:=t*7.31579;
+	ModelMatrixName[6][14]:=t*86.9632;
+	ModelMatrixName[14][6]:=t*86.9632;
+	ModelMatrixName[6][11]:=t*261.121;
+	ModelMatrixName[11][6]:=t*261.121;
+	ModelMatrixName[6][2]:=t*59.9947;
+	ModelMatrixName[2][6]:=t*59.9947;
+	ModelMatrixName[6][1]:=t*74.4684;
+	ModelMatrixName[1][6]:=t*74.4684;
+	ModelMatrixName[6][13]:=t*306.526;
+	ModelMatrixName[13][6]:=t*306.526;
+	ModelMatrixName[6][3]:=t*25.8526;
+	ModelMatrixName[3][6]:=t*25.8526;
+	ModelMatrixName[6][5]:=t*1;
+	ModelMatrixName[5][6]:=t*1;
+	ModelMatrixName[7][0]:=t*50.7842;
+	ModelMatrixName[0][7]:=t*50.7842;
+	ModelMatrixName[7][14]:=t*1;
+	ModelMatrixName[14][7]:=t*1;
+	ModelMatrixName[7][11]:=t*14.2632;
+	ModelMatrixName[11][7]:=t*14.2632;
+	ModelMatrixName[7][2]:=t*2.28421;
+	ModelMatrixName[2][7]:=t*2.28421;
+	ModelMatrixName[7][1]:=t*33.0158;
+	ModelMatrixName[1][7]:=t*33.0158;
+	ModelMatrixName[7][13]:=t*4.38947;
+	ModelMatrixName[13][7]:=t*4.38947;
+	ModelMatrixName[7][3]:=t*1.74211;
+	ModelMatrixName[3][7]:=t*1.74211;
+	ModelMatrixName[7][5]:=t*3.14737;
+	ModelMatrixName[5][7]:=t*3.14737;
+	ModelMatrixName[7][6]:=t*6.45263;
+	ModelMatrixName[6][7]:=t*6.45263;
+	ModelMatrixName[9][0]:=t*13.4;
+	ModelMatrixName[0][9]:=t*13.4;
+	ModelMatrixName[9][14]:=t*8.2;
+	ModelMatrixName[14][9]:=t*8.2;
+	ModelMatrixName[9][11]:=t*7.97895;
+	ModelMatrixName[11][9]:=t*7.97895;
+	ModelMatrixName[9][2]:=t*1;
+	ModelMatrixName[2][9]:=t*1;
+	ModelMatrixName[9][1]:=t*13.5;
+	ModelMatrixName[1][9]:=t*13.5;
+	ModelMatrixName[9][13]:=t*20.8947;
+	ModelMatrixName[13][9]:=t*20.8947;
+	ModelMatrixName[9][3]:=t*1;
+	ModelMatrixName[3][9]:=t*1;
+	ModelMatrixName[9][5]:=t*1.26842;
+	ModelMatrixName[5][9]:=t*1.26842;
+	ModelMatrixName[9][6]:=t*6.04737;
+	ModelMatrixName[6][9]:=t*6.04737;
+	ModelMatrixName[9][7]:=t*173.205;
+	ModelMatrixName[7][9]:=t*173.205;
+	ModelMatrixName[8][0]:=t*4.4;
+	ModelMatrixName[0][8]:=t*4.4;
+	ModelMatrixName[8][14]:=t*74.4211;
+	ModelMatrixName[14][8]:=t*74.4211;
+	ModelMatrixName[8][11]:=t*320.368;
+	ModelMatrixName[11][8]:=t*320.368;
+	ModelMatrixName[8][2]:=t*1.21579;
+	ModelMatrixName[2][8]:=t*1.21579;
+	ModelMatrixName[8][1]:=t*1;
+	ModelMatrixName[1][8]:=t*1;
+	ModelMatrixName[8][13]:=t*245.042;
+	ModelMatrixName[13][8]:=t*245.042;
+	ModelMatrixName[8][3]:=t*165.189;
+	ModelMatrixName[3][8]:=t*165.189;
+	ModelMatrixName[8][5]:=t*11.9632;
+	ModelMatrixName[5][8]:=t*11.9632;
+	ModelMatrixName[8][6]:=t*67.1947;
+	ModelMatrixName[6][8]:=t*67.1947;
+	ModelMatrixName[8][7]:=t*10.3;
+	ModelMatrixName[7][8]:=t*10.3;
+	ModelMatrixName[8][9]:=t*7.83158;
+	ModelMatrixName[9][8]:=t*7.83158;
+	ModelMatrixName[10][0]:=t*74.6737;
+	ModelMatrixName[0][10]:=t*74.6737;
+	ModelMatrixName[10][14]:=t*1;
+	ModelMatrixName[14][10]:=t*1;
+	ModelMatrixName[10][11]:=t*34.4263;
+	ModelMatrixName[11][10]:=t*34.4263;
+	ModelMatrixName[10][2]:=t*1;
+	ModelMatrixName[2][10]:=t*1;
+	ModelMatrixName[10][1]:=t*3.25263;
+	ModelMatrixName[1][10]:=t*3.25263;
+	ModelMatrixName[10][13]:=t*24.9316;
+	ModelMatrixName[13][10]:=t*24.9316;
+	ModelMatrixName[10][3]:=t*1;
+	ModelMatrixName[3][10]:=t*1;
+	ModelMatrixName[10][5]:=t*1;
+	ModelMatrixName[5][10]:=t*1;
+	ModelMatrixName[10][6]:=t*6.3;
+	ModelMatrixName[6][10]:=t*6.3;
+	ModelMatrixName[10][7]:=t*272.621;
+	ModelMatrixName[7][10]:=t*272.621;
+	ModelMatrixName[10][9]:=t*282.911;
+	ModelMatrixName[9][10]:=t*282.911;
+	ModelMatrixName[10][8]:=t*48.0895;
+	ModelMatrixName[8][10]:=t*48.0895;
+	ModelMatrixName[4][0]:=t*3.35263;
+	ModelMatrixName[0][4]:=t*3.35263;
+	ModelMatrixName[4][14]:=t*2.46842;
+	ModelMatrixName[14][4]:=t*2.46842;
+	ModelMatrixName[4][11]:=t*8;
+	ModelMatrixName[11][4]:=t*8;
+	ModelMatrixName[4][2]:=t*2.62105;
+	ModelMatrixName[2][4]:=t*2.62105;
+	ModelMatrixName[4][1]:=t*37.2632;
+	ModelMatrixName[1][4]:=t*37.2632;
+	ModelMatrixName[4][13]:=t*10.0579;
+	ModelMatrixName[13][4]:=t*10.0579;
+	ModelMatrixName[4][3]:=t*1.40526;
+	ModelMatrixName[3][4]:=t*1.40526;
+	ModelMatrixName[4][5]:=t*1;
+	ModelMatrixName[5][4]:=t*1;
+	ModelMatrixName[4][6]:=t*25.3474;
+	ModelMatrixName[6][4]:=t*25.3474;
+	ModelMatrixName[4][7]:=t*44.5632;
+	ModelMatrixName[7][4]:=t*44.5632;
+	ModelMatrixName[4][9]:=t*113.716;
+	ModelMatrixName[9][4]:=t*113.716;
+	ModelMatrixName[4][8]:=t*3.38947;
+	ModelMatrixName[8][4]:=t*3.38947;
+	ModelMatrixName[4][10]:=t*47.8;
+	ModelMatrixName[10][4]:=t*47.8;
+	ModelMatrixName[12][0]:=t*28.5842;
+	ModelMatrixName[0][12]:=t*28.5842;
+	ModelMatrixName[12][14]:=t*12.4421;
+	ModelMatrixName[14][12]:=t*12.4421;
+	ModelMatrixName[12][11]:=t*38.5842;
+	ModelMatrixName[11][12]:=t*38.5842;
+	ModelMatrixName[12][2]:=t*7.06842;
+	ModelMatrixName[2][12]:=t*7.06842;
+	ModelMatrixName[12][1]:=t*16.4526;
+	ModelMatrixName[1][12]:=t*16.4526;
+	ModelMatrixName[12][13]:=t*72.2579;
+	ModelMatrixName[13][12]:=t*72.2579;
+	ModelMatrixName[12][3]:=t*6.75263;
+	ModelMatrixName[3][12]:=t*6.75263;
+	ModelMatrixName[12][5]:=t*1;
+	ModelMatrixName[5][12]:=t*1;
+	ModelMatrixName[12][6]:=t*32.0895;
+	ModelMatrixName[6][12]:=t*32.0895;
+	ModelMatrixName[12][7]:=t*10.8579;
+	ModelMatrixName[7][12]:=t*10.8579;
+	ModelMatrixName[12][9]:=t*21.1053;
+	ModelMatrixName[9][12]:=t*21.1053;
+	ModelMatrixName[12][8]:=t*26.3684;
+	ModelMatrixName[8][12]:=t*26.3684;
+	ModelMatrixName[12][10]:=t*9.91579;
+	ModelMatrixName[10][12]:=t*9.91579;
+	ModelMatrixName[12][4]:=t*9.11053;
+	ModelMatrixName[4][12]:=t*9.11053;
+	ModelMatrixName[15][0]:=t*204.137;
+	ModelMatrixName[0][15]:=t*204.137;
+	ModelMatrixName[15][14]:=t*3.17895;
+	ModelMatrixName[14][15]:=t*3.17895;
+	ModelMatrixName[15][11]:=t*260.205;
+	ModelMatrixName[11][15]:=t*260.205;
+	ModelMatrixName[15][2]:=t*36.3263;
+	ModelMatrixName[2][15]:=t*36.3263;
+	ModelMatrixName[15][1]:=t*145.816;
+	ModelMatrixName[1][15]:=t*145.816;
+	ModelMatrixName[15][13]:=t*28.4789;
+	ModelMatrixName[13][15]:=t*28.4789;
+	ModelMatrixName[15][3]:=t*28.7947;
+	ModelMatrixName[3][15]:=t*28.7947;
+	ModelMatrixName[15][5]:=t*66.2789;
+	ModelMatrixName[5][15]:=t*66.2789;
+	ModelMatrixName[15][6]:=t*40.7684;
+	ModelMatrixName[6][15]:=t*40.7684;
+	ModelMatrixName[15][7]:=t*25.1053;
+	ModelMatrixName[7][15]:=t*25.1053;
+	ModelMatrixName[15][9]:=t*38.7421;
+	ModelMatrixName[9][15]:=t*38.7421;
+	ModelMatrixName[15][8]:=t*55.6789;
+	ModelMatrixName[8][15]:=t*55.6789;
+	ModelMatrixName[15][10]:=t*58.5053;
+	ModelMatrixName[10][15]:=t*58.5053;
+	ModelMatrixName[15][4]:=t*33.8368;
+	ModelMatrixName[4][15]:=t*33.8368;
+	ModelMatrixName[15][12]:=t*89.4211;
+	ModelMatrixName[12][15]:=t*89.4211;
+	ModelMatrixName[16][0]:=t*253.011;
+	ModelMatrixName[0][16]:=t*253.011;
+	ModelMatrixName[16][14]:=t*1.09474;
+	ModelMatrixName[14][16]:=t*1.09474;
+	ModelMatrixName[16][11]:=t*125.505;
+	ModelMatrixName[11][16]:=t*125.505;
+	ModelMatrixName[16][2]:=t*14.7421;
+	ModelMatrixName[2][16]:=t*14.7421;
+	ModelMatrixName[16][1]:=t*94.7211;
+	ModelMatrixName[1][16]:=t*94.7211;
+	ModelMatrixName[16][13]:=t*49.9632;
+	ModelMatrixName[13][16]:=t*49.9632;
+	ModelMatrixName[16][3]:=t*7.8;
+	ModelMatrixName[3][16]:=t*7.8;
+	ModelMatrixName[16][5]:=t*5.87895;
+	ModelMatrixName[5][16]:=t*5.87895;
+	ModelMatrixName[16][6]:=t*23.5684;
+	ModelMatrixName[6][16]:=t*23.5684;
+	ModelMatrixName[16][7]:=t*193.911;
+	ModelMatrixName[7][16]:=t*193.911;
+	ModelMatrixName[16][9]:=t*66.5263;
+	ModelMatrixName[9][16]:=t*66.5263;
+	ModelMatrixName[16][8]:=t*71.7526;
+	ModelMatrixName[8][16]:=t*71.7526;
+	ModelMatrixName[16][10]:=t*277.984;
+	ModelMatrixName[10][16]:=t*277.984;
+	ModelMatrixName[16][4]:=t*17.8158;
+	ModelMatrixName[4][16]:=t*17.8158;
+	ModelMatrixName[16][12]:=t*67.4842;
+	ModelMatrixName[12][16]:=t*67.4842;
+	ModelMatrixName[16][15]:=t*314.321;
+	ModelMatrixName[15][16]:=t*314.321;
+	ModelMatrixName[18][0]:=t*1;
+	ModelMatrixName[0][18]:=t*1;
+	ModelMatrixName[18][14]:=t*11.5526;
+	ModelMatrixName[14][18]:=t*11.5526;
+	ModelMatrixName[18][11]:=t*5.62105;
+	ModelMatrixName[11][18]:=t*5.62105;
+	ModelMatrixName[18][2]:=t*10.4526;
+	ModelMatrixName[2][18]:=t*10.4526;
+	ModelMatrixName[18][1]:=t*17.6842;
+	ModelMatrixName[1][18]:=t*17.6842;
+	ModelMatrixName[18][13]:=t*1;
+	ModelMatrixName[13][18]:=t*1;
+	ModelMatrixName[18][3]:=t*1;
+	ModelMatrixName[3][18]:=t*1;
+	ModelMatrixName[18][5]:=t*5.74737;
+	ModelMatrixName[5][18]:=t*5.74737;
+	ModelMatrixName[18][6]:=t*3.72632;
+	ModelMatrixName[6][18]:=t*3.72632;
+	ModelMatrixName[18][7]:=t*1;
+	ModelMatrixName[7][18]:=t*1;
+	ModelMatrixName[18][9]:=t*17.0737;
+	ModelMatrixName[9][18]:=t*17.0737;
+	ModelMatrixName[18][8]:=t*12.6316;
+	ModelMatrixName[8][18]:=t*12.6316;
+	ModelMatrixName[18][10]:=t*11.4263;
+	ModelMatrixName[10][18]:=t*11.4263;
+	ModelMatrixName[18][4]:=t*4.12632;
+	ModelMatrixName[4][18]:=t*4.12632;
+	ModelMatrixName[18][12]:=t*2.21579;
+	ModelMatrixName[12][18]:=t*2.21579;
+	ModelMatrixName[18][15]:=t*20.3053;
+	ModelMatrixName[15][18]:=t*20.3053;
+	ModelMatrixName[18][16]:=t*5.25789;
+	ModelMatrixName[16][18]:=t*5.25789;
+	ModelMatrixName[19][0]:=t*3.41053;
+	ModelMatrixName[0][19]:=t*3.41053;
+	ModelMatrixName[19][14]:=t*1;
+	ModelMatrixName[14][19]:=t*1;
+	ModelMatrixName[19][11]:=t*100.716;
+	ModelMatrixName[11][19]:=t*100.716;
+	ModelMatrixName[19][2]:=t*11.1632;
+	ModelMatrixName[2][19]:=t*11.1632;
+	ModelMatrixName[19][1]:=t*134.089;
+	ModelMatrixName[1][19]:=t*134.089;
+	ModelMatrixName[19][13]:=t*20.4316;
+	ModelMatrixName[13][19]:=t*20.4316;
+	ModelMatrixName[19][3]:=t*6.90526;
+	ModelMatrixName[3][19]:=t*6.90526;
+	ModelMatrixName[19][5]:=t*1.68947;
+	ModelMatrixName[5][19]:=t*1.68947;
+	ModelMatrixName[19][6]:=t*352.705;
+	ModelMatrixName[6][19]:=t*352.705;
+	ModelMatrixName[19][7]:=t*13.1632;
+	ModelMatrixName[7][19]:=t*13.1632;
+	ModelMatrixName[19][9]:=t*23.2368;
+	ModelMatrixName[9][19]:=t*23.2368;
+	ModelMatrixName[19][8]:=t*26.9316;
+	ModelMatrixName[8][19]:=t*26.9316;
+	ModelMatrixName[19][10]:=t*21.0316;
+	ModelMatrixName[10][19]:=t*21.0316;
+	ModelMatrixName[19][4]:=t*245.042;
+	ModelMatrixName[4][19]:=t*245.042;
+	ModelMatrixName[19][12]:=t*8.53158;
+	ModelMatrixName[12][19]:=t*8.53158;
+	ModelMatrixName[19][15]:=t*34.1684;
+	ModelMatrixName[15][19]:=t*34.1684;
+	ModelMatrixName[19][16]:=t*20.3842;
+	ModelMatrixName[16][19]:=t*20.3842;
+	ModelMatrixName[19][18]:=t*13.8158;
+	ModelMatrixName[18][19]:=t*13.8158;
+	ModelMatrixName[17][0]:=t*102.663;
+	ModelMatrixName[0][17]:=t*102.663;
+	ModelMatrixName[17][14]:=t*4.02105;
+	ModelMatrixName[14][17]:=t*4.02105;
+	ModelMatrixName[17][11]:=t*1;
+	ModelMatrixName[11][17]:=t*1;
+	ModelMatrixName[17][2]:=t*1;
+	ModelMatrixName[2][17]:=t*1;
+	ModelMatrixName[17][1]:=t*1;
+	ModelMatrixName[1][17]:=t*1;
+	ModelMatrixName[17][13]:=t*10;
+	ModelMatrixName[13][17]:=t*10;
+	ModelMatrixName[17][3]:=t*11.1263;
+	ModelMatrixName[3][17]:=t*11.1263;
+	ModelMatrixName[17][5]:=t*1.33158;
+	ModelMatrixName[5][17]:=t*1.33158;
+	ModelMatrixName[17][6]:=t*1;
+	ModelMatrixName[6][17]:=t*1;
+	ModelMatrixName[17][7]:=t*643.653;
+	ModelMatrixName[7][17]:=t*643.653;
+	ModelMatrixName[17][9]:=t*48.2474;
+	ModelMatrixName[9][17]:=t*48.2474;
+	ModelMatrixName[17][8]:=t*1;
+	ModelMatrixName[8][17]:=t*1;
+	ModelMatrixName[17][10]:=t*203.968;
+	ModelMatrixName[10][17]:=t*203.968;
+	ModelMatrixName[17][4]:=t*3.34211;
+	ModelMatrixName[4][17]:=t*3.34211;
+	ModelMatrixName[17][12]:=t*4.33158;
+	ModelMatrixName[12][17]:=t*4.33158;
+	ModelMatrixName[17][15]:=t*1;
+	ModelMatrixName[15][17]:=t*1;
+	ModelMatrixName[17][16]:=t*107.653;
+	ModelMatrixName[16][17]:=t*107.653;
+	ModelMatrixName[17][18]:=t*2.82632;
+	ModelMatrixName[18][17]:=t*2.82632;
+	ModelMatrixName[17][19]:=t*1;
+	ModelMatrixName[19][17]:=t*1;
+
+	}
+	return 1;
+}
+
+HarvestFrequencies (vectorOfFrequencies,filteredData,1,1,0);
+mtREV_24MatrixF = 0;
+MULTIPLY_BY_FREQS = PopulateModelMatrix ("mtREV_24MatrixF",vectorOfFrequencies);
+Model mtREV_24ModelF = (mtREV_24MatrixF, vectorOfFrequencies, MULTIPLY_BY_FREQS);
+FREQUENCY_SENSITIVE = 1;
+
diff --git a/res/TemplateBatchFiles/TemplateModels/reducedREV.mdl b/res/TemplateBatchFiles/TemplateModels/reducedREV.mdl
new file mode 100644
index 0000000..417a6c0
--- /dev/null
+++ b/res/TemplateBatchFiles/TemplateModels/reducedREV.mdl
@@ -0,0 +1,158 @@
+codingMapperVector =
+{
+{                 4,                 9,                 7,                10,                17,                15,                12,                16,                 0,                19,                 6,                13,                11,                 8,                 2,                 3,                 1,                18,                14,                 5}
+};
+
+function checkPair (c1,c2)
+{
+	if (c1!=c2)
+	{
+		c1 = _Genetic_Code[c1];
+		c2 = _Genetic_Code[c2];
+		if (c1 == 10 || c2 == 10)
+		{
+			return 0;
+		}
+		
+		if (c1>=10)
+		{
+			c1 = c1-1;
+		}
+		if (c2>=10)
+		{
+			c2 = c2-1;
+		}
+		
+		c1 = codingMapperVector[c1];
+		c2 = codingMapperVector[c2];
+		
+		allowedMoves[c1][c2] = 1;
+		allowedMoves[c2][c1] = 1;
+	}
+	return 0;
+}
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+#include "chooseGeneticCode.def";
+
+allowedMoves = {20,20};
+
+for (h=0; h<64; h=h+1)
+{
+	if (_Genetic_Code[h] != 10)
+	{
+		pos12 = h-h%4;
+		pos13 = h-4*(h%16$4);
+		pos23 = h-16*(h$16);
+		
+		checkPair (h,pos12);
+		checkPair (h,pos12+1);
+		checkPair (h,pos12+2);
+		checkPair (h,pos12+3);
+		checkPair (h,pos13);
+		checkPair (h,pos13+4);
+		checkPair (h,pos13+8);
+		checkPair (h,pos13+12);
+		checkPair (h,pos23);
+		checkPair (h,pos23+16);
+		checkPair (h,pos23+32);
+		checkPair (h,pos23+48);
+	}
+}
+
+#include "modelParameters2.mdl";
+
+aaNames = {{"Alanine",
+"Cysteine",
+"Aspartic_Acid",
+"Glutamic_Acid",
+"Phenylalanine",
+"Glycine",
+"Histidine",
+"Isoleucine",
+"Lysine",
+"Leucine",
+"Methionine",
+"Asparagine",
+"Proline",
+"Glutamine",
+"Arginine",
+"Serine",
+"Threonine",
+"Valine",
+"Tryptophan",
+"Tyrosine"}};
+
+
+if (!SKIP_MODEL_PARAMETER_LIST)
+{
+	if (modelType == 1)
+	{
+		#include "defineGamma.mdl";
+	}
+	if (modelType == 2)
+	{
+		#include "defineHM.mdl";
+	}
+}
+
+function PopulateModelMatrix (ModelMatrixName&, EFV)
+{
+
+	ModelMatrixName = {20,20};
+	if (categoriesUsed)
+	{
+		for (k=0; k<19; k=k+1)
+		{
+			for (k2 = k+1; k2 < 20; k2=k2+1)
+			{
+				if (allowedMoves[k][k2])
+				{
+					subString = aaNames[k]+aaNames[k2];
+				}
+				else
+				{
+					subString = "MultiStep";
+				}
+				ExecuteCommands("global "+subString +"=1; ModelMatrixName[k][k2]:= c*t*"+subString+
+								";ModelMatrixName[k2][k]:= c*t*"+subString+";");
+			}
+		}       
+	}
+	else
+	{
+		for (k=0; k<19; k=k+1)
+		{
+			for (k2 = k+1; k2 < 20; k2=k2+1)
+			{
+				if (allowedMoves[k][k2])
+				{
+					subString = aaNames[k]+aaNames[k2];
+				}
+				else
+				{
+					subString = "MultiStep";
+				}
+				ExecuteCommands("global "+subString +"=1; ModelMatrixName[k][k2]:= t*"+subString+
+								";ModelMatrixName[k2][k]:= t*"+subString+";");
+			}
+		}       
+	}
+	
+	subString = aaNames[7]+aaNames[9];
+	ExecuteCommands(subString +":=1;");
+	return 1;
+}
+
+
+
+redREVMatrix = 0;
+
+HarvestFrequencies (vectorOfFrequencies,filteredData,1,1,0);
+
+MULTIPLY_BY_FREQS = PopulateModelMatrix ("redREVMatrix",vectorOfFrequencies);
+
+Model redREVModel = (redREVMatrix, vectorOfFrequencies, MULTIPLY_BY_FREQS);
+
+FREQUENCY_SENSITIVE = 1;
diff --git a/res/TemplateBatchFiles/TemplateModels/rtREV.mdl b/res/TemplateBatchFiles/TemplateModels/rtREV.mdl
new file mode 100644
index 0000000..0067b56
--- /dev/null
+++ b/res/TemplateBatchFiles/TemplateModels/rtREV.mdl
@@ -0,0 +1,813 @@
+#include "modelParameters2.mdl";
+
+if (!SKIP_MODEL_PARAMETER_LIST)
+{
+	if (modelType == 1)
+	{
+		#include "defineGamma.mdl";
+	}	
+	if (modelType == 2)
+	{
+		#include "defineHM.mdl";
+	}
+}
+function PopulateModelMatrix (ModelMatrixName&, EFV)
+{
+	ModelMatrixName = {20,20};
+	if (categoriesUsed)
+	{
+       ModelMatrixName[14][0]:=c*t*0.576271;
+ModelMatrixName[0][14]:=c*t*0.576271;
+ModelMatrixName[11][0]:=c*t*0.864407;
+ModelMatrixName[0][11]:=c*t*0.864407;
+ModelMatrixName[11][14]:=c*t*0.59322;
+ModelMatrixName[14][11]:=c*t*0.59322;
+ModelMatrixName[2][0]:=c*t*0.169492;
+ModelMatrixName[0][2]:=c*t*0.169492;
+ModelMatrixName[2][14]:=c*t*0.508475;
+ModelMatrixName[14][2]:=c*t*0.508475;
+ModelMatrixName[2][11]:=c*t*6.50847;
+ModelMatrixName[11][2]:=c*t*6.50847;
+ModelMatrixName[1][0]:=c*t*7.44068;
+ModelMatrixName[0][1]:=c*t*7.44068;
+ModelMatrixName[1][14]:=c*t*1.55932;
+ModelMatrixName[14][1]:=c*t*1.55932;
+ModelMatrixName[1][11]:=c*t*2.16949;
+ModelMatrixName[11][1]:=c*t*2.16949;
+ModelMatrixName[1][2]:=c*t*0.0169492;
+ModelMatrixName[2][1]:=c*t*0.0169492;
+ModelMatrixName[13][0]:=c*t*0.542373;
+ModelMatrixName[0][13]:=c*t*0.542373;
+ModelMatrixName[13][14]:=c*t*3.74576;
+ModelMatrixName[14][13]:=c*t*3.74576;
+ModelMatrixName[13][11]:=c*t*4;
+ModelMatrixName[11][13]:=c*t*4;
+ModelMatrixName[13][2]:=c*t*1.32203;
+ModelMatrixName[2][13]:=c*t*1.32203;
+ModelMatrixName[13][1]:=c*t*1.18644;
+ModelMatrixName[1][13]:=c*t*1.18644;
+ModelMatrixName[3][0]:=c*t*1.37288;
+ModelMatrixName[0][3]:=c*t*1.37288;
+ModelMatrixName[3][14]:=c*t*0.169492;
+ModelMatrixName[14][3]:=c*t*0.169492;
+ModelMatrixName[3][11]:=c*t*1.33898;
+ModelMatrixName[11][3]:=c*t*1.33898;
+ModelMatrixName[3][2]:=c*t*9.18644;
+ModelMatrixName[2][3]:=c*t*9.18644;
+ModelMatrixName[3][1]:=c*t*0.0169492;
+ModelMatrixName[1][3]:=c*t*0.0169492;
+ModelMatrixName[3][13]:=c*t*6.30508;
+ModelMatrixName[13][3]:=c*t*6.30508;
+ModelMatrixName[5][0]:=c*t*2.28814;
+ModelMatrixName[0][5]:=c*t*2.28814;
+ModelMatrixName[5][14]:=c*t*0.694915;
+ModelMatrixName[14][5]:=c*t*0.694915;
+ModelMatrixName[5][11]:=c*t*1.59322;
+ModelMatrixName[11][5]:=c*t*1.59322;
+ModelMatrixName[5][2]:=c*t*1.0339;
+ModelMatrixName[2][5]:=c*t*1.0339;
+ModelMatrixName[5][1]:=c*t*0.813559;
+ModelMatrixName[1][5]:=c*t*0.813559;
+ModelMatrixName[5][13]:=c*t*0.305085;
+ModelMatrixName[13][5]:=c*t*0.305085;
+ModelMatrixName[5][3]:=c*t*1.18644;
+ModelMatrixName[3][5]:=c*t*1.18644;
+ModelMatrixName[6][0]:=c*t*0.508475;
+ModelMatrixName[0][6]:=c*t*0.508475;
+ModelMatrixName[6][14]:=c*t*1.52542;
+ModelMatrixName[14][6]:=c*t*1.52542;
+ModelMatrixName[6][11]:=c*t*5.42373;
+ModelMatrixName[11][6]:=c*t*5.42373;
+ModelMatrixName[6][2]:=c*t*1.54237;
+ModelMatrixName[2][6]:=c*t*1.54237;
+ModelMatrixName[6][1]:=c*t*2.10169;
+ModelMatrixName[1][6]:=c*t*2.10169;
+ModelMatrixName[6][13]:=c*t*6.55932;
+ModelMatrixName[13][6]:=c*t*6.55932;
+ModelMatrixName[6][3]:=c*t*0.576271;
+ModelMatrixName[3][6]:=c*t*0.576271;
+ModelMatrixName[6][5]:=c*t*1.15254;
+ModelMatrixName[5][6]:=c*t*1.15254;
+ModelMatrixName[7][0]:=c*t*0.0169492;
+ModelMatrixName[0][7]:=c*t*0.0169492;
+ModelMatrixName[7][14]:=c*t*0.40678;
+ModelMatrixName[14][7]:=c*t*0.40678;
+ModelMatrixName[7][11]:=c*t*0.59322;
+ModelMatrixName[11][7]:=c*t*0.59322;
+ModelMatrixName[7][2]:=c*t*0.0169492;
+ModelMatrixName[2][7]:=c*t*0.0169492;
+ModelMatrixName[7][1]:=c*t*1.76271;
+ModelMatrixName[1][7]:=c*t*1.76271;
+ModelMatrixName[7][13]:=c*t*0.559322;
+ModelMatrixName[13][7]:=c*t*0.559322;
+ModelMatrixName[7][3]:=c*t*0.0169492;
+ModelMatrixName[3][7]:=c*t*0.0169492;
+ModelMatrixName[7][5]:=c*t*0.0169492;
+ModelMatrixName[5][7]:=c*t*0.0169492;
+ModelMatrixName[7][6]:=c*t*0.576271;
+ModelMatrixName[6][7]:=c*t*0.576271;
+ModelMatrixName[9][0]:=c*t*0.762712;
+ModelMatrixName[0][9]:=c*t*0.762712;
+ModelMatrixName[9][14]:=c*t*0.305085;
+ModelMatrixName[14][9]:=c*t*0.305085;
+ModelMatrixName[9][11]:=c*t*0.254237;
+ModelMatrixName[11][9]:=c*t*0.254237;
+ModelMatrixName[9][2]:=c*t*0.0847458;
+ModelMatrixName[2][9]:=c*t*0.0847458;
+ModelMatrixName[9][1]:=c*t*1.86441;
+ModelMatrixName[1][9]:=c*t*1.86441;
+ModelMatrixName[9][13]:=c*t*0.915254;
+ModelMatrixName[13][9]:=c*t*0.915254;
+ModelMatrixName[9][3]:=c*t*0.355932;
+ModelMatrixName[3][9]:=c*t*0.355932;
+ModelMatrixName[9][5]:=c*t*0.0508475;
+ModelMatrixName[5][9]:=c*t*0.0508475;
+ModelMatrixName[9][6]:=c*t*0.864407;
+ModelMatrixName[6][9]:=c*t*0.864407;
+ModelMatrixName[9][7]:=c*t*6.52542;
+ModelMatrixName[7][9]:=c*t*6.52542;
+ModelMatrixName[8][0]:=c*t*0.644068;
+ModelMatrixName[0][8]:=c*t*0.644068;
+ModelMatrixName[8][14]:=c*t*10.0508;
+ModelMatrixName[14][8]:=c*t*10.0508;
+ModelMatrixName[8][11]:=c*t*2.08475;
+ModelMatrixName[11][8]:=c*t*2.08475;
+ModelMatrixName[8][2]:=c*t*0.338983;
+ModelMatrixName[2][8]:=c*t*0.338983;
+ModelMatrixName[8][1]:=c*t*0.271186;
+ModelMatrixName[1][8]:=c*t*0.271186;
+ModelMatrixName[8][13]:=c*t*5.23729;
+ModelMatrixName[13][8]:=c*t*5.23729;
+ModelMatrixName[8][3]:=c*t*2.38983;
+ModelMatrixName[3][8]:=c*t*2.38983;
+ModelMatrixName[8][5]:=c*t*0.508475;
+ModelMatrixName[5][8]:=c*t*0.508475;
+ModelMatrixName[8][6]:=c*t*1.28814;
+ModelMatrixName[6][8]:=c*t*1.28814;
+ModelMatrixName[8][7]:=c*t*0.576271;
+ModelMatrixName[7][8]:=c*t*0.576271;
+ModelMatrixName[8][9]:=c*t*0.389831;
+ModelMatrixName[9][8]:=c*t*0.389831;
+ModelMatrixName[10][0]:=c*t*3.98305;
+ModelMatrixName[0][10]:=c*t*3.98305;
+ModelMatrixName[10][14]:=c*t*0.966102;
+ModelMatrixName[14][10]:=c*t*0.966102;
+ModelMatrixName[10][11]:=c*t*0.0169492;
+ModelMatrixName[11][10]:=c*t*0.0169492;
+ModelMatrixName[10][2]:=c*t*0.0169492;
+ModelMatrixName[2][10]:=c*t*0.0169492;
+ModelMatrixName[10][1]:=c*t*2.64407;
+ModelMatrixName[1][10]:=c*t*2.64407;
+ModelMatrixName[10][13]:=c*t*2.67797;
+ModelMatrixName[13][10]:=c*t*2.67797;
+ModelMatrixName[10][3]:=c*t*0.0169492;
+ModelMatrixName[3][10]:=c*t*0.0169492;
+ModelMatrixName[10][5]:=c*t*0.627119;
+ModelMatrixName[5][10]:=c*t*0.627119;
+ModelMatrixName[10][6]:=c*t*1.9661;
+ModelMatrixName[6][10]:=c*t*1.9661;
+ModelMatrixName[10][7]:=c*t*6.35593;
+ModelMatrixName[7][10]:=c*t*6.35593;
+ModelMatrixName[10][9]:=c*t*9.84746;
+ModelMatrixName[9][10]:=c*t*9.84746;
+ModelMatrixName[10][8]:=c*t*2.27119;
+ModelMatrixName[8][10]:=c*t*2.27119;
+ModelMatrixName[4][0]:=c*t*0.0169492;
+ModelMatrixName[0][4]:=c*t*0.0169492;
+ModelMatrixName[4][14]:=c*t*0.118644;
+ModelMatrixName[14][4]:=c*t*0.118644;
+ModelMatrixName[4][11]:=c*t*0.830508;
+ModelMatrixName[11][4]:=c*t*0.830508;
+ModelMatrixName[4][2]:=c*t*0.0169492;
+ModelMatrixName[2][4]:=c*t*0.0169492;
+ModelMatrixName[4][1]:=c*t*1.18644;
+ModelMatrixName[1][4]:=c*t*1.18644;
+ModelMatrixName[4][13]:=c*t*0.0169492;
+ModelMatrixName[13][4]:=c*t*0.0169492;
+ModelMatrixName[4][3]:=c*t*0.0169492;
+ModelMatrixName[3][4]:=c*t*0.0169492;
+ModelMatrixName[4][5]:=c*t*0.118644;
+ModelMatrixName[5][4]:=c*t*0.118644;
+ModelMatrixName[4][6]:=c*t*2.38983;
+ModelMatrixName[6][4]:=c*t*2.38983;
+ModelMatrixName[4][7]:=c*t*1.08475;
+ModelMatrixName[7][4]:=c*t*1.08475;
+ModelMatrixName[4][9]:=c*t*3.0339;
+ModelMatrixName[9][4]:=c*t*3.0339;
+ModelMatrixName[4][8]:=c*t*0.237288;
+ModelMatrixName[8][4]:=c*t*0.237288;
+ModelMatrixName[4][10]:=c*t*4.18644;
+ModelMatrixName[10][4]:=c*t*4.18644;
+ModelMatrixName[12][0]:=c*t*1.64407;
+ModelMatrixName[0][12]:=c*t*1.64407;
+ModelMatrixName[12][14]:=c*t*0.40678;
+ModelMatrixName[14][12]:=c*t*0.40678;
+ModelMatrixName[12][11]:=c*t*0.559322;
+ModelMatrixName[11][12]:=c*t*0.559322;
+ModelMatrixName[12][2]:=c*t*0.932203;
+ModelMatrixName[2][12]:=c*t*0.932203;
+ModelMatrixName[12][1]:=c*t*0.0169492;
+ModelMatrixName[1][12]:=c*t*0.0169492;
+ModelMatrixName[12][13]:=c*t*1.15254;
+ModelMatrixName[13][12]:=c*t*1.15254;
+ModelMatrixName[12][3]:=c*t*0.881356;
+ModelMatrixName[3][12]:=c*t*0.881356;
+ModelMatrixName[12][5]:=c*t*0.288136;
+ModelMatrixName[5][12]:=c*t*0.288136;
+ModelMatrixName[12][6]:=c*t*0.745763;
+ModelMatrixName[6][12]:=c*t*0.745763;
+ModelMatrixName[12][7]:=c*t*0.169492;
+ModelMatrixName[7][12]:=c*t*0.169492;
+ModelMatrixName[12][9]:=c*t*0.372881;
+ModelMatrixName[9][12]:=c*t*0.372881;
+ModelMatrixName[12][8]:=c*t*0.728814;
+ModelMatrixName[8][12]:=c*t*0.728814;
+ModelMatrixName[12][10]:=c*t*0.0169492;
+ModelMatrixName[10][12]:=c*t*0.0169492;
+ModelMatrixName[12][4]:=c*t*0.186441;
+ModelMatrixName[4][12]:=c*t*0.186441;
+ModelMatrixName[15][0]:=c*t*7.79661;
+ModelMatrixName[0][15]:=c*t*7.79661;
+ModelMatrixName[15][14]:=c*t*1.72881;
+ModelMatrixName[14][15]:=c*t*1.72881;
+ModelMatrixName[15][11]:=c*t*4.98305;
+ModelMatrixName[11][15]:=c*t*4.98305;
+ModelMatrixName[15][2]:=c*t*2.30508;
+ModelMatrixName[2][15]:=c*t*2.30508;
+ModelMatrixName[15][1]:=c*t*1.27119;
+ModelMatrixName[1][15]:=c*t*1.27119;
+ModelMatrixName[15][13]:=c*t*3.81356;
+ModelMatrixName[13][15]:=c*t*3.81356;
+ModelMatrixName[15][3]:=c*t*1.61017;
+ModelMatrixName[3][15]:=c*t*1.61017;
+ModelMatrixName[15][5]:=c*t*2.57627;
+ModelMatrixName[5][15]:=c*t*2.57627;
+ModelMatrixName[15][6]:=c*t*3.10169;
+ModelMatrixName[6][15]:=c*t*3.10169;
+ModelMatrixName[15][7]:=c*t*0.0677966;
+ModelMatrixName[7][15]:=c*t*0.0677966;
+ModelMatrixName[15][9]:=c*t*0.40678;
+ModelMatrixName[9][15]:=c*t*0.40678;
+ModelMatrixName[15][8]:=c*t*1.30508;
+ModelMatrixName[8][15]:=c*t*1.30508;
+ModelMatrixName[15][10]:=c*t*0.0169492;
+ModelMatrixName[10][15]:=c*t*0.0169492;
+ModelMatrixName[15][4]:=c*t*0.338983;
+ModelMatrixName[4][15]:=c*t*0.338983;
+ModelMatrixName[15][12]:=c*t*2.27119;
+ModelMatrixName[12][15]:=c*t*2.27119;
+ModelMatrixName[16][0]:=c*t*4.37288;
+ModelMatrixName[0][16]:=c*t*4.37288;
+ModelMatrixName[16][14]:=c*t*1.08475;
+ModelMatrixName[14][16]:=c*t*1.08475;
+ModelMatrixName[16][11]:=c*t*2.50847;
+ModelMatrixName[11][16]:=c*t*2.50847;
+ModelMatrixName[16][2]:=c*t*0.932203;
+ModelMatrixName[2][16]:=c*t*0.932203;
+ModelMatrixName[16][1]:=c*t*1.98305;
+ModelMatrixName[1][16]:=c*t*1.98305;
+ModelMatrixName[16][13]:=c*t*2.47458;
+ModelMatrixName[13][16]:=c*t*2.47458;
+ModelMatrixName[16][3]:=c*t*1.38983;
+ModelMatrixName[3][16]:=c*t*1.38983;
+ModelMatrixName[16][5]:=c*t*0.118644;
+ModelMatrixName[5][16]:=c*t*0.118644;
+ModelMatrixName[16][6]:=c*t*0.830508;
+ModelMatrixName[6][16]:=c*t*0.830508;
+ModelMatrixName[16][7]:=c*t*1.22034;
+ModelMatrixName[7][16]:=c*t*1.22034;
+ModelMatrixName[16][9]:=c*t*0.423729;
+ModelMatrixName[9][16]:=c*t*0.423729;
+ModelMatrixName[16][8]:=c*t*1.86441;
+ModelMatrixName[8][16]:=c*t*1.86441;
+ModelMatrixName[16][10]:=c*t*2.22034;
+ModelMatrixName[10][16]:=c*t*2.22034;
+ModelMatrixName[16][4]:=c*t*1.16949;
+ModelMatrixName[4][16]:=c*t*1.16949;
+ModelMatrixName[16][12]:=c*t*1.05085;
+ModelMatrixName[12][16]:=c*t*1.05085;
+ModelMatrixName[16][15]:=c*t*11.3729;
+ModelMatrixName[15][16]:=c*t*11.3729;
+ModelMatrixName[18][0]:=c*t*0.0847458;
+ModelMatrixName[0][18]:=c*t*0.0847458;
+ModelMatrixName[18][14]:=c*t*0.220339;
+ModelMatrixName[14][18]:=c*t*0.220339;
+ModelMatrixName[18][11]:=c*t*0.271186;
+ModelMatrixName[11][18]:=c*t*0.271186;
+ModelMatrixName[18][2]:=c*t*0.0169492;
+ModelMatrixName[2][18]:=c*t*0.0169492;
+ModelMatrixName[18][1]:=c*t*0.932203;
+ModelMatrixName[1][18]:=c*t*0.932203;
+ModelMatrixName[18][13]:=c*t*0.169492;
+ModelMatrixName[13][18]:=c*t*0.169492;
+ModelMatrixName[18][3]:=c*t*0.288136;
+ModelMatrixName[3][18]:=c*t*0.288136;
+ModelMatrixName[18][5]:=c*t*0.389831;
+ModelMatrixName[5][18]:=c*t*0.389831;
+ModelMatrixName[18][6]:=c*t*0.813559;
+ModelMatrixName[6][18]:=c*t*0.813559;
+ModelMatrixName[18][7]:=c*t*0.661017;
+ModelMatrixName[7][18]:=c*t*0.661017;
+ModelMatrixName[18][9]:=c*t*0.79661;
+ModelMatrixName[9][18]:=c*t*0.79661;
+ModelMatrixName[18][8]:=c*t*0.101695;
+ModelMatrixName[8][18]:=c*t*0.101695;
+ModelMatrixName[18][10]:=c*t*1.88136;
+ModelMatrixName[10][18]:=c*t*1.88136;
+ModelMatrixName[18][4]:=c*t*3.08475;
+ModelMatrixName[4][18]:=c*t*3.08475;
+ModelMatrixName[18][12]:=c*t*0.152542;
+ModelMatrixName[12][18]:=c*t*0.152542;
+ModelMatrixName[18][15]:=c*t*0.237288;
+ModelMatrixName[15][18]:=c*t*0.237288;
+ModelMatrixName[18][16]:=c*t*0.0169492;
+ModelMatrixName[16][18]:=c*t*0.0169492;
+ModelMatrixName[19][0]:=c*t*0.932203;
+ModelMatrixName[0][19]:=c*t*0.932203;
+ModelMatrixName[19][14]:=c*t*0.79661;
+ModelMatrixName[14][19]:=c*t*0.79661;
+ModelMatrixName[19][11]:=c*t*0.474576;
+ModelMatrixName[11][19]:=c*t*0.474576;
+ModelMatrixName[19][2]:=c*t*0.0169492;
+ModelMatrixName[2][19]:=c*t*0.0169492;
+ModelMatrixName[19][1]:=c*t*2.22034;
+ModelMatrixName[1][19]:=c*t*2.22034;
+ModelMatrixName[19][13]:=c*t*0.762712;
+ModelMatrixName[13][19]:=c*t*0.762712;
+ModelMatrixName[19][3]:=c*t*0.0169492;
+ModelMatrixName[3][19]:=c*t*0.0169492;
+ModelMatrixName[19][5]:=c*t*0.355932;
+ModelMatrixName[5][19]:=c*t*0.355932;
+ModelMatrixName[19][6]:=c*t*5.20339;
+ModelMatrixName[6][19]:=c*t*5.20339;
+ModelMatrixName[19][7]:=c*t*0.440678;
+ModelMatrixName[7][19]:=c*t*0.440678;
+ModelMatrixName[19][9]:=c*t*1.08475;
+ModelMatrixName[9][19]:=c*t*1.08475;
+ModelMatrixName[19][8]:=c*t*0.0169492;
+ModelMatrixName[8][19]:=c*t*0.0169492;
+ModelMatrixName[19][10]:=c*t*1.25424;
+ModelMatrixName[10][19]:=c*t*1.25424;
+ModelMatrixName[19][4]:=c*t*17.2373;
+ModelMatrixName[4][19]:=c*t*17.2373;
+ModelMatrixName[19][12]:=c*t*0.237288;
+ModelMatrixName[12][19]:=c*t*0.237288;
+ModelMatrixName[19][15]:=c*t*0.525424;
+ModelMatrixName[15][19]:=c*t*0.525424;
+ModelMatrixName[19][16]:=c*t*0.576271;
+ModelMatrixName[16][19]:=c*t*0.576271;
+ModelMatrixName[19][18]:=c*t*2.98305;
+ModelMatrixName[18][19]:=c*t*2.98305;
+ModelMatrixName[17][0]:=c*t*3.33898;
+ModelMatrixName[0][17]:=c*t*3.33898;
+ModelMatrixName[17][14]:=c*t*0.491525;
+ModelMatrixName[14][17]:=c*t*0.491525;
+ModelMatrixName[17][11]:=c*t*0.355932;
+ModelMatrixName[11][17]:=c*t*0.355932;
+ModelMatrixName[17][2]:=c*t*0.101695;
+ModelMatrixName[2][17]:=c*t*0.101695;
+ModelMatrixName[17][1]:=c*t*5;
+ModelMatrixName[1][17]:=c*t*5;
+ModelMatrixName[17][13]:=c*t*0.610169;
+ModelMatrixName[13][17]:=c*t*0.610169;
+ModelMatrixName[17][3]:=c*t*0.59322;
+ModelMatrixName[3][17]:=c*t*0.59322;
+ModelMatrixName[17][5]:=c*t*0.0508475;
+ModelMatrixName[5][17]:=c*t*0.0508475;
+ModelMatrixName[17][6]:=c*t*0.0169492;
+ModelMatrixName[6][17]:=c*t*0.0169492;
+ModelMatrixName[17][7]:=c*t*17.7627;
+ModelMatrixName[7][17]:=c*t*17.7627;
+ModelMatrixName[17][9]:=c*t*1.89831;
+ModelMatrixName[9][17]:=c*t*1.89831;
+ModelMatrixName[17][8]:=c*t*0.322034;
+ModelMatrixName[8][17]:=c*t*0.322034;
+ModelMatrixName[17][10]:=c*t*4;
+ModelMatrixName[10][17]:=c*t*4;
+ModelMatrixName[17][4]:=c*t*1.55932;
+ModelMatrixName[4][17]:=c*t*1.55932;
+ModelMatrixName[17][12]:=c*t*0.423729;
+ModelMatrixName[12][17]:=c*t*0.423729;
+ModelMatrixName[17][15]:=c*t*0.661017;
+ModelMatrixName[15][17]:=c*t*0.661017;
+ModelMatrixName[17][16]:=c*t*3.32203;
+ModelMatrixName[16][17]:=c*t*3.32203;
+ModelMatrixName[17][18]:=c*t*0.440678;
+ModelMatrixName[18][17]:=c*t*0.440678;
+ModelMatrixName[17][19]:=c*t*1;
+ModelMatrixName[19][17]:=c*t*1;
+	}
+	else
+	{
+       ModelMatrixName[14][0]:=t*0.576271;
+ModelMatrixName[0][14]:=t*0.576271;
+ModelMatrixName[11][0]:=t*0.864407;
+ModelMatrixName[0][11]:=t*0.864407;
+ModelMatrixName[11][14]:=t*0.59322;
+ModelMatrixName[14][11]:=t*0.59322;
+ModelMatrixName[2][0]:=t*0.169492;
+ModelMatrixName[0][2]:=t*0.169492;
+ModelMatrixName[2][14]:=t*0.508475;
+ModelMatrixName[14][2]:=t*0.508475;
+ModelMatrixName[2][11]:=t*6.50847;
+ModelMatrixName[11][2]:=t*6.50847;
+ModelMatrixName[1][0]:=t*7.44068;
+ModelMatrixName[0][1]:=t*7.44068;
+ModelMatrixName[1][14]:=t*1.55932;
+ModelMatrixName[14][1]:=t*1.55932;
+ModelMatrixName[1][11]:=t*2.16949;
+ModelMatrixName[11][1]:=t*2.16949;
+ModelMatrixName[1][2]:=t*0.0169492;
+ModelMatrixName[2][1]:=t*0.0169492;
+ModelMatrixName[13][0]:=t*0.542373;
+ModelMatrixName[0][13]:=t*0.542373;
+ModelMatrixName[13][14]:=t*3.74576;
+ModelMatrixName[14][13]:=t*3.74576;
+ModelMatrixName[13][11]:=t*4;
+ModelMatrixName[11][13]:=t*4;
+ModelMatrixName[13][2]:=t*1.32203;
+ModelMatrixName[2][13]:=t*1.32203;
+ModelMatrixName[13][1]:=t*1.18644;
+ModelMatrixName[1][13]:=t*1.18644;
+ModelMatrixName[3][0]:=t*1.37288;
+ModelMatrixName[0][3]:=t*1.37288;
+ModelMatrixName[3][14]:=t*0.169492;
+ModelMatrixName[14][3]:=t*0.169492;
+ModelMatrixName[3][11]:=t*1.33898;
+ModelMatrixName[11][3]:=t*1.33898;
+ModelMatrixName[3][2]:=t*9.18644;
+ModelMatrixName[2][3]:=t*9.18644;
+ModelMatrixName[3][1]:=t*0.0169492;
+ModelMatrixName[1][3]:=t*0.0169492;
+ModelMatrixName[3][13]:=t*6.30508;
+ModelMatrixName[13][3]:=t*6.30508;
+ModelMatrixName[5][0]:=t*2.28814;
+ModelMatrixName[0][5]:=t*2.28814;
+ModelMatrixName[5][14]:=t*0.694915;
+ModelMatrixName[14][5]:=t*0.694915;
+ModelMatrixName[5][11]:=t*1.59322;
+ModelMatrixName[11][5]:=t*1.59322;
+ModelMatrixName[5][2]:=t*1.0339;
+ModelMatrixName[2][5]:=t*1.0339;
+ModelMatrixName[5][1]:=t*0.813559;
+ModelMatrixName[1][5]:=t*0.813559;
+ModelMatrixName[5][13]:=t*0.305085;
+ModelMatrixName[13][5]:=t*0.305085;
+ModelMatrixName[5][3]:=t*1.18644;
+ModelMatrixName[3][5]:=t*1.18644;
+ModelMatrixName[6][0]:=t*0.508475;
+ModelMatrixName[0][6]:=t*0.508475;
+ModelMatrixName[6][14]:=t*1.52542;
+ModelMatrixName[14][6]:=t*1.52542;
+ModelMatrixName[6][11]:=t*5.42373;
+ModelMatrixName[11][6]:=t*5.42373;
+ModelMatrixName[6][2]:=t*1.54237;
+ModelMatrixName[2][6]:=t*1.54237;
+ModelMatrixName[6][1]:=t*2.10169;
+ModelMatrixName[1][6]:=t*2.10169;
+ModelMatrixName[6][13]:=t*6.55932;
+ModelMatrixName[13][6]:=t*6.55932;
+ModelMatrixName[6][3]:=t*0.576271;
+ModelMatrixName[3][6]:=t*0.576271;
+ModelMatrixName[6][5]:=t*1.15254;
+ModelMatrixName[5][6]:=t*1.15254;
+ModelMatrixName[7][0]:=t*0.0169492;
+ModelMatrixName[0][7]:=t*0.0169492;
+ModelMatrixName[7][14]:=t*0.40678;
+ModelMatrixName[14][7]:=t*0.40678;
+ModelMatrixName[7][11]:=t*0.59322;
+ModelMatrixName[11][7]:=t*0.59322;
+ModelMatrixName[7][2]:=t*0.0169492;
+ModelMatrixName[2][7]:=t*0.0169492;
+ModelMatrixName[7][1]:=t*1.76271;
+ModelMatrixName[1][7]:=t*1.76271;
+ModelMatrixName[7][13]:=t*0.559322;
+ModelMatrixName[13][7]:=t*0.559322;
+ModelMatrixName[7][3]:=t*0.0169492;
+ModelMatrixName[3][7]:=t*0.0169492;
+ModelMatrixName[7][5]:=t*0.0169492;
+ModelMatrixName[5][7]:=t*0.0169492;
+ModelMatrixName[7][6]:=t*0.576271;
+ModelMatrixName[6][7]:=t*0.576271;
+ModelMatrixName[9][0]:=t*0.762712;
+ModelMatrixName[0][9]:=t*0.762712;
+ModelMatrixName[9][14]:=t*0.305085;
+ModelMatrixName[14][9]:=t*0.305085;
+ModelMatrixName[9][11]:=t*0.254237;
+ModelMatrixName[11][9]:=t*0.254237;
+ModelMatrixName[9][2]:=t*0.0847458;
+ModelMatrixName[2][9]:=t*0.0847458;
+ModelMatrixName[9][1]:=t*1.86441;
+ModelMatrixName[1][9]:=t*1.86441;
+ModelMatrixName[9][13]:=t*0.915254;
+ModelMatrixName[13][9]:=t*0.915254;
+ModelMatrixName[9][3]:=t*0.355932;
+ModelMatrixName[3][9]:=t*0.355932;
+ModelMatrixName[9][5]:=t*0.0508475;
+ModelMatrixName[5][9]:=t*0.0508475;
+ModelMatrixName[9][6]:=t*0.864407;
+ModelMatrixName[6][9]:=t*0.864407;
+ModelMatrixName[9][7]:=t*6.52542;
+ModelMatrixName[7][9]:=t*6.52542;
+ModelMatrixName[8][0]:=t*0.644068;
+ModelMatrixName[0][8]:=t*0.644068;
+ModelMatrixName[8][14]:=t*10.0508;
+ModelMatrixName[14][8]:=t*10.0508;
+ModelMatrixName[8][11]:=t*2.08475;
+ModelMatrixName[11][8]:=t*2.08475;
+ModelMatrixName[8][2]:=t*0.338983;
+ModelMatrixName[2][8]:=t*0.338983;
+ModelMatrixName[8][1]:=t*0.271186;
+ModelMatrixName[1][8]:=t*0.271186;
+ModelMatrixName[8][13]:=t*5.23729;
+ModelMatrixName[13][8]:=t*5.23729;
+ModelMatrixName[8][3]:=t*2.38983;
+ModelMatrixName[3][8]:=t*2.38983;
+ModelMatrixName[8][5]:=t*0.508475;
+ModelMatrixName[5][8]:=t*0.508475;
+ModelMatrixName[8][6]:=t*1.28814;
+ModelMatrixName[6][8]:=t*1.28814;
+ModelMatrixName[8][7]:=t*0.576271;
+ModelMatrixName[7][8]:=t*0.576271;
+ModelMatrixName[8][9]:=t*0.389831;
+ModelMatrixName[9][8]:=t*0.389831;
+ModelMatrixName[10][0]:=t*3.98305;
+ModelMatrixName[0][10]:=t*3.98305;
+ModelMatrixName[10][14]:=t*0.966102;
+ModelMatrixName[14][10]:=t*0.966102;
+ModelMatrixName[10][11]:=t*0.0169492;
+ModelMatrixName[11][10]:=t*0.0169492;
+ModelMatrixName[10][2]:=t*0.0169492;
+ModelMatrixName[2][10]:=t*0.0169492;
+ModelMatrixName[10][1]:=t*2.64407;
+ModelMatrixName[1][10]:=t*2.64407;
+ModelMatrixName[10][13]:=t*2.67797;
+ModelMatrixName[13][10]:=t*2.67797;
+ModelMatrixName[10][3]:=t*0.0169492;
+ModelMatrixName[3][10]:=t*0.0169492;
+ModelMatrixName[10][5]:=t*0.627119;
+ModelMatrixName[5][10]:=t*0.627119;
+ModelMatrixName[10][6]:=t*1.9661;
+ModelMatrixName[6][10]:=t*1.9661;
+ModelMatrixName[10][7]:=t*6.35593;
+ModelMatrixName[7][10]:=t*6.35593;
+ModelMatrixName[10][9]:=t*9.84746;
+ModelMatrixName[9][10]:=t*9.84746;
+ModelMatrixName[10][8]:=t*2.27119;
+ModelMatrixName[8][10]:=t*2.27119;
+ModelMatrixName[4][0]:=t*0.0169492;
+ModelMatrixName[0][4]:=t*0.0169492;
+ModelMatrixName[4][14]:=t*0.118644;
+ModelMatrixName[14][4]:=t*0.118644;
+ModelMatrixName[4][11]:=t*0.830508;
+ModelMatrixName[11][4]:=t*0.830508;
+ModelMatrixName[4][2]:=t*0.0169492;
+ModelMatrixName[2][4]:=t*0.0169492;
+ModelMatrixName[4][1]:=t*1.18644;
+ModelMatrixName[1][4]:=t*1.18644;
+ModelMatrixName[4][13]:=t*0.0169492;
+ModelMatrixName[13][4]:=t*0.0169492;
+ModelMatrixName[4][3]:=t*0.0169492;
+ModelMatrixName[3][4]:=t*0.0169492;
+ModelMatrixName[4][5]:=t*0.118644;
+ModelMatrixName[5][4]:=t*0.118644;
+ModelMatrixName[4][6]:=t*2.38983;
+ModelMatrixName[6][4]:=t*2.38983;
+ModelMatrixName[4][7]:=t*1.08475;
+ModelMatrixName[7][4]:=t*1.08475;
+ModelMatrixName[4][9]:=t*3.0339;
+ModelMatrixName[9][4]:=t*3.0339;
+ModelMatrixName[4][8]:=t*0.237288;
+ModelMatrixName[8][4]:=t*0.237288;
+ModelMatrixName[4][10]:=t*4.18644;
+ModelMatrixName[10][4]:=t*4.18644;
+ModelMatrixName[12][0]:=t*1.64407;
+ModelMatrixName[0][12]:=t*1.64407;
+ModelMatrixName[12][14]:=t*0.40678;
+ModelMatrixName[14][12]:=t*0.40678;
+ModelMatrixName[12][11]:=t*0.559322;
+ModelMatrixName[11][12]:=t*0.559322;
+ModelMatrixName[12][2]:=t*0.932203;
+ModelMatrixName[2][12]:=t*0.932203;
+ModelMatrixName[12][1]:=t*0.0169492;
+ModelMatrixName[1][12]:=t*0.0169492;
+ModelMatrixName[12][13]:=t*1.15254;
+ModelMatrixName[13][12]:=t*1.15254;
+ModelMatrixName[12][3]:=t*0.881356;
+ModelMatrixName[3][12]:=t*0.881356;
+ModelMatrixName[12][5]:=t*0.288136;
+ModelMatrixName[5][12]:=t*0.288136;
+ModelMatrixName[12][6]:=t*0.745763;
+ModelMatrixName[6][12]:=t*0.745763;
+ModelMatrixName[12][7]:=t*0.169492;
+ModelMatrixName[7][12]:=t*0.169492;
+ModelMatrixName[12][9]:=t*0.372881;
+ModelMatrixName[9][12]:=t*0.372881;
+ModelMatrixName[12][8]:=t*0.728814;
+ModelMatrixName[8][12]:=t*0.728814;
+ModelMatrixName[12][10]:=t*0.0169492;
+ModelMatrixName[10][12]:=t*0.0169492;
+ModelMatrixName[12][4]:=t*0.186441;
+ModelMatrixName[4][12]:=t*0.186441;
+ModelMatrixName[15][0]:=t*7.79661;
+ModelMatrixName[0][15]:=t*7.79661;
+ModelMatrixName[15][14]:=t*1.72881;
+ModelMatrixName[14][15]:=t*1.72881;
+ModelMatrixName[15][11]:=t*4.98305;
+ModelMatrixName[11][15]:=t*4.98305;
+ModelMatrixName[15][2]:=t*2.30508;
+ModelMatrixName[2][15]:=t*2.30508;
+ModelMatrixName[15][1]:=t*1.27119;
+ModelMatrixName[1][15]:=t*1.27119;
+ModelMatrixName[15][13]:=t*3.81356;
+ModelMatrixName[13][15]:=t*3.81356;
+ModelMatrixName[15][3]:=t*1.61017;
+ModelMatrixName[3][15]:=t*1.61017;
+ModelMatrixName[15][5]:=t*2.57627;
+ModelMatrixName[5][15]:=t*2.57627;
+ModelMatrixName[15][6]:=t*3.10169;
+ModelMatrixName[6][15]:=t*3.10169;
+ModelMatrixName[15][7]:=t*0.0677966;
+ModelMatrixName[7][15]:=t*0.0677966;
+ModelMatrixName[15][9]:=t*0.40678;
+ModelMatrixName[9][15]:=t*0.40678;
+ModelMatrixName[15][8]:=t*1.30508;
+ModelMatrixName[8][15]:=t*1.30508;
+ModelMatrixName[15][10]:=t*0.0169492;
+ModelMatrixName[10][15]:=t*0.0169492;
+ModelMatrixName[15][4]:=t*0.338983;
+ModelMatrixName[4][15]:=t*0.338983;
+ModelMatrixName[15][12]:=t*2.27119;
+ModelMatrixName[12][15]:=t*2.27119;
+ModelMatrixName[16][0]:=t*4.37288;
+ModelMatrixName[0][16]:=t*4.37288;
+ModelMatrixName[16][14]:=t*1.08475;
+ModelMatrixName[14][16]:=t*1.08475;
+ModelMatrixName[16][11]:=t*2.50847;
+ModelMatrixName[11][16]:=t*2.50847;
+ModelMatrixName[16][2]:=t*0.932203;
+ModelMatrixName[2][16]:=t*0.932203;
+ModelMatrixName[16][1]:=t*1.98305;
+ModelMatrixName[1][16]:=t*1.98305;
+ModelMatrixName[16][13]:=t*2.47458;
+ModelMatrixName[13][16]:=t*2.47458;
+ModelMatrixName[16][3]:=t*1.38983;
+ModelMatrixName[3][16]:=t*1.38983;
+ModelMatrixName[16][5]:=t*0.118644;
+ModelMatrixName[5][16]:=t*0.118644;
+ModelMatrixName[16][6]:=t*0.830508;
+ModelMatrixName[6][16]:=t*0.830508;
+ModelMatrixName[16][7]:=t*1.22034;
+ModelMatrixName[7][16]:=t*1.22034;
+ModelMatrixName[16][9]:=t*0.423729;
+ModelMatrixName[9][16]:=t*0.423729;
+ModelMatrixName[16][8]:=t*1.86441;
+ModelMatrixName[8][16]:=t*1.86441;
+ModelMatrixName[16][10]:=t*2.22034;
+ModelMatrixName[10][16]:=t*2.22034;
+ModelMatrixName[16][4]:=t*1.16949;
+ModelMatrixName[4][16]:=t*1.16949;
+ModelMatrixName[16][12]:=t*1.05085;
+ModelMatrixName[12][16]:=t*1.05085;
+ModelMatrixName[16][15]:=t*11.3729;
+ModelMatrixName[15][16]:=t*11.3729;
+ModelMatrixName[18][0]:=t*0.0847458;
+ModelMatrixName[0][18]:=t*0.0847458;
+ModelMatrixName[18][14]:=t*0.220339;
+ModelMatrixName[14][18]:=t*0.220339;
+ModelMatrixName[18][11]:=t*0.271186;
+ModelMatrixName[11][18]:=t*0.271186;
+ModelMatrixName[18][2]:=t*0.0169492;
+ModelMatrixName[2][18]:=t*0.0169492;
+ModelMatrixName[18][1]:=t*0.932203;
+ModelMatrixName[1][18]:=t*0.932203;
+ModelMatrixName[18][13]:=t*0.169492;
+ModelMatrixName[13][18]:=t*0.169492;
+ModelMatrixName[18][3]:=t*0.288136;
+ModelMatrixName[3][18]:=t*0.288136;
+ModelMatrixName[18][5]:=t*0.389831;
+ModelMatrixName[5][18]:=t*0.389831;
+ModelMatrixName[18][6]:=t*0.813559;
+ModelMatrixName[6][18]:=t*0.813559;
+ModelMatrixName[18][7]:=t*0.661017;
+ModelMatrixName[7][18]:=t*0.661017;
+ModelMatrixName[18][9]:=t*0.79661;
+ModelMatrixName[9][18]:=t*0.79661;
+ModelMatrixName[18][8]:=t*0.101695;
+ModelMatrixName[8][18]:=t*0.101695;
+ModelMatrixName[18][10]:=t*1.88136;
+ModelMatrixName[10][18]:=t*1.88136;
+ModelMatrixName[18][4]:=t*3.08475;
+ModelMatrixName[4][18]:=t*3.08475;
+ModelMatrixName[18][12]:=t*0.152542;
+ModelMatrixName[12][18]:=t*0.152542;
+ModelMatrixName[18][15]:=t*0.237288;
+ModelMatrixName[15][18]:=t*0.237288;
+ModelMatrixName[18][16]:=t*0.0169492;
+ModelMatrixName[16][18]:=t*0.0169492;
+ModelMatrixName[19][0]:=t*0.932203;
+ModelMatrixName[0][19]:=t*0.932203;
+ModelMatrixName[19][14]:=t*0.79661;
+ModelMatrixName[14][19]:=t*0.79661;
+ModelMatrixName[19][11]:=t*0.474576;
+ModelMatrixName[11][19]:=t*0.474576;
+ModelMatrixName[19][2]:=t*0.0169492;
+ModelMatrixName[2][19]:=t*0.0169492;
+ModelMatrixName[19][1]:=t*2.22034;
+ModelMatrixName[1][19]:=t*2.22034;
+ModelMatrixName[19][13]:=t*0.762712;
+ModelMatrixName[13][19]:=t*0.762712;
+ModelMatrixName[19][3]:=t*0.0169492;
+ModelMatrixName[3][19]:=t*0.0169492;
+ModelMatrixName[19][5]:=t*0.355932;
+ModelMatrixName[5][19]:=t*0.355932;
+ModelMatrixName[19][6]:=t*5.20339;
+ModelMatrixName[6][19]:=t*5.20339;
+ModelMatrixName[19][7]:=t*0.440678;
+ModelMatrixName[7][19]:=t*0.440678;
+ModelMatrixName[19][9]:=t*1.08475;
+ModelMatrixName[9][19]:=t*1.08475;
+ModelMatrixName[19][8]:=t*0.0169492;
+ModelMatrixName[8][19]:=t*0.0169492;
+ModelMatrixName[19][10]:=t*1.25424;
+ModelMatrixName[10][19]:=t*1.25424;
+ModelMatrixName[19][4]:=t*17.2373;
+ModelMatrixName[4][19]:=t*17.2373;
+ModelMatrixName[19][12]:=t*0.237288;
+ModelMatrixName[12][19]:=t*0.237288;
+ModelMatrixName[19][15]:=t*0.525424;
+ModelMatrixName[15][19]:=t*0.525424;
+ModelMatrixName[19][16]:=t*0.576271;
+ModelMatrixName[16][19]:=t*0.576271;
+ModelMatrixName[19][18]:=t*2.98305;
+ModelMatrixName[18][19]:=t*2.98305;
+ModelMatrixName[17][0]:=t*3.33898;
+ModelMatrixName[0][17]:=t*3.33898;
+ModelMatrixName[17][14]:=t*0.491525;
+ModelMatrixName[14][17]:=t*0.491525;
+ModelMatrixName[17][11]:=t*0.355932;
+ModelMatrixName[11][17]:=t*0.355932;
+ModelMatrixName[17][2]:=t*0.101695;
+ModelMatrixName[2][17]:=t*0.101695;
+ModelMatrixName[17][1]:=t*5;
+ModelMatrixName[1][17]:=t*5;
+ModelMatrixName[17][13]:=t*0.610169;
+ModelMatrixName[13][17]:=t*0.610169;
+ModelMatrixName[17][3]:=t*0.59322;
+ModelMatrixName[3][17]:=t*0.59322;
+ModelMatrixName[17][5]:=t*0.0508475;
+ModelMatrixName[5][17]:=t*0.0508475;
+ModelMatrixName[17][6]:=t*0.0169492;
+ModelMatrixName[6][17]:=t*0.0169492;
+ModelMatrixName[17][7]:=t*17.7627;
+ModelMatrixName[7][17]:=t*17.7627;
+ModelMatrixName[17][9]:=t*1.89831;
+ModelMatrixName[9][17]:=t*1.89831;
+ModelMatrixName[17][8]:=t*0.322034;
+ModelMatrixName[8][17]:=t*0.322034;
+ModelMatrixName[17][10]:=t*4;
+ModelMatrixName[10][17]:=t*4;
+ModelMatrixName[17][4]:=t*1.55932;
+ModelMatrixName[4][17]:=t*1.55932;
+ModelMatrixName[17][12]:=t*0.423729;
+ModelMatrixName[12][17]:=t*0.423729;
+ModelMatrixName[17][15]:=t*0.661017;
+ModelMatrixName[15][17]:=t*0.661017;
+ModelMatrixName[17][16]:=t*3.32203;
+ModelMatrixName[16][17]:=t*3.32203;
+ModelMatrixName[17][18]:=t*0.440678;
+ModelMatrixName[18][17]:=t*0.440678;
+ModelMatrixName[17][19]:=t*1;
+ModelMatrixName[19][17]:=t*1;
+
+	}
+	return 1;
+}
+
+equalFreqs={20,1};
+
+equalFreqs[0]=0.0646;
+equalFreqs[14]=0.0453;
+equalFreqs[11]=0.0376;
+equalFreqs[2]=0.0422;
+equalFreqs[1]=0.0114;
+equalFreqs[13]=0.0606;
+equalFreqs[3]=0.0607;
+equalFreqs[5]=0.0639;
+equalFreqs[6]=0.0273;
+equalFreqs[7]=0.0679;
+equalFreqs[9]=0.1018;
+equalFreqs[8]=0.0751;
+equalFreqs[10]=0.015;
+equalFreqs[4]=0.0287;
+equalFreqs[12]=0.0681;
+equalFreqs[15]=0.0488;
+equalFreqs[16]=0.0622;
+equalFreqs[18]=0.0251;
+equalFreqs[19]=0.0318;
+equalFreqs[17]=0.0619;
+
+rtREVMatrix = 0;
+MULTIPLY_BY_FREQS = PopulateModelMatrix ("rtREVMatrix",equalFreqs);
+Model rtREVModel = (rtREVMatrix, equalFreqs, MULTIPLY_BY_FREQS);
+FREQUENCY_SENSITIVE = 0;
diff --git a/res/TemplateBatchFiles/TemplateModels/rtREV_F.mdl b/res/TemplateBatchFiles/TemplateModels/rtREV_F.mdl
new file mode 100644
index 0000000..402299a
--- /dev/null
+++ b/res/TemplateBatchFiles/TemplateModels/rtREV_F.mdl
@@ -0,0 +1,794 @@
+#include "modelParameters2.mdl";
+
+if (!SKIP_MODEL_PARAMETER_LIST)
+{
+	if (modelType == 1)
+	{
+		#include "defineGamma.mdl";
+	}	
+	if (modelType == 2)
+	{
+		#include "defineHM.mdl";
+	}
+}
+
+function PopulateModelMatrix (ModelMatrixName&, EFV)
+{
+	ModelMatrixName = {20,20};
+	if (categoriesUsed)
+	{
+       ModelMatrixName[14][0]:=c*t*0.576271;
+ModelMatrixName[0][14]:=c*t*0.576271;
+ModelMatrixName[11][0]:=c*t*0.864407;
+ModelMatrixName[0][11]:=c*t*0.864407;
+ModelMatrixName[11][14]:=c*t*0.59322;
+ModelMatrixName[14][11]:=c*t*0.59322;
+ModelMatrixName[2][0]:=c*t*0.169492;
+ModelMatrixName[0][2]:=c*t*0.169492;
+ModelMatrixName[2][14]:=c*t*0.508475;
+ModelMatrixName[14][2]:=c*t*0.508475;
+ModelMatrixName[2][11]:=c*t*6.50847;
+ModelMatrixName[11][2]:=c*t*6.50847;
+ModelMatrixName[1][0]:=c*t*7.44068;
+ModelMatrixName[0][1]:=c*t*7.44068;
+ModelMatrixName[1][14]:=c*t*1.55932;
+ModelMatrixName[14][1]:=c*t*1.55932;
+ModelMatrixName[1][11]:=c*t*2.16949;
+ModelMatrixName[11][1]:=c*t*2.16949;
+ModelMatrixName[1][2]:=c*t*0.0169492;
+ModelMatrixName[2][1]:=c*t*0.0169492;
+ModelMatrixName[13][0]:=c*t*0.542373;
+ModelMatrixName[0][13]:=c*t*0.542373;
+ModelMatrixName[13][14]:=c*t*3.74576;
+ModelMatrixName[14][13]:=c*t*3.74576;
+ModelMatrixName[13][11]:=c*t*4;
+ModelMatrixName[11][13]:=c*t*4;
+ModelMatrixName[13][2]:=c*t*1.32203;
+ModelMatrixName[2][13]:=c*t*1.32203;
+ModelMatrixName[13][1]:=c*t*1.18644;
+ModelMatrixName[1][13]:=c*t*1.18644;
+ModelMatrixName[3][0]:=c*t*1.37288;
+ModelMatrixName[0][3]:=c*t*1.37288;
+ModelMatrixName[3][14]:=c*t*0.169492;
+ModelMatrixName[14][3]:=c*t*0.169492;
+ModelMatrixName[3][11]:=c*t*1.33898;
+ModelMatrixName[11][3]:=c*t*1.33898;
+ModelMatrixName[3][2]:=c*t*9.18644;
+ModelMatrixName[2][3]:=c*t*9.18644;
+ModelMatrixName[3][1]:=c*t*0.0169492;
+ModelMatrixName[1][3]:=c*t*0.0169492;
+ModelMatrixName[3][13]:=c*t*6.30508;
+ModelMatrixName[13][3]:=c*t*6.30508;
+ModelMatrixName[5][0]:=c*t*2.28814;
+ModelMatrixName[0][5]:=c*t*2.28814;
+ModelMatrixName[5][14]:=c*t*0.694915;
+ModelMatrixName[14][5]:=c*t*0.694915;
+ModelMatrixName[5][11]:=c*t*1.59322;
+ModelMatrixName[11][5]:=c*t*1.59322;
+ModelMatrixName[5][2]:=c*t*1.0339;
+ModelMatrixName[2][5]:=c*t*1.0339;
+ModelMatrixName[5][1]:=c*t*0.813559;
+ModelMatrixName[1][5]:=c*t*0.813559;
+ModelMatrixName[5][13]:=c*t*0.305085;
+ModelMatrixName[13][5]:=c*t*0.305085;
+ModelMatrixName[5][3]:=c*t*1.18644;
+ModelMatrixName[3][5]:=c*t*1.18644;
+ModelMatrixName[6][0]:=c*t*0.508475;
+ModelMatrixName[0][6]:=c*t*0.508475;
+ModelMatrixName[6][14]:=c*t*1.52542;
+ModelMatrixName[14][6]:=c*t*1.52542;
+ModelMatrixName[6][11]:=c*t*5.42373;
+ModelMatrixName[11][6]:=c*t*5.42373;
+ModelMatrixName[6][2]:=c*t*1.54237;
+ModelMatrixName[2][6]:=c*t*1.54237;
+ModelMatrixName[6][1]:=c*t*2.10169;
+ModelMatrixName[1][6]:=c*t*2.10169;
+ModelMatrixName[6][13]:=c*t*6.55932;
+ModelMatrixName[13][6]:=c*t*6.55932;
+ModelMatrixName[6][3]:=c*t*0.576271;
+ModelMatrixName[3][6]:=c*t*0.576271;
+ModelMatrixName[6][5]:=c*t*1.15254;
+ModelMatrixName[5][6]:=c*t*1.15254;
+ModelMatrixName[7][0]:=c*t*0.0169492;
+ModelMatrixName[0][7]:=c*t*0.0169492;
+ModelMatrixName[7][14]:=c*t*0.40678;
+ModelMatrixName[14][7]:=c*t*0.40678;
+ModelMatrixName[7][11]:=c*t*0.59322;
+ModelMatrixName[11][7]:=c*t*0.59322;
+ModelMatrixName[7][2]:=c*t*0.0169492;
+ModelMatrixName[2][7]:=c*t*0.0169492;
+ModelMatrixName[7][1]:=c*t*1.76271;
+ModelMatrixName[1][7]:=c*t*1.76271;
+ModelMatrixName[7][13]:=c*t*0.559322;
+ModelMatrixName[13][7]:=c*t*0.559322;
+ModelMatrixName[7][3]:=c*t*0.0169492;
+ModelMatrixName[3][7]:=c*t*0.0169492;
+ModelMatrixName[7][5]:=c*t*0.0169492;
+ModelMatrixName[5][7]:=c*t*0.0169492;
+ModelMatrixName[7][6]:=c*t*0.576271;
+ModelMatrixName[6][7]:=c*t*0.576271;
+ModelMatrixName[9][0]:=c*t*0.762712;
+ModelMatrixName[0][9]:=c*t*0.762712;
+ModelMatrixName[9][14]:=c*t*0.305085;
+ModelMatrixName[14][9]:=c*t*0.305085;
+ModelMatrixName[9][11]:=c*t*0.254237;
+ModelMatrixName[11][9]:=c*t*0.254237;
+ModelMatrixName[9][2]:=c*t*0.0847458;
+ModelMatrixName[2][9]:=c*t*0.0847458;
+ModelMatrixName[9][1]:=c*t*1.86441;
+ModelMatrixName[1][9]:=c*t*1.86441;
+ModelMatrixName[9][13]:=c*t*0.915254;
+ModelMatrixName[13][9]:=c*t*0.915254;
+ModelMatrixName[9][3]:=c*t*0.355932;
+ModelMatrixName[3][9]:=c*t*0.355932;
+ModelMatrixName[9][5]:=c*t*0.0508475;
+ModelMatrixName[5][9]:=c*t*0.0508475;
+ModelMatrixName[9][6]:=c*t*0.864407;
+ModelMatrixName[6][9]:=c*t*0.864407;
+ModelMatrixName[9][7]:=c*t*6.52542;
+ModelMatrixName[7][9]:=c*t*6.52542;
+ModelMatrixName[8][0]:=c*t*0.644068;
+ModelMatrixName[0][8]:=c*t*0.644068;
+ModelMatrixName[8][14]:=c*t*10.0508;
+ModelMatrixName[14][8]:=c*t*10.0508;
+ModelMatrixName[8][11]:=c*t*2.08475;
+ModelMatrixName[11][8]:=c*t*2.08475;
+ModelMatrixName[8][2]:=c*t*0.338983;
+ModelMatrixName[2][8]:=c*t*0.338983;
+ModelMatrixName[8][1]:=c*t*0.271186;
+ModelMatrixName[1][8]:=c*t*0.271186;
+ModelMatrixName[8][13]:=c*t*5.23729;
+ModelMatrixName[13][8]:=c*t*5.23729;
+ModelMatrixName[8][3]:=c*t*2.38983;
+ModelMatrixName[3][8]:=c*t*2.38983;
+ModelMatrixName[8][5]:=c*t*0.508475;
+ModelMatrixName[5][8]:=c*t*0.508475;
+ModelMatrixName[8][6]:=c*t*1.28814;
+ModelMatrixName[6][8]:=c*t*1.28814;
+ModelMatrixName[8][7]:=c*t*0.576271;
+ModelMatrixName[7][8]:=c*t*0.576271;
+ModelMatrixName[8][9]:=c*t*0.389831;
+ModelMatrixName[9][8]:=c*t*0.389831;
+ModelMatrixName[10][0]:=c*t*3.98305;
+ModelMatrixName[0][10]:=c*t*3.98305;
+ModelMatrixName[10][14]:=c*t*0.966102;
+ModelMatrixName[14][10]:=c*t*0.966102;
+ModelMatrixName[10][11]:=c*t*0.0169492;
+ModelMatrixName[11][10]:=c*t*0.0169492;
+ModelMatrixName[10][2]:=c*t*0.0169492;
+ModelMatrixName[2][10]:=c*t*0.0169492;
+ModelMatrixName[10][1]:=c*t*2.64407;
+ModelMatrixName[1][10]:=c*t*2.64407;
+ModelMatrixName[10][13]:=c*t*2.67797;
+ModelMatrixName[13][10]:=c*t*2.67797;
+ModelMatrixName[10][3]:=c*t*0.0169492;
+ModelMatrixName[3][10]:=c*t*0.0169492;
+ModelMatrixName[10][5]:=c*t*0.627119;
+ModelMatrixName[5][10]:=c*t*0.627119;
+ModelMatrixName[10][6]:=c*t*1.9661;
+ModelMatrixName[6][10]:=c*t*1.9661;
+ModelMatrixName[10][7]:=c*t*6.35593;
+ModelMatrixName[7][10]:=c*t*6.35593;
+ModelMatrixName[10][9]:=c*t*9.84746;
+ModelMatrixName[9][10]:=c*t*9.84746;
+ModelMatrixName[10][8]:=c*t*2.27119;
+ModelMatrixName[8][10]:=c*t*2.27119;
+ModelMatrixName[4][0]:=c*t*0.0169492;
+ModelMatrixName[0][4]:=c*t*0.0169492;
+ModelMatrixName[4][14]:=c*t*0.118644;
+ModelMatrixName[14][4]:=c*t*0.118644;
+ModelMatrixName[4][11]:=c*t*0.830508;
+ModelMatrixName[11][4]:=c*t*0.830508;
+ModelMatrixName[4][2]:=c*t*0.0169492;
+ModelMatrixName[2][4]:=c*t*0.0169492;
+ModelMatrixName[4][1]:=c*t*1.18644;
+ModelMatrixName[1][4]:=c*t*1.18644;
+ModelMatrixName[4][13]:=c*t*0.0169492;
+ModelMatrixName[13][4]:=c*t*0.0169492;
+ModelMatrixName[4][3]:=c*t*0.0169492;
+ModelMatrixName[3][4]:=c*t*0.0169492;
+ModelMatrixName[4][5]:=c*t*0.118644;
+ModelMatrixName[5][4]:=c*t*0.118644;
+ModelMatrixName[4][6]:=c*t*2.38983;
+ModelMatrixName[6][4]:=c*t*2.38983;
+ModelMatrixName[4][7]:=c*t*1.08475;
+ModelMatrixName[7][4]:=c*t*1.08475;
+ModelMatrixName[4][9]:=c*t*3.0339;
+ModelMatrixName[9][4]:=c*t*3.0339;
+ModelMatrixName[4][8]:=c*t*0.237288;
+ModelMatrixName[8][4]:=c*t*0.237288;
+ModelMatrixName[4][10]:=c*t*4.18644;
+ModelMatrixName[10][4]:=c*t*4.18644;
+ModelMatrixName[12][0]:=c*t*1.64407;
+ModelMatrixName[0][12]:=c*t*1.64407;
+ModelMatrixName[12][14]:=c*t*0.40678;
+ModelMatrixName[14][12]:=c*t*0.40678;
+ModelMatrixName[12][11]:=c*t*0.559322;
+ModelMatrixName[11][12]:=c*t*0.559322;
+ModelMatrixName[12][2]:=c*t*0.932203;
+ModelMatrixName[2][12]:=c*t*0.932203;
+ModelMatrixName[12][1]:=c*t*0.0169492;
+ModelMatrixName[1][12]:=c*t*0.0169492;
+ModelMatrixName[12][13]:=c*t*1.15254;
+ModelMatrixName[13][12]:=c*t*1.15254;
+ModelMatrixName[12][3]:=c*t*0.881356;
+ModelMatrixName[3][12]:=c*t*0.881356;
+ModelMatrixName[12][5]:=c*t*0.288136;
+ModelMatrixName[5][12]:=c*t*0.288136;
+ModelMatrixName[12][6]:=c*t*0.745763;
+ModelMatrixName[6][12]:=c*t*0.745763;
+ModelMatrixName[12][7]:=c*t*0.169492;
+ModelMatrixName[7][12]:=c*t*0.169492;
+ModelMatrixName[12][9]:=c*t*0.372881;
+ModelMatrixName[9][12]:=c*t*0.372881;
+ModelMatrixName[12][8]:=c*t*0.728814;
+ModelMatrixName[8][12]:=c*t*0.728814;
+ModelMatrixName[12][10]:=c*t*0.0169492;
+ModelMatrixName[10][12]:=c*t*0.0169492;
+ModelMatrixName[12][4]:=c*t*0.186441;
+ModelMatrixName[4][12]:=c*t*0.186441;
+ModelMatrixName[15][0]:=c*t*7.79661;
+ModelMatrixName[0][15]:=c*t*7.79661;
+ModelMatrixName[15][14]:=c*t*1.72881;
+ModelMatrixName[14][15]:=c*t*1.72881;
+ModelMatrixName[15][11]:=c*t*4.98305;
+ModelMatrixName[11][15]:=c*t*4.98305;
+ModelMatrixName[15][2]:=c*t*2.30508;
+ModelMatrixName[2][15]:=c*t*2.30508;
+ModelMatrixName[15][1]:=c*t*1.27119;
+ModelMatrixName[1][15]:=c*t*1.27119;
+ModelMatrixName[15][13]:=c*t*3.81356;
+ModelMatrixName[13][15]:=c*t*3.81356;
+ModelMatrixName[15][3]:=c*t*1.61017;
+ModelMatrixName[3][15]:=c*t*1.61017;
+ModelMatrixName[15][5]:=c*t*2.57627;
+ModelMatrixName[5][15]:=c*t*2.57627;
+ModelMatrixName[15][6]:=c*t*3.10169;
+ModelMatrixName[6][15]:=c*t*3.10169;
+ModelMatrixName[15][7]:=c*t*0.0677966;
+ModelMatrixName[7][15]:=c*t*0.0677966;
+ModelMatrixName[15][9]:=c*t*0.40678;
+ModelMatrixName[9][15]:=c*t*0.40678;
+ModelMatrixName[15][8]:=c*t*1.30508;
+ModelMatrixName[8][15]:=c*t*1.30508;
+ModelMatrixName[15][10]:=c*t*0.0169492;
+ModelMatrixName[10][15]:=c*t*0.0169492;
+ModelMatrixName[15][4]:=c*t*0.338983;
+ModelMatrixName[4][15]:=c*t*0.338983;
+ModelMatrixName[15][12]:=c*t*2.27119;
+ModelMatrixName[12][15]:=c*t*2.27119;
+ModelMatrixName[16][0]:=c*t*4.37288;
+ModelMatrixName[0][16]:=c*t*4.37288;
+ModelMatrixName[16][14]:=c*t*1.08475;
+ModelMatrixName[14][16]:=c*t*1.08475;
+ModelMatrixName[16][11]:=c*t*2.50847;
+ModelMatrixName[11][16]:=c*t*2.50847;
+ModelMatrixName[16][2]:=c*t*0.932203;
+ModelMatrixName[2][16]:=c*t*0.932203;
+ModelMatrixName[16][1]:=c*t*1.98305;
+ModelMatrixName[1][16]:=c*t*1.98305;
+ModelMatrixName[16][13]:=c*t*2.47458;
+ModelMatrixName[13][16]:=c*t*2.47458;
+ModelMatrixName[16][3]:=c*t*1.38983;
+ModelMatrixName[3][16]:=c*t*1.38983;
+ModelMatrixName[16][5]:=c*t*0.118644;
+ModelMatrixName[5][16]:=c*t*0.118644;
+ModelMatrixName[16][6]:=c*t*0.830508;
+ModelMatrixName[6][16]:=c*t*0.830508;
+ModelMatrixName[16][7]:=c*t*1.22034;
+ModelMatrixName[7][16]:=c*t*1.22034;
+ModelMatrixName[16][9]:=c*t*0.423729;
+ModelMatrixName[9][16]:=c*t*0.423729;
+ModelMatrixName[16][8]:=c*t*1.86441;
+ModelMatrixName[8][16]:=c*t*1.86441;
+ModelMatrixName[16][10]:=c*t*2.22034;
+ModelMatrixName[10][16]:=c*t*2.22034;
+ModelMatrixName[16][4]:=c*t*1.16949;
+ModelMatrixName[4][16]:=c*t*1.16949;
+ModelMatrixName[16][12]:=c*t*1.05085;
+ModelMatrixName[12][16]:=c*t*1.05085;
+ModelMatrixName[16][15]:=c*t*11.3729;
+ModelMatrixName[15][16]:=c*t*11.3729;
+ModelMatrixName[18][0]:=c*t*0.0847458;
+ModelMatrixName[0][18]:=c*t*0.0847458;
+ModelMatrixName[18][14]:=c*t*0.220339;
+ModelMatrixName[14][18]:=c*t*0.220339;
+ModelMatrixName[18][11]:=c*t*0.271186;
+ModelMatrixName[11][18]:=c*t*0.271186;
+ModelMatrixName[18][2]:=c*t*0.0169492;
+ModelMatrixName[2][18]:=c*t*0.0169492;
+ModelMatrixName[18][1]:=c*t*0.932203;
+ModelMatrixName[1][18]:=c*t*0.932203;
+ModelMatrixName[18][13]:=c*t*0.169492;
+ModelMatrixName[13][18]:=c*t*0.169492;
+ModelMatrixName[18][3]:=c*t*0.288136;
+ModelMatrixName[3][18]:=c*t*0.288136;
+ModelMatrixName[18][5]:=c*t*0.389831;
+ModelMatrixName[5][18]:=c*t*0.389831;
+ModelMatrixName[18][6]:=c*t*0.813559;
+ModelMatrixName[6][18]:=c*t*0.813559;
+ModelMatrixName[18][7]:=c*t*0.661017;
+ModelMatrixName[7][18]:=c*t*0.661017;
+ModelMatrixName[18][9]:=c*t*0.79661;
+ModelMatrixName[9][18]:=c*t*0.79661;
+ModelMatrixName[18][8]:=c*t*0.101695;
+ModelMatrixName[8][18]:=c*t*0.101695;
+ModelMatrixName[18][10]:=c*t*1.88136;
+ModelMatrixName[10][18]:=c*t*1.88136;
+ModelMatrixName[18][4]:=c*t*3.08475;
+ModelMatrixName[4][18]:=c*t*3.08475;
+ModelMatrixName[18][12]:=c*t*0.152542;
+ModelMatrixName[12][18]:=c*t*0.152542;
+ModelMatrixName[18][15]:=c*t*0.237288;
+ModelMatrixName[15][18]:=c*t*0.237288;
+ModelMatrixName[18][16]:=c*t*0.0169492;
+ModelMatrixName[16][18]:=c*t*0.0169492;
+ModelMatrixName[19][0]:=c*t*0.932203;
+ModelMatrixName[0][19]:=c*t*0.932203;
+ModelMatrixName[19][14]:=c*t*0.79661;
+ModelMatrixName[14][19]:=c*t*0.79661;
+ModelMatrixName[19][11]:=c*t*0.474576;
+ModelMatrixName[11][19]:=c*t*0.474576;
+ModelMatrixName[19][2]:=c*t*0.0169492;
+ModelMatrixName[2][19]:=c*t*0.0169492;
+ModelMatrixName[19][1]:=c*t*2.22034;
+ModelMatrixName[1][19]:=c*t*2.22034;
+ModelMatrixName[19][13]:=c*t*0.762712;
+ModelMatrixName[13][19]:=c*t*0.762712;
+ModelMatrixName[19][3]:=c*t*0.0169492;
+ModelMatrixName[3][19]:=c*t*0.0169492;
+ModelMatrixName[19][5]:=c*t*0.355932;
+ModelMatrixName[5][19]:=c*t*0.355932;
+ModelMatrixName[19][6]:=c*t*5.20339;
+ModelMatrixName[6][19]:=c*t*5.20339;
+ModelMatrixName[19][7]:=c*t*0.440678;
+ModelMatrixName[7][19]:=c*t*0.440678;
+ModelMatrixName[19][9]:=c*t*1.08475;
+ModelMatrixName[9][19]:=c*t*1.08475;
+ModelMatrixName[19][8]:=c*t*0.0169492;
+ModelMatrixName[8][19]:=c*t*0.0169492;
+ModelMatrixName[19][10]:=c*t*1.25424;
+ModelMatrixName[10][19]:=c*t*1.25424;
+ModelMatrixName[19][4]:=c*t*17.2373;
+ModelMatrixName[4][19]:=c*t*17.2373;
+ModelMatrixName[19][12]:=c*t*0.237288;
+ModelMatrixName[12][19]:=c*t*0.237288;
+ModelMatrixName[19][15]:=c*t*0.525424;
+ModelMatrixName[15][19]:=c*t*0.525424;
+ModelMatrixName[19][16]:=c*t*0.576271;
+ModelMatrixName[16][19]:=c*t*0.576271;
+ModelMatrixName[19][18]:=c*t*2.98305;
+ModelMatrixName[18][19]:=c*t*2.98305;
+ModelMatrixName[17][0]:=c*t*3.33898;
+ModelMatrixName[0][17]:=c*t*3.33898;
+ModelMatrixName[17][14]:=c*t*0.491525;
+ModelMatrixName[14][17]:=c*t*0.491525;
+ModelMatrixName[17][11]:=c*t*0.355932;
+ModelMatrixName[11][17]:=c*t*0.355932;
+ModelMatrixName[17][2]:=c*t*0.101695;
+ModelMatrixName[2][17]:=c*t*0.101695;
+ModelMatrixName[17][1]:=c*t*5;
+ModelMatrixName[1][17]:=c*t*5;
+ModelMatrixName[17][13]:=c*t*0.610169;
+ModelMatrixName[13][17]:=c*t*0.610169;
+ModelMatrixName[17][3]:=c*t*0.59322;
+ModelMatrixName[3][17]:=c*t*0.59322;
+ModelMatrixName[17][5]:=c*t*0.0508475;
+ModelMatrixName[5][17]:=c*t*0.0508475;
+ModelMatrixName[17][6]:=c*t*0.0169492;
+ModelMatrixName[6][17]:=c*t*0.0169492;
+ModelMatrixName[17][7]:=c*t*17.7627;
+ModelMatrixName[7][17]:=c*t*17.7627;
+ModelMatrixName[17][9]:=c*t*1.89831;
+ModelMatrixName[9][17]:=c*t*1.89831;
+ModelMatrixName[17][8]:=c*t*0.322034;
+ModelMatrixName[8][17]:=c*t*0.322034;
+ModelMatrixName[17][10]:=c*t*4;
+ModelMatrixName[10][17]:=c*t*4;
+ModelMatrixName[17][4]:=c*t*1.55932;
+ModelMatrixName[4][17]:=c*t*1.55932;
+ModelMatrixName[17][12]:=c*t*0.423729;
+ModelMatrixName[12][17]:=c*t*0.423729;
+ModelMatrixName[17][15]:=c*t*0.661017;
+ModelMatrixName[15][17]:=c*t*0.661017;
+ModelMatrixName[17][16]:=c*t*3.32203;
+ModelMatrixName[16][17]:=c*t*3.32203;
+ModelMatrixName[17][18]:=c*t*0.440678;
+ModelMatrixName[18][17]:=c*t*0.440678;
+ModelMatrixName[17][19]:=c*t*1;
+ModelMatrixName[19][17]:=c*t*1;
+	}
+	else
+	{
+       ModelMatrixName[14][0]:=t*0.576271;
+ModelMatrixName[0][14]:=t*0.576271;
+ModelMatrixName[11][0]:=t*0.864407;
+ModelMatrixName[0][11]:=t*0.864407;
+ModelMatrixName[11][14]:=t*0.59322;
+ModelMatrixName[14][11]:=t*0.59322;
+ModelMatrixName[2][0]:=t*0.169492;
+ModelMatrixName[0][2]:=t*0.169492;
+ModelMatrixName[2][14]:=t*0.508475;
+ModelMatrixName[14][2]:=t*0.508475;
+ModelMatrixName[2][11]:=t*6.50847;
+ModelMatrixName[11][2]:=t*6.50847;
+ModelMatrixName[1][0]:=t*7.44068;
+ModelMatrixName[0][1]:=t*7.44068;
+ModelMatrixName[1][14]:=t*1.55932;
+ModelMatrixName[14][1]:=t*1.55932;
+ModelMatrixName[1][11]:=t*2.16949;
+ModelMatrixName[11][1]:=t*2.16949;
+ModelMatrixName[1][2]:=t*0.0169492;
+ModelMatrixName[2][1]:=t*0.0169492;
+ModelMatrixName[13][0]:=t*0.542373;
+ModelMatrixName[0][13]:=t*0.542373;
+ModelMatrixName[13][14]:=t*3.74576;
+ModelMatrixName[14][13]:=t*3.74576;
+ModelMatrixName[13][11]:=t*4;
+ModelMatrixName[11][13]:=t*4;
+ModelMatrixName[13][2]:=t*1.32203;
+ModelMatrixName[2][13]:=t*1.32203;
+ModelMatrixName[13][1]:=t*1.18644;
+ModelMatrixName[1][13]:=t*1.18644;
+ModelMatrixName[3][0]:=t*1.37288;
+ModelMatrixName[0][3]:=t*1.37288;
+ModelMatrixName[3][14]:=t*0.169492;
+ModelMatrixName[14][3]:=t*0.169492;
+ModelMatrixName[3][11]:=t*1.33898;
+ModelMatrixName[11][3]:=t*1.33898;
+ModelMatrixName[3][2]:=t*9.18644;
+ModelMatrixName[2][3]:=t*9.18644;
+ModelMatrixName[3][1]:=t*0.0169492;
+ModelMatrixName[1][3]:=t*0.0169492;
+ModelMatrixName[3][13]:=t*6.30508;
+ModelMatrixName[13][3]:=t*6.30508;
+ModelMatrixName[5][0]:=t*2.28814;
+ModelMatrixName[0][5]:=t*2.28814;
+ModelMatrixName[5][14]:=t*0.694915;
+ModelMatrixName[14][5]:=t*0.694915;
+ModelMatrixName[5][11]:=t*1.59322;
+ModelMatrixName[11][5]:=t*1.59322;
+ModelMatrixName[5][2]:=t*1.0339;
+ModelMatrixName[2][5]:=t*1.0339;
+ModelMatrixName[5][1]:=t*0.813559;
+ModelMatrixName[1][5]:=t*0.813559;
+ModelMatrixName[5][13]:=t*0.305085;
+ModelMatrixName[13][5]:=t*0.305085;
+ModelMatrixName[5][3]:=t*1.18644;
+ModelMatrixName[3][5]:=t*1.18644;
+ModelMatrixName[6][0]:=t*0.508475;
+ModelMatrixName[0][6]:=t*0.508475;
+ModelMatrixName[6][14]:=t*1.52542;
+ModelMatrixName[14][6]:=t*1.52542;
+ModelMatrixName[6][11]:=t*5.42373;
+ModelMatrixName[11][6]:=t*5.42373;
+ModelMatrixName[6][2]:=t*1.54237;
+ModelMatrixName[2][6]:=t*1.54237;
+ModelMatrixName[6][1]:=t*2.10169;
+ModelMatrixName[1][6]:=t*2.10169;
+ModelMatrixName[6][13]:=t*6.55932;
+ModelMatrixName[13][6]:=t*6.55932;
+ModelMatrixName[6][3]:=t*0.576271;
+ModelMatrixName[3][6]:=t*0.576271;
+ModelMatrixName[6][5]:=t*1.15254;
+ModelMatrixName[5][6]:=t*1.15254;
+ModelMatrixName[7][0]:=t*0.0169492;
+ModelMatrixName[0][7]:=t*0.0169492;
+ModelMatrixName[7][14]:=t*0.40678;
+ModelMatrixName[14][7]:=t*0.40678;
+ModelMatrixName[7][11]:=t*0.59322;
+ModelMatrixName[11][7]:=t*0.59322;
+ModelMatrixName[7][2]:=t*0.0169492;
+ModelMatrixName[2][7]:=t*0.0169492;
+ModelMatrixName[7][1]:=t*1.76271;
+ModelMatrixName[1][7]:=t*1.76271;
+ModelMatrixName[7][13]:=t*0.559322;
+ModelMatrixName[13][7]:=t*0.559322;
+ModelMatrixName[7][3]:=t*0.0169492;
+ModelMatrixName[3][7]:=t*0.0169492;
+ModelMatrixName[7][5]:=t*0.0169492;
+ModelMatrixName[5][7]:=t*0.0169492;
+ModelMatrixName[7][6]:=t*0.576271;
+ModelMatrixName[6][7]:=t*0.576271;
+ModelMatrixName[9][0]:=t*0.762712;
+ModelMatrixName[0][9]:=t*0.762712;
+ModelMatrixName[9][14]:=t*0.305085;
+ModelMatrixName[14][9]:=t*0.305085;
+ModelMatrixName[9][11]:=t*0.254237;
+ModelMatrixName[11][9]:=t*0.254237;
+ModelMatrixName[9][2]:=t*0.0847458;
+ModelMatrixName[2][9]:=t*0.0847458;
+ModelMatrixName[9][1]:=t*1.86441;
+ModelMatrixName[1][9]:=t*1.86441;
+ModelMatrixName[9][13]:=t*0.915254;
+ModelMatrixName[13][9]:=t*0.915254;
+ModelMatrixName[9][3]:=t*0.355932;
+ModelMatrixName[3][9]:=t*0.355932;
+ModelMatrixName[9][5]:=t*0.0508475;
+ModelMatrixName[5][9]:=t*0.0508475;
+ModelMatrixName[9][6]:=t*0.864407;
+ModelMatrixName[6][9]:=t*0.864407;
+ModelMatrixName[9][7]:=t*6.52542;
+ModelMatrixName[7][9]:=t*6.52542;
+ModelMatrixName[8][0]:=t*0.644068;
+ModelMatrixName[0][8]:=t*0.644068;
+ModelMatrixName[8][14]:=t*10.0508;
+ModelMatrixName[14][8]:=t*10.0508;
+ModelMatrixName[8][11]:=t*2.08475;
+ModelMatrixName[11][8]:=t*2.08475;
+ModelMatrixName[8][2]:=t*0.338983;
+ModelMatrixName[2][8]:=t*0.338983;
+ModelMatrixName[8][1]:=t*0.271186;
+ModelMatrixName[1][8]:=t*0.271186;
+ModelMatrixName[8][13]:=t*5.23729;
+ModelMatrixName[13][8]:=t*5.23729;
+ModelMatrixName[8][3]:=t*2.38983;
+ModelMatrixName[3][8]:=t*2.38983;
+ModelMatrixName[8][5]:=t*0.508475;
+ModelMatrixName[5][8]:=t*0.508475;
+ModelMatrixName[8][6]:=t*1.28814;
+ModelMatrixName[6][8]:=t*1.28814;
+ModelMatrixName[8][7]:=t*0.576271;
+ModelMatrixName[7][8]:=t*0.576271;
+ModelMatrixName[8][9]:=t*0.389831;
+ModelMatrixName[9][8]:=t*0.389831;
+ModelMatrixName[10][0]:=t*3.98305;
+ModelMatrixName[0][10]:=t*3.98305;
+ModelMatrixName[10][14]:=t*0.966102;
+ModelMatrixName[14][10]:=t*0.966102;
+ModelMatrixName[10][11]:=t*0.0169492;
+ModelMatrixName[11][10]:=t*0.0169492;
+ModelMatrixName[10][2]:=t*0.0169492;
+ModelMatrixName[2][10]:=t*0.0169492;
+ModelMatrixName[10][1]:=t*2.64407;
+ModelMatrixName[1][10]:=t*2.64407;
+ModelMatrixName[10][13]:=t*2.67797;
+ModelMatrixName[13][10]:=t*2.67797;
+ModelMatrixName[10][3]:=t*0.0169492;
+ModelMatrixName[3][10]:=t*0.0169492;
+ModelMatrixName[10][5]:=t*0.627119;
+ModelMatrixName[5][10]:=t*0.627119;
+ModelMatrixName[10][6]:=t*1.9661;
+ModelMatrixName[6][10]:=t*1.9661;
+ModelMatrixName[10][7]:=t*6.35593;
+ModelMatrixName[7][10]:=t*6.35593;
+ModelMatrixName[10][9]:=t*9.84746;
+ModelMatrixName[9][10]:=t*9.84746;
+ModelMatrixName[10][8]:=t*2.27119;
+ModelMatrixName[8][10]:=t*2.27119;
+ModelMatrixName[4][0]:=t*0.0169492;
+ModelMatrixName[0][4]:=t*0.0169492;
+ModelMatrixName[4][14]:=t*0.118644;
+ModelMatrixName[14][4]:=t*0.118644;
+ModelMatrixName[4][11]:=t*0.830508;
+ModelMatrixName[11][4]:=t*0.830508;
+ModelMatrixName[4][2]:=t*0.0169492;
+ModelMatrixName[2][4]:=t*0.0169492;
+ModelMatrixName[4][1]:=t*1.18644;
+ModelMatrixName[1][4]:=t*1.18644;
+ModelMatrixName[4][13]:=t*0.0169492;
+ModelMatrixName[13][4]:=t*0.0169492;
+ModelMatrixName[4][3]:=t*0.0169492;
+ModelMatrixName[3][4]:=t*0.0169492;
+ModelMatrixName[4][5]:=t*0.118644;
+ModelMatrixName[5][4]:=t*0.118644;
+ModelMatrixName[4][6]:=t*2.38983;
+ModelMatrixName[6][4]:=t*2.38983;
+ModelMatrixName[4][7]:=t*1.08475;
+ModelMatrixName[7][4]:=t*1.08475;
+ModelMatrixName[4][9]:=t*3.0339;
+ModelMatrixName[9][4]:=t*3.0339;
+ModelMatrixName[4][8]:=t*0.237288;
+ModelMatrixName[8][4]:=t*0.237288;
+ModelMatrixName[4][10]:=t*4.18644;
+ModelMatrixName[10][4]:=t*4.18644;
+ModelMatrixName[12][0]:=t*1.64407;
+ModelMatrixName[0][12]:=t*1.64407;
+ModelMatrixName[12][14]:=t*0.40678;
+ModelMatrixName[14][12]:=t*0.40678;
+ModelMatrixName[12][11]:=t*0.559322;
+ModelMatrixName[11][12]:=t*0.559322;
+ModelMatrixName[12][2]:=t*0.932203;
+ModelMatrixName[2][12]:=t*0.932203;
+ModelMatrixName[12][1]:=t*0.0169492;
+ModelMatrixName[1][12]:=t*0.0169492;
+ModelMatrixName[12][13]:=t*1.15254;
+ModelMatrixName[13][12]:=t*1.15254;
+ModelMatrixName[12][3]:=t*0.881356;
+ModelMatrixName[3][12]:=t*0.881356;
+ModelMatrixName[12][5]:=t*0.288136;
+ModelMatrixName[5][12]:=t*0.288136;
+ModelMatrixName[12][6]:=t*0.745763;
+ModelMatrixName[6][12]:=t*0.745763;
+ModelMatrixName[12][7]:=t*0.169492;
+ModelMatrixName[7][12]:=t*0.169492;
+ModelMatrixName[12][9]:=t*0.372881;
+ModelMatrixName[9][12]:=t*0.372881;
+ModelMatrixName[12][8]:=t*0.728814;
+ModelMatrixName[8][12]:=t*0.728814;
+ModelMatrixName[12][10]:=t*0.0169492;
+ModelMatrixName[10][12]:=t*0.0169492;
+ModelMatrixName[12][4]:=t*0.186441;
+ModelMatrixName[4][12]:=t*0.186441;
+ModelMatrixName[15][0]:=t*7.79661;
+ModelMatrixName[0][15]:=t*7.79661;
+ModelMatrixName[15][14]:=t*1.72881;
+ModelMatrixName[14][15]:=t*1.72881;
+ModelMatrixName[15][11]:=t*4.98305;
+ModelMatrixName[11][15]:=t*4.98305;
+ModelMatrixName[15][2]:=t*2.30508;
+ModelMatrixName[2][15]:=t*2.30508;
+ModelMatrixName[15][1]:=t*1.27119;
+ModelMatrixName[1][15]:=t*1.27119;
+ModelMatrixName[15][13]:=t*3.81356;
+ModelMatrixName[13][15]:=t*3.81356;
+ModelMatrixName[15][3]:=t*1.61017;
+ModelMatrixName[3][15]:=t*1.61017;
+ModelMatrixName[15][5]:=t*2.57627;
+ModelMatrixName[5][15]:=t*2.57627;
+ModelMatrixName[15][6]:=t*3.10169;
+ModelMatrixName[6][15]:=t*3.10169;
+ModelMatrixName[15][7]:=t*0.0677966;
+ModelMatrixName[7][15]:=t*0.0677966;
+ModelMatrixName[15][9]:=t*0.40678;
+ModelMatrixName[9][15]:=t*0.40678;
+ModelMatrixName[15][8]:=t*1.30508;
+ModelMatrixName[8][15]:=t*1.30508;
+ModelMatrixName[15][10]:=t*0.0169492;
+ModelMatrixName[10][15]:=t*0.0169492;
+ModelMatrixName[15][4]:=t*0.338983;
+ModelMatrixName[4][15]:=t*0.338983;
+ModelMatrixName[15][12]:=t*2.27119;
+ModelMatrixName[12][15]:=t*2.27119;
+ModelMatrixName[16][0]:=t*4.37288;
+ModelMatrixName[0][16]:=t*4.37288;
+ModelMatrixName[16][14]:=t*1.08475;
+ModelMatrixName[14][16]:=t*1.08475;
+ModelMatrixName[16][11]:=t*2.50847;
+ModelMatrixName[11][16]:=t*2.50847;
+ModelMatrixName[16][2]:=t*0.932203;
+ModelMatrixName[2][16]:=t*0.932203;
+ModelMatrixName[16][1]:=t*1.98305;
+ModelMatrixName[1][16]:=t*1.98305;
+ModelMatrixName[16][13]:=t*2.47458;
+ModelMatrixName[13][16]:=t*2.47458;
+ModelMatrixName[16][3]:=t*1.38983;
+ModelMatrixName[3][16]:=t*1.38983;
+ModelMatrixName[16][5]:=t*0.118644;
+ModelMatrixName[5][16]:=t*0.118644;
+ModelMatrixName[16][6]:=t*0.830508;
+ModelMatrixName[6][16]:=t*0.830508;
+ModelMatrixName[16][7]:=t*1.22034;
+ModelMatrixName[7][16]:=t*1.22034;
+ModelMatrixName[16][9]:=t*0.423729;
+ModelMatrixName[9][16]:=t*0.423729;
+ModelMatrixName[16][8]:=t*1.86441;
+ModelMatrixName[8][16]:=t*1.86441;
+ModelMatrixName[16][10]:=t*2.22034;
+ModelMatrixName[10][16]:=t*2.22034;
+ModelMatrixName[16][4]:=t*1.16949;
+ModelMatrixName[4][16]:=t*1.16949;
+ModelMatrixName[16][12]:=t*1.05085;
+ModelMatrixName[12][16]:=t*1.05085;
+ModelMatrixName[16][15]:=t*11.3729;
+ModelMatrixName[15][16]:=t*11.3729;
+ModelMatrixName[18][0]:=t*0.0847458;
+ModelMatrixName[0][18]:=t*0.0847458;
+ModelMatrixName[18][14]:=t*0.220339;
+ModelMatrixName[14][18]:=t*0.220339;
+ModelMatrixName[18][11]:=t*0.271186;
+ModelMatrixName[11][18]:=t*0.271186;
+ModelMatrixName[18][2]:=t*0.0169492;
+ModelMatrixName[2][18]:=t*0.0169492;
+ModelMatrixName[18][1]:=t*0.932203;
+ModelMatrixName[1][18]:=t*0.932203;
+ModelMatrixName[18][13]:=t*0.169492;
+ModelMatrixName[13][18]:=t*0.169492;
+ModelMatrixName[18][3]:=t*0.288136;
+ModelMatrixName[3][18]:=t*0.288136;
+ModelMatrixName[18][5]:=t*0.389831;
+ModelMatrixName[5][18]:=t*0.389831;
+ModelMatrixName[18][6]:=t*0.813559;
+ModelMatrixName[6][18]:=t*0.813559;
+ModelMatrixName[18][7]:=t*0.661017;
+ModelMatrixName[7][18]:=t*0.661017;
+ModelMatrixName[18][9]:=t*0.79661;
+ModelMatrixName[9][18]:=t*0.79661;
+ModelMatrixName[18][8]:=t*0.101695;
+ModelMatrixName[8][18]:=t*0.101695;
+ModelMatrixName[18][10]:=t*1.88136;
+ModelMatrixName[10][18]:=t*1.88136;
+ModelMatrixName[18][4]:=t*3.08475;
+ModelMatrixName[4][18]:=t*3.08475;
+ModelMatrixName[18][12]:=t*0.152542;
+ModelMatrixName[12][18]:=t*0.152542;
+ModelMatrixName[18][15]:=t*0.237288;
+ModelMatrixName[15][18]:=t*0.237288;
+ModelMatrixName[18][16]:=t*0.0169492;
+ModelMatrixName[16][18]:=t*0.0169492;
+ModelMatrixName[19][0]:=t*0.932203;
+ModelMatrixName[0][19]:=t*0.932203;
+ModelMatrixName[19][14]:=t*0.79661;
+ModelMatrixName[14][19]:=t*0.79661;
+ModelMatrixName[19][11]:=t*0.474576;
+ModelMatrixName[11][19]:=t*0.474576;
+ModelMatrixName[19][2]:=t*0.0169492;
+ModelMatrixName[2][19]:=t*0.0169492;
+ModelMatrixName[19][1]:=t*2.22034;
+ModelMatrixName[1][19]:=t*2.22034;
+ModelMatrixName[19][13]:=t*0.762712;
+ModelMatrixName[13][19]:=t*0.762712;
+ModelMatrixName[19][3]:=t*0.0169492;
+ModelMatrixName[3][19]:=t*0.0169492;
+ModelMatrixName[19][5]:=t*0.355932;
+ModelMatrixName[5][19]:=t*0.355932;
+ModelMatrixName[19][6]:=t*5.20339;
+ModelMatrixName[6][19]:=t*5.20339;
+ModelMatrixName[19][7]:=t*0.440678;
+ModelMatrixName[7][19]:=t*0.440678;
+ModelMatrixName[19][9]:=t*1.08475;
+ModelMatrixName[9][19]:=t*1.08475;
+ModelMatrixName[19][8]:=t*0.0169492;
+ModelMatrixName[8][19]:=t*0.0169492;
+ModelMatrixName[19][10]:=t*1.25424;
+ModelMatrixName[10][19]:=t*1.25424;
+ModelMatrixName[19][4]:=t*17.2373;
+ModelMatrixName[4][19]:=t*17.2373;
+ModelMatrixName[19][12]:=t*0.237288;
+ModelMatrixName[12][19]:=t*0.237288;
+ModelMatrixName[19][15]:=t*0.525424;
+ModelMatrixName[15][19]:=t*0.525424;
+ModelMatrixName[19][16]:=t*0.576271;
+ModelMatrixName[16][19]:=t*0.576271;
+ModelMatrixName[19][18]:=t*2.98305;
+ModelMatrixName[18][19]:=t*2.98305;
+ModelMatrixName[17][0]:=t*3.33898;
+ModelMatrixName[0][17]:=t*3.33898;
+ModelMatrixName[17][14]:=t*0.491525;
+ModelMatrixName[14][17]:=t*0.491525;
+ModelMatrixName[17][11]:=t*0.355932;
+ModelMatrixName[11][17]:=t*0.355932;
+ModelMatrixName[17][2]:=t*0.101695;
+ModelMatrixName[2][17]:=t*0.101695;
+ModelMatrixName[17][1]:=t*5;
+ModelMatrixName[1][17]:=t*5;
+ModelMatrixName[17][13]:=t*0.610169;
+ModelMatrixName[13][17]:=t*0.610169;
+ModelMatrixName[17][3]:=t*0.59322;
+ModelMatrixName[3][17]:=t*0.59322;
+ModelMatrixName[17][5]:=t*0.0508475;
+ModelMatrixName[5][17]:=t*0.0508475;
+ModelMatrixName[17][6]:=t*0.0169492;
+ModelMatrixName[6][17]:=t*0.0169492;
+ModelMatrixName[17][7]:=t*17.7627;
+ModelMatrixName[7][17]:=t*17.7627;
+ModelMatrixName[17][9]:=t*1.89831;
+ModelMatrixName[9][17]:=t*1.89831;
+ModelMatrixName[17][8]:=t*0.322034;
+ModelMatrixName[8][17]:=t*0.322034;
+ModelMatrixName[17][10]:=t*4;
+ModelMatrixName[10][17]:=t*4;
+ModelMatrixName[17][4]:=t*1.55932;
+ModelMatrixName[4][17]:=t*1.55932;
+ModelMatrixName[17][12]:=t*0.423729;
+ModelMatrixName[12][17]:=t*0.423729;
+ModelMatrixName[17][15]:=t*0.661017;
+ModelMatrixName[15][17]:=t*0.661017;
+ModelMatrixName[17][16]:=t*3.32203;
+ModelMatrixName[16][17]:=t*3.32203;
+ModelMatrixName[17][18]:=t*0.440678;
+ModelMatrixName[18][17]:=t*0.440678;
+ModelMatrixName[17][19]:=t*1;
+ModelMatrixName[19][17]:=t*1;
+
+	}
+	return 1;
+}
+
+HarvestFrequencies (vectorOfFrequencies,filteredData,1,1,0);
+
+
+rtREVMatrix = 0;
+MULTIPLY_BY_FREQS = PopulateModelMatrix ("rtREVMatrix",vectorOfFrequencies);
+Model rtREVModel = (rtREVMatrix, vectorOfFrequencies, MULTIPLY_BY_FREQS);
+FREQUENCY_SENSITIVE = 1;
diff --git a/res/TemplateBatchFiles/TestBranchDNDS.bf b/res/TemplateBatchFiles/TestBranchDNDS.bf
new file mode 100644
index 0000000..bee9b47
--- /dev/null
+++ b/res/TemplateBatchFiles/TestBranchDNDS.bf
@@ -0,0 +1,446 @@
+ModelMatrixDimension = 0;
+_DO_TREE_REBALANCE_ = 0;
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function BuildCodonFrequencies (obsF)
+{
+	PIStop = 1.0;
+	result = {ModelMatrixDimension,1};
+	hshift = 0;
+
+	for (h=0; h<64; h=h+1)
+	{
+		first = h$16;
+		second = h%16$4;
+		third = h%4;
+		if (_Genetic_Code[h]==10) 
+		{
+			hshift = hshift+1;
+			PIStop = PIStop-obsF[first][0]*obsF[second][1]*obsF[third][2];
+			continue; 
+		}
+		result[h-hshift][0]=obsF[first][0]*obsF[second][1]*obsF[third][2];
+	}
+	return result*(1.0/PIStop);
+}
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function PopulateModelMatrix (ModelMatrixName&, EFV)
+{
+	if (!ModelMatrixDimension)
+	{
+		ModelMatrixDimension = 64;
+		for (h = 0 ;h<64; h=h+1)
+		{
+			if (_Genetic_Code[h]==10)
+			{
+				ModelMatrixDimension = ModelMatrixDimension-1;
+			}
+		}
+	}
+	
+	ModelMatrixName = {ModelMatrixDimension,ModelMatrixDimension}; 
+
+	hshift = 0;
+	
+	modelDefString = "";
+	modelDefString*16384;
+	
+	if (modelType > 0)
+	{
+		catCounterAL = {};
+	}
+	
+	for (h=0; h<64; h=h+1)
+	{
+		if (_Genetic_Code[h]==10) 
+		{
+			hshift = hshift+1;
+			continue; 
+		}
+		vshift = hshift;
+		for (v = h+1; v<64; v=v+1)
+		{
+			diff = v-h;
+			if (_Genetic_Code[v]==10) 
+			{
+				vshift = vshift+1;
+				continue; 
+			}
+			nucPosInCodon = 2;
+			if ((h$4==v$4)||((diff%4==0)&&(h$16==v$16))||(diff%16==0))
+			{
+				if (h$4==v$4)
+				{
+					transition = v%4;
+					transition2= h%4;
+				}
+				else
+				{
+					if(diff%16==0)
+					{
+						transition = v$16;
+						transition2= h$16;
+						nucPosInCodon = 0;
+					}
+					else
+					{
+						transition = v%16$4;
+						transition2= h%16$4;
+						nucPosInCodon = 1;
+					}
+				}
+				hs = Format(h-hshift,0,0);
+				vs = Format(v-vshift,0,0);
+				ts = Format(transition,0,0);
+				ts2= Format(transition2,0,0);
+				ps = Format(nucPosInCodon,0,0);
+				aa1 = _Genetic_Code[0][h];
+				aa2 = _Genetic_Code[0][v];
+				if (aa1==aa2) 
+				{
+					modelDefString*("ModelMatrixName["+hs+"]["+vs+"] := "+_nucBiasTerms[transition][transition2]+"synRate*EFV__["+ts+"]["+ps+"];\n"+
+													 "ModelMatrixName["+vs+"]["+hs+"] := "+_nucBiasTerms[transition][transition2]+"synRate*EFV__["+ts2+"]["+ps+"];\n");
+				}
+				else
+				{
+					bt = "nsClass"+aaRateMultipliers[aa1][aa2];
+					modelDefString*("ModelMatrixName["+hs+"]["+vs+"] := "+_nucBiasTerms2[transition][transition2]+bt+"*synRate*EFV__["+ts+"]["+ps+"];\n"+
+														 "ModelMatrixName["+vs+"]["+hs+"] := "+_nucBiasTerms2[transition][transition2]+bt+"*synRate*EFV__["+ts2+"]["+ps+"];\n");						
+				}
+			}
+	    }
+    }		
+	modelDefString*0;
+	ExecuteCommands (modelDefString);
+	return 0;
+}
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+incFileName = HYPHY_LIB_DIRECTORY+"TemplateBatchFiles"+DIRECTORY_SEPARATOR+"TemplateModels"+DIRECTORY_SEPARATOR+"chooseGeneticCode.def";
+ExecuteCommands  ("#include \""+incFileName+"\";");
+
+SetDialogPrompt ("Select a codon data file");
+DataSet ds 	= ReadDataFile (PROMPT_FOR_FILE);
+DataSetFilter filteredData = CreateFilter (ds,3,"","",GeneticCodeExclusions);
+
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+ChoiceList	(rateType,"Site-to-site rate variation model",1,SKIP_NONE,
+					   "None", "No site-by-site rate variation.",
+					   "dN only",  "Non-synonymous rate varies across sites via a gamma/beta distribution, synonymous rate is fixed at 1.",
+					   "Complete",  "Both synonymous and non-synonymous rate varies across sites via two independent gamma/beta distributions.");
+
+ClearConstraints (NC);
+ClearConstraints (SC);
+
+if (rateType < 0)
+{
+	return;
+}
+
+if (rateType == 0)
+{
+	MGCustomRateBiasTermsS = {{"AC*","","AT*","CG*","CT*","GT*"}};	
+	MGCustomRateBiasTermsN = MGCustomRateBiasTermsS;	
+}
+else
+{
+	done = 0;
+	while (!done)
+	{
+		fprintf (stdout,"\nHow many rate classes should there be ([3-8] is a good range, must be >=2):");
+		fscanf  (stdin,"Number", resp);
+		if (resp>=2)
+		{	
+			done = 1;
+		}
+	}			
+
+	global betaNSP = 1;
+	global betaNSQ = 1;
+	betaNSP:>0.05;betaNSP:<85;
+	betaNSQ:>0.05;betaNSQ:<85;
+	category _pd = (resp-1, EQUAL, MEAN, 
+					_x_^(betaNSP-1)*(1-_x_)^(betaNSQ-1)/Beta(betaNSP,betaNSQ), /* density */
+					IBeta(_x_,betaNSP,betaNSQ), /*CDF*/
+					0, 				   /*left bound*/
+					1, 			   /*right bound*/
+					IBeta(_x_,betaNSP+1,betaNSQ)*betaNSP/(betaNSP+betaNSQ)
+	);
+
+	global beta = .5;
+	beta:>0.01;beta:<100;
+	category NC = (resp, _pd, MEAN, 
+					GammaDist(_x_,beta,beta), 
+					CGammaDist(_x_,beta,beta), 
+					0 , 
+			  	    1e25,
+			  	    CGammaDist(_x_,beta+1,beta)
+			  	 );
+		  	 
+	if (rateType == 1)
+	{
+		MGCustomRateBiasTermsS = {{"AC*","","AT*","CG*","CT*","GT*"}};	
+		MGCustomRateBiasTermsN = {{"AC*NC*","NC*","AT*NC*","CG*NC*","CT*NC*","GT*NC*"}};
+	}
+	else
+	{
+		global alpha = 1;
+		alpha:>0.01;
+		alpha:<100;
+
+		global betaP = 1;
+		global betaQ = 1;
+		betaP:>0.05;betaP:<85;
+		betaQ:>0.05;betaQ:<85;
+		
+		category _pc = (resp-1, EQUAL, MEAN, 
+						_x_^(betaP-1)*(1-_x_)^(betaQ-1)/Beta(betaP,betaQ), /* density */
+						IBeta(_x_,betaP,betaQ), /*CDF*/
+						0, 				   /*left bound*/
+						1, 			   /*right bound*/
+						IBeta(_x_,betaP+1,betaQ)*betaP/(betaP+betaQ)
+		);
+
+		global alpha = .5;
+		alpha:>0.01;alpha:<100;
+		category SC = (resp, _pc, MEAN, 
+						GammaDist(_x_,alpha,alpha), 
+						CGammaDist(_x_,alpha,alpha), 
+						0 , 
+				  	    1e25,
+				  	    CGammaDist(_x_,alpha+1,alpha)
+				  	 );
+		  	 
+		MGCustomRateBiasTermsS = {{"AC*SC*","SC*","AT*SC*","CG*SC*","CT*SC*","GT*SC*"}};
+		MGCustomRateBiasTermsN = {{"AC*NC*","NC*","AT*NC*","CG*NC*","CT*NC*","GT*NC*"}};	
+	}
+}
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+global AC = 1;
+global AT = 1;
+global CG = 1;
+global CT = 1;
+global GT = 1;
+		
+				
+ChoiceList	(modelSpec,"Nucleotide Substitution Model",1,SKIP_NONE,
+					   "Default", "MG94xHKY85. Only corrects for transition/transversion bias.",
+					   "Custom",  "MG94xarbitrary nucleotide bias corrections, from none (xF81) to full (xREV).");
+					   
+if (modelSpec < 0)
+{
+	return;
+}
+
+if (modelSpec == 1)
+{
+	done = 0;
+	while (!done)
+	{
+		fprintf (stdout,"\nPlease enter a 6 character model designation (e.g:010010 defines HKY85):");
+		fscanf  (stdin,"String", modelDesc);
+		if (Abs(modelDesc)==6)
+		{	
+			done = 1;
+		}
+	}			
+}
+else
+{
+	modelDesc = "010010";
+}
+
+paramCount	  = 0;
+_nucBiasTerms = {4,4};
+_nucBiasTerms[0][0] = "";
+
+_nucBiasTerms2 = {4,4};
+_nucBiasTerms2[0][0] = "";
+
+
+if (modelDesc[0]==modelDesc[1])
+{
+	MGCustomRateBiasTermsS[0] = MGCustomRateBiasTermsS[1];
+	MGCustomRateBiasTermsN[0] = MGCustomRateBiasTermsN[1];
+}
+
+_nucBiasTerms[1][0] = MGCustomRateBiasTermsS[0];
+_nucBiasTerms[0][1] = MGCustomRateBiasTermsS[0];
+_nucBiasTerms[2][0] = MGCustomRateBiasTermsS[1];
+_nucBiasTerms[0][2] = MGCustomRateBiasTermsS[1];
+
+_nucBiasTerms2[1][0] = MGCustomRateBiasTermsN[0];
+_nucBiasTerms2[0][1] = MGCustomRateBiasTermsN[0];
+_nucBiasTerms2[2][0] = MGCustomRateBiasTermsN[1];
+_nucBiasTerms2[0][2] = MGCustomRateBiasTermsN[1];
+
+
+h = 0;
+v = 3;
+
+for (customLoopCounter2=2; customLoopCounter2<6; customLoopCounter2=customLoopCounter2+1)
+{
+	for (customLoopCounter=0; customLoopCounter<customLoopCounter2; customLoopCounter=customLoopCounter+1)
+	{
+		if (modelDesc[customLoopCounter]==modelDesc[customLoopCounter2])
+		{
+			_nucBiasTerms[h][v] = MGCustomRateBiasTermsS[customLoopCounter];
+			_nucBiasTerms[v][h] = MGCustomRateBiasTermsS[customLoopCounter];
+			_nucBiasTerms2[h][v] = MGCustomRateBiasTermsN[customLoopCounter];
+			_nucBiasTerms2[v][h] = MGCustomRateBiasTermsN[customLoopCounter];
+			break;
+		}
+	}
+	if (customLoopCounter == customLoopCounter2)
+	{
+		_nucBiasTerms[h][v]  = MGCustomRateBiasTermsS[customLoopCounter2];
+		_nucBiasTerms[v][h]  = MGCustomRateBiasTermsS[customLoopCounter2];
+		_nucBiasTerms2[h][v] = MGCustomRateBiasTermsN[customLoopCounter2];
+		_nucBiasTerms2[v][h] = MGCustomRateBiasTermsN[customLoopCounter2];
+	}
+	
+	v = v+1;
+	if (v==4)
+	{
+		h=h+1;
+		v=h+1;
+	}
+}
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+incFileName = HYPHY_LIB_DIRECTORY+"TemplateBatchFiles"+DIRECTORY_SEPARATOR+"TemplateModels"+DIRECTORY_SEPARATOR+"MGwAA.ibf";
+ExecuteCommands  ("#include \""+incFileName+"\";");
+
+HarvestFrequencies (observedFreq,filteredData,3,1,1);
+MG94custom = 0;
+MULTIPLY_BY_FREQS = PopulateModelMatrix ("MG94custom", observedFreq);
+vectorOfFrequencies = BuildCodonFrequencies (observedFreq);
+Model MG94customModel = (MG94custom,vectorOfFrequencies,0);
+USE_POSITION_SPECIFIC_FREQS = 1;
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+incFileName = HYPHY_LIB_DIRECTORY+"TemplateBatchFiles"+DIRECTORY_SEPARATOR+"queryTree.bf";
+ExecuteCommands  ("#include \""+incFileName+"\";");
+
+Tree		   givenTree = treeString;
+
+internalNodes = BranchCount(givenTree);
+leafNodes     = TipCount(givenTree);
+choiceMatrix  = {internalNodes+leafNodes,2};
+
+for (bc=0; bc<internalNodes; bc=bc+1)
+{
+	choiceMatrix[bc][0] = BranchName(givenTree,bc);
+	choiceMatrix[bc][1] = "Internal Branch Rooting " + givenTree[bc];
+}
+
+for (bc=0; bc<leafNodes; bc=bc+1)
+{
+	choiceMatrix[bc+internalNodes][0] = TipName(givenTree,bc);
+	choiceMatrix[bc+internalNodes][1] = "Terminal branch endin in " + choiceMatrix[bc+internalNodes][0];
+}
+
+mxTreeSpec = {5,1};
+mxTreeSpec [0] = "givenTree";
+mxTreeSpec [1] = "8240";
+mxTreeSpec [2] = "10,40,-10,-175,1";
+mxTreeSpec [3] = "";
+mxTreeSpec [4] = "";
+OpenWindow (TREEWINDOW, mxTreeSpec);
+
+ChoiceList  (bOption,"Choose the branch to test",0,NO_SKIP,choiceMatrix);
+
+if (bOption[0] < 0)
+{
+	return -1;
+}
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+nsRateClasses = Rows(aaRateClassIDs);
+nsChoiceMatrix = {Columns(nsRateClasses),2};
+defineGlobals  = "";
+defineGlobals * 1024;
+
+for (bc=0; bc<Columns(nsRateClasses); bc=bc+1)
+{
+	nsChoiceMatrix[bc][0] = nsRateClasses[bc];
+	nsChoiceMatrix[bc][1] = "Non-synonymous rate parameter nsClass" + nsRateClasses[bc];
+	defineGlobals * ("global SharedNS"+nsRateClasses[bc]+"=1;ReplicateConstraint(\"this1.?.nsClass"+nsRateClasses[bc]+":=SharedNS"+nsRateClasses[bc]+"\",givenTree);\n");
+}
+
+defineGlobals * 0;
+
+ExecuteCommands (defineGlobals);
+							
+
+ChoiceList	(paramSpec,"Parameters to test:",0,SKIP_NONE,nsChoiceMatrix);
+
+if (paramSpec[0]<0)
+{
+	return 0;
+}
+
+LikelihoodFunction lf = (filteredData, givenTree);
+
+fprintf (stdout, "\n1. Working on the null hypothesis.\n");
+Optimize (res_null, lf);
+fprintf (stdout, lf);
+
+fprintf (stdout, "\n\n2. Working on the alternative hypothesis.\n");
+
+for (h=0; h<Columns(bOption)*Rows(bOption); h=h+1)
+{
+	v = bOption[h];
+	for (bc=0; bc<Columns(paramSpec)*Rows(paramSpec); bc=bc+1)
+	{
+		k = paramSpec[bc];
+		ExecuteCommands ("givenTree."+choiceMatrix[v][0]+".nsClass"+nsRateClasses[k]+"="+"givenTree."+choiceMatrix[v][0]+".nsClass"+nsRateClasses[k]+";");
+	}
+}
+
+som = OPTIMIZATION_METHOD;
+sulr = USE_LAST_RESULTS;
+OPTIMIZATION_METHOD = 0;
+USE_LAST_RESULTS = 1;
+Optimize (res_alt, lf);
+fprintf (stdout, lf);
+OPTIMIZATION_METHOD = som;
+USE_LAST_RESULTS = sulr;
+
+fprintf (stdout, "\nBranch parameter estimates\n\n");
+
+for (h=0; h<Columns(bOption)*Rows(bOption); h=h+1)
+{
+	v = bOption[h];
+	for (bc=0; bc<Columns(paramSpec)*Rows(paramSpec); bc=bc+1)
+	{
+		k = paramSpec[bc];
+		paramName = "givenTree."+choiceMatrix[v][0]+".nsClass"+nsRateClasses[k];
+		COVARIANCE_PRECISION = 0.95;
+		COVARIANCE_PARAMETER = paramName;
+		CovarianceMatrix (cmx, lf);
+		fprintf (stdout, paramName, " = ", cmx[1], ", 95% CI: ", cmx[0], "-", cmx[2], "\n");
+	}
+}
+
+lnLikDiff = -2(res_null[1][0]-res_alt[1][0]);
+degFDiff = res_alt[1][1]-res_null[1][1];
+
+fprintf (stdout, "\n\n-2(Ln Likelihood Difference)=",lnLikDiff,"\n","Difference in number of parameters:",Format(degFDiff,0,0));
+fprintf (stdout, "\np-value:",1-CChi2(lnLikDiff,degFDiff));
+
+
+
+
+
diff --git a/res/TemplateBatchFiles/TestClade.bf b/res/TemplateBatchFiles/TestClade.bf
new file mode 100644
index 0000000..c309813
--- /dev/null
+++ b/res/TemplateBatchFiles/TestClade.bf
@@ -0,0 +1,1081 @@
+TRY_NUMERIC_SEQUENCE_MATCH = 1;
+DISTANCE_PROMPTS = 1;
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function PopulateModelMatrix (ModelMatrixName&, doRV)
+{
+	modelDefString = "";
+	modelDefString*128;
+	
+	if (doRV)
+	{
+		incFileName = HYPHY_LIB_DIRECTORY+"TemplateBatchFiles"+DIRECTORY_SEPARATOR+"TemplateModels"+DIRECTORY_SEPARATOR+"defineGamma.mdl";
+		ExecuteCommands  ("#include \""+incFileName+"\";");
+		blp = "c*t;";
+	}	
+	else
+	{
+		blp = "t;";
+	}
+	
+	ModelMatrixName = {4,4};
+	
+	for (transition = 0; transition < 4; transition = transition + 1)
+	{
+		for (transition2 = transition + 1; transition2 < 4; transition2 = transition2 + 1)
+		{
+			modelDefString*("ModelMatrixName["+transition+"]["+transition2+"] := "+_nucBiasTerms[transition][transition2]+blp+
+					        "ModelMatrixName["+transition2+"]["+transition+"] := "+_nucBiasTerms[transition2][transition]+blp);
+		}
+	}
+	modelDefString*0;
+	ExecuteCommands (modelDefString);
+	return 1;
+}
+
+/* ________________________________________________________________________________________________*/
+
+function checkEmbedding (_m1, _m2)
+{
+	for (r=0; r<6; r=r+1)
+	{
+		if (_m2[r]<_m1[r])
+		{
+			return 0;
+		}
+		if (_m2[r]>_m1[r])
+		{
+			for (r2 = 0; r2 < 6; r2 = r2+1)
+			{
+				if ((_m2[r2]==_m2[r])&&(_m1[r2]!=_m1[r]))
+				{
+					return 0;
+				}
+			}
+		}
+	}
+	return 1;
+}
+
+/* ________________________________________________________________________________________________*/
+
+function ReceiveJobs (sendOrNot)
+{
+	if (MPI_NODE_COUNT>1)
+	{
+		MPIReceive (-1, fromNode, result_String);
+		jobModelNum = MPINodeState[fromNode-1][1];
+		vv1 = MPINodeState[fromNode-1][2];
+		vv2 = MPINodeState[fromNode-1][3];
+		vv3 = MPINodeState[fromNode-1][4];
+		vv4 = MPINodeState[fromNode-1][5];
+		vv5 = MPINodeState[fromNode-1][6];
+		vv6 = MPINodeState[fromNode-1][7];
+		if (sendOrNot)
+		{
+			MPISend (fromNode,lf);
+			MPINodeState[fromNode-1][1] = modelNum;		
+			MPINodeState[fromNode-1][2] = v1;
+			MPINodeState[fromNode-1][3] = v2;
+			MPINodeState[fromNode-1][4] = v3;
+			MPINodeState[fromNode-1][5] = v4;
+			MPINodeState[fromNode-1][6] = v5;
+			MPINodeState[fromNode-1][7] = v6;
+		}
+		else
+		{
+			MPINodeState[fromNode-1][0] = 0;
+			MPINodeState[fromNode-1][1] = -1;		
+		}
+		
+		ExecuteCommands (result_String);
+	}
+	else
+	{
+		jobModelNum = modelNum;
+	}
+	
+	if (jobModelNum == 0)
+	{
+		stdl = lf_MLES[1][0];
+		fullnp = lf_MLES[1][1]+totalBranchCount;
+		fprintf(stdout,"\n(012345) Full Model ln-lik =  ",stdl,". Parameter Count=",Format(lf_MLES[1][1],0,0)," AIC = ", 2*(fullnp-stdl),"\n\n");
+
+
+		resultCache [0][0] = 1;
+		resultCache [0][1] = 2;
+		resultCache [0][2] = 3;
+		resultCache [0][3] = 4;
+		resultCache [0][4] = 5;
+		resultCache [0][5] = lf_MLES[1][0];
+		resultCache [0][6] = lf_MLES[1][1]+totalBranchCount;
+		resultCache [0][7] = 0;
+		resultCache [0][8] = 0;
+		
+		fprintf (stdout,"\n#   |  Model   | # prm |    lnL    |      LRT       |    AIC     |   P-Value        |");   
+		fprintf (stdout,"\n----|----------|-------|-----------|----------------|------------|------------------|");   
+
+		if (MPI_NODE_COUNT>1)
+		{
+			for (h=1; h<203; h=h+1)
+			{
+				lnL = resultCache[h][5];
+				
+				if (lnL<0)
+				{
+					np = resultCache[h][6];
+					LRT = -2*(lnL-stdl);
+					if (LRT<0)
+					{
+						LRT = 0;
+					}
+					AIC = -2*lnL+2*np;
+					PRINT_DIGITS = 3;
+					fprintf (stdout,"\n",h);
+					PRINT_DIGITS = 1;
+					fprintf (stdout," | (",0, resultCache[h][0], resultCache[h][1], resultCache[h][2], resultCache[h][3], resultCache[h][4],") | ");
+					fprintf (stdout,Format (np,5,0));
+					PRINT_DIGITS = 8;
+					fprintf (stdout, " |  ",lnL," | ",Format(LRT,14,3), " |  ", AIC, "  |  ", );
+					
+					PRINT_DIGITS = 15;
+					if (LRT==0)
+					{
+						pValue = 1;					
+					}
+					else
+					{
+						pValue = 1-CChi2(LRT,fullnp-np);
+					}
+					fprintf (stdout,pValue," |");
+					resultCache [jobModelNum][7] = pValue;
+					if (pValue<rejectAt)
+					{
+						rejectCount = rejectCount+1;
+						resultCache [jobModelNum][8] = 0;
+					}
+					else
+					{
+						resultCache [jobModelNum][8] = 1;					
+					}
+					
+					if (pValue<rejectAt)
+					{
+						fprintf (stdout,"(*)");
+					}				
+				}
+			}
+		}
+		
+		return fromNode-1;
+	}
+	else
+	{
+		if ((MPI_NODE_COUNT>1)&&(resultCache[0][5]>=0))
+		{
+			resultCache [jobModelNum][0] = vv2;
+			resultCache [jobModelNum][1] = vv3;
+			resultCache [jobModelNum][2] = vv4;
+			resultCache [jobModelNum][3] = vv5;
+			resultCache [jobModelNum][4] = vv6;
+			resultCache [jobModelNum][5] = lf_MLES[1][0];
+			resultCache [jobModelNum][6] = lf_MLES[1][1]+totalBranchCount;
+						
+			return fromNode - 1;
+		}
+	}
+
+	np = lf_MLES[1][1]+totalBranchCount;
+	lnL = lf_MLES[1][0];
+	LRT = -2*(lnL-stdl);
+	if (LRT<0)
+	{
+		LRT = 0;
+	}
+	AIC = -2*lnL+2*np;
+	PRINT_DIGITS = 3;
+	fprintf (stdout,"\n",jobModelNum);
+	PRINT_DIGITS = 1;
+	fprintf (stdout," | (",vv1,vv2,vv3,vv4,vv5,vv6,") | ");
+	fprintf (stdout,Format (np,5,0));
+	PRINT_DIGITS = 8;
+	fprintf (stdout, " |  ",lnL," | ",Format(LRT,14,3), " |  ", AIC, "  |  ", );
+		
+	PRINT_DIGITS = 15;
+	if (LRT==0)
+	{
+		pValue = 1;					
+	}
+	else
+	{
+		pValue = 1-CChi2(LRT,fullnp-np);
+	}
+	fprintf (stdout,pValue," |");
+	
+	resultCache [jobModelNum][0] = vv2;
+	resultCache [jobModelNum][1] = vv3;
+	resultCache [jobModelNum][2] = vv4;
+	resultCache [jobModelNum][3] = vv5;
+	resultCache [jobModelNum][4] = vv6;
+	resultCache [jobModelNum][5] = lf_MLES[1][0];
+	resultCache [jobModelNum][6] = lf_MLES[1][1]+totalBranchCount;
+	resultCache [jobModelNum][7] = pValue;
+	if (pValue<rejectAt)
+	{
+		rejectCount = rejectCount+1;
+		resultCache [jobModelNum][8] = 0;
+	}
+	else
+	{
+		resultCache [jobModelNum][8] = 1;					
+	}
+	
+	if (pValue<rejectAt)
+	{
+		fprintf (stdout,"(*)");
+	}
+			
+	return fromNode-1;
+}
+
+/* ________________________________________________________________________________________________*/
+
+function  setElement (h,v,cc)
+{
+	if (modelType==0)
+	{
+		if (cc==0)
+		{
+			m[h][v]:=a;
+			m[v][h]:=a;
+		}
+		else
+		{
+			if (cc==1)
+			{
+				m[h][v]:=b;
+				m[v][h]:=b;
+			}
+			else
+			{
+				if (cc==2)
+				{
+					m[h][v]:=c;
+					m[v][h]:=c;
+				}
+				else
+				{
+					if (cc==3)
+					{
+						m[h][v]:=d;
+						m[v][h]:=d;
+					}
+					else
+					{
+						if (cc==4)
+						{
+							m[h][v]:=e;
+							m[v][h]:=e;
+						}
+						else
+						{
+							m[h][v]:=f;
+							m[v][h]:=f;
+						}
+					}
+				}
+			}
+		}
+	}
+	return 1;
+}
+
+/* ________________________________________________________________________________________________*/
+
+function ModelSelect (modelType, branchLengths, rejectAt)
+{
+	svl = VERBOSITY_LEVEL;
+	VERBOSITY_LEVEL = -1;
+	m={4,4};
+
+	m[0][1]:=a;
+	m[1][0]:=a;
+
+	if (modelType > 0)
+	{
+		global AC;
+		global AT;
+		global CG;
+		global CT;
+		global GT;
+		
+		if (modelType == 1)
+		{
+			m = {{*,AC*t,t,AT*t}
+				 {AC*t,*,CG*t,CT*t}
+				 {t,CG*t,*,GT*t}
+				 {AT*t,CT*t,GT*t,*}};
+		}
+		else
+		{
+			if (modelType == 2)
+			{
+				incFileName = HYPHY_LIB_DIRECTORY+"TemplateBatchFiles"+DIRECTORY_SEPARATOR+"TemplateModels"+DIRECTORY_SEPARATOR+"defineGamma.mdl";
+				ExecuteCommands  ("#include \""+incFileName+"\";");
+			}
+			else
+			{
+				if (modelType == 3)
+				{
+					incFileName = HYPHY_LIB_DIRECTORY+"TemplateBatchFiles"+DIRECTORY_SEPARATOR+"TemplateModels"+DIRECTORY_SEPARATOR+"defineHM.mdl";
+					ExecuteCommands  ("#include \""+incFileName+"\";");
+				}
+			}
+			m = {{*,AC*c*t,c*t,AT*c*t}
+				 {AC*c*t,*,CG*c*t,CT*c*t}
+				 {c*t,CG*c*t,*,GT*c*t}
+				 {AT*c*t,CT*c*t,GT*c*t,*}};
+		}
+	}
+	else
+	{
+		r = setElement (0,2,1);
+		r = setElement (0,3,2);
+		r = setElement (1,2,3);
+		r = setElement (1,3,4);
+		r = setElement (2,3,5);
+	}
+
+	KEEP_OPTIMAL_ORDER = 1;
+	MESSAGE_LOGGING    = 0;
+
+	totalBranchCount = 0;
+	modelNum	= 0;
+	rejectCount = 0;
+	resultCache = {203,9};
+
+
+	Model currentModel = (m,observedFreqs);
+	Tree tr = treeString;
+	LikelihoodFunction lf = (filteredData, tr);
+
+	if (MPI_NODE_COUNT>1)
+	{
+		if (branchLengths == 0)
+		{
+			SHORT_MPI_RETURN = 1;
+		}
+		MPINodeState = {MPI_NODE_COUNT-1,8};
+		OPTIMIZE_SUMMATION_ORDER = 0;
+		MPISend (1,lf);
+		MPINodeState[0][0] = 1;
+		MPINodeState[0][1] = modelNum;
+		if (branchLengths)
+		{
+			dummy = ReceiveJobs (0);
+			SHORT_MPI_RETURN = 1;
+		}
+	}
+	else
+	{
+		Optimize (lf_MLES,lf);
+		vv1 = 0;
+		vv2 = 0;
+		vv3 = 0;
+		vv4 = 0;
+		vv5 = 0;
+		vv6 = 0;
+		dummy = ReceiveJobs (0);
+	}
+
+	if (branchLengths)
+	{
+		totalBranchCount     = TipCount(tr) + BranchCount (tr);
+		stashedLengths		 = {totalBranchCount,1};
+		
+		branchNames = BranchName (givenTree,-1);
+		
+		pia = observedFreqs[0];
+		pic = observedFreqs[1];
+		pig = observedFreqs[2];
+		pit = observedFreqs[3];
+		
+		global totalFactor := AC*(2*pia__*pic__)+2*pia__*pig__+(2*pia__*pit__)*AT+
+								 (2*pic__*pig__)*CG+(2*pic__*pit__)*CT+(2*pig__*pit__)*GT;
+								 
+		for (v2 = 0; v2 < totalBranchCount; v2 = v2+1)
+		{
+			stashedLengths [v2] = BranchLength(tr,v2);
+		}
+	}
+
+	rateBiasTerms = {{"AC","1","AT","CG","CT","GT"}};
+
+	for (v2=0; v2<=1; v2=v2+1)
+	{
+		for (v3=0; v3<=v2+1; v3=v3+1)
+		{
+			if (v3>v2)
+			{
+				ub4 = v3;
+			}
+			else
+			{
+				ub4 = v2;
+			}
+			for (v4=0; v4<=ub4+1; v4=v4+1)
+			{
+				if (v4>=ub4)
+				{
+					ub5 = v4;
+				}
+				else
+				{
+					ub5 = ub4;
+				}
+				for (v5=0; v5<=ub5+1; v5=v5+1)
+				{
+					if (v5>ub5)
+					{
+						ub6 = v5;
+					}
+					else
+					{
+						ub6 = ub5;
+					}
+					for (v6=0; v6<=ub6+1; v6=v6+1)
+					{
+						if (v6==5)
+						{
+							break;
+						}
+						
+						if (modelType > 0)
+						{
+							paramCount	  = 0;
+
+							modelDesc = "0"+Format(v2,1,0);
+							modelDesc = modelDesc+Format(v3,1,0);
+							modelDesc = modelDesc+Format(v4,1,0);
+							modelDesc = modelDesc+Format(v5,1,0);
+							modelDesc = modelDesc+Format(v6,1,0);
+							
+							modelConstraintString = "";
+							
+							AC = 1;
+							AT = 1;
+							CG = 1;
+							CT = 1;
+							GT = 1;
+
+							for (customLoopCounter2=1; customLoopCounter2<6; customLoopCounter2=customLoopCounter2+1)
+							{
+								for (customLoopCounter=0; customLoopCounter<customLoopCounter2; customLoopCounter=customLoopCounter+1)
+								{
+									if (modelDesc[customLoopCounter2]==modelDesc[customLoopCounter])
+									{
+										if (rateBiasTerms[customLoopCounter2] == "1")
+										{
+											modelConstraintString = modelConstraintString + rateBiasTerms[customLoopCounter]+":="+rateBiasTerms[customLoopCounter2]+";";
+										}
+										else
+										{
+											modelConstraintString = modelConstraintString + rateBiasTerms[customLoopCounter2]+":="+rateBiasTerms[customLoopCounter]+";";			
+										}
+										break;
+									}
+								}
+							}	
+
+							if (Abs(modelConstraintString))
+							{
+								ExecuteCommands (modelConstraintString);
+							}
+						}
+						else
+						{
+							r = setElement 		(0,2,v2);
+							r = setElement 		(0,3,v3);
+							r = setElement 		(1,2,v4);
+							r = setElement 		(1,3,v5);
+							r = setElement 		(2,3,v6);
+						}
+										
+						Model currentModel = (m,observedFreqs);
+						if (modelType == 0)
+						{
+							Tree tr = (dummy,dummy2);
+						}
+						Tree tr = treeString;
+						if (branchLengths)
+						{
+							for (mpiNode = 0; mpiNode < totalBranchCount; mpiNode = mpiNode+1)
+							{
+								eCommand = "tr."+branchNames[mpiNode]+".t:="+Format(stashedLengths [mpiNode],20,12)+"/totalFactor";
+								ExecuteCommands (eCommand);
+							}
+						}
+						
+						LikelihoodFunction lf = (filteredData, tr);
+						
+						modelNum = modelNum+1;
+						if (MPI_NODE_COUNT>1)
+						{
+							for (mpiNode = 0; mpiNode < MPI_NODE_COUNT-1; mpiNode = mpiNode+1)
+							{
+								if (MPINodeState[mpiNode][0]==0)
+								{
+									break;	
+								}
+							}
+							
+							if (mpiNode==MPI_NODE_COUNT-1)
+							/* all nodes busy */
+							{
+								mpiNode = ReceiveJobs (1);
+							}
+							else
+							{
+								MPISend (mpiNode+1,lf);
+								MPINodeState[mpiNode][0] = 1;
+								MPINodeState[mpiNode][1] = modelNum;
+								MPINodeState[mpiNode][2] = v1;
+								MPINodeState[mpiNode][3] = v2;
+								MPINodeState[mpiNode][4] = v3;
+								MPINodeState[mpiNode][5] = v4;
+								MPINodeState[mpiNode][6] = v5;
+								MPINodeState[mpiNode][7] = v6;
+							}
+						}
+						else
+						{
+							Optimize (lf_MLES,lf);
+							vv1 = v1;
+							vv2 = v2;
+							vv3 = v3;
+							vv4 = v4;
+							vv5 = v5;
+							vv6 = v6;
+							dummy = ReceiveJobs (0);
+						}
+					}
+				}
+			}
+		}
+
+	}
+
+	if (MPI_NODE_COUNT>1)
+	{
+		while (1)
+		{
+			for (nodeCounter = 0; nodeCounter < MPI_NODE_COUNT-1; nodeCounter = nodeCounter+1)
+			{
+				if (MPINodeState[nodeCounter][0]==1)
+				{
+					fromNode = ReceiveJobs (0);
+					break;	
+				}
+			}
+			if (nodeCounter == MPI_NODE_COUNT-1)
+			{
+				break;
+			}
+		}	
+		OPTIMIZE_SUMMATION_ORDER = 1;
+	}
+
+	PRINT_DIGITS = 0;
+
+	fprintf (stdout, "\n\n--------------------------\n   (*) => p-Value < ", rejectAt, "\nRejected ", rejectCount, " models.\n");
+
+
+	if (rejectCount<202)
+	{
+		fprintf (stdout, "\nPerforming nested tests on the remaining models...\n");
+
+		done = 0;
+		while (!done)
+		{
+			done = 1;
+			for (v2=1; v2<203; v2=v2+1)
+			{
+				if (resultCache[v2][8])
+				{
+					modelString = "0";
+					for (v3 = 0; v3<5; v3=v3+1)
+					{
+						modelString = modelString + resultCache [v2][v3];
+					}
+					for (v3 = v2+1; v3<203; v3 = v3+1)
+					{
+						if (resultCache[v3][8])
+						{
+							modelString2 = "0";
+							for (v4 = 0; v4<5; v4=v4+1)
+							{
+								modelString2 = modelString2 + resultCache [v3][v4];
+							}	
+							if (checkEmbedding (modelString, modelString2))
+							{
+								fprintf (stdout,"H: (", modelString,") A: (", modelString2, "). ");
+								done = 0;
+								LRT = 2*(resultCache[v3][5]-resultCache[v2][5]);
+								npd = resultCache[v3][6]-resultCache[v2][6];
+								if (LRT<0)
+								{
+									pValue = 1;
+								}
+								else
+								{
+									pValue = 1-CChi2(LRT,npd);
+								}
+								fprintf (stdout," P-Value=", Format (pValue,10,3));
+								if (pValue<rejectAt)
+								{
+									fprintf (stdout,". Rejected H.\n");
+									resultCache[v2][8] = 0;
+									break;
+								}
+								else
+								{
+									fprintf (stdout,". Failed to reject H. Discarding A.\n");
+									resultCache[v3][8] = 0;
+								}
+							}
+						}
+					}
+				}
+			}
+		}
+
+		
+		fprintf (stdout,"\n\nRemaining models:\n\n#   |  Model   | # prm |    lnL    |      LRT       |    AIC     |   P-Value        |");   
+		fprintf (stdout,"\n----|----------|-------|-----------|----------------|------------|------------------|"); 
+		
+		modelNum = 0;  
+		v5 = 1e10;
+		v4 = 0;
+
+		for (v2=1; v2<203; v2=v2+1)
+		{
+			if (resultCache[v2][8])
+			{
+				modelNum = 0;
+				modelString = "0";
+				for (v3 = 0; v3<5; v3=v3+1)
+				{
+					modelString = modelString + resultCache [v2][v3];
+				}
+				np  = resultCache[v2][6];
+				lnL = resultCache[v2][5];
+				LRT = -2*(lnL-stdl);
+				if (LRT<0)
+				{
+					LRT = 0;
+				}
+				AIC = -2*lnL+2*np;
+				modelNum = modelNum + 1;
+				PRINT_DIGITS = 3;
+				fprintf (stdout,"\n",v2);
+				PRINT_DIGITS = 1;
+				fprintf (stdout," | (",0,resultCache[v2][0],resultCache[v2][1],resultCache[v2][2],resultCache[v2][3],resultCache[v2][4],") | ");
+				fprintf (stdout,Format (np,5,0));
+				PRINT_DIGITS = 8;
+				fprintf (stdout, " |  ",lnL," | ",Format(LRT,14,3), " |  ", AIC, "  |  ", );
+				PRINT_DIGITS = 15;
+				if (LRT==0)
+				{
+					pValue = 1;					
+				}
+				else
+				{
+					pValue = 1-CChi2(LRT,fullnp-np);
+				}
+				if (AIC<v5)
+				{
+					v5 = AIC;
+					v4 = v2;
+				}
+				fprintf (stdout,pValue," |");
+				
+			}
+		}
+		
+		PRINT_DIGITS = 0;
+		modelString = "0";
+		for (v3 = 0; v3<5; v3=v3+1)
+		{
+			modelString = modelString + Format(resultCache [v4][v3],0,0);
+		}
+		
+		fprintf (stdout, "\n\nAIC based winner: (", modelString, ") with AIC = ", v5, "\n\n");	
+	}
+	else
+	{
+		fprintf (stdout, "\nGeneral Reversible Model is the winner!\n");
+		modelString = "012345";
+	}
+	VERBOSITY_LEVEL = svl;
+	return modelString;
+}
+
+/* ________________________________________________________________________________________________*/
+
+function TreeMatrix2TreeString (doLengths)
+{
+	treeString = "";
+	p = 0;
+	k = 0;
+	m = treeNodes[0][1];
+	n = treeNodes[0][0];
+	d = treeString*(Rows(treeNodes)*25);
+
+	while (m)
+	{	
+		if (m>p)
+		{
+			if (p)
+			{
+				d = treeString*",";
+			}
+			for (j=p;j<m;j=j+1)
+			{
+				d = treeString*"(";
+			}
+		}
+		else
+		{
+			if (m<p)
+			{
+				for (j=m;j<p;j=j+1)
+				{
+					d = treeString*")";
+				}
+			}	
+			else
+			{
+				d = treeString*",";
+			}	
+		}
+		if (n<ds.species)
+		{
+			GetString (nodeName, ds, n);
+			d = treeString*nodeName;
+		}
+		if (doLengths>.5)
+		{
+			nodeName = ":"+treeNodes[k][2];
+			d = treeString*nodeName;
+		}
+		k=k+1;
+		p=m;
+		n=treeNodes[k][0];
+		m=treeNodes[k][1];
+	}
+
+	for (j=m;j<p;j=j+1)
+	{
+		d = treeString*")";
+	}
+	
+	d=treeString*0;
+	return treeString;
+}
+
+/* ________________________________________________________________________________________________*/
+
+function InferTreeTopology(optionFlag)
+{
+	distanceMatrix = {ds.species,ds.species};	
+	if (optionFlag == 0)
+	{
+		incFileName = HYPHY_LIB_DIRECTORY+"TemplateBatchFiles"+DIRECTORY_SEPARATOR+"chooseDistanceFormula.def";
+		ExecuteCommands  ("#include \""+incFileName+"\";");
+		InitializeDistances (0);
+		for (i = 0; i<ds.species; i=i+1)
+		{
+			for (j = i+1; j<ds.species; j = j+1)
+			{
+				distanceMatrix[i][j] = ComputeDistanceFormula (i,j);
+			}
+		}
+	}
+	else
+	{
+		svl = VERBOSITY_LEVEL;
+		VERBOSITY_LEVEL = -1;
+		for (i = 0; i<ds.species; i=i+1)
+		{
+			for (j = i+1; j<ds.species; j = j+1)
+			{
+				DataSetFilter	dFilter = CreateFilter(simData,1,"",speciesIndex == i || speciesIndex == j);
+				Tree			dTree	= (1,2);
+				LikelihoodFunction dLF  = (dFilter, dTree);
+				Optimize (dRes, dLF);
+				distanceMatrix[i][j] = BranchLength (dTree,0);
+			}
+		}
+		VERBOSITY_LEVEL = svl;
+	}
+
+	MESSAGE_LOGGING 		 	= 1;
+	cladesMade 					= 1;
+	
+	if (ds.species == 2)
+	{
+		d1 = distanceMatrix[0][1]/2;
+		treeNodes = {{0,1,d1__},
+					 {1,1,d1__},
+					 {2,0,0}};
+					 
+		cladesInfo = {{2,0}};
+	}
+	else
+	{
+		if (ds.species == 3)
+		{
+			d1 = (distanceMatrix[0][1]+distanceMatrix[0][2]-distanceMatrix[1][2])/2;
+			d2 = (distanceMatrix[0][1]-distanceMatrix[0][2]+distanceMatrix[1][2])/2;
+			d3 = (distanceMatrix[1][2]+distanceMatrix[0][2]-distanceMatrix[0][1])/2;
+			treeNodes = {{0,1,d1__},
+						 {1,1,d2__},
+						 {2,1,d3__}
+						 {3,0,0}};
+						 
+			cladesInfo = {{3,0}};		
+		}
+		else
+		{	
+			njm = (distanceMatrix > methodIndex)>=ds.species;
+				
+			treeNodes 		= {2*(ds.species+1),3};
+			cladesInfo	    = {ds.species-1,2};
+			
+			for (i=Rows(treeNodes)-1; i>=0; i=i-1)
+			{
+				treeNodes[i][0] = njm[i][0];
+				treeNodes[i][1] = njm[i][1];
+				treeNodes[i][2] = njm[i][2];
+			}
+
+			for (i=Rows(cladesInfo)-1; i>=0; i=i-1)
+			{
+				cladesInfo[i][0] = njm[i][3];
+				cladesInfo[i][1] = njm[i][4];
+			}
+			
+			njm = 0;
+		}
+	}
+	distanceMatrix = 0;
+	return TreeMatrix2TreeString (1);
+}
+
+/*--------------------------- MAIN SECTION BEGINS HERE -----------------------------*/
+
+SetDialogPrompt 	("Please specify a nucleotide data file:");
+DataSet ds 			= ReadDataFile (PROMPT_FOR_FILE);
+
+fprintf (stdout, "\nRead the following data:", ds,"\n\n");
+
+#include "partitionSequences.ibf";
+
+DataSetFilter 	   filteredData = CreateFilter (ds,1);
+HarvestFrequencies (observedFreqs,filteredData,1,1,1);
+
+treeString	= 	InferTreeTopology (0);
+
+fprintf (stdout, "\Using this initial NJ topology: ", treeString);
+
+Topology givenTree = treeString;
+if (givenTree <= splitTop)
+{
+	fprintf (stdout, "\n\n\t ** This topology supports the split.\n");
+}
+else
+{
+	fprintf (stdout, "\n\n\t ** This topology DOES NOT support the split.\n");
+}
+
+
+
+ChoiceList  (mOptions,"Model Options",1,NO_SKIP,
+			 "Auto-select","Run a model selection procedure to choose the appropriate model.",
+			 "User","User chooses a model.");
+	
+
+if (mOptions < 0)
+{
+	return;	
+}
+
+global AC = 1;
+global AT = 1;
+global CG = 1;
+global CT = 1;
+global GT = 1;
+
+MGCustomRateBiasTerms = {{"AC*","","AT*","CG*","CT*","GT*"}};	
+
+if (mOptions)
+{
+	done = 0;
+	while (!done)
+	{
+		fprintf (stdout,"\nPlease enter a 6 character model designation (e.g:010010 defines HKY85):");
+		fscanf  (stdin,"String", modelDesc);
+		if (Abs(modelDesc)==6)
+		{	
+			done = 1;
+		}
+	}			
+}
+else
+{
+	modelDesc	= 	ModelSelect (1,1,0.0002);
+}
+
+paramCount	  = 0;
+_nucBiasTerms = {4,4};
+_nucBiasTerms[0][0] = "";
+
+
+if (modelDesc[0]==modelDesc[1])
+{
+	MGCustomRateBiasTerms[0] = MGCustomRateBiasTerms[1];
+}
+
+_nucBiasTerms[1][0] = MGCustomRateBiasTerms[0];
+_nucBiasTerms[0][1] = MGCustomRateBiasTerms[0];
+_nucBiasTerms[2][0] = MGCustomRateBiasTerms[1];
+_nucBiasTerms[0][2] = MGCustomRateBiasTerms[1];
+
+h = 0;
+v = 3;
+
+for (customLoopCounter2=2; customLoopCounter2<6; customLoopCounter2=customLoopCounter2+1)
+{
+	for (customLoopCounter=0; customLoopCounter<customLoopCounter2; customLoopCounter=customLoopCounter+1)
+	{
+		if (modelDesc[customLoopCounter]==modelDesc[customLoopCounter2])
+		{
+			_nucBiasTerms[h][v] = MGCustomRateBiasTerms[customLoopCounter];
+			_nucBiasTerms[v][h] = MGCustomRateBiasTerms[customLoopCounter];
+			break;
+		}
+	}
+	if (customLoopCounter == customLoopCounter2)
+	{
+		_nucBiasTerms[h][v] = MGCustomRateBiasTerms[customLoopCounter2];
+		_nucBiasTerms[v][h] = MGCustomRateBiasTerms[customLoopCounter2];
+	}
+	
+	v = v+1;
+	if (v==4)
+	{
+		h=h+1;
+		v=h+1;
+	}
+}
+
+c44matrix = 0;
+MULTIPLY_BY_FREQS 			= PopulateModelMatrix ("c44matrix", 0);
+Model c44model		 		= (c44matrix,observedFreqs,MULTIPLY_BY_FREQS);
+Tree   NRTree 				= treeString;
+
+LikelihoodFunction lfNR = (filteredData, NRTree);
+Optimize (resNR, lfNR);
+
+fprintf (stdout, "\n\nNo rate variation likelihood fit results:", lfNR, "\n");
+
+ChoiceList  (rvOptions,"Rate Variation Options",1,NO_SKIP,
+			 "Test","Test for site-to-site rate variation.",
+			 "Skip the test","Skip this test.");
+	
+
+if (rvOptions < 0)
+{
+	return;	
+}
+
+execString = "Model simModel = (c44matrix,simFreq,1)";		
+
+if (rvOptions == 0)
+{
+	c44matrixRV = 0;
+	MULTIPLY_BY_FREQS 			= PopulateModelMatrix ("c44matrixRV", 1);
+	Model c44modelRV		 	= (c44matrixRV,observedFreqs,MULTIPLY_BY_FREQS);
+	Tree   RVTree 				= treeString;
+	LikelihoodFunction lfRV = (filteredData, RVTree);
+	Optimize (resRV, lfRV);
+	
+	fprintf (stdout, "\n\nSite-to-site rate variation likelihood fit results:", lfRV, "\n");
+	
+	AICNR = 2*(resNR[1][1]-resNR[1][0]);
+	AICRV = 2*(resRV[1][1]-resRV[1][0]);
+	
+	fprintf (stdout, "\n\n AIC comparison:\n\t No rate variation: ", AICNR, "\n\t Site-to-site rate variation: ", AICRV, "\n");
+	
+	if (AICRV < AICNR)
+	{
+		fprintf (stdout, "\n\nChoosing the site-to-site rate variation model.");
+		for (siteCount = 0; siteCount < resRV[1][2]; siteCount = siteCount+1)
+		{
+			GetString (globalVarName,lfRV,siteCount);
+			ExecuteCommands (globalVarName+":="+globalVarName+"__;");
+			execString = "Model simModel = (c44matrixRV,simFreq,1)";
+		}	
+	}
+	else
+	{
+		for (siteCount = 0; siteCount < resNR[1][2]; siteCount = siteCount+1)
+		{
+			GetString (globalVarName,lfNR,siteCount);
+			ExecuteCommands (globalVarName+":="+globalVarName+"__;");
+		}	
+		fprintf (stdout, "\n\nChoosing the homogeneous rates model.");	
+	}
+}	
+else
+{
+	for (siteCount = 0; siteCount < resNR[1][2]; siteCount = siteCount+1)
+	{
+		GetString (globalVarName,lfNR,siteCount);
+		ExecuteCommands (globalVarName+":="+globalVarName+"__;");
+	}	
+}
+
+bootstrapSamples = 0;
+supportClade	 = 0;
+
+while (bootstrapSamples<=0)
+{
+	fprintf (stdout,"\nHow many bootstrap replicates (>=1)?");
+	fscanf  (stdin,"Number", bootstrapSamples);
+}	
+
+SetDialogPrompt ("Spool boostrap trees to:");
+fprintf (PROMPT_FOR_FILE,CLEAR_FILE);
+bsTrees = LAST_FILE_PATH;
+for (itCount = 1; itCount <= bootstrapSamples; itCount = itCount+1)
+{
+	DataSetFilter simData = Bootstrap(ds,1);
+	HarvestFrequencies (simFreq,simData,1,1,0);
+	ExecuteCommands (execString);
+	SimTreeString	= 	InferTreeTopology (1);
+	fprintf (bsTrees,SimTreeString,"\n");
+	fprintf (stdout, "Iteration ", Format(itCount,5,0), "/", bootstrapSamples);
+	Topology SimTree = SimTreeString;
+	if (SimTree<=splitTop)
+	{
+		fprintf (stdout, " + ");	
+		supportClade = supportClade + 1;
+	}
+	else
+	{
+		fprintf (stdout, " - ");		
+	}
+	fprintf (stdout, "\t Running support value:", Format (supportClade/itCount,10,6), "\n");
+}
diff --git a/res/TemplateBatchFiles/TestCladeMeans.bf b/res/TemplateBatchFiles/TestCladeMeans.bf
new file mode 100644
index 0000000..b2abc9b
--- /dev/null
+++ b/res/TemplateBatchFiles/TestCladeMeans.bf
@@ -0,0 +1,420 @@
+ChoiceList (testType,"Test for",1,SKIP_NONE,"Mean branch length","Compare mean branch lengths between two or more non-nested clades.",
+				     "Mean pairwise divergence","Compare mean within-clade pairwise divergence between two or more non-nested clades.");
+
+if (testType < 0)
+{
+	return 0;
+}
+
+if (testType)
+{
+	echoString = "mean within-clade divergence";
+}
+else
+{
+	echoString = "mean within-clade branch length (or component branch length)";
+}
+ChoiceList (dataType,"Data type",1,SKIP_NONE,"Nucleotide/Protein","Nucleotide or amino-acid (protein).",
+				     "Codon","Codon (several available genetic codes).");
+
+if (dataType<0) 
+{
+	return;
+}
+
+if (dataType)
+{
+	NICETY_LEVEL = 3;
+	SetDialogPrompt ("Please choose a codon data file:");
+	incFileName = HYPHY_LIB_DIRECTORY+"TemplateBatchFiles"+DIRECTORY_SEPARATOR+"TemplateModels"+DIRECTORY_SEPARATOR+"chooseGeneticCode.def";
+	ExecuteCommands  ("#include \""+incFileName+"\";");
+}
+else
+{
+	SetDialogPrompt ("Please choose a nucleotide or amino-acid data file:");
+}
+
+DataSet ds = ReadDataFile (PROMPT_FOR_FILE);
+
+if (dataType)
+{
+	DataSetFilter filteredData = CreateFilter (ds,3,"","",GeneticCodeExclusions);
+}
+else
+{
+	DataSetFilter filteredData = CreateFilter (ds,1);
+}
+
+fprintf (stdout,"\n______________READ THE FOLLOWING DATA______________\n",ds);
+
+
+_DO_TREE_REBALANCE_ = 0;
+
+SelectTemplateModel(filteredData);
+
+if (Rows("LAST_MODEL_PARAMETER_LIST")>1)
+{
+	ChoiceList (parameter2Constrain, "Parameter(s) to constrain:",1,SKIP_NONE,LAST_MODEL_PARAMETER_LIST);
+
+	if (parameter2Constrain<0)
+	{
+		return 0;
+	}
+	if (parameter2Constrain==0)
+	{
+		fprintf (stdout, "ERROR: Multiple parameter constraints are not supported by this analysis; sorry!\n");
+		return 0;
+	}
+}
+else
+{
+	parameter2Constrain = 1;
+}
+
+GetString (funnyString,LAST_MODEL_PARAMETER_LIST,parameter2Constrain-1);
+
+_DO_TREE_REBALANCE_ = 0;
+incFileName = HYPHY_LIB_DIRECTORY+"TemplateBatchFiles"+DIRECTORY_SEPARATOR+"queryTree.bf";
+ExecuteCommands  ("#include \""+incFileName+"\";");
+
+treeAVL  = givenTree ^ 1; /* pre-order traversal */
+
+if (testType)
+{
+	treeAVL2 = givenTree ^ 0; /* post-order traversal */
+
+	multFactors = {};
+	for (k=1; k<Abs(treeAVL2); k=k+1)
+	{
+		aNode = treeAVL2[k];
+		aNodeName = aNode["Name"];
+		parentIndex = aNode["Parent"];
+		k2 = Abs(aNode["Children"]);
+		if (k2)
+		{
+			currentDepth = aNode["Below"];
+			multFactors[aNodeName] = currentDepth;		
+			if (parentIndex > 0)
+			{
+				pInfo = treeAVL2[parentIndex];
+				pInfo ["Below"] = pInfo ["Below"] + currentDepth;
+				treeAVL2[parentIndex] = pInfo;
+			}
+		}
+		else
+		{
+			multFactors[aNodeName] = 1;
+			pInfo = treeAVL2[parentIndex];
+			pInfo ["Below"] = pInfo ["Below"] + 1;
+			treeAVL2[parentIndex] = pInfo;
+		}
+		
+	}
+	treeAVL2 		= 0;
+}
+
+branchNameList 	= BranchName (givenTree,-1);
+mapToBL		    = {};
+
+for (k=0; k<Columns(branchNameList); k=k+1)
+{
+	aNode = branchNameList[k];
+	mapToBL [aNode] = k;
+}
+
+cladeNodeLists 	= {};
+cladeIDLists    = {};
+cladeSumVar		= {};
+nameToAVLIdx	= {};
+cladeLeafCount  = {};
+
+for (k=1; k<Abs(treeAVL); k=k+1)
+{
+	aNode 	  = treeAVL[k];
+	aNodeName = aNode["Name"]; /*upcase*/
+	nameToAVLIdx [aNodeName] = k;
+	match = (aNodeName&&1)$"^CLADE[0-9]+$";
+	if (match[0]>=0 && Abs (aNode["Children"])>0)
+	/* valid clade */
+	{
+		currentDepth = aNode["Depth"];		
+		nodeList = {};
+		
+		leafCount = 0;
+		
+		for (k2=k+1; k2<Abs(treeAVL); k2=k2+1)
+		{
+			aNode2 = treeAVL[k2];
+			if (aNode2["Depth"] <= currentDepth)
+			{
+				break;
+			}
+			if (Abs(aNode2["Children"]) == 0)
+			{
+				leafCount = leafCount + 1;
+			}
+			minCladeIndex = aNode2["Name"];
+			nodeList[Abs(nodeList)] = minCladeIndex;
+			nameToAVLIdx [minCladeIndex] = k2;
+		}
+				
+		k = k2-1;
+		cladesFound = Abs(nodeList);
+		cladeNodeLists[aNodeName] = nodeList;
+		indexMatrix = {cladesFound,1};
+		for (k2 = 0; k2 < cladesFound; k2=k2+1)
+		{
+			aNode2 = nodeList[k2];
+			indexMatrix [k2] = mapToBL[aNode2];
+		}
+		
+		cladeIDLists[aNodeName] = indexMatrix;
+		cladeLeafCount[aNodeName] = leafCount;
+	}
+}
+
+
+cladesFound = Abs (cladeNodeLists);
+if (cladesFound < 2)
+{ 
+	fprintf (stdout, "ERROR: Couldn't find 2 or more (non-nested) clades with roots labeled by CladeN, where N is a number. Found ", cladesFound, " labeled clades\n");
+	return 0;
+}
+
+cladeRoots = Rows (cladeNodeLists);
+
+minCladeSize  = 1e100;
+minCladeIndex = 0;
+
+mFactors  = {};
+bmFactors = {};
+
+fprintf (stdout, "\n\nFound ", cladesFound, " labeled clades\n");
+for (k=0; k<cladesFound; k=k+1)
+{
+	cladeName = cladeRoots[k];
+	cladeSize =  Abs(cladeNodeLists[cladeName]);
+	leafCount =  Abs(cladeLeafCount[cladeName]);
+	
+	fprintf (stdout, "Clade rooted at ", cladeName, " with ", cladeSize , " branches and ", leafCount, " leaves.\n");
+	nodeList = cladeNodeLists[cladeName];
+	
+	if (testType)
+	{
+		if (minCladeSize > leafCount)
+		{
+			minCladeSize = leafCount;
+			minCladeIndex = k;
+		}
+	}
+	else
+	{
+		if (minCladeSize > cladeSize)
+		{
+			minCladeSize = cladeSize;
+			minCladeIndex = k;
+		}
+	}
+	
+	bmFactor = {Columns(branchNameList),1};
+	cString = "";
+	cString * 256;
+	for (k2 = 0; k2<Abs(nodeList); k2=k2+1)
+	{
+		aNodeName = nodeList[k2];
+		aNode = nameToAVLIdx[aNodeName];
+		aNode = treeAVL[aNode];
+		if (testType)
+		{
+			cCount = Abs(aNode["Children"]);
+			if (cCount)
+			{	
+				cCount = multFactors[aNodeName];
+				mFactors[aNodeName] = (leafCount-cCount)*cCount
+			}
+			else
+			{
+				mFactors[aNodeName] = leafCount-1;
+			}
+		}
+		else
+		{
+			mFactors[aNodeName] = 1;
+		}
+		k3 = mapToBL[aNodeName];
+		bmFactor [k3] = mFactors[aNodeName];
+		if (k2)
+		{
+			cString * "+";
+		}
+		cString * ("TREE_PLACE_HOLDER."+aNodeName + "." + funnyString + "*" + mFactors[aNodeName]);
+	}
+	cString * 0;
+	cladeSumVar[cladeName] = cString;
+	bmFactors[cladeName] = bmFactor;
+	
+}
+
+
+fprintf (stdout, "1). Running an unconstrained fit\n");
+
+Tree aTree = treeString;
+
+USE_LAST_RESULTS = 0;
+
+LikelihoodFunction lf = (filteredData,aTree);
+
+Optimize (res_free,lf);
+fprintf  (stdout, lf, "\n");
+
+blVector = BranchLength (aTree,-1);
+ReportMeans (blVector);
+
+USE_LAST_RESULTS = 1;
+
+fprintf (stdout, "2). Running a completely constrained fit\n");
+
+Tree mirrorTree = treeString;
+
+
+ReplicateConstraint ("this1.?.?:=this2.?.?",mirrorTree,aTree);
+
+ClearConstraints (mirrorTree);
+
+for (k=0; k<cladesFound; k=k+1)
+{
+	if (k==minCladeIndex)
+	{
+		smallCladeName = cladeRoots[minCladeIndex];
+		cladeConstraint = cladeSumVar[smallCladeName] ^ {{"TREE_PLACE_HOLDER","aTree"}};
+		ExecuteCommands ("global SUM_"+smallCladeName+":="+cladeConstraint+";");
+	}
+	else
+	{
+		cladeName = cladeRoots[k];
+		cladeConstraint = cladeSumVar[cladeName] ^ {{"TREE_PLACE_HOLDER","mirrorTree"}};
+		ExecuteCommands ("global SUM_"+cladeName+":="+cladeConstraint+";");	
+	}
+}
+
+
+for (k=0; k<cladesFound; k=k+1)
+{
+	if (k!=minCladeIndex)
+	{
+		cladeName = cladeRoots[k];
+		if (testType)
+		{
+			cladeSize =  cladeLeafCount[cladeName];
+			ExecuteCommands ("ReplicateConstraint (\"this1.?."+funnyString+":= SUM_"+smallCladeName+"*"+(cladeSize*(cladeSize-1)/minCladeSize/(minCladeSize-1))+"/SUM_"+cladeName+"*this2.?."+funnyString+"\",aTree."+cladeName+",mirrorTree."+cladeName+");");
+		}
+		else
+		{
+			cladeSize =  Abs(cladeNodeLists[cladeName]);
+			ExecuteCommands ("ReplicateConstraint (\"this1.?."+funnyString+":= SUM_"+smallCladeName+"*"+(cladeSize/minCladeSize)+"/SUM_"+cladeName+"*this2.?."+funnyString+"\",aTree."+cladeName+",mirrorTree."+cladeName+");");		
+		}
+		ExecuteCommands ("aTree."+cladeName+"."+funnyString+"=0.1;");		
+	}
+}
+
+LikelihoodFunction lf = (filteredData,aTree);
+Optimize (res_contsr,lf);
+
+fprintf  (stdout, "\n\nLRT for difference in mean divergences\n",
+				  "\nLR = ", 2*(res_free[1][0]-res_contsr[1][0]), 
+				  "\np-value = ", 1-CChi2(2*(res_free[1][0]-res_contsr[1][0]),cladesFound-1),"\n");
+				  
+fprintf  (stdout, lf, "\n");
+
+blVector = BranchLength (aTree,-1);
+ReportMeans (blVector);
+
+comparisonIndex = 3;
+
+ClearConstraints (aTree);
+
+
+if (cladesFound > 2)
+{
+	for (c1 = 0; c1<cladesFound-1; c1 = c1+1)
+	{
+		smallCladeName = cladeRoots[c1];
+		if (testType)
+		{
+			minCladeSize =  cladeLeafCount[smallCladeName];
+		}
+		else
+		{
+			minCladeSize =  Abs(cladeNodeLists[smallCladeName]);
+		}
+
+		cladeConstraint = cladeSumVar[smallCladeName] ^ {{"TREE_PLACE_HOLDER","aTree"}};
+		ExecuteCommands ("global SUM_"+smallCladeName+":="+cladeConstraint+";");
+		
+		for (c2 = c1+1; c2 < cladesFound; c2=c2+1)
+		{
+			cladeName = cladeRoots[c2];
+
+			cladeConstraint = cladeSumVar[cladeName] ^ {{"TREE_PLACE_HOLDER","mirrorTree"}};
+			ExecuteCommands ("global SUM_"+cladeName+":="+cladeConstraint+";");	
+
+			if (testType)
+			{
+				cladeSize =  cladeLeafCount[cladeName];
+				ExecuteCommands ("ReplicateConstraint (\"this1.?."+funnyString+":= SUM_"+smallCladeName+"*"+(cladeSize*(cladeSize-1)/minCladeSize/(minCladeSize-1))+"/SUM_"+cladeName+"*this2.?."+funnyString+"\",aTree."+cladeName+",mirrorTree."+cladeName+");");
+			}
+			else
+			{
+				cladeSize =  Abs(cladeNodeLists[cladeName]);
+				ExecuteCommands ("ReplicateConstraint (\"this1.?."+funnyString+":= SUM_"+smallCladeName+"*"+(cladeSize/minCladeSize)+"/SUM_"+cladeName+"*this2.?."+funnyString+"\",aTree."+cladeName+",mirrorTree."+cladeName+");");
+			}
+			
+			ExecuteCommands ("aTree."+cladeName+".t=0.1;");		
+			fprintf (stdout, comparisonIndex, "). Running a constrained fit on clades ", smallCladeName, " and ", cladeName, "\n");
+		
+			LikelihoodFunction lf = (filteredData,aTree);
+			Optimize (res_2c,lf);
+
+fprintf  (stdout, "\n\nLRT for difference in mean divergences\n",
+				  "\nLR = ", 2*(res_free[1][0]-res_2c[1][0]), 
+				  "\np-value = ", 1-CChi2(2*(res_free[1][0]-res_2c[1][0]),1),"\n");
+
+			fprintf  (stdout, lf, "\n");
+
+			blVector = BranchLength (aTree,-1);
+			ReportMeans (blVector);
+			comparisonIndex = comparisonIndex + 1;
+			
+			ClearConstraints (aTree);
+		}
+		
+	}
+}
+
+USE_LAST_RESULTS = 0;
+
+/*--------------------------------------------------------------------------------------------------------------*/
+
+function ReportMeans (branches)
+{
+	for (k=0; k<cladesFound; k=k+1)
+	{
+		cladeName = cladeRoots[k];
+		sum = branches*bmFactors[cladeName];
+		
+		if (testType)
+		{
+			leafCount = cladeLeafCount[cladeName];
+			sum = sum[0]*2/leafCount/(leafCount-1);
+		}
+		else
+		{
+			cladeSize =  Abs(cladeNodeLists[cladeName]);
+			sum = sum[0]/cladeSize;		
+		}
+				
+		fprintf (stdout, "Clade rooted at ", cladeName, " has ", echoString, " of ", sum, "\n");
+		
+	}
+	return 0;
+}
diff --git a/res/TemplateBatchFiles/TopologySearch.bf b/res/TemplateBatchFiles/TopologySearch.bf
new file mode 100644
index 0000000..fa47b1b
--- /dev/null
+++ b/res/TemplateBatchFiles/TopologySearch.bf
@@ -0,0 +1,498 @@
+/* ____________________________________________*/
+
+function TreeMatrix2TreeString (levelIndex)
+{
+	treeString = "";
+	p = 0;
+	k = 0;
+	m = treeNodes[0][levelIndex+1];
+	n = treeNodes[0][levelIndex];
+
+	while (m)
+	{	
+		if (m>p)
+		{
+			if (p)
+			{
+				treeString = treeString+",";
+			}
+			for (j=p;j<m;j=j+1)
+			{
+				treeString = treeString+"(";
+			}
+		}
+		else
+		{
+			if (m<p)
+			{
+				for (j=m;j<p;j=j+1)
+				{
+					treeString = treeString+")";
+				}
+			}	
+			else
+			{
+				treeString = treeString+",";
+			}	
+		}
+		if (n<ds.species)
+		{
+			GetString (nodeName, ds, n);
+			treeString = treeString+nodeName;
+		}
+		k=k+1;
+		p=m;
+		n=treeNodes[k][levelIndex];
+		m=treeNodes[k][levelIndex+1];
+	}
+
+	for (j=m;j<p;j=j+1)
+	{
+		treeString = treeString+")";
+	}
+	
+	return treeString;
+}
+
+
+/* ____________________________________________*/
+
+function  _PrepareForTreeSearch (treesToBeSearched)
+{
+	bestTreesStash    = {10,2};
+	globalTreeCounter = 0;
+	treeStatistics    = {treesToBeSearched, 1};
+	for (ii=0; ii<10; ii=ii+1)
+	{
+		bestTreesStash [ii][1] = -1e100;
+		bestTreesStash [ii][0] = "";
+	}
+	return 1;
+}
+
+/* ____________________________________________*/
+
+function  _AddTreeToResults		(currentTreeString, currentLFValue)
+{
+	treeStatistics [globalTreeCounter][0] = currentLFValue;
+	globalTreeCounter = globalTreeCounter+1;
+	
+	for (ii = 0; ii<10; ii=ii+1)
+	{
+		if (currentLFValue>bestTreesStash[ii][1])
+		{
+			break;
+		}
+	}
+	if (ii<10)
+	{
+		for (ii2 = 8; ii2>=ii; ii2=ii2-1)
+		{
+			bestTreesStash [ii2+1][1] = bestTreesStash[ii2][1];
+			bestTreesStash [ii2+1][0] = bestTreesStash[ii2][0];
+		}
+		bestTreesStash [ii][0] = currentTreeString;
+		bestTreesStash [ii][1] = currentLFValue;
+	}
+	return 1;
+}
+
+/*---------------------------------------------------------------*/
+
+function ReceiveJobs (sendOrNot)
+{
+	if (MPI_NODE_COUNT>1)
+	{
+		MPIReceive (-1, fromNode, result_String);
+		
+		saveTree = MPINodeTree[fromNode-1];
+		saveIdx	 = MPINodeInfo[fromNode-1][1];
+		
+		if (sendOrNot)
+		{
+			MPISend 	(fromNode,current_MPIJOB);
+			MPINodeTree[fromNode-1]    = thisTree;
+			MPINodeInfo[fromNode-1][1] = treeCounter;
+		}
+		else
+		{
+			MPINodeInfo[fromNode-1][0]  = 0;
+			MPINodeInfo[fromNode-1][1]  = -1;
+			MPINodeTree[fromNode-1]     = "";
+		}
+		
+		thisTree    = saveTree;
+		ExecuteCommands ("currentLL = " + result_String + ";");
+				
+		saveCounter = treeCounter;
+		treeCounter	= saveIdx;
+	}
+	else
+	{
+		currentLL = res[1][0];
+	}
+	
+	dummy = _AddTreeToResults (thisTree, currentLL);
+	if (currentLL>bestValue)
+	{
+		bestValue = currentLL;
+		bestTree = thisTree;
+	}
+	fprintf (stdout, " ==> logLhd = ", currentLL);
+	
+	if (MPI_NODE_COUNT>1)
+	{
+		treeCounter = saveCounter;
+	}
+	
+	return fromNode-1;
+}
+
+/* ____________________________________________*/
+
+function  _ReportTreeStatistics		(currentLFValue)
+{
+	ii = 0;
+	fprintf (stdout, "\n\n**************************\n",
+					     "*     TREE REPORT	       *\n",
+					     "**************************\n\n");
+					     
+	fprintf (stdout, "\n#### BEST TREES #####\n\n");
+					     
+	for (ii=0; ii<10; ii = ii+1)
+	{
+		if (bestTreesStash[ii][1]==(-1e100))
+		{
+			break;
+		}
+		fprintf (stdout, ii+1, ").");
+		
+		if (ii>0)
+		{
+			fprintf (stdout, " Worse by: ", bestTreesStash[ii][1]-currentLFValue);
+		}
+		fprintf (stdout,"\n",  bestTreesStash[ii][0], "\nLog-likelihood = ", bestTreesStash[ii][1], "\n\n");
+	}
+	
+	fprintf (stdout, "\n#### STATISTICS #####\n\n");
+	
+	bestTreesStash [0][0] = 0.1;
+	bestTreesStash [1][0] = 0.5;
+	bestTreesStash [2][0] = 1;
+	bestTreesStash [3][0] = 5;
+	bestTreesStash [4][0] = 10;
+	bestTreesStash [5][0] = 50;
+	bestTreesStash [6][0] = 100;
+	bestTreesStash [7][0] = 1000;
+	bestTreesStash [8][0] = 10000;
+	bestTreesStash [9][0] = 1e100;
+
+	bestTreesStash [0][1] = 0;
+	bestTreesStash [1][1] = 0;
+	bestTreesStash [2][1] = 0;
+	bestTreesStash [3][1] = 0;
+	bestTreesStash [4][1] = 0;
+	bestTreesStash [5][1] = 0;
+	bestTreesStash [6][1] = 0;
+	bestTreesStash [7][1] = 0;
+	bestTreesStash [8][1] = 0;
+	bestTreesStash [9][1] = 0;
+	
+	probabilityOfTheData = 0;
+	
+	for (i=0; i<globalTreeCounter; i=i+1)
+	{
+		diff = currentLFValue-treeStatistics[i];
+		j = 0;
+		while (diff>bestTreesStash[j][0])
+		{
+			j=j+1;
+		}
+		bestTreesStash [j][1] = bestTreesStash [j][1] + 1;
+		probabilityOfTheData = probabilityOfTheData+Exp(-diff);
+	}
+	
+	bestTreesStash [0][1] = bestTreesStash [0][1]-1;
+	
+	ii = "+---------------+---------------+---------------+---------------+\n";
+	fprintf (stdout, "\n\n", ii, 
+							    "| From Best +   |  To Best +    |   Tree Count  |  % of total	  |\n",
+							 ii);
+	for (i=0; i<10; i=i+1)
+	{	
+		if (i)
+		{
+			fprintf (stdout, "| " , Format (bestTreesStash [i-1][0],13,1));
+		}
+		else
+		{
+			fprintf (stdout, "|             0");
+		}
+		if (i<9)
+		{
+			fprintf (stdout, " | " , Format (bestTreesStash [i][0],13,1));
+		}
+		else
+		{
+			fprintf (stdout, " |      Infinity");
+		}		
+		fprintf (stdout, " | ", Format (bestTreesStash [i][1],13,0), " | ", Format (100*bestTreesStash [i][1]/globalTreeCounter,13,8), " |\n",ii); 
+	}
+	
+	fprintf (stdout, "\n\nPosterior probability of the best tree (with uninformative prior) = ",1./probabilityOfTheData,"\n\n");
+	
+	fprintf (stdout, "\n\n***********Save full tree statistics to a file (y/n)?");
+
+	fscanf  (stdin, "String", resp);
+
+	if ((resp!="n")&&(resp!="N"))
+	{
+		SetDialogPrompt ("Write tree stats string to:");
+		fprintf (PROMPT_FOR_FILE,CLEAR_FILE,treeStatistics);
+	}
+	treeStatistics = 0;
+
+	return 1;
+}
+
+/* ____________________________________________*/
+
+MESSAGE_LOGGING = 0;
+VERBOSITY_LEVEL = -1;
+
+SetDialogPrompt ("Please choose a nucleotide or amino-acid data file:");
+
+DataSet ds 				   = ReadDataFile (PROMPT_FOR_FILE);
+DataSetFilter filteredData = CreateFilter (ds,1,"","");
+SelectTemplateModel			(filteredData);
+
+if (MPI_NODE_COUNT > 1)
+{
+	mpiJobPrefix = "";
+	mpiJobPrefix * 128;
+	mpiJobPrefix * ("DataSet ds = ReadDataFile (\""+LAST_FILE_PATH+"\");DataSetFilter filteredData = CreateFilter (ds,1);");
+	Export		 (modelExp, USE_LAST_MODEL);
+	mpiJobPrefix * modelExp;
+	mpiJobPrefix * 0;
+	mpiJobSuffix = "LikelihoodFunction lf = (filteredData,givenTree);Optimize(res,lf);return res[1][0];";
+}
+
+treeNodes 		= {2*(ds.species+1),2*(ds.species-2)};
+cladesInfo 		= {ds.species,2*(ds.species-2)};
+
+branchIndex		= {ds.species-3,1};
+currentLevel 	= 0;
+
+done 			= false;
+
+i = 2*ds.species-5;
+j = 1;
+while (i>1)
+{
+	j = j*i;
+	i = i-2;
+}
+
+dummy = _PrepareForTreeSearch (j);
+
+treeNodes[0][0]=0;
+treeNodes[0][1]=1;
+treeNodes[1][0]=1;
+treeNodes[1][1]=1;
+treeNodes[2][0]=2;
+treeNodes[2][1]=1;
+treeNodes[3][0]=ds.species;
+treeNodes[3][1]=0;
+cladesInfo[0][0]=0;
+cladesInfo[0][1]=4;
+
+bestTree ="";
+bestValue=-1e20;
+
+done = 0;
+treeCounter = 0;
+
+if (MPI_NODE_COUNT>1)
+{
+	MPINodeInfo  = {MPI_NODE_COUNT-1,2};
+	MPINodeTree  = {MPI_NODE_COUNT-1,1};
+	MPINodeTree[0]  = "";
+}
+
+while (!done)
+{
+	if (branchIndex[currentLevel]<2*currentLevel+3)
+	{
+		i = 0;
+		shift = 0;
+		j = 2*currentLevel;
+		k = j+2;
+		m = j+1;
+		while (treeNodes[i][m])
+		{
+			/*copy tree from prev level to this level */
+			if (i==branchIndex[currentLevel])
+			/*insert new branch*/
+			{
+				shift = 2;
+				if (treeNodes[i][j]<ds.species)
+				/* simple branch */
+				{
+					treeNodes[i][k]=treeNodes[i][j];
+					treeNodes[i][k+1]=treeNodes[i][m]+1;
+					treeNodes[i+1][k]=currentLevel+3;
+					treeNodes[i+1][k+1]=treeNodes[i][m]+1;
+					treeNodes[i+2][k]=currentLevel+ds.species+1;
+					treeNodes[i+2][k+1]=treeNodes[i][m];
+					cladesInfo[currentLevel+1][k] = i;
+					cladesInfo[currentLevel+1][k+1] = 3;					
+				}
+				else
+				{
+					/* update node depths for the entire clade now*/
+					l = treeNodes[i][j]-ds.species;
+					s = cladesInfo[l][j];
+					for (p=s+cladesInfo[l][m]-1; p>=s; p=p-1)
+					{
+						treeNodes[i][k]=treeNodes[i][j];
+						treeNodes[i][k+1]=treeNodes[i][m]+1;						
+						i=i-1;
+					}
+					i=i+cladesInfo[l][m];
+					/* new clade record */
+					cladesInfo[currentLevel+1][k] = cladesInfo[l][j];
+					cladesInfo[currentLevel+1][k+1] = cladesInfo[l][m]+2;
+					/* now we need to insert two more nodes */
+					treeNodes[i+1][k]=currentLevel+3;
+					treeNodes[i+1][k+1]=treeNodes[i][m]+1;
+					treeNodes[i+2][k]=currentLevel+ds.species+1;
+					treeNodes[i+2][k+1]=treeNodes[i][m];
+				}
+				for (p=0; p<=currentLevel; p=p+1)
+				{
+					if (cladesInfo[p][j]>i)
+					{
+						cladesInfo[p][k] = cladesInfo[p][j]+2;
+					}
+					else
+					{
+						cladesInfo[p][k] = cladesInfo[p][j];
+					}
+					
+					if ((cladesInfo[p][j]<=i)&&((cladesInfo[p][j]+cladesInfo[p][m])>i+1))
+					{
+						cladesInfo[p][k+1] = cladesInfo[p][m]+2;
+					}
+					else
+					{
+						cladesInfo[p][k+1] = cladesInfo[p][m];
+					}
+				}				
+			}
+			else
+			{
+				treeNodes[i+shift][k]=treeNodes[i][j];
+				treeNodes[i+shift][k+1]=treeNodes[i][m];
+			}
+			i = i+1;
+		}
+		treeNodes[i+2][k]=treeNodes[i][j];
+		treeNodes[i+2][k+1]=treeNodes[i][j+1];
+		if (currentLevel<ds.species-4)
+		{
+			currentLevel = currentLevel+1;
+		}
+		else
+		{
+			thisTree = TreeMatrix2TreeString (2*(currentLevel+1));
+			branchIndex[currentLevel]=branchIndex[currentLevel]+1;
+			fprintf (stdout, "\nTree#",Format(treeCounter,0,0)," ", thisTree);
+			current_MPIJOB = mpiJobPrefix + "Tree givenTree = " + thisTree + ";" + mpiJobSuffix;
+			if (MPI_NODE_COUNT>1)
+			{
+				for (mpiNode = 0; mpiNode < MPI_NODE_COUNT-1; mpiNode = mpiNode+1)
+				{
+					if (MPINodeInfo[mpiNode][0]==0)
+					{
+						break;	
+					}
+				}
+				
+				if (mpiNode==MPI_NODE_COUNT-1)
+				/* all nodes busy */
+				{
+					mpiNode = ReceiveJobs (1);
+				}
+				else
+				{
+					MPINodeInfo[mpiNode][0] = 1;
+					MPINodeInfo[mpiNode][1] = treeCounter;
+					MPINodeTree[mpiNode] = thisTree;
+					MPISend (mpiNode+1,current_MPIJOB);
+				}
+			}
+			else
+			{
+				Tree    treeVar = thisTree;
+				LikelihoodFunction lf = (filteredData, treeVar);
+				Optimize (res, lf);
+				ReceiveJobs (0);
+			}
+			treeCounter = treeCounter+1;
+		}
+	}
+	else
+	{
+		branchIndex[currentLevel]=0;
+		if (currentLevel==0)
+		{
+			done = 1;
+		}
+		else
+		{
+			currentLevel = currentLevel-1;
+			branchIndex[currentLevel]=branchIndex[currentLevel]+1;
+		}
+	}
+}
+
+if (MPI_NODE_COUNT>1)
+{
+	while (1)
+	{
+		for (nodeCounter = 0; nodeCounter < MPI_NODE_COUNT-1; nodeCounter = nodeCounter+1)
+		{
+			if (MPINodeInfo[nodeCounter][0]==1)
+			{
+				fromNode = ReceiveJobs (0);
+				break;	
+			}
+		}
+		if (nodeCounter == MPI_NODE_COUNT-1)
+		{
+			break;
+		}
+	}	
+}	
+
+
+VERBOSITY_LEVEL = 0;
+
+fprintf (stdout,"\n\n --------------------- RESULTS --------------------- \n\n");
+fprintf (stdout,"\n\n BestTree =", bestTree);
+
+dummy = _ReportTreeStatistics (bestValue);
+
+Tree	tr = bestTree;
+LikelihoodFunction lf = (filteredData, tr);
+Optimize (res,lf);
+fprintf (stdout, "\n",lf, "\n\n***********Save this tree to a file (y/n)?");
+
+fscanf  (stdin, "String", resp);
+
+if ((resp!="n")&&(resp!="N"))
+{
+	SetDialogPrompt ("Write tree string to:");
+	fprintf (PROMPT_FOR_FILE,CLEAR_FILE,bestTree,";");
+}
+
diff --git a/res/TemplateBatchFiles/TopologySearchConstrained.bf b/res/TemplateBatchFiles/TopologySearchConstrained.bf
new file mode 100644
index 0000000..557075f
--- /dev/null
+++ b/res/TemplateBatchFiles/TopologySearchConstrained.bf
@@ -0,0 +1,411 @@
+/* ____________________________________________*/
+
+function TreeMatrix2TreeString (levelIndex)
+{
+	treeString = "";
+	p = 0;
+	k = 0;
+	m = treeNodes[0][levelIndex+1];
+	n = treeNodes[0][levelIndex];
+
+	while (m)
+	{	
+		if (m>p)
+		{
+			if (p)
+			{
+				treeString = treeString+",";
+			}
+			for (j=p;j<m;j=j+1)
+			{
+				treeString = treeString+"(";
+			}
+		}
+		else
+		{
+			if (m<p)
+			{
+				for (j=m;j<p;j=j+1)
+				{
+					treeString = treeString+")";
+				}
+			}	
+			else
+			{
+				treeString = treeString+",";
+			}	
+		}
+		if (n<ds.species)
+		{
+			GetString (nodeName, ds, n);
+			treeString = treeString+nodeName;
+		}
+		k=k+1;
+		p=m;
+		n=treeNodes[k][levelIndex];
+		m=treeNodes[k][levelIndex+1];
+	}
+
+	for (j=m;j<p;j=j+1)
+	{
+		treeString = treeString+")";
+	}
+	
+	return treeString;
+}
+
+
+/* ____________________________________________*/
+
+function  _PrepareForTreeSearch (treesToBeSearched)
+{
+	bestTreesStash    = {10,2};
+	globalTreeCounter = 0;
+	treeStatistics    = {treesToBeSearched, 1};
+	for (ii=0; ii<10; ii=ii+1)
+	{
+		bestTreesStash [ii][1] = -1e100;
+		bestTreesStash [ii][0] = "";
+	}
+	return 1;
+}
+
+/* ____________________________________________*/
+
+function  _AddTreeToResults		(currentTreeString, currentLFValue)
+{
+	if (Abs(statFileName)>0)
+	{
+		fprintf (statFileName, currentLFValue, ";", currentTreeString, "\n");
+	}
+	
+	treeStatistics [globalTreeCounter][0] = currentLFValue;
+	globalTreeCounter = globalTreeCounter+1;
+	
+	for (ii = 0; ii<10; ii=ii+1)
+	{
+		if (currentLFValue>bestTreesStash[ii][1])
+		{
+			break;
+		}
+	}
+	if (ii<10)
+	{
+		for (ii2 = 8; ii2>=ii; ii2=ii2-1)
+		{
+			bestTreesStash [ii2+1][1] = bestTreesStash[ii2][1];
+			bestTreesStash [ii2+1][0] = bestTreesStash[ii2][0];
+		}
+		bestTreesStash [ii][0] = currentTreeString;
+		bestTreesStash [ii][1] = currentLFValue;
+	}
+	return 1;
+}
+
+/* ____________________________________________*/
+
+function  _ReportTreeStatistics		(currentLFValue)
+{
+	ii = 0;
+	fprintf (stdout, "\n\n**************************\n",
+					     "*     TREE REPORT	       *\n",
+					     "**************************\n\n");
+					     
+	fprintf (stdout, "\n#### BEST TREES #####\n\n");
+					     
+	for (ii=0; ii<10; ii = ii+1)
+	{
+		if (bestTreesStash[ii][1]==(-1e100))
+		{
+			break;
+		}
+		fprintf (stdout, ii+1, ").");
+		
+		if (ii>0)
+		{
+			fprintf (stdout, " Worse by: ", bestTreesStash[ii][1]-currentLFValue);
+		}
+		fprintf (stdout,"\n",  bestTreesStash[ii][0], "\nLog-likelihood = ", bestTreesStash[ii][1], "\n\n");
+	}
+	
+	fprintf (stdout, "\n#### STATISTICS #####\n\n");
+	
+	bestTreesStash [0][0] = 0.1;
+	bestTreesStash [1][0] = 0.5;
+	bestTreesStash [2][0] = 1;
+	bestTreesStash [3][0] = 5;
+	bestTreesStash [4][0] = 10;
+	bestTreesStash [5][0] = 50;
+	bestTreesStash [6][0] = 100;
+	bestTreesStash [7][0] = 1000;
+	bestTreesStash [8][0] = 10000;
+	bestTreesStash [9][0] = 1e100;
+
+	bestTreesStash [0][1] = 0;
+	bestTreesStash [1][1] = 0;
+	bestTreesStash [2][1] = 0;
+	bestTreesStash [3][1] = 0;
+	bestTreesStash [4][1] = 0;
+	bestTreesStash [5][1] = 0;
+	bestTreesStash [6][1] = 0;
+	bestTreesStash [7][1] = 0;
+	bestTreesStash [8][1] = 0;
+	bestTreesStash [9][1] = 0;
+	
+	for (i=0; i<globalTreeCounter; i=i+1)
+	{
+		diff = currentLFValue-treeStatistics[i];
+		j = 0;
+		while (diff>bestTreesStash[j][0])
+		{
+			j=j+1;
+		}
+		bestTreesStash [j][1] = bestTreesStash [j][1] + 1;
+	}
+	
+	bestTreesStash [0][1] = bestTreesStash [0][1]-1;
+	
+	ii = "+---------------+---------------+---------------+---------------+\n";
+	fprintf (stdout, "\n\n", ii, 
+							    "| From Best +   |  To Best +    |   Tree Count  |  % of total	  |\n",
+							 ii);
+	for (i=0; i<10; i=i+1)
+	{	
+		if (i)
+		{
+			fprintf (stdout, "| " , Format (bestTreesStash [i-1][0],13,1));
+		}
+		else
+		{
+			fprintf (stdout, "|             0");
+		}
+		if (i<9)
+		{
+			fprintf (stdout, " | " , Format (bestTreesStash [i][0],13,1));
+		}
+		else
+		{
+			fprintf (stdout, " |      Infinity");
+		}		
+		fprintf (stdout, " | ", Format (bestTreesStash [i][1],13,0), " | ", Format (100*bestTreesStash [i][1]/globalTreeCounter,13,8), " |\n",ii); 
+	}
+	
+	treeStatistics = 0;
+
+	return 1;
+}
+
+/* ____________________________________________*/
+
+MESSAGE_LOGGING = 0;
+
+SetDialogPrompt ("Please choose a nucleotide or amino-acid data file:");
+DataSet ds = ReadDataFile (PROMPT_FOR_FILE);
+DataSetFilter filteredData = CreateFilter (ds,1,"","");
+
+SetDialogPrompt ("Please choose a tree constraint:");
+fscanf			(PROMPT_FOR_FILE, "String", Tree_Constraint_String);
+
+Tree			Tree_Constraint = Tree_Constraint_String;
+
+SelectTemplateModel(filteredData);
+treeNodes = {2*(ds.species+1),2*(ds.species-2)};
+cladesInfo = {ds.species,2*(ds.species-2)};
+branchIndex= {ds.species-3,1};
+currentLevel = 0;
+
+done = false;
+
+i = 2*ds.species-5;
+j = 1;
+while (i>1)
+{
+	j = j*i;
+	i = i-2;
+}
+
+dummy = _PrepareForTreeSearch (j);
+
+treeNodes[0][0]=0;
+treeNodes[0][1]=1;
+treeNodes[1][0]=1;
+treeNodes[1][1]=1;
+treeNodes[2][0]=2;
+treeNodes[2][1]=1;
+treeNodes[3][0]=ds.species;
+treeNodes[3][1]=0;
+cladesInfo[0][0]=0;
+cladesInfo[0][1]=4;
+
+bestTree ="";
+bestValue=-1e20;
+
+done = 0;
+
+fprintf (stdout, "\n\n***********Save full tree statistics to a file (y/n)?");
+fscanf  (stdin, "String", resp);
+
+statFileName = "";
+
+if ((resp!="n")&&(resp!="N"))
+{
+	SetDialogPrompt ("Write tree stats strings to:");
+	fprintf (PROMPT_FOR_FILE,CLEAR_FILE);
+	statFileName = LAST_FILE_PATH;
+}
+
+fprintf (stdout, "\n\n*********** RUNNING CONSTRAINED TREE SEARCH ***********\nConstraint:", Tree_Constraint_String, "\n\n");
+
+
+treeCounter = 0;
+
+while (!done)
+{
+	if (branchIndex[currentLevel]<2*currentLevel+3)
+	{
+		i = 0;
+		shift = 0;
+		j = 2*currentLevel;
+		k = j+2;
+		m = j+1;
+		while (treeNodes[i][m])
+		{
+			/*copy tree from prev level to this level */
+			if (i==branchIndex[currentLevel])
+			/*insert new branch*/
+			{
+				shift = 2;
+				if (treeNodes[i][j]<ds.species)
+				/* simple branch */
+				{
+					treeNodes[i][k]=treeNodes[i][j];
+					treeNodes[i][k+1]=treeNodes[i][m]+1;
+					treeNodes[i+1][k]=currentLevel+3;
+					treeNodes[i+1][k+1]=treeNodes[i][m]+1;
+					treeNodes[i+2][k]=currentLevel+ds.species+1;
+					treeNodes[i+2][k+1]=treeNodes[i][m];
+					cladesInfo[currentLevel+1][k] = i;
+					cladesInfo[currentLevel+1][k+1] = 3;					
+				}
+				else
+				{
+					/* update node depths for the entire clade now*/
+					l = treeNodes[i][j]-ds.species;
+					s = cladesInfo[l][j];
+					for (p=s+cladesInfo[l][m]-1; p>=s; p=p-1)
+					{
+						treeNodes[i][k]=treeNodes[i][j];
+						treeNodes[i][k+1]=treeNodes[i][m]+1;						
+						i=i-1;
+					}
+					i=i+cladesInfo[l][m];
+					/* new clade record */
+					cladesInfo[currentLevel+1][k] = cladesInfo[l][j];
+					cladesInfo[currentLevel+1][k+1] = cladesInfo[l][m]+2;
+					/* now we need to insert two more nodes */
+					treeNodes[i+1][k]=currentLevel+3;
+					treeNodes[i+1][k+1]=treeNodes[i][m]+1;
+					treeNodes[i+2][k]=currentLevel+ds.species+1;
+					treeNodes[i+2][k+1]=treeNodes[i][m];
+				}
+				for (p=0; p<=currentLevel; p=p+1)
+				{
+					if (cladesInfo[p][j]>i)
+					{
+						cladesInfo[p][k] = cladesInfo[p][j]+2;
+					}
+					else
+					{
+						cladesInfo[p][k] = cladesInfo[p][j];
+					}
+					
+					if ((cladesInfo[p][j]<=i)&&((cladesInfo[p][j]+cladesInfo[p][m])>i+1))
+					{
+						cladesInfo[p][k+1] = cladesInfo[p][m]+2;
+					}
+					else
+					{
+						cladesInfo[p][k+1] = cladesInfo[p][m];
+					}
+				}				
+			}
+			else
+			{
+				treeNodes[i+shift][k]=treeNodes[i][j];
+				treeNodes[i+shift][k+1]=treeNodes[i][m];
+			}
+			i = i+1;
+		}
+		treeNodes[i+2][k]=treeNodes[i][j];
+		treeNodes[i+2][k+1]=treeNodes[i][j+1];
+		if (currentLevel<ds.species-4)
+		{
+			currentLevel = currentLevel+1;
+		}
+		else
+		{
+			thisTree = TreeMatrix2TreeString (2*(currentLevel+1));
+			branchIndex[currentLevel]=branchIndex[currentLevel]+1;
+			Tree    treeVar = thisTree;
+			if (treeVar <= Tree_Constraint)
+			{
+				fprintf (stdout, "\nTree#",Format(treeCounter,0,0)," ", thisTree);
+				LikelihoodFunction lf = (filteredData, treeVar);
+				Optimize (res,lf);
+				dummy = _AddTreeToResults (thisTree, res[1][0]);
+				if (res[1][0]>bestValue)
+				{
+					bestValue = res[1][0];
+					bestTree = thisTree;
+				}
+				fprintf (stdout, " ==> logLhd = ", res[1][0]);
+				treeCounter = treeCounter+1;
+			}
+		}
+	}
+	else
+	{
+		branchIndex[currentLevel]=0;
+		if (currentLevel==0)
+		{
+			done = 1;
+		}
+		else
+		{
+			currentLevel = currentLevel-1;
+			branchIndex[currentLevel]=branchIndex[currentLevel]+1;
+		}
+	}
+}
+
+if (globalTreeCounter)
+{
+	fprintf (stdout,"\n\n --------------------- RESULTS --------------------- \n\n");
+	fprintf (stdout," Total tree count =", Format(treeCounter,0,0));
+	fprintf (stdout,"\n\n BestTree =", bestTree);
+	fprintf (stdout,"\n\nTree Constraint:\n",Tree_Constraint,"\n");
+ 
+
+	dummy = _ReportTreeStatistics (bestValue);
+
+	Tree	tr = bestTree;
+	LikelihoodFunction lf = (filteredData, tr);
+	Optimize (res,lf);
+	fprintf (stdout, "\n",lf, "\n\n***********Save this tree to a file (y/n)?");
+
+	fscanf  (stdin, "String", resp);
+
+	if ((resp!="n")&&(resp!="N"))
+	{
+		SetDialogPrompt ("Write tree string to:");
+		fprintf (PROMPT_FOR_FILE,CLEAR_FILE,bestTree,";");
+	}
+}
+else
+{
+	fprintf (stdout, "\n\n***********************************\n",
+					     "* NO TREES MATCHED THE CONSTRAINT	*\n",
+					     "***********************************\n\n");
+}
+
+
diff --git a/res/TemplateBatchFiles/TreeCorrelationCoefficients.bf b/res/TemplateBatchFiles/TreeCorrelationCoefficients.bf
new file mode 100644
index 0000000..dcb2d30
--- /dev/null
+++ b/res/TemplateBatchFiles/TreeCorrelationCoefficients.bf
@@ -0,0 +1,337 @@
+/*--------------------------------------------------- */
+
+function factorial (x)
+{
+	res = 1;
+	for (x2 = 2; x2 <= x; x2=x2+1)
+	{
+		res = res * x2;
+	}
+	return res;
+}
+
+/*--------------------------------------------------- */
+
+function computeGCC (matrix1&, matrix2&)
+{
+	dim = Rows (matrix1);
+	offDiag = ({dim,dim})["_MATRIX_ELEMENT_ROW_!=_MATRIX_ELEMENT_COLUMN_"];
+	rowM	= {1,dim}["1"];
+	colM	= {dim,1}["1"];
+	
+	sum1   = (rowM*(matrix1$offDiag)*colM)[0]/(dim*(dim-1));
+	sum2   = (rowM*(matrix2$offDiag)*colM)[0]/(dim*(dim-1));
+	
+	tmx1   = (matrix1 - offDiag*sum1);
+	tmx2   = (matrix2 - offDiag*sum2);
+	
+	numerator 	= (rowM*(tmx1$tmx2)*colM)[0];
+	denominator	= Sqrt((rowM*(tmx1$tmx1)*colM)[0] * (rowM*(tmx2$tmx2)*colM)[0]);
+	return numerator/denominator;
+}
+
+/*--------------------------------------------------- */
+
+function computeTreeDistanceMetrics (treeID)
+{
+	ExecuteCommands ("_treeAVL = "+ treeID + " ^ 0;_leafCount=TipCount("+treeID+");"); 
+	
+	branchDistances 	= {_leafCount,_leafCount};
+	geneticDistances	= {_leafCount,_leafCount};
+	
+	_leafIndexer		= 0;
+	
+	for (_k=1; _k<Abs(_treeAVL)-1; _k=_k+1)
+	{
+		aNode 	    = _treeAVL[_k];
+		aNodeName   = aNode["Name"];
+		parentIndex = aNode["Parent"];
+		bL			= aNode["Length"]; 
+
+		if (Rows((_treeAVL[parentIndex])["Split"]) == 0)
+		{
+			(_treeAVL[parentIndex])["Split"] = {_leafCount,1};
+		} 
+
+		if (Abs(aNode["Children"]) == 0)
+		{
+			for (_k2 = 0; _k2 < _leafCount; _k2 = _k2 + 1)
+			{
+				if (_leafIndexer != _k2)
+				{
+					branchDistances [_k2][_leafIndexer]  = branchDistances [_k2][_leafIndexer] + 1;
+					branchDistances [_leafIndexer][_k2]  = branchDistances [_k2][_leafIndexer];
+					geneticDistances [_k2][_leafIndexer] = geneticDistances [_k2][_leafIndexer] + bL;
+					geneticDistances [_leafIndexer][_k2] = geneticDistances [_k2][_leafIndexer];
+				}
+			}
+			((_treeAVL[parentIndex])["Split"])[_leafIndexer] = 1;
+			_leafIndexer = _leafIndexer + 1;
+		}
+		else
+		{
+			_inL 	= {};
+			_outL	= {};
+			
+			for (_k2 = 0; _k2 < _leafCount; _k2 = _k2 + 1)
+			{
+				if ((aNode["Split"])[_k2])
+				{
+					_inL[Abs(_inL)] = _k2;
+				}
+				else
+				{
+					_outL[Abs(_outL)] = _k2;
+				}
+			}
+				
+			for (_k2 = Abs(_outL)-1; _k2 >=0 ; _k2 = _k2 - 1)
+			{
+				_idx1 = _outL[_k2];
+				for (_k3 = Abs(_inL)-1; _k3 >=0 ; _k3 = _k3 - 1)
+				{
+					_idx2 = _inL[_k3];
+					branchDistances [_idx1][_idx2]   = branchDistances [_idx1][_idx2] + 1;
+					branchDistances [_idx2][_idx1]   = branchDistances [_idx2][_idx1] + 1;
+					geneticDistances [_idx1][_idx2]  = geneticDistances [_idx1][_idx2] + bL;
+					geneticDistances [_idx2][_idx1]  = geneticDistances [_idx2][_idx1] + bL;
+				}
+			}
+			
+			(_treeAVL[parentIndex])["Split"] = (_treeAVL[parentIndex])["Split"] + aNode["Split"];
+		}
+		
+	}
+
+	_returnValue = {};
+	_returnValue ["GD"] = geneticDistances;
+	_returnValue ["BD"] = branchDistances;
+	
+	return 		 _returnValue;
+	
+}
+
+
+
+/*--------------------------------------------------- */
+
+fprintf (stdout, "\n+-------------------------------------+\n",
+				   "| r and r_b compartmentalization test |\n",
+				   "| implementing the procedure given by |\n",
+				   "|       D.E. Critchlow et al. in      |\n",
+				   "| Mathematical and Computer Modeling  |\n",
+				   "|          32 (2000) 69-81            |\n",
+				   "+-------------------------------------+\n");
+				   
+SetDialogPrompt ("Load a Newick tree file");
+ACCEPT_ROOTED_TREES = 1;
+fscanf (PROMPT_FOR_FILE,"Tree",givenTree);
+ACCEPT_ROOTED_TREES = 0;
+
+leafCount = TipCount (givenTree);
+fprintf (stdout, "Read tree: ", Format (givenTree,0,0),"\n");
+goOn = 1;
+
+kindCount = 0;
+while (kindCount < 2)
+{
+	fprintf (stdout, "How many sequence types: (>=2):");
+	fscanf  (stdin, "Number", kindCount);
+	kindCount = kindCount $ 1;
+}
+
+goOn  		 = 1;
+
+while (goOn)
+{
+	defClades 	 = 0;
+	clades  	 = {};
+	strings 	 = {};
+	matchedSoFar = {leafCount,1};
+	leafAllocs 	 = {1,leafCount};
+
+	while (defClades < kindCount)
+	{
+
+		st     = "";
+		aClade = {};
+		
+		if (defClades < kindCount-1)
+		{
+			fprintf (stdout,"\nEnter a reg exp used to define clade ",defClades+1,":");
+			fscanf  (stdin,"String",theRegExp);
+
+			for (specIndex = 0; specIndex < leafCount; specIndex = specIndex + 1)
+			{
+				specName = TipName (givenTree, specIndex);
+				specMatch = specName $ theRegExp;
+				
+				if (specMatch[0]>=0 && matchedSoFar[specIndex] == 0)
+				{
+					aClade [specName] = 1;
+					if (Abs(st))
+					{
+						st = st + "," + specName;
+					}
+					else
+					{
+						st = specName;
+					}
+					
+					matchedSoFar [specIndex] = 1;
+					leafAllocs   [specIndex] = defClades;
+				}
+			}
+		}
+		else
+		{
+			for (specIndex = 0; specIndex < leafCount; specIndex = specIndex + 1)
+			{
+				if (matchedSoFar[specIndex] == 0)
+				{
+					specName = TipName (givenTree, specIndex);
+					aClade [specName] = 1;
+					if (Abs(st))
+					{
+						st = st + "," + specName;
+					}
+					else
+					{
+						st = specName;
+					}
+					matchedSoFar [specIndex] = 1;
+					leafAllocs   [specIndex] = kindCount-1;
+				}
+			}		
+		}
+		
+		if (Abs(aClade) == 0)
+		{
+			fprintf (stdout, "ERROR: an empty clade for reg-exp ", goOn, "\n");
+			defClades = kindCount;
+			break;
+		}
+		else
+		{
+			fprintf (stdout, "Matched: ",st,"\n");	
+		}
+		strings[Abs(strings)] = st;
+		clades [Abs(clades) ] = aClade;
+		defClades = defClades + 1;
+	}
+
+	if (Abs(clades) == kindCount)
+	{
+		for (k=0; k<kindCount; k=k+1)
+		{
+			aClade = clades[k];
+			clASize = Abs(aClade);
+			fprintf (stdout, "\nSet ",k+1," (TYPE ",k+1,") includes ", clASize," sequences:\n");
+			cladeKeys = Rows (aClade);
+			for (specIndex = 0; specIndex < clASize; specIndex = specIndex + 1)
+			{
+				fprintf (stdout, "\t", cladeKeys[specIndex],"\n");
+			}
+		}
+		
+		fprintf (stdout, "\nIs this partitioning correct (y/n)");
+		fscanf (stdin, "String", goOn);
+		goOn = (goOn[0] == "n" || goOn[0] == "N");
+	}
+	else
+	{
+		goOn = 1;
+	}
+}
+
+splitsMatrix   	   = {leafCount,leafCount};
+
+for (k=0; k<leafCount; k=k+1)
+{
+	for (k2=0; k2<leafCount; k2=k2+1)
+	{
+		if (leafAllocs[k] != leafAllocs[k2])
+		{
+			splitsMatrix[k][k2] = 1;
+			splitsMatrix[k2][k] = 1;
+		}
+	}
+}
+
+distanceMatrix 	   = computeTreeDistanceMetrics ("givenTree");
+bdmx			   = distanceMatrix["BD"];
+gdmx			   = distanceMatrix["GD"];
+
+ccb				   = computeGCC ("bdmx","splitsMatrix");
+ccg				   = computeGCC ("gdmx","splitsMatrix");
+
+fprintf			   (stdout, "\nCorrelation coefficients:\n",
+						    "\n\tBranch counts (r_b) : ", ccb, 
+						    "\n\tPath lengths  (r)   : ", ccg, "\n");
+
+ChoiceList (resample,"Permutation Test",1,SKIP_NONE,
+					 "Skip","Do not perform a permutation test.",
+				     "Most certainly","Randomly allocate sequences into classes and tabulate the distribution of migration events.");
+				 
+
+if (resample < 1)
+{
+	return 0;
+}
+
+sampleCount = 0;
+totalPossible = factorial(leafCount);
+
+for (k=0; k<kindCount; k=k+1)
+{
+	totalPossible = totalPossible/factorial(Abs(clades[k]));
+}
+
+while (sampleCount < 1)
+{
+	fprintf (stdout, "\nHow many permutations would you like to perform?");
+	fscanf (stdin,"Number",sampleCount);
+}
+
+
+distribution_R  = {sampleCount,1};
+distribution_RB = {sampleCount,1};
+pvR 			= 0;
+pvRB			= 0;
+
+step = sampleCount$10;
+
+for (sampleID = 0; sampleID < sampleCount; sampleID = sampleID + 1)
+{
+	aSample 			   = Random(leafAllocs,0);
+	splitsMatrixR   	   = {leafCount,leafCount};
+
+	for (k=0; k<leafCount; k=k+1)
+	{
+		for (k2=0; k2<leafCount; k2=k2+1)
+		{
+			if (aSample[k] != aSample[k2])
+			{
+				splitsMatrixR[k][k2] = 1;
+				splitsMatrixR[k2][k] = 1;
+			}
+		}
+	}
+
+	ccbR				   = computeGCC ("bdmx","splitsMatrixR");
+	ccgR				   = computeGCC ("gdmx","splitsMatrixR");
+
+	distribution_R  [sampleID] = ccgR;
+	distribution_RB [sampleID] = ccgB;
+	
+	pvR  = pvR + (ccgR>=ccg);
+	pvRB = pvRB + (ccbR>=ccb);
+	
+	if ((sampleID+1)%step == 0)
+	{
+		fprintf (stdout, Format ((sampleID+1)*100/sampleCount, 6, 2), "% done\n");
+	}
+}
+
+fprintf (stdout, "\n\nProb{r_b random >= r_b observed} < ", (pvR+1)/(1+sampleCount),"");
+fprintf (stdout, "\nProb{r random   >= r observed  } < ", (pvRB+1)/(1+sampleCount),"\n\n");
diff --git a/res/TemplateBatchFiles/TreeTools.ibf b/res/TemplateBatchFiles/TreeTools.ibf
new file mode 100644
index 0000000..b56820b
--- /dev/null
+++ b/res/TemplateBatchFiles/TreeTools.ibf
@@ -0,0 +1,819 @@
+/*************************************************************************************/
+
+function PostOrderAVL2StringDL (theAVL, doLengths)
+{
+	return PostOrderAVL2StringAnnotate (theAVL, doLengths, "");
+}
+
+/*************************************************************************************/
+
+function PostOrderAVL2StringAnnotate (theAVL, doLengths,label)
+{
+	return PostOrderAVL2StringAnnotateAux (theAVL, doLengths, label, "[]");
+}
+
+/*************************************************************************************/
+
+function PostOrderAVL2StringAnnotateAux (theAVL, doLengths, label, chars)
+{
+	_ost = "";
+	_ost * 256;
+	
+	lastLevel = 0;
+	treeSize  = Abs(theAVL);
+	treeInfo  = theAVL[0];
+	rootIndex = treeInfo["Root"];
+	
+	for (nodeIndex = 1; nodeIndex < treeSize; nodeIndex = nodeIndex + 1)
+	{
+        nodeInfo = theAVL[nodeIndex];
+        myDepth = nodeInfo["Depth"];
+        if (lastDepth < myDepth)
+        {
+            if (lastDepth)
+            {
+                _ost * ",";
+            }
+            for (pidx = lastDepth; pidx < myDepth; pidx = pidx + 1)
+            {
+                _ost * "(";
+            }
+        }
+        else
+        {
+            if (lastDepth > myDepth)
+            {
+                for (pidx = myDepth; pidx < lastDepth; pidx = pidx + 1)
+                {
+                    _ost * ")";
+                }				
+            }
+            else
+            {
+                _ost * ",";
+            }
+        }
+        
+        _ost * nodeInfo["Name"];
+        
+        if (Abs (label))
+        {
+            if (Abs(nodeInfo[label]))
+            {
+                _ost * (chars[0] + nodeInfo[label] + chars[1]);
+            }
+        }
+
+        if (doLengths)
+        {
+            if (nodeIndex < treeSize - 1)
+            {
+                _ost * ":";
+                _ost * (""+nodeInfo ["Length"]); 
+            }
+        }
+        lastDepth = myDepth;
+	}
+	
+	_ost * 0;
+	return _ost;
+}
+
+
+/*************************************************************************************/
+
+function PostOrderAVL2String (theAVL)
+{
+	return PostOrderAVL2StringDL(theAVL, 0);
+}
+
+/*************************************************************************************/
+
+function PostOrderAVL2StringDistances (theAVL, distAVL)
+{
+	_ost = "";
+	_ost * 256;
+	
+	lastLevel = 0;
+	treeSize  = Abs(theAVL);
+	treeInfo  = theAVL[0];
+	rootIndex = treeInfo["Root"];
+	
+	for (nodeIndex = 1; nodeIndex < treeSize; nodeIndex+=1)
+	{
+        nodeInfo = theAVL[nodeIndex];
+        myDepth = nodeInfo["Depth"];
+        myName 	= nodeInfo["Name"];
+        
+        if (lastDepth < myDepth)
+        {
+            if (lastDepth)
+            {
+                _ost * ",";
+            }
+            for (pidx = lastDepth; pidx < myDepth; pidx = pidx + 1)
+            {
+                _ost * "(";
+            }
+        }
+        else
+        {
+            if (lastDepth > myDepth)
+            {
+                for (pidx = myDepth; pidx < lastDepth; pidx = pidx + 1)
+                {
+                    _ost * ")";
+                }				
+            }
+            else
+            {
+                _ost * ",";
+            }
+        }
+        if (nodeIndex != rootIndex) {
+            _ost * myName;
+        }
+        if (nodeIndex < treeSize - 1)
+        {
+            _ost * ":";
+            _ost * (""+distAVL [myName]); 
+        }
+        lastDepth = myDepth;
+	}
+	
+	_ost * 0;
+	return _ost;
+}
+
+/*************************************************************************************/
+
+function KillInternalZeroBranchLengths (treeAVL)
+{
+	treeSize   = Abs(treeAVL);
+	if (treeSize == 3)
+	{
+		return "(" + (treeAVL[0])["Name"] + "," + (treeAVL[1])["Name"] + ")";
+	}
+	newTreeAVL = {};
+	oldIndexMap= {treeSize,1};
+	index2	   = {treeSize,1};
+	newDAVL	   = {};
+	newTreeAVL [0] = treeAVL[0];
+	allDeleted = 0;
+	for (nodeIndex = 1; nodeIndex < treeSize; nodeIndex = nodeIndex + 1)
+	{
+		newDAVL [(treeAVL[nodeIndex])["Name"]] = (treeAVL[nodeIndex])["Length"];
+		
+		if (Abs((treeAVL[nodeIndex])["Children"]) && Abs((treeAVL[nodeIndex])["Length"]) <= 1e-10 && (treeAVL[nodeIndex])["Parent"]) 
+			/* zero internal branch */
+		{
+			oldIndexMap[nodeIndex] = -(treeAVL[nodeIndex])["Parent"];
+			allDeleted			 = allDeleted + 1;
+		}
+		else
+		{
+			newTreeAVL [nodeIndex-allDeleted] = treeAVL[nodeIndex];
+			oldIndexMap[nodeIndex]   			= nodeIndex-allDeleted;
+			index2 [nodeIndex-allDeleted]		= nodeIndex;
+		}
+	}
+	
+	if (allDeleted)
+	{
+		markedIndices = {};
+		for (nodeIndex = treeSize-1; nodeIndex>0; nodeIndex = nodeIndex - 1)
+		{
+			if (oldIndexMap [nodeIndex]<0)
+			{
+				markedIndices[nodeIndex] = 1;
+				oldIndexMap[nodeIndex] = oldIndexMap[-oldIndexMap[nodeIndex]]; 
+			}
+		}
+		treeSize = Abs (newTreeAVL);
+		for (nodeIndex = 1; nodeIndex<treeSize; nodeIndex = nodeIndex + 1)
+		{
+			meParent = (newTreeAVL[nodeIndex])["Parent"];
+			_cc		 = Abs((newTreeAVL[nodeIndex])["Children"]);
+			if (_cc > 0)
+			{
+				newChildrenMap = {};
+				for (_cci = 0; _cci < _cc; _cci = _cci+1)
+				/* map children to new indices */
+				{				
+					_cn = ((newTreeAVL[nodeIndex])["Children"])[_cci];
+					if (markedIndices[_cn] == 0)
+					{
+						newChildrenMap[Abs(newChildrenMap)] = oldIndexMap[_cn];
+					}
+				}
+				((newTreeAVL[nodeIndex])["Children"]) = newChildrenMap;
+			}
+					
+			if (meParent > 0)
+			{
+				meParentOI = meParent;
+				meParent = oldIndexMap[meParent];
+				(newTreeAVL[nodeIndex])["Parent"] = meParent;
+				if (markedIndices[meParentOI])
+				{
+					/*
+					fprintf (stdout, "Insert ", (newTreeAVL[nodeIndex])["Name"], " as a child of ", (newTreeAVL[meParent])["Name"], " index ", index2[nodeIndex], "(", oldIndexMap[index2[nodeIndex]], ",", nodeIndex,")\n");
+					*/
+					((newTreeAVL[meParent])["Children"])[Abs((newTreeAVL[meParent])["Children"])] = index2[nodeIndex];
+				}
+			}
+
+		}
+		
+		
+		for (nodeIndex = treeSize-1; nodeIndex>0; nodeIndex = nodeIndex - 1)
+		{
+			_cc		 = Abs((newTreeAVL[nodeIndex])["Children"]);
+			if (_cc > 0)
+			{
+				_cd = (newTreeAVL[nodeIndex])["Depth"] + 1;
+				for (_cci = 0; _cci < _cc; _cci = _cci+1)
+				{				
+					_cn =  ((newTreeAVL[nodeIndex])["Children"])[_cci];
+					/*fprintf (stdout, (newTreeAVL[_cn])["Name"], ":", (newTreeAVL[_cn])["Depth"], "=>", _cd, "\n");*/
+					(newTreeAVL[_cn])["Depth"] = _cd;
+				}
+			}
+		}
+
+		(newTreeAVL[0])["Root"] = treeSize-1;
+	}
+	
+	return PostOrderAVL2StringDistances (newTreeAVL, newDAVL);
+}
+
+
+/*************************************************************************************/
+
+function TreeAVL2String (treeAVL)
+{
+	rootNode = treeAVL[0];
+	rootNode = rootNode["Root"];
+	return subtreeAVLStr (rootNode,0,0);
+}
+
+
+/*************************************************************************************/
+
+function subtreeAVLStr (nodeIndex,k,treeString)
+{
+	nodeInfo = treeAVL[nodeIndex];
+	k = Abs(nodeInfo["Children"])-1;
+	if (k>=0)
+	{
+		while (k>=0)
+		{
+			nodeInfo = treeAVL[nodeIndex];
+			cNodes = nodeInfo["Children"];
+			cNodes = cNodes[k];
+			if (k < Abs(nodeInfo["Children"])-1)
+			{
+				ExecuteCommands("treeString=subtreeAVLStr (cNodes,k,treeString)+\",\"+treeString;");
+			}
+			else
+			{
+				ExecuteCommands("treeString=subtreeAVLStr (cNodes,k,treeString)+\")\";");
+			}
+			k=k-1;
+		}
+		return "("+treeString;
+	}
+	else
+	{
+		callLevel = callLevel - 1;
+		return nodeInfo["Name"];
+	}
+}
+
+/*************************************************************************************/
+
+function InsertANode (theAVL&,insertAt,newNodeName)
+{
+	nodeInfo = theAVL[insertAt];
+	if (Abs(nodeInfo))
+	{
+		nparent = nodeInfo["Parent"];
+		if (nparent > 0)
+		{
+			lastIndex = Abs(theAVL);
+			myDepth = nodeInfo["Depth"];
+			newParentNode = {};
+			newParentNode ["Name"] = "Node"+lastIndex;
+			newParentNode ["Parent"] = nparent;
+			newParentNode ["Depth"] = myDepth;
+			
+			newChildNode = {};
+			newChildNode ["Name"] = newNodeName;
+			newChildNode ["Parent"] = lastIndex;
+			newChildNode ["Depth"] = myDepth + 1;
+			
+			pChildren = {};
+			pChildren [0] = insertAt;
+			pChildren [1] = lastIndex+1;
+			newParentNode ["Children"] = pChildren;
+			
+			theAVL[lastIndex] = newParentNode;
+			theAVL[lastIndex+1] = newChildNode;
+
+			/* update the parent*/
+
+			nodeInfo ["Parent"] = lastIndex;
+			theAVL[insertAt] = nodeInfo;
+			
+			/* update the list of children at the parent node*/
+			
+			parentInfo = theAVL[nparent];
+			parentChildren = parentInfo["Children"];
+			
+			for (nic = Abs(parentChildren)-1; nic >= 0; nic = nic-1)
+			{
+				if (parentChildren[nic] == insertAt)
+				{
+					break;
+				}
+			}
+
+			parentChildren[nic] = lastIndex;
+			parentInfo["Children"] = parentChildren;
+			theAVL[nparent] = parentInfo;
+			
+			/* now update the depths at new NodeName and all of its children */
+			
+			nodeCache    = {};
+			nodeCache[0] = insertAt;
+			cacheIndex   = 0;
+			
+			while (cacheIndex <= Abs(nodeCache))
+			{
+				nparent 			= nodeCache[cacheIndex];
+				nodeInfo 			= theAVL[nparent];
+				nodeInfo["Depth"] 	= nodeInfo["Depth"] + 1;
+				theAVL[nparent] 	= nodeInfo;
+				nodeChildren 		= nodeInfo["Children"];
+				for (nic = Abs(nodeChildren)-1; nic >=0; nic = nic-1)
+				{
+					nodeCache [Abs(nodeCache)] = nodeChildren[nic];
+				}
+				cacheIndex = cacheIndex + 1;
+			}
+			
+			nodeCache = 0;
+		}
+	}
+	return 0;
+}
+
+/*************************************************************************************/
+
+function	ModifyDepth (nIndex, modAmount)
+{
+	nodeInfo = theAVL[nIndex];
+	nodeInfo ["Depth"] = nodeInfo ["Depth"] + modAmount;
+	theAVL[nIndex] = nodeInfo;
+
+}
+
+/*************************************************************************************/
+
+function	echoAVL (anAVL)
+{
+	for (k=1; k<Abs(anAVL); k=k+1)
+	{
+		nodeInfo 			= anAVL[k];
+		myChildren			= nodeInfo["Children"];
+		if (Abs(myChildren))
+		{
+			fprintf (stdout, "Index ", k, ":", nodeInfo["Name"], " : parent = ", nodeInfo["Parent"], " children:");
+			for (k2 = 0; k2 < Abs(myChildren); k2=k2+1)
+			{
+				fprintf (stdout,"\t", myChildren[k2]);
+			}
+			fprintf (stdout, " depth: ", nodeInfo["Depth"], "\n");
+		
+		}
+		else
+		{
+			fprintf (stdout, "Index ", k, ":", nodeInfo["Name"], " : parent = ", nodeInfo["Parent"], " children: none, depth: ", nodeInfo["Depth"], "\n");
+		}
+	}
+	return 0;
+}
+
+/*************************************************************************************/
+
+function	selectATreeBranch (treeID, title)
+{
+	ExecuteCommands ("internalNodes = BranchCount(`treeID`);");
+	ExecuteCommands ("leafNodes     = TipCount(`treeID`);");
+
+	choiceMatrix  = {internalNodes+leafNodes,2};
+	
+	for (bc=0; bc<internalNodes; bc=bc+1)
+	{
+		ExecuteCommands ("choiceMatrix[bc][0] = BranchName(`treeID`,bc);choiceMatrix[bc][1] = \"Internal Branch Rooting \" + `treeID`[bc];");
+	}
+	
+	for (bc=0; bc<leafNodes; bc=bc+1)
+	{
+		ExecuteCommands ("choiceMatrix[bc+internalNodes][0] = TipName(`treeID`,bc);");
+		choiceMatrix[bc+internalNodes][1] = "Terminal branch endin in " + choiceMatrix[bc+internalNodes][0];
+	}
+	
+	mxTreeSpec = {5,1};
+	mxTreeSpec [0] = treeID;
+	mxTreeSpec [1] = "8240";
+	mxTreeSpec [2] = "10,40,-10,-175,1";
+	mxTreeSpec [3] = "";
+	mxTreeSpec [4] = "";
+	OpenWindow (TREEWINDOW, mxTreeSpec);
+	
+	ChoiceList  (bOption,title,1,NO_SKIP,choiceMatrix);
+	
+	if (bOption < 0)
+	{
+		return "";
+	}
+	return choiceMatrix[bOption][0];
+}
+
+/*************************************************************************************/
+
+function	computeTreeSplits (treeID,mirror,leafMap)
+{
+	ExecuteCommands ("_treeAVL		= `treeID`^0;");
+	ExecuteCommands ("_leafNodes     = TipCount(`treeID`);");
+	_tipMap			= {};
+	_splitMap		= {};
+	_splitTemplate = {_leafNodes,1};
+	_hasLeafMap	   = Abs (leafMap);
+	
+	for (_k = 1; _k < Abs(_treeAVL); _k = _k+1)
+	{
+		if (Abs((_treeAVL[_k])["Children"]) == 0)
+		{
+			if (_hasLeafMap)
+			{
+				_tipMap [_k] = leafMap [(_treeAVL[_k])["Name"]];
+			}
+			else
+			{
+				_tipMap [_k] = Abs(_tipMap);
+			}
+		}
+		(_treeAVL[_k])["Split"]		   = _splitTemplate;
+	}
+	
+	
+	for (_k = 1; _k < Abs(_treeAVL); _k = _k+1)
+	{
+		_pc = (_treeAVL[_k])["Parent"];
+		if (_pc)
+		{
+			_cc = Abs((_treeAVL[_k])["Children"]);
+			if (_cc)
+			{
+				_mySplit                 = ((_treeAVL[_k])["Split"])["_MATRIX_ELEMENT_VALUE_>0"];
+				(_treeAVL[_pc])["Split"] = (_treeAVL[_pc])["Split"] + _mySplit;
+			}
+			else
+			{
+				((_treeAVL[_k])["Split"])[_tipMap[_k]] = 1;
+				_mySplit = (_treeAVL[_k])["Split"];
+				((_treeAVL[_pc])["Split"])[_tipMap[_k]] = 1;
+			}
+			_splitMap[_mySplit]		  = (_treeAVL[_k])["Name"];
+		}
+	}
+	
+	
+	_uniqueSplits = Rows(_splitMap);
+	_splitStrings = {};
+	for (_k = 0; _k < Abs(_splitMap); _k = _k+1)
+	{
+		_stringKey = ""; _stringKey * 128;
+		_stringKey2 = ""; _stringKey2 * 128;
+		ExecuteCommands ("_thisKey   = " + _uniqueSplits[_k]);
+		for (_k2 = 0; _k2 < _leafNodes; _k2 = _k2 + 1)
+		{
+			if (_thisKey[_k2])
+			{
+				_stringKey * "*";
+				_stringKey2 * "-";
+			}
+			else
+			{
+				_stringKey * "-";
+				_stringKey2 * "*";
+			}
+		}
+		_stringKey * 0;_stringKey2 * 0;
+		_splitStrings [_stringKey] = _splitMap[_uniqueSplits[_k]];
+		if (mirror)
+		{
+			_splitStrings [_stringKey2] = _splitStrings [_stringKey];
+		}
+	}
+	DeleteObject (_splitMap);
+	return _splitStrings;
+}
+
+/*************************************************************************************/
+
+/* 
+   return the most recent common ancestor for a group 
+   of nodes in an AVL; returns the index of the MRCA
+*/
+
+function	_findMRCA (treeAVL, nodeIDList)
+{
+	_nodeCount	 = Rows(nodeIDList)*Columns(nodeIDList);
+	
+	if (_nodeCount)
+	{
+		nodeIDList    = nodeIDList % 0;
+		_highestNode  = (treeAVL[nodeIDList[0]])["Depth"];
+		_currentDepth = _highestNode;
+		_lastNode	  = nodeIDList[_nodeCount-1];
+		for (_nodeIterator = nodeIDList[0]+1; _nodeIterator <= _lastNode; 
+											  _nodeIterator  = _nodeIterator + 1)
+		{
+			_currentDepth = (treeAVL[_nodeIterator])["Depth"];
+			if (_currentDepth < _highestNode)
+			{
+				_highestNode   = _currentDepth;
+			}
+		}
+				
+		for (; _nodeIterator <= Abs(treeAVL); _nodeIterator = _nodeIterator+1)
+		{
+			if ((treeAVL[_nodeIterator])["Depth"] < _highestNode)
+			{
+				return _nodeIterator;
+			}
+		} 
+		
+	}
+	
+	return Abs(treeAVL)-1;
+}
+
+/*************************************************************************************/
+/* 
+  	use parsimony to reconstruct ancestral states based on leaf AVL labels 
+  	return the number of substitutions
+*/
+
+function _parsimonyAncestralMapping (treeAVL&, label)
+{
+	uniqueLabels = {};
+	idToLabel	 = {};
+	for (_nodeIterator = 1; _nodeIterator < Abs (treeAVL); _nodeIterator = _nodeIterator + 1)
+	{
+		isLeaf = Abs((treeAVL[_nodeIterator])["Children"]) == 0;
+		if (isLeaf)
+		{
+			isLeaf = (treeAVL[_nodeIterator])[label];
+			if (uniqueLabels[isLeaf] == 0)
+			{
+				uniqueLabels [isLeaf]     = 1+Abs(uniqueLabels);
+				idToLabel[Abs(idToLabel)] = isLeaf;
+			}
+		}
+	}
+
+	assignmentMatrices = {};
+	kindCount		   = Abs (uniqueLabels);
+	
+	for (_nodeIterator = 1; _nodeIterator < Abs (treeAVL); _nodeIterator = _nodeIterator + 1)
+	{
+		aMx = {2,kindCount};
+		s2  = uniqueLabels[(treeAVL[_nodeIterator])[label]]-1;
+		for (k=0; k<kindCount; k=k+1)
+		{
+			aMx[0][k] = s2;
+			aMx[1][k] = 1-(k==s2);	
+		}
+		assignmentMatrices [(treeAVL[_nodeIterator])["Name"]] = aMx;
+	}
+
+	for (_nodeIterator = 1; _nodeIterator < Abs (treeAVL); _nodeIterator = _nodeIterator + 1)
+	{
+		nodeInfo 		= treeAVL[_nodeIterator];
+		nodeChildren	= nodeInfo ["Children"];
+		cCount			= Abs(nodeChildren);
+		
+		if (cCount)
+		{
+			localMatrices = {};
+			
+			nodeName = nodeInfo["Name"];
+			
+			for (s1 = 0; s1<cCount; s1=s1+1)
+			{
+				localMatrices[s1] = assignmentMatrices[(treeAVL	 [nodeChildren[s1]])  ["Name"]];
+			}
+			
+			twoWay = {kindCount,1};
+			
+			for (s2 = 0; s2 < kindCount; s2 = s2+1)
+			{
+				lc = 0;
+				for (s3 = 0; s3<cCount; s3=s3+1)
+				{
+					lc  = lc + (localMatrices[s3])[1][s2];
+				}
+				twoWay[s2] = lc;
+			}
+						
+			if (nodeInfo["Parent"])
+			{
+				aMx = {2,kindCount};
+				
+				for (s2 = 0; s2 < kindCount; s2 = s2+1)
+				{
+					minV = 1e100;
+					minI = 0;
+					
+					for (s3 = 0; s3 < kindCount; s3 = s3+1)
+					{
+						aCost = (s3!=s2) + twoWay[s3];
+						if (minV > aCost)
+						{
+							minV  = aCost;
+							minI  = s3;
+						}	
+					}
+					
+					aMx[0][s2] = minI;
+					aMx[1][s2] = minV;
+				}
+				
+				assignmentMatrices [nodeName] = aMx;
+			}
+			else
+			{
+				totalCost = 1e100;
+				rootState = 0;
+				
+				for (s2 = 0; s2 < kindCount; s2 = s2+1)
+				{
+					if (twoWay[s2] < totalCost)
+					{
+						totalCost = twoWay[s2];
+						rootState = s2;
+					}	
+				}
+				(treeAVL[_nodeIterator])[label] = idToLabel[rootState];
+			}
+		}
+	}
+	
+	for (_nodeIterator = Abs (treeAVL)-1; _nodeIterator >=1 ; _nodeIterator = _nodeIterator - 1)
+	{
+		nodeInfo 		= treeAVL[_nodeIterator];
+		nodeChildren	= nodeInfo ["Children"];
+		
+		if (Abs(nodeChildren))
+		{			
+			nodeName   = nodeInfo["Name"];
+			nodeParent = nodeInfo["Parent"];
+			if (nodeParent)
+			{
+				aMx							    = assignmentMatrices [nodeName];
+				(treeAVL[_nodeIterator])[label] = idToLabel[aMx[0][uniqueLabels[(treeAVL[nodeParent])[label]]-1]];
+			}
+		}
+	}	
+
+	assignmentMatrices = 0;
+	return totalCost;
+}
+
+
+
+/*************************************************************************************/
+/* 
+  	Center of Tree (COT) calculation 
+*/
+
+function ComputeCOT (_treeID, _filePath)
+/* IN 	: the identifier of an existing tree variable (String)
+		  _filePath : if not an empty string, write a PostScript image with this tree
+		  			  to the given path
+		  			  
+   OUT	: an associative array with four entries
+   		  "Branch" 		- the branch where the COT resides
+   		  				  branch ENDS at the node whose value is returned 
+   		  				  
+   		  "Split"  		- how far up the branch the COT is, measured in the same units as branch lengths
+   		  				  from the END of the branch (i.e node) 
+   		  				  
+   		  "COTTree"		- tree rerooted at the COT
+   		  
+   		  "Distances"	- mean squared distance from the COT to all leaves		  
+*/ 
+{
+	_power = 2;
+					 /* '2' is the power of the distance function to 
+						   minimize - i.e. least squares in this case */
+	ExecuteCommands (
+	"_cot = Min ("+_treeID+",_power);");
+	
+	_returnList = {};
+	_returnList ["Branch"] = _cot["COT_NODE"];
+	_returnList ["Split"]  = _cot["COT_SPLIT"];
+	_meanD = 0;
+	_keys  = Rows(_cot["COT_TO_NODE"]); 
+		/* _cot["COT_TO_NODE"] is an associative array
+		   mapping tree nodes to the total distance from COT (linear distance)
+		*/ 
+
+	for (_k = 0; _k < Columns(_keys); _k=_k+1)
+	{
+		_meanD = _meanD + (_cot["COT_TO_NODE"])[_keys[_k]]^_power;
+	}
+
+	_returnList     ["Distances"]  = _meanD/Columns(_keys);
+	/* reroot the tree at the COT branch */
+	ExecuteCommands ("_rerootedTree = RerootTree ("+_treeID+", \""+_returnList ["Branch"]+"\");");
+	/* hackish lines below split the root branch into appropriate bits */
+	
+	ACCEPT_ROOTED_TREES = 1;
+	UseModel (USE_NO_MODEL);
+	Tree _temp = _rerootedTree;
+	_tempA = _temp^0; /* this converts the tree into a post-order list of nodes as an associative array; 
+						print it to see the structure */					       
+	_rootID	   = (_tempA[0])["Root"];
+	_dist	   = {};
+	for (_k = 1; _k < Abs (_tempA); _k = _k + 1)
+	{
+		if ((_tempA[_k])["Parent"] == _rootID)
+		{
+			if (_k == _rootID - 1)
+			{
+				_dist [(_tempA[_k])["Name"]] = _cot["COT_SPLIT"];
+			}
+			else
+			{
+				_dist [(_tempA[_k])["Name"]] = _cot["COT_BRANCH_LENGTH"]-_cot["COT_SPLIT"];			
+			}
+		}
+		else
+		{
+			_dist [(_tempA[_k])["Name"]] = (_tempA[_k])["Length"];
+		}
+	}
+	
+	_returnList["COTTree"] = PostOrderAVL2StringDistances (_tempA,_dist);
+	
+	/* make a postscript file if needed */
+	if (Abs(_filePath))
+	{
+		TREE_OUTPUT_OPTIONS = {};
+		nodeSpec = {};
+		nodeSpec ["TREE_OUTPUT_BRANCH_SPLIT"]		= _cot["COT_SPLIT"]/_cot["COT_BRANCH_LENGTH"];	
+		TREE_OUTPUT_OPTIONS [_cot["COT_NODE"]] 		= nodeSpec;
+		ExecuteCommands 							("psString = PSTreeString ("+_treeID+",\"STRING_SUPPLIED_LENGTHS\",{{-1,-1}});");
+		fprintf 									(_filePath, CLEAR_FILE, psString);
+	}
+
+	return _returnList;
+	
+}
+
+
+/*************************************************************************************/
+/* 
+    Computes the distance from each node to the root of the tree.
+    By default, uses the "Length" key, but this can be redefined by passing an argument  
+*/
+
+function PathDistanceToRoot (_treeAVL, _distanceKey)
+/* IN 	: the identifier of a post-order tree AVL (dictionary)
+		  _distanceKey : if not an empty string, use this key to retrieve branch lengths
+          		  			  
+   OUT	: an associative array keyed on branch names with paths stored as values
+                
+*/ 
+{
+    _distances = {};
+    
+    if (Abs (_distanceKey) == 0)
+    {
+        _distanceKey = "Length";
+    }
+    
+    for (_k = Abs (_treeAVL)-2; _k > 0; _k = _k-1)
+    {
+        _nodeName   = (_treeAVL[_k])["Name"];
+        _distances[_nodeName] = _distances[(_treeAVL[(_treeAVL[_k])["Parent"]])["Name"]] + (_treeAVL[_k])[_distanceKey];
+    }
+    
+    return _distances;
+}
+
diff --git a/res/TemplateBatchFiles/UpperBound.bf b/res/TemplateBatchFiles/UpperBound.bf
new file mode 100644
index 0000000..002beb6
--- /dev/null
+++ b/res/TemplateBatchFiles/UpperBound.bf
@@ -0,0 +1,61 @@
+ChoiceList (dataType,"Data type",1,SKIP_NONE,"Nucleotide/Protein","Nucleotide or amino-acid (protein).",
+				     "Codon","Codon (several available genetic codes).");
+
+if (dataType<0) 
+{
+	return;
+}
+
+if (dataType)
+{
+	NICETY_LEVEL = 3;
+	SetDialogPrompt ("Please choose a codon data file:");
+	#include "TemplateModels/chooseGeneticCode.def";
+}
+else
+{
+	SetDialogPrompt ("Please choose a nucleotide or amino-acid data file:");
+}
+
+DataSet ds = ReadDataFile (PROMPT_FOR_FILE);
+
+SKIP_OMISSIONS = 1;
+
+if (dataType)
+{
+	DataSetFilter filteredData = CreateFilter (ds,3,"","",GeneticCodeExclusions);
+}
+else
+{
+	DataSetFilter filteredData = CreateFilter (ds,1,"","");
+}
+
+SKIP_OMISSIONS = 0;
+
+if (dataType)
+{
+	DataSetFilter filteredData2 = CreateFilter (ds,3,"","",GeneticCodeExclusions);
+}
+else
+{
+	DataSetFilter filteredData2 = CreateFilter (ds,1,"","");
+}
+
+fprintf (stdout, "\nUpper log-likelihood bound on the data set:",LAST_FILE_PATH,
+				 "\nSequences : ",filteredData.species,
+				 "\nSites     : ",filteredData.sites,
+				 "\nSite types: ",filteredData.unique_sites);
+				 
+if (filteredData2.sites!=filteredData.sites)
+{
+	fprintf (stdout, "\n\nWARNING: Data set contains deletions. The upper bound is NOT valid for this data file.\n\n");
+}
+upperLnLikBound = 0;
+
+for (counter = 0; counter < filteredData.unique_sites; counter = counter+1)
+{
+	upperLnLikBound = upperLnLikBound + filteredData.site_freqs[counter] *
+										Log (filteredData.site_freqs[counter]/filteredData.sites);
+}
+
+fprintf (stdout,"\nUpper bound on likelihood = ", upperLnLikBound,"\n");
diff --git a/res/TemplateBatchFiles/Utility/AncestralMapper.bf b/res/TemplateBatchFiles/Utility/AncestralMapper.bf
new file mode 100644
index 0000000..a53928d
--- /dev/null
+++ b/res/TemplateBatchFiles/Utility/AncestralMapper.bf
@@ -0,0 +1,740 @@
+RequireVersion ("2.0020100914");
+
+_ancestralRecoveryCache       = {};
+
+/*******************************************
+	call _buildAncestralCache function with the likelihood function ID 
+	and a 0-based partition index to produce an
+	internal structure storing internal states at 
+	nodes;
+	
+	returns an integer index to reference
+	the opaque structure for subsequent operations
+
+*******************************************/
+
+LoadFunctionLibrary			("TreeTools.ibf");
+
+_bacCacheInstanceCounter = 0;
+
+/*******************************************
+	wrapper functions
+*******************************************/
+
+function _buildAncestralCache (_lfID, _lfComponentID)
+{
+	return _buildAncestralCacheInternal (_lfID, _lfComponentID, 0);
+}
+
+function _buildAncestralCacheSample (_lfID, _lfComponentID)
+{
+	return _buildAncestralCacheInternal (_lfID, _lfComponentID, 1);
+}
+
+/*******************************************
+	internal function to do the work
+*******************************************/
+
+function _buildAncestralCacheInternal (_lfID, _lfComponentID, doSample)
+{
+
+/* 1; grab the information AVL from the likelihood function */
+	ExecuteCommands ("GetString(_bac_lfInfo,"+_lfID+",-1);");
+	if (Columns (_bac_lfInfo["Trees"]) <= _lfComponentID)
+	{
+		return -1;
+	}
+	
+	_bac_treeID     = (_bac_lfInfo["Trees"])		[_lfComponentID];
+	_bac_filterID 	= (_bac_lfInfo["Datafilters"])	[_lfComponentID];
+
+/* 2; construct a temporary likelihood function with 
+   the tree and the filter; and an AVL representation of the tree */
+   
+    if (doSample)
+    {
+		_ancestorCall = "SampleAncestors";
+    }  
+	else
+	{
+		_ancestorCall = "ReconstructAncestors";	
+	}
+	   
+	ExecuteCommands ("_bac_tree_avl = " + _bac_treeID + "^0;"+
+					 "DataSet _bac_ancDS = " + _ancestorCall + " ("+_lfID+",{{"+_lfComponentID+"}});"+
+					 "GetString (_bacSequenceNames,"+ _bac_filterID +",-1);");
+					 
+/* 3; obtain ID->string mapping for the datafilter;
+	  also deduce how many chars/state there are */
+
+	ExecuteCommands 	  			("GetDataInfo (_bacCharHandles, `_bac_filterID`, \"CHARACTERS\")");
+	ExecuteCommands 	  			("GetDataInfo (_bacCharProperties, `_bac_filterID`, \"PARAMETERS\")");
+	ExecuteCommands 	  			("GetDataInfo (_bacFilterPatternMap, `_bac_filterID`)");
+	_bacFilterDimension 		=   Columns (_bacCharHandles);
+	_bacCharsPerState 			=   _bacCharProperties["ATOM_SIZE"];
+	DataSetFilter	_bacAF		=   CreateFilter (_bac_ancDS,_bacCharsPerState,"","",_bacCharProperties["EXCLUSIONS"]);
+	GetString						(_bacAncestralNames,_bacAF,-1);		
+	GetDataInfo						(_bacAncestralPatternMap,_bacAF);
+	
+/* now start building a matrix of mapped states;
+   
+   each row in the matrix corresponds to a tree NODE in the same order as 
+   they are listed in the tree AVL 
+   
+   each column correponds to a site
+   
+   the entries are as follows:
+	   0.._bacFilterDimension-1 an unambigous character
+	   -1 a deletion/complete ambiguity
+	   less that -1 : -(entry)-2 maps to an AVL storing the state
+					  and the complete character resolution (as an array)
+ */
+	 
+	 _bacBranchCount		 	  = Abs(_bac_tree_avl)-1;
+	 _bacMatrixOfResolutions 	  = {_bacBranchCount,_bacAF.sites};
+	 _bacHandledResolutions  	  = {};
+	 _bacHandledResolutionsChars  = {};
+	 _bacHandledResolutionsAmbig  = {};
+	 
+ /* map where sequences are in the filter vs where they are in the 
+	tree structure */
+	    
+	 _bacMapTreeNodeToDF = {};
+	 _bacTreeAVLOrder 	 = {};
+	 
+	 for (_bacCounter = 1; _bacCounter < _bacBranchCount+1; _bacCounter = _bacCounter + 1)
+	 {
+	 	_bacTreeAVLOrder[(_bac_tree_avl[_bacCounter])["Name"]&&1] = _bacCounter;
+	 }
+	 
+	 _bacFilterSequenceCount = Columns(_bacSequenceNames);
+	 for (_bacCounter = 0; _bacCounter < _bacFilterSequenceCount; _bacCounter = _bacCounter + 1)
+	 {
+	 	_bacMapTreeNodeToDF[_bacTreeAVLOrder[_bacSequenceNames[_bacCounter]&&1]-1] = _bacCounter;
+	 }
+	 for (_bacCounter = 0; _bacCounter < Columns(_bacAncestralNames); _bacCounter = _bacCounter + 1)
+	 {
+	 	_bacMapTreeNodeToDF[_bacTreeAVLOrder[_bacAncestralNames[_bacCounter]&&1]-1] = _bacCounter+_bacFilterSequenceCount;
+	 }
+	 
+ /* make some auxiliary variables */
+ 
+ 	_bacUnitRow     	= {1,Columns(_bacCharHandles)}["1"];
+ 	_bacSequenceRow     = {1,Columns(_bacCharHandles)}["_MATRIX_ELEMENT_COLUMN_"];
+
+ /* loop over branches (rows) */
+	 for (_bacBranchCounter = 1; _bacBranchCounter <= _bacBranchCount; _bacBranchCounter = _bacBranchCounter + 1)
+	 {
+	 	_bacRowIndex = _bacMapTreeNodeToDF[_bacBranchCounter-1];
+		if (_bacRowIndex < _bacFilterSequenceCount) 
+		/* an extant sequence */
+		{
+			ExecuteCommands ("GetDataInfo (_bacSequenceString,`_bac_filterID`,_bacRowIndex)");
+		}
+		else 
+		/* an ancestral sequence */
+		{
+			GetDataInfo (_bacSequenceString,_bacAF,_bacRowIndex-_bacFilterSequenceCount);
+		}
+
+ /* loop over sites (columns) */
+	 	for (_bacSiteCounter = 0; _bacSiteCounter < _bacAF.sites; _bacSiteCounter = _bacSiteCounter + 1)
+	 	{
+	 		_bacCurrentState = _bacSequenceString[_bacSiteCounter*_bacCharsPerState][(1+_bacSiteCounter)*_bacCharsPerState-1];
+	 		_bacCurrentIndex = _bacHandledResolutions[_bacCurrentState];
+	 		if (_bacCurrentIndex > 0)
+	 		{
+	 			_bacMatrixOfResolutions[_bacBranchCounter-1][_bacSiteCounter] = _bacCurrentIndex-1;
+	 		}
+	 		else
+	 		{
+	 			if (_bacCurrentIndex < 0)
+	 			{
+	 				_bacMatrixOfResolutions[_bacBranchCounter-1][_bacSiteCounter] = _bacCurrentIndex;
+	 			}
+	 			else
+	 			/* handle the resolution */
+	 			{
+					if (_bacRowIndex < _bacFilterSequenceCount) 
+					{
+						ExecuteCommands ("GetDataInfo (_bacCharState,`_bac_filterID`,_bacRowIndex,_bacFilterPatternMap[_bacSiteCounter])");
+					}
+					else 
+					{
+						GetDataInfo (_bacCharState,_bacAF,_bacRowIndex-_bacFilterSequenceCount,_bacAncestralPatternMap[_bacSiteCounter]);
+					}
+					_bacResolutionCount = (_bacUnitRow*_bacCharState)[0];
+	 				if (_bacResolutionCount == 1) /* fully resolved */
+	 				{
+	 					_bacHandledResolutions[_bacCurrentState] 					  = (_bacSequenceRow*_bacCharState)[0]+1;
+		 				_bacMatrixOfResolutions[_bacBranchCounter-1][_bacSiteCounter] = _bacHandledResolutions[_bacCurrentState]-1;
+	 				}
+	 				else
+	 				{
+	 					if (_bacResolutionCount == Columns(_bacCharHandles)) /* gap/full ambig */
+	 					{
+	 						_bacHandledResolutions[_bacCurrentState] 							= -1;
+	 						_bacMatrixOfResolutions[_bacBranchCounter-1][_bacSiteCounter]		= -1;
+	 					}
+	 					else
+	 					{
+	 						_bacHandledResolutions[_bacCurrentState] 							= -2-Abs(_bacHandledResolutionsAmbig);
+	 						_bacHandledResolutionsAmbig[Abs(_bacHandledResolutionsAmbig)] 		= _bacCharState;
+	 						_bacMatrixOfResolutions[_bacBranchCounter-1][_bacSiteCounter]		= _bacHandledResolutions[_bacCurrentState];
+	 					}
+	 				}
+	 			}
+	 		}
+		}
+	 }
+	 
+	 _bacAncestralCache = {};
+	 _bacAncestralCache ["CHARS"]     	  = _bacCharHandles;
+	 _bacAncestralCache ["MATRIX"]    	  = _bacMatrixOfResolutions;
+	 _bacAncestralCache ["TREE_AVL"]  	  = _bac_tree_avl;
+	 _bacAncestralCache ["AMBIGS"]    	  = _bacHandledResolutionsAmbig;
+	 _bacAncestralCache ["AMBIGS_REV"]    = _bacReverseAmbigMap;
+	
+	 /* reverse map integer codes into ambig maps */
+
+	 _bacCurrentState 		= Rows (_bacHandledResolutionsAmbig);
+	 _bacResolutionCount	= Abs  (_bacHandledResolutionsAmbig);
+	 _bacReverseAmbigMap	= {};
+	 
+	 for (_bacCounter = 0; _bacCounter < _bacResolutionCount; _bacCounter = _bacCounter + 1)
+	 {
+	 	_bacReverseAmbigMap[(_bacAncestralCache ["AMBIGS"])[_bacCurrentState[_bacCounter]]] = _bacCurrentState[_bacCounter];
+	 }
+	 
+	 
+	 _ancestralRecoveryCache[_bacCacheInstanceCounter] = _bacAncestralCache;
+	 _bacCacheInstanceCounter = _bacCacheInstanceCounter + 1;
+	 return _bacCacheInstanceCounter-1;
+}
+
+/*******************************************
+	call this function the index returned by 
+	_buildAncestralCache when the ancestral
+	reconstruction is no longer needed
+
+*******************************************/
+
+	function _destroyAncestralCache (_ancID)
+	{
+		_ancestralRecoveryCache - _ancID;
+		return 0;
+	}
+
+/*******************************************
+	count subsitutions at a given site;
+	returns an AVL with 
+	
+	["CHARS"]  - the 1xN matrix which maps index->character string
+	["COUNTS"] - the NxN (N = Columns(returnValue["CHARS"]) matrix 
+				 with counts of substitutions at the site
+	
+	pass this function the ID of ancestral cache
+	and the index of the site to recover
+
+*******************************************/
+
+	function _substitutionsBySite (_ancID, _siteID)
+	{
+		if (Abs (_ancestralRecoveryCache[_ancID]))
+		{
+			if (_siteID >= 0 && _siteID < Columns ((_ancestralRecoveryCache[_ancID])["MATRIX"]))
+			{
+				_bacSiteC   = {};
+				_thisColumn 		= ((_ancestralRecoveryCache[_ancID])["MATRIX"])[-1][_siteID];
+				_bacSiteC ["CHARS"] = (_ancestralRecoveryCache[_ancID])["CHARS"];
+				_bacSiteDim 		= Columns (_bacSiteC ["CHARS"]);
+				_bacCounter 		= Rows (_thisColumn)-1;
+				_bacSiteMx			= {_bacSiteDim,_bacSiteDim};
+				
+				for (_bacTreeIterator = 0; _bacTreeIterator < _bacCounter; _bacTreeIterator = _bacTreeIterator + 1)
+				{
+					_bacParentID = (((_ancestralRecoveryCache[_ancID])["TREE_AVL"])[_bacTreeIterator+1])["Parent"]-1;
+					_myState	 = _thisColumn[_bacTreeIterator];
+					_pState		 = _thisColumn[_bacParentID];
+					_expandSubstitutionMap (_pState,_myState,_ancID,"_bacSiteMx");
+				}
+				
+				_bacSiteC ["COUNTS"] = _bacSiteMx;
+				return _bacSiteC;
+			}
+		}
+		return {};
+	}
+	
+
+/*******************************************
+	count subsitutions at a given site;
+	along a subset of branches. 
+	
+	["CHARS"]  - the 1xN matrix which maps index->character string
+	["COUNTS"] - the NxN (N = Columns(returnValue["CHARS"]) matrix 
+				 with counts of substitutions at the site
+	
+	pass this function the ID of ancestral cache
+	and the index of the site to recover
+
+*******************************************/
+
+	function _substitutionsBySiteSubset (_ancID, _siteID, _branchSubset)
+	{
+		if (Abs (_ancestralRecoveryCache[_ancID]))
+		{
+			if (_siteID >= 0 && _siteID < Columns ((_ancestralRecoveryCache[_ancID])["MATRIX"]))
+			{
+				_bacSiteC   = {};
+				_thisColumn 		= ((_ancestralRecoveryCache[_ancID])["MATRIX"])[-1][_siteID];
+				_bacSiteC ["CHARS"] = (_ancestralRecoveryCache[_ancID])["CHARS"];
+				_bacSiteDim 		= Columns (_bacSiteC ["CHARS"]);
+				_bacCounter 		= Rows (_thisColumn)-1;
+				_bacSiteMx			= {_bacSiteDim,_bacSiteDim};
+				
+				for (_bacTreeIterator = 0; _bacTreeIterator < _bacCounter; _bacTreeIterator = _bacTreeIterator + 1)
+				{
+					if (_branchSubset[(((_ancestralRecoveryCache[_ancID])["TREE_AVL"])[_bacTreeIterator+1])["Name"] && 1])
+					{
+						_bacParentID = (((_ancestralRecoveryCache[_ancID])["TREE_AVL"])[_bacTreeIterator+1])["Parent"]-1;
+						_myState	 = _thisColumn[_bacTreeIterator];
+						_pState		 = _thisColumn[_bacParentID];
+						_expandSubstitutionMap (_pState,_myState,_ancID,"_bacSiteMx");
+					}
+				}
+				
+				_bacSiteC ["COUNTS"] = _bacSiteMx;
+				return _bacSiteC;
+			}
+		}
+		return {};
+	}	
+
+/*******************************************
+	returns the reconstructed root state for a given site;
+	returns an AVL with 
+	
+	["CHAR"]  - the root character
+	["INDEX"] - the index of the root character (consisent with the data filter representation),
+			  - this value will be negative if the root state is ambiguous (e.g. a gap)
+	
+	pass this function the ID of ancestral cache
+	and the index of the site to recover
+
+*******************************************/
+
+	function _rootState (_ancID, _siteID)
+	{
+		if (Abs (_ancestralRecoveryCache[_ancID]))
+		{
+			if (_siteID >= 0 && _siteID < Columns ((_ancestralRecoveryCache[_ancID])["MATRIX"]))
+			{
+				_bacRootState   = {};
+				_bacRootIndex   = (((_ancestralRecoveryCache[_ancID]) ["TREE_AVL"])[0])["Root"]-1;
+				_rootStateIndex = ((_ancestralRecoveryCache[_ancID])["MATRIX"])[_bacRootIndex][_siteID];
+				_bacRootState["INDEX"] = _rootStateIndex;
+				if (_rootStateIndex>=0)
+				{
+					_bacRootState["CHAR"] = ((_ancestralRecoveryCache[_ancID]) ["CHARS"])[_rootStateIndex];
+				}
+				else
+				{
+					_bacRootState["CHAR"] = "-";	
+				}
+				return _bacRootState;
+			}
+		}
+		return {};
+	}	
+	
+/*******************************************
+	map all site substitutions or character states to a tree; 
+	'_scaled' != 0 will use branch lengths to draw the tree
+	returns PostScript code for the image
+
+*******************************************/
+	function _mapSubstitutionsBySite (_ancID, _siteID, _scaled)
+	{
+		return _mapSubstitutionsBySiteAux (_ancID, _siteID, _scaled, 0);
+	}
+
+	/********************************************/
+
+	function _mapCharactersBySite (_ancID, _siteID, _scaled)
+	{
+		return _mapSubstitutionsBySiteAux (_ancID, _siteID, _scaled, 1);
+	}
+
+	/********************************************/
+
+	function _mapSNSBySite (_ancID, _siteID, _scaled)
+	{
+		return _mapSubstitutionsBySiteAux (_ancID, _siteID, _scaled, 2);
+	}
+
+	/********************************************/
+	
+	function _mapSubstitutionsBySiteAux (_ancID, _siteID, _scaled, mode)
+	{
+		if (Abs (_ancestralRecoveryCache[_ancID]))
+		{
+			if (_siteID >= 0 && _siteID < Columns ((_ancestralRecoveryCache[_ancID])["MATRIX"]))
+			{
+				TREE_OUTPUT_OPTIONS = {};
+				_thisColumn 		= ((_ancestralRecoveryCache[_ancID])["MATRIX"])[-1][_siteID];
+				_bacSiteC 		    = (_ancestralRecoveryCache[_ancID])["CHARS"];
+				_bacSiteDim 		= Columns (_bacSiteC);
+				_bacCounter 		= Rows (_thisColumn)-1;
+				
+				for (_bacTreeIterator = 0; _bacTreeIterator < _bacCounter; _bacTreeIterator = _bacTreeIterator + 1)
+				{
+					_bacParentID   = (((_ancestralRecoveryCache[_ancID])["TREE_AVL"])[_bacTreeIterator+1])["Parent"]-1;
+					_myState	   = _thisColumn[_bacTreeIterator];
+					_pState		   = _thisColumn[_bacParentID];
+					_bacStateLabel = "";
+					
+					
+					_bac_bn = (((_ancestralRecoveryCache[_ancID])["TREE_AVL"])[_bacTreeIterator+1])["Name"];
+					TREE_OUTPUT_OPTIONS [_bac_bn] = {};
+                    if (mode == 2)
+                    {
+                        (TREE_OUTPUT_OPTIONS[_bac_bn]) ["TREE_OUTPUT_BRANCH_THICKNESS"] = 1;
+                    }
+					if (_myState >= 0)
+					{
+						if (mode == 0)
+						{
+							 if (_myState != _pState && _pState >= 0)
+							 {
+								_bacStateLabel = _bacSiteC[_pState] + "->" + _bacSiteC[_myState];
+							 }
+						}
+						else
+						{
+							_bacStateLabel = _bacSiteC[_myState];
+							
+						}
+					}
+					
+					
+					if (Abs(_bacStateLabel))
+					{
+						if (mode == 0)
+						{
+							(TREE_OUTPUT_OPTIONS[_bac_bn]) ["TREE_OUTPUT_OVER_BRANCH"] = "gsave 0.7 0.7 scale ("+_bacStateLabel+") drawletter grestore\n";
+							(TREE_OUTPUT_OPTIONS[_bac_bn]) ["TREE_OUTPUT_BRANCH_LABEL"]  = "__FONT_SIZE__ 2 idiv\n__FONT_SIZE__ 3 idiv\nneg\nrmoveto\n (__NODE_NAME__) show";
+							(TREE_OUTPUT_OPTIONS[_bac_bn]) ["TREE_OUTPUT_BRANCH_COLOR"] = {{1,0,0}};
+						}
+						else
+						{
+							if (mode == 1)
+							{
+								(TREE_OUTPUT_OPTIONS[_bac_bn]) ["TREE_OUTPUT_BRANCH_TLABEL"] = _bacStateLabel;	
+							}
+							else
+							{
+								if (mode == 2)
+								{
+									haveS 	= _OBSERVED_S_		[_pState][_myState];
+									haveNS	= _OBSERVED_NS_	[_pState][_myState];
+									if (haveNS >= 1)
+									{
+										if (haveS >= 1)
+										{
+											(TREE_OUTPUT_OPTIONS[_bac_bn]) ["TREE_OUTPUT_BRANCH_COLOR"] = {{1,0.7,0}};
+										}
+										else
+										{
+											(TREE_OUTPUT_OPTIONS[_bac_bn]) ["TREE_OUTPUT_BRANCH_COLOR"] = {{1,0,0}};										
+										}
+									}
+									else
+									{
+										if (haveS >= 1)
+										{
+											(TREE_OUTPUT_OPTIONS[_bac_bn]) ["TREE_OUTPUT_BRANCH_COLOR"] = {{0,0,1}};																				
+										}
+									}
+									
+									(TREE_OUTPUT_OPTIONS[_bac_bn]) ["TREE_OUTPUT_BRANCH_THICKNESS"] = 1 + haveS + haveNS;
+								}
+							}
+						}
+					}
+				}
+				
+                if (mode == 2)
+                {
+                    (TREE_OUTPUT_OPTIONS[(((_ancestralRecoveryCache[_ancID])["TREE_AVL"])[_bacTreeIterator+1])["Name"]]) = {"TREE_OUTPUT_BRANCH_THICKNESS" : 1};
+                }
+
+				_bacTreeString 	  = PostOrderAVL2StringDL ((_ancestralRecoveryCache[_ancID])["TREE_AVL"], _scaled);
+				Tree _bacTempTree = _bacTreeString;
+				_bac_bn = "";
+				_bac_bn * 128;
+				_bac_bn * "/drawletter {5 5 rmoveto 1 copy false charpath pathbbox 2 index 3 sub sub exch 3 index 3 sub sub exch  0.85 setgray 4 copy rectfill 0 setgray  3 index 3 index currentlinewidth 0.5 setlinewidth 7 3 roll rectstroke setlinewidth exch 1.5 add exch 1.5 add moveto show} def\n";
+				
+				if (_scaled)
+				{
+					_bac_bn * (PSTreeString (_bacTempTree,"STRING_SUPPLIED_LENGTHS",{{-1,-1}}));				
+				}
+				else
+				{
+					_bac_bn * (PSTreeString (_bacTempTree,"",{{-1,-1}}));
+				}
+				_bac_bn * 0;
+				
+				return _bac_bn;
+			}
+		}
+		return "";
+	}
+
+/*******************************************
+	map all site substitutions (or character states) to a tree; 
+	'_scaled' != 0 will use branch lengths to draw the tree
+	returns Newick code for the annotated tree
+
+*******************************************/
+	function _mapSubstitutionsBySiteNewick (_ancID, _siteID, _scaled)
+	{
+		return _mapSubstitutionsBySiteNewickAux (_ancID, _siteID, _scaled, 0);
+	}
+
+	function _mapCharactersBySiteNewick (_ancID, _siteID, _scaled)
+	{
+		return _mapSubstitutionsBySiteNewickAux (_ancID, _siteID, _scaled, 1);
+	}
+
+	function _mapSubstitutionsBySiteNewickAux (_ancID, _siteID, _scaled, mode)
+	{
+		if (Abs (_ancestralRecoveryCache[_ancID]))
+		{
+			if (_siteID >= 0 && _siteID < Columns ((_ancestralRecoveryCache[_ancID])["MATRIX"]))
+			{
+				_thisColumn 		= ((_ancestralRecoveryCache[_ancID])["MATRIX"])[-1][_siteID];
+				_bacSiteC 		    = (_ancestralRecoveryCache[_ancID])["CHARS"];
+				_bacSiteDim 		= Columns (_bacSiteC);
+				_bacCounter 		= Rows (_thisColumn)-1;
+				
+				for (_bacTreeIterator = 0; _bacTreeIterator < _bacCounter; _bacTreeIterator = _bacTreeIterator + 1)
+				{
+					_bacParentID   = (((_ancestralRecoveryCache[_ancID])["TREE_AVL"])[_bacTreeIterator+1])["Parent"]-1;
+					_myState	   = _thisColumn[_bacTreeIterator];
+					_pState		   = _thisColumn[_bacParentID];
+					_bacStateLabel = "";
+					
+					
+					if (_myState >= 0)
+					{
+						if (mode == 0)
+						{
+							 if (_myState != _pState && _pState >= 0)
+							 {
+								_bacStateLabel = _bacSiteC[_pState] + "->" + _bacSiteC[_myState];
+							 }
+						}
+						else
+						{
+							_bacStateLabel = _bacSiteC[_myState];
+						}
+					}
+					
+					(((_ancestralRecoveryCache[_ancID])["TREE_AVL"])[_bacTreeIterator+1])["SubLabel"] = _bacStateLabel;
+				}
+				
+				return 	 PostOrderAVL2StringAnnotate ((_ancestralRecoveryCache[_ancID])["TREE_AVL"], _scaled, "SubLabel");
+			}
+		}
+		return "";
+	}
+
+	
+/*******************************************
+	
+	_filterDimensions returns a {{sites,branches}} matrix
+	
+*******************************************/
+
+	function _filterDimensions (_ancID)
+	{
+		_result = {1,2};
+		if (Abs (_ancestralRecoveryCache[_ancID]))
+		{
+			_sites    = Columns ((_ancestralRecoveryCache[_ancID])["MATRIX"]);
+			_branches = Rows	((_ancestralRecoveryCache[_ancID])["MATRIX"])-1;
+			_result [0] = _sites;
+			_result [1] = _branches;
+		}
+		return _result;
+	}
+
+/*******************************************
+	
+	_countSubstitutionsByBranchSite returns a 
+	binary vector (one entry per branch) which
+	contains '1' if the branch has substitutions
+	defined by '_filter' (a CxC matrix)
+
+*******************************************/
+
+	function _countSubstitutionsByBranchSite (_ancID, _siteID, _filter)
+	{
+		_result = {0,1};
+		if (Abs (_ancestralRecoveryCache[_ancID])) {
+			if (_siteID >= 0 && _siteID < Columns ((_ancestralRecoveryCache[_ancID])["MATRIX"])) {
+				TREE_OUTPUT_OPTIONS = {};
+				_thisColumn 		= ((_ancestralRecoveryCache[_ancID])["MATRIX"])[-1][_siteID];
+				_bacSiteC 		    = (_ancestralRecoveryCache[_ancID])["CHARS"];
+				_bacSiteDim 		= Columns (_bacSiteC);
+				_bacCounter 		= Rows (_thisColumn)-1;
+				_result				= {_bacCounter,1};
+
+				for (_bacTreeIterator = 0; _bacTreeIterator < _bacCounter; _bacTreeIterator += 1) {
+					_bacParentID   = (((_ancestralRecoveryCache[_ancID])["TREE_AVL"])[_bacTreeIterator+1])["Parent"]-1;
+					_myState	   = _thisColumn[_bacTreeIterator];
+					_pState		   = _thisColumn[_bacParentID];
+					_bacSiteMx			= {_bacSiteDim,_bacSiteDim};
+					_expandSubstitutionMap (_pState,_myState,_ancID,"_bacSiteMx");
+					_result[_bacTreeIterator] = (+(_bacSiteMx$_filter))>=1;
+				}
+				
+			}
+		}
+		return _result;
+	}
+
+
+
+/*******************************************
+	
+	_tabulateSubstitutionsAtSiteByBranch returns
+	a dictionary with keys = branch names and
+	values = counts of synonymous and non-synonymous
+	substitutions.
+
+*******************************************/
+
+	function _tabulateSubstitutionsAtSiteByBranch (_ancID, _siteID)
+	{
+		_result = {};
+		if (Abs (_ancestralRecoveryCache[_ancID]))
+		{
+			if (_siteID >= 0 && _siteID < Columns ((_ancestralRecoveryCache[_ancID])["MATRIX"]))
+			{
+				_thisColumn 		= ((_ancestralRecoveryCache[_ancID])["MATRIX"])[-1][_siteID];
+				_bacSiteC 		    = (_ancestralRecoveryCache[_ancID])["CHARS"];
+				_bacSiteDim 		= Columns (_bacSiteC);
+				_bacCounter 		= Rows (_thisColumn)-1;
+
+
+				for (_bacTreeIterator = 0; _bacTreeIterator < _bacCounter; _bacTreeIterator = _bacTreeIterator + 1)
+				{
+					_bacParentID   = (((_ancestralRecoveryCache[_ancID])["TREE_AVL"])[_bacTreeIterator+1])["Parent"]-1;
+					_myState	   = _thisColumn[_bacTreeIterator];
+					_pState		   = _thisColumn[_bacParentID];
+					
+					if (_pState >= 0 && _myState >=0) {
+					    haveS 	= _OBSERVED_S_	[_pState][_myState];
+					    haveNS	= _OBSERVED_NS_	[_pState][_myState];
+					} else {
+					    haveS = 0;
+					    haveNS = 0;
+					}
+					_result [(((_ancestralRecoveryCache[_ancID])["TREE_AVL"])[_bacTreeIterator+1])["Name"]] = {{haveS__,haveNS__}};
+                }
+				
+			}
+		}
+		return _result;
+	}
+	
+	
+/*******************************************/
+	
+	function _expandSubstitutionMap (_state1, _state2, _ancID, _resultMatrix&)
+	{
+		if (_state1 >= 0 && _state2 >= 0)
+		/* both unique states */
+		{
+			_resultMatrix[_state1][_state2] = _resultMatrix[_state1][_state2]+1;
+		}
+		else
+		{
+			if (_state1 != (-1) && _state2 != (-1))
+			/* at least one is NOT a gap state: otherwise nothing to map */
+			{
+				_thisDim = Rows (_resultMatrix);
+				if (_state1 >= 0)
+				{
+					_vec1 = {_thisDim,1};
+					_vec1 [_state1] = 1;
+				}
+				else
+				{
+					_vec1 = ((_ancestralRecoveryCache[_ancID])["AMBIGS"])[-_state1-2];
+				}
+				if (_state2 >= 0)
+				{
+					_vec2 = {_thisDim,1};
+					_vec2 [_state2] = 1;
+				}
+				else
+				{
+					_vec2 = ((_ancestralRecoveryCache[_ancID])["AMBIGS"])[-_state2-2];
+				}
+				_vec1 = _vec1 * Transpose(_vec2);
+				_vec2 = {_thisDim,1}["1"];
+				_vec2 = (Transpose(_vec2)*_vec1*_vec2)[0];
+				_resultMatrix = _resultMatrix + _vec1 * (1/_vec2); /* 1/K(=all possible pairwise resolutions) to each possible resolution */
+			}
+			
+		}
+		return 0;
+	}
+	
+/*******************************************
+
+*******************************************/
+	
+	function _convertSubstitutionToCharacters (_state1, _state2, _ancID, _resultMatrix&)
+	{
+		if (_state1 >= 0 && _state2 >= 0)
+		/* both unique states */
+		{
+			_resultMatrix[_state1][_state2] = _resultMatrix[_state1][_state2]+1;
+		}
+		else
+		{
+			if (_state1 != (-1) && _state2 != (-1))
+			/* at least one is NOT a gap state: otherwise nothing to map */
+			{
+				_thisDim = Rows (_resultMatrix);
+				if (_state1 >= 0)
+				{
+					_vec1 = {_thisDim,1};
+					_vec1 [_state1] = 1;
+				}
+				else
+				{
+					_vec1 = ((_ancestralRecoveryCache[_ancID])["AMBIGS"])[-_state1-2];
+				}
+				if (_state2 >= 0)
+				{
+					_vec2 = {_thisDim,1};
+					_vec2 [_state2] = 1;
+				}
+				else
+				{
+					_vec2 = ((_ancestralRecoveryCache[_ancID])["AMBIGS"])[-_state2-2];
+				}
+				_vec1 = _vec1 * Transpose(_vec2);
+				_vec2 = {_thisDim,1}["1"];
+				_vec2 = (Transpose(_vec2)*_vec1*_vec2)[0];
+				_resultMatrix = _resultMatrix + _vec1 * (1/_vec2); /* 1/K(=all possible pairwise resolutions*/ to each possible resolution */
+			}
+			
+		}
+		return 0;
+	}	
diff --git a/res/TemplateBatchFiles/Utility/BranchLengthFitters.bf b/res/TemplateBatchFiles/Utility/BranchLengthFitters.bf
new file mode 100644
index 0000000..a636459
--- /dev/null
+++ b/res/TemplateBatchFiles/Utility/BranchLengthFitters.bf
@@ -0,0 +1,94 @@
+LoadFunctionLibrary ("TreeTools");
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+lfunction extractBranchLengthsFromTreeAsDict (tree_id) {
+    _treeLengthDict = {};
+    _bls = BranchLength (^tree_id, -1);
+    _bns = BranchName  (^tree_id, -1);
+    
+    for (k = 0; k < Columns (_bns) - 1; k += 1) {
+        _treeLengthDict[_bns[k]] = _bls[k];
+    }
+    
+    return _treeLengthDict;
+}
+
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+lfunction getNucRevBranchLengthsAndParameters (dataset_id, tree_id) {
+
+   DataSetFilter nucs = CreateFilter          (^dataset_id, 1);
+   HarvestFrequencies   (Freqs, 	nucs, 1,1,1);
+
+   global 	nAC = 1;
+   global 	nAT = 1;
+   global 	nCG = 1;
+   global 	nCT = 1;
+   global 	nGT = 1;
+    
+   revRateMatrix =  {{*,	nAC*t,t,	nAT*t}
+                      {	nAC*t,*,	nCG*t,	nCT*t}
+                      {t,	nCG*t,*,	nGT*t}
+                      {	nAT*t,	nCT*t,	nGT*t,*}};
+                    
+   Model 	revQ = (revRateMatrix, 	Freqs);
+
+   ExecuteCommands           ("Tree 	tree = " + Eval("Format (^tree_id,1,1)"));
+   LikelihoodFunction 	LF = (nucs,	tree);
+   Optimize                  (res,LF);
+   res = {"AC": nAC, "AT": nAT, "CG": nCG, "CT": nCT, "GT": nGT};
+   res ["lengths"] = extractBranchLengthsFromTreeAsDict (&tree);
+   DeleteObject              (LF);
+   
+   return res;
+}
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function killZeroBranchesBasedOnNucFit (dataset_id, string) {
+
+   //fprintf (stdout, "CHECK 1\n");
+
+	
+
+   DataSetFilter nucs = CreateFilter          (^dataset_id, 1);
+
+   //fprintf (stdout, "CHECK 2\n");
+
+   HarvestFrequencies   (Freqs, 	nucs, 1,1,1);
+
+   //fprintf (stdout, "CHECK 3\n");
+
+   global 	nAC = 1;
+   global 	nAT = 1;
+   global 	nCG = 1;
+   global 	nCT = 1;
+   global 	nGT = 1;
+    
+   revRateMatrix =  {{*,	nAC*t,t,	nAT*t}
+                      {	nAC*t,*,	nCG*t,	nCT*t}
+                      {t,	nCG*t,*,	nGT*t}
+                      {	nAT*t,	nCT*t,	nGT*t,*}};
+                    
+   Model 	revQ = (revRateMatrix, 	Freqs);
+
+   //fprintf (stdout, "CHECK 4\n");
+
+   ExecuteCommands           ("Tree 	tree = " + string);
+   LikelihoodFunction 	LF = (nucs,	tree);
+   Optimize                  (res,LF);
+   
+   
+   treeAVL = tree ^ 0;
+   
+   res = {"AC": nAC, "AT": nAT, "CG": nCG, "CT": nCT, "GT": nGT};
+   res [ "_collapsed_tree" ]  =  KillInternalZeroBranchLengths (treeAVL);
+   
+   
+   //DeleteObject              (LF);
+   
+   return res;
+}
+
diff --git a/res/TemplateBatchFiles/Utility/CoalescentPostProcessor.bf b/res/TemplateBatchFiles/Utility/CoalescentPostProcessor.bf
new file mode 100644
index 0000000..cf3ba19
--- /dev/null
+++ b/res/TemplateBatchFiles/Utility/CoalescentPostProcessor.bf
@@ -0,0 +1,504 @@
+VERBOSITY_LEVEL = -1;
+incFileName = HYPHY_LIB_DIRECTORY + "TemplateBatchFiles" + DIRECTORY_SEPARATOR + "Utility" + DIRECTORY_SEPARATOR + "NJ.bf";
+ExecuteCommands ("#include \""+incFileName + "\";");
+
+/* ________________________________________________________________________________________________*/
+
+
+function processAPartition (dataFilePath, partitionMatrix)
+{
+	if (Abs (dataFilePath))
+	{
+		DataSet 	ds = ReadDataFile (dataFilePath);
+	}
+	readPCount 	   = Columns (partitionMatrix);
+	/*fprintf (stdout, "\nLoaded ", readPCount , " partitions\n");*/
+	
+	outAVL = {};
+	
+	partitionStrings = {};
+	treeStrings		= {};
+
+	lastP = 0;
+	for (h=0; h<readPCount; h=h+1)
+	{
+		pString 					= ""+lastP+"-"+partitionMatrix[h];
+		lastP 						= partitionMatrix[h]+1;
+		partitionStrings [h] 		= pString;
+		DataSetFilter filteredData 	= CreateFilter (ds,1,pString);
+		treeStrings[h] 				= InferTreeTopology(filteredData);
+	}
+	
+	pString = ""+lastP+"-"+(ds.sites-1);
+	partitionStrings [h] = pString;
+	DataSetFilter filteredData = CreateFilter (ds,1,pString);
+	treeStrings[h] = InferTreeTopology(filteredData);
+
+	resp = 4;
+
+	global betaP = 1;
+	global betaQ = 1;
+	betaP:>0.05;betaP:<85;
+	betaQ:>0.05;betaQ:<85;
+
+	category pc = (resp-1, EQUAL, MEAN, 
+					_x_^(betaP-1)*(1-_x_)^(betaQ-1)/Beta(betaP,betaQ), /* density */
+					IBeta(_x_,betaP,betaQ), /*CDF*/
+					0, 				   /*left bound*/
+					1, 			   /*right bound*/
+					IBeta(_x_,betaP+1,betaQ)*betaP/(betaP+betaQ)
+				   );
+
+
+	global alpha = .5;
+	alpha:>0.01;alpha:<100;
+	category c = (resp, pc, MEAN, 
+					GammaDist(_x_,alpha,alpha), 
+					CGammaDist(_x_,alpha,alpha), 
+					0 , 
+			  	    1e25,
+			  	    CGammaDist(_x_,alpha+1,alpha)
+			  	 );
+
+	global		 AC = 1;
+	global		 AT = 1;
+	global		 CG = 1;
+	global		 CT = 1;
+	global		 GT = 1;
+
+	GTR_Matrix = {{*,AC*t*c,t*c,AT*t*c}
+				 {AC*t*c,*,CG*t*c,CT*t*c}
+				 {t*c,CG*t*c,*,GT*t*c}
+				 {AT*t*c,CT*t*c,GT*t*c,*}};
+
+	DataSetFilter	filteredData = CreateFilter (ds,1);
+
+	bppMap = {};
+	for (h=0; h<filteredData.sites; h=h+1)
+	{
+		filterString = "" + h;
+		DataSetFilter siteFilter = CreateFilter (filteredData,1,filterString);
+
+		HarvestFrequencies (f1, siteFilter, 1, 1, 0);
+		m1 = 0;
+		for (mpiNode=0; (mpiNode < 4) && (m1<=1) ; mpiNode=mpiNode+1)
+		{
+			if (f1[mpiNode]>0)
+			{
+				m1=m1+1;
+			}
+		}	
+		if (m1>1)
+		{
+			bppMap[Abs(bppMap)] = h;
+		}
+	}
+
+	/*fprintf (stdout, "\nSequences :", filteredData.species,
+					 "\nSites     :", filteredData.sites,
+					 "\nVariable  :", Abs(bppMap), "\n"); */
+					 
+	outAVL ["VS"] = Abs(bppMap);
+
+	HarvestFrequencies (baseFreqs,ds,1,1,1);
+
+	/*fprintf (stdout, "\n\nf(A) = ", baseFreqs[0],
+					 "\nf(C) = ", baseFreqs[1],
+					 "\nf(G) = ", baseFreqs[2],
+					 "\nf(T) = ", baseFreqs[3],"\n");*/
+					
+	Model GTR_Model =  (GTR_Matrix, baseFreqs, 1);
+
+	treeString 	= InferTreeTopology   (0);
+	Tree givenTree = treeString;
+
+	LikelihoodFunction singlePart = (filteredData, givenTree);
+	Optimize (res, singlePart);
+
+	baseParams = res[1][2];
+
+	if (baseParams>0)
+	{
+
+		ConstraintString = "";
+		ConstraintString*256;
+		for (h=0; h<baseParams; h=h+1)
+		{
+			GetString (v,singlePart,h);
+			ConstraintString * (v+":="+v+"__;\n");
+		}
+		ConstraintString*0;
+		ExecuteCommands (ConstraintString);
+	}
+
+	nullCAIC = -2(res[1][0]-res[1][1]*filteredData.sites/(filteredData.sites-res[1][1]-1));
+
+	/*fprintf  (stdout, "\n\nc-AIC = ", nullCAIC, "\n", singlePart);*/
+	
+	outAVL["AC"] = AC;
+	outAVL["AT"] = AT;
+	outAVL["CG"] = CG;
+	outAVL["CT"] = CT;
+	outAVL["GT"] = GT;
+	outAVL["alpha"] = alpha;
+
+	m1 = computeMeanDivergence ("givenTree");
+
+	/*fprintf  (stdout, "\nMean divergence : ", m1*100, "%\n");*/
+	outAVL ["Divergence"] = m1*100;
+
+	USE_DISTANCES = 0;
+
+	if (readPCount == 0)
+	{
+		return outAVL;
+	}
+	
+	lfDef = "";
+	lfDef * 128;
+	lfDef  * "LikelihoodFunction multiPart  = (";
+
+	for (pccounter = 0; pccounter <= readPCount; pccounter = pccounter + 1)
+	{
+		ExecuteCommands ("DataSetFilter part_" + pccounter + " = CreateFilter (ds, 1, \"" + partitionStrings[pccounter] + "\");");
+		ExecuteCommands ("Tree tree_" + pccounter + " = " + treeStrings[pccounter] + ";");
+		if (pccounter)
+		{
+			lfDef * ",";
+		}
+		lfDef  * ("part_"+pccounter+",tree_"+pccounter);
+	}
+	lfDef  * ");";
+	lfDef  * 0;
+	ExecuteCommands (lfDef);
+	Optimize (res2, multiPart);
+
+	/*fprintf (stdout, multiPart,"\n",res,"\n", res2);*/
+	
+	myDF = baseParams + res2[1][1];
+
+	fullCAIC = -2(res2[1][0]-myDF*filteredData.sites/(filteredData.sites-myDF-1));
+	/*fprintf  (stdout, "\n\nc-AIC = ", fullCAIC, "\nDelta AIC = ", nullCAIC-fullCAIC,"\n\n");*/
+	outAVL ["DAIC"]  = nullCAIC-fullCAIC;
+	outAVL ["DLogL"] = res2[1][0]-res[1][0];
+	
+	if (outAVL ["DAIC"] < 0)
+	{
+		return outAVL;
+	}
+	
+	fragMatrix = {2,readPCount+1};
+
+	for (pccounter = 0; pccounter <=  readPCount; pccounter = pccounter + 1)
+	{
+		ExecuteCommands ("siteCount = part_" + pccounter + ".sites;");
+		/*fprintf (stdout, "Partition ", pccounter+1, " : ", siteCount, " sites\n");*/
+		fragMatrix [0][pccounter] = siteCount;
+	}
+
+	pairWiseSplitMatch = {readPCount+1,readPCount+1};
+
+	for (pccounter = 0; pccounter <=  readPCount; pccounter = pccounter + 1)
+	{
+		for (pc2 = pccounter+1; pc2 <=  readPCount; pc2 = pc2 + 1)
+		{
+			ExecuteCommands ("siteCount = compareTreesForSplits(\"tree_" +pccounter + "\",\"tree_"+pc2+"\");");
+			pairWiseSplitMatch[pccounter][pc2] = siteCount[2]/Min(siteCount[0],siteCount[1]);
+		}
+	}
+
+	/* now do SH testing */
+
+	conditionals 	 = {};
+	likelihoodScores = {readPCount+1,readPCount+1};
+	pairwiseP		 = {readPCount+1,readPCount+1};
+
+	treeSplitMatches 	 = 0;
+	khIterations		 = 1000;
+
+	for (pccounter = 0; pccounter <=  readPCount; pccounter = pccounter + 1)
+	{
+		for (pc2 = 0; pc2 <=  readPCount; pc2 = pc2 + 1)
+		{
+			if (Abs(pc2-pccounter) <= 1)
+			{
+				DataSetFilter 		aPart = CreateFilter (ds,1,partitionStrings[pccounter]);
+				Tree		  		aTree = treeStrings[pc2];
+				LikelihoodFunction	aLF	= (aPart,aTree);
+				
+				/*fprintf 		(stdout, "\n\nFitting tree ", pc2+1, " to partition ", pccounter+1, "\n");*/
+				Optimize 		(aRes, aLF);	
+				/*fprintf			(stdout, aLF);*/
+				GetInformation  (cI,c);
+				cI 				= cI[1][-1];
+				ConstructCategoryMatrix (conds, aLF);
+				conds 			= Log(cI*conds);
+				conditionals [""+pccounter+","+pc2] = conds;
+				likelihoodScores[pccounter][pc2] = aRes[1][0];
+				treeSplitMatches = treeSplitMatches + pairWiseSplitMatch[pccounter][pc2];
+			}
+		}
+		
+		/*fprintf (stdout, "\nKH Testing partition ", pccounter+1, "\n");*/
+		partTreeConds = conditionals[""+pccounter+","+pccounter];
+		
+		for (pc2 = 0; pc2 <=  readPCount; pc2 = pc2 + 1)
+		{
+			if (Abs(pc2-pccounter) == 1)
+			{
+				otherPartTree = conditionals[""+pccounter+","+pc2];
+				baseLRT = 2*(likelihoodScores[pccounter][pccounter]-likelihoodScores[pccounter][pc2]);
+				/*fprintf (stdout, "Tree ", pc2+1, " base LRT = ", baseLRT, ". p-value = ");*/
+				textMx = testLRT(partTreeConds,otherPartTree,khIterations) % 0;
+				for (kk=0; kk<khIterations; kk=kk+1)
+				{	
+					if (textMx[kk]>=0)
+					{
+						break;
+					}
+				}
+				pval = Max(1,kk)/khIterations;
+				/*
+				fprintf (stdout, pval , "\n");
+				*/
+				
+				pairwiseP[pccounter][pc2] = pval;
+			}
+		}
+	}
+
+	treeSplitMatches = treeSplitMatches*2/readPCount/(readPCount+1);
+	totalComparisons = readPCount*2;
+	threshP			 = 0.01/totalComparisons;
+
+	significantCouplings = 0;
+
+	for (pccounter = 1; pccounter <=  readPCount; pccounter = pccounter + 1)
+	{
+		if (pairwiseP[pccounter][pccounter-1] <= threshP && pairwiseP[pccounter-1][pccounter] <= threshP)
+		{
+			significantCouplings = significantCouplings + 1;
+		}
+		fragMatrix [1][pccounter] = totalComparisons*Max (pairwiseP[pccounter][pccounter-1],pairwiseP[pccounter-1][pccounter]);
+	}
+
+	/*fprintf (stdout, "A total of ", significantCouplings, "/", readPCount, " significant couplings\n");
+	fprintf (stdout, "Mean splits identify: ",treeSplitMatches, "\n" );*/
+	outAVL["SIG_CPL"] = significantCouplings;
+	outAVL["SPLITS"] = treeSplitMatches;
+	outAVL["Fragments"] = fragMatrix;
+
+	return outAVL;
+}
+
+/* ________________________________________________________________________________________________*/
+
+function computeMeanDivergence (treeID)
+{
+	ExecuteCommands ("treeAVL2="+treeID+"^0;leafCount=TipCount("+treeID+")");
+	multFactors = {};
+	
+	for (k=1; k<Abs(treeAVL2); k=k+1)
+	{
+		aNode = treeAVL2[k];
+		aNodeName = aNode["Name"];
+		parentIndex = aNode["Parent"];
+		k2 = Abs(aNode["Children"]);
+		if (k2)
+		{
+			currentDepth = aNode["Below"];
+			multFactors[aNodeName] = currentDepth;		
+			if (parentIndex > 0)
+			{
+				pInfo = treeAVL2[parentIndex];
+				pInfo ["Below"] = pInfo ["Below"] + currentDepth;
+				treeAVL2[parentIndex] = pInfo;
+			}
+		}
+		else
+		{
+			multFactors[aNodeName] = 1;
+			pInfo = treeAVL2[parentIndex];
+			pInfo ["Below"] = pInfo ["Below"] + 1;
+			treeAVL2[parentIndex] = pInfo;
+		}
+	}
+
+	pKeys 			= Rows(multFactors);
+
+	for (k=0; k<Columns(pKeys); k=k+1)
+	{
+		aNodeName = pKeys[k];
+		multFactors[aNodeName] = multFactors[aNodeName] * (leafCount-multFactors[aNodeName]);
+	}
+	
+	ExecuteCommands ("bNames = BranchName   ("+treeID+",-1);");
+	ExecuteCommands ("bLen   = BranchLength ("+treeID+",-1);");
+	
+	sum = 0;
+	bc  = Columns(bNames)-1;
+	
+	for (k=0; k<bc; k=k+1)
+	{
+		aNodeName = bNames[k];
+		sum = sum + bLen[k]*multFactors[aNodeName];
+	}	
+	return sum/(leafCount*(leafCount-1)*0.5);
+}
+
+/* ________________________________________________________________________________________________*/
+
+function compareTreesForSplits (tName, tName2)
+{
+	/* obtain an AVL data structure of the tree, post-order layout */
+
+	ExecuteCommands   ("_astavl_="+tName+"^1;");
+	_tree_size_ = Abs (_astavl_);
+
+
+	nodeMapAVL = {};
+	
+	for (_a_node = 2; _a_node < _tree_size_; _a_node = _a_node + 1)
+	{
+		_node_info = _astavl_[_a_node];
+		myDegree = Abs(_node_info["Children"]);
+		
+		if (myDegree == 0)
+		{
+			nodeName = _node_info["Name"];
+			nodeMapAVL [nodeName] = Abs(nodeMapAVL)+1;
+		}
+	}
+	
+	split1 = getSplits(0);
+	ExecuteCommands   ("_astavl_="+tName2+"^1;");
+	_tree_size_ = Abs (_astavl_);
+	split2 = getSplits(0);
+	
+	s1c = Abs(split1);
+	s2c = Abs(split2);
+		
+	matches = {};
+	match1  = {};
+	match2  = {};
+	for (r1 = 0; r1 < s1c; r1 = r1 + 1)
+	{
+		if (match1[r1] == 0)
+		{
+			for (r2 = 0; r2 < s2c; r2 = r2 + 1)
+			{
+				if (match2[r2] == 0)
+				{
+					splitCheck = compareSplits (split1[r1],split2[r2]);
+					if (splitCheck)
+					{
+						mr = {{r1,r2}};
+						matches [Abs(matches)] = mr;
+						match1[r1] = 1;
+						match2[r2] = 1;
+					}
+				}
+			}
+		}
+	}
+	
+	
+	return {{s1c,s2c,Abs(matches)}};
+}
+
+/* ________________________________________________________________________________________________*/
+
+function getSplits (dummy)
+{
+	treeSplits = {};
+	for (_a_node = 2; _a_node < _tree_size_; _a_node = _a_node + 1)
+	{
+		_node_info = _astavl_[_a_node];
+		myDegree = Abs(_node_info["Children"]);
+		myDepth  = _node_info["Depth"];
+		
+			
+		if (myDegree && _node_info["Length"]>0)
+		{
+			nodeName = _node_info["Name"];
+			aSplit = {Abs(nodeMapAVL),1};
+			for (_b_node = _a_node + 1; _b_node < _tree_size_; _b_node = _b_node + 1)
+			{
+				_bnode_info = _astavl_[_b_node];
+					if (_bnode_info["Depth"] <= myDepth)
+				{
+					break;
+				}
+				if (Abs(_bnode_info["Children"])==0)
+				{
+					_bnode_info = _bnode_info["Name"];
+					_bnode_info = nodeMapAVL[_bnode_info];
+					if (_bnode_info == 0)
+					{
+						fprintf (stdout, "Error: extraneous node name\n");
+						return 0;
+					}
+					aSplit [_bnode_info-1] = 1;
+				}
+			}
+			treeSplits [Abs(treeSplits)] = aSplit;
+		}
+	}
+	return treeSplits;
+}
+
+/* ________________________________________________________________________________________________*/
+
+function compareSplits (s1, s2)
+{
+	sl            = Rows(s1);
+	positiveCheck = (s1[0] == s2[0]);
+	for (k=1; k<sl; k=k+1)
+	{
+		if (s1[k] != s2[k])
+		{
+			if (positiveCheck)
+			{
+				return 0;
+			}
+		}
+		else
+		{
+			if (!positiveCheck)
+			{
+				return 0;
+			}
+		}
+	}
+	return -1+2*positiveCheck;	
+}
+
+/*--------------------------------------------------------------------------------------*/
+
+function testLRT (vec1, vec2, itCount)
+{
+	size1 = Columns(vec1);
+	
+	sumVec1 = {size1,1};
+	jvec	= {2,size1};
+	resMx1	= {itCount,1};
+	resMx2	= {itCount,1};
+	
+	for (k=0; k<size1; k=k+1)
+	{
+		sumVec1 [k]	   = 1;
+		jvec	[0][k] = vec1[k];
+		jvec	[1][k] = vec2[k];
+	}
+	
+	
+	for (k=0; k<itCount; k=k+1)
+	{
+		resampled = Random(jvec,1);
+		resampled = resampled*sumVec1;
+		resMx1[k] = resampled[0];
+		resMx2[k] = resampled[1];
+	}
+	
+	return (resMx1-resMx2)*2;
+}
diff --git a/res/TemplateBatchFiles/Utility/CodonTools.bf b/res/TemplateBatchFiles/Utility/CodonTools.bf
new file mode 100644
index 0000000..f65122a
--- /dev/null
+++ b/res/TemplateBatchFiles/Utility/CodonTools.bf
@@ -0,0 +1,67 @@
+function 	_computeSNSSites (_filterName, _genCode, _codonFreqs, callCount)
+{
+	if (callCount == 0)
+	{
+		ExecuteCommands ("GetDataInfo (charInfo, `_filterName`, \"CHARACTERS\");_codonCount=`_filterName`.sites;");
+		nonStopCount = Columns (charInfo);
+		/* make syn and non-syn template matrices */
+		ExecuteAFile (HYPHY_LIB_DIRECTORY+"TemplateBatchFiles"+DIRECTORY_SEPARATOR+"Distances"+DIRECTORY_SEPARATOR+"CodonTools.def");
+	}
+
+	sSites  = 0;
+	nsSites = 0;
+
+	synM    = {nonStopCount,nonStopCount};
+	nonSynM = {nonStopCount,nonStopCount};
+
+	vertOnes = {nonStopCount,1}["1"];
+	horOnes  = {1,nonStopCount}["1"];
+
+	hShift = 0;
+	for (h1 = 0; h1 < 64; h1=h1+1)
+	{
+		gc1 = _genCode[h1];
+		if (gc1 == 10)
+		{
+			hShift = hShift+1;
+		}
+		else
+		{
+			sSites  = sSites   + _codonCount * _S_NS_POSITIONS_[0][h1] * _codonFreqs[h1-hShift];
+			nsSites = nsSites + _codonCount * _S_NS_POSITIONS_[1][h1] * _codonFreqs[h1-hShift];
+			
+			vShift = hShift;
+			for (v1 = h1+1; v1 < 64; v1=v1+1)
+			{
+				gc2 = _genCode[v1];
+				if (gc2 == 10)
+				{
+					vShift = vShift + 1;
+				}
+				else
+				{
+					if (gc1 == gc2)
+					{
+						synM [h1-hShift][v1-vShift] = _codonFreqs[h1-hShift];
+						synM [v1-vShift][h1-hShift] = _codonFreqs[v1-vShift];
+					}
+					else
+					{
+						nonSynM [h1-hShift][v1-vShift] = _codonFreqs[h1-hShift];
+						nonSynM [v1-vShift][h1-hShift] = _codonFreqs[v1-vShift];
+					}
+				}
+			}
+		}
+	}
+	
+	_returnAVL = {};
+	_returnAVL ["Dimension"] = nonStopCount;
+	_returnAVL ["Sites"] 	 = _codonCount*3;
+	_returnAVL ["NSSites"] 	 = nsSites;
+	_returnAVL ["SSites"] 	 = sSites;	
+	_returnAVL ["synM"] 	 = synM;	
+	_returnAVL ["nonSynM"] 	 = nonSynM;
+	
+	return 		_returnAVL;
+}
diff --git a/res/TemplateBatchFiles/Utility/DBTools.ibf b/res/TemplateBatchFiles/Utility/DBTools.ibf
new file mode 100644
index 0000000..0710a6a
--- /dev/null
+++ b/res/TemplateBatchFiles/Utility/DBTools.ibf
@@ -0,0 +1,216 @@
+/*---------------------------------------------*/
+/* read/write a result cache file
+/*---------------------------------------------*/
+
+function _openCacheDB   (fileName)
+{
+	if (Abs(fileName))
+	{
+		DoSQL (SQL_OPEN, fileName, DB_ID);
+	}
+	else
+	{
+		DoSQL (SQL_OPEN, PROMPT_FOR_FILE, DB_ID);
+	}
+	return DB_ID;
+}
+
+/*---------------------------------------------*/
+
+function _closeCacheDB   (DB_ID)
+{
+	DoSQL (SQL_CLOSE, "", DB_ID);
+	return 0;
+}
+ 
+/*---------------------------------------------*/
+
+function _TableExists (DB_ID, tableID)
+{
+	_dbRecordCounter = 0;
+	DoSQL (DB_ID, "SELECT SQL FROM SQLITE_MASTER WHERE NAME == '"+tableID+"'", "return _CountMatchingRecords(0)");
+	return _dbRecordCounter;
+}
+
+/*---------------------------------------------*/
+
+function bufferBuilder (key, value)
+{
+	if (_counter)
+	{
+		_buffer * (",");
+	}
+	_counter = _counter + 1;
+	_buffer * (key + " " + value + "\n"); 
+	
+	return 0;
+}
+ 
+/*---------------------------------------------*/
+
+function _CreateTableIfNeeded (DB_ID, tableID, tableDefinition, force)
+{
+	haveTable = _TableExists(DB_ID, tableID);
+	if (haveTable && force)
+	{
+		DoSQL (DB_ID,"DROP TABLE " + tableID, "return 0;");
+	}
+	
+	if (haveTable == 0 || force)
+	{
+		_buffer  = ""; _buffer * 128;
+		_counter = 0;
+		_buffer * "(";
+		tableDefinition["bufferBuilder"][""];
+		_buffer * ")";
+		_buffer * 0;
+		
+		DoSQL (DB_ID, "CREATE TABLE `tableID` `_buffer`", "");
+		return 1;
+	}
+	return 0;
+} 
+   
+/*---------------------------------------------*/
+
+function _CheckDBID (DB_ID, tableID, tableColumns)
+{
+	_dbRecordCounter = 0;
+	DoSQL (DB_ID, "SELECT SQL FROM SQLITE_MASTER WHERE NAME == '"+tableID+"'", "return _CountMatchingRecords(0)");
+	if (_dbRecordCounter>0)
+	{
+		DoSQL (DB_ID, "DROP TABLE "+tableID, "");
+	}
+	
+	dbColumnLabels = Rows (tableColumns);
+	sqlCode = "";
+	sqlCode *128;
+	sqlCode * ("CREATE TABLE  "+tableID + " (");
+	for (_k=0; _k<Columns(dbColumnLabels); _k=_k+1)
+	{
+		if (_k)
+		{
+			sqlCode * ",";
+		}
+		sqlCode * (dbColumnLabels[_k] + " " + tableColumns[dbColumnLabels[_k]]);
+	}
+	sqlCode * ")";
+	sqlCode * 0;
+	
+	DoSQL (DB_ID, sqlCode ,"");
+	return 0;
+}
+
+/*---------------------------------------------*/
+
+function _CountMatchingRecords (dummy)
+{
+	_dbRecordCounter = _dbRecordCounter + 1;
+	return 0;
+}
+
+/*---------------------------------------------*/
+
+function _ExecuteSQL (DB_ID, theCode)
+{
+	_recordsFound = {};
+	DoSQL (DB_ID, theCode, "return _matchRecordsByField (1);");	
+	return _recordsFound;
+	
+}
+
+/*---------------------------------------------*/
+
+function _matchRecordsByField (dummy)
+{
+	_rc = Columns(SQL_ROW_DATA);
+	if (_rc > 1 || dummy)
+	{
+		_cAbs = Abs(_recordsFound);
+		_recordsFound[_cAbs] = {};
+		for (_rcc = 0; _rcc < _rc; _rcc = _rcc+1)
+		{
+			(_recordsFound[_cAbs])[SQL_COLUMN_NAMES[_rcc]] = SQL_ROW_DATA[_rcc];
+		}
+	}
+	else
+	{
+		_fieldValue = SQL_ROW_DATA[0];
+		if (Abs(_fieldValue))
+		{
+			_recordsFound [Abs(_recordsFound)] = _fieldValue;
+		}
+	}
+	return 0;
+}
+
+/*---------------------------------------------*/
+
+function _InsertRecord (DB_ID,tableName, fieldData)
+{
+	if (Abs (fieldData))
+	{
+		_fieldNames = Rows (fieldData);
+		_fieldList = "";
+		_fieldList * 128;
+		_valueList = "";
+		_valueList * 128;
+		
+		_doIt 	   = 1;
+		for (_k = 0; _k < Columns (_fieldNames); _k = _k+1)
+		{
+			if (_k)
+			{
+				_fieldList * ",";
+				_valueList * ",";
+			}
+			_fieldList * (_fieldNames[_k]);
+			_valueList * ("'" + fieldData[_fieldNames[_k]] + "'");
+		}
+		_fieldList * 0;
+		_valueList * 0;
+		sqlCode = "INSERT OR REPLACE INTO  " + tableName  + "("+_fieldList + ") VALUES (" + _valueList + ")";
+		DoSQL (DB_ID,sqlCode ,"");		
+	}
+	return 0;
+}
+
+/*---------------------------------------------*/
+
+function _InsertMultipleRecords (DB_ID,tableName, recordData)
+{
+	sqlCode = "";
+	sqlCode * 128;
+	sqlCode * "BEGIN TRANSACTION;\n";
+	for (_k2 = 0; _k2 < Abs (recordData); _k2 = _k2 + 1)
+	{
+		fieldData = recordData[_k2];
+		if (Abs (fieldData))
+		{
+			_fieldNames = Rows (fieldData);
+			_fieldList = "";
+			_fieldList * 128;
+			_valueList = "";
+			_valueList * 128;
+			
+			_doIt 	   = 1;
+			for (_k = 0; _k < Columns (_fieldNames); _k = _k+1)
+			{
+				if (_k)
+				{
+					_fieldList * ",";
+					_valueList * ",";
+				}
+				_fieldList * (_fieldNames[_k]);
+				_valueList * ("'" + fieldData[_fieldNames[_k]] + "'");
+			}
+			_fieldList * 0;
+			_valueList * 0;
+			sqlCode * ("\nINSERT OR REPLACE INTO  " + tableName  + "("+_fieldList + ") VALUES (" + _valueList + ");");
+		}
+	}
+	sqlCode * "END TRANSACTION;\n";
+	sqlCode * 0;
+	DoSQL (DB_ID,sqlCode ,"");		
+	return 0;
+}
diff --git a/res/TemplateBatchFiles/Utility/DescriptiveStatistics.bf b/res/TemplateBatchFiles/Utility/DescriptiveStatistics.bf
new file mode 100644
index 0000000..484dea5
--- /dev/null
+++ b/res/TemplateBatchFiles/Utility/DescriptiveStatistics.bf
@@ -0,0 +1,117 @@
+function GatherDescriptiveStats (_dataVector)
+{
+	count = Rows (_dataVector);
+	if (count == 1)
+	{
+		_dataVector = Transpose (_dataVector);
+		count = Rows (_dataVector);
+	}
+
+	sum  = 0;
+	sum2 = 0;
+	sum3 = 0;
+	sum4 = 0;
+	_dataVector = _dataVector%0;
+	
+	data_min  = _dataVector [0];
+	data_max  = _dataVector [count-1];
+	data_25   = _dataVector [(count*0.025)$1];
+	data_975  = _dataVector [Min((count*0.975+0.5)$1,count-1)];
+	
+	if (count%2)
+	{
+		median = _dataVector[count/2];
+	}
+	else
+	{
+		counter = count/2-1;
+		median = (_dataVector[counter]+_dataVector[counter+1])/2;
+	}
+
+	_nonNegativeValues = -1;
+	for (counter=0; counter < count; counter = counter+1)
+	{
+		term = _dataVector [counter];
+		sum  = sum+term;
+		sum2 = sum2+term*term;
+		sum3 = sum3+term^3;
+		sum4 = sum4+term^4;
+		if (term >= 0 && _nonNegativeValues < 0)
+		{
+			_nonNegativeValues = count - counter;
+		}
+	}
+	_nonNegativeValues = Max(_nonNegativeValues,0);
+	_dstats = {};
+
+	_dstats ["Count"] 		= count;
+	_dstats ["Mean"] 		= sum/count;
+	_dstats ["Median"] 		= median;
+	_dstats ["Min"] 		= data_min;
+	_dstats ["Max"] 		= data_max;
+	_dstats ["2.5%"] 		= data_25;
+	_dstats ["97.5%"] 		= data_975;
+	_dstats ["Sum"] 		= sum;
+	_dstats ["Sq. sum"] 	= sum2;
+	_dstats ["Non-negative"]= _nonNegativeValues;
+
+	if (count > 1)
+	{
+		counter = Max(0,(sum2-sum*sum/count)/(count-1));
+		
+		if (count > 3)
+		{
+			sum4 = (-6*sum^4+12*count*sum^2*sum2-3(count-1)*count*sum2^2-4*count(count+1)*sum*sum3+count^2*(count+1)*sum4)/(count*(count-1)*(count-2)*(count-3));
+			sum4 = sum4/counter^2+3;
+		}
+		else
+		{
+			sum4 = 0;
+		}	
+
+		if (count > 2)
+		{
+			sum3 = (2*sum^3-3*count*sum*sum2+count^2*sum3)/(count*(count-1)*(count-2))/Sqrt(counter^2);
+		}
+		else
+		{
+			sum3 = 0;
+		}	
+		
+		_dstats["Std.Dev"]   = Sqrt(counter);
+		_dstats["Variance"]  = counter;
+		_dstats["COV"] 		 = Sqrt (counter)*count/sum;
+		_dstats["Skewness"] = sum3;
+		_dstats["Kurtosis"] = sum4;
+		
+	}
+	else
+	{
+		_dstats["Std.Dev"]   = "N/A";
+		_dstats["Variance"]  = "N/A";
+		_dstats["COV"] 		 = "N/A";
+		_dstats["Skewness"]  = "N/A";
+		_dstats["Kurtosis"]  = "N/A";
+	}
+	return _dstats;
+}
+
+function PrintDescriptiveStats (label,_stats)
+{
+	fprintf (stdout, "\n", label, "\n\n\tCount    = ", _stats["Count"],
+				 "\n\tMean     = ", _stats["Mean"],
+				 "\n\tMedian   = ", _stats["Median"],
+				 "\n\tVariance = ", _stats["Variance"],
+				 "\n\tStd.Dev  = ", _stats["Std.Dev"],
+				 "\n\tCOV      = ", _stats["COV"],
+				 "\n\tSum      = ", _stats["Sum"],
+				 "\n\tSq. sum  = ", _stats["Sq. sum"],
+				 "\n\tSkewness = ", _stats["Skewness"],
+				 "\n\tKurtosis = ", _stats["Kurtosis"],
+				 "\n\tMin      = ", _stats["Min"],
+				 "\n\t2.5%     = ", _stats["2.5%"],
+				 "\n\t97.5%    = ", _stats["97.5%"],
+				 "\n\tMax      = ", _stats["Max"],"\n\n");
+
+	return 0;
+}
diff --git a/res/TemplateBatchFiles/Utility/GrabBag.bf b/res/TemplateBatchFiles/Utility/GrabBag.bf
new file mode 100644
index 0000000..bab4bc5
--- /dev/null
+++ b/res/TemplateBatchFiles/Utility/GrabBag.bf
@@ -0,0 +1,961 @@
+/*---------------------------------------------------------*/
+/* Turn the keys of an AVL into a string for labeling 
+   chart rows */
+   
+   
+
+function avlToLabels (_gb_anAVL,_gb_prefix,_gb_delim)
+{
+	_gb_resString = "";
+	_gb_keys	  = Rows (_gb_anAVL);
+	_gb_count	  = Columns (_gb_keys);
+	_gb_resString * 128;
+	_gb_resString * _gb_prefix;
+	if (Abs(_gb_prefix))
+	{
+		_gb_resString * _gb_delim;
+	}
+	if (_gb_count)
+	{
+		_gb_resString * _gb_keys[0];
+	}
+	for (_gb_idx = 1; _gb_idx < _gb_count; _gb_idx = _gb_idx + 1)
+	{
+		_gb_resString * (_gb_delim+_gb_keys[_gb_idx]);
+	}
+	_gb_resString * 0;
+	return _gb_resString;
+}
+
+/*---------------------------------------------------------*/
+/* Turn the keys of an AVL into a numerical column matrix  */
+   
+function avlKeysToMatrix (_gb_anAVL)
+{
+	_gb_keys	  = Rows (_gb_anAVL);
+	_gb_count	  = Columns (_gb_keys);
+	_gb_resMatrix = {_gb_count,1};
+
+	for (_gb_idx = 0; _gb_idx < _gb_count; _gb_idx = _gb_idx + 1)
+	{
+		_gb_resMatrix[_gb_idx] = 0+_gb_keys[_gb_idx];
+	}
+	return _gb_resMatrix;
+}
+
+/*---------------------------------------------------------*/
+/* Assuming that the AVL is 0..N indexed, produce a 
+string with AVL entries separated by _gb_delim */
+
+function avlToString (_gb_anAVL,_gb_delim)
+{
+	_gb_count	  = Abs (_gb_anAVL);
+	_gb_resString = "";
+	_gb_resString * 128;
+	if (_gb_count)
+	{
+		_gb_resString * (""+_gb_anAVL[0]);
+	}
+	for (_gb_idx = 1; _gb_idx < _gb_count; _gb_idx = _gb_idx + 1)
+	{
+		_gb_resString * (_gb_delim+_gb_anAVL[_gb_idx]);
+	}
+	_gb_resString * 0;
+	return _gb_resString;
+}
+
+
+/*---------------------------------------------------------*/
+/* Stratify avl by values; store indices for each unique value */
+
+function stratifyAVLByValuesAux (key,value)
+{
+	if (Abs (_gb_resAVL[value]) == 0)
+	{
+		_gb_resAVL[value] = {};
+	}
+	
+	_gb_resAVL[value] + key;
+	
+	return 0;
+	
+}
+
+function stratifyAVLByValues (_gb_anAVL)
+{
+	_gb_count	  = Abs (_gb_anAVL);
+	_gb_resAVL	  = {};
+	_gb_anAVL["stratifyAVLByValuesAux"][""];
+	return _gb_resAVL;
+}
+
+/*---------------------------------------------------------*/
+/* Stratify a matrix by values; store indices for each unique value */
+
+function stratifyMatrixByValues (_gb_aMatrix)
+{
+	_gb_count	  = Rows (_gb_aMatrix)*Columns(_gb_aMatrix);
+	_gb_resAVL	  = {};
+	for (_gb_idx = 0; _gb_idx < _gb_count; _gb_idx += 1)
+	{
+		_gb_key = _gb_aMatrix[_gb_idx];
+		if (Abs (_gb_resAVL[_gb_key]) == 0)
+		{
+			_gb_resAVL[_gb_key] = {};
+		}
+		(_gb_resAVL[_gb_key]) + _gb_idx;
+	}
+	return _gb_resAVL;
+}
+
+
+/*---------------------------------------------------------*/
+/* Assuming that the AVL is 0..N indexed, produce a 
+row matrix with AVL entries, using _gb_map to map the values 
+and _gb_stride to do the conversion */
+
+function avlToRow (_gb_anAVL, _gb_map, _gb_stride)
+{
+	_gb_count	  = Abs (_gb_anAVL);
+	_gb_matrix	  = {1,_gb_count*_gb_stride};
+	
+	if (_gb_stride>1)
+	{
+		for (_gb_idx = 0; _gb_idx < _gb_count; _gb_idx = _gb_idx + 1)
+		{
+			for (_gb_idx2 = 0; _gb_idx2 < _gb_stride; _gb_idx2 = _gb_idx2 + 1)
+			{
+				_gb_matrix [_gb_idx*_gb_stride+_gb_idx2] = _gb_map[_gb_stride*_gb_anAVL[_gb_idx]+_gb_idx2];
+			}
+		}
+	}	
+	else
+	{
+		for (_gb_idx = 0; _gb_idx < _gb_count; _gb_idx = _gb_idx + 1)
+		{
+			_gb_matrix [_gb_idx] = _gb_map[_gb_anAVL[_gb_idx]];
+		}
+	}
+	return _gb_matrix;
+}
+
+/*---------------------------------------------------------*/
+/* Split a file path into DIRECTORY, FILENAME and EXTENSION  */
+   
+function splitFilePath (_filePath)
+{
+	_splitPath = {};
+	_split     = _filePath $ ("[^\\"+DIRECTORY_SEPARATOR+"]+$");
+	if (_split[0] == 0 && _split[1] == Abs (_filePath)-1) /* no path, all file name */
+	{
+		_splitPath ["DIRECTORY"] = "";
+	}
+	else
+	{
+		_splitPath ["DIRECTORY"] = _filePath[0][_split[0]-1];
+		_filePath = _filePath[_split[0]][Abs(_filePath)];
+	}
+
+	_split     = _filePath || "\\.";
+	if (_split[0] < 0) /* no extension */
+	{
+		_splitPath ["EXTENSION"] = "";
+		_splitPath ["FILENAME"]  = _filePath;
+ 	}
+	else
+	{
+		_splitPath ["EXTENSION"] = _filePath[_split[Rows(_split)-1]+1][Abs(_filePath)-1];
+		_splitPath ["FILENAME"]  = _filePath[0][_split[Rows(_split)-1]-1];
+	}
+	return _splitPath;
+}
+
+/*---------------------------------------------------------*/
+/* fix global variables in a LF at their current values */
+   
+function fixGlobalParameters (_lfName) {
+	GetString (_lfInfo,^_lfName,-1);
+	_lfInfo = _lfInfo["Global Independent"];
+	for (_gb_idx = 0; _gb_idx < Columns (_lfInfo); _gb_idx += 1) {
+		ExecuteCommands (_lfInfo[_gb_idx] + ":=" + _lfInfo[_gb_idx] + "__;");
+	} 	
+	return 0;
+}
+
+/*---------------------------------------------------------*/
+/* unconstrain global variables in a LF at their current values */
+   
+function unconstrainGlobalParameters (_lfName) {
+	GetString (_lfInfo,^_lfName,-1);
+	_lfInfo = _lfInfo["Global Constrained"];
+	for (_gb_idx = 0; _gb_idx < Columns (_lfInfo); _gb_idx += 1) {
+		ExecuteCommands (_lfInfo[_gb_idx] + "=" + _lfInfo[_gb_idx]);
+	} 	
+	return 0;
+}
+
+/*---------------------------------------------------------*/
+/* prompt for global variabless in a LF and fix their values */
+   
+function promptForGlobalParameters (_lfName)
+{
+	ExecuteCommands ("GetString (_lfInfo," + _lfName + ",-1);");
+	_lfInfo = _lfInfo["Global Independent"];
+	for (_gb_idx = 0; _gb_idx < Columns (_lfInfo); _gb_idx = _gb_idx + 1)
+	{
+		fprintf (stdout, "\nEnter a value for ", _lfInfo[_gb_idx], ":");
+		fscanf  (stdin, "Number", _tval);
+		ExecuteCommands (_lfInfo[_gb_idx] + ":=" + _tval + ";");
+	} 	
+	return 0;
+}
+
+/*---------------------------------------------------------*/
+/* echo global parameters */
+   
+function echoGlobalParameters (_lfName)
+{
+	ExecuteCommands ("GetString (_lfInfo," + _lfName + ",-1);");
+	_lfInfo = _lfInfo["Global Independent"];
+	for (_gb_idx = 0; _gb_idx < Columns (_lfInfo); _gb_idx = _gb_idx + 1)
+	{
+		ExecuteCommands ("_tval = "+_lfInfo[_gb_idx]);
+		fprintf (stdout, _lfInfo[_gb_idx], " : ", Format (_tval, 12, 4), "\n");
+	} 	
+	return Columns (_lfInfo);
+}
+
+
+/*---------------------------------------------------------*/
+/* take a snapshot of global parameters */
+   
+function stashGlobalParameters (_lfName)
+{
+	ExecuteCommands ("GetString (_lfInfo," + _lfName + ",-1);");
+	_lfInfo = _lfInfo["Global Independent"];
+	_paramStash = {};
+	for (_gb_idx = 0; _gb_idx < Columns (_lfInfo); _gb_idx = _gb_idx + 1)
+	{
+		ExecuteCommands ("_paramStash[\""+_lfInfo[_gb_idx]+"\"] =" + _lfInfo[_gb_idx] + ";");
+	} 	
+	return _paramStash;
+}
+
+/*---------------------------------------------------------*/
+/* define a global parameter if not already defined */
+   
+function defineIfNeeded (_parName, _parValue)
+{
+	ExecuteCommands("GetInformation (_gb_idx, \"^`_parName`$\");");
+	if (Rows (_gb_idx) == 0)
+	{
+		ExecuteCommands ("global `_parName`="+_parValue+";");
+		return 0;
+	}
+	return 1;
+}
+
+/*---------------------------------------------------------*/
+/* export a list of variables into the string of the form 
+   
+   varID = varValue; 
+
+*/
+   
+function exportVarList (_varList)
+{
+	_exportString = ""; _exportString * 256;
+	
+	for (_idx = 0; _idx < Columns (_varList) * Rows (_varList); _idx += 1)
+	{
+		_exportString * (_varList [_idx] + " = " + Eval (_varList[_idx]) + ";\n");
+	}
+	
+	_exportString * 0;
+	return _exportString;
+}
+
+/*---------------------------------------------------------*/
+/* restore values of global parameters */
+   
+function restoreGlobalParameters (_paramStash)
+{
+	_stashKeys = Rows(_paramStash);
+	for (_gb_idx = 0; _gb_idx < Abs (_paramStash); _gb_idx = _gb_idx + 1)
+	{
+		ExecuteCommands (_stashKeys[_gb_idx] + "=" + _paramStash[_stashKeys[_gb_idx]] + ";");
+	} 	
+	return 0;
+}
+
+/*---------------------------------------------------------*/
+/* take a string row/columqn matrix and turn it into an AVL of 
+   the form avl["matrix entry"] = 1 for each matrix entry */
+   
+function stringMatrixToAVL (_theList&)
+{
+	_gb_dim = Rows(_theList)*Columns(_theList);
+	_gb_ret = {};
+	for (_gb_idx = 0; _gb_idx < _gb_dim; _gb_idx = _gb_idx + 1)
+	{
+		_gb_ret [_theList[_gb_idx]] = _gb_idx+1;
+	} 	
+	return _gb_ret;
+}
+
+/*---------------------------------------------------------*/
+/* take an avl indexed by 0..N-1 and convert to a row matrix */
+   
+function avlToMatrix (_theList&)
+{
+	_gb_dim = Abs(_theList);
+	_gb_ret = {_gb_dim,1};
+	for (_gb_idx = 0; _gb_idx < _gb_dim; _gb_idx = _gb_idx + 1)
+	{
+		_gb_ret [_gb_idx] = _theList[_gb_idx];
+	} 	
+	return _gb_ret;
+}
+
+/*---------------------------------------------------------*/
+/* take an avl indexed by 0..N-1 and convert to a choice list matrix */
+   
+function avlToChoiceMatrix (_theList&)
+{
+	_gb_dim = Abs(_theList);
+	_gb_ret = {_gb_dim,2};
+	for (_gb_idx = 0; _gb_idx < _gb_dim; _gb_idx = _gb_idx + 1)
+	{
+		_gb_ret [_gb_idx][0] = _theList[_gb_idx];
+		_gb_ret [_gb_idx][1] = _theList[_gb_idx];
+	} 	
+	return _gb_ret;
+}
+
+/*---------------------------------------------------------*/
+/* swap the roles of integer keys (+1) and string values in an avl */
+   
+function swapKeysAndValues (_theList&)
+{
+	_gb_ret 	= 	{};
+	_gb_dim 	= 	Abs(_theList);
+	_gb_keys	= 	Rows (_theList);
+	
+	for (_gb_idx = 0; _gb_idx < _gb_dim; _gb_idx = _gb_idx + 1)
+	{
+		_gb_ret [_theList[_gb_keys[_gb_idx]]] = 1+_gb_keys[_gb_idx];
+	} 	
+	return _gb_ret;
+}
+
+
+/*---------------------------------------------------------*/
+/* report a string version of an a/b ratio, handling the cases
+   of a and/or b = 0 */
+   
+function _standardizeRatio (_num, _denom)
+{
+	if (_denom != 0)
+	{
+		_ratio = _num/_denom;
+		if (_ratio < 10000)
+		{
+			return Format (_ratio,10,4);
+		}
+	}
+	else
+	{
+		if (_num == 0)
+		{
+			return " Undefined";
+		}
+	}
+	return "  Infinite";
+}
+
+/*---------------------------------------------------------*/
+/* copy branch lengths */
+   
+function _copyBranchLengths (_treeID1, _treeID2, _op, _suffix)
+{
+	ExecuteCommands ("_gb_dim=BranchName("+_treeID2+",-1);");
+	_gb_ret = "";
+	_gb_ret * 128;
+	
+	for (_gb_idx = 0; _gb_idx < Columns(_gb_dim)-1; _gb_idx = _gb_idx + 1)
+	{
+		_gb_idx2 = _treeID2 + "." + _gb_dim[_gb_idx] + "." + _suffix;
+		ExecuteCommands ("_gb_idx2="+_gb_idx2);
+		_gb_ret * (_treeID1 + "." + _gb_dim[_gb_idx] + "." +_suffix + ":=" + _op + _gb_idx2 + ";\n");
+	} 	
+	_gb_ret * 0;
+	return _gb_ret;
+}
+
+
+/*---------------------------------------------*/
+/* convert a number into a 3 letter string 
+   for initializing stdin lists */
+/*---------------------------------------------*/
+   
+function _mapNumberToString (n)
+{
+	if (n>=100)
+	{
+		return "" + n;
+	}
+	if (n>=10)
+	{
+		return "0" + n;
+	}
+	return "00" + n;
+}
+
+/*---------------------------------------------
+ given two integer vectors of the same length,
+cross-tabulate the values of each vector (vec1 
+gives the row index, vec2 - the column index)
+---------------------------------------------*/
+
+function table (vec1, vec2)
+{
+	if (Rows(vec1) == Rows(vec2) && Columns (vec1) == 1 && Columns (vec2) == 1)
+	{
+		maxV = 0;
+		rd = Rows(vec1);
+		for (_r = 0; _r < rd; _r = _r+1)
+		{
+			maxV = Max (maxV, Max(vec1[_r],vec2[_r]));
+		}	
+		tableOut = {maxV+1, maxV+1};
+		for (_r = 0; _r < rd; _r = _r+1)
+		{
+			tableOut[vec1[_r]][vec2[_r]] = tableOut[vec1[_r]][vec2[_r]] + 1;
+		}	
+		return tableOut;
+	}
+	else
+	{
+		return 0;
+	} 
+}
+
+/*---------------------------------------------
+ given two integer vectors of the same length,
+cross-tabulate the values of each vector (vec1 
+gives the row index, vec2 - the column index)
+---------------------------------------------*/
+
+function vector_max (vec1)
+{
+	rd   = Rows(vec1) * Columns (vec1);
+	maxV = -1e100;
+	maxI = 0;
+	for (_r = 0; _r < rd; _r = _r+1)
+	{
+		if (vec1[_r] > maxV)
+		{
+			maxV = vec1[_r];
+			maxI = _r;
+		}
+	}	
+	return {{maxV__,maxI__}};
+}
+
+
+/*---------------------------------------------
+ the analog of Python's string.join (list)
+---------------------------------------------*/
+
+function string_join (sep, list)
+{
+	_result = ""; _result * 128;
+	
+	if (Type (list) == "Matrix")
+	{
+		_dim = Rows(list)*Columns(list);
+	}
+	else
+	{
+		_dim = Abs (list);
+	}
+	
+	if (_dim)
+	{
+		_result * ("" + list[0]);
+		for (_r = 1; _r < _dim; _r = _r + 1)
+		{
+			_result * (sep + list[_r]);
+		
+		}
+	}
+	
+	_result * 0;
+	return _result;
+}
+
+/*---------------------------------------------
+ prompt for a value in a given range, given
+ a default value. 
+---------------------------------------------*/
+
+function prompt_for_a_value (prompt,default,lowerB,upperB,isInteger)
+{
+	value = lowerB-1;
+	while (value < lowerB || value > upperB)
+	{
+		fprintf (stdout, "<<", prompt, " (permissible range = [", lowerB, ",", upperB, "], default value = ", default);
+		if (isInteger)
+		{
+			fprintf (stdout, ", integer"); 
+		}
+		fprintf (stdout, ")>>");
+		fscanf  (stdin, "String", strVal);
+		if (Abs(strVal) == 0)
+		{
+			value = 0+default;
+			break;
+		}	
+		value = 0+strVal;
+	}
+	if (isInteger)
+		return value$1;
+		
+	return value;
+}
+
+/*---------------------------------------------
+take an AVL of the form ["string"] = number
+and print it as:
+
+key[_sepChar]+: number (%)
+
+---------------------------------------------*/
+	
+function _printAnAVL (_theList, _sepChar)
+{
+	_gb_keys 		= _sortStrings(Rows (_theList));
+	_printAnAVLInt (_theList, _gb_keys, _sepChar, 0);
+		
+	return 0;
+}
+
+/*---------------------------------------------
+take an AVL of the form ["string"] = number
+and print it as:
+
+key[_sepChar]+: number (%)
+
+add a "Total" row
+
+---------------------------------------------*/
+	
+function _printAnAVLTotal (_theList, _sepChar)
+{
+	_gb_keys 		= _sortStrings(Rows (_theList));
+	_printAnAVLInt (_theList, _gb_keys, _sepChar, 1);
+		
+	return 0;
+}
+
+/*---------------------------------------------
+take an AVL of the form [number] = number
+and print it as:
+
+key[_sepChar]+: number (%)
+
+---------------------------------------------*/
+	
+function _printAnAVLNumeric (_theList, _sepChar)
+{
+	_gb_dim   		= Abs(_theList);
+	num_keys		= avlKeysToMatrix (_theList)%0;
+	_gb_keys 		= {_gb_dim,1};
+	for (_gb_idx = 0; _gb_idx < _gb_dim; _gb_idx = _gb_idx + 1)
+	{
+		_gb_keys[_gb_idx] = ""+num_keys[_gb_idx];
+	}
+	
+	_printAnAVLInt (_theList, _gb_keys, _sepChar, 0);
+		
+	return 0;
+}
+
+function _printAnAVLNumericTotal (_theList, _sepChar)
+{
+	_gb_dim   		= Abs(_theList);
+	num_keys		= avlKeysToMatrix (_theList)%0;
+	_gb_keys 		= {_gb_dim,1};
+	for (_gb_idx = 0; _gb_idx < _gb_dim; _gb_idx = _gb_idx + 1)
+	{
+		_gb_keys[_gb_idx] = ""+num_keys[_gb_idx];
+	}
+	
+	_printAnAVLInt (_theList, _gb_keys, _sepChar, 1);
+		
+	return 0;
+}
+
+/*---------------------------------------------*/
+
+function _printAnAVLInt (_theList, _gb_keys, _sepChar, _doTotal)
+{	
+	_gb_dim   		= Abs(_theList);
+	_gb_total 		= 0;
+	_gb_max_key_len = 0;
+	if (_doTotal)
+	{
+		gb_max_key_len = 5;
+	}
+
+	for (_gb_idx = 0; _gb_idx < _gb_dim; _gb_idx = _gb_idx + 1)
+	{
+		_gb_key 		= _gb_keys[_gb_idx];
+		_gb_max_key_len = Max (_gb_max_key_len, Abs(_gb_key));
+		_gb_total 		= _gb_total + _theList[_gb_key];
+	}
+	
+	fprintf (stdout, "\n");
+	for (_gb_idx = 0; _gb_idx < _gb_dim; _gb_idx = _gb_idx + 1)
+	{
+		_gb_key 		= _gb_keys[_gb_idx];
+		fprintf (stdout, _gb_key);
+		for (_gb_idx2 = Abs(_gb_key); _gb_idx2 < _gb_max_key_len; _gb_idx2 = _gb_idx2 + 1)
+		{
+			fprintf (stdout, _sepChar);
+		}
+		fprintf (stdout, ":", Format (_theList[_gb_key],8,0), " (", Format (100*_theList[_gb_key]/_gb_total,5,2), "%)\n");
+	}
+	
+	if (_doTotal)
+	{
+		fprintf (stdout, "Total");
+		for (_gb_idx2 = 5; _gb_idx2 < _gb_max_key_len; _gb_idx2 = _gb_idx2 + 1)
+		{
+			fprintf (stdout, _sepChar);
+		}
+		fprintf (stdout, ":", Format (_gb_total,8,0),"\n");
+	}
+		
+	return 0;
+}
+
+/*---------------------------------------------
+sort a matrix of strings; return a 
+column vector
+---------------------------------------------*/
+function _sortStringsAux (theKey, theValue)
+{
+	for (_gb_idx2 = 0; _gb_idx2 < theValue; _gb_idx2=_gb_idx2+1)
+	{
+		_gb_sortedStrings [_gb_idx] = theKey;
+		_gb_idx = _gb_idx + 1;
+	}
+	return 0;
+}
+
+function _sortStrings (_theList)
+{
+	_gb_dim = Rows (_theList)*Columns (_theList);
+	_toSort = {};
+	for (_gb_idx = 0; _gb_idx < _gb_dim; _gb_idx = _gb_idx + 1)
+	{
+		_toSort[_theList[_gb_idx]] = _toSort[_theList[_gb_idx]]+1;
+	}
+	_gb_sortedStrings = {_gb_dim,1};
+	_gb_idx = 0;
+	_toSort["_sortStringsAux"][""];
+	return _gb_sortedStrings;
+}
+
+/*---------------------------------------------
+construct the frequency vector and a LF mixing componenent for 
+a general discrete distribution on numberOfRates rates
+---------------------------------------------*/
+
+function generate_gdd_freqs (numberOfRates, freqs&, lfMixing&, probPrefix, incrementFlag)
+{
+	freqs    	 = {numberOfRates,1};
+	lfMixing	 = ""; lfMixing * 128; lfMixing * "Log(";
+	
+	if (numberOfRates == 1)
+	{
+		freqs[0] = "1";
+	}
+	else
+	{
+		if (incrementFlag)
+		{
+			mi = numberOfRates-1;
+			ExecuteCommands ("global "+probPrefix+"_"+mi+":<1;"+probPrefix+"_"+mi+"=1/2;");
+			ExecuteCommands ("global "+probPrefix+"_"+mi+":>0;");
+			for (mi=1; mi<numberOfRates-1; mi=mi+1)
+			{
+				ExecuteCommands (""+probPrefix+"_"+mi+" = "+probPrefix+"_"+mi+"*(1-1/numberOfRates);");
+			}
+			
+		}
+		else
+		{
+			for (mi=1; mi<numberOfRates; mi=mi+1)
+			{
+				ExecuteCommands ("global "+probPrefix+"_"+mi+":<1;"+probPrefix+"_"+mi+" = 1/" + (numberOfRates-mi+1));
+				ExecuteCommands ("global "+probPrefix+"_"+mi+":>0;");
+			}
+		}
+		
+		freqs[0] 	 = ""+probPrefix+"_1";
+		for (mi=1; mi<numberOfRates-1; mi=mi+1)
+		{
+			freqs[mi] = "";
+			for (mi2=1;mi2<=mi;mi2=mi2+1)
+			{
+				freqs[mi] = freqs[mi]+"(1-"+probPrefix+"_"+mi2+")";		
+			}
+			freqs[mi] = freqs[mi]+""+probPrefix+"_"+(mi+1);	
+		}	
+	
+		freqs[mi] = "";
+		for (mi2=1;mi2<mi;mi2=mi2+1)
+		{
+			freqs[mi] = freqs[mi]+"(1-"+probPrefix+"_"+mi2+")";		
+		}
+		freqs[mi] = freqs[mi]+"(1-"+probPrefix+"_"+mi+")";	
+	}
+	
+	lfMixing * ("SITE_LIKELIHOOD[0]*"+freqs[0]);
+	for (mi = 1; mi < numberOfRates; mi=mi+1)
+	{
+		lfMixing * ("+SITE_LIKELIHOOD[" + mi + "]*" + freqs[mi]);
+	}
+	lfMixing * ")";
+	lfMixing * 0;
+	return 0;
+}
+
+/*---------------------------------------------
+reverse complement a nucleotide string
+---------------------------------------------*/
+
+_nucleotide_rc = {};
+_nucleotide_rc["A"] = "T";
+_nucleotide_rc["C"] = "G";
+_nucleotide_rc["G"] = "C";
+_nucleotide_rc["T"] = "A";
+_nucleotide_rc["M"] = "K";
+_nucleotide_rc["R"] = "Y";
+_nucleotide_rc["W"] = "W";
+_nucleotide_rc["S"] = "S";
+_nucleotide_rc["Y"] = "R";
+_nucleotide_rc["K"] = "M";
+_nucleotide_rc["B"] = "V";  /* not A */
+_nucleotide_rc["D"] = "H";  /* not C */
+_nucleotide_rc["H"] = "D";  /* not G */
+_nucleotide_rc["V"] = "B";  /* not T */
+_nucleotide_rc["N"] = "N";
+
+function nucleotideReverseComplement (seqIn)
+{
+	_seqOut = "";_seqOut*128;
+	_seqL   = Abs(seqIn);
+	for (_r = _seqL-1; _r >=0 ; _r = _r-1)
+	{
+		_seqOut *_nucleotide_rc[seqIn[_r]];
+	}
+	_seqOut*0;
+	return _seqOut;
+}
+
+/*---------------------------------------------------------------------*/
+
+function RankMatrix (matrix)
+/* take a sorted row matrix and return a rank row matrix averaging ranks for tied values */
+{
+	lastValue				   			 = matrix[0];
+	lastIndex				   			 = 0;
+	matrix							 [0] = 0;
+	
+	sampleCount = Rows (matrix);
+	
+	for (_i = 1; _i < sampleCount; _i = _i+1)
+	{
+		if (lastValue != matrix[_i])
+		{
+			meanIndex = _i - lastIndex;
+			lastValue = matrix[_i];
+			if (meanIndex > 1)
+			{
+				meanIndex = (lastIndex + _i - 1) * meanIndex / (2 * meanIndex);
+				for (_j = lastIndex; _j < _i; _j = _j + 1)
+				{
+					matrix[_j] = meanIndex;
+				}
+			}
+			matrix[_i] = _i;
+			lastIndex = _i;
+		}
+	}
+	
+	meanIndex = _i - lastIndex;
+	if (meanIndex > 1)
+	{
+		meanIndex = (lastIndex + _i - 1) * meanIndex / (2 * meanIndex);
+		for (_j = lastIndex; _j < _i; _j = _j + 1)
+		{
+			matrix[_j] = meanIndex;
+		}
+	}
+	else
+	{
+		matrix[_i-1] = _i - 1;
+	}
+	return matrix;
+}
+
+/*---------------------------------------------------------------------*/
+
+function mapSets (sourceList,targetList)
+// source ID -> target ID (-1 means no correspondence)
+
+{
+	targetIndexing = {};
+	_d = Rows (targetList) * Columns (targetList);
+	
+	for (_i = 0; _i < _d; _i += 1)
+	{
+		targetIndexing [targetList[_i]] = _i + 1;
+	}
+	_d = Rows (sourceList) * Columns (sourceList);
+	mapping 	  = {1,_d};
+	for (_i = 0; _i < _d; _i += 1)
+	{
+		mapping [_i] = targetIndexing[sourceList[_i]] - 1;
+	}
+	
+	return mapping;
+}
+
+/*---------------------------------------------------------------------*/
+
+function mapStrings (sourceStr,targetStr)
+// source ID -> target ID (-1 means no correspondence)
+
+{
+	mapping 	  = {};
+	targetIndexing = {};
+	_d = Abs(targetStr);
+	
+	for (_i = 0; _i < _d; _i += 1)
+	{
+		targetIndexing [targetStr[_i]] = _i + 1;
+	}
+	_d = Abs (sourceStr);
+	for (_i = 0; _i < _d; _i += 1)
+	{
+		mapping [_i] = targetIndexing[sourceStr[_i]] - 1;
+	}
+	
+	return mapping;
+}
+/*---------------------------------------------------------------------*/
+
+function remapSequenceCoordinatesToReference (ref,seq)
+{
+	_seqLen	  = Abs(seq);
+	_coordMap = {_seqLen,1}["-1"];
+			
+	_k				= (ref$"^\\-+");
+	_referenceSpan	= _k[1]+1;
+	
+	for (_k = 0; _k < _referenceSpan; _k += 1) {
+		_coordMap[_k] = 0;
+	}
+	
+	_qryCoord = _k;
+	_refCoord = 0;
+
+	while (_k < Abs(seq)) {
+		if (seq[_k] != "-") {
+			_coordMap[_qryCoord] = _refCoord;
+			_qryCoord += 1;
+		}
+		if (ref[_k] != "-") {
+			_refCoord += 1;
+		}
+		_k += 1;
+	}
+	return _coordMap;
+}
+
+/*---------------------------------------------------------------------*/
+
+function runModule (module,options,suppressStdout)
+{
+	if (suppressStdout)
+	{
+		_gfr = GLOBAL_FPRINTF_REDIRECT;
+		GLOBAL_FPRINTF_REDIRECT = "/dev/null";
+	}
+	LoadFunctionLibrary (module,options);
+	if (suppressStdout)
+	{
+		GLOBAL_FPRINTF_REDIRECT = _gfr;
+	}
+}
+
+/*---------------------------------------------------------------------*/
+
+function _formatTimeString (secondCount)
+{
+	_hours = secondCount $3600;
+	if (_hours < 10)
+	{
+		_timeString = "0"+_hours;
+	}
+	else
+	{
+		_timeString = ""+_hours;
+	}
+	_minutes = (secondCount%3600)$60;
+	if (_minutes < 10)
+	{
+		_timeString = _timeString+":0"+_minutes;
+	}
+	else
+	{
+		_timeString = _timeString+":"+_minutes;
+	}
+	_seconds = (secondCount%60);
+	if (_seconds < 10)
+	{
+		_timeString = _timeString+":0"+_seconds;
+	}
+	else
+	{
+		_timeString = _timeString+":"+_seconds;
+	}
+	return _timeString;
+}	
+
+/*---------------------------------------------------------------------*/
+
+lfunction _constrainVariablesAndDescendants (variable) {
+    GetInformation (allVars, "^" + (variable&&6) + "\\..+$");
+    for (k = 0; k < Columns (allVars); k += 1) {
+        variableID    = allVars[k];
+        current_value = ^variableID;
+        ^variableID := current_value__;
+    }
+    return 0;
+}
+
+/*---------------------------------------------------------------------*/
+
+lfunction _unconstrainVariablesAndDescendants (variable) {
+    GetInformation (allVars, "^" + (variable&&6) + "\\..+$");
+    for (k = 0; k < Columns (allVars); k += 1) {
+        variableID    = allVars[k];
+        ClearConstraints (^variableID);
+    }
+    return 0;
+}
diff --git a/res/TemplateBatchFiles/Utility/HXB2Mapper.bf b/res/TemplateBatchFiles/Utility/HXB2Mapper.bf
new file mode 100644
index 0000000..4c18c75
--- /dev/null
+++ b/res/TemplateBatchFiles/Utility/HXB2Mapper.bf
@@ -0,0 +1,421 @@
+skipCodeSelectionStep = 1;
+ExecuteAFile			("../TemplateModels/chooseGeneticCode.def");
+ApplyGeneticCodeTable  (0);
+
+_HXB_env_offset					= 6224;
+
+/* based on 
+http://www.uniprot.org/uniprot/P04578
+*/
+
+
+_HXB_aa_offsets					= 
+							    { "signal"	:0,
+							      "c1"      :31,
+								  "v1"		:130,
+								  "v2"		:156,
+								  "c2"		:196,
+								  "v3"		:295,
+								  "c3"		:330,
+								  "v4"		:384,
+								  "c4"		:418,
+								  "v5"		:460,
+								  "c5"      :471,
+								  "fusion"  :511,
+								  "gp41ecto":532,
+								  "mper"    :661,
+								  "gp41endo":683
+								};
+
+_HXB_env_region_name            = {{"signal","c1","v1","v2","c2","v3","c3","v4","c4","v5", "c5", "fusion", "gp41ecto", "mper", "gp41endo"}};
+_HXB_aa_offset_matrix			= {{0,31,130,156,196,295,330,384,418,460,471,511,532,661,683,856}};
+_HXB_env_upperbound             = _HXB_aa_offset_matrix [{{0,1}}][{{0,Columns(_HXB_env_region_name)}}];
+								  
+_HXB_Annotation = {};
+
+for (_k = 0; _k < Columns (_HXB_env_region_name); _k += 1) {
+    _rn = _HXB_env_region_name[_k];
+    _HXB_Annotation [_rn] = {1,2};
+    (_HXB_Annotation [_rn])[0] = _HXB_env_offset+ _HXB_aa_offset_matrix[_k]*3;
+    (_HXB_Annotation [_rn])[1] = _HXB_env_offset+ _HXB_aa_offset_matrix[_k+1]*3-1;
+}
+
+
+
+_HXB2_Sequence_					= "TGGAAGGGCTAATTCACTCCCAACGAAGACAAGATATCCTTGATCTGTGGATCTACCACACACAAGGCTACTTCCCTGATTAGCAGAACTACACACCAGGGCCAGGGATCAGATATCCACTGACCTTTGGATGGTGCTACAAGCTAGTACCAGTTGAGCCAGAGAAGTTAGAAGAAGCCAACAAAGGAGAGAACACCAGCTTGTTACACCCTGTGAGCCTGCATGGAATGGATGACCCGGAGAGAGAAGTGTTAGAGTGGAGGTTTGACAGCCGCCTAGCATTTCATCACATGGCCCGAGAGCTGCATCCGGAGTACTTCAAGAACTGCTGACATCGAGCTTGCTACAAGGGACTTTCCGCTGGGGACTTTCCAGGGAGGCGTGGCCTGGGCGGGACTGGGGAGTGGCGAGCCCTCAGATCCTGCATATAAGCAGCTGCTTTTTGCCTGTACTGGGTCTCTCTGGTTAG [...]
+_HXB2_Env_Sequence_				= _HXB2_Sequence_ [_HXB_env_offset][_HXB_env_offset+2567];
+
+_HXB2_AA_						= translateCodonToAA (_HXB2_Sequence_,defineCodonToAA(),2);
+_HXB2_AA_ENV_					= translateCodonToAA (_HXB2_Env_Sequence_,defineCodonToAA(),0);
+
+_hxb_alignOptions_nuc = {};
+_hxb_alignOptions_nuc ["SEQ_ALIGN_CHARACTER_MAP"]="ACGT";
+_hxb_alignOptions_nuc ["SEQ_ALIGN_SCORE_MATRIX"] = 	{
+{5,-4,-4,-4}
+{-4,5,-4,-4}
+{-4,-4,5,-4}
+{-4,-4,-4,5}
+};
+_hxb_alignOptions_nuc ["SEQ_ALIGN_GAP_OPEN"]	= 	50;
+_hxb_alignOptions_nuc ["SEQ_ALIGN_GAP_OPEN2"]	= 	50;
+_hxb_alignOptions_nuc ["SEQ_ALIGN_GAP_EXTEND"]	= 	1;
+_hxb_alignOptions_nuc ["SEQ_ALIGN_GAP_EXTEND2"]	= 	1;
+_hxb_alignOptions_nuc ["SEQ_ALIGN_AFFINE"]		=   1;
+_hxb_alignOptions_nuc ["SEQ_ALIGN_NO_TP"]		=   1;
+
+
+LoadFunctionLibrary ("SeqAlignShared", {"00": "HIV 5%", "01": "No penalty", "02": "First in file" });
+
+_hxb_alignOptions_prot = alignOptions;
+
+scoreMatrix = _hxb_alignOptions_prot ["SEQ_ALIGN_SCORE_MATRIX"];
+LoadFunctionLibrary ("SeqAlignmentCodonShared", {"00": "HIV 25%", "01": "No penalty", "02": "First in file" });
+_hxb_alignOptions_codon = alignOptions;
+
+
+/*-------------------------------------------------------------*/
+function mapSequenceToHXB2 (seq,option)
+/* 
+	option 0 - nucleotide alignment
+    option 1 - amino-acid alignment
+    option 2 - codon alignment
+*/
+{
+ 	if (option == 1)
+ 	{
+		return mapSequenceToHXB2Aux (seq, _HXB2_AA_, option);
+ 	}
+	return mapSequenceToHXB2Aux (seq, _HXB2_Sequence_, option);
+}
+
+/*-------------------------------------------------------------*/
+function mapSequenceToHXB2Aux (seq,ref,option)
+/* 
+	option 0 - nucleotide alignment
+    option 1 - amino-acid alignment
+    option 2 - codon alignment
+*/
+{
+	_seqLen	  = Abs(seq);
+	_coordMap = {_seqLen,1};
+	
+	if (option != 1)
+	{
+		_inStr 		 = {{ref,seq}};
+        if (option == 0)
+        {
+            AlignSequences(aligned, _inStr, _hxb_alignOptions_nuc);
+        }
+        else
+        {
+             AlignSequences(aligned, _inStr, _hxb_alignOptions_codon);
+        }
+    }
+	else
+	{
+		_inStr 		 = {{ref,seq}};
+		AlignSequences(aligned, _inStr, _hxb_alignOptions_prot);
+	
+	}
+	
+	_alignedHXB  = (aligned[0])[1];
+	_alignedQRY  = (aligned[0])[2];
+	
+	_k				= (_alignedHXB$"^\\-+");
+	_referenceSpan	= _k[1]+1;
+	
+	for (_k = 0; _k < _referenceSpan; _k = _k+1)
+	{
+		_coordMap[_k] = 0;
+	}
+	
+	_qryCoord = _k;
+	_refCoord = 0;
+
+	while (_k < Abs(_alignedQRY))
+	{
+		if (_alignedQRY[_k] != "-")
+		{
+			_coordMap[_qryCoord] = _refCoord;
+			_qryCoord = _qryCoord + 1;
+		}
+		if (_alignedHXB[_k] != "-")
+		{
+			_refCoord = _refCoord + 1;
+		}
+		_k = _k+1;
+	}
+	return _coordMap;
+}
+
+/*-------------------------------------------------------------*/
+function selectHXB2subsequenceAux (seq,theSubset,mode)
+{
+    _template = {1,Abs(_HXB2_Sequence_)};
+	_k2		 = Rows(theSubset)*Columns(theSubset);
+	for (_k = 0; _k < _k2; _k = _k+1)
+	{
+		_span = _HXB_Annotation[theSubset[_k]];
+		if (Abs(_span))
+		{
+			_template += _template["_MATRIX_ELEMENT_COLUMN_>=_span[0]&&_MATRIX_ELEMENT_COLUMN_<=_span[1]"];
+		}
+	}
+	_mappedReference = mapSequenceToHXB2 (seq,0+2*mode);
+	_subset			 = ""; _subset * 256;
+	_k2 = Rows(_mappedReference);
+	_k4 = Columns (_template);
+	
+    for (_k = 0; _k < _k2; _k = _k+1)
+	{
+		_k3 = _mappedReference[_k];
+		if (_k3 >= _k4)
+		{
+			break;
+		}
+		if (_template[_k3])
+		{
+			_subset * seq[_k];
+		}
+	}
+    
+	_subset * 0;
+	return _subset;
+
+}
+
+/*-------------------------------------------------------------*/
+function selectHXB2subsequence (seq,theSubset)
+{
+    return selectHXB2subsequenceAux(seq,theSubset,0);
+}
+
+/*-------------------------------------------------------------*/
+function selectHXB2subsequenceCodon (seq,theSubset)
+{
+    return selectHXB2subsequenceAux(seq,theSubset,1);
+}
+
+//--------------------------------------------------------------------------------
+
+function		isoElectricPoint (seq) {
+	COUNT_GAPS_IN_FREQUENCIES = 0;
+	
+	DataSet 			protSeq = ReadFromString ("$BASESET:BASE20\n>1\n" + seq);
+	DataSetFilter		protFil = CreateFilter	 (protSeq,1);
+	
+	HarvestFrequencies (freqs,protFil,1,1,1);
+	
+	freqs = freqs*protFil.sites;
+	
+	expression = ""  + freqs[6 ] + "/(1+10^(pH-6.04))"  + /* H */
+				 "+" + freqs[8 ] + "/(1+10^(pH-10.54))" + /* K */
+				 "+" + freqs[14] + "/(1+10^(pH-12.48))" + /* R */
+				 
+				 "-" + freqs[2 ] + "/(1+10^(3.9-pH))"   + /* D */
+				 "-" + freqs[3 ] + "/(1+10^(4.07-pH))"   + /* E */
+				 "-" + freqs[1 ] + "/(1+10^(8.18-pH))"   + /* C */
+				 "-" + freqs[19] + "/(1+10^(10.46-pH))"   ; /* Y */
+	
+	pH :> 0;
+	pH :< 14;
+	pH = 6.5;
+	
+
+	ExecuteCommands ("function ComputePI (pH){ return -Abs(`expression`); }");
+	Optimize 		(res, ComputePI(pH));
+		
+	return res[0][0];
+}
+
+
+//--------------------------------------------------------------------------------
+
+lfunction		countPNGS		(seq){
+    pngs = seq || "N\\-*[^P]\\-*[ST]\\-*[^P]";
+	return Rows(pngs)/2 - (pngs[0] < 0) ;
+}
+
+/*-------------------------------------------------------------*/
+function partitionENVsequence (seq, nucOrAA) {
+
+
+    if (nucOrAA != 1) {
+		_mappedReference = mapSequenceToHXB2Aux (seq,_HXB2_Env_Sequence_,nucOrAA);
+		_binned_regions = _HXB_env_upperbound * 3;
+	}
+	else {
+		_mappedReference = mapSequenceToHXB2Aux (seq,_HXB2_AA_ENV_,nucOrAA);
+		_binned_regions = _HXB_env_upperbound;
+	}
+	
+	_allPartitions       = Columns (_HXB_env_region_name);
+	_currentIndex        = 0;
+	_upperBound          = _binned_regions[_currentIndex];
+	_mappedLength        = Rows (_mappedReference);
+	_splitSequence       = {};
+	
+    for (_currentIndex = 0; _currentIndex < _mappedLength; _currentIndex+=1) {
+        if (_mappedReference[_currentIndex] > 0) {
+           if (_currentIndex > 0) {
+                _currentIndex += (-1);
+           }
+           break;
+        }
+    }
+	
+	for (_currentPartition    = 0; _currentPartition < _allPartitions; _currentPartition += 1) {
+	    _segmentName = _HXB_env_region_name[_currentPartition];
+	    _splitSequence [_segmentName] = "";
+	    _splitSequence [_segmentName] * 128;
+	}
+	_currentPartition = 0;
+	
+	while (_currentPartition < _allPartitions && _currentIndex < _mappedLength) {
+	    if (_mappedReference[_currentIndex] >= _upperBound && _currentPartition < _allPartitions - 1) {
+	        _currentPartition += 1;
+	        _upperBound          = _binned_regions[_currentPartition];
+	    } 
+	    _splitSequence [_HXB_env_region_name[_currentPartition]] * seq[_currentIndex];
+	    _currentIndex += 1;
+	}
+
+	for (_currentPartition    = 0; _currentPartition < _allPartitions; _currentPartition += 1) {
+        _splitSequence [_HXB_env_region_name[_currentPartition]] * 0;
+	}	
+		
+		
+		
+	return _splitSequence;
+}
+
+/*-------------------------------------------------------------*/
+function selectHXB2ENVsubsequence (seq,theSubset, nucOrAA) {
+	if (nucOrAA != 1)
+	{
+		_template = {1,Abs(_HXB2_Env_Sequence_)};
+	}
+	else
+	{
+		_template = {1,Abs(_HXB2_AA_ENV_)};	
+	}
+	
+	_k2		  = Rows(theSubset)*Columns(theSubset);
+	for (_k = 0; _k < _k2; _k = _k+1)
+	{
+		_span = _HXB_Annotation[theSubset[_k]] + (- _HXB_env_offset);
+		
+		if (Abs(_span))
+		{
+			if (nucOrAA == 0)
+			{
+				_template += _template["_MATRIX_ELEMENT_COLUMN_>=_span[0]&&_MATRIX_ELEMENT_COLUMN_<=_span[1]"];
+			}
+			else
+			{
+				_template += _template["_MATRIX_ELEMENT_COLUMN_>=_span[0]$3&&_MATRIX_ELEMENT_COLUMN_<=_span[1]$3"];			
+			}
+		}
+	}
+		
+		
+    if (nucOrAA != 1)
+    {
+        _mappedReference = mapSequenceToHXB2Aux (seq,_HXB2_Env_Sequence_,nucOrAA);
+    }
+    else
+    {
+        _mappedReference = mapSequenceToHXB2Aux (seq,_HXB2_AA_ENV_,nucOrAA);
+    }
+	
+	_subset			 = ""; _subset * 256;
+	
+	_k2 = Rows(_mappedReference);
+	_k4 = Columns (_template);
+	for (_k = 0; _k < _k2; _k = _k+1)
+	{
+		_k3 = _mappedReference[_k];
+		if (_k3 >= _k4)
+		{
+			break;
+		}
+		if (_template[_k3])
+		{
+			_subset * seq[_k];
+		}
+	}
+
+	_subset * 0;
+	return _subset;
+}
+
+
+/*-------------------------------------------------------------*/
+function fractionalHXB2map (seq)
+{
+	_inStr 		 = {{_HXB2_AA_ENV_,seq}};
+	
+	AlignSequences(aligned, _inStr, _hxb_alignOptions_prot);
+	
+		
+	_alignedHXB  = (aligned[0])[1];
+	_alignedQRY  = (aligned[0])[2];
+	
+	_seqLen	  = Abs(seq);
+	_coordMap = {_seqLen,1};
+	
+	
+	_currentRegionHXBSpan	= 0;
+	_currentRegionIndex		= 1;
+	
+	_currentHXB2Index		= 0;
+	_currentQRYIndex		= 0;
+	_k2						= Abs (_alignedHXB);
+	
+	for (_k = 0; _k < _k2; _k+=1)
+	{
+	
+		//fprintf (stdout, _k, ":", _currentHXB2Index,_alignedHXB[_k], "|",  _alignedQRY[_k], _currentQRYIndex,  "\n");
+			
+		if (_alignedHXB[_k] != "-")
+		{
+			_currentHXB2Index += 1;
+		}
+		if (_alignedQRY[_k] != "-")
+		{
+			_currentQRYIndex += 1;
+		}
+		
+		if (_currentHXB2Index == _HXB_aa_offset_matrix [_currentRegionIndex])
+		{
+		
+			_qrySpan			 = _currentQRYIndex - _lastQRYRegion;
+			_hxbSpan			 = _HXB_aa_offset_matrix [_currentRegionIndex] - _HXB_aa_offset_matrix [_currentRegionIndex-1];
+			_scaler				 = (_hxbSpan-1)/(_qrySpan-1);
+			_hxbSpan			 = _HXB_aa_offset_matrix [_currentRegionIndex-1];
+			//fprintf (stdout, "In offset ",_currentRegionIndex,"\n", _scaler, ":", _hxbSpan, ":", _currentQRYIndex, ":", _lastQRYRegion, "\n");
+			
+			_currentRegionIndex += 1;	
+			if (_currentRegionIndex == Columns(_HXB_aa_offset_matrix))
+			{
+				_k				 = _k2;
+				_currentQRYIndex = Abs(seq);
+			}
+			
+			for (_k3 = _lastQRYRegion; _k3 < _currentQRYIndex; _k3 += 1)
+			{
+				_coordMap [_k3] = _hxbSpan + (_k3-_lastQRYRegion) * _scaler;
+				//fprintf (stdout, "\t", _k3, ":", _coordMap [_k3], "\n");
+			}
+			
+			
+			_lastQRYRegion       = _currentQRYIndex;
+		}
+
+	}
+	
+	return _coordMap;
+}
+
+
+
diff --git a/res/TemplateBatchFiles/Utility/LocalMGREV.bf b/res/TemplateBatchFiles/Utility/LocalMGREV.bf
new file mode 100644
index 0000000..0d438ce
--- /dev/null
+++ b/res/TemplateBatchFiles/Utility/LocalMGREV.bf
@@ -0,0 +1,141 @@
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+
+function BuildCodonFrequencies (obsF)
+{
+	PIStop = 1.0;
+	result = {ModelMatrixDimension,1};
+	hshift = 0;
+
+	for (h=0; h<64; h=h+1)
+	{
+		first = h$16;
+		second = h%16$4;
+		third = h%4;
+		if (_Genetic_Code[h]==10) 
+		{
+			hshift = hshift+1;
+			PIStop = PIStop-obsF[first][0]*obsF[second][1]*obsF[third][2];
+			continue; 
+		}
+		result[h-hshift][0]=obsF[first][0]*obsF[second][1]*obsF[third][2];
+	}
+	return result*(1.0/PIStop);
+}
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+global AC = 1;
+global AT = 1;
+global CG = 1;
+global CT = 1;
+global GT = 1;
+
+MGCustomRateBiasTerms = {{"AC*","","AT*","CG*","CT*","GT*"}};	
+
+_nucBiasTerms = {4,4};
+_nucBiasTerms[0][0] = "";
+
+hv = 0;
+
+for (h=0; h<4; h=h+1)
+{
+	for (v=h+1; v<4; v=v+1)
+	{
+		_nucBiasTerms[h][v] = MGCustomRateBiasTerms[hv];
+		_nucBiasTerms[v][h] = MGCustomRateBiasTerms[hv];
+		hv = hv + 1;	
+	}
+}
+
+h=0;
+v=0;
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function PopulateModelMatrix (ModelMatrixName&, EFV)
+{
+	if (!ModelMatrixDimension)
+	{
+		ModelMatrixDimension = 64;
+		for (h = 0 ;h<64; h=h+1)
+		{
+			if (_Genetic_Code[h]==10)
+			{
+				ModelMatrixDimension = ModelMatrixDimension-1;
+			}
+		}
+	}
+	
+	ModelMatrixName = {ModelMatrixDimension,ModelMatrixDimension}; 
+
+	hshift = 0;
+	
+	modelDefString = "";
+	modelDefString*16384;
+	
+	catCounterAL = {};
+	
+	for (h=0; h<64; h=h+1)
+	{
+		if (_Genetic_Code[h]==10) 
+		{
+			hshift = hshift+1;
+			continue; 
+		}
+		vshift = hshift;
+		for (v = h+1; v<64; v=v+1)
+		{
+			diff = v-h;
+			if (_Genetic_Code[v]==10) 
+			{
+				vshift = vshift+1;
+				continue; 
+			}
+			nucPosInCodon = 2;
+			if ((h$4==v$4)||((diff%4==0)&&(h$16==v$16))||(diff%16==0))
+			{
+				if (h$4==v$4)
+				{
+					transition = v%4;
+					transition2= h%4;
+				}
+				else
+				{
+					if(diff%16==0)
+					{
+						transition = v$16;
+						transition2= h$16;
+						nucPosInCodon = 0;
+					}
+					else
+					{
+						transition = v%16$4;
+						transition2= h%16$4;
+						nucPosInCodon = 1;
+					}
+				}
+				hs = Format(h-hshift,0,0);
+				vs = Format(v-vshift,0,0);
+				ts = Format(transition,0,0);
+				ts2= Format(transition2,0,0);
+				ps = Format(nucPosInCodon,0,0);
+				aa1 = _Genetic_Code[0][h];
+				aa2 = _Genetic_Code[0][v];
+				if (aa1==aa2) 
+				{
+					modelDefString*("ModelMatrixName["+hs+"]["+vs+"] := "+_nucBiasTerms[transition][transition2]+"synRate*EFV__["+ts+"]["+ps+"];\n"+
+													 "ModelMatrixName["+vs+"]["+hs+"] := "+_nucBiasTerms[transition][transition2]+"synRate*EFV__["+ts2+"]["+ps+"];\n");
+				}
+				else
+				{
+					modelDefString*("ModelMatrixName["+hs+"]["+vs+"] := "+_nucBiasTerms[transition][transition2]+"nonSynRate*EFV__["+ts+"]["+ps+"];\n"+
+													 "ModelMatrixName["+vs+"]["+hs+"] := "+_nucBiasTerms[transition][transition2]+"nonSynRate*EFV__["+ts2+"]["+ps+"];\n");	
+				}
+			}
+	    }
+    }		
+	modelDefString*0;
+	ExecuteCommands (modelDefString);
+	return 0;
+}
diff --git a/res/TemplateBatchFiles/Utility/LocalMGREVMLFreqs.bf b/res/TemplateBatchFiles/Utility/LocalMGREVMLFreqs.bf
new file mode 100644
index 0000000..7101eb6
--- /dev/null
+++ b/res/TemplateBatchFiles/Utility/LocalMGREVMLFreqs.bf
@@ -0,0 +1,233 @@
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function BuildCodonFrequencies (obsF, freqMx&)
+{
+	result = {ModelMatrixDimension,1};
+	hshift = 0;
+	normString = "1";
+
+	for (h=0; h<64; h=h+1)
+	{
+		first = h$16;
+		second = h%16$4;
+		third = h%4;
+		if (_Genetic_Code[h]==10) 
+		{
+			hshift = hshift+1;
+			normString = normString + "-" + obsF[first][0] + "*" + obsF[second][1]+ "*" +obsF[third][2];
+			continue; 
+		}
+		result[h-hshift]=obsF[first][0] + "*" + obsF[second][1]+ "*" +obsF[third][2];
+	}
+	
+	ExecuteCommands ("global _mlFreqNormalizer := " + normString);
+	
+	freqMx = {ModelMatrixDimension,1};
+	
+	hshift = 0;
+	for (h=0; h<64; h=h+1)
+	{
+		first = h$16;
+		second = h%16$4;
+		third = h%4;
+		if (_Genetic_Code[h]==10) 
+		{
+			hshift = hshift+1;
+		}
+		else
+		{
+			ExecuteCommands ("freqMx[h-hshift]:="+result[h-hshift]+"/_mlFreqNormalizer");
+		}
+	}
+	return 0;
+}
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function DefineFrequencyParameters (observedFreq)
+{
+	global AF1:<1;
+	global AF2:<1;
+	global AF3:<1;
+	global C1:<1;
+	global C2:<1;
+	global C3:<1;
+	global G1:<1;
+	global G2:<1;
+	global G3:<1;
+	
+	AF1 = observedFreq[0][0];
+	AF2 = observedFreq[0][1];
+	AF3 = observedFreq[0][2];
+	C1 = observedFreq[1][0]/(1-AF1);
+	C2 = observedFreq[1][1]/(1-AF2);
+	C3 = observedFreq[1][2]/(1-AF3);
+	G1 = observedFreq[2][0]/(1-AF1)/(1-C1);
+	G2 = observedFreq[2][1]/(1-AF2)/(1-C2);
+	G3 = observedFreq[2][2]/(1-AF3)/(1-C3);
+	
+	global CF1 := (1-AF1)*C1;
+	global CF2 := (1-AF2)*C2;
+	global CF3 := (1-AF3)*C3;
+	
+	global GF1 := (1-AF1)*(1-C1)*G1;
+	global GF2 := (1-AF2)*(1-C2)*G2;
+	global GF3 := (1-AF3)*(1-C3)*G3;
+
+	global TF1 := (1-AF1)*(1-C1)*(1-G1);
+	global TF2 := (1-AF2)*(1-C2)*(1-G2);
+	global TF3 := (1-AF3)*(1-C3)*(1-G3);
+
+	return  {{"AF1","AF2","AF3"}
+		     {"CF1","CF2","CF3"}
+		     {"GF1","GF2","GF3"}
+			 {"TF1","TF2","TF3"}};
+
+}
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+if (!USE_LAST_RESULTS)
+{
+	global AC = 1;
+	global AT = 1;
+	global CG = 1;
+	global CT = 1;
+	global GT = 1;
+}
+else
+{
+	global AC;
+	global AT;
+	global CG;
+	global CT;
+	global GT;
+}
+
+MGCustomRateBiasTerms = {{"AC*","","AT*","CG*","CT*","GT*"}};	
+
+_nucBiasTerms = {4,4};
+_nucBiasTerms[0][0] = "";
+
+hv = 0;
+
+for (h=0; h<4; h=h+1)
+{
+	for (v=h+1; v<4; v=v+1)
+	{
+		_nucBiasTerms[h][v] = MGCustomRateBiasTerms[hv];
+		_nucBiasTerms[v][h] = MGCustomRateBiasTerms[hv];
+		hv = hv + 1;	
+	}
+}
+
+h=0;
+v=0;
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function PopulateModelMatrix (ModelMatrixName&, EFV)
+{
+	if (!ModelMatrixDimension)
+	{
+		ModelMatrixDimension = 64 - (_Genetic_Code["_MATRIX_ELEMENT_VALUE_ == 10"]*Transpose(_Genetic_Code["1"]))[0];
+	}
+	
+	_localNucBiasMult = _nucBiasTerms;
+		
+	ModelMatrixName = {ModelMatrixDimension,ModelMatrixDimension}; 
+	
+	if (modelType >= 0)
+	{
+		synCatRateMult 	  = "synRate*";
+		nonsynCatRateMult = "nonSynRate*";
+	
+		if (modelType)
+		{
+			ExecuteCommands ("global R"+_MG94GlobalSuffix+"=1;");
+			nonsynCatRateMult = synCatRateMult + "R"+_MG94GlobalSuffix+"*";
+			if (modelType > 1)
+			{
+				synCatRateMult 	      = synCatRateMult    + "c"+_MG94GlobalSuffix+"*";
+				nonsynCatRateMult 	  = nonsynCatRateMult + "c"+_MG94GlobalSuffix+"*";
+			}
+		}
+	}
+	
+	
+		
+	modelDefString = "";
+	modelDefString*16384;
+	
+	hshift = 0;
+	
+	for (h=0; h<64; h=h+1)
+	{
+		if (_Genetic_Code[h]==10) 
+		{
+			hshift = hshift+1;
+			continue; 
+		}
+		vshift = hshift;
+		for (v = h+1; v<64; v=v+1)
+		{
+			diff = v-h;
+			if (_Genetic_Code[v]==10) 
+			{
+				vshift = vshift+1;
+				continue; 
+			}
+			nucPosInCodon = 2;
+			if ((h$4==v$4)||((diff%4==0)&&(h$16==v$16))||(diff%16==0))
+			{
+				if (h$4==v$4)
+				{
+					transition = v%4;
+					transition2= h%4;
+				}
+				else
+				{
+					if(diff%16==0)
+					{
+						transition = v$16;
+						transition2= h$16;
+						nucPosInCodon = 0;
+					}
+					else
+					{
+						transition = v%16$4;
+						transition2= h%16$4;
+						nucPosInCodon = 1;
+					}
+				}
+				hs = Format(h-hshift,0,0);
+				vs = Format(v-vshift,0,0);
+				ts = Format(transition,0,0);
+				ts2= Format(transition2,0,0);
+				ps = Format(nucPosInCodon,0,0);
+				aa1 = _Genetic_Code[0][h];
+				aa2 = _Genetic_Code[0][v];
+				
+				if (aa1==aa2) 
+				{
+					modelDefString*("ModelMatrixName["+hs+"]["+vs+"] := "+synCatRateMult+_localNucBiasMult[transition][transition2]+EFV[transition][nucPosInCodon]+";\n"+
+													 "ModelMatrixName["+vs+"]["+hs+"] := "+synCatRateMult+_localNucBiasMult[transition][transition2]+EFV[transition2][nucPosInCodon]+";\n");
+				}
+				else
+				{
+					modelDefString*("ModelMatrixName["+hs+"]["+vs+"] := "+nonsynCatRateMult+_localNucBiasMult[transition][transition2]+EFV[transition][nucPosInCodon]+";\n"+
+													 "ModelMatrixName["+vs+"]["+hs+"] := "+nonsynCatRateMult+_localNucBiasMult[transition][transition2]+EFV[transition2][nucPosInCodon]+";\n");						
+				}
+			}
+	    }
+    }		
+	modelDefString*0;
+	ExecuteCommands (modelDefString);
+
+	if (Abs(MGCustomModelConstraintString))
+	{
+		ExecuteCommands (MGCustomModelConstraintString);
+	}
+	return 0;
+}
diff --git a/res/TemplateBatchFiles/Utility/MPITools.bf b/res/TemplateBatchFiles/Utility/MPITools.bf
new file mode 100644
index 0000000..2e91659
--- /dev/null
+++ b/res/TemplateBatchFiles/Utility/MPITools.bf
@@ -0,0 +1,85 @@
+//------------------------------------------------------------------------------------------
+function runAnalysisOnManyFiles (pathList, analysisName, verboseFlag, callbackInput, callbackOutput)
+{
+	assert (MPI_NODE_COUNT > 1, "This analysis requires an MPI environment");
+	_MPI_NODE_STATUS = {MPI_NODE_COUNT-1,1}["-1"]; 
+
+	for (_fileLine = 0; _fileLine < Columns (pathList); _fileLine += 1)
+	{
+		_filePath = pathList[_fileLine];
+		if ((!_filePath) == 0)
+		{
+			if (verboseFlag)
+			{
+				fprintf (stdout, "[MPITools: Warning] Filepath ", pathList[_fileLine], " couldn't be open for reading and will be skipped\n");
+			}
+			continue;
+		}
+		_analysisOptions = Eval("`callbackInput` (_fileLine, pathList[_fileLine])");
+		if (Abs(_analysisOptions) == 0) {
+                        if (verboseFlag)
+                        {
+                                fprintf (stdout, "[MPITools: Warning] Filepath ", pathList[_fileLine], " was marked as cached and will be skipped\n");
+                        }
+			continue;
+		}
+		_SendAnMPIJob   (_fileLine, analysisName, _analysisOptions, callbackOutput,verboseFlag);
+	}
+	
+	_fileLine = +(_MPI_NODE_STATUS["_MATRIX_ELEMENT_VALUE_>=0"]);
+	while (_fileLine > 0)
+	{
+		_ReceiveAnMPIJob (callbackOutput, verboseFlag);
+		_fileLine = _fileLine - 1;
+	}
+
+	return 0;
+}
+
+//------------------------------------------------------------------------------------------
+function _SendAnMPIJob (jobNumber, fileID, options, callbackOutput, verboseFlag)
+{
+	for (_mpiNode = 0; _mpiNode < MPI_NODE_COUNT-1; _mpiNode += 1)
+	{
+		if (_MPI_NODE_STATUS[_mpiNode] < 0)
+		{
+			break;
+		}
+	}
+	if (_mpiNode == MPI_NODE_COUNT-1)
+	{
+		_mpiNode = _ReceiveAnMPIJob (callbackOutput, verboseFlag);
+	}
+	
+	_MPI_NODE_STATUS[_mpiNode] = jobNumber + 1;
+	if (verboseFlag)
+	{
+		fprintf (stdout, "[MPITools] Sending filepath ", pathList[jobNumber], " (ID ", jobNumber+1, ") to node ", _mpiNode+1, "\n");
+	}
+	MPISend (_mpiNode+1,"GLOBAL_FPRINTF_REDIRECT = \"/dev/null\"; LoadFunctionLibrary (\"`fileID`\"," + options + ")");
+	return 0;
+}
+
+//------------------------------------------------------------------------------------------
+function _ReceiveAnMPIJob (callbackOutput, verboseFlag)
+{
+	MPIReceive (-1,fromNode,result);
+	fromNode += (-1);
+	
+	doneID   = _MPI_NODE_STATUS[fromNode]-1;
+	_MPI_NODE_STATUS[fromNode] = -1;
+
+	if (verboseFlag)
+	{
+		fprintf (stdout, "[MPITools] Received filepath ", pathList[doneID], " (ID ", doneID+1, ") from node ", fromNode+1, "\n");
+	}
+	
+	returnAVL = Eval(result);
+	
+	if (Abs(callbackOutput))
+	{
+		ExecuteCommands ("`callbackOutput`(doneID,returnAVL,pathList[doneID])");
+	}
+	
+	return fromNode;
+}
diff --git a/res/TemplateBatchFiles/Utility/NJ.bf b/res/TemplateBatchFiles/Utility/NJ.bf
new file mode 100644
index 0000000..4ab8e4a
--- /dev/null
+++ b/res/TemplateBatchFiles/Utility/NJ.bf
@@ -0,0 +1,253 @@
+/* ________________________________________________________________________________________________*/
+
+
+function InitializeDistances ()
+{
+	HarvestFrequencies (_dNucFreq,filteredData,1,1,0);
+	_d_fR = _dNucFreq[0]+_dNucFreq[2];
+	_d_fY = _dNucFreq[1]+_dNucFreq[3];
+	
+	if (_dNucFreq[0] == 0 || _dNucFreq[1] == 0 || _dNucFreq[2] == 0 || _dNucFreq[3] == 0)
+	{
+		_useK2P = 1;
+	}
+	else
+	{
+		_d_TN_K1 = 2*_dNucFreq[0]*_dNucFreq[2]/_d_fR;
+		_d_TN_K2 = 2*_dNucFreq[1]*_dNucFreq[3]/_d_fY;
+		_d_TN_K3 = 2*(_d_fR*_d_fY-_dNucFreq[0]*_dNucFreq[2]*_d_fY/_d_fR-_dNucFreq[1]*_dNucFreq[3]*_d_fR/_d_fY);
+		_useK2P = 0;
+	}
+	
+	
+
+	return 0;
+}
+
+/* ________________________________________________________________________________________________*/
+
+function ComputeDistanceFormulaFromDiffMx (siteDifferenceCount)
+{
+	totalSitesCompared = +siteDifferenceCount;
+    if (_useK2P)
+    {
+        _dTransitionCounts 	 =    siteDifferenceCount[0][2]+siteDifferenceCount[2][0]  /* A-G and G-A */
+                                 +siteDifferenceCount[1][3]+siteDifferenceCount[3][1]; /* C-T and T-C */
+                            
+        _dTransversionCounts = (siteDifferenceCount[0][0]+siteDifferenceCount[1][1]+siteDifferenceCount[2][2]+siteDifferenceCount[3][3])+_dTransitionCounts;
+        
+        _dTransitionCounts	 = _dTransitionCounts/totalSitesCompared;
+        _dTransversionCounts = 1-_dTransversionCounts/totalSitesCompared;
+        
+        _d1C = 1-2*_dTransitionCounts-_dTransversionCounts;
+        _d2C = 1-2*_dTransversionCounts;
+        
+        if (_d1C>0 && _d2C>0)
+        {
+            return -(0.5*Log(_d1C)+.25*Log(_d2C));	
+        }
+    }
+    else
+    {
+        _dAGCounts 	 =    siteDifferenceCount[0][2]+siteDifferenceCount[2][0]  /* A-G and G-A */;
+        _dCTCounts	 = 	  siteDifferenceCount[1][3]+siteDifferenceCount[3][1]; /* C-T and T-C */
+                            
+        _dTransversionCounts = (siteDifferenceCount[0][0]+siteDifferenceCount[1][1]+siteDifferenceCount[2][2]+
+                                siteDifferenceCount[3][3])+_dAGCounts+_dCTCounts;
+        
+        _dAGCounts	 = _dAGCounts/totalSitesCompared;
+        _dCTCounts	 = _dCTCounts/totalSitesCompared;
+        
+        _dTransversionCounts = 1-_dTransversionCounts/totalSitesCompared;
+        
+        _d1C = 1-_dAGCounts/_d_TN_K1-0.5*_dTransversionCounts/_d_fR;
+        _d2C = 1-_dCTCounts/_d_TN_K2-0.5*_dTransversionCounts/_d_fY;
+        _d3C = 1-0.5*_dTransversionCounts/_d_fY/_d_fR;
+        
+        if ((_d1C>0)&&(_d2C>0)&&(_d3C>0))
+        {
+            return -_d_TN_K1*Log(_d1C)-_d_TN_K2*Log(_d2C)-_d_TN_K3*Log(_d3C);
+        }
+    }
+	return 1000;
+}
+
+/* ________________________________________________________________________________________________*/
+
+function ComputeDistanceFormula (s1,s2)
+{
+	GetDataInfo (siteDifferenceCount, filteredData, s1, s2, DIST);
+	return ComputeDistanceFormulaFromDiffMx(siteDifferenceCount);
+}
+
+/* ________________________________________________________________________________________________*/
+
+function TreeMatrix2TreeStringGen (treeNodes,leafCount,leafNames,doLengths)
+{
+	treeString = "";
+	p = 0;
+	k = 0;
+	m = treeNodes[0][1];
+	n = treeNodes[0][0];
+	treeString*(Rows(treeNodes)*25);
+
+	while (m)
+	{	
+		if (m>p)
+		{
+			if (p)
+			{
+				treeString*",";
+			}
+			for (j=p;j<m;j=j+1)
+			{
+				treeString*"(";
+			}
+		}
+		else
+		{
+			if (m<p)
+			{
+				for (j=m;j<p;j=j+1)
+				{
+					treeString*")";
+				}
+			}	
+			else
+			{
+				treeString*",";
+			}	
+		}
+		if (n<leafCount)
+		{
+			if (Abs(leafNames))
+			{
+				nodeName = ""+leafNames[n];
+			}
+			else
+			{
+				GetString (nodeName, filteredData, n);
+			}
+			treeString*nodeName;
+		}
+		
+		if (doLengths>.5)
+		{
+			nodeName = ":"+treeNodes[k][2];
+			treeString*nodeName;
+		}
+		
+		k=k+1;
+		p=m;
+		n=treeNodes[k][0];
+		m=treeNodes[k][1];
+	}
+
+	for (j=m;j<p;j=j+1)
+	{
+		treeString*")";
+	}
+	
+	treeString*0;
+	return treeString;
+}
+
+/* ________________________________________________________________________________________________*/
+
+function TreeMatrix2TreeString (doLengths)
+{
+	return TreeMatrix2TreeStringGen (treeNodes, filteredData.species, 0, doLengths);
+}
+
+/* ________________________________________________________________________________________________*/
+
+function InferTreeTopologyFromMatrixGen (distanceMatrix, leafNames, distancesFlag)
+{
+	MESSAGE_LOGGING 		 	= 1;
+	cladesMade 					= 1;
+	
+	leafCount= Abs(leafNames);
+	if (leafCount == 0)
+	{
+		leafCount = filteredData.species;
+	}
+
+	if (leafCount== 2)
+	{
+		d1 = distanceMatrix[0][1]/2;
+		treeNodes = {{0,1,d1__},
+					 {1,1,d1__},
+					 {2,0,0}};
+					 
+		cladesInfo = {{2,0}};
+	}
+	else
+	{
+		if (leafCount == 3)
+		{
+			d1 = (distanceMatrix[0][1]+distanceMatrix[0][2]-distanceMatrix[1][2])/2;
+			d2 = (distanceMatrix[0][1]-distanceMatrix[0][2]+distanceMatrix[1][2])/2;
+			d3 = (distanceMatrix[1][2]+distanceMatrix[0][2]-distanceMatrix[0][1])/2;
+			treeNodes = {{0,1,d1__},
+						 {1,1,d2__},
+						 {2,1,d3__}
+						 {3,0,0}};
+						 
+			cladesInfo = {{3,0}};		
+		}
+		else
+		{	
+			njm = (distanceMatrix > methodIndex)>=leafCount;
+				
+			treeNodes 		= {2*(leafCount+1),3};
+			cladesInfo	    = {leafCount-1,2};
+			
+			for (i=Rows(treeNodes)-1; i>=0; i=i-1)
+			{
+				treeNodes[i][0] = njm[i][0];
+				treeNodes[i][1] = njm[i][1];
+				treeNodes[i][2] = njm[i][2];
+			}
+
+			for (i=Rows(cladesInfo)-1; i>=0; i=i-1)
+			{
+				cladesInfo[i][0] = njm[i][3];
+				cladesInfo[i][1] = njm[i][4];
+			}
+			
+			njm = 0;
+		}
+	}
+	
+	distanceMatrix = 0;
+	
+	return TreeMatrix2TreeStringGen (treeNodes, leafCount, leafNames, distancesFlag);
+}
+
+
+/* ________________________________________________________________________________________________*/
+
+function InferTreeTopologyFromMatrix (distancesFlag)
+{
+	return InferTreeTopologyFromMatrixGen (distanceMatrix, 0, distancesFlag);
+}
+
+
+
+/* ________________________________________________________________________________________________*/
+
+function InferTreeTopology(distancesFlag)
+{
+	InitializeDistances ();
+	distanceMatrix = {filteredData.species,filteredData.species};
+		
+	for (i = 0; i<filteredData.species; i=i+1)
+	{
+		for (j = i+1; j<filteredData.species; j = j+1)
+		{
+			distanceMatrix[i][j] = ComputeDistanceFormula (i,j);
+		}
+	}
+
+	return InferTreeTopologyFromMatrix (distancesFlag);
+}
diff --git a/res/TemplateBatchFiles/Utility/PS_Plotters.bf b/res/TemplateBatchFiles/Utility/PS_Plotters.bf
new file mode 100644
index 0000000..53f587b
--- /dev/null
+++ b/res/TemplateBatchFiles/Utility/PS_Plotters.bf
@@ -0,0 +1,1662 @@
+/*--------------------------------------------------------*/
+
+function determineCoordinateTicks (x1,x2) 
+{
+	_range 	   = x2-x1;
+	_log10Tick = Log(_range)/Log(10) /* round to the next smallest integer */
+				 $1;
+				 
+	_log10Tick = Exp(_log10Tick*Log(10));
+	if (_range/_log10Tick < 4)
+	{
+		_log10Tick = _log10Tick / (((4*_log10Tick/_range)+0.5)$1);
+	}
+	return _log10Tick;
+}
+
+
+/*--------------------------------------------------------*/
+
+function boost (value, direction, factor)
+{
+	if (direction)
+	{
+		if (value > 0)
+		{
+			return value*factor;
+		}
+		else
+		{
+			return value/factor;
+		}
+	}
+	
+	if (value > 0)
+	{
+		return value/factor;
+	}
+	else
+	{
+		return value*factor;
+	}
+} 
+/*--------------------------------------------------------*/
+
+function		    xProd (index1, index2, index3)
+{
+	return (pointSet[index2][0]-pointSet[index1][0])*(pointSet[index3][1]-pointSet[index1][1])-
+	       (pointSet[index3][0]-pointSet[index1][0])*(pointSet[index2][1]-pointSet[index1][1]);
+}
+
+
+/*--------------------------------------------------------*/
+
+function ComputeConvexHull (pointSet /* Nx2 matrix with x,y values of points to obtain the convex hull for */
+						   )
+							
+/* returns the AVL of points (indices) to connect to draw a convex hull */
+{
+	points 			= Rows (pointSet);
+	hull_comp       = {points,3};
+		
+	for (c = 0; c < points; c=c+1)
+	{
+		hull_comp[c][0] = pointSet[c][0];
+		hull_comp[c][1] = pointSet[c][1];
+		hull_comp[c][2] = c;
+	}
+	
+	if (points > 2)
+	{
+		/* determine convex hull using Graham scan */
+		hull_comp = hull_comp % 0; /* sort by the x coordinate */
+		/* if there is a tie, adjust the first coordinate a little */
+		if (hull_comp [0][0] == hull_comp[1][0])
+		{
+			hull_comp[0][0] = boost (hull_comp[0][0],0,1.0001);
+		}
+		
+		angles = {points-1,2};
+		for (c = 1; c < points; c=c+1)
+		{
+			angles[c-1][0] = (hull_comp[c][1]-hull_comp[0][1])/(hull_comp[c][0]-hull_comp[0][0]);
+			angles[c-1][1] = hull_comp[c][2];
+		}
+		angles    = angles%0; /* sort on angle */
+		hull      = {};
+		
+		hull [0] = hull_comp[0][2];
+		hull [1] = angles[0][1];
+		
+		for (c=1; c < points-1; c=c+1)
+		{
+			while (Abs(hull) >=2 && xProd (hull[Abs(hull)-2],hull[Abs(hull)-1],angles[c][1]) <= 0)
+			{
+				hull - (Abs(hull)-1);
+			}
+			hull[Abs(hull)] = angles[c][1];
+		}
+		
+		
+		/* check the last point */ 
+		if (xProd (hull[Abs(hull)-2],hull[Abs(hull)-1],hull[0]) <= 0)
+		{
+			hull - (Abs(hull)-1);
+		}
+	
+		hull[Abs(hull)] = hull[0];
+		
+		for (c = 0; c < Abs(hull); c=c+1)
+		{
+			hull [c] = pointSet[hull[c]][2];
+		}
+		return hull;
+	}
+
+	return {};
+}
+
+
+/*--------------------------------------------------------*/
+
+ExecuteAFile  ( "PostScript.bf");
+
+
+function ScatterPlot		 (xy&, 			/* Nx2 matrix with x,y,value points to plot */
+							  xyranges, 	/* 2x2 matrix {{x_min, x_max}{y_min, y_max} 
+							  				   will be adjusted to cover the data in xy if needed*/
+							  fontFace, 	/* font to use for plotting */
+							  plotDim, 		/* 1x3 matrix {{width, height,font_size}} of the plot in points 
+							  				   if embedLabels is 1, then this must be a 1x4 matrix; last entry is the font size 
+							  				   for the embedded labels */
+							  colors, 		/* Nx3 matrix of RGB colors to plot each point with */
+							  shapes, 		/* Nx1 matrix of shapes to plot for each point */
+							  labels,  		/* 1x3 matrix of strings: plot-label, x-axis label, y-axis label
+							                   could also be 1x3 + unique colors in 'colors' to draw a legend
+							  				*/
+							  pointLabels	/* Nx1 matrix of strings with labels for every point */,
+							  embedLabels   /* whether or not to plot points (0) or text labels (1) */,
+							  centroid		/* 2x1 point of the centroid */,
+							  hull			/* Kx1 list of points (indices in 'xy' which must be traversed 
+							  				   counter clock-wise to obtain the convex hull */,
+							  doWrappers    /* should PS prefix and suffix be included */
+							  )
+{
+	
+	
+	psDensityPlot = ""; psDensityPlot*1024;
+	
+	plotHeight = Max (100, plotDim[1]);
+	plotWidth  = Max (100, plotDim[0]);
+	
+	plotOriginX = 4.5*plotDim[2];
+	plotOriginY = 3.5*plotDim[2];
+	
+	xMin		= xyranges[0][0];
+	xMax		= xyranges[0][1];
+	yMin		= xyranges[1][0];
+	yMax		= xyranges[1][1];
+	
+	_x = Rows (xy);
+
+	legendWidth		   = 0;
+	if (Columns (labels) > 3)
+	{
+		/* count unique colors */
+		uniqueColors = {};
+		for (_dataPoint = 0; _dataPoint < _x; _dataPoint = _dataPoint + 1)
+		{
+			if (uniqueColors[colors[_dataPoint][-1]] == 0)
+			{
+				uniqueColors[colors[_dataPoint][-1]] = 1 + Abs (uniqueColors);
+			}
+		}
+		
+		_legendColors = {};
+		
+		for (_dataPoint = 0; _dataPoint <  Abs (uniqueColors); _dataPoint = _dataPoint + 1)
+		{
+			_legendColors [(Rows(uniqueColors))[_dataPoint]]= labels[3+_dataPoint];
+			px = _HYPSGetStringWidth (labels[3+_dataPoint]) * plotDim[2];
+			if (px > legendWitdh)
+			{
+				legendWitdh = px;
+			}
+		}
+		
+		if (legendWitdh)
+		{
+			legendWitdh = legendWitdh + 2*plotDim[2];
+		}		
+	}
+
+	plotSpanX   = plotWidth + 5*plotDim[2] + legendWitdh;
+	plotSpanY	= plotHeight + 4*plotDim[2];
+	
+	if (doWrappers)
+	{
+		psDensityPlot * _HYPSPageHeader (plotSpanX,plotSpanY, "Density Plot");
+		psDensityPlot * "\n";
+		psDensityPlot * _HYPSTextCommands(0);
+	}
+	else
+	{
+		_renderedPlotDimensions = {{plotSpanX__,plotSpanY__}};
+	}
+	
+	psDensityPlot * _HYPSSetFont (fontFace, plotDim[2]);
+	psDensityPlot * "\n";
+	
+	psDensityPlot * "\n 1 setlinewidth 1 setlinecap 0 setlinejoin 0 0 0 setrgbcolor";
+	psDensityPlot * ("\n " + plotOriginX + " " + plotOriginY + " " + plotWidth + " " + plotHeight + " rectstroke\n");
+	
+	/* adjust data ranges if necessary */
+	for (_dataPoint = 0; _dataPoint < _x; _dataPoint = _dataPoint + 1)
+	{
+		xMin = Min(xMin,xy[_dataPoint][0]);
+		xMax = Max(xMax,xy[_dataPoint][0]);
+		yMin = Min(yMin,xy[_dataPoint][1]);
+		yMax = Max(yMax,xy[_dataPoint][1]);
+	}
+	
+	xMin = boost(xMin,0,1.1);
+	yMin = boost(yMin,0,1.1);
+	xMax = boost(xMax,1,1.1);
+	yMax = boost(yMax,1,1.1);
+	
+	diff = (yMax-yMin) - (xMax-xMin);
+	if (diff > 0)
+	{
+		xMin = xMin - diff/2;
+		xMax = xMax + diff/2;
+	}
+	else
+	{
+		yMin = yMin + diff/2;
+		yMax = yMax - diff/2;
+	}
+	
+	px = plotWidth /(xMax-xMin);
+	py = plotHeight/(yMax-yMin);
+	
+
+	
+	_hullSize = Abs(hull);
+	if (_hullSize>=1)
+	{
+		if (Type(hull[0]) != "AssociativeList")
+		{
+			hull = {"0":hull};	
+		}
+	
+		psDensityPlot * ("0.5 0.5 0.5 setrgbcolor\n[3] 0 setdash\n");
+		for (_i = 0; _i < Abs(hull); _i = _i + 1)
+		{
+			_hullSize = Abs (hull[_i]);
+			
+			for (_dataPoint = 1; _dataPoint < _hullSize; _dataPoint = _dataPoint + 1)
+			{
+				psDensityPlot * ("newpath " + (plotOriginX+(xy[(hull[_i])[_dataPoint-1]][0]-xMin)*px) + " " 
+											+ (plotOriginY+(xy[(hull[_i])[_dataPoint-1]][1]-yMin)*py) + " moveto "
+											+ (plotOriginX+(xy[(hull[_i])[_dataPoint]][0]-xMin)*px) + " " 
+											+ (plotOriginY+(xy[(hull[_i])[_dataPoint]][1]-yMin)*py) 
+											+ " lineto stroke\n");
+			
+			}
+		}
+		psDensityPlot * ("0 0 0 setrgbcolor\n[] 0 setdash\n");
+	}
+
+	if (embedLabels)
+	{			
+		psDensityPlot * _HYPSSetFont ("Helvetica", plotDim[3]);
+		
+		for (_dataPoint = 0; _dataPoint < _x; _dataPoint = _dataPoint + 1)
+		{
+			psDensityPlot * (""+ colors[_dataPoint][0] + " " + colors[_dataPoint][1] + " " + colors[_dataPoint][2] + " setrgbcolor\n");
+
+			aLabel = pointLabels[_dataPoint];
+			aLabel = aLabel ^ {{"\\(","\("}};
+			aLabel = aLabel ^ {{"\\)","\)"}};
+			psDensityPlot * ("newpath " + (plotOriginX+(xy[_dataPoint][0]-xMin)*px) + " " 
+										+ (plotOriginY+(xy[_dataPoint][1]-yMin)*py) + " moveto (" 
+										+ aLabel + ") show\n");
+			
+			
+		
+		}
+
+		psDensityPlot * _HYPSSetFont ("Times-Roman", plotDim[2]);
+	}
+	else
+	{
+		for (_dataPoint = 0; _dataPoint < _x; _dataPoint = _dataPoint + 1)
+		{
+			psDensityPlot * (""+ colors[_dataPoint][0] + " " + colors[_dataPoint][1] + " " + colors[_dataPoint][2] + " setrgbcolor\n");
+			myX_coord = plotOriginX+(xy[_dataPoint][0]-xMin)*px;
+			myY_coord = plotOriginY+(xy[_dataPoint][1]-yMin)*py;
+			
+			if (Abs(shapes))
+			{
+				psDensityPlot * ("newpath " + (myX_coord) + " " 
+											+ (myY_coord) + " " 
+											+ shapes[_dataPoint] + "\n");
+			}
+			else
+			{
+				
+				psDensityPlot * ("newpath " + (myX_coord) + " " 
+											+ (myY_coord) + " " 
+											+ "3 0 360 arc fill\n");
+			}										
+		}	
+	}
+	
+
+	if (Rows(centroid))
+	{
+		psDensityPlot * ("\n 0.75 0.75 0.75 setrgbcolor " + (plotOriginX+px*(centroid[0]-xMin)) + " " + (plotOriginX+py*(centroid[1]-yMin)) + " 8 0 360 arc fill\n");
+		psDensityPlot * ("\n 0.25 0.25 0.25 setrgbcolor " + (plotOriginX+px*(centroid[0]-xMin)) + " " + (plotOriginX+py*(centroid[1]-yMin)) + " 8 0 360 arc stroke\n");
+	}
+
+	xscaler = determineCoordinateTicks (xMin,xMax);
+	_x	= ((xMin/xscaler)$1)*xscaler;
+	psDensityPlot * ("0 0 0 setrgbcolor\n");
+	while (_x < xMax)
+	{
+		xStep = (plotOriginX + px*(_x-xMin));
+		psDensityPlot * ("" +  xStep + " " + (2.5*plotDim[2]) + " (" + Format(_x,4,2) + ") centertext\n");  
+		psDensityPlot * ("" +  xStep + " " + (plotOriginY+0.25*plotDim[2]) + " moveto 0 "
+							+ (-0.25*plotDim[2]) +" rlineto stroke\n");  
+		_x = _x + xscaler;
+	}
+	
+	
+	yscaler = determineCoordinateTicks (yMin,yMax);
+	_y	= ((yMin/yscaler)$1)*yscaler;
+	while (_y < yMax)
+	{
+		yStep = (plotOriginY + py*(_y-yMin));
+		psDensityPlot * ("" +  (4*plotDim[2]) + " " + yStep + " (" + Format(_y,4,2) + ") righttext\n");  
+		psDensityPlot * ("" +  plotOriginX    + " " + yStep + " moveto "+(0.25*plotDim[2]) +" 0 rlineto stroke\n");  
+		_y = _y + yscaler;
+	}
+
+	psDensityPlot * ("" + (plotOriginX+plotWidth/2) + " " + (0.5*plotDim[2]) +" (" + labels[1] + ") centertext\n");
+	psDensityPlot * ("" + (plotOriginY+plotHeight/2) + " " + (-1.5*plotDim[2]) +" ("+ labels[2] + ") vcentertext\n");	
+
+
+	if (legendWitdh)
+	{
+		yLoc = plotOriginY + plotHeight - 1.5*plotDim[2];
+		xLoc = plotOriginX + plotWidth  + 0.5*plotDim[2];
+
+		_colors = Rows (_legendColors);
+		
+		for (_segment = 0; _segment < Abs(_legendColors); _segment = _segment + 1)
+		{
+				
+			ExecuteCommands ("_thisColor = " + _colors[_segment] +";");
+			
+			psDensityPlot * ("" + _thisColor[_segment][0] + " " + _thisColor[_segment][1] + " " + _thisColor[_segment][2] + " setrgbcolor\n");
+			psDensityPlot * ("newpath " + xLoc + " " 
+									+ yLoc + " " 
+									+ plotDim[2] + " " 
+									+ plotDim[2] + " " 
+									+ " rectfill\n");
+			psDensityPlot * ("0 0 0 setrgbcolor\n");
+			psDensityPlot * ("newpath " + xLoc + " " 
+									+ yLoc + " " 
+									+ plotDim[2] + " " 
+									+ plotDim[2] + " " 
+									+ " rectstroke\n");
+									
+			psDensityPlot * ("newpath " + (xLoc + plotDim[2]*1.5) + " " + (yLoc+plotDim[2]/6) + " moveto (" + _legendColors[_colors[_segment]] + ") show stroke\n");
+
+			yLoc = yLoc - plotDim[2] * 1.5;
+			
+		}
+	}
+	
+	if (doWrappers)
+	{
+		psDensityPlot * "\nshowpage\n";
+	}
+	psDensityPlot * 0;
+	
+	return psDensityPlot;
+}
+
+/*--------------------------------------------------------------------------------------------------------------------------*/
+
+function PSHistogram			(x,				 /* the observations to histogram */
+								bins,			/* how many bins? <=1 to auto-detect; Freedman�Diaconis */
+								mode,			/* if 0, plot bin counts; if 1, plot bin weights */
+								fontFace,		/* use this font */
+								plotDim, 		/* 1x3 matrix {{width, height,font_size}} of the plot in points 
+											*/
+								colors, 		/* a 1x3 matrix of RGB colors to plot each bar with */
+								labels,  		/* 3x1 matrix of strings: plot-label, x-axis label, y-axis label*/
+							 	doWrappers,   /* should PS prefix and suffix be included */
+							)
+{
+	observationCount = Rows (x) * Columns (x);
+	if (observationCount > 0)
+	{
+		if (Columns (x) != 1)
+		{
+			bins = {observationCount,1};
+			for (_x = 0; _x < observationCount; _x = _x+1)
+			{
+				bins [_x] = x [_x]; 
+			}
+			x = bins;
+		}
+		x = x % 0;
+		
+		x_min   = x[0];
+		x_range = x[observationCount-1]-x_min;
+		
+		if (bins < 1)
+		{
+			x_step = 2*(x[Min(observationCount*3$4+1,observationCount-1)]-x[observationCount$4])/observationCount^(1/3);
+			if (x_step == 0)
+			{
+				/* use Sturges' formula */
+				bins = (Log(observationCount)/Log(2)+1)$1
+			}
+			else
+			{
+				bins = x_range/x_step$1+1;
+			}
+			
+		}
+		
+		if (bins < 1)
+		{
+			bins = 1;
+		}
+				
+		x_step	= x_range/bins;
+		
+		if (x_step == 0.)
+		{
+			x_step = 1;
+		}
+		
+		binnedData = {bins,2};
+		
+		for (_x = 0; _x < observationCount; _x = _x+1)
+		{
+			_y = ((x[_x] - x_min)/x_step)$1;
+			_y = Min(_y,bins-1);
+			
+			binnedData [_y][1] = binnedData[_y][1] + 1;
+		}
+
+		if (mode == 1)
+		{
+			binnedData = binnedData * (1/observationCount);
+		}
+
+		for (_x = 0; _x < bins; _x = _x+1)
+		{	
+			binnedData [_x][0] = x_min + x_step*(_x);
+		}
+		
+		localPD = {1,4};
+		localPD[0] = plotDim[0]; localPD[1] = plotDim[1]; localPD[2] = plotDim[2]; localPD[3] = x_step;
+
+		return StackedBarPlot ("binnedData", {{0,0}{0,0}}, fontFace, localPD, colors, labels, {}, doWrappers, 0);
+	}
+	return 0;
+}
+
+/*--------------------------------------------------------------------------------------------------------------------------*/
+
+function StackedBarPlot		 (xy&, 			/* x axis followed by K columns of y values*/
+							  xyranges, 	/* 2x2 matrix {{x_min, x_max}{y_min, y_max} 
+							  				   will be adjusted to cover the data in xy if needed*/
+							  fontFace,		/* use this font */
+							  plotDim, 		/* 1x3/4 matrix {{width, height,font_size,solid_border}} of the plot in points 
+							  			    */
+							  colors, 		/* Kx3 matrix of RGB colors to plot each point with */
+							  labels,  		/* 3x1 matrix of strings: plot-label, x-axis label, y-axis label*/
+							  dataLabels,   /* Kx1 matrix of strings to label the observations with */
+							  doWrappers,   /* should PS prefix and suffix be included */
+							  lastLabelSP   /* use the last column to scatter plot over stacked bars */
+							  )
+{
+	
+	
+	psDensityPlot = ""; psDensityPlot*1024;
+	
+	plotHeight = Max (100, plotDim[1]);
+	plotWidth  = Max (100, plotDim[0]);
+	
+	plotOriginX = 4.5*plotDim[2];
+	plotOriginY = 3.5*plotDim[2];
+	
+	xMin		= xyranges[0][0];
+	xMax		= xyranges[0][1];
+	yMin		= xyranges[1][0];
+	yMax		= xyranges[1][1];
+	
+	doSolidPlots = (Columns (plotDim) == 4);
+	
+	_yColumns     		 = Columns (xy)-1-(lastLabelSP>0);
+
+	legendWidth		   = 0;
+	for (_dataPoint = 0; _dataPoint < _yColumns; _dataPoint = _dataPoint + 1)
+	{
+		px = _HYPSGetStringWidth (dataLabels[_dataPoint]) * plotDim[2];
+		if (px > legendWitdh)
+		{
+			legendWitdh = px;
+		}
+	}
+	
+	if (legendWitdh)
+	{
+		legendWitdh = legendWitdh + 2*plotDim[2];
+	}
+
+	plotSpanX	= plotWidth;
+	plotSpanY   = plotHeight;
+	plotWidth   = plotWidth  - 5.5*plotDim[2]-legendWitdh;
+	plotHeight	= plotHeight - 4.5*plotDim[2];
+	
+	if (doWrappers)
+	{
+		psDensityPlot * _HYPSPageHeader (plotSpanX,plotSpanY, "Stacked Bar Plot");
+		psDensityPlot * "\n";
+		psDensityPlot * _HYPSTextCommands(0);
+	}
+	else
+	{
+		_renderedPlotDimensions = {{plotSpanX__,plotSpanY__}};
+	}
+	
+	psDensityPlot * _HYPSSetFont (fontFace, plotDim[2]);
+	psDensityPlot * "\n";
+	
+	psDensityPlot * "\n 1 setlinewidth 1 setlinecap 0 setlinejoin 0 0 0 setrgbcolor";
+	psDensityPlot * ("\n " + plotOriginX + " " + plotOriginY + " " + plotWidth + " " + plotHeight + " rectstroke\n");
+	
+	_x 		      		 = Rows (xy);
+	_yTotalHeight 		 = {1,_x};
+	
+	barWidth			 = 1e100;
+	_yIterator			 = (xy[-1][0])%0;
+	for (_dataPoint = 1; _dataPoint < _x; _dataPoint = _dataPoint + 1)
+	{
+		barWidth = Min (barWidth,_yIterator[_dataPoint] - _yIterator[_dataPoint-1]);
+	}
+
+	for (_dataPoint = 0; _dataPoint < _x; _dataPoint = _dataPoint + 1)
+	{
+		xMin = Min(xMin,xy[_dataPoint][0]);
+		xMax = Max(xMax,xy[_dataPoint][0]);
+		for (_yIterator = 1; _yIterator <= _yColumns; _yIterator = _yIterator + 1)
+		{	
+			_yTotalHeight[_dataPoint] = _yTotalHeight[_dataPoint] + xy[_dataPoint][_yIterator];
+		}
+		yMin = Min(yMin,_yTotalHeight[_dataPoint]);
+		yMax = Max(yMax,_yTotalHeight[_dataPoint]);
+		if (lastLabelSP)
+		{
+			yMin = Min(yMin,xy[_dataPoint][_yIterator]);
+			yMax = Max(yMax,xy[_dataPoint][_yIterator]);	
+		}
+	}
+
+	if (doSolidPlots)
+	{
+		xMax = xMax + plotDim[3];
+	}
+		
+	/*diff = (yMax-yMin) - (xMax-xMin);
+	if (diff > 0)
+	{
+		xMin = xMin - diff/2;
+		xMax = xMax + diff/2;
+	}
+	else
+	{
+		yMin = yMin + diff/2;
+		yMax = yMax - diff/2;
+	}*/
+
+	plotWidth 	= plotWidth  - 2*(doSolidPlots==0);
+	plotHeight  = plotHeight - 2*(doSolidPlots==0);
+	px 			= plotWidth /(xMax - xMin + barWidth*(doSolidPlots==0));
+	py 			= plotHeight/(yMax - yMin);
+	barWidth 	= barWidth * px;
+	xShift		= doSolidPlots==0;
+	
+	if (Rows(colors) == 0)
+	{
+		colors = _hyDefaultPSColors;
+		colors[_yColumns][0] = 0;
+		colors[_yColumns][1] = 0;
+		colors[_yColumns][2] = 0;
+	}
+	
+	for (_dataPoint = 0; _dataPoint < _x; _dataPoint = _dataPoint + 1)
+	{
+		myX_coord = plotOriginX+(xy[_dataPoint][0]-xMin)*px+xShift;
+		myY_coord = plotOriginY;
+		
+		
+		for (_yIterator = 0; _yIterator < _yColumns; _yIterator = _yIterator + 1)
+		{	
+			_rectHeight = xy[_dataPoint][_yIterator+1]*py;
+			if (_rectHeight > 0)
+			{
+				psDensityPlot * (""+ colors[_yIterator][0] + " " + colors[_yIterator][1] + " " + colors[_yIterator][2] + " setrgbcolor\n");
+				if (doSolidPlots)
+				{
+					psDensityPlot * (""+ myX_coord + " " + myY_coord + " " + barWidth + " " + _rectHeight + " rectfill\n");
+				}
+				else
+				{
+					psDensityPlot * (""+ myX_coord + " " + myY_coord + " " + barWidth * 1.5 + " " + _rectHeight + " rectfill\n");
+				}
+				myY_coord = myY_coord + _rectHeight;
+			}
+		}		
+		
+		if (doSolidPlots)
+		{
+			psDensityPlot * (""+ colors[_yColumns][0] + " " + colors[_yColumns][1] + " " + colors[_yColumns][2] + " setrgbcolor\n");
+			psDensityPlot * (""+ myX_coord + " " + plotOriginY + " " + barWidth  + " " + (myY_coord - plotOriginY) + " rectstroke\n");
+		}
+	}	
+	
+	if (lastLabelSP)
+	{
+		for (_dataPoint = 0; _dataPoint < _x; _dataPoint = _dataPoint + 1)
+		{
+			myX_coord = plotOriginX+(xy[_dataPoint][0]-xMin)*px+xShift;
+			myY_coord = plotOriginY + xy[_dataPoint][_yIterator+1]*py;
+			psDensityPlot * (""+ colors[_yIterator][0] + " " + colors[_yIterator][1] + " " + colors[_yIterator][2] + " setrgbcolor\n");
+			psDensityPlot * ("newpath " + (myX_coord) + " " 
+										+ (myY_coord) + " " 
+										+ "1 0 360 arc fill\n");
+		}
+	}
+
+	plotWidth 	= plotWidth  + 2;
+	plotHeight  = plotHeight + 2;
+
+
+	xscaler = determineCoordinateTicks (xMin,xMax);
+	_x	= Max(xMin,((xMin/xscaler)$1)*xscaler);
+	psDensityPlot * ("0 0 0 setrgbcolor\n");
+	plottedZero = (_x == 0);
+	
+
+	while (_x < xMax)
+	{
+		xStep = (plotOriginX + px*(_x-xMin));
+		psDensityPlot * ("" +  xStep + " " + (2.5*plotDim[2]) + " (" + Format(_x,0,2) + ") centertext\n");  
+		psDensityPlot * ("" +  xStep + " " + (plotOriginY+0.25*plotDim[2]) + " moveto 0 "
+							+ (-0.25*plotDim[2]) +" rlineto stroke\n");  
+		_x = _x + xscaler;
+	}
+	
+	
+	yscaler = determineCoordinateTicks (yMin,yMax);
+	_y	= ((yMin/yscaler)$1)*yscaler;
+	if (plottedZero && (_y == 0))
+	{
+		_y = yscaler;
+	}
+	
+	while (_y < yMax)
+	{
+		yStep = (plotOriginY + py*(_y-yMin));
+		psDensityPlot * ("" +  (4*plotDim[2]) + " " + yStep + " (" + Format(_y,0,2) + ") righttext\n");  
+		psDensityPlot * ("" +  plotOriginX    + " " + yStep + " moveto "+(0.25*plotDim[2]) +" 0 rlineto stroke\n");  
+		_y = _y + yscaler;
+	}
+
+	psDensityPlot * ("" + (plotOriginX+plotWidth/2)  + " " + (0.5*plotDim[2])  + " (" + labels[1] + ") centertext\n");
+	psDensityPlot * ("" + (plotOriginY+plotHeight/2) + " " + (-1.5*plotDim[2]) + " (" + labels[2] + ") vcentertext\n");	
+
+	if (legendWitdh)
+	{
+		yLoc = plotOriginY + plotHeight - 1.5*plotDim[2];
+		xLoc = plotOriginX + plotWidth  + 0.5*plotDim[2];
+		
+		for (_segment = 0; _segment < _yColumns; _segment = _segment + 1)
+		{
+			psDensityPlot * ("" + colors[_segment][0] + " " + colors[_segment][1] + " " + colors[_segment][2] + " setrgbcolor\n");
+			psDensityPlot * ("newpath " + xLoc + " " 
+									+ yLoc + " " 
+									+ plotDim[2] + " " 
+									+ plotDim[2] + " " 
+									+ " rectfill\n");
+			psDensityPlot * ("0 0 0 setrgbcolor\n");
+			psDensityPlot * ("newpath " + xLoc + " " 
+									+ yLoc + " " 
+									+ plotDim[2] + " " 
+									+ plotDim[2] + " " 
+									+ " rectstroke\n");
+									
+			psDensityPlot * ("newpath " + (xLoc + plotDim[2]*1.5) + " " + (yLoc+plotDim[2]/6) + " moveto (" + dataLabels[_segment] + ") show stroke\n");
+
+			yLoc = yLoc - plotDim[2] * 1.5;
+			
+		}
+	}
+
+	psDensityPlot * 0;
+	
+	if (doWrappers)
+	{
+		psDensityPlot * "\nshowpage\n";
+	}
+	return psDensityPlot;
+}
+
+/*--------------------------------------------------------------------------------------------------------------------------*/
+
+function CircleGraphPlot	  (edgeWeights&, 			/* a KxK matrix of graph edge weights */
+							  fontFace,		/* use this font */
+							  plotDim, 		/* 1x4 matrix {{width, height,font_size,maxlinewidth}} of the plot in points */
+							  dataLabels,   /* Kx1 matrix of strings to label the nodes with */
+							  colors,		/* Kx3 matrix of colors for the nodes  */
+							  doWrappers    /* should PS prefix and suffix be included */
+							  )
+{
+	
+	
+	psCircleGraphPlot = ""; 
+	psCircleGraphPlot*1024;
+	
+	plotHeight = Max (100, plotDim[1]);
+	plotWidth  = Max (100, plotDim[0]);
+	
+	plotOriginX = plotDim[2];
+	plotOriginY = plotDim[2];
+	
+	plotSpanX	= plotWidth;
+	plotSpanY   = plotHeight;
+	plotWidth   = plotWidth  - 2*plotDim[2];
+	plotHeight	= plotHeight - 2*plotDim[2];
+	
+	if (doWrappers)
+	{
+		psCircleGraphPlot * _HYPSPageHeader (plotSpanX,plotSpanY, "Circular graph plot");
+		psCircleGraphPlot * "\n";
+		psCircleGraphPlot * _HYPSTextCommands(0);
+	}
+	else
+	{
+		_renderedPlotDimensions = {{plotSpanX__,plotSpanY__}};
+	}
+	
+	psCircleGraphPlot * _HYPSSetFont (fontFace, plotDim[2]);
+	psCircleGraphPlot * "\n";
+	
+	psCircleGraphPlot * "\n 1 setlinewidth 1 setlinecap 0 setlinejoin 0 0 0 setrgbcolor";
+	psCircleGraphPlot * ("\n " + plotOriginX + " " + plotOriginY + " " + plotWidth + " " + plotHeight + " rectstroke\n");
+	
+	_x 		      		 = Rows (edgeWeights);
+	_yTotalHeight 		 = {1,_x};
+	maxlinewidth		 = Max(plotDim[3],1);
+	
+	_nodeCenters		 = {_x,2};
+	_anglePerNode		 = 2*3.1415926/_x;
+	_radialCenter		 = {{plotWidth__/2+plotOriginX__,plotHeight__/2+plotOriginY__}
+							{plotWidth__/2,plotHeight__/2}
+						   };
+	
+	for (_dataPoint = 0; _dataPoint < _x; _dataPoint = _dataPoint + 1)
+	{
+		myX_coord = _radialCenter[0][0] + _radialCenter[1][0]*Cos(_anglePerNode*_dataPoint);
+		myY_coord = _radialCenter[0][1] + _radialCenter[1][1]*Sin(_anglePerNode*_dataPoint);
+		_nodeCenters[_dataPoint][0] = myX_coord;
+		_nodeCenters[_dataPoint][1] = myY_coord;
+	}
+
+	for (_dataPoint = 0; _dataPoint < _x; _dataPoint = _dataPoint + 1)
+	{
+		for (_dataPoint2 = _dataPoint+1; _dataPoint2 < _x; _dataPoint2 = _dataPoint2 + 1)
+		{
+			myEW = edgeWeights[_dataPoint][_dataPoint2];
+			if (myEW > 0.95)
+			{
+				psCircleGraphPlot * ("newpath " + _nodeCenters[_dataPoint][0] + " "
+												+ _nodeCenters[_dataPoint][1] + " moveto " 
+												+ myEW * maxlinewidth + " setlinewidth " 
+												+ _nodeCenters[_dataPoint2][0] + " "
+												+ _nodeCenters[_dataPoint2][1] + " lineto stroke\n");
+			}								
+		}
+	}
+		
+	/*
+	plotWidth 	= plotWidth  - 2;
+	plotHeight  = plotHeight - 2;
+	px 			= plotWidth /(xMax - xMin + barWidth);
+	py 			= plotHeight/(yMax - yMin + 2);
+	barWidth 	= barWidth * px;
+	xShift		= 1;	
+	
+	for (_dataPoint = 0; _dataPoint < _x; _dataPoint = _dataPoint + 1)
+	{
+		myX_coord = plotOriginX+(xy[_dataPoint][0]-xMin)*px+xShift;
+		myY_coord = plotOriginY;
+		
+		for (_yIterator = 0; _yIterator < _yColumns; _yIterator = _yIterator + 1)
+		{	
+			_rectHeight = xy[_dataPoint][_yIterator+1]*py;
+			if (_rectHeight > 0)
+			{
+				psCircleGraphPlot * (""+ colors[_yIterator][0] + " " + colors[_yIterator][1] + " " + colors[_yIterator][2] + " setrgbcolor\n");
+				psCircleGraphPlot * (""+ myX_coord + " " + myY_coord + " " + barWidth*1.5 + " " + _rectHeight + " rectfill\n");
+				myY_coord = myY_coord + _rectHeight;
+			}
+		}									
+	}	
+	
+	if (lastLabelSP)
+	{
+		for (_dataPoint = 0; _dataPoint < _x; _dataPoint = _dataPoint + 1)
+		{
+			myX_coord = plotOriginX+(xy[_dataPoint][0]-xMin)*px+xShift;
+			myY_coord = plotOriginY + xy[_dataPoint][_yIterator+1]*py;
+			psCircleGraphPlot * (""+ colors[_yIterator][0] + " " + colors[_yIterator][1] + " " + colors[_yIterator][2] + " setrgbcolor\n");
+			psCircleGraphPlot * ("newpath " + (myX_coord) + " " 
+										+ (myY_coord) + " " 
+										+ "1 0 360 arc fill\n");
+		}
+	}
+
+	plotWidth 	= plotWidth  + 2;
+	plotHeight  = plotHeight + 2;
+
+
+	xscaler = determineCoordinateTicks (xMin,xMax);
+	_x	= ((xMin/xscaler)$1)*xscaler;
+	psCircleGraphPlot * ("0 0 0 setrgbcolor\n");
+	plottedZero = (_x == 0);
+	
+	while (_x < xMax)
+	{
+		xStep = (plotOriginX + px*(_x-xMin));
+		psCircleGraphPlot * ("" +  xStep + " " + (2.5*plotDim[2]) + " (" + Format(_x,0,0) + ") centertext\n");  
+		psCircleGraphPlot * ("" +  xStep + " " + (plotOriginY+0.25*plotDim[2]) + " moveto 0 "
+							+ (-0.25*plotDim[2]) +" rlineto stroke\n");  
+		_x = _x + xscaler;
+	}
+	
+	
+	yscaler = determineCoordinateTicks (yMin,yMax);
+	_y	= ((yMin/yscaler)$1)*yscaler;
+	if (plottedZero && (_y == 0))
+	{
+		_y = yscaler;
+	}
+	
+	while (_y < yMax)
+	{
+		yStep = (plotOriginY + py*(_y-yMin));
+		psCircleGraphPlot * ("" +  (4*plotDim[2]) + " " + yStep + " (" + Format(_y,0,0) + ") righttext\n");  
+		psCircleGraphPlot * ("" +  plotOriginX    + " " + yStep + " moveto "+(0.25*plotDim[2]) +" 0 rlineto stroke\n");  
+		_y = _y + yscaler;
+	}
+
+	psCircleGraphPlot * ("" + (plotOriginX+plotWidth/2) + " " + (0.5*plotDim[2]) +" (" + labels[1] + ") centertext\n");
+	psCircleGraphPlot * ("" + (plotOriginY+plotHeight/2) + " " + (-1.5*plotDim[2]) +" ("+ labels[2] + ") vcentertext\n");	
+
+	if (legendWitdh)
+	{
+		yLoc = plotOriginY + plotHeight - 1.5*plotDim[2];
+		xLoc = plotOriginX +  _x * px + 0.5*plotDim[2];
+		
+		for (_segment = 0; _segment < _yColumns; _segment = _segment + 1)
+		{
+			psCircleGraphPlot * ("" + colors[_segment][0] + " " + colors[_segment][1] + " " + colors[_segment][2] + " setrgbcolor\n");
+			psCircleGraphPlot * ("newpath " + xLoc + " " 
+									+ yLoc + " " 
+									+ plotDim[2] + " " 
+									+ plotDim[2] + " " 
+									+ " rectfill\n");
+			psCircleGraphPlot * ("0 0 0 setrgbcolor\n");
+			psCircleGraphPlot * ("newpath " + xLoc + " " 
+									+ yLoc + " " 
+									+ plotDim[2] + " " 
+									+ plotDim[2] + " " 
+									+ " rectstroke\n");
+									
+			psCircleGraphPlot * ("newpath " + (xLoc + plotDim[2]*1.5) + " " + (yLoc+plotDim[2]/6) + " moveto (" + dataLabels[_segment] + ") show stroke\n");
+
+			yLoc = yLoc - plotDim[2] * 1.5;
+			
+		}
+	}*/
+
+	psCircleGraphPlot * 0;
+	
+	if (doWrappers)
+	{
+		psCircleGraphPlot * "\nshowpage\n";
+	}
+	return psCircleGraphPlot;
+}
+
+/*--------------------------------------------------------------------------------------------------------------------------*/
+
+
+function generateDensityPlot (data_matrix&, /* Nx3 matrix with x,y,value points to plot */
+							  xyranges, 	/* 2x3 matrix {{x_min, x_max, steps}{y_min, y_max, steps} */
+							  zrange,   	/* 1x2 matrix {{z_min, z_max}}, used for color scaling 
+							  			   	z_min and z_max will be automatically adjusted to include
+							  			   	at least the range of values from data_matrix*/
+							  plotDim, 		/* 1x3 matrix {{width, height,font_size}} of the plot in points */
+							  colors, 		/* 2x3 matrix {{R_base,G_base,B_base}{R_max,G_max,R_max
+							  			 		the colors are linearly interpolated from base (min intensity)*/
+							  labels,  		/* 1x3 matrix of strings: plot-label, x-axis label, y-axis label*/
+							  circles,	    /* Nx3/4 matrix (N could be 0) with coordinates/radii of circles to place on the map
+							                   if N = 4, then plot an ellipse
+											*/
+							  doWrappers    /* should PS prefix and suffix be included */
+				
+							  )
+{
+	
+	psDensityPlot = ""; psDensityPlot*1024;
+	
+	plotHeight = Max (100, plotDim[1]);
+	plotWidth  = Max (100, plotDim[0]);
+	
+	plotOriginX = 4.5*plotDim[2];
+	plotOriginY = 3.5*plotDim[2];
+	
+	xBoxes		= xyranges[0][2];
+	yBoxes		= xyranges[1][2];
+	xStep		= (xyranges[0][1]-xyranges[0][0])/xBoxes;
+	yStep		= (xyranges[1][1]-xyranges[1][0])/yBoxes;
+	px			= plotWidth/xBoxes;
+	py			= plotHeight/yBoxes;
+	zMin		= 1e100;
+	zMax		= -1e100;
+	plotSpanX   = plotWidth + 5*plotDim[2];
+	plotSpanY	= plotHeight + 4*plotDim[2];
+
+
+	if (doWrappers)
+	{
+		psDensityPlot * _HYPSPageHeader (plotSpanX, plotSpanY, "Density Plot");
+	}
+	else
+	{
+		_renderedPlotDimensions = {{plotSpanX__,plotSpanY__}};
+	}
+	
+	psDensityPlot * "\n";
+	doPercentage  = Columns (plotDim) > 3;
+	if (doPercentage)
+	{
+		secondarySize  = Min(Min (px,py)/2,plotDim[3]);
+		secondaryShift = secondarySize/2;
+		
+		psDensityPlot * _HYPSSetFont ("Times-Roman", secondarySize);
+	}
+	else
+	{
+		psDensityPlot * _HYPSSetFont ("Times-Roman", plotDim[2]);
+	}
+	psDensityPlot * "\n";
+	if (doWrappers)
+	{
+		psDensityPlot * _HYPSTextCommands(0);
+	}
+	
+	psDensityPlot * "\n 1 setlinewidth 1 setlinecap 0 setlinejoin 0 0 0 setrgbcolor";
+	psDensityPlot * ("\n " + plotOriginX + " " + plotOriginY + " " + plotWidth + " " + plotHeight + " rectstroke\n");
+	
+	zValues		= {xBoxes,yBoxes};
+	
+	/* compute and condense the data matrix */
+	
+	
+	_x = Rows (data_matrix);
+	
+	totalSum = 0;
+	for (_dataPoint = 0; _dataPoint < _x; _dataPoint = _dataPoint + 1)
+	{
+		xSquare = Max(0,Min(((data_matrix[_dataPoint][0]-xyranges[0][0])/xStep)$1,xBoxes-1));
+		ySquare = Max(0,Min(((data_matrix[_dataPoint][1]-xyranges[1][0])/yStep)$1,yBoxes-1));
+		zValues [xSquare][ySquare] = zValues [xSquare][ySquare] + data_matrix[_dataPoint][2];
+		zMin = Min(zMin,zValues [xSquare][ySquare]);
+		zMax = Max(zMax,zValues [xSquare][ySquare]);
+		totalSum = totalSum + data_matrix[_dataPoint][2];
+	}
+	
+	zMin = Min(zMin,zrange[0]);
+	zMax = Max(zMax,zrange[1])-zMin;
+	
+	for (_x = 0; _x < xBoxes; _x = _x+1)
+	{
+		for (_y = 0; _y < yBoxes; _y = _y+1)
+		{
+			meColor = Sqrt((zValues [_x][_y]-zMin)/zMax);
+			meColor2 = colors[0][-1]*(1-meColor) + colors[1][-1]*meColor;
+			psDensityPlot * (""+ meColor2[0] + " " + meColor2[1] + " " + meColor2[2] + " setrgbcolor\n");
+			psDensityPlot * ("" + (plotOriginX+_x*px) + " " + (plotOriginY+_y*py) + " " + px + " " + py + " rectfill\n");
+			if (doPercentage && zValues [_x][_y]/totalSum > 0.0005)
+			{
+				if (meColor > 0.3)
+				{
+					psDensityPlot * ("1 1 1 setrgbcolor\n");
+				}
+				else
+				{
+					psDensityPlot * ("0 0 0 setrgbcolor\n");
+				}
+				psDensityPlot * ("" + (plotOriginX+_x*px+secondaryShift) + " " + (plotOriginY+_y*py+secondaryShift) + " moveto ("+ Format(100*zValues [_x][_y]/totalSum,3,1) + ") show\n");
+			}
+		}
+	}
+	
+	/* now do the coordinates */
+	/* determine base scale */
+	
+	if (doPercentage)
+	{
+		psDensityPlot * _HYPSSetFont ("Times-Roman", plotDim[2]);
+		psDensityPlot * "\n";
+	}
+	
+	xscaler = determineCoordinateTicks (xyranges[0][0],xyranges[0][1]);
+	_x	= ((xyranges[0][0]/xscaler)$1 + 1)*xscaler;
+	px	= plotWidth/(xyranges[0][1]-xyranges[0][0]);
+	psDensityPlot * ("0 0 0 setrgbcolor\n");
+	while (_x < xyranges[0][1])
+	{
+		xStep = (plotOriginX + px*(_x-xyranges[0][0]));
+		psDensityPlot * ("" +  xStep + " " + (2.5*plotDim[2]) + " (" + Format(_x,4,2) + ") centertext\n");  
+		psDensityPlot * ("" +  xStep + " " + (plotOriginY+0.25*plotDim[2]) + " moveto 0 "+ (-0.25*plotDim[2]) +" rlineto stroke\n");  
+		_x = _x + xscaler;
+	}
+	
+	yscaler = determineCoordinateTicks (xyranges[1][0],xyranges[1][1]);
+	_y	= ((xyranges[1][0]/yscaler)$1 + 1)*yscaler;
+	py	= plotHeight/(xyranges[1][1]-xyranges[1][0]);
+	while (_y < xyranges[1][1])
+	{
+		yStep = (plotOriginY + py*(_y-xyranges[1][0]));
+		psDensityPlot * ("" +  (4*plotDim[2]) + " " + yStep + " (" + Format(_y,4,2) + ") righttext\n");  
+		psDensityPlot * ("" +  plotOriginX    + " " + yStep + " moveto "+(0.25*plotDim[2]) +" 0 rlineto stroke\n");  
+		_y = _y + yscaler;
+	}
+	
+	psDensityPlot * ("0 0 0 setrgbcolor\n"+plotOriginX+" "+plotOriginY+" moveto\n"+
+					 plotWidth + " " + plotHeight + " rlineto stroke\n");
+
+	psDensityPlot * ("" + (plotOriginX+plotWidth/2) + " " + (0.5*plotDim[2]) +" (" + labels[1] + ") centertext\n");
+	psDensityPlot * ("" + (plotOriginY+plotHeight/2) + " " + (-1.5*plotDim[2]) +" ("+ labels[2] + ") vcentertext\n");
+	
+	_x = Rows (circles);
+	
+	for (_y = 0; _y < _x; _y = _y + 1)
+	{
+		xStep = circles[_y][0]*px + plotOriginX;
+		yStep = circles[_y][1]*py + plotOriginY;
+		if (Columns (circles) == 4 && circles[_y][3] > 0 && circles[_y][2] > 0)
+		{
+			psDensityPlot * ("gsave "+ xStep + " " + yStep + " translate 1 " + circles[_y][3]/circles[_y][2] + " scale newpath 0 0 " + circles[_y][2] + " 0 360 arc stroke grestore\n");
+		}
+		else
+		{
+			psDensityPlot * ("newpath " + xStep + " " + yStep + " " + circles[_y][2] + " 0 360 arc stroke\n");
+		}
+	}
+	
+	psDensityPlot * 0;
+	if (doWrappers)
+	{
+		psDensityPlot * "\nshowpage\n";
+	}
+	
+	return psDensityPlot;
+}
+
+/*--------------------------------------------------------------------------------------------------------------------------*/
+
+
+function generateHeatMap	 (data_matrix&, /* Nx4 matrix with x,y,z,plot/or not (0, >0) points to plot */
+							  xyranges, 	/* 2x2 matrix {{x_bins, x_left, x_steps}{y_bins, y_bottom, y_steps} */
+							  zrange,   	/* 1x2 matrix {{z_min, z_max}}, used for color scaling 
+							  			   	z_min and z_max will be automatically adjusted to include
+							  			   	at least the range of values from data_matrix*/
+							  plotDim, 		/* 1x3 matrix {{width, height,font_size}} of the plot in points */
+							  colors, 		/* 2x3 matrix {{R_base,G_base,B_base}{R_max,G_max,R_max
+							  			 		the colors are linearly interpolated from base (min intensity)*/
+							  labels  		/* 1x3 matrix of strings: plot-label, x-axis label, y-axis label*/
+							  )
+{
+	
+	psDensityPlot = ""; psDensityPlot*1024;
+	
+	plotHeight = Max (100, plotDim[1]);
+	plotWidth  = Max (100, plotDim[0]);
+	
+	plotOriginX = 4.5*plotDim[2];
+	plotOriginY = 3.5*plotDim[2];
+	
+	xBoxes		= xyranges[0][0];
+	yBoxes		= xyranges[1][0];
+	xStep		= xyranges[0][2];
+	yStep		= xyranges[1][2];
+	px			= plotWidth/xBoxes;
+	py			= plotHeight/yBoxes;
+	zMin		= 1e100;
+	zMax		= -1e100;
+
+	psDensityPlot * _HYPSPageHeader (plotWidth + 5*plotDim[2], plotHeight + 6*plotDim[2], "Density Plot");
+	psDensityPlot * "\n";
+	psDensityPlot * _HYPSSetFont ("Times-Roman", plotDim[2]);
+
+	psDensityPlot * "\n";
+	psDensityPlot * _HYPSTextCommands(0);
+	
+	psDensityPlot * "\n 1 setlinewidth 1 setlinecap 0 setlinejoin 0 0 0 setrgbcolor\n";
+	
+	zValues		= {xBoxes,yBoxes};
+	doPlot		= {xBoxes,yBoxes};
+	
+	/* compute and condense the data matrix */
+	
+	
+	_x = Rows (data_matrix);
+	
+	for (_dataPoint = 0; _dataPoint < _x; _dataPoint = _dataPoint + 1)
+	{
+		xSquare = _dataPoint $ yBoxes;
+		ySquare = _dataPoint % yBoxes;
+		plotMe  = data_matrix[_dataPoint][3];
+		if		(plotMe)
+		{
+			zValues [xSquare][ySquare]  = data_matrix[_dataPoint][2]/plotMe;
+			zMin						= Min(zMin,zValues [xSquare][ySquare]);
+			zMax						= Max(zMax,zValues [xSquare][ySquare]);
+			doPlot[xSquare][ySquare]    = 1;
+		}
+	}
+	
+	zMin = Min(zMin,zrange[0]);
+	zMax = Max(zMax,zrange[1])-zMin;
+	
+	for (_x = 0; _x < xBoxes; _x = _x+1)
+	{
+		for (_y = 0; _y < yBoxes; _y = _y+1)
+		{
+			if (doPlot[_x][_y])
+			{
+				meColor = (zValues [_x][_y]-zMin)/zMax;
+				meColor2 = colors[0][-1]*(1-meColor) + colors[1][-1]*meColor;
+				psDensityPlot * (""+ meColor2[0] + " " + meColor2[1] + " " + meColor2[2] + " setrgbcolor\n");
+				psDensityPlot * ("" + Format(plotOriginX+_x*px,20,10) + " " + Format(plotOriginY+_y*py,20,10) + " " + Format(px,20,10) + " " + Format(py,20,10) + " rectfill\n");
+			}
+			/*else
+			{
+				meColor2 = colors[0][-1]*(0.5) + colors[1][-1]*0.5;
+				psDensityPlot * (""+ meColor2[0] + " " + meColor2[1] + " " + meColor2[2] + " setrgbcolor\n");
+				psDensityPlot * (Format(plotOriginX+(_x+0.5)*px,20,10) + " " + Format(plotOriginY+(_y+0.5)*py,20,10) + " " + Format(Max(px,py)/2,20,10) + " 0 360 arc fill\n");
+			}*/
+		}
+	}
+	
+	/* now do the coordinates */
+	/* determine base scale */
+	
+	if (doPercentage)
+	{
+		psDensityPlot * _HYPSSetFont ("Times-Roman", plotDim[2]);
+		psDensityPlot * "\n";
+	}
+	
+	x_max = xyranges[0][1]+xyranges[0][0]*xyranges[0][2];
+	xscaler = determineCoordinateTicks (xyranges[0][1],x_max);
+	_x	= ((xyranges[0][1]/xscaler)$1 + 1)*xscaler;
+	px	= plotWidth/(x_max-xyranges[0][1]);
+	psDensityPlot * ("0 0 0 setrgbcolor\n");
+	while (_x < x_max)
+	{
+		xStep = (plotOriginX + px*(_x-xyranges[0][1]));
+		psDensityPlot * ("" +  xStep + " " + (2.5*plotDim[2]) + " (" + Format(_x,4,2) + ") centertext\n");  
+		psDensityPlot * ("" +  xStep + " " + (plotOriginY+0.25*plotDim[2]) + " moveto 0 "+ (-0.25*plotDim[2]) +" rlineto stroke\n");  
+		_x = _x + xscaler;
+	}
+	
+	y_max = xyranges[1][1]+xyranges[1][0]*xyranges[1][2];
+	yscaler = determineCoordinateTicks (xyranges[1][1],y_max);
+	_y	= ((xyranges[1][1]/yscaler)$1 + 1)*yscaler;
+	py	= plotHeight/(y_max-xyranges[1][1]);
+	while (_y < y_max)
+	{
+		yStep = (plotOriginY + py*(_y-xyranges[1][1]));
+		psDensityPlot * ("" +  (4*plotDim[2]) + " " + yStep + " (" + Format(_y,4,2) + ") righttext\n");  
+		psDensityPlot * ("" +  plotOriginX    + " " + yStep + " moveto "+(0.25*plotDim[2]) +" 0 rlineto stroke\n");  
+		_y = _y + yscaler;
+	}
+	
+	psDensityPlot * ("" + (plotOriginX+plotWidth/2) + " " + (0.5*plotDim[2]) +" (" + labels[1] + ") centertext\n");
+	psDensityPlot * ("" + (plotOriginY+plotHeight/2) + " " + (-1.5*plotDim[2]) +" ("+ labels[2] + ") vcentertext\n");
+		
+	psDensityPlot * ("\n0 0 0 setrgbcolor " + plotOriginX + " " + plotOriginY + " " + plotWidth + " " + plotHeight + " rectstroke\n");
+	
+	_thermLabels = {{"0%",".2"}{"25%",".2"}{"50%",".2"}{"75%",".2"}{"100%",".2"}};
+	_colorLabels = {5,6};
+	for (_x = 0; _x < 5; _x = _x+1)
+	{
+		meColor = _x*0.25;
+		meColor2 = colors[0][-1]*(1-meColor) + colors[1][-1]*meColor;
+		_colorLabels[_x][0] = meColor2[0];
+		_colorLabels[_x][1] = meColor2[1];
+		_colorLabels[_x][2] = meColor2[2];
+		_colorLabels[_x][3] = 1-meColor2[0];
+		_colorLabels[_x][4] = 1-meColor2[1];
+		_colorLabels[_x][5] = 1-meColor2[2];
+		/*if (Max(_colorLabels[_x][0],Max(_colorLabels[_x][1],_colorLabels[_x][2])) < 0.4)
+		{
+			_colorLabels[_x][3] = 1;
+			_colorLabels[_x][4] = 1;
+			_colorLabels[_x][5] = 1;		
+		}*/
+	}
+	
+	psDensityPlot * ("" + plotOriginX + " " + (plotHeight+plotOriginY+plotDim[2]/2) + " translate \n"); 
+	psDensityPlot * (_HYPSLabeledBoxes (200,1.5*plotDim[2],plotDim[2],_thermLabels,_colorLabels))["PS"];
+	psDensityPlot * "\nshowpage\n";
+	psDensityPlot * 0;
+	
+	return psDensityPlot;
+}
+
+/*--------------------------------------------------------------------------------------------------------------------------*/
+
+function SimpleGraph		 (xy&, 			/* Nx(K+1) matrix with x,y points to plot */
+							  xyranges, 	/* 2x2 matrix {{x_min, x_max}{y_min, y_max} 
+							  				   will be adjusted to cover the data in xy if needed*/
+							  fontFace, 	/* font to use for plotting */
+							  plotDim, 		/* 1x3 matrix {{width, height,font_size}} of the plot in points, add a 4th column for options, such as enforcesym */
+							  colors, 		/* Kx3 matrix of RGB colors to plot each point with; pass an empty matrix to use defaults */
+							  labels,  		/* 1x3 matrix of strings: plot-label, x-axis label, y-axis label*/
+							  seriesLabels	/* Kx2 matrix of strings with labels for every point and a plotting mode 
+							  					(Impulse to connect to the x-axis; Dot to skip connection; connected dots otherwise */,
+							  doWrappers    /* should PS prefix and suffix be included */
+							  )
+{
+	return SimpleGraph2 ("xy", xyranges, fontFace, plotDim, colors, labels, seriesLabels, doWrappers,0);
+}
+							  
+/*--------------------------------------------------------------------------------------------------------------------------*/
+
+function SimpleGraph2		 (xy&, 			/* Nx(K+1) matrix with x,y points to plot */
+							  xyranges, 	/* 2x2 matrix {{x_min, x_max}{y_min, y_max} 
+							  				   will be adjusted to cover the data in xy if needed*/
+							  fontFace, 	/* font to use for plotting */
+							  plotDim, 		/* 1x3 matrix {{width, height,font_size,[optional dot size]}} of the plot in points */
+							  colors, 		/* Kx3 matrix of RGB colors to plot each point with; pass an empty matrix to use defaults */
+							  labels,  		/* 1x3 matrix of strings: plot-label, x-axis label, y-axis label*/
+							  seriesLabels	/* Kx2 matrix of strings with labels for every point and a plotting mode (Impulse to connect to the x-axis; dots otherwise */,
+							  doWrappers    /* should PS prefix and suffix be included */,
+							  enforceSym	/* enforce the same x-y scale and dimensions; draw diagonal */
+							  )
+{
+	
+	
+	psDensityPlot = ""; psDensityPlot*1024;
+	
+	plotHeight = Max (100, plotDim[1]);
+	plotWidth  = Max (100, plotDim[0]);
+	
+	plotOriginX = 4.5*plotDim[2];
+	plotOriginY = 3.5*plotDim[2];
+	
+	xMin		= xyranges[0][0];
+	xMax		= xyranges[0][1];
+	yMin		= xyranges[1][0];
+	yMax		= xyranges[1][1];
+		
+	
+	_x 				= Rows (xy);
+	_series			= Columns(xy)-1;
+
+	legendWidth		   = 0;
+	for (_dataPoint = 0; _dataPoint < _series; _dataPoint = _dataPoint + 1)
+	{
+		px = _HYPSGetStringWidth (seriesLabels[_dataPoint][0]) * plotDim[2];
+		if (px > legendWitdh)
+		{
+			legendWitdh = px;
+		}
+	}
+	
+	if (legendWitdh)
+	{
+		legendWitdh = legendWitdh + 2*plotDim[2];
+	}
+	
+	if (enforceSym)
+	{
+		plotHeight = Max(plotHeight,plotWidth);
+		plotWidth  = plotHeight;
+	}
+
+	plotSpanX	= plotWidth;
+	plotSpanY   = plotHeight;
+	plotWidth   = plotWidth  - 5*plotDim[2]-legendWitdh;
+	plotHeight	= plotHeight - 4*plotDim[2];
+
+
+	if (doWrappers)
+	{
+		if (doWrappers != 2)
+		{
+			psDensityPlot * _HYPSPageHeader (plotSpanX,plotSpanY, "Density Plot");
+			psDensityPlot * "\n";
+		}
+		psDensityPlot * _HYPSTextCommands(0);
+	}
+	
+	psDensityPlot * _HYPSSetFont (fontFace, plotDim[2]);
+	psDensityPlot * "\n";
+	
+	psDensityPlot * "\n 1 setlinewidth 1 setlinecap 0 setlinejoin\n";
+	
+	/* adjust data ranges if necessary */
+	
+
+	for (_dataPoint = 0; _dataPoint < _x; _dataPoint = _dataPoint + 1)
+	{
+		xMin = Min(xMin,xy[_dataPoint][0]);
+		xMax = Max(xMax,xy[_dataPoint][0]);
+		for (_seriesCount = 1; _seriesCount <= _series; _seriesCount = _seriesCount+1)
+		{
+			yMin = Min(yMin,xy[_dataPoint][_seriesCount]);
+			yMax = Max(yMax,xy[_dataPoint][_seriesCount]);
+		}
+	}
+		
+	
+	if (Rows(colors)==0)
+	{
+		colors = _hyDefaultPSColors;
+	}
+	px = plotWidth /(xMax-xMin);
+	py = plotHeight/(yMax-yMin);
+	
+	for (_seriesCount = 1; _seriesCount <= _series; _seriesCount = _seriesCount+1)
+	{
+		psDensityPlot * (""+ colors[_seriesCount-1][0] + " " + colors[_seriesCount-1][1] + " " + colors[_seriesCount-1][2] + " setrgbcolor\n");		
+		
+		_doImpulse 	  = ((seriesLabels[_seriesCount-1][1]&&1) == "IMPULSE");
+		_doDots 	  = ((seriesLabels[_seriesCount-1][1]&&1) == "DOTS");
+		
+		for (_dataPoint = 0; _dataPoint < _x; _dataPoint = _dataPoint + 1)
+		{
+			myX_coord = plotOriginX+(xy[_dataPoint][0]-xMin)*px;
+			myY_coord = plotOriginY+(xy[_dataPoint][_seriesCount]-yMin)*py;
+			if (_doImpulse)
+			{
+				if (myY_coord - plotOriginY > 0.1)
+				{
+					psDensityPlot * ("newpath " + (myX_coord) + " " 
+												+ (myY_coord) + " moveto " 
+												+ (myX_coord) + " " 
+												+ (plotOriginY) + " lineto stroke\n");
+				}
+			}
+			else
+			{
+				if (_doDots)
+				{
+					
+					psDensityPlot * ("newpath " + (myX_coord) + " " 
+												+ (myY_coord) + " " 
+												+ plotDim[3] + " " 
+												+ " 0 360 arc stroke\n");
+				}
+				else
+				{
+					if (_dataPoint)
+					{
+						psDensityPlot * ("newpath " + (myX_coord) + " " 
+													+ (myY_coord) + " moveto " 
+													+ (last_myX_coord) + " " 
+													+ (last_myY_coord) + " lineto stroke\n" );	
+					}
+				}
+				last_myX_coord = myX_coord;
+				last_myY_coord = myY_coord;
+			}
+		}
+	}
+	
+	enforceSym = Columns (plotDim) > 3;	
+	if (enforceSym)
+	{
+		xMin = Min (xMin, yMin); yMin = xMin;
+		xMax = Max (xMax, yMax); yMax = xMax;
+		psDensityPlot * ("\n [2] 0 setdash 0.5 0.5 0.5 setrgbcolor " + plotOriginX + " " + plotOriginY + " moveto " + plotWidth + " " + plotHeight + " rlineto stroke [] 0 setdash 0 0 0 setrgbcolor \n");
+	}
+	
+	if (Columns(plotDim)>3)
+	{
+		_decimalPlaces = plotDim[3];
+	}
+	else
+	{
+		_decimalPlaces = 2;
+	}
+
+	xscaler = determineCoordinateTicks (xMin,xMax);
+	_x	= ((xMin/xscaler)$1)*xscaler;
+	psDensityPlot * ("0 0 0 setrgbcolor\n");
+	plottedZero = (_x == 0);
+	
+	
+	while (_x < xMax)
+	{
+		xStep = (plotOriginX + px*(_x-xMin));
+		psDensityPlot * ("" +  xStep + " " + (2.5*plotDim[2]) + " (" + Format(_x,0,_decimalPlaces) + ") centertext\n");  
+		psDensityPlot * ("" +  xStep + " " + (plotOriginY+0.25*plotDim[2]) + " moveto 0 "
+							+ (-0.25*plotDim[2]) +" rlineto stroke\n");  
+		_x = _x + xscaler;
+	}
+	
+	
+	
+	yscaler = determineCoordinateTicks (yMin,yMax);
+	
+	
+	_y	= ((yMin/yscaler)$1)*yscaler;
+	if (xMin == yMin)
+	{
+		_y = _y + yscaler;	
+	}
+
+	while (_y < yMax)
+	{
+		yStep = (plotOriginY + py*(_y-yMin));
+		psDensityPlot * ("" +  (4*plotDim[2]) + " " + yStep + " (" + Format(_y,0,_decimalPlaces) + ") righttext\n");  
+		psDensityPlot * ("" +  plotOriginX    + " " + yStep + " moveto "+(0.25*plotDim[2]) +" 0 rlineto stroke\n");  
+		_y = _y + yscaler;
+	}
+
+	if (legendWitdh)
+	{
+		yLoc = plotOriginY + plotHeight - 1.5*plotDim[2];
+		xLoc = plotOriginX + plotWidth   + 0.5*plotDim[2];
+		psDensityPlot * ("%" + xLoc + "/" + yLoc + "\n");
+		
+		for (_segment = 0; _segment < _series; _segment = _segment + 1)
+		{
+			psDensityPlot * ("" + colors[_segment][0] + " " + colors[_segment][1] + " " + colors[_segment][2] + " setrgbcolor\n");
+			psDensityPlot * ("newpath " + xLoc + " " 
+									+ yLoc + " " 
+									+ plotDim[2] + " " 
+									+ plotDim[2] + " " 
+									+ " rectfill\n");
+			psDensityPlot * ("0 0 0 setrgbcolor\n");
+			psDensityPlot * ("newpath " + xLoc + " " 
+									+ yLoc + " " 
+									+ plotDim[2] + " " 
+									+ plotDim[2] + " " 
+									+ " rectstroke\n");
+									
+			psDensityPlot * ("newpath " + (xLoc + plotDim[2]*1.5) + " " + (yLoc+plotDim[2]/6) + " moveto (" + seriesLabels[_segment][0] + ") show stroke\n");
+
+			yLoc = yLoc - plotDim[2] * 1.5;
+			
+		}
+	}
+
+	if (enforceSym)
+	{
+		xMin = Min (xMin, yMin); yMin = xMin;
+		xMax = Max (xMax, yMax); yMax = xMax;
+		psDensityPlot * ("\n [2] 0 setdash 0.5 0.5 0.5 setrgbcolor " + plotOriginX + " " + plotOriginY + " moveto " + plotWidth + " " + plotHeight + " rlineto stroke [] 0 setdash 0 0 0 setrgbcolor \n");
+	}
+
+	psDensityPlot * ("" + (plotOriginX+plotWidth/2) + " " + (0.5*plotDim[2]) +" (" + labels[1] + ") centertext\n");
+	psDensityPlot * ("" + (plotOriginY+plotHeight/2) + " " + (-1.5*plotDim[2]) +" ("+ labels[2] + ") vcentertext\n");	
+	psDensityPlot * ("\n 0 0 0 setrgbcolor " + plotOriginX + " " + plotOriginY + " " + (plotWidth+1) + " " + (plotHeight+1) + " rectstroke\n");
+	
+
+
+
+	if (doWrappers==1)
+	{
+		psDensityPlot * "\nshowpage\n";
+	}
+	psDensityPlot * 0;
+	return psDensityPlot;
+}
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function _dNdSDensityPlot	(alpha,beta)
+{
+	ratio = Exp (0.69*(beta-alpha))/2;
+	ratio = Min (ratio,1);
+	return {{ratio__,0,1-ratio__}};
+}
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------------------*/
+
+
+function ScaledDensityPlot	 (xy&, 			/* Nx3 matrix with x,y,p value points to plot */
+							  xyranges, 	/* 2x2 matrix {{x_min, x_max}{y_min, y_max} 
+							  				   will be adjusted to cover the data in xy if needed*/
+							  fontFace, 	/* font to use for plotting */
+							  plotDim, 		/* 1x4 matrix {{width, height,font_size, max_radius}} of the plot in points 
+							  				   max_radius is the maximal radius for a mass (i.e. if it had prob = 1)
+										    */
+							  colors, 		/* if not 0 or "", then must be an ID of a two-parameter (real-valued) function 
+											   that takes a value in 0-1 and returns and 1x3 (or 3x1) RGB color
+											 */
+							  labels,  		/* 1x3 matrix of strings: plot-label, x-axis label, y-axis label*/
+							  doWrappers,    /* should PS prefix and suffix be included */
+							  enforceSym	 /* enforce the same x-y scale and dimensions; draw diagonal */
+							  )
+{
+	
+	
+	psDensityPlot = ""; psDensityPlot*1024;
+	
+	plotHeight = Max (100, plotDim[1]);
+	plotWidth  = Max (100, plotDim[0]);
+	
+	if (enforceSym)
+	{
+		plotHeight = Max(plotHeight,plotWidth);
+		plotWidth  = plotHeight;
+	}
+	
+	plotOriginX = 4.5*plotDim[2];
+	plotOriginY = 3.5*plotDim[2];
+	
+	xMin		= xyranges[0][0];
+	xMax		= xyranges[0][1];
+	yMin		= xyranges[1][0];
+	yMax		= xyranges[1][1];
+	
+	plotSpanX    = plotWidth + 5*plotDim[2];
+	plotSpanY	 = plotHeight + 4*plotDim[2];
+	circleRadius = Max(Min(plotDim[3],Min(plotSpanX,plotSpanY)/4),1);
+	
+	if (doWrappers)
+	{
+		psDensityPlot * _HYPSPageHeader (plotSpanX,plotSpanY, "Density Plot");
+		psDensityPlot * "\n";
+		psDensityPlot * _HYPSTextCommands(0);
+	}
+	
+	psDensityPlot * _HYPSSetFont (fontFace, plotDim[2]);
+	psDensityPlot * "\n";
+	
+	psDensityPlot * "\n 1 setlinewidth 1 setlinecap 0 setlinejoin 0 0 0 setrgbcolor";
+	psDensityPlot * ("\n " + plotOriginX + " " + plotOriginY + " " + plotWidth + " " + plotHeight + " rectstroke\n");
+	
+	/* adjust data ranges if necessary */
+	
+	_x = Rows (xy);
+
+	for (_dataPoint = 0; _dataPoint < _x; _dataPoint = _dataPoint + 1)
+	{
+		xMin = Min(xMin,xy[_dataPoint][0]);
+		xMax = Max(xMax,xy[_dataPoint][0]);
+		yMin = Min(yMin,xy[_dataPoint][1]);
+		yMax = Max(yMax,xy[_dataPoint][1]);
+	}
+	
+	xMin = boost(xMin,0,1.1);
+	yMin = boost(yMin,0,1.1);
+	xMax = boost(xMax,1,1.1);
+	yMax = boost(yMax,1,1.1);
+	
+	
+	diff = (yMax-yMin) - (xMax-xMin);
+	if (diff > 0)
+	{
+		xMin = xMin - diff/2;
+		xMax = xMax + diff/2;
+	}
+	else
+	{
+		yMin = yMin + diff/2;
+		yMax = yMax - diff/2;
+	}
+	
+	if (enforceSym)
+	{
+		xMin = Min (xMin, yMin); yMin = xMin;
+		xMax = Max (xMax, yMax); yMax = xMax;
+		psDensityPlot * ("\n [2] 0 setdash 0.5 0.5 0.5 setrgbcolor " + plotOriginX + " " + plotOriginY + " moveto " + plotWidth + " " + plotHeight + " rlineto stroke [] 0 setdash 0 0 0 setrgbcolor \n");
+	}
+	
+	px = plotWidth /(xMax-xMin);
+	py = plotHeight/(yMax-yMin);
+	
+
+	for (_dataPoint = 0; _dataPoint < _x; _dataPoint = _dataPoint + 1)
+	{
+		if (Abs(colors))
+		{
+			ExecuteCommands ("myColor = " + colors + "(" + xy[_dataPoint][0] + "," + xy[_dataPoint][1] + ")");
+			psDensityPlot * (""+ myColor[0] + " " + myColor[1] + " " + myColor[2] + " setrgbcolor\n");
+		}
+		myX_coord = plotOriginX+(xy[_dataPoint][0]-xMin)*px;
+		myY_coord = plotOriginY+(xy[_dataPoint][1]-yMin)*py;
+		myRadius  = Max(Sqrt(xy[_dataPoint][2]) * circleRadius, 1.5);
+		psDensityPlot * ("newpath " + (myX_coord) + " " 
+									+ (myY_coord) + " " 
+									+ myRadius + " 0 360 arc fill\n");
+									
+	}	
+
+	if (Abs(colors))
+	{
+		psDensityPlot * ("0 0 0 setrgbcolor\n");
+	}
+	
+	xscaler = determineCoordinateTicks (xMin,xMax);
+	_x	= ((xMin/xscaler)$1)*xscaler;
+	psDensityPlot * ("0 0 0 setrgbcolor\n");
+	while (_x < xMax)
+	{
+		xStep = (plotOriginX + px*(_x-xMin));
+		psDensityPlot * ("" +  xStep + " " + (2.5*plotDim[2]) + " (" + Format(_x,4,2) + ") centertext\n");  
+		psDensityPlot * ("" +  xStep + " " + (plotOriginY+0.25*plotDim[2]) + " moveto 0 "
+							+ (-0.25*plotDim[2]) +" rlineto stroke\n");  
+		_x = _x + xscaler;
+	}
+	
+	yscaler = determineCoordinateTicks (yMin,yMax);
+	_y	= ((yMin/yscaler)$1)*yscaler;
+	while (_y < yMax)
+	{
+		yStep = (plotOriginY + py*(_y-yMin));
+		psDensityPlot * ("" +  (4*plotDim[2]) + " " + yStep + " (" + Format(_y,4,2) + ") righttext\n");  
+		psDensityPlot * ("" +  plotOriginX    + " " + yStep + " moveto "+(0.25*plotDim[2]) +" 0 rlineto stroke\n");  
+		_y = _y + yscaler;
+	}
+
+	psDensityPlot * ("" + (plotOriginX+plotWidth/2) + " " + (0.5*plotDim[2]) +" (" + labels[1] + ") centertext\n");
+	psDensityPlot * ("" + (plotOriginY+plotHeight/2) + " " + (-1.5*plotDim[2]) +" ("+ labels[2] + ") vcentertext\n");	
+	psDensityPlot * 0;
+	
+	if (doWrappers)
+	{
+		psDensityPlot * "\nshowpage\n";
+	}
+	return psDensityPlot;
+}
diff --git a/res/TemplateBatchFiles/Utility/PostScript.bf b/res/TemplateBatchFiles/Utility/PostScript.bf
new file mode 100644
index 0000000..462ccd7
--- /dev/null
+++ b/res/TemplateBatchFiles/Utility/PostScript.bf
@@ -0,0 +1,339 @@
+/*---------------------------------------------------------
+output a postscript header; set page size
+---------------------------------------------------------*/
+
+function _HYPSPageHeader (_width,_height,_doc_title)
+{
+	
+	_res_string = "";
+	_res_string * 64;
+	_res_string * "%!\n";
+	_res_string * ("%% PS file " + _doc_title);
+	GetString (_hpv,HYPHY_VERSION,0);
+	GetString (_cdt,TIME_STAMP,0);
+	_res_string * ("\n%% Generated by HYPHY v" + _hpv + " on GMT " + _cdt);
+	_res_string * ("\n<< /PageSize ["+_width+" "+_height+ "] >> setpagedevice");
+	_res_string * 0;
+	return _res_string;
+}
+
+
+/*---------------------------------------------------------
+set a font (face and size)
+---------------------------------------------------------*/
+
+function _HYPSSetFont (_font_face,_font_size)
+{
+	
+	_res_string = "";
+	_res_string * 64;
+	_res_string * ("/"+_font_face+" findfont\n");
+	_res_string * ("/fs "+_font_size+" def\nfs scalefont\nsetfont\n");
+	_res_string * 0;
+	return _res_string;
+}
+
+/*---------------------------------------------------------
+generates string centering commands
+
+x y (text) centertext - to output (text) so that its center is at (x,y)
+
+x y w (text) scalecentertext - to output (text) so that its center is at (x,y) and is not wider than w
+
+x y (text) righttext - to output (text) so that its right bottom edge is at (x,y)
+
+x y (text) left - to output (text) so that its left bottom edge is at (x,y)
+
+---------------------------------------------------------*/
+
+function _HYPSTextCommands (dummy)
+{
+	_res_string = "";
+	_res_string * 64;
+	_res_string * "/centertext {dup newpath 0 0 moveto false charpath closepath pathbbox pop exch pop exch sub 2 div 4 -1 roll exch sub 3 -1 roll newpath moveto show} def\n";
+	_res_string * "/vcentertext {90 rotate centertext -90 rotate} def\n";
+	_res_string * "/lefttext   {newpath 3 1 roll moveto show} def\n";
+	_res_string * "/drawletter {2 2 rmoveto 1 copy false charpath pathbbox 2 index 3 sub sub exch 3 index 3 sub sub exch  0.85 setgray 4 copy rectfill 0 setgray  3 index 3 index currentlinewidth 0.5 setlinewidth 7 3 roll rectstroke setlinewidth exch 1.5 add exch 1.5 add moveto show} def\n";
+	_res_string * "/righttext  {dup newpath 0 0 moveto false charpath closepath pathbbox pop exch pop exch sub       4 -1 roll exch sub 3 -1 roll newpath moveto show} def\n";
+	_res_string * "/vrighttext  {3 -2 roll moveto 90 rotate show -90 rotate} def\n";
+	_res_string * ("/scalecentertext {dup newpath 0 0 moveto false charpath closepath pathbbox 3 -1 roll sub 3 1 roll exch sub dup 5 -1 roll exch div dup 1 lt " +
+				   "{dup 3 1 roll mul 2 div 6 -1 roll exch sub 3 1 roll dup 3 1 roll mul 2 div 5 -1 roll exch sub exch true 4 2 roll} " + 
+	               "{pop 2 div 5 -1 roll exch sub exch 2 div 4 -1 roll exch sub false 3 -2 roll} ifelse newpath moveto {matrix currentmatrix exch dup scale exch show setmatrix} {show}  ifelse } def\n");
+	_res_string * 0;
+	return _res_string;
+}
+_timesCharWidths = /* Hardcoded relative widths of all 255 characters in the Times font, for the use of _HYPSTextTable */
+{{
+0,0.721569,0.721569,0.721569,0.721569,0.721569,0.721569,0.721569,0,0.25098,0.721569,0.721569,0.721569,0,0.721569,0.721569,
+0.721569,0.721569,0.721569,0.721569,0.721569,0.721569,0.721569,0.721569,0.721569,0.721569,0.721569,0.721569,0.721569,0,0.721569,0.721569,
+0.25098,0.333333,0.407843,0.501961,0.501961,0.831373,0.776471,0.180392,0.333333,0.333333,0.501961,0.564706,0.25098,0.333333,0.25098,0.278431,
+0.501961,0.501961,0.501961,0.501961,0.501961,0.501961,0.501961,0.501961,0.501961,0.501961,0.278431,0.278431,0.564706,0.564706,0.564706,0.443137,
+0.921569,0.721569,0.666667,0.666667,0.721569,0.611765,0.556863,0.721569,0.721569,0.333333,0.388235,0.721569,0.611765,0.890196,0.721569,0.721569,
+0.556863,0.721569,0.666667,0.556863,0.611765,0.721569,0.721569,0.945098,0.721569,0.721569,0.611765,0.333333,0.278431,0.333333,0.470588,0.501961,
+0.333333,0.443137,0.501961,0.443137,0.501961,0.443137,0.333333,0.501961,0.501961,0.278431,0.278431,0.501961,0.278431,0.776471,0.501961,0.501961,
+0.501961,0.501961,0.333333,0.388235,0.278431,0.501961,0.501961,0.721569,0.501961,0.501961,0.443137,0.478431,0.2,0.478431,0.541176,0.721569,
+0.721569,0.721569,0.666667,0.611765,0.721569,0.721569,0.721569,0.443137,0.443137,0.443137,0.443137,0.443137,0.443137,0.443137,0.443137,0.443137,
+0.443137,0.443137,0.278431,0.278431,0.278431,0.278431,0.501961,0.501961,0.501961,0.501961,0.501961,0.501961,0.501961,0.501961,0.501961,0.501961,
+0.501961,0.4,0.501961,0.501961,0.501961,0.34902,0.454902,0.501961,0.760784,0.760784,0.980392,0.333333,0.333333,0.54902,0.890196,0.721569,
+0.713725,0.54902,0.54902,0.54902,0.501961,0.576471,0.494118,0.713725,0.823529,0.54902,0.27451,0.27451,0.309804,0.768627,0.666667,0.501961,
+0.443137,0.333333,0.564706,0.54902,0.501961,0.54902,0.611765,0.501961,0.501961,1,0.25098,0.721569,0.721569,0.721569,0.890196,0.721569,
+0.501961,1,0.443137,0.443137,0.333333,0.333333,0.54902,0.494118,0.501961,0.721569,0.168627,0.745098,0.333333,0.333333,0.556863,0.556863,
+0.501961,0.25098,0.333333,0.443137,1,0.721569,0.611765,0.721569,0.611765,0.611765,0.333333,0.333333,0.333333,0.333333,0.721569,0.721569,
+0.788235,0.721569,0.721569,0.721569,0.721569,0.278431,0.333333,0.333333,0.333333,0.333333,0.333333,0.333333,0.333333,0.333333,0.333333,0.333333
+}};
+
+_timesCharMaxWidth = 0.980392;
+
+_asciiCharString   = "!\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_\`abcdefghijklmnopqrstuvwxyz{|}";
+_charWidthForTimes = {};
+
+for (_i = 0; _i < Abs(_asciiCharString); _i=_i+1)
+{
+	_charWidthForTimes[_asciiCharString[_i]] = _timesCharWidths[33+_i];
+}
+
+/*---------------------------------------------------------
+
+genearete a pattern dictionary for a simple hatching pattern
+
+---------------------------------------------------------*/
+
+function _HYPSHatchRectanglePattern (angle,spacing,width,height,color,name,offset_x,offset_y)
+{
+	_patternDef = "";
+	_patternDef * 128;
+		
+	_patternDef * (""+offset_x+" "+offset_y + " translate\n");	
+	_patternDef * "<< % Begin prototype pattern dictionary\n/PaintType 1\n/PatternType 1\n/TilingType 1";
+    _patternDef * ("/BBox [0 0 " + (width) + " " + (height) + "]\n/XStep "+width+" \n/YStep " + height + "\n/PaintProc\n{\nbegin\n");
+	_patternDef * ("" + color[0] + " " + color[1] + " " + color[2] + " setrgbcolor\n");
+	
+	if (angle != 90)
+	{
+		_x1 = height/Tan(angle*Arctan(1)/45);
+	}
+	else
+	{
+		_x1 = 0;
+	}
+	_x  = -((Abs(_x1)$spacing)*spacing)-0.5; 
+	_x  = 0.5;
+	while (_x < width)
+	{
+		_patternDef * ("\n" + _x + " 0 moveto " + (_x + _x1) + " " + height + " lineto stroke");
+		_x = _x + spacing; 
+	}
+	
+	_patternDef * ("\nend\n}\n>>matrix\nmakepattern\n/" + name + " exch def\n");
+	_patternDef * ("-"+offset_x+" -"+offset_y + " translate\n");	
+	_patternDef * 0;
+	return _patternDef;
+}
+
+
+/*---------------------------------------------------------
+
+layout an NxM square text table (one line per cell)
+takes in a pair of dimensions, font size, an NxM text matrix
+and an NxM integer matrix on whether or not to draw cell boundaries
+(masks: 1 for L, 2 for R, 4 for T, 8 for B)
+
+---------------------------------------------------------*/
+
+function _HYPSGetStringWidth (s)
+{
+	_w = 0;
+	for (_i = 0; _i < Abs(s); _i = _i + 1)
+	{
+		_w = _w + _charWidthForTimes[s[_i]];
+	}
+	return _w;
+}
+
+
+/*---------------------------------------------------------
+
+layout an NxM square text table (one line per cell)
+takes in a pair of dimensions, font size, an NxM text matrix
+and an NxM integer matrix on whether or not to draw cell boundaries
+(masks: 1 for L, 2 for R, 4 for T, 8 for B)
+
+---------------------------------------------------------*/
+
+function _HYPSTextTable (w,h,fs,tableText,cellBounds)
+{
+	_res_string = "";
+	_res_string * 64;
+	
+	_columns = Columns(tableText);
+	_rows	 = Rows   (tableText);
+	_columnWidths = {_columns,1};
+	_hBuffer	  = fs * 0.15;
+	_cellHeight   = fs + _hBuffer;
+	_tH			  = _rows * _cellHeight;
+	
+	for 	(_i = 0; _i < _rows; _i = _i + 1)
+	{
+		for 	(_j = 0; _j < _columns; _j = _j + 1)
+		{
+			_strVal = tableText[_i][_j];
+			_strLen = Abs(_strVal);
+			_cw		= _timesCharMaxWidth;
+			for (_k = 0; _k < _strLen; _k=_k+1)
+			{
+				_chW = _charWidthForTimes[_strVal[_k]];
+				if (_chW)
+				{
+					_cw = _cw + _chW;
+				}
+				else
+				{
+					_cw = _cw + _timesCharMaxWidth;
+				}
+			}
+			_columnWidths[_j] = Max (_columnWidths[_j] , _cw);
+		}
+	}
+	_columnWidths = _columnWidths * fs;
+	_tW = ((Transpose(_columnWidths))["1"] * _columnWidths)[0];
+	if (_tW < w)
+	{
+		_tW = (w-_tW) / _columns;
+		for 	(_j = 0; _j < _columns; _j = _j + 1)
+		{
+			_columnWidths[_j] = _columnWidths[_j] + _tW;
+		}
+		_scale = 1;
+	}
+	else
+	{
+		_scale = Min(1,Min(w/_tW,h/_tH));
+	}
+	if (_scale < 1)
+	{
+		_res_string * ("" + _scale + " dup scale\n");	
+	}
+	
+	_tH = _tH - _cellHeight;
+	for 	(_i = 0; _i < _rows; _i = _i + 1)
+	{
+		_currentLeft = 0;
+		for 	(_j = 0; _j < _columns; _j = _j + 1)
+		{
+			_res_string * ("" + (_currentLeft+_timesCharMaxWidth*fs/2) + " " + (_tH+2*_hBuffer)  + " (" + tableText[_i][_j] + ") lefttext\n");
+			cellMarker = cellBounds[_i][_j];
+			_currentRight = _currentLeft + _columnWidths[_j];
+			if (cellMarker % 2 == 1) /* left */
+			{
+				_res_string * ("newpath " + _currentLeft + " " + _tH + " moveto 0 " + _cellHeight + " rlineto stroke\n");
+			}
+			cellMarker = cellMarker$2;
+			if (cellMarker % 2 == 1) /* right */
+			{
+				_res_string * ("newpath " + _currentRight + " " + _tH + " moveto 0 " + _cellHeight + " rlineto stroke\n");
+			}
+			cellMarker = cellMarker$2;
+			if (cellMarker % 2 == 1) /* top */
+			{
+				_res_string * ("newpath " + _currentLeft + " " + (_tH+_cellHeight)  + " moveto " + _columnWidths[_j] + " 0 rlineto stroke\n");
+			}
+			cellMarker = cellMarker$2;
+			if (cellMarker % 2 == 1) /* bottom */
+			{
+				_res_string * ("newpath " + _currentLeft + " " + (_tH)  + " moveto " + _columnWidths[_j] + " 0 rlineto stroke\n");
+			}
+			_currentLeft = _currentRight;
+		}
+		/* do the border now */
+		_tH = _tH - _cellHeight;
+	}
+	
+	
+	if (_scale < 1)
+	{
+		_res_string * ("" + 1/_scale + " dup scale\n");	
+	}
+	_res_string * 0;
+	return _res_string;	
+}
+
+/*---------------------------------------------------------
+
+draw a sequence profile box: colored (and labeled) 
+partitioned rectangles
+
++-------------+-----------+-------+
+|  A (100bp)  | B (200bp) |A(100bp|
++-------------+-----------+-------+
+
+takes dimensions _w and _h, font size _f an Nx2 matrix with partition 
+width labels (1st row) and proportional widths (2nd row) and an Nx6 matrix 
+with the colors (RGB for the background and RGB for the text)
+
+---------------------------------------------------------*/
+
+_hyDefaultPSColors =
+{
+{255,0,0}
+{0,0,255}
+{0,255,0}
+{255,0,255}
+{0,255,255}
+{255,255,0}
+{102,0,153}
+{255,204,0}
+{153,255,153}
+{102,153,51}
+{102,204,102}
+{0,51,153}
+{255,102,0}
+{153,153,51}
+{255,153,0}
+{153,51,102}
+{153,153,153}
+{102,102,153}
+{153,51,51}
+{204,51,51}
+{102,153,102}
+}*(1/255);
+
+_hyDefaultGS =
+{6,3}["(220-_MATRIX_ELEMENT_ROW_*30)/255"];
+
+function _HYPSLabeledBoxes (_x, _y, _f, _boxes, _colors)
+{
+	_res_string = "";
+	_res_string * 64;
+	_box_dimensions = {};
+	_partCount = Rows(_boxes);
+	if (_partCount)
+	{
+		if (Columns(_colors) == 6 && Rows(_colors) == _partCount)
+		{
+			_res_string * "currentrgbcolor\n";
+			_currentX 			= 0;
+			_textLocation 		= _y/2;
+			
+			for 	(_i = 0; _i < _partCount; _i = _i + 1)
+			{
+				_res_string * ("" + _colors[_i][0] + " " + _colors[_i][1] + " " + _colors[_i][2] + " setrgbcolor\n");
+				_boxWidth = (0+_boxes[_i][1])*_x;
+				_res_string * ("" + _currentX + " 0 " + _boxWidth + " " + _y + " rectfill\n");
+				_res_string * ("" + _colors[_i][3] + " " + _colors[_i][4] + " " + _colors[_i][5] + " setrgbcolor\n");
+				_res_string * ("" + (_currentX + _boxWidth/2) + " " + _textLocation + " " + _boxWidth + " (" + _boxes[_i][0] + ") scalecentertext\n");
+				_box_dimensions[_i] = {{_currentX__,_boxWidth__,_y}};
+				_currentX = _currentX + _boxWidth;
+			}
+		}
+		_res_string * "0 0 0 setrgbcolor currentlinewidth 1 setlinewidth\n";
+		_res_string * ("0 0 "+ (_x) + " " + (_y) + " rectstroke setlinewidth\n");
+		_res_string * "setrgbcolor\n";
+	}
+	_res_string * 0;
+	_retValue = {};
+	_retValue["PS"] 		= _res_string;
+	_retValue["Dimensions"] = _box_dimensions;
+	return _retValue;
+}
+
+
diff --git a/res/TemplateBatchFiles/Utility/ProbabilityDistributions.bf b/res/TemplateBatchFiles/Utility/ProbabilityDistributions.bf
new file mode 100644
index 0000000..9dc4382
--- /dev/null
+++ b/res/TemplateBatchFiles/Utility/ProbabilityDistributions.bf
@@ -0,0 +1,92 @@
+_piConst = 4*Arctan (1);
+
+/*-------------------------------------------------*/
+
+function sampleFromPoisson (lambda)
+{
+	_sampledValue = Random (0, Exp(lambda));
+	_sum		  = 1;
+	_term		  = 1;
+	_k			  = 0;
+	
+	while (_sum < _sampledValue)
+	{
+		_k = _k+1;
+		_term = _term * lambda/_k;
+		_sum = _sum + _term;
+	}
+	return _k;
+}
+
+/*-------------------------------------------------*/
+
+function sampleFromGamma (alpha,beta)
+{
+	_sampledValue = Random (0,1);
+	FindRoot (_k,CGammaDist(_x_,alpha,beta)-_sampledValue,_x_,0,2500);
+	return _k;
+}
+
+/*-------------------------------------------------*/
+
+function sampleFromBeta (p,q)
+{
+	_sampledValue = Random (0,1);
+	FindRoot (_k,IBeta(_x_,p,q)-_sampledValue,_x_,0,1);
+	return _k;
+}
+
+/*-------------------------------------------------*/
+
+function sampleFromNormal ()
+{
+	/* Box-Muller */
+	
+	return Sqrt (-2*Log (Random (1e-26,1)))*Cos (2 * _piConst * Random (1e-26,1));
+}
+
+/*-------------------------------------------------*/
+
+function linearFit (xy)
+{
+    data_rows = Rows(xy);
+    ss = data_rows;
+    sx = +(xy[-1][0]);
+    sy = +(xy[-1][1]);
+    sxoss = sx/ss;
+				
+    fitB = 0;
+    st2  = 0;
+				
+    sxx = 0;
+    syy = 0;
+    sxy = 0;
+    ax  = sx/data_rows;
+    ay  = sy/data_rows;
+				
+    for (count = 0; count<data_rows; count += 1)
+    {
+        xt = xy[count][0]-ax;
+        yt = xy[count][1]-ay;
+        sxx += (xt)^2;
+        syy += (yt)^2;
+        sxy += xt*yt;
+        t    = xy[count][0]-sxoss;
+        st2  = st2+t*t;
+        fitB += t*xy[count][1];
+    }
+
+    fitB = fitB/st2;
+    fitA = (sy-sx*fitB)/ss;
+    varA = Sqrt ((1+sx*sx/(ss*st2))/ss);
+    varB = Sqrt (1/st2);
+    
+    return {"Correlation": sxy/Sqrt(sxx*syy),
+            "Intercept": fitA,
+            "Slope"    : fitB,
+            "Var(Intercept)": varA,
+            "Var(Slope)": varB};
+    
+}
+
+
diff --git a/res/TemplateBatchFiles/Utility/ReadDelimitedFiles.bf b/res/TemplateBatchFiles/Utility/ReadDelimitedFiles.bf
new file mode 100644
index 0000000..39bde0c
--- /dev/null
+++ b/res/TemplateBatchFiles/Utility/ReadDelimitedFiles.bf
@@ -0,0 +1,511 @@
+/*----------------------------------------------------------------*/
+
+function ReadCSVTable (fileName, haveHeader)
+{
+	if (Abs(fileName) == 0) {
+		fscanf (PROMPT_FOR_FILE, REWIND, "Lines", inData);
+	}
+	else {
+		fscanf (fileName, REWIND, "Lines", inData);		
+	}
+	if (haveHeader) {
+		output = {};
+		output[0] = splitOnRegExp (inData[0],"\\,");
+	}
+	felMXString = "";
+	felMXString * 256;
+	felMXString * "{";
+	if (haveHeader > 1)
+	{
+		rowHeaders = {Columns(inData) - 1, 1};
+		for (lineID = 1; lineID < Columns(inData); lineID = lineID + 1)
+		{
+			_tempMatrix = inData[lineID]$"\\,";
+			if (_tempMatrix[0]>=0)
+			{
+				rowHeaders [lineID-1] = (inData[lineID])[0][_tempMatrix[0]-1];
+				felMXString * ("{" + (inData[lineID])[_tempMatrix[0]+1][Abs(inData[lineID])-1] + "}\n");
+			}
+		}		
+		output [2] = rowHeaders;
+	}
+	else
+	{
+		for (lineID = haveHeader; lineID < Columns(inData); lineID += 1) {
+			felMXString * ("{" + inData[lineID] + "}\n");
+		}
+	}
+	felMXString * "}";
+	felMXString * 0;
+	felMXString = Eval (felMXString);
+	inData = 0;
+	if (haveHeader)
+	{
+		output[1] = felMXString;
+		felMXString = 0;
+		return output;
+	}
+	return felMXString;
+}
+
+/*----------------------------------------------------------------*/
+
+lfunction ReadCSVTableText (fileName, haveHeader)
+{
+	if (Abs(fileName) == 0) {
+		fscanf (PROMPT_FOR_FILE, REWIND, "Lines", inData);
+	}
+	else {
+		fscanf (fileName, REWIND, "Lines", inData);		
+	}
+	if (haveHeader) {
+		output = {};
+		output[0] = splitOnRegExp (inData[0],"\\,");
+	}
+	
+	_theMatrix = {};
+	
+	if (haveHeader > 1)
+	{
+		rowHeaders = {Columns(inData) - 1, 1};
+		for (lineID = 1; lineID < Columns(inData); lineID += 1)
+		{
+			_tempMatrix = inData[lineID]$"\\,";
+			if (_tempMatrix[0]>=0)
+			{
+				rowHeaders [lineID-1] = (inData[lineID])[0][_tempMatrix[0]-1];
+				felMXString * ("{" + (inData[lineID])[_tempMatrix[0]+1][Abs(inData[lineID])-1] + "}\n");
+			}
+		}		
+		output [2] = rowHeaders;
+	}
+	else
+	{
+		for (lineID = haveHeader; lineID < Columns(inData); lineID += 1) {
+			values = splitOnRegExp (inData[lineID], "\\,");
+			_theMatrix + {};
+			for (columnID = 0; columnID < Abs (values); columnID += 1) {
+			    theEntry = values[columnID];
+			    isQuoted = Abs(theEntry)>=2 && theEntry[0]=="\"" && theEntry[Abs(theEntry)-1] == "\"";
+			    if (isQuoted) {
+			        if (Abs(theEntry) == 2) {
+			            (_theMatrix[Abs(_theMatrix)-1]) + "";
+			        }
+			        else {
+			            (_theMatrix[Abs(_theMatrix)-1]) + theEntry[1][Abs(theEntry)-2];
+			        }
+			    } else {
+			        (_theMatrix[Abs(_theMatrix)-1]) + theEntry;			    
+			    }
+			}
+		}
+	}
+	if (haveHeader) {
+		output[1] = _theMatrix;
+		_theMatrix = 0;
+		return output;
+	}
+	return _theMatrix;
+}
+
+
+
+/*----------------------------------------------------------------*/
+
+function ReadMatchRegExp (fileName, regExp)
+{
+	if (Abs(fileName) == 0)
+	{
+		fscanf (PROMPT_FOR_FILE, REWIND, "Lines", inData);
+	}
+	else
+	{
+		fscanf (fileName, REWIND, "Lines", inData);		
+	}
+	
+	linesRead = Columns(inData);
+	_tempMatrix = {linesRead,1};
+	
+	for (lineID = 0; lineID < linesRead; lineID = lineID + 1)
+	{
+		aLine   = inData[lineID];
+		regExpM = aLine $ regExp;
+		if (regExpM [0] >= 0)
+		{
+			sidx = regExpM[0];
+			eidx = regExpM[1];
+			_tempMatrix[lineID] = 0+aLine[sidx][eidx];
+		}
+	}
+	return _tempMatrix;
+}
+
+/*----------------------------------------------------------------*/
+
+function ReadSplitOnRegExp (fileName, regExp)
+{
+	return ReadSplitOnRegExpCallback (fileName, regExp, "");	
+}
+
+/*----------------------------------------------------------------*/
+
+function ReadSplitOnRegExpCallback (fileName, regExp,func)
+{
+	if (Abs(fileName) == 0)
+	{
+		fscanf (PROMPT_FOR_FILE, REWIND, "Lines", inData);
+	}
+	else
+	{
+		fscanf (fileName, REWIND, "Lines", inData);		
+	}
+	
+	linesRead = Columns(inData);
+	if (Abs(func) == 0)
+	{
+		_tempMatrix = {};
+	}
+	
+	for (lineID = 0; lineID < linesRead; lineID = lineID + 1)
+	{
+		if (Abs(func))
+		{
+            thisLine = inData[lineID];
+			ExecuteCommands ("_lineStatus = " + func + "(splitOnRegExp (thisLine, regExp),lineID)"); 
+			if (_lineStatus < 0)
+			{
+				return 1;
+			}
+		}
+		else
+		{
+			_tempMatrix[lineID] = splitOnRegExp (inData[lineID], regExp);
+		}
+	}
+	if (Abs(func) == 0)
+	{
+		return _tempMatrix;
+	}
+	return 0;
+}
+
+/*----------------------------------------------------------------*/
+
+function ReadTabTable (fileName, haveHeader)
+{
+	if (Abs(fileName) == 0)
+	{
+		fscanf (PROMPT_FOR_FILE, REWIND, "Lines", inData);
+	}
+	else
+	{
+		fscanf (fileName, REWIND, "Lines", inData);		
+	}
+	if (haveHeader)
+	{
+		output = {};
+		output[0] = splitStringByTab (inData[0]);
+	}
+	felMXString = "";
+	felMXString * 256;
+	felMXString * "_tempMatrix={";
+	for (lineID = haveHeader; lineID < Columns(inData); lineID = lineID + 1)
+	{
+		felMXString * ("{" + inData[lineID]^{{"[^0-9eE\.\+\-]+",","}} + "}\n");
+	}
+	felMXString * "}";
+	felMXString * 0;
+	ExecuteCommands (felMXString);
+	felMXString = 0;
+	inData = 0;
+	if (haveHeader)
+	{
+		output[1] = _tempMatrix;
+		_tempMatrix = 0;
+		return output;
+	}
+	return _tempMatrix;
+}
+
+/*----------------------------------------------------------------*/
+
+function splitOnRegExp (string, splitter)
+{
+	matched = string || splitter;
+	splitBits = {};
+	if (matched [0] < 0)
+	{
+		splitBits[0] = string;
+	}
+	else
+	{
+		mc = 0;
+		if (matched[0] == 0)
+		{
+			fromPos = matched[1]+1;
+			mc = 2;
+		}
+		else
+		{
+			fromPos = 0;
+			toPos	= 0;
+		}
+		for (; mc < Rows (matched); mc = mc+2)
+		{
+			toPos = matched[mc]-1;
+			splitBits [Abs(splitBits)] = string[fromPos][toPos];
+			fromPos    = matched[mc+1]+1;
+		}
+		splitBits [Abs(splitBits)] = string[fromPos][Abs(string)-1];
+	}
+	return splitBits;
+}
+
+
+/*----------------------------------------------------------------*/
+
+function extractSubexpressions (string, splitter, merge, spacer)
+{
+	matched = string $ splitter;
+	if (merge)
+	{
+		splitBits = "";
+		splitBits * 128;
+	}
+	else
+	{
+		splitBits = {};
+	}
+	rMatched = Rows(matched);
+	if (rMatched>2)
+	{
+		if (merge)
+		{
+			for (mc = 2; mc < rMatched; mc = mc+2)
+			{
+				if (mc>2)
+				{
+					splitBits * spacer;
+				}
+				splitBits * string[matched[mc]][matched[mc+1]];
+			}
+		}		
+		else
+		{
+			for (mc = 2; mc < rMatched; mc = mc+2)
+			{
+				splitBits [Abs(splitBits)] = string[matched[mc]][matched[mc+1]];
+			}
+		}
+	}
+	if (merge)
+	{
+		splitBits * 0;		
+	}
+	return splitBits;
+}
+
+/*----------------------------------------------------------------*/
+
+function findAllUniqueExpressions (list, regExp, isMatrix)
+{
+	uniqueExpressions = {};
+	if (isMatrix)
+	{
+		totalCount = Rows(list)*Columns(list);
+	}
+	else
+	{
+		totalCount = Abs (list);
+	}
+	
+	for (_k = 0; _k < totalCount; _k += 1)
+	{
+		matchRes = list[_k] $ regExp;
+		if (matchRes[0] >= 0)
+		{
+			matchRes = (list[_k])[matchRes[0]][matchRes[1]];
+			uniqueExpressions [matchRes] += 1;
+		}
+	}
+	
+	return uniqueExpressions;
+}
+
+
+/*----------------------------------------------------------------*/
+
+function extractAllExpressions (_string, _splitter, _subexpression)
+{
+	_matched = _string || _splitter;
+	_splitBits = {};
+	if (_matched [0] >= 0)
+	{
+		if (Abs(_subexpression))
+		{
+			for (_mc = 0; _mc < Rows (_matched); _mc = _mc+2)
+			{
+				_splitBits [Abs(_splitBits)] = extractSubexpressions(_string[_matched[_mc]][_matched[_mc+1]],_subexpression,1,"");
+			}
+		}
+		else
+		{
+			for (_mc = 0; _mc < Rows (_matched); _mc = _mc+2)
+			{
+				_splitBits [Abs(_splitBits)] = _string[_matched[_mc]][_matched[_mc+1]];
+			}		
+		}
+	}
+	return _splitBits;
+}
+
+/*----------------------------------------------------------------*/
+
+function splitStringByTab (inString)
+{
+	bits      = {};
+	lastIndex = 0;
+	strlen 	  = Abs(inString);
+	
+	for (currentIndex = 0; currentIndex < strlen; currentIndex = currentIndex + 1)
+	{
+		cchar = inString[currentIndex];
+		if (cchar == "\t")
+		{
+			if (currentIndex == lastIndex)
+			{
+				bits[Abs(bits)] = "";
+			}
+			else
+			{
+				bits[Abs(bits)] = inString[lastIndex][currentIndex-1];
+				lastIndex = currentIndex + 1;
+			}
+		}
+	}
+	if (currentIndex>lastIndex)
+	{
+		bits[Abs(bits)] = inString[lastIndex][currentIndex-1];
+	}
+	
+	return bits;
+}
+
+/*----------------------------------------------------------------*/
+
+function normalizeSequenceID (seqName, alreadyDefined&)
+{
+	_testSeqName 	= seqName ^ {{"[^a-zA-Z0-9\\_]","_"}};
+	_testSeqName 	= _testSeqName ^ {{"_+","_"}};
+	_testSeqName2	= _testSeqName;
+	
+	for (currentIndex = 2; ;currentIndex=currentIndex+1)
+	{	
+		_z = alreadyDefined[_testSeqName2];
+		if (_z==0)
+		{
+			alreadyDefined[_testSeqName2] = 1;
+			break;
+		}
+		_testSeqName2 = _testSeqName + "_" + currentIndex;
+	}
+	return _testSeqName2;
+}
+
+/*----------------------------------------------------------------*/
+
+function normalizeSequenceNamesInAFilter (filterName)
+{
+	return normalizeSequenceNamesInAFilterWithTree (filterName, "");
+}
+
+/*----------------------------------------------------------------*/
+
+function normalizeSequenceNamesInAFilterWithTree (filterName, treeName)
+{
+    if (Abs (treeName) > 0) {
+        LoadFunctionLibrary ("TreeTools");
+        ExecuteCommands ("_treeAVL = `treeName`^0");
+        _node_id_by_name = {};
+        for (_nodeID = 1; _nodeID < Abs(_treeAVL); _nodeID += 1) {
+            _node_id_by_name [(_treeAVL[_nodeID])["Name"]] = _nodeID;
+        }
+    }
+    
+ 	ExecuteCommands ("GetString(_seqNames,`filterName`,-1)");
+	
+	_renamingBuffer = {};
+	
+	_totalRenamed = 0;
+	for (_k = 0; _k < Columns (_seqNames); _k+=1)
+	{
+		_seqName2 = normalizeSequenceID(_seqNames[_k],"_renamingBuffer");
+		if (_seqName2 != _seqNames[_k])
+		{
+			ExecuteCommands ("SetParameter (`filterName`,_k,_seqName2)");
+			if (Abs (treeName) > 0) {
+			    (_treeAVL[_node_id_by_name [_seqNames[_k]]])["Name"] = _seqName2;
+			}
+
+			_totalRenamed += 1;
+		}
+	}
+	
+	if (_totalRenamed && Abs (treeName) > 0) {
+	    ExecuteCommands ("Topology `treeName` = " + PostOrderAVL2String (_treeAVL));
+	}
+	
+	return _totalRenamed;
+}
+
+/*----------------------------------------------------------------*/
+
+function matchStringToSetOfPatterns (str, patterns)
+{
+	for (currentIndex = 0; currentIndex < Abs(patterns);currentIndex=currentIndex+1)
+	{
+		if ((str$patterns[currentIndex])[0] >= 0)
+		{
+			return currentIndex;
+		}
+	}
+	return -1;
+}
+
+/*----------------------------------------------------------------*/
+
+function splitFilterBasedOnRegExp (filterName, patterns)
+{
+	ExecuteCommands ("GetString(_seqNames,`filterName`,-1)");
+	
+	sequenceByRegExp = {};
+	
+	for (_k = 0; _k < Abs(patterns); _k += 1)
+	{
+		aPattern = patterns["INDEXORDER"][_k];
+		subfilterName = patterns[aPattern];
+		ExecuteCommands ("DataSetFilter `subfilterName` = CreateFilter (`filterName`,1,\"\",(_seqNames[speciesIndex]$\"`aPattern`\")[0]>=0)");
+		sequenceByRegExp[subfilterName] = Eval ("`subfilterName`.species");
+	}
+	return sequenceByRegExp;
+}
+
+/*----------------------------------------------------------------*/
+
+function condenseFilterIntoUniqueSequences (filterName, returnName, matchMode)
+{
+	ExecuteCommands ("GetDataInfo(_uniquePatterns,`filterName`," + matchMode + ")");
+	ExecuteCommands ("GetString(_seqNames,`filterName`,-1)");
+
+	_filterMeIn = {};
+	for (_k = 0; _k < Columns (_uniquePatterns["UNIQUE_INDICES"]); _k+=1)
+	{
+		_filterMeIn[(_uniquePatterns["UNIQUE_INDICES"])[_k]] = (_uniquePatterns["UNIQUE_COUNTS"])[_k];
+		ExecuteCommands ("SetParameter(`filterName`,
+				(_uniquePatterns[\"UNIQUE_INDICES\"])[_k],
+				_seqNames[(_uniquePatterns[\"UNIQUE_INDICES\"])[_k]] + \"_\" + (_uniquePatterns[\"UNIQUE_COUNTS\"])[_k]);");
+	}
+	ExecuteCommands ("DataSetFilter `returnName` = CreateFilter(`filterName`,1,,Abs(_filterMeIn[speciesIndex])>0)");
+	
+	return 0;
+}
diff --git a/res/TemplateBatchFiles/Utility/TreeFunctions.bf b/res/TemplateBatchFiles/Utility/TreeFunctions.bf
new file mode 100644
index 0000000..0a22d9b
--- /dev/null
+++ b/res/TemplateBatchFiles/Utility/TreeFunctions.bf
@@ -0,0 +1,58 @@
+/*---------------------------------------------------------*/
+
+function computeTotalDivergence (treeID)
+{
+	bNames = BranchName   (^treeID,-1);
+	bLen   = BranchLength (^treeID,-1);
+	
+	sum  = 0;
+	sum2 = +bLen;
+	
+	for (_k=0; _k<Columns(bNames); _k += 1) {
+		sum += bLen[_k]*multFactors[bNames[_k]];
+	}	
+	return {{sum__,sum2__}};
+}
+
+/*---------------------------------------------------------*/
+
+function computeMultFactors (treeID)
+{
+	treeAVL2 = (^treeID)^ 0;
+	leafCount=Max(2,TipCount(^treeID)); 
+	
+	multFactors = {};
+	
+	for (_k=1; _k<Abs(treeAVL2); _k += 1)
+	{
+		aNode			= treeAVL2[_k];
+		aNodeName		= aNode["Name"];
+		parentIndex		= aNode["Parent"];
+		_k2				= Abs(aNode["Children"]);
+		if (_k2)
+		{
+			currentDepth		   = aNode["Below"];
+			multFactors[aNodeName] = currentDepth;		
+			if (parentIndex > 0)
+			{
+				(treeAVL2[parentIndex])["Below"] += currentDepth;
+			}
+		}
+		else
+		{
+			multFactors[aNodeName]		= 1;
+			(treeAVL2[parentIndex])["Below"] += 1;
+		}
+		
+	}
+
+	pKeys 			= Rows(multFactors);
+	for (_k=0; _k<Columns(pKeys); _k=_k+1)
+	{
+		aNodeName = pKeys[_k];
+		multFactors[aNodeName] = multFactors[aNodeName] * (leafCount-multFactors[aNodeName]);
+	}
+	
+	return 0;
+}
+
diff --git a/res/TemplateBatchFiles/Utility/WriteDelimitedFiles.bf b/res/TemplateBatchFiles/Utility/WriteDelimitedFiles.bf
new file mode 100644
index 0000000..e4f917a
--- /dev/null
+++ b/res/TemplateBatchFiles/Utility/WriteDelimitedFiles.bf
@@ -0,0 +1,55 @@
+function WriteSeparatedTable (fileName, column_headers, numeric_data, first_column, delimiter)
+{
+	if (Abs(fileName) == 0)
+	{
+		fprintf (PROMPT_FOR_FILE, CLEAR_FILE, KEEP_OPEN);
+		_f2r = LAST_FILE_PATH; 
+	}
+	else
+	{
+		fprintf (fileName, CLEAR_FILE, KEEP_OPEN);
+		_f2r = fileName; 
+	}
+	
+	_rd = Columns (column_headers);
+	if (_rd)
+	{
+		fprintf (_f2r, column_headers[0]);
+		for (_gb_idx = 1; _gb_idx < _rd; _gb_idx = _gb_idx + 1)
+		{
+			fprintf (_f2r, delimiter, column_headers[_gb_idx]);
+		}
+	}
+	_rd2 = Abs (first_column);
+	if (_rd2)
+	{
+		for (_gb_idx = 0; _gb_idx < _rd2; _gb_idx = _gb_idx + 1)
+		{
+			fprintf (_f2r, "\n", first_column[_gb_idx]);
+			for (_gb_idx2 = 1; _gb_idx2 < _rd; _gb_idx2 = _gb_idx2 + 1)
+			{
+				fprintf (_f2r, delimiter, numeric_data[_gb_idx][_gb_idx2-1]);		
+			}
+		}
+	}
+	else
+	{
+		_rd2 = Rows (numeric_data);
+		if (_rd == 0)
+		{
+			_rd = Columns (numeric_data);
+		}
+		for (_gb_idx = 0; _gb_idx < _rd2; _gb_idx = _gb_idx + 1)
+		{
+			fprintf (_f2r, "\n", numeric_data[_gb_idx][0]);
+			for (_gb_idx2 = 1; _gb_idx2 < _rd; _gb_idx2 = _gb_idx2 + 1)
+			{
+				fprintf (_f2r, delimiter, numeric_data[_gb_idx][_gb_idx2]);		
+			}
+		}
+	}
+	
+	fprintf (_f2r, CLOSE_FILE);
+	return 0;
+}
+
diff --git a/res/TemplateBatchFiles/WANC.bf b/res/TemplateBatchFiles/WANC.bf
new file mode 100644
index 0000000..8fbedc0
--- /dev/null
+++ b/res/TemplateBatchFiles/WANC.bf
@@ -0,0 +1,379 @@
+function _siteWeighter_ (treeIndex, siteIndex)
+{						
+	_SITE_OS_COUNT = matrixTrick*(_OBSERVED_S_$STATE_COUNT_MATRIX)*Transpose(matrixTrick);
+	_SITE_ON_COUNT = matrixTrick*(_OBSERVED_NS_$STATE_COUNT_MATRIX)*Transpose(matrixTrick);
+	_SITE_ES_COUNT = matrixTrick*(_PAIRWISE_S_$WSTATE_COUNT_MATRIX)*Transpose(matrixTrick);
+	_SITE_EN_COUNT = matrixTrick*(_PAIRWISE_NS_$WSTATE_COUNT_MATRIX)*Transpose(matrixTrick);
+	
+	resultMatrix[siteIndex][0] = _SITE_OS_COUNT[0];
+	resultMatrix[siteIndex][1] = _SITE_ON_COUNT[0];
+	resultMatrix[siteIndex][2] = _SITE_ES_COUNT[0];
+	resultMatrix[siteIndex][3] = _SITE_EN_COUNT[0];
+	
+	weight = _SITE_EN_COUNT[0]+_SITE_ES_COUNT[0];
+	
+	p = _SITE_ES_COUNT[0]/weight;
+	
+	resultMatrix[siteIndex][5] = p;
+	
+	p2 = resultMatrix[siteIndex][0]+resultMatrix[siteIndex][1];
+	
+	resultMatrix[siteIndex][7] = resultMatrix[siteIndex][1]/resultMatrix[siteIndex][3];
+	
+	if (resultMatrix[siteIndex][2])
+	{
+		resultMatrix[siteIndex][6] = resultMatrix[siteIndex][0]/resultMatrix[siteIndex][2];
+		resultMatrix[siteIndex][8] = resultMatrix[siteIndex][7]-resultMatrix[siteIndex][6];	
+		resultMatrix[siteIndex][11] = resultMatrix[siteIndex][8]/totalTreeLength;	
+	}
+	
+	if (p2)
+	{
+		resultMatrix[siteIndex][4]  = resultMatrix[siteIndex][0]/p2;		
+		resultMatrix[siteIndex][9]  = extendedBinTail (p2,p,resultMatrix[siteIndex][0]);
+		if (resultMatrix[siteIndex][0]>=1)
+		{
+			resultMatrix[siteIndex][10] = 1-resultMatrix[siteIndex][9]+(resultMatrix[siteIndex][9]-extendedBinTail(p2,p,resultMatrix[siteIndex][0]-1));
+		}
+		else
+		{
+			resultMatrix[siteIndex][10] = 1-resultMatrix[siteIndex][9]+(resultMatrix[siteIndex][9]-extendedBinTail (p2,p,0));
+		}
+	}		
+
+
+	return 0;
+}
+
+
+/*___________________________________________________________________________________________________________*/
+
+function extendedBinTail (ebn, ebp, ebx)
+{
+	ebr = ebx$1; /* rounded to nearest integer */
+	
+	currentBinCoeff = (1-ebp)^ebn; /*compute the first binomial coefficient */
+	
+	binHead = 0;
+	
+	for (ebk=0; ebk<=ebr; ebk=ebk+1)
+	{
+		binHead			= binHead + currentBinCoeff;
+		currentBinCoeff = currentBinCoeff * (ebn-ebk) / (ebk+1) * ebp / (1-ebp);
+	}
+	
+	if (ebx <= ebn$1)
+	{
+		binHead = binHead + currentBinCoeff*(ebx-ebr);
+	}
+	else
+	{
+		binHead = binHead + (1-binHead)*(ebx-ebr)/(ebn-ebn$1);	
+	}
+		
+	return binHead;
+}
+
+/*___________________________________________________________________________________________________________*/
+
+function PadString (padLength,padChar)
+{
+	for (padCounter=0;padCounter<padLength;padCounter=padCounter+1)
+	{
+		fprintf (stdout,padChar);
+	}
+	return padLength;
+}
+
+/*___________________________________________________________________________________________________________*/
+
+function	PrintASCIITable (dataMatrix, titleMatrix)
+{
+	columnWidths = {1,Columns(titleMatrix)};
+	for (counter1=0; counter1<Columns(titleMatrix); counter1 = counter1+1)
+	{
+		counter2 = Abs (titleMatrix[0][counter1])+2;
+		if (counter2<12)
+		{
+			counter2 = 12;
+		}
+		columnWidths[0][counter1] = counter2;
+	}
+	fprintf (stdout, "\n");
+	for (counter2 = 0; counter2 < Columns (titleMatrix); counter2 = counter2+1)
+	{
+		fprintf (stdout,"+-");
+		dummy = PadString (columnWidths[0][counter2],"-");
+		fprintf (stdout,"-");
+	}
+	fprintf (stdout,"+\n| ");
+	
+	for (counter1=0; counter1<Columns(titleMatrix); counter1 = counter1+1)
+	{
+		fprintf (stdout, titleMatrix[counter1]);
+		dummy = PadString (columnWidths[0][counter1]-Abs(titleMatrix[counter1])," ");
+		fprintf (stdout, " | ");
+	}
+	
+	fprintf (stdout, "\n");
+	
+	for (counter1=-1; counter1<Rows(dataMatrix); counter1 = counter1 + 1)
+	{
+		if (counter1>=0)
+		{
+			fprintf (stdout,"| ");
+			fprintf (stdout,Format(counter1+1,columnWidths[0][0],0));
+			for (counter2 = 1; counter2 < Columns (titleMatrix); counter2 = counter2+1)
+			{
+				fprintf (stdout," | ");
+				fprintf (stdout,Format(dataMatrix[counter1][counter2-1],columnWidths[0][counter2],-1));
+			}
+			fprintf (stdout," ");
+			fprintf (stdout, "|\n");
+		}
+		for (counter2 = 0; counter2 < Columns (titleMatrix); counter2 = counter2+1)
+		{
+			fprintf (stdout,"+-");
+			dummy = PadString (columnWidths[0][counter2],"-");
+			fprintf (stdout,"-");
+		}
+		fprintf (stdout, "+\n");
+	}
+	
+	return 1;
+}
+
+/*___________________________________________________________________________________________________________*/
+
+function	PrintTableToFile (dataMatrix, titleMatrix, promptOrNot)
+{
+	SetDialogPrompt ("Export tab separated data to:");
+	
+	if (promptOrNot)
+	{
+		fprintf (PROMPT_FOR_FILE, CLEAR_FILE);
+	}
+	
+	fprintf (LAST_FILE_PATH, titleMatrix[0][0]);
+
+	for (counter1=1; counter1<Columns(titleMatrix); counter1 = counter1+1)
+	{
+		fprintf (LAST_FILE_PATH, "\t", titleMatrix[0][counter1]);
+	}
+	
+	for (counter1=0; counter1<Rows(dataMatrix); counter1 = counter1 + 1)
+	{
+		fprintf (LAST_FILE_PATH,"\n",dataMatrix[counter1][0]);
+		for (counter2 = 1; counter2 < Columns (dataMatrix); counter2 = counter2+1)
+		{
+			fprintf (LAST_FILE_PATH,"\t",dataMatrix[counter1][counter2]);
+		}
+	}
+	
+	return 1;
+}
+
+/*----------------------------------------------------------------------------*/
+
+
+if (useCustomCountingBias)
+{
+	incFileName = "Distances/CodonToolsMain.def";
+}
+else
+{
+	incFileName = "Distances/CodonTools.def";
+}
+
+ExecuteCommands  ("#include \""+incFileName+"\";");
+
+/* first column - the number of synonymous sites
+   second column - the number of non-syn sites */
+
+matrixTrick = {1,stateCharCount};
+
+for (h=Columns(matrixTrick)-1; h>=0; h=h-1)
+{
+	matrixTrick  [h] = 1;
+}
+
+resultMatrix = {filteredData.sites,12};
+
+if (pipeThroughFlag == 0)
+{
+	likelihoodFnChoice = 0;
+	if (Rows("LikelihoodFunction")>1)
+	{
+		ChoiceList  (likelihoodFnChoice,"Choose a Likelihood Function",1,NO_SKIP,LikelihoodFunction);
+	}		
+
+	if (likelihoodFnChoice<0)
+	{
+		return;
+	} 
+				 
+	LIKELIHOOD_FUNCTION_OUTPUT = response;
+
+	if (RESTORE_GLOBALS)
+	{
+		dumb = RestoreGlobalValues (likelihoodFnChoice);
+	}
+
+	GetString(likelihoodFunctionName,LikelihoodFunction,likelihoodFnChoice);
+}
+
+StateCounter (likelihoodFunctionName__,"_siteWeighter_");
+
+if (pipeThroughFlag == 0)
+{
+	labelMatrix =     {1,12};
+	labelMatrix[0] = "Observed S Changes";
+	labelMatrix[1] = "Observed NS Changes";
+	labelMatrix[2] = "E[S Sites]";
+	labelMatrix[3] = "E[NS Sites]";
+	labelMatrix[4] = "Observed S. Prop.";
+	labelMatrix[5] = "P{S}";
+	labelMatrix[6] = "dS";
+	labelMatrix[7] = "dN";
+	labelMatrix[8] = "dN-dS";
+	labelMatrix[9] = " P{S leq. observed}";
+	labelMatrix[10] = "P{S geq. observed}";
+	labelMatrix[11] = "Scaled dN-dS";
+
+	sigLevel = -1;
+
+	while ((sigLevel<=0)||(sigLevel>=1))
+	{
+		fprintf (stdout, "\nSignificance level for a site to be classified as positively/negatively selected?");
+		fscanf  (stdin, "Number", sigLevel);
+	}
+
+	posSelected = 0;
+	negSelected = 0;
+
+	p = Rows(resultMatrix);
+
+	for (p2=0; p2<p; p2=p2+1)
+	{
+		if (resultMatrix [p2][0]+resultMatrix [p2][1]>0.5)
+		{
+			v = resultMatrix [p2][8];
+			if (v>0)
+			{
+				if (resultMatrix [p2][9] < sigLevel)
+				{
+					posSelected = posSelected+1;
+				}
+			}
+			else
+			{
+				if (v<0)
+				{
+					if (resultMatrix [p2][10] < sigLevel)
+					{
+						negSelected = negSelected+1;
+					}
+				}
+			}
+		}
+	}
+
+	selLabelMatrix = {{"Index","Site Index","dN-dS","p-value"}};
+
+	if (posSelected)
+	{
+		psMatrix = {posSelected, 3};
+		h = 0;
+		for (p2=0; p2<p; p2=p2+1)
+		{
+			if (resultMatrix [p2][0]+resultMatrix [p2][1]>0.5)
+			{
+				v = resultMatrix [p2][8];
+				if (v>0)
+				{
+					if (resultMatrix [p2][9] < sigLevel)
+					{
+						psMatrix[h][0] = p2+1;
+						psMatrix[h][1] = v;
+						psMatrix[h][2] = resultMatrix [p2][9];
+						h = h+1;
+					}
+				}
+			}
+		}
+		
+		fprintf (stdout,"\n******* FOUND ", posSelected, " POSITIVELY SELECTED SITES ********\n\n");
+		dummy = PrintASCIITable  (psMatrix, selLabelMatrix);
+	}
+	else
+	{
+		fprintf (stdout,"\n******* FOUND NO POSITIVELY SELECTED SITES ********\n\n");
+	}
+
+	if (negSelected)
+	{
+		psMatrix = {negSelected, 3};
+		h = 0;
+		for (p2=0; p2<p; p2=p2+1)
+		{
+			if (resultMatrix [p2][0]+resultMatrix [p2][1]>0.5)
+			{
+				v = resultMatrix [p2][8];
+				if (v<0)
+				{
+					if (resultMatrix [p2][10] < sigLevel)
+					{
+						psMatrix[h][0] = p2+1;
+						psMatrix[h][1] = v;
+						psMatrix[h][2] = resultMatrix [p2][10];
+						h = h+1;
+					}
+				}
+			}
+		}
+		
+		fprintf (stdout,"\n******* FOUND ", negSelected, " NEGATIVELY SELECTED SITES ********\n\n");
+		dummy = PrintASCIITable  (psMatrix, selLabelMatrix);
+	}
+	else
+	{
+		fprintf (stdout,"\n******* FOUND NO NEGATIVELY SELECTED SITES ********\n\n");
+	}
+
+	ChoiceList (outputChoice, "Output Options",1,SKIP_NONE,
+				"ASCII Table",	 "Output is printed to the console as an ASCII table.",
+				"Export to File","Output is spooled to a tab separated file.",
+				"Chart","A HYPHY chart window is displayed (Mac/Doze Only).");
+
+	if (outputChoice<0)
+	{
+		return;
+	}
+
+	if (outputChoice==0)
+	{
+		dummy = PrintASCIITable  (resultMatrix, labelMatrix);
+	}
+	else
+	{
+		if (outputChoice == 1)
+		{
+			SetDialogPrompt ("Save result table to");
+			dummy = PrintTableToFile  (resultMatrix, labelMatrix,1);
+		}
+		else
+		{
+			OpenWindow (CHARTWINDOW,{{"Rates by sites"}
+									   {"labelMatrix"},
+									   {"resultMatrix"},
+									   {"Contrast Bars"},
+									   {"Index"},
+									   {labelMatrix[6]+";"+labelMatrix[7]},
+									   {"Site Index"},
+									   {"dN"},
+									   {"dS"},
+									   {"0"}},
+									   "SCREEN_WIDTH-60;SCREEN_HEIGHT-50;30;50");
+		}
+	}
+}
diff --git a/res/TemplateBatchFiles/WebUpdate.bf b/res/TemplateBatchFiles/WebUpdate.bf
new file mode 100644
index 0000000..3350bee
--- /dev/null
+++ b/res/TemplateBatchFiles/WebUpdate.bf
@@ -0,0 +1,213 @@
+availableFiles = {};
+pIndex = "path";
+dIndex = "description";
+
+/* -------------------------------------------------------------------------------------- */
+
+function CompareGMTDates (date1, date2)
+{
+	for (dateComp = 0; dateComp < 5; dateComp = dateComp + 1)
+	{
+		dateComp2 = date1[dateComp]-date2[dateComp];
+		if (dateComp2)
+		{
+			return dateComp2/Abs(dateComp2);
+		}
+	}
+	return 0;
+}
+
+/* -------------------------------------------------------------------------------------- */
+
+function SplitGMTDate (aDate, splitDate&)
+{
+	chopPoints = aDate || "[^/\\ :]+";
+	if (Rows(chopPoints)==10)
+	{
+		parts = {5,1};
+		for (chopPart = 0; chopPart < 10; chopPart = chopPart + 2)
+		{
+			startOffset = chopPoints[chopPart];
+			endOffset	= chopPoints[chopPart+1];
+			parts[chopPart/2] = aDate[startOffset][endOffset];
+		}
+		chopPoints =  parts[0] $ "^[0-9]{4}$";
+		if (chopPoints[0]>=0)
+		{
+			for (chopPart = 1; chopPart < 5; chopPart = chopPart + 1)
+			{
+				chopPoints =  parts[chopPart] $ "^[0-9][0-9]?$";
+				if (chopPoints[0]<0)
+				{
+					return 0;
+				}
+			}
+			splitDate = {5,1};
+			for (chopPart = 0; chopPart < 5; chopPart = chopPart + 1)
+			{
+				splitDate[chopPart] = 0 + parts[chopPart];
+			}
+			return 1;
+		}
+	}
+	return 0;
+}
+
+/* -------------------------------------------------------------------------------------- */
+
+function SplitInput (fileList)
+{
+	chopPoints = fileList || "[^\\$]+";
+	if  (chopPoints[0]>=0)
+	{
+		for (entryIndex = 0; entryIndex < Abs(chopPoints); entryIndex = entryIndex + 2)
+		{
+			startOffset = chopPoints[entryIndex];
+			endOffset	= chopPoints[entryIndex+1];
+			anEntry 	= fileList[startOffset][endOffset];
+			
+			splitEntry  = anEntry || "[^\\|]+";
+			
+			if (Rows(splitEntry) == 8) 
+			{
+				splitEntryStrings = {4,1};
+				for (entryIndex2 = 0; entryIndex2 < 8; entryIndex2 = entryIndex2 + 2)
+				{
+					startOffset = splitEntry[entryIndex2];
+					endOffset	= splitEntry[entryIndex2+1];
+					splitEntryStrings[entryIndex2/2] = anEntry[startOffset][endOffset];
+				}
+				
+				entryDate = 0;
+				
+				if (SplitGMTDate (splitEntryStrings[0],"entryDate"))
+				{
+					if (CompareGMTDates (lastUpdate, entryDate) < 0)
+					{
+						newFile = {};
+						newFile [pIndex] 		= splitEntryStrings[1];
+						newFile [dIndex] = splitEntryStrings[2];
+						newFile ["text"]		= ((splitEntryStrings[3]&&1) == "TEXT");
+						availableFiles [Abs(availableFiles)] = newFile;
+					}
+				}
+			}
+		} 
+	}
+	return Abs (availableFiles);
+}
+
+downloadURLs = {};
+downloadURLs [0] = "http://homepage.mac.com/sergeilkp/HyPhy_Distro/HYPHY.dmg";
+downloadURLs [1] = "http://homepage.mac.com/sergeilkp/HyPhy_Distro/HYPHY_Win32.zip";
+downloadURLs [2] = "http://homepage.mac.com/sergeilkp/HyPhy_Distro/HYPHY_Source.tgz";
+downloadURLs [3] = "http://homepage.mac.com/sergeilkp/HyPhy_Distro/HYPHY_UB.dmg";
+downloadTargets = {};
+downloadTargets [0] = "HYPHY.dmg";
+downloadTargets [1] = "HYPHY_Win32.zip";
+downloadTargets [2] = "HYPHY_Source.tgz";
+downloadTargets [3] = "HYPHY_UB.dmg";
+
+/* -------------------------------------------------------------------------------------- */
+
+fscanf ("last.date","String",lastDate);
+
+if (SplitGMTDate (lastDate, "lastUpdate"))
+{
+	fprintf (stdout, "\nStarting HyPhy update\n");
+	GetString (versionString, HYPHY_VERSION, 2);
+	dateComp = versionString$"Macintosh.+";
+	if (dateComp[0]>=0)
+	{
+		versionString = "Macintosh";
+		if ((versionString$"Universal")[0]>=0)
+		{
+			systemKind = 3;		
+		}
+		else
+		{
+			systemKind = 0;
+		}
+	}
+	else
+	{
+		dateComp = versionString$"Windows.+";
+		if (dateComp[0]>=0)
+		{
+			versionString = "Windows";
+			systemKind = 1;
+		}
+		else
+		{
+			versionString = "Unix";
+			systemKind = 2;
+		}
+	}
+	versionString = "http://www.hyphy.org/updates/"+versionString+"/";
+	
+	GetURL (updateIndex, versionString+"version");
+	
+	GetString (versionStringS, HYPHY_VERSION, 0);
+	
+	updateIndex 	= 0+updateIndex;
+	versionStringS  = 0+versionStringS;
+	
+	
+	if (versionStringS<updateIndex)
+	{
+		fprintf (stdout, "\nA newer version of HyPhy(",updateIndex,")  is available for your platform.");
+		DEFAULT_FILE_SAVE_NAME = downloadTargets[systemKind];
+		SetDialogPrompt ("Download a newer version of HyPhy to:");
+		fprintf (PROMPT_FOR_FILE,CLEAR_FILE);
+		GetURL (LAST_FILE_PATH,downloadURLs[systemKind],SAVE_TO_FILE);
+		fprintf (stdout, "\nA newer version of HyPhy has been downloaded.\nPlease quit HyPhy and install the update.\n");
+		return 0;
+	}
+	else
+	{
+		fprintf (stdout, "\nYour version of HyPhy is current.\nChecking for individual file updates...\n");	
+	}
+	
+	/* first check the version */
+	
+	GetURL (updateIndex, versionString+"updates");
+	
+	
+	if (SplitInput (updateIndex))
+	{
+		for (chopPart = 0; chopPart < Abs(availableFiles); chopPart = chopPart + 1)
+		{
+			entryData = availableFiles[chopPart];
+			filePath = HYPHY_LIB_DIRECTORY+entryData[pIndex]^{{"/"}{DIRECTORY_SEPARATOR}};
+			if (entryData["text"])
+			{
+				fprintf (stdout, "Updating file:", entryData[pIndex], 
+							   "\n-------------\n",
+							   "\nNotes:", 
+							   "\n-----\n", entryData[dIndex], "\n");
+				GetURL (theFile,versionString+entryData[pIndex]);
+				fprintf (filePath, CLEAR_FILE, theFile);
+				fprintf (stdout, "Update Successful\n");
+			}
+			else
+			{
+				fprintf (stdout, "Saving file:", entryData[pIndex], 
+							   "\n------------\n",
+							   "\nNotes:", 
+							   "\n-----\n", entryData[dIndex], "\n");
+				GetURL (filePath,versionString+availableFiles[pIndex],SAVE_TO_FILE);
+				fprintf (stdout, "Download Successful\n");				
+			}
+		}
+	}
+	else
+	{
+		fprintf (stdout, "\nYour distribution seems to be up-to-date\n");
+	}
+	GetString (gmtString,  TIME_STAMP, 0);
+	fprintf ("last.date",CLEAR_FILE,gmtString);
+}
+else
+{
+	fprintf (stdout, "\nInternal error : could not read valid date from last.date file\n");
+}
diff --git a/res/TemplateBatchFiles/YangNielsenBranchSite2005.bf b/res/TemplateBatchFiles/YangNielsenBranchSite2005.bf
new file mode 100644
index 0000000..6bdda82
--- /dev/null
+++ b/res/TemplateBatchFiles/YangNielsenBranchSite2005.bf
@@ -0,0 +1,513 @@
+/* 1. include a file to define the genetic code
+   Note the use of base directory and path forming variables to make this analysis 
+   independent of directory placement
+ */
+
+incFileName = HYPHY_LIB_DIRECTORY+"TemplateBatchFiles"+DIRECTORY_SEPARATOR+"TemplateModels"+DIRECTORY_SEPARATOR+"chooseGeneticCode.def";
+ExecuteCommands  ("#include \""+incFileName+"\";");
+
+/* 2. load a codon partition  */
+
+SetDialogPrompt 			("Please locate a coding alignment:");
+DataSet 	  ds		   = ReadDataFile (PROMPT_FOR_FILE);
+DataSetFilter filteredData = CreateFilter (ds,3,"","",GeneticCodeExclusions);
+coding_path = LAST_FILE_PATH;
+
+fprintf (stdout, "\nLoaded a ", filteredData.species, " sequence alignment with ", filteredData.sites, " codons from\n",coding_path,"\n");
+
+/* 3. include a file to prompt for a tree */
+
+incFileName = HYPHY_LIB_DIRECTORY+"TemplateBatchFiles"+DIRECTORY_SEPARATOR+"queryTree.bf";
+ExecuteCommands  ("#include \""+incFileName+"\";");
+
+/* 4. Compute nucleotide counts by position for the F3x4 estimator */
+
+COUNT_GAPS_IN_FREQUENCIES = 0;
+HarvestFrequencies (baseFreqs,filteredData,3,1,1);
+COUNT_GAPS_IN_FREQUENCIES = 1;
+
+fprintf (stdout, "\nBase composition:\n\tA: ", Format (baseFreqs[0][0],10,5),",",Format (baseFreqs[0][1],10,5),",",Format (baseFreqs[0][2],10,5),
+								    "\n\tC: ", Format (baseFreqs[1][0],10,5),",",Format (baseFreqs[1][1],10,5),",",Format (baseFreqs[1][2],10,5), 
+									"\n\tG: ", Format (baseFreqs[2][0],10,5),",",Format (baseFreqs[2][1],10,5),",",Format (baseFreqs[2][2],10,5), 
+									"\n\tT: ", Format (baseFreqs[3][0],10,5),",",Format (baseFreqs[3][1],10,5),",",Format (baseFreqs[3][2],10,5), "\n");
+										  
+
+/* 5. prompt for the type of model to run */
+
+ChoiceList (modelKind, "Model", 1, SKIP_NONE,
+					   "Alternative", "Fit Model A with 4 rate classes. Class 1: Negative selection in FG and BG. Class 2: Neutral evolution in FG and BG. Class 3: Negative selection in BG, Positive in FG. Class 4: Neutral evolution in BG, Positive in FG",
+					   "Null for Test 1", "Fit a model with 2 rate classes. Class 1: Negative selection in FG and BG. Class 2: Neutral evolution in FG and BG.",
+					   "Null for Test 2", "Fit Model A with 3 rate classes. Class 1: Negative selection in FG and BG. Class 2: Neutral evolution in FG and BG. Class 3: Negative selection in BG, Neutral in FG.",
+);					   
+
+if (modelKind < 0)
+{
+	return 0;
+}
+
+
+/* 6. define the 'site_kind' variable as a discrete category variable; 
+	  it decides which class a site belongs to, but does not
+	  determine omega ratios directly (see below for this) */
+
+global P_0     = 0.5;
+P_0:<1;
+P_0:>0;
+
+if (modelKind == 1)
+{
+	rateClasses = 2;
+
+	categFreqMatrix = {{P_0,1-P_0}} ;
+	categRateMatrix = {{1,2}};
+}
+else
+{
+	P_0        = 1/4;
+	global 		P_1_aux = 1/4;
+	global 		P_1     := Min(P_1_aux,1-P_0);
+	P_1:<1;
+	P_1:>0;
+	
+	if (modelKind == 0)
+	{
+		rateClasses = 4;
+		categFreqMatrix = {{P_0,P_1,(1-P_0-P_1)/(P_0+P_1)*P_0,(1-P_0-P_1)/(P_0+P_1)*P_1}} ;
+		categRateMatrix = {{1,2,3,4}};
+	}
+	else
+	{
+		rateClasses = 3;
+		categFreqMatrix = {{P_0,P_1/(P_0+P_1),(1-P_0-P_1)/(P_0+P_1)*P_0}} ;
+		categRateMatrix = {{1,2,3}};
+	}
+}
+
+category site_kind = (rateClasses, categFreqMatrix , MEAN, ,categRateMatrix, 1, 4);
+
+/* 7. define the GY94 rate matrix; for now each branch will have it's own
+   dS and dN, we will constrain them later */
+
+global kappa_inv = 1;
+
+ModelMatrixDimension = 64;
+for (h = 0; h<64; h=h+1) 
+{
+	if (_Genetic_Code[h]==10) /* stop codon */
+	{
+		ModelMatrixDimension = ModelMatrixDimension-1;
+	}
+}
+
+GY_Matrix = {ModelMatrixDimension,ModelMatrixDimension};
+hshift = 0;
+for (h=0; h<64; h=h+1)
+{
+	if (_Genetic_Code[h]==10) 
+	{
+		hshift = hshift+1;
+	}
+	else
+	{
+		vshift = hshift;
+		for (v = h+1; v<64; v=v+1)
+		{
+			diff = v-h;
+			if (_Genetic_Code[v]==10) 
+			{
+				vshift = vshift+1;
+			}
+			else
+			{
+			  	if ((h$4==v$4)||((diff%4==0)&&(h$16==v$16))||(diff%16==0)) /* one step */
+			  	{
+			  		if (h$4==v$4)
+			  		{
+			  			transition = v%4;
+			  			transition2= h%4;
+			  		}
+			  		else
+			  		{
+			  			if(diff%16==0)
+			  			{
+			  				transition = v$16;
+			  				transition2= h$16;
+			  			}
+			  			else
+			  			{
+			  				transition = v%16$4;
+			  				transition2= h%16$4;
+			  			}
+			  		}
+			  		if (_Genetic_Code[0][h]==_Genetic_Code[0][v]) /* synonymous */
+			  		{
+			  			if (Abs(transition-transition2)%2) /* transversion */
+			  			{
+			  				GY_Matrix[h-hshift][v-vshift] := kappa_inv*synRate;
+			  				GY_Matrix[v-vshift][h-hshift] := kappa_inv*synRate;
+			  			}
+			  			else
+			  			{
+			  				GY_Matrix[h-hshift][v-vshift] := synRate;
+			  				GY_Matrix[v-vshift][h-hshift] := synRate;			  			
+			  			}
+				  	}
+			  		else
+			  		{
+			  			if (Abs(transition-transition2)%2) /* transversion */
+			  			{
+			  				GY_Matrix[h-hshift][v-vshift] := kappa_inv*nonSynRate;
+			  				GY_Matrix[v-vshift][h-hshift] := kappa_inv*nonSynRate;
+			  			}
+			  			else
+			  			{
+			  				GY_Matrix[h-hshift][v-vshift] := nonSynRate;
+			  				GY_Matrix[v-vshift][h-hshift] := nonSynRate;			  			
+			  			}
+		  			}
+			  	}
+			 }
+		 }
+	}	
+}
+
+/*8. build codon frequencies (use the F3x4 estimator) */
+
+PIStop = 1.0;
+codonFreqs = {ModelMatrixDimension,1};
+hshift = 0;
+
+for (h=0; h<64; h=h+1)
+{
+	first  = h$16;
+	second = h%16$4;
+	third  = h%4;
+	if (_Genetic_Code[h]==10) 
+	{
+		hshift = hshift+1;
+		PIStop = PIStop-baseFreqs[first][0]*baseFreqs[second][1]*baseFreqs[third][2];
+		continue; 
+	}
+	codonFreqs[h-hshift]=baseFreqs[first][0]*baseFreqs[second][1]*baseFreqs[third][2];
+}
+
+codonFreqs = codonFreqs*(1.0/PIStop);
+
+/*9. define the codon model */
+
+Model GY_Model = (GY_Matrix,codonFreqs,1);
+
+/*10. Define the tree and pick the foreground branch, displaying a tree window to facilitate selection; 
+the latter step is executed for 2 of 3 model choices */
+
+Tree 	  givenTree = treeString;
+
+USE_LAST_RESULTS    = 0;
+OPTIMIZATION_METHOD = 4;
+
+/* Approximate kappa and branch lengths using an HKY85 fit */
+
+HKY85_Matrix = {{*,t*kappa_inv,t,t*kappa_inv}
+				{t*kappa_inv,*,kappa_inv*t,t}
+				{t,t*kappa_inv,*,kappa_inv*t}
+				{t*kappa_inv,t,kappa_inv*t,*}};
+			
+HarvestFrequencies (nucFreqs,ds,1,1,1);
+Model HKY85_Model = (HKY85_Matrix,nucFreqs,1);
+
+Tree		  nucTree = treeString;
+DataSetFilter nucData = CreateFilter (ds,1);
+
+fprintf (stdout, "Obtaining nucleotide branch lengths and kappa to be used as starting values...\n");
+LikelihoodFunction	nuc_lf = (nucData,nucTree);
+Optimize(nuc_mle,nuc_lf);
+fprintf (stdout, "\n", Format (nucTree,1,1), "\nkappa=", Format (1/kappa_inv,8,3), "\n");
+
+USE_LAST_RESULTS = 1;
+
+if (modelKind != 1)
+{
+
+	mxTreeSpec = {5,1};
+	mxTreeSpec [0] = "givenTree";
+	mxTreeSpec [1] = "8240";
+	mxTreeSpec [2] = "10,40,-10,-175,1";
+	mxTreeSpec [3] = "";
+	mxTreeSpec [4] = "";
+	OpenWindow 		(TREEWINDOW, mxTreeSpec,"(SCREEN_WIDTH-50)/2;(SCREEN_HEIGHT-50)/2;30+(SCREEN_WIDTH-30)/2;45");				
+
+	leafNodes	  = TipCount   (givenTree);			
+	internalNodes = BranchCount(givenTree);
+
+	choiceMatrix = {internalNodes+leafNodes,2};
+	for (bc=0; bc<internalNodes; bc=bc+1)
+	{
+		choiceMatrix[bc][0] = BranchName(givenTree,bc);
+		choiceMatrix[bc][1] = "Internal Branch Rooting " + givenTree[bc];
+	}
+	for (bc=0; bc<leafNodes; bc=bc+1)
+	{
+		choiceMatrix[bc+internalNodes][0] = TipName(givenTree,bc);
+		choiceMatrix[bc+internalNodes][1] = "Leaf node " + choiceMatrix[bc+internalNodes][0];
+	}
+
+	ChoiceList  (stOption,"Choose the foreground branch",0,NO_SKIP,choiceMatrix);
+
+	if (stOption[0] < 0)
+	{
+		return -1;
+	}
+
+	fprintf (stdout, "\n\n", Columns (stOption)," foreground branch(es) set to: ", "\n");
+	for (bc = 0; bc < Columns (stOption); bc = bc + 1)
+	{
+		fprintf (stdout, choiceMatrix[stOption[bc]][0], "\n");
+	}
+	OpenWindow (CLOSEWINDOW, "Tree givenTree");
+}
+	
+/* 15. Constrain dS and dN in the tree to based upon different models */
+
+global omega_0 = 0.25;
+omega_0 :< 1;
+ClearConstraints (givenTree);
+
+if (modelKind == 1)
+{
+	global omega := ((site_kind==1)*omega_0+(site_kind==2));
+	/*  will evaluate to omega_0 for sites in class site_kind=1 and to 1 for sites in class site_kind=2 */
+	ReplicateConstraint ("this1.?.nonSynRate:=omega*this2.?.synRate",givenTree,givenTree);
+}
+else
+{
+	if (modelKind == 2)
+	{
+		global omega_FG := ((site_kind==1)*omega_0+(site_kind>1)); 						/* foreground model */
+		global omega_BG := (((site_kind==1)+(site_kind==3))*omega_0+(site_kind==2));    /* background model */
+	}
+	else
+	{
+		global omega_2 = 2.0;
+		omega_2:>1;
+		global omega_FG := ((site_kind==1)*omega_0+(site_kind==2)+(site_kind>2)*omega_2); 			/* foreground model */
+		global omega_BG := (((site_kind==1)+(site_kind==3))*omega_0+(site_kind==2)+(site_kind==4)); /* background model */
+	}
+	
+	/* constrain the foreground branch first */
+	for (bc = 0; bc < Columns (stOption); bc = bc + 1)
+	{
+		ExecuteCommands ("givenTree."+choiceMatrix[stOption[bc]][0]+".nonSynRate:=omega_FG*givenTree."+choiceMatrix[stOption[bc]][0]+".synRate;");
+	}
+
+	/* constrain other branches next */
+	ReplicateConstraint ("this1.?.nonSynRate:=omega_BG*this2.?.synRate",givenTree,givenTree);
+
+}
+
+/* 16. define and optimize the likelihood function */
+
+bNames = BranchName   (givenTree,-1);
+nucBL  = BranchLength (nucTree,-1);
+
+for (bc=0; bc<Columns(bNames)-1; bc=bc+1)
+{
+	ExecuteCommands ("givenTree."+bNames[bc]+".synRate=nucTree."+bNames[bc]+".t;");
+}
+
+codBL  = BranchLength (givenTree,-1);
+
+for (bc=0; bc<Columns(bNames)-1; bc=bc+1)
+{
+	if (nucBL[bc]>0)
+	{
+		ExecuteCommands ("givenTree."+bNames[bc]+".synRate=nucTree."+bNames[bc]+".t*"+nucBL[bc]/codBL[bc]+";");
+	}
+}
+
+OPTIMIZATION_PRECISION = 0.001;
+LikelihoodFunction lf = (filteredData, givenTree);
+
+
+while (1)
+{
+	Optimize 		   (mles,lf);
+	
+	fprintf (stdout, lf);
+
+	GetString 		  (lfParameters, lf, -1);
+	glV 		 	= lfParameters["Local Independent"];
+	stashedValues 	= {};
+	for (glVI = 0; glVI < Columns (glV); glVI = glVI + 1)
+	{
+		ExecuteCommands ("stashedValues[\""+glV[glVI]+"\"] = " + glV[glVI] + ";\n");
+	}
+	glV 		 	= lfParameters["Global Independent"];
+	for (glVI = 0; glVI < Columns (glV); glVI = glVI + 1)
+	{
+		ExecuteCommands ("stashedValues[\""+glV[glVI]+"\"] = " + glV[glVI] + ";\n");
+	}
+	
+	mlBL		 	= BranchLength (givenTree,-1);
+	
+	samples = 500;
+	fprintf (stdout, "\nChecking for convergence by Latin Hypercube Sampling (this may take a bit of time...)\n");
+		
+	steps 		  = 50;
+	if (modelKind == 0)
+	{
+		vn			  = {{"P_0","P_1_aux","omega_0", "omega_2"}};
+		ranges		  = {{0.0001,1}{0.0001,1}{0.0001,1}{1,10}};
+	}
+	else
+	{
+		if (modelKind==2)
+		{
+			vn			  = {{"P_0","P_1_aux","omega_0"}};
+			ranges		  = {{0.0001,1}{0.0001,1}{0.0001,1}};
+		}
+		else
+		{
+			if (modelKind==1)
+			{
+				vn			  = {{"P_0","omega_0"}};
+				ranges		  = {{0.0001,1}{0.0001,1}};
+			}		
+		}
+	}
+		
+	LFCompute (lf,LF_START_COMPUTE);
+	
+	for (sample = 0; sample < samples; sample = sample + 1)
+	{
+		rv = Random({1,steps}["_MATRIX_ELEMENT_COLUMN_"],0);
+		for (vid = 0; vid < Columns (vn); vid = vid + 1)
+		{
+			ctx = vn[vid] + "=" + (ranges[vid][0] + (ranges[vid][1]-ranges[vid][0])/steps*rv[vid]);
+			ExecuteCommands (ctx);
+		}
+		currentBL = BranchLength (givenTree,-1);
+		for (bc=0; bc<Columns(bNames)-1; bc=bc+1)
+		{
+			if (currentBL[bc]>0)
+			{
+				ExecuteCommands ("givenTree."+bNames[bc]+".synRate=givenTree."+bNames[bc]+".synRate*"+mlBL[bc]/currentBL[bc]+";");
+			}
+		}		
+
+		LFCompute (lf,sample_value);	
+		if (sample_value>mles[1][0])
+		{
+			fprintf (stdout, "\nFound a better likelihood score. Restarting the optimization routine.\n");
+			break;
+		}	
+	}
+	LFCompute (lf,LF_DONE_COMPUTE);
+	
+	if (sample < samples)
+	{
+		continue;
+	}
+	storedV = Rows (stashedValues);
+	for (k=0; k<Columns (storedV); k=k+1)
+	{
+		ExecuteCommands (storedV[k] + "=" + stashedValues[storedV[k]]);
+	}
+	fprintf (stdout, "\nThe estimation procedure appears to have converged.\n");
+	break;
+}
+
+
+/* 17. Report inferred rate distribition to screen */
+
+if (modelKind == 0)
+{
+	fprintf (stdout, "\nInferred rate distribution:",
+					 "\n\tClass 0.  omega_0 = ", Format (omega_0, 5,3), " weight = ", Format (P_0,5,3),
+					 "\n\tClass 1.  omega  := ", Format (1, 5,3), " weight = ", Format (P_1,5,3),
+					 "\n\tClass 2a. Background omega_0 = ", Format (omega_0, 5,3), " foreground omega_2 = ", Format (omega_2, 5,3), " weight = ", Format (P_0(1-P_0-P_1)/(P_0+P_1),5,3), 
+					 "\n\tClass 2b. Background omega  := ", Format (1, 5,3), " foreground omega_2 = ", Format (omega_2, 5,3), " weight = ", Format (P_1(1-P_0-P_1)/(P_0+P_1),5,3), "\n");
+}
+if (modelKind == 1)
+{
+	fprintf (stdout, "\nInferred rate distribution:",
+					 "\n\tClass 0.  omega_0 = ", Format (omega_0, 5,3), " weight = ", Format (P_0,5,3),
+					 "\n\tClass 1.  omega  := ", Format (1, 5,3), " weight = ", Format (1-P_0,5,3), "\n");
+}
+if (modelKind == 2)
+{
+	fprintf (stdout, "\nInferred rate distribution:",
+					 "\n\tClass 0.  omega_0 = ", Format (omega_0, 5,3), " weight = ", Format (P_0,5,3),
+					 "\n\tClass 1.  omega  := ", Format (1, 5,3), " weight = ", Format (P_1,5,3),
+					 "\n\tClass 2a. Background omega_0 = ", Format (omega_0, 5,3), " foreground omega_2 := ", Format (1, 5,3), " weight = ", Format (P_0(1-P_0-P_1)/(P_0+P_1),5,3), 
+					 "\n\tClass 2b. Background omega  := ", Format (1, 5,3), " foreground omega_2 := ", Format (1, 5,3), " weight = ", Format (P_1(1-P_0-P_1)/(P_0+P_1),5,3), "\n");
+}
+
+/* 18. Prepare and open a window of conditional probabilities at every site (this requires a GUI but will still run - 
+- just not open any windows in a console build */
+
+ConstructCategoryMatrix (posteriorMatrix, lf, COMPLETE);
+posteriorMatrix = Transpose (posteriorMatrix);
+
+GetInformation			(siteProfile, site_kind); 
+						/* this call returns the distribution function {{value1,..., valueN}{prob1, ..., probN}} for site_kind */
+
+headers = {1, rateClasses};
+
+for (k=1; k<=rateClasses;k=k+1)
+{
+	headers [k-1] = "Class " + k;
+}
+
+/* convert distribution info to the form expected by OpenWindow */
+disributionInfo = "site_kind";
+
+for (k = 0; k < rateClasses; k=k+1)
+{
+	disributionInfo = disributionInfo + ":" + siteProfile[1][k];
+}
+for (k = 0; k < rateClasses; k=k+1)
+{
+	disributionInfo = disributionInfo + ":" + siteProfile[0][k];
+}
+
+OpenWindow (DISTRIBUTIONWINDOW,{{"Conditional probabilities by site"}
+		{"headers"}
+		{"posteriorMatrix"}
+		{"None"}
+		{"Index"}
+		{"None"}
+		{""}
+		{""}
+		{""}
+		{"0"}
+		{""}
+		{"0;0"}
+		{"10;1.309;0.785398"}
+		{"Times:12:0;Times:10:0;Times:12:2"}
+		{"0;0;13816530;16777215;0;0;6579300;11842740;13158600;14474460;0;3947580;16777215;15670812;6845928;16771158;2984993;9199669;7018159;1460610;16748822;11184810;14173291"}
+		{"16,0,0"}
+		{disributionInfo}
+		},
+		"600;600;50;50");
+		
+_MARGINAL_MATRIX_ = Transpose(posteriorMatrix);
+_CATEGORY_VARIABLE_CDF_ = siteProfile[1][-1];
+
+ExecuteAFile(HYPHY_LIB_DIRECTORY+"ChartAddIns"+DIRECTORY_SEPARATOR+"DistributionAddIns"+DIRECTORY_SEPARATOR+"Includes"+DIRECTORY_SEPARATOR+"posteriors.ibf");
+ExecuteAFile(HYPHY_LIB_DIRECTORY+"TemplateBatchFiles"+DIRECTORY_SEPARATOR+"Utility"+DIRECTORY_SEPARATOR+"WriteDelimitedFiles.bf");
+siteCount = Columns(_MARGINAL_MATRIX_);
+siteCounter = {};
+for (k=0; k<siteCount; k=k+1)
+{
+	siteCounter[k] = k + 1;
+}
+classCount = Columns(_CATEGORY_VARIABLE_CDF_);
+columnHeaders = {1,classCount+1};
+columnHeaders[0] = "Site";
+for (k=1; k<=classCount; k=k+1)
+{
+	columnHeaders[k] = "Class "+k;
+}
+
+SetDialogPrompt ("Write site-by-site conditional probabilities to this file:");
+WriteSeparatedTable("",columnHeaders,Transpose(_MARGINAL_MATRIX_), siteCounter,",");
diff --git a/res/TemplateBatchFiles/_BMS_Aux.ibf b/res/TemplateBatchFiles/_BMS_Aux.ibf
new file mode 100644
index 0000000..bbf5220
--- /dev/null
+++ b/res/TemplateBatchFiles/_BMS_Aux.ibf
@@ -0,0 +1,174 @@
+ModelMatrixDimension = 0;
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function PopulateModelMatrix (ModelMatrixName&, EFV)
+{
+	if (!ModelMatrixDimension)
+	{
+		ModelMatrixDimension = 64;
+		for (h = 0 ;h<64; h=h+1)
+		{
+			if (_Genetic_Code[h]==10)
+			{
+				ModelMatrixDimension = ModelMatrixDimension-1;
+			}
+		}
+	}
+	
+	ModelMatrixName = {ModelMatrixDimension,ModelMatrixDimension}; 
+
+	hshift = 0;
+	
+	modelDefString = "";
+	modelDefString*16384;
+	
+	catCounterAL = {};
+	
+	for (h=0; h<64; h=h+1)
+	{
+		if (_Genetic_Code[h]==10) 
+		{
+			hshift = hshift+1;
+			continue; 
+		}
+		vshift = hshift;
+		for (v = h+1; v<64; v=v+1)
+		{
+			diff = v-h;
+			if (_Genetic_Code[v]==10) 
+			{
+				vshift = vshift+1;
+				continue; 
+			}
+			nucPosInCodon = 2;
+			if ((h$4==v$4)||((diff%4==0)&&(h$16==v$16))||(diff%16==0))
+			{
+				if (h$4==v$4)
+				{
+					transition = v%4;
+					transition2= h%4;
+				}
+				else
+				{
+					if(diff%16==0)
+					{
+						transition = v$16;
+						transition2= h$16;
+						nucPosInCodon = 0;
+					}
+					else
+					{
+						transition = v%16$4;
+						transition2= h%16$4;
+						nucPosInCodon = 1;
+					}
+				}
+				hs = Format(h-hshift,0,0);
+				vs = Format(v-vshift,0,0);
+				ts = Format(transition,0,0);
+				ts2= Format(transition2,0,0);
+				ps = Format(nucPosInCodon,0,0);
+				aa1 = _Genetic_Code[0][h];
+				aa2 = _Genetic_Code[0][v];
+				if (aa1==aa2) 
+				{
+					modelDefString*("ModelMatrixName["+hs+"]["+vs+"] := "+_nucBiasTerms[transition][transition2]+"synRate*EFV__["+ts+"]["+ps+"];\n"+
+													 "ModelMatrixName["+vs+"]["+hs+"] := "+_nucBiasTerms[transition][transition2]+"synRate*EFV__["+ts2+"]["+ps+"];\n");
+				}
+				else
+				{
+					modelDefString*("ModelMatrixName["+hs+"]["+vs+"] := "+_nucBiasTerms[transition][transition2]+"nonSynRate*EFV__["+ts+"]["+ps+"];\n"+
+													 "ModelMatrixName["+vs+"]["+hs+"] := "+_nucBiasTerms[transition][transition2]+"nonSynRate*EFV__["+ts2+"]["+ps+"];\n");	
+				}
+			}
+	    }
+    }		
+	modelDefString*0;
+	ExecuteCommands (modelDefString);
+	return 0;
+}
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function FindBranchLengthExpression (dummy, rateMatrix&)
+{
+	/* first decide how many rate classes there are */
+	
+	synRate   	= 1;
+	nonSynRate	= 1;
+	hshift    	= 0;	
+	synWeight 	= 0;
+	nsWeight  	= 0;
+	
+	for (h=0; h<64; h=h+1)
+	{
+		if (_Genetic_Code[h]==10) 
+		{
+			hshift = hshift+1;
+			continue; 
+		}
+		vshift = hshift;
+		for (v = h+1; v<64; v=v+1)
+		{
+			diff = v-h;
+			if (_Genetic_Code[v]==10) 
+			{
+				vshift = vshift+1;
+				continue; 
+			}
+			if ((h$4==v$4)||((diff%4==0)&&(h$16==v$16))||(diff%16==0))
+			{
+				aa1 = _Genetic_Code[0][h];
+				aa2 = _Genetic_Code[0][v];
+				if (aa1==aa2)
+				{
+					synWeight = synWeight + rateMatrix[h-hshift][v-vshift]*vectorOfFrequencies[h-hshift]+rateMatrix[v-vshift][h-hshift]*vectorOfFrequencies[v-vshift];
+				}
+				else
+				{
+					nsWeight = nsWeight + rateMatrix[h-hshift][v-vshift]*vectorOfFrequencies[h-hshift]+rateMatrix[v-vshift][h-hshift]*vectorOfFrequencies[v-vshift];
+				}
+			}
+	    }
+    }	
+  	return 0;
+}
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function replicateBranchLengths (dummy)
+{
+	FindBranchLengthExpression(1,"MG94custom");
+	bNames  	 = BranchName(givenTree2,-1);
+	definedOrNot = {};
+	for (brCount = Columns(bNames)-2; brCount >= 0; brCount = brCount - 1)
+	{
+		tn 	= bNames[brCount];
+		cbc	= bClasses[brCount];
+		if (definedOrNot[cbc] == 0)
+		{
+			definedOrNot[cbc] = 0;
+			ExecuteCommands ("global NSR"+cbc+"=1;");
+		}
+		ctx = "givenTree2." + tn + ".synRate:=" + presetBranchParameters[brCount] + 
+				"/("+ synWeight + "+NSR" + cbc + "*" +nsWeight+ ");givenTree2." + tn + ".nonSynRate:=NSR"+cbc+"*givenTree2." + tn + ".synRate;";
+		ExecuteCommands (ctx);
+		
+	}
+	return 0;
+}
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function makeReturnValue (dummy)
+{
+	retVal = "lf_MLES = " + lf_MLES + ";lf_MLE_VALUES={};\n";
+	GetInformation (nsr_list, "^NSR");
+	for (brCount = 0; brCount < Columns (nsr_list); brCount = brCount + 1)
+	{
+		ExecuteCommands ("ns_val = " + nsr_list[brCount] + ";");
+		retVal = retVal + "lf_MLE_VALUES[\"" + nsr_list[brCount] + "\"] = " + ns_val + ";\n";
+	}
+	return retVal;
+}
diff --git a/res/TemplateBatchFiles/_CMS_Aux.ibf b/res/TemplateBatchFiles/_CMS_Aux.ibf
new file mode 100644
index 0000000..02dd144
--- /dev/null
+++ b/res/TemplateBatchFiles/_CMS_Aux.ibf
@@ -0,0 +1,344 @@
+ModelMatrixDimension = 0;
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function BuildCodonFrequencies (obsF)
+{
+	PIStop = 1.0;
+	result = {ModelMatrixDimension,1};
+	hshift = 0;
+
+	for (h=0; h<64; h=h+1)
+	{
+		first = h$16;
+		second = h%16$4;
+		third = h%4;
+		if (_Genetic_Code[h]==10) 
+		{
+			hshift = hshift+1;
+			PIStop = PIStop-obsF[first][0]*obsF[second][1]*obsF[third][2];
+			continue; 
+		}
+		result[h-hshift][0]=obsF[first][0]*obsF[second][1]*obsF[third][2];
+	}
+	return result*(1.0/PIStop);
+}
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function BuildParametricCodonFrequencies (obsF, freqMx&)
+{
+	result = {ModelMatrixDimension,1};
+	hshift = 0;
+	normString = "1";
+
+	for (h=0; h<64; h=h+1)
+	{
+		first = h$16;
+		second = h%16$4;
+		third = h%4;
+		if (_Genetic_Code[h]==10) 
+		{
+			hshift = hshift+1;
+			normString = normString + "-" + obsF[first][0] + "*" + obsF[second][1]+ "*" +obsF[third][2];
+			continue; 
+		}
+		result[h-hshift]=obsF[first][0] + "*" + obsF[second][1]+ "*" +obsF[third][2];
+	}
+	
+	freqMx = {ModelMatrixDimension,1};
+	
+	hshift = 0;
+	for (h=0; h<64; h=h+1)
+	{
+		first = h$16;
+		second = h%16$4;
+		third = h%4;
+		if (_Genetic_Code[h]==10) 
+		{
+			hshift = hshift+1;
+		}
+		else
+		{
+			ExecuteCommands ("freqMx[h-hshift]:="+result[h-hshift]+"/("+normString+")");
+		}
+	}
+	return 0;
+}
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function ConstructParametricFrequencies (observedFreq)
+{
+	global A1:<1;
+	global A2:<1;
+	global A3:<1;
+	global C1:<1;
+	global C2:<1;
+	global C3:<1;
+	global G1:<1;
+	global G2:<1;
+	global G3:<1;
+	A1 = observedFreq[0][0];
+	A2 = observedFreq[0][1];
+	A3 = observedFreq[0][2];
+	C1 = observedFreq[1][0]/(1-A1);
+	C2 = observedFreq[1][1]/(1-A2);
+	C3 = observedFreq[1][2]/(1-A3);
+	G1 = observedFreq[2][0]/(1-A1)/(1-C1);
+	G2 = observedFreq[2][1]/(1-A2)/(1-C2);
+	G3 = observedFreq[2][2]/(1-A3)/(1-C3);
+	
+	paramFreqs = {{"A1","A2","A3"}
+				 {"(1-A1)*C1","(1-A2)*C2","(1-A3)*C3"}
+				 {"(1-A1)*(1-C1)*G1","(1-A2)*(1-C2)*G2","(1-A3)*(1-C3)*G3"}
+				 {"(1-A1)*(1-C1)*(1-G1)","(1-A2)*(1-C2)*(1-G2)","(1-A3)*(1-C3)*(1-G3)"}};
+				 
+	return 0;
+}
+
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function PopulateModelMatrix (ModelMatrixName&, EFV, pf)
+{
+	if (!ModelMatrixDimension)
+	{
+		ModelMatrixDimension = 64;
+		for (h = 0 ;h<64; h=h+1)
+		{
+			if (_Genetic_Code[h]==10)
+			{
+				ModelMatrixDimension = ModelMatrixDimension-1;
+			}
+		}
+	}
+	
+	ModelMatrixName = {ModelMatrixDimension,ModelMatrixDimension}; 
+
+	hshift = 0;
+	
+	modelDefString = "";
+	modelDefString*16384;
+	
+	catCounterAL = {};
+	
+	for (h=0; h<64; h=h+1)
+	{
+		if (_Genetic_Code[h]==10) 
+		{
+			hshift = hshift+1;
+			continue; 
+		}
+		vshift = hshift;
+		for (v = h+1; v<64; v=v+1)
+		{
+			diff = v-h;
+			if (_Genetic_Code[v]==10) 
+			{
+				vshift = vshift+1;
+				continue; 
+			}
+			nucPosInCodon = 2;
+			if ((h$4==v$4)||((diff%4==0)&&(h$16==v$16))||(diff%16==0))
+			{
+				if (h$4==v$4)
+				{
+					transition = v%4;
+					transition2= h%4;
+				}
+				else
+				{
+					if(diff%16==0)
+					{
+						transition = v$16;
+						transition2= h$16;
+						nucPosInCodon = 0;
+					}
+					else
+					{
+						transition = v%16$4;
+						transition2= h%16$4;
+						nucPosInCodon = 1;
+					}
+				}
+				hs = Format(h-hshift,0,0);
+				vs = Format(v-vshift,0,0);
+				ts = Format(transition,0,0);
+				ts2= Format(transition2,0,0);
+				ps = Format(nucPosInCodon,0,0);
+				aa1 = _Genetic_Code[0][h];
+				aa2 = _Genetic_Code[0][v];
+				if (pf == 0)
+				{
+					if (aa1==aa2) 
+					{
+						modelDefString*("ModelMatrixName["+hs+"]["+vs+"] := "+_nucBiasTerms[transition][transition2]+"synRate*EFV__["+ts+"]["+ps+"];\n"+
+														 "ModelMatrixName["+vs+"]["+hs+"] := "+_nucBiasTerms[transition][transition2]+"synRate*EFV__["+ts2+"]["+ps+"];\n");
+					}
+					else
+					{
+						bt = aaRateMultipliers[aa1][aa2];
+						if (catCounterAL[bt] == 0)
+						{
+							catCounterAL[bt] = 1;
+							modelDefString*("\nglobal NSR"+bt+"=1;\n");
+						}
+						bt = "NSR"+bt;
+						modelDefString*("ModelMatrixName["+hs+"]["+vs+"] := "+_nucBiasTerms[transition][transition2]+bt+"*synRate*EFV__["+ts+"]["+ps+"];\n"+
+														 "ModelMatrixName["+vs+"]["+hs+"] := "+_nucBiasTerms[transition][transition2]+bt+"*synRate*EFV__["+ts2+"]["+ps+"];\n");	
+					}
+				}
+				else
+				{
+					if (aa1==aa2) 
+					{
+						modelDefString*("ModelMatrixName["+hs+"]["+vs+"] := "+_nucBiasTerms[transition][transition2]+"synRate*"+EFV[transition][nucPosInCodon]+";\n"+
+														 "ModelMatrixName["+vs+"]["+hs+"] := "+_nucBiasTerms[transition][transition2]+"synRate*"+EFV[transition2][nucPosInCodon]+";\n");
+					}
+					else
+					{
+						bt = aaRateMultipliers[aa1][aa2];
+						if (catCounterAL[bt] == 0)
+						{
+							catCounterAL[bt] = 1;
+							modelDefString*("\nglobal NSR"+bt+"=1;\n");
+						}
+						bt = "NSR"+bt;
+						modelDefString*("ModelMatrixName["+hs+"]["+vs+"] := "+_nucBiasTerms[transition][transition2]+bt+"*synRate*"+EFV[transition][nucPosInCodon]+";\n"+
+														 "ModelMatrixName["+vs+"]["+hs+"] := "+_nucBiasTerms[transition][transition2]+bt+"*synRate*"+EFV[transition2][nucPosInCodon]+";\n");	
+					}				
+				}
+			}
+	    }
+    }		
+	modelDefString*0;
+	ExecuteCommands (modelDefString);
+	return 0;
+}
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function FindBranchLengthExpression (dummy, rateMatrix&)
+{
+	/* first decide how many rate classes there are */
+	
+	rcCount = 0;
+	for (h=0; h<21; h=h+1)
+	{
+		for (v=h+1; v<21; v=v+1)
+		{
+			if (aaRateMultipliers[h][v]>rcCount)
+			{
+				rcCount = aaRateMultipliers[h][v];
+			}
+		}
+	}
+	
+	rcCount = rcCount+1;
+	synWeight = 0;
+	nsWeights = {rcCount,1};
+	
+	if (dummy)
+	{
+		for (h=0; h<rcCount; h=h+1)
+		{
+			ExecuteCommands ("NSR"+h+"=1;");
+		}
+	}
+	
+	synRate = 1;
+	hshift  = 0;	
+	
+	for (h=0; h<64; h=h+1)
+	{
+		if (_Genetic_Code[h]==10) 
+		{
+			hshift = hshift+1;
+			continue; 
+		}
+		vshift = hshift;
+		for (v = h+1; v<64; v=v+1)
+		{
+			diff = v-h;
+			if (_Genetic_Code[v]==10) 
+			{
+				vshift = vshift+1;
+				continue; 
+			}
+			if ((h$4==v$4)||((diff%4==0)&&(h$16==v$16))||(diff%16==0))
+			{
+				aa1 = _Genetic_Code[0][h];
+				aa2 = _Genetic_Code[0][v];
+				if (aa1==aa2 || dummy == 0) 
+				{
+					synWeight = synWeight + rateMatrix[h-hshift][v-vshift]*vectorOfFrequencies[h-hshift]+rateMatrix[v-vshift][h-hshift]*vectorOfFrequencies[v-vshift];
+				}
+				else
+				{
+					bt = aaRateMultipliers[aa1][aa2];
+					nsWeights[bt] = nsWeights[bt] + rateMatrix[h-hshift][v-vshift]*vectorOfFrequencies[h-hshift]+rateMatrix[v-vshift][h-hshift]*vectorOfFrequencies[v-vshift];
+				}
+			}
+	    }
+    }	
+    if (dummy)	
+    {
+	    resString = "";
+	    resString * 1024;
+	    resString * (""+synWeight);
+		for (h=0; h<rcCount; h=h+1)
+		{
+			resString*("+NSR"+h+"*"+nsWeights[h]);
+		}
+    	resString * 0;
+		return resString;
+	}
+	return ""+synWeight;
+}
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function replicateBranchLengths (treeID)
+{
+	mFactor = "(" + mgPlainFactor+ ")/(" + FindBranchLengthExpression(1,"MG94custom") + ")";
+	bNames  = Rows (presetBranchParameters[treeID]);
+	for (brCount = Columns(bNames)-1; brCount >= 0; brCount = brCount - 1)
+	{
+		tn = bNames[brCount];
+		ExecuteCommands ("codon_tree_"+treeID+"." + tn + ".synRate:=" + mFactor + "*" + (presetBranchParameters[treeID])[tn] + ";");
+	}
+	return 0;
+}
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function makeReturnValue (dummy)
+{
+	retVal = "lf_MLES = " + lf_MLES + ";lf_MLE_VALUES={};\n";
+	GetInformation (nsr_list, "^NSR");
+	for (brCount = 0; brCount < Columns (nsr_list); brCount = brCount + 1)
+	{
+		ExecuteCommands ("ns_val = " + nsr_list[brCount] + ";");
+		retVal = retVal + "lf_MLE_VALUES[\"" + nsr_list[brCount] + "\"] = " + ns_val + ";\n";
+	}
+	return retVal;
+}
+
+/*------------------------------------------------------------------------*/
+
+function constructLF (lf_name, filter_pref, tree_pref, part_count)
+{
+	lfDefCommand = "";
+	lfDefCommand * 128;
+	lfDefCommand * ("LikelihoodFunction  " + lf_name + " = (" + filter_pref + "_1," + tree_pref + "_1");
+	
+	for (_partID = 2; _partID <= part_count; _partID = _partID + 1)
+	{
+		lfDefCommand * ("," + filter_pref + "_" + _partID + "," + tree_pref + "_" +  _partID);
+	}
+	
+	lfDefCommand * ");";
+	lfDefCommand * 0;
+	return lfDefCommand;
+}
diff --git a/res/TemplateBatchFiles/_MFReader_.ibf b/res/TemplateBatchFiles/_MFReader_.ibf
new file mode 100644
index 0000000..6219c07
--- /dev/null
+++ b/res/TemplateBatchFiles/_MFReader_.ibf
@@ -0,0 +1,219 @@
+/*------------------------------------------------------------------------*/
+
+function readNEXUS_partitionInfo (dummy)
+{
+	ExecuteAFile 	(HYPHY_LIB_DIRECTORY + "TemplateBatchFiles" + DIRECTORY_SEPARATOR + "TreeTools.ibf");
+	ExecuteAFile 	(HYPHY_LIB_DIRECTORY + "TemplateBatchFiles" + DIRECTORY_SEPARATOR + "Utility" + DIRECTORY_SEPARATOR + "ReadDelimitedFiles.bf");
+	
+	mySplits 		 = {};
+	myTrees  		 = {};
+	treeStrings		 = {};
+	splitCoordinates = {};
+	
+	for (_k2 = 0; _k2 < _pCount; _k2 = _k2 + 1)
+	{
+		if (Columns(DATA_FILE_PARTITION_MATRIX) == 0)
+		{
+			mySplits[_k2] = Format(0,10,0)+"-"+Format(ds_1.sites-1,10,0);
+		}
+		else
+		{
+			_pos = splitOnRegExp(DATA_FILE_PARTITION_MATRIX[1][_k2],"\\-");
+			_r1 = (0+_pos[0])%3;
+			if (_r1 == 2)
+			{
+				_r1 = (0+_pos[0])$3*3+3;
+			}
+			else
+			{
+				_r1 = (0+_pos[0])$3*3;					
+			}
+			_r2 = (0+_pos[1])%3;
+			if (_r2 >=1)
+			{
+				_r2 = (0+_pos[1])$3*3+2;
+			}
+			else
+			{
+				_r2 = (0+_pos[1])$3*3-1;					
+			}
+			mySplits[_k2]		 					 = Format(_r1,10,0)+"-"+Format(_r2,10,0);
+			splitCoordinates[Abs(splitCoordinates)]	 = {{_r1__,_r2__}};
+		}
+		ts			  = NEXUS_FILE_TREE_MATRIX[_k2][1];
+		UseModel 		(USE_NO_MODEL);
+		Tree testTree = ts;
+		testTreeAVL   = testTree^0;
+		myTrees[_k2]  = KillInternalZeroBranchLengths (testTreeAVL);
+	}
+	return 0;
+}
+
+
+/*------------------------------------------------------------------------*/
+
+function constructLF (lf_name, filter_pref, tree_pref, part_count)
+{
+	lfDefCommand = "";
+	lfDefCommand * 128;
+	lfDefCommand * ("LikelihoodFunction  " + lf_name + " = (" + filter_pref + "_1," + tree_pref + "_1");
+	
+	for (_partID = 2; _partID <= part_count; _partID = _partID + 1)
+	{
+		lfDefCommand * ("," + filter_pref + "_" + _partID + "," + tree_pref + "_" +  _partID);
+	}
+	
+	lfDefCommand * ");";
+	lfDefCommand * 0;
+	return lfDefCommand;
+}
+
+/*------------------------------------------------------------------------*/
+
+function populateTrees (tree_pref, part_count)
+{
+	lfDefCommand = "";
+	lfDefCommand * 128;
+	
+	for (_partID = 1; _partID <= part_count; _partID = _partID + 1)
+	{
+		lfDefCommand * ("Tree " + tree_pref + "_" + _partID + " = " + treeStrings[_partID] + ";\n");
+	}
+	
+	lfDefCommand * 0;
+	ExecuteCommands (lfDefCommand);
+	return 0;
+}
+
+/*------------------------------------------------------------------------*/
+
+function copyTreeBL (tree_pref, tree_pref_2, scaler_pref, part_count)
+{
+	lfDefCommand = "";
+	lfDefCommand * 128;
+	
+	for (_partID = 1; _partID <= part_count; _partID = _partID + 1)
+	{
+		lfDefCommand * ("Tree " + tree_pref + "_" + _partID + " = " + treeStrings[_partID] + ";\nglobal " + scaler_pref + "_" + _partID + "=1;");
+		
+		lfDefCommand * ("ReplicateConstraint(\"this1.?.?:=" + 
+											scaler_pref + 
+											"_" + 
+											_partID + 
+											"*this2.?.?__\","+
+											tree_pref + "_" + _partID + "," +
+											tree_pref_2 + "_" + _partID + ");");
+	}
+	
+	lfDefCommand * 0;
+	ExecuteCommands (lfDefCommand);
+	return 0;
+}
+
+/*------------------------------------------------------------------------*/
+
+
+if (_runAsFunctionLibrary != 1)
+{
+	fileCount	= 0;
+	while (fileCount < 1)
+	{
+		fprintf (stdout, "How many datafiles are to be analyzed (>=1):?");
+		fscanf  (stdin, "Number", fileCount);
+		fileCount = fileCount $ 1;
+	}
+	
+	totalCodonCount  = 0;
+	totalCharCount	 = 0;
+	totalUniqueSites = 0;
+	treeStrings		 = {};
+	splitCoordinates = {};
+	
+	if (Abs(GeneticCodeExclusions) == 0) 
+	{
+		GeneticCodeExclusions = "";
+	}
+	
+	
+	for (fileID = 1; fileID <= fileCount; fileID = fileID + 1)
+	{
+		fprintf (stdout, "\nReading input file ", fileID, "/", fileCount, "\n");
+		SetDialogPrompt ("Please specify codon data #" + fileID + ":");
+	
+		ExecuteCommands (
+		"DataSet				ds_" +fileID + " = ReadDataFile (PROMPT_FOR_FILE);");
+		
+		if (fileCount == 1)
+		{
+			_pCount = Rows(NEXUS_FILE_TREE_MATRIX);
+			if ((_pCount == Columns(DATA_FILE_PARTITION_MATRIX) && Columns(DATA_FILE_PARTITION_MATRIX)) || _pCount == 1)
+			{
+				readNEXUS_partitionInfo (0);
+				fileCount = _pCount;
+	
+				DataSet 	ds_0 = ReadDataFile (LAST_FILE_PATH);
+				for (fileID = 1; fileID <= fileCount; fileID = fileID + 1)
+				{
+					DataSetFilter filteredData = CreateFilter (ds_0,3,mySplits[fileID-1],,GeneticCodeExclusions);
+					Export (baseFPath,filteredData);
+					
+					if (_doAAcids == 0)
+					{
+						codonComponent = "DataSetFilter filteredData_" + fileID + " = CreateFilter (ds_"+fileID +",3,\"\",\"\",GeneticCodeExclusions);totalCharCount=totalCharCount+filteredData_"+fileID+".sites*filteredData_"+fileID+".species;totalCodonCount=totalCodonCount+filteredData_"+fileID+".sites;totalUniqueSites=totalUniqueSites+filteredData_"+fileID+".unique_sites;";
+					}
+					else
+					{
+						codonComponent = "totalCharCount=totalCharCount+nucData_"+fileID+".sites*nucData_"+fileID+".species;totalCodonCount=totalCodonCount+nucData_"+fileID+".sites;totalUniqueSites=totalUniqueSites+nucData_"+fileID+".unique_sites;";
+					}
+					ExecuteCommands ( 
+									"DataSet				ds_" +fileID + " = ReadFromString (baseFPath);"+
+									"fprintf (stdout,\"\\n\",ds_" + fileID + ");"+
+									"DataSetFilter nucData_" + fileID + " = CreateFilter (ds_"+fileID +",1);"+
+									codonComponent);
+					treeString = myTrees[fileID-1];
+					ExecuteCommands ("treeString_" + fileID + " = treeString;");
+					treeStrings[fileID] = treeString;
+				}
+				break;
+			}
+		}
+		
+		
+		if (_doAAcids == 0)
+		{
+			codonComponent = "DataSetFilter filteredData_" + fileID + " = CreateFilter (ds_"+fileID +",3,\"\",\"\",GeneticCodeExclusions);totalCharCount=totalCharCount+filteredData_"+fileID+".sites*filteredData_"+fileID+".species;totalCodonCount=totalCodonCount+filteredData_"+fileID+".sites;totalUniqueSites=totalUniqueSites+filteredData_"+fileID+".unique_sites;";
+		}
+		else
+		{
+			codonComponent = "totalCharCount=totalCharCount+nucData_"+fileID+".sites*nucData_"+fileID+".species;totalCodonCount=totalCodonCount+nucData_"+fileID+".sites;totalUniqueSites=totalUniqueSites+nucData_"+fileID+".unique_sites;";
+		}
+		ExecuteCommands ("fprintf (stdout,\"\\n\",ds_" + fileID + ");DataSetFilter nucData_" + fileID + " = CreateFilter (ds_"+fileID +",1);"+codonComponent);
+		#include								   "queryTree.bf";
+		ExecuteCommands ("treeString_" + fileID + " = treeString;");
+		treeStrings[fileID] = treeString;
+	}
+	
+	if (_doAAcids)
+	{
+		overallFrequencies 		  = {20,1};
+	}	
+	else
+	{
+		positionFrequencies       = {4,3};
+		overallFrequencies 		  = {4,1};
+	}
+	
+	for (fileID = 1; fileID <= fileCount; fileID = fileID + 1)
+	{
+		if (_doAAcids)
+		{
+			ExecuteCommands 	  		("HarvestFrequencies (ts, nucData_"+fileID+",1,1,1);cfs = nucData_"+fileID+".sites;");		
+		}
+		else
+		{
+			ExecuteCommands 	  		("HarvestFrequencies (tp, filteredData_"+fileID+",3,1,1);HarvestFrequencies (ts, filteredData_"+fileID+",1,1,1);cfs = filteredData_"+fileID+".sites;");
+			positionFrequencies 		= positionFrequencies 		 + tp*(cfs/totalCodonCount);
+		}
+		overallFrequencies  		= overallFrequencies + ts*(cfs/totalCodonCount);
+	}
+}
diff --git a/res/TemplateBatchFiles/_MSCOneStep.ibf b/res/TemplateBatchFiles/_MSCOneStep.ibf
new file mode 100644
index 0000000..a889a32
--- /dev/null
+++ b/res/TemplateBatchFiles/_MSCOneStep.ibf
@@ -0,0 +1,62 @@
+ExecuteAFile (HYPHY_LIB_DIRECTORY+"TemplateBatchFiles"+DIRECTORY_SEPARATOR+"TemplateModels"+DIRECTORY_SEPARATOR+"chooseGeneticCode.def");
+
+/* computing the map from achievable states to 21x21 */
+
+defaultAAOrdering 	= "FLIMVSPTAYHQNKDECWRG";
+hshift      		= 0;
+mapUpTo2121 		= {};
+isOneStepSub 		= {21,21};
+matrixToVectorMap	= {20,20}["-1"];
+
+for (h=0; h<64; h=h+1)
+{
+	if (_Genetic_Code[h]==10) 
+	{
+		hshift = hshift+1;
+		continue; 
+	}
+	vshift = hshift;
+	for (v = h+1; v<64; v=v+1)
+	{
+		diff = v-h;
+		if (_Genetic_Code[v]==10) 
+		{
+			vshift = vshift+1;
+			continue; 
+		}
+		if ((h$4==v$4)||((diff%4==0)&&(h$16==v$16))||(diff%16==0))
+		{
+			aa1 = _Genetic_Code[0][h];
+			aa2 = _Genetic_Code[0][v];
+			if (aa1 != aa2)
+			{
+				if (aa1 < aa2)
+				{
+					idx_mx = {{aa1,aa2}};
+				}
+				else
+				{
+					idx_mx = {{aa2,aa1}};
+				}
+				
+				if (aa1>10) {aa1c = aa1-1;} else {aa1c = aa1;}
+				if (aa2>10) {aa2c = aa2-1;} else {aa2c = aa2;}
+				isOneStepSub [aa1c][aa2c] = 1;
+				isOneStepSub [aa2c][aa1c] = 1;
+				
+				map_idx = mapUpTo2121 [idx_mx];
+				if (map_idx == 0)
+				{
+					mapUpTo2121[idx_mx] = Abs(mapUpTo2121)+1;
+					map_idx = Abs(mapUpTo2121);
+					matrixToVectorMap[aa1c][aa2c] = map_idx-1;
+					matrixToVectorMap[aa2c][aa1c] = map_idx-1;
+				}
+			}	
+		}
+    }
+}	
+
+stateVectorDimension = Abs(mapUpTo2121);
+maxRateClasses		 = stateVectorDimension;
+fprintf (stdout, "\n", stateVectorDimension, " one step reachable states\n");
diff --git a/res/TemplateBatchFiles/_tipDater.ibf b/res/TemplateBatchFiles/_tipDater.ibf
new file mode 100644
index 0000000..0649be1
--- /dev/null
+++ b/res/TemplateBatchFiles/_tipDater.ibf
@@ -0,0 +1,83 @@
+/*-----------------------------------------------------------*/
+
+function getTipDatesFromNames2 (treeNameID)
+{
+	retAVL = {};
+	
+	ExecuteCommands ("treeAVL="+treeNameID+"^0;");
+	maxV            = 0; /* scaling factor */
+	minV            = 1e100;
+	ttipCount = 0;
+	for (tc = 1; tc < Abs(treeAVL); tc += 1)
+	{
+		nodeInfo = treeAVL[tc];
+		if (Abs(nodeInfo["Children"])==0)
+		{	
+			rgm = nodeInfo["Length"];
+			if (rgm<=0)
+			{
+				fprintf (stdout, "\nERROR: No date information found for sequence ", nodeInfo["Names"], "\n");
+				return {};
+			}
+			maxV = Max (labelV,maxV);
+			minV = Min (labelV,minV);
+			ttipCount += 1;
+			retAVL[nodeInfo["Name"]] = rgm;
+		}
+	}
+	
+	if (maxV>1)
+	{
+		maxV = 10^(-((Log(maxV)/Log(10)+0.5)$1));
+		for (tc = 0; tc < ttipCount; tc+=1)
+		{
+			abn = Eval ("TipName("+treeNameID+",tc)");
+			retAVL[abn] = retAVL[abn]*maxV;
+		}		
+		minV = minV * maxV;
+	}
+	return retAVL;
+}
+
+/*-----------------------------------------------------------*/
+
+function getTipDatesFromNames1 (treeNameID)
+{
+	retAVL = {};
+	ExecuteCommands ("ttipCount=TipCount("+treeNameID+");");
+	regExpToMatch = "[0-9]*\\.?[0-9]+$";
+	maxV          = 0;
+	minV          = 1e100;
+    
+	for (tc = 0; tc < ttipCount; tc += 1)
+	{
+		abn = Eval ("TipName("+treeNameID+",tc)");
+		rgm = abn$regExpToMatch;
+		if (rgm[0]<0)
+		{
+			fprintf (stdout, "\nERROR: No date information found for sequence ", nodeInfo["Names"], "\n");
+			return {};
+		}
+		labelV = 0+abn[rgm[0]][rgm[1]];
+		if (labelV < 0)
+		{
+			fprintf (stdout, "\nERROR: Negative length for sequence ", nodeInfo["Names"], "\n");
+			return {};
+		}
+		maxV = Max (labelV,maxV);
+		minV = Min (labelV,minV);
+		
+		retAVL[abn] = labelV;
+	}
+	if (maxV>1)
+	{
+		maxV = 10^(-((Log(maxV)/Log(10)+0.5)$1));
+		for (tc = 0; tc < ttipCount; tc+=1)
+		{
+			abn = Eval ("TipName("+treeNameID+",tc)");
+			retAVL[abn] = retAVL[abn]*maxV;
+		}		
+		minV = minV * maxV;
+	}
+	return retAVL;
+}
\ No newline at end of file
diff --git a/res/TemplateBatchFiles/bayesgraph.ibf b/res/TemplateBatchFiles/bayesgraph.ibf
new file mode 100644
index 0000000..2f267f6
--- /dev/null
+++ b/res/TemplateBatchFiles/bayesgraph.ibf
@@ -0,0 +1,845 @@
+USE_MPI_CACHING = 1;
+PRINT_DIGITS = -1;
+
+
+function add_discrete_node (node_id, max_parents, sample_size, nlevels)
+{
+	node = {};
+	node["NodeID"] = node_id;
+    node["NodeType"] = 0;
+    node["MaxParents"] = max_parents;
+	node["PriorSize"] = sample_size;
+	node["NumLevels"] = nlevels;
+	return node;
+}
+
+function add_gaussian_node (node_id, max_parents, sample_size, mean, precision, scale)
+{
+	node = {};
+	node["NodeID"] = node_id;
+    node["NodeType"] = 1;
+	node["MaxParents"] = max_parents;
+	node["PriorSize"] = sample_size;
+	node["PriorMean"]	= mean;
+	node["PriorPrecision"]	= precision;
+	node["PriorScale"] = scale;
+	return node;
+}
+
+
+
+/* utility functions from ReadDelimitedFiles.bf */
+function ReadCSVTable (fileName, haveHeader)
+{
+	if (Abs(fileName) == 0)
+	{
+		fscanf (PROMPT_FOR_FILE, "Lines", inData);
+	}
+	else
+	{
+		fscanf (fileName, "Lines", inData);		
+	}
+	if (haveHeader)
+	{
+		output = {};
+		output[0] = splitOnRegExp (inData[0],"\\,");
+	}
+	felMXString = "";
+	felMXString * 256;
+	felMXString * "_tempMatrix={";
+	for (lineID = haveHeader; lineID < Columns(inData); lineID = lineID + 1)
+	{
+		felMXString * ("{" + inData[lineID] + "}\n");
+	}
+	felMXString * "}";
+	felMXString * 0;
+	ExecuteCommands (felMXString);
+	felMXString = 0;
+	inData = 0;
+	if (haveHeader)
+	{
+		output[1] = _tempMatrix;
+		_tempMatrix = 0;
+		return output;
+	}
+	return _tempMatrix;
+}
+
+
+function splitOnRegExp (string, splitter)
+{
+	matched = string || splitter;
+	splitBits = {};
+	if (matched [0] < 0)
+	{
+		splitBits[0] = string;
+	}
+	else
+	{
+		mc = 0;
+		if (matched[0] == 0)
+		{
+			fromPos = matched[1]+1;
+			mc = 2;
+		}
+		else
+		{
+			fromPos = 0;
+			toPos	= 0;
+		}
+		for (; mc < Rows (matched); mc = mc+2)
+		{
+			toPos = matched[mc]-1;
+			splitBits [Abs(splitBits)] = string[fromPos][toPos];
+			fromPos    = matched[mc+1]+1;
+		}
+		splitBits [Abs(splitBits)] = string[fromPos][Abs(string)-1];
+	}
+	return splitBits;
+}
+
+
+/* a wrapper around ReadCSVTable */
+function import_data (inData, hasHeader)
+{
+	timer0 = Time(0);
+	file_input = ReadCSVTable (inData, hasHeader);
+	
+	bgm_data_matrix = {{}};
+	names = {{}};
+	num_nodes = 0;
+	
+	if (hasHeader)
+	{
+		names = file_input["0"];
+		bgm_data_matrix = file_input["1"];
+		
+		fprintf (stdout, "Read ", Rows(bgm_data_matrix), " cases from file.\n");
+		
+		num_nodes = Columns(bgm_data_matrix);
+		
+		if (Abs(file_input["0"]) != num_nodes)
+		{
+			fprintf (stdout, "ERROR! Number of items in header does not match the number of items in the data matrix.");
+			return 0;
+		}
+		
+		fprintf (stdout, "Detected ", num_nodes, " variables.\n");
+	}
+	else
+	{
+		bgm_data_matrix = file_input;
+		
+		fprintf (stdout, "Read ", Rows(bgm_data_matrix), " cases from file.\n");
+		
+		num_nodes = Columns(bgm_data_matrix);
+		names = {num_nodes, 1};
+		
+		for (i = 0; i < num_nodes; i = i+1)
+		{
+			names[i] = i;
+		}
+		
+		fprintf (stdout, "Detected ", num_nodes, " variables.\n");
+	}
+	
+	return bgm_data_matrix;
+}
+
+
+
+function import_cache (filename, cache_name)
+{
+	fscanf (filename, "Raw", cacheStr);
+	ExecuteCommands(cache_name+" = "+cacheStr+";");
+	return 0;
+}
+
+
+
+function attach_cache (_bgm, cache)
+{
+	ExecuteCommands ("SetParameter("+_bgm+", BGM_SCORE_CACHE, cache);");
+	return 0;
+}
+
+
+
+
+/* ____________________________________________________________ */
+/*  accessor functions											*/
+function setStructure (_bgm, graph_matrix)
+{
+	ExecuteCommands("SetParameter ("+_bgm+", BGM_GRAPH_MATRIX, graph_matrix);");
+}
+
+function setOrder (_bgm, order_matrix)
+{
+	if (Rows(order_matrix) > 1)
+	{
+		if (Columns(order_matrix) == 1)
+		{
+			t_order_matrix = Transpose(order_matrix);
+			ExecuteCommands("SetParameter ("+_bgm+", BGM_NODE_ORDER, t_order_matrix);");
+		}
+		else
+		{
+			fprintf (stdout, "Warning: expecting row vector matrix, received non-vector matrix");
+			fprintf (stdout, "         with dimensions ", Rows(order_matrix), " x ", Columns(order_matrix), "\n");
+			fprintf (stdout, "Node order not set!\n");
+		}
+	}
+	else
+	{
+		ExecuteCommands ("SetParameter ("+_bgm+", BGM_NODE_ORDER, order_matrix);");
+	}
+}
+
+
+function setConstraints (_bgm, constraint_matrix)
+{
+	ExecuteCommands("SetParameter ("+_bgm+", BGM_CONSTRAINT_MATRIX, constraint_matrix);");
+	return 0;
+}
+
+
+/* ____________________________________________________________ */
+/*	Assign data matrix to _BayesianGraphicalModel object 		*/
+function attach_data (_bgm, data, impute_max, impute_burn, impute_samp)
+{
+	BGM_IMPUTE_MAXSTEPS = impute_max$1;
+	BGM_IMPUTE_BURNIN = impute_burn$1;
+	BGM_IMPUTE_SAMPLES = impute_samp$1;
+
+	ExecuteCommands("SetParameter ("+_bgm+", BGM_DATA_MATRIX, data);");
+	return 0;
+}
+
+
+
+/*  
+	Structural (graph) MCMC by Metropolis-Hastings				
+ 		Returns matrix object containing chain trace, edge			
+	marginal posterior probabilities, and best graph as 		
+	adjacency matrix.
+	
+	rand_tolerance = maximum number of failed steps in graph randomization
+					to tolerate
+	
+	prob_swap = probability of reversing an edge, instead of adding or deleting an edge
+	
+	with_order = a vector containing node ordering to constrain graph MCMC
+					set to 0 to have unconstrained chain sample
+*/
+
+BGM_MCMC_MAXFAILS = 100;
+BGM_MCMC_PROBSWAP = 0.1;
+
+function graph_MCMC (_bgm, duration, burnin, num_samples, with_order=0)
+{
+	if (Rows(with_order) * Columns(with_order) > 0)
+	{
+		/* fixed node order */
+		ExecuteCommands("setOrder ("+_bgm+", with_order);");
+		BGM_OPTIMIZATION_METHOD = 2;
+	}
+	else
+	{
+		/* shuffle node order */
+		BGM_OPTIMIZATION_METHOD = 3;
+	}
+	
+	BGM_MCMC_MAXSTEPS 	= duration;
+	BGM_MCMC_BURNIN		= burnin;
+	BGM_MCMC_SAMPLES 	= num_samples;
+	
+	ExecuteCommands("Optimize(res, "+_bgm+");");
+	
+	return res;
+}
+
+
+/*
+	Order (node precedence permutation) MCMC by Metropolis-Hastings
+*/
+function order_MCMC (_bgm, duration, burnin, num_samples)
+{
+	BGM_OPTIMIZATION_METHOD = 4;
+	
+	BGM_MCMC_MAXSTEPS 	= duration;
+	BGM_MCMC_BURNIN		= burnin;
+	BGM_MCMC_SAMPLES 	= num_samples;
+	
+	ExecuteCommands("Optimize(res, "+_bgm+");");
+	
+	return res;
+}
+
+
+
+
+
+function display_MCMC_chain (res)
+{
+	if (Rows(res)*Columns(res) == 0)
+	{
+		fprintf (stdout, "ERROR: Cannot display MCMC chain for empty matrix\n");
+		return 1;
+	}
+	
+	pp_trace = res[-1][0];
+	min_trace = pp_trace[0];
+	max_trace = pp_trace[0];
+	
+	/* locate min/max and end of trace */
+	for (k = 0; k < Rows(pp_trace); k = k+1)
+	{
+		if (pp_trace[k] == 0)
+		{
+			break;
+		}
+		if (pp_trace[k] < min_trace)
+		{
+			min_trace = pp_trace[k];
+		}
+		if (pp_trace[k] > max_trace)
+		{
+			max_trace = pp_trace[k];
+		}
+	}
+	k = k-1;
+	pp_trace = pp_trace[{{0,0}}][{{k-1,0}}];
+	
+	
+	columnHeaders = {{"MCMC chain","sample;1;2;3;4;5;6;7;8;9"}};
+	
+	OpenWindow (CHARTWINDOW,{{"Posterior probability"}
+			{"columnHeaders"}
+			{"pp_trace"}
+			{"Step Plot"}
+			{"Index"}
+			{"MCMC chain"}
+			{"chain sample step"}
+			{"posterior prob."}
+			{""}
+			{"0"}
+			{""}
+			{"0;0"}
+			{"10;1.309;0.785398"}
+			{"Times:12:0;Times:10:0;Times:12:2"}
+			{"0;0;13816530;16777215;0;0;6579300;11842740;13158600;14474460;0;3947580;16777215;15670812;6845928;16771158;2984993;9199669;7018159;1460610;16748822;11184810;14173291"}
+			{"16,"+min_trace+","+max_trace}
+			},
+			"405;462;105;100");
+	
+	return 0;
+}
+
+
+function get_MCMC_graph (res, num_nodes, mode)
+{
+	/* mode = -1 		: best_graph
+	   mode = 0 		: last_graph
+	   0 < mode <= 1 	: marginal posterior graph with threshold = mode (e.g. 0.9)
+	   */
+	graph = {num_nodes, num_nodes};
+	
+	if (mode > 0)
+	{
+		for (row = 0; row < num_nodes * num_nodes; row = row+1)
+		{
+			if (res[row][1] >= mode)
+			{
+				graph[row $ num_nodes][row % num_nodes] = 1;
+			}
+		}
+	}
+	else
+	{
+		for (row = 0; row < num_nodes; row = row+1)
+		{
+			for (col = 0; col < num_nodes; col = col+1)
+			{
+				graph[row][col] = res[row*num_nodes+col][mode+3];
+			}
+		}
+	}
+	
+	return graph;
+}
+
+
+function write_edgelist (filename,res,num_nodes,directed)
+{
+	fprintf (filename, CLEAR_FILE, KEEP_OPEN);
+	if (directed)	
+	{
+		for (row = 0; row < num_nodes; row = row+1)
+		{
+			for (col = 0; col < num_nodes; col = col+1)
+			{
+				fprintf (filename, names[row], ",", names[col], ",", res[row*num_nodes+col][1], "\n");
+			}
+		}
+	}
+	else
+	{
+		for (row = 0; row < num_nodes-1; row = row+1)
+		{
+			for (col = row+1; col < num_nodes; col = col+1)
+			{
+				fprintf (filename, names[row], ",", names[col], ",", res[row*num_nodes+col][1] + res[col*num_nodes+row][1], "\n");
+			}
+		}
+	}
+	fprintf (filename, CLOSE_FILE);
+	return 0;
+}
+
+
+function mcmc_graph_to_dotfile (filename, threshold, res, nodes)
+{	
+	fprintf (filename, CLEAR_FILE);
+	fprintf (filename, "digraph foo\n{\n");
+	fprintf (filename, "\tnode [fontname=\"Helvetica\" style=\"filled\" fillcolor=\"white\"];\n");
+	fprintf (filename, "\tedge [labelfontname=\"Helvetica\" labelangle=30 labeldistance=2];\n");
+	
+	for (_n = 0; _n < Abs(nodes); _n+=1) {
+		fprintf (filename, "\t", (nodes[_n])["NodeID"]);
+		if ((nodes[_n])["NodeType"]==0) {
+			fprintf (filename, " [shape=\"Msquare\"];\n");
+		} else {
+			fprintf (filename, " [shape=\"circle\"];\n");
+		}
+	}
+	
+	
+	// sum edge posteriors in both directions between nodes X and Y, 
+	// and assign direction to the greater value
+	for (row = 0; row < num_nodes-1; row = row+1) {
+		for (col = row+1; col < num_nodes; col = col+1) {
+			xy = res[row*num_nodes+col][1];
+			yx = res[col*num_nodes+row][1];
+			if (xy+yx > threshold) {
+				/*
+					This is really annoying - order MCMC reports edge marginal matrix with rows = child
+					whereas graph MCMC reports rows = parent
+				*/
+				if ( xy > yx ) {
+					fprintf (filename, "\t", (nodes[row])["NodeID"], "->", (nodes[col])["NodeID"], ";\n");
+				} else {
+					fprintf (filename, "\t", (nodes[col])["NodeID"], "->", (nodes[row])["NodeID"], ";\n");
+				}
+			}			
+		}
+	}
+	
+	fprintf (filename, "}\n");
+	return 0;
+}
+
+
+/* argument must be string identifier of BGM object */
+function get_network_parameters (_bgm)
+{
+	ExecuteCommands("GetString (res, "+_bgm+", 1);");
+	ExecuteCommands(res);
+	/* returns string identifier to associative array */
+	ExecuteCommands("params="+_bgm+"_export;");
+	return params;
+}
+
+
+function get_node_score_cache (_bgm)
+{
+	ExecuteCommands("GetString (res, "+_bgm+", 0);");
+	return res;
+}
+
+
+/*
+function getStructure (_bgm)
+{
+	ExecuteCommands("GetInformation (s, "+_bgm+", 0);");
+	return s;
+}
+
+function getNodeOrder (_bgm)
+{
+	ExecuteCommands("GetInformation (s, "+_bgm+", 1);");
+	return s;
+}
+
+*/
+
+
+
+
+/*  
+	Simulation of data based on the inferred network
+		structure and parameters.
+	mode = 0 (local) : for each case, instantiate parameters de novo.
+						Better for assessing uncertainty.
+	mode = 1 (global) : instantiate all parameters once.
+						Assuming known network.
+*/
+function instantiate_CPDFs (params)
+{
+	node_names = Rows(params);
+	
+	/* instantiate network parameters from conditional posterior distribution functions */
+	for (i = 0; i < Abs(params); i = i + 1) {
+		/* stores instantiations */
+		ExecuteCommands("(params[\""+node_names[i]+"\"])[\"Parameters\"] = {};");	
+		
+		/* number of parent combinations */
+		//ExecuteCommands("npac = Columns((params[\""+node_names[i]+"\"])[\"CPDFs\"]);");
+		ExecuteCommands("npac = (params[\""+node_names[i]+"\"])[\"NParentCombs\"];"); // safe version
+		
+		for (pa = 0; pa < npac; pa = pa+1) {
+			ExecuteCommands("_p = " + ((params[node_names[i]])["CPDFs"])[pa] + ";");
+			ExecuteCommands("((params[\""+node_names[i]+"\"])[\"Parameters\"])[\""+pa+"\"] = "+_p+";");
+		}
+		
+		//ExecuteCommands("((params[\""+node_names[i]+"\"])[\"Levels\"] = Columns( ((params[\""+node_names[i]+"\"])[\"Parameters\"])[0] ));");
+	}
+	return 0;
+}
+
+
+/*
+	Return a parameter vector for conditional Gaussian (CG) node given 
+	hyperparameters passed as arguments.
+*/
+function cg_params (mean_vec, rho, phi, tau) {
+	ExecuteCommands("sigma = Random({{"+phi+"}}, {\"PDF\":\"InverseWishart\", \"ARG0\":{{"+rho+"}} });");
+	ExecuteCommands("em = Random("+mean_vec+", {\"PDF\":\"Gaussian\", \"ARG0\":(Inverse("+tau+") * "+sigma[0]+") } );");
+	return ({"EM":em, "SIGMA":sigma});
+}
+
+
+
+function simulate_data (params, num_cases)
+{
+	// prepare matrix to store simulated data
+	result = {num_cases, Abs(params)};
+	
+	node_names = Rows(params);
+	if ( Columns(Rows((params[node_names[0]])["Parameters"])) == 0 )
+	{
+		/* parameters have not been instantiated yet */
+		instantiate_CPDFs(params);
+	}
+	
+	
+	// initialize State variables and generate root states
+	for (case = 0; case < num_cases; case = case+1) {	
+		
+		for (i = 0; i < Abs(params); i = i + 1) {
+			// set to String as a placeholder
+			(params[node_names[i]])["State"] = "";
+			
+			if ( Type((params[node_names[i]])["Parents"]) == "AssociativeList" ) {
+				// if condition is true then this is a root node (no parents) 
+				if ( (params[node_names[i]])["NodeType"] == 0 ) {
+					// discrete node, parameters define conditional probability table
+					urn = Random(0,1);
+					cpt = ((params[node_names[i]])["Parameters"])[0];
+					r_i = Columns(cpt);
+					for (k = 0; k < r_i; k = k+1)
+					{
+						if ( urn <= cpt[k] )
+						{
+							(params[node_names[i]])["State"] = k;
+							break;
+						}
+						urn = urn - cpt[k];
+					}
+				} else {
+					// conditional Gaussian node, parameter defines intercept
+					em = (((params[node_names[i]])["Parameters"])[0])["EM"];
+					sigma = (((params[node_names[i]])["Parameters"])[0])["SIGMA"];
+					(params[node_names[i]])["State"] = (Random(em, {"PDF":"Gaussian", "ARG0":sigma}))[0];
+				}
+			}
+		}
+		
+		while (1)
+		{
+			all_done = 1;
+			
+			/* loop until parameters are instantiated for all nodes */
+			for (i = 0; i < Abs(params); i = i+1)
+			{
+				if (Type(params[node_names[i]])["State"] == "String")
+				{
+					// Type String indicates no value - replace placeholder with NoneType when it becomes available
+					
+					all_done = 0;
+					ok_to_go = 1;
+					
+					parents = (params[node_names[i]])["Parents"];
+					num_parent_combos = 1;
+					pa_index = 0;
+					
+					for (p = 0; p < Abs(Rows(parents)); p = p+1)
+					{
+						pid = parents[p];
+						if ( Type(params[pid])["State"] == "String" )
+						{
+							// parents not resolved, skipping
+							ok_to_go = 0;
+							break;
+						}
+						
+						// compute parental index for discrete parents
+						if ( (params[pid])["NodeType"] == 0 ) {
+							pa_index = pa_index + (params[pid])["State"] * num_parent_combos;						
+							num_parent_combos = num_parent_combos * (params[pid])["Levels"];
+						}					
+					}
+					
+					
+					if (ok_to_go)
+					{
+						// instantiate this node's parameters
+						if ( (params[node_names[i]])["NodeType"] == 0 ) {
+							urn = Random(0,1);
+							cpt = ((params[node_names[i]])["Parameters"])[pa_index];
+							r_i = Columns(cpt);
+							for (k = 0; k < r_i; k = k+1) {
+								if ( urn <= cpt[k] ) {
+									(params[node_names[i]])["State"] = k;
+									break;
+								}
+								urn = urn - cpt[k];
+							}
+						} else {
+							em = ( ((params[node_names[i]])["Parameters"])[pa_index] )["EM"];
+							sigma = ( ((params[node_names[i]])["Parameters"])[pa_index] )["SIGMA"];
+							zvec = {Columns(em), 1};
+							zvec[0] = 1;
+							
+							// get states of continuous parents
+							cpar = 0;
+							for (p = 0; p < Abs(Rows(parents)); p += 1) {
+								pid = parents[p];
+								if ( (params[pid])["NodeType"] == 1 ) {
+									zvec[cpar+1] = (params[pid])["State"];
+									cpar += 1;
+								}
+							}
+							
+							// conditional mean 
+							cond_mean = em * zvec;
+							(params[node_names[i]])["State"] = (Random(cond_mean, {"PDF":"Gaussian", "ARG0":sigma}))[0];
+						}
+					}
+				}
+			}
+			/* end for loop */
+			
+			if (all_done) break;
+		}
+		/* end while */
+		
+		/* add case to result */
+		for (i = 0; i < Abs(params); i = i+1) {
+			result[case][i] = (params[node_names[i]])["State"];
+		}
+	}
+	
+	return result;
+}
+
+
+/* 
+	Example:
+		import_xmlbif("/Users/apoon/svn/hyphy/HBL/art/BGM/alarm/alarm.xml", "Alarm"); 
+*/
+function import_xmlbif (filename, newname)
+{
+	ExecuteCommands(newname+"={};");
+	
+	fscanf (filename, "Raw", input);
+	
+	var_tags = input||"<VARIABLE";
+	if (var_tags[0] < 0)
+	{
+		fprintf (stdout, "ERROR: <VARIABLE> tag absent from XML, exiting..");
+		return 1;
+	}
+	
+	ntags = Rows(var_tags)$2;
+	
+	
+	for (tag = 0; tag < ntags; tag = tag+1)
+	{
+		/*
+			search for <NAME> tag - note that we use an arbitrary character limit (1000)
+			for the last entry because if we use the rest of the XML file, it causes the
+			regular expression search to fail! - afyp, October 26, 2011
+		*/
+		start_char = var_tags[tag*2+1];
+		if (tag == ntags-1) { end_char = start_char+1000; }
+		else { end_char = var_tags[(tag+1)*2]; }
+		substr = input[start_char][end_char];
+		
+		/* create node */
+		name_tag = substr||"<NAME>.+</NAME>";
+		node_name = substr[name_tag[0]+6][name_tag[1]-7];
+		
+		
+		ExecuteCommands(newname+"[\""+node_name+"\"]= {};");
+		
+		outcome_tags = substr||"<OUTCOME>";
+		ExecuteCommands("("+newname+"[\""+node_name+"\"])[\"Levels\"]= "+Rows(outcome_tags)$2+";");
+	}
+	
+	
+	def_tags = input||"<DEFINITION>";
+	if (def_tags[0] < 0)
+	{
+		fprintf (stdout, "ERROR: <DEFINITION> tag absent from XML, exiting..");
+		return 1;
+	}
+	
+	ntags = Rows(def_tags)$2;
+	for (tag = 0; tag < ntags; tag = tag+1)
+	{
+		/* parse definition tags */
+		start_char = def_tags[tag*2+1];
+		if (tag == ntags-1) { end_char = Abs(input); }
+		else { end_char = def_tags[(tag+1)*2]; }
+		substr = input[start_char][end_char];
+		
+		/* start a new node */
+		for_tag = substr||"<FOR>.+</FOR>";
+		node_name = substr[for_tag[0]+5][for_tag[1]-6];
+		
+		/* assign parents */
+		exec_str = "";
+		exec_str * 256;
+		exec_str * "(";
+		exec_str * newname;
+		exec_str * "[\"";
+		exec_str * node_name;
+		exec_str * "\"])[\"Parents\"]={";
+		given_tags = substr||"<?GIVEN>";
+		if (given_tags[0] >= 0)
+		{
+			for (gt = 1; gt < Rows(given_tags); gt = gt+4)
+			{
+				exec_str * "{\"";
+				exec_str * substr[given_tags[gt]+1][given_tags[gt+1]-3];
+				exec_str * "\"}";
+				if (gt < Rows(given_tags)-4) { exec_str * ","; }
+			}
+		}
+		exec_str * "};";
+		exec_str * 0;
+		ExecuteCommands(exec_str);
+		
+		
+		/* assign conditional probability table - child state cycles fastest, then parents */
+		table_tag = substr||"<TABLE>.+</TABLE>";
+		table_str = substr[table_tag[0]+7][table_tag[1]-8];
+		prob_tags = table_str||"[01]\.[0-9]+";
+		
+		n_parent_combos = 1;
+		ExecuteCommands("parents = ("+newname+"[\""+node_name+"\"])[\"Parents\"];");
+		for (par = 0; par < Abs(Rows(parents)); par=par+1)
+		{
+			ExecuteCommands("n_parent_combos = n_parent_combos * ("+newname+"[\""+parents[par]+"\"])[\"Levels\"];");
+		}
+		ExecuteCommands("n_levels = ("+newname+"[node_name])[\"Levels\"];");
+		
+		ExecuteCommands("("+newname+"[\""+node_name+"\"])[\"Parameters\"]= {};");
+		
+		for (pa = 0; pa < n_parent_combos; pa = pa+1)
+		{
+			ExecuteCommands("(("+newname+"[\""+node_name+"\"])[\"Parameters\"])[\""+pa+"\"]={1,n_levels};");
+			for (lev = 0; lev < n_levels; lev=lev+1)
+			{
+				foo = lev * n_parent_combos + pa;
+				/* fprintf (stdout, lev, ",", pa, ",", table_str[prob_tags[foo*2]][prob_tags[foo*2+1]], "\n"); */
+				ExecuteCommands("((("+newname+"[\""+node_name+"\"])[\"Parameters\"])[\""+pa+"\"])["+lev+"]="+table_str[prob_tags[foo*2]][prob_tags[foo*2+1]]+";");
+			}
+		}
+		
+		
+	}
+	
+	return 0;
+}
+
+
+
+function list2adjmat (alist) {
+/*
+	convert associative list returned by import_xmlbif into an adjacency matrix
+*/
+	num_nodes = Abs(alist);
+	res = {num_nodes, num_nodes};
+	node_names = Rows(alist);
+	name2index = {};
+	
+	// for indexing into adjacency matrix
+	for (node = 0; node < num_nodes; node += 1) {
+		name2index[node_names[node]] = node;
+	}
+	
+	for (child = 0; child < num_nodes; child += 1) {
+		parents = (alist[node_names[child]])["Parents"];
+		if (Type(parents) == "Matrix") {
+			for (par = 0; par < Rows(parents); par += 1) {
+				parent = name2index[parents[par]];
+				res[parent][child] = 1;
+			}
+		}
+	}
+	
+	return res;
+}
+
+
+function check_edgelist (results, adjmat, cutoff) {
+	// extract edge marginal posteriors vector from results matrix (in column 1)
+	edgep = results[-1][1];
+	num_nodes = Rows(adjmat);
+	true_pos = 0;
+	false_pos = 0;
+	true_neg = 0;
+	false_neg = 0;
+	
+	for (parent = 0; parent < (num_nodes-1); parent += 1) {
+		for (child = (parent+1); child < num_nodes; child += 1) {
+			x = edgep[parent * num_nodes + child] + edgep[child * num_nodes + parent];
+			
+			if (adjmat[parent][child] > 0 || adjmat[child][parent] > 0) {
+				if ( x > cutoff ) {
+					true_pos += 1;
+				} else { 
+					false_neg += 1;
+				}
+			} else {
+				if ( x > cutoff ) {
+					false_pos += 1;
+				} else { 
+					true_neg += 1;
+				}
+			}
+		}
+	}
+	
+	result = {4,1}; /* TP, FN, FP, TN */
+	result[0] = true_pos;
+	result[1] = false_neg;
+	result[2] = false_pos;
+	result[3] = true_neg;
+	
+	return (result);
+}
+
+
+
diff --git a/res/TemplateBatchFiles/binomial.ibf b/res/TemplateBatchFiles/binomial.ibf
new file mode 100644
index 0000000..231ccff
--- /dev/null
+++ b/res/TemplateBatchFiles/binomial.ibf
@@ -0,0 +1,89 @@
+/*___________________________________________________________________________________________________________*/
+
+function extendedBinTail (ebn, ebp, ebx)
+/* 
+	returns the LEFT-tail probability for the extended binomial distribution 
+	with ebn observations, ebp probability of success and ebx successes 
+	i.e, Pr (X <= ebx | enb, ebp)
+
+*/
+{
+	if (ebp == 0)
+	{
+		return 0;	
+	}
+
+	ebr = ebx$1; /* rounded to nearest integer */
+	
+	currentBinCoeff = (1-ebp)^ebn; /*compute the first binomial coefficient */
+	
+	binHead = 0;
+	
+	for (ebk=0; ebk<=ebr; ebk=ebk+1)
+	{
+		binHead			= binHead + currentBinCoeff;
+		currentBinCoeff = currentBinCoeff * (ebn-ebk) / (ebk+1) * ebp / (1-ebp);
+	}
+	
+	if (ebx <= ebn$1)
+	{
+		binHead = binHead + currentBinCoeff*(ebx-ebr);
+	}
+	else
+	{
+		binHead = binHead + (1-binHead)*(ebx-ebr)/(ebn-ebn$1);	
+	}
+		
+	return binHead;
+}
+
+/*----------------------------------------------------------------------------*/
+
+function computeBinTail   (m,n,p)
+/*
+n - number of trials
+m - cutoff point
+p - probability of success
+*/
+{
+	if (m==0)
+	{
+		lastBinTerm = (1-p)^n;
+		return 1-lastBinTerm;
+	}
+	if (m==n)
+	{
+		lastBinTerm = p^n;
+		return 0;
+	}
+	
+	upToTerm = m;
+	if (m>n$2)
+	{
+		m 	= n-m;
+		omp	= 1-p;
+		binTail = p^n;
+		binTerm = n*omp*p^(n-1);
+		for (s=1; s<=m; s=s+1)
+		{
+			binTail = binTail + binTerm;
+			lastBinTerm = binTerm;
+			binTerm	= binTerm * (n-s) * omp / (p*(s+1)); 
+		}
+	}
+	else
+	{	
+		omp	= 1-p;
+		binTail = omp^n;
+		binTerm = n*p*omp^(n-1);
+		for (s=1; s<=m; s=s+1)
+		{
+			binTail = binTail + binTerm;
+			lastBinTerm = binTerm;
+			binTerm	= binTerm * (n-s) * p / (omp*(s+1)); 
+		}
+		binTail = 1-binTail;
+	}
+
+	return binTail;
+}
diff --git a/res/TemplateBatchFiles/branchSwappingFunctions.bf b/res/TemplateBatchFiles/branchSwappingFunctions.bf
new file mode 100644
index 0000000..05e848b
--- /dev/null
+++ b/res/TemplateBatchFiles/branchSwappingFunctions.bf
@@ -0,0 +1,411 @@
+/* NNI Branch Swapping Functions */
+
+function	copyTreeStructure	 (terminationLevel,levelModifier)
+{
+	while (1)
+	{
+		scbj = treeNodes[scbi][0];
+		splitTreeInfo  [scbk][scbp] = treeNodes[scbi][1]+levelModifier;
+		
+		if (scbj<spCount)
+		{
+			splitTreeInfo [scbk][scbn] = scbj;
+		}
+		else
+		{
+			splitTreeInfo   [scbk][scbn] = spCount+scbm;
+			splitCladesInfo [scbm][scbn] = cladesInfo [scbj-spCount][0]-scbo;
+			splitCladesInfo [scbm][scbp] = cladesInfo [scbj-spCount][1];
+			scbm = scbm+1;
+		}
+		if (treeNodes[scbi][1]==terminationLevel)
+		{
+			break;
+		}
+		scbk = scbk+1;		
+		scbi = scbi+1;
+	}
+	return 0;
+}
+
+function	splitCladesOnIBranch (spCount, iNodeIndex)
+{
+	splitTreeInfo      = {Rows(treeNodes),8};
+	splitCladesInfo    = {Rows(cladesInfo),8};
+	/* do the two easy ones 1st */
+	iNodeIndex = iNodeIndex - spCount;
+	treeInfoSplitIndex = cladesInfo[iNodeIndex][1]+cladesInfo[iNodeIndex][0]-1;
+	treeInfoSplitDepth = treeNodes[treeInfoSplitIndex][1];
+	scbk 		  = 0;
+	scbm 		  = 0;
+	scbn		  = 0;
+	scbp		  = 1;
+	scbo		  = cladesInfo[iNodeIndex][0];
+	newINodeIndex = 0;
+	for (scbi=cladesInfo[iNodeIndex][0];scbi<treeInfoSplitIndex;scbi=scbi+1)
+	{
+		scbj = treeNodes[scbi][0];
+		splitTreeInfo  [scbk][scbp] = treeNodes[scbi][1]-treeInfoSplitDepth;
+		
+		if (scbj<spCount)
+		{
+			splitTreeInfo [scbk][scbn] = scbj;
+		}
+		else
+		{
+			splitTreeInfo   [scbk][scbn] = spCount+scbm;
+			splitCladesInfo [scbm][scbn] = cladesInfo [scbj-spCount][0]-scbo;
+			splitCladesInfo [scbm][scbp] = cladesInfo [scbj-spCount][1];
+			scbm = scbm+1;
+		}
+		if ((splitTreeInfo[scbk][1]==1)&&(scbn==0))
+		{
+			scbo = scbi+1;
+			scbn = 2;
+			scbp = 3;
+			scbk = 0;
+			scbm = 0;
+			continue;
+		}
+		scbk = scbk+1;
+	}
+	/* build the third clade by taking the 2nd child of the parent */
+	scbn = 4;
+	scbp = 5;
+	scbm = 0;
+	scbk = 0;
+	scbi = scbi+1;
+	if (treeNodes[scbi][1] < treeInfoSplitDepth)
+	/* was the right child */
+	{
+		scbi = cladesInfo[iNodeIndex][0]-1;
+		scbj = treeNodes[scbi][0];
+		if (scbj>=spCount)
+		{
+			scbi = cladesInfo[scbj-spCount][0];
+		}
+	}
+	scbo = scbi;
+	scbn = copyTreeStructure (treeInfoSplitDepth,1-treeInfoSplitDepth);
+	scbn = 6;
+	scbp = 7;
+	if (treeInfoSplitDepth == 1)
+	/* root level split */
+	{
+		scbi = scbi+1;
+		if ((treeNodes[scbi][1] == 0)||(scbi==cladesInfo[iNodeIndex][0]))
+		{
+			scbi = 0;
+		}
+		scbo = scbi;
+		scbm = 0;
+		scbk = 0;
+		scbj = copyTreeStructure (1,0);
+	}
+	else
+	/* not a root level split */
+	{
+		scbj = treeInfoSplitDepth-1;
+		pathToTheRoot = {scbj,1};
+		pathToTheRoot [0] = L1ParentIndex+1;
+		/* find a level 1 parent of the split point */
+		for (L1ParentIndex = treeInfoSplitIndex;;L1ParentIndex=L1ParentIndex+1)
+		{
+			if (treeNodes[L1ParentIndex][1] == scbj)
+			{
+				pathToTheRoot[scbj-1] = L1ParentIndex;
+				if (scbj == 1)
+				{
+					break;
+				} 
+				scbj = scbj - 1;
+			}
+		}
+		/* handle the top level separately */
+		scbk = 0;
+		scbm = 0;
+		
+		scbi = 0;
+		scbo = 0;
+		scbq = pathToTheRoot[0];
+		scbq = treeNodes[scbq][0]-spCount;
+		scbq = cladesInfo[scbq][0];
+		for (scbr = 0; scbr < 3; scbr = scbr+1)
+		{
+			if (scbi == scbq)
+			{
+				scbo = pathToTheRoot[0]-scbi+1;
+				scbi = pathToTheRoot[0];
+			}
+			else
+			{
+				dummy = copyTreeStructure (1,treeInfoSplitDepth-1);
+				scbk = scbk+1;
+			}
+			scbi = scbi+1;
+		}
+		
+		/* add a new internal node to join the other two */
+		splitTreeInfo   [scbk][scbn] = spCount+scbm;
+		splitTreeInfo   [scbk][scbp] = treeInfoSplitDepth-1;
+		splitCladesInfo [scbm][scbn] = 0;
+		scbk = scbk+1;
+		splitCladesInfo [scbm][scbp] = scbk;
+		scbm = scbm+1;
+
+		for (scbq = 1; scbq<Rows(pathToTheRoot); scbq = scbq+1)
+		{
+			scbj = pathToTheRoot [scbq];
+			scbo = pathToTheRoot [scbq-1];
+			if (scbo==scbj+1)
+			/* came from the right child */
+			{
+				scbi = treeNodes  [scbo][0]-spCount;
+				scbi = cladesInfo[scbi][0];
+			}
+			/* came from the left child */
+			else
+			{
+				scbi = scbj+1;
+			}
+			scbs = scbi;
+			scbo = scbi-scbk;
+			dummy = copyTreeStructure (scbq+1,treeInfoSplitDepth-2*scbq-1);			
+			scbk = scbk+1;
+			splitTreeInfo   [scbk][scbn] = spCount+scbm;
+			splitTreeInfo   [scbk][scbp] = Rows(pathToTheRoot)-scbq;
+			splitCladesInfo [scbm][scbn] = 0;
+			scbk = scbk+1;
+			splitCladesInfo [scbm][scbp] = scbk;
+			scbm = scbm+1;
+		} 		
+	}
+	return 0;
+}
+
+function	doNNISwap (b2group,spCount)
+{
+	if (b2group==3)
+	{
+		branchOrderMatrix = {{0,3,1,2}};	
+	}
+	else
+	{
+		branchOrderMatrix = {{0,2,1,3}};
+	}
+	
+	scbo = 0;
+	scbn = 0;
+	scbp = 1;
+	scbj = 0;
+	scbk = 0;
+	
+	for (scbi=0; scbi<4; scbi = scbi+1)
+	{
+		scbt = branchOrderMatrix[scbi];
+		scbn = scbt*2;
+		scbp = scbn+1;
+		scbq = 0;
+		while (splitTreeInfo[scbq][scbp])
+		{
+			if (splitTreeInfo[scbq][scbn]<spCount)
+			{
+				treeNodes [scbj][2] = splitTreeInfo[scbq][scbn];
+			}
+			else
+			{
+				scbm = splitTreeInfo[scbq][scbn]-spCount;
+				treeNodes	[scbj][2] = spCount+scbk;
+				cladesInfo	[scbk][2] = splitCladesInfo[scbm][scbn] + scbo;
+				cladesInfo  [scbk][3] = splitCladesInfo[scbm][scbp];
+				scbk=scbk+1;
+			}
+			if (scbi<2)
+			{
+				treeNodes[scbj][3] = splitTreeInfo[scbq][scbp]+1;
+			}
+			else
+			{
+				treeNodes[scbj][3] = splitTreeInfo[scbq][scbp];
+			}
+			scbj = scbj+1;
+			scbq = scbq+1;
+		}
+		scbo = scbo + scbq;
+		if (scbi==1)
+		{
+			scbo = scbo+1;
+			treeNodes	[scbj][2] = spCount+scbk;
+			treeNodes	[scbj][3] = 1;
+			cladesInfo	[scbk][2] = 0;
+			cladesInfo  [scbk][3] = scbo;
+			scbj = scbj+1;
+			scbk = scbk+1;			
+		}
+	}
+	treeNodes[scbj][2] = 0;
+	treeNodes[scbj][3] = 0;
+	return 0;
+}
+
+function	doSubtreeCopy (startAt, upTo, depthCorrection)
+{
+	if (upTo>=(-1))
+	{
+		for   (scbi=startAt; scbi<=upTo; scbi=scbi+1)
+		{
+			if (splitTreeInfo[scbi][scbn]<spCount)
+			{
+				treeNodes [scbj][2] = splitTreeInfo[scbi][scbn];
+			}
+			else
+			{
+				scbm = splitTreeInfo[scbi][scbn]-spCount;
+				treeNodes	[scbj][2] = spCount+scbk;
+				cladesInfo	[scbk][2] = splitCladesInfo[scbm][scbn] + scbo;
+				cladesInfo  [scbk][3] = splitCladesInfo[scbm][scbp];
+				scbk=scbk+1;
+			}
+			treeNodes[scbj][3] = splitTreeInfo[scbi][scbp]+depthCorrection;
+			scbj = scbj+1;
+		}
+		return 0;
+	}
+	else
+	{
+		scbi = startAt;
+		while (splitTreeInfo[scbi][scbp])
+		{
+			if (splitTreeInfo[scbi][scbn]<spCount)
+			{
+				treeNodes [scbj][2] = splitTreeInfo[scbi][scbn];
+			}
+			else
+			{
+				scbm = splitTreeInfo[scbi][scbn]-spCount;
+				treeNodes	[scbj][2] = spCount+scbk;
+				cladesInfo	[scbk][2] = splitCladesInfo[scbm][scbn] + scbo;
+				cladesInfo  [scbk][3] = splitCladesInfo[scbm][scbp];
+				scbk=scbk+1;
+			}
+			treeNodes[scbj][3] = splitTreeInfo[scbi][scbp]+depthCorrection;
+			scbj = scbj+1;		
+			scbi = scbi+1;
+		}
+		return scbi-startAt;
+	}
+	
+}
+
+
+function	doSPRSwap (bFgroup1, bFgroup2, b2group,where2group,spCount)
+{	
+	scbn = b2group*2;
+	scbp = scbn+1;
+		
+	scbo = 0;
+	scbj = 0;
+	scbk = 0;
+	scbd = splitTreeInfo[where2group][scbp];
+	
+	if (splitTreeInfo[where2group][scbn]<spCount)
+	/* grafting onto a leaf */
+	{
+		dummy = doSubtreeCopy (0,where2group-1,0);
+		scbr  = where2group;
+		dummy = doSubtreeCopy (where2group,where2group,1);
+		scbn  = bFgroup1*2;
+		scbp  = scbn+1;
+		scbo  = where2group+1;
+		scbq  = scbj;
+		dummy = doSubtreeCopy (0,-2,scbd+1);
+		scbo  = scbo+dummy;
+		scbn  = bFgroup2*2;
+		scbp  = scbn+1;
+		dummy = doSubtreeCopy (0,-2,scbd+1);
+		scbo  = scbo+dummy;	
+	}
+	else
+	/* grafting onto an internal branch */
+	{
+		scbq  = splitTreeInfo  [where2group][scbn]-spCount;
+		scbq  = splitCladesInfo[scbq][scbn];
+		dummy = doSubtreeCopy (0,scbq-1,0);
+		scbr  = scbj;
+		dummy = doSubtreeCopy (scbq,where2group,1);
+		scbo  = scbj;
+		scbn  = bFgroup1*2;
+		scbp  = scbn+1;
+		scbo  = where2group+1;
+		scbq  = scbj;
+		dummy = doSubtreeCopy (0,-2,scbd+1);
+		scbo  = scbo+dummy;
+		scbn  = bFgroup2*2;
+		scbp  = scbn+1;
+		dummy = doSubtreeCopy (0,-2,scbd+1);
+		scbo  = scbo+dummy;		
+	}
+	
+	scbv = scbo-scbq+2;
+	
+	/* create 2 new internal nodes */
+		
+	for (scbi=1; scbi>=0; scbi = scbi-1)
+	{
+		scbo = scbo+1;
+		treeNodes	[scbj][2] = spCount+scbk;
+		treeNodes	[scbj][3] = scbd+scbi;
+		cladesInfo	[scbk][2] = scbq;
+		cladesInfo  [scbk][3] = scbj-scbq+1;
+		scbj = scbj+1;
+		scbk = scbk+1;		
+		scbq = scbr;
+	}	
+	
+	
+	scbn  = b2group*2;
+	scbp  = scbn+1;	
+	scbo  = scbo-where2group-1;
+	dummy = doSubtreeCopy (where2group+1,-2,0);
+	
+	scbr = scbd-1;
+	/* update the number of nodes in affected clades */
+	for (scbi=where2group+1; scbi<scbj; scbi=scbi+1)
+	{
+		if ((treeNodes[scbi][3]==scbr)&&(treeNodes[scbi][2]>spCount))
+		{
+			scbq = treeNodes[scbi][2]-spCount;
+			cladesInfo[scbq][3] = cladesInfo[scbq][3]+scbv;
+			cladesInfo[scbq][2] = cladesInfo[scbq][2]-scbo;
+			scbr = scbr-1;
+		}
+	}
+
+	scbj  = scbj-1;
+	scbk  = scbk-1;
+	scbo  = scbo+where2group+dummy;
+	for (scbi=0; scbi<scbj; scbi=scbi+1)
+	{
+		treeNodes[scbi][3] = treeNodes[scbi][3]-1;
+	}
+	
+	
+	for (scbi=0; scbi<4; scbi=scbi+1)
+	{
+		if ((scbi==bFgroup1)||(bFgroup2==scbi)||(b2group==scbi))
+		{
+			continue;
+		}
+		break;
+	}
+	
+	scbn  = scbi*2;
+	scbp  = scbn+1;
+	dummy = doSubtreeCopy (0,-2,0);
+
+	treeNodes[scbj][2] = 0;
+	treeNodes[scbj][3] = 0;
+	cladesInfo[scbk][2] = 0;
+	cladesInfo[scbk][3] = 0;
+	return 0;
+}
diff --git a/res/TemplateBatchFiles/categoryEcho.bf b/res/TemplateBatchFiles/categoryEcho.bf
new file mode 100644
index 0000000..5a92e88
--- /dev/null
+++ b/res/TemplateBatchFiles/categoryEcho.bf
@@ -0,0 +1,169 @@
+if (categoriesUsed)
+{
+	ChoiceList  (response,"Rate class Information Dislpay",1,NO_SKIP,
+				 "Don't Display","No rate class information is displayed",
+				 "Distribution Info","Only the inferred distributions will be shown",
+				 "Class Asignments 1","A string of class assignments for sites is displayed for each site from left to right.",
+				 "Class Asignments 2","A list of sites, grouped by rate class, is displayed.",
+				 "Complete","A table of partial likelihoods is spooled to a file, along with class assignments for sites.");
+				 
+				 
+	if (response>0)
+	{
+		if (response>3)
+		{
+			ConstructCategoryMatrix(res,lf,COMPLETE);
+			SetDialogPrompt ("Write marginal matrix info to:");
+			PRINT_DIGITS = 12;
+			fprintf (PROMPT_FOR_FILE,CLEAR_FILE,res);
+		}
+		else
+		{
+			ConstructCategoryMatrix(res,lf,SHORT);
+			cols = Columns(res);
+			GetInformation (distrInfo,c);
+			Dvar = Columns(distrInfo);
+			Evar = 0.0;
+			T = 0.0;
+			sampleVar = 0.0;
+			for (k=0; k<Dvar; k=k+1)
+			{
+				T = distrInfo[0][k]*distrInfo[1][k];
+				Evar = Evar+T;
+				sampleVar = T*distrInfo[0][k]+sampleVar;
+			}
+			sampleVar = sampleVar-Evar*Evar;
+			
+			if (categoriesUsed>1)
+			{
+				fprintf (stdout, "\n", _rateDescriptors[0]);
+			}
+
+			fprintf  (stdout,"\n\n------------------------------------------------\n\nSample mean = ",Evar, " (sample variance = ",sampleVar,")\n");
+			for (k=0; k<Dvar; k=k+1)
+			{
+				fprintf (stdout,"\nRate[",Format(k,0,0),"]=",Format(distrInfo[0][k],12,8), " (weight=", 
+								  Format(distrInfo[1][k],9,7),")");
+			}
+			if (categoriesUsed>1)
+			{
+				GetInformation (distrInfo2,d);
+				Dvar = Columns(distrInfo2);
+				Evar = 0.0;
+				T = 0.0;
+				sampleVar = 0.0;
+				for (k=0; k<Dvar; k=k+1)
+				{
+					T = R*distrInfo2[0][k]*distrInfo2[1][k];
+					Evar = Evar+T;
+					sampleVar = T*R*distrInfo2[0][k]+sampleVar;
+				}
+				sampleVar = sampleVar-Evar*Evar;
+
+				fprintf (stdout, "\n", _rateDescriptors[1]);
+				fprintf  (stdout,"\n\n------------------------------------------------\n\nSample mean = ",Evar, " (sample variance = ",sampleVar,")\n");
+				for (k=0; k<Dvar; k=k+1)
+				{
+					fprintf (stdout,"\nRate[",Format(k,0,0),"]=",Format(R*distrInfo2[0][k],12,8), " (weight=", 
+									  Format(distrInfo2[1][k],9,7),")");
+				}
+			}
+			if (response == 2)
+			{
+				PRINT_DIGITS = 4;
+				if (categoriesUsed>1)
+				{
+					fprintf (stdout,"\n\nClass Assignments (div/mod ",Columns(distrInfo2)," for ",_rateDescriptors[0],"/",_rateDescriptors[1],") :\n\n");
+				}
+				else
+				{
+					fprintf (stdout,"\n\nClass Assignments:\n\n");
+				}
+				fprintf (stdout,"\n");
+				PRINT_DIGITS = 3;
+				fprintf (stdout,res[0][0]);
+				for (n=1;n<cols;n=n+1)
+				{
+					fprintf (stdout,"\t",res[0][n]);
+				}
+				_tableHeaders = {1,1};
+				_tableHeaders[0] = "Rate Class";
+				
+				res = Transpose(res);
+				
+				OpenWindow (CHARTWINDOW,{{"Rate class assignments by site."}
+						   {"_tableHeaders"},
+						   {"res"},
+						   {"Bar Chart"},
+						   {"Index"},
+						   {_tableHeaders[0]},
+						   {"Site Index"},
+						   {_tableHeaders[0]},
+						   {_tableHeaders[0]},
+						   {"0"}},
+						   "SCREEN_WIDTH-60;SCREEN_HEIGHT-50;30;50");
+			}
+			else
+			{
+				if (response == 3)
+				{
+					Dvar = Columns(distrInfo);
+					if (categoriesUsed>1)
+					{
+						Dvar2 = Columns (distrInfo2);
+						firstOrNot = {Dvar*Dvar2,1};
+						for (k=0; k<Dvar; k=k+1)
+						{	
+							for (kk = 0; kk<Dvar2; kk=kk+1)
+							{
+								fprintf (stdout, "\n\nRate Class ",_rateDescriptors[0]," ",Format(k,0,0)," and ",
+																   _rateDescriptors[1]," ",Format(kk,0,0),"\n");
+																   
+								kk2 = k*Dvar2 + kk;
+								for (n=0; n<cols; n=n+1)
+								{
+									if (res[0][n]==kk2)
+									{
+										if (firstOrNot[kk2]==0)
+										{
+											firstOrNot[kk2] = 1;
+											fprintf (stdout, n);
+										}
+										else
+										{
+											fprintf (stdout, ",", n);
+										}
+									}
+								}
+							}
+						}
+					}
+					else
+					{
+						firstOrNot = {Dvar,1};
+						for (k=0; k<Dvar; k=k+1)
+						{
+							fprintf (stdout, "\n\nRate Class ",Format(k,0,0),"\n");
+							for (n=0; n<cols; n=n+1)
+							{
+								if (res[0][n]==k)
+								{
+									if (firstOrNot[k]==0)
+									{
+										firstOrNot[k] = 1;
+										fprintf (stdout, n);
+									}
+									else
+									{
+										fprintf (stdout, ",", n);
+									}
+								}
+							}
+						}
+					}
+					fprintf (stdout, "\n");
+				}
+			}	
+		}
+	}
+}
diff --git a/res/TemplateBatchFiles/chooseDistanceFormula.def b/res/TemplateBatchFiles/chooseDistanceFormula.def
new file mode 100644
index 0000000..980ce5b
--- /dev/null
+++ b/res/TemplateBatchFiles/chooseDistanceFormula.def
@@ -0,0 +1,95 @@
+nucDistanceChoices = 
+{{"JC69","Jukes-Cantor distance formula (equal character frequencies, all rates equal)."}
+ {"K2P", "Kimura 2 parameter (equal character frequencies, transition/trasversion bias correction)."}
+ {"K2P_RV", "Kimura 2 parameter and rate variation (equal character frequencies, transition/trasversion bias correction, gamma distributed rate variation from site to site)."}
+ {"p_Distance", "Number of observed substituions per site."}
+ {"T3P", "Tamura 3-parameter (correction for GC content bias and transition/trasversion bias)."},
+ {"TN84", "Tajima-Nei (84) distance (unequal character frequencies)."}
+ {"TN93", "Tamura-Nei (93) distance (unequal character frequencies, A->G, C->T and transversional bias corrections)."}
+ {"TN93_RV", "Tamura-Nei (93) distance and rate variation (unequal character frequencies, A->G, C->T and transversional bias corrections, gamma distributed rate variation from site to site)."}
+ {"Unaligned_LZ", "Distance measure for unaligned sequences based on Lempel Ziv measure of information content."}
+ {"Unaligned_LZ_FR", "Distance measure for unaligned sequences based on Lempel Ziv measure of information content using the best choice forward and reverse string orientations."}
+};
+
+aaDistanceChoices = 
+{{"PC","Poisson corrected distance (equal character frequencies, all rates equal)."}
+ {"PC_RV","Poisson corrected distance with rate variation (equal character frequencies, all rates equal, gamma distributed rate variation from site to site))."}
+ {"PC_MH","Distance corrected for mulitple hits used in Clustal-W."}
+ {"p_Distance_aa", "Number of observed substituions per site."}
+ {"Unaligned_LZ", "Distance measure for unaligned sequences based on Lempel Ziv measure of information content."}
+ {"Unaligned_LZ_FR", "Distance measure for unaligned sequences based on Lempel Ziv measure of information content using the best choice forward and reverse string orientations."}
+};
+
+codonDistanceChoices = 
+{{"Nei_Gojobori","Nei and Gojobori (1986) method."}
+ {"Modified_Nei_Gojobori","Nei and Gojobori (1986) method with transversion/transition bias correction."}
+ {"p_Distance_codon","Substitution counts normalized by sequence length."}
+};
+
+binaryDistanceChoices = 
+{{"p_Distance_binary","Substitution counts normalized by sequence length."}
+};
+
+if (DISTANCE_PROMPTS)
+{
+	/* determine the size of the data set filter */
+	GetDataInfo (cInfo, filteredData, "CHARACTERS");
+	filterCharacters = Columns (cInfo);
+	
+	_distanceFilePath = "";
+	
+	if (filterCharacters == 4)
+	{
+		ChoiceList (dfileChoice,"Nucleotide based distance formula.",1,SKIP_NONE,nucDistanceChoices);
+		if (dfileChoice < 0)
+		{
+			return 0;
+		}
+		_distanceFilePath = PATH_TO_CURRENT_BF + "Distances"+ DIRECTORY_SEPARATOR + nucDistanceChoices[dfileChoice][0];
+		ExecuteAFile (_distanceFilePath);
+	}
+	else
+	{
+		if (filterCharacters == 20)
+		{
+			ChoiceList (dfileChoice,"Amino-acid based distance formula.",1,SKIP_NONE,aaDistanceChoices);
+			if (dfileChoice < 0)
+			{
+				return 0;
+			}
+			_distanceFilePath = PATH_TO_CURRENT_BF + "Distances"+ DIRECTORY_SEPARATOR + aaDistanceChoices[dfileChoice][0];
+			ExecuteAFile (_distanceFilePath);
+		}
+		else
+		{
+			if (filterCharacters == 2)
+			{
+				ChoiceList (dfileChoice,"Binary charcters based distance formula.",1,SKIP_NONE,binaryDistanceChoices);
+				if (dfileChoice < 0)
+				{
+					return 0;
+				}
+				_distanceFilePath = PATH_TO_CURRENT_BF + "Distances"+ DIRECTORY_SEPARATOR + binaryDistanceChoices[dfileChoice][0];
+				ExecuteAFile (_distanceFilePath);
+			}
+			else
+			{
+				if (Abs (_Genetic_Code) > 0)
+				{
+					ChoiceList (dfileChoice,"Codon based distance formula.",1,SKIP_NONE,codonDistanceChoices);
+					if (dfileChoice < 0)
+					{
+						return 0;
+					}
+					_distanceFilePath = PATH_TO_CURRENT_BF + "Distances"+ DIRECTORY_SEPARATOR + codonDistanceChoices[dfileChoice][0];
+					ExecuteAFile (_distanceFilePath);
+				}
+				else
+				{
+					fprintf (stdout, "\n\nNonstandard data type - no distance formulae are available\n\n");
+					return 1;
+				}
+			}
+		}
+	}
+}
diff --git a/res/TemplateBatchFiles/dNdSBivariateRateAnalysis.bf b/res/TemplateBatchFiles/dNdSBivariateRateAnalysis.bf
new file mode 100644
index 0000000..c35b8cd
--- /dev/null
+++ b/res/TemplateBatchFiles/dNdSBivariateRateAnalysis.bf
@@ -0,0 +1,827 @@
+RequireVersion ("2.0020100101");
+
+ChoiceList (runType,"Run Type",1,SKIP_NONE,
+                    "New run","Start a new run",
+                    "Continued run","Start with an initial point output by a Gateux derivative approximator."
+		    );
+		    
+if (runType < 0)
+{
+	return 0;
+}
+
+
+randomizeInitValues  = 0;
+ModelMatrixDimension = 0;
+
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function ReportDistributionString (rc)
+{
+	distroString = "";
+	distroString * 1024;
+	
+	reportMx = {rc + (bivariateFitHasMultipleCladeRates>1)*(bivariateFitHasMultipleCladeRates-1),4};
+	
+	for (mi=0; mi<rc; mi=mi+1)
+	{
+        reportMx[mi][0] = Eval ("S_"+mi+"/c_scale");
+        reportMx[mi][1] = Eval ("NS_"+mi+"/c_scale");
+		reportMx[mi][2] = reportMx[mi][1]/reportMx[mi][0];
+        reportMx[mi][3] = Eval (freqStrMx[mi]);
+        
+  		distroString * ("Class "+(mi+1)+"\n\tdS    = "+Format(reportMx[mi][0],10,3)
+									   +"\n\tdN    = "+Format(reportMx[mi][1],10,3)
+									   +"\n\tdN/dS = "+Format(reportMx[mi][2],10,3)
+									   +"\n\tProb  = "+Format(reportMx[mi][3],10,3));
+                                       
+        if (bivariateFitHasMultipleCladeRates > 1)
+        {
+            distroString * "\n\tBranch group-pecific dN/dS";
+        
+            for (mi2 = 1; mi2 < bivariateFitHasMultipleCladeRates; mi2 += 1)
+            {
+                distroString * (            "\n\tGroup " + Format (mi2,2,0) + " dN    = " + Format (reportMx[mi][1]*Eval("clade_"+mi2+"_NS_"+mi),10,3));
+                distroString * (            "\n\tGroup " + Format (mi2,2,0) + " dN/dS = " + Format (reportMx[mi][2]*Eval("clade_"+mi2+"_NS_"+mi),10,3));
+            }
+        }
+        
+        distroString * "\n";
+        
+	}								   
+	
+	distroString * 0;
+	return distroString;
+}
+
+
+	
+totalCodonCount = 0;
+totalCharCount  = 0;
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------------*/
+if (runType == 0)
+{
+    LF_NEXUS_EXPORT_EXTRA = "bivariateFitHasMultipleCladeRates = " + bivariateFitHasMultipleCladeRates + ";";
+	
+    ChoiceList (branchLengths,"Branch Lengths",1,SKIP_NONE,
+				"Codon Model","Jointly optimize rate parameters and branch lengths (slow and thorough)",
+				"Nucleotide Model","Estimate branch lengths once, using an appropriate nucleotide model (quick and dirty)."
+			    );
+
+	if (branchLengths<0)
+	{
+		return;
+	}
+
+	fileCount	= 0;
+	while (fileCount < 1)
+	{
+		fprintf (stdout, "How many datafiles are to be analyzed (>=1):?");
+		fscanf  (stdin, "Number", fileCount);
+		fileCount = fileCount $ 1;
+	}
+	
+	#include "TemplateModels/chooseGeneticCode.def";
+	
+	for (fileID = 1; fileID <= fileCount; fileID = fileID + 1)
+	{
+		fprintf (stdout, "\nReading input file ", fileID, "/", fileCount, "\n");
+		SetDialogPrompt ("Please specify codon data #" + fileID + ":");
+
+		ExecuteCommands (
+		"DataSet				ds_" +fileID + " = ReadDataFile (PROMPT_FOR_FILE);" + 
+		"fprintf (stdout,\"\\n______________READ THE FOLLOWING DATA______________\\n\",ds_" + fileID + ");"+
+		"DataSetFilter filteredData_" + fileID + " = CreateFilter (ds_"+fileID +",3,\"\",\"\",GeneticCodeExclusions);");
+		#include								   "queryTree.bf";
+		ExecuteCommands ("treeString_" + fileID + " = treeString;totalCodonCount=totalCodonCount+filteredData_"+
+                                         fileID + ".sites;totalCharCount=totalCharCount+filteredData_" + fileID + ".sites*filteredData_" + fileID + ".species;");
+        ExecuteCommands ("treeStringNoModels_" + fileID + "= treeString_" + fileID + " ^{{\"\\\\{[^\\\\}]+\\\\}\",\"\"}}");
+        
+	}
+	
+	observedFreq       = {4,3};
+	observedFreqSingle = {4,1};
+	
+	
+	for (fileID = 1; fileID <= fileCount; fileID = fileID + 1)
+	{
+		ExecuteCommands 	  ("HarvestFrequencies (tp, filteredData_"+fileID+",3,1,1);HarvestFrequencies (ts, filteredData_"+fileID+",1,1,1);cfs = filteredData_"+fileID+".sites;");
+		observedFreq 		= observedFreq 		 + tp*(cfs/totalCodonCount);
+		observedFreqSingle  = observedFreqSingle + ts*(cfs/totalCodonCount);
+	}
+	
+	ExecuteAFile ("TemplateModels/CF3x4.bf");
+	observedFreq = CF3x4 (observedFreq, GeneticCodeExclusions);
+	
+	done = 0;
+	while (!done)
+	{
+		fprintf (stdout,"\nPlease enter a 6 character model designation (e.g:010010 defines HKY85):");
+		fscanf  (stdin,"String", modelDesc);
+		if (Abs(modelDesc)==6)
+		{	
+			done = 1;
+		}
+	}			
+
+	ModelTitle = "MG94x"+modelDesc[0];
+				
+	rateBiasTerms = {{"AC","1","AT","CG","CT","GT"}};
+	paramCount	  = 0;
+
+	modelConstraintString = "";
+
+	for (customLoopCounter2=1; customLoopCounter2<6; customLoopCounter2=customLoopCounter2+1)
+	{
+		for (customLoopCounter=0; customLoopCounter<customLoopCounter2; customLoopCounter=customLoopCounter+1)
+		{
+			if (modelDesc[customLoopCounter2]==modelDesc[customLoopCounter])
+			{
+				ModelTitle  = ModelTitle+modelDesc[customLoopCounter2];	
+				if (rateBiasTerms[customLoopCounter2] == "1")
+				{
+					modelConstraintString = modelConstraintString + rateBiasTerms[customLoopCounter]+":="+rateBiasTerms[customLoopCounter2]+";";
+				}
+				else
+				{
+					modelConstraintString = modelConstraintString + rateBiasTerms[customLoopCounter2]+":="+rateBiasTerms[customLoopCounter]+";";			
+				}
+				break;
+			}
+		}
+		if (customLoopCounter==customLoopCounter2)
+		{
+			ModelTitle = ModelTitle+modelDesc[customLoopCounter2];	
+		}
+	}	
+
+	ExecuteAFile ("2RatesAnalyses/MG94xREVxBivariate_Multirate.mdl");
+
+	if (Abs(modelConstraintString))
+	{
+		ExecuteCommands (modelConstraintString);
+	}
+
+	ChoiceList (randomizeInitValues, "Initial Value Options",1,SKIP_NONE,
+				"Default",	 "Use default inital values for rate distribution parameters.",
+				"Randomized",	 "Select initial values for rate distribution parameters at random.",
+				"User Values",	 "Set initial values for rate distribution parameters and fix them for the optimization process");
+
+
+	if (randomizeInitValues < 0)
+	{
+		return;
+	}
+
+	resp  = 0;
+
+	while (resp<1)
+	{
+		fprintf (stdout,"Number of rate classes:");
+		fscanf  (stdin, "Number", resp);
+	}
+
+	if (randomizeInitValues < 2)
+	{
+		ChoiceList (stratDNDS, "dN/dS Stratification",1,SKIP_NONE,
+					"Unconstrained",	 "Do not place constraints on dN/dS classes.",
+					"Split",	 "Assign all dN/dS classes to negative/neutral/positive clases.");
+		if (stratDNDS<0)
+		{
+			return 0;
+		}
+	}
+	else
+	{
+		stratDNDS = 0;
+	}
+
+	if (stratDNDS)
+	{
+		respM = -1;
+		respN = 0;
+		respP = 0;
+
+		while (respM<0 || respM > resp)
+		{
+			fprintf (stdout,"Number of negative rate classes [0-",resp,"]:");
+			fscanf  (stdin, "Number", respM);
+		}
+
+		if (respM < resp)
+		{
+			respN = -1;
+			while (respN<0 || respN > resp-respM)
+			{
+				fprintf (stdout,"Number of neutral rate classes [0-",resp-respM,"]:");
+				fscanf  (stdin, "Number", respN);
+			}
+		}
+
+		respP = resp-respN-respM;
+
+		fprintf (stdout, "\nUsing\n\t", respM, " negatively selected classes\n\t", respN, " neutrally evolving classes\n\t", 
+							respP, " positively selected classes\n\n");
+	}
+
+	categDef1 = "";
+	categDef1 * 1024;
+	
+	lfDef	  = {};
+	
+	for (fileID = 0; fileID < fileCount; fileID += 1)
+	{
+		lfDef[fileID] = "";
+		lfDef[fileID] * 1024;
+		lfDef[fileID] * "Log(";
+	}
+	
+
+	global		S_0  := 1.0;
+	S_0:>0.0000001;
+	global		NS_0 = 0.1;
+ 
+	for (mi=1; mi<resp; mi += 1)
+	{
+		categDef1 * ("global S_"+mi+"=0.5;S_"+mi+":>0.0000001;\nglobal NS_"+mi+";\n");
+		if (randomizeInitValues)
+		{
+			categDef1*("global P_"+mi+" = Random(0.05,0.95);\nP_"+mi+":<1;\n");	
+			categDef1*("global S_"+mi+" = Random(0.05,1);");	
+		}
+		else
+		{
+			categDef1*("global P_"+mi+" = 1/"+(resp+1-mi)+";\nP_"+mi+":<1;\n");
+		}
+	}
+
+	freqStrMx    = {resp,1};
+	if (resp>1)
+	{
+		freqStrMx[0] = "P_1";
+
+		for (mi=1; mi<resp-1; mi=mi+1)
+		{
+			freqStrMx[mi] = "";
+			for (mi2=1;mi2<=mi;mi2=mi2+1)
+			{
+				freqStrMx[mi] = freqStrMx[mi]+"(1-P_"+mi2+")";		
+			}
+			freqStrMx[mi] = freqStrMx[mi]+"P_"+(mi+1);	
+		}	
+		freqStrMx[mi] = "";
+
+		for (mi2=1;mi2<mi;mi2=mi2+1)
+		{
+			freqStrMx[mi] = freqStrMx[mi]+"(1-P_"+mi2+")";		
+		}
+		freqStrMx[mi] = freqStrMx[mi]+"(1-P_"+mi+")";	
+	}
+	else
+	{
+		freqStrMx[0] = "1";
+	}
+
+	categDef1*( "\n\nglobal c_scale:=S_0*" + freqStrMx[0]);
+
+	for (mi=1; mi<resp; mi=mi+1)
+	{
+		categDef1*( "+S_"+mi+"*" + freqStrMx[mi]);
+	}
+
+	for (mi=0; mi<resp; mi=mi+1)
+	{
+		for (fileID = 0; fileID < fileCount; fileID = fileID + 1)
+		{
+			if (mi)
+			{
+				lfDef[fileID] * "+";
+			}
+			lfDef[fileID]*(freqStrMx[mi]+"*SITE_LIKELIHOOD["+(fileID*resp+mi)+"]");
+		}
+			
+	}
+
+	categDef1 * ";";
+
+	for (mi=0; mi<resp; mi+=1)
+	{
+		categDef1 * ("\nglobal R_"+mi+"=1;NS_"+mi+":=R_"+mi+"*S_"+mi+";\n");
+	}
+	
+	if (randomizeInitValues == 2)
+	{
+		enteredValues = {resp,3};
+		
+		fprintf (stdout, "AC=");
+		fscanf	(stdin,"Number",thisAlpha);
+		categDef1 * ("AC:="+thisAlpha+";");
+		fprintf (stdout, "AT=");
+		fscanf	(stdin,"Number",thisAlpha);
+		categDef1 * ("AT:="+thisAlpha+";");
+		fprintf (stdout, "CG=");
+		fscanf	(stdin,"Number",thisAlpha);
+		categDef1 * ("CG:="+thisAlpha+";");
+		fprintf (stdout, "CT=");
+		fscanf	(stdin,"Number",thisAlpha);
+		categDef1 * ("CT:="+thisAlpha+";");
+		fprintf (stdout, "GT=");
+		fscanf	(stdin,"Number",thisAlpha);
+		categDef1 * ("GT:="+thisAlpha+";");
+		
+		for (mi = 0; mi < resp; mi = mi+1)
+		{
+			fprintf (stdout, "Alpha for rate class ", mi+1, ":");
+			fscanf	(stdin,"Number",thisAlpha);
+			fprintf (stdout, "Beta for rate class ", mi+1, ":");
+			fscanf	(stdin,"Number",thisBeta);
+			fprintf (stdout, "Weight for rate class ", mi+1, ":");
+			fscanf	(stdin,"Number",thisP);
+			enteredValues [mi][0] = thisAlpha;
+			enteredValues [mi][1] = thisBeta;
+			enteredValues [mi][2] = thisP;
+		}
+		currentMult = 1-enteredValues[0][2];
+		for (mi = 1; mi < resp-1; mi = mi+1)
+		{
+			enteredValues[mi][2] = enteredValues[mi][2]/currentMult;
+			currentMult = currentMult*(1-enteredValues[mi][2]);
+		}
+		
+		for (mi = 0; mi < resp-1; mi = mi+1)
+		{
+			categDef1 * ("S_"+mi+":>0;S_" + mi + ":=" + enteredValues[mi][0] + ";NS_" +mi+ ":=" + enteredValues[mi][1] + ";P_" + (mi+1) + ":=" +enteredValues[mi][2]+";");
+		}
+		categDef1 * ("S_"+mi+":>0;S_"+mi+":="+enteredValues[mi][0]+";NS_"+mi+":="+enteredValues[mi][1]+";");
+	}
+
+	if (stratDNDS)
+	{
+		for (mi=respM; mi<respN+respM; mi=mi+1)
+		{
+			categDef1 * ("\nR_"+mi+":=1;");
+		}
+
+		if (randomizeInitValues)
+		{
+			for (mi=0; mi<respM; mi=mi+1)
+			{
+				categDef1 * ("\nR_"+mi+":<1;R_"+mi+"="+Random(0.05,0.95)+";");
+			}
+
+
+			for (mi=respM+respN; mi<resp; mi=mi+1)
+			{
+				categDef1 * ("\nR_"+mi+":>1;R_"+mi+"="+Random(1.05,10)+";");
+			}
+		}
+		else
+		{
+			for (mi=0; mi<respM; mi=mi+1)
+			{
+				categDef1 * ("\nR_"+mi+":<1;R_"+mi+"=1/"+(1+mi)+";");
+			}
+
+			for (mi=respM+respN; mi<resp; mi=mi+1)
+			{
+				categDef1 * ("\nR_"+mi+":>1;R_"+mi+"=2+"+(mi-respM-respN)+";");
+			}
+		}
+	}
+	else
+	{
+		if (randomizeInitValues == 1)
+		{
+			for (mi=0; mi<resp; mi=mi+1)
+			{
+				categDef1 * ("\nR_"+mi+"="+Random(0.05,1.75)+";");
+			}
+		}
+		else
+		{
+			if (randomizeInitValues == 0)
+			{
+				for (mi=0; mi<resp; mi=mi+1)
+				{
+					categDef1 * ("\nR_"+mi+"="+(0.1+0.3*mi)+";");
+				}	
+			}
+		}
+	}
+
+	categDef1 * 0;
+	lfDef1 = "";
+	lfDef1 * 128;
+	lfDef1 * "\"";
+	
+	for (fileID = 0; fileID < fileCount; fileID = fileID + 1)
+	{
+		lfDef[fileID] * ")";
+		lfDef[fileID] * 0;
+		lfDef1 * lfDef[fileID];
+		if (fileID < fileCount - 1)
+		{
+			lfDef1 * "+";
+		}
+	}
+
+	lfDef1 	  * "\"";
+	lfDef1	  * 0;
+
+	ExecuteCommands (categDef1);
+
+	ModelMatrixDimension = 64;
+	for (h = 0 ;h<64; h=h+1)
+	{
+		if (_Genetic_Code[h]==10)
+		{
+			ModelMatrixDimension = ModelMatrixDimension-1;
+		}
+	}
+	
+	
+	if (randomizeInitValues < 2)
+	{
+		SetDialogPrompt ("Save resulting fit to:");
+		fprintf (PROMPT_FOR_FILE, CLEAR_FILE);
+		resToPath = LAST_FILE_PATH;	
+	}
+	
+    if (doCFFreqs == 1)
+    {
+
+        function BuildCodonFrequencies (obsF)
+        {
+            PIStop = 1.0;
+            result = {ModelMatrixDimension,1};
+            hshift = 0;
+
+            for (h=0; h<64; h=h+1)
+            {
+                first = h$16;
+                second = h%16$4;
+                third = h%4;
+                if (_Genetic_Code[h]==10) 
+                {
+                    hshift = hshift+1;
+                    PIStop = PIStop-obsF[first][0]*obsF[second][1]*obsF[third][2];
+                    continue; 
+                }
+                result[h-hshift][0]=obsF[first][0]*obsF[second][1]*obsF[third][2];
+            }
+            return result*(1.0/PIStop);
+        }
+        paramFreqs          = observedFreq;
+        vectorOfFrequencies = BuildCodonFrequencies(paramFreqs);
+       
+ 	}
+    else
+    {
+        ExecuteAFile		  ("TemplateModels/MGFreqsEstimator.ibf");
+        BuildCodonFrequencies (paramFreqs, "vectorOfFrequencies");
+    }
+    
+	ExecuteCommands (nucModelString+"\nModel nucModel = (nucModelMatrix,observedFreqSingle);");
+	
+	if (randomizeInitValues == 2)
+	{
+		fileID = ReportDistributionString(resp);
+		fprintf (stdout, "\nUsing the following rate distribution\n", fileID, "\n");
+	}
+
+	nlfDef = "";
+	nlfDef * 128;
+	nlfDef * "LikelihoodFunction nuc_lf = (";
+
+	for (fileID = 1; fileID <= fileCount; fileID = fileID + 1)
+	{
+		ExecuteCommands ("DataSetFilter nucFilter_"+fileID+" = CreateFilter (filteredData_"+fileID+",1);");
+		ExecuteCommands ("Tree  nucTree_"+fileID+" = treeStringNoModels_"+fileID+";");
+		if (fileID > 1)
+		{
+			nlfDef * ",";
+		}
+		nlfDef * ("nucFilter_"+fileID+",nucTree_"+fileID);
+	}
+	nlfDef * 0;
+    
+ 	ExecuteCommands (nlfDef + ");");
+	Optimize (nuc_res, nuc_lf);
+    
+    GetString (nucExpStr, nucModel, -1);
+    
+
+	lfParts	= "";
+	lfParts * 128;
+	lfParts * "LikelihoodFunction lf = (filteredData_1,tree_1_0";
+    
+
+	for (fileID = 1; fileID <= fileCount; fileID = fileID + 1)
+	{
+		for (part = 0; part < resp; part = part + 1)
+		{
+			if (fileID == 1)
+			{
+				ExecuteCommands ("PopulateModelMatrix(\"rate_matrix_"+part+"\",paramFreqs,\"S_"+part+"/c_scale\",\"NS_"+part+"/c_scale\",aaRateMultipliers);");
+				ExecuteCommands ("Model MG94MODEL_"+part+"= (rate_matrix_"+part+",vectorOfFrequencies,0);");
+                if (part == 0)
+                {
+                    GetString (codonExpStr, MG94MODEL_0, -1);
+                    synRate = 1;
+                    t = 1;
+                    //saveS           = S_0;
+                    //S_0             = 1;
+                    saveNS          = NS_0;
+                    NS_0            = 0.25;
+                    GetString       (c_scale_constr,c_scale,-2);
+                    c_scale         = 1;
+                    nucL            = Eval (nucExpStr);
+                    codonL          = Eval (codonExpStr);
+                    NS_0            = saveNS;
+                    //S_0             = saveS;
+                    ExecuteCommands ("c_scale:=" + c_scale_constr + ";");
+                    global          codonFactor     = nucL/codonL;
+                    
+                }                
+                for (_modelID = 1; _modelID <  bivariateFitHasMultipleCladeRates; _modelID += 1)
+                {
+                    _cladeRate = "clade_" + _modelID + "_NS_" + part;
+                    ExecuteCommands ("global " + _cladeRate + " = 1;");
+                    ExecuteCommands ("PopulateModelMatrix(\"rate_matrix_0_clade" + _modelID + "_" + part+"\",paramFreqs,\"S_"+part+"/c_scale\",\"" + _cladeRate + "*NS_"+part+"/c_scale\",aaRateMultipliers);");
+                    ExecuteCommands ("Model MG94MODEL_" + part+"_CLADE_" + _modelID + " = (rate_matrix_0_clade" + _modelID + "_" + part+",vectorOfFrequencies,0);");
+                }
+			}
+			else
+			{
+				ExecuteCommands ("UseModel (MG94MODEL_"+part+");");
+			}
+			
+			treeID = "tree_"+fileID+"_"+part;
+			ExecuteCommands ("Tree "+treeID+"=treeString_" + fileID +";");
+			if (branchLengths)
+			{
+				ExecuteCommands ("ReplicateConstraint (\"this1.?.synRate:=this2.?.t__/codonFactor\","+treeID+",nucTree_"+fileID+");");
+			}
+			else
+			{
+				if (part == 0)
+				{	
+					ExecuteCommands ("bnames = BranchName(nucTree_" + fileID + ",-1);");
+					nlfDef * 128;
+					for (lc = 0; lc < Columns (bnames); lc=lc+1)
+					{
+						nlfDef * (treeID + "." + bnames[lc] + ".synRate = nucTree_" + fileID + "." + bnames[lc] + ".t/codonFactor;");
+					}
+					nlfDef * 0;
+					ExecuteCommands (nlfDef);
+				}
+				else
+				{
+					ExecuteCommands ("ReplicateConstraint (\"this1.?.synRate:=this2.?.synRate\","+treeID+",tree_1_0);");
+				}
+			}
+			if (part || fileID > 1)
+			{
+				lfParts = lfParts + ",filteredData_" + fileID + "," + treeID;
+			}
+		}
+	}
+	
+	lfParts * 0;
+	ExecuteCommands (lfParts + "," + lfDef1 + ");");
+
+	USE_LAST_RESULTS = 1;
+
+}
+else
+{
+	SetDialogPrompt ("Choose a model fit:");
+	ExecuteAFile (PROMPT_FOR_FILE);
+
+    LF_NEXUS_EXPORT_EXTRA = "bivariateFitHasMultipleCladeRates = " + bivariateFitHasMultipleCladeRates + ";";
+
+	GetInformation(vars,"^P_[0-9]+$");
+	resp = Columns (vars)+1;
+	USE_LAST_RESULTS = 1;
+	SKIP_CONJUGATE_GRADIENT = 1;
+	
+	ChoiceList (runKind, "Optimization type:", 1, SKIP_NONE,
+							"Unconstrained", "No constraints on rate classes",
+							"Constant dS", "Synonymous rates are constant",
+							"No positive selection", "All dS <= dN",
+							"HKY85", "Nucleotide substitution rates are forced to conform to HKY85");
+					
+	GetString (lfInfo, lf, -1);				
+	fileCount = Columns (lfInfo["Datafilters"])/resp;	
+	
+	GetInformation (branchLengths, "^codonFactor$");
+    
+    //Sfprintf (stdout, "\n\n",branchLengths,"\n\n");
+    
+	branchLengths = (Columns (branchLengths)>0);
+	
+	/* do we have codonFactor? */			
+							
+	for (fileID = 1; fileID <= fileCount; fileID = fileID + 1)
+	{
+		ExecuteCommands ("totalCodonCount=totalCodonCount+filteredData_"+fileID+".sites;totalCharCount=totalCharCount+filteredData_"+fileID+".sites*filteredData_"+fileID+".species;");
+	}
+
+
+	if (runKind < 0)
+	{
+		return 0;
+	}
+	
+	
+	if (runKind == 0)
+	{
+		resToPath = LAST_FILE_PATH;
+	}
+	else
+	{
+		if (runKind == 1)
+		{
+			resToPath = LAST_FILE_PATH + ".dN_only";
+			
+			c_scale := 1;
+			for (k = 0; k <resp; k=k+1)
+			{
+				ExecuteCommands("global R_"+k+"= Max(NS_"+k+",0.00001)/Max(S_"+k+",0.00001);");
+				ExecuteCommands("S_"+k+":=1;");
+				ExecuteCommands("NS_"+k+"=R_"+k+"*S_"+k+";");
+			}
+		}
+		else
+		{
+			if (runKind == 2)
+			{
+				resToPath = LAST_FILE_PATH + ".NN";
+				
+				for (k = 0; k <resp; k=k+1)
+				{
+					ExecuteCommands("global R_"+k+";R_"+k+":<1;R_"+k+"=Max(NS_"+k+",0.00001)/Max(S_"+k+",0.00001);");
+					ExecuteCommands("NS_"+k+":=R_"+k+"*S_"+k+";");
+				}
+			}		
+			else
+			{
+				resToPath = LAST_FILE_PATH + ".HKY85";
+				
+				mi  = (1+CT)/2;
+				mi2 = ;
+				
+				AC = (AC+AT+CG+GT)/(2*(1+CT));
+				CT := 1;
+				AT := AC;
+				CG := AC;
+				GT := AC;
+			}		
+		}
+	}
+	
+	freqStrMx    = {resp,1};
+	freqStrMx[0] = "P_1";
+
+	for (mi=1; mi<resp-1; mi=mi+1)
+	{
+		freqStrMx[mi] = "";
+		for (mi2=1;mi2<=mi;mi2=mi2+1)
+		{
+			freqStrMx[mi] = freqStrMx[mi]+"(1-P_"+mi2+")";		
+		}
+		freqStrMx[mi] = freqStrMx[mi]+"P_"+(mi+1);	
+	}	
+	freqStrMx[mi] = "";
+
+	for (mi2=1;mi2<mi;mi2=mi2+1)
+	{
+		freqStrMx[mi] = freqStrMx[mi]+"(1-P_"+mi2+")";		
+	}
+	freqStrMx[mi] = freqStrMx[mi]+"(1-P_"+mi+")";
+}
+
+Optimize (res,lf);
+SKIP_CONJUGATE_GRADIENT= 0;
+USE_LAST_RESULTS       = 0;
+
+LIKELIHOOD_FUNCTION_OUTPUT = 2;
+sumPath = resToPath + ".summary";
+
+LogL = res[1][0];
+
+/* check for branch length approximator */
+
+GetString (paramList, lf, -1);
+
+degF = Columns(paramList["Global Independent"]) 
+              - branchLengths; /* remove one more for codon scaling factor, if nuc branch lengths are used */
+    
+if (doCFFreqs == 1)
+{
+    degF += 9;
+}
+
+for (fileID = 1; fileID <= fileCount; fileID = fileID + 1)
+{
+    degF += Eval ("BranchCount(tree_" + fileID + "_0)") + Eval ("TipCount(tree_" + fileID + "_0)");
+}	
+
+
+AIC	 = 2*(degF-LogL);
+AICc = 2*(degF*totalCharCount/(totalCharCount-degF-1) - LogL);
+
+fprintf (stdout, "\n\nModel fit summary\n", 
+				 "\nLog likelihood:", Format (LogL, 15, 5),
+				 "\nParameters    :", Format (degF, 15, 0),
+				 "\nAIC           :", Format (AIC,  15, 5),
+				 "\nc-AIC         :", Format (AICc,  15, 5),"\n"
+);
+
+fprintf (sumPath, CLEAR_FILE,"Model fit summary\n", 
+				 "\nLog likelihood:", Format (LogL, 15, 5),
+				 "\nParameters    :", Format (degF, 15, 0),
+				 "\nAIC           :", Format (AIC,  15, 5),
+				 "\nc-AIC         :", Format (AICc,  15, 5),"\n");
+				 
+fileID = ReportDistributionString(resp);
+
+bivariateReturnAVL = {};
+bivariateReturnAVL ["LogL"] 		= LogL;
+bivariateReturnAVL ["Parameters"] 	= degF;
+bivariateReturnAVL ["AIC"] 			= AIC;
+bivariateReturnAVL ["cAIC"] 		= AICc;
+bivariateReturnAVL ["Rates"] 		= resp;
+bivariateReturnAVL ["AC"]			= AC;
+bivariateReturnAVL ["AT"]			= AT;
+bivariateReturnAVL ["CG"]			= CG;
+bivariateReturnAVL ["CT"]			= CT;
+bivariateReturnAVL ["GT"]			= GT;
+bivariateReturnAVL ["Estimates"]	= reportMx;
+				 
+
+if (randomizeInitValues != 2)
+{
+	fprintf (stdout,  fileID);
+	fprintf (sumPath, fileID);
+
+	LIKELIHOOD_FUNCTION_OUTPUT = 7;
+	if (runType == 1)
+	{
+		fprintf (resToPath,CLEAR_FILE,lf);
+	}
+	else
+	{
+		fprintf (resToPath,lf);
+	}
+
+	/*sumPath = resToPath + ".posterior";
+	ConstructCategoryMatrix (catMat, lf, COMPLETE);
+
+	posteriorProbs = {totalCodonCount, resp};
+
+	catMatS = "";
+	catMatS * 1024;
+
+	for (mi2 = 0; mi2 < resp; mi2=mi2+1)
+	{
+		if (mi2)
+		{
+			catMatS * ",";
+		}
+		catMatS * ("Rate class " + (mi2+1) + " omega = " + reportMx[mi2][2]);
+	}
+
+	siteOffset = 0;
+	for (fileID = 1; fileID <= fileCount; fileID = fileID + 1)
+	{
+		ExecuteCommands ("thisFilterSize=filteredData_" + fileID + ".sites;");
+		for (mi=0; mi<thisFilterSize; mi=mi+1)
+		{
+			rs = 0;
+			for (mi2 = 0; mi2 < resp; mi2=mi2+1)
+			{
+				posteriorProbs[mi+siteOffset][mi2] = catMat[mi+siteOffset+mi2*totalCodonCount] * reportMx[mi2][3];
+				rs = rs + posteriorProbs[mi+siteOffset][mi2];
+			}
+			catMatS * "\n";
+			for (mi2 = 0; mi2 < resp; mi2=mi2+1)
+			{
+				posteriorProbs[mi+siteOffset][mi2] = posteriorProbs[mi+siteOffset][mi2]/rs;
+				if (mi2)
+				{
+					catMatS * ",";
+				}
+				catMatS * (""+posteriorProbs[mi+siteOffset][mi2]);
+			}
+		} 
+		siteOffset = siteOffset + thisFilterSize;
+	}
+	catMatS * 0;
+	fprintf (sumPath, CLEAR_FILE, catMatS);*/
+}
+
+
+return bivariateReturnAVL;
diff --git a/res/TemplateBatchFiles/dNdSBivariateRateAnalysis_CompareDS.bf b/res/TemplateBatchFiles/dNdSBivariateRateAnalysis_CompareDS.bf
new file mode 100644
index 0000000..7ccd130
--- /dev/null
+++ b/res/TemplateBatchFiles/dNdSBivariateRateAnalysis_CompareDS.bf
@@ -0,0 +1,850 @@
+RequireVersion ("0.9920060817");
+
+ChoiceList (runType,"Run Type",1,SKIP_NONE,
+			"New run","Start a new run",
+			"Continued run","Start with an initial point output by a Gateux derivative approximator."
+		    );
+		    
+if (runType < 0)
+{
+	return 0;
+}
+
+randomizeInitValues  = 0;
+ModelMatrixDimension = 0;
+/*---------------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function BuildCodonFrequencies (obsF)
+{
+	PIStop = 1.0;
+	result = {ModelMatrixDimension,1};
+	hshift = 0;
+
+	for (h=0; h<64; h=h+1)
+	{
+		first = h$16;
+		second = h%16$4;
+		third = h%4;
+		if (_Genetic_Code[h]==10) 
+		{
+			hshift = hshift+1;
+			PIStop = PIStop-obsF[first][0]*obsF[second][1]*obsF[third][2];
+			continue; 
+		}
+		result[h-hshift][0]=obsF[first][0]*obsF[second][1]*obsF[third][2];
+	}
+	return result*(1.0/PIStop);
+}
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function ReportDistributionString (rc)
+{
+	distroString = "";
+	distroString * 1024;
+	
+	reportMx = {rc,4};
+	
+	for (mi=0; mi<rc; mi=mi+1)
+	{
+		ExecuteCommands ("reportMx[mi][0]=S_"+mi+"/c_scale;");
+		ExecuteCommands ("reportMx[mi][1]=NS_"+mi+"/c_scale;");
+		reportMx[mi][2] = reportMx[mi][1]/reportMx[mi][0];
+		ExecuteCommands ("reportMx[mi][3]="+freqStrMx[mi]+";");
+		distroString * ("Class "+(mi+1)+"\n\tdS    = "+Format(reportMx[mi][0],10,3)
+									   +"\n\tdN    = "+Format(reportMx[mi][1],10,3)
+									   +"\n\tdN/dS = "+Format(reportMx[mi][2],10,3)
+									   +"\n\tProb  = "+Format(reportMx[mi][3],10,3) + "\n");
+	}								   
+	
+	distroString * 0;
+	return distroString;
+}
+
+
+	
+totalCodonCount1 = 0;
+totalCodonCount1  = 0;
+totalCodonCount2 = 0;
+totalCharCount2  = 0;
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------------*/
+if (runType == 0)
+{
+	ChoiceList (branchLengths,"Branch Lengths",1,SKIP_NONE,
+				"Codon Model","Jointly optimize rate parameters and branch lengths (slow and thorough)",
+				"Nucleotide Model","Estimate branch lengths once, using an appropriate nucleotide model (quick and dirty)."
+			    );
+
+	if (branchLengths<0)
+	{
+		return;
+	}
+
+	fileCount	= 0;
+	while (fileCount < 2)
+	{
+		fprintf (stdout, "How many datafiles are to be analyzed (>=2):?");
+		fscanf  (stdin, "Number", fileCount);
+		fileCount = fileCount $ 1;
+	}
+	
+	fileCount1 = 0;
+	while (fileCount1 < 1 && fileCount1 > fileCount-1)
+	{
+		fprintf (stdout, "How many parts are there for the 1st data set?[1-",fileCount-1,":");
+		fscanf  (stdin, "Number", fileCount1);
+		fileCount1 = fileCount1 $ 1;
+	}
+	
+	fileCount2 = fileCount - fileCount1;
+	fprintf (stdout, fileCount1, " parts in dataset 1 and ", fileCount2, " - in dataset2\n");
+	
+	#include "TemplateModels/chooseGeneticCode.def";
+	
+	for (fileID = 1; fileID <= fileCount; fileID = fileID + 1)
+	{
+		fprintf (stdout, "\nReading input file ", fileID, "/", fileCount, "\n");
+		SetDialogPrompt ("Please specify codon data #" + fileID + ":");
+
+		ExecuteCommands (
+		"DataSet				ds_" +fileID + " = ReadDataFile (PROMPT_FOR_FILE);" + 
+		"fprintf (stdout,\"\\n______________READ THE FOLLOWING DATA______________\\n\",ds_" + fileID + ");"+
+		"DataSetFilter filteredData_" + fileID + " = CreateFilter (ds_"+fileID +",3,\"\",\"\",GeneticCodeExclusions);");
+		#include								   "queryTree.bf";
+		if (fileID <= fileCount1)
+		{
+			ExecuteCommands ("treeString_" + fileID + " = treeString;totalCodonCount1=totalCodonCount1+filteredData_"+fileID+".sites;totalCodonCount1=totalCodonCount1+filteredData_"+fileID+".sites*filteredData_"+fileID+".species;");
+		}
+		else
+		{
+			ExecuteCommands ("treeString_" + fileID + " = treeString;totalCodonCount2=totalCodonCount2+filteredData_"+fileID+".sites;totalCodonCount2=totalCodonCount2+filteredData_"+fileID+".sites*filteredData_"+fileID+".species;");
+		
+		}
+	}
+	
+
+	observedFreq       = {4,3};
+	observedFreqSingle = {4,1};
+	observedFreq2      = {4,3};
+	observedFreqSingle2 = {4,1};
+	for (fileID = 1; fileID <= fileCount; fileID = fileID + 1)
+	{
+		ExecuteCommands 	  ("HarvestFrequencies (tp, filteredData_"+fileID+",3,1,1);HarvestFrequencies (ts, filteredData_"+fileID+",1,1,1);cfs = filteredData_"+fileID+".sites;");
+		if (fileID <= fileCount1)
+		{
+			observedFreq1 		 = observedFreq1 	    + tp*(cfs/totalCodonCount1);
+			observedFreqSingle1  = observedFreqSingle1  + ts*(cfs/totalCodonCount1);
+		}
+		else
+		{
+			observedFreq2 		 = observedFreq2 	    + tp*(cfs/totalCodonCount2);
+			observedFreqSingle2  = observedFreqSingle2  + ts*(cfs/totalCodonCount2);
+		}
+	}
+	
+	done = 0;
+	while (!done)
+	{
+		fprintf (stdout,"\nPlease enter a 6 character model designation (e.g:010010 defines HKY85) for data set 1:");
+		fscanf  (stdin,"String", modelDesc1);
+		if (Abs(modelDesc1)==6)
+		{	
+			done = 1;
+		}
+	}			
+
+	ExecuteAFile ("2RatesAnalyses/MG94xREVxBivariate.mdl");
+
+	ModelTitle     = "MG94x"+modelDesc1[0];
+	rateBiasTerms  = {{"AC","1","AT","CG","CT","GT"}};
+	rateBiasTerms2 = {{"AC2","1","AT2","CG2","CT2","GT2"}};
+	paramCount	   = 0;
+
+	modelConstraintString = "";
+
+	for (customLoopCounter2=1; customLoopCounter2<6; customLoopCounter2=customLoopCounter2+1)
+	{
+		for (customLoopCounter=0; customLoopCounter<customLoopCounter2; customLoopCounter=customLoopCounter+1)
+		{
+			if (modelDesc[customLoopCounter2]==modelDesc[customLoopCounter])
+			{
+				ModelTitle  = ModelTitle+modelDesc1[customLoopCounter2];	
+				if (rateBiasTerms[customLoopCounter2] == "1")
+				{
+					modelConstraintString = modelConstraintString + rateBiasTerms[customLoopCounter]+":="+rateBiasTerms[customLoopCounter2]+";";
+				}
+				else
+				{
+					modelConstraintString = modelConstraintString + rateBiasTerms[customLoopCounter2]+":="+rateBiasTerms[customLoopCounter]+";";			
+				}
+				break;
+			}
+		}
+		if (customLoopCounter==customLoopCounter2)
+		{
+			ModelTitle = ModelTitle+modelDesc1[customLoopCounter2];	
+		}
+	}	
+		
+	if (Abs(modelConstraintString))
+	{
+		ExecuteCommands (modelConstraintString);
+	}
+	global     AC2 = 1;
+	global 	   AT2 = 1;
+	global     CG2 = 1;
+	global	   CT2 = 1;
+	global     GT2 = 1;
+	
+	done = 0;
+	while (!done)
+	{
+		fprintf (stdout,"\nPlease enter a 6 character model designation (e.g:010010 defines HKY85) for data set 2:");
+		fscanf  (stdin,"String", modelDesc2);
+		if (Abs(modelDesc2)==6)
+		{	
+			done = 1;
+		}
+	}			
+
+	ModelTitle2 = "MG94x"+modelDesc2[0];
+	modelConstraintString = "";
+	for (customLoopCounter2=1; customLoopCounter2<6; customLoopCounter2=customLoopCounter2+1)
+	{
+		for (customLoopCounter=0; customLoopCounter<customLoopCounter2; customLoopCounter=customLoopCounter+1)
+		{
+			if (modelDesc2[customLoopCounter2]==modelDesc2[customLoopCounter])
+			{
+				ModelTitle2  = ModelTitle2+modelDesc2[customLoopCounter2];	
+				if (rateBiasTerms[customLoopCounter2] == "1")
+				{
+					modelConstraintString = modelConstraintString + rateBiasTerms2[customLoopCounter]+":="+rateBiasTerms2[customLoopCounter2]+";";
+				}
+				else
+				{
+					modelConstraintString = modelConstraintString + rateBiasTerms2[customLoopCounter2]+":="+rateBiasTerms2[customLoopCounter]+";";			
+				}
+				break;
+			}
+		}
+		if (customLoopCounter==customLoopCounter2)
+		{
+			ModelTitle2 = ModelTitle2+modelDesc2[customLoopCounter2];	
+		}
+	}	
+
+	mcs2 = modelConstraintString;
+	if (Abs(mcs2))
+	{
+		ExecuteCommands (modelConstraintString);
+	}
+
+	ChoiceList (randomizeInitValues, "Initial Value Options",1,SKIP_NONE,
+				"Default",	 "Use default inital values for rate distribution parameters.",
+				"Randomized",	 "Select initial values for rate distribution parameters at random.",
+				"User Values",	 "Set initial values for rate distribution parameters and nucleotide biases");
+
+
+	if (randomizeInitValues < 0)
+	{
+		return;
+	}
+
+	resp  = 0;
+
+	while (resp<1)
+	{
+		fprintf (stdout,"Number of rate classes:");
+		fscanf  (stdin, "Number", resp);
+	}
+
+	if (randomizeInitValues < 2)
+	{
+		ChoiceList (stratDNDS, "dN/dS Stratification",1,SKIP_NONE,
+					"Unconstrained",	 "Do not place constraints on dN/dS classes.",
+					"Split",	 "Assign all dN/dS classes to negative/neutral/positive clases.");
+		if (stratDNDS<0)
+		{
+			return 0;
+		}
+	}
+	else
+	{
+		stratDNDS = 0;
+	}
+
+	if (stratDNDS)
+	{
+		respM = -1;
+		respN = 0;
+		respP = 0;
+
+		while (respM<0 || respM > resp)
+		{
+			fprintf (stdout,"Number of negative rate classes [0-",resp,"]:");
+			fscanf  (stdin, "Number", respM);
+		}
+
+		if (respM < resp)
+		{
+			respN = -1;
+			while (respN<0 || respN > resp-respM)
+			{
+				fprintf (stdout,"Number of neutral rate classes [0-",resp-respM,"]:");
+				fscanf  (stdin, "Number", respN);
+			}
+		}
+
+		respP = resp-respN-respM;
+
+		fprintf (stdout, "\nUsing\n\t", respM, " negatively selected classes\n\t", respN, " neutrally evolving classes\n\t", 
+							respP, " positively selected classes\n\n");
+	}
+
+	categDef1 = "";
+	categDef1 * 1024;
+	
+	lfDef	  = {};
+	
+	for (fileID = 0; fileID < fileCount; fileID = fileID + 1)
+	{
+		lfDef[fileID] = "";
+		lfDef[fileID] * 1024;
+		lfDef[fileID] * "Log(";
+	}
+	
+
+	global		S_0  = 0.5;
+	S_0:>0.0000001;
+	global		NS_0 = 0.1;
+
+	for (mi=1; mi<resp; mi=mi+1)
+	{
+		categDef1 * ("global S_"+mi+"=0.5;S_"+mi+":>0.0000001;\nglobal NS_"+mi+";\n");
+		if (randomizeInitValues)
+		{
+			categDef1*("global P_"+mi+" = Random(0.05,0.95);\nP_"+mi+":<1;\n");	
+			categDef1*("global S_"+mi+" = Random(0.05,1);");	
+		}
+		else
+		{
+			categDef1*("global P_"+mi+" = 1/"+(resp+1-mi)+";\nP_"+mi+":<1;\n");
+		}
+	}
+
+	freqStrMx    = {resp,1};
+	if (resp>1)
+	{
+		freqStrMx[0] = "P_1";
+
+		for (mi=1; mi<resp-1; mi=mi+1)
+		{
+			freqStrMx[mi] = "";
+			for (mi2=1;mi2<=mi;mi2=mi2+1)
+			{
+				freqStrMx[mi] = freqStrMx[mi]+"(1-P_"+mi2+")";		
+			}
+			freqStrMx[mi] = freqStrMx[mi]+"P_"+(mi+1);	
+		}	
+		freqStrMx[mi] = "";
+
+		for (mi2=1;mi2<mi;mi2=mi2+1)
+		{
+			freqStrMx[mi] = freqStrMx[mi]+"(1-P_"+mi2+")";		
+		}
+		freqStrMx[mi] = freqStrMx[mi]+"(1-P_"+mi+")";	
+	}
+	else
+	{
+		freqStrMx[0] = "1";
+	}
+
+	categDef1*( "\n\nglobal c_scale:=S_0*" + freqStrMx[0]);
+
+	for (mi=1; mi<resp; mi=mi+1)
+	{
+		categDef1*( "+S_"+mi+"*" + freqStrMx[mi]);
+	}
+
+	for (mi=0; mi<resp; mi=mi+1)
+	{
+		for (fileID = 0; fileID < fileCount; fileID = fileID + 1)
+		{
+			if (mi)
+			{
+				lfDef[fileID] * "+";
+			}
+			lfDef[fileID]*(freqStrMx[mi]+"*SITE_LIKELIHOOD["+(fileID*resp+mi)+"]");
+		}
+			
+	}
+
+	categDef1 * ";";
+
+	for (mi=0; mi<resp; mi=mi+1)
+	{
+		categDef1 * ("\nglobal R_"+mi+"=1;NS_"+mi+":=R_"+mi+"*S_"+mi+";\n");
+	}
+	
+	if (randomizeInitValues == 2)
+	{
+		enteredValues = {resp,3};
+		
+		fprintf (stdout, "AC=");
+		fscanf	(stdin,"Number",thisAlpha);
+		categDef1 * ("AC:="+thisAlpha+";");
+		fprintf (stdout, "AT=");
+		fscanf	(stdin,"Number",thisAlpha);
+		categDef1 * ("AT:="+thisAlpha+";");
+		fprintf (stdout, "CG=");
+		fscanf	(stdin,"Number",thisAlpha);
+		categDef1 * ("CG:="+thisAlpha+";");
+		fprintf (stdout, "CT=");
+		fscanf	(stdin,"Number",thisAlpha);
+		categDef1 * ("CT:="+thisAlpha+";");
+		fprintf (stdout, "GT=");
+		fscanf	(stdin,"Number",thisAlpha);
+		categDef1 * ("GT:="+thisAlpha+";");
+		
+		fprintf (stdout, "AC2=");
+		fscanf	(stdin,"Number",thisAlpha);
+		categDef1 * ("AC2:="+thisAlpha+";");
+		fprintf (stdout, "AT2=");
+		fscanf	(stdin,"Number",thisAlpha);
+		categDef1 * ("AT2:="+thisAlpha+";");
+		fprintf (stdout, "CG2=");
+		fscanf	(stdin,"Number",thisAlpha);
+		categDef1 * ("CG2:="+thisAlpha+";");
+		fprintf (stdout, "CT2=");
+		fscanf	(stdin,"Number",thisAlpha);
+		categDef1 * ("CT2:="+thisAlpha+";");
+		fprintf (stdout, "GT2=");
+		fscanf	(stdin,"Number",thisAlpha);
+		categDef1 * ("GT2:="+thisAlpha+";");
+
+		for (mi = 0; mi < resp; mi = mi+1)
+		{
+			fprintf (stdout, "Alpha for rate class ", mi+1, ":");
+			fscanf	(stdin,"Number",thisAlpha);
+			fprintf (stdout, "Beta for rate class ", mi+1, ":");
+			fscanf	(stdin,"Number",thisBeta);
+			fprintf (stdout, "Weight for rate class ", mi+1, ":");
+			fscanf	(stdin,"Number",thisP);
+			enteredValues [mi][0] = thisAlpha;
+			enteredValues [mi][1] = thisBeta;
+			enteredValues [mi][2] = thisP;
+		}
+		currentMult = 1-enteredValues[0][2];
+		for (mi = 1; mi < resp-1; mi = mi+1)
+		{
+			enteredValues[mi][2] = enteredValues[mi][2]/currentMult;
+			currentMult = currentMult*(1-enteredValues[mi][2]);
+		}
+		
+		for (mi = 0; mi < resp-1; mi = mi+1)
+		{
+			categDef1 * ("S_"+mi+":>0;S_" + mi + ":=" + enteredValues[mi][0] + ";NS_" +mi+ ":=" + enteredValues[mi][1] + ";P_" + (mi+1) + ":=" +enteredValues[mi][2]+";");
+		}
+		categDef1 * ("S_"+mi+":>0;S_"+mi+":="+enteredValues[mi][0]+";NS_"+mi+":="+enteredValues[mi][1]+";");
+	}
+
+	if (stratDNDS)
+	{
+		for (mi=respM; mi<respN+respM; mi=mi+1)
+		{
+			categDef1 * ("\nR_"+mi+":=1;");
+		}
+
+		if (randomizeInitValues)
+		{
+			for (mi=0; mi<respM; mi=mi+1)
+			{
+				categDef1 * ("\nR_"+mi+":<1;R_"+mi+"="+Random(0.05,0.95)+";");
+			}
+
+
+			for (mi=respM+respN; mi<resp; mi=mi+1)
+			{
+				categDef1 * ("\nR_"+mi+":>1;R_"+mi+"="+Random(1.05,10)+";");
+			}
+		}
+		else
+		{
+			for (mi=0; mi<respM; mi=mi+1)
+			{
+				categDef1 * ("\nR_"+mi+":<1;R_"+mi+"=1/"+(1+mi)+";");
+			}
+
+			for (mi=respM+respN; mi<resp; mi=mi+1)
+			{
+				categDef1 * ("\nR_"+mi+":>1;R_"+mi+"=2+"+(mi-respM-respN)+";");
+			}
+		}
+	}
+	else
+	{
+		if (randomizeInitValues == 1)
+		{
+			for (mi=0; mi<resp; mi=mi+1)
+			{
+				categDef1 * ("\nR_"+mi+"="+Random(0.05,1.75)+";");
+			}
+		}
+		else
+		{
+			if (randomizeInitValues == 0)
+			{
+				for (mi=0; mi<resp; mi=mi+1)
+				{
+					categDef1 * ("\nR_"+mi+"="+(0.1+0.3*mi)+";");
+				}	
+			}
+		}
+	}
+
+	categDef1 * 0;
+	lfDef1 = "";
+	lfDef1 * 128;
+	lfDef1 * "\"";
+	
+	for (fileID = 0; fileID < fileCount; fileID = fileID + 1)
+	{
+		lfDef[fileID] * ")";
+		lfDef[fileID] * 0;
+		lfDef1 * lfDef[fileID];
+		if (fileID < fileCount - 1)
+		{
+			lfDef1 * "+";
+		}
+	}
+
+	lfDef1 	  * "\"";
+	lfDef1	  * 0;
+
+	ExecuteCommands (categDef1);
+
+	ModelMatrixDimension = 64;
+	for (h = 0 ;h<64; h=h+1)
+	{
+		if (_Genetic_Code[h]==10)
+		{
+			ModelMatrixDimension = ModelMatrixDimension-1;
+		}
+	}
+	
+	
+	if (randomizeInitValues < 2)
+	{
+		SetDialogPrompt ("Save resulting fit to:");
+		fprintf (PROMPT_FOR_FILE, CLEAR_FILE);
+		resToPath = LAST_FILE_PATH;	
+	}
+	
+
+	vectorOfFrequencies = BuildCodonFrequencies (observedFreq);
+
+	ExecuteCommands (nucModelString+"\nModel nucModel = (nucModelMatrix,observedFreqSingle);");
+	
+	if (randomizeInitValues == 2)
+	{
+		fileID = ReportDistributionString(resp);
+		fprintf (stdout, "\nUsing the following rate distribution\n", fileID, "\n");
+	}
+
+	nlfDef = "";
+	nlfDef * 128;
+	nlfDef * "LikelihoodFunction nuc_lf = (";
+
+	for (fileID = 1; fileID <= fileCount; fileID = fileID + 1)
+	{
+		ExecuteCommands ("DataSetFilter nucFilter_"+fileID+" = CreateFilter (filteredData_"+fileID+",1);");
+		ExecuteCommands ("Tree  nucTree_"+fileID+" = treeString_"+fileID+";");
+		if (fileID > 1)
+		{
+			nlfDef * ",";
+		}
+		nlfDef * ("nucFilter_"+fileID+",nucTree_"+fileID);
+	}
+	nlfDef * 0;
+	ExecuteCommands (nlfDef + ");");
+	Optimize (nuc_res, nuc_lf);
+
+	computeExpSubWeights (0);
+	global codonFactor = 0.33;
+
+	lfParts	= "";
+	lfParts * 128;
+	lfParts * "LikelihoodFunction lf = (filteredData_1,tree_1_0";
+
+	for (fileID = 1; fileID <= fileCount; fileID = fileID + 1)
+	{
+		for (part = 0; part < resp; part = part + 1)
+		{
+			if (fileID == 1)
+			{
+				ExecuteCommands ("PopulateModelMatrix(\"rate_matrix_"+part+"\",observedFreq,\"S_"+part+"/c_scale\",\"NS_"+part+"/c_scale\");");
+				ExecuteCommands ("Model MG94model_"+part+"= (rate_matrix_"+part+",vectorOfFrequencies,0);");
+			}
+			else
+			{
+				ExecuteCommands ("UseModel (MG94model_"+part+");");
+			}
+			
+			treeID = "tree_"+fileID+"_"+part;
+			ExecuteCommands ("Tree "+treeID+"=treeString_" + fileID +";");
+			if (branchLengths)
+			{
+				ExecuteCommands ("ReplicateConstraint (\"this1.?.synRate:=this2.?.t__/codonFactor\","+treeID+",nucTree_"+fileID+");");
+			}
+			else
+			{
+				if (part == 0)
+				{	
+					ExecuteCommands ("bnames = BranchName(nucTree_" + fileID + ",-1);");
+					nlfDef * 128;
+					for (lc = 0; lc < Columns (bnames); lc=lc+1)
+					{
+						nlfDef * (treeID + "." + bnames[lc] + ".synRate = nucTree_" + fileID + "." + bnames[lc] + ".t/codonFactor;");
+					}
+					nlfDef * 0;
+					ExecuteCommands (nlfDef);
+				}
+				else
+				{
+					ExecuteCommands ("ReplicateConstraint (\"this1.?.synRate:=this2.?.synRate\","+treeID+",tree_1_0);");
+				}
+			}
+			if (part || fileID > 1)
+			{
+				lfParts = lfParts + ",filteredData_" + fileID + "," + treeID;
+			}
+		}
+	}
+	
+	lfParts * 0;
+	ExecuteCommands (lfParts + "," + lfDef1 + ");");
+
+	USE_LAST_RESULTS = 1;
+
+}
+else
+{
+	SetDialogPrompt ("Choose a model fit:");
+	ExecuteAFile (PROMPT_FOR_FILE);
+
+	GetInformation(vars,"^P_[0-9]+$");
+	resp = Columns (vars)+1;
+	USE_LAST_RESULTS = 1;
+	SKIP_CONJUGATE_GRADIENT = 1;
+	
+	ChoiceList (runKind, "Optimization type:", 1, SKIP_NONE,
+							"Unconstrained", "No constraints on rate classes",
+							"Constant dS", "Synonymous rates are constant",
+							"No positive selection", "All dS <= dN",
+							"HKY85", "Nucleotide substitution rates are forced to conform to HKY85");
+					
+	GetString (lfInfo, lf, -1);				
+	fileCount = Columns (lfInfo["Datafilters"])/resp;	
+	
+	GetInformation (branchLengths, "^codonFactor$");
+	branchLengths = (Columns (branchLengths)>0);
+	
+	/* do we have codonFactor? */			
+							
+	for (fileID = 1; fileID <= fileCount; fileID = fileID + 1)
+	{
+		ExecuteCommands ("totalCodonCount=totalCodonCount+filteredData_"+fileID+".sites;totalCharCount=totalCharCount+filteredData_"+fileID+".sites*filteredData_"+fileID+".species;");
+	}
+
+
+	if (runKind < 0)
+	{
+		return 0;
+	}
+	
+	
+	if (runKind == 0)
+	{
+		resToPath = LAST_FILE_PATH;
+	}
+	else
+	{
+		if (runKind == 1)
+		{
+			resToPath = LAST_FILE_PATH + ".dN_only";
+			
+			c_scale := 1;
+			for (k = 0; k <resp; k=k+1)
+			{
+				ExecuteCommands("global R_"+k+"= Max(NS_"+k+",0.00001)/Max(S_"+k+",0.00001);");
+				ExecuteCommands("S_"+k+":=1;");
+				ExecuteCommands("NS_"+k+"=R_"+k+"*S_"+k+";");
+			}
+		}
+		else
+		{
+			if (runKind == 2)
+			{
+				resToPath = LAST_FILE_PATH + ".NN";
+				
+				for (k = 0; k <resp; k=k+1)
+				{
+					ExecuteCommands("global R_"+k+";R_"+k+":<1;R_"+k+"=Max(NS_"+k+",0.00001)/Max(S_"+k+",0.00001);");
+					ExecuteCommands("NS_"+k+":=R_"+k+"*S_"+k+";");
+				}
+			}		
+			else
+			{
+				resToPath = LAST_FILE_PATH + ".HKY85";
+				
+				mi  = (1+CT)/2;
+				mi2 = ;
+				
+				AC = (AC+AT+CG+GT)/(2*(1+CT));
+				CT := 1;
+				AT := AC;
+				CG := AC;
+				GT := AC;
+			}		
+		}
+	}
+	
+	freqStrMx    = {resp,1};
+	freqStrMx[0] = "P_1";
+
+	for (mi=1; mi<resp-1; mi=mi+1)
+	{
+		freqStrMx[mi] = "";
+		for (mi2=1;mi2<=mi;mi2=mi2+1)
+		{
+			freqStrMx[mi] = freqStrMx[mi]+"(1-P_"+mi2+")";		
+		}
+		freqStrMx[mi] = freqStrMx[mi]+"P_"+(mi+1);	
+	}	
+	freqStrMx[mi] = "";
+
+	for (mi2=1;mi2<mi;mi2=mi2+1)
+	{
+		freqStrMx[mi] = freqStrMx[mi]+"(1-P_"+mi2+")";		
+	}
+	freqStrMx[mi] = freqStrMx[mi]+"(1-P_"+mi+")";
+}
+
+Optimize (res,lf);
+SKIP_CONJUGATE_GRADIENT= 0;
+USE_LAST_RESULTS       = 0;
+
+LIKELIHOOD_FUNCTION_OUTPUT = 2;
+sumPath = resToPath + ".summary";
+
+LogL = res[1][0];
+
+/* check for branch length approximator */
+
+GetString (paramList, lf, -1);
+
+degF = Columns(paramList["Global Independent"]) /* this will overcount by one; because the mean alpha := 1 */
+	+ 8 /* 9 frequency parameters -1 */
+	- branchLengths; /* remove one more for codon scaling factor, if nuc branch lengths are used */
+
+for (fileID = 1; fileID <= fileCount; fileID = fileID + 1)
+{
+	ExecuteCommands ("degF = degF + BranchCount(tree_" + fileID + "_0) + TipCount(tree_" + fileID + "_0);");
+}	
+
+AIC	 = 2*(degF-LogL);
+AICc = 2*(degF*totalCharCount/(totalCharCount-degF-1) - LogL);
+
+fprintf (stdout, "\n\nModel fit summary\n", 
+				 "\nLog likelihood:", Format (LogL, 15, 5),
+				 "\nParameters    :", Format (degF, 15, 0),
+				 "\nAIC           :", Format (AIC,  15, 5),
+				 "\nc-AIC         :", Format (AICc,  15, 5),"\n"
+);
+
+fprintf (sumPath, CLEAR_FILE,"Model fit summary\n", 
+				 "\nLog likelihood:", Format (LogL, 15, 5),
+				 "\nParameters    :", Format (degF, 15, 0),
+				 "\nAIC           :", Format (AIC,  15, 5),
+				 "\nc-AIC         :", Format (AICc,  15, 5),"\n");
+				 
+fileID = ReportDistributionString(resp);
+
+bivariateReturnAVL = {};
+bivariateReturnAVL ["LogL"] 		= LogL;
+bivariateReturnAVL ["Parameters"] 	= degF;
+bivariateReturnAVL ["AIC"] 			= AIC;
+bivariateReturnAVL ["cAIC"] 		= AICc;
+bivariateReturnAVL ["Rates"] 		= resp;
+bivariateReturnAVL ["AC"]			= AC;
+bivariateReturnAVL ["AT"]			= AT;
+bivariateReturnAVL ["CG"]			= CG;
+bivariateReturnAVL ["CT"]			= CT;
+bivariateReturnAVL ["GT"]			= GT;
+bivariateReturnAVL ["Estimates"]	= reportMx;
+				 
+
+if (randomizeInitValues != 2)
+{
+	fprintf (stdout,  fileID);
+	fprintf (sumPath, fileID);
+
+	LIKELIHOOD_FUNCTION_OUTPUT = 7;
+	if (runType == 1)
+	{
+		fprintf (resToPath,CLEAR_FILE,lf);
+	}
+	else
+	{
+		fprintf (resToPath,lf);
+	}
+
+	/*sumPath = resToPath + ".posterior";
+	ConstructCategoryMatrix (catMat, lf, COMPLETE);
+
+	posteriorProbs = {totalCodonCount, resp};
+
+	catMatS = "";
+	catMatS * 1024;
+
+	for (mi2 = 0; mi2 < resp; mi2=mi2+1)
+	{
+		if (mi2)
+		{
+			catMatS * ",";
+		}
+		catMatS * ("Rate class " + (mi2+1) + " omega = " + reportMx[mi2][2]);
+	}
+
+	siteOffset = 0;
+	for (fileID = 1; fileID <= fileCount; fileID = fileID + 1)
+	{
+		ExecuteCommands ("thisFilterSize=filteredData_" + fileID + ".sites;");
+		for (mi=0; mi<thisFilterSize; mi=mi+1)
+		{
+			rs = 0;
+			for (mi2 = 0; mi2 < resp; mi2=mi2+1)
+			{
+				posteriorProbs[mi+siteOffset][mi2] = catMat[mi+siteOffset+mi2*totalCodonCount] * reportMx[mi2][3];
+				rs = rs + posteriorProbs[mi+siteOffset][mi2];
+			}
+			catMatS * "\n";
+			for (mi2 = 0; mi2 < resp; mi2=mi2+1)
+			{
+				posteriorProbs[mi+siteOffset][mi2] = posteriorProbs[mi+siteOffset][mi2]/rs;
+				if (mi2)
+				{
+					catMatS * ",";
+				}
+				catMatS * (""+posteriorProbs[mi+siteOffset][mi2]);
+			}
+		} 
+		siteOffset = siteOffset + thisFilterSize;
+	}
+	catMatS * 0;
+	fprintf (sumPath, CLEAR_FILE, catMatS);*/
+}
+
+
+return bivariateReturnAVL;
diff --git a/res/TemplateBatchFiles/dNdSDistributionComparison.bf b/res/TemplateBatchFiles/dNdSDistributionComparison.bf
new file mode 100644
index 0000000..3bdfccc
--- /dev/null
+++ b/res/TemplateBatchFiles/dNdSDistributionComparison.bf
@@ -0,0 +1,1025 @@
+/* Written by SL Kosakovsky Pond (sergeilkp at mac.com) October 2006 */
+/* This analysis uses a 4 bin general bivariate discrete distributions, 
+   with 2 negatively selected classes, a positively selected class and a neutral class,
+   to compare the distributions of dS and dN in two data sets.
+   
+   The tests done:
+   
+   - Are the distributions the same?
+   - Are there the same proportions of sites with dN>dS in the data sets?
+   - Do the sites under positive selection share the same dN/dS?
+   - Two previous tests combined
+*/
+
+RequireVersion ("0.9920061001");
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function BuildCodonFrequencies (obsF)
+{
+	PIStop = 1.0;
+	result = {ModelMatrixDimension,1};
+	hshift = 0;
+
+	for (h=0; h<64; h=h+1)
+	{
+		first = h$16;
+		second = h%16$4;
+		third = h%4;
+		if (_Genetic_Code[h]==10) 
+		{
+			hshift = hshift+1;
+			PIStop = PIStop-obsF[first][0]*obsF[second][1]*obsF[third][2];
+			continue; 
+		}
+		result[h-hshift][0]=obsF[first][0]*obsF[second][1]*obsF[third][2];
+	}
+	return result*(1.0/PIStop);
+}
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function ReportDistributionString (rc,freqStrMx,infix, skip0)
+{
+	distroString = "";
+	distroString * 1024;
+	
+	reportMx = {rc,4};
+	
+	distroString * ("   dN/dS      dS      dN      Prob\n");
+	for (mi=0; mi<rc; mi=mi+1)
+	{
+		ExecuteCommands ("reportMx[mi][0]=S_"+infix+mi+"/c_"+infix+"scale;");
+		ExecuteCommands ("reportMx[mi][1]=NS_"+infix+mi+"/c_"+infix+"scale;");
+		reportMx[mi][2] = reportMx[mi][1]/reportMx[mi][0];
+		ExecuteCommands ("reportMx[mi][3]="+freqStrMx[mi]+";");
+		if (skip0 == 0 || reportMx[mi][3] > 0)
+		{
+			distroString * (Format(reportMx[mi][2],8,3)+Format(reportMx[mi][0],8,3)+Format(reportMx[mi][1],8,3)+Format(reportMx[mi][3],10,3)+"\n");
+		}
+	}								   
+	
+	distroString * 0;
+	return distroString;
+}
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function DefineNucleotideBiases (dummy)
+{
+	ModelTitle 				= "MG94x"+modelDesc[0];
+	modelConstraintString = "";
+
+	for (customLoopCounter2=0; customLoopCounter2<6; customLoopCounter2=customLoopCounter2+1)
+	{
+		if (rateBiasTerms[customLoopCounter2] != "1")
+		{
+			ExecuteCommands ("global " + rateBiasTerms[customLoopCounter2] + "=1;");
+		}
+	}
+
+	for (customLoopCounter2=1; customLoopCounter2<6; customLoopCounter2=customLoopCounter2+1)
+	{
+		for (customLoopCounter=0; customLoopCounter<customLoopCounter2; customLoopCounter=customLoopCounter+1)
+		{
+			if (modelDesc[customLoopCounter2]==modelDesc[customLoopCounter])
+			{
+				ModelTitle  = ModelTitle+modelDesc[customLoopCounter2];	
+				if (rateBiasTerms[customLoopCounter2] == "1")
+				{
+					modelConstraintString = modelConstraintString + rateBiasTerms[customLoopCounter]+":="+rateBiasTerms[customLoopCounter2]+";";
+				}
+				else
+				{
+					modelConstraintString = modelConstraintString + rateBiasTerms[customLoopCounter2]+":="+rateBiasTerms[customLoopCounter]+";";			
+				}
+				break;
+			}
+		}
+		if (customLoopCounter==customLoopCounter2)
+		{
+			ModelTitle = ModelTitle+modelDesc[customLoopCounter2];	
+		}
+	}	
+
+
+	if (Abs(modelConstraintString))
+	{
+		ExecuteCommands (modelConstraintString);
+	}
+	return 0;
+}
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function 		defineRateDistribution (infix)
+{
+	ExecuteCommands ("global S_"+infix+"0  = 0.5;S_"+infix+"0:>0.0000001;global NS_"+infix+"0 = 0.1;");
+
+	for (mi=1; mi<resp; mi=mi+1)
+	{
+		categDef1 * ("global S_"+infix+mi+"=0.5;S_"+infix+mi+":>0.0000001;\nglobal NS_"+infix+mi+";\n");
+		if (randomizeInitValues)
+		{
+			categDef1*("global P_"+infix+mi+" = Random(0.05,0.95);\nP_"+infix+mi+":<1;\n");	
+			categDef1*("global S_"+infix+mi+" = Random(0.05,1);");	
+		}
+		else
+		{
+			categDef1*("global P_"+infix+mi+" = 1/"+(resp+1-mi)+";\nP_"+infix+mi+":<1;\n");
+		}
+	}
+
+	freqStrMx    = {resp,1};
+	if (resp>1)
+	{
+		freqStrMx[0] = "P_"+infix+"1";
+
+		for (mi=1; mi<resp-1; mi=mi+1)
+		{
+			freqStrMx[mi] = "";
+			for (mi2=1;mi2<=mi;mi2=mi2+1)
+			{
+				freqStrMx[mi] = freqStrMx[mi]+"(1-P_"+infix+mi2+")";		
+			}
+			freqStrMx[mi] = freqStrMx[mi]+"P_"+infix+(mi+1);	
+		}	
+		freqStrMx[mi] = "";
+
+		for (mi2=1;mi2<mi;mi2=mi2+1)
+		{
+			freqStrMx[mi] = freqStrMx[mi]+"(1-P_"+infix+mi2+")";		
+		}
+		freqStrMx[mi] = freqStrMx[mi]+"(1-P_"+infix+mi+")";	
+	}
+	else
+	{
+		freqStrMx[0] = "1";
+	}
+
+	categDef1*( "\n\nglobal c_"+infix+"scale:=S_"+infix+"0*" + freqStrMx[0]);
+
+	for (mi=1; mi<resp; mi=mi+1)
+	{
+		categDef1*( "+S_"+infix+mi+"*" + freqStrMx[mi]);
+	}
+
+	categDef1 * ";";
+
+	for (mi=0; mi<resp; mi=mi+1)
+	{
+		categDef1 * ("\nglobal R_"+infix+mi+"=1;NS_"+infix+mi+":=R_"+infix+mi+"*S_"+infix+mi+";\n");
+	}
+
+	if (stratDNDS)
+	{
+		for (mi=respP; mi<respN+respP; mi=mi+1)
+		{
+			categDef1 * ("\nR_"+infix+mi+":=1;");
+		}
+
+		if (randomizeInitValues)
+		{
+			for (mi=respP+respN; mi<resp; mi=mi+1)
+			{
+				categDef1 * ("\nR_"+infix+mi+":<1;R_"+infix+mi+"="+Random(0.05,0.95)+";");
+			}
+
+			for (mi=0; mi<respP; mi=mi+1)
+			{
+				categDef1 * ("\nR_"+infix+mi+":>1;R_"+infix+mi+"="+Random(1.05,10)+";");
+			}
+		}
+		else
+		{
+			for (mi=respN+respP; mi<resp; mi=mi+1)
+			{
+				categDef1 * ("\nR_"+infix+mi+":<1;R_"+infix+mi+"=1/"+(2+mi-respN-respP)+";");
+			}
+
+			for (mi=0; mi<respP; mi=mi+1)
+			{
+				categDef1 * ("\nR_"+infix+mi+":>1;R_"+infix+mi+"=2+"+mi+";");
+			}
+		}
+	}
+	else
+	{
+		if (randomizeInitValues)
+		{
+			for (mi=0; mi<resp; mi=mi+1)
+			{
+				categDef1 * ("\nR_"+infix+mi+"="+Random(0.05,1.75)+";");
+			}
+		}
+		else
+		{
+			for (mi=0; mi<resp; mi=mi+1)
+			{
+				categDef1 * ("\nR_"+infix+mi+"="+(0.1+0.3*mi)+";");
+			}	
+		}
+
+	}
+
+	categDef1 * 0;
+	return 0;
+}
+/*---------------------------------------------------------------------------------------------------------------------------------------------------*/
+
+ChoiceList (branchLengths,"Branch Lengths",1,SKIP_NONE,
+			"Codon Model","Jointly optimize rate parameters and branch lengths (slow and thorough)",
+			"Nucleotide Model","Estimate branch lengths once, using an appropriate nucleotide model (quick and dirty)."
+		    );
+
+if (branchLengths<0)
+{
+	return;
+}
+
+fileCount	= 2;
+#include "TemplateModels/chooseGeneticCode.def";
+
+ExecuteAFile 		    ("2RatesAnalyses/MG94xREVxBivariate.mdl");
+fprintf 				(stdout, "\nReading input file 1/2\n");
+SetDialogPrompt 		("Please specify codon data #1:");
+DataSet					ds_1 			= ReadDataFile (PROMPT_FOR_FILE);
+fprintf					(stdout, "\nData file 1: ", LAST_FILE_PATH, "\n\t", ds_1.species, " sequences and ", ds_1.sites, " nucleotides\n");
+DataSetFilter 			filteredData_1 	= CreateFilter (ds_1,3,"","",GeneticCodeExclusions);
+HarvestFrequencies		(observedFreq_1,filteredData_1,3,1,1);
+HarvestFrequencies		(observedFreqSingle_1,filteredData_1,1,1,1);
+done = 0;
+while (!done)
+{
+	fprintf (stdout,"\nPlease enter a 6 character model designation (e.g:010010 defines HKY85):");
+	fscanf  (stdin,"String", modelDesc);
+	if (Abs(modelDesc)==6)
+	{	
+		done = 1;
+	}
+}		
+ModelTitle 				= "MG94x"+modelDesc[0];
+rateBiasTerms	 		= {{"AC_1","1","AT_1","CG_1","CT_1","GT_1"}};
+DefineNucleotideBiases (0);
+modelConstraintString_1 = modelConstraintString;
+ModelTitle_1			= ModelTitle;	
+fprintf					(stdout, "Using model ", ModelTitle_1, " on alignment 1\n\n");
+#include				"queryTree.bf";
+treeString_1			= treeString;			
+
+
+fprintf 				(stdout, "\nReading input file 2/2\n");
+SetDialogPrompt 		("Please specify codon data #2:");
+DataSet					ds_2 			= ReadDataFile (PROMPT_FOR_FILE);
+fprintf					(stdout, "\nData file 2: ", LAST_FILE_PATH, "\n\t", ds_2.species, " sequences and ", ds_2.sites, " nucleotides\n");
+DataSetFilter 			filteredData_2 	= CreateFilter (ds_2,3,"","",GeneticCodeExclusions);
+HarvestFrequencies		(observedFreq_2,filteredData_2,3,1,1);
+HarvestFrequencies		(observedFreqSingle_2,filteredData_2,1,1,1);
+done = 0;
+while (!done)
+{
+	fprintf (stdout,"\nPlease enter a 6 character model designation (e.g:010010 defines HKY85):");
+	fscanf  (stdin,"String", modelDesc);
+	if (Abs(modelDesc)==6)
+	{	
+		done = 1;
+	}
+}		
+ModelTitle 				= "MG94x"+modelDesc[0];
+rateBiasTerms	 		= {{"AC_2","1","AT_2","CG_2","CT_2","GT_2"}};
+DefineNucleotideBiases (0);
+modelConstraintString_2 = modelConstraintString;
+ModelTitle_2			= ModelTitle;	
+fprintf					(stdout, "Using model ", ModelTitle_2, " on alignment 2\n\n");
+#include				"queryTree.bf";
+treeString_2			= treeString;			
+						  
+totalCodonCount			= filteredData_1.sites + filteredData_2.sites;
+
+ChoiceList (randomizeInitValues, "Initial Value Options",1,SKIP_NONE,
+			"Default",	 "Use default inital values for rate distribution parameters.",
+			"Randomized",	 "Select initial values for rate distribution parameters at random.");
+
+
+if (randomizeInitValues < 0)
+{
+	return;
+}
+
+stratDNDS = 1;
+resp  	  = 4;
+respM 	  = 2;
+respN 	  = 1;
+respP 	  = 1;
+
+fprintf (stdout, "\nUsing\n\t", respM, " negatively selected classes\n\t", respN, " neutrally evolving classes\n\t", 
+					respP, " positively selected classes\n\n");
+
+categDef1 = "";
+categDef1 * 1024;
+
+lfDef	  = {};
+
+for (fileID = 0; fileID < fileCount; fileID = fileID + 1)
+{
+	lfDef[fileID] = "";
+	lfDef[fileID] * 1024;
+	lfDef[fileID] * "Log(";
+}
+
+defineRateDistribution ("1_");
+categDef_1  = categDef1;
+freqStrMx_1 = freqStrMx;
+
+for (mi=0; mi<resp; mi=mi+1)
+{
+	fileID = 0;
+	if (mi)
+	{
+		lfDef[fileID] * "+";
+	}
+	lfDef[fileID]*(freqStrMx_1[mi]+"*SITE_LIKELIHOOD["+(fileID*resp+mi)+"]");		
+}
+
+defineRateDistribution ("2_");
+categDef_2  = categDef1;
+freqStrMx_2 = freqStrMx;
+
+for (mi=0; mi<resp; mi=mi+1)
+{
+	fileID = 1;
+	if (mi)
+	{
+		lfDef[fileID] * "+";
+	}
+	lfDef[fileID]*(freqStrMx_2[mi]+"*SITE_LIKELIHOOD["+(fileID*resp+mi)+"]");		
+}
+
+lfDef1 = "";
+lfDef1 * 128;
+lfDef1 * "\"";
+
+for (fileID = 0; fileID < fileCount; fileID = fileID + 1)
+{
+	lfDef[fileID] * ")";
+	lfDef[fileID] * 0;
+	lfDef1 * lfDef[fileID];
+	if (fileID < fileCount - 1)
+	{
+		lfDef1 * "+";
+	}
+}
+
+lfDef1 	  * "\"";
+lfDef1	  * 0;
+
+ExecuteCommands (categDef_1);
+ExecuteCommands (categDef_2);
+
+ModelMatrixDimension = 64;
+for (h = 0 ;h<64; h=h+1)
+{
+	if (_Genetic_Code[h]==10)
+	{
+		ModelMatrixDimension = ModelMatrixDimension-1;
+	}
+}
+
+SetDialogPrompt ("Save resulting fits to:");
+fprintf 		(PROMPT_FOR_FILE, CLEAR_FILE);
+resToPath 		= LAST_FILE_PATH;
+
+vectorOfFrequencies_1 = BuildCodonFrequencies (observedFreq_1);
+vectorOfFrequencies_2 = BuildCodonFrequencies (observedFreq_2);
+
+fprintf			(stdout, "Fitting a nucleotide model to approximate branch lengths and get starting nucleotide bias estimates...\n");
+
+nucModelMatrix_1 			= {{*,AC_1*t,t,AT_1*t}{AC_1*t,*,CG_1*t,CT_1*t}{t,CG_1*t,*,GT_1*t}{AT_1*t,CT_1*t,GT_1*t,*}};
+Model nucModel_1 			= (nucModelMatrix_1,observedFreqSingle_1);
+DataSetFilter 	nucFilter_1 = CreateFilter (filteredData_1,1);
+Tree  			nucTree_1 	= treeString_1;
+
+nucModelMatrix_2 = {{*,AC_2*t,t,AT_2*t}{AC_2*t,*,CG_2*t,CT_2*t}{t,CG_2*t,*,GT_2*t}{AT_2*t,CT_2*t,GT_2*t,*}};
+Model nucModel_2 = (nucModelMatrix_2,observedFreqSingle_2);
+DataSetFilter 	nucFilter_2 = CreateFilter (filteredData_2,1);
+Tree  			nucTree_2 	= treeString_2;
+
+LikelihoodFunction nuc_lf = (nucFilter_1, nucTree_1, nucFilter_2, nucTree_2);
+Optimize (nuc_res, nuc_lf);
+
+global 	 codonFactor_1 = 0.33;
+global 	 codonFactor_2 = 0.33;
+
+lfParts	= "";
+lfParts * 128;
+lfParts * "LikelihoodFunction lf = (filteredData_1,tree_1_0";
+
+for (fileID = 1; fileID <= fileCount; fileID = fileID + 1)
+{
+	rateMultipliers 	= {{""   ,"AC_"+fileID+"*",""   ,"AT_"+fileID+"*"}
+						   {"AC_"+fileID+"*",""   ,"CG_"+fileID+"*","CT_"+fileID+"*"}
+						   {""   ,"CG_"+fileID+"*",""   ,"GT_"+fileID+"*"}
+						   {"AT_"+fileID+"*","CT_"+fileID+"*","GT_"+fileID+"*","" }
+						  };
+
+	for (part = 0; part < resp; part = part + 1)
+	{
+		ExecuteCommands ("PopulateModelMatrix(\"rate_matrix_"+fileID+"_"+part+"\",observedFreq_"+fileID+",\"S_"+fileID+"_"+part+"/c_"+fileID+"_scale\",\"NS_"+fileID+"_"+part+"/c_"+fileID+"_scale\");");
+		ExecuteCommands ("Model MG94model_"+fileID+"_"+part+"= (rate_matrix_"+fileID+"_"+part+",vectorOfFrequencies_"+fileID+",0);");
+		
+		treeID = "tree_"+fileID+"_"+part;
+		ExecuteCommands ("Tree "+treeID+"=treeString_" + fileID +";");
+		if (branchLengths)
+		{
+			ExecuteCommands ("ReplicateConstraint (\"this1.?.synRate:=this2.?.t__/codonFactor_"+fileID+"\","+treeID+",nucTree_"+fileID+");");
+		}
+		else
+		{
+			if (part == 0)
+			{	
+				ExecuteCommands ("bnames = BranchName(nucTree_" + fileID + ",-1);");
+				nlfDef = "";
+				nlfDef * 128;
+				for (lc = 0; lc < Columns (bnames); lc=lc+1)
+				{
+					nlfDef * (treeID + "." + bnames[lc] + ".synRate = nucTree_" + fileID + "." + bnames[lc] + ".t/codonFactor_"+fileID+";");
+				}
+				nlfDef * 0;
+				ExecuteCommands (nlfDef);
+			}
+			else
+			{
+				ExecuteCommands ("ReplicateConstraint (\"this1.?.synRate:=this2.?.synRate\","+treeID+",tree_"+fileID+"_0);");
+			}
+		}
+		if (part || fileID > 1)
+		{
+			lfParts = lfParts + ",filteredData_" + fileID + "," + treeID;
+		}
+	}
+}
+
+lfParts * 0;
+ExecuteCommands (lfParts + "," + lfDef1 + ");");
+
+sumPath = resToPath + ".summary";
+
+treeBranchParameters = 0;
+for (fileID = 1; fileID <= fileCount; fileID = fileID + 1)
+{
+	ExecuteCommands ("treeBranchParameters = treeBranchParameters + BranchCount(tree_" + fileID + "_0) + TipCount(tree_" + fileID + "_0);");
+}	
+
+/*-------------- INDEPENDENT DISTRIBUTIONS  ------------------*/
+
+sop = Max(OPTIMIZATION_PRECISION,0.001);
+
+fprintf (stdout, "Running simpler distribution approximations to ensure good convergence...\n");
+
+OPTIMIZATION_PRECISION = 0.1;
+
+P_1_1 := 0;P_1_2 := 0;P_1_3 := 0;
+P_2_1 := 0;P_2_2 := 0;P_2_3 := 0;
+
+S_1_0 := 1;S_1_1 := 1;S_1_2 := 1;S_1_3 := 1;
+S_2_0 := 1;S_2_1 := 1;S_2_2 := 1;S_2_3 := 1;
+R_1_0 := 1;R_1_1 := 1;R_1_2 := 1;
+R_2_0 := 1;R_2_1 := 1;R_2_2 := 1;
+
+Optimize (res,lf);
+USE_LAST_RESULTS 		= 1;
+SKIP_CONJUGATE_GRADIENT = 1;
+
+d1 = ReportDistributionString(4,freqStrMx_1,"1_",1);
+d2 = ReportDistributionString(4,freqStrMx_2,"2_",1);
+
+fprintf (stdout,  "\n*** Done with pass 1. Log(L) = ", Format(res[1][0],10,3), " *** \n");
+fprintf (stdout,  "Approximate rates for data set 1:\n", d1);
+fprintf (stdout,  "Approximate rates for data set 2:\n", d2);
+
+codonFactor_1 := codonFactor_1__;
+codonFactor_2 := codonFactor_2__;
+
+AC_1  := AC_1__; AT_1  := AT_1__; CG_1  := CG_1__; CT_1  := CT_1__; GT_1  := GT_1__;
+AC_2  := AC_2__; AT_2  := AT_2__; CG_2  := CG_2__; CT_2  := CT_2__; GT_2  := GT_2__;
+
+
+
+fprintf (stdout, "\nGateaux sampling positively selected directions\n");
+
+P_1_1 = 2/filteredData_1.sites;
+S_1_3 = 1;
+
+baseLineLL  = res[1][0];
+LFCompute 	(lf,LF_START_COMPUTE);
+bestDiff 	= -1e100;
+bestAlpha 	= 1;
+bestBeta  	= 1;
+bestLL		= -1e100;
+
+step  		= 0.1;
+step2 		= 0.25;
+v1 			= 0.05;
+
+for (v1c = 0; v1c < 10; v1c = v1c + 1)
+{
+	v2 = v1+step; 
+	for (v2c = 0; v2c < 20; v2c = v2c+1)
+	{
+		checkASample ("1_0");	
+		v2 = v2 + step2;
+	}
+	v1 = v1+step;
+} 
+
+S_1_0 = bestAlpha;
+R_1_0 = bestBeta;
+bestAlpha 	= 1;
+bestBeta  	= 1;
+
+if (bestDiff <= 0)
+{
+	P_1_1 = 0;
+}
+saveBD = bestDiff;
+
+P_2_1 = 1/filteredData_2.sites;
+S_2_3 = 1;
+
+v1 			= 0.05;
+for (v1c = 0; v1c < 10; v1c = v1c + 1)
+{
+	v2 = v1+step; 
+	for (v2c = 0; v2c < 20; v2c = v2c+1)
+	{
+		checkASample ("2_0");	
+		v2 = v2 + step2;
+	}
+	v1 = v1+step;
+} 
+
+LFCompute (lf,LF_DONE_COMPUTE);
+
+S_2_0 = bestAlpha;
+R_2_0 = bestBeta;
+
+if (bestDiff <= saveBD)
+{
+	P_2_1 = 0;
+}
+
+if (bestDiff > 0)
+{
+	fprintf (stdout, "\nFound a likelihood improvement in the direction (", S_1_0, ",", S_1_0*R_1_0, "), (", S_2_0, ",", S_2_0*R_2_0, "), ",bestDiff," likelihood points\n");
+}
+
+
+Optimize (res,lf);
+
+d1 = ReportDistributionString(4,freqStrMx_1,"1_",1);
+d2 = ReportDistributionString(4,freqStrMx_2,"2_",1);
+
+fprintf (stdout,  "\n*** Done with pass 2. Log(L) = ", Format(res[1][0],10,3), " *** \n");
+fprintf (stdout,  "Approximate rates for data set 1:\n", d1);
+fprintf (stdout,  "Approximate rates for data set 2:\n", d2);
+
+
+fprintf (stdout, "\nGateaux sampling neutral directions\n");
+
+baseLineLL  = res[1][0];
+LFCompute 	(lf,LF_START_COMPUTE);
+
+P_1_2 = 1/(filteredData_1.sites*(1-P_1_1));
+bestDiff 	= -1e100;
+bestAlpha 	= 1;
+step = 0.02;
+v1 = 0;
+for (v1c = 0; v1c < 50; v1c = v1c + 1)
+{
+	v1 = v1 + step;
+	v2 = v1;
+	
+	checkASample ("1_1");
+}	
+
+
+S_1_1 = bestAlpha;
+bestAlpha 	= 1;
+
+if (bestDiff <= 0)
+{
+	P_1_2 = 0;
+}
+saveBD = bestDiff;
+R_1_1 := 1;
+
+P_2_2 = 1/(filteredData_2.sites*(1-P_2_1));
+
+v1 = 0;
+for (v1c = 0; v1c < 50; v1c = v1c + 1)
+{
+	v1 = v1 + step;
+	v2 = v1;
+	
+	checkASample ("2_1");
+}	
+
+
+LFCompute (lf,LF_DONE_COMPUTE);
+
+S_2_1 = bestAlpha;
+R_2_1 := 1;
+
+if (bestDiff <= saveBD)
+{
+	P_2_2 = 0;
+}
+
+if (bestDiff > 0)
+{
+	fprintf (stdout, "\nFound a likelihood improvement in the direction (", S_1_1, ",", S_1_1, "), (", S_2_1, ",", S_2_1, "), ",bestDiff," likelihood points\n");
+}
+
+Optimize (res,lf);
+d1 = ReportDistributionString(4,freqStrMx_1,"1_",1);
+d2 = ReportDistributionString(4,freqStrMx_2,"2_",1);
+
+fprintf (stdout,  "\n*** Done with pass 3. Log(L) = ", Format(res[1][0],10,3), " *** \n");
+fprintf (stdout,  "Approximate rates for data set 1:\n", d1);
+fprintf (stdout,  "Approximate rates for data set 2:\n", d2);
+
+fprintf (stdout, "\nGateaux sampling negative selected directions\n");
+
+
+baseLineLL  = res[1][0];
+LFCompute 	(lf,LF_START_COMPUTE);
+bestDiff 	= -1e100;
+bestAlpha 	= 1;
+bestBeta  	= 1;
+
+
+step = 1/16;
+v1 = 0;
+P_1_3 = 2/(filteredData_1.sites*(1-P_1_1)*(1-P_1_2));
+S_1_2 = 1;
+for (v1c = 0; v1c < 15; v1c = v1c + 1)
+{
+	v1 = v1+step;
+	v2 = step/2; 
+	for (v2c = 0; v2c < v1c; v2c = v2c+1)
+	{
+		checkASample ("1_2");	
+		v2 = v2 + step;
+	}
+} 
+
+
+S_1_2 = bestAlpha;
+R_1_2 = bestBeta;
+bestAlpha 	= 1;
+bestBeta  	= 1;
+
+if (bestDiff <= 0)
+{
+	P_1_3 = 0;
+}
+saveBD = bestDiff;
+
+
+v1 = 0;
+P_2_3 = 2/(filteredData_2.sites*(1-P_2_1)*(1-P_2_2));
+S_2_2 = 1;
+for (v1c = 0; v1c < 15; v1c = v1c + 1)
+{
+	v1 = v1+step;
+	v2 = step/2; 
+	for (v2c = 0; v2c < v1c; v2c = v2c+1)
+	{
+		checkASample ("2_2");	
+		v2 = v2 + step;
+	}
+} 
+
+LFCompute (lf,LF_DONE_COMPUTE);
+
+S_2_2 = bestAlpha;
+R_2_2 = bestBeta;
+
+if (bestDiff <= saveBD)
+{
+	P_2_2 = 0;
+}
+
+if (bestDiff > 0)
+{
+	fprintf (stdout, "\nFound a likelihood improvement in the direction (", S_1_2, ",", S_1_2*R_1_2, "), (", S_2_2, ",", S_2_2*R_2_2, "), ",bestDiff," likelihood points\n");
+}
+
+AC_1  = AC_1; AT_1  = AT_1; CG_1  = CG_1; CT_1  = CT_1; GT_1  = GT_1;
+AC_2  = AC_2; AT_2  = AT_2; CG_2  = CG_2; CT_2  = CT_2; GT_2  = GT_2;
+
+if (Abs(modelConstraintString_1))
+{
+	ExecuteCommands (modelConstraintString_1);
+}
+if (Abs(modelConstraintString_2))
+{
+	ExecuteCommands (modelConstraintString_2);
+}
+
+codonFactor_1 = codonFactor_1;
+codonFactor_2 = codonFactor_2;
+
+
+GetString (paramList, lf, -1);
+degF = Columns(paramList["Global Independent"]) + 14 - 2*branchLengths + treeBranchParameters; 
+
+OPTIMIZATION_PRECISION = sop;
+fprintf (stdout, "Running an independent distributions model fit (", degF, " parameters)...\n");
+Optimize (res,lf);
+LogL = res[1][0];
+
+AIC	 = 2*(degF-LogL);
+AICc = 2*(degF*totalCodonCount/(totalCodonCount-degF-1) - LogL);
+
+fprintf (stdout, "\n\nIndependent distributions model fit summary\n", 
+				 "\nLog likelihood:", Format (LogL, 15, 5),
+				 "\nParameters    :", Format (degF, 15, 0),
+				 "\nAIC           :", Format (AIC,  15, 5),
+				 "\nc-AIC         :", Format (AICc,  15, 5),"\n"
+);
+
+fprintf (sumPath,CLEAR_FILE,"Independent distributions model fit summary\n", 
+				 "\nLog likelihood:", Format (LogL, 15, 5),
+				 "\nParameters    :", Format (degF, 15, 0),
+				 "\nAIC           :", Format (AIC,  15, 5),
+				 "\nc-AIC         :", Format (AICc,  15, 5),"\n");
+				 
+d1 = ReportDistributionString(4,freqStrMx_1,"1_",0);
+d2 = ReportDistributionString(4,freqStrMx_2,"2_",0);
+
+fprintf (stdout,  "Inferred rates for data set 1:\n", d1);
+fprintf (sumPath, "Inferred rates for data set 1:\n", d1);
+fprintf (stdout,  "Inferred rates for data set 2:\n", d2);
+fprintf (sumPath, "Inferred rates for data set 2:\n", d2);
+
+LIKELIHOOD_FUNCTION_OUTPUT = 6;
+fprintf (resToPath,CLEAR_FILE,lf);
+
+
+/*-------------- SHARED POSITIVE SELECTION STRENGTHS  ------------------*/
+
+for (k=0; k<respP; k=k+1)
+{
+	ExecuteCommands ("R_1_"+k+"=0.5(R_1_"+k+"+R_2_"+k+");");
+	ExecuteCommands ("R_2_"+k+":=R_1_"+k+";");
+}
+
+GetString (paramList, lf, -1);
+degFPSS = Columns(paramList["Global Independent"]) + 14 - 2*branchLengths + treeBranchParameters; 
+	
+fprintf (stdout, "\nRunning a shared positive selection strengths model (",degFPSS," parameters)...\n");
+Optimize (res_PSS,lf);
+LogLPSS = res_PSS[1][0];
+
+AICPSS	 = 2*(degFPSS-LogLPSS);
+AICcPSS    = 2*(degFPSS*totalCodonCount/(totalCodonCount-degFPSS-1) - LogLPSS);
+
+fprintf (stdout, "\n\nShared positive selection strengths model fit summary\n", 
+				 "\nLog likelihood:", Format (LogLPSS, 15, 5),
+				 "\nParameters    :", Format (degFPSS, 15, 0),
+				 "\nAIC           :", Format (AICPSS,  15, 5),
+				 "\nc-AIC         :", Format (AICcPSS,  15, 5),"\n"
+);
+
+fprintf (sumPath, "\n\nShared positive strengths regime model fit summary\n", 
+				 "\nLog likelihood:", Format (LogLPSS, 15, 5),
+				 "\nParameters    :", Format (degFPSS, 15, 0),
+				 "\nAIC           :", Format (AICPSS,  15, 5),
+				 "\nc-AIC         :", Format (AICcPSS,  15, 5),"\n"
+);
+
+d1 = ReportDistributionString(4,freqStrMx_1,"1_",0);
+d2 = ReportDistributionString(4,freqStrMx_2,"2_",0);
+
+fprintf (stdout,  "Inferred rates for data set 1:\n", d1);
+fprintf (sumPath, "Inferred rates for data set 1:\n", d1);
+fprintf (stdout,  "Inferred rates for data set 2:\n", d2);
+fprintf (sumPath, "Inferred rates for data set 2:\n", d2);
+fpath = resToPath + ".SharedStrength";
+LIKELIHOOD_FUNCTION_OUTPUT = 6;
+fprintf (fpath,CLEAR_FILE,lf);
+
+/*-------------- SHARED POSITIVE SELECTION PROPORTIONS  ------------------*/
+
+/* RELOAD INDEPENDENT FIT */
+DeleteObject (lf);
+ExecuteAFile (resToPath);
+
+for (k=1; k<=respP; k=k+1)
+{
+	ExecuteCommands ("P_1_"+k+"=0.5(P_1_"+k+"+P_2_"+k+");");
+	ExecuteCommands ("P_2_"+k+":=P_1_"+k+";");
+}
+
+GetString (paramList, lf, -1);
+degFPSP = Columns(paramList["Global Independent"]) + 14 - 2*branchLengths + treeBranchParameters; 
+fprintf (stdout, "\nRunning a shared positive selection proportions model (",degFPSP," parameters) ...\n");
+Optimize (res_PSP,lf);
+LogLPSP = res_PSP[1][0];
+
+
+AICPSP	 = 2*(degFPSP-LogLPSP);
+AICcPSP    = 2*(degFPSP*totalCodonCount/(totalCodonCount-degFPSP-1) - LogLPSP);
+
+fprintf (stdout, "\n\nShared positive selection proportions model fit summary\n", 
+				 "\nLog likelihood:", Format (LogLPSP, 15, 5),
+				 "\nParameters    :", Format (degFPSP, 15, 0),
+				 "\nAIC           :", Format (AICPSP,  15, 5),
+				 "\nc-AIC         :", Format (AICcPSP,  15, 5),"\n"
+);
+
+fprintf (sumPath, "\n\nShared positive proportions regime model fit summary\n", 
+				 "\nLog likelihood:", Format (LogLPSP, 15, 5),
+				 "\nParameters    :", Format (degFPSP, 15, 0),
+				 "\nAIC           :", Format (AICPSP,  15, 5),
+				 "\nc-AIC         :", Format (AICcPSP,  15, 5),"\n"
+);
+
+d1 = ReportDistributionString(4,freqStrMx_1,"1_",0);
+d2 = ReportDistributionString(4,freqStrMx_2,"2_",0);
+
+fprintf (stdout,  "Inferred rates for data set 1:\n", d1);
+fprintf (sumPath,  "Inferred rates for data set 1:\n", d1);
+fprintf (stdout,  "Inferred rates for data set 2:\n", d2);
+fprintf (sumPath,  "Inferred rates for data set 2:\n", d2);
+fpath = resToPath + ".SharedProportion";
+LIKELIHOOD_FUNCTION_OUTPUT = 6;
+fprintf (fpath,CLEAR_FILE,lf);
+
+
+/*-------------- SHARED POSITIVE SELECTION REGIME  ------------------*/
+
+/* RELOAD INDEPENDENT FIT */
+DeleteObject (lf);
+ExecuteAFile (resToPath);
+
+for (k=0; k<respP; k=k+1)
+{
+	ExecuteCommands ("R_1_"+k+"=0.5(R_1_"+k+"+R_2_"+k+");");
+	ExecuteCommands ("R_2_"+k+":=R_1_"+k+";");
+}
+for (k=1; k<=respP; k=k+1)
+{
+	ExecuteCommands ("P_1_"+k+"=0.5(P_1_"+k+"+P_2_"+k+");");
+	ExecuteCommands ("P_2_"+k+":=P_1_"+k+";");
+}
+
+GetString (paramList, lf, -1);
+degFPSH = Columns(paramList["Global Independent"]) + 14 - 2*branchLengths + treeBranchParameters; 
+
+fprintf (stdout, "\nRunning a shared positive selection regime model (", degFPSH, " parameters)...\n");
+Optimize (res_PSH,lf);
+LogLPSH = res_PSH[1][0];
+
+AICPSH	 = 2*(degFPSH-LogLPSH);
+AICcPSH    = 2*(degFPSH*totalCodonCount/(totalCodonCount-degFPSH-1) - LogLPSH);
+
+fprintf (stdout, "\n\nShared positive selection regime model fit summary\n", 
+				 "\nLog likelihood:", Format (LogLPSH, 15, 5),
+				 "\nParameters    :", Format (degFPSH, 15, 0),
+				 "\nAIC           :", Format (AICPSH,  15, 5),
+				 "\nc-AIC         :", Format (AICcPSH,  15, 5),"\n"
+);
+
+fprintf (sumPath, "\n\nShared positive selection regime model fit summary\n", 
+				 "\nLog likelihood:", Format (LogLPSH, 15, 5),
+				 "\nParameters    :", Format (degFPSH, 15, 0),
+				 "\nAIC           :", Format (AICPSH,  15, 5),
+				 "\nc-AIC         :", Format (AICcPSH,  15, 5),"\n"
+);
+
+d1 = ReportDistributionString(4,freqStrMx_1,"1_",0);
+d2 = ReportDistributionString(4,freqStrMx_2,"2_",0);
+
+fprintf (stdout,  "Inferred rates for data set 1:\n", d1);
+fprintf (sumPath,  "Inferred rates for data set 1:\n", d1);
+fprintf (stdout,  "Inferred rates for data set 2:\n", d2);
+fprintf (sumPath,  "Inferred rates for data set 2:\n", d2);
+fpath = resToPath + ".SharedPositiveSelection";
+LIKELIHOOD_FUNCTION_OUTPUT = 6;
+fprintf (fpath,CLEAR_FILE,lf);
+
+/*-------------- SHARED MODEL ------------------*/
+
+DeleteObject (lf);
+ExecuteAFile (resToPath);
+
+for (k=0; k<resp; k=k+1)
+{
+	ExecuteCommands ("S_1_"+k+"=0.5(S_1_"+k+"+S_2_"+k+");");
+	if (k<respP || k>=respP+respN)
+	{
+		ExecuteCommands ("R_1_"+k+"=0.5(R_1_"+k+"+R_2_"+k+");");
+	}
+	ExecuteCommands ("S_2_"+k+":=S_1_"+k+";R_2_"+k+":=R_1_"+k+";");
+}
+for (k=1; k<=resp; k=k+1)
+{
+	ExecuteCommands ("P_1_"+k+"=0.5(P_1_"+k+"+P_2_"+k+");");
+	ExecuteCommands ("P_2_"+k+":=P_1_"+k+";");
+}
+
+GetString (paramList, lf, -1);
+degFJ = Columns(paramList["Global Independent"]) + 14 - 2*branchLengths + treeBranchParameters; 
+fprintf (stdout, "\nRunning a shared distributions model fit (", degFJ, " parameters)...\n");
+
+Optimize (res_J,lf);
+LogLJ = res_J[1][0];
+
+AICJ	 = 2*(degFJ-LogLJ);
+AICcJ    = 2*(degFJ*totalCodonCount/(totalCodonCount-degFJ-1) - LogLJ);
+
+fprintf (stdout, "\n\nShared distributions model fit summary\n", 
+				 "\nLog likelihood:", Format (LogLJ, 15, 5),
+				 "\nParameters    :", Format (degFJ, 15, 0),
+				 "\nAIC           :", Format (AICJ,  15, 5),
+				 "\nc-AIC         :", Format (AICcJ,  15, 5),"\n"
+);
+
+fprintf (sumPath, "\n\nShared distributions model fit summary\n", 
+				 "\nLog likelihood:", Format (LogLJ, 15, 5),
+				 "\nParameters    :", Format (degFJ, 15, 0),
+				 "\nAIC           :", Format (AICJ,  15, 5),
+				 "\nc-AIC         :", Format (AICcJ,  15, 5),"\n"
+);
+
+d1 = ReportDistributionString(4,freqStrMx_1,"1_",0);
+
+fprintf (stdout,  "Inferred joint rates:\n", d1);
+fprintf (sumPath, "Inferred joint rates:\n", d1);
+
+fpath = resToPath + ".JointAll";
+LIKELIHOOD_FUNCTION_OUTPUT = 6;
+fprintf (fpath,CLEAR_FILE,lf);
+
+USE_LAST_RESULTS 			= 0;
+SKIP_CONJUGATE_GRADIENT 	= 0;
+LIKELIHOOD_FUNCTION_OUTPUT	= 2;
+
+fprintf (stdout, "\nDistribution comparison tests\n",
+				 "\n\tAre the distributions different?",
+				 "\n\t\tLR = ", Format (2*(LogL-LogLJ),10,3), 
+				 	  " DF = ", degF-degFJ, 
+				 	  " p = ", Format(1-CChi2(2*(LogL-LogLJ), degF-degFJ),8,3), "\n");
+
+fprintf (stdout, "\n\tAre selective regimes (dN/dS and proportions) different?",
+				 "\n\t\tLR = ", Format (2*(LogL-LogLPSH),10,3), 
+				 	  " DF = ", degF-degFPSH, 
+				 	  " p = ", Format(1-CChi2(2*(LogL-LogLPSH), degF-degFPSH),8,3), "\n");
+
+fprintf (stdout, "\n\tAre selection strengths (dN/dS) different?",
+				 "\n\t\tLR = ", Format (2*(LogL-LogLPSS),10,3), 
+				 	  " DF = ", degF-degFPSS, 
+				 	  " p = ", Format(1-CChi2(2*(LogL-LogLPSS), degF-degFPSH),8,3), "\n");
+
+fprintf (stdout, "\n\tAre the proportions of codons under selection different?",
+				 "\n\t\tLR = ", Format (2*(LogL-LogLPSP),10,3), 
+				 	  " DF = ", degF-degFPSP, 
+				 	  " p = ", Format(1-CChi2(2*(LogL-LogLPSP), degF-degFPSP),8,3), "\n");
+
+fprintf (sumPath, "\n\nDistribution comparison tests\n",
+				 "\n\tAre the distributions different?",
+				 "\n\t\tLR = ", Format (2*(LogL-LogLJ),10,3), 
+				 	  " DF = ", degF-degFJ, 
+				 	  " p = ", Format(1-CChi2(2*(LogL-LogLJ), degF-degFJ),8,3), "\n");
+
+fprintf (sumPath, "\n\tAre selective regimes (dN/dS and proportions) different?",
+				 "\n\t\tLR = ", Format (2*(LogL-LogLPSH),10,3), 
+				 	  " DF = ", degF-degFPSH, 
+				 	  " p = ", Format(1-CChi2(2*(LogL-LogLPSH), degF-degFPSH),8,3), "\n");
+
+fprintf (sumPath, "\n\tAre selection strengths (dN/dS) different?",
+				 "\n\t\tLR = ", Format (2*(LogL-LogLPSS),10,3), 
+				 	  " DF = ", degF-degFPSS, 
+				 	  " p = ", Format(1-CChi2(2*(LogL-LogLPSS), degF-degFPSH),8,3), "\n");
+
+fprintf (sumPath, "\n\tAre the proportions of codons under selection different?",
+				 "\n\t\tLR = ", Format (2*(LogL-LogLPSP),10,3), 
+				 	  " DF = ", degF-degFPSP, 
+				 	  " p = ", Format(1-CChi2(2*(LogL-LogLPSP), degF-degFPSP),8,3), "\n");
+/*------------------------------------------------------------------------------------------------------------*/
+
+function checkASample (whichRate)
+{
+	ExecuteCommands ("S_"+whichRate+"=v1;R_"+whichRate+"=v2/v1;");
+	LFCompute (lf,res_n);
+	localDiff = res_n-baseLineLL;
+	if (localDiff > bestDiff)
+	{
+		bestDiff 	= localDiff;
+		bestAlpha 	= v1;
+		bestBeta  	= v2/v1;
+	}
+	return 0;
+}
diff --git a/res/TemplateBatchFiles/dNdSDistributionComparisonMF.bf b/res/TemplateBatchFiles/dNdSDistributionComparisonMF.bf
new file mode 100644
index 0000000..e69de29
diff --git a/res/TemplateBatchFiles/dNdSDistributionComparisonPartitions.bf b/res/TemplateBatchFiles/dNdSDistributionComparisonPartitions.bf
new file mode 100644
index 0000000..90b5ba1
--- /dev/null
+++ b/res/TemplateBatchFiles/dNdSDistributionComparisonPartitions.bf
@@ -0,0 +1,996 @@
+/* Written by SL Kosakovsky Pond (sergeilkp at mac.com) October 2006 */
+/* This analysis uses a 4 bin general bivariate discrete distributions, 
+   with 2 negatively selected classes, a positively selected class and a neutral class,
+   to compare the distributions of dS and dN in two data sets.
+   
+   The tests done:
+   
+   - Are the distributions the same?
+   - Are there the same proportions of sites with dN>dS in the data sets?
+   - Do the sites under positive selection share the same dN/dS?
+   - Two previous tests combined
+*/
+
+RequireVersion ("0.9920061001");
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function BuildCodonFrequencies (obsF)
+{
+	PIStop = 1.0;
+	result = {ModelMatrixDimension,1};
+	hshift = 0;
+
+	for (h=0; h<64; h=h+1)
+	{
+		first = h$16;
+		second = h%16$4;
+		third = h%4;
+		if (_Genetic_Code[h]==10) 
+		{
+			hshift = hshift+1;
+			PIStop = PIStop-obsF[first][0]*obsF[second][1]*obsF[third][2];
+			continue; 
+		}
+		result[h-hshift][0]=obsF[first][0]*obsF[second][1]*obsF[third][2];
+	}
+	return result*(1.0/PIStop);
+}
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function ReportDistributionString (rc,freqStrMx,infix, skip0)
+{
+	distroString = "";
+	distroString * 1024;
+	
+	reportMx = {rc,4};
+	
+	distroString * ("   dN/dS      dS      dN      Prob\n");
+	for (mi=0; mi<rc; mi=mi+1)
+	{
+		ExecuteCommands ("reportMx[mi][0]=S_"+infix+mi+"/c_"+infix+"scale;");
+		ExecuteCommands ("reportMx[mi][1]=NS_"+infix+mi+"/c_"+infix+"scale;");
+		reportMx[mi][2] = reportMx[mi][1]/reportMx[mi][0];
+		ExecuteCommands ("reportMx[mi][3]="+freqStrMx[mi]+";");
+		if (skip0 == 0 || reportMx[mi][3] > 0)
+		{
+			distroString * (Format(reportMx[mi][2],8,3)+Format(reportMx[mi][0],8,3)+Format(reportMx[mi][1],8,3)+Format(reportMx[mi][3],10,3)+"\n");
+		}
+	}								   
+	
+	distroString * 0;
+	return distroString;
+}
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function DefineNucleotideBiases (dummy)
+{
+	ModelTitle 				= "MG94x"+modelDesc[0];
+	modelConstraintString = "";
+
+	for (customLoopCounter2=0; customLoopCounter2<6; customLoopCounter2=customLoopCounter2+1)
+	{
+		if (rateBiasTerms[customLoopCounter2] != "1")
+		{
+			ExecuteCommands ("global " + rateBiasTerms[customLoopCounter2] + "=1;");
+		}
+	}
+
+	for (customLoopCounter2=1; customLoopCounter2<6; customLoopCounter2=customLoopCounter2+1)
+	{
+		for (customLoopCounter=0; customLoopCounter<customLoopCounter2; customLoopCounter=customLoopCounter+1)
+		{
+			if (modelDesc[customLoopCounter2]==modelDesc[customLoopCounter])
+			{
+				ModelTitle  = ModelTitle+modelDesc[customLoopCounter2];	
+				if (rateBiasTerms[customLoopCounter2] == "1")
+				{
+					modelConstraintString = modelConstraintString + rateBiasTerms[customLoopCounter]+":="+rateBiasTerms[customLoopCounter2]+";";
+				}
+				else
+				{
+					modelConstraintString = modelConstraintString + rateBiasTerms[customLoopCounter2]+":="+rateBiasTerms[customLoopCounter]+";";			
+				}
+				break;
+			}
+		}
+		if (customLoopCounter==customLoopCounter2)
+		{
+			ModelTitle = ModelTitle+modelDesc[customLoopCounter2];	
+		}
+	}	
+
+
+	if (Abs(modelConstraintString))
+	{
+		ExecuteCommands (modelConstraintString);
+	}
+	return 0;
+}
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function 		defineRateDistribution (infix)
+{
+	ExecuteCommands ("global S_"+infix+"0  = 0.5;S_"+infix+"0:>0.0000001;global NS_"+infix+"0 = 0.1;");
+
+	for (mi=1; mi<resp; mi=mi+1)
+	{
+		categDef1 * ("global S_"+infix+mi+"=0.5;S_"+infix+mi+":>0.0000001;\nglobal NS_"+infix+mi+";\n");
+		if (randomizeInitValues)
+		{
+			categDef1*("global P_"+infix+mi+" = Random(0.05,0.95);\nP_"+infix+mi+":<1;\n");	
+			categDef1*("global S_"+infix+mi+" = Random(0.05,1);");	
+		}
+		else
+		{
+			categDef1*("global P_"+infix+mi+" = 1/"+(resp+1-mi)+";\nP_"+infix+mi+":<1;\n");
+		}
+	}
+
+	freqStrMx    = {resp,1};
+	if (resp>1)
+	{
+		freqStrMx[0] = "P_"+infix+"1";
+
+		for (mi=1; mi<resp-1; mi=mi+1)
+		{
+			freqStrMx[mi] = "";
+			for (mi2=1;mi2<=mi;mi2=mi2+1)
+			{
+				freqStrMx[mi] = freqStrMx[mi]+"(1-P_"+infix+mi2+")";		
+			}
+			freqStrMx[mi] = freqStrMx[mi]+"P_"+infix+(mi+1);	
+		}	
+		freqStrMx[mi] = "";
+
+		for (mi2=1;mi2<mi;mi2=mi2+1)
+		{
+			freqStrMx[mi] = freqStrMx[mi]+"(1-P_"+infix+mi2+")";		
+		}
+		freqStrMx[mi] = freqStrMx[mi]+"(1-P_"+infix+mi+")";	
+	}
+	else
+	{
+		freqStrMx[0] = "1";
+	}
+
+	categDef1*( "\n\nglobal c_"+infix+"scale:=S_"+infix+"0*" + freqStrMx[0]);
+
+	for (mi=1; mi<resp; mi=mi+1)
+	{
+		categDef1*( "+S_"+infix+mi+"*" + freqStrMx[mi]);
+	}
+
+	categDef1 * ";";
+
+	for (mi=0; mi<resp; mi=mi+1)
+	{
+		categDef1 * ("\nglobal R_"+infix+mi+"=1;NS_"+infix+mi+":=R_"+infix+mi+"*S_"+infix+mi+";\n");
+	}
+
+	if (stratDNDS)
+	{
+		for (mi=respP; mi<respN+respP; mi=mi+1)
+		{
+			categDef1 * ("\nR_"+infix+mi+":=1;");
+		}
+
+		if (randomizeInitValues)
+		{
+			for (mi=respP+respN; mi<resp; mi=mi+1)
+			{
+				categDef1 * ("\nR_"+infix+mi+":<1;R_"+infix+mi+"="+Random(0.05,0.95)+";");
+			}
+
+			for (mi=0; mi<respP; mi=mi+1)
+			{
+				categDef1 * ("\nR_"+infix+mi+":>1;R_"+infix+mi+"="+Random(1.05,10)+";");
+			}
+		}
+		else
+		{
+			for (mi=respN+respP; mi<resp; mi=mi+1)
+			{
+				categDef1 * ("\nR_"+infix+mi+":<1;R_"+infix+mi+"=1/"+(2+mi-respN-respP)+";");
+			}
+
+			for (mi=0; mi<respP; mi=mi+1)
+			{
+				categDef1 * ("\nR_"+infix+mi+":>1;R_"+infix+mi+"=2+"+mi+";");
+			}
+		}
+	}
+	else
+	{
+		if (randomizeInitValues)
+		{
+			for (mi=0; mi<resp; mi=mi+1)
+			{
+				categDef1 * ("\nR_"+infix+mi+"="+Random(0.05,1.75)+";");
+			}
+		}
+		else
+		{
+			for (mi=0; mi<resp; mi=mi+1)
+			{
+				categDef1 * ("\nR_"+infix+mi+"="+(0.1+0.3*mi)+";");
+			}	
+		}
+
+	}
+
+	categDef1 * 0;
+	return 0;
+}
+/*---------------------------------------------------------------------------------------------------------------------------------------------------*/
+
+ChoiceList (branchLengths,"Branch Lengths",1,SKIP_NONE,
+			"Codon Model","Jointly optimize rate parameters and branch lengths (slow and thorough)",
+			"Nucleotide Model","Estimate branch lengths once, using an appropriate nucleotide model (quick and dirty)."
+		    );
+
+if (branchLengths<0)
+{
+	return;
+}
+
+fileCount	= 2;
+#include "TemplateModels/chooseGeneticCode.def";
+
+ExecuteAFile 		    ("2RatesAnalyses/MG94xREVxBivariate.mdl");
+fprintf 				(stdout, "\nReading input file 1/2\n");
+SetDialogPrompt 		("Please specify codon data #1:");
+DataSet					ds_1 			= ReadDataFile (PROMPT_FOR_FILE);
+fprintf					(stdout, "\nData file 1: ", LAST_FILE_PATH, "\n\t", ds_1.species, " sequences and ", ds_1.sites, " nucleotides\n");
+DataSetFilter 			filteredData_1 	= CreateFilter (ds_1,3,"","",GeneticCodeExclusions);
+
+done = 0;
+while (!done)
+{
+	fprintf (stdout,"\nPlease enter a 6 character model designation (e.g:010010 defines HKY85):");
+	fscanf  (stdin,"String", modelDesc);
+	if (Abs(modelDesc)==6)
+	{	
+		done = 1;
+	}
+}		
+ModelTitle 				= "MG94x"+modelDesc[0];
+rateBiasTerms	 		= {{"AC","1","AT","CG","CT","GT"}};
+DefineNucleotideBiases  (0);
+fprintf					(stdout, "Using model ", ModelTitle);
+#include				"queryTree.bf";
+
+
+fprintf 				(stdout, "\nReading input file 2/2\n");
+SetDialogPrompt 		("Please specify codon data #2:");
+DataSet					ds_2 			= ReadDataFile (PROMPT_FOR_FILE);
+fprintf					(stdout, "\nData file 2: ", LAST_FILE_PATH, "\n\t", ds_2.species, " sequences and ", ds_2.sites, " nucleotides\n");
+DataSetFilter 			filteredData_2 	= CreateFilter (ds_2,3,"","",GeneticCodeExclusions);
+
+DataSet					jointDS 	= Concatenate (ds_1,ds_2);
+DataSetFilter			jointDSF	= CreateFilter (jointDS, 3, "", "", GeneticCodeExclusions);
+
+HarvestFrequencies		(observedFreq,jointDSF,3,1,1);
+HarvestFrequencies		(observedFreqSingle,jointDSF,1,1,1);
+
+						  
+totalCodonCount			= filteredData_1.sites + filteredData_2.sites;
+
+ChoiceList (randomizeInitValues, "Initial Value Options",1,SKIP_NONE,
+			"Default",	 "Use default inital values for rate distribution parameters.",
+			"Randomized",	 "Select initial values for rate distribution parameters at random.");
+
+
+if (randomizeInitValues < 0)
+{
+	return;
+}
+
+stratDNDS = 1;
+resp  	  = 4;
+respM 	  = 2;
+respN 	  = 1;
+respP 	  = 1;
+
+fprintf (stdout, "\nUsing\n\t", respM, " negatively selected classes\n\t", respN, " neutrally evolving classes\n\t", 
+					respP, " positively selected classes\n\n");
+
+categDef1 = "";
+categDef1 * 1024;
+
+lfDef	  = {};
+
+for (fileID = 0; fileID < fileCount; fileID = fileID + 1)
+{
+	lfDef[fileID] = "";
+	lfDef[fileID] * 1024;
+	lfDef[fileID] * "Log(";
+}
+
+defineRateDistribution ("1_");
+categDef_1  = categDef1;
+freqStrMx_1 = freqStrMx;
+
+for (mi=0; mi<resp; mi=mi+1)
+{
+	fileID = 0;
+	if (mi)
+	{
+		lfDef[fileID] * "+";
+	}
+	lfDef[fileID]*(freqStrMx_1[mi]+"*SITE_LIKELIHOOD["+(fileID*resp+mi)+"]");		
+}
+
+defineRateDistribution ("2_");
+categDef_2  = categDef1;
+freqStrMx_2 = freqStrMx;
+
+for (mi=0; mi<resp; mi=mi+1)
+{
+	fileID = 1;
+	if (mi)
+	{
+		lfDef[fileID] * "+";
+	}
+	lfDef[fileID]*(freqStrMx_2[mi]+"*SITE_LIKELIHOOD["+(fileID*resp+mi)+"]");		
+}
+
+lfDef1 = "";
+lfDef1 * 128;
+lfDef1 * "\"";
+
+for (fileID = 0; fileID < fileCount; fileID = fileID + 1)
+{
+	lfDef[fileID] * ")";
+	lfDef[fileID] * 0;
+	lfDef1 * lfDef[fileID];
+	if (fileID < fileCount - 1)
+	{
+		lfDef1 * "+";
+	}
+}
+
+lfDef1 	  * "\"";
+lfDef1	  * 0;
+
+ExecuteCommands (categDef_1);
+ExecuteCommands (categDef_2);
+
+ModelMatrixDimension = 64;
+for (h = 0 ;h<64; h=h+1)
+{
+	if (_Genetic_Code[h]==10)
+	{
+		ModelMatrixDimension = ModelMatrixDimension-1;
+	}
+}
+
+SetDialogPrompt ("Save resulting fits to:");
+fprintf 		(PROMPT_FOR_FILE, CLEAR_FILE);
+resToPath 		= LAST_FILE_PATH;
+
+vectorOfFrequencies = BuildCodonFrequencies (observedFreq);
+
+fprintf			(stdout, "Fitting a nucleotide model to approximate branch lengths and get starting nucleotide bias estimates...\n");
+
+nucModelMatrix 			= {{*,AC*t,t,AT*t}{AC*t,*,CG*t,CT*t}{t,CG*t,*,GT*t}{AT*t,CT*t,GT*t,*}};
+Model nucModel 			= (nucModelMatrix,observedFreqSingle);
+DataSetFilter 	nucFilter   = CreateFilter (jointDSF,1);
+Tree  			nucTree 	= treeString;
+
+
+LikelihoodFunction nuc_lf = (nucFilter, nucTree);
+Optimize (nuc_res, nuc_lf);
+
+global 	 codonFactor = 0.33;
+
+lfParts	= "";
+lfParts * 128;
+lfParts * "LikelihoodFunction lf = (filteredData_1,tree_1_0";
+
+bnames = BranchName(nucTree,-1);
+
+for (fileID = 1; fileID <= fileCount; fileID = fileID + 1)
+{
+	rateMultipliers 	= {{""   ,"AC*",""   ,"AT*"}
+						   {"AC*",""   ,"CG*","CT*"}
+						   {""   ,"CG*",""   ,"GT*"}
+						   {"AT*","CT*","GT*","" }
+						  };
+
+	for (part = 0; part < resp; part = part + 1)
+	{
+		ExecuteCommands ("PopulateModelMatrix(\"rate_matrix_"+fileID+"_"+part+"\",observedFreq,\"S_"+fileID+"_"+part+"/c_"+fileID+"_scale\",\"NS_"+fileID+"_"+part+"/c_"+fileID+"_scale\");");
+		ExecuteCommands ("Model MG94model_"+fileID+"_"+part+"= (rate_matrix_"+fileID+"_"+part+",vectorOfFrequencies,0);");
+		
+		treeID = "tree_"+fileID+"_"+part;
+		ExecuteCommands ("Tree "+treeID+"=treeString;");
+		if (branchLengths)
+		{
+			ExecuteCommands ("ReplicateConstraint (\"this1.?.synRate:=this2.?.t__/codonFactor\","+treeID+",nucTree);");
+		}
+		else
+		{
+			if (part == 0)
+			{	
+				nlfDef = "";
+				nlfDef * 128;
+				for (lc = 0; lc < Columns (bnames); lc=lc+1)
+				{
+					nlfDef * (treeID + "." + bnames[lc] + ".synRate = nucTree." + bnames[lc] + ".t/codonFactor;");
+				}
+				nlfDef * 0;
+				ExecuteCommands (nlfDef);
+			}
+			else
+			{
+				ExecuteCommands ("ReplicateConstraint (\"this1.?.synRate:=this2.?.synRate\","+treeID+",tree_1_0);");
+			}
+		}
+		if (part || fileID > 1)
+		{
+			lfParts = lfParts + ",filteredData_" + fileID + "," + treeID;
+		}
+	}
+}
+
+lfParts * 0;
+ExecuteCommands (lfParts + "," + lfDef1 + ");");
+
+sumPath = resToPath + ".summary";
+
+treeBranchParameters = 0;
+for (fileID = 1; fileID <= fileCount; fileID = fileID + 1)
+{
+	ExecuteCommands ("treeBranchParameters = treeBranchParameters + BranchCount(tree_" + fileID + "_0) + TipCount(tree_" + fileID + "_0);");
+}	
+
+/*-------------- INDEPENDENT DISTRIBUTIONS  ------------------*/
+
+sop = Max(OPTIMIZATION_PRECISION,0.001);
+
+fprintf (stdout, "Running simpler distribution approximations to ensure good convergence...\n");
+
+OPTIMIZATION_PRECISION = 0.1;
+
+P_1_1 := 0;P_1_2 := 0;P_1_3 := 0;
+P_2_1 := 0;P_2_2 := 0;P_2_3 := 0;
+
+S_1_0 := 1;S_1_1 := 1;S_1_2 := 1;S_1_3 := 1;
+S_2_0 := 1;S_2_1 := 1;S_2_2 := 1;S_2_3 := 1;
+R_1_0 := 1;R_1_1 := 1;R_1_2 := 1;
+R_2_0 := 1;R_2_1 := 1;R_2_2 := 1;
+
+Optimize (res,lf);
+USE_LAST_RESULTS 		= 1;
+SKIP_CONJUGATE_GRADIENT = 1;
+
+d1 = ReportDistributionString(4,freqStrMx_1,"1_",1);
+d2 = ReportDistributionString(4,freqStrMx_2,"2_",1);
+
+fprintf (stdout,  "\n*** Done with pass 1. Log(L) = ", Format(res[1][0],10,3), " *** \n");
+fprintf (stdout,  "Approximate rates for data set 1:\n", d1);
+fprintf (stdout,  "Approximate rates for data set 2:\n", d2);
+
+codonFactor := codonFactor__;
+
+AC  := AC__; AT  := AT__; CG  := CG__; CT  := CT__; GT  := GT__;
+
+
+
+fprintf (stdout, "\nGateaux sampling positively selected directions\n");
+
+P_1_1 = 2/filteredData_1.sites;
+S_1_3 = 1;
+
+baseLineLL  = res[1][0];
+LFCompute 	(lf,LF_START_COMPUTE);
+bestDiff 	= -1e100;
+bestAlpha 	= 1;
+bestBeta  	= 1;
+bestLL		= -1e100;
+
+step  		= 0.1;
+step2 		= 0.25;
+v1 			= 0.05;
+
+for (v1c = 0; v1c < 10; v1c = v1c + 1)
+{
+	v2 = v1+step; 
+	for (v2c = 0; v2c < 20; v2c = v2c+1)
+	{
+		checkASample ("1_0");	
+		v2 = v2 + step2;
+	}
+	v1 = v1+step;
+} 
+
+S_1_0 = bestAlpha;
+R_1_0 = bestBeta;
+bestAlpha 	= 1;
+bestBeta  	= 1;
+
+if (bestDiff <= 0)
+{
+	P_1_1 = 0;
+}
+saveBD = bestDiff;
+
+P_2_1 = 1/filteredData_2.sites;
+S_2_3 = 1;
+
+v1 			= 0.05;
+for (v1c = 0; v1c < 10; v1c = v1c + 1)
+{
+	v2 = v1+step; 
+	for (v2c = 0; v2c < 20; v2c = v2c+1)
+	{
+		checkASample ("2_0");	
+		v2 = v2 + step2;
+	}
+	v1 = v1+step;
+} 
+
+LFCompute (lf,LF_DONE_COMPUTE);
+
+S_2_0 = bestAlpha;
+R_2_0 = bestBeta;
+
+if (bestDiff <= saveBD)
+{
+	P_2_1 = 0;
+}
+
+if (bestDiff > 0)
+{
+	fprintf (stdout, "\nFound a likelihood improvement in the direction (", S_1_0, ",", S_1_0*R_1_0, "), (", S_2_0, ",", S_2_0*R_2_0, "), ",bestDiff," likelihood points\n");
+}
+
+
+Optimize (res,lf);
+
+d1 = ReportDistributionString(4,freqStrMx_1,"1_",1);
+d2 = ReportDistributionString(4,freqStrMx_2,"2_",1);
+
+fprintf (stdout,  "\n*** Done with pass 2. Log(L) = ", Format(res[1][0],10,3), " *** \n");
+fprintf (stdout,  "Approximate rates for data set 1:\n", d1);
+fprintf (stdout,  "Approximate rates for data set 2:\n", d2);
+
+
+fprintf (stdout, "\nGateaux sampling neutral directions\n");
+
+baseLineLL  = res[1][0];
+LFCompute 	(lf,LF_START_COMPUTE);
+
+P_1_2 = 1/(filteredData_1.sites*(1-P_1_1));
+bestDiff 	= -1e100;
+bestAlpha 	= 1;
+step = 0.02;
+v1 = 0;
+for (v1c = 0; v1c < 50; v1c = v1c + 1)
+{
+	v1 = v1 + step;
+	v2 = v1;
+	
+	checkASample ("1_1");
+}	
+
+
+S_1_1 = bestAlpha;
+bestAlpha 	= 1;
+
+if (bestDiff <= 0)
+{
+	P_1_2 = 0;
+}
+saveBD = bestDiff;
+R_1_1 := 1;
+
+P_2_2 = 1/(filteredData_2.sites*(1-P_2_1));
+
+v1 = 0;
+for (v1c = 0; v1c < 50; v1c = v1c + 1)
+{
+	v1 = v1 + step;
+	v2 = v1;
+	
+	checkASample ("2_1");
+}	
+
+
+LFCompute (lf,LF_DONE_COMPUTE);
+
+S_2_1 = bestAlpha;
+R_2_1 := 1;
+
+if (bestDiff <= saveBD)
+{
+	P_2_2 = 0;
+}
+
+if (bestDiff > 0)
+{
+	fprintf (stdout, "\nFound a likelihood improvement in the direction (", S_1_1, ",", S_1_1, "), (", S_2_1, ",", S_2_1, "), ",bestDiff," likelihood points\n");
+}
+
+Optimize (res,lf);
+d1 = ReportDistributionString(4,freqStrMx_1,"1_",1);
+d2 = ReportDistributionString(4,freqStrMx_2,"2_",1);
+
+fprintf (stdout,  "\n*** Done with pass 3. Log(L) = ", Format(res[1][0],10,3), " *** \n");
+fprintf (stdout,  "Approximate rates for data set 1:\n", d1);
+fprintf (stdout,  "Approximate rates for data set 2:\n", d2);
+
+fprintf (stdout, "\nGateaux sampling negative selected directions\n");
+
+
+baseLineLL  = res[1][0];
+LFCompute 	(lf,LF_START_COMPUTE);
+bestDiff 	= -1e100;
+bestAlpha 	= 1;
+bestBeta  	= 1;
+
+
+step = 1/16;
+v1 = 0;
+P_1_3 = 2/(filteredData_1.sites*(1-P_1_1)*(1-P_1_2));
+S_1_2 = 1;
+for (v1c = 0; v1c < 15; v1c = v1c + 1)
+{
+	v1 = v1+step;
+	v2 = step/2; 
+	for (v2c = 0; v2c < v1c; v2c = v2c+1)
+	{
+		checkASample ("1_2");	
+		v2 = v2 + step;
+	}
+} 
+
+
+S_1_2 = bestAlpha;
+R_1_2 = bestBeta;
+bestAlpha 	= 1;
+bestBeta  	= 1;
+
+if (bestDiff <= 0)
+{
+	P_1_3 = 0;
+}
+saveBD = bestDiff;
+
+
+v1 = 0;
+P_2_3 = 2/(filteredData_2.sites*(1-P_2_1)*(1-P_2_2));
+S_2_2 = 1;
+for (v1c = 0; v1c < 15; v1c = v1c + 1)
+{
+	v1 = v1+step;
+	v2 = step/2; 
+	for (v2c = 0; v2c < v1c; v2c = v2c+1)
+	{
+		checkASample ("2_2");	
+		v2 = v2 + step;
+	}
+} 
+
+LFCompute (lf,LF_DONE_COMPUTE);
+
+S_2_2 = bestAlpha;
+R_2_2 = bestBeta;
+
+if (bestDiff <= saveBD)
+{
+	P_2_2 = 0;
+}
+
+if (bestDiff > 0)
+{
+	fprintf (stdout, "\nFound a likelihood improvement in the direction (", S_1_2, ",", S_1_2*R_1_2, "), (", S_2_2, ",", S_2_2*R_2_2, "), ",bestDiff," likelihood points\n");
+}
+
+AC  = AC; AT = AT; CG  = CG; CT  = CT; GT  = GT;
+
+if (Abs(modelConstraintString))
+{
+	ExecuteCommands (modelConstraintString);
+}
+
+
+codonFactor = codonFactor;
+
+
+GetString (paramList, lf, -1);
+degF = Columns(paramList["Global Independent"]) + 14 - 2*branchLengths + treeBranchParameters; 
+
+OPTIMIZATION_PRECISION = sop;
+fprintf (stdout, "Running an independent distributions model fit (", degF, " parameters)...\n");
+Optimize (res,lf);
+LogL = res[1][0];
+
+AIC	 = 2*(degF-LogL);
+AICc = 2*(degF*totalCodonCount/(totalCodonCount-degF-1) - LogL);
+
+fprintf (stdout, "\n\nIndependent distributions model fit summary\n", 
+				 "\nLog likelihood:", Format (LogL, 15, 5),
+				 "\nParameters    :", Format (degF, 15, 0),
+				 "\nAIC           :", Format (AIC,  15, 5),
+				 "\nc-AIC         :", Format (AICc,  15, 5),"\n"
+);
+
+fprintf (sumPath,CLEAR_FILE,"Independent distributions model fit summary\n", 
+				 "\nLog likelihood:", Format (LogL, 15, 5),
+				 "\nParameters    :", Format (degF, 15, 0),
+				 "\nAIC           :", Format (AIC,  15, 5),
+				 "\nc-AIC         :", Format (AICc,  15, 5),"\n");
+				 
+d1 = ReportDistributionString(4,freqStrMx_1,"1_",0);
+d2 = ReportDistributionString(4,freqStrMx_2,"2_",0);
+
+fprintf (stdout,  "Inferred rates for data set 1:\n", d1);
+fprintf (sumPath, "Inferred rates for data set 1:\n", d1);
+fprintf (stdout,  "Inferred rates for data set 2:\n", d2);
+fprintf (sumPath, "Inferred rates for data set 2:\n", d2);
+
+LIKELIHOOD_FUNCTION_OUTPUT = 6;
+fprintf (resToPath,CLEAR_FILE,lf);
+
+
+/*-------------- SHARED POSITIVE SELECTION STRENGTHS  ------------------*/
+
+for (k=0; k<respP; k=k+1)
+{
+	ExecuteCommands ("R_1_"+k+"=0.5(R_1_"+k+"+R_2_"+k+");");
+	ExecuteCommands ("R_2_"+k+":=R_1_"+k+";");
+}
+
+GetString (paramList, lf, -1);
+degFPSS = Columns(paramList["Global Independent"]) + 14 - 2*branchLengths + treeBranchParameters; 
+	
+fprintf (stdout, "\nRunning a shared positive selection strengths model (",degFPSS," parameters)...\n");
+Optimize (res_PSS,lf);
+LogLPSS = res_PSS[1][0];
+
+AICPSS	 = 2*(degFPSS-LogLPSS);
+AICcPSS    = 2*(degFPSS*totalCodonCount/(totalCodonCount-degFPSS-1) - LogLPSS);
+
+fprintf (stdout, "\n\nShared positive selection strengths model fit summary\n", 
+				 "\nLog likelihood:", Format (LogLPSS, 15, 5),
+				 "\nParameters    :", Format (degFPSS, 15, 0),
+				 "\nAIC           :", Format (AICPSS,  15, 5),
+				 "\nc-AIC         :", Format (AICcPSS,  15, 5),"\n"
+);
+
+fprintf (sumPath, "\n\nShared positive strengths regime model fit summary\n", 
+				 "\nLog likelihood:", Format (LogLPSS, 15, 5),
+				 "\nParameters    :", Format (degFPSS, 15, 0),
+				 "\nAIC           :", Format (AICPSS,  15, 5),
+				 "\nc-AIC         :", Format (AICcPSS,  15, 5),"\n"
+);
+
+d1 = ReportDistributionString(4,freqStrMx_1,"1_",0);
+d2 = ReportDistributionString(4,freqStrMx_2,"2_",0);
+
+fprintf (stdout,  "Inferred rates for data set 1:\n", d1);
+fprintf (sumPath, "Inferred rates for data set 1:\n", d1);
+fprintf (stdout,  "Inferred rates for data set 2:\n", d2);
+fprintf (sumPath, "Inferred rates for data set 2:\n", d2);
+fpath = resToPath + ".SharedStrength";
+LIKELIHOOD_FUNCTION_OUTPUT = 6;
+fprintf (fpath,CLEAR_FILE,lf);
+
+/*-------------- SHARED POSITIVE SELECTION PROPORTIONS  ------------------*/
+
+/* RELOAD INDEPENDENT FIT */
+DeleteObject (lf);
+ExecuteAFile (resToPath);
+
+for (k=1; k<=respP; k=k+1)
+{
+	ExecuteCommands ("P_1_"+k+"=0.5(P_1_"+k+"+P_2_"+k+");");
+	ExecuteCommands ("P_2_"+k+":=P_1_"+k+";");
+}
+
+GetString (paramList, lf, -1);
+degFPSP = Columns(paramList["Global Independent"]) + 14 - 2*branchLengths + treeBranchParameters; 
+fprintf (stdout, "\nRunning a shared positive selection proportions model (",degFPSP," parameters) ...\n");
+Optimize (res_PSP,lf);
+LogLPSP = res_PSP[1][0];
+
+
+AICPSP	 = 2*(degFPSP-LogLPSP);
+AICcPSP    = 2*(degFPSP*totalCodonCount/(totalCodonCount-degFPSP-1) - LogLPSP);
+
+fprintf (stdout, "\n\nShared positive selection proportions model fit summary\n", 
+				 "\nLog likelihood:", Format (LogLPSP, 15, 5),
+				 "\nParameters    :", Format (degFPSP, 15, 0),
+				 "\nAIC           :", Format (AICPSP,  15, 5),
+				 "\nc-AIC         :", Format (AICcPSP,  15, 5),"\n"
+);
+
+fprintf (sumPath, "\n\nShared positive proportions regime model fit summary\n", 
+				 "\nLog likelihood:", Format (LogLPSP, 15, 5),
+				 "\nParameters    :", Format (degFPSP, 15, 0),
+				 "\nAIC           :", Format (AICPSP,  15, 5),
+				 "\nc-AIC         :", Format (AICcPSP,  15, 5),"\n"
+);
+
+d1 = ReportDistributionString(4,freqStrMx_1,"1_",0);
+d2 = ReportDistributionString(4,freqStrMx_2,"2_",0);
+
+fprintf (stdout,  "Inferred rates for data set 1:\n", d1);
+fprintf (sumPath,  "Inferred rates for data set 1:\n", d1);
+fprintf (stdout,  "Inferred rates for data set 2:\n", d2);
+fprintf (sumPath,  "Inferred rates for data set 2:\n", d2);
+fpath = resToPath + ".SharedProportion";
+LIKELIHOOD_FUNCTION_OUTPUT = 6;
+fprintf (fpath,CLEAR_FILE,lf);
+
+
+/*-------------- SHARED POSITIVE SELECTION REGIME  ------------------*/
+
+/* RELOAD INDEPENDENT FIT */
+DeleteObject (lf);
+ExecuteAFile (resToPath);
+
+for (k=0; k<respP; k=k+1)
+{
+	ExecuteCommands ("R_1_"+k+"=0.5(R_1_"+k+"+R_2_"+k+");");
+	ExecuteCommands ("R_2_"+k+":=R_1_"+k+";");
+}
+for (k=1; k<=respP; k=k+1)
+{
+	ExecuteCommands ("P_1_"+k+"=0.5(P_1_"+k+"+P_2_"+k+");");
+	ExecuteCommands ("P_2_"+k+":=P_1_"+k+";");
+}
+
+GetString (paramList, lf, -1);
+degFPSH = Columns(paramList["Global Independent"]) + 14 - 2*branchLengths + treeBranchParameters; 
+
+fprintf (stdout, "\nRunning a shared positive selection regime model (", degFPSH, " parameters)...\n");
+Optimize (res_PSH,lf);
+LogLPSH = res_PSH[1][0];
+
+AICPSH	 = 2*(degFPSH-LogLPSH);
+AICcPSH    = 2*(degFPSH*totalCodonCount/(totalCodonCount-degFPSH-1) - LogLPSH);
+
+fprintf (stdout, "\n\nShared positive selection regime model fit summary\n", 
+				 "\nLog likelihood:", Format (LogLPSH, 15, 5),
+				 "\nParameters    :", Format (degFPSH, 15, 0),
+				 "\nAIC           :", Format (AICPSH,  15, 5),
+				 "\nc-AIC         :", Format (AICcPSH,  15, 5),"\n"
+);
+
+fprintf (sumPath, "\n\nShared positive selection regime model fit summary\n", 
+				 "\nLog likelihood:", Format (LogLPSH, 15, 5),
+				 "\nParameters    :", Format (degFPSH, 15, 0),
+				 "\nAIC           :", Format (AICPSH,  15, 5),
+				 "\nc-AIC         :", Format (AICcPSH,  15, 5),"\n"
+);
+
+d1 = ReportDistributionString(4,freqStrMx_1,"1_",0);
+d2 = ReportDistributionString(4,freqStrMx_2,"2_",0);
+
+fprintf (stdout,  "Inferred rates for data set 1:\n", d1);
+fprintf (sumPath,  "Inferred rates for data set 1:\n", d1);
+fprintf (stdout,  "Inferred rates for data set 2:\n", d2);
+fprintf (sumPath,  "Inferred rates for data set 2:\n", d2);
+fpath = resToPath + ".SharedPositiveSelection";
+LIKELIHOOD_FUNCTION_OUTPUT = 6;
+fprintf (fpath,CLEAR_FILE,lf);
+
+/*-------------- SHARED MODEL ------------------*/
+
+DeleteObject (lf);
+ExecuteAFile (resToPath);
+
+for (k=0; k<resp; k=k+1)
+{
+	ExecuteCommands ("S_1_"+k+"=0.5(S_1_"+k+"+S_2_"+k+");");
+	if (k<respP || k>=respP+respN)
+	{
+		ExecuteCommands ("R_1_"+k+"=0.5(R_1_"+k+"+R_2_"+k+");");
+	}
+	ExecuteCommands ("S_2_"+k+":=S_1_"+k+";R_2_"+k+":=R_1_"+k+";");
+}
+for (k=1; k<=resp; k=k+1)
+{
+	ExecuteCommands ("P_1_"+k+"=0.5(P_1_"+k+"+P_2_"+k+");");
+	ExecuteCommands ("P_2_"+k+":=P_1_"+k+";");
+}
+
+GetString (paramList, lf, -1);
+degFJ = Columns(paramList["Global Independent"]) + 14 - 2*branchLengths + treeBranchParameters; 
+fprintf (stdout, "\nRunning a shared distributions model fit (", degFJ, " parameters)...\n");
+
+Optimize (res_J,lf);
+LogLJ = res_J[1][0];
+
+AICJ	 = 2*(degFJ-LogLJ);
+AICcJ    = 2*(degFJ*totalCodonCount/(totalCodonCount-degFJ-1) - LogLJ);
+
+fprintf (stdout, "\n\nShared distributions model fit summary\n", 
+				 "\nLog likelihood:", Format (LogLJ, 15, 5),
+				 "\nParameters    :", Format (degFJ, 15, 0),
+				 "\nAIC           :", Format (AICJ,  15, 5),
+				 "\nc-AIC         :", Format (AICcJ,  15, 5),"\n"
+);
+
+fprintf (sumPath, "\n\nShared distributions model fit summary\n", 
+				 "\nLog likelihood:", Format (LogLJ, 15, 5),
+				 "\nParameters    :", Format (degFJ, 15, 0),
+				 "\nAIC           :", Format (AICJ,  15, 5),
+				 "\nc-AIC         :", Format (AICcJ,  15, 5),"\n"
+);
+
+d1 = ReportDistributionString(4,freqStrMx_1,"1_",0);
+
+fprintf (stdout,  "Inferred joint rates:\n", d1);
+fprintf (sumPath, "Inferred joint rates:\n", d1);
+
+fpath = resToPath + ".JointAll";
+LIKELIHOOD_FUNCTION_OUTPUT = 6;
+fprintf (fpath,CLEAR_FILE,lf);
+
+USE_LAST_RESULTS 			= 0;
+SKIP_CONJUGATE_GRADIENT 	= 0;
+LIKELIHOOD_FUNCTION_OUTPUT	= 2;
+
+fprintf (stdout, "\nDistribution comparison tests\n",
+				 "\n\tAre the distributions different?",
+				 "\n\t\tLR = ", Format (2*(LogL-LogLJ),10,3), 
+				 	  " DF = ", degF-degFJ, 
+				 	  " p = ", Format(1-CChi2(2*(LogL-LogLJ), degF-degFJ),8,3), "\n");
+
+fprintf (stdout, "\n\tAre selective regimes (dN/dS and proportions) different?",
+				 "\n\t\tLR = ", Format (2*(LogL-LogLPSH),10,3), 
+				 	  " DF = ", degF-degFPSH, 
+				 	  " p = ", Format(1-CChi2(2*(LogL-LogLPSH), degF-degFPSH),8,3), "\n");
+
+fprintf (stdout, "\n\tAre selection strengths (dN/dS) different?",
+				 "\n\t\tLR = ", Format (2*(LogL-LogLPSS),10,3), 
+				 	  " DF = ", degF-degFPSS, 
+				 	  " p = ", Format(1-CChi2(2*(LogL-LogLPSS), degF-degFPSH),8,3), "\n");
+
+fprintf (stdout, "\n\tAre the proportions of codons under selection different?",
+				 "\n\t\tLR = ", Format (2*(LogL-LogLPSP),10,3), 
+				 	  " DF = ", degF-degFPSP, 
+				 	  " p = ", Format(1-CChi2(2*(LogL-LogLPSP), degF-degFPSP),8,3), "\n");
+
+fprintf (sumPath, "\n\nDistribution comparison tests\n",
+				 "\n\tAre the distributions different?",
+				 "\n\t\tLR = ", Format (2*(LogL-LogLJ),10,3), 
+				 	  " DF = ", degF-degFJ, 
+				 	  " p = ", Format(1-CChi2(2*(LogL-LogLJ), degF-degFJ),8,3), "\n");
+
+fprintf (sumPath, "\n\tAre selective regimes (dN/dS and proportions) different?",
+				 "\n\t\tLR = ", Format (2*(LogL-LogLPSH),10,3), 
+				 	  " DF = ", degF-degFPSH, 
+				 	  " p = ", Format(1-CChi2(2*(LogL-LogLPSH), degF-degFPSH),8,3), "\n");
+
+fprintf (sumPath, "\n\tAre selection strengths (dN/dS) different?",
+				 "\n\t\tLR = ", Format (2*(LogL-LogLPSS),10,3), 
+				 	  " DF = ", degF-degFPSS, 
+				 	  " p = ", Format(1-CChi2(2*(LogL-LogLPSS), degF-degFPSH),8,3), "\n");
+
+fprintf (sumPath, "\n\tAre the proportions of codons under selection different?",
+				 "\n\t\tLR = ", Format (2*(LogL-LogLPSP),10,3), 
+				 	  " DF = ", degF-degFPSP, 
+				 	  " p = ", Format(1-CChi2(2*(LogL-LogLPSP), degF-degFPSP),8,3), "\n");
+/*------------------------------------------------------------------------------------------------------------*/
+
+function checkASample (whichRate)
+{
+	ExecuteCommands ("S_"+whichRate+"=v1;R_"+whichRate+"=v2/v1;");
+	LFCompute (lf,res_n);
+	localDiff = res_n-baseLineLL;
+	if (localDiff > bestDiff)
+	{
+		bestDiff 	= localDiff;
+		bestAlpha 	= v1;
+		bestBeta  	= v2/v1;
+	}
+	return 0;
+}
diff --git a/res/TemplateBatchFiles/dNdSRateAnalysis.bf b/res/TemplateBatchFiles/dNdSRateAnalysis.bf
new file mode 100644
index 0000000..91a12d5
--- /dev/null
+++ b/res/TemplateBatchFiles/dNdSRateAnalysis.bf
@@ -0,0 +1,980 @@
+ModelMatrixDimension = 0;
+
+baselineOutput   = "";
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function computeExpSubWeights (dum)
+{
+	rateTypeWeights     = {6,2};
+	rateTypeWeightsGY94 = {6,2};
+		
+	hshift = 0;
+
+	for (h=0; h<64; h=h+1)
+	{
+		if (_Genetic_Code[h]==10) 
+		{
+			continue; 
+		}
+		for (h=0; h<64; h=h+1)
+		{
+			if (_Genetic_Code[h]==10) 
+			{
+				hshift = hshift+1;
+				continue; 
+			}
+			vshift = hshift;
+			for (v = h+1; v<64; v=v+1)
+			{
+				diff = v-h;
+				if (_Genetic_Code[v]==10) 
+				{
+					vshift = vshift+1;
+					continue; 
+				}
+				nucPosInCodon = 2;
+				if ((h$4==v$4)||((diff%4==0)&&(h$16==v$16))||(diff%16==0))
+				{
+					if (h$4==v$4)
+					{
+						transition = v%4;
+						transition2= h%4;
+					}
+					else
+					{
+						if(diff%16==0)
+						{
+							transition = v$16;
+							transition2= h$16;
+							nucPosInCodon = 0;
+						}
+						else
+						{
+							transition = v%16$4;
+							transition2= h%16$4;
+							nucPosInCodon = 1;
+						}
+					}
+					
+					mxIndex = 0;
+					if (transition<transition2)
+					{
+						t1 = transition;
+						t2 = transition2;
+					}
+					else
+					{
+						t1 = transition2;
+						t2 = transition;
+					}
+					
+					if (t1 == 0)
+					{
+						mxIndex = t2-1;
+					}
+					else
+					{
+						if (t1 == 1)
+						{
+							mxIndex = 1+t2;
+						}
+						else
+						{
+							mxIndex = 5;
+						}
+					}
+					
+					t1 = (_Genetic_Code[0][h]!=_Genetic_Code[0][v]);
+					rateTypeWeights[mxIndex][t1] = rateTypeWeights[mxIndex][t1]+
+												   vectorOfFrequencies[h-hshift]*observedFreq[transition][nucPosInCodon]+
+												   vectorOfFrequencies[v-vshift]*observedFreq[transition2][nucPosInCodon];
+					rateTypeWeightsGY94[mxIndex][t1] = rateTypeWeightsGY94[mxIndex][t1]+
+												   2*vectorOfFrequencies[h-hshift]*vectorOfFrequencies[v-vshift];
+				}
+		   }
+	    }		
+	}
+	return 0;		
+}
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function echoCatVar (distrInfo)
+{
+	DD = Columns(distrInfo);
+	EE = 0.0;
+	sampleVar = 0.0;
+	for (k=0; k<DD; k=k+1)
+	{
+		EE = distrInfo[0][k]*distrInfo[1][k]+EE;
+		sampleVar = sampleVar+distrInfo[0][k]*distrInfo[0][k]*distrInfo[1][k];
+	}
+		
+	sampleVar = sampleVar-EE*EE;
+	
+	fprintf  (distribOutput,"\n\n------------------------------------------------\n\nSample mean = ",EE, " (sample variance = ",sampleVar,")\n");
+	for (k=0; k<DD; k=k+1)
+	{
+		fprintf (distribOutput,"\nRate[",Format(k,0,0),"]=",Format(distrInfo[0][k],12,8), " (weight=", 
+						  Format(distrInfo[1][k],9,7),")");
+	}
+	return EE;
+}
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function echoRatio (distrInfo, distrInfo2)
+{
+	D1 = Columns(distrInfo);
+	D2 = Columns(distrInfo2);
+		
+	ratioInfo = {3,D1*D2};
+	
+	for (k=0; k<D1; k=k+1)
+	{
+		EE = k*D2;
+		for (k2 = 0; k2<D2; k2=k2+1)
+		{
+			ratioInfo [0][EE+k2] = distrInfo[0][k]/distrInfo2[0][k2];
+			ratioInfo [1][EE+k2] = distrInfo[1][k]*distrInfo2[1][k2];
+			ratioInfo [2][EE+k2] = k2*D1+k;
+		}
+	}
+	
+	done = 0;
+	EE = D1*D2;
+	while (!done)
+	{
+		done = 1;
+		for (k=1; k<EE; k=k+1)
+		{
+			if (ratioInfo [0][k] < ratioInfo[0][k-1])
+			{
+				DD = ratioInfo [0][k];
+				ratioInfo [0][k] = ratioInfo [0][k-1];
+				ratioInfo [0][k-1] = DD;
+				DD = ratioInfo [1][k];
+				ratioInfo [1][k] = ratioInfo [1][k-1];
+				ratioInfo [1][k-1] = DD;
+				DD = ratioInfo [2][k];
+				ratioInfo [2][k] = ratioInfo [2][k-1];
+				ratioInfo [2][k-1] = DD;
+				done = 0;
+			}
+		}
+	}
+	return echoCatVar (ratioInfo);
+}
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function BuildCodonFrequencies (obsF)
+{
+	PIStop = 1.0;
+	result = {ModelMatrixDimension,1};
+	hshift = 0;
+
+	for (h=0; h<64; h=h+1)
+	{
+		first = h$16;
+		second = h%16$4;
+		third = h%4;
+		if (_Genetic_Code[h]==10) 
+		{
+			hshift = hshift+1;
+			PIStop = PIStop-obsF[first][0]*obsF[second][1]*obsF[third][2];
+			continue; 
+		}
+		result[h-hshift][0]=obsF[first][0]*obsF[second][1]*obsF[third][2];
+	}
+	return result*(1.0/PIStop);
+}
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------------*/
+
+
+SetDialogPrompt ("Please specify a codon data file:");
+
+DataSet ds = ReadDataFile (PROMPT_FOR_FILE);
+dataFilePath = LAST_FILE_PATH;
+fprintf (stdout,"\n______________READ THE FOLLOWING DATA______________\n",ds);
+
+ExecuteAFile("TemplateModels/chooseGeneticCode.def");
+
+DataSetFilter filteredData = CreateFilter (ds,3,"","",GeneticCodeExclusions);
+
+HarvestFrequencies (observedFreq,	   filteredData,3,1,1);
+
+ExecuteAFile("queryTree.bf");
+
+UseModel 		  (USE_NO_MODEL);
+Tree inTree 	= treeString;
+_stringBLs      = BranchLength (inTree,-1);
+
+hasBLs = 1;
+for (k=0; k<Columns (_stringBLs); k=k+1)
+{
+	if (_stringBLs[k]<0)
+	{
+		hasBLs = 0;
+		break;
+	}
+}
+
+if (hasBLs)
+{
+	ChoiceList (branchLengths,"Branch Lengths",1,SKIP_NONE,
+				"Codon Model","Jointly optimize rate parameters and branch lengths (slow and thorough)",
+				"Nucleotide Model","Estimate branch lengths once, using an appropriate nucleotide model with a global tree scaling factor (quick and dirty).",
+				"Fixed (nucleotide)","Branch lengths (measured in expected substitutions per NUCLEOTIDE) are fixed at the values read from the tree string (quicker and dirtier).",
+				"Fixed (codon)","Branch lengths (measured in expected substitutions per CODON) are fixed at the values read from the tree string (quicker and dirtier)."
+			    );
+}
+else
+{
+	ChoiceList (branchLengths,"Branch Lengths",1,SKIP_NONE,
+				"Codon Model","Jointly optimize rate parameters and branch lengths (slow and thorough)",
+				"Nucleotide Model","Estimate branch lengths once, using an appropriate nucleotide model with a global tree scaling factor (quick and dirty).");
+
+}
+
+if (branchLengths<0)
+{
+	return;
+}
+
+modelConstraintString = "";
+
+if (branchLengths<2)
+{
+	ChoiceList (modelChoice, "Rate Matrix Options",1,SKIP_NONE,
+				"MG94",	 "Standard Muse-Gaut 94 model.",
+				"MG94xHKY85","MG94 with the transition/transverion ratio parameter kappa.",
+				"MG94xREV","MG94 with 5 additional parameters for each type of nucleotide substitution ratio. (Recommended Rate Matrix)",
+				"MG94xCustom","MG94 crossed with an arbitrary nucelotide reversible model, except F81.",
+				"GY94","Goldman-Yang 94 model (similar to MG94xHKY85)",
+				"MG94Multi","MG94 with multiple classes of non-synonymous substitutions in addition to being crossed with an arbitrary nucelotide reversible model, except F81.",
+				"MG94NMulti","MG94 with numerical bias corrections for various amino-acid substitution in addition to being crossed with an arbitrary nucelotide reversible model, except F81."
+			);
+}
+else
+{
+	if (branchLengths == 2)
+	{
+		_stringBLs = _stringBLs*3;
+	}
+	
+	ChoiceList (modelChoice, "Rate Matrix Options",1,SKIP_NONE,
+				"MG94",	 "Standard Muse-Gaut 94 model.",
+				"MG94xHKY85","MG94 with the transition/transverion ratio parameter kappa.",
+				"MG94xREV","MG94 with 5 additional parameters for each type of nucleotide substitution ratio. (Recommended Rate Matrix)",
+				"MG94xCustom","MG94 crossed with an arbitrary nucelotide reversible model, except F81.",
+				"GY94","Goldman-Yang 94 model (similar to MG94xHKY85)"
+   			   );
+}
+
+
+
+if (modelChoice<0)
+{
+	return;
+}
+
+marginalOutFile = "2RatesAnalyses/MG94xREV.mdl";
+if (modelChoice == 0)
+{
+	modelConstraintString = "AC:=1;AT:=1;CG:=1;CT:=1;GT:=1"; 
+	ModelTitle = "MG94";
+}
+else
+{
+	if (modelChoice == 1)
+	{
+		modelConstraintString = "CT:=1;AT:=AC;CG:=AC;GT:=AC"; 
+		ModelTitle = "MG94xHKY85";
+	}
+	else
+	{
+		if (modelChoice == 3 || modelChoice >= 5)
+		{
+			done = 0;
+			while (!done)
+			{
+				fprintf (stdout,"\nPlease enter a 6 character model designation (e.g:010010 defines HKY85):");
+				fscanf  (stdin,"String", modelDesc);
+				if (Abs(modelDesc)==6)
+				{	
+					done = 1;
+				}
+			}			
+			ModelTitle = "MG94x"+modelDesc[0];
+						
+			rateBiasTerms = {{"AC","1","AT","CG","CT","GT"}};
+			paramCount	  = 0;
+
+			modelConstraintString = "";
+
+			for (customLoopCounter2=1; customLoopCounter2<6; customLoopCounter2=customLoopCounter2+1)
+			{
+				for (customLoopCounter=0; customLoopCounter<customLoopCounter2; customLoopCounter=customLoopCounter+1)
+				{
+					if (modelDesc[customLoopCounter2]==modelDesc[customLoopCounter])
+					{
+						ModelTitle  = ModelTitle+modelDesc[customLoopCounter2];	
+						if (rateBiasTerms[customLoopCounter2] == "1")
+						{
+							modelConstraintString += rateBiasTerms[customLoopCounter]+":="+rateBiasTerms[customLoopCounter2]+";";
+						}
+						else
+						{
+							modelConstraintString += rateBiasTerms[customLoopCounter2]+":="+rateBiasTerms[customLoopCounter]+";";			
+						}
+						break;
+					}
+				}
+				if (customLoopCounter==customLoopCounter2)
+				{
+					ModelTitle += modelDesc[customLoopCounter2];	
+				}
+			}	
+			
+			if (modelChoice >= 5)
+			{
+				ModelTitle = "MG94xMulti";
+				if (modelChoice > 5)
+				{
+					_AA_RM_NUMERIC = 2;
+				}
+				ExecuteAFile("TemplateModels/MGwAA.ibf");
+				rateKeys = Rows (aaRateClassIDs);
+				userAARateMultipliers = {21,21};
+				if (modelChoice > 5)
+				{
+					_AA_RM_NUMERIC = 0;
+					for (h=0; h<21;h=h+1)
+					{
+						for (v=0; v<21; v=v+1)
+						{
+							userAARateMultipliers[h][v] = "R*" + aaRateMultipliers[h][v] + "*";
+							userAARateMultipliers[v][h] = "R*" + aaRateMultipliers[v][h] + "*";
+						}
+					}								
+				}
+				else
+				{
+					for (aaIndex = 0; aaIndex < Abs(aaRateClassIDs); aaIndex = aaIndex+1)
+					{
+						ExecuteCommands ("global DN_"+rateKeys[aaIndex]+" = 1;");
+					}
+					for (h=0; h<21;h=h+1)
+					{
+						for (v=0; v<21; v=v+1)
+						{
+							userAARateMultipliers[h][v] = "DN_" + aaRateMultipliers[h][v] + "*";
+							userAARateMultipliers[v][h] = "DN_" + aaRateMultipliers[v][h] + "*";
+						}
+					}								
+				}
+			}
+		}
+		else
+		{
+			if (modelChoice == 4)
+			{
+				marginalOutFile = "2RatesAnalyses/GY94.mdl";
+				ModelTitle = "GY94";
+			}
+			else
+			{
+				ModelTitle = "MG94xREV";
+			}
+		}			
+	}
+}
+
+_saveMatrixChoice = modelChoice;
+
+chosenModelList = {5,1};
+
+ChoiceList (modelChoice,"Rate Variation Options",1,SKIP_NONE,
+			"Run All","Run all available models.",
+			"Run Custom","Choose some of the available models.");
+			
+if (modelChoice<0)
+{
+	return;
+}
+
+if (modelChoice==0)
+{
+	for (mi = 0; mi<5; mi=mi+1)
+	{
+		chosenModelList[mi][0] = 1;
+	}
+}
+else
+{
+	ChoiceList (modelTypes,"Rate Variation Models",0,SKIP_NONE,
+				"Constant","Constant Rate Model: no rate variation across sites.", /* index 0 */
+				"Proportional","Proportional Variable Rates Model: dS and dN vary along the sequence, but dN = R*dS for every site",
+				"Nonsynonymous","Non-synonymous Variable Rates Model: dS = 1 for every site, while dN is drawn from a given distribution.",
+				"Dual","Dual Variable Rates Model: dS and dN are drawn from a bivariate distribution (independent or correlated components). Recommened model.",
+				"Lineage Dual","Lineage Dual Variable Rates Model:  dS and dN are drawn from a bivariate distribution (independent or correlated components), plus each lineage has an adjustment factor for the E[dN]/E[dS]."
+			    );
+			    
+	if (modelTypes[0]<0)
+	{
+		return;
+	}
+	
+	for (mi = 0; mi < Rows(modelTypes)*Columns(modelTypes); mi = mi + 1)
+	{
+		chosenModelList[modelTypes[mi]] = 1;
+	}	
+}
+
+modelNamesShort = {{"Constant","Proportional","Nonsynonymous","Dual","LineageDual"}};
+
+resp  = 1;
+resp2 = 1;
+
+ExecuteAFile ("Utility/GrabBag.bf");
+
+if (chosenModelList[3]+chosenModelList[4]+chosenModelList[1]+chosenModelList[2])
+{
+	ChoiceList (modelChoice, "Distribution Option",1,SKIP_NONE,
+				"Syn:Gamma, Non-syn:Gamma",	 "Both syn and non-syn rates are drawn from the gamma distributions for all models.",
+				"Syn:Gamma, Non-syn:Inv+Gamma","Syn and non-syn rates are drawn from the gamma distributions for Proportional and Nonsynonymous. For Dual and Local Dual, syn rates are drawn from the gamma distribution, and non-syn rates - from Inv+Gamma.",
+				"Independent Discrete", "Independent General Discrete Distributions (Recommended setting)",
+				"Correlated Discrete", "Correlated General Discrete Distributions",
+				"Non-positive Discrete", "General Discrete Distribution for dS, and dN, but constrained so that dN<=dS. Useful to perform a LRT for presence of selection in an alignment");
+				
+				
+	if (modelChoice < 0)
+	{
+		return;
+	}
+
+	ChoiceList (randomizeInitValues, "Initial Value Options",1,SKIP_NONE,
+				"Default",	 "Use default inital values for rate distribution parameters.",
+				"Randomized",	 "Select initial values for rate distribution parameters at random.");
+
+
+	if (randomizeInitValues < 0)
+	{
+		return;
+	}
+
+
+	resp = prompt_for_a_value ("Number of synonymous (and single variable rate modles) rate classes",3,2,32,1);
+
+	if (chosenModelList[3]+chosenModelList[4])
+	{
+		resp2 = prompt_for_a_value ("Number of non-synonymous rate classes",3,1,32,1);
+	}
+	else
+	{
+		resp2 = 1;
+	}
+				
+	fudgeFactor = 1.0;
+
+	if (modelChoice<2)
+	{
+		ExecuteAFile ("2RatesAnalyses/gamma1.def");
+
+		if (modelChoice == 0)
+		{
+			ExecuteAFile ("2RatesAnalyses/gamma2.def");
+		}
+		else
+		{
+			ExecuteAFile ("2RatesAnalyses/gamma2+Inv.def");
+		}
+	}
+	else
+	{
+		if (modelChoice < 4)
+		{
+			correlationOn = (modelChoice>2);
+			ExecuteAFile ("2RatesAnalyses/discreteGenerator.bf");
+		}
+		else
+		{
+			ExecuteAFile ("2RatesAnalyses/discreteGeneratorNoPS.bf");
+		}
+	}
+}
+
+ExecuteAFile (marginalOutFile);
+
+if (Abs(modelConstraintString))
+{
+	ExecuteCommands (modelConstraintString);
+}
+
+
+SetDialogPrompt ("Save summary result file to:");
+fprintf (PROMPT_FOR_FILE,CLEAR_FILE);
+baselineOutput = LAST_FILE_PATH;
+
+distribOutput = baselineOutput + ".distributions";
+fprintf (distribOutput,CLEAR_FILE);
+
+if (chosenModelList[4])
+{
+    ChoiceList (regExpForLocalFlag,"Lineage specific model filter",1,SKIP_NONE,
+				"None",         "Every branch has it's own mean dN/dS",
+				"Regex",        "Only branches whose names match a regular expression are given a separate dN/dS (all other branches share a single dN/dS)",
+                "Regex Global", "Branches whose names match a regular expression are given a separate (global) dN/dS, while all other branches share another single dN/dS");
+                
+    if (regExpForLocalFlag < 0)
+    {
+        return 0;
+    }
+    if (regExpForLocalFlag > 0)
+    {
+        fprintf (stdout, "Enter the filtering regular expression:");
+        fscanf (stdin, "String", regExpForLocal);
+    }
+    else
+    {
+        regExpForLocal = "";
+    }
+
+}
+	
+
+separator =      "+---------------------+---------------------+---------------+-------------------+-------------------+---------------+-----+-----------+\n";
+
+fprintf (stdout, "\n\nRUNNING ",ModelTitle," MODEL COMPARISONS on ",dataFilePath, "\n\n",
+				 "\n\n########### ",resp,"x",resp2," CLASSES ###########\n\n",
+				 separator,
+				 "|       Model         |   Log Likelihood    | Synonymous CV |  NS Exp and CV    |  N/S Exp and CV   |    P-Value    | Prm |    AIC    |\n",
+				 separator);
+
+fprintf (baselineOutput,  "\n\nRUNNING ",ModelTitle," MODEL COMPARISONS on ",dataFilePath, "\n\n",
+						   "\n\n########### ",resp,"x",resp2," CLASSES ###########\n\n",
+				 separator,
+				 "|       Model         |   Log Likelihood    | Synonymous CV |  NS Exp and CV    |  N/S Exp and CV   |    P-Value    | Prm |    AIC    |\n",
+				 separator);
+
+lastLikValue = 0;
+R = 1;
+
+modelNames = {{"| Constant Rates      |",
+			   "| Prop. Var. Rates    |",
+			   "| Var. N.Syn. Rates   |",
+			   "| Dual Variable Rates |",
+			   "| Dual V.R. + Lineage |"}};
+			   
+
+if (MPI_NODE_COUNT>1 && MPI_NODE_ID == 0)
+/* Check to see if we are running with more than one MPI node.
+   If not - bail to single CPU execution */			   
+{
+	MPINodeState = {MPI_NODE_COUNT-1,2};
+	
+	/* One of the nodes (0) will be the dispatcher, and
+	   for every other node, we need to store two values:
+	   whether it is busy or not (0 or 1), and 
+	   an integer (from 0 to 5) to indicate which model
+	   (M0-M5) the node is working on */
+	   
+	OPTIMIZE_SUMMATION_ORDER = 0;
+	
+	/* the master node will be creating likelihood functions, 
+	but not evaluating them - thus there is no need to perform
+	the extra step of optimizing data column ordering for faster
+	likelihood evaluations */
+}
+
+doNucFit = (branchLengths<2);
+
+
+for (mi = 0; mi<5; mi=mi+1)
+{
+	if (chosenModelList[mi])
+	{
+		theRateMatrix = 0;
+
+		MULTIPLY_BY_FREQS = PopulateModelMatrix ("theRateMatrix", observedFreq, mi);
+		vectorOfFrequencies = BuildCodonFrequencies (observedFreq);
+		
+		if (doNucFit)
+		{
+			HarvestFrequencies 					   (observedFreqSingle,filteredData,1,1,1);
+			DataSetFilter nucFilter = CreateFilter (filteredData,1);
+			ExecuteCommands (nucModelString+"\nModel nucModel = (nucModelMatrix,observedFreqSingle);");
+
+			Tree  nucTree = treeString;
+			LikelihoodFunction nuc_lf = (nucFilter,nucTree);
+			Optimize (nuc_res, nuc_lf);
+			
+			computeExpSubWeights (0);		
+			global codonFactor = 0.33;
+						
+			doNucFit = 0;
+		}
+			
+		Model MG94model = (theRateMatrix,vectorOfFrequencies,MULTIPLY_BY_FREQS);
+		Tree  givenTree = treeString;
+
+        bnames = BranchName (givenTree,-1);
+        lbc    = Columns    (bnames) - 1;
+
+		if (branchLengths == 1)
+		{
+			ClearConstraints (givenTree);
+			ReplicateConstraint ("this1.?.synRate:=this2.?.t__/codonFactor",givenTree,nucTree);
+		}
+		else
+		{
+			if (branchLengths == 0)
+			{					
+				initString = "";
+				for (lc = 0; lc < lbc; lc = lc+1)
+				{
+					initString += "givenTree." + bnames[lc] + ".synRate=nucTree." + bnames[lc] + ".t/codonFactor;";
+				}	
+				ExecuteCommands (initString);
+				initString = "";
+			}
+			else
+			{
+				computeExpSubWeights (0);
+				if (_saveMatrixChoice < 4) /* MG94 */
+				{
+					rateBiasTermsMx  = {{"AC*","","AT*","CG*","CT*","GT*"}};
+					rw = rateTypeWeights;
+				}
+				else
+				{
+					rateBiasTermsMx  = {{"kappa*","","kappa*","kappa*","","kappa*"}};	
+					rw = rateTypeWeightsGY94;			
+				}
+				s1s = rateBiasTermsMx[0]+rw[0][0];
+				s2s = rateBiasTermsMx[0]+rw[0][1];
+				for (lc = 1; lc < 6; lc = lc+1)
+				{
+					s1s = s1s + "+" + rateBiasTermsMx[lc]+rw[lc][0];
+					s2s = s2s + "+" + rateBiasTermsMx[lc]+rw[lc][1];
+				}
+				
+				if (mi < 4)
+				{
+					for (lc = 0; lc < lbc; lc = lc+1)
+					{
+						ExecuteCommands ("givenTree." + bnames[lc] + ".synRate:="+_stringBLs[lc]+"/("+s1s+"+R("+s2s+"));");
+					}	
+				}
+				else
+				{
+					for (lc = 0; lc < lbc; lc = lc+1)
+					{
+						ExecuteCommands ("givenTree." + bnames[lc] + ".synRate:="+_stringBLs[lc]+"/("+s1s+"+givenTree."+bnames[lc]+".r("+s2s+"));");
+					}				
+                }
+			}
+		}
+
+        if (Abs(regExpForLocal) > 0 && mi == 4)
+        {
+            fprintf (stdout, "\n");
+            global shared_R  = 1;
+            if (regExpForLocalFlag == 2)
+            {
+                global shared_FR = 1;
+            }
+            
+            for (lc = 0; lc < lbc; lc = lc+1)
+            {
+                if ((bnames[lc]$regExpForLocal)[0] < 0)
+                {
+                    ExecuteCommands ("givenTree." + bnames[lc] + ".r:=shared_R");
+                }
+                else
+                {
+                    if (regExpForLocalFlag == 2)
+                    {
+                        ExecuteCommands ("givenTree." + bnames[lc] + ".r:=shared_FR");
+                   }
+                    //fprintf (stdout, bnames[lc], " => local dN/dS \n");
+                }
+             }				
+        }	
+
+
+		LikelihoodFunction lf = (filteredData,givenTree);
+		
+		if (modelChoice > 3)
+		{
+			R:=1;
+		}	
+		
+		if (MPI_NODE_COUNT>1 && MPI_NODE_ID == 0)
+		{
+			/* look for an idle node */
+			for (mpiNode = 0; mpiNode < MPI_NODE_COUNT-1; mpiNode = mpiNode+1)
+			{
+				if (MPINodeState[mpiNode][0]==0)
+				{
+					break;	
+				}
+			}
+			
+			if (mpiNode==MPI_NODE_COUNT-1)
+			/* all nodes busy */
+			{
+				/* wait for some node to complete and send out current job */
+				mpiNode = ReceiveJobs (1);
+			}
+			else
+			{
+				/* send the job to an idle node; update node state */
+				MPISend (mpiNode+1,lf);
+				MPINodeState[mpiNode][0] = 1;
+				MPINodeState[mpiNode][1] = mi;
+			}
+		}
+		else
+		{
+			/* Non-MPI execution */
+			Optimize (res,lf);
+			modelIndex = mi;
+			ReceiveJobs (0);
+		}
+	}
+}
+
+if (MPI_NODE_COUNT>1 && MPI_NODE_ID == 0)
+/* wait for all the jobs to finish, process their results */
+{
+	while (1)
+	{
+		for (nodeCounter = 0; nodeCounter < MPI_NODE_COUNT-1; nodeCounter = nodeCounter+1)
+		{
+			if (MPINodeState[nodeCounter][0]==1)
+			{
+				fromNode = ReceiveJobs (0);
+				break;	
+			}
+		}
+		if (nodeCounter == MPI_NODE_COUNT-1)
+		{
+			break;
+		}
+	}	
+	OPTIMIZE_SUMMATION_ORDER = 1;
+}
+
+/* ____________________________________________________________________________________________________________________*/
+
+function ReceiveJobs (sendOrNot)
+
+/* This function receieves and processes 
+   model results. The parameter is a boolean,
+   set to 1 if there are jobs waiting to be sent to
+   an MPI node */
+{
+	if (MPI_NODE_COUNT>1 && MPI_NODE_ID == 0)
+	{
+		MPIReceive (-1, fromNode, result_String);
+		modelIndex = MPINodeState[fromNode-1][1];
+		
+		if (sendOrNot)
+		{
+			/* send the likelihood function to the node which just finished */
+			MPISend (fromNode,lf);
+			MPINodeState[fromNode-1][1] = mi;
+		}
+		else
+		{
+			/* mark the node as idle */
+			MPINodeState[fromNode-1][0] = 0;
+			MPINodeState[fromNode-1][1] = 0;
+		}
+		
+		/* reset category variables */
+		if (modelIndex)
+		{
+			ClearConstraints (c);
+		}
+		if (modelIndex>2)
+		{
+			ClearConstraints (d);
+		}
+		
+		/* build the likelihood function lf with MLE parameter values
+		   just returned from an MPI node. MLE matrix is returned 
+		   in lf_MLES. */
+		   		
+		ExecuteCommands (result_String);
+				
+		/* store the result matrix */
+		res = lf_MLES;
+	}
+	
+	
+	if (branchLengths)
+	{
+		res[1][1] = res[1][1] + TipCount (givenTree) + BranchCount (givenTree) - 1;
+	}
+
+	LIKELIHOOD_FUNCTION_OUTPUT = 6;
+
+	fprintf (stdout, modelNames[modelIndex], " ", Format (res[1][0],19,5));
+	fprintf (baselineOutput, modelNames[modelIndex], " ", Format (res[1][0],19,5));
+	
+	marginalOutFile = baselineOutput + "." + modelNamesShort[modelIndex] + ".fit";
+	
+	fprintf (marginalOutFile,CLEAR_FILE,lf);
+
+	if (modelIndex)
+	{
+		marginalOutFile = baselineOutput + "." + modelNamesShort[modelIndex] + ".marginals";
+		fprintf (marginalOutFile,CLEAR_FILE);
+	}
+	
+	fprintf (distribOutput, "\n", modelNames[modelIndex]);
+	if (modelIndex==0)
+	{
+		EE = 0;
+		sampleVar = 0;
+		fprintf (stdout, " |      N/A      | ", Format (R,8,5) , ",", Format (sampleVar,8,5), " | ", Format (R,8,5) , ",", Format (sampleVar,8,5), " | ");
+		fprintf (baselineOutput, " |      N/A      | ", Format (R,8,5) , ",", Format (sampleVar,8,5), " | ", Format (R,8,5) , ",", Format (sampleVar,8,5), " | ");
+	}
+	else
+	{
+		GetInformation(dI,c);
+		if (modelIndex==2)
+		{
+			DD = Columns (dI);
+			for (EE=0; EE<DD; EE=EE+1)
+			{
+				dI[0][EE] = R*dI[0][EE];
+			}
+			
+			NVRMLL = res[1][0];
+			NVRMPC = res[1][1];
+			
+			EE  = echoCatVar (dI);
+			fprintf (marginalOutFile, dI);
+			
+			fprintf (stdout, " |      N/A      | ", Format (EE,8,5) , ",", Format (Sqrt(sampleVar)/EE,8,5), " | ", Format (EE,8,5) , ",", Format (Sqrt(sampleVar)/EE,8,5), " | ");
+			fprintf (baselineOutput, " |      N/A      | ", Format (EE,8,5) , ",", Format (Sqrt(sampleVar)/EE,8,5), " | ", Format (EE,8,5) , ",", Format (Sqrt(sampleVar)/EE,8,5), " | ");
+		}  
+		else
+		{
+			fprintf (marginalOutFile, dI);
+			EE  = echoCatVar (dI);
+			fprintf (stdout, " | ",Format (Sqrt(sampleVar),13,8)," | ");
+			fprintf (baselineOutput, " | ",Format (Sqrt(sampleVar),13,8)," | ");
+			
+			if (modelIndex>=3)
+			{
+				GetInformation(dI2,d);
+				if (modelIndex!=5)
+				{
+					DD = Columns (dI2);
+					for (EE=0; EE<DD; EE=EE+1)
+					{
+						dI2[0][EE] = R*dI2[0][EE];
+					}
+				}
+				fprintf (marginalOutFile, dI2);
+				EEN  = echoCatVar (dI2);
+				varN = sampleVar;
+				EER  = echoRatio  (dI2,dI);
+				varR = sampleVar;
+				
+				fprintf (stdout,  Format (EEN,8,5) , ",", Format (Sqrt(varN)/EEN,8,5), " | ",Format (EER,8,5) , ",", Format (Sqrt(varR)/EER,8,5), " | ");	
+				fprintf (baselineOutput, Format (EEN,8,5) , ",", Format (Sqrt(varN)/EEN,8,5), " | ",Format (EER,8,5) , ",", Format (Sqrt(varR)/EER,8,5), " | ");	
+					
+				if (modelIndex==3)
+				{
+					DVRMLL = res[1][0];
+					DVRMPC = res[1][1];
+					/* we don't know that DVRM returned before M4, so we won't print the p-value in the MPI mode */
+					if ((chosenModelList[2])&&(MPI_NODE_COUNT<=1 || MPI_NODE_ID == 0))
+					{
+						pVal = 1-CChi2(2*(DVRMLL-NVRMLL),DVRMPC-NVRMPC);
+						fprintf (stdout, Format (pVal,13,8), " |");
+						fprintf (baselineOutput, Format (pVal,13,8), " |");
+					}
+					else
+					{
+						fprintf (stdout,"     N/A      |");
+						fprintf (baselineOutput, "     N/A      |");
+					}
+				}
+			}
+			else
+			{
+				fprintf (stdout, Format (EE*R,8,5) , ",", Format (Sqrt(sampleVar)/EE,8,5), " | ", Format (R,8,5) , ",", Format (0,8,5), " | ");
+				fprintf (baselineOutput, Format (EE*R,8,5) , ",", Format (Sqrt(sampleVar)/EE,8,5), " | ", Format (R,8,5) , ",", Format (0,8,5), " | ");
+			}
+		}
+	}
+		
+	if (modelIndex==4) /* local rates */
+	{
+		/* we don't know that DVRM returned before M4, so we won't print the p-value in the MPI mode */
+		if ((chosenModelList[3])&&(MPI_NODE_COUNT<=1 || MPI_NODE_ID == 0))
+		{
+			fprintf (stdout, Format (1-CChi2(2*(res[1][0]-DVRMLL),res[1][1]-DVRMPC),13,8), " |");
+			fprintf (baselineOutput, Format (1-CChi2(2*(res[1][0]-DVRMLL),res[1][1]-DVRMPC),13,8), " |");
+		}
+		else
+		{
+			fprintf (stdout,"     N/A      |");
+			fprintf (baselineOutput, "     N/A      |");
+		}
+	}
+	else
+	{
+		if (modelIndex < 3)
+		{
+			fprintf (stdout,"     N/A      |");
+			fprintf (baselineOutput,"     N/A      |");
+		}
+	}
+	
+	fprintf (stdout, Format (res[1][1],5,0), "|", Format (2*(res[1][1]-res[1][0]),11,2),"|");
+	fprintf (baselineOutput, Format (res[1][1],5,0), "|", Format (2*(res[1][1]-res[1][0]),11,2),"|");
+	fprintf (stdout, "\n",separator);
+	fprintf (baselineOutput, "\n",separator);
+	if (modelIndex)
+	{
+		ConstructCategoryMatrix(marginals,lf,COMPLETE);
+		
+		if (modelIndex>=3)
+		{
+			GetInformation (categVarIDs,lf);
+			if (categVarIDs[0]!="c")
+			{
+				marginalsCorrected = marginals;
+				fprintf (MESSAGE_LOG,"Adjusting marginal matrix rows.\n"); 
+				for (h=0; h<Columns(marginals); h=h+1)
+				{
+					transition = 0;
+					for (diff=0; diff<resp; diff = diff+1)
+					{
+						for (v=diff; v<Rows(marginals); v=v+resp)
+						{
+							marginalsCorrected[transition][h] = marginals[v][h];
+							transition = transition+1;
+						}
+					}
+				}
+				marginals = marginalsCorrected;
+			}
+		}
+
+		fprintf (marginalOutFile,marginals);
+	}
+	lastLikValue = res[1][0];	
+	
+	return fromNode-1;
+}
diff --git a/res/TemplateBatchFiles/dNdSRateAnalysis_MF.bf b/res/TemplateBatchFiles/dNdSRateAnalysis_MF.bf
new file mode 100644
index 0000000..a6ca9f5
--- /dev/null
+++ b/res/TemplateBatchFiles/dNdSRateAnalysis_MF.bf
@@ -0,0 +1,835 @@
+ModelMatrixDimension = 0;
+
+baselineOutput   = "";
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function computeExpSubWeights (dum)
+{
+	rateTypeWeights     = {6,2};
+	rateTypeWeightsGY94 = {6,2};
+		
+	hshift = 0;
+
+	for (h=0; h<64; h=h+1)
+	{
+		if (_Genetic_Code[h]==10) 
+		{
+			continue; 
+		}
+		for (h=0; h<64; h=h+1)
+		{
+			if (_Genetic_Code[h]==10) 
+			{
+				hshift = hshift+1;
+				continue; 
+			}
+			vshift = hshift;
+			for (v = h+1; v<64; v=v+1)
+			{
+				diff = v-h;
+				if (_Genetic_Code[v]==10) 
+				{
+					vshift = vshift+1;
+					continue; 
+				}
+				nucPosInCodon = 2;
+				if ((h$4==v$4)||((diff%4==0)&&(h$16==v$16))||(diff%16==0))
+				{
+					if (h$4==v$4)
+					{
+						transition = v%4;
+						transition2= h%4;
+					}
+					else
+					{
+						if(diff%16==0)
+						{
+							transition = v$16;
+							transition2= h$16;
+							nucPosInCodon = 0;
+						}
+						else
+						{
+							transition = v%16$4;
+							transition2= h%16$4;
+							nucPosInCodon = 1;
+						}
+					}
+					
+					mxIndex = 0;
+					if (transition<transition2)
+					{
+						t1 = transition;
+						t2 = transition2;
+					}
+					else
+					{
+						t1 = transition2;
+						t2 = transition;
+					}
+					
+					if (t1 == 0)
+					{
+						mxIndex = t2-1;
+					}
+					else
+					{
+						if (t1 == 1)
+						{
+							mxIndex = 1+t2;
+						}
+						else
+						{
+							mxIndex = 5;
+						}
+					}
+					
+					t1 = (_Genetic_Code[0][h]!=_Genetic_Code[0][v]);
+					rateTypeWeights[mxIndex][t1] = rateTypeWeights[mxIndex][t1]+
+												   vectorOfFrequencies[h-hshift]*observedFreq[transition][nucPosInCodon]+
+												   vectorOfFrequencies[v-vshift]*observedFreq[transition2][nucPosInCodon];
+					rateTypeWeightsGY94[mxIndex][t1] = rateTypeWeightsGY94[mxIndex][t1]+
+												   2*vectorOfFrequencies[h-hshift]*vectorOfFrequencies[v-vshift];
+				}
+		   }
+	    }		
+	}
+	return 0;		
+}
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function echoCatVar (distrInfo)
+{
+	DD = Columns(distrInfo);
+	EE = 0.0;
+	sampleVar = 0.0;
+	for (k=0; k<DD; k=k+1)
+	{
+		EE = distrInfo[0][k]*distrInfo[1][k]+EE;
+		sampleVar = sampleVar+distrInfo[0][k]*distrInfo[0][k]*distrInfo[1][k];
+	}
+		
+	sampleVar = sampleVar-EE*EE;
+	
+	fprintf  (distribOutput,"\n\n------------------------------------------------\n\nSample mean = ",EE, " (sample variance = ",sampleVar,")\n");
+	for (k=0; k<DD; k=k+1)
+	{
+		fprintf (distribOutput,"\nRate[",Format(k,0,0),"]=",Format(distrInfo[0][k],12,8), " (weight=", 
+						  Format(distrInfo[1][k],9,7),")");
+	}
+	return EE;
+}
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function echoRatio (distrInfo, distrInfo2)
+{
+	D1 = Columns(distrInfo);
+	D2 = Columns(distrInfo2);
+		
+	ratioInfo = {3,D1*D2};
+	
+	for (k=0; k<D1; k=k+1)
+	{
+		EE = k*D2;
+		for (k2 = 0; k2<D2; k2=k2+1)
+		{
+			ratioInfo [0][EE+k2] = distrInfo[0][k]/distrInfo2[0][k2];
+			ratioInfo [1][EE+k2] = distrInfo[1][k]*distrInfo2[1][k2];
+			ratioInfo [2][EE+k2] = k2*D1+k;
+		}
+	}
+	
+	done = 0;
+	EE = D1*D2;
+	while (!done)
+	{
+		done = 1;
+		for (k=1; k<EE; k=k+1)
+		{
+			if (ratioInfo [0][k] < ratioInfo[0][k-1])
+			{
+				DD = ratioInfo [0][k];
+				ratioInfo [0][k] = ratioInfo [0][k-1];
+				ratioInfo [0][k-1] = DD;
+				DD = ratioInfo [1][k];
+				ratioInfo [1][k] = ratioInfo [1][k-1];
+				ratioInfo [1][k-1] = DD;
+				DD = ratioInfo [2][k];
+				ratioInfo [2][k] = ratioInfo [2][k-1];
+				ratioInfo [2][k-1] = DD;
+				done = 0;
+			}
+		}
+	}
+	return echoCatVar (ratioInfo);
+}
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function BuildCodonFrequencies (obsF)
+{
+	PIStop = 1.0;
+	result = {ModelMatrixDimension,1};
+	hshift = 0;
+
+	for (h=0; h<64; h=h+1)
+	{
+		first = h$16;
+		second = h%16$4;
+		third = h%4;
+		if (_Genetic_Code[h]==10) 
+		{
+			hshift = hshift+1;
+			PIStop = PIStop-obsF[first][0]*obsF[second][1]*obsF[third][2];
+			continue; 
+		}
+		result[h-hshift][0]=obsF[first][0]*obsF[second][1]*obsF[third][2];
+	}
+	return result*(1.0/PIStop);
+}
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------------*/
+
+#include "TemplateModels/chooseGeneticCode.def";
+#include "_MFReader_.ibf";
+
+observedFreq = positionFrequencies;
+
+ChoiceList (branchLengths,"Branch Lengths",1,SKIP_NONE,
+			"Codon Model","Jointly optimize rate parameters and branch lengths (slow and thorough)",
+			"Nucleotide Model","Estimate branch lengths once, using an appropriate nucleotide model (quick and dirty)."
+		    );
+		    
+if (branchLengths<0)
+{
+	return 0;
+}
+
+modelConstraintString = "";
+
+ChoiceList (modelChoice, "Rate Matrix Options",1,SKIP_NONE,
+			"MG94",	 "Standard Muse-Gaut 94 model.",
+			"MG94xHKY85","MG94 with the transition/transverion ratio parameter kappa.",
+			"MG94xREV","MG94 with 5 additional parameters for each type of nucleotide substitution ratio. (Recommended Rate Matrix)",
+			"MG94xCustom","MG94 crossed with an arbitrary nucelotide reversible model, except F81.",
+			"GY94","Goldman-Yang, 94 model (similar to MG94xHKY85)",
+			"MG94Multi","MG94 with multiple classes of non-synonymous substitutions in addition to being crossed with an arbitrary nucelotide reversible model, except F81.",
+			"MG94NMulti","MG94 with numerical bias corrections for various amino-acid substitution in addition to being crossed with an arbitrary nucelotide reversible model, except F81."
+);
+
+if (modelChoice<0)
+{
+	return 0;
+}
+
+marginalOutFile = "2RatesAnalyses/MG94xREV.mdl";
+if (modelChoice == 0)
+{
+	modelConstraintString = "AC:=1;AT:=1;CG:=1;CT:=1;GT:=1"; 
+	ModelTitle = "MG94";
+}
+else
+{
+	if (modelChoice == 1)
+	{
+		modelConstraintString = "CT:=1;AT:=AC;CG:=AC;GT:=AC"; 
+		ModelTitle = "MG94xHKY85";
+	}
+	else
+	{
+		if (modelChoice == 3 || modelChoice >= 5)
+		{
+			done = 0;
+			while (!done)
+			{
+				fprintf (stdout,"\nPlease enter a 6 character model designation (e.g:010010 defines HKY85):");
+				fscanf  (stdin,"String", modelDesc);
+				if (Abs(modelDesc)==6)
+				{	
+					done = 1;
+				}
+			}			
+			ModelTitle = "MG94x"+modelDesc[0];
+						
+			rateBiasTerms = {{"AC","1","AT","CG","CT","GT"}};
+			paramCount	  = 0;
+
+			modelConstraintString = "";
+
+			for (customLoopCounter2=1; customLoopCounter2<6; customLoopCounter2=customLoopCounter2+1)
+			{
+				for (customLoopCounter=0; customLoopCounter<customLoopCounter2; customLoopCounter=customLoopCounter+1)
+				{
+					if (modelDesc[customLoopCounter2]==modelDesc[customLoopCounter])
+					{
+						ModelTitle  = ModelTitle+modelDesc[customLoopCounter2];	
+						if (rateBiasTerms[customLoopCounter2] == "1")
+						{
+							modelConstraintString = modelConstraintString + rateBiasTerms[customLoopCounter]+":="+rateBiasTerms[customLoopCounter2]+";";
+						}
+						else
+						{
+							modelConstraintString = modelConstraintString + rateBiasTerms[customLoopCounter2]+":="+rateBiasTerms[customLoopCounter]+";";			
+						}
+						break;
+					}
+				}
+				if (customLoopCounter==customLoopCounter2)
+				{
+					ModelTitle = ModelTitle+modelDesc[customLoopCounter2];	
+				}
+			}	
+			
+			if (modelChoice >= 5)
+			{
+				ModelTitle = "MG94xMulti";
+				if (modelChoice > 5)
+				{
+					_AA_RM_NUMERIC = 2;
+				}
+				#include "TemplateModels/MGwAA.ibf";
+				rateKeys = Rows (aaRateClassIDs);
+				userAARateMultipliers = {21,21};
+				if (modelChoice > 5)
+				{
+					_AA_RM_NUMERIC = 0;
+					for (h=0; h<21;h=h+1)
+					{
+						for (v=0; v<21; v=v+1)
+						{
+							userAARateMultipliers[h][v] = "R*" + aaRateMultipliers[h][v] + "*";
+							userAARateMultipliers[v][h] = "R*" + aaRateMultipliers[v][h] + "*";
+						}
+					}								
+				}
+				else
+				{
+					for (aaIndex = 0; aaIndex < Abs(aaRateClassIDs); aaIndex = aaIndex+1)
+					{
+						ExecuteCommands ("global DN_"+rateKeys[aaIndex]+" = 1;");
+					}
+					for (h=0; h<21;h=h+1)
+					{
+						for (v=0; v<21; v=v+1)
+						{
+							userAARateMultipliers[h][v] = "DN_" + aaRateMultipliers[h][v] + "*";
+							userAARateMultipliers[v][h] = "DN_" + aaRateMultipliers[v][h] + "*";
+						}
+					}								
+				}
+			}
+		}
+		else
+		{
+			if (modelChoice == 4)
+			{
+				marginalOutFile = "2RatesAnalyses/GY94.mdl";
+				ModelTitle = "GY94";
+			}
+			else
+			{
+				ModelTitle = "MG94xREV";
+			}
+		}			
+	}
+}
+
+chosenModelList = {5,1};
+
+ChoiceList (modelChoice,"Rate Variation Options",1,SKIP_NONE,
+			"Run All","Run all available models.",
+			"Run Custom","Choose some of the available models.");
+			
+if (modelChoice<0)
+{
+	return 0;
+}
+
+if (modelChoice==0)
+{
+	for (mi = 0; mi<5; mi=mi+1)
+	{
+		chosenModelList[mi][0] = 1;
+	}
+}
+else
+{
+	ChoiceList (modelTypes,"Rate Variation Models",0,SKIP_NONE,
+				"Constant","Constant Rate Model: no rate variation across sites.", /* index 0 */
+				"Proportional","Proportional Variable Rates Model: dS and dN vary along the sequence, but dN = R*dS for every site",
+				"Nonsynonymous","Non-synonymous Variable Rates Model: dS = 1 for every site, while dN is drawn from a given distribution.",
+				"Dual","Dual Variable Rates Model: dS and dN are drawn from a bivariate distribution (independent or correlated components). Recommened model.",
+				"Lineage Dual","Lineage Dual Variable Rates Model:  dS and dN are drawn from a bivariate distribution (independent or correlated components), plus each lineage has an adjustment factor for the E[dN]/E[dS]."
+			    );
+			    
+	if (modelTypes[0]<0)
+	{
+		return 0;
+	}
+	
+	for (mi = 0; mi < Rows(modelTypes)*Columns(modelTypes); mi = mi + 1)
+	{
+		modelChoice = modelTypes[mi];
+		chosenModelList[modelChoice] = 1;
+	}	
+}
+
+modelNamesShort = {{"Constant","Proportional","Nonsynonymous","Dual","LineageDual"}};
+
+
+ChoiceList (modelChoice, "Distribution Option",1,SKIP_NONE,
+			"Syn:Gamma, Non-syn:Gamma",	 "Both syn and non-syn rates are drawn from the gamma distributions for all models.",
+			"Syn:Gamma, Non-syn:Inv+Gamma","Syn and non-syn rates are drawn from the gamma distributions for Proportional and Nonsynonymous. For Dual and Local Dual, syn rates are drawn from the gamma distribution, and non-syn rates - from Inv+Gamma.",
+			"Independent Discrete", "Independent General Discrete Distributions (Recommended setting)",
+			"Correlated Discrete", "Correlated General Discrete Distributions",
+			"Non-positive Discrete", "General Discrete Distribution for dS, and dN, but constrained so that dN<=dS. Useful to perform a LRT for presence of selection in an alignment");
+			
+			
+if (modelChoice < 0)
+{
+	return 0;
+}
+
+ChoiceList (randomizeInitValues, "Initial Value Options",1,SKIP_NONE,
+			"Default",	 "Use default inital values for rate distribution parameters.",
+			"Randomized",	 "Select initial values for rate distribution parameters at random.");
+
+
+if (randomizeInitValues < 0)
+{
+	return 0;
+}
+
+resp  = 0;
+resp2 = 0;
+
+while (resp<2)
+{
+	fprintf (stdout,"Number of synonymous (and single variable rate modles) rate classes (>=2):");
+	fscanf  (stdin, "Number", resp);
+}
+
+while (resp2<2)
+{
+	fprintf (stdout,"Number of non-synonymous rate classes (>=2):");
+	fscanf  (stdin, "Number", resp2);
+}
+			
+fudgeFactor = 1.0;
+
+if (modelChoice<2)
+{
+	fscanf ("2RatesAnalyses/gamma1.def","Raw",categDef1);
+
+	if (modelChoice == 0)
+	{
+		fscanf ("2RatesAnalyses/gamma2.def","Raw",categDef2);
+	}
+	else
+	{
+		fscanf ("2RatesAnalyses/gamma2+Inv.def","Raw",categDef2);
+	}
+}
+else
+{
+	if (modelChoice < 4)
+	{
+		correlationOn = (modelChoice>2);
+		fscanf ("2RatesAnalyses/discreteGenerator.bf","Raw",mi);
+	}
+	else
+	{
+		fscanf ("2RatesAnalyses/discreteGeneratorNoPS.bf","Raw",mi);	
+	}
+	ExecuteCommands (mi);
+}
+
+ExecuteCommands ("#include \""+marginalOutFile+"\";");
+
+if (Abs(modelConstraintString))
+{
+	ExecuteCommands (modelConstraintString);
+}
+
+
+SetDialogPrompt ("Save summary result file to:");
+fprintf (PROMPT_FOR_FILE,CLEAR_FILE);
+baselineOutput = LAST_FILE_PATH;
+
+distribOutput = baselineOutput + ".distributions";
+fprintf (distribOutput,CLEAR_FILE);
+
+
+
+if (branchLengths)
+{
+	branchLengths = -branchLengths;
+}
+
+separator =      "+---------------------+---------------------+---------------+-------------------+-------------------+---------------+-----+-----------+\n";
+
+fprintf (stdout, "\n\nRUNNING ",ModelTitle," MODEL COMPARISONS on ",fileCount, " files\n\n",
+				 "\n\n########### ",resp,"x",resp2," CLASSES ###########\n\n",
+				 separator,
+				 "|       Model         |   Log Likelihood    | Synonymous CV |  NS Exp and CV    |  N/S Exp and CV   |    P-Value    | Prm |    AIC    |\n",
+				 separator);
+
+fprintf (baselineOutput,  "\n\nRUNNING ",ModelTitle," MODEL COMPARISONS on ",dataFilePath, "\n\n",
+						   "\n\n########### ",resp,"x",resp2," CLASSES ###########\n\n",
+				 separator,
+				 "|       Model         |   Log Likelihood    | Synonymous CV |  NS Exp and CV    |  N/S Exp and CV   |    P-Value    | Prm |    AIC    |\n",
+				 separator);
+
+lastLikValue = 0;
+R = 1;
+
+modelNames = {{"| Constant Rates      |",
+			   "| Prop. Var. Rates    |",
+			   "| Var. N.Syn. Rates   |",
+			   "| Dual Variable Rates |",
+			   "| Dual V.R. + Lineage |"}};
+			   
+
+
+if (MPI_NODE_COUNT>1)
+/* Check to see if we are running with more than one MPI node.
+   If not - bail to single CPU execution */			   
+{
+	MPINodeState = {MPI_NODE_COUNT-1,2};
+	
+	/* One of the nodes (0) will be the dispatcher, and
+	   for every other node, we need to store two values:
+	   whether it is busy or not (0 or 1), and 
+	   an integer (from 0 to 5) to indicate which model
+	   (M0-M5) the node is working on */
+	   
+	OPTIMIZE_SUMMATION_ORDER = 0;
+	
+	/* the master node will be creating likelihood functions, 
+	but not evaluating them - thus there is no need to perform
+	the extra step of optimizing data column ordering for faster
+	likelihood evaluations */
+}
+
+doNucFit = 1;
+
+for (mi = 0; mi<5; mi=mi+1)
+{
+	if (chosenModelList[mi])
+	{
+		theRateMatrix = 0;
+
+		MULTIPLY_BY_FREQS = PopulateModelMatrix ("theRateMatrix", observedFreq, mi);
+		vectorOfFrequencies = BuildCodonFrequencies (observedFreq);
+		
+		if (doNucFit)
+		{
+			ExecuteCommands (nucModelString+"\nModel nucModel = (nucModelMatrix,overallFrequencies);");
+
+			populateTrees   ("nucTree", fileCount);
+			ExecuteCommands (constructLF ("nuc_lf", "nucData", "nucTree", fileCount));
+			Optimize (nuc_res, nuc_lf);
+			
+			computeExpSubWeights (0);		
+			global codonFactor = 0.33;
+						
+			doNucFit = 0;
+		}
+			
+		Model MG94model = (theRateMatrix,vectorOfFrequencies,MULTIPLY_BY_FREQS);
+		populateTrees     ("givenTree", fileCount);
+
+
+		for (fileID = 1; fileID <= fileCount; fileID = fileID + 1)
+		{
+			if (branchLengths)
+			{
+				ExecuteCommands ("ClearConstraints (givenTree_" + fileID + ");");
+				ExecuteCommands ("ReplicateConstraint (\"this1.?.synRate:=this2.?.t__/codonFactor\",givenTree_" + fileID + ",nucTree_" + fileID + ");");
+			}
+			else
+			{
+				ExecuteCommands ("bnames = BranchName (givenTree_"+fileID+");");
+				for (lc = 0; lc < Columns (bnames); lc = lc+1)
+				{
+					bn = bnames[lc];
+					ExecuteCommands ("givenTree_" + fileID + "." + bn + ".synRate=nucTree_" + fileID + "." + bn + ".t/codonFactor;");
+				}
+			}
+		}
+
+		ExecuteCommands (constructLF ("lf", "filteredData", "givenTree", fileCount));
+		
+		if (modelChoice > 3)
+		{
+			R:=1;
+		}	
+		
+		if (MPI_NODE_COUNT>1)
+		{
+			/* look for an idle node */
+			for (mpiNode = 0; mpiNode < MPI_NODE_COUNT-1; mpiNode = mpiNode+1)
+			{
+				if (MPINodeState[mpiNode][0]==0)
+				{
+					break;	
+				}
+			}
+			
+			if (mpiNode==MPI_NODE_COUNT-1)
+			/* all nodes busy */
+			{
+				/* wait for some node to complete and send out current job */
+				mpiNode = ReceiveJobs (1);
+			}
+			else
+			{
+				/* send the job to an idle node; update node state */
+				MPISend (mpiNode+1,lf);
+				MPINodeState[mpiNode][0] = 1;
+				MPINodeState[mpiNode][1] = mi;
+			}
+		}
+		else
+		{
+			/* Non-MPI execution */
+			Optimize (res,lf);
+			modelIndex = mi;
+			ReceiveJobs (0);
+		}
+	}
+}
+
+if (MPI_NODE_COUNT>1)
+/* wait for all the jobs to finish, process their results */
+{
+	while (1)
+	{
+		for (nodeCounter = 0; nodeCounter < MPI_NODE_COUNT-1; nodeCounter = nodeCounter+1)
+		{
+			if (MPINodeState[nodeCounter][0]==1)
+			{
+				fromNode = ReceiveJobs (0);
+				break;	
+			}
+		}
+		if (nodeCounter == MPI_NODE_COUNT-1)
+		{
+			break;
+		}
+	}	
+	OPTIMIZE_SUMMATION_ORDER = 1;
+}
+
+/* ____________________________________________________________________________________________________________________*/
+
+function ReceiveJobs (sendOrNot)
+
+/* This function receieves and processes 
+   model results. The parameter is a boolean,
+   set to 1 if there are jobs waiting to be sent to
+   an MPI node */
+{
+	if (MPI_NODE_COUNT>1)
+	{
+		MPIReceive (-1, fromNode, result_String);
+		modelIndex = MPINodeState[fromNode-1][1];
+		
+		if (sendOrNot)
+		{
+			/* send the likelihood function to the node which just finished */
+			MPISend (fromNode,lf);
+			MPINodeState[fromNode-1][1] = mi;
+		}
+		else
+		{
+			/* mark the node as idle */
+			MPINodeState[fromNode-1][0] = 0;
+			MPINodeState[fromNode-1][1] = 0;
+		}
+		
+		/* reset category variables */
+		if (modelIndex)
+		{
+			ClearConstraints (c);
+		}
+		if (modelIndex>2)
+		{
+			ClearConstraints (d);
+		}
+		
+		/* build the likelihood function lf with MLE parameter values
+		   just returned from an MPI node. MLE matrix is returned 
+		   in lf_MLES. */
+		   		
+		ExecuteCommands (result_String);
+				
+		/* store the result matrix */
+		res = lf_MLES;
+	}
+	
+	
+	if (branchLengths)
+	{
+		res[1][1] = res[1][1] + TipCount (givenTree_1) + BranchCount (givenTree_1) - 1;
+	}
+
+	LIKELIHOOD_FUNCTION_OUTPUT = 6;
+
+	fprintf (stdout, modelNames[modelIndex], " ", Format (res[1][0],19,5));
+	fprintf (baselineOutput, modelNames[modelIndex], " ", Format (res[1][0],19,5));
+	
+	marginalOutFile = baselineOutput + "." + modelNamesShort[modelIndex] + ".fit";
+	
+	fprintf (marginalOutFile,CLEAR_FILE,lf);
+
+	if (modelIndex)
+	{
+		marginalOutFile = baselineOutput + "." + modelNamesShort[modelIndex] + ".marginals";
+		fprintf (marginalOutFile,CLEAR_FILE);
+	}
+	
+	fprintf (distribOutput, "\n", modelNames[modelIndex]);
+	if (modelIndex==0)
+	{
+		EE = 0;
+		sampleVar = 0;
+		fprintf (stdout, " |      N/A      | ", Format (R,8,5) , ",", Format (sampleVar,8,5), " | ", Format (R,8,5) , ",", Format (sampleVar,8,5), " | ");
+		fprintf (baselineOutput, " |      N/A      | ", Format (R,8,5) , ",", Format (sampleVar,8,5), " | ", Format (R,8,5) , ",", Format (sampleVar,8,5), " | ");
+	}
+	else
+	{
+		GetInformation(dI,c);
+		if (modelIndex==2)
+		{
+			DD = Columns (dI);
+			for (EE=0; EE<DD; EE=EE+1)
+			{
+				dI[0][EE] = R*dI[0][EE];
+			}
+			
+			NVRMLL = res[1][0];
+			NVRMPC = res[1][1];
+			
+			EE  = echoCatVar (dI);
+			fprintf (marginalOutFile, dI);
+			
+			fprintf (stdout, " |      N/A      | ", Format (EE,8,5) , ",", Format (Sqrt(sampleVar)/EE,8,5), " | ", Format (EE,8,5) , ",", Format (Sqrt(sampleVar)/EE,8,5), " | ");
+			fprintf (baselineOutput, " |      N/A      | ", Format (EE,8,5) , ",", Format (Sqrt(sampleVar)/EE,8,5), " | ", Format (EE,8,5) , ",", Format (Sqrt(sampleVar)/EE,8,5), " | ");
+		}  
+		else
+		{
+			fprintf (marginalOutFile, dI);
+			EE  = echoCatVar (dI);
+			fprintf (stdout, " | ",Format (Sqrt(sampleVar),13,8)," | ");
+			fprintf (baselineOutput, " | ",Format (Sqrt(sampleVar),13,8)," | ");
+			
+			if (modelIndex>=3)
+			{
+				GetInformation(dI2,d);
+				if (modelIndex!=5)
+				{
+					DD = Columns (dI2);
+					for (EE=0; EE<DD; EE=EE+1)
+					{
+						dI2[0][EE] = R*dI2[0][EE];
+					}
+				}
+				fprintf (marginalOutFile, dI2);
+				EEN  = echoCatVar (dI2);
+				varN = sampleVar;
+				EER  = echoRatio  (dI2,dI);
+				varR = sampleVar;
+				
+				fprintf (stdout,  Format (EEN,8,5) , ",", Format (Sqrt(varN)/EEN,8,5), " | ",Format (EER,8,5) , ",", Format (Sqrt(varR)/EER,8,5), " | ");	
+				fprintf (baselineOutput, Format (EEN,8,5) , ",", Format (Sqrt(varN)/EEN,8,5), " | ",Format (EER,8,5) , ",", Format (Sqrt(varR)/EER,8,5), " | ");	
+					
+				if (modelIndex==3)
+				{
+					DVRMLL = res[1][0];
+					DVRMPC = res[1][1];
+					/* we don't know that DVRM returned before M4, so we won't print the p-value in the MPI mode */
+					if ((chosenModelList[2])&&(MPI_NODE_COUNT<=1))
+					{
+						pVal = 1-CChi2(2*(DVRMLL-NVRMLL),DVRMPC-NVRMPC);
+						fprintf (stdout, Format (pVal,13,8), " |");
+						fprintf (baselineOutput, Format (pVal,13,8), " |");
+					}
+					else
+					{
+						fprintf (stdout,"     N/A      |");
+						fprintf (baselineOutput, "     N/A      |");
+					}
+				}
+			}
+			else
+			{
+				fprintf (stdout, Format (EE*R,8,5) , ",", Format (Sqrt(sampleVar)/EE,8,5), " | ", Format (R,8,5) , ",", Format (0,8,5), " | ");
+				fprintf (baselineOutput, Format (EE*R,8,5) , ",", Format (Sqrt(sampleVar)/EE,8,5), " | ", Format (R,8,5) , ",", Format (0,8,5), " | ");
+			}
+		}
+	}
+		
+	if (modelIndex==4) /* local rates */
+	{
+		/* we don't know that DVRM returned before M4, so we won't print the p-value in the MPI mode */
+		if ((chosenModelList[3])&&(MPI_NODE_COUNT<=1))
+		{
+			fprintf (stdout, Format (1-CChi2(2*(res[1][0]-DVRMLL),res[1][1]-DVRMPC),13,8), " |");
+			fprintf (baselineOutput, Format (1-CChi2(2*(res[1][0]-DVRMLL),res[1][1]-DVRMPC),13,8), " |");
+		}
+		else
+		{
+			fprintf (stdout,"     N/A      |");
+			fprintf (baselineOutput, "     N/A      |");
+		}
+	}
+	else
+	{
+		if (modelIndex < 3)
+		{
+			fprintf (stdout,"     N/A      |");
+			fprintf (baselineOutput,"     N/A      |");
+		}
+	}
+	
+	fprintf (stdout, Format (res[1][1],5,0), "|", Format (2*(res[1][1]-res[1][0]),11,2),"|");
+	fprintf (baselineOutput, Format (res[1][1],5,0), "|", Format (2*(res[1][1]-res[1][0]),11,2),"|");
+	fprintf (stdout, "\n",separator);
+	fprintf (baselineOutput, "\n",separator);
+	if (modelIndex)
+	{
+		ConstructCategoryMatrix(marginals,lf,COMPLETE);
+		
+		if (modelIndex>=3)
+		{
+			GetInformation (categVarIDs,lf);
+			if (categVarIDs[0]!="c")
+			{
+				marginalsCorrected = marginals;
+				fprintf (MESSAGE_LOG,"Adjusting marginal matrix rows.\n"); 
+				for (h=0; h<Columns(marginals); h=h+1)
+				{
+					transition = 0;
+					for (diff=0; diff<resp; diff = diff+1)
+					{
+						for (v=diff; v<Rows(marginals); v=v+resp)
+						{
+							marginalsCorrected[transition][h] = marginals[v][h];
+							transition = transition+1;
+						}
+					}
+				}
+				marginals = marginalsCorrected;
+			}
+		}
+
+		fprintf (marginalOutFile,marginals);
+	}
+	lastLikValue = res[1][0];	
+	
+	return fromNode-1;
+}
diff --git a/res/TemplateBatchFiles/dNdSResultProcessor.bf b/res/TemplateBatchFiles/dNdSResultProcessor.bf
new file mode 100644
index 0000000..12c1463
--- /dev/null
+++ b/res/TemplateBatchFiles/dNdSResultProcessor.bf
@@ -0,0 +1,1374 @@
+LoadFunctionLibrary("PS_Plotters.bf");
+
+distributionM1 		= {{0}};
+distributionM2 		= {{0}};
+distributionSynM3   = {{0}};
+distributionNSM3    = {{0}};
+distributionSynM4   = {{0}};
+distributionNSM4    = {{0}};
+distributionSynM5   = {{0}};
+distributionNSM5    = {{0}};
+marginalsM1         = {{0}};
+marginalsM2         = {{0}};
+marginalsM3         = {{0}};
+marginalsM4         = {{0}};
+marginalsM5         = {{0}};
+
+modelNamesShort = {{"Constant","Proportional","Nonsynonymous","Dual","Lineage Dual"}};
+
+
+/*___________________________________________________________________________________________________________*/
+
+function  PromptForMarginals (modelID)
+{
+	promptString = "Marginal Distribution for "+ modelNamesShort [modelID];
+	
+	SetDialogPrompt (promptString);
+	
+	if (modelID==1)
+	{
+		fscanf (PROMPT_FOR_FILE,"Matrix,Matrix",distributionM1,marginalsM1);
+	}
+	if (modelID==2)
+	{
+		fscanf (PROMPT_FOR_FILE,"Matrix,Matrix",distributionM2,marginalsM2);
+	}
+	if (modelID==3)
+	{
+		fscanf (PROMPT_FOR_FILE,"Matrix,Matrix,Matrix",distributionSynM3,distributionNSM3,marginalsM3);
+	}
+	if (modelID==4)
+	{
+		fscanf (PROMPT_FOR_FILE,"Matrix,Matrix,Matrix",distributionSynM4,distributionNSM4,marginalsM4);
+	}
+	if (modelID==5)
+	{
+		fscanf (PROMPT_FOR_FILE,"Matrix,Matrix,Matrix",distributionSynM5,distributionNSM5,marginalsM5);
+	}
+	
+	return 1;
+}
+
+/*___________________________________________________________________________________________________________*/
+
+function ComputeRateClasses (modelID, binRates)
+{
+	dummy = PromptForMarginals (modelID);
+	
+	if (modelID==1)
+	{
+		marginalMatrix = marginalsM1;
+		distribMatrix  = distributionM1;
+		divTerm		   = Columns (distributionM1);
+	}
+	if (modelID==2)
+	{
+		marginalMatrix = marginalsM2;
+		distribMatrix  = distributionM2;
+		divTerm		   = Columns (distributionM2);
+	}
+	if (modelID==3)
+	{
+		marginalMatrix = marginalsM3;
+		distribMatrixS = distributionSynM3;
+		distribMatrixN = distributionNSM3;
+		divTerm		   = Columns (distributionNSM3);
+	}
+	if (modelID==4)
+	{
+		distribMatrixS = distributionSynM4;
+		distribMatrixN = distributionNSM4;
+		marginalMatrix = marginalsM4;
+		divTerm		   = Columns (distributionNSM4);
+	}
+		
+	if ((Rows(marginalMatrix)==0)||(Columns(marginalMatrix)==0))
+	{
+		fprintf (stdout, "\n***ERROR:Invalid marginal likelihood matrix***\n");
+	}
+	else
+	{
+		if (modelID<=2)
+		{
+			rateAssignmentMatrix = {Columns(marginalMatrix),1};
+			for (counter1 = 0; counter1 < Columns (marginalMatrix); counter1=counter1+1)
+			{
+				columnMax = 0.0;
+				maxColumn = 0;
+				
+				for (counter2 = 0; counter2 < Rows (marginalMatrix); counter2 = counter2+1)
+				{
+					tempVal = marginalMatrix[counter2][counter1];
+					if (tempVal>columnMax)
+					{
+						columnMax  = tempVal;
+						maxColumn  = counter2; 
+	 				}
+				}
+				rateAssignmentMatrix[counter1][0] = maxColumn;
+			}
+			if (binRates)
+			{
+				titleMatrix = {divTerm,2};
+				for (counter2 = 0; counter2 < Rows (rateAssignmentMatrix); counter2 = counter2 + 1)
+				{
+				 	counter1 = rateAssignmentMatrix[counter2];
+				 	titleMatrix[counter1][1] = titleMatrix[counter1][1] + 1;
+				}
+				
+				for (counter1=0; counter1 < divTerm; counter1 = counter1+1)
+				{
+					titleMatrix[counter1][0] = distribMatrix[0][counter1];
+				}
+
+				rateAssignmentMatrix = titleMatrix;
+				titleMatrix	= {{"Rate Class","Rate","Sites In Class"}};
+			}
+			else
+			{
+				titleMatrix	= {{"Site Index","Rate Class"}};
+			}
+		}
+		else
+		{
+			rateAssignmentMatrix = {Columns(marginalMatrix),2};
+			for (counter1 = 0; counter1 < Columns (marginalMatrix); counter1=counter1+1)
+			{
+				columnMax = 0.0;
+				maxColumn = 0;
+				
+				for (counter2 = 0; counter2 < Rows (marginalMatrix); counter2 = counter2+1)
+				{
+					tempVal = marginalMatrix[counter2][counter1];
+					if (tempVal>columnMax)
+					{
+						columnMax  = tempVal;
+						maxColumn  = counter2; 
+	 				}
+				}
+				rateAssignmentMatrix[counter1][0] = maxColumn$divTerm;
+				rateAssignmentMatrix[counter1][1] = maxColumn%divTerm;
+			}
+			if (binRates)
+			{
+				if (Columns (distribMatrixS) >= Columns (distribMatrixN))
+				{
+					titleMatrix = {Rows(marginalMatrix)/divTerm,divTerm+2};
+					for (counter2 = 0; counter2 < Rows (rateAssignmentMatrix); counter2 = counter2 + 1)
+					{
+					 	counter1 = rateAssignmentMatrix[counter2][0];
+					 	counter3 = rateAssignmentMatrix[counter2][1];
+					 	
+					 	titleMatrix[counter1][counter3] = titleMatrix[counter1][counter3] + 1;
+					}
+					rateAssignmentMatrix = titleMatrix;
+					titleMatrix	= {1,Columns(rateAssignmentMatrix)+1};
+					titleMatrix[0] = "Syn Class";
+					for (counter1 = 1; counter1 <= Columns(distribMatrixN); counter1 = counter1+1)
+					{
+						titleMatrix[counter1] = "NS Rate = "+ distribMatrixN[0][counter1-1];
+					}
+					titleMatrix[counter1] = "Non-Syn Rates";
+					for (counter2 = 0; counter2 < Columns (distribMatrixN); counter2 = counter2+1)
+					{
+						rateAssignmentMatrix [counter2][counter1-1] = distribMatrixN[0][counter2];
+					}
+					
+					titleMatrix[counter1+1] = "Syn Rates";
+					for (counter2 = 0; counter2 < Columns (distribMatrixS); counter2 = counter2+1)
+					{
+						rateAssignmentMatrix [counter2][counter1] = distribMatrixS[0][counter2];
+					}
+				}
+				else
+				{
+					divTerm = Columns (distribMatrixS);
+					
+					titleMatrix = {Rows(marginalMatrix)/divTerm,divTerm+2};
+					for (counter2 = 0; counter2 < Rows (rateAssignmentMatrix); counter2 = counter2 + 1)
+					{
+					 	counter1 = rateAssignmentMatrix[counter2][0];
+					 	counter3 = rateAssignmentMatrix[counter2][1];
+					 	
+					 	titleMatrix[counter3][counter1] = titleMatrix[counter3][counter1] + 1;
+					}
+					
+					rateAssignmentMatrix = titleMatrix;
+					titleMatrix	= {1,Columns(rateAssignmentMatrix)+1};
+					titleMatrix[0] = "Non-Syn Class";
+					for (counter1 = 1; counter1 <= Columns(distribMatrixS); counter1 = counter1+1)
+					{
+						titleMatrix[counter1] = "Syn Rate = "+ distribMatrixS[0][counter1-1];
+					}
+					titleMatrix[counter1] = "Syn Rates";
+					for (counter2 = 0; counter2 < Columns (distribMatrixS); counter2 = counter2+1)
+					{
+						rateAssignmentMatrix [counter2][counter1-1] = distribMatrixS[0][counter2];
+					}
+					
+					titleMatrix[counter1+1] = "Non-Syn Rates";
+					for (counter2 = 0; counter2 < Columns (distribMatrixN); counter2 = counter2+1)
+					{
+						rateAssignmentMatrix [counter2][counter1] = distribMatrixN[0][counter2];
+					}				
+				}
+			}
+			else
+			{
+				titleMatrix	= {{"Site Index","Syn Rate Class","Non-syn Rate Class"}};
+			}
+		}
+		
+		if (outputChoice == 0)
+		{
+			dummy = PrintASCIITable (rateAssignmentMatrix, titleMatrix);
+		}
+		if (outputChoice == 1)
+		{
+			dummy = PrintTableToFile (rateAssignmentMatrix, titleMatrix,1);
+		}
+		if (outputChoice == 2)
+		{
+			labelMatrix = {1,Columns(titleMatrix)-1};
+			for (counter1 = 0; counter1 < Columns (labelMatrix); counter1 = counter1+1)
+			{
+				labelMatrix[0][counter1] = titleMatrix[0][counter1+1];
+			}
+			
+			if (modelID<=2)
+			{
+				if (binRates)
+				{
+					promptString = "Class Histogram for " + modelNamesShort[modelID];
+					OpenWindow (CHARTWINDOW,{{promptString}
+										   {"labelMatrix"}
+										   {"rateAssignmentMatrix"}
+										   {"Bar Chart"}
+										   {labelMatrix[0]}
+										   {labelMatrix[1]}
+										   {titleMatrix[0]}
+										   {""}
+										   {titleMatrix[1]}
+										   {"0"}},
+										   "SCREEN_WIDTH-60;SCREEN_HEIGHT-50;30;50");
+				}				
+				else
+				{
+					promptString = "Class Assignments for " + modelNamesShort[modelID];
+					OpenWindow (CHARTWINDOW,{{promptString}
+										   {"labelMatrix"}
+										   {"rateAssignmentMatrix"}
+										   {"Bar Chart"}
+										   {"Index"}
+										   {labelMatrix[0]}
+										   {titleMatrix[0]}
+										   {""}
+										   {titleMatrix[1]}
+										   {"0"}},
+										   "SCREEN_WIDTH-60;SCREEN_HEIGHT-50;30;50");
+				}
+			}
+			else
+			{
+				if (binRates)
+				{
+					promptString = "";
+					for (counter1 = 1; counter1 < Columns(rateAssignmentMatrix)-2; counter1 = counter1+1)
+					{
+						promptString = promptString+titleMatrix[counter1]+";";
+					}
+					promptString = promptString+titleMatrix[Columns(rateAssignmentMatrix)-2];
+					scaleString = ""+(Columns (rateAssignmentMatrix)-1)+";"+(Columns (rateAssignmentMatrix));
+					OpenWindow (CHARTWINDOW,{{"Class Histogram for " + modelNamesShort[modelID]}
+											   {"labelMatrix"},
+											   {"rateAssignmentMatrix"},
+											   {"3D Histogram"},
+											   {"Index"},
+											   {promptString},
+											   {"A"},
+											   {"B"},
+											   {"C"},
+											   {"3"},
+											   {""}
+											   {scaleString}},
+											   "SCREEN_WIDTH-60;SCREEN_HEIGHT-50;30;50");
+				}
+				else
+				{
+					OpenWindow (CHARTWINDOW,{{"Class Assignments for " + modelNamesShort[modelID]}
+											   {"labelMatrix"},
+											   {"rateAssignmentMatrix"},
+											   {"Contrast Bars"},
+											   {"Index"},
+											   {"Syn Rate Class;Non-syn Rate Class"},
+											   {titleMatrix[0]},
+											   {titleMatrix[2]},
+											   {titleMatrix[1]},
+											   {"0"}},
+											   "SCREEN_WIDTH-60;SCREEN_HEIGHT-50;30;50");
+				}
+			}
+			
+		}
+	}
+	return 1;
+}
+
+/*___________________________________________________________________________________________________________*/
+
+function ComputePosteriorRates (modelID)
+{
+	dummy = PromptForMarginals (modelID);
+	
+	if (modelID==1)
+	{
+		marginalMatrix = marginalsM1;
+		divTerm		   = Columns (distributionM1);
+		distribMX	   = distributionM1;
+	}
+	if (modelID==2)
+	{
+		marginalMatrix = marginalsM2;
+		divTerm		   = Columns (distributionM2);
+		distribMX	   = distributionM2;
+	}
+	if (modelID==3)
+	{
+		marginalMatrix = marginalsM3;
+		divTerm		   = Columns (distributionNSM3);
+		distribMXS	   = distributionSynM3;
+		distribMXN	   = distributionNSM3;
+	}
+	if (modelID==4)
+	{
+		marginalMatrix = marginalsM4;
+		divTerm		   = Columns (distributionNSM4);
+		distribMXS	   = distributionSynM4;
+		distribMXN	   = distributionNSM4;
+	}
+		
+	rMMX  = Rows(marginalMatrix);
+	
+	if ((rMMX==0)||(Columns(marginalMatrix)==0))
+	{
+		fprintf (stdout, "\n***ERROR:Invalid marginal likelihood matrix***\n");
+	}
+	else
+	{
+		if (modelID<=2)
+		{
+			rateAssignmentMatrix = {Columns(marginalMatrix),1};
+			for (counter1 = 0; counter1 < Columns (marginalMatrix); counter1=counter1+1)
+			{
+				columnSum = 0;				
+				for (counter2 = 0; counter2 < rMMX; counter2 = counter2+1)
+				{
+					tempVal    = marginalMatrix [counter2][counter1]*distribMX[1][counter2];
+					columnSum += tempVal;
+					marginalMatrix [counter2][counter1] = tempVal;
+				}
+				
+				tempVal   = 0;
+				
+				for (counter2 = 0; counter2 < rMMX; counter2 = counter2+1)
+				{
+					tempVal   +=  distribMX[0][counter2]*marginalMatrix [counter2][counter1]/columnSum;
+				}
+				rateAssignmentMatrix[counter1][0] = tempVal;
+			}
+			if (modelID==1)
+			{
+				titleMatrix	= {{"Site Index","E[S|i]"}};
+			}
+			else
+			{
+				titleMatrix	= {{"Site Index","E[N|i]"}};			
+			}
+		}
+		else
+		{
+			rateAssignmentMatrix = {Columns(marginalMatrix),3};
+			
+			for (counter1 = 0; counter1 < Columns (marginalMatrix); counter1+=1)
+			{
+				columnSum = 0;		
+				
+				for (counter2 = 0; counter2 < rMMX; counter2 += 1)
+				{
+					entryWeight    =  marginalMatrix [counter2][counter1] * distribMXS[1][counter2$divTerm] * distribMXN[1][counter2%divTerm];
+					columnSum      += entryWeight;
+					marginalMatrix [counter2][counter1] = entryWeight;
+				}
+				
+				dnds_post = 0;
+				for (counter2 = 0; counter2 < rMMX; counter2 += 1)
+				{
+					marginalMatrix [counter2][counter1] = marginalMatrix [counter2][counter1]/columnSum;
+					dnds_post      += distribMXN[0][counter2%divTerm] / distribMXS[0][counter2$divTerm] * marginalMatrix [counter2][counter1];
+				}
+				
+				rateAssignmentMatrix[counter1][2] = dnds_post;
+				
+				tempVal = 0;
+				
+				for (counter2 = 0; counter2 < rMMX; counter2 += divTerm)
+				{
+					columnSum = 0;
+					for (counter3 = counter2; counter3 < counter2+divTerm; counter3 += 1)
+					{
+						columnSum += marginalMatrix [counter3][counter1];
+					}
+					tempVal += columnSum * distribMXS[0][counter2$divTerm];
+				}
+				
+				rateAssignmentMatrix[counter1][0] = tempVal;
+				
+				tempVal = 0;
+				
+				for (counter2 = 0; counter2 < divTerm; counter2 += 1)
+				{
+					columnSum = 0;
+					for (counter3 = counter2; counter3 < rMMX; counter3 += divTerm)
+					{
+						columnSum +=  marginalMatrix [counter3][counter1];
+					}
+					tempVal += columnSum * distribMXN[0][counter2];
+				}
+				
+
+				rateAssignmentMatrix[counter1][1] = tempVal;
+			}
+			titleMatrix	= {{"Site Index","E[S|i]","E[N|i]","E[omega|i]"}};			
+		}
+		
+		if (outputChoice == 0)
+		{
+			PrintASCIITable (rateAssignmentMatrix, titleMatrix);
+		}
+		if (outputChoice == 1)
+		{
+			PrintTableToFile (rateAssignmentMatrix, titleMatrix,1);
+		}
+		if (outputChoice == 2)
+		{
+			labelMatrix = {1,Columns(titleMatrix)-1};
+			for (counter1 = 0; counter1 < Columns (labelMatrix); counter1 = counter1+1)
+			{
+				labelMatrix[0][counter1] = titleMatrix[0][counter1+1];
+			}
+			
+			promptString = "Expected Posterior Rates for " + modelNamesShort[modelID];
+			if (modelID<=2)
+			{
+				OpenWindow (CHARTWINDOW,{{promptString}
+										   {"labelMatrix"},
+										   {"rateAssignmentMatrix"},
+										   {"Bar Chart"},
+										   {"Index"},
+										   {labelMatrix[0]},
+										   {titleMatrix[0]},
+										   {""},
+										   {titleMatrix[1]},
+										   {"0"}},
+										   "SCREEN_WIDTH-60;SCREEN_HEIGHT-50;30;50");
+			}
+			else
+			{
+				promptString2 = labelMatrix[0]+";"+labelMatrix[1];
+				OpenWindow (CHARTWINDOW,{{promptString}
+										   {"labelMatrix"},
+										   {"rateAssignmentMatrix"},
+										   {"Contrast Bars"},
+										   {"Index"},
+										   {promptString2},
+										   {titleMatrix[0]},
+										   {titleMatrix[2]},
+										   {titleMatrix[1]},
+										   {"0"}},
+										   "SCREEN_WIDTH-60;SCREEN_HEIGHT-50;30;50");
+			}
+			
+		}
+	}
+	return 1;
+}
+
+/*___________________________________________________________________________________________________________*/
+
+function ComputePositiveSelection (modelID, sitesOnly)
+{
+	dummy = PromptForMarginals (modelID);
+	
+	if (modelID==2)
+	{
+		marginalMatrix = marginalsM2;
+		divTerm		   = Columns (distributionM2);
+		distribMX	   = distributionM2;
+	}
+	if (modelID==3)
+	{
+		marginalMatrix = marginalsM3;
+		divTerm		   = Columns (distributionNSM3);
+		distribMXS	   = distributionSynM3;
+		distribMXN	   = distributionNSM3;
+	}
+	if (modelID==4)
+	{
+		marginalMatrix = marginalsM4;
+		divTerm		   = Columns (distributionNSM4);
+		distribMXS	   = distributionSynM4;
+		distribMXN	   = distributionNSM4;
+	}
+	
+	if (sitesOnly > .5)
+	{
+		if (psChoice)
+		{
+			thresh = 0;
+			while (thresh<=1.)
+			{
+				fprintf (stdout, "Select the threshold for the Bayes factor on P{N/S>1} (>1) for a site to be marked as positively selected:");
+				fscanf  (stdin,"Number",thresh);
+			}
+			thresh = Log (thresh);
+		}
+		else
+		{
+			thresh = -1;
+			while ((thresh<0)||(thresh>1))
+			{
+				fprintf (stdout, "Select the threshold for P{N/S>1} for a site to be marked as positively selected:");
+				fscanf  (stdin,"Number",thresh);
+			}
+		}
+	}
+		
+	rMMX  = Rows(marginalMatrix);
+	
+	if ((rMMX==0)||(Columns(marginalMatrix)==0))
+	{
+		fprintf (stdout, "\n***ERROR:Invalid marginal likelihood matrix***\n");
+	}
+	else
+	{
+			
+		if (sitesOnly > .5)
+		{
+			if (psChoice==0)
+			{
+				titleMatrix	= {{"Counter","Site Index","P[NS/S>1|s]"}};
+			}			
+			else
+			{
+				titleMatrix	= {{"Counter","Site Index","Log[BF{NS/S>1|s}]"}};
+			}
+		}		
+		else
+		{
+			if (psChoice==0)
+			{
+				titleMatrix	= {{"Codon","Log[BF{NS/S>1|s}]","Log[BF{NS/S<=1|s}]"}};
+			}			
+			else
+			{
+				titleMatrix	= {{"Codon","P[NS/S>1|s]","P[NS/S<=1|s]"}};
+			}
+		}
+			
+		if (modelID==2)
+		{
+			distribMXR = distribMX;
+		}
+		else
+		{
+			D1 = Columns(distribMXN);
+			D2 = Columns(distribMXS);
+				
+			distribMXR = {2,D1*D2};
+			
+			for (k=0; k<D2; k=k+1)
+			{
+				E = k*D1;
+				for (k2 = 0; k2<D1; k2=k2+1)
+				{
+					distribMXR [0][E+k2] = distribMXN[0][k2]/distribMXS[0][k];
+					distribMXR [1][E+k2] = distribMXN[1][k2]*distribMXS[1][k];
+				}
+			}
+		}
+		
+		
+		counter3 	 = 0;
+		ratesOverOne = {Columns(distribMXR),1};
+		
+		for (counter1=0; counter1<Columns(distribMXR); counter1=counter1+1)
+		{
+			if (distribMXR [0][counter1]>1)
+			{
+				ratesOverOne[counter3][0] = counter1;
+				counter3 = counter3 + 1;
+			}
+		}
+		
+		if (counter3==0)
+		{
+			fprintf (stdout, "\nThere are no rates with N/S > 1 and thus P{N/S>1|i} = 0 for all sites \n\n");
+			return 1;
+		}
+				
+		if (psChoice)
+		{
+			priorOdds = 0;
+			for (k=0; k<Columns(distribMXR); k=k+1)
+			{
+				if (distribMXR [0][k]>=1)
+				{
+					priorOdds = priorOdds + distribMXR [1][k];
+				}
+			}
+			priorOdds = priorOdds/(1-priorOdds);
+		}
+		
+		if (sitesOnly>.5)
+		{
+			E = 0;
+			rateAssignmentMatrix = {Columns(marginalMatrix),2};
+			for (counter1 = 0; counter1 < Columns (marginalMatrix); counter1=counter1+1)
+			{
+				columnSum = 0;				
+				for (counter2 = 0; counter2 < rMMX; counter2 = counter2+1)
+				{
+					tempVal   = marginalMatrix [counter2][counter1];
+					columnSum = columnSum + tempVal*distribMXR[1][counter2];
+					marginalMatrix [counter2][counter1] = tempVal * distribMXR[1][counter2];
+				}
+				
+				tempVal   = 0;
+				
+				for (counter2 = 0; counter2 < counter3; counter2 = counter2+1)
+				{
+					indexVal  = ratesOverOne [counter2][0];
+					tempVal   = tempVal + marginalMatrix [indexVal][counter1];
+				}
+				tempVal = tempVal/columnSum;
+				
+				if (psChoice)
+				{
+					tempVal = Log(tempVal/(1-tempVal)/priorOdds);
+				}
+				
+				if (tempVal>=thresh)
+				{
+					rateAssignmentMatrix[E][0] = counter1+1;
+					rateAssignmentMatrix[E][1] = tempVal;
+					E = E+1;
+				}
+			}
+			
+			if (E==0)
+			{
+				fprintf (stdout, "\nThere are no sites with P{N/S>1|i} >= ",thresh, "\n\n");
+				return 1;
+			}
+			
+			ratesOverOne = {E,2};
+			for (counter1 = 0; counter1 < E; counter1 = counter1+1)
+			{
+				ratesOverOne[counter1][0] = rateAssignmentMatrix[counter1][0];
+				ratesOverOne[counter1][1] = rateAssignmentMatrix[counter1][1];
+			}		
+			rateAssignmentMatrix = ratesOverOne;
+			ratesOverOne = 0;
+		}		
+		else
+		{
+			rateAssignmentMatrix = {Columns(marginalMatrix),2};
+			for (counter1 = 0; counter1 < Columns (marginalMatrix); counter1=counter1+1)
+			{
+				columnSum = 0;				
+				for (counter2 = 0; counter2 < rMMX; counter2 = counter2+1)
+				{
+					tempVal   = marginalMatrix [counter2][counter1];
+					columnSum = columnSum + tempVal*distribMXR[1][counter2];
+					marginalMatrix [counter2][counter1] = tempVal * distribMXR[1][counter2];
+				}
+				
+				tempVal   = 0;
+				
+				for (counter2 = 0; counter2 < counter3; counter2 = counter2+1)
+				{
+					indexVal  = ratesOverOne [counter2][0];
+					tempVal   = tempVal + marginalMatrix [indexVal][counter1];
+				}
+				if (psChoice)
+				{
+					tempVal = tempVal/columnSum;
+                    if (tempVal == 1)
+                    {
+                        logOdds = 1e26;
+                    }
+                    else
+                    {
+                        logOdds = Log(tempVal/(1-tempVal)/priorOdds);
+                    }
+					rateAssignmentMatrix[counter1][0] = Max(logOdds,0);
+					rateAssignmentMatrix[counter1][1] = Max(-logOdds,0);
+				}
+				else
+				{
+					rateAssignmentMatrix[counter1][0] = tempVal/columnSum;
+					rateAssignmentMatrix[counter1][1] = 1-tempVal/columnSum;
+				}
+			}
+		}
+		
+		
+
+		if (outputChoice == 0)
+		{
+			dummy = PrintASCIITable (rateAssignmentMatrix, titleMatrix);
+		}
+		if (outputChoice == 1)
+		{
+			dummy = PrintTableToFile (rateAssignmentMatrix, titleMatrix,1);
+		}
+		if (outputChoice == 2)
+		{
+			labelMatrix = {1,Columns(titleMatrix)-1};
+			for (counter1 = 0; counter1 < Columns (labelMatrix); counter1 = counter1+1)
+			{
+				labelMatrix[0][counter1] = titleMatrix[0][counter1+1];
+			}
+			
+			if (sitesOnly>.5)
+			{
+				promptString = "Positively Selected Sites for " + modelNamesShort[modelID];
+				OpenWindow (CHARTWINDOW,{{promptString}
+										   {"labelMatrix"},
+										   {"rateAssignmentMatrix"},
+										   {"Bar Chart"},
+										   {labelMatrix[0]},
+										   {labelMatrix[1]},
+										   {titleMatrix[0]},
+										   {""},
+										   {titleMatrix[1]},
+										   {"0"}},
+										   "SCREEN_WIDTH-60;SCREEN_HEIGHT-50;30;50");			
+			}			
+			else
+			{
+				if (psChoice)
+				{
+					promptString = "Log of Bayes Factor for P{N/S>1} for " + modelNamesShort[modelID];				
+				}
+				else
+				{
+					promptString = "P{N/S>1|i} for " + modelNamesShort[modelID];
+				}
+				OpenWindow (CHARTWINDOW,{{promptString}
+										   {"labelMatrix"},
+										   {"rateAssignmentMatrix"},
+										   {"Contrast Bars"},
+										   {"Index"},
+										   {labelMatrix[0]+";"+labelMatrix[1]},
+										   {titleMatrix[0]},
+										   {titleMatrix[2]},
+										   {titleMatrix[1]},
+										   {"0"}},
+										   "SCREEN_WIDTH-60;SCREEN_HEIGHT-50;30;50");			
+			}
+			
+			
+		}
+	}
+	return 1;
+}
+
+
+/*___________________________________________________________________________________________________________*/
+
+function ComputePRatio (modelID)
+{
+	dummy = PromptForMarginals (modelID);
+	
+	if (modelID==3)
+	{
+		marginalMatrix = marginalsM3;
+		divTerm		   = Columns (distributionNSM3);
+		distribMXS	   = distributionSynM3;
+		distribMXN	   = distributionNSM3;
+	}
+	if (modelID==4)
+	{
+		marginalMatrix = marginalsM4;
+		divTerm		   = Columns (distributionNSM4);
+		distribMXS	   = distributionSynM4;
+		distribMXN	   = distributionNSM4;
+	}
+		
+	rMMX  = Rows(marginalMatrix);
+	
+	if ((rMMX==0)||(Columns(marginalMatrix)==0))
+	{
+		fprintf (stdout, "\n***ERROR:Invalid marginal likelihood matrix***\n");
+	}
+	else
+	{
+			
+		titleMatrix	= {{"Site Index","P[NS/S>1|i]"}};
+		
+		D1 = Columns(distribMXN);
+		D2 = Columns(distribMXS);
+			
+		distribMXR = {2,D1*D2};
+		distribMXD = {2,D1*D2};
+		
+		for (k=0; k<D2; k=k+1)
+		{
+			E = k*D1;
+			for (k2 = 0; k2<D1; k2=k2+1)
+			{
+				distribMXR [0][E+k2] = distribMXN[0][k2]/distribMXS[0][k];
+				distribMXR [1][E+k2] = distribMXN[1][k2]*distribMXS[1][k];
+				distribMXD [0][E+k2] = distribMXN[0][k2]-distribMXS[0][k];
+				distribMXD [1][E+k2] = distribMXN[1][k2]*distribMXS[1][k];
+			}
+		}
+		
+		titleMatrix	= {{"Site Index","E[dN/dS|i]","E[dN-dS|i]"}};
+
+		rateAssignmentMatrix = {Columns(marginalMatrix),2};
+		
+		for (counter1 = 0; counter1 < Columns (marginalMatrix); counter1=counter1+1)
+		{
+			columnSum  = 0;				
+
+			for (counter2 = 0; counter2 < rMMX; counter2 = counter2+1)
+			{
+				tempVal   = marginalMatrix [counter2][counter1];
+				columnSum = columnSum + tempVal*distribMXR[1][counter2];
+				marginalMatrix [counter2][counter1] = tempVal * distribMXR[1][counter2];
+			}
+			
+			tempVal    = 0;
+			tempVal2   = 0;
+			
+			for (counter2 = 0; counter2 < rMMX; counter2 = counter2+1)
+			{
+				tempVal   = tempVal  + distribMXR[0][counter2]*marginalMatrix [counter2][counter1];
+				tempVal2  = tempVal2 + distribMXD[0][counter2]*marginalMatrix [counter2][counter1];
+			}
+			
+			rateAssignmentMatrix[counter1][0] = tempVal/columnSum;
+			rateAssignmentMatrix[counter1][1] = tempVal2/columnSum;
+		}
+
+		if (outputChoice == 0)
+		{
+			dummy = PrintASCIITable (rateAssignmentMatrix, titleMatrix);
+		}
+		if (outputChoice == 1)
+		{
+			dummy = PrintTableToFile (rateAssignmentMatrix, titleMatrix,1);
+		}
+		if (outputChoice == 2)
+		{
+			labelMatrix = {1,Columns(titleMatrix)-1};
+			for (counter1 = 0; counter1 < Columns (labelMatrix); counter1 = counter1+1)
+			{
+				labelMatrix[0][counter1] = titleMatrix[0][counter1+1];
+			}
+			
+			promptString = "Posterior dN dS Ratio and Difference for " + modelNamesShort[modelID];
+			OpenWindow (CHARTWINDOW,{{promptString}
+									   {"labelMatrix"},
+									   {"rateAssignmentMatrix"},
+									   {"Bar Chart"},
+									   {"Index"},
+									   {labelMatrix[0]},
+									   {titleMatrix[0]},
+									   {""},
+									   {titleMatrix[1]},
+									   {"0"}},
+									   "SCREEN_WIDTH-60;SCREEN_HEIGHT-50;30;50");			
+			
+		}
+	}
+	return 1;
+}
+
+
+/*___________________________________________________________________________________________________________*/
+
+function ComputeCDF (modelID)
+{
+	dummy = PromptForMarginals (modelID);
+		
+	if (modelID==1)
+	{
+		divTerm		   = Columns (distributionM1);
+		distribMX	   = distributionM1;
+	}
+	if (modelID==2)
+	{
+		divTerm		   = Columns (distributionM2);
+		distribMX	   = distributionM2;
+	}
+	if (modelID==3)
+	{
+		divTerm		   = Columns (distributionNSM3);
+		distribMXS	   = distributionSynM3;
+		distribMXN	   = distributionNSM3;
+	}
+	if (modelID==4)
+	{
+		divTerm		   = Columns (distributionNSM4);
+		distribMXS	   = distributionSynM4;
+		distribMXN	   = distributionNSM4;
+	}
+	
+	if (modelID<=2)
+	{
+		rateAssignmentMatrix = {Columns(distribMX)+1,2};
+		for (counter1 = 1; counter1 < Rows (rateAssignmentMatrix); counter1=counter1+1)
+		{
+			rateAssignmentMatrix[counter1][0] = distribMX[0][counter1-1];
+			rateAssignmentMatrix[counter1][1] = rateAssignmentMatrix[counter1-1][1]+distribMX[1][counter1-1];
+		}
+		titleMatrix	= {{"Class","Rate","CDF"}};
+	}
+	else
+	{
+		rateAssignmentMatrixS = {Columns(distribMXS)+1,2};
+		for (counter1 = 1; counter1 < Rows (rateAssignmentMatrixS); counter1=counter1+1)
+		{
+			rateAssignmentMatrixS[counter1][0] = distribMXS[0][counter1-1];
+			rateAssignmentMatrixS[counter1][1] = rateAssignmentMatrixS[counter1-1][1]+distribMXS[1][counter1-1];
+		}
+		rateAssignmentMatrixN = {Columns(distribMXN)+1,2};
+		for (counter1 = 1; counter1 < Rows (rateAssignmentMatrixN); counter1=counter1+1)
+		{
+			rateAssignmentMatrixN[counter1][0] = distribMXN[0][counter1-1];
+			rateAssignmentMatrixN[counter1][1] = rateAssignmentMatrixN[counter1-1][1]+distribMXN[1][counter1-1];
+		}
+		
+		D1 = Columns(distribMXN);
+		D2 = Columns(distribMXS);
+			
+		rateMatrixValues = {D1*D2,3};
+		epsilon			 = Exp(-4);
+		
+		distribMXR = {2,D1*D2};
+		
+		for (k=0; k<D1; k=k+1)
+		{
+			E = k*D2;
+			for (k2 = 0; k2<D2; k2=k2+1)
+			{
+				distribMXR [0][E+k2] = distribMXN[0][k]/distribMXS[0][k2];
+				distribMXR [1][E+k2] = distribMXN[1][k]*distribMXS[1][k2];
+				rateMatrixValues [E+k2][0] = Min(4,Log (epsilon + distribMXS[0][k2]));
+				rateMatrixValues [E+k2][1] = Min(4,Log (epsilon + distribMXN[0][k]));
+				rateMatrixValues [E+k2][2] = distribMXR [1][E+k2];
+			}
+		}
+		
+		E = D1*D2;
+		
+		done = 0;
+		
+		while (!done)
+		{
+			done = 1;
+			for (k=1; k<E; k=k+1)
+			{
+				if (distribMXR [0][k] < distribMXR[0][k-1])
+				{
+					D = distribMXR [0][k];
+					distribMXR [0][k] = distribMXR [0][k-1];
+					distribMXR [0][k-1] = D;
+					D = distribMXR [1][k];
+					distribMXR [1][k] = distribMXR [1][k-1];
+					distribMXR [1][k-1] = D;
+					done = 0;
+				}
+				else
+				{
+					if (distribMXR [0][k] == distribMXR[0][k-1])
+					{
+						distribMXR[1][k-1] = distribMXR[1][k-1]+distribMXR[1][k];
+						for (k2=k+1;k2<E;k2=k2+1)
+						{
+							distribMXR[0][k2-1] = distribMXR[0][k2];
+							distribMXR[1][k2-1] = distribMXR[1][k2];
+						}
+						E = E-1;
+					}
+				}
+			}
+		}
+
+		if (E<D1*D2)
+		{
+			ratioInfoSwap = {2,E};
+			for (k=0; k<E; k=k+1)
+			{
+				ratioInfoSwap[0][k] = distribMXR[0][k];
+				ratioInfoSwap[1][k] = distribMXR[1][k];
+			}
+			distribMXR = ratioInfoSwap;
+			ratioInfoSwap = 0;
+		}
+		
+		rateAssignmentMatrixR = {Columns(distribMXR)+1,2};
+		RatioCDFString = "";
+		RatioCDFString * 128;
+		for (counter1 = 1; counter1 < Rows (rateAssignmentMatrixR); counter1=counter1+1)
+		{
+			rateAssignmentMatrixR[counter1][0] = distribMXR[0][counter1-1];
+			rateAssignmentMatrixR[counter1][1] = rateAssignmentMatrixR[counter1-1][1]+distribMXR[1][counter1-1];
+			RatioCDFString * ("+"+distribMXR[1][counter1-1]+"*(_x_>="+distribMXR[0][counter1-1]+")");
+		}
+		RatioCDFString * 0;
+		RatioCDFString = RatioCDFString[1][Abs(RatioCDFString)-1];
+		
+		titleMatrix	= {{"Class","Rate","CDF"}};
+	}
+	
+	if (outputChoice == 0)
+	{
+		if (modelID<=2)
+		{
+			dummy = PrintASCIITable  (rateAssignmentMatrix, titleMatrix);
+		}
+		else
+		{
+			fprintf (stdout, "\nSynonymous CDF\n\n");
+			dummy = PrintASCIITable  (rateAssignmentMatrixS, titleMatrix);
+			fprintf (stdout, "\nNonsynonymous CDF\n\n");
+			dummy = PrintASCIITable  (rateAssignmentMatrixN, titleMatrix);
+			fprintf (stdout, "\nNS/Syn Ratio CDF\n\n");
+			dummy = PrintASCIITable  (rateAssignmentMatrixR, titleMatrix);
+		}
+	}
+	if (outputChoice == 1)
+	{
+		if (modelID<=2)
+		{
+			dummy = PrintTableToFile (rateAssignmentMatrix, titleMatrix,1);
+		}
+		else
+		{
+			SetDialogPrompt ("Export tab separated data to:");
+			fprintf (PROMPT_FOR_FILE,CLEAR_FILE, "\nSynonymous CDF\n\n");
+			dummy = PrintTableToFile  (rateAssignmentMatrixS, titleMatrix,0);
+			fprintf (LAST_FILE_PATH, "\nNonsynonymous CDF\n\n");
+			dummy = PrintTableToFile (rateAssignmentMatrixN, titleMatrix,0);
+			fprintf (LAST_FILE_PATH, "\nNS/Syn Ratio CDF\n\n");
+			dummy = PrintTableToFile  (rateAssignmentMatrixR, titleMatrix,0);
+		}
+	}
+	if (outputChoice == 2)
+	{
+		labelMatrix = {1,Columns(titleMatrix)-1};
+		for (counter1 = 0; counter1 < Columns (labelMatrix); counter1 = counter1+1)
+		{
+			labelMatrix[0][counter1] = titleMatrix[0][counter1+1];
+		}
+		
+		if (modelID<=2)
+		{
+			promptString = "Discrete Rate Distribution for " + modelNamesShort[modelID];
+			OpenWindow (CHARTWINDOW,{{promptString}
+									   {"labelMatrix"},
+									   {"rateAssignmentMatrix"},
+									   {"Step Plot"},
+									   {labelMatrix[0]},
+									   {labelMatrix[1]},
+									   {labelMatrix[0]},
+									   {""},
+									   {labelMatrix[1]},
+									   {"0"}},
+									   "SCREEN_WIDTH-60;SCREEN_HEIGHT-50;30;50");
+		}
+		else
+		{
+			promptString = "Discrete Syn Rate Distribution for " + modelNamesShort[modelID];
+			OpenWindow (CHARTWINDOW,{{promptString}
+									   {"labelMatrix"},
+									   {"rateAssignmentMatrixS"},
+									   {"Step Plot"},
+									   {labelMatrix[0]},
+									   {labelMatrix[1]},
+									   {labelMatrix[0]},
+									   {""},
+									   {labelMatrix[1]},
+									   {"0"}},
+									   "SCREEN_WIDTH/2-20;SCREEN_HEIGHT/2-25;30;50");
+									   
+			promptString = "Discrete Non-Syn Rate Distribution for " + modelNamesShort[modelID];
+			OpenWindow (CHARTWINDOW,{{promptString}
+									   {"labelMatrix"},
+									   {"rateAssignmentMatrixN"},
+									   {"Step Plot"},
+									   {labelMatrix[0]},
+									   {labelMatrix[1]},
+									   {labelMatrix[0]},
+									   {""},
+									   {labelMatrix[1]},
+									   {"0"}},
+									   "SCREEN_WIDTH/2-20;SCREEN_HEIGHT/2-25;SCREEN_WIDTH/2;50");
+									   
+			promptString = "Discrete Non-Syn/Syn Rate Distribution for " + modelNamesShort[modelID];
+			OpenWindow (CHARTWINDOW,{{promptString}
+									   {"labelMatrix"},
+									   {"rateAssignmentMatrixR"},
+									   {"Step Plot"},
+									   {labelMatrix[0]},
+									   {labelMatrix[1]},
+									   {labelMatrix[0]},
+									   {""},
+									   {labelMatrix[1]},
+									   {"0"}},
+									   "SCREEN_WIDTH-60;SCREEN_HEIGHT/2-25;30;50+SCREEN_HEIGHT/2");
+		}
+		
+	}
+	if (outputChoice == 3)
+	{
+		psCode = ScaledDensityPlot ("rateMatrixValues", {{-4,4}{-4,4}}, "Courier", {{400,400,14,40}},
+										"_dNdSDensityPlot",
+										{{"","log (alpha)", "log (beta)"}}, 1, 1);
+
+		SetDialogPrompt ("Write the PostScript plot to:");
+		fprintf (PROMPT_FOR_FILE, CLEAR_FILE, psCode);
+	}
+	return 1;
+}
+
+/*___________________________________________________________________________________________________________*/
+
+function PadString (padLength,padChar)
+{
+	for (padCounter=0;padCounter<padLength;padCounter=padCounter+1)
+	{
+		fprintf (stdout,padChar);
+	}
+	return padLength;
+}
+
+/*___________________________________________________________________________________________________________*/
+
+function	PrintASCIITable (dataMatrix, titleMatrix)
+{
+	columnWidths = {1,Columns(titleMatrix)};
+	for (counter1=0; counter1<Columns(titleMatrix); counter1 = counter1+1)
+	{
+		counter2 = Abs (titleMatrix[0][counter1])+2;
+		if (counter2<12)
+		{
+			counter2 = 12;
+		}
+		columnWidths[0][counter1] = counter2;
+	}
+	fprintf (stdout, "\n");
+	for (counter2 = 0; counter2 < Columns (titleMatrix); counter2 = counter2+1)
+	{
+		fprintf (stdout,"+-");
+		dummy = PadString (columnWidths[0][counter2],"-");
+		fprintf (stdout,"-");
+	}
+	fprintf (stdout,"+\n| ");
+	
+	for (counter1=0; counter1<Columns(titleMatrix); counter1 = counter1+1)
+	{
+		fprintf (stdout, titleMatrix[counter1]);
+		dummy = PadString (columnWidths[0][counter1]-Abs(titleMatrix[counter1])," ");
+		fprintf (stdout, " | ");
+	}
+	
+	fprintf (stdout, "\n");
+	
+	for (counter1=-1; counter1<Rows(dataMatrix); counter1 = counter1 + 1)
+	{
+		if (counter1>=0)
+		{
+			fprintf (stdout,"| ");
+			fprintf (stdout,Format(counter1+1,columnWidths[0][0],0));
+			for (counter2 = 1; counter2 < Columns (titleMatrix); counter2 = counter2+1)
+			{
+				fprintf (stdout," | ");
+				fprintf (stdout,Format(dataMatrix[counter1][counter2-1],columnWidths[0][counter2],-1));
+			}
+			fprintf (stdout," ");
+			fprintf (stdout, "|\n");
+		}
+		for (counter2 = 0; counter2 < Columns (titleMatrix); counter2 = counter2+1)
+		{
+			fprintf (stdout,"+-");
+			dummy = PadString (columnWidths[0][counter2],"-");
+			fprintf (stdout,"-");
+		}
+		fprintf (stdout, "+\n");
+	}
+	
+	return 1;
+}
+
+/*___________________________________________________________________________________________________________*/
+
+function	PrintTableToFile (dataMatrix, titleMatrix, promptOrNot)
+{
+	SetDialogPrompt ("Export tab separated data to:");
+	
+	if (promptOrNot)
+	{
+		fprintf (PROMPT_FOR_FILE, CLEAR_FILE);
+	}
+	
+	fprintf (LAST_FILE_PATH, Join("\t",titleMatrix), "\n");
+
+	for (counter1=0; counter1<Rows(dataMatrix); counter1 += 1)
+	{
+		fprintf (LAST_FILE_PATH,counter1+1);
+		for (counter2 = 1; counter2 < Columns (titleMatrix); counter2 = counter2+1)
+		{
+			fprintf (LAST_FILE_PATH,"\t",dataMatrix[counter1][counter2-1]);
+		}
+		fprintf (LAST_FILE_PATH,"\n");
+	}
+	
+	return 1;
+}
+
+/*___________________________________________________________________________________________________________*/
+
+ChoiceList (actionChoice, 					  "Available Actions",1,SKIP_NONE,
+			"Rate classes",		 			  "Compute the rate class assignments at each site for the selected model.",
+			"Rate histogram",	 			  "Compute the rate class histogram for the selected model.",
+			"Posterior rates",	 			  "Compute the posterior distribution of expected rate for the selected model.",
+			"Positive Selection",			  "Compute the posterior probability  of {NS Rate > Syn Rate} at each site for the selected model.",			
+			"Distributions",	 			  "Display discrete rate distribution functions.",
+			"Posterior Ratio",	 			  "Display expected posterior dN/dS ratio for dual rate variation models.",
+			"Find Positively Selected Sites", "Find    positively selected sites.");
+			
+if (actionChoice<0)
+{
+	return;
+}
+
+if (actionChoice==3 || actionChoice==6)
+{
+	ChoiceList (psChoice, 					  	  "Detection method",1,SKIP_NONE,
+				"Absolute threshold",		 	  "Use the absolute value for posterior P{N/S>=1}.",
+				"Bayes Factor",	 		  		  "Use the Bayes factor: Posterior Odds P{N/S>=1}/Prior Odds P{N/S>=1}.");
+				
+	if (psChoice<0)
+	{
+		return;
+	}
+}
+
+if (actionChoice!=3 && actionChoice!=5 && actionChoice!=6)
+{
+	ChoiceList (modelChoice,"Rate Variation Models",1,SKIP_NONE,
+				"Proportional","Proportional Variable Rates Model: dS and dN vary along the sequence, but dN = R*dS for every site",
+				"Nonsynonymous","Non-synonymous Variable Rates Model: dS = 1 for every site, while dN is drawn from a given distribution.",
+				"Dual","Dual Variable Rates Model: dS and dN are drawn from a bivariate distribution (independent or correlated components).",
+				"Lineage Dual","Lineage+Dual Variable Rates Model:  dS and dN are drawn from a bivariate distribution (independent or correlated components), plus each lineage has an adjustment factor for the E[dN]/E[dS]."
+			    );
+	
+	if (modelChoice<0)
+	{
+		return;
+	}
+}
+else
+{
+	if ((actionChoice == 3)||(actionChoice == 6))
+	{
+		ChoiceList (modelChoice,"Rate Variation Models",1,SKIP_NONE,
+					"Nonsynonymous","Non-synonymous Variable Rates Model: dS = 1 for every site, while dN is drawn from a given distribution.",
+					"Dual","Dual Variable Rates Model: dS and dN are drawn from a bivariate distribution (independent or correlated components). Recommened model.",
+					"Lineage Dual","Lineage+Dual Variable Rates Model:  dS and dN are drawn from a bivariate distribution (independent or correlated components), plus each lineage has an adjustment factor for the E[dN]/E[dS]."
+				    );
+	
+		if (modelChoice<0)
+		{
+			return;
+		}
+		
+		modelChoice = modelChoice+1;
+	}
+	else
+	{
+		ChoiceList (modelChoice,"Rate Variation Models",1,SKIP_NONE,
+					"Dual","Dual Variable Rates Model: dS and dN are drawn from a bivariate distribution (independent or correlated components). Recommened model.",
+					"Lineage Dual","Lineage+Dual Variable Rates Model:  dS and dN are drawn from a bivariate distribution (independent or correlated components), plus each lineage has an adjustment factor for the E[dN]/E[dS]."
+			    );
+	
+		if (modelChoice<0)
+		{
+			return;
+		}
+		
+		modelChoice = modelChoice+2;
+	}	
+}
+
+if (actionChoice == 4 && modelChoice == 2)
+{
+	ChoiceList (outputChoice, "Output Options",1,SKIP_NONE,
+				"ASCII Table",	 "Output is printed to the console as an ASCII table.",
+				"Export to File","Output is spooled to a tab separated file.",
+				"Chart","A HYPHY chart window is displayed (GUI versions only).",
+				"PostScript","Render a PostScript density plot into a file.");
+}
+else
+{
+	ChoiceList (outputChoice, "Output Options",1,SKIP_NONE,
+				"ASCII Table",	 "Output is printed to the console as an ASCII table.",
+				"Export to File","Output is spooled to a tab separated file.",
+				"Chart","A HYPHY chart window is displayed (GUI versions only).");
+}
+
+if (outputChoice<0)
+{
+	return;
+}
+			
+if (actionChoice < 2)
+{
+	ComputeRateClasses 		(modelChoice+1,actionChoice);
+	return;
+}
+
+if (actionChoice == 2)
+{
+	ComputePosteriorRates 	(modelChoice+1);
+	return;
+}
+
+if (actionChoice == 3)
+{
+	ComputePositiveSelection(modelChoice+1,0);
+	return;
+}
+
+if (actionChoice == 4)
+{
+	ComputeCDF				(modelChoice+1);
+	return;
+}
+
+if (actionChoice == 5)
+{
+	ComputePRatio			(modelChoice+1);
+	return;
+}
+
+if (actionChoice == 6)
+{
+	ComputePositiveSelection(modelChoice+1,1);
+	return;
+}
diff --git a/res/TemplateBatchFiles/dSdNTreeTools.ibf b/res/TemplateBatchFiles/dSdNTreeTools.ibf
new file mode 100644
index 0000000..05e05ef
--- /dev/null
+++ b/res/TemplateBatchFiles/dSdNTreeTools.ibf
@@ -0,0 +1,104 @@
+function  ComputeScalingStencils (unused)
+{
+	scalingStencils = {};
+	
+	if (Columns(_Genetic_Code) != 64) {
+		fprintf (stdout, "\nError: _Genetic_Code is not properly defined\n");
+	}
+	else
+	{
+		nonStopCodonCount = 64;
+		for (k=0; k<64; k=k+1)
+		{
+			if (_Genetic_Code[k] == 10)
+			{
+				nonStopCodonCount = nonStopCodonCount - 1;
+			}
+		}
+
+		stencilMatrixNS = {nonStopCodonCount,nonStopCodonCount};
+		stencilMatrixS  = {nonStopCodonCount,nonStopCodonCount};
+
+		hshift = 0;
+		for (h=0; h<64; h=h+1)
+		{
+			if (_Genetic_Code[h]==10) 
+			{
+				hshift = hshift+1;
+				continue; 
+			}
+			vshift = hshift;
+			for (v = h+1; v<64; v=v+1)
+			{
+				if (_Genetic_Code[v]==10) 
+				{
+					vshift = vshift+1;
+					continue; 
+				}
+				if (_Genetic_Code[h] == _Genetic_Code[v])
+				{
+					stencilMatrixS [h-hshift][v-vshift] = 1;
+					stencilMatrixS [v-vshift][h-hshift] = 1;
+				}
+				else
+				{
+					stencilMatrixNS [h-hshift][v-vshift] = 1;
+					stencilMatrixNS [v-vshift][h-hshift] = 1;		
+				}
+			}
+		}
+		scalingStencils ["Syn"]     = stencilMatrixS;
+		scalingStencils ["NonSyn"]  = stencilMatrixNS;
+	}
+	return scalingStencils;
+}
+
+/*----------------------------------------------------------------------------------*/
+
+function  ReturnSandNSTrees (theStencil, treeID)
+{
+	scaledTreeStrings = {};
+	BRANCH_LENGTH_STENCIL = theStencil["Syn"];
+	ExecuteCommands("scaledTreeStrings[\"Syn\"] = Format ("+treeID+", 1, 1);");
+
+	BRANCH_LENGTH_STENCIL = theStencil["NonSyn"];
+	ExecuteCommands("scaledTreeStrings[\"NonSyn\"] = Format ("+treeID+", 1, 1);");
+	
+	BRANCH_LENGTH_STENCIL = 0;
+	return scaledTreeStrings;
+}
+
+/*----------------------------------------------------------------------------------*/
+
+function  ReturnVectorsOfCodonLengths (theStencil, treeID)
+{
+	scaledVectors = {};
+	BRANCH_LENGTH_STENCIL = theStencil["Syn"];
+	ExecuteCommands("scaledVectors[\"Syn\"] = BranchLength ("+treeID+", -1);");
+
+	BRANCH_LENGTH_STENCIL = theStencil["NonSyn"];
+	ExecuteCommands("scaledVectors[\"NonSyn\"] = BranchLength ("+treeID+", -1);");
+	
+	BRANCH_LENGTH_STENCIL = 0;
+	ExecuteCommands("scaledVectors[\"Total\"] = BranchLength ("+treeID+", -1);");
+	return scaledVectors;
+}
+
+/*----------------------------------------------------------------------------------*/
+
+function  ReturnCodonFormulas (theStencil, modelID)
+{
+	scaledVectors = {};
+	BRANCH_LENGTH_STENCIL = theStencil["Syn"];
+	ExecuteCommands("GetString(_synFormula,`modelID`,-1);");
+
+	BRANCH_LENGTH_STENCIL = theStencil["NonSyn"];
+	ExecuteCommands("GetString(_nonSynFormula,`modelID`,-1);");
+	
+	BRANCH_LENGTH_STENCIL = 0;
+	scaledVectors ["Syn"] = _synFormula;
+	scaledVectors ["NonSyn"] = _nonSynFormula;
+	
+	return scaledVectors;
+}
+
diff --git a/res/TemplateBatchFiles/distanceMethodNPBootstrap.bf b/res/TemplateBatchFiles/distanceMethodNPBootstrap.bf
new file mode 100644
index 0000000..261bbe2
--- /dev/null
+++ b/res/TemplateBatchFiles/distanceMethodNPBootstrap.bf
@@ -0,0 +1,443 @@
+
+IS_NPBOOTSTRAP_AVAILABLE = 1;
+
+function BootStrapFunction (bsIterates, tabulatedFileName, parametricOrNot)
+{
+	ChoiceList (bsTreeFormat,"Bootstrap Summary Tree String Format",1,SKIP_NONE,
+				"Proportions","Branch lengths of internal nodes reflect the proportion of times the clade starting at that node was contained in replicate trees. Tip branches have length 1.0.",
+				"Counts","Branch lengths of internal nodes reflect the number of times the clade starting at that node was contained in replicate trees. Tip branches have length equal to the total number of replicates.");
+	if (bsTreeFormat<0)
+	{
+		return 0.0;
+	}
+	
+	if (dataType)
+	{
+		DataSetFilter filteredData2 = CreateFilter (ds,3,"","",GeneticCodeExclusions);
+	}
+	else
+	{
+		DataSetFilter filteredData2 = CreateFilter (ds,1,"","");
+	}
+	
+	nm = ExtractCladeInfo (treeNodes);
+	for (bsCounter=1;bsCounter<=bsIterates;bsCounter=bsCounter+1)
+	{
+		fprintf (stdout,"\nIteration ",Format(bsCounter,0,0),"/",Format(bsIterates,0,0)," ");
+
+		if (dataType)
+		{
+			DataSetFilter filteredData = Bootstrap (filteredData2,3);
+		}
+		else
+		{
+			DataSetFilter filteredData = Bootstrap (filteredData2,1);
+		}
+
+		p = InferTreeTopology (0.0);
+		nm2 = ExtractCladeInfo (treeNodes);
+		p = MatchClades (nm2,nm);
+		treeString = TreeMatrix2TreeString (1);
+		fprintf (tabulatedFileName, treeString,";\n");
+
+	}
+	treeNodes = bestTreeNodes;
+	i = 0;
+	j = 0;
+	n = treeNodes[0][1];
+	if (bsTreeFormat<.5)
+	{
+		while (n)
+		{
+			if (treeNodes[i][0]>=ds.species)
+			{
+				treeNodes[i][2] = nm[0][j]/bsIterates;
+				j=j+1;
+			}
+			else
+			{
+				treeNodes[i][2] = 1.0;
+			}
+			n = treeNodes[i][1];
+			i = i+1;
+		}
+	}
+	else
+	{
+		while (n)
+		{
+			if (treeNodes[i][0]>=ds.species)
+			{
+				treeNodes[i][2] = nm[0][j];
+				j=j+1;
+			}
+			else
+			{
+				treeNodes[i][2] = bsIterates;
+			}
+			n = treeNodes[i][1];
+			i = i+1;
+		}
+	}
+
+	treeString 				= TreeMatrix2TreeString (1);
+	UseModel						   (USE_NO_MODEL);
+	Tree Bootstrap_Tree 	= treeString;
+	
+	if (bsTreeFormat<.5)
+	{
+		fprintf (stdout,"\n\n************* Bootstrapping summary tree (with ",Format(bsIterates,4,0)," iterates). \nInternal branch 'lengths' indicate the proportion of replicate trees which contained the clade starting at that node.\n\n", treeString,"\n");		
+		fprintf (tabulatedFileName,"\n\nBootstrapping summary tree (with ",Format(bsIterates,4,0)," iterates).  \nInternal branch 'lengths' indicate the proportion of replicate trees which contained the clade starting at that node.\n\n", treeString);		
+	}
+	else
+	{
+		fprintf (stdout,"\n\n************* Bootstrapping summary tree (with ",Format(bsIterates,4,0)," iterates). \nInternal branch 'lengths' indicate the number of times the clade starting at that node was contained in replicate trees.\n\n", treeString,"\n");		
+		fprintf (tabulatedFileName,"\n\nBootstrapping summary tree (with ",Format(bsIterates,4,0)," iterates).  \nInternal branch 'lengths' indicate the number of times the clade starting at that node was contained in replicate trees.\n\n", treeString);		
+	}
+	treeNodes 			= bestTreeNodes;
+	treeString 			= TreeMatrix2TreeString (1);
+	Tree Inferred_Tree  = treeString;
+	
+	bsBranchLengths		= BranchLength (Bootstrap_Tree,-1);
+	itBranchNames		= BranchName   (Inferred_Tree,-1);
+	
+	for (n=0; n<Columns (itBranchNames); n=n+1)
+	{
+		ExecuteCommands ("Inferred_Tree."+itBranchNames[n]+".bs_support="+bsBranchLengths[n]);
+	}
+
+	DEFAULT_FILE_SAVE_NAME = "Bootstrap_tree.ps";
+	SetDialogPrompt ("Save PostScript tree with bootstrap support branch labels to:");
+	
+	filterBy = -1;
+	while (filterBy < 0 || filterBy > 100)
+	{
+		fprintf (stdout, "Filter internal branch labels with < specified % support [0-100]:");
+		fscanf	(stdin, "Number", filterBy);
+	}
+	
+	TREE_OUTPUT_OPTIONS = {};
+	treeAVL = Inferred_Tree ^ 0;
+	maxD    = 0;
+	for (n=1; n<Abs(treeAVL); n=n+1)
+	{
+		if (Abs((treeAVL[n])["Children"]))
+		{
+			myBL = bsBranchLengths[n-1];
+			if (bsTreeFormat)
+			{
+				if (filterBy/100*bsIterates>myBL)
+				{
+					continue;
+				}
+			}
+			else
+			{
+				if (filterBy/100>myBL)
+				{
+					continue;
+				}
+			}
+			myAVL = {};
+			myAVL ["TREE_OUTPUT_OVER_BRANCH"] = "(" + bsBranchLengths[n-1] + ") drawletter";
+			TREE_OUTPUT_OPTIONS [(treeAVL[n])["Name"]] = myAVL;
+		}
+		maxD = Max (maxD, (treeAVL[n])["Depth"]);
+	}
+	
+	imageHeight = Min(TipCount (Inferred_Tree) * 20 + 20, 792);
+	imageWidth  = Min (maxD * 50, 612);
+	
+	psString = PSTreeString (Inferred_Tree,"STRING_SUPPLIED_LENGTHS",{{imageWidth,imageHeight}});
+	fprintf (PROMPT_FOR_FILE, CLEAR_FILE, "/drawletter {2 2 rmoveto 1 copy false charpath pathbbox 2 index 3 sub sub exch 3 index 3 sub sub exch  0.85 setgray 4 copy rectfill 0 setgray  3 index 3 index currentlinewidth 0.5 setlinewidth 7 3 roll rectstroke setlinewidth exch 1.5 add exch 1.5 add moveto show} def\n",psString);
+	
+	return 0;
+}
+
+/* ____________________________________________*/
+
+function  ExtractCladeInfo (treeNodeMatrix)
+{
+	i = 0;
+	n = treeNodeMatrix[0][1]; 
+	s = 0;
+	matrixOfClades = {ds.species+1,ds.species-1};
+	while (n)
+	{
+		if (treeNodeMatrix[i][0]>=ds.species)
+		{
+			j=i-1;
+			m = 1;
+			while (treeNodeMatrix[j][1]>n)
+			{
+				if (treeNodeMatrix[j][0]<ds.species)
+				{
+					m = m+1;
+					matrixOfClades[m][s]=treeNodeMatrix[j][0];
+				}
+				j = j-1;
+				if (j<0)
+				{
+					break;
+				}
+			}
+			matrixOfClades[1][s]=m-1;
+			s = s+1;
+		}
+		i = i+1;
+		n = treeNodeMatrix[i][1];
+	}
+	return matrixOfClades;
+}
+
+/* ____________________________________________*/
+/* see if clades in matrix2 exist in matrix1 and if so, increment the counters
+   for relevant clades.
+*/
+
+function   MatchClades(treeNodeMatrix1,treeNodeMatrix2)
+{
+	n = Columns(treeNodeMatrix2);
+	for (i=0;i<n;i=i+1)
+	{
+		m = treeNodeMatrix1[1][i];
+		if (m==0)
+		{
+			break;
+		}
+		for (j=0;j<n;j=j+1)
+		{
+			if (treeNodeMatrix2[1][j]==m)
+			/*might work*/
+			{
+				for (s=m+1; s>1 ; s=s-1)
+				/* for each node in the clade */
+				{
+					k = treeNodeMatrix1[s][i];
+					for (p=m+1; p>1; p=p-1)
+					{
+						if (treeNodeMatrix2[p][j]==k)
+						{
+							break;
+						}
+					}
+					if (p==1)
+					{
+						break;
+					}
+				}
+				if (s==1)
+				{
+					/*fprintf (stdout, "\n  ",j);*/
+					treeNodeMatrix2[0][j] = treeNodeMatrix2[0][j]+1;
+					break;
+				}
+			}
+		}
+		if (j==n)
+		/* clade not found, try complement */
+		{
+			t = ds.species-m;
+			if (m==0)
+			{
+				break;
+			}
+			for (j=0;j<n;j=j+1)
+			{
+				if (treeNodeMatrix2[1][j]==t)
+				/*might work*/
+				{
+					for (s=m+1; s>1 ; s=s-1)
+					/* for each node in the clade */
+					{
+						k = treeNodeMatrix1[s][i];
+						for (p=t+1; p>1; p=p-1)
+						{
+							if (treeNodeMatrix2[p][j]==k)
+							{
+								break;
+							}
+						}
+						if (p>1)
+						{
+							break;
+						}
+					}
+					if (s==1)
+					{
+						/*fprintf (stdout, "\nC ",j,"(",m,")");*/
+						treeNodeMatrix2[0][j] = treeNodeMatrix2[0][j]+1;
+						break;
+					}
+				}
+			}		
+		}
+	}
+	return 1.0;
+}
+
+/* ____________________________________________*/
+
+function TreeMatrix2TreeString (doLengths)
+{
+	treeString = "";
+	p = 0;
+	k = 0;
+	m = treeNodes[0][1];
+	n = treeNodes[0][0];
+	d = treeString*(Rows(treeNodes)*25);
+
+	while (m)
+	{	
+		if (m>p)
+		{
+			if (p)
+			{
+				d = treeString*",";
+			}
+			for (j=p;j<m;j=j+1)
+			{
+				d = treeString*"(";
+			}
+		}
+		else
+		{
+			if (m<p)
+			{
+				for (j=m;j<p;j=j+1)
+				{
+					d = treeString*")";
+				}
+			}	
+			else
+			{
+				d = treeString*",";
+			}	
+		}
+		if (n<ds.species)
+		{
+			GetString (nodeName, ds, n);
+			d = treeString*nodeName;
+		}
+		if (doLengths>.5)
+		{
+			nodeName = ":"+treeNodes[k][2];
+			d = treeString*nodeName;
+		}
+		k=k+1;
+		p=m;
+		n=treeNodes[k][0];
+		m=treeNodes[k][1];
+	}
+
+	for (j=m;j<p;j=j+1)
+	{
+		d = treeString*")";
+	}
+	
+	d=treeString*0;
+	return treeString;
+}
+
+/* ____________________________________________*/
+
+function	placeParentNodes (nodeID)
+{
+	nodeDepth = 0;
+	
+	saveNodeID = nodeID;
+	parentID   = parentInfo[nodeID][0];
+	
+	layoutOffset = useColumn;
+
+	while (parentID>=0)
+	{
+		n = distanceMatrix[parentID-ds.species][1];
+		if (n >= 0)
+		/* it has been laid out */
+		{	
+			layoutOffset = n+distanceMatrix[parentID-ds.species][0];
+			break;
+		}
+		parentID  = parentInfo[parentID][0];
+	}
+
+	parentID   = parentInfo[nodeID][0];
+
+	while (parentID>=0)
+	{
+		n = parentID-ds.species;
+		m = cladesInfo[nodeID];
+		if (distanceMatrix[n][1] < 0)
+		/* this node hasn't been laid out yet */
+		{
+			if (parentInfo[parentID][0]>=0)
+			{
+				distanceMatrix[n][1] = layoutOffset; /* where the layout for the clade begins */
+				distanceMatrix[n][0] = m; /* offset for that layout */
+			}
+						
+			m = layoutOffset + m - 1;
+			
+			treeNodes[m][0] = nodeID;
+			treeNodes[m][2] = parentInfo[nodeID][1];
+			
+			columnIndex[nodeID] = m;
+		}
+		else
+		/* it has been laid out */
+		{	
+			m = distanceMatrix[n][0]+distanceMatrix[n][1]+ m - 1;
+			
+			treeNodes[m][0] = nodeID;
+			treeNodes[m][2] = parentInfo[nodeID][1];
+			
+			distanceMatrix[n][0] = m + cladesInfo[nodeID];
+			columnIndex[nodeID] = m;
+			nodeDepth = nodeDepth+1;
+			
+			break;
+		}
+		nodeDepth = nodeDepth+1;
+		nodeID    = parentID;
+		parentID  = parentInfo[nodeID][0];
+	}
+	
+	/* update levels of nodes */
+	
+	if (parentID<0)
+	{
+		nodeID   = saveNodeID;
+		parentID = parentInfo[nodeID][0];
+		
+		while (parentID>=0)
+		{
+			m = columnIndex[nodeID];
+			treeNodes[m][1] = nodeDepth;
+			nodeDepth = nodeDepth-1;
+			saveNodeID = nodeID;
+			nodeID     = parentID;
+			parentID   = parentInfo[nodeID][0];
+		}
+		
+		useColumn = useColumn+cladesInfo[saveNodeID];
+	}
+	else
+	{
+		m = columnIndex[parentID]; 
+		
+		n = treeNodes[m][1];/* depth of the parent */
+		
+		nodeID   = saveNodeID;
+
+		while (nodeDepth >= 0)
+		{
+			m = columnIndex[nodeID];
+			treeNodes[m][1] = nodeDepth+n;
+			
+			nodeDepth = nodeDepth-1;
+			nodeID  = parentInfo[nodeID][0];
+		}
+	}
+	return 0;
+}
diff --git a/res/TemplateBatchFiles/distanceRMethodNPBootstrap.bf b/res/TemplateBatchFiles/distanceRMethodNPBootstrap.bf
new file mode 100644
index 0000000..30437c7
--- /dev/null
+++ b/res/TemplateBatchFiles/distanceRMethodNPBootstrap.bf
@@ -0,0 +1,373 @@
+
+IS_NPBOOTSTRAP_AVAILABLE = 1;
+
+function BootStrapFunction (bsIterates, tabulatedFileName, parametricOrNot)
+{
+	ChoiceList (bsTreeFormat,"Bootstrap Summary Tree String Format",1,SKIP_NONE,
+				"Proportions","Branch lengths of internal nodes reflect the proportion of times the clade starting at that node was contained in replicate trees. Tip branches have length 1.0.",
+				"Counts","Branch lengths of internal nodes reflect the number of times the clade starting at that node was contained in replicate trees. Tip branches have length equal to the total number of replicates.");
+	if (bsTreeFormat<0)
+	{
+		return 0.0;
+	}
+	DataSetFilter filteredData2 = CreateFilter (ds,1,"","");
+	nm = ExtractCladeInfo (treeNodes);
+	for (bsCounter=1;bsCounter<=bsIterates;bsCounter=bsCounter+1)
+	{
+		fprintf (stdout,"\nIteration ",Format(bsCounter,0,0),"/",Format(bsIterates,0,0)," ");
+
+		DataSetFilter filteredData = Bootstrap (filteredData2,1);
+		p = InferTreeTopology (0.0);
+		nm2 = ExtractCladeInfo (treeNodes);
+		p = MatchClades (nm2,nm);
+		treeString = TreeMatrix2TreeString (0);
+		fprintf (tabulatedFileName, treeString,";\n");
+
+	}
+	treeNodes = bestTreeNodes;
+	i = 0;
+	j = 0;
+	n = treeNodes[0][1];
+	if (bsTreeFormat<.5)
+	{
+		while (n)
+		{
+			if (treeNodes[i][0]>=ds.species)
+			{
+				treeNodes[i][2] = nm[0][j]/bsIterates;
+				j=j+1;
+			}
+			else
+			{
+				treeNodes[i][2] = 1.0;
+			}
+			n = treeNodes[i][1];
+			i = i+1;
+		}
+	}
+	else
+	{
+		while (n)
+		{
+			if (treeNodes[i][0]>=ds.species)
+			{
+				treeNodes[i][2] = nm[0][j];
+				j=j+1;
+			}
+			else
+			{
+				treeNodes[i][2] = bsIterates;
+			}
+			n = treeNodes[i][1];
+			i = i+1;
+		}
+	}
+
+	treeString = TreeMatrix2TreeString (1);
+	UseModel(USE_NO_MODEL);
+	Tree Bootstrap_Tree = treeString;
+	
+	if (bsTreeFormat<.5)
+	{
+		fprintf (stdout,"\n\n************* Bootstrapping summary tree (with ",Format(bsIterates,4,0)," iterates). \nInternal branch 'lengths' indicate the proportion of replicate trees which contained the clade starting at that node.\n\n", treeString,"\n");		
+		fprintf (tabulatedFileName,"\n\nBootstrapping summary tree (with ",Format(bsIterates,4,0)," iterates).  \nInternal branch 'lengths' indicate the proportion of replicate trees which contained the clade starting at that node.\n\n", treeString);		
+	}
+	else
+	{
+		fprintf (stdout,"\n\n************* Bootstrapping summary tree (with ",Format(bsIterates,4,0)," iterates). \nInternal branch 'lengths' indicate the number of times the clade starting at that node was contained in replicate trees.\n\n", treeString,"\n");		
+		fprintf (tabulatedFileName,"\n\nBootstrapping summary tree (with ",Format(bsIterates,4,0)," iterates).  \nInternal branch 'lengths' indicate the number of times the clade starting at that node was contained in replicate trees.\n\n", treeString);		
+	}
+	treeNodes = bestTreeNodes;
+	treeString = TreeMatrix2TreeString (1);
+	Tree Inferred_Tree = treeString;
+	return 0;
+}
+
+/* ____________________________________________*/
+
+function  ExtractCladeInfo (treeNodeMatrix)
+{
+	i = 0;
+	n = treeNodeMatrix[0][1]; 
+	s = 0;
+	matrixOfClades = {ds.species+1,ds.species-1};
+	while (n)
+	{
+		if (treeNodeMatrix[i][0]>=ds.species)
+		{
+			j=i-1;
+			m = 1;
+			while (treeNodeMatrix[j][1]>n)
+			{
+				if (treeNodeMatrix[j][0]<ds.species)
+				{
+					m = m+1;
+					matrixOfClades[m][s]=treeNodeMatrix[j][0];
+				}
+				j = j-1;
+				if (j<0)
+				{
+					break;
+				}
+			}
+			matrixOfClades[1][s]=m-1;
+			s = s+1;
+		}
+		i = i+1;
+		n = treeNodeMatrix[i][1];
+	}
+	return matrixOfClades;
+}
+
+/* ____________________________________________*/
+/* see if clades in matrix2 exist in matrix1 and if so, increment the counters
+   for relevant clades.
+*/
+
+function   MatchClades(treeNodeMatrix1,treeNodeMatrix2)
+{
+	n = Columns(treeNodeMatrix2);
+	for (i=0;i<n;i=i+1)
+	{
+		m = treeNodeMatrix1[1][i];
+		if (m==0)
+		{
+			break;
+		}
+		for (j=0;j<n;j=j+1)
+		{
+			if (treeNodeMatrix2[1][j]==m)
+			/*might work*/
+			{
+				for (s=m+1; s>1 ; s=s-1)
+				/* for each node in the clade */
+				{
+					k = treeNodeMatrix1[s][i];
+					for (p=m+1; p>1; p=p-1)
+					{
+						if (treeNodeMatrix2[p][j]==k)
+						{
+							break;
+						}
+					}
+					if (p==1)
+					{
+						break;
+					}
+				}
+				if (s==1)
+				{
+					/*fprintf (stdout, "\n  ",j);*/
+					treeNodeMatrix2[0][j] = treeNodeMatrix2[0][j]+1;
+					break;
+				}
+			}
+		}
+		if ((j==n)&&(m>2))
+		/* clade not found, try complement */
+		{
+			t = ds.species-m;
+			if (m==0)
+			{
+				break;
+			}
+			for (j=0;j<n;j=j+1)
+			{
+				if (treeNodeMatrix2[1][j]==t)
+				/*might work*/
+				{
+					for (s=m+1; s>1 ; s=s-1)
+					/* for each node in the clade */
+					{
+						k = treeNodeMatrix1[s][i];
+						for (p=t+1; p>1; p=p-1)
+						{
+							if (treeNodeMatrix2[p][j]==k)
+							{
+								break;
+							}
+						}
+						if (p>1)
+						{
+							break;
+						}
+					}
+					if (s==1)
+					{
+						/*fprintf (stdout, "\nC ",j,"(",m,")");*/
+						treeNodeMatrix2[0][j] = treeNodeMatrix2[0][j]+1;
+						break;
+					}
+				}
+			}		
+		}
+	}
+	return 1.0;
+}
+
+/* ____________________________________________*/
+
+function TreeMatrix2TreeString (doLengths)
+{
+	treeString = "";
+	p = 0;
+	k = 0;
+	m = treeNodes[0][1];
+	n = treeNodes[0][0];
+
+	while (m)
+	{	
+		if (m>p)
+		{
+			if (p)
+			{
+				treeString = treeString+",";
+			}
+			for (j=p;j<m;j=j+1)
+			{
+				treeString = treeString+"(";
+			}
+		}
+		else
+		{
+			if (m<p)
+			{
+				for (j=m;j<p;j=j+1)
+				{
+					treeString = treeString+")";
+				}
+			}	
+			else
+			{
+				treeString = treeString+",";
+			}	
+		}
+		if (n<ds.species)
+		{
+			GetString (nodeName, ds, n);
+			treeString = treeString+nodeName;
+		}
+		if (doLengths>.5)
+		{
+			treeString = treeString+":"+treeNodes[k][2];
+		}
+		k=k+1;
+		p=m;
+		n=treeNodes[k][0];
+		m=treeNodes[k][1];
+	}
+
+	for (j=m;j<p;j=j+1)
+	{
+		treeString = treeString+")";
+	}
+	
+	return treeString;
+}
+
+/* ____________________________________________*/
+
+function	placeParentNodes (nodeID)
+{
+	nodeDepth = 0;
+	
+	saveNodeID = nodeID;
+	parentID   = parentInfo[nodeID][0];
+	
+	saveNodeID = nodeID;
+	parentID   = parentInfo[nodeID][0];
+	
+	layoutOffset = useColumn;
+
+	while (parentID>=0)
+	{
+		n = distanceMatrix[parentID-ds.species][1];
+		if (n >= 0)
+		/* it has been laid out */
+		{	
+			layoutOffset = n+distanceMatrix[parentID-ds.species][0];
+			break;
+		}
+		parentID  = parentInfo[parentID][0];
+	}
+
+	parentID   = parentInfo[nodeID][0];
+
+	while (parentID>=0)
+	{
+		n = parentID-ds.species;
+		m = cladesInfo[nodeID];
+		if (distanceMatrix[n][1] < 0)
+		/* this node hasn't been laid out yet */
+		{
+			if (parentInfo[parentID][0]>=0)
+			{
+				distanceMatrix[n][1] = layoutOffset; /* where the layout for the clade begins */
+				distanceMatrix[n][0] = m; /* offset for that layout */
+			}
+						
+			m = layoutOffset + m - 1;
+			
+			treeNodes[m][0] = nodeID;
+			treeNodes[m][2] = parentInfo[nodeID][1];
+			
+			columnIndex[nodeID] = m;
+		}
+		else
+		/* it has been laid out */
+		{	
+			m = distanceMatrix[n][0]+distanceMatrix[n][1]+ m - 1;
+			
+			treeNodes[m][0] = nodeID;
+			treeNodes[m][2] = parentInfo[nodeID][1];
+			
+			distanceMatrix[n][0] = m + cladesInfo[nodeID];
+			columnIndex[nodeID] = m;
+			nodeDepth = nodeDepth+1;
+			
+			break;
+		}
+		nodeDepth = nodeDepth+1;
+		nodeID    = parentID;
+		parentID  = parentInfo[nodeID][0];
+	}
+	
+	/* update levels of nodes */
+	
+	if (parentID<0)
+	{
+		nodeID   = saveNodeID;
+		parentID = parentInfo[nodeID][0];
+		
+		while (parentID>=0)
+		{
+			m = columnIndex[nodeID];
+			treeNodes[m][1] = nodeDepth;
+			nodeDepth = nodeDepth-1;
+			saveNodeID = nodeID;
+			nodeID     = parentID;
+			parentID   = parentInfo[nodeID][0];
+		}
+		
+		useColumn = useColumn+cladesInfo[saveNodeID];
+	}
+	else
+	{
+		m = columnIndex[parentID]; 
+		
+		n = treeNodes[m][1];/* depth of the parent */
+		
+		nodeID   = saveNodeID;
+
+		while (nodeDepth >= 0)
+		{
+			m = columnIndex[nodeID];
+			treeNodes[m][1] = nodeDepth+n;
+			
+			nodeDepth = nodeDepth-1;
+			nodeID  = parentInfo[nodeID][0];
+		}
+	}
+	return 0;
+}
+
diff --git a/res/TemplateBatchFiles/doNNISwap.bf b/res/TemplateBatchFiles/doNNISwap.bf
new file mode 100644
index 0000000..8a51fe7
--- /dev/null
+++ b/res/TemplateBatchFiles/doNNISwap.bf
@@ -0,0 +1,150 @@
+l = 0;
+while (cladesInfo[l][1])
+{
+	l = l+1;
+}
+
+if (verbFlag)
+{
+	fprintf (stdout, "\n\n\tPerforming NNI branch swapping on the best tree so far.\n\tAt least ",l*2," trees will be examined.\n\n");
+}
+
+nniDidBetter = 0;
+
+while(1)
+{
+	for (l2 = 0; l2 < l; l2=l2+1)
+	{
+		dummy = splitCladesOnIBranch (filteredData.species,filteredData.species+l2);
+		for (l3=2; l3<4; l3=l3+1)
+		{
+			dummy = doNNISwap (l3,filteredData.species);
+			thisTree = TreeMatrix2TreeString (2,0);
+			if (verbFlag )
+			{	
+				if (MPI_NODE_COUNT<2)
+				{
+					fprintf (stdout, "\n\tNNI tree ",thisTree);
+				}
+				else
+				{
+					fprintf (stdout, "\n\tNNI swap ",l3-1, " at node ", l2, "\n");			
+				}
+			}
+			Tree    Inferred_Tree = thisTree;
+			if (haveTreeConstraint)
+			{
+				if ((Inferred_Tree<=_topologyPattern) == 0)
+				{
+					if (verbFlag)
+					{
+						fprintf (stdout, " => Rejected by the topology constraint.");
+					}
+					continue;
+				}
+				else
+				{
+					if (verbFlag)
+					{
+						fprintf (stdout, " => Accepted by the topology constraint.");
+					}
+				}
+			}
+			if (starDecomposition)
+			{
+				LikelihoodFunction lf = (filteredData, Inferred_Tree);
+				Optimize (res,lf);
+				if (verbFlag)
+				{
+					fprintf (stdout, " => ", res[1][0]);
+				}
+				if (res[1][0]>bestValue)
+				{	
+					nniDidBetter = 1;
+					bestValue = res[1][0];
+					bestTree = thisTree;
+					for (l4=2*taxonCounter-2;l4>=0;l4=l4-1)
+					{
+						bestTreeNodes[l4][0]= treeNodes[l4][2];
+						bestTreeNodes[l4][1]= treeNodes[l4][3];
+						treeNodes[l4][0]    = treeNodes[l4][2];
+						treeNodes[l4][1]    = treeNodes[l4][3];
+					}
+					for (l4=0; l4<taxonCounter-2; l4=l4+1)
+					{
+						bestCladesInfo[l4][0]= cladesInfo[l4][2];
+						bestCladesInfo[l4][1]= cladesInfo[l4][3];
+						cladesInfo[l4][0]    = cladesInfo[l4][2];
+						cladesInfo[l4][1]    = cladesInfo[l4][3];
+					}
+					if (verbFlag)
+					{
+						OpenWindow (TREEWINDOW, {{"Inferred_Tree"}});
+						fprintf (stdout, "\n\tRestarting NNI on the better tree.");
+					}
+					l = 0;
+					while (cladesInfo[l][1])
+					{
+						l = l+1;
+					}				
+					l2 = -1;
+					break;
+				}		
+			}		
+			else
+			{
+				dummy = SendOffTreeJob (1);
+			}
+		}
+	}
+
+	if ((starDecomposition==0)&&(MPI_NODE_COUNT>1))
+	{
+		inBestValue = bestValue;
+		while (1)
+		{
+			for (nodeCounter = 0; nodeCounter < MPI_NODE_COUNT-1; nodeCounter = nodeCounter+1)
+			{
+				if (MPINodeState[nodeCounter]==1)
+				{
+					fromNode = ReceiveJobs (0,1);
+					break;	
+				}
+			}
+			if (nodeCounter == MPI_NODE_COUNT-1)
+			{
+				break;
+			}
+		}	
+		if (bestValue>inBestValue)
+		{
+			l = 0;
+			while (cladesInfo[l][1])
+			{
+				l = l+1;
+			}				
+			l2 = -1;
+			continue;
+		}
+	}	
+	break;
+}
+
+
+if (nniDidBetter)
+{
+	for (l=2*taxonCounter-2;l>=0;l=l-1)
+	{
+		treeNodes[l][0]=bestTreeNodes[l][0];
+		treeNodes[l][1]=bestTreeNodes[l][1];
+	}
+	for (l=0; l<taxonCounter-2; l=l+1)
+	{
+		cladesInfo[l][0]=bestCladesInfo[l][0];
+		cladesInfo[l][1]=bestCladesInfo[l][1];
+	}
+	if (verbFlag)
+	{
+		fprintf (stdout,"\n\n\t Improved NNI ", Format(taxonCounter,0,0)," taxa tree is ", bestTree, " with log likelihood of ", bestValue);
+	}
+}
diff --git a/res/TemplateBatchFiles/doSPRSwap.bf b/res/TemplateBatchFiles/doSPRSwap.bf
new file mode 100644
index 0000000..6b4dcec
--- /dev/null
+++ b/res/TemplateBatchFiles/doSPRSwap.bf
@@ -0,0 +1,133 @@
+l = 0;
+while (cladesInfo[l][1])
+{
+	l = l+1;
+}
+
+if (verbFlag)
+{
+	fprintf (stdout, "\n\n\tPerforming subtree pruning and regrafting on the best tree so far.\n\n");
+}
+nniDidBetter = 0;
+for (l2 = 0; l2 < l; l2=l2+1)
+{
+	dummy = splitCladesOnIBranch (filteredData.species,filteredData.species+l2);
+	l3s = 0;
+	l3f = 2;
+	if ((splitTreeInfo[0][1]==1)&&(splitTreeInfo[0][3]==1))
+	{
+		l3s = 2;
+		l3f = 4;
+	}
+	
+	for (l3=l3s; l3<l3f; l3=l3+1)
+	{
+		l4 = 0;
+		while (splitTreeInfo[l4+1][2*l3+1])
+		{
+			/* check for degeneracies 
+			if ((l3==1)&&(splitTreeInfo[0][1]==1)&&(splitTreeInfo[0][3]==1))
+			{
+				break;
+			}*/
+			if (l3<2)
+			{
+				dummy = doSPRSwap (2,3,l3,l4,filteredData.species);
+			}
+			else
+			{
+				dummy = doSPRSwap (0,1,l3,l4,filteredData.species);								
+			}
+			
+			thisTree = TreeMatrix2TreeString (2,0);
+			if (verbFlag)
+			{
+				fprintf (stdout, "\n\tSPR tree ",thisTree);
+			}
+			Tree    Inferred_Tree = thisTree;
+			if (haveTreeConstraint)
+			{
+				if ((Inferred_Tree<=_topologyPattern) == 0)
+				{
+					if (verbFlag)
+					{
+						fprintf (stdout, " => Rejected by the topology constraint.");
+					}
+					l4 = l4+1;
+					continue;
+				}
+				else
+				{
+					if (verbFlag)
+					{
+						fprintf (stdout, " => Accepted by the topology constraint.");
+					}
+				}
+			}
+			if (starDecomposition)
+			{
+				LikelihoodFunction lf = (filteredData, Inferred_Tree);
+			}		
+			else
+			{
+				LikelihoodFunction lf = (smallerFilter, Inferred_Tree);
+			}
+			Optimize (res,lf);
+			if (verbFlag)
+			{
+				fprintf (stdout, " => ", res[1][0]);
+			}
+			if (res[1][0]>bestValue)
+			{	
+				nniDidBetter = 1;
+				bestValue = res[1][0];
+				bestTree = thisTree;
+				for (l4=2*taxonCounter-2;l4>=0;l4=l4-1)
+				{
+					bestTreeNodes[l4][0]= treeNodes[l4][2];
+					bestTreeNodes[l4][1]= treeNodes[l4][3];
+					treeNodes[l4][0]    = treeNodes[l4][2];
+					treeNodes[l4][1]    = treeNodes[l4][3];
+				}
+				for (l4=0; l4<taxonCounter-2; l4=l4+1)
+				{
+					bestCladesInfo[l4][0]= cladesInfo[l4][2];
+					bestCladesInfo[l4][1]= cladesInfo[l4][3];
+					cladesInfo[l4][0]    = cladesInfo[l4][2];
+					cladesInfo[l4][1]    = cladesInfo[l4][3];
+				}
+				if (verbFlag)
+				{
+					OpenWindow (TREEWINDOW, {{"Inferred_Tree"}});
+					fprintf (stdout, "\n\tRestarting SPR on the better tree.");
+				}
+				l = 0;
+				while (cladesInfo[l][1])
+				{
+					l = l+1;
+				}				
+				l2 = -1;
+				l3 = l3f;
+				break;
+			}
+			l4 = l4+1;
+		}
+	}
+}
+if (nniDidBetter)
+{
+	for (l=Rows(bestTreeNodes)-1;l>=0;l=l-1)
+	{
+		treeNodes[l][0]=bestTreeNodes[l][0];
+		treeNodes[l][1]=bestTreeNodes[l][1];
+	}
+	for (l=0; l<Rows(bestCladesInfo); l=l+1)
+	{
+		cladesInfo[l][0]=bestCladesInfo[l][0];
+		cladesInfo[l][1]=bestCladesInfo[l][1];
+	}
+	if (verbFlag)
+	{
+		fprintf (stdout,"\n\n\t Improved SPR ", Format(taxonCounter,0,0)," taxa tree is ", bestTree, " with log likelihood of ", bestValue);
+	}
+}
diff --git a/res/TemplateBatchFiles/files.lst b/res/TemplateBatchFiles/files.lst
new file mode 100644
index 0000000..01e42a8
--- /dev/null
+++ b/res/TemplateBatchFiles/files.lst
@@ -0,0 +1,102 @@
+"","Perform a maximum likelihood analysis on a single file given a single tree.","!Basic Analyses";
+"ACD","Analyse codon data with a variery of standard models using given tree.","AnalyzeCodonData.bf";
+"AD","Analyse nucleotide or aminoacid data with a variery of standard models using given tree.","AnalyzeNucProtData.bf";
+"ADN","Analyse di-nucleotide data with a variery of standard models using given tree.","AnalyzeDiNucData.bf";
+"AFD","Analyse nucleotide data with a variery of standard models using given tree, estimating equilibrium frequencies as parameters","AnalyzeNucDataFreq.bf";
+"","Perform codon-based positive selection tests using the models of Kosakovsky Pond and Muse (2005).","!Codon Selection Analyses";
+"ANA","Run a selection analysis.","dNdSRateAnalysis.bf";
+"BVA","Run a selection analysis using a general discrete bivariate (dN AND dS) distribution; the appropriate number of rate classes is determined automatically.","BivariateCodonRateAnalysis.bf";
+"CMP","Use a series of LR tests to decide if dN and dS rate distributions are the same or different between two codon alignments.","dNdSDistributionComparison.bf";
+"BRP","Interpret bivariate codon rate analysis results.","CodonBivariateRateProcessor.bf";
+"RPC","Interpret analysis results.","dNdSResultProcessor.bf";
+"","Various tools for checking subdivision of sequences into sub-populations (e.g. HIV-1 compartmentalization), selection operating along the segregating branch etc.","!Compartmentalization";
+"AI","Peter Simmonds' Association Index (AI).","SimmondsAI.bf";
+"BDN","Fit several dN/dS to branch classes, based on a pre-partitioned tree.","BranchClassDNDS.bf";
+"BSEL","Split a tree into two clades (compartments) and a separating branch and test for equality of dN/dS between compartments and for selection along the separating branch using a series of Likelihood Ratio Tests.","SelectionLRT.bf";
+"CORR","Assess the correlation between phylogenetic and compartment segregation using generalized correlation coefficients and permutation tests.","TreeCorrelationCoefficients.bf"; 
+"FST","Compute various measures of F_ST and (optionally) perform permutation tests.","F_ST.bf";
+"SM","Peform a Slatkin-Maddison test for the number migrations.","SlatkinMaddison.bf";
+"TC","Test whether a group of sequences in a sample cluster together","TestClade.bf";
+"","Tools for manipulating sequence files.","!Data File Tools";
+"ALN","Align coding sequences to reference (assuming star topology) using protein translations. The analysis will try to detect appropriare reading frames and fix some frameshifts. Designed with within-patient HIV sequences in mind.","SeqAlignment.bf";
+"CALN","Align coding sequences to reference (assuming star topology) using a codon-based dynamic programming algorithm (good for fixing multiple frameshifts). Designed with within-patient HIV sequences in mind.","SeqAlignmentCodon.bf";
+"PALN","Align anino-acid sequences to reference (assuming star topology).","SeqAlignmentProt.bf";
+"NALN","Align nucleotide sequences to reference (assuming star topology). Designed with whole-genome HIV sequences in mind.","SeqAlignmentNuc.bf";
+"CLG","Remove 'gappy' sites from alignments based on a user-specified gap threshold.","CleanGaps.bf";
+"CLN","Convert sequence names to HyPhy valid identifiers if needed and replace stop codons with gaps in codon data if any are present.","CleanStopCodons.bf";
+"CLST","Partition sequences into clusters based on a distance matrix.","ClusterByDistanceRange.bf";
+"CONV","Translate an in-frame codon alignment to proteins.","CodonToProtein.bf";
+"DTR","Read sequence data (#,PHYLIP,NEXUS) and convert to a different format","ConvertDataFile.bf";
+"MH","Merge two datafiles by combining sites (horizontal merge).","MergeSites.bf";
+"MV","Merge two datafiles by combining sequences (vertical merge).","MergeSequences.bf";
+"PDF","Read sequence data, select a contiguous subset of sites and save it to another datafile.","PartitionDataFile.bf";
+"RMV","Remove sequences with stop codons from the data.","StripStopCodons.bf";
+"","Miscellaneous items.","!Miscellaneous";
+"FAA","Fit a multiple fitness class model to amino acid data.","FitnessAAModels.bf";
+"KH","Perform a Kishino-Hasegawa test on two competing phylogenies","KHTest.bf";
+"LZ","Compute Lempel-Ziv complexity and entropy of (possibly unaligned) sequences","LZ_Complexity.bf";
+"MCC","Compare mean within-clade branch length or pairwise divergence between two or more non-nested cladesd in a tree","TestCladeMeans.bf";
+"PHB","Run an example file from our book chapter in 'The Phylogentic Handbook' (2nd edition).","Phylohandbook.bf";
+"RBLE","Use a series of random effects branch-site models to perform robust model-averaged branch length estimation under a codon model with episodic selection.","BranchSiteRELMultiModel.bf";
+"RED","Replace sufficiently close sequence with their MRCA","ReduceDataSetMatrix.bf";
+"SNS","Parse a codon alignment for ambiguous codons and output a complete list/resolutions/syn and ns counts by sequence/position","SandNSAmbigs.bf";
+"SW","Perform a sliding window analysis of sequence data.","SlidingWindowAnalysis.bf";
+"UB","Obtain an upper bound on the likelihood score of a dataset.","UpperBound.bf";
+"","Compare various models applied to a dataset/tree combination.","!Model Comparison";
+"COD","Compare all 203 reversible nucleotide models composed with MG94 to extend them to codon data, and perform LRT and AIC model selection.","CodonModelCompare.bf";
+"MGvsGY","Compare the fits of MG94 and GY94 models (crossed with an arbitrary nucleotide bias) on codon data.","MGvsGY.bf";
+"MT","Select an evolutionary model for nucleotide data, using the methods of 'ModelTest' - a program by David Posada and Keith Crandall.","ModelTest.bf";
+"NUC","Compare all 203 reversible nucleotide models and perform LRT and AIC model selection.","NucModelCompare.bf";
+"Protein","Compare the fit of several amino-acid substitution models to an alignment using AIC and c-AIC.","AAModelComparison.bf";
+"","Tools for data analysis and pattern extraction based on kernel technqiues.","!Kernel Analysis Tools";
+"KMEANS","GA driven kernel k-means clustering.","Kernel_k_means.bf";
+"KPCA","Kernel principal component analysis.","Kernel_PCA.bf";
+"","Molecular Clock Tests.","!Molecular Clock";
+"DTMC","Test for the presence of a global molecular clock with DATED sequences. Evolutionary rates and dates for internal nodes are estimated as well. This analysis is effectively an extended version of Andrew Rabmaut's TipDate methodogoly.","DatedTipsMolecularClock.bf";
+"MCLK","Test for the presence of a global molecular clock on the tree using its root (the resulting clock tree is unrooted, but one of the root branches can be divided in such a way as to enforce the clock).","MolecularClock.bf";
+"LCLK","Test for the presence of a local molecular clock. Every subtree of the given tree is subjected to the clock constraint, while the remainder of the tree is free of the clock constraint.","LocalMolClock.bf";
+"RCLK","Test for the presence of a global molecular clock on the tree. The tree is rooted at every possible branch.","MolClockAllRoots.bf";
+"RLXMC","Infer dates of ancestral nodes for a sample of DATED sequences using a rate-distribution genetic algorithm to allow for multiple substituion rates. This is a frequentist alternative to the relaxed clock analyses implemented by Drummond and Rambaut in BEAST. [MPI Enabled]","GADatedClock.bf";
+"RLXMCP","Process a .samples file generated with GADatedClock","GADatedClockProcessor.bf";
+"","Reconstruct a phylogenetic tree using either distance or ML based heuristic methods.","!Phylogeny Reconstruction";
+"CLST","Apply clustering methods for phylogeny reconstruction (UPGMA,WPGMA,complete or minimal linkage) to nucleotide, protein and codon data, using MLE of pairwise distances with user-selectable models. These methods produce trees with global molecular clock.","ClusterAnalysis.bf";
+"DIST","Generate a pairwise sequence distance matrix in PHYLIP format.","DistanceMatrix.bf";
+"NJ","Perform a phylogeny reconstuction for nucleotide, protein or codon data with user-selectable models using the method of neighbor joining.","NeighborJoining.bf";
+"NNI","Perform nearest neighbor branch swapping on a given tree, attempting to find a tree with a better likelihood score under the given evolutionary model.","BranchSwap.bf";
+"SA","Perform a phylogeny reconstuction for nucleotide, protein or codon data with user-selectable models using the method of sequential addition.","SequentialAddition.bf";
+"SD","Perform a phylogeny reconstuction for nucleotide, protein or codon data with user-selectable models using the method of star decomposition.","StarDecomposition.bf";
+"TS","Perform an exhaustive tree space search for nucleotide or protein data with user-selectable models. Should only be used for data sets with less than 10 taxa!","TopologySearch.bf";
+"TSC","Perform an exhaustive tree space search (subject to a topology contraint) for nucleotide or protein data with user-selectable models. Should only be used for data sets with less than 10 taxa!","TopologySearchConstrained.bf";
+"","Perform codon-based positive selection tests.","!Positive Selection";
+"BSREL","Use the random effects branch-site model (2010) to find lineages subject to episodic selection.","BranchSiteREL.bf";
+"BST","Use the improved branch-site REL method of Yang and Nielsen (2005) to look for episodic selection in sequences.","YangNielsenBranchSite2005.bf";
+"BT","Test whether a branch (or branches) in the tree evolves under different dN and dS than the rest of the tree.","TestBranchDNDS.bf";
+"BUSTED","Run the Branch-site Unrestricted Statistical Test for Episodic Diversification to test for evidence of episodic alignment-wide selective pressure","BUSTED.bf";
+"PSD","Test whether sites in two populations are evolving under different selective pressures.","CompareSelectivePressure.bf";
+"PSDI","Test whether sites in two populations are evolving under different selective pressures along internal tree branches.","CompareSelectivePressureIVL.bf";
+"NY","Test for positive selection using the approach of Nielsen and Yabg, by sampling global dN/dS from an array of distributions, and using Bayesian posterior to identify the sites with dN/dS>1.","NielsenYang.bf";
+"PSM","Test for positive selection using the approach of Nielsen and Yang, by sampling global dN/dS from an array of distributions, and using Bayesian posterior to identify the sites with dN/dS>1. Multiple subsets of one data set with shared dN/dS.","MFPositiveSelection.bf";
+"QSD","Quickly test for positive selection using several approaches.","QuickSelectionDetection.bf";
+"SSD","Use approximate likelihoods at a site to test for subtree specific selective pressure.","SubtreeSelectionComparison.bf";
+"DST","Perform a random effects (D)irectional (E)volution on (P)rotein (S)equences test to identify sites which evolve directionally towards a given residue [MPI enabled].","DirectionalREL.bf";
+"MEDS","Test for Episodic Directional Selection on a set of labeled branches","MEDS.bf";
+"","Test for recombination.","!Recombination";
+"GARD","Screen an alignment using GARD (requires an MPI environment).","GARD.bf";
+"GRDR","Process GARD results.","GARDProcessor.bf";
+"LHT","A Likelihood Ratio Test to detect conflicting phylogenetic signal Huelsenbeck and Bull, 1996. [Contributed by Olivier Fedrigo].","LHT.bf";� �
+"SBL","Search an alignment for a single breakpoint.","SingleBreakpointRecomb.bf";
+"SPL","Plot genetic distances (similarity) of one sequence against all others in an alignment, using a sliding window. Optionally, determine NJ-based clustering and bootstrap support in every window. This is a HyPhy adaptation of the excellent (but Windows only tool) SimPlot (and/or VarPlot) written by Stuart Ray (http://sray.med.som.jhmi.edu/SCRoftware/simplot/)","SimilarityPlot.bf";
+"","Test for selection in presence of recombination.","!Selection/Recombination";
+"FUBAR","Detect site-specific pervasive diversifying and purifying selection using the FUBAR (Fast Unbiased Bayesian AppRoximate) method on a multiple partition data set, e.g. produced by GARD.","FUBAR.bf";
+"MEME","Detect site-specific episodic diversifying selection using MEME on a multiple partition data set, e.g. produced by GARD.","MEME_mf.bf";
+"SLAC/FEL","Detect site-specific diversifying/purifying selection using SLAC or FEL on a multiple partition data set, e.g. produced by GARD.","QuickSelectionDetectionMF.bf";
+"REL","Detect site-specific selection using REL on a multiple partition data set, e.g. produced by GARD.","dNdSRateAnalysis_MF.bf";
+"PARRIS","A PARtitioning approach for Robust Inference of Selection (written by K. Scheffler)","PARRIS.bf";
+"","Perform relative rate tests.","!Relative Rate";
+"RR","Use relative rate test on three species and a variety of standard models","RelativeRate.bf";
+"PRR","Using the model and the outgroup provided by the user, perform relative rate tests with all possible pair of species from the data file. ","PairwiseRelativeRate.bf";
+"","Perform relative ratio tests.","!Relative Ratio";
+"RRT","Use relative ratio test on 2 datasets and a variety of standard models","RelativeRatio.bf";
+"PRRTI","Given a list of files (and optinally genetic code tables), perform relative ratio tests on all possible pair of the data files.","PairwiseRelativeRatio.bf";
+"","Various tools for estimating the distribution of substitution rates.","!Substitution Rates";
+"SR","DNARates like site specific rate estimation. Other model parameters are inferred from the entire alignment.","SiteRates.bf";
diff --git a/res/TemplateBatchFiles/globalChecker.ibf b/res/TemplateBatchFiles/globalChecker.ibf
new file mode 100644
index 0000000..5df018c
--- /dev/null
+++ b/res/TemplateBatchFiles/globalChecker.ibf
@@ -0,0 +1,26 @@
+pCount = 0;
+if (ds.species>2)
+{
+	dummyTS = "";
+	dummyTS * 256;
+	dummyTS * "(";
+	for (k=0; k<ds.species; k=k+1)
+	{
+		GetString (sName, ds, k);
+		if (k)
+		{
+			dummyTS * ",";
+		}
+		dummyTS * sName;
+	}
+	dummyTS * ")";
+	dummyTS * 0;
+	
+	Tree dummyT 					= dummyTS;
+	LikelihoodFunction lf		    = (filteredData, dummyT);
+	GetString (params, lf, -1);
+	globalParamList	= params["Global Independent"];
+	pCount 			= Columns (globalParamList);
+	Export    (lf_prefix, lf);
+	lf_prefix = lf_prefix ^ {{"Tree dummyT.+",""}};
+}
diff --git a/res/TemplateBatchFiles/heuristicMethodNPBootstrap.bf b/res/TemplateBatchFiles/heuristicMethodNPBootstrap.bf
new file mode 100644
index 0000000..465c9ed
--- /dev/null
+++ b/res/TemplateBatchFiles/heuristicMethodNPBootstrap.bf
@@ -0,0 +1,273 @@
+
+IS_NPBOOTSTRAP_AVAILABLE = 1;
+
+function BootStrapFunction (bsIterates, tabulatedFileName, parametricOrNot)
+{
+
+	ChoiceList (bsTreeFormat,"Bootstrap Summary Tree String Format",1,SKIP_NONE,
+				"Proportions","Branch lengths of internal nodes reflect the proportion of times the clade starting at that node was contained in replicate trees. Tip branches have length 1.0.",
+				"Counts","Branch lengths of internal nodes reflect the number of times the clade starting at that node was contained in replicate trees. Tip branches have length equal to the total number of replicates.");
+	if (bsTreeFormat<0)
+	{
+		return 0.0;
+	}
+	DataSetFilter filteredData2 = CreateFilter (ds,1,"","");
+	nm = ExtractCladeInfo (saveTreeNodes);
+	for (bsCounter=1;bsCounter<=bsIterates;bsCounter=bsCounter+1)
+	{
+		fprintf (stdout,"\nIteration ",Format(bsCounter,0,0),"/",Format(bsIterates,0,0)," ");
+		DataSetFilter filteredData = Bootstrap (filteredData2,1);
+		p = InferTreeTopology (0.0);
+		nm2 = ExtractCladeInfo (bestTreeNodes);
+		p = MatchClades (nm2,nm);
+		treeString = TreeMatrix2TreeString (0,0);
+		fprintf (tabulatedFileName, treeString,";\n");
+
+	}
+	treeNodes = saveTreeNodes;
+	i = 0;
+	j = 0;
+	n = treeNodes[0][1];
+	if (bsTreeFormat<.5)
+	{
+		while (n)
+		{
+			if (treeNodes[i][0]>=filteredData.species)
+			{
+				treeNodes[i][2] = nm[0][j]/bsIterates;
+				j=j+1;
+			}
+			else
+			{
+				treeNodes[i][2] = 1.0;
+			}
+			n = treeNodes[i][1];
+			i = i+1;
+		}
+	}
+	else
+	{
+		while (n)
+		{
+			if (treeNodes[i][0]>=filteredData.species)
+			{
+				treeNodes[i][2] = nm[0][j];
+				j=j+1;
+			}
+			else
+			{
+				treeNodes[i][2] = bsIterates;
+			}
+			n = treeNodes[i][1];
+			i = i+1;
+		}
+	}
+
+	treeString = TreeMatrix2TreeString (0,1);
+	UseModel(USE_NO_MODEL);
+	Tree Bootstrap_Tree = treeString;
+	
+	if (bsTreeFormat<.5)
+	{
+		fprintf (stdout,"\n\n************* Bootstrapping summary tree (with ",Format(bsIterates,4,0)," iterates). \nInternal branch 'lengths' indicate the proportion of replicate trees which contained the clade starting at that node.\n\n", treeString,"\n");		
+		fprintf (tabulatedFileName,"\n\nBootstrapping summary tree (with ",Format(bsIterates,4,0)," iterates).  \nInternal branch 'lengths' indicate the proportion of replicate trees which contained the clade starting at that node.\n\n", treeString);		
+	}
+	else
+	{
+		fprintf (stdout,"\n\n************* Bootstrapping summary tree (with ",Format(bsIterates,4,0)," iterates). \nInternal branch 'lengths' indicate the number of times the clade starting at that node was contained in replicate trees.\n\n", treeString,"\n");		
+		fprintf (tabulatedFileName,"\n\nBootstrapping summary tree (with ",Format(bsIterates,4,0)," iterates).  \nInternal branch 'lengths' indicate the number of times the clade starting at that node was contained in replicate trees.\n\n", treeString);		
+	}
+
+	return 0;
+}
+
+/* ____________________________________________*/
+
+function  ExtractCladeInfo (treeNodeMatrix)
+{
+	i = 0;
+	n = treeNodeMatrix[0][1]; 
+	s = 0;
+	matrixOfClades = {filteredData.species+1,filteredData.species-1};
+	while (n)
+	{
+		if (treeNodeMatrix[i][0]>=filteredData.species)
+		{
+			j=i-1;
+			m = 1;
+			while (treeNodeMatrix[j][1]>n)
+			{
+				if (treeNodeMatrix[j][0]<filteredData.species)
+				{
+					m = m+1;
+					matrixOfClades[m][s]=treeNodeMatrix[j][0];
+				}
+				j = j-1;
+				if (j<0)
+				{
+					break;
+				}
+			}
+			matrixOfClades[1][s]=m-1;
+			s = s+1;
+		}
+		i = i+1;
+		n = treeNodeMatrix[i][1];
+	}
+	return matrixOfClades;
+}
+
+/* ____________________________________________*/
+/* see if clades in matrix2 exist in matrix1 and if so, increment the counters
+   for relevant clades.
+*/
+
+function   MatchClades(treeNodeMatrix1,treeNodeMatrix2)
+{
+	n = Columns(treeNodeMatrix2);
+	for (i=0;i<n;i=i+1)
+	{
+		m = treeNodeMatrix1[1][i];
+		if (m==0)
+		{
+			break;
+		}
+		for (j=0;j<n;j=j+1)
+		{
+			if (treeNodeMatrix2[1][j]==m)
+			/*might work*/
+			{
+				for (s=m+1; s>1 ; s=s-1)
+				/* for each node in the clade */
+				{
+					k = treeNodeMatrix1[s][i];
+					for (p=m+1; p>1; p=p-1)
+					{
+						if (treeNodeMatrix2[p][j]==k)
+						{
+							break;
+						}
+					}
+					if (p==1)
+					{
+						break;
+					}
+				}
+				if (s==1)
+				{
+					/*fprintf (stdout, "\n  ",j);*/
+					treeNodeMatrix2[0][j] = treeNodeMatrix2[0][j]+1;
+					break;
+				}
+			}
+		}
+		if (j==n)
+		/* clade not found, try complement */
+		{
+			t = filteredData.species-m;
+			if (m==0)
+			{
+				break;
+			}
+			for (j=0;j<n;j=j+1)
+			{
+				if (treeNodeMatrix2[1][j]==t)
+				/*might work*/
+				{
+					for (s=m+1; s>1 ; s=s-1)
+					/* for each node in the clade */
+					{
+						k = treeNodeMatrix1[s][i];
+						for (p=t+1; p>1; p=p-1)
+						{
+							if (treeNodeMatrix2[p][j]==k)
+							{
+								break;
+							}
+						}
+						if (p>1)
+						{
+							break;
+						}
+					}
+					if (s==1)
+					{
+						/*fprintf (stdout, "\nC ",j,"(",m,")");*/
+						treeNodeMatrix2[0][j] = treeNodeMatrix2[0][j]+1;
+						break;
+					}
+				}
+			}		
+		}
+	}
+	return 1.0;
+}
+
+/* ____________________________________________*/
+
+function TreeMatrix2TreeString (levelIndex, doLengths)
+{
+	treeString = "";
+	p = 0;
+	k = 0;
+	m = treeNodes[0][levelIndex+1];
+	n = treeNodes[0][levelIndex];
+
+	while (m)
+	{	
+		if (m>p)
+		{
+			if (p)
+			{
+				treeString = treeString+",";
+			}
+			for (j=p;j<m;j=j+1)
+			{
+				treeString = treeString+"(";
+			}
+		}
+		else
+		{
+			if (m<p)
+			{
+				for (j=m;j<p;j=j+1)
+				{
+					treeString = treeString+")";
+				}
+			}	
+			else
+			{
+				treeString = treeString+",";
+			}	
+		}
+		if (n<filteredData.species)
+		{
+			GetString (nodeName, filteredData, n);
+			treeString = treeString+nodeName;
+		}
+		if (doLengths>.5)
+		{
+			treeString = treeString+":"+treeNodes[k][levelIndex+2];
+		}
+		k=k+1;
+		p=m;
+		n=treeNodes[k][levelIndex];
+		m=treeNodes[k][levelIndex+1];
+	}
+
+	for (j=m;j<p;j=j+1)
+	{
+		treeString = treeString+")";
+	}
+	
+	if (doLengths<0.5)
+	{
+		return RerootTree(treeString,0);
+	}
+	else
+	{
+		return treeString;
+	}
+}
+
+
diff --git a/res/TemplateBatchFiles/last.date b/res/TemplateBatchFiles/last.date
new file mode 100644
index 0000000..0faf1ff
--- /dev/null
+++ b/res/TemplateBatchFiles/last.date
@@ -0,0 +1 @@
+2008/3/20 3:57
diff --git a/res/TemplateBatchFiles/lib2014/IOFunctions.bf b/res/TemplateBatchFiles/lib2014/IOFunctions.bf
new file mode 100644
index 0000000..ead0c03
--- /dev/null
+++ b/res/TemplateBatchFiles/lib2014/IOFunctions.bf
@@ -0,0 +1,125 @@
+LoadFunctionLibrary ("ReadDelimitedFiles");
+
+function io.readCodonDataSet (dataset_name) {
+    ExecuteAFile (HYPHY_LIB_DIRECTORY + "TemplateBatchFiles" 
+                                      + DIRECTORY_SEPARATOR 
+                                      + "TemplateModels" 
+                                      + DIRECTORY_SEPARATOR 
+                                      + "chooseGeneticCode.def");
+    
+    ExecuteCommands ("DataSet `dataset_name` = ReadDataFile (PROMPT_FOR_FILE);");
+    return {"code": _Genetic_Code, "stop" : GeneticCodeExclusions, "file" : LAST_FILE_PATH, "sequences" : Eval ("`dataset_name`.species")};
+}
+
+function io.getTreeString (look_for_newick_tree) {
+
+    UseModel (USE_NO_MODEL);
+
+    if(look_for_newick_tree == 0) {
+      IS_TREE_PRESENT_IN_DATA = 0;
+    }
+
+    ExecuteAFile (HYPHY_LIB_DIRECTORY + "TemplateBatchFiles" 
+                                      + DIRECTORY_SEPARATOR 
+                                      + "queryTree.bf");
+    return treeString;
+}
+
+function io.checkAssertion (statement, error_msg) {
+    ExecuteCommands ("assert (`statement`, error_msg)");
+    return None;
+}
+
+function io.reportProgressMessage (analysis, text) {
+    if (Abs (analysis)) {
+        fprintf (stdout, "[`analysis`] `text` \n");
+    } else {
+        fprintf (stdout, text, "\n");
+    }
+    return None;
+}
+
+function io.reportProgressMessage (analysis, text) {
+    fprintf (stdout, "[`analysis`] `text` \n");
+    return None;
+}
+
+function io.displayAnalysisBanner (analysis_info) {
+    if (io.hasStringKey ("info", analysis_info)) {
+        io.printAndUnderline ("Analysis Description", "=");
+        fprintf (stdout, io.formatLongStringToWidth (analysis_info["info"], 72), "\n");
+    }
+    if (io.hasStringKey ("requirements", analysis_info)) {
+        io.printAndUnderline ("Requirements", "=");
+        fprintf (stdout, io.formatLongStringToWidth (analysis_info["requirements"], 72), "\n");
+    }
+    if (io.hasStringKey ("reference", analysis_info)) {
+        io.printAndUnderline ("Citation", "=");
+        fprintf (stdout, io.formatLongStringToWidth (analysis_info["reference"], 72), "\n");
+    }
+    if (io.hasStringKey ("authors", analysis_info)) {
+        io.printAndUnderline ("Written by", "=");
+        fprintf (stdout, io.formatLongStringToWidth (analysis_info["authors"], 72), "\n");
+    }   
+    if (io.hasStringKey ("contact", analysis_info)) {
+        io.printAndUnderline ("Contact Information", "=");
+        fprintf (stdout, io.formatLongStringToWidth (analysis_info["contact"], 72), "\n");
+    }   
+    if (io.hasStringKey ("version", analysis_info)) {
+        io.printAndUnderline ("Analysis Version", "=");
+        fprintf (stdout, io.formatLongStringToWidth (analysis_info["version"], 72), "\n");
+    }   
+    fprintf (stdout, "\n");
+   
+    return None;
+}
+
+function io.hasStringKey (key, dict) {
+    return Type (dict[key]) == "String";
+}
+
+function io.spoolLF (lf_id, trunk_path, tag) {
+    ExecuteCommands ("Export (__lf_spool, `lf_id`);");
+    if (tag == None) {
+        tag = lf_id;
+    }
+    fprintf (trunk_path + "." + tag + ".bf", CLEAR_FILE, __lf_spool);
+}
+
+function io.printAndUnderline (string, char) {
+    fprintf (stdout, "\n", string, "\n");
+    for (k = 0; k < Abs (string); k+=1) {
+        fprintf (stdout, char[0]);
+    }
+    fprintf (stdout, "\n");
+}
+
+function io.formatLongStringToWidth (string, width) {
+    words = splitOnRegExp (string, "[\\ \n]+");
+    lines = {};
+    
+    current_line = "";
+    words_in_current_line = 0;
+    for (i = 0; i < Abs (words); i+=1 ) {
+        if (words_in_current_line == 0) {
+            current_line = words[i];
+            words_in_current_line = 1;
+        } else {
+            if (Abs (current_line) + Abs (words[i]) + 1 <= width) {
+                words_in_current_line += 1;
+                current_line += " " + words[i];
+            } else {
+                lines + current_line;
+                words_in_current_line = 0;
+                current_line = "";
+                i = i - 1;
+            }
+        } 
+    }
+    
+    if (words_in_current_line) {
+        lines + current_line;
+    }
+    
+    return Join ("\n", lines);
+}
diff --git a/res/TemplateBatchFiles/lib2014/UtilityFunctions.bf b/res/TemplateBatchFiles/lib2014/UtilityFunctions.bf
new file mode 100644
index 0000000..2dc6ebb
--- /dev/null
+++ b/res/TemplateBatchFiles/lib2014/UtilityFunctions.bf
@@ -0,0 +1,108 @@
+LoadFunctionLibrary ("GrabBag");
+LoadFunctionLibrary ("IOFunctions.bf");
+
+function utility.promptForGeneticCodeAndAlignment (dataset_name, datafilter_name) {
+    data_info = io.readCodonDataSet (dataset_name);
+    ExecuteCommands ("DataSetFilter `datafilter_name` = CreateFilter (`dataset_name`, 3, , , data_info[\"stop\"])");
+    io.checkAssertion ("`datafilter_name`.sites*3==`dataset_name`.sites","The input alignment must not contain stop codons");
+    data_info ["sites"] = Eval ("`datafilter_name`.sites");
+    data_info ["dataset"] = dataset_name;
+    data_info ["datafilter"] = datafilter_name;
+    
+    return data_info;
+}
+
+
+function utility.associativeListToJSON(associative_list) {
+
+    // Replace inf and nan with 1+e9999 and null, respectively
+
+    // SW20150122 TODO: Add recursion
+    keys = Rows(associative_list);
+    for (_k = 0; _k < Columns(keys); _k = _k+1) {
+      current_val = associative_list[keys[_k]];
+      if(Type(current_val) == "String") {
+			  current_val = current_val^{{"inf"}{"1e999"}}; /* search and replace */
+			  current_val = current_val^{{"-nan"}{"null"}}; /* search and replace */
+        associative_list[keys[_k]] = current_val;
+      }
+    }
+
+    return associative_list;
+}
+
+function utility.defineFrequencies (datafilter_name) {
+    HarvestFrequencies	          (nuc3, *datafilter_name, 3, 1, 1);
+    nucCF						= CF3x4	(nuc3, GeneticCodeExclusions);
+    codon3x4					= BuildCodonFrequencies (nucCF);
+    return {"raw": nuc3,
+            "nucleotide": nucCF,
+            "codon": codon3x4};
+}
+
+function utility.loadAnnotatedTopology (look_for_newick_tree) {
+    tree_string = io.getTreeString(look_for_newick_tree);
+    Topology     T = tree_string;
+    GetInformation (modelMap, T);
+    utility.toggleEnvVariable ("INCLUDE_MODEL_SPECS", 1);
+    T.str = "" + T;
+    utility.toggleEnvVariable ("INCLUDE_MODEL_SPECS", None);
+    
+    return {"string"     : Format (T,1,0),
+            "annotated_string" : T.str ,
+            "model_map"  : modelMap,
+            "model_list" :  Columns (modelMap)};
+}
+
+function utility.callFunction (id, arguments) {
+    if (Type (id) == "String") {
+        if (Type (arguments) == "AssociativeList") {
+            return Eval ("`id` (" + Join (",", arguments) + ")");	
+        }
+        return Eval ("`id`()");
+    } 
+    return None;
+}
+
+function utility.isFunction (id) {
+	if (Type (id) == "String" && Abs (id) > 0) {
+		ExecuteCommands ("GetString (__funcInfo, `id`, -1)");
+		if (Type (__funcInfo) == "AssociativeList") {
+			return Type (__funcInfo["ID"]) == "String" && Type (__funcInfo["Arguments"]) == "Matrix" && Type (__funcInfo["Body"]) == "String";
+		}
+	}
+	return 0;
+}
+
+function utility.toggleEnvVariable (var, value) {
+	if (value != None) {
+		utilityFunction.toggleEnvVariable.__stash = Eval (var);
+		*var = value;
+	} else {
+		*var = utilityFunction.toggleEnvVariable.__stash;
+	}
+}
+
+lfunction utility.checkCacheFile (data_info) {
+    cache_info = {};
+    cache_info["file"] = data_info["file"] + ".hyphy_cache";
+    if (!(cache_info["file"])) {
+        fscanf (cache_info["file"], "Raw", _cache);
+        cache_info["cache"] = Eval (_cache);
+    } else {
+         cache_info["cache"] = {};
+    }
+    return cache_info;
+}   
+
+lfunction utility.array.find (array, value) {
+    d = Rows (array) * Columns (array);
+    for (i = 0; i < d; i+=1) {
+        if (array [i] == value) {
+            return i;
+        }
+    }
+    return -1;
+}
+
+
diff --git a/res/TemplateBatchFiles/lib2014/models/DNA.bf b/res/TemplateBatchFiles/lib2014/models/DNA.bf
new file mode 100644
index 0000000..5ee9494
--- /dev/null
+++ b/res/TemplateBatchFiles/lib2014/models/DNA.bf
@@ -0,0 +1,65 @@
+LoadFunctionLibrary ("terms.bf");
+LoadFunctionLibrary ("frequencies.bf");
+
+models.DNA.alphabet = {{"A","C","G","T"}};
+
+function models.DNA.generic.defineQMatrix (modelSpec, namespace) {
+	
+	__alphabet = modelSpec ["alphabet"];
+	assert (Type (__alphabet) == "Matrix" && Columns (__alphabet) == 4, "Unsupported or missing alphabet '" + __alphabet + "'");
+	
+	__modelType = modelSpec["type"];
+	if (Type (__modelType) == "None" || Type (__modelType) == "Number") {
+		__modelType = "global";
+	}
+	modelSpec["type"] = __modelType;
+	assert (__modelType == terms.local || __modelType == terms.global, "Unsupported or missing model type '" + __modelType + "'");
+	
+	__rate_function = modelSpec ["q_ij"];
+	assert (utility.isFunction (__rate_function), "Missing q_ij callback in model specification");
+
+	__time_function = modelSpec ["time"];
+	assert (utility.isFunction (__time_function), "Missing time callback in model specification");
+	
+	
+	__rate_matrix = {4,4};
+	__rate_matrix [0][0] = "";
+	__global_cache = {};
+	
+	
+	for (_rowChar = 0; _rowChar < 4; _rowChar +=1 ){
+		for (_colChar = _rowChar + 1; _colChar < 4; _colChar += 1) {
+			__rp = utility.callFunction (__rate_function, {"0": parameters.quote(__alphabet[_rowChar]), 
+															   "1": parameters.quote(__alphabet[_colChar]),
+															   "2": "namespace",
+															   "3": "__modelType"});
+															   
+            if (Abs (__rp[terms.rate_entry])) {			
+                parameters.declareGlobal (__rp[terms.global], __global_cache);
+                parameters.helper.copy_definitions (modelSpec["parameters"], __rp);
+                            
+                __rate_matrix [_rowChar][_colChar] = __rp[terms.rate_entry];
+                __rate_matrix [_colChar][_rowChar] = __rp[terms.rate_entry];
+                continue;
+            } 
+			__rate_matrix [_rowChar][_colChar] = "";
+		}	
+	}
+	
+	__rp = utility.callFunction (__time_function, {"0" : parameters.quote(__modelType)});
+	
+	if (Abs (__rp)) {
+		((modelSpec["parameters"])[terms.local])[terms.timeParameter ()] = __rp; 
+	    modelSpec [terms.rate_matrix] = parameters.addMultiplicativeTerm (__rate_matrix, __rp, 0);
+	} else {
+	    modelSpec [terms.rate_matrix] = __rate_matrix;
+	}
+	
+}
+
+function models.DNA.generic.time (option) {
+	return terms.default_time;
+}
+
+
+
diff --git a/res/TemplateBatchFiles/lib2014/models/DNA/GTR.bf b/res/TemplateBatchFiles/lib2014/models/DNA/GTR.bf
new file mode 100644
index 0000000..dce2d6c
--- /dev/null
+++ b/res/TemplateBatchFiles/lib2014/models/DNA/GTR.bf
@@ -0,0 +1,60 @@
+LoadFunctionLibrary ("../DNA.bf");
+LoadFunctionLibrary ("../parameters.bf");
+LoadFunctionLibrary ("../frequencies.bf");
+LoadFunctionLibrary ("../../UtilityFunctions.bf");
+
+function models.DNA.GTR.modelDescription (type) {
+
+    return {"alphabet" : models.DNA.alphabet,
+    		"description" : "The general time reversible (GTR) model of nucleotide substitution",
+    		"canonical" : 1, // is of the r_ij \times \pi_j form
+    		"reversible" : 1,
+    		terms.efv_estimate_name: terms.freqs.4x1,
+    		"parameters" : 	{
+    				"global" : {}, 
+    				"local" : {}
+    			},
+    		"type" : type,
+     		"get-branch-length" : "",
+    		"set-branch-length" : "models.generic.set_branch_length",
+    		"constrain-branch-length" : "models.generic.constrain_branch_length",
+       		"frequency-estimator" : "frequencies.empirical.nucleotide",
+    		"q_ij" : "models.DNA.GTR.generateRate",
+    		"time" : "models.DNA.generic.time",
+    		"defineQ" : "models.DNA.GTR.defineQ",
+    		"post-definition" : "models.generic.post.definition"
+    		};
+}
+
+
+function models.DNA.GTR.generateRate (fromChar, toChar, namespace, model_type) {
+    models.DNA.GTR.generateRate.p = {};
+    models.DNA.GTR.generateRate.p [model_type] = {};
+    
+	if (fromChar > toChar) {
+		 models.DNA.GTR.parameter_name = "theta_" + toChar + fromChar;
+	} else {
+	    models.DNA.GTR.parameter_name = "theta_" + fromChar + toChar;
+	}
+	
+	if (model_type == terms.global) {
+	    models.DNA.GTR.parameter_name = parameters.applyNameSpace (models.DNA.GTR.parameter_name, namespace); 
+	}
+	
+	(models.DNA.GTR.generateRate.p [model_type])[terms.nucleotideRate (fromChar, toChar)] = models.DNA.GTR.parameter_name;
+	 models.DNA.GTR.generateRate.p [terms.rate_entry] = models.DNA.GTR.parameter_name;
+	
+	return models.DNA.GTR.generateRate.p;
+}
+
+function models.DNA.GTR.defineQ (gtr, namespace) {
+
+	models.DNA.generic.defineQMatrix (gtr, namespace);
+	if (gtr ["type"] == terms.global) {
+		parameters.setConstraint (((gtr["parameters"])[terms.global])[terms.nucleotideRate ("A","G")], "1", "");
+	} 
+	if (gtr ["type"] == terms.local) {
+		parameters.setConstraint (((gtr["parameters"])[terms.local])[terms.nucleotideRate ("A","G")], "1", "");
+	}
+	return gtr;
+}
diff --git a/res/TemplateBatchFiles/lib2014/models/codon.bf b/res/TemplateBatchFiles/lib2014/models/codon.bf
new file mode 100644
index 0000000..b17dffc
--- /dev/null
+++ b/res/TemplateBatchFiles/lib2014/models/codon.bf
@@ -0,0 +1,103 @@
+LoadFunctionLibrary ("chooseGeneticCode", {"0" : "Universal"});
+
+function models.codon.map_code (genetic_code) {
+	return {"sense" : Columns (ComputeCodonCodeToStringMap (genetic_code)), 
+	        "stop"  : Columns (ComputeCodonCodeToStringMapStop (genetic_code)),
+	        "translation-table" : defineCodonToAAGivenCode (genetic_code) };
+}
+
+function models.codon.generic.defineQMatrix (modelSpec, namespace) {
+	
+	__base_alphabet = modelSpec ["bases"];
+	assert (Type (__base_alphabet) == "Matrix" && Columns (__base_alphabet) == 4, "Unsupported codon bases '" + __base_alphabet + "'");
+	
+	__alphabet      = modelSpec ["alphabet"];
+	// need at least one codon per amino-acid
+	
+	__dimension     = model.dimension (modelSpec);
+	
+	__stops         = modelSpec ["stop"];
+	__table         = modelSpec ["translation-table"];
+		
+	assert (Type (__alphabet) == "Matrix" && __dimension > 20 && __dimension + Columns (__stops) && Abs (__table) == 64, "Unsupported or missing alphabet '" + __alphabet + "' (stop codons :'" + __codons + "')");
+
+	__modelType = modelSpec["type"];
+	if (Type (__modelType) == "None" || Type (__modelType) == "Number") {
+		__modelType = "global";
+	}
+	modelSpec["type"] = __modelType;
+	assert (__modelType == terms.local || __modelType == terms.global, "Unsupported or missing model type '" + __modelType + "'");
+	
+	__rate_function = modelSpec ["q_ij"];
+	assert (utility.isFunction (__rate_function), "Missing q_ij callback in model specification");
+
+	__time_function = modelSpec ["time"];
+	assert (utility.isFunction (__time_function), "Missing time callback in model specification");
+		
+	__rate_matrix = {__dimension,__dimension};
+	__rate_matrix [0][0] = "";
+	__global_cache = {};
+	
+	
+	for (_rowChar = 0; _rowChar < __dimension; _rowChar +=1 ){
+		for (_colChar = _rowChar + 1; _colChar < __dimension; _colChar += 1) {
+			    
+            if (None == models.codon.diff (__alphabet[_rowChar], __alphabet[_colChar])) {
+                continue;
+            }
+        
+            __rp = utility.callFunction (__rate_function, {"0": parameters.quote(__alphabet[_rowChar]), 
+                                                           "1": parameters.quote(__alphabet[_colChar]),
+                                                           "2": "namespace",
+                                                           "3": "__modelType",
+                                                           "4": "__table"});
+            
+            
+            if (Abs (__rp[terms.rate_entry])) {
+                parameters.declareGlobal (__rp[terms.global], __global_cache);
+                parameters.helper.copy_definitions (modelSpec["parameters"], __rp);
+                __rate_matrix [_rowChar][_colChar] = __rp[terms.rate_entry];
+                __rate_matrix [_colChar][_rowChar] = __rp[terms.rate_entry];
+            }			
+		}	
+	}
+	
+	if (__modelType == "global") {
+	    __rp = utility.callFunction (__time_function, {"0" : parameters.quote(__modelType)});
+	
+        if (Abs (__rp)) {
+            ((modelSpec["parameters"])[terms.local])[terms.synonymous_rate] = __rp; 
+            modelSpec [terms.rate_matrix] = parameters.addMultiplicativeTerm (__rate_matrix, __rp, 0);
+        } else {
+            modelSpec [terms.rate_matrix] = __rate_matrix;
+        }
+    } else {
+        modelSpec [terms.rate_matrix] = __rate_matrix;
+    }
+	
+	return modelSpec;
+	
+}
+
+
+lfunction models.codon.diff (a,b) {
+    r = {"from" : None,
+         "to" : None,
+         "position" : None};
+    
+    for (i = 0; i < 3; i += 1) {
+        if (a[i] != b[i]) {
+            if (r["position"] != None) {
+                return None;
+            }
+            r["from"] = a[i];
+            r["to"] = b[i];
+            r["position"] = i;
+        }
+    }
+    
+    if (r ["position"] == None) {
+        return None;
+    }
+    return r;
+}
diff --git a/res/TemplateBatchFiles/lib2014/models/codon/MG_REV.bf b/res/TemplateBatchFiles/lib2014/models/codon/MG_REV.bf
new file mode 100644
index 0000000..c9afb57
--- /dev/null
+++ b/res/TemplateBatchFiles/lib2014/models/codon/MG_REV.bf
@@ -0,0 +1,109 @@
+LoadFunctionLibrary ("../codon.bf");
+LoadFunctionLibrary ("../DNA.bf");
+LoadFunctionLibrary ("../parameters.bf");
+LoadFunctionLibrary ("../frequencies.bf");
+LoadFunctionLibrary ("../../UtilityFunctions.bf");
+
+function models.codon.MG_REV.modelDescription (type, code) {
+
+    models.codon.MG_REV.modelDescription.codons = models.codon.map_code (code);
+    
+    return {"alphabet" : models.codon.MG_REV.modelDescription.codons["sense"],
+            "bases" : models.DNA.alphabet, 
+            "stop" : models.codon.MG_REV.modelDescription.codons["stop"],
+            "type" : type,
+            "translation-table" : models.codon.MG_REV.modelDescription.codons["translation-table"],
+    		"description" : "The Muse-Gaut 94 codon-substitution model coupled with the general time reversible (GTR) model of nucleotide substitution",
+    		"canonical"   : 0, // is NOT of the r_ij \times \pi_j form
+    		"reversible"  : 1,
+    		terms.efv_estimate_name: terms.freqs.CF3x4,
+    		"parameters" : 	{
+    				"global" : {}, 
+    				"local" : {}
+    			},
+    		"get-branch-length" : "",
+    		"set-branch-length" : "models.codon.MG_REV.set_branch_length",
+    		"constrain-branch-length" : "models.generic.constrain_branch_length",
+    		"frequency-estimator" : "frequencies.empirical.corrected.CF3x4",
+    		"q_ij" : "models.codon.MG_REV.generateRate",
+    		"time" : "models.DNA.generic.time",
+    		"defineQ" : "models.codon.MG_REV.defineQ",
+    		"post-definition" : "models.generic.post.definition"
+    		};
+}
+
+
+function models.codon.MG_REV.generateRate (fromChar, toChar, namespace, model_type, _tt) {
+
+	models.codon.MG_REV.generateRate.p = {};
+ 	models.codon.MG_REV.generateRate.diff = models.codon.diff (fromChar, toChar);
+ 	
+	
+	if (None != models.codon.MG_REV.generateRate.diff) {
+        models.codon.MG_REV.generateRate.p [model_type]   = {};
+        models.codon.MG_REV.generateRate.p [terms.global] = {};
+    
+        if (models.codon.MG_REV.generateRate.diff["from"] > models.codon.MG_REV.generateRate.diff["to"]) {
+            models.codon.MG_REV.nuc_rate = "theta_" + models.codon.MG_REV.generateRate.diff["to"] + models.codon.MG_REV.generateRate.diff["from"];
+        } else {
+            models.codon.MG_REV.nuc_rate = "theta_" + models.codon.MG_REV.generateRate.diff["from"] + models.codon.MG_REV.generateRate.diff["to"];
+        }
+    
+        models.codon.MG_REV.nuc_rate = parameters.applyNameSpace (models.codon.MG_REV.nuc_rate, namespace); 
+        (models.codon.MG_REV.generateRate.p [terms.global])[terms.nucleotideRate (models.codon.MG_REV.generateRate.diff["from"], models.codon.MG_REV.generateRate.diff["to"])] 
+                = models.codon.MG_REV.nuc_rate;
+        
+        if (_tt [fromChar] != _tt[toChar]) {
+            if (model_type == terms.global) {
+               models.codon.MG_REV.aa_rate  = parameters.applyNameSpace ("omega", namespace);
+               (models.codon.MG_REV.generateRate.p [model_type]) [terms.omega_ratio] = models.codon.MG_REV.aa_rate;
+            } else {
+               models.codon.MG_REV.aa_rate = "beta";
+               (models.codon.MG_REV.generateRate.p [model_type]) [terms.nonsynonymous_rate] = models.codon.MG_REV.aa_rate;
+            }
+            models.codon.MG_REV.generateRate.p [terms.rate_entry] = models.codon.MG_REV.nuc_rate + "*" + models.codon.MG_REV.aa_rate;
+       } else {
+            if (model_type == terms.local) {
+                (models.codon.MG_REV.generateRate.p [model_type]) [terms.synonymous_rate] = "alpha";
+                models.codon.MG_REV.generateRate.p [terms.rate_entry] = models.codon.MG_REV.nuc_rate + "*alpha";   
+            } else {
+                models.codon.MG_REV.generateRate.p [terms.rate_entry] = models.codon.MG_REV.nuc_rate;               
+            }
+       }  
+ 	} 	
+ 	
+	return models.codon.MG_REV.generateRate.p;
+}
+
+function models.codon.MG_REV.defineQ (mg_rev, namespace) {
+	models.codon.generic.defineQMatrix (mg_rev, namespace);
+	parameters.setConstraint (((mg_rev["parameters"])[terms.global])[terms.nucleotideRate ("A","G")], "1", "");
+	return mg_rev;
+}
+
+function models.codon.MG_REV.set_branch_length (model, value, parameter) {
+    if (model["type"] == terms.global) {
+        return models.generic.set_branch_length (model, value, parameter);
+    }
+    
+    models.codon.MG_REV.set_branch_length.lp    = model.parameters.local (model);
+    models.codon.MG_REV.set_branch_length.beta  = models.codon.MG_REV.set_branch_length.lp[terms.nonsynonymous_rate];
+    models.codon.MG_REV.set_branch_length.alpha = models.codon.MG_REV.set_branch_length.lp[terms.synonymous_rate];
+    
+    models.codon.MG_REV.set_branch_length.alpha.p = parameter + "." + models.codon.MG_REV.set_branch_length.alpha;
+    models.codon.MG_REV.set_branch_length.beta.p = parameter + "." + models.codon.MG_REV.set_branch_length.beta;
+    
+    if (parameters.isIndependent (models.codon.MG_REV.set_branch_length.alpha.p)) {
+        if (parameters.isIndependent (models.codon.MG_REV.set_branch_length.beta.p)) {
+            models.codon.MG_REV.set_branch_length.lp = parameters.normalize_ratio (Eval (models.codon.MG_REV.set_branch_length.beta), Eval (models.codon.MG_REV.set_branch_length.alpha));
+            parameters.setConstraint (models.codon.MG_REV.set_branch_length.beta, models.codon.MG_REV.set_branch_length.alpha + "*" + models.codon.MG_REV.set_branch_length.lp, "");
+            ExecuteCommands ("FindRoot (models.codon.MG_REV.set_branch_length.lp,(" + model ["branch-length-string"] + ")-" + value + "," + models.codon.MG_REV.set_branch_length.alpha + ",0,10000)");   
+            parameters.removeConstraint (models.codon.MG_REV.set_branch_length.beta);
+            Eval ("`models.codon.MG_REV.set_branch_length.alpha.p` =" + models.codon.MG_REV.set_branch_length.lp);
+            Eval ("`models.codon.MG_REV.set_branch_length.beta.p` =" + Eval (models.codon.MG_REV.set_branch_length.beta.p));
+        } else {
+            ExecuteCommands ("FindRoot (models.codon.MG_REV.set_branch_length.lp,(" + model ["branch-length-string"] + ")-" + value + "," + models.codon.MG_REV.set_branch_length.alpha + ",0,10000)");   
+            Eval ("`models.codon.MG_REV.set_branch_length.alpha.p` =" + models.codon.MG_REV.set_branch_length.lp);                   
+        }
+    }
+ }
diff --git a/res/TemplateBatchFiles/lib2014/models/frequencies.bf b/res/TemplateBatchFiles/lib2014/models/frequencies.bf
new file mode 100644
index 0000000..fb6f5aa
--- /dev/null
+++ b/res/TemplateBatchFiles/lib2014/models/frequencies.bf
@@ -0,0 +1,173 @@
+LoadFunctionLibrary ("terms.bf");
+LoadFunctionLibrary ("parameters.bf");
+LoadFunctionLibrary ("../UtilityFunctions.bf");
+LoadFunctionLibrary ("model_functions.bf");
+
+function frequencies.equal (model, namespace, datafilter) {
+	__N = Abs (model["alphabet"]);
+	model[terms.efv_estimate]      = {__N,1}["1/__N"];
+	model[terms.efv_estimate_name] = terms.freqs.equal;
+	return model;
+}
+
+function frequencies.empirical.nucleotide (model, namespace, datafilter) {
+	model = frequencies._aux.empirical.singlechar (model, namespace, datafilter);
+	model[terms.efv_estimate_name] = terms.freqs.4x1;
+	return model;
+}
+
+function frequencies.empirical.corrected.CF3x4 (model, namespace, datafilter) {
+
+    __dimension = model.dimension (model); 
+    __alphabet = model ["alphabet"];
+    
+    assert ( Type (model[terms.rate_matrix]) == "Matrix" && Rows (model[terms.rate_matrix]) == __dimension && Columns (model[terms.rate_matrix]) == __dimension,
+            "`terms.rate_matrix` must be defined prior to calling frequencies.empirical.corrected.CF3x4");
+
+
+    GetDataInfo (_givenAlphabet, *datafilter, "CHARACTERS");
+    
+ 	utility.toggleEnvVariable ("COUNT_GAPS_IN_FREQUENCIES", 0);
+	HarvestFrequencies (__f, *datafilter, 3,1,1);
+	utility.toggleEnvVariable ("COUNT_GAPS_IN_FREQUENCIES", None);
+    
+    __estimates = frequencies._aux.CF3x4 (__f, model["bases"], __alphabet, model["stop"]);
+ 	model[terms.efv_estimate]      = __estimates ["codons"];
+    __estimates = __estimates["bases"];
+    
+     for (_rowChar = 0; _rowChar < __dimension; _rowChar +=1 ){
+		for (_colChar = _rowChar + 1; _colChar < __dimension; _colChar += 1) {
+			
+			__diff = models.codon.diff (__alphabet[_rowChar], __alphabet[_colChar]);
+            if (None != __diff) {
+                (model[terms.rate_matrix])[_rowChar][_colChar] += "*" + (__estimates[__diff["to"]])[__diff["position"]];
+                (model[terms.rate_matrix])[_colChar][_rowChar] += "*" + (__estimates[__diff["from"]])[__diff["position"]];
+            }
+		}	
+	}
+	
+	model[terms.efv_estimate_name] = terms.freqs.CF3x4;	
+	return model;
+}
+
+function frequencies.mle (model, namespace, datafilter) {
+	assert (0, "frequencies.mle is TBD");
+}
+
+//--- AUX FUNCTIONS FROM THIS POINT ON ---//
+
+function frequencies._aux.empirical.singlechar (model, namespace, datafilter) {
+	utility.toggleEnvVariable ("COUNT_GAPS_IN_FREQUENCIES", 0);
+	HarvestFrequencies (__f, *datafilter, 1,1,1);
+	utility.toggleEnvVariable ("COUNT_GAPS_IN_FREQUENCIES", None);
+	model[terms.efv_estimate] = __f;
+	return model;
+}
+
+
+function frequencies._aux.CF3x4 (observed_3x4,base_alphabet,sense_codons, stop_codons) {
+
+   frequencies._aux.CF3x4.p = {};
+   
+   frequencies._aux.CF3x4.args = {};
+   
+   for (frequencies._aux.CF3x4.k = 0; frequencies._aux.CF3x4.k < 3; frequencies._aux.CF3x4.k += 1) {
+        frequencies._aux.CF3x4.p [frequencies._aux.CF3x4.k] = parameters.generate_sequential_names ("frequencies._aux.CF3x4.p" + frequencies._aux.CF3x4.k,3,None);    
+        parameters.declareGlobal (frequencies._aux.CF3x4.p [frequencies._aux.CF3x4.k], None);
+        parameters.setRange (frequencies._aux.CF3x4.p [frequencies._aux.CF3x4.k], terms.range01);
+        frequencies._aux.CF3x4.args + (Join (",",frequencies._aux.CF3x4.p [frequencies._aux.CF3x4.k]));
+   }   
+    
+    frequencies._aux.CF3x4.args = Join (",", frequencies._aux.CF3x4.args);
+    
+    frequencies._aux.CF3x4.n = {}; 
+    
+    for (frequencies._aux.CF3x4.k = 0; frequencies._aux.CF3x4.k < 3; frequencies._aux.CF3x4.k += 1) {
+        frequencies._aux.CF3x4.n[frequencies._aux.CF3x4.k] = parameters.generate_attributed_names ("frequencies._aux.CF3x4.n" +frequencies._aux.CF3x4.k,base_alphabet,None);
+        parameters.setConstraint (frequencies._aux.CF3x4.n[frequencies._aux.CF3x4.k], 
+                                  parameters.helper.stick_breaking (frequencies._aux.CF3x4.p[frequencies._aux.CF3x4.k], observed_3x4[-1][frequencies._aux.CF3x4.k]), 
+                                  "global");
+    }
+
+   
+	frequencies._aux.stop_count = Columns (stop_codons);
+    
+    frequencies._aux.CF3x4.stop_correction = {};
+    
+    
+
+    
+    for (frequencies._aux.CF3x4.i = 0; frequencies._aux.CF3x4.i < Columns (base_alphabet); frequencies._aux.CF3x4.i += 1) {
+        frequencies._aux.CF3x4.stop_correction [base_alphabet[frequencies._aux.CF3x4.i]] = {{"","",""}};
+    }
+    
+    frequencies._aux.CF3x4.denominator = "1";
+    
+    for (frequencies._aux.CF3x4.i = 0; frequencies._aux.CF3x4.i < frequencies._aux.stop_count; frequencies._aux.CF3x4.i += 1) {
+        frequencies._aux.CF3x4.sc = stop_codons[frequencies._aux.CF3x4.i];
+        
+        (frequencies._aux.CF3x4.stop_correction[frequencies._aux.CF3x4.sc[0]])[0] += 
+                "-frequencies._aux.CF3x4.n1_" +  frequencies._aux.CF3x4.sc[1] +
+                "*frequencies._aux.CF3x4.n2_" +  frequencies._aux.CF3x4.sc[2];
+
+        (frequencies._aux.CF3x4.stop_correction[frequencies._aux.CF3x4.sc[1]])[1] += 
+                "-frequencies._aux.CF3x4.n0_" +  frequencies._aux.CF3x4.sc[0] +
+                "*frequencies._aux.CF3x4.n2_" +  frequencies._aux.CF3x4.sc[2];
+
+        (frequencies._aux.CF3x4.stop_correction[frequencies._aux.CF3x4.sc[2]])[2] += 
+                "-frequencies._aux.CF3x4.n0_" +  frequencies._aux.CF3x4.sc[0] +
+                "*frequencies._aux.CF3x4.n1_" +  frequencies._aux.CF3x4.sc[1];
+                
+        frequencies._aux.CF3x4.denominator += "-frequencies._aux.CF3x4.n0_" + frequencies._aux.CF3x4.sc[0] +    
+                                              "*frequencies._aux.CF3x4.n1_" + frequencies._aux.CF3x4.sc[1] +
+                                              "*frequencies._aux.CF3x4.n2_" + frequencies._aux.CF3x4.sc[2];
+    }
+	
+	
+	parameters.setConstraint ("frequencies._aux.CF3x4.denominator", frequencies._aux.CF3x4.denominator, 1);
+		    
+	frequencies._aux.N = {Columns (base_alphabet),3};
+	frequencies._aux.res = {};
+	frequencies._aux.codons = {Columns (sense_codons), 1};
+	
+	for (frequencies._aux.CF3x4.i = 0; frequencies._aux.CF3x4.i < Columns (sense_codons); frequencies._aux.CF3x4.i += 1) {
+	    frequencies._aux.CF3x4.sc = {3,1};
+		for (frequencies._aux.CF3x4.pos = 0; frequencies._aux.CF3x4.pos < 3; frequencies._aux.CF3x4.pos += 1) {
+		    frequencies._aux.CF3x4.sc [frequencies._aux.CF3x4.pos] = "frequencies._aux.CF3x4.n"
+                             +frequencies._aux.CF3x4.pos+"_"+(sense_codons[frequencies._aux.CF3x4.i])[frequencies._aux.CF3x4.pos];
+        }	    
+        ExecuteCommands ("frequencies._aux.codons[frequencies._aux.CF3x4.i] := " + Join ("*", frequencies._aux.CF3x4.sc) + "/frequencies._aux.CF3x4.denominator");
+	}
+	
+	for (frequencies._aux.CF3x4.i = 0; frequencies._aux.CF3x4.i < Columns (base_alphabet); frequencies._aux.CF3x4.i += 1) {
+	    frequencies._aux.CF3x4.n = base_alphabet[frequencies._aux.CF3x4.i];
+	    frequencies._aux.res [frequencies._aux.CF3x4.n] = {3,1};
+		for (frequencies._aux.CF3x4.pos = 0; frequencies._aux.CF3x4.pos < 3; frequencies._aux.CF3x4.pos += 1) {
+		    
+		    frequencies._aux.CF3x4.sc = (frequencies._aux.CF3x4.stop_correction[frequencies._aux.CF3x4.n])[frequencies._aux.CF3x4.pos];
+		    
+			if (Abs (frequencies._aux.CF3x4.sc)) {
+                frequencies._aux.CF3x4.sc = "*(1" + frequencies._aux.CF3x4.sc + ")";		
+            }
+            
+            ExecuteCommands( "frequencies._aux.N[" + frequencies._aux.CF3x4.i + "][" + frequencies._aux.CF3x4.pos + "] := frequencies._aux.CF3x4.n"
+                             +frequencies._aux.CF3x4.pos+"_"+frequencies._aux.CF3x4.n
+                             +frequencies._aux.CF3x4.sc+"/frequencies._aux.CF3x4.denominator");
+                             
+            ExecuteCommands ("(frequencies._aux.res[frequencies._aux.CF3x4.n])[frequencies._aux.CF3x4.pos] := frequencies._aux.CF3x4.n"
+                             +frequencies._aux.CF3x4.pos+"_"+frequencies._aux.CF3x4.n);
+		}
+	}
+	
+	
+	
+    ExecuteCommands ("Optimize (frequencies._aux.CF3x4.p, frequencies._aux._CF3x4_minimizer( "  +
+                     frequencies._aux.CF3x4.args + "))");
+
+	return {"codons" : Eval("frequencies._aux.codons"), "bases" : frequencies._aux.res};
+}
+
+function frequencies._aux._CF3x4_minimizer (p11,p12,p13,p21,p22,p23,p31,p32,p33) {
+	frequencies._aux._CF3x4_minimizer.error = frequencies._aux.N-observed_3x4;
+	return  - (+ frequencies._aux._CF3x4_minimizer.error$frequencies._aux._CF3x4_minimizer.error);
+}
diff --git a/res/TemplateBatchFiles/lib2014/models/model_functions.bf b/res/TemplateBatchFiles/lib2014/models/model_functions.bf
new file mode 100644
index 0000000..1480c2f
--- /dev/null
+++ b/res/TemplateBatchFiles/lib2014/models/model_functions.bf
@@ -0,0 +1,183 @@
+LoadFunctionLibrary ("DNA.bf");
+LoadFunctionLibrary ("parameters.bf");
+LoadFunctionLibrary ("frequencies.bf");
+LoadFunctionLibrary ("../UtilityFunctions.bf");
+//------------------------------------------------------------------------------ 
+
+
+function model.applyModelToTree (id, tree, model_list, rules) {
+
+
+	if (Type (rules) == "AssociativeList") {
+	    // this has the form 
+	    // model id : list of branches to apply the model (as a string matrix)
+	    // OR 
+	    // DEFAULT : model id
+	    
+	    if (Abs (rules["DEFAULT"])) {
+            ExecuteCommands ("UseModel (" + rules["DEFAULT"] + ");
+                              Tree `id` = " + tree["string"] + ";
+                              ");	    
+	    } else {
+            ExecuteCommands ("UseModel (USE_NO_MODEL);
+                              Tree `id` = " + tree["string"] + ";
+                              ");	    
+	    
+	    }
+	    
+	    model.applyModelToTree.ids = Rows (rules);
+	    for (model.applyModelToTree.k = 0; model.applyModelToTree.k < Abs (rules); model.applyModelToTree.k += 1) {
+	        model.applyModelToTree.name = model.applyModelToTree.ids[model.applyModelToTree.k];
+	        if ( model.applyModelToTree.name != "DEFAULT") {
+                model.applyModelToTree.list = rules[model.applyModelToTree.name];
+                if (Type (model.applyModelToTree.list) == "AssociativeList") {
+                    model.applyModelToTree.list = Rows (model.applyModelToTree.list);
+                }
+                
+                if (Type (model_list) == "AssociativeList") {
+                    model.applyModelToTree.apply_model = model_list[model.applyModelToTree.name];
+                } else {
+                    model.applyModelToTree.apply_model = model.applyModelToTree.name;
+                }
+                
+                for (model.applyModelToTree.b = 0; model.applyModelToTree.b < Columns (model.applyModelToTree.list); model.applyModelToTree.b += 1) {
+                    ExecuteCommands ("SetParameter (`id`." + model.applyModelToTree.list[model.applyModelToTree.b] + ",MODEL," + model.applyModelToTree.apply_model + ")");
+                }
+            }
+	    }
+	    
+	} else {
+		model.applyModelToTree.modelID = model_list[model_list ["INDEXORDER"][0]];
+		ExecuteCommands ("UseModel (" + model.applyModelToTree.modelID["id"] + ");
+						  Tree `id` = " + tree["string"] + ";
+						  ");
+	}
+}
+
+
+function model.define.from.components (id,q,efv,canonical) {
+	ExecuteCommands ("Model `id` = (" + q + "," + efv + "," + canonical + ")");
+
+}
+
+//------------------------------------------------------------------------------ 
+
+function model.generic.define_model (model_spec, id, arguments, data_filter, estimator_type) {
+	
+	model.generic.define_model.model = utility.callFunction (model_spec, arguments);
+	models.generic.attachFilter (model.generic.define_model.model, data_filter);
+	
+	model.generic.define_model.model = utility.callFunction(model.generic.define_model.model ["defineQ"], {"0" :   "model.generic.define_model.model",
+																						   "1" :    parameters.quote (id)});
+	model.generic.define_model.model ["matrix-id"] = "`id`_" + terms.rate_matrix;
+	model.generic.define_model.model ["efv-id"] = "`id`_" + terms.efv_matrix;
+	model.generic.define_model.model ["id"] = id;
+	
+	
+	if (estimator_type != None) {
+		model.generic.define_model.model ["frequency-estimator"] = estimator_type;
+	} 
+		
+	utility.callFunction (model.generic.define_model.model ["frequency-estimator"], {"0": "model.generic.define_model.model", 
+													    "1":  parameters.quote(id),
+													    "2":   parameters.quote(data_filter)}); // this sets the EFV field
+													    
+													  
+													  
+	parameters.stringMatrixToFormulas (model.generic.define_model.model ["matrix-id"],model.generic.define_model.model[terms.rate_matrix]);
+	ExecuteCommands (model.generic.define_model.model ["efv-id"]   + " = " + model.generic.define_model.model[terms.efv_estimate]);
+		    
+	model.define.from.components (id, 	model.generic.define_model.model ["matrix-id"], model.generic.define_model.model ["efv-id"], model.generic.define_model.model ["canonical"]);
+    
+    if (Type (model.generic.define_model.model["post-definition"]) == "String") {
+        utility.callFunction (model.generic.define_model.model["post-definition"], {"0" : "model.generic.define_model.model"});
+    }
+	
+	return model.generic.define_model.model;
+}
+
+//------------------------------------------------------------------------------ 
+
+function models.generic.post.definition  (model) {
+    if (Type (model ["id"]) == "String") {
+        ExecuteCommands ("GetString (models.generic.post.definition.bl,"+model ["id"]+",-1)");
+        model ["branch-length-string"] = models.generic.post.definition.bl; 
+    }
+     return model;
+}
+
+//------------------------------------------------------------------------------ 
+
+function models.generic.set_branch_length (model, value, parameter) {
+    if (Abs((model["parameters"])["local"]) == 1) {
+        if (Type (model ["branch-length-string"]) == "String") {
+            models.generic.set_branch_length.bl = (Columns ((model["parameters"])["local"]))[0];
+            ExecuteCommands ("FindRoot (models.generic.set_branch_length.t,(" + model ["branch-length-string"] + ")-" + value + "," + models.generic.set_branch_length.bl + ",0,10000)");
+            Eval (parameter + "." + models.generic.set_branch_length.bl + "=" + models.generic.set_branch_length.t);
+        }
+    }
+}
+
+//------------------------------------------------------------------------------ 
+
+function models.generic.post.definition  (model) {
+    if (Type (model ["id"]) == "String") {
+        ExecuteCommands ("GetString (models.generic.post.definition.bl,"+model ["id"]+",-1)");
+        model ["branch-length-string"] = models.generic.post.definition.bl; 
+    }
+     return model;
+}
+
+//------------------------------------------------------------------------------ 
+
+function models.generic.attachFilter (model, filter) {
+	GetDataInfo (_givenAlphabet, *filter, "CHARACTERS");
+	__alphabet = model ["alphabet"];
+
+
+	assert (Columns (__alphabet) == Columns (_givenAlphabet) && model.matchAlphabets (_givenAlphabet, __alphabet), "The declared model alphabet '" + __alphabet + "' does not match the `filter` filter: '" + _givenAlphabet + "'");
+	
+	model ["alphabet"] = _givenAlphabet;
+	model ["data"] = filter;
+	return model;
+}
+
+//------------------------------------------------------------------------------ 
+
+function model.dimension (model) {
+    if (Type (model["alphabet"]) == "Matrix") {
+        return Columns (model["alphabet"]);
+    }
+    return None;
+}
+
+//------------------------------------------------------------------------------ 
+
+function model.parameters.local (model) {
+    return (model["parameters"])["local"];
+}
+
+
+//------------------------------------------------------------------------------ 
+
+function model.parameters.global (model) {
+    return (model["parameters"])["global"];
+}
+
+//------------------------------------------------------------------------------ 
+
+lfunction model.matchAlphabets (a1, a2) {
+
+
+	_validStates = {};
+	for (_k = 0; _k < Columns (a1); _k += 1) {
+		_validStates [a1[_k]] = _k;
+	}
+	for (_k = 0; _k < Columns (a2); _k += 1) {
+		if (_validStates [a2[_k]] != _k) {
+			return 0;
+		}
+	}
+	return 1;
+
+}
\ No newline at end of file
diff --git a/res/TemplateBatchFiles/lib2014/models/parameters.bf b/res/TemplateBatchFiles/lib2014/models/parameters.bf
new file mode 100644
index 0000000..871b0c3
--- /dev/null
+++ b/res/TemplateBatchFiles/lib2014/models/parameters.bf
@@ -0,0 +1,263 @@
+LoadFunctionLibrary ("GrabBag");
+LoadFunctionLibrary ("terms.bf");
+
+parameters.infinity = 1e10;
+
+function parameters.applyNameSpace (id, namespace) {
+	if (Type (namespace) == "String") {
+		if (Abs (namespace) > 0) {
+			return namespace + "." + id;
+		}
+	}
+	return id;
+}
+
+function parameters.unconstrain_parameter_set (lf, set) {
+    ExecuteCommands ("GetString(parameters.unconstrain_parameter_set.info, `lf`, -1)");
+    if (None == set) {
+        set = {{terms.lf.global.constrained,terms.lf.local.constrained}};
+    } 
+    for (parameters.unconstrain_parameter_set.s = 0; parameters.unconstrain_parameter_set.s < Columns (set); parameters.unconstrain_parameter_set.s += 1) {
+        parameters.unconstrain_parameter_set.m = parameters.unconstrain_parameter_set.info [set [parameters.unconstrain_parameter_set.s]];
+        for (parameters.unconstrain_parameter_set.i = 0; parameters.unconstrain_parameter_set.i < Columns (parameters.unconstrain_parameter_set.m); parameters.unconstrain_parameter_set.i += 1) {
+            Eval (parameters.unconstrain_parameter_set.m[parameters.unconstrain_parameter_set.i] + "=" + Eval (parameters.unconstrain_parameter_set.m[parameters.unconstrain_parameter_set.i]));
+        }   
+    }
+}
+
+function parameters.declareGlobal (id, cache) {
+    if (Type (id) == "String") {
+        if (Abs (id)) {
+            if (Type (cache) == "AssociativeList") {
+                if (Abs (cache[id]) == 0) {
+                    return;
+                } else {
+                    cache[id] = 1;
+                }
+            }
+            ExecuteCommands ("global `id` = 1;");
+        }
+    } else {
+        if (Type (id) == "AssociativeList") {
+            parameters.declareGlobal.var_count = Abs (id);
+            parameters.declareGlobal.names = Columns (id);
+            for (parameters.declareGlobal.k = 0; parameters.declareGlobal.k <  parameters.declareGlobal.var_count; parameters.declareGlobal.k += 1) {
+                parameters.declareGlobal (parameters.declareGlobal.names[parameters.declareGlobal.k], cache);
+            }            
+        } else {
+            if (Type (id) == "Matrix") {
+                 parameters.declareGlobal.var_count = Columns (id) * Rows (id);
+                 for (parameters.declareGlobal.k = 0; parameters.declareGlobal.k <  parameters.declareGlobal.var_count; parameters.declareGlobal.k += 1) {
+                    parameters.declareGlobal (parameters.declareGlobal.names[parameters.declareGlobal.k], cache);
+                 }                       
+            }
+        }
+    }
+}
+
+function parameters.normalize_ratio (n, d) {
+    if (d == 0) {
+        if (n == 0) {
+            return 1;
+        } else {
+            return parameters.infinity;
+        }
+    } 
+    return n/d;
+}
+
+function parameters.set_value (id, value) {
+    Eval ("`id` = " + value);
+}
+
+lfunction parameters.mean (values, weights, d) {
+    m = 0;
+    for (i = 0; i < 3; i+=1) {
+        m += Eval (values[i]) * Eval(weights[i]);
+    }
+    return m;
+}
+
+function parameters.quote (arg) {
+	return "\"" + arg + "\"";
+}
+
+lfunction parameters.addMultiplicativeTerm (matrix, term, do_empties) {
+	
+	if (Abs (term) > 0) {
+		__N = Rows (matrix);
+	
+		for (__r = 0; __r < __N; __r+=1) {
+			for (__c = 0; __c < __N; __c+=1) {
+				if (__r != __c) {
+					if (Abs (matrix[__r][__c])) {
+						matrix[__r][__c] = "(" + matrix[__r][__c] + ")*(" + term + ")";
+					} else {
+					    if (do_empties) {
+						    matrix[__r][__c] =  term;
+						}
+					}
+				}
+			}
+		}
+	}
+	
+	return matrix;
+}
+
+function parameters.stringMatrixToFormulas (id, matrix) {
+	__N = Rows (matrix);
+	
+	ExecuteCommands ("`id` = {__N,__N}");
+	
+	for (__r = 0; __r < __N; __r+=1) {
+		for (__c = 0; __c < __N; __c+=1) {
+		
+			if (__r != __c && Abs (matrix[__r][__c])) {
+				ExecuteCommands ("`id`[__r][__c] := " + matrix[__r][__c]);
+			}
+		}
+	}
+	
+}
+
+function parameters.generate_attributed_names (prefix, attributes, delimiter) {
+    if (delimiter == None) {
+        delimiter = "_";
+    }
+    parameters.generate_names.holder = {};
+    for (parameters.generate_names.k = 0; parameters.generate_names.k < Columns (attributes); parameters.generate_names.k += 1) {
+        parameters.generate_names.holder + (prefix + delimiter + attributes[parameters.generate_names.k]);
+    }   
+    return parameters.generate_names.holder;
+}
+
+function parameters.generate_sequential_names (prefix, count, delimiter) {
+    if (delimiter == None) {
+        delimiter = "_";
+    }
+    parameters.generate_names.holder = {};
+    for (parameters.generate_names.k = 0; parameters.generate_names.k < count; parameters.generate_names.k += 1) {
+        parameters.generate_names.holder + (prefix + delimiter + parameters.generate_names.k);
+    }   
+    return parameters.generate_names.holder;
+}
+
+function parameters.setRange (id, ranges) {
+    if (Type (id) == "String") {
+        if (Abs (id)) {
+            if (Type (ranges) == "AssociativeList") {
+                if (Abs (ranges[terms.lower_bound])) {
+                    ExecuteCommands ("`id` :> " + ranges[terms.lower_bound]);
+                } 
+                if (Abs (ranges[terms.upper_bound])) {
+                    ExecuteCommands ("`id` :< " + ranges[terms.upper_bound]);
+                } 
+            }
+        }
+    } else {
+        if (Type (id) == "AssociativeList") {
+            parameters.setRange.var_count = Abs (id);
+            for (parameters.setRange.k = 0; parameters.setRange.k <  parameters.setRange.var_count; parameters.setRange.k += 1) {
+                parameters.setRange (id[parameters.setRange.k], ranges);
+            }
+        }
+    }
+}
+
+function parameters.isIndependent (id) {
+    ExecuteCommands ("GetString (parameters.isIndependent.t, `id`, -1);");
+    return Type (parameters.isIndependent.t) != "AssociativeList";
+}
+
+function parameters.setConstraint (id, value, global_tag) {
+    if (Type (id) == "String") {
+        if (Abs (id)) {
+            ExecuteCommands ("`global_tag` `id` := " + value);
+        }
+    } else {
+        if (Type (id) == "AssociativeList" && Type (value) == "AssociativeList") {                
+
+            parameters.setConstraint.var_count = Abs (id);
+            for (parameters.setConstraint.k = 0; parameters.setConstraint.k <  parameters.setConstraint.var_count; parameters.setConstraint.k += 1) {
+                parameters.setConstraint (id[parameters.setConstraint.k], 
+                                          value[parameters.setConstraint.k], 
+                                          global_tag);
+            }            
+        }
+    }
+}
+
+function parameters.constrainSets (set1, set2) {
+    parameters.constrainSets.tags = Rows (set1);
+    for (parameters.constrainSets.k = 0; parameters.constrainSets.k < Abs (set1); parameters.constrainSets.k += 1) {
+        
+        if (Type (set2[parameters.constrainSets.tags [parameters.constrainSets.k]]) == "String") {
+            ExecuteCommands (set2[parameters.constrainSets.tags [parameters.constrainSets.k]] + ":=" +
+                             set1[parameters.constrainSets.tags [parameters.constrainSets.k]]);
+        }
+    }
+}
+
+
+function parameters.removeConstraint (id) {
+    if (Type (id) == "String") {
+        if (Abs (id)) {
+            Eval ("`id` = " + Eval(id));
+        }
+    } else {
+        if (Type (id) == "AssociativeList") {                
+            return parameters.removeConstraint (Columns (id));
+        }
+        if (Type (id) == "Matrix") {                
+            parameters.removeConstraint.var_count = Columns (id) * Rows (id);
+            for (parameters.removeConstraint.k = 0; parameters.removeConstraint.k <  parameters.removeConstraint.var_count; parameters.removeConstraint.k += 1) {
+                parameters.removeConstraint (id[parameters.removeConstraint.k]);
+            }            
+        }
+    }
+}
+
+
+function parameters.helper.copy_definitions (target, source) {
+    parameters.helper.copy_definitions.key_iterator = {{terms.local, terms.global}};
+    
+    for (parameters.helper.copy_definitions.i = 0; 
+         parameters.helper.copy_definitions.i < Columns (parameters.helper.copy_definitions.key_iterator);
+         parameters.helper.copy_definitions.i += 1) {
+         parameters.helper.copy_definitions.key = parameters.helper.copy_definitions.key_iterator[parameters.helper.copy_definitions.i];
+         if (Type (source[parameters.helper.copy_definitions.key]) == "AssociativeList") {
+            target [parameters.helper.copy_definitions.key] * source [parameters.helper.copy_definitions.key];
+         }   
+    }
+}
+
+lfunction parameters.helper.stick_breaking (parameters, initial_values) {
+    left_over   = ""; 
+    weights     = {};
+    accumulator = 1;
+    
+    
+    for (k = 0; k < Abs (parameters); k += 1) {
+        if (None != initial_values) {
+            vid = parameters[k];
+            ^(vid) = initial_values[k] / accumulator;
+            accumulator = accumulator * (1-^(vid));
+        }
+        weights [k] = left_over + parameters[k];
+        left_over += "(1-" + parameters[k] + ")*";
+     }
+    
+    weights[k] = left_over[0][Abs (left_over)-2];
+    return weights;
+}
+
+lfunction parameters.helper.dump_matrix (matrix) {
+    for (i = 0; i < Rows (^matrix); i+=1) {
+        for (j = 0; j < Columns (^matrix); j+=1) {
+            ExecuteCommands ("GetString (cell, `matrix`, i, j)");
+            fprintf (stdout, "`matrix`[", i, "][", j, "] := ", cell, "\n");    
+        }
+    }
+    return None;
+}
diff --git a/res/TemplateBatchFiles/lib2014/models/terms.bf b/res/TemplateBatchFiles/lib2014/models/terms.bf
new file mode 100644
index 0000000..da5c7ba
--- /dev/null
+++ b/res/TemplateBatchFiles/lib2014/models/terms.bf
@@ -0,0 +1,41 @@
+terms.local 			= "local";
+terms.global 			= "global";
+terms.rate_entry        = "rate-entry";
+terms.default_time 		= "t";
+
+terms.lower_bound 		= "LB";
+terms.upper_bound 		= "UB";
+
+terms.range01    		= {"LB" : "0", 
+                           "UB" : "1"};
+
+terms.range_gte1        = {"LB" : "1", 
+                           "UB" : "1e26"};
+
+                           
+terms.freqs.4x1			= "Nucleotide 4x1 estimator";
+terms.freqs.equal		= "Equal frequencies";
+terms.freqs.CF3x4       = "Corrected 3x4 frequency estimator";
+terms.rate_matrix       = "Q";
+terms.efv_matrix        = "pi";
+terms.efv_estimate_name	= "Equilibrium frequency estimator";
+terms.efv_estimate		= "EFV";
+
+terms.lf.local.constrained = "Local Constrained";
+terms.lf.global.constrained = "Global Constrained";
+
+terms.synonymous_rate    = "synonymous rate";
+terms.nonsynonymous_rate = "non-synonymous rate";
+terms.omega_ratio        = "non-synonymous/synonymous rate ratio";
+ 
+function  terms.nucleotideRate (fromC, toC) {
+	return "Substitution rate from nucleotide " + fromC + " to nucleotide " + toC;
+}
+
+function  terms.aminoacidRate (fromA, toA) {
+	return "Substitution rate from aminoacid " + fromA + " to aminoacid " + toA;
+}
+
+function  terms.timeParameter () {
+	return "Evolutionary time parameter";
+}
diff --git a/res/TemplateBatchFiles/lib2014/tasks/estimators.bf b/res/TemplateBatchFiles/lib2014/tasks/estimators.bf
new file mode 100644
index 0000000..81d8e72
--- /dev/null
+++ b/res/TemplateBatchFiles/lib2014/tasks/estimators.bf
@@ -0,0 +1,223 @@
+LoadFunctionLibrary ("../models/model_functions.bf");
+LoadFunctionLibrary ("../models/terms.bf");
+LoadFunctionLibrary ("../models/DNA/GTR.bf");
+
+function estimators.copyGlobals2 (key, value) {
+    (estimators.extractMLEs.results ["global"])[key] = {"ID" : value, "MLE" : Eval (value)};
+}
+
+function estimators.copyGlobals (key, value) {
+     ((value["parameters"])["global"])["estimators.copyGlobals2"][""];
+}
+
+function estimators.setGlobals2 (key, value) {
+    __init_value = (initial_values["global"])[key];
+    if (Type (__init_value) == "AssociativeList") {
+        if (__init_value["fix-me"]) {
+            ExecuteCommands ("`value` := " + __init_value["MLE"]);       
+        } else {
+            ExecuteCommands ("`value` = " + __init_value["MLE"]);
+        }
+    }
+}
+
+function estimators.setGlobals (key, value) {
+    ((value["parameters"])["global"])["estimators.setGlobals2"][""];
+}
+
+function estimators.extractBranchInformation.copy_local (key, value) {
+    estimators.extractBranchLength.result [key] = {"ID": value, "MLE": Eval (estimators.extractBranchLength.parameter_tag + "." + value)};
+}
+
+function estimators.extractBranchInformation (tree, node, model) {
+    estimators.extractBranchLength.result = {}; 
+    
+    if (Abs(model["get-branch-length"])) {
+        estimators.extractBranchLength.result ["MLE"] = utility.callFunction (model["get-branch-length"], {"0" : "model", "1" : "tree",  "2": "node"});
+    } else {
+        estimators.extractBranchLength.result ["MLE"] = Eval ("BranchLength (`tree`, \"`node`\")");
+    }
+    
+    estimators.extractBranchLength.parameter_tag = tree + "." + node;
+    (model.parameters.local (model))["estimators.extractBranchInformation.copy_local"][""];
+    
+    return estimators.extractBranchLength.result;
+}
+
+function estimators.applyBranchLength (tree, node, model, length) {
+    utility.callFunction (model["set-branch-length"], {"0" : "model", "1" : length, "2": parameters.quote(tree + "." + node)});
+}
+
+function estimators.fixSubsetOfEstimates.helper (key, value) {
+    value["fix-me"] = 1;
+}
+
+function estimators.fixSubsetOfEstimates.helper_condition (key) {
+    return Type (variables[key]) != Unknown;
+}
+
+function estimators.fixSubsetOfEstimates (estimates, variables) {
+    (estimates["global"])["estimators.fixSubsetOfEstimates.helper"]["estimators.fixSubsetOfEstimates.helper_condition"];
+}
+
+function estimators.extractMLEs (likelihood_function_id, model_descriptions) {
+    ExecuteCommands ("GetString (estimators.extractMLEs.lfInfo, `likelihood_function_id`,-1)");  
+    estimators.extractMLEs.results = {};
+    estimators.extractMLEs.partitions = Rows (estimators.extractMLEs.lfInfo["Trees"]);
+   
+    // copy global variables first 
+    
+    estimators.extractMLEs.results ["global"] = {};
+    model_descriptions ["estimators.copyGlobals"][""];
+    estimators.extractMLEs.results ["branch lengths"] = {};
+    
+    for (estimators.extractMLEs.i = 0; estimators.extractMLEs.i < estimators.extractMLEs.partitions; estimators.extractMLEs.i  += 1) {
+        _tree_name = (estimators.extractMLEs.lfInfo["Trees"])[estimators.extractMLEs.i];
+       
+        ExecuteCommands ("GetInformation (estimators.extractMLEs.map, `_tree_name`);");  
+        estimators.extractMLEs.branch_names = Rows (estimators.extractMLEs.map);
+        (estimators.extractMLEs.results ["branch lengths"])[estimators.extractMLEs.i] = {};
+                
+        for (estimators.extractMLEs.b = 0; estimators.extractMLEs.b < Abs(estimators.extractMLEs.map); estimators.extractMLEs.b += 1) {
+            _branch_name = estimators.extractMLEs.branch_names[estimators.extractMLEs.b];
+            ((estimators.extractMLEs.results ["branch lengths"])[estimators.extractMLEs.i])[_branch_name] = 
+                estimators.extractBranchInformation (_tree_name, _branch_name, model_descriptions[estimators.extractMLEs.map[_branch_name]]);
+        }   
+    }   
+    
+    return estimators.extractMLEs.results;
+}
+
+function estimators.applyExistingEstimates (likelihood_function_id, model_descriptions, initial_values) {
+
+    ExecuteCommands ("GetString (estimators.extractMLEs.lfInfo, `likelihood_function_id`,-1)");  
+    estimators.extractMLEs.results = {};
+    estimators.extractMLEs.partitions = Rows (estimators.extractMLEs.lfInfo["Trees"]);
+   
+    // copy global variables first 
+    
+    estimators.extractMLEs.results ["global"] = {};
+    
+    model_descriptions ["estimators.setGlobals"][""];
+        
+    for (estimators.extractMLEs.i = 0; estimators.extractMLEs.i < estimators.extractMLEs.partitions; estimators.extractMLEs.i  += 1) {
+        if (Type ((initial_values["branch lengths"])[estimators.extractMLEs.i]) == "AssociativeList") {
+        
+            _tree_name = (estimators.extractMLEs.lfInfo["Trees"])[estimators.extractMLEs.i];
+       
+            ExecuteCommands ("GetInformation (estimators.extractMLEs.map, `_tree_name`);");  
+            estimators.extractMLEs.branch_names = Rows (estimators.extractMLEs.map);
+
+            for (estimators.extractMLEs.b = 0; estimators.extractMLEs.b < Abs(estimators.extractMLEs.map); estimators.extractMLEs.b += 1) {
+                _branch_name = estimators.extractMLEs.branch_names[estimators.extractMLEs.b];
+                _existing_estimate = ((initial_values["branch lengths"]) [estimators.extractMLEs.i])[_branch_name];
+                if (Type (_existing_estimate) == "AssociativeList") {
+                     estimators.applyBranchLength (_tree_name, _branch_name, model_descriptions[estimators.extractMLEs.map[_branch_name]], _existing_estimate["MLE"]);
+                }
+            }   
+            
+        }
+    }   
+}
+
+
+function estimators.fitGTR  (data_filter, tree, initial_values) {
+	// create a nucleotide filter first
+	
+	DataSetFilter estimators.fitGTR.nuc_data = CreateFilter (^data_filter, 1);
+	estimators.fitGTR.model =  model.generic.define_model ("models.DNA.GTR.modelDescription", "estimators.fitGTR.gtr", {"0" : "terms.global"}, "estimators.fitGTR.nuc_data", None); 
+
+    model.applyModelToTree ("estimators.fitGTR.tree", tree, {"default" : estimators.fitGTR.model} , None);
+    
+    LikelihoodFunction estimators.fitGTR.likelihoodFunction = (estimators.fitGTR.nuc_data, estimators.fitGTR.tree);
+    
+    if (Type (initial_values) == "AssociativeList") {
+        utility.toggleEnvVariable ("USE_LAST_RESULTS", 1);
+        estimators.applyExistingEstimates ("estimators.fitGTR.likelihoodFunction", {"estimators.fitGTR.gtr" : estimators.fitGTR.model}, initial_values);
+    }
+    
+    Optimize (estimators.fitGTR.mles, estimators.fitGTR.likelihoodFunction);
+    if (Type (initial_values) == "AssociativeList") {
+        utility.toggleEnvVariable ("USE_LAST_RESULTS", None);
+    }
+        
+    estimators.fitGTR.results = estimators.extractMLEs ("estimators.fitGTR.likelihoodFunction", {"estimators.fitGTR.gtr" : estimators.fitGTR.model});
+    
+    estimators.fitGTR.results["LogL"]            = estimators.fitGTR.mles[1][0];
+    estimators.fitGTR.results["parameters"] = estimators.fitGTR.mles[1][1] + 3;
+    
+    DeleteObject (estimators.fitGTR.likelihoodFunction);
+    
+    return estimators.fitGTR.results;
+}
+
+function estimators.fitMGREV.set_partition_omega (key, value) {
+    Eval  ("estimators.fitMGREV.tree.`key`.`estimators.fitMGREV.alpha` = 0.1");
+    ExecuteCommands ("estimators.fitMGREV.tree.`key`.`estimators.fitMGREV.beta`:=estimators.fitMGREV.tree.`key`.`estimators.fitMGREV.alpha`*" + estimators.fitMGREV.partitioned_omega.parameters [value]);
+}
+
+function estimators.fitMGREV  (codon_data, tree, option, initial_values) {
+		
+    estimators.fitMGREV.filter = codon_data["dataset"];
+    estimators.fitMGREV.partitioned_omega = 0;
+		
+	DataSetFilter estimators.fitMGREV.codon_data = CreateFilter (^estimators.fitMGREV.filter, 3, "", "", codon_data["stop"]);
+	
+	estimators.fitMGREV.model =  model.generic.define_model ("models.codon.MG_REV.modelDescription", 
+	                                                         "estimators.fitMGREV.mg", 
+	                                                         {"0" : parameters.quote (option["model-type"]), "1" : codon_data["code"]}, 
+	                                                         "estimators.fitMGREV.codon_data", 
+	                                                         None);
+	                                                          
+    model.applyModelToTree ("estimators.fitMGREV.tree", tree, {"default" : estimators.fitMGREV.model} , None);
+
+    if (option["model-type"] == terms.local && option["partitioned-omega"]) {
+        estimators.fitMGREV.model_list = tree["model_list"];
+        if (Columns(estimators.fitMGREV.model_list) > 1) {
+            estimators.fitMGREV.partitioned_omega = 1;  
+        }
+    }
+
+    LikelihoodFunction estimators.fitMGREV.likelihoodFunction = (estimators.fitMGREV.codon_data, estimators.fitMGREV.tree);
+    
+    if (estimators.fitMGREV.partitioned_omega) {
+        estimators.fitMGREV.partitioned_omega.parameters = (estimators.fitMGREV.model["parameters"])["global"];
+        
+        for (estimators.fitMGREV.i = 0; estimators.fitMGREV.i < Columns(estimators.fitMGREV.model_list); estimators.fitMGREV.i += 1) {
+            estimators.fitMGREV.partitioned_omega.parameters [estimators.fitMGREV.model_list[estimators.fitMGREV.i]] = "estimators.fitMGREV.mg.omega_" + estimators.fitMGREV.model_list[estimators.fitMGREV.i];
+        }
+        
+        parameters.declareGlobal (estimators.fitMGREV.partitioned_omega.parameters, None);
+
+        estimators.fitMGREV.lp    = model.parameters.local (estimators.fitMGREV.model);
+        estimators.fitMGREV.beta  = estimators.fitMGREV.lp[terms.nonsynonymous_rate];
+        estimators.fitMGREV.alpha = estimators.fitMGREV.lp[terms.synonymous_rate];
+     
+        (tree["model_map"])["estimators.fitMGREV.set_partition_omega"][""];
+        
+        (estimators.fitMGREV.model["parameters"])["global"] = estimators.fitMGREV.partitioned_omega.parameters;
+        
+     }
+
+    if (Type (initial_values) == "AssociativeList") {
+        utility.toggleEnvVariable ("USE_LAST_RESULTS", 1);
+        estimators.applyExistingEstimates ("estimators.fitMGREV.likelihoodFunction", {"estimators.fitMGREV.mg" : estimators.fitMGREV.model}, initial_values);
+    }
+    
+    // io.spoolLF ("estimators.fitMGREV.likelihoodFunction", "/Volumes/home-raid/Desktop/test", None);
+    Optimize (estimators.fitMGREV.mles, estimators.fitMGREV.likelihoodFunction);
+    
+    if (Type (initial_values) == "AssociativeList") {
+        utility.toggleEnvVariable ("USE_LAST_RESULTS", None);
+    }
+    
+    estimators.fitMGREV.results = estimators.extractMLEs ("estimators.fitMGREV.likelihoodFunction", {"estimators.fitMGREV.mg" : estimators.fitMGREV.model});
+    estimators.fitMGREV.results["LogL"]            = estimators.fitMGREV.mles[1][0];
+    estimators.fitMGREV.results["parameters"]      = estimators.fitMGREV.mles[1][1] + 9;
+    
+    //io.spoolLF ("estimators.fitMGREV.likelihoodFunction", "/Volumes/home-raid/Desktop/test", None);
+    
+    DeleteObject (estimators.fitMGREV.likelihoodFunction);
+    
+    return estimators.fitMGREV.results;
+}
diff --git a/res/TemplateBatchFiles/molclockBootstrap.bf b/res/TemplateBatchFiles/molclockBootstrap.bf
new file mode 100644
index 0000000..6a2fa4a
--- /dev/null
+++ b/res/TemplateBatchFiles/molclockBootstrap.bf
@@ -0,0 +1,245 @@
+IS_BOOTSTRAP_AVAILABLE = 1;
+IS_NPBOOTSTRAP_AVAILABLE = 1;
+
+function PadString (padLength,padChar)
+{
+	for (padCounter=0;padCounter<padLength;padCounter=padCounter+1)
+	{
+		fprintf (stdout,padChar);
+	}
+	return padLength;
+}
+
+function BootStrapFunction (bsIterates, tabulatedFileName, parametricOrNot)
+{
+	VERBOSITY_LEVEL = -1;
+	/* assume that data set is filteredData, tree string is treeString */
+	LRCounter = 0;
+	LRsum = 0;
+	LRsquaresum = 0;
+	fprintf (tabulatedFileName,"Iteration,Likelihood Ratio");
+	
+	fprintf (stdout,"\nIteration      LRT       Current P-Value\n");
+
+	if (MPI_NODE_COUNT>1)
+	{
+		MPINodeState   = {MPI_NODE_COUNT-1,3};
+		MPIResultCache = {bsIterates, 2};
+		for (bsCounter = 0; bsCounter<bsIterates; bsCounter=bsCounter+1)
+		{
+			MPIResultCache[bsCounter][0] = "";
+			MPIResultCache[bsCounter][1] = "";
+		}
+		
+		iteratesScanFrom  = 0;
+	}
+
+	iteratesDoneCount = 1;
+	
+	for (bsCounter=1;bsCounter<=bsIterates;bsCounter=bsCounter+1)
+	{
+		if (parametricOrNot)
+		{
+			if (SAVE_GLOBALS)
+			{
+				for (i = 0; i< SAVE_GLOBALS; i = i+1)
+				{
+					SetParameter(lfConstrained,i,globalSpoolMatrix[i]);
+				}
+			}
+			DataSet simulatedDataSet = SimulateDataSet (lfConstrained);
+			if (NICETY_LEVEL == 3)
+			{
+				DataSetFilter simulatedDataFilter = CreateFilter (simulatedDataSet,3,"","",GeneticCodeExclusions);
+			}
+			else
+			{
+				DataSetFilter simulatedDataFilter = CreateFilter (simulatedDataSet,1);
+			}
+		}	
+		else
+		{
+			if (NICETY_LEVEL == 3)
+			{
+				DataSetFilter simulatedDataFilter = Bootstrap (filteredData,3);
+			}
+			else
+			{
+				DataSetFilter simulatedDataFilter = Bootstrap (filteredData,1);
+			}
+		}	
+		HarvestFrequencies (simulatedEFV,simulatedDataFilter,1,1,1);
+		if (FREQUENCY_SENSITIVE)
+		{
+			simulatedModelMatrix = 0;
+			if (USE_POSITION_SPECIFIC_FREQS)
+			{
+				HarvestFrequencies (simulatedEFV,simulatedDataFilter,3,1,1);
+			}
+			MULTIPLY_BY_FREQS = PopulateModelMatrix ("simulatedModelMatrix",simulatedEFV);
+			if (NICETY_LEVEL==3)
+			{
+				simulatedCodonEFV = BuildCodonFrequencies (simulatedEFV);
+				Model simulatedModel = (simulatedModelMatrix,simulatedCodonEFV,MULTIPLY_BY_FREQS);	
+				Tree simulatedTree = treeString;
+			}
+			else
+			{
+				Model simulatedModel = (simulatedModelMatrix,simulatedEFV,MULTIPLY_BY_FREQS);
+				Tree simulatedTree = treeString;
+			}	
+
+		}
+		else
+		{
+			Tree simulatedTree = treeString;
+		}
+		
+		LikelihoodFunction simulatedLF = (simulatedDataFilter,simulatedTree);
+		if (MPI_NODE_COUNT>1)
+		{
+			dummy = SendIterate (0);
+			ExecuteCommands ("MolecularClock (simulatedTree,"+parameter2ConstrainString+");");
+			dummy = SendIterate (1);
+			dummy = ManageMPIReturns (0);
+		}
+		else
+		{
+			Optimize (simulatedResults,simulatedLF);
+			ExecuteCommands ("MolecularClock (simulatedTree,"+parameter2ConstrainString+");");
+			Optimize (simulatedResults2,simulatedLF);
+			fromNode = HandleAnIterate (0);	
+		}
+				
+	}
+	
+	if (MPI_NODE_COUNT>1)
+	{
+		while (1)
+		{
+			for (nodeCounter = 0; nodeCounter < MPI_NODE_COUNT-1; nodeCounter = nodeCounter+1)
+			{
+				if (MPINodeState[nodeCounter][0]==1)
+				{
+					fromNode = ReceiveJobs (0,0);
+					break;	
+				}
+			}
+			if (nodeCounter == MPI_NODE_COUNT-1)
+			{
+				break;
+			}
+		}	
+		OPTIMIZE_SUMMATION_ORDER = 1;
+		dummy = ManageMPIReturns (0);
+	}	
+	
+	fprintf (tabulatedFileName,"\nMLE,",lnLikDiff);
+	fprintf (stdout,"\n\n\t\tBOOTSTRAPPING SUMMARY\n\n");
+	
+	fprintf (stdout,"\n\nLikelihood Ratio Statistics:\nMEAN     = ",Format(LRsum/bsIterates,12,7),
+		    "\nVARIANCE = ",Format((LRsquaresum-LRsum*LRsum/bsIterates)/(bsIterates-1),12,7),
+			"\nProportion larger that the original likelihood ratio=",1-LRCounter/bsIterates,"\n");
+			
+	return 0;
+}
+
+function HandleAnIterate (dummy)
+{
+	fprintf (stdout,"\n",Format(iteratesDoneCount,8,0));
+	fprintf (tabulatedFileName,"\n",Format(iteratesDoneCount,0,0));
+	SimLR = 2*(simulatedResults[1][0]-simulatedResults2[1][0]);
+	if (SimLR<0)
+	{
+		fprintf (MESSAGE_LOG,"\nA negative LRT statistic encoutered. You may want to increase the optimization precision settings to resolve numerical apporximation errors");
+	}
+	if (SimLR<lnLikDiff)
+	{
+		LRCounter = LRCounter+1;
+	}
+	LRsum = LRsum+SimLR;
+	LRsquaresum = LRsquaresum+SimLR*SimLR;
+	fprintf (tabulatedFileName,",",SimLR);
+	fprintf (stdout, "  ",Format(SimLR,12,7),
+					  "    ",Format(1-LRCounter/iteratesDoneCount,12,7));
+					  
+	iteratesDoneCount = iteratesDoneCount + 1;
+
+	return 0;
+}
+
+function ReceiveJobs (sendOn,hyp)
+{
+	MPIReceive (-1, fromNode, result_String);
+	jobIterateCount = MPINodeState[fromNode-1][1];	
+	jobHypothesis   = MPINodeState[fromNode-1][2];
+	
+	if (sendOn)
+	{	
+		MPISend (fromNode,simulatedLF);
+		MPINodeState[fromNode-1][1] = bsCounter-1;	
+		MPINodeState[fromNode-1][2] = hyp;	
+	}
+	else
+	{
+		MPINodeState[fromNode-1][0] = 0;		
+	}
+	
+	MPIResultCache[jobIterateCount][jobHypothesis] = result_String;
+	result_String = "";
+	
+	return 0;
+}
+
+function SendIterate (dummy)
+{
+	for (mpiNode = 0; mpiNode < MPI_NODE_COUNT-1; mpiNode = mpiNode+1)
+	{
+		if (MPINodeState[mpiNode][0]==0)
+		{
+			break;	
+		}
+	}
+	
+	if (mpiNode==MPI_NODE_COUNT-1)
+	/* all nodes busy */
+	{
+		mpiNode = ReceiveJobs (1,dummy);
+	}
+	else
+	{
+		MPISend (mpiNode+1,simulatedLF);
+		MPINodeState[mpiNode][0] = 1;
+		MPINodeState[mpiNode][1] = bsCounter-1;
+		MPINodeState[mpiNode][2] = dummy;
+	}
+	return 0;
+}
+
+function ManageMPIReturns (dummy)
+{
+	incrementLowerBound = 1;
+	for (jobIterateCount = iteratesScanFrom; jobIterateCount < bsCounter-1; jobIterateCount = jobIterateCount+1)
+	{
+		if (Abs(MPIResultCache[jobIterateCount][0])*Abs(MPIResultCache[jobIterateCount][1]))
+		{
+			if (incrementLowerBound)
+			{
+				iteratesScanFrom = iteratesScanFrom+1;
+			}
+			ExecuteCommands (MPIResultCache[jobIterateCount][0]);
+			simulatedResults = simulatedLF_MLES;
+			ExecuteCommands (MPIResultCache[jobIterateCount][1]);
+			simulatedResults2 = simulatedLF_MLES;
+			MPIResultCache[jobIterateCount][0] = "";
+			MPIResultCache[jobIterateCount][1] = "";
+			dummy = HandleAnIterate (0);
+		}
+		else
+		{
+			incrementLowerBound = 0;
+		}
+	}
+	return 0;
+}
+
diff --git a/res/TemplateBatchFiles/pairwiseDistanceEstimator.ibf b/res/TemplateBatchFiles/pairwiseDistanceEstimator.ibf
new file mode 100644
index 0000000..2f58147
--- /dev/null
+++ b/res/TemplateBatchFiles/pairwiseDistanceEstimator.ibf
@@ -0,0 +1,370 @@
+RequireVersion ("0.9920070118");
+
+MESSAGE_LOGGING 		   = 0;
+VERBOSITY_LEVEL 		   = -1;
+TRY_NUMERIC_SEQUENCE_MATCH = 1;
+
+_pddSNS 				   = 0;
+
+
+/*------------------------------------------------------------------------------------------
+	OPTIONS FOR CODON MODELS
+------------------------------------------------------------------------------------------*/
+
+if (Abs(_Genetic_Code) && dataType == 1)
+{
+	ChoiceList (_pddSNS,"Codon Branch Length",1,SKIP_NONE,
+												"Total",      "Synonymous and non-synonymous distance",	
+												"Synonymous", "Synonymous distance",	
+												"Non-synonymous", "Non-synonymous distance");
+	if (_pddSNS < 0)
+	{
+		return 0;
+	}				
+	
+	if (_pddSNS > 0)
+	{
+		ExecuteAFile (HYPHY_LIB_DIRECTORY+"TemplateBatchFiles"+DIRECTORY_SEPARATOR+"dSdNTreeTools.ibf");
+		if (_pddSNS == 1)
+		{
+			BRANCH_LENGTH_STENCIL = (ComputeScalingStencils (0))["Syn"];
+		}
+		else
+		{
+			BRANCH_LENGTH_STENCIL = (ComputeScalingStencils (0))["NonSyn"];		
+		}
+	}
+}
+
+/*------------------------------------------------------------------------------------------
+	MPI SETUP
+------------------------------------------------------------------------------------------*/
+
+if (MPI_NODE_COUNT > 1)
+{
+	_pddMPI      = {MPI_NODE_COUNT-1,2}["-1"];
+	_pddMPIFirst = {};
+	Export (_pddModelExport, USE_LAST_MODEL);
+	DATA_FILE_PRINT_FORMAT = 6;
+}	
+else
+{
+	Tree Inferred_Tree 	    = (1,2);
+}
+
+
+
+
+/*------------------------------------------------------------------------------------------
+	IF THERE EXISTS A TREE
+	SEE IF ONE NEEDS TO ESTIMATE GLOBAL
+	PARAMETERS FOR THE MODEL AND FIX THEM FOR PAIRWISE ESTIMATIONS
+	
+------------------------------------------------------------------------------------------*/
+
+if (Abs(DATAFILE_TREE))
+{
+	if (Abs(_useThisLF))
+	{
+		if (_reoptimizeLFValues)
+		{
+			Tree _fileTree = DATAFILE_TREE;
+			if (_pddVF)
+			{
+				fprintf (stdout, "[RE-OPTIMIZING PARAMETERS]\n");
+			}
+			LikelihoodFunction _pdeLF = (filteredData, _fileTree);
+			Optimize					(_resLF,_pdeLF);
+		}
+		fixGlobalParameters (_useThisLF);
+	}
+	else
+	{
+		Tree _fileTree = DATAFILE_TREE;
+		if (Abs(_Genetic_Code) && dataType == 1)	
+		{
+			DataSetFilter copy_filteredData = CreateFilter (ds,3,"","",GeneticCodeExclusions);
+		}
+		else
+		{
+			DataSetFilter copy_filteredData = CreateFilter (ds,1);	
+		}
+		LikelihoodFunction lf = (copy_filteredData,_fileTree);
+		GetString (_pddNodeID, lf, -1);
+		
+		if (Columns (_pddNodeID["Global Independent"]))
+		{
+			ChoiceList (_paramOption,	"Global parameters",1,SKIP_NONE,
+						"Estimated",	"Estimate global model parameters using a provided tree",
+						"Manual",		"Enter parameter values by hand");
+					
+			if (_paramOption < 0)
+			{
+				return 0;
+			}
+			
+			LoadFunctionLibrary ("GrabBag.bf");
+            
+			if (_paramOption == 0)
+			{
+				if (Abs(_Genetic_Code) && dataType)
+				{
+					defineIfNeeded ("AC",1);
+					defineIfNeeded ("AT",1);
+					defineIfNeeded ("CG",1);
+					defineIfNeeded ("CT",1);
+					defineIfNeeded ("GT",1);
+					
+					_REVMX = {{*,AC*mu,mu,AT*mu}{AC*mu,*,CG*mu,CT*mu}{mu,CG*mu,*,GT*mu}{AT*mu,CT*mu,GT*mu,*}};
+
+					if (_pddVF)
+					{
+						fprintf (stdout, "[OBTAINING APPROXIMATE BRANCH LENGTHS FROM A NUCLEOTIDE MODEL]\n");
+					}
+					DataSetFilter	 	_nucData = CreateFilter (ds,1);
+					HarvestFrequencies	(_nucF,_nucData,1,1,1);
+					Model _REVModel =   (_REVMX,_nucF,1);
+					
+					Tree 			 	_nucTree = DATAFILE_TREE;
+					
+					LikelihoodFunction nuc_lf = (_nucData,_nucTree);
+					Optimize 		  (res,nuc_lf);
+					global 			   _bsf = 0.33;
+					global			   _gW	= 1;
+					ReplicateConstraint ("this1.?.synRate:=_bsf*this2.?.mu__",_fileTree,_nucTree);
+					ReplicateConstraint ("this1.?.nonSynRate:=_gW*this2.?.synRate",_fileTree,_fileTree);
+				}
+				if (_pddVF)
+				{
+					fprintf (stdout, "[OBTAINING GLOBAL PARAMETER ESTIMATES FROM THE SUPPLIED TREE]\n");
+				}
+				/*AUTO_PARALLELIZE_OPTIMIZE = 1;
+				VERBOSITY_LEVEL = 1;*/
+				Optimize (res,lf);
+				VERBOSITY_LEVEL = -1;
+				/*AUTO_PARALLELIZE_OPTIMIZE = 0;*/
+				ClearConstraints (_fileTree);
+				echoGlobalParameters ("lf");
+				fixGlobalParameters ("lf");
+			}
+			else
+			{
+				promptForGlobalParameters ("lf");
+				echoGlobalParameters 	  ("lf");
+			}
+		}
+	}
+}
+
+
+
+/*------------------------------------------------------------------------------------------
+	MAIN LOOP
+------------------------------------------------------------------------------------------*/
+
+if (_pddVF)
+{
+	fprintf (stdout, "[STARTING DISTANCE COMPUTATIONS]\n");
+	_pTimer	 = Time (1);
+	_pLastU	 = _pTimer;
+	_pDone	 = 1;
+	_pTotal  = ds.species*(ds.species-1)/2;
+}
+
+
+for (_pddi = 0; _pddi<ds.species-1; _pddi=_pddi+1)
+{
+	for (_pddj = 0; _pddj<=_pddi; _pddj = _pddj+1)
+	{
+		if (dataType)
+		{
+			DataSetFilter twoSpecFilter = CreateFilter (filteredData,3,"",speciesIndex==_pddi+1 || speciesIndex==_pddj,GeneticCodeExclusions);
+            GetDataInfo (s1, twoSpecFilter, 0);
+            GetDataInfo (s2, twoSpecFilter, 1);
+		}
+		else
+		{
+			DataSetFilter twoSpecFilter = CreateFilter (filteredData,1,"",speciesIndex==_pddi+1 || speciesIndex==_pddj);
+            GetDataInfo (s1, twoSpecFilter, 0);
+            GetDataInfo (s2, twoSpecFilter, 1);
+			if (pairwiseAlign)
+			{
+				inStr = {{s1^{{"[\\?\\-]",""}},s2^{{"[\\?\\-]",""}}}};
+			}
+		}
+		if (MPI_NODE_COUNT > 1)
+		{
+			_nexusJob      = "";
+			_nexusJobShort = "";
+			_nexusJob      * 256;
+			_nexusJobShort * 256;
+            
+            if (pairwiseAlign)
+            {
+            _pddFilterExport = "alignOptions = " + alignOptions + ";\n" + 
+                               "inStr=" + inStr + ";\n" + 
+                                "AlignSequences(aligned, inStr, alignOptions);" + 
+                                "aligned = aligned[0];" + 
+                                "s1 = \">1\\n\" + aligned[1] + \"\\n>2\\n\" + aligned[2] + \"\\n\";" + 
+                                "DataSet ds 			= ReadFromString (s1);";
+                                //"DataSetFilter twoSpecFilter = CreateFilter (realigned,1);";  
+            }
+            else
+            {
+            _pddFilterExport = "aligned = aligned[0];" + 
+                                "s1 = \">1\\n\"" + s1 + "\"\\n>2\\n\"" + s2 + "\"\\n\";" + 
+                                "DataSet ds 			= ReadFromString (s1);";
+                               // "DataSetFilter twoSpecFilter = CreateFilter (realigned,1);";  
+            }
+ 
+			_nexusJob * _pddFilterExport;
+			_nexusJobShort * _pddFilterExport;
+           
+			
+			_nexusJob      * ("\nBRANCH_LENGTH_STENCIL="+BRANCH_LENGTH_STENCIL+";\n");
+			_nexusJob      * _pddModelExport;
+			_nexusJob      * ("PRESERVE_SLAVE_NODE_STATE=1;TRY_NUMERIC_SEQUENCE_MATCH=1;Tree givenTree = (1,2);");
+			if (dataType)
+			{
+				_nexusJob *      ("DataSetFilter twoSpecFilter = CreateFilter (ds,3,\"\",\"\",\""+GeneticCodeExclusions+"\");");
+				_nexusJobShort * ("DataSetFilter twoSpecFilter = CreateFilter (ds,3,\"\",\"\",\""+GeneticCodeExclusions+"\");");
+			}
+			else
+			{
+				_nexusJob * "DataSetFilter twoSpecFilter = CreateFilter (ds,1);";
+				_nexusJobShort * "DataSetFilter twoSpecFilter = CreateFilter (ds,1);";
+			}
+			_nexusJob * "LikelihoodFunction lf = (twoSpecFilter,givenTree);Optimize(res,lf);return BranchLength (givenTree,0);\n";
+			_nexusJob * 0;
+			_nexusJobShort * "LikelihoodFunction lf = (twoSpecFilter,givenTree);Optimize(res,lf);return BranchLength (givenTree,0);\n";
+			_nexusJobShort * 0;
+            
+            //fprintf (stdout, _nexusJobShort, "\n");
+		}
+        else
+        {
+            if (pairwiseAlign)
+            {
+                AlignSequences(aligned, inStr, alignOptions);
+                aligned = aligned[0];
+                s1 = ">1\n" + aligned[1] + "\n>2\n" + aligned[2] + "\n";
+                //fprintf (stdout, s1, "\n");
+                DataSet realigned 			= ReadFromString (s1);
+                DataSetFilter twoSpecFilter = CreateFilter (realigned,1);  
+            }
+        }
+        
+		_pddSendJobs (_pddi,_pddj); 
+	}
+}
+
+/*------------------------------------------------------------------------------------------
+	MPI CLEANUP
+------------------------------------------------------------------------------------------*/
+
+if (MPI_NODE_COUNT > 1)
+{
+	_jr = 0;
+	for (_pddNodeID = 0; _pddNodeID < MPI_NODE_COUNT-1; _pddNodeID = _pddNodeID + 1)
+	{
+		if (_pddMPI[_pddNodeID][0] > 0)
+		{
+			_jr = _jr + 1;
+		}
+	}
+	while (_jr)
+	{
+		_pddReceiveJobs (0);
+		_jr = _jr - 1;
+	}
+}
+
+/*------------------------------------------------------------------------------------------
+	 CLEANUP
+------------------------------------------------------------------------------------------*/
+
+BRANCH_LENGTH_STENCIL = 0;
+
+/*------------------------------------------------------------------------------------------
+	RECEIVE FINISHED JOBS
+------------------------------------------------------------------------------------------*/
+
+function _pddReceiveJobs (dummy)
+{
+	if (MPI_NODE_COUNT > 1)
+	{
+		MPIReceive (-1,_pddFromNode,_pddRes);
+		_di = _pddMPI[_pddFromNode-1][0];
+		_dj = _pddMPI[_pddFromNode-1][1];
+		ExecuteCommands ("_dk="+_pddRes);
+		_pddMPI[_pddFromNode-1][0] = -1;
+		_pddMPI[_pddFromNode-1][1] = -1;
+	}
+	else
+	{
+		_di 	= _pddi;
+		_dj		= _pddj;
+		_dk 	= BranchLength 		  (Inferred_Tree,0);
+        
+        //fprintf (stdout, _dk, "\n");
+	}
+	
+	distanceMatrix[_dj][_di+1]  = _dk;
+	distanceMatrix[_di+1][_dj]  = _dk;
+	if (_pddVF)
+	{
+		_pDone	 = _pDone + 1;
+		_pTimer2 = Time(1);
+		GetString (_n1, filteredData,_dj);
+		GetString (_n2, filteredData,_di+1);
+		if (_pTimer2 - _pLastU > 1)
+		{
+			_pLastU	 = _pTimer2;
+			fprintf (stdout,"DONE WITH ",_pDone,"/", _pTotal, " EVALUATIONS. ETA: ",(_pTotal-_pDone)/_pDone*(_pTimer2-_pTimer)," seconds \n");
+		}
+	}	
+	return _pddFromNode;
+}
+
+/*------------------------------------------------------------------------------------------
+	SEND A JOB
+------------------------------------------------------------------------------------------*/
+
+function _pddSendJobs (_di2,_dj2)
+{
+	if (MPI_NODE_COUNT > 1)
+	{
+		for (_pddNodeID = 0; _pddNodeID < MPI_NODE_COUNT-1; _pddNodeID = _pddNodeID + 1)
+		{
+			if (_pddMPI[_pddNodeID][0] < 0)
+			{
+				break;
+			}
+		}
+		if (_pddNodeID == MPI_NODE_COUNT-1)
+		{
+			_pddNodeID = _pddReceiveJobs (0) - 1;
+		}
+		
+		_pddMPI [_pddNodeID][0] = _di2;
+		_pddMPI [_pddNodeID][1] = _dj2;
+		if (_pddMPIFirst[_pddNodeID] == 0)
+		{	
+			_pddMPIFirst[_pddNodeID] = 1;
+			MPISend (_pddNodeID+1,_nexusJob);
+		}
+		else
+		{
+			MPISend (_pddNodeID+1,_nexusJobShort);		
+		}
+	}
+	else
+	{
+		LikelihoodFunction lf   =  (twoSpecFilter,Inferred_Tree);
+		Optimize 				  (res,lf);
+		_pddReceiveJobs			  (0);
+	}
+	return 0;
+}
+
+/*------------------------------------------------------------------------------------------*/
diff --git a/res/TemplateBatchFiles/pairwiseDistanceEstimatorCounter.ibf b/res/TemplateBatchFiles/pairwiseDistanceEstimatorCounter.ibf
new file mode 100644
index 0000000..8f4f7a5
--- /dev/null
+++ b/res/TemplateBatchFiles/pairwiseDistanceEstimatorCounter.ibf
@@ -0,0 +1,10 @@
+result = {vecSize,1};
+j = 0;
+for (r = fromRow; r <= toRow; r = r + 1)
+{
+	for (c = r+1; c < ds.species; c = c + 1)
+	{
+		result [j] = ComputeDistanceFormula (r,c);
+		j = j + 1;
+	}
+}
diff --git a/res/TemplateBatchFiles/partitionSequences.ibf b/res/TemplateBatchFiles/partitionSequences.ibf
new file mode 100644
index 0000000..6041c2c
--- /dev/null
+++ b/res/TemplateBatchFiles/partitionSequences.ibf
@@ -0,0 +1,95 @@
+goOn = 1;
+while (goOn)
+{
+
+	if (promptFor2ndRegExp)
+	{
+		fprintf (stdout,"\nEnter a regular expression to define the first clade:");
+		fscanf  (stdin,"String",theRegExp);
+		fprintf (stdout,"\nEnter a regular expression to define the second clade:");
+		fscanf  (stdin,"String",theRegExp2);
+	
+	}
+	else
+	{
+		fprintf (stdout,"\nEnter a reg exp to separate the sequences into two clades:");
+		fscanf  (stdin,"String",theRegExp);
+	}
+
+	cladeA = {};
+	cladeB = {};
+
+	st1 = "";
+	st2 = "";
+
+
+	for (specIndex = 0; specIndex < ds.species; specIndex = specIndex + 1)
+	{
+		GetString (specName, ds, specIndex);
+		specMatch = specName $ theRegExp;
+		
+		if (specMatch[0]>=0)
+		{
+			cladeA [specName] = 1;
+			if (Abs(st1))
+			{
+				st1 = st1 + "," + specName;
+			}
+			else
+			{
+				st1 = specName;
+			}
+			
+		}
+		else
+		{
+			if (promptFor2ndRegExp)
+			{
+				specMatch = specName $ theRegExp2;
+				if (specMatch[0] < 0)
+				{
+					continue;
+				}
+			}
+			cladeB [specName] = 1;
+			if (Abs(st2))
+			{
+				st2 = st2 + "," + specName;
+			}
+			else
+			{
+				st2 = specName;
+			}
+		}
+	}
+
+	st1 = "(("+st1+"),"+st2+")";
+	Topology splitTop = st1;
+	
+	clASize = Abs (cladeA);
+	clBSize = Abs (cladeB);
+	
+	if (clASize == 0 || clBSize == 0 || (clASize + clBSize < ds.species) && (promptFor2ndRegExp==0))
+	{
+		fprintf (stdout, "\nERROR: invalid sequence partitionings - one of the clades is empty or there were duplicate sequence names\n");
+		return 0;
+	}
+
+	fprintf (stdout, "\n\nClade 1 includes ", clASize," sequences:\n");
+	cladeKeys = Rows (cladeA);
+	for (specIndex = 0; specIndex < clASize; specIndex = specIndex + 1)
+	{
+		fprintf (stdout, "\t", cladeKeys[specIndex],"\n");
+	}
+
+	fprintf (stdout, "\n\nClade 2 includes ", clBSize," sequences:\n");
+	cladeKeys = Rows (cladeB);
+	for (specIndex = 0; specIndex < clBSize; specIndex = specIndex + 1)
+	{
+		fprintf (stdout, "\t", cladeKeys[specIndex],"\n");
+	}
+	
+	fprintf (stdout, "\nIs this partitioning correct (y/n)");
+	fscanf (stdin, "String", goOn);
+	goOn = (goOn[0] == "n" || goOn[0] == "N");
+}
diff --git a/res/TemplateBatchFiles/post_ancestors.bf b/res/TemplateBatchFiles/post_ancestors.bf
new file mode 100644
index 0000000..c784b48
--- /dev/null
+++ b/res/TemplateBatchFiles/post_ancestors.bf
@@ -0,0 +1,27 @@
+likelihoodFnChoice = 0;
+if (Rows("LikelihoodFunction")>1)
+{
+	ChoiceList  (likelihoodFnChoice,"Choose a Likelihood Function",1,NO_SKIP,LikelihoodFunction);
+}		
+
+if (likelihoodFnChoice<0)
+{
+	return;
+} 
+			 
+LIKELIHOOD_FUNCTION_OUTPUT = response;
+
+if (RESTORE_GLOBALS)
+{
+	dumb = RestoreGlobalValues (likelihoodFnChoice);
+}
+
+GetString(likelihoodFunctionName,LikelihoodFunction,likelihoodFnChoice);
+
+DataSet 		ancestralSequences = ReconstructAncestors(likelihoodFunctionName__);
+
+DataSetFilter 	ancestralSequencesDF = CreateFilter (ancestralSequences,1);
+
+SetDialogPrompt ("Save ancestral sequences to:");
+
+fprintf (PROMPT_FOR_FILE,CLEAR_FILE,ancestralSequencesDF);
diff --git a/res/TemplateBatchFiles/post_counting.bf b/res/TemplateBatchFiles/post_counting.bf
new file mode 100644
index 0000000..e338a28
--- /dev/null
+++ b/res/TemplateBatchFiles/post_counting.bf
@@ -0,0 +1,54 @@
+ChoiceList  (response,"Subsitution Bias",1,NO_SKIP,
+			 "None","All nucleotide substitutions have the same probability.",
+			 "Custom","Nucleotide substitutions are weighted by their relative rates.",
+			 "Load","Load a saved matrix of substitution biases");			 
+			 
+if (response<0)
+{
+	return;
+}
+
+useCustomCountingBias = 0;
+
+function promptRate (pString)
+{
+	rateValue = -1;
+	while (rateValue < 0)
+	{
+		fprintf (stdout, "\nEnter the rate for ", pString, " subsitutions (>=0):");
+		fscanf (stdin,"String",rateValue);
+	}
+	return rateValue;
+}
+
+if (response)
+{
+	if (response == 1)
+	{
+		ACRATE = promptRate ("A<->C");
+		AGRATE = promptRate ("A<->G");
+		ATRATE = promptRate ("A<->T");
+		CGRATE = promptRate ("C<->G");
+		CTRATE = promptRate ("C<->T");
+		GTRATE = promptRate ("G<->T");
+		
+		_EFV_MATRIX0_ = {{0,ACRATE__,AGRATE__,ATRATE__}
+						{ACRATE__,0,CGRATE__,CTRATE__}
+						{AGRATE__,CGRATE__,0,GTRATE__}
+						{ATRATE__,CTRATE__,GTRATE__,0}};
+	}
+	else
+	{
+		SetDialogPrompt ("Load saved bias matrix:");
+		fscanf (PROMPT_FOR_FILE,"NMatrix", _EFV_MATRIX0_);
+	}
+
+	_EFV_MATRIX1_ = _EFV_MATRIX0_;				
+	_EFV_MATRIX2_ = _EFV_MATRIX0_;
+	
+	useCustomCountingBias = 1;
+}
+
+#include "SGEmulator.bf";
+
+useCustomCountingBias = 0;
diff --git a/res/TemplateBatchFiles/post_covariance.bf b/res/TemplateBatchFiles/post_covariance.bf
new file mode 100644
index 0000000..a1cd61f
--- /dev/null
+++ b/res/TemplateBatchFiles/post_covariance.bf
@@ -0,0 +1,54 @@
+likelihoodFnChoice = 0;
+
+if (Rows("LikelihoodFunction")>1)
+{
+	ChoiceList  (likelihoodFnChoice,"Choose a Likelihood Function",1,NO_SKIP,LikelihoodFunction);
+}		
+
+if (likelihoodFnChoice<0)
+{
+	return;
+} 
+			 
+ChoiceList  (response,"Covariance Matrix",1,NO_SKIP,
+			 "Crude covariances","1st order derivative approximation. This could be slow, since it entails ~p(p-1)/2 calculations of the likelihood function, where p = # independent parameters.",
+			 "Finer covariances","2nd order derivative approximation. This could be very slow, since it entails ~p(p-1)*2 calculations of the likelihood function, where p = # of independent parameters.",
+			 "Likelihood Profile","95% CI based on the quadratic approximation to the likelihood surface. Should be faster than full covariance matrices for large numbers of parameters and may be more robust to statistical errors.");
+
+			 
+if (response<0)
+{
+	return;
+}
+
+if (response == 2)
+{
+	COVARIANCE_PRECISION = 0.95;
+}
+else
+{	
+	COVARIANCE_PRECISION = response+1;
+}
+
+GetString (likelihoodFunctionName,LikelihoodFunction,likelihoodFnChoice);
+
+if (RESTORE_GLOBALS)
+{
+	RestoreGlobalValues (likelihoodFnChoice);
+}
+
+CovarianceMatrix (covMatrix, *likelihoodFunctionName);
+
+SetDialogPrompt ("Save Covariance Matrix to:");
+
+fprintf (PROMPT_FOR_FILE,CLEAR_FILE,"Order of parameters:\n");
+
+covDim = Rows(covMatrix);
+
+for (covCounter = 0; covCounter<covDim; covCounter=covCounter+1)
+{
+	GetString (argName,*likelihoodFunctionName,covCounter);
+	fprintf (LAST_FILE_PATH,"\t",argName);
+}
+
+fprintf (LAST_FILE_PATH,covMatrix);
diff --git a/res/TemplateBatchFiles/post_dNdS.bf b/res/TemplateBatchFiles/post_dNdS.bf
new file mode 100644
index 0000000..c8a85e1
--- /dev/null
+++ b/res/TemplateBatchFiles/post_dNdS.bf
@@ -0,0 +1,144 @@
+function valueGrab (varName&)
+{
+	return varName;
+}
+
+T = TipCount (givenTree);
+
+maxLength = 0;
+
+for (h = 0; h<T; h=h+1)
+{
+	bName = Abs(TipName (givenTree,h));
+	if (bName>maxLength)
+	{
+		maxLength = bName;
+	}
+}
+
+T = BranchCount (givenTree);
+
+for (h = 0; h<T; h=h+1)
+{
+	bName = Abs(BranchName (givenTree,h));
+	if (bName>maxLength)
+	{
+		maxLength = bName;
+	}
+}
+
+fprintf (stdout,"\nLeaf branches: \n\n");
+
+T = TipCount (givenTree);
+
+for (h = 0; h<T; h=h+1)
+{
+	bName = TipName (givenTree,h);
+	fprintf (stdout,bName);
+	for (v = Abs(bName); v<maxLength; v=v+1)
+	{
+		fprintf (stdout," ");
+	}
+	fprintf (stdout,": ",GetBranchDNDS (bName),"\n");
+}
+
+T = BranchCount (givenTree);
+
+if (T>0)
+{
+	fprintf (stdout,"\nInternal Branches:\n\n");
+	for (h = 0; h<T; h=h+1)
+	{
+		bName = BranchName (givenTree,h);
+		fprintf (stdout,bName);
+		for (v = Abs(bName); v<maxLength; v=v+1)
+		{
+			fprintf (stdout," ");
+		}
+		fprintf (stdout,": ",GetBranchDNDS (bName),"\n");
+	}
+}
+
+branchNames = BranchName (givenTree,-1);
+T = Columns (branchNames);
+
+ExecuteCommands(
+"GetInformation (aRateMx, givenTree."+branchNames[0]+");");
+
+/* make syn and non-syn template matrices */
+
+nonStopCount = Columns (aRateMx);
+
+synM    = {nonStopCount,nonStopCount};
+nonSynM = {nonStopCount,nonStopCount};
+
+vertOnes = {nonStopCount,1};
+horOnes  = {1,nonStopCount};
+
+for (h1 = 0; h1<nonStopCount; h1=h1+1)
+{
+	vertOnes [h1] = 1;
+	horOnes  [h1] = 1;
+}
+
+hShift = 0;
+for (h1 = 0; h1 < 64; h1=h1+1)
+{
+	gc1 = _Genetic_Code[h1];
+	if (gc1 == 10)
+	{
+		hShift = hShift+1;
+	}
+	else
+	{
+		vShift = hShift;
+		for (v1 = h1+1; v1 < 64; v1=v1+1)
+		{
+			gc2 = _Genetic_Code[v1];
+			if (gc2 == 10)
+			{
+				vShift = vShift + 1;
+			}
+			else
+			{
+				if (gc1 == gc2)
+				{
+					synM [h1-hShift][v1-vShift] = vectorOfFrequencies[h1-hShift];
+					synM [v1-vShift][h1-hShift] = vectorOfFrequencies[v1-vShift];
+				}
+				else
+				{
+					nonSynM [h1-hShift][v1-vShift] = vectorOfFrequencies[h1-hShift];
+					nonSynM [v1-vShift][h1-hShift] = vectorOfFrequencies[v1-vShift];
+				}
+			}
+		}
+	}
+}
+
+synSubsAVL = {};
+nsSubsAVL  = {};
+
+#include "TreeTools.ibf";
+
+for (h1=0; h1 < T-1; h1=h1+1)
+{
+	abn = branchNames[h1];
+	ExecuteCommands("GetInformation (aRateMx, givenTree."+abn+");");
+	synSubs  = (horOnes*(aRateMx$synM))*vertOnes;
+	nsynSubs = (horOnes*(aRateMx$nonSynM))*vertOnes;
+	synSubs = synSubs[0]/3;
+	nsynSubs = nsynSubs[0]/3;
+	
+	synSubsAVL[abn] = synSubs;
+	nsSubsAVL [abn] = nsynSubs;
+}
+
+treeAVL = givenTree ^ 0;
+
+synTreeString 		= PostOrderAVL2StringDistances (treeAVL, synSubsAVL); 
+nonSynTreeString	= PostOrderAVL2StringDistances (treeAVL, nsSubsAVL);
+
+fprintf (stdout, "\nE[Syn subs/nucleotide site] tree: \n\t",    synTreeString, 	   "\n");
+fprintf (stdout, "\nE[Non-syn subs/nucleotide site] tree: \n\t", nonSynTreeString, "\n");
+
diff --git a/res/TemplateBatchFiles/post_lfprofile.bf b/res/TemplateBatchFiles/post_lfprofile.bf
new file mode 100644
index 0000000..c2fc193
--- /dev/null
+++ b/res/TemplateBatchFiles/post_lfprofile.bf
@@ -0,0 +1,18 @@
+likelihoodFnChoice = 0;
+
+if (Rows("LikelihoodFunction")>1)
+{
+	ChoiceList  (likelihoodFnChoice,"Choose a Likelihood Function",1,NO_SKIP,LikelihoodFunction);
+}		
+
+if (likelihoodFnChoice<0)
+{
+	return;
+} 
+
+GetString (likelihoodFunctionName,LikelihoodFunction,likelihoodFnChoice);
+
+if (RESTORE_GLOBALS)
+{
+	dumb = RestoreGlobalValues (likelihoodFnChoice);
+}
diff --git a/res/TemplateBatchFiles/post_npbs.bf b/res/TemplateBatchFiles/post_npbs.bf
new file mode 100644
index 0000000..d1354d1
--- /dev/null
+++ b/res/TemplateBatchFiles/post_npbs.bf
@@ -0,0 +1,16 @@
+nOfI = 0;
+
+while (nOfI<=0)
+{
+	fprintf (stdout,"\nHow many data replicates should be generated?:");
+	fscanf  (stdin,"Number",nOfI);
+}  
+
+SetDialogPrompt ("Save detailed bootstrap results to:");
+
+DEFAULT_FILE_SAVE_NAME = "Bootstrap.out";
+fprintf (PROMPT_FOR_FILE,CLEAR_FILE);
+
+MESSAGE_LOGGING = 0;
+BootStrapFunction(nOfI,LAST_FILE_PATH,0);
+MESSAGE_LOGGING = 1;
diff --git a/res/TemplateBatchFiles/post_pbs.bf b/res/TemplateBatchFiles/post_pbs.bf
new file mode 100644
index 0000000..19d0fbd
--- /dev/null
+++ b/res/TemplateBatchFiles/post_pbs.bf
@@ -0,0 +1,15 @@
+nOfI = 0;
+
+while (nOfI<=0)
+{
+	fprintf (stdout,"\nHow many data replicates should be generated?:");
+	fscanf  (stdin,"Number",nOfI);
+}  
+
+SetDialogPrompt ("Save detailed bootstrap results to:");
+
+fprintf (PROMPT_FOR_FILE,CLEAR_FILE);
+
+MESSAGE_LOGGING = 0;
+dumb = BootStrapFunction(nOfI,LAST_FILE_PATH,1);
+MESSAGE_LOGGING = 1;
diff --git a/res/TemplateBatchFiles/post_sampler.bf b/res/TemplateBatchFiles/post_sampler.bf
new file mode 100644
index 0000000..7744e3d
--- /dev/null
+++ b/res/TemplateBatchFiles/post_sampler.bf
@@ -0,0 +1,210 @@
+likelihoodFnChoice = 0;
+
+if (Rows("LikelihoodFunction")>1)
+{
+	ChoiceList  (likelihoodFnChoice,"Choose a Likelihood Function",1,NO_SKIP,LikelihoodFunction);
+}		
+
+if (likelihoodFnChoice<0)
+{
+	return;
+} 
+	
+GetString (LF_NAME,LikelihoodFunction,likelihoodFnChoice);
+
+ChoiceList  (sMethod,"Sampling Method",1,NO_SKIP,
+			 "Normal + SiR","Sample parameters using multivariate normal with the estimated variance-covariance matrix",
+			 "Latin Hypercube + SiR","Sample parameters using latin hypercube sampling scheme with intervals derived using profile likelihood (possibly inflated)");
+			 
+if (sMethod<0)
+{
+	return;
+}
+
+ExecuteCommands("GetString (LF_VARS,"+LF_NAME+",-1);");
+
+catVars  = LF_VARS["Categories"];
+globVars = LF_VARS["Global Independent"];
+locVars  = LF_VARS["Local Independent"];
+
+lvc = Columns (locVars);
+gvc = Columns (globVars);
+
+sMarginals = 0;
+
+SetDialogPrompt ("Save results to:");
+fprintf (PROMPT_FOR_FILE,CLEAR_FILE);
+baseResPath = LAST_FILE_PATH;
+
+if (Columns(catVars)>0)
+{
+	ChoiceList  (sMarginals,"Save marginals",1,NO_SKIP,
+				 "Skip","Do not save site-by-site conditional probabilities",
+				 "Save","Save site-by-site conditional probabilities to a file for later processing",
+				 "Save all","Save even the samples which were rejected");
+				 
+	if (sMarginals < 0)
+	{
+		return;
+	}	
+	else
+	{
+		if (sMarginals)
+		{
+			marginalOutFile = baseResPath+".marginals";
+			fprintf (marginalOutFile,CLEAR_FILE);
+			ExecuteCommands ("GetInformation (catVarList,"+LF_NAME+");");
+			if (sMarginals > 1)
+			{
+				marginalOutFileAll = baseResPath+".marginals.all";
+				marginalOutFileLF  = baseResPath+".marginals.all.logL";
+				fprintf (marginalOutFileAll,CLEAR_FILE);
+				fprintf (marginalOutFileLF ,CLEAR_FILE);
+			}
+		}
+	}
+}
+
+if (lvc && gvc)
+{
+ChoiceList  (pMethod,"Parameters to Sample",1,NO_SKIP,
+			 "All","Sample all independent parameters",
+			 "Global","Sample global model parameters only",
+			 "Local","Sample local model parameter only",
+			 "Choose","Choose which parameters to sample",
+			 "RegExp","Sample model parameters which match a regular expression");
+			 
+	if (pMethod < 0) {
+		return;
+	}
+}
+else
+{
+	if (Columns(globVars))
+	{
+		ChoiceList  (pMethod,"Parameters to Sample",1,NO_SKIP,
+					 "All","Sample all independent parameters",
+					 "Global","Sample global model parameters only",
+					 "Choose","Choose which parameters to sample",
+			         "RegExp","Sample model parameters which match a regular expression");
+		if (pMethod < 0) {
+			return;
+		}
+		else {
+			if (pMethod >= 2) {
+				pMethod += 1;
+			}
+		}
+	}
+	else
+	{
+		ChoiceList  (pMethod,"Parameters to Sample",1,NO_SKIP,
+					 "All","Sample all independent parameters",
+					 "Local","Sample locl model parameters only",
+					 "Choose","Choose which parameters to sample",
+			         "RegExp","Sample model parameters which match a regular expression");
+		if (pMethod < 0) {
+			return;
+		}
+		else {
+			if (pMethod) {
+				pMethod += 1;
+			}
+		}	
+	}
+}
+
+COVARIANCE_PARAMETER = {};
+
+choiceList  = {lvc + gvc, 2};
+chosenParms = {lvc + gvc, 1}; 
+
+for (k=0; k < gvc; k=k+1)
+{
+	choiceList[k][0] = globVars[k];
+	choiceList[k][1] = "Global variable " + globVars[k];
+}
+
+for (k=0; k < lvc; k=k+1)
+{
+	choiceList[gvc+k][0] = locVars[k];
+	choiceList[gvc+k][1] = "Local variable " + locVars[k];
+}
+
+if (pMethod == 3)
+{
+	ChoiceList  (vMethod,"Parameters to Sample",0,NO_SKIP,choiceList);
+	if (vMethod[0] < 0)
+	{
+		return;
+	}
+	gvc = Columns(vMethod);
+	for (k=0; k<gvc; k=k+1)
+	{
+		lvc = vMethod[k];
+		chosenParms[lvc] = 1;
+	}
+}
+else
+{
+	if (pMethod == 0) {
+	    chosenParms = chosenParms["1"];
+	}
+	else {
+		if (pMethod == 1) {
+			for (k=0; k<gvc; k=k+1) {
+				chosenParms[k] = 1;
+			}
+		}
+		else {
+		    if (pMethod == 4) {
+		        fprintf (stdout, "Please enter a regular expression to filter the parameter names with:");
+		        fscanf  (stdin,"String",filtering_regexp);   
+		        chosenParms = chosenParms["(choiceList[_MATRIX_ELEMENT_ROW_][0]$filtering_regexp)[0]>=0"];
+		        for (k = 0; k < Rows (chosenParms); k+=1) {
+		            if (chosenParms[k]) {
+		                fprintf (stdout, "Selected ", choiceList[k][0], " for sampling\n");
+		            }
+		        }
+		    } else {
+		        chosenParms = chosenParms["1"];
+			}
+		}
+	}
+}
+
+for (k=Columns(locVars)+Columns(globVars)-1; k>=0; k=k-1)
+{
+	if (chosenParms[k])
+	{
+		lvc = choiceList[k][0];
+		COVARIANCE_PARAMETER [lvc] = 1;
+	}
+}
+
+SAMPLE_N = 0;
+
+while (SAMPLE_N<1)
+{
+	fprintf (stdout, "How many samples should be drawn? (>=1)");
+	fscanf  (stdin,"Number",SAMPLE_N);
+}	
+
+SAMPLE_N = SAMPLE_N$1;
+SAMPLE_M = 0;
+
+while (SAMPLE_M<1 || SAMPLE_M > SAMPLE_N)
+{
+	fprintf (stdout, "How many re-samples should be drawn? [1,", SAMPLE_N, "]");
+	fscanf  (stdin,"Number",SAMPLE_M);
+}	
+SAMPLE_M = SAMPLE_M$1;
+
+if (sMethod)
+{
+	ExecuteAFile("Samplers/lhc.bf");
+}
+else
+{
+	ExecuteAFile("Samplers/sir.bf");
+}
diff --git a/res/TemplateBatchFiles/post_saveResults.bf b/res/TemplateBatchFiles/post_saveResults.bf
new file mode 100644
index 0000000..d70e7e3
--- /dev/null
+++ b/res/TemplateBatchFiles/post_saveResults.bf
@@ -0,0 +1,37 @@
+likelihoodFnChoice = 0;
+if (Rows("LikelihoodFunction")>1)
+{
+	ChoiceList  (likelihoodFnChoice,"Choose a Likelihood Function",1,NO_SKIP,LikelihoodFunction);
+}		
+
+if (likelihoodFnChoice<0)
+{
+	return;
+} 
+			 
+ChoiceList  (response,"Likelihood Function Display",1,NO_SKIP,
+			 "Value Only","Display Only the ln-likelihood value.",
+			 "List","Display the ln-likelihood value followed by a list of parameter estimates.",
+			 "Standard Tree","Display the ln-likelihood value followed by a tree string with branch lengths representing the expected number of substitutions per site.",
+			 "Parameters only","Display the list of independent parameters and constraints.",
+			 "Parameters+Values","Display the list of parameter names, constraints and MLEs.",
+			 "Parameters+Values+Trees","Display the list of parameter names, constraints and MLEs followed by tree string(s) with branch lengths representing the expected number of substitutions per site.",
+			 "Export Analysis","Save all the components of the analysis in a self-contained HyPhy batch file.");
+
+if (response<0)
+{
+	return;
+}
+
+LIKELIHOOD_FUNCTION_OUTPUT = response;
+
+GetString (likelihoodFunctionName,LikelihoodFunction,likelihoodFnChoice);
+
+SetDialogPrompt ("Save results to:");
+
+if (RESTORE_GLOBALS)
+{
+	RestoreGlobalValues (likelihoodFnChoice);
+}
+
+ExecuteCommands ("fprintf (PROMPT_FOR_FILE, CLEAR_FILE, `likelihoodFunctionName`,\"\n\");");
diff --git a/res/TemplateBatchFiles/post_sns.bf b/res/TemplateBatchFiles/post_sns.bf
new file mode 100644
index 0000000..8c4c57c
--- /dev/null
+++ b/res/TemplateBatchFiles/post_sns.bf
@@ -0,0 +1,96 @@
+ChoiceList  (response,"Output options",1,NO_SKIP,
+			 "Display","Display trees on the console (and graphically if GUI is present).",
+			 "Save to file","Save tree strings to a file (syn followed by non-syn)");
+			 
+if (response<0)
+{
+	return 0;
+}
+
+branchNames = BranchName (givenTree,-1);
+T 			= Columns    (branchNames);
+
+
+
+
+synSubsAVL = {};
+dSAVL	   = {};
+nsSubsAVL  = {};
+dNAVL	   = {};
+
+ExecuteAFile (HYPHY_LIB_DIRECTORY+"TemplateBatchFiles"+DIRECTORY_SEPARATOR+"Utility"+DIRECTORY_SEPARATOR+"CodonTools.bf");
+_snsAVL	   = _computeSNSSites ("filteredData", _Genetic_Code, vectorOfFrequencies, 0);
+
+ExecuteAFile ("TreeTools.ibf");
+
+nonStopSites = sSites+nsSites;				 
+
+fprintf (stdout, "\nTotal nucleotide sites :", filteredData.sites*3,
+				 "\nTotal sense codon sites:", nonStopSites,
+				 "\nSynonymous  sites      :", sSites, 
+				 "\nNonsynonymous  sites   :", nsSites, "\n");
+
+sSites  = nonStopSites/sSites;
+nsSites = nonStopSites/nsSites;
+				 
+
+for (h1=0; h1 < T-1; h1=h1+1)
+{
+	abn = branchNames[h1];
+	ExecuteCommands("GetInformation (aRateMx, givenTree."+abn+");");
+	synSubs  = ((horOnes*(aRateMx$synM))*vertOnes)[0]/3;
+	nsynSubs = ((horOnes*(aRateMx$nonSynM))*vertOnes)[0]/3;
+	
+	synSubsAVL[abn] = synSubs;
+	nsSubsAVL [abn] = nsynSubs;
+	dSAVL[abn]	    = synSubs *sSites;
+	dNAVL[abn]	    = nsynSubs*nsSites;
+}
+
+treeAVL = givenTree ^ 0;
+
+synTreeString 		= PostOrderAVL2StringDistances (treeAVL, synSubsAVL); 
+nonSynTreeString	= PostOrderAVL2StringDistances (treeAVL, nsSubsAVL);
+dSTreeString 		= PostOrderAVL2StringDistances (treeAVL, dSAVL); 
+dNTreeString	    = PostOrderAVL2StringDistances (treeAVL, dNAVL);
+
+
+if (response == 0)
+{
+	fprintf (stdout, "\nE[Syn subs/nucleotide site] tree: \n\t",     synTreeString, 	   "\n");
+	fprintf (stdout, "\nE[Non-syn subs/nucleotide site] tree: \n\t", nonSynTreeString, "\n");
+	fprintf (stdout, "\ndS tree: \n\t", dSTreeString, "\n");
+	fprintf (stdout, "\ndN tree: \n\t", dNTreeString, "\n");
+
+	UseModel (USE_NO_MODEL);
+
+	Tree 	synSubsTree 	= synTreeString;
+	Tree	nonsynSubsTree 	= nonSynTreeString;
+	Tree 	dSTree 	= dSTreeString;
+	Tree	dNTree 	= dNTreeString;
+
+	mxTreeSpec  = {5,1};
+
+	mxTreeSpec [0] = "nonsynSubsTree";
+	mxTreeSpec [3] = "";
+	mxTreeSpec [4] = "Inferred_Tree."+nodeName;
+	mxTreeSpec [1] = "8211";
+	mxTreeSpec [2] = "";
+
+
+	OpenWindow (TREEWINDOW, mxTreeSpec,"(SCREEN_WIDTH-50)/2;(SCREEN_HEIGHT-50)/2;10;40");
+
+	mxTreeSpec [0] = "synSubsTree";
+	OpenWindow (TREEWINDOW, mxTreeSpec,"(SCREEN_WIDTH-50)/2;(SCREEN_HEIGHT-50)/2;30+(SCREEN_WIDTH-30)/2;40");
+
+	mxTreeSpec [0] = "dSTree";
+	OpenWindow (TREEWINDOW, mxTreeSpec,"(SCREEN_WIDTH-50)/2;(SCREEN_HEIGHT-50)/2;10;45+(SCREEN_HEIGHT-50)/2");
+
+	mxTreeSpec [0] = "dNTree";
+	OpenWindow (TREEWINDOW, mxTreeSpec,"(SCREEN_WIDTH-50)/2;(SCREEN_HEIGHT-50)/2;30+(SCREEN_WIDTH-30)/2;45+(SCREEN_HEIGHT-50)/2");
+}
+else
+{
+	SetDialogPrompt ("Save trees to file:");
+	fprintf (PROMPT_FOR_FILE, CLEAR_FILE, synTreeString, ";\n", nonSynTreeString, ";\n",dSTreeString, ";\n", dNTreeString, ";\n");
+}
diff --git a/res/TemplateBatchFiles/post_variance.bf b/res/TemplateBatchFiles/post_variance.bf
new file mode 100644
index 0000000..f7317c6
--- /dev/null
+++ b/res/TemplateBatchFiles/post_variance.bf
@@ -0,0 +1,141 @@
+likelihoodFnChoice = 0;
+
+if (Rows("LikelihoodFunction")>1) {
+	ChoiceList  (likelihoodFnChoice,"Choose a Likelihood Function",1,NO_SKIP,LikelihoodFunction);
+}		
+
+if (likelihoodFnChoice<0) {
+	return;
+} 
+			 
+ChoiceList  (response,"Covariance Matrix",1,NO_SKIP,
+			 "Crude covariances","1st order derivative approximation. This could be slow, since it entails ~p(p-1)/2 calculations of the likelihood function, where p = # independent parameters.",
+			 "Finer covariances","2nd order derivative approximation. This could be very slow, since it entails ~p(p-1)*2 calculations of the likelihood function, where p = # of independent parameters.",
+			 "Likelihood Profile","95% CI based on the quadratic approximation to the likelihood surface. Should be faster than full covariance matrices for large numbers of parameters and may be more robust to statistical errors.");
+
+			 
+if (response<0) {
+	return 1;
+}
+
+if (response == 2) {
+	COVARIANCE_PRECISION = 0.95;
+} else {	
+	COVARIANCE_PRECISION = response+1;
+}
+
+GetString (likelihoodFunctionName,LikelihoodFunction,likelihoodFnChoice);
+
+if (RESTORE_GLOBALS) {
+	RestoreGlobalValues (likelihoodFnChoice);
+}
+
+CovarianceMatrix (covMatrix, *likelihoodFunctionName);
+
+fprintf   (stdout, "\n\n\t\tVARIANCE ESTIMATES\n\n");
+
+nameWidth = 10;
+
+for (covCounter = 0; covCounter<Rows(covMatrix); covCounter += 1) {
+	GetString (argName,*likelihoodFunctionName,covCounter);
+	nameWidth = Max (nameWidth, Abs (argName));
+}
+
+
+
+fprintf (stdout,"+");
+for (counter = 0; counter<nameWidth+1; counter=counter+1)
+{
+	fprintf (stdout,"-");
+}
+fprintf (stdout,"+");
+for (counter = counter+1; counter<nameWidth+11; counter=counter+1)
+{
+	fprintf (stdout,"-");
+}
+fprintf (stdout,"+");
+counter = counter+1;
+for (; counter<nameWidth+24; counter=counter+1)
+{
+	fprintf (stdout,"-");
+}
+fprintf (stdout,"+");
+counter = counter+1;
+for (; counter<nameWidth+45; counter=counter+1)
+{
+	fprintf (stdout,"-");
+}
+fprintf (stdout,"+\n| Parameter ");
+for (covCounter = 0; covCounter<nameWidth-10; covCounter=covCounter+1)
+{
+	fprintf (stdout," ");
+}
+fprintf (stdout,"|  Value  |  Std. Dev. | 95% Conf. Interval |");
+for (covCounter = 0; covCounter<Rows(covMatrix); covCounter=covCounter+1)
+{
+	fprintf (stdout,"\n+");
+	for (counter = 0; counter<nameWidth+1; counter=counter+1)
+	{
+		fprintf (stdout,"-");
+	}
+	fprintf (stdout,"+");
+	for (counter = counter+1; counter<nameWidth+11; counter=counter+1)
+	{
+		fprintf (stdout,"-");
+	}
+	fprintf (stdout,"+");
+	counter = counter+1;
+	for (; counter<nameWidth+24; counter=counter+1)
+	{
+		fprintf (stdout,"-");
+	}
+	fprintf (stdout,"+");
+	counter = counter+1;
+	for (; counter<nameWidth+45; counter=counter+1)
+	{
+		fprintf (stdout,"-");
+	}
+	fprintf (stdout,"+\n| ");
+	GetString (argName,*likelihoodFunctionName,covCounter);
+	fprintf (stdout, argName);
+	argLength = Abs(argName);
+	for (counter = 0; counter<nameWidth-argLength; counter=counter+1)
+	{
+		fprintf (stdout," ");
+	}
+	GetInformation (parValue,argName);
+	if (response<2)
+	{
+		parVar = covMatrix[covCounter][covCounter];
+		parValue=parValue[0];
+		parVar = Sqrt(Abs(parVar));
+		fprintf (stdout,"|",Format(parValue,9,4),"|",Format(parVar,12,8),"|", "(", Format(Max(parValue-1.96*parVar,0),8,4),",",Format(parValue+1.96*parVar,8,4),") |");
+	}
+	else
+	{
+		fprintf (stdout,"|",Format(covMatrix[covCounter][1],9,4),"|    N/A     |", "(", Format(Max(covMatrix[covCounter][0],0),8,4),",",Format(covMatrix[covCounter][2],8,4),") |");	
+	}
+}
+fprintf (stdout,"\n+");
+for (counter = 0; counter<nameWidth+1; counter=counter+1)
+{
+	fprintf (stdout,"-");
+}
+fprintf (stdout,"+");
+for (counter = counter+1; counter<nameWidth+11; counter=counter+1)
+{
+	fprintf (stdout,"-");
+}
+fprintf (stdout,"+");
+counter = counter+1;
+for (; counter<nameWidth+24; counter=counter+1)
+{
+	fprintf (stdout,"-");
+}
+fprintf (stdout,"+");
+counter = counter+1;
+for (; counter<nameWidth+45; counter=counter+1)
+{
+	fprintf (stdout,"-");
+}
+fprintf (stdout,"+\n| ");
diff --git a/res/TemplateBatchFiles/post_viewResults.bf b/res/TemplateBatchFiles/post_viewResults.bf
new file mode 100644
index 0000000..a2b7274
--- /dev/null
+++ b/res/TemplateBatchFiles/post_viewResults.bf
@@ -0,0 +1,34 @@
+likelihoodFnChoice = 0;
+if (Rows("LikelihoodFunction")>1)
+{
+	ChoiceList  (likelihoodFnChoice,"Choose a Likelihood Function",1,NO_SKIP,LikelihoodFunction);
+}		
+
+if (likelihoodFnChoice<0)
+{
+	return;
+} 
+			 
+ChoiceList  (response,"Likelihood Function Display",1,NO_SKIP,
+			 "Value Only","Display Only the ln-likelihood value.",
+			 "List","Display the ln-likelihood value followed by a list of parameter estimates.",
+			 "Standard Tree","Display the ln-likelihood value followed by a tree string with branch lengths representing the expected number of substitutions per site.",
+			 "Parameters only","Display the list of independent parameters and constraints.",
+			 "Parameters+Values","Display the list of parameter names, constraints and MLEs.",
+			 "Parameters+Values+Trees","Display the list of parameter names, constraints and MLEs followed by tree string(s) with branch lengths representing the expected number of substitutions per site.");
+			 
+			 
+if (response<0)
+{
+	return;
+}
+
+LIKELIHOOD_FUNCTION_OUTPUT = response;
+
+if (RESTORE_GLOBALS)
+{
+	dumb = RestoreGlobalValues (likelihoodFnChoice);
+}
+
+GetString (likelihoodFunctionName,LikelihoodFunction,likelihoodFnChoice);
+fprintf   (stdout, "\n", likelihoodFunctionName__ ,"\n");
diff --git a/res/TemplateBatchFiles/postprocessors.lst b/res/TemplateBatchFiles/postprocessors.lst
new file mode 100644
index 0000000..9571db0
--- /dev/null
+++ b/res/TemplateBatchFiles/postprocessors.lst
@@ -0,0 +1,16 @@
+"View Results","post_viewResults.bf","!A_DISTANCE_METHOD";
+"Save Results","post_saveResults.bf","!A_DISTANCE_METHOD";
+"Rate Classes","categoryEcho.bf","categoriesUsed";
+"SEPARATOR","","";
+"Variance Estimates","post_variance.bf","!A_DISTANCE_METHOD";
+"Save Covariance Matrix","post_covariance.bf","!A_DISTANCE_METHOD";
+"SEPARATOR","","";
+"Parametric Bootstrap","post_pbs.bf","IS_BOOTSTRAP_AVAILABLE";
+"Nonparametric Bootstrap","post_npbs.bf","IS_NPBOOTSTRAP_AVAILABLE";
+"Parameter Sampler","post_sampler.bf","Rows("LikelihoodFunction")>0";
+"SEPARATOR","","";
+"dN-dS for Branches","post_dNdS.bf","IS_DNDS_AVAILABLE";
+"Syn and non-syn trees","post_sns.bf","Abs(_Genetic_Code)";
+"SEPARATOR","","";
+"Ancestral Sequences","post_ancestors.bf","!A_DISTANCE_METHOD";
+"Suzuki-Gojobori Derived Adapative Selection Tool","post_counting.bf","(!A_DISTANCE_METHOD)&&Abs(GeneticCodeExclusions)";
diff --git a/res/TemplateBatchFiles/qndhelper1.ibf b/res/TemplateBatchFiles/qndhelper1.ibf
new file mode 100644
index 0000000..bbf33d2
--- /dev/null
+++ b/res/TemplateBatchFiles/qndhelper1.ibf
@@ -0,0 +1,860 @@
+LoadFunctionLibrary ("CF3x4");
+
+function BuildCodonFrequencies (obsF)
+{
+	if (!ModelMatrixDimension)
+	{
+		ModelMatrixDimension = 64;
+		for (h = 0 ;h<64; h=h+1)
+		{
+			if (_Genetic_Code[h]==10)
+			{
+				ModelMatrixDimension = ModelMatrixDimension-1;
+			}
+		}
+	}
+
+	PIStop = 1.0;
+	result = {ModelMatrixDimension,1};
+	hshift = 0;
+
+	for (h=0; h<64; h=h+1)
+	{
+		first = h$16;
+		second = h%16$4;
+		third = h%4;
+		if (_Genetic_Code[h]==10) 
+		{
+			hshift = hshift+1;
+			PIStop = PIStop-obsF[first][0]*obsF[second][1]*obsF[third][2];
+			continue; 
+		}
+		result[h-hshift][0]=obsF[first][0]*obsF[second][1]*obsF[third][2];
+	}
+	return result*(1.0/PIStop);
+}
+
+/*------------------------------------------------------------------------*/
+
+function ReportSite1 (siteI, siteM)
+{
+	fullSites[siteI][0] = doneSites[siteM][0];
+	fullSites[siteI][1] = doneSites[siteM][1];
+	fullSites[siteI][2] = doneSites[siteM][2];
+	fullSites[siteI][3] = doneSites[siteM][3];
+
+	fprintf (stdout, "Site ", Format(siteI+1,5,0)," dN/dS = ", Format(doneSites[siteM][0],12,5),
+					 " Full Log(L) = ", Format(doneSites[siteM][3],12,5),
+					 " LRT = ",Format(doneSites[siteM][1],12,5), 
+					 " p-value = ",Format(doneSites[siteM][2],12,5));
+
+	if (doneSites[siteM][2]<pValue)
+	{
+		if (fullSites[siteI][0]>1)
+		{
+			fprintf (stdout, " *P");
+		}
+		else
+		{
+			fprintf (stdout, " *N");
+		}
+		
+	}
+	fprintf (stdout, "\n");
+	return 0;
+}
+
+/*------------------------------------------------------------------------*/
+
+function ReportSite2 (siteI, siteM)
+{
+	fullSites[siteI][0] = doneSites[siteM][0];
+	fullSites[siteI][1] = doneSites[siteM][1];
+	fullSites[siteI][2] = doneSites[siteM][6];
+	fullSites[siteI][3] = doneSites[siteM][2];
+	fullSites[siteI][4] = doneSites[siteM][3];
+	fullSites[siteI][5] = doneSites[siteM][4];
+	fullSites[siteI][6] = doneSites[siteM][5];
+	if (Columns (fullSites) > 7)
+	{
+		fullSites[siteI][7] = doneSites[siteM][7];	
+	}
+
+
+	fprintf (stdout, "| Codon: ", 		Format(siteI+1,4,0),
+					 "| dN/dS: ", 		Format(fullSites[siteI][2],10,2),
+					 "| dN: ", 			Format(fullSites[siteI][0],5,2),
+					 "| dS: ", 			Format(fullSites[siteI][1],5,2),
+					 "| dS(=dN): ",		Format(fullSites[siteI][3],5,2),
+					 "| Log(L): ",		Format(fullSites[siteI][6],10,2),
+					 "| LRT: ",			Format(fullSites[siteI][4],5,2),
+					 "| p: ",			Format(fullSites[siteI][5],5,2));		
+
+	if (Columns (fullSites) > 7)
+	{
+		fprintf (stdout, "| dN_other: ", 		Format(fullSites[siteI][7],5,2));
+	}
+					 
+	if (fullSites[siteI][5]<pValue)
+	{
+		if (fullSites[siteI][0]>fullSites[siteI][1])
+		{
+			fprintf (stdout, " *P");
+		}
+		else
+		{
+			fprintf (stdout, " *N");
+		}
+	}
+	fprintf (stdout, "\n");
+	return 0;
+}
+
+
+
+/*------------------------------------------------------------------------*/
+
+function ReportSite3 (siteI, siteM)
+{
+	fullSites[siteI][0] = doneSites[siteM][0];
+	fullSites[siteI][1] = doneSites[siteM][1];
+	fullSites[siteI][2] = doneSites[siteM][2];
+
+
+	fprintf (stdout, "Site ", Format(siteI+1,4,0),
+					 " dS = ", Format(fullSites[siteI][0],7,4),
+					 " dN = ", Format(fullSites[siteI][1],7,4),
+					 " Log(L) ",Format(fullSites[siteI][2],7,4),"\n");		
+					 
+	return 0;
+}
+
+/*------------------------------------------------------------------------*/
+
+function ReceiveJobs1 (sendOrNot)
+{
+	MPIReceive (-1, fromNode, result_String);
+	
+	siteIndex = MPINodeState[fromNode-1][1];
+	
+	if (sendOrNot)
+	{
+		MPISend (fromNode,siteLikelihood);
+		MPINodeState[fromNode-1][1] = siteCount;			
+	}
+	else
+	{
+		MPINodeState[fromNode-1][0] = 0;
+		MPINodeState[fromNode-1][1] = -1;		
+	}
+	
+	ExecuteCommands (result_String);
+	
+	siteMap = dupInfo[siteIndex];
+	doneSites[siteMap][0] = dNdS;
+	dNdS = 1;
+	LFCompute (siteLikelihood,LF_START_COMPUTE);
+	LFCompute (siteLikelihood,nullLF);
+	LFCompute (siteLikelihood,LF_DONE_COMPUTE);
+	
+
+	doneSites[siteMap][1] = 2*(siteLikelihood_MLES[1][0]-nullLF);
+	doneSites[siteMap][2] = (1-CChi2(doneSites[siteMap][1],1))/2;						
+	doneSites[siteMap][3] = siteLikelihood_MLES[1][0];						
+	
+	dummy = ReportSite1 (siteIndex, siteMap);
+	
+	return fromNode-1;
+}
+/*------------------------------------------------------------------------*/
+
+function ReportSiteMEME (siteI, siteM, doQ)
+{
+    // labels       = {{"omega1","omega2","weight1","weight2","Length_scaler","LRT","p-value","Full Log(L)"}};
+	fullSites[siteI][0] = doneSites[siteM][0];
+	fullSites[siteI][1] = doneSites[siteM][1];
+	fullSites[siteI][2] = doneSites[siteM][2];
+	fullSites[siteI][3] = 1-doneSites[siteM][2];
+	fullSites[siteI][4] = doneSites[siteM][7];
+	fullSites[siteI][5] = doneSites[siteM][3];
+	fullSites[siteI][6] = doneSites[siteM][4];
+	fullSites[siteI][8] = doneSites[siteM][5];
+	
+    if (doQ >= 0) {
+       fullSites[siteI][7] = doQ;
+       qStr = "| q: " + Format(fullSites[siteI][7],5,2);
+    } else {
+       qStr = "";
+    }
+    
+
+	fprintf (stdout, "| Codon: ", 		Format(siteI+1,4,0),
+					 "| Beta1: ", 		Format(fullSites[siteI][0],10,2),
+					 "| P(Beta1): ", 	Format(fullSites[siteI][2],5,2),
+					 "| Beta2: ", 		Format(fullSites[siteI][1],10,2),
+					 "| P(Beta2): ",	Format(fullSites[siteI][3],5,2),
+					 "| alpha: ",		Format(fullSites[siteI][4],10,2),
+					 "| LRT: ",			Format(fullSites[siteI][5],6,2),
+					 "| p: ",			Format(fullSites[siteI][6],5,2),	
+                     qStr,	
+					 "| Log(L): ",		Format(fullSites[siteI][8],5,2));		
+
+	if (fullSites[siteI][6]<pValue)
+	{
+		if (fullSites[siteI][1]>fullSites[siteI][4])
+		{
+			fprintf (stdout, " *P");
+		}
+	}
+	fprintf (stdout, "\n");
+	return 0;
+}
+/*------------------------------------------------------------------------*/
+
+function ReceiveJobs4 (sendOrNot, nullAlt)
+{
+	MPIReceive (-1, fromNode, result_String);
+	
+	siteIndex = MPINodeState[fromNode-1][1];
+	siteNA	  = MPINodeState[fromNode-1][2];
+	
+	if (sendOrNot)
+	{
+		MPISend (fromNode,siteLikelihood);
+		MPINodeState[fromNode-1][1] = siteCount;			
+		MPINodeState[fromNode-1][2] = nullAlt;			
+	}
+	else
+	{
+		MPINodeState[fromNode-1][0] = 0;
+		MPINodeState[fromNode-1][1] = -1;		
+	}
+	
+	siteMap = dupInfo[siteIndex];
+	
+	ExecuteCommands (result_String);
+	
+	if (siteNA)
+	{
+		doneSites[siteMap][0] = dNdS;
+		doneSites[siteMap][1] = doneSites[siteMap][1]+2*siteLikelihood_MLES[1][0];
+		doneSites[siteMap][3] = siteLikelihood_MLES[1][0];
+	}
+	else
+	{
+		doneSites[siteMap][1] = doneSites[siteMap][1]-2*siteLikelihood_MLES[1][0];	
+	}
+
+	if (doneSites[siteMap][2] == 0)
+	{
+		doneSites[siteMap][2] = -1;
+	}
+	else
+	{
+		if (doneSites[siteMap][2] == (-1))
+		{
+			doneSites[siteMap][2] = 1-CChi2(doneSites[siteMap][1],1);						
+			dummy = ReportSite1 (siteIndex, siteMap);
+		}
+	}
+	
+	return fromNode-1;
+}
+
+/*------------------------------------------------------------------------*/
+
+function ReceiveJobs2 (sendOrNot, nullAlt)
+{
+	MPIReceive (-1, fromNode, result_String);
+	
+	siteIndex = MPINodeState[fromNode-1][1];
+	siteNA	  = MPINodeState[fromNode-1][2];
+	
+	if (sendOrNot)
+	{
+		MPISend (fromNode,siteLikelihood);
+		MPINodeState[fromNode-1][1] = siteCount;			
+		MPINodeState[fromNode-1][2] = nullAlt;			
+		MPINodeState[fromNode-1][3] = MPINodeState[fromNode-1][3]+1;			
+	}
+	else
+	{
+		MPINodeState[fromNode-1][0] = 0;
+		MPINodeState[fromNode-1][1] = -1;		
+	}
+	
+	siteMap = dupInfo[siteIndex];
+		
+	ExecuteCommands (result_String);
+	
+	nFValue = siteLikelihood_MLE_VALUES ["nFactor"];
+	sFValue = siteLikelihood_MLE_VALUES ["sFactor"];
+	if (Columns (doneSites) > 7)
+	{
+		noFValue = siteLikelihood_MLE_VALUES ["nFactorOther"];
+	}
+	
+	if (siteNA)
+	{
+		doneSites[siteMap][0] = nFValue;
+		doneSites[siteMap][1] = sFValue;
+		if (Columns (doneSites) > 7)
+		{
+			doneSites[siteMap][7] = noFValue;
+		}
+		
+			/*if ((sFactor > 1e-10) || (nFactor > 1e-10))
+			{
+				svpc = COVARIANCE_PRECISION;
+				COVARIANCE_PRECISION = -1;
+				if (sFactor < 1e-10 && nFactor > 1e-10)
+				{
+					global inverseRatioEstimator = 0;
+					sFactor := inverseRatioEstimator*nFactor;
+					COVARIANCE_PARAMETER = "inverseRatioEstimator";
+					CovarianceMatrix (covMx,siteLikelihood);
+					sFactor = doneSites[siteMap][1];
+					doneSites[siteMap][6] = 1/covMx[0][2];
+				}
+				else
+				{
+					if (sFactor > 1e-10 && nFactor < 1e-10)
+					{
+						global inverseRatioEstimator = 0;
+						nFactor := inverseRatioEstimator*sFactor;
+						COVARIANCE_PARAMETER = "inverseRatioEstimator";
+						CovarianceMatrix (covMx,siteLikelihood);
+						nFactor = doneSites[siteMap][0];
+						doneSites[siteMap][6] = 1/covMx[0][2];
+					}
+					else
+					{
+						global inverseRatioEstimator = nFactor/sFactor;
+						nFactor := inverseRatioEstimator*sFactor;
+						COVARIANCE_PARAMETER = "inverseRatioEstimator";
+						CovarianceMatrix (covMx,siteLikelihood);
+						nFactor = doneSites[siteMap][0];
+						if (nFactor>sFactor)
+						{
+							doneSites[siteMap][6] = covMx[0][0];
+						}
+						else
+						{
+							doneSites[siteMap][6] = 1/covMx[0][2];					
+						}
+					}
+				}
+				COVARIANCE_PRECISION = svpc;
+			}
+			else
+			{
+				doneSites[siteMap][6] = 0;
+			}*/
+			
+		doneSites[siteMap][6] = nFValue/sFValue;
+		doneSites[siteMap][3] = doneSites[siteMap][3]+2*siteLikelihood_MLES[1][0];
+		doneSites[siteMap][5] = siteLikelihood_MLES[1][0];
+	}
+	else
+	{
+		doneSites[siteMap][3] = doneSites[siteMap][3]-2*siteLikelihood_MLES[1][0];	
+		doneSites[siteMap][2] = sFValue;
+	}
+
+	if (doneSites[siteMap][4] == 0)
+	{
+		doneSites[siteMap][4] = -1;
+	}
+	else
+	{
+		if (doneSites[siteMap][4] == (-1))
+		{
+			doneSites[siteMap][4] = 1-CChi2(doneSites[siteMap][3],1);						
+			dummy = ReportSite2 (siteIndex, siteMap);
+		}
+	}
+	
+	return fromNode-1;
+}
+
+
+/*------------------------------------------------------------------------*/
+
+function MPISendJobMEME ()
+{
+    for (mpiNode = 0; mpiNode < MPI_NODE_COUNT-1; mpiNode += 1)
+    {
+        if (MPINodeState[mpiNode][0]==0)
+        {
+            break;	
+        }
+    }
+    
+    if (mpiNode == MPI_NODE_COUNT-1)
+    {
+        mpiNode = ReceiveJobsMEME ();
+    }
+    
+    
+    lastKey = Abs(toDoList);
+    
+    if (lastKey > 0)
+    {
+        lastKey  = toDoList ["INDEXORDER"][0];
+        theJob   = toDoList [lastKey];
+        toDoList - lastKey;
+        MPINodeState[mpiNode][1] = theJob[0];	
+
+        filterString = "" + (theJob[0]*3) + "-" + (theJob[0]*3+2);
+        DataSetFilter siteFilter = CreateFilter (filteredData,3,filterString,"",GeneticCodeExclusions);
+        
+        if (theJob[1] == 2)
+        {
+            sFactor   = 1;
+            ClearConstraints (nsFactor2);
+            nsFactor2 :> 0;
+            nsFactor2 = dNdS;
+            OPTIMIZATION_METHOD = 0;
+            MPISend (mpiNode+1, felLikelihood);
+            
+            if (debugVerboseFlag)
+            {
+                fprintf (stdout, "[DEBUG: Sending FEL fit of site ", theJob[0], " to node ", mpiNode+1, "]\n");
+            }
+        }
+        else
+        {
+            if (theJob[1] == 1)
+            {
+                sFactor   = bySiteCache[theJob[0]][0];
+                ClearConstraints (nsFactor2);
+                nsFactor2 :> 0;
+                nsFactor2 = bySiteCache[theJob[0]][1];
+                if (nsFactor2 > sFactor)
+                {
+                    nsFactor1    = 1;
+                    mixingP      = 0.25;
+                }
+                else
+                {
+                    nsFactor1    = nsFactor2/sFactor;
+                    if (nsFactor2 == 0)
+                    {
+                        nsFactor2    = sFactor*0.5;
+                        mixingP      = 0.05;
+                    }
+                    else
+                    {
+                        nsFactor2    = sFactor*1.5;
+                        mixingP      = 0.75;
+                    }
+                }
+                OPTIMIZATION_METHOD = 0;
+                LF_NEXUS_EXPORT_EXTRA = "siteID = " + theJob[0] + "; jobSuffix = \".alt\";" + _memeExtra;
+                MPISend (mpiNode+1, siteLikelihood);
+                //fName = "/Users/sergei/Desktop/" + theJob[0];
+                //fprintf (fName, CLEAR_FILE, MPI_LAST_SENT_MSG);
+                LF_NEXUS_EXPORT_EXTRA = "";
+                if (debugVerboseFlag)
+                {
+                    fprintf (stdout, "[DEBUG: Sending MEME fit of site ", theJob[0], " to node ", mpiNode+1, "]");
+                    fprintf (stdout, "\n\talpha  = ", sFactor,
+                                     "\n\tbeta1  = ", nsFactor1*sFactor,
+                                     "\n\tbeta2  = ", nsFactor2, 
+                                     "\n\tmixing = ", mixingP,
+                                     "\n");
+                }
+            }
+            else
+            {
+                sFactor      = bySiteCache[theJob[0]][0];
+                nsFactor1    = bySiteCache[theJob[0]][1];
+                mixingP      = bySiteCache[theJob[0]][2];
+                omega2       = 1;
+                nsFactor2    := omega2 * sFactor;
+                if (sFactor == 0)
+                {
+                    sFactor = 0.001;
+                }
+                OPTIMIZATION_METHOD = 0;
+                LF_NEXUS_EXPORT_EXTRA =  "siteID = " + theJob[0] + "; jobSuffix = \".null\";" + _memeExtraNull;
+                MPISend (mpiNode+1, siteLikelihood);
+                LF_NEXUS_EXPORT_EXTRA = "";
+                if (debugVerboseFlag)
+                {
+                    fprintf (stdout, "[DEBUG: Sending MEME NULL fit of site ", theJob[0], " to node ", mpiNode+1, "]");
+                    fprintf (stdout, "\n\talpha  = ", sFactor,
+                                     "\n\tbeta1  = ", nsFactor1*sFactor,
+                                     "\n\tbeta2  = ", nsFactor2, 
+                                     "\n\tmixing = ", mixingP,
+                                     "\n");
+                }
+            }
+        }
+ 		MPINodeState[mpiNode][0] = 1;
+		MPINodeState[mpiNode][1] = theJob[0];		
+		MPINodeState[mpiNode][2] = theJob[1];		
+        MPINodeState[mpiNode][3] += 1;
+        
+        if (debugVerboseFlag)
+        {
+            fileOut = "/tmp/" + theJob[0] + "." + theJob[1];
+            fprintf (fileOut, CLEAR_FILE, MPI_LAST_SENT_MSG);
+        }
+    }
+    else
+    {
+        if (+(MPINodeState [-1][0]))
+        {
+            ReceiveJobsMEME();
+        }
+    }
+    
+    return +(MPINodeState [-1][0]) || Abs(toDoList);
+}
+
+/*------------------------------------------------------------------------*/
+
+function ReceiveJobsMEME ()
+{
+	MPIReceive (-1, fromNode, result_String);
+	
+	siteIndex = MPINodeState[fromNode-1][1];
+	siteNAF	  = MPINodeState[fromNode-1][2];
+	
+    MPINodeState[fromNode-1][0] = 0;
+    MPINodeState[fromNode-1][1] = -1;		
+	
+	siteMap = dupInfo[siteIndex];
+		
+	if (siteNAF == 1)
+	{	
+	    res = Eval (result_String);
+	    siteLikelihood_MLES = res["MLES"];
+	    siteLikelihood_MLE_VALUES = res["VALUES"];
+	    byBranchEstimates    = res["BRANCHES"];
+	    bySiteBranchReports [siteMap] = byBranchEstimates;
+	}
+	else
+	{
+	    ExecuteCommands (result_String);
+	}
+	
+    if (siteNAF < 2)
+    {
+        nsf1V   = siteLikelihood_MLE_VALUES ["nsFactor1"];
+        nsf2V   = siteLikelihood_MLE_VALUES ["nsFactor2"];
+        omega2F = siteLikelihood_MLE_VALUES ["omega2"];
+
+        mixingF = siteLikelihood_MLE_VALUES ["mixingP"];
+        sFValue = siteLikelihood_MLE_VALUES ["sFactor"];
+    }
+    else
+    {
+        nsf2V   = felLikelihood_MLE_VALUES ["nsFactor2"];
+        sFValue = felLikelihood_MLE_VALUES ["sFactor"];
+    }
+	
+	if (siteNAF == 1) // alternative
+	{
+        doneSites[siteMap][0] = nsf1V*sFValue;
+        doneSites[siteMap][1] = nsf2V;
+        doneSites[siteMap][2] = mixingF;
+        doneSites[siteMap][6] = 1-mixingF;                                        
+        doneSites[siteMap][7] = sFValue;
+		
+		doneSites[siteMap][3] = doneSites[siteMap][3]+2*siteLikelihood_MLES[1][0];
+		doneSites[siteMap][5] = siteLikelihood_MLES[1][0];
+        
+        bySiteCache[siteIndex][0] = sFValue;
+        bySiteCache[siteIndex][1] = nsf1V;
+        bySiteCache[siteIndex][2] = mixingF;
+        
+        if (debugVerboseFlag)
+        {
+            fprintf (stdout, "[DEBUG: Received MEME alternative fit of site ", siteIndex, " from node ", fromNode, "]");
+            fprintf (stdout, "\n\talpha  = ", doneSites[siteMap][7],
+                             "\n\tbeta1  = ", doneSites[siteMap][0],
+                             "\n\tbeta2  = ", doneSites[siteMap][1],
+                             "\n\tmixing = ", doneSites[siteMap][2],
+                             "\n");
+        }
+
+
+       if (nsf2V > sFValue)
+        {
+            toDoList["MEME_NULL_" + siteIndex] = {{siteIndex__,0}};
+            if (debugVerboseFlag)
+            {
+                fprintf (stdout, "[DEBUG: Added null model fit for site ", siteIndex, " to the queue]\n");
+            }       
+        }
+        else
+        {
+            doneSites[siteMap][3] = 0;
+            doneSites[siteMap][4] = -1;
+        }
+	}
+	else 
+    {
+        if (siteNAF == 2) // FEL
+        {
+            bySiteCache[siteIndex][0] = sFValue;
+            bySiteCache[siteIndex][1] = nsf2V;
+            toDoList ["MEME_ALT_" + siteIndex] = {{siteIndex__,1}};
+            if (debugVerboseFlag)
+            {
+                fprintf (stdout, "[DEBUG: Received FEL fit of site ", siteIndex, " from node ", fromNode, "]");
+                fprintf (stdout, "\n\talpha  = ", sFValue,
+                                 "\n\tbeta  = ", nsf2V,
+                                 "\n");
+            }
+            
+        }
+        else // null
+        {
+            doneSites[siteMap][3] = doneSites[siteMap][3]-2*siteLikelihood_MLES[1][0];	
+            if (debugVerboseFlag)
+            {
+                fprintf (stdout, "[DEBUG: Received MEME NULL fit of site ", siteIndex, " from node ", fromNode, "]");
+                fprintf (stdout, "\n\talpha  = ",  sFValue,
+                                 "\n\tbeta1  = ",  nsf1V,
+                                 "\n\tomega2  = ", omega2F,
+                                 "\n\tmixing = ",  mixingF,
+                                 "\n");
+            }
+        }
+    }
+
+    if (siteNAF < 2)
+    {
+        if (doneSites[siteMap][4] == 0)
+        {
+            doneSites[siteMap][4] = -1;
+        }
+        else
+        {
+            if (doneSites[siteMap][4] == (-1))
+            {
+                doneSites[siteMap][4] = 2/3-2/3*(0.45*CChi2(doneSites[siteMap][3],1)+0.55*CChi2(doneSites[siteMap][3],2));						
+                ReportSiteMEME (siteIndex, siteMap, -1);
+            }
+        }
+    }
+	
+	return fromNode-1;
+}
+
+/*------------------------------------------------------------------------*/
+
+function ReceiveJobs3 (sendOrNot)
+{
+	MPIReceive (-1, fromNode, result_String);
+	
+	siteIndex = MPINodeState[fromNode-1][1];
+	
+	if (sendOrNot)
+	{
+		MPISend (fromNode,siteLikelihood);
+		MPINodeState[fromNode-1][1] = siteCount;			
+	}
+	else
+	{
+		MPINodeState[fromNode-1][0] = 0;
+		MPINodeState[fromNode-1][1] = -1;		
+	}
+	
+	siteMap = dupInfo[siteIndex];
+	
+	ExecuteCommands (result_String);
+	
+	doneSites[siteMap][0] = sFactor;
+	doneSites[siteMap][1] = nFactor;
+	doneSites[siteMap][2] = siteLikelihood_MLES[1][0];
+
+	ReportSite3 (siteIndex, siteMap);
+	
+	return fromNode-1;
+}
+
+/*------------------------------------------------------------------------*/
+
+if (_DO_TREE_REBALANCE_ == None) {
+    _DO_TREE_REBALANCE_ = 1;
+}
+
+if (pipeThroughFlag == 0)
+{
+	#include   "TemplateModels/chooseGeneticCode.def";
+	ChoiceList (nrChoice, "New/Restore",1,SKIP_NONE,
+				"New Analysis","Perform a new analysis.",
+				"Restore", "Restore an earlier nucleotide fit");
+				
+	if (nrChoice < 0)
+	{
+		return;
+	}
+}
+
+global AC 	= 1;
+global AT 	= 1;
+global CG 	= 1;
+global CT 	= 1;
+global GT 	= 1;
+global dNdS = 1;		
+
+NucleotideMatrix	 = {{*,AC*t,t,AT*t}{AC*t,*,CG*t,CT*t}{t,CG*t,*,GT*t}{AT*t,CT*t,GT*t,*}};
+
+if (nrChoice == 0)
+{
+	if (pipeThroughFlag == 0)
+	{
+		SetDialogPrompt ("Please specify a codon data file:");
+
+		DataSet 	  ds 		= ReadDataFile (PROMPT_FOR_FILE);
+
+
+		ChoiceList (modelChoice, "Model Options",1,SKIP_NONE,
+					"Default","Use HKY85 and MG94xHKY85.",
+					"Custom", "Use any reversible nucleotide model crossed with MG94.");
+					
+		if (modelChoice < 0)
+		{
+			return;
+		}
+
+		modelDesc = "";
+
+		if (modelChoice)
+		{
+			done = 0;
+			while (!done)
+			{
+				fprintf (stdout,"\nPlease enter a 6 character model designation (e.g:010010 defines HKY85):");
+				fscanf  (stdin,"String", modelDesc);
+				if (Abs(modelDesc)==6)
+				{	
+					done = 1;
+				}
+			}			
+		}
+		else
+		{
+			modelDesc = "010010";
+		}
+	}
+
+	DataSetFilter filteredData = CreateFilter (ds,3,"","",GeneticCodeExclusions);
+	DataSetFilter nucData 	= CreateFilter (filteredData,1);
+	
+	ModelTitle = ""+modelDesc[0];
+				
+	rateBiasTerms = {{"AC","1","AT","CG","CT","GT"}};
+	paramCount	  = 0;
+
+	modelConstraintString = "";
+
+	for (customLoopCounter2=1; customLoopCounter2<6; customLoopCounter2=customLoopCounter2+1)
+	{
+		for (customLoopCounter=0; customLoopCounter<customLoopCounter2; customLoopCounter=customLoopCounter+1)
+		{
+			if (modelDesc[customLoopCounter2]==modelDesc[customLoopCounter])
+			{
+				ModelTitle  = ModelTitle+modelDesc[customLoopCounter2];	
+				if (rateBiasTerms[customLoopCounter2] == "1")
+				{
+					modelConstraintString = modelConstraintString + rateBiasTerms[customLoopCounter]+":="+rateBiasTerms[customLoopCounter2]+";";
+				}
+				else
+				{
+					modelConstraintString = modelConstraintString + rateBiasTerms[customLoopCounter2]+":="+rateBiasTerms[customLoopCounter]+";";			
+				}
+				break;
+			}
+		}
+		if (customLoopCounter==customLoopCounter2)
+		{
+			ModelTitle = ModelTitle+modelDesc[customLoopCounter2];	
+		}
+	}	
+
+	if (Abs(modelConstraintString))
+	{
+		ExecuteCommands (modelConstraintString);
+	}
+
+
+	HarvestFrequencies (overallFrequencies,  nucData,1,1,0);
+	HarvestFrequencies (rawPositionFrequencies, nucData,3,1,1);
+    
+    positionFrequencies = CF3x4 (rawPositionFrequencies, GeneticCodeExclusions);
+	codonFrequencies    = BuildCodonFrequencies(positionFrequencies);
+
+	Model NucModel = (NucleotideMatrix, overallFrequencies, 1);
+
+	
+	if (pipeThroughFlag == 0)
+	{
+		#include	 "queryTree.bf";
+		SetDialogPrompt ("Save nucleotide model fit to:");
+		fprintf (PROMPT_FOR_FILE, CLEAR_FILE);
+		NUC_FILE_PATH = LAST_FILE_PATH;
+	}
+	else
+	{
+		Tree givenTree = treeString;
+	}
+}
+else
+{
+	if (pipeThroughFlag == 0)
+	{
+		SetDialogPrompt ("Restore nucleotide fit from:");
+		fscanf (PROMPT_FOR_FILE, "Raw", a);
+		ExecuteCommands (a);
+		DataSetFilter filteredData = CreateFilter (ds,3,"","",GeneticCodeExclusions);
+		HarvestFrequencies (positionFrequencies, nucData,3,1,1);
+		codonFrequencies = BuildCodonFrequencies(positionFrequencies);
+		
+		treeString = ""+givenTree;
+		
+		pMatch = {6,1};
+		pCheck = {{AC__,AT__,CG__,CT__,GT__}};
+		if (pCheck[0] == 1)
+		{
+			ModelTitle = "00";
+			pCount = 1;
+			pMatch[0] = 1;
+		}
+		else
+		{
+			pCount = 2;
+			ModelTitle = "01";
+			pMatch[0] = pCheck[0];
+			pMatch[1] = 1;	
+		}
+		
+		for (l=1; l<5; l=l+1)
+		{	
+			for (k=0; k<pCount; k=k+1)
+			{
+				if (pCheck[l] == pMatch[k])
+				{
+					break;
+				}
+			}
+			
+			if (k<pCount)
+			{
+				ModelTitle = ModelTitle + k;
+			}
+			else
+			{
+				pMatch[pCount] = pCheck[l];
+				ModelTitle = ModelTitle + pCount;
+				pCount = pCount+1;			
+			}
+		}
+	}
+}
+
diff --git a/res/TemplateBatchFiles/qndhelper1_mf.ibf b/res/TemplateBatchFiles/qndhelper1_mf.ibf
new file mode 100644
index 0000000..ac0f118
--- /dev/null
+++ b/res/TemplateBatchFiles/qndhelper1_mf.ibf
@@ -0,0 +1,310 @@
+function BuildCodonFrequencies (obsF)
+{
+	if (!ModelMatrixDimension)
+	{
+		ModelMatrixDimension = 64;
+		for (h = 0 ;h<64; h=h+1)
+		{
+			if (_Genetic_Code[h]==10)
+			{
+				ModelMatrixDimension = ModelMatrixDimension-1;
+			}
+		}
+	}
+
+	PIStop = 1.0;
+	result = {ModelMatrixDimension,1};
+	hshift = 0;
+
+	for (h=0; h<64; h=h+1)
+	{
+		first = h$16;
+		second = h%16$4;
+		third = h%4;
+		if (_Genetic_Code[h]==10) 
+		{
+			hshift = hshift+1;
+			PIStop = PIStop-obsF[first][0]*obsF[second][1]*obsF[third][2];
+			continue; 
+		}
+		result[h-hshift][0]=obsF[first][0]*obsF[second][1]*obsF[third][2];
+	}
+	return result*(1.0/PIStop);
+}
+
+/*------------------------------------------------------------------------*/
+
+function ReportSite2 (siteI, siteM)
+{
+	fullSites[siteI][0] = doneSites[siteM][0];
+	fullSites[siteI][1] = doneSites[siteM][1];
+	fullSites[siteI][2] = doneSites[siteM][6];
+	fullSites[siteI][3] = doneSites[siteM][2];
+	fullSites[siteI][4] = doneSites[siteM][3];
+	fullSites[siteI][5] = doneSites[siteM][4];
+	fullSites[siteI][6] = doneSites[siteM][5];
+	if (Columns (fullSites) > 7)
+	{
+		fullSites[siteI][7] = doneSites[siteM][7];	
+	}
+
+
+	fprintf (stdout, "Site ", Format(siteI+1,4,0)," dN/dS = ", Format(fullSites[siteI][2],7,4),
+					 " dN = ", Format(fullSites[siteI][0],7,4),
+					 " dS = ", Format(fullSites[siteI][1],7,4),
+					 " dS(=dN) ",Format(fullSites[siteI][3],7,4),
+					 " Full Log(L) = ",Format(fullSites[siteI][6],7,4),
+					 " LRT= ",Format(fullSites[siteI][4],7,4),
+					 " p-value = ",Format(fullSites[siteI][5],8,5));		
+					 
+	if (fullSites[siteI][5]<pValue)
+	{
+		if (fullSites[siteI][0]>fullSites[siteI][1])
+		{
+			fprintf (stdout, " *P");
+		}
+		else
+		{
+			fprintf (stdout, " *N");
+		}
+	}
+	fprintf (stdout, "\n");
+	return 0;
+}
+
+/*------------------------------------------------------------------------*/
+
+function ReceiveJobs2 (sendOrNot, nullAlt,_siteCount,_siteMap)
+{
+	MPIReceive (-1, fromNode, result_String);
+	
+	siteIndex 		= MPINodeState[fromNode-1][1];
+	siteNA	  		= MPINodeState[fromNode-1][2];
+	siteIndexMap	= MPINodeState[fromNode-1][3];
+	
+	if (sendOrNot)
+	{
+		MPISend (fromNode,siteLikelihood);
+		MPINodeState[fromNode-1][1] = _siteCount;			
+		MPINodeState[fromNode-1][2] = nullAlt;			
+		MPINodeState[fromNode-1][3] = _siteMap;			
+		MPINodeState[fromNode-1][4] = MPINodeState[fromNode-1][4]+1;			
+	}
+	else
+	{
+		MPINodeState[fromNode-1][0] = 0;
+		MPINodeState[fromNode-1][1] = -1;		
+	}
+	
+	ExecuteCommands (result_String);
+	
+	nFValue = siteLikelihood_MLE_VALUES ["nFactor"];
+	sFValue = siteLikelihood_MLE_VALUES ["sFactor"];
+	if (Columns (doneSites) > 7)
+	{
+		noFValue = siteLikelihood_MLE_VALUES ["nFactorOther"];
+	}
+	
+	if (siteNA)
+	{
+		doneSites[siteIndexMap][0] = nFValue;
+		doneSites[siteIndexMap][1] = sFValue;
+		if (Columns (doneSites) > 7)
+		{
+			doneSites[siteIndexMap][7] = noFValue;
+		}
+			
+		doneSites[siteIndexMap][6] = nFValue/sFValue;
+		doneSites[siteIndexMap][3] = doneSites[siteIndexMap][3]+2*siteLikelihood_MLES[1][0];
+		doneSites[siteIndexMap][5] = siteLikelihood_MLES[1][0];
+	}
+	else
+	{
+		doneSites[siteIndexMap][3] = doneSites[siteIndexMap][3]-2*siteLikelihood_MLES[1][0];	
+		doneSites[siteIndexMap][2] = sFValue;
+	}
+
+	if (doneSites[siteIndexMap][4] == 0)
+	{
+		doneSites[siteIndexMap][4] = -1;
+	}
+	else
+	{
+		if (doneSites[siteIndexMap][4] == (-1))
+		{
+			doneSites[siteIndexMap][4] = 1-CChi2(doneSites[siteIndexMap][3],1);						
+			dummy = ReportSite2 (siteIndex, siteIndexMap);
+		}
+	}
+	
+	return fromNode-1;
+}
+
+/*------------------------------------------------------------------------*/
+
+_DO_TREE_REBALANCE_ = 1;
+
+
+#include   "TemplateModels/chooseGeneticCode.def";
+ChoiceList (nrChoice, "New/Restore",1,SKIP_NONE,
+			"New Analysis","Perform a new analysis.",
+			"Restore", "Restore an earlier nucleotide fit");
+			
+if (nrChoice < 0)
+{
+	return;
+}
+
+if (nrChoice == 0)
+{
+	global AC 	= 1;
+	global AT 	= 1;
+	global CG 	= 1;
+	global CT 	= 1;
+	global GT 	= 1;
+	global dNdS = 1;		
+
+	NucleotideMatrix	 = {{*,AC*t,t,AT*t}{AC*t,*,CG*t,CT*t}{t,CG*t,*,GT*t}{AT*t,CT*t,GT*t,*}};
+
+	ChoiceList (modelChoice, "Model Options",1,SKIP_NONE,
+				"Default","Use HKY85 and MG94xHKY85.",
+				"Custom", "Use any reversible nucleotide model crossed with MG94.");
+				
+	if (modelChoice < 0)
+	{
+		return;
+	}
+
+	modelDesc = "";
+
+	if (modelChoice)
+	{
+		done = 0;
+		while (!done)
+		{
+			fprintf (stdout,"\nPlease enter a 6 character model designation (e.g:010010 defines HKY85):");
+			fscanf  (stdin,"String", modelDesc);
+			if (Abs(modelDesc)==6)
+			{	
+				done = 1;
+			}
+		}			
+	}
+	else
+	{
+		modelDesc = "010010";
+	}
+
+
+	ModelTitle = ""+modelDesc[0];
+				
+	rateBiasTerms = {{"AC","1","AT","CG","CT","GT"}};
+	paramCount	  = 0;
+
+	modelConstraintString = "";
+
+	for (customLoopCounter2=1; customLoopCounter2<6; customLoopCounter2=customLoopCounter2+1)
+	{
+		for (customLoopCounter=0; customLoopCounter<customLoopCounter2; customLoopCounter=customLoopCounter+1)
+		{
+			if (modelDesc[customLoopCounter2]==modelDesc[customLoopCounter])
+			{
+				ModelTitle  = ModelTitle+modelDesc[customLoopCounter2];	
+				if (rateBiasTerms[customLoopCounter2] == "1")
+				{
+					modelConstraintString = modelConstraintString + rateBiasTerms[customLoopCounter]+":="+rateBiasTerms[customLoopCounter2]+";";
+				}
+				else
+				{
+					modelConstraintString = modelConstraintString + rateBiasTerms[customLoopCounter2]+":="+rateBiasTerms[customLoopCounter]+";";			
+				}
+				break;
+			}
+		}
+		if (customLoopCounter==customLoopCounter2)
+		{
+			ModelTitle = ModelTitle+modelDesc[customLoopCounter2];	
+		}
+	}	
+
+	if (Abs(modelConstraintString))
+	{
+		ExecuteCommands (modelConstraintString);
+	}
+	#include "_MFReader_.ibf";
+
+	codonFrequencies 	= BuildCodonFrequencies(positionFrequencies);
+	Model NucModel 		= (NucleotideMatrix, overallFrequencies, 1);
+
+	SetDialogPrompt ("Save nucleotide model fit to:");
+	fprintf (PROMPT_FOR_FILE, CLEAR_FILE);
+	NUC_FILE_PATH = LAST_FILE_PATH;
+}
+else
+{
+	SetDialogPrompt ("Restore nucleotide fit from:");
+	ExecuteAFile	(PROMPT_FOR_FILE);
+
+	GetString 		(nucLFInfo, nucLF, -1);
+	fileCount = 	Columns(nucLFInfo["Trees"]);
+	fprintf (stdout, "\nLoaded a fit on ", fileCount, " data sets\n");
+
+	totalCodonCount = 0;
+	totalUniqueSites = 0;
+	treeStrings		= {};
+	for (fileID = 1; fileID <= fileCount; fileID = fileID + 1)
+	{
+		ExecuteCommands 	  ("DataSetFilter filteredData_" + fileID + " = CreateFilter (ds_"+fileID +",3,\"\",\"\",GeneticCodeExclusions);");
+		ExecuteCommands 	  ("totalCodonCount=totalCodonCount+filteredData_" + fileID + ".sites;treeStrings[fileID] = Format(nucTree_" +fileID+ ",1,1);totalUniqueSites=totalUniqueSites+filteredData_"+fileID+".unique_sites;" );
+	}
+
+	positionFrequencies       = {4,3};
+	overallFrequencies 		  = {4,1};
+	for (fileID = 1; fileID <= fileCount; fileID = fileID + 1)
+	{
+		ExecuteCommands 	  ("HarvestFrequencies (tp, filteredData_"+fileID+",3,1,1);HarvestFrequencies (ts, filteredData_"+fileID+",1,1,1);cfs = filteredData_"+fileID+".sites;");
+		positionFrequencies 		= positionFrequencies 		 + tp*(cfs/totalCodonCount);
+		overallFrequencies  		= overallFrequencies + ts*(cfs/totalCodonCount);
+	}
+
+	codonFrequencies = BuildCodonFrequencies(positionFrequencies); 
+	
+	pMatch = {6,1};
+	pCheck = {{AC__,AT__,CG__,CT__,GT__}};
+	if (pCheck[0] == 1)
+	{
+		ModelTitle = "00";
+		pCount = 1;
+		pMatch[0] = 1;
+	}
+	else
+	{
+		pCount = 2;
+		ModelTitle = "01";
+		pMatch[0] = pCheck[0];
+		pMatch[1] = 1;	
+	}
+	
+	for (l=1; l<5; l=l+1)
+	{	
+		for (k=0; k<pCount; k=k+1)
+		{
+			if (pCheck[l] == pMatch[k])
+			{
+				break;
+			}
+		}
+		
+		if (k<pCount)
+		{
+			ModelTitle = ModelTitle + k;
+		}
+		else
+		{
+			pMatch[pCount] = pCheck[l];
+			ModelTitle = ModelTitle + pCount;
+			pCount = pCount+1;			
+		}
+	}
+}
+
diff --git a/res/TemplateBatchFiles/qndhelper2.ibf b/res/TemplateBatchFiles/qndhelper2.ibf
new file mode 100644
index 0000000..bfe2c76
--- /dev/null
+++ b/res/TemplateBatchFiles/qndhelper2.ibf
@@ -0,0 +1,431 @@
+fprintf (stdout,"\n\n______________READ THE FOLLOWING DATA______________\n",ds,
+				"\n\nPhase 1:Nucleotide Model (",ModelTitle,") Model Fit\n\n");
+
+
+if (nrChoice == 0)
+{
+	LikelihoodFunction nucLF = (nucData,givenTree);
+	Optimize (res,nucLF);
+	stashLOF = LIKELIHOOD_FUNCTION_OUTPUT ;
+	LIKELIHOOD_FUNCTION_OUTPUT  = 6;
+	if (Abs(NUC_FILE_PATH))
+	{
+		fprintf (NUC_FILE_PATH,CLEAR_FILE,nucLF);
+	}
+	LIKELIHOOD_FUNCTION_OUTPUT  = stashLOF;
+}
+
+fprintf (stdout, "\n",nucLF);
+
+fprintf (stdout, "\n\nPhase 2:MG94x(",ModelTitle,") Model Fit\n\n");
+				
+CodonMatrix = {ModelMatrixDimension,ModelMatrixDimension};
+
+hshift = 0;
+
+for (h=0; h<64; h=h+1)
+{
+	if (_Genetic_Code[h]==10) 
+	{
+		hshift = hshift+1;
+		continue; 
+	}
+	vshift = hshift;
+	for (v = h+1; v<64; v=v+1)
+	{
+		diff = v-h;
+		if (_Genetic_Code[v]==10) 
+		{
+			vshift = vshift+1;
+			continue; 
+		}
+		nucPosInCodon = 2;
+		if ((h$4==v$4)||((diff%4==0)&&(h$16==v$16))||(diff%16==0))
+		{
+			if (h$4==v$4)
+			{
+				transition = v%4;
+				transition2= h%4;
+			}
+			else
+			{
+				if(diff%16==0)
+				{
+					transition = v$16;
+					transition2= h$16;
+					nucPosInCodon = 0;
+				}
+				else
+				{
+					transition = v%16$4;
+					transition2= h%16$4;
+					nucPosInCodon = 1;
+				}
+			}
+			if (transition<transition2)
+			{
+				trSM = transition;
+				trLG = transition2;
+			}
+			else
+			{
+				trSM = transition2;
+				trLG = transition;
+			}
+			
+			if (trSM==0)
+			{
+				if (trLG==1)
+				{
+					if (_Genetic_Code[0][h]==_Genetic_Code[0][v]) 
+					{
+						CodonMatrix[h-hshift][v-vshift] := AC__*synRate*positionFrequencies__[transition__][nucPosInCodon__];
+						CodonMatrix[v-vshift][h-hshift] := AC__*synRate*positionFrequencies__[transition2__][nucPosInCodon__];
+					}
+					else
+					{
+						CodonMatrix[h-hshift][v-vshift] := AC__*dNdS*synRate*positionFrequencies__[transition__][nucPosInCodon__];
+						CodonMatrix[v-vshift][h-hshift] := AC__*dNdS*synRate*positionFrequencies__[transition2__][nucPosInCodon__];
+					}
+				}
+				else
+				{
+					if (trLG==2)
+					{
+						if (_Genetic_Code[0][h]==_Genetic_Code[0][v]) 
+						{
+							CodonMatrix[h-hshift][v-vshift] := synRate*positionFrequencies__[transition__][nucPosInCodon__];
+							CodonMatrix[v-vshift][h-hshift] := synRate*positionFrequencies__[transition2__][nucPosInCodon__];
+						}
+						else
+						{
+							CodonMatrix[h-hshift][v-vshift] := dNdS*synRate*positionFrequencies__[transition__][nucPosInCodon__];
+							CodonMatrix[v-vshift][h-hshift] := dNdS*synRate*positionFrequencies__[transition2__][nucPosInCodon__];
+						}							
+					}
+					else
+					{
+						if (_Genetic_Code[0][h]==_Genetic_Code[0][v]) 
+						{
+							CodonMatrix[h-hshift][v-vshift] := AT__*synRate*positionFrequencies__[transition__][nucPosInCodon__];
+							CodonMatrix[v-vshift][h-hshift] := AT__*synRate*positionFrequencies__[transition2__][nucPosInCodon__];
+						}
+						else
+						{
+							CodonMatrix[h-hshift][v-vshift] := AT__*dNdS*synRate*positionFrequencies__[transition__][nucPosInCodon__];
+							CodonMatrix[v-vshift][h-hshift] := AT__*dNdS*synRate*positionFrequencies__[transition2__][nucPosInCodon__];
+						}							
+					}
+				}
+			}
+			else
+			{
+				if (trSM==1)
+				{
+					if (trLG==2)
+					{
+						if (_Genetic_Code[0][h]==_Genetic_Code[0][v]) 
+						{
+							CodonMatrix[h-hshift][v-vshift] := CG__*synRate*positionFrequencies__[transition__][nucPosInCodon__];
+							CodonMatrix[v-vshift][h-hshift] := CG__*synRate*positionFrequencies__[transition2__][nucPosInCodon__];
+						}
+						else
+						{
+							CodonMatrix[h-hshift][v-vshift] := CG__*dNdS*synRate*positionFrequencies__[transition__][nucPosInCodon__];
+							CodonMatrix[v-vshift][h-hshift] := CG__*dNdS*synRate*positionFrequencies__[transition2__][nucPosInCodon__];
+						}
+					}
+					else
+					{
+						if (_Genetic_Code[0][h]==_Genetic_Code[0][v]) 
+						{
+							CodonMatrix[h-hshift][v-vshift] := CT__*synRate*positionFrequencies__[transition__][nucPosInCodon__];
+							CodonMatrix[v-vshift][h-hshift] := CT__*synRate*positionFrequencies__[transition2__][nucPosInCodon__];
+						}
+						else
+						{
+							CodonMatrix[h-hshift][v-vshift] := CT__*dNdS*synRate*positionFrequencies__[transition__][nucPosInCodon__];
+							CodonMatrix[v-vshift][h-hshift] := CT__*dNdS*synRate*positionFrequencies__[transition2__][nucPosInCodon__];
+						}							
+					}
+				}
+				else
+				{
+					if (_Genetic_Code[0][h]==_Genetic_Code[0][v]) 
+					{
+						CodonMatrix[h-hshift][v-vshift] := GT__*synRate*positionFrequencies__[transition__][nucPosInCodon__];
+						CodonMatrix[v-vshift][h-hshift] := GT__*synRate*positionFrequencies__[transition2__][nucPosInCodon__];
+					}
+					else
+					{
+						CodonMatrix[h-hshift][v-vshift] := GT__*dNdS*synRate*positionFrequencies__[transition__][nucPosInCodon__];
+						CodonMatrix[v-vshift][h-hshift] := GT__*dNdS*synRate*positionFrequencies__[transition2__][nucPosInCodon__];
+					}							
+				}
+			}
+		}
+   }
+}		
+
+Model MGModel   = (CodonMatrix,codonFrequencies,0);
+Tree  codonTree = treeString;
+
+/* compute the branch conversion factor */
+
+synRate = 1;
+blCodon = 0;
+
+for (h=0; h<ModelMatrixDimension; h=h+1)
+{
+	blCodon = blCodon - CodonMatrix[h][h]*codonFrequencies[h];
+}
+
+blNuc = 0;
+
+t = 1;
+
+for  (h=0; h<4; h=h+1)
+{
+	blCodon2 = 0;
+	for (v=0; v<4; v=v+1)
+	{
+		if (h==v)
+		{
+			continue;
+		}
+		blCodon2 += NucleotideMatrix[h][v]*overallFrequencies[v];
+	}
+	blNuc += overallFrequencies[h]*blCodon2;
+}
+
+LikelihoodFunction lf = (filteredData,codonTree);
+
+if (rOptions>=2)
+{
+	dNdS = 2;
+	blCodon2 = 0;
+
+	for (h=0; h<ModelMatrixDimension; h=h+1)
+	{
+		blCodon2 = blCodon2 - CodonMatrix[h][h]*codonFrequencies[h];
+	}
+	
+	blCodon2 = blCodon2-blCodon;
+	blCodon  = blCodon-blCodon2;
+	
+	dNdS = 0.5;
+	
+	fprintf (stdout, "\n\nPhase 3:Estimating dN/dS\n\n");
+	if (rOptions == 4)
+	{
+		global 	   rConstr := 3*blNuc__/(blCodon__+dNdS*blCodon2__);
+		ExecuteCommands ("ReplicateConstraint(\"this1.?.synRate:=rConstr*this2.?.t__\",codonTree,givenTree)");
+	}
+	else
+	{
+		global 		   rConstr = 1; /*3*blNuc/(blCodon+dNdS*blCodon2)*/;
+		rConstr :> 0;
+		ExecuteCommands ("ReplicateConstraint(\"this1.?.synRate:=this2.?.t__*rConstr\",codonTree,givenTree)");
+	}
+	
+	saveOM = SKIP_CONJUGATE_GRADIENT;
+	SKIP_CONJUGATE_GRADIENT = 1;
+	
+	/*saveLFO = LIKELIHOOD_FUNCTION_OUTPUT;
+	LIKELIHOOD_FUNCTION_OUTPUT = 6;
+	fprintf ("debug.out",CLEAR_FILE,lf);
+	LIKELIHOOD_FUNCTION_OUTPUT = saveLFO;*/
+	
+	Optimize (resC,lf);
+	SKIP_CONJUGATE_GRADIENT = saveOM;
+
+	fprintf (stdout, "\nNuc->codon scaling factor:", (3*blNuc/(blCodon+dNdS*blCodon2)),"\nRaw scaling factor:", rConstr, "\nTree scaling factor(S): ", rConstr/(3*blNuc/(blCodon+dNdS*blCodon2)));
+
+	if (rOptions == 3 || rOptions == 5)
+	{
+		COVARIANCE_PRECISION = 0.95;
+		ClearConstraints(codonTree);
+		ReplicateConstraint("this1.?.synRate:=rConstr__*this2.?.t__",codonTree,givenTree);
+		savedNdS = dNdS;
+		COVARIANCE_PARAMETER = "dNdS";
+		CovarianceMatrix (covMx, lf);	
+		fprintf (stdout,"\n\nUsing dN/dS=", dNdS, "(Estimated 95% CI = [", covMx[0][0], "," , covMx[0][2], "])\nCodon model:", lf);
+		dNdS = savedNdS;
+		COVARIANCE_PARAMETER = 0;
+	}
+	else
+	{
+		fprintf (stdout,"\n\nUsing dN/dS=", dNdS, "\nCodon model:", lf);	
+	}
+}
+else
+{
+	blNuc = 3*blNuc/blCodon;
+	
+	if (pipeThroughFlag == 0)
+	{
+		global 		   rConstr = 1;
+		rConstr :> 0;
+		fprintf (stdout, "Branch Corrections Factor (<0 to estimate):");
+		fscanf  (stdin,  "Number", rConstr);
+	}
+	
+	if (rConstr<=0.0)
+	{
+		rConstr = blNuc;
+		ReplicateConstraint("this1.?.synRate:=this2.?.t__*rConstr",codonTree,givenTree);
+		dNdS := dNdS__;
+		saveOM = SKIP_CONJUGATE_GRADIENT;
+		SKIP_CONJUGATE_GRADIENT = 1;
+		Optimize (resC,lf);
+		SKIP_CONJUGATE_GRADIENT = saveOM;
+		dNdS = dNdS;
+	}
+	else
+	{
+		ReplicateConstraint("this1.?.synRate:=this2.?.t__*rConstr__",codonTree,givenTree);	
+	}
+
+	fprintf (stdout, "\nNuc->Codon branch correction factor: ", blNuc);
+	fprintf (stdout, "\nRaw scaling factor: ", rConstr);
+	fprintf (stdout, "\nTree scaling factor(S): ", rConstr/blNuc);
+	fprintf (stdout,"\n\nUsing dN/dS=", dNdS, "\nCodon model:", lf);
+}
+
+// ------ MEME helper function --------
+
+function obtainBranchWiseEBEstimates (_sFactor,_nsFactor1,_nsFactor2, _mixingP,filterString) {
+
+        ClearConstraints    (perBranchTree);
+        ReplicateConstraint ("this1.?.alpha:=_sFactor*this2.?.synRate__",perBranchTree,codonTree);
+        ReplicateConstraint ("this1.?.beta1:=_nsFactor1*sFactor*this2.?.synRate__",perBranchTree,codonTree);
+        ReplicateConstraint ("this1.?.beta2:=_nsFactor2*this2.?.synRate__",perBranchTree,codonTree);
+        ReplicateConstraint ("this1.?.lmp:=_mixingP", perBranchTree);
+        
+        
+        LoadFunctionLibrary ("AncestralMapper");
+        ancID = _buildAncestralCache ("siteLikelihood",0);
+        subMap = _tabulateSubstitutionsAtSiteByBranch (ancID,0);
+        _destroyAncestralCache (ancID);
+
+       _bn = BranchName (perBranchTree, -1);
+        
+        DataSetFilter locSiteFilter = CreateFilter (ds,3,filterString,"",GeneticCodeExclusions);
+        
+		LikelihoodFunction siteLikelihoodLoc = (locSiteFilter, perBranchTree);
+        LFCompute (siteLikelihoodLoc,LF_START_COMPUTE);
+        LFCompute (siteLikelihoodLoc,baseline);
+        
+        _totalBranchCount  = Columns (_bn) - 1;
+        posteriorEstimates = {};
+        
+        if (_mixingP != 1 && _mixingP != 0) {
+            _priorOdds = (1-_mixingP)/_mixingP;
+        } else {
+            _priorOdds = 0;
+        }
+        
+        for (k = 0; k < _totalBranchCount; k+=1)
+        {
+             _pname = "perBranchTree." + _bn[k] + ".lmp";
+            ExecuteCommands ("`_pname`=1");
+            LFCompute (siteLikelihoodLoc,LOGL0);
+            
+            MaxL     = -Max (LOGL0,baseline);
+            
+            baseline += MaxL;
+            LOGL0 = Exp(MaxL+LOGL0);
+            LOGL1 = (Exp(baseline) - _mixingP * LOGL0) / (1-_mixingP);
+            
+            ExecuteCommands ("`_pname`=_mixingP");
+            _posteriorProb = {{LOGL0 * _mixingP, LOGL1 * (1-_mixingP)}};
+            _posteriorProb = _posteriorProb * (1/(+_posteriorProb));
+            if ( _priorOdds != 0) {
+                eBF = _posteriorProb[1] / (1 - _posteriorProb[1]) / _priorOdds;
+            } else {
+                eBF = 1;
+            }
+            posteriorEstimates [_bn[k]] = {1,4};
+            (posteriorEstimates [_bn[k]])[0] = _posteriorProb[1];
+            (posteriorEstimates [_bn[k]])[1] = eBF;
+            (posteriorEstimates [_bn[k]])[2] = (subMap[_bn[k]])[0];
+            (posteriorEstimates [_bn[k]])[3] = (subMap[_bn[k]])[1];
+            baseline += -MaxL;
+        } 
+        LFCompute (siteLikelihoodLoc,LF_DONE_COMPUTE);
+        
+        return posteriorEstimates;
+}
+
+// ------ MEME helper function --------
+
+function obtainBranchWiseEBEstimatesMPI (_sFactor,_nsFactor1,_nsFactor2,_mixingP) {
+        if (_nsFactor2 <= _sFactor || _mixingP == 1 || _mixingP == 0)
+        {
+            return {};
+        }
+        
+        sFactor   = _sFactor;
+        nsFactor1 = _nsFactor1;
+        nsFactor2 = _nsFactor2;
+        mixingP   = _mixingP;
+        
+        treeString = Format (siteTree,1,1);
+        
+        LoadFunctionLibrary ("AncestralMapper");
+        ancID = _buildAncestralCache ("siteLikelihood",0);
+        subMap = _tabulateSubstitutionsAtSiteByBranch (ancID,0);
+        _destroyAncestralCache (ancID);
+
+        Model 		MGLocalMix		=		  ("Exp(MGMatrix1)*lmp+Exp(MGMatrix2)*(1-lmp)",codonFrequencies,EXPLICIT_FORM_MATRIX_EXPONENTIAL);
+        Tree        perBranchTree 			= treeString;
+        ClearConstraints    (perBranchTree);
+        ReplicateConstraint ("this1.?.alpha:=this2.?.alpha__",perBranchTree,siteTree);
+        ReplicateConstraint ("this1.?.beta1:=this2.?.beta1__",perBranchTree,siteTree);
+        ReplicateConstraint ("this1.?.beta2:=this2.?.beta2__",perBranchTree,siteTree);
+        ReplicateConstraint ("this1.?.lmp:=_mixingP", perBranchTree);
+        
+        _bn = BranchName (perBranchTree, -1);
+        
+		LikelihoodFunction siteLikelihoodLoc = (siteFilter, perBranchTree);
+        LFCompute (siteLikelihoodLoc,LF_START_COMPUTE);
+        LFCompute (siteLikelihoodLoc,baseline);
+        
+        _totalBranchCount  = Columns (_bn) - 1;
+        posteriorEstimates = {};
+        
+        _priorOdds = (1-_mixingP)/_mixingP;
+        
+        for (k = 0; k < _totalBranchCount; k+=1)
+        {
+             _pname = "perBranchTree." + _bn[k] + ".lmp";
+            ExecuteCommands ("`_pname`=1");
+            LFCompute (siteLikelihoodLoc,LOGL0);
+            
+            MaxL     = -Max (LOGL0,baseline);
+            
+            baseline += MaxL;
+            LOGL0 = Exp(MaxL+LOGL0);
+            LOGL1 = (Exp(baseline) - _mixingP * LOGL0) / (1-_mixingP);
+            
+            ExecuteCommands ("`_pname`=_mixingP");
+            _posteriorProb = {{LOGL0 * _mixingP, LOGL1 * (1-_mixingP)}};
+            _posteriorProb = _posteriorProb * (1/(+_posteriorProb));
+            if ( _priorOdds != 0) {
+                eBF = _posteriorProb[1] / (1 - _posteriorProb[1]) / _priorOdds;
+            } else {
+                eBF = 1;
+            }
+            posteriorEstimates [_bn[k]] = {1,4};
+            (posteriorEstimates [_bn[k]])[0] = _posteriorProb[1];
+            (posteriorEstimates [_bn[k]])[1] = eBF;
+            (posteriorEstimates [_bn[k]])[2] = (subMap[_bn[k]])[0];
+            (posteriorEstimates [_bn[k]])[3] = (subMap[_bn[k]])[1];
+            baseline += -MaxL;
+        } 
+        
+        LFCompute (siteLikelihoodLoc,LF_DONE_COMPUTE);
+        
+         
+        return posteriorEstimates;
+}
diff --git a/res/TemplateBatchFiles/qndhelper2_mf.ibf b/res/TemplateBatchFiles/qndhelper2_mf.ibf
new file mode 100644
index 0000000..f0845cf
--- /dev/null
+++ b/res/TemplateBatchFiles/qndhelper2_mf.ibf
@@ -0,0 +1,448 @@
+fprintf (stdout, "\n\nPhase 1:Nucleotide Model (",ModelTitle,") Model Fit\n\n");
+
+global dNdS    = 1;
+
+if (nrChoice == 0)
+{
+	for (fileID = 1; fileID <= fileCount; fileID = fileID + 1)
+	{
+		ExecuteCommands ("Tree nucTree_" + fileID + "=" + treeStrings[fileID] + ";");
+	}
+	ExecuteCommands (constructLF("nucLF", "nucData", "nucTree", fileCount));
+	Optimize (res,nucLF);
+	stashLOF = LIKELIHOOD_FUNCTION_OUTPUT ;
+	LIKELIHOOD_FUNCTION_OUTPUT  = 6;
+	if (Abs(NUC_FILE_PATH))
+	{
+		fprintf (NUC_FILE_PATH,CLEAR_FILE,nucLF);
+	}
+	LIKELIHOOD_FUNCTION_OUTPUT  = stashLOF;
+}
+
+fprintf (stdout, "\n",nucLF);
+fprintf (stdout, "\n\nPhase 2:MG94x(",ModelTitle,") Model Fit\n\n");
+				
+CodonMatrix = {ModelMatrixDimension,ModelMatrixDimension};
+
+hshift = 0;
+
+for (h=0; h<64; h=h+1)
+{
+	if (_Genetic_Code[h]==10) 
+	{
+		hshift = hshift+1;
+		continue; 
+	}
+	vshift = hshift;
+	for (v = h+1; v<64; v=v+1)
+	{
+		diff = v-h;
+		if (_Genetic_Code[v]==10) 
+		{
+			vshift = vshift+1;
+			continue; 
+		}
+		nucPosInCodon = 2;
+		if ((h$4==v$4)||((diff%4==0)&&(h$16==v$16))||(diff%16==0))
+		{
+			if (h$4==v$4)
+			{
+				transition = v%4;
+				transition2= h%4;
+			}
+			else
+			{
+				if(diff%16==0)
+				{
+					transition = v$16;
+					transition2= h$16;
+					nucPosInCodon = 0;
+				}
+				else
+				{
+					transition = v%16$4;
+					transition2= h%16$4;
+					nucPosInCodon = 1;
+				}
+			}
+			if (transition<transition2)
+			{
+				trSM = transition;
+				trLG = transition2;
+			}
+			else
+			{
+				trSM = transition2;
+				trLG = transition;
+			}
+			
+			if (trSM==0)
+			{
+				if (trLG==1)
+				{
+					if (_Genetic_Code[0][h]==_Genetic_Code[0][v]) 
+					{
+						CodonMatrix[h-hshift][v-vshift] := AC__*synRate*positionFrequencies__[transition__][nucPosInCodon__];
+						CodonMatrix[v-vshift][h-hshift] := AC__*synRate*positionFrequencies__[transition2__][nucPosInCodon__];
+					}
+					else
+					{
+						CodonMatrix[h-hshift][v-vshift] := AC__*dNdS*synRate*positionFrequencies__[transition__][nucPosInCodon__];
+						CodonMatrix[v-vshift][h-hshift] := AC__*dNdS*synRate*positionFrequencies__[transition2__][nucPosInCodon__];
+					}
+				}
+				else
+				{
+					if (trLG==2)
+					{
+						if (_Genetic_Code[0][h]==_Genetic_Code[0][v]) 
+						{
+							CodonMatrix[h-hshift][v-vshift] := synRate*positionFrequencies__[transition__][nucPosInCodon__];
+							CodonMatrix[v-vshift][h-hshift] := synRate*positionFrequencies__[transition2__][nucPosInCodon__];
+						}
+						else
+						{
+							CodonMatrix[h-hshift][v-vshift] := dNdS*synRate*positionFrequencies__[transition__][nucPosInCodon__];
+							CodonMatrix[v-vshift][h-hshift] := dNdS*synRate*positionFrequencies__[transition2__][nucPosInCodon__];
+						}							
+					}
+					else
+					{
+						if (_Genetic_Code[0][h]==_Genetic_Code[0][v]) 
+						{
+							CodonMatrix[h-hshift][v-vshift] := AT__*synRate*positionFrequencies__[transition__][nucPosInCodon__];
+							CodonMatrix[v-vshift][h-hshift] := AT__*synRate*positionFrequencies__[transition2__][nucPosInCodon__];
+						}
+						else
+						{
+							CodonMatrix[h-hshift][v-vshift] := AT__*dNdS*synRate*positionFrequencies__[transition__][nucPosInCodon__];
+							CodonMatrix[v-vshift][h-hshift] := AT__*dNdS*synRate*positionFrequencies__[transition2__][nucPosInCodon__];
+						}							
+					}
+				}
+			}
+			else
+			{
+				if (trSM==1)
+				{
+					if (trLG==2)
+					{
+						if (_Genetic_Code[0][h]==_Genetic_Code[0][v]) 
+						{
+							CodonMatrix[h-hshift][v-vshift] := CG__*synRate*positionFrequencies__[transition__][nucPosInCodon__];
+							CodonMatrix[v-vshift][h-hshift] := CG__*synRate*positionFrequencies__[transition2__][nucPosInCodon__];
+						}
+						else
+						{
+							CodonMatrix[h-hshift][v-vshift] := CG__*dNdS*synRate*positionFrequencies__[transition__][nucPosInCodon__];
+							CodonMatrix[v-vshift][h-hshift] := CG__*dNdS*synRate*positionFrequencies__[transition2__][nucPosInCodon__];
+						}
+					}
+					else
+					{
+						if (_Genetic_Code[0][h]==_Genetic_Code[0][v]) 
+						{
+							CodonMatrix[h-hshift][v-vshift] := CT__*synRate*positionFrequencies__[transition__][nucPosInCodon__];
+							CodonMatrix[v-vshift][h-hshift] := CT__*synRate*positionFrequencies__[transition2__][nucPosInCodon__];
+						}
+						else
+						{
+							CodonMatrix[h-hshift][v-vshift] := CT__*dNdS*synRate*positionFrequencies__[transition__][nucPosInCodon__];
+							CodonMatrix[v-vshift][h-hshift] := CT__*dNdS*synRate*positionFrequencies__[transition2__][nucPosInCodon__];
+						}							
+					}
+				}
+				else
+				{
+					if (_Genetic_Code[0][h]==_Genetic_Code[0][v]) 
+					{
+						CodonMatrix[h-hshift][v-vshift] := GT__*synRate*positionFrequencies__[transition__][nucPosInCodon__];
+						CodonMatrix[v-vshift][h-hshift] := GT__*synRate*positionFrequencies__[transition2__][nucPosInCodon__];
+					}
+					else
+					{
+						CodonMatrix[h-hshift][v-vshift] := GT__*dNdS*synRate*positionFrequencies__[transition__][nucPosInCodon__];
+						CodonMatrix[v-vshift][h-hshift] := GT__*dNdS*synRate*positionFrequencies__[transition2__][nucPosInCodon__];
+					}							
+				}
+			}
+		}
+   }
+}		
+
+Model MGModel   = (CodonMatrix,codonFrequencies,0);
+for (fileID = 1; fileID <= fileCount; fileID = fileID + 1)
+{
+	ExecuteCommands ("Tree codonTree_" + fileID + "=" + treeStrings[fileID] + ";");
+}
+
+/* compute the branch conversion factor */
+
+synRate = 1;
+blCodon = 0;
+
+for (h=0; h<ModelMatrixDimension; h=h+1)
+{
+	blCodon = blCodon - CodonMatrix[h][h]*codonFrequencies[h];
+}
+
+blNuc = 0;
+
+t = 1;
+
+for  (h=0; h<4; h=h+1)
+{
+	blCodon2 = 0;
+	for (v=0; v<4; v=v+1)
+	{
+		if (h==v)
+		{
+			continue;
+		}
+		blCodon2 = blCodon2 + NucleotideMatrix[h][v]*overallFrequencies[v];
+	}
+	blNuc = blNuc + overallFrequencies[h]*blCodon2;
+}
+
+ExecuteCommands (constructLF("lf", "filteredData", "codonTree", fileCount));
+
+if (rOptions>=2)
+{
+	global rConstr = 1;
+	blCodon2 	   = 0;
+	dNdS 		   = 2;
+
+	for (h=0; h<ModelMatrixDimension; h=h+1)
+	{
+		blCodon2 = blCodon2 - CodonMatrix[h][h]*codonFrequencies[h];
+	}
+	
+	blCodon2 = blCodon2-blCodon;
+	blCodon  = blCodon-blCodon2;
+	
+	dNdS = 0.5;
+	
+	fprintf (stdout, "\n\nPhase 3:Estimating dN/dS\n\n");
+	if (rOptions == 4)
+	{
+		global 	   rConstr := 3*blNuc__/(blCodon__+dNdS*blCodon2__);
+		for (fileID = 1; fileID <= fileCount; fileID = fileID + 1)
+		{
+			ExecuteCommands ("ReplicateConstraint(\"this1.?.synRate:=rConstr*this2.?.t__\",codonTree_"+fileID+",nucTree_"+fileID+")");
+		}
+	}
+	else
+	{
+		global 		   rConstr = 1; /*3*blNuc/(blCodon+dNdS*blCodon2)*/;
+		rConstr :> 0;
+		for (fileID = 1; fileID <= fileCount; fileID = fileID + 1)
+		{
+			ExecuteCommands ("ReplicateConstraint(\"this1.?.synRate:=this2.?.t__*rConstr\",codonTree_"+fileID+",nucTree_"+fileID+")");
+		}
+	}
+	
+	saveOM = SKIP_CONJUGATE_GRADIENT;
+	SKIP_CONJUGATE_GRADIENT = 1;
+	
+	Optimize (resC,lf);
+	SKIP_CONJUGATE_GRADIENT = saveOM;
+
+	fprintf (stdout, "\nNuc->codon scaling factor:", (3*blNuc/(blCodon+dNdS*blCodon2)),"\nRaw scaling factor:", rConstr, "\nTree scaling factor(S): ", rConstr/(3*blNuc/(blCodon+dNdS*blCodon2)));
+
+	if (rOptions == 3 || rOptions == 5)
+	{
+		COVARIANCE_PRECISION = 0.95;
+		ClearConstraints(codonTree);
+		for (fileID = 1; fileID <= fileCount; fileID = fileID + 1)
+		{
+			ExecuteCommands("ReplicateConstraint(\"this1.?.synRate:=rConstr__*this2.?.t__\",codonTree_"+fileID+",nucTree_"+fileID+")");
+		}
+		savedNdS = dNdS;
+		COVARIANCE_PARAMETER = "dNdS";
+		CovarianceMatrix (covMx, lf);	
+		fprintf (stdout,"\n\nUsing dN/dS=", dNdS, "(Estimated 95% CI = [", covMx[0][0], "," , covMx[0][2], "])\nCodon model:", lf);
+		dNdS = savedNdS;
+		COVARIANCE_PARAMETER = 0;
+	}
+	else
+	{
+		fprintf (stdout,"\n\nUsing dN/dS=", dNdS, "\nCodon model:", lf);	
+	}
+}
+else
+{
+	blNuc = 3*blNuc/blCodon;
+	
+	if (pipeThroughFlag == 0)
+	{
+		global 		   rConstr = 1;
+		rConstr :> 0;
+		fprintf (stdout, "Branch Corrections Factor (<0 to estimate):");
+		fscanf  (stdin,  "Number", rConstr);
+	}
+	
+	if (rConstr<=0.0)
+	{
+		rConstr = blNuc;
+		for (fileID = 1; fileID <= fileCount; fileID = fileID + 1)
+		{
+			ExecuteCommands("ReplicateConstraint(\"this1.?.synRate:=this2.?.t__*rConstr\",codonTree_"+fileID+",nucTree_"+fileID+")");
+		}
+		dNdS := dNdS__;
+		saveOM = SKIP_CONJUGATE_GRADIENT;
+		SKIP_CONJUGATE_GRADIENT = 1;
+		Optimize (resC,lf);
+		SKIP_CONJUGATE_GRADIENT = saveOM;
+		dNdS = dNdS;
+	}
+	else
+	{
+		for (fileID = 1; fileID <= fileCount; fileID = fileID + 1)
+		{
+			ExecuteCommands("ReplicateConstraint(\"this1.?.synRate:=this2.?.t__*rConstr__\",codonTree_"+fileID+",nucTree_"+fileID+")");
+		}
+	}
+
+	fprintf (stdout, "\nNuc->Codon branch correction factor: ", blNuc);
+	fprintf (stdout, "\nRaw scaling factor: ", rConstr);
+	fprintf (stdout, "\nTree scaling factor(S): ", rConstr/blNuc);
+	fprintf (stdout,"\n\nUsing dN/dS=", dNdS, "\nCodon model:", lf);
+}
+
+// ------ MEME helper function --------
+
+function obtainBranchWiseEBEstimates (_sFactor,_nsFactor1,_nsFactor2, _mixingP,filterString) {
+
+        ClearConstraints    (perBranchTree);
+        ReplicateConstraint ("this1.?.alpha:=_sFactor*this2.?.synRate__",perBranchTree,codonTree);
+        ReplicateConstraint ("this1.?.beta1:=_nsFactor1*sFactor*this2.?.synRate__",perBranchTree,codonTree);
+        ReplicateConstraint ("this1.?.beta2:=_nsFactor2*this2.?.synRate__",perBranchTree,codonTree);
+        ReplicateConstraint ("this1.?.lmp:=_mixingP", perBranchTree);
+        
+        
+        LoadFunctionLibrary ("AncestralMapper");
+        ancID = _buildAncestralCache ("siteLikelihood",0);
+        subMap = _tabulateSubstitutionsAtSiteByBranch (ancID,0);
+        _destroyAncestralCache (ancID);
+
+       _bn = BranchName (perBranchTree, -1);
+        
+        DataSetFilter locSiteFilter = CreateFilter (ds,3,filterString,"",GeneticCodeExclusions);
+        
+		LikelihoodFunction siteLikelihoodLoc = (locSiteFilter, perBranchTree);
+        LFCompute (siteLikelihoodLoc,LF_START_COMPUTE);
+        LFCompute (siteLikelihoodLoc,baseline);
+        
+        _totalBranchCount  = Columns (_bn) - 1;
+        posteriorEstimates = {};
+        
+        if (_mixingP != 1 && _mixingP != 0) {
+            _priorOdds = (1-_mixingP)/_mixingP;
+        } else {
+            _priorOdds = 0;
+        }
+        
+        for (k = 0; k < _totalBranchCount; k+=1)
+        {
+             _pname = "perBranchTree." + _bn[k] + ".lmp";
+            ExecuteCommands ("`_pname`=1");
+            LFCompute (siteLikelihoodLoc,LOGL0);
+            
+            MaxL     = -Max (LOGL0,baseline);
+            
+            baseline += MaxL;
+            LOGL0 = Exp(MaxL+LOGL0);
+            LOGL1 = (Exp(baseline) - _mixingP * LOGL0) / (1-_mixingP);
+            
+            ExecuteCommands ("`_pname`=_mixingP");
+            _posteriorProb = {{LOGL0 * _mixingP, LOGL1 * (1-_mixingP)}};
+            _posteriorProb = _posteriorProb * (1/(+_posteriorProb));
+            if ( _priorOdds != 0) {
+                eBF = _posteriorProb[1] / (1 - _posteriorProb[1]) / _priorOdds;
+            } else {
+                eBF = 1;
+            }
+            posteriorEstimates [_bn[k]] = {1,4};
+            (posteriorEstimates [_bn[k]])[0] = _posteriorProb[1];
+            (posteriorEstimates [_bn[k]])[1] = eBF;
+            (posteriorEstimates [_bn[k]])[2] = (subMap[_bn[k]])[0];
+            (posteriorEstimates [_bn[k]])[3] = (subMap[_bn[k]])[1];
+            baseline += -MaxL;
+        } 
+        LFCompute (siteLikelihoodLoc,LF_DONE_COMPUTE);
+        
+        return posteriorEstimates;
+}
+
+// ------ MEME helper function --------
+
+function obtainBranchWiseEBEstimatesMPI (_sFactor,_nsFactor1,_nsFactor2,_mixingP) {
+        if (_nsFactor2 <= _sFactor || _mixingP == 1 || _mixingP == 0)
+        {
+            return {};
+        }
+        
+        sFactor   = _sFactor;
+        nsFactor1 = _nsFactor1;
+        nsFactor2 = _nsFactor2;
+        mixingP   = _mixingP;
+        
+        treeString = Format (siteTree,1,1);
+        
+        LoadFunctionLibrary ("AncestralMapper");
+        ancID = _buildAncestralCache ("siteLikelihood",0);
+        subMap = _tabulateSubstitutionsAtSiteByBranch (ancID,0);
+        _destroyAncestralCache (ancID);
+
+        Model 		MGLocalMix		=		  ("Exp(MGMatrix1)*lmp+Exp(MGMatrix2)*(1-lmp)",codonFrequencies,EXPLICIT_FORM_MATRIX_EXPONENTIAL);
+        Tree        perBranchTree 			= treeString;
+        ClearConstraints    (perBranchTree);
+        ReplicateConstraint ("this1.?.alpha:=this2.?.alpha__",perBranchTree,siteTree);
+        ReplicateConstraint ("this1.?.beta1:=this2.?.beta1__",perBranchTree,siteTree);
+        ReplicateConstraint ("this1.?.beta2:=this2.?.beta2__",perBranchTree,siteTree);
+        ReplicateConstraint ("this1.?.lmp:=_mixingP", perBranchTree);
+        
+        _bn = BranchName (perBranchTree, -1);
+        
+		LikelihoodFunction siteLikelihoodLoc = (siteFilter, perBranchTree);
+        LFCompute (siteLikelihoodLoc,LF_START_COMPUTE);
+        LFCompute (siteLikelihoodLoc,baseline);
+        
+        _totalBranchCount  = Columns (_bn) - 1;
+        posteriorEstimates = {};
+        
+        _priorOdds = (1-_mixingP)/_mixingP;
+        
+        for (k = 0; k < _totalBranchCount; k+=1)
+        {
+             _pname = "perBranchTree." + _bn[k] + ".lmp";
+            ExecuteCommands ("`_pname`=1");
+            LFCompute (siteLikelihoodLoc,LOGL0);
+            
+            MaxL     = -Max (LOGL0,baseline);
+            
+            baseline += MaxL;
+            LOGL0 = Exp(MaxL+LOGL0);
+            LOGL1 = (Exp(baseline) - _mixingP * LOGL0) / (1-_mixingP);
+            
+            ExecuteCommands ("`_pname`=_mixingP");
+            _posteriorProb = {{LOGL0 * _mixingP, LOGL1 * (1-_mixingP)}};
+            _posteriorProb = _posteriorProb * (1/(+_posteriorProb));
+            if ( _priorOdds != 0) {
+                eBF = _posteriorProb[1] / (1 - _posteriorProb[1]) / _priorOdds;
+            } else {
+                eBF = 1;
+            }
+            posteriorEstimates [_bn[k]] = {1,4};
+            (posteriorEstimates [_bn[k]])[0] = _posteriorProb[1];
+            (posteriorEstimates [_bn[k]])[1] = eBF;
+            (posteriorEstimates [_bn[k]])[2] = (subMap[_bn[k]])[0];
+            (posteriorEstimates [_bn[k]])[3] = (subMap[_bn[k]])[1];
+            baseline += -MaxL;
+        } 
+        
+        LFCompute (siteLikelihoodLoc,LF_DONE_COMPUTE);
+        
+         
+        return posteriorEstimates;
+}
\ No newline at end of file
diff --git a/res/TemplateBatchFiles/qndhelper3.ibf b/res/TemplateBatchFiles/qndhelper3.ibf
new file mode 100644
index 0000000..add9c9e
--- /dev/null
+++ b/res/TemplateBatchFiles/qndhelper3.ibf
@@ -0,0 +1,149 @@
+CodonMatrixB = {ModelMatrixDimension,ModelMatrixDimension};
+
+hshift = 0;
+
+for (h=0; h<64; h=h+1)
+{
+	if (_Genetic_Code[h]==10) 
+	{
+		hshift = hshift+1;
+		continue; 
+	}
+	vshift = hshift;
+	for (v = h+1; v<64; v=v+1)
+	{
+		diff = v-h;
+		if (_Genetic_Code[v]==10) 
+		{
+			vshift = vshift+1;
+			continue; 
+		}
+		nucPosInCodon = 2;
+		if ((h$4==v$4)||((diff%4==0)&&(h$16==v$16))||(diff%16==0))
+		{
+			if (h$4==v$4)
+			{
+				transition = v%4;
+				transition2= h%4;
+			}
+			else
+			{
+				if(diff%16==0)
+				{
+					transition = v$16;
+					transition2= h$16;
+					nucPosInCodon = 0;
+				}
+				else
+				{
+					transition = v%16$4;
+					transition2= h%16$4;
+					nucPosInCodon = 1;
+				}
+			}
+			if (transition<transition2)
+			{
+				trSM = transition;
+				trLG = transition2;
+			}
+			else
+			{
+				trSM = transition2;
+				trLG = transition;
+			}
+			
+			if (trSM==0)
+			{
+				if (trLG==1)
+				{
+					if (_Genetic_Code[0][h]==_Genetic_Code[0][v]) 
+					{
+						CodonMatrixB[h-hshift][v-vshift] := AC__*synRate*positionFrequencies__[transition__][nucPosInCodon__];
+						CodonMatrixB[v-vshift][h-hshift] := AC__*synRate*positionFrequencies__[transition2__][nucPosInCodon__];
+					}
+					else
+					{
+						CodonMatrixB[h-hshift][v-vshift] := AC__*nonSynRate*positionFrequencies__[transition__][nucPosInCodon__];
+						CodonMatrixB[v-vshift][h-hshift] := AC__*nonSynRate*positionFrequencies__[transition2__][nucPosInCodon__];
+					}
+				}
+				else
+				{
+					if (trLG==2)
+					{
+						if (_Genetic_Code[0][h]==_Genetic_Code[0][v]) 
+						{
+							CodonMatrixB[h-hshift][v-vshift] := synRate*positionFrequencies__[transition__][nucPosInCodon__];
+							CodonMatrixB[v-vshift][h-hshift] := synRate*positionFrequencies__[transition2__][nucPosInCodon__];
+						}
+						else
+						{
+							CodonMatrixB[h-hshift][v-vshift] := nonSynRate*positionFrequencies__[transition__][nucPosInCodon__];
+							CodonMatrixB[v-vshift][h-hshift] := nonSynRate*positionFrequencies__[transition2__][nucPosInCodon__];
+						}							
+					}
+					else
+					{
+						if (_Genetic_Code[0][h]==_Genetic_Code[0][v]) 
+						{
+							CodonMatrixB[h-hshift][v-vshift] := AT__*synRate*positionFrequencies__[transition__][nucPosInCodon__];
+							CodonMatrixB[v-vshift][h-hshift] := AT__*synRate*positionFrequencies__[transition2__][nucPosInCodon__];
+						}
+						else
+						{
+							CodonMatrixB[h-hshift][v-vshift] := AT__*nonSynRate*positionFrequencies__[transition__][nucPosInCodon__];
+							CodonMatrixB[v-vshift][h-hshift] := AT__*nonSynRate*positionFrequencies__[transition2__][nucPosInCodon__];
+						}							
+					}
+				}
+			}
+			else
+			{
+				if (trSM==1)
+				{
+					if (trLG==2)
+					{
+						if (_Genetic_Code[0][h]==_Genetic_Code[0][v]) 
+						{
+							CodonMatrixB[h-hshift][v-vshift] := CG__*synRate*positionFrequencies__[transition__][nucPosInCodon__];
+							CodonMatrixB[v-vshift][h-hshift] := CG__*synRate*positionFrequencies__[transition2__][nucPosInCodon__];
+						}
+						else
+						{
+							CodonMatrixB[h-hshift][v-vshift] := CG__*nonSynRate*positionFrequencies__[transition__][nucPosInCodon__];
+							CodonMatrixB[v-vshift][h-hshift] := CG__*nonSynRate*positionFrequencies__[transition2__][nucPosInCodon__];
+						}
+					}
+					else
+					{
+						if (_Genetic_Code[0][h]==_Genetic_Code[0][v]) 
+						{
+							CodonMatrixB[h-hshift][v-vshift] := CT__*synRate*positionFrequencies__[transition__][nucPosInCodon__];
+							CodonMatrixB[v-vshift][h-hshift] := CT__*synRate*positionFrequencies__[transition2__][nucPosInCodon__];
+						}
+						else
+						{
+							CodonMatrixB[h-hshift][v-vshift] := CT__*nonSynRate*positionFrequencies__[transition__][nucPosInCodon__];
+							CodonMatrixB[v-vshift][h-hshift] := CT__*nonSynRate*positionFrequencies__[transition2__][nucPosInCodon__];
+						}							
+					}
+				}
+				else
+				{
+					if (_Genetic_Code[0][h]==_Genetic_Code[0][v]) 
+					{
+						CodonMatrixB[h-hshift][v-vshift] := GT__*synRate*positionFrequencies__[transition__][nucPosInCodon__];
+						CodonMatrixB[v-vshift][h-hshift] := GT__*synRate*positionFrequencies__[transition2__][nucPosInCodon__];
+					}
+					else
+					{
+						CodonMatrixB[h-hshift][v-vshift] := GT__*nonSynRate*positionFrequencies__[transition__][nucPosInCodon__];
+						CodonMatrixB[v-vshift][h-hshift] := GT__*nonSynRate*positionFrequencies__[transition2__][nucPosInCodon__];
+					}							
+				}
+			}
+		}
+   }
+}		
+
+Model MGModelB	= (CodonMatrixB,codonFrequencies,0);
diff --git a/res/TemplateBatchFiles/qndhelper4.ibf b/res/TemplateBatchFiles/qndhelper4.ibf
new file mode 100644
index 0000000..1e9d9c7
--- /dev/null
+++ b/res/TemplateBatchFiles/qndhelper4.ibf
@@ -0,0 +1,174 @@
+allowedAACharacters = "FLIMVSPTAYHQNKDECWRG";
+
+SetDialogPrompt ("Locate an amino-acid profile matrix file:");
+fscanf (PROMPT_FOR_FILE,"String,Matrix",mapString,aaRateMatrix);
+W_MATRIX_FILE = LAST_FILE_PATH;
+
+if (Abs(mapString) == 20 && Rows(aaRateMatrix) == 20 && Columns(aaRateMatrix) == 20)
+{
+	/* check to see that all characters have been mapped */
+	checkAAMap   = {}; /* associative array */
+	for (aaIndex = 0; aaIndex < 20; aaIndex = aaIndex+1)
+	{
+		aChar = allowedAACharacters[aaIndex];
+		checkAAMap[aChar] = aaIndex+1;
+	
+	}
+
+	AAMap = {};
+	for (aaIndex = 0; aaIndex < 20; aaIndex = aaIndex+1)
+	{
+		aChar = mapString[aaIndex];
+		daIndex = checkAAMap[aChar];
+		if (daIndex==0)
+		{
+			fprintf (stdout, "\nAmino-acid ordering provided in the file is invalid - could be duplicate or missing characters\n");
+			return 0;
+		}
+		else
+		{
+			if (daIndex>10)
+			{
+				AAMap[aaIndex] = daIndex;
+			}
+			else
+			{
+				AAMap[aaIndex] = daIndex-1;			
+			}
+			checkAAMap[aChar] = 0;
+		}
+	}
+	
+	/*symmetrize the matrix*/
+	
+	for (aaIndex = 0; aaIndex < 19; aaIndex = aaIndex+1)
+	{
+		for (aaIndex2 = aaIndex+1; aaIndex2 < 20; aaIndex2 = aaIndex2+1)
+		{
+			aaRateMatrix[aaIndex2][aaIndex] = aaRateMatrix[aaIndex][aaIndex2];
+		}
+	}
+	
+	/* reindex the matrix */
+	
+	aaRateMultipliers = {21,21};
+	aaRateClassIDs    = {};
+	
+	for (aaIndex = 0; aaIndex < 19; aaIndex = aaIndex+1)
+	{
+		mappedIndex = AAMap[aaIndex];
+		for (aaIndex2 = aaIndex+1; aaIndex2 < 20; aaIndex2 = aaIndex2+1)
+		{
+			mappedIndex2 								 = AAMap[aaIndex2];
+			rateLabel 									 = aaRateMatrix[aaIndex][aaIndex2]$1;
+			
+			aaRateMultipliers[mappedIndex][mappedIndex2] = rateLabel;
+			aaRateMultipliers[mappedIndex2][mappedIndex] = rateLabel;
+			
+			aaRateClassIDs[rateLabel] = aaRateClassIDs[rateLabel] + 1;
+		}
+	}
+	
+	labels   = Rows (aaRateClassIDs);
+	aaIndex2 = {Abs (aaRateClassIDs),2};
+	
+	for (aaIndex = 0; aaIndex < Abs (aaRateClassIDs); aaIndex = aaIndex + 1)
+	{
+		rateLabel = labels [aaIndex];
+		aaIndex2 [aaIndex][0] = rateLabel;
+		aaIndex2 [aaIndex][1] = "Rate class '" + rateLabel + "' with " + aaRateClassIDs [rateLabel] + " member pair";
+	}
+	
+	ChoiceList (aaIndex, "Which rate class to constrain?", 1, SKIP_NONE, aaIndex2);
+	
+	if (aaIndex < 0)
+	{
+		return 0;
+	}
+	
+	_rateLabelToTest = "nsClass" + aaIndex2[aaIndex][0];
+	fprintf (stdout, "Selected ", _rateLabelToTest, "\n");
+	aaRateMatrix = 0;	
+}
+else
+{
+	fprintf (stdout, "\nExpected a string of 20 characters followed by a 20x20 matrix\n");
+	return 0;
+}
+
+CodonMatrixB = {ModelMatrixDimension,ModelMatrixDimension};
+
+hshift = 0;
+
+modelDefString = "";
+modelDefString*16384;
+
+_nucBiasTerms = {{"","AC__*","","AT__*"}
+				 {"AC__*","","CG__*","CT__*"}
+				 {"","CG__*","","GT__*"}
+				 {"AT__*","CT__*","GT__*",""}};
+
+for (h=0; h<64; h=h+1)
+{
+	if (_Genetic_Code[h]==10) 
+	{
+		hshift = hshift+1;
+		continue; 
+	}
+	vshift = hshift;
+	for (v = h+1; v<64; v=v+1)
+	{
+		diff = v-h;
+		if (_Genetic_Code[v]==10) 
+		{
+			vshift = vshift+1;
+			continue; 
+		}
+		nucPosInCodon = 2;
+		if ((h$4==v$4)||((diff%4==0)&&(h$16==v$16))||(diff%16==0))
+		{
+			if (h$4==v$4)
+			{
+				transition = v%4;
+				transition2= h%4;
+			}
+			else
+			{
+				if(diff%16==0)
+				{
+					transition = v$16;
+					transition2= h$16;
+					nucPosInCodon = 0;
+				}
+				else
+				{
+					transition = v%16$4;
+					transition2= h%16$4;
+					nucPosInCodon = 1;
+				}
+			}
+			hs = Format(h-hshift,0,0);
+			vs = Format(v-vshift,0,0);
+			ts = Format(transition,0,0);
+			ts2= Format(transition2,0,0);
+			ps = Format(nucPosInCodon,0,0);
+			aa1 = _Genetic_Code[0][h];
+			aa2 = _Genetic_Code[0][v];
+			if (aa1==aa2) 
+			{
+				modelDefString*("CodonMatrixB["+hs+"]["+vs+"] := "+_nucBiasTerms[transition][transition2]+"synRate*positionFrequencies__["+ts+"]["+ps+"];\n"+
+												 "CodonMatrixB["+vs+"]["+hs+"] := "+_nucBiasTerms[transition][transition2]+"synRate*positionFrequencies__["+ts2+"]["+ps+"];\n");
+			}
+			else
+			{
+				bt = "nsClass"+aaRateMultipliers[aa1][aa2];
+				modelDefString*("CodonMatrixB["+hs+"]["+vs+"] := "+_nucBiasTerms[transition][transition2]+bt+"*synRate*positionFrequencies__["+ts+"]["+ps+"];\n"+
+												 "CodonMatrixB["+vs+"]["+hs+"] := "+_nucBiasTerms[transition][transition2]+bt+"*synRate*positionFrequencies__["+ts2+"]["+ps+"];\n");						
+			}
+		}
+    }
+}		
+modelDefString*0;
+ExecuteCommands (modelDefString);
+
+Model MGModelB	= (CodonMatrixB,codonFrequencies,0);
diff --git a/res/TemplateBatchFiles/queryTree.bf b/res/TemplateBatchFiles/queryTree.bf
new file mode 100644
index 0000000..392fd73
--- /dev/null
+++ b/res/TemplateBatchFiles/queryTree.bf
@@ -0,0 +1,142 @@
+if (_WRAP_PASSTHROUGH_FLAG_)
+{
+	fscanf (stdin,"String", treeString);
+	if (_DO_TREE_REBALANCE_)
+	{
+		treeString = RerootTree (treeString,0);
+	}			
+	if (_KEEP_I_LABELS_)
+	{
+		INTERNAL_NODE_PREFIX = "intNode";
+	}
+	
+	Tree givenTree = treeString;
+	if (_KEEP_I_LABELS_)
+	{
+		INTERNAL_NODE_PREFIX = "Node";
+	}
+}
+else
+{
+	if (IS_TREE_PRESENT_IN_DATA)
+	{
+		fprintf (stdout, "\n\nA tree was found in the data file:\n",DATAFILE_TREE,"\n\nWould you like to use it:(Y/N)?");
+		fscanf (stdin, "String", response);
+		if ((response=="n")||(response=="N"))
+		{
+			IS_TREE_PRESENT_IN_DATA = 0;
+		}
+		else
+		{
+			if (_DO_TREE_REBALANCE_)
+			{
+				treeString = RerootTree (DATAFILE_TREE,0);
+			}
+			else
+			{
+				treeString = DATAFILE_TREE;
+			}
+			
+			if (_KEEP_I_LABELS_)
+			{
+				INTERNAL_NODE_PREFIX = "intNode";
+			}
+			Tree givenTree = treeString;
+			if (_KEEP_I_LABELS_)
+			{
+				INTERNAL_NODE_PREFIX = "Node";
+			}
+			IS_TREE_PRESENT_IN_DATA = 1;
+		}
+		fprintf (stdout, "\n\n");
+
+	}
+
+	if (!IS_TREE_PRESENT_IN_DATA)
+	{
+		SetDialogPrompt ("Please select a tree file for the data:");
+
+		fscanf (PROMPT_FOR_FILE, REWIND, "Raw", treeString);
+		
+		treeStringPattern = treeString$"^#NEXUS";
+		if (treeStringPattern[0]>=0)
+		{
+			ExecuteCommands (treeString);
+			if (IS_TREE_PRESENT_IN_DATA == 0)
+			{
+				fprintf (stdout, "\nThis NEXUS file doesn't contain a valid tree block");
+				return 1;
+			}
+			if (Rows(NEXUS_FILE_TREE_MATRIX)>1)
+			{
+			
+				ChoiceList (treeChoice,"Select a tree",1,SKIP_NONE, NEXUS_FILE_TREE_MATRIX);
+				if (treeChoice < 0)
+				{
+					return 1;
+				}
+				treeString = NEXUS_FILE_TREE_MATRIX[treeChoice][1];
+			}
+			else
+			{
+				treeString = NEXUS_FILE_TREE_MATRIX[0][1];
+			}
+		}
+		else
+		{
+			treeStringPattern = treeString$"\\(";
+			if (treeStringPattern[0]<0)
+			{
+				fprintf (stdout, "\nThis doesn't seem to be a valid Newick string file. Can't find the opening parenthesis.\nHad:",treeString).
+				return 1;
+			}
+			else
+			{
+				parenCounter = 1;
+				strlength = Abs (treeString);
+				cp = treeStringPattern[0]+1;
+				while ( cp < strlength && parenCounter )
+				{
+					cpc = treeString[cp];
+					if (cpc == "(")
+					{
+						parenCounter = parenCounter + 1;
+					}
+					else
+					{
+						if (cpc == ")")
+						{
+							parenCounter = parenCounter - 1;
+						}
+					}
+					cp = cp+1;
+				}
+				
+				if (parenCounter)
+				{
+					fprintf (stdout, "\nThis doesn't seem to be a valid Newick string file. Can't match the parentheses.\nHad:",treeString).
+					return 1;	
+				}
+				
+				treeStringPattern = treeStringPattern[0];
+				treeString = treeString[treeStringPattern][cp-1];
+		}
+		}
+			
+		if (_DO_TREE_REBALANCE_)
+		{
+			treeString = RerootTree (treeString,0);
+		}
+			
+		if (_KEEP_I_LABELS_)
+		{
+			INTERNAL_NODE_PREFIX = "intNode";
+		}
+		
+		Tree givenTree = treeString;
+		if (_KEEP_I_LABELS_)
+		{
+			INTERNAL_NODE_PREFIX = "Node";
+		}
+	}
+}
diff --git a/res/TemplateBatchFiles/readIndexFile.bf b/res/TemplateBatchFiles/readIndexFile.bf
new file mode 100644
index 0000000..8cb7a9f
--- /dev/null
+++ b/res/TemplateBatchFiles/readIndexFile.bf
@@ -0,0 +1,23 @@
+RequireVersion ("0.9920060830");
+
+SetDialogPrompt ("Please select the index file:");
+fscanf 			(PROMPT_FOR_FILE,"Lines",inLines);
+
+counter	= Columns (inLines);
+
+if (skipCodeSelectionStep)
+{
+	stringMatrix 	= {counter$2,1};
+	codeTableMatrix = {counter$2,1};
+	counter  = 0;
+	counter2 = 0;
+	for (k=0; k<counter; k=k+2)
+	{
+		codeTableMatrix [k$2] = 0+inLines[k+1];
+		stringMatrix 	[k$2] = inLines[k];
+	}
+}
+else
+{
+	stringMatrix = Transpose (inLines);
+}
diff --git a/res/TemplateBatchFiles/relrateBootstrap.bf b/res/TemplateBatchFiles/relrateBootstrap.bf
new file mode 100644
index 0000000..84c268b
--- /dev/null
+++ b/res/TemplateBatchFiles/relrateBootstrap.bf
@@ -0,0 +1,375 @@
+IS_BOOTSTRAP_AVAILABLE = 1;
+IS_NPBOOTSTRAP_AVAILABLE = 1;
+
+function PadString (padLength,padChar)
+{
+	for (padCounter=0;padCounter<padLength;padCounter=padCounter+1)
+	{
+		fprintf (stdout,padChar);
+	}
+	return padLength;
+}
+
+function BootStrapFunction (bsIterates, tabulatedFileName, parametricOrNot)
+{
+	/* assume that data set is filteredData, tree string is treeString */
+	SAVE_GLOBALS = res[1][2];
+	LRcounter = 0;
+	if (SAVE_GLOBALS)
+	{
+		globalSpoolMatrix = {1,SAVE_GLOBALS};
+		for (bsCounter = 0; bsCounter< SAVE_GLOBALS; bsCounter = bsCounter+1)
+		{
+			globalSpoolMatrix[bsCounter] = res1[0][bsCounter];
+		}
+	}
+	dataDimension = Columns(res);
+	dataMatrix = {2,2*dataDimension+3};
+	nameWidth = 11;
+	fprintf (tabulatedFileName,",Unconstrained Optimizations,");
+	for (bsCounter=0;bsCounter<dataDimension;bsCounter=bsCounter+1)
+	{
+		fprintf	  (tabulatedFileName,", ");
+	}
+	fprintf (tabulatedFileName,"Constrained Optimizations");
+	for (bsCounter=0;bsCounter<dataDimension;bsCounter=bsCounter+1)
+	{
+		fprintf	  (tabulatedFileName,", ");
+	}
+	fprintf (tabulatedFileName,"\nIteration,Ln-likelihood");
+	for (bsCounter=0;bsCounter<dataDimension;bsCounter=bsCounter+1)
+	{
+		GetString (argName,lf,bsCounter);
+		fprintf	  (tabulatedFileName,",",argName);
+		temp = Abs(argName);
+		if (temp>nameWidth)
+		{
+			nameWidth = temp;
+		}
+	}
+	fprintf (tabulatedFileName,",Ln-likelihood");
+	for (bsCounter=0;bsCounter<dataDimension;bsCounter=bsCounter+1)
+	{
+		GetString (argName,lfConstrained,bsCounter);
+		fprintf	  (tabulatedFileName,",",argName);
+		temp = Abs(argName);
+		if (temp>nameWidth)
+		{
+			nameWidth = temp;
+		}
+	}	
+	fprintf (tabulatedFileName,",LR");
+	fprintf (stdout,"\nIteration      LRT       Current P-Value\n");
+
+	if (MPI_NODE_COUNT>1)
+	{
+		MPINodeState   = {MPI_NODE_COUNT-1,3};
+		MPIResultCache = {bsIterates, 2};
+		for (bsCounter = 0; bsCounter<bsIterates; bsCounter=bsCounter+1)
+		{
+			MPIResultCache[bsCounter][0] = "";
+			MPIResultCache[bsCounter][1] = "";
+		}
+		
+		iteratesScanFrom  = 0;
+	}
+
+	iteratesDoneCount = 1;
+	for (bsCounter=1;bsCounter<=bsIterates;bsCounter=bsCounter+1)
+	{
+		if (parametricOrNot)
+		{
+			DataSet simulatedDataSet = SimulateDataSet (lfConstrained);
+			if (NICETY_LEVEL == 3)
+			{
+				DataSetFilter simulatedDataFilter = CreateFilter (simulatedDataSet,3,"","",GeneticCodeExclusions);
+			}
+			else
+			{
+				DataSetFilter simulatedDataFilter = CreateFilter (simulatedDataSet,1);
+			}
+		}	
+		else
+		{
+			if (NICETY_LEVEL == 3)
+			{
+				DataSetFilter simulatedDataFilter = Bootstrap (filteredData,3);
+			}
+			else
+			{
+				DataSetFilter simulatedDataFilter = Bootstrap (filteredData,1);
+			}
+		}	
+		HarvestFrequencies (simulatedEFV,simulatedDataFilter,1,1,1);
+		if (FREQUENCY_SENSITIVE)
+		{
+			simulatedModelMatrix = 0;
+			if (USE_POSITION_SPECIFIC_FREQS)
+			{
+				HarvestFrequencies (simulatedEFV,simulatedDataFilter,3,1,1);
+			}
+			MULTIPLY_BY_FREQS = PopulateModelMatrix ("simulatedModelMatrix",simulatedEFV);
+			if (NICETY_LEVEL==3)
+			{
+				simulatedCodonEFV = BuildCodonFrequencies (simulatedEFV);
+				Model simulatedModel = (simulatedModelMatrix,simulatedCodonEFV,MULTIPLY_BY_FREQS);	
+			}
+			else
+			{
+				Model simulatedModel = (simulatedModelMatrix,simulatedEFV,MULTIPLY_BY_FREQS);
+			}	
+
+		}
+		Tree simulatedTree = treeString;
+		LikelihoodFunction simulatedLF = (simulatedDataFilter,simulatedTree);
+
+		if (MPI_NODE_COUNT>1)
+		{
+			dummy = SendIterate (0);
+			ReplicateConstraint (constraintString,simulatedTree.Ingroup1, simulatedTree.Ingroup2);
+			dummy = SendIterate (1);
+			dummy = ManageMPIReturns (0);
+		}
+		else
+		{
+			Optimize (simulatedResults,simulatedLF);
+			ReplicateConstraint (constraintString,simulatedTree.Ingroup1, simulatedTree.Ingroup2);
+			Optimize (simulatedResults2,simulatedLF);
+			fromNode = HandleAnIterate (0);	
+		}
+
+		if (SAVE_GLOBALS)
+		{
+			for (i = 0; i< SAVE_GLOBALS; i = i+1)
+			{
+				SetParameter(lfConstrained,i,globalSpoolMatrix[i]);
+			}
+		}
+	}
+
+	if (MPI_NODE_COUNT>1)
+	{
+		while (1)
+		{
+			for (nodeCounter = 0; nodeCounter < MPI_NODE_COUNT-1; nodeCounter = nodeCounter+1)
+			{
+				if (MPINodeState[nodeCounter][0]==1)
+				{
+					fromNode = ReceiveJobs (0,0);
+					break;	
+				}
+			}
+			if (nodeCounter == MPI_NODE_COUNT-1)
+			{
+				break;
+			}
+		}	
+		OPTIMIZE_SUMMATION_ORDER = 1;
+		dummy = ManageMPIReturns (0);
+	}	
+
+	fprintf (tabulatedFileName,"\nMLE,",res[1][0]);
+	
+	temp = bsIterates-1;
+	
+	fprintf (stdout,"\n\n\t\tBOOTSTRAPPING SUMMARY\n\n\t\tUNCONSTRAINED OPTIMIZATION\n\n");
+	
+	tableWidth = nameWidth+49;
+	fprintf (stdout,"+");
+	dumb = PadString (tableWidth-2,"-");
+	fprintf (stdout,"+\n| Parameter");
+	dumb = PadString (nameWidth-9," ");
+	fprintf (stdout,"|    MLE      |     Mean     |    Variance    |");
+	fprintf (stdout,"\n+");
+	dumb = PadString (tableWidth-2,"-");
+	fprintf (stdout,"+");
+	for (i=0;i<=dataDimension;i=i+1)
+	{
+		if (i<dataDimension)
+		{
+			GetString (argName,lf,i);
+			fprintf (tabulatedFileName,",",res[0][i]);
+			mle = res[0][i];
+		}
+		else
+		{
+			mle = res[1][0];
+			argName = "Ln-Lklhood";
+		}
+		fprintf (stdout,"\n| ",argName);
+		dumb = PadString(-Abs(argName)+nameWidth," ");
+		fprintf (stdout,"|",Format(mle,12,6)," | ",Format(dataMatrix[0][i]/bsIterates,12,6)," | ",
+						    Format((dataMatrix[1][i]-dataMatrix[0][i]*dataMatrix[0][i]/bsIterates)/temp,14,7)," |");
+	}
+	fprintf (stdout,"\n+");
+	dumb = PadString (tableWidth-2,"-");
+	fprintf (stdout,"+\n\n");
+
+	fprintf (stdout,"\n\n\t\tRATE CONSTRAINED OPTIMIZATION\n\n");
+	
+	tableWidth = nameWidth+49;
+	fprintf (stdout,"+");
+	dumb = PadString (tableWidth-2,"-");
+	fprintf (stdout,"+\n| Parameter");
+	dumb = PadString (nameWidth-9," ");
+	fprintf (stdout,"|    MLE      |     Mean     |    Variance    |");
+	fprintf (stdout,"\n+");
+	dumb = PadString (tableWidth-2,"-");
+	fprintf (stdout,"+");
+	fprintf (tabulatedFileName,",",res1[1][0]);
+	for (i=0;i<=dataDimension;i=i+1)
+	{
+		if (i<dataDimension)
+		{
+			GetString (argName,lfConstrained,i);
+			fprintf (tabulatedFileName,",",res1[0][i]);
+			mle = res1[0][i];
+		}
+		else
+		{
+			mle = res1[1][0];
+			argName = "Ln-Lklhood";
+		}
+		fprintf (stdout,"\n| ",argName);
+		dumb = PadString(-Abs(argName)+nameWidth," ");
+		fprintf (stdout,"|",Format(mle,12,6)," | ",Format(dataMatrix[0][dataDimension+i+1]/bsIterates,12,6)," | ",
+						    Format((dataMatrix[1][dataDimension+i+1]-dataMatrix[0][dataDimension+i+1]*dataMatrix[0][dataDimension+i+1]/bsIterates)/temp,14,7)," |");
+	}
+	fprintf (stdout,"\n+");
+	dumb = PadString (tableWidth-2,"-");
+	fprintf (stdout,"+\n\n");
+	
+	fprintf (tabulatedFileName,",",lnLikDiff);
+	
+	temp=2*dataDimension+2;
+	fprintf (stdout,"\n\nLikelihood Ratio Statistics:\nMEAN=",dataMatrix[0][temp]/bsIterates,
+			"\nVARIANCE=",(dataMatrix[1][temp]-dataMatrix[0][temp]*dataMatrix[0][temp]/bsIterates)/(bsIterates-1),
+			"\nProportion larger that the original likelihood ratio=",1-LRcounter/bsIterates,"\n");
+
+	return 0;
+}
+
+function HandleAnIterate (dummy)
+{
+	fprintf (stdout,"\n",Format(iteratesDoneCount,8,0));
+	fprintf (tabulatedFileName,"\n",Format(iteratesDoneCount,0,0));
+	fprintf (tabulatedFileName,",",simulatedResults[1][0]);
+	for (i=0;i<dataDimension;i=i+1)
+	{
+		temp = simulatedResults[0][i];
+		dataMatrix[0][i]=dataMatrix[0][i]+temp;
+		dataMatrix[1][i]=dataMatrix[1][i]+temp*temp;
+		fprintf (tabulatedFileName,",",temp);
+	}
+	temp = simulatedResults[1][0];
+	dataMatrix[0][i]=dataMatrix[0][i]+temp;
+	dataMatrix[1][i]=dataMatrix[1][i]+temp*temp;
+	fprintf (tabulatedFileName,",",simulatedResults2[1][0]);
+	for (i=0;i<dataDimension;i=i+1)
+	{
+		temp = simulatedResults2[0][i];
+		dataMatrix[0][dataDimension+1+i]=dataMatrix[0][dataDimension+1+i]+temp;
+		dataMatrix[1][dataDimension+1+i]=dataMatrix[1][dataDimension+1+i]+temp*temp;
+		fprintf (tabulatedFileName,",",temp);
+	}
+	temp = simulatedResults2[1][0];
+	dataMatrix[0][dataDimension+1+i]=dataMatrix[0][dataDimension+1+i]+temp;
+	dataMatrix[1][dataDimension+1+i]=dataMatrix[1][dataDimension+1+i]+temp*temp;
+	
+	/* Likelihood Ratio here */
+	simLR = 2*(simulatedResults[1][0]-simulatedResults2[1][0]);
+	if (simLR<0)
+	{
+		fprintf (MESSAGE_LOG,"\nA negative LRT statistic encoutered. You may want to increase the optimization precision settings to resolve numerical apporximation errors");
+	}
+	if (simLR<lnLikDiff)
+	{
+		LRcounter=LRcounter+1;
+	}
+	fprintf (tabulatedFileName,",",simLR);
+	temp = 2*dataDimension+2;
+	dataMatrix[0][temp]=dataMatrix[0][temp]+simLR;
+	dataMatrix[1][temp]=dataMatrix[1][temp]+simLR*simLR;
+	
+	fprintf (stdout, "  ",Format(simLR,12,7),
+					  "    ",Format(1-LRcounter/iteratesDoneCount,12,7));
+					  
+	iteratesDoneCount = iteratesDoneCount + 1;
+
+	return 0;
+}
+
+function ReceiveJobs (sendOn,hyp)
+{
+	MPIReceive (-1, fromNode, result_String);
+	jobIterateCount = MPINodeState[fromNode-1][1];	
+	jobHypothesis   = MPINodeState[fromNode-1][2];
+	
+	if (sendOn)
+	{	
+		MPISend (fromNode,simulatedLF);
+		MPINodeState[fromNode-1][1] = bsCounter-1;	
+		MPINodeState[fromNode-1][2] = hyp;	
+	}
+	else
+	{
+		MPINodeState[fromNode-1][0] = 0;		
+	}
+	
+	MPIResultCache[jobIterateCount][jobHypothesis] = result_String;
+	result_String = "";
+	
+	return 0;
+}
+
+function SendIterate (dummy)
+{
+	for (mpiNode = 0; mpiNode < MPI_NODE_COUNT-1; mpiNode = mpiNode+1)
+	{
+		if (MPINodeState[mpiNode][0]==0)
+		{
+			break;	
+		}
+	}
+	
+	if (mpiNode==MPI_NODE_COUNT-1)
+	/* all nodes busy */
+	{
+		mpiNode = ReceiveJobs (1,dummy);
+	}
+	else
+	{
+		MPISend (mpiNode+1,simulatedLF);
+		MPINodeState[mpiNode][0] = 1;
+		MPINodeState[mpiNode][1] = bsCounter-1;
+		MPINodeState[mpiNode][2] = dummy;
+	}
+	return 0;
+}
+
+function ManageMPIReturns (dummy)
+{
+	incrementLowerBound = 1;
+	for (jobIterateCount = iteratesScanFrom; jobIterateCount < bsCounter-1; jobIterateCount = jobIterateCount+1)
+	{
+		if (Abs(MPIResultCache[jobIterateCount][0])*Abs(MPIResultCache[jobIterateCount][1]))
+		{
+			if (incrementLowerBound)
+			{
+				iteratesScanFrom = iteratesScanFrom+1;
+			}
+			ExecuteCommands (MPIResultCache[jobIterateCount][0]);
+			simulatedResults = simulatedLF_MLES;
+			ExecuteCommands (MPIResultCache[jobIterateCount][1]);
+			simulatedResults2 = simulatedLF_MLES;
+			MPIResultCache[jobIterateCount][0] = "";
+			MPIResultCache[jobIterateCount][1] = "";
+			dummy = HandleAnIterate (0);
+		}
+		else
+		{
+			incrementLowerBound = 0;
+		}
+	}
+	return 0;
+}
diff --git a/res/TemplateBatchFiles/relrateBootstrapL.bf b/res/TemplateBatchFiles/relrateBootstrapL.bf
new file mode 100644
index 0000000..657bad8
--- /dev/null
+++ b/res/TemplateBatchFiles/relrateBootstrapL.bf
@@ -0,0 +1,232 @@
+IS_BOOTSTRAP_AVAILABLE = 1;
+IS_NPBOOTSTRAP_AVAILABLE = 1;
+
+function PadString (padLength,padChar)
+{
+	for (padCounter=0;padCounter<padLength;padCounter=padCounter+1)
+	{
+		fprintf (stdout,padChar);
+	}
+	return padLength;
+}
+
+function BootStrapFunction (bsIterates, tabulatedFileName, parametricOrNot)
+{
+	/* assume that data set is filteredData, tree string is treeString */
+	SAVE_GLOBALS = res1[1][2];
+	LRcounter = 0;
+	if (SAVE_GLOBALS)
+	{
+		globalSpoolMatrix = {1,SAVE_GLOBALS};
+		for (bsCounter = 0; bsCounter< SAVE_GLOBALS; bsCounter = bsCounter+1)
+		{
+			globalSpoolMatrix[bsCounter] = res1[0][bsCounter];
+		}
+	}
+	dataDimension = Columns(res);
+	dataMatrix = {2,2*dataDimension+4};
+	nameWidth = 11;
+	fprintf (tabulatedFileName,",Unconstrained Optimizations,");
+	for (bsCounter=0;bsCounter<dataDimension;bsCounter=bsCounter+1)
+	{
+		fprintf	  (tabulatedFileName,", ");
+	}
+	fprintf (tabulatedFileName,"Constrained Optimizations");
+	for (bsCounter=0;bsCounter<dataDimension;bsCounter=bsCounter+1)
+	{
+		fprintf	  (tabulatedFileName,", ");
+	}
+	fprintf (tabulatedFileName,"\nIteration,Ln-likelihood");
+	for (bsCounter=0;bsCounter<dataDimension;bsCounter=bsCounter+1)
+	{
+		GetString (argName,lf,bsCounter);
+		fprintf	  (tabulatedFileName,",",argName);
+		temp = Abs(argName);
+		if (temp>nameWidth)
+		{
+			nameWidth = temp;
+		}
+	}
+	fprintf (tabulatedFileName,",Ln-likelihood");
+	for (bsCounter=0;bsCounter<dataDimension;bsCounter=bsCounter+1)
+	{
+		GetString (argName,lfConstrained,bsCounter);
+		fprintf	  (tabulatedFileName,",",argName);
+		temp = Abs(argName);
+		if (temp>nameWidth)
+		{
+			nameWidth = temp;
+		}
+	}	
+	fprintf (tabulatedFileName,",LR");
+	fprintf (stdout,"\nIteration      LRT       Current P-Value\n");
+	for (bsCounter=1;bsCounter<=bsIterates;bsCounter=bsCounter+1)
+	{
+		fprintf (stdout,"\n",Format(bsCounter,8,0));
+		fprintf (tabulatedFileName,"\n",Format(bsCounter,0,0));
+		if (parametricOrNot)
+		{
+			DataSet simulatedDataSet = SimulateDataSet (lfConstrained);
+			if (NICETY_LEVEL == 3)
+			{
+				DataSetFilter simulatedDataFilter = CreateFilter (simulatedDataSet,3,"","",GeneticCodeExclusions);
+			}
+		}	
+		else
+		{
+			if (NICETY_LEVEL == 3)
+			{
+				DataSetFilter simulatedDataFilter = Bootstrap (filteredData,3);
+			}
+		}	
+
+		if (modelType)
+		{
+			HarvestFrequencies (simulatedEFV,simulatedDataFilter,3,1,1);
+		}
+		else
+		{
+			HarvestFrequencies (simulatedEFV,simulatedDataFilter,1,1,1);
+		}
+
+		simulatedCodonEFV = BuildCodonFrequencies (simulatedEFV);
+		MULTIPLY_BY_FREQS = PopulateModelMatrix ("simulatedModelMatrix",simulatedEFV);
+		Model simulatedModel = (simulatedModelMatrix,simulatedCodonEFV,MULTIPLY_BY_FREQS);
+
+		Tree simulatedTree = treeString;
+		LikelihoodFunction simulatedLF = (simulatedDataFilter,simulatedTree);
+		Optimize (simulatedResults,simulatedLF);
+		
+		simulatedTree.Ingroup1.nonSynRate := R*simulatedTree.Ingroup1.synRate;
+		simulatedTree.Ingroup2.nonSynRate := R*simulatedTree.Ingroup2.synRate;
+
+		Optimize (simulatedResults2,simulatedLF);
+		fprintf (tabulatedFileName,",",simulatedResults[1][0]);
+		for (i=0;i<dataDimension;i=i+1)
+		{
+			temp = simulatedResults[0][i];
+			dataMatrix[0][i]=dataMatrix[0][i]+temp;
+			dataMatrix[1][i]=dataMatrix[1][i]+temp*temp;
+			fprintf (tabulatedFileName,",",temp);
+		}
+		temp = simulatedResults[1][0];
+		dataMatrix[0][i]=dataMatrix[0][i]+temp;
+		dataMatrix[1][i]=dataMatrix[1][i]+temp*temp;
+		fprintf (tabulatedFileName,",",simulatedResults2[1][0]);
+		for (i=0;i<=dataDimension;i=i+1)
+		{
+			temp = simulatedResults2[0][i];
+			dataMatrix[0][dataDimension+1+i]=dataMatrix[0][dataDimension+1+i]+temp;
+			dataMatrix[1][dataDimension+1+i]=dataMatrix[1][dataDimension+1+i]+temp*temp;
+			fprintf (tabulatedFileName,",",temp);
+		}
+		temp = simulatedResults2[1][0];
+		dataMatrix[0][dataDimension+1+i]=dataMatrix[0][dataDimension+1+i]+temp;
+		dataMatrix[1][dataDimension+1+i]=dataMatrix[1][dataDimension+1+i]+temp*temp;
+		
+		/* Likelihood Ratio here */
+		simLR = 2*(simulatedResults[1][0]-simulatedResults2[1][0]);
+		if (simLR<0)
+		{
+			fprintf (MESSAGE_LOG,"\nA negative LRT statistic encoutered. You may want to increase the optimization precision settings to resolve numerical apporximation errors");
+		}
+		if (simLR<lnLikDiff)
+		{
+			LRcounter=LRcounter+1;
+		}
+		fprintf (tabulatedFileName,",",simLR);
+		temp = 2*dataDimension+3;
+		dataMatrix[0][temp]=dataMatrix[0][temp]+simLR;
+		dataMatrix[1][temp]=dataMatrix[1][temp]+simLR*simLR;
+		
+		if (SAVE_GLOBALS)
+		{
+			for (i = 0; i< SAVE_GLOBALS; i = i+1)
+			{
+				SetParameter(lfConstrained,i,globalSpoolMatrix[i]);
+			}
+		}
+		
+		fprintf (stdout, "  ",Format(simLR,12,7),
+						  "    ",Format(1-LRcounter/bsCounter,12,7));
+	}
+	fprintf (tabulatedFileName,"\nMLE,",res[1][0]);
+	
+	temp = bsIterates-1;
+	
+	fprintf (stdout,"\n\n\t\tBOOTSTRAPPING SUMMARY\n\n\t\tUNCONSTRAINED OPTIMIZATION\n\n");
+	
+	tableWidth = nameWidth+49;
+	fprintf (stdout,"+");
+	dumb = PadString (tableWidth-2,"-");
+	fprintf (stdout,"+\n| Parameter");
+	dumb = PadString (nameWidth-9," ");
+	fprintf (stdout,"|    MLE      |     Mean     |    Variance    |");
+	fprintf (stdout,"\n+");
+	dumb = PadString (tableWidth-2,"-");
+	fprintf (stdout,"+");
+	for (i=0;i<=dataDimension;i=i+1)
+	{
+		if (i<dataDimension)
+		{
+			GetString (argName,lf,i);
+			fprintf (tabulatedFileName,",",res[0][i]);
+			mle = res[0][i];
+		}
+		else
+		{
+			mle = res[1][0];
+			argName = "Ln-Lklhood";
+		}
+		fprintf (stdout,"\n| ",argName);
+		dumb = PadString(-Abs(argName)+nameWidth," ");
+		fprintf (stdout,"|",Format(mle,12,6)," | ",Format(dataMatrix[0][i]/bsIterates,12,6)," | ",
+						    Format((dataMatrix[1][i]-dataMatrix[0][i]*dataMatrix[0][i]/bsIterates)/temp,14,7)," |");
+	}
+	fprintf (stdout,"\n+");
+	dumb = PadString (tableWidth-2,"-");
+	fprintf (stdout,"+\n\n");
+
+	fprintf (stdout,"\n\n\t\tRATE CONSTRAINED OPTIMIZATION\n\n");
+	
+	tableWidth = nameWidth+49;
+	fprintf (stdout,"+");
+	dumb = PadString (tableWidth-2,"-");
+	fprintf (stdout,"+\n| Parameter");
+	dumb = PadString (nameWidth-9," ");
+	fprintf (stdout,"|    MLE      |     Mean     |    Variance    |");
+	fprintf (stdout,"\n+");
+	dumb = PadString (tableWidth-2,"-");
+	fprintf (stdout,"+");
+	fprintf (tabulatedFileName,",",res1[1][0]);
+	for (i=0;i<=dataDimension+1;i=i+1)
+	{
+		if (i<=dataDimension)
+		{
+			GetString (argName,lfConstrained,i);
+			fprintf (tabulatedFileName,",",res1[0][i]);
+			mle = res1[0][i];
+		}
+		else
+		{
+			mle = res1[1][0];
+			argName = "Ln-Lklhood";
+		}
+		fprintf (stdout,"\n| ",argName);
+		dumb = PadString(-Abs(argName)+nameWidth," ");
+		fprintf (stdout,"|",Format(mle,12,6)," | ",Format(dataMatrix[0][dataDimension+i+1]/bsIterates,12,6)," | ",
+						    Format((dataMatrix[1][dataDimension+i+1]-dataMatrix[0][dataDimension+i+1]*dataMatrix[0][dataDimension+i+1]/bsIterates)/temp,14,7)," |");
+	}
+	fprintf (stdout,"\n+");
+	dumb = PadString (tableWidth-2,"-");
+	fprintf (stdout,"+\n\n");
+	
+	fprintf (tabulatedFileName,",",lnLikDiff);
+	
+	temp=2*dataDimension+2;
+	fprintf (stdout,"\n\nLikelihood Ratio Statistics:\nMEAN=",dataMatrix[0][temp]/bsIterates,
+			"\nVARIANCE=",(dataMatrix[1][temp]-dataMatrix[0][temp]*dataMatrix[0][temp]/bsIterates)/(bsIterates-1),
+			"\nProportion larger that the original likelihood ratio=",1-LRcounter/bsIterates,"\n");
+
+	return 0;
+}
diff --git a/res/TemplateBatchFiles/relratioBootstrap.bf b/res/TemplateBatchFiles/relratioBootstrap.bf
new file mode 100644
index 0000000..4e9e0cc
--- /dev/null
+++ b/res/TemplateBatchFiles/relratioBootstrap.bf
@@ -0,0 +1,131 @@
+IS_BOOTSTRAP_AVAILABLE = 1;
+IS_NPBOOTSTRAP_AVAILABLE = 1;
+
+function PadString (padLength,padChar)
+{
+	for (padCounter=0;padCounter<padLength;padCounter=padCounter+1)
+	{
+		fprintf (stdout,padChar);
+	}
+	return padLength;
+}
+
+function BootStrapFunction (bsIterates, tabulatedFileName, parametricOrNot)
+{
+	/* assume that data set is filteredData, tree string is treeString */
+	LRCounter = 0;
+	LRsum = 0;
+	LRsquaresum = 0;
+	fprintf (tabulatedFileName,"Iteration,Likelihood Ratio");
+	
+	fprintf (stdout,"\nIteration      LRT       Current P-Value\n");
+	for (bsCounter=1;bsCounter<=bsIterates;bsCounter=bsCounter+1)
+	{
+		fprintf (stdout,"\n",Format(bsCounter,8,0));
+		fprintf (tabulatedFileName,"\n",Format(bsCounter,0,0));
+		if (parametricOrNot)
+		{
+			if (SAVE_GLOBALS2)
+			{
+				for (i = 0; i< SAVE_GLOBALS2; i = i+1)
+				{
+					SetParameter(lfConstrained,i,globalSpoolMatrix2[i]);
+				}
+			}
+			DataSet simulatedDataSet = SimulateDataSet (lfConstrained);
+
+			if (NICETY_LEVEL == 3)
+			{
+				DataSetFilter simulatedDataFilter  = CreateFilter (simulatedDataSet,3,siteIndex<ds.sites,"",GeneticCodeExclusions);
+				DataSetFilter simulatedDataFilter2 = CreateFilter (simulatedDataSet,3,siteIndex>=ds.sites,"",GeneticCodeExclusions);
+			}
+			else
+			{
+				DataSetFilter simulatedDataFilter  = CreateFilter (simulatedDataSet,1,siteIndex<ds.sites);
+				DataSetFilter simulatedDataFilter2 = CreateFilter (simulatedDataSet,1,siteIndex>=ds.sites);
+			}
+		}	
+		else
+		{
+			if (NICETY_LEVEL == 3)
+			{
+				DataSetFilter simulatedDataFilter  = Bootstrap (filteredData,3);
+				DataSetFilter simulatedDataFilter2 = Bootstrap (filteredData2,3);
+			}
+			else
+			{
+				DataSetFilter simulatedDataFilter  = Bootstrap (filteredData,1);
+				DataSetFilter simulatedDataFilter2 = Bootstrap (filteredData2,1);
+			}
+		}	
+		HarvestFrequencies (simulatedEFV,simulatedDataFilter,1,1,1);
+		HarvestFrequencies (simulatedEFV2,simulatedDataFilter2,1,1,1);
+
+		if (FREQUENCY_SENSITIVE)
+		{
+			simulatedModelMatrix = 0;
+			simulatedModelMatrix2 = 0;
+			if (USE_POSITION_SPECIFIC_FREQS)
+			{
+				HarvestFrequencies (simulatedEFV,simulatedDataFilter,3,1,1);
+				HarvestFrequencies (simulatedEFV2,simulatedDataFilter2,3,1,1);
+			}
+			MULTIPLY_BY_FREQS = PopulateModelMatrix ("simulatedModelMatrix",simulatedEFV);
+			MULTIPLY_BY_FREQS2 = PopulateModelMatrix ("simulatedModelMatrix2",simulatedEFV2);
+			if (NICETY_LEVEL==3)
+			{
+				simulatedCodonEFV = BuildCodonFrequencies (simulatedEFV);
+				simulatedCodonEFV2 = BuildCodonFrequencies (simulatedEFV2);
+				Model simulatedModel = (simulatedModelMatrix,simulatedCodonEFV,MULTIPLY_BY_FREQS);	
+				Tree simulatedTree = treeString;
+				Model simulatedModel2 = (simulatedModelMatrix2,simulatedCodonEFV2,MULTIPLY_BY_FREQS);	
+				Tree simulatedTree2 = treeString;
+			}
+			else
+			{
+				Model simulatedModel = (simulatedModelMatrix,simulatedEFV,MULTIPLY_BY_FREQS);
+				Tree simulatedTree = treeString;
+				Model simulatedModel2 = (simulatedModelMatrix2,simulatedEFV2,MULTIPLY_BY_FREQS);
+				Tree simulatedTree2 = treeString;
+			}	
+
+		}
+		else
+		{
+			Tree simulatedTree = treeString;
+			Tree simulatedTree2 = treeString;
+		}
+		
+		LikelihoodFunction simulatedLF = (simulatedDataFilter,simulatedTree);
+		Optimize (simulatedResults,simulatedLF);
+		LikelihoodFunction simulatedLF2 = (simulatedDataFilter2,simulatedTree2);
+		Optimize (simulatedResults1,simulatedLF2);
+		ReplicateConstraint (constraintString,simulatedTree2, simulatedTree);
+		LikelihoodFunction lfSimConstrained = (simulatedDataFilter2,simulatedTree2,simulatedDataFilter,simulatedTree);
+		Optimize (simulatedResults2,lfSimConstrained);
+		SimLR = 2*(simulatedResults[1][0]+simulatedResults1[1][0]-simulatedResults2[1][0]);
+		if (SimLR<0)
+		{
+			fprintf (MESSAGE_LOG,"\nA negative LRT statistic encoutered. You may want to increase the optimization precision settings to resolve numerical apporximation errors");
+		}
+		if (SimLR<lnLikDiff)
+		{
+			LRCounter = LRCounter+1;
+		}
+		LRsum = LRsum+SimLR;
+		LRsquaresum = LRsquaresum+SimLR*SimLR;
+		fprintf (tabulatedFileName,",",SimLR);
+		fprintf (stdout, "  ",Format(SimLR,12,7),
+						  "    ",Format(1-LRCounter/bsCounter,12,7));
+				
+	}
+	fprintf (tabulatedFileName,"\nMLE,",lnLikDiff);
+	fprintf (stdout,"\n\n\t\tBOOTSTRAPPING SUMMARY\n\n");
+	
+	fprintf (stdout,"\n\nLikelihood Ratio Statistics:\nMEAN=",LRsum/bsIterates,
+			"\nVARIANCE=",(LRsquaresum-LRsum*LRsum/bsIterates)/(bsIterates-1),
+			"\nProportion larger that the original likelihood ratio=",1-LRCounter/bsIterates,"\n");
+			
+	return 0;
+}
+
diff --git a/res/TemplateBatchFiles/selectModelParameters.bf b/res/TemplateBatchFiles/selectModelParameters.bf
new file mode 100644
index 0000000..a7d1c9e
--- /dev/null
+++ b/res/TemplateBatchFiles/selectModelParameters.bf
@@ -0,0 +1,23 @@
+parameter2Constrain = 0;
+
+if (Rows("LAST_MODEL_PARAMETER_LIST")>1)
+{
+	ChoiceList (parameter2Constrain, "Parameter(s) to constrain:",1,SKIP_NONE,LAST_MODEL_PARAMETER_LIST);
+
+	if (parameter2Constrain<0)
+	{
+		return;
+	}
+}
+
+if (parameter2Constrain==0)
+{
+	funnyString = "?";
+}
+else
+{
+	GetString (funnyString,LAST_MODEL_PARAMETER_LIST,parameter2Constrain-1);
+}
+
+
+constraintString = "this1.?."+funnyString+relationString+"this2.?."+funnyString;
diff --git a/res/TemplateBatchFiles/simpleBootstrap.bf b/res/TemplateBatchFiles/simpleBootstrap.bf
new file mode 100644
index 0000000..1716960
--- /dev/null
+++ b/res/TemplateBatchFiles/simpleBootstrap.bf
@@ -0,0 +1,389 @@
+IS_BOOTSTRAP_AVAILABLE 		= 1;
+IS_NPBOOTSTRAP_AVAILABLE    = 1;
+
+function PadString (padLength,padChar)
+{
+	for (padCounter=0;padCounter<padLength;padCounter=padCounter+1)
+	{
+		fprintf (stdout,padChar);
+	}
+	return padLength;
+}
+
+/* mod 11/10/2005 to spool branch lengths as well */
+#include 	"dSdNTreeTools.ibf";
+ExecuteAFile (HYPHY_LIB_DIRECTORY+"TemplateBatchFiles"+DIRECTORY_SEPARATOR+"Utility"+DIRECTORY_SEPARATOR+"CodonTools.bf");
+/* end mod */
+
+/*----------------------------------------------------------------------------------------------------------------------------*/
+
+function BootStrapFunction (bsIterates, tabulatedFileName, parametricOrNot)
+{
+	VERBOSITY_LEVEL				= -1;
+	/* assume that data set is filteredData, tree string is treeString */
+	SAVE_GLOBALS = res[1][2];
+	if (SAVE_GLOBALS)
+	{
+		globalSpoolMatrix = {1,SAVE_GLOBALS};
+		for (bsCounter = 0; bsCounter< SAVE_GLOBALS; bsCounter = bsCounter+1)
+		{
+			globalSpoolMatrix[bsCounter] = res[0][bsCounter];
+		}
+	}
+		
+	if (categoriesUsed&&parametricOrNot)
+	{
+		ChoiceList (CATEGORY_SIMULATION_METHOD,"Sampling Options",1,SKIP_NONE,
+					"Discrete","Random rate variability will be sampled from the discretized disrtibution.",
+					"Continuous","Random rate variability will be sampled from the continuous disrtibution (if possible).",
+		);
+		if (CATEGORY_SIMULATION_METHOD<0)
+		{
+			return 0;
+		}
+		else
+		{
+			CATEGORY_SIMULATION_METHOD = CATEGORY_SIMULATION_METHOD+1;		
+		}
+	}	
+	
+	/* mod 11/10/2005 */
+	GetString (lf_summary,lf,-1);
+	tree_ids = lf_summary ["Trees"];
+	generatingTree = tree_ids[0];
+	ExecuteCommands(
+	"BranchNamesVector = BranchName ("+generatingTree+", -1);"
+	);
+	branchTotalCount = Columns (BranchNamesVector)-1; /* do not count the 'root' node */
+	/* end mod */
+	
+	fprintf 		(tabulatedFileName,KEEP_OPEN,"Iteration,Ln-likelihood");
+	dataDimension = Columns(res);
+	dataMatrix 	  = {2,dataDimension+1};
+
+	/* map likelihood function parameters to indices */
+	_variableMap  = {};
+	for (bsCounter=0; bsCounter < dataDimension; bsCounter = bsCounter + 1)
+	{
+		GetString (_i, lf, bsCounter);
+		_i = _i^{{"givenTree\\.",""}};
+		_variableMap[_i] = Abs (_variableMap);
+	}
+	
+	nameWidth = 11;
+	if (Abs(_Genetic_Code)) /* have coding data */
+	{
+		_baseAVL = _computeSNSSites ("filteredData", _Genetic_Code, vectorOfFrequencies, 0);		
+		fprintf	  (tabulatedFileName,",Syn_sites,NS_sites,Total_sites");
+	}
+	for (bsCounter=0;bsCounter<dataDimension;bsCounter=bsCounter+1)
+	{
+		GetString (argName,lf,bsCounter);
+		fprintf	  (tabulatedFileName,",",argName);
+		temp = Abs(argName);
+		if (temp>nameWidth)
+		{
+			nameWidth = temp;
+		}
+	}
+	/* mod 11/10/2005 */
+	if (Abs(_Genetic_Code)) /* have coding data */
+	{
+		scalingStencils = ComputeScalingStencils (0); /* defined in dSdNTreeTools.ibf */
+		for (bsCounter=0;bsCounter<branchTotalCount;bsCounter=bsCounter+1)
+		{
+			fprintf	  (tabulatedFileName,",TotalLength(",BranchNamesVector[bsCounter],"),",
+										 "SynLength(",BranchNamesVector[bsCounter],"),",
+										 "NonSynLength(",BranchNamesVector[bsCounter],")");
+		}	
+		BaseBranchLengthsVector = ReturnVectorsOfCodonLengths (scalingStencils,generatingTree);
+	}
+	else
+	{
+		for (bsCounter=0;bsCounter<branchTotalCount;bsCounter=bsCounter+1)
+		{
+			fprintf	  (tabulatedFileName,",BranchLength(",BranchNamesVector[bsCounter],")");
+		}
+		ExecuteCommands(
+		"BaseBranchLengthsVector = BranchLength ("+generatingTree+", -1);"
+		);		
+	}
+	
+	/* end mod */
+	
+	if (MPI_NODE_COUNT>1)
+	{
+		MPINodeState = {MPI_NODE_COUNT-1,1};
+		finishedJobs = 0;
+		OPTIMIZE_SUMMATION_ORDER = 0;
+	}
+	
+	for (bsCounter=1;bsCounter<=bsIterates;bsCounter=bsCounter+1)
+	{
+		if (MPI_NODE_COUNT<=1)
+		{
+			fprintf (stdout,"\nIteration ",Format(bsCounter,0,0),"/",Format(bsIterates,0,0)," ");
+			fprintf (tabulatedFileName,"\n",Format(bsCounter,0,0));		
+		}
+		
+		if (parametricOrNot)
+		{
+			DataSet simulatedDataSet = SimulateDataSet (lf);
+			if (Abs(_Genetic_Code))
+			{
+				DataSetFilter simulatedDataFilter = CreateFilter (simulatedDataSet,3,"","",GeneticCodeExclusions);
+			}
+			else
+			{
+				DataSetFilter simulatedDataFilter = CreateFilter (simulatedDataSet,1);
+			}
+		}	
+		else
+		{
+			if (Abs(_Genetic_Code))
+			{
+				DataSetFilter simulatedDataFilter = Bootstrap (filteredData,3);
+			}
+			else
+			{
+				DataSetFilter simulatedDataFilter = Bootstrap (filteredData,1);
+			}
+		}	
+		
+		HarvestFrequencies (simulatedEFV,simulatedDataFilter,1,1,1);
+		
+		if (FREQUENCY_SENSITIVE)
+		{
+			simulatedModelMatrix = 0;
+			if (USE_POSITION_SPECIFIC_FREQS)
+			{
+				HarvestFrequencies (simulatedEFV,simulatedDataFilter,3,1,1);
+			}
+			MULTIPLY_BY_FREQS = PopulateModelMatrix ("simulatedModelMatrix",simulatedEFV);
+			if (Abs(_Genetic_Code))
+			{
+				simulatedCodonEFV 	 = BuildCodonFrequencies (simulatedEFV);
+				Model simulatedModel = (simulatedModelMatrix,simulatedCodonEFV,MULTIPLY_BY_FREQS);	
+			}
+			else
+			{
+				Model simulatedModel = (simulatedModelMatrix,simulatedEFV,MULTIPLY_BY_FREQS);
+			}	
+		}
+		
+		Tree simulatedTree = treeString;
+		LikelihoodFunction simulatedLF = (simulatedDataFilter,simulatedTree);
+		
+		if (MPI_NODE_COUNT>1)
+		{
+			for (nodeCounter = 0; nodeCounter < MPI_NODE_COUNT-1; nodeCounter = nodeCounter+1)
+			{
+				if (MPINodeState[nodeCounter]==0)
+				{
+					break;	
+				}
+			}
+			
+			if (nodeCounter==MPI_NODE_COUNT-1)
+			{
+				nodeCounter = ProcessIterate (1);
+			}
+			else
+			{
+				MPISend (nodeCounter+1,simulatedLF);
+				MPINodeState[nodeCounter] = 1;
+			}		
+		}
+		else
+		{
+			Optimize (simulatedResults,simulatedLF);
+			dummy = ProcessIterate (0);
+		}
+		
+		if (SAVE_GLOBALS)
+		{
+			for (i = 0; i< SAVE_GLOBALS; i = i+1)
+			{
+				SetParameter(lf,i,globalSpoolMatrix[i]);
+			}
+		}
+	}
+
+	if (MPI_NODE_COUNT>1)
+	{
+		while (1)
+		{
+			for (nodeCounter = 0; nodeCounter < MPI_NODE_COUNT-1; nodeCounter = nodeCounter+1)
+			{
+				if (MPINodeState[nodeCounter]==1)
+				{
+					fromNode = ProcessIterate (0);
+					break;	
+				}
+			}
+			if (nodeCounter == MPI_NODE_COUNT-1)
+			{
+				break;
+			}
+		}		
+		OPTIMIZE_SUMMATION_ORDER = 1;
+	}
+
+	fprintf (tabulatedFileName,"\nMLE,",res[1][0]);
+	
+	temp = bsIterates-1;
+	
+	fprintf (stdout,"\n\n\t\tBOOTSTRAPPING SUMMARY\n\n");
+	
+	tableWidth = nameWidth+49;
+	fprintf (stdout,"+");
+	PadString (tableWidth-2,"-");
+	fprintf (stdout,"+\n| Parameter");
+	PadString (nameWidth-9," ");
+	fprintf (stdout,"|    MLE      |     Mean     |    Variance    |");
+	fprintf (stdout,"\n+");
+	PadString (tableWidth-2,"-");
+	fprintf (stdout,"+");
+
+	if (Abs(_Genetic_Code)) /* have coding data */
+	{
+		fprintf (tabulatedFileName,",",_baseAVL["SSites"],",",_baseAVL["NSSites"],",",_baseAVL["Sites"]);
+	}
+
+	for (i=0;i<=dataDimension;i=i+1)
+	{
+		if (i<dataDimension)
+		{
+			GetString (argName,lf,i);
+			fprintf (tabulatedFileName,",",res[0][i]);
+			mle = res[0][i];
+		}
+		else
+		{
+			mle = res[1][0];
+			argName = "Ln-Lklhood";
+		}
+		fprintf (stdout,"\n| ",argName);
+		PadString(-Abs(argName)+nameWidth," ");
+		fprintf (stdout,"|",Format(mle,12,6)," | ",Format(dataMatrix[0][i]/bsIterates,12,6)," | ",
+						    Format((dataMatrix[1][i]-dataMatrix[0][i]*dataMatrix[0][i]/bsIterates)/temp,14,7)," |");
+	}
+	/* mod 11/10/2005; print MLE branch lengths */
+	blString = "";
+	blString * 128;
+	if (Abs(_Genetic_Code)) /* have coding data */
+	{
+		tv = BaseBranchLengthsVector["Total"];
+		sv = BaseBranchLengthsVector["Syn"];
+		nv = BaseBranchLengthsVector["NonSyn"];
+		
+		for (bsCounter=0;bsCounter<branchTotalCount;bsCounter=bsCounter+1)
+		{
+			blString * (","+tv[bsCounter]+","+sv[bsCounter]+","+nv[bsCounter]);
+		}
+	}
+	else
+	{
+		for (bsCounter=0;bsCounter<branchTotalCount;bsCounter=bsCounter+1)
+		{
+			blString * (","+BaseBranchLengthsVector[bsCounter]);
+		}
+	}
+	blString * 0;
+	fprintf (tabulatedFileName, blString,CLOSE_FILE);
+	/* end */
+	fprintf (stdout,"\n+");
+	dumb = PadString (tableWidth-2,"-");
+	fprintf (stdout,"+\n\n");
+	
+	return 0;
+}
+
+/*----------------------------------------------------------------------------------*/
+
+function ProcessIterate (sendMore)
+{
+	if (MPI_NODE_COUNT>1)
+	{
+		finishedJobs = finishedJobs + 1;
+		MPIReceive (-1, fromNode, result_String);
+		if (sendMore)
+		{
+			MPISend (fromNode,simulatedLF);
+		}
+		else
+		{
+			MPINodeState[fromNode-1] = 0;
+		}
+		ExecuteCommands (result_String);
+		simulatedResults = simulatedLF_MLES;
+		fprintf (stdout,"\nIteration ",Format(finishedJobs,0,0),"/",Format(bsIterates,0,0)," ");
+		fprintf (tabulatedFileName,"\n",Format(finishedJobs,0,0));		
+	}
+	
+	
+	/* mod 11/10/2005; print MLE branch lengths */
+	blString = "";
+	blString * 128;
+	blString * (","+simulatedResults[1][0]);
+	
+	tMap = {dataDimension,1};
+	for (i=0;i<dataDimension;i=i+1)
+	{
+		GetString (_i, simulatedLF, i);
+		_i = _variableMap [_i^{{"simulatedTree\\.",""}}];
+		temp 				= 	simulatedResults[0][i];
+		dataMatrix[0][_i]	=	dataMatrix[0][_i]	+	temp;
+		dataMatrix[1][_i]	=	dataMatrix[1][_i]	+	temp*temp;
+		tMap [_i] = temp;
+	}
+	
+	if (Abs(_Genetic_Code)) /* have coding data */
+	{
+		if (FREQUENCY_SENSITIVE)
+		{
+			_snsAVL	   			 = _computeSNSSites ("simulatedDataFilter", _Genetic_Code, simulatedCodonEFV, 1);
+		}
+		else
+		{
+			_snsAVL				 = _baseAVL;
+		}
+		blString * (","+_snsAVL["SSites"]+","+_snsAVL["NSSites"]+","+_snsAVL["Sites"]);
+	}
+
+	for (i=0;i<dataDimension;i=i+1)
+	{
+		blString * (","+tMap [i]);
+	}
+
+	if (Abs(_Genetic_Code)) /* have coding data */
+	{
+		BranchLengthsVector = ReturnVectorsOfCodonLengths (scalingStencils,"simulatedTree");
+		tv = BranchLengthsVector["Total"];
+		sv = BranchLengthsVector["Syn"];
+		nv = BranchLengthsVector["NonSyn"];
+		
+		for (i=0;i<branchTotalCount;i=i+1)
+		{
+			blString * (","+tv[i]+","+sv[i]+","+nv[i]);
+		}
+		
+	}
+	else
+	{
+		BranchLengthsVector = BranchLength (simulatedTree,-1);
+		for (i=0;i<branchTotalCount;i=i+1)
+		{
+			blString * (","+BranchLengthsVector[i]);
+		}
+	}
+	blString * 0;
+	fprintf (tabulatedFileName, blString);
+	/* end */
+
+	temp = simulatedResults[1][0];
+	dataMatrix[0][dataDimension]=dataMatrix[0][dataDimension]+temp;
+	dataMatrix[1][dataDimension]=dataMatrix[1][dataDimension]+temp*temp;
+	
+	return fromNode-1;
+}
diff --git a/res/TopologyInference/Exhaustive_Search b/res/TopologyInference/Exhaustive_Search
new file mode 100644
index 0000000..f55f320
--- /dev/null
+++ b/res/TopologyInference/Exhaustive_Search
@@ -0,0 +1,414 @@
+/* ____________________________________________*/
+
+function TreeMatrix2TreeString (levelIndex)
+{
+	treeString = "";
+	p = 0;
+	k = 0;
+	m = treeNodes[0][levelIndex+1];
+	n = treeNodes[0][levelIndex];
+
+	while (m)
+	{	
+		if (m>p)
+		{
+			if (p)
+			{
+				treeString = treeString+",";
+			}
+			for (j=p;j<m;j=j+1)
+			{
+				treeString = treeString+"(";
+			}
+		}
+		else
+		{
+			if (m<p)
+			{
+				for (j=m;j<p;j=j+1)
+				{
+					treeString = treeString+")";
+				}
+			}	
+			else
+			{
+				treeString = treeString+",";
+			}	
+		}
+		if (n<_NUMBER_OF_SEQUENCES)
+		{
+			GetString (nodeName, INFERENCE_DATA_SET, n);
+			treeString = treeString+nodeName;
+		}
+		k=k+1;
+		p=m;
+		n=treeNodes[k][levelIndex];
+		m=treeNodes[k][levelIndex+1];
+	}
+
+	for (j=m;j<p;j=j+1)
+	{
+		treeString = treeString+")";
+	}
+	
+	return treeString;
+}
+
+
+/* ____________________________________________*/
+
+function  _PrepareForTreeSearch (treesToBeSearched)
+{
+	bestTreesStash    = {10,2};
+	globalTreeCounter = 0;
+	treeStatistics    = {treesToBeSearched, 1};
+	for (ii=0; ii<10; ii=ii+1)
+	{
+		bestTreesStash [ii][1] = -1e100;
+		bestTreesStash [ii][0] = "";
+	}
+	return 1;
+}
+
+/* ____________________________________________*/
+
+function  _AddTreeToResults		(currentTreeString, currentLFValue)
+{
+	treeStatistics [globalTreeCounter][0] = currentLFValue;
+	globalTreeCounter = globalTreeCounter+1;
+	
+	for (ii = 0; ii<10; ii=ii+1)
+	{
+		if (currentLFValue>bestTreesStash[ii][1])
+		{
+			break;
+		}
+	}
+	if (ii<10)
+	{
+		for (ii2 = 8; ii2>=ii; ii2=ii2-1)
+		{
+			bestTreesStash [ii2+1][1] = bestTreesStash[ii2][1];
+			bestTreesStash [ii2+1][0] = bestTreesStash[ii2][0];
+		}
+		bestTreesStash [ii][0] = currentTreeString;
+		bestTreesStash [ii][1] = currentLFValue;
+	}
+	return 1;
+}
+
+/* ____________________________________________*/
+
+function  _ReportTreeStatistics		(currentLFValue)
+{
+	ii = 0;
+	fprintf (stdout, "\n\n**************************\n",
+					     "*     TREE REPORT	       *\n",
+					     "**************************\n\n");
+					     
+	fprintf (stdout, "\n#### BEST TREES #####\n\n");
+					     
+	for (ii=0; ii<10; ii = ii+1)
+	{
+		if (bestTreesStash[ii][1]==(-1e100))
+		{
+			break;
+		}
+		fprintf (stdout, ii+1, ").");
+		
+		if (ii>0)
+		{
+			fprintf (stdout, " Worse by: ", bestTreesStash[ii][1]-currentLFValue);
+		}
+		fprintf (stdout,"\n",  bestTreesStash[ii][0], "\nLog-likelihood = ", bestTreesStash[ii][1], "\n\n");
+	}
+	
+	fprintf (stdout, "\n#### STATISTICS #####\n\n");
+	
+	bestTreesStash [0][0] = 0.1;
+	bestTreesStash [1][0] = 0.5;
+	bestTreesStash [2][0] = 1;
+	bestTreesStash [3][0] = 5;
+	bestTreesStash [4][0] = 10;
+	bestTreesStash [5][0] = 50;
+	bestTreesStash [6][0] = 100;
+	bestTreesStash [7][0] = 1000;
+	bestTreesStash [8][0] = 10000;
+	bestTreesStash [9][0] = 1e100;
+
+	bestTreesStash [0][1] = 0;
+	bestTreesStash [1][1] = 0;
+	bestTreesStash [2][1] = 0;
+	bestTreesStash [3][1] = 0;
+	bestTreesStash [4][1] = 0;
+	bestTreesStash [5][1] = 0;
+	bestTreesStash [6][1] = 0;
+	bestTreesStash [7][1] = 0;
+	bestTreesStash [8][1] = 0;
+	bestTreesStash [9][1] = 0;
+	
+	probabilityOfTheData = 0;
+	
+	for (i=0; i<globalTreeCounter; i=i+1)
+	{
+		diff = currentLFValue-treeStatistics[i];
+		j = 0;
+		while (diff>bestTreesStash[j][0])
+		{
+			j=j+1;
+		}
+		bestTreesStash [j][1] = bestTreesStash [j][1] + 1;
+		probabilityOfTheData = probabilityOfTheData+Exp(-diff);
+	}
+	
+	bestTreesStash [0][1] = bestTreesStash [0][1]-1;
+	
+	ii = "+---------------+---------------+---------------+---------------+\n";
+	fprintf (stdout, "\n\n", ii, 
+							    "| From Best +   |  To Best +    |   Tree Count  |  % of total	  |\n",
+							 ii);
+	dataMatrix = {10,4};
+
+	for (i=0; i<10; i=i+1)
+	{	
+		if (i)
+		{
+			fprintf (stdout, "| " , Format (bestTreesStash [i-1][0],13,1));
+		}
+		else
+		{
+			fprintf (stdout, "|             0");
+		}
+		if (i<9)
+		{
+			fprintf (stdout, " | " , Format (bestTreesStash [i][0],13,1));
+		}
+		else
+		{
+			fprintf (stdout, " |      Infinity");
+		}		
+		fprintf (stdout, " | ", Format (bestTreesStash [i][1],13,0), " | ", Format (100*bestTreesStash [i][1]/globalTreeCounter,13,8), " |\n",ii); 
+		dataMatrix [i][0] = bestTreesStash [i][0];
+		if (dataMatrix[i][0] > 10000)
+		{
+			dataMatrix[i][0] = 100000;
+		}
+		dataMatrix [i][1] = Log(dataMatrix [i][0])/Log(10);
+		dataMatrix [i][2] = bestTreesStash [i][1];
+		dataMatrix [i][3] = 100*bestTreesStash [i][1]/globalTreeCounter;
+		
+	}
+	
+	fprintf (stdout, "\n\nPosterior probability of the best tree (with uninformative prior) = ",1./probabilityOfTheData,"\n\n");
+	
+	fprintf (stdout, "\n\n***********Save full tree statistics to a file (y/n)?");
+
+	fscanf  (stdin, "String", resp);
+
+	if ((resp!="n")&&(resp!="N"))
+	{
+		SetDialogPrompt ("Write tree stats string to:");
+		fprintf (PROMPT_FOR_FILE,CLEAR_FILE,treeStatistics);
+	}
+	treeStatistics = 0;
+	
+	
+
+	labelMatrix = {{"Delta", "Log_10 [Delta]","Trees In Interval","% of Trees In Interval"}};
+
+	OpenWindow (CHARTWINDOW,{{"Tree Statistics"}
+							   {"labelMatrix"}
+							   {"dataMatrix"}
+							   {"Step Plot"}
+							   {"Log_10 [Delta]"}
+							   {"Trees In Interval"}
+							   {""}
+							   {""}
+							   {""}
+							   {"3"}
+							   {""}},
+							   "SCREEN_HEIGHT-225;SCREEN_HEIGHT-50;40;50");
+
+	return 1;
+}
+
+/* ____________________________________________*/
+
+MESSAGE_LOGGING = 0;
+VERBOSITY_LEVEL = -1;
+
+treeNodes = {2*(_NUMBER_OF_SEQUENCES+1),2*(_NUMBER_OF_SEQUENCES-2)};
+
+cladesInfo = {_NUMBER_OF_SEQUENCES,2*(_NUMBER_OF_SEQUENCES-2)};
+
+branchIndex= {_NUMBER_OF_SEQUENCES-3,1};
+
+currentLevel = 0;
+
+done = false;
+
+i = 2*_NUMBER_OF_SEQUENCES-5;
+j = 1;
+while (i>1)
+{
+	j = j*i;
+	i = i-2;
+}
+
+dummy = _PrepareForTreeSearch (j);
+
+treeNodes[0][0]=0;
+treeNodes[0][1]=1;
+treeNodes[1][0]=1;
+treeNodes[1][1]=1;
+treeNodes[2][0]=2;
+treeNodes[2][1]=1;
+treeNodes[3][0]=_NUMBER_OF_SEQUENCES;
+treeNodes[3][1]=0;
+cladesInfo[0][0]=0;
+cladesInfo[0][1]=4;
+
+_all_sequence_matrix = {_NUMBER_OF_SEQUENCES,1};
+
+for (i=0; i<_NUMBER_OF_SEQUENCES; i=i+1)
+{
+	_all_sequence_matrix [i][0] = i;
+}
+
+bestTree ="";
+bestValue=-1e20;
+
+treeCounter 	  = 0;
+globalTreeCounter = 0;
+
+done = 0;
+
+while (!done)
+{
+	if (branchIndex[currentLevel]<2*currentLevel+3)
+	{
+		i = 0;
+		shift = 0;
+		j = 2*currentLevel;
+		k = j+2;
+		m = j+1;
+		while (treeNodes[i][m])
+		{
+			/*copy tree from prev level to this level */
+			if (i==branchIndex[currentLevel])
+			/*insert new branch*/
+			{
+				shift = 2;
+				if (treeNodes[i][j]<_NUMBER_OF_SEQUENCES)
+				/* simple branch */
+				{
+					treeNodes[i][k]=treeNodes[i][j];
+					treeNodes[i][k+1]=treeNodes[i][m]+1;
+					treeNodes[i+1][k]=currentLevel+3;
+					treeNodes[i+1][k+1]=treeNodes[i][m]+1;
+					treeNodes[i+2][k]=currentLevel+_NUMBER_OF_SEQUENCES+1;
+					treeNodes[i+2][k+1]=treeNodes[i][m];
+					cladesInfo[currentLevel+1][k] = i;
+					cladesInfo[currentLevel+1][k+1] = 3;					
+				}
+				else
+				{
+					/* update node depths for the entire clade now*/
+					l = treeNodes[i][j]-_NUMBER_OF_SEQUENCES;
+					s = cladesInfo[l][j];
+					for (p=s+cladesInfo[l][m]-1; p>=s; p=p-1)
+					{
+						treeNodes[i][k]=treeNodes[i][j];
+						treeNodes[i][k+1]=treeNodes[i][m]+1;						
+						i=i-1;
+					}
+					i=i+cladesInfo[l][m];
+					/* new clade record */
+					cladesInfo[currentLevel+1][k] = cladesInfo[l][j];
+					cladesInfo[currentLevel+1][k+1] = cladesInfo[l][m]+2;
+					/* now we need to insert two more nodes */
+					treeNodes[i+1][k]=currentLevel+3;
+					treeNodes[i+1][k+1]=treeNodes[i][m]+1;
+					treeNodes[i+2][k]=currentLevel+_NUMBER_OF_SEQUENCES+1;
+					treeNodes[i+2][k+1]=treeNodes[i][m];
+				}
+				for (p=0; p<=currentLevel; p=p+1)
+				{
+					if (cladesInfo[p][j]>i)
+					{
+						cladesInfo[p][k] = cladesInfo[p][j]+2;
+					}
+					else
+					{
+						cladesInfo[p][k] = cladesInfo[p][j];
+					}
+					
+					if ((cladesInfo[p][j]<=i)&&((cladesInfo[p][j]+cladesInfo[p][m])>i+1))
+					{
+						cladesInfo[p][k+1] = cladesInfo[p][m]+2;
+					}
+					else
+					{
+						cladesInfo[p][k+1] = cladesInfo[p][m];
+					}
+				}				
+			}
+			else
+			{
+				treeNodes[i+shift][k]=treeNodes[i][j];
+				treeNodes[i+shift][k+1]=treeNodes[i][m];
+			}
+			i = i+1;
+		}
+		treeNodes[i+2][k]=treeNodes[i][j];
+		treeNodes[i+2][k+1]=treeNodes[i][j+1];
+		if (currentLevel<_NUMBER_OF_SEQUENCES-4)
+		{
+			currentLevel = currentLevel+1;
+		}
+		else
+		{
+			thisTree = TreeMatrix2TreeString (2*(currentLevel+1));
+			branchIndex[currentLevel]=branchIndex[currentLevel]+1;
+			fprintf (stdout, "\nTree#",Format(treeCounter,0,0)," ", thisTree);
+			Tree    Inferred_Tree = thisTree;
+			
+			SpawnLikelihoodFunction ("_INF_LF_", "Inferred_Tree", INFERENCE_DATA_WINDOW,_all_sequence_matrix);
+			Optimize (res,_INF_LF_);
+			dummy = _AddTreeToResults (thisTree, res[1][0]);
+			if (res[1][0]>bestValue)
+			{
+				bestValue = res[1][0];
+				bestTree = thisTree;
+			}
+			fprintf (stdout, " ==> logLhd = ", res[1][0]);
+			treeCounter = treeCounter+1;
+		}
+	}
+	else
+	{
+		branchIndex[currentLevel]=0;
+		if (currentLevel==0)
+		{
+			done = 1;
+		}
+		else
+		{
+			currentLevel = currentLevel-1;
+			branchIndex[currentLevel]=branchIndex[currentLevel]+1;
+		}
+	}
+}
+
+fprintf (stdout,"\n\n --------------------- RESULTS --------------------- \n\n");
+
+fprintf (stdout,"\n\n BestTree =", bestTree);
+
+dummy = _ReportTreeStatistics (bestValue);
+
+Tree	Inferred_Tree = bestTree;
+
+SpawnLikelihoodFunction ("_INF_LF_", "Inferred_Tree", INFERENCE_DATA_WINDOW, _all_sequence_matrix);
+
+VERBOSITY_LEVEL = 0;
+
diff --git a/res/TopologyInference/Neighbor_Joining b/res/TopologyInference/Neighbor_Joining
new file mode 100644
index 0000000..9f71257
--- /dev/null
+++ b/res/TopologyInference/Neighbor_Joining
@@ -0,0 +1,161 @@
+/* ____________________________________________*/
+
+function TreeMatrix2TreeString (doLengths)
+{
+	treeString = "";
+	p = 0;
+	k = 0;
+	m = treeNodes[0][1];
+	n = treeNodes[0][0];
+	d = treeString*(Rows(treeNodes)*25);
+
+	while (m)
+	{	
+		if (m>p)
+		{
+			if (p)
+			{
+				d = treeString*",";
+			}
+			for (j=p;j<m;j=j+1)
+			{
+				d = treeString*"(";
+			}
+		}
+		else
+		{
+			if (m<p)
+			{
+				for (j=m;j<p;j=j+1)
+				{
+					d = treeString*")";
+				}
+			}	
+			else
+			{
+				d = treeString*",";
+			}	
+		}
+		if (n<_NUMBER_OF_SEQUENCES)
+		{
+			GetString (nodeName, INFERENCE_DATA_SET, n);
+			d = treeString*nodeName;
+		}
+		if (doLengths>.5)
+		{
+			nodeName = ":"+treeNodes[k][2];
+			d = treeString*nodeName;
+		}
+		k=k+1;
+		p=m;
+		n=treeNodes[k][0];
+		m=treeNodes[k][1];
+	}
+
+	for (j=m;j<p;j=j+1)
+	{
+		d = treeString*")";
+	}
+	
+	d=treeString*0;
+	return treeString;
+}
+
+/* ____________________________________________*/
+
+
+DataSetFilter filteredData = CreateFilter (INFERENCE_DATA_SET,1,"","");
+
+ChoiceList (methodIndex,"Negative Branch Lengths",1,SKIP_NONE,
+			"Keep Negative","Negative Branch Lengths are Allowed.",
+			"Force Zero","Negative Branch Lengths are Forced to 0.");			
+
+if (methodIndex < 0)
+{
+	return 0;
+}
+
+
+distanceMatrix = {_NUMBER_OF_SEQUENCES,_NUMBER_OF_SEQUENCES};
+
+DISTANCE_PROMPTS		= 1;
+ExecuteAFile			(HYPHY_LIB_DIRECTORY+"TemplateBatchFiles"+DIRECTORY_SEPARATOR+"chooseDistanceFormula.def");
+InitializeDistances		(0);
+DISTANCE_PROMPTS		= 0;
+
+for (i = 0; i<_NUMBER_OF_SEQUENCES; i=i+1)
+{
+	for (j = i+1; j<_NUMBER_OF_SEQUENCES; j = j+1)
+	{
+		distanceMatrix[i][j] = ComputeDistanceFormula (i,j);
+	}
+}
+
+MESSAGE_LOGGING 		 	= 1;
+cladesMade 					= 1;
+
+
+if (_NUMBER_OF_SEQUENCES == 2)
+{
+	d1 = distanceMatrix[0][1]/2;
+	treeNodes = {{0,1,d1__},
+				 {1,1,d1__},
+				 {2,0,0}};
+				 
+	cladesInfo = {{2,0}};
+}
+else
+{
+	if (_NUMBER_OF_SEQUENCES == 3)
+	{
+		d1 = (distanceMatrix[0][1]+distanceMatrix[0][2]-distanceMatrix[1][2])/2;
+		d2 = (distanceMatrix[0][1]-distanceMatrix[0][2]+distanceMatrix[1][2])/2;
+		d3 = (distanceMatrix[1][2]+distanceMatrix[0][2]-distanceMatrix[0][1])/2;
+		treeNodes = {{0,1,d1__},
+					 {1,1,d2__},
+					 {2,1,d3__}
+					 {3,0,0}};
+					 
+		cladesInfo = {{3,0}};		
+	}
+	else
+	{	
+		njm = (distanceMatrix > methodIndex)>=_NUMBER_OF_SEQUENCES;
+			
+		treeNodes 		= {2*(_NUMBER_OF_SEQUENCES+1),3};
+		cladesInfo	    = {_NUMBER_OF_SEQUENCES-1,2};
+		
+		for (i=Rows(treeNodes)-1; i>=0; i=i-1)
+		{
+			treeNodes[i][0] = njm[i][0];
+			treeNodes[i][1] = njm[i][1];
+			treeNodes[i][2] = njm[i][2];
+		}
+
+		for (i=Rows(cladesInfo)-1; i>=0; i=i-1)
+		{
+			cladesInfo[i][0] = njm[i][3];
+			cladesInfo[i][1] = njm[i][4];
+		}
+		
+		njm = 0;
+	}
+}
+
+distanceMatrix = 0;
+
+/* now with the treeNodes matrix ready we can convert it into a Newick string */
+
+treeString = TreeMatrix2TreeString (1);
+UseModel (USE_NO_MODEL);
+Tree Inferred_Tree = treeString; 
+
+_all_sequence_matrix = {_NUMBER_OF_SEQUENCES,1};
+
+for (i=0; i<_NUMBER_OF_SEQUENCES; i=i+1)
+{
+	_all_sequence_matrix [i][0] = i;
+}
+
+SpawnLikelihoodFunction ("_INF_LF_", "Inferred_Tree", INFERENCE_DATA_WINDOW, _all_sequence_matrix);
+
diff --git a/res/TopologyInference/Sequential_Addition b/res/TopologyInference/Sequential_Addition
new file mode 100644
index 0000000..b174ed7
--- /dev/null
+++ b/res/TopologyInference/Sequential_Addition
@@ -0,0 +1,636 @@
+
+function TreeMatrix2TreeString (levelIndex, doLengths)
+{
+	treeString = "";
+	_topRecP = 0;
+	k = 0;
+	m = treeNodes[0][levelIndex+1];
+	n = treeNodes[0][levelIndex];
+
+	while (m)
+	{	
+		if (m>_topRecP)
+		{
+			if (_topRecP)
+			{
+				treeString = treeString+",";
+			}
+			for (j=_topRecP;j<m;j=j+1)
+			{
+				treeString = treeString+"(";
+			}
+		}
+		else
+		{
+			if (m<_topRecP)
+			{
+				for (j=m;j<_topRecP;j=j+1)
+				{
+					treeString = treeString+")";
+				}
+			}	
+			else
+			{
+				treeString = treeString+",";
+			}	
+		}
+		if (n<_NUMBER_OF_SEQUENCES)
+		{
+			GetString (nodeName, INFERENCE_DATA_SET, n);
+			treeString = treeString+nodeName;
+		}
+		if (doLengths>.5)
+		{
+			treeString = treeString+":"+treeNodes[k][levelIndex+2];
+		}
+		k=k+1;
+		_topRecP=m;
+		n=treeNodes[k][levelIndex];
+		m=treeNodes[k][levelIndex+1];
+	}
+
+	for (j=m;j<_topRecP;j=j+1)
+	{
+		treeString = treeString+")";
+	}
+	
+	return treeString;
+}
+
+ChoiceList (globalParametersOption,"Shared Parameters",1,SKIP_NONE,
+			"Estimate every time","Estimate all model parameters for each tree.",
+			"Estimates based on NJ tree","Start with a neighbor joining tree, estimate all global parameters based on it, then hold them constant for the rest of the search.");
+
+if (globalParametersOption<0)
+{
+	return;
+}
+
+if (globalParametersOption == 1)
+{
+	DataSetFilter filteredData = CreateFilter (INFERENCE_DATA_SET,1,"","");
+	ChoiceList (methodIndex,"Negative Branch Lengths",1,SKIP_NONE,
+				"Keep Negative","Negative Branch Lengths are Allowed.",
+				"Force Zero","Negative Branch Lengths are Forced to 0.");			
+	
+	if (methodIndex < 0)
+	{
+		return 0;
+	}
+	
+	
+	distanceMatrix = {_NUMBER_OF_SEQUENCES,_NUMBER_OF_SEQUENCES};
+	
+	DISTANCE_PROMPTS = 1;
+	incFileName = HYPHY_LIB_DIRECTORY+"TemplateBatchFiles"+DIRECTORY_SEPARATOR+"chooseDistanceFormula.def";
+	ExecuteCommands  ("#include \""+incFileName+"\";");
+	InitializeDistances (0);
+	DISTANCE_PROMPTS = 0;
+	
+	for (i = 0; i<_NUMBER_OF_SEQUENCES; i=i+1)
+	{
+		for (j = i+1; j<_NUMBER_OF_SEQUENCES; j = j+1)
+		{
+			distanceMatrix[i][j] = ComputeDistanceFormula (i,j);
+		}
+	}
+	
+	MESSAGE_LOGGING 		 	= 1;
+	cladesMade 					= 1;
+	
+	
+	if (_NUMBER_OF_SEQUENCES == 2)
+	{
+		d1 = distanceMatrix[0][1]/2;
+		treeNodes = {{0,1,d1__},
+					 {1,1,d1__},
+					 {2,0,0}};
+					 
+		cladesInfo = {{2,0}};
+	}
+	else
+	{
+		if (_NUMBER_OF_SEQUENCES == 3)
+		{
+			d1 = (distanceMatrix[0][1]+distanceMatrix[0][2]-distanceMatrix[1][2])/2;
+			d2 = (distanceMatrix[0][1]-distanceMatrix[0][2]+distanceMatrix[1][2])/2;
+			d3 = (distanceMatrix[1][2]+distanceMatrix[0][2]-distanceMatrix[0][1])/2;
+			treeNodes = {{0,1,d1__},
+						 {1,1,d2__},
+						 {2,1,d3__}
+						 {3,0,0}};
+						 
+			cladesInfo = {{3,0}};		
+		}
+		else
+		{	
+			njm = (distanceMatrix > methodIndex)>=_NUMBER_OF_SEQUENCES;
+				
+			treeNodes 		= {2*(_NUMBER_OF_SEQUENCES+1),3};
+			cladesInfo	    = {_NUMBER_OF_SEQUENCES-1,2};
+			
+			for (i=Rows(treeNodes)-1; i>=0; i=i-1)
+			{
+				treeNodes[i][0] = njm[i][0];
+				treeNodes[i][1] = njm[i][1];
+				treeNodes[i][2] = njm[i][2];
+			}
+	
+			for (i=Rows(cladesInfo)-1; i>=0; i=i-1)
+			{
+				cladesInfo[i][0] = njm[i][3];
+				cladesInfo[i][1] = njm[i][4];
+			}
+			
+			njm = 0;
+		}
+	}
+	
+	distanceMatrix = 0;
+	
+	/* now with the treeNodes matrix ready we can convert it into a Newick string */
+	
+	treeString = TreeMatrix2TreeString (0,1);
+	UseModel (USE_NO_MODEL);
+	Tree Inferred_Tree = treeString; 
+	
+	_all_sequence_matrix = {_NUMBER_OF_SEQUENCES,1};
+	
+	for (i=0; i<_NUMBER_OF_SEQUENCES; i=i+1)
+	{
+		_all_sequence_matrix [i][0] = i;
+	}
+	
+	SpawnLikelihoodFunction ("_INF_LF_", "Inferred_Tree", INFERENCE_DATA_WINDOW, _all_sequence_matrix);
+	Optimize (res,_INF_LF_);
+	GetString (_gvc,_INF_LF_,-1);
+	_gvc = _gvc ["Global Independent"];
+	_cString = "";
+	for (i=0; i<Columns (_gvc); i=i+1)
+	{
+		ExecuteCommands ("cv = " + _gvc[i]);
+		_cString = _cString + (_gvc[i] + ":=" + cv +";");
+	}
+}
+
+#include "Support/branchSwappingFunctions.bf";
+
+MESSAGE_LOGGING = 0;
+twHasBeenOpened = 0;
+
+ChoiceList (randomOption,"Addition Order",1,SKIP_NONE,
+			"Given Order","The sequences will be added in the order they appear in the data file.",
+			"Random Order","The order of addition will be random.");
+
+
+if (randomOption<0)
+{
+	return;
+}
+
+ChoiceList (doNNIOption,"Branch Swapping",1,SKIP_NONE,
+			"No Swapping","No branch swapping is performed.",
+			"Complete NNI","Nearest neighbor interchange is performed after EACH sequence is added. Order (sequences)^2 additional trees are examined.",
+			"Complete SPR","Subtree pruning and regrafting is performed after EACH sequence is added. Order (sequences)^3 additional trees are examined.",
+			"Global NNI","Nearest neighbor interchange is performed after ALL the sequences have been added. Order (sequences)^1 additional trees are examined.",
+			"Global SPR","Subtree pruning and regrafting is performed after ALL the sequences have been added. Order (sequences)^2 additional trees are examined.",
+			"NNI+SPR","Nearest neighbor interchange is performed after EACH sequence is added. Subtree pruning and regrafting performed on the final tree. Order (sequences)^2 additional trees are examined.");
+
+
+if (doNNIOption<0)
+{
+	return;
+}
+
+if (doNNIOption == 1)
+{
+	nniPeriod = 0;
+	while (nniPeriod <= 0)
+	{
+		fprintf (stdout, "\nDo NNI every time this many branches are added (>=1):");
+		fscanf  (stdin, "Number", nniPeriod);
+	}
+}
+
+ChoiceList (methodIndex,"Starting 3 taxa tree",1,SKIP_NONE,
+			"First 3","The starting 3 taxa tree will comprise first 3 taxa from the data file.",
+			"Choose 3","User selects 3 taxa for the starting 3 taxa tree.",
+			"Best 3","The starting 3 taxa tree will be chosen by selecting the ML estimation among all possible 3 taxa trees. Warning: there are O(n^3) 3 taxa trees for n sequences.",
+			"Random","Select 3 random starting sequences.");
+
+/* begin by selecting the best 3-taxa tree */
+if (methodIndex<0)
+{
+	return;
+}
+
+first3Taxa = {3,1};
+
+if (methodIndex == 0)
+{
+	first3Taxa[0]=0;
+	first3Taxa[1]=1;
+	first3Taxa[2]=2;
+}
+
+if (methodIndex == 1)
+{
+	ChoiceList (first3Taxa, "Choose 3 taxa for the starting tree:",3,SKIP_NONE,INFERENCE_DATA_SET);
+	if (first3Taxa[0]<0)
+	{
+		return ;
+	}
+}
+
+
+
+function InferTreeTopology (verbFlag)
+{
+	saveVL			= VERBOSITY_LEVEL;
+	VERBOSITY_LEVEL = -1;
+	if (_NUMBER_OF_SEQUENCES <= 3)
+	{
+		fprintf (stdout, "Input file contained 3 or fewer sequences - not much inference to be done!\n");
+		return 0;
+	}
+	if (randomOption==1)
+	/* randomize sequence order */
+	{
+		treeNodes  = {_NUMBER_OF_SEQUENCES,1};
+		cladesInfo = {_NUMBER_OF_SEQUENCES,1};
+		
+		for (currentTaxon=0; currentTaxon < _NUMBER_OF_SEQUENCES; currentTaxon = currentTaxon+1)
+		{
+			cladesInfo [currentTaxon] = currentTaxon;	
+		}
+		
+		currentTaxon = _NUMBER_OF_SEQUENCES-1;
+		
+		while (currentTaxon>=0)
+		{
+			_topRecI = Random (0,currentTaxon+1) $ 1;
+			shift = 0;
+			for (_topRecS = 0; _topRecS<_NUMBER_OF_SEQUENCES; _topRecS=_topRecS+1)
+			{
+				if (cladesInfo[_topRecS]>=0)
+				{
+					shift = shift+1;
+				}
+				if (_topRecI == shift - 1)
+				{
+					treeNodes[_NUMBER_OF_SEQUENCES-1-currentTaxon] = cladesInfo[_topRecS];
+					cladesInfo [_topRecS] = -1;
+					break;
+				}
+			}
+			currentTaxon = currentTaxon - 1;
+		}
+		
+		/*reshuffledOrder = "";
+		for (currentTaxon = 0; currentTaxon < _NUMBER_OF_SEQUENCES-1; currentTaxon = currentTaxon+1)
+		{
+			reshuffledOrder = reshuffledOrder + treeNodes[currentTaxon] + ",";
+		}
+		reshuffledOrder = reshuffledOrder + treeNodes[currentTaxon];*/
+		
+		if (verbFlag)
+		{
+			fprintf (stdout,"\n\t Sequence order randomized as follows:\n");
+			for (currentTaxon = 0; currentTaxon < _NUMBER_OF_SEQUENCES; currentTaxon = currentTaxon+1)
+			{
+				GetString (nodeName, INFERENCE_DATA_SET, treeNodes[currentTaxon]);
+				fprintf (stdout,nodeName,"\n");
+			}
+			fprintf (stdout,"\n");
+		}
+		
+				
+		additionOrder = treeNodes;
+		if (methodIndex == 0)
+		{
+			first3Taxa[0] = additionOrder[0];
+			first3Taxa[1] = additionOrder[1];
+			first3Taxa[2] = additionOrder[2];
+		}
+	}
+	else
+	{
+		additionOrder = {_NUMBER_OF_SEQUENCES,1};
+		for (currentTaxon = 0; currentTaxon < _NUMBER_OF_SEQUENCES; currentTaxon = currentTaxon+1)
+		{
+			additionOrder [currentTaxon] = currentTaxon;
+		}
+	}
+
+	treeNodes 		= {2*(_NUMBER_OF_SEQUENCES+1),4};
+	bestTreeNodes 	= {2*(_NUMBER_OF_SEQUENCES+1),2};
+
+	cladesInfo 	    = {_NUMBER_OF_SEQUENCES,4};
+	bestCladesInfo  = {_NUMBER_OF_SEQUENCES,2};
+
+	currentTaxon = 0;
+
+	treeNodes[0][0]=0;
+	treeNodes[0][1]=1;
+	treeNodes[1][0]=1;
+	treeNodes[1][1]=1;
+	treeNodes[2][0]=2;
+	treeNodes[2][1]=1;
+	treeNodes[3][0]=_NUMBER_OF_SEQUENCES;
+	treeNodes[3][1]=0;
+	cladesInfo[0][0]=0;
+	cladesInfo[0][1]=4;
+
+	bestTree="";
+	bestValue=-1e20;
+
+
+	sulr = USE_LAST_RESULTS;
+
+	USE_LAST_RESULTS = 1;
+
+	if (methodIndex == 2)
+	{
+		if (verbFlag)
+		{
+			fprintf (stdout, "\nSTEP 0). Searching for the best 3 taxa tree.");
+			fprintf (stdout, "\n\t", Format (_NUMBER_OF_SEQUENCES*(_NUMBER_OF_SEQUENCES-1)*(_NUMBER_OF_SEQUENCES-2)/6,0,0)," trees will be examined.\n");
+		}
+		for (_topRecI=0; _topRecI<_NUMBER_OF_SEQUENCES-2; _topRecI=_topRecI+1)
+		{
+			for (_topRecS=_topRecI+1;_topRecS<_NUMBER_OF_SEQUENCES-1;_topRecS=_topRecS+1)
+			{
+				for (shift=_topRecS+1;shift<_NUMBER_OF_SEQUENCES; shift=shift+1)
+				{
+					treeNodes[0][0]=_topRecI;
+					treeNodes[0][1]=1;
+					treeNodes[1][0]=_topRecS;
+					treeNodes[1][1]=1;
+					treeNodes[2][0]=shift;
+					treeNodes[2][1]=1;		
+					thisTree = TreeMatrix2TreeString (0,0);
+					Tree    Inferred_Tree = thisTree;
+					
+					_subset_to_filter = {{_topRecI}{_topRecS}{shift}};
+					
+					SpawnLikelihoodFunction ("_INF_LF_", "Inferred_Tree", INFERENCE_DATA_WINDOW, _subset_to_filter);
+					if (globalParametersOption && Abs(_cString))
+					{	
+						ExecuteCommands (_cString);	
+					}
+					Optimize (res,_INF_LF_);
+					
+					if (res[1][0]>bestValue+OPTIMIZATION_PRECISION)
+					{
+						first3Taxa[0]=_topRecI;
+						first3Taxa[1]=_topRecS;
+						first3Taxa[2]=shift;
+						
+						bestValue = res[1][0];
+						bestTree = thisTree;
+					}
+				}
+			}
+		}
+
+		if (verbFlag)
+		{
+			fprintf (stdout,"\n\t Best 3 taxa tree is ", bestTree, " with log likelihood of ", bestValue);
+		}
+	}
+	else
+	{
+		if (methodIndex == 3)
+		{
+			first3Taxa[0] = Random (0,_NUMBER_OF_SEQUENCES) $ 1;
+			first3Taxa[1] = first3Taxa[0];
+			while (first3Taxa[1] == first3Taxa[0])
+			{
+				first3Taxa[1] = Random (0,_NUMBER_OF_SEQUENCES) $ 1;
+			}
+			first3Taxa[2] = first3Taxa[0];
+			while ((first3Taxa[2] == first3Taxa[0])||(first3Taxa[2] == first3Taxa[1]))
+			{
+				first3Taxa[2] = Random (0,_NUMBER_OF_SEQUENCES) $ 1;
+			}
+			if (verbFlag)
+			{
+				fprintf (stdout,"\n\t Random 3 taxa tree selected: (");
+				for (currentTaxon = 0; currentTaxon < 3; currentTaxon = currentTaxon+1)
+				{
+					GetString (nodeName, INFERENCE_DATA_SET, first3Taxa[currentTaxon]);
+					fprintf (stdout,nodeName);
+					if (currentTaxon<2)
+					{
+						fprintf (stdout, ",");
+					}
+				}
+				fprintf (stdout,")\n");
+			}
+		}
+	}
+
+	treeNodes[0][0]=first3Taxa[0];
+	treeNodes[1][0]=first3Taxa[1];
+	treeNodes[2][0]=first3Taxa[2];
+
+	currentTaxon = 0;
+	taxonCounter = 3;
+	
+	_subset_to_filter = {{first3Taxa[0]}{first3Taxa[1]}{first3Taxa[2]}};
+
+	while (currentTaxon<_NUMBER_OF_SEQUENCES)
+	{
+		taxonIndex = additionOrder [currentTaxon];
+		/* decide which taxon will be added next */
+		if ((taxonIndex!=first3Taxa[0])&&(taxonIndex!=first3Taxa[1])&&(taxonIndex!=first3Taxa[2]))
+		{
+			GetString (nodeName, INFERENCE_DATA_SET, taxonIndex);
+			
+			if (verbFlag)
+			{
+				fprintf (stdout, "\n\n\nSTEP ",Format(taxonCounter-2,0,0),"/",Format(_NUMBER_OF_SEQUENCES-3,0,0),"). Adding taxon:", nodeName);
+			}
+			/* attempt to insert this taxon into current tree */
+			/* produce a new data set filter */
+			
+			_swp_mx = _subset_to_filter;
+			
+			_subset_to_filter = {Rows (_swp_mx)+1,1};
+			
+			for (mx_counter = 0; mx_counter < Rows (_swp_mx); mx_counter = mx_counter + 1)
+			{	
+				_subset_to_filter [mx_counter] = _swp_mx [mx_counter];
+			}
+			
+			_subset_to_filter [mx_counter] = taxonIndex;
+
+			bestValue=-1e20;
+			for (t_node=0; t_node<2*taxonCounter-3; t_node=t_node+1)
+			/* loop over all branches */
+			{	
+				_topRecI = 0;
+				shift = 0;
+				while (treeNodes[_topRecI][1])
+				{
+					if (_topRecI==t_node)
+					{
+						currentLevel = taxonCounter-3;
+						shift = 2;
+						if (treeNodes[_topRecI][0]<_NUMBER_OF_SEQUENCES)
+						/* simple branch */
+						{
+							treeNodes[_topRecI][2]=treeNodes[_topRecI][0];
+							treeNodes[_topRecI][3]=treeNodes[_topRecI][1]+1;
+							treeNodes[_topRecI+1][2]=taxonIndex;
+							treeNodes[_topRecI+1][3]=treeNodes[_topRecI][1]+1;
+							treeNodes[_topRecI+2][2]= taxonCounter+ _NUMBER_OF_SEQUENCES-3;
+							treeNodes[_topRecI+2][3]=treeNodes[_topRecI][1];
+							cladesInfo[currentLevel][2] = _topRecI;
+							cladesInfo[currentLevel][3] = 3;					
+						}
+						else
+						{
+							/* update node depths for the entire clade now*/
+							_topRecL = treeNodes[_topRecI][0]-_NUMBER_OF_SEQUENCES;
+							_topRecS = cladesInfo[_topRecL][0];
+							/*fprintf (stdout,"\n",_topRecI," ",cladesInfo[_topRecL][1],treeNodes, cladesInfo,"\n");*/
+							for (_topRecP=_topRecS+cladesInfo[_topRecL][1]-1; _topRecP>=_topRecS; _topRecP=_topRecP-1)
+							{
+								treeNodes[_topRecI][2]=treeNodes[_topRecI][0];
+								treeNodes[_topRecI][3]=treeNodes[_topRecI][1]+1;						
+								_topRecI=_topRecI-1;
+							}
+							_topRecI=_topRecI+cladesInfo[_topRecL][1];
+							/* new clade record */
+							cladesInfo[currentLevel][2] = cladesInfo[_topRecL][0];
+							cladesInfo[currentLevel][3] = cladesInfo[_topRecL][1]+2;
+							/* now we need to insert two more nodes */
+							treeNodes[_topRecI+1][2]=taxonIndex;
+							treeNodes[_topRecI+1][3]=treeNodes[_topRecI][1]+1;
+							treeNodes[_topRecI+2][2]=currentLevel+_NUMBER_OF_SEQUENCES;
+							treeNodes[_topRecI+2][3]=treeNodes[_topRecI][1];
+						}
+						for (_topRecP=0; _topRecP<currentLevel; _topRecP=_topRecP+1)
+						{
+							if (cladesInfo[_topRecP][0]>_topRecI)
+							{
+								cladesInfo[_topRecP][2] = cladesInfo[_topRecP][0]+2;
+							}
+							else
+							{
+								cladesInfo[_topRecP][2] = cladesInfo[_topRecP][0];
+							}
+							
+							if ((cladesInfo[_topRecP][0]<=_topRecI)&&((cladesInfo[_topRecP][0]+cladesInfo[_topRecP][1])>_topRecI+1))
+							{
+								cladesInfo[_topRecP][3] = cladesInfo[_topRecP][1]+2;
+							}
+							else
+							{
+								cladesInfo[_topRecP][3] = cladesInfo[_topRecP][1];
+							}
+						}				
+					}
+					else
+					{
+						treeNodes[_topRecI+shift][2]=treeNodes[_topRecI][0];
+						treeNodes[_topRecI+shift][3]=treeNodes[_topRecI][1];
+					}
+					_topRecI = _topRecI+1;
+				}
+				
+				treeNodes[_topRecI+2][2]=treeNodes[_topRecI][0];
+				treeNodes[_topRecI+2][3]=treeNodes[_topRecI][1];
+				
+				thisTree = TreeMatrix2TreeString (2,0);
+				
+				if (verbFlag)
+				{
+					fprintf (stdout, "\n\tTree ",thisTree);
+				}
+				Tree    Inferred_Tree = thisTree;
+
+				SpawnLikelihoodFunction ("_INF_LF_", "Inferred_Tree", INFERENCE_DATA_WINDOW, _subset_to_filter);
+				if (globalParametersOption && Abs(_cString))
+				{	
+					ExecuteCommands (_cString);	
+				}
+				Optimize (res,_INF_LF_);
+
+				if (res[1][0]>bestValue+OPTIMIZATION_PRECISION)
+				{
+					bestValue = res[1][0];
+					bestTree = thisTree;
+					for (_topRecL=2*taxonCounter-2;_topRecL>=0;_topRecL=_topRecL-1)
+					{
+						bestTreeNodes[_topRecL][0]=treeNodes[_topRecL][2];
+						bestTreeNodes[_topRecL][1]=treeNodes[_topRecL][3];
+					}
+					for (_topRecL=0; _topRecL<taxonCounter-2; _topRecL=_topRecL+1)
+					{
+						bestCladesInfo[_topRecL][0]=cladesInfo[_topRecL][2];
+						bestCladesInfo[_topRecL][1]=cladesInfo[_topRecL][3];
+					}
+				}
+				if (verbFlag)
+				{
+					fprintf (stdout, " => ", res[1][0]);
+				}
+			}
+			for (_topRecL=2*taxonCounter-2;_topRecL>=0;_topRecL=_topRecL-1)
+			{
+				treeNodes[_topRecL][0]=bestTreeNodes[_topRecL][0];
+				treeNodes[_topRecL][1]=bestTreeNodes[_topRecL][1];
+			}
+			for (_topRecL=0; _topRecL<taxonCounter-2; _topRecL=_topRecL+1)
+			{
+				cladesInfo[_topRecL][0]=bestCladesInfo[_topRecL][0];
+				cladesInfo[_topRecL][1]=bestCladesInfo[_topRecL][1];
+			}
+			if (verbFlag)
+			{
+				fprintf (stdout,"\n\n\t Best ", Format(taxonCounter+1,0,0)," taxa tree is ", bestTree, " with log likelihood of ", bestValue);
+			}
+			if (((doNNIOption<=2)||((doNNIOption>2)&&(taxonCounter==_NUMBER_OF_SEQUENCES-1)))&&(taxonCounter>3)&&(doNNIOption)||(doNNIOption==5))
+			{
+				starDecomposition = 0;
+				if ((doNNIOption==1)||(doNNIOption==3)||((doNNIOption==5)&&(taxonCounter<_NUMBER_OF_SEQUENCES-1)))
+				/* NNI */
+				{
+					if (((doNNIOption==1 && (taxonCounter-2)%nniPeriod && taxonCounter<_NUMBER_OF_SEQUENCES-1))==0)
+					{
+						#include "Support/doNNISwap.bf";
+					}
+				}
+				else
+				/* SPR */
+				{
+					#include "Support/doSPRSwap.bf";
+				}
+			}
+			taxonCounter = taxonCounter+1;
+		}
+		currentTaxon = currentTaxon+1;
+	}
+	USE_LAST_RESULTS	= sulr;
+	VERBOSITY_LEVEL		= saveVL;
+	return 1.0;
+}
+
+_topRecL = InferTreeTopology (1.0);
+
+if (_topRecL)
+{
+	Tree	Inferred_Tree = bestTree;
+	SpawnLikelihoodFunction ("_INF_LF_", "Inferred_Tree", INFERENCE_DATA_WINDOW, _subset_to_filter);
+
+	saveTreeNodes = {2*(_NUMBER_OF_SEQUENCES+1),3};
+	for (_topRecI=2*_NUMBER_OF_SEQUENCES+1;_topRecI>=0;_topRecI=_topRecI-1)
+	{
+		saveTreeNodes[_topRecI][0] = bestTreeNodes[_topRecI][0];
+		saveTreeNodes[_topRecI][1] = bestTreeNodes[_topRecI][1];
+	}
+}
+
+
diff --git a/res/TopologyInference/Star_Decomposition b/res/TopologyInference/Star_Decomposition
new file mode 100644
index 0000000..251ee4e
--- /dev/null
+++ b/res/TopologyInference/Star_Decomposition
@@ -0,0 +1,555 @@
+MESSAGE_LOGGING = 0;
+
+#include "Support/branchSwappingFunctions.bf";
+
+function TreeMatrix2TreeString (levelIndex, doLengths)
+{
+	treeString = "";
+	_topRecP = 0;
+	_topRecK = 0;
+	_topRecM = treeNodes[0][levelIndex+1];
+	_topRecN = treeNodes[0][levelIndex];
+
+	while (_topRecM)
+	{	
+		if (_topRecM>_topRecP)
+		{
+			if (_topRecP)
+			{
+				treeString = treeString+",";
+			}
+			for (_topRecJ=_topRecP;_topRecJ<_topRecM;_topRecJ=_topRecJ+1)
+			{
+				treeString = treeString+"(";
+			}
+		}
+		else
+		{
+			if (_topRecM<_topRecP)
+			{
+				for (_topRecJ=_topRecM;_topRecJ<_topRecP;_topRecJ=_topRecJ+1)
+				{
+					treeString = treeString+")";
+				}
+			}	
+			else
+			{
+				treeString = treeString+",";
+			}	
+		}
+		if (_topRecN<_NUMBER_OF_SEQUENCES)
+		{
+			GetString (nodeName, INFERENCE_DATA_SET, _topRecN);
+			treeString = treeString+nodeName;
+		}
+		if (doLengths>.5)
+		{
+			treeString = treeString+":"+treeNodes[_topRecK][levelIndex+2];
+		}
+		_topRecK=_topRecK+1;
+		_topRecP=_topRecM;
+		_topRecN=treeNodes[_topRecK][levelIndex];
+		_topRecM=treeNodes[_topRecK][levelIndex+1];
+	}
+
+	for (_topRecJ=_topRecM;_topRecJ<_topRecP;_topRecJ=_topRecJ+1)
+	{
+		treeString = treeString+")";
+	}
+	
+	return treeString;
+}
+
+ChoiceList (doNNIOption,"Branch Swapping",1,SKIP_NONE,
+			"No Swapping","No branch swapping is performed.",
+			"Global NNI","Nearest neighbor interchange is performed after ALL the sequences have been added. Order (sequences)^1 additional trees are examined.",
+			"Global SPR","Subtree pruning and regrafting is performed after ALL the sequences have been added. Order (sequences)^2 additional trees are examined.");
+
+if (doNNIOption<0)
+{
+	return;
+}
+
+function InferTreeTopology (verbFlag)
+{
+	treeNodes = {2*(_NUMBER_OF_SEQUENCES+1),4};
+	/* stores previous best tree in columns 0 and 1, and current working tree in columns 2,3 */
+	bestTreeNodes = {2*(_NUMBER_OF_SEQUENCES+1),2};
+	/* holder for current best tree */
+
+	cladesInfo = {_NUMBER_OF_SEQUENCES,4};
+	/* stores previous best tree clade info in columns 0 and 1, and current working tree clade info in columns 2,3 */
+	bestCladesInfo = {_NUMBER_OF_SEQUENCES,2};
+	/* holder for current best tree */
+
+	eligibleNodesCount = _NUMBER_OF_SEQUENCES;
+	eligibleNodes = {_NUMBER_OF_SEQUENCES,1};
+
+	done = false;
+
+	for (_topRecK=0; _topRecK<_NUMBER_OF_SEQUENCES; _topRecK=_topRecK+1)
+	{
+		treeNodes[_topRecK][0] = _topRecK;
+		treeNodes[_topRecK][1] = 1;
+		eligibleNodes[_topRecK] = _topRecK;
+	}
+
+	treeNodes[_NUMBER_OF_SEQUENCES][0] = _NUMBER_OF_SEQUENCES;
+	treeNodes[_NUMBER_OF_SEQUENCES][1] = 0;
+
+	cladesInfo[0][0]=0;
+	cladesInfo[0][1]=_NUMBER_OF_SEQUENCES+1;
+
+	bestTree="";
+	bestValue=-1e20;
+
+	currentTaxon = 0;
+	taxonCounter = 3;
+	cladesCount = 1;
+
+	while (eligibleNodesCount>3)
+	{
+		bestNode1 = 0;
+		bestNode2 = 0;
+		/* stores the nodes which will be grouped at this stage */
+		
+		if (verbFlag)
+		{
+			fprintf (stdout, "\n\n\nSTEP ",Format(_NUMBER_OF_SEQUENCES-eligibleNodesCount+1,0,0),"/",Format(_NUMBER_OF_SEQUENCES-3,0,0),"). ");
+		}
+		bestValue=-1e20;
+		if (eligibleNodesCount>4)
+		{
+			loop1 = 0;
+			if (verbFlag)
+			{
+				fprintf (stdout, Format((eligibleNodesCount-1)*eligibleNodesCount/2,0,0), " trees for this step.\n");
+			}
+		}
+		else
+		{
+			loop1 = 1;
+			if (verbFlag)
+			{
+				fprintf (stdout, Format(3,0,0), " trees for this step.\n");
+			}
+		}
+		for (; loop1 < eligibleNodesCount-1; loop1 = loop1+1)
+		{
+			for (loop2 = loop1+1; loop2 < eligibleNodesCount; loop2 = loop2+1)
+			{
+				_topRecN = eligibleNodes[loop1];
+				_topRecM = eligibleNodes[loop2];
+				
+				/* 3 cases to consider */
+				/* first - see what happens when both nodes grouped are leaves */
+				if ((_topRecN<_NUMBER_OF_SEQUENCES)&&(_topRecM<_NUMBER_OF_SEQUENCES))
+				{
+					/* a few things to do here:
+					   copy all nodes from the old tree to the new tree excluding the two being added
+					   add a new clade at the end of the tree
+					   update clade lengths of the original tree
+					*/
+					_topRecI=0;
+					shift = 0;
+					/* copying nodes other than _topRecN and _topRecM */
+					while (treeNodes[_topRecI][1])
+					{
+						_topRecP = treeNodes[_topRecI][0];
+						if ((_topRecP!=_topRecM)&&(_topRecP!=_topRecN))
+						{
+							treeNodes[_topRecI-shift][2]=treeNodes[_topRecI][0];
+							treeNodes[_topRecI-shift][3]=treeNodes[_topRecI][1];
+						}
+						else
+						{
+							shift = shift+1;
+						}
+						_topRecI = _topRecI+1;
+					}
+					
+					_topRecI = _topRecI-2;
+					treeNodes[_topRecI][2]=_topRecM;
+					treeNodes[_topRecI][3]=2;
+					_topRecI = _topRecI+1;
+					treeNodes[_topRecI][2]=_topRecN;
+					treeNodes[_topRecI][3]=2;
+					_topRecI = _topRecI+1;
+					treeNodes[_topRecI][2]=cladesCount+_NUMBER_OF_SEQUENCES;
+					treeNodes[_topRecI][3]=1;
+					_topRecI = _topRecI+1;
+					treeNodes[_topRecI][2]=treeNodes[_topRecI-1][0];
+					treeNodes[_topRecI][3]=treeNodes[_topRecI-1][1];
+					
+					cladesInfo[cladesCount][2] = _topRecI-3;
+					cladesInfo[cladesCount][3] = 3;
+					
+					/* copy all clades - all existing clades will have their tree positions shifted by 2 to the left, except
+					   for the "global clade", _topRecI.e the entire tree.*/
+					   
+					cladesInfo[0][2] = cladesInfo[0][0];
+					cladesInfo[0][3] = cladesInfo[0][1]+1;
+					
+					_topRecI = 1;
+					while (cladesInfo[_topRecI][1])
+					{
+						cladesInfo[_topRecI][2] = cladesInfo[_topRecI][0]-2;
+						cladesInfo[_topRecI][3] = cladesInfo[_topRecI][1];
+						_topRecI = _topRecI+1;
+					}				
+				}
+				else
+				{
+					if ((_topRecN<_NUMBER_OF_SEQUENCES)||(_topRecM<_NUMBER_OF_SEQUENCES))
+					{
+						/* one node is a leaf, and the other one is "proper" clade */
+						/* arrage so that _topRecN is the leaf */
+						if (_topRecM<_topRecN)
+						{
+							_topRecI=_topRecM;
+							_topRecM=_topRecN;
+							_topRecN=_topRecI;
+						}
+						/* again - a few things to do 
+						   copy the tree except for the leaf, which is added at the end of the existing clade
+						   shift clade info if necessary
+						*/
+						_topRecM = _topRecM-_NUMBER_OF_SEQUENCES;
+						_topRecI=0;
+						shift = 0;
+						_topRecJ = 0;
+						_topRecS = cladesInfo[_topRecM][0]+cladesInfo[_topRecM][1];
+						_topRecT = cladesInfo[_topRecM][0];
+						/* copying nodes other than _topRecN, adding leaf at the end of the clade*/
+						while (1)
+						{
+							_topRecP = treeNodes[_topRecI][0];
+							if (_topRecP==_topRecN)
+							{
+								shift = -1;
+							}
+							else
+							{	
+								if (_topRecI==_topRecS)
+								/* insert new node and new clade*/
+								{
+									treeNodes[_topRecI-1][2] = _topRecN;
+									treeNodes[_topRecI-1][3] = 2;
+									treeNodes[_topRecI][2] = cladesCount+_NUMBER_OF_SEQUENCES;
+									treeNodes[_topRecI][3] = 1;
+									cladesInfo[cladesCount][2] = cladesInfo[_topRecM][0]-1;
+									cladesInfo[cladesCount][3] = cladesInfo[_topRecM][1]+2;
+									shift = 1;
+									_topRecJ = 0;
+								}
+								else 
+								{
+									if (_topRecI==_topRecT)
+									{
+										_topRecJ=1;
+										/* send nodes of clade _topRecM one level deeper */
+									}
+								}
+								treeNodes[_topRecI+shift][2]=treeNodes[_topRecI][0];
+								treeNodes[_topRecI+shift][3]=treeNodes[_topRecI][1]+_topRecJ;							
+							}
+							if (treeNodes[_topRecI][1]==0) 
+							{
+								break;
+							}
+							_topRecI = _topRecI+1;
+						}
+						
+						treeNodes[_topRecI+1][2]=treeNodes[_topRecI][0];
+						treeNodes[_topRecI+1][3]=treeNodes[_topRecI][1];							
+						
+						/* last thing to do:
+							copy/update clade info matrix => clades starting before newly added clade will
+							get shifted 1 to the left (their starting location)
+							clades starting after the enlarged will be shifted to the right 1.
+						*/
+						_topRecS = cladesInfo[_topRecM][0]+cladesInfo[_topRecM][1];
+						_topRecT = cladesInfo[_topRecM][0];
+						for (_topRecK=1; _topRecK<cladesCount; _topRecK=_topRecK+1)
+						{
+							if (cladesInfo[_topRecK][0]<=_topRecT)
+							{
+								cladesInfo[_topRecK][2] = cladesInfo[_topRecK][0]-1;
+							}
+							else
+							{
+								cladesInfo[_topRecK][2] = cladesInfo[_topRecK][0]+1;
+							}
+							cladesInfo[_topRecK][3] = cladesInfo[_topRecK][1];
+						}
+						
+						cladesInfo[0][2]=0;
+						cladesInfo[0][3]=cladesInfo[0][1]+1;
+						
+					}
+					else
+					/* both nodes are "proper" clades 
+					   Arrange that node _topRecN is to the left of node _topRecM. */
+					{
+						/* start up the merging procedure */
+						/* copy all nodes of the tree up to the beginning of the first clade */
+						_topRecM = _topRecM-_NUMBER_OF_SEQUENCES;
+						_topRecN = _topRecN-_NUMBER_OF_SEQUENCES;
+						if (cladesInfo[_topRecM][0]<cladesInfo[_topRecN][0])
+						{
+							_topRecI=_topRecM;
+							_topRecM=_topRecN;
+							_topRecN=_topRecI;
+						}
+						for (_topRecK=cladesInfo[_topRecN][0]-1;_topRecK>=0; _topRecK=_topRecK-1)
+						{
+							treeNodes[_topRecK][2] = treeNodes[_topRecK][0];
+							treeNodes[_topRecK][3] = treeNodes[_topRecK][1];
+						}
+						/* copy the nodes of the first clade sending them one level deeper */
+
+						for (_topRecK=cladesInfo[_topRecN][0]+cladesInfo[_topRecN][1]-1;_topRecK>=cladesInfo[_topRecN][0]; _topRecK=_topRecK-1)
+						{
+							treeNodes[_topRecK][2] = treeNodes[_topRecK][0];
+							treeNodes[_topRecK][3] = treeNodes[_topRecK][1]+1;
+						}
+						/* copy the nodes of the 2nd clade sending them one level deeper */
+						_topRecP = cladesInfo[_topRecM][0];
+						_topRecS = cladesInfo[_topRecN][0]+cladesInfo[_topRecN][1]+cladesInfo[_topRecM][1];
+							
+						for (_topRecK=cladesInfo[_topRecN][0]+cladesInfo[_topRecN][1];_topRecK<_topRecS; _topRecK=_topRecK+1)
+						{
+							treeNodes[_topRecK][2] = treeNodes[_topRecP][0];
+							treeNodes[_topRecK][3] = treeNodes[_topRecP][1]+1;
+							_topRecP = _topRecP+1;
+						}
+						
+						/* add new node */
+						
+						treeNodes[_topRecS][2]=_NUMBER_OF_SEQUENCES+cladesCount;
+						treeNodes[_topRecS][3]=1;
+						
+						_topRecK=_topRecS+1;
+						
+						/* copy the nodes between the first and second clades */
+						
+						_topRecP = cladesInfo[_topRecM][0];
+						for (_topRecJ=cladesInfo[_topRecN][0]+cladesInfo[_topRecN][1]; _topRecJ<_topRecP; _topRecJ=_topRecJ+1)
+						{
+							treeNodes[_topRecK][2]=treeNodes[_topRecJ][0];
+							treeNodes[_topRecK][3]=treeNodes[_topRecJ][1];
+							_topRecK=_topRecK+1;
+						}
+											
+						/* finally, copy all the nodes after the end of the 2nd clade */
+						for (_topRecJ=cladesInfo[_topRecM][0]+cladesInfo[_topRecM][1]; treeNodes[_topRecJ][1]; _topRecJ=_topRecJ+1)
+						{
+							treeNodes[_topRecK][2]=treeNodes[_topRecJ][0];
+							treeNodes[_topRecK][3]=treeNodes[_topRecJ][1];
+							_topRecK=_topRecK+1;
+						}
+						
+						_topRecK=cladesInfo[0][1];
+						/*copy root*/
+						treeNodes[_topRecK][2]=treeNodes[_topRecK-1][0];
+						treeNodes[_topRecK][3]=treeNodes[_topRecK-1][1];
+						
+						/* create new clade info */
+						cladesInfo[cladesCount][2] = cladesInfo[_topRecN][0];
+						cladesInfo[cladesCount][3] = cladesInfo[_topRecN][1]+cladesInfo[_topRecM][1]+1;
+						
+						/* lastly - update info for other clades */
+						_topRecS = cladesInfo[_topRecN][0];
+						_topRecP = cladesInfo[_topRecN][1]+_topRecS;
+						_topRecT = cladesInfo[_topRecM][0];
+						_topRecJ = cladesInfo[_topRecM][1]+1;
+						for (_topRecK=0; _topRecK<cladesCount; _topRecK=_topRecK+1)
+						{
+							cladesInfo[_topRecK][3] = cladesInfo[_topRecK][1];
+							_topRecL = cladesInfo[_topRecK][0];
+							if (_topRecL<=_topRecS)
+							{
+								cladesInfo[_topRecK][2] = _topRecL;
+							}
+							else
+							{
+								if ((_topRecL>=_topRecP)&&(_topRecL<_topRecT))
+								{
+									cladesInfo[_topRecK][2] = _topRecL+_topRecJ;
+								}
+								else
+								{
+									if (_topRecL>=_topRecT+_topRecJ-1)
+									{
+										cladesInfo[_topRecK][2] = _topRecL+1;
+									}
+									else
+									{
+										if (_topRecL>=_topRecT)
+										{
+											cladesInfo[_topRecK][2] = _topRecL-_topRecT+_topRecP;
+										}
+										else
+										{
+											cladesInfo[_topRecK][2] = _topRecL;
+										}
+									}
+								}
+							}
+						}
+						cladesInfo[_topRecM][2] = _topRecP;
+						cladesInfo[0][3] = cladesInfo[0][1]+1;
+					}
+				}
+				
+				thisTree = TreeMatrix2TreeString (2,0);
+				if (verbFlag)
+				{
+					fprintf (stdout, "\n\tTree ",thisTree);
+				}				
+				Tree    Inferred_Tree = thisTree;
+				SpawnLikelihoodFunction ("_INF_LF_", "Inferred_Tree", INFERENCE_DATA_WINDOW, _all_sequence_matrix);
+				Optimize (res,_INF_LF_);
+				if (res[1][0]>bestValue)
+				{
+					bestValue = res[1][0];
+					bestTree = thisTree;
+					bestNode1 = eligibleNodes[loop1];
+					bestNode2 = eligibleNodes[loop2];
+					
+					for (_topRecL=0;treeNodes[_topRecL][3];_topRecL=_topRecL+1)
+					{
+						bestTreeNodes[_topRecL][0]=treeNodes[_topRecL][2];
+						bestTreeNodes[_topRecL][1]=treeNodes[_topRecL][3];
+					}
+					
+					bestTreeNodes[_topRecL][0]=treeNodes[_topRecL][2];
+					bestTreeNodes[_topRecL][1]=treeNodes[_topRecL][3];
+									
+					for (_topRecL=0; _topRecL<=cladesCount; _topRecL=_topRecL+1)
+					{
+						bestCladesInfo[_topRecL][0]=cladesInfo[_topRecL][2];
+						bestCladesInfo[_topRecL][1]=cladesInfo[_topRecL][3];
+					}
+
+				}
+				if (verbFlag)
+				{
+					fprintf (stdout, " =>", res[1][0]);
+				}
+			}
+
+		}
+		
+		/* update eligible nodes lists */
+		shift = 0;
+		for (_topRecL=0;_topRecL<eligibleNodesCount;_topRecL=_topRecL+1)
+		{
+			if ((eligibleNodes[_topRecL]==bestNode1)||(eligibleNodes[_topRecL]==bestNode2))
+			{
+				shift = shift+1;
+			}
+			else
+			{
+				eligibleNodes[_topRecL-shift]=eligibleNodes[_topRecL];
+			}
+		}
+		eligibleNodesCount = eligibleNodesCount-1;
+		eligibleNodes[eligibleNodesCount-1]=cladesCount+_NUMBER_OF_SEQUENCES;
+		
+		for (_topRecL=0;bestTreeNodes[_topRecL][1];_topRecL=_topRecL+1)
+		{
+			treeNodes[_topRecL][0]=bestTreeNodes[_topRecL][0];
+			treeNodes[_topRecL][1]=bestTreeNodes[_topRecL][1];
+		}
+
+		treeNodes[_topRecL][0]=bestTreeNodes[_topRecL][0];
+		treeNodes[_topRecL][1]=bestTreeNodes[_topRecL][1];
+		
+		for (_topRecL=0; _topRecL<=cladesCount; _topRecL=_topRecL+1)
+		{
+			cladesInfo[_topRecL][0]=bestCladesInfo[_topRecL][0];
+			cladesInfo[_topRecL][1]=bestCladesInfo[_topRecL][1];
+		}
+		
+		if (verbFlag)
+		{
+			if (bestNode1<_NUMBER_OF_SEQUENCES)
+			{
+				GetString (s1,INFERENCE_DATA_SET,bestNode1);
+			}
+			else
+			{
+				s1 = "Node"+Format(bestNode1,0,0);
+			}
+			if (bestNode2<_NUMBER_OF_SEQUENCES)
+			{
+				GetString (s2,INFERENCE_DATA_SET,bestNode2);
+			}
+			else
+			{
+				s2 = "Node"+Format(bestNode2,0,0);
+			}
+			fprintf (stdout,"\n\n\t ----> Best tree obtained by grouping ",s1," and ", s2, " is\n", bestTree, " with log likelihood of ", bestValue);
+		}
+		cladesCount = cladesCount+1;
+	}
+	
+	if (doNNIOption)
+	{
+		taxonCounter = _NUMBER_OF_SEQUENCES;
+		/* strip the root off for compatibility */
+		for (_topRecL=Rows(treeNodes)-1; _topRecL>0; _topRecL=_topRecL-1)
+		{
+			if (treeNodes[_topRecL][0]>=_NUMBER_OF_SEQUENCES)
+			{
+				if (treeNodes[_topRecL][0] == _NUMBER_OF_SEQUENCES)
+				{
+					treeNodes[_topRecL][0] = 0;
+				}
+				else
+				{
+					treeNodes[_topRecL][0] = treeNodes[_topRecL][0]-1;
+				}
+			}
+		}
+		for (_topRecL=0; _topRecL<Rows(cladesInfo)-1; _topRecL=_topRecL+1)
+		{
+			cladesInfo[_topRecL][0] = cladesInfo[_topRecL+1][0];
+			cladesInfo[_topRecL][1] = cladesInfo[_topRecL+1][1];
+		}
+		cladesInfo[_topRecL][0] = 0;
+		cladesInfo[_topRecL][1] = 0;
+		
+		starDecomposition = 1;
+		if (doNNIOption==1)
+		{
+			#include "Support/doNNISwap.bf";
+		}
+		else
+		{
+			#include "Support/doSPRSwap.bf";
+		}
+	}
+	return 1;
+}
+
+_all_sequence_matrix = {_NUMBER_OF_SEQUENCES,1};
+
+for (_topRecI=0; _topRecI<_NUMBER_OF_SEQUENCES; _topRecI=_topRecI+1)
+{
+	_all_sequence_matrix [_topRecI][0] = _topRecI;
+}
+
+_topRecL = InferTreeTopology (1.0);
+
+Tree	Inferred_Tree = bestTree;
+
+SpawnLikelihoodFunction ("_INF_LF_", "Inferred_Tree", INFERENCE_DATA_WINDOW, _all_sequence_matrix);
+
+saveTreeNodes = {2*(_NUMBER_OF_SEQUENCES+1),3};
+for (_topRecI=2*_NUMBER_OF_SEQUENCES+1;_topRecI>=0;_topRecI=_topRecI-1)
+{
+	saveTreeNodes[_topRecI][0] = bestTreeNodes[_topRecI][0];
+	saveTreeNodes[_topRecI][1] = bestTreeNodes[_topRecI][1];
+}
diff --git a/res/TopologyInference/Support/branchSwappingFunctions.bf b/res/TopologyInference/Support/branchSwappingFunctions.bf
new file mode 100644
index 0000000..05e848b
--- /dev/null
+++ b/res/TopologyInference/Support/branchSwappingFunctions.bf
@@ -0,0 +1,411 @@
+/* NNI Branch Swapping Functions */
+
+function	copyTreeStructure	 (terminationLevel,levelModifier)
+{
+	while (1)
+	{
+		scbj = treeNodes[scbi][0];
+		splitTreeInfo  [scbk][scbp] = treeNodes[scbi][1]+levelModifier;
+		
+		if (scbj<spCount)
+		{
+			splitTreeInfo [scbk][scbn] = scbj;
+		}
+		else
+		{
+			splitTreeInfo   [scbk][scbn] = spCount+scbm;
+			splitCladesInfo [scbm][scbn] = cladesInfo [scbj-spCount][0]-scbo;
+			splitCladesInfo [scbm][scbp] = cladesInfo [scbj-spCount][1];
+			scbm = scbm+1;
+		}
+		if (treeNodes[scbi][1]==terminationLevel)
+		{
+			break;
+		}
+		scbk = scbk+1;		
+		scbi = scbi+1;
+	}
+	return 0;
+}
+
+function	splitCladesOnIBranch (spCount, iNodeIndex)
+{
+	splitTreeInfo      = {Rows(treeNodes),8};
+	splitCladesInfo    = {Rows(cladesInfo),8};
+	/* do the two easy ones 1st */
+	iNodeIndex = iNodeIndex - spCount;
+	treeInfoSplitIndex = cladesInfo[iNodeIndex][1]+cladesInfo[iNodeIndex][0]-1;
+	treeInfoSplitDepth = treeNodes[treeInfoSplitIndex][1];
+	scbk 		  = 0;
+	scbm 		  = 0;
+	scbn		  = 0;
+	scbp		  = 1;
+	scbo		  = cladesInfo[iNodeIndex][0];
+	newINodeIndex = 0;
+	for (scbi=cladesInfo[iNodeIndex][0];scbi<treeInfoSplitIndex;scbi=scbi+1)
+	{
+		scbj = treeNodes[scbi][0];
+		splitTreeInfo  [scbk][scbp] = treeNodes[scbi][1]-treeInfoSplitDepth;
+		
+		if (scbj<spCount)
+		{
+			splitTreeInfo [scbk][scbn] = scbj;
+		}
+		else
+		{
+			splitTreeInfo   [scbk][scbn] = spCount+scbm;
+			splitCladesInfo [scbm][scbn] = cladesInfo [scbj-spCount][0]-scbo;
+			splitCladesInfo [scbm][scbp] = cladesInfo [scbj-spCount][1];
+			scbm = scbm+1;
+		}
+		if ((splitTreeInfo[scbk][1]==1)&&(scbn==0))
+		{
+			scbo = scbi+1;
+			scbn = 2;
+			scbp = 3;
+			scbk = 0;
+			scbm = 0;
+			continue;
+		}
+		scbk = scbk+1;
+	}
+	/* build the third clade by taking the 2nd child of the parent */
+	scbn = 4;
+	scbp = 5;
+	scbm = 0;
+	scbk = 0;
+	scbi = scbi+1;
+	if (treeNodes[scbi][1] < treeInfoSplitDepth)
+	/* was the right child */
+	{
+		scbi = cladesInfo[iNodeIndex][0]-1;
+		scbj = treeNodes[scbi][0];
+		if (scbj>=spCount)
+		{
+			scbi = cladesInfo[scbj-spCount][0];
+		}
+	}
+	scbo = scbi;
+	scbn = copyTreeStructure (treeInfoSplitDepth,1-treeInfoSplitDepth);
+	scbn = 6;
+	scbp = 7;
+	if (treeInfoSplitDepth == 1)
+	/* root level split */
+	{
+		scbi = scbi+1;
+		if ((treeNodes[scbi][1] == 0)||(scbi==cladesInfo[iNodeIndex][0]))
+		{
+			scbi = 0;
+		}
+		scbo = scbi;
+		scbm = 0;
+		scbk = 0;
+		scbj = copyTreeStructure (1,0);
+	}
+	else
+	/* not a root level split */
+	{
+		scbj = treeInfoSplitDepth-1;
+		pathToTheRoot = {scbj,1};
+		pathToTheRoot [0] = L1ParentIndex+1;
+		/* find a level 1 parent of the split point */
+		for (L1ParentIndex = treeInfoSplitIndex;;L1ParentIndex=L1ParentIndex+1)
+		{
+			if (treeNodes[L1ParentIndex][1] == scbj)
+			{
+				pathToTheRoot[scbj-1] = L1ParentIndex;
+				if (scbj == 1)
+				{
+					break;
+				} 
+				scbj = scbj - 1;
+			}
+		}
+		/* handle the top level separately */
+		scbk = 0;
+		scbm = 0;
+		
+		scbi = 0;
+		scbo = 0;
+		scbq = pathToTheRoot[0];
+		scbq = treeNodes[scbq][0]-spCount;
+		scbq = cladesInfo[scbq][0];
+		for (scbr = 0; scbr < 3; scbr = scbr+1)
+		{
+			if (scbi == scbq)
+			{
+				scbo = pathToTheRoot[0]-scbi+1;
+				scbi = pathToTheRoot[0];
+			}
+			else
+			{
+				dummy = copyTreeStructure (1,treeInfoSplitDepth-1);
+				scbk = scbk+1;
+			}
+			scbi = scbi+1;
+		}
+		
+		/* add a new internal node to join the other two */
+		splitTreeInfo   [scbk][scbn] = spCount+scbm;
+		splitTreeInfo   [scbk][scbp] = treeInfoSplitDepth-1;
+		splitCladesInfo [scbm][scbn] = 0;
+		scbk = scbk+1;
+		splitCladesInfo [scbm][scbp] = scbk;
+		scbm = scbm+1;
+
+		for (scbq = 1; scbq<Rows(pathToTheRoot); scbq = scbq+1)
+		{
+			scbj = pathToTheRoot [scbq];
+			scbo = pathToTheRoot [scbq-1];
+			if (scbo==scbj+1)
+			/* came from the right child */
+			{
+				scbi = treeNodes  [scbo][0]-spCount;
+				scbi = cladesInfo[scbi][0];
+			}
+			/* came from the left child */
+			else
+			{
+				scbi = scbj+1;
+			}
+			scbs = scbi;
+			scbo = scbi-scbk;
+			dummy = copyTreeStructure (scbq+1,treeInfoSplitDepth-2*scbq-1);			
+			scbk = scbk+1;
+			splitTreeInfo   [scbk][scbn] = spCount+scbm;
+			splitTreeInfo   [scbk][scbp] = Rows(pathToTheRoot)-scbq;
+			splitCladesInfo [scbm][scbn] = 0;
+			scbk = scbk+1;
+			splitCladesInfo [scbm][scbp] = scbk;
+			scbm = scbm+1;
+		} 		
+	}
+	return 0;
+}
+
+function	doNNISwap (b2group,spCount)
+{
+	if (b2group==3)
+	{
+		branchOrderMatrix = {{0,3,1,2}};	
+	}
+	else
+	{
+		branchOrderMatrix = {{0,2,1,3}};
+	}
+	
+	scbo = 0;
+	scbn = 0;
+	scbp = 1;
+	scbj = 0;
+	scbk = 0;
+	
+	for (scbi=0; scbi<4; scbi = scbi+1)
+	{
+		scbt = branchOrderMatrix[scbi];
+		scbn = scbt*2;
+		scbp = scbn+1;
+		scbq = 0;
+		while (splitTreeInfo[scbq][scbp])
+		{
+			if (splitTreeInfo[scbq][scbn]<spCount)
+			{
+				treeNodes [scbj][2] = splitTreeInfo[scbq][scbn];
+			}
+			else
+			{
+				scbm = splitTreeInfo[scbq][scbn]-spCount;
+				treeNodes	[scbj][2] = spCount+scbk;
+				cladesInfo	[scbk][2] = splitCladesInfo[scbm][scbn] + scbo;
+				cladesInfo  [scbk][3] = splitCladesInfo[scbm][scbp];
+				scbk=scbk+1;
+			}
+			if (scbi<2)
+			{
+				treeNodes[scbj][3] = splitTreeInfo[scbq][scbp]+1;
+			}
+			else
+			{
+				treeNodes[scbj][3] = splitTreeInfo[scbq][scbp];
+			}
+			scbj = scbj+1;
+			scbq = scbq+1;
+		}
+		scbo = scbo + scbq;
+		if (scbi==1)
+		{
+			scbo = scbo+1;
+			treeNodes	[scbj][2] = spCount+scbk;
+			treeNodes	[scbj][3] = 1;
+			cladesInfo	[scbk][2] = 0;
+			cladesInfo  [scbk][3] = scbo;
+			scbj = scbj+1;
+			scbk = scbk+1;			
+		}
+	}
+	treeNodes[scbj][2] = 0;
+	treeNodes[scbj][3] = 0;
+	return 0;
+}
+
+function	doSubtreeCopy (startAt, upTo, depthCorrection)
+{
+	if (upTo>=(-1))
+	{
+		for   (scbi=startAt; scbi<=upTo; scbi=scbi+1)
+		{
+			if (splitTreeInfo[scbi][scbn]<spCount)
+			{
+				treeNodes [scbj][2] = splitTreeInfo[scbi][scbn];
+			}
+			else
+			{
+				scbm = splitTreeInfo[scbi][scbn]-spCount;
+				treeNodes	[scbj][2] = spCount+scbk;
+				cladesInfo	[scbk][2] = splitCladesInfo[scbm][scbn] + scbo;
+				cladesInfo  [scbk][3] = splitCladesInfo[scbm][scbp];
+				scbk=scbk+1;
+			}
+			treeNodes[scbj][3] = splitTreeInfo[scbi][scbp]+depthCorrection;
+			scbj = scbj+1;
+		}
+		return 0;
+	}
+	else
+	{
+		scbi = startAt;
+		while (splitTreeInfo[scbi][scbp])
+		{
+			if (splitTreeInfo[scbi][scbn]<spCount)
+			{
+				treeNodes [scbj][2] = splitTreeInfo[scbi][scbn];
+			}
+			else
+			{
+				scbm = splitTreeInfo[scbi][scbn]-spCount;
+				treeNodes	[scbj][2] = spCount+scbk;
+				cladesInfo	[scbk][2] = splitCladesInfo[scbm][scbn] + scbo;
+				cladesInfo  [scbk][3] = splitCladesInfo[scbm][scbp];
+				scbk=scbk+1;
+			}
+			treeNodes[scbj][3] = splitTreeInfo[scbi][scbp]+depthCorrection;
+			scbj = scbj+1;		
+			scbi = scbi+1;
+		}
+		return scbi-startAt;
+	}
+	
+}
+
+
+function	doSPRSwap (bFgroup1, bFgroup2, b2group,where2group,spCount)
+{	
+	scbn = b2group*2;
+	scbp = scbn+1;
+		
+	scbo = 0;
+	scbj = 0;
+	scbk = 0;
+	scbd = splitTreeInfo[where2group][scbp];
+	
+	if (splitTreeInfo[where2group][scbn]<spCount)
+	/* grafting onto a leaf */
+	{
+		dummy = doSubtreeCopy (0,where2group-1,0);
+		scbr  = where2group;
+		dummy = doSubtreeCopy (where2group,where2group,1);
+		scbn  = bFgroup1*2;
+		scbp  = scbn+1;
+		scbo  = where2group+1;
+		scbq  = scbj;
+		dummy = doSubtreeCopy (0,-2,scbd+1);
+		scbo  = scbo+dummy;
+		scbn  = bFgroup2*2;
+		scbp  = scbn+1;
+		dummy = doSubtreeCopy (0,-2,scbd+1);
+		scbo  = scbo+dummy;	
+	}
+	else
+	/* grafting onto an internal branch */
+	{
+		scbq  = splitTreeInfo  [where2group][scbn]-spCount;
+		scbq  = splitCladesInfo[scbq][scbn];
+		dummy = doSubtreeCopy (0,scbq-1,0);
+		scbr  = scbj;
+		dummy = doSubtreeCopy (scbq,where2group,1);
+		scbo  = scbj;
+		scbn  = bFgroup1*2;
+		scbp  = scbn+1;
+		scbo  = where2group+1;
+		scbq  = scbj;
+		dummy = doSubtreeCopy (0,-2,scbd+1);
+		scbo  = scbo+dummy;
+		scbn  = bFgroup2*2;
+		scbp  = scbn+1;
+		dummy = doSubtreeCopy (0,-2,scbd+1);
+		scbo  = scbo+dummy;		
+	}
+	
+	scbv = scbo-scbq+2;
+	
+	/* create 2 new internal nodes */
+		
+	for (scbi=1; scbi>=0; scbi = scbi-1)
+	{
+		scbo = scbo+1;
+		treeNodes	[scbj][2] = spCount+scbk;
+		treeNodes	[scbj][3] = scbd+scbi;
+		cladesInfo	[scbk][2] = scbq;
+		cladesInfo  [scbk][3] = scbj-scbq+1;
+		scbj = scbj+1;
+		scbk = scbk+1;		
+		scbq = scbr;
+	}	
+	
+	
+	scbn  = b2group*2;
+	scbp  = scbn+1;	
+	scbo  = scbo-where2group-1;
+	dummy = doSubtreeCopy (where2group+1,-2,0);
+	
+	scbr = scbd-1;
+	/* update the number of nodes in affected clades */
+	for (scbi=where2group+1; scbi<scbj; scbi=scbi+1)
+	{
+		if ((treeNodes[scbi][3]==scbr)&&(treeNodes[scbi][2]>spCount))
+		{
+			scbq = treeNodes[scbi][2]-spCount;
+			cladesInfo[scbq][3] = cladesInfo[scbq][3]+scbv;
+			cladesInfo[scbq][2] = cladesInfo[scbq][2]-scbo;
+			scbr = scbr-1;
+		}
+	}
+
+	scbj  = scbj-1;
+	scbk  = scbk-1;
+	scbo  = scbo+where2group+dummy;
+	for (scbi=0; scbi<scbj; scbi=scbi+1)
+	{
+		treeNodes[scbi][3] = treeNodes[scbi][3]-1;
+	}
+	
+	
+	for (scbi=0; scbi<4; scbi=scbi+1)
+	{
+		if ((scbi==bFgroup1)||(bFgroup2==scbi)||(b2group==scbi))
+		{
+			continue;
+		}
+		break;
+	}
+	
+	scbn  = scbi*2;
+	scbp  = scbn+1;
+	dummy = doSubtreeCopy (0,-2,0);
+
+	treeNodes[scbj][2] = 0;
+	treeNodes[scbj][3] = 0;
+	cladesInfo[scbk][2] = 0;
+	cladesInfo[scbk][3] = 0;
+	return 0;
+}
diff --git a/res/TopologyInference/Support/doNNISwap.bf b/res/TopologyInference/Support/doNNISwap.bf
new file mode 100644
index 0000000..077d2b2
--- /dev/null
+++ b/res/TopologyInference/Support/doNNISwap.bf
@@ -0,0 +1,91 @@
+l = 0;
+while (cladesInfo[l][1])
+{
+	l = l+1;
+}
+
+if (verbFlag)
+{
+	fprintf (stdout, "\n\n\tPerforming NNI branch swapping on the best tree so far.\n\tAt least ",l*2," trees will be examined.\n\n");
+}
+
+nniDidBetter = 0;
+
+for (l2 = 0; l2 < l; l2=l2+1)
+{
+	dummy = splitCladesOnIBranch (_NUMBER_OF_SEQUENCES,_NUMBER_OF_SEQUENCES+l2);
+	for (l3=2; l3<4; l3=l3+1)
+	{
+		dummy = doNNISwap (l3,_NUMBER_OF_SEQUENCES);
+		thisTree = TreeMatrix2TreeString (2,0);
+		if (verbFlag)
+		{
+			fprintf (stdout, "\n\tNNI tree ",thisTree);
+		}
+		Tree    Inferred_Tree = thisTree;
+		if (starDecomposition)
+		{
+			SpawnLikelihoodFunction ("_INF_LF_", "Inferred_Tree", INFERENCE_DATA_WINDOW, _all_sequence_matrix);
+		}		
+		else
+		{
+			SpawnLikelihoodFunction ("_INF_LF_", "Inferred_Tree", INFERENCE_DATA_WINDOW, _subset_to_filter);
+		}
+
+		if (globalParametersOption && Abs(_cString))
+		{	
+			ExecuteCommands (_cString);	
+		}
+		Optimize (res,_INF_LF_);
+		
+		if (verbFlag)
+		{
+			fprintf (stdout, " => ", res[1][0]);
+		}
+		
+		if (res[1][0]>bestValue+OPTIMIZATION_PRECISION)
+		{	
+			nniDidBetter = 1;
+			bestValue = res[1][0];
+			bestTree = thisTree;
+			for (l4=2*taxonCounter-2;l4>=0;l4=l4-1)
+			{
+				bestTreeNodes[l4][0]= treeNodes[l4][2];
+				bestTreeNodes[l4][1]= treeNodes[l4][3];
+				treeNodes[l4][0]    = treeNodes[l4][2];
+				treeNodes[l4][1]    = treeNodes[l4][3];
+			}
+			for (l4=0; l4<taxonCounter-2; l4=l4+1)
+			{
+				bestCladesInfo[l4][0]= cladesInfo[l4][2];
+				bestCladesInfo[l4][1]= cladesInfo[l4][3];
+				cladesInfo[l4][0]    = cladesInfo[l4][2];
+				cladesInfo[l4][1]    = cladesInfo[l4][3];
+			}
+			l = 0;
+			while (cladesInfo[l][1])
+			{
+				l = l+1;
+			}				
+			l2 = -1;
+			break;
+		}
+	}
+}
+if (nniDidBetter)
+{
+	for (l=2*taxonCounter-2;l>=0;l=l-1)
+	{
+		treeNodes[l][0]=bestTreeNodes[l][0];
+		treeNodes[l][1]=bestTreeNodes[l][1];
+	}
+	for (l=0; l<taxonCounter-2; l=l+1)
+	{
+		cladesInfo[l][0]=bestCladesInfo[l][0];
+		cladesInfo[l][1]=bestCladesInfo[l][1];
+	}
+	if (verbFlag)
+	{
+		fprintf (stdout,"\n\n\t Improved NNI ", Format(taxonCounter,0,0)," taxa tree is ", bestTree, " with log likelihood of ", bestValue);
+	}
+}
diff --git a/res/TopologyInference/Support/doSPRSwap.bf b/res/TopologyInference/Support/doSPRSwap.bf
new file mode 100644
index 0000000..490b429
--- /dev/null
+++ b/res/TopologyInference/Support/doSPRSwap.bf
@@ -0,0 +1,115 @@
+l = 0;
+while (cladesInfo[l][1])
+{
+	l = l+1;
+}
+
+if (verbFlag)
+{
+	fprintf (stdout, "\n\n\tPerforming subtree pruning and regrafting on the best tree so far.\n\n");
+}
+nniDidBetter = 0;
+for (l2 = 0; l2 < l; l2=l2+1)
+{
+	dummy = splitCladesOnIBranch (_NUMBER_OF_SEQUENCES,_NUMBER_OF_SEQUENCES+l2);
+	l3s = 0;
+	l3f = 2;
+	if ((splitTreeInfo[0][1]==1)&&(splitTreeInfo[0][3]==1))
+	{
+		l3s = 2;
+		l3f = 4;
+	}
+	
+	for (l3=l3s; l3<l3f; l3=l3+1)
+	{
+		l4 = 0;
+		while (splitTreeInfo[l4+1][2*l3+1])
+		{
+			/* check for degeneracies 
+			if ((l3==1)&&(splitTreeInfo[0][1]==1)&&(splitTreeInfo[0][3]==1))
+			{
+				break;
+			}*/
+			if (l3<2)
+			{
+				dummy = doSPRSwap (2,3,l3,l4,_NUMBER_OF_SEQUENCES);
+			}
+			else
+			{
+				dummy = doSPRSwap (0,1,l3,l4,_NUMBER_OF_SEQUENCES);								
+			}
+			
+			thisTree = TreeMatrix2TreeString (2,0);
+			if (verbFlag)
+			{
+				fprintf (stdout, "\n\tSPR tree ",thisTree);
+			}
+			Tree    Inferred_Tree = thisTree;
+			if (starDecomposition)
+			{
+				SpawnLikelihoodFunction ("_INF_LF_", "Inferred_Tree", INFERENCE_DATA_WINDOW, _all_sequence_matrix);
+			}		
+			else
+			{
+				SpawnLikelihoodFunction ("_INF_LF_", "Inferred_Tree", INFERENCE_DATA_WINDOW, _subset_to_filter);
+			}
+
+			if (globalParametersOption && Abs(_cString))
+			{	
+				ExecuteCommands (_cString);	
+			}
+			Optimize (res,_INF_LF_);
+			
+			if (verbFlag)
+			{
+				fprintf (stdout, " => ", res[1][0]);
+			}
+			if (res[1][0]>bestValue+OPTIMIZATION_PRECISION)
+			{	
+				nniDidBetter = 1;
+				bestValue = res[1][0];
+				bestTree = thisTree;
+				for (l4=2*taxonCounter-2;l4>=0;l4=l4-1)
+				{
+					bestTreeNodes[l4][0]= treeNodes[l4][2];
+					bestTreeNodes[l4][1]= treeNodes[l4][3];
+					treeNodes[l4][0]    = treeNodes[l4][2];
+					treeNodes[l4][1]    = treeNodes[l4][3];
+				}
+				for (l4=0; l4<taxonCounter-2; l4=l4+1)
+				{
+					bestCladesInfo[l4][0]= cladesInfo[l4][2];
+					bestCladesInfo[l4][1]= cladesInfo[l4][3];
+					cladesInfo[l4][0]    = cladesInfo[l4][2];
+					cladesInfo[l4][1]    = cladesInfo[l4][3];
+				}
+				l = 0;
+				while (cladesInfo[l][1])
+				{
+					l = l+1;
+				}				
+				l2 = -1;
+				l3 = l3f;
+				break;
+			}
+			l4 = l4+1;
+		}
+	}
+}
+if (nniDidBetter)
+{
+	for (l=Rows(bestTreeNodes)-1;l>=0;l=l-1)
+	{
+		treeNodes[l][0]=bestTreeNodes[l][0];
+		treeNodes[l][1]=bestTreeNodes[l][1];
+	}
+	for (l=0; l<Rows(bestCladesInfo); l=l+1)
+	{
+		cladesInfo[l][0]=bestCladesInfo[l][0];
+		cladesInfo[l][1]=bestCladesInfo[l][1];
+	}
+	if (verbFlag)
+	{
+		fprintf (stdout,"\n\n\t Improved SPR ", Format(taxonCounter,0,0)," taxa tree is ", bestTree, " with log likelihood of ", bestValue);
+	}
+}
diff --git a/res/TreeAddIns/Splits b/res/TreeAddIns/Splits
new file mode 100644
index 0000000..34559ab
--- /dev/null
+++ b/res/TreeAddIns/Splits
@@ -0,0 +1,38 @@
+_astavl_ = ACCEPT_ROOTED_TREES;
+ACCEPT_ROOTED_TREES = 1;
+Topology _ast_ = _TREE_STRING_FOR_PROCESSING_;
+ACCEPT_ROOTED_TREES = _astavl_;
+
+/* obtain an AVL data structure of the tree, post-order layout */
+
+_astavl_  = _ast_^1;
+_tree_size_ = Abs (_astavl_);
+
+
+for (_a_node = 2; _a_node < _tree_size_; _a_node = _a_node + 1)
+{
+	_node_info = _astavl_[_a_node];
+	myDegree = Abs(_node_info["Children"]);
+	myDepth  = _node_info["Depth"];
+	
+	if (myDegree)
+	{
+		nodeName = _node_info["Name"];
+		fprintf (stdout, "\n", nodeName, ":");
+		for (_b_node = _a_node + 1; _b_node < _tree_size_; _b_node = _b_node + 1)
+		{
+			_bnode_info = _astavl_[_b_node];
+			if (_bnode_info["Depth"] <= myDepth)
+			{
+				break;
+			}
+			if (Abs(_bnode_info["Children"])==0)
+			{
+				_bnode_info = _bnode_info["Name"];
+				fprintf (stdout, "\t", _bnode_info);
+			}
+		}
+	}
+}
+
+fprintf (stdout, "\n");
diff --git a/res/TreeAddIns/Tree Statistics b/res/TreeAddIns/Tree Statistics
new file mode 100644
index 0000000..98a2b01
--- /dev/null
+++ b/res/TreeAddIns/Tree Statistics	
@@ -0,0 +1,195 @@
+_astavl_ = ACCEPT_ROOTED_TREES;
+ACCEPT_ROOTED_TREES = 1;
+Topology _ast_ = _TREE_STRING_FOR_PROCESSING_;
+ACCEPT_ROOTED_TREES = _astavl_;
+
+/* obtain an AVL data structure of the tree, post-order layout */
+
+_astavl_ = _ast_^0;
+_astavl_2 = _ast_^1;
+
+/* Use the post-order layout of the tree to compute 
+
+1). Sizes of subtrees rooted at every node 
+
+*/
+
+_tree_size_ = Abs (_astavl_);
+
+is_binary = 1;
+
+_sum_    	= 0;
+_sum2_   	= 0;
+_degree_ 	= 0;
+_maxd_	 	= 0;
+_cherries_  = 0;
+_I_c_		= 0;
+_B_2_		= 0;
+_B_1_		= 0;
+
+_beta_split = {_tree_size_/2-1,2};
+
+for (_a_node = 1; _a_node < _tree_size_; _a_node = _a_node + 1)
+{
+	_node_info = _astavl_[_a_node];
+	_a_parent = _node_info["Parent"];
+	
+	myDegree = Abs(_node_info["Children"]);
+	myDepth  = _node_info["Maxd"];
+	
+	if (myDegree == 0)
+	{
+		_node_info["offspring"] = 1;
+		_my_size  = 1;
+		_astavl_[_a_node] = _node_info;
+	}
+	else
+	{
+		_my_size  = _node_info["offspring"];
+			
+		if (myDegree>2)
+		{
+			is_binary = 0;
+		}
+		
+		if (_a_parent>0)
+		{
+			_B_1_ = _B_1_ + 1/_node_info["Maxd"];
+		}
+	}
+	
+	
+	if (_a_parent > 0)
+	{
+		_node_info = _astavl_[_a_parent];
+		_node_info["offspring"] = _node_info["offspring"]+_my_size;
+		_node_info["Maxd"] = Max(_node_info["Maxd"],myDepth+1);
+		_astavl_[_a_parent] = _node_info;
+	}
+}
+
+
+_count_  	= 0;
+
+if (is_binary)
+{
+	
+	for (_a_node = 1; _a_node < _tree_size_; _a_node = _a_node + 1)
+	{
+		_node_info = _astavl_[_a_node];
+		c1 = _node_info["Children"];
+		myDegree = Abs(c1);
+
+		if (myDegree == 2)
+		{
+			c2 = c1[1];
+			c1 = c1[0];
+			c1 = _astavl_[c1];
+			c2 = _astavl_[c2];
+			
+			_beta_split [_count_][0] = _node_info["offspring"];
+			_beta_split [_count_][1] = Min(c1["offspring"],c2["offspring"]);
+			
+			_count_ = _count_ + 1;
+			
+			_I_c_ = _I_c_ + Abs(c1["offspring"]-c2["offspring"]);			
+		}
+	}
+
+	labels = {{"Parent Clade", "Smaller Daughter Clade"}};
+	
+	OpenWindow (CHARTWINDOW,{{"Splits in the tree"}
+		{"labels"}
+		{"_beta_split"}
+		{"Scatterplot"}
+		{labels[0]}
+		{labels[1]}
+		{"Size of parent"}
+		{"LRT"}
+		{"Size of daughter"}
+		{""}
+		{""}
+		{""}
+		{"10;1.309;0.785398"}
+		{"Times:12:0;Times:10:0;Times:14:2"}
+		{"0;0;16777215;5000268;0;0;6750054;11842740;13158600;14474460;0;3947580;16777215;0;5000268;11776947;10066329;9199669;7018159;1460610;16748822;11184810;14173291"}
+		{"16"}
+		},
+		"(SCREEN_WIDTH-30)/2;(SCREEN_HEIGHT-50)/2;20+(SCREEN_WIDTH)/2;40");
+}
+else
+{
+	_I_c = 0/0;
+}	
+
+_count_  	= 0;
+
+for (_a_node = 1; _a_node < _tree_size_; _a_node = _a_node + 1)
+{
+	_node_info  = _astavl_2[_a_node];
+	_a_parent   = _node_info["Parent"];
+	_pnode_info = _astavl_2[_a_parent];
+	myDepth     = _pnode_info["Depth"]+1;
+	_node_info["Depth"] = myDepth;
+	c1 = _node_info["Children"];
+	myDegree = Abs(c1);
+	if (_a_parent)
+	{
+		_astavl_2[_a_node] = _node_info;
+	}
+	
+	if (myDegree==0)
+	{
+		_count_ = _count_ + 1;
+		_sum_   = _sum_   + myDepth;
+		_B_2_   = _B_2_   + myDepth/2^myDepth;
+		_sum2_  = _sum2_  + myDepth^2;
+	}
+	else
+	{
+		if (myDegree > _degree_)
+		{
+			_degree_ = myDegree;
+		}
+
+		if (myDegree == 2)
+		{
+			c2 = c1[1];
+			c1 = c1[0];
+			c1 = _astavl_2[c1];
+			c2 = _astavl_2[c2];
+			
+			if (Abs(c1["Children"])+Abs(c2["Children"]) == 0)
+			{
+				_cherries_ = _cherries_ + 1;
+			}
+		}
+	}
+}
+
+if (is_binary)
+{
+	is_binary = "         Yes";
+}
+else
+{
+	is_binary = "         No";
+}
+
+
+fprintf (stdout, "\nTOPOLOGY FEATURES\n",
+				 "\nLeaves (tips)                    ", Format (_count_,10,0),
+				 "\n(Internal) nodes                 ", Format (_tree_size_-_count_-1,10,0),
+				 "\nIs binary?                       ", is_binary,
+				 "\nMaximal degree                   ", Format (_degree_,10,0),
+				 "\nNumber of Cherries               ", Format (_cherries_,10,0),
+				 
+				 "\n\nASSYMETRY STATISTICS\n",
+				 "\nMean path to root (N bar)        ", Format (_sum_/_count_,10,4), 
+				 "\nVar. path to root (sigma_N^2)    ", Format (_sum2_/_count_-(_sum_/_count_)^2,10,4), 
+				 "\nColless Index (I_C)              ", Format (_I_c_*2/(_count_(_count_-3)+2),10,4), 
+				 "\nShao and Sokal (B_1)             ", Format (_B_1_,10,4), 
+				 "\nShannon entropy (B_2)            ", Format (_B_2_,10,4), 
+"\n");
+				 
+				 
diff --git a/res/UserAddins/AAContent b/res/UserAddins/AAContent
new file mode 100644
index 0000000..c9a5591
--- /dev/null
+++ b/res/UserAddins/AAContent
@@ -0,0 +1,43 @@
+characterOrderIn  = "ACDEFGHIKLMNPQRSTVWY";
+
+
+SetDialogPrompt ("Protein data file:");
+DataSet ds1 = ReadDataFile (PROMPT_FOR_FILE);
+
+
+while (1)
+{
+	fprintf (stdout, "1-based site to map (-1 to stop:):");
+	fscanf  (stdin, "Number", siteToMap);
+	if (siteToMap < 0)
+	{
+		break;
+	}
+	mapSite (siteToMap);
+}
+
+function mapSite (aSite)
+{
+	DataSetFilter 		f1 = CreateFilter (ds1, 1, siteIndex == (aSite-1));
+	HarvestFrequencies (freqs,f1,1,1,1);
+	freqs = freqs * f1.species;
+	
+	rankedMatrix = {20,3}["freqs[_MATRIX_ELEMENT_ROW_]*(_MATRIX_ELEMENT_COLUMN_==0)+(_MATRIX_ELEMENT_COLUMN_==1)*_MATRIX_ELEMENT_ROW_"];
+	for (k=0; k<20; k=k+1)
+	{
+		rankedMatrix[k][2] = rankedMatrix[k][1]/40+rankedMatrix[k][0];
+	}
+	rankedMatrix = rankedMatrix%2;
+	
+	fprintf (stdout, "$");
+	for (k=19; k>=0; k=k-1)
+	{
+		if (rankedMatrix[k][0]<1)
+		{
+			break;
+		}
+		fprintf (stdout, characterOrderIn[rankedMatrix[k][1]], "_{", rankedMatrix[k][0]$1, "}");
+	}
+	fprintf (stdout, "$\n");
+	return 0;	
+}
diff --git a/res/UserAddins/BatchFileByURL b/res/UserAddins/BatchFileByURL
new file mode 100644
index 0000000..2bd9d76
--- /dev/null
+++ b/res/UserAddins/BatchFileByURL
@@ -0,0 +1,9 @@
+fprintf (stdout, "\nHTTP URL:");
+fscanf  (stdin,  "String", theURL);
+
+GetURL  (inCode,theURL);
+
+ExecuteCommands (inCode);
+
+inCode = 0;
+					  
diff --git a/res/UserAddins/BranchLengthCI b/res/UserAddins/BranchLengthCI
new file mode 100644
index 0000000..c2ebe27
--- /dev/null
+++ b/res/UserAddins/BranchLengthCI
@@ -0,0 +1,93 @@
+RequireVersion ("0.9920060424");
+
+treeCount = Rows ("Tree");
+
+if (treeCount > 0)
+{
+	treeChoices = {treeCount,2};
+	for (k=0; k<treeCount; k=k+1)
+	{
+		GetString (treeID, Tree, k);
+		treeChoices [k][0] = treeID;
+		treeChoices [k][1] = "Tree " + treeID;
+	}
+	
+	chosenTree = 0;
+	if (treeCount > 1)
+	{
+		ChoiceList (chosenTree, "Which tree?", 1, SKIP_NONE, treeChoices);
+		if (chosenTree < 0)
+		{
+			return;
+		}
+	}
+	
+	
+	chosenTree = treeChoices[chosenTree][0];
+	
+	mxTreeSpec = {5,1};
+	mxTreeSpec [0] = chosenTree;
+	mxTreeSpec [1] = "8240";
+	mxTreeSpec [2] = "10,50,-10,-300,1";
+	mxTreeSpec [3] = "EXPECTED_NUMBER_OF_SUBSTITUTIONS";
+	mxTreeSpec [4] = "";
+	OpenWindow (TREEWINDOW, mxTreeSpec);	
+	
+	
+	ExecuteCommands ("nodeNames = BranchName(`chosenTree`,-1)");
+	
+	nodeCount = Columns (nodeNames)-1;
+	choiceMatrix = {nodeCount,2};
+	
+	for (bc=0; bc<nodeCount; bc=bc+1)
+	{
+		choiceMatrix[bc][0] = nodeNames   [bc];
+		choiceMatrix[bc][1] = choiceMatrix[bc][0];
+	}
+	
+	ChoiceList  (stOption,"Choose branches to test",1,NO_SKIP,choiceMatrix);
+
+	if (stOption < 0)
+	{
+		return -1;
+	}
+
+	chosenBranch = choiceMatrix[stOption][0];
+
+	lf_Count						    = Rows ("LikelihoodFunction");
+	if (lf_Count > 0)
+	{
+		for (lf_ID = 0; lf_ID < lf_Count; lf_ID = lf_ID + 1)
+		{
+			GetString (treeID, LikelihoodFunction,lf_ID);
+			ExecuteCommands ("GetString(lfInfo,`treeID`,-1);");
+			lfTrees = lfInfo["Trees"];
+			for (k = 0; k<Columns(lfTrees); k=k+1)
+			{
+				if (lfTrees[k] == chosenTree)
+				{
+					break;
+				}
+			}
+			if (k < Columns(lfTrees))
+			{
+				fprintf (stdout, "\nTree ",Columns(lfTrees)," is a part of likelihood function ", treeID, "\n");
+				global			TreeScalerParameter = 1;
+				ExecuteCommands	("ClearConstraints(`chosenTree`);");
+				
+				cte = "ReplicateConstraint (\"this1.`chosenBranch`.?:=TreeScalerParameter*this2.`chosenBranch`.?__\",`chosenTree`,`chosenTree`);";
+				ExecuteCommands(cte);
+
+				COVARIANCE_PRECISION = 0.95;
+				COVARIANCE_PARAMETER = "TreeScalerParameter";
+				ExecuteCommands ("CovarianceMatrix(cmx,"+treeID+");");
+				fprintf (stdout, "\nMultiplicative range ", cmx[0], "-", cmx[2], "\n");
+				ExecuteCommands ("bl = BranchLength (`chosenTree`,stOption)");
+				fprintf (stdout, "\n", chosenBranch, " has a branch length of ", bl, " (", bl*cmx[0],",",bl*cmx[2],")\n");
+				
+			}
+		}
+	}
+	
+}
+
diff --git a/res/UserAddins/CodonMutationToTreeMapper b/res/UserAddins/CodonMutationToTreeMapper
new file mode 100644
index 0000000..4939656
--- /dev/null
+++ b/res/UserAddins/CodonMutationToTreeMapper
@@ -0,0 +1,304 @@
+#include "Includes/MappersHelp.ibf";
+
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function mapSiteToTree (site, mapToAA)
+{
+	TREE_OUTPUT_OPTIONS = {};
+	k = specCount+1;
+	
+	countSubstitutionsInt  = {};
+	countSubstitutionsLeaf = {};
+	
+	/* first sequence is always the root */
+	c1 = dupInfoA[site];
+	for (h=1; h<filteredDataA.species; h=h+1)
+	{
+		p1  = seqToBranchMap[k][0];
+		pid = flatTreeRep[p1];
+		parentName = branchNames [pid];
+		if (Abs(TREE_OUTPUT_OPTIONS[parentName])==0)
+		{
+			parentName = 0;
+		}
+		p2  = seqToBranchMap[pid][1]-specCount;
+		
+		cd1 = codonInfo2[h] [c1];
+		cd2 = codonInfo2[p2][c1];
+		
+		nodeSpec  = {};
+		if (mapToAA)
+		{
+			cd3 = _GC_[cd1];
+			cd3 = codonTo3 [cd3];
+		}		
+		else
+		{
+			cd3 = codeToLetters(correctCode[cd1]);
+		}
+		
+		if (cd1 == cd2)
+		{
+			nodeSpec ["TREE_OUTPUT_BRANCH_COLOR"] = branchColors[2];
+			nodeSpec ["TREE_OUTPUT_BRANCH_LABEL"] = ""+cd3;
+		}
+		else
+		{
+			nodeSpec ["TREE_OUTPUT_BRANCH_LABEL"] = "__FONT_SIZE__ 2 idiv\n__FONT_SIZE__ 3 idiv\nneg\nrmoveto\n("+cd3+") show";
+			
+			if (Abs(parentName))
+			{
+				pinfoavl  = TREE_OUTPUT_OPTIONS[parentName];
+				pbname    = pinfoavl ["TREE_OUTPUT_BRANCH_LABEL"];
+				if (Abs (pbname) < 3)
+				{
+					pinfoavl ["TREE_OUTPUT_BRANCH_LABEL"] = "__FONT_SIZE__ 2 idiv\n__FONT_SIZE__ 3 idiv\nneg\nrmoveto\n("+pbname+") show";
+					TREE_OUTPUT_OPTIONS[parentName] = pinfoavl;
+				}
+			}
+			
+			if (_GC_[cd1] == _GC_[cd2])
+			{
+				nodeSpec ["TREE_OUTPUT_BRANCH_COLOR"] = branchColors[1];
+			}
+			else
+			{
+				nodeSpec ["TREE_OUTPUT_BRANCH_COLOR"] = branchColors[0];	
+				nodeSpec ["TREE_OUTPUT_BRANCH_DASH"] = {{1,4,1}};		
+			}
+			aa1 = _GC_[cd1];
+			aa1 = codonTo3[aa1];
+			aa2 = _GC_[cd2];
+			aa2 = codonTo3[aa2];
+			cd1 = codeToLetters(correctCode[cd1]);
+			cd2 = codeToLetters(correctCode[cd2]);
+			aa1 = cd2+"("+aa2+") to " + cd1 + "(" + aa1 + ")";
+			countSubstitutionsInt[aa1] = countSubstitutionsInt[aa1] + 1;			
+		}
+		
+		cd1 = branchNames[p1];
+		TREE_OUTPUT_OPTIONS[cd1] = nodeSpec;
+		
+		k=k+1;
+	}
+	
+	/* now do the leaves */
+	
+	c2 = dupInfo[site];
+	for (h=0; h<specCount; h=h+1)
+	{
+		p1 = seqToBranchMap[h][0];
+		pid = flatTreeRep[p1];
+		parentName = branchNames [pid];
+		if (Abs(TREE_OUTPUT_OPTIONS[parentName])==0)
+		{
+			parentName = 0;
+		}
+		p2 = seqToBranchMap[pid][1]-specCount;
+		
+		cd2 = codonInfo2[p2][c1];
+		cd1 = codonInfo[h] [c2];
+		
+
+		if (cd1>=0)
+		/* no ambiguities */
+		{
+			nodeSpec  = {};
+			if (mapToAA)
+			{
+				cd3 = _GC_[cd1];
+				cd3 = codonTo3 [cd3];
+			}		
+			else
+			{
+				cd3 = codeToLetters(correctCode[cd1]);
+			}
+			
+			
+			if (cd1 == cd2)
+			{
+				nodeSpec ["TREE_OUTPUT_BRANCH_COLOR"] = branchColors[2];
+				nodeSpec ["TREE_OUTPUT_BRANCH_LABEL"] = "";
+			}
+			else
+			{
+				if (Abs(parentName))
+				{
+					pinfoavl  = TREE_OUTPUT_OPTIONS[parentName];
+					pbname    = pinfoavl ["TREE_OUTPUT_BRANCH_LABEL"];
+					if (Abs (pbname) < 3)
+					{
+						pinfoavl ["TREE_OUTPUT_BRANCH_LABEL"] = "__FONT_SIZE__ 2 idiv\n__FONT_SIZE__ 3 idiv\nneg\nrmoveto\n("+pbname+") show";
+						TREE_OUTPUT_OPTIONS[parentName] = pinfoavl;
+					}
+				}
+				nodeSpec ["TREE_OUTPUT_BRANCH_LABEL"] = "__FONT_SIZE__ 2 idiv\n__FONT_SIZE__ 3 idiv\nneg\nrmoveto\n("+cd3+") show";
+				if (_GC_[cd1] == _GC_[cd2])
+				{
+					nodeSpec ["TREE_OUTPUT_BRANCH_COLOR"] = branchColors[1];
+				}
+				else
+				{
+					nodeSpec ["TREE_OUTPUT_BRANCH_COLOR"] = branchColors[0];			
+					nodeSpec ["TREE_OUTPUT_BRANCH_DASH"] = {{1,4,1}};		
+				}
+				aa1 = _GC_[cd1];
+				aa1 = codonTo3[aa1];
+				aa2 = _GC_[cd2];
+				aa2 = codonTo3[aa2];
+				cd1 = codeToLetters(correctCode[cd1]);
+				cd2 = codeToLetters(correctCode[cd2]);
+				aa1 = cd2+"("+aa2+") to " + cd1 + "(" + aa1 + ")";
+				countSubstitutionsLeaf[aa1] = countSubstitutionsLeaf[aa1] + 1;
+			}
+			
+			cd1 = branchNames[p1];
+			TREE_OUTPUT_OPTIONS[cd1] = nodeSpec;
+		}	
+		else
+		/* ambiguities here */
+		{
+			seqString = seqStrings[h];
+			ExecuteCommands ("GetDataInfo    (ambInfo, `dfID`, h, c2);");
+			nodeSpec  = {};
+			haveSyn = 0;
+			haveNS  = 0;
+			
+			if (Abs(parentName))
+			{
+				pinfoavl  = TREE_OUTPUT_OPTIONS[parentName];
+				pbname    = pinfoavl ["TREE_OUTPUT_BRANCH_LABEL"];
+				if (Abs (pbname) < 3)
+				{
+					pinfoavl ["TREE_OUTPUT_BRANCH_LABEL"] = "__FONT_SIZE__ 2 idiv\n__FONT_SIZE__ 3 idiv\nneg\nrmoveto\n("+pbname+") show";
+					TREE_OUTPUT_OPTIONS[parentName] = pinfoavl;
+				}
+			}
+			
+			
+			ambBName = "";
+			alreadyDone = {};
+			for (k=0; k<stateCharCount; k=k+1)
+			{
+				if (ambInfo[k])
+				{
+					if (k == cd2)
+					{
+						haveSyn = 1;
+					} 
+					else
+					{
+						haveNS = 1;
+					}
+					aa1 = _GC_[k];
+					aa1 = codonTo3[aa1];
+					if (alreadyDone[aa1] == 0)
+					{	
+						alreadyDone[aa1] = 1;
+						if (Abs(ambBName))
+						{
+							ambBName = ambBName+"/"+aa1;
+						}	
+						else
+						{	
+							ambBName = aa1;
+						}
+					}
+				}
+			}	
+
+			if (mapToAA)
+			{
+				nodeSpec ["TREE_OUTPUT_BRANCH_LABEL"] = "__FONT_SIZE__ 2 idiv\n__FONT_SIZE__ 3 idiv\nneg\nrmoveto\n("+ambBName+") show";
+			}
+			else
+			{
+				nodeSpec ["TREE_OUTPUT_BRANCH_LABEL"] = "__FONT_SIZE__ 2 idiv\n__FONT_SIZE__ 3 idiv\nneg\nrmoveto\n("+seqString[3*site][3*site+2]+" ) show";
+			}
+
+			if (haveSyn || haveNS)
+			{
+				aa2 = _GC_[cd2];
+				aa2 = codonTo3[aa2];
+				if (Abs(alreadyDone)>1)
+				{
+					nodeSpec ["TREE_OUTPUT_BRANCH_COLOR"] = branchColors[3];
+					aa1 = "AMB";
+					nodeSpec ["TREE_OUTPUT_BRANCH_DASH"] = {{1,4,1}};		
+				}
+				else
+				{
+					nodeSpec ["TREE_OUTPUT_BRANCH_COLOR"] = branchColors[1];
+					aa1 = aa2;
+				}
+				cd1 = seqString[3*site][3*site+2];
+				cd2 = codeToLetters(correctCode[cd2]);
+				aa1 = cd2+"("+aa2+") to " + cd1 + "(" + aa1 + ")";
+				countSubstitutionsLeaf[aa1] = countSubstitutionsLeaf[aa1] + 1;
+			}
+			else
+			{
+				nodeSpec ["TREE_OUTPUT_BRANCH_COLOR"] = branchColors[0];			
+			}
+			cd1 = branchNames[p1];
+			TREE_OUTPUT_OPTIONS[cd1] = nodeSpec;
+		}
+	}
+		
+	for (aa2 = 0; aa2 < Columns (branchNames); aa2=aa2+1)
+	{
+		parentName = branchNames[aa2];
+		pinfoavl   = TREE_OUTPUT_OPTIONS[parentName];
+		if (Abs(pinfoavl))
+		{
+			pbname    = pinfoavl ["TREE_OUTPUT_BRANCH_LABEL"];
+			if (Abs (pbname) < 3)
+			{
+				pinfoavl ["TREE_OUTPUT_BRANCH_LABEL"] = "";
+				TREE_OUTPUT_OPTIONS[parentName] = pinfoavl;
+			}
+		}
+	}	
+		
+	ExecuteCommands ("psString = PSTreeString (`treeID`,\"EXPECTED_NUMBER_OF_SUBSTITUTIONS\",{{300,600}});");
+	repMx = {{"setfont"}{"setfont\n3 setlinewidth\n1 setlinecap"}};
+	psString = psString ^ repMx;
+	repMx = {{"[0-9] scalefont"}{"11 scalefont"}};
+	psString = psString ^ repMx;
+
+	outResult = {};
+	outResult ["Tree string"] 	  = psString;
+	outResult ["Leaf subs"]   	  = countSubstitutionsLeaf;
+	outResult ["Internal subs"]   = countSubstitutionsInt;
+	
+	return outResult;
+}
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------------------*/
+
+_ChooseCaption = "Select a likelihood function to use";
+#include "Includes/ChooseALF.ibf";
+if (tIndex < 0)
+{
+	return 1;
+}
+
+if (setupMapToTree(0) < 0)
+{
+	return 1;
+}
+
+while (1)
+{
+	fprintf (stdout, "0-based site to map (-1 to stop:):");
+	fscanf  (stdin, "Number", siteToMap);
+	if (siteToMap < 0)
+	{
+		break;
+	}
+	z = mapSiteToTree (siteToMap$1, 1);
+	SetDialogPrompt ("Write tree to:");
+	fprintf (PROMPT_FOR_FILE,CLEAR_FILE,z["Tree string"]);
+	fprintf (stdout, "\nLeaf: ", z["Leaf subs"], "\nInternal: ", z["Internal subs"], "\n");
+}
diff --git a/res/UserAddins/CountSubstitutions b/res/UserAddins/CountSubstitutions
new file mode 100644
index 0000000..8ca4a37
--- /dev/null
+++ b/res/UserAddins/CountSubstitutions
@@ -0,0 +1,88 @@
+/* modified MapSubstitutions to produce a matrix of the number of subs in each nuc subs class 
+Wayne Delport 30 April 2009
+*/
+
+ExecuteAFile  (HYPHY_LIB_DIRECTORY+"TemplateBatchFiles"+
+				DIRECTORY_SEPARATOR+"Utility" + 
+				DIRECTORY_SEPARATOR+"AncestralMapper.bf");
+
+likelihoodFnChoice = 0;
+
+if (Rows("LikelihoodFunction")>1)
+{
+	ChoiceList  (likelihoodFnChoice,"Choose a Likelihood Function",1,NO_SKIP,LikelihoodFunction);
+}		
+
+if (likelihoodFnChoice<0)
+{
+	return;
+} 
+	
+GetString 		(LF_NAME,LikelihoodFunction,likelihoodFnChoice);
+
+ExecuteCommands ("GetString(_lfInfo,"+LF_NAME+",-1);");
+_lfPart			= Columns (_lfInfo["Datafilters"]);
+
+if (_lfPart > 1)
+{
+	choices = {_lfPart, 2};
+	for (k = 0; k < _lfPart; k = k+1)
+	{
+		choices [k][0] =  (_lfInfo["Datafilters"])[k];
+		choices [k][1] =  "Associated tree " + (_lfInfo["Trees"])[k];
+	}
+	ChoiceList  (_lfPart,"Which data filter?",1,NO_SKIP,choices);
+}
+else
+{
+	_lfPart = 0;
+}
+
+if (_lfPart >= 0) {
+	aid = _buildAncestralCacheInternal (LF_NAME, _lfPart, 0);
+	fd  = _filterDimensions (aid);
+	
+	for (k = 0; k < fd[0]; k=k+1)	{
+		temparray = _substitutionsBySite ( aid, k );
+		if ( k == 0 ) {
+			sumArrays = { Columns(temparray["CHARS"]), Columns(temparray["CHARS"]) };
+			for ( r = 0; r < Columns(temparray["CHARS"]); r = r + 1 ) { /* better way to initialize? */
+				for ( c = 0; c < Columns(temparray["CHARS"]); c = c + 1 ) {
+					sumArrays [ r ][ c ] = 0;
+				}
+			}
+		}
+		/* fprintf ( stdout, temparray["COUNTS"], "\n" ); */
+		sumArrays = sumArrays + temparray["COUNTS"];
+	}
+	
+	fprintf ( stdout, "Inferred number of substitutions\n" );
+	fprintf ( stdout, "--------------------------------\n\t" );
+	alphabet = temparray["CHARS"];
+	for ( i = 0; i < Columns(alphabet); i = i + 1 ) {
+		fprintf ( stdout, alphabet[i], "\t");
+	}
+	fprintf ( stdout, "\n" );
+	for ( i = 0; i < Columns(alphabet); i = i + 1 ) {
+		for ( j = 0; j < Columns(alphabet); j = j + 1 ) {
+			if ( j == 0 ) {
+				fprintf ( stdout, alphabet [ i ], "\t" );
+			}
+			if ( i != j ) {
+				fprintf ( stdout, sumArrays [ i ][ j ], "\t" );
+			}
+			else {
+				fprintf ( stdout, "*\t" );
+			}
+		}
+		fprintf ( stdout, "\n" );
+	}
+	
+	/* fprintf ( stdout, sumArrays, "\n" ); */
+	SetDialogPrompt ("Save to:");
+	fprintf (PROMPT_FOR_FILE, CLEAR_FILE, KEEP_OPEN);
+	fprintf ( LAST_FILE_PATH, temparray["CHARS"] );
+	fprintf ( LAST_FILE_PATH, sumArrays, "\n" );
+	fprintf (LAST_FILE_PATH,CLOSE_FILE);
+	_destroyAncestralCache (aid);
+}
diff --git a/res/UserAddins/ExportLikelihoodFunction b/res/UserAddins/ExportLikelihoodFunction
new file mode 100644
index 0000000..7124a72
--- /dev/null
+++ b/res/UserAddins/ExportLikelihoodFunction
@@ -0,0 +1,32 @@
+saveLFO = LIKELIHOOD_FUNCTION_OUTPUT;
+LIKELIHOOD_FUNCTION_OUTPUT = 6;
+likelihoodFnChoice = 0;
+
+if (Rows("LikelihoodFunction")>1)
+{
+	ChoiceList  (likelihoodFnChoice,"Choose a Likelihood Function",1,NO_SKIP,LikelihoodFunction);
+}		
+
+if (likelihoodFnChoice<0)
+{
+	return;
+} 
+	
+GetString (LF_NAME,LikelihoodFunction,likelihoodFnChoice);
+
+SetDialogPrompt ("Save serialized function to:");
+ExecuteCommands ("fprintf(PROMPT_FOR_FILE,CLEAR_FILE,"+LF_NAME+");");
+LIKELIHOOD_FUNCTION_OUTPUT = saveLFO;
+
+saveOutFile  = LAST_FILE_PATH;
+fprintf(MESSAGE_LOG,"Exported ", LF_NAME, " successfully");
+ChoiceList  (doOptimize,"Export LF for optimization",1,NO_SKIP,"Skip optimization","Do not include a command to optimize the likelihood function",
+															   "Do optimization","DO include a command to optimize the likelihood function");
+
+if (doOptimize==1)
+{
+	fscanf (saveOutFile,"Raw",saveLFO);
+	fprintf(saveOutFile,CLEAR_FILE,saveLFO[0][Abs(saveLFO)-5],"\nOptimize(res_", LF_NAME, "," , LF_NAME, ");fprintf(stdout,\"\\n\",",LF_NAME,");\nEND;\n");
+	saveLFO = 0;
+}
+
diff --git a/res/UserAddins/GenBankSequences b/res/UserAddins/GenBankSequences
new file mode 100644
index 0000000..d2f24bf
--- /dev/null
+++ b/res/UserAddins/GenBankSequences
@@ -0,0 +1,32 @@
+ExecuteAFile 	(HYPHY_LIB_DIRECTORY+"TemplateBatchFiles"+DIRECTORY_SEPARATOR+"Utility"+DIRECTORY_SEPARATOR+"ReadDelimitedFiles.bf");
+fprintf (stdout, "\nComma separated list of accession numbers:");
+fscanf	(stdin,"String",accessions);
+
+acList = splitOnRegExp (accessions, "\\,");
+
+allSeqs = "";
+allSeqs * 128;
+
+for (aSeq = 0; aSeq < Abs (acList); aSeq = aSeq + 1)
+{
+	currentAC = acList[aSeq];
+	fprintf (stdout, "Working on ", currentAC, "\n");
+	theURL = "http://www.ncbi.nlm.nih.gov/nuccore/" + currentAC;
+	GetURL  (theData,theURL);
+	obtainGI = theData$("gi\\|([0-9]+)\\|gb");
+	if (obtainGI[0]>=0)
+	{
+		obtainGI = theData[obtainGI[2]][obtainGI[3]];
+		fprintf (stdout, "=>", obtainGI, "\n");
+		
+		theURL = "http://www.ncbi.nlm.nih.gov/sviewer/viewer.fcgi?tool=portal&db=nuccore&val="+obtainGI+"&dopt=fasta&sendto=on&log$=seqview";
+		GetURL  (theData,theURL);
+		allSeqs * (theData + "\n");
+		
+	}
+}
+
+allSeqs * 0;
+
+SetDialogPrompt ("Save FASTA to:");
+fprintf (PROMPT_FOR_FILE, CLEAR_FILE, allSeqs);
diff --git a/res/UserAddins/Includes/ChooseALF.ibf b/res/UserAddins/Includes/ChooseALF.ibf
new file mode 100644
index 0000000..84eb452
--- /dev/null
+++ b/res/UserAddins/Includes/ChooseALF.ibf
@@ -0,0 +1,32 @@
+avLFCount = Rows ("LikelihoodFunction");
+
+tIndex = -1;
+
+if (avLFCount>=1)
+{
+	choices = {avLFCount,2};
+	for (k=0; k<avLFCount;k=k+1)
+	{
+		GetString (tName, LikelihoodFunction, k);
+		choices[k][0] = tName;
+		choices[k][1] = "Function "+tName;
+	}
+	
+	if (avLFCount > 1)
+	{
+		ChoiceList (tIndex,_ChooseCaption,1,SKIP_NONE,choices);
+	}
+	else
+	{
+		tIndex = 0;
+	}
+	
+	if (tIndex >= 0)
+	{
+		_chosenLFName = choices[tIndex][0];
+	}
+}
+else
+{
+	fprintf (stdout, "[ERROR] No likelihood functions found in memory\n");
+}
diff --git a/res/UserAddins/Includes/MappersHelp.ibf b/res/UserAddins/Includes/MappersHelp.ibf
new file mode 100644
index 0000000..00ee649
--- /dev/null
+++ b/res/UserAddins/Includes/MappersHelp.ibf
@@ -0,0 +1,202 @@
+MESSAGE_LOGGING = 0;
+
+branchColors = {};
+
+branchColors [0] = {{255,0,0}}*(1/255); 		/* red */
+branchColors [3] = {{64,0,128}}*(1/255); 		/* eggplant */
+branchColors [2] = {{0,0,0}};   	/* light gray */
+branchColors [1] = {{0,128,0}}*(1/255);   		/* clover */
+
+codonTo3 = {};
+
+codonOffset = 0;
+
+codonTo3[0] = "F";
+codonTo3[1] = "L";
+codonTo3[2] = "I";
+codonTo3[3] = "M";
+codonTo3[4] = "V";
+codonTo3[5] = "S";
+codonTo3[6] = "P";
+codonTo3[7] = "T";
+codonTo3[8] = "A";
+codonTo3[9] = "Y";
+codonTo3[10] = "Stop";
+codonTo3[11] = "H";
+codonTo3[12] = "Q";
+codonTo3[13] = "N";
+codonTo3[14] = "K";
+codonTo3[15] = "D";
+codonTo3[16] = "E";
+codonTo3[17] = "C";
+codonTo3[18] = "W";
+codonTo3[19] = "R";
+codonTo3[20] = "G";
+
+nucCharacters = "ACGT";
+
+/*-----------------------------------------------------------------------------------------------*/
+
+function codeToLetters (codonCode)
+{
+	return nucCharacters[codonCode$16]+nucCharacters[(codonCode%16)$4]+nucCharacters[codonCode%4];	
+}
+
+/*-----------------------------------------------------------------------------------------------*/
+
+function setupMapToTree (dummy)
+{
+	ExecuteAFile 	(HYPHY_LIB_DIRECTORY+"TemplateBatchFiles"+DIRECTORY_SEPARATOR+"TemplateModels"+DIRECTORY_SEPARATOR+"chooseGeneticCode.def");
+	ExecuteCommands ("DataSet ancestralSeqs  = ReconstructAncestors (`_chosenLFName`);GetString(lfInfo,`_chosenLFName`,-1);");
+	
+	treeCount = Columns (lfInfo["Trees"]);
+	if (treeCount == 1)
+	{
+		treeID = (lfInfo["Trees"])[0];
+		dfID   = (lfInfo["Datafilters"])[0];
+	}	
+	else /* decide which tree to work with */
+	{
+		choiceList = {treeCount,2};
+		for (h=0; h<treeCount; h=h+1)
+		{
+			choiceList [h][0] = (lfInfo["Trees"])[h];
+			choiceList [h][1] = "Use tree " + choiceList [h][0];
+		}
+		ChoiceList (treeID, "Select the tree to use for mapping", 1, SKIP_NONE, choiceList);
+		if (treeID < 0)
+		{
+			return -1;
+		}
+		dfID   = (lfInfo["Datafilters"])[treeID];
+		treeID = (lfInfo["Trees"])[treeID];
+	}
+	
+	/* make a list of the sites to be included in the filter */
+	ExecuteCommands ("theOO = `dfID`.site_map;");
+	useSites = {};
+	for (h=0; h<Columns(theOO); h=h+1)
+	{
+		useSites[theOO[h]] = 1;
+	}
+	
+	
+	fprintf (stdout, "[INFO] Using tree ", treeID, " on datafilter ", dfID, "\n");
+	DataSetFilter	filteredDataA  = CreateFilter(ancestralSeqs,3,useSites[siteIndex],"",GeneticCodeExclusions);
+	ExecuteCommands ("HarvestFrequencies (observedCEFV,`dfID`,3,3,0);specCount = `dfID`.species; siteCount = `dfID`.sites; uSiteCount = `dfID`.unique_sites\n");
+
+	stateCharCount = 64;
+
+	for (h=0; h<64; h=h+1)
+	{
+		if (_Genetic_Code[h] == 10)
+		{
+			stateCharCount = stateCharCount -1;
+		}
+	}
+	
+	ambChoice = 1;
+	seqToBranchMap = {stateCharCount,1};
+
+	hShift = 0;
+
+	_GC_ 		= {stateCharCount,1};
+	correctCode = {stateCharCount,1};
+
+	for (k=0; k<64; k=k+1)
+	{
+		if (_Genetic_Code[k]==10)
+		{
+			hShift = hShift+1;
+		}
+		else
+		{
+			seqToBranchMap[k-hShift] = observedCEFV[k];
+			_GC_[k-hShift]			 = _Genetic_Code[k];
+			correctCode[k-hShift] 	 = k;
+		}
+	}
+
+	observedCEFV = seqToBranchMap;
+	ExecuteCommands ("branchNames  = BranchName (`treeID`,-1);");
+	h 			 = Columns (branchNames);
+
+	seqToBranchMap 	= {h, 2};
+	/* maps sequence names to branch order in column 1 
+	   and the other way around in column 2 */
+
+	for (k=0; k<specCount; k=k+1)
+	{	
+		ExecuteCommands("GetString (seqName, `dfID`, k);");
+		seqToBranchMap[k][0] = -1;
+		for (v=0; v<h; v=v+1)
+		{
+			if (branchNames[v] % seqName)
+			{
+				seqToBranchMap[k][0] = v;
+				seqToBranchMap[v][1] = k;
+				break;
+			}
+		}
+	}
+
+	seqToBranchMap[specCount][0] = h-1;
+	seqToBranchMap[h-1][1] = specCount;
+
+
+	for (k=1; k<filteredDataA.species; k=k+1)
+	{
+		GetString (seqName, filteredDataA, k);
+		seqToBranchMap[specCount+k][0] = -1;
+		for (v=0; v<h; v=v+1)
+		{
+			if (branchNames[v] % seqName)
+			{
+				seqToBranchMap[k+specCount][0] = v;
+				seqToBranchMap[v][1] = k+specCount;
+				break;
+			}
+		}
+	}
+
+	ExecuteCommands ("GetDataInfo    (dupInfo, `dfID`);");
+	GetDataInfo	    (dupInfoA, filteredDataA);
+
+	matrixTrick  = {1,stateCharCount}["_MATRIX_ELEMENT_COLUMN_"];
+	matrixTrick2 = {1,stateCharCount}["1"];
+
+	codonInfo  = {specCount, uSiteCount};
+	codonInfo2 = {filteredDataA.species, filteredDataA.unique_sites};
+
+	ExecuteCommands ("GetDataInfo    (dupInfo, `dfID`);");
+	GetDataInfo	   (dupInfoA, filteredDataA);
+
+	for (v=0; v<uSiteCount;v=v+1)
+	{
+		for (h=0; h<specCount;h=h+1)
+		{
+			ExecuteCommands("GetDataInfo (siteInfo, `dfID`, h, v);");
+			_SITE_ES_COUNT = matrixTrick2 * siteInfo; 
+			if (_SITE_ES_COUNT[0] == 1)
+			{
+				codonInfo[h][v] = (matrixTrick * siteInfo)[0];
+			}
+			else
+			{
+				codonInfo[h][v] = -1;
+			}
+		}
+	}
+
+	for (v=0; v<filteredDataA.unique_sites;v=v+1)
+	{
+		for (h=0; h<filteredDataA.species;h=h+1)
+		{
+			GetDataInfo (siteInfo, filteredDataA, h, v);
+			codonInfo2[h][v] = (matrixTrick * siteInfo)[0];
+		}
+	}
+
+	ExecuteCommands ("flatTreeRep	  = Abs (`treeID`); GetInformation  (seqStrings, `dfID`);");
+	return 0;
+}
diff --git a/res/UserAddins/Includes/MappersHelpAA.ibf b/res/UserAddins/Includes/MappersHelpAA.ibf
new file mode 100644
index 0000000..885f21e
--- /dev/null
+++ b/res/UserAddins/Includes/MappersHelpAA.ibf
@@ -0,0 +1,139 @@
+MESSAGE_LOGGING = 0;
+
+branchColors = {};
+
+branchColors [0] = {{255,0,0}}*(1/255); 		/* red */
+branchColors [3] = {{64,0,128}}*(1/255); 		/* eggplant */
+branchColors [2] = {{0,0,0}};   	/* light gray */
+branchColors [1] = {{0,128,0}}*(1/255);   		/* clover */
+
+codonTo3 	= {};
+codonOffset = 0;
+AAString 	= "ACDEFGHIKLMNPQRSTVWY";
+
+
+/*-----------------------------------------------------------------------------------------------*/
+
+function setupMapToTree (dummy)
+{
+	ExecuteCommands ("DataSet ancestralSeqs  = ReconstructAncestors (`_chosenLFName`);GetString(lfInfo,`_chosenLFName`,-1);");
+	
+	treeCount = Columns (lfInfo["Trees"]);
+	if (treeCount == 1)
+	{
+		treeID = (lfInfo["Trees"])[0];
+		dfID   = (lfInfo["Datafilters"])[0];
+	}	
+	else /* decide which tree to work with */
+	{
+		choiceList = {treeCount,2};
+		for (h=0; h<treeCount; h=h+1)
+		{
+			choiceList [h][0] = (lfInfo["Trees"])[h];
+			choiceList [h][1] = "Use tree " + choiceList [h][0];
+		}
+		ChoiceList (treeID, "Select the tree to use for mapping", 1, SKIP_NONE, choiceList);
+		if (treeID < 0)
+		{
+			return -1;
+		}
+		dfID   = (lfInfo["Datafilters"])[treeID];
+		treeID = (lfInfo["Trees"])[treeID];
+	}
+	
+	/* make a list of the sites to be included in the filter */
+	ExecuteCommands ("theOO = `dfID`.site_map;");
+	useSites = {};
+	for (h=0; h<Columns(theOO); h=h+1)
+	{
+		useSites[theOO[h]] = 1;
+	}
+	
+	
+	fprintf (stdout, "[INFO] Using tree ", treeID, " on datafilter ", dfID, "\n");
+	DataSetFilter	filteredDataA  = CreateFilter(ancestralSeqs,1,useSites[siteIndex]);
+	ExecuteCommands ("HarvestFrequencies (observedCEFV,`dfID`,1,1,1);specCount = `dfID`.species; siteCount = `dfID`.sites; uSiteCount = `dfID`.unique_sites\n");
+
+	ExecuteCommands ("branchNames  = BranchName (`treeID`,-1);");
+	h 			 = Columns (branchNames);
+
+	seqToBranchMap 	= {h, 2};
+	/* maps sequence names to branch order in column 1 
+	   and the other way around in column 2 */
+
+	for (k=0; k<specCount; k=k+1)
+	{	
+		ExecuteCommands("GetString (seqName, `dfID`, k);");
+		seqToBranchMap[k][0] = -1;
+		for (v=0; v<h; v=v+1)
+		{
+			if (branchNames[v] % seqName)
+			{
+				seqToBranchMap[k][0] = v;
+				seqToBranchMap[v][1] = k;
+				break;
+			}
+		}
+	}
+
+	seqToBranchMap[specCount][0] = h-1;
+	seqToBranchMap[h-1][1] = specCount;
+
+
+	for (k=1; k<filteredDataA.species; k=k+1)
+	{
+		GetString (seqName, filteredDataA, k);
+		seqToBranchMap[specCount+k][0] = -1;
+		for (v=0; v<h; v=v+1)
+		{
+			if (branchNames[v] % seqName)
+			{
+				seqToBranchMap[k+specCount][0] = v;
+				seqToBranchMap[v][1] = k+specCount;
+				break;
+			}
+		}
+	}
+
+	ExecuteCommands ("GetDataInfo    (dupInfo, `dfID`);");
+	GetDataInfo	    (dupInfoA, filteredDataA);
+	
+	stateCharCount	= 20;
+	matrixTrick  	= {1,stateCharCount}["_MATRIX_ELEMENT_COLUMN_"];
+	matrixTrick2 	= {1,stateCharCount}["1"];
+
+	residueInfo  = {specCount, uSiteCount};
+	residueInfo = {filteredDataA.species, filteredDataA.unique_sites};
+
+	ExecuteCommands ("GetDataInfo    (dupInfo, `dfID`);");
+	GetDataInfo	   (dupInfoA, filteredDataA);
+
+	for (v=0; v<uSiteCount;v=v+1)
+	{
+		for (h=0; h<specCount;h=h+1)
+		{
+			ExecuteCommands("GetDataInfo (siteInfo, `dfID`, h, v);");
+			_SITE_ES_COUNT = matrixTrick2 * siteInfo; 
+			if (_SITE_ES_COUNT[0] == 1)
+			{
+				residueInfo[h][v] = (matrixTrick * siteInfo)[0];
+			}
+			else
+			{
+				residueInfo[h][v] = -1;
+			}
+		}
+	}
+
+	for (v=0; v<filteredDataA.unique_sites;v=v+1)
+	{
+		for (h=0; h<filteredDataA.species;h=h+1)
+		{
+			GetDataInfo (siteInfo, filteredDataA, h, v);
+			residueInfo[h][v] = (matrixTrick * siteInfo)[0];
+		}
+	}
+
+	ExecuteCommands ("flatTreeRep	  = Abs (`treeID`); GetInformation  (seqStrings, `dfID`);");
+	return 0;
+}
diff --git a/res/UserAddins/LRT b/res/UserAddins/LRT
new file mode 100644
index 0000000..39957eb
--- /dev/null
+++ b/res/UserAddins/LRT
@@ -0,0 +1,10 @@
+fprintf (stdout, "Log-likelihood for the null model:");
+fscanf (stdin, "Number", L_0);
+
+fprintf (stdout, "Log-likelihood for the alternative model:");
+fscanf (stdin, "Number", L_A);
+
+fprintf (stdout, "Difference in degrees of freedom:");
+fscanf (stdin, "Number", df);
+
+fprintf (stdout, "\np=", 1-CChi2(2(L_A-L_0),df), "\n" );
diff --git a/res/UserAddins/ListUserFunctions b/res/UserAddins/ListUserFunctions
new file mode 100644
index 0000000..7b8b86c
--- /dev/null
+++ b/res/UserAddins/ListUserFunctions
@@ -0,0 +1,21 @@
+ufc = Rows("UserFunction");
+if (ufc)
+{
+	fprintf (stdout, "\n\n*** There are ", ufc, " user functions in memory ***");
+	for (ufi = 0; ufi < ufc; ufi = ufi + 1)
+	{
+		GetString (finfo,UserFunction,ufi);
+		fargs = finfo["Arguments"];
+		fprintf (stdout, "\n\n\tFunction ", finfo["ID"], " with ", Columns (fargs), " arguments\n");
+		for (uac = 0; uac < Columns (fargs); uac = uac+1)
+		{
+			fprintf (stdout, "\n\t\tArgument ", Format (uac+1,5,0), ": ", fargs[uac]);
+		}
+		fprintf (stdout, "\n");
+	}
+}
+else
+{
+	fprintf (stdout, "\n\nNo user functions have been defined\n\n");
+}
+					  
diff --git a/res/UserAddins/MapSubstitutions b/res/UserAddins/MapSubstitutions
new file mode 100644
index 0000000..e50eb05
--- /dev/null
+++ b/res/UserAddins/MapSubstitutions
@@ -0,0 +1,97 @@
+ExecuteAFile(HYPHY_LIB_DIRECTORY + "TemplateBatchFiles" + DIRECTORY_SEPARATOR + "Utility" + DIRECTORY_SEPARATOR + "AncestralMapper.bf");
+
+likelihoodFnChoice = 0;
+
+if (Rows("LikelihoodFunction")>1)
+{
+	ChoiceList  (likelihoodFnChoice,"Choose a Likelihood Function",1,NO_SKIP,LikelihoodFunction);
+}		
+
+if (likelihoodFnChoice<0)
+{
+	return;
+} 
+	
+GetString 		(LF_NAME,LikelihoodFunction,likelihoodFnChoice);
+
+ExecuteCommands ("GetString(_lfInfo,"+LF_NAME+",-1);");
+_lfPart			= Columns (_lfInfo["Datafilters"]);
+
+if (_lfPart > 1)
+{
+	choices = {_lfPart, 2};
+	for (k = 0; k < _lfPart; k = k+1)
+	{
+		choices [k][0] =  (_lfInfo["Datafilters"])[k];
+		choices [k][1] =  "Associated tree " + (_lfInfo["Trees"])[k];
+	}
+	ChoiceList  (_lfPart,"Which data filter?",1,NO_SKIP,choices);
+}
+else
+{
+	_lfPart = 0;
+}
+
+if (_lfPart >= 0)
+{
+	aid = _buildAncestralCacheInternal (LF_NAME, _lfPart, 0);
+	fd  = _filterDimensions (aid);
+	
+	ChoiceList  (formatChoice,"Output format",1,NO_SKIP,"Newick","Generate a list of annotated Newick trees",
+							  "PostScript","Generate a PostScript file with mapped substitutions for each site");
+							  
+	
+	if (formatChoice>=0)
+	{
+		ChoiceList  (labelChoice,"Label with",1,NO_SKIP,"Inferred character states","Each node is annotated with the observed or inferred character",
+								 					    "Substitutions","Branches where substitutions were inferred are annotated as X->Y.",
+								 					    "Syn/NS","[FOR CODON DATA] Color branches by whether they have synonymous or non-synonymous substitutions");
+		if (labelChoice>=0)
+		{
+			SetDialogPrompt ("Save to:");
+			fprintf (PROMPT_FOR_FILE, CLEAR_FILE, KEEP_OPEN);
+			
+			if (labelChoice == 2)
+			{
+				LoadFunctionLibrary ("chooseGeneticCode");
+				LoadFunctionLibrary ("CodonTools.def");
+			}
+			
+			for (k = 0; k < fd[0]; k += 1)
+			{
+
+				if (labelChoice == 0)
+				{
+					if (formatChoice == 0)
+					{
+						fprintf (LAST_FILE_PATH, "Tree T_", (k+1), " = ", _mapCharactersBySiteNewick (aid, k, 1), ";\n");
+					}
+					else
+					{
+						fprintf (LAST_FILE_PATH, _mapCharactersBySite (aid, k, 1), "\n");			
+					}				
+				}
+				else
+				{
+					if (formatChoice == 0)
+					{
+						fprintf (LAST_FILE_PATH, "Tree T_", (k+1), " = ", _mapSubstitutionsBySiteNewick (aid, k, 1), ";\n");
+					}
+					else
+					{
+						if (labelChoice == 1)
+						{
+							fprintf (LAST_FILE_PATH, _mapSubstitutionsBySite (aid, k, 1), "\n");		
+						}
+						else
+						{
+							fprintf (LAST_FILE_PATH, _mapSNSBySite (aid, k, 1), "\n");								
+						}	
+					}
+				}
+			}
+			fprintf (LAST_FILE_PATH,CLOSE_FILE);
+		}
+	}
+	_destroyAncestralCache (aid);
+}
diff --git a/res/UserAddins/MeanPairwiseDivergence b/res/UserAddins/MeanPairwiseDivergence
new file mode 100644
index 0000000..a9f6d78
--- /dev/null
+++ b/res/UserAddins/MeanPairwiseDivergence
@@ -0,0 +1,70 @@
+treeCount = Rows ("Tree");
+
+if (treeCount > 0)
+{
+	treeChoices = {treeCount,2};
+	for (k=0; k<treeCount; k=k+1)
+	{
+		GetString (treeID, Tree, k);
+		treeChoices [k][0] = treeID;
+		treeChoices [k][1] = "Tree " + treeID;
+	}
+	
+	chosenTree = 0;
+	if (treeCount > 1)
+	{
+		ChoiceList (chosenTree, "Which tree?", 1, SKIP_NONE, treeChoices);
+		if (chosenTree < 0)
+		{
+			return;
+		}
+	}
+	
+	LoadFunctionLibrary("TreeFunctions");
+	
+	computeMultFactors  (treeChoices[chosenTree][0]);
+
+
+	divInfo 		=	 computeTotalDivergence (treeChoices[chosenTree][0]);
+	pInfo 			= 	2*divInfo[0]/leafCount/(leafCount-1);
+	currentDepth	= 	divInfo[1]/(Abs(treeAVL2)-2);
+	
+	fprintf (stdout, "Mean pairwise divergence for ",treeChoices[chosenTree][0], " is ", pInfo, 	   "\n");
+	fprintf (stdout, "Mean branch length for ",      treeChoices[chosenTree][0], " is ", currentDepth, "\n");
+
+	lf_Count						    = Rows ("LikelihoodFunction");
+	if (lf_Count > 0)
+	{
+		for (lf_ID = 0; lf_ID < lf_Count; lf_ID = lf_ID + 1)
+		{
+			GetString (treeID, LikelihoodFunction,lf_ID);
+			GetString(lfInfo,^treeID,-1);
+			lfTrees = lfInfo["Trees"];
+			for (k = 0; k<Columns(lfTrees); k=k+1)
+			{
+				if (lfTrees[k] == treeChoices[chosenTree][0])
+				{
+					break;
+				}
+			}
+			if (k < Columns(lfTrees))
+			{
+				fprintf (stdout, "\nTree ",Columns(lfTrees)," is a part of likelihood function ", treeID, "\n");
+				global			TreeScalerParameter = 1;
+				COVARIANCE_PARAMETER = "TreeScalerParameter";
+				ExecuteCommands	("ClearConstraints("+treeChoices[chosenTree][0]+");ReplicateConstraint (\"this1.?.?:=TreeScalerParameter*this2.?.?__\","+treeChoices[chosenTree][0]+","+treeChoices[chosenTree][0]+");\n");
+				
+				COVARIANCE_PRECISION = 0.95;
+				ExecuteCommands ("CovarianceMatrix(cmx,"+treeID+");");
+				fprintf (stdout, "\nMultiplicative range ", cmx[0], "-", cmx[2], "\n");
+				fprintf (stdout, "Mean pairwise divergence: ", pInfo, " (", pInfo*cmx[0],",",pInfo*cmx[2],")\n");
+				fprintf (stdout, "Mean branch length divergence: ", currentDepth, " (", currentDepth*cmx[0],",",currentDepth*cmx[2],")\n");
+				
+				return {"MEAN PAIRWISE DIVERGENCE": {{pInfo, pInfo*cmx[0], pInfo*cmx[2]}},
+						"MEAN BRANCH LENGTH": {{currentDepth, currentDepth*cmx[0],currentDepth*cmx[2]}}}; 
+			}
+		}
+	}
+	
+}
+
diff --git a/res/UserAddins/MeanPairwiseDivergenceSubset b/res/UserAddins/MeanPairwiseDivergenceSubset
new file mode 100644
index 0000000..1854037
--- /dev/null
+++ b/res/UserAddins/MeanPairwiseDivergenceSubset
@@ -0,0 +1,161 @@
+treeCount = Rows ("Tree");
+
+if (treeCount > 0)
+{
+	treeChoices = {treeCount,2};
+	for (k=0; k<treeCount; k=k+1)
+	{
+		GetString (treeID, Tree, k);
+		treeChoices [k][0] = treeID;
+		treeChoices [k][1] = "Tree " + treeID;
+	}
+	
+	chosenTree = 0;
+	if (treeCount > 1)
+	{
+		ChoiceList (chosenTree, "Which tree?", 1, SKIP_NONE, treeChoices);
+		if (chosenTree < 0)
+		{
+			return;
+		}
+	}
+	
+	fprintf (stdout, "Enter a regular expression to pick a subset of leaves: ");
+	fscanf  (stdin,  "String", regExp);
+		
+	ExecuteCommands ("treeAVL2 = "+treeChoices[chosenTree][0] + " ^ 0;bn = BranchName("+treeChoices[chosenTree][0]+",-1);"); 
+	
+	leafCount   = 0;
+	matchedNodes	= {};
+	for (k=0; k<Columns (bn)-1; k=k+1)
+	{
+		rem = bn[k] $ regExp;
+		if (rem[0]>=0)
+		{
+			leafCount = leafCount + 1;
+			rem = bn[k];
+			matchedNodes [rem] = 1;
+		}
+	}
+	
+	multFactors 	= {};
+	
+	for (k=1; k<Abs(treeAVL2); k=k+1)
+	{
+		aNode 		= treeAVL2[k];
+		aNodeName 	= aNode["Name"];
+		parentIndex = aNode["Parent"];
+		k2 			= Abs(aNode["Children"]);
+		
+		if (k2)
+		{
+			currentDepth = aNode["Below"];
+			multFactors[aNodeName] = currentDepth;		
+			if (currentDepth > 0 && currentDepth < leafCount)
+			{
+				fprintf (stdout, "Tagged internal node ", aNodeName, "\n");
+				matchedNodes [aNodeName] = 1;
+			}
+			if (parentIndex > 0 && currentDepth < leafCount)
+			{
+				pInfo = treeAVL2[parentIndex];
+				pInfo ["Below"] = pInfo ["Below"] + currentDepth;
+				treeAVL2[parentIndex] = pInfo;
+			}
+		}
+		else
+		{
+			rem 							= aNodeName $ regExp;
+			if (rem[0] >= 0)
+			{
+				fprintf 						(stdout, "Matched leaf ", aNodeName, "\n");
+				multFactors[aNodeName] 			= 1;
+				pInfo 							= treeAVL2[parentIndex];
+				pInfo ["Below"] 				= pInfo ["Below"] + 1;
+				treeAVL2[parentIndex] 			= pInfo;
+			}
+		}
+		
+	}
+
+	if (leafCount  < 2)
+	{
+		fprintf (stdout, "\nERROR: only matched ", leafCount, " leaves, but needed at least 2.\n");
+		return 0;
+	}
+	fprintf (stdout, "\nMatched ", leafCount, " leaves.\n");
+	
+	pKeys 			= Rows(multFactors);
+
+	for (k=0; k<Columns(pKeys); k=k+1)
+	{
+		aNodeName = pKeys[k];
+		multFactors[aNodeName] = multFactors[aNodeName] * (leafCount-multFactors[aNodeName]);
+	}
+
+	divInfo 		=	 computeTotalDivergence (treeChoices[chosenTree][0]);
+	pInfo 			= 	2*divInfo[0]/leafCount/(leafCount-1);
+	currentDepth	= 	divInfo[1]/(Abs(treeAVL2)-2);
+	
+	fprintf (stdout, "Mean pairwise divergence for ",treeChoices[chosenTree][0], " is ", pInfo, 	   "\n");
+	fprintf (stdout, "Mean branch length for ",      treeChoices[chosenTree][0], " is ", currentDepth, "\n");
+
+	lf_Count						    = Rows ("LikelihoodFunction");
+	if (lf_Count > 0)
+	{
+		for (lf_ID = 0; lf_ID < lf_Count; lf_ID = lf_ID + 1)
+		{
+			GetString (treeID, LikelihoodFunction,lf_ID);
+			ExecuteCommands ("GetString(lfInfo,"+treeID+",-1);");
+			lfTrees = lfInfo["Trees"];
+			for (k = 0; k<Columns(lfTrees); k=k+1)
+			{
+				if (lfTrees[k] == treeChoices[chosenTree][0])
+				{
+					break;
+				}
+			}
+			if (k < Columns(lfTrees))
+			{
+				fprintf (stdout, "\nTree ",Columns(lfTrees)," is a part of likelihood function ", treeID, "\n");
+				global			TreeScalerParameter = 1;
+				ExecuteCommands	("ClearConstraints("+treeChoices[chosenTree][0]+");");
+				
+				mNodeNames = Rows (matchedNodes);
+				for (k2 = 0; k2 < Abs(matchedNodes); k2 = k2 + 1)
+				{
+					cte = "ReplicateConstraint (\"this1."+mNodeNames[k2]+".?:=TreeScalerParameter*this2."+mNodeNames[k2]+".?__\","+treeChoices[chosenTree][0]+","+treeChoices[chosenTree][0]+");\n";
+					ExecuteCommands(cte);
+				}
+				COVARIANCE_PRECISION = 0.95;
+				COVARIANCE_PARAMETER = "TreeScalerParameter";
+				ExecuteCommands ("CovarianceMatrix(cmx,"+treeID+");");
+				fprintf (stdout, "\nMultiplicative range ", cmx[0], "-", cmx[2], "\n");
+				fprintf (stdout, "Mean pairwise divergence: ", pInfo, " (", pInfo*cmx[0],",",pInfo*cmx[2],")\n");
+				fprintf (stdout, "Mean branch length divergence: ", currentDepth, " (", currentDepth*cmx[0],",",currentDepth*cmx[2],")\n");
+				
+			}
+		}
+	}
+	
+}
+
+/*---------------------------------------------------------*/
+
+function computeTotalDivergence (treeID)
+{
+	ExecuteCommands ("bNames = BranchName   ("+treeID+",-1);");
+	ExecuteCommands ("bLen   = BranchLength ("+treeID+",-1);");
+	
+	sum  = 0;
+	sum2 = 0;
+	
+	for (k=0; k<Columns(bNames); k=k+1)
+	{
+		aNodeName = bNames[k];
+		sum  = sum  + bLen[k]*multFactors[aNodeName];
+		sum2 = sum2 + bLen[k]*(multFactors[aNodeName]>0);
+	}	
+	return {{sum,sum2}};
+}
+
diff --git a/res/UserAddins/ModelCounter b/res/UserAddins/ModelCounter
new file mode 100644
index 0000000..dedea14
--- /dev/null
+++ b/res/UserAddins/ModelCounter
@@ -0,0 +1,39 @@
+function StirlingNumberOf2ndKind (N,k)
+{
+	SN  :< 1e300;
+	kF	:< 1e300;
+	CF  :< 1e300;
+	
+	SN  = 0;
+	kF  = 1;
+	m1t = 1;
+	CF	= 1;
+	
+	for (i=0; i<k; i=i+1)
+	{
+		SN = SN + m1t*CF*(k-i)^N;
+		m1t = -m1t;
+		CF	= CF * (k-i)/(i+1);
+		kF = kF*(i+1);
+	}
+	
+	return SN/kF;
+}
+
+fprintf (stdout, "Model Dimension: ");
+fscanf  (stdin, "Number", modelD);
+
+maxParameterCount = modelD*(modelD-1)/2;
+
+fprintf (stdout, "\nMaximum number of rate parameters is ", maxParameterCount,
+				 "\n\n\nRates                   Models\n");
+totalModelCount = 0;
+
+for (rc = 1; rc <= maxParameterCount; rc = rc+1)
+{
+	SNr = StirlingNumberOf2ndKind (maxParameterCount,rc);
+	fprintf (stdout, Format(rc,5,0),Format (SNr, 25, 0), "\n");
+	totalModelCount = totalModelCount + SNr;
+}
+
+fprintf (stdout, "\n\nTotal model count: ", Format(totalModelCount,15,0), "\n");
diff --git a/res/UserAddins/OldAddins/AAMutationCounter b/res/UserAddins/OldAddins/AAMutationCounter
new file mode 100644
index 0000000..22cc66f
--- /dev/null
+++ b/res/UserAddins/OldAddins/AAMutationCounter
@@ -0,0 +1,311 @@
+#include "Includes/MappersHelp.ibf";
+
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function mapSiteToTree (site)
+{
+	TREE_OUTPUT_OPTIONS = {};
+	k = specCount+1;
+	
+	countSubstitutionsInt  = {};
+	countSubstitutionsLeaf = {};
+	
+	/* first sequence is always the root */
+	c1 = dupInfoA[site];
+	for (h=1; h<filteredDataA.species; h=h+1)
+	{
+		p1  = seqToBranchMap[k][0];
+		pid = flatTreeRep[p1];
+		parentName = branchNames [pid];
+		
+		if (Abs(TREE_OUTPUT_OPTIONS[parentName])==0)
+		{
+			parentName = 0;
+		}
+		p2  = seqToBranchMap[pid][1]-specCount;
+		
+		cd1 = residueInfo2[h] [c1];
+		cd2 = residueInfo2[p2][c1];
+				
+		if (cd1 == cd2)
+		{
+			nodeSpec ["TREE_OUTPUT_BRANCH_COLOR"] = branchColors[2];
+			nodeSpec ["TREE_OUTPUT_BRANCH_LABEL"] = ""+cd3;
+		}
+		else
+		{
+			nodeSpec ["TREE_OUTPUT_BRANCH_LABEL"] = "__FONT_SIZE__ 2 idiv\n__FONT_SIZE__ 3 idiv\nneg\nrmoveto\n("+cd3+") show";
+			
+			if (Abs(parentName))
+			{
+				pinfoavl  = TREE_OUTPUT_OPTIONS[parentName];
+				pbname    = pinfoavl ["TREE_OUTPUT_BRANCH_LABEL"];
+				if (Abs (pbname) < 3)
+				{
+					pinfoavl ["TREE_OUTPUT_BRANCH_LABEL"] = "__FONT_SIZE__ 2 idiv\n__FONT_SIZE__ 3 idiv\nneg\nrmoveto\n("+pbname+") show";
+					TREE_OUTPUT_OPTIONS[parentName] = pinfoavl;
+				}
+			}
+			
+			if (_GC_[cd1] == _GC_[cd2])
+			{
+				nodeSpec ["TREE_OUTPUT_BRANCH_COLOR"] = branchColors[1];
+			}
+			else
+			{
+				nodeSpec ["TREE_OUTPUT_BRANCH_COLOR"] = branchColors[0];	
+				nodeSpec ["TREE_OUTPUT_BRANCH_DASH"] = {{1,4,1}};		
+			}
+			aa1 = _GC_[cd1];
+			aa1 = codonTo3[aa1];
+			aa2 = _GC_[cd2];
+			aa2 = codonTo3[aa2];
+			cd1 = codeToLetters(correctCode[cd1]);
+			cd2 = codeToLetters(correctCode[cd2]);
+			aa1 = cd2+"("+aa2+") to " + cd1 + "(" + aa1 + ")";
+			countSubstitutionsInt[aa1] = countSubstitutionsInt[aa1] + 1;			
+		}
+		
+		cd1 = branchNames[p1];
+		TREE_OUTPUT_OPTIONS[cd1] = nodeSpec;
+		
+		k=k+1;
+	}
+	
+	/* now do the leaves */
+	
+	c2 = dupInfo[site];
+	for (h=0; h<specCount; h=h+1)
+	{
+		p1 = seqToBranchMap[h][0];
+		pid = flatTreeRep[p1];
+		parentName = branchNames [pid];
+		if (Abs(TREE_OUTPUT_OPTIONS[parentName])==0)
+		{
+			parentName = 0;
+		}
+		p2 = seqToBranchMap[pid][1]-specCount;
+		
+		cd2 = residueInfo2[p2][c1];
+		cd1 = residueInfo[h] [c2];
+		
+
+		if (cd1>=0)
+		/* no ambiguities */
+		{
+			nodeSpec  = {};
+			if (mapToAA)
+			{
+				cd3 = _GC_[cd1];
+				cd3 = codonTo3 [cd3];
+			}		
+			else
+			{
+				cd3 = codeToLetters(correctCode[cd1]);
+			}
+			
+			
+			if (cd1 == cd2)
+			{
+				nodeSpec ["TREE_OUTPUT_BRANCH_COLOR"] = branchColors[2];
+				nodeSpec ["TREE_OUTPUT_BRANCH_LABEL"] = "";
+			}
+			else
+			{
+				if (Abs(parentName))
+				{
+					pinfoavl  = TREE_OUTPUT_OPTIONS[parentName];
+					pbname    = pinfoavl ["TREE_OUTPUT_BRANCH_LABEL"];
+					if (Abs (pbname) < 3)
+					{
+						pinfoavl ["TREE_OUTPUT_BRANCH_LABEL"] = "__FONT_SIZE__ 2 idiv\n__FONT_SIZE__ 3 idiv\nneg\nrmoveto\n("+pbname+") show";
+						TREE_OUTPUT_OPTIONS[parentName] = pinfoavl;
+					}
+				}
+				nodeSpec ["TREE_OUTPUT_BRANCH_LABEL"] = "__FONT_SIZE__ 2 idiv\n__FONT_SIZE__ 3 idiv\nneg\nrmoveto\n("+cd3+") show";
+				if (_GC_[cd1] == _GC_[cd2])
+				{
+					nodeSpec ["TREE_OUTPUT_BRANCH_COLOR"] = branchColors[1];
+				}
+				else
+				{
+					nodeSpec ["TREE_OUTPUT_BRANCH_COLOR"] = branchColors[0];			
+					nodeSpec ["TREE_OUTPUT_BRANCH_DASH"] = {{1,4,1}};		
+				}
+				aa1 = _GC_[cd1];
+				aa1 = codonTo3[aa1];
+				aa2 = _GC_[cd2];
+				aa2 = codonTo3[aa2];
+				cd1 = codeToLetters(correctCode[cd1]);
+				cd2 = codeToLetters(correctCode[cd2]);
+				aa1 = cd2+"("+aa2+") to " + cd1 + "(" + aa1 + ")";
+				countSubstitutionsLeaf[aa1] = countSubstitutionsLeaf[aa1] + 1;
+			}
+			
+			cd1 = branchNames[p1];
+			TREE_OUTPUT_OPTIONS[cd1] = nodeSpec;
+		}	
+		else
+		/* ambiguities here */
+		{
+			seqString = seqStrings[h];
+			ExecuteCommands ("GetDataInfo    (ambInfo, `dfID`, h, c2);");
+			nodeSpec  = {};
+			haveSyn = 0;
+			haveNS  = 0;
+			
+			if (Abs(parentName))
+			{
+				pinfoavl  = TREE_OUTPUT_OPTIONS[parentName];
+				pbname    = pinfoavl ["TREE_OUTPUT_BRANCH_LABEL"];
+				if (Abs (pbname) < 3)
+				{
+					pinfoavl ["TREE_OUTPUT_BRANCH_LABEL"] = "__FONT_SIZE__ 2 idiv\n__FONT_SIZE__ 3 idiv\nneg\nrmoveto\n("+pbname+") show";
+					TREE_OUTPUT_OPTIONS[parentName] = pinfoavl;
+				}
+			}
+			
+			
+			ambBName = "";
+			alreadyDone = {};
+			for (k=0; k<stateCharCount; k=k+1)
+			{
+				if (ambInfo[k])
+				{
+					if (k == cd2)
+					{
+						haveSyn = 1;
+					} 
+					else
+					{
+						haveNS = 1;
+					}
+					aa1 = _GC_[k];
+					aa1 = codonTo3[aa1];
+					if (alreadyDone[aa1] == 0)
+					{	
+						alreadyDone[aa1] = 1;
+						if (Abs(ambBName))
+						{
+							ambBName = ambBName+"/"+aa1;
+						}	
+						else
+						{	
+							ambBName = aa1;
+						}
+					}
+				}
+			}	
+
+			if (mapToAA)
+			{
+				nodeSpec ["TREE_OUTPUT_BRANCH_LABEL"] = "__FONT_SIZE__ 2 idiv\n__FONT_SIZE__ 3 idiv\nneg\nrmoveto\n("+ambBName+") show";
+			}
+			else
+			{
+				nodeSpec ["TREE_OUTPUT_BRANCH_LABEL"] = "__FONT_SIZE__ 2 idiv\n__FONT_SIZE__ 3 idiv\nneg\nrmoveto\n("+seqString[3*site][3*site+2]+" ) show";
+			}
+
+			if (haveSyn || haveNS)
+			{
+				aa2 = _GC_[cd2];
+				aa2 = codonTo3[aa2];
+				if (Abs(alreadyDone)>1)
+				{
+					nodeSpec ["TREE_OUTPUT_BRANCH_COLOR"] = branchColors[3];
+					aa1 = "AMB";
+					nodeSpec ["TREE_OUTPUT_BRANCH_DASH"] = {{1,4,1}};		
+				}
+				else
+				{
+					nodeSpec ["TREE_OUTPUT_BRANCH_COLOR"] = branchColors[1];
+					aa1 = aa2;
+				}
+				cd1 = seqString[3*site][3*site+2];
+				cd2 = codeToLetters(correctCode[cd2]);
+				aa1 = cd2+"("+aa2+") to " + cd1 + "(" + aa1 + ")";
+				countSubstitutionsLeaf[aa1] = countSubstitutionsLeaf[aa1] + 1;
+			}
+			else
+			{
+				nodeSpec ["TREE_OUTPUT_BRANCH_COLOR"] = branchColors[0];			
+			}
+			cd1 = branchNames[p1];
+			TREE_OUTPUT_OPTIONS[cd1] = nodeSpec;
+		}
+	}
+		
+	for (aa2 = 0; aa2 < Columns (branchNames); aa2=aa2+1)
+	{
+		parentName = branchNames[aa2];
+		pinfoavl   = TREE_OUTPUT_OPTIONS[parentName];
+		if (Abs(pinfoavl))
+		{
+			pbname    = pinfoavl ["TREE_OUTPUT_BRANCH_LABEL"];
+			if (Abs (pbname) < 3)
+			{
+				pinfoavl ["TREE_OUTPUT_BRANCH_LABEL"] = "";
+				TREE_OUTPUT_OPTIONS[parentName] = pinfoavl;
+			}
+		}
+	}	
+		
+	ExecuteCommands ("psString = PSTreeString (`treeID`,\"EXPECTED_NUMBER_OF_SUBSTITUTIONS\",{{300,600}});");
+	repMx = {{"setfont"}{"setfont\n3 setlinewidth\n1 setlinecap"}};
+	psString = psString ^ repMx;
+	repMx = {{"[0-9] scalefont"}{"11 scalefont"}};
+	psString = psString ^ repMx;
+
+	outResult = {};
+	outResult ["Tree string"] 	  = psString;
+	outResult ["Leaf subs"]   	  = countSubstitutionsLeaf;
+	outResult ["Internal subs"]   = countSubstitutionsInt;
+	
+	return outResult;
+}
+
+/*---------------------------------------------------------------------------------------------------------------------------------------------------------*/
+
+_ChooseCaption = "Select a likelihood function to use";
+#include "Includes/ChooseALF.ibf";
+if (tIndex < 0)
+{
+	return 1;
+}
+
+if (setupMapToTree(0) < 0)
+{
+	return 1;
+}
+
+pairwiseMap       = {190,filteredDataA.sites};
+pairToCounterMap  = {20,20};
+idx = 0;
+pairwiseString = "";
+for (h=0; h<20; h=h+1)
+{
+	for (v=h+1; v<20; v=v+1)
+	{
+		pairToCounterMap[h][v] = idx;
+		pairToCounterMap[v][h] = idx;
+		pairwiseString = pairwiseString + ";" + characterOrder[h] + characterOrder[v];
+		idx = idx+1;
+	}
+}
+
+
+
+/*while (1)
+{
+	fprintf (stdout, "0-based site to map (-1 to stop:):");
+	fscanf  (stdin, "Number", siteToMap);
+	if (siteToMap < 0)
+	{
+		break;
+	}
+	z = mapSiteToTree (siteToMap$1, 1);
+	SetDialogPrompt ("Write tree to:");
+	fprintf (PROMPT_FOR_FILE,CLEAR_FILE,z["Tree string"]);
+	fprintf (stdout, "\nLeaf: ", z["Leaf subs"], "\nInternal: ", z["Internal subs"], "\n");
+}*/
diff --git a/res/UserAddins/OldAddins/CodonMutationToTreeMapper.bf b/res/UserAddins/OldAddins/CodonMutationToTreeMapper.bf
new file mode 100644
index 0000000..d1c404f
--- /dev/null
+++ b/res/UserAddins/OldAddins/CodonMutationToTreeMapper.bf
@@ -0,0 +1,477 @@
+MESSAGE_LOGGING = 0;
+
+branchColors = {};
+
+branchColors [0] = {{255,0,0}}*(1/255); 		/* red */
+branchColors [3] = {{64,0,128}}*(1/255); 		/* eggplant */
+branchColors [2] = {{0,0,0}};   	/* light gray */
+branchColors [1] = {{0,128,0}}*(1/255);   		/* clover */
+
+codonTo3 = {};
+
+codonOffset = 0;
+
+codonTo3[0] = "F";
+codonTo3[1] = "L";
+codonTo3[2] = "I";
+codonTo3[3] = "M";
+codonTo3[4] = "V";
+codonTo3[5] = "S";
+codonTo3[6] = "P";
+codonTo3[7] = "T";
+codonTo3[8] = "A";
+codonTo3[9] = "Y";
+codonTo3[10] = "Stop";
+codonTo3[11] = "H";
+codonTo3[12] = "Q";
+codonTo3[13] = "N";
+codonTo3[14] = "K";
+codonTo3[15] = "D";
+codonTo3[16] = "E";
+codonTo3[17] = "C";
+codonTo3[18] = "W";
+codonTo3[19] = "R";
+codonTo3[20] = "G";
+
+nucCharacters = "ACGT";
+
+function codeToLetters (codonCode)
+{
+	return nucCharacters[codonCode$16]+nucCharacters[(codonCode%16)$4]+nucCharacters[codonCode%4];	
+}
+
+function setupMapToTree (dummy)
+{
+	skipCodeSelectionStep = 1;
+	dummy = HYPHY_LIB_DIRECTORY+"TemplateBatchFiles"+DIRECTORY_SEPARATOR+"TemplateModels"+DIRECTORY_SEPARATOR+"chooseGeneticCode.def";
+	ExecuteCommands ("#include \""+dummy+"\";");
+	ApplyGeneticCodeTable (0);
+
+	DataSet			ancestralSeqs  = ReconstructAncestors (lf);
+	DataSetFilter	filteredDataA  = CreateFilter(ancestralSeqs,3,"","",GeneticCodeExclusions);
+
+	HarvestFrequencies			  (observedCEFV,filteredData,3,3,0);
+
+	stateCharCount = 64;
+
+	for (h=0; h<64; h=h+1)
+	{
+		if (_Genetic_Code[h] == 10)
+		{
+			stateCharCount = stateCharCount -1;
+		}
+	}
+	ambChoice = 1;
+
+	seqToBranchMap = {stateCharCount,1};
+
+	hShift = 0;
+
+	_GC_ = {stateCharCount,1};
+	correctCode = {stateCharCount,1};
+
+	for (k=0; k<64; k=k+1)
+	{
+		if (_Genetic_Code[k]==10)
+		{
+			hShift = hShift+1;
+		}
+		else
+		{
+			seqToBranchMap[k-hShift] = observedCEFV[k];
+			_GC_[k-hShift] = _Genetic_Code[k];
+			correctCode[k-hShift] = k;
+		}
+	}
+
+	observedCEFV = seqToBranchMap;
+
+	branchNames = BranchName (givenTree,-1);
+	h = Columns (branchNames);
+
+	seqToBranchMap 	= {h, 2};
+	/* maps sequence names to branch order in column 1 
+	   and the other way around in column 2 */
+
+	for (k=0; k<filteredData.species; k=k+1)
+	{
+		GetString (seqName, filteredData, k);
+		seqToBranchMap[k][0] = -1;
+		for (v=0; v<h; v=v+1)
+		{
+			if (branchNames[v] % seqName)
+			{
+				seqToBranchMap[k][0] = v;
+				seqToBranchMap[v][1] = k;
+				break;
+			}
+		}
+	}
+
+	seqToBranchMap[filteredData.species][0] = h-1;
+	seqToBranchMap[h-1][1] = filteredData.species;
+
+
+	for (k=1; k<filteredDataA.species; k=k+1)
+	{
+		GetString (seqName, filteredDataA, k);
+		seqToBranchMap[filteredData.species+k][0] = -1;
+		for (v=0; v<h; v=v+1)
+		{
+			if (branchNames[v] % seqName)
+			{
+				seqToBranchMap[k+filteredData.species][0] = v;
+				seqToBranchMap[v][1] = k+filteredData.species;
+				break;
+			}
+		}
+	}
+
+	GetDataInfo    (dupInfo, filteredData);
+	GetDataInfo	   (dupInfoA, filteredDataA);
+
+	matrixTrick  = {1,stateCharCount};
+	matrixTrick2 = {1,stateCharCount};
+
+	for (h=Columns(matrixTrick)-1; h>=0; h=h-1)
+	{
+		matrixTrick  [h] = h;
+		matrixTrick2 [h] = 1;
+	}
+
+	codonInfo  = {filteredData.species, filteredData.unique_sites};
+	codonInfo2 = {filteredDataA.species, filteredDataA.unique_sites};
+
+	GetDataInfo    (dupInfo, filteredData);
+	GetDataInfo	   (dupInfoA, filteredDataA);
+
+	matrixTrick  = {1,stateCharCount};
+	matrixTrick2 = {1,stateCharCount};
+
+	for (h=Columns(matrixTrick)-1; h>=0; h=h-1)
+	{
+		matrixTrick  [h] = h;
+		matrixTrick2 [h] = 1;
+	}
+
+	for (v=0; v<filteredData.unique_sites;v=v+1)
+	{
+		for (h=0; h<filteredData.species;h=h+1)
+		{
+			GetDataInfo (siteInfo, filteredData, h, v);
+			_SITE_ES_COUNT = matrixTrick2 * siteInfo; 
+			if (_SITE_ES_COUNT[0] == 1)
+			{
+				siteInfo = matrixTrick * siteInfo;
+				codonInfo[h][v] = siteInfo[0];
+			}
+			else
+			{
+				codonInfo[h][v] = -1;
+			}
+		}
+	}
+
+	for (v=0; v<filteredDataA.unique_sites;v=v+1)
+	{
+		for (h=0; h<filteredDataA.species;h=h+1)
+		{
+			GetDataInfo (siteInfo, filteredDataA, h, v);
+			siteInfo = matrixTrick * siteInfo;
+			codonInfo2[h][v] = siteInfo[0];
+		}
+	}
+
+	flatTreeRep	  = Abs (givenTree);
+	GetInformation (seqStrings, filteredData);
+	return 0;
+}
+
+
+function mapSiteToTree (site, mapToAA)
+{
+	TREE_OUTPUT_OPTIONS = {};
+	k = filteredData.species+1;
+	
+	countSubstitutionsInt  = {};
+	countSubstitutionsLeaf = {};
+	
+	/* first sequence is always the root */
+	c1 = dupInfoA[site];
+	for (h=1; h<filteredDataA.species; h=h+1)
+	{
+		p1  = seqToBranchMap[k][0];
+		pid = flatTreeRep[p1];
+		parentName = branchNames [pid];
+		if (Abs(TREE_OUTPUT_OPTIONS[parentName])==0)
+		{
+			parentName = 0;
+		}
+		p2  = seqToBranchMap[pid][1]-filteredData.species;
+		
+		cd1 = codonInfo2[h] [c1];
+		cd2 = codonInfo2[p2][c1];
+		
+		nodeSpec  = {};
+		if (mapToAA)
+		{
+			cd3 = _GC_[cd1];
+			cd3 = codonTo3 [cd3];
+		}		
+		else
+		{
+			cd3 = codeToLetters(correctCode[cd1]);
+		}
+		
+		if (cd1 == cd2)
+		{
+			nodeSpec ["TREE_OUTPUT_BRANCH_COLOR"] = branchColors[2];
+			nodeSpec ["TREE_OUTPUT_BRANCH_LABEL"] = ""+cd3;
+		}
+		else
+		{
+			nodeSpec ["TREE_OUTPUT_BRANCH_LABEL"] = "__FONT_SIZE__ 2 idiv\n__FONT_SIZE__ 3 idiv\nneg\nrmoveto\n("+cd3+") show";
+			
+			if (Abs(parentName))
+			{
+				pinfoavl  = TREE_OUTPUT_OPTIONS[parentName];
+				pbname    = pinfoavl ["TREE_OUTPUT_BRANCH_LABEL"];
+				if (Abs (pbname) < 3)
+				{
+					pinfoavl ["TREE_OUTPUT_BRANCH_LABEL"] = "__FONT_SIZE__ 2 idiv\n__FONT_SIZE__ 3 idiv\nneg\nrmoveto\n("+pbname+") show";
+					TREE_OUTPUT_OPTIONS[parentName] = pinfoavl;
+				}
+			}
+			
+			if (_GC_[cd1] == _GC_[cd2])
+			{
+				nodeSpec ["TREE_OUTPUT_BRANCH_COLOR"] = branchColors[1];
+			}
+			else
+			{
+				nodeSpec ["TREE_OUTPUT_BRANCH_COLOR"] = branchColors[0];	
+				nodeSpec ["TREE_OUTPUT_BRANCH_DASH"] = {{1,4,1}};		
+			}
+			aa1 = _GC_[cd1];
+			aa1 = codonTo3[aa1];
+			aa2 = _GC_[cd2];
+			aa2 = codonTo3[aa2];
+			cd1 = codeToLetters(correctCode[cd1]);
+			cd2 = codeToLetters(correctCode[cd2]);
+			aa1 = cd2+"("+aa2+") to " + cd1 + "(" + aa1 + ")";
+			countSubstitutionsInt[aa1] = countSubstitutionsInt[aa1] + 1;			
+		}
+		
+		cd1 = branchNames[p1];
+		TREE_OUTPUT_OPTIONS[cd1] = nodeSpec;
+		
+		k=k+1;
+	}
+	
+	/* now do the leaves */
+	
+	c2 = dupInfo[site];
+	for (h=0; h<filteredData.species; h=h+1)
+	{
+		p1 = seqToBranchMap[h][0];
+		pid = flatTreeRep[p1];
+		parentName = branchNames [pid];
+		if (Abs(TREE_OUTPUT_OPTIONS[parentName])==0)
+		{
+			parentName = 0;
+		}
+		p2 = seqToBranchMap[pid][1]-filteredData.species;
+		
+		cd2 = codonInfo2[p2][c1];
+		cd1 = codonInfo[h] [c2];
+		
+
+		if (cd1>=0)
+		/* no ambiguities */
+		{
+			nodeSpec  = {};
+			if (mapToAA)
+			{
+				cd3 = _GC_[cd1];
+				cd3 = codonTo3 [cd3];
+			}		
+			else
+			{
+				cd3 = codeToLetters(correctCode[cd1]);
+			}
+			
+			
+			if (cd1 == cd2)
+			{
+				nodeSpec ["TREE_OUTPUT_BRANCH_COLOR"] = branchColors[2];
+				nodeSpec ["TREE_OUTPUT_BRANCH_LABEL"] = "";
+			}
+			else
+			{
+				if (Abs(parentName))
+				{
+					pinfoavl  = TREE_OUTPUT_OPTIONS[parentName];
+					pbname    = pinfoavl ["TREE_OUTPUT_BRANCH_LABEL"];
+					if (Abs (pbname) < 3)
+					{
+						pinfoavl ["TREE_OUTPUT_BRANCH_LABEL"] = "__FONT_SIZE__ 2 idiv\n__FONT_SIZE__ 3 idiv\nneg\nrmoveto\n("+pbname+") show";
+						TREE_OUTPUT_OPTIONS[parentName] = pinfoavl;
+					}
+				}
+				nodeSpec ["TREE_OUTPUT_BRANCH_LABEL"] = "__FONT_SIZE__ 2 idiv\n__FONT_SIZE__ 3 idiv\nneg\nrmoveto\n("+cd3+") show";
+				if (_GC_[cd1] == _GC_[cd2])
+				{
+					nodeSpec ["TREE_OUTPUT_BRANCH_COLOR"] = branchColors[1];
+				}
+				else
+				{
+					nodeSpec ["TREE_OUTPUT_BRANCH_COLOR"] = branchColors[0];			
+					nodeSpec ["TREE_OUTPUT_BRANCH_DASH"] = {{1,4,1}};		
+				}
+				aa1 = _GC_[cd1];
+				aa1 = codonTo3[aa1];
+				aa2 = _GC_[cd2];
+				aa2 = codonTo3[aa2];
+				cd1 = codeToLetters(correctCode[cd1]);
+				cd2 = codeToLetters(correctCode[cd2]);
+				aa1 = cd2+"("+aa2+") to " + cd1 + "(" + aa1 + ")";
+				countSubstitutionsLeaf[aa1] = countSubstitutionsLeaf[aa1] + 1;
+			}
+			
+			cd1 = branchNames[p1];
+			TREE_OUTPUT_OPTIONS[cd1] = nodeSpec;
+		}	
+		else
+		/* ambiguities here */
+		{
+			seqString = seqStrings[h];
+			GetDataInfo    (ambInfo, filteredData, h, c2);	
+			nodeSpec  = {};
+			haveSyn = 0;
+			haveNS  = 0;
+			
+			if (Abs(parentName))
+			{
+				pinfoavl  = TREE_OUTPUT_OPTIONS[parentName];
+				pbname    = pinfoavl ["TREE_OUTPUT_BRANCH_LABEL"];
+				if (Abs (pbname) < 3)
+				{
+					pinfoavl ["TREE_OUTPUT_BRANCH_LABEL"] = "__FONT_SIZE__ 2 idiv\n__FONT_SIZE__ 3 idiv\nneg\nrmoveto\n("+pbname+") show";
+					TREE_OUTPUT_OPTIONS[parentName] = pinfoavl;
+				}
+			}
+			
+			
+			ambBName = "";
+			alreadyDone = {};
+			for (k=0; k<stateCharCount; k=k+1)
+			{
+				if (ambInfo[k])
+				{
+					if (k == cd2)
+					{
+						haveSyn = 1;
+					} 
+					else
+					{
+						haveNS = 1;
+					}
+					aa1 = _GC_[k];
+					aa1 = codonTo3[aa1];
+					if (alreadyDone[aa1] == 0)
+					{	
+						alreadyDone[aa1] = 1;
+						if (Abs(ambBName))
+						{
+							ambBName = ambBName+"/"+aa1;
+						}	
+						else
+						{	
+							ambBName = aa1;
+						}
+					}
+				}
+			}	
+
+			if (mapToAA)
+			{
+				nodeSpec ["TREE_OUTPUT_BRANCH_LABEL"] = "__FONT_SIZE__ 2 idiv\n__FONT_SIZE__ 3 idiv\nneg\nrmoveto\n("+ambBName+") show";
+			}
+			else
+			{
+				nodeSpec ["TREE_OUTPUT_BRANCH_LABEL"] = "__FONT_SIZE__ 2 idiv\n__FONT_SIZE__ 3 idiv\nneg\nrmoveto\n("+seqString[3*site][3*site+2]+" ) show";
+			}
+
+			if (haveSyn || haveNS)
+			{
+				aa2 = _GC_[cd2];
+				aa2 = codonTo3[aa2];
+				if (Abs(alreadyDone)>1)
+				{
+					nodeSpec ["TREE_OUTPUT_BRANCH_COLOR"] = branchColors[3];
+					aa1 = "AMB";
+					nodeSpec ["TREE_OUTPUT_BRANCH_DASH"] = {{1,4,1}};		
+				}
+				else
+				{
+					nodeSpec ["TREE_OUTPUT_BRANCH_COLOR"] = branchColors[1];
+					aa1 = aa2;
+				}
+				cd1 = seqString[3*site][3*site+2];
+				cd2 = codeToLetters(correctCode[cd2]);
+				aa1 = cd2+"("+aa2+") to " + cd1 + "(" + aa1 + ")";
+				countSubstitutionsLeaf[aa1] = countSubstitutionsLeaf[aa1] + 1;
+			}
+			else
+			{
+				nodeSpec ["TREE_OUTPUT_BRANCH_COLOR"] = branchColors[0];			
+			}
+			cd1 = branchNames[p1];
+			TREE_OUTPUT_OPTIONS[cd1] = nodeSpec;
+		}
+	}
+		
+	for (aa2 = 0; aa2 < Columns (branchNames); aa2=aa2+1)
+	{
+		parentName = branchNames[aa2];
+		pinfoavl   = TREE_OUTPUT_OPTIONS[parentName];
+		if (Abs(pinfoavl))
+		{
+			pbname    = pinfoavl ["TREE_OUTPUT_BRANCH_LABEL"];
+			if (Abs (pbname) < 3)
+			{
+				pinfoavl ["TREE_OUTPUT_BRANCH_LABEL"] = "";
+				TREE_OUTPUT_OPTIONS[parentName] = pinfoavl;
+			}
+		}
+	}	
+		
+	psString = PSTreeString (givenTree,"EXPECTED_NUMBER_OF_SUBSTITUTIONS",{{300,600}});
+	repMx = {{"setfont"}{"setfont\n3 setlinewidth\n1 setlinecap"}};
+	psString = psString ^ repMx;
+	repMx = {{"[0-9] scalefont"}{"11 scalefont"}};
+	psString = psString ^ repMx;
+
+	outResult = {};
+	outResult ["Tree string"] 	  = psString;
+	outResult ["Leaf subs"]   	  = countSubstitutionsLeaf;
+	outResult ["Internal subs"]   = countSubstitutionsInt;
+	
+	return outResult;
+}
+
+setupMapToTree(0);
+
+while (1)
+{
+	fprintf (stdout, "0-based site to map (-1 to stop:):");
+	fscanf  (stdin, "Number", siteToMap);
+	if (siteToMap < 0)
+	{
+		break;
+	}
+	z = mapSiteToTree (siteToMap$1, 1);
+	SetDialogPrompt ("Write tree to:");
+	fprintf (PROMPT_FOR_FILE,CLEAR_FILE,z["Tree string"]);
+	fprintf (stdout, "\nLeaf: ", z["Leaf subs"], "\nInternal: ", z["Internal subs"], "\n");
+}
diff --git a/res/UserAddins/OldAddins/ColorPSTree b/res/UserAddins/OldAddins/ColorPSTree
new file mode 100644
index 0000000..e3b1334
--- /dev/null
+++ b/res/UserAddins/OldAddins/ColorPSTree
@@ -0,0 +1,156 @@
+avTreeCount = Rows ("Tree");
+
+branchColors  = {};
+branchLabels  = {};
+branchRates   = {};
+branchLengths = {};
+
+branchColors [1] = {{255,0,0}}*(1/255); 		/* red */
+branchColors [2] = {{64,0,128}}*(1/255); 		/* eggplant */
+branchColors [0] = {{0,128,0}}*(1/255);   		/* clover */
+branchColors [3] = {{240,240,240}}*(1/255);   	/* light gray */
+
+branchLabels["CHIMP_BONOBO_GORILLA"] = "Chimpanzee/bonobo/gorilla";
+branchLabels["ORANGUTAN_PPY"] 		 = "Orangutan";
+branchLabels["GIBBON_GGO"] 			 = "Lar gibbon";
+branchLabels["COLOBUS_CGU_CAN"] 	 = "Angolan colobus";
+branchLabels["LANGUR_SEN_SVE"]		 = "Hanuman langur";
+branchLabels["LANGUR_TOB_TFR"]		 = "Dusky langur";
+branchLabels["DOUC_LANGUR_PNE"]		 = "Douc langur";
+branchLabels["PROBISCIS_NLA"]		 = "Proboscis monkey";
+branchLabels["BABOON_PCY"]		 	 = "Olive baboon";
+branchLabels["MANGABEY_CAT"]		 = "Sooty mangabey";
+branchLabels["RHESUS_MMU"]			 = "Rhesus macaque";
+branchLabels["ALLEN_ANI"]			 = "Allen's monkey";
+branchLabels["TALAPOIN_MTA"]		 = "Talapoin";
+branchLabels["PATAS_EPA"]		 	 = "Patas monkey";
+branchLabels["VERVET_CAE"]		 	 = "Vervet";
+branchLabels["HUMAN"]		 	 	 = "Human";
+branchLabels["SQUIRREL_M"]		 	 = "Squirrel monkey";
+branchLabels["TAMARIN_SOE"]		 	 = "Tamarin";
+branchLabels["MARMOSET_CJA"]		 = "Marmoset";
+
+branchLabels["PNE_LANGUR"] 			 = "Douc langur";
+branchLabels["CGU_CAN_COLOBUS"] 	 = "Angolan colobus";
+branchLabels["MMU_RHESUS"] 			 = "Rhesus macaque";
+branchLabels["HLA_GIBBON"] 	 		 = "Lar gibbon";
+branchLabels["HSA_HUMAN"]		 	 = "Human";
+branchLabels["SSC_SQUIRRELM"]		 = "Squirrel monkey";
+branchLabels["CJA_MARMOSET"]		 = "Marmoset";
+
+
+TREE_OUTPUT_OPTIONS = {};
+/*TREE_OUTPUT_OPTIONS {""} = */
+if (avTreeCount>=1)
+{
+	choices = {avTreeCount,2};
+	for (k=0; k<avTreeCount;k=k+1)
+	{
+		GetString (tName, Tree, k);
+		choices[k][0] = tName;
+		choices[k][1] = "Tree "+tName;
+	}
+	
+	ChoiceList (tIndex,"Color This Tree:",1,SKIP_NONE,choices);
+	if (tIndex>=0)
+	{
+		SetDialogPrompt ("Over branch labels file:");
+		fscanf (PROMPT_FOR_FILE,"Raw",ooo);
+		ExecuteCommands (ooo);
+		
+		GetString (tName, Tree, tIndex);
+		ExecuteCommands ("tree_bn=BranchName("+tName+",-1);tree_lng=BranchLength("+tName+",-1);");
+		totalTreeLength = 0;
+		iNodeCounter = 1;
+		for (k=0; k<Columns(tree_bn)-1; k=k+1)
+		{
+			nodeSpec  = {};
+			nodeName  = tree_bn [k]&&1;
+			nodeLabel = branchLabels[nodeName];
+			if (Abs(nodeLabel))
+			{
+				nodeSpec ["TREE_OUTPUT_BRANCH_LABEL"] = "__FONT_SIZE__ 2 idiv\n__FONT_SIZE__ 3 idiv\nneg\nrmoveto\n("+nodeLabel+") show";
+			}
+			else
+			{
+				if (nodeName/"NODE*")
+				{
+					nodeSpec ["TREE_OUTPUT_BRANCH_LABEL"] = "__FONT_SIZE__ 2 idiv\n 0 \nneg\nrmoveto\n(N"+iNodeCounter+") show";
+					iNodeCounter = iNodeCounter + 1;
+				}
+			}
+			ExecuteCommands ("stashMeValue="+tName+"."+tree_bn [k]+".synRate;"+tName+"."+tree_bn [k]+".synRate=1;nodeRate="+tName+"."+tree_bn [k]+".nonSynRate/"+tName+"."+tree_bn [k]+".synRate;"+tName+"."+tree_bn [k]+".synRate=stashMeValue");
+			nodeColor = branchRates[nodeRate];
+			if (Abs(nodeColor) == 0)
+			{
+				branchRates[nodeRate] = Abs(branchRates)+1;
+			}
+			nodeColor = branchRates[nodeRate]-1;
+			branchLengths [nodeRate] = branchLengths [nodeRate] + tree_lng[k];
+			totalTreeLength = totalTreeLength + tree_lng[k];
+			nodeSpec ["TREE_OUTPUT_BRANCH_COLOR"] = branchColors[nodeColor];
+			if (tree_bn[k] / "Node*")
+			{
+				nodeName = tree_bn[k];
+			}
+			if (overOneProbs[nodeName]>0.0)
+			{
+				nodeSpec ["TREE_OUTPUT_OVER_BRANCH"] = "0 0 0 setrgbcolor\n5 5 rmoveto\n("+Format(overOneProbs[nodeName]*100,0,1)+"\\%) show";
+			}
+			nodeName  = tree_bn [k];
+			TREE_OUTPUT_OPTIONS[nodeName] = nodeSpec;
+		}
+		SetDialogPrompt ("Save resulting tree string to:");
+		ChoiceList  (brOptions,"Scaling Options",1,NO_SKIP,
+							 "E[Subs]","Scale on expected number of substitutions",
+							 "Unscaled","Unscaled tree");
+		if (brOptions)
+		{
+			ExecuteCommands ("psString = PSTreeString ("+tName+",\"\",{{500,500}});");
+		}
+		else
+		{
+			ExecuteCommands ("psString = PSTreeString ("+tName+",\"EXPECTED_NUMBER_OF_SUBSTITUTIONS\",{{500,500}});");		
+		}
+		
+		psLegend = "";
+		psLegend * 256;
+		currentPosX = 500;
+		currentPosY = 500;
+		bKeys = Rows (branchRates);
+		sortedKeys = {Abs(branchRates),2};
+		for (k=0; k<Abs(branchRates); k=k+1)
+		{
+			sortedKeys[k][0] = 0+bKeys[k];
+			sortedKeys[k][1] = k;
+		}	
+		
+		sortedKeys = sortedKeys%0;
+		
+		for (k=0; k<Abs(branchRates); k=k+1)
+		{
+			ks = sortedKeys[k][1];
+			theKey = bKeys[ks];
+			aKey = branchRates[theKey]-1;
+			colorMx = branchColors[aKey];
+			psLegend * (""+colorMx[0]+" "+colorMx[1]+" "+colorMx[2]+ " setrgbcolor\n"+currentPosX+" "+currentPosY+" moveto\n");
+			psLegend * ("(dN/dS = "+Format(0+bKeys[ks],6,3)+"; "+Format(branchLengths[theKey]/totalTreeLength*100,4,0)+ "\\%) show\n");
+			currentPosY = currentPosY - 15;
+		}
+		fprintf (stdout,"\n");
+		psLegend * "showpage";
+		psLegend * 0;
+		repMx = {{"showpage"}{psLegend}};
+		psString = psString ^ repMx;
+		repMx = {{"setfont"}{"setfont\n3 setlinewidth\n1 setlinecap"}};
+		psString = psString ^ repMx;
+		fprintf (PROMPT_FOR_FILE,CLEAR_FILE,psString);
+	}
+
+}
+
+
+
+
+
+
diff --git a/res/UserAddins/OldAddins/ConvergentAndParallel b/res/UserAddins/OldAddins/ConvergentAndParallel
new file mode 100644
index 0000000..da865ae
--- /dev/null
+++ b/res/UserAddins/OldAddins/ConvergentAndParallel
@@ -0,0 +1,303 @@
+#include "Includes/MappersHelp.ibf";
+
+/*-----------------------------------------------------------------------------------------------*/
+
+function mapBranchSubstitutions (branchID)
+{
+	k = filteredData.species+1;
+	
+	substitutionsByType = {20,20}; /* from -> to */
+	
+	/* first sequence is always the root */
+	c1 = dupInfoA[site];
+	for (h=1; h<filteredDataA.species; h=h+1)
+	{
+		p1  = seqToBranchMap[k][0];
+		pid = flatTreeRep[p1];
+		parentName = branchNames [pid];
+		if (Abs(TREE_OUTPUT_OPTIONS[parentName])==0)
+		{
+			parentName = 0;
+		}
+		p2  = seqToBranchMap[pid][1]-filteredData.species;
+		
+		cd1 = codonInfo2[h] [c1];
+		cd2 = codonInfo2[p2][c1];
+		
+		nodeSpec  = {};
+		if (mapToAA)
+		{
+			cd3 = _GC_[cd1];
+			cd3 = codonTo3 [cd3];
+		}		
+		else
+		{
+			cd3 = codeToLetters(correctCode[cd1]);
+		}
+		
+		if (cd1 == cd2)
+		{
+			nodeSpec ["TREE_OUTPUT_BRANCH_COLOR"] = branchColors[2];
+			nodeSpec ["TREE_OUTPUT_BRANCH_LABEL"] = ""+cd3;
+		}
+		else
+		{
+			nodeSpec ["TREE_OUTPUT_BRANCH_LABEL"] = "__FONT_SIZE__ 2 idiv\n__FONT_SIZE__ 3 idiv\nneg\nrmoveto\n("+cd3+") show";
+			
+			if (Abs(parentName))
+			{
+				pinfoavl  = TREE_OUTPUT_OPTIONS[parentName];
+				pbname    = pinfoavl ["TREE_OUTPUT_BRANCH_LABEL"];
+				if (Abs (pbname) < 3)
+				{
+					pinfoavl ["TREE_OUTPUT_BRANCH_LABEL"] = "__FONT_SIZE__ 2 idiv\n__FONT_SIZE__ 3 idiv\nneg\nrmoveto\n("+pbname+") show";
+					TREE_OUTPUT_OPTIONS[parentName] = pinfoavl;
+				}
+			}
+			
+			if (_GC_[cd1] == _GC_[cd2])
+			{
+				nodeSpec ["TREE_OUTPUT_BRANCH_COLOR"] = branchColors[1];
+			}
+			else
+			{
+				nodeSpec ["TREE_OUTPUT_BRANCH_COLOR"] = branchColors[0];	
+				nodeSpec ["TREE_OUTPUT_BRANCH_DASH"] = {{1,4,1}};		
+			}
+			aa1 = _GC_[cd1];
+			aa1 = codonTo3[aa1];
+			aa2 = _GC_[cd2];
+			aa2 = codonTo3[aa2];
+			cd1 = codeToLetters(correctCode[cd1]);
+			cd2 = codeToLetters(correctCode[cd2]);
+			aa1 = cd2+"("+aa2+") to " + cd1 + "(" + aa1 + ")";
+			countSubstitutionsInt[aa1] = countSubstitutionsInt[aa1] + 1;			
+		}
+		
+		cd1 = branchNames[p1];
+		TREE_OUTPUT_OPTIONS[cd1] = nodeSpec;
+		
+		k=k+1;
+	}
+	
+	/* now do the leaves */
+	
+	c2 = dupInfo[site];
+	for (h=0; h<filteredData.species; h=h+1)
+	{
+		p1 = seqToBranchMap[h][0];
+		pid = flatTreeRep[p1];
+		parentName = branchNames [pid];
+		if (Abs(TREE_OUTPUT_OPTIONS[parentName])==0)
+		{
+			parentName = 0;
+		}
+		p2 = seqToBranchMap[pid][1]-filteredData.species;
+		
+		cd2 = codonInfo2[p2][c1];
+		cd1 = codonInfo[h] [c2];
+		
+
+		if (cd1>=0)
+		/* no ambiguities */
+		{
+			nodeSpec  = {};
+			if (mapToAA)
+			{
+				cd3 = _GC_[cd1];
+				cd3 = codonTo3 [cd3];
+			}		
+			else
+			{
+				cd3 = codeToLetters(correctCode[cd1]);
+			}
+			
+			
+			if (cd1 == cd2)
+			{
+				nodeSpec ["TREE_OUTPUT_BRANCH_COLOR"] = branchColors[2];
+				nodeSpec ["TREE_OUTPUT_BRANCH_LABEL"] = "";
+			}
+			else
+			{
+				if (Abs(parentName))
+				{
+					pinfoavl  = TREE_OUTPUT_OPTIONS[parentName];
+					pbname    = pinfoavl ["TREE_OUTPUT_BRANCH_LABEL"];
+					if (Abs (pbname) < 3)
+					{
+						pinfoavl ["TREE_OUTPUT_BRANCH_LABEL"] = "__FONT_SIZE__ 2 idiv\n__FONT_SIZE__ 3 idiv\nneg\nrmoveto\n("+pbname+") show";
+						TREE_OUTPUT_OPTIONS[parentName] = pinfoavl;
+					}
+				}
+				nodeSpec ["TREE_OUTPUT_BRANCH_LABEL"] = "__FONT_SIZE__ 2 idiv\n__FONT_SIZE__ 3 idiv\nneg\nrmoveto\n("+cd3+") show";
+				if (_GC_[cd1] == _GC_[cd2])
+				{
+					nodeSpec ["TREE_OUTPUT_BRANCH_COLOR"] = branchColors[1];
+				}
+				else
+				{
+					nodeSpec ["TREE_OUTPUT_BRANCH_COLOR"] = branchColors[0];			
+					nodeSpec ["TREE_OUTPUT_BRANCH_DASH"] = {{1,4,1}};		
+				}
+				aa1 = _GC_[cd1];
+				aa1 = codonTo3[aa1];
+				aa2 = _GC_[cd2];
+				aa2 = codonTo3[aa2];
+				cd1 = codeToLetters(correctCode[cd1]);
+				cd2 = codeToLetters(correctCode[cd2]);
+				aa1 = cd2+"("+aa2+") to " + cd1 + "(" + aa1 + ")";
+				countSubstitutionsLeaf[aa1] = countSubstitutionsLeaf[aa1] + 1;
+			}
+			
+			cd1 = branchNames[p1];
+			TREE_OUTPUT_OPTIONS[cd1] = nodeSpec;
+		}	
+		else
+		/* ambiguities here */
+		{
+			seqString = seqStrings[h];
+			GetDataInfo    (ambInfo, filteredData, h, c2);	
+			nodeSpec  = {};
+			haveSyn = 0;
+			haveNS  = 0;
+			
+			if (Abs(parentName))
+			{
+				pinfoavl  = TREE_OUTPUT_OPTIONS[parentName];
+				pbname    = pinfoavl ["TREE_OUTPUT_BRANCH_LABEL"];
+				if (Abs (pbname) < 3)
+				{
+					pinfoavl ["TREE_OUTPUT_BRANCH_LABEL"] = "__FONT_SIZE__ 2 idiv\n__FONT_SIZE__ 3 idiv\nneg\nrmoveto\n("+pbname+") show";
+					TREE_OUTPUT_OPTIONS[parentName] = pinfoavl;
+				}
+			}
+			
+			
+			ambBName = "";
+			alreadyDone = {};
+			for (k=0; k<stateCharCount; k=k+1)
+			{
+				if (ambInfo[k])
+				{
+					if (k == cd2)
+					{
+						haveSyn = 1;
+					} 
+					else
+					{
+						haveNS = 1;
+					}
+					aa1 = _GC_[k];
+					aa1 = codonTo3[aa1];
+					if (alreadyDone[aa1] == 0)
+					{	
+						alreadyDone[aa1] = 1;
+						if (Abs(ambBName))
+						{
+							ambBName = ambBName+"/"+aa1;
+						}	
+						else
+						{	
+							ambBName = aa1;
+						}
+					}
+				}
+			}	
+
+			if (mapToAA)
+			{
+				nodeSpec ["TREE_OUTPUT_BRANCH_LABEL"] = "__FONT_SIZE__ 2 idiv\n__FONT_SIZE__ 3 idiv\nneg\nrmoveto\n("+ambBName+") show";
+			}
+			else
+			{
+				nodeSpec ["TREE_OUTPUT_BRANCH_LABEL"] = "__FONT_SIZE__ 2 idiv\n__FONT_SIZE__ 3 idiv\nneg\nrmoveto\n("+seqString[3*site][3*site+2]+" ) show";
+			}
+
+			if (haveSyn || haveNS)
+			{
+				aa2 = _GC_[cd2];
+				aa2 = codonTo3[aa2];
+				if (Abs(alreadyDone)>1)
+				{
+					nodeSpec ["TREE_OUTPUT_BRANCH_COLOR"] = branchColors[3];
+					aa1 = "AMB";
+					nodeSpec ["TREE_OUTPUT_BRANCH_DASH"] = {{1,4,1}};		
+				}
+				else
+				{
+					nodeSpec ["TREE_OUTPUT_BRANCH_COLOR"] = branchColors[1];
+					aa1 = aa2;
+				}
+				cd1 = seqString[3*site][3*site+2];
+				cd2 = codeToLetters(correctCode[cd2]);
+				aa1 = cd2+"("+aa2+") to " + cd1 + "(" + aa1 + ")";
+				countSubstitutionsLeaf[aa1] = countSubstitutionsLeaf[aa1] + 1;
+			}
+			else
+			{
+				nodeSpec ["TREE_OUTPUT_BRANCH_COLOR"] = branchColors[0];			
+			}
+			cd1 = branchNames[p1];
+			TREE_OUTPUT_OPTIONS[cd1] = nodeSpec;
+		}
+	}
+		
+	for (aa2 = 0; aa2 < Columns (branchNames); aa2=aa2+1)
+	{
+		parentName = branchNames[aa2];
+		pinfoavl   = TREE_OUTPUT_OPTIONS[parentName];
+		if (Abs(pinfoavl))
+		{
+			pbname    = pinfoavl ["TREE_OUTPUT_BRANCH_LABEL"];
+			if (Abs (pbname) < 3)
+			{
+				pinfoavl ["TREE_OUTPUT_BRANCH_LABEL"] = "";
+				TREE_OUTPUT_OPTIONS[parentName] = pinfoavl;
+			}
+		}
+	}	
+		
+	psString = PSTreeString (givenTree,"EXPECTED_NUMBER_OF_SUBSTITUTIONS",{{300,600}});
+	repMx = {{"setfont"}{"setfont\n3 setlinewidth\n1 setlinecap"}};
+	psString = psString ^ repMx;
+	repMx = {{"[0-9] scalefont"}{"11 scalefont"}};
+	psString = psString ^ repMx;
+
+	outResult = {};
+	outResult ["Tree string"] 	  = psString;
+	outResult ["Leaf subs"]   	  = countSubstitutionsLeaf;
+	outResult ["Internal subs"]   = countSubstitutionsInt;
+	
+	return outResult;
+}
+
+/*-----------------------------------------------------------------------------------------------*/
+
+_ChooseCaption = "Select a likelihood function to use";
+#include "Includes/ChooseALF.ibf";
+if (tIndex < 0)
+{
+	return 1;
+}
+
+if (setupMapToTree(0) < 0)
+{
+	return 1;
+}
+
+return 0;
+
+while (1)
+{
+	fprintf (stdout, "0-based site to map (-1 to stop:):");
+	fscanf  (stdin, "Number", siteToMap);
+	if (siteToMap < 0)
+	{
+		break;
+	}
+	z = mapSiteToTree (siteToMap$1, 1);
+	SetDialogPrompt ("Write tree to:");
+	fprintf (PROMPT_FOR_FILE,CLEAR_FILE,z["Tree string"]);
+	fprintf (stdout, "\nLeaf: ", z["Leaf subs"], "\nInternal: ", z["Internal subs"], "\n");
+}
diff --git a/res/UserAddins/OldAddins/CopyBranchLengths b/res/UserAddins/OldAddins/CopyBranchLengths
new file mode 100644
index 0000000..13da104
--- /dev/null
+++ b/res/UserAddins/OldAddins/CopyBranchLengths
@@ -0,0 +1,27 @@
+avTreeCount = Rows ("Tree");
+
+if (avTreeCount>=1)
+{
+	choices = {avTreeCount,2};
+	for (k=0; k<avTreeCount;k=k+1)
+	{
+		GetString (tName, Tree, k);
+		choices[k][0] = tName;
+		choices[k][1] = "Tree "+tName;
+	}
+	
+	ChoiceList (tIndex,"Map branch lengths to parameters for:",1,SKIP_NONE,choices);
+	if (tIndex>=0)
+	{
+		GetString (tName, Tree, tIndex);
+		ExecuteCommands ("tree_bl=BranchLength("+tName+",-1);tree_bn=BranchName("+tName+",-1);");
+		commands="";
+		commands*8192;
+		for (k=Columns(tree_bl)-1;k>=0;k=k-1)
+		{
+			commands*(tName+"."+tree_bn[k]+".synRate=Max(0,"+tree_bl[k]+");\n");
+		}
+		commands*0;
+		ExecuteCommands (commands);
+	}
+}
diff --git a/res/UserAddins/OldAddins/DashPSTree b/res/UserAddins/OldAddins/DashPSTree
new file mode 100644
index 0000000..1993aaf
--- /dev/null
+++ b/res/UserAddins/OldAddins/DashPSTree
@@ -0,0 +1,141 @@
+avTreeCount = Rows ("Tree");
+
+branchDash = {};
+branchLabels = {};
+branchRates  = {};
+
+branchDash	 [0] = 0; 	/* solid */
+branchDash	 [1] = {{10,5,0}}; 	/* dark gray */
+branchDash 	 [2] = {{5,10,0}};   /* med gray */
+branchDash 	 [3] = {{15,15,0}};   	/* light gray */
+
+branchLabels["CHIMP_BONOBO_GORILLA"] = "Chimpanzee/bonobo/gorilla";
+branchLabels["ORANGUTAN_PPY"] 		 = "Orangutan";
+branchLabels["GIBBON_GGO"] 			 = "Lar gibbon";
+branchLabels["COLOBUS_CGU_CAN"] 	 = "Angolan colobus";
+branchLabels["LANGUR_SEN_SVE"]		 = "Hanuman langur";
+branchLabels["LANGUR_TOB_TFR"]		 = "Dusky langur";
+branchLabels["DOUC_LANGUR_PNE"]		 = "Douc langur";
+branchLabels["PROBISCIS_NLA"]		 = "Proboscis monkey";
+branchLabels["BABOON_PCY"]		 	 = "Olive baboon";
+branchLabels["MANGABEY_CAT"]		 = "Sooty mangabey";
+branchLabels["RHESUS_MMU"]			 = "Rhesus macaque";
+branchLabels["ALLEN_ANI"]			 = "Allen's monkey";
+branchLabels["TALAPOIN_MTA"]		 = "Talapoin";
+branchLabels["PATAS_EPA"]		 	 = "Patas monkey";
+branchLabels["VERVET_CAE"]		 	 = "Vervet";
+branchLabels["HUMAN"]		 	 	 = "Human";
+branchLabels["SQUIRREL_M"]		 	 = "Squirrel monkey";
+branchLabels["TAMARIN_SOE"]		 	 = "Tamarin";
+branchLabels["MARMOSET_CJA"]		 = "Marmoset";
+
+branchLabels["PNE_LANGUR"] 			 = "Douc langur";
+branchLabels["CGU_CAN_COLOBUS"] 	 = "Angolan colobus";
+branchLabels["MMU_RHESUS"] 			 = "Rhesus macaque";
+branchLabels["HLA_GIBBON"] 	 		 = "Lar gibbon";
+branchLabels["HSA_HUMAN"]		 	 = "Human";
+branchLabels["SSC_SQUIRRELM"]		 = "Squirrel monkey";
+branchLabels["CJA_MARMOSET"]		 = "Marmoset";
+
+
+
+TREE_OUTPUT_OPTIONS = {};
+/*TREE_OUTPUT_OPTIONS {""} = */
+if (avTreeCount>=1)
+{
+	choices = {avTreeCount,2};
+	for (k=0; k<avTreeCount;k=k+1)
+	{
+		GetString (tName, Tree, k);
+		choices[k][0] = tName;
+		choices[k][1] = "Tree "+tName;
+	}
+	
+	ChoiceList (tIndex,"Color This Tree:",1,SKIP_NONE,choices);
+	if (tIndex>=0)
+	{
+		SetDialogPrompt ("Over branch labels file:");
+		fscanf (PROMPT_FOR_FILE,"Raw",ooo);
+		ExecuteCommands (ooo);
+		
+		GetString (tName, Tree, tIndex);
+		ExecuteCommands ("tree_bn=BranchName("+tName+",-1);");
+		for (k=0; k<Columns(tree_bn)-1; k=k+1)
+		{
+			nodeSpec  = {};
+			nodeName  = tree_bn [k]&&1;
+			nodeLabel = branchLabels[nodeName];
+			if (Abs(nodeLabel))
+			{
+				nodeSpec ["TREE_OUTPUT_BRANCH_LABEL"] = "__FONT_SIZE__ 2 idiv\n__FONT_SIZE__ 3 idiv\nneg\nrmoveto\n("+nodeLabel+") show";
+			}
+			ExecuteCommands ("stashMeValue="+tName+"."+tree_bn [k]+".synRate;"+tName+"."+tree_bn [k]+".synRate=1;nodeRate="+tName+"."+tree_bn [k]+".nonSynRate/"+tName+"."+tree_bn [k]+".synRate;"+tName+"."+tree_bn [k]+".synRate=stashMeValue");
+			nodeColor = branchRates[nodeRate];
+			if (Abs(nodeColor) == 0)
+			{
+				branchRates[nodeRate] = Abs(branchRates)+1;
+			}
+			nodeColor = branchRates[nodeRate]-1;
+			nodeSpec ["TREE_OUTPUT_BRANCH_DASH"] = branchDash[nodeColor];
+			if (tree_bn[k] / "Node*")
+			{
+				nodeName = tree_bn[k];
+			}
+			if (overOneProbs[nodeName]>0.0)
+			{
+				nodeSpec ["TREE_OUTPUT_OVER_BRANCH"] = "0 0 0 setrgbcolor\n5 5 rmoveto\n("+Format(overOneProbs[nodeName]*100,0,1)+"\\%) show";
+			}
+			nodeName  = tree_bn [k];
+			TREE_OUTPUT_OPTIONS[nodeName] = nodeSpec;
+		}
+		SetDialogPrompt ("Save resulting tree string to:");
+		ExecuteCommands ("psString = PSTreeString ("+tName+",\"\",{{500,500}});");
+		psLegend = "";
+		psLegend * 256;
+		currentPosX = 460;
+		currentPosY = 480;
+		bKeys = Rows (branchRates);
+		sortedKeys = {Abs(branchRates),2};
+		for (k=0; k<Abs(branchRates); k=k+1)
+		{
+			sortedKeys[k][0] = 0+bKeys[k];
+			sortedKeys[k][1] = k;
+		}	
+		
+		sortedKeys = sortedKeys%0;
+		
+		for (k=0; k<Abs(branchRates); k=k+1)
+		{
+			ks = sortedKeys[k][1];
+			aKey = bKeys[ks];
+			aKey = branchRates[aKey]-1;
+			colorMx = branchDash[aKey];
+			if (Abs(colorMx))
+			{
+				psLegend * ("["+colorMx[0]+" "+colorMx[1]+"] "+colorMx[2]+ " setdash\n");
+			}
+			else
+			{
+				psLegend * ("[] 0 setdash\n");
+			
+			}
+			psLegend * ("newpath\n"+currentPosX+" "+currentPosY+" moveto\n45 0 rlineto\nstroke\n");
+			psLegend * ("newpath "+ (currentPosX+55) + " "+(currentPosY-4)+" moveto\n(dN/dS = "+Format(0+bKeys[ks],6,3)+") show\n");
+			currentPosY = currentPosY - 15;
+		}
+		psLegend * "[] 0 setdash\nshowpage";
+		psLegend * 0;
+		repMx = {{"showpage"}{psLegend}};
+		psString = psString ^ repMx;
+		repMx = {{"setfont"}{"setfont\n3 setlinewidth\n1 setlinecap"}};
+		psString = psString ^ repMx;
+		fprintf (PROMPT_FOR_FILE,CLEAR_FILE,psString);
+	}
+
+}
+
+
+
+
+
+
diff --git a/res/UserAddins/OldAddins/ExpsPerDirection b/res/UserAddins/OldAddins/ExpsPerDirection
new file mode 100644
index 0000000..2735cfa
--- /dev/null
+++ b/res/UserAddins/OldAddins/ExpsPerDirection
@@ -0,0 +1,36 @@
+likelihoodFnChoice = 0;
+if (Rows("LikelihoodFunction")>1)
+{
+	ChoiceList  (likelihoodFnChoice,"Choose a Likelihood Function",1,NO_SKIP,LikelihoodFunction);
+}		
+
+if (likelihoodFnChoice<0)
+{
+	return;
+} 
+	
+GetString (LF_NAME,LikelihoodFunction,likelihoodFnChoice);
+
+ExecuteCommands ("LFCompute ("+LF_NAME+",LF_START_COMPUTE);");
+ExecuteCommands ("LFCompute ("+LF_NAME+",res);");
+mxCount   	    = MATRIX_EXPONENTIATION_COUNTS;
+
+ExecuteCommands ("GetString(indepParams,"+ LF_NAME + ",-1);");
+
+globalList = indepParams["Global Independent"];
+for (k=0; k<Columns(globalList);k=k+1)
+{
+	ExecuteCommands (globalList[k] +" = "+globalList[k]+"*Random(0.95,1.05);");
+	ExecuteCommands ("LFCompute ("+LF_NAME+",res);");
+	fprintf (stdout, globalList[k], " => ", MATRIX_EXPONENTIATION_COUNTS-mxCount, "\n");
+	mxCount = MATRIX_EXPONENTIATION_COUNTS;
+}
+globalList = indepParams["Local Independent"];
+for (k=0; k<Columns(globalList);k=k+1)
+{
+	ExecuteCommands (globalList[k] +" = "+globalList[k]+"*Random(0.95,1.05);");
+	ExecuteCommands ("LFCompute ("+LF_NAME+",res);");
+	fprintf (stdout, globalList[k], " => ", MATRIX_EXPONENTIATION_COUNTS-mxCount, "\n");
+	mxCount = MATRIX_EXPONENTIATION_COUNTS;
+}
+ExecuteCommands ("LFCompute ("+LF_NAME+",LF_DONE_COMPUTE);");
diff --git a/res/UserAddins/OldAddins/FilterAssignments b/res/UserAddins/OldAddins/FilterAssignments
new file mode 100644
index 0000000..47ed4d8
--- /dev/null
+++ b/res/UserAddins/OldAddins/FilterAssignments
@@ -0,0 +1,55 @@
+filtersDef = Rows("DataSetFilter");
+
+if (filtersDef>0)
+{
+	ooMap = {};
+	maxSite = 0;
+	for (k=0; k<filtersDef; k=k+1)
+	{
+		GetString (fName, DataSetFilter, k);
+		ExecuteCommands ("GetDataInfo(ooOrder,"+fName+",1);");
+		ooMap[k] = ooOrder;
+		for (k2 = Columns(ooOrder)-1; k2>=0;k2=k2-1)
+		{
+			if (ooOrder[k2]>maxSite)
+			{
+				maxSite = ooOrder[k2];
+			}
+		}
+	}
+	
+	maxSite = (1+maxSite)/3;
+	
+	siteMap = {maxSite,1};
+	
+	for (k=0; k<maxSite; k=k+1)
+	{
+		siteMap[k] = -1;
+	}
+
+
+	for (k=0; k<filtersDef; k=k+1)
+	{
+		ooOrder = ooMap[k];
+		for (k2 = Columns(ooOrder)-3; k2>=0;k2=k2-3)
+		{
+			k3 = ooOrder[k2];
+			siteMap[k3/3] = k;
+		}
+	}
+	
+	_labels = {{"Site"}};
+
+	OpenWindow (CHARTWINDOW,{{"Site Assignments"}
+						   {"_labels"},
+						   {"siteMap"},
+						   {"Bar Chart"},
+						   {"Index"},
+						   {"Site"},
+						   {""},
+						   {""},
+						   {""},
+						   {"0"}},
+						   "SCREEN_WIDTH-60;SCREEN_HEIGHT-50;30;50");
+}
+					  
diff --git a/res/UserAddins/OldAddins/InferredAASubstitutionsCounter b/res/UserAddins/OldAddins/InferredAASubstitutionsCounter
new file mode 100644
index 0000000..fc844ef
--- /dev/null
+++ b/res/UserAddins/OldAddins/InferredAASubstitutionsCounter
@@ -0,0 +1,479 @@
+MESSAGE_LOGGING = 0;
+
+codonTo3     = {};
+codonOffset  = 0;
+
+codonTo3[0]  = "F";
+codonTo3[1]  = "L";
+codonTo3[2]  = "I";
+codonTo3[3]  = "M";
+codonTo3[4]  = "V";
+codonTo3[5]  = "S";
+codonTo3[6]  = "P";
+codonTo3[7]  = "T";
+codonTo3[8]  = "A";
+codonTo3[9]  = "Y";
+codonTo3[10] = "Stop";
+codonTo3[11] = "H";
+codonTo3[12] = "Q";
+codonTo3[13] = "N";
+codonTo3[14] = "K";
+codonTo3[15] = "D";
+codonTo3[16] = "E";
+codonTo3[17] = "C";
+codonTo3[18] = "W";
+codonTo3[19] = "R";
+codonTo3[20] = "G";
+
+nucCharacters  = "ACGT";
+characterOrder = "FLIMVSPTAYHQNKDECWRG";
+
+function codeToLetters (codonCode)
+{
+	return nucCharacters[codonCode$16]+nucCharacters[(codonCode%16)$4]+nucCharacters[codonCode%4];	
+}
+
+/*-------------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function setupMapToTree (dummy)
+{
+	dummy = HYPHY_LIB_DIRECTORY+"TemplateBatchFiles"+DIRECTORY_SEPARATOR+"TemplateModels"+DIRECTORY_SEPARATOR+"chooseGeneticCode.def";
+	ExecuteCommands ("#include \""+dummy+"\";");
+
+	DataSet			ancestralSeqs  = ReconstructAncestors (lf);
+	DataSetFilter	filteredDataA  = CreateFilter(ancestralSeqs,3,"","",GeneticCodeExclusions);
+
+	HarvestFrequencies			  (observedCEFV,filteredData,3,3,0);
+
+	stateCharCount = 64;
+
+	for (h=0; h<64; h=h+1)
+	{
+		if (_Genetic_Code[h] == 10)
+		{
+			stateCharCount = stateCharCount -1;
+		}
+	}
+	ambChoice = 1;
+
+	seqToBranchMap = {stateCharCount,1};
+
+	hShift = 0;
+
+	_GC_ = {stateCharCount,1};
+	correctCode = {stateCharCount,1};
+
+	for (k=0; k<64; k=k+1)
+	{
+		if (_Genetic_Code[k]==10)
+		{
+			hShift = hShift+1;
+		}
+		else
+		{
+			seqToBranchMap[k-hShift] = observedCEFV[k];
+			_GC_[k-hShift] = _Genetic_Code[k]-(_Genetic_Code[k]>10);
+			correctCode[k-hShift] = k;
+		}
+	}
+
+	observedCEFV = seqToBranchMap;
+
+	branchNames = BranchName (givenTree,-1);
+	h = Columns (branchNames);
+
+	seqToBranchMap 	= {h, 2};
+	/* maps sequence names to branch order in column 1 
+	   and the other way around in column 2 */
+
+	for (k=0; k<filteredData.species; k=k+1)
+	{
+		GetString (seqName, filteredData, k);
+		seqToBranchMap[k][0] = -1;
+		for (v=0; v<h; v=v+1)
+		{
+			if (branchNames[v] % seqName)
+			{
+				seqToBranchMap[k][0] = v;
+				seqToBranchMap[v][1] = k;
+				break;
+			}
+		}
+	}
+
+	seqToBranchMap[filteredData.species][0] = h-1;
+	seqToBranchMap[h-1][1] = filteredData.species;
+
+
+	for (k=1; k<filteredDataA.species; k=k+1)
+	{
+		GetString (seqName, filteredDataA, k);
+		seqToBranchMap[filteredData.species+k][0] = -1;
+		for (v=0; v<h; v=v+1)
+		{
+			if (branchNames[v] % seqName)
+			{
+				seqToBranchMap[k+filteredData.species][0] = v;
+				seqToBranchMap[v][1] = k+filteredData.species;
+				break;
+			}
+		}
+	}
+
+	GetDataInfo    (dupInfo, filteredData);
+	GetDataInfo	   (dupInfoA, filteredDataA);
+
+	matrixTrick  = {1,stateCharCount};
+	matrixTrick2 = {1,stateCharCount};
+
+	for (h=Columns(matrixTrick)-1; h>=0; h=h-1)
+	{
+		matrixTrick  [h] = h;
+		matrixTrick2 [h] = 1;
+	}
+
+	codonInfo  = {filteredData.species, filteredData.unique_sites};
+	codonInfo2 = {filteredDataA.species, filteredDataA.unique_sites};
+
+	GetDataInfo    (dupInfo, filteredData);
+	GetDataInfo	   (dupInfoA, filteredDataA);
+
+	matrixTrick  = {1,stateCharCount};
+	matrixTrick2 = {1,stateCharCount};
+
+	for (h=Columns(matrixTrick)-1; h>=0; h=h-1)
+	{
+		matrixTrick  [h] = h;
+		matrixTrick2 [h] = 1;
+	}
+
+	for (v=0; v<filteredData.unique_sites;v=v+1)
+	{
+		for (h=0; h<filteredData.species;h=h+1)
+		{
+			GetDataInfo (siteInfo, filteredData, h, v);
+			_SITE_ES_COUNT = matrixTrick2 * siteInfo; 
+			if (_SITE_ES_COUNT[0] == 1)
+			{
+				siteInfo = matrixTrick * siteInfo;
+				codonInfo[h][v] = siteInfo[0];
+			}
+			else
+			{
+				codonInfo[h][v] = -1;
+			}
+		}
+	}
+
+	for (v=0; v<filteredDataA.unique_sites;v=v+1)
+	{
+		for (h=0; h<filteredDataA.species;h=h+1)
+		{
+			GetDataInfo (siteInfo, filteredDataA, h, v);
+			siteInfo = matrixTrick * siteInfo;
+			codonInfo2[h][v] = siteInfo[0];
+		}
+	}
+
+	flatTreeRep	  = Abs (givenTree);
+	GetInformation (seqStrings, filteredData);
+	
+	
+	
+	pairwiseMap       = {190,filteredDataA.sites};
+	pairToCounterMap  = {20,20};
+	oneStepReachable  = {190,1};
+	
+	idx = 0;
+	
+	pairwiseString = "";
+	
+	for (h=0; h<20; h=h+1)
+	{
+		for (v=h+1; v<20; v=v+1)
+		{
+			pairToCounterMap[h][v] = idx;
+			pairToCounterMap[v][h] = idx;
+			pairwiseString = pairwiseString + ";" + characterOrder[h] + characterOrder[v];
+			idx = idx+1;
+		}
+	}
+	
+	hshift = 0;
+	for (h=0; h<64; h=h+1)
+	{
+		if (_Genetic_Code[h]==10) 
+		{
+			hshift = hshift+1;
+			continue; 
+		}
+		
+		vshift = hshift;
+		for (v = h+1; v<64; v=v+1)
+		{
+			diff = v-h;
+			if (_Genetic_Code[v]==10) 
+			{
+				vshift = vshift+1;
+				continue; 
+			}
+			nucPosInCodon = 2;
+			if ((h$4==v$4)||((diff%4==0)&&(h$16==v$16))||(diff%16==0))
+			{
+				aa1 = _Genetic_Code[h];
+				aa2 = _Genetic_Code[v];
+				
+				if (aa1!=aa2) 
+				{
+					aa1 = aa1-(aa1>10);
+					aa2 = aa2-(aa2>10);
+					aa1 = pairToCounterMap[aa1][aa2];
+					oneStepReachable [aa1] = 1;
+				}
+			}
+		}
+	}
+
+	synonymousMap     = {20,filteredDataA.sites};		
+	return 0;
+}
+
+/*-------------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function mapSiteToTree (site)
+{
+	TREE_OUTPUT_OPTIONS = {};
+	k = filteredData.species+1;
+	
+	countSubstitutionsInt  = {};
+	countSubstitutionsLeaf = {};
+	
+	/* first sequence is always the root */
+	c1 = dupInfoA[site];
+	for (h=1; h<filteredDataA.species; h=h+1)
+	{
+		p1  = seqToBranchMap[k][0];
+		pid = flatTreeRep[p1];
+		p2  = seqToBranchMap[pid][1]-filteredData.species;
+		
+		cd1 = codonInfo2[h] [c1];
+		cd2 = codonInfo2[p2][c1];
+				
+		aa1 = _GC_[cd1];
+		aa2 = _GC_[cd2];
+		
+		if (cd1 != cd2)
+		{
+			if (aa1 == aa2)
+			{
+				synonymousMap[aa1][site] = synonymousMap[aa1][site] + 1;
+			}
+			else
+			{
+				idx		    = pairToCounterMap[aa1][aa2];
+				pairwiseMap [idx][site] = pairwiseMap [idx][site] + 1;
+			}
+		}
+		
+
+		cd1 = branchNames[p1];
+		
+		k=k+1;
+	}
+	
+	/* now do the leaves */
+	
+	c2 = dupInfo[site];
+	for (h=0; h<filteredData.species; h=h+1)
+	{
+		p1  = seqToBranchMap[h][0];
+		pid = flatTreeRep[p1];
+		p2  = seqToBranchMap[pid][1]-filteredData.species;
+		cd2 = codonInfo2[p2][c1];
+		cd1 = codonInfo [h][c2];
+		
+		if (cd1>=0)
+		/* no ambiguities */
+		{
+			aa1 = _GC_[cd1];
+			aa2 = _GC_[cd2];			
+			if (cd1 != cd2)
+			{
+				if (aa1 == aa2)
+				{
+					synonymousMap[aa1][site] = synonymousMap[aa1][site] + 1;
+				}
+				else
+				{
+					idx		    = pairToCounterMap[aa1][aa2];
+					pairwiseMap [idx][site] = pairwiseMap [idx][site] + 1;
+				}
+			}
+
+			cd1 = branchNames[p1];
+			TREE_OUTPUT_OPTIONS[cd1] = nodeSpec;
+		}	
+		else
+		/* ambiguities here */
+		{
+			seqString = seqStrings[h];
+			GetDataInfo    (ambInfo, filteredData, h, c2);	
+			
+			corrector = Transpose (ambInfo["1"]) * ambInfo;
+			if (corrector[0] < stateCharCount)
+			{
+				corrector = 1/corrector[0];
+				aa2 	  = _GC_[cd2];			
+
+				for (k=0; k<stateCharCount; k=k+1)
+				{
+					if (ambInfo[k])
+					{
+						aa1  = _GC_[k];
+						if (k != cd2)
+						{
+							if (aa1 == aa2)
+							{
+								synonymousMap[aa1][site] = synonymousMap[aa1][site] + corrector;
+							}
+							else
+							{
+								idx		    			 = pairToCounterMap[aa1][aa2];
+								pairwiseMap [idx][site]  = pairwiseMap [idx][site] + corrector;
+							}
+						}
+					}
+				}	
+			}
+			cd1 = branchNames[p1];
+		}
+	}
+		
+	return 0;
+}
+
+/*-------------------------------------------------------------------------------------------------------------------------------------------------*/
+
+function 	storeProfile (recp&, string, value)
+{
+	for (h=0; h<Abs(string); h=h+1)
+	{
+		v = string[h];
+		v = orderMap[v];
+		recp[v] = value;
+	}
+	return 0;
+}
+
+/*-------------------------------------------------------------------------------------------------------------------------------------------------*/
+
+stanfel	 = {20,1};
+
+order = "FLIMVSPTAYHQNKDECWRG";
+orderMap = {};
+
+for (h=0; h<20; h=h+1)
+{
+	v = order[h];
+	orderMap[v] = h;
+}
+
+
+storeProfile ("stanfel","ACGILMPSTV",1);
+storeProfile ("stanfel","DENQ",2);
+storeProfile ("stanfel","FWY",3);
+storeProfile ("stanfel","HKR",4);
+
+
+setupMapToTree(0);
+
+labels         = {1,filteredData.sites+1};
+
+for (site_enumerator = 0; site_enumerator < filteredData.sites; site_enumerator = site_enumerator + 1)
+{
+	mapSiteToTree (site_enumerator);
+	labels [site_enumerator] = "Site " + (site_enumerator+1);
+}
+
+labels[site_enumerator] = pairwiseString;
+
+OpenWindow (CHARTWINDOW,{{"Pairwise counts by site"}
+		{"labels"}
+		{"pairwiseMap"}
+		{"None"}
+		{""}
+		{""}
+		{""}
+		{""}
+		{""}
+		{"0"}
+		{""}
+		{"-1;-1"}
+		{"10;1.309;0.785398"}
+		{"Times:12:0;Times:10:0;Times:12:2"}
+		{"0;0;16777215;0;0;0;6579300;11842740;13158600;14474460;0;3947580;16777215;16711680;6845928;16771158;2984993;9199669;7018159;1460610;16748822;11184810;14173291"}
+		{"16,0,0"}
+		},
+		"749;663;200;200");
+
+labels = {{"Count","One Step Reachable","Stanfel Change",pairwiseString}};
+
+h = {filteredData.sites,1};
+h = h["1"];
+
+pairwiseTotal     = pairwiseMap * h;
+h = Rows(pairwiseMap);
+pairwiseTotalPlus = {h,3};
+
+for (h=0; h<20; h=h+1)
+{
+	for (v=h+1; v<20; v=v+1)
+	{
+		h2 = pairToCounterMap[h][v];
+		pairwiseTotalPlus[h2][2] = (stanfel[h] == stanfel[v]);
+	}
+}
+
+h = Rows(pairwiseMap);
+
+consCount = 0;
+radCount  = 0;
+
+for (v = 0; v < h; v = v + 1)
+{
+	pairwiseTotalPlus[v][0] = pairwiseTotal[v];
+	pairwiseTotalPlus[v][1] = oneStepReachable[v];
+	if (pairwiseTotalPlus[v][2])
+	{
+		radCount  = radCount + pairwiseTotal[v];
+	}
+	else
+	{
+		consCount = consCount + pairwiseTotal[v];
+	}	
+	
+}
+
+synCount = {1,20};
+synCount = synCount["1"]*synonymousMap;
+synCount = synCount*Transpose(synCount["1"]);
+
+fprintf (stdout, "\n", synCount[0], " synonymous substitutions\n", consCount, " conservative substitutions\n", radCount, " radical substitutions\n");	
+OpenWindow (CHARTWINDOW,{{"Pairwise counts totals"}
+		{"labels"}
+		{"pairwiseTotalPlus"}
+		{"None"}
+		{""}
+		{""}
+		{""}
+		{""}
+		{""}
+		{"0"}
+		{""}
+		{"-1;-1"}
+		{"10;1.309;0.785398"}
+		{"Times:12:0;Times:10:0;Times:12:2"}
+		{"0;0;16777215;0;0;0;6579300;11842740;13158600;14474460;0;3947580;16777215;16711680;6845928;16771158;2984993;9199669;7018159;1460610;16748822;11184810;14173291"}
+		{"16,0,0"}
+		},
+		"749;663;70;70");		
diff --git a/res/UserAddins/OldAddins/LocaldNdS b/res/UserAddins/OldAddins/LocaldNdS
new file mode 100644
index 0000000..b1e93c9
--- /dev/null
+++ b/res/UserAddins/OldAddins/LocaldNdS
@@ -0,0 +1,67 @@
+treeCount = Rows ("Tree");
+
+if (treeCount > 0)
+{
+	treeChoices = {treeCount,2};
+	for (k=0; k<treeCount; k=k+1)
+	{
+		GetString (treeID, Tree, k);
+		treeChoices [k][0] = treeID;
+		treeChoices [k][1] = "Tree " + treeID;
+	}
+	
+	chosenTree = 0;
+	if (treeCount > 1)
+	{
+		ChoiceList (chosenTree, "Which tree?", 1, SKIP_NONE, treeChoices);
+		if (chosenTree < 0)
+		{
+			return 0;
+		}
+	}
+	
+	treeName 			= treeChoices[chosenTree][0];
+	ExecuteCommands 	("branchNames = BranchName(" + treeName + ", -1);"); 
+	branchCount 		= Columns (branchNames)-1;
+	fprintf 			(stdout, branchCount, " nodes\n");
+	
+	dNdSMatrix	= {branchCount,3};
+	maxdS = 0;
+	for (bid = 0; bid < branchCount; bid = bid + 1)
+	{
+		isI = ((branchNames[bid]$"Node")[0]>=0);
+		ExecuteCommands ("dNdSMatrix[bid][0] = " + treeName + "." + branchNames[bid] + ".synRate;");
+		ExecuteCommands ("dNdSMatrix[bid][1] = " + treeName + "." + branchNames[bid] + ".nonSynRate;");
+		maxdS = Max (maxdS,dNdSMatrix[bid][0]);
+		if (isI)
+		{
+			dNdSMatrix[bid][2] = dNdSMatrix[bid][1];
+			dNdSMatrix[bid][1] = -1;
+		}
+		else
+		{
+			dNdSMatrix[bid][2] = -1;
+		}
+	}
+	
+	columnHeaders = {{"dS","dN Leaf","dN Internal"}};
+	OpenWindow (CHARTWINDOW,{{"dS and dN by branch"}
+		{"columnHeaders"}
+		{"dNdSMatrix"}
+		{"Scatterplot"}
+		{"dS"}
+		{"dN Leaf;dN Internal"}
+		{""}
+		{""}
+		{""}
+		{"3"}
+		{"_x_"}
+		{"-1;-1"}
+		{"10;1.309;0.785398"}
+		{"Times:12:0;Times:10:0;Times:12:2"}
+		{"0;0;16777215;11776947;0;0;6579300;11842740;13158600;14474460;0;3947580;16777215;15670812;6845928;16771158;2984993;9199669;7018159;1460610;16748822;11184810;14173291"}
+		{"16,0,"+maxdS}
+		},
+		"SCREEN_HEIGHT*2/3;SCREEN_HEIGHT*2/3+120;70;70");
+}
+
diff --git a/res/UserAddins/OldAddins/ModelFitSummary b/res/UserAddins/OldAddins/ModelFitSummary
new file mode 100644
index 0000000..f58716e
--- /dev/null
+++ b/res/UserAddins/OldAddins/ModelFitSummary
@@ -0,0 +1,25 @@
+LFCompute (lf,LF_START_COMPUTE);
+LFCompute (lf,res);
+LFCompute (lf,LF_DONE_COMPUTE);
+
+GetString (varDescs,lf,-1);
+
+fprintf (stdout, "\n\nLogL    = ", res,"\n");
+df_count = Columns(varDescs["Local Independent"]) + Columns(varDescs["Global Independent"])+14;
+fprintf (stdout, "Locals  = ", Columns(varDescs["Local Independent"]),
+				 "\nGlobals = ", Columns(varDescs["Global Independent"]),
+				 "\nD.F.    = ", df_count, "(", df_count-12, ")",
+				 "\nSites   = ", filteredData.sites,
+				 "\nAIC     = ",2(-res+df_count), " ", 2(-res+df_count-12), " ", 2(-res+df_count+1),
+				 "\ncAIC(15)= ",2(-res+df_count(filteredData.sites/(filteredData.sites-df_count-1))),
+				 "\ncAIC (3)= ",2(-res+(df_count-12)*(filteredData.sites/(filteredData.sites-df_count+11))),",",2(-res+(df_count-7)*(filteredData.sites/(filteredData.sites-df_count+6))),"\n");
+				 
+bls = BranchLength (givenTree,-1);
+
+blSum = 0;
+for (k=0; k<Columns(bls); k=k+1)
+{
+	blSum = blSum + bls[k];
+}				 
+
+fprintf (stdout, "Tree L  = ", blSum ,"\n");
diff --git a/res/UserAddins/OldAddins/ModelFitSummaryAA b/res/UserAddins/OldAddins/ModelFitSummaryAA
new file mode 100644
index 0000000..98bd9da
--- /dev/null
+++ b/res/UserAddins/OldAddins/ModelFitSummaryAA
@@ -0,0 +1,54 @@
+LFCompute (lf,LF_START_COMPUTE);
+LFCompute (lf,res);
+LFCompute (lf,LF_DONE_COMPUTE);
+
+GetString (varDescs,lf,-1);
+
+fprintf (stdout, "\n\nLogL    = ", res,"\n");
+df_count = Columns(varDescs["Local Independent"]) + Columns(varDescs["Global Independent"]) - 1;
+fprintf (stdout, "Locals  = ", Columns(varDescs["Local Independent"]),
+				 "\nGlobals = ", Columns(varDescs["Global Independent"]),
+				 "\nD.F.    = ", df_count,
+				 "\nSites   = ", filteredData.sites,
+				 "\nAIC     = ",2(-res+df_count),
+				 "\nAIC (+F)= ",2(-res+df_count + 19),
+				 "\ncAIC    = ",2(-res+df_count(filteredData.sites/(filteredData.sites-df_count-1))),
+				 "\ncAIC(+F)= ",2(-res+(df_count+19)*(filteredData.sites/(filteredData.sites-df_count-20))),"\n");
+				 
+bls = BranchLength (givenTree,-1);
+
+blSum = 0;
+for (k=0; k<Columns(bls); k=k+1)
+{
+	blSum = blSum + bls[k];
+}				 
+
+fprintf (stdout, "Tree L  = ", blSum ,"\n");
+
+t = 1; 
+c = 1;
+ExecuteCommands ("GetInformation (aRateMx, givenTree."+TipName(givenTree,0)+");");
+aRateMx 		= aRateMx*(1/bls[0]);
+aRateMx2        = aRateMx;
+
+for (k=0; k<20; k=k+1)
+{
+	aRateMx2[k][19] = 1;
+}
+
+aRateMx2 = (Inverse(aRateMx2))[19][-1];
+rates190 = {190,1};
+z = 0;
+for (h=0; h<20; h=h+1)
+{
+	for (v=h+1; v<20; v=v+1)
+	{
+		rates190[z] = aRateMx[h][v]/aRateMx2[v];
+		z = z+1;
+	}
+}
+
+rates190 = rates190%0;
+
+fprintf (stdout, "\nRates: \nMin = ", rates190[0], "\nMax = ", rates190[189], "\nMean= ", (Transpose(rates190["1"])*rates190*(1/190))[0],
+				 "\nMed = ", 0.5(rates190[89]+rates190[90]), "\n");
diff --git a/res/UserAddins/OldAddins/Multiclass DN DS inference b/res/UserAddins/OldAddins/Multiclass DN DS inference
new file mode 100644
index 0000000..052918b
--- /dev/null
+++ b/res/UserAddins/OldAddins/Multiclass DN DS inference	
@@ -0,0 +1,229 @@
+defined_Global = {};
+
+GetString (varDescs,lf,-1);
+
+varDescs = varDescs["Global Independent"];
+
+for (k=0; k<Columns (varDescs); k=k+1)
+{
+	aVar 		   = varDescs [k];
+	defined_Global [aVar] = 1;
+}
+
+
+for (k=0; ; k=k+1)
+{
+	aVar = "DN_"+k;
+	if (defined_Global [aVar] == 0)
+	{
+		break;
+	}
+}
+
+fprintf (stdout, "\nA ", k, " rate model\n");
+
+DN_Values = {k,1};
+
+for (rc1=0; rc1<k; rc1=rc1+1)
+{
+	ExecuteCommands ("DN_Values[rc1]=DN_"+rc1+";");
+}
+
+DN_Values = DN_Values % 0;
+
+modelDim = Rows (theRateMatrix);
+
+freqMultiplier = {modelDim, modelDim};
+offDiag		   = {modelDim, modelDim};
+rowOfOnes	   = {modelDim, 1};
+
+for (k=0; k<modelDim; k=k+1)
+{
+	freqMultiplier[k][k] = vectorOfFrequencies[k];
+	rowOfOnes[k] = 1;
+}
+
+for (k=0; k<modelDim; k=k+1)
+{
+	for (k2=k+1; k2<modelDim; k2=k2+1)
+	{
+		offDiag[k][k2] = 1;
+		offDiag[k2][k] = 1;
+	}
+}
+
+synRate = 1;
+c		= 1;
+d		= 0;
+
+dSProdMatrix = Transpose(rowOfOnes)*freqMultiplier*(theRateMatrix$offDiag)*rowOfOnes;
+
+c		= 0;
+d		= 1;
+dNProdMatrix = Transpose(rowOfOnes)*freqMultiplier*(theRateMatrix$offDiag)*rowOfOnes;
+
+GetInformation (cDistro, c);
+GetInformation (dDistro, d);
+
+ccc =  Columns (cDistro);
+dcc =  Columns (dDistro);
+
+fprintf (stdout,ccc, " synonymous rate categories\n");
+fprintf (stdout, dcc, " non-synonymous rate categories\n");
+
+siteCount = filteredData.sites;
+GetInformation (catOrder, lf);
+
+if (catOrder[0]!="c")
+{
+	flipOrder = 1;
+}
+else
+{
+	flipOrder = 0;
+}
+
+fprintf (stdout, "\nConstructing a matrix of conditionals...\n");
+ConstructCategoryMatrix (marginalMatrix, lf, COMPLETE);
+
+if (flipOrder)
+{
+	fprintf (stdout, "\nFlipping the ordering of matrix rows...");
+	mmx2 = {ccc*dcc,siteCount};
+	for (cc = 0; cc < siteCount; cc = cc+1)
+	{
+		for (rc1 = 0; rc1 < dcc; rc1 = rc1+1)
+		{
+			for (rc2 = 0; rc2 < ccc; rc2 = rc2 + 1)
+			{
+				mmx2 [rc2*dcc+rc1][cc] = marginalMatrix[rc1*ccc+rc2][cc];
+			}
+		}
+	}
+	marginalMatrix = mmx2;
+	mmx2 = 0;
+}
+
+computeRatioDistro = {ccc*dcc,3};
+
+mmx2 = 0;
+
+fprintf (stdout, "\nComputing rate distributions...\n");
+
+R_MIN = DN_Values[0];
+R_MAX = DN_Values[Rows(DN_Values)-1];
+T_MIN  = {};
+T_AV   = {};
+T_MAX  = {};
+PR_MIN = 0;
+PR_AV  = 0;
+PR_MAX = 0;
+
+
+
+for (rc1 = 0; rc1 < ccc; rc1 = rc1+1)
+{
+	for (rc2 = 0; rc2 < dcc; rc2 = rc2 + 1)
+	{
+		cc = rc1*dcc+rc2;
+		computeRatioDistro[cc][0] = dDistro[0][rc2]-cDistro[0][rc1];
+		computeRatioDistro[cc][1] = dDistro[1][rc2]*cDistro[1][rc1];
+		
+		if (R_MIN*dDistro[0][rc2]>cDistro[0][rc1])
+		{
+			T_MIN[mmx2] = 1;
+			PR_MIN = PR_MIN + computeRatioDistro[cc][1];
+		}
+		
+		if (R_MAX*dDistro[0][rc2]>cDistro[0][rc1])
+		{
+			T_MAX[mmx2] = 1;
+			PR_MAX = PR_MAX + computeRatioDistro[cc][1];
+		}
+		
+		if (dNProdMatrix[0]*dDistro[0][rc2]>cDistro[0][rc1]*dSProdMatrix[0])
+		{
+			T_AV[mmx2] = 1;
+			PR_AV = PR_AV + computeRatioDistro[cc][1];
+		}
+
+		computeRatioDistro[cc][2] = mmx2;
+		mmx2 = mmx2+1;
+	}
+}
+
+fprintf (stdout, Abs(T_MIN), " rate classes for the minumum criterion. P{Prior}=",PR_MIN,"\n");
+fprintf (stdout, Abs(T_AV), " rate classes for the mean criterion. P{Prior}=",PR_AV,"\n");
+fprintf (stdout, Abs(T_MAX), " rate classes for the maximum criterion. P{Prior}=",PR_MAX,"\n");
+
+processedMatrix = {siteCount, 9};
+
+for (rc1 = 0; rc1 < siteCount; rc1 = rc1+1)
+{
+	colSum = 0;
+	for (rc2 = 0; rc2 < ccc*dcc; rc2 = rc2 + 1)
+	{
+		mmx2 = computeRatioDistro[rc2][1]*marginalMatrix[rc2][rc1];
+		colSum = colSum + mmx2;
+		marginalMatrix[rc2][rc1] = mmx2;
+	}
+	POST_MIN = 0;
+	POST_MAX = 0;
+	POST_AV  = 0;
+	for (rc2 = 0; rc2 < ccc*dcc; rc2 = rc2 + 1)
+	{
+		marginalMatrix[rc2][rc1] = marginalMatrix[rc2][rc1]/colSum;
+		if (T_MIN[rc2])
+		{
+			POST_MIN = POST_MIN + marginalMatrix[rc2][rc1];
+		}
+		if (T_MAX[rc2])
+		{
+			POST_MAX = POST_MAX + marginalMatrix[rc2][rc1];
+		}
+		if (T_AV[rc2])
+		{
+			POST_AV = POST_AV + marginalMatrix[rc2][rc1];
+		}
+	}
+	processedMatrix[rc1][0] = PR_MIN;
+	processedMatrix[rc1][3] = PR_AV;
+	processedMatrix[rc1][6] = PR_MAX;
+	processedMatrix[rc1][1] = POST_MIN;
+	processedMatrix[rc1][4] = POST_AV;
+	processedMatrix[rc1][7] = POST_MAX;
+	
+	if (PR_MIN > 0 && POST_MIN > 0)
+	{
+		processedMatrix[rc1][2] = POST_MIN*(1-PR_MIN)/((1-POST_MIN)*PR_MIN);	
+	}
+	if (PR_MAX > 0 && POST_MAX > 0)
+	{
+		processedMatrix[rc1][5] = POST_MAX*(1-PR_MAX)/((1-POST_MAX)*PR_MAX);	
+	}
+	if (PR_AV > 0 && POST_AV > 0)
+	{
+		processedMatrix[rc1][8] = POST_AV*(1-PR_AV)/((1-POST_AV)*PR_AV);	
+	}
+}
+
+columnHeaders = {{"MIN Prior","MIN Posterior","MIN Bayes Factor","Mean Prior","Mean Posterior","Mean Bayes Factor","MAX Prior","MAX Posterior","MAX Bayes Factor"}};
+
+OpenWindow (CHARTWINDOW,{{"Positive Selection Profile"}
+						{"columnHeaders"}
+						{"processedMatrix"}
+						{"Bar Chart"}
+						{"Index"}
+						{"Mean Posterior"}
+						{""}
+						{""}
+						{""}
+						{"0"}
+						{""}
+						{"0;0"}
+						{"10;1.309;0.785398"}
+						{"Times:12:0;Times:10:0;Times:12:2"}
+						{"0;0;13816530;16777215;0;0;6579300;11842740;13158600;14474460;0;3947580;16777215;15670812;6845928;16771158;2984993;9199669;7018159;1460610;16748822;11184810;14173291"}
+						{"16,0,0"}
+						},
+						"SCREEN_WIDTH-200;SCREEN_HEIGHT-150;100;100");
diff --git a/res/UserAddins/OldAddins/PartitionBranchesByClasses b/res/UserAddins/OldAddins/PartitionBranchesByClasses
new file mode 100644
index 0000000..402af69
--- /dev/null
+++ b/res/UserAddins/OldAddins/PartitionBranchesByClasses
@@ -0,0 +1,44 @@
+avTreeCount = Rows ("Tree");
+
+if (avTreeCount>=1)
+{
+	choices = {avTreeCount,2};
+	for (k=0; k<avTreeCount;k=k+1)
+	{
+		GetString (tName, Tree, k);
+		choices[k][0] = tName;
+		choices[k][1] = "Tree "+tName;
+	}
+	
+	ChoiceList (tIndex,"Partition tree rates into classes:",1,SKIP_NONE,choices);
+	if (tIndex>=0)
+	{
+		GetString (tName, Tree, tIndex);
+		ExecuteCommands ("tree_bn=BranchName("+tName+",-1);");
+		SetDialogPrompt ("Branch partitioning file:");
+		fscanf (PROMPT_FOR_FILE, "Raw", defString);
+		ExecuteCommands (defString);
+		mappedTypes = {};
+		for (k=Columns(tree_bn)-2; k>=0; k=k-1)
+		{
+			bName = tree_bn[k];
+			if (bName/"Node*")
+			{
+				mappedID = branchAssignments[bName];
+			}
+			else
+			{
+				mappedID = branchAssignments[bName&&1];			
+			}
+			if (mappedTypes[mappedID] == 0)
+			{
+				ExecuteCommands ("global dNdS"+mappedID+"=1;");
+				mappedTypes[mappedID] = 1;
+			}
+			ExecuteCommands (tName+"."+bName+".nonSynRate:=dNdS"+mappedID+"*"+tName+"."+bName+".synRate;");
+		}
+	}
+}
+
+
+
diff --git a/res/UserAddins/OldAddins/PredictivePosteriorP b/res/UserAddins/OldAddins/PredictivePosteriorP
new file mode 100644
index 0000000..fa380a6
--- /dev/null
+++ b/res/UserAddins/OldAddins/PredictivePosteriorP
@@ -0,0 +1,322 @@
+likelihoodFnChoice = 0;
+if (Rows("LikelihoodFunction")>1)
+{
+	ChoiceList  (likelihoodFnChoice,"Choose a Likelihood Function",1,NO_SKIP,LikelihoodFunction);
+}		
+if (likelihoodFnChoice<0)
+{
+	return;
+} 
+LIKELIHOOD_FUNCTION_OUTPUT = response;
+GetString(LF_NAME,LikelihoodFunction,likelihoodFnChoice);
+
+GetString(paramName, LF_NAME, 0);
+fParams = {};
+pC = 1;
+while (Abs(paramName))
+{
+	GetString (dumb, paramName__,0);
+	dumb = dumb$"^[0-9]";
+	if (dumb[0]==0)
+	{
+		fParams[paramName] = 1;
+	}
+	GetString(paramName, LF_NAME__, pC);
+	pC = pC+1;
+}
+
+
+fKeys = Rows(fParams);
+cKeys = {Abs(fParams),2};
+
+for (k=0; k<Abs(fParams); k=k+1)
+{
+	cKeys[k][0] = fKeys[k];
+	cKeys[k][1] = fKeys[k];
+}
+
+ChoiceList  (paramChoice,"Choose parameters to sample over",0,NO_SKIP,cKeys);
+
+if (paramChoice[0]>=0)
+{
+	COVARIANCE_PARAMETER = {};
+	for (k=0; k < Columns(paramChoice); k=k+1)
+	{
+		aKey = paramChoice[k];
+		aKey = cKeys[aKey][0];
+		COVARIANCE_PARAMETER[aKey] = 1;
+	}
+}
+else
+{
+	return 0;
+}
+
+SAMPLE_N = 0;
+while (SAMPLE_N < 1)
+{
+	fprintf (stdout, "\nSample size (>=1) ?");
+	fscanf (stdin, "Number", SAMPLE_N);
+}
+
+SAMPLE_M = 0;
+while (SAMPLE_M < 1 || SAMPLE_M > SAMPLE_N)
+{
+	fprintf (stdout, "\nRe-sample size ([1,",SAMPLE_N,"]) ?");
+	fscanf (stdin, "Number", SAMPLE_M);
+}
+
+varCount = Abs(COVARIANCE_PARAMETER);
+usedVars = Rows(COVARIANCE_PARAMETER);
+
+fprintf (stdout, "\nObtaining profile likeihood bounds...\n");
+
+svpc = COVARIANCE_PRECISION;
+
+COVARIANCE_PRECISION = 0;
+while (COVARIANCE_PRECISION >= 1 || COVARIANCE_PRECISION <= 0)
+{
+	fprintf (stdout, "\nCI Level ([0,1]) ?");
+	fscanf (stdin, "Number", COVARIANCE_PRECISION);
+}
+
+ExecuteCommands ("CovarianceMatrix (covMx, "+LF_NAME+");");
+
+COVARIANCE_PRECISION = svpc;
+stashedValues = {varCount,4};
+
+assignmentString = "";
+assignmentString * 256;
+assignmentString2 = "";
+assignmentString2 * 256;
+
+for (k=0; k<varCount; k=k+1)
+{
+	aKey = usedVars[k];
+	stashedValues[k][0] = covMx[k][1];
+	stashedValues[k][1] = covMx[k][0];
+	stashedValues[k][2] = covMx[k][2];
+	stashedValues[k][3] = (covMx[k][2]-covMx[k][0])/SAMPLE_N;
+	assignmentString * (aKey+ "=generatedSamples[itCount]["+k+"];\n");
+	assignmentString2 * (aKey+ "=sampledPoints[itCount]["+(k+1)+"];\n");
+}
+
+assignmentString * 0;
+assignmentString2 * 0;
+
+varCount	= Rows (covMx);
+generatedSamples = {SAMPLE_N,varCount};
+indexVector		 = {1,SAMPLE_N};
+
+for (k=0; k<SAMPLE_N; k=k+1)
+{
+	indexVector[k] = k;
+}
+
+fprintf (stdout, "\nDoing Latin hypercube sampling...\n");
+
+for (k=0; k<varCount; k=k+1)
+{
+	permVector = Random (indexVector,1);
+	lb = stashedValues[k][1];
+	st = stashedValues[k][3];
+	for (m = 0; m<SAMPLE_N; m=m+1)
+	{
+		generatedSamples[m][k] = lb+st*permVector[m];
+	}
+}
+
+#include "../ChartAddIns/Samplers/srs.ibf";
+
+fprintf (stdout, "\nComputing expected Bayes Factors and expected posterior rates...\n");
+
+ExecuteCommands ("GetInformation(catVars,"+LF_NAME+");");
+
+if (Columns (catVars) > 1)
+{
+	have2 = 1;
+	doSwap = (catVars[0] != "c");
+}
+else
+{
+	have2 = 0;
+}
+
+ExecuteCommands ("ConstructCategoryMatrix (marginalMatrix0,"+LF_NAME+",COMPLETE);");
+
+rateAssignmentMatrix = {SAMPLE_M, 1+Columns (marginalMatrix0)};
+BFMatrix             = {SAMPLE_M, 1+Columns (marginalMatrix0)};
+labels				 = {1,Columns (marginalMatrix0)+1};
+
+
+maxL = -1e100;
+
+timer = Time (0);
+
+for (itCount=0; itCount<SAMPLE_M; itCount=itCount+1)
+{
+	if (sampledPoints[itCount][0]>maxL)
+	{
+		maxL = sampledPoints[itCount][0];
+	}
+	ExecuteCommands (assignmentString2);
+	ExecuteCommands ("ConstructCategoryMatrix (marginalMatrix,"+LF_NAME+",COMPLETE);");
+	GetInformation (distribMX,c);
+	if (have2)
+	{
+		GetInformation (distribMX2,d);	
+		D1 = Columns(distribMX2);
+		D2 = Columns(distribMX);
+			
+		distribMXR = {2,D1*D2};
+		
+		if (doSwap == 0)
+		{
+			for (k=0; k<D2; k=k+1)
+			{
+				E = k*D1;
+				for (k2 = 0; k2<D1; k2=k2+1)
+				{
+					distribMXR [0][E+k2] = R*distribMX2[0][k2]-distribMX[0][k];
+					distribMXR [1][E+k2] = R*distribMX2[1][k2]*distribMX[1][k];
+				}
+			}
+		}
+		else
+		{
+			for (k=0; k<D1; k=k+1)
+			{
+				E = k*D2;
+				for (k2 = 0; k2<D2; k2=k2+1)
+				{
+					distribMXR [0][E+k2] = R*distribMX2[0][k]-distribMX[0][k2];
+					distribMXR [1][E+k2] = distribMX2[1][k]*distribMX[1][k2];
+				}
+			}		
+		}
+		distribMX = distribMXR;
+	}
+	else
+	{
+		D1 = Columns(distribMX);
+		for (k=0; k<D1; k=k+1)
+		{
+			distribMX[0][k] = distribMX[0][k]-1;
+		}
+	}
+	
+	
+	ComputePosteriors (itCount);	
+	if ((1+itCount) % 10 == 0)
+	{
+		fprintf (stdout, itCount+1, "/", SAMPLE_M, " samples processed. Estimated remaining time: ",Format (((SAMPLE_M-itCount-1)/(itCount+1))*(Time(0)-timer),5,2)," seconds \n");
+	}
+}
+
+sum = 0;
+
+for (itCount=0; itCount<SAMPLE_M; itCount=itCount+1)
+{
+	sum = sum + Exp(sampledPoints[itCount][0]-maxL);
+}
+
+for (itCount=0; itCount<SAMPLE_M; itCount=itCount+1)
+{
+	rateAssignmentMatrix[itCount][0] = Exp(sampledPoints[itCount][0]-maxL)/sum;
+	BFMatrix[itCount][0] = Exp(sampledPoints[itCount][0]-maxL)/sum;	
+}
+
+for (k=0; k<varCount; k=k+1)
+{
+	aKey = usedVars[k];
+	ExecuteCommands (aKey + "=" + stashedValues[k][0] + ";");
+}	
+
+labels[0] = "Weight";
+for (k=Columns (marginalMatrix0); k; k=k-1)
+{
+	labels[k] = "Codon " + k;
+}	
+
+OpenWindow (CHARTWINDOW,{{"Bayes Factors for dN>dS"}
+					   {"labels"},
+					   {"BFMatrix"},
+					   {""},
+					   {"Index"},
+					   {""},
+					   {""},
+					   {""},
+					   {""},
+					   {"3"}},
+					   "(SCREEN_WIDTH-200);(SCREEN_HEIGHT-200);90;110");
+					   
+OpenWindow (CHARTWINDOW,{{"Posterior estimates of dN-dS)"}
+					   {"labels"},
+					   {"rateAssignmentMatrix"},
+					   {""},
+					   {"Index"},
+					   {""},
+					   {""},
+					   {""},
+					   {""},
+					   {"3"}},
+					   "(SCREEN_WIDTH-200);(SCREEN_HEIGHT-200);100;120");
+
+function ComputePosteriors (sampleIndex)
+{
+	rMMX  = Rows(marginalMatrix);
+	counter3 	 = 0;
+	ratesOverOne = {Columns(distribMX),1};
+	
+	for (counter1=0; counter1<Columns(distribMX); counter1=counter1+1)
+	{
+		if (distribMX [0][counter1]>0)
+		{
+			ratesOverOne[counter3][0] = counter1;
+			counter3 = counter3 + 1;
+		}
+	}
+
+	priorOdds = 0;
+	for (k=0; k<Columns(distribMX); k=k+1)
+	{
+		if (distribMX [0][k]>0)
+		{
+			priorOdds = priorOdds + distribMX [1][k];
+		}
+	}
+	priorOdds = priorOdds/(1-priorOdds);
+
+	for (counter1 = 0; counter1 < Columns (marginalMatrix); counter1=counter1+1)
+	{
+		columnSum = 0;				
+		for (counter2 = 0; counter2 < rMMX; counter2 = counter2+1)
+		{
+			tempVal   = marginalMatrix [counter2][counter1];
+			columnSum = columnSum + tempVal*distribMX[1][counter2];
+			marginalMatrix [counter2][counter1] = tempVal * distribMX[1][counter2];
+		}
+		
+		tempVal   = 0;
+		
+		for (counter2 = 0; counter2 < rMMX; counter2 = counter2+1)
+		{
+			tempVal   = tempVal + distribMX[0][counter2]*marginalMatrix [counter2][counter1];
+		}
+		
+		rateAssignmentMatrix[sampleIndex][1+counter1] = tempVal/columnSum;
+
+		tempVal   = 0;
+		
+		for (counter2 = 0; counter2 < counter3; counter2 = counter2+1)
+		{
+			indexVal  = ratesOverOne [counter2][0];
+			tempVal   = tempVal + marginalMatrix [indexVal][counter1];
+		}
+
+		tempVal = tempVal/columnSum;
+		BFMatrix[sampleIndex][1+counter1] = Log(tempVal/(1-tempVal)/priorOdds);
+	}
+	return 0;
+}
+
diff --git a/res/UserAddins/OldAddins/RNARateMatrix b/res/UserAddins/OldAddins/RNARateMatrix
new file mode 100644
index 0000000..a1e8e7c
--- /dev/null
+++ b/res/UserAddins/OldAddins/RNARateMatrix
@@ -0,0 +1,64 @@
+t=1;
+/*compute scaling factor here */
+
+blforT1 = 0;
+
+ChoiceList  (mbf,"Model Type?",1,NO_SKIP,"Muse95","Muse 95 model",
+														  "RNA16","Any particular case of RNA REV");
+
+
+if (mbf)
+{
+	copyOfModelMatrix = RNA16;
+	for (h=0; h<16; h=h+1)
+	{
+		for (v=0; v<16; v=v+1)
+		{
+			if (h!=v)
+			{	
+				blforT1 = blforT1 + copyOfModelMatrix[h][v]*vectorOfFrequencies[v];
+			}
+		}
+	}
+}
+else
+{
+	copyOfModelMatrix = M95;
+	for (h=0; h<16; h=h+1)
+	{
+		for (v=0; v<16; v=v+1)
+		{
+			if (h!=v)
+			{	
+				blforT1 = blforT1 + copyOfModelMatrix[h][v];
+			}
+		}
+	}
+}
+
+t = 1/blforT1;
+if (mbf)
+{
+	copyOfModelMatrix = RNA16;
+}
+else
+{
+	copyOfModelMatrix = M95;
+}
+for (h=0; h<16; h=h+1)
+{
+	copyOfModelMatrix[h][h] = 0;
+	for (v=0; v<16; v=v+1)
+	{
+		if (h!=v)
+		{	
+			copyOfModelMatrix[h][v] = copyOfModelMatrix[h][v] * vectorOfFrequencies[v];
+			copyOfModelMatrix[h][h] = copyOfModelMatrix[h][h] - copyOfModelMatrix[h][v];
+		}
+	}
+}
+
+
+
+SetDialogPrompt ("Save rate and transition matrices to:");
+fprintf (PROMPT_FOR_FILE,CLEAR_FILE,copyOfModelMatrix,"\n",Exp (copyOfModelMatrix));
diff --git a/res/UserAddins/OldAddins/SimulateAndTabDN_DS b/res/UserAddins/OldAddins/SimulateAndTabDN_DS
new file mode 100644
index 0000000..9d346ab
--- /dev/null
+++ b/res/UserAddins/OldAddins/SimulateAndTabDN_DS
@@ -0,0 +1,106 @@
+likelihoodFnChoice = 0;
+
+if (Rows("LikelihoodFunction")>1)
+{
+	ChoiceList  (likelihoodFnChoice,"Choose a Likelihood Function",1,NO_SKIP,LikelihoodFunction);
+}		
+if (likelihoodFnChoice<0)
+{
+	return;
+} 
+
+LIKELIHOOD_FUNCTION_OUTPUT = response;
+GetString(LF_NAME,LikelihoodFunction,likelihoodFnChoice);
+
+GetString(paramName, LF_NAME, 0);
+
+ExecuteCommands ("DataSet   simmedData = SimulateDataSet ("+LF_NAME+",,myRates,myCatVars);");
+
+if (Rows(myCatVars) != 2)
+{
+	fprintf (stdout, "ERROR: the likelihood function should depend on two rate category variables\n");
+	return 0;
+}
+
+catVar1 = myCatVars[0]; /* first cat. variable */
+catVar2 = myCatVars[1]; /* second cat. variable */
+
+/* 
+	decide which one is for dN and which one is for dS; the one with dN is going to end with "Categ_beta"
+	and the one for dS will end with "Categ_alpha" (filter name will serve as a prefix)
+	do this by matching regular expressions
+*/
+
+regExp1 = "(.+)_Categ_beta$";
+regExp2 = "(.+)_Categ_alpha$";
+
+regExpMatch1 = catVar1 $ regExp1;
+regExpMatch2 = catVar2 $ regExp2;
+
+site_count = Columns (myRates);
+
+if (regExpMatch1[0] < 0 || regExpMatch2[0] < 0)
+{
+	regExpMatch1 = catVar1 $ regExp2;
+	regExpMatch2 = catVar2 $ regExp1;
+	if (regExpMatch1[0] < 0 || regExpMatch2[0] < 0)
+	{
+		fprintf (stdout, "ERROR: the likelihood function uses an unsupported model\n");
+		return 0;
+	}
+	startAt = regExpMatch1[2];
+	endAt   = regExpMatch1[3];
+	Rvar	= catVar2[startAt][endAt];
+	
+	for (k = 0; k<site_count; k=k+1)
+	{
+		temp = myRates[0][k];
+		myRates[0][k] = myRates[1][k];
+		myRates[1][k] = temp;
+	}	
+}
+else
+{
+	startAt = regExpMatch1[2];
+	endAt   = regExpMatch1[3];
+	Rvar	= catVar1[startAt][endAt];
+}
+
+/* dN-dS will actually be of the form dN*R-dS, because of model parameterization 
+   get the filterName_Shared_R variable value now */
+   
+
+ExecuteCommands ("rval = " + Rvar + "_Shared_R;");
+dNdSSimmedRateMatrix = {site_count, 3};
+
+for (k=0; k<site_count;k=k+1)
+{
+	dNdSSimmedRateMatrix[k][0] = rval*myRates[0][k];
+	dNdSSimmedRateMatrix[k][1] = myRates[1][k];
+	dNdSSimmedRateMatrix[k][2] = dNdSSimmedRateMatrix[k][0] - dNdSSimmedRateMatrix[k][1];
+}
+
+columnHeaders = {{"dN","dS","dN-dS"}};
+
+OpenWindow (CHARTWINDOW,{{"Simulated dN-dS"}
+		{"columnHeaders"}
+		{"dNdSSimmedRateMatrix"}
+		{"Contrast Bars"}
+		{"Index"}
+		{"dN;dS"}
+		{"Codon"}
+		{"dS"}
+		{"dN"}
+		{"0"}
+		{""}
+		{"-1;-1"}
+		{"10;1.309;0.785398"}
+		{"Times:12:0;Times:10:0;Times:12:2"}
+		{"0;0;13816530;16777215;0;0;6579300;11842740;13158600;14474460;0;3947580;16777215;15670812;6845928;16771158;2984993;9199669;7018159;1460610;16748822;11184810;14173291"}
+		{"16,0,0"}
+		},
+		"725;562;70;70");
+		
+DataSetFilter simmedFilter = CreateFilter (simmedData,1);
+SetDialogPrompt ("Save simulated data to:");
+fprintf (PROMPT_FOR_FILE,CLEAR_FILE,simmedFilter);
diff --git a/res/UserAddins/OldAddins/SimulateFromLF b/res/UserAddins/OldAddins/SimulateFromLF
new file mode 100644
index 0000000..eb94f65
--- /dev/null
+++ b/res/UserAddins/OldAddins/SimulateFromLF
@@ -0,0 +1,37 @@
+avLFCount = Rows ("LikelihoodFunction");
+
+if (avLFCount>=1)
+{
+	choices = {avLFCount,2};
+	for (k=0; k<avLFCount;k=k+1)
+	{
+		GetString (tName, LikelihoodFunction, k);
+		choices[k][0] = tName;
+		choices[k][1] = "Function "+tName;
+	}
+	
+	ChoiceList (tIndex,"Simulate from this likelihood function:",1,SKIP_NONE,choices);
+	if (tIndex>=0)
+	{
+		simCounter = 0;
+		while (simCounter<1)
+		{
+			fprintf (stdout,"\nHow many simulants should be generated (>=1)?");
+			fscanf  (stdin,"Number", simCounter);
+		}	
+
+		GetString (tName, LikelihoodFunction, tIndex);
+		
+		SetDialogPrompt ("Save files to:");
+		fprintf (PROMPT_FOR_FILE,CLEAR_FILE);
+		pathPrefix = LAST_FILE_PATH;
+		
+		for (k=0; k<simCounter; k=k+1)
+		{
+			ExecuteCommands ("DataSet _sData = SimulateDataSet("+tName+");");
+			DataSetFilter _sFilter = CreateFilter (_sData,1);
+			outFile = pathPrefix + "." + k;
+			fprintf (outFile,CLEAR_FILE,_sFilter);
+		}
+	}
+}
diff --git a/res/UserAddins/OldAddins/TreeLengthConstraint b/res/UserAddins/OldAddins/TreeLengthConstraint
new file mode 100644
index 0000000..efb89ab
--- /dev/null
+++ b/res/UserAddins/OldAddins/TreeLengthConstraint
@@ -0,0 +1,81 @@
+treeCount = Rows ("Tree");
+
+if (treeCount > 0)
+{
+	treeChoices = {treeCount,2};
+	for (k=0; k<treeCount; k=k+1)
+	{
+		GetString (treeID, Tree, k);
+		treeChoices [k][0] = treeID;
+		treeChoices [k][1] = "Tree " + treeID;
+	}
+	
+	chosenTree = 0;
+	if (treeCount > 1)
+	{
+		ChoiceList (chosenTree, "Which tree?", 1, SKIP_NONE, treeChoices);
+		if (chosenTree < 0)
+		{
+			return;
+		}
+	}
+	
+	ExecuteCommands ("treeAVL2 = "+treeChoices[chosenTree][0] + " ^ 0;leafCount=TipCount("+treeChoices[chosenTree][0]+");"); 
+	
+	multFactors = {};
+	for (k=1; k<Abs(treeAVL2); k=k+1)
+	{
+		aNode = treeAVL2[k];
+		aNodeName = aNode["Name"];
+		parentIndex = aNode["Parent"];
+		k2 = Abs(aNode["Children"]);
+		if (k2)
+		{
+			currentDepth = aNode["Below"];
+			multFactors[aNodeName] = currentDepth;		
+			if (parentIndex > 0)
+			{
+				pInfo = treeAVL2[parentIndex];
+				pInfo ["Below"] = pInfo ["Below"] + currentDepth;
+				treeAVL2[parentIndex] = pInfo;
+			}
+		}
+		else
+		{
+			multFactors[aNodeName] = 1;
+			pInfo = treeAVL2[parentIndex];
+			pInfo ["Below"] = pInfo ["Below"] + 1;
+			treeAVL2[parentIndex] = pInfo;
+		}
+		
+	}
+
+	pKeys 			= Rows(multFactors);
+
+	for (k=0; k<Columns(pKeys); k=k+1)
+	{
+		aNodeName = pKeys[k];
+		multFactors[aNodeName] = multFactors[aNodeName] * (leafCount-multFactors[aNodeName]);
+	}
+
+	treeAVL2 		= 2*computeTotalDivergence (treeChoices[chosenTree][0])/leafCount/(leafCount-1);
+	fprintf (stdout, "Mean pairwise divergence for ",treeChoices[chosenTree][0], " is ", treeAVL2, "\n");
+}
+
+/*---------------------------------------------------------*/
+
+function computeTotalDivergence (treeID)
+{
+	ExecuteCommands ("bNames = BranchName   ("+treeID+",-1);");
+	ExecuteCommands ("bLen   = BranchLength ("+treeID+",-1);");
+	
+	sum = 0;
+	
+	for (k=0; k<Columns(bNames); k=k+1)
+	{
+		aNodeName = bNames[k];
+		sum = sum + bLen[k]*multFactors[aNodeName];
+	}	
+	return sum;
+}
+
diff --git a/res/UserAddins/OldAddins/dNanddSTrees.bf b/res/UserAddins/OldAddins/dNanddSTrees.bf
new file mode 100644
index 0000000..4aefcd6
--- /dev/null
+++ b/res/UserAddins/OldAddins/dNanddSTrees.bf
@@ -0,0 +1,203 @@
+treeCount = Rows ("Tree");
+lf_Count  = Rows ("LikelihoodFunction");
+
+if (treeCount > 0 && lf_Count > 0)
+{
+	treeChoices = {treeCount,2};
+	for (k=0; k<treeCount; k=k+1)
+	{
+		GetString (treeID, Tree, k);
+		treeChoices [k][0] = treeID;
+		treeChoices [k][1] = "Tree " + treeID;
+	}
+	
+	chosenTree = 0;
+	if (treeCount > 1)
+	{
+		ChoiceList (chosenTree, "Which tree?", 1, SKIP_NONE, treeChoices);
+		if (chosenTree < 0)
+		{
+			return;
+		}
+	}
+	
+	_treeID = treeChoices[chosenTree][0];
+
+	for (lf_ID = 0; lf_ID < lf_Count; lf_ID = lf_ID + 1)
+	{
+		GetString (treeID, LikelihoodFunction,lf_ID);
+		ExecuteCommands ("GetString(lfInfo,"+treeID+",-1);");
+		lfTrees = lfInfo["Trees"];
+		for (k = 0; k<Columns(lfTrees); k=k+1)
+		{
+			if (lfTrees[k] == treeChoices[chosenTree][0])
+			{
+				break;
+			}
+		}
+		if (k < Columns(lfTrees))
+		{
+			fprintf (stdout, "\nTree ",Columns(lfTrees)," is a part of likelihood function ", treeID, "\n");
+			dfName = (lfInfo["Datafilters"])[k];
+			break;
+		}
+		else
+		{
+			return 0;
+		}
+		
+	}
+		
+	ExecuteAFile(HYPHY_LIB_DIRECTORY+"TemplateBatchFiles"+DIRECTORY_SEPARATOR+"TemplateModels"+DIRECTORY_SEPARATOR+"chooseGeneticCode.def");
+
+	ChoiceList  (response,"Output options",1,NO_SKIP,
+				 "Display","Display trees on the console (and graphically if GUI is present).",
+				 "Save to file","Save tree strings to a file (syn followed by non-syn)");
+				 
+	if (response<0)
+	{
+		return 0;
+	}
+
+	ExecuteCommands ("branchNames = BranchName ("+_treeID+",-1);");
+	T = Columns (branchNames);
+
+	ExecuteCommands(
+	"GetInformation (aRateMx, "+_treeID+"."+branchNames[0]+");");
+
+	/* make syn and non-syn template matrices */
+
+	nonStopCount = Columns (aRateMx);
+	ExecuteAFile(HYPHY_LIB_DIRECTORY+"TemplateBatchFiles"+DIRECTORY_SEPARATOR+"Distances"+DIRECTORY_SEPARATOR+"CodonTools.def"");
+
+	sSites  = 0;
+	nsSites = 0;
+
+	synM    = {nonStopCount,nonStopCount};
+	nonSynM = {nonStopCount,nonStopCount};
+
+	vertOnes = {nonStopCount,1};
+	horOnes  = {1,nonStopCount};
+
+	for (h1 = 0; h1<nonStopCount; h1=h1+1)
+	{
+		vertOnes [h1] = 1;
+		horOnes  [h1] = 1;
+	}
+
+	hShift = 0;
+	for (h1 = 0; h1 < 64; h1=h1+1)
+	{
+		gc1 = _Genetic_Code[h1];
+		if (gc1 == 10)
+		{
+			hShift = hShift+1;
+		}
+		else
+		{
+			sSites = sSites   + filteredData.sites * _S_NS_POSITIONS_[0][h1] * vectorOfFrequencies[h1-hShift];
+			nsSites = nsSites + filteredData.sites * _S_NS_POSITIONS_[1][h1] * vectorOfFrequencies[h1-hShift];
+			
+			vShift = hShift;
+			for (v1 = h1+1; v1 < 64; v1=v1+1)
+			{
+				gc2 = _Genetic_Code[v1];
+				if (gc2 == 10)
+				{
+					vShift = vShift + 1;
+				}
+				else
+				{
+					if (gc1 == gc2)
+					{
+						synM [h1-hShift][v1-vShift] = vectorOfFrequencies[h1-hShift];
+						synM [v1-vShift][h1-hShift] = vectorOfFrequencies[v1-vShift];
+					}
+					else
+					{
+						nonSynM [h1-hShift][v1-vShift] = vectorOfFrequencies[h1-hShift];
+						nonSynM [v1-vShift][h1-hShift] = vectorOfFrequencies[v1-vShift];
+					}
+				}
+			}
+		}
+	}
+
+
+	synSubsAVL = {};
+	dSAVL	   = {};
+	nsSubsAVL  = {};
+	dNAVL	   = {};
+
+	#include "TreeTools.ibf";
+
+	fprintf (stdout, "\nTotal nucleotide sites :", filteredData.sites*3,
+					 "\nSynonymous  sites      :", sSites, 
+					 "\nNonsynonymous  sites   :", nsSites, "\n");
+					 
+	sSites  = filteredData.sites/sSites;
+	nsSites = filteredData.sites/nsSites;
+
+	for (h1=0; h1 < T-1; h1=h1+1)
+	{
+		abn = branchNames[h1];
+		ExecuteCommands("GetInformation (aRateMx, givenTree."+abn+");");
+		synSubs  = (horOnes*(aRateMx$synM))*vertOnes;
+		nsynSubs = (horOnes*(aRateMx$nonSynM))*vertOnes;
+		synSubs = synSubs[0]/3;
+		nsynSubs = nsynSubs[0]/3;
+		
+		synSubsAVL[abn] = synSubs;
+		nsSubsAVL [abn] = nsynSubs;
+		dSAVL[abn]	    = synSubs *sSites;
+		dNAVL[abn]	    = nsynSubs*nsSites;
+	}
+
+	treeAVL = givenTree ^ 0;
+
+	synTreeString 		= PostOrderAVL2StringDistances (treeAVL, synSubsAVL); 
+	nonSynTreeString	= PostOrderAVL2StringDistances (treeAVL, nsSubsAVL);
+	dSTreeString 		= PostOrderAVL2StringDistances (treeAVL, dSAVL); 
+	dNTreeString	    = PostOrderAVL2StringDistances (treeAVL, dNAVL);
+
+
+	if (response == 0)
+	{
+		fprintf (stdout, "\nE[Syn subs/nucleotide site] tree: \n\t",     synTreeString, 	   "\n");
+		fprintf (stdout, "\nE[Non-syn subs/nucleotide site] tree: \n\t", nonSynTreeString, "\n");
+		fprintf (stdout, "\ndS tree: \n\t", dSTreeString, "\n");
+		fprintf (stdout, "\ndN tree: \n\t", dNTreeString, "\n");
+
+		UseModel (USE_NO_MODEL);
+
+		Tree 	synSubsTree 	= synTreeString;
+		Tree	nonsynSubsTree 	= nonSynTreeString;
+		Tree 	dSTree 	= dSTreeString;
+		Tree	dNTree 	= dNTreeString;
+
+		mxTreeSpec  = {5,1};
+
+		mxTreeSpec [0] = "nonsynSubsTree";
+		mxTreeSpec [3] = "";
+		mxTreeSpec [4] = "Inferred_Tree."+nodeName;
+		mxTreeSpec [1] = "8211";
+		mxTreeSpec [2] = "";
+
+
+		OpenWindow (TREEWINDOW, mxTreeSpec,"(SCREEN_WIDTH-50)/2;(SCREEN_HEIGHT-50)/2;10;40");
+
+		mxTreeSpec [0] = "synSubsTree";
+		OpenWindow (TREEWINDOW, mxTreeSpec,"(SCREEN_WIDTH-50)/2;(SCREEN_HEIGHT-50)/2;30+(SCREEN_WIDTH-30)/2;40");
+
+		mxTreeSpec [0] = "dSTree";
+		OpenWindow (TREEWINDOW, mxTreeSpec,"(SCREEN_WIDTH-50)/2;(SCREEN_HEIGHT-50)/2;10;45+(SCREEN_HEIGHT-50)/2");
+
+		mxTreeSpec [0] = "dNTree";
+		OpenWindow (TREEWINDOW, mxTreeSpec,"(SCREEN_WIDTH-50)/2;(SCREEN_HEIGHT-50)/2;30+(SCREEN_WIDTH-30)/2;45+(SCREEN_HEIGHT-50)/2");
+	}
+	else
+	{
+		SetDialogPrompt ("Save trees to file:");
+		fprintf (PROMPT_FOR_FILE, CLEAR_FILE, synTreeString, "\;\n", nonSynTreeString, "\;\n",dSTreeString, "\;\n", dNTreeString, "\;\n");
+	}
+}
diff --git a/res/UserAddins/OldAddins/dS and dN factors b/res/UserAddins/OldAddins/dS and dN factors
new file mode 100644
index 0000000..3e92098
--- /dev/null
+++ b/res/UserAddins/OldAddins/dS and dN factors	
@@ -0,0 +1,37 @@
+GetString(dsfName,DataSetFilter,0);
+GetString(dsName,DataSet,0);
+GetString(treeName,Tree,0);
+
+ModelMatrixDimension = 61;
+
+nonSynRate 		= 1;
+synRate		 	= 0;
+ExecuteCommands ("MGM = "+dsfName+"_MG94xREV_3x4;vectorOfFrequencies="+dsfName+"_Freqs;");
+
+factorNS = 0;
+
+for (h=0; h<ModelMatrixDimension; h=h+1)
+{
+	factorNS = factorNS - MGM[h][h]*vectorOfFrequencies[h];
+}
+
+nonSynRate 		= 0;
+synRate		 	= 1;
+ExecuteCommands ("MGM = "+dsfName+"_MG94xREV_3x4;vectorOfFrequencies="+dsfName+"_Freqs;");
+factorS = 0;
+
+for (h=0; h<ModelMatrixDimension; h=h+1)
+{
+	factorS = factorS - MGM[h][h]*vectorOfFrequencies[h];
+}
+
+ExecuteCommands("branchNames = BranchName 	("+treeName+",-1);");
+bCount 	    = Columns		(branchNames);
+
+for (bc = 0; bc < bCount; bc = bc + 1)
+{
+	ExecuteCommands (treeName+"."+branchNames[bc]+
+					 ".sSubs = factorS*"+treeName+"."+branchNames[bc]+".synRate/3");
+	ExecuteCommands (treeName+"."+branchNames[bc]+
+					 ".nSubs = factorNS*"+treeName+"."+branchNames[bc]+".nonSynRate/3");
+}
diff --git a/res/UserAddins/RecombinationProcessor.bf b/res/UserAddins/RecombinationProcessor.bf
new file mode 100644
index 0000000..cb9cb86
--- /dev/null
+++ b/res/UserAddins/RecombinationProcessor.bf
@@ -0,0 +1,728 @@
+VERBOSITY_LEVEL = -1;
+
+SetDialogPrompt ("Please load a nucleotide data file:");
+DataSet 	ds = ReadDataFile (PROMPT_FOR_FILE);
+
+SetDialogPrompt ("Please load a GA partition analysis result file:");
+fscanf  (PROMPT_FOR_FILE,"Lines",partLines);
+
+readPCount = Columns (partLines)/2-1;
+fprintf (stdout, "\nLoaded ", readPCount , " partitions\n");
+
+resp = 4;
+
+global betaP = 1;
+global betaQ = 1;
+betaP:>0.05;betaP:<85;
+betaQ:>0.05;betaQ:<85;
+
+category pc = (resp-1, EQUAL, MEAN, 
+				_x_^(betaP-1)*(1-_x_)^(betaQ-1)/Beta(betaP,betaQ), /* density */
+				IBeta(_x_,betaP,betaQ), /*CDF*/
+				0, 				   /*left bound*/
+				1, 			   /*right bound*/
+				IBeta(_x_,betaP+1,betaQ)*betaP/(betaP+betaQ)
+			   );
+
+
+global alpha = .5;
+alpha:>0.01;alpha:<100;
+category c = (resp, pc, MEAN, 
+				GammaDist(_x_,alpha,alpha), 
+				CGammaDist(_x_,alpha,alpha), 
+				0 , 
+		  	    1e25,
+		  	    CGammaDist(_x_,alpha+1,alpha)
+		  	 );
+
+global		 AC = 1;
+global		 AT = 1;
+global		 CG = 1;
+global		 CT = 1;
+global		 GT = 1;
+
+GTR_Matrix = {{*,AC*t*c,t*c,AT*t*c}
+			 {AC*t*c,*,CG*t*c,CT*t*c}
+			 {t*c,CG*t*c,*,GT*t*c}
+			 {AT*t*c,CT*t*c,GT*t*c,*}};
+
+/*AT:=AC;
+CG:=AC;
+CT:=1;
+GT:=AC;*/
+
+DataSetFilter	filteredData = CreateFilter (ds,1);
+
+bppMap = {};
+for (h=0; h<filteredData.sites; h=h+1)
+{
+	filterString = "" + h;
+	DataSetFilter siteFilter = CreateFilter (filteredData,1,filterString);
+
+	HarvestFrequencies (f1, siteFilter, 1, 1, 0);
+	m1 = 0;
+	for (mpiNode=0; (mpiNode < 4) && (m1<=1) ; mpiNode=mpiNode+1)
+	{
+		if (f1[mpiNode]>0)
+		{
+			m1=m1+1;
+		}
+	}	
+	if (m1>1)
+	{
+		bppMap[Abs(bppMap)] = h;
+	}
+}
+
+fprintf (stdout, "\nSequences :", filteredData.species,
+				 "\nSites     :", filteredData.sites,
+				 "\nVariable  :", Abs(bppMap), "\n"); 
+
+HarvestFrequencies (baseFreqs,ds,1,1,1);
+
+fprintf (stdout, "\n\nf(A) = ", baseFreqs[0],
+				 "\nf(C) = ", baseFreqs[1],
+				 "\nf(G) = ", baseFreqs[2],
+				 "\nf(T) = ", baseFreqs[3],"\n");
+				
+Model GTR_Model =  (GTR_Matrix, baseFreqs, 1);
+
+InferTreeTopology   (0);
+treeString 	= TreeMatrix2TreeString(0);
+Tree givenTree = treeString;
+
+LikelihoodFunction singlePart = (filteredData, givenTree);
+Optimize (res, singlePart);
+
+baseParams = res[1][2];
+
+if (baseParams>0)
+{
+
+	ConstraintString = "";
+	ConstraintString*256;
+	for (h=0; h<baseParams; h=h+1)
+	{
+		GetString (v,singlePart,h);
+		ConstraintString * (v+":="+v+"__;\n");
+	}
+	ConstraintString*0;
+	ExecuteCommands (ConstraintString);
+}
+
+nullCAIC = -2(res[1][0]-res[1][1]*filteredData.sites/(filteredData.sites-res[1][1]-1));
+
+fprintf  (stdout, "\n\nc-AIC = ", nullCAIC, "\n", singlePart);
+
+m1 = computeMeanDivergence ("givenTree");
+
+fprintf  (stdout, "\nMean divergence : ", m1*100, "%\n");
+
+fprintf  (stdout, "\n\nFitting a single-tree, multiple partition model\n");
+
+USE_DISTANCES = 0;
+
+lfDef = "";
+lfDef * 128;
+lfDef  * "LikelihoodFunction multiPart  = (";
+
+for (pccounter = 0; pccounter < readPCount; pccounter = pccounter + 1)
+{
+	ExecuteCommands ("DataSetFilter part_" + pccounter + " = CreateFilter (ds, 1, \"" + partLines[2+pccounter*2] + "\");");
+	ExecuteCommands ("Tree tree_" + pccounter + " = treeString;");
+	if (pccounter)
+	{
+		lfDef * ",";
+		ExecuteCommands ("global S_"+pccounter+"=1;\nReplicateConstraint (\"this1.?.?:=S_"+pccounter+"*this2.?.?\",tree_"+pccounter+",tree_0);");
+	}
+	lfDef  * ("part_"+pccounter+",tree_"+pccounter);
+}
+lfDef  * ");";
+lfDef  * 0;
+ExecuteCommands (lfDef);
+Optimize (res2, multiPart);
+myDF2 = baseParams + res2[1][1];
+intCAIC = -2(res2[1][0]-myDF2*filteredData.sites/(filteredData.sites-myDF2-1));
+fprintf (stdout, multiPart);
+
+USE_DISTANCES = 0;
+
+lfDef = "";
+lfDef * 128;
+lfDef  * "LikelihoodFunction multiPart  = (";
+
+fprintf  (stdout, "\n\nFitting a mutilple tree, multiple partition model\n");
+
+for (pccounter = 0; pccounter < readPCount; pccounter = pccounter + 1)
+{
+	ExecuteCommands ("DataSetFilter part_" + pccounter + " = CreateFilter (ds, 1, \"" + partLines[2+pccounter*2] + "\");");
+	ExecuteCommands ("Tree tree_" + pccounter + " = " + partLines[pccounter*2+3] + ";");
+	if (pccounter)
+	{
+		lfDef * ",";
+	}
+	lfDef  * ("part_"+pccounter+",tree_"+pccounter);
+}
+lfDef  * ");";
+lfDef  * 0;
+ExecuteCommands (lfDef);
+Optimize (res, multiPart);
+
+fprintf (stdout, multiPart);
+
+myDF = baseParams + res[1][1];
+
+fullCAIC = -2(res[1][0]-myDF*filteredData.sites/(filteredData.sites-myDF-1));
+
+fprintf  (stdout, "\n\nVersus the single partition model: c-AIC = ", fullCAIC, "\nDelta AIC = ", nullCAIC-fullCAIC,"\n\n");
+fprintf  (stdout, "\n\nVersus the single tree/multiple partition model: Delta AIC = ", intCAIC-fullCAIC,"\n\n");
+
+for (pccounter = 0; pccounter <  readPCount; pccounter = pccounter + 1)
+{
+	ExecuteCommands ("siteCount = part_" + pccounter + ".sites;");
+	fprintf (stdout, "Partition ", pccounter+1, " : ", siteCount, " sites\n");
+}
+
+pairWiseSplitMatch = {readPCount,readPCount};
+
+for (pccounter = 0; pccounter <  readPCount; pccounter = pccounter + 1)
+{
+	for (pc2 = pccounter+1; pc2 <  readPCount; pc2 = pc2 + 1)
+	{
+		ExecuteCommands ("siteCount = compareTreesForSplits(\"tree_" +pccounter + "\",\"tree_"+pc2+"\");");
+		pairWiseSplitMatch[pccounter][pc2] = siteCount[2]/Min(siteCount[0],siteCount[1]);
+	}
+}
+
+/* now do SH testing */
+
+conditionals 	 = {};
+likelihoodScores = {readPCount,readPCount};
+pairwiseP		 = {readPCount,readPCount};
+
+treeSplitMatches 	 = 0;
+khIterations		 = 10000;
+
+for (pccounter = 0; pccounter <  readPCount; pccounter = pccounter + 1)
+{
+	for (pc2 = 0; pc2 <  readPCount; pc2 = pc2 + 1)
+	{
+		if (Abs(pc2-pccounter) <= 1)
+		{
+			DataSetFilter 		aPart = CreateFilter (ds,1,partLines[pccounter*2+2]);
+			Tree		  		aTree = partLines[pc2*2+3];
+			LikelihoodFunction	aLF	= (aPart,aTree);
+			
+			fprintf 		(stdout, "\n\nFitting tree ", pc2+1, " to partition ", pccounter+1, "\n");
+			Optimize 		(aRes, aLF);	
+			fprintf			(stdout, aLF);
+			GetInformation  (cI,c);
+			cI 				= cI[1][-1];
+			ConstructCategoryMatrix (conds, aLF);
+			conds 			= Log(cI*conds);
+			conditionals [{{pccounter,pc2}}] = conds;
+			likelihoodScores[pccounter][pc2] = aRes[1][0];
+			treeSplitMatches = treeSplitMatches + pairWiseSplitMatch[pccounter][pc2];
+		}
+	}
+	
+	fprintf (stdout, "\nKH Testing partition ", pccounter+1, "\n");
+	partTreeConds = conditionals[{{pccounter,pccounter}}];
+	
+	for (pc2 = 0; pc2 <  readPCount; pc2 = pc2 + 1)
+	{
+		if (Abs(pc2-pccounter) == 1)
+		{
+			otherPartTree = conditionals [{{pccounter,pc2}}];
+			baseLRT = 2*(likelihoodScores[pccounter][pccounter]-likelihoodScores[pccounter][pc2]);
+			fprintf (stdout, "Tree ", pc2+1, " base LRT = ", baseLRT, ". p-value = ");
+			textMx = testLRT(partTreeConds,otherPartTree,khIterations) % 0;
+			for (kk=0; kk<khIterations; kk=kk+1)
+			{	
+				if (textMx[kk]>0)
+				{
+					break;
+				}
+			}
+			pval = Max(1,kk)/khIterations;
+			fprintf (stdout, pval , "\n");
+			pairwiseP[pccounter][pc2] = pval;
+		}
+	}
+}
+
+treeSplitMatches = treeSplitMatches*2/readPCount/(readPCount-1);
+totalComparisons = (readPCount-1)*2;
+threshP			 = 0.01/totalComparisons;
+
+significantCouplings = 0;
+
+for (pccounter = 1; pccounter <  readPCount; pccounter = pccounter + 1)
+{
+	if (pairwiseP[pccounter][pccounter-1] <= threshP && pairwiseP[pccounter-1][pccounter] <= threshP)
+	{
+		significantCouplings = significantCouplings + 1;
+	}
+}
+
+fprintf (stdout, "A total of ", significantCouplings, "/", readPCount-1, " significant couplings\n");
+fprintf (stdout, "Mean splits identify: ",treeSplitMatches, "\n" );
+
+
+
+
+
+
+
+/* AUX STUFF */
+
+/*lfDef = "";
+lfDef * 128;
+lfDef  * "LikelihoodFunction multiPart2  = (";
+
+for (pccounter = 0; pccounter < readPCount; pccounter = pccounter + 1)
+{
+	ExecuteCommands ("DataSetFilter part2_" + pccounter + " = CreateFilter (ds, 1, \"" + partLines[pccounter*2+2] + "\");");
+	ExecuteCommands ("Tree tree2_" + pccounter + " = " + treeString + ";");
+	if (pccounter)
+	{
+		lfDef * ",";
+	}
+	lfDef  * ("part2_"+pccounter+",tree2_"+pccounter);
+}
+
+lfDef  * ");";
+lfDef  * 0;
+ExecuteCommands (lfDef);
+Optimize (res, multiPart2);
+
+fprintf (stdout, multiPart2);
+
+full2CAIC = -2(res[1][0]-res[1][1]*filteredData.sites/(filteredData.sites-res[1][1]-1));
+fprintf  (stdout, "\n\nc-AIC = ", full2CAIC, "\nDelta Alt-AIC = ", full2CAIC-fullCAIC,"\n\n");*/
+
+
+/* ________________________________________________________________________________________________*/
+
+
+function InitializeDistances (dummy)
+{
+	HarvestFrequencies (_dNucFreq,filteredData,1,1,0);
+	_d_fR = _dNucFreq[0]+_dNucFreq[2];
+	_d_fY = _dNucFreq[1]+_dNucFreq[3];
+	
+	if (_dNucFreq[0] == 0 || _dNucFreq[1] == 0 || _dNucFreq[2] == 0 || _dNucFreq[3] == 0)
+	{
+		_useK2P = 1;
+	}
+	else
+	{
+		_d_TN_K1 = 2*_dNucFreq[0]*_dNucFreq[2]/_d_fR;
+		_d_TN_K2 = 2*_dNucFreq[1]*_dNucFreq[3]/_d_fY;
+		_d_TN_K3 = 2*(_d_fR*_d_fY-_dNucFreq[0]*_dNucFreq[2]*_d_fY/_d_fR-_dNucFreq[1]*_dNucFreq[3]*_d_fR/_d_fY);
+		_useK2P = 0;
+	}
+	
+	
+	summingVector = {{1}{1}{1}{1}};
+
+	return 0;
+}
+
+/* ________________________________________________________________________________________________*/
+
+function ComputeDistanceFormula (s1,s2)
+{
+	GetDataInfo (siteDifferenceCount, filteredData, s1, s2, DIST);
+	
+	totalSitesCompared = Transpose(summingVector)*(siteDifferenceCount*summingVector);
+	totalSitesCompared = totalSitesCompared[0];
+	
+	if (_useK2P)
+	{
+		_dTransitionCounts 	 =    siteDifferenceCount[0][2]+siteDifferenceCount[2][0]  /* A-G and G-A */
+								 +siteDifferenceCount[1][3]+siteDifferenceCount[3][1]; /* C-T and T-C */
+							
+		_dTransversionCounts = (siteDifferenceCount[0][0]+siteDifferenceCount[1][1]+siteDifferenceCount[2][2]+siteDifferenceCount[3][3])+_dTransitionCounts;
+		
+		_dTransitionCounts	 = _dTransitionCounts/totalSitesCompared;
+		_dTransversionCounts = 1-_dTransversionCounts/totalSitesCompared;
+		
+		_d1C = 1-2*_dTransitionCounts-_dTransversionCounts;
+		_d2C = 1-2*_dTransversionCounts;
+		
+		if (_d1C>0 && _d2C>0)
+		{
+			return -(0.5*Log(_d1C)+.25*Log(_d2C));	
+		}
+	}
+	else
+	{
+		_dAGCounts 	 =    siteDifferenceCount[0][2]+siteDifferenceCount[2][0]  /* A-G and G-A */;
+		_dCTCounts	 = 	  siteDifferenceCount[1][3]+siteDifferenceCount[3][1]; /* C-T and T-C */
+							
+		_dTransversionCounts = (siteDifferenceCount[0][0]+siteDifferenceCount[1][1]+siteDifferenceCount[2][2]+
+								siteDifferenceCount[3][3])+_dAGCounts+_dCTCounts;
+		
+		_dAGCounts	 = _dAGCounts/totalSitesCompared;
+		_dCTCounts	 = _dCTCounts/totalSitesCompared;
+		
+		_dTransversionCounts = 1-_dTransversionCounts/filteredData.sites;
+		
+		_d1C = 1-_dAGCounts/_d_TN_K1-0.5*_dTransversionCounts/_d_fR;
+		_d2C = 1-_dCTCounts/_d_TN_K2-0.5*_dTransversionCounts/_d_fY;
+		_d3C = 1-0.5*_dTransversionCounts/_d_fY/_d_fR;
+		
+		if ((_d1C>0)&&(_d2C>0)&&(_d3C>0))
+		{
+			return -_d_TN_K1*Log(_d1C)-_d_TN_K2*Log(_d2C)-_d_TN_K3*Log(_d3C);
+		}
+	}
+	
+	return 1000;
+}
+
+/* ________________________________________________________________________________________________*/
+
+function TreeMatrix2TreeString (doLengths)
+{
+	treeString = "";
+	p = 0;
+	k = 0;
+	m = treeNodes[0][1];
+	n = treeNodes[0][0];
+	d = treeString*(Rows(treeNodes)*25);
+
+	while (m)
+	{	
+		if (m>p)
+		{
+			if (p)
+			{
+				d = treeString*",";
+			}
+			for (j=p;j<m;j=j+1)
+			{
+				d = treeString*"(";
+			}
+		}
+		else
+		{
+			if (m<p)
+			{
+				for (j=m;j<p;j=j+1)
+				{
+					d = treeString*")";
+				}
+			}	
+			else
+			{
+				d = treeString*",";
+			}	
+		}
+		if (n<filteredData.species)
+		{
+			GetString (nodeName, filteredData, n);
+			d = treeString*nodeName;
+		}
+		if (doLengths>.5)
+		{
+			nodeName = ":"+treeNodes[k][2];
+			d = treeString*nodeName;
+		}
+		k=k+1;
+		p=m;
+		n=treeNodes[k][0];
+		m=treeNodes[k][1];
+	}
+
+	for (j=m;j<p;j=j+1)
+	{
+		d = treeString*")";
+	}
+	
+	d=treeString*0;
+	return treeString;
+}
+
+/* ________________________________________________________________________________________________*/
+
+function InferTreeTopology(verbFlag)
+{
+	distanceMatrix = {filteredData.species,filteredData.species};
+	dummy = InitializeDistances (0);
+		
+	for (i = 0; i<filteredData.species; i=i+1)
+	{
+		for (j = i+1; j<filteredData.species; j = j+1)
+		{
+			distanceMatrix[i][j] = ComputeDistanceFormula (i,j);
+		}
+	}
+
+	MESSAGE_LOGGING 		 	= 1;
+	cladesMade 					= 1;
+	
+
+	if (filteredData.species == 2)
+	{
+		d1 = distanceMatrix[0][1]/2;
+		treeNodes = {{0,1,d1__},
+					 {1,1,d1__},
+					 {2,0,0}};
+					 
+		cladesInfo = {{2,0}};
+	}
+	else
+	{
+		if (filteredData.species == 3)
+		{
+			d1 = (distanceMatrix[0][1]+distanceMatrix[0][2]-distanceMatrix[1][2])/2;
+			d2 = (distanceMatrix[0][1]-distanceMatrix[0][2]+distanceMatrix[1][2])/2;
+			d3 = (distanceMatrix[1][2]+distanceMatrix[0][2]-distanceMatrix[0][1])/2;
+			treeNodes = {{0,1,d1__},
+						 {1,1,d2__},
+						 {2,1,d3__}
+						 {3,0,0}};
+						 
+			cladesInfo = {{3,0}};		
+		}
+		else
+		{	
+			njm = (distanceMatrix > methodIndex)>=filteredData.species;
+				
+			treeNodes 		= {2*(filteredData.species+1),3};
+			cladesInfo	    = {filteredData.species-1,2};
+			
+			for (i=Rows(treeNodes)-1; i>=0; i=i-1)
+			{
+				treeNodes[i][0] = njm[i][0];
+				treeNodes[i][1] = njm[i][1];
+				treeNodes[i][2] = njm[i][2];
+			}
+
+			for (i=Rows(cladesInfo)-1; i>=0; i=i-1)
+			{
+				cladesInfo[i][0] = njm[i][3];
+				cladesInfo[i][1] = njm[i][4];
+			}
+			
+			njm = 0;
+		}
+	}
+	distanceMatrix = 0;
+	
+	return 1.0;
+}
+
+/* ________________________________________________________________________________________________*/
+
+function computeMeanDivergence (treeID)
+{
+	ExecuteCommands ("treeAVL2="+treeID+"^0;leafCount=TipCount("+treeID+")");
+	multFactors = {};
+	
+	for (k=1; k<Abs(treeAVL2); k=k+1)
+	{
+		aNode = treeAVL2[k];
+		aNodeName = aNode["Name"];
+		parentIndex = aNode["Parent"];
+		k2 = Abs(aNode["Children"]);
+		if (k2)
+		{
+			currentDepth = aNode["Below"];
+			multFactors[aNodeName] = currentDepth;		
+			if (parentIndex > 0)
+			{
+				pInfo = treeAVL2[parentIndex];
+				pInfo ["Below"] = pInfo ["Below"] + currentDepth;
+				treeAVL2[parentIndex] = pInfo;
+			}
+		}
+		else
+		{
+			multFactors[aNodeName] = 1;
+			pInfo = treeAVL2[parentIndex];
+			pInfo ["Below"] = pInfo ["Below"] + 1;
+			treeAVL2[parentIndex] = pInfo;
+		}
+	}
+
+	pKeys 			= Rows(multFactors);
+
+	for (k=0; k<Columns(pKeys); k=k+1)
+	{
+		aNodeName = pKeys[k];
+		multFactors[aNodeName] = multFactors[aNodeName] * (leafCount-multFactors[aNodeName]);
+	}
+	
+	ExecuteCommands ("bNames = BranchName   ("+treeID+",-1);");
+	ExecuteCommands ("bLen   = BranchLength ("+treeID+",-1);");
+	
+	sum = 0;
+	bc  = Columns(bNames)-1;
+	
+	for (k=0; k<bc; k=k+1)
+	{
+		aNodeName = bNames[k];
+		sum = sum + bLen[k]*multFactors[aNodeName];
+	}	
+	return sum/(leafCount*(leafCount-1)*0.5);
+}
+
+/* ________________________________________________________________________________________________*/
+
+function compareTreesForSplits (tName, tName2)
+{
+	/* obtain an AVL data structure of the tree, post-order layout */
+
+	ExecuteCommands   ("_astavl_="+tName+"^1;");
+	_tree_size_ = Abs (_astavl_);
+
+
+	nodeMapAVL = {};
+	
+	for (_a_node = 2; _a_node < _tree_size_; _a_node = _a_node + 1)
+	{
+		_node_info = _astavl_[_a_node];
+		myDegree = Abs(_node_info["Children"]);
+		
+		if (myDegree == 0)
+		{
+			nodeName = _node_info["Name"];
+			nodeMapAVL [nodeName] = Abs(nodeMapAVL)+1;
+		}
+	}
+	
+	split1 = getSplits(0);
+	ExecuteCommands   ("_astavl_="+tName2+"^1;");
+	_tree_size_ = Abs (_astavl_);
+	split2 = getSplits(0);
+	
+	s1c = Abs(split1);
+	s2c = Abs(split2);
+		
+	matches = {};
+	match1  = {};
+	match2  = {};
+	for (r1 = 0; r1 < s1c; r1 = r1 + 1)
+	{
+		if (match1[r1] == 0)
+		{
+			for (r2 = 0; r2 < s2c; r2 = r2 + 1)
+			{
+				if (match2[r2] == 0)
+				{
+					splitCheck = compareSplits (split1[r1],split2[r2]);
+					if (splitCheck)
+					{
+						mr = {{r1,r2}};
+						matches [Abs(matches)] = mr;
+						match1[r1] = 1;
+						match2[r2] = 1;
+					}
+				}
+			}
+		}
+	}
+	
+	
+	return {{s1c,s2c,Abs(matches)}};
+}
+
+/* ________________________________________________________________________________________________*/
+
+function getSplits (dummy)
+{
+	treeSplits = {};
+	for (_a_node = 2; _a_node < _tree_size_; _a_node = _a_node + 1)
+	{
+		_node_info = _astavl_[_a_node];
+		myDegree = Abs(_node_info["Children"]);
+		myDepth  = _node_info["Depth"];
+		
+			
+		if (myDegree && _node_info["Length"]>0)
+		{
+			nodeName = _node_info["Name"];
+			aSplit = {Abs(nodeMapAVL),1};
+			for (_b_node = _a_node + 1; _b_node < _tree_size_; _b_node = _b_node + 1)
+			{
+				_bnode_info = _astavl_[_b_node];
+					if (_bnode_info["Depth"] <= myDepth)
+				{
+					break;
+				}
+				if (Abs(_bnode_info["Children"])==0)
+				{
+					_bnode_info = _bnode_info["Name"];
+					_bnode_info = nodeMapAVL[_bnode_info];
+					if (_bnode_info == 0)
+					{
+						fprintf (stdout, "Error: extraneous node name\n");
+						return 0;
+					}
+					aSplit [_bnode_info-1] = 1;
+				}
+			}
+			treeSplits [Abs(treeSplits)] = aSplit;
+		}
+	}
+	return treeSplits;
+}
+
+/* ________________________________________________________________________________________________*/
+
+function compareSplits (s1, s2)
+{
+	sl            = Rows(s1);
+	positiveCheck = (s1[0] == s2[0]);
+	for (k=1; k<sl; k=k+1)
+	{
+		if (s1[k] != s2[k])
+		{
+			if (positiveCheck)
+			{
+				return 0;
+			}
+		}
+		else
+		{
+			if (!positiveCheck)
+			{
+				return 0;
+			}
+		}
+	}
+	return -1+2*positiveCheck;	
+}
+
+/*--------------------------------------------------------------------------------------*/
+
+function testLRT (vec1, vec2, itCount)
+{
+	size1 = Columns(vec1);
+	
+	sumVec1 = {size1,1};
+	jvec	= {2,size1};
+	resMx1	= {itCount,1};
+	resMx2	= {itCount,1};
+	
+	for (k=0; k<size1; k=k+1)
+	{
+		sumVec1 [k]	   = 1;
+		jvec	[0][k] = vec1[k];
+		jvec	[1][k] = vec2[k];
+	}
+	
+	
+	for (k=0; k<itCount; k=k+1)
+	{
+		resampled = Random(jvec,1);
+		resampled = resampled*sumVec1;
+		resMx1[k] = resampled[0];
+		resMx2[k] = resampled[1];
+	}
+	
+	return (resMx1-resMx2)*2;
+}
diff --git a/res/UserAddins/SimulateFromLF b/res/UserAddins/SimulateFromLF
new file mode 100644
index 0000000..563d376
--- /dev/null
+++ b/res/UserAddins/SimulateFromLF
@@ -0,0 +1,27 @@
+_ChooseCaption = "Simulate from this likelihood function:";
+
+#include "Includes/ChooseALF.ibf";
+
+if (tIndex>=0)
+{
+	simCounter = 0;
+	while (simCounter<1)
+	{
+		fprintf (stdout,"\nHow many simulants should be generated (>=1)?");
+		fscanf  (stdin,"Number", simCounter);
+	}	
+
+	GetString (tName, LikelihoodFunction, tIndex);
+	
+	SetDialogPrompt ("Save files to:");
+	fprintf (PROMPT_FOR_FILE,CLEAR_FILE);
+	pathPrefix = LAST_FILE_PATH;
+	
+	for (k=0; k<simCounter; k=k+1)
+	{
+		ExecuteCommands ("DataSet _sData = SimulateDataSet("+tName+");");
+		DataSetFilter _sFilter = CreateFilter (_sData,1);
+		outFile = pathPrefix + "." + k;
+		fprintf (outFile,CLEAR_FILE,_sFilter);
+	}
+}
diff --git a/res/UserAddins/Tidbits b/res/UserAddins/Tidbits
new file mode 100644
index 0000000..f9673bc
--- /dev/null
+++ b/res/UserAddins/Tidbits
@@ -0,0 +1,18 @@
+fprintf (stdout, "\n\nThis is an example of a utility script that the user can place in 'UserAddins' and access via a simple button click.\n");
+
+GetString (versionString, HYPHY_VERSION, 1);
+GetString (dateString, TIME_STAMP, 1);
+GetString (gmtString,  TIME_STAMP, 0);
+fprintf (stdout, "HyPhy version:", versionString, "\n", 
+				 "Current time:", dateString, "\n",
+				 "GMT     time:", gmtString, "\n",
+				 "Base Directory:", HYPHY_LIB_DIRECTORY, "\n");
+
+fprintf (stdout, "\nObject counts:\n",
+				  "\tVariables              : ",Rows("Variable"),
+				  "\n\tData Sets              : ",Rows("DataSet"),
+				  "\n\tData Filters           : ",Rows("DataSetFilter"),
+				  "\n\tTrees                  : ",Rows("Tree"),
+				  "\n\tLikelihood Functions   : ",Rows("LikelihoodFunction"),
+				  "\n\tUser Defined Functions : ",Rows("UserFunction"), "\n");
+					  
diff --git a/res/data/brown.nuc b/res/data/brown.nuc
new file mode 100644
index 0000000..6a9b4a3
--- /dev/null
+++ b/res/data/brown.nuc
@@ -0,0 +1,83 @@
+  
+#Human
+AAGCTTCACCGGCGCAGTCATTCTCATAATCGCCCACGGACTTACATCCTCATTACTATT
+CTGCCTAGCAAACTCAAACTACGAACGCACTCACAGTCGCATCATAATCCTCTCTCAAGG
+ACTTCAAACTCTACTCCCACTAATAGCTTTTTGATGACTTCTAGCAAGCCTCGCTAACCT
+CGCCTTACCCCCCACTATTAACCTACTGGGAGAACTCTCTGTGCTAGTAACCACGTTCTC
+CTGATCAAATATCACTCTCCTACTTACAGGACTCAACATACTAGTCACAGCCCTATACTC
+CCTCTACATATTTACCACAACACAATGGGGCTCACTCACCCACCACATTAACAACATAAA
+ACCCTCATTCACACGAGAAAACACCCTCATGTTCATACACCTATCCCCCATTCTCCTCCT
+ATCCCTCAACCCCGACATCATTACCGGGTTTTCCTCTTGTAAATATAGTTTAACCAAAAC
+ATCAGATTGTGAATCTGACAACAGAGGCTTACGACCCCTTATTTACCGAGAAAGCTCACA
+AGAACTGCTAACTCATGCCCCATGTCTGACAACATGGCTTTCTCAACTTTTAAAGGATA
+ACAGCTATCCATTGGTCTTAGGCCCCAAAAATTTTGGTGCAACTCCAAATAAAAGTAATA
+ACCATGCACACTACTATAACCACCCTAACCCTGACTTCCCTAATTCCCCCCATCCTTACC
+ACCCTCGTTAACCCTAACAAAAAAAACTCATACCCCCATTATGTAAAATCCATTGTCGCA
+TCCACCTTTATTATCAGTCTCTTCCCCACAACAATATTCATGTGCCTAGACCAAGAAGTT
+ATTATCTCGAACTGACACTGAGCCACAACCCAAACAACCCAGCTCTCCCTAAGCTT    
+#Chimpanzee
+AAGCTTCACCGGCGCAATTATCCTCATAATCGCCCACGGACTTACATCCTCATTATTATT
+CTGCCTAGCAAACTCAAATTATGAACGCACCCACAGTCGCATCATAATTCTCTCCCAAGG
+ACTTCAAACTCTACTCCCACTAATAGCCTTTTGATGACTCCTAGCAAGCCTCGCTAACCT
+CGCCCTACCCCCTACCATTAATCTCCTAGGGGAACTCTCCGTGCTAGTAACCTCATTCTC
+CTGATCAAATACCACTCTCCTACTCACAGGATTCAACATACTAATCACAGCCCTGTACTC
+CCTCTACATGTTTACCACAACACAATGAGGCTCACTCACCCACCACATTAATAACATAAA
+GCCCTCATTCACACGAGAAAATACTCTCATATTTTTACACCTATCCCCCATCCTCCTTCT
+ATCCCTCAATCCTGATATCATCACTGGATTCACCTCCTGTAAATATAGTTTAACCAAAAC
+ATCAGATTGTGAATCTGACAACAGAGGCTCACGACCCCTTATTTACCGAGAAAGCTTATA
+AGAACTGCTAATTCATATCCCATGCCTAACAACATGGCTTTCTCAACTTTTAAAGGATA
+ACAGCCATCCGTTGGTCTTAGGCCCCAAAAATTTTGGTGCAACTCCAAATAAAAGTAATA
+ACCATGTATACTACCATAACCACCTTAACCCTAACTCCCTTAATTCTCCCCATCCTCACC
+ACCCTCATTAACCCTAACAAAAAAAACTCATATCCCCATTATGTGAAATCCATTATCGCG
+TCCACCTTTATCATTAGCCTTTTCCCCACAACAATATTCATATGCCTAGACCAAGAAGCT
+ATTATCTCAAACTGGCACTGAGCAACAACCCAAACAACCCAGCTCTCCCTAAGCTT    
+#Gorilla   
+AAGCTTCACCGGCGCAGTTGTTCTTATAATTGCCCACGGACTTACATCATCATTATTATT
+CTGCCTAGCAAACTCAAACTACGAACGAACCCACAGCCGCATCATAATTCTCTCTCAAGG
+ACTCCAAACCCTACTCCCACTAATAGCCCTTTGATGACTTCTGGCAAGCCTCGCCAACCT
+CGCCTTACCCCCCACCATTAACCTACTAGGAGAGCTCTCCGTACTAGTAACCACATTCTC
+CTGATCAAACACCACCCTTTTACTTACAGGATCTAACATACTAATTACAGCCCTGTACTC
+CCTTTATATATTTACCACAACACAATGAGGCCCACTCACACACCACATCACCAACATAAA
+ACCCTCATTTACACGAGAAAACATCCTCATATTCATGCACCTATCCCCCATCCTCCTCCT
+ATCCCTCAACCCCGATATTATCACCGGGTTCACCTCCTGTAAATATAGTTTAACCAAAAC
+ATCAGATTGTGAATCTGATAACAGAGGCTCACAACCCCTTATTTACCGAGAAAGCTCGTA
+AGAGCTGCTAACTCATACCCCGTGCTTAACAACATGGCTTTCTCAACTTTTAAAGGATA
+ACAGCTATCCATTGGTCTTAGGACCCAAAAATTTTGGTGCAACTCCAAATAAAAGTAATA
+ACTATGTACGCTACCATAACCACCTTAGCCCTAACTTCCTTAATTCCCCCTATCCTTACC
+ACCTTCATCAATCCTAACAAAAAAAGCTCATACCCCCATTACGTAAAATCTATCGTCGCA
+TCCACCTTTATCATCAGCCTCTTCCCCACAACAATATTTCTATGCCTAGACCAAGAAGCT
+ATTATCTCAAGCTGACACTGAGCAACAACCCAAACAATTCAACTCTCCCTAAGCTT    
+#Orangutan 
+AAGCTTCACCGGCGCAACCACCCTCATGATTGCCCATGGACTCACATCCTCCCTACTGTT
+CTGCCTAGCAAACTCAAACTACGAACGAACCCACAGCCGCATCATAATCCTCTCTCAAGG
+CCTTCAAACTCTACTCCCCCTAATAGCCCTCTGATGACTTCTAGCAAGCCTCACTAACCT
+TGCCCTACCACCCACCATCAACCTTCTAGGAGAACTCTCCGTACTAATAGCCATATTCTC
+TTGATCTAACATCACCATCCTACTAACAGGACTCAACATACTAATCACAACCCTATACTC
+TCTCTATATATTCACCACAACACAACGAGGTACACCCACACACCACATCAACAACATAAA
+ACCTTCTTTCACACGCGAAAATACCCTCATGCTCATACACCTATCCCCCATCCTCCTCTT
+ATCCCTCAACCCCAGCATCATCGCTGGGTTCGCCTACTGTAAATATAGTTTAACCAAAAC
+ATTAGATTGTGAATCTAATAATAGGGCCCCACAACCCCTTATTTACCGAGAAAGCTCACA
+AGAACTGCTAACTCTCACTCCATGTGTAACAACATGGCTTTCTCAGCTTTTAAAGGATA
+ACAGCTATCCCTTGGTCTTAGGATCCAAAAATTTTGGTGCAACTCCAAATAAAAGTAACA
+GCCATGTTTACCACCATAACTGCCCTCACCTTAACTTCCCTAATCCCCCCCATTACCGCT
+ACCCTCATTAACCCCAACAAAAAAAACCCATACCCCCACTATGTAAAAACGGCCATCGCA
+TCCGCCTTTACTATCAGCCTTATCCCAACAACAATATTTATCTGCCTAGGACAAGAAACC
+ATCGTCACAAACTGATGCTGAACAACCACCCAGACACTACAACTCTCACTAAGCTT    
+#Gibbon    
+AAGCTTTACAGGTGCAACCGTCCTCATAATCGCCCACGGACTAACCTCTTCCCTGCTATT
+CTGCCTTGCAAACTCAAACTACGAACGAACTCACAGCCGCATCATAATCCTATCTCGAGG
+GCTCCAAGCCTTACTCCCACTGATAGCCTTCTGATGACTCGCAGCAAGCCTCGCTAACCT
+CGCCCTACCCCCCACTATTAACCTCCTAGGTGAACTCTTCGTACTAATGGCCTCCTTCTC
+CTGGGCAAACACTACTATTACACTCACCGGGCTCAACGTACTAATCACGGCCCTATACTC
+CCTTTACATATTTATCATAACACAACGAGGCACACTTACACACCACATTAAAAACATAAA
+ACCCTCACTCACACGAGAAAACATATTAATACTTATGCACCTCTTCCCCCTCCTCCTCCT
+AACCCTCAACCCTAACATCATTACTGGCTTTACTCCCTGTAAACATAGTTTAATCAAAAC
+ATTAGATTGTGAATCTAACAATAGAGGCTCGAAACCTCTTGCTTACCGAGAAAGCCCACA
+AGAACTGCTAACTCACTACCCATGTATAACAACATGGCTTTCTCAACTTTTAAAGGATA
+ACAGCTATCCATTGGTCTTAGGACCCAAAAATTTTGGTGCAACTCCAAATAAAAGTAATA
+GCAATGTACACCACCATAGCCATTCTAACGCTAACCTCCCTAATTCCCCCCATTACAGCC
+ACCCTTATTAACCCCAATAAAAAGAACTTATACCCGCACTACGTAAAAATGACCATTGCC
+TCTACCTTTATAATCAGCCTATTTCCCACAATAATATTCATGTGCACAGACCAAGAAACC
+ATTATTTCAAACTGACACTGAACTGCAACCCAAACGCTAGAACTCTCCCTAAGCTT    
+
+(((Human,Chimpanzee),Gorilla),(Orangutan,Gibbon));
diff --git a/res/data/integrase_BDA.nex b/res/data/integrase_BDA.nex
new file mode 100644
index 0000000..fc558f2
--- /dev/null
+++ b/res/data/integrase_BDA.nex
@@ -0,0 +1,33 @@
+#NEXUS
+
+BEGIN TAXA;
+	DIMENSIONS NTAX = 11;
+	TAXLABELS
+		'D_UG_99_99UGB25647' 'D_UG_99_99UGB21875' 'D_UG_99_99UGA07412' 'B_AR_99_ARMA132' 'A1_KE_99_KSM4021' 'B_BO_99_BOL0122' 'A1_KE_99_KNH1135' 'A1_KE_99_KNH1088' 'D_UG_99_99UGD26830' 'D_UG_99_99UGD23550' 'D_UG_99_99UGB32394' ;
+END;
+
+BEGIN CHARACTERS;
+	DIMENSIONS NCHAR = 864;
+	FORMAT
+		DATATYPE = DNA
+		GAP=-
+		MISSING=?
+	;
+
+MATRIX
+	'D_UG_99_99UGB25647'  TTCTTGGATGGAATAGATAAGGCTCAAGAAGAACATGAGAAATACCACAGCAATTGGAGAGCAATGGCTAGTGATTTTAACCTGCCACCTGTGGTAGCAAAAGAAATAGTAGCTAGCTGTGATAAATGTCAGCTAAAAGGAGAAGCCTTGCATGGACAAGTAGACTGCAGTCCAGGAATATGGCAATTAGATTGTACACATTTAGAAGGAAAAGTTATCCTGGTCGCAGTCCATGTAGCCAGTGGCTATATAGAAGCAGAAGTTATTCCAGCAGAAACAGGGCAGGAAACAGCCTACTTTCTCTTGAAATTAGCAGGAAGATGGCCAGTAAAAGCAGTACATACAGACAATGGCAGCAATTTCACTAGCGCTGCAGTTAAGGCCGCCTGTTGGTGGGCAGGCATCAAGCAGGAATTTGGAATTCCCTACAATCCCCAAAGTCAAGGAGTAGTAGAATCTATGAATAAAG [...]
+	'D_UG_99_99UGB21875'  TTCTTGGATGGAATAGATAAGGCTCAAGAAGAACATGAGAAATACCACAACAATTGGAGAGCAATGGCTAGTGATTTTAACCTGCCACCTGTGGTGGCAAAAGAAATAGTAGCTAGCTGTGATAAATGTCAGCTAAAAGGAGAAGCCTTGCATGGACAAGTAGACTGTAGTCCAGGAATATGGCAATTAGATTGTACACATTTAGAAGGAAAAGTTATCCTGGTAGCAGTCCATGTAGCCAGTGGCTATATAGAAGCAGAAGTTATCCCAGCAGAAACAGGGCAGGAAACAGCCTACTTTCTCTTGAAATTGGCAGGAAGATGGCCAGTAAAAACAGTACATACAGACAATGGCAGCAATTTCACCAGCGCTGCGGTTAAGGCCGCCTGTTGGTGGGCAGGCATCAAACAGGAATTTGGAATTCCCTACAATCCCCAAAGTCAAGGAGTAGTAGAATCTATGAATAAAG [...]
+	'D_UG_99_99UGA07412'  TTCTTGGATGGAATAGATAAGGCTCAAGAGGAACATGAAAAATACCACAACAATTGGAGAGCAATGGCTAGTGATTTTAACCTGCCACCGGTGGTAGCAAAAGAAATAGTAGCTAGCTGTGATAAATGCCAGCTAAAAGGAGAAGCCTTGCATGGACAAGTAGACTGTAGTCCAGGGATATGGCAATTAGATTGTACACATTTAGAAGGAAAAGTTATCCTGGTAGCAGTCCATGTAGCCAGTGGCTATATAGAAGCAGAGGTTATTCCAGCAGAAACAGGACAKGAAACAGCCTACTTTCTCTTGAAACTAGCAGGAAGGTGGCCGGTAAAAGTAGTACATACCGACAATGGCAGCAACTTCACCAGCGCTGCAGTTAAGGCCGCCTGCTGGTGGGCAGACATCAAGCAGGAATTTGGAATTCCCTACAATCCCCAAAGTCAAGGAGTAGTAGAATCTATGAATAAAG [...]
+	'B_AR_99_ARMA132'     TTTTTAGATGGAATAGATAAGGCCCAAGAAGACCATGAGAAATATCACAGTAATTGGAGAGCAATGGCTGATGATTTTAACCTGCCACCTATAGTAGCAAAAGAGATAATAGCCTGCTGTGATAAATGTCAGCTAAAAGGAGAAGCCATACATGGGCAAGTAGACTGTAGTCCAGGAATATGGCAGCTAGATTGTACACACTTAGAAGGAAAAGTTATCCTGGTAGCAGTCCATGTAGCCAGTGGATATTTAGAAGCAGAAGTTATTCCAGCAGAAACAGGGCAAGAAACAGCATACTTTCTCTTAAAATTAGCAGGAAGATGGCCAGTAAAAACAATACATACAGACAATGGCCCCAATTTCGTCAGTACTGCGGTTAAAGCCGCCTGTTGGTGGGCGGGGATCAAGCAGGAATTTGGCATTCCCTACAATCCCCAAAGTCAAGGAGTAGTAGAATCTATGAATAAAG [...]
+	'A1_KE_99_KSM4021'    TTTTTAGATGGGATAGATAAAGCTCAAGAAGAACATGAAAGATATCACAGCAATTGGAAAGCAATGGCTAGTGATTTTAACCTGCCACCTGTAGTAGCAAAGGAAATAGTAGCCAGCTGTGATAAATGTCAACTAAAAGGGGAAGCCATACATGGACAAGTAGACTGCAGTCCAGGGATATGGCAATTAGATTGCACACATCTAGAAGGAAAAGTAATTCTGGTAGCAGTTCATGTAGCCAGTGGTTATATAGAAGCAGAAGTTATCCCAGCAGAAACAGGACAGGAGACAGCATACTTTCTACTAAAATTAGCAGGAAGATGGCCAGTAAAAGTAGTACACACAGACAATGGCAGCAATTTCACCAGTGCTGCAGTTAAAGCAGCCTGTTGGTGGGCAGGTATCCAACAAGAATTTGGGATTCCCTACAATCCCCAAAGTCAAGGAGTAGTGGAATCTATGAATAAGG [...]
+	'B_BO_99_BOL0122'     TTTCTGGATGGAATAGATAAGGCCCAAGATGAGCATGAGAAATATCACAGTAATTGGAGAGCAATTGCTAGTGATTTTAACCTGCCACCTGTAGTAGCAAAACAAATAGTAGCTAACTGTGATAAATGTCAGGTAAAGGGAGAAGCCATGCATGGACAAGTAGACTGTAGTCCAGGAATATGGCAACTAGATTGTACACATTTAGAAGGAAAAATTATCCTGGTAGCAGTTCATGTAGCCAGTGGATATATAGAAGCAGAAGTTATCCCAGCAGAAACAGGGCAGGAAACAGCATACTTTATCTTAAAATTAGCAGGAAGGTGGCCAGTAAAAACAATACATACAGACAATGGCAGCAATTTCACCAGTAATGCGGTCAAGGCCGCCTGCTGGTGGGCAGGGGTCAAGCAGGAATTTGGCATTCCCTACAATCCCCAAAGTCAAGGAGTAGTAGAATCTATGAATAATG [...]
+	'A1_KE_99_KNH1135'    TTTTTAGATGGGATAGATAAAGCTCAAGAAGAACATGAAAGATATCACAGCAATTGGAGAACAATGGCTAGTGACTTTAATCTGCCACCTATAGTAGCAAAGGAAATAGTTGCCAGCTGTGATAAATGTCAACTAAAAGGGGAAGCCATGCATGGACAAGTAGACTGTAGTCCAGGGATATGGCAGTTAGATTGCACACATCTGGAAGGAAAAGTAATTCTGGTAGCAGTCCATGTAGCCAGTGGCTACATAGAAGCAGAAGTTATCCCAGCAGAGACAGGACAGGAGACAGCATACTTTCTGCTAAAATTAGCAGGAAGGTGGCCAGTAAAAGTGGTACACACAGACAATGGCAGCAATTTCACCAGCGCTGCAGTTAAAGCAGCCTGTTGGTGGGCAGGTATCCAACAGGAATTTGGAATTCCCTACAATCCCCAGAGTCAAGGAGTAGTAGAATCTATGAATAAGG [...]
+	'A1_KE_99_KNH1088'    TTCTTAGATGGGATAGATAAAGCTCAAGAAGAACATGAAAGATATCACAGCAATTGGAAAGCAATGGCTAGTGATTTTAATTTGCCACCTATAGTAGCAAAGGAAATAGTAGCCAGCTGTGATAAATGCCAGCTAAAAGGGGAAGCCATACATGGACAGGTAGACTGCAGCCCAGGGATGTGGCAATTAGATTGCACACATCTAGAAGGAAAAGTAATTCTGGTAGCAGTCCATGTAGCCAGTGGCTATATAGAAGCAGAAGTTATCCCAGCAGAAACAGGACAGGAGACAGCATATTTTCTACTAAAATTAGCAGGAAGATGGCCAGTAAAAGTAGTACACACAGACAATGGCAGCAATTTCACCAGCACTGCATTTAAGGCAGCCTGTTGGTGGGCAGGTGTCCAACAGGAATTTGGGATCCCCTACAATCCCCAAAGTCAAGGAGTAGTGGAATCTATGAATAAAG [...]
+	'D_UG_99_99UGD26830'  TTTTTGGATGGAATAGATAAGGCGCAAGAAGAACATGAGAAATACCACAACAATTGGAGAGCAATGGCTAGTGATTTTAACCTACCACCTGTGGTAGCAAAAGAGATAGTAGCTAGCTGTGATAAATGTCAGCTAAAAGGAGAAGCCTTGCATGGACAAGTAGACTGTAGTCCAGGAATATGGCAGTTAGATTGTACACATTTAGAAGGAAAAGTTATCTTGGTAGCAGTCCATGTAGCCAGTGGCTATATAGAAGCAGAAGTTATTCCAGCAGAAACAGGGCAGGAAACAGCCTACTTTCTCTTAAAATTAGCAGGAAGATGGCCAGTAAAAGTAGTACATACAGACAATGGCAGCAATTTCACCAGCGCTGTAGTTAAGGCCGCCTGTTGGTGGGCAGGCATCAAACAGGAATTTGGAATTCCCTACAATCCCCAAAGTCAAGGAGTAGTAGAATCAATGAATAAAG [...]
+	'D_UG_99_99UGD23550'  TTTCTGGATGGAATAGATAAGGCTCAAGAAAAACATGAGAAATACCACAGCAACTGGAGAGCAATGGCTAGTGATTTCAACCTACCACCTGTGGTAGCAAAAGAAATAATAGCTAGCTGTGATAAATGTCAGCTAAAAGGAGAAGCCTTGCATGGACAAGTAGATTGTAGTCCAGGAATATGGCAATTAGACTGTACCCATTTAGAAGGAAAAGTTATCCTAGTAGCAGTCCATGTAGCCAGTGGCTACATAGAAGCAGAAGTTATTCCAGCAGAAACAGGGCAGGAAACAGCCTACTTCCTCTTAAAATTAGCAGGAAGATGGCCAGTAAAAGTAGTACATACAGACAATGGCAGCAACTTCACCAGCGCTGCAGTTAAGGCCGCCTGTTGGTGGGCAGGCATCAAGCAGGAATTTGGAATTCCCTATAATCCCCAAAGTCAAGGAGTAGTAGAATCTATGAATAAAG [...]
+	'D_UG_99_99UGB32394'  TTCCTGGATGGAATAGATAAGGCTCAAGAAGAACATGAGAAATACCACAACAATTGGAGAGCAATGGCTAGTGATTTTAACCTGCCACCTGTGGTAGCAAAAGAAATAGTAGCTAGCTGTGATAAATGTCAGCTAAAAGGGGAAGCCTTGCATGGACAAGTAGACTGTAGTCCAGGAATATGGCAATTAGATTGTACACATTTAGAAGGAAAAGTTATCCTGGTAGCAGTCCATGTCGCCAGTGGCTACATAGAAGCAGAAGTTATTCCAGCGGAAACAGGACAGGAAACAGCCTACTTTCTTTTGAAACTGGCAGGAAGATGGCCAGTAAAAGTAGTACATACAGACAATGGCAGCAATTTCACTAGCGCTGCAGTTAAGGCTGCCTGTTGGTGGGCAGGCATCAAGCAGGAATTTGGAATTCCCTACAATCCCCAAAGTCAAGGAGTAGTAGAATCTATGAATAAAG [...]
+END;
+
+BEGIN TREES;
+	Tree Integrase_Tree = (((A1_KE_99_KNH1088:0.0248996,A1_KE_99_KSM4021:0.0205024):0.00322046,A1_KE_99_KNH1135:0.0236991):0.057531,(B_BO_99_BOL0122:0.039459,B_AR_99_ARMA132:0.0389111):0.0227006,((((D_UG_99_99UGD26830:0.0198025,(D_UG_99_99UGB21875:0.0100619,D_UG_99_99UGB32394:0.024448):0.00164981):0.00300225,D_UG_99_99UGA07412:0.024512):0.00150403,D_UG_99_99UGB25647:0.0113034):0.00145467,D_UG_99_99UGD23550:0.0247076):0.0111343);
+END;
diff --git a/res/data/p51.aa b/res/data/p51.aa
new file mode 100644
index 0000000..8c7b308
--- /dev/null
+++ b/res/data/p51.aa
@@ -0,0 +1,35 @@
+#NEXUS
+
+[
+Generated by HYPHY .99beta(MP) for MacOS(Carbon) on Tue Jan 13 15:45:26 2004
+
+]
+
+BEGIN TAXA;
+	DIMENSIONS NTAX = 8;
+	TAXLABELS
+		'B_FR_83_HXB2' 'B_US_83_RF' 'B_US_86_JRFL' 'B_US_90_WEAU160' 'D_CD_83_ELI' 'D_CD_83_NDK' 'D_CD_84_84ZR085' 'D_UG_94_94UG114' ;
+END;
+
+BEGIN CHARACTERS;
+	DIMENSIONS NCHAR = 440;
+	FORMAT
+		DATATYPE = PROTEIN
+		GAP=-
+		MISSING=?
+	;
+
+MATRIX
+	'B_FR_83_HXB2'     PISPIETVPVKLKPGMDGPKVKQWPLTEEKIKALVEICTEMEKEGKISKIGPENPYNTPVFAIKKKDSTKWRKLVDFRELNKRTQDFWEVQLGIPHPAGLKKKKSVTVLDVGDAYFSVPLDEDFRKYTAFTIPSINNETPGIRYQYNVLPQGWKGSPAIFQSSMTKILEPFRKQNPDIVIYQYMDDLYVGSDLEIGQHRTKIEELRQHLLRWGLTTPDKKHQKEPPFLWMGYELHPDKWTVQPIVLPEKDSWTVNDIQKLVGKLNWASQIYPGIKVRQLCKLLRGTKALTEVIPLTEEAELELAENREILKEPVHGVYYDPSKDLIAEIQKQGQGQWTYQIYQEPFKNLKTGKYARMRGAHTNDVKQLTEAVQKITTESIVIWGKTPKFKLPIQKETWETWWTEYWQATWIPEWEFVNTPPLVKLWYQLEKEPIVGAETF
+	'B_US_83_RF'       PISPIETVPVKLKPGMDGPKVKQWPLTEEKIKALVEICTEMEKEGKISKIGPENPYNTPVFAIKKKDSTKWRKLVDFRELNKRTQDFWEVQLGIPHPAGLKKKKSVTVLDVGDAYFSVPLDKEFRKYTAFTIPSINNETPRIRYQYNVLPQGWKGSPAIFQSSMTKILEPFKKQNPEIVIYQYMDDLYVGSDLEIGQHRIKIEELREHLLKWGFTTPDKKHQKEPPFLWMGYELHPDKWTVQPIVLPEKDSWTVNDIQKLVGKLNWASQIYAGIKVKQLCKLLRGTKALTEVVQLTKEAELELAENREILKEPVHGVYYDPSKDLIAEIQKQGQGQWTYQIYQEPFKNLKTGKYARMRGAHTNDVKQLTEAVQKVATESIVIWGKTPKFKLPIQKETWEAWWTEYWQATWIPEWEFVNTPPLVKLWYQLEKEPIIGAETF
+	'B_US_86_JRFL'     PISPIETVPVKLKPGMDGPKVKQWPLTEEKIKALVEICTEMEKEGKISKIGPENPYNTPVFAIKKKDSTKWRKLVDFRELNKKTQDFWEVQLGIPHPAGLKKRKSVTVLDVGDAYFSVPLDKDFRKYTAFTIPSINNETPGIRYQYNVLPQGWKGSPAIFQSSMTKILEPFRKQNPDIIIYQYMDDLYVGSDLEIGQHRAKIEELRQHLLRWGFTTPDKKHQKEPPFLWMGYELHPDKWTVQPIVLPEKDSWTVNDIQKLVGKLNWASQIYAGIKVKQLCKLLRGTKALTEVIPLTEEAELELAENREILKEPVHGVYYDPSKDLIAELQKQGQGQWTYQIYQEPFKILKTGKYARTRGAHTNDVKQLTEAVQKIANESIVIWGKIPKFKLPIQKETWETWWTEYWQATWIPEWEFVNTPPLVKLWYQLEKEPIVGAETF
+	'B_US_90_WEAU160'  PISPIETVPVKLKPGMDGPKVKQWPLTEEKIKALVEICTEMEKEGKISKIGPENPYNTPVFAIKKKDSTKWRKLVDFRELNKRTQDFWEVQLGIPHPSGLKKKKSVTVLDVGDAYFSVPLDEDFRKYTAFTIPSINNETPGIRYQYNVLPQGWKGSPAIFQSSMTKILEPFRKQNPDIVIYQYMDDLYVGSDLEIGQHRTKIEELRQHLLRWGFTTPDKKHQKDPPFLWMGYELHPDKWTVQPIKLPEKESWTVNDIQKLVGKLNWASQIYAGIKVKQLCKLLRGTKALTEIIPITEEAELELAENREILKEPVHGVYYDPSKDLIAELQKQGQGQWTYQIYQEPFKNLKTGKYARVRGAHTNDVKQLTEAVQKITTESIVIWGKTPKFKLPIQKETWETWWTEYWQATWIPEWEFVNTPPLVKLWYQLEKEPIVGAETF
+	'D_CD_83_ELI'      PISPIETVPVKLKPGMDGPKVKQWPLTEEKIKALTEICTDMEKEGKISRIGPENPYNTPIFAIKKKDSTKWRKLVDFRELNKRTQDFWEVQLGIPHPAGLKKKKSVTVLDVGDAYFSVPLDEDFRKYTAFTISSINNETPGIRYQYNVLPQGWKGSPAIFQSSMTKILEPFRKQNPEMVIYQYMDDLYVGSDLEIGQHRTKIEKLREHLLRWGFTRPDKKHQKEPPFLWMGYELHPDKWTVQSIKLPEKESWTVNDIQNLVERLNWASQIYPGIKVRQLCKLLRGTKALTEVIPLTEEAELELAENREILKEPVHGVYYDPSKDLIAEIQKQGHGQWTYQIYQEPFKNLKTGKYARMRGAHTNDVKQLAEAVQRISTESIVIWGRTPKFRLPIQKETWETWWAEYWQATWIPEWEFVNTPPLVKLWYQLEKEPIIGAETF
+	'D_CD_83_NDK'      PISPIETVPVKLKPGMDGPKVKQWPLTEEKIKALTEICTEMEKEGKISRIGPENPYNTPIFAIKKKDSTKWRKLVDFRELNKRTQDFWEVQLGIPHPAGLKKKKSVTVLDVGDAYFSVPLDEDFRKYTAFTIPSINNETPGIRYQYNVLPQGWKGSPAIFQSSMTKILEPFRKQNPEIVIYQYMDDLYVGSDLEIGQHRTKIEELREHLLRWGFTTPDKKHQKEPPFLWMGYELHPDKWTVQPINLPEKESWTVNDIQKLVGKLNWASQIYAGIKVKQLCKLLRGTKALTEVVPLTEEAELELAENREILKEPVHGVYYDPSKDLIAELQKQGDGQWTYQIYQEPFKNLKTGKYARTRGAHTNDVKQLTEAVQKIATESIVIWGKTPKFKLPIQKETWETWWIEYWQATWIPEWEFVNTPPLVKLWYQLEKEPIIGAETF
+	'D_CD_84_84ZR085'  PISPIETVPVKLKPGMDGPKVKQWPLTEEKIKALTEICTDMEKEGKISRIGPENPYNTPIFAIKKKDSTKWRKLVDFRELNKRTQDFWEVQLGIPHPAGLKKKKSITVLDVGDAYFSIPLCEDFRKYTAFTIPSINNETPGIRYQYNVLPQGWKGSPAIFQSSMIKILEPFRKQNPEVVIYQYMDDLYVGSDLEIGQHRAKIEKLREHLLRWGLTTPDKKHQKEPPFLWMGYELHPDKWTVQSITLPEKESWTVNDIQKLVGKLNWASQIYPGIKVKQLCKLLRGTKALTEVIPLTEEAELELAENREILKEPMHGVYYDPSKDLIAELQKQGQGQWTYQIYQEPFKNLKTGKYARMRGAHTNDVKQLTEAVQKIAIESIVIWGKTPKFRLPIQKETWETWWIDYWQATWIPEWEFVNTPPLVKLWYQLEKEPIIGAETF
+	'D_UG_94_94UG114'  PISPIETVPVKLKPGMDGPKVKQWPLTEEKIKALIEICSELEKEGKISKIGPENPYNTPIFAIKKKDSTKWRKLVDFRELNKRTQDFWEVQLGIPHPAGLKKKKSVTVLDVGDAYFSVPLHEDFRKYTAFTIPSTNNETPGIRYQYNVLPQGWKGSPAIFQSSMTKILEPFRKQNPEMIIYQYMDDLYVGSDLEIGQHRIKIEELRGHLLKWGFTTPDKKYQKEPPFLWMGYELHPDKWTVQPIHLPEKESWTVNDIQKLVGKLNWASQIYPGIKVRQLCKCLRGAKALTEVIPLTAEAELELAENREILKEPVHGAYYDPSKDLIAEIQKQGQDQWTYQIYQEQYKNLKTGKYAKMRGTHTNDVKQLTEAVQKIAQECIVIWGKTPKFRLPIQKETWETWWTEYWQATWIPEWEYVNTPPLVKLWYQLEKEPIVGAETF;
+END;
+
+BEGIN TREES;
+	TREE tree = ((((D_CD_83_ELI,D_CD_83_NDK),D_UG_94_94UG114),D_CD_84_84ZR085),B_US_83_RF,((B_FR_83_HXB2,B_US_86_JRFL),B_US_90_WEAU160));
+END;
diff --git a/res/data/p51.nex b/res/data/p51.nex
new file mode 100644
index 0000000..063982a
--- /dev/null
+++ b/res/data/p51.nex
@@ -0,0 +1,30 @@
+#NEXUS
+
+BEGIN TAXA;
+	DIMENSIONS NTAX = 8;
+	TAXLABELS
+		'B_FR_83_HXB2' 'B_US_83_RF' 'B_US_86_JRFL' 'B_US_90_WEAU160' 'D_CD_83_ELI' 'D_CD_83_NDK' 'D_CD_84_84ZR085' 'D_UG_94_94UG114' ;
+END;
+
+BEGIN CHARACTERS;
+	DIMENSIONS NCHAR = 1320;
+	FORMAT
+		DATATYPE = DNA
+		GAP=-
+		MISSING=?
+	;
+
+MATRIX
+	'B_FR_83_HXB2'     CCCATTAGCCCTATTGAGACTGTACCAGTAAAATTAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAATAAAAGCATTAGTAGAAATTTGTACAGAGATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAAGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGATGGAAAGGATCACCAG [...]
+	'B_US_83_RF'       CCCATTAGTCCTATTGAAACTGTACCAGTAAAATTAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAGGAAAAAATAAAAGCATTGGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCCAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAGTTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAGAAATCAGTAACAGTATTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATAAAGAGTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAAACACCACGGATTAGATATCAGTACAATGTGCTTCCACAAGGGTGGAAAGGATCACCAG [...]
+	'B_US_86_JRFL'     CCCATTAGTCCTATTGAAACTGTACCAGTAAAATTAAAGCCAGGAATGGATGGCCCAAAAGTCAAACAATGGCCATTGACAGAAGAAAAAATAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAGAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATAAAGACTTCAGGAAATATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGGTATCAGTACAATGTGCTTCCGCAGGGATGGAAAGGATCACCAG [...]
+	'B_US_90_WEAU160'  CCCATTAGTCCTATTGAAACTGTACCAGTAAAATTAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAGAAAATAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTTCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTACCCTTAGATGAAGACTTCAGGAAGTACACTGCATTTACCATACCTAGTATAAACAATGAAACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGATGGAAAGGATCACCAG [...]
+	'D_CD_83_ELI'      CCAATTAGTCCTATTGAAACTGTACCAGTAAAATTAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAATAAAAGCATTAACAGAAATTTGTACAGATATGGAAAAGGAAGGAAAAATTTCAAGAATTGGGCCTGAAAATCCATACAATACTCCAATATTTGCCATAAAGAAAAAAGACAGTACCAAGTGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGATTTCTGGGAAGTTCAATTAGGAATACCGCATCCTGCAGGGCTGAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAAGATTTTAGGAAATATACCGCCTTTACCATATCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGATGGAAAGGATCACCGG [...]
+	'D_CD_83_NDK'      CCAATTAGTCCTATTGAAACTGTACCAGTAAAATTAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAATAAAAGCATTAACAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAGAATTGGGCCTGAAAATCCATATAATACTCCAATATTTGCCATAAAGAAAAAAGACAGTACCAAGTGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGATTTCTGGGAGGTTCAATTAGGAATACCGCATCCTGCAGGGCTGAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATGAAGATTTTAGGAAATATACCGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTCCCACAGGGATGGAAAGGATCACCGG [...]
+	'D_CD_84_84ZR085'  CCAATTAGTCCTATTGAAACTGTACCAGTAAAATTAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCGTTGACAGAAGAAAAAATAAAAGCATTAACAGAAATTTGTACAGATATGGAAAAGGAAGGAAAAATTTCAAGAATTGGGCCTGAAAATCCATACAATACTCCAATATTTGCCATAAAGAAAAAAGACAGTACTAAGTGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGGATACCACATCCTGCAGGATTAAAGAAGAAAAAGTCAATAACAGTACTGGATGTGGGCGATGCATATTTTTCAATTCCCTTATGTGAAGACTTTAGGAAGTACACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTACTTCCACAGGGATGGAAAGGATCACCAG [...]
+	'D_UG_94_94UG114'  CCAATTAGTCCTATTGAAACTGTACCAGTAAAATTAAAGCCAGGGATGGATGGCCCAAAAGTTAAACAATGGCCGTTGACAGAAGAAAAAATAAAAGCACTAATAGAAATTTGTTCAGAACTAGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAACCCATACAATACTCCAATATTTGCCATAAAGAAAAAAGACAGTACTAAGTGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTTTGGGAAGTTCAACTAGGAATACCACATCCTGCAGGGCTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGACGCATATTTTTCAGTTCCCTTACATGAAGACTTTAGAAAATATACCGCATTCACCATACCTAGTACAAACAATGAGACACCAGGAATTAGATATCAGTACAATGTGCTTCCACAAGGATGGAAAGGATCACCAG [...]
+END;
+
+BEGIN TREES;
+	TREE tree = ((((D_CD_83_ELI,D_CD_83_NDK),D_UG_94_94UG114),D_CD_84_84ZR085),B_US_83_RF,((B_FR_83_HXB2,B_US_86_JRFL),B_US_90_WEAU160));
+END;
diff --git a/scripts/build.sh b/scripts/build.sh
new file mode 100644
index 0000000..4094243
--- /dev/null
+++ b/scripts/build.sh
@@ -0,0 +1,414 @@
+#!/bin/sh
+
+
+TARGET_NAME="BLANK"
+LIBRARY_BINDINGS="NONE"
+
+export PATH=$PATH:/opt/ibmcmp/xlc/ssc/0.9/bin/
+
+if [ $# -ne 1 -a $# -ne 2 ]
+then
+	TARGET_NAME="HELP";
+else
+	if [ $1 != "SP" -a $1 != "GTEST" -a $1 != "MP" -a $1 != "MP2"  -a $1 != "MPI" -a $1 != "DEBUG" -a $1 != "LIBRARY" -a $1 != "DEV" -a $1 != "PS3" -a $1 != "DMALLOC" ] 
+	then
+		$TARGET_NAME = "HELP"
+	else
+		TARGET_NAME=$1
+	fi
+fi
+
+if [ $TARGET_NAME = "HELP" ] 
+then
+	echo "Usage: build.sh package_name"
+	echo "  where package_name is one of the following:"
+	echo "  SP : for a single threaded build"
+	echo "  MP : for a multi-threaded build with pthreads."
+	echo "  MP2 : for a multi-threaded build with pthreads which support setconcurrency function."
+	echo "  DEV : developmental OpenMP build with likelihood function speedups."
+	echo "  PS3 : developmental PS3 OpenMP build with likelihood function speedups."
+	echo "  MPI : for a single-threaded build with MPI message passing support."
+	echo "  DEBUG: single threaded debug version."
+	echo "  GTEST: a unit test version for coverage and regression testing."
+	echo "  LIBRARY [Python|R]: multi-threaded library version with optional wrappers for Python or R."
+	exit 1
+fi
+
+
+if [ $TARGET_NAME = "LIBRARY" -a $# -eq 2 ]
+then
+	if [ $2 != "R" -a $2 != "Python" ] 
+	then
+		echo "Library binding options must be one of the following:"
+		echo "  LIBRARY [Python|R]: multi-threaded library version with optional wrappers for Python or R."
+		exit 1
+	else
+		echo "Library bindings for $2 will be linked into the library. See README for details"
+		LIBRARY_BINDINGS=$2
+	fi
+fi
+
+
+# MODIFY THESE BASED ON YOUR SYSTEM
+# DEFAULT SETTINGS ARE FOR GCC
+# NEEDS gcc, g++ 4 and > for fopemp flags on DEV version
+	
+COMPILER="g++";
+COMPILERC="gcc";
+
+CURL_LINKER_LIBS=" -lssl -lcrypto -lcurl";
+
+if [ $TARGET_NAME = "PS3" ]
+then
+	sysName="AIX"
+else
+	sysName=`uname`;
+fi
+echo $sysName;
+
+
+if [ $sysName == "Darwin" ]
+then
+	machName=`machine`;
+	if [ $machName == "ppc7450" ] 
+	then
+		COMPILER_FLAGS=" -D __UNIX__ -w -c -fsigned-char -fast -mcpu=7450 -fpermissive -I`pwd`/Source -I`pwd`/Source/SQLite -D INTPTR_TYPE=long "
+	else
+		COMPILER_FLAGS=" -D __UNIX__ -w -c -fsigned-char -fast -fpermissive -I`pwd`/Source -I`pwd`/Source/SQLite -D INTPTR_TYPE=long "	
+	fi
+	COMPILER_LINK_FLAGS=" -w -fsigned-char ";
+else
+	if [ $sysName == "AIX" ]
+	then
+		if [ $TARGET_NAME = "PS3" ]
+		then
+			COMPILER="cbexlc++"
+			COMPILERC="cbexlc"
+			COMPILER_FLAGS=" -c -qchar=signed -O3 -D INTPTR_TYPE=long -D __UNIX__ ";
+			COMPILER_LINK_FLAGS="  -qchar=signed ";
+		else
+			COMPILER="xlC";
+			COMPILERC="xlc";
+			COMPILER_FLAGS=" -qsmp=omp -c -D _SLKP_LFENGINE_REWRITE_ -qchar=signed -O3 -D INTPTR_TYPE=long -D __UNIX__ -qreport  -qarch=auto -qtune=auto ";
+			COMPILER_LINK_FLAGS=" -qsmp=omp -qchar=signed -lxlsmp  -bmaxdata:0x80000000 ";
+		fi
+	else
+		COMPILER_LINK_FLAGS=" -w -fsigned-char ";
+		COMPILER_FLAGS=" -w -c -fsigned-char -O3 -fpermissive -I`pwd`/Source -I`pwd`/Source/SQLite -D INTPTR_TYPE=long -D __UNIX__ ";
+	fi
+fi
+
+
+# END MODIFY
+
+COMPILER_FLAGS=$COMPILER_FLAGS" -D _SLKP_LFENGINE_REWRITE_ ";
+
+echo "Checking for curl";
+
+rm -rf curl_check*
+
+(echo "#include <curl/curl.h>"; echo "int main(void) {return 0;}") | cat - > curl_check.cpp
+
+if `$COMPILER -o curl_check -w $CURL_LINKER_LIBS curl_check.cpp`
+then
+ echo "Curl seems to be present"
+else
+	echo "Curl seems to be absent (setting up compiler options skip CURL code)";
+	CURL_LINKER_LIBS="";
+	COMPILER_FLAGS=$COMPILER_FLAGS" -D__HYPHY_NO_CURL__";
+	COMPILER_LINK_FLAGS=$COMPILER_LINK_FLAGS" -D__HYPHY_NO_CURL__";
+fi
+
+rm -rf curl_check*
+
+	
+makedir () {
+	if [ -f $1 ] 
+	then
+		echo "Insufficient permissions to create an object directory";
+		exit 1;
+	fi
+	
+	if [ ! -d $1  ]
+	then
+		if [ `mkdir $1` ]
+		then
+			echo "Failed to create directory $1";
+			exit 1;
+		fi
+	fi
+}
+
+OBJ_DIR_NAME="obj_$TARGET_NAME"
+
+if [ -f $OBJ_DIR_NAME ] 
+then
+	rm -rf $OBJ_DIR_NAME;
+fi
+
+makedir $OBJ_DIR_NAME
+
+if [ $1 = "SP" ] 
+then
+	TARGET_NAME="HYPHY";
+	LINKER_FLAGS=$CURL_LINKER_LIBS" -lm -ldl -lpthread ";
+	echo "+--------------------------------------+"
+	echo "|Building a single threaded HYPHYKernel|"
+	echo "+--------------------------------------+"
+fi
+
+if [ $1 = "MP" ] 
+then
+	TARGET_NAME="HYPHYMP";
+	LINKER_FLAGS=$CURL_LINKER_LIBS" -lm -lpthread -ldl ";
+	echo "+---------------------------------------+"
+	echo "|Building a multi-threaded HYPHYKernelMP|"
+	echo "+---------------------------------------+"
+	COMPILER_FLAGS=$COMPILER_FLAGS" -D __MP__"
+fi
+
+if [ $1 = "MP2" ] 
+then
+	TARGET_NAME="HYPHYMP";
+	LINKER_FLAGS=$CURL_LINKER_LIBS" -lm -lpthread -fopenmp -ldl ";
+	echo "+-----------------------------------------------------------+"
+	echo "|Building a multi-threaded HYPHYKernelMP with setconcurrency|"
+	echo "+-----------------------------------------------------------+"
+	COMPILER_FLAGS=$COMPILER_FLAGS" -D __MP__ -D __MP2__ -fopenmp "
+fi
+
+if [ $1 = "PS3" ] 
+then
+	TARGET_NAME="HYPHY_PS3";
+	LINKER_FLAGS=$CURL_LINKER_LIBS" -lm ";
+	echo "+-----------------------------------------------------------+"
+	echo "|Building a OpenMP/PS3      developmental version of HyPhy  |"
+	echo "+-----------------------------------------------------------+"
+	COMPILER_FLAGS=$COMPILER_FLAGS" -D __MP__ -D __MP2__ -D _SLKP_LFENGINE_REWRITE_ -qtune=cell -qarch=cell -O5 "
+fi
+
+if [ $1 = "MPI" ] 
+then
+	if [ $sysName == "Darwin" ]
+	then
+		COMPILER="mpic++";
+		COMPILERC="mpicc";
+		COMPILER_FLAGS=$COMPILER_FLAGS" -D _SLKP_LFENGINE_REWRITE_ "
+		LINKER_FLAGS=$CURL_LINKER_LIBS" -lm -ldl ";
+	else
+		LINKER_FLAGS=$CURL_LINKER_LIBS" -lpthread -lm -lmpich -ldl ";	
+	fi 
+	
+	if [ $sysName == "AIX" ]
+	then
+		COMPILER="mpCC";
+		COMPILERC="mpcc";
+		LINKER_FLAGS=$CURL_LINKER_LIBS" -lm ";
+	fi
+	
+	TARGET_NAME="HYPHYMPI";
+	echo "+-----------------------------------------------------------+"
+	echo "|Building a single-threaded HYPHYKernelMPI for MPI          |"
+	echo "+-----------------------------------------------------------+"
+	COMPILER_FLAGS=$COMPILER_FLAGS" -D __HYPHYMPI__ -D _SLKP_LFENGINE_REWRITE_ "
+fi
+
+if [ $1 = "DEBUG" ]
+then
+    TARGET_NAME="HYPHYDebug";
+    LINKER_FLAGS=$CURL_LINKER_LIBS" -g -lm -fopenmp ";
+    echo "+---------------------------------------+"
+    echo "|Building a debug version HYPHYDebug    |"
+    echo "+---------------------------------------+"
+    COMPILER_FLAGS=" -w -c -g -fsigned-char  -fpermissive -D __UNIX__ -D _SLKP_LFENGINE_REWRITE_ -D INTPTR_TYPE=long -I`pwd`/Source "
+fi
+
+if [ $1 = "GTEST" ]
+then
+    TARGET_NAME="HYPHYTest";
+    LINKER_FLAGS=$CURL_LINKER_LIBS" -g -fprofile-arcs -ftest-coverage -lm -fopenmp ../UnitTests/libgtest.a";
+    echo "+---------------------------------------+"
+    echo "|Building a debug version HYPHYDebug    |"
+    echo "+---------------------------------------+"
+    COMPILER_FLAGS=" -w -c -g -fprofile-arcs -ftest-coverage -fsigned-char  -fpermissive -D __UNIX__ -D__UNITTEST__ -D _SLKP_LFENGINE_REWRITE_ -D INTPTR_TYPE=long -I`pwd`/Source/  -I`pwd`/UnitTests "
+
+	echo "COMPILER=$COMPILER, $COMPILERC";
+	echo "COMPILER_FLAGS=$COMPILER_FLAGS";
+	
+	cd Source
+	for fileName in *.cpp main-unix.cxx SQLite/*c ../UnitTests/*cpp
+		do
+			name=${fileName%%.[a-z0-9]*}
+			name=${name##*/}
+			extension=${fileName##*.}
+			#echo $name $extension
+			obj_file="$name.o";
+			#echo Building "$name";
+			
+			if [ $obj_file -nt $fileName ]
+			then
+				echo File "$fileName" is up to date
+	  		else
+				if [ $extension = "c" ]
+				then
+					cmd="$COMPILERC $COMPILER_FLAGS $fileName"
+				else
+					cmd="$COMPILER $COMPILER_FLAGS $fileName"
+				fi
+				echo $cmd
+				if `$cmd`
+				then
+					echo Complete
+				else
+					echo Error during compilation;
+					exit 1;
+				fi
+			fi
+		done
+	  
+	  
+	echo Linking $TARGET_NAME
+	echo $COMPILER $COMPILER_LINK_FLAGS -o ../$TARGET_NAME *.o $LINKER_FLAGS
+    `$COMPILER $COMPILER_LINK_FLAGS -o ../$TARGET_NAME *.o $LINKER_FLAGS`
+ 
+	exit 0 
+fi
+
+if [ $1 = "DMALLOC" ]
+then
+    TARGET_NAME="HYPHYDmalloc";
+    LINKER_FLAGS=$CURL_LINKER_LIBS" -g -lm -ldmalloc ";
+    echo "+---------------------------------------+"
+    echo "|Building a debug version HYPHYDebug    |"
+    echo "+---------------------------------------+"
+    COMPILER_FLAGS=" -w -c -g -fsigned-char -D__HYPHYDMALLOC__ -fpermissive -D __UNIX__ -D _SLKP_LFENGINE_REWRITE_ -D INTPTR_TYPE=long ";
+fi
+
+if [ $1 = "LIBRARY" ] 
+then
+	LINKER_FLAGS=$CURL_LINKER_LIBS" -lm -lpthread ";
+	echo "+-----------------------------------------------------------+"
+	echo "|Building a multi-threaded HYPHY library version            |"
+	echo "+-----------------------------------------------------------+"
+	if [ $sysName == "Darwin" ]
+	then
+		TARGET_NAME="libhyphy.so";
+		COMPILER_FLAGS=$COMPILER_FLAGS" -fno-strict-aliasing -D __MP__ -D __MP2__ -D __HEADLESS__ -fPIC -I`pwd`/Source/Link "
+		COMPILER_LINK_FLAGS=$COMPILER_LINK_FLAGS" -bundle -flat_namespace -undefined suppress "	
+	else
+		COMPILER_FLAGS=$COMPILER_FLAGS" -D __MP__ -D __MP2__ -D __HEADLESS__ -fPIC -I`pwd`/Source/Link "
+		COMPILER_LINK_FLAGS=$COMPILER_LINK_FLAGS" -Wl,-shared "
+	fi
+	
+fi
+
+#COMPILER_FLAGS=$COMPILER_FLAGS" -D __AFYP_REWRITE_BGM__ "
+
+echo "COMPILER=$COMPILER, $COMPILERC";
+echo "COMPILER_FLAGS=$COMPILER_FLAGS";
+
+
+cd Source
+
+if [ $1 = "LIBRARY" ] 
+then
+	for fileName in *.cpp
+	do
+	  obj_file=../$OBJ_DIR_NAME/${fileName}.o;
+	  if [ $obj_file -nt $fileName ]
+	  then
+	  	echo File "$fileName" is up to date
+	  else
+		  echo Building "$fileName";
+		  if `$COMPILER -o $obj_file $COMPILER_FLAGS $fileName `
+		   then
+	      	 echo Complete
+		   else
+		  		echo Error during compilation;
+		  		exit 1;
+		   fi
+	  fi
+	done
+cd Link
+	for fileName in *.cpp
+	do
+	  obj_file=../../$OBJ_DIR_NAME/${fileName}.o;
+	  if [ $obj_file -nt $fileName ]
+	  then
+			echo File "$fileName" is up to date
+	  else
+		  echo Building "$fileName";
+		  if `$COMPILER -o $obj_file $COMPILER_FLAGS $fileName `
+		   then
+			 echo Complete
+		   else
+				echo Error during compilation;
+				exit 1;
+		   fi
+	  fi
+	done
+cd ..
+# not a library build
+else 
+	for fileName in *.cpp main-unix.cxx
+	do
+	  obj_file=../$OBJ_DIR_NAME/${fileName}.o;
+	  if [ $obj_file -nt $fileName ]
+	  then
+	  	echo File "$fileName" is up to date
+	  else
+		  echo Building "$fileName";
+		  if `$COMPILER -o $obj_file $COMPILER_FLAGS $fileName `
+		   then
+	      	 echo Complete
+		   else
+		  		echo Error during compilation;
+		  		exit 1;
+		   fi
+	  fi
+	done
+fi
+
+cd SQLite
+
+for fileName in *.c
+do
+  obj_file=../../$OBJ_DIR_NAME/${fileName}.o;
+  if [ $obj_file -nt $fileName ]
+  then 
+  	echo SQLite File "$fileName" is up to date
+  else
+	  echo Building "SQLite file $fileName";
+	  if `$COMPILERC -o $obj_file $COMPILER_FLAGS $fileName `
+	   then
+	                echo Complete
+	   else
+	                echo Error during compilation;
+	                exit 1;
+	   fi
+  fi
+done
+
+cd ../..
+
+
+
+
+if [ $1 != "LIBRARY" -o $LIBRARY_BINDINGS = "NONE" ]
+then
+	echo Linking $TARGET_NAME
+	echo $COMPILER $COMPILER_LINK_FLAGS -o $TARGET_NAME $OBJ_DIR_NAME/*.o  $LINKER_FLAGS
+    `$COMPILER $COMPILER_LINK_FLAGS -o $TARGET_NAME $OBJ_DIR_NAME/*.o  $LINKER_FLAGS`
+else
+	if [ $LIBRARY_BINDINGS = "R" ]
+	then
+		echo Linking HyPhy.so
+		cppf="PKG_CPPFLAGS=\"-I`pwd`/Source/Link/\""
+		echo  $cppf R CMD SHLIB -o LibraryModules/R/HyPhy.so $OBJ_DIR_NAME/*.o  LibraryModules/Source/THyPhy_R.cpp $LINKER_FLAGS
+		export $cppf; R CMD SHLIB -o LibraryModules/R/HyPhy.so $OBJ_DIR_NAME/*.o  LibraryModules/Source/THyPhy_R.cpp	$LINKER_FLAGS	
+		echo R library written to `pwd`/LibraryModules/R/HyPhy.so
+	fi
+fi
+echo Finished
+
+
diff --git a/scripts/buildFromSVN.sh b/scripts/buildFromSVN.sh
new file mode 100644
index 0000000..f882757
--- /dev/null
+++ b/scripts/buildFromSVN.sh
@@ -0,0 +1,65 @@
+makedir () {
+	if [ -f $1 ] 
+	then
+		echo "Insufficient permissions to create an object directory";
+		exit 1;
+	fi
+	
+	if [ ! -d $1  ]
+	then
+		if [ `mkdir $1` ]
+		then
+			echo "Failed to create directory $1";
+			exit 1;
+		fi
+	fi
+}
+
+if [ $# -ne 1 ]
+then
+	installDirectory=HYPHY
+else
+	installDirectory=$1
+fi
+
+cd ../..
+
+makedir $installDirectory
+makedir $installDirectory/Source
+makedir $installDirectory/Library
+makedir $installDirectory/Source/Link
+makedir $installDirectory/GUI
+makedir $installDirectory/Source/SQLite
+cp trunk/Core/*.{h,cp,cpp} $installDirectory/Source/
+rm -f $installDirectory/Source/preferences.cpp
+cp trunk/Core/preferences.cpp $installDirectory/GUI
+cp trunk/HeadlessLink/*.{h,cpp} $installDirectory/Source/Link
+
+cp trunk/NewerFunctionality/*.{h,cpp} $installDirectory/Source/
+cp -R trunk/Library $installDirectory/
+cp -R trunk/data $installDirectory/
+cp SQLite/trunk/*.{c,h} $installDirectory/Source/SQLite/
+cp trunk/Scripts/*.sh $installDirectory/
+cp 'trunk/GUIElements/Shared Source/'*.cpp $installDirectory/GUI/
+cp 'trunk/GUIElements/Shared Source/Components/'*.cpp $installDirectory/GUI/
+cp 'trunk/GUIElements/Shared Include/'*.h $installDirectory/GUI/
+cp 'trunk/GUIElements/Shared Include/'{Components,WindowClasses}/*.h $installDirectory/GUI/
+cp  'trunk/GUIElements/Platform Include/GTK/'*.h $installDirectory/GUI/
+cp  'trunk/GUIElements/Platform Include/GTK/Components/'*.h $installDirectory/GUI/
+cp  'trunk/GUIElements/Platform Source/GTK/'*.cpp $installDirectory/GUI/
+cp  'trunk/GUIElements/Platform Source/GTK/Components/'*.cpp $installDirectory/GUI/
+cp  'trunk/GUIElements/Platform Source/GTK/WindowClasses/'*.cpp $installDirectory/GUI/
+
+cp 	trunk/Mains/main-GTK.cpp  $installDirectory/Source/main-GTK.cxx
+cp  trunk/Mains/main-unix.cpp $installDirectory/Source/main-unix.cxx
+cp  trunk/Mains/hyphyunixutils.cpp $installDirectory/Source/hyphyunixutils.cpp
+cp  -R trunk/{ChartAddIns,DatapanelAddIns,GeneticCodes,Help,SubstitutionClasses,SubstitutionModels,TemplateBatchFiles,TopologyInference,TreeAddIns,UserAddins} $installDirectory
+makedir $installDirectory/GTKResources
+cp  trunk/GUIElements/Resources/GTKResources/*.* $installDirectory/GTKResources/
+makedir $installDirectory/GTKResources/theme
+cp  trunk/GUIElements/Resources/GTKResources/theme/*.* $installDirectory/GTKResources/theme
+
+cd $installDirectory
+bash build.sh MP2
+#bash build.sh DEV
+bash gtk_build.sh MP2
diff --git a/scripts/buildMinGWFromSVN.sh b/scripts/buildMinGWFromSVN.sh
new file mode 100644
index 0000000..7e10533
--- /dev/null
+++ b/scripts/buildMinGWFromSVN.sh
@@ -0,0 +1,59 @@
+makedir () {
+	if [ -f $1 ] 
+	then
+		echo "Insufficient permissions to create an object directory";
+		exit 1;
+	fi
+	
+	if [ ! -d $1  ]
+	then
+		if [ `mkdir $1` ]
+		then
+			echo "Failed to create directory $1";
+			exit 1;
+		fi
+	fi
+}
+
+if [ $# -ne 1 ]
+then
+	installDirectory=HYPHY_MinGW
+else
+	installDirectory=$1
+fi
+
+cd ../..
+
+makedir $installDirectory
+makedir $installDirectory/Source
+makedir $installDirectory/Win32GUI
+makedir $installDirectory/Source/SQLite
+cp trunk/Core/*.{h,cp,cpp} $installDirectory/Source/
+rm -f $installDirectory/Source/preferences.cpp
+cp trunk/Core/preferences.cpp $installDirectory/Win32GUI
+
+cp trunk/NewerFunctionality/*.{h,cpp} $installDirectory/Source/
+cp SQLite/trunk/*.{c,h} $installDirectory/Source/SQLite/
+cp trunk/Scripts/*.sh $installDirectory/
+
+cp 'trunk/GUIElements/Shared Source/'*.cpp $installDirectory/Win32GUI/
+cp 'trunk/GUIElements/Shared Source/Components/'*.cpp $installDirectory/Win32GUI/
+cp 'trunk/GUIElements/Shared Include/'*.h $installDirectory/Win32GUI/
+cp 'trunk/GUIElements/Shared Include/'{Components,WindowClasses}/*.h $installDirectory/Win32GUI/
+cp  'trunk/GUIElements/Platform Include/Windows/'*.h $installDirectory/Win32GUI/
+cp  'trunk/GUIElements/Platform Include/Windows/Components/'*.h $installDirectory/Win32GUI/
+cp  'trunk/GUIElements/Platform Source/Windows/'*.cpp $installDirectory/Win32GUI/
+cp  'trunk/GUIElements/Platform Source/Windows/Components/'*.cpp $installDirectory/Win32GUI/
+cp  'trunk/GUIElements/Platform Source/Windows/WindowClasses/'*.cpp $installDirectory/Win32GUI/
+
+cp  trunk/Mains/hyphyunixutils.cpp $installDirectory/Source/hyphyunixutils.cpp
+cp  trunk/Mains/main-win.cpp $installDirectory/Source/main-win.cxx
+cp  trunk/Mains/main-unix.cpp $installDirectory/Source/main-unix.cxx
+cp  -R trunk/{ChartAddIns,DatapanelAddIns,GeneticCodes,Help,SubstitutionClasses,SubstitutionModels,TemplateBatchFiles,TopologyInference,TreeAddIns,UserAddIns} $installDirectory
+cp  -R 'trunk/GUIElements/Resources/Windows' $installDirectory/Win32GUI/
+rm -f $installDirectory/Win32GUI/Windows/*.{dll,lib}
+cp  'trunk/GUIElements/Resources/Windows/pthreadGC2.dll' $installDirectory
+
+cd $installDirectory
+sh build_mingw.sh
+sh build_mingw_gui.sh
diff --git a/scripts/build_mingw.sh b/scripts/build_mingw.sh
new file mode 100644
index 0000000..520b257
--- /dev/null
+++ b/scripts/build_mingw.sh
@@ -0,0 +1,115 @@
+#!/bin/sh
+
+
+TARGET_NAME="DEV"
+LIBRARY_BINDINGS="NONE"
+
+	
+COMPILER="g++.exe";
+COMPILERC="gcc.exe";
+
+COMPILER_FLAGS=" -D __UNIX__ -w -c -fsigned-char -O3 -fpermissive -I`pwd`/Source -I`pwd`/Source/SQLite -D INTPTR_TYPE=long "	
+
+echo "Checking for curl";
+
+rm -rf curl_check*
+
+(echo "#include <curl/curl.h>"; echo "int main(void) {return 0;}") | cat - > curl_check.cpp
+
+if `$COMPILER -o curl_check -w $CURL_LINKER_LIBS curl_check.cpp`
+then
+ echo "Curl seems to be present"
+else
+	echo "Curl seems to be absent (setting up compiler options skip CURL code)";
+	CURL_LINKER_LIBS="";
+	COMPILER_FLAGS=$COMPILER_FLAGS" -D__HYPHY_NO_CURL__";
+	COMPILER_LINK_FLAGS=$COMPILER_LINK_FLAGS" -D__HYPHY_NO_CURL__";
+fi
+
+rm -rf curl_check*
+
+	
+makedir () {
+	if [ -f $1 ] 
+	then
+		echo "Insufficient permissions to create an object directory";
+		exit 1;
+	fi
+	
+	if [ ! -d $1  ]
+	then
+		if [ `mkdir $1` ]
+		then
+			echo "Failed to create directory $1";
+			exit 1;
+		fi
+	fi
+}
+
+OBJ_DIR_NAME="obj_$TARGET_NAME"
+
+if [ -f $OBJ_DIR_NAME ] 
+then
+	rm -rf $OBJ_DIR_NAME;
+fi
+
+makedir $OBJ_DIR_NAME
+
+
+TARGET_NAME="HYPHYMP_DEV.exe";
+LINKER_FLAGS=$CURL_LINKER_LIBS" -lgomp -lm -lpthread ";
+echo "+-----------------------------------------------------------+"
+echo "|Building a OpenMP/MigGW    developmental version of HyPhy  |"
+echo "+-----------------------------------------------------------+"
+COMPILER_FLAGS=$COMPILER_FLAGS" -D __MP__ -D __MP2__ -D _SLKP_LFENGINE_REWRITE_ -fopenmp "
+
+cd Source 
+
+for fileName in *.cpp main-unix.cxx
+do
+  obj_file=../$OBJ_DIR_NAME/${fileName}.o;
+  if [ $obj_file -nt $fileName ]
+  then
+	echo File "$fileName" is up to date
+  else
+	  echo Building "$fileName";
+	  if `$COMPILER -o $obj_file $COMPILER_FLAGS $fileName `
+	   then
+		 echo Complete
+	   else
+			echo Error during compilation;
+			exit 1;
+	   fi
+  fi
+done
+
+cd SQLite
+
+for fileName in *.c
+do
+  obj_file=../../$OBJ_DIR_NAME/${fileName}.o;
+  if [ $obj_file -nt $fileName ]
+  then 
+  	echo SQLite File "$fileName" is up to date
+  else
+	  echo Building "SQLite file $fileName";
+	  if `$COMPILERC -o $obj_file $COMPILER_FLAGS $fileName `
+	   then
+	                echo Complete
+	   else
+	                echo Error during compilation;
+	                exit 1;
+	   fi
+  fi
+done
+
+
+cd ../..
+
+echo Linking $TARGET_NAME
+echo $COMPILER $COMPILER_LINK_FLAGS -o $TARGET_NAME $OBJ_DIR_NAME/*.o  $LINKER_FLAGS
+`$COMPILER $COMPILER_LINK_FLAGS -o $TARGET_NAME $OBJ_DIR_NAME/*.o  $LINKER_FLAGS`
+
+echo Finished
+
+
diff --git a/scripts/build_mingw_MEGA.sh b/scripts/build_mingw_MEGA.sh
new file mode 100644
index 0000000..8b803a5
--- /dev/null
+++ b/scripts/build_mingw_MEGA.sh
@@ -0,0 +1,117 @@
+#!/bin/sh
+
+
+TARGET_NAME="MEGA_LINK"
+LIBRARY_BINDINGS="NONE"
+
+	
+COMPILER="g++.exe";
+COMPILERC="gcc.exe";
+
+COMPILER_FLAGS=" -D __UNIX__ -w -c -fsigned-char -O3 -fpermissive -I`pwd`/Source -I`pwd`/Source/SQLite "	
+
+echo "Checking for curl";
+
+rm -rf curl_check*
+
+(echo "#include <curl/curl.h>"; echo "int main(void) {return 0;}") | cat - > curl_check.cpp
+
+if `$COMPILER -o curl_check -w $CURL_LINKER_LIBS curl_check.cpp`
+then
+ echo "Curl seems to be present"
+else
+	echo "Curl seems to be absent (setting up compiler options skip CURL code)";
+	CURL_LINKER_LIBS="";
+	COMPILER_FLAGS=$COMPILER_FLAGS" -D__HYPHY_NO_CURL__";
+	COMPILER_LINK_FLAGS=$COMPILER_LINK_FLAGS" -D__HYPHY_NO_CURL__";
+fi
+
+rm -rf curl_check*
+
+	
+makedir () {
+	if [ -f $1 ] 
+	then
+		echo "Insufficient permissions to create an object directory";
+		exit 1;
+	fi
+	
+	if [ ! -d $1  ]
+	then
+		if [ `mkdir $1` ]
+		then
+			echo "Failed to create directory $1";
+			exit 1;
+		fi
+	fi
+}
+
+OBJ_DIR_NAME="obj_$TARGET_NAME"
+
+if [ -f $OBJ_DIR_NAME ] 
+then
+	rm -rf $OBJ_DIR_NAME;
+fi
+
+makedir $OBJ_DIR_NAME
+
+
+TARGET_NAME="HYPHYMP_MEGA.exe";
+LINKER_FLAGS=$CURL_LINKER_LIBS" -D WINVER=0x0500 -lgomp -lpthread -lcomctl32 -lwinspool -lwininet -lmsimg32 ";
+echo "+-----------------------------------------------------------+"
+echo "|Building an OpenMP/MigGW/MEGA link dev.  version of HyPhy  |"
+echo "+-----------------------------------------------------------+"
+COMPILER_FLAGS=$COMPILER_FLAGS" -D __MP__ -D __MP2__ -D _SLKP_LFENGINE_REWRITE_ -fopenmp -D WINVER=0x0500 -D _MINGW32_MEGA_ "
+
+echo "COMPILER_FLAGS = "$COMPILER_FLAGS
+echo "LINKER_FLAGS   = "$LINKER_FLAGS
+
+cd Source 
+
+for fileName in *.cpp main-unix.cxx
+do
+	  obj_file=../$OBJ_DIR_NAME/${fileName}.o;
+	  if [ $obj_file -nt $fileName ]
+	  then
+		echo File "$fileName" is up to date
+	  else
+		  echo Building "$fileName";
+		  if `$COMPILER -o $obj_file $COMPILER_FLAGS $fileName `
+		   then
+			 echo Complete
+		   else
+				echo Error during compilation;
+				exit 1;
+		   fi
+	  fi
+done
+
+cd SQLite
+
+for fileName in *.c
+do
+  obj_file=../../$OBJ_DIR_NAME/${fileName}.o;
+  if [ $obj_file -nt $fileName ]
+  then 
+  	echo SQLite File "$fileName" is up to date
+  else
+	  echo Building "SQLite file $fileName";
+	  if `$COMPILERC -o $obj_file $COMPILER_FLAGS $fileName `
+	   then
+	                echo Complete
+	   else
+	                echo Error during compilation;
+	                exit 1;
+	   fi
+  fi
+done
+
+cd ../../
+
+echo Linking $TARGET_NAME
+echo $COMPILER $COMPILER_LINK_FLAGS -o $TARGET_NAME $OBJ_DIR_NAME/*.o  $LINKER_FLAGS
+`$COMPILER $COMPILER_LINK_FLAGS -o $TARGET_NAME $OBJ_DIR_NAME/*.o  $LINKER_FLAGS`
+
+echo Finished
+
+
diff --git a/scripts/build_mingw_gui.sh b/scripts/build_mingw_gui.sh
new file mode 100644
index 0000000..e4eaab6
--- /dev/null
+++ b/scripts/build_mingw_gui.sh
@@ -0,0 +1,162 @@
+#!/bin/sh
+
+
+TARGET_NAME="DEV_GUI"
+LIBRARY_BINDINGS="NONE"
+
+	
+COMPILER="g++.exe";
+COMPILERC="gcc.exe";
+RC_COMPILER="windres.exe"
+
+COMPILER_FLAGS=" -D __WINDOZE__ -w -c -fsigned-char -O3 -fpermissive -I`pwd`/Source -I`pwd`/Source/SQLite -I`pwd`/Win32GUI -D INTPTR_TYPE=long "	
+
+echo "Checking for curl";
+
+rm -rf curl_check*
+
+(echo "#include <curl/curl.h>"; echo "int main(void) {return 0;}") | cat - > curl_check.cpp
+
+if `$COMPILER -o curl_check -w $CURL_LINKER_LIBS curl_check.cpp`
+then
+ echo "Curl seems to be present"
+else
+	echo "Curl seems to be absent (setting up compiler options skip CURL code)";
+	CURL_LINKER_LIBS="";
+	COMPILER_FLAGS=$COMPILER_FLAGS" -D__HYPHY_NO_CURL__";
+	COMPILER_LINK_FLAGS=$COMPILER_LINK_FLAGS" -D__HYPHY_NO_CURL__";
+fi
+
+rm -rf curl_check*
+
+	
+makedir () {
+	if [ -f $1 ] 
+	then
+		echo "Insufficient permissions to create an object directory";
+		exit 1;
+	fi
+	
+	if [ ! -d $1  ]
+	then
+		if [ `mkdir $1` ]
+		then
+			echo "Failed to create directory $1";
+			exit 1;
+		fi
+	fi
+}
+
+OBJ_DIR_NAME="obj_$TARGET_NAME"
+
+if [ -f $OBJ_DIR_NAME ] 
+then
+	rm -rf $OBJ_DIR_NAME;
+fi
+
+makedir $OBJ_DIR_NAME
+
+
+TARGET_NAME="HYPHYMP_Win32.exe";
+LINKER_FLAGS=$CURL_LINKER_LIBS" -D WINVER=0x0500 -lgomp -lpthread -lcomctl32 -lwinspool -lwininet -lmsimg32 -mwindows ";
+echo "+-----------------------------------------------------------+"
+echo "|Building a OpenMP/MigGW/Win32 dev.       version of HyPhy  |"
+echo "+-----------------------------------------------------------+"
+COMPILER_FLAGS=$COMPILER_FLAGS" -D __MP__ -D __MP2__ -D _SLKP_LFENGINE_REWRITE_ -fopenmp -D WINVER=0x0500 -mwindows  "
+
+echo "COMPILER_FLAGS = "$COMPILER_FLAGS
+echo "LINKER_FLAGS   = "$LINKER_FLAGS
+
+cd Source 
+
+for fileName in *.cpp main-win.cxx
+do
+  if [ ${fileName} != "hyphyunixutils.cpp" ]
+  then
+	  obj_file=../$OBJ_DIR_NAME/${fileName}.o;
+	  if [ $obj_file -nt $fileName ]
+	  then
+		echo File "$fileName" is up to date
+	  else
+		  echo Building "$fileName";
+		  if `$COMPILER -o $obj_file $COMPILER_FLAGS $fileName `
+		   then
+			 echo Complete
+		   else
+				echo Error during compilation;
+				exit 1;
+		   fi
+	  fi
+  fi
+done
+
+cd SQLite
+
+for fileName in *.c
+do
+  obj_file=../../$OBJ_DIR_NAME/${fileName}.o;
+  if [ $obj_file -nt $fileName ]
+  then 
+  	echo SQLite File "$fileName" is up to date
+  else
+	  echo Building "SQLite file $fileName";
+	  if `$COMPILERC -o $obj_file $COMPILER_FLAGS $fileName `
+	   then
+	                echo Complete
+	   else
+	                echo Error during compilation;
+	                exit 1;
+	   fi
+  fi
+done
+
+cd ../../Win32GUI
+
+for fileName in *.cpp
+do
+  obj_file=../$OBJ_DIR_NAME/${fileName}.o;
+  if [ $obj_file -nt $fileName ]
+  then
+	echo File "$fileName" is up to date
+  else
+	  echo Building "$fileName";
+	  if `$COMPILER -o $obj_file $COMPILER_FLAGS $fileName `
+	   then
+		 echo Complete
+	   else
+			echo Error during compilation;
+			exit 1;
+	   fi
+  fi
+done
+
+cd Windows
+
+for fileName in *.rc
+do
+  obj_file=../../$OBJ_DIR_NAME/${fileName}.o;
+  if [ $obj_file -nt $fileName ]
+  then
+	echo File "$fileName" is up to date
+  else
+	  echo Building "$fileName";
+	  if `$RC_COMPILER -o $obj_file $fileName `
+	   then
+		 echo Complete
+	   else
+			echo Error during compilation;
+			exit 1;
+	   fi
+  fi
+done
+
+
+cd ../../
+
+echo Linking $TARGET_NAME
+echo $COMPILER $COMPILER_LINK_FLAGS -o $TARGET_NAME $OBJ_DIR_NAME/*.o  $LINKER_FLAGS
+`$COMPILER $COMPILER_LINK_FLAGS -o $TARGET_NAME $OBJ_DIR_NAME/*.o  $LINKER_FLAGS`
+
+echo Finished
+
+
diff --git a/scripts/gtk_build.sh b/scripts/gtk_build.sh
new file mode 100644
index 0000000..02d7ccd
--- /dev/null
+++ b/scripts/gtk_build.sh
@@ -0,0 +1,217 @@
+#!/bin/sh
+
+# MODIFY THESE BASED ON YOUR SYSTEM
+# DEFAULT SETTINGS ARE FOR GCC
+	
+CURL_LINKER_LIBS=" -lssl -lcrypto -lcurl";
+
+COMPILER="g++";
+COMPILERC="gcc";
+sysName=`uname`;
+echo $sysName;
+
+if [ $sysName == "Darwin" ]
+then
+	machName=`machine`;
+	if [ $machName == "ppc7450" ] 
+	then
+		COMPILER_FLAGS=" -w -c -fsigned-char -fast -mcpu=7450 -fpermissive -I`pwd`/GUI -I`pwd`/Source -I`pwd`/Source/SQLite -D INTPTR_TYPE=long `pkg-config gtk+-2.0 --cflags`  -D GDK_PIXBUF_ENABLE_BACKEND -D __HYPHY_GTK__ "
+	else
+		COMPILER_FLAGS=" -w -c -fsigned-char -fast -fpermissive -I`pwd`/GUI -I`pwd`/Source -I`pwd`/Source/SQLite -D INTPTR_TYPE=long `pkg-config gtk+-2.0 --cflags`  -D GDK_PIXBUF_ENABLE_BACKEND  -D __HYPHY_GTK__ "
+	fi
+	COMPILER_LINK_FLAGS=" -w -fsigned-char -D __HYPHY_GTK__ -D GDK_PIXBUF_ENABLE_BACKEND ";
+else
+	COMPILER_LINK_FLAGS=" -w -fsigned-char ";
+	COMPILER_FLAGS=" -w -c -O3 -D INTPTR_TYPE=long -fsigned-char -fpermissive -I`pwd`/GUI -I`pwd`/Source -I`pwd`/Source/SQLite `pkg-config gtk+-2.0 --cflags`  -D GDK_PIXBUF_ENABLE_BACKEND -D __HYPHY_GTK__ -D _SLKP_LFENGINE_REWRITE_ ";
+fi
+
+echo "Checking for curl";
+echo -e "#include <curl/curl.h>\nint main(void) {return 0;}" > curl_check.cpp
+
+if `$COMPILER -o curl_check -w $CURL_LINKER_LIBS curl_check.cpp`
+then
+ echo "Curl seems to be present"
+else
+	echo "Curl seems to be absent (setting up compiler options skip CURL code)";
+	CURL_LINKER_LIBS="";
+	COMPILER_FLAGS=$COMPILER_FLAGS" -D__HYPHY_NO_CURL__";
+	COMPILER_LINK_FLAGS=$COMPILER_LINK_FLAGS" -D__HYPHY_NO_CURL__";
+fi
+
+rm -rf curl_check.*
+
+# END MODIFY
+
+
+TARGET_NAME="BLANK"
+
+if [ $# -ne 1 ]
+then
+	TARGET_NAME="HELP";
+else
+	if [ $1 != "SP" -a $1 != "MP" -a $1 != "MP2"  -a $1 != "MPI" -a $1 != "DEBUG" ] 
+	then
+		TARGET_NAME="HELP"
+	else
+		TARGET_NAME=$1
+	fi
+fi
+
+if [ $TARGET_NAME = "HELP" ] 
+then
+	echo "Usage: build.sh package_name"
+	echo "  where package_name is one of the following:"
+	echo "  SP : for a single threaded build"
+	echo "  MP : for a multi-threaded build with pthreads."
+	echo "  MP2 : for a multi-threaded build with pthreads which support setconcurrency function."
+	echo "  MPI : for a single-threaded build with MPI message passing support."
+	echo "  DEBUG: single threaded debug version."
+	exit 1
+fi
+	
+
+OBJ_DIR_NAME="objGTK_$TARGET_NAME"
+
+if [ -f $OBJ_DIR_NAME ] 
+then
+	rm -rf $OBJ_DIR_NAME;
+fi
+
+if [ -f $OBJ_DIR_NAME ] 
+then
+	echo "Insufficient permissions to create an object directory";
+	exit 1;
+fi
+
+if [ ! -d $OBJ_DIR_NAME  ]
+then
+	if [ `mkdir $OBJ_DIR_NAME` ]
+	then
+		echo "Failed to create object directory";
+		exit 1;
+	fi
+fi
+
+if [ $1 = "SP" ] 
+then
+	TARGET_NAME="HYPHY_GTK";
+	LINKER_FLAGS=$CURL_LINKER_LIBS" -lm ";
+	echo "+--------------------------------------+"
+	echo "|Building a single threaded HYPHYKernel|"
+	echo "+--------------------------------------+"
+fi
+
+if [ $1 = "MP" ] 
+then
+	TARGET_NAME="HYPHYMP_GTK";
+	LINKER_FLAGS=$CURL_LINKER_LIBS" -lm -lpthread ";
+	echo "+---------------------------------------+"
+	echo "|Building a multi-threaded HYPHYKernelMP|"
+	echo "+---------------------------------------+"
+	COMPILER_FLAGS=$COMPILER_FLAGS" -D __MP__ "
+fi
+
+if [ $1 = "MP2" ] 
+then
+	TARGET_NAME="HYPHYMP_GTK";
+	LINKER_FLAGS=$CURL_LINKER_LIBS" -lm -lpthread -fopenmp ";
+	echo "+-----------------------------------------------------------+"
+	echo "|Building a multi-threaded HYPHYKernelMP with setconcurrency|"
+	echo "+-----------------------------------------------------------+"
+	COMPILER_FLAGS=$COMPILER_FLAGS" -D __MP__ -D __MP2__ -fopenmp "
+fi
+
+if [ $1 = "MPI" ] 
+then
+	TARGET_NAME="HYPHYMPI_GTK";
+	LINKER_FLAGS=$CURL_LINKER_LIBS" -lm -lmpich ";
+	echo "+-----------------------------------------------------------+"
+	echo "|Building a single-threaded HYPHYKernelMPI for MPI          |"
+	echo "+-----------------------------------------------------------+"
+	COMPILER_FLAGS=$COMPILER_FLAGS" -D __HYPHYMPI__ "
+fi
+
+if [ $1 = "DEBUG" ]
+then
+        TARGET_NAME="HYPHYDebug";
+        LINKER_FLAGS=" -lssl -lcrypto -lcurl -lm";
+        echo "+---------------------------------------+"
+        echo "|Building a debug version HYPHYDebug    |"
+        echo "+---------------------------------------+"
+        (echo "#define __HYPHY_GTK__") | cat > Source/platform.h
+        COMPILER_FLAGS=" -w -c -g -fpermissive ";
+fi
+
+echo "COMPILER=$COMPILER, $COMPILERC";
+echo "COMPILER_FLAGS=$COMPILER_FLAGS";
+
+cd Source
+
+for fileName in *.cpp main*GTK.cxx
+do
+  obj_file=../$OBJ_DIR_NAME/${fileName}.o;
+  if [ $obj_file -nt $fileName ]
+  then
+  	echo File "$fileName" is up to date
+  else
+	  echo Building "$fileName";
+	  if `$COMPILER -o $obj_file $COMPILER_FLAGS $fileName `
+	   then
+      	 echo Complete
+	   else
+	  		echo Error during compilation;
+	  		exit 1;
+	   fi
+  fi
+done
+
+cd SQLite
+
+for fileName in *.c
+do
+  obj_file=../../$OBJ_DIR_NAME/${fileName}.o;
+  if [ $obj_file -nt $fileName ]
+  then 
+  	echo SQLite File "$fileName" is up to date
+  else
+	  echo Building "SQLite file $fileName";
+	  if `$COMPILERC -o $obj_file $COMPILER_FLAGS $fileName `
+	   then
+	                echo Complete
+	   else
+	                echo Error during compilation;
+	                exit 1;
+	   fi
+  fi
+done
+
+cd "../../GUI/"
+
+for fileName in *.cpp
+do
+  obj_file=../$OBJ_DIR_NAME/${fileName}.o;
+  if [ $obj_file -nt $fileName ]
+  then
+  	echo File "$fileName" is up to date
+  else
+	  echo Building "$fileName";
+	  if `$COMPILER -o $obj_file $COMPILER_FLAGS $fileName `
+	   then
+      	 echo Complete
+	   else
+	  		echo Error during compilation;
+	  		exit 1;
+	   fi
+  fi
+done
+
+cd ..
+
+echo Linking $TARGET_NAME
+GTK_LIBS=`pkg-config gtk+-2.0 --libs`;
+echo $GTK_LIBS $LINKER_FLAGS
+`$COMPILER $COMPILER_LINK_FLAGS -o $TARGET_NAME $OBJ_DIR_NAME/*.o  $GTK_LIBS $LINKER_FLAGS`
+echo Finished
+
+
+
diff --git a/scripts/intelCCbuild.sh b/scripts/intelCCbuild.sh
new file mode 100644
index 0000000..58b830a
--- /dev/null
+++ b/scripts/intelCCbuild.sh
@@ -0,0 +1 @@
+export cwd=`pwd`; icc -D _SLKP_LFENGINE_REWRITE_ -D __UNIX__ -w -o HYPHYMPICC -msse3 -mdynamic-no-pic -O3 -no-prec-div -fpermissive -I$cwd/Source -$cwd/Source/SQLite -D INTPTR_TYPE=long -openmp  -D __MP__ -D __MP2__ -unroll4 Source/*cpp Source/SQLite/*.c Source/main-unix.cxx -lssl -lcrypto -lcurl -lm
diff --git a/src/core/_hyExecutionContext.cpp b/src/core/_hyExecutionContext.cpp
new file mode 100644
index 0000000..86a72c2
--- /dev/null
+++ b/src/core/_hyExecutionContext.cpp
@@ -0,0 +1,73 @@
+/*
+
+HyPhy - Hypothesis Testing Using Phylogenies.
+
+Copyright (C) 1997-2009
+  Sergei L Kosakovsky Pond (spond at ucsd.edu)
+  Art FY Poon              (apoon at cfenet.ubc.ca)
+
+Permission is hereby granted, free of charge, to any person obtaining a
+copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be included
+in all copies or substantial portions of the Software.
+
+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.
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+*/
+
+#include "_hyExecutionContext.h"
+#include "variablecontainer.h"
+#include "hy_strings.h"
+
+_hyExecutionContext _hyDefaultExecutionContextAux (nil, nil),
+                    *_hyDefaultExecutionContext = &_hyDefaultExecutionContextAux;
+
+//_____________________________________________________________
+
+_hyExecutionContext::_hyExecutionContext (_VariableContainer *context, _String* errorBuffer) {
+    contextSpec = context;
+    errMsg      = errorBuffer;
+}
+
+//_____________________________________________________________
+
+_VariableContainer* _hyExecutionContext::GetContext (void) {
+    return contextSpec;
+}
+
+//_____________________________________________________________
+
+_String * _hyExecutionContext::GetErrorBuffer (void) {
+    return errMsg;
+}
+
+//_____________________________________________________________
+
+void _hyExecutionContext::ReportError (_String errText) {
+    if (errMsg) {
+        *errMsg = *errMsg & errText & ".\n";
+    } else {
+        WarnError (errText);
+    }
+    
+}
+
+//_____________________________________________________________
+//EOF
+
+
+
+
+
diff --git a/src/core/alignment.cpp b/src/core/alignment.cpp
new file mode 100644
index 0000000..0bd60fa
--- /dev/null
+++ b/src/core/alignment.cpp
@@ -0,0 +1,1640 @@
+
+#include <cctype>
+#include <cstring>
+
+#include "alignment.h"
+
+//____________________________________________________________________________________
+
+// match or skip whole codons
+#define HY_111_111 0
+#define HY_111_000 1
+#define HY_000_111 2
+
+// match 3 in the ref to 1 in the query
+#define HY_111_100 3
+#define HY_111_010 4
+#define HY_111_001 5
+
+#define HY_3X1_START 3
+#define HY_3X1_COUNT 3
+
+// match 3 in the ref to 2 in the query
+#define HY_111_110 6
+#define HY_111_101 7
+#define HY_111_011 8
+
+#define HY_3X2_START 6
+#define HY_3X2_COUNT 3
+
+// match 3 in the ref to 4 in the query
+#define HY_1110_1111 9
+#define HY_1101_1111 10
+#define HY_1011_1111 11
+#define HY_0111_1111 12
+
+#define HY_3X4_START 9
+#define HY_3X4_COUNT 4
+
+// match 3 in the ref to 5 in the query
+#define HY_11100_11111 13
+#define HY_11010_11111 14
+#define HY_11001_11111 15
+#define HY_10110_11111 16
+#define HY_10101_11111 17
+#define HY_10011_11111 18
+#define HY_01110_11111 19
+#define HY_01101_11111 20
+#define HY_01011_11111 21
+#define HY_00111_11111 22
+
+
+// the local align move (i.e. take a direct shortcut to any internal position in the alignment matrix)
+#define HY_LOCAL_ALIGN_SHORTCUT 23
+
+#define HY_3X5_START   13
+#define HY_3X5_COUNT   10
+
+#define HY_ALIGNMENT_TYPES_COUNT 24
+
+//____________________________________________________________________________________
+
+long CodonAlignStringsStep( double * const score_matrix
+                          , long * const reference
+                          , long * const query
+                          , const long r
+                          , const long q
+                          , const long score_cols
+                          , const long char_count
+                          , const double miscall_cost
+                          , const double open_insertion
+                          , const double open_deletion
+                          , const double extend_insertion
+                          , const double extend_deletion
+                          , double * const cost_matrix
+                          , const long cost_stride
+                          , double * const insertion_matrix
+                          , double * const deletion_matrix
+                          , double * const codon3x5
+                          , double * const codon3x4
+                          , double * const codon3x2
+                          , double * const codon3x1
+                          , const    bool  do_local
+                          )
+{
+    /**
+     * r is CODON position in the reference,
+     * q is NUC position in the query,
+     * curr is a pointer to the current position in the scoring matrix,
+     * prev is a pointer to the previous CODON in the scoring matrix
+     * NOTE: moving by score_cols in the scoring matrix changes the CODON
+     *       position in the scoring matrix, as we're only interested in CODON
+     *       alignments to the reference
+     * rpos is the position of r in the reference
+     * do_local is true if we wish to perform a local alignment 
+     */
+    const long curr = ( r - 0 ) * score_cols + q, // where we currently are
+               prev = ( r - 1 ) * score_cols + q, // up a codon in the reference
+               offset3x5 = HY_3X5_COUNT * char_count * char_count * char_count, // both 3x5 and 3x4 are
+               offset3x4 = HY_3X4_COUNT * char_count * char_count * char_count, // full codons
+               offset3x2 = HY_3X2_COUNT * char_count * char_count,
+               offset3x1 = HY_3X1_COUNT * char_count,
+               rpos = r * 3; // the real position in R
+    // mutable vars
+    long r_codon = -1,
+         q_codon = -1,
+         best_choice = 0,
+         i, choice, partial_codons[ 10 ]; // we need to multiply by 3 to get the NUC position
+    // 3x5 codon specifications (negative indices)
+    long codon_spec_3x5[ 10 ][ 3 ] = {
+        { 5, 4, 3 }, // 11100
+        { 5, 4, 2 }, // 11010
+        { 5, 4, 1 }, // 11001
+        { 5, 3, 2 }, // 10110
+        { 5, 3, 1 }, // 10101
+        { 5, 2, 1 }, // 10011
+        { 4, 3, 2 }, // 01110
+        { 4, 3, 1 }, // 01101
+        { 4, 2, 1 }, // 01011
+        { 3, 2, 1 }  // 00111
+    };
+    // 3x4 codon specifications (negative indices)
+    long codon_spec_3x4[ 4 ][ 3 ] = {
+        { 4, 3, 2 }, // 1110
+        { 4, 3, 1 }, // 1101
+        { 4, 2, 1 }, // 1011
+        { 3, 2, 1 }  // 0111
+    };
+
+    int    local_shortcut_came_from_this_move = -1;
+
+    double choices[ HY_ALIGNMENT_TYPES_COUNT ],
+           max_score = -A_LARGE_NUMBER,
+           penalty;
+
+    // store the scores of our choices in choices,
+    // pre-initialize to -infinity
+    for ( i = 0; i < HY_ALIGNMENT_TYPES_COUNT; i++ ) {
+        choices[ i ] = -A_LARGE_NUMBER;
+    }
+    
+    // if we're at least a CODON away from the edge...
+    // (psst, r is CODONs remember?)
+    if ( r >= 1 ) {
+        // if we're doing affine gaps (deletions)
+        if ( deletion_matrix ) {
+            choices[ HY_111_000 ] = MAX(
+                score_matrix[ prev ] - open_deletion,
+                deletion_matrix[ prev ] - ( r > 1 ? extend_deletion : open_deletion )
+            );
+            deletion_matrix[ curr ] = choices[ HY_111_000 ];
+        } else {
+            choices[ HY_111_000 ] = score_matrix[ prev ] - open_deletion;
+        }
+
+        r_codon = ( reference[ rpos - 3 ]   * char_count
+                  + reference[ rpos - 2 ] ) * char_count
+                  + reference[ rpos - 1 ] ;
+
+        if ( r_codon < 0 ) {
+            r_codon = cost_stride - 1;
+        }
+    }
+
+    // if we're at least 1 codon away from the edge
+    if ( q >= 3 ) {
+        // if we're doing affine gaps (insertions)
+        if ( insertion_matrix ) {
+            choices[ HY_000_111 ] = MAX(
+                score_matrix[ curr - 3 ] - open_insertion,
+                insertion_matrix[ curr - 3 ] - ( q > 3 ? extend_insertion : open_insertion )
+            );
+            insertion_matrix[ curr ] = choices[ HY_000_111 ];
+        } else {
+            choices[ HY_000_111 ] = score_matrix[ curr - 3 ] - open_insertion;
+        }
+
+        q_codon = ( query[ q - 3 ]   * char_count
+                  + query[ q - 2 ] ) * char_count
+                  + query[ q - 1 ] ;
+
+        if ( q_codon < 0 ) {
+            q_codon = cost_stride - 1;
+        }
+    }
+
+    // if q_codon and r_codon both exist, set the score equal to match
+    if ( q_codon >= 0 ) {
+        if ( r_codon >= 0 ) {
+            const double move_cost = cost_matrix[ r_codon * cost_stride + q_codon ];
+            choices[ HY_111_111 ] = score_matrix[ prev - 3 ] + move_cost;
+            if (do_local && choices [HY_LOCAL_ALIGN_SHORTCUT] < move_cost) {
+                local_shortcut_came_from_this_move = HY_111_111;
+                choices [HY_LOCAL_ALIGN_SHORTCUT]  = move_cost;
+            }
+        }
+    }
+
+    // we disallow partial moves in the reference, so those used to be here but are now gone
+
+    // HERE BE DRAGONS!!!!
+
+    // miscall matches, starting with 3x5, then 3x4, then 3x2, finally 3x1
+    if ( r_codon >= 0 ) {
+        // 3x5 partial codons
+        if ( q >= 5 ) {
+            // fill in the partial codons table
+            // use a 10x1 array to allow for load hoisting,
+            // we don't want to be bouncing cachelines in this critical inner loop
+            for ( i = 0; i < HY_3X5_COUNT; ++i ) {
+                partial_codons[ i ] = ( query[ q - codon_spec_3x5[ i ][ 0 ] ]   * char_count
+                                      + query[ q - codon_spec_3x5[ i ][ 1 ] ] ) * char_count
+                                      + query[ q - codon_spec_3x5[ i ][ 2 ] ] ;
+            }
+            // go over each choice, fill it in
+            for ( i = 0; i < HY_3X5_COUNT; ++i ) {
+                if ( partial_codons[ i ] >= 0 ) {
+                    choice = HY_3X5_START + i;
+                    // if we have a double ragged edge, don't penalize
+                    if ( ( q == 5              && choice == HY_00111_11111 )
+                      || ( q == score_cols - 1 && choice == HY_11100_11111 ) )
+                        penalty = 0.;
+                    // if we have a single ragged edge, penalize by a single miscall
+                    // we don't have to worry about specifying each case here,
+                    // as the 00111_11111 case takes preference above,
+                    // so we don't have to explicitly avoid it
+                    else if ( q == 5 && choice >= HY_01110_11111 )
+                        penalty = miscall_cost;
+                    // if we have a single ragged edge, penalize by a single miscall
+                    // unfortunately these cases are spread out,
+                    // so we have to enumerate them explicitly here
+                    else if ( q == score_cols - 1
+                           && ( choice == HY_11010_11111
+                             || choice == HY_10110_11111
+                             || choice == HY_01110_11111 ) )
+                        penalty = miscall_cost;
+                    // if we don't fit into any of these special cases,
+                    // the miscall penalty is double (as we're matching 3 to 5)
+                    else
+                        penalty = 2. * miscall_cost;
+                        
+                    const double move_cost = codon3x5[ r_codon * offset3x5 + HY_3X5_COUNT * partial_codons[ i ] + i ];
+                    
+                    choices[ choice ] = score_matrix[ prev - 5 ] - penalty + move_cost;
+                    if (do_local && choices [HY_LOCAL_ALIGN_SHORTCUT] < move_cost) {
+                        local_shortcut_came_from_this_move = choice;
+                        choices [HY_LOCAL_ALIGN_SHORTCUT]  = move_cost;
+                    }
+                }
+            }
+        }
+
+        // 3x4 partial codons
+        if ( q >= 4 ) {
+            // fill in partial codons table
+            for ( i = 0; i < HY_3X4_COUNT; ++i ) {
+                partial_codons[ i ] = ( query[ q - codon_spec_3x4[ i ][ 0 ] ]   * char_count
+                                      + query[ q - codon_spec_3x4[ i ][ 1 ] ] ) * char_count
+                                      + query[ q - codon_spec_3x4[ i ][ 2 ] ] ;
+            }
+            // fill in choices
+            for ( i = 0; i < HY_3X4_COUNT; ++i ) {
+                if ( partial_codons[ i ] >= 0 ) {
+                    choice = HY_3X4_START + i;
+                    // if we have a ragged edge,
+                    // penalize it not at all
+                    if ( ( q == 4              && choice == HY_0111_1111 )
+                      || ( q == score_cols - 1 && choice == HY_1110_1111 ) )
+                        penalty = 0.;
+                    // otherwise it's just a single miscall penalty
+                    else
+                        penalty = miscall_cost;
+
+                    const double move_cost = codon3x4[ r_codon * offset3x4 + HY_3X4_COUNT * partial_codons[ i ] + i ];
+
+                    choices[ choice ] = score_matrix[ prev - 4 ] - penalty + move_cost;
+                    if (do_local && choices [HY_LOCAL_ALIGN_SHORTCUT] < move_cost) {
+                        local_shortcut_came_from_this_move = choice;
+                        choices [HY_LOCAL_ALIGN_SHORTCUT]  = move_cost;
+                    }
+                }
+            }
+        }
+
+        // 3x2
+        if ( q >= 2 ) {
+            // only a single partial codon
+            partial_codons[ 0 ] = query[ q - 2 ] * char_count
+                                + query[ q - 1 ] ;
+            // fill in choices
+            if ( partial_codons[ 0 ] >= 0 ) {
+                for ( i = 0; i < HY_3X2_COUNT; ++i ) {
+                    choice = HY_3X2_START + i;
+                    // if we have a ragged edge at the beginning or end,
+                    // respectively, don't penalize it
+                    if ( ( q == 2              && choice == HY_111_011 )
+                      || ( q == score_cols - 1 && choice == HY_111_110 ) )
+                        penalty = 0.;
+                    // otherwise it's just a single miscall penalty
+                    else
+                        penalty = miscall_cost;
+                        
+                                                                
+                    const double move_cost = codon3x2[ r_codon * offset3x2 + HY_3X2_COUNT * partial_codons[ 0 ] + i ];
+
+                    choices[ choice ] = score_matrix[ prev - 2 ] - penalty + move_cost;
+                    if (do_local && choices [HY_LOCAL_ALIGN_SHORTCUT] < move_cost) {
+                        local_shortcut_came_from_this_move = choice;
+                        choices [HY_LOCAL_ALIGN_SHORTCUT]  = move_cost;
+                    }
+                }
+            }
+        }
+
+        // 3x1
+        if ( q >= 1 ) {
+            // only a single partial codon
+            partial_codons[ 0 ] = query[ q - 1 ];
+            // fill in choices
+            if ( partial_codons[ 0 ] >= 0 ) {
+                for ( i = 0; i < HY_3X1_COUNT; ++i ) {
+                    choice = HY_3X1_START + i;
+                    // if we have a double ragged edge,
+                    // don't enforce a miscall penalty
+                    if ( ( q == 1              && choice == HY_111_001 )
+                      || ( q == score_cols - 1 && choice == HY_111_100 ) )
+                        penalty = 0.;
+                    // if we have a single ragged edge,
+                    // enforce only a single miscall penalty
+                    else if ( ( q == 1              && choice == HY_111_010 )
+                           || ( q == score_cols - 1 && choice == HY_111_010 ) )
+                        penalty = miscall_cost;
+                    // otherwise we need a double miscall penalty,
+                    // for the two positions we're inserting
+                    else
+                        penalty = 2. * miscall_cost;
+
+                    const double move_cost = codon3x1[ r_codon * offset3x1 + HY_3X1_COUNT * partial_codons[ 0 ] + i ];
+
+                    choices[ choice ] = score_matrix[ prev - 1 ] - penalty + move_cost;
+                    if (do_local && choices [HY_LOCAL_ALIGN_SHORTCUT] < move_cost) {
+                        local_shortcut_came_from_this_move = choice;
+                        choices [HY_LOCAL_ALIGN_SHORTCUT]  = move_cost;
+                    }
+                }
+            }
+        }
+    }
+
+    // find the best possible choice
+    for ( i = 0; i < HY_ALIGNMENT_TYPES_COUNT - (!do_local); ++i ) {
+        /* if ( i > 0 )
+         fprintf( stderr, ", " );
+         fprintf( stderr, "( %ld, %.3g )", i, choices[ i ] ); */
+        if ( choices[ i ] > max_score ) {
+            best_choice = i;
+            max_score = choices[ i ];
+        }
+    }
+    
+    //fprintf( stderr, "\nscore: %.3g best: %ld\n", max_score, best_choice );
+
+    // assign the score to the current position
+    score_matrix[ curr ] = max_score;
+
+    if (do_local && best_choice == HY_LOCAL_ALIGN_SHORTCUT) {
+        return -local_shortcut_came_from_this_move - 1;
+    }
+    return best_choice;
+}
+
+//____________________________________________________________________________________
+
+inline void BacktrackAlign( signed char * const edit_ops
+                          , long & edit_ptr
+                          , long & r
+                          , long & q
+                          , double deletion
+                          , double insertion
+                          , double match
+                          )
+{
+    if ( match >= deletion && match >= insertion ) {
+        --r;
+        --q;
+        edit_ops[ edit_ptr++ ] = 0;
+    } else if ( deletion >= insertion ) {
+        --r;
+        edit_ops[ edit_ptr++ ] = -1;
+    } else {
+        --q;
+        edit_ops[ edit_ptr++ ] = 1;
+    }
+}
+
+//____________________________________________________________________________________
+
+inline void BacktrackAlignCodon( signed char * const edit_ops
+                               , long & edit_ptr
+                               , long & r
+                               , long & q
+                               , const long code
+                               )
+{
+    long r_str[ 5 ] = { 0, 0, 0, 0, 0 },
+         q_str[ 5 ] = { 0, 0, 0, 0, 0 },
+         idx         = 2;
+
+    bool frameshift = true;
+
+    switch ( code ) {
+    // match
+    case HY_111_111:
+        r_str[0] = r_str[1] = r_str[2] = 1;
+        q_str[0] = q_str[1] = q_str[2] = 1;
+        frameshift = false;
+        break;
+
+    // deletion
+    case HY_111_000:
+        r_str[0] = r_str[1] = r_str[2] = 1;
+        frameshift = false;
+        break;
+
+    // insertion
+    case HY_000_111:
+        q_str[0] = q_str[1] = q_str[2] = 1;
+        frameshift = false;
+        break;
+
+    // 3x2
+    case HY_111_110:
+        r_str[0] = r_str[1] = r_str[2] = 1;
+        q_str[0] = q_str[1] = 1;
+        break;
+    case HY_111_101:
+        r_str[0] = r_str[1] = r_str[2] = 1;
+        q_str[0] = q_str[2] = 1;
+        break;
+    case HY_111_011:
+        r_str[0] = r_str[1] = r_str[2] = 1;
+        q_str[1] = q_str[2] = 1;
+        break;
+
+    // 3x1
+    case HY_111_100:
+        r_str[0] = r_str[1] = r_str[2] = 1;
+        q_str[0] = 1;
+        break;
+    case HY_111_010:
+        r_str[0] = r_str[1] = r_str[2] = 1;
+        q_str[1] = 1;
+        break;
+    case HY_111_001:
+        r_str[0] = r_str[1] = r_str[2] = 1;
+        q_str[2] = 1;
+        break;
+
+    // 3x4
+    case HY_1110_1111:
+        q_str[0] = q_str[1] = q_str[2] = q_str[3] = 1;
+        r_str[0] = r_str[1] = r_str[2] = 1;
+        idx = 3;
+        break;
+    case HY_1101_1111:
+        q_str[0] = q_str[1] = q_str[2] = q_str[3] = 1;
+        r_str[0] = r_str[1] = r_str[3] = 1;
+        idx = 3;
+        break;
+    case HY_1011_1111:
+        q_str[0] = q_str[1] = q_str[2] = q_str[3] = 1;
+        r_str[0] = r_str[2] = r_str[3] = 1;
+        idx = 3;
+        break;
+    case HY_0111_1111:
+        q_str[0] = q_str[1] = q_str[2] = q_str[3] = 1;
+        r_str[1] = r_str[2] = r_str[3] = 1;
+        idx = 3;
+        break;
+
+    // 3x5
+    case HY_11100_11111:
+        q_str[0] = q_str[1] = q_str[2] = q_str[3] = q_str[4] = 1;
+        r_str[0] = r_str[1] = r_str[2] = 1;
+        idx = 4;
+        break;
+    case HY_11010_11111:
+        q_str[0] = q_str[1] = q_str[2] = q_str[3] = q_str[4] = 1;
+        r_str[0] = r_str[1] = r_str[3] = 1;
+        idx = 4;
+        break;
+    case HY_11001_11111:
+        q_str[0] = q_str[1] = q_str[2] = q_str[3] = q_str[4] = 1;
+        r_str[0] = r_str[1] = r_str[4] = 1;
+        idx = 4;
+        break;
+    case HY_10110_11111:
+        q_str[0] = q_str[1] = q_str[2] = q_str[3] = q_str[4] = 1;
+        r_str[0] = r_str[2] = r_str[3] = 1;
+        idx = 4;
+        break;
+    case HY_10101_11111:
+        q_str[0] = q_str[1] = q_str[2] = q_str[3] = q_str[4] = 1;
+        r_str[0] = r_str[2] = r_str[4] = 1;
+        idx = 4;
+        break;
+    case HY_10011_11111:
+        q_str[0] = q_str[1] = q_str[2] = q_str[3] = q_str[4] = 1;
+        r_str[0] = r_str[3] = r_str[4] = 1;
+        idx = 4;
+        break;
+    case HY_01110_11111:
+        q_str[0] = q_str[1] = q_str[2] = q_str[3] = q_str[4] = 1;
+        r_str[1] = r_str[2] = r_str[3] = 1;
+        idx = 4;
+        break;
+    case HY_01101_11111:
+        q_str[0] = q_str[1] = q_str[2] = q_str[3] = q_str[4] = 1;
+        r_str[1] = r_str[2] = r_str[4] = 1;
+        idx = 4;
+        break;
+    case HY_01011_11111:
+        q_str[0] = q_str[1] = q_str[2] = q_str[3] = q_str[4] = 1;
+        r_str[1] = r_str[3] = r_str[4] = 1;
+        idx = 4;
+        break;
+    case HY_00111_11111:
+        q_str[0] = q_str[1] = q_str[2] = q_str[3] = q_str[4] = 1;
+        r_str[2] = r_str[3] = r_str[4] = 1;
+        idx = 4;
+        break;
+    }
+
+    for ( ; idx >= 0 ; --idx ) {
+        if ( r_str[ idx ] ) {
+            if ( q_str[ idx ] ) {
+                --r;
+                --q;
+                edit_ops[ edit_ptr++ ] = 0;
+            } else {
+                --r;
+                edit_ops[ edit_ptr++ ] = -( frameshift ? 2 : 1 );
+            }
+        } else {
+            --q;
+            edit_ops[ edit_ptr++ ] = ( frameshift ? 2 : 1 );
+        }
+    }
+}
+
+
+//____________________________________________________________________________________
+
+inline void MatchScore( char * r_str
+                      , char * q_str
+                      , const long r
+                      , const long q
+                      , long * char_map
+                      , double * cost_matrix
+                      , const long cost_stride
+                      , double & score
+                      )
+{
+    const long r_char = char_map[ r_str[ r - 1 ] ];
+    if ( r_char >= 0 ) {
+        const long q_char = char_map[ q_str[ q - 1 ] ];
+        if ( q_char >= 0 )
+            score += cost_matrix[ r_char * cost_stride + q_char ];
+    }
+}
+
+//____________________________________________________________________________________
+
+double AlignStrings( char * const r_str
+                   , char * const q_str
+                   , char * & r_res
+                   , char * & q_res
+                   , long * const char_map
+                   , double * const cost_matrix
+                   , const long cost_stride
+                   , const char gap
+                   , double open_insertion
+                   , double extend_insertion
+                   , double open_deletion
+                   , double extend_deletion
+                   , double miscall_cost
+                   , const bool do_local
+                   , const bool do_affine
+                   , const bool do_codon
+                   , const long char_count
+                   , double * const codon3x5
+                   , double * const codon3x4
+                   , double * const codon3x2
+                   , double * const codon3x1
+                   , const bool do_true_local
+                   )
+{
+    const unsigned long r_len = strlen( r_str ),
+                        q_len = strlen( q_str ),
+                        ref_stride = ( do_codon ? 3 : 1 ),
+                        score_rows = r_len / ref_stride + 1,
+                        score_cols = q_len + 1;
+
+    long i, j, k, m;
+
+    double score = 0.;
+
+    if ( do_codon && ( r_len % 3 != 0 ) ) {
+        WarnError( "Reference sequence length not divisible by 3 in AlignStrings (codon mode)" );
+        return -A_LARGE_NUMBER;
+    }
+
+    // handle some corner cases,
+    // return early if possible
+    if ( score_rows <= 1 ) {
+        if ( score_cols > 1 ) {
+            r_res = new char[ q_len + 1 ];
+            q_res = new char[ q_len + 1 ];
+            // no ref, just query, which remains untouched
+            memcpy( q_res, q_str, q_len + 1 );
+            // ref full of gaps
+            memset( r_res, gap, sizeof( char ) * q_len );
+            // null terminate
+            r_res[ q_len ] = '\0';
+            q_res[ q_len ] = '\0';
+            // compute score
+            if ( ! do_local ) {
+                if ( do_affine )
+                    score = -open_insertion - ( q_len - 1 ) * extend_insertion;
+                else
+                    score = -open_insertion * q_len;
+            }
+        }
+    } else {
+        if ( score_rows <= 1 ) {
+            r_res = new char[ r_len + 1 ];
+            q_res = new char[ r_len + 1 ];
+            // no query, just ref, which remains untouched
+            memcpy( r_res, r_str, r_len + 1 );
+            // ref full of gaps
+            memset( q_res, gap, sizeof( char ) * r_len );
+            // null terminate
+            r_res[ r_len ] = '\0';
+            q_res[ r_len ] = '\0';
+            // if do local, score is 0
+            if ( ! do_local ) {
+                if ( do_affine )
+                    score = -open_deletion - ( r_len - 1 ) * extend_deletion;
+                else
+                    score = -open_deletion * r_len;
+            }
+        } else {
+            long edit_ptr = 0;
+            // don't forget the optional termination character
+            signed char * const edit_ops = new signed char[ r_len + q_len ];
+
+            double * const score_matrix = new double[ score_rows * score_cols ],
+                   * const insertion_matrix = do_affine ? new double[ score_rows * score_cols ] : NULL,
+                   * const deletion_matrix  = do_affine ? new double[ score_rows * score_cols ] : NULL;
+
+            // encode each string using the character map (char_map)
+            long * const r_enc = new long[ r_len ],
+                 * const q_enc = new long[ q_len ];
+
+            // zero manually, memset not guaranteed to work
+            for ( i = 0; i < score_rows * score_cols; ++i )
+                score_matrix[ i ] = 0.;
+
+            if ( do_codon ) {
+                for ( i = 0; i < r_len; ++i )
+                    r_enc[ i ] = char_map[ r_str[ i ] ];
+                for ( i = 0; i < q_len; ++i )
+                    q_enc[ i ] = char_map[ q_str[ i ] ];
+            }
+
+            if ( do_affine ) {
+                // zero manually, memset not guaranteed to work
+                for ( i = 0; i < score_rows * score_cols; ++i ) {
+                    insertion_matrix[ i ] = 0.;
+                    deletion_matrix[ i ] = 0.;
+                }
+            }
+
+            // pre-initialize the values in the various matrices
+            if ( ! do_local ) {
+                double cost;
+                // initialize gap costs in first column and first row
+                // they are 0 for local alignments, so ignore
+                if ( do_affine ) {
+                    // first handle insertions
+                    cost = -open_insertion;
+
+                    insertion_matrix[ 0 ] = cost;
+
+                    for ( i = 1; i < score_cols; ++i, cost -= extend_insertion ) {
+                        score_matrix[ i ] = cost;
+                        insertion_matrix[ i ] = cost;
+                        deletion_matrix[ i ] = cost;
+                    }
+
+                    // then deletions
+                    cost = -open_deletion;
+
+                    deletion_matrix[ 0 ] = cost;
+
+                    for ( i = score_cols; i < score_rows * score_cols; i += score_cols, cost -= extend_deletion ) {
+                        score_matrix[ i ] = cost;
+                        insertion_matrix[ i ] = cost;
+                        deletion_matrix[ i ] = cost;
+                    }
+                } else {
+                    // handle the do_local, regular (non codon-alignment) case
+                    if ( ! do_codon ) {
+                        cost = -open_insertion;
+                        for ( i = 1; i < score_cols; ++i, cost -= open_insertion )
+                            score_matrix[ i ] = cost;
+
+                        cost = -open_deletion;
+                        for ( i = score_cols; i < score_rows * score_cols; i += score_cols, cost -= open_deletion )
+                            score_matrix[ i ] = cost;
+
+                        // handle the do_local, do_codon case
+                    } else {
+                        cost = -open_insertion;
+                        for ( i = 1; i < score_cols; ++i, cost -= open_insertion )
+                            score_matrix[ i ] = cost - ( i % 3 != 1 ? miscall_cost : 0 );
+
+                        cost = -open_deletion;
+                        for ( i = score_cols, j = 0; i < score_rows * score_cols; i += score_cols, cost -= open_insertion, ++j )
+                            score_matrix[ i ] = cost - ( j % 3 != 0 ? miscall_cost : 0 );
+                    }
+                }
+                // if we're doing a local alignment,
+                // the costs of opening a deletion or an insertion
+                // remain the same no matter how far down the ref or query
+                // we've traveled, respectively
+            } else {
+                if ( do_affine ) {
+                    if ( do_codon ) {
+                        // XXX: should we be including the frameshift penalty here? I think not
+                        // fill in the first row of the affine deletion matrix
+                        // with the deletion cost plus the miscall penalty
+                        for ( i = 1; i < score_cols; ++i )
+                            deletion_matrix[ i ] = -open_deletion - ( i % 3 != 1 ? miscall_cost : 0 );
+
+                        // fill in the first column of the affine insertion matrix
+                        // with the insertion cost plus the miscall penalty
+                        for ( i = score_cols, j = 0; i < score_rows * score_cols; i += score_cols, ++j )
+                            insertion_matrix[ i ] = -open_insertion - ( j % 3 != 0 ? miscall_cost : 0 );
+
+                    } else {
+                        // fill in the first row of the affine deletion matrix
+                        // with the deletion cost
+                        for ( i = 1; i < score_cols; ++i )
+                            deletion_matrix[ i ] = -open_deletion;
+
+                        // fill in the first column of the affine insertion matrix
+                        // with the insertion cost
+                        for ( i = score_cols; i < score_rows * score_cols; i += score_cols )
+                            insertion_matrix[ i ] = -open_insertion;
+                    }
+                }
+            }
+
+            if ( do_codon ) {
+                for ( i = 1; i < score_rows; ++i )
+                    for ( j = 1; j < score_cols; ++j )
+                        CodonAlignStringsStep( score_matrix
+                                             , r_enc
+                                             , q_enc
+                                             , i
+                                             , j
+                                             , score_cols
+                                             , char_count
+                                             , miscall_cost
+                                             , open_insertion
+                                             , open_deletion
+                                             , extend_insertion
+                                             , extend_deletion
+                                             , cost_matrix
+                                             , cost_stride
+                                             , insertion_matrix
+                                             , deletion_matrix
+                                             , codon3x5
+                                             , codon3x4
+                                             , codon3x2
+                                             , codon3x1
+                                             , do_true_local
+                                             );
+                // not doing codon alignment
+            } else {
+                for ( i = 1; i < score_rows; ++i ) {
+                    const long r_char = char_map[ r_str[ i - 1 ] ];
+                    for ( j = 1; j < score_cols; ++j ) {
+                        const long curr = ( i - 0 ) * score_cols + j,
+                        prev = ( i - 1 ) * score_cols + j;
+
+                        // ref but not query is deletion
+                        // query but not ref is insertion
+                        double deletion  = score_matrix[ prev ] - open_deletion,
+                               insertion = score_matrix[ curr - 1 ] - open_insertion,
+                               match     = score_matrix[ prev - 1 ];
+
+                        // if there is a match bonus or penalty, add it in
+                        if ( r_char >= 0 ) {
+                            const long q_char = char_map[ q_str[ j - 1 ] ];
+                            if ( q_char >= 0 ) {
+                                match += cost_matrix[ r_char * cost_stride + q_char ];
+                            }
+                        }
+
+                        // if we're doing affine gaps,
+                        // look up potential moves in the affine gap matrices
+                        if ( do_affine ) {
+                            deletion  = MAX( deletion,
+                                             deletion_matrix[ prev ] - ( i > 1 ? extend_deletion : open_deletion ) ),
+                            insertion = MAX( insertion,
+                                             insertion_matrix[ curr - 1 ] - ( j > 1 ? extend_insertion : open_insertion ) ),
+                            // store the values back in the gap matrices
+                            deletion_matrix[ curr ] = deletion;
+                            insertion_matrix[ curr ] = insertion;
+                        }
+
+                        score_matrix[ curr ] = MAX( match, MAX( deletion, insertion ) );
+                    }
+                }
+            }
+
+            // set these indices to point at the ends
+            // of the ref and query, respectively
+            i = r_len;
+            j = q_len;
+            
+            bool took_local_shortcut = false;
+
+            // grab maximum score from the last entry in the table
+            score = score_matrix[ score_rows * score_cols - 1 ];
+
+            // if we're doing a local alignment,
+            if ( do_true_local) {
+                // find the best score in the matrix
+                // except for the first row/first column 
+                // and start backtracking from there
+                for (m = 1; m < score_rows; m ++)  {
+                    for (k = 1; k < score_cols; k ++) {
+                        if ( score_matrix[ m*score_cols + k ] > score ) {
+                            score = score_matrix[ m*score_cols + k ];
+                            i = ref_stride * m;
+                            j = k;
+                        }
+                    }
+                }
+                               
+            } else 
+                // find the best score in the last row and column of the scoring matrix
+                // and start backtracking from there ( if it's better than the score
+                // we've already found, that is )
+                if ( do_local ) {
+                    // grab the best score from the last column of the score matrix,
+                    // skipping the very last entry ( we already checked it )
+                    for ( k = score_cols - 1; k < score_rows * score_cols - 1; k += score_cols )
+                        if ( score_matrix[ k ] > score ) {
+                            score = score_matrix[ k ];
+                            // if do_codon, k / score_cols indexes into the codon space
+                            // of the reference, which is resolved by multiplication
+                            // by ref_stride ( which is 3 ), otherwise this
+                            // directly indexes into the reference
+                            i = ref_stride * ( k / score_cols );
+                        }
+
+                    // grab the best score from the last row of the score matrix,
+                    // skipping the very last entry ( we already checked it )
+                    for ( k = ( score_rows - 1 ) * score_cols; k < score_rows * score_cols - 1; ++k )
+                        if ( score_matrix[ k ] > score ) {
+                            score = score_matrix[ k ];
+                            // if we've found a better score here,
+                            // don't forget to reset the ref index
+                            i = r_len;
+                            // remove the initial value!
+                            j = k - ( score_rows - 1 ) * score_cols;
+                        }
+
+                    // fill in the edit_ops with the difference
+                    // between r_len and i
+                    for ( k = i; k < r_len; ++k )
+                        edit_ops[ edit_ptr++ ] = -1;
+
+                    // fill in the edit_ops with the difference
+                    // between q_len and j
+                    for ( k = j; k < q_len; ++k )
+                        edit_ops[ edit_ptr++ ] = 1;
+                }
+
+            // backtrack now
+
+            /*
+            // prints the score matrix
+            for ( long m = 0; m < score_rows; ++m ) {
+               for ( long n = 0; n < score_cols; ++n ) {
+                   if ( n > 0 )
+                       fprintf( stderr, "," );
+                   fprintf( stderr, "% 3.3g", score_matrix[ m * score_cols + n ] );
+               }
+               fprintf( stderr, "\n" );
+            }
+            fprintf( stderr, "\n" );
+            */
+
+            if ( do_codon ) {
+                // if either index hits 0, we're done
+                // or if both indices fall below 3, we're done
+                while ( i && j && ( i >= 3 || j >= 3 ) && !took_local_shortcut ) {
+                    // perform a step
+                    long code = CodonAlignStringsStep( score_matrix
+                                                           , r_enc
+                                                           , q_enc
+                                                           // divide by 3 to index into codon space
+                                                           , ( i / 3 )
+                                                           , j
+                                                           , score_cols
+                                                           , char_count
+                                                           , miscall_cost
+                                                           , open_insertion
+                                                           , open_deletion
+                                                           , extend_insertion
+                                                           , extend_deletion
+                                                           , cost_matrix
+                                                           , cost_stride
+                                                           , insertion_matrix
+                                                           , deletion_matrix
+                                                           , codon3x5
+                                                           , codon3x4
+                                                           , codon3x2
+                                                           , codon3x1
+                                                           , do_true_local
+                                                           );
+
+                    // alter edit_ops and decrement i and j
+                    // according to the step k we took
+                    if (do_true_local && code < 0) {
+                         code = -code - 1;
+                         took_local_shortcut = true;
+                    }
+
+                    BacktrackAlignCodon( edit_ops, edit_ptr, i, j, code );
+                    
+
+                    // if anything drops below 0, something bad happened
+                    if ( i < 0 || j < 0 ) {
+                        return -A_LARGE_NUMBER;
+                    }
+
+                    // handle the affine cases
+                    if ( do_affine ) {
+                        // divide by 3 to index into codon space
+                        k = ( i / 3 ) * score_cols + j;
+                        // reference matched but not query, a deletion
+                        if ( code == HY_111_000 ) {
+                            // while deletion is preferential to match
+                            while ( i >= 3
+                                 && score_matrix[ k ] - open_deletion
+                                 <= deletion_matrix[ k ] - extend_deletion ) {
+                                // take a codon out of the reference
+                                i -= 3;
+                                edit_ops[ edit_ptr++ ] = -1;
+                                edit_ops[ edit_ptr++ ] = -1;
+                                edit_ops[ edit_ptr++ ] = -1;
+                                // move up a row in the score_matrix
+                                // which is a codon in the reference
+                                k -= score_cols;
+                            }
+                            // query matched but not reference, insertion
+                        } else if ( code == HY_000_111 ) {
+                            // while insertion is preferential to match
+                            while ( j >= 3
+                                 && score_matrix[ k ] - open_insertion
+                                 <= insertion_matrix[ k ] - extend_insertion ) {
+                                // take a codon out of the query
+                                j -= 3;
+                                edit_ops[ edit_ptr++ ] = 1;
+                                edit_ops[ edit_ptr++ ] = 1;
+                                edit_ops[ edit_ptr++ ] = 1;
+                                // move up 3 in the score_matrix
+                                // which is a codon in the query
+                                k -= 3;
+                            }
+                        }
+                    }
+                }
+            } else {
+                if ( do_affine ) {
+                    while ( i && j ) {
+                        long curr = ( i - 0 ) * score_cols + j,
+                             prev = ( i - 1 ) * score_cols + j,
+                             best_choice = 0;
+
+                        // check the current affine scores and the match score
+                        double scores[ 3 ] = {
+                            deletion_matrix[ curr ],
+                            insertion_matrix[ curr ],
+                            score_matrix[ prev - 1 ]
+                        }, max_score = scores[ best_choice ];
+
+                        MatchScore( r_str, q_str, i, j, char_map, cost_matrix, cost_stride, scores[2] );
+
+                        // look at choice other than 0
+                        for ( k = 1; k < 3; ++k )
+                            if ( scores[ k ] > max_score ) {
+                                max_score = scores[ k ];
+                                best_choice = k;
+                            }
+
+                        switch ( best_choice ) {
+                        case 0:
+                            // we have at least 1 deletion
+                            --i;
+                            edit_ops[ edit_ptr++ ] = -1;
+                            // deletion is travel in the reference but not query,
+                            // look at scores back in the reference,
+                            // and while they are better for the deletion case,
+                            // move backwards in the reference
+                            while ( i
+                                 && score_matrix[ curr - score_cols ] - open_deletion
+                                 <= deletion_matrix[ curr - score_cols ] - extend_deletion
+                                  ) {
+                                --i;
+                                edit_ops[ edit_ptr++ ] = -1;
+                                curr -= score_cols;
+                            }
+                            break;
+
+                        case 1:
+                            // we have at least 1 insertion
+                            --j;
+                            edit_ops[ edit_ptr++ ] = 1;
+                            // insertion is travel in the query but not the reference,
+                            // look at scores back in the query,
+                            // and while they are better than for the insertion case,
+                            // move backwards in the query
+                            while ( j
+                                 && score_matrix[ curr - 1 ] - open_insertion
+                                 <= insertion_matrix[ curr - 1 ] - extend_insertion
+                                  ) {
+                                --j;
+                                edit_ops[ edit_ptr++ ] = 1;
+                                --curr;
+                            }
+                            break;
+
+                        case 2:
+                            // it's a match! move back in both
+                            --i;
+                            --j;
+                            edit_ops[ edit_ptr++ ] = 0;
+                            break;
+                        }
+                    }
+                    // no affine gaps, no codons
+                } else {
+                    while ( i && j ) {
+                        const long curr = ( i - 0 ) * score_cols + j,
+                                   prev = ( i - 1 ) * score_cols + j;
+
+                        double deletion  = score_matrix[ prev ] - open_deletion,
+                               insertion = score_matrix[ curr - 1 ] - open_insertion,
+                               match     = score_matrix[ prev - 1 ];
+
+                        MatchScore( r_str, q_str, i, j, char_map, cost_matrix, cost_stride, match );
+                        BacktrackAlign( edit_ops, edit_ptr, i, j, deletion, insertion, match );
+                    }
+                }
+            }
+
+
+            if (!took_local_shortcut) {
+                // for anything that remains,
+                // don't forget it!!!
+                // reference
+                while ( --i >= 0 )
+                    edit_ops[ edit_ptr++ ] = -1;
+
+                // then query
+                while ( --j >= 0 )
+                    edit_ops[ edit_ptr++ ] = 1;
+            }
+
+            if ( edit_ptr > 0 ) {
+                // reset indices to 0
+                if (!took_local_shortcut){ 
+                    i = j = 0;
+                }
+
+                // rebuild the strings from the edit_ops
+                // with room for the null terminator
+                r_res = new char[ edit_ptr + 1 ];
+                q_res = new char[ edit_ptr + 1 ];
+                for ( --edit_ptr, k = 0; edit_ptr >= 0; --edit_ptr, ++k ) {
+                    switch ( edit_ops[ edit_ptr ] ) {
+                            // match! include characters from both strings
+                        case 0:
+                            r_res[ k ] = r_str[ i++ ];
+                            q_res[ k ] = q_str[ j++ ];
+                            break;
+                            // insertion!
+                        case 1:
+                            r_res[ k ] = gap;
+                            q_res[ k ] = q_str[ j++ ];
+                            break;
+                        case 2:
+                            r_res[ k ] = gap;
+                            q_res[ k ] = tolower( q_str[ j++ ] );
+                            break;
+                        case -1:
+                            r_res[ k ] = r_str[ i++ ];
+                            q_res[ k ] = gap;
+                            break;
+                        case -2:
+                            r_res[ k ] = tolower( r_str[ i++ ] );
+                            q_res[ k ] = gap;
+                            break;
+                    }
+                }
+                // make sure to null-terminate
+                r_res[ k ] = '\0';
+                q_res[ k ] = '\0';
+            }
+
+#ifdef ALIGN_DEBUG
+            _String alignDebug( "alignScoreMatrix" );
+            _Variable * ad = CheckReceptacle( &alignDebug, empty, false );
+            ad->SetValue( score_matrix, true );
+
+            // grab the affine matrices too,
+            // if that's what we're doing
+            if ( do_affine ) {
+                _String alignDebug( "alignScoreMatrixG1" );
+                _Variable * ad = CheckReceptacle( &alignDebug, empty, false );
+                ad->SetValue( insertion_matrix, true );
+                alignDebug = ( "alignScoreMatrixG2" );
+                ad = CheckReceptacle( &alignDebug, empty, false );
+                ad->SetValue( deletion_matrix, true );
+            }
+#endif
+            delete [] edit_ops;
+            delete [] score_matrix;
+
+            if ( do_affine ) {
+                delete [] insertion_matrix;
+                delete [] deletion_matrix;
+            }
+
+            delete [] r_enc;
+            delete [] q_enc;
+        }
+    }
+
+    return score;
+}
+
+//____________________________________________________________________________________
+
+#define _ALIGNMENT_NOLOCAL      0x00
+#define _ALIGNMENT_LOCAL_START  0x01
+#define _ALIGNMENT_LOCAL_END    0x02
+
+//____________________________________________________________________________________
+
+_Parameter   CostOnly   (_String * s1,               // first string
+                         _String * s2,               // second string
+                         long from1,            // start here in string1
+                         long from2,            // start here in string2
+                         long to1,              // up to here in string1 // not inclusive
+                         long to2,              // up to here in string2 // not inclusive
+                         bool rev1,             // reverse string1
+                         bool rev2,             // reverse string2
+                         _SimpleList & cmap,         // char -> position in scoring matrix mapper
+                         _Matrix * ccost,            // NxN matrix of edit distances on characters
+                         _Parameter gopen,          // the cost of opening a gap in sequence 1
+                         _Parameter gextend,        // the cost of extending a gap in sequence 1 (ignored unless doAffine == true)
+                         _Parameter gopen2,         // the cost of opening a gap in sequence 2
+                         _Parameter gextend2,       // the cost of opening a gap in sequence 2   (ignored unless doAffine == true)
+                         bool doLocal,              // ignore prefix and suffix gaps
+                         bool doAffine,             // use affine gap penalties
+                         _Matrix & scoreMatrix,      // where to write the last row of the scoring matrix
+                         _Matrix * gapScore1,       // where to write the last row of open gap in 1st sequence matrix (ignored unless doAffine == true)
+                         _Matrix * gapScore2,       // same but for open gap in 2nd sequence matrix
+                         char secondGap,
+                         char * howAchieved
+                        )
+{
+    _Parameter   score    = 0.;
+
+    long         s1Length = to1-from1,
+    s2Length = to2-from2;
+
+
+    bool         doLocal1S = false,
+    doLocal1E = false,
+    doLocal2S = false,
+    doLocal2E = false;
+
+    if (doLocal) {
+        if (rev1) {
+            doLocal1S = (to1==s1->sLength);
+            doLocal1E = from1 == 0;
+            //doLocal1 = (to1==s1->sLength)*_ALIGNMENT_LOCAL_START + (from1 == 0)*_ALIGNMENT_LOCAL_END;
+        } else {
+            doLocal1E = (to1==s1->sLength);
+            doLocal1S = from1 == 0;
+            //doLocal1 = (from1==0)*_ALIGNMENT_LOCAL_START + (to1==s1->sLength)*_ALIGNMENT_LOCAL_END;
+        }
+        if (rev2) {
+            doLocal2E = from2 == 0;
+            doLocal2S = (to2==s2->sLength);
+            //doLocal2 = (to2==s2->sLength)*_ALIGNMENT_LOCAL_START + (from2 == 0)*_ALIGNMENT_LOCAL_END;
+        } else {
+            doLocal2S = from2 == 0;
+            doLocal2E = (to2==s2->sLength);
+            //doLocal2 = (from2==0)*_ALIGNMENT_LOCAL_START + (to2==s2->sLength)*_ALIGNMENT_LOCAL_END;
+        }
+    }
+
+    if (s1Length)
+        // first string not empty
+    {
+        if (s2Length)
+            // second string not empty
+        {
+            _Parameter          aux2;
+            long                colCount = s2Length+1;
+
+            scoreMatrix.theData[0] = 0.;
+            if (doAffine) {
+                gapScore1->theData[0] = gapScore2->theData[0] = 0.;
+            }
+
+
+            if (doLocal1S == 0) {
+                _Parameter cost = -gopen;
+                if (doAffine) {
+                    for (long k=1; k < colCount; k++, cost-=gextend) {
+                        scoreMatrix.theData[k]  = cost;
+                        gapScore1->theData [k]  = cost;
+                        gapScore2->theData [k]  = cost;
+                    }
+                } else
+                    for (long m=1; m < colCount; m++, cost-=gopen) {
+                        scoreMatrix.theData[m] = cost;
+                    }
+            } else {
+                for (long k=1; k < colCount; k++) {
+                    scoreMatrix.theData[k] = 0.;
+                }
+
+                if (doAffine) {
+                    for (long k=1; k < colCount; k++) {
+                        gapScore1->theData[k] = 0;
+                        gapScore2->theData[k] = -(secondGap==1?gextend2:gopen2);
+                        // prefix gaps in the second sequence
+                    }
+                    gapScore1->theData[0] = -gopen;
+                }
+            }
+
+
+            long mapL = ccost->GetVDim(); // how many valid characters
+
+            if (doAffine) {
+                aux2 = 0.;
+
+                if (doLocal2S == 0) {
+                    gapScore1->theData[0] = gapScore2->theData[0] = -(secondGap==1?gextend2:gopen2);
+                }
+
+                from2 --;
+                from1 --;
+                for (long r=1; r<=s1Length; r++) { // iterate by rows
+                    long      c1 = cmap.lData[s1->sData[rev1?(to1-r):(from1+r)]];
+
+                    if (doLocal2S) {
+                        aux2        = 0.;
+                    } else {
+                        if (r>1) {
+                            aux2         = -((r-2)*gextend2 + (secondGap==1?gextend2:gopen2));
+                        }
+                        scoreMatrix.theData[0] = -((secondGap==1?gextend2:gopen2) + (r-1)*gextend2);
+                    }
+
+                    for (long c=1; c<=s2Length; c++) { // iterate by columns
+                        _Parameter gscore1  ,           // gap in 2nd
+                        gscore2  ,           // gap in 1st
+                        gscore3  = aux2,     // no gap
+                        t;
+
+                        // if secondGap == 2, then we MUST _start_ with a gap in the 2nd sequence
+
+
+                        if (doLocal1E && r == s1Length) {
+                            //gscore2 = MAX(scoreMatrix.theData[c-1],gapScore1->theData[c-1]);
+                            gscore2 = scoreMatrix.theData[c-1];
+                            if (gapScore1->theData[c-1] > gscore2) {
+                                gscore2 = gapScore1->theData[c-1];
+                            }
+                        } else {
+                            gscore2 = scoreMatrix.theData[c-1]-gopen;
+                            t       = gapScore1->theData[c-1]-((c>1)?gextend:gopen);
+                            if (t > gscore2) {
+                                gscore2 = t;
+                            }
+                        }
+
+                        if (doLocal2E && c == s2Length) {
+                            //gscore1 = MAX(scoreMatrix.theData[c],gapScore2->theData[c]);
+                            gscore1 = scoreMatrix.theData[c];
+                            if (gscore1 < gapScore2->theData[c]) {
+                                gscore1 = gapScore2->theData[c];
+                            }
+                        } else {
+                            //gscore1 = MAX(scoreMatrix.theData[c]-gopen2,gapScore2->theData[c]-((r>1)?gextend2:gopen2));
+                            gscore1 = scoreMatrix.theData[c]-gopen2;
+                            t       = gapScore2->theData[c]-((r>1)?gextend2:gopen2);
+                            if (t > gscore1) {
+                                gscore1 = t;
+                            }
+                        }
+                        // either open a new gap from a character; or continue an existing one
+                        // if this is the second row, then we start a gap in the second sequence -|
+
+                        if (c1>=0) {
+                            long       c2 = cmap.lData[s2->sData[rev2?(to2-c):(from2+c)]];
+
+                            if (c2>=0) {
+                                gscore3 += ccost->theData[c1*mapL+c2];
+                            }
+                        }
+
+                        aux2                    = scoreMatrix.theData[c];
+                        char                      option = 0;
+                        t                       = gscore2;
+
+
+                        if (r > 1 || secondGap == 0) {
+                            if (gscore1 > gscore2) {
+                                t = gscore1;
+                                option                 = 1;
+                            }
+                            if (gscore3 > t) {
+                                t                      = gscore3;
+                                option                 = 2;
+                            }
+                        }
+                        scoreMatrix.theData[c] = t;
+                        if (howAchieved) {
+                            howAchieved[c] = option;
+                        }
+
+                        //if (rev2 && secondGap==2 && c == s2Length)
+                        //  gscore1 = MAX(scoreMatrix.theData[c]-gextend2,gapScore2->theData[c]-((r>1)?gextend2:gopen2));
+
+                        gapScore2->theData [c]  = gscore1;
+                        gapScore1->theData [c]  = gscore2;
+
+                    }
+
+                    if (doLocal2S && r < s1Length) {
+                        gapScore1->theData[0]-=gextend2;
+                        gapScore2->theData[0]-=gextend2;
+                    }
+                }
+            } else
+                // populate the cost matrix row by row
+            {
+                aux2 = 0.;
+                for (long r=1; r<=s1Length; r++) {
+                    if (doLocal2S) {
+                        aux2        = 0.;
+                    } else {
+                        scoreMatrix.theData[0] = -(gopen2 * r);
+                        if (r>1) {
+                            aux2         = -((r-1)*gopen2);
+                        }
+                    }
+
+                    //printf ("%d: %g\t", r, scoreMatrix.theData[0]);
+                    long      c1 = cmap.lData[s1->sData[rev1?(to1-r):(from1+r-1)]];
+
+                    for (long c=1; c<=s2Length; c++) {
+                        _Parameter score1 = scoreMatrix.theData[c], // gap in 2nd
+                        score2 = scoreMatrix.theData[c-1],  // gap in 1st
+                        score3 = aux2;
+
+                        if (c < s2Length || doLocal2E == 0) {
+                            score1 -= gopen2;
+                        }
+                        if (r < s1Length || doLocal1E == 0) {
+                            score2 -= gopen;
+                        }
+
+                        if (c1>=0) {
+                            long       c2 = cmap.lData[s2->sData[rev2?(to2-c):(from2+c-1)]];
+
+                            if (c2>=0) {
+                                score3 += ccost->theData[c1*mapL+c2];
+                            }
+                        }
+
+                        aux2                    = scoreMatrix.theData[c];
+                        char                    option = 0;
+                        scoreMatrix.theData[c]  = score1;
+                        if (score2 > score1) {
+                            scoreMatrix.theData[c] = score2;
+                            option                 = 1;
+                        }
+                        if (score3 > scoreMatrix.theData[c]) {
+                            scoreMatrix.theData[c] = score3;
+                            option                 = 2;
+                        }
+                        if (howAchieved) {
+                            howAchieved[c] = option;
+                        }
+                    }
+                    //printf ("\n");
+                }
+
+            }
+            score = scoreMatrix.theData[s2Length];
+        } else { // 2nd string empty
+            if ((doLocal2S || doLocal2E) == false) {
+                if (doAffine) {
+                    score = gopen2+gextend2*s1Length;
+                } else {
+                    score = gopen2 * s1Length;
+                }
+            }
+        }
+    } else // first string empty
+        if (s2Length) { // second string not empty
+            if ((doLocal1S || doLocal1E) == false) {
+                score = -gopen;
+
+                scoreMatrix.theData[0] = 0.0;
+                if (doAffine) {
+                    gapScore1->theData[0] = gapScore2->theData[0] = 0.0;
+                    for (long k = 1; k <= s2Length; k++, score-=gextend) {
+                        scoreMatrix.theData[k] = gapScore1->theData[k] = gapScore2->theData[k] = score;
+                    }
+
+                    score += gextend;
+                } else {
+                    for (long k = 1; k <= s2Length; k++, score-=gopen) {
+                        scoreMatrix.theData[k] = score;
+                    }
+                    score += gopen;
+                }
+            } else {
+                for (long k = 0; k <= s2Length; k++) {
+                    scoreMatrix.theData[k] = 0.;
+                }
+                if (doAffine)
+                    for (long k = 0; k <= s2Length; k++) {
+                        gapScore1->theData[k] = 0.;
+                        gapScore2->theData[k] = 0.;
+                    }
+            }
+
+        }
+
+    return score;
+}
+
+//____________________________________________________________________________________
+
+_Parameter      LinearSpaceAlign (_String *s1,                  // first string
+                                  _String *s2,                      // second string
+                                  _SimpleList& cmap,                // char -> position in scoring matrix mapper
+                                  _Matrix*    ccost,                // NxN matrix of edit distances on characters
+                                  _Parameter gopen,                 // the cost of opening a gap in sequence 1
+                                  _Parameter gextend,               // the cost of extending a gap in sequence 1 (ignored unless doAffine == true)
+                                  _Parameter gopen2,                // the cost of opening a gap in sequence 2
+                                  _Parameter gextend2,              // the cost of opening a gap in sequence 2   (ignored unless doAffine == true)
+                                  bool doLocal,                     // ignore prefix and suffix gaps
+                                  bool doAffine,                    // use affine gap penalties
+                                  _SimpleList& ops,                 // edit operations for the optimal alignment
+                                  _Parameter   scoreCheck,          // check the score of the alignment
+                                  long         from1,
+                                  long         to1,
+                                  long         from2,
+                                  long         to2,
+                                  _Matrix      **buffer,                // matrix storage,
+                                  char         parentGapLink,
+                                  char         *ha
+                                  )
+{
+    if (to2 == from2 || to1 == from1) {
+        return 0;
+    }
+
+    long                    midpoint = (from1 + to1)/2,
+    span     = to2-from2,
+    span1     = to1-from1;
+
+    if                      (span1 > 1) {
+        CostOnly                (s1,s2,from1,from2,midpoint,to2,false,false,cmap,ccost,gopen,gextend,gopen2,gextend2,doLocal,doAffine,*(buffer[0]), buffer[1], buffer[2], parentGapLink>=2, ha);
+        CostOnly                (s1,s2,midpoint,from2,to1,to2,true,true,  cmap,ccost,gopen,gextend,gopen2,gextend2,doLocal,doAffine,*(buffer[3]), buffer[4], buffer[5],   2*(parentGapLink%2), ha+s2->sLength+1);
+    } else {
+        CostOnly                (s1,s2,from1,from2,to1,to2,false,false,cmap,ccost,gopen,gextend,gopen2,gextend2,doLocal,doAffine,*(buffer[0]), buffer[1], buffer[2], (parentGapLink>=2), ha);
+    }
+
+    _Parameter maxScore = -1e100;
+    long       maxIndex = 0;
+    bool       gapLink  = false;
+    char       alignmentKind    = 0;
+
+    _Parameter    gapOffsetScore   = gopen2-gextend2;
+    if (!doAffine) {
+        if (span1 > 1) {
+            for (long k = 0; k <= span; k++) {
+                _Parameter currentScore = buffer[0]->theData[k] + buffer[3]->theData[span-k];
+                if (currentScore > maxScore) {
+                    maxScore = currentScore;
+                    maxIndex = k;
+                }
+            }
+        } else { // handle the case of a single row span correctly
+            for (long k = 0; k <= span; k++) {
+                _Parameter currentScore     = buffer[0]->theData[k];
+
+                if (!doLocal || to1 != s1->sLength) {
+                    currentScore -= gopen*(span-k);
+                }
+
+                if (currentScore > maxScore) {
+                    maxScore        = currentScore;
+                    alignmentKind   = ha[k];
+                    maxIndex = k;
+                }
+            }
+        }
+    } else {
+        if (span1 > 1) {
+            // two cases here: no-gap link
+            // or gap-to-gap link
+
+            for (long k = 0; k <= span; k++) {
+                _Parameter currentScoreNoGap    = buffer[0]->theData[k] + buffer[3]->theData[span-k],
+                currentScoreWithGap2  = buffer[2]->theData[k] + buffer[5]->theData[span-k] + gapOffsetScore;
+
+
+                if (doAffine && (((from1 == 0 || from2==0) && k == 0) || ((to1 == s1->sLength || to2 == s2->sLength) && k == span))) {
+                    currentScoreWithGap2 -= gapOffsetScore;
+                }
+
+                if (currentScoreNoGap > maxScore) {
+                    maxScore = currentScoreNoGap;
+                    maxIndex = k;
+                    gapLink  = false;
+                }
+                if (currentScoreWithGap2 > maxScore) {
+                    maxScore = currentScoreWithGap2;
+                    maxIndex = k;
+                    gapLink  = true;
+                }
+                /*printf ("[%d %d %d %d] (%d) %d %g %g: %g %g / %g %d\n", from1, to1, from2, to2, parentGapLink,  k,
+                 buffer[0]->theData[k],  buffer[3]->theData[span-k], buffer[2]->theData[k],  buffer[5]->theData[span-k],
+                 maxScore, maxIndex);*/
+
+            }
+
+        } else { // handle the case of a single row span correctly
+            if (parentGapLink == 1) {
+                maxIndex      = span;
+                maxScore      = buffer[2]->theData[span];
+                alignmentKind = 1;
+            } else {
+                for (long k = 0; k <= span; k++) {
+                    _Parameter currentScoreNoGap    = buffer[0]->theData[k],
+                    currentScoreWithGap2  = buffer[2]->theData[k];
+
+                    if (!doLocal || to1 != s1->sLength) // indel in sequence 1
+                        if (span-k) {
+                            currentScoreNoGap       -= gopen;
+                            currentScoreWithGap2    -= gopen;
+                            if (span-k>1) {
+                                currentScoreNoGap    -= gextend*(span-k-1);
+                                currentScoreWithGap2 -= gextend*(span-k-1);
+                            }
+                        }
+
+                    /*printf ("[%d %d %d %d] %d %g %g: %g %g / %g %d\n", from1, to1, from2, to2, k,
+                     buffer[0]->theData[k],  buffer[2]->theData[k], currentScoreNoGap, currentScoreWithGap2,
+                     maxScore, maxIndex);*/
+
+                    if (currentScoreNoGap > maxScore) {
+                        maxScore = currentScoreNoGap;
+                        maxIndex = k;
+                        alignmentKind   = ha[k];
+                    }
+                    if (currentScoreWithGap2 > maxScore) {
+                        maxScore = currentScoreWithGap2;
+                        maxIndex = k;
+                        alignmentKind   = 0;
+                    }
+                }
+            }
+        }
+    }
+
+    if (span1 == 1) {
+        if (alignmentKind == 2) {
+            ops.lData[from1+1] = from2+maxIndex-1;
+        } else if (alignmentKind == 0 && maxIndex == 0/*&& to2 == s2->sLength && to1 == s1->sLength*/) {
+            ops.lData[from1+1]  = -3;
+        }
+    } else {
+
+        _Parameter check1 = buffer[0]->theData[maxIndex],
+        check2 = buffer[3]->theData[span-maxIndex];
+
+        if (span1>1) {
+            if (maxIndex > 0) {
+                char gapCode = gapLink;
+                if (parentGapLink >= 2) {
+                    gapCode += 2;
+                }
+                LinearSpaceAlign (s1,s2,cmap,ccost,gopen,gextend,gopen2,gextend2,doLocal,doAffine,ops,check1, from1, midpoint, from2, from2 + maxIndex, buffer, gapCode, ha);
+            } else if (from2 == 0)
+                for (long k = from1; k < midpoint; k++) {
+                    ops.lData[k+1] = -3;
+                }
+
+            if (maxIndex < span) {
+                char gapCode = 2*gapLink;
+                if (parentGapLink % 2 == 1) {
+                    gapCode ++;
+                }
+                LinearSpaceAlign (s1,s2,cmap,ccost,gopen,gextend,gopen2,gextend2,doLocal,doAffine,ops,check2, midpoint, to1, from2 + maxIndex, to2, buffer, gapCode, ha);
+            }
+        }
+    }
+    return maxScore;
+}
diff --git a/src/core/avllist.cpp b/src/core/avllist.cpp
new file mode 100644
index 0000000..f8bebd1
--- /dev/null
+++ b/src/core/avllist.cpp
@@ -0,0 +1,892 @@
+/*
+
+HyPhy - Hypothesis Testing Using Phylogenies.
+
+Copyright (C) 1997-2009
+  Sergei L Kosakovsky Pond (spond at ucsd.edu)
+  Art FY Poon              (apoon at cfenet.ubc.ca)
+
+Permission is hereby granted, free of charge, to any person obtaining a
+copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be included
+in all copies or substantial portions of the Software.
+
+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.
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+_AVLList    structure inspired by the excellent documentation of
+GNU libavl 2.0.1 by Ben Pfaff (http://www.msu.edu/~pfaffben/avl/index.html)
+
+*/
+
+#include "avllist.h"
+#include "hy_strings.h"
+#include "errorfns.h"
+#include "parser.h"
+#include <stdlib.h>
+#include <string.h>
+#include <stdio.h>
+#include <ctype.h>
+#include <math.h>
+#include <limits.h>
+#ifdef    __HYPHYDMALLOC__
+#include "dmalloc.h"
+#endif
+
+//______________________________________________________________
+// AVL Lists
+//______________________________________________________________
+
+_AVLList::_AVLList (_SimpleList* d)
+{
+    dataList = d;
+    root     = -1;
+}
+
+//______________________________________________________________
+
+long  _AVLList::Find (BaseRef obj)
+{
+    long curNode = root;
+
+    while (curNode>=0) {
+        long comp = dataList->Compare (obj,curNode);
+
+        if (comp<0) {
+            curNode = leftChild.lData[curNode];
+        } else if (comp>0) {
+            curNode = rightChild.lData[curNode];
+        } else {
+            return curNode;
+        }
+    }
+
+    return -1;
+}
+
+//______________________________________________________________
+
+long  _AVLList::FindLong (long obj)
+{
+    long curNode = root;
+
+    while (curNode>=0) {
+        long comp = dataList->lData[curNode];
+
+        if (obj<comp) {
+            curNode = leftChild.lData[curNode];
+        } else if (obj>comp) {
+            curNode = rightChild.lData[curNode];
+        } else {
+            return curNode;
+        }
+    }
+
+    return -1;
+}
+
+//______________________________________________________________
+
+char  _AVLList::FindBest (BaseRef obj, long& lastNode)
+{
+    long curNode  = root,
+         comp     = 1;
+
+    while (curNode>=0 && comp) {
+        comp = dataList->Compare (obj,curNode);
+        lastNode = curNode;
+
+        if (comp<0) {
+            curNode = leftChild.lData[curNode];
+        } else if (comp>0) {
+            curNode = rightChild.lData[curNode];
+        } else {
+            return 0;
+        }
+    }
+
+    return comp;
+}
+
+//______________________________________________________________
+
+long  _AVLList::Find (BaseRef obj, _SimpleList& hist)
+{
+    long curNode = root;
+
+    while (curNode>=0) {
+        long comp = dataList->Compare (obj,curNode);
+
+        if (comp<0) {
+            hist << curNode;
+            curNode = leftChild.lData[curNode];
+        } else if (comp>0) {
+            hist << curNode;
+            curNode = rightChild.lData[curNode];
+        } else {
+            return curNode;
+        }
+    }
+
+    return -1;
+}
+
+//______________________________________________________________
+
+long  _AVLList::Next (long d, _SimpleList& hist)
+{
+    if (d >= 0) {
+        if (rightChild.lData [d] >= 0) {
+            hist << d;
+            d = rightChild.lData [d];
+            while (leftChild.lData[d] >= 0) {
+                hist << d;
+                d = leftChild.lData[d];
+            }
+            return d;
+        } else {
+            while (hist.countitems()) {
+                long x = hist.lData[hist.lLength-1];
+
+
+                hist.Delete (hist.lLength-1);
+
+                if (rightChild.lData[x] != d) {
+                    return x;
+                }
+                //TODO:???
+                d = x;
+            }
+
+            return -1;
+        }
+    }
+
+    d = root;
+    while (d >= 0 && leftChild.lData[d] >=0) {
+        d = leftChild.lData[d];
+    }
+
+    return d;
+}
+
+//______________________________________________________________
+
+long  _AVLList::First (void)
+{
+    long   d = root;
+    while (d >= 0 && leftChild.lData[d] >=0) {
+        d = leftChild.lData[d];
+    }
+
+    return d;
+}
+
+//______________________________________________________________
+
+long  _AVLList::Last (void)
+{
+    long   d = root;
+    while (d >= 0 && rightChild.lData[d] >=0) {
+        d = rightChild.lData[d];
+    }
+
+    return d;
+}
+
+//______________________________________________________________
+
+long  _AVLList::GetByIndex (const long theIndex)
+{
+    if (theIndex == 0) {
+        return First();
+    }
+
+    long elementCount = countitems();
+
+    if (theIndex == elementCount - 1) {
+        return Last();
+    }
+
+    if (theIndex > 0 && theIndex < elementCount) {
+        _SimpleList  hist;
+        long         ls,
+                     cn = Traverser (hist,ls,GetRoot()),
+                     counter = 0;
+
+        while (counter < theIndex) {
+            counter ++;
+            cn = Traverser (hist,ls);
+        }
+
+        return cn;
+
+    }
+
+    return -1;
+}
+//______________________________________________________________
+
+long  _AVLList::Prev (long d, _SimpleList& hist)
+{
+    if (d >= 0) {
+        if (leftChild.lData [d] >= 0) {
+            hist << d;
+            d = leftChild.lData [d];
+            while (rightChild.lData[d] >= 0) {
+                hist << d;
+                d = rightChild.lData[d];
+            }
+            return d;
+        } else {
+            while (hist.countitems()) {
+                long x = hist.lData[hist.lLength-1];
+
+                hist.Delete (hist.lLength-1);
+
+                if (leftChild.lData[x] != d) {
+                    return x;
+                }
+                //TODO:???
+                d = x;
+            }
+
+            return -1;
+        }
+    }
+
+    d = root;
+    while (d >= 0 && rightChild.lData[d] >=0) {
+        d = rightChild.lData[d];
+    }
+
+    return d;
+
+}
+
+//______________________________________________________________
+
+void  _AVLList::ReorderList (_SimpleList *s)
+{
+    _SimpleList reorderMe ((unsigned long)(dataList->lLength-emptySlots.lLength+1)),
+                nodeStack ((unsigned long)32);
+
+    long        curNode = root;
+
+    while (1) {
+        while (curNode >= 0) {
+            nodeStack << curNode;
+            curNode = leftChild.lData[curNode];
+        }
+        if (long h = nodeStack.lLength) {
+            h--;
+            curNode = nodeStack.lData[h];
+            if (s) {
+                (*s) << curNode;
+            }
+            reorderMe.InsertElement (((BaseRef*)dataList->lData)[curNode],-1,false,false);
+
+            //TODO:???
+            curNode = rightChild.lData[curNode];
+            nodeStack.Delete (h, false);
+
+        } else {
+            break;
+        }
+    }
+
+    reorderMe.TrimMemory ();
+
+    long* t             = dataList->lData;
+    dataList->lData     = reorderMe.lData;
+    dataList->lLength   = reorderMe.lLength;
+    dataList->laLength  = reorderMe.laLength;
+    reorderMe.lData     = t;
+}
+
+//______________________________________________________________
+
+void  _AVLList::ConsistencyCheck (void)
+{
+    _SimpleList nodeStack ((unsigned long)32);
+
+    long        curNode  = root,
+                lastNode = -1,
+                checkCount = 0;
+
+    while (1) {
+        while (curNode >= 0) {
+            nodeStack << curNode;
+            curNode = leftChild.lData[curNode];
+            if (curNode >= (long)dataList->lLength) {
+                WarnError ("Failed Constistency Check in _AVLList");
+                return;
+            }
+
+        }
+        if (long h = nodeStack.lLength) {
+            if (h>3*log (1.+countitems())) {
+                WarnError ("Failed Constistency Check in _AVLList");
+                return;
+            }
+            h--;
+            curNode = nodeStack.lData[h];
+            if (lastNode >= 0 && curNode >= 0) {
+                if (dataList->Compare (Retrieve (lastNode), curNode) >= 0) {
+                    WarnError ("Failed Constistency Check in _AVLList");
+                    return;
+                }
+                checkCount++;
+            }
+            if ((balanceFactor.lData[curNode] < -1)||(balanceFactor.lData[curNode] > 1)) {
+                WarnError ("Failed Constistency Check in _AVLList");
+                return;
+            }
+            lastNode = curNode;
+            curNode = rightChild.lData[curNode];
+            if (curNode >= (long)dataList->lLength) {
+                WarnError ("Failed Constistency Check in _AVLList");
+                return;
+            }
+            nodeStack.Delete (h, false);
+        } else {
+            break;
+        }
+    }
+
+    if (dataList->lLength && (dataList->lLength > checkCount + 1 + emptySlots.lLength)) {
+        WarnError ("Failed Constistency Check in _AVLList");
+        return;
+    }
+
+}
+
+//______________________________________________________________
+
+long  _AVLList::Traverser (_SimpleList &nodeStack, long& t, long r)
+{
+    if  (r >= 0) {
+        t = r;
+        nodeStack.Clear();
+    }
+
+    while (t >= 0) {
+        nodeStack << t;
+        t = leftChild.lData[t];
+    }
+
+    if (long h = nodeStack.lLength) {
+        h--;
+        t = nodeStack.lData[h];
+        r = t;
+        t = rightChild.lData[t];
+        nodeStack.Delete (h, false);
+        return r;
+    }
+    return -1;
+}
+
+//______________________________________________________________
+
+BaseRef  _AVLList::toStr (void)
+{
+    _String * str = new _String (128L, true);
+    checkPointer (str);
+
+    if (countitems() == 0) {
+        (*str) << "Empty Associative List";
+    } else {
+        _SimpleList  hist;
+        long         ls, cn;
+
+        cn = Traverser (hist,ls,root);
+
+        while (cn>=0) {
+            long keyVal = (long)Retrieve (cn);
+            (*str) << _String(keyVal);
+            (*str) << '\n';
+            cn = Traverser (hist,ls);
+        }
+    }
+
+    str->Finalize();
+    return str;
+}
+
+//______________________________________________________________
+
+BaseRef _AVLList::Retrieve (long idx)
+{
+    return ((BaseRef*)dataList->lData)[idx];
+}
+
+//______________________________________________________________
+
+void _AVLList::Clear (bool cL)
+{
+    if (cL) {
+        ((_List*)dataList)->Clear();
+    } else {
+        dataList->Clear();
+    }
+
+    emptySlots.Clear();
+    root = -1;
+    leftChild.Clear();
+    rightChild.Clear();
+    balanceFactor.Clear();
+}
+
+//______________________________________________________________
+
+long  _AVLList::InsertData (BaseRef b, long, bool)
+{
+    long w = (long)emptySlots.lLength - 1,
+         n;
+
+    if (w>=0) {
+        n = emptySlots.lData[w];
+        emptySlots.Delete (w);
+        leftChild.lData[n] = -1;
+        rightChild.lData[n] = -1;
+        balanceFactor.lData[n] = 0;
+        ((BaseRef*)dataList->lData)[n] = b;
+    } else {
+        n = dataList->lLength;
+        dataList->InsertElement (b,-1,false,false);
+        leftChild  << -1;
+        rightChild << -1;
+        balanceFactor << 0;
+    }
+    return n;
+}
+
+//______________________________________________________________
+
+unsigned long _AVLList::countitems (void)
+{
+    return dataList->lLength - emptySlots.lLength;
+}
+
+//______________________________________________________________
+
+long  _AVLList::Insert (BaseRef b, long xtra,bool cp,bool clear)
+{
+    if (dataList->lLength-emptySlots.lLength) {
+        long        y = root,
+                    z = -1,
+                    p,
+                    q,
+                    n,
+                    w;
+
+        bool        go_right = false;
+
+        _SimpleList da ((unsigned long)32);
+
+        // try to find the node or where to insert it
+
+        for (q=z, p=y; p>=0; q=p, p=go_right?rightChild.lData[p]:leftChild.lData[p]) {
+            long comp = dataList->Compare (b, p);
+            if (comp == 0) {
+                if (cp == false && clear) {
+                    DeleteObject (b);
+                }
+                return -p-1;
+            }
+            if (balanceFactor.lData[p] != 0) {
+                z = q;
+                y = p;
+                da.Clear();
+            }
+            go_right = comp > 0;
+            da << go_right;
+        }
+
+        /*if (da.lLength > 3*log (dataList->lLength+2))
+        {
+            WarnError ("AVLList internal error!");
+            return -1;
+        }*/
+
+        // insert new node
+
+        n = InsertData (b, xtra,cp);
+
+        if (go_right) {
+            rightChild.lData[q] = n;
+        } else {
+            leftChild.lData[q] = n;
+        }
+
+
+        // update balance factors
+
+        p = y;
+
+        for (long k=0; p!=n; p=da.lData[k]?rightChild.lData[p]:leftChild.lData[p],k++)
+            if (da.lData[k] == 0) {
+                balanceFactor.lData[p]--;
+            } else {
+                balanceFactor.lData[p]++;
+            }
+
+
+        //if (z < 0)
+        //{
+        //ConsistencyCheck();
+        //return n;
+        //}
+
+        if (balanceFactor.lData[y] == -2) {
+            //152
+
+            long x = leftChild.lData[y];
+            if (balanceFactor.lData[x] == -1) { //155
+                w                    = x;
+                leftChild.lData [y]  = rightChild.lData[x];
+                rightChild.lData[x]  = y;
+                balanceFactor.lData[x] = balanceFactor.lData[y] = 0;
+            } else { //156
+                w = rightChild.lData[x];
+                rightChild.lData[x] = leftChild.lData[w];
+                leftChild.lData[w] = x;
+                leftChild.lData[y] = rightChild.lData[w];
+                rightChild.lData[w] = y;
+                if (balanceFactor.lData[w] == -1) {
+                    balanceFactor.lData[x] = 0;
+                    balanceFactor.lData[y] = 1;
+                } else if (balanceFactor.lData[w] == 0) {
+                    balanceFactor.lData[x] = 0;
+                    balanceFactor.lData[y] = 0;
+                } else {
+                    balanceFactor.lData[x] = -1;
+                    balanceFactor.lData[y] = 0;
+                }
+
+                balanceFactor.lData[w] = 0;
+            }
+        } else if (balanceFactor.lData[y] == 2) {
+            long x = rightChild.lData[y];
+            if (balanceFactor.lData[x] == 1) {
+                w                      = x;
+                rightChild.lData [y]   = leftChild.lData[x];
+                leftChild.lData[x]     = y;
+                balanceFactor.lData[x] = balanceFactor.lData[y] = 0;
+            } else {
+                w = leftChild.lData[x];
+                leftChild.lData[x] = rightChild.lData[w];
+                rightChild.lData[w] = x;
+                rightChild.lData[y] = leftChild.lData[w];
+                leftChild.lData[w] = y;
+                if (balanceFactor.lData[w] == 1) {
+                    balanceFactor.lData[x] = 0;
+                    balanceFactor.lData[y] = -1;
+                } else if (balanceFactor.lData[w] == 0) {
+                    balanceFactor.lData[x] = 0;
+                    balanceFactor.lData[y] = 0;
+                } else {
+                    balanceFactor.lData[x] = 1;
+                    balanceFactor.lData[y] = 0;
+                }
+
+                balanceFactor.lData[w] = 0;
+            }
+        } else {
+            //ConsistencyCheck ();
+            return n;
+        }
+
+        if (z >= 0) {
+            if (y == leftChild.lData[z]) {
+                leftChild.lData[z] = w;
+            } else {
+                rightChild.lData[z] = w;
+            }
+        }
+
+        if (y==root) {
+            root = w;
+        }
+
+        //ConsistencyCheck ();
+
+        return p;
+    }
+
+    /*dataList->InsertElement (b,-1,false,false);
+    leftChild  << -1;
+    rightChild << -1;
+    balanceFactor << 0;*/
+    root =InsertData (b, xtra,cp);
+
+    return 0;
+
+}
+
+//______________________________________________________________
+
+bool  _AVLList::HasData (long idx)
+{
+    return leftChild.lData[idx] != 2;
+}
+
+//______________________________________________________________
+
+void  _AVLList::Delete (BaseRef b, bool delMe)
+{
+
+    if (root == -1) {
+        return;
+    }
+
+    _SimpleList pa ((unsigned long)64),
+                da ((unsigned long)64);
+
+    long        p = root,
+                cmp = dataList->Compare (b,p),
+                k = 0;
+
+    pa.lData[k] = -1;
+    da.lData[k++] = 1;
+
+    for (; cmp !=0; cmp = dataList->Compare (b,p)) {
+        bool go_right = cmp > 0;
+
+        pa.lData[k] = p;
+        da.lData[k++] = go_right;
+
+        if (go_right) {
+            p = rightChild.lData[p];
+        } else {
+            p = leftChild.lData[p];
+        }
+
+        if (p<0) {
+            return;
+        }
+    }
+
+    if (k==1) {
+        pa.lData[k]   = -1;
+    }
+
+    emptySlots << p;
+    if (delMe) {
+        DeleteObject (Retrieve(p));
+    }
+    //((BaseRef*)dataList->lData)[p] = nil;
+    dataList->lData[p] = 0;
+    DeleteXtra (p);
+
+    long r = rightChild.lData[p];
+
+    if (r < 0) {
+        if (k>1) {
+            if (da.lData[k-1] == 1) {
+                rightChild.lData[pa.lData[k-1]] = leftChild.lData[p];
+            } else {
+                leftChild.lData[pa.lData[k-1]] = leftChild.lData[p];
+            }
+        }
+
+        if (p==root)
+            //root = pa.lData[k-1];
+        {
+            root = leftChild.lData[root];
+        }
+    } else {
+        if (leftChild.lData[r] < 0) {
+            leftChild.lData[r]     = leftChild.lData[p];
+            balanceFactor.lData[r] = balanceFactor.lData[p];
+            if (k>1) {
+                if (da.lData[k-1] == 1) {
+                    rightChild.lData[pa.lData[k-1]] = r;
+                } else {
+                    leftChild.lData[pa.lData[k-1]] = r;
+                }
+            } else {
+                root = r;
+            }
+
+            da.lData[k]   = 1;
+            pa.lData[k++] = r;
+            //if (p==root)
+            //root = r;
+        } else {
+            long s;
+            int  j = k++;
+            for (;;) {
+                da.lData[k]   = 0;
+                pa.lData[k++] = r;
+                s = leftChild.lData[r];
+                if (leftChild.lData[s] < 0) {
+                    break;
+                }
+                r = s;
+            }
+
+
+            leftChild.lData[s] = leftChild.lData[p];
+            leftChild.lData[r] = rightChild.lData[s];
+            rightChild.lData[s] = rightChild.lData[p];
+            balanceFactor.lData[s] = balanceFactor.lData[p];
+
+            if (j>1) {
+                if (da.lData[j-1] == 1) {
+                    rightChild.lData[pa.lData[j-1]] = s;
+                } else {
+                    leftChild.lData[pa.lData[j-1]] = s;
+                }
+            }
+
+            da.lData[j] = 1;
+            pa.lData[j] = s;
+            if (p==root) {
+                root = s;
+            }
+        }
+    }
+
+    //if (k>63)
+    //{
+    //WarnError ("Internal List error");
+    //}
+
+    while (--k > 0) {
+        long y = pa.lData[k];
+        if (da.lData[k] == 0) {
+            balanceFactor.lData[y] ++;
+            if (balanceFactor.lData[y] == 1) {
+                break;
+            } else if (balanceFactor.lData[y] == 2) {
+                long x = rightChild.lData[y];
+                if (balanceFactor.lData[x] == -1) {
+                    long w = leftChild.lData[x];
+                    leftChild.lData[x] = rightChild.lData[w];
+                    rightChild.lData[w] = x;
+                    rightChild.lData[y] = leftChild.lData[w];
+                    leftChild.lData[w] = y;
+                    if (balanceFactor.lData[w] == 1) {
+                        balanceFactor.lData[x] = 0;
+                        balanceFactor.lData[y] = -1;
+                    } else if (balanceFactor.lData[w] == 0) {
+                        balanceFactor.lData[x] = 0;
+                        balanceFactor.lData[y] = 0;
+                    } else {
+                        balanceFactor.lData[x] = 1;
+                        balanceFactor.lData[y] = 0;
+                    }
+
+                    balanceFactor.lData[w] = 0;
+                    if (k>1) {
+                        if (da.lData[k-1] == 1) {
+                            rightChild.lData[pa.lData[k-1]] = w;
+                        } else {
+                            leftChild.lData[pa.lData[k-1]] = w;
+                        }
+                    } else {
+                        root = w;
+                    }
+
+                    //if (y==root)
+                    //  root = w;
+                } else {
+                    rightChild.lData[y] = leftChild.lData[x];
+                    leftChild.lData[x] = y;
+
+                    if (k>1) {
+                        if (da.lData[k-1] == 1) {
+                            rightChild.lData[pa.lData[k-1]] = x;
+                        } else {
+                            leftChild.lData[pa.lData[k-1]] = x;
+                        }
+                    } else {
+                        root = x;
+                    }
+
+                    if (balanceFactor.lData[x] == 0) {
+                        balanceFactor.lData[x] = -1;
+                        balanceFactor.lData[y] = 1;
+                        break;
+                    } else {
+                        balanceFactor.lData[x] = 0;
+                        balanceFactor.lData[y] = 0;
+                    }
+                }
+            }
+        } else {
+            balanceFactor.lData[y] --;
+            if (balanceFactor.lData[y] == -1) {
+                break;
+            } else if ( balanceFactor.lData[y] == -2) {
+                long x = leftChild.lData[y];
+                if (balanceFactor.lData[x] == 1) {
+                    long w = rightChild.lData[x];
+                    rightChild.lData[x] = leftChild.lData[w];
+                    leftChild.lData[w] = x;
+                    leftChild.lData[y] = rightChild.lData[w];
+                    rightChild.lData[w] = y;
+                    if (balanceFactor.lData[w] == -1) {
+                        balanceFactor.lData[x] = 0;
+                        balanceFactor.lData[y] = 1;
+                    } else if (balanceFactor.lData[w] == 0) {
+                        balanceFactor.lData[x] = 0;
+                        balanceFactor.lData[y] = 0;
+                    } else {
+                        balanceFactor.lData[x] = -1;
+                        balanceFactor.lData[y] = 0;
+                    }
+
+                    balanceFactor.lData[w] = 0;
+                    if (k>1) {
+                        if (da.lData[k-1] == 1) {
+                            rightChild.lData[pa.lData[k-1]] = w;
+                        } else {
+                            leftChild.lData[pa.lData[k-1]] = w;
+                        }
+                    } else {
+                        root = w;
+                    }
+
+                    //if (y==root)
+                    //root = w;
+                } else {
+                    leftChild.lData[y] = rightChild.lData[x];
+                    rightChild.lData[x] = y;
+                    if (k>1) {
+                        if (da.lData[k-1] == 1) {
+                            rightChild.lData[pa.lData[k-1]] = x;
+                        } else {
+                            leftChild.lData[pa.lData[k-1]] = x;
+                        }
+                    } else {
+                        root = x;
+                    }
+
+                    if (balanceFactor.lData[x] == 0) {
+                        balanceFactor.lData[x] = 1;
+                        balanceFactor.lData[y] = -1;
+                        break;
+                    } else {
+                        balanceFactor.lData[x] = 0;
+                        balanceFactor.lData[y] = 0;
+                    }
+                }
+            }
+        }
+    }
+    //ConsistencyCheck ();
+
+}
diff --git a/src/core/avllistx.cpp b/src/core/avllistx.cpp
new file mode 100644
index 0000000..a686a75
--- /dev/null
+++ b/src/core/avllistx.cpp
@@ -0,0 +1,163 @@
+/*
+
+HyPhy - Hypothesis Testing Using Phylogenies.
+
+Copyright (C) 1997-2009
+  Sergei L Kosakovsky Pond (spond at ucsd.edu)
+  Art FY Poon              (apoon at cfenet.ubc.ca)
+
+Permission is hereby granted, free of charge, to any person obtaining a
+copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be included
+in all copies or substantial portions of the Software.
+
+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.
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+_AVLList    structure inspired by the excellent documentation of
+GNU libavl 2.0.1 by Ben Pfaff (http://www.msu.edu/~pfaffben/avl/index.html)
+
+*/
+
+#include "avllistx.h"
+#include "hy_strings.h"
+#include "errorfns.h"
+#include "parser.h"
+#include <stdlib.h>
+#include <string.h>
+#include <stdio.h>
+#include <ctype.h>
+#include <math.h>
+#include <limits.h>
+#ifdef    __HYPHYDMALLOC__
+#include "dmalloc.h"
+#endif
+
+//______________________________________________________________
+
+_AVLListX::_AVLListX (_SimpleList* d):_AVLList(d)
+{
+}
+
+//______________________________________________________________
+
+long    _AVLListX::GetXtra (long d)
+{
+    return xtraD.lData[d];
+}
+
+//______________________________________________________________
+
+void    _AVLListX::SetXtra (long i, long d)
+{
+    xtraD.lData[i] = d;
+}
+
+//______________________________________________________________
+
+void _AVLListX::Clear (bool cL)
+{
+    xtraD.Clear();
+    _AVLList::Clear(cL);
+}
+
+//______________________________________________________________
+
+BaseRef _AVLListX::toStr (void)
+{
+    _String * str = new _String (128L, true);
+    checkPointer (str);
+
+    if (countitems() == 0) {
+        (*str) << "Empty Associative List";
+    } else {
+        _SimpleList  hist;
+        long         ls, cn;
+
+        cn = Traverser (hist,ls,root);
+
+        while (cn>=0) {
+            _String * keyVal = (_String*)Retrieve (cn);
+            (*str) << keyVal;
+            (*str) << " : ";
+            (*str) << _String(GetXtra (cn));
+            (*str) << '\n';
+            cn = Traverser (hist,ls);
+        }
+    }
+
+    str->Finalize();
+    return str;
+}
+
+//______________________________________________________________
+
+long  _AVLListX::InsertData (BaseRef b, long d, bool)
+{
+    long w = (long)emptySlots.lLength - 1,
+         n;
+
+    if (w>=0) {
+        n = emptySlots.lData[w];
+        emptySlots.Delete (w);
+        leftChild.lData[n] = -1;
+        rightChild.lData[n] = -1;
+        balanceFactor.lData[n] = 0;
+        xtraD.lData[n] = d;
+        ((BaseRef*)dataList->lData)[n] = b;
+    } else {
+        n = dataList->lLength;
+        dataList->InsertElement (b,-1,false,false);
+        leftChild  << -1;
+        rightChild << -1;
+        balanceFactor << 0;
+        xtraD << d;
+    }
+    return n;
+}
+
+//______________________________________________________________
+
+long  _AVLListX::UpdateValue(BaseRef b, long d, long op) {
+    long exists = Find (b);
+    if (exists >= 0) {
+        if (op == 0) {
+            SetXtra (exists, GetXtra(exists) + d);
+        } else {
+            SetXtra (exists, d);       
+        }
+    } else {
+        Insert (b,d);
+    }
+    return exists;
+}
+
+
+//______________________________________________________________
+
+void _AVLListX::DeleteXtra (long i)
+{
+    xtraD.lData[i] = -1;
+}
+
+//______________________________________________________________
+
+void _AVLListX::PopulateFromList (_List& src)
+{
+    Clear(false);
+    for (unsigned long k = 0; k < src.lLength; k++) {
+        Insert (src(k)->makeDynamic(),k,false);
+    }
+}
+
diff --git a/src/core/avllistxl.cpp b/src/core/avllistxl.cpp
new file mode 100644
index 0000000..d9224bc
--- /dev/null
+++ b/src/core/avllistxl.cpp
@@ -0,0 +1,175 @@
+/*
+
+HyPhy - Hypothesis Testing Using Phylogenies.
+
+Copyright (C) 1997-2009
+  Sergei L Kosakovsky Pond (spond at ucsd.edu)
+  Art FY Poon              (apoon at cfenet.ubc.ca)
+
+Permission is hereby granted, free of charge, to any person obtaining a
+copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be included
+in all copies or substantial portions of the Software.
+
+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.
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+_AVLList    structure inspired by the excellent documentation of
+GNU libavl 2.0.1 by Ben Pfaff (http://www.msu.edu/~pfaffben/avl/index.html)
+
+*/
+
+#include "hy_strings.h"
+#include "errorfns.h"
+#include "parser.h"
+#include <stdlib.h>
+#include <string.h>
+#include <stdio.h>
+#include <ctype.h>
+#include <math.h>
+#include <limits.h>
+#ifdef    __HYPHYDMALLOC__
+#include "dmalloc.h"
+#endif
+
+//______________________________________________________________
+
+_AVLListXL::_AVLListXL (_SimpleList* d):_AVLList(d)
+{
+}
+
+//______________________________________________________________
+
+BaseRef _AVLListXL::GetXtra (long d)
+{
+    return xtraD(d);
+}
+
+
+//______________________________________________________________
+
+BaseRef _AVLListXL::GetDataByKey(BaseRef key)
+{
+    long f = Find (key);
+    if (f < 0) {
+        return nil;
+    }
+    return GetXtra(f);
+}
+
+
+//______________________________________________________________
+
+void    _AVLListXL::SetXtra (long i, BaseRef d, bool dup)
+{
+    xtraD.Replace (i,d, dup);
+}
+
+
+//______________________________________________________________
+
+BaseRef _AVLListXL::toStr (void)
+{
+    _String * str = new _String (128L, true);
+    checkPointer (str);
+
+    if (countitems() == 0) {
+        (*str) << "Empty Associative List";
+    } else {
+        _SimpleList  hist;
+        long         ls, cn;
+
+        cn = Traverser (hist,ls,root);
+
+        while (cn>=0) {
+            _String * keyVal = (_String*)Retrieve (cn);
+            (*str) << keyVal;
+            (*str) << " : ";
+            (*str) << (_String*)GetXtra (cn);
+            (*str) << '\n';
+            cn = Traverser (hist,ls);
+        }
+    }
+
+    str->Finalize();
+    return str;
+}
+
+
+//______________________________________________________________
+
+long  _AVLListXL::UpdateValue(BaseRef b, BaseRef d, bool do_copy, bool copy_key) {
+    long exists = Find (b);
+    if (exists >= 0) {
+        SetXtra (exists, d, do_copy);       
+    } else {
+        Insert (copy_key?b->makeDynamic():b,(long)d, do_copy);
+    }
+    return exists;
+}
+
+//______________________________________________________________
+
+void _AVLListXL::Clear (bool cL)
+{
+    xtraD.Clear();
+    _AVLList::Clear(cL);
+}
+
+
+
+//______________________________________________________________
+
+long  _AVLListXL::InsertData (BaseRef b, long xl, bool cp)
+{
+    long w = (long)emptySlots.lLength - 1,
+         n;
+
+    BaseRef x = (BaseRef)xl;
+
+    if (w>=0) {
+        n = emptySlots.lData[w];
+        emptySlots.Delete (w);
+        leftChild.lData[n] = -1;
+        rightChild.lData[n] = -1;
+        balanceFactor.lData[n] = 0;
+        ((BaseRef*)xtraD.lData)[n] = x;
+        if (cp) {
+            x->nInstances++;
+        }
+        ((BaseRef*)dataList->lData)[n] = b;
+    } else {
+        n = dataList->lLength;
+        dataList->InsertElement (b,-1,false,false);
+        leftChild  << -1;
+        rightChild << -1;
+        balanceFactor << 0;
+        xtraD << x;
+        if (!cp) {
+            x->nInstances--;
+        }
+    }
+    return n;
+}
+
+
+
+//______________________________________________________________
+
+void _AVLListXL::DeleteXtra (long i)
+{
+    DeleteObject (((BaseRef*)xtraD.lData)[i]);
+    (((BaseRef*)xtraD.lData)[i]) = nil;
+}
+
diff --git a/src/core/baseobj.cpp b/src/core/baseobj.cpp
new file mode 100644
index 0000000..298274a
--- /dev/null
+++ b/src/core/baseobj.cpp
@@ -0,0 +1,735 @@
+/*
+
+HyPhy - Hypothesis Testing Using Phylogenies.
+
+Copyright (C) 1997-2007
+
+Primary Development:
+  Sergei L Kosakovsky Pond (sergeilkp at mac.com)
+Significant contributions from:
+  Spencer V Muse (muse at stat.ncsu.edu)
+  Simon DW Frost (sdfrost at ucsd.edu)
+  Art FY Poon    (apoon at biomail.ucsd.edu)
+
+Permission is hereby granted, free of charge, to any person obtaining a
+copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be included
+in all copies or substantial portions of the Software.
+
+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.
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+*/
+
+#include "baseobj.h"
+#include "errorfns.h"
+#include "hy_strings.h"
+#include "site.h"
+#include "batchlan.h"
+#include "category.h"
+#include "likefunc.h"
+
+#include <stdlib.h>
+#include <string.h>
+#include <time.h>
+
+#ifdef   __HYPHYMPI__
+#include "likefunc.h"
+extern int _hy_mpi_node_rank;
+#endif
+
+#if defined   __UNIX__ || defined __HYPHY_GTK__
+#include <sys/time.h>
+#include <unistd.h>
+#endif
+
+#ifdef    __HYPHYDMALLOC__
+#include "dmalloc.h"
+#endif
+
+#ifdef   __HYPHYXCODE__
+#include "HYUtils.h"
+#endif
+
+#ifdef __WINDOZE__
+    #include <Windows.h>
+#endif
+
+
+
+bool        terminateExecution  = false;
+
+#include    "batchlan.h"
+
+//____________________________________________________________________________________
+
+FILE*     globalErrorFile   = nil,
+          *   globalMessageFile = nil;
+
+extern    bool          isInFunction;
+
+extern    _String   scanfLastFilePath;
+
+extern    _SimpleList   freeSlots;
+
+
+//____________________________________________________________________________________
+
+long            globalRandSeed;
+
+//____________________________________________________________________________________
+
+_String         errorFileName   ("errors.log"),
+                messageFileName ("messages.log");
+
+
+//____________________________________________________________________________________
+
+BaseObj::BaseObj()
+{
+    nInstances=1;
+}
+
+
+//____________________________________________________________________________________
+BaseRef   BaseObj::toStr (void)
+{
+    return new _String ("null");
+}
+
+//____________________________________________________________________________________
+BaseRef   BaseObj::toErrStr (void)
+{
+    return toStr();
+}
+
+//____________________________________________________________________________________
+void     BaseObj::toFileStr (FILE* dest)
+{
+    _String* s = (_String*)toStr();
+    fwrite(s->sData,1,s->Length(),dest);
+    DeleteObject (s);
+}
+
+//____________________________________________________________________________________
+BaseObj*  BaseObj::makeDynamic(void)
+{
+    warnError(-112);
+    return nil;
+}
+
+//____________________________________________________________________________________
+
+FILE *      doFileOpen (const char * fileName, const char * mode, bool warn)
+{
+    FILE    *daFile = nil;
+
+    if (fileName) {
+        _String fnstr (fileName);
+#ifdef __HYPHYXCODE__
+        daFile = fopen (DoMacToPOSIX(fnstr).getStr(),mode);
+#else
+        daFile = fopen (fileName,mode);
+#endif
+        if (!daFile && warn) {
+            WarnError (_String("Could not open file '") & *fileName & "' with mode '" & *mode & "'.");
+        }
+    }
+    return daFile;
+}
+
+
+//____________________________________________________________________________________
+bool    GlobalStartup (void)
+{
+    SetupOperationLists     ();
+    unsigned long seed_init = 0L;
+    time_t                  k;
+    time                    (&k);
+    seed_init               = k;
+    
+#ifdef __HYPHYMPI__
+    _hyApplicationGlobals.Insert(new _String (mpiNodeID));
+    _hyApplicationGlobals.Insert(new _String (mpiNodeCount));
+    _hyApplicationGlobals.Insert(new _String (mpiLastSentMsg));
+    seed_init += _hy_mpi_node_rank;
+#endif
+
+    
+#ifndef __WINDOZE__
+    seed_init               += getpid();
+#else
+    seed_init               += long(GetCurrentProcess());
+#endif
+    init_genrand            (seed_init);
+    globalRandSeed          = seed_init;
+    setParameter            (randomSeed,globalRandSeed);
+    long                    p   = 1;
+
+    _hyApplicationGlobals.Insert(new _String (dataFileTree));
+    _hyApplicationGlobals.Insert(new _String (dataFileTreeString));
+    _hyApplicationGlobals.Insert(new _String (siteWiseMatrix));
+    _hyApplicationGlobals.Insert(new _String (blockWiseMatrix));
+    _hyApplicationGlobals.Insert(new _String (selectionStrings));
+    _hyApplicationGlobals.Insert(new _String (randomSeed));
+    _hyApplicationGlobals.Insert(new _String (statusBarUpdateString));
+    _hyApplicationGlobals.Insert(new _String (statusBarProgressValue));
+    _hyApplicationGlobals.Insert(new _String (hyphyBaseDirectory));
+    _hyApplicationGlobals.Insert(new _String (hyphyLibDirectory));
+    _hyApplicationGlobals.Insert(new _String (platformDirectorySeparator));
+    _hyApplicationGlobals.Insert(new _String (pathToCurrentBF));
+
+    _String             dd (GetPlatformDirectoryChar());
+
+    standardLibraryPaths.AppendNewInstance      (new _String(libDirectory & "TemplateBatchFiles" & dd));
+    standardLibraryPaths.AppendNewInstance      (new _String(libDirectory & "TemplateBatchFiles" & dd & "TemplateModels" & dd ));
+    standardLibraryPaths.AppendNewInstance      (new _String(libDirectory & "TemplateBatchFiles" & dd & "Utility" & dd));
+    standardLibraryPaths.AppendNewInstance      (new _String(libDirectory & "UserAddIns" & dd));
+    standardLibraryPaths.AppendNewInstance      (new _String(libDirectory & "TemplateBatchFiles" & dd & "Distances" & dd));
+
+    standardLibraryExtensions.AppendNewInstance (new _String (""));
+    standardLibraryExtensions.AppendNewInstance (new _String (".bf"));
+    standardLibraryExtensions.AppendNewInstance (new _String (".ibf"));
+    standardLibraryExtensions.AppendNewInstance (new _String (".def"));
+    standardLibraryExtensions.AppendNewInstance (new _String (".mdl"));
+
+    _HBL_Init_Const_Arrays  ();
+
+
+#if not defined (__HYPHY_MPI_MESSAGE_LOGGING__) && defined (__HYPHYMPI__)
+    if (_hy_mpi_node_rank == 0) {
+#endif
+
+
+
+#ifndef __HEADLESS__ // do not create log files for _HEADLESS_
+#ifndef __HYPHYMPI__
+    _String fileName(errorFileName);
+#if defined __HYPHYXCODE__ || defined __WINDOZE__
+    fileName = baseDirectory & fileName;
+#endif
+#else
+    _String fileName = errorFileName & ".mpinode" & (long)_hy_mpi_node_rank;
+#endif
+
+    globalErrorFile = doFileOpen (fileName.sData,"w+");
+    while (globalErrorFile == nil && p<10) {
+        fileName = errorFileName&'.'&_String(p);
+#if defined __HYPHYXCODE__ || defined __WINDOZE__
+        fileName = baseDirectory & fileName;
+#endif
+        globalErrorFile = doFileOpen (fileName.sData,"w+");
+        p++;
+    }
+    errorFileName = fileName;
+
+    p=1;
+#ifndef __HYPHYMPI__
+    fileName = messageFileName;
+#if defined __HYPHYXCODE__ || defined __WINDOZE__
+    fileName = baseDirectory & fileName;
+#endif
+#else
+    fileName = messageFileName & ".mpinode" & (long)_hy_mpi_node_rank;
+#endif
+
+    globalMessageFile = doFileOpen (fileName.getStr(),"w+");
+
+    while (globalMessageFile == nil && p<10) {
+        fileName = messageFileName&'.'&_String(p);
+#if defined __HYPHYXCODE__ || defined __WINDOZE__
+        fileName = baseDirectory & fileName;
+#endif
+        globalMessageFile = doFileOpen (fileName.sData,"w+");
+        p++;
+    }
+    messageFileName = fileName;
+#endif
+#if not defined (__HYPHY_MPI_MESSAGE_LOGGING__) && defined (__HYPHYMPI__)
+    }
+#endif
+
+    return globalErrorFile && globalMessageFile;
+}
+
+
+//____________________________________________________________________________________
+bool    GlobalShutdown (void)
+{
+    bool res = true;
+
+#if defined (__HYPHY_GTK__) || defined (__HEADLESS__)
+#elif defined __UNIX__
+    if (needExtraNL)
+        printf ("\n");
+#endif
+
+#ifdef  __HYPHYMPI__
+    int     flag, size;
+
+    MPI_Comm_size(MPI_COMM_WORLD, &size);
+    PurgeAll (true);
+    // force manual clear to help debuggin 'exit' crashes
+    ReportWarning ("PurgeAll was successful");
+    if (_hy_mpi_node_rank == 0) {
+        for (long count = 1; count < size; count++) {
+            ReportWarning (_String ("Sending shutdown command to node ") & count & '.');
+            MPISendString(empty,count);
+        }
+    }
+#endif
+
+#ifdef  __HYPHYMPI__
+    // MPI_Barrier (MPI_COMM_WORLD);
+    ReportWarning ("Calling MPI_Finalize");
+#ifdef __USE_ABORT_HACK__
+    MPI_Abort(MPI_COMM_WORLD,0);
+#else
+    MPI_Finalized(&flag);
+    if (!flag)
+        MPI_Finalize();
+#endif
+    ReportWarning ("Returned from MPI_Finalize");
+#endif
+
+
+    if (globalErrorFile) {
+        fflush (globalErrorFile);
+        fseek(globalErrorFile,0,SEEK_END);
+        unsigned long fileSize = ftell(globalErrorFile);
+        if (fileSize) {
+#if defined (__MAC__) || defined (__WINDOZE__) || defined (__HYPHYMPI__) || defined (__HYPHY_GTK__)
+
+#else
+            fprintf (stderr, "\nCheck %s for details on execution errors.\n",errorFileName.getStr());
+#endif
+            res = false;
+            fclose (globalErrorFile);
+
+        } else {
+            fclose (globalErrorFile);
+#ifdef __HYPHYXCODE__
+            remove (DoMacToPOSIX(errorFileName).getStr());
+#else
+            remove (errorFileName.getStr());
+#endif
+        }
+    }
+    if (globalMessageFile) {
+        if (ftell(globalMessageFile)) {
+#if defined (__MAC__) || defined (__WINDOZE__) || defined (__HYPHYMPI__) || defined (__HYPHY_GTK__)
+#else
+            fprintf (stderr, "\nCheck %s details of this run.\n",messageFileName.getStr());
+#endif
+            fclose (globalMessageFile);
+        } else {
+            fclose (globalMessageFile);
+#ifdef __HYPHYXCODE__
+            remove (DoMacToPOSIX(messageFileName).getStr());
+#else
+            remove (messageFileName.getStr());
+#endif
+        }
+    }
+    
+    _SimpleList  hist;
+    long         ls,
+                 cn = _HY_HBLCommandHelper.Traverser (hist,ls,_HY_HBLCommandHelper.GetRoot());
+
+    while (cn >= 0) {
+        delete ((_HBLCommandExtras*)_HY_HBLCommandHelper.GetXtra(cn));
+        cn = _HY_HBLCommandHelper.Traverser (hist,ls);
+    }
+    _HY_HBLCommandHelper.Clear();
+    _HY_ValidHBLExpressions.Clear();
+
+    return res;
+}
+
+//____________________________________________________________________________________
+
+void    PurgeAll (bool all)
+{
+    batchLanguageFunctions.Clear();
+    batchLanguageFunctionNames.Clear();
+    batchLanguageFunctionParameterLists.Clear();
+    batchLanguageFunctionParameters.Clear();
+    batchLanguageFunctionClassification.Clear();
+    executionStack.Clear();
+    loadedLibraryPaths.Clear(true);
+    _HY_HBL_Namespaces.Clear();
+    if (all) {
+        likeFuncList.Clear();
+        likeFuncNamesList.Clear();
+        dataSetFilterList.Clear();
+        dataSetFilterNamesList.Clear();
+        dataSetList.Clear();
+        dataSetNamesList.Clear();
+        compiledFormulaeParameters.Clear();
+        modelNames.Clear();
+        KillExplicitModelFormulae ();
+        modelMatrixIndices.Clear();
+        modelFrequenciesIndices.Clear();
+        modelTypeList.Clear();
+        listOfCompiledFormulae.Clear();
+        variablePtrs.Clear();
+        freeSlots.Clear();
+        lastMatrixDeclared = -1;
+        {
+            variableNames.Clear(true);
+        }
+        _x_ = nil;
+        _n_ = nil;
+        pathNames.Clear();
+    }
+    scanfLastFilePath = empty;
+    setParameter (randomSeed,globalRandSeed);
+    isInFunction        = false;
+    isDefiningATree     = 0;
+#ifdef __HYPHYMPI__
+    int            size;
+
+    MPI_Comm_size   (MPI_COMM_WORLD, &size);
+    setParameter    (mpiNodeID, (_Parameter)_hy_mpi_node_rank);
+    setParameter    (mpiNodeCount, (_Parameter)size);
+#endif
+}
+
+//____________________________________________________________________________________
+void    DeleteObject (BaseRef theObject)
+{
+    if (theObject) {
+        if (theObject->nInstances<=1) {
+            delete (theObject);
+        } else {
+            theObject->nInstances--;
+        }
+    }
+}
+
+
+#ifndef __HYPHYDMALLOC__
+//____________________________________________________________________________________
+char* MemAllocate (long chunk)
+{
+    char* result = (char*)malloc (chunk);
+    if (!result) {
+        _String   errMsg ("Failed to allocate ");
+        errMsg = errMsg & chunk & " bytes.";
+        FlagError (errMsg);
+    }
+    return result;
+}
+
+
+//____________________________________________________________________________________
+char* MemReallocate (Ptr oldP, long chunk)
+{
+    char* result  = (char*) realloc (oldP, chunk);
+
+    if (!result) {
+        warnError(-108);
+    }
+
+    return result;
+}
+
+#endif
+
+
+//____________________________________________________________________________________
+
+
+#ifdef __HEADLESS__
+void        yieldCPUTime(void)
+{
+    if (globalInterfaceInstance) {
+        terminateExecution = !(*globalInterfaceInstance->GetCallbackHandler())
+                             (_THyPhyGetStringStatus(),_THyPhyGetLongStatus(),_THyPhyGetDoubleStatus());
+    }
+}
+
+#endif 
+
+//____________________________________________________________________________________
+
+// time differencing function
+
+double      TimerDifferenceFunction (bool doRetrieve)
+{
+    double timeDiff = 0.0;
+#ifdef __MAC__
+    static UnsignedWide microsecsIn;
+    UnsignedWide microsecsOut;
+
+    if (doRetrieve) {
+        Microseconds      (&microsecsOut);
+        timeDiff = 0.000001*((microsecsOut.hi-microsecsIn.hi)*(_Parameter)0xffffffff
+                             + (microsecsOut.lo-microsecsIn.lo));
+    } else {
+        Microseconds      (&microsecsIn);
+    }
+
+#endif
+
+#ifdef  __WINDOZE__
+    static          char            canRunTimer    = 0;
+    static          _Parameter      winTimerScaler = 0.0;
+    static          LARGE_INTEGER   tIn;
+
+    LARGE_INTEGER   tOut;
+
+    if (canRunTimer == 0) {
+        if (QueryPerformanceFrequency(&tIn) && tIn.QuadPart) {
+            winTimerScaler = 1./tIn.QuadPart;
+            canRunTimer    = 1;
+        } else {
+            canRunTimer = -1;
+        }
+
+    }
+
+    if (canRunTimer == 1)
+        if (doRetrieve) {
+            QueryPerformanceCounter (&tOut);
+            timeDiff   = (tOut.QuadPart-tIn.QuadPart) * winTimerScaler;
+
+        } else {
+            QueryPerformanceCounter (&tIn);
+        }
+#endif
+
+#if !defined __WINDOZE__ && !defined __MAC__
+    /*static    clock_t         clockIn;
+            clock_t         clockOut;
+
+    if (doRetrieve)
+    {
+        clockOut = clock();
+        timeDiff   = (clockOut-clockIn) * 1.0 / CLOCKS_PER_SEC;
+    }
+    else
+        clockIn  = clock();*/
+    static timeval clockIn, clockOut;
+    if (doRetrieve) {
+        gettimeofday (&clockOut,nil);
+        timeDiff = (clockOut.tv_sec-clockIn.tv_sec) + (clockOut.tv_usec-clockIn.tv_usec)*0.000001;
+    } else {
+        gettimeofday (&clockIn,nil);
+    }
+
+#endif
+
+
+    return timeDiff;
+}
+
+
+//____________________________________________________________________________________
+//       RANDOM NUMBER GENERATOR CODE
+//____________________________________________________________________________________
+
+/*
+   A C-program for MT19937, with initialization improved 2002/1/26.
+   Coded by Takuji Nishimura and Makoto Matsumoto.
+
+   Before using, initialize the state by using init_genrand(seed)
+   or init_by_array(init_key, key_length).
+
+   Copyright (C) 1997 - 2002, Makoto Matsumoto and Takuji Nishimura,
+   All rights reserved.
+
+   Redistribution and use in source and binary forms, with or without
+   modification, are permitted provided that the following conditions
+   are met:
+
+     1. Redistributions of source code must retain the above copyright
+        notice, this list of conditions and the following disclaimer.
+
+     2. Redistributions in binary form must reproduce the above copyright
+        notice, this list of conditions and the following disclaimer in the
+        documentation and/or other materials provided with the distribution.
+
+     3. The names of its contributors may not be used to endorse or promote
+        products derived from this software without specific prior written
+        permission.
+
+   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+   A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+   CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+   EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+   PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+   PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+   LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+   NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+   SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+
+   Any feedback is very welcome.
+   http://www.math.keio.ac.jp/matumoto/emt.html
+   email: matumoto at math.keio.ac.jp
+*/
+
+#define N 624
+#define M 397
+#define MATRIX_A 0x9908b0dfUL   /* constant vector a */
+#define UPPER_MASK 0x80000000UL /* most significant w-r bits */
+#define LOWER_MASK 0x7fffffffUL /* least significant r bits */
+
+static unsigned long mt[N]; /* the array for the state vector  */
+static int mti=N+1; /* mti==N+1 means mt[N] is not initialized */
+
+/* prototypes */
+
+void        init_by_array       (unsigned long[], unsigned long);
+long        genrand_int31       (void);
+double      genrand_real1       (void);
+double      genrand_real3       (void);
+double      genrand_res53       (void);
+
+
+/* initializes mt[N] with a seed */
+void init_genrand(unsigned long s)
+{
+    mt[0]= s & 0xffffffffUL;
+    for (mti=1; mti<N; mti++) {
+        mt[mti] =
+            (1812433253UL * (mt[mti-1] ^ (mt[mti-1] >> 30)) + mti);
+        /* See Knuth TAOCP Vol2. 3rd Ed. P.106 for multiplier. */
+        /* In the previous versions, MSBs of the seed affect   */
+        /* only MSBs of the array mt[].                        */
+        /* 2002/01/09 modified by Makoto Matsumoto             */
+        mt[mti] &= 0xffffffffUL;
+        /* for >32 bit machines */
+    }
+}
+
+/* initialize by an array with array-length */
+/* init_key is the array for initializing keys */
+/* key_length is its length */
+void init_by_array(unsigned long init_key[], unsigned long key_length)
+{
+    int i, j, k;
+    init_genrand(19650218UL);
+    i=1;
+    j=0;
+    k = (N>key_length ? N : key_length);
+    for (; k; k--) {
+        mt[i] = (mt[i] ^ ((mt[i-1] ^ (mt[i-1] >> 30)) * 1664525UL))
+                + init_key[j] + j; /* non linear */
+        mt[i] &= 0xffffffffUL; /* for WORDSIZE > 32 machines */
+        i++;
+        j++;
+        if (i>=N) {
+            mt[0] = mt[N-1];
+            i=1;
+        }
+        if (j>=key_length) {
+            j=0;
+        }
+    }
+    for (k=N-1; k; k--) {
+        mt[i] = (mt[i] ^ ((mt[i-1] ^ (mt[i-1] >> 30)) * 1566083941UL))
+                - i; /* non linear */
+        mt[i] &= 0xffffffffUL; /* for WORDSIZE > 32 machines */
+        i++;
+        if (i>=N) {
+            mt[0] = mt[N-1];
+            i=1;
+        }
+    }
+
+    mt[0] = 0x80000000UL; /* MSB is 1; assuring non-zero initial array */
+}
+
+/* generates a random number on [0,0xffffffff]-interval */
+unsigned long genrand_int32(void)
+{
+    unsigned long y;
+    static unsigned long mag01[2]= {0x0UL, MATRIX_A};
+    /* mag01[x] = x * MATRIX_A  for x=0,1 */
+
+    if (mti >= N) { /* generate N words at one time */
+        int kk;
+
+        if (mti == N+1) { /* if init_genrand() has not been called, */
+            init_genrand(5489UL);    /* a default initial seed is used */
+        }
+
+        for (kk=0; kk<N-M; kk++) {
+            y = (mt[kk]&UPPER_MASK)|(mt[kk+1]&LOWER_MASK);
+            mt[kk] = mt[kk+M] ^ (y >> 1) ^ mag01[y & 0x1UL];
+        }
+        for (; kk<N-1; kk++) {
+            y = (mt[kk]&UPPER_MASK)|(mt[kk+1]&LOWER_MASK);
+            mt[kk] = mt[kk+(M-N)] ^ (y >> 1) ^ mag01[y & 0x1UL];
+        }
+        y = (mt[N-1]&UPPER_MASK)|(mt[0]&LOWER_MASK);
+        mt[N-1] = mt[M-1] ^ (y >> 1) ^ mag01[y & 0x1UL];
+
+        mti = 0;
+    }
+
+    y = mt[mti++];
+
+    /* Tempering */
+    y ^= (y >> 11);
+    y ^= (y << 7) & 0x9d2c5680UL;
+    y ^= (y << 15) & 0xefc60000UL;
+    y ^= (y >> 18);
+
+    return y;
+}
+
+/* generates a random number on [0,0x7fffffff]-interval */
+long genrand_int31(void)
+{
+    return (long)(genrand_int32()>>1);
+}
+
+/* generates a random number on [0,1]-real-interval */
+double genrand_real1(void)
+{
+    return genrand_int32()*(1.0/4294967295.0);
+    /* divided by 2^32-1 */
+}
+
+/* generates a random number on [0,1)-real-interval */
+double genrand_real2(void)
+{
+    return ((double)genrand_int32())*(1.0/4294967296.0);
+    /* divided by 2^32 */
+}
+
+/* generates a random number on (0,1)-real-interval */
+double genrand_real3(void)
+{
+    return (((double)genrand_int32()) + 0.5)*(1.0/4294967296.0);
+    /* divided by 2^32 */
+}
+
+/* generates a random number on [0,1) with 53-bit resolution*/
+double genrand_res53(void)
+{
+    unsigned long a=genrand_int32()>>5, b=genrand_int32()>>6;
+    return(a*67108864.0+b)*(1.0/9007199254740992.0);
+}
+/* These real versions are due to Isaku Wada, 2002/01/09 added */
+
+
+
+
+//EOF
diff --git a/src/core/batchlan.cpp b/src/core/batchlan.cpp
new file mode 100644
index 0000000..6036b82
--- /dev/null
+++ b/src/core/batchlan.cpp
@@ -0,0 +1,7599 @@
+/*
+ 
+ HyPhy - Hypothesis Testing Using Phylogenies.
+ 
+ Copyright (C) 1997-now
+ Core Developers:
+ Sergei L Kosakovsky Pond (spond at ucsd.edu)
+ Art FY Poon    (apoon at cfenet.ubc.ca)
+ Steven Weaver (sweaver at ucsd.edu)
+ 
+ Module Developers:
+ Lance Hepler (nlhepler at gmail.com)
+ Martin Smith (martin.audacis at gmail.com)
+ 
+ Significant contributions from:
+ Spencer V Muse (muse at stat.ncsu.edu)
+ Simon DW Frost (sdf22 at cam.ac.uk)
+ 
+ Permission is hereby granted, free of charge, to any person obtaining a
+ copy of this software and associated documentation files (the
+ "Software"), to deal in the Software without restriction, including
+ without limitation the rights to use, copy, modify, merge, publish,
+ distribute, sublicense, and/or sell copies of the Software, and to
+ permit persons to whom the Software is furnished to do so, subject to
+ the following conditions:
+ 
+ The above copyright notice and this permission notice shall be included
+ in all copies or substantial portions of the Software.
+ 
+ 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.
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ 
+ */
+
+#include "likefunc.h"
+#include "batchlan.h"
+#include "string.h"
+#include "ctype.h"
+#include "polynoml.h"
+#include "time.h"
+#include "scfg.h"
+#include "HYNetInterface.h"
+
+#include "bayesgraph.h"
+
+
+//#include "profiler.h"
+#ifndef __HEADLESS__
+#ifdef __HYPHY_GTK__
+#include "HYConsoleWindow.h"
+#include "HYDialogs.h"
+#include "HYUtils.h"
+#include "HYTreePanel.h"
+#include "HYDataPanel.h"
+#include "HYChartWindow.h"
+#include "HYDBWindow.h"
+#endif
+
+#ifdef __MAC__
+#include <Aliases.h>
+//#include <StandardFile.h>
+#include <Files.h>
+#include "HYDataPanel.h"
+#include "HYDialogs.h"
+#include "HYTreePanel.h"
+#include "HYDataPanel.h"
+#include "HYUtils.h"
+#include "HYChartWindow.h"
+#include "HYDBWindow.h"
+#include "timer.h"
+void    GetFullPathName (FSSpec& theReply, _String& feedback);
+_String MacSimpleFileOpen (void);
+_String MacSimpleFileSave (void);
+#endif
+
+#ifdef __WINDOZE__
+#include "HYDataPanel.h"
+#include "HYDialogs.h"
+#include "HYTreePanel.h"
+#include "HYDataPanel.h"
+#include "HYUtils.h"
+#include "HYChartWindow.h"
+extern  long    lastFileTypeSelection;
+#include "HYUtils.h"
+#include "HYDBWindow.h"
+#endif
+
+#ifndef __UNIX__
+#include "HYEventTypes.h"
+#endif
+#endif
+
+#if defined __HYPHYQT__
+#include "HYSharedMain.h"
+#include "hyphy_qt_helpers.h"
+#endif
+
+
+#ifdef      __MACPROFILE__
+#include "profiler.h"
+#endif
+
+#ifdef    __HYPHYDMALLOC__
+#include "dmalloc.h"
+#endif
+
+
+//____________________________________________________________________________________
+// global variables
+
+_List
+dataSetList,
+dataSetNamesList,
+likeFuncList,   // list of all datasets
+dataSetFilterList,
+dataSetFilterNamesList,
+likeFuncNamesList, // list of all dataset filters
+pathNames,
+theModelList,
+allowedFormats,
+batchLanguageFunctions,
+batchLanguageFunctionNames,
+batchLanguageFunctionParameterLists,
+compiledFormulaeParameters,
+modelNames,
+executionStack,
+standardLibraryPaths,
+standardLibraryExtensions,
+loadedLibraryPathsBackend;
+
+
+#ifdef __MAC__
+_String volumeName;
+#endif
+
+
+// retrieval functions
+
+_SimpleList
+returnlist,
+batchLanguageFunctionParameters,
+batchLanguageFunctionClassification,
+modelMatrixIndices,
+modelTypeList,
+modelFrequenciesIndices,
+listOfCompiledFormulae;
+
+_String
+globalPolynomialCap             ("GLOBAL_POLYNOMIAL_CAP"),
+                                enforceGlobalPolynomialCap      ("ENFORCE_GLOBAL_POLYNOMIAL_CAP"),
+                                dropPolynomialTerms             ("DROP_POLYNOMIAL_TERMS"),
+                                maxPolyTermsPerVariable         ("MAX_POLY_TERMS_PER_VARIABLE"),
+                                maxPolyExpIterates              ("MAX_POLYNOMIAL_EXP_ITERATES"),
+                                polyExpPrecision                ("POLYNOMIAL_EXP_PRECISION"),
+                                systemVariableDump              ("LIST_ALL_VARIABLES"),
+                                selfDump                        ("PRINT_SELF"),
+                                printDigitsSpec                 ("PRINT_DIGITS"),
+                                explicitFormMExp                ("EXPLICIT_FORM_MATRIX_EXPONENTIAL"),
+                                multByFrequencies               ("MULTIPLY_BY_FREQUENCIES"),
+                                getDString                      ("PROMPT_FOR_STRING"),
+                                useLastFString                  ("LAST_FILE_PATH"),
+                                getFString                      ("PROMPT_FOR_FILE"),
+                                tempFString                     ("TEMP_FILE_NAME"),
+                                defFileString                   ("DEFAULT_FILE_SAVE_NAME"),
+                                useLastModel                    ("USE_LAST_MODEL"),
+                                VerbosityLevelString            ("VERBOSITY_LEVEL"),
+                                hasEndBeenReached               ("END_OF_FILE"),
+                                clearFile                       ("CLEAR_FILE"),
+                                keepFileOpen                    ("KEEP_OPEN"),
+                                closeFile                       ("CLOSE_FILE"),
+                                useLastDefinedMatrix            ("USE_LAST_DEFINED_MATRIX"),
+                                MessageLogging                  ("MESSAGE_LOGGING"),
+                                selectionStrings                ("SELECTION_STRINGS"),
+                                useNoModel                      ("USE_NO_MODEL"),
+                                stdoutDestination               ("stdout"),
+                                messageLogDestination           ("MESSAGE_LOG"),
+                                lastModelParameterList          ("LAST_MODEL_PARAMETER_LIST"),
+                                dataPanelSourcePath             ("DATA_PANEL_SOURCE_PATH"),
+                                windowTypeTree                  ("TREEWINDOW"),
+                                windowTypeClose                 ("CLOSEWINDOW"),
+                                windowTypeTable                 ("CHARTWINDOW"),
+                                windowTypeDistribTable          ("DISTRIBUTIONWINDOW"),
+                                windowTypeDatabase              ("DATABASEWINDOW"),
+                                screenWidthVar                  ("SCREEN_WIDTH"),
+                                screenHeightVar                 ("SCREEN_HEIGHT"),
+                                useNexusFileData                ("USE_NEXUS_FILE_DATA"),
+                                mpiMLELFValue                   ("MPI_MLE_LF_VALUE"),
+                                lf2SendBack                     ("LIKE_FUNC_NAME_TO_SEND_BACK"),
+                                pcAmbiguitiesResolve            ("RESOLVE_AMBIGUITIES"),
+                                pcAmbiguitiesAverage            ("AVERAGE_AMBIGUITIES"),
+                                pcAmbiguitiesSkip               ("SKIP_AMBIGUITIES"),
+                                lfStartCompute                  ("LF_START_COMPUTE"),
+                                lfDoneCompute                   ("LF_DONE_COMPUTE"),
+                                getURLFileFlag                  ("SAVE_TO_FILE"),
+                                versionString                   ("HYPHY_VERSION"),
+                                timeStamp                       ("TIME_STAMP"),
+                                simulationFilter                ("_SIM_INTERNAL_FILTER_"),
+                                prefixDS                        ("DataSet_"),
+                                prefixDF                        ("Partition_"),
+                                prefixLF                        ("LF_"),
+                                replaceTreeStructure            ("REPLACE_TREE_STRUCTURE"),
+                                hyphyBaseDirectory              ("HYPHY_BASE_DIRECTORY"),
+                                hyphyLibDirectory               ("HYPHY_LIB_DIRECTORY"),
+                                platformDirectorySeparator      ("DIRECTORY_SEPARATOR"),
+                                covarianceParameterList         ("COVARIANCE_PARAMETER"),
+                                matrixEvalCount                 ("MATRIX_EXPONENTIATION_COUNTS"),
+                                scfgCorpus                      ("SCFG_STRING_CORPUS"),
+                                _hyLastExecutionError           ("LAST_HBL_EXECUTION_ERROR"),
+                                _hyExecutionErrorMode           ("HBL_EXECUTION_ERROR_HANDLING"),
+
+                                bgmData                         ("BGM_DATA_MATRIX"),
+                                bgmScores                       ("BGM_SCORE_CACHE"),
+                                bgmGraph                        ("BGM_GRAPH_MATRIX"),
+                                bgmNodeOrder                    ("BGM_NODE_ORDER"),
+
+                                bgmConstraintMx                 ("BGM_CONSTRAINT_MATRIX"),
+                                bgmParameters                   ("BGM_NETWORK_PARAMETERS"),
+
+                                pathToCurrentBF                 ("PATH_TO_CURRENT_BF"),
+                                hfCountGap                      ("COUNT_GAPS_IN_FREQUENCIES"),
+                                gdiDFAtomSize                   ("ATOM_SIZE"),
+                                statusBarProgressValue          ("STATUS_BAR_PROGRESS_VALUE"),
+                                statusBarUpdateString           ("STATUS_BAR_STATUS_STRING"),
+                                marginalAncestors               ("MARGINAL"),
+                                doLeavesAncestors               ("DOLEAVES"),
+                                blScanfRewind                   ("REWIND"),
+                                blFprintfRedirect               ("GLOBAL_FPRINTF_REDIRECT"),
+                                blFprintfDevNull                ("/dev/null"),
+                                getDataInfoReturnsOnlyTheIndex  ("GET_DATA_INFO_RETURNS_ONLY_THE_INDEX"),
+                                alwaysReloadLibraries           ("ALWAYS_RELOAD_FUNCTION_LIBRARIES"),
+                                dialogPrompt,
+                                baseDirectory,
+                                lastModelUsed,
+                                libDirectory,
+                                scanfLastFilePath,
+                                defFileNameValue;
+
+
+
+
+#ifdef      __HYPHYMPI__
+
+_String     mpiNodeID                       ("MPI_NODE_ID"),
+            mpiNodeCount                    ("MPI_NODE_COUNT"),
+            mpiLastSentMsg                  ("MPI_LAST_SENT_MSG");
+
+void        ReportMPIError                  (int, bool);
+
+#endif
+
+bool        isInFunction = false;
+
+_Parameter  explicitFormMatrixExponential = 0.0,
+            messageLogFlag                = 1.0;
+
+long        scanfLastReadPosition         = 0;
+
+extern      _String             MATRIX_AGREEMENT,
+            ANAL_COMP_FLAG;
+
+
+extern      _Parameter          toPolyOrNot,
+            toMorNot2M,
+            ANALYTIC_COMPUTATION_FLAG;
+
+extern      _SimpleList         freeSlots;
+
+
+_AVLList    loadedLibraryPaths  (&loadedLibraryPathsBackend);
+
+_ExecutionList
+*currentExecutionList = nil;
+
+
+//____________________________________________________________________________________
+// Function prototypes
+
+#ifdef      __HYPHYMPI__
+
+//____________________________________________________________________________________
+
+void    ReportMPIError      (int code, bool send)
+{
+    if (code != MPI_SUCCESS) {
+        _String errMsg = "MPI Error while ";
+        if (send) {
+            errMsg = errMsg & "sending";
+        } else {
+            errMsg = errMsg & "receiving";
+        }
+
+        errMsg = errMsg & _String(" code:") & (long)code;
+        FlagError (errMsg);
+    }
+}
+
+#define MPI_SEND_CHUNK 0xFFFFFFL
+
+//____________________________________________________________________________________
+
+void    MPISendString       (_String& theMessage, long destID, bool isError)
+{
+
+    long    messageLength = theMessage.sLength,
+            transferCount = 0;
+
+    if (isError) {
+        messageLength = -messageLength;
+    }
+
+    ReportMPIError(MPI_Send(&messageLength, 1, MPI_LONG, destID, HYPHY_MPI_SIZE_TAG, MPI_COMM_WORLD),true);
+
+    if (messageLength == 0) {
+        return;
+    }
+
+    if (isError) {
+        messageLength = -messageLength;
+    }
+
+    while (messageLength-transferCount>MPI_SEND_CHUNK) {
+        ReportMPIError(MPI_Send(theMessage.sData+transferCount, MPI_SEND_CHUNK, MPI_CHAR, destID, HYPHY_MPI_STRING_TAG, MPI_COMM_WORLD),true);
+        transferCount += MPI_SEND_CHUNK;
+    }
+
+    if (messageLength-transferCount) {
+        ReportMPIError(MPI_Send(theMessage.sData+transferCount, messageLength-transferCount, MPI_CHAR, destID, HYPHY_MPI_STRING_TAG, MPI_COMM_WORLD),true);
+    }
+
+    //ReportMPIError(MPI_Send(&messageLength, 1, MPI_LONG, destID, HYPHY_MPI_DONE_TAG, MPI_COMM_WORLD),true);
+
+    _FString*    sentVal = new _FString;
+    sentVal->theString = (_String*)theMessage.makeDynamic();
+    _Variable *   mpiMsgVar = CheckReceptacle (&mpiLastSentMsg, empty, false);
+    mpiMsgVar->SetValue (sentVal, false);
+    //setParameter (mpiLastSentMsg, &sentVal);
+
+}
+
+//____________________________________________________________________________________
+_String*    MPIRecvString       (long senderT, long& senderID)
+{
+    _String*    theMessage = nil;
+    long        messageLength = 0,
+                transferCount = 0;
+
+    int         actualReceived = 0;
+    bool        isError       = false;
+
+    if  (senderT<0) {
+        senderT = MPI_ANY_SOURCE;
+    }
+
+    MPI_Status  status;
+
+    ReportMPIError(MPI_Recv(&messageLength, 1, MPI_LONG, senderT, HYPHY_MPI_SIZE_TAG, MPI_COMM_WORLD,&status),false);
+
+    if (messageLength < 0) {
+        isError = true;
+        messageLength = -messageLength;
+    }
+
+    if (!isError) {
+        //MPI_Get_count (&status,MPI_CHAR,&actualReceived);
+
+        if (messageLength==0) {
+            return new _String;
+        }
+
+        theMessage = new _String (messageLength, false);
+
+        senderT = senderID = status.MPI_SOURCE;
+
+        while (messageLength-transferCount>MPI_SEND_CHUNK) {
+            ReportMPIError(MPI_Recv(theMessage->sData+transferCount, MPI_SEND_CHUNK, MPI_CHAR, senderT, HYPHY_MPI_STRING_TAG, MPI_COMM_WORLD,&status),false);
+            MPI_Get_count (&status,MPI_CHAR,&actualReceived);
+            if (actualReceived!=MPI_SEND_CHUNK) {
+                WarnError ("Failed in MPIRecvString - some data was not properly received\n");
+            }
+            //return    nil;
+            transferCount += MPI_SEND_CHUNK;
+        }
+
+        if (messageLength-transferCount) {
+            ReportMPIError(MPI_Recv(theMessage->sData+transferCount, messageLength-transferCount, MPI_CHAR, senderT, HYPHY_MPI_STRING_TAG, MPI_COMM_WORLD,&status),false);
+            MPI_Get_count (&status,MPI_CHAR,&actualReceived);
+            if (actualReceived!=messageLength-transferCount) {
+                WarnError ("Failed in MPIRecvString - some data was not properly received\n");
+            }
+            //return    nil;
+        }
+        //ReportMPIError(MPI_Recv(&messageLength, 1, MPI_LONG, senderT, HYPHY_MPI_DONE_TAG, MPI_COMM_WORLD,&status),false);
+
+        if (isError) {
+            FlagError (theMessage);
+        }
+    }
+    return theMessage;
+}
+#endif
+
+
+//____________________________________________________________________________________
+
+_String GetStringFromFormula (_String* data,_VariableContainer* theP)
+{
+    _Formula  nameForm (*data,theP);
+    _PMathObj formRes = nameForm.Compute();
+
+    if (formRes&& formRes->ObjectClass()==STRING) {
+        data = ((_FString*)formRes)->theString;
+    }
+
+    return *data;
+}
+
+//____________________________________________________________________________________
+
+_String*    ProcessCommandArgument (_String* data)
+{
+    if ( data->sLength>1 && data->sData[data->sLength-1]=='&' ) {
+        _String argName    (*data,0,data->sLength-2);
+        _FString* theVar = (_FString*)FetchObjectFromVariableByType(&argName,STRING);
+        if (theVar) {
+            return theVar->theString;
+        }
+
+        WarnError (_String("Reference argument \"")&*data &"\" is not a valid string variable.");
+        return nil;
+    }
+    return (_String*)data;
+}
+
+//____________________________________________________________________________________
+
+bool    numericalParameterSuccessFlag = true;
+
+_Parameter  ProcessNumericArgument (_String* data, _VariableContainer* theP, _ExecutionList* currentProgram) {
+    _String   errMsg;
+    _Formula  nameForm (*data,theP, currentProgram?&errMsg:nil);
+     
+    if (!errMsg.sLength) {
+        _PMathObj formRes = nameForm.Compute();
+        numericalParameterSuccessFlag = true;
+        if (formRes&& formRes->ObjectClass()==NUMBER) {
+            return formRes->Value();
+        } else {
+            if (formRes&& formRes->ObjectClass()==STRING) {
+                return _String((_String*)((_FString*)formRes)->toStr()).toNum();
+            } else {
+                errMsg = (_String("'") & *data & "' was expected to be a numerical argument.");
+            }
+        }
+    }
+    
+    if (currentProgram) {
+        currentProgram->ReportAnExecutionError (errMsg);
+    } else {
+        WarnError(errMsg);
+    }
+    
+    numericalParameterSuccessFlag = false;
+    return 0.0;
+}
+
+//____________________________________________________________________________________
+
+_PMathObj   ProcessAnArgumentByType (_String* expression, _VariableContainer* theP, long objectType, _ExecutionList* currentProgram)
+{
+    _String   errMsg;
+
+    _Formula  expressionProcessor (*expression, theP, currentProgram?&errMsg:nil);
+    
+    if (errMsg.sLength) {
+        currentProgram->ReportAnExecutionError (errMsg);
+    }
+    else {
+        _PMathObj expressionResult = expressionProcessor.Compute(0,theP);
+        if (expressionResult && expressionResult->ObjectClass()==objectType) {
+            return (_PMathObj)expressionResult->makeDynamic();
+        }
+    }
+    
+    return nil;
+}
+
+
+//____________________________________________________________________________________
+
+_String ProcessLiteralArgument (_String* data, _VariableContainer* theP, _ExecutionList* currentProgram)
+{
+    _String   errMsg;
+    
+    _Formula  expressionProcessor (*data, theP, currentProgram?&errMsg:nil);
+    
+    if (errMsg.sLength) {
+        currentProgram->ReportAnExecutionError (errMsg);
+    }
+    else {
+        _PMathObj expressionResult = expressionProcessor.Compute(0,theP);
+        if (expressionResult && expressionResult->ObjectClass()==STRING) {
+            return *((_FString*)expressionResult)->theString;
+        }
+    }
+    
+    return empty;
+}
+
+//____________________________________________________________________________________
+
+_AssociativeList*   ProcessDictionaryArgument (_String* data, _VariableContainer* theP, _ExecutionList* currentProgram)
+{
+    _String   errMsg;
+    _Formula  nameForm (*data,theP, currentProgram?&errMsg:nil);
+    if (errMsg.sLength && currentProgram) {
+        currentProgram->ReportAnExecutionError (errMsg);
+    } else {
+        _PMathObj formRes = nameForm.Compute();
+        if (formRes && formRes->ObjectClass()==ASSOCIATIVE_LIST) {
+            formRes->AddAReference();
+            return (_AssociativeList*)formRes;
+        }
+    }
+    return nil;
+}
+
+
+
+
+//____________________________________________________________________________________
+long    FindDataSetName (_String&s)
+{
+    return dataSetNamesList.Find (&s);
+}
+//____________________________________________________________________________________
+long    FindDataSetFilterName (_String&s)
+{
+    return dataSetFilterNamesList.Find (&s);
+}
+//____________________________________________________________________________________
+long    FindLikeFuncName (_String&s, bool tryAsAString)
+{
+    long try1 = likeFuncNamesList.Find (&s);
+    if (try1 < 0 && tryAsAString) {
+        _String s2 (ProcessLiteralArgument(&s, nil));
+        try1 = likeFuncNamesList.Find(&s2);
+    }
+    return try1;
+}
+
+//____________________________________________________________________________________
+long    FindModelName (_String&s)
+{
+    if (s.Equal (&useLastModel)) {
+        return lastMatrixDeclared;
+    }
+
+    return modelNames.Find (&s);
+}
+
+//____________________________________________________________________________________
+_LikelihoodFunction*    FindLikeFuncByName (_String&s)
+{
+    long i = FindLikeFuncName(s);
+    if (i>=0) {
+        return (_LikelihoodFunction*)likeFuncList (i);
+    }
+    return nil;
+}
+
+//____________________________________________________________________________________
+long    FindSCFGName (_String&s)
+{
+    return scfgNamesList.Find (&s);
+}
+
+//____________________________________________________________________________________
+long    FindBFFunctionName (_String&s, _VariableContainer* theP)
+{
+    if (theP) {
+        _String testName = *(theP->GetName()) & '.' & s;
+
+        long cutAt = testName.sLength - s.sLength - 2;
+        do {
+            long idx = batchLanguageFunctionNames.Find (&testName);
+            if (idx >= 0) {
+                s = testName;
+                return idx;
+            }
+            testName.Trim (0,cutAt);
+            cutAt = testName.FindBackwards('.',0,-1)-1;
+        } while (cutAt >= 0);
+    }
+
+    return batchLanguageFunctionNames.Find (&s);
+}
+
+
+//____________________________________________________________________________________
+long    FindBgmName (_String&s)
+{
+    return bgmNamesList.Find (&s);
+}
+
+
+
+
+//__________________________________________________________
+
+long  AddFilterToList (_String& partName,_DataSetFilter* theFilter, bool addP)
+{
+    FindUnusedObjectName (prefixDF,partName,dataSetFilterNamesList);
+    long k;
+
+    for (k=0; k<dataSetFilterNamesList.lLength; k++)
+        if (((_String*)dataSetFilterNamesList(k))->sLength==0) {
+            break;
+        }
+
+    if (addP) {
+        SetDataFilterParameters (partName, theFilter, true);
+    }
+
+    if (k==dataSetFilterNamesList.lLength) {
+        dataSetFilterList<<theFilter;
+        DeleteObject (theFilter);
+        dataSetFilterNamesList&& & partName;
+        return dataSetFilterNamesList.lLength-1;
+    }
+    dataSetFilterList.lData[k]=(long)theFilter;
+    dataSetFilterNamesList.Replace(k,&partName,true);
+    return k;
+}
+
+//__________________________________________________________
+long  AddDataSetToList (_String& theName,_DataSet* theDS)
+{
+    FindUnusedObjectName (prefixDS,theName,dataSetNamesList);
+    long k = dataSetNamesList.Find (&empty);
+    if (k==-1) {
+        dataSetList.AppendNewInstance (theDS);
+        dataSetNamesList&& & theName;
+        k = dataSetNamesList.lLength-1;
+    } else {
+        dataSetNamesList.Replace (k, &theName, true);
+        dataSetList.lData[k]     = (long)theDS;
+    }
+    return k;
+}
+
+
+//__________________________________________________________
+
+void KillDataFilterRecord (long dfID, bool addP)
+{
+    if (addP) {
+        SetDataFilterParameters (*(_String*)(dataSetFilterNamesList(dfID)), nil, false);
+    }
+
+    if (dfID<dataSetFilterList.lLength-1) {
+        DeleteObject(dataSetFilterList(dfID));
+        dataSetFilterList.lData [dfID] = 0;
+        dataSetFilterNamesList.Replace(dfID,&empty,true);
+    } else {
+        dataSetFilterList.Delete(dfID);
+        dataSetFilterNamesList.Delete(dfID);
+        if (dfID)
+            while (((_String*)dataSetFilterNamesList (--dfID))->sLength==0) {
+                dataSetFilterList.Delete(dfID);
+                dataSetFilterNamesList.Delete(dfID);
+                if (dfID==0) {
+                    break;
+                }
+            }
+    }
+}
+
+//__________________________________________________________
+
+void KillLFRecord (long lfID, bool completeKill)
+{
+    /* compile the list of variables which will no longer be referenced */
+
+    if (lfID>=0) {
+        _LikelihoodFunction *me = (_LikelihoodFunction*)likeFuncList (lfID);
+
+        if (completeKill) {
+            _SimpleList         wastedVars,
+                                otherVars,
+                                myVars,
+                                otherModels,
+                                wastedModels;
+
+
+
+            myVars  << me->GetIndependentVars();
+            myVars  << me->GetDependentVars();
+
+            for (unsigned long k=0UL; k<likeFuncList.lLength; k++)
+                if (k!=lfID) {
+                    if (((_String*)likeFuncNamesList(k))->sLength) {
+                        _LikelihoodFunction *lf = (_LikelihoodFunction*)likeFuncList (k);
+                        otherVars << lf->GetIndependentVars();
+                        otherVars << lf->GetDependentVars();
+                        for (long kk=lf->GetTheTrees().lLength-1; kk>=0; kk--) {
+                            _TheTree * thisTree = (_TheTree*)LocateVar(lf->GetTheTrees().lData[kk]);
+                            thisTree->CompileListOfModels (otherModels);
+                        }
+                    }
+                }
+
+            otherVars.Sort();
+            otherModels.Sort();
+
+            for (unsigned long k=0UL; k<myVars.lLength; k++)
+                if (otherVars.BinaryFind(myVars.lData[k])<0) {
+                    wastedVars << myVars.lData[k];
+                }
+
+            myVars.Clear();
+
+            for (long k=me->GetTheTrees().lLength-1; k>=0; k--) {
+                _TheTree * thisTree = (_TheTree*)LocateVar(me->GetTheTrees().lData[k]);
+                thisTree->CompileListOfModels (myVars);
+                _CalcNode * tNode = thisTree->DepthWiseTraversal (true);
+                while (tNode) {
+                    tNode->SetValue (new _Constant (tNode->BranchLength()),false);
+                    tNode = thisTree->DepthWiseTraversal();
+                }
+                thisTree->RemoveModel();
+            }
+
+            for (unsigned long k=0UL; k<myVars.lLength; k++)
+                if (otherModels.BinaryFind (myVars.lData[k])<0) {
+                    KillModelRecord (myVars.lData[k]);
+                }
+
+            for (unsigned long k=0; k<wastedVars.lLength; k++) {
+                //printf ("Deleting %ld (%s)\n", wastedVars.lData[k],  ->GetName()->getStr());
+                _Variable * check_me = LocateVar(wastedVars.lData[k]);
+                if (check_me) {
+                  DeleteVariable (*check_me->GetName());
+                }
+            }
+
+        }
+
+        if (lfID<likeFuncList.lLength-1) {
+            DeleteObject(likeFuncList(lfID));
+            likeFuncList.lData[lfID] = nil;
+            likeFuncNamesList.Replace(lfID,&empty,true);
+        } else {
+            likeFuncList.Delete(lfID);
+            likeFuncNamesList.Delete(lfID);
+            if (lfID)
+                while (((_String*)likeFuncNamesList (--lfID))->sLength==0) {
+                    likeFuncList.Delete(lfID);
+                    likeFuncNamesList.Delete(lfID);
+                    if (lfID==0) {
+                        break;
+                    }
+                }
+        }
+    }
+}
+
+//__________________________________________________________
+
+void KillLFRecordFull (long lfID)
+{
+    _LikelihoodFunction* lf = (_LikelihoodFunction*) likeFuncList (lfID);
+
+    long    k;
+    //for (k=lf->GetTheFilters().lLength-1; k>=0; k--)
+    //  KillDataFilterRecord (lf->GetTheFilters().lData[k]);
+
+    _SimpleList l;
+
+    lf->GetGlobalVars (l);
+
+    for (k=0; k<l.lLength; k++) {
+        DeleteVariable (*LocateVar(l.lData[k])->GetName());
+    }
+
+    l.Clear ();
+
+    for (k=lf->GetTheTrees().lLength-1; k>=0; k--) {
+        _TheTree * thisTree = (_TheTree*)LocateVar(lf->GetTheTrees().lData[k]);
+        thisTree->CompileListOfModels (l);
+        DeleteVariable (*thisTree->GetName());
+    }
+
+    for (k=0; k<l.lLength; k++) {
+        KillModelRecord (l.lData[k]);
+    }
+
+    KillLFRecord (lfID);
+}
+
+//__________________________________________________________
+
+void KillDataSetRecord (long dsID)
+{
+    if (dsID<dataSetList.lLength-1) {
+        DeleteObject(dataSetList(dsID));
+        dataSetList.lData[dsID] = 0;
+        dataSetNamesList.Replace(dsID,&empty,true);
+    } else {
+        dataSetList.Delete(dsID);
+        dataSetNamesList.Delete(dsID);
+        if (dsID)
+            while (((_String*)dataSetNamesList (--dsID))->sLength==0) {
+                dataSetList.Delete(dsID);
+                dataSetNamesList.Delete(dsID);
+                if (dsID==0) {
+                    break;
+                }
+            }
+    }
+}
+
+//__________________________________________________________
+
+void    KillExplicitModelFormulae (void)
+{
+    for (long i = 0; i < modelTypeList.lLength; i++)
+        if (modelTypeList.lData[i]) {
+            delete (_Formula*)(modelMatrixIndices.lData[i]);
+        }
+}
+
+
+//__________________________________________________________
+
+void KillModelRecord (long mdID)
+{
+    if (lastMatrixDeclared == mdID) {
+        lastMatrixDeclared = -1;
+    }
+
+    // SLKP 20110816
+    // can't delete matrices before checking that no other model depends on the
+
+
+    if (modelTypeList.lData[mdID]) {
+        delete (_Formula*)(modelMatrixIndices.lData[mdID]);
+    } else {
+        _Variable * modelMatrix = nil,
+                    * freqMatrix  = nil;
+
+        bool      multByFreqs   = false;
+
+
+
+        _SimpleList  saveTheseVariablesAux;
+        _AVLList     saveTheseVariables (&saveTheseVariablesAux);
+
+        for (long k = 0; k < modelNames.lLength; k++) {
+            if (k != mdID && ((_String*)modelNames(k))->sLength) {
+                if (modelTypeList.lData[k]) {
+                    _SimpleList dependantMatrices;
+                    ((_Formula*)(modelMatrixIndices.lData[k]))->ScanFForType (dependantMatrices, MATRIX);
+                    for (long k2 = 0; k2 < dependantMatrices.lLength; k2++) {
+                        saveTheseVariables.Insert((BaseRef)dependantMatrices.lData[k2]);
+                    }
+                } else {
+                    RetrieveModelComponents(k, modelMatrix, freqMatrix, multByFreqs);
+
+                    if (modelMatrix) {
+                        saveTheseVariables.Insert((BaseRef)modelMatrix->GetIndex());
+                    }
+                    if (freqMatrix) {
+                        saveTheseVariables.Insert((BaseRef)freqMatrix->GetIndex());
+                    }
+                }
+            }
+        }
+
+        RetrieveModelComponents(mdID, modelMatrix, freqMatrix, multByFreqs);
+        if (modelMatrix && saveTheseVariables.Find ((BaseRef)modelMatrix->GetIndex()) < 0) {
+            DeleteVariable (*modelMatrix->GetName());
+        }
+        if (freqMatrix && saveTheseVariables.Find ((BaseRef)freqMatrix->GetIndex()) < 0) {
+            DeleteVariable (*freqMatrix->GetName());
+        }
+    }
+
+    if (mdID<modelNames.lLength-1) {
+        modelMatrixIndices.lData[mdID] = -1;
+        modelTypeList.lData[mdID] = 0;
+        modelFrequenciesIndices.lData[mdID] = -1;
+        modelNames.Replace(mdID,&empty,true);
+    } else {
+        modelNames.Delete(mdID);
+        modelMatrixIndices.Delete (modelMatrixIndices.lLength-1);
+        modelFrequenciesIndices.Delete (modelFrequenciesIndices.lLength-1);
+        modelTypeList.Delete (modelTypeList.lLength-1);
+
+        if (mdID)
+            while (((_String*)modelNames (--mdID))->sLength==0) {
+                modelNames.Delete(mdID);
+                modelMatrixIndices.Delete (mdID);
+                modelFrequenciesIndices.Delete (mdID);
+                modelTypeList.Delete (mdID);
+                if (mdID == 0) {
+                    break;
+                }
+            }
+    }
+}
+
+//____________________________________________________________________________________
+//____________________________________________________________________________________
+_ExecutionList::_ExecutionList ()
+{
+    result              = nil;
+    currentCommand      = 0;
+    cli                 = nil;
+    profileCounter      = nil;
+    stdinRedirect       = nil;
+    stdinRedirectAux    = nil;
+    doProfile           = 0;
+    nameSpacePrefix     = nil;
+    
+    if (currentExecutionList) {
+        errorHandlingMode  = currentExecutionList->errorHandlingMode;
+        errorState         = currentExecutionList->errorState;
+    } else {
+        errorHandlingMode = HY_BL_ERROR_HANDLING_DEFAULT;
+        errorState = false;
+    }
+
+} // doesn't do much
+
+//____________________________________________________________________________________
+_ExecutionList::_ExecutionList (_String& source, _String* namespaceID, bool copySource, bool* successFlag)
+{
+    currentCommand = 0;
+    result         = nil;
+    cli            = nil;
+    profileCounter = nil;
+    doProfile      = 0;
+    stdinRedirect  = nil;
+    stdinRedirectAux = nil;
+    nameSpacePrefix = nil;
+    
+    if (namespaceID) {
+        SetNameSpace (*namespaceID);
+    }
+    if (copySource) {
+        sourceText.Duplicate (&source);
+    }
+    if (currentExecutionList) {
+        errorHandlingMode  = currentExecutionList->errorHandlingMode;
+        errorState         = currentExecutionList->errorState;
+    } else {
+        errorHandlingMode = HY_BL_ERROR_HANDLING_DEFAULT;
+        errorState = false;
+    }
+
+    bool result = BuildList (source, nil, false, true);
+    if (successFlag) {
+        *successFlag = result;
+    }
+}
+
+//____________________________________________________________________________________
+
+_ExecutionList::~_ExecutionList (void)
+{
+    if (cli) {
+        delete [] cli->values;
+        delete [] cli->stack;
+        delete cli;
+        cli = nil;
+    }
+
+    if (profileCounter) {
+        DeleteObject (profileCounter);
+        profileCounter = nil;
+    }
+
+    DeleteObject (stdinRedirect);
+    DeleteObject (stdinRedirectAux);
+    DeleteObject (nameSpacePrefix);
+
+    ResetFormulae();
+    DeleteObject (result);
+}
+
+//____________________________________________________________________________________
+
+BaseRef     _ExecutionList::makeDynamic (void)
+{
+    _ExecutionList * Res = (_ExecutionList*)checkPointer(new _ExecutionList);
+
+    memcpy ((char*)Res, (char*)this, sizeof (_ExecutionList));
+
+    Res->nInstances         = 1;
+    Res->Duplicate          (this);
+    Res->cli                = nil;
+    Res->profileCounter     = nil;
+    Res->doProfile          = doProfile;
+    Res->errorHandlingMode  = errorHandlingMode;
+    Res->errorState         = errorState;
+
+    if(result) {
+        Res->result = (_PMathObj)result->makeDynamic();
+    }
+
+    return Res;
+}
+
+//____________________________________________________________________________________
+
+void        _ExecutionList::Duplicate   (BaseRef source)
+{
+    _List::Duplicate    (source);
+
+    _ExecutionList* s = (_ExecutionList*)source;
+
+    if (s->result) {
+        s->result=(_PMathObj)result->makeDynamic();
+    }
+
+    errorHandlingMode  = s->errorHandlingMode;
+    errorState         = s->errorState;
+}
+
+
+//____________________________________________________________________________________
+void    _ExecutionList::ReportAnExecutionError (_String errMsg, bool doCurrentCommand, bool appendToExisting) {
+    if (doCurrentCommand) {
+        _ElementaryCommand *theCommand = FetchLastCommand();
+        if (theCommand) {
+            errMsg = errMsg & " in call to " & _HY_ValidHBLExpressions.RetrieveKeyByPayload(theCommand->GetCode());
+        }
+    }
+    errorState = true;
+    switch (errorHandlingMode) {
+        case HY_BL_ERROR_HANDLING_SOFT:
+            if (appendToExisting) {
+              _FString * existing = (_FString*) FetchObjectFromVariableByType(&_hyLastExecutionError, STRING);
+              if (existing) {
+                errMsg = *existing->theString & '\n' & errMsg;
+              }
+            }
+            setParameter(_hyLastExecutionError, new _FString (errMsg, false), false);
+            
+            break;
+        default: 
+            WarnError (errMsg);
+    }
+}
+
+//____________________________________________________________________________________
+_String*    _ExecutionList::FetchFromStdinRedirect (void)
+// grab a string from the front of the input queue
+// complain if nothing is left
+{
+    if (!stdinRedirect) {
+        WarnError ("No input buffer was given for a redirected standard input read.");
+        return new _String;
+    }
+    long d = stdinRedirect->First();
+    if (d<0) {
+        WarnError ("Ran out of input in buffer during a redirected standard input read.");
+        return new _String;
+    }
+    _String *sendBack = (_String*)stdinRedirect->GetXtra (d);
+    sendBack->nInstances++;
+    stdinRedirect->Delete ((*(_List*)stdinRedirect->dataList)(d),true);
+    return sendBack;
+}
+
+//____________________________________________________________________________________
+
+_String       _ExecutionList::GetFileName     (void)  {
+    if (sourceFile.sLength) {
+        return sourceFile;
+    } else {
+        if (pathNames.lLength)
+            return *(_String*)pathNames.GetElement (-1);
+    }
+    return empty;
+}
+// doesn't do much
+//____________________________________________________________________________________
+
+_PMathObj       _ExecutionList::Execute     (void)      // run this execution list
+{
+
+    setParameter(_hyLastExecutionError, new _MathObject, false);
+    
+    _ExecutionList*      stashCEL = currentExecutionList;
+    callPoints << currentCommand;
+    executionStack       << this;
+
+    _String             dd (GetPlatformDirectoryChar());
+
+    _FString            bp  (baseDirectory, false),
+                        lp  (libDirectory, false),
+                        ds  (dd),
+                        cfp (pathNames.lLength?*(_String*)pathNames(pathNames.lLength-1):empty),
+                        * stashed = (_FString*)FetchObjectFromVariableByType (&pathToCurrentBF, STRING);
+
+    setParameter        (platformDirectorySeparator, &ds);
+    setParameter        (hyphyBaseDirectory, &bp);
+    setParameter        (hyphyLibDirectory, &lp);
+
+    if (stashed) {
+        stashed = (_FString*)stashed->makeDynamic();
+    }
+    setParameter        (pathToCurrentBF,&cfp);
+
+    DeleteObject        (result);
+    result               = nil;
+    currentExecutionList = this;
+    currentCommand       = 0;
+
+    terminateExecution  = false;
+    skipWarningMessages = false;
+
+    while (currentCommand<lLength) {
+        if (doProfile == 1 && profileCounter) {
+            long        instCounter = currentCommand;
+            _Parameter  timeDiff    = 0.0;
+
+            TimerDifferenceFunction (false);
+            (((_ElementaryCommand**)lData)[currentCommand])->Execute(*this);
+            timeDiff   = TimerDifferenceFunction(true);
+
+            if (profileCounter) {
+                profileCounter->theData[instCounter*2]   += timeDiff;
+                profileCounter->theData[instCounter*2+1] += 1.0;
+            }
+        } else {
+            (((_ElementaryCommand**)lData)[currentCommand])->Execute(*this);
+        }
+
+        if (terminateExecution) {
+            break;
+        }
+    }
+    currentCommand = callPoints.lData[callPoints.lLength-1];
+    callPoints.Delete (callPoints.lLength-1);
+    currentExecutionList = stashCEL;
+
+    if (stashed) {
+        setParameter        (pathToCurrentBF,stashed,false);
+    }
+
+    executionStack.Delete (executionStack.lLength-1);
+    if (result == nil) {
+        result = new _MathObject();
+    }
+
+    return result;
+}
+
+//____________________________________________________________________________________
+
+long        _ExecutionList::ExecuteAndClean     (long g, _String* fName)        // run this execution list
+{
+    long    f = -1;
+    Execute ();
+
+    if (fName && !terminateExecution) {
+        f = batchLanguageFunctionNames.Find (fName);
+    }
+
+    terminateExecution      = false;
+    skipWarningMessages     = false;
+
+    while (g<batchLanguageFunctionNames.lLength) {
+        batchLanguageFunctionNames.Delete           (g);
+        batchLanguageFunctionParameters.Delete      (g);
+        batchLanguageFunctions.Delete               (g);
+        batchLanguageFunctionClassification.Delete  (g);
+        batchLanguageFunctionParameterLists.Delete  (g);
+    }
+    return f;
+}
+
+//____________________________________________________________________________________
+
+bool        _ExecutionList::TryToMakeSimple     (void)
+{
+    _SimpleList     varList,
+                    formulaeToConvert,
+                    parseCodes;
+
+    long            stackDepth  = 0;
+
+    bool            status      = true;
+
+    for (unsigned long k = 0; k<lLength && status; k++) {
+        _ElementaryCommand * aStatement = (_ElementaryCommand*)(*this)(k);
+        switch (aStatement->code) {
+        case 0: {
+            _String * formulaString = (_String*)aStatement->parameters(0);
+
+            if (formulaString->sData[formulaString->sLength-1]!='}') {
+                _Formula *f  = new _Formula,
+                *f2 = new _Formula;
+
+                checkPointer ((BaseRef)(f&&f2));
+
+                _FormulaParsingContext fpc (nil, nameSpacePrefix);
+
+                long          parseCode = Parse(f,*formulaString,fpc,f2);
+
+                if (parseCode == HY_FORMULA_EXPRESSION || parseCode == HY_FORMULA_VARIABLE_VALUE_ASSIGNMENT) {
+                    if (f->AmISimple(stackDepth,varList)) {
+                        aStatement->simpleParameters<<parseCode;
+                        aStatement->simpleParameters<<(long)f;
+                        aStatement->simpleParameters<<(long)f2;
+                        aStatement->simpleParameters<<fpc.assignmentRefID();
+
+                        formulaeToConvert << (long)f;
+
+                        if (HY_FORMULA_VARIABLE_VALUE_ASSIGNMENT) {
+                            parseCodes        << fpc.assignmentRefID();
+                        } else {
+                            parseCodes        << -1;
+                        }
+                        break;
+                    }
+                }
+
+                delete f;
+                delete f2;
+            }
+            status = false;
+            break;
+        }
+
+        case 4:
+            parseCodes        << -1;
+            if (aStatement->simpleParameters.lLength == 3 || aStatement->parameters.lLength) {
+                if (aStatement->parameters.lLength) {
+                    _Formula f;
+                    _FormulaParsingContext fpc (nil, nameSpacePrefix);
+
+                    long status = Parse (&f, *(_String*)aStatement->parameters(0), fpc, nil);
+
+                    if (status== HY_FORMULA_EXPRESSION) {
+                        aStatement->simpleParameters<<long(f.makeDynamic());
+                    }
+                }
+
+
+                _Formula *cf  = ((_Formula*)aStatement->simpleParameters(2));
+                if (cf->AmISimple(stackDepth,varList)) {
+                    formulaeToConvert << (long)cf;
+                } else {
+                    status = false;
+                }
+            }
+            break;
+
+        default:
+            status = false;
+        }
+        if (status == false) {
+            ReportWarning (_String ("Failed to compile an execution list: offending command was\n") & _String (((_String*)aStatement->toStr())));
+        }
+    }
+
+    if (status) {
+        cli = new _CELInternals;
+        checkPointer (cli);
+        checkPointer (cli->values = new _SimpleFormulaDatum[varList.lLength+1]);
+        checkPointer (cli->stack  = new _SimpleFormulaDatum[stackDepth+1]);
+
+        _SimpleList  avlData;
+        _AVLListX    avlList (&avlData);
+
+        for (unsigned long fi = 0; fi < formulaeToConvert.lLength; fi++) {
+            ((_Formula*)formulaeToConvert(fi))->ConvertToSimple (varList);
+        }
+
+        for (unsigned long vi = 0; vi < varList.lLength; vi++) {
+            avlList.Insert ((BaseRef)varList.lData[vi], vi);
+        }
+
+        for (unsigned long ri = 0; ri<parseCodes.lLength; ri++) {
+            if (parseCodes.lData[ri] < 0) {
+                cli->storeResults << -1;
+            } else {
+                cli->storeResults << avlList.GetXtra (avlList.Find ((BaseRef) parseCodes.lData[ri]));
+            }
+        }
+        cli->varList.Duplicate(&varList);
+    }
+
+    return status;
+}
+
+//____________________________________________________________________________________
+
+void        _ExecutionList::ExecuteSimple       (void)
+{
+    PopulateArraysForASimpleFormula (cli->varList, cli->values);
+    Execute();
+
+    for (long vi2 = 0; vi2 < cli->varList.lLength; vi2++) {
+        _Variable * mv = LocateVar(cli->varList.lData[vi2]);
+        if (mv->ObjectClass() == NUMBER) {
+            mv->SetValue (new _Constant (cli->values[vi2].value),false);
+        }
+    }
+}
+
+//____________________________________________________________________________________
+
+void        _ExecutionList::ResetFormulae       (void)      // run this execution list
+{
+    currentCommand = 0;
+    while (currentCommand<lLength) {
+        _ElementaryCommand* thisCommand = ((_ElementaryCommand**)lData)[currentCommand];
+        if (thisCommand->code==0) {
+            if (thisCommand->simpleParameters.lLength) {
+                //printf ("[ResetFormulae] %s\n", thisCommand->sData);
+                _Formula* f = (_Formula*)
+                              thisCommand->simpleParameters.lData[1],
+                              *f2 = (_Formula*)
+                                    thisCommand->simpleParameters.lData[2] ;
+                if (f) {
+                    delete f;
+                }
+                if (f2) {
+                    delete f2;
+                }
+                thisCommand->simpleParameters.Clear();
+                long k = listOfCompiledFormulae.Find((long)thisCommand);
+                if (k >= 0) {
+                    listOfCompiledFormulae.Delete(k);
+                    //printf ("[ResetFormulae:listOfCompiledFormulae %d]\n",k);
+                    compiledFormulaeParameters.Delete(k);
+                    //printf ("[ResetFormulae:compiledFormulaeParameters %d]\n",k);
+                }
+            }
+        } else {
+            if (thisCommand->code==4) {
+                if (thisCommand->parameters.lLength && thisCommand->simpleParameters.lLength == 3) {
+                    _Formula* f = (_Formula*)thisCommand->simpleParameters.lData[2];
+                    if (f) {
+                        delete f;
+                    }
+                    thisCommand->simpleParameters.Delete (2);
+                }
+            }
+        }
+        currentCommand++;
+    }
+}
+//____________________________________________________________________________________
+
+BaseRef  _ExecutionList::toStr (void)
+{
+    _String *result = new _String (1,true),
+    step ("\n\nStep"),
+    dot (".");
+
+    for (unsigned long i=0; i<countitems(); i++) {
+        (*result) << &step;
+        _String lineNumber (i);
+        (*result)<< &lineNumber;
+        (*result)<< '.';
+        result->AppendNewInstance ((_String*)(*this)(i)->toStr());
+    }
+    result->Finalize();
+    return result;
+}
+
+//____________________________________________________________________________________
+
+void     _ExecutionList::ResetNameSpace (void)
+{
+    DeleteObject (nameSpacePrefix);
+    nameSpacePrefix = nil;
+}
+
+//____________________________________________________________________________________
+
+void     _ExecutionList::SetNameSpace (_String nID)
+{
+    ResetNameSpace ();
+    nameSpacePrefix = new _VariableContainer(nID);
+    checkPointer(nameSpacePrefix);
+}
+
+//____________________________________________________________________________________
+
+_String*     _ExecutionList::GetNameSpace ()
+{
+    if (nameSpacePrefix) {
+        return nameSpacePrefix->GetName();
+    }
+    return nil;
+}
+
+//____________________________________________________________________________________
+
+_String  _ExecutionList::AddNameSpaceToID (_String& theID, _String * extra)
+{
+    _String check_dereferences,
+            name_space;
+            
+    if (extra && extra->sLength) {
+        if (nameSpacePrefix) {
+            name_space = (*nameSpacePrefix->GetName())&'.'& *extra;
+        } else {
+            name_space = *extra;
+        }
+    } else {
+        if (nameSpacePrefix) {
+            name_space = (*nameSpacePrefix->GetName());        
+        }
+    }
+            
+    return AppendContainerName (theID, &name_space);
+}
+
+//____________________________________________________________________________________
+
+_String  _ExecutionList::TrimNameSpaceFromID (_String& theID)
+{
+    if (nameSpacePrefix) {
+        if (theID.startswith(*nameSpacePrefix->GetName())) {
+            return theID.Cut(nameSpacePrefix->GetName()->sLength+1,-1);
+        }
+    }
+    return theID;
+}
+
+//____________________________________________________________________________________
+
+
+_String  blFor                  ("for("),               // moved
+         blWhile                    ("while("),         // moved
+         blFunction                 ("function "),      // moved
+         blFFunction                ("ffunction "),     // moved
+         blLFunction                ("lfunction "),     // moved
+         blReturn                   ("return "),        // moved
+         blReturn2              ("return("),            // moved
+         blIf                       ("if("),            // moved
+         blElse                     ("else"),           // moved
+         blDo                       ("do{"),            // moved
+         blBreak                    ("break;"),         // moved
+         blContinue             ("continue;"),          // moved
+         blInclude              ("#include"),           // moved
+         blDataSet              ("DataSet "),           // moved
+         blDataSetFilter            ("DataSetFilter "),
+         blConstructCM          ("ConstructCategoryMatrix("),
+         blTree                     ("Tree "),
+         blLF                       ("LikelihoodFunction "),
+         blLF3                  ("LikelihoodFunction3 "),
+         blMolClock                 ("MolecularClock("),
+         blfprintf              ("fprintf("),
+         blGetString                ("GetString("),
+         blfscanf                   ("fscanf("),
+         blsscanf                   ("sscanf("),
+         blExport                   ("Export("),
+         blReplicate                ("ReplicateConstraint("),
+         blImport                   ("Import"),
+         blCategory             ("category "),
+         blClearConstraints         ("ClearConstraints("),
+         blSetDialogPrompt      ("SetDialogPrompt("),
+         blModel                    ("Model "),
+         blChoiceList               ("ChoiceList("),
+         blOpenDataPanel            ("OpenDataPanel("),
+         blGetInformation           ("GetInformation("),
+         blExecuteCommands      ("ExecuteCommands("),
+         blExecuteAFile         ("ExecuteAFile("),
+         blLoadFunctionLibrary      ("LoadFunctionLibrary("),
+         blOpenWindow               ("OpenWindow("),
+         blSpawnLF                  ("SpawnLikelihoodFunction("),
+         blDifferentiate            ("Differentiate("),
+         blFindRoot             ("FindRoot("),
+         blMPIReceive               ("MPIReceive("),
+         blMPISend                  ("MPISend("),
+         blGetDataInfo              ("GetDataInfo("),
+         blStateCounter             ("StateCounter("),
+         blIntegrate                ("Integrate("),
+         blLFCompute                ("LFCompute("),
+         blGetURL                   ("GetURL("),
+         blDoSQL                    ("DoSQL("),
+         blTopology                 ("Topology "),
+         blAlignSequences           ("AlignSequences("),
+         blGetNeutralNull           ("GetNeutralNull("),
+         blHBLProfile               ("#profile"),
+         blDeleteObject         ("DeleteObject("),
+         blRequireVersion           ("RequireVersion("),
+         blSCFG                     ("SCFG "),
+         blNN                       ("NeuralNet "),
+         blBGM                      ("BayesianGraphicalModel "),
+         blSimulateDataSet          ("SimulateDataSet"),
+         blAssert                   ("assert(");
+
+
+
+bool        _ExecutionList::BuildList   (_String& s, _SimpleList* bc, bool processed, bool empty_is_success)
+{
+    if (terminateExecution) {
+        return false;
+    }
+
+    char * savePointer = s.sData;
+    
+    _SimpleList          triePath;
+
+    while (s.Length()) { // repeat while there is stuff left in the buffer
+        _String currentLine (_ElementaryCommand::FindNextCommand (s,true));
+
+        if (currentLine.getChar(0)=='}') {
+            currentLine.Trim(1,-1);
+        }
+
+        if (!currentLine.Length()) {
+            continue;
+        }
+        
+        triePath.Clear(false);
+        long prefixTreeCode = _HY_ValidHBLExpressions.Find (currentLine, &triePath, true);
+        
+        _List *pieces = nil;
+        _HBLCommandExtras *commandExtraInfo = nil;
+        
+        if (prefixTreeCode != HY_TRIE_NOTFOUND) {
+            prefixTreeCode = _HY_ValidHBLExpressions.GetValue(prefixTreeCode);
+            long commandExtra = _HY_HBLCommandHelper.FindLong (prefixTreeCode);
+            if (commandExtra >= 0) { // pre-trim all strings as needed
+                commandExtraInfo = (_HBLCommandExtras*)_HY_HBLCommandHelper.GetXtra (commandExtra);
+                if (commandExtraInfo->extract_conditions.lLength > 0) {
+                    pieces = new _List;
+                    long upto = _ElementaryCommand::ExtractConditions (currentLine, commandExtraInfo->cut_string,*pieces,commandExtraInfo->extract_condition_separator),
+                         condition_index_match = commandExtraInfo->extract_conditions.Find(pieces->lLength);
+                    if (condition_index_match < 0) {
+                        // try to see if the command accepts a variable number of arguments (at least X)
+                       _String parseFail;
+                       if (commandExtraInfo->extract_conditions.lLength == 1 && commandExtraInfo->extract_conditions.lData[0] < 0) {
+                            if (pieces->lLength < -commandExtraInfo->extract_conditions.lData[0]) {
+                                 parseFail = _String("Incorrect number of arguments (") & (long) pieces->lLength & ") supplied: expected at least " & _String (-commandExtraInfo->extract_conditions.lData[0]) & ", while processing '"& currentLine.Cut (0, upto) & "'. ";
+                             }
+                        } else {
+                            parseFail = _String("Incorrect number of arguments (") & (long) pieces->lLength & ") supplied: expected one of " & _String ((_String*)commandExtraInfo->extract_conditions.toStr()) & ", while processing '"& currentLine.Cut (0, upto) & "'. ";
+                        }
+                        if (parseFail.sLength) {
+                            if (currentExecutionList) {
+                                currentExecutionList->ReportAnExecutionError(parseFail, false, true);
+                            } else {
+                                acknError (parseFail);
+                            }
+                            DeleteObject (pieces);
+                            return false;  
+                        }
+                    }
+                    if (commandExtraInfo->do_trim) {
+                        currentLine.Trim (upto, -1);
+                    }
+                }
+            }
+        }
+        
+        bool handled = false;
+               
+        switch (prefixTreeCode) {
+            case HY_HBL_COMMAND_FOR:
+                _ElementaryCommand::BuildFor (currentLine, *this, *pieces);
+                handled = true;
+                break;
+            case HY_HBL_COMMAND_WHILE:
+                _ElementaryCommand::BuildWhile (currentLine, *this, *pieces);
+                handled = true;
+                break;
+            case HY_HBL_COMMAND_BREAK:
+            case HY_HBL_COMMAND_CONTINUE:
+                if (bc) {
+                    AppendNewInstance(new _ElementaryCommand);
+                    (*bc) << ((prefixTreeCode == HY_HBL_COMMAND_BREAK) ? (countitems()-1) : (-(long)countitems()+1));
+                } else {
+                    WarnError (currentLine & " only makes sense in the context of a loop.");
+                    return false;
+                }
+                handled = true;
+                break;
+            case HY_HBL_COMMAND_SET_DIALOG_PROMPT:
+            case HY_HBL_COMMAND_HARVEST_FREQUENCIES:
+            case HY_HBL_COMMAND_OPTIMIZE:
+            case HY_HBL_COMMAND_COVARIANCE_MATRIX:
+            case HY_HBL_COMMAND_LFCOMPUTE:
+            case HY_HBL_COMMAND_SELECT_TEMPLATE_MODEL:
+            case HY_HBL_COMMAND_USE_MODEL:
+            case HY_HBL_COMMAND_SET_PARAMETER:
+            case HY_HBL_COMMAND_ASSERT:
+            case HY_HBL_COMMAND_REQUIRE_VERSION:
+            case HY_HBL_COMMAND_DELETE_OBJECT:
+            case HY_HBL_COMMAND_CLEAR_CONSTRAINTS:
+            case HY_HBL_COMMAND_MOLECULAR_CLOCK:
+            case HY_HBL_COMMAND_GET_URL:
+            case HY_HBL_COMMAND_GET_STRING:
+            case HY_HBL_COMMAND_EXPORT:
+            case HY_HBL_COMMAND_DIFFERENTIATE:
+            case HY_HBL_COMMAND_FPRINTF:
+                _ElementaryCommand::ExtractValidateAddHBLCommand (currentLine, prefixTreeCode, pieces, commandExtraInfo, *this);
+                handled = true;
+                break;
+                
+        }
+        
+        if (handled)
+            DeleteObject (pieces);
+        
+        // 20111212: this horrendous switch statement should be replaced with a 
+        // prefix tree lookup 
+
+        if (!handled) {
+            if (currentLine.startswith (blFunction)||currentLine.startswith (blFFunction)||currentLine.startswith (blLFunction)) { // function declaration
+                _ElementaryCommand::ConstructFunction (currentLine, *this);
+            } else if (currentLine.startswith (blReturn) || currentLine.startswith (blReturn2)) { // function return statement
+                _ElementaryCommand::ConstructReturn (currentLine, *this);
+            } else if (currentLine.startswith (blIf)) { // if-then-else statement
+                _ElementaryCommand::BuildIfThenElse (currentLine, *this, bc);
+            } else if (currentLine.startswith (blElse)) { // else clause of an if-then-else statement
+                if (lastif.countitems()) {
+                    long    temp = countitems(),
+                            lc   = lastif.countitems(),
+                            lif  = lastif.lData[lc-1];
+
+                    _ElementaryCommand      * stuff = new _ElementaryCommand ();
+                    stuff->MakeJumpCommand  (nil,0,0,*this);
+                    AppendNewInstance       (stuff);
+                    currentLine.Trim        (4,-1);
+
+                    long  index         = currentLine.Length()-1,
+                          scopeIn     = 0;
+
+                    while (currentLine.sData[scopeIn]=='{' && currentLine.sData[index]=='}') {
+                        scopeIn++;
+                        index--;
+                    }
+
+                    if (scopeIn) {
+                        currentLine.Trim (scopeIn,index);
+                    }
+
+                    BuildList (currentLine,bc,true);
+
+                    if (lif<0 || lif>=lLength) {
+                        WarnError ("'else' w/o an if to latch on to...");
+                        return false;
+                    }
+
+                    ((_ElementaryCommand*)((*this)(lif)))->MakeJumpCommand(nil,-1,temp+1,*this);
+                    ((_ElementaryCommand*)(*this)(temp))->simpleParameters[0]=countitems();
+
+                    while (lastif.countitems()>=lc) {
+                        lastif.Delete(lastif.countitems()-1);
+                    }
+                } else {
+                    WarnError ("'else' w/o an if to latch on to...");
+                    return false;
+                }
+
+            } else if (currentLine.startswith (blDo)) { // do {} while statement
+                _ElementaryCommand::BuildDoWhile (currentLine, *this);
+            }  else if (currentLine.startswith (blInclude)) { // #include
+                _ElementaryCommand::ProcessInclude (currentLine, *this);
+            } else if (currentLine.startswith (blDataSet)) { // data set definition
+                _ElementaryCommand::ConstructDataSet (currentLine, *this);
+            } else if (currentLine.startswith (blDataSetFilter)) { // data set filter definition
+                _ElementaryCommand::ConstructDataSetFilter (currentLine, *this);
+            } else if (currentLine.startswith (blConstructCM)) { // construct category assignments matrix
+                _ElementaryCommand::ConstructCategoryMatrix (currentLine, *this);
+            } else if (currentLine.startswith (blTree) || currentLine.startswith (blTopology)) { // tree definition
+                _ElementaryCommand::ConstructTree (currentLine, *this);
+            } else if (currentLine.startswith (blLF) || currentLine.startswith (blLF3)) { // LF definition
+                _ElementaryCommand::ConstructLF (currentLine, *this);
+            } else if (currentLine.startswith (blfscanf) || currentLine.startswith (blsscanf)) { // fscanf call
+                _ElementaryCommand::ConstructFscanf (currentLine, *this);
+            } else if (currentLine.startswith (blReplicate)) { // replicate constraint statement
+                _ElementaryCommand::ConstructReplicateConstraint (currentLine, *this);
+            } else if (currentLine.startswith (blCategory)) { // category variable declaration
+                _ElementaryCommand::ConstructCategory (currentLine, *this);
+            } else if (currentLine.startswith (blGetNeutralNull)) { // select a template model
+                _ElementaryCommand::ConstructGetNeutralNull (currentLine, *this);
+            } else if (currentLine.startswith (blModel)) { // Model declaration
+                _ElementaryCommand::ConstructModel (currentLine, *this);
+            } else if (currentLine.startswith (blChoiceList)) { // choice list
+                _ElementaryCommand::ConstructChoiceList (currentLine, *this);
+            } else if (currentLine.startswith (blOpenDataPanel)) { // open data panel window
+                _ElementaryCommand::ConstructOpenDataPanel (currentLine, *this);
+            } else if (currentLine.startswith (blGetInformation)) { // get information
+                _ElementaryCommand::ConstructGetInformation (currentLine, *this);
+            } else if (currentLine.startswith (blExecuteCommands) || currentLine.startswith (blExecuteAFile) || currentLine.startswith (blLoadFunctionLibrary))
+                // execute commands
+            {
+                _ElementaryCommand::ConstructExecuteCommands (currentLine, *this);
+            } else if (currentLine.startswith (blOpenWindow)) { // execute commands
+                _ElementaryCommand::ConstructOpenWindow (currentLine, *this);
+            } else if (currentLine.startswith (blSpawnLF)) { // execute commands
+                _ElementaryCommand::ConstructSpawnLF (currentLine, *this);
+            } else if (currentLine.startswith (blFindRoot)||currentLine.startswith (blIntegrate))
+                // find a root of an expression in an interval
+                // or an integral
+            {
+                _ElementaryCommand::ConstructFindRoot (currentLine, *this);
+            } else if (currentLine.startswith (blMPISend)) { // MPI Send
+                _ElementaryCommand::ConstructMPISend (currentLine, *this);
+            } else if (currentLine.startswith (blMPIReceive)) { // MPI Receive
+                _ElementaryCommand::ConstructMPIReceive (currentLine, *this);
+            } else if (currentLine.startswith (blGetDataInfo)) { // Get Data Info
+                _ElementaryCommand::ConstructGetDataInfo (currentLine, *this);
+            } else if (currentLine.startswith (blStateCounter)) { // Get Data Info
+                _ElementaryCommand::ConstructStateCounter (currentLine, *this);
+            } else if (currentLine.startswith (blDoSQL)) { // Do SQL
+                _ElementaryCommand::ConstructDoSQL (currentLine, *this);
+            } else if (currentLine.startswith (blAlignSequences)) { // Do AlignSequences
+                _ElementaryCommand::ConstructAlignSequences (currentLine, *this);
+            } else if (currentLine.startswith (blHBLProfile)) { // #profile
+                _ElementaryCommand::ConstructProfileStatement (currentLine, *this);
+            } else if (currentLine.startswith (blSCFG)) { // SCFG definition
+                _ElementaryCommand::ConstructSCFG (currentLine, *this);
+            } else if (currentLine.startswith (blNN)) { // Neural Net definition
+                _ElementaryCommand::ConstructNN (currentLine, *this);
+            } else if (currentLine.startswith (blBGM)) {    // Bayesian Graphical Model definition
+                _ElementaryCommand::ConstructBGM (currentLine, *this);
+            } 
+            // plain ol' formula - parse it as such!
+            else {
+                _String checker (currentLine);
+                if (_ElementaryCommand::FindNextCommand (checker).Length()==currentLine.Length()) {
+                    if (currentLine.Length()>1)
+                        while (currentLine[currentLine.Length()-1]==';') {
+                            currentLine.Trim (0,currentLine.Length()-2);
+                        }
+                    else {
+                        continue;
+                    }
+                    _ElementaryCommand* oddCommand = new _ElementaryCommand(currentLine);
+                    oddCommand->code = 0;
+                    oddCommand->parameters&&(&currentLine);
+                    AppendNewInstance (oddCommand);
+                } else {
+                    while (currentLine.Length()) {
+                        _String part (_ElementaryCommand::FindNextCommand (currentLine));
+                        BuildList (part,bc,processed);
+                    }
+                }
+            }
+            
+            /*if (currentLine.sLength > 1 || currentLine.sLength == 1 && currentLine.getChar(0) != ';'){
+                WarnError (_String ("Missing semicolon before ") & currentLine);
+                return false;
+            }*/
+        }
+    }
+    s.sData = savePointer;
+    s.DuplicateErasing (&empty);
+    return empty_is_success || countitems();
+}
+
+//____________________________________________________________________________________
+
+_ElementaryCommand::_ElementaryCommand (void)
+{
+    code = -1;
+}
+
+//____________________________________________________________________________________
+
+_ElementaryCommand::_ElementaryCommand (long ccode)
+{
+    code = ccode;
+}
+
+//____________________________________________________________________________________
+
+_ElementaryCommand::_ElementaryCommand (_String& s)
+{
+    code = -1;
+    _String::Duplicate (&s);
+}
+
+//____________________________________________________________________________________
+_ElementaryCommand::~_ElementaryCommand (void)
+{
+    if (nInstances==1) {
+        if (code==4) {
+            if (simpleParameters.lLength>2) {
+                _Formula* f = (_Formula*)simpleParameters(2);
+                delete (f);
+            }
+        } else if (code==0) {
+            if (simpleParameters.lLength) {
+                //long k = listOfCompiledFormulae.Find ((long)this);
+                //listOfCompiledFormulae.Delete (k);
+                //compiledFormulaeParameters.Delete (k);
+
+                _Formula* f = (_Formula*)simpleParameters(2);
+                delete (f);
+                f = (_Formula*)simpleParameters(1);
+                delete(f);
+                simpleParameters.Clear();
+            }
+        } else if ((code==6)||(code==9)) {
+            for (long i = 0; i<simpleParameters.lLength; i++) {
+                _Formula* f = (_Formula*)simpleParameters(i);
+                delete (f);
+            }
+        }
+    }
+
+}
+
+//____________________________________________________________________________________
+BaseRef   _ElementaryCommand::makeDynamic (void)
+{
+    _ElementaryCommand * nec = new _ElementaryCommand;
+    if (!nec) {
+        return nil;
+    }
+    nec->code = code;
+
+    //memcpy ((char*)Res, (char*)this, sizeof (_ElementaryCommand));
+    //if (code == 4 || code==6 || code==9 || code==0)
+    //nInstances++;
+
+    nec->nInstances = 1;
+    nec->Duplicate (this);
+    return nec;
+}
+
+//____________________________________________________________________________________
+
+void      _ElementaryCommand::Duplicate (BaseRef source)
+{
+    _ElementaryCommand* sec = (_ElementaryCommand*)source;
+
+    //if (code == 0)
+    //_String::DuplicateErasing (source);
+    //else
+    _String::Duplicate (source);
+
+    parameters.Duplicate(&sec->parameters);
+    if (code != 0) {
+        simpleParameters.Duplicate(&sec->simpleParameters);
+    }
+}
+
+//____________________________________________________________________________________
+
+_String _hblCommandAccessor (_ExecutionList* theList, long index) {
+    if (theList) {
+        if (index >= 0) {
+            if (index < theList->lLength) {
+                _ElementaryCommand * aCommand = (_ElementaryCommand*)theList->GetItem (index);
+                return _String ((_String*)aCommand->toStr());
+            } else {
+                return "<END EXECUTION>";
+            }
+        }
+    }
+    return _String ("command index ") & index;
+}
+
+//____________________________________________________________________________________
+
+BaseRef   _ElementaryCommand::toStr      (void)
+{
+    _String result, *converted = nil;
+    long k;
+    switch (code) {
+
+    case 0: // formula reparser
+        converted = (_String*)((parameters(0))->toStr());
+        result    = *converted;
+        break;
+
+    case 4:
+
+        result = "Branch ";
+        if (simpleParameters.countitems()==3) {
+            converted = (_String*)((_Formula*)simpleParameters(2))->toStr();
+            result = result& "under condition '"& *converted&"'\n\tto\n\t\t"&
+                        _hblCommandAccessor (currentExecutionList,simpleParameters(0))&
+                        "\n\telse\n\t\t"&
+                        _hblCommandAccessor (currentExecutionList,simpleParameters(1));
+        } else {
+            result = result&"to "& _hblCommandAccessor (currentExecutionList,simpleParameters(0));
+        }
+
+        break;
+
+    case 5: // data set contruction
+        converted = (_String*)parameters(0)->toStr();
+        result = _String("Read Data Set ")&(*converted);
+        DeleteObject(converted);
+        converted = (_String*)parameters(1)->toStr();
+        result = result& _String(" from file ")&(*converted);
+
+        break;
+
+    case 6:  // data set filter construction
+    case HY_HBL_COMMAND_HARVEST_FREQUENCIES:  // or HarvestFrequencies
+        if (code == HY_HBL_COMMAND_HARVEST_FREQUENCIES) {
+            result = "Harvest Frequencies into matrix ";
+            converted = (_String*)(parameters(0)->toStr());
+            result = result&*converted;
+            DeleteObject (converted);
+            converted = (_String*)(parameters(1)->toStr());
+            result = result&" from DataSet "&*converted;
+        } else {
+            result = "Build Data Set Filter ";
+            converted = (_String*)(parameters(0)->toStr());
+            result = result&*converted;
+            DeleteObject (converted);
+            converted = (_String*)(parameters(1)->toStr());
+            result = result&(_String)(" from DataSet ")&*converted;
+        }
+
+        DeleteObject (converted);
+
+        if (parameters.lLength > 2) {
+            result = result & " with unit size = " & *(_String*)parameters(2);
+        }
+
+        if (code == 9) {
+
+            result = result & " with atom size = " & *(_String*)parameters(3);
+            result = result & " with position specific flag = " & *(_String*)parameters(4);
+        }
+
+        result = result&" Partition:";
+        for (k = code==6?3:5; k<parameters.countitems(); k++) {
+            result = result & "," & *(_String*)parameters(k);
+        }
+
+        converted = nil;
+
+        break;
+
+    case 7: // build a tree
+    case 54: // build a tree
+
+        converted = (_String*)parameters(0)->toStr();
+        if (code == 7) {
+            result = _String("Build Tree ")&*converted;
+        } else {
+            result = _String("Build Topology ")&*converted;
+        }
+
+        DeleteObject (converted);
+
+        converted = (_String*)parameters(1)->toStr();
+        result = result & " from string " &*converted;
+        break;
+
+    case HY_HBL_COMMAND_FPRINTF: // print stuff to file (or stdout)
+
+        converted = (_String*)parameters(0)->toStr();
+        result = _String("fprintf(")& (*converted);
+        DeleteObject (converted);
+
+        converted = nil;
+        for (k = 1; k<parameters.countitems(); k++) {
+            result = result&*","& *((_String*)parameters(k));
+        }
+        result = result & ")";
+
+
+        break;
+
+    case HY_HBL_COMMAND_OPTIMIZE: // optimize the likelihood function
+    case HY_HBL_COMMAND_COVARIANCE_MATRIX: // compute the covariance matrix
+        converted = (_String*)parameters(0)->toStr();
+        if (code == HY_HBL_COMMAND_OPTIMIZE) {
+            result = _String("Optimize storing into, ");
+        } else {
+            result = _String("Calculate the Covariance Matrix storing into, ");
+        }
+
+        result = result& (*converted) & ", the following likelihood function:";
+        DeleteObject (converted);
+
+        converted = nil;
+        for (k = 1; k<parameters.countitems(); k++) {
+            result = result&*((_String*)parameters(k))&" ; ";
+        }
+
+        break;
+
+    case 11: // build the likelihood function
+
+        converted = (_String*)parameters(0)->toStr();
+        result = _String("Construct the following likelihood function:");
+        DeleteObject (converted);
+
+        converted = nil;
+        for (k = 1; k<parameters.countitems(); k++) {
+            result = result&*((_String*)parameters(k))&" ; ";
+        }
+
+        break;
+
+    case 12: // data set simulation
+        converted = (_String*)parameters(0)->toStr();
+        result = _String("Simulate Data Set ")&(*converted);
+        DeleteObject(converted);
+        converted = (_String*)parameters(1)->toStr();
+        result = result& _String(" from the likelihood function ")&(*converted);
+
+        break;
+
+    case 13: // a function
+        converted = (_String*)parameters(0)->toStr();
+        result = _String("Function ")&(*converted);
+        DeleteObject(converted);
+        converted = new _String (simpleParameters(0));
+        checkPointer(converted);
+        result = result& _String(" of ")&(*converted)&_String(" parameters:{");
+        DeleteObject (converted);
+        converted = (_String*)parameters(simpleParameters(0)-1)->toStr();
+        result = result&_String("}");
+
+
+        break;
+
+    case 14: // return statement
+        result = _String("A return statement with:");
+        converted = new _String (simpleParameters(0));
+        checkPointer(converted);
+        result = result& *converted;
+
+        break;
+
+    case 16: // data set merger
+        converted = (_String*)parameters(0)->toStr();
+        result = _String("Build dataset")&(*converted)&_String(" by ");
+        if (abs(simpleParameters(0)==1)) {
+            result = result & _String (" concatenating ");
+        } else {
+            result = result & _String (" combining ");
+        }
+        if (simpleParameters (0)<0) {
+            result = result & _String ("(deleting arguments upon completion)");
+        }
+        for (k=1; k<parameters.countitems(); k++) {
+            result = result & *((_String*)parameters(k));
+            if (k<parameters.countitems()-1) {
+                result = result & _String(",");
+            }
+        }
+        break;
+
+    case HY_HBL_COMMAND_EXPORT:
+        converted = (_String*)parameters(1)->toStr();
+        result = _String("Export ")&(*converted);
+        DeleteObject(converted);
+        converted = (_String*)parameters(0)->toStr();
+        checkPointer(converted);
+        result = result& _String(" to ")& *converted;
+        break;
+
+    case HY_HBL_COMMAND_MOLECULAR_CLOCK: // a call to MolecularClock
+        converted = (_String*)parameters(0)->toStr();
+        result    = ",";
+        result = _String("Molecular clock imposed starting at ")&(*converted)
+               & " on variables " & _String((_String*)parameters.Join (&result, 1, -1));
+        break;
+
+    case 20: // category variable construction
+        converted = (_String*)parameters.toStr();
+        result = _String("Category variable: ")&(*converted);
+        break;
+
+    case 21: // optimize the likelihood function
+
+    {
+        converted = (_String*)parameters(0)->toStr();
+        result = _String("Construct the category matrix, ")& (*converted) & ", for the likelihood function:";
+        DeleteObject (converted);
+        result = result&*((_String*)parameters(1))&" in ";
+        converted = nil;
+        _String testAgainst ("COMPLETE");
+        if (parameters.countitems()>2) {
+            if (((_String*)parameters(2))->Equal(&testAgainst)) {
+                result = result & "complete format";
+                break;
+            }
+        }
+        result = result & "short format";
+
+
+        break;
+    }
+    case HY_HBL_COMMAND_CLEAR_CONSTRAINTS: { // clear constraints
+        converted = (_String*)parameters.toStr();
+        result = _String("Clear contstraints on: ")&(*converted);
+        break;
+    }
+    case HY_HBL_COMMAND_SET_DIALOG_PROMPT: { // set dialog prompt
+        converted = (_String*)parameters.toStr();
+        result = _String("Set dialog prompt to: ")&(*converted);
+        break;
+    }
+    case 24: { // select standard model
+        converted = (_String*)parameters.toStr();
+        result = _String("Select Template Model for ")&(*converted);
+        break;
+    }
+    case 25: // fscanf
+    case 56: { // sscanf
+        converted = (_String*)parameters(0);
+        result = _String ("Read the following data from ")&*converted&" : ";
+        long shift = 1;
+        for (long p = 0; p<simpleParameters.lLength; p++) {
+            long theFormat = simpleParameters(p);
+            if (theFormat < 0) {
+                shift -- ;
+                result = result & " REWIND THE FILE";
+            } else {
+                result = result&*(_String*)allowedFormats (theFormat)
+                         &" into "&*(_String*)parameters(p+shift)&";";
+            }
+        }
+        converted = nil;
+        break;
+    }
+    case 26: { // replicate constraint
+        converted = (_String*)parameters(0);
+        result = _String ("Replicate the following constraint ")&*converted&" using these variables:";
+        for (long p = 1; p<parameters.lLength; p++) {
+            result = result&*(_String*)parameters(p)&";";
+        }
+        converted = nil;
+        break;
+    }
+
+    case HY_HBL_COMMAND_USE_MODEL: { // use matrix
+        converted = (_String*)parameters(0);
+        result = _String ("Use the matrix ")&*converted;
+        converted = nil;
+        break;
+    }
+
+    case 31: { // define a model
+        converted = (_String*)parameters(0);
+        result = _String ("Define the model ")&*converted;
+        converted = (_String*)parameters(1);
+        result = result& _String (" using transition matrix '")&*converted&"'";
+        if (parameters.lLength>2) {
+            converted = (_String*)parameters(2);
+            result = result& _String (" and equilibrium frequencies '")&*converted&"'";
+        }
+        converted = nil;
+        break;
+    }
+
+    case 32: { // choice list
+        converted = (_String*)parameters(1)->toStr();
+        result = _String ("Choice List for ")&*converted;
+        DeleteObject (converted);
+        converted = (_String*)parameters(3)->toStr();
+        result = result& _String (" with choice list:")&*converted;
+        DeleteObject (converted);
+        converted = (_String*)parameters(0);
+        result = result& _String (". Store result in ")&*converted;
+        converted = nil;
+        break;
+    }
+
+    case HY_HBL_COMMAND_GET_STRING: { // get string from object
+        converted = (_String*)parameters(2)->toStr();
+        result = _String ("Get string ")&*converted;
+        DeleteObject (converted);
+        converted = (_String*)parameters(1)->toStr();
+        result = result& _String (" from object:")&*converted;
+        DeleteObject (converted);
+        converted = (_String*)parameters(0);
+        result = result& _String (". Store result in ")&*converted;
+        converted = nil;
+        break;
+    }
+    case HY_HBL_COMMAND_SET_PARAMETER: { // set parameter value
+        converted = (_String*)parameters(1)->toStr();
+        result = _String ("Set parameter ")&*converted;
+        DeleteObject (converted);
+        converted = (_String*)parameters(0)->toStr();
+        result = result& _String (" of ")&*converted;
+        DeleteObject (converted);
+        converted = (_String*)parameters(2);
+        result = result& _String (" to ")&*converted;
+        converted = nil;
+        break;
+    }
+    case 36: { // open data panel
+        converted = (_String*)parameters(0)->toStr();
+        result = _String ("Open data window for the data set ")&*converted;
+        DeleteObject (converted);
+        converted = (_String*)parameters(1)->toStr();
+        result = result& _String (" list species ")&*converted;
+        DeleteObject (converted);
+        converted = (_String*)parameters(2);
+        result = result& _String (" with window settings ")&*converted;
+        converted = (_String*)parameters(3);
+        result = result& _String (" with partition settings ")&*converted;
+        converted = nil;
+        break;
+    }
+    case 37: { // open data panel
+        converted = (_String*)parameters(0)->toStr();
+        result = _String ("Get Information for ")&*converted;
+        DeleteObject (converted);
+        converted = (_String*)parameters(1)->toStr();
+        result = result& _String (" storing in ")&*converted;
+        break;
+    }
+
+    case 38: { // reconsruct ancestors
+        converted = (_String*)parameters(0)->toStr();
+        result = _String("Reconstruct Ancestors into ")&(*converted);
+        DeleteObject(converted);
+        converted = (_String*)parameters(1)->toStr();
+        result = result& _String(" from the likelihood function ")&(*converted);
+        break;
+    }
+
+    case 39: // execute commands
+    case 62: // execute a file
+    case 66: { // load function library
+        converted = (_String*)parameters(0)->toStr();
+        if (code == 39) {
+            result = _String("ExecuteCommands in string ");
+        } else if (code == 62) {
+            result = _String("ExecuteAFile from file ");
+        } else {
+            result = _String("LoadFunctionLibrary from file");
+        }
+
+        result = result & *converted & _String(" using basepath ") & ((_String*)parameters(1)->toStr()) & '.';
+        if (simpleParameters.lLength) {
+            result = result & "\nCompiled.";
+        } else if (parameters.lLength>2) {
+            _String inputName ((_String*)parameters(2)->toStr());
+            result = result & " reading input from " & inputName;
+            _AssociativeList *inputValues = (_AssociativeList *)FetchObjectFromVariableByType(&inputName, ASSOCIATIVE_LIST);
+            if (inputValues) {
+                result = result & '\n' & _String ((_String*)inputValues->toStr());
+            }
+
+            if (parameters.lLength > 3) {
+                result = result & " using name space prefix " & _String ((_String*)parameters(3)->toStr());
+            }
+        }
+        break;
+    }
+
+    case 40: { // open window
+        converted = (_String*)parameters(0)->toStr();
+        result = _String("Open window of type ")&(*converted);
+        DeleteObject(converted);
+        converted = (_String*)parameters(1)->toStr();
+        result = result& _String(" with parameters from ")&(*converted);
+        break;
+    }
+
+    case 41: { // spawn LF
+        converted = (_String*)parameters(0)->toStr();
+        result = _String("Spawn Likelihood Function ")&(*converted);
+        DeleteObject(converted);
+        converted = (_String*)parameters(1)->toStr();
+        result = result& _String(" with tree ")&(*converted);
+        DeleteObject(converted);
+        converted = (_String*)parameters(2)->toStr();
+        result = result& _String(" from ")&(*converted);
+        DeleteObject(converted);
+        converted = (_String*)parameters(3)->toStr();
+        result = result& _String(" using sequences ids in ")&(*converted);
+        break;
+    }
+
+    case HY_HBL_COMMAND_DIFFERENTIATE: { // Differentiate
+        converted = (_String*)parameters(1)->toStr();
+        result = _String("Differentiate '")&(*converted);
+        DeleteObject(converted);
+        converted = (_String*)parameters(2)->toStr();
+        result = result& _String("' on ")&(*converted);
+        DeleteObject(converted);
+        if (parameters.lLength==4) {
+            converted = (_String*)parameters(3)->toStr();
+            result = result& _String(" ")&(*converted) & " times ";
+            DeleteObject(converted);
+        }
+        converted = (_String*)parameters(2)->toStr();
+        result = result& _String(" storing result in ")&(*converted);
+        break;
+    }
+    case 43: // Find Root
+    case 48: { // Integrate
+        converted = (_String*)parameters(1)->toStr();
+        if (code == 43) {
+            result = _String("Find the root of ")&(*converted);
+        } else {
+            result = _String("Integrate ")&(*converted);
+        }
+        DeleteObject(converted);
+        converted = (_String*)parameters(2)->toStr();
+        result = result& _String(" in ")&(*converted);
+        DeleteObject(converted);
+        converted = (_String*)parameters(3)->toStr();
+        result = result& _String(" between ")&(*converted);
+        DeleteObject(converted);
+        converted = (_String*)parameters(4)->toStr();
+        result = result& _String(" and ")&(*converted);
+        DeleteObject(converted);
+        converted = (_String*)parameters(0)->toStr();
+        result = result& _String(" storing the result in ")&(*converted);
+        break;
+    }
+    case 44: { // MPISend
+        converted = (_String*)parameters(1)->toStr();
+        result = _String("MPI Send ")&(*converted);
+        DeleteObject(converted);
+        if (parameters.lLength>2) {
+            converted = (_String*)parameters(2)->toStr();
+            result = _String(" with input from ")&(*converted);
+            DeleteObject(converted);
+        }
+        converted = (_String*)parameters(0)->toStr();
+        result = result& _String(" to MPI Node ")&(*converted);
+        break;
+    }
+    case 45: { // MPIReceive
+        converted = (_String*)parameters(0)->toStr();
+        result = _String("MPI Receive from ")&(*converted);
+        DeleteObject(converted);
+        converted = (_String*)parameters(1)->toStr();
+        result = result& _String(" storing actual sender node into ")&(*converted);
+        DeleteObject(converted);
+        converted = (_String*)parameters(2)->toStr();
+        result = result& _String(" and storing the string result into ")&(*converted);
+        break;
+    }
+    case 46: { //GetDataInfo
+        converted = (_String*)parameters(1)->toStr();
+        if (parameters.lLength>4) {
+            result = _String("Compute pairwise differences from ")&(*converted);
+        } else {
+            result = _String("GetDataInfo from ")&(*converted);
+        }
+        DeleteObject(converted);
+        if (parameters.lLength>2) {
+            converted = (_String*)parameters(2)->toStr();
+            result = result& _String(" for sequence ")&(*converted);
+            DeleteObject(converted);
+            if (parameters.lLength>3) {
+                converted = (_String*)parameters(3)->toStr();
+                if (parameters.lLength>4) {
+                    result = result& _String(" and site ")&(*converted);
+                } else {
+                    result = result& _String(" and sequence ")&(*converted);
+                }
+            }
+            DeleteObject(converted);
+        }
+        converted = (_String*)parameters(0)->toStr();
+        result = result& _String(" and storing the result in ")&(*converted);
+        break;
+    }
+    case 47: { //GetDataInfo
+        converted = (_String*)parameters(0)->toStr();
+        result = _String("StateCounter on ")&(*converted);
+        DeleteObject(converted);
+        converted = (_String*)parameters(1)->toStr();
+        result = result& _String(" using the callback: ")&(*converted);
+        break;
+    }
+    case HY_HBL_COMMAND_LFCOMPUTE: { //Compute LF
+        converted = (_String*)parameters(0)->toStr();
+        result = blLFCompute&(*converted);
+        DeleteObject(converted);
+        converted = (_String*)parameters(1)->toStr();
+        result = result& ',' &(*converted) & ')';
+        break;
+    }
+    case HY_HBL_COMMAND_GET_URL: { //GetURL
+        converted = (_String*)parameters(0)->toStr();
+        result = blGetURL&(*converted);
+        DeleteObject(converted);
+        converted = (_String*)parameters(1)->toStr();
+        result = result& ',' &(*converted);
+        if (parameters.lLength>2) {
+            DeleteObject(converted);
+            converted = (_String*)parameters(2)->toStr();
+            result = result& ',' &(*converted);
+        }
+        result = result & ')';
+        break;
+    }
+    case 52: { //Simulate
+        converted = (_String*)parameters(0)->toStr();
+        result = blDataSet &(*converted) & "=Simulate(";
+        DeleteObject(converted);
+        converted = (_String*)parameters(1)->toStr();
+        result = result &(*converted);
+        for (long i=2; i<parameters.lLength; i++) {
+            DeleteObject(converted);
+            converted = (_String*)parameters(i)->toStr();
+            result = result &','&(*converted);
+        }
+        result = result & ')';
+        break;
+    }
+    case 53: //DoSQL
+    case 55: //AlignSequences
+    case 57: { //GetNeutralNull
+        converted = (_String*)parameters(0)->toStr();
+        result = (code==53?blDoSQL:(code==55?blAlignSequences:blGetNeutralNull)) &(*converted) & '(';
+        for (long i=1; i<parameters.lLength; i++) {
+            DeleteObject(converted);
+            converted = (_String*)parameters(i)->toStr();
+            result = result &','&(*converted);
+        }
+        result = result & ')';
+        break;
+    }
+    case 58: {
+        converted = (_String*)parameters(0)->toStr();
+        result = blHBLProfile & " " & *converted;
+        break;
+    }
+    case HY_HBL_COMMAND_DELETE_OBJECT: {
+        converted = (_String*)parameters.toStr();
+        result = blDeleteObject & '(' & *converted & ')';
+        break;
+    }
+    case HY_HBL_COMMAND_REQUIRE_VERSION: {
+        converted = (_String*)parameters(0)->toStr();
+        result = blRequireVersion & '(' & *converted & ')';
+        break;
+    }
+    case 61:
+    case 63: {
+        converted = (_String*)parameters(0)->toStr();
+        result = (code==61?blSCFG:blNN) & *converted & "=(";
+        for (long i=1; i<parameters.lLength; i++) {
+            DeleteObject(converted);
+            converted = (_String*)parameters(i)->toStr();
+            if (i>1) {
+                result = result &','&(*converted);
+            } else {
+                result = result &(*converted);
+            }
+        }
+        result = result &')';
+        break;
+    }
+    case 64:
+        converted = (_String *) parameters(0)->toStr();
+        result = blBGM & *converted & "=(";
+        for (long p = 1; p < parameters.lLength; p++) {
+            DeleteObject (converted);
+            converted = (_String *) parameters(p)->toStr();
+            if (p > 1) {
+                result = result & ',' & (*converted);
+            } else {
+                result = result & (*converted);    // first argument
+            }
+        }
+        result = result & ')';
+        break;
+    case HY_HBL_COMMAND_ASSERT: {
+        converted = (_String*)parameters(0)->toStr();
+        result = _String ("Assert ") & "'" & *converted & "'";
+        break;
+    }
+    }
+
+    DeleteObject (converted);
+    return result.makeDynamic();
+}
+
+//____________________________________________________________________________________
+
+void      _ElementaryCommand::ExecuteCase0 (_ExecutionList& chain)
+{
+    chain.currentCommand++;
+
+    if (chain.cli) {
+        _Parameter result = ((_Formula*)simpleParameters.lData[1])->ComputeSimple (chain.cli->stack, chain.cli->values);
+        long sti = chain.cli->storeResults.lData[chain.currentCommand-1];
+        if (sti>=0) {
+            chain.cli->values[sti].value = result;
+        }
+        return;
+    }
+
+    if (!simpleParameters.lLength) { // not compiled yet
+        _Formula f,
+                 f2;
+
+        _String* theFla     = (_String*)parameters(0),
+                 errMsg;
+
+        _FormulaParsingContext fpc (nil, chain.nameSpacePrefix);
+
+        long     parseCode = Parse(&f,(*theFla),fpc,&f2);
+
+        if (parseCode != HY_FORMULA_FAILED ) {
+            if (fpc.isVolatile() == false) { // not a matrix constant
+                simpleParameters    <<parseCode;
+                simpleParameters    <<long (f.makeDynamic());
+                simpleParameters    <<long (f2.makeDynamic());
+                simpleParameters    <<fpc.assignmentRefID   ();
+                simpleParameters    <<fpc.assignmentRefType ();
+
+                _SimpleList*        varList = new _SimpleList;
+                _AVLList            varListA (varList);
+                f.ScanFForVariables (varListA, true, true, true, true);
+                f2.ScanFForVariables(varListA, true, true);
+                varListA.ReorderList();
+                listOfCompiledFormulae<<(long)this;
+                compiledFormulaeParameters.AppendNewInstance(varList);
+            } else {
+                ExecuteFormula(&f,&f2,parseCode,fpc.assignmentRefID(),chain.nameSpacePrefix,fpc.assignmentRefType());
+                return;
+            }
+        } else {
+            return;
+        }
+    }
+
+    ExecuteFormula ((_Formula*)simpleParameters.lData[1],(_Formula*)simpleParameters.lData[2],simpleParameters.lData[0],simpleParameters.lData[3], chain.nameSpacePrefix, simpleParameters.lData[4]);
+
+    if (terminateExecution) {
+        WarnError (_String("Problem occurred in line: ")&*this);
+        return;
+    }
+}
+
+
+//____________________________________________________________________________________
+
+void      _ElementaryCommand::ExecuteCase4 (_ExecutionList& chain)
+{
+    chain.currentCommand++;
+    if (simpleParameters.lLength==2) {
+
+    }
+
+    if (simpleParameters.lLength==3 || parameters.lLength) {
+        if ( parameters.lLength && simpleParameters.lLength < 3) {
+            _Formula f;
+            //printf ("Namespace: %x\nCode: %s\n", chain.nameSpacePrefix, ((_String*)parameters(0))->sData);
+
+            _FormulaParsingContext fpc (nil,  chain.nameSpacePrefix);
+            long status = Parse (&f, *(_String*)parameters(0), fpc, nil);
+
+            //printf ("Print formula: %s\n", _String((_String*)f.toStr()).sData);
+
+            if (status== HY_FORMULA_EXPRESSION) {
+                simpleParameters<<long(f.makeDynamic());
+            } else {
+                return;
+            }
+        }
+
+        if (chain.cli) {
+            if ( ((_Formula*)simpleParameters(2))->ComputeSimple(chain.cli->stack, chain.cli->values)==0.0) {
+                chain.currentCommand = simpleParameters.lData[1];
+                return;
+            }
+        } else {
+            _PMathObj result = ((_Formula*)simpleParameters(2))->Compute();
+            if (!result) {
+                WarnError ("Condition Evaluation Failed");
+                return ;
+            }
+
+            if (terminateExecution) {
+                subNumericValues = 2;
+                _String       *s = (_String*)((_Formula*)simpleParameters(2))->toStr();
+                subNumericValues = 0;
+                _String     err  = _String("Failed while evaluating: ") & _String((_String*)((_Formula*)simpleParameters(2))->toStr()) & " - " & *s;
+                DeleteObject (s);
+                WarnError    (err);
+                return;
+            }
+
+            bool conditionFalse = false;
+
+            switch (result->ObjectClass()) {
+            case NUMBER:
+                conditionFalse = result->Value()==0.0;
+                break;
+            case STRING:
+                conditionFalse = ((_FString*)result)->IsEmpty();
+                break;
+            default:
+                WarnError ("Condition evaluation result be be a number or a string");
+                return;
+
+            }
+
+            if (conditionFalse) {
+                chain.currentCommand = simpleParameters.lData[1];
+                return;
+            }
+        }
+    }
+    chain.currentCommand = simpleParameters.lData[0];
+
+    if (chain.currentCommand == -1) {
+        terminateExecution   = true;
+        chain.currentCommand = chain.lLength;
+    }
+}
+
+//____________________________________________________________________________________
+
+void      _ElementaryCommand::ExecuteCase5 (_ExecutionList& chain)
+{
+    chain.currentCommand++;
+    FILE*    df;
+    _String  fName = *(_String*)parameters(1);
+    _DataSet*ds;
+
+    if (simpleParameters.lLength == 1) {
+        fName = GetStringFromFormula ((_String*)parameters(1),chain.nameSpacePrefix);
+        ds = ReadDataSetFile (nil,0,&fName,nil,chain.nameSpacePrefix?chain.nameSpacePrefix->GetName():nil);
+    } else {
+        if (fName.Equal (&useNexusFileData)) {
+            if (!lastNexusDataMatrix) {
+                _String errMsg = useNexusFileData & " was used in ReadDataFile, and no NEXUS data matrix was available.";
+                acknError (errMsg);
+                return;
+            }
+            ds = lastNexusDataMatrix;
+        } else {
+#if defined  __WINDOZE__ && ! defined __HEADLESS__
+            lastFileTypeSelection = 1;
+#endif
+
+            fName.ProcessFileName(false,false,(Ptr)chain.nameSpacePrefix);
+            if (terminateExecution) {
+                return;
+            }
+            SetStatusLine ("Loading Data");
+
+            df = doFileOpen (fName.getStr(),"rb");
+            if (df==nil) {
+                // try reading this file as a string formula
+                fName = GetStringFromFormula ((_String*)parameters(1),chain.nameSpacePrefix);
+                fName.ProcessFileName(false,false,(Ptr)chain.nameSpacePrefix);
+
+                if (terminateExecution) {
+                    return;
+                }
+
+                df = doFileOpen (fName.getStr(),"rb");
+                if (df==nil) {
+                    _String errMsg ("Could not find source dataset file:");
+                    errMsg = errMsg & *(_String*)parameters(1) & " Path stack: " & _String((_String*)pathNames.toStr());
+                    WarnError (errMsg);
+                    return;
+                }
+            }
+            ds = ReadDataSetFile (df,0,nil,nil,chain.nameSpacePrefix?chain.nameSpacePrefix->GetName():nil);
+            fclose (df);
+        }
+    }
+
+
+    // 20110802: need to check that this data set is not empty
+
+    if (ds->NoOfSpecies() && ds->NoOfColumns()) {
+        _String  * dsID = new _String (chain.AddNameSpaceToID(*(_String*)parameters(0)));
+        StoreADataSet (ds, dsID);
+        DeleteObject  (dsID);
+    } else {
+        DeleteObject (ds);
+        WarnError    ("The format of the sequence file has not been recognized and may be invalid");
+    }
+
+    //StoreADataSet (ds, (_String*)parameters(0));
+}
+
+
+//____________________________________________________________________________________
+
+void      _ElementaryCommand::ExecuteCase11 (_ExecutionList& chain)
+/*
+ code cleanup SLKP 20090316
+*/
+
+{
+    chain.currentCommand++;
+
+    _String  parm,
+             errMsg;
+
+    bool     explicitFreqs = simpleParameters.lLength,
+             // if false then the likelihood function will be of the form (filter1,tree1,filter2,tree2,...,filterN,treeN)
+             // if true then the likelihood function will be of the form  (filter1,tree1,freq1,filter2,tree2,freq2,...,filterN,treeN,freqN)
+             assumeList    = parameters.lLength > 2;
+    // if there is only one parameter to the function constructor, it is assumed to be a string matrix
+    // otherwise it is expected to be a collection of literals
+
+    _List    * likelihoodFunctionSpec   = nil,
+               passThisToLFConstructor;
+
+    if (assumeList) {
+        likelihoodFunctionSpec = new _List (parameters, 1, - 1);
+    } else {
+        _Matrix * matrixOfStrings = (_Matrix*)ProcessAnArgumentByType ((_String*)parameters(1), chain.nameSpacePrefix, MATRIX);
+        if (matrixOfStrings && matrixOfStrings->IsAStringMatrix()) {
+            likelihoodFunctionSpec = new _List;
+            matrixOfStrings->FillInList(*likelihoodFunctionSpec);
+            if (likelihoodFunctionSpec->lLength == 0) {
+                DeleteObject (likelihoodFunctionSpec);
+                likelihoodFunctionSpec = nil;
+            }
+        }
+        if (likelihoodFunctionSpec == nil) {
+            WarnError (_String("Not a valid string matrix object passed to a _LikelihoodFunction constructor: ") & *(_String*)parameters(1));
+            return;
+        }
+    }
+
+    long i       = 0,
+         stepper = explicitFreqs?3:2;
+
+    for (; i<=(long)likelihoodFunctionSpec->lLength-stepper; i+=stepper) {
+        _String     *dataset = (_String*)(*likelihoodFunctionSpec)(i),
+                     *tree   = (_String*)(*likelihoodFunctionSpec)(i+1),
+                      *freq    = explicitFreqs?(_String*)(*likelihoodFunctionSpec)(i+2):nil;
+
+        if(FindDataSetFilterName(AppendContainerName(*dataset,chain.nameSpacePrefix))!=-1) {
+            _TheTree*   thisTree = (_TheTree*)FetchObjectFromVariableByType(&AppendContainerName(*tree,chain.nameSpacePrefix),TREE);
+            if (thisTree) {
+                _CalcNode*  thisNode = thisTree->DepthWiseTraversal(true);
+                if (!freq) { // no explicit frequency parameter; grab one from the tree
+                    long        theFreqID       = -1,
+                                theModelID     = -1,
+                                finalFreqID        = -1;
+                    bool        done = false;
+
+                    while (1) {
+                        if ((theModelID     = thisNode->GetModelIndex()) == HY_NO_MODEL) { // this node has no model
+                            done = false;
+                            break;
+                        }
+                        theFreqID   = modelFrequenciesIndices.lData[theModelID];
+                        thisNode    = thisTree->DepthWiseTraversal();
+                        while(thisNode) {
+                            theModelID      = thisNode->GetModelIndex();
+                            if (theModelID == HY_NO_MODEL) { // no model
+                                done = false;
+                                break;
+                            }
+                            if (modelFrequenciesIndices.lData[theModelID]!=theFreqID) {
+                                done = true;
+                                break;
+                            }
+                            if (thisTree->IsCurrentNodeTheRoot()) {
+                                break;
+                            }
+                            thisNode = thisTree->DepthWiseTraversal();
+                        }
+                        if (theFreqID<0) {
+                            finalFreqID = -theFreqID-1;
+                        } else {
+                            finalFreqID = theFreqID;
+                        }
+                        break;
+                    }
+
+                    if (finalFreqID>=0) {
+                        _String freqID = chain.TrimNameSpaceFromID(*LocateVar(finalFreqID)->GetName());
+                        passThisToLFConstructor &&  dataset;
+                        passThisToLFConstructor &&  tree;
+                        passThisToLFConstructor &&  freqID;
+                        continue;
+                    } else {
+                        if (!done) {
+                            errMsg = (((_String)("LF: Not a well-defined tree/model combination: ")&*tree));
+                        } else {
+                            errMsg = (((_String)("LF: All models in the tree: ")&*tree&_String(" must share the same frequencies vector")));
+                        }
+                    }
+                } else {
+                    if (FetchObjectFromVariableByType(&AppendContainerName(*freq,chain.nameSpacePrefix),MATRIX)) {
+                        passThisToLFConstructor &&  dataset;
+                        passThisToLFConstructor &&  tree;
+                        passThisToLFConstructor &&  freq;
+                        continue;
+                    }
+                    errMsg = (((_String)("LF: Not a valid frequency matrix ID: ")& *freq));
+                }
+            } else {
+                errMsg = (((_String)("LF: Not a valid tree ID: ")& *tree));
+            }
+
+        } else {
+            errMsg = (((_String)("LF: Not a valid dataset filter: ")& *dataset));
+        }
+
+        if (errMsg.sLength) {
+            DeleteObject (likelihoodFunctionSpec);
+            WarnError    (errMsg);
+            return;
+        }
+    }
+
+    if (i==likelihoodFunctionSpec->lLength-1) { // computing template
+        passThisToLFConstructor && *((_String*)(*likelihoodFunctionSpec)(i));
+    }
+
+
+    DeleteObject (likelihoodFunctionSpec);
+
+
+    _String lfID                  = chain.AddNameSpaceToID(*(_String*)parameters(0)); // the ID of the likelihood function
+    long    likeFuncObjectID      = FindLikeFuncName (lfID);
+    if (likeFuncObjectID==-1)
+        // not an existing LF ID
+    {
+        _LikelihoodFunction * lkf = new _LikelihoodFunction ();
+        if (! lkf->Construct(passThisToLFConstructor,chain.nameSpacePrefix))
+            // constructor failed
+        {
+            DeleteObject (lkf);
+        } else {
+            likeFuncObjectID = likeFuncNamesList.Find(&empty);
+            // see if there are any vacated spots in the list
+
+            if (likeFuncObjectID < 0) {
+                likeFuncList << lkf;
+                likeFuncNamesList&&(&lfID);
+                DeleteObject (lkf);
+            } else {
+                likeFuncNamesList.Replace(likeFuncObjectID,&lfID,true);
+                likeFuncList.lData[likeFuncObjectID] = (long)lkf;
+            }
+        }
+    } else {
+        _LikelihoodFunction* lkf = (_LikelihoodFunction*)likeFuncList(likeFuncObjectID);
+        if (!lkf->Construct(passThisToLFConstructor,chain.nameSpacePrefix)) {
+            KillLFRecord (likeFuncObjectID,false);
+        }
+    }
+
+}
+
+
+
+//____________________________________________________________________________________
+
+void      _ElementaryCommand::ExecuteCase12 (_ExecutionList& chain)
+{
+    chain.currentCommand++;
+    SetStatusLine ("Simulating Data");
+
+    _String  likefID        = chain.AddNameSpaceToID(*(_String*)parameters(1)),
+             tempString     = ProcessStringArgument (&likefID),
+             errMsg;
+
+    if (tempString.sLength) {
+        likefID = tempString;
+    }
+
+    long f  = FindLikeFuncName (likefID),
+         s2 = FindSCFGName     (likefID);
+
+    if (f==-1 && s2==-1) {
+        WarnError (_String("Likelihood Function (or SCFG)")&likefID& " has not been initialized" );
+        return ;
+    }
+
+    if (f>=0) {
+        _DataSet  * ds = new _DataSet;
+        checkPointer (ds);
+
+        _List     theExclusions;
+
+        if (parameters.lLength>2) // there is a list of exclusions there
+            // ';'-sep for different partititons
+            // ','-sep for states in a given partition
+        {
+            // SLKP mod 20070622 to allow string expressions as well
+            _String theExc (ProcessLiteralArgument((_String*)parameters(2),chain.nameSpacePrefix));
+            if (theExc.sLength) {
+                long f = theExc.Find(';'),
+                     g = 0;
+
+                while(1) {
+                    _String subExc (theExc,g,(f==-1)?(-1):(f-1));
+                    long    h = subExc.Find(','),
+                            l = 0;
+                    _List   myExc;
+
+                    while(1) {
+                        _String excludeMe (subExc,l,(h==-1)?(-1):(h-1));
+                        myExc && & excludeMe;
+                        if (h==-1) {
+                            break;
+                        }
+                        l = h+1;
+                        h = subExc.Find(',',h+1,-1);
+                    }
+                    theExclusions&& &myExc;
+                    if (f==-1) {
+                        break;
+                    }
+                    g = f+1;
+                    f = theExc.Find(';',f+1,-1);
+                }
+            }
+
+        }
+
+        _Matrix  *   catValues  = nil,
+                     *   catNames   = nil;
+
+        _Variable*   catValVar  = nil,
+                     *   catNameVar = nil;
+
+        if (parameters.lLength>3)
+            // a matrix to store simulated category values
+        {
+            _String  matrixName (chain.AddNameSpaceToID(*(_String*)parameters(3)));
+            if (!(catValVar = CheckReceptacle(&matrixName,blSimulateDataSet,true))) {
+                return;
+            } else {
+                checkPointer (catValues = new _Matrix (1,1,false,true));
+            }
+        }
+
+        if (parameters.lLength>4)
+            // a matrix to store simulated category values
+        {
+            _String  matrixName (chain.AddNameSpaceToID(*(_String*)parameters(4)));
+            if (!(catNameVar = CheckReceptacle(&matrixName,blSimulateDataSet,true))) {
+                return;
+            } else {
+                checkPointer (catNames = new _Matrix (1,1,false,true));
+            }
+        }
+
+        _String * resultingDSName = new _String (chain.AddNameSpaceToID(*(_String*)parameters(0)));
+
+        if (!resultingDSName->IsValidIdentifier(true)) {
+            errMsg = *resultingDSName & " is not a valid receptacle identifier in call to " & blSimulateDataSet;
+            DeleteObject (resultingDSName);
+            WarnError (errMsg);
+            return;
+        }
+
+        ((_LikelihoodFunction*)likeFuncList(f))->Simulate(*ds,theExclusions,catValues,catNames);
+
+        if (catValues) {
+            catValVar->SetValue(catValues,false);
+        }
+        if (catNames) {
+            catNameVar->SetValue(catNames,false);
+        }
+
+        StoreADataSet (ds, resultingDSName);
+        DeleteObject  (resultingDSName);
+    } else {
+        _String newCorpus = chain.AddNameSpaceToID(*(_String*)parameters(0));
+        CheckReceptacleAndStore (&newCorpus," SimulateDataSet (SCFG)", true, new _FString(((Scfg*)scfgList (s2))->SpawnRandomString()), false);
+    }
+}
+
+//____________________________________________________________________________________
+
+void      _ElementaryCommand::ExecuteCase38 (_ExecutionList& chain, bool sample)
+{
+    chain.currentCommand++;
+    SetStatusLine ("Reconstructing Ancestors");
+
+    _String *likef          = (_String*)parameters(1),
+             tempString      = ProcessStringArgument (likef),
+             errMsg;
+
+    if (tempString.sLength) {
+        likef = &tempString;
+    }
+
+    _String name2lookup = AppendContainerName(*likef,chain.nameSpacePrefix);
+    long    objectID    = FindLikeFuncName (name2lookup);
+    if (objectID >= 0) {
+        _DataSet     * ds               = (_DataSet*) checkPointer(new _DataSet);
+        _String      * dsName           = new _String (AppendContainerName(*(_String*)parameters(0),chain.nameSpacePrefix));
+        _LikelihoodFunction *lf         = ((_LikelihoodFunction*)likeFuncList(objectID));
+
+        _Matrix * partitionList         = nil;
+        if (parameters.lLength>2) {
+            _String  secondArg = *(_String*)parameters(2);
+            partitionList = (_Matrix*)ProcessAnArgumentByType (&secondArg, chain.nameSpacePrefix, MATRIX);
+        }
+        _SimpleList                     partsToDo;
+        if (lf->ProcessPartitionList(partsToDo, partitionList, " ancestral reconstruction")) {
+            lf->ReconstructAncestors(*ds, partsToDo, *dsName,  sample, simpleParameters.Find(-1) >= 0, simpleParameters.Find(-2) >= 0 );
+        }
+        StoreADataSet  (ds, dsName);
+        DeleteObject   (dsName);
+    } else {
+        objectID    =   FindSCFGName       (name2lookup);
+        if (objectID>=0)
+            /* reconstruct best parse tree for corpus using SCFG */
+        {
+            CheckReceptacleAndStore (&AppendContainerName(*(_String*)parameters(0),chain.nameSpacePrefix)," ReconstructAncestors (SCFG)", true, new _FString( ((Scfg*)scfgList (objectID))->BestParseTree() ), false);
+        } else {
+            errMsg =  (((_String)("Likelihood Function/SCFG")&*likef&_String(" has not been initialized")));
+            WarnError (errMsg);
+            return ;
+        }
+    }
+}
+
+//____________________________________________________________________________________
+
+
+void      _ElementaryCommand::ExecuteCase39 (_ExecutionList& chain)
+{
+    chain.currentCommand++;
+
+    _String *commands,
+            theCommand,
+            *namespc = nil;
+
+    if (code == 39) {
+        commands = ProcessCommandArgument((_String*)parameters(0));
+    } else {
+        _String filePath = GetStringFromFormula((_String*)parameters(0),chain.nameSpacePrefix),
+                originalPath = filePath;
+
+
+        FILE * commandSource = nil;
+        
+        _Parameter reload = 0.;
+        checkParameter(alwaysReloadLibraries, reload, 0.);
+
+        if (code == 66) {
+            bool hasExtension    = filePath.FindBackwards (".",0,-1) > 0;
+
+            for (unsigned long p = 0; !commandSource && p < standardLibraryPaths.lLength; p++) {
+                for (unsigned long e = 0; !commandSource && e < standardLibraryExtensions.lLength; e++) {
+                    _String tryPath = *((_String*)standardLibraryPaths(p)) & filePath & *((_String*)standardLibraryExtensions(e));
+
+                    // printf ("%s\n", tryPath.sData);
+
+                    tryPath.ProcessFileName (false, false, (Ptr)chain.nameSpacePrefix);
+                  
+                    if (loadedLibraryPaths.Find(&tryPath) >= 0 && parameters.lLength == 2 && reload < 0.5) {
+                        ReportWarning (_String("Already loaded '") & originalPath & "' from " & tryPath);
+                        return;
+                    }
+                    if ((commandSource = doFileOpen (tryPath.getStr(), "rb"))) {
+                        filePath = tryPath;
+                        break;
+                    }
+                    if (hasExtension) {
+                        break;
+                    }
+                }
+            }
+
+        }
+      
+
+        if (commandSource == nil) {
+            filePath.ProcessFileName (false,false,(Ptr)chain.nameSpacePrefix);
+ 
+            if (code == 66 && loadedLibraryPaths.Find(&filePath) >= 0 && parameters.lLength == 2 && reload < 0.5) {
+                ReportWarning (_String("Already loaded '") & originalPath & "' from " & filePath);
+                return;
+            }
+            
+            if ((commandSource = doFileOpen (filePath.getStr(), "rb")) == nil) {
+                WarnError (_String("Could not read command file in ExecuteAFile.\nOriginal path: '") &
+                                    originalPath & "'.\nExpanded path: '" & filePath & "'");
+                return;
+            }
+        }
+
+        if (code == 66 && commandSource) {
+            ReportWarning (_String("Loaded '") & originalPath & "' from " & filePath);
+            loadedLibraryPaths.Insert (filePath.makeDynamic(),0,false,true);
+        }
+
+        commands = new _String (commandSource);
+        if (fclose       (commandSource) ) { // failed to fclose
+            DeleteObject (commands);
+            WarnError (_String("Internal error: failed in a call to fclose ") & filePath);
+        }
+        PushFilePath (filePath);
+    }
+
+    if (!commands) {
+        return;
+    }
+
+    if (code == 39) {
+        theCommand = ProcessLiteralArgument (commands,chain.nameSpacePrefix);
+    } else {
+        theCommand = commands;
+    }
+
+    if (theCommand.sLength == 0) {
+        WarnError (_String("Invalid string argument '") & *commands & "' in call to ExecuteCommands/ExecuteAFile.");
+        return ;
+    }
+
+    if (code == 39 && ((_String*)parameters(1))->sLength) {
+        pathNames << (_String*)parameters(1);
+    }
+
+    _AVLListXL * inArg    = nil;
+    _List      * inArgAux = nil;
+
+    if (parameters.lLength >= 3)
+        // stdin redirect (and/or name space prefix)
+    {
+        _PMathObj inAVL = ProcessDictionaryArgument ((_String*)parameters(2),chain.nameSpacePrefix);
+
+        if (!inAVL) {
+            if (parameters.lLength == 3) {
+                WarnError (_String("Not a valid associative array index passed as input redirect argument to ExecuteCommands/ExecuteAFile: )") & *(_String*)parameters(2));
+                return;
+            }
+        } else {
+            _AssociativeList * stdinRedirect = (_AssociativeList*)inAVL;
+
+            checkPointer (inArgAux = new _List);
+            checkPointer (inArg    = new _AVLListXL (inArgAux));
+
+            _List        *stdKeys = stdinRedirect->GetKeys();
+
+            for (long kid = 0; kid < stdKeys->lLength; kid++) {
+                _String  * aKey         = (_String*)(*stdKeys) (kid);
+                if (aKey) {
+                    _FString * aString      = (_FString*)stdinRedirect->GetByKey (*aKey, STRING);
+                    if (!aString) {
+                        WarnError    (_String("All entries in the associative array used as input redirect argument to ExecuteCommands/ExecuteAFile must be strings. The following key was not: ") & *aKey);
+                        DeleteObject (inAVL);
+                        return;
+                    }
+                    inArg -> Insert (aKey->makeDynamic(),(long)new _String (*aString->theString),false);
+                }
+            }
+        }
+
+        DeleteObject (inAVL);
+
+        if (parameters.lLength > 3) {
+            _String nameSpaceID = ProcessLiteralArgument((_String*)parameters(3),chain.nameSpacePrefix);
+            if (!nameSpaceID.IsValidIdentifier(true)) {
+                WarnError (_String("Invalid namespace ID in call to ExecuteCommands/ExecuteAFile: ") & *(_String*)parameters(3));
+                return;
+            }
+            namespc = new _String (nameSpaceID);
+        }
+    }
+
+    if (parameters.lLength <4 && chain.nameSpacePrefix) {
+        namespc = new _String (*chain.nameSpacePrefix->GetName());
+    }
+
+    if (theCommand.beginswith ("#NEXUS")) {
+        ReadDataSetFile (nil,1,&theCommand,nil,namespc);
+    } else {
+        bool result = false;
+        _ExecutionList exc (theCommand,namespc, false, &result);
+        
+        if (!result) {
+            chain.ReportAnExecutionError("Encountered an error while parsing HBL", false, true);
+        } else {
+
+            exc.stdinRedirectAux = inArgAux?inArgAux:chain.stdinRedirectAux;
+            exc.stdinRedirect    = inArg?inArg:chain.stdinRedirect;
+
+            if (simpleParameters.lLength && exc.TryToMakeSimple()) {
+                ReportWarning ("Successfully compiled an execution list.");
+                exc.ExecuteSimple ();
+            } else {
+                exc.Execute();
+            }
+
+            exc.stdinRedirectAux = nil;
+            exc.stdinRedirect    = nil;
+            if (exc.result) {
+                DeleteObject (chain.result);
+                chain.result = exc.result;
+                exc.result = nil;
+            }
+        }
+    }
+
+    if (inArg) {
+        DeleteObject            (inArg);
+        DeleteObject            (inArgAux);
+    }
+
+    DeleteObject (namespc);
+
+    if (code == 62) {
+        PopFilePath ();
+    } else if (((_String*)parameters(1))->sLength) {
+        pathNames.Delete (pathNames.lLength-1);
+    }
+}
+
+void      _ElementaryCommand::ExecuteCase40 (_ExecutionList& chain)
+{
+    chain.currentCommand++;
+    _String errMsg;
+
+#if !defined __UNIX__ && !defined __HEADLESS__
+
+    bool    done = false;
+
+    _String *windowType     = ((_String*)parameters(0)),
+             *positionString = nil;
+
+    _HYWindow*
+    resultWindow = nil;
+
+    long    positionSpec[] = {-1,-1,-1,-1};
+
+    if (parameters.lLength==3) {
+        positionString = ((_String*)parameters(2));
+        _List * positionList = positionString->Tokenize(";");
+
+        if ((positionList->lLength>=2)&&(positionList->lLength<=4)) {
+            _HYRect      screenDim = GetScreenDimensions();
+            setParameter (screenWidthVar , screenDim.right );
+            setParameter (screenHeightVar, screenDim.bottom);
+
+            for (long i = 0; i<positionList->lLength; i++) {
+                _String* thisSpec = (_String*)(*positionList)(i);
+                if (thisSpec->sLength) {
+                    _Formula  fla    (*thisSpec,nil,false);
+                    _PMathObj flav = fla.Compute();
+                    if (flav&&(flav->ObjectClass()==NUMBER)) {
+                        positionSpec[i] = flav->Value();
+                    }
+                }
+            }
+        }
+        DeleteObject (positionList);
+    }
+
+    if (windowType->Equal (&windowTypeClose)) {
+        _String     wName   = GetStringFromFormula ((_String*)parameters(1),chain.nameSpacePrefix);
+        long        wID     = FindWindowByName (wName);
+        if (wID >= 0) {
+            postWindowCloseEvent (((_HYWindow*)windowObjectRefs (wID))->GetID());
+        }
+        done = true;
+    } else if (windowType->Equal (&windowTypeTree)||windowType->Equal (&windowTypeTable)||windowType->Equal (&windowTypeDistribTable)||windowType->Equal (&windowTypeDatabase)) {
+        _String  * windowOptions = ((_String*)parameters(1));
+        _Matrix  * theOptions = (_Matrix*)FetchObjectFromVariableByType(&AppendContainerName(*windowOptions,chain.nameSpacePrefix),MATRIX);
+        if (!theOptions) {
+            if ((windowOptions->sLength>3)&&(windowOptions->sData[0]=='{')
+                    &&(windowOptions->sData[windowOptions->sLength-1]=='}')) {
+                theOptions = new _Matrix (*windowOptions);
+            } else {
+                WarnError (*windowOptions & " is not a valid inline matrix specification/variable reference in call to OpenWindow.");
+                return;
+            }
+        } else {
+            theOptions->nInstances++;
+        }
+
+        if (theOptions->MatrixType()!=2||theOptions->GetVDim()>1||theOptions->GetHDim()<1) {
+            DeleteObject (theOptions);
+            WarnError (*windowOptions & " is not a valid options matrix in call to OpenWindow.");
+            return;
+        }
+
+        if (windowType->Equal (&windowTypeTree)) {
+            // row 1: a tree var reference
+            _PMathObj arg = theOptions->GetFormula(0,0)->Compute();
+            if (!(arg&&(arg->ObjectClass () == STRING))) {
+                DeleteObject (theOptions);
+                errMsg = "The first entry in the specification matrix must be a tree variable ID string in call to OpenWindow.";
+                WarnError (errMsg);
+                return;
+            }
+
+            windowOptions = ((_FString*)arg)->theString;
+
+            long f = LocateVarByName (AppendContainerName(*windowOptions,chain.nameSpacePrefix));
+            if (f>=0) {
+                _Variable* treeVar = FetchVar (f);
+                if (treeVar->ObjectClass()==TREE) {
+                    _String windowName = _String ("Tree ")&*treeVar->GetName();
+                    long fw = FindWindowByName (windowName);
+                    _HYTreePanel * myTP;
+                    if (fw>=0) {
+                        myTP = (_HYTreePanel*)windowObjectRefs (fw);
+                        myTP->SetVariableReference   (*treeVar->GetName());
+                        myTP->BuildTree (true);
+                    } else {
+                        myTP = new _HYTreePanel (*treeVar->GetName(), *treeVar->GetName());
+                        checkPointer (myTP);
+                    }
+                    resultWindow = myTP;
+                    for (long k=1; k<theOptions->GetHDim(); k++) {
+                        _PMathObj arg = theOptions->GetFormula(k,0)->Compute();
+                        if (!(arg&&(arg->ObjectClass () == STRING))) {
+                            DeleteObject (theOptions);
+                            errMsg = "All entries in the specification matrix must be strings in call to OpenWindow.";
+                            WarnError (errMsg);
+                            return;
+                        }
+                        windowOptions = ((_FString*)arg)->theString;
+                        if (windowOptions->sLength) {
+                            switch (k) {
+                            case 1: { // view options
+                                unsigned int treeFlags = windowOptions->toNum();
+                                if ((treeFlags&HY_TREEPANEL_SCALE_TO_WINDOW)!=(myTP->GetFlags()&HY_TREEPANEL_SCALE_TO_WINDOW)) {
+                                    myTP->ToggleScaleOption ();
+                                }
+                                myTP->SetFlags (treeFlags);
+                                break;
+                            }
+                            case 2: { // window position spec
+                                PositionWindow (myTP,windowOptions);
+                                break;
+                            }
+                            case 3: { // scale variable
+                                myTP->SetScaleVariable (*windowOptions);
+                                break;
+                            }
+                            case 4: { // select branches
+                                _List * nodes2Select = windowOptions->Tokenize(",");
+                                if (nodes2Select->lLength) {
+                                    myTP->SelectRangeAndScroll (*nodes2Select);
+                                }
+                                DeleteObject (nodes2Select);
+                                break;
+                            }
+                            }
+                        }
+                    }
+                } else {
+                    f = -1;
+                }
+            }
+            if (f<0) {
+                errMsg = *windowOptions & " is not the ID of an existing tree in call to OpenWindow.";
+                WarnError (errMsg);
+            }
+
+            DeleteObject (theOptions);
+            done = true;
+        } else if (windowType->Equal (&windowTypeDatabase)) {
+            _PMathObj arg = theOptions->GetFormula(0,0)->Compute();
+            if (!(arg&&(arg->ObjectClass () == STRING))) {
+                DeleteObject (theOptions);
+                errMsg = "The first entry in the specification matrix must be a file name string in call to OpenWindow.";
+                WarnError (errMsg);
+                return;
+            }
+
+            windowOptions = ((_FString*)arg)->theString;
+
+            _String windowName = _String ("SQLite DB: ")&*windowOptions;
+            long fw = FindWindowByName (windowName);
+            _HYDBWindow * myDW;
+            if (fw>=0) {
+                myDW = (_HYDBWindow*)windowObjectRefs (fw);
+                myDW->SetDB  (windowOptions);
+            } else {
+                myDW = new _HYDBWindow (windowName, windowOptions);
+                checkPointer (myDW);
+            }
+            resultWindow = myDW;
+
+            DeleteObject (theOptions);
+            done = true;
+        } else {
+            bool  isD = windowType->Equal (&windowTypeDistribTable);
+
+            if (theOptions->GetHDim()<3) {
+                DeleteObject (theOptions);
+
+                errMsg = "The matrix specification for a chart window must have at least 3 entries in call to OpenWindow.";
+                WarnError (errMsg);
+                return;
+
+            }
+            _PMathObj arg  = theOptions->GetFormula(1,0)->Compute(),
+                      arg2 = theOptions->GetFormula(2,0)->Compute(),
+                      arg3 = theOptions->GetFormula(0,0)->Compute();
+
+            if (!(arg&&(arg->ObjectClass () == STRING)&&arg2&&(arg2->ObjectClass () == STRING)&&arg3&&(arg3->ObjectClass () == STRING))) {
+                DeleteObject (theOptions);
+
+                errMsg = "The first two entries in the specification matrix must be strings with matrix ID (e.g. \"matrixID\") in call to OpenWindow.";
+                WarnError (errMsg);
+                return;
+            }
+
+            windowOptions = ((_FString*)arg)->theString;
+
+            _String      *options2 = ((_FString*)arg2)->theString;
+            long f = LocateVarByName            (AppendContainerName(*windowOptions,chain.nameSpacePrefix)),
+                 f2 = LocateVarByName   (AppendContainerName(*options2,chain.nameSpacePrefix));
+
+            if ((f>=0)&&(f2>=0)) {
+                _Variable* labelMatrix = FetchVar (f),
+                           * dataMatrix  = FetchVar (f2);
+
+                if ((labelMatrix->ObjectClass()==MATRIX)&&(dataMatrix->ObjectClass()==MATRIX)) {
+                    _Matrix*lMatrix = (_Matrix*)labelMatrix->GetValue(),
+                            *dMatrix = (_Matrix*)dataMatrix->GetValue();
+
+                    _String windowName = *((_FString*)arg3)->theString;
+                    long fw = FindWindowByName (windowName);
+                    _List   columnHeaders;
+
+                    for (f2=0; f2<lMatrix->GetVDim(); f2++) {
+                        _Formula  *fff= lMatrix->GetFormula(0,f2);
+                        if (fff) {
+                            _PMathObj arg = fff->Compute();
+                            if (arg->ObjectClass()==STRING) {
+                                columnHeaders && ((_FString*)arg)->theString;
+                                continue;
+                            }
+                        }
+                        columnHeaders && & empty;
+
+                    }
+
+                    if ((dMatrix->GetVDim()!=columnHeaders.lLength)&&(dMatrix->GetVDim()!=columnHeaders.lLength-1)) {
+                        errMsg = "The number of columns in the data matrix must match the dimension of the header matrix in call to OpenWindow (CHART_WINDOW).";
+                        WarnError (errMsg);
+                        return;
+                    }
+
+                    if ((dMatrix->GetHDim()==0)||(lMatrix->GetVDim()==0)) {
+                        errMsg = "Empty data matrix (or label matrix) in call to OpenWindow (CHART_WINDOW).";
+                        WarnError (errMsg);
+                        return;
+                    }
+
+                    _String      mL[14];
+
+                    for (long k=3; k<theOptions->GetHDim(); k++) {
+                        _PMathObj arg = theOptions->GetFormula(k,0)->Compute();
+                        if (!(arg&&(arg->ObjectClass () == STRING))) {
+                            DeleteObject (theOptions);
+                            errMsg = "All entries in the specification matrix must be strings in call to OpenWindow.";
+                            WarnError (errMsg);
+                            return;
+                        }
+                        windowOptions = ((_FString*)arg)->theString;
+                        mL [k-3] = *windowOptions;
+
+                        if (k==16) {
+                            break;
+                        }
+                    }
+
+                    _HYChartWindow * myTP;
+
+                    if (isD) {
+                        _List   *varInfo = mL[13].Tokenize (";"),
+                                 cInfo,
+                                 dInfo;
+
+
+                        bool      firstDerived = false;
+                        _String   errMsg;
+
+                        for (long k=0; k < varInfo->lLength; k++) {
+                            _List *item = ((_String*)(*varInfo)(k))->Tokenize (":");
+                            if (item->lLength == 1) {
+                                if (cInfo.lLength) {
+                                    dInfo << (*item)(0);
+                                } else {
+                                    errMsg = "Derived variables appear before the atom variables";
+                                }
+                                firstDerived = true;
+                            } else {
+                                if (firstDerived) {
+                                    errMsg = "Some atom variables appear after derived variables";
+                                } else if ((item->lLength>=3) && (item->lLength % 2 == 1)) {
+                                    _String * vName = (_String*)(*item)(0);
+                                    if (vName->IsValidIdentifier()) {
+                                        long      catCount = (item->lLength - 1)/2;
+
+                                        _Matrix   wts (1,catCount,false,true),
+                                                  prb (1,catCount,false,true);
+
+                                        for (long k2 = 0, k3 = catCount+1; k2 < catCount; k2++, k3++) {
+                                            wts.theData[k2] = ((_String*)(*item)(k2+1))->toNum();
+                                            prb.theData[k2] = ((_String*)(*item)(k3))->toNum();
+                                        }
+
+                                        _List anItem;
+                                        anItem << vName;
+                                        anItem && & wts;
+                                        anItem && & prb;
+                                        cInfo && & anItem;
+                                    } else {
+                                        errMsg = *vName & " is an invalid atom variable identifier";
+                                    }
+                                } else {
+                                    errMsg = "Invalid item count in atom variable specification";
+                                }
+                            }
+
+                            if (errMsg.sLength) {
+                                DeleteObject (item);
+                                DeleteObject (varInfo);
+                                errMsg = errMsg  & " in call to OpenWindow";
+                                ProblemReport (errMsg);
+                                return;
+                            }
+                        }
+
+                        DeleteObject (varInfo);
+
+                        if (fw>=0) {
+                            myTP = (_HYChartWindow*)windowObjectRefs (fw);
+                            myTP->SetTable   (columnHeaders,*dMatrix);
+                            ((_HYDistributionChartWindow*)myTP)->SetAtoms (*dMatrix,cInfo);
+                        } else {
+                            myTP = new _HYDistributionChartWindow (windowName,columnHeaders, *dMatrix, cInfo, nil);
+                            checkPointer (myTP);
+                        }
+
+                        for (long dc = 0; dc < dInfo.lLength; dc++) {
+                            ((_HYDistributionChartWindow*)myTP)->AddVariable ((_String*)dInfo(dc));
+                        }
+                    } else {
+                        if (fw>=0) {
+                            myTP = (_HYChartWindow*)windowObjectRefs (fw);
+                            myTP->SetTable   (columnHeaders,*dMatrix);
+                        } else {
+                            myTP = new _HYChartWindow (windowName,columnHeaders,*dMatrix,nil);
+                            checkPointer (myTP);
+                        }
+                    }
+
+                    resultWindow = myTP;
+
+                    myTP->SetChartType (mL[0],mL[1],mL[2],false);
+                    myTP->ToggleSuspend (true);
+
+                    long  kk;
+
+                    _Parameter  uMin = 0.0,
+                                uMax = uMin;
+
+                    _List * ubounds = mL[12].Tokenize(",");
+                    if (ubounds->lLength == 3) {
+                        mL[12] = *(_String*)(*ubounds)(0);
+                        uMin = ((_String*)(*ubounds)(1))->toNum();
+                        uMax = ((_String*)(*ubounds)(2))->toNum();
+                    }
+                    DeleteObject (ubounds);
+
+                    if ((kk = mL[8].Find(';'))>0) {
+                        myTP->SetLabels    (mL[3],mL[4],mL[5],mL[6].toNum(),mL[7],mL[8].Cut (0,kk-1).toNum()-1,mL[8].Cut (kk+1,-1).toNum()-1,mL[12].toNum(),uMin,uMax);
+                    } else {
+                        myTP->SetLabels    (mL[3],mL[4],mL[5],mL[6].toNum(),mL[7],-1,-1,mL[12].toNum(),uMin,uMax);
+                    }
+
+                    _List * optList = mL[9].Tokenize (";");
+
+                    if (optList->lLength == 3) {
+                        myTP->SetProjection (((_String*)(*optList)(0))->toNum(),((_String*)(*optList)(1))->toNum(),((_String*)(*optList)(2))->toNum());
+                    }
+
+                    DeleteObject (optList);
+
+                    optList = mL[10].Tokenize (";");
+                    myTP->SetFonts (optList);
+                    DeleteObject (optList);
+
+                    optList = mL[11].Tokenize (";");
+                    myTP->SetColors (optList);
+                    DeleteObject (optList);
+
+                    myTP->ToggleSuspend (false);
+                    myTP->DrawChart     ();
+                } else {
+                    f = -1;
+                }
+            }
+
+            if (f<0 || f2<0) {
+                errMsg = *windowOptions & " and " & *options2 & " must both refer to existing matrices in call to OpenWindow.";
+                WarnError (errMsg);
+            }
+
+            DeleteObject (theOptions);
+            done = true;
+        }
+    }
+
+    if (resultWindow) {
+        if ((positionSpec[0]>-1)&&(positionSpec[1]>-1)) {
+            resultWindow->SetWindowRectangle (0,0,positionSpec[1],positionSpec[0]);
+        }
+        if ((positionSpec[2]>-1)&&(positionSpec[3]>-1)) {
+            resultWindow->SetPosition (positionSpec[2],positionSpec[3]);
+        }
+
+        resultWindow->BringToFront ();
+        handleGUI(true);
+    }
+
+    if (!done) {
+        errMsg =  *windowType& " is not a valid window type in call to OpenWindow.";
+        WarnError (errMsg);
+    }
+#endif
+}
+
+void      _ElementaryCommand::ExecuteCase41 (_ExecutionList& chain)
+{
+    chain.currentCommand++;
+
+#if !defined    __UNIX__ && ! defined __HEADLESS__
+    _String     lfID,
+                dsWindow,
+                errMsg;
+
+    long        treeID = -1;
+
+    _SimpleList subsetSpec;
+
+    lfID = ProcessLiteralArgument ((_String*)parameters(0),chain.nameSpacePrefix);
+
+    if (!lfID.IsValidIdentifier()) {
+        errMsg = lfID & " is not a valid likelihood function identifier.";
+        WarnError (errMsg);
+        return;
+    }
+
+    dsWindow = ProcessLiteralArgument ((_String*)parameters(1),chain.nameSpacePrefix);
+
+    treeID =  LocateVarByName(dsWindow);
+
+    if (treeID<0 || FetchVar(treeID)->ObjectClass()!=TREE) {
+        errMsg = dsWindow & " is not the name of an existing tree.";
+        WarnError (errMsg);
+        return;
+    } else {
+        treeID = variableNames.GetXtra (treeID);
+    }
+
+    dsWindow = ProcessLiteralArgument ((_String*)parameters(2),chain.nameSpacePrefix);
+    long     k = FindWindowByName (dsWindow);
+
+    if ((k<0)||(((_HYWindow*)windowObjectRefs (k))->WindowKind () != HY_WINDOW_KIND_DATAPANEL)) {
+        errMsg = dsWindow & " is not the name of an open data panel window.";
+        WarnError (errMsg);
+        return;
+    }
+
+    _HYDataPanel * theDP  = (_HYDataPanel*)windowObjectRefs (k);
+    _Matrix * theMatrix = (_Matrix*)FetchObjectFromVariableByType(&AppendContainerName(*(_String*)parameters(3),chain.nameSpacePrefix),MATRIX);
+
+    if (theMatrix) {
+        for (long i1 = 0; i1< theMatrix->GetHDim(); i1++)
+            for (long i2 = 0; i2 < theMatrix->GetVDim (); i2++) {
+                subsetSpec << (*theMatrix)(i1,i2);
+            }
+
+        theDP->BuildLikelihoodFunction (&lfID,& subsetSpec, treeID);
+        return;
+    }
+
+    errMsg = (*(_String*)parameters(3)) & " is not the name of an existing matrix.";
+    WarnError (errMsg);
+
+#endif
+}
+
+
+//____________________________________________________________________________________
+
+void      _ElementaryCommand::ExecuteCase25 (_ExecutionList& chain, bool issscanf)
+{
+    chain.currentCommand++;
+    // first of all obtain the string to be parsed
+    // either read the file into a string or get a string from standard input
+    _String     currentParameter = *(_String*)parameters(0),
+                *data = nil;
+
+    long        p,
+                p2 = 0,
+                r,
+                q,
+                v,
+                t,
+                shifter = simpleParameters.lData[0] < 0;
+
+    bool        skipDataDelete = false;
+    _Variable*  iseof          = CheckReceptacle (&hasEndBeenReached,empty,false);
+
+    if (currentParameter==_String("stdin")) { //
+        if (chain.stdinRedirect) {
+            data = chain.FetchFromStdinRedirect ();
+        } else {
+            if (!CheckEqual(iseof->Compute()->Value(),0) && currentParameter.Equal (&scanfLastFilePath)) {
+                WarnError ("Ran out of standard input\n");
+                return;
+            }
+            checkPointer ((Ptr)(data = new _String (StringFromConsole())));
+        }
+    } else {
+        if (issscanf) {
+            currentParameter = chain.AddNameSpaceToID(currentParameter);
+            _FString * sscanfData = (_FString*)FetchObjectFromVariableByType(&currentParameter,STRING);
+            if (!sscanfData) {
+                WarnError         (currentParameter& " does not refer to a string variable in call to sscanf");
+                return;
+            }
+            data = sscanfData->theString;
+            skipDataDelete = true;
+
+            if (iseof->Compute()->Value() > 0.) {
+                scanfLastFilePath = empty;
+            }
+
+            if (!currentParameter.Equal (&scanfLastFilePath) || shifter) {
+                scanfLastFilePath     = currentParameter;
+                p = scanfLastReadPosition = 0;
+            } else {
+                p = p2 = scanfLastReadPosition;
+                if (p>=data->sLength) {
+                    iseof->SetValue (new _Constant (1.0), false);
+                    return;
+                }
+            }
+        } else {
+            FILE*   inputBuffer;
+            if (currentParameter.Find('"')==-1) {
+                currentParameter = GetStringFromFormula (&currentParameter,chain.nameSpacePrefix);
+            }
+
+            currentParameter.ProcessFileName(false,false,(Ptr)chain.nameSpacePrefix);
+            if (terminateExecution) {
+                return;
+            }
+            inputBuffer = doFileOpen (currentParameter.getStr(), "rb");
+            if (!inputBuffer) {
+                WarnError         (currentParameter& " could not be opened for reading by fscanf. Path stack: " & _String((_String*)pathNames.toStr()));
+                return;
+            }
+
+            if (iseof->Compute()->Value()>0) {
+                scanfLastFilePath = empty;
+            }
+
+            if (!currentParameter.Equal (&scanfLastFilePath) || shifter) {
+                scanfLastFilePath = currentParameter;
+                scanfLastReadPosition = 0;
+            }
+
+            fseek (inputBuffer,0,SEEK_END);
+            p    = ftell (inputBuffer);
+            p   -= scanfLastReadPosition;
+
+            if (p<=0) {
+                iseof->SetValue (new _Constant (1.0), false);
+                fclose(inputBuffer);
+                return;
+            }
+
+            data = (_String*)checkPointer(new _String ((unsigned long)p));
+            rewind (inputBuffer);
+            fseek  (inputBuffer, scanfLastReadPosition, SEEK_SET);
+            fread  (data->sData, 1, p, inputBuffer);
+            fclose (inputBuffer);
+        }
+    }
+    // now that the string has been read in, read in all the terms, ignoring all the characters in between
+    if (!skipDataDelete) {
+        p = 0;    // will be used to keep track of the position in the string
+    }
+
+    q = 0;
+    r = shifter;
+
+    while (r<simpleParameters.lLength && p<data->sLength) {
+        _String *currentParameter = ProcessCommandArgument((_String*)parameters(r+1-shifter)); // name of the receptacle
+        if (!currentParameter) {
+            DeleteObject (data);
+            return;
+        }
+        if (!currentParameter->IsValidIdentifier()) {
+            WarnError (_String ('\\') & *currentParameter & "\" is not a valid identifier in call to fscanf.");
+            DeleteObject (data);
+            return;
+        }
+        _String namespacedParameter (chain.AddNameSpaceToID(*currentParameter));
+
+        v = LocateVarByName (namespacedParameter);
+        if (v<0) {
+            if (simpleParameters.lData[r]!=2) {
+                v = CheckReceptacle(&namespacedParameter,empty,false)->GetAVariable();
+            }
+        } else {
+            if (simpleParameters.lData[r]==2)
+                if (FetchVar(v)->ObjectClass()==TREE) {
+                    DeleteVariable(*FetchVar(v)->GetName());
+                }
+        }
+
+
+        _Variable * theReceptacle = FetchVar(v); //this will return nil for TREE
+
+        if (simpleParameters.lData[r]==0) { // number
+            q = p;
+            while (!(((('0'<=data->sData[q])&&(data->sData[q]<='9'))||(data->sData[q]=='-')||(data->sData[q]=='+')||(data->sData[q]=='.')||(data->sData[q]=='e')||(data->sData[q]=='E')))
+                    &&(q<data->sLength)) {
+                q++;
+            }
+            p = q;
+            while (((('0'<=data->sData[q])&&(data->sData[q]<='9'))||(data->sData[q]=='-')||(data->sData[q]=='+')||(data->sData[q]=='.')||(data->sData[q]=='e')||(data->sData[q]=='E'))
+                    &&(q<data->sLength)) {
+                q++;
+            }
+            theReceptacle->SetValue (new _Constant (data->Cut (p, q-1).toNum()), false);
+            while ((q<data->sLength-1)&&(isspace (data->sData[q+1]))) {
+                q++;
+            }
+        } else {
+            if (simpleParameters.lData[r]==3) { // string
+                q=0;
+                bool  startFound=false;
+                while (q+p<data->sLength) {
+                    char c = data->sData[q+p];
+                    if (!startFound) {
+                        if (!isspace(c)) {
+                            p+=q;
+                            startFound = true;
+                            q=0;
+                        }
+                    } else if (c=='\n' || c=='\r' || c=='\t') {
+                        break;
+                    }
+                    q++;
+                }
+                if (startFound) {
+                    theReceptacle->SetValue (new _FString (new _String(*data,p,q+p-1)),false);
+                } else {
+                    theReceptacle->SetValue (new _FString, false);
+                }
+
+                p+=q;
+                r++;
+                continue;
+            } else if (simpleParameters.lData[r]==5) { // raw
+                theReceptacle->SetValue (new _FString (new _String (*data,p,-1)), false);
+                p = data->sLength;
+                r++;
+                continue;
+            } else {
+                if (simpleParameters.lData[r]==6) { // lines
+                    _String  inData  (*data,p,-1);
+
+                    _List     lines;
+
+                    long      lastP = 0,
+                              loopP = 0;
+
+                    for (loopP = 0; loopP < inData.sLength; loopP ++) {
+                        if (inData.sData[loopP] == '\r' || inData.sData[loopP] == '\n') {
+                            if (lastP<loopP) {
+                                lines.AppendNewInstance (new _String (inData,lastP, loopP-1));
+                            } else {
+                                lines && & empty;
+                            }
+
+                            lastP = loopP+1;
+
+                            if (lastP < inData.sLength && (inData.sData[lastP] == '\r' || inData.sData[lastP] == '\n') && (inData.sData[lastP] != inData.sData[lastP-1])) {
+                                lastP++;
+                            }
+
+                            loopP = lastP-1;
+                        }
+                    }
+
+                    if (lastP < inData.sLength && lastP<loopP) {
+                        lines.AppendNewInstance (new _String (inData,lastP, loopP-1));
+                    } else if (lines.lLength == 0) {
+                        lines && & empty;
+                    }
+
+                    theReceptacle->SetValue (new _Matrix (lines), false);
+                    p = data->sLength;
+                    r++;
+                    continue;
+                } else {
+                    char delimiter1 = (simpleParameters.lData[r]==2)?'(':'{',
+                         delimiter2 = delimiter1=='{'?'}':')';
+                    q = data->Find (delimiter1,p,-1);
+                    if (q==-1) {
+                        break;
+                    }
+                    p = q;
+                    t = 0;
+                    do {
+                        if (data->sData[q]==delimiter1) {
+                            t++;
+                        } else if (data->sData[q]==delimiter2) {
+                            t--;
+                        }
+                        q++;
+                    } while (t&&(q<data->sLength));
+                    if (t) {
+                        break;
+                    }
+                    if ((simpleParameters.lData[r]==1)||(simpleParameters.lData[r]==4)) { // matrix
+                        _String localData (*data,p,q-1);
+                        _Matrix *newMatrixValue = new _Matrix (localData,simpleParameters.lData[r]==4);
+                        checkPointer (newMatrixValue);
+                        theReceptacle->SetValue (newMatrixValue, false);
+                    } else {
+                        long  varID = LocateVarByName (namespacedParameter);
+                        if (varID>=0)
+                            if (FetchVar(varID)->ObjectClass()==TREE) {
+                                DeleteVariable(*FetchVar(varID)->GetName());
+                            }
+                        _String  treeString (*data, p, q-1);
+                        _TheTree dummyTree (namespacedParameter, treeString);
+                    }
+                }
+            }
+        }
+        p = q+1;
+        r++;
+    }
+
+    if (r<simpleParameters.lLength) {
+        ReportWarning ("fscanf could not read all the parameters requested.");
+        iseof->SetValue (new _Constant (1.0), false);
+    } else {
+        iseof->SetValue (new _Constant (0.0), false);
+    }
+
+    if (skipDataDelete) {
+        scanfLastReadPosition += p-p2;
+    } else {
+        scanfLastReadPosition += p;
+        DeleteObject (data);
+    }
+}
+//____________________________________________________________________________________
+
+void      _ElementaryCommand::ExecuteCase31 (_ExecutionList& chain)
+// 20100312 SLKP: added matrix-expression based model
+// definitions
+{
+    chain.currentCommand++;
+    // first check to see if matrix parameters here are valid
+
+    bool     usingLastDefMatrix = false,
+             doExpressionBased  = false;
+
+    _Formula *isExpressionBased  = nil;
+
+    _String* parameterName,
+             errMsg,
+             arg0 = chain.AddNameSpaceToID(*(_String*)parameters(0));
+
+    long     f,
+             f2=-1,
+             matrixDim,
+             f3,
+             multFreqs = 1;
+
+
+
+    if (parameters.lLength>3) {
+        parameterName = (_String*)parameters.lData[3];
+        if (parameterName->Equal(&ModelTrainNNFlag)) {
+            _String arg1 = chain.AddNameSpaceToID(*(_String*)parameters(1));
+            TrainModelNN (&arg0,&arg1);
+            return;
+        } else
+
+            if (parameterName->Equal(&explicitFormMExp)) {
+                doExpressionBased = true;
+                multFreqs         = 0;
+            } else {
+                multFreqs = ProcessNumericArgument (parameterName,chain.nameSpacePrefix);
+            }
+    }
+
+    _Matrix*  checkMatrix = nil;
+
+    parameterName = (_String*)parameters.lData[1];
+
+    if (parameterName->Equal (&useLastDefinedMatrix)) {
+        if (lastMatrixDeclared<0) {
+            errMsg = "First Call to Model. USE_LAST_DEFINED_MATRIX is meaningless.";
+            acknError (errMsg);
+            return;
+        }
+        f3 = lastMatrixDeclared;
+        f  = modelMatrixIndices[f3];
+        usingLastDefMatrix = true;
+    } else {
+        if (doExpressionBased) {
+            _String matrixExpression (ProcessLiteralArgument((_String*)parameters.lData[1],chain.nameSpacePrefix)),
+                    defErrMsg = _String ("The expression for the explicit matrix exponential passed to Model must be a valid matrix-valued HyPhy formula that is not an assignment.") & ':' & matrixExpression;
+            // try to parse the expression, confirm that it is a square  matrix,
+            // and that it is a valid transition matrix
+            isExpressionBased = (_Formula*)checkPointer(new _Formula);
+            _FormulaParsingContext fpc (nil, chain.nameSpacePrefix);
+            long parseCode = Parse(isExpressionBased,matrixExpression,fpc, nil);
+            if (parseCode != HY_FORMULA_EXPRESSION || isExpressionBased->ObjectClass()!= MATRIX ) {
+                WarnError (defErrMsg );
+                return;
+            }
+            
+            //for (unsigned long k = 0; k < isExpressionBased
+            
+            checkMatrix = (_Matrix*)isExpressionBased->Compute();
+
+
+        } else {
+            parameterName = (_String*)parameters.lData[1];
+
+            _String augName (chain.AddNameSpaceToID(*parameterName));
+            f = LocateVarByName (augName);
+
+            if (f<0) {
+                WarnError (*parameterName & " has not been defined prior to the call to Model = ...");
+                return;
+            }
+
+            _Variable* checkVar = usingLastDefMatrix?LocateVar(f):FetchVar (f);
+            if (checkVar->ObjectClass()!=MATRIX) {
+                WarnError (*parameterName & " must refer to a matrix in the call to Model = ...");
+                return;
+            }
+            checkMatrix = (_Matrix*)checkVar->GetValue();
+        }
+    }
+
+
+    matrixDim = checkMatrix->GetHDim();
+    if ( matrixDim!=checkMatrix->GetVDim() || matrixDim<2 ) {
+        WarnError (*parameterName & " must be a square matrix of dimension>=2 in the call to Model = ...");
+        return;
+    }
+
+    // so far so good
+
+    parameterName = (_String*)parameters.lData[2]; // this is the frequency matrix (if there is one!)
+    _String         freqNameTag (chain.AddNameSpaceToID(*parameterName));
+
+    f2 = LocateVarByName (freqNameTag);
+    if (f2<0) {
+        WarnError(*parameterName & " has not been defined prior to the call to Model = ...");
+        return;
+    }
+    _Variable * checkVar = FetchVar (f2);
+    if (checkVar->ObjectClass()!=MATRIX) {
+        WarnError (*parameterName & " must refer to a column/row vector in the call to Model = ...");
+        return;
+    }
+    checkMatrix = (_Matrix*)checkVar->GetValue();
+    if (checkMatrix->GetVDim()==1) {
+        if (checkMatrix->GetHDim()!=matrixDim) {
+            WarnError (*parameterName & " must be a column vector of the same dimension as the model matrix in the call to Model = ...");
+            return;
+        }
+    } else if (checkMatrix->GetHDim()==1) {
+        if (checkMatrix->GetVDim()!=matrixDim) {
+            WarnError ( *parameterName & " must be a row vector of the same dimension as the model matrix in the call to Model = ...");
+            return;
+        }
+        errMsg = *parameterName & " has been transposed to the default column vector setting ";
+        checkMatrix->Transpose();
+        ReportWarning (errMsg);
+    } else {
+        WarnError (*parameterName & " must refer to a column/row vector in the call to Model = ...");
+        return;
+    }
+
+    if (usingLastDefMatrix) {
+        if (modelFrequenciesIndices[f3]<0) {
+            f2 = -f2-1;
+        }
+    } else if (multFreqs == 0) { // optional flag present
+        f2 = -f2-1;
+    }
+
+    long existingIndex = modelNames.Find(&arg0);
+
+    if (existingIndex == -1) { // name not found
+        lastMatrixDeclared = modelNames.Find (&empty);
+
+        if (lastMatrixDeclared>=0) {
+            modelNames.Replace (lastMatrixDeclared,&arg0,true);
+            modelTypeList.lData[lastMatrixDeclared] = isExpressionBased?matrixDim:0;
+            if (isExpressionBased) {
+                modelMatrixIndices.lData[lastMatrixDeclared] = (long)isExpressionBased;
+            } else {
+                modelMatrixIndices.lData[lastMatrixDeclared] = (usingLastDefMatrix?f:variableNames.GetXtra(f));
+            }
+
+            if (f2>=0) {
+                modelFrequenciesIndices.lData[lastMatrixDeclared] = variableNames.GetXtra(f2);
+            } else {
+                modelFrequenciesIndices.lData[lastMatrixDeclared] = -variableNames.GetXtra(-f2-1)-1;
+            }
+        } else {
+            modelNames && & arg0;
+            modelTypeList << (isExpressionBased?matrixDim:0);
+            if (isExpressionBased) {
+                modelMatrixIndices << (long)isExpressionBased;
+            } else {
+                modelMatrixIndices << (usingLastDefMatrix?f:variableNames.GetXtra(f));
+            }
+            if (f2>=0) {
+                modelFrequenciesIndices << variableNames.GetXtra(f2);
+            } else {
+                modelFrequenciesIndices << -variableNames.GetXtra(-f2-1)-1;
+            }
+            lastMatrixDeclared = modelNames.lLength-1;
+        }
+    } else {
+        modelNames.Replace(existingIndex,&arg0,true);
+        if (modelTypeList.lData[existingIndex]) {
+            delete ((_Formula*)modelMatrixIndices[existingIndex]);
+        }
+
+        modelTypeList.lData[existingIndex] = isExpressionBased?matrixDim:0;
+        if (isExpressionBased) {
+            modelMatrixIndices[existingIndex] = (long)isExpressionBased;
+        } else {
+            modelMatrixIndices[existingIndex] = usingLastDefMatrix?f:variableNames.GetXtra(f);
+        }
+
+
+        if (f2>=0) {
+            modelFrequenciesIndices[existingIndex] = variableNames.GetXtra(f2);
+        } else {
+            modelFrequenciesIndices[existingIndex] = -variableNames.GetXtra(-f2-1)-1;
+        }
+
+        lastMatrixDeclared = existingIndex;
+    }
+}
+
+//____________________________________________________________________________________
+
+void      _ElementaryCommand::ExecuteCase32 (_ExecutionList& chain)
+{
+    chain.currentCommand++;
+    // first check to see if matrix parameters here are valid
+    long        f = LocateVarByName (AppendContainerName(*(_String*)parameters (3),chain.nameSpacePrefix)),
+                fixedLength = ProcessNumericArgument((_String*)parameters(2),chain.nameSpacePrefix);
+
+
+    _String     saveTheArg;
+    _SimpleList sel,
+                exclusions;
+
+    _Variable* holder;
+
+    if (fixedLength<0) {
+        fixedLength = 1;
+        saveTheArg = *(_String*)parameters(2) & " should represent a non-negative integer in call to ChoiceList. The value was reset to 1";
+        ReportWarning (saveTheArg);
+    }
+
+    if (f>=0) {
+        holder = FetchVar(f);
+        if (holder->ObjectClass()==NUMBER) {
+            if ((f = holder->Value())>=0) {
+                exclusions<<f;
+            }
+        } else if (holder->ObjectClass()==MATRIX) {
+            _Matrix* theExcl = (_Matrix*)holder->GetValue()->Compute();
+            for (long k=theExcl->GetHDim()*theExcl->GetVDim()-1; k>=0; k--) {
+                f = (*theExcl)[k];
+                if (f>=0) {
+                    exclusions<<f;
+                }
+            }
+            exclusions.Sort();
+        }
+    }
+
+    holder = CheckReceptacle (&AppendContainerName(*(_String*)parameters (0),chain.nameSpacePrefix), "Choice List", true);
+    holder->SetBounds (-2.0, holder->GetUpperBound());
+
+    bool    validChoices = simpleParameters.lData[0] == 0;
+
+    if (simpleParameters.lData[0])
+        // some data structure present - process accordingly
+    {
+        saveTheArg = *(_String*)parameters(4);
+        // see if there is a "standard argument"
+        _List choices;
+        if (saveTheArg == _String("LikelihoodFunction")) {
+            parameters.Delete(4);
+            for (f=0; f<likeFuncList.lLength; f++) {
+                if (exclusions.BinaryFind(f)>=0) {
+                    continue;
+                }
+
+                if (likeFuncList.lData[f]) {
+                    _List thisPair;
+                    thisPair << likeFuncNamesList(f);
+                    _String likeFuncDesc ("Likelihood Function \"");
+                    likeFuncDesc = likeFuncDesc&*(_String*)likeFuncNamesList(f)&("\".");
+
+                    thisPair && &likeFuncDesc;
+                    choices&& &thisPair;
+                }
+            }
+            validChoices = true;
+            parameters&& & choices;
+        } else {
+            _String nmspName = AppendContainerName(saveTheArg,chain.nameSpacePrefix);
+            f = FindDataSetFilterName (nmspName);
+            if (f>=0) {
+                parameters.Delete(4);
+                _DataSetFilter *theFilter = (_DataSetFilter*)dataSetFilterList (f);
+                for (f = 0; f<theFilter->NumberSpecies(); f++) {
+                    if (exclusions.BinaryFind(f)>=0) {
+                        continue;
+                    }
+
+                    _List thisPair;
+                    thisPair<< theFilter->GetData()->GetNames() (f);
+                    _String spNumber ("Taxon ");
+                    spNumber = spNumber & (f+1) & '(' & *(_String*)theFilter->GetData()->GetNames() (f) & ')';
+                    thisPair && &spNumber;
+                    choices&& &thisPair;
+                }
+                validChoices = true;
+                parameters&& & choices;
+            } else {
+                f = FindDataSetName (nmspName);
+                if (f>=0) {
+                    parameters.Delete(4);
+                    _DataSet *theSet = (_DataSet*)dataSetList (f);
+                    for (f = 0; f<theSet->NoOfSpecies(); f++) {
+                        if (exclusions.BinaryFind(f)>=0) {
+                            continue;
+                        }
+                        _List thisPair;
+                        thisPair<< theSet->GetNames() (f);
+                        _String spNumber ("Taxon ");
+                        spNumber = spNumber & (f+1) & '(' & *(_String*)theSet->GetNames() (f) & ')';
+                        thisPair && &spNumber;
+                        choices&& &thisPair;
+                    }
+                    validChoices = true;
+                    parameters&& & choices;
+                } else {
+                    if (saveTheArg==lastModelParameterList) {
+                        f = lastMatrixDeclared;
+                    } else {
+                        f = modelNames.Find(&nmspName);
+                    }
+
+                    if (f>=0) {
+                        parameters.Delete(4);
+                        _Variable *theSet = LocateVar (modelMatrixIndices.lData[f]);
+                        _SimpleList modelParms;
+                        _String     ts ("All Parameters");
+                        _List       tl;
+                        tl && &ts;
+                        ts = "All local model parameters are constrained";
+                        tl && &ts;
+                        choices && &tl;
+                        _AVLList modelParmsA (&modelParms);
+                        theSet->ScanForVariables(modelParmsA,false);
+                        modelParmsA.ReorderList();
+                        for (f = 0; f<modelParms.lLength; f++) {
+                            if (exclusions.BinaryFind(f)>=0) {
+                                continue;
+                            }
+
+                            _List thisPair;
+                            thisPair<< LocateVar(modelParms.lData[f])->GetName();
+                            _String spNumber ("Constrain parameter ");
+                            spNumber = spNumber & *LocateVar(modelParms.lData[f])->GetName();
+                            thisPair && &spNumber;
+                            choices&& &thisPair;
+                        }
+                        validChoices = true;
+                        parameters&& & choices;
+                    } else {
+                        f = LocateVarByName (nmspName);
+                        if (f>=0) {
+                            _Variable * theV = FetchVar(f);
+                            if (theV->ObjectClass() == MATRIX) {
+                                _Matrix * vM = (_Matrix*)theV->GetValue();
+                                if (vM->IsAStringMatrix() && (vM->GetVDim () == 2)) {
+                                    parameters.Delete(4);
+                                    for (f = 0; f<vM->GetHDim(); f++) {
+                                        if (exclusions.BinaryFind (f) < 0) {
+                                            _Formula   *f1 = vM->GetFormula (f,0),
+                                                        *f2 = vM->GetFormula (f,1);
+
+                                            if (f1&&f2) {
+                                                _PMathObj p1 = f1->Compute(),
+                                                          p2 = f2->Compute();
+
+                                                if (p1&&p2&&(p1->ObjectClass() == STRING)&&(p2->ObjectClass() == STRING)) {
+                                                    _List thisPair;
+                                                    thisPair << ((_FString*)p1)->theString;
+                                                    thisPair << ((_FString*)p2)->theString;
+                                                    choices&& &thisPair;
+                                                }
+                                            }
+                                        }
+                                    }
+                                    validChoices = true;
+                                    parameters&& & choices;
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+    if (validChoices) {
+        long choice = -1;
+        _List* theChoices = (_List*)parameters(4);
+        if (fixedLength>theChoices->lLength) {
+            _String e = "List of selections is too short in ChoiceList";
+            acknError (e);
+        } else {
+            if (chain.stdinRedirect) {
+                if (fixedLength == 1) {
+                    _String buffer (chain.FetchFromStdinRedirect());
+                    for (choice = 0; choice<theChoices->lLength; choice++)
+                        if (buffer.Equal ((_String*)(*(_List*)(*theChoices)(choice))(0))) {
+                            break;
+                        }
+                    if (choice == theChoices->lLength) {
+                        choice = -1;
+                        WarnError (_String("Not a valid option: '") & buffer & "' passed to Choice List '" & ((_String*)parameters(1))->sData & "' using redirected stdin input");
+                        return;
+                    }
+                } else {
+                    if (fixedLength>0) {
+                        while (sel.lLength<fixedLength) {
+                            _String buffer (chain.FetchFromStdinRedirect());
+                            for (choice = 0; choice<theChoices->lLength; choice++)
+                                if (buffer.Equal ((_String*)(*(_List*)(*theChoices)(choice))(0))) {
+                                    break;
+                                }
+                            if (choice<theChoices->lLength && sel.Find(choice)==-1) {
+                                sel<<choice-1;
+                            } else {
+                                break;
+                            }
+                        }
+                        if (sel.lLength<fixedLength) {
+                            WarnError ("Failed to make the required number of choices in ChoiceList using redirected stdin input.");
+                            return;
+                        }
+                    } else
+                        while (1) {
+                            _String buffer (chain.FetchFromStdinRedirect());
+                            if (buffer.sLength) {
+                                for (choice = 0; choice<theChoices->lLength; choice++)
+                                    if (buffer.Equal ((_String*)(*(_List*)(*theChoices)(choice))(0))) {
+                                        break;
+                                    }
+
+                                if (choice<theChoices->lLength && sel.Find(choice)==-1) {
+                                    sel<<choice;
+                                } else {
+                                    WarnError (_String("Not a valid (or duplicate) option: '") & buffer & "' passed to ChoiceList (with multiple selections) '" & ((_String*)parameters(1))->sData & "' using redirected stdin input");
+                                    return;
+                                }
+                            } else {
+                                break;
+                            }
+                        }
+                }
+            } else {
+#ifdef  __HEADLESS__
+                WarnError ("Unhandled request for data from standard input in ChoiceList in headless HyPhy");
+                return;
+#else
+#if defined __HYPHYQT__ || defined __MAC__ || defined __WINDOZE__ || defined __HYPHY_GTK__
+                SetStatusLine ("Waiting for user selection.");
+                _String* param = (_String*)parameters(1);
+
+                _SimpleList std(2,0,1),
+                            all(theChoices->lLength,0,1);
+
+                choice = HandleListSelection (*theChoices,std, all, *param, sel,fixedLength,
+                
+                #ifdef __HYPHYQT__
+                (Ptr)_hyPrimaryConsoleWindow
+                #else
+                (Ptr)hyphyConsoleWindow
+                #endif
+                );
+#else
+                _String* param = (_String*)parameters(1);
+                printf ("\n\n\t\t\t+");
+
+                for (f = 1; f<param->sLength+1; f++) {
+                    printf ("-");
+                }
+
+                printf ("+\n\t\t\t|%s|\n\t\t\t+",param->getStr());
+
+                for (f = 1; f<param->sLength+1; f++) {
+                    printf ("-");
+                }
+
+                printf ("+\n\n");
+
+
+                long  loopits = 1;
+
+                if (fixedLength == 1) {
+                    while (choice == -1) {
+                        for (choice = 0; choice<theChoices->lLength; choice++) {
+                            printf ("\n\t(%ld):[%s] %s",choice+1,((_String*)(*(_List*)(*theChoices)(choice))(0))->getStr(),((_String*)(*(_List*)(*theChoices)(choice))(1))->getStr());
+                        }
+
+                        printf ("\n\n Please choose an option (or press q to cancel selection):");
+                        _String buffer (StringFromConsole());
+                        if (buffer.sData[0] == 'q' || buffer.sData[0] =='Q') {
+                            choice = -1;
+                            break;
+                        }
+                        choice = buffer.toNum();
+                        if (choice<1 || choice>theChoices->lLength) {
+                            choice = -1;
+                            if (loopits++ > 10) {
+                                FlagError ("Failed to make a valid selection in ChoiceList after 10 tries");
+                                return;
+                            }
+                        } else {
+                            choice--;
+                        }
+                    }
+                } else {
+                    if (fixedLength>0)
+                        while (sel.lLength<fixedLength) {
+                            for (choice = 0; choice<theChoices->lLength; choice++) {
+                                if (sel.Find(choice)==-1) {
+                                    printf ("\n\t(%ld):%s",choice+1,((_String*)(*(_List*)(*theChoices)(choice))(1))->getStr());
+                                }
+                            }
+                            printf ("\n\n Please choose option %ld of %ld (or press q to cancel selection):",sel.lLength+1,fixedLength);
+                            _String buffer (StringFromConsole());
+                            if (buffer.sData[0] == 'q' || buffer.sData[0] =='Q') {
+                                choice = -1;
+                                break;
+                            }
+                            choice = buffer.toNum();
+                            if ((choice>=1)&&(choice<=theChoices->lLength)) {
+                                if (sel.Find(choice)==-1) {
+                                    sel<<choice-1;
+                                }
+                            } else {
+                                if (loopits++ > 10) {
+                                    FlagError ("Failed to make a valid selection in ChoiceList after 10 tries");
+                                    return;
+                                }
+                            }
+                        }
+                    else
+                        while (1) {
+                            for (choice = 0; choice<theChoices->lLength; choice++) {
+                                if (sel.Find(choice)==-1) {
+                                    printf ("\n\t(%ld):[%s] %s",choice+1,((_String*)(*(_List*)(*theChoices)(choice))(0))->getStr(),((_String*)(*(_List*)(*theChoices)(choice))(1))->getStr());
+                                }
+                            }
+                            printf ("\n\n Please choose option %ld, enter d to complete selection, enter q to cancel:",sel.lLength+1);
+                            _String buffer (StringFromConsole());
+                            if (buffer.sData[0] == 'q' || buffer.sData[0] =='Q') {
+                                choice = -1;
+                                break;
+                            }
+                            if (buffer.sData[0] == 'd' || buffer.sData[0] =='D') {
+                                break;
+                            }
+
+                            choice = buffer.toNum();
+                            if ((choice>=1)&&(choice<=theChoices->lLength)) {
+                                if (sel.Find(choice)==-1) {
+                                    sel<<choice-1;
+                                }
+                            } else {
+                                if (loopits++ > 10) {
+                                    FlagError ("Failed to make a valid selection in ChoiceList after 10 tries");
+                                    return;
+                                }
+                            }
+                        }
+                }
+#endif
+#endif
+            }
+
+            _Variable* sStrV = CheckReceptacle(&selectionStrings,empty,false);
+
+            if (fixedLength == 1) {
+                if (choice>=0) {
+                    _FString  choiceString (*(_String*) ((_List*)(*theChoices)(choice))->lData[0]);
+                    sStrV->SetValue (&choiceString);
+                    for (long k=0; k<exclusions.lLength; k++) {
+                        if (choice>=exclusions.lData[k]) {
+                            choice++;
+                        } else {
+                            break;
+                        }
+                    }
+                }
+                holder->SetValue (new _Constant (choice), false);
+            } else {
+                if (fixedLength == 0) {
+                    fixedLength = sel.lLength;
+                    if (fixedLength == 0) {
+                        fixedLength = 1;
+                    }
+                }
+                sel.Sort();
+                _Matrix   selVector (1,fixedLength,false,true);
+                _Matrix   selMatrix (1,fixedLength,false,true);
+                if (choice == -1) {
+                    selVector[0]=-1;
+                } else {
+                    for (f=0; f<fixedLength; f++) {
+                        choice=sel.lData[f];
+
+                        _FString  *choiceString = new _FString ((*(_String*) ((_List*)(*theChoices)(choice))->lData[0]));
+                        _Formula  sf (choiceString);
+                        selMatrix.MStore(0,f,sf);
+                        for (long k=0; k<exclusions.lLength; k++) {
+                            if (choice>=exclusions.lData[k]) {
+                                choice++;
+                            } else {
+                                break;
+                            }
+                        }
+                        selVector[f]=choice;
+                        //DeleteObject (choiceString);
+                    }
+                    sStrV->SetValue (&selMatrix);
+                }
+                holder->SetValue (&selVector);
+            }
+
+            if (choice<0) {
+                terminateExecution = true;
+            }
+        }
+    } else {
+        WarnError  ("List of selections is invalid in ChoiceList");
+    }
+
+    if (simpleParameters.lData[0]) {
+        parameters.Delete(4);
+        parameters&& &saveTheArg;
+    }
+}
+
+
+void      _ElementaryCommand::ExecuteCase36 (_ExecutionList& chain)
+{
+    chain.currentCommand++;
+    _String *currentArgument = (_String*)parameters(0),
+             errMsg,
+             result;
+
+    long    f = dataSetNamesList.Find(&AppendContainerName(*currentArgument,chain.nameSpacePrefix)),
+            s,
+            k,
+            m;
+
+    if (f<0) {
+        ReportWarning (*currentArgument & " is not a valid data set in call to OpenDataPanel");
+        return;
+    }
+    _DataSet* theDS = (_DataSet*)dataSetList(f);
+
+    // process species list
+    result = ProcessLiteralArgument ((_String*)parameters(1),chain.nameSpacePrefix);
+    if (result.sLength) {
+        result.Insert ('"',0);
+        result.Insert ('"',-1);
+    }
+    _SimpleList   speciesList;
+    theDS->ProcessPartition (result,speciesList,true);
+
+    // check the validity of list entries
+    s = theDS->NoOfSpecies();
+
+    for (m=speciesList.lLength-1; m>=0; m--) {
+        k = speciesList.lData[m];
+        if (k<0 || k>=s) {
+            speciesList.Delete(m);
+            m--;
+        }
+    }
+
+    if (speciesList.lLength==s) {
+        speciesList.Clear();
+    }
+
+#if !defined __UNIX__ && !defined __HEADLESS__
+
+    _HYDataPanel*  newDP = new _HYDataPanel (empty,empty);
+    if (speciesList.lLength) {
+        newDP->SetDataSetReference (*(_String*)dataSetNamesList(f),&speciesList);
+    } else {
+        newDP->SetDataSetReference (*(_String*)dataSetNamesList(f),nil);
+    }
+    result = dataPanelSourcePath;
+    result = ProcessLiteralArgument (&result,chain.nameSpacePrefix);
+    if (result.sLength) {
+        newDP->SetFilePath (result);
+    }
+    currentArgument = (_String*)parameters(3);
+    newDP->RestorePartInfo(currentArgument);
+    currentArgument = (_String*)parameters(2);
+    newDP->RestorePanelSettings(currentArgument);
+    currentArgument = (_String*)parameters(1);
+    newDP->SetSavePath (chain.sourceFile);
+    newDP->BringToFront();
+    if (parameters.lLength>4) {
+        newDP->BuildLikelihoodFunction ((_String*)parameters(4));
+        newDP->RestoreSavedLFs ();
+    }
+#endif
+}
+
+
+//____________________________________________________________________________________
+// GetInformation()
+void      _ElementaryCommand::ExecuteCase37 (_ExecutionList& chain)
+{
+    chain.currentCommand++;
+
+    _String matrixName = chain.AddNameSpaceToID(*(_String*)parameters(0)),
+            *objectName = (_String*)parameters(1);
+
+
+    long    sID;
+    if (parameters.lLength > 2) {
+        sID = ProcessNumericArgument ((_String*)parameters(2), chain.nameSpacePrefix);
+    }
+
+
+    _Matrix *result = nil;
+
+    // object is a non-empty string
+    if (objectName->sLength > 2 && objectName->sData[0] == '"' && objectName->sData[objectName->sLength-1] == '"')
+        // regular expression
+    {
+        _String regExp = GetStringFromFormula (objectName,chain.nameSpacePrefix);
+        int errNo = 0;
+        Ptr regex = PrepRegExp (&regExp, errNo, true);
+        if (regex) {
+            _List       matches;
+
+            _SimpleList tcache;
+            long        iv,
+                        k = variableNames.Traverser (tcache, iv, variableNames.GetRoot());
+
+            for (; k>=0; k = variableNames.Traverser (tcache, iv)) {
+                _String* vName = (_String*)variableNames.Retrieve (k);
+                _SimpleList mtch;
+                vName->RegExpMatch (regex,mtch);
+                if (mtch.lLength) {
+                    matches << vName;
+                }
+
+            }
+
+            if (matches.lLength) {
+                result = new _Matrix (matches);
+            }
+
+            FlushRegExp (regex);
+        } else {
+            WarnError (GetRegExpError (errNo));
+        }
+    } else {    // object is not a string, is some kind of variable
+        _String objectNameID = chain.AddNameSpaceToID(*objectName);
+        long    f = LocateVarByName (objectNameID);
+        if      (f>=0) {    // it's a numeric variable
+            _Variable* theObject = FetchVar(f);
+            if (theObject->ObjectClass()==STRING) {
+                objectNameID = _String((_String*)theObject->Compute()->toStr());
+                theObject    = FetchVar (LocateVarByName (objectNameID));
+            }
+            if (theObject) { 
+                 if (theObject->IsCategory()) {
+                    _CategoryVariable * thisCV = (_CategoryVariable*)theObject;
+                    thisCV->Refresh();
+
+                    _Matrix *values  = thisCV->GetValues(),
+                             *weights = thisCV->GetWeights(!thisCV->IsUncorrelated());
+
+                    f = values->GetHDim()*values->GetVDim();
+                    result = new _Matrix (2,f,false,true);
+
+                    for (long k = 0; k<f; k++) {
+                        result->theData[k]   = values->theData[k];
+                        result->theData[f+k] = weights->theData[k];
+                    }
+                } else {
+                    if (theObject->ObjectClass()==TREE_NODE) {
+                        _CalcNode* theNode = (_CalcNode*)theObject;
+                        if (theNode->GetModelIndex() != HY_NO_MODEL) {
+                            checkPointer(result = new _Matrix);
+                            theNode->RecomputeMatrix (0,1,result);
+                        }
+                    } else {
+                        if (theObject->ObjectClass() == TOPOLOGY || theObject->ObjectClass() == TREE) {
+ 
+                            _List* map = ((_TreeTopology*)theObject)->MapNodesToModels ();
+                            _AssociativeList* return_this = new _AssociativeList();
+                            
+                            for (unsigned long i = 0; i < map->lLength; i++) {
+                              _List * nodeInfo = (_List*) (*map) (i);
+                              return_this->MStore(*(_String*)(*nodeInfo)(0), *(_String*)(*nodeInfo) (1));
+                            }
+                            result = (_Matrix*) return_this;
+                            DeleteObject (map);
+                        }
+                    }
+
+                    if ((!result)&& theObject->ObjectClass()==NUMBER) {
+                        checkPointer(result = new _Matrix (1,3,false,true));
+                        result->theData[0]=theObject->Compute()->Value();
+                        result->theData[1]=theObject->GetLowerBound();
+                        result->theData[2]=theObject->GetUpperBound();
+                    }
+                }
+            }
+        } else {
+            f = likeFuncNamesList.Find (&objectNameID);
+            if (f>=0) {     // it's a likelihood function
+                _LikelihoodFunction * lf = (_LikelihoodFunction*)likeFuncList (f);
+                f = lf->GetCategoryVars().lLength;
+                if (f==0) {
+                    f++;
+                }
+
+                _List        catVars;
+
+                for (long k=0; k<lf->GetCategoryVars().lLength; k++) {
+                    _String varName = *LocateVar(lf->GetCategoryVars().lData[k])->GetName();
+                    catVars && & varName;
+                }
+
+                result = (_Matrix*) checkPointer(new _Matrix (catVars));
+            } else {
+				if ((f = dataSetFilterNamesList.Find (&objectNameID))>=0)
+					// return a vector of strings - each with actual characters of the corresponding sequence
+				{
+					_DataSetFilter* daFilter = (_DataSetFilter*)dataSetFilterList (f);
+					result = daFilter->GetFilterCharacters();
+				} else {
+					// it's a tree node with a rate matrix assigned
+					f = FindModelName (objectNameID);
+					if (f>=0)
+						// for models, return the list of variables in the model
+					{
+						_SimpleList modelParms;
+						_AVLList    modelParmsA (&modelParms);
+
+						LocateVar (modelMatrixIndices.lData[f])->ScanForVariables(modelParmsA,false);
+						_List       modelPNames;
+
+						for (unsigned long vi=0; vi<modelParms.lLength; vi++) {
+							modelPNames << LocateVar(modelParms.lData[vi])->GetName();
+						}
+
+						result = new _Matrix (modelPNames);
+					}
+				}
+            }
+        }
+    }
+
+    if (!result) {
+        result = new _Matrix (0,0,false,false);
+    }
+
+    CheckReceptacleAndStore (&matrixName, empty, true, result, true);
+    DeleteObject (result);
+
+}
+
+
+//____________________________________________________________________________________
+
+void      _ElementaryCommand::ExecuteCase43 (_ExecutionList& chain)
+{
+    chain.currentCommand++;
+
+    _String *currentArgument = (_String*)parameters(0),
+             result;
+
+    _Variable * theReceptacle = CheckReceptacle(&AppendContainerName(*currentArgument,chain.nameSpacePrefix),code==43?blFindRoot:blIntegrate,true);
+
+    if (theReceptacle) {
+        _String     exprString =  *(_String*)parameters(1);
+        _Formula    theExpression (exprString);
+
+        currentArgument =   (_String*)parameters(2);
+        long f = LocateVarByName (AppendContainerName(*currentArgument,chain.nameSpacePrefix));
+
+        if (f<0) {
+            ReportWarning (*currentArgument & " is not an existing variable to solve for in call to FindRoot/Integrate.");
+            return;
+        }
+
+        if (terminateExecution) {
+            return;
+        }
+
+        _Formula * dF = (code==43)?theExpression.Differentiate (*(_String*)parameters(2),false):nil;
+
+        _Parameter    lb = ProcessNumericArgument ((_String*)parameters(3),chain.nameSpacePrefix),
+                      ub = ProcessNumericArgument ((_String*)parameters(4),chain.nameSpacePrefix);
+
+        if (ub<=lb && code==48) {
+            ReportWarning (_String ('[') & lb & ',' & ub & "] is not a valid search interval in call to FindRoot/Integrate");
+            return;
+        }
+
+        if (code==43) {
+            if (dF) {
+                theReceptacle->SetValue (new _Constant (theExpression.Newton (*dF,FetchVar (f), 0.0, lb, ub)),false);
+            } else {
+                theReceptacle->SetValue (new _Constant (theExpression.Brent (FetchVar(f), lb, ub)), false);
+            }
+        } else {
+            theReceptacle->SetValue (new _Constant (theExpression.Integral (FetchVar (f), lb, ub, ub-lb>1e10)), false);
+        }
+
+        if (dF) {
+            delete (dF);
+        }
+    }
+}
+
+//____________________________________________________________________________________
+
+void      _ElementaryCommand::ExecuteCase44 (_ExecutionList& chain)
+{
+    chain.currentCommand++;
+
+#ifdef __HYPHYMPI__
+    _String *arg1 = (_String*)parameters(0),
+             *arg2 = (_String*)parameters(1),
+              *arg3 = parameters.lLength>2?(_String*)parameters(2):nil,
+               *theMessage = nil;
+
+
+    _Parameter      nodeCount;
+    checkParameter (mpiNodeCount,nodeCount,1);
+
+    long            destID = ProcessNumericArgument (arg1,chain.nameSpacePrefix),
+                    g;
+
+    if (!numericalParameterSuccessFlag || destID<0 || destID>=nodeCount) {
+        WarnError (*arg1 & " is not a valid MPI node ID in call to MPISend.");
+        return;
+    }
+
+    if (arg3) {
+        _AssociativeList * ar = (_AssociativeList *)FetchObjectFromVariableByType (&AppendContainerName(*arg3,chain.nameSpacePrefix), ASSOCIATIVE_LIST);
+        if (!ar) {
+            WarnError (*arg3 & " is not a valid associative array for input options in call to MPISend.");
+            return;
+        }
+        theMessage = new _String (256L, true);
+        checkPointer (theMessage);
+        _String arrayID ("_HYPHY_MPI_INPUT_ARRAY_");
+        (*theMessage) << arrayID;
+        (*theMessage) << '=';
+        arg3 = ar->Serialize (arrayID);
+        (*theMessage) << arg3;
+        DeleteObject (arg3);
+        (*theMessage) << ';';
+        arrayID = *arg2;
+        arrayID.ProcessFileName(false,true,(Ptr)chain.nameSpacePrefix);
+        (*theMessage) << "\nExecuteAFile (\"";
+        (*theMessage) << arrayID;
+        (*theMessage) << "\",_HYPHY_MPI_INPUT_ARRAY_);";
+        theMessage->Finalize();
+    } else if ((g=FindLikeFuncName(AppendContainerName(*arg2,chain.nameSpacePrefix)))>=0) {
+        checkPointer (theMessage = new _String(1024L,true));
+        ((_LikelihoodFunction*)likeFuncList(g))->SerializeLF(*theMessage,_hyphyLFSerializeModeOptimize);
+        theMessage->Finalize();
+    } else {
+        theMessage = new _String (ProcessLiteralArgument (arg2,chain.nameSpacePrefix));
+    }
+
+    if (theMessage == nil || theMessage->sLength==0) {
+        WarnError (*arg2 & " is not a valid (or is an empty) string (LF ID) in call to MPISend.");
+    } else {
+        MPISendString (*theMessage, destID);
+    }
+
+    DeleteObject (theMessage);
+
+#else
+    WarnError ("MPISend can't be used by non-MPI versions of HyPhy.");
+#endif
+
+}
+
+//____________________________________________________________________________________
+
+void      _ElementaryCommand::ExecuteCase45 (_ExecutionList& chain)
+{
+    chain.currentCommand++;
+
+#ifdef __HYPHYMPI__
+    _String *arg1 = (_String*)parameters(0),
+             *arg2 = (_String*)parameters(1),
+              *arg3 = (_String*)parameters(2);
+
+    _Parameter      nodeCount;
+    checkParameter (mpiNodeCount,nodeCount,1);
+
+    long            srcT = ProcessNumericArgument (arg1,chain.nameSpacePrefix),
+                    srcID,
+                    g;
+
+    if ((!numericalParameterSuccessFlag)||(srcT<-1)||(srcT>=nodeCount)) {
+        WarnError (*arg1 & " is not a valid MPI node ID in call to MPIReceive.");
+        return;
+    }
+
+    _Variable* idVar = CheckReceptacle (&AppendContainerName(*arg2,chain.nameSpacePrefix),"MPIReceive"),
+               * mVar  = CheckReceptacle (&AppendContainerName(*arg3,chain.nameSpacePrefix),"MPIReceive");
+
+    if (!(idVar&&mVar)) {
+        return;
+    }
+
+    _FString* theMV = new _FString (MPIRecvString (srcT,srcID));
+    checkPointer (theMV);
+    idVar->SetValue (new _Constant (srcID),false);
+    mVar->SetValue (theMV, false);
+#else
+    WarnError ("MPIReceive can't be used by non-MPI versions of HyPhy.");
+#endif
+
+}
+
+//____________________________________________________________________________________
+
+void      _ElementaryCommand::ExecuteCase46 (_ExecutionList& chain)
+{
+    chain.currentCommand++;
+
+    _String *arg1 = (_String*)parameters(1),
+             *arg2 = (_String*)parameters(0),
+              errMsg;
+
+    long    k = dataSetFilterNamesList.Find (&AppendContainerName(*arg1,chain.nameSpacePrefix));
+
+    if (k<0) {
+        errMsg = *arg1 & " is not a defined data set filter ID ";
+    } else {
+        _DataSetFilter * dsf   = (_DataSetFilter*)dataSetFilterList (k);
+        _Variable *      stVar = CheckReceptacle(&AppendContainerName(*arg2,chain.nameSpacePrefix),"GetDataInfo");
+
+        if (stVar) {
+            if (parameters.lLength == 2) {
+                _Matrix * res = new _Matrix (1,dsf->duplicateMap.lLength, false, true);
+                checkPointer (res);
+                for (k = 0; k<dsf->duplicateMap.lLength; k++) {
+                    res->theData[k] = dsf->duplicateMap.lData[k];
+                }
+                stVar->SetValue (res,false);
+            } else {
+                if (parameters.lLength == 3) {
+                    _String checker = ProcessLiteralArgument ((_String*)parameters(2),chain.nameSpacePrefix);
+                    if (checker == _String ("CHARACTERS")) {
+                        _List   characters;
+                        k       = dsf->GetDimension(true);
+                        long fd = dsf->GetUnitLength();
+                        for (long idx = 0; idx < k; idx++) {
+                            characters.AppendNewInstance(new _String (dsf->ConvertCodeToLetters (dsf->CorrectCode(idx), fd)));
+                        }
+
+                        stVar->SetValue (new _Matrix (characters), false);
+                    } else if (checker == _String ("PARAMETERS")) {
+                        _AssociativeList * parameterInfo = new _AssociativeList;
+                        parameterInfo->MStore ("ATOM_SIZE",             new _Constant (dsf->GetUnitLength()), false);
+                        parameterInfo->MStore ("EXCLUSIONS",            new _FString  (dsf->GetExclusions()), false);
+                        parameterInfo->MStore ("SITES_STRING",          new _FString  ((_String*)dsf->theOriginalOrder.ListToPartitionString()), false);
+                        parameterInfo->MStore ("SEQUENCES_STRING",      new _FString  ((_String*)dsf->theNodeMap.ListToPartitionString()), false);
+                        stVar->SetValue (parameterInfo,false);
+
+                    } else if (checker == _String ("CONSENSUS")) {
+                        stVar->SetValue (new _FString (new _String(dsf->GenerateConsensusString())), false);
+                    } else {
+                        long seqID = ProcessNumericArgument ((_String*)parameters(2),chain.nameSpacePrefix);
+                        if (seqID>=0 && seqID < dsf->NumberSpecies()) {
+                            stVar->SetValue (new _FString (dsf->GetSequenceCharacters(seqID)),false);
+                        } else {
+                            // 20110916 SLKP : the option for filtering duplicate sequences
+                            if (seqID >= -4 && seqID <= -1) {
+                                _SimpleList indices, map, counts;
+                                long uniqueSequences = dsf->FindUniqueSequences(indices, map, counts, -seqID - 1);
+                                _AssociativeList * parameterInfo = new _AssociativeList;
+                                parameterInfo->MStore ("UNIQUE_SEQUENCES",             new _Constant (uniqueSequences), false);
+                                parameterInfo->MStore ("UNIQUE_INDICES",            new _Matrix (indices), false);
+                                parameterInfo->MStore ("SEQUENCE_MAP",          new _Matrix (map), false);
+                                parameterInfo->MStore ("UNIQUE_COUNTS",      new _Matrix  (counts), false);
+                                stVar->SetValue (parameterInfo,false);
+                            }
+                        }
+                    }
+                } else {
+                    long seq  = ProcessNumericArgument ((_String*)parameters(2),chain.nameSpacePrefix),
+                         site = ProcessNumericArgument ((_String*)parameters(3),chain.nameSpacePrefix);
+
+                    if (parameters.lLength == 4) {
+                        if ((seq>=0)&&(site>=0)&&(seq<dsf->NumberSpecies())&&(site<dsf->NumberDistinctSites())) {
+                            _Matrix             * res = (_Matrix*)checkPointer(new _Matrix (dsf->GetDimension (true), 1, false, true));
+
+                            _Parameter          onlyTheIndex = 0.0;
+                            checkParameter      (getDataInfoReturnsOnlyTheIndex,onlyTheIndex,0.0);
+
+                            long                theValue = dsf->Translate2Frequencies ((*dsf)(site,seq), res->theData,  true);
+
+                            if (onlyTheIndex > 0.5) {
+                                stVar->SetValue (new _Constant (theValue),false);
+                                DeleteObject     (res);
+                            } else {
+                                stVar->SetValue (res,false);
+                            }
+                        } else {
+                            errMsg = _String (seq) & "," & _String (site) & " is an invalid site index ";
+                        }
+                    } else {
+                        if ((seq>=0)&&(site>=0)&&(seq<dsf->NumberSpecies())&&(site<dsf->NumberSpecies())) {
+                            _String* resFlag = (_String*)parameters(4);
+                            _Matrix * res;
+
+                            if (pcAmbiguitiesAverage.Equal (resFlag)) {
+                                res = dsf->ComputePairwiseDifferences (seq,site,1);
+                            } else if (pcAmbiguitiesResolve.Equal (resFlag)) {
+                                res = dsf->ComputePairwiseDifferences (seq,site,2);
+                            } else if (pcAmbiguitiesSkip.Equal (resFlag)) {
+                                res = dsf->ComputePairwiseDifferences (seq,site,3);
+                            } else {
+                                res = dsf->ComputePairwiseDifferences (seq,site,0);
+                            }
+
+                            stVar->SetValue (res,false);
+                        } else {
+                            errMsg = _String (seq) & "," & _String (site) & " is an invalid sequence pair specification.";
+                        }
+
+                    }
+                }
+            }
+        }
+    }
+
+    if (errMsg.sLength) {
+        errMsg = errMsg & " in call to GetDataInfo ";
+        WarnError (errMsg);
+    }
+}
+
+//____________________________________________________________________________________
+
+void      _ElementaryCommand::ExecuteCase47 (_ExecutionList& chain)
+{
+    chain.currentCommand++;
+
+    _String *arg1 = (_String*)parameters(0),
+             *arg2 = (_String*)parameters(1),
+              errMsg;
+
+    long    k = FindLikeFuncName(AppendContainerName(*arg1, chain.nameSpacePrefix));
+
+    if (k<0) {
+        _String  litArg = ProcessLiteralArgument (arg1,chain.nameSpacePrefix);
+        k = FindLikeFuncName (litArg);
+        if (k<0) {
+            errMsg = *arg1 & " is not a defined likelihood function ID ";
+        }
+    }
+
+    if (errMsg.sLength == 0) {
+        _LikelihoodFunction * lf   = (_LikelihoodFunction *) likeFuncList (k);
+        _String         callBack   = ProcessLiteralArgument (arg2,chain.nameSpacePrefix);
+
+        k = batchLanguageFunctionNames.Find (&callBack);
+
+        if (k<0) {
+            errMsg = *arg2 & " is not a defined user batch language function ";
+        } else {
+            if (batchLanguageFunctionParameters.lData[k]!=2) {
+                errMsg = *arg2 & " callback function must depend on 2 parameters ";
+            } else {
+                lf->StateCounter (k);
+            }
+        }
+    }
+
+    if (errMsg.sLength) {
+        errMsg = errMsg & " in call to StateCounter.";
+        WarnError (errMsg);
+    }
+}
+
+
+
+//____________________________________________________________________________________
+
+void      _ElementaryCommand::ExecuteCase52 (_ExecutionList& chain)
+{
+
+    chain.currentCommand++;
+
+    _String         errMsg ;
+
+    // check validity of an alphabet
+
+    long           siteCount  = ProcessNumericArgument ((_String*)parameters (4),chain.nameSpacePrefix);
+    _String        givenState;
+
+    if (siteCount < 1) {
+        givenState = ProcessLiteralArgument((_String*)parameters (4),chain.nameSpacePrefix);
+        siteCount = givenState.sLength;
+    }
+
+    if (siteCount < 1) {
+        errMsg = *(_String*)parameters (4) & " must either evaluate to a positive integer or be a non-empty string of root states";
+        WarnError (errMsg);
+        return;
+    }
+
+    _Variable   *  alphabet = FetchVar (LocateVarByName (AppendContainerName(*(_String*)parameters (3),chain.nameSpacePrefix))),
+                *  treeVar  = FetchVar (LocateVarByName (AppendContainerName(*(_String*)parameters (1),chain.nameSpacePrefix))),
+                *  freqVar  = FetchVar (LocateVarByName (AppendContainerName(*(_String*)parameters (2),chain.nameSpacePrefix)));
+
+
+    if (alphabet&&treeVar&&freqVar) {
+        if (alphabet->ObjectClass() == MATRIX) {
+            _Matrix * alphabetMatrix = (_Matrix*)alphabet->GetValue();
+
+            if (alphabetMatrix->IsAStringMatrix() && alphabetMatrix->GetHDim() == 2 && alphabetMatrix->GetVDim () > 1) {
+                _String baseSet;
+
+                for (long k=0; k < alphabetMatrix->GetVDim (); k++) {
+                    _FString * aState = (_FString*)alphabetMatrix->GetFormula(0,k)->Compute();
+                    if (aState) {
+                        if (aState->theString->sLength == 1) {
+                            char c = aState->theString->sData[0];
+                            if (baseSet.Find(c) == -1) {
+                                baseSet = baseSet & c;
+                            } else {
+                                break;
+                            }
+                        } else {
+                            break;
+                        }
+                    } else {
+                        break;
+                    }
+                }
+
+                if (baseSet.sLength == alphabetMatrix->GetVDim ()) {
+                    long unitSize = ((_FString*)alphabetMatrix->GetFormula(1,0)->Compute())->theString->toNum();
+
+                    if (unitSize >= 1) {
+                        _Formula* exclusionFormula = alphabetMatrix->GetFormula(1,1);
+                        _String* theExclusions = ∅
+                        
+                        if (exclusionFormula)
+                            theExclusions = ((_FString*)exclusionFormula->Compute())->theString;
+
+                        if (treeVar->ObjectClass() == TREE) {
+                            if (freqVar->ObjectClass() == MATRIX) {
+                                _TheTree * spawningTree = (_TheTree*)treeVar;
+
+                                if (!(parameters.lLength>6 && (spawningTree->CountTreeCategories()>1))) {
+
+                                    if (givenState.sLength>1)
+                                        // root state
+                                    {
+                                        if ((givenState.sLength >= unitSize)&&(givenState.sLength % unitSize == 0)) {
+                                            siteCount                   = givenState.sLength/unitSize;
+                                        } else {
+                                            errMsg = "Root state string is either too short or has length which is not divisible by the unit size";
+                                        }
+                                    }
+                                    if (errMsg.sLength == 0) {
+                                        _TranslationTable newTT (baseSet);
+                                        _DataSet * ds = (_DataSet*)checkPointer(new _DataSet);
+
+                                        if (! newTT.IsStandardNucleotide() ) {
+                                            ds->SetTranslationTable (&newTT);    // mod 20060113 to properly deal with non-standard alphabets
+                                        }
+                                        // make a dummy
+                                        spawningTree->AddNodeNamesToDS (ds,true,false,1);
+
+                                        char    c = baseSet.sData[0];
+                                        long    s = ds->GetNames().lLength;
+
+                                        if (s<2) {
+                                            _String rt ("Root");
+                                            ds->GetNames().InsertElement (&rt,0,true);
+                                            s ++;
+                                        }
+
+                                        unsigned long ssi = _String::storageIncrement;
+
+                                        if (s>ssi) {
+                                            _String::storageIncrement = s;
+                                        }
+
+                                        ds->AddSite(c);
+                                        for (long u = 1; u < s; u++) {
+                                            ds->Write2Site(0,c);
+                                        }
+                                        ds->Finalize();
+
+                                        _String::storageIncrement = ssi;
+                                        ds->SetNoSpecies (s);
+
+                                        _SimpleList * theMap = & ds->GetTheMap();
+                                        theMap->RequestSpace (siteCount*unitSize);
+                                        for (long filler = 0; filler < siteCount*unitSize; filler++) {
+                                            theMap->lData[filler] = 0;
+                                        }
+
+                                        theMap->lLength = siteCount*unitSize;
+
+                                        _DataSetFilter* newFilter = new _DataSetFilter();
+                                        checkPointer   (newFilter);
+                                        _SimpleList     h,v;
+
+                                        newFilter->SetFilter     (ds,unitSize,h,v,false);
+                                        newFilter->SetExclusions (theExclusions,true);
+                                        newFilter->SetupConversion ();
+
+                                        /*char buffer[255];
+                                        snprintf (buffer, sizeof(buffer),"%d %d\n",siteCount, newFilter->GetFullLengthSpecies(),unitSize);
+                                        BufferToConsole (buffer);
+                                        */
+                                        _Matrix*   rootStates = nil;
+                                        if (givenState.sLength>=unitSize) {
+                                            rootStates                  = new _Matrix (1,siteCount,false,true);
+                                            checkPointer                (rootStates);
+                                            _Parameter*  holder         = new _Parameter [newFilter->GetDimension(false)];
+                                            checkPointer                (holder);
+
+                                            for (long cc = 0; cc < siteCount; cc++) {
+                                                _String aState (givenState.Cut(cc*unitSize,(cc+1)*unitSize-1));
+                                                long    stateV = newFilter->Translate2Frequencies (aState,holder,false);
+                                                if (stateV<0) {
+                                                    errMsg = aState & " found in the root state string at position " & cc*unitSize & " is an invalid state";
+                                                    break;
+                                                } else {
+                                                    rootStates->theData[cc] = stateV;
+                                                }
+                                            }
+
+                                            delete [] holder;
+                                        }
+                                        if (errMsg.sLength == 0) {
+
+                                            long       filterID = AddFilterToList (simulationFilter,newFilter);
+
+                                            spawningTree->SetUp();
+                                            spawningTree->InitializeTreeFrequencies((_Matrix*)freqVar->Compute(),true);
+                                            errMsg = *(_String*)dataSetFilterNamesList(filterID) & ',' & *spawningTree->GetName() & ',' & *freqVar->GetName();
+
+
+                                            _LikelihoodFunction lf (errMsg, nil);
+
+                                            if (terminateExecution) {
+                                                return;
+                                            }
+
+                                            bool    doInternals = false;
+
+                                            if (parameters.lLength>5) {
+                                                doInternals = (ProcessNumericArgument ((_String*)parameters (5),chain.nameSpacePrefix)>0.5);
+                                            }
+
+
+                                            _String spoolFile;
+
+                                            FILE*   mainFile = nil;
+
+                                            errMsg = empty;
+
+                                            if (parameters.lLength > 6) {
+                                                spoolFile = ProcessLiteralArgument ((_String*)parameters (6),chain.nameSpacePrefix);
+                                                spoolFile.ProcessFileName();
+                                                mainFile = doFileOpen (spoolFile.sData,"w");
+                                                if (!mainFile) {
+                                                    errMsg = _String("Failed to open ") & spoolFile & " for writing";
+                                                }
+                                                if (doInternals) {
+                                                    spoolFile = spoolFile & ".anc";
+                                                }
+                                            }
+
+                                            if (errMsg.sLength == 0) {
+                                                _DataSet    * simDataSet;
+
+                                                if (mainFile) {
+                                                    simDataSet = new _DataSet (mainFile);
+                                                } else {
+                                                    simDataSet = new _DataSet (siteCount);
+                                                }
+
+                                                checkPointer (simDataSet);
+
+                                                _List exclusions;
+
+                                                _String *simName = new _String(AppendContainerName(*(_String*)parameters (0),chain.nameSpacePrefix));
+                                                _String mxName = *simName & ".rates";
+                                                setParameter (mxName, 0.0);
+                                                _Variable *catValVar        = FetchVar (LocateVarByName (mxName));
+                                                _Matrix*   catValues        = new _Matrix (1,1,false,true);
+                                                checkPointer    (catValues);
+
+                                                mxName = *simName & ".rateVars";
+                                                setParameter (mxName, 0.0);
+                                                _Variable * catNameVar  = FetchVar (LocateVarByName (mxName));
+                                                _Matrix* catNames       = new _Matrix (1,1,false,true);
+
+                                                SetStatusLine ("Simulating Data");
+                                                lf.Simulate (*simDataSet, exclusions, catValues, catNames, rootStates, doInternals?(mainFile?&spoolFile:&empty):nil);
+                                                SetStatusLine ("Idle");
+
+                                                catValVar->SetValue(catValues, false);
+                                                catNameVar->SetValue(catNames, false);
+
+                                                StoreADataSet (simDataSet, simName);
+                                                DeleteObject (simName);
+                                                KillDataFilterRecord (filterID);
+                                                errMsg = empty;
+                                            }
+                                        }
+                                        DeleteObject   (ds);
+                                        if (rootStates) {
+                                            DeleteObject (rootStates);
+                                        }
+
+                                        if (errMsg.sLength == 0) {
+                                            return;
+                                        }
+                                    }
+                                } else {
+                                    errMsg = "Can't use spool to file option in Simulate when the tree depends on category variables.";
+                                }
+                            } else {
+                                errMsg = *(_String*)parameters (2) & " must be an existing matrix";
+                            }
+                        } else {
+                            errMsg = *(_String*)parameters (1) & " must be an existing tree";
+                        }
+                    } else {
+                        errMsg = "Invalid unit length specification (must be >=1)";
+                    }
+                } else {
+                    errMsg = "Invalid alphabet character specification";
+                }
+            }
+        }
+        if (errMsg.sLength == 0) {
+            errMsg = _String("Alphabet specification variable ") & *(_String*)parameters (3) & " must be a string matrix with 2 rows and at least 2 columns";
+        }
+    } else {
+        long i = 0;
+        if (!alphabet) {
+            i = 3;
+        } else {
+            if (!treeVar) {
+                i = 1;
+            } else if (!freqVar) {
+                i = 2;
+            }
+        }
+
+        errMsg = _String("Variable ") & *(_String*)parameters (i) & " has not been defined";
+
+    }
+
+    if (errMsg.sLength) {
+        errMsg = errMsg & " in Simulate.";
+        WarnError (errMsg);
+    }
+
+}
+
+
+
+//____________________________________________________________________________________
+
+bool      _ElementaryCommand::Execute    (_ExecutionList& chain) // perform this command in a given list
+{
+    _String errMsg;
+
+    switch (code) {
+
+    case 0: // formula reparser
+        ExecuteCase0 (chain);
+        break;
+
+
+    case 4:
+        ExecuteCase4 (chain);
+        break;
+
+
+    case 5: // data set contruction
+
+        ExecuteCase5 (chain);
+        break;
+
+    case 6:  // data set filter construction
+    case 27: // Permute
+    case 28: // Bootstrap
+        ExecuteDataFilterCases(chain);
+        break;
+
+
+    case 7: { // build a tree
+        chain.currentCommand++;
+
+        _String treeIdent   = chain.AddNameSpaceToID(*(_String*)parameters(0)),
+                treeString  = *(_String*)parameters(1);
+
+        SetStatusLine (_String("Constructing Tree ")&treeIdent);
+        long  varID = LocateVarByName (treeIdent);
+
+        _Parameter rtv = 0.0; // mod 11/19/2003
+        checkParameter (replaceTreeStructure, rtv, 0.0); // mod 11/19/2003
+
+        _SimpleList   leftOverVars; // mod 02/03/2003
+        if (varID>=0)
+            if (FetchVar(varID)->ObjectClass()==TREE) {
+                if (rtv>0.5) {
+                    DeleteVariable(*FetchVar(varID)->GetName());    // mod 11/19/2003
+                } else {
+                    DeleteTreeVariable(*FetchVar(varID)->GetName(),leftOverVars,true);    // mod 02/03/2003
+                }
+            }
+
+        treeString.ProcessParameter();
+
+        _TheTree * tr = nil;
+
+        if (treeString.getChar(0)!='(') {
+            _Formula  nameForm (treeString,chain.nameSpacePrefix);
+            _PMathObj formRes = nameForm.Compute();
+            if (formRes) {
+                if (formRes->ObjectClass () == STRING) {
+                    tr = new _TheTree (treeIdent,*((_FString*)formRes)->theString,false);
+                } else if (formRes->ObjectClass () == TOPOLOGY) {
+                    tr = new _TheTree (treeIdent,(_TreeTopology*)formRes);
+                } else if (formRes->ObjectClass () == TREE) {
+                    for (unsigned long i = 0; i < leftOverVars.lLength; i++) {
+                        //printf ("%s\n", LocateVar(leftOverVars.lData[i])->GetName()->sData);
+                        DeleteVariable(leftOverVars.lData[i], true);
+                    }
+                    leftOverVars.Clear();
+                    tr = new _TheTree (treeIdent,(_TheTree*)formRes);
+                }
+            }
+        } else {
+            tr = new _TheTree (treeIdent,treeString,false);
+        }
+
+        if (!tr) {
+            WarnError ("Illegal right hand side in call to Tree id = ...; it must be a string, a Newick tree spec or a topology");
+            return false;
+        }
+        //_TheTree tr (*(_String*)parameters(0),treeStr);
+
+
+        /*for (varID = 0; varID < leftOverVars.lLength; varID++)
+        {
+            _Variable* theVar = LocateVar (leftOverVars.lData[varID]);
+            if (theVar)
+                printf ("%d = %s\n", leftOverVars.lData[varID], theVar->GetName()->getStr());
+            else
+                printf ("%d Deleted!!!\n", leftOverVars.lData[varID], theVar->GetName()->getStr());
+
+        }*/
+
+        if (leftOverVars.lLength) { // mod 02/03/2003 - the entire "if" block
+            _SimpleList indep, dep, holder;
+            {
+                _AVLList    indepA (&indep),
+                            depA   (&dep);
+
+                tr->ScanForVariables (indepA,depA);
+                //tr.ScanForVariables (indepA,depA);
+                indepA.ReorderList();
+                depA.ReorderList();
+            }
+
+            //indep.Sort();
+            //dep.Sort();
+
+            holder.Union (indep,dep);
+            leftOverVars.Sort ();
+            indep.Subtract (leftOverVars,holder);
+
+            /* the bit with freeSlots is here b/c
+               some nodes variables may have been deleted during the unroot
+               in the tree constructor and we don't want to delete them twice,
+               do we? 08/22/2003 */
+
+            dep.Clear();
+            dep.Duplicate (&freeSlots);
+            dep.Sort ();
+            holder.Subtract (indep,dep);
+            for (varID = holder.lLength-1; varID >=0 ; varID--) {
+                DeleteVariable (*LocateVar (holder.lData[varID])->GetName());
+            }
+
+            tr->Clear();
+
+        }
+        SetStatusLine ("Idle");
+
+    }
+    break;
+
+    case HY_HBL_COMMAND_FPRINTF: { // print stuff to file (or stdout)
+        return HandleFprintf(chain);
+    }
+
+    case HY_HBL_COMMAND_HARVEST_FREQUENCIES: { // or HarvestFrequencies
+        return HandleHarvestFrequencies(chain);
+    }
+
+    case HY_HBL_COMMAND_OPTIMIZE: // optimize the likelihood function
+    case HY_HBL_COMMAND_COVARIANCE_MATRIX: {
+        return HandleOptimizeCovarianceMatrix (chain, code == HY_HBL_COMMAND_OPTIMIZE);
+    }
+
+    case 11: // build the likelihood function
+
+        ExecuteCase11 (chain);
+        break;
+
+    case 12: // data set contruction by simulation
+
+        ExecuteCase12 (chain);
+        break;
+
+    case 14:
+
+    {
+        if (parameters.lLength) {
+            DeleteObject (chain.result);
+            _Formula returnValue (*(_String*)parameters(0),chain.nameSpacePrefix);
+            chain.result = returnValue.Compute();
+            if (chain.result) {
+                chain.result = (_PMathObj) chain.result->makeDynamic();
+            }
+        }
+        chain.currentCommand = simpleParameters(0);
+        if (chain.currentCommand<0) {
+            chain.currentCommand = 0x7fffffff;
+        }
+    }
+
+    break;
+
+    case 16: { // data set merger operation
+        chain.currentCommand++;
+        SetStatusLine ("Merging Datasets");
+        _SimpleList     dsIndex;
+        for (long di=1; di<parameters.lLength; di++) {
+            _String  dsname = chain.AddNameSpaceToID(*(_String*)parameters(di));
+            long f = FindDataSetName (dsname);
+            if (f==-1) {
+                WarnError (((_String)("Identifier ")&dsname&_String(" doesn't correspond to a valid dataset.")));
+                return false;
+            } else {
+                dsIndex<<f;
+            }
+        }
+
+        _DataSet*  mergeResult = (simpleParameters(0)==1 || simpleParameters(0)==-1)?_DataSet::Concatenate(dsIndex):_DataSet::Combine(dsIndex);
+        // xlc mod 03/08/2005
+        _String  * resultName = new _String (chain.AddNameSpaceToID(*(_String*)parameters(0)));
+
+        if (StoreADataSet (mergeResult, resultName) && simpleParameters(0)<0)
+            // purge all the datasets except the resulting one
+        {
+            long newSetID = FindDataSetName (*resultName);
+            for (long di=0; di<dsIndex.lLength; di++)
+                if (dsIndex.lData[di] != newSetID) {
+                    KillDataSetRecord(dsIndex.lData[di]);
+                }
+        }
+
+        DeleteObject (resultName);
+
+    }
+    break;
+
+    case HY_HBL_COMMAND_EXPORT: // matrix export operation
+        HandleExport (chain);
+        break;
+
+    case 18: // matrix import operation
+
+    {
+        bool importResult = true;
+        chain.currentCommand++;
+        _String  fName (*(_String*)parameters(1));
+        fName.ProcessFileName();
+        if (terminateExecution) {
+            return false;
+        }
+        FILE*   theDump = doFileOpen (fName.getStr(),"rb");
+        if (!theDump) {
+            WarnError (((_String)("File ")&fName&_String(" couldn't be open for reading.")));
+            return false;
+        }
+
+        fName = chain.AddNameSpaceToID(*(_String*)parameters(0));
+        _Variable * result  = CheckReceptacle(&fName,blImport.Cut(0,blImport.sLength-2),true);
+        if (result) {
+            _Matrix   * storage = new _Matrix (1,1,false,true);
+            result->SetValue(storage,false);
+            lastMatrixDeclared = result->GetAVariable();
+            if (!storage->ImportMatrixExp(theDump)) {
+                WarnError ("Matrix import failed - the file has an invalid format.");
+                importResult = false;
+                DeleteObject(storage);
+            }
+        } else {
+            importResult = false;
+        }
+        fclose (theDump);
+        return importResult;
+    }
+    break;
+
+    case HY_HBL_COMMAND_MOLECULAR_CLOCK: // molecular_clock constraint
+        HandleMolecularClock(chain);
+        break;
+
+    case 20: // category variable construction
+
+    {
+        chain.currentCommand++;
+        _String cName = chain.AddNameSpaceToID (*(_String*)parameters(0));
+        _List parms (parameters);
+        parms.Delete(0);
+        _CategoryVariable newCat(cName,&parms,chain.nameSpacePrefix);
+        ReplaceVar(&newCat);
+    }
+    break;
+
+    case 21: // construct the category matrix
+        ExecuteCase21 (chain);
+        break;
+
+    case HY_HBL_COMMAND_CLEAR_CONSTRAINTS:  // clear constraints
+        HandleClearConstraints(chain);
+        break;
+
+    case HY_HBL_COMMAND_SET_DIALOG_PROMPT: { // set dialog prompt
+        chain.currentCommand++;
+        dialogPrompt = ProcessLiteralArgument((_String*)parameters(0),chain.nameSpacePrefix);
+    }
+    break;
+
+    case HY_HBL_COMMAND_SELECT_TEMPLATE_MODEL: // prompt for a model file
+        return HandleSelectTemplateModel(chain);
+
+    case 25: // fscanf
+    case 56: // sscanf
+
+        ExecuteCase25 (chain,code == 56);
+        break;
+
+    case 26: // replicate constraint
+        ExecuteCase26 (chain);
+        break;
+
+    case HY_HBL_COMMAND_USE_MODEL:
+        return HandleUseModel(chain);
+
+    case 31:
+        ExecuteCase31 (chain);
+        break;
+
+    case 32:
+        ExecuteCase32 (chain);
+        break;
+
+    case HY_HBL_COMMAND_GET_STRING:
+        HandleGetString (chain);
+        break;
+
+    case HY_HBL_COMMAND_SET_PARAMETER:
+        return HandleSetParameter(chain);
+
+    case 36:
+        ExecuteCase36 (chain);
+        break;
+
+    case 37:
+        ExecuteCase37 (chain);
+        break;
+
+    case 38:
+        ExecuteCase38 (chain, false);
+        break;
+
+    case 39:
+    case 62:
+    case 66:
+        ExecuteCase39 (chain);
+        break;
+
+    case 40:
+        ExecuteCase40 (chain);
+        break;
+
+    case 41:
+        ExecuteCase41 (chain);
+        break;
+
+    case HY_HBL_COMMAND_DIFFERENTIATE:
+        return HandleDifferentiate (chain);
+        break;
+
+    case 43:
+        ExecuteCase43 (chain);
+        break;
+
+    case 44:
+        ExecuteCase44 (chain);
+        break;
+
+    case 45:
+        ExecuteCase45 (chain);
+        break;
+
+    case 46:
+        ExecuteCase46 (chain);
+        break;
+
+    case 47:
+        ExecuteCase47 (chain);
+        break;
+
+    case 48:
+        ExecuteCase43 (chain);
+        break;
+
+    case HY_HBL_COMMAND_LFCOMPUTE:
+        return HandleComputeLFFunction(chain);
+
+    case 50:
+        ExecuteCase38 (chain, true);
+        break;
+
+    case HY_HBL_COMMAND_GET_URL:
+        return HandleGetURL (chain);
+
+    case 52:
+        ExecuteCase52 (chain);
+        break;
+
+    case 53:
+        ExecuteCase53 (chain);
+        break;
+
+    case 54:
+        ExecuteCase54 (chain);
+        break;
+
+    case 55:
+        ExecuteCase55 (chain);
+        break;
+
+    case 57:
+        ExecuteCase57 (chain);
+        break;
+
+    case 58:
+        ExecuteCase58 (chain);
+        break;
+
+    case HY_HBL_COMMAND_DELETE_OBJECT:
+        HandleDeleteObject (chain);
+        break;
+
+    case HY_HBL_COMMAND_REQUIRE_VERSION:
+        HandleRequireVersion(chain);
+        break;
+
+    case 61:
+        ExecuteCase61 (chain);
+        break;
+
+    case 63:
+        ExecuteCase63 (chain);
+        break;
+
+    case 64:
+        ExecuteCase64 (chain);
+        break;
+
+    case HY_HBL_COMMAND_ASSERT:
+        HandleAssert (chain);
+        break;
+
+    default:
+        chain.currentCommand++;
+    }
+
+    return true;
+}
+
+//____________________________________________________________________________________
+
+
+_String   _ElementaryCommand::FindNextCommand  (_String& input, bool useSoftTrim)
+{
+
+    bool    isString  = false,
+            skipping  = false;
+
+    char    isComment = 0;
+
+
+    long    scopeIn     = 0,
+            matrixScope = 0,
+            parenIn  = 0,
+            bracketIn   = 0,
+            index,
+            saveSI = _String::storageIncrement;
+
+    _SimpleList isDoWhileLoop;
+
+    if (input.sLength/4 > saveSI) {
+        _String::storageIncrement = input.sLength/4;
+    }
+
+    _String result (128L,true);
+
+    char    lastChar = 0;
+
+    index = input.Length();
+
+    if (!index) {
+        result.Finalize();
+        return empty;
+    }
+
+    // non printable characters at the end ?
+    while (index>=0 && !isprint(input[--index])) ;
+    input.Trim (0,index, useSoftTrim);
+
+    for (index = 0; index<input.Length(); index++) {
+        char c = input.sData[index];
+
+        if (!isString && c=='\t') {
+            c = ' ';
+        }
+
+        // check for comments
+        if (isComment) {
+            if (isComment == 1) {
+                if (c=='/' && input.sData[index-1]=='*') {
+                    isComment = 0;
+                }
+            } else if (c == '\r' || c == '\n') {
+                isComment = 0;
+            }
+
+            lastChar  = 0;
+            continue;
+        } else {
+            if (!isString && c=='/') {
+                switch (input.getChar(index+1)) {
+                case '*':
+                    isComment = 1;
+                    break;
+                case '/':
+                    isComment = 2;
+                }
+
+                if (isComment) {
+                    lastChar  = 0;
+                    index++;
+                    continue;
+                }
+            }
+        }
+
+
+        // skip spaces
+        if (!isString && isspace(c)) {
+            if (index >= 6 && input.getChar(index-1) == 'n'
+                    && input.getChar(index-2) == 'r'
+                    && input.getChar(index-3) == 'u'
+                    && input.getChar(index-4) == 't'
+                    && input.getChar(index-5) == 'e'
+                    && input.getChar(index-6) == 'r') {
+                if (index == 6 || (index > 6 && !(isalnum(input.getChar(index-7)) || input.getChar(index-7) == '_'))) {
+                    result<<' ';
+                }
+            }
+
+
+            skipping = true;
+            continue;
+        }
+
+        if (skipping&&( isalpha(c) || c=='_') && (isalnum(lastChar) || lastChar=='_')) {
+            result<<' ';
+        }
+
+        skipping = false;
+
+        result<<c;
+
+        if (isString && c == '\\') {
+            result<< input.getChar(++index);
+            continue;
+        }
+
+        // are we inside a string literal?
+
+        if (c=='"') {
+            isString = !isString;
+            lastChar = 0;
+            continue;
+        }
+
+        if (isString) {
+            continue;
+        }
+
+        // maybe we are done?
+
+        if (c==';' && scopeIn == 0 && matrixScope == 0 && parenIn <= 0 && bracketIn <= 0) {
+            break;
+        }
+
+        // check to see whether we are defining a matrix
+
+        if (c=='(') {
+            parenIn++;
+            lastChar = 0;
+            continue;
+        }
+
+        if (c==')') {
+            parenIn--;
+            if (parenIn < 0) {
+                WarnError (_String("Too many closing ')' near '") & input.Cut (MAX(0,index-32),index) & "'.");
+                input = empty;
+                return empty;
+            }
+            lastChar = 0;
+            continue;
+        }
+
+        if (c=='[') {
+            bracketIn++;
+            lastChar = 0;
+            continue;
+        }
+
+        if (c==']') {
+            bracketIn--;
+            lastChar = 0;
+            continue;
+        }
+
+
+        if (c=='{') {
+            if (matrixScope) {
+                matrixScope++;
+            } else if (lastChar == '=') { // a matrix def
+                matrixScope++;
+            } else {
+                scopeIn++;
+                if (index>=2) {
+                    long t = input.FirstNonSpaceIndex (0, index-1, -1);
+                    if (t>=1) {
+                        if (input.getChar(t)=='o' && input.getChar(t-1)=='d') {
+                            isDoWhileLoop << scopeIn-1;
+                            //printf ("%d\n%s\n\n", isDoWhileLoop, input.Cut (t,-1).sData);
+                        }
+                    }
+                }
+            }
+            lastChar = 0;
+            continue;
+        }
+
+        if (c=='}') {
+            if (matrixScope) {
+                matrixScope--;
+            } else {
+                scopeIn--;
+                if (!parenIn && !bracketIn) {
+                    if (scopeIn >=0 && isDoWhileLoop.lLength && isDoWhileLoop.lData[isDoWhileLoop.lLength-1] == scopeIn) {
+                        isDoWhileLoop.Delete (isDoWhileLoop.lLength-1);
+                    } else if (scopeIn == 0) {
+                        break;
+                    }
+                }
+
+            }
+            lastChar = 0;
+            continue;
+        }
+
+        lastChar = c;
+    }
+
+    result.Finalize();
+    _String::storageIncrement = saveSI;
+
+    if (scopeIn||isString||isComment == 1||parenIn||matrixScope) {
+        if (result!='}') {
+            WarnError (_String("Expression appears to be incomplete/syntax error. Scope: ") &scopeIn & ", paretheses depth: "
+                       & parenIn & ", matrix scope: " & matrixScope & '.' & matrixScope & '.' & (isString?"In a literal. ":empty) &
+                       (isComment == 1? "In a comment ":empty) & '\n' & input);
+            input = empty;
+            return empty;
+        } else {
+            result = empty;
+        }
+    }
+
+    lastChar=0;
+    while (result.getChar(lastChar)=='{') {
+        lastChar++;
+    }
+
+    if (lastChar) {
+        long index2 = result.sLength-1;
+
+        while (result[index2]=='}') {
+            index2--;
+        }
+
+        if (result.sLength-index2-1 <lastChar) {
+            ReportWarning ((_String)("Expression appears to be incomplete/syntax error and will be ignored:")&input);
+            result.DuplicateErasing (&empty);
+        } else {
+            result.Trim(lastChar,result.sLength-1-lastChar);
+        }
+    }
+
+    if (index<input.Length()-1) {
+        input.Trim (index+1,-1, useSoftTrim);
+    } else if (useSoftTrim) {
+        input.sLength = 0;
+    } else {
+        input.DuplicateErasing (&empty);
+    }
+
+
+    return result;
+}
+//____________________________________________________________________________________
+
+long _ElementaryCommand::ExtractConditions (_String& source, long startwith, _List& receptacle, char delimeter, bool includeEmptyConditions)
+{
+    long    parenLevel      = 1,
+            lastsemi        = startwith,
+            index,
+            quote         = 0,
+            curlyLevel        = 0;
+
+    for (index = startwith; index<source.sLength; index++) {
+        char c = source.sData[index];
+        if (quote==0) {
+            if (c=='(') {
+                parenLevel++;
+                continue;
+            }
+            if (c=='{') {
+                curlyLevel++;
+                continue;
+            }
+            if (c=='}') {
+                curlyLevel--;
+                continue;
+            }
+            if (c==')') {
+                parenLevel--;
+                if (!parenLevel) {
+                    break;
+                }
+                continue;
+            }
+        }
+        if (c=='"') {
+            if (index == startwith || source.sData[index-1] != '\\') {
+                quote+=quote?-1:1;
+            }
+            continue;
+        }
+        if (c==delimeter) {
+            if (parenLevel>1 || quote || curlyLevel) {
+                continue;
+            }
+
+            _String *term = (_String*)checkPointer(new _String (source,lastsemi,index-1));
+            receptacle.AppendNewInstance (term);
+            lastsemi = index+1;
+            continue;
+        }
+    }
+
+    if (includeEmptyConditions || lastsemi <= index-1) {
+        receptacle.AppendNewInstance (new _String(source,lastsemi,index-1));
+    }
+    return index+1;
+}
+
+//____________________________________________________________________________________
+
+
+bool       _ElementaryCommand::MakeGeneralizedLoop  (_String*p1, _String*p2, _String*p3 , bool fb, _String& source, _ExecutionList&target)
+{
+
+    // extract the for enclosure
+    long  beginning = target.lLength,
+          forreturn = target.lLength,
+          index;
+
+    int   success = 1;
+    bool  hasIncrement = false;
+
+    _SimpleList bc;
+
+    while (1) {
+
+        if (p1 && p1->Length()) { // initialization stage
+            forreturn++;
+            success *= target.BuildList (*p1, nil, true); // add init step
+        }
+
+        // append condition now
+
+        if (!success) {
+            break;
+        }
+
+        if (fb)
+            if (p2 && p2->Length()) { // condition stage
+                _ElementaryCommand condition (*p2);
+                target&&(&condition);
+            }
+
+        if (source.getChar(0)=='{') {
+            source.Trim(1,-1);
+        }
+
+        if ((success *= target.BuildList (source, &bc)) == 0) { // construct the main body
+            break;
+        }
+
+        if (p3 && p3->Length()) { // increment stage
+            success *= target.BuildList (*p3, nil,true); // add increment step
+            hasIncrement = true;
+        }
+
+        if (!success) {
+            break;
+        }
+
+        if (fb) {
+            _ElementaryCommand loopback;
+            success*=loopback.MakeJumpCommand (nil,forreturn,0,target);
+            target&&(&loopback);
+            if (p2 && p2->Length()) {
+                success*=((_ElementaryCommand*)(target(forreturn)))->MakeJumpCommand (p2, forreturn+1, target.lLength,target);
+            }
+        } else {
+            if (p2) {
+                _ElementaryCommand* loopback = new _ElementaryCommand ;
+                checkPointer (loopback);
+                success*=loopback->MakeJumpCommand (p2,forreturn,target.lLength+1,target);
+                target.AppendNewInstance(loopback);
+            }
+        }
+        break;
+
+    }
+
+    if (!success) { // clean up
+        for (index = beginning; index<target.lLength; index++) {
+            target.Delete (beginning);
+        }
+        return false;
+    } else {
+        // write out the breaks and continues
+        for (index = 0; index<bc.lLength; index++) {
+            long loc = bc(index);
+            if (loc>0) { // break
+                ((_ElementaryCommand*)(target(loc)))->MakeJumpCommand (nil, target.lLength, 0,target);
+            } else { // continue
+                ((_ElementaryCommand*)(target(-loc)))->MakeJumpCommand (nil, target.lLength-(hasIncrement?2:1), 0,target);
+            }
+        }
+    }
+
+    return true;
+}
+
+//____________________________________________________________________________________
+
+
+bool       _ElementaryCommand::BuildFor (_String&source, _ExecutionList&target,  _List & pieces)
+
+// the for loop becomes this:
+// initialize
+// if (condition) then
+// else go to end+2
+// end
+// increment
+// goto if(condition)
+
+{
+    return MakeGeneralizedLoop ((_String*)pieces(0),(_String*)pieces(1),(_String*)pieces(2),true,source,target);
+}
+
+//____________________________________________________________________________________
+
+bool    _ElementaryCommand::BuildWhile          (_String&source, _ExecutionList&target,  _List &pieces)
+{
+    return MakeGeneralizedLoop (nil,(_String*)pieces(0),nil,true,source,target);
+}
+
+//____________________________________________________________________________________
+
+bool    _ElementaryCommand::BuildIfThenElse (_String&source, _ExecutionList&target, _SimpleList* bc)
+{
+    _List   pieces;
+    long    upto = ExtractConditions (source,3,pieces),
+            beginning = target.lLength;
+    target.lastif << target.lLength;
+    int     success = 1,
+            intIfs = target.lastif.lLength;
+
+
+    {
+        if (pieces.lLength!=1) {
+            WarnError ("'if' header makes no sense");
+        }
+
+        source.Trim (upto,-1);
+        target.AppendNewInstance (new _ElementaryCommand);
+
+        _String nextCommand (FindNextCommand(source));
+        success *= target.BuildList (nextCommand, bc, true);
+
+    }
+
+    if (!success) { // clean up
+        for (unsigned long index = beginning; index<target.lLength; index++) {
+            target.Delete (beginning);
+        }
+        return false;
+    } else {
+        _ElementaryCommand* ec=(_ElementaryCommand*)(target(beginning));
+        ((_ElementaryCommand*)(target(beginning)))->MakeJumpCommand (((_String*)pieces(0)), beginning+1, (ec->simpleParameters.lLength<2)?target.lLength:ec->simpleParameters(1),target);
+    }
+
+    while (target.lastif.lLength>intIfs) {
+        target.lastif.Delete(target.lastif.lLength-1);
+    }
+
+    return target.BuildList(source,bc,true);
+}
+
+
+
+//____________________________________________________________________________________
+bool    _ElementaryCommand::BuildDoWhile            (_String&source, _ExecutionList&target)
+{
+    long upto = source.FindBackwards(_String('}'), 0, -1);
+    if (upto >= 0) {
+        _String clipped (source, upto+1, -1);
+        if (clipped.beginswith (blWhile)) {
+            source.Trim (blDo.sLength,upto);
+            _List pieces;
+            ExtractConditions (clipped,blWhile.sLength,pieces);
+            if (pieces.lLength != 1) {
+                WarnError ("Malformed while clause in a do-while loop");
+                return false;
+            }
+
+            if (!MakeGeneralizedLoop (nil,(_String*)pieces(0),nil,false,source,target)) {
+                return false;
+            }
+
+            return true;
+        }
+    }
+    WarnError ("Could not find a matching 'while' in the definition of a do-while loop");
+
+    return false;
+}
+
+//____________________________________________________________________________________
+
+bool    _ElementaryCommand::ProcessInclude      (_String&source, _ExecutionList&target)
+{
+
+    _String         fileName (source,blInclude.sLength,source.sLength-2);
+    fileName = ProcessLiteralArgument (&fileName,target.nameSpacePrefix);
+    if (fileName.sLength == 0) {
+        WarnError (_String("#include missing a meaningful filename. Check that there is a ';' at the end of the statement. Had ")& source.Cut(8,source.sLength-2));
+        return false;
+    }
+
+    fileName.ProcessFileName(false,false,(Ptr)target.nameSpacePrefix);
+    if (terminateExecution) {
+        return false;
+    }
+
+    PushFilePath  (fileName);
+    ReadBatchFile (fileName, target);
+    PopFilePath   ();
+
+    return true;
+}
+
+//____________________________________________________________________________________
+
+_ElementaryCommand* makeNewCommand (long ccode)
+{
+    _ElementaryCommand * newC = new _ElementaryCommand (ccode);
+    checkPointer        (newC);
+    return               newC;
+}
+
+//____________________________________________________________________________________
+
+void _ElementaryCommand::addAndClean (_ExecutionList&target,_List* parList, long parFrom)
+{
+    if (parList)
+        for (long k = parFrom; k<parList->lLength; k++) {
+            parameters && (*parList) (k);
+        }
+    target << this;
+    DeleteObject (this);
+}
+
+//____________________________________________________________________________________
+
+
+bool    _ElementaryCommand::ConstructDataSet (_String&source, _ExecutionList&target)
+// DataSet    dataSetid = ReadDataFile ("..");
+// or
+// DataSet    dataSetid = SimulateDataSet (likeFunc);
+// or
+// DataSet    dataSetid = Concatenate (<purge>,list of DataSets);
+// or
+// DataSet    dataSetid = Combine (<purge>,list of DataSets);
+// or
+// DataSet    dataSetid = ReconstructAncestors (lf)
+// or
+// DataSet    dataSetid = SampleAncestors (lf)
+// or
+// DataSet    dataSetid = Simulate (tree, freqs, alphabet, <store internal nodes, root vector>)
+// or
+// DataSet    dataSetid = ReadFromString (string);
+
+
+{
+    // first we must segment out the data set name
+    // then the ReadDataFile command
+    // then the data set file name
+
+    // look for the data set name first
+
+    long    mark1 = source.FirstSpaceIndex(0,-1,1),
+            mark2 = source.Find ('=', mark1, -1);
+
+    _String dsID (source,mark1+1,mark2-1);
+
+    if (mark1==-1 || mark2==-1 || dsID.Length()==0) {
+        WarnErrorWhileParsing ("DataSet declaration missing a valid identifier", source);
+        return false;
+    }
+
+    // now look for the opening paren
+
+    mark1 = source.Find ('(',mark2,-1);
+
+    _ElementaryCommand dsc;
+    _String            oper (source,mark2+1,mark1-1);
+
+    if (oper ==  _String("ReadDataFile") || oper == _String ("ReadFromString")) { // a switch statement if more than 1
+        _List pieces;
+        mark2 = ExtractConditions (source,mark1+1,pieces,',');
+        if (pieces.lLength!=1) {
+            WarnErrorWhileParsing ("DataSet declaration missing a valid filename", source);
+            return false;
+        }
+
+        _ElementaryCommand * dsc = makeNewCommand (5);
+
+        dsc->parameters&&(&dsID);
+        dsc->parameters&&(pieces(0));
+
+        if (oper == _String ("ReadFromString")) {
+            dsc->simpleParameters << 1;
+        }
+
+        dsc->addAndClean (target);
+        return true;
+    } else if (oper.Equal(&blSimulateDataSet)) {
+        _List pieces;
+        mark2 = ExtractConditions (source,mark1+1,pieces,',');
+        if ( pieces.lLength>4 || pieces.lLength==0 ) {
+            WarnErrorWhileParsing (blSimulateDataSet & "expects 1-4 parameters: likelihood function ident (needed), a list of excluded states, a matrix to store random rates in, and a matrix to store the order of random rates in (last 3 - optional).",
+                                   source);
+            return false;
+        }
+
+        dsc.code = 12;
+        dsc.parameters&&(&dsID);
+        dsc.parameters&&(pieces(0));
+        for (mark2 = 1; mark2 < pieces.lLength; mark2++) {
+            dsc.parameters&&(pieces(mark2));
+        }
+
+        target&&(&dsc);
+        return true;
+    } else if ( oper ==  _String("Concatenate") || oper ==  _String("Combine")) {
+        _List pieces;
+        mark2 = ExtractConditions (source,mark1+1,pieces,',');
+        if (pieces.lLength==0) {
+            WarnErrorWhileParsing("DataSet merging operation missing a valid list of arguments.",source);
+            return false;
+        }
+
+
+        dsc.code = 16;
+        dsc.parameters&&(&dsID);
+
+        long i=0;
+
+        dsc.simpleParameters<<((oper==_String("Concatenate"))?1:2);
+
+        _String purge ("purge");
+        if (purge.Equal ((_String*)pieces(0))) {
+            dsc.simpleParameters[0]*=-1;
+            i++;
+        }
+
+        for (; i<pieces.lLength; i++) {
+            dsc.parameters<<pieces (i);
+        }
+
+        if (dsc.parameters.lLength<=1) {
+            WarnErrorWhileParsing("DataSet merging operation missing a valid list of arguments.",source);
+            return false;
+        }
+
+        target&&(&dsc);
+        return true;
+
+    } else {
+        if (oper ==  _String("ReconstructAncestors") || oper ==  _String("SampleAncestors")) {
+            _List pieces;
+            mark2 = ExtractConditions (source,mark1+1,pieces,',');
+            if (pieces.lLength>3 || pieces.lLength==0) {
+                WarnErrorWhileParsing("ReconstructAncestors and SampleAncestors expects 1-4 parameters: likelihood function ident (mandatory), an matrix expression to specify the list of partition(s) to reconstruct/sample from (optional), and, for ReconstructAncestors, an optional MARGINAL flag, plus an optional DOLEAVES flag.",
+                                      source);
+                return false;
+            }
+
+            dsc.code                    = (oper == _String("ReconstructAncestors"))?38:50;
+            dsc.parameters              &&(&dsID);
+            dsc.parameters              << pieces(0);
+            for (long optP = 1; optP < pieces.lLength; optP++)
+                if (((_String*)pieces(optP))->Equal(&marginalAncestors)) {
+                    dsc.simpleParameters << -1;
+                } else if (((_String*)pieces(optP))->Equal(&doLeavesAncestors)) {
+                    dsc.simpleParameters << -2;
+                } else {
+                    dsc.parameters  << pieces(optP);
+                }
+
+            target&&(&dsc);
+            return true;
+        } else if (oper ==  _String("Simulate")) {
+            _List pieces;
+            mark2 = ExtractConditions (source,mark1+1,pieces,',');
+            if ((pieces.lLength>7)||(pieces.lLength<4)) {
+                WarnErrorWhileParsing ("Simulate expects 4-6 parameters: tree with attached models, equilibrium frequencies, character map, number of sites|root sequence, <save internal node sequences>, <file name for direct storage>",
+                                       source);
+                return false;
+            }
+
+            dsc.code = 52;
+            dsc.parameters&&(&dsID);
+
+            for (mark2 = 0; mark2 < pieces.lLength; mark2++) {
+                dsc.parameters&&(pieces(mark2));
+            }
+
+            target&&(&dsc);
+            return true;
+        } else {
+            WarnErrorWhileParsing ("Expected DataSet ident = ReadDataFile(filename); or DataSet ident = SimulateDataSet (LikelihoodFunction); or DataSet ident = Combine (list of DataSets); or DataSet ident = Concatenate (list of DataSets); or DataSet ident = ReconstructAnscetors (likelihood function); or DataSet ident = SampleAnscetors (likelihood function) or DataSet	  dataSetid = ReadFromString (string);",
+                                   source);
+        }
+    }
+
+    return false;
+}
+//____________________________________________________________________________________
+
+bool    _ElementaryCommand::ConstructCategory (_String&source, _ExecutionList&target)
+// category <id> = (number of int, weights, method for representation, density, cumulative, left bound, right bound);
+{
+
+    long    mark1 = source.FirstSpaceIndex  (0,-1,1),
+            mark2 = source.Find             ('=', mark1, -1);
+
+    _String catID (source,mark1+1,mark2-1);
+
+    if (mark1==-1 || mark2==-1 || catID.Length()==0 ) {
+        _String errMsg ("Category variable declaration missing a valid identifier");
+        WarnError (errMsg);
+        return false;
+    }
+
+    // now look for the opening paren
+
+    mark1 = source.Find ('(',mark2,-1);
+
+    if (mark1!=-1) {
+        mark2 = source.FindBackwards(')',mark1+1,-1);
+        if (mark2!=-1) {
+            source = source.Cut (mark1+1,mark2-1);
+            _List args;
+            mark2 = ExtractConditions (source,0,args,',');
+            if (args.lLength>=7) {
+                _ElementaryCommand * cv = new _ElementaryCommand (20);
+                checkPointer (cv);
+                cv->parameters&&(&catID);
+                cv->addAndClean(target,&args,0);
+                return true;
+            }
+        }
+    }
+    _String errMsg ("Expected: category <id> = (number of intervals, weights, method for representation, density, cumulative, left bound, right bound,<optional mean cumulative function>,<optional hidden markov matrix>);");
+    WarnError (errMsg);
+    return false;
+}
+
+//____________________________________________________________________________________
+
+bool    _ElementaryCommand::ConstructStateCounter (_String&source, _ExecutionList&target)
+// UseMatrix (matrixIdent)
+{
+    _List args;
+    ExtractConditions (source,blStateCounter.sLength,args,',');
+    if (args.lLength!=2) {
+        WarnError ("Expected: StateCounter(likefuncID, callback function ID)");
+        return false;
+    }
+    _ElementaryCommand * sc = new _ElementaryCommand(47);
+    sc->addAndClean (target,&args,0);
+    return true;
+}
+
+
+//____________________________________________________________________________________
+bool    _ElementaryCommand::ConstructChoiceList(_String&source, _ExecutionList&target)
+{
+    _List args;
+    ExtractConditions (source,blChoiceList.sLength,args,',');
+    if (args.lLength<5) {
+        WarnError  ("ChoiceList needs at least 5 arguments");
+        return false;
+    }
+    _ElementaryCommand *cv = new _ElementaryCommand (32);
+
+    cv->parameters<<args(0);
+    ((_String*)args.lData[1])->StripQuotes();
+    cv->parameters<<args(1);
+    cv->parameters<<args(2);
+    cv->parameters<<args(3);
+
+    if  (args.lLength>5) {
+        _List   choices;
+        for (long k = 4; k<args.lLength-1; k+=2) {
+            ((_String*)args.lData[k])->StripQuotes();
+            ((_String*)args.lData[k+1])->StripQuotes();
+            _List thisChoice;
+            thisChoice<< args(k);
+            thisChoice<< args(k+1);
+            choices&& & thisChoice;
+        }
+        cv->parameters && & choices;
+        cv->simpleParameters<<0;
+    } else {
+        cv->parameters<< args(4);
+        cv->simpleParameters<<1;
+    }
+
+    cv->addAndClean(target,nil,0);
+    return true;
+}
+//____________________________________________________________________________________
+
+bool    _ElementaryCommand::ConstructReplicateConstraint (_String&source, _ExecutionList&target)
+// ReplicateConstraint ("constraint to be replicated in terms of this1,...,thisn and"
+//                       list of n variables to put in place of this1, this2, ... thisn);
+// this1 .. etc are all expected to be either trees of nodes of trees with wildcards.
+{
+    _List args;
+    ExtractConditions (source,20,args,',');
+    if (args.lLength<2) {
+        _String errMsg ("Expected: ReplicateConstraint (\"constraint to be replicated in terms of this1,...,thisn and wildcard *\", list of n variables to put in place of this1, this2, ... thisn);");
+        acknError (errMsg);
+        return false;
+    }
+    /*_String *theConstraint = (_String*)args(0), thisString;
+    long k = 0;
+    theConstraint->StripQuotes();
+    do
+    {
+        k++;
+        thisString  = _String("this")&_String(k);
+    }
+    while (theConstraint->Find(thisString)!=-1);
+
+    if (args.lLength!=k)
+    {
+        _String errMsg ("Replicate constraint could not match the number of 'this' arguments with actual variables");
+        acknError (errMsg);
+        return false;
+    }*/
+
+    _ElementaryCommand cv;
+    cv.code = 26;
+    for (long k=0; k<args.lLength; k++) {
+        cv.parameters << args(k);
+    }
+    target&& &cv;
+    return true;
+}
+
+//____________________________________________________________________________________
+
+bool    _ElementaryCommand::ConstructTree (_String&source, _ExecutionList&target)
+// Tree   treeid = (...) or Topology = (...);
+{
+    long    mark1 = source.FirstSpaceIndex(0,-1,1), mark2, mark3;
+    mark2 = source.Find ('=', mark1, -1);
+    mark3 = mark2;
+
+    if ((mark1==-1)||(mark2==-1)||(mark1+1>mark2-1)) {
+        _String errMsg ("Tree declaration missing a valid identifier");
+        acknError (errMsg);
+        return false;
+    }
+
+    _String dsID = source.Cut (mark1+1,mark2-1);
+    // now look for the opening paren
+
+    mark1 = source.Find ('(',mark2,-1);
+    mark2 = source.FindBackwards(')',mark1,-1);
+    if ((mark1==-1)||(mark2==-1)||(mark2<mark1)) {
+        if (source.Find(getDString)==-1) {
+            mark1 = mark3+1;
+            mark2 = source.Find (';',mark3,-1)-1;
+        } else {
+            source = getDString;
+            mark1 = 0;
+            mark2 = -1;
+        }
+    }
+
+    _ElementaryCommand * dsc = new _ElementaryCommand(source.startswith(blTree)?7:54);
+    checkPointer     (dsc);
+    dsc->parameters&&(&dsID);
+    dsc->parameters.AppendNewInstance(new _String(source,mark1,mark2));
+    dsc->addAndClean(target,nil,0);
+    return true;
+}
+
+
+
+//____________________________________________________________________________________
+
+bool    _ElementaryCommand::ConstructDataSetFilter (_String&source, _ExecutionList&target)
+// DataSetFilter      dataSetFilterid = CreateFilter (datasetid;unit;vertical partition; horizontal partition; alphabet exclusions);
+
+{
+    // first we must segment out the data set name
+
+    long    mark1 = source.FirstSpaceIndex(0,-1,1),
+            mark2 = source.Find ('=', mark1, -1);
+
+    _String dsID    (source,mark1+1,mark2-1),
+            command;
+
+    if ( mark1==-1 || mark2==-1 || dsID.Length()==0) {
+        _String errMsg ("DataSetFilter declaration missing a valid identifier");
+        acknError (errMsg);
+        return false;
+    }
+
+    // now look for the opening paren
+
+    mark1 = source.Find ('(',mark2,-1);
+    command = source.Cut (mark2+1,mark1-1);
+
+    _ElementaryCommand *dsf;
+
+    _List pieces;
+
+    if (command == _String("CreateFilter")) {
+        dsf = new _ElementaryCommand(6);
+    } else if (command == _String("Permute")) {
+        dsf = new _ElementaryCommand(27);
+    } else if (command == _String("Bootstrap")) {
+        dsf = new _ElementaryCommand(28);
+    } else {
+        _String errMsg ("Expected: DataSetFilter	  dataSetFilterid = CreateFilter (datasetid,unit,vertical partition,horizontal partition,alphabet exclusions); or Permute/Bootstrap (dataset/filter,<atom>,<column partition>)");
+        acknError (errMsg);
+        return false;
+    }
+
+
+    mark2 = ExtractConditions (source,mark1+1,pieces,',');
+    if (!(pieces.lLength>=2 || (pieces.lLength == 1 && dsf->code == 6))) {
+        _String errMsg ("Parameter(s) missing in DataSetFilter definition.");
+        acknError (errMsg);
+        return false;
+    }
+
+    dsf->parameters&&(&dsID);
+    dsf->addAndClean (target,&pieces);
+    return true;
+}
+
+//____________________________________________________________________________________
+
+bool    _ElementaryCommand::ConstructModel (_String&source, _ExecutionList&target)
+
+// Model ID = (inst transition matrix ident, equilibrium frequencies ident, <multiply by frequencies>);
+// if the third parameter is explicitFormMExp, then inst transition matrix ident is expected to be an explicit matrix exponential
+// EXPRESSION
+
+{
+    // first we must segment out the data set name
+
+    long    mark1 = source.FirstSpaceIndex(0,-1,1),
+            mark2 = source.Find ('=', mark1, -1);
+
+    _String modelID (source,mark1+1,mark2-1);
+
+    if (mark1==-1 || mark2==-1 || !modelID.IsValidIdentifier()) {
+        _String errMsg ("Model declaration missing a valid identifier.");
+        acknError (errMsg);
+        return false;
+    }
+
+    // now look for the opening paren
+    mark1 = source.Find ('(',mark2,-1);
+    _List pieces;
+    mark2 = ExtractConditions (source,mark1+1,pieces,',');
+
+    if (pieces.lLength<2) {
+        _String errMsg ("Parameter(s) missing in Model definition. Must have a matrix and a compatible eqiulibrium frequencies vector.");
+        acknError (errMsg);
+        return false;
+    } else {
+        if (pieces.lLength>3) {
+            _String errMsg ("Too many parameters (3 max) in Model definition");
+            acknError (errMsg);
+            return false;
+        }
+    }
+
+    _ElementaryCommand * model = new _ElementaryCommand(31);
+    checkPointer (model);
+    model->parameters&&(&modelID);
+    model->addAndClean (target,&pieces,0);
+    return true;
+
+}
+
+
+//____________________________________________________________________________________
+
+/*bool    _ElementaryCommand::ConstructFprintf (_String&source, _ExecutionList&target)
+
+{
+
+    _ElementaryCommand  *fpr = (_ElementaryCommand*)checkPointer(new _ElementaryCommand (8));
+
+    long     lastStart = 8;
+    bool     done      = false;
+
+    _String  comma (",");
+
+    while (!done) {
+        long lastEnd = source.FindTerminator(lastStart,comma);
+        if (lastEnd < 0) {
+            lastEnd = source.sLength-2;
+            done = true;
+        }
+        _String *thisArgument = new _String (source, lastStart, lastEnd-1);
+
+        if (fpr->parameters.lLength && thisArgument->IsALiteralArgument(true)) {
+            fpr->simpleParameters << fpr->parameters.lLength;
+            _FString converted (*thisArgument, true);
+            fpr->parameters << converted.theString;
+            DeleteObject (thisArgument);
+        } else {
+            fpr->parameters.AppendNewInstance (thisArgument);
+        }
+        lastStart = lastEnd + 1;
+    }
+
+    fpr->addAndClean(target, nil, 0);
+    return true;
+}*/
+
+//____________________________________________________________________________________
+
+bool    _ElementaryCommand::ConstructFscanf (_String&source, _ExecutionList&target)
+// syntax:
+// fscanf (stdin or "file name" or PROMPT_FOR_FILE, "argument descriptor", list of arguments to be read);
+// argument descriptor is a comma separated list of one of the three constants
+// "number", "matrix", "tree"
+// list of arguments to be read specifies which variables will receive the values
+
+{
+    if (!allowedFormats.lLength) {
+        allowedFormats.AppendNewInstance (new _String ("Number"));
+        allowedFormats.AppendNewInstance (new _String ("Matrix"));
+        allowedFormats.AppendNewInstance (new _String ("Tree"));
+        allowedFormats.AppendNewInstance (new _String ("String"));
+        allowedFormats.AppendNewInstance (new _String ("NMatrix"));
+        allowedFormats.AppendNewInstance (new _String ("Raw"));
+        allowedFormats.AppendNewInstance (new _String ("Lines"));
+    }
+
+    _ElementaryCommand  *fscan = new _ElementaryCommand (source.startswith (blsscanf)?56:25);
+    _List               arguments, argDesc;
+    long                f,p, shifter = 0;
+
+
+    ExtractConditions   (source,7,arguments,',');
+    if (arguments.lLength<3) {
+        WarnError (_String("Too few arguments in call to fscanf or sscanf"));
+        DeleteObject (fscan);
+        return false;
+    }
+    fscan->parameters<<arguments(0);
+
+
+    if (((_String*)arguments(1))->Equal (&blScanfRewind)) {
+        fscan->simpleParameters << -1;
+        shifter = 1;
+    }
+
+    ((_String*)arguments(1+shifter))->StripQuotes();
+    ExtractConditions   (*((_String*)arguments(1+shifter)),0,argDesc,',');
+
+    for (f = 0; f<argDesc.lLength; f++) {
+        p = allowedFormats.Find(argDesc(f));
+        if (p==-1) {
+            WarnError ( *((_String*)argDesc(f))&" is not a valid type descriptor for fscanf. Allowed ones are:"& _String((_String*)allowedFormats.toStr()));
+            DeleteObject (fscan);
+            return false;
+        } else {
+            fscan->simpleParameters<<p;
+        }
+    }
+
+    if (arguments.lLength!=fscan->simpleParameters.lLength+2) {
+        WarnError (_String("fscanf passed ")&_String((long)(fscan->simpleParameters.lLength-shifter))&" parameter type descriptors and "
+                   &_String((long)(arguments.lLength-2-shifter))& " actual arguments");
+        DeleteObject (fscan);
+        return false;
+    }
+
+    for (f = 2+shifter; f<arguments.lLength; f++) {
+        _String* thisArg = (_String*)arguments(f);
+        if (thisArg->IsValidIdentifier()) {
+            fscan->parameters<< thisArg;
+        } else {
+            WarnError (_String("fscanf passed an invalid variable identifier: ")&*thisArg);
+            DeleteObject (fscan);
+            return false;
+        }
+    }
+
+    fscan->addAndClean(target,nil,0);
+    return true;
+}
+
+//____________________________________________________________________________________
+
+bool      _ElementaryCommand::MakeJumpCommand       (_String* source,   long branch1, long branch2, _ExecutionList& parentList)
+{
+    long oldFla = 0;
+    code        = 4;
+
+    if (simpleParameters.lLength==3) {
+        if (source) {
+            _Formula* f = (_Formula*)simpleParameters(2);
+            delete (f);
+        } else {
+            oldFla = simpleParameters(2);
+        }
+    }
+
+    if (branch1==-1) {
+        if (simpleParameters.lLength == 0) {
+            WarnError ("An if-then-else scoping error. Check opening and closing brackets and double else's.");
+            return false;
+        }
+        branch1 = simpleParameters[0];
+    }
+
+    simpleParameters.Clear();
+    simpleParameters<<branch1;
+    simpleParameters<<branch2;
+    if (source) {
+        /*_Formula f;
+        long status = Parse (&f, *source, parentList.nameSpacePrefix,nil);
+        if (status==-1)
+            simpleParameters<<long(f.makeDynamic());*/
+        parameters && source;
+    } else if (oldFla) {
+        simpleParameters<<oldFla;
+    }
+
+    return true;
+}
+
+
+//____________________________________________________________________________________
+bool    _ElementaryCommand::ConstructFindRoot (_String&source, _ExecutionList&target)
+// syntax: FindRoot (receptacle, expression, variable, left bound, right bound)
+// or: Integrate (receptacle, expression, variable, left bound, right bound
+{
+    _List pieces;
+    long    mark1 = source.Find ('(');
+    _String oper (source,0,mark1);
+    source.Trim(ExtractConditions (source,mark1+1,pieces,','),-1);
+    if (pieces.lLength!=5) {
+        WarnError ("Expected: FindRoot|Integrate (receptacle, expression, variable, left bound, right bound).");
+        return false;
+    }
+    _ElementaryCommand * fri = new _ElementaryCommand(oper.Equal (&blFindRoot)?43:48);
+    fri->addAndClean(target,&pieces,0);
+    return true;
+}
+
+//____________________________________________________________________________________
+bool    _ElementaryCommand::ConstructMPISend (_String&source, _ExecutionList&target)
+// syntax: MPISend (numeric node ID, string with HBL code <or> a LF ID, <input redirect target>);
+{
+
+    _List pieces;
+    ExtractConditions (source, blMPISend.sLength ,pieces,',');
+    if (pieces.lLength!=2 && pieces.lLength!=3) {
+        WarnError ("Expected: MPISend (numeric node ID, string with HBL code <or> a LF ID).");
+        return false;
+    }
+    _ElementaryCommand * mpiSend = makeNewCommand (44);
+    mpiSend->addAndClean (target, &pieces, 0);
+    return true;
+}
+
+//____________________________________________________________________________________
+bool    _ElementaryCommand::ConstructMPIReceive (_String&source, _ExecutionList&target)
+// syntax: MPIReceive (can receive from node, received from node, receptacle for the string result);
+{
+    _List pieces;
+    ExtractConditions (source, blMPIReceive.sLength ,pieces,',');
+    if (pieces.lLength !=3 ) {
+        WarnError ("Expected: MPIReceive (can receive from node, received from node, receptacle for the string result).");
+        return false;
+    }
+
+    _ElementaryCommand * mpiRecv= makeNewCommand (45);
+    mpiRecv->addAndClean (target, &pieces, 0);
+    return true;
+}
+
+//____________________________________________________________________________________
+bool    _ElementaryCommand::ConstructCategoryMatrix (_String&source, _ExecutionList&target)
+// syntax: ConstructCategoryMatrix (receptacle, likelihood function, [COMPLETE/SHORT, which partitions to include -- a matrix agrument] )
+{
+    _List pieces;
+    ExtractConditions (source,blConstructCM.sLength,pieces,',');
+    if (pieces.lLength<2) {
+        WarnError ("Expected: ConstructCategoryMatrix (receptacle, likelihood function,COMPLETE/SHORT/WEIGHTS [optional; default is COMPLETE], [optional matrix argument with partitions to include; default is to include all]");
+        return false;
+    }
+
+    _ElementaryCommand * constuctCatMatrix = makeNewCommand(21);
+    constuctCatMatrix->addAndClean (target, &pieces, 0);
+    return true;
+}
+
+
+//____________________________________________________________________________________
+bool    _ElementaryCommand::ConstructExecuteCommands (_String&source, _ExecutionList&target)
+{
+
+    _List pieces;
+
+    char  execAFile = source.startswith (blExecuteAFile)?1:(source.startswith(blLoadFunctionLibrary)?2:0);
+    long  code = 39;
+
+    switch (execAFile) {
+    case 0:
+        ExtractConditions (source,blExecuteCommands.sLength,pieces,',');
+        break;
+
+    case 1:
+        ExtractConditions (source,blExecuteAFile.sLength,pieces,',');
+        code = 62;
+        break;
+
+    case 2:
+        ExtractConditions (source,blLoadFunctionLibrary.sLength,pieces,',');
+        code = 66;
+        break;
+    }
+
+    if (pieces.lLength < 1 || pieces.lLength > 3) {
+        WarnError ("Expected: ExecuteCommands (identifier, <compiled|(input redirect<,string prefix>)>) or ExecuteAFile (path name, <compiled|(input redirect<,string prefix>)> or LoadFunctionLibrary (path name, <compiled|(input redirect<,string prefix>)>)");
+        return false;
+    }
+
+    _ElementaryCommand * exc = (_ElementaryCommand *)checkPointer(new _ElementaryCommand (code));
+
+    exc->parameters<<pieces(0);
+
+    if (pathNames.lLength) {
+        exc->parameters && pathNames (pathNames.lLength-1);
+    } else {
+        exc->parameters && & empty;
+    }
+
+    if (pieces.lLength >1) {
+        if (*(_String*)pieces(1) == _String("compiled")) {
+            exc->simpleParameters << 1;
+        } else {
+            exc->parameters << pieces(1);
+            if (pieces.lLength > 2) {
+                exc->parameters << pieces(2);
+            }
+        }
+    }
+
+    exc->addAndClean (target);
+    return true;
+}
+
+//____________________________________________________________________________________
+bool    _ElementaryCommand::ConstructOpenWindow (_String&source, _ExecutionList&target)
+{
+
+    _List pieces;
+    ExtractConditions (source,blOpenWindow.sLength,pieces,',');
+    if (pieces.lLength<2 || pieces.lLength>3) {
+        WarnError ("Expected: OpenWindow (window type,parameter matrix,<position string>)");
+        return false;
+    }
+
+    if (pieces.lLength==3) {
+        ((_String*)pieces(2))->StripQuotes();
+    }
+
+
+    _ElementaryCommand * exc = new _ElementaryCommand (40);
+    exc->addAndClean(target, &pieces, 0);
+    return true;
+}
+
+//____________________________________________________________________________________
+bool    _ElementaryCommand::ConstructSpawnLF (_String&source, _ExecutionList&target)
+{
+    _List pieces;
+    ExtractConditions (source,blSpawnLF.sLength,pieces,',');
+    if (pieces.lLength!=4) {
+        _String errMsg ("Expected: SpawnLikelihoodFunction (likeFuncID, treeID, window ID, subset matrix)");
+        acknError (errMsg);
+        return false;
+    }
+
+    _ElementaryCommand * exc = new _ElementaryCommand (41);
+    exc->addAndClean(target,&pieces,0);
+    return true;
+}
+
+
+//____________________________________________________________________________________
+bool    _ElementaryCommand::ConstructGetDataInfo (_String&source, _ExecutionList&target)
+// syntax: GetDataInfo(matrixID, dataFilterID,<sequence ref, site ref | sequence 1 , sequence 2, DISTANCES>)
+{
+    _List pieces;
+    ExtractConditions (source,blGetDataInfo.sLength,pieces,',');
+    if (pieces.lLength<2 ||pieces.lLength>5) {
+        WarnError ("Expected: syntax: GetDataInfo(matrix ID, dataFilterID,<sequence ref, site ref | sequence 1 , sequence 2, DISTANCES>)");
+        return false;
+    }
+    _ElementaryCommand * gdi = new _ElementaryCommand(46);
+    gdi->addAndClean(target,&pieces,0);
+    return true;
+}
+
+//____________________________________________________________________________________
+bool    _ElementaryCommand::ConstructOpenDataPanel (_String&source, _ExecutionList&target)
+// syntax: OpenDataPanel(dataSetID,"species order","display settings","partition settings")
+{
+    _List pieces;
+    ExtractConditions (source,blOpenDataPanel.sLength,pieces,',');
+    if (pieces.lLength!=4 && pieces.lLength!=5) {
+        ReportWarning("Expected: syntax: OpenDataPanel(dataSetID,\"species order\",\"display settings\",\"partition settings\"),[likefunc ID]");
+        return false;
+    }
+
+    _ElementaryCommand * sp = new _ElementaryCommand (36);
+    sp->addAndClean(target,&pieces,0);
+    return true;
+}
+
+//____________________________________________________________________________________
+bool    _ElementaryCommand::ConstructGetInformation (_String&source, _ExecutionList&target)
+// syntax: GetInformation(object,receptacle)
+{
+
+    _List pieces;
+    ExtractConditions (source,blGetInformation.sLength,pieces,',');
+
+    if (pieces.lLength < 2) {
+        _String errMsg ("Expected at least 2 arguments: GetInformation(object,receptacle,...);");
+        WarnError (errMsg);
+        return false;
+    }
+
+    else {
+        _String *s0 = (_String*)pieces(0),
+                 *s1 = (_String*)pieces(1);
+
+        if (!(s0->IsValidIdentifier()&&((s1->sLength>2&&s1->getChar(0)=='"'&s1->getChar(s1->sLength-1)=='"') || s1->IsValidIdentifier()))) {
+            WarnError (_String ("Both ") & *s0 & " and " & *s1 & " must be valid identifiers in call to GetInformation.");
+            return     false;
+        }
+    }
+
+    _ElementaryCommand * sp = makeNewCommand(37);
+    sp->addAndClean (target, &pieces, 0);
+    return true;
+}
+
+//____________________________________________________________________________________
+bool    _ElementaryCommand::ConstructLF (_String&source, _ExecutionList&target)
+// syntax: LikelihoodFunction id = (filter1, tree1, ..., filterN, treeN, optional compute template)
+// or LikelihoodFunction3 id = (filter1, tree1, freq1, ... filterN, treeN, freqN, optional compute template)
+{
+    long    mark1 = source.FirstSpaceIndex(0,-1,1),
+            mark2 = source.Find ('=', mark1, -1);
+
+    if ( mark1==-1 || mark2==-1 || mark1+1>mark2-1 ) {
+        _String errMsg ("Likelihood function declaration missing a valid identifier");
+        acknError (errMsg);
+        return false;
+    }
+
+    _String lfID (source,mark1+1,mark2-1);
+    // now look for the opening paren
+
+    _List pieces;
+    mark1 = source.Find ('(',mark2,-1);
+    mark2 = source.FindBackwards(')',mark1,-1);
+    ExtractConditions (source,mark1+1,pieces,',');
+
+    if ( mark1==-1 || mark2==-1 || mark2<mark1 ) {
+        WarnError ("Expected: Likelihood Function ident = (tree1, datasetfilter1,...)");
+        return false;
+    }
+
+    _ElementaryCommand*  dsc = (_ElementaryCommand*)checkPointer(new _ElementaryCommand (11));
+    dsc->parameters&&(&lfID);
+
+    if (source.startswith(blLF3)) {
+        dsc->simpleParameters << 1;
+    }
+
+    dsc->addAndClean(target,&pieces,0);
+    return true;
+}
+
+
+
+//____________________________________________________________________________________
+bool    _ElementaryCommand::ConstructFunction (_String&source, _ExecutionList& chain)
+// syntax: function <ident> (comma separated list of parameters) {body}
+{
+    if (isInFunction) {
+        WarnError ("Nested function declarations are not allowed");
+        return false;
+    }
+
+    isInFunction = true;
+
+    bool    isFFunction = source.beginswith (blFFunction),
+            isLFunction = source.beginswith (blLFunction);
+
+    long    mark1 = source.FirstNonSpaceIndex((isFFunction||isLFunction)?blFFunction.sLength:blFunction.sLength,-1,1),
+            mark2 = source.Find ('(', mark1, -1);
+
+
+    if ( mark1==-1 || mark2==-1 || mark1+1>mark2-1) {
+        WarnError      ("Function declaration missing a valid function identifier or parameter list.");
+        isInFunction = false;
+        return false;
+    }
+
+    _String*    funcID  = (_String*)checkPointer(new _String(source.Cut (mark1,mark2-1)));
+
+    *funcID = chain.AddNameSpaceToID (*funcID);
+
+    // now look for the opening paren
+
+    if ((mark1=batchLanguageFunctionNames.Find(funcID))!=-1) {
+        ReportWarning (_String("Overwritten previously defined function:'") & *funcID & '\'');
+    }
+
+    _List pieces;
+
+    long upto = ExtractConditions (source,mark2+1,pieces,',',false);
+
+
+    if (upto==source.sLength || source[upto]!='{' || source[source.sLength-1]!='}') {
+        WarnError (_String("Function declaration is missing a valid function body."));
+        isInFunction= false;
+        return false;
+    }
+
+    _String extraNamespace;
+    if (isLFunction)
+        extraNamespace = _HYGenerateANameSpace();
+    
+    for (long k = 0; k < pieces.lLength; k++) {
+        pieces.Replace (k,new _String(chain.AddNameSpaceToID (*(_String*)pieces(k), & extraNamespace)),false);
+    }
+
+    _String          sfunctionBody (source, upto+1,source.Length()-2);
+    _ExecutionList * functionBody;
+        if (isLFunction) {
+            _String * existing_namespace = chain.GetNameSpace();
+            if (existing_namespace) {
+                extraNamespace = *existing_namespace & '.' & extraNamespace;
+            }
+            functionBody = new _ExecutionList (sfunctionBody,&extraNamespace,true);
+        }
+        else {
+            functionBody = new _ExecutionList (sfunctionBody,chain.GetNameSpace(),true);
+        }
+    
+
+    //  take care of all the return statements
+    while (returnlist.lLength) {
+        ((_ElementaryCommand*)(*functionBody)(returnlist(0)))->simpleParameters<<functionBody->lLength;
+        returnlist.Delete(0);
+    }
+
+
+    if (mark1>=0) {
+        batchLanguageFunctions.Replace (mark1, functionBody, false);
+        batchLanguageFunctionNames.Replace (mark1, funcID, false);
+        batchLanguageFunctionParameterLists.Replace (mark1, &pieces, true);
+        batchLanguageFunctionParameters.lData[mark1] = pieces.lLength;
+        batchLanguageFunctionClassification.lData[mark1] = isFFunction? BL_FUNCTION_NORMAL_UPDATE :  BL_FUNCTION_ALWAYS_UPDATE;
+    } else {
+        batchLanguageFunctions.AppendNewInstance(functionBody);
+        batchLanguageFunctionNames.AppendNewInstance(funcID);
+        batchLanguageFunctionParameterLists &&(&pieces);
+        batchLanguageFunctionParameters     <<pieces.lLength;
+        batchLanguageFunctionClassification <<(isFFunction? BL_FUNCTION_NORMAL_UPDATE :  BL_FUNCTION_ALWAYS_UPDATE);
+    }
+
+
+    isInFunction = false;
+    return true;
+}
+
+//____________________________________________________________________________________
+bool    _ElementaryCommand::ConstructReturn (_String&source, _ExecutionList&target)
+// syntax: return <statement>
+{
+
+    /*if (!isInFunction)
+    {
+        _ElementaryCommand exit;
+        exit.code = 4;
+        exit.simpleParameters<<-1;
+        target&&(&exit);
+        return true;
+    }*/
+
+    long    mark1 = source.FirstNonSpaceIndex(blReturn.sLength,-1,1);
+
+    _ElementaryCommand ret;
+
+    ret.code = 14;
+
+    if (mark1!=-1) {
+        _String cut_s;
+        if (source.sData[source.sLength-1]==';') {
+            cut_s = source.Cut (mark1,source.sLength-2);
+        } else {
+            cut_s = source.Cut (mark1,-1);
+        }
+
+        ret.parameters&&(&cut_s);
+    }
+
+    if (isInFunction) {
+        returnlist<<target.lLength;
+    } else {
+        ret.simpleParameters << -1;
+    }
+
+    target&&(&ret);
+    return true;
+}
+
+
+//____________________________________________________________________________________
+
+void    ReadBatchFile (_String& fName, _ExecutionList& target)
+// read/parse a file into an execution list
+// THE function!!!
+{
+
+    fName.ProcessFileName(target.nameSpacePrefix);
+
+    if (terminateExecution) {
+        return;
+    }
+    /*#else
+        _Variable optprec (optimizationPrecision);
+        _Constant precvalue (0.01);
+        FetchVar(LocateVarByName (optimizationPrecision))->SetValue(&precvalue);
+    #endif*/
+
+    FILE            *f = doFileOpen (fName.getStr(), "rb");
+    SetStatusLine   ("Parsing File");
+    if (!f) {
+        WarnError (_String("Could not read batch file '") & fName & "'.\nPath stack: " & (_String*)pathNames.toStr());
+    } else {
+        _String beavis (f);
+
+        if (beavis.beginswith("#NEXUS",false)) {
+            ReadDataSetFile (f,1,nil,&fName);
+        } else {
+            target.BuildList (beavis);
+            target.sourceFile = fName;
+        }
+        fclose (f);
+    }
+}
+
+//____________________________________________________________________________________
+
+void        SetDataFilterParameters (_String& parName, _DataSetFilter* thedf, bool setOrKill)
+{
+    _String     varName (parName&".species");
+    _Variable*  receptacleVar = nil;
+
+    if (setOrKill) {
+        setParameter (varName, thedf->NumberSpecies());
+    } else {
+        DeleteVariable (varName);
+    }
+
+    varName = parName&".sites";
+    if (setOrKill) {
+        setParameter (varName, thedf->GetFullLengthSpecies()/thedf->GetUnitLength());
+    } else {
+        DeleteVariable (varName);
+    }
+
+    varName = parName&".unique_sites";
+    if (setOrKill) {
+        setParameter (varName,thedf->NumberDistinctSites());
+    } else {
+        DeleteVariable (varName);
+    }
+
+    varName = parName&".site_freqs";
+    _Parameter      sizeCutoff;
+    if (setOrKill) {
+        checkParameter  (defaultLargeFileCutoff,sizeCutoff, 100000.);
+
+        if (thedf->theFrequencies.lLength < sizeCutoff) {
+            receptacleVar = CheckReceptacle (&varName, empty, false);
+            receptacleVar->SetValue (new _Matrix(thedf->theFrequencies),false);
+        }
+    } else {
+        DeleteVariable (varName);
+    }
+
+    varName = parName&".site_map";
+    if (setOrKill) {
+        if (thedf->theOriginalOrder.lLength < sizeCutoff) {
+            receptacleVar = CheckReceptacle (&varName, empty, false);
+            receptacleVar->SetValue (new _Matrix(thedf->theOriginalOrder),false);
+        }
+    } else {
+        DeleteVariable (varName);
+    }
+
+
+    varName = parName&".sequence_map";
+    if (setOrKill) {
+        if (thedf->theOriginalOrder.lLength < sizeCutoff) {
+            receptacleVar = CheckReceptacle (&varName, empty, false);
+            receptacleVar->SetValue (new _Matrix(thedf->theNodeMap),false);
+       }
+    } else {
+        DeleteVariable (varName);
+    }
+}
+
+//____________________________________________________________________________________
+void    SerializeModel  (_String& rec, long theModel, _AVLList* alreadyDone, bool completeExport)
+{
+    bool        mByF = true,
+                do2  = false;
+
+    _Variable   * tV  = nil,
+                  * tV2 = nil;
+
+    _Formula    * theExp  = nil;
+    _SimpleList   matrices;
+
+    if (modelTypeList.lData[theModel]) {
+        theExp = (_Formula*)modelMatrixIndices.lData[theModel];
+        theExp->ScanFForType(matrices, MATRIX);
+
+        for (long mi = 0; mi < matrices.countitems(); mi++) {
+            if (alreadyDone && alreadyDone->Insert ((BaseRef)matrices.lData[mi]) < 0) {
+                matrices.Delete(mi);
+                mi--;
+            }
+        }
+    } else {
+        if (!alreadyDone || alreadyDone->Find ((BaseRef)modelMatrixIndices.lData[theModel]) < 0) {
+            if (alreadyDone) {
+                alreadyDone->Insert ((BaseRef)modelMatrixIndices.lData[theModel]);
+            }
+            matrices << modelMatrixIndices.lData[theModel];
+        }
+        tV = LocateVar(modelMatrixIndices.lData[theModel]);
+    }
+
+    long freqID = modelFrequenciesIndices.lData[theModel];
+
+    if (freqID>=0) {
+        tV2 = LocateVar(freqID);
+    } else {
+        mByF = false;
+        tV2 = LocateVar(-freqID-1);
+    }
+
+    if (!alreadyDone || alreadyDone->Find ((BaseRef)tV2->GetAVariable()) < 0) {
+        if (alreadyDone) {
+            alreadyDone->Insert ((BaseRef)tV2->GetAVariable());
+        }
+        do2 = true;
+    }
+
+    if (completeExport && (matrices.lLength || do2 || theExp)) {
+        _SimpleList    vl,
+                       ind,
+                       dep,
+                       cat;
+
+        _AVLList vlst (&vl);
+
+        if (theExp) {
+            theExp->ScanFForVariables(vlst, true, false, true);
+        }
+
+        for (long mi = 0; mi < matrices.lLength; mi++) {
+            LocateVar(matrices.lData[mi])->ScanForVariables (vlst,true);
+        }
+
+        if (do2) {
+            tV2->ScanForVariables (vlst,true);
+        }
+        vlst.ReorderList ();
+        SplitVariablesIntoClasses (vl,ind,dep,cat);
+
+        _String glVars (128L, true),
+                locVars(128L, true);
+
+        ExportIndVariables (glVars,locVars, &ind);
+        ExportDepVariables (glVars,locVars, &dep);
+        glVars.Finalize();
+        locVars.Finalize();
+        rec<<glVars;
+        rec<<locVars;
+        ExportCatVariables (rec,&cat);
+    }
+
+    if (matrices.lLength) {
+        for (long k = 0; k < matrices.lLength; k++) {
+            _Variable *tV = LocateVar (matrices.lData[k]);
+            ((_Matrix*)   tV->GetValue())->Serialize (rec,*tV->GetName());
+            rec << '\n';
+        }
+    }
+
+    if (do2) {
+        ((_Matrix*)   tV2->GetValue())->Serialize (rec,*tV2->GetName());
+    }
+
+    rec << "\nModel ";
+    rec << *((_String*)modelNames (theModel));
+    rec << "=(";
+    if (theExp) {
+        rec << '"';
+        rec << _String((_String*)(theExp->toStr()));
+        rec << '"';
+    } else {
+        rec << *tV->GetName();
+    }
+    rec << ',';
+    rec << *tV2->GetName();
+    if (theExp) {
+        rec << ',';
+        rec << explicitFormMExp;
+    } else if (!mByF) {
+        rec << ",0";
+    }
+    rec << ");\n";
+}
diff --git a/src/core/batchlan2.cpp b/src/core/batchlan2.cpp
new file mode 100644
index 0000000..ec370d6
--- /dev/null
+++ b/src/core/batchlan2.cpp
@@ -0,0 +1,2366 @@
+/*
+ HyPhy - Hypothesis Testing Using Phylogenies.
+ 
+ Copyright (C) 1997-now
+ Core Developers:
+ Sergei L Kosakovsky Pond (spond at ucsd.edu)
+ Art FY Poon    (apoon at cfenet.ubc.ca)
+ Steven Weaver (sweaver at ucsd.edu)
+ 
+ Module Developers:
+ Lance Hepler (nlhepler at gmail.com)
+ Martin Smith (martin.audacis at gmail.com)
+ 
+ Significant contributions from:
+ Spencer V Muse (muse at stat.ncsu.edu)
+ Simon DW Frost (sdf22 at cam.ac.uk)
+ 
+ Permission is hereby granted, free of charge, to any person obtaining a
+ copy of this software and associated documentation files (the
+ "Software"), to deal in the Software without restriction, including
+ without limitation the rights to use, copy, modify, merge, publish,
+ distribute, sublicense, and/or sell copies of the Software, and to
+ permit persons to whom the Software is furnished to do so, subject to
+ the following conditions:
+ 
+ The above copyright notice and this permission notice shall be included
+ in all copies or substantial portions of the Software.
+ 
+ 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.
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 
+ */
+
+#include      "alignment.h"
+#include      "trie.h"
+#include      "likefunc.h"
+#include      "scfg.h"
+#include      <ctype.h>
+
+#include      "bayesgraph.h"
+
+#ifndef __HYPHY_NO_SQLITE__
+#include "sqlite3.h"
+#endif
+
+#if !defined __HEADLESS__ && !defined __UNIX__
+#include      "HYUtils.h"
+#endif
+
+#ifdef    __HYPHYDMALLOC__
+#include "dmalloc.h"
+#endif
+
+
+
+//____________________________________________________________________________________
+// global variables
+
+_String     sqlOpen                 ("SQL_OPEN"),
+            sqlClose                ("SQL_CLOSE"),
+            sqlRowData              ("SQL_ROW_DATA"),
+            sqlColNames             ("SQL_COLUMN_NAMES"),
+            seqAlignMap             ("SEQ_ALIGN_CHARACTER_MAP"),
+            seqAlignScore           ("SEQ_ALIGN_SCORE_MATRIX"),
+            seqAlignScoreCodon2     ("SEQ_ALIGN_SCORE_MATRIX_PARTIAL_CODON_2"),
+            seqAlignScoreCodon1     ("SEQ_ALIGN_SCORE_MATRIX_PARTIAL_CODON_1"),
+            seqAlignGapChar         ("SEQ_ALIGN_GAP_CHARACTER"),
+            seqAlignGapOpen         ("SEQ_ALIGN_GAP_OPEN"),
+            seqAlignGapExtend       ("SEQ_ALIGN_GAP_EXTEND"),
+            seqAlignGapOpen2        ("SEQ_ALIGN_GAP_OPEN2"),
+            seqAlignGapExtend2      ("SEQ_ALIGN_GAP_EXTEND2"),
+            seqAlignFrameShift      ("SEQ_ALIGN_FRAMESHIFT"),
+            seqAlignGapLocal        ("SEQ_ALIGN_NO_TP"),
+            seqAlignGapAffine       ("SEQ_ALIGN_AFFINE"),
+            seqAlignCodonAlign      ("SEQ_ALIGN_CODON_ALIGN"),
+            seqAlignGapLinearSpace  ("SEQ_ALIGN_LINEAR_SPACE"),
+            seqAlignGapCodon3x1     ("SEQ_ALIGN_PARTIAL_3x1_SCORES"),
+            seqAlignGapCodon3x2     ("SEQ_ALIGN_PARTIAL_3x2_SCORES"),
+            seqAlignGapCodon3x4     ("SEQ_ALIGN_PARTIAL_3x4_SCORES"),
+            seqAlignGapCodon3x5     ("SEQ_ALIGN_PARTIAL_3x5_SCORES"),
+            seqAlignDoLocal         ("SEQ_ALIGN_LOCAL_ALIGNMENT"),
+            completeFlag            ("COMPLETE"),
+            conditionalWeights      ("WEIGHTS"),
+            siteProbabilities       ("SITE_LOG_LIKELIHOODS"),
+            lastSetOfConstraints    ("LAST_SET_OF_CONSTRAINTS"),
+            deferConstrainAssignment("DEFER_CONSTRAINT_APPLICATION"),
+            assertionBehavior       ("ASSERTION_BEHAVIOR"),
+            _hyStatusConditionProbsMatrix
+            ("Constructing Conditional Probabilities Matrix"),
+
+            isDynamicGraph          ("BGM_DYNAMIC");
+
+
+extern      _String                 blDoSQL,
+            blAlignSequences,
+            blGetNeutralNull,
+            blHBLProfile,
+            blDeleteObject,
+            timeStamp,
+            versionString,
+            lastModelParameterList,
+            blGetString,
+            blRequireVersion,
+            blAssert;
+
+_SimpleList sqlDatabases,
+            _HY_HBLCommandHelperAux;
+            
+_List        scfgList,
+             scfgNamesList,
+             bgmList,
+             bgmNamesList,
+             _HY_GetStringGlobalTypesAux;
+            
+_Trie        _HY_ValidHBLExpressions;
+
+_AVLListX    _HY_GetStringGlobalTypes (&_HY_GetStringGlobalTypesAux),
+             _HY_HBLCommandHelper     (&_HY_HBLCommandHelperAux);
+             
+
+//____________________________________________________________________________________
+
+int          _HYSQLCallBack                     (void* data,int callCount);
+//int        _HYSQLBusyCallBack                 (void* exList,int cc,char** rd,char** cn);
+bool         RecurseDownTheTree                 (_SimpleList&, _List&, _List&, _List&, _SimpleList&);
+// this is a ReplicateConstraint helper
+
+//____________________________________________________________________________________
+
+_HBLCommandExtras* _hyInitCommandExtras (const long cut, const long conditions, _String commandInvocation, const char sep, const bool doTrim, const bool isAssignment, const bool needsVerb, _SimpleList * conditionList) {
+    
+    struct _HBLCommandExtras * commandInfo           = new _HBLCommandExtras();
+    commandInfo->cut_string                          = cut;
+    if (conditions < 0 && conditionList) 
+        commandInfo->extract_conditions              << *conditionList;
+    else
+        commandInfo->extract_conditions              << conditions;
+    commandInfo->extract_condition_separator         = sep;
+    commandInfo->do_trim                             = doTrim;
+    commandInfo->is_assignment                       = isAssignment;
+    commandInfo->needs_verb                          = needsVerb;
+    commandInfo->command_invocation                  && & commandInvocation;
+
+    return                                             commandInfo;
+    
+}
+
+//____________________________________________________________________________________
+
+bool      _ElementaryCommand::ExtractValidateAddHBLCommand (_String& current_stream,const long command_code,  _List* pieces, _HBLCommandExtras* command_spec, _ExecutionList& command_list)
+
+{
+    if (command_spec->is_assignment) {
+        // TBA
+    } else {
+        // by default push all of the 'pieces' arguments to the "argument" list
+        _ElementaryCommand *cv = new _ElementaryCommand (command_code);
+        cv->addAndClean  (command_list, pieces, 0);        
+    }
+    
+    return true;
+}
+
+
+//____________________________________________________________________________________
+
+
+void        _HBL_Init_Const_Arrays  (void)
+{
+    // init GetString lookups
+    _HY_GetStringGlobalTypes.Insert(new _String("LikelihoodFunction"), HY_BL_LIKELIHOOD_FUNCTION);
+    _HY_GetStringGlobalTypes.Insert(new _String("DataSet"), HY_BL_DATASET);
+    _HY_GetStringGlobalTypes.Insert(new _String("DataSetFilter"), HY_BL_DATASET_FILTER);
+    _HY_GetStringGlobalTypes.Insert(new _String("UserFunction"), HY_BL_HBL_FUNCTION);
+    _HY_GetStringGlobalTypes.Insert(new _String("Tree"), HY_BL_TREE);
+    _HY_GetStringGlobalTypes.Insert(new _String("SCFG"), HY_BL_SCFG);
+    _HY_GetStringGlobalTypes.Insert(new _String("Variable"), HY_BL_VARIABLE);
+	_HY_GetStringGlobalTypes.Insert(new _String("BayesianGraphicalModel"), HY_BL_BGM);
+
+
+    _HY_ValidHBLExpressions.Insert ("function ",                            HY_HBL_COMMAND_FUNCTION);
+    _HY_ValidHBLExpressions.Insert ("ffunction ",                           HY_HBL_COMMAND_FFUNCTION);
+    _HY_ValidHBLExpressions.Insert ("return ",                              HY_HBL_COMMAND_RETURNSPACE);
+    _HY_ValidHBLExpressions.Insert ("return(",                              HY_HBL_COMMAND_RETURNPAREN);
+    _HY_ValidHBLExpressions.Insert ("if(",                                  HY_HBL_COMMAND_IF);
+    _HY_ValidHBLExpressions.Insert ("else",                                 HY_HBL_COMMAND_ELSE);
+    _HY_ValidHBLExpressions.Insert ("do{",                                  HY_HBL_COMMAND_DO);
+    _HY_ValidHBLExpressions.Insert ("break;",                               HY_HBL_COMMAND_BREAK);
+    _HY_ValidHBLExpressions.Insert ("continue;",                            HY_HBL_COMMAND_CONTINUE);
+    _HY_ValidHBLExpressions.Insert ("#include",                             HY_HBL_COMMAND_INCLUDE);
+    _HY_ValidHBLExpressions.Insert ("DataSet ",                             HY_HBL_COMMAND_DATA_SET);
+    _HY_ValidHBLExpressions.Insert ("DataSetFilter ",                       HY_HBL_COMMAND_DATA_SET_FILTER);
+    _HY_ValidHBLExpressions.Insert ("ConstructCategoryMatrix(",				HY_HBL_COMMAND_CONSTRUCT_CATEGORY_MATRIX);
+    _HY_ValidHBLExpressions.Insert ("Tree ",                                HY_HBL_COMMAND_TREE);
+    _HY_ValidHBLExpressions.Insert ("LikelihoodFunction ",					HY_HBL_COMMAND_LIKELIHOOD_FUNCTION);
+    _HY_ValidHBLExpressions.Insert ("LikelihoodFunction3 ",					HY_HBL_COMMAND_LIKELIHOOD_FUNCTION_3);
+    _HY_ValidHBLExpressions.Insert ("MolecularClock(",                      HY_HBL_COMMAND_MOLECULAR_CLOCK);
+    _HY_ValidHBLExpressions.Insert ("fscanf(",                              HY_HBL_COMMAND_FSCANF);
+    _HY_ValidHBLExpressions.Insert ("sscanf(",                              HY_HBL_COMMAND_SSCANF);
+    _HY_ValidHBLExpressions.Insert ("ReplicateConstraint(",					HY_HBL_COMMAND_REPLICATE_CONSTRAINT);
+    //_HY_ValidHBLExpressions.Insert ("Import(",                              HY_HBL_COMMAND_IMPORT);
+    _HY_ValidHBLExpressions.Insert ("category ",                            HY_HBL_COMMAND_CATEGORY);
+    _HY_ValidHBLExpressions.Insert ("Model ",                               HY_HBL_COMMAND_MODEL);
+    _HY_ValidHBLExpressions.Insert ("ChoiceList(",                          HY_HBL_COMMAND_SET_CHOICE_LIST);
+    _HY_ValidHBLExpressions.Insert ("OpenDataPanel(",                       HY_HBL_COMMAND_OPEN_DATA_PANEL);
+    _HY_ValidHBLExpressions.Insert ("GetInformation(",                      HY_HBL_COMMAND_GET_INFORMATION);
+    _HY_ValidHBLExpressions.Insert ("ExecuteCommands(",                     HY_HBL_COMMAND_EXECUTE_COMMANDS);
+    _HY_ValidHBLExpressions.Insert ("ExecuteAFile(",                        HY_HBL_COMMAND_EXECUTE_A_FILE);
+    _HY_ValidHBLExpressions.Insert ("LoadFunctionLibrary(",					HY_HBL_COMMAND_LOAD_FUNCTION_LIBRARY);
+    _HY_ValidHBLExpressions.Insert ("OpenWindow(",                          HY_HBL_COMMAND_OPEN_WINDOW);
+    _HY_ValidHBLExpressions.Insert ("SpawnLikelihoodFunction(",				HY_HBL_COMMAND_SPAWN_LIKELIHOOD_FUNCTION);
+    _HY_ValidHBLExpressions.Insert ("FindRoot(",                            HY_HBL_COMMAND_FIND_ROOT);
+    _HY_ValidHBLExpressions.Insert ("MPIReceive(",                          HY_HBL_COMMAND_MPI_RECEIVE);
+    _HY_ValidHBLExpressions.Insert ("MPISend(",                             HY_HBL_COMMAND_MPI_SEND);
+    _HY_ValidHBLExpressions.Insert ("GetDataInfo(",                         HY_HBL_COMMAND_GET_DATA_INFO);
+    _HY_ValidHBLExpressions.Insert ("StateCounter(",                        HY_HBL_COMMAND_STATE_COUNTER);
+    _HY_ValidHBLExpressions.Insert ("Integrate(",                           HY_HBL_COMMAND_INTEGRATE);
+    _HY_ValidHBLExpressions.Insert ("DoSQL(",                               HY_HBL_COMMAND_DO_SQL);
+    _HY_ValidHBLExpressions.Insert ("Topology ",                            HY_HBL_COMMAND_TOPOLOGY);
+    _HY_ValidHBLExpressions.Insert ("AlignSequences(",                      HY_HBL_COMMAND_ALIGN_SEQUENCES);
+    _HY_ValidHBLExpressions.Insert ("GetNeutralNull(",                      HY_HBL_COMMAND_GET_NEUTRAL_NULL);
+    _HY_ValidHBLExpressions.Insert ("#profile",                             HY_HBL_COMMAND_PROFILE);
+    _HY_ValidHBLExpressions.Insert ("SCFG ",                                HY_HBL_COMMAND_SCFG);
+    _HY_ValidHBLExpressions.Insert ("NeuralNet ",                           HY_HBL_COMMAND_NEURAL_NET);
+    _HY_ValidHBLExpressions.Insert ("BGM ",                                 HY_HBL_COMMAND_BGM);
+    _HY_ValidHBLExpressions.Insert ("SimulateDataSet",                      HY_HBL_COMMAND_SIMULATE_DATA_SET);
+/*
+const long cut, const long conditions, const char sep, const bool doTrim, const bool isAssignment, const bool needsVerb, length options
+*/
+
+    _SimpleList lengthOptions;
+    _HY_HBLCommandHelper.Insert    ((BaseRef)HY_HBL_COMMAND_FOR, 
+                                    (long)_hyInitCommandExtras (_HY_ValidHBLExpressions.Insert ("for(", HY_HBL_COMMAND_FOR,false),3, "for (<initialization>;<condition>;<increment>) {loop body}"));
+
+    _HY_HBLCommandHelper.Insert    ((BaseRef)HY_HBL_COMMAND_WHILE,
+                                    (long)_hyInitCommandExtras (_HY_ValidHBLExpressions.Insert ("while(", HY_HBL_COMMAND_WHILE,false),1, "while (<condition>) {loop body}"));
+                                                            
+
+    _HY_HBLCommandHelper.Insert    ((BaseRef)HY_HBL_COMMAND_SET_DIALOG_PROMPT, 
+                                    (long)_hyInitCommandExtras (_HY_ValidHBLExpressions.Insert ("SetDialogPrompt(", HY_HBL_COMMAND_SET_DIALOG_PROMPT,false),
+                                    1, 
+                                    "SetDialogPrompt(<prompt string>);"));
+    
+    lengthOptions.Clear();lengthOptions.Populate (3,5,1);
+    _HY_HBLCommandHelper.Insert    ((BaseRef)HY_HBL_COMMAND_HARVEST_FREQUENCIES, 
+                                    (long)_hyInitCommandExtras (_HY_ValidHBLExpressions.Insert ("HarvestFrequencies(", HY_HBL_COMMAND_HARVEST_FREQUENCIES,false),
+                                    -1, 
+                                    "HarvestFrequencies(<receptacle>, <DataSet or DataSetFilter>, <atom INTEGER>, <unit INTEGER <= atom>, <position aware 0 or 1>, [optional site partion], [optional sequence partition] (only for DataSetArguments)",
+                                        ',',
+                                        true,
+                                        false,
+                                        false,
+                                        &lengthOptions));
+    
+    _HY_HBLCommandHelper.Insert    ((BaseRef)HY_HBL_COMMAND_OPTIMIZE, 
+                                    (long)_hyInitCommandExtras (_HY_ValidHBLExpressions.Insert ("Optimize(", HY_HBL_COMMAND_OPTIMIZE,false),
+                                                                2, 
+                                                                "Optimize (<receptacle>, <likelihood function/scfg/bgm>)",','));
+
+    _HY_HBLCommandHelper.Insert    ((BaseRef)HY_HBL_COMMAND_LFCOMPUTE, 
+                                    (long)_hyInitCommandExtras (_HY_ValidHBLExpressions.Insert ("LFCompute(", HY_HBL_COMMAND_LFCOMPUTE,false),
+                                                                2, 
+                                                                "LFCompute (<likelihood function/scfg/bgm>,<LF_START_COMPUTE|LF_DONE_COMPUTE|receptacle>)",','));
+
+
+    _HY_HBLCommandHelper.Insert    ((BaseRef)HY_HBL_COMMAND_COVARIANCE_MATRIX, 
+                                    (long)_hyInitCommandExtras (_HY_ValidHBLExpressions.Insert ("CovarianceMatrix(", HY_HBL_COMMAND_COVARIANCE_MATRIX,false),
+                                                                2, 
+                                                                "CovarianceMatrix (<receptacle>, <likelihood function/scfg/bgm>)",','));
+
+     
+    _HY_HBLCommandHelper.Insert    ((BaseRef)HY_HBL_COMMAND_SELECT_TEMPLATE_MODEL, 
+                                    (long)_hyInitCommandExtras (_HY_ValidHBLExpressions.Insert ("SelectTemplateModel(", HY_HBL_COMMAND_SELECT_TEMPLATE_MODEL,false),
+                                    1, 
+                                    "SelectTemplateModel(<DataSetFilter>);"));
+
+
+    _HY_HBLCommandHelper.Insert    ((BaseRef)HY_HBL_COMMAND_USE_MODEL, 
+                                    (long)_hyInitCommandExtras (_HY_ValidHBLExpressions.Insert ("UseModel(", HY_HBL_COMMAND_USE_MODEL,false),
+                                                                1, 
+                                                                "UseModel (<model ID>)",','));
+
+    _HY_HBLCommandHelper.Insert    ((BaseRef)HY_HBL_COMMAND_SET_PARAMETER, 
+                                    (long)_hyInitCommandExtras (_HY_ValidHBLExpressions.Insert ("SetParameter(", HY_HBL_COMMAND_SET_PARAMETER,false),
+                                                                3, 
+                                                                "SetParameter(<object>, <parameter index>, <value>)",','));
+
+
+    lengthOptions.Clear();lengthOptions.Populate (2,1,1);
+    _HY_HBLCommandHelper.Insert    ((BaseRef)HY_HBL_COMMAND_ASSERT, 
+                                    (long)_hyInitCommandExtras (_HY_ValidHBLExpressions.Insert ("assert(", HY_HBL_COMMAND_ASSERT,false),
+                                    -1, 
+                                    "assert (<statement>,[optional message on failure]>",
+                                        ',',
+                                        true,
+                                        false,
+                                        false,
+                                        &lengthOptions));
+
+
+    _HY_HBLCommandHelper.Insert    ((BaseRef)HY_HBL_COMMAND_REQUIRE_VERSION, 
+                                    (long)_hyInitCommandExtras (_HY_ValidHBLExpressions.Insert ("RequireVersion(", HY_HBL_COMMAND_REQUIRE_VERSION,false),
+                                                                1, 
+                                                                "RequireVersion (<version string>)",','));
+
+    _HY_HBLCommandHelper.Insert    ((BaseRef)HY_HBL_COMMAND_DELETE_OBJECT, 
+                                    (long)_hyInitCommandExtras (_HY_ValidHBLExpressions.Insert ("DeleteObject(", HY_HBL_COMMAND_DELETE_OBJECT,false),
+                                                                -1, 
+                                                                "DeleteObject(<object 1> [optional ,<object 2>, <object 3>, ..., <object N>])",','));
+    
+    _HY_HBLCommandHelper.Insert    ((BaseRef)HY_HBL_COMMAND_CLEAR_CONSTRAINTS, 
+                                    (long)_hyInitCommandExtras (_HY_ValidHBLExpressions.Insert ("ClearConstraints(", HY_HBL_COMMAND_CLEAR_CONSTRAINTS,false),
+                                                                -1, 
+                                                                "ClearConstraints(<object 1> [optional ,<object 2>, <object 3>, ..., <object N>])",','));
+
+    _HY_HBLCommandHelper.Insert    ((BaseRef)HY_HBL_COMMAND_MOLECULAR_CLOCK, 
+                                    (long)_hyInitCommandExtras (_HY_ValidHBLExpressions.Insert ("MolecularClock(", HY_HBL_COMMAND_MOLECULAR_CLOCK,false),
+                                                                -2, 
+                                                                "MolecularClock(tree or tree node, local variable 1 [optional ,<local variable 2>, ..., <local variable N>])",','));
+
+
+    _HY_HBLCommandHelper.Insert    ((BaseRef)HY_HBL_COMMAND_FPRINTF,
+                                    (long)_hyInitCommandExtras (_HY_ValidHBLExpressions.Insert ("fprintf(", HY_HBL_COMMAND_FPRINTF,false),
+                                                                -2,
+                                                                "fprintf(stdout|MESSAGE_LOG|TEMP_FILE_NAME|PROMPT_FOR_FILE|file path, object 1 [optional ,<object 2>, ..., <object N>])",','));
+
+    
+    lengthOptions.Clear();lengthOptions.Populate (1,2,1); // 2
+    _HY_HBLCommandHelper.Insert    ((BaseRef)HY_HBL_COMMAND_EXPORT, 
+                                    (long)_hyInitCommandExtras (_HY_ValidHBLExpressions.Insert ("Export(", HY_HBL_COMMAND_EXPORT,false),
+                                                                -1, 
+                                                                "Export (<string variable ID>, <object ID>)",
+                                                                ',',
+                                                                true,
+                                                                false,
+                                                                false,
+                                                                &lengthOptions));
+
+
+    lengthOptions.Clear();lengthOptions.Populate (2,2,1);
+    _HY_HBLCommandHelper.Insert    ((BaseRef)HY_HBL_COMMAND_GET_URL, 
+                                    (long)_hyInitCommandExtras (_HY_ValidHBLExpressions.Insert ("GetURL(", HY_HBL_COMMAND_GET_URL,false),
+                                    -1, 
+                                    "GetURL (<receptacle>,<URL>[, SAVE_TO_FILE])",
+                                        ',',
+                                        true,
+                                        false,
+                                        false,
+                                        &lengthOptions));
+
+    lengthOptions.Clear();lengthOptions.Populate (2,3,1); // 3 or 4
+    _HY_HBLCommandHelper.Insert    ((BaseRef)HY_HBL_COMMAND_GET_STRING, 
+                                    (long)_hyInitCommandExtras (_HY_ValidHBLExpressions.Insert ("GetString(", HY_HBL_COMMAND_GET_STRING,false),
+                                    -1, 
+                                    "GetString(<receptacle>,<object>,<index>,[optional <second index>])",
+                                        ',',
+                                        true,
+                                        false,
+                                        false,
+                                        &lengthOptions));
+                                        
+
+    lengthOptions.Clear();lengthOptions.Populate (2,3,1); // 3 or 4
+    _HY_HBLCommandHelper.Insert    ((BaseRef)HY_HBL_COMMAND_DIFFERENTIATE, 
+                                    (long)_hyInitCommandExtras (_HY_ValidHBLExpressions.Insert ("Differentiate(", HY_HBL_COMMAND_DIFFERENTIATE,false),
+                                    -1, 
+                                    "Differentiate(<receptacle>, <the expression to differentiate>, <variable to differentiate>[, number of times, default = 1])",
+                                    ',',
+                                    true,
+                                    false,
+                                    false,
+                                    &lengthOptions));
+                                        
+// matrix global arrays
+
+
+    _HY_MatrixRandomValidPDFs.Insert ("Dirichlet", _HY_MATRIX_RANDOM_DIRICHLET);
+    _HY_MatrixRandomValidPDFs.Insert ("Gaussian", _HY_MATRIX_RANDOM_GAUSSIAN);
+    _HY_MatrixRandomValidPDFs.Insert ("Wishart", _HY_MATRIX_RANDOM_WISHART);
+    _HY_MatrixRandomValidPDFs.Insert ("InverseWishart", _HY_MATRIX_RANDOM_INVERSE_WISHART);
+    _HY_MatrixRandomValidPDFs.Insert ("Multinomial", _HY_MATRIX_RANDOM_MULTINOMIAL);
+
+
+}
+
+//____________________________________________________________________________________
+void         InsertVarIDsInList     (_AssociativeList* theList , _String theKey, _SimpleList& varIDs)
+{
+    _FString arrayKey (theKey, false);
+    _Matrix *mxEntry = nil;
+
+    if (varIDs.lLength) {
+        _List     varNames;
+        for (unsigned long i=0; i < varIDs.lLength; i++) {
+            _Variable* v = LocateVar (varIDs.lData[i]);
+            if (v) {
+                varNames << v->GetName();
+            }
+        }
+        mxEntry = new _Matrix (varNames);
+    } else {
+        mxEntry = new _Matrix;
+    }
+
+    checkPointer (mxEntry);
+    theList->MStore (&arrayKey,mxEntry,false);
+}
+
+//____________________________________________________________________________________
+void         InsertStringListIntoAVL    (_AssociativeList* theList , _String theKey, _SimpleList& stringsToPick, _List& theStrings)
+{
+    _FString arrayKey (theKey, false);
+    _Matrix *mxEntry = nil;
+
+    if (stringsToPick.lLength) {
+        _List     theNames;
+        for (unsigned long i=0; i < stringsToPick.lLength; i++) {
+            _String * v = (_String*)theStrings (stringsToPick.lData[i]);
+            if (v) {
+                theNames << v;
+            }
+        }
+        mxEntry = new _Matrix (theNames);
+    } else {
+        mxEntry = new _Matrix;
+    }
+
+    checkPointer (mxEntry);
+    theList->MStore (&arrayKey,mxEntry,false);
+}
+
+
+//____________________________________________________________________________________
+
+_Matrix *   CheckMatrixArg          (_String* mxName, bool onlyStrings)
+{
+    _Variable * mVar = FetchVar (LocateVarByName (*mxName));
+    if (mVar && mVar->ObjectClass() == MATRIX) {
+        _Matrix * mx = (_Matrix*)mVar->GetValue();
+        if (onlyStrings && (!mx->IsAStringMatrix())) {
+            return nil;
+        }
+        return mx;
+    }
+    return nil;
+}
+
+//____________________________________________________________________________________
+
+_AssociativeList *   CheckAssociativeListArg (_String* mxName)
+{
+    _Variable * mVar = FetchVar (LocateVarByName (*mxName));
+    if (mVar && mVar->ObjectClass() == ASSOCIATIVE_LIST) {
+        return (_AssociativeList*)mVar->GetValue();
+    }
+    return nil;
+}
+
+
+//____________________________________________________________________________________
+
+bool    _ElementaryCommand::ConstructDoSQL (_String&source, _ExecutionList&target)
+// syntax: DoSQL (dbID,action string|file name,<callback ID>)
+{
+    _List pieces;
+    ExtractConditions (source,blDoSQL.sLength,pieces,',');
+    if (pieces.lLength!=3) {
+        WarnError (_String ("Expected syntax:")& blDoSQL &"(dbID|" & sqlOpen & '|' & sqlClose & ",transaction string|file name,callback ID for an SQL transaction|where to store DB numeric ID)");
+        return false;
+    }
+
+    _ElementaryCommand * dsql = new _ElementaryCommand (53);
+    dsql->addAndClean(target,&pieces,0);
+    return true;
+}
+
+//____________________________________________________________________________________
+
+bool    _ElementaryCommand::ConstructProfileStatement (_String&source, _ExecutionList&target)
+// syntax: #profile START|PAUSE|RESUME|indetifier to dump in
+{
+
+    _List pieces;
+    ExtractConditions (source,blHBLProfile.sLength+1,pieces,';');
+    if (pieces.lLength!=2) {
+        WarnError (_String ("Expected syntax:")& blHBLProfile &" START|PAUSE|RESUME|where to store)");
+        return false;
+    }
+
+    _ElementaryCommand *sp = new _ElementaryCommand (58);
+    sp->addAndClean(target,&pieces,0);
+    return true;
+}
+
+
+//____________________________________________________________________________________
+
+int  _HYSQLCallBack (void* exL,int cc, char** rd, char** cn)
+{
+    _ExecutionList * exList = (_ExecutionList *)exL;
+
+    if (!terminateExecution)
+        if (exList && cc && exList->lLength) {
+            _List     rowData,
+                      columnNames;
+
+            for (long cnt = 0; cnt < cc; cnt++) {
+                if (rd[cnt]) {
+                    rowData.AppendNewInstance (new _String (rd[cnt]));
+                } else {
+                    rowData.AppendNewInstance (new _String);
+                }
+
+                if (cn[cnt]) {
+                    columnNames.AppendNewInstance (new _String (cn[cnt]));
+                } else {
+                    columnNames.AppendNewInstance (new _String);
+                }
+            }
+
+
+            _Matrix * rowDataM     = new _Matrix (rowData),
+            * columnNamesM = new _Matrix (columnNames);
+
+            if (!(rowDataM && columnNamesM)) {
+                checkPointer (nil);
+            }
+
+            _Variable* rdv = CheckReceptacle (&sqlRowData, blDoSQL,false),
+                       * cnv = CheckReceptacle (&sqlColNames, blDoSQL,false);
+
+            rdv->SetValue (rowDataM,false);
+            cnv->SetValue (columnNamesM,false);
+
+            exList->Execute();
+
+        }
+    return 0;
+}
+
+//____________________________________________________________________________________
+/*
+int  _HYSQLBusyCallBack (void* data, int callCount)
+{
+    if (callCount > 100)
+        return 0;
+
+#ifdef __WINDOZE__
+    Sleep  (1 + genrand_real2()*100.);
+#else
+    usleep (100 + genrand_real2()*100000.);
+#endif
+    return 1;
+}*/
+
+
+//____________________________________________________________________________________
+
+void      _ElementaryCommand::ExecuteDataFilterCases (_ExecutionList& chain)
+{
+    chain.currentCommand++;
+
+    _String dataObjectID = chain.AddNameSpaceToID(*(_String*)parameters(1));
+    
+    long dsID           = (parameters.lLength>2)?FindDataSetName (dataObjectID):-1;
+    bool isFilter       = false;
+
+    if (dsID == -1) {
+        dsID = (parameters.lLength>2)?FindDataSetFilterName (dataObjectID):-1;
+        if (dsID == -1) {
+            _AssociativeList * numericFilter = (_AssociativeList*)FetchObjectFromVariableByType(&dataObjectID, ASSOCIATIVE_LIST);
+            if (numericFilter) {
+                _String errCode;
+
+                long    categoryCount = 1;
+
+                if (parameters.lLength > 2)
+                    // have multiple categories
+                {
+                    categoryCount = (long) ProcessNumericArgument((_String*)parameters(2),nil);
+                }
+
+                _String namesKey ("FILTER_NAMES"),
+                        dataKey  ("FILTER_ARRAYS"),
+                        freqKey  ("FILTER_FREQS");
+
+                _Matrix* sequenceNames = (_Matrix*)numericFilter->GetByKey (namesKey,MATRIX);
+                _List seqNames;
+                if (sequenceNames) {
+                    sequenceNames->FillInList (seqNames);
+                }
+                if (!sequenceNames || seqNames.lLength == 0) {
+                    errCode = _String("Expected a non-empty string matrix as the ") & namesKey & " argument in call to CreateFilter";
+                } else {
+                    _AssociativeList * dataList = (_AssociativeList*)numericFilter->GetByKey (dataKey,ASSOCIATIVE_LIST);
+                    _Matrix          * freqList = (_Matrix*)numericFilter->GetByKey (freqKey,MATRIX);
+
+                    if (dataList && freqList) {
+                        _List       goodSeqs;
+                        long        sitePatterns    = freqList->GetVDim(),
+                                    categDim      = -1;
+
+                        if (freqList->GetHDim() != 1 || sitePatterns < 1 || freqList->MatrixType() != 1 ) {
+                            errCode = _String("Expected a non-empty numeric ROW matrix as the ") & freqKey & " argument in call to CreateFilter";
+                        } else {
+                            for (long k=0; k<seqNames.lLength; k=k+1) {
+                                _Matrix * dataMx = (_Matrix*)dataList->GetByKey (k,MATRIX);
+                                if (dataMx && dataMx->MatrixType() == 1 ) {
+                                    if (categDim < 0) {
+                                        categDim = dataMx->GetVDim();
+                                        if (categDim < 1) {
+                                            break;
+                                        }
+                                    } else if (dataMx->GetVDim() != categDim) {
+                                        break;
+                                    }
+                                    if (dataMx->GetHDim () != sitePatterns*categoryCount) {
+                                        break;
+                                    }
+
+                                    goodSeqs << dataMx;
+                                    continue;
+                                }
+                                break;
+                            }
+
+                            if (goodSeqs.lLength == seqNames.lLength) {
+                                _DataSet * dummyDS = new _DataSet;
+                                dummyDS->SetNoSpecies (seqNames.lLength);
+                                dummyDS->GetNames().Duplicate (&seqNames);
+                                dummyDS->GetTheMap().Populate (sitePatterns,0,1);
+                                errCode = (*(_String*)parameters(0)) & "_internal_ds";
+                                dsID = FindDataSetName (errCode);
+                                if (dsID < 0) {
+                                    dataSetList         <<dummyDS;
+                                    DeleteObject        (dummyDS);
+                                    dataSetNamesList&&  &errCode;
+                                } else {
+                                    dataSetList.Replace (dsID,dummyDS,false);
+                                }
+
+                                errCode = (*(_String*)parameters(0));
+                                _DataSetFilterNumeric * dsn = new _DataSetFilterNumeric (freqList,goodSeqs,dummyDS,categoryCount);
+                                checkPointer (dsn);
+                                dsID    = FindDataSetFilterName (errCode);
+
+                                if (dsID < 0) {
+                                    dataSetFilterList<<  dsn;
+                                    DeleteObject        (dsn);
+                                    dataSetFilterNamesList&& & errCode;
+                                } else {
+                                    dataSetFilterList.Replace (dsID,dsn,false);
+                                }
+                                return;
+
+                            } else {
+                                errCode = _String ("Site frequency patterns/numeric vectors did not pass dimension checks in call to CreateFilter");
+                            }
+                        }
+                    }
+
+                }
+                if (errCode) {
+                    WarnError(errCode);
+                    return;
+                }
+
+            }
+            _String errMsg = (((_String)("DataSet(Filter)/Associative Array ")&dataObjectID&_String(" has not been properly initialized")));
+            WarnError (errMsg);
+            return;
+        }
+        isFilter = true;
+    }
+
+    // build the formula from the 2nd parameter (unit size)
+
+    char                unit = ProcessNumericArgument((_String*)parameters(2),chain.nameSpacePrefix);
+    // here's our unit
+
+    _String             dataFilterID (chain.AddNameSpaceToID(*(_String*)parameters(0))),
+                        hSpecs,
+                        vSpecs;
+
+    long                status  = FindDataSetFilterName (dataFilterID);
+
+    _DataSetFilter      *thedf;
+
+    if (status!=-1) {
+        thedf = (_DataSetFilter*)dataSetFilterList (status);
+    } else {
+        thedf               = new _DataSetFilter();
+        checkPointer        (thedf);
+        AddFilterToList     (dataFilterID,thedf,false);
+    }
+
+    if (parameters.lLength>3) {
+        vSpecs = *(_String*)parameters(3);
+    }
+    if (parameters.lLength>4) {
+        hSpecs = *(_String*)parameters(4);
+    } else {
+        hSpecs = empty;
+    }
+
+    _DataSet            *dataset;
+
+    _SimpleList         hL,
+                        vL;
+
+    hL.RequestSpace (1024);
+    vL.RequestSpace (1024);
+
+    if (!isFilter) {
+        dataset = (_DataSet*)dataSetList(dsID);
+        dataset -> ProcessPartition (hSpecs,hL,false);
+        if (code!=6 && vSpecs.sLength==0) {
+            vSpecs = _String("0-")&_String(dataset->NoOfColumns()-1);
+        }
+        dataset->ProcessPartition (vSpecs,vL,true);
+    } else {
+        _DataSetFilter * dataset1 = (_DataSetFilter*)dataSetFilterList(dsID);
+        dataset1->GetData()->ProcessPartition (hSpecs,hL,false, &dataset1->theNodeMap, &dataset1->theOriginalOrder);
+
+        if (code!=6 && vSpecs.sLength==0) {
+            vSpecs = _String("0-")&_String(dataset1->GetFullLengthSpecies()-1);
+        }
+
+        dataset1->GetData()->ProcessPartition (vSpecs,vL,true,  &dataset1->theOriginalOrder, &dataset1->theNodeMap);
+        dataset = (_DataSet*)dataset1;
+    }
+
+    if (code!=6) {
+        if (vL.lLength%unit) {
+            vSpecs = (_String)"Unit size of "& unit & " doesn't divide the length of specified partition in call to ";
+            if (code==27) { // Permute
+                vSpecs = vSpecs & "Permute";
+            } else {
+                vSpecs = vSpecs & "Bootstrap";
+            }
+
+            vSpecs = vSpecs & ". The partition has been trimmed at the end.";
+            ReportWarning (vSpecs);
+            for (status = vL.lLength%unit; status>0; status--) {
+                vL.Delete (vL.lLength-1);
+            }
+        }
+        if (code == 27) {
+            vL.Permute (unit);
+        } else {
+            vL.PermuteWithReplacement(unit);
+        }
+
+    }
+
+    thedf->SetFilter (dataset, unit, hL, vL, isFilter);
+
+    if (parameters.lLength>5) {
+        hSpecs = GetStringFromFormula((_String*)parameters(5),chain.nameSpacePrefix);
+        thedf->SetExclusions(&hSpecs);
+    } else if ((code!=6)&&isFilter) {
+        _DataSetFilter * df1 = (_DataSetFilter*)dataSetFilterList(dsID);
+        if (df1->theExclusions.lLength) {
+            thedf->theExclusions.Duplicate (&df1->theExclusions);
+            thedf->SetDimensions();
+        }
+    }
+
+    thedf->SetDimensions();
+    thedf->SetupConversion();
+
+    SetDataFilterParameters (dataFilterID, thedf, true);
+}
+//____________________________________________________________________________________
+
+void      _ElementaryCommand::ExecuteCase21 (_ExecutionList& chain)
+{
+    chain.currentCommand++;
+
+    SetStatusLine (_hyStatusConditionProbsMatrix);
+    _String errMsg,
+            objectName    =     chain.AddNameSpaceToID(*(_String*)parameters(1)),
+            resultID      =     chain.AddNameSpaceToID(*(_String*)parameters(0));
+
+    long objectID         =     FindLikeFuncName (objectName, true);
+    _PMathObj ob          =     nil;
+
+    if (objectID >=0) { // likelihood function
+        _Matrix * partitionList         = nil;
+        if (parameters.lLength>3) {
+            _String  secondArg = *(_String*)parameters(3);
+            partitionList = (_Matrix*)ProcessAnArgumentByType (&secondArg, chain.nameSpacePrefix, MATRIX);
+        }
+        _SimpleList                     partsToDo;
+        _LikelihoodFunction*            lf = (_LikelihoodFunction*)likeFuncList(objectID);
+        if (lf->ProcessPartitionList(partsToDo, partitionList, _hyStatusConditionProbsMatrix)) {
+            char runMode = _hyphyLFConstructCategoryMatrixConditionals;
+            if (parameters.lLength > 2) {
+                if (((_String*)parameters(2))->Equal(&completeFlag)) {
+                    runMode = _hyphyLFConstructCategoryMatrixConditionals;
+                } else if (((_String*)parameters(2))->Equal(&conditionalWeights)) {
+                    runMode = _hyphyLFConstructCategoryMatrixWeights;
+                } else if (((_String*)parameters(2))->Equal(&siteProbabilities)) {
+                    runMode = _hyphyLFConstructCategoryMatrixSiteProbabilities;
+                } else {
+                    runMode = _hyphyLFConstructCategoryMatrixClasses;
+                }
+            }
+            ob = lf->ConstructCategoryMatrix(partsToDo,runMode,true, &resultID);
+        }
+    } else {
+        _TheTree * testTree = (_TheTree*) FetchObjectFromVariableByType (&objectName, TREE);
+        if (testTree) {
+            long    pid = 0;
+            objectID = testTree->IsLinkedToALF (pid);
+            if (objectID >= 0) {
+                _LikelihoodFunction * anLF      = (_LikelihoodFunction*) likeFuncList (objectID);
+                _DataSetFilter      * dsf       = (_DataSetFilter*) dataSetFilterList (anLF->GetTheFilters()(pid));
+                anLF->PrepareToCompute();
+                anLF->Compute         ();
+                objectID                        = dsf->NumberDistinctSites();
+
+                _Matrix             *condMx     = new _Matrix   (2*objectID*(testTree->GetLeafCount()
+                        + testTree->GetINodeCount()) * testTree->categoryCount,
+                        testTree->GetCodeBase(),
+                        false, true);
+                _List               leafNames,
+                                    inodeNames;
+
+                testTree->DepthWiseT(true);
+
+                while (testTree->currentNode) {
+                    _String       * bs = new _String;
+                    testTree->GetNodeName  (testTree->currentNode, *bs);
+                    if (testTree->IsCurrentNodeATip()) {
+                        leafNames << bs;
+                    } else {
+                        inodeNames << bs;
+                    }
+                    DeleteObject (bs);
+                    testTree->DepthWiseT(false);
+                }
+
+                leafNames << inodeNames;
+
+                _Matrix  *nodeNames = new _Matrix (leafNames);
+
+                for (long siteC = 0; siteC < objectID; siteC ++) {
+                    testTree->RecoverNodeSupportStates (dsf,siteC,siteC-1,*condMx);
+                }
+
+                anLF->DoneComputing   ();
+                _AssociativeList *retMe = new _AssociativeList;
+                retMe->MStore ("Nodes",nodeNames,false);
+                retMe->MStore ("Values",condMx,false);
+                ob = retMe;
+            }
+        }
+    }
+
+    if (ob) {
+        CheckReceptacleAndStore (&resultID, blConstructCM, true, ob, false);
+    } else {
+        WarnError (objectName & " must be either a likelihood function or a tree variable tied to a likelihood function.");
+    }
+
+}
+
+
+//____________________________________________________________________________________
+
+void      _ElementaryCommand::ExecuteCase53 (_ExecutionList& chain)
+{
+    chain.currentCommand++;
+
+#ifdef __HYPHY_NO_SQLITE__
+    _String errStr ("SQLite commands can not be used in a HyPhy version built with the __HYPHY_NO_SQLITE__ flag");
+    WarnError (errStr);
+#else
+
+    _String arg1  (*(_String*)parameters(0));
+
+    char  * errMsg = nil;
+    _String errStr;
+
+    if (arg1.Equal (&sqlOpen)) {
+        _Variable * dbVar = CheckReceptacle ((_String*)parameters(2), blDoSQL);
+
+        if (dbVar) {
+            _String arg2 (*(_String*)parameters(1));
+            arg2.ProcessFileName(true,true,(Ptr)chain.nameSpacePrefix);
+            int errCode  = SQLITE_OK;
+            sqlite3 *aDB = nil;
+#ifdef __HYPHYXCODE__
+            errCode = sqlite3_open (DoMacToPOSIX(arg2).getStr(),&aDB);
+#else
+            errCode = sqlite3_open (arg2.sData,&aDB);
+#endif
+            if (errCode == SQLITE_OK) {
+                errCode = sqlite3_exec(aDB, "SELECT COUNT(*) FROM sqlite_master", _HYSQLCallBack, nil, nil);
+            }
+            if (errCode != SQLITE_OK) {
+                WarnError (sqlite3_errmsg(aDB));
+                sqlite3_close(aDB);
+                return;
+            } else {
+                long f = sqlDatabases.Find (0);
+                if (f<0) {
+                    f = sqlDatabases.lLength;
+                    sqlDatabases << (long)aDB;
+                } else {
+                    sqlDatabases.lData[f] = (long)aDB;
+                }
+
+                sqlite3_busy_timeout (aDB, 5000);
+
+                dbVar->SetValue (new _Constant (f), false);
+            }
+        }
+    } else {
+        bool doClose =  arg1.Equal (&sqlClose);
+
+        long dbIdx = ProcessNumericArgument (doClose?(_String*)parameters(2):&arg1,chain.nameSpacePrefix);
+
+        if (dbIdx<0 || dbIdx >= sqlDatabases.lLength || sqlDatabases.lData[dbIdx] == 0) {
+            errStr = _String(dbIdx) & " is an invalid database index";
+        } else {
+            if (doClose) {
+                sqlite3_close ((sqlite3*)sqlDatabases.lData[dbIdx]);
+                sqlDatabases.lData[dbIdx] = 0;
+            } else {
+                _String arg3 (ProcessLiteralArgument((_String*)parameters(2),chain.nameSpacePrefix));
+
+                _ExecutionList sqlProcessor (arg3,chain.nameSpacePrefix?(chain.nameSpacePrefix->GetName()):nil);
+                if (!terminateExecution) {
+                    _String arg2 (ProcessLiteralArgument ((_String*)parameters(1),chain.nameSpacePrefix));
+
+                    if (sqlite3_exec((sqlite3*)sqlDatabases.lData[dbIdx], arg2.sData, _HYSQLCallBack, (Ptr)&sqlProcessor, &errMsg) != SQLITE_OK) {
+                        WarnError (sqlite3_errmsg((sqlite3*)sqlDatabases.lData[dbIdx]));
+                        return;
+                    }
+                }
+            }
+        }
+
+    }
+
+    if (errStr.sLength) {
+        errStr = errStr & " in call to DoSQL";
+        WarnError (errStr);
+    }
+
+#endif
+}
+
+//____________________________________________________________________________________
+
+void      _ElementaryCommand::ExecuteCase54 (_ExecutionList& chain)
+{
+    chain.currentCommand++;
+
+    SetStatusLine (_String("Constructing Topology ")&*(_String*)parameters(0));
+
+    _String  *treeSpec = ((_String*)parameters(1));
+    treeSpec->ProcessParameter();
+    _TreeTopology * tr = nil;
+
+    if (treeSpec->sLength) {
+        if (treeSpec->sData[0]!='(') {
+            _Variable* testTree = FetchVar(LocateVarByName (AppendContainerName(*treeSpec,chain.nameSpacePrefix)));
+            if (testTree && testTree->ObjectClass () == TREE) {
+                tr = new _TreeTopology ((_TheTree*)testTree);
+            } else {
+                _String   flaData (*treeSpec);
+                _Formula  nameForm (flaData,chain.nameSpacePrefix);
+                _PMathObj formRes = nameForm.Compute();
+                if (formRes&&formRes->ObjectClass () == STRING)
+                    tr = new _TreeTopology (AppendContainerName(*(_String*)parameters(0),chain.nameSpacePrefix),
+                                            *((_FString*)formRes)->theString,
+                                            false);
+            }
+        } else
+            tr = new _TreeTopology (AppendContainerName(*(_String*)parameters(0),chain.nameSpacePrefix),
+                                    *(_String*)parameters(1),false);
+    }
+
+    if (!tr) {
+        WarnError ("Illegal right hand side in call to Topology id = ...; it must be a string, a Newick tree spec or a topology");
+    }
+}
+
+
+//____________________________________________________________________________________
+
+bool    _ElementaryCommand::ConstructAlignSequences (_String&source, _ExecutionList&target)
+// syntax: AlignSequences (result, input string matrix,  options matrix)
+{
+    _List pieces;
+    ExtractConditions (source,blAlignSequences.sLength,pieces,',');
+    if (pieces.lLength!=3) {
+        WarnError ("Expected syntax: AlignSequences(result, input string matrix, options list);");
+        return false;
+    }
+
+    _ElementaryCommand * as = new _ElementaryCommand (55);
+    as->addAndClean(target,&pieces,0);
+    return true;
+}
+
+//____________________________________________________________________________________
+
+bool    _ElementaryCommand::ConstructGetNeutralNull (_String&source, _ExecutionList&target)
+// syntax: GetNeutralNull (result, likelihood function, syn sub count matrix, non-syn sub count matrix, iterations per root state)
+{
+    _List pieces;
+    ExtractConditions (source,blGetNeutralNull.sLength,pieces,',');
+    if (pieces.lLength!=5) {
+        WarnError ("Expected syntax: GetNeutralNull (result, likelihood function, syn sub count matrix, non-syn sub count matrix, iterations per root state);");
+        return false;
+    }
+
+    _ElementaryCommand * gnn = new _ElementaryCommand (57);
+    gnn->addAndClean(target,&pieces,0);
+    return true;
+}
+
+//____________________________________________________________________________________
+
+void      _ElementaryCommand::ExecuteCase55 (_ExecutionList& chain)
+{
+    chain.currentCommand++;
+
+    _String errStr;
+
+    _Variable * storeResultIn = CheckReceptacle (&AppendContainerName(*(_String*)parameters(0),chain.nameSpacePrefix), blAlignSequences, true);
+
+    if (storeResultIn) {
+        _Matrix * inStrings = CheckMatrixArg (&AppendContainerName(*(_String*)parameters(1),chain.nameSpacePrefix),true);
+        if (inStrings && (inStrings->GetHDim()==1||inStrings->GetVDim()==1)) {
+            _AssociativeList * mappingTable = CheckAssociativeListArg (&AppendContainerName(*(_String*)parameters(2),chain.nameSpacePrefix));
+            if (mappingTable) {
+                // check for required parameters
+
+                _FString * charVector = (_FString*)mappingTable->GetByKey (seqAlignMap, STRING);
+
+                long       charCount = 0;
+
+                _SimpleList ccount (256,-1,0);
+
+                if (charVector) {
+                    for (long cc = 0; cc < charVector->theString->sLength; cc++)
+                        if (ccount.lData[(unsigned char)charVector->theString->sData[cc]]>=0) {
+                            charCount = 0; // this is an error condition for
+                            // duplicate characters in the string
+                            break;
+                        } else {
+                            ccount.lData[(unsigned char)charVector->theString->sData[cc]] = cc;
+                            charCount ++;
+                        }
+                }
+
+                if (charVector && charCount) {
+                    // now check that all characters
+                    bool        doLocal      = false,
+                                doAffine     = false,
+                                doLinear     = true,
+                                doCodon      = false,
+                                doFullLocal  = false;
+
+
+                    long        codonCount = charCount*charCount*charCount;
+
+                    _PMathObj   c = mappingTable->GetByKey (seqAlignCodonAlign, NUMBER);
+                    if (c) {
+                        doCodon = c->Compute()->Value() > 0.5;
+                    }
+
+
+                    _Matrix * scoreMatrix = (_Matrix*)mappingTable->GetByKey (seqAlignScore, MATRIX);
+                    if (scoreMatrix && scoreMatrix->GetHDim () == (doCodon?codonCount+1:charCount) && scoreMatrix->GetVDim () == scoreMatrix->GetHDim ()) {
+                        scoreMatrix = (_Matrix*)scoreMatrix->ComputeNumeric();
+                        scoreMatrix->CheckIfSparseEnough(true);
+
+                        char        gapCharacter = '-';
+                        _FString    *gapC = (_FString*)mappingTable->GetByKey (seqAlignGapChar, STRING);
+
+                        _Matrix     *codon3x5 = nil,
+                                    *codon3x4 = nil,
+                                    *codon3x2 = nil,
+                                    *codon3x1 = nil;
+
+                        if (doCodon) {
+                            codon3x5 = (_Matrix*)mappingTable->GetByKey (seqAlignGapCodon3x5, MATRIX);
+                            codon3x4 = (_Matrix*)mappingTable->GetByKey (seqAlignGapCodon3x4, MATRIX);
+                            codon3x2 = (_Matrix*)mappingTable->GetByKey (seqAlignGapCodon3x2, MATRIX);
+                            codon3x1 = (_Matrix*)mappingTable->GetByKey (seqAlignGapCodon3x1, MATRIX);
+                            if ( codon3x5 && codon3x4 && codon3x2 && codon3x1
+                              && codon3x5->GetHDim() == codonCount+1
+                              && codon3x4->GetHDim() == codonCount+1
+                              && codon3x2->GetHDim() == codonCount+1
+                              && codon3x1->GetHDim() == codonCount+1
+                              && codon3x5->GetVDim() == charCount*charCount*charCount*10
+                              && codon3x4->GetVDim() == charCount*charCount*charCount*4
+                              && codon3x2->GetVDim() == charCount*charCount*3
+                              && codon3x1->GetVDim() == charCount*3) {
+                                codon3x5 = (_Matrix*)codon3x5->ComputeNumeric();
+                                codon3x5 -> CheckIfSparseEnough(true);
+                                codon3x4 = (_Matrix*)codon3x4->ComputeNumeric();
+                                codon3x4 -> CheckIfSparseEnough(true);
+                                codon3x2 = (_Matrix*)codon3x2->ComputeNumeric();
+                                codon3x2 -> CheckIfSparseEnough(true);
+                                codon3x1 = (_Matrix*)codon3x1->ComputeNumeric();
+                                codon3x1-> CheckIfSparseEnough(true);
+                            } else {
+                                errStr = ( seqAlignGapCodon3x5 & ", "
+                                         & seqAlignGapCodon3x4 & ", "
+                                         & seqAlignGapCodon3x2 & ", or "
+                                         & seqAlignGapCodon3x1 & " matrices are missing or have incorrect dimensions" );
+                            }
+
+                        }
+
+                        if (errStr.sLength == 0) {
+                            _String     settingReport (128L,true);
+
+                            settingReport << "Running sequence alignment with the following options:";
+
+                            if (gapC && gapC->theString->sLength == 1) {
+                                gapCharacter = gapC->theString->sData[0];
+                            }
+
+                            settingReport << "\n\tGap character:";
+                            settingReport << gapCharacter;
+
+                            _Parameter  gapOpen       = 15.,
+                                        gapOpen2      = 15.,
+                                        gapExtend     = 1.,
+                                        gapExtend2    = 1.,
+                                        gapFrameshift = 50.;
+
+
+
+
+                            c = mappingTable->GetByKey (seqAlignGapOpen, NUMBER);
+                            if (c) {
+                                gapOpen = c->Compute()->Value();
+                            }
+
+                            settingReport << "\n\tGap open cost:";
+                            settingReport << _String (gapOpen);
+
+                            gapOpen2 = gapOpen;
+                            c = mappingTable->GetByKey (seqAlignGapOpen2, NUMBER);
+                            if (c) {
+                                gapOpen2 = c->Compute()->Value();
+                            }
+
+                            settingReport << "\n\tGap open cost 2:";
+                            settingReport << _String (gapOpen2);
+
+                            c = mappingTable->GetByKey (seqAlignGapExtend, NUMBER);
+                            if (c) {
+                                gapExtend = c->Compute()->Value();
+                            }
+
+                            settingReport << "\n\tGap extend cost:";
+                            settingReport << _String (gapExtend);
+
+                            gapExtend2 = gapExtend;
+                            c = mappingTable->GetByKey (seqAlignGapExtend2, NUMBER);
+                            if (c) {
+                                gapExtend2 = c->Compute()->Value();
+                            }
+
+                            settingReport << "\n\tGap extend cost 2:";
+                            settingReport << _String (gapExtend2);
+
+                            c = mappingTable->GetByKey (seqAlignFrameShift, NUMBER);
+                            if (c) {
+                                gapFrameshift = c->Compute()->Value();
+                            }
+
+                            settingReport << "\n\tCodon frameshift cost:";
+                            settingReport << _String (gapFrameshift);
+
+
+                            c = mappingTable->GetByKey (seqAlignGapLocal, NUMBER);
+                            if (c) {
+                                doLocal = c->Compute()->Value() > 0.5;
+                            }
+
+                            settingReport << "\n\tIgnore terminal gaps: ";
+                            settingReport << (doLocal?"Yes":"No");
+
+                            settingReport << "\n\tUse codon alignment with frameshift routines: ";
+                            if (doCodon) {
+                                for (long i = 0; i < 256; i++)
+                                    if (ccount.lData[i] < 0) {
+                                        ccount.lData[i] = -codonCount - 1;
+                                    }
+                                settingReport << "Yes";
+                                doLinear = false;
+
+                                settingReport << "\n\t Linear space routines  are not implemented";
+                            } else {
+                                settingReport << "No";
+                            }
+                            
+                            c = mappingTable->GetByKey (seqAlignDoLocal, NUMBER);
+                            if (c) {
+                                doFullLocal = c->Compute()->Value ()>0.5;
+                            }
+                            settingReport << "\n\tLocal alignment: ";
+                            settingReport << (doFullLocal?"Yes":"No");
+                            if (!doCodon && doFullLocal) {
+                                 settingReport << "\n\t Local alignment is currently available for the codon aligner only.";                           
+                            }
+
+                            c = mappingTable->GetByKey (seqAlignGapAffine, NUMBER);
+                            if (c) {
+                                doAffine = c->Compute()->Value() > 0.5;
+                            }
+                            settingReport << "\n\tAffine gap costs: ";
+                            settingReport << (doAffine?"Yes":"No");
+
+                            c = mappingTable->GetByKey (seqAlignGapLinearSpace, NUMBER);
+                            if (c) {
+                                doLinear = c->Compute()->Value() > 0.5;
+                            }
+
+                            settingReport << "\n\tUse linear space routines: ";
+                            settingReport << (doLinear?"Yes":"No");
+
+                            settingReport.Finalize();
+                            ReportWarning (settingReport);
+
+                            long stringCount = inStrings->GetHDim() * inStrings->GetVDim();
+
+                            _AssociativeList *alignedStrings = new _AssociativeList;
+                            checkPointer (alignedStrings);
+
+
+                            for (long s1 = 0; s1 < stringCount; s1++) {
+                                _String*  str1 = ((_FString*)inStrings->GetFormula(0,s1)->Compute())->theString;
+                                if (!str1) {
+                                    errStr = _String("The ") & (s1+1) & "-th argument is not a string";
+                                    break;
+                                }
+                                for (long s2 = s1+1; s2 < stringCount; s2++) {
+                                    _String       *string2 = ((_FString*)inStrings->GetFormula(0,s2)->Compute())->theString;
+                                    if (!string2) {
+                                        errStr = _String("The ") & (s2+1) & "-th argument is not a string";
+                                        break;
+                                    }
+                                    _AssociativeList * pairwiseComp = new _AssociativeList;
+                                    checkPointer (pairwiseComp);
+
+                                    _Parameter    score = 0.0;
+
+                                    if (doLinear == false) {
+                                        char * str1r = NULL,
+                                             * str2r = NULL;
+                                        _List         store;
+                                        score = AlignStrings (str1->sData,string2->sData,str1r,str2r,ccount.lData,scoreMatrix->theData,scoreMatrix->GetVDim(),
+                                                              gapCharacter,gapOpen,gapExtend,gapOpen2,gapExtend2,gapFrameshift,doLocal,doAffine,doCodon,
+                                                              charCount, codon3x5->theData, codon3x4->theData, codon3x2->theData, codon3x1->theData, doFullLocal);
+
+                                        if ( str1r && str2r ) {
+                                            _String * r_res = ( _String * ) checkPointer( new _String( str1r ) ),
+                                                    * q_res = ( _String * ) checkPointer( new _String( str2r ) );
+                                            delete [] str1r;
+                                            delete [] str2r;
+                                            r_res->Finalize();
+                                            q_res->Finalize();
+                                            store.AppendNewInstance( r_res );
+                                            store.AppendNewInstance( q_res );
+                                        } else
+                                            WarnError( "Internal Error in AlignStrings" );
+
+                                        store.bumpNInst();
+
+                                        if (store.lLength == 0) {
+                                            errStr = "Unspecified error in AlignStrings";
+                                            DeleteObject (pairwiseComp);
+                                            s1 = stringCount;
+                                            break;
+                                        } else {
+                                            pairwiseComp->MStore ("1", new _FString((_String*)store(0)), false);
+                                            pairwiseComp->MStore ("2", new _FString((_String*)store(1)), false);
+                                        }
+                                    } else {
+                                        _Matrix       scoreM        (string2->sLength+1,1,false,true),
+                                                      scoreM2       (string2->sLength+1,1,false,true),
+                                                      gap1Matrix    (string2->sLength+1,1,false,true),
+                                                      gap2Matrix    (string2->sLength+1,1,false,true),
+                                                      gap1Matrix2   (string2->sLength+1,1,false,true),
+                                                      gap2Matrix2   (string2->sLength+1,1,false,true),
+                                                      *buffers[6];
+
+                                        char          *alignmentRoute = new char[2*(string2->sLength+1)];
+
+                                        alignmentRoute[0] = alignmentRoute[string2->sLength+1] = 0;
+                                        buffers[0] = &scoreM;
+                                        buffers[1] = &gap1Matrix;
+                                        buffers[2] = &gap2Matrix;
+                                        buffers[3] = &scoreM2;
+                                        buffers[4] = &gap1Matrix2;
+                                        buffers[5] = &gap2Matrix2;
+                                        _SimpleList ops (str1->sLength+2,-2,0);
+                                        ops.lData[str1->sLength+1] = string2->sLength;
+                                        ops.lData[0]               = -1;
+
+                                        score = LinearSpaceAlign(str1,string2,ccount,scoreMatrix,
+                                                                 gapOpen,gapExtend,gapOpen2,gapExtend2,
+                                                                 doLocal,doAffine,ops,score,0,
+                                                                 str1->sLength,0,string2->sLength,buffers,0,alignmentRoute);
+
+                                        delete[]    alignmentRoute;
+
+                                        _String     *result1 = new _String (str1->sLength+1, true),
+                                        *result2 = new _String (string2->sLength+1, true);
+
+                                        long        last_column     = ops.lData[ops.lLength-1];
+
+                                        for (long position = str1->sLength-1; position>=0; position--) {
+                                            long current_column     = ops.lData[position+1];
+
+                                            if (current_column<0) {
+                                                if (current_column == -2 /*|| (current_column == -3 && last_column == string2->sLength)*/) {
+                                                    current_column = last_column;
+                                                } else if (current_column == -3) {
+                                                    // find the next matched char or a -1
+                                                    long    p   = position,
+                                                            s2p;
+                                                    while ((ops.lData[p+1]) < -1) {
+                                                        p--;
+                                                    }
+
+                                                    s2p = ops.lData[p+1];
+                                                    //if (last_column == string2->sLength)
+                                                    //  last_column = string2->sLength-1;
+
+                                                    //if (s2p < 0)
+                                                    //  s2p = 0;
+
+                                                    for (long j = last_column-1; j>s2p;) {
+                                                        (*result1) << gapCharacter;
+                                                        (*result2) << string2->sData[j--];
+                                                    }
+
+                                                    last_column     = s2p+1;
+
+                                                    for (; position>p; position--) {
+                                                        (*result2) << gapCharacter;
+                                                        (*result1) << str1->sData[position];
+                                                    }
+                                                    position ++;
+                                                    continue;
+                                                } else {
+                                                    for (last_column--; last_column >=0; last_column--) {
+                                                        (*result1) << gapCharacter;
+                                                        (*result2) << string2->sData[last_column];
+                                                    }
+                                                    while (position>=0) {
+                                                        (*result1) << str1->sData[position--];
+                                                        (*result2) << gapCharacter;
+                                                    }
+                                                    break;
+                                                }
+                                            }
+
+                                            if (current_column == last_column) { // insert in sequence 2
+                                                (*result1) << str1->sData[position];
+                                                (*result2) << gapCharacter;
+                                            } else {
+                                                last_column--;
+
+                                                for (; last_column > current_column; last_column--) { // insert in column 1
+                                                    (*result2) << string2->sData[last_column];
+                                                    (*result1) << gapCharacter;
+                                                }
+                                                (*result1) << str1->sData[position];
+                                                (*result2) << string2->sData[current_column];
+                                            }
+                                            //printf ("%s\n%s\n", result1->sData, result2->sData);
+                                        }
+
+                                        for (last_column--; last_column >=0; last_column--) {
+                                            (*result1) << gapCharacter;
+                                            (*result2) << string2->sData[last_column];
+                                        }
+
+                                        result1->Finalize();
+                                        result1->Flip ();
+                                        result2->Finalize();
+                                        result2->Flip ();
+                                        pairwiseComp->MStore ("1", new _FString(result1), false);
+                                        pairwiseComp->MStore ("2", new _FString(result2), false);
+                                    }
+                                    /*
+                                    long gap1c = 0,
+                                         gap2c = 0;
+
+                                     _Parameter scoreCheck = 0.;
+
+                                     for (long sp = 0; sp<result1->sLength; sp++)
+                                     {
+                                         char cs1 = result1->sData[sp],
+                                              cs2 = result2->sData[sp];
+
+                                         if (cs1 == gapCharacter)
+                                         {
+                                             if (gap1c && doAffine)
+                                                 scoreCheck -= gapExtend;
+                                             else
+                                                 scoreCheck -= gapOpen;
+                                             gap2c = 0;
+                                             gap1c++;
+                                         }
+                                         else
+                                         if (cs2 == gapCharacter)
+                                         {
+                                             if (gap2c && doAffine)
+                                                 scoreCheck -= gapExtend2;
+                                             else
+                                                 scoreCheck -= gapOpen2;
+                                             gap1c = 0;
+                                             gap2c++;
+                                         }
+                                         else
+                                         {
+                                             gap1c = 0;
+                                             gap2c = 0;
+                                             long code1 = ccount.lData[cs1],
+                                                  code2 = ccount.lData[cs2];
+
+                                             if (code1 >=0 && code2 >=0 )
+                                                 scoreCheck += (*scoreMatrix)(code1,code2);
+                                         }
+                                     }
+                                     if (doLocal)
+                                     {
+                                        for (long k = 0; result1->sData[k] == gapCharacter; k++)
+                                            if (doAffine)
+                                                scoreCheck += k?gapExtend:gapOpen;
+                                            else
+                                                scoreCheck += gapOpen;
+                                         for (long k = 0; result2->sData[k] == gapCharacter; k++)
+                                             if (doAffine)
+                                                 scoreCheck += k?gapExtend2:gapOpen2;
+                                             else
+                                                 scoreCheck += gapOpen2;
+                                         for (long k = result1->sLength-1; result1->sData[k] == gapCharacter; k--)
+                                             if (doAffine)
+                                                 scoreCheck += k==result1->sLength-1?gapOpen:gapExtend;
+                                             else
+                                                 scoreCheck += gapOpen;
+                                         for (long k = result2->sLength-1; result2->sData[k] == gapCharacter; k--)
+                                             if (doAffine)
+                                                 scoreCheck += k==result2->sLength-1?gapOpen2:gapExtend2;
+                                             else
+                                                 scoreCheck += gapOpen2;
+                                     }*/
+
+
+
+                                    pairwiseComp->MStore ("0", new _Constant (score), false);
+                                    /*pairwiseComp->MStore ("3", new _Constant (score2), false);
+                                    pairwiseComp->MStore ("4", new _FString(result1), false);
+                                    pairwiseComp->MStore ("5", new _FString(result2), false);
+                                    pairwiseComp->MStore ("6", new _FString((_String*)ops.toStr()), false);
+                                    pairwiseComp->MStore ("7", new _Constant (scoreCheck), false);*/
+                                    alignedStrings->MStore (_String(s1), pairwiseComp, false);
+                                }
+                            }
+
+                            storeResultIn->SetValue (alignedStrings, false);
+                        }
+
+                    } else {
+                        errStr = seqAlignScore & " is a required option, which must be a square matrix with dimension matching the size of " & seqAlignMap;
+                    }
+                } else {
+                    errStr = seqAlignMap & " is a required option, which must be a non-empty string without repeating characters ";
+                }
+            } else {
+                errStr = *(_String*)parameters(2) & " was expected to be an associative array of alignment options";
+            }
+        } else {
+            errStr = *(_String*)parameters(1) & " was expected to be a vector of strings";
+        }
+    }
+
+    if (errStr.sLength) {
+        errStr = errStr & " in call to " & blAlignSequences;
+        WarnError (errStr);
+    }
+}
+
+//____________________________________________________________________________________
+
+bool    RecurseDownTheTree (_SimpleList& theNodes, _List& theNames, _List&theConstraints, _List& theParts, _SimpleList& partIndex)
+{
+    _SimpleList localNodes;
+
+    node<long>* firstNode = (node<long>*)theNodes(0), *otherNode;
+    bool        doThisOne = (firstNode->get_parent()!=nil), good = true;
+    long        index, ind, i;
+
+    /*if (!doThisOne)
+    {
+        BufferToConsole (_String((_String*)theParts.toStr()));
+        NLToConsole();
+        BufferToConsole (_String((_String*)partIndex.toStr()));
+        NLToConsole();
+    }*/
+
+    // there are a few cases to consider
+    for (ind = 1; ind<=firstNode->get_num_nodes(); ind++) { // have children nodes
+        localNodes<< (long)firstNode->go_down(ind);
+        for (index = 1; index<theNodes.lLength; index++) {
+            otherNode = (node<long>*)theNodes(index);
+            otherNode = otherNode->go_down(ind);
+            if (!otherNode) {
+                good = false;
+                break;
+            }
+            localNodes<<(long)otherNode;
+        }
+        if (!good) {
+            break;
+        }
+        good = RecurseDownTheTree (localNodes, theNames, theConstraints, theParts, partIndex);
+        if (!good) {
+            break;
+        }
+        localNodes.Clear();
+    }
+
+    // do this constraint now
+
+    if (doThisOne&&good) { // not a root - so we apply the constraint
+        _CalcNode*  firstCNode = (_CalcNode*)LocateVar (firstNode->get_data());
+        _SimpleList goodVars;
+        _List       otherGoodVars;
+        _Variable* firstVar;
+
+        ind = 0;
+
+        while ((firstVar=firstCNode->GetIthIndependent(ind))) {
+            for (index = 0; index<partIndex.lLength; index++) {
+                if (partIndex.lData[index]==0) {
+                    if (!firstVar->GetName()->EqualWithWildChar((_String*)theParts.lData[index],'?')) {
+                        break;
+                    }
+                }
+            }
+            if (index==partIndex.lLength) {
+                goodVars<<ind;
+            }
+            ind++;
+        }
+
+        for (i = 1; i<theNodes.lLength; i++) {
+            otherNode = (node<long>*)theNodes(i);
+            firstCNode = (_CalcNode*)LocateVar (otherNode->get_data());
+            _SimpleList dummy;
+            otherGoodVars && & dummy;
+            long          theseInd = firstCNode->CountAll();
+            _SimpleList   avVars;
+            for (index = 0; index < theseInd; index++) {
+                avVars << index;
+            }
+            for (index = 0; index<goodVars.countitems(); index++) {
+                long j=0,k=0;
+                bool found1 = false;
+                for (k = 0; k<partIndex.lLength; k++)
+                    if (partIndex.lData[k]==i) {
+                        break;
+                    }
+
+                for (; j<avVars.lLength; j++) {
+                    firstVar = firstCNode->GetIthParameter(avVars.lData[j]);
+                    if (firstVar->GetName()->EqualWithWildChar((_String*)theParts.lData[k],'?')) {
+                        (*(_SimpleList*)(otherGoodVars(i-1))) << avVars.lData[j];
+                        avVars.Delete (j);
+                        found1 = true;
+                        break;
+                    }
+                }
+                if (!found1) {
+                    goodVars.Delete (index);
+                    for (long ff = 0; ff < i-1; ff++) {
+                        ((_SimpleList*)(otherGoodVars(i-1)))->Delete (index);
+                    }
+                    index--;
+                }
+            }
+        }
+
+        // now the constraints can be built
+
+        for (index = 0; index < goodVars.lLength; index++) {
+            _String newConstraint;
+            for (ind = 0; ind < partIndex.lLength; ind++) {
+                if (partIndex.lData[ind]<0) {
+                    newConstraint = newConstraint & *(_String*)theParts(ind);
+                } else {
+                    otherNode = (node<long>*)theNodes(partIndex.lData[ind]);
+                    _CalcNode*  CNode = (_CalcNode*)LocateVar (otherNode->get_data());
+
+                    if (ind>0)
+                        newConstraint = newConstraint &
+                                        *(CNode->GetIthParameter((*(_SimpleList*)
+                                                (otherGoodVars(partIndex.lData[ind]-1))).lData[index])->GetName());
+                    else
+                        newConstraint = newConstraint &
+                                        *(CNode->GetIthIndependent(goodVars.lData[index])->GetName());
+                }
+
+            }
+            theConstraints&& &newConstraint;
+        }
+    }
+
+    if (!good) {
+        _String errMsg (*(LocateVar(firstNode->get_data())->GetName())& " is incompatible with "&
+                        (*LocateVar(((node<long>*)theNodes(index-1))->get_data())->GetName()) & " in call to ReplicateConstraint");
+        WarnError (errMsg);
+        return false;
+    }
+
+    return true;
+
+}
+
+//____________________________________________________________________________________
+
+void      _ElementaryCommand::ExecuteCase26 (_ExecutionList& chain)
+{
+    chain.currentCommand++;
+    // we have to build a list of _CalcNodes to deal with
+    // all of the trees/nodes in ReplicateConstraint must be of the same topology
+    // the constraint will be processed by trying all of the subnodes of the given node
+    // and within each - trying all of the variables to see if the constraint is matched
+    // exactly the same operation will be repeated on each of the other parameters
+
+    _String *       replicateSource,
+            thisS,
+            prStr = GetStringFromFormula((_String*)parameters(0),chain.nameSpacePrefix);
+
+    replicateSource = &prStr;
+
+    _List           parts,
+                    theConstraints;
+
+    _SimpleList     thisIndex,
+                    thisArgs;
+
+    long            ind1    =   replicateSource->Find("this"),
+                    ind2,
+                    ind3,
+                    ind4;
+
+    if (ind1<0) {
+        WarnError (*(_String*)parameters(0)&" has no 'this' references in call to ReplicateConstraint!");
+        return ;
+    }
+
+    _SimpleList thisHits (parameters.lLength-1,0,0);
+
+    while (ind1>=0) { // references to 'this' still exist
+        ind2 = ind1+4; // look forward to the number of 'this'
+        while ('0'<=replicateSource->sData[ind2] && replicateSource->sData[ind2]<='9') {
+            ind2++;
+        }
+
+        ind3  = replicateSource->Cut(ind1+4,ind2-1).toNum();
+        ind2  = replicateSource->FindEndOfIdent (ind1,-1,'?');
+        // now ind1-ind2 contains a reference with this...
+        _String newS  (*replicateSource,ind1,ind2);
+        thisS = _String("this")&_String(ind3);
+        if ((ind4 = ((_String*)parameters(ind3))->Find('.'))>=0) { // branch argument
+            newS = newS.Replace (thisS,((_String*)parameters(ind3))->Cut(0,ind4-1), true);
+        } else { // non-branch argument
+            newS = newS.Replace (thisS,*((_String*)parameters(ind3)), true);
+        }
+        parts&& &newS;
+        ind3--;
+        thisIndex<<ind3; // sequence of references to this
+
+        if (ind3<0 || ind3 >= thisHits.lLength) {
+            WarnError (_String("Invalid reference to ") & thisS & " in the constraint specification");
+            return ;
+        }
+        thisHits.lData[ind3] = 1;
+
+        if (ind2>=replicateSource->sLength-1) {
+            break;
+        }
+        ind1 = replicateSource->Find("this",ind2+1,-1);
+        if (ind1==-1) {
+            newS = replicateSource->Cut(ind2+1,-1);
+        } else {
+            newS = replicateSource->Cut(ind2+1,ind1-1);
+        }
+        parts&& &newS;
+        thisIndex<<-1;
+    }
+    // now that the string is conveniently partritioned into blocks
+    // we will check the arguments and store references
+
+    for (ind1 = 1; ind1<parameters.lLength; ind1++) {
+        if (thisHits.lData[ind1-1] == 0) {
+            WarnError (_String("Unused ") & ind1 & "-th reference variable: " & *(_String*)parameters(ind1));
+            return ;
+        }
+
+        ind2 = LocateVarByName (*(_String*)parameters(ind1));
+        if (ind2<0) {
+            _String newS = *(_String*)parameters(ind1) & " is undefined in call to ReplicateConstraint.";
+            acknError (newS);
+            return  ;
+        }
+
+        _Variable* thisNode = FetchVar (ind2);
+        if (thisNode->ObjectClass()==TREE_NODE) {
+            thisArgs<< (long)((_CalcNode*)thisNode)->LocateMeInTree();
+        } else if (thisNode->ObjectClass()==TREE) {
+            thisArgs<< (long)&((_TheTree*)thisNode)->GetRoot();
+        } else {
+            WarnError (*(_String*)parameters(ind1) & " is neither a tree nor a tree node in call to ReplicateConstraint.");
+            return ;
+        }
+    }
+
+    // now with this list ready we can recurse down the tree and produce the contsraints
+    if (RecurseDownTheTree(thisArgs, parameters, theConstraints, parts, thisIndex)) {
+        if (theConstraints.lLength) {
+            ReportWarning  (_String("\nReplicateConstraint generated the following contsraints:"));
+            _Parameter      doDeferSet;
+            checkParameter (deferConstrainAssignment,doDeferSet,0.0);
+            bool            applyNow = CheckEqual(doDeferSet,0.0);
+            _String         *constraintAccumulator = (_String*)checkPointer(new _String(128L,true));
+
+            if (applyNow) {
+                deferSetFormula = new _SimpleList;
+                checkPointer (deferSetFormula);
+            }
+
+            for (ind1 = 0; ind1 < theConstraints.lLength; ind1++) {
+                replicateSource = (_String*)(theConstraints(ind1)->toStr());
+                if (applyNow) {
+                    _Formula rhs, lhs;
+                    _FormulaParsingContext fpc (nil, chain.nameSpacePrefix);
+                    ind2 = Parse (&rhs,*replicateSource,fpc,&lhs);
+                    ExecuteFormula(&rhs,&lhs,ind2,fpc.assignmentRefID(),chain.nameSpacePrefix,fpc.assignmentRefType());
+                }
+                (*constraintAccumulator) << replicateSource;
+                (*constraintAccumulator) << ';';
+                (*constraintAccumulator) << '\n';
+                //ReportWarning (*replicateSource);
+                DeleteObject (replicateSource);
+            }
+            constraintAccumulator->Finalize();
+            ReportWarning (*constraintAccumulator);
+            CheckReceptacleAndStore (&lastSetOfConstraints,"ReplicateConstraint",false,new _FString(constraintAccumulator),false);
+            if (applyNow) {
+                FinishDeferredSF();
+            }
+        }
+    }
+}
+
+//____________________________________________________________________________________
+
+void      _ElementaryCommand::ExecuteCase57 (_ExecutionList& chain)
+{
+    chain.currentCommand++;
+
+    _String errStr;
+
+    _Variable * storeResultIn = CheckReceptacle (&AppendContainerName(*(_String*)parameters(0),chain.nameSpacePrefix), blGetNeutralNull, true),
+                *   sv            = FetchVar(LocateVarByName (AppendContainerName(*(_String*)parameters(2),chain.nameSpacePrefix))),
+                    *  nsv           = FetchVar(LocateVarByName (AppendContainerName(*(_String*)parameters(3),chain.nameSpacePrefix)));
+
+    _Parameter itCountV       = ProcessNumericArgument ((_String*)parameters(4),chain.nameSpacePrefix);
+
+    _String   * lfName        = (_String*)parameters(1);
+
+    long        f = FindLikeFuncName(AppendContainerName(*lfName,chain.nameSpacePrefix));
+
+    if (f>=0) {
+        if (sv && sv->ObjectClass () == MATRIX) {
+            if (nsv && nsv->ObjectClass () == MATRIX) {
+                _Matrix * sMatrix  = (_Matrix*)((_Matrix*)sv->Compute())->ComputeNumeric();
+                _Matrix * nsMatrix = (_Matrix*)((_Matrix*)nsv->Compute())->ComputeNumeric();
+
+                sMatrix->CheckIfSparseEnough (true);
+                nsMatrix->CheckIfSparseEnough (true);
+
+                if (   sMatrix->GetHDim()  == sMatrix->GetVDim() &&
+                        nsMatrix->GetHDim() == nsMatrix->GetVDim() &&
+                        sMatrix->GetHDim()  ==  nsMatrix->GetVDim() ) {
+                    _LikelihoodFunction * theLF = (_LikelihoodFunction*)likeFuncList (f);
+
+                    if (((_DataSetFilter*)dataSetFilterList (theLF->GetTheFilters() (0)))->GetDimension (true) == sMatrix->GetHDim()) {
+                        long itCount = itCountV;
+                        if (itCount>0) {
+                            _AssociativeList * res = theLF->SimulateCodonNeutral ((_Matrix*)sMatrix, (_Matrix*)nsMatrix, itCount);
+                            storeResultIn->SetValue (res,false);
+                        } else {
+                            errStr = "Invalid iterations per character state";
+                        }
+                    } else {
+                        errStr = "Incompatible data and cost matrices";
+                    }
+
+                } else {
+                    errStr = "Incompatible syn and non-syn cost matrix dimensions";
+                }
+            } else {
+                errStr = "Invalid non-syn cost matrix argument";
+            }
+        } else {
+            errStr = "Invalid syn cost matrix argument";
+        }
+
+    } else {
+        errStr = _String("Likelihood function ") & *lfName & " has not been defined";
+    }
+
+    if (errStr.sLength) {
+        errStr = errStr & " in call to " & blGetNeutralNull;
+        WarnError (errStr);
+    }
+}
+
+//____________________________________________________________________________________
+
+void      _ElementaryCommand::ExecuteCase58 (_ExecutionList& chain)
+{
+    chain.currentCommand++;
+
+    _String     errStr;
+    _String *   profileCode   = (_String*)parameters(0);
+
+    if (*profileCode == _String ("START")) {
+        if (chain.profileCounter) {
+            DeleteObject (chain.profileCounter);
+        }
+        checkPointer(chain.profileCounter = new _Matrix (chain.lLength, 2, false, true));
+        chain.doProfile = 1;
+    } else if (*profileCode == _String ("PAUSE")) {
+        chain.doProfile = 2;
+    } else if (*profileCode == _String ("RESUME")) {
+        chain.doProfile = 1;
+    } else {
+        _Variable * outVar = CheckReceptacle (&AppendContainerName(*profileCode,chain.nameSpacePrefix), blHBLProfile, true);
+        if (outVar) {
+            if (chain.profileCounter) {
+                _AssociativeList * profileDump = new _AssociativeList;
+                checkPointer     (profileDump);
+
+                _SimpleList      instructions;
+                _List            descriptions;
+
+                for (long k=1; k<2*chain.lLength; k+=2) {
+                    if (chain.profileCounter->theData[k] > 0.0) {
+                        instructions << k/2;
+                        _String * desc = (_String*)((_ElementaryCommand*)chain(k/2))->toStr();
+                        descriptions << desc;
+                        DeleteObject (desc);
+                    }
+                }
+
+                _Matrix         * execProfile = new _Matrix (instructions.lLength,2,false,true),
+                * instCounter = new _Matrix (instructions),
+                * descList    = new _Matrix (descriptions);
+
+                checkPointer    (execProfile);
+                checkPointer    (instCounter);
+                checkPointer    (descList);
+
+                long k2 = 0;
+                for (long m=1; m<2*chain.lLength; m+=2) {
+                    if (chain.profileCounter->theData[m] > 0.0) {
+                        execProfile->theData[k2++] = chain.profileCounter->theData[m];
+                        execProfile->theData[k2++] = chain.profileCounter->theData[m-1];
+                    }
+                }
+
+                _FString  aKey;
+                *aKey.theString = "INSTRUCTION INDEX";
+                profileDump->MStore (&aKey, instCounter, false);
+                *aKey.theString = "INSTRUCTION";
+                profileDump->MStore (&aKey, descList, false);
+                *aKey.theString = "STATS";
+                profileDump->MStore (&aKey, execProfile, false);
+                outVar->SetValue (profileDump,false);
+                chain.doProfile = 0;
+                DeleteObject (chain.profileCounter);
+                chain.profileCounter = nil;
+            } else {
+                errStr = "Profiler dump invoked before #profile START; ";
+            }
+        }
+    }
+
+}
+
+
+//____________________________________________________________________________________
+
+void      _ElementaryCommand::ExecuteCase61 (_ExecutionList& chain)
+{
+    chain.currentCommand++;
+
+    _PMathObj           avl1    = FetchObjectFromVariableByType (&AppendContainerName(*(_String*)parameters(1),chain.nameSpacePrefix),ASSOCIATIVE_LIST),
+                        avl2  = FetchObjectFromVariableByType (&AppendContainerName(*(_String*)parameters(2),chain.nameSpacePrefix),ASSOCIATIVE_LIST),
+                        start   = parameters.lLength>3?FetchObjectFromVariableByType (&AppendContainerName(*(_String*)parameters(3),chain.nameSpacePrefix),NUMBER):nil;
+
+    if (! (avl1 && avl2)) {
+        WarnError (_String ("Both arguments (") & *(_String*)parameters(1) & " and " & *(_String*)parameters(2) & " in a call to SCFG = ... must be evaluate to associative arrays");
+    } else {
+        Scfg    * scfg      = new Scfg ((_AssociativeList*)avl1,(_AssociativeList*)avl2,start?start->Value():0);
+        _String scfgName    = AppendContainerName(*(_String*)parameters(0),chain.nameSpacePrefix);
+        long    f           = FindSCFGName (scfgName);
+
+        if (f==-1) {
+            for (f=0; f<scfgNamesList.lLength; f++)
+                if (((_String*)scfgNamesList(f))->sLength==0) {
+                    break;
+                }
+
+            if (f==scfgNamesList.lLength) {
+                scfgList << scfg;
+                scfgNamesList&&(&scfgName);
+                DeleteObject (scfg);
+            } else {
+                scfgNamesList.Replace(f,&scfgName,true);
+                scfgList.lData[f] = (long)scfg;
+            }
+        } else {
+            scfgNamesList.Replace(f,&scfgName,true);
+            scfgList.Replace(f,scfg,false);
+        }
+    }
+}
+
+//____________________________________________________________________________________
+
+void      _ElementaryCommand::ExecuteCase63 (_ExecutionList& chain)
+{
+    chain.currentCommand++;
+
+    /*_PMathObj         avl1    = FetchObjectFromVariableByType ((_String*)parameters(1),ASSOCIATIVE_LIST),
+                        avl2    = FetchObjectFromVariableByType ((_String*)parameters(2),ASSOCIATIVE_LIST),
+                        start   = parameters.lLength>3?FetchObjectFromVariableByType ((_String*)parameters(3),NUMBER):nil;
+
+    if (! (avl1 && avl2))
+    {
+        _String errMsg = _String ("Both arguments (") & *(_String*)parameters(1) & " and " & *(_String*)parameters(2) & " in a call to SCFG = ... must be evaluate to associative arrays";
+        WarnError (errMsg);
+    }
+    else
+    {
+        Scfg    * scfg   = new Scfg ((_AssociativeList*)avl1,(_AssociativeList*)avl2,start?start->Value():0);
+        _String * str    = (_String*)parameters(0);
+        long    f        = FindSCFGName (*str);
+
+        if (f==-1)
+        {
+            for (f=0; f<scfgNamesList.lLength; f++)
+                if (((_String*)scfgNamesList(f))->sLength==0)
+                    break;
+
+            if (f==scfgNamesList.lLength)
+            {
+                scfgList << scfg;
+                scfgNamesList&&(str);
+                DeleteObject (scfg);
+            }
+            else
+            {
+                scfgNamesList.Replace(f,str,true);
+                scfgList.lData[f] = (long)scfg;
+            }
+        }
+        else
+        {
+            scfgNamesList.Replace(f,str,true);
+            scfgList.Replace(f,scfg,false);
+        }
+    }   */
+}
+
+
+//____________________________________________________________________________________
+
+void    _ElementaryCommand::ExecuteCase64 (_ExecutionList& chain)
+{
+	ReportWarning (_String("ExecuteCase64()"));
+    chain.currentCommand++;
+
+    _PMathObj   avl1    = FetchObjectFromVariableByType (&AppendContainerName(*(_String*)parameters(1),chain.nameSpacePrefix), ASSOCIATIVE_LIST);
+
+    if (! (avl1)) {
+        WarnError (_String ("Argument (") & *(_String*)parameters(1) & " in call to BGM = ... must evaluate to associative array");
+    } else {
+        _BayesianGraphicalModel * bgm   = new _BayesianGraphicalModel ((_AssociativeList *) avl1);
+
+        _String bgmName     = AppendContainerName (*(_String *) parameters(0), chain.nameSpacePrefix);
+        long    bgmIndex    = FindBgmName (bgmName);
+		
+        if (bgmIndex == -1) {   // not found
+            for (bgmIndex = 0; bgmIndex < bgmNamesList.lLength; bgmIndex++) {
+                // locate empty strings in name list
+                if (((_String *)bgmNamesList(bgmIndex))->sLength == 0) {
+                    break;
+                }
+            }
+
+            if (bgmIndex == bgmNamesList.lLength) {
+                // reached end of list without finding empty string, append new string
+                bgmList.AppendNewInstance(bgm);
+                bgmNamesList && (&bgmName);
+            } else {
+                // replace empty string in list
+                bgmNamesList.Replace (bgmIndex, &bgmName, true);
+                bgmList.Replace (bgmIndex, bgm, false);
+            }
+        } else { // 20070626: SLKP edit to deal with already existing BGMs
+            bgmNamesList.Replace(bgmIndex,&bgmName,true);
+            bgmList.Replace(bgmIndex,bgm,false);
+        }
+		
+		ReportWarning(_String("Created BGM ") & bgmName & " at index " & bgmIndex);
+    }
+}
+
+
+//____________________________________________________________________________________
+bool    _ElementaryCommand::ConstructSCFG (_String&source, _ExecutionList&target)
+// syntax: SCFG ident = (Rules1, Rules2 <,start>)
+{
+
+    long    mark1 = source.FirstSpaceIndex(0,-1,1),
+            mark2 = source.Find ('=', mark1, -1);
+
+    _String scfgID (source, mark1+1,mark2-1);
+
+    if (mark1==-1 || mark2==-1 || mark1+1>mark2-1 || !scfgID.IsValidIdentifier(true)) {
+        WarnError ("SCFG declaration missing a valid identifier");
+        return false;
+    }
+
+    _List pieces;
+
+    mark1 = source.Find ('(',mark2,-1);
+    if (mark1 >= 0) {
+        ExtractConditions (source,mark1+1,pieces,',');
+    }
+
+    if (pieces.lLength != 2 && pieces.lLength != 3) {
+        WarnError ("Expected: SCFG ident = (Rules1, Rules2 <,start>)");
+        return false;
+    }
+
+    _ElementaryCommand * scfg = new _ElementaryCommand (61);
+
+    scfg->parameters    &&(&scfgID);
+    scfg->addAndClean(target,&pieces,0);
+    return true;
+}
+
+//____________________________________________________________________________________
+bool    _ElementaryCommand::ConstructNN (_String&source, _ExecutionList&target)
+// syntax: NeuralNet ident = (InMatrix,OutMatrix,HiddenNodes)
+{
+
+    long    mark1 = source.FirstSpaceIndex(0,-1,1),
+            mark2 = source.Find ('=', mark1, -1);
+
+    _String nnID (source, mark1+1,mark2-1);
+
+    if (mark1==-1 || mark2==-1 || mark1+1>mark2-1 || !nnID.IsValidIdentifier(true)) {
+        WarnError ("NeutalNet declaration missing a valid identifier");
+        return false;
+    }
+
+
+    _List pieces;
+
+    mark1 = source.Find ('(',mark2,-1);
+    if (mark1 >= 0) {
+        ExtractConditions (source,mark1+1,pieces,',');
+    }
+
+    if (pieces.lLength != 3) {
+        WarnError ("NeuralNet ident = (InMatrix,OutMatrix,HiddenNodes)");
+        return false;
+    }
+
+    _ElementaryCommand * nn = new _ElementaryCommand (63);
+    nn->parameters  && (&nnID);
+    nn->addAndClean(target,&pieces,0);
+    return true;
+}
+
+//____________________________________________________________________________________
+bool    _ElementaryCommand::ConstructBGM (_String&source, _ExecutionList&target)
+// syntax: BGM ident = (<nodes>)
+{
+	ReportWarning(_String("ConstructBGM()"));
+    // locate ident in HBL string
+    long    mark1 = source.FirstSpaceIndex(0,-1,1),
+            mark2 = source.Find ('=', mark1, -1);
+
+    // assign ident to _String variable
+    _String bgmID (source, mark1+1,mark2-1);
+
+    if (mark1==-1 || mark2==-1 || mark1+1>mark2-1 || !bgmID.IsValidIdentifier(true)) {
+        WarnError ("BGM declaration missing a valid identifier");
+        return false;
+    }
+
+    // extract arguments from remainder of HBL string
+    _List pieces;
+
+    mark1 = source.Find ('(',mark2,-1);
+    if (mark1 >= 0) {
+        ExtractConditions (source,mark1+1,pieces,',');
+    }
+
+    if (pieces.lLength != 1) {
+        WarnError ("Expected: BGM ident = (<nodes>)");
+        return false;
+    }
+
+    _ElementaryCommand * bgm = new _ElementaryCommand (64);
+    bgm->parameters && (&bgmID);
+    bgm->addAndClean(target,&pieces,0);
+	
+    return true;
+}
+
+
+//____________________________________________________________________________________
+
+void    RetrieveModelComponents (long mid, _Matrix*& mm, _Matrix*& fv, bool & mbf)
+{
+    if (mid >=0 && mid < modelTypeList.lLength) {
+        if (modelTypeList.lData[mid] == 0) {
+            mm = (_Matrix*)FetchObjectFromVariableByTypeIndex(modelMatrixIndices.lData[mid],MATRIX);
+        } else {
+            mm = nil;
+        }
+
+        long fvi = modelFrequenciesIndices.lData[mid];
+        fv = (_Matrix*)FetchObjectFromVariableByTypeIndex(fvi>=0?fvi:(-fvi-1),MATRIX);
+        mbf = (fvi>=0);
+    } else {
+        mm = fv = nil;
+        mbf = false;
+    }
+}
+
+//____________________________________________________________________________________
+
+void    RetrieveModelComponents (long mid, _Variable*& mm, _Variable*& fv, bool & mbf)
+{
+    if (mid >= 0 && modelTypeList.lData[mid] == 0) {
+        mm = LocateVar(modelMatrixIndices.lData[mid]);
+    } else {
+        mm = nil;
+    }
+
+    long fvi = modelFrequenciesIndices.lData[mid];
+    fv = LocateVar (fvi>=0?fvi:(-fvi-1));
+    mbf = (fvi>=0);
+}
+
+//____________________________________________________________________________________
+
+bool    IsModelReversible (long mid)
+{
+    _Matrix *m = nil,
+             *f = nil;
+    bool    mbf;
+    RetrieveModelComponents (mid, m, f, mbf);
+    if (m&&f) {
+        return m->IsReversible(mbf?nil:f);
+    }
+    return false;
+}
+
+//____________________________________________________________________________________
+
+bool    IsModelOfExplicitForm (long modelID) {
+    if (modelID != HY_NO_MODEL) {
+        return modelTypeList.lData[modelID] != 0;
+    }
+    return false;
+}
+
+//____________________________________________________________________________________
+
+void    ScanModelForVariables        (long modelID, _AVLList& theReceptacle, bool inclG, long modelID2, bool inclCat)
+{
+    if (modelID != HY_NO_MODEL) {
+        // standard rate matrix
+        if (modelTypeList.lData[modelID] == 0) {
+            ((_Matrix*) (LocateVar(modelMatrixIndices.lData[modelID])->GetValue()))->ScanForVariables2(theReceptacle,inclG,modelID2,inclCat);
+        } else {
+        // formula based
+            // inclG was replaced with false in a previous commit. This caused problems in the optimizer and in
+            // likelihood reporting (it was consistently worse than optimizer results)
+            ((_Formula*)modelMatrixIndices.lData[modelID])->ScanFForVariables(theReceptacle, inclG, false, inclCat);
+        }
+    }
+}
+
+//____________________________________________________________________________________
+
+_String _HYHBLTypeToText (long type) {
+    _String result (128L,true);
+    if (type & HY_BL_DATASET) {
+        result << "DataSet|";
+    }
+    
+    if (type & HY_BL_DATASET_FILTER) {
+        result << "DataSetFilter|";
+    }
+    
+    if (type & HY_BL_LIKELIHOOD_FUNCTION) {
+        result << "LikelihoodFunction|";
+    }
+    
+    if (type & HY_BL_SCFG) {
+        result << "SCFG|";
+    }
+    
+    if (type & HY_BL_BGM) {
+        result << "BGM|";
+    }
+    
+    if (type & HY_BL_MODEL) {
+        result << "Model|";
+    }
+    
+    if (type & HY_BL_HBL_FUNCTION) {
+        result << "function|";
+    }
+    
+    result.Finalize();
+    result.Trim (0,result.sLength-2);
+    return result;
+}
+
+
+//____________________________________________________________________________________
+
+BaseRef _HYRetrieveBLObjectByName    (_String& name, long& type, long *index, bool errMsg, bool tryLiteralLookup)
+{
+    long loc = -1;
+    if (type & HY_BL_DATASET) {
+        loc = FindDataSetName (name);
+        if (loc >= 0) {
+            type = HY_BL_DATASET;
+            if (index) {
+                *index = loc;
+            }
+            return dataSetList (loc);
+        }
+    }
+
+    if (type & HY_BL_DATASET_FILTER) {
+        loc = FindDataSetFilterName (name);
+        if (loc >= 0) {
+            type = HY_BL_DATASET_FILTER;
+            if (index) {
+                *index = loc;
+            }
+            return dataSetFilterList (loc);
+        }
+    }
+
+    if (type & HY_BL_LIKELIHOOD_FUNCTION) {
+        loc = FindLikeFuncName (name);
+        if (loc >= 0) {
+            type = HY_BL_LIKELIHOOD_FUNCTION;
+            if (index) {
+                *index = loc;
+            }
+            return likeFuncList (loc);
+        }
+    }
+
+    if (type & HY_BL_SCFG) {
+        loc = FindSCFGName (name);
+        if (loc >= 0) {
+            type = HY_BL_SCFG;
+            if (index) {
+                *index = loc;
+            }
+            return scfgList (loc);
+        }
+    }
+
+    if (type & HY_BL_BGM) {
+        loc = FindBgmName (name);
+        if (loc >= 0) {
+            type = HY_BL_BGM;
+            if (index) {
+                *index = loc;
+            }
+            return bgmList (loc);
+        }
+    }
+
+    if (type & HY_BL_MODEL) {
+        loc = FindModelName(name);
+        if (loc < 0 && (name.Equal (&lastModelParameterList) || name.Equal (&useLastModel))) {
+            loc = lastMatrixDeclared;
+        }
+        if (loc >= 0) {
+            type = HY_BL_MODEL;
+            if (index) {
+                *index = loc;
+            }
+            if (IsModelOfExplicitForm(loc)) {
+                return (BaseRef)modelMatrixIndices.lData[loc];
+            }
+            return LocateVar (modelMatrixIndices.lData[loc]);
+        }
+    }
+
+    if (type & HY_BL_HBL_FUNCTION) {
+        loc = FindBFFunctionName(name);
+        if (loc >= 0) {
+            type = HY_BL_HBL_FUNCTION;
+            if (index) {
+                *index = loc;
+            }
+            return batchLanguageFunctions (loc);
+        }
+    }
+    
+    if (tryLiteralLookup) {
+        _String nameIDRef = ProcessLiteralArgument(&name, nil);
+        return _HYRetrieveBLObjectByName (nameIDRef, type, index, errMsg, false);
+    }
+
+    if (errMsg) {
+        WarnError (_String ("'") & name & "' does not refer to an existing object of type " & _HYHBLTypeToText (type));
+    }
+    type = HY_BL_NOT_DEFINED;
+    return nil;
+}
+
+
diff --git a/src/core/batchlanhelpers.cpp b/src/core/batchlanhelpers.cpp
new file mode 100644
index 0000000..3d4cdc2
--- /dev/null
+++ b/src/core/batchlanhelpers.cpp
@@ -0,0 +1,442 @@
+/*
+ 
+ HyPhy - Hypothesis Testing Using Phylogenies.
+ 
+ Copyright (C) 1997-now
+ Core Developers:
+ Sergei L Kosakovsky Pond (spond at ucsd.edu)
+ Art FY Poon    (apoon at cfenet.ubc.ca)
+ Steven Weaver (sweaver at ucsd.edu)
+ 
+ Module Developers:
+ Lance Hepler (nlhepler at gmail.com)
+ Martin Smith (martin.audacis at gmail.com)
+ 
+ Significant contributions from:
+ Spencer V Muse (muse at stat.ncsu.edu)
+ Simon DW Frost (sdf22 at cam.ac.uk)
+ 
+ Permission is hereby granted, free of charge, to any person obtaining a
+ copy of this software and associated documentation files (the
+ "Software"), to deal in the Software without restriction, including
+ without limitation the rights to use, copy, modify, merge, publish,
+ distribute, sublicense, and/or sell copies of the Software, and to
+ permit persons to whom the Software is furnished to do so, subject to
+ the following conditions:
+ 
+ The above copyright notice and this permission notice shall be included
+ in all copies or substantial portions of the Software.
+ 
+ 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.
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ 
+ */
+
+#include      "batchlan.h"
+#include      "defines.h"
+
+#ifdef __HYPHYQT__
+#include "hyphy_qt_helpers.h"
+#endif
+
+#if defined __MAC__ || defined __WINDOZE__ || defined __HYPHY_GTK__
+#include "HYUtils.h"
+#endif
+
+_Trie   _HY_HBL_Namespaces;
+_List   templateModelList;
+
+//____________________________________________________________________________________
+
+_String    _HYGenerateANameSpace () {
+    _String nmsp,
+            capLetters ("ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz");
+    do {
+        nmsp = _String::Random (8, &capLetters);
+        
+    } while (_HY_HBL_Namespaces.Find (nmsp) != HY_TRIE_NOTFOUND);
+    
+    _HY_HBL_Namespaces.Insert (nmsp, 0);
+    return nmsp;
+}
+
+//____________________________________________________________________________________
+
+_String    _HYStandardDirectory (const unsigned long which_one) 
+{
+    _String dirSpacer (GetPlatformDirectoryChar());
+
+    switch (which_one) {
+
+        case HY_HBL_DIRECTORY_TEMPLATE_MODELS:
+            return libDirectory & "TemplateBatchFiles" & dirSpacer & "TemplateModels" & dirSpacer;
+    }
+
+    return empty;
+}
+
+//____________________________________________________________________________________
+
+
+void    ReadModelList(void) 
+{
+    if (templateModelList.lLength > 0) return; 
+    
+    _String     modelListFile (_HYStandardDirectory (HY_HBL_DIRECTORY_TEMPLATE_MODELS) & "models.lst");
+    
+    FILE* modelList = doFileOpen (modelListFile.getStr(),"rb");
+    if (!modelList) {
+        return;
+    }
+    _String theData (modelList);
+    fclose (modelList);
+    if (theData.sLength) {
+        _ElementaryCommand::ExtractConditions(theData,0,templateModelList);
+        for (unsigned long i = 0; i<templateModelList.countitems(); i++) {
+            _String* thisString = (_String*)templateModelList(i);
+            _List   thisModel;
+            _ElementaryCommand::ExtractConditions(*thisString,thisString->FirstNonSpaceIndex(),thisModel,',');
+            if (thisModel.lLength!=5) {
+                templateModelList.Delete(i);
+                i--;
+                continue;
+            }
+            for (long j = 0; j<5; j++) {
+                ((_String*)thisModel(j))->StripQuotes();
+            }
+            ((_String*)thisModel(0))->UpCase();
+            templateModelList.Replace(i,&thisModel,true);
+        }
+    }
+}
+
+//____________________________________________________________________________________
+
+
+bool ExpressionCalculator (_String data)
+{
+    //Checking for exit
+    #ifndef __HYPHYQT__
+        if (data.sLength == 4) {
+            _String checkForExit (data);
+            checkForExit.LoCase();
+            if (checkForExit == _String ("exit")) {
+                return false;
+            }
+        }
+    #endif
+
+    _Formula   lhs,
+               rhs;
+              
+    _String    errMsg;
+    _FormulaParsingContext fpc (&errMsg, nil);
+    
+    long       retCode = Parse(&lhs, data, fpc, nil);
+
+    if (retCode != HY_FORMULA_FAILED) {
+        if (retCode == HY_FORMULA_EXPRESSION) {
+            _PMathObj formRes = lhs.Compute(0,nil,nil,&errMsg);
+            if (errMsg.sLength) {
+                WarnError(errMsg);
+            } else {
+                _String * objValue = (_String*)formRes->toStr();
+                StringToConsole(*objValue);
+                DeleteObject(objValue);
+            }
+        } else {
+            BufferToConsole ("NO RETURN VALUE");
+        }
+    } else {
+        WarnError(errMsg);
+    }
+    return true;
+}
+
+//____________________________________________________________________________________
+
+
+bool    ExpressionCalculator (void)
+{
+    _String data (StringFromConsole(false));
+
+#ifndef __UNIX__
+    if (terminateExecution) {
+        return false;
+    }
+    BufferToConsole (">");
+    StringToConsole (data);
+    BufferToConsole ("\n");
+#endif
+
+    if (data.sLength == 4) {
+        _String checkForExit (data);
+        checkForExit.LoCase();
+        if (checkForExit == _String ("exit")) {
+            return false;
+        }
+    }
+
+    _Formula  lhs,
+              rhs;
+
+    _FormulaParsingContext fpc;
+    long retCode = Parse(&lhs, data, fpc, nil);
+
+    if (!terminateExecution) {
+        if (retCode == HY_FORMULA_EXPRESSION) {
+            _PMathObj formRes = lhs.Compute();
+            if (!formRes) {
+                BufferToConsole ("NULL\n");
+            } else {
+                _String * objValue = (_String*)formRes->toStr();
+                StringToConsole (*objValue);
+                //BufferToConsole ("\n");
+                DeleteObject    (objValue);
+            }
+        } else {
+            BufferToConsole ("NO RETURN VALUE");
+        }
+    }
+    NLToConsole();
+    terminateExecution = false;
+    return true;
+}
+
+//____________________________________________________________________________________
+
+
+bool    PushFilePath (_String& pName, bool trim)
+{
+    char c = GetPlatformDirectoryChar();
+
+    long    f = pName.FindBackwards(_String(c),0,-1);
+    if (f>=0) {
+        _String newP = pName.Cut(0,f);
+        pathNames && & newP;
+        if (trim)
+            pName.Trim (f+1,-1);
+        return true;
+    } else if (pathNames.lLength) {
+        pathNames && pathNames(pathNames.lLength-1);
+    } else {
+        pathNames && & empty;
+    }
+
+    return false;
+}
+
+//____________________________________________________________________________________
+
+
+void   PopFilePath (void)
+{
+    pathNames.Delete (pathNames.lLength-1);
+}
+
+//____________________________________________________________________________________
+
+
+void   ExecuteBLString (_String& BLCommand, _VariableContainer* theP)
+{
+    _ExecutionList ex;
+    if (theP) {
+        ex.SetNameSpace(*theP->GetName());
+    }
+    ex.BuildList   (BLCommand);
+    terminateExecution = false;
+    ex.Execute      ();
+    terminateExecution = false;
+}
+
+//____________________________________________________________________________________
+
+_String ReturnDialogInput(bool dispPath)
+{
+    if (!dispPath) {
+        NLToConsole ();
+        StringToConsole (dialogPrompt);
+        BufferToConsole (":");
+    } else {
+        NLToConsole ();
+        if (pathNames.lLength) {
+            StringToConsole(*(_String*)pathNames(pathNames.lLength-1));
+        } else {
+            StringToConsole (baseDirectory);
+        }
+        
+        StringToConsole (dialogPrompt);
+        BufferToConsole (":");
+    }
+    return StringFromConsole();
+}
+
+
+//____________________________________________________________________________________
+
+_String ReturnFileDialogInput(void)
+{
+    if (currentExecutionList && currentExecutionList->stdinRedirect) {
+        _String outS (currentExecutionList->FetchFromStdinRedirect());
+        if (outS.sLength) {
+            return outS;
+        }
+    }
+    
+    _String resolvedFilePath;
+    
+#ifdef __HEADLESS__
+    WarnError ("Unhandled standard input call in headless HYPHY. Only redirected standard input (via ExecuteAFile) is allowed");
+    return empty;
+#endif
+
+#ifdef __MAC__
+    resolvedFilePath =  MacSimpleFileOpen();
+#endif
+
+#ifdef __WINDOZE__
+    resolvedFilePath =  ReturnFileDialogSelectionWin(false);
+#endif
+
+#ifdef __HYPHY_GTK__
+    if (PopUpFileDialog (dialogPrompt)) {
+        resolvedFilePath = *argFileName;
+    }
+#endif 
+
+#ifdef __HYPHYQT__  
+    resolvedFilePath = _hyQTFileDialog (dialogPrompt,empty, false);
+#endif
+    
+#if defined __UNIX__ && ! defined __HYPHYQT__ && ! defined __HYPHY_GTK__
+    resolvedFilePath = ReturnDialogInput(true);
+#endif
+
+    
+    if (resolvedFilePath.sLength == 0) {
+        terminateExecution = true;
+    }
+    
+    return resolvedFilePath;
+}
+
+//____________________________________________________________________________________
+
+_String ProcessStringArgument (_String* data) {
+    if (data->sLength>2) {
+        if (data->sData[data->sLength-1]=='_' && data->sData[data->sLength-2]=='_') {
+            _String varName (*data,0,data->sLength-3);
+            _FString* theVar = (_FString*)FetchObjectFromVariableByType(&varName,STRING);
+            if (theVar) {
+                return *theVar->theString;
+            }
+        }
+    }
+    return empty;
+}
+
+//____________________________________________________________________________________
+
+_String WriteFileDialogInput(void) {
+    if (currentExecutionList && currentExecutionList->stdinRedirect) {
+        _String outS (currentExecutionList->FetchFromStdinRedirect());
+        if (outS.sLength) {
+            return outS;
+        }
+    }
+    
+    defFileNameValue = ProcessLiteralArgument (&defFileString,nil);
+    _String resolvedFilePath;
+    
+#ifdef __HEADLESS__
+    WarnError ("Unhandled standard input call in headless HYPHY. Only redirected standard input (via ExecuteAFile) is allowed");
+    return empty;
+#else
+  #ifdef __MAC__
+      resolvedFilePath =  MacSimpleFileSave();
+  #endif
+
+  #ifdef __WINDOZE__
+
+      resolvedFilePath = ReturnFileDialogSelectionWin(true);
+  #endif
+
+  #ifdef __HYPHY_GTK__
+      if (PopUpFileDialog (dialogPrompt)) {
+          resolvedFilePath = *argFileName;
+      } 
+  #endif
+    #ifdef __HYPHYQT__  
+        resolvedFilePath = _hyQTFileDialog (dialogPrompt,defFileNameValue, true);
+    #endif
+            
+    #if defined __UNIX__ && ! defined __HYPHYQT__ && ! defined __HYPHY_GTK__
+        resolvedFilePath = ReturnDialogInput(true);
+    #endif
+#endif
+    
+    if (resolvedFilePath.sLength == 0) {
+        terminateExecution = true;
+    }
+    defFileNameValue = empty;
+    return resolvedFilePath;
+
+}
+
+//____________________________________________________________________________________
+
+_String* _HBLObjectNameByType (const long type, const long index, bool correct_for_empties) {
+
+    if (index < 0) {
+        return nil;
+    }
+    _List * theList = nil;
+    switch (type) {
+        case HY_BL_DATASET:
+            theList = &dataSetNamesList;
+            break;
+        case HY_BL_DATASET_FILTER:
+            theList = &dataSetFilterNamesList;
+            break;
+        case HY_BL_LIKELIHOOD_FUNCTION:
+            theList = &likeFuncNamesList;
+            break;
+        case HY_BL_HBL_FUNCTION:
+            theList = &batchLanguageFunctionNames;
+            break;
+        case HY_BL_MODEL:
+            theList = &modelNames;
+            break;
+        case HY_BL_SCFG:
+            theList = &scfgNamesList;
+            break;
+        case HY_BL_BGM:
+            theList = &bgmNamesList;
+            break;
+            
+    }
+    if (theList) {
+        // account for deleted objects
+        if (!correct_for_empties) 
+            return (_String*)(*theList)(index);
+            
+        long counter = 0;
+        for (unsigned long name_index = 0; name_index < theList->lLength; name_index++) {
+            _String *thisName = (_String*)(*theList)(name_index);
+            if (thisName && thisName->sLength) {
+                if (name_index - counter == index) {
+                    return thisName;
+                }
+            } else {
+                counter ++;
+            }
+        }
+    }
+    return nil;
+}
+
diff --git a/src/core/batchlanruntime.cpp b/src/core/batchlanruntime.cpp
new file mode 100644
index 0000000..63c351c
--- /dev/null
+++ b/src/core/batchlanruntime.cpp
@@ -0,0 +1,1429 @@
+/*
+ 
+ HyPhy - Hypothesis Testing Using Phylogenies.
+ 
+ Copyright (C) 1997-now
+ Core Developers:
+ Sergei L Kosakovsky Pond (spond at ucsd.edu)
+ Art FY Poon    (apoon at cfenet.ubc.ca)
+ Steven Weaver (sweaver at ucsd.edu)
+ 
+ Module Developers:
+ Lance Hepler (nlhepler at gmail.com)
+ Martin Smith (martin.audacis at gmail.com)
+ 
+ Significant contributions from:
+ Spencer V Muse (muse at stat.ncsu.edu)
+ Simon DW Frost (sdf22 at cam.ac.uk)
+ 
+ Permission is hereby granted, free of charge, to any person obtaining a
+ copy of this software and associated documentation files (the
+ "Software"), to deal in the Software without restriction, including
+ without limitation the rights to use, copy, modify, merge, publish,
+ distribute, sublicense, and/or sell copies of the Software, and to
+ permit persons to whom the Software is furnished to do so, subject to
+ the following conditions:
+ 
+ The above copyright notice and this permission notice shall be included
+ in all copies or substantial portions of the Software.
+ 
+ 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.
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ 
+ */
+
+#include      "baseobj.h"
+#include      "defines.h"
+#include      "batchlan.h"
+#include      "likefunc.h"
+#include      "bayesgraph.h"
+#include      "scfg.h"
+
+#if defined __MAC__ || defined __WINDOZE__ || defined __HYPHY_GTK__
+    #include "HYConsoleWindow.h"
+    #include "HYDialogs.h"
+
+#endif
+
+#if defined __HYPHYQT__
+#include "HYSharedMain.h"
+#include "hyphy_qt_helpers.h"
+#endif
+
+_List       openFileHandlesBackend;
+
+_AVLListX   openFileHandles     (&openFileHandlesBackend);
+
+//____________________________________________________________________________________
+
+bool      _ElementaryCommand::HandleHarvestFrequencies (_ExecutionList& currentProgram) {
+    currentProgram.currentCommand++;
+    
+
+    _String  freqStorageID = *(_String*)parameters(0),
+             dataID        = currentProgram.AddNameSpaceToID(*(_String*)parameters(1)), 
+             errMsg        ;
+    
+    _Variable * theReceptacle = CheckReceptacleCommandID (&AppendContainerName(freqStorageID,currentProgram.nameSpacePrefix),HY_HBL_COMMAND_HARVEST_FREQUENCIES, true, false, &currentProgram);
+     if (!theReceptacle) {
+        return false;
+    }    
+    SetStatusLine           ("Gathering Frequencies");
+
+
+    long       objectType = HY_BL_DATASET|HY_BL_DATASET_FILTER;
+    BaseRef    sourceObject = _HYRetrieveBLObjectByName (dataID, objectType,nil,false);
+    
+    long      unit      = ProcessNumericArgument((_String*)parameters(2),currentProgram.nameSpacePrefix),
+              posspec   = ProcessNumericArgument((_String*)parameters(4),currentProgram.nameSpacePrefix),
+              atom      = ProcessNumericArgument((_String*)parameters(3),currentProgram.nameSpacePrefix);
+    
+    _Matrix*            receptacle = nil;
+    
+    _Parameter          cghf = 1.0;
+    checkParameter      (hfCountGap,cghf,1.0, currentProgram.nameSpacePrefix);
+    
+    if (objectType == HY_BL_DATASET) { // harvest directly from a DataSet
+        _String         vSpecs,
+                        hSpecs;
+        
+        if (parameters.lLength>5)   {
+            vSpecs = *(_String*)parameters(5);
+        }
+        if (parameters.lLength>6)   {
+            hSpecs = *(_String*)parameters(6);
+        }
+        
+        _DataSet * dataset = (_DataSet*)sourceObject;
+        _SimpleList     hL, vL;
+        dataset->ProcessPartition (hSpecs,hL,false);
+        dataset->ProcessPartition (vSpecs,vL,true);
+        
+        receptacle = dataset->HarvestFrequencies(unit,atom,posspec,hL, vL,cghf>0.5);
+    } else { // harvest from a DataSetFilter
+        if (objectType == HY_BL_DATASET_FILTER) {
+            receptacle = ((_DataSetFilter*)sourceObject)->HarvestFrequencies(unit,atom,posspec,cghf>0.5);
+        } else {
+            errMsg = _String ("'") & dataID & "' is neither a DataSet nor a DataSetFilter";
+        }
+    }
+    
+    SetStatusLine           (empty);
+    
+    if (errMsg.sLength || receptacle == nil) {
+        DeleteObject (receptacle);
+        currentProgram.ReportAnExecutionError (errMsg); 
+        theReceptacle->SetValue (new _MathObject, false);
+        return false;
+    }   
+    theReceptacle->SetValue (receptacle, false);
+    return true;
+    
+    //CheckReceptacleCommandIDAndStore (&freqStorageID,HY_HBL_COMMAND_HARVEST_FREQUENCIES,true, receptacle, false);
+}
+
+//____________________________________________________________________________________
+
+bool      _ElementaryCommand::HandleOptimizeCovarianceMatrix (_ExecutionList& currentProgram, bool doOptimize) {
+    currentProgram.currentCommand++;
+    // construct the receptacle matrix
+    
+    _String  lfResName  (currentProgram.AddNameSpaceToID(*(_String*)parameters(0))),
+             lfNameID   (currentProgram.AddNameSpaceToID(*(_String*)parameters(1)));
+             
+    _Variable* result = CheckReceptacleCommandID (&lfResName, doOptimize?HY_HBL_COMMAND_OPTIMIZE:HY_HBL_COMMAND_COVARIANCE_MATRIX,true);
+
+    // Handle string variables passed as likefunc IDs?
+     _String temp = ProcessLiteralArgument(&lfNameID,currentProgram.nameSpacePrefix);
+    if (temp.sLength) {
+        lfNameID = temp;
+    }
+
+    long       objectType = HY_BL_LIKELIHOOD_FUNCTION|HY_BL_SCFG|HY_BL_BGM;
+    _LikelihoodFunction    *lkf = (_LikelihoodFunction*)_HYRetrieveBLObjectByName (lfNameID, objectType,nil,doOptimize==false);
+    
+    if (lkf == nil) { // will only happen if the object is a custom function 
+        lkf = (_LikelihoodFunction*)checkPointer(new _CustomFunction (&lfNameID));
+    }
+    
+    if (!doOptimize) { 
+        // COVARIANCE_MATRIX 
+ 
+        SetStatusLine (_String("Finding the cov. matrix/profile CI for ")&lfNameID);
+        _String              cpl = currentProgram.AddNameSpaceToID(covarianceParameterList);
+        _Variable            *  restrictVariable = FetchVar (LocateVarByName(cpl));
+        _SimpleList          *  restrictor       = nil;
+        
+        if (objectType == HY_BL_LIKELIHOOD_FUNCTION || objectType == HY_BL_SCFG){ 
+        // not a BGM
+            if (restrictVariable) { // only consider some variables
+                _SimpleList variableIDs;
+                if (restrictVariable->ObjectClass () == ASSOCIATIVE_LIST)
+                    // a list of variables stored as keys in an associative array
+                {
+                    checkPointer (restrictor = new _SimpleList);
+                    _List*  restrictedVariables = ((_AssociativeList *)restrictVariable->GetValue())->GetKeys();
+                    for (unsigned long iid = 0; iid < restrictedVariables->lLength; iid++) {
+                        _String varID = currentProgram.AddNameSpaceToID(*(_String*)(*restrictedVariables)(iid));
+                        variableIDs << LocateVarByName (varID);
+                    }
+                } else if (restrictVariable->ObjectClass () == STRING)
+                    // a single variable stored in a string
+                {
+                    _String varID = currentProgram.AddNameSpaceToID(*((_FString*)restrictVariable->Compute())->theString);
+                    variableIDs << LocateVarByName (varID);
+                }
+                if (variableIDs.lLength > 0) {
+                    checkPointer(restrictor = new _SimpleList ());
+                    for (unsigned long var_index = 0; var_index < variableIDs.lLength; var_index++) {
+                        long vID = lkf->GetIndependentVars().Find(variableIDs.lData[var_index]);
+                        if (vID >= 0) (*restrictor) << vID;
+                    }
+                    if (restrictor->lLength == 0) {
+                        DeleteObject (restrictor);
+                        restrictor = nil;
+                    }
+               }
+            }   
+            result->SetValue( (_Matrix*)lkf->CovarianceMatrix(restrictor),false);
+            DeleteObject (restrictor);
+        } else {
+        // BGM
+            _Matrix * optRes = (_Matrix*)lkf->CovarianceMatrix(nil);
+             if (optRes) {
+                result->SetValue(optRes,false);
+            }
+        }
+    } else {
+        // OPTIMIZE
+        if (objectType != HY_BL_NOT_DEFINED) {
+            SetStatusLine (_String("Optimizing ") & _HYHBLTypeToText (objectType) & ' ' &lfNameID);
+        } else {
+            SetStatusLine (_String("Optimizing user function ") &lfNameID);        
+        }
+        result -> SetValue(lkf->Optimize(),false);
+    }
+
+    if (objectType == HY_BL_NOT_DEFINED) {
+        DeleteObject (lkf);    // delete the custom function object
+    }
+    
+    
+    SetStatusLine ("Finished with the optimization");
+
+    return true;
+}
+
+//____________________________________________________________________________________
+
+bool      _ElementaryCommand::HandleComputeLFFunction (_ExecutionList& currentProgram) {
+        
+    currentProgram.currentCommand++;
+
+    _String *arg1       = (_String*)parameters(0),
+            *arg2      = (_String*)parameters(1),
+            name2Find   = AppendContainerName(*arg1,currentProgram.nameSpacePrefix);
+            
+    // bool isSCFG  = false;
+
+    long                   objectType = HY_BL_LIKELIHOOD_FUNCTION|HY_BL_SCFG|HY_BL_BGM;
+    _LikelihoodFunction    *lf       = (_LikelihoodFunction*)_HYRetrieveBLObjectByName (name2Find, objectType,nil, true, true);
+
+    if (*arg2 == lfStartCompute) {
+            lf->PrepareToCompute(true);
+    } else if (*arg2 == lfDoneCompute) {
+            lf->DoneComputing (true);
+    } else {
+        if (!lf->HasBeenSetup()) {
+            WarnError (_String("Please call LFCompute (lf_id, ")&lfStartCompute&") before evaluating the likelihood function");
+            return false;
+        } else {
+            _Variable* rec = CheckReceptacleCommandID (&AppendContainerName(*arg2,currentProgram.nameSpacePrefix), HY_HBL_COMMAND_LFCOMPUTE,true);
+             if (!rec) {
+                return false;
+            }
+            rec->SetValue(new _Constant (lf->Compute()),false);
+        }
+    }
+
+    return true;
+    
+}
+
+//____________________________________________________________________________________
+
+bool      _ElementaryCommand::HandleSelectTemplateModel (_ExecutionList& currentProgram) {
+        
+    currentProgram.currentCommand++;
+
+    SetStatusLine ("Waiting for model selection");
+
+    _String     modelFile,
+                errMsg;
+
+    ReadModelList();
+
+    if (((_String*)parameters(0))->Equal(&useLastModel)) {
+        if (lastModelUsed.sLength) {
+            PushFilePath (lastModelUsed);
+        } else {
+            WarnError (_String("First call to SelectTemplateModel. ") & useLastModel &" is meaningless.");
+            return false;
+        }
+    } else {
+        _String filterName (currentProgram.AddNameSpaceToID(*(_String*)parameters(0)));
+        long            objectType = HY_BL_DATASET_FILTER;
+        _DataSetFilter* thisDF = (_DataSetFilter*)_HYRetrieveBLObjectByName (filterName, objectType,nil,true);
+                // decide what this DF is comprised of
+
+        _String             dataType;
+        long                dataDimension   = thisDF->GetDimension(),
+                            unitLength      = thisDF->GetUnitLength();
+
+        _TranslationTable*  thisTT = thisDF->GetData()->GetTT();
+        
+        if (unitLength==1) {
+            if (thisTT->IsStandardNucleotide()) {
+                dataType = "nucleotide";
+            } else if (thisTT->IsStandardAA()) {
+                dataType = "aminoacid";
+            }
+        } else {
+            if (thisTT->IsStandardNucleotide())
+                if (unitLength==3) {
+                    dataType = "codon";
+                } else if (unitLength==2) {
+                    dataType = "dinucleotide";
+                }
+        }
+
+        if (!dataType.sLength) {
+            WarnError (_String("DataSetFilter '")&filterName&"' contains non-standard data and SelectTemplateModel is not applicable.");
+            return false;
+        }
+
+        _SimpleList matchingModels;
+
+        for (unsigned long model_index = 0; model_index < templateModelList.lLength; model_index++) {
+            _List *model_components = (_List*)templateModelList(model_index);
+            
+            if (dataType.Equal((_String*)model_components->GetItem(3))) {
+                _String * dim = (_String*)model_components->GetItem(2);
+                if (*dim==_String("*")|| dataDimension == dim->toNum()) {
+                    matchingModels << model_index;
+                }
+            }
+        }
+
+        if (!matchingModels.lLength) {
+            WarnError ((_String)("DataSetFilter '")&filterName&"' could not be matched with any template models.");
+            return false;
+        }
+        unsigned long model_id = HY_MAX_LONG_VALUE;
+
+        if (currentProgram.stdinRedirect) {
+            errMsg = currentProgram.FetchFromStdinRedirect ();
+            for (model_id = 0; model_id<matchingModels.lLength; model_id++)
+                if (errMsg.Equal((_String*)(*(_List*)templateModelList(matchingModels(model_id)))(0))) {
+                    break;
+                }
+
+            if (model_id >= matchingModels.lLength) {
+                WarnError (errMsg & " is not a valid model (with input redirect) in call to SelectTemplateModel");
+                return false;
+            }
+        } else {
+#ifdef __HEADLESS__
+            WarnError ("Unhandled standard input interaction in SelectTemplateModel for headless HyPhy");
+            return false;
+#else
+#if defined __UNIX__ && !defined __HYPHYQT__ && !defined __HYPHY_GTK__
+            while (model_id == HY_MAX_LONG_VALUE) {
+                printf ("\n\n               +--------------------------+\n");
+                printf     ("               | Select a standard model. |\n");
+                printf     ("               +--------------------------+\n\n\n");
+                
+                for (model_id = 0; model_id<matchingModels.lLength; model_id++) {
+                    printf ("\n\t(%s):%s",((_String*)(*(_List*)templateModelList(matchingModels(model_id)))(0))->getStr(),
+                            ((_String*)(*(_List*)templateModelList(matchingModels(model_id)))(1))->getStr());
+                }
+                printf ("\n\n Please type in the abbreviation for the model you want to use:");
+                dataType.CopyDynamicString(StringFromConsole());
+                dataType.UpCase();
+                for (model_id = 0; model_id<matchingModels.lLength; model_id++) {
+                    if (dataType.Equal((_String*)(*(_List*)templateModelList(matchingModels(model_id)))(0))) {
+                        break;
+                    }
+                }
+                if (model_id==matchingModels.lLength) {
+                    model_id=HY_MAX_LONG_VALUE;
+                }
+            }
+#endif
+#if !defined __UNIX__ ||  defined __HYPHYQT__ ||  defined __HYPHY_GTK__
+            _SimpleList choiceDummy (2,0,1), selDummy;
+            model_id = HandleListSelection (templateModelList, choiceDummy, matchingModels, "Choose one of the standard substitution models",selDummy,1,nil);
+            if (model_id==-1) {
+                terminateExecution = true;
+                return false;
+            }
+#endif
+#endif
+        }
+        modelFile = _HYStandardDirectory (HY_HBL_DIRECTORY_TEMPLATE_MODELS) &*((_String*)(*(_List*)templateModelList(matchingModels(model_id)))(4));
+        PushFilePath (modelFile, false);
+    }
+
+    _ExecutionList      stdModel;
+    if (currentProgram.nameSpacePrefix) {
+        stdModel.SetNameSpace (*currentProgram.nameSpacePrefix->GetName());
+    }
+
+    ReadBatchFile       (modelFile,stdModel);
+    PopFilePath         ();
+    lastModelUsed       = modelFile;
+
+    stdModel.stdinRedirectAux = currentProgram.stdinRedirectAux;
+    stdModel.stdinRedirect    = currentProgram.stdinRedirect;
+    stdModel.Execute();
+    stdModel.stdinRedirectAux = nil;
+    stdModel.stdinRedirect    = nil;   
+
+    return true;
+    
+}
+
+//____________________________________________________________________________________
+
+bool      _ElementaryCommand::HandleUseModel (_ExecutionList& currentProgram) {
+    
+    currentProgram.currentCommand++;
+    _String namedspacedMM (currentProgram.AddNameSpaceToID(*(_String*)parameters(0)));
+    long mID = FindModelName(namedspacedMM);
+
+    if (mID<0 && !useNoModel.Equal((_String*)parameters(0))) {
+        WarnError(*(_String*)parameters(0) & " does not refer to a valid defined substitution model in call to " & _HY_ValidHBLExpressions.RetrieveKeyByPayload(HY_HBL_COMMAND_USE_MODEL));
+        return false;
+    } else {
+        lastMatrixDeclared = mID;
+    }
+
+    return true;
+}
+
+//____________________________________________________________________________________
+bool      _ElementaryCommand::HandleSetParameter (_ExecutionList& currentProgram) {
+
+    currentProgram.currentCommand++;
+    /*
+        first check to see if matrix parameters here are valid
+    */
+    
+    _String *currentArgument = (_String*)parameters(0),
+             nmspc           = AppendContainerName(*currentArgument,currentProgram.nameSpacePrefix),
+             errMsg,
+             result;
+
+    if (currentArgument->Equal (&randomSeed)) {
+        globalRandSeed = ProcessNumericArgument ((_String*)parameters(1), currentProgram.nameSpacePrefix);
+        init_genrand (globalRandSeed);
+        setParameter (randomSeed, ((long)globalRandSeed));
+        return true;
+    }
+
+    if (currentArgument->Equal (&randomSeed)) {
+        globalRandSeed = ProcessNumericArgument ((_String*)parameters(1), currentProgram.nameSpacePrefix);
+        init_genrand (globalRandSeed);
+        setParameter (randomSeed, ((long)globalRandSeed));
+        return true;
+    }
+    
+    if (currentArgument->Equal (&deferConstrainAssignment)) {
+        bool on = ProcessNumericArgument ((_String*)parameters(1), currentProgram.nameSpacePrefix);
+        if (on) {
+            deferSetFormula = (_SimpleList*)checkPointer(new _SimpleList);
+        } else if (deferSetFormula) {
+            FinishDeferredSF ();
+        }
+        return true;
+    }
+
+    if (currentArgument->Equal (&_hyExecutionErrorMode)) {
+        currentProgram.errorHandlingMode = ProcessNumericArgument ((_String*)parameters(1), currentProgram.nameSpacePrefix);
+        return true;
+    }
+
+    if (currentArgument->Equal (&statusBarProgressValue)) {
+#if !defined __UNIX__
+        SetStatusLine     (empty,empty, empty,  ProcessNumericArgument ((_String*)parameters(1), currentProgram.nameSpacePrefix), HY_SL_PERCENT);
+#endif
+        return true;
+    }
+
+    if (currentArgument->Equal (&statusBarUpdateString)) {
+        _String sbar_value = ProcessLiteralArgument ((_String*)parameters(1), currentProgram.nameSpacePrefix);
+
+#if defined __UNIX__ 
+        #if not defined __HYPHY_GTK__ && not defined __HEADLESS__
+            SetStatusLineUser     (sbar_value);
+        #else
+            SetStatusLine (sbar_value);
+        #endif 
+#else
+        SetStatusLine     (empty,sbar_value, empty, 0, HY_SL_TASK);
+#endif
+        return true;
+    }
+
+
+    long objectIndex,
+         typeFlag    = HY_BL_ANY;
+    
+    BaseRef theObject      = _HYRetrieveBLObjectByName (nmspc, typeFlag, &objectIndex);
+    
+    switch (typeFlag)
+    {
+        case HY_BL_BGM: { // BGM Branch
+            currentArgument = (_String*)parameters(1);
+
+            _BayesianGraphicalModel * lkf = (_BayesianGraphicalModel *) theObject;
+            // set data matrix
+            if (currentArgument->Equal (&bgmData)) {
+                _Matrix     * dataMx = (_Matrix *) FetchObjectFromVariableByType ( &AppendContainerName ( *(_String *) parameters (2), currentProgram.nameSpacePrefix), MATRIX, HY_HBL_COMMAND_SET_PARAMETER);
+                if (dataMx) {
+                    long    num_nodes = ((_BayesianGraphicalModel *)lkf)->GetNumNodes();
+
+                    if (dataMx->GetVDim() == num_nodes) {
+                        ((_BayesianGraphicalModel *)lkf)->SetDataMatrix ((_Matrix *) dataMx);
+                    } else {
+                        currentProgram.ReportAnExecutionError (_String("Data matrix columns (") & dataMx->GetVDim() & " ) does not match number of nodes in graph (" & num_nodes & ")");
+                        return false;
+                    }
+                } else {
+                     return false;
+                }
+
+            }
+
+            // restore node score cache
+            else if (currentArgument->Equal (&bgmScores)) {
+                _AssociativeList * cacheAVL = (_AssociativeList *)FetchObjectFromVariableByType ( &AppendContainerName ( *(_String *) parameters (2), currentProgram.nameSpacePrefix), ASSOCIATIVE_LIST, HY_HBL_COMMAND_SET_PARAMETER);
+                if (cacheAVL) {
+                    ((_BayesianGraphicalModel *)lkf)->ImportCache (cacheAVL);
+                } else {
+                    return false;
+                }
+            }
+
+            // set structure to user-specified adjacency matrix
+            else if (currentArgument->Equal (&bgmGraph)) {
+                _Matrix     * graphMx   = (_Matrix *) FetchObjectFromVariableByType ( &AppendContainerName ( *(_String *) parameters (2), currentProgram.nameSpacePrefix), MATRIX, HY_HBL_COMMAND_SET_PARAMETER);
+
+                if (graphMx) {
+                    long    num_nodes = ((_BayesianGraphicalModel *)lkf)->GetNumNodes();
+
+                    if (graphMx->GetHDim() == num_nodes && graphMx->GetVDim() == num_nodes) {
+                        ((_BayesianGraphicalModel *)lkf)->SetStructure ((_Matrix *) graphMx->makeDynamic());
+                    } else {
+                        currentProgram.ReportAnExecutionError("Dimension of graph does not match current graph");
+                        return false;
+                    }
+                } else {
+                    return false;
+                }
+            }
+
+            // set constraint matrix
+            else if (currentArgument->Equal (&bgmConstraintMx)) {
+                _Matrix     * constraintMx  = (_Matrix *) FetchObjectFromVariableByType ( &AppendContainerName ( *(_String *) parameters (2), currentProgram.nameSpacePrefix), MATRIX, HY_HBL_COMMAND_SET_PARAMETER);
+
+                if (constraintMx) {
+                    long    num_nodes = ((_BayesianGraphicalModel *)lkf)->GetNumNodes();
+
+                    if (constraintMx->GetHDim() == num_nodes && constraintMx->GetVDim() == num_nodes) {
+                        ((_BayesianGraphicalModel *)lkf)->SetConstraints ((_Matrix *) constraintMx->makeDynamic());
+                    } else {
+                        currentProgram.ReportAnExecutionError ("Dimensions of constraint matrix do not match current graph");
+                        return false;
+                    }
+                } else {
+                    return false;
+                }
+            }
+
+            // set node order
+            else if (currentArgument->Equal (&bgmNodeOrder)) {
+                _Matrix     * orderMx   = (_Matrix *) FetchObjectFromVariableByType ( &AppendContainerName ( *(_String *) parameters (2), currentProgram.nameSpacePrefix), MATRIX, HY_HBL_COMMAND_SET_PARAMETER);
+
+                if (orderMx) {
+                    // UNDER DEVELOPMENT  April 17, 2008 afyp
+                    long    num_nodes = ((_BayesianGraphicalModel *)lkf)->GetNumNodes();
+
+                    _SimpleList     * orderList = new _SimpleList();
+
+                    orderList->Populate (num_nodes, 0, 0);
+
+                    if (orderMx->GetVDim() == num_nodes) {
+                        for (long i = 0; i < num_nodes; i++) {
+                            orderList->lData[i] = (long) ((*orderMx) (0, i));
+                        }
+
+                        ((_BayesianGraphicalModel *)lkf)->SetNodeOrder ( (_SimpleList *) orderList->makeDynamic() );
+                    } else {
+                        currentProgram.ReportAnExecutionError ("Length of order vector doesn't match number of nodes in graph");
+                        return false;
+                    }
+                } else {
+                    return false;
+                }
+            }
+
+
+            // set network parameters
+            else if (currentArgument->Equal (&bgmParameters)) {
+                    _AssociativeList* inAVL = (_AssociativeList*)FetchObjectFromVariableByType ( &AppendContainerName ( *(_String *) parameters (2), currentProgram.nameSpacePrefix), ASSOCIATIVE_LIST, HY_HBL_COMMAND_SET_PARAMETER);
+                if (inAVL) {
+                    ((_BayesianGraphicalModel *)lkf)->ImportCache (inAVL);
+                } else {
+                    return false;
+                }
+            }
+
+
+            // anything else
+            else {
+                currentProgram.ReportAnExecutionError (*currentArgument & " is not a valid BGM parameter");
+                return false;
+            }
+        } // end BGM
+        break;
+        
+        case HY_BL_SCFG:
+        case HY_BL_LIKELIHOOD_FUNCTION:
+        {
+            currentArgument = (_String*)parameters(1);
+            if (typeFlag == HY_BL_SCFG && currentArgument->Equal (&scfgCorpus)) {
+                ((Scfg*)theObject)->SetStringCorpus ((_String*)parameters(2));
+            } else {
+                _LikelihoodFunction * lkf = (_LikelihoodFunction *) theObject;
+                currentArgument = (_String*)parameters(1);
+                long g = ProcessNumericArgument(currentArgument,currentProgram.nameSpacePrefix);
+                if (g < 0 || g >= lkf->GetIndependentVars().lLength) {
+                    currentProgram.ReportAnExecutionError (*currentArgument & " (=" & g & ") is not a valid parameter index");
+                    return false;
+                }
+                currentArgument = (_String*)parameters(2);
+                lkf->SetIthIndependent (g,ProcessNumericArgument(currentArgument,currentProgram.nameSpacePrefix));
+            }
+        }
+        break;
+        // end SCFG and LF
+        
+        case HY_BL_DATASET:
+        case HY_BL_DATASET_FILTER: {
+            _DataSet * ds = nil;
+            
+            long f  = ProcessNumericArgument ((_String*)parameters(1),currentProgram.nameSpacePrefix);
+            if (typeFlag == HY_BL_DATASET) {
+                ds = (_DataSet*) theObject;
+            }
+            else {
+                _DataSetFilter *dsf = (_DataSetFilter*)theObject;
+                ds = dsf->GetData ();
+                if (f >= 0 && f < dsf->theNodeMap.lLength){
+                    f  = dsf->theNodeMap.lData[f];
+                }
+                else
+                    f = -1;
+            }
+            
+        
+            _List*  dsNames = &ds->GetNames();
+            
+            if (f<0 || f>=dsNames->lLength) {
+                currentProgram.ReportAnExecutionError (*((_String*)parameters(1)) & " (=" & f & ") is not a valid sequence index");
+                return false;
+            }
+
+            dsNames->Replace(f, new _String(ProcessLiteralArgument ((_String*)parameters(2),currentProgram.nameSpacePrefix)), false);
+        } // end data set and data set filter
+        break; 
+        // Dataset and Datasetfilter
+        
+        default:
+            // check to see if this is a calcnode
+            _CalcNode* treeNode = (_CalcNode*)FetchObjectFromVariableByType(&nmspc, TREE_NODE);
+            if (treeNode) { 
+                if (*((_String*)parameters(1)) == _String("MODEL")) {
+                    _String modelName = AppendContainerName(*((_String*)parameters(2)),currentProgram.nameSpacePrefix);
+                    long modelType = HY_BL_MODEL, modelIndex;
+                    BaseRef modelObject      = _HYRetrieveBLObjectByName (modelName, modelType, &modelIndex, true);
+                    if (modelObject) {
+                        _VariableContainer * parentTree = treeNode->ParentTree();
+                        if (!parentTree) {
+                            currentProgram.ReportAnExecutionError (*((_String*)parameters(0)) & " is an orphaned tree node (the parent tree has been deleted)");
+                            return false;
+                        }
+                        long pID, lfID = ((_TheTree*)parentTree->Compute())->IsLinkedToALF(pID);
+                        if (lfID>=0){
+                             currentProgram.ReportAnExecutionError ((*parentTree->GetName()) & " is linked to a likelihood function (" & *_HBLObjectNameByType (HY_BL_LIKELIHOOD_FUNCTION, lfID) &") and cannot be modified ");
+                             return false;
+                        }
+                        
+                        treeNode->ReplaceModel (modelName, parentTree);
+                        break;
+                    }
+                    else {
+                        currentProgram.ReportAnExecutionError (*((_String*)parameters(2)) & " does not appear to be a valid model name");
+                        return false;
+                    }
+                } else {
+                     currentProgram.ReportAnExecutionError (*((_String*)parameters(1)) & " is not a supported parameter type for a tree node argument");
+                     return false;
+                }
+            }
+            
+            currentProgram.ReportAnExecutionError (*currentArgument & " is not a valid likelihood function/data set filter/tree topology/tree node");
+            return false;
+
+    
+    } // end cases
+    return true;
+}
+
+//____________________________________________________________________________________
+
+bool      _ElementaryCommand::HandleAssert (_ExecutionList& currentProgram) {
+    currentProgram.currentCommand++;
+
+    _String assertion (*(_String*)parameters(0));
+
+    _Formula rhs, lhs;
+    _FormulaParsingContext fpc (nil, currentProgram.nameSpacePrefix);
+    if (Parse (&rhs,assertion,fpc,&lhs) == HY_FORMULA_EXPRESSION) {
+        _PMathObj assertionResult = rhs.Compute();
+        if (assertionResult && assertionResult->ObjectClass () == NUMBER) {
+            if (CheckEqual(assertionResult->Value(),0.0)) {
+                _Parameter whatToDo;
+                checkParameter (assertionBehavior, whatToDo, 0.0);
+
+                _String errMsg;
+
+                if (parameters.lLength == 1) {
+                    errMsg = _String("Assertion '") & *(_String*)parameters(0) & "' failed.";
+                } else {
+                    errMsg = ProcessLiteralArgument((_String*)parameters(1),currentProgram.nameSpacePrefix);
+                }
+
+                if (CheckEqual (whatToDo, 1.)) {
+                    StringToConsole (errMsg);
+                    NLToConsole();
+                    currentProgram.GoToLastInstruction ();
+                } else {
+                    currentProgram.ReportAnExecutionError (errMsg);
+                    return false;
+                }
+            }
+            return true;
+        }
+    }
+    currentProgram.ReportAnExecutionError(_String("Assertion statement '") & *(_String*)parameters(0) & "' could not be computed or was not numeric.");
+ 
+    return false;
+}
+
+//____________________________________________________________________________________
+
+bool      _ElementaryCommand::HandleRequireVersion(_ExecutionList& currentProgram){
+    currentProgram.currentCommand++;
+    _String theVersion = ProcessLiteralArgument ((_String*)parameters (0),currentProgram.nameSpacePrefix);
+
+    if (__KERNEL__VERSION__.toNum() < theVersion.toNum()) {
+        currentProgram.ReportAnExecutionError (_String ("Current batch file requires at least version :")& theVersion &" of HyPhy. Please download an updated version from http://www.hyphy.org and try again.");
+        return false;
+    }
+    return true;
+}
+
+//____________________________________________________________________________________
+
+bool      _ElementaryCommand::HandleDeleteObject(_ExecutionList& currentProgram){
+    currentProgram.currentCommand++;
+    for (unsigned long objCount = 0; objCount < parameters.lLength; objCount++) {
+        long       objectType = HY_BL_LIKELIHOOD_FUNCTION,
+                   f = -1;
+        BaseRef    sourceObject = _HYRetrieveBLObjectByName (AppendContainerName(*(_String*)parameters(objCount),currentProgram.nameSpacePrefix), objectType,&f,false);
+
+        if  (sourceObject) {
+            KillLFRecord (f,true);
+        }
+    }
+    return true;
+}
+
+//____________________________________________________________________________________
+
+bool      _ElementaryCommand::HandleClearConstraints(_ExecutionList& currentProgram){
+    currentProgram.currentCommand++;
+    for (unsigned long i = 0; i<parameters.lLength; i++) {
+        _String cName (currentProgram.AddNameSpaceToID(*(_String*)parameters(i)));
+        long cID = LocateVarByName (cName);
+        if (cID>=0) { // variable exists
+            FetchVar(cID)->ClearConstraints();
+        }
+    }    
+    return true;
+}
+
+//____________________________________________________________________________________
+
+bool      _ElementaryCommand::HandleMolecularClock(_ExecutionList& currentProgram){
+    currentProgram.currentCommand++;
+    
+    _String    theBaseNode          (currentProgram.AddNameSpaceToID(*(_String*)parameters(0))),
+               treeName;
+    
+    _Variable* theObject = FetchVar (LocateVarByName(theBaseNode));
+    
+    if (!theObject || (theObject->ObjectClass()!=TREE && theObject->ObjectClass()!=TREE_NODE)) {
+        WarnError (_String("Not a defined tree/tree node object '") & theBaseNode & "' in call to " & _HY_ValidHBLExpressions.RetrieveKeyByPayload(HY_HBL_COMMAND_MOLECULAR_CLOCK));
+        return false;
+    }
+    
+    _TheTree *theTree = nil;
+    if (theObject->ObjectClass() == TREE_NODE) {
+        theTree     = (_TheTree*)((_VariableContainer*)theObject)->GetTheParent();
+        if (!theTree) {
+            WarnError (_String("Internal error - orphaned tree node '") & theBaseNode & "' in call to "& _HY_ValidHBLExpressions.RetrieveKeyByPayload(HY_HBL_COMMAND_MOLECULAR_CLOCK));
+            return false;
+            
+        }
+        treeName    = *theTree->GetName();
+        theBaseNode = theObject->GetName()->Cut(treeName.sLength+1,-1);
+    } else {
+        treeName    = *theObject->GetName();
+        theTree     = (_TheTree*)theObject;
+        theBaseNode = empty;
+    }
+    
+    theTree->MolecularClock(theBaseNode,parameters);
+    return true;
+}
+
+//____________________________________________________________________________________
+
+bool      _ElementaryCommand::HandleGetURL(_ExecutionList& currentProgram){
+    currentProgram.currentCommand++;
+    
+    _String url   (ProcessLiteralArgument((_String*)parameters(1),currentProgram.nameSpacePrefix)),
+            *arg1 = (_String*)parameters(0),
+            *act  = parameters.lLength>2?(_String*)parameters(2):nil,
+            errMsg;
+
+    if (act==nil) {
+        _Variable * rec = CheckReceptacleCommandID (&AppendContainerName(*arg1,currentProgram.nameSpacePrefix),HY_HBL_COMMAND_GET_URL, true, false, &currentProgram);
+
+        if (!rec) {
+            return false;
+        }
+
+        if (Get_a_URL(url)) {
+            rec->SetValue(new _FString (url,false),false);
+        } else {
+            errMsg = _String ("Could not fetch '") & url & "'";
+        }
+    } else {
+        if (act->Equal(&getURLFileFlag)) {
+            _String fileName (ProcessLiteralArgument(arg1,currentProgram.nameSpacePrefix));
+            fileName.ProcessFileName (true,false,(Ptr)currentProgram.nameSpacePrefix);
+            if (!Get_a_URL(url, &fileName)) {
+                errMsg = _String ("Could not fetch '") & url & "'";
+            }
+        } else {
+            errMsg = "Unknown action flag";
+        }
+    }
+    if (errMsg.sLength) {
+        currentProgram.ReportAnExecutionError (errMsg); 
+        return false;
+    }
+
+    return true;
+}
+
+//____________________________________________________________________________________
+
+bool      _ElementaryCommand::HandleGetString (_ExecutionList& currentProgram){
+    currentProgram.currentCommand++;
+    
+    _String  errMsg,
+             *result = nil;
+
+    long    f,
+            sID,
+            sID2 = -1;
+
+    _Variable * theReceptacle = CheckReceptacleCommandID (&AppendContainerName(*((_String*)parameters(0)),currentProgram.nameSpacePrefix),HY_HBL_COMMAND_GET_STRING, true, false, &currentProgram);
+
+    if (!theReceptacle) {
+        return false;
+    }
+
+    sID = ProcessNumericArgument ((_String*)parameters(2),currentProgram.nameSpacePrefix);
+    if (parameters.lLength>3) {
+        sID2 = ProcessNumericArgument ((_String*)parameters(3),currentProgram.nameSpacePrefix);
+    }
+
+    f = _HY_GetStringGlobalTypes.Find((_String*)parameters(1));
+    if (f >=0 ) {
+        f = _HY_GetStringGlobalTypes.GetXtra (f);
+    }
+
+    switch (f) {
+
+        case HY_BL_LIKELIHOOD_FUNCTION: // LikelihoodFunction
+        case HY_BL_DATASET:
+        case HY_BL_DATASET_FILTER:
+        case HY_BL_SCFG:
+        case HY_BL_BGM: {
+            result = (_String*)_HBLObjectNameByType(f,sID);
+            if (result) {
+                result = (_String*) result->makeDynamic();
+				//ReportWarning(_String((const char*)"In HandleGetString(): ") & result);
+            }
+            break;
+        }
+           
+        case HY_BL_HBL_FUNCTION: // UserFunction
+            result = (_String*)_HBLObjectNameByType(HY_BL_HBL_FUNCTION,sID);
+            if (result) {
+                _AssociativeList * resAVL = (_AssociativeList *)checkPointer(new _AssociativeList);
+                resAVL->MStore ("ID", new _FString (*result), false);
+                resAVL->MStore ("Arguments", new _Matrix(*(_List*)batchLanguageFunctionParameterLists(sID)), false);
+                theReceptacle->SetValue (resAVL,false);
+                return true;
+            } 
+            break;
+            
+        case HY_BL_TREE: { // Tree
+            // 20110608 SLKP: REFACTOR into a separate function
+            // I am sure this is used somewhere else (perhaps for other types)
+            result = FetchMathObjectNameOfTypeByIndex (TREE, sID);
+            if (result) {
+                result = (_String*) result->makeDynamic();
+            }
+            break;
+        }
+
+        default: { // everything else...
+            // decide what kind of object current argument represents
+            
+            _String *currentArgument = (_String*)parameters(1),
+                    nmspaced       = AppendContainerName(*currentArgument,currentProgram.nameSpacePrefix);
+            long    typeFlag       = HY_BL_ANY,
+                    index          = -1;
+                    
+            BaseRef theObject      = _HYRetrieveBLObjectByName (nmspaced, typeFlag, &index);
+
+            if (theObject) {
+                switch (typeFlag) {
+                case HY_BL_DATASET: {
+                    _DataSet* dataSetObject = (_DataSet*)theObject;
+                    if (sID>=0 && sID<dataSetObject->NoOfSpecies()) {
+                        result = (_String*)(dataSetObject->GetNames())(sID)->makeDynamic();
+                    } else {
+                        if (sID < 0) {
+                            theReceptacle->SetValue (new _Matrix (dataSetObject->GetNames()), false);
+                            return true;
+                        }
+                    }
+                    break;
+                }
+                case HY_BL_DATASET_FILTER: {
+                    _DataSetFilter* dataSetFilterObject = (_DataSetFilter*)theObject;
+
+                    if (sID >=0 && sID<dataSetFilterObject->NumberSpecies()) {
+                        result = (_String*)(dataSetFilterObject->GetData()->GetNames())(dataSetFilterObject->theNodeMap(sID))->makeDynamic();
+                    } else {
+                        if (sID < 0) {
+                            _List filterSeqNames,
+                                  *originalNames = &dataSetFilterObject->GetData()->GetNames();
+                            for (long seqID=0; seqID<dataSetFilterObject->NumberSpecies(); seqID++) {
+                                filterSeqNames << (*originalNames)(dataSetFilterObject->theNodeMap(seqID));
+                            }
+                            theReceptacle->SetValue (new _Matrix (filterSeqNames), false);
+                            return true;
+                        }
+                    }
+                    break;
+                }
+                case HY_BL_BGM: {
+                    //ReportWarning(_String("In HandleGetString() for case HY_BL_BGM"));
+					_BayesianGraphicalModel * this_bgm      = (_BayesianGraphicalModel *) theObject;
+
+                    switch (sID) {
+                        case HY_HBL_GET_STRING_BGM_SCORE: {   // return associative list containing node score cache
+                            _AssociativeList        * export_alist  = new _AssociativeList;
+
+                            if (this_bgm -> ExportCache (export_alist)) {
+                                theReceptacle -> SetValue (export_alist, false);
+                                return true;
+                            } else {
+                                DeleteObject (export_alist);
+                                errMsg = _String ("Failed to export node score cache for BGM '") & nmspaced & "'";
+                            }
+
+                            break;
+                        }
+                        case HY_HBL_GET_STRING_BGM_SERIALIZE: {   // return associative list with network structure and parameters
+                            result = new _String (1024L, true);
+                            this_bgm -> SerializeBGM (*result);
+                            result->Finalize();
+                            theReceptacle->SetValue (new _FString (result),false);
+                            return true;
+                        }
+                        default: {
+                            errMsg = _String ("Unrecognized index ") & sID & " for a BGM object";
+                        }
+                    }
+                }
+                case HY_BL_LIKELIHOOD_FUNCTION:
+                case HY_BL_SCFG: {
+                
+                    _LikelihoodFunction *lf = (_LikelihoodFunction*)theObject;
+                    if (sID>=0) {
+                        if (sID<lf->GetIndependentVars().lLength) {
+                            result = (_String*)(LocateVar(lf->GetIndependentVars().lData[sID])->GetName())->makeDynamic();
+                        } else {
+                            if (sID<lf->GetIndependentVars().lLength+lf->GetDependentVars().lLength) {
+                                result = (_String*)(LocateVar(lf->GetDependentVars().lData[sID-lf->GetIndependentVars().lLength])->GetName())->makeDynamic();
+                            }
+                        }
+                    } else {
+                        _AssociativeList* resList = lf->CollectLFAttributes ();
+                        if (typeFlag == HY_BL_SCFG) {
+                            ((Scfg*)lf)->AddSCFGInfo (resList);
+                        }
+                        theReceptacle->SetValue (resList,false);
+                        return true;
+                    }
+                    break;
+                }
+                
+                case HY_BL_MODEL: {
+                    if (sID>=0) {
+                        // check to make see if the 
+                       if (sID2 < 0) { // get the sID's parameter name
+                            _SimpleList     modelP;
+                            _AVLList        modelPA (&modelP);
+                            ScanModelForVariables (index, modelPA, false, -1, false);
+                            modelPA.ReorderList();
+                            if (sID<modelP.lLength) {
+                                result = (_String*)LocateVar(modelP.lData[sID])->GetName()->makeDynamic();
+                            } 
+
+                        } else { // get the formula for cell (sID, sID2)
+                            if (!IsModelOfExplicitForm (index)) {
+                                _Variable*      theMx = (_Variable*)theObject;
+                                _Formula * cellFla = ((_Matrix*)theMx->GetValue())->GetFormula (sID,sID2);
+                                if (cellFla) {
+                                    result = new _String((_String*)cellFla->toStr());
+                                }
+                            }
+                        }
+                        
+                    } else {
+                        _Variable   * tV, * tV2;
+                        bool         mByF;
+                        RetrieveModelComponents (index, tV, tV2, mByF);
+
+                        if (tV) {
+                            if (sID == -1) { // branch length expression
+                                result = ((_Matrix*)tV->GetValue())->BranchLengthExpression((_Matrix*)tV2->GetValue(),mByF);
+                            } else
+                                /*
+                                    returns an AVL with keys
+                                    "RATE_MATRIX" - the ID of the rate matrix
+                                    "EQ_FREQS"    - the ID of eq. freq. vector
+                                    "MULT_BY_FREQ" - a 0/1 flag to determine which format the matrix is in.
+                                */
+                            {
+                                _AssociativeList * resList = new _AssociativeList;
+                                resList->MStore ("RATE_MATRIX",new _FString(*tV->GetName()),false);
+                                resList->MStore ("EQ_FREQS",new _FString(*tV2->GetName()),false);
+                                resList->MStore ("MULT_BY_FREQ",new _Constant (mByF),false);
+                                theReceptacle->SetValue (resList,false);
+                                return true;
+                            }
+                        }
+                    }
+                    break;
+                }
+                case HY_BL_HBL_FUNCTION: {
+                    _AssociativeList * resAVL = (_AssociativeList *)checkPointer(new _AssociativeList);
+                    resAVL->MStore ("ID", new _FString (*_HBLObjectNameByType (HY_BL_HBL_FUNCTION, index, false)), false);
+                    resAVL->MStore ("Arguments", new _Matrix(*(_List*)batchLanguageFunctionParameterLists(index)), false);
+                    resAVL->MStore("Body", new _FString (((_ExecutionList*)batchLanguageFunctions(index))->sourceText,false),false);
+                    theReceptacle->SetValue (resAVL,false);
+                    return true;
+                }
+            } // end of "switch" 
+        }
+        else {
+            if (currentArgument->Equal(&versionString)) {
+                if (sID > 1.5)
+#ifdef __HEADLESS__
+                    result = new _String(_String ("Library version ") & __KERNEL__VERSION__);
+#else
+#ifdef __MAC__
+                    result = new _String(_String("Macintosh ") & __KERNEL__VERSION__);
+#else
+#ifdef __WINDOZE__
+                    result = new _String(_String("Windows ") & __KERNEL__VERSION__);
+#else
+                    result = new _String(_String("Source ") & __KERNEL__VERSION__);
+#endif
+#endif
+#endif
+                    else if (sID > 0.5) {
+                        result = new _String(GetVersionString());
+                    } else {
+                        result = new _String(__KERNEL__VERSION__);
+                    }
+                } else if (currentArgument->Equal(&timeStamp)) {
+                    result = new _String(GetTimeStamp(sID < 0.5));
+                } else {
+                  _Variable* theVar = FetchVar(LocateVarByName (*currentArgument));
+                  if (theVar) {
+                    if (theVar->IsIndependent()) {
+                      result = (_String*)theVar->toStr();
+                    } else {
+                      if (sID == -1){
+                        
+                        _SimpleList vL;
+                        _AVLList    vAVL (&vL);
+                        theVar->ScanForVariables (vAVL, true);
+                        vAVL.ReorderList();
+                        _AssociativeList   * resL = (_AssociativeList *) checkPointer (new _AssociativeList);
+                        _List splitVars;
+                        SplitVariableIDsIntoLocalAndGlobal (vL, splitVars);
+                        InsertVarIDsInList (resL, "Global", *(_SimpleList*)splitVars(0));
+                        InsertVarIDsInList (resL, "Local",   *(_SimpleList*)splitVars(1));
+                        
+                        theReceptacle->SetValue (resL,false);
+                        return true;
+                      }
+                      
+                      else {  // formula string
+                        _Matrix * formula_matrix = (sID2 >= 0 && theVar->ObjectClass() == MATRIX) ? (_Matrix*)theVar->GetValue () : nil;
+                        if (formula_matrix) {
+                         _Formula* cell = formula_matrix->GetFormula(sID, sID2);
+                         if (cell) {
+                            result = (_String*) cell->toStr();
+                          }
+                        } else {
+                          result = (_String*)theVar->GetFormulaString ();
+                        }
+                      }
+                    }
+                  } else {
+                    errMsg = _String ("'") & *currentArgument & "' is not an allowed argument type ";
+                  }
+                }
+            }
+        }
+    }
+
+    if (errMsg.sLength) {
+        currentProgram.ReportAnExecutionError (errMsg); 
+        DeleteObject (result);
+        result = nil;    
+    }
+    
+    if (result) {
+        theReceptacle->SetValue (new _FString (result),false);
+        return true;
+    }
+
+    theReceptacle->SetValue (new _MathObject(), false);
+    
+
+    return false;
+}
+
+
+//____________________________________________________________________________________
+
+bool      _ElementaryCommand::HandleExport(_ExecutionList& currentProgram){
+
+    currentProgram.currentCommand++;
+    
+    _String objectID (currentProgram.AddNameSpaceToID(*(_String*)parameters(1))),
+            arg1 (currentProgram.AddNameSpaceToID(*(_String*)parameters(0))),
+            errMsg;
+    
+    _Variable * theReceptacle = CheckReceptacleCommandID (&AppendContainerName(arg1,currentProgram.nameSpacePrefix),HY_HBL_COMMAND_EXPORT, true, false, &currentProgram);
+    if (!theReceptacle) {
+        return false;
+    }    
+
+    _FString        * outLF = new _FString (new _String (8192L,1));
+    checkPointer    (outLF);
+    long typeFlag = HY_BL_MODEL | HY_BL_LIKELIHOOD_FUNCTION | HY_BL_DATASET_FILTER,
+             index;
+        
+    BaseRef objectToExport = _HYRetrieveBLObjectByName (objectID, typeFlag, &index);
+    if (! objectToExport) {
+        errMsg = _String ("'") & objectID & "' is not a supported type";
+    } else {
+        switch (typeFlag) {
+            case HY_BL_LIKELIHOOD_FUNCTION: {
+                ((_LikelihoodFunction*)objectToExport)->SerializeLF (*outLF->theString);
+                outLF->theString->Finalize();
+                break;
+            }
+            case HY_BL_DATASET_FILTER: {
+                outLF->theString->Finalize();
+                DeleteObject (outLF->theString);
+                checkPointer (outLF->theString = new _String ((_String*)((_DataSetFilter*)objectToExport)->toStr()));
+                break;
+            }
+            case HY_BL_MODEL: {
+                SerializeModel (*outLF->theString,index,nil,true);
+                outLF->theString->Finalize();
+                break;
+            }
+                
+        }
+    }
+
+    if (errMsg.sLength) {
+        outLF->theString->Finalize();
+        DeleteObject (outLF);
+        currentProgram.ReportAnExecutionError (errMsg); 
+        theReceptacle->SetValue (new _MathObject, false);
+        return false;
+    }
+    
+    theReceptacle->SetValue (outLF,false);
+
+    return true;
+}
+
+//____________________________________________________________________________________
+
+bool      _ElementaryCommand::HandleDifferentiate(_ExecutionList& currentProgram){
+
+    currentProgram.currentCommand++;
+   
+    _String  arg1 (currentProgram.AddNameSpaceToID(*(_String*)parameters(0))),
+             errMsg,
+             expressionToParse = *(_String*)parameters(1);
+             
+    _Formula  *theResult = nil;
+
+    _Variable * theReceptacle = CheckReceptacleCommandID (&AppendContainerName(arg1,currentProgram.nameSpacePrefix),HY_HBL_COMMAND_DIFFERENTIATE, true, false, &currentProgram);
+    if (!theReceptacle) {
+        return false;
+    }    
+
+
+    _Formula theExpression (expressionToParse,currentProgram.nameSpacePrefix, &errMsg);
+    
+    if (!theExpression.IsEmpty() && errMsg.sLength == 0) {
+        long times = 1;
+        if (parameters.lLength==4) {
+            times = ProcessNumericArgument ((_String*)parameters(3),currentProgram.nameSpacePrefix, &currentProgram);
+            if (!numericalParameterSuccessFlag) {
+                return false;
+            }
+        }
+        if (times <= 0) {
+            errMsg = "The number of times to differentiate must be a non-negative integer";
+        }
+
+        theResult = theExpression.Differentiate (*(_String*)parameters(2), false);
+        for (; times>1 && theResult; times--) {
+            _Formula * temp = theResult->Differentiate (*(_String*)parameters(2));
+            delete (theResult);
+            theResult = temp;
+        }
+    }
+
+    if (errMsg.sLength || theResult == nil) {
+        if (theResult) { 
+            delete (theResult); 
+        } else {
+            errMsg = _String("Differentiation of '") & *(_String*)parameters(1) & "' failed";
+        }
+        currentProgram.ReportAnExecutionError (errMsg); 
+        theReceptacle->SetValue (new _MathObject, false);
+        return false;
+    }
+    
+    theReceptacle->SetFormula (*theResult);
+    if (theResult) delete (theResult);
+
+    return true;
+}
+
+//____________________________________________________________________________________
+
+bool      _ElementaryCommand::HandleFprintf (_ExecutionList& currentProgram)
+{
+    currentProgram.currentCommand++;
+    _String* targetName = (_String*)parameters(0),
+             fnm;
+    
+    bool     doClose                 = true,
+             print_to_stdout         = false;
+    
+    FILE*   dest = nil;
+    
+    try {
+        bool    skipFilePathEval        = false;
+        
+        if (targetName->Equal(&stdoutDestination)) {
+            _FString * redirect = (_FString*)FetchObjectFromVariableByType (&blFprintfRedirect, STRING);
+            if (redirect && redirect->theString->sLength) {
+                if (redirect->theString->Equal (&blFprintfDevNull)) {
+                    return true; // "print" to /dev/null
+                } else {
+                    skipFilePathEval = true;
+                    targetName       = redirect->theString;
+                } 
+            }
+            else {
+                print_to_stdout = true;
+            }
+        }
+        
+        checkParameter (printDigitsSpec,printDigits,0);
+        
+        if (!print_to_stdout) {
+            fnm = *targetName;
+            if (fnm.Equal(&messageLogDestination)) {
+                if ((dest = globalMessageFile) == nil) {
+                    return true; // requested print to MESSAGE_LOG, but it does not exist
+                                 // (e.g. remote MPI nodes, or running from a read only location
+                }
+            } else {
+                if (skipFilePathEval == false && !fnm.IsALiteralArgument()) {
+                    fnm = GetStringFromFormula (&fnm,currentProgram.nameSpacePrefix);
+                }
+                
+                if (!fnm.ProcessFileName(true,false,(Ptr)currentProgram.nameSpacePrefix, false, &currentProgram)) {
+                    return false;
+                }
+                
+                
+                long k  = openFileHandles.Find (&fnm);
+                
+                doClose = k<0;
+                
+                if (!doClose) {
+                    dest = (FILE*)openFileHandles.GetXtra (k);
+                } else {
+                    if ((dest = doFileOpen (fnm.getStr(), "a")) == nil)
+                        throw  (_String  ("Could not create/open output file at path '") & fnm & "'.");
+                }
+            }
+        }
+        
+        for (long i = 1; i<parameters.lLength; i++) {
+            _String    *varname = (_String*)parameters(i);
+            
+            BaseRef    thePrintObject   =   nil;
+            _Formula   f;
+            
+            if (varname->Equal(&clearFile)) {
+                if (!print_to_stdout && dest) {
+                    fclose (dest);
+                    dest = doFileOpen (fnm.getStr(), "w");
+                    long k = openFileHandles.Find (&fnm);
+                    if (k>=0) {
+                        openFileHandles.SetXtra(k, (long)dest);
+                    }
+                }
+            } else if (varname->Equal(&keepFileOpen) && !print_to_stdout) {
+                if (openFileHandles.Find (&fnm) < 0) {
+                    openFileHandles.Insert (fnm.makeDynamic(), (long)dest);
+                }
+                doClose = false;
+            } else if (varname->Equal(&closeFile) && !print_to_stdout) {
+                openFileHandles.Delete (&fnm, true);
+                doClose = true;
+            } else if (varname->Equal(&systemVariableDump)) {
+                thePrintObject=&variableNames;
+            } else if (varname->Equal(&selfDump)) {
+                thePrintObject=¤tProgram;
+            } else {
+                // check for possible string reference
+                
+                _String    temp    = ProcessStringArgument (varname),
+                           nmspace;
+                
+                if (temp.sLength > 0) {
+                    nmspace = AppendContainerName(temp,currentProgram.nameSpacePrefix);
+                    if (nmspace.IsValidIdentifier()) {
+                        thePrintObject = FetchObjectFromVariableByType (&nmspace,HY_ANY_OBJECT);
+                    }
+                } else {
+                    nmspace = AppendContainerName(*varname,currentProgram.nameSpacePrefix);
+                }
+                
+                
+                if (thePrintObject == nil) {
+                    long typeFlag = HY_BL_ANY;
+                    
+                    thePrintObject = _HYRetrieveBLObjectByName (nmspace, typeFlag);
+                    
+                    if (!thePrintObject) {
+                        _String argCopy = *varname,
+                                errMsg;
+
+                        _FormulaParsingContext fpc (&errMsg, currentProgram.nameSpacePrefix);
+                        if (Parse (&f,argCopy, fpc, nil) == HY_FORMULA_EXPRESSION) {
+                            thePrintObject = f.Compute(0,currentProgram.nameSpacePrefix);
+                        } else {
+                            if (errMsg.sLength)
+                                throw (errMsg);
+                            else
+                                throw (_String ("Argument ") & i & " is not a simple expression");
+                        }
+                    }
+                }
+            }
+            
+            if (thePrintObject) {
+                if (!print_to_stdout) {
+                    thePrintObject->toFileStr (dest);
+                } else {
+                    _String outS ((_String*)thePrintObject->toStr());
+                    StringToConsole (outS);
+                }
+            }
+        }
+    }
+    catch (_String errMsg) {
+        currentProgram.ReportAnExecutionError (errMsg);
+    }
+    
+#if !defined __UNIX__ || defined __HEADLESS__ || defined __HYPHYQT__ || defined __HYPHY_GTK__
+    if (print_to_stdout) {
+        yieldCPUTime();
+    }
+#endif
+    if (dest && dest!=globalMessageFile && doClose) {
+        fclose (dest);
+    }
+    
+    return !currentProgram.IsErrorState();
+}
+
+
diff --git a/src/core/calcnode.cpp b/src/core/calcnode.cpp
new file mode 100644
index 0000000..5789953
--- /dev/null
+++ b/src/core/calcnode.cpp
@@ -0,0 +1,11586 @@
+/*
+
+HyPhy - Hypothesis Testing Using Phylogenies.
+
+Copyright (C) 1997-2009
+  Sergei L Kosakovsky Pond (spond at ucsd.edu)
+  Art FY Poon              (apoon at cfenet.ubc.ca)
+
+Permission is hereby granted, free of charge, to any person obtaining a
+copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be included
+in all copies or substantial portions of the Software.
+
+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.
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+*/
+
+#include "math.h"
+#include "ctype.h"
+#include "string.h"
+#include "calcnode.h"
+#include "scfg.h"
+#include "parser.h"
+
+#include "category.h"
+#include "batchlan.h"
+#include "likefunc.h"
+#include "float.h"
+
+//#ifndef     __ALTIVEC__
+//#define     ALMOST_ZERO  1e-305
+
+//#define _UBER_VERBOSE_MX_UPDATE_DUMP
+#define _UBER_VERBOSE_MX_UPDATE_DUMP_LF_EVAL 1
+
+
+#define     ANCESTRAL_SCALING_MAX 16
+#define     ALMOST_ZERO           0.0
+//#else
+//#define     ALMOST_ZERO  1e-35
+//#endif
+
+
+#define     TREE_V_SHIFT            8.0
+#define     TREE_H_SHIFT            10.0
+
+#define     LIKELIHOOD_SCALER           1.0
+#define     LIKELIHOOD_SCALER_INT       1.0
+
+#define     DEGREES_PER_RADIAN          57.29577951308232286465
+
+
+extern      _Parameter   explicitFormMatrixExponential;
+extern      _String      VerbosityLevelString,
+            BRANCH_LENGTH_STENCIL;
+
+long*       nonZeroNodes = nil,
+            nonZeroNodesDim = 0;
+            
+extern      long    likeFuncEvalCallCount;
+
+#ifdef      __MP__
+    #include <pthread.h>
+    struct   ThreadMatrixTask {
+        long   cID,
+               tcat,
+               startAt,
+               endAt;
+        _SimpleList* updateCN;
+
+    };
+    pthread_t*       matrixThreads = nil;
+    ThreadMatrixTask*matrixTasks = nil;
+    pthread_mutex_t  matrixMutex = PTHREAD_MUTEX_INITIALIZER;
+#endif
+
+char        isDefiningATree         = 0,
+            takeBranchLengths       = 0,
+            autoSolveBranchLengths  = 0;
+
+_Parameter  ignoringInternalNames   = 0.0;
+
+_Parameter  treeLayoutVert,
+            scalingLogConstant    = log (1.e300);
+
+_SimpleList convertedMatrixExpressionsL;
+_AVLListX   convertedMatrixExpressions (&convertedMatrixExpressionsL);
+
+_String     expectedNumberOfSubs  = "EXPECTED_NUMBER_OF_SUBSTITUTIONS",
+            stringSuppliedLengths = "STRING_SUPPLIED_LENGTHS",
+            noInternalLabels      = "NO_INTERNAL_LABELS",
+            includeModelSpecs      = "INCLUDE_MODEL_SPECS",
+            acceptRootedTrees    = "ACCEPT_ROOTED_TREES",
+            acceptBranchLengths    = "ACCEPT_BRANCH_LENGTHS",
+            autoConvertBL         = "AUTOMATICALLY_CONVERT_BRANCH_LENGTHS",
+            splitNodeNames         = "SPLIT_NODE_NAMES",
+            internalNodePrefix     = "INTERNAL_NODE_PREFIX",
+            ignoreUserINames       = "IGNORE_INTERNAL_NODE_LABELS",
+            cotNode               = "COT_NODE",
+            cotSplit             = "COT_SPLIT",
+            cotBranchLength         = "COT_BRANCH_LENGTH",
+            cotDistance              = "COT_DISTANCE",
+            cotCDF                 = "COT_CDF",
+            cotSamples           = "COT_SAMPLES",
+            cotSampler            = "COT_SAMPLER",
+            cotToNode              = "COT_TO_NODE",
+            treeOutputAVL          = "TREE_OUTPUT_OPTIONS",
+            treeOutputBackground  = "TREE_OUTPUT_BACKGROUND",
+            treeOutputRightMargin = "TREE_OUTPUT_RIGHT_MARGIN",
+            treeOutputEmbed       = "TREE_OUTPUT_EMBED",
+            treeOutputXtraMargin  = "TREE_OUTPUT_XTRA_MARGIN",
+            treeOutputSplit        = "TREE_OUTPUT_BRANCH_SPLIT",
+            treeOutputNotchesColor= "TREE_OUTPUT_BRANCH_NOTCHES_COLOR",
+            treeOutputNotches   = "TREE_OUTPUT_BRANCH_NOTCHES",
+            treeOutputLabel       = "TREE_OUTPUT_BRANCH_LABEL",
+            treeOutputTLabel   = "TREE_OUTPUT_BRANCH_TLABEL",
+            treeOutputColor         = "TREE_OUTPUT_BRANCH_COLOR",
+            treeOutputThickness      = "TREE_OUTPUT_BRANCH_THICKNESS",
+            treeOutputLinecap    = "TREE_OUTPUT_BRANCH_LINECAP",
+            treeOutputDash         = "TREE_OUTPUT_BRANCH_DASH",
+            treeOutputOLabel   = "TREE_OUTPUT_OVER_BRANCH",
+            treeOutputSymbols   = "TREE_OUTPUT_SYMBOLS",
+            treeOutputSymbolSize  = "TREE_OUTPUT_SYMBOL_SIZE",
+            treeOutputExtraPS     = "TREE_OUTPUT_EXTRA_POSTSCRIPT",
+            treeOutputPrefixPS      = "TREE_OUTPUT_PREFIX_POSTSCRIPT",
+            treeOutputLayout   = "TREE_OUTPUT_LAYOUT",
+            treeOutputNNPlaceH      = "__NODE_NAME__",
+            treeOutputFSPlaceH     = "__FONT_SIZE__",
+            largeMatrixBranchLengthDimension
+            = "LARGE_MATRIX_BRANCH_LENGTH_MODIFIER_DIMENSION",
+            largeMatrixBranchLength
+            = "LARGE_MATRIX_BRANCH_LENGTH_MODIFIER",
+            newNodeGraftName      = "NAME",
+            newNodeGraftWhere      = "WHERE",
+            newNodeGraftParent   = "PARENT",
+            newNodeGraftLength   = "LENGTH",
+            newNodeGraftParentLength = "PARENT_LENGTH",
+            eqWithReroot        = "Equal with reroot at ",
+            eqWithoutReroot       = "Equal without rerooting",
+            iNodePrefix;
+
+_Parameter  _timesCharWidths[256]= { // Hardcoded relative widths of all 255 characters in the Times font, for the use of PSTreeString
+    0,0.721569,0.721569,0.721569,0.721569,0.721569,0.721569,0.721569,0,0.25098,0.721569,0.721569,0.721569,0,0.721569,0.721569,
+    0.721569,0.721569,0.721569,0.721569,0.721569,0.721569,0.721569,0.721569,0.721569,0.721569,0.721569,0.721569,0.721569,0,0.721569,0.721569,
+    0.25098,0.333333,0.407843,0.501961,0.501961,0.831373,0.776471,0.180392,0.333333,0.333333,0.501961,0.564706,0.25098,0.333333,0.25098,0.278431,
+    0.501961,0.501961,0.501961,0.501961,0.501961,0.501961,0.501961,0.501961,0.501961,0.501961,0.278431,0.278431,0.564706,0.564706,0.564706,0.443137,
+    0.921569,0.721569,0.666667,0.666667,0.721569,0.611765,0.556863,0.721569,0.721569,0.333333,0.388235,0.721569,0.611765,0.890196,0.721569,0.721569,
+    0.556863,0.721569,0.666667,0.556863,0.611765,0.721569,0.721569,0.945098,0.721569,0.721569,0.611765,0.333333,0.278431,0.333333,0.470588,0.501961,
+    0.333333,0.443137,0.501961,0.443137,0.501961,0.443137,0.333333,0.501961,0.501961,0.278431,0.278431,0.501961,0.278431,0.776471,0.501961,0.501961,
+    0.501961,0.501961,0.333333,0.388235,0.278431,0.501961,0.501961,0.721569,0.501961,0.501961,0.443137,0.478431,0.2,0.478431,0.541176,0.721569,
+    0.721569,0.721569,0.666667,0.611765,0.721569,0.721569,0.721569,0.443137,0.443137,0.443137,0.443137,0.443137,0.443137,0.443137,0.443137,0.443137,
+    0.443137,0.443137,0.278431,0.278431,0.278431,0.278431,0.501961,0.501961,0.501961,0.501961,0.501961,0.501961,0.501961,0.501961,0.501961,0.501961,
+    0.501961,0.4,0.501961,0.501961,0.501961,0.34902,0.454902,0.501961,0.760784,0.760784,0.980392,0.333333,0.333333,0.54902,0.890196,0.721569,
+    0.713725,0.54902,0.54902,0.54902,0.501961,0.576471,0.494118,0.713725,0.823529,0.54902,0.27451,0.27451,0.309804,0.768627,0.666667,0.501961,
+    0.443137,0.333333,0.564706,0.54902,0.501961,0.54902,0.611765,0.501961,0.501961,1,0.25098,0.721569,0.721569,0.721569,0.890196,0.721569,
+    0.501961,1,0.443137,0.443137,0.333333,0.333333,0.54902,0.494118,0.501961,0.721569,0.168627,0.745098,0.333333,0.333333,0.556863,0.556863,
+    0.501961,0.25098,0.333333,0.443137,1,0.721569,0.611765,0.721569,0.611765,0.611765,0.333333,0.333333,0.333333,0.333333,0.721569,0.721569,
+    0.788235,0.721569,0.721569,0.721569,0.721569,0.278431,0.333333,0.333333,0.333333,0.333333,0.333333,0.333333,0.333333,0.333333,0.333333,0.333333
+},
+_maxTimesCharWidth = 0.980392;
+
+
+#ifdef    __HYPHYDMALLOC__
+#include "dmalloc.h"
+#endif
+
+//__________________________________________________________________________________
+
+_Parameter  computeChordLength (_Parameter l, _Parameter angle, _Parameter* maxCoord = nil)
+{
+    _Parameter sinV        = sin(angle),
+               cosV         = cos(angle);
+
+    if (maxCoord) {
+        maxCoord[0] = MAX (maxCoord[0], cosV*l);
+        maxCoord[1] = MIN (maxCoord[1], cosV*l);
+        maxCoord[2] = MAX (maxCoord[2], sinV*l);
+        maxCoord[3] = MIN (maxCoord[3], sinV*l);
+    }
+
+    return l/MAX(fabs(sinV),fabs(cosV));
+}
+
+//__________________________________________________________________________________
+
+#define MIN_TEX_HEIGHT   50
+#define MIN_TEX_WIDTH    50
+#define MAX_TEX_WIDTH    160
+#define MAX_TEX_HEIGHT   150
+#define WIDTH_PER_BRANCH 10
+
+
+//_______________________________________________________________________________________________
+
+_CalcNode::_CalcNode    ()
+{
+    theProbs = nil;    // default constructor, doesn't do much
+    compExp = nil;
+    referenceNode=-1;
+}
+
+//_______________________________________________________________________________________________
+_CalcNode::_CalcNode    (_String name, _String parms, int codeBase, _VariableContainer* theP, _AVLListXL* aCache):_VariableContainer (name, "", theP)
+    // construct a node from a string of the form
+    // matrix name, <optional comma separated variable declarations, inititalizations>
+    // also should be passed the pointer to a container tree
+{
+    InitializeCN (parms, codeBase, theP, aCache);
+}
+
+//_______________________________________________________________________________________________
+_CalcNode::_CalcNode    (_CalcNode* sourceNode, _VariableContainer* theP):_VariableContainer (sourceNode->ContextFreeName(), "", theP) {
+    _String model = *sourceNode->GetModelName();
+    InitializeCN (model, 0, theP);
+    if (model.sLength) { // copy model parameter values 
+        CopyMatrixParameters(sourceNode, true);
+    }
+}
+
+//_______________________________________________________________________________________________
+void    _CalcNode::InitializeCN     ( _String& parms, int, _VariableContainer* theP, _AVLListXL* aCache)
+{
+    if (theIndex < 0) return;
+    
+    cBase         = 0;
+    theProbs      = nil;
+    compExp       = nil;
+    referenceNode = -1;
+    slaveNodes    = 0;
+
+    long f = parms.Find(','),
+         g = -1;
+
+    _String            matrixName (parms,0, f>=0?f-1:-1);
+
+    InitializeVarCont (empty, matrixName, theP, aCache);
+
+    if (GetModelIndex() == HY_NO_MODEL && parms.Length()) {
+        f = 0;
+    }
+
+    while (f!=-1) {
+        g = parms.Find (',',f+1,-1);
+        if (f==0) {
+            f=-1;
+        }
+
+        if (g!=-1) {
+            _String  paramName (parms,f+1,g-1);
+            _Formula fg (paramName, this);
+        } else {
+            _String  paramName (parms,f+1,g);
+            _Formula fg (paramName, this);
+        }
+        f = g;
+    }
+
+    // attach the variables to the lists inside the node
+    ScanAndAttachVariables();
+    
+    // check for category variables
+    if (iVariables) {
+        for (f = iVariables->lLength-2; f>=0 && iVariables->lData[f+1] >= 0; f-=2) {
+            _Variable *theV = LocateVar(iVariables->lData[f+1]);
+            if (theV->IsCategory()) { 
+                        /* this has to do with local category variables; 
+                           NOT TESTED and could be BROKEN
+                        */
+                _CategoryVariable* theCV = (_CategoryVariable*)theV;
+
+                _Formula           newDensity,
+                                   newCumulative;
+
+                _SimpleList        iv,
+                                   iv2,
+                                   dv,
+                                   dv2;
+
+                for (unsigned long k = 0; k<iVariables->lLength; k+=2) {
+                    iv  << iVariables->lData[k];
+                    iv2 << iVariables->lData[k+1];
+                }
+
+                if (dVariables)
+                    for (unsigned long k = 0; k<dVariables->lLength; k+=2) {
+                        dv  << dVariables->lData[k];
+                        dv2 << dVariables->lData[k+1];
+                    }
+
+
+                newDensity.LocalizeFormula    (theCV->GetDensity(),   *GetName(), iv, iv2, dv,dv2);
+                newCumulative.LocalizeFormula (theCV->GetCumulative(),*GetName(), iv, iv2, dv,dv2);
+
+                _CategoryVariable newCV;
+                newCV.Duplicate (theCV);
+                newCV.GetDensity().Duplicate((BaseRef)&newDensity);
+                newCV.GetCumulative().Duplicate((BaseRef)&newCumulative);
+
+                theV = LocateVar(iVariables->lData[f]);
+                newCV.GetName()->Duplicate (theV->GetName());
+                ReplaceVar(&newCV);
+
+                categoryVariables<<iVariables->lData[f];
+                categoryIndexVars<<iVariables->lData[f+1];
+                iVariables->Delete(f);
+                iVariables->Delete(f);
+            }
+        }
+
+        if (iVariables->lLength) {
+            iVariables->TrimMemory();
+        } else {
+            delete (iVariables);
+            iVariables = nil;
+        }
+    }
+    if (gVariables) {
+        for (f = gVariables->lLength-1; f>=0; f--) {
+            _Variable *theV = LocateVar(gVariables->lData[f]);
+            if (theV->IsCategory()) {
+                categoryVariables<<gVariables->lData[f];
+                categoryIndexVars<<-1;
+                gVariables->Delete(f);
+            }
+        }
+        if (gVariables->lLength) {
+            gVariables->TrimMemory();
+        } else {
+            delete (gVariables);
+            gVariables = nil;
+        }
+    }
+
+    BaseRef temp =  (variablePtrs(theIndex));
+    variablePtrs[theIndex]=this->makeDynamic();
+    DeleteObject(temp);
+
+}
+
+//__________________________________________________________________________________
+void    _CalcNode::SetModel (long modelID, _AVLListXL* varCache)
+{
+   _VariableContainer::SetModel (modelID, varCache);
+}
+
+//_______________________________________________________________________________________________
+
+long      _CalcNode::SetDependance (long varIndex)
+{
+    varIndex = _VariableContainer::SetDependance (varIndex);
+    if (varIndex >= 0) {
+        _SimpleList checkVars;
+        _AVLList    myVars (&checkVars);
+        LocateVar (varIndex)->ScanForVariables (myVars,true);
+
+        for (long k=0; k<checkVars.lLength; k++)
+            if (LocateVar(checkVars.lData[k])->IsCategory() &&(categoryVariables >> checkVars.lData[k])) {
+                categoryIndexVars<<-1;
+            }
+
+    }
+    return varIndex;
+}
+
+//_______________________________________________________________________________________________
+
+void    _CalcNode::SetCodeBase (int codeBase)
+{
+    if (codeBase>0) {
+        if ((codeBase != cBase)||!theProbs) {
+#ifndef __HYALTIVEC__
+            if (theProbs) {
+                delete theProbs;
+            }
+            theProbs = new _Parameter [codeBase];
+#else
+            if (theProbs) {
+                vec_free(theProbs);
+            }
+            theProbs = (_Parameter*)VecMemAllocate(codeBase*sizeof(_Parameter));
+#endif
+            cBase = codeBase;
+            theProbs[0]=1.0;
+        } else {
+            theProbs[0]=1.0;
+        }
+    }
+}
+
+//_______________________________________________________________________________________________
+void    _CalcNode::SetCompMatrix (long categID)
+{
+    compExp = GetCompExp (categID);
+}
+
+//_______________________________________________________________________________________________
+
+_CalcNode::~_CalcNode (void)
+{
+
+#ifndef __HYALTIVEC__
+    if (theProbs) {
+        delete [] theProbs;
+    }
+#else
+    if (theProbs) {
+        vec_free(theProbs);
+    }
+#endif
+    if (compExp && referenceNode < 0) {
+        DeleteObject (compExp);
+    }
+}
+
+//_______________________________________________________________________________________________
+
+long    _CalcNode::FreeUpMemory (long)
+{
+    long res = 0;
+    if (compExp && referenceNode < 0) {
+        res = compExp->GetMySize();
+        DeleteObject (compExp);
+        compExp = nil;
+    }
+    return res;
+}
+
+//__________________________________________________________________________________
+
+void _CalcNode::RemoveModel (void)
+{
+  
+    if (compExp && referenceNode < 0) {
+        DeleteObject (compExp);
+        compExp = nil;
+    }
+  
+    if (matrixCache) {
+      
+    }
+
+    categoryVariables.Clear();
+    categoryIndexVars.Clear();
+    remapMyCategories.Clear();
+
+    Clear();
+
+}
+
+//__________________________________________________________________________________
+
+void _CalcNode::ReplaceModel (_String& modelName, _VariableContainer* theConext)
+{
+    RemoveModel    ();
+    DeleteVariable (theIndex, false); // this will clean up all the node.xx variables
+    InitializeCN   (modelName, 0 , theConext);
+}
+
+//_______________________________________________________________________________________________
+bool    _CalcNode::MatchSubtree (_CalcNode* mNode)
+{
+    node <long>* myNode    = LocateMeInTree (),
+                 * matchNode = mNode->LocateMeInTree ();
+    if (myNode&&matchNode) {
+        return myNode->compare_subtree(matchNode);
+    }
+    return      false;
+}
+
+//_______________________________________________________________________________________________
+
+_Parameter  _CalcNode::BranchLength (void)
+{
+
+    if (theModel < 0) {
+        return Value();
+    }
+
+    _FString   *stencil = (_FString*)FetchObjectFromVariableByType (&BRANCH_LENGTH_STENCIL,STRING);
+
+    if (stencil && stencil->theString->Equal (&stringSuppliedLengths)) {
+        return Value();
+    }
+
+
+    _Matrix     *freqMx,
+                *theMx;
+
+    bool        mbf;
+
+    RetrieveModelComponents (theModel, theMx, freqMx, mbf);
+
+    if (!freqMx && !theModel) {
+        return Value();
+    }
+
+    _Parameter              weight = 1.0,
+                            result = 0.0;
+
+    long                    categoryCounter,
+                            totalCategs = 1;
+
+    _CategoryVariable* cVar = nil;
+
+    if (categoryVariables.lLength) {
+        for (categoryCounter = 0; categoryCounter<categoryVariables.lLength; categoryCounter++) {
+            cVar = (_CategoryVariable*)LocateVar (categoryVariables.lData[categoryCounter]);
+            cVar->Refresh();
+            totalCategs *= cVar->GetNumberOfIntervals();
+        }
+    }
+
+    freqMx = (_Matrix*)freqMx->ComputeNumeric();
+    categoryCounter = 0;
+
+    do {
+        if (categoryVariables.lLength) {
+            long c = categoryCounter;
+            weight = 1.0;
+            for (long k=categoryVariables.lLength-1; k>=0; k--) {
+                cVar = (_CategoryVariable*)LocateVar (categoryVariables.lData[k]);
+                long t = cVar->GetNumberOfIntervals();
+                cVar->SetIntervalValue(c%t);
+                weight*=cVar->GetIntervalWeight(c%t);
+                c/=t;
+            }
+        }
+
+        _Matrix*    theMx   = ComputeModelMatrix();
+        _Parameter  expSubs = theMx->ExpNumberOfSubs (freqMx, mbf);
+
+        _Parameter divisor;
+        checkParameter (largeMatrixBranchLengthDimension, divisor, 20.);
+
+        if (theMx->GetHDim()>divisor) {
+            checkParameter (largeMatrixBranchLength, divisor, 3.);
+            expSubs /= divisor;
+        }
+
+        categoryCounter++;
+        result += fabs(expSubs)*weight;
+    } while (categoryCounter<totalCategs);
+
+    return result;
+}
+
+
+//_______________________________________________________________________________________________
+
+_Parameter& _CalcNode::operator[] (unsigned long i)
+{
+    return theProbs [i];
+}
+
+//_______________________________________________________________________________________________
+
+BaseRef _CalcNode::toStr (void)
+{
+    _String * res = new _String (16L, true);
+    checkPointer (res);
+    (*res) << theName;
+    (*res) << '(';
+
+    if (iVariables) {
+        _String tempS = (long)(iVariables->lLength/2);
+        (*res) << &tempS;
+    } else {
+        (*res) << '0';
+    }
+    (*res) << ',';
+    if (dVariables) {
+        _String tempS = (long)(dVariables->lLength/2);
+        (*res) << &tempS;
+    } else {
+        (*res) << '0';
+    }
+
+    (*res) << ')';
+    res->Finalize();
+    return res;
+}
+
+//__________________________________________________________________________________
+
+void    _CalcNode::Duplicate (BaseRef theO)
+{
+    _VariableContainer::Duplicate (theO);
+    cBase         = 0;
+    compExp       = nil;
+    matrixCache   = nil;
+    theProbs      = nil;
+    lastState     = -1;
+    referenceNode = -1;
+    slaveNodes    = 0;
+}
+
+//_______________________________________________________________________________________________
+
+bool        _CalcNode::HasChanged(void)
+{
+    if (_VariableContainer::HasChanged()) {
+        return true;
+    }
+    for (long i = 0; i<categoryVariables.lLength; i++)
+        if (LocateVar (categoryVariables.lData[i])->HasChanged()) {
+            return true;
+        }
+    return false;
+}
+
+//_______________________________________________________________________________________________
+
+long        _CalcNode::CheckForReferenceNode(void)
+{
+    long rN = -1,
+         idx = 0;
+
+    // check if all independents are global first
+    long modIdx = GetModelIndex();
+
+    if (modIdx != HY_NO_MODEL) {
+
+        if (iVariables && iVariables->lLength) {
+            return -1;
+        }
+
+        if (dVariables)
+            for (idx = 0; idx < dVariables->lLength; idx+=2) {
+                if (dVariables->lData[idx+1]>=0) {
+                    bool       good = false;
+                    _Variable* thisDep = LocateVar (dVariables->lData[idx]);
+                    //while (thisDep->NumberOperations() == 1)
+                    while (thisDep->varFormula && thisDep->varFormula->NumberOperations () == 1) {
+                        _Operation* op = (_Operation*)thisDep->varFormula->GetList() (0);
+                        long        isVar = op->GetAVariable();
+                        if (isVar >= 0) {
+                            thisDep = LocateVar (isVar);
+                            if (thisDep->IsIndependent()) {
+                                good = true;
+                                break;
+                            }
+                        } else {
+                            break;
+                        }
+                    }
+
+                    if (good) {
+                        if (thisDep->IsGlobal()) {
+                            continue;
+                        } else {
+                            _String varName = *thisDep->GetName();
+                            long    dot = varName.FindBackwards ('.',0,-1);
+                            if (dot > 0) {
+                                varName.Trim (0,dot-1);
+                                dot = LocateVarByName (varName);
+                                if (dot < 0) {
+                                    break;
+                                }
+
+                                if (rN == -1) {
+                                    thisDep = FetchVar (dot);
+
+                                    if (thisDep->ObjectClass () != TREE_NODE) {
+                                        break;
+                                    }
+
+                                    if (((_CalcNode*)thisDep)->GetModelIndex() != modIdx) {
+                                        break;
+                                    }
+
+                                    rN = thisDep->GetAVariable();
+                                } else {
+                                    if (rN != variableNames.GetXtra(dot)) {
+                                        break;
+                                    }
+                                }
+                            } else {
+                                break;
+                            }
+                        }
+                    }
+                }
+            }
+    }
+    return rN;
+}
+
+//_______________________________________________________________________________________________
+
+bool        _CalcNode::NeedToExponentiate(long catID)
+{
+    if (isInOptimize && referenceNode>=0) {
+        return ((_CalcNode*)LocateVar(referenceNode))->NeedToExponentiate(catID);
+    }
+
+    if (_VariableContainer::NeedToExponentiate(catID>=0)) {
+        return true;
+    }
+
+    if (catID==-1) {
+        if (!compExp) {
+            return true;
+        }
+
+        for (unsigned long i = 0; i<categoryVariables.lLength; i++)
+            if (LocateVar (categoryVariables.lData[i])->HasChanged()) {
+                return true;
+            }
+    } else {
+        if (!GetCompExp(catID)) {
+            return true;
+        }
+
+        for (unsigned long i = 0; i<categoryVariables.lLength; i++)
+            if (((_CategoryVariable*)LocateVar (categoryVariables.lData[i]))->HaveParametersChanged(remapMyCategories.lData[catID*(categoryVariables.lLength+1)+i+1])) {
+                return true;
+            }
+    }
+    return false;
+}
+
+//_______________________________________________________________________________________________
+bool        _CalcNode::RecomputeMatrix  (long categID, long totalCategs, _Matrix* storeRateMatrix, _List* queue, _SimpleList* tags, _List* bufferedOps)
+{
+    // assumed that NeedToExponentiate was called prior to this function
+
+    if (isInOptimize)
+        if (referenceNode >= 0) {
+            //fprintf (stderr, "\n\n********** REFERENCE NODE ******************\n\n");
+            _CalcNode* rN = (_CalcNode*)LocateVar(referenceNode);
+            rN->RecomputeMatrix (categID, totalCategs, storeRateMatrix);
+
+            if (totalCategs>1) {
+                matrixCache[categID] = rN->matrixCache[categID];
+                compExp = matrixCache[categID];
+            } else {
+                compExp = rN->compExp;
+            }
+
+            return false;
+        } else {
+            if (referenceNode<-1) {
+                slaveNodes++;
+                if (slaveNodes>1) {
+                    if (slaveNodes == -referenceNode) {
+                        slaveNodes = 0;
+                    }
+                    return false;
+                }
+            }
+        }
+
+
+    _Variable* curVar, *locVar;
+
+
+    if (iVariables)
+        for (unsigned long i=0; i<iVariables->lLength; i+=2)
+            if (iVariables->lData[i+1]>=0) {
+                curVar = LocateVar (iVariables->lData[i+1]);
+                if (curVar->IsIndependent()) {
+                    locVar = LocateVar (iVariables->lData[i]);
+                    curVar->SetValue(locVar->Compute());
+                    #ifdef _UBER_VERBOSE_MX_UPDATE_DUMP
+                      if (1 || likeFuncEvalCallCount == _UBER_VERBOSE_MX_UPDATE_DUMP_LF_EVAL) {
+                        fprintf (stderr, "[_CalcNode::RecomputeMatrix] Node %s, var %s, value = %15.12g\n", GetName()->sData, curVar->GetName()->sData, curVar->Compute()->Value());
+                      }
+                    #endif
+                }
+            }
+
+    if (dVariables)
+        for (unsigned long i=0; i<dVariables->lLength; i+=2)
+            if (dVariables->lData[i+1]>=0) {
+                curVar = LocateVar (dVariables->lData[i+1]);
+                if (curVar->IsIndependent()) {
+                    locVar = LocateVar (dVariables->lData[i]);
+                    curVar->SetValue(locVar->Compute());
+                    #ifdef _UBER_VERBOSE_MX_UPDATE_DUMP
+                      if (1 || likeFuncEvalCallCount == _UBER_VERBOSE_MX_UPDATE_DUMP_LF_EVAL) {
+                        fprintf (stderr, "[_CalcNode::RecomputeMatrix] Node %s, var %s, value = %15.12g\n", GetName()->sData, curVar->GetName()->sData, curVar->Compute()->Value());
+                      }
+                    #endif
+                }
+            }
+    
+    #ifdef _UBER_VERBOSE_MX_UPDATE_DUMP
+      if (1|| likeFuncEvalCallCount == _UBER_VERBOSE_MX_UPDATE_DUMP_LF_EVAL && gVariables) {
+        for (unsigned long i=0; i<gVariables->lLength; i++) {
+          _Variable* curVar = LocateVar(gVariables->GetElement(i));
+          fprintf (stderr, "[_CalcNode::RecomputeMatrix] Node %s, var %s, value = %15.12g\n", GetName()->sData, curVar->GetName()->sData, curVar->Compute()->Value());
+        }
+      }
+    #endif
+
+
+    for (unsigned long i=0; i<categoryVariables.lLength; i++) {
+        if (categoryIndexVars.lData[i]<0) {
+            continue;
+        }
+        curVar = LocateVar (categoryIndexVars.lData[i]);
+        locVar = LocateVar (categoryVariables.lData[i]);
+        curVar->SetValue(locVar->Compute());
+    }
+
+    if (!storeRateMatrix)
+        if (totalCategs>1) {
+          #ifdef _UBER_VERBOSE_MX_UPDATE_DUMP
+            fprintf (stderr, "[_CalcNode::RecomputeMatrix] Deleting category %ld for node %s at %p\n", categID, GetName()->sData, GetCompExp(categID));
+          #endif
+          DeleteObject(GetCompExp(categID, true));
+          
+        } else if (compExp) {
+            DeleteObject (compExp);
+            compExp = nil;
+        }
+
+    bool    isExplicitForm  = HasExplicitFormModel ();
+    
+    if (isExplicitForm && bufferedOps) {
+        _Matrix * bufferedExp = (_Matrix*)GetExplicitFormModel()->Compute (0,nil, bufferedOps);
+        #ifdef _UBER_VERBOSE_MX_UPDATE_DUMP
+            fprintf (stderr, "[_CalcNode::RecomputeMatrix] Setting (buffered) category %ld/%ld for node %s\n", categID, totalCategs, GetName()->sData);
+         #endif
+        SetCompExp ((_Matrix*)bufferedExp->makeDynamic(), totalCategs>1?categID:-1);
+        return false;
+    }
+
+    unsigned long      previous_length = queue && tags ? queue->lLength: 0;
+    _Matrix * myModelMatrix = GetModelMatrix(queue,tags); 
+    
+    if (isExplicitForm && !myModelMatrix) { // matrix exponentiations got cached
+        if (queue->lLength > previous_length) {
+            return true;
+        } else {
+            WarnError ("Internal error");
+            return false;
+        }
+    } else {
+
+        if (myModelMatrix->MatrixType()!=_POLYNOMIAL_TYPE) {
+            _Matrix *temp = nil;
+            if (isExplicitForm) {
+                temp = (_Matrix*)myModelMatrix->makeDynamic();
+            } else {
+                temp = (_Matrix*)myModelMatrix->MultByFreqs(theModel);
+            }
+
+            if (dVariables)
+                for (unsigned long i=0; i<dVariables->lLength; i+=2)
+                    if (dVariables->lData[i+1]>=0) {
+                        curVar = LocateVar (dVariables->lData[i+1]);
+                        if (!curVar->IsIndependent()) {
+                            locVar = LocateVar (dVariables->lData[i]);
+                            if (locVar->IsIndependent()) {
+                                locVar->SetValue (curVar->Compute());
+                            }
+                        }
+                    }
+
+            if (storeRateMatrix) {
+                storeRateMatrix->Duplicate(temp);
+                return isExplicitForm;
+            }
+
+
+            if (queue) {
+                (*queue) << temp;
+                if (tags) {
+                    (*tags) << (isExplicitForm);
+                }
+                return isExplicitForm;
+            }
+
+            #ifdef _UBER_VERBOSE_MX_UPDATE_DUMP
+                fprintf (stderr, "[_CalcNode::RecomputeMatrix] Setting category %ld/%ld for node %s\n", categID, totalCategs, GetName()->sData);
+            #endif
+            SetCompExp ((_Matrix*)(isExplicitForm?temp:temp->Exponentiate()), totalCategs>1?categID:-1);
+
+        } else {
+            compExp = (_Matrix*)myModelMatrix->Evaluate(false);
+        }
+    }
+    return false;
+}
+
+//_______________________________________________________________________________________________
+void        _CalcNode::SetCompExp  (_Matrix* m, long catID)
+{
+    compExp = m;
+    if (catID >= 0 && matrixCache) {
+        if (remapMyCategories.lLength) {
+            catID = remapMyCategories.lData[catID*(categoryVariables.lLength+1)];
+        }
+        matrixCache[catID] = compExp;
+    }
+}
+//_______________________________________________________________________________________________
+_Matrix*        _CalcNode::ComputeModelMatrix  (bool)
+{
+    // assumed that NeedToExponentiate was called prior to this function
+    _Variable   * curVar,
+                *locVar;
+
+    if (iVariables)
+        for (unsigned long i=0; i<iVariables->lLength; i+=2)
+            if (iVariables->lData[i+1]>=0) {
+                curVar = LocateVar (iVariables->lData[i+1]);
+                if (curVar->IsIndependent()) {
+                    locVar = LocateVar (iVariables->lData[i]);
+                    curVar->SetValue(locVar->Compute());
+                }
+            }
+
+    if (dVariables)
+        for (unsigned long i=0; i<dVariables->lLength; i+=2)
+            if (dVariables->lData[i+1]>=0) {
+                curVar = LocateVar (dVariables->lData[i+1]);
+                if (curVar->IsIndependent()) {
+                    locVar = LocateVar (dVariables->lData[i]);
+                    curVar->SetValue(locVar->Compute());
+                }
+            }
+
+    _Matrix * modelMx = GetModelMatrix();
+    if (modelMx && modelMx->ObjectClass()==MATRIX && modelMx->MatrixType()!=_POLYNOMIAL_TYPE) {
+        return (_Matrix*)modelMx->ComputeNumeric();
+    }
+
+    return nil;
+}
+
+//_______________________________________________________________________________________________
+
+_Matrix*    _CalcNode::GetCompExp       (long catID, bool doClear)
+{
+    if (catID==-1) {
+        return compExp;
+    } else {
+        if (remapMyCategories.lLength) {
+            catID = remapMyCategories.lData[catID * (categoryVariables.lLength+1)];
+        }
+      //if (matrixCache)
+      //    printf ("%d %d %d\n", remapMyCategories[0*catID * (categoryVariables.lLength+1)], remapMyCategories[catID * (categoryVariables.lLength+1)], remapMyCategories[2*catID * (categoryVariables.lLength+1)]);
+        _Matrix* ret = matrixCache?matrixCache[catID]:compExp;
+      if (doClear && matrixCache) {
+        matrixCache[catID] = nil;
+      }
+      return ret;
+    }
+}
+
+//_______________________________________________________________________________________________
+
+BaseRef     _CalcNode::makeDynamic(void)
+{
+    _CalcNode* res = new (_CalcNode);
+    checkPointer(res);
+    res->_VariableContainer::Duplicate (this);
+    res->categoryVariables.Duplicate ((BaseRef)&categoryVariables);
+    //res->randomVariables.Duplicate ((BaseRef)&randomVariables);
+    res->categoryIndexVars.Duplicate ((BaseRef)&categoryIndexVars);
+    //res->randomIndexVars.Duplicate ((BaseRef)&randomIndexVars);
+    res->theValue = theValue;
+    res->cBase = cBase;
+    if (cBase) {
+        res->theProbs = new _Parameter [cBase];
+        checkPointer(res->theProbs);
+        memcpy (res->theProbs, theProbs, sizeof(_Parameter)*cBase);
+    } else {
+        res->theProbs = nil;
+    }
+    res->compExp = compExp;
+    if (compExp) {
+        compExp->nInstances++;
+    }
+    res->referenceNode = referenceNode;
+    res->slaveNodes    = slaveNodes;
+    return res;
+}
+
+//_______________________________________________________________________________________________
+
+_TreeTopology::_TreeTopology ()
+{
+    rooted = UNROOTED;
+}
+
+//_______________________________________________________________________________________________
+
+_TheTree::_TheTree ()
+{
+    categoryCount           = 1;
+    rootIChildrenCache      = nil;
+    marginalLikelihoodCache = nil;
+    nodeMarkers             = nil;
+    nodeStates              = nil;
+    aCache                  = nil;
+#if USE_SCALING_TO_FIX_UNDERFLOW
+    scalingForUnderflow = nil;
+#endif
+}       // default constructor - doesn't do much
+
+//_______________________________________________________________________________________________
+
+_TreeTopology::~_TreeTopology (void)
+{
+    if (theRoot) {
+        theRoot->delete_tree();
+        delete (theRoot);
+        theRoot = nil;
+    }
+    if (compExp) {
+        DeleteObject (compExp);
+        compExp = nil;
+    }
+}
+
+//_______________________________________________________________________________________________
+
+_TheTree::~_TheTree (void)
+{
+    if (rootIChildrenCache) {
+        free (rootIChildrenCache);
+        rootIChildrenCache = nil;
+    }
+    if (marginalLikelihoodCache) {
+        free (marginalLikelihoodCache);
+        marginalLikelihoodCache = nil;
+    }
+    if (nodeMarkers) {
+        free (nodeMarkers);
+        nodeMarkers = nil;
+    }
+    if (nodeStates) {
+        free (nodeStates);
+        nodeMarkers = nil;
+    }
+    DeleteObject (aCache);
+
+}
+
+//_______________________________________________________________________________________________
+
+void    _TheTree::PurgeTree (void)
+{
+    _CalcNode* curNode = DepthWiseTraversal (TRUE), *nextNode;
+    nextNode = DepthWiseTraversal ();
+    // this loop deletes the data & the structure
+    while (nextNode) {
+        DeleteVariable (*curNode->GetName());
+        curNode = nextNode;
+        nextNode = DepthWiseTraversal ();
+        delete currentNode;
+    }
+
+    DeleteObject (curNode); // error checking is implicit
+}
+
+
+
+//_______________________________________________________________________________________________
+
+void    _TheTree::PreTreeConstructor (bool)
+{
+    rooted                  = UNROOTED;
+    rootIChildrenCache      = nil;
+    marginalLikelihoodCache = nil;
+    nodeMarkers             = nil;
+    nodeStates              = nil;
+    categoryCount           = 1;
+
+    aCache                  = new _AVLListXL (new _SimpleList);
+
+    convertedMatrixExpressionsL.ClearFormulasInList();
+    convertedMatrixExpressions.Clear();
+
+    iNodePrefix = "Node";
+    _PMathObj iv = FetchObjectFromVariableByType(&internalNodePrefix,STRING);
+    if (iv) {
+        iNodePrefix = *((_FString*)iv)->theString;
+    }
+    checkParameter(ignoreUserINames, ignoringInternalNames, 0.0);
+    
+}
+
+//_______________________________________________________________________________________________
+
+void    _TreeTopology::PreTreeConstructor (bool)
+{
+    rooted                  = UNROOTED;
+    compExp                 = (_Matrix*)checkPointer(new _GrowingVector);
+
+    iNodePrefix = "Node";
+    _PMathObj iv = FetchObjectFromVariableByType(&internalNodePrefix,STRING);
+    if (iv) {
+        iNodePrefix = *((_FString*)iv)->theString;
+    }
+    checkParameter(ignoreUserINames, ignoringInternalNames, 0.0);
+}
+
+//_______________________________________________________________________________________________
+
+void    _TheTree::PostTreeConstructor (bool dupMe)
+{
+    _Parameter acceptRTs = 0.0;
+    checkParameter (acceptRootedTrees,acceptRTs, 0.0);
+
+    DeleteObject (aCache->dataList);
+    DeleteObject (aCache);
+    aCache = nil;
+
+    convertedMatrixExpressionsL.ClearFormulasInList();
+    convertedMatrixExpressions.Clear();
+
+    while (theRoot->get_num_nodes() == 1) { // dumb tree w/ an extra top level node
+        // remove the root
+        node<long> *node_temp = theRoot->go_down(1);
+        if (!node_temp) {
+            WarnError (_String("Vacuos Tree Supplied"));
+            isDefiningATree = 0;
+            return;
+        }
+        if (node_temp->get_num_nodes()) {
+            _String pp = *LocateVar(theRoot->get_data())->theName;
+            DeleteVariable(pp);
+            delete node_temp->get_parent();
+            node_temp->detach_parent();
+            theRoot = node_temp;
+        } else {
+            break;
+        }
+    }
+
+    if (theRoot->get_num_nodes() == 2) { // rooted tree - check
+        if (acceptRTs<0.1) {
+            long  i;
+            for (i = 1; i<=2; i++) {
+                node<long> *node_temp = theRoot->go_down(i);
+                if (node_temp->get_num_nodes()) { // an internal node - make it a root
+                    node_temp->detach_parent();
+                    //node_temp = theRoot->go_down((i==1)?2:1);
+                    _CalcNode * thecn = (_CalcNode*)LocateVar(theRoot->get_data());
+                    _String pp = *thecn->theName;
+                    DeleteVariable(pp);
+                    if (i==1) {
+                        node_temp->add_node(*theRoot->go_down(2));
+                        delete theRoot;
+                        theRoot = node_temp;
+                        rooted = ROOTED_LEFT;
+                    } else {
+                        node_temp->prepend_node(*theRoot->go_down(1));
+                        delete theRoot;
+                        theRoot = node_temp;
+                        rooted = ROOTED_RIGHT;
+                    }
+                    thecn = (_CalcNode*)LocateVar(theRoot->get_data());
+                    pp=*thecn->theName;
+                    DeleteVariable(pp, false);
+                    if (i==1) {
+                        ReportWarning (_String("Rooted tree. Removing one branch - the left root child has been promoted to be the new root"));
+                    } else {
+                        ReportWarning (_String("Rooted tree. Removing one branch - the right root child has been promoted to be the new root"));
+                    }
+                    break;
+                }
+            }
+            if (i==3) {
+                ReportWarning ((_String("One branch tree supplied - hopefully this IS what you meant to do.")));
+                node<long> *node_temp = theRoot->go_down(1);
+                node_temp->detach_parent();
+                _CalcNode * thecn = (_CalcNode*)LocateVar(theRoot->get_data());
+                _String pp = *thecn->theName;
+                DeleteVariable(pp);
+                node_temp->add_node(*theRoot->go_down(2));
+                delete theRoot;
+                theRoot = node_temp;
+                rooted = ROOTED_LEFT;
+                thecn = (_CalcNode*)LocateVar(theRoot->get_data());
+                pp=*thecn->theName;
+                DeleteVariable(pp, false);
+                ReportWarning (_String("Rooted tree. Removing one branch - the left root child has been promoted to be the new root"));
+                //PurgeTree();
+            }
+        }
+    }
+
+    if (!theRoot) {
+        WarnError ("Invalid tree/topology string specification.");
+    } else {
+        /*_CalcNode* theN = StepWiseTraversal(TRUE);
+        while (theN)
+        {
+            theN->SetCodeBase(4);
+            theN = StepWiseTraversal();
+        }*/
+        BaseRef temp =  variablePtrs(theIndex);
+
+        if (dupMe) {
+            variablePtrs[theIndex]=this->makeDynamic();
+        } else {
+            variablePtrs[theIndex]=this;
+        }
+
+        DeleteObject(temp);
+    }
+}
+//_______________________________________________________________________________________________
+
+void    _TreeTopology::PostTreeConstructor (bool dupMe)
+{
+    BaseRef temp =  variablePtrs(theIndex);
+
+    if (dupMe) {
+        variablePtrs[theIndex]=this->makeDynamic();
+    } else {
+        variablePtrs[theIndex]=this;
+    }
+
+    DeleteObject(temp);
+}
+
+//_______________________________________________________________________________________________
+_TheTree::_TheTree              (_String name, _String& parms, bool dupMe):_TreeTopology (&name)
+{
+    PreTreeConstructor   (dupMe);
+    if (MainTreeConstructor  (parms)) {
+        PostTreeConstructor  (dupMe);
+    }
+}
+
+//_______________________________________________________________________________________________
+_TheTree::_TheTree              (_String name, _TreeTopology* top):_TreeTopology (&name)
+{
+    PreTreeConstructor   (false);
+    if (top->theRoot) {
+        isDefiningATree         = 1;
+        theRoot                 = top->theRoot->duplicate_tree ();
+        node<long>*topTraverser = DepthWiseStepTraverser (theRoot);
+        while (topTraverser) {
+            _Parameter   nodeVal = top->compExp->theData[topTraverser->in_object];
+            _String      nodeVS,
+                         nodeName       (*(_String*)top->flatTree(topTraverser->in_object)),
+                         nodeParams     (*(_String*)top->flatCLeaves(topTraverser->in_object));
+
+            if (!nodeName.IsValidIdentifier(true)) {
+                nodeName.ConvertToAnIdent (true);
+            }
+
+            if (nodeVal != 0.0) {
+                nodeVS = nodeVal;
+            }
+
+
+
+            FinalizeNode (topTraverser, 0, nodeName, nodeParams, nodeVS);
+            topTraverser = DepthWiseStepTraverser ((node<long>*)nil);
+        }
+        isDefiningATree         = 0;
+        PostTreeConstructor      (false);
+    } else {
+        WarnError ("Can't create an empty tree");
+        return;
+    }
+}
+
+//_______________________________________________________________________________________________
+_TheTree::_TheTree              (_String name, _TheTree* otherTree):_TreeTopology (&name)
+{
+    PreTreeConstructor   (false);
+    if (otherTree->theRoot) {
+        isDefiningATree         = 1;
+        theRoot                 = otherTree->theRoot->duplicate_tree ();
+        
+        node<long>*topTraverser = DepthWiseStepTraverser (theRoot);
+        
+        
+        while (topTraverser) {
+            _CalcNode   *sourceNode = (_CalcNode*)LocateVar(topTraverser->in_object),
+                          copiedNode (sourceNode, this);
+            topTraverser->init (copiedNode.theIndex);
+            topTraverser = DepthWiseStepTraverser ((node<long>*)nil);
+        }
+        
+        isDefiningATree         = 0;
+        PostTreeConstructor      (false);
+    } else {
+        WarnError ("Can't create an empty tree");
+        return;
+    }
+}
+
+
+//_______________________________________________________________________________________________
+_TreeTopology::_TreeTopology (_TheTree *top):_CalcNode (*top->GetName(), empty)
+{
+    PreTreeConstructor   (false);
+    if (top->theRoot) {
+        isDefiningATree         = 1;
+        theRoot                 = top->theRoot->duplicate_tree ();
+        node<long>*topTraverser = DepthWiseStepTraverser (theRoot);
+        while (topTraverser && topTraverser->parent) {
+            _String              nodeVS,
+                                 *nodeSpec,
+                                 nodeName;
+
+            top->GetBranchValue (topTraverser,nodeVS);
+            top->GetNodeName    (topTraverser,nodeName);
+            nodeSpec = top->GetBranchSpec   (topTraverser);
+
+            FinalizeNode (topTraverser, 0, nodeName, *nodeSpec, nodeVS);
+            DeleteObject (nodeSpec);
+            topTraverser = DepthWiseStepTraverser ((node<long>*)nil);
+        }
+        isDefiningATree         = 0;
+    } else {
+        WarnError ("Can't create an empty tree");
+        return;
+    }
+}
+
+//_______________________________________________________________________________________________
+_TreeTopology::_TreeTopology    (_String name, _String& parms, bool dupMe):_CalcNode (name,empty)
+// builds a tree from a string
+{
+    PreTreeConstructor   (dupMe);
+    if (MainTreeConstructor  (parms, false)) {
+        PostTreeConstructor  (dupMe);
+    } else {
+        DeleteObject     (compExp);
+        compExp = nil;
+    }
+}
+
+//_______________________________________________________________________________________________
+_TreeTopology::_TreeTopology    (_String* name):_CalcNode (*name,empty)
+{
+
+}
+
+//_______________________________________________________________________________________________
+bool    _TreeTopology::MainTreeConstructor  (_String& parms, bool checkNames)
+{
+    long i,
+         nodeCount=0,
+         lastNode;
+    
+    _Parameter      checkABL;
+
+    checkParameter  (acceptBranchLengths, checkABL, 1.0);
+    takeBranchLengths = !CheckEqual (checkABL, 0.0);
+
+    checkParameter  (autoConvertBL, checkABL, 0.0);
+    autoSolveBranchLengths = CheckEqual (checkABL, 1.0);
+
+
+    _SimpleList nodeStack,
+                nodeNumbers;
+
+    _String     nodeName,
+                nodeParameters,
+                nodeValue,
+                nodeComment;
+
+    char        lastChar    = 0;
+    bool        isInLiteral = false;
+
+    node<long>* currentNode = theRoot = nil,
+              * newNode     = nil,
+              * parentNode  = nil;
+
+    isDefiningATree         = 1;
+
+    for (i=0; i<parms.sLength; i++) {
+        switch (parms[i]) {
+        case '(': { // creating a new internal node one level down
+            // a new node
+            newNode = new node<long>;
+            checkPointer(newNode);
+            if (lastChar == '(' || lastChar == ',') {
+                currentNode->add_node (*newNode);
+            } else {
+                if (theRoot) {
+                    parentNode = currentNode->get_parent();
+                    if (!parentNode) {
+                        WarnError ((_String("'(' is out of context: ...")&parms.Cut(i>31?i-32:0,i)&"?"&parms.Cut(i+1,parms.sLength-i>32?i+32:-1)));
+                        isDefiningATree = 0;
+                        return false;
+                    } else {
+                        parentNode->add_node (*newNode);
+                    }
+                } else {
+                    theRoot = newNode;
+                }
+                currentNode = newNode;
+                nodeStack<<(long)currentNode;
+                nodeNumbers<<nodeCount;
+                newNode = new node<long>;
+                checkPointer(newNode);
+                currentNode->add_node (*newNode);
+                nodeCount++;
+            }
+            currentNode = newNode;
+            nodeStack<<(long)currentNode;
+            nodeNumbers<<nodeCount;
+            nodeCount++;
+            break;
+        }
+
+        case ',':
+        case ')': { // creating a new node on the same level and finishes updating the list of parameters
+            lastNode = nodeStack.lLength-1;
+            if (lastNode<0) {
+                WarnError ((_String(parms[i])&_String(" is out of context:")&parms.Cut(i>31?i-32:0,i)&"?"&parms.Cut(i+1,parms.sLength-i>32?i+32:-1)));
+                //PurgeTree();
+                isDefiningATree = 0;
+                return false;
+            }
+            parentNode = (node<long>*)nodeStack(lastNode);
+            FinalizeNode (parentNode, nodeNumbers(lastNode), nodeName, nodeParameters, nodeValue, &nodeComment);
+            nodeStack.Delete(lastNode, false);
+            nodeNumbers.Delete(lastNode, false);
+
+            if (parms[i]==',') { // also create a new node on the same level
+                checkPointer (newNode = new node<long>);
+                if (!(parentNode = parentNode->get_parent())) {
+                    WarnError ((_String("',' is out of context:")&parms.Cut(i>31?i-32:0,i)&"?"&parms.Cut(i+1,parms.sLength-i>32?i+32:-1)));
+                    isDefiningATree = 0;
+                    return false;
+                }
+                currentNode = newNode;
+                parentNode->add_node(*currentNode);
+                nodeStack<<(long)currentNode;
+                nodeNumbers<<nodeCount;
+                nodeCount++;
+            }
+            break;
+        }
+
+        case '{' : { // parameter list definition
+            lastNode = parms.Find ("}",i+1,-1);
+            if (lastNode<0) {
+                WarnError ((_String("'{' has no matching '}':")&parms.Cut(i>31?i-32:0,i)&"?"&parms.Cut(i+1,parms.sLength-i>32?i+32:-1)));
+                isDefiningATree = 0;
+                return false;
+            }
+            nodeParameters = parms.Cut (i+1,lastNode-1);
+            i = lastNode;
+            break;
+        }
+
+         case '[' : { // hackish Newick annotation
+            lastNode = parms.Find ("]",i+1,-1);
+            if (lastNode<0) {
+                WarnError ((_String("'[' has no matching ']':")&parms.Cut(i>31?i-32:0,i)&"?"&parms.Cut(i+1,parms.sLength-i>32?i+32:-1)));
+                isDefiningATree = 0;
+                return false;
+            }
+            nodeComment = parms.Cut (i+1,lastNode-1);
+            i = lastNode;
+            break;
+        }
+        
+        case ':' : { // tree branch definition
+            lastNode = i+1;
+            char c = parms[lastNode];
+
+            while ( isspace (c) )
+                if (lastNode<parms.sLength) {
+                    c = parms[++lastNode];
+                } else {
+                    break;
+                }
+
+            if ( lastNode<parms.sLength )
+                while ( (c<='9' && c>='0') || c=='.' ||c=='-' ||c=='+' || c=='e' || c=='E') {
+                    if (lastNode<parms.sLength) {
+                        c = parms[++lastNode];
+                    } else {
+                        break;
+                    }
+                }
+
+            nodeValue = parms.Cut(i,lastNode-1);
+            i = lastNode-1;
+            break;
+        }
+
+        default: { // node name
+            lastNode = i;
+
+            char c = parms[lastNode];
+
+            if (c==';') {
+                break;
+            }
+
+            if (isspace(c)) {
+                continue;
+            }
+
+            if (c == '\'') {
+                c = parms[lastNode++];
+                isInLiteral = true;
+                i++;
+            }
+
+            if (!isInLiteral && !(isalnum(c)|| c=='_')) {
+                WarnError ((_String("Node names should begin with a letter, a number, or an underscore. Had:")&parms.Cut(i>31?i-32:0,i)&"?"&parms.Cut(i+1,parms.sLength-i>32?i+32:-1)));
+                isDefiningATree = 0;
+                return false;
+            }
+
+            if (checkNames)
+                while (isalnum(c)||c=='_')
+                    if (lastNode<parms.sLength) {
+                        lastNode++;
+                        c = parms[lastNode];
+                    } else {
+                        break;
+                    }
+            else
+                while (isInLiteral || !(c==',' || c==':' || c==')' || c=='(' || c=='{' ||c== '}' || isspace(c)))
+                    if (lastNode<parms.sLength) {
+                        lastNode++;
+                        c = parms[lastNode];
+                        if (c == '\'') {
+                            if (isInLiteral) {
+                                break;
+                            } else {
+                                WarnError ((_String("Unxpected \'. Had:")&parms.Cut(lastNode>31?lastNode-32:0,lastNode)&"?"&parms.Cut(lastNode+1,parms.sLength-lastNode>32?lastNode+32:-1)));
+                                isDefiningATree = 0;
+                                return false;
+                            }
+                        }
+                    } else {
+                        break;
+                    }
+
+            if (isInLiteral) {
+                if (c!='\'') {
+                    WarnError ((_String("Unterminated \'. Had:")&parms.Cut(lastNode>31?lastNode-32:0,lastNode)&"?"&parms.Cut(lastNode+1,parms.sLength-lastNode>32?lastNode+32:-1)));
+                    isDefiningATree = 0;
+                    return false;
+                }
+                nodeName        = parms.Cut(i,lastNode-1);
+                i               = lastNode;
+                isInLiteral     = false;
+            } else {
+                nodeName        = parms.Cut(i,lastNode-1);
+                i               = lastNode-1;
+            }
+            break;
+        }
+        }
+
+        if ((lastChar = parms[i])==';') {
+            break;
+        }
+    }
+
+    lastNode = nodeStack.lLength-1;
+
+    while (lastNode>=0) {
+        parentNode = (node<long>*)nodeStack(lastNode);
+        FinalizeNode (parentNode, nodeNumbers(lastNode), nodeName, nodeParameters, nodeValue, &nodeComment);
+        lastNode--;
+    }
+
+    if (!theRoot) {
+        isDefiningATree = 0;
+        WarnError ("Can't create empty trees.");
+        return false;
+    }
+
+    isDefiningATree = 0;
+    return true;
+
+}
+//_______________________________________________________________________________________________
+
+
+bool    _TheTree::FinalizeNode (node<long>* nodie, long number , _String& nodeName, _String& nodeParameters, _String& nodeValue, _String* nodeComment)
+{
+    bool isAutoGenerated = (nodeName.sLength == 0 || !CheckEqual(ignoringInternalNames,0.0) && nodie->get_num_nodes()>0);
+    if (isAutoGenerated) {
+        nodeName = iNodePrefix & number;
+    } else {
+        
+        if (!nodeName.IsValidIdentifier(false)) {
+            _String oldName (nodeName);
+            nodeName.ConvertToAnIdent();
+            ReportWarning (_String ("Automatically renamed ") & oldName & " to " & nodeName & " in order to create a valid HyPhy identifier");
+        }
+    }
+    if (nodie == theRoot) {
+        nodeParameters = empty;
+        nodeValue      = empty;
+    } else {
+        if (!nodeParameters.sLength && lastMatrixDeclared!=-1) {
+            nodeParameters=*(((_String**)modelNames.lData)[lastMatrixDeclared]);
+        }
+
+        if (nodeParameters.sLength) {
+            ReportWarning ((_String("Model ")&nodeParameters&_String(" assigned to ")& nodeName));
+        } else {
+            ReportWarning (_String("No nodel was assigned to ")& nodeName);
+        }
+
+    }
+
+    char saveIDT = isDefiningATree;
+    isDefiningATree = 2;
+    _CalcNode cNt (nodeName,nodeParameters, 4, this, aCache);
+    isDefiningATree = saveIDT;
+    nodie->init (cNt.theIndex);
+
+
+    _Constant val (nodeValue.ProcessTreeBranchLength());
+    
+    if (nodeValue.Length() && takeBranchLengths) {
+        if (cNt.iVariables && cNt.iVariables->lLength == 2) { // can assign default values
+            bool setDef = true;
+            if (autoSolveBranchLengths) {
+                long nodeModelID = cNt.GetModelIndex();
+                if (nodeModelID != HY_NO_MODEL) {
+                    _Formula * expressionToSolveFor = nil;
+                    long alreadyConverted = convertedMatrixExpressions.Find ((BaseRef)nodeModelID);
+                    if (alreadyConverted < 0) {
+                        _Variable   * tV, * tV2;
+                        bool         mByF;
+                        RetrieveModelComponents (nodeModelID, tV, tV2, mByF);
+                        _String * result = ((_Matrix*)tV->GetValue())->BranchLengthExpression((_Matrix*)tV2->GetValue(),mByF);
+                        if (result->sLength) {
+                            expressionToSolveFor = new _Formula (*result);
+                            for (unsigned long cc = 0; cc < cNt.categoryVariables.lLength; cc++) {
+                                _CategoryVariable * thisCC = (_CategoryVariable *)LocateVar(cNt.categoryVariables.lData[cc]);
+                                thisCC -> SetValue (new _Constant(thisCC->Mean()), false);
+
+                            }
+                        }
+                        DeleteObject (result);
+                    } else {
+                        expressionToSolveFor = (_Formula*)convertedMatrixExpressions.GetXtra(alreadyConverted);
+                    }
+
+                    if (expressionToSolveFor != nil) {
+                        _Variable * solveForMe = LocateVar (cNt.iVariables->lData[1]);
+                        _Parameter modelP = expressionToSolveFor->Brent (solveForMe,solveForMe->GetLowerBound(), solveForMe->GetUpperBound(), 1e-6, nil, val.Value());
+                        ReportWarning (_String("Branch parameter of ") & nodeName&" set to " & modelP);
+                        LocateVar (cNt.iVariables->lData[0])->SetValue(new _Constant (modelP), false);
+                        setDef = false;
+                    }
+                }
+            }
+
+            if (setDef) {
+                LocateVar (cNt.iVariables->lData[0])->SetValue (&val);
+                ReportWarning (_String("Branch parameter of ") & nodeName&" set to " & nodeValue);
+            }
+        } else {
+            ReportWarning (nodeName&" has "& _String((long)(cNt.iVariables?cNt.iVariables->lLength/2:0)) & " parameters - branch length not assigned");
+        }
+    }
+
+    _CalcNode *nodeVar = (_CalcNode*)LocateVar(cNt.theIndex);
+    
+    if (nodeVar == NULL) return false;
+
+    nodeVar->SetValue (&val);
+
+    nodeName       = empty;
+    nodeParameters = empty;
+    nodeValue      = empty;
+    if (nodeComment && nodeComment->sLength)
+    {
+        _String commentName = *nodeVar->GetName() & "._comment";
+        CheckReceptacleAndStore(&commentName, empty, false, new _FString (*nodeComment));
+        *nodeComment    = empty;
+    }
+
+    nodeVar->categoryVariables.TrimMemory();
+    nodeVar->categoryIndexVars.TrimMemory();
+    nodeVar->_VariableContainer::TrimMemory();
+
+
+    return true;
+}
+
+//_______________________________________________________________________________________________
+
+bool    _TreeTopology::FinalizeNode (node<long>* nodie, long number , _String& nodeName, _String& nodeParameters, _String& nodeValue, _String* nodeComment)
+{
+    if (!nodeName.sLength || !CheckEqual(ignoringInternalNames,0.0) && nodie->get_num_nodes()>0) {
+        nodeName = iNodePrefix & number;
+    }
+
+    if (nodie==theRoot) {
+        nodeParameters = "";
+        nodeValue = "";
+    }
+
+    nodie->in_object = flatTree.lLength;
+    flatTree          && & nodeName;
+    flatCLeaves       && & nodeParameters;
+
+    ((_GrowingVector*)compExp)->Store (nodeValue.ProcessTreeBranchLength());
+
+    nodeName       = empty;
+    nodeParameters = empty;
+    nodeValue      = empty;
+    if (nodeComment)
+        *nodeComment    = empty;
+
+    return true;
+}
+
+//_______________________________________________________________________________________________
+
+node<long>* _TreeTopology::FindNodeByName (_String* match)
+{
+    DepthWiseT(true);
+
+    _String       nn;
+    while (currentNode) {
+        GetNodeName  (currentNode, nn);
+        if (match->Equal(&nn)) {
+            return currentNode;
+        }
+        DepthWiseT();
+    }
+
+    return nil;
+
+}
+
+//_______________________________________________________________________________________________
+
+void    _TreeTopology::RemoveANode (_PMathObj nodeName) {
+    if (nodeName->ObjectClass () == STRING) {
+        _FString         * removeMe     = (_FString*)nodeName;
+        
+        node<long>* removeThisNode = FindNodeByName (removeMe->theString),
+                  * parentOfRemoved;
+        
+        if (!removeThisNode || ( parentOfRemoved = removeThisNode->get_parent()) == nil) {
+            WarnError ("Node not found in the tree or is the root node call to _TreeTopology::RemoveANode");
+            return;
+        }
+        
+        _SimpleList cleanIndices;
+        
+        while (parentOfRemoved) {
+            cleanIndices << removeThisNode->in_object;
+            parentOfRemoved->detach_child(removeThisNode->get_child_num());
+            
+            _String node_name;
+            GetNodeName (removeThisNode, node_name);
+            //printf ("[RemoveANode %ld %s]\n", removeThisNode->in_object, node_name.getStr());
+            
+            for (int orphans = 1; orphans <= removeThisNode->get_num_nodes(); orphans++) {
+                parentOfRemoved->add_node(*removeThisNode->go_down(orphans));
+            }
+            delete removeThisNode;
+            removeThisNode = parentOfRemoved;
+            parentOfRemoved = parentOfRemoved->get_parent();
+            
+            if (parentOfRemoved == nil && removeThisNode->get_num_nodes() == 1) {
+                removeThisNode = removeThisNode->go_down (1);
+                parentOfRemoved = removeThisNode->get_parent();
+               
+            }
+            
+        }
+        
+        cleanIndices.Sort();
+        flatTree.DeleteList(cleanIndices);
+        flatCLeaves.DeleteList(cleanIndices);
+        
+        
+        
+        cleanIndices << flatTree.lLength + 16L; // this is so that we don't get a index error thrown at GetElement
+        
+        //printf ("%s\n", ((_String*)cleanIndices.toStr())->getStr());
+        
+        _GrowingVector* blengths = ((_GrowingVector*)compExp);
+        long offset = 0L;
+        _SimpleList     oldToNew;
+        
+        for (long k = 0L; k < blengths->used; k++) {
+            if (k == cleanIndices.GetElement(offset)){
+                oldToNew << -1;
+                offset++;
+            } else {
+                blengths->theData[k-offset] = blengths->theData[k];
+                oldToNew << k - offset;
+            }
+        }
+        
+        blengths->used -= offset - 1;
+        DepthWiseT(true);
+        
+        //printf ("%s\n", ((_String*)oldToNew.toStr())->getStr());
+
+        _String       nn;
+        while (currentNode) {
+            //printf ("[%ld->%ld]\n", currentNode->in_object, oldToNew.GetElement(currentNode->in_object));
+            currentNode->in_object = oldToNew.GetElement(currentNode->in_object);
+            DepthWiseT();
+        }
+       
+        
+        
+    } else {
+        WarnError ("An invalid argument (not a string) supplied to _TreeTopology::RemoveANode");
+    }
+
+}
+
+
+//_______________________________________________________________________________________________
+
+void    _TreeTopology::AddANode (_PMathObj newNode)
+{
+    if (newNode->ObjectClass () == ASSOCIATIVE_LIST) {
+        _AssociativeList * newNodeSpec = (_AssociativeList*)newNode;
+        _FString         * newName     = (_FString*)newNodeSpec->GetByKey (newNodeGraftName, STRING),
+                         * newLocation = (_FString*)newNodeSpec->GetByKey (newNodeGraftWhere, STRING),
+                         * newParent   = (_FString*)newNodeSpec->GetByKey (newNodeGraftParent, STRING);
+                         
+        _Constant        * branchLengthSelf = (_Constant*)newNodeSpec->GetByKey (newNodeGraftLength, NUMBER),
+                         * branchLengthParent = (_Constant*)newNodeSpec->GetByKey (newNodeGraftParentLength, NUMBER);
+
+
+        if (!newLocation) {
+            WarnError (_String("Missing/invalid mandatory argument (\"")&newNodeGraftWhere&"\") in call to _TreeTopology::AddANode");
+            return;
+        }
+        
+        
+        if (! (newName || newParent)) {
+            WarnError (_String("At least one of '") & newNodeGraftName&"', '"& newNodeGraftParent &"') must be specified in call to _TreeTopology::AddANode");
+            return;
+        }
+
+        node<long>* graftAt = FindNodeByName (newLocation->theString);
+        if (!graftAt || graftAt->get_parent() == nil) {
+            WarnError ("Attachment node must be an exiting non-root node in call to _TreeTopology::AddANode");
+            return;
+        }
+
+        node<long>* newp = newParent ? (node<long>*) checkPointer(new node<long>) : nil,
+                  * curp = graftAt->get_parent();
+
+        if (newp) {
+          newp->set_parent  (*curp);
+          newp->add_node    (*graftAt);
+          curp->replace_node(graftAt,newp);
+        } 
+
+        if (newName && !newName->IsEmpty()) {
+            node<long>* newt = (node<long>*) checkPointer(new node<long>);
+            if (newp) {
+              newp->add_node(*newt);
+            } else {
+              graftAt->add_node (*newt);
+            }
+            if (branchLengthSelf) {
+              _String bl (branchLengthSelf->Value());
+              FinalizeNode (newt, 0, *newName->theString,   empty, bl);
+            } else {
+              FinalizeNode (newt, 0, *newName->theString,   empty, empty);
+            }
+        }
+
+        if (newp && ! newParent->IsEmpty()) {
+            if (branchLengthParent) {
+              _String bl (branchLengthSelf->Value());
+               FinalizeNode (newp, 0, *newParent->theString, empty, bl);
+            } else {
+              FinalizeNode (newp, 0, *newParent->theString, empty, empty);
+            }
+          
+        }
+
+    } else {
+        WarnError ("An invalid argument (not an associative array) supplied to _TreeTopology::AddANode");
+    }
+
+}
+
+
+//_______________________________________________________________________________________________
+
+_CalcNode* _TheTree::DepthWiseTraversal (bool init)
+{
+    DepthWiseT (init);
+
+    if (currentNode) {
+        return (_CalcNode*)(((BaseRef*)variablePtrs.lData)[currentNode->in_object]);
+    }
+
+    return nil;
+}
+
+//_______________________________________________________________________________________________
+
+void _TreeTopology::DepthWiseT (bool init, _HYTopologyTraversalFunction* handler, Ptr extra)
+{
+    if (init) {
+        currentNode =  DepthWiseStepTraverser (theRoot);
+    } else {
+        currentNode =(DepthWiseStepTraverser((node<long>*)nil));
+    }
+
+    if (handler)
+        if (!(*handler)(currentNode, extra)) {
+            currentNode = nil;
+        }
+
+}
+
+//_______________________________________________________________________________________________
+
+_CalcNode* _TheTree::DepthWiseTraversalRight (bool init)
+{
+    DepthWiseTRight (init);
+
+    if (currentNode) {
+        return (_CalcNode*)(((BaseRef*)variablePtrs.lData)[currentNode->in_object]);
+    }
+
+    return nil;
+}
+
+//_______________________________________________________________________________________________
+
+void _TreeTopology::DepthWiseTRight (bool init)
+{
+    if (init) {
+        currentNode =  DepthWiseStepTraverserRight (theRoot);
+    } else {
+        currentNode =(DepthWiseStepTraverserRight((node<long>*)nil));
+    }
+}
+
+//_______________________________________________________________________________________________
+
+_CalcNode* _TheTree::LeafWiseTraversal (bool init)
+{
+    LeafWiseT (init);
+    if (currentNode) {
+        return (_CalcNode*)(((BaseRef*)variablePtrs.lData)[currentNode->in_object]);
+    }
+    return nil;
+}
+
+//_______________________________________________________________________________________________
+
+void _TreeTopology::LeafWiseT (bool init)
+{
+    if (init) {
+        currentNode =  DepthWiseStepTraverser (theRoot);
+    } else {
+        currentNode = DepthWiseStepTraverser((node<long>*)nil);
+    }
+
+    while (currentNode && currentNode->get_num_nodes()) {
+        currentNode = DepthWiseStepTraverser((node<long>*)nil);
+    }
+}
+
+//_______________________________________________________________________________________________
+
+_CalcNode* _TheTree::StepWiseTraversal (bool init)
+{
+    StepWiseT (init);
+
+    if (currentNode) {
+        return (_CalcNode*)(((BaseRef*)variablePtrs.lData)[currentNode->in_object]);
+    }
+
+    return nil;
+}
+
+//_______________________________________________________________________________________________
+
+void _TreeTopology::StepWiseT (bool init,_HYTopologyTraversalFunction* handler, Ptr extra)
+{
+    if (init) {
+        currentNode =  StepWiseTraverser (theRoot);
+    } else {
+        currentNode =(StepWiseTraverser((node<long>*)nil));
+    }
+
+    if (handler)
+        if (!(*handler)(currentNode, extra)) {
+            currentNode = nil;
+        }
+}
+
+//_______________________________________________________________________________________________
+
+void _TreeTopology::StepWiseTLevel (long& level, bool init)
+{
+    if (init) {
+        currentNode =  StepWiseTraverserLevel (level, theRoot);
+    } else {
+        currentNode =(StepWiseTraverserLevel (level, (node<long>*)nil));
+    }
+
+}
+
+//_______________________________________________________________________________________________
+
+_CalcNode* _TheTree::StepWiseTraversalLevel (long& level, bool init)
+{
+    StepWiseTLevel (level, init);
+
+    if (currentNode) {
+        return (_CalcNode*)(((BaseRef*)variablePtrs.lData)[currentNode->in_object]);
+    }
+    return nil;
+}
+
+//_______________________________________________________________________________________________
+
+void _TreeTopology::DepthWiseTLevel (long& level, bool init)
+{
+    if (init) {
+        currentNode =  DepthWiseStepTraverserLevel (level, theRoot);
+    } else {
+        currentNode =(DepthWiseStepTraverserLevel (level, (node<long>*)nil));
+    }
+}
+//_______________________________________________________________________________________________
+
+_CalcNode* _TheTree::DepthWiseTraversalLevel (long& level, bool init)
+{
+    DepthWiseTLevel (level, init);
+
+    if (currentNode) {
+        return (_CalcNode*)(((BaseRef*)variablePtrs.lData)[currentNode->in_object]);
+    }
+    return nil;
+}
+//_______________________________________________________________________________________________
+
+BaseRef  _TreeTopology::makeDynamic (void)
+{
+    _TreeTopology* res = new _TreeTopology;
+    checkPointer(res);
+    res->_CalcNode::Duplicate (this);
+
+    res->flatTree.Duplicate (&flatTree);
+    res->flatCLeaves.Duplicate (&flatCLeaves);
+    if (compExp) {
+        res->compExp = (_Matrix*)compExp->makeDynamic();
+    } else {
+        res->compExp = nil;
+    }
+
+    res->currentNode = currentNode;
+    res->rooted = rooted;
+    res->theRoot = CopyTreeStructure (theRoot,true);
+    return res;
+}
+
+//_______________________________________________________________________________________________
+
+BaseRef  _TheTree::makeDynamic (void)
+{
+    _TheTree* res = new _TheTree;
+    checkPointer(res);
+    res->_CalcNode::Duplicate (this);
+
+    res->currentNode = currentNode;
+    res->rooted = rooted;
+    res->categoryCount = 1;
+    res->theRoot = CopyTreeStructure (theRoot,true);
+    return res;
+}
+
+
+//_______________________________________________________________________________________________
+
+BaseRef  _TheTree::makeDynamicCopy (_String* replacementName)
+{
+    _TheTree* res = new _TheTree;
+    checkPointer(res);
+
+    res->rooted = rooted;
+    if (theRoot) {
+        _String rn = *replacementName&'.';
+        res->theRoot = DuplicateTreeStructure (theRoot, &rn, true);
+    } else {
+        res->theRoot = nil;
+    }
+
+    res->SetIndex(variableNames.GetXtra(LocateVarByName (*replacementName)));
+    res->theName = replacementName;
+    res->theName->nInstances++;
+    return res;
+}
+
+
+
+//_______________________________________________________________________________________________
+
+_PMathObj       _CalcNode::Compute  (void)
+{
+    return this;
+}
+
+
+//_______________________________________________________________________________________________
+
+node<long>*  _TheTree::DuplicateTreeStructure (node <long>* theNode, _String* replacementName,  bool)
+{
+    long i,j;
+    node<long>* locNode = new node<long>;
+    for (i=0; i<theNode->get_num_nodes(); i++) {
+        locNode->add_node(*DuplicateTreeStructure (theNode->go_down(i+1), replacementName , false));
+    }
+    if (1)
+        // process this node now
+    {
+        _String    replacedName = *GetName()&'.',*temp;
+        _CalcNode* sourceNode = (_CalcNode*)LocateVar(theNode->get_data());
+        sourceNode = (_CalcNode*)sourceNode->makeDynamic();
+        _String newNodeName = (LocateVar(sourceNode->GetAVariable())->GetName())->Replace(replacedName,*replacementName,true);
+        _Variable dummyVar (newNodeName);
+        j = dummyVar.GetAVariable();
+        temp = sourceNode->GetName();
+        DeleteObject (temp);
+        sourceNode->theName = dummyVar.GetName();
+        sourceNode->theName->nInstances++;
+        ReplaceVar (sourceNode);
+        DeleteObject(sourceNode);
+        sourceNode = (_CalcNode*)LocateVar (j);
+        locNode->init (j);
+
+#ifndef USE_POINTER_VC
+        for (i=0; i<sourceNode->independentVars.lLength; i++) {
+            newNodeName = (LocateVar(sourceNode->independentVars.lData[i])->GetName())->Replace(replacedName,*replacementName,true);
+            _Variable dummyVar (newNodeName);
+#ifndef USE_AVL_NAMES
+            sourceNode->independentVars.lData[i] = variableReindex.lData[LocateVarByName (newNodeName)];
+#else
+            sourceNode->independentVars.lData[i] = variableNames.GetXtra(LocateVarByName (newNodeName));
+#endif
+        }
+
+        // done with independents - now set the dependancies
+        for (i=0; i<sourceNode->dependentVars.lLength; i++) {
+            newNodeName = (LocateVar(sourceNode->dependentVars.lData[i])->GetName())->Replace(replacedName,*replacementName,true);
+            _Variable dummyVar (newNodeName);
+#ifndef USE_AVL_NAMES
+            sourceNode->dependentVars.lData[i] = variableReindex.lData[LocateVarByName (newNodeName)];
+#else
+            sourceNode->dependentVars.lData[i] = variableNames.GetXtra(LocateVarByName (newNodeName));
+#endif
+            _String* newFormula = LocateVar(sourceNode->dependentVars.lData[i])->GetFormulaString();
+            *newFormula = newFormula->Replace(replacedName,*replacementName,true);
+            _Formula dummyF (*newFormula);
+            LocateVar(sourceNode->dependentVars.lData[i])->SetFormula(dummyF);
+            DeleteObject (newFormula);
+        }
+#else
+        if (sourceNode->iVariables)
+            for (i=0; i<sourceNode->iVariables->lLength; i+=2) {
+                newNodeName = (LocateVar(sourceNode->iVariables->lData[i])->GetName())->Replace(replacedName,*replacementName,true);
+                _Variable dummyVar (newNodeName);
+#ifndef USE_AVL_NAMES
+                sourceNode->iVariables->lData[i] = variableReindex.lData[LocateVarByName (newNodeName)];
+#else
+                sourceNode->iVariables->lData[i] = variableNames.GetXtra(LocateVarByName (newNodeName));
+#endif
+            }
+
+        // done with independents - now set the dependancies
+
+        if (sourceNode->dVariables)
+            for (i=0; i<sourceNode->dVariables->lLength; i+=2) {
+                newNodeName = (LocateVar(sourceNode->dVariables->lData[i])->GetName())->Replace(replacedName,*replacementName,true);
+                _Variable dummyVar (newNodeName);
+#ifndef USE_AVL_NAMES
+                sourceNode->dVariables->lData[i] = variableReindex.lData[LocateVarByName (newNodeName)];
+#else
+                sourceNode->dVariables->lData[i] = variableNames.GetXtra(LocateVarByName (newNodeName));
+#endif
+                _String* newFormula = LocateVar(sourceNode->dVariables->lData[i])->GetFormulaString();
+                *newFormula = newFormula->Replace(replacedName,*replacementName,true);
+                _Formula dummyF (*newFormula);
+                LocateVar(sourceNode->dVariables->lData[i])->SetFormula(dummyF);
+                DeleteObject (newFormula);
+            }
+
+#endif
+    }
+    return locNode;
+}
+
+//_______________________________________________________________________________________________
+
+node<long>*  _TreeTopology::CopyTreeStructure (node <long>* theNode,  bool)
+{
+    long i;
+    node<long>* locNode = new node<long>;
+    for (i=0; i<theNode->get_num_nodes(); i++) {
+        locNode->add_node(*CopyTreeStructure (theNode->go_down(i+1), false));
+    }
+
+    locNode->init (theNode->in_object);
+    return locNode;
+}
+
+
+//_______________________________________________________________________________________________
+
+bool     _TreeTopology::IsCurrentNodeATip (void)
+{
+    return currentNode?currentNode->get_num_nodes()==0:false;
+}
+
+//_______________________________________________________________________________________________
+
+bool     _TreeTopology::IsCurrentNodeTheRoot (void)
+{
+    return currentNode->parent==nil;
+}
+
+//_______________________________________________________________________________________________
+
+bool     _TreeTopology::IsDegenerate (void)
+{
+    return theRoot->get_num_nodes()==1;
+}
+
+//_______________________________________________________________________________________________
+
+void    _TreeTopology::GetNodeName (node<long>* n, _String& r, bool fullName)
+{
+    if (fullName) {
+        r = *GetName()&'.'&*(_String*)(flatTree (n->in_object));
+    } else {
+        r = *(_String*)(flatTree (n->in_object));
+    }
+}
+
+//_______________________________________________________________________________________________
+
+_String*    _TreeTopology::GetNodeModel (node<long>* n) {
+  return (_String*)flatCLeaves(n->in_object);
+}
+
+//_______________________________________________________________________________________________
+
+_String*    _TheTree::GetNodeModel (node<long>* n) {
+    return ((_CalcNode*)(((BaseRef*)variablePtrs.lData)[n->in_object]))->GetModelName();
+}
+
+//_______________________________________________________________________________________________
+
+void    _TreeTopology::SetLeafName(long res, _String* newName)
+{
+    long count      = 0;
+
+    LeafWiseT(true);
+    while (currentNode) {
+        if (res==count) {
+            flatTree.Replace (currentNode->in_object, newName, true);
+            break;
+        }
+        count++;
+        LeafWiseT(false);
+    }
+}
+//_______________________________________________________________________________________________
+
+void    _TheTree::GetNodeName      (node<long>* n, _String& r, bool fullName)
+{
+    if (fullName) {
+        r = *((_CalcNode*)(((BaseRef*)variablePtrs.lData)[n->in_object]))->GetName();
+    } else {
+        r = ((_CalcNode*)(((BaseRef*)variablePtrs.lData)[n->in_object]))->GetName()->Cut (GetName()->sLength+1,-1);
+    }
+}
+
+
+//_______________________________________________________________________________________________
+
+BaseRef     _TheTree::toStr (void)
+{
+    _String     * res = new _String((unsigned long)128,true),
+    num;
+
+    _Parameter    skipILabels,
+                  includeMSP;
+
+    checkParameter (noInternalLabels, skipILabels, 0.0);
+    checkParameter (includeModelSpecs, includeMSP , 0.0);
+
+    if (IsDegenerate ()) {
+        _CalcNode*  curNode  = DepthWiseTraversal(true),
+                    *  nextNode = DepthWiseTraversal(false);
+
+        long     l1             = GetName()->Length();
+
+        (*res)<<'(';
+        num = nextNode->GetName()->Cut(l1+1,-1);
+        (*res)<<#
+        if (includeMSP>0.5) {
+            long midx = curNode->GetModelIndex();
+            if (midx != HY_NO_MODEL) {
+                (*res) << '{';
+                (*res) << (_String*)modelNames (midx);
+                (*res) << '}';
+            }
+        }
+        (*res)<<',';
+        num = curNode->GetName()->Cut(l1+1,-1);
+        (*res)<<#
+        if (includeMSP>0.5) {
+            long midx = nextNode->GetModelIndex();
+            if (midx != HY_NO_MODEL) {
+                (*res) << '{';
+                (*res) << (_String*)modelNames (midx);
+                (*res) << '}';
+            }
+        }
+        (*res)<<')';
+    } else {
+
+        long        level       =   0,
+                    myLevel     =   0,
+                    lastLevel    = 0,
+                    l1          = GetName()->Length(),
+                    j;
+
+
+        _CalcNode*  curNode=DepthWiseTraversalLevel(myLevel,true),
+                    *  nextNode;
+
+        level       = myLevel;
+
+        bool        isCTip = IsCurrentNodeATip(),
+                    isCTip2;
+
+        nextNode    = DepthWiseTraversalLevel(myLevel) ;
+
+        isCTip2     = IsCurrentNodeATip();
+
+        while (nextNode) {
+            if (level>lastLevel) {
+                if (lastLevel) {
+                    (*res)<<',';
+                }
+                for (j=0; j<level-lastLevel; j++) {
+                    (*res)<<'(';
+                }
+            } else if (level<lastLevel) {
+                for (j=0; j<lastLevel-level; j++) {
+                    (*res)<<')';
+                }
+            } else {
+                (*res)<<',';
+            }
+
+            if ((skipILabels<0.1)||isCTip) {
+                num = curNode->GetName()->Cut(l1+1,-1);
+                (*res)<<#
+            }
+            if (includeMSP>0.5) {
+                long midx = curNode->GetModelIndex();
+                if (midx != HY_NO_MODEL) {
+                    (*res) << '{';
+                    (*res) << (_String*)modelNames (midx);
+                    (*res) << '}';
+                }
+            }
+
+            lastLevel = level;
+            level     = myLevel;
+            curNode   = nextNode;
+            isCTip    = isCTip2;
+            nextNode  = DepthWiseTraversalLevel(myLevel) ;
+            isCTip2   = IsCurrentNodeATip();
+
+        }
+        for (j=0; j<lastLevel-level; j++) {
+            (*res)<<')';
+        }
+    }
+    (*res)<<';';
+    (*res).Finalize();
+    return res;
+}
+
+//_______________________________________________________________________________________________
+
+_List*     _TreeTopology::MapNodesToModels (void) {
+  _List* map = new _List;
+  
+  DepthWiseT (true);
+  while (!IsCurrentNodeTheRoot()) {
+    _List * node_record = new _List;
+    _String nodeName;
+    GetNodeName(currentNode,nodeName);
+    (*node_record) && & nodeName;
+    (*node_record) << GetNodeModel(currentNode);
+    map->AppendNewInstance(node_record);
+    DepthWiseT();
+  }
+  return map;
+}
+
+//_______________________________________________________________________________________________
+
+BaseRef     _TreeTopology::toStr (void)
+{
+    _String     * res = new _String((unsigned long)128,true),
+    num;
+
+    _Parameter    skipILabels,
+                  includeMSP;
+
+    checkParameter (noInternalLabels, skipILabels, 0.0);
+    checkParameter (includeModelSpecs, includeMSP , 0.0);
+
+    if (IsDegenerate ()) {
+
+        DepthWiseT (true);
+
+        (*res)<<'(';
+
+        GetNodeName (theRoot, num);
+
+        (*res)<<#
+        if (includeMSP>0.5) {
+            _String *mSpec = (_String*)flatCLeaves(theRoot->in_object);
+            if (mSpec->sLength) {
+                (*res) << '{';
+                (*res) << mSpec;
+                (*res) << '}';
+            }
+        }
+        (*res)<<',';
+        GetNodeName (currentNode, num);
+        (*res)<<#
+        if (includeMSP>0.5) {
+            _String *mSpec = (_String*)flatCLeaves(currentNode->in_object);
+            if (mSpec->sLength) {
+                (*res) << '{';
+                (*res) << mSpec;
+                (*res) << '}';
+            }
+        }
+        (*res)<<')';
+    } else {
+
+        long        level       =   0,
+                    myLevel     =   0,
+                    lastLevel    = 0,
+                    j;
+
+        DepthWiseTLevel(myLevel,true);
+
+        node<long>*     curNode= currentNode,
+                        *     nextNode;
+
+        level       = myLevel;
+
+        bool        isCTip = IsCurrentNodeATip(),
+                    isCTip2;
+
+        DepthWiseTLevel(myLevel) ;
+        nextNode = currentNode;
+
+        isCTip2     = IsCurrentNodeATip();
+
+        while (nextNode) {
+            if (level>lastLevel) {
+                if (lastLevel) {
+                    (*res)<<',';
+                }
+                for (j=0; j<level-lastLevel; j++) {
+                    (*res)<<'(';
+                }
+            } else if (level<lastLevel) {
+                for (j=0; j<lastLevel-level; j++) {
+                    (*res)<<')';
+                }
+            } else {
+                (*res)<<',';
+            }
+
+            if ((skipILabels<0.1)||isCTip) {
+                GetNodeName (curNode, num);
+                (*res)<<#
+            }
+
+            if (includeMSP>0.5) {
+                _String *mSpec = (_String*)flatCLeaves(curNode->in_object);
+                if (mSpec->sLength) {
+                    (*res) << '{';
+                    (*res) << mSpec;
+                    (*res) << '}';
+                }
+            }
+
+            lastLevel = level;
+            level     = myLevel;
+            curNode   = nextNode;
+            isCTip    = isCTip2;
+            DepthWiseTLevel(myLevel) ;
+            nextNode = currentNode;
+            isCTip2   = IsCurrentNodeATip();
+
+        }
+        for (j=0; j<lastLevel-level; j++) {
+            (*res)<<')';
+        }
+    }
+    (*res)<<';';
+    (*res).Finalize();
+    return res;
+}
+
+//__________________________________________________________________________________
+void _TreeTopology::toFileStr(FILE* f)
+{
+    _String * s = (_String*)toStr();
+    fprintf (f, "%s", s->sData);
+    DeleteObject(s);
+}
+
+//__________________________________________________________________________________
+
+void _TheTree::CompileListOfModels (_SimpleList& l)
+{
+    _CalcNode* curNode = DepthWiseTraversal (true);
+    while (curNode) {
+        long    modelID = curNode->GetModelIndex();
+        if (modelID != HY_NO_MODEL && l.Find(modelID) == -1 ) {
+            l << modelID;
+        }
+        curNode = DepthWiseTraversal (false);
+    }
+}
+//_______________________________________________________________________________________________
+void    _TheTree::SetCompMatrices (long catID)
+{
+    _CalcNode* travNode = DepthWiseTraversal (TRUE);
+
+    while   (!IsCurrentNodeTheRoot()) {
+        travNode->SetCompMatrix (catID);
+        travNode = DepthWiseTraversal ();
+    }
+}
+
+//__________________________________________________________________________________
+
+void _TheTree::SetUp (void)
+{
+    _CalcNode* travNode = DepthWiseTraversal (TRUE);
+
+    if (marginalLikelihoodCache) {
+        free (marginalLikelihoodCache);
+        marginalLikelihoodCache = nil;
+    }
+
+    if (nodeMarkers) {
+        free (nodeMarkers);
+        nodeMarkers = nil;
+    }
+
+    if (nodeStates) {
+        free (nodeStates);
+        nodeMarkers = nil;
+    }
+
+    flatTree.Clear();
+    flatNodes.Clear();
+    flatLeaves.Clear();
+    flatCLeaves.Clear();
+
+
+    flatParents.Clear();
+    _SimpleList flatINodeParents;
+
+
+    while   (travNode) {
+        if (!IsCurrentNodeATip()) {
+            flatTree<<travNode;
+            flatNodes<<(long)(currentNode);
+            travNode->lastState = -1;
+            flatINodeParents << (long)(currentNode->parent);
+        } else {
+            flatLeaves << (long)(currentNode);
+            flatCLeaves << travNode;
+            flatParents << (long)(currentNode->parent);
+        }
+        travNode = DepthWiseTraversal ();
+    }
+
+    flatParents << flatINodeParents;
+    _SimpleList parentlist (flatNodes), indexer (flatNodes.lLength,0,1);
+    SortLists   (&parentlist,&indexer);
+    for (long k=0; k<flatParents.lLength; k++)
+        if (flatParents.lData[k]) {
+            flatParents.lData[k] = indexer.lData[parentlist.BinaryFind(flatParents.lData[k])];
+        } else {
+            flatParents.lData[k] = -1;
+        }
+
+
+    if (cBase>0) {
+        marginalLikelihoodCache = (_Parameter*)MemAllocate ((flatNodes.lLength+flatLeaves.lLength)*sizeof (_Parameter)*cBase*systemCPUCount);
+    }
+    nodeStates                  = (long*)MemAllocate ((flatNodes.lLength+flatLeaves.lLength)*sizeof (long)*systemCPUCount);
+    nodeMarkers                 = (char*)MemAllocate (flatNodes.lLength*sizeof (char)*systemCPUCount);
+
+    long    iNodeCounter = 0,
+            leafCounter = 0;
+
+    travNode = DepthWiseTraversal (TRUE);
+
+    while   (travNode) {
+        if (IsCurrentNodeATip()) {
+            travNode->nodeIndex = leafCounter++;
+        } else {
+            nodeMarkers[iNodeCounter] = -1;
+            for (long k=1; k<systemCPUCount; k++) {
+                nodeMarkers[iNodeCounter+k*flatNodes.lLength] = -1;
+            }
+            travNode->nodeIndex = flatLeaves.lLength+iNodeCounter++;
+            nodeStates[travNode->nodeIndex]=-1;
+            for (long m=1; m<systemCPUCount; m++) {
+                nodeStates[travNode->nodeIndex+m*(flatNodes.lLength+flatLeaves.lLength)] = -1;
+            }
+        }
+        travNode = DepthWiseTraversal ();
+    }
+
+    BuildINodeDependancies();
+}
+
+//__________________________________________________________________________________
+
+bool _TheTree::AllBranchesHaveModels (long matchSize)
+{
+    _CalcNode* travNode;
+    travNode = DepthWiseTraversal (TRUE);
+    if (matchSize>0) {
+        while   (!IsCurrentNodeTheRoot()) {
+            long  mID = travNode->GetTheModelID();
+            if (mID<0) {
+                return false;
+            }
+            travNode = DepthWiseTraversal ();
+        }
+    } else {
+        while   (!IsCurrentNodeTheRoot()) {
+            long  mID = travNode->GetTheModelID();
+            if (mID<0) {
+                return false;
+            } else {
+                if (travNode->GetModelMatrix()->GetHDim()!=matchSize) {
+                    return false;
+                }
+            }
+            travNode = DepthWiseTraversal ();
+        }
+
+    }
+    return true;
+}
+
+//__________________________________________________________________________________
+
+_String*    _TheTree::TreeUserParams (void)
+{
+    _String * result = new _String (16L, true);
+    checkPointer (result);
+
+    _CalcNode* travNode;
+    travNode = DepthWiseTraversal (TRUE);
+    while   (travNode) {
+        _String * nodeString = travNode->GetSaveableListOfUserParameters();
+        if (nodeString->sLength) {
+            *result << nodeString;
+        }
+        DeleteObject (nodeString);
+        travNode = DepthWiseTraversal ();
+    }
+
+    result->Finalize();
+    return result;
+}
+
+//__________________________________________________________________________________
+
+_PMathObj _TreeTopology::Execute (long opCode, _PMathObj p, _PMathObj p2, _hyExecutionContext* context)   // execute this operation with the second arg if necessary
+{
+
+    switch (opCode) {
+    case HY_OP_CODE_IDIV: { // Split ($) - 2nd argument
+        if (p->ObjectClass()!=NUMBER) {
+            context->ReportError ("Invalid (not a number) 2nd argument is call to $ for trees.");
+            return new _MathObject;
+        }
+        _Constant*  cc     = (_Constant*)TipCount();
+        long        size   = cc->Value()/p->Value();
+
+        if  ((size<=4)||(size>cc->Value()/2)) {
+            context->ReportError ("Poor choice of the 2nd numeric agrument in to $ for tree. Either the resulting cluster size is too big(>half of the tree), or too small (<4)!");
+            return new _MathObject;
+        }
+
+        long        checkSize = 1,
+                    tol       = 0;
+
+        while (tol<size-2) {
+            _List*      resL   = SplitTreeIntoClusters (size,tol);
+
+            checkSize = cc->Value();
+
+            if (resL->lLength) {
+                _Matrix*    mRes   = new _Matrix (resL->lLength, 2, false, true);
+                checkPointer (mRes);
+
+                for (long k = 0; k < resL->lLength; k++) {
+                    _List* thisList = (_List*)(*resL)(k);
+                    long   nL       = ((_Constant*)(*thisList)(1))->Value();
+                    mRes->Store (k,0, nL);
+                    mRes->Store (k,1, thisList->lLength-2);
+                    checkSize -= nL;
+                }
+
+
+                if (checkSize == 0) {
+                    DeleteObject (cc);
+                    _Matrix     selMatrix (1,resL->lLength,false,true);
+                    _List       sortedList;
+                    for (long k = 0; k < resL->lLength; k++) {
+                        _List* thisList = (_List*)(*resL)(k);
+                        sortedList << (_String*)(*thisList)(0);
+                        _FString  *choiceString = new _FString (*(_String*)(*thisList)(0));
+                        _Formula  sf (choiceString);
+                        selMatrix.MStore(0,k,sf);
+                    }
+                    sortedList.Sort();
+                    for (long m = 0; m < sortedList.lLength; m++) {
+                        _FString  *choiceString = new _FString (*(_String*)sortedList(m));
+                        _Formula  sf (choiceString);
+                        selMatrix.MStore(0,m,sf);
+                    }
+
+                    CheckReceptacle (&splitNodeNames, empty, false)->SetValue (&selMatrix);
+                    DeleteObject (resL);
+                    return mRes;
+                }
+
+                DeleteObject (mRes);
+            }
+
+            DeleteObject (resL);
+            tol ++;
+        }
+
+        DeleteObject (cc);
+        return new _Matrix (1,1,false, true);
+    }
+    break;
+
+    case HY_OP_CODE_MUL: // compute the strict consensus between T1 and T2
+        if (p) 
+            return SplitsIdentity (p);
+        break;
+
+    case HY_OP_CODE_ADD: // +
+        if (!p) {
+            return Sum();
+        }
+        AddANode (p);
+        return new _Constant (0.0);
+        break;
+
+    case HY_OP_CODE_SUB: // +
+        if (!p) {
+            return new _MathObject;
+        }
+        RemoveANode (p);
+        return new _Constant (0.0);
+        break;
+
+    case HY_OP_CODE_LEQ: { // MatchPattern (<=)
+        if ((p->ObjectClass()!=TREE)&&(p->ObjectClass()!=TOPOLOGY)) {
+            context->ReportError ("Invalid (not a tree/topology) 2nd argument is call to <= for trees/topologies.");
+            return new _MathObject;
+       }
+        _String  res (((_TreeTopology*)p)->MatchTreePattern (this));
+        return new _Constant (!res.beginswith ("Unequal"));
+        break;
+    }
+    case HY_OP_CODE_EQ: // ==
+        return  Compare(p);
+        break;
+    case HY_OP_CODE_ABS: // Abs
+        return FlatRepresentation();
+        break;
+    case HY_OP_CODE_BRANCHCOUNT: //BranchCount
+        return BranchCount();
+        break;
+    case HY_OP_CODE_BRANCHLENGTH: //BranchLength
+        return BranchLength(p);
+        break;
+    case HY_OP_CODE_BRANCHNAME: //BranchName
+        return BranchName(p);
+        break;
+    case HY_OP_CODE_FORMAT: { // Format
+        currentNode = theRoot;
+        _String  *tStr = new _String  ((unsigned long)1024,true);
+        SubTreeString (*tStr, p->Compute()->Value() > 0.1 , p2->Compute()->Value() > 0.1 ? -3:-1, nil);
+        tStr->Finalize();
+        return new _FString (tStr);
+    }
+    case HY_OP_CODE_MACCESS: // MAccess
+        return BranchName (p,true, p2);
+        break;
+    case HY_OP_CODE_MIN: // COT (Min)
+        return FindCOT (p);
+        break;
+    case HY_OP_CODE_REROOTTREE: // RerootTree
+        return RerootTree(p);
+        break;
+    case HY_OP_CODE_TEXTREESTRING: // TEXTreeString
+        //return TEXTreeString(p);
+        break;
+    case HY_OP_CODE_TIPCOUNT: // TipCount
+        return TipCount();
+        break;
+    case HY_OP_CODE_TIPNAME: // TipName
+        return TipName(p);
+        break;
+    case HY_OP_CODE_TYPE: // Type
+        return Type();
+        break;
+    case HY_OP_CODE_POWER: //^
+        if (p)
+            return AVLRepresentation (p);
+    }
+
+    WarnNotDefined (this, opCode, context);
+    return nil;
+
+}
+
+
+//__________________________________________________________________________________
+
+_PMathObj _TheTree::Execute (long opCode, _PMathObj p, _PMathObj p2, _hyExecutionContext* context)   // execute this operation with the second arg if necessary
+{
+
+    switch (opCode) {
+    case HY_OP_CODE_PSTREESTRING: //PlainTreeString
+        return PlainTreeString(p,p2);
+        break;
+    case HY_OP_CODE_TEXTREESTRING: // TEXTreeString
+        return TEXTreeString(p);
+        break;
+    case HY_OP_CODE_TYPE: // Type
+        return Type();
+        break;
+    }
+
+    return  _TreeTopology::Execute (opCode,p,p2,context);
+
+}
+
+//__________________________________________________________________________________
+
+void _TreeTopology::FindCOTHelper (node<long>* aNode, long parentIndex, _Matrix& distances, _Matrix& rootDistances, _Matrix& branchLengths, _List& childLists, _AVLListX& addressToIndexMap2, _Parameter d)
+{
+    long          myIndex     = addressToIndexMap2.GetXtra(addressToIndexMap2.Find((BaseRef)aNode)),
+                  leafCount   = distances.GetVDim();
+    //bool        isRoot      = parentIndex < 0;
+
+    _SimpleList * childLeaves = (_SimpleList*)childLists(myIndex);
+
+    _Matrix     * lookup = parentIndex>=0?&distances:&rootDistances;
+
+    if (parentIndex < 0) {
+        parentIndex = 0;
+    }
+
+    long ci2 = 0;
+
+    _Parameter myLength = branchLengths.theData [myIndex];
+
+    for (long ci = 0; ci < leafCount; ci++) {
+        if (ci == childLeaves->lData[ci2]) {
+            if (ci2 < childLeaves->lLength - 1) {
+                ci2++;
+            }
+        } else {
+            distances.Store (myIndex, ci, (*lookup)(parentIndex,ci) + myLength);
+        }
+    }
+
+
+    for (long ci3 = aNode->get_num_nodes(); ci3; ci3--) {
+        FindCOTHelper (aNode->go_down (ci3), myIndex, distances, rootDistances, branchLengths, childLists, addressToIndexMap2, myLength);
+    }
+}
+
+//__________________________________________________________________________________
+
+void _TreeTopology::FindCOTHelper2 (node<long>* aNode, _Matrix& branchSpans, _Matrix& branchLengths, _AVLListX& addressToIndexMap2, node<long>* referrer, _Parameter d)
+{
+    long          myIndex     = aNode->parent?addressToIndexMap2.GetXtra(addressToIndexMap2.Find((BaseRef)aNode)):-1;
+    _Parameter    myLength    = myIndex>=0?branchLengths.theData [myIndex]:0.0;
+
+    for (long ci = aNode->get_num_nodes(); ci; ci--) {
+        node <long>* daChild = aNode->go_down (ci);
+        if (daChild != referrer) {
+            FindCOTHelper2 (daChild,  branchSpans, branchLengths, addressToIndexMap2, nil, d+myLength);
+        }
+    }
+    if (aNode->parent) { // not the root
+        if (d>=0.0) {
+            branchSpans.Store (myIndex,0,d);
+        } else {
+            branchSpans.Store (myIndex,0,0.);
+        }
+
+        branchSpans.Store (myIndex,1,d+myLength);
+        if (referrer) {
+            FindCOTHelper2 (aNode->parent, branchSpans, branchLengths, addressToIndexMap2, aNode, d+myLength);
+        }
+    }
+}
+
+//__________________________________________________________________________________
+
+_AssociativeList* _TreeTopology::FindCOT (_PMathObj p)
+// Find the Center of the Tree (COT) location
+// using an L_p metric (L_2 works well)
+{
+    _Parameter         power           = p->Compute()->Value(),
+                       totalTreeLength = 0.0;
+
+    _AssociativeList * resList = new _AssociativeList;
+
+    if (power<=0.) {
+        WarnError (_String("Invalid power argument in call to COT finder (Min on trees). Must be positive, had :") & power);
+        return resList;
+    }
+
+    _SimpleList        avlSL,
+                       avlSL2,
+                       listOfNodes;
+
+    _List              avlSL3,
+                       childLists;
+
+    _AVLListX          addressToIndexMap  (&avlSL),         // leaves only
+                       addressToIndexMap2 (&avlSL2),        // complete index
+                       lengthToIndexMap   (&avlSL3);
+
+    long               leafCount   = 0,
+                       branchCount = 0,
+                       tIndex      = 0;
+
+    DepthWiseT        (true);
+
+    while (currentNode->parent) {
+        if (IsCurrentNodeATip ()) {
+            addressToIndexMap.Insert ((BaseRef)currentNode, leafCount++);
+        } else {
+            branchCount++;
+        }
+
+        addressToIndexMap2.Insert ((BaseRef)currentNode, tIndex++);
+        DepthWiseT (false);
+    }
+
+    // allocate the matrix of path lengths with hardwired (traversal order) indices
+    // also allocate a list of sorted lists to store children nodes
+    // and a map of (longed) node addresses to post order traversal indices
+
+    _Matrix      distances          (branchCount+leafCount, leafCount, false, true),
+                 rootDistances        (1, leafCount,  false, true),
+                 branchLengths        (1, branchCount+leafCount,  false, true),
+                 branchSpans      (branchCount+leafCount+1,2,false,true);
+
+    _String      nodeName;
+
+    // pass 1: fill up the nodes up to the root (i.e. below any internal node)
+
+    DepthWiseT        (true);
+    tIndex            = 0;
+
+    while (currentNode->parent) {
+
+        _Parameter          myLength;
+        GetBranchLength     (currentNode, myLength);
+        lengthToIndexMap.Insert (new _String(totalTreeLength), tIndex, false, true);
+        totalTreeLength      += myLength;
+
+        branchLengths.Store (0, tIndex++, myLength);
+        listOfNodes << (long)currentNode;
+        _SimpleList         *childIndices = (_SimpleList*)checkPointer(new _SimpleList);
+
+        if (IsCurrentNodeATip ()) {
+            (*childIndices) << addressToIndexMap.GetXtra(addressToIndexMap.Find((BaseRef)currentNode));
+            //leafNames<<LocateVar(currentNode->in_object)->GetName();
+        } else {
+            long           myIndex = addressToIndexMap2.GetXtra(addressToIndexMap2.Find((BaseRef)currentNode));
+
+            _SimpleList    mappedLeaves (leafCount,0,0);
+            for (long ci = currentNode->get_num_nodes(); ci; ci--) {
+                long          childIndex = addressToIndexMap2.GetXtra(addressToIndexMap2.Find((BaseRef)currentNode->go_down (ci)));
+                _SimpleList * childLeaves = (_SimpleList*)childLists(childIndex);
+
+                myLength = branchLengths.theData[childIndex];
+
+                for (long ci2 = 0; ci2 < childLeaves->lLength; ci2++) {
+                    long ttIndex = childLeaves->lData[ci2];
+                    mappedLeaves.lData[ttIndex] = 1;
+                    distances.Store (myIndex, ttIndex, distances (childIndex, ttIndex) + myLength);
+                }
+            }
+
+            for (long ci2 = 0; ci2 < leafCount; ci2++)
+                if (mappedLeaves.lData[ci2]) {
+                    (*childIndices) << ci2;
+                }
+        }
+
+        childLists.AppendNewInstance(childIndices);
+        DepthWiseT (false);
+    }
+
+    // pass 2: fill the root vector
+
+    //nodeName = "COT_DM1";
+    //setParameter (nodeName, &distances);
+
+    for (long ci = theRoot->get_num_nodes(); ci; ci--) {
+        long          childIndex = addressToIndexMap2.GetXtra(addressToIndexMap2.Find((BaseRef)theRoot->go_down (ci)));
+        _SimpleList * childLeaves = (_SimpleList*)childLists(childIndex);
+        _Parameter       myLength = branchLengths.theData[childIndex];
+        for (long ci2 = 0; ci2 < childLeaves->lLength; ci2++) {
+            tIndex = childLeaves->lData[ci2];
+            rootDistances.Store (0, tIndex, distances (childIndex, tIndex) + myLength);
+            //printf ("root->%s = %g\n", ((_String*)leafNames(tIndex))->sData, distances (childIndex, tIndex) + myLength);
+        }
+    }
+
+
+    // pass 3: fill in the "other site" branch lengths
+
+    for (long ci3 = theRoot->get_num_nodes(); ci3; ci3--) {
+        FindCOTHelper (theRoot->go_down (ci3), -1, distances, rootDistances, branchLengths, childLists, addressToIndexMap2, 0);
+    }
+
+    //nodeName = "COT_DM2";
+    //setParameter (nodeName, &distances);
+
+
+
+    // now traverse the tree and look for the maximum
+
+    tIndex                         = 0;         // stores the index of current min
+
+    _Parameter  currentMin         = 1e100,
+                currentBranchSplit = 0;
+
+
+    for (long ci = distances.GetHDim()-1; ci>=0; ci--) {
+        _Parameter    T           = branchLengths.theData[ci];
+        _SimpleList * childLeaves = (_SimpleList*)childLists(ci);
+        long          ci2         = 0;
+
+        if (CheckEqual (power,2.0)) {
+            _Parameter    sumbT  = 0.,
+                          sumbT2 = 0.,
+                          suma   = 0.,
+                          suma2  = 0.;
+
+
+
+            for (long ci3 = 0; ci3 < leafCount; ci3++) {
+                _Parameter tt = distances(ci,ci3);
+
+                /*
+                printf ("%s->%s = %g\n", ttt2.sData, ((_String*)leafNames(ci3))->sData, tt);
+                */
+
+                if (ci3 == childLeaves->lData[ci2]) {
+                    if (ci2 < childLeaves->lLength-1) {
+                        ci2++;
+                    }
+
+                    suma   += tt;
+                    suma2  += tt*tt;
+                } else {
+                    sumbT  += tt;
+                    sumbT2 += tt*tt;
+                }
+            }
+
+
+            _Parameter tt = (sumbT-suma)/leafCount;/*(sumbT-suma)/leafCount*/;
+            if (tt < 0.0) {
+                tt = 0.;
+            } else if (tt > T) {
+                tt = T;
+            }
+
+            sumbT = tt*tt*leafCount + 2*tt*(suma-sumbT) + suma2 + sumbT2;
+
+            if (sumbT < currentMin) {
+                tIndex             = ci;
+                currentBranchSplit = tt;
+                currentMin         = sumbT;
+            }
+        } else {
+            _Parameter  step        = T>0.0?T*0.0001:0.1,
+                        currentT    = 0.;
+
+            while (currentT<T) {
+                _Parameter dTT = 0.0;
+
+                ci2 = 0;
+
+                for (long ci3 = 0; ci3 < leafCount; ci3++) {
+                    _Parameter tt = distances(ci,ci3);
+                    if (ci3 == childLeaves->lData[ci2]) {
+                        if (ci2 < childLeaves->lLength-1) {
+                            ci2++;
+                        }
+
+                        dTT   += pow(tt+currentT,power);
+                    } else {
+                        dTT   += pow(tt-currentT,power);
+                    }
+                }
+
+                if (dTT < currentMin) {
+                    tIndex             = ci;
+                    currentBranchSplit = currentT;
+                    currentMin         = dTT;
+                }
+                currentT += step;
+            }
+        }
+    }
+
+    node <long>*    cotBranch = (node<long>*)listOfNodes.lData[tIndex];
+    GetNodeName     (cotBranch,nodeName);
+
+
+    resList->MStore (cotNode, new _FString(nodeName,false),false);
+    resList->MStore (cotSplit, new _Constant (currentBranchSplit), false);
+    resList->MStore (cotDistance, new _Constant (currentMin), false);
+    resList->MStore (cotBranchLength, new _Constant (branchLengths.theData[tIndex]), false);
+
+    //  compute the distribution of lengths away from COT
+
+    FindCOTHelper2  (cotBranch, branchSpans, branchLengths, addressToIndexMap2, nil, currentBranchSplit-branchLengths.theData [tIndex]);
+    if (cotBranch->parent) {
+        _Parameter adjuster = branchLengths.theData [tIndex]-currentBranchSplit;
+        branchSpans.Store (branchCount+leafCount,1,adjuster);
+        node <long>* cotParent = cotBranch->parent;
+        if (cotParent->parent) {
+            adjuster -= branchLengths.theData[addressToIndexMap2.GetXtra(addressToIndexMap2.Find((BaseRef)cotParent))];
+        }
+        FindCOTHelper2  (cotParent, branchSpans, branchLengths, addressToIndexMap2, cotBranch, adjuster);
+    }
+
+    _List        timeSplits;
+    _AVLListX    timeSplitsAVL (&timeSplits);
+
+    for (long sc=0; sc <= branchCount+leafCount; sc++) {
+        char       buffer[256];
+        snprintf  (buffer, 256, "%.15f", branchSpans(sc,0));
+        nodeName = buffer;
+        branchSpans.Store(sc,0,nodeName.toNum());
+        timeSplitsAVL.Insert (nodeName.makeDynamic(),0,false,true);
+        snprintf  (buffer, 256, "%.15f", branchSpans(sc,1));
+        nodeName = buffer;
+        branchSpans.Store(sc,1,nodeName.toNum());
+        timeSplitsAVL.Insert (nodeName.makeDynamic(),0,false,true);
+    }
+
+    _Matrix       cotCDFPoints (timeSplitsAVL.countitems(),3,false,true);
+
+    _AssociativeList  * ctl = (_AssociativeList  *)checkPointer(new _AssociativeList ());
+
+    _SimpleList tcache;
+
+    long        iv,
+                k = timeSplitsAVL.Traverser (tcache, iv, timeSplitsAVL.GetRoot());
+
+    for (long pc = 0; k>=0; k = timeSplitsAVL.Traverser (tcache, iv), pc++) {
+        timeSplitsAVL.SetXtra (k, pc);
+        cotCDFPoints.Store (pc,0,((_String*)(*((_List*)timeSplitsAVL.dataList))(k))->toNum());
+    }
+
+
+    for (long mxc=0; mxc <= branchCount+leafCount; mxc++) {
+        _Parameter T0 =  branchSpans(mxc,0),
+                   T1 =  branchSpans(mxc,1);
+
+        if (mxc<branchCount+leafCount) {
+            GetNodeName     ((node<long>*)listOfNodes(mxc), nodeName);
+            ctl->MStore (nodeName, new _Constant (T1), false);
+        }
+
+        char       buffer[256];
+        snprintf  (buffer, 256, "%.15f", T0);
+        nodeName = buffer;
+        tcache.Clear();
+        long       startingPos =  timeSplitsAVL.Find (&nodeName,tcache),
+                   k           = timeSplitsAVL.Next (startingPos,tcache);
+
+        for (long pc = timeSplitsAVL.GetXtra (k); k>=0; k = timeSplitsAVL.Next (k,tcache), pc++) {
+            _Parameter ub = ((_String*)(*((_List*)timeSplitsAVL.dataList))(k))->toNum();
+            if (ub < T1 || CheckEqual (T1, ub)) {
+                cotCDFPoints.Store (pc,1,cotCDFPoints(pc,1)+1);
+            } else {
+                break;
+            }
+        }
+    }
+
+    for (long mxc=1; mxc<cotCDFPoints.GetHDim() ; mxc++) {
+        cotCDFPoints.Store (mxc,1,cotCDFPoints(mxc,1)*(cotCDFPoints(mxc,0)-cotCDFPoints(mxc-1,0))/totalTreeLength);
+        cotCDFPoints.Store (mxc,2,cotCDFPoints(mxc,1)+cotCDFPoints(mxc-1,2));
+    }
+    timeSplitsAVL.Clear(true);
+
+
+    resList->MStore (cotCDF, &cotCDFPoints, true);
+    resList->MStore (cotToNode, ctl, false);
+
+    //  sample  random branch placement
+    if (totalTreeLength > 0.0) {
+        _Parameter     sampler;
+        checkParameter (cotSamples, sampler, 0.0);
+
+        tIndex = sampler;
+        if (tIndex >= 1) {
+            _Matrix sampledDs  (tIndex, 1, false, true);
+
+            for (long its = 0; its < tIndex; its ++) {
+                _Parameter tSample = (genrand_real2 () * totalTreeLength);
+                nodeName = tSample;
+                long branchIndex = 0;
+                if (lengthToIndexMap.FindBest (&nodeName,branchIndex)<=0) {
+                    branchIndex --;
+                }
+
+                _Parameter    T         = branchLengths.theData[branchIndex];
+                _SimpleList * childLeaves = (_SimpleList*)childLists(branchIndex);
+
+                _Parameter dTT = 0.0;
+                tSample -= ((_String*)(*(_List*)lengthToIndexMap.dataList)(branchIndex))->toNum();
+
+                long          ci2 = 0;
+                for (long ci3 = 0; ci3 < leafCount; ci3++) {
+                    _Parameter tt = distances(branchIndex,ci3);
+                    if (ci3 == childLeaves->lData[ci2]) {
+                        if (ci2 < childLeaves->lLength-1) {
+                            ci2++;
+                        }
+
+                        dTT   += pow(tt+tSample,power);
+                    } else {
+                        dTT   += pow(tt+T-tSample,power);
+                    }
+                }
+
+                sampledDs.Store (its,0,dTT);
+            }
+            setParameter (cotSampler, &sampledDs);
+        }
+
+    }
+    return resList;
+}
+
+//__________________________________________________________________________________
+
+_FString*    _TreeTopology::Compare (_PMathObj p)
+// compare tree topologies
+{
+    _FString * res = new _FString;
+
+    long objClass = p->ObjectClass();
+
+    if (objClass==TREE || objClass==TOPOLOGY) {
+        _String cmp = CompareTrees ((_TreeTopology*)p);
+        if (cmp.startswith (eqWithReroot)) {
+            (*res->theString) = cmp.Cut(eqWithReroot.sLength + ((_TreeTopology*)p)->GetName()->sLength + 1, cmp.sLength-2);
+        } else if (cmp.startswith(eqWithoutReroot)) {
+            (*res->theString) = _String (' ');
+        }
+    }
+    return res;
+}
+
+
+//__________________________________________________________________________________
+
+char     _TreeTopology::internalNodeCompare (node<long>* n1, node<long>* n2, _SimpleList& subTreeMap, _SimpleList* reindexer, bool cangoup, long totalSize, node<long>* n22, _TreeTopology* tree2, bool isPattern)
+// compares whether the nodes create the same subpartition
+{
+    // count the number of children
+    long  nc1 = n1->get_num_nodes(),
+          nc2 = n2->get_num_nodes() + (cangoup&&n2->parent) - (n22&&(!n2->parent));
+
+
+    if ((nc1 == nc2)||(isPattern&&(nc2<nc1))) {
+        // now see if the descendants in all directions can be matched
+        // first prepare the list of subtrees in the 2nd tree
+
+        _List           nodeMap;
+
+        _SimpleList*    complement = nil;
+        _SimpleList     stSizes;
+
+        if ((cangoup||n22)&&n2->parent) {
+            complement = new _SimpleList ((unsigned long)totalSize);
+            checkPointer (complement);
+            complement->lLength = totalSize;
+
+            for (long k3 = 0; k3 < totalSize; k3++) {
+                complement->lData[k3] = 1;
+            }
+        }
+
+        nc2 = n2->get_num_nodes();
+
+        long  skippedChild = -1,
+              complementCorrection = 0;
+
+        for (long k=1; k <= nc2; k++) {
+            node<long>* meChild = n2->go_down(k);
+            _SimpleList * childLeaves   = (_SimpleList*)meChild->in_object;
+            if (meChild == n22) {
+                if (complement)
+                    if (reindexer)
+                        for (long k2 = 0; k2 < childLeaves->lLength; k2++) {
+                            long lidx = reindexer->lData[childLeaves->lData[k2]];
+                            if (lidx>=0) {
+                                complement->lData[lidx]    = 0;
+                            } else {
+                                complementCorrection ++;
+                            }
+                        }
+                    else
+                        for (long k2 = 0; k2 < childLeaves->lLength; k2++) {
+                            complement->lData[childLeaves->lData[k2]] = 0;
+                        }
+
+                skippedChild = k-1;
+            } else {
+                _SimpleList * subTreeLeaves = new _SimpleList ((unsigned long)totalSize);
+                checkPointer (subTreeLeaves);
+                subTreeLeaves->lLength = totalSize;
+
+                //subTreeMap << ((_SimpleList*)n1->go_down(k)->in_object)->lLength;
+
+                if (complement) {
+                    if (reindexer) {
+                        for (long k2 = 0; k2 < childLeaves->lLength; k2++) {
+                            long lidx = reindexer->lData[childLeaves->lData[k2]];
+                            if (lidx < 0) {
+                                delete complement;
+                                delete subTreeLeaves;
+                                return 0;
+                            }
+                            subTreeLeaves->lData[lidx] = 1;
+                            complement->lData[lidx]    = 0;
+                        }
+                    } else {
+                        for (long k2 = 0; k2 < childLeaves->lLength; k2++) {
+                            subTreeLeaves->lData[childLeaves->lData[k2]] = 1;
+                            complement->lData[childLeaves->lData[k2]] = 0;
+                        }
+                    }
+                } else if (reindexer) {
+                    for (long k2 = 0; k2 < childLeaves->lLength; k2++) {
+                        long lidx = reindexer->lData[childLeaves->lData[k2]];
+                        if (lidx < 0) {
+                            delete subTreeLeaves;
+                            return 0;
+                        }
+                        subTreeLeaves->lData[lidx] = 1;
+                    }
+                } else {
+                    for (long k2 = 0; k2 < childLeaves->lLength; k2++) {
+                        subTreeLeaves->lData[childLeaves->lData[k2]] = 1;
+                    }
+                }
+
+                stSizes << childLeaves->lLength;
+
+                nodeMap << subTreeLeaves;
+
+                DeleteObject (subTreeLeaves);
+            }
+        }
+
+        if (complement) {
+            nodeMap << complement;
+            DeleteObject (complement);
+            stSizes << totalSize;
+
+            for (long k4 = 0; k4 < stSizes.lLength-1; k4++) {
+                stSizes.lData[stSizes.lLength-1] -= stSizes.lData[k4];
+            }
+
+            if (n22) {
+                stSizes.lData[stSizes.lLength-1] -= ((_SimpleList*)n22->in_object)->lLength-complementCorrection;
+            }
+        }
+
+        // now go through the subtrees of the first tree and match up (if we can)
+        // with the 2nd 1
+
+        _SimpleList     unmatchedPatterns;
+
+        for (long k5=1; k5 <= nc1; k5++) {
+            _SimpleList * childNodes = (_SimpleList*) n1->go_down(k5)->in_object;
+            long k6;
+            for (k6=0; k6 < stSizes.lLength; k6++)
+                if (stSizes.lData[k6] == childNodes->lLength)
+                    // potential subtree match
+                {
+                    _SimpleList* potMap = (_SimpleList*)nodeMap(k6);
+                    long k7;
+                    for (k7=0; k7<childNodes->lLength; k7++)
+                        if (potMap->lData[childNodes->lData[k7]] == 0) {
+                            break;
+                        }
+
+                    if (k7 == childNodes->lLength) {
+                        stSizes.lData[k6] = -1;
+
+                        if (complement && (k6 == stSizes.lLength-1)) {
+                            subTreeMap << -1;
+                        } else {
+                            if (n22&&(k6>=skippedChild)) {
+                                subTreeMap << k6+1;
+                            } else {
+                                subTreeMap << k6;
+                            }
+                        }
+                        break;
+                    }
+                }
+
+            if (k6 == stSizes.lLength)
+                if (isPattern) {
+                    unmatchedPatterns << k5;
+                    subTreeMap << -2;
+                } else {
+                    return 0;
+                }
+        }
+
+        if (isPattern&&unmatchedPatterns.lLength) {
+            _SimpleList rematchedPatterns;
+            for (long k7 = 0; k7 < unmatchedPatterns.lLength; k7++) {
+                rematchedPatterns << -1;
+            }
+
+            for (long k8 = 0; k8 < stSizes.lLength; k8++) {
+                if (stSizes.lData[k8]>0) {
+                    _SimpleList* potMap = (_SimpleList*)nodeMap(k8);
+                    for (long k9 = 0; k9 < unmatchedPatterns.lLength; k9++) {
+                        if (rematchedPatterns.lData[k9] < 0) {
+                            _SimpleList * childNodes = (_SimpleList*) n1->go_down(unmatchedPatterns.lData[k9])->in_object;
+                            long k10 = 0;
+                            for (; k10 < childNodes->lLength; k10++)
+                                if (potMap->lData[childNodes->lData[k10]] == 0) {
+                                    break;
+                                }
+                            if (k10 == childNodes->lLength) {
+                                rematchedPatterns.lData[k9] = k8;
+                                if (complement && (k8 == stSizes.lLength-1)) {
+                                    subTreeMap.lData [unmatchedPatterns.lData[k9]-1] = -(0xfffffff);
+                                } else {
+                                    if (n22&&(k8>=skippedChild)) {
+                                        subTreeMap.lData [unmatchedPatterns.lData[k9]-1] = -k8-3;
+                                    } else {
+                                        subTreeMap.lData [unmatchedPatterns.lData[k9]-1] = -k8-2;
+                                    }
+                                }
+                            }
+                        }
+                    }
+                } else {
+                    stSizes.lData[k8] = 0;
+                }
+            }
+
+            if (rematchedPatterns.Find(-1)>=0) {
+                return 0;
+            }
+
+            for (long k11 = 0; k11 < rematchedPatterns.lLength; k11++) {
+                stSizes.lData[rematchedPatterns.lData[k11]] -= ((_SimpleList*) n1->go_down(unmatchedPatterns.lData[k11])->in_object)->lLength;
+            }
+
+            for (long k12 = 0; k12 < stSizes.lLength; k12++)
+                if (stSizes.lData[k12]) {
+                    return 0;
+                }
+        }
+
+        /*_String nm1, nm2;
+        tree2->GetNodeName (n1,nm1);
+        GetNodeName (n2,nm2);
+        printf ("Node match %s, %s\n",  nm1.sData, nm2.sData, "\n");*/
+
+        return 1;
+    }
+
+    return 0;
+}
+
+
+//long   itcCount = 0;
+//__________________________________________________________________________________
+
+char     _TreeTopology::internalTreeCompare (node<long>* n1, node<long>* n2, _SimpleList* reindexer, char compMode, long totalSize, node<long>* n22, _TreeTopology* tree2, bool isPattern)
+// compare tree topologies
+{
+    if (n1->get_num_nodes() == 0) {
+        return 1;
+    } else {
+        _SimpleList mapper;
+        if (internalNodeCompare (n1,n2, mapper, reindexer, compMode, totalSize, n22, tree2, isPattern)) {
+            long nc1 = n1->get_num_nodes();
+
+            _SimpleList     furtherMatchedPatterns;
+            _List           patternList;
+
+            for (long k1=0; k1 < nc1; k1++) {
+                if (mapper.lData[k1]>=0) {
+                    if (internalTreeCompare (n1->go_down(k1+1),n2->go_down(mapper.lData[k1]+1), reindexer, 0, totalSize, nil, tree2, isPattern)<1) {
+                        return -1;
+                    }
+                } else if (mapper.lData[k1] == -1) {
+                    if (internalTreeCompare (n1->go_down(k1+1),n2->parent, reindexer, 0, totalSize, n2, tree2, isPattern)<1) {
+                        return -1;
+                    }
+                } else {
+                    long idx = -mapper.lData[k1]-2,
+                         k;
+
+                    _SimpleList * patched;
+                    if ((k=furtherMatchedPatterns.Find(idx))<0) {
+                        k = furtherMatchedPatterns.lLength;
+                        furtherMatchedPatterns << idx;
+                        patched = new _SimpleList;
+                        checkPointer (patched);
+                        patternList << patched;
+                        DeleteObject (patched);
+                    }
+
+                    patched = (_SimpleList*)patternList(k);
+                    (*patched) << k1;
+                }
+            }
+            for (long k2=0; k2 < furtherMatchedPatterns.lLength; k2++) {
+                node <long>* dummy = new node<long>;
+                checkPointer (dummy);
+                dummy->parent = n1->parent;
+                _SimpleList * children = (_SimpleList*)patternList (k2),
+                              * newLeaves = new _SimpleList;
+
+                checkPointer (newLeaves);
+                dummy->in_object = (long)newLeaves;
+
+
+                for (long k3 = 0; k3 < children->lLength; k3++) {
+                    node<long>* aChild = n1->go_down(children->lData[k3]+1);
+                    dummy->nodes.add (aChild);
+                    _SimpleList  t;
+                    t.Union (*newLeaves, *(_SimpleList*)aChild->in_object);
+                    newLeaves->Clear();
+                    newLeaves->Duplicate(&t);
+                }
+
+
+                long k4 = furtherMatchedPatterns.lData[k2];
+                char res = 1;
+
+                if (newLeaves->lLength > 1) {
+                    if (k4<n2->get_num_nodes()) {
+                        res = internalTreeCompare(dummy, n2->go_down(k4+1),  reindexer, 0, totalSize, nil, tree2, isPattern);
+                    } else {
+                        res = internalTreeCompare (dummy,n2->parent, reindexer, 0, totalSize, n2, tree2, isPattern);
+                    }
+                }
+
+                DeleteObject (newLeaves);
+                delete (dummy);
+
+                if (res<1) {
+                    return -1;
+                }
+
+            }
+        } else {
+            return 0;
+        }
+    }
+    return 1;
+}
+
+//__________________________________________________________________________________
+
+_String  _TheTree::FindMaxCommonSubTree (_TheTree* compareTo, long& sizeVar, _List* forest)
+{
+    _List           myLeaves,
+                    otherLeaves,
+                    sharedLeaves;
+
+    _SimpleList     indexer,
+                    otherIndexer,
+                    sharedLeavesIDin1,
+                    sharedLeavesIDin2;
+
+    node<long>      *myCT,
+         *otherCT;
+
+    _String         rerootAt;
+
+    myCT            = prepTree4Comparison(myLeaves, indexer);
+    otherCT         = compareTo->prepTree4Comparison(otherLeaves, otherIndexer);
+
+    sharedLeaves.Intersect (otherLeaves,myLeaves,&sharedLeavesIDin1,&sharedLeavesIDin2);
+
+    if (sharedLeaves.lLength>1) { // more than one common leaf
+        // now we need to map shared leaves to a common indexing space
+
+        _SimpleList    reindexer ((unsigned long)otherLeaves.lLength),
+                       lidx1     ((unsigned long)myLeaves.lLength),
+                       lidx2     ((unsigned long)otherLeaves.lLength),
+                       ldx1,
+                       ldx2;
+
+        reindexer.lLength       = (unsigned long)otherLeaves.lLength;
+        lidx1.lLength = myLeaves.lLength;
+        lidx2.lLength = otherLeaves.lLength;
+
+        for (long k=0; k<otherLeaves.lLength; k++) {
+            lidx2.lData[otherIndexer.lData[k]] = k;
+        }
+
+        for (long k0=0; k0<myLeaves.lLength; k0++) {
+            lidx1.lData[indexer.lData[k0]] = k0;
+        }
+
+        for (long k1=0; k1<reindexer.lLength; k1++) {
+            reindexer.lData[k1] = -1;
+        }
+
+        for (long k2=0; k2<sharedLeaves.lLength; k2++) {
+            reindexer.lData[lidx2.lData[sharedLeavesIDin2.lData[k2]]] = lidx1.lData[sharedLeavesIDin1.lData[k2]];
+        }
+
+        // now we map actual leaf structures to their respective leaf indices
+
+        node<long>* meNode = DepthWiseStepTraverser (myCT);
+
+        while (meNode) {
+            if (meNode->get_num_nodes() == 0) {
+                ldx1 << (long)meNode;
+            }
+            meNode = DepthWiseStepTraverser ((node<long>*)nil);
+        }
+
+        meNode = DepthWiseStepTraverser (otherCT);
+
+        while (meNode) {
+            if (meNode->get_num_nodes() == 0) {
+                ldx2 << (long)meNode;
+            }
+            meNode = DepthWiseStepTraverser ((node<long>*)nil);
+        }
+
+        // now we loop through the list of leaves and try to match them all up
+
+        _SimpleList     matchedTops,
+                        matchedSize;
+
+        for (long k3=0; k3<sharedLeaves.lLength-1; k3++) {
+            if (reindexer.lData[lidx2.lData[sharedLeavesIDin2.lData[k3]]]>=0)
+                // leaf still available
+            {
+                node<long>*      ln1 = (node<long>*)ldx1.lData[lidx1.lData[sharedLeavesIDin1.lData[k3]]],
+                                 *       ln2 = (node<long>*)ldx2.lData[lidx2.lData[sharedLeavesIDin2.lData[k3]]],
+                                         *      p1  = ln1->parent,
+                                                *         p2  = ln2->parent;
+
+                char             cRes = 0;
+
+                while ((internalTreeCompare (p1,p2,&reindexer,0,myLeaves.lLength,p2->parent?nil:ln2,compareTo) == 1)&&p1&&p2) {
+                    ln1 = p1;
+                    ln2 = p2;
+                    p1=p1->parent;
+                    p2=p2->parent;
+
+                    cRes = 1;
+                }
+                if (cRes) {
+                    _SimpleList* matchedLeaves = (_SimpleList*)ln2->in_object;
+
+                    matchedTops << (long)ln1;
+                    matchedSize << matchedLeaves->lLength;
+
+                    for (long k4=0; k4<matchedLeaves->lLength; k4++) {
+                        reindexer.lData[matchedLeaves->lData[k4]] = -1;
+                    }
+                }
+            }
+        }
+
+        if (matchedSize.lLength) {
+            if (forest) {
+                sizeVar = 0;
+                for (long k6=0; k6<matchedSize.lLength; k6++) {
+                    long maxSz = 0;
+
+                    node<long>* meNode = DepthWiseStepTraverser (myCT),
+                                *   mNode  = (node<long>*)matchedTops.lData[k6];
+
+                    while (meNode) {
+                        if (meNode->get_num_nodes()) {
+                            if (meNode == mNode) {
+                                break;
+                            }
+                            maxSz ++;
+                        }
+                        meNode = DepthWiseStepTraverser ((node<long>*)nil);
+                    }
+
+                    meNode = DepthWiseStepTraverser (theRoot);
+
+                    while (meNode) {
+                        if (meNode->get_num_nodes()) {
+                            if (maxSz == 0) {
+                                (*forest) << LocateVar(meNode->in_object)->GetName();
+                                break;
+                            }
+                            maxSz--;
+                        }
+                        meNode = DepthWiseStepTraverser ((node<long>*)nil);
+                    }
+                    sizeVar += matchedSize.lData[k6];
+                }
+            } else {
+                long maxSz = -1,
+                     maxIdx  = 0;
+
+                for (long k5=0; k5<matchedSize.lLength; k5++)
+                    if (matchedSize.lData[k5]>maxSz) {
+                        maxSz = matchedSize.lData[k5];
+                        maxIdx  = k5;
+                    }
+
+                sizeVar = maxSz;
+
+                maxSz = 0;
+
+                node<long>* meNode = DepthWiseStepTraverser (myCT),
+                            *   mNode  = (node<long>*)matchedTops.lData[maxIdx];
+
+                while (meNode) {
+                    if (meNode->get_num_nodes()) {
+                        if (meNode == mNode) {
+                            break;
+                        }
+                        maxSz ++;
+                    }
+                    meNode = DepthWiseStepTraverser ((node<long>*)nil);
+                }
+
+                meNode = DepthWiseStepTraverser (theRoot);
+
+                while (meNode) {
+                    if (meNode->get_num_nodes()) {
+                        if (maxSz == 0) {
+                            return *LocateVar(meNode->in_object)->GetName();
+                        }
+                        maxSz--;
+                    }
+                    meNode = DepthWiseStepTraverser ((node<long>*)nil);
+                }
+            }
+        }
+    }
+    return empty;
+}
+
+
+//__________________________________________________________________________________
+
+_String  _TheTree::CompareSubTrees (_TheTree* compareTo, node<long>* topNode)
+// compare tree topologies
+{
+    _List           myLeaves,
+                    otherLeaves,
+                    sharedLeaves;
+
+    _SimpleList     indexer,
+                    otherIndexer,
+                    sharedLeavesID;
+
+    node<long>      *myCT,
+         *otherCT;
+
+    _String         rerootAt;
+
+    myCT            = prepTree4Comparison(myLeaves, indexer);
+    otherCT         = compareTo->prepTree4Comparison(otherLeaves, otherIndexer, topNode);
+
+    sharedLeaves.Intersect (myLeaves, otherLeaves,&sharedLeavesID);
+
+    // first compare the inclusion for the set of leaf labels
+
+    if (sharedLeavesID.lLength == otherLeaves.lLength) {
+        _SimpleList ilist ((unsigned long)myLeaves.lLength);
+        ilist.lLength = myLeaves.lLength;
+
+        {
+            //for BCC
+            for (long k2 = 0; k2 < ilist.lLength; k2++) {
+                ilist.lData[k2] = -1;
+            }
+        }
+        {
+            //for BCC
+            for (long k2 = 0; k2 < otherIndexer.lLength; k2++) {
+                ilist.lData[sharedLeavesID.lData[otherIndexer.lData[k2]]] = k2;
+            }
+        }
+        for (long k2 = 0; k2<indexer.lLength; k2++) {
+            long         lidx      = ilist.lData[indexer.lData[k2]];
+
+            if (lidx>=0) {
+                indexer.lData[k2] = lidx;
+            } else {
+                indexer.lData[k2] = -1;
+            }
+        }
+
+        _SimpleList *reindexer = &indexer;
+
+        // now compare explore possible subtree matchings
+        // for all internal nodes of this tree except the root
+
+        char   compRes = 0;
+
+        long   tCount = 1,
+               nc2 = topNode->get_num_nodes();
+
+        node<long>* meNode = DepthWiseStepTraverser (myCT);
+        meNode = DepthWiseStepTraverser ((node<long>*)nil);
+
+        while (meNode!=myCT) {
+            long nc = meNode->get_num_nodes();
+            if (nc == nc2) {
+                long kk;
+                for (kk = 1; kk <= nc; kk++) {
+                    compRes = internalTreeCompare (otherCT,meNode, reindexer, 0, otherLeaves.lLength, meNode->go_down(kk),compareTo);
+                    if (compRes) {
+                        if (compRes == -1) {
+                            meNode = myCT;
+                        }
+                        break;
+                    }
+                }
+                if (kk>nc) {
+                    compRes = internalTreeCompare (otherCT,meNode, reindexer, 0, otherLeaves.lLength, nil, compareTo);
+                    if (compRes) {
+                        if (compRes == -1) {
+                            meNode = myCT;
+                        }
+                        break;
+                    }
+                } else {
+                    break;
+                }
+            }
+            tCount ++;
+            meNode = DepthWiseStepTraverser ((node<long>*)nil);
+        }
+
+        if (meNode!=myCT) {
+            meNode = DepthWiseStepTraverser (theRoot);
+            while (meNode!=theRoot) {
+                if (tCount==0) {
+                    rerootAt = _String("Matched at the ") & *LocateVar (meNode->in_object)->GetName() & '.';
+                    break;
+                } else {
+                    tCount --;
+                }
+
+                meNode = DepthWiseStepTraverser ((node<long>*)nil);
+            }
+        } else {
+            long nc = myCT->get_num_nodes();
+
+            if (nc == nc2+1)
+                for (long kk = 1; kk <= nc; kk++) {
+                    compRes = internalTreeCompare (otherCT,myCT, reindexer, 0, otherLeaves.lLength, myCT->go_down(kk),compareTo);
+                    if (compRes==1) {
+                        break;
+                    }
+                }
+
+            if (compRes == 1) {
+                rerootAt = "Matched at the root.";
+            }
+        }
+
+        if (!rerootAt.sLength) {
+            rerootAt = "No match: Different topologies (matching label sets).";
+        }
+    } else {
+        rerootAt = "No match: Unequal label sets.";
+    }
+
+    destroyCompTree (myCT);
+    destroyCompTree (otherCT);
+
+    return          rerootAt;
+}
+
+//__________________________________________________________________________________
+void _TreeTopology::EdgeCount (long& leaves, long& internals)
+{
+    leaves    = 0;
+    internals = 0;
+    DepthWiseT(true);
+    while (currentNode) {
+        if (IsCurrentNodeATip()) {
+            leaves ++;
+        } else {
+            internals ++;
+        }
+
+        DepthWiseT(false);
+    }
+
+}
+
+
+//__________________________________________________________________________________
+_PMathObj _TreeTopology::TipCount (void)
+{
+    long leaves, ints;
+    EdgeCount (leaves, ints);
+    return new _Constant (leaves);
+}
+
+//__________________________________________________________________________________
+_PMathObj _TreeTopology::BranchCount (void)
+{
+    long leaves, ints;
+    EdgeCount (leaves, ints);
+    return new _Constant (ints-1);
+}
+
+//__________________________________________________________________________________
+_PMathObj _TreeTopology::FlatRepresentation (void)
+{
+    _SimpleList     flatTree;
+
+    node      <long>* tNode = DepthWiseStepTraverser (theRoot);
+
+    long      count = 0;
+
+    while     (tNode) {
+        flatTree << tNode->in_object;
+        tNode->in_object = count++;
+        tNode = DepthWiseStepTraverser ((node<long>*)nil);
+    }
+
+
+    _Matrix * res = new _Matrix (1,count, false, true);
+    checkPointer (res);
+
+    tNode = DepthWiseStepTraverser (theRoot);
+    count = 0;
+
+    while     (tNode) {
+        if (tNode->parent) {
+            res->theData[count] = tNode->parent->in_object;
+        } else {
+            res->theData[count] = -1;
+        }
+
+        tNode->in_object = flatTree.lData[count++];
+        tNode = DepthWiseStepTraverser ((node<long>*)nil);
+    }
+
+    return res;
+}
+
+//__________________________________________________________________________________
+_PMathObj _TreeTopology::AVLRepresentation (_PMathObj layoutOption)
+{
+
+    if (layoutOption->ObjectClass () == NUMBER) {
+        bool               preOrder = layoutOption->Compute()->Value()>0.5;
+
+        _AssociativeList * masterList = (_AssociativeList * ) checkPointer(new _AssociativeList ());
+        _FString           nameHolder;
+        //             arrayKey;
+
+        _Constant          lengthHolder;
+
+        long         rootIndex = 0,
+                     nodeLevel = 0;
+
+        _SimpleList  nodeList;
+        _AVLListX    nodeIndexList (&nodeList);
+
+        node      <long>* tNode = preOrder?StepWiseTraverser(theRoot):DepthWiseStepTraverser (theRoot);
+
+        while     (tNode) {
+            nodeIndexList.Insert ((BaseObj*)tNode, nodeIndexList.countitems()+1);
+
+            if (tNode->parent == nil) {
+                rootIndex = nodeIndexList.countitems();
+            }
+
+            tNode = preOrder?StepWiseTraverser((node<long>*)nil):DepthWiseStepTraverser ((node<long>*)nil);
+        }
+
+        tNode = preOrder?StepWiseTraverserLevel(nodeLevel,theRoot):DepthWiseStepTraverserLevel (nodeLevel,theRoot);
+
+        while     (tNode) {
+            _AssociativeList * nodeList = (_AssociativeList * ) checkPointer(new _AssociativeList ());
+            GetNodeName (tNode, *nameHolder.theString);
+            nodeList->MStore ("Name", &nameHolder, true);
+            GetBranchLength (tNode, lengthHolder.theValue);
+            nodeList->MStore ("Length", &lengthHolder, true);
+            lengthHolder.theValue = nodeLevel;
+            nodeList->MStore ("Depth", new _Constant (nodeLevel), false);
+            if (tNode->parent) {
+                nodeList->MStore ("Parent", new _Constant(nodeIndexList.GetXtra (nodeIndexList.Find((BaseObj*)tNode->parent))), false);
+            }
+
+            long nCount = tNode->get_num_nodes();
+            if (nCount) {
+                _AssociativeList * childList = new _AssociativeList ();
+                checkPointer (childList);
+                for (long k = 1; k<=nCount; k=k+1) {
+                    childList->MStore (_String((long)(k-1)),new _Constant(nodeIndexList.GetXtra (nodeIndexList.Find((BaseObj*)tNode->go_down(k)))) , false);
+                }
+                nodeList->MStore ("Children", childList, false);
+            }
+            masterList->MStore (_String((long)nodeIndexList.GetXtra (nodeIndexList.Find((BaseObj*)tNode))), nodeList, false);
+            tNode = preOrder?StepWiseTraverserLevel(nodeLevel,(node<long>*)nil):DepthWiseStepTraverserLevel (nodeLevel,(node<long>*)nil);
+        }
+
+        _AssociativeList * headerList = new _AssociativeList ();
+        checkPointer (headerList);
+
+        headerList->MStore ("Name", new _FString (*GetName()), false);
+        headerList->MStore ("Root", new _Constant(rootIndex), false);
+        masterList->MStore ("0", headerList, false);
+
+        return masterList;
+    }
+    return new _Constant (0.0);
+}
+
+//__________________________________________________________________________________
+_PMathObj _TreeTopology::TipName (_PMathObj p)
+{
+    _String resString;
+
+    if (p&& p->ObjectClass()==NUMBER) {
+        long res        = p->Value(),
+             count         = 0;
+
+        _List           * allLeaves = nil;
+
+        if (res < 0) {
+            allLeaves = (_List*)checkPointer(new _List);
+        }
+
+        LeafWiseT(true);
+
+        while (currentNode) {
+            if (res < 0) {
+                GetNodeName (currentNode,resString);
+                (*allLeaves) && & resString;
+            } else if (res==count) {
+                //resString = travNode->GetName()->Cut(travNode->GetName()->Find ('.')+1,-1);
+                GetNodeName (currentNode,resString);
+                break;
+            }
+            count++;
+            LeafWiseT(false);
+        }
+
+        if (res < 0) {
+            _Matrix * res = new _Matrix (*allLeaves);
+            DeleteObject (allLeaves);
+            return res;
+        }
+    }
+
+    return new _FString (resString,false);
+}
+
+//__________________________________________________________________________________
+_PMathObj _TreeTopology::BranchLength (_PMathObj p)
+{
+    _Parameter resValue = HY_INVALID_RETURN_VALUE;
+
+
+    if (p) {
+        if (p->ObjectClass()==NUMBER) {
+            long res        = p->Value(),
+                 count         = 0;
+
+            if (res < 0)
+                // get ALL branch lengths
+            {
+                EdgeCount (count, res);
+                _Matrix*   branchLengths = (_Matrix*) checkPointer(new _Matrix (1,count+res,false,true));
+
+                count       = 0;
+                DepthWiseT  (true);
+                while (!IsCurrentNodeTheRoot()) {
+                    GetBranchLength (currentNode, branchLengths->theData[count++]);
+                    DepthWiseT      (false);
+                }
+                return branchLengths;
+            } else
+                // get a branch length
+            {
+                DepthWiseT(true);
+                while (currentNode && res != count) {
+                    count++;
+                    DepthWiseT(false);
+                }
+                if (currentNode && !IsCurrentNodeTheRoot()) {
+                    GetBranchLength (currentNode,resValue);
+                }
+            }
+        } else {
+            if (p->ObjectClass()==STRING) {
+                _List * twoIDs = ((_FString*)p->Compute())->theString->Tokenize(";");
+                if (twoIDs->lLength == 2 || twoIDs->lLength == 1) {
+                    _String * node1 = (_String*)(*twoIDs) (0),
+                              * node2 = twoIDs->lLength>1?(_String*)(*twoIDs) (1):nil;
+
+                    node<long>* n1 = nil,
+                                * n2 = nil;
+
+                    long        l1 = 0,
+                                l2 = 0,
+                                l  = 0;
+
+                    DepthWiseTLevel(l,true);
+
+                    _String      cBranchName;
+
+                    while (currentNode && (!n1 || !n2)) {
+                        GetNodeName (currentNode, cBranchName);
+                        if (cBranchName.Equal (node1)) {
+                            n1 = currentNode;
+                            l1 = l;
+                        } else if (node2 && cBranchName.Equal (node2)) {
+                            n2 = currentNode;
+                            l2 = l;
+                        }
+
+                        DepthWiseTLevel  (l,false);
+                    }
+
+                    if (n1 && n2) {
+                        _Parameter p1 = 0,
+                                   p2 = 0,
+                                   p;
+
+                        while (l1<l2) {
+                            GetBranchLength (n2,p);
+                            p2 += p;
+                            n2 = n2->parent;
+                            l2--;
+                        }
+
+                        while (l2<l1) {
+                            GetBranchLength (n1,p);
+                            p1 += p;
+                            n1 = n1->parent;
+                            l1--;
+                        }
+
+                        while (n1!=n2) {
+                            GetBranchLength (n1,p);
+                            p1 += p;
+                            GetBranchLength (n2,p);
+                            p2 += p;
+                            n2 = n2->parent;
+                            n1 = n1->parent;
+                        }
+
+                        resValue = p1+p2;
+                    } else if (n1)
+                        if (node2) {
+                            if (node1->Equal(node2)) {
+                                resValue = 0.0;
+                            } else if (node2->Equal (&expectedNumberOfSubs)) {
+                                _String bl;
+                                GetBranchLength (n1, bl, true);
+                                if (bl.sLength) {
+                                    DeleteObject(twoIDs);
+                                    return new _FString (bl);
+                                }
+                            }
+                        } else {
+                            GetBranchLength(n1,resValue);
+                        }
+                }
+                DeleteObject (twoIDs);
+            }
+        }
+    }
+
+    if (isnan (resValue)) {
+        return new _MathObject ();
+    }
+
+    return new _Constant (resValue);
+
+}
+//__________________________________________________________________________________
+_PMathObj _TreeTopology::BranchName (_PMathObj p, bool subtree, _PMathObj p2)
+{
+    _String resString;
+
+    if (p) {
+        if (p->ObjectClass()==NUMBER) {
+            long res    = p->Value(),
+                 count    = -1;
+
+            if (res>=0) {
+                DepthWiseT(true);
+                while (currentNode) {
+                    if (!IsCurrentNodeATip()) {
+                        count++;
+                    }
+
+                    if (res==count) {
+                        if (subtree) {
+                            _String         st (128L, true);
+                            char            mapMode  = -1;
+                            if (p2) {
+                                _String * t = (_String*)p2->Compute()->toStr();
+                                DetermineBranchLengthMappingMode (t,mapMode);
+                                DeleteObject (t);
+                                switch (mapMode) {
+                                case 3:
+                                    mapMode = -1;
+                                    break;
+                                case 1:
+                                    mapMode = -3;
+                                    break;
+                                case 2:
+                                    mapMode = -2;
+                                    break;
+                                }
+                            }
+                            SubTreeString   (st,true,mapMode);
+                            st.Finalize();
+                            resString = st;
+                        } else
+                            //resString = travNode->GetName()->Cut(travNode->GetName()->Find ('.')+1,-1);
+                        {
+                            GetNodeName (currentNode, resString);
+                        }
+                        break;
+                    }
+                    DepthWiseT(false);
+                    if (IsCurrentNodeTheRoot()) {
+                        return new _MathObject();
+                    }
+                }
+            } else {
+                count = 0;
+                DepthWiseT(true);
+                while (currentNode) {
+                    count++;
+                    DepthWiseT(false);
+                }
+
+                _Matrix* branchLengths = new _Matrix (1,count,false,true);
+                checkPointer (branchLengths);
+                branchLengths->Convert2Formulas ();
+
+                count = 0;
+                DepthWiseT(true);
+
+                //long  cutAt = GetName()->sLength+1;
+
+                while (currentNode) {
+                    _String       bs;   //(travNode->GetName()->Cut(cutAt,-1));
+                    GetNodeName  (currentNode, bs);
+                    _FString*     bName = new _FString (bs);
+                    checkPointer (bName);
+                    _Formula      bNamef (bName,false);
+
+                    branchLengths->StoreFormula (0,count++,bNamef);
+                    DepthWiseT(false);
+                }
+                return branchLengths;
+            }
+        } else {
+            if (p->ObjectClass()==STRING) {
+                _List * twoIDs = ((_FString*)p->Compute())->theString->Tokenize(";");
+
+
+                if (twoIDs->lLength == 2 || twoIDs->lLength == 1) {
+
+                    _String * node1 = (_String*)(*twoIDs) (0),
+                              * node2 = twoIDs->lLength>1?(_String*)(*twoIDs) (1):nil;
+
+
+
+                    if (twoIDs->lLength == 1) {
+                        _AssociativeList * resList = (_AssociativeList*) checkPointer(new _AssociativeList);
+                        long            level       = 0,
+                                        masterLevel = 0;
+
+                        StepWiseTLevel   (level,true);
+
+                        _String       givenNodeName;
+
+                        while (currentNode) {
+                            GetNodeName   (currentNode,givenNodeName);
+                            if (givenNodeName.Equal (node1)) {
+                                masterLevel = level;
+                                resList->MStore(givenNodeName,new _Constant (currentNode->get_num_nodes()));
+                                do {
+                                    GetNodeName   (currentNode,givenNodeName);
+                                    resList->MStore(givenNodeName,new _Constant (1+(currentNode->get_num_nodes()>0)));
+                                    StepWiseTLevel(level,false);
+                                } while (currentNode && level > masterLevel);
+
+                                break;
+                            }
+                            StepWiseTLevel(level,false);
+                        }
+                        if (resList->avl.countitems() == 0)
+                            // fail
+                        {
+                            DeleteObject (resList);
+                            return new _MathObject;
+                        }
+                        return resList;
+                    } else {
+                        node<long>* n1 = nil,
+                                    * n2 = nil;
+
+                        long        l1 = 0,
+                                    l2 = 0,
+                                    l  = 0;
+
+                        DepthWiseTLevel(l,true);
+
+                        _String      cBranchName;
+
+                        while (currentNode && (!n1 || !n2)) {
+                            GetNodeName (currentNode, cBranchName);
+                            if (cBranchName.Equal (node1)) {
+                                n1 = currentNode;
+                                l1 = l;
+                            } else if (node2 && cBranchName.Equal (node2)) {
+                                n2 = currentNode;
+                                l2 = l;
+                            }
+
+                            DepthWiseTLevel  (l,false);
+                        }
+
+                        if (n1 && n2) {
+                            _List prefix,
+                                  suffix;
+
+                            while (l1<l2) {
+                                GetNodeName              (n2,cBranchName);
+                                suffix.AppendNewInstance (cBranchName.makeDynamic());
+                                n2 = n2->parent;
+                                l2--;
+                            }
+
+                            while (l2<l1) {
+                                GetNodeName             (n1,cBranchName);
+                                prefix.AppendNewInstance (cBranchName.makeDynamic());
+                                n1 = n1->parent;
+                                l1--;
+                            }
+
+                            while (n1!=n2) {
+                                GetNodeName     (n2,cBranchName);
+                                suffix.AppendNewInstance (cBranchName.makeDynamic());
+                                GetNodeName     (n1,cBranchName);
+                                prefix.AppendNewInstance (cBranchName.makeDynamic());
+                                n2 = n2->parent;
+                                n1 = n1->parent;
+                            }
+
+                            suffix.Flip();
+                            prefix << suffix;
+                            return new _Matrix(prefix);
+                        } else if (n1) {
+                            return new _Matrix();
+                        }
+                        return new _MathObject();
+                    }
+
+                }
+            }
+        }
+    }
+    return new _FString (resString);
+
+}
+
+//__________________________________________________________________________________
+void _TreeTopology::RerootTreeInternalTraverser (long originator, bool passedRoot, _String&res, long blOption, bool firstTime)
+{
+    if (passedRoot) {
+        SubTreeString (res);
+    } else {
+        // move to parent now
+        node<long>*     myParent = currentNode->get_parent(), *saveCurrent;
+        _String t;
+        if (myParent->get_parent()) { // not root yet
+            res<<'(';
+            saveCurrent = currentNode;
+            currentNode = myParent;
+            RerootTreeInternalTraverser (currentNode->get_child_num(),false,res,blOption);
+            for (long i = 1; i<=myParent->get_num_nodes(); i++) {
+                if (i==originator) {
+                    continue;
+                }
+                currentNode = myParent->go_down(i);
+                res<<',';
+                SubTreeString (res,false,blOption);
+            }
+            res<<')';
+            currentNode = saveCurrent;
+            if (!firstTime) {
+                GetNodeName (currentNode/*myParent*/, t);
+                if (!t.startswith(iNodePrefix)) {
+                    res<<&t;
+                }
+            }
+            PasteBranchLength (currentNode,res,blOption);
+        } else { // passing old root
+            // create a new root with >=2 children nodes - this, and one more containing all other children (>=2 of them)
+            long count        = 0,
+                 rootChildren = theRoot->get_num_nodes();
+
+            if (rootChildren > 2) {
+                res << '(';
+            }
+
+            node<long>* stashOriginator;
+
+            for (long k = 1; k<=theRoot->get_num_nodes(); k++) {
+                currentNode = theRoot->go_down(k);
+                if (k==originator) {
+                    stashOriginator = currentNode;
+                    continue;
+                }
+                if (count) {
+                    res<<',';
+                }
+                count++;
+                SubTreeString (res,false,blOption);
+            }
+            if (rootChildren > 2) {
+                res<<')';
+            }
+
+            /*if (stashOriginator->get_num_nodes())
+            {
+                GetNodeName (stashOriginator, t);
+                if (!t.startswith(iNodePrefix))
+                    res<<&t;
+            }*/
+            PasteBranchLength (stashOriginator,res,blOption);
+        }
+    }
+}
+
+//__________________________________________________________________________________
+void _TreeTopology::SubTreeString (_String&res, bool allNames,long branchLengths,_AVLListXL* subs)
+{
+    long    level           = 0,
+            lastLevel        = 0,
+            j;
+
+    _String t;
+
+    node<long>* saveCurrent = currentNode;
+
+    currentNode = DepthWiseStepTraverserLevel(level,currentNode);
+
+    while (currentNode) {
+        if (level>lastLevel) {
+            if (lastLevel) {
+                res<<',';
+            }
+            for (j=0; j<level-lastLevel; j++) {
+                res<<'(';
+            }
+        } else if (level<lastLevel) {
+            for (j=0; j<lastLevel-level; j++) {
+                res<<')';
+            }
+        } else if (lastLevel) {
+            res<<',';
+        }
+
+        GetNodeName (currentNode, t);
+        if (subs) {
+            long mapIdx = subs->Find (&t);
+            if (mapIdx >= 0) {
+                t = *(_String*)subs->GetXtra (mapIdx);
+            }
+        }
+
+        lastLevel = level;
+        if (!IsCurrentNodeTheRoot()) {
+            if (allNames || (!t.startswith (iNodePrefix))) {
+                res<< &t;
+            }
+            PasteBranchLength (currentNode,res,branchLengths);
+
+        }
+        currentNode = DepthWiseStepTraverserLevel(level,(node<long>*)nil);
+    }
+
+    currentNode = saveCurrent;
+}
+
+//__________________________________________________________________________________
+void            _TreeTopology::PasteBranchLength (node<long>* currentNode, _String& res, long branchLengths, _Parameter factor)
+{
+    if (branchLengths!=-1) {
+        _String t;
+        if (branchLengths==-2) {
+            GetBranchValue (currentNode, t);
+        } else if (branchLengths==-3) {
+            GetBranchLength (currentNode,t);
+        } else {
+            GetBranchVarValue (currentNode, t, branchLengths);
+        }
+
+        if (t.sLength) {
+            t = t.toNum()*factor;
+            res<<':';
+            res<<&t;
+        }
+    }
+
+}
+
+//__________________________________________________________________________________
+void            _TreeTopology::GetBranchLength (node<long> * n, _String& r, bool getBL)
+{
+    if (getBL) {
+        r = empty;
+    } else {
+        r = compExp->theData[n->in_object];
+    }
+}
+
+//__________________________________________________________________________________
+void            _TreeTopology::GetBranchLength (node<long> * n, _Parameter& r)
+{
+    r = compExp->theData[n->in_object];
+}
+
+//__________________________________________________________________________________
+void            _TheTree::GetBranchLength (node<long> * n, _String& r, bool getBL)
+{
+    if (getBL) {
+        bool    mbf;
+
+        _Matrix *mm,
+                *fv;
+
+        RetrieveModelComponents(((_CalcNode*)(((BaseRef*)variablePtrs.lData)[n->in_object]))->GetModelIndex(), mm, fv, mbf);
+
+        if (mm && fv) {
+            r.CopyDynamicString(mm->BranchLengthExpression(fv,mbf), true);
+        } else {
+            r = empty;
+        }
+
+    } else {
+        r = ((_CalcNode*)(((BaseRef*)variablePtrs.lData)[n->in_object]))->BranchLength();
+    }
+}
+
+//__________________________________________________________________________________
+void            _TheTree::GetBranchLength (node<long> * n, _Parameter& r)
+{
+    r = ((_CalcNode*)(((BaseRef*)variablePtrs.lData)[n->in_object]))->BranchLength();
+}
+
+//__________________________________________________________________________________
+void            _TreeTopology::GetBranchValue (node<long> *, _String& r)
+{
+    r = empty;
+}
+
+//__________________________________________________________________________________
+void            _TheTree::GetBranchValue (node<long> * n, _String& r)
+{
+    _Parameter t = ((_CalcNode*)(((BaseRef*)variablePtrs.lData)[n->in_object]))->Value();
+    if (t != -1.) {
+        r = t;
+    } else {
+        r = empty;
+    }
+}
+
+//__________________________________________________________________________________
+_String*            _TheTree::GetBranchSpec (node<long> * n)
+{
+    _CalcNode* cn = (_CalcNode*)(((BaseRef*)variablePtrs.lData)[n->in_object]);
+
+    _String * res = new _String (32L, true);
+    long      nModel = cn->GetTheModelID();
+    if (nModel >= 0) {
+        (*res) << '{';
+        (*res) << LocateVar(modelMatrixIndices.lData[nModel])->GetName();
+    }
+
+    if (iVariables && iVariables->lLength) {
+        if (res->sLength) {
+            (*res) << ',';
+        } else {
+            (*res) << '{';
+        }
+
+        for (long k=0; k < iVariables->lLength; k+=2) {
+            if (k) {
+                (*res) << ',';
+            }
+            _Variable * av = LocateVar (iVariables->lData[k]);
+            if (iVariables->lData[k+1] >= 0) {
+                (*res) << LocateVar (iVariables->lData[k+1])->GetName();
+            } else {
+                (*res) << av->GetName();
+            }
+
+            (*res) << '=';
+            _String   vval (av->Value());
+            (*res) << &vval;
+        }
+    }
+
+    if (dVariables && dVariables->lLength) {
+        long m = 0;
+        for (long k=0; k < dVariables->lLength; k+=2) {
+            if (dVariables->lData[k+1] < 0) {
+                if (m) {
+                    (*res) << ',';
+                } else if (res->sLength) {
+                    (*res) << ',';
+                } else {
+                    (*res) << '{';
+                }
+
+                m++;
+                _Variable * av = LocateVar (dVariables->lData[k]);
+                (*res) << av->GetName();
+                (*res) << ":=";
+                (*res) << '=';
+                _String   * vval = av->GetFormulaString();
+                (*res) << vval;
+                DeleteObject (vval);
+            }
+        }
+    }
+
+    if (res->sLength) {
+        (*res) << '}';
+    }
+
+    res->Finalize();
+    return res;
+}
+
+//__________________________________________________________________________________
+void            _TreeTopology::GetBranchVarValue (node<long> *, _String& r, long)
+{
+    r = empty;
+}
+
+//__________________________________________________________________________________
+void            _TheTree::GetBranchVarValue (node<long> * n, _String& r, long idx)
+{
+    _CalcNode * travNode = (_CalcNode*)(((BaseRef*)variablePtrs.lData)[n->in_object]);
+    long iVarValue = travNode->iVariables->FindStepping(idx,2,1);
+    if (iVarValue>0)
+        // user variable, but not in the model
+    {
+        r = _String(LocateVar (travNode->iVariables->lData[iVarValue-1])->Value());
+    } else {
+        _String query = _String('.') & *LocateVar(idx)->GetName();
+        for (long k = 0; k<travNode->iVariables->lLength; k+=2) {
+            _Variable *localVar = LocateVar(travNode->iVariables->lData[k]);
+            if (localVar->GetName()->endswith (query)) {
+                r = _String(localVar->Value());
+                return;
+            }
+        }
+    }
+}
+
+//__________________________________________________________________________________
+_PMathObj _TreeTopology::RerootTree (_PMathObj p)
+{
+    _String * res = new _String ((unsigned long)256, true);
+
+    iNodePrefix = "Node";
+    _PMathObj iv = FetchObjectFromVariableByType(&internalNodePrefix,STRING);
+    if (iv) {
+        iNodePrefix = *((_FString*)iv)->theString;
+    }
+
+    if (p&& p->ObjectClass()==STRING) {
+        if (rooted == UNROOTED) {
+            ReportWarning ("Reroot was called with an unrooted tree. Rerooting was still performed.");
+        }
+
+        _String *tNodeN    = (_String*)p->toStr();
+
+        node<long>* rerootNode = FindNodeByName (tNodeN);
+
+        if (rerootNode) { // good node name, can reroot
+            if (rerootNode->parent) {
+                node <long> * saveCN = rerootNode;
+                (*res)<<'('; // opening tree (
+                RerootTreeInternalTraverser (rerootNode->get_child_num(),false,*res,-2,true);
+                (*res)<<',';
+                currentNode = saveCN;
+                SubTreeString (*res,0,-2);
+                (*res)<<')';
+            } else {
+                SubTreeString (*res,0,-2);
+            }
+        }
+
+        DeleteObject (tNodeN);
+    } else {
+        _String errMsg ("Reroot Tree was passed an invalid branch argument.");
+        WarnError (errMsg);
+    }
+
+    res->Finalize();
+    return new _FString (res);
+}
+//__________________________________________________________________________________
+
+void    _TheTree::AlignNodes (node<nodeCoord>* theNode)
+{
+    long k = theNode->get_num_nodes();
+    if (k) {
+        theNode->in_object.v = (theNode->go_down(1)->in_object.v+theNode->go_down(k)->in_object.v)/2.0;
+        theNode->in_object.h = 0;
+        for (; k; k--) {
+            _Parameter t = theNode->go_down(k)->in_object.h;
+            if (t<theNode->in_object.h) {
+                theNode->in_object.h = t;
+            }
+        }
+        theNode->in_object.h -= TREE_H_SHIFT;
+    } else {
+        theNode->in_object.v = 0;
+        theNode->in_object.h = 0;
+    }
+}
+//__________________________________________________________________________________
+
+node<nodeCoord>* _TheTree::AlignedTipsMapping (bool first, bool respectRoot)
+{
+    long  k;
+    long descendants;
+    if (first) {
+        treeLayoutVert = 0.0;
+        descendants = theRoot->get_num_nodes();
+        node<nodeCoord>* aRoot = new node<nodeCoord>; // reslove rootedness here
+        aRoot->in_object.varRef = -1;
+        aRoot->go_next(); // dumbass initialization for later
+        if ((rooted == UNROOTED)||(!respectRoot)) {
+            for (k=1; k<=descendants; k++) {
+                currentNode = theRoot->go_down(k);
+                aRoot->add_node(*AlignedTipsMapping());
+            }
+            AlignNodes (aRoot);
+            return aRoot;
+        } else {
+            node<nodeCoord>* aChild = new node<nodeCoord>;
+            aChild->in_object.varRef = -1;
+            if (rooted == ROOTED_LEFT) {
+                aRoot->add_node (*aChild);
+                for (k=1; k<descendants; k++) {
+                    currentNode = theRoot->go_down(k);
+                    aChild->add_node(*AlignedTipsMapping());
+                }
+                currentNode = theRoot->go_down(k);
+                aRoot->add_node(*AlignedTipsMapping());
+            } else {
+                currentNode = theRoot->go_down(1);
+                aRoot->add_node(*AlignedTipsMapping());
+                for (k=2; k<=descendants; k++) {
+                    currentNode = theRoot->go_down(k);
+                    aChild->add_node(*AlignedTipsMapping());
+                }
+                aRoot->add_node (*aChild);
+            }
+            AlignNodes (aChild);
+            AlignNodes (aRoot);
+            return      aRoot;
+        }
+    } else {
+        node<nodeCoord>*aNode = new node<nodeCoord>;
+        node<long>* saveCurrent = currentNode;
+        descendants = saveCurrent->get_num_nodes();
+        for (k=1; k<=descendants; k++) {
+            currentNode = saveCurrent->go_down(k);
+            aNode->add_node(*AlignedTipsMapping());
+        }
+        if (!descendants) { // terminal node
+            aNode->in_object.v = treeLayoutVert;
+            aNode->in_object.h = 0;
+            treeLayoutVert+=TREE_V_SHIFT;
+        } else {
+            AlignNodes (aNode);
+        }
+        aNode->in_object.varRef = saveCurrent->in_object;
+        currentNode = saveCurrent;
+        return aNode;
+    }
+}
+
+//__________________________________________________________________________________
+
+#define     BAD_BRANCH_LENGTH  0.000000001
+
+//__________________________________________________________________________________
+
+void _TheTree::ScaledBranchReMapping (node<nodeCoord>* theNode, _Parameter tw)
+{
+    theNode->in_object.h -= tw;
+
+    long descendants=theNode->get_num_nodes();
+
+    for (long k=1; k<=descendants; k++) {
+        ScaledBranchReMapping (theNode->go_down(k), tw);
+    }
+}
+//__________________________________________________________________________________
+
+_String      _TreeTopology::DetermineBranchLengthMappingMode (_String* param, char& mapMode)
+{
+    mapMode = 3;
+    if (param) {
+        if (param->Equal(&expectedNumberOfSubs)) {
+            mapMode = 1;
+        } else if (param->Equal(&stringSuppliedLengths)) {
+            mapMode = 2;
+        } else {
+            mapMode = 0;
+            return _String('.') & *param;
+        }
+
+    }
+    return empty;
+}
+//__________________________________________________________________________________
+
+_Parameter       _TheTree::DetermineBranchLengthGivenScalingParameter (long varRef, _String& matchString, char mapMode)
+{
+    if (mapMode == 3) {
+        return 1.;
+    }
+
+    _CalcNode * travNode = (_CalcNode*)LocateVar(varRef);
+
+    _Parameter branchLength = BAD_BRANCH_LENGTH;
+
+    if (mapMode==1) {
+        return travNode->BranchLength();
+    } else if (mapMode==2) {
+        branchLength = travNode->Value();
+        if (branchLength<=0.0) {
+            branchLength = BAD_BRANCH_LENGTH;
+        }
+    } else {
+        long j;
+        if (travNode->iVariables)
+            for (j=0; j<travNode->iVariables->lLength; j+=2) {
+                _Variable* curVar  = LocateVar (travNode->iVariables->lData[j]);
+                if (curVar->GetName()->endswith (matchString)) {
+                    branchLength = curVar->Compute()->Value();
+                    if (branchLength<=0.0) {
+                        branchLength = BAD_BRANCH_LENGTH;
+                    } else {
+                        break;
+                    }
+                }
+            }
+
+        if (((!travNode->iVariables) || j == travNode->iVariables->lLength) && travNode->dVariables)
+            for (j=0; j<travNode->dVariables->lLength; j+=2) {
+                _Variable* curVar = LocateVar (travNode->dVariables->lData[j]);
+                if (curVar->GetName()->endswith (matchString)) {
+                    branchLength = curVar->Compute()->Value();
+                    if (branchLength<=0.0) {
+                        branchLength = BAD_BRANCH_LENGTH;
+                    } else {
+                        break;
+                    }
+                }
+            }
+    }
+
+    return branchLength;
+}
+
+
+//__________________________________________________________________________________
+
+node<nodeCoord>* _TheTree::ScaledBranchMapping (node<nodeCoord>* theParent, _String* scalingParameter, long locDepth, long& depth, char mapMode)
+{
+    // run a pass of aligned tip mapping then perform one more pass from the root to the children
+    // pre-order to remap the length of branches.
+
+    static  _Parameter treeWidth;
+    bool    wasRoot = !theParent;
+
+    if (!theParent) {
+        theParent = AlignedTipsMapping (true,true);
+        theParent->in_object.h = 0.0;
+        treeWidth = 0;
+    }
+
+    node<nodeCoord>* currentN;
+    long descendants = theParent->get_num_nodes(),
+         k           = 1,
+         j,
+         b           = -1;
+
+    _Parameter  branchLength = BAD_BRANCH_LENGTH;
+
+    for  (; k<=descendants; k++) {
+        currentN = theParent->go_down(k);
+        j        = currentN->in_object.varRef;
+
+        if (j>=0) {
+
+            branchLength  = currentN->in_object.bL = DetermineBranchLengthGivenScalingParameter(j,*scalingParameter,mapMode);
+            branchLength += theParent->in_object.h;
+
+            if (branchLength>treeWidth) {
+                treeWidth = branchLength;
+            }
+
+            theParent->go_down (k)->in_object.h = branchLength;
+            ScaledBranchMapping (theParent->go_down(k), scalingParameter, locDepth+1, depth, mapMode);
+
+        } else {
+            theParent->go_down (k)->in_object.h = 0;
+            b = k;
+        }
+
+    }
+
+    if (k==descendants+1) {
+        if (locDepth>=depth) {
+            depth = locDepth+1;
+        }
+    }
+
+    if (wasRoot) {
+        if (b>0 && descendants==2) {
+            j = (b==1)? 2 : 1;
+
+            //branchLength = theParent->go_down(j)->in_object.h/2;
+            //treeWidth -= branchLength;
+            //branchLength = theParent->go_down(j)->in_object.h;
+            ScaledBranchReMapping (theParent->go_down(j),0);
+            theParent->go_down(b)->in_object.h = 0;
+            ScaledBranchMapping (theParent->go_down(b), scalingParameter, locDepth, depth, mapMode);
+        }
+
+        ScaledBranchReMapping (theParent, treeWidth);
+        return theParent;
+    }
+    return nil;
+}
+
+//__________________________________________________________________________________
+
+node<nodeCoord>* _TheTree::RadialBranchMapping (node<long>* referenceNode, node<nodeCoord>* parentNode, _String* scalingParameter, _Parameter anglePerTip, long& currentTipID, _Parameter& maxRadius, char mapMode)
+{
+    // label 1 stores current radial distance from the root
+    // label 2 stores the angle of the line to this node
+    // h and v store the Cartesian coordinates
+
+    node <nodeCoord>* current_node = new node <nodeCoord>;
+
+    _Parameter          branchL     = 0.,
+                        referenceL   = 0.;
+
+    if  (parentNode == nil) {
+        current_node->in_object.label1 = 0.0;
+        current_node->in_object.label2 = 0.0;
+    } else {
+        referenceL = parentNode->in_object.label1;
+        branchL = DetermineBranchLengthGivenScalingParameter(referenceNode->in_object,*scalingParameter,mapMode);
+    }
+
+    long                children    = referenceNode->get_num_nodes();
+
+    current_node->in_object.label1 = referenceL + branchL;
+    if (children == 0) {
+        current_node->in_object.label2 = anglePerTip * currentTipID++;
+        //printf ("%d %g\n",currentTipID, current_node->in_object.label2);
+    } else {
+        _Parameter angleSum = 0.;
+        for (long n = 1; n <= children; n++) {
+            node<nodeCoord>* newChild = RadialBranchMapping (referenceNode->go_down(n), current_node, scalingParameter, anglePerTip, currentTipID, maxRadius, mapMode);
+            current_node->add_node(*newChild);
+            angleSum += newChild->in_object.label2;
+        }
+        current_node->in_object.label2 = angleSum / children;
+    }
+
+    current_node->in_object.h        = current_node->in_object.label1*cos(current_node->in_object.label2);
+    current_node->in_object.v        = current_node->in_object.label1*sin(current_node->in_object.label2);
+    maxRadius = MAX(maxRadius, current_node->in_object.label1);
+    current_node->in_object.varRef  = referenceNode->in_object;
+    current_node->in_object.bL      = branchL;
+
+    return current_node;
+}
+
+
+
+//__________________________________________________________________________________
+
+void _TheTree::AssignLabelsToBranches (node<nodeCoord>* theParent, _String* scalingParameter, bool below)
+{
+
+    bool    wasRoot = !(theParent->parent);
+
+    node<nodeCoord>* currentN;
+    long descendants = theParent->get_num_nodes(),k=1,j,b=-1;
+
+    _Parameter  branchLength = BAD_BRANCH_LENGTH;
+
+    char        mapMode;
+    _String     matchString = DetermineBranchLengthMappingMode(scalingParameter, mapMode);
+
+    for  (; k<=descendants; k++) {
+        currentN = theParent->go_down(k);
+        j = currentN->in_object.varRef;
+        if (j>=0) {
+
+            branchLength = DetermineBranchLengthGivenScalingParameter(j, matchString, mapMode);
+            if (below) {
+                currentN->in_object.label2 = branchLength;
+            } else {
+                currentN->in_object.label1 = branchLength;
+            }
+
+            AssignLabelsToBranches (theParent->go_down(k), scalingParameter, below);
+
+        } else {
+            if (below) {
+                currentN->in_object.label2 = 0.;
+            } else {
+                currentN->in_object.label1 = 0.;
+            }
+            b = k;
+            AssignLabelsToBranches (theParent->go_down(k), scalingParameter, below);
+        }
+
+    }
+
+    if (wasRoot) {
+        if ((b>0)&&(descendants==2)) {
+            if (b==1) {
+                j=2;
+            } else {
+                j=1;
+            }
+            if (below) {
+                theParent->in_object.label2 = theParent->go_down(j)->in_object.label2/2.;
+                theParent->go_down(j)->in_object.label2/=2.;
+            } else {
+                theParent->in_object.label1 = theParent->go_down(j)->in_object.label1/2.;
+                theParent->go_down(j)->in_object.label1/=2.;
+            }
+        }
+    }
+}
+
+//__________________________________________________________________________________
+
+_Parameter _TheTree::PSStringWidth (_String& s)
+{
+    _Parameter nnWidth = 0.;
+    for (long cc = 0; cc < s.sLength; cc++) {
+        nnWidth += _timesCharWidths[(int)s.getChar(cc)];
+    }
+    return nnWidth;
+}
+
+
+//__________________________________________________________________________________
+_PMathObj _TheTree::PlainTreeString (_PMathObj p, _PMathObj p2)
+{
+    _String *     res        = new _String ((unsigned long)512, true);
+    long          treeLayout = 0;
+
+    if (p&&(p->ObjectClass()==STRING)) {
+        if (p2&&(p2->ObjectClass()==MATRIX)) {
+            node<nodeCoord>* newRoot,
+                 *currentNd;
+
+            bool     doEmbed = false;
+            bool     doSymbol = false;
+            _FString *extraPS   = nil,
+                      *prefixPS   = nil;
+            long    symbolsize = 3;
+
+
+            _AssociativeList * toptions  = (_AssociativeList*)FetchObjectFromVariableByType (&treeOutputAVL,ASSOCIATIVE_LIST);
+
+            if (toptions) {
+                _PMathObj lc = toptions->GetByKey (treeOutputLayout, NUMBER);
+                if (lc) {
+                    treeLayout = lc->Value();
+                }
+                lc = toptions->GetByKey (treeOutputEmbed, NUMBER);
+                if (lc) {
+                    doEmbed = lc->Value();
+                }
+                lc = toptions->GetByKey(treeOutputSymbols, NUMBER);
+                if ( lc ) {
+                    doSymbol = lc->Value();
+                }
+
+                lc = toptions->GetByKey(treeOutputExtraPS, STRING);
+                if ( lc ) {
+                    extraPS = (_FString*)lc->Compute();
+                }
+
+                lc = toptions->GetByKey(treeOutputPrefixPS, STRING);
+                if ( lc ) {
+                    prefixPS = (_FString*)lc->Compute();
+                }
+
+                lc = toptions->GetByKey(treeOutputSymbolSize, NUMBER);
+                if ( lc ) {
+                    symbolsize = lc->Value();
+                }
+            }
+
+            _String*        theParam = (_String*) p->toStr(),
+                            t;
+
+            bool            scaling         = theParam->sLength,
+                            doLabelWidth  = true;
+
+            long            tipCount        = 0,
+                            fontSize       = -1;
+
+            _Matrix*        dimMatrix           = ((_Matrix*)p2->Compute());
+
+
+            _Parameter      hScale              = 1.0,
+                            vScale                = 1.0,
+                            labelWidth          = 0.,
+
+                            treeHeight           = (*dimMatrix)(0,1),
+                            treeWidth         = (*dimMatrix)(0,0),
+
+                            treeRotation      = (dimMatrix->GetVDim()>2)?(*dimMatrix)(0,2):0.0,
+                            treeRadius          ,
+                            treeArcAngle        ,
+                            totalTreeL          = 0.,
+
+                            mappedTreeHeight = 0.0,
+                            mappedTreeHeight2 = 1e+100;
+
+            // letter size in points
+            if (treeLayout == 1) {
+                treeRadius      = treeWidth;
+                treeArcAngle    = treeHeight;
+
+                if (treeRadius <= 0.0) {
+                    treeRadius = 300.;
+                }
+                if (treeArcAngle <= 0.0 || treeArcAngle > 360.) {
+                    treeArcAngle = 360.0;
+                }
+
+                treeWidth = treeHeight = treeRadius * 2.;
+
+                treeRotation = (treeRotation - floor(treeRotation/360.)*360.)/DEGREES_PER_RADIAN;
+            } else {
+                if (treeHeight <= 0.0) {
+                    treeHeight = 792.;
+                }
+                if (treeWidth  <= 0.0) {
+                    treeWidth  = 576.;
+                }
+            }
+
+
+
+            t = _String("%!\n%% PS file for the tree '")&*GetName()&"'.\n%% Generated by "& GetVersionString() & " on " & GetTimeStamp ();
+            (*res)<<&t;
+            if (treeLayout == 1) {
+                (*res) << "% Radial layout\n";
+                (*res) << "/righttext  {dup newpath 0 0 moveto false charpath closepath pathbbox pop exch pop exch sub       4 -1 roll exch sub 3 -1 roll newpath moveto show} def\n";
+            }
+            if (!doEmbed) {
+                (*res)<<"<< /PageSize [";
+
+                (*res)<<_String(treeWidth+15); /*wayne added 15 to make trees sit inside the page */
+                (*res)<<' ';
+                (*res)<<_String(treeHeight+15);
+
+                (*res)<<"] >> setpagedevice\n";
+            }
+
+ 
+            long        xtraChars = 0;
+
+            if (toptions) {
+                _Matrix* rgbColor = (_Matrix*)(toptions)->GetByKey (treeOutputBackground, MATRIX);
+                if (rgbColor) {
+                    t = _String((*rgbColor)(0,0)) & " " & _String((*rgbColor)(0,1)) & " " & _String((*rgbColor)(0,2)) & " setrgbcolor\nnewpath\n";
+                    (*res) << t;
+                    (*res) << "0 0 moveto\n";
+                    (*res) << "0 ";
+                    (*res) << _String(treeHeight);
+                    (*res) << " lineto\n";
+                    (*res) << _String(treeWidth);
+                    (*res) << ' ';
+                    (*res) << _String(treeHeight);
+                    (*res) << " lineto\n";
+                    (*res) << _String(treeWidth);
+                    (*res) << " 0 lineto\n";
+                    (*res) << "closepath\nfill\n0 0 0 setrgbcolor\n";
+                }
+
+                if ( doSymbol ) {
+                    /*add some symbol drawing postscript functions */
+                    (*res) << "/size ";
+                    (*res) << _String(symbolsize);
+                    (*res) << " def\n";
+                    (*res) << "/box { 0 -0.5 size mul rmoveto\n";
+                    (*res) << "1 size mul 0 size mul rlineto\n";
+                    (*res) << "0 size mul 1 size mul rlineto\n";
+                    (*res) << "-1 size mul 0 size mul rlineto\n";
+                    (*res) << "closepath\n";
+                    (*res) << "} def\n";
+
+                    (*res) << "/triangle { size size 0.5 mul rlineto 0 size -1 mul rlineto closepath } def\n";
+
+                    (*res) << "/circle {currentpoint exch 0.5 size mul add exch 0.5 size mul 180 540 arc\n";
+                    (*res) << "closepath\n";
+                    (*res) << "} def\n";
+
+                    (*res) << "/diamond { 0 -0.5 size mul rmoveto 0.5 size mul 0 rmoveto 45 rotate 0.707107 size mul 0 rlineto 0 size 0.707107 mul rlineto -0.707107 size mul 0 rlineto -45 rotate  closepath} def\n";
+                }
+
+
+                _Constant* fontSizeIn = (_Constant*)(toptions)->GetByKey (treeOutputFSPlaceH, NUMBER);
+                if (fontSizeIn) {
+                    fontSize = fontSizeIn->Value();
+                }
+
+                fontSizeIn = (_Constant*)(toptions)->GetByKey (treeOutputRightMargin, NUMBER);
+                if (fontSizeIn) {
+                    treeWidth = MAX(treeWidth/4+1,treeWidth-fontSizeIn->Value());
+                    doLabelWidth = false;
+                }
+
+                if ((fontSizeIn = (_Constant*)(toptions)->GetByKey (treeOutputXtraMargin, NUMBER))) {
+                    xtraChars = fontSizeIn->Value();
+                }
+            }
+
+            char    mapMode            = 0;
+            _String scalingStringMatch;
+
+            if (scaling) {
+                scalingStringMatch = DetermineBranchLengthMappingMode (theParam, mapMode);
+            }
+
+            if (treeLayout == 1) {
+                _PMathObj tempValue = TipCount();
+                tipCount            = tempValue->Value();
+                DeleteObject        (tempValue);
+                long                tipID = 0;
+                hScale              = 0.;
+                newRoot             = RadialBranchMapping (theRoot,nil,&scalingStringMatch,treeArcAngle*pi_const/(180.*tipCount),tipID,hScale,mapMode);
+                totalTreeL          = hScale;
+            } else {
+                if (scaling) {
+                    newRoot     = ScaledBranchMapping (nil, &scalingStringMatch, 0, tipCount,mapMode);
+                } else {
+                    newRoot     = AlignedTipsMapping  (true);
+                }
+
+                hScale    = -treeWidth/newRoot->in_object.h;
+            }
+
+            currentNd = NodeTraverser (newRoot);
+
+            while (currentNd) {
+                if (currentNd->in_object.v > mappedTreeHeight) {
+                    mappedTreeHeight = currentNd->in_object.v;
+                }
+                if (currentNd->in_object.v < mappedTreeHeight2) {
+                    mappedTreeHeight2 = currentNd->in_object.v;
+                }
+
+                if (!currentNd->get_num_nodes()) {
+                    tipCount++;
+                }
+
+                currentNd = NodeTraverser ((node<nodeCoord>*)nil);
+            }
+
+            // compute the size of the font, based on the spacing between branches.
+            // 36 is max and 2 is min;
+
+            if (fontSize<0) {
+                fontSize = treeHeight/(tipCount+1+(scaling>0)*1.5);
+
+                if (fontSize>36) {
+                    fontSize = 36;
+                } else if (fontSize<2) {
+                    fontSize = 2;
+                }
+            }
+
+            // now recompute the width of the of the tree, including the labels
+            // do not allow names to take up more that 1/2 of the width
+            // try to keep full length but if the names are too wide,
+            // shrink the size of the font
+
+            currentNd = NodeTraverser (newRoot);
+
+            _Parameter  plotBounds[4];
+
+            if (treeLayout == 1) {
+                vScale      = treeRadius/hScale;
+                plotBounds [0] = plotBounds[1] = plotBounds [2] = plotBounds[3] = 0.;
+            }
+
+            while (currentNd) {
+                if (currentNd->in_object.varRef>=0) {
+                    _String nodeName (*LocateVar (currentNd->in_object.varRef)->GetName());
+                    nodeName.Trim    (nodeName.FindBackwards ('.',0,-1)+1,-1);
+
+                    _AssociativeList * nodeOptions = nil;
+                    if (toptions) {
+                        nodeOptions = (_AssociativeList *) toptions->GetByKey (nodeName, ASSOCIATIVE_LIST);
+                    }
+
+
+                    _PMathObj nodeLabel     = nodeOptions?nodeOptions->GetByKey (treeOutputLabel,STRING):nil,
+                              nodeTLabel = nodeOptions?nodeOptions->GetByKey (treeOutputTLabel,STRING):nil;
+
+                    _Parameter      nnWidth = 0.0;
+
+                    if (nodeLabel) {
+                        nnWidth = 0.0;
+                    } else if (nodeTLabel) {
+                        nnWidth = 1.+PSStringWidth (*((_FString*)nodeTLabel->Compute())->theString);
+                        //printf ("%g\n", nnWidth);
+                    } else if (currentNd->get_num_nodes() == 0) {
+                        nnWidth = 1.+PSStringWidth (nodeName);
+                    }
+
+                    nnWidth += _maxTimesCharWidth * xtraChars;
+                    nnWidth *= fontSize;
+
+                    if (treeLayout == 1) {
+                        currentNd->in_object.label2 += treeRotation;
+                        _Parameter chordLength =  computeChordLength (treeRadius, currentNd->in_object.label2,plotBounds),
+                                   overflow    =  MAX(0., treeRadius +
+                                                      (nnWidth - chordLength) *
+                                                      hScale / MAX(BAD_BRANCH_LENGTH,currentNd->in_object.label1));
+
+                        //nnWidth + currentNd->in_object.label1 * vScale-chordLength);
+
+
+
+                        if (overflow > treeRadius*.5) { // shift too big
+                            chordLength -= currentNd->in_object.label1/(2.*hScale) * treeRadius;
+
+                            chordLength = chordLength / nnWidth;
+                            fontSize = fontSize * chordLength;
+
+                            if (fontSize<2) {
+                                fontSize = 2;
+                            }
+
+                            nnWidth  = treeRadius*.5;
+                        } else {
+                            nnWidth = overflow;
+                        }
+                    } else {
+                        if (nnWidth>treeWidth*.5) {
+                            fontSize = fontSize / (2.*nnWidth/treeWidth);
+                            if (fontSize<2) {
+                                fontSize = 2;
+                            }
+                            nnWidth  = treeWidth*.5;
+                        }
+                    }
+                    if (nnWidth > labelWidth) {
+                        labelWidth = nnWidth;
+                    }
+                }
+                currentNd = NodeTraverser ((node<nodeCoord>*)nil);
+            }
+
+            if (!doLabelWidth) {
+                labelWidth = 0;
+            }
+
+            if (scaling) {
+                treeHeight -= 3.0*fontSize;
+            }
+
+            if (treeLayout == 1) {
+                hScale      = (treeRadius-labelWidth)/hScale;
+                vScale      = 0.;
+            } else {
+                hScale      = -(treeWidth-labelWidth)/newRoot->in_object.h;
+                vScale      = (treeHeight-2*fontSize)/(mappedTreeHeight - mappedTreeHeight2);
+            }
+            t = _String ("/Times-Roman findfont\n") & fontSize & " scalefont\nsetfont\n";
+            (*res)<<&t;
+
+            nodeCoord dummy;
+
+            long   lw = fontSize/6+1;
+
+            (*res) << _String(lw);
+            (*res) << " setlinewidth\n1 setlinecap\n";
+
+             if (prefixPS) {
+                (*res) << prefixPS->theString->Replace (treeOutputFSPlaceH, _String(fontSize), true);
+            }
+
+            if (treeLayout == 1) {
+                //newRoot->in_object.h = -plotBounds[1];
+                //newRoot->in_object.v = -plotBounds[3];
+                //hScale                 *= 2.*treeRadius / MAX(plotBounds[0]-plotBounds[1],plotBounds[2]-plotBounds[3]);
+                newRoot->in_object.h = treeRadius;
+                newRoot->in_object.v = treeRadius;
+                vScale               = 0.;
+
+                TreePSRecurse (newRoot, (*res), hScale, vScale, ceil(treeWidth), ceil(treeHeight), fontSize/2, labelWidth-fontSize/2, toptions, 1, &treeRadius);
+            } else {
+                TreePSRecurse (newRoot, (*res), hScale, vScale, ceil(treeWidth), ceil(treeHeight), fontSize/2, labelWidth-fontSize/2, toptions);
+            }
+
+            if (scaling) { /* ruler */
+                if (fontSize < 8) {
+                    fontSize = 8;
+                    (*res) << (_String ("/Times-Roman findfont\n") & fontSize & " scalefont\nsetfont\n");
+                }
+
+                if (treeWidth < 4*fontSize) { // enforce minimal ruler width
+                    treeWidth = 4*fontSize;
+                }
+
+                vScale = exp (log(10.)*floor (log10(treeLayout==1?totalTreeL:treeWidth/hScale))); // compute the scaling factor
+                if (vScale*hScale < 10.0) {
+                    vScale *= 10.;
+                }
+
+                _String rulerLabel (vScale, "%5.2g");
+
+                while (vScale*hScale > (treeLayout==1?treeRadius/3:treeWidth-newRoot->in_object.h)) {
+                    vScale     *= 0.5;
+                    rulerLabel = vScale;
+                }
+
+                while (PSStringWidth(rulerLabel)*fontSize>vScale*hScale-3) {
+                    vScale      *= 2.0;
+                    rulerLabel = vScale;
+                }
+
+                long   lm = newRoot->in_object.h,
+                       rm = lw+vScale*hScale;
+
+                if (treeLayout == 1) {
+                    treeHeight = 2*treeRadius - 2*fontSize;
+                    lm = treeWidth - fontSize - rm;
+                    rm = treeWidth - fontSize - lw;
+                }
+
+                (*res) << "newpath\n";
+                t  = _String (lm) & ' ' & _String ((long)treeHeight+2*lw) & " moveto\n";
+                (*res)<<&t;
+                t =  _String (rm) & ' ' & (long)(treeHeight+2*lw) & " lineto\nstroke\nnewpath\n"; // main horizontal bar
+                (*res)<<&t;
+                t = _String (lm) & ' ' & _String ((long)treeHeight) & " moveto\n";
+                (*res)<<&t;
+                t =  _String (lm) & ' ' & (long)(treeHeight+4*lw) & " lineto\nstroke\nnewpath\n"; // left notch
+                (*res)<<&t;
+                t =  _String (rm) & ' ' & (long)(treeHeight) & " moveto\n";
+                (*res)<<&t;
+                t =  _String (rm) & ' ' & (long)(treeHeight+4*lw) & " lineto\nstroke\nnewpath\n"; // right notch
+                (*res)<<&t;
+                t =  _String (lm+lw) & ' ' & _String ((long)treeHeight+3*lw) & " moveto\n"; // main text
+                (*res)<<&t;
+                t =  _String ('(') & _String (rulerLabel) & ") show\n";
+                (*res)<<&t;
+            }
+
+            newRoot->delete_tree ();
+            delete  newRoot;
+
+            if (extraPS) {
+                (*res) << extraPS->theString->Replace (treeOutputFSPlaceH, _String(fontSize), true);
+            }
+
+            if (!doEmbed) {
+                t = "showpage";
+                (*res)<<&t;
+            }
+            DeleteObject (theParam);
+        } else {
+            _String errMsg ("An invalid 3rd parameter was passed to PSTreeString.");
+            ReportWarning (errMsg);
+        }
+    } else {
+        _String errMsg ("An invalid 2nd parameter was passed to PSTreeString.");
+        ReportWarning (errMsg);
+    }
+
+    res->Finalize();
+    return new _FString (res);
+}
+
+//_______________________________________________________________________________________________
+
+
+void    _TheTree::BuildINodeDependancies (void)
+{
+    _CalcNode * travNode = DepthWiseTraversal (true);
+    leftiNodes.Clear ();
+    long        iNodeCounter  = 0,
+                leafCounter = 0;
+
+    topLevelNodes.Clear();
+
+    while (travNode) {
+        if (IsCurrentNodeATip()) {
+            leftiNodes << iNodeCounter;
+            leafCounter ++;
+        } else {
+            iNodeCounter++;
+        }
+        travNode = DepthWiseTraversal ();
+    }
+}
+
+//_______________________________________________________________________________________________
+
+
+void    _TheTree::BuildTopLevelCache (void)
+{
+    _CalcNode * travNode         = DepthWiseTraversal (true);
+    long        iNodeCounter     = 0,
+                leafCounter     = 0;
+
+    node <long> *np,
+         *np2;
+
+    topLevelNodes.Clear();
+    topLevelLeftL.Clear();
+    topLevelRightL.Clear();
+
+    // use cBase to count the number of leaves at or below a given node
+    // use categoryIndexVars to store left and right leaves
+
+    while (travNode) {
+        if (IsCurrentNodeATip()) {
+            travNode->categoryIndexVars<<leafCounter;
+            travNode->categoryIndexVars<<leafCounter;
+            leafCounter ++;
+            travNode->cBase = 1;
+        } else {
+            travNode->cBase = 0;
+            for (long k = 0; k < currentNode->nodes.length; k++) {
+                _CalcNode *cNode = (_CalcNode*)LocateVar(currentNode->nodes.data[k]->in_object);
+                if (k==0) {
+                    travNode->categoryIndexVars << cNode->categoryIndexVars[cNode->categoryIndexVars.lLength-2];
+                }
+                if (k==currentNode->nodes.length-1) {
+                    travNode->categoryIndexVars << cNode->categoryIndexVars[cNode->categoryIndexVars.lLength-1];
+                }
+
+                travNode->cBase += cNode->cBase;
+            }
+            travNode->lastState = iNodeCounter;
+            iNodeCounter++;
+        }
+        travNode = DepthWiseTraversal ();
+    }
+
+    for (long level = 0; level < theRoot->nodes.length; level++) {
+        np = theRoot->nodes.data[level];
+        travNode =  (_CalcNode*)LocateVar(np->in_object);
+        if (travNode->cBase>1) {
+            topLevelNodes << travNode->lastState;
+            topLevelLeftL << travNode->categoryIndexVars[travNode->categoryIndexVars.lLength-2];
+            topLevelRightL<< travNode->categoryIndexVars[travNode->categoryIndexVars.lLength-1];
+            if (travNode->cBase>4*leafCounter/5) {
+                // one i-node hogging all the descendants
+                _SimpleList sndLevel;
+                for (long k = 0; k < np->nodes.length; k++) {
+                    np2 = np->nodes.data[k];
+                    if (np2->nodes.length) {
+                        sndLevel << (long)np2;
+                    }
+                }
+                if (sndLevel.lLength>1) {
+                    topLevelLeftL.Delete (topLevelNodes.lLength-1);
+                    topLevelRightL.Delete (topLevelNodes.lLength-1);
+                    topLevelNodes.Delete (topLevelNodes.lLength-1);
+                    for (long k=0; k<sndLevel.lLength; k++) {
+                        travNode =  (_CalcNode*)LocateVar(((node<long>*)sndLevel.lData[k])->in_object);
+                        topLevelNodes << travNode->lastState;
+                        topLevelLeftL << travNode->categoryIndexVars[travNode->categoryIndexVars.lLength-2];
+                        topLevelRightL<< travNode->categoryIndexVars[travNode->categoryIndexVars.lLength-1];
+                    }
+                    break;
+                }
+            }
+        }
+    }
+
+    // restore the settings of CalcNodes.
+    travNode = DepthWiseTraversal (true);
+    while (travNode) {
+        if (!IsCurrentNodeATip()) {
+            travNode->cBase = cBase;
+            travNode->lastState = -1;
+        }
+        long k=travNode->categoryIndexVars.lLength-2;
+        travNode->categoryIndexVars.Delete (k);
+        travNode->categoryIndexVars.Delete (k,true);
+        travNode = DepthWiseTraversal ();
+    }
+
+    if (topLevelNodes.lLength) {
+        topLevelNodes   << 0;
+        topLevelLeftL   << leafCounter;
+        topLevelRightL  << leafCounter-1;
+    }
+}
+
+//_______________________________________________________________________________________________
+
+
+void    _TheTree::KillTopLevelCache (void)
+{
+    topLevelNodes.Clear();
+    if (rootIChildrenCache) {
+        free (rootIChildrenCache);
+    }
+    rootIChildrenCache = nil;
+}
+//_______________________________________________________________________________________________
+
+long    _TheTree::CountTreeCategories (void)
+{
+    categoryVariables.Clear();
+    {
+        _AVLList           cVA (&categoryVariables);
+        ScanForCVariables (cVA);
+        cVA.ReorderList   ();
+    }
+    categoryCount = 1;
+    for (unsigned long k=0; k<categoryVariables.lLength; k++) {
+        categoryCount *= ((_CategoryVariable*)LocateVar(categoryVariables.lData[k]))->GetNumberOfIntervals();
+    }
+    return categoryCount;
+}
+
+//_______________________________________________________________________________________________
+
+void    _TheTree::AllocateResultsCache (long size)
+{
+    if (rootIChildrenCache) {
+        free (rootIChildrenCache);
+    }
+    rootIChildrenCache = nil;
+    //topLevelNodes.Clear();
+    size *= categoryCount;
+    if (topLevelNodes.lLength) {
+        rootIChildrenCache = (_Parameter*) MemAllocate (size*cBase*(topLevelNodes.lLength-1)*sizeof (_Parameter));
+    }
+}
+
+
+//__________________________________________________________________________________
+
+nodeCoord   _TheTree::TreeTEXRecurse (node<nodeCoord>* currNode, _String&res, _Parameter hScale, _Parameter vScale, long hSize, long vSize)
+{
+    long  descendants = currNode->get_num_nodes(), vc, hc, hc1, hc2;
+
+    _String t;
+
+    if (descendants==0) { // terminal node
+        vc = vSize-currNode->in_object.v*vScale;
+        hc = hSize + currNode->in_object.h*hScale;
+        t = _String ("\n\\put(")&hc&','&vc&"){\\circle*{2}}";
+        res<<&t;
+        t = _String ("\n\\put(")&hc+2&','&vc-1&"){\\makebox{\\tiny{";
+        res<<&t;
+        t = *(LocateVar(currNode->in_object.varRef)->GetName());
+        t = t.Cut (t.Find('.')+1,-1);
+        res<<&t;
+        res<<'}';
+        res<<'}';
+        res<<'}';
+    } else {
+        vc = vSize-currNode->in_object.v*vScale;
+        hc = hSize + currNode->in_object.h*hScale;
+        for (long k = 1; k<=descendants; k++) {
+            node<nodeCoord>* childNode = currNode->go_down(k);
+            TreeTEXRecurse (childNode, res, hScale, vScale, hSize, vSize);
+
+            long        vcc = vSize-childNode->in_object.v*vScale,
+                        hcc = hSize + childNode->in_object.h*hScale;
+
+            t = _String ("\n\\put(")&hc&','&vcc&"){\\line(1,0){"&(hcc-hc)&"}}";
+            res<<&t;
+            if (k==1) {
+                hc1 = vcc;
+            } else if (k==descendants) {
+                hc2 = vcc;
+            }
+        }
+        t = _String ("\n\\put(")&hc&','&hc2&"){\\line(0,1){"&(hc1-hc2)&"}}";
+        res<<&t;
+        t = _String ("\n\\put(")&hc&','&vc&"){\\circle{2}}";
+        res<<&t;
+        if (currNode->get_parent()) {
+            t = _String ("\n\\put(")&hc+2&','&vc-1&"){\\makebox{\\tiny{";
+            res<<&t;
+            t = *(LocateVar(currNode->in_object.varRef)->GetName());
+            t = t.Cut (t.Find('.')+1,-1);
+            if (t.beginswith ("Node")) {
+                t = t.Cut(4,-1);
+            }
+            res<<&t;
+            res<<'}';
+            res<<'}';
+            res<<'}';
+        }
+    }
+
+    nodeCoord resC;
+    resC.h = hc;
+    resC.v = vc;
+    return resC;
+}
+
+//__________________________________________________________________________________
+
+void    _TheTree::TreePSRecurse (node<nodeCoord>* currNode, _String&res, _Parameter hScale, _Parameter vScale,
+                                 long hSize, long vSize, long halfFontSize, long shift, _AssociativeList* outOptions,
+                                 char layout, _Parameter * xtra)
+{
+    long               descendants = currNode->get_num_nodes();
+    //lineW    = halfFontSize/3+1;
+
+    _Parameter         vc,
+                       hc,
+                       vcl,
+                       hcl,
+                       hc1,
+                       hc2;
+
+    _String            t,
+                       varName,
+                       colorString ("0 0 0 setrgbcolor\n");
+
+    if (currNode->parent) {
+        if (currNode->in_object.varRef >=0) {
+            varName = (*LocateVar(currNode->in_object.varRef)->GetName());
+        }
+    } else {
+        hc = GetRoot().in_object;
+        if (hc >=0) {
+            varName = (*LocateVar(hc)->GetName());
+        }
+        if (layout == 1) {
+            res <<  (_String (currNode->in_object.h) & ' ' & _String (currNode->in_object.v) & " translate\n");
+        }
+    }
+
+    varName.Trim(varName.Find('.')+1,-1);
+
+    _AssociativeList * nodeOptions = nil;
+    if (outOptions) {
+        nodeOptions = (_AssociativeList *) outOptions->GetByKey (varName, ASSOCIATIVE_LIST);
+    }
+
+
+    _PMathObj nodeLabel     = nodeOptions?nodeOptions->GetByKey (treeOutputLabel,STRING):nil,
+              nodeTLabel = nodeOptions?nodeOptions->GetByKey (treeOutputTLabel,STRING):nil;
+
+    if (layout == 1) {
+        hcl = currNode->in_object.h*hScale;
+        vcl = currNode->in_object.v*hScale;
+    } else {
+        vcl = vSize-currNode->in_object.v*vScale,
+        hcl = hSize+currNode->in_object.h*hScale-shift;
+    }
+
+    if (descendants==0 || nodeLabel)
+        // terminal node or default label
+    {
+        t = empty;
+        _Parameter myAngle = layout==1?currNode->in_object.label2*DEGREES_PER_RADIAN:0.0;
+        if (layout == 1) {
+            res << (_String(myAngle) & " rotate\n");
+            vc = 0;
+            hcl = (vScale + currNode->in_object.bL)*hScale;
+            hc  = hcl + halfFontSize;
+        } else {
+            vc = vcl-halfFontSize;
+            hc = hcl+halfFontSize;
+        }
+
+        if (!nodeTLabel) {
+            res<<"newpath\n";
+
+            if (nodeLabel) {
+                t = _String(hcl) & ' ' & _String (vc) & " moveto\n";
+
+                res << &t;
+                t = *((_FString*)nodeLabel->Compute())->theString;
+                t = t.Replace (treeOutputNNPlaceH, varName, true);
+                t = t.Replace (treeOutputFSPlaceH, _String(halfFontSize*2), true) & '\n';
+            }
+
+            if (descendants==0 && t.sLength == 0)
+                // generate the default label
+            {
+                if (layout == 1 && myAngle > 90. && myAngle < 270.) {
+                    _Parameter xt = hc-halfFontSize/2,
+                               yt = vc-2*halfFontSize/3;
+                    t = _String (xt) & _String (" 0 translate 180 rotate 0 ") & _String (yt) & _String ('(') & varName & ") righttext 180 rotate -" & xt & " 0 translate\n";
+                } else {
+                    t = _String(hc-halfFontSize/2) & ' ' & _String (vc-2*halfFontSize/3) & " moveto\n";
+                    res<<&t;
+                    t = _String ('(') & varName & ") show\n";
+                }
+            }
+
+            res<<&t;
+        }
+
+        if (descendants==0) {
+            currNode->in_object.h = hc-halfFontSize;
+        }
+
+        if (layout == 1) {
+            res << (_String(-currNode->in_object.label2*DEGREES_PER_RADIAN) & " rotate\n");
+        }
+    }
+
+    long  minChildHC = 0x0fffffff,
+          newV       = 0;
+
+    if (descendants) {
+        vc = vSize - currNode->in_object.v*vScale;
+        hc = hSize + currNode->in_object.h*hScale-shift;
+
+        nodeCoord childCoord;
+        for (long k = 1; k<=descendants; k++) {
+            node<nodeCoord>* child = currNode->go_down(k);
+            TreePSRecurse (child, res, hScale, (layout==1)?vScale+currNode->in_object.bL:vScale, hSize, vSize,halfFontSize,shift,outOptions,layout,xtra);
+            if (k==1) {
+                hc1 = layout==1?child->in_object.label2:child->in_object.v;
+            }
+            if (k==descendants) {
+                hc2 = layout==1?child->in_object.label2:child->in_object.v;
+            }
+        }
+
+        char doVLines = 3;
+
+        for (long k = 1; k<=descendants; k++) {
+            node<nodeCoord>* child = currNode->go_down(k);
+
+            if (child->in_object.varRef>=0) {
+                t = *LocateVar(child->in_object.varRef)->GetName();
+                t.Trim (t.Find('.')+1,-1);
+            } else {
+                t = empty;
+            }
+
+            newV += child->in_object.v;
+
+            _AssociativeList * childOptions = nil;
+
+            _Parameter         splitBranch = -1.,
+                               lineWP = 0.0;
+
+            _String            childColor,
+                               notchColor,
+                               *blabelString = nil,
+                                childDash,
+                                linewidth1,
+                                linewidth2,
+                                linecap1,
+                                linecap2;
+
+            _Matrix         *  notches    = nil,
+                               *  multiColor = nil;
+
+            if (layout == 1) {
+                res << (_String(child->in_object.label2*DEGREES_PER_RADIAN) & " rotate\n");
+            }
+
+            if (outOptions) {
+                childOptions = (_AssociativeList *) outOptions->GetByKey (t, ASSOCIATIVE_LIST);
+                if (childOptions) {
+                    _PMathObj keyVal = childOptions->GetByKey (treeOutputThickness,NUMBER);
+                    if (keyVal) {
+                        lineWP = keyVal->Compute()->Value();
+                        linewidth1 = _String("currentlinewidth ") & lineWP & " setlinewidth\n";
+                        linewidth2 = "setlinewidth\n";
+                    }
+                    keyVal = childOptions->GetByKey (treeOutputLinecap,NUMBER);
+                    if (keyVal) {
+                        linecap1 = _String("currentlinecap ") & (long)keyVal->Compute()->Value() & " setlinecap\n";
+                        linecap2 = "setlinecap\n";
+                    }
+                    keyVal = childOptions->GetByKey (treeOutputSplit,NUMBER);
+                    if (keyVal) {
+                        splitBranch = keyVal->Compute()->Value();
+                    }
+
+                    keyVal = childOptions->GetByKey (treeOutputNotches,MATRIX);
+                    if (keyVal) {
+                        notches = (_Matrix*)(((_Matrix*)keyVal->Compute())->ComputeNumeric())->makeDynamic();
+                    }
+
+                    keyVal = childOptions->GetByKey (treeOutputColor,MATRIX);
+                    if (keyVal) {
+                        _Matrix* rgbColor = (_Matrix*)keyVal->Compute();
+                        if (rgbColor->GetHDim() > 1 && rgbColor->GetVDim () == 4 && layout != 1) {
+                            multiColor = (_Matrix*)rgbColor->makeDynamic();
+                        } else {
+                            childColor = _String((*rgbColor)(0,0)) & " " & _String((*rgbColor)(0,1)) & " " & _String((*rgbColor)(0,2)) & " setrgbcolor\n";
+                        }
+                    }
+
+                    keyVal = childOptions->GetByKey (treeOutputNotchesColor,MATRIX);
+                    if (keyVal) {
+                        _Matrix* rgbColor = (_Matrix*)keyVal->Compute();
+                        notchColor = _String((*rgbColor)(0,0)) & " " & _String((*rgbColor)(0,1)) & " " & _String((*rgbColor)(0,2)) & " setrgbcolor\n";
+                    }
+
+                    keyVal = childOptions->GetByKey (treeOutputDash,MATRIX);
+                    if (keyVal) {
+                        _Matrix* dash = (_Matrix*)keyVal->Compute();
+                        childDash = _String('[') & _String((*dash)(0,0)) & " " & _String((*dash)(0,1)) & "] " & _String((*dash)(0,2)) & " setdash\n";
+                    }
+                    keyVal = childOptions->GetByKey (treeOutputOLabel,STRING);
+                    if (keyVal) {
+                        blabelString = ((_FString*)keyVal->Compute())->theString;
+                    }
+                }
+            }
+
+
+            if (blabelString) {
+                if (layout == 1) {
+                    t = _String(currNode->in_object.label1*hScale) & " 0 moveto\n";
+                } else {
+                    t = _String(hc) & ' ' & _String (child->in_object.v) & " moveto\n";
+                }
+                res<<&t;
+                *blabelString = blabelString->Replace (treeOutputNNPlaceH, varName, true).Replace (treeOutputFSPlaceH, _String(halfFontSize*2), true) & '\n';
+
+                res<<blabelString;
+                res<<'\n';
+            }
+
+            res << &childDash;
+            res << &childColor;
+            res << &linewidth1;
+            res << &linecap1;
+
+            if (layout == 1) {
+                if (child->get_num_nodes()) { // internal node
+                    res << "newpath\n";
+                    res << (_String("0 0 ") & child->in_object.label1*hScale & ' ' & child->in_object.v & ' ' & (child->in_object.auxD) & " arc \n");
+                    res << "stroke\n";
+                }
+            } else {
+                if (childOptions && descendants == 2) {
+                    res << "newpath\n";
+                    t = _String(hc) & ' ' & _String (0.5*(hc1+hc2)) & " moveto\n";
+                    res<<&t;
+                    t = _String(hc) & ' ' & _String (k==1?hc1:hc2) & " lineto\n";
+                    res<<&t;
+                    res << "stroke\n";
+                    doVLines -= k;
+                }
+
+            }
+
+            res << "newpath\n";
+            if (layout == 1) {
+                t = _String(child->in_object.label1*hScale) & " 0 moveto\n";
+                res << &t;
+                t = _String(-child->in_object.bL*hScale) & " 0 rlineto\n";
+            } else {
+
+                _Parameter lineWidthInset = 0.0;
+
+                //if (lineWP > 0.0)
+                //  lineWidthInset = (lineWP-lineW)*.5;
+
+                if (multiColor) {
+                    _Parameter span        = child->in_object.h - hc + 2*lineWidthInset,
+                               currentX    = hc - lineWidthInset;
+
+                    res <<  (_String(currentX) & ' ' & _String (child->in_object.v) & " moveto\n");
+                    for (long seg = 0; seg < multiColor->GetHDim(); seg++) {
+                        res << (_String((*multiColor)(seg,0)) & " " & _String((*multiColor)(seg,1)) & " " & _String((*multiColor)(seg,2)) & " setrgbcolor\n");
+                        _Parameter mySpan = span*(*multiColor)(seg,3);
+                        res << (_String(mySpan) & " 0 rlineto\n");
+                        if (seg < multiColor->GetHDim()-1) {
+                            currentX += mySpan;
+                            res << "stroke\nnewpath\n";
+                            res <<  (_String(currentX) & ' ' & _String (child->in_object.v) & " moveto\n");
+                        }
+                    }
+                    DeleteObject (multiColor);
+                    t = empty;
+                } else {
+                    t = _String(hc - lineWidthInset) & ' ' & _String (child->in_object.v) & " moveto\n";
+                    res<<&t;
+                    t = _String(child->in_object.h) & ' ' & _String (child->in_object.v + lineWidthInset) & " lineto\n";
+                }
+                if (layout == 1) {
+                    minChildHC = MIN(child->in_object.label1,minChildHC);
+                } else {
+                    minChildHC = MIN(child->in_object.h,minChildHC);
+                }
+            }
+            res<<&t;
+            res << "stroke\n";
+            res << &linecap2;
+            res << &linewidth2;
+
+            if (childDash.sLength) {
+                res << "[] 0 setdash\n";
+            }
+
+            if (splitBranch >= 0.0 && splitBranch <= 1.0) {
+                res << "newpath\n";
+                _Parameter x,
+                           y;
+
+                if (layout == 1) {
+                    x = (child->in_object.label1 - child->in_object.bL*splitBranch)*hScale;
+                    y = 0.;
+                } else {
+                    x = hc+(child->in_object.h-hc)*(1.-splitBranch);
+                    y = child->in_object.v;
+                }
+
+                t = _String(x) & ' ' & _String (y) & " " & halfFontSize  & " 0 360 arc\n";
+                res<<&t;
+                res << "fill\n";
+            }
+
+            if (notches) {
+                notches->CheckIfSparseEnough(true);
+                res << notchColor;
+                for (long l = 0; l < notches->GetSize(); l++) {
+                    _Parameter aNotch = (*notches)[l];
+                    if (aNotch >= 0. && aNotch <= 1.) {
+                        res << "newpath\n";
+                        _Parameter x,
+                                   y;
+
+                        if (layout == 1) {
+                            x = (child->in_object.label1 - child->in_object.bL*aNotch)*hScale;
+                            y = 0.;
+                        } else {
+                            x = hc+(child->in_object.h-hc)*(1.-aNotch);
+                            y = child->in_object.v;
+                        }
+
+                        t = _String(x-0.5*halfFontSize) & ' ' & _String (y-0.5*halfFontSize) & " moveto ";
+                        res << &t;
+                        t = _String(x+0.5*halfFontSize) & ' ' & _String (y+0.5*halfFontSize) & " lineto\n";
+                        res << &t;
+                        t = _String(x-0.5*halfFontSize) & ' ' & _String (y+0.5*halfFontSize) & " moveto ";
+                        res << &t;
+                        t = _String(x+0.5*halfFontSize) & ' ' & _String (y-0.5*halfFontSize) & " lineto\n";
+                        res << &t;
+                        res << "stroke\n";
+                    }
+                }
+                DeleteObject (notches);
+            }
+
+            res << &colorString;
+            if (layout == 1) {
+                res << (_String(-child->in_object.label2*DEGREES_PER_RADIAN) & " rotate\n");
+            }
+        }
+
+        if (layout == 0 && doVLines) {
+            _String linewidth1,
+                    linewidth2,
+                    linecap1,
+                    linecap2;
+
+            if (nodeOptions) {
+                _PMathObj keyVal = nodeOptions->GetByKey (treeOutputThickness,NUMBER);
+                if (keyVal) {
+                    _Parameter lineWP = keyVal->Compute()->Value();
+                    linewidth1 = _String("currentlinewidth ") & lineWP & " setlinewidth\n";
+                    linewidth2 = "setlinewidth\n";
+                }
+                keyVal = nodeOptions->GetByKey (treeOutputLinecap,NUMBER);
+                if (keyVal) {
+                    linecap1 = _String("currentlinecap ") & (long)keyVal->Compute()->Value() & " setlinecap\n";
+                    linecap2 = "setlinecap\n";
+                }
+            }
+
+            res << &linecap1;
+            res << &linewidth1;
+            res << "newpath\n";
+
+            if (doVLines == 3) {
+                t = _String(hc) & ' ' & _String (hc2) & " moveto\n";
+            } else {
+                t = _String(hc) & ' ' & _String (0.5*(hc1+hc2)) & " moveto\n";
+            }
+            res<<&t;
+            if (doVLines == 3) {
+                t = _String(hc) & ' ' & _String (hc1) & " lineto\n";
+            } else {
+                t = _String(hc) & ' ' & _String (doVLines==1?hc1:hc2) & " lineto\n";
+            }
+            res<<&t;
+            res << "stroke\n";
+            res << &linewidth2;
+            res << &linecap2;
+        }
+
+        if (layout == 0) {
+            currNode->in_object.h = hc;
+            currNode->in_object.v = newV/descendants;
+        } else {
+            currNode->in_object.auxD = (hc2-currNode->in_object.label2)*DEGREES_PER_RADIAN;
+            if (currNode->parent) {
+                currNode->in_object.v    = (hc1-currNode->in_object.label2)*DEGREES_PER_RADIAN;
+            }
+        }
+    } else {
+        currNode->in_object.v = vc;
+    }
+
+    if (nodeTLabel) {
+        t = *((_FString*)nodeTLabel->Compute())->theString;
+        if (t.sLength) {
+            _Parameter    nnWidth = 1.+PSStringWidth (t),
+                          scF     = 2.*halfFontSize;
+
+            if (layout == 1) {
+                res << (_String(currNode->in_object.label2*DEGREES_PER_RADIAN) & " rotate\n");
+            } else {
+                if (descendants) {
+                    nnWidth = (minChildHC - hc)/nnWidth;
+                    vcl     = currNode->in_object.v;
+                    //if (nnWidth < 2.*halfFontSize)
+                    //scF = nnWidth;
+                    //else
+                    //nnWidth = 1.;
+                }
+            }
+
+
+            if (scF != 2.*halfFontSize) {
+                res << (_String("/Times-Roman findfont\n")& scF & " scalefont\nsetfont\n");
+            }
+
+            res << "newpath\n";
+            if (layout == 1) {
+                res << (_String(currNode->in_object.label1 * hScale + halfFontSize) & ' ' & _String (-2*halfFontSize/3) & " moveto\n");
+            } else {
+                if (descendants) {
+                    hc = hcl + scF*0.5;
+                    vc = vcl - scF*0.33;
+
+                } else {
+                    hc -= scF*0.25;
+                    vc -= scF*0.33;
+                }
+                res << (_String(hc) & ' ' & _String (vc) & " moveto\n");
+            }
+
+            res << '(';
+            res << t;
+            res << ") show \n";
+
+            if (scF != 2.*halfFontSize) {
+                res << (_String("/Times-Roman findfont\n")& halfFontSize*2 & " scalefont\nsetfont\n");
+            }
+
+            if (layout == 1) {
+                res << (_String(-currNode->in_object.label2*DEGREES_PER_RADIAN) & " rotate\n");
+            }
+        }
+    }
+
+    if (colorString.sLength) {
+        res << "0 0 0 setrgbcolor\n";
+    }
+
+    if (currNode->parent == nil && layout == 1) {
+        res <<  (_String (-currNode->in_object.h) & ' ' & _String (-currNode->in_object.v) & " translate\n");
+    }
+}
+
+//__________________________________________________________________________________
+_PMathObj _TheTree::TEXTreeString (_PMathObj p)
+{
+    _String * res = new _String ((unsigned long)10, true);
+    if (p&&(p->ObjectClass()==STRING)) {
+        node<nodeCoord>*    newRoot;
+        _String             *theParam = (_String*) p->toStr(),
+                             t;
+
+        bool                scaling = theParam->sLength;
+
+        long                tipCount = 0;
+
+        node<nodeCoord>*    currentNd;
+
+        _Parameter          hScale = 1.0,
+                            vScale = 1.0,
+                            treeHeight = 0.0,
+                            treeWidth;
+        if (scaling) {
+            newRoot = ScaledBranchMapping (nil, theParam, 0, tipCount, 0);
+
+            treeWidth = tipCount*WIDTH_PER_BRANCH;
+
+            if (treeWidth<MIN_TEX_WIDTH) {
+                treeWidth = MIN_TEX_WIDTH;
+            } else if (treeWidth>MAX_TEX_WIDTH) {
+                treeWidth = MAX_TEX_WIDTH;
+            }
+
+            hScale = -treeWidth/newRoot->in_object.h;
+        } else {
+            newRoot = AlignedTipsMapping(true);
+            treeWidth = - newRoot->in_object.h;
+            if (treeWidth<MIN_TEX_WIDTH) {
+                hScale = MIN_TEX_WIDTH/treeWidth;
+                treeWidth = MIN_TEX_WIDTH;
+            } else if (treeWidth>MAX_TEX_WIDTH) {
+                hScale = treeWidth/MAX_TEX_WIDTH;
+                treeWidth = MAX_TEX_WIDTH;
+            }
+
+        }
+        currentNd = newRoot;
+
+        tipCount = newRoot->get_num_nodes();
+
+        while (tipCount) {
+            currentNd = currentNd->go_down(1);
+            tipCount = currentNd->get_num_nodes();
+        }
+
+        treeHeight = currentNd->in_object.v;
+        tipCount = newRoot->get_num_nodes();
+        currentNd = newRoot;
+
+        while (tipCount) {
+            currentNd = currentNd->go_down(tipCount);
+            tipCount = currentNd->get_num_nodes();
+        }
+
+        treeHeight = currentNd->in_object.v - treeHeight;
+
+        tipCount = 0;
+
+        if (treeHeight<MIN_TEX_HEIGHT) {
+            vScale = (MIN_TEX_HEIGHT)/treeHeight;
+            treeHeight = MIN_TEX_HEIGHT;
+        } else if (treeHeight>MAX_TEX_HEIGHT) {
+            vScale = treeHeight/(MAX_TEX_HEIGHT);
+            treeHeight = MAX_TEX_HEIGHT;
+        }
+
+        t = "\n\\setlength{\\unitlength}{1mm}\n\\begin{picture}(";
+        (*res)<<&t;
+        t = (long)(treeWidth+5);
+        (*res)<<&t;
+        (*res)<<',';
+        t = (long)(treeHeight+5);
+        (*res)<<&t;
+        (*res)<<')';
+
+        TreeTEXRecurse (newRoot, (*res), hScale, vScale, ceil(treeWidth), ceil(treeHeight));
+        newRoot->delete_tree ();
+        delete  newRoot;
+
+        t = "\n\\end{picture}";
+        (*res)<<&t;
+
+        DeleteObject (theParam);
+    } else {
+        _String errMsg ("An invalid 2nd parameter was passed to TEXTreeString");
+    }
+
+    res->Finalize();
+    return new _FString (res);
+}
+
+//__________________________________________________________________________________
+
+void _TheTree::SetUpMatrices (long categCount)
+{
+  //fprintf (stderr, "[_TheTree::SetUpMatrices] %ld\n", categCount);
+    _CalcNode* travNode;
+    categoryCount = categCount>=1?categCount:1;
+
+ 
+    travNode = DepthWiseTraversal (TRUE);
+    while   (travNode) {
+        if (travNode->IsConstant()) {
+            travNode->varFlags |= HY_VC_NO_CHECK;
+        }
+        travNode->ConvertToSimpleMatrix();
+      
+        if (categoryCount==1) {
+            travNode->matrixCache = nil;
+        } else {
+            travNode->matrixCache = (_Matrix**)MemAllocate (categoryCount*sizeof(_Matrix*));
+            for (unsigned long i=0; i<categoryCount; i++) {             
+                travNode->matrixCache[i] = nil;
+            }
+        }
+        travNode = DepthWiseTraversal ();
+    }
+}
+
+//__________________________________________________________________________________
+
+#if USE_SCALING_TO_FIX_UNDERFLOW
+void _TheTree::AllocateUnderflowScalers (long sites)
+{
+    DeleteObject (scalingForUnderflow);
+    scalingForUnderflow = new _Matrix (sites, 1, false, true);
+    for (long k=0; k<sites; k++) {
+        scalingForUnderflow->theData[k] = 1.0;    //genrand_real2()*2.0;
+    }
+}
+
+//__________________________________________________________________________________
+
+void _TheTree::DeallocateUnderflowScalers (void)
+{
+    DeleteObject (scalingForUnderflow);
+    scalingForUnderflow = nil;
+}
+#endif
+
+
+//__________________________________________________________________________________
+
+void _TheTree::CleanUpMatrices (void)
+{
+    _CalcNode* travNode;
+    travNode = DepthWiseTraversal (TRUE);
+    if (categoryCount == 1) {
+        while   (travNode) {
+
+            // mod 05/03/2003 - uncomment next 5 lines
+            // this breaks after ReplicateConstraint or MolecularClock is called
+            // WTF?
+
+            travNode->ConvertFromSimpleMatrix();
+
+            if (travNode->referenceNode>=0) {
+                travNode->SetRefNode (-1);
+                travNode->compExp = nil;
+            } else {
+                if (travNode->referenceNode < -1) {
+                    travNode->SetRefNode (-1);
+                }
+            }
+            if (travNode->compExp) {
+                DeleteObject (travNode->compExp);
+                travNode->compExp = nil;
+            }
+
+            travNode->varFlags &= HY_VC_CLR_NO_CHECK;
+            travNode = DepthWiseTraversal ();
+        }
+    } else {
+        while   (travNode) {
+            travNode->ConvertFromSimpleMatrix();
+            if (travNode->referenceNode>=0) {
+                travNode->SetRefNode (-1);
+            } else
+                for (long i=0; i<categoryCount; i++) {
+                    DeleteObject(travNode->matrixCache[i]);
+                }
+
+            free (travNode->matrixCache);
+            travNode->matrixCache = nil;
+            travNode->compExp = nil;
+            travNode->varFlags &= HY_VC_CLR_NO_CHECK;
+            travNode = DepthWiseTraversal ();
+        }
+        categoryCount = 1;
+    }
+
+}
+
+//__________________________________________________________________________________
+
+void _TheTree::RemoveModel (void)
+{
+    _CalcNode* travNode;
+    travNode = DepthWiseTraversal (TRUE);
+    while   (travNode) {
+        travNode->RemoveModel();
+        travNode = DepthWiseTraversal ();
+    }
+    categoryCount = 1;
+}
+
+//__________________________________________________________________________________
+
+bool _TheTree::FindScalingVariables (_SimpleList& rec)
+{
+    long i;
+    rec.Clear();
+    _CalcNode* travNode;
+    travNode = StepWiseTraversal (TRUE);
+    travNode = StepWiseTraversal ();
+    if (travNode) {
+        if (travNode->iVariables)
+            for (i=1; i<travNode->iVariables->lLength; i+=2)
+                if (travNode->iVariables->lData[i]>=0) {
+                    rec<<travNode->iVariables->lData[i];
+                }
+
+        if (travNode->dVariables)
+            for (i=1; i<travNode->dVariables->lLength; i+=2)
+                if (travNode->dVariables->lData[i]>=0) {
+                    rec<<travNode->dVariables->lData[i];
+                }
+
+    }
+    if (rec.lLength==0) {
+        return false;
+    }
+    while   (travNode) {
+        for (i=0; i<rec.countitems(); i++) {
+            if ( ((!travNode->iVariables) || travNode->iVariables->FindStepping(rec.lData[i],2,1)<0)  &&
+                    ((!travNode->dVariables) || travNode->dVariables->FindStepping(rec.lData[i],2,1)<0) ) {
+                rec.Delete(i);
+                if (rec.lLength==0) {
+                    break;
+                }
+                i--;
+            }
+        }
+
+        if (!( (travNode->iVariables && travNode->iVariables->lLength) || (travNode->dVariables && travNode->dVariables->lLength)
+                || (travNode->gVariables && travNode->gVariables->lLength))) {
+            rec.Clear();
+            return false;
+        }
+
+        travNode = StepWiseTraversal ();
+    }
+    return true;
+}
+
+//__________________________________________________________________________________
+
+bool _TheTree::HaveStringBranchLengths (void)
+{
+    _CalcNode* travNode = DepthWiseTraversal (TRUE);
+    while   (travNode && !IsCurrentNodeTheRoot()) {
+        if (travNode->Value()<-0.9) {
+            return false;
+        }
+        travNode = DepthWiseTraversal ();
+    }
+    return true;
+}
+
+//__________________________________________________________________________________
+
+void _TheTree::ScanForVariables (_AVLList& l,_AVLList& l2, _AVLListX * tagger, long weight)
+{
+    unsigned long traversal_order = 0;
+    _CalcNode* curNode = DepthWiseTraversal (true);
+    while (curNode) {
+        curNode->ScanForVariables(l,l2, tagger, weight +  flatNodes.lLength + flatLeaves.lLength - traversal_order);
+        curNode = DepthWiseTraversal();
+        traversal_order += 1;
+    }
+}
+
+//__________________________________________________________________________________
+
+void _TheTree::ScanAndAttachVariables (void)
+{
+    _CalcNode* curNode = DepthWiseTraversal (true);
+    while (curNode) {
+        curNode->ScanAndAttachVariables();
+        curNode = DepthWiseTraversal();
+    }
+}
+
+//__________________________________________________________________________________
+
+void _TheTree::ScanForDVariables (_AVLList& l,_AVLList& l2)
+{
+    _CalcNode* curNode = DepthWiseTraversal (true);
+    while (curNode) {
+        curNode->ScanForDVariables(l,l2);
+        curNode = DepthWiseTraversal();
+    }
+}
+
+
+
+//__________________________________________________________________________________
+
+void _TheTree::ScanForGVariables (_AVLList& li, _AVLList& ld, _AVLListX * tagger, long weight)
+{
+    _CalcNode*  curNode = DepthWiseTraversal (true);
+    _SimpleList cL;
+    _AVLList    cLL (&cL);
+
+    while (curNode) {
+    
+        _Formula *explicitFormMExp = curNode->GetExplicitFormModel ();
+        _Matrix  *modelM = explicitFormMExp?nil:curNode->GetModelMatrix();
+        
+        if (explicitFormMExp && cLL.Find ((BaseRef)explicitFormMExp) < 0 || modelM && cLL.Find(modelM) < 0) {
+            _SimpleList temp;
+            {
+                _AVLList tempA (&temp);
+                if (modelM) {
+                    modelM->ScanForVariables(tempA, true);
+                } else {
+                    explicitFormMExp->ScanFForVariables(tempA, true, false, true, true);
+                }
+                tempA.ReorderList();
+            }
+            for (unsigned long i=0; i<temp.lLength; i++) {
+                long p = temp.lData[i];
+                _Variable* v = LocateVar (p);
+                if (v&&v->IsGlobal()) {
+                    if(v->IsIndependent()) {
+                        li.Insert ((BaseRef)p);
+                        if (tagger) {
+                            tagger->UpdateValue((BaseRef)p, weight, 0);
+                        }
+                    } else {
+                        ld.Insert ((BaseRef)p);
+                    }
+                }
+            }
+            cLL.Insert (modelM?(BaseRef)modelM:(BaseRef)explicitFormMExp);
+        }
+        curNode -> ScanForGVariables(li,ld);
+        curNode = DepthWiseTraversal();
+    }
+}
+
+//__________________________________________________________________________________
+
+void _TheTree::ScanForCVariables (_AVLList& lcat)
+{
+    _CalcNode* curNode = DepthWiseTraversal (true);
+    while (curNode) {
+        for (long i = curNode->categoryVariables.lLength-1; i>=0; i--) {
+            lcat.Insert ((BaseRef)curNode->categoryVariables(i));
+        }
+
+        curNode = DepthWiseTraversal();
+
+    }
+}
+
+//__________________________________________________________________________________
+
+bool _TheTree::HasChanged (void)
+{
+    _CalcNode* curNode = StepWiseTraversal (true);
+    while (curNode) {
+        if (curNode->HasChanged()) {
+            return true;
+        }
+        curNode = StepWiseTraversal();
+    }
+    return false;
+}
+
+//__________________________________________________________________________________
+
+bool _TheTree::HasChanged2 (void)
+{
+    for (long k = 0; k < categoryVariables.lLength;  k++)
+        if (((_CategoryVariable*)LocateVar(categoryVariables.lData[k]))->HaveParametersChanged()) {
+            return true;
+        }
+    _CalcNode* curNode = StepWiseTraversal (true);
+    while (curNode) {
+        if (curNode->_VariableContainer::HasChanged()) {
+            return true;
+        }
+        curNode = StepWiseTraversal();
+    }
+    return false;
+}
+
+//_______________________________________________________________________________________________
+
+_Parameter  _TheTree::Probij  (long i, long j, _CalcNode * childNode)
+{
+    // assumed that ExpMatrix has already been called for that node
+    // range checking is implicit in the call of matrix (.,.) function
+    if (childNode) {
+        if(!childNode->GetCompExp()) {
+            childNode->RecomputeMatrix();
+        }
+//      if(childNode->GetCompExp())
+        return  (*childNode->GetCompExp())(i,j);
+    }
+    return 0;
+}
+
+//_______________________________________________________________________________________________
+void     _TheTree::InitializeTreeFrequencies (_Matrix *mx, bool setDim)
+// this will take the  matrix of frequencies and
+// 1) use its dimensions to initialize tree freq holders
+// 2) place global frequencies into the tree holder for later use by the pruning algo
+// must be called before any tree pruning computations are started
+{
+    long vecDim = mx->GetHDim()*mx->GetVDim();
+    // theModel = mx;
+
+    if  (setDim) {
+        SetTreeCodeBase (vecDim);
+    } else
+        for (long i=0; i<vecDim; i++) {
+            theProbs[i] = mx->theData[i];
+        }
+}
+//_______________________________________________________________________________________________
+void     _TheTree::SetTreeCodeBase (long b)
+// this will take the  matrix of frequencies and
+// 1) use its dimensions to initialize tree freq holders
+// 2) place global frequencies into the tree holder for later use by the pruning algo
+// must be called before any tree pruning computations are started
+{
+    SetCodeBase (b);
+    if (marginalLikelihoodCache) {
+        free (marginalLikelihoodCache);
+        marginalLikelihoodCache = nil;
+    }
+    if (cBase>0)
+        marginalLikelihoodCache =
+            (_Parameter*)MemAllocate ((flatNodes.lLength+flatLeaves.lLength)*sizeof (_Parameter)*cBase*systemCPUCount);
+
+    _CalcNode*  travNode = StepWiseTraversal (TRUE);
+    while (travNode) {
+        travNode -> SetCodeBase (b);
+        travNode = StepWiseTraversal();
+    }
+
+}
+
+//_______________________________________________________________________________________________
+long     _TheTree::IsLinkedToALF (long& pid)
+{
+    for (long lfID = 0; lfID < likeFuncList.lLength; lfID ++)
+        if (likeFuncList.lData[lfID] && (pid = ((_LikelihoodFunction*)likeFuncList(lfID))->DependOnTree (*GetName())) >= 0) {
+            return lfID;
+        }
+    return -1;
+}
+
+#ifdef __MP__
+//_______________________________________________________________________________________________
+
+void*   MatrixUpdateFunction (void* arg)
+{
+    ThreadMatrixTask* theTask = (ThreadMatrixTask*)arg;
+    for (long k=theTask->startAt; k<theTask->endAt; k++) {
+        ((_CalcNode*)(theTask->updateCN->lData[k]))->RecomputeMatrix(theTask->cID, theTask->tcat);
+    }
+    return nil;
+}
+#endif
+
+//_______________________________________________________________________________________________
+
+_Parameter   _TheTree::ReleafTreeAndCheck (_DataSetFilter* dsf, long index, bool cache, long categID)
+// set leaf value and reexp if needed
+// for first entry into a datafilter
+{
+
+#if defined     __MP__
+    if (systemCPUCount>1) {
+        ThreadMatrixUpdate (categID, cache);
+    } else
+#endif
+        SerialMatrixUpdate (categID, cache);
+
+    if (cache) {
+        MatrixCacheUpdate ();
+    }
+
+    if (flatLeaves.lLength == 1) {
+        return ReleafTreeDegenerate (dsf,index);
+    }
+
+    if (cache) {
+        return ThreadReleafTreeCache (dsf,index,-1,0,flatLeaves.lLength-1,categID>=0?categID:0);
+    } else {
+        return ReleafTree (dsf,index,-1,0,flatLeaves.lLength-1);
+    }
+}
+
+//_______________________________________________________________________________________________
+
+void        _TheTree::ThreadMatrixUpdate (long categID, bool cache)
+{
+#ifdef __MP__
+    _CalcNode       *travNode;
+    node <long>     *nodeChild;
+    _SimpleList     *taintedNodes = new _SimpleList;
+
+    for (long nodeCount = 0; nodeCount<flatLeaves.lLength; nodeCount++) {
+        travNode = (_CalcNode*)(((BaseRef*)flatCLeaves.lData)[nodeCount]);
+        bool reexpnt = travNode->NeedToExponentiate(categID);
+        if (reexpnt&&travNode->GetModelMatrix()) {
+            (*taintedNodes) << (long)travNode;
+            if (cache) {
+                travNode = ((_CalcNode*)((BaseRef*)variablePtrs.lData)
+                            [((node <long>*)(flatLeaves.lData[nodeCount]))->parent->in_object]);
+                travNode->cBase = -1;
+            }
+        } else if (categID>=0) {
+            travNode->SetCompMatrix (categID);
+        }
+
+    }
+
+    for (long nodeCount=0; nodeCount<flatTree.lLength; nodeCount++) {
+        travNode = (_CalcNode*)(((BaseRef*)flatTree.lData)[nodeCount]);
+        bool reexpnt = travNode->NeedToExponentiate(categID);
+        if (reexpnt&&travNode->GetModelMatrix()) {
+            (*taintedNodes) << (long)travNode;
+            if (cache) {
+                travNode->cBase = -1;
+            }
+        } else if (categID>=0) {
+            travNode->SetCompMatrix (categID);
+        }
+
+        if (cache&(travNode->cBase==-1)) {
+            nodeChild = ((node <long>*)(flatNodes.lData[nodeCount]))->parent;
+            if (nodeChild) {
+                travNode = ((_CalcNode*)((BaseRef*)variablePtrs.lData)[nodeChild->in_object]);
+                travNode->cBase = -1;
+            }
+        }
+    }
+
+    if ((*taintedNodes).lLength>1) {
+        long tStep = (*taintedNodes).lLength/systemCPUCount,
+             threadCount = 0,
+             k,
+             errCode;
+        if (tStep>0) {
+            threadCount = systemCPUCount-1;
+        } else {
+            tStep = 1;
+            threadCount = (*taintedNodes).lLength-1;
+        }
+        matrixTasks   = new ThreadMatrixTask[threadCount];
+        matrixThreads = new pthread_t [threadCount];
+
+        for (k=0; k<threadCount; k++) {
+            matrixTasks[k].cID = categID;
+            matrixTasks[k].tcat = categoryCount;
+            matrixTasks[k].startAt = tStep*(k+1);
+            matrixTasks[k].endAt = tStep*(k+2);
+            if (k==threadCount-1) {
+                matrixTasks[k].endAt = (*taintedNodes).lLength;
+            }
+            matrixTasks[k].updateCN = taintedNodes;
+
+            if ( pthread_create( matrixThreads+k, NULL, MatrixUpdateFunction ,(void*)(matrixTasks+k)))
+            {
+                FlagError("Failed to initialize a POSIX thread in ReleafTreeAndCheck()");
+                exit(1);
+            }
+        }
+
+        for (k=0; k<tStep; k++) {
+            ((_CalcNode*)((*taintedNodes).lData[k]))->RecomputeMatrix(categID, categoryCount);
+        }
+
+        for (k=0; k<threadCount; k++)
+            if ( (errCode = pthread_join ( matrixThreads[k], NULL )) ) {
+                FlagError(_String("Failed to join POSIX threads in ReleafTreeAndCheck(). Error Code=")&errCode);
+                exit(1);
+            }
+
+        delete matrixTasks;
+        delete matrixThreads;
+        matrixTasks = nil;
+    } else if ((*taintedNodes).lLength==1) {
+        ((_CalcNode*)((*taintedNodes).lData[0]))->RecomputeMatrix(categID, categoryCount);
+    }
+
+    delete taintedNodes;
+#endif
+}
+//_______________________________________________________________________________________________
+
+void        _TheTree::SerialMatrixUpdate (long categID, bool cache)
+{
+    _CalcNode  *travNode;
+    node <long>*nodeChild;
+
+    for (long nodeCount = 0; nodeCount<flatLeaves.lLength; nodeCount++) {
+        travNode = (_CalcNode*)(((BaseRef*)flatCLeaves.lData)[nodeCount]);
+        bool reexpnt = travNode->NeedToExponentiate(categID);
+        // flag all the nodes up the chain - to the root
+
+        if (reexpnt&&travNode->GetModelMatrix()) {
+            travNode->RecomputeMatrix(categID, categoryCount);
+            if (cache) {
+                travNode = ((_CalcNode*)((BaseRef*)variablePtrs.lData)
+                            [((node <long>*)(flatLeaves.lData[nodeCount]))->parent->in_object]);
+                travNode->cBase = -1;
+            }
+        } else if (categID>=0) {
+            travNode->SetCompMatrix (categID);
+        }
+
+    }
+
+    {
+        //for BCC
+        for (long nodeCount=0; nodeCount<flatTree.lLength; nodeCount++) {
+            travNode = (_CalcNode*)(((BaseRef*)flatTree.lData)[nodeCount]);
+            bool reexpnt = travNode->NeedToExponentiate(categID);
+            // flag all the nodes up the chain - to the root
+
+            if (reexpnt&&travNode->GetModelMatrix()) {
+                travNode->RecomputeMatrix(categID, categoryCount);
+                if (cache) {
+                    travNode->cBase = -1;
+                }
+            } else if (categID>=0) {
+                travNode->SetCompMatrix (categID);
+            }
+
+            if (cache&(travNode->cBase==-1)) {
+                nodeChild = ((node <long>*)(flatNodes.lData[nodeCount]))->parent;
+                if (nodeChild) {
+                    travNode = ((_CalcNode*)((BaseRef*)variablePtrs.lData)[nodeChild->in_object]);
+                    travNode->cBase = -1;
+                }
+            }
+        }
+    }
+}
+
+//_______________________________________________________________________________________________
+
+void        _TheTree::MatrixCacheUpdate (void)
+{
+    long c = 0, off = 1;
+    _CalcNode * travNode;
+    for (long nodeCount=0; nodeCount<topLevelNodes.lLength-1; nodeCount++, off<<=1) {
+        travNode = (_CalcNode*)(((BaseRef*)flatTree.lData)[topLevelNodes.lData[nodeCount]]);
+        if (travNode->cBase<=-1) {
+            c |= off;
+        }
+    }
+    topLevelNodes.lData[topLevelNodes.lLength-1] = c;
+    for (long nodeCount2=0; nodeCount2<flatTree.lLength; nodeCount2++) {
+        travNode = (_CalcNode*)(((BaseRef*)flatTree.lData)[nodeCount2]);
+        travNode->cBase = cBase;
+    }
+}
+
+
+//_______________________________________________________________________________________________
+
+_Parameter   _TheTree::ReleafTreeAndCheckChar4 (_DataSetFilter* dsf, long index, bool cache, long categID)
+{
+
+    long    nodeCount  = 0,
+            f;
+
+    _Parameter *mCache = marginalLikelihoodCache;
+
+    if (dsf->IsNormalFilter()) {
+        char       *thisState = dsf->GetColumn(index);
+
+        for (; nodeCount<flatLeaves.lLength; nodeCount++,mCache+=4) {
+            _CalcNode * travNode = (_CalcNode*)(((BaseRef*)flatCLeaves.lData)[nodeCount]);
+            f                    = dsf->theNodeMap.lData[nodeCount];
+            long* cCache         = dsf->conversionCache.lData+(thisState[f]-40)*5;
+#if USE_SCALING_TO_FIX_UNDERFLOW
+            _Parameter scalingFactor = scalingForUnderflow->theData[index];
+            mCache[0] = travNode->theProbs[0] = *(cCache++)*scalingFactor;
+            mCache[1] = travNode->theProbs[1] = *(cCache++)*scalingFactor;
+            mCache[2] = travNode->theProbs[2] = *(cCache++)*scalingFactor;
+            mCache[3] = travNode->theProbs[3] = *(cCache++)*scalingFactor;
+#else
+            mCache[0] = travNode->theProbs[0] = *(cCache++);
+            mCache[1] = travNode->theProbs[1] = *(cCache++);
+            mCache[2] = travNode->theProbs[2] = *(cCache++);
+            mCache[3] = travNode->theProbs[3] = *(cCache++);
+#endif
+            nodeStates[nodeCount] = travNode->lastState = *cCache;
+        }
+    } else {
+        _DataSetFilterNumeric * dsfN = (_DataSetFilterNumeric*)dsf;
+        for (; nodeCount<flatLeaves.lLength; nodeCount++,mCache+=4) {
+            _CalcNode * travNode = (_CalcNode*)(((BaseRef*)flatCLeaves.lData)[nodeCount]);
+            //_Parameter*        pv = dsfN->getProbabilityVector (dsf->theNodeMap.lData[nodeCount],index);
+            _Parameter*          pv = (categID<0)
+                                      ?(dsfN->probabilityVectors.theData + dsf->theNodeMap.lData[nodeCount]*dsfN->shifter + index*4)
+                                      :(dsfN->categoryShifter*categID + dsfN->probabilityVectors.theData + dsf->theNodeMap.lData[nodeCount]*dsfN->shifter + index*4)
+                                      ;
+            mCache[0] = travNode->theProbs[0] = pv[0];
+            mCache[1] = travNode->theProbs[1] = pv[1];
+            mCache[2] = travNode->theProbs[2] = pv[2];
+            mCache[3] = travNode->theProbs[3] = pv[3];
+            nodeStates[nodeCount] = travNode->lastState = -1;
+        }
+    }
+
+    if (flatLeaves.lLength==1) {
+        _CalcNode* travNode = ((_CalcNode*)((BaseRef*)variablePtrs.lData)[theRoot->nodes.data[0]->in_object]);
+        bool        reexpnt = travNode->NeedToExponentiate(categID);
+
+        if (reexpnt&&travNode->GetModelMatrix()) {
+            travNode->RecomputeMatrix(categID, categoryCount);
+        } else if (categID>=0) {
+            travNode->SetCompMatrix (categID);
+        }
+        return ReleafTreeChar4Degenerate (dsf,index);
+    }
+    if (cache) {
+        PruneTreeChar4Cache(categID);
+        return ThreadReleafTreeChar4 (dsf,index,-1,0,flatLeaves.lLength-1,categID<0?0:categID);
+        //return res;
+    }
+
+    return PruneTreeChar4(categID);
+}
+//_______________________________________________________________________________________________
+
+_Parameter   _TheTree::ReleafTreeDegenerate (_DataSetFilter* dsf, long index)
+// set leaf value and re-prune w/o reexping
+// for subsequent entries into a datafilter
+{
+    _CalcNode* rt  = ((_CalcNode*)((BaseRef*)variablePtrs.lData)[theRoot->in_object]),
+               * tip = ((_CalcNode*)((BaseRef*)variablePtrs.lData)[theRoot->nodes.data[0]->in_object]);
+
+    _Parameter reslt = 0.;
+    // sum over one branch in the direction from the root to the single leaf
+
+    long    state1 = dsf->Translate2Frequencies ((*dsf)(index,0), rt->theProbs, true),
+            state2 = dsf->Translate2Frequencies ((*dsf)(index,1), tip->theProbs, true);
+
+    // now perform one loop
+    _Parameter* fastIdx =  tip->GetCompExp()->theData;
+    //*nodeProbs;
+    // 4 cases are possible:
+    // 1-1
+    // 1-many
+    // many-1
+    // many-many
+    if (state1>=0 && state2 >= 0) { // 1-1
+        reslt = theProbs[state1]*fastIdx[state1*cBase+state2];
+    } else if (state1 >= 0) { // 1-many
+        _Parameter tmp = 0.;
+
+        fastIdx += state1*cBase;
+
+        for (long i=0; i<cBase; i++) {
+            tmp += fastIdx[i] * tip->theProbs[i];
+        }
+
+        reslt = theProbs[state1] * tmp;
+    } else if (state2 >= 0) { // many to 1
+        fastIdx  += state2;
+
+        for (long i=0; i<cBase; i++, fastIdx+=cBase) {
+            reslt += rt->theProbs[i] * *fastIdx * theProbs[i];
+        }
+
+    } else // many to many
+        for (long i=0; i<cBase; i++) {
+            _Parameter tmp = 0.0;
+            for (long j=0; j<cBase; j++,fastIdx++) {
+                tmp += *fastIdx * tip->theProbs[j];
+            }
+
+            reslt += tmp*rt->theProbs[i] * theProbs[i];
+        }
+
+    return reslt <= 0.0 ? ALMOST_ZERO : reslt;
+
+    /*_CalcNode* rt  = ((_CalcNode*)((BaseRef*)variablePtrs.lData)[theRoot->in_object]),
+             * tip = ((_CalcNode*)((BaseRef*)variablePtrs.lData)[theRoot->nodes.data[0]->in_object]);
+
+    _Parameter reslt, tmp;
+    // sum over one branch in the direction from the root to the single leaf
+    reslt = dsf->Translate2Frequencies ((*dsf)(index,0), rt->theProbs, true);
+    tmp   = dsf->Translate2Frequencies ((*dsf)(index,1), tip->theProbs, true);
+    // now perform one loop
+    _Matrix* theTP = tip->GetCompExp();
+    _Parameter* fastIdx = theTP->theData, *nodeProbs;
+    // 4 cases are possible:
+    // 1-1
+    // 1-many
+    // many-1
+    // many-many
+    if ((reslt>=0.0)&&(tmp>=0.0)) // 1-1
+    {
+        tmp = fastIdx[(long)reslt*cBase+(long)tmp];
+        reslt = theProbs[(long)reslt]*tmp;
+    }
+    else
+        if ((reslt>=0.0)&&(tmp<0.0)) // 1-many
+        {
+            tmp = 0;
+            fastIdx += (long)reslt*cBase;
+            nodeProbs = tip->GetProbs();
+            for (long i=0; i<cBase; i++, fastIdx++,nodeProbs++)
+            {
+                tmp+=*fastIdx* *nodeProbs;
+            }
+            reslt = theProbs[(long)reslt]*tmp;
+        }
+        else
+            if ((reslt<0.0)&&(tmp>=0.0)) // many to 1
+            {
+                fastIdx += (long)tmp;
+                tmp = 0;
+                nodeProbs  = rt->GetProbs();
+                long i;
+                for (i=0; i<cBase; i++, fastIdx+=cBase,nodeProbs++)
+                {
+                    *nodeProbs *=*fastIdx;
+                }
+
+                nodeProbs-=cBase;
+                reslt = 0;
+                fastIdx = GetProbs();
+                for (i=0; i<cBase; i++, nodeProbs++, fastIdx++)
+                {
+                    reslt+=*fastIdx * *nodeProbs;
+                }
+            }
+            else // many to many
+            {
+                nodeProbs  = rt->GetProbs();
+                long i,j;
+                for (i=0; i<cBase; i++, nodeProbs++)
+                {
+                    tmp = 0;
+                    for (j=0; j<cBase; j++,fastIdx++)
+                        tmp += *fastIdx* tip->GetProbs(j);
+                    *nodeProbs*=tmp;
+                }
+
+                reslt = 0;
+                fastIdx = GetProbs();
+                nodeProbs-=cBase;
+                for (i=0; i<cBase; i++, nodeProbs++, fastIdx++)
+                {
+                    reslt+=*fastIdx * *nodeProbs;
+                }
+            }
+    if ((reslt<0.0)||(reslt==.0)) reslt = ALMOST_ZERO;
+    return reslt;*/
+}
+
+//_______________________________________________________________________________________________
+
+_Parameter   _TheTree::ReleafTreeCharDegenerate (_DataSetFilter* dsf, long index)
+// set leaf value and re-prune w/o reexping
+// for subsequent entries into a datafilter
+{
+
+    _CalcNode* rt  = ((_CalcNode*)((BaseRef*)variablePtrs.lData)[theRoot->in_object]),
+               * tip = ((_CalcNode*)((BaseRef*)variablePtrs.lData)[theRoot->nodes.data[0]->in_object]);
+
+    _Parameter reslt = 0.;
+    // sum over one branch in the direction from the root to the single leaf
+
+    char       *thisState = dsf->GetColumn(index);
+
+    long       state1 = dsf->LookupConversion (thisState[dsf->theNodeMap.lData[0]], rt->theProbs),
+               state2 = dsf->LookupConversion (thisState[dsf->theNodeMap.lData[1]], tip->theProbs);
+
+    // now perform one loop
+    _Parameter* fastIdx =  tip->GetCompExp()->theData;
+    //*nodeProbs;
+    // 4 cases are possible:
+    // 1-1
+    // 1-many
+    // many-1
+    // many-many
+    if (state1>=0 && state2 >= 0) { // 1-1
+        reslt = theProbs[state1]*fastIdx[state1*cBase+state2];
+    } else if (state1 >= 0) { // 1-many
+        _Parameter tmp = 0.;
+
+        fastIdx += state1*cBase;
+
+        for (long i=0; i<cBase; i++) {
+            tmp += fastIdx[i] * tip->theProbs[i];
+        }
+
+        reslt = theProbs[state1] * tmp;
+    } else if (state2 >= 0) { // many to 1
+        fastIdx  += state2;
+
+        for (long i=0; i<cBase; i++, fastIdx+=cBase) {
+            reslt += rt->theProbs[i] * *fastIdx * theProbs[i];
+        }
+
+    } else // many to many
+        for (long i=0; i<cBase; i++) {
+            _Parameter tmp = 0.0;
+            for (long j=0; j<cBase; j++,fastIdx++) {
+                tmp += *fastIdx * tip->theProbs[j];
+            }
+
+            reslt += tmp*rt->theProbs[i] * theProbs[i];
+        }
+
+    return reslt <= 0.0 ? ALMOST_ZERO : reslt;
+
+    /*_CalcNode* rt  = ((_CalcNode*)((BaseRef*)variablePtrs.lData)[theRoot->in_object]),
+             * tip = ((_CalcNode*)((BaseRef*)variablePtrs.lData)[theRoot->nodes.data[0]->in_object]);
+
+    _Parameter reslt, tmp;
+    // sum over one branch in the direction from the root to the single leaf
+
+    char  *thisState = dsf->GetColumn(index);
+
+    reslt = dsf->LookupConversion (thisState[dsf->theNodeMap.lData[0]], rt->theProbs);
+    tmp   = dsf->LookupConversion (thisState[dsf->theNodeMap.lData[1]], tip->theProbs);
+    //reslt = dsf->Translate2Frequencies ((*dsf)(index,0), rt->theProbs, true);
+    //tmp   = dsf->Translate2Frequencies ((*dsf)(index,1), tip->theProbs, true);
+
+    // now perform one loop
+    _Matrix   * theTP = tip->compExp;
+    _Parameter* fastIdx = theTP->theData,
+              * nodeProbs;
+    // 4 cases are possible:
+    // 1-1
+    // 1-many
+    // many-1
+    // many-many
+    if ((reslt>=0.0)&&(tmp>=0.0)) // 1-1
+    {
+        tmp = fastIdx[(long)reslt*cBase+(long)tmp];
+        reslt = theProbs[(long)reslt]*tmp;
+    }
+    else
+        if ((reslt>=0.0)&&(tmp<0.0)) // 1-many
+        {
+            tmp = 0;
+            fastIdx += (long)reslt*cBase;
+            nodeProbs = tip->theProbs;
+            for (long i=0; i<cBase; i++, fastIdx++,nodeProbs++)
+            {
+                tmp+=*fastIdx* *nodeProbs;
+            }
+            reslt = theProbs[(long)reslt]*tmp;
+        }
+        else
+            if ((reslt<0.0)&&(tmp>=0.0)) // many to 1
+            {
+                fastIdx += (long)tmp;
+                tmp = 0;
+                nodeProbs  = rt->theProbs;
+                long i;
+                for (i=0; i<cBase; i++, fastIdx+=cBase,nodeProbs++)
+                {
+                    *nodeProbs *=*fastIdx;
+                }
+
+                nodeProbs-=cBase;
+                reslt = 0;
+                fastIdx = theProbs;
+                for (i=0; i<cBase; i++, nodeProbs++, fastIdx++)
+                {
+                    reslt+=*fastIdx * *nodeProbs;
+                }
+            }
+            else // many to many
+            {
+                nodeProbs  = rt->theProbs;
+                long i,j;
+                for (i=0; i<cBase; i++, nodeProbs++)
+                {
+                    tmp = 0;
+                    for (j=0; j<cBase; j++,fastIdx++)
+                        tmp += *fastIdx* tip->theProbs[j];
+                    *nodeProbs*=tmp;
+                }
+
+                reslt = 0;
+                fastIdx = theProbs;
+                nodeProbs-=cBase;
+                for (i=0; i<cBase; i++, nodeProbs++, fastIdx++)
+                {
+                    reslt+=*fastIdx * *nodeProbs;
+                }
+            }
+
+    if ((reslt<0.0)||(reslt==.0)) reslt = ALMOST_ZERO;
+    return reslt;*/
+}
+
+//_______________________________________________________________________________________________
+
+_Parameter   _TheTree::ReleafTree (_DataSetFilter* dsf, long index, long lastIndex, long startLeaf, long endLeaf)
+// set leaf value and re-prune w/o reexping
+// for subsequent entries into a datafilter
+{
+
+    long nodeCount;
+    _CalcNode* travNode,* theChildNode ;
+    _Parameter* fastIndex,*theProbbs, *stopper;
+    node<long>* nodeChild;
+
+    if (dsf->GetUnitLength() == 3) {
+        char *c1, *c2, *c3,
+             *o1, *o2, *o3;
+
+        c1 = dsf->GetColumn (3*index);
+        c2 = dsf->GetColumn (3*index+1);
+        c3 = dsf->GetColumn (3*index+2);
+
+        if (lastIndex>=0) {
+            o1 = dsf->GetColumn (3*lastIndex);
+            o2 = dsf->GetColumn (3*lastIndex+1);
+            o3 = dsf->GetColumn (3*lastIndex+2);
+        }
+
+        long   ccount  = dsf->conversionCache.lData[0],
+               ccount2 = ccount*ccount,
+               *ccodes  = dsf->conversionCache.lData+1,
+                *tcodes  = dsf->conversionCache.lData+89;
+
+        for (nodeCount = startLeaf; nodeCount<=endLeaf; nodeCount++) {
+            long       nMap = dsf->theNodeMap.lData[nodeCount];
+            travNode = (_CalcNode*)(((BaseRef*)flatCLeaves.lData)[nodeCount]);
+            char       A = c1[nMap],
+                       B = c2[nMap],
+                       C = c3[nMap];
+
+            if ((lastIndex<0)||(A!=o1[nMap])||(B!=o2[nMap])||(C!=o3[nMap])) {
+                A = ccodes[A-40];
+                B = ccodes[B-40];
+                C = ccodes[C-40];
+
+                if ((A==-1)||(B==-1)||(C==-1)) {
+                    travNode->lastState = dsf->Translate2Frequencies ((*dsf)(index,nodeCount), travNode->theProbs, true);
+                } else {
+                    travNode->lastState = tcodes[A*ccount2+B*ccount+C];
+                    if (travNode->lastState < 0) {
+                        travNode->lastState = dsf->Translate2Frequencies ((*dsf)(index,nodeCount), travNode->theProbs, true);
+                    } else {
+                        for (nMap=0; nMap<travNode->lastState; nMap++) {
+                            travNode->theProbs [nMap] = 0.0;
+                        }
+                        travNode->theProbs [nMap++] = 1.0;
+                        for (; nMap<cBase; nMap++) {
+                            travNode->theProbs [nMap] = 0.0;
+                        }
+                    }
+                }
+                theChildNode = ((_CalcNode*)((BaseRef*)variablePtrs.lData)
+                                [((node <long>*)(flatLeaves.lData[nodeCount]))->parent->in_object]);
+                theChildNode->cBase = -1;
+            }
+        }
+    } else {
+        if (dsf->GetUnitLength() == 2) {
+            char *c1, *c2,
+                 *o1, *o2;
+
+            c1 = dsf->GetColumn (2*index);
+            c2 = dsf->GetColumn (2*index+1);
+
+            if (lastIndex>=0) {
+                o1 = dsf->GetColumn (2*lastIndex);
+                o2 = dsf->GetColumn (2*lastIndex+1);
+            }
+
+            long   ccount  = dsf->conversionCache.lData[0],
+                   *ccodes  = dsf->conversionCache.lData+1,
+                    *tcodes  = dsf->conversionCache.lData+89;
+
+            for (nodeCount = startLeaf; nodeCount<=endLeaf; nodeCount++) {
+                long       nMap = dsf->theNodeMap.lData[nodeCount];
+                travNode = (_CalcNode*)(((BaseRef*)flatCLeaves.lData)[nodeCount]);
+                char       A = c1[nMap],
+                           B = c2[nMap];
+
+                if ((lastIndex<0)||(A!=o1[nMap])||(B!=o2[nMap])) {
+                    A = ccodes[A-40];
+                    B = ccodes[B-40];
+
+                    if ((A==-1)||(B==-1)) {
+                        travNode->lastState = dsf->Translate2Frequencies ((*dsf)(index,nodeCount), travNode->theProbs, true);
+                    } else {
+                        travNode->lastState = tcodes[A*ccount+B];
+                        if (travNode->lastState < 0) {
+                            travNode->lastState = dsf->Translate2Frequencies ((*dsf)(index,nodeCount), travNode->theProbs, true);
+                        } else {
+                            for (nMap=0; nMap<travNode->lastState; nMap++) {
+                                travNode->theProbs [nMap] = 0.0;
+                            }
+                            travNode->theProbs [nMap++] = 1;
+                            for (; nMap<cBase; nMap++) {
+                                travNode->theProbs [nMap] = 0.0;
+                            }
+                        }
+                    }
+                    theChildNode = ((_CalcNode*)((BaseRef*)variablePtrs.lData)
+                                    [((node <long>*)(flatLeaves.lData[nodeCount]))->parent->in_object]);
+                    theChildNode->cBase = -1;
+                }
+            }
+        } else {
+            for (nodeCount = startLeaf; nodeCount<=endLeaf; nodeCount++) {
+                travNode = (_CalcNode*)(((BaseRef*)flatCLeaves.lData)[nodeCount]);
+                if ((lastIndex<0)||(!dsf->CompareTwoSites(lastIndex,index,nodeCount))) {
+                    travNode->lastState = dsf->Translate2Frequencies ((*dsf)(index,nodeCount), travNode->theProbs, true);
+                    theChildNode = ((_CalcNode*)((BaseRef*)variablePtrs.lData)
+                                    [((node <long>*)(flatLeaves.lData[nodeCount]))->parent->in_object]);
+                    theChildNode->cBase = -1;
+                }
+            }
+        }
+    }
+
+    for (nodeCount = leftiNodes.lData[startLeaf]; nodeCount<flatTree.lLength; nodeCount++) {
+        theChildNode = (_CalcNode*)(((BaseRef*)flatTree.lData)[nodeCount]);
+        // we can immediately place the changes in the parent node
+        if (theChildNode->cBase<0) {
+            nodeChild = (node<long>*)flatNodes.lData[nodeCount];
+            for (long i=0; i<cBase; i++) {
+                theChildNode->theProbs[i] = LIKELIHOOD_SCALER;
+            }
+
+            for (long k=0; k<nodeChild->nodes.length; k++) {
+                travNode = ((_CalcNode*)((BaseRef*)variablePtrs.lData)[nodeChild->nodes.data[k]->in_object]);
+                fastIndex = travNode->compExp->theData;
+                theProbbs = travNode->theProbs;
+                long      nZ = travNode->lastState;
+
+                if (nZ>=0) {
+                    _Parameter a = theProbbs[nZ];
+                    theProbbs = theChildNode->theProbs;
+                    fastIndex+=nZ;
+                    stopper = theProbbs+cBase-cBase%4;
+                    for (; theProbbs!=stopper;) {
+                        *(theProbbs++)*=a**fastIndex;
+                        fastIndex += cBase;
+                        *(theProbbs++)*=a**fastIndex;
+                        fastIndex += cBase;
+                        *(theProbbs++)*=a**fastIndex;
+                        fastIndex += cBase;
+                        *(theProbbs++)*=a**fastIndex;
+                        fastIndex += cBase;
+                    }
+                    switch (cBase%4) {
+                    case 1: {
+                        *theProbbs*=a**fastIndex;
+                        break;
+                    }
+                    case 2: {
+                        *(theProbbs++)*=a**fastIndex;
+                        fastIndex += cBase;
+                        *theProbbs*=a**fastIndex;
+                        break;
+                    }
+                    case 3: {
+                        *(theProbbs++)*=a**fastIndex;
+                        fastIndex += cBase;
+                        *(theProbbs++)*=a**fastIndex;
+                        fastIndex += cBase;
+                        *theProbbs*=a**fastIndex;
+                        break;
+                    }
+                    }
+                } else {
+                    for (long i=0; i<cBase; i++) {
+                        _Parameter tmp = 0.0;
+                        stopper = theProbbs+cBase-cBase%4;
+                        // loop unrolled to depth 4
+                        for (; theProbbs!=stopper;) {
+                            tmp += *(theProbbs++)**(fastIndex++);
+                            tmp += *(theProbbs++)**(fastIndex++);
+                            tmp += *(theProbbs++)**(fastIndex++);
+                            tmp += *(theProbbs++)**(fastIndex++);
+                        }
+                        switch (cBase%4) {
+                        case 1: {
+                            tmp += *(theProbbs)**(fastIndex++);
+                            break;
+                        }
+                        case 2: {
+                            tmp += *(theProbbs++)**(fastIndex++);
+                            tmp += *(theProbbs)**(fastIndex++);
+                            break;
+                        }
+                        case 3: {
+                            tmp += *(theProbbs++)**(fastIndex++);
+                            tmp += *(theProbbs++)**(fastIndex++);
+                            tmp += *(theProbbs)**(fastIndex++);
+                            break;
+                        }
+                        }
+                        theChildNode->theProbs[i]*=tmp;
+                        theProbbs = travNode->theProbs;
+                    }
+                }
+            }
+            theChildNode->cBase = cBase;
+            nodeChild = nodeChild->parent;
+            if (nodeChild) {
+                ((_CalcNode*)((BaseRef*)variablePtrs.lData)[nodeChild->in_object])->cBase = -1;
+            }
+        }
+    }
+    _Parameter result = 0;
+
+    for (long i=0; i<cBase; i++) {
+        result+= theProbs[i]*theChildNode->theProbs[i];
+    }
+
+    if (result<=0.0) {
+        /*_Matrix stashZeroValues (cBase, flatTree.lLength, false, true);
+
+        _List   labels;
+
+        for (nodeCount = 0; nodeCount<flatTree.lLength; nodeCount++)
+        {
+            theChildNode = (_CalcNode*)(((BaseRef*)flatTree.lData)[nodeCount]);
+            labels <<  theChildNode->GetName();
+            for (long ii=0; ii<cBase; ii++)
+                stashZeroValues.Store (ii,nodeCount, theChildNode->theProbs[ii]);
+        }
+
+        _String cwt ("Report for site ");
+        cwt = cwt & index;
+        _HYChartWindow *chart = new _HYChartWindow(cwt, labels, stashZeroValues);
+        chart->BringToFront();*/
+
+        return ALMOST_ZERO;
+    }
+
+    return result;
+}
+
+
+//_______________________________________________________________________________________________
+
+_Parameter   _TheTree::ReleafTreeCache (_DataSetFilter* dsf, long index, long lastIndex, long startLeaf, long endLeaf, long position)
+// set leaf value and re-prune w/o reexping
+// for subsequent entries into a datafilter
+{
+
+    long nodeCount;
+    _CalcNode* travNode,* theChildNode ;
+    _Parameter* fastIndex,*theProbbs, *stopper;
+    node<long>* nodeChild;
+
+    if (dsf->GetUnitLength() == 3) {
+        char *c1, *c2, *c3,
+             *o1, *o2, *o3;
+
+        c1 = dsf->GetColumn (3*index);
+        c2 = dsf->GetColumn (3*index+1);
+        c3 = dsf->GetColumn (3*index+2);
+
+        if (lastIndex>=0) {
+            o1 = dsf->GetColumn (3*lastIndex);
+            o2 = dsf->GetColumn (3*lastIndex+1);
+            o3 = dsf->GetColumn (3*lastIndex+2);
+        }
+
+        long   ccount  = dsf->conversionCache.lData[0],
+               ccount2 = ccount*ccount,
+               *ccodes  = dsf->conversionCache.lData+1,
+                *tcodes  = dsf->conversionCache.lData+89;
+
+        for (nodeCount = startLeaf; nodeCount<=endLeaf; nodeCount++) {
+            long       nMap = dsf->theNodeMap.lData[nodeCount];
+            travNode = (_CalcNode*)(((BaseRef*)flatCLeaves.lData)[nodeCount]);
+            char       A = c1[nMap],
+                       B = c2[nMap],
+                       C = c3[nMap];
+
+            if ((lastIndex<0)||(A!=o1[nMap])||(B!=o2[nMap])||(C!=o3[nMap])) {
+                A = ccodes[A-40];
+                B = ccodes[B-40];
+                C = ccodes[C-40];
+
+                if ((A==-1)||(B==-1)||(C==-1)) {
+                    travNode->lastState = dsf->Translate2Frequencies ((*dsf)(index,nodeCount), travNode->theProbs, true);
+                } else {
+                    travNode->lastState = tcodes[A*ccount2+B*ccount+C];
+                    if (travNode->lastState < 0) {
+                        travNode->lastState = dsf->Translate2Frequencies ((*dsf)(index,nodeCount), travNode->theProbs, true);
+                    } else {
+                        for (nMap=0; nMap<travNode->lastState; nMap++) {
+                            travNode->theProbs [nMap] = 0.0;
+                        }
+                        travNode->theProbs [nMap++] = 1.0;
+                        for (; nMap<cBase; nMap++) {
+                            travNode->theProbs [nMap] = 0.0;
+                        }
+                    }
+                }
+                theChildNode = ((_CalcNode*)((BaseRef*)variablePtrs.lData)
+                                [((node <long>*)(flatLeaves.lData[nodeCount]))->parent->in_object]);
+                theChildNode->cBase = -1;
+            }
+        }
+    } else {
+        if (dsf->GetUnitLength() == 2) {
+            char *c1, *c2,
+                 *o1, *o2;
+
+            c1 = dsf->GetColumn (2*index);
+            c2 = dsf->GetColumn (2*index+1);
+
+            if (lastIndex>=0) {
+                o1 = dsf->GetColumn (2*lastIndex);
+                o2 = dsf->GetColumn (2*lastIndex+1);
+            }
+
+            long   ccount  = dsf->conversionCache.lData[0],
+                   *ccodes  = dsf->conversionCache.lData+1,
+                    *tcodes  = dsf->conversionCache.lData+89;
+
+            for (nodeCount = startLeaf; nodeCount<=endLeaf; nodeCount++) {
+                long       nMap = dsf->theNodeMap.lData[nodeCount];
+                travNode = (_CalcNode*)(((BaseRef*)flatCLeaves.lData)[nodeCount]);
+                char       A = c1[nMap],
+                           B = c2[nMap];
+
+                if ((lastIndex<0)||(A!=o1[nMap])||(B!=o2[nMap])) {
+                    A = ccodes[A-40];
+                    B = ccodes[B-40];
+
+                    if ((A==-1)||(B==-1)) {
+                        travNode->lastState = dsf->Translate2Frequencies ((*dsf)(index,nodeCount), travNode->theProbs, true);
+                    } else {
+                        travNode->lastState = tcodes[A*ccount+B];
+                        if (travNode->lastState < 0) {
+                            travNode->lastState = dsf->Translate2Frequencies ((*dsf)(index,nodeCount), travNode->theProbs, true);
+                        } else {
+                            for (nMap=0; nMap<travNode->lastState; nMap++) {
+                                travNode->theProbs [nMap] = 0.0;
+                            }
+                            travNode->theProbs [nMap++] = 1;
+                            for (; nMap<cBase; nMap++) {
+                                travNode->theProbs [nMap] = 0.0;
+                            }
+                        }
+                    }
+                    theChildNode = ((_CalcNode*)((BaseRef*)variablePtrs.lData)
+                                    [((node <long>*)(flatLeaves.lData[nodeCount]))->parent->in_object]);
+                    theChildNode->cBase = -1;
+                }
+            }
+        } else {
+            for (nodeCount = startLeaf; nodeCount<=endLeaf; nodeCount++) {
+                travNode = (_CalcNode*)(((BaseRef*)flatCLeaves.lData)[nodeCount]);
+                if ((lastIndex<0)||(!dsf->CompareTwoSites(lastIndex,index,nodeCount))) {
+                    travNode->lastState = dsf->Translate2Frequencies ((*dsf)(index,nodeCount), travNode->theProbs, true);
+                    theChildNode = ((_CalcNode*)((BaseRef*)variablePtrs.lData)
+                                    [((node <long>*)(flatLeaves.lData[nodeCount]))->parent->in_object]);
+                    theChildNode->cBase = -1;
+                }
+            }
+        }
+    }
+
+    long f = topLevelNodes.lLength-1,
+         mm = topLevelNodes.lData[f],
+         startINode = leftiNodes.lData[startLeaf];
+
+    for (long nI = 0; nI < f; nI++,mm>>=1) {
+        if (mm&1)
+            //if (1)
+            // marked for recalculation
+        {
+            long startAt = 0;
+
+            if (nI) {
+                startAt = topLevelNodes.lData[nI-1]+1;
+            }
+
+            if (startAt<startINode) {
+                startAt = startINode;
+            }
+
+            for (nodeCount=startAt; nodeCount<=topLevelNodes.lData[nI]; nodeCount++) {
+                theChildNode = (_CalcNode*)(((BaseRef*)flatTree.lData)[nodeCount]);
+                // we can immediately place the changes in the parent node
+                if (theChildNode->cBase<0) {
+                    nodeChild = (node<long>*)flatNodes.lData[nodeCount];
+                    for (long i=0; i<cBase; i++) {
+                        theChildNode->theProbs[i] = LIKELIHOOD_SCALER;
+                    }
+
+                    for (long k=0; k<nodeChild->nodes.length; k++) {
+                        travNode = ((_CalcNode*)((BaseRef*)variablePtrs.lData)[nodeChild->nodes.data[k]->in_object]);
+                        fastIndex = travNode->compExp->theData;
+                        theProbbs = travNode->theProbs;
+                        long      nZ = travNode->lastState;
+                        if (nZ>=0) {
+                            _Parameter a = theProbbs[nZ];
+                            theProbbs = theChildNode->theProbs;
+                            fastIndex+=nZ;
+                            stopper = theProbbs+cBase;
+                            for (; theProbbs!= stopper; fastIndex+=cBase, theProbbs++) {
+                                *theProbbs*=a**fastIndex;
+                            }
+
+                        } else {
+                            /*for (long i=0; i<cBase; i++)
+                            {
+                                _Parameter tmp = 0.0;
+                                for (long j=0; j< cBase; j++)
+                                    tmp += theProbbs[j] * fastIndex [j];
+
+                                theChildNode->theProbs[i]*=tmp;
+                                fastIndex += cBase;
+                            }*/
+
+                            long rem = cBase%4;
+                            stopper = theProbbs+(cBase-rem);
+                            if (rem==1) {
+                                for (long i=0; i<cBase; i++) {
+                                    _Parameter tmp = 0.0;
+                                    for (; theProbbs!=stopper;) {
+                                        tmp += *theProbbs ** fastIndex;
+                                        theProbbs++;
+                                        fastIndex++;
+                                        tmp += *theProbbs ** fastIndex;
+                                        theProbbs++;
+                                        fastIndex++;
+                                        tmp += *theProbbs ** fastIndex;
+                                        theProbbs++;
+                                        fastIndex++;
+                                        tmp += *theProbbs ** fastIndex;
+                                        theProbbs++;
+                                        fastIndex++;
+                                    }
+                                    tmp += *(theProbbs)**(fastIndex++);
+                                    theChildNode->theProbs[i]*=tmp;
+                                    theProbbs = travNode->theProbs;
+                                }
+                            } else if (rem==2) {
+                                for (long i=0; i<cBase; i++) {
+                                    _Parameter tmp = 0.0;
+                                    for (; theProbbs!=stopper;) {
+                                        tmp += *theProbbs ** fastIndex;
+                                        theProbbs++;
+                                        fastIndex++;
+                                        tmp += *theProbbs ** fastIndex;
+                                        theProbbs++;
+                                        fastIndex++;
+                                        tmp += *theProbbs ** fastIndex;
+                                        theProbbs++;
+                                        fastIndex++;
+                                        tmp += *theProbbs ** fastIndex;
+                                        theProbbs++;
+                                        fastIndex++;
+                                    }
+                                    tmp+= *(theProbbs++)**(fastIndex++);
+                                    tmp+= *(theProbbs)**(fastIndex++);
+                                    theChildNode->theProbs[i]*=tmp;
+                                    theProbbs = travNode->theProbs;
+                                }
+
+                            } else if (rem==3) {
+                                for (long i=0; i<cBase; i++) {
+                                    _Parameter tmp = 0.0;
+                                    for (; theProbbs!=stopper;) {
+                                        tmp += *theProbbs ** fastIndex;
+                                        theProbbs++;
+                                        fastIndex++;
+                                        tmp += *theProbbs ** fastIndex;
+                                        theProbbs++;
+                                        fastIndex++;
+                                        tmp += *theProbbs ** fastIndex;
+                                        theProbbs++;
+                                        fastIndex++;
+                                        tmp += *theProbbs ** fastIndex;
+                                        theProbbs++;
+                                        fastIndex++;
+                                    }
+                                    tmp+= *(theProbbs++)**(fastIndex++);
+                                    tmp+= *(theProbbs++)**(fastIndex++);
+                                    tmp+=*(theProbbs)**(fastIndex++);
+                                    theChildNode->theProbs[i]*=tmp;
+                                    theProbbs = travNode->theProbs;
+                                }
+
+                            } else {
+                                for (long i=0; i<cBase; i++) {
+                                    _Parameter tmp = 0.0;
+                                    for (; theProbbs!=stopper;) {
+                                        tmp += *theProbbs ** fastIndex;
+                                        theProbbs++;
+                                        fastIndex++;
+                                        tmp += *theProbbs ** fastIndex;
+                                        theProbbs++;
+                                        fastIndex++;
+                                        tmp += *theProbbs ** fastIndex;
+                                        theProbbs++;
+                                        fastIndex++;
+                                        tmp += *theProbbs ** fastIndex;
+                                        theProbbs++;
+                                        fastIndex++;
+                                    }
+                                    theChildNode->theProbs[i]*=tmp;
+                                    theProbbs = travNode->theProbs;
+                                }
+                            }
+                        }
+                    }
+                    theChildNode->cBase = cBase;
+                    nodeChild = nodeChild->parent;
+                    if (nodeChild) {
+                        ((_CalcNode*)((BaseRef*)variablePtrs.lData)[nodeChild->in_object])->cBase = -1;
+                    }
+                }
+            }
+
+            theChildNode = (_CalcNode*)(((BaseRef*)flatTree.lData)[topLevelNodes.lData[nI]]);
+            _Parameter* nodeProbs = theChildNode->theProbs;
+            fastIndex = rootIChildrenCache+position*cBase*(topLevelNodes.lLength-1)+cBase*nI;
+            for (long i=0; i<cBase; i++) {
+                *(fastIndex++) = *(nodeProbs++);
+            }
+        } else {
+            _Parameter* nodeProbs = ((_CalcNode*)(((BaseRef*)flatTree.lData)[topLevelNodes.lData[nI]]))->theProbs;
+            fastIndex = rootIChildrenCache+position*cBase*(topLevelNodes.lLength-1)+cBase*nI;
+            for (long i=0; i<cBase; i++) {
+                *(nodeProbs++) = *(fastIndex++);
+            }
+
+            nodeChild = ((node <long>*)(flatNodes.lData[topLevelNodes.lData[nI]]))->parent;
+            ((_CalcNode*)((BaseRef*)variablePtrs.lData)[nodeChild->in_object])->cBase = -1;
+        }
+    }
+
+    for (nodeCount=topLevelNodes.lData[f-1]+1; nodeCount<flatTree.lLength; nodeCount++) {
+        theChildNode = (_CalcNode*)(((BaseRef*)flatTree.lData)[nodeCount]);
+        if (theChildNode->cBase<0) {
+            nodeChild = (node<long>*)flatNodes.lData[nodeCount];
+            for (long i=0; i<cBase; i++) {
+                theChildNode->theProbs[i] = LIKELIHOOD_SCALER;
+            }
+
+            for (long k=0; k<nodeChild->nodes.length; k++) {
+                travNode = ((_CalcNode*)((BaseRef*)variablePtrs.lData)[nodeChild->nodes.data[k]->in_object]);
+                fastIndex = travNode->compExp->theData;
+                theProbbs = travNode->theProbs;
+                long      nZ = travNode->lastState;
+
+                if (nZ>=0) {
+                    _Parameter a = theProbbs[nZ];
+                    theProbbs = theChildNode->theProbs;
+                    fastIndex+=nZ;
+                    stopper = theProbbs+cBase;
+                    for (; theProbbs!=stopper; theProbbs++, fastIndex+=cBase) {
+                        *theProbbs*=a**fastIndex;
+                    }
+                } else {
+                    /*for (long i=0; i<cBase; i++)
+                    {
+                        _Parameter tmp = 0.0;
+                        for (long j=0;j<cBase;j++)
+                            tmp += theProbbs[j] *fastIndex[j];
+
+                        theChildNode->theProbs[i]*=tmp;
+                        fastIndex += cBase;
+                    }*/
+
+                    long rem = cBase%4;
+                    stopper = theProbbs+(cBase-rem);
+                    if (rem==1) {
+                        for (long i=0; i<cBase; i++) {
+                            _Parameter tmp = 0.0;
+                            for (; theProbbs!=stopper;) {
+                                tmp += *theProbbs ** fastIndex;
+                                theProbbs++;
+                                fastIndex++;
+                                tmp += *theProbbs ** fastIndex;
+                                theProbbs++;
+                                fastIndex++;
+                                tmp += *theProbbs ** fastIndex;
+                                theProbbs++;
+                                fastIndex++;
+                                tmp += *theProbbs ** fastIndex;
+                                theProbbs++;
+                                fastIndex++;
+                            }
+                            tmp += *(theProbbs)**(fastIndex++);
+                            theChildNode->theProbs[i]*=tmp;
+                            theProbbs = travNode->theProbs;
+                        }
+                    } else if (rem==2) {
+                        for (long i=0; i<cBase; i++) {
+                            _Parameter tmp = 0.0;
+                            for (; theProbbs!=stopper;) {
+                                tmp += *theProbbs ** fastIndex;
+                                theProbbs++;
+                                fastIndex++;
+                                tmp += *theProbbs ** fastIndex;
+                                theProbbs++;
+                                fastIndex++;
+                                tmp += *theProbbs ** fastIndex;
+                                theProbbs++;
+                                fastIndex++;
+                                tmp += *theProbbs ** fastIndex;
+                                theProbbs++;
+                                fastIndex++;
+                            }
+                            tmp+= *(theProbbs++)**(fastIndex++);
+                            tmp+= *(theProbbs)**(fastIndex++);
+                            theChildNode->theProbs[i]*=tmp;
+                            theProbbs = travNode->theProbs;
+                        }
+
+                    } else if (rem==3) {
+                        for (long i=0; i<cBase; i++) {
+                            _Parameter tmp = 0.0;
+                            for (; theProbbs!=stopper;) {
+                                tmp += *theProbbs ** fastIndex;
+                                theProbbs++;
+                                fastIndex++;
+                                tmp += *theProbbs ** fastIndex;
+                                theProbbs++;
+                                fastIndex++;
+                                tmp += *theProbbs ** fastIndex;
+                                theProbbs++;
+                                fastIndex++;
+                                tmp += *theProbbs ** fastIndex;
+                                theProbbs++;
+                                fastIndex++;
+                            }
+                            tmp+= *(theProbbs++)**(fastIndex++);
+                            tmp+= *(theProbbs++)**(fastIndex++);
+                            tmp+=*(theProbbs)**(fastIndex++);
+                            theChildNode->theProbs[i]*=tmp;
+                            theProbbs = travNode->theProbs;
+                        }
+
+                    } else {
+                        for (long i=0; i<cBase; i++) {
+                            _Parameter tmp = 0.0;
+                            for (; theProbbs!=stopper;) {
+                                tmp += *theProbbs ** fastIndex;
+                                theProbbs++;
+                                fastIndex++;
+                                tmp += *theProbbs ** fastIndex;
+                                theProbbs++;
+                                fastIndex++;
+                                tmp += *theProbbs ** fastIndex;
+                                theProbbs++;
+                                fastIndex++;
+                                tmp += *theProbbs ** fastIndex;
+                                theProbbs++;
+                                fastIndex++;
+                            }
+                            theChildNode->theProbs[i]*=tmp;
+                            theProbbs = travNode->theProbs;
+                        }
+                    }
+                }
+            }
+            theChildNode->cBase = cBase;
+            nodeChild = nodeChild->parent;
+            if (nodeChild) {
+                ((_CalcNode*)((BaseRef*)variablePtrs.lData)[nodeChild->in_object])->cBase = -1;
+            }
+        }
+    }
+
+    _Parameter result = 0.;
+
+    for (long i=0; i<cBase; i++) {
+        result+= theProbs[i]*theChildNode->theProbs[i];
+    }
+
+    if (result<=0.0) {
+        return ALMOST_ZERO;
+    }
+
+    return result;
+}
+
+//_______________________________________________________________________________________________
+
+#if USE_SCALING_TO_FIX_UNDERFLOW
+_Parameter   _TheTree::ThreadReleafTreeCache (_DataSetFilter* dsf, long index, long lastIndex, long startLeaf, long endLeaf, long position, long offset, long fixAttempt, _Parameter localScalingFactor)
+#else
+_Parameter   _TheTree::ThreadReleafTreeCache (_DataSetFilter* dsf, long index, long lastIndex, long startLeaf, long endLeaf, long position, long offset)
+
+#endif
+// set leaf value and re-prune w/o reexping
+// for subsequent entries into a datafilter
+{
+
+    long        nodeCount,
+                * ns  = nodeStates+(flatLeaves.lLength+flatNodes.lLength)*offset;
+
+    _CalcNode * travNode,
+              * theChildNode;
+
+    _Parameter* fastIndex,
+                * theProbbs,
+                * stopper,
+                * mlc = marginalLikelihoodCache+cBase*(flatLeaves.lLength+flatNodes.lLength)*offset;
+
+    node<long>* nodeChild;
+
+    char      * nm  = nodeMarkers+(flatNodes.lLength)*offset,
+                unitSize = dsf->GetUnitLength ();
+
+#if USE_SCALING_TO_FIX_UNDERFLOW
+    _Parameter scalingFactor = scalingForUnderflow->theData[index];
+    if (lastIndex>=0 && scalingFactor != scalingForUnderflow->theData[lastIndex]) {
+        lastIndex = -1;
+        startLeaf = 0;
+        endLeaf = flatLeaves.lLength-1;
+    }
+    bool overflowFlag = fixAttempt<0;
+    if (overflowFlag) {
+        fixAttempt = -fixAttempt;
+    }
+
+#endif
+
+    if (unitSize == 3) {
+        char *c1, *c2, *c3,
+             *o1, *o2, *o3;
+
+        c1 = dsf->GetColumn (3*index);
+        c2 = dsf->GetColumn (3*index+1);
+        c3 = dsf->GetColumn (3*index+2);
+
+        if (lastIndex>=0) {
+            o1 = dsf->GetColumn (3*lastIndex);
+            o2 = dsf->GetColumn (3*lastIndex+1);
+            o3 = dsf->GetColumn (3*lastIndex+2);
+        }
+
+        long   ccount  = dsf->conversionCache.lData[0],
+               ccount2 = ccount*ccount,
+               *ccodes  = dsf->conversionCache.lData+1,
+                *tcodes  = dsf->conversionCache.lData+89;
+
+        for (nodeCount = startLeaf; nodeCount<=endLeaf; nodeCount++) {
+            long       nMap = dsf->theNodeMap.lData[nodeCount];
+            char       A = c1[nMap],
+                       B = c2[nMap],
+                       C = c3[nMap];
+
+            if ( lastIndex<0 || A!=o1[nMap] || B!=o2[nMap] || C!=o3[nMap]) {
+                A = ccodes[A-40];
+                B = ccodes[B-40];
+                C = ccodes[C-40];
+                fastIndex = mlc+cBase*nodeCount;
+
+                if (A==-1 || B==-1 || C==-1) {
+                    _String codon (3,false);
+                    dsf->GrabSite (index,nodeCount,codon);
+                    ns[nodeCount] = dsf->Translate2Frequencies (codon, fastIndex, true);
+#if USE_SCALING_TO_FIX_UNDERFLOW
+                    if (scalingFactor != 1.0)
+                        for (nMap = 0; nMap < cBase; nMap ++) {
+                            fastIndex[nMap] *= scalingFactor;
+                        }
+#endif
+                } else {
+                    long nState = ns[nodeCount] = tcodes[A*ccount2+B*ccount+C];
+                    if (nState < 0) {
+                        _String codon (3,false);
+                        dsf->GrabSite (index,nodeCount,codon);
+                        ns[nodeCount] = dsf->Translate2Frequencies (codon,fastIndex, true);
+#if USE_SCALING_TO_FIX_UNDERFLOW
+                        if (scalingFactor != 1.0)
+                            for (nMap = 0; nMap < cBase; nMap ++) {
+                                fastIndex[nMap] *= scalingFactor;
+                            }
+#endif
+                    } else {
+                        for (long z = 0; z< cBase; z++) {
+                            fastIndex[z] = 0.0;
+                        }
+#if USE_SCALING_TO_FIX_UNDERFLOW
+                        fastIndex [nState] = scalingFactor;
+#else
+                        fastIndex [nState] = 1.0;
+#endif
+                    }
+                }
+                theChildNode = ((_CalcNode*)((BaseRef*)variablePtrs.lData)
+                                [((node <long>*)(flatLeaves.lData[nodeCount]))->parent->in_object]);
+                nm[theChildNode->nodeIndex-flatLeaves.lLength] = -1;
+            }
+        }
+    } else {
+        if (unitSize == 2) {
+            char *c1, *c2,
+                 *o1, *o2;
+
+            c1 = dsf->GetColumn (2*index);
+            c2 = dsf->GetColumn (2*index+1);
+
+            if (lastIndex>=0) {
+                o1 = dsf->GetColumn (2*lastIndex);
+                o2 = dsf->GetColumn (2*lastIndex+1);
+            }
+
+            long   ccount  = dsf->conversionCache.lData[0],
+                   *ccodes  = dsf->conversionCache.lData+1,
+                    *tcodes  = dsf->conversionCache.lData+89;
+
+            for (nodeCount = startLeaf; nodeCount<=endLeaf; nodeCount++) {
+                long       nMap = dsf->theNodeMap.lData[nodeCount];
+                //travNode = (_CalcNode*)(((BaseRef*)flatCLeaves.lData)[nodeCount]);
+                char       A = c1[nMap],
+                           B = c2[nMap];
+
+                if ((lastIndex<0)||(A!=o1[nMap])||(B!=o2[nMap])) {
+                    A = ccodes[A-40];
+                    B = ccodes[B-40];
+
+                    fastIndex = mlc+cBase*nodeCount;
+
+                    if ((A==-1)||(B==-1)) {
+                        _String di (2,false);
+                        dsf->GrabSite (index,nodeCount,di);
+                        ns[nodeCount] = dsf->Translate2Frequencies (di, fastIndex, true);
+                    } else {
+                        long nState = ns[nodeCount] = tcodes[A*ccount+B];
+
+                        if (nState < 0) {
+                            _String di (2,false);
+                            dsf->GrabSite (index,nodeCount,di);
+                            ns[nodeCount] = dsf->Translate2Frequencies (di, fastIndex, true);
+                        } else {
+                            for (nMap=0; nMap<nState; nMap++) {
+                                fastIndex [nMap] = 0.0;
+                            }
+                            fastIndex [nMap++] = 1.;
+                            for (; nMap<cBase; nMap++) {
+                                fastIndex [nMap] = 0.0;
+                            }
+                        }
+                    }
+                    theChildNode = ((_CalcNode*)((BaseRef*)variablePtrs.lData)
+                                    [((node <long>*)(flatLeaves.lData[nodeCount]))->parent->in_object]);
+                    nm[theChildNode->nodeIndex-flatLeaves.lLength] = -1;
+                }
+            }
+        } else {
+            for (nodeCount = startLeaf; nodeCount<=endLeaf; nodeCount++) {
+                //travNode = (_CalcNode*)(((BaseRef*)flatCLeaves.lData)[nodeCount]);
+                if ((lastIndex<0)||(!dsf->CompareTwoSites(lastIndex,index,nodeCount))) {
+                    _String         dPoint (unitSize,false);
+                    dsf->GrabSite (index,nodeCount,dPoint);
+                    ns[nodeCount] = dsf->Translate2Frequencies (dPoint, mlc+cBase*nodeCount, true);
+                    theChildNode = ((_CalcNode*)((BaseRef*)variablePtrs.lData)
+                                    [((node <long>*)(flatLeaves.lData[nodeCount]))->parent->in_object]);
+                    nm[theChildNode->nodeIndex-flatLeaves.lLength] = -1;
+                }
+            }
+        }
+    }
+
+    long f          = topLevelNodes.lLength-1,
+         mm       = topLevelNodes.lData[f],
+         startINode = leftiNodes.lData[startLeaf],
+         rem       = cBase%4,
+         upTo        = cBase-rem;
+
+
+    for (long nI = 0; nI < f; nI++,mm>>=1) {
+        if (mm&1)
+            //if (1)
+            // marked for recalculation
+        {
+            long startAt = 0;
+
+            if (nI) {
+                startAt = topLevelNodes.lData[nI-1]+1;
+            }
+
+            if (startAt<startINode) {
+                startAt = startINode;
+            }
+
+            for (nodeCount=startAt; nodeCount<=topLevelNodes.lData[nI]; nodeCount++) {
+                if (nm[nodeCount]<0) {
+                    nodeChild = (node<long>*)flatNodes.lData[nodeCount];
+                    _Parameter* theseProbs = mlc + cBase*(nodeCount+flatLeaves.lLength);
+                    for (long i=0; i<cBase; i++) {
+                        theseProbs[i] = LIKELIHOOD_SCALER;
+                    }
+
+                    for (long k=0; k<nodeChild->nodes.length; k++) {
+                        travNode = ((_CalcNode*)((BaseRef*)variablePtrs.lData)[nodeChild->nodes.data[k]->in_object]);
+                        fastIndex = travNode->compExp->theData;
+                        _Parameter * cProbs =  mlc + cBase*(travNode->nodeIndex);
+                        theProbbs = cProbs;
+                        long      nZ = ns[travNode->nodeIndex];
+                        if (nZ>=0) {
+                            _Parameter a = theProbbs[nZ];
+                            theProbbs       = theseProbs;
+                            fastIndex       +=nZ;
+                            stopper          = theProbbs+cBase;
+                            for (; theProbbs!= stopper; fastIndex+=cBase, theProbbs++)
+#if USE_SCALING_TO_FIX_UNDERFLOW
+                                *theProbbs*=a**fastIndex;// * scalingFactor;
+#else
+                                *theProbbs*=a**fastIndex;
+#endif
+                        } else {
+                            stopper = theProbbs+(cBase-rem);
+                            if (rem==1) {
+                                for (long i=0; i<cBase; i++) {
+                                    _Parameter tmp1  = 0.0,
+                                               tmp2  = 0.0,
+                                               tmp3  = 0.0,
+                                               tmp4  = 0.0;
+
+                                    for (long k=0; k<upTo; k+=4) {
+                                        tmp1 += cProbs[k]  *fastIndex[k];
+                                        tmp2 += cProbs[k+1]*fastIndex[k+1];
+                                        tmp3 += cProbs[k+2]*fastIndex[k+2];
+                                        tmp4 += cProbs[k+3]*fastIndex[k+3];
+                                    }
+
+                                    theseProbs[i] *= tmp1 + cProbs[upTo]*fastIndex[upTo] + tmp2+tmp3+tmp4;
+                                    fastIndex += cBase;
+                                }
+                            } else if (rem==2) {
+                                for (long i=0; i<cBase; i++) {
+                                    _Parameter tmp1  = 0.0,
+                                               tmp2  = 0.0,
+                                               tmp3  = 0.0,
+                                               tmp4  = 0.0;
+
+                                    for (long k=0; k<upTo; k+=4) {
+                                        tmp1 += cProbs[k]  *fastIndex[k];
+                                        tmp2 += cProbs[k+1]*fastIndex[k+1];
+                                        tmp3 += cProbs[k+2]*fastIndex[k+2];
+                                        tmp4 += cProbs[k+3]*fastIndex[k+3];
+                                    }
+
+                                    theseProbs[i] *= tmp1+tmp2+tmp3+tmp4+
+                                                     + cProbs[upTo]*fastIndex[upTo] +
+                                                     + cProbs[upTo+1]*fastIndex[upTo+1];
+                                    fastIndex += cBase;
+                                }
+                            } else if (rem==3)
+                                for (long i=0; i<cBase; i++) {
+                                    _Parameter tmp1  = 0.0,
+                                               tmp2  = 0.0,
+                                               tmp3  = 0.0,
+                                               tmp4  = 0.0;
+
+                                    for (long k=0; k<upTo; k+=4) {
+                                        tmp1 += cProbs[k]  *fastIndex[k];
+                                        tmp2 += cProbs[k+1]*fastIndex[k+1];
+                                        tmp3 += cProbs[k+2]*fastIndex[k+2];
+                                        tmp4 += cProbs[k+3]*fastIndex[k+3];
+                                    }
+
+                                    theseProbs[i] *= tmp1+tmp2+tmp3+tmp4+
+                                                     + cProbs[upTo]*fastIndex[upTo] +
+                                                     + cProbs[upTo+1]*fastIndex[upTo+1]+
+                                                     + cProbs[upTo+2]*fastIndex[upTo+2];
+
+                                    fastIndex += cBase;
+                                }
+                            else
+                                for (long i=0; i<cBase; i++) {
+                                    _Parameter tmp1  = 0.0,
+                                               tmp2  = 0.0,
+                                               tmp3  = 0.0,
+                                               tmp4  = 0.0;
+
+                                    for (long k=0; k<upTo; k+=4) {
+                                        tmp1 += cProbs[k]  *fastIndex[k];
+                                        tmp2 += cProbs[k+1]*fastIndex[k+1];
+                                        tmp3 += cProbs[k+2]*fastIndex[k+2];
+                                        tmp4 += cProbs[k+3]*fastIndex[k+3];
+                                    }
+
+                                    theseProbs[i] *= tmp1+tmp2+tmp3+tmp4;
+                                    fastIndex     += cBase;
+                                }
+                        }
+#if USE_SCALING_TO_FIX_UNDERFLOW
+                        long nodeCheck = 0;
+                        for (nodeCheck = 0; nodeCheck < cBase; nodeCheck++)
+                            if (theseProbs[nodeCheck] > 0.0 || theseProbs[nodeCheck] == HUGE_VAL) {
+                                break;
+                            }
+
+                        if (nodeCheck == cBase || theseProbs[nodeCheck] == HUGE_VAL) {
+                            return doScaling (dsf, index, position, offset,fixAttempt,localScalingFactor,overflowFlag,nodeCheck < cBase);
+                        }
+#endif
+                    }
+                    nm[nodeCount] = 0;
+                    nodeChild = nodeChild->parent;
+                    if (nodeChild) {
+                        nm[((_CalcNode*)((BaseRef*)variablePtrs.lData)[nodeChild->in_object])->nodeIndex-flatLeaves.lLength] = -1;
+                    }
+                }
+            }
+
+            theChildNode = (_CalcNode*)(((BaseRef*)flatTree.lData)[topLevelNodes.lData[nI]]);
+            _Parameter* nodeProbs = mlc+cBase*(theChildNode->nodeIndex);
+            fastIndex = rootIChildrenCache+position*cBase*(topLevelNodes.lLength-1)+cBase*nI;
+            for (long i=0; i<cBase; i++) {
+                *(fastIndex++) = *(nodeProbs++);
+            }
+        } else {
+            _Parameter* nodeProbs = mlc+cBase*
+                                    (((_CalcNode*)(((BaseRef*)flatTree.lData)[topLevelNodes.lData[nI]]))->nodeIndex);
+
+            fastIndex = rootIChildrenCache+position*cBase*(topLevelNodes.lLength-1)+cBase*nI;
+            for (long i=0; i<cBase; i++) {
+                *(nodeProbs++) = *(fastIndex++);
+            }
+
+            nodeChild = ((node <long>*)(flatNodes.lData[topLevelNodes.lData[nI]]))->parent;
+            nm[((_CalcNode*)((BaseRef*)variablePtrs.lData)[nodeChild->in_object])->nodeIndex-flatLeaves.lLength] = -1;
+        }
+    }
+
+    for (nodeCount=topLevelNodes.lData[f-1]+1; nodeCount<flatTree.lLength; nodeCount++) {
+        if (nm[nodeCount]<0) {
+            nodeChild = (node<long>*)flatNodes.lData[nodeCount];
+            _Parameter* theseProbs = mlc + cBase*(nodeCount+flatLeaves.lLength);
+            for (long i=0; i<cBase; i++) {
+                theseProbs[i] = LIKELIHOOD_SCALER;
+            }
+
+            for (long k=0; k<nodeChild->nodes.length; k++) {
+                travNode = ((_CalcNode*)((BaseRef*)variablePtrs.lData)[nodeChild->nodes.data[k]->in_object]);
+                fastIndex = travNode->compExp->theData;
+                _Parameter * cProbs =  mlc + cBase*(travNode->nodeIndex);
+                theProbbs = cProbs;
+                long      nZ = ns[travNode->nodeIndex];
+                if (nZ>=0) {
+                    _Parameter a = theProbbs[nZ];
+                    theProbbs = theseProbs;
+                    fastIndex+=nZ;
+                    stopper = theProbbs+cBase;
+                    for (; theProbbs!= stopper; fastIndex+=cBase, theProbbs++)
+#if USE_SCALING_TO_FIX_UNDERFLOW
+                        *theProbbs*=a**fastIndex;// * scalingFactor;
+#else
+                        *theProbbs*=a**fastIndex;
+#endif
+                } else {
+                    stopper = theProbbs+(cBase-rem);
+                    if (rem==1) {
+                        for (long i=0; i<cBase; i++) {
+                            _Parameter tmp1  = 0.0,
+                                       tmp2  = 0.0,
+                                       tmp3  = 0.0,
+                                       tmp4  = 0.0;
+
+                            for (long k=0; k<upTo; k+=4) {
+                                tmp1 += cProbs[k]  *fastIndex[k];
+                                tmp2 += cProbs[k+1]*fastIndex[k+1];
+                                tmp3 += cProbs[k+2]*fastIndex[k+2];
+                                tmp4 += cProbs[k+3]*fastIndex[k+3];
+                            }
+
+                            theseProbs[i] *= tmp1 + cProbs[upTo]*fastIndex[upTo] + tmp2+tmp3+tmp4;
+                            fastIndex += cBase;
+                        }
+                    } else if (rem==2) {
+                        for (long i=0; i<cBase; i++) {
+                            _Parameter tmp1  = 0.0,
+                                       tmp2  = 0.0,
+                                       tmp3  = 0.0,
+                                       tmp4  = 0.0;
+
+                            for (long k=0; k<upTo; k+=4) {
+                                tmp1 += cProbs[k]  *fastIndex[k];
+                                tmp2 += cProbs[k+1]*fastIndex[k+1];
+                                tmp3 += cProbs[k+2]*fastIndex[k+2];
+                                tmp4 += cProbs[k+3]*fastIndex[k+3];
+                            }
+
+                            theseProbs[i] *= tmp1 + cProbs [upTo]   * fastIndex [upTo]
+                                             + cProbs [upTo+1] * fastIndex [upTo+1]
+                                             + tmp2+tmp3+tmp4;
+                            fastIndex += cBase;
+                        }
+
+                    } else if (rem==3)
+                        for (long i=0; i<cBase; i++) {
+                            _Parameter tmp1  = 0.0,
+                                       tmp2  = 0.0,
+                                       tmp3  = 0.0,
+                                       tmp4  = 0.0;
+
+                            for (long k=0; k<upTo; k+=4) {
+                                tmp1 += cProbs[k]  *fastIndex[k];
+                                tmp2 += cProbs[k+1]*fastIndex[k+1];
+                                tmp3 += cProbs[k+2]*fastIndex[k+2];
+                                tmp4 += cProbs[k+3]*fastIndex[k+3];
+                            }
+
+                            theseProbs[i] *= tmp1 + cProbs [upTo]   * fastIndex [upTo]
+                                             + cProbs [upTo+1] * fastIndex [upTo+1]
+                                             + cProbs [upTo+2] * fastIndex [upTo+2]
+                                             + tmp2+tmp3+tmp4;
+                            fastIndex += cBase;
+                        }
+                    else {
+                        for (long i=0; i<cBase; i++) {
+                            _Parameter tmp1  = 0.0,
+                                       tmp2  = 0.0,
+                                       tmp3  = 0.0,
+                                       tmp4  = 0.0;
+
+                            for (long k=0; k<upTo; k+=4) {
+                                tmp1 += cProbs[k]  *fastIndex[k];
+                                tmp2 += cProbs[k+1]*fastIndex[k+1];
+                                tmp3 += cProbs[k+2]*fastIndex[k+2];
+                                tmp4 += cProbs[k+3]*fastIndex[k+3];
+                            }
+
+                            theseProbs[i] *= tmp1 + tmp2+tmp3+tmp4;
+                            fastIndex += cBase;
+                        }
+                    }
+                }
+            }
+            nm[nodeCount] = 0;
+            nodeChild = nodeChild->parent;
+            if (nodeChild) {
+                nm[((_CalcNode*)((BaseRef*)variablePtrs.lData)[nodeChild->in_object])->nodeIndex-flatLeaves.lLength] = -1;
+            }
+
+#if USE_SCALING_TO_FIX_UNDERFLOW
+            long nodeCheck = 0;
+            for (nodeCheck = 0; nodeCheck < cBase; nodeCheck++)
+                if (theseProbs[nodeCheck] > 0.0 || theseProbs[nodeCheck] == HUGE_VAL) {
+                    break;
+                }
+
+            if (nodeCheck == cBase || theseProbs[nodeCheck] == HUGE_VAL) {
+                return doScaling (dsf, index, position, offset,fixAttempt,localScalingFactor,overflowFlag,nodeCheck < cBase);
+            }
+#endif
+
+        }
+
+    }
+
+    _Parameter result = 0;
+
+    fastIndex = mlc+cBase*(flatNodes.lLength+flatLeaves.lLength-1);
+
+    for (long i=0; i<cBase; i++) {
+        result+= theProbs[i]*fastIndex[i];
+    }
+
+#if USE_SCALING_TO_FIX_UNDERFLOW
+    if (result <= 0.0) { // underflow
+        return doScaling (dsf, index, position, offset,fixAttempt,localScalingFactor,overflowFlag,false);
+    } else if (result == HUGE_VAL) {
+        return doScaling (dsf, index, position, offset,fixAttempt,localScalingFactor,overflowFlag,true);
+    }
+#else
+    if (result<=0.0) {
+        return ALMOST_ZERO;
+    }
+#endif
+
+    return result;
+}
+
+//_______________________________________________________________________________________________
+
+_Parameter   _TheTree::ReleafTreeChar4 (_DataSetFilter* dsf, long index, long lastIndex, long startLeaf, long endLeaf, long position)
+
+// set leaf value and re-prune w/o reexping
+// for subsequent entries into a datafilter
+{
+
+    _CalcNode               * travNode,
+                            * theChildNode;
+
+    long                    nodeCount,
+                            f;
+
+    _Parameter              * fastIndex;
+
+    node<long>              * nodeChild;
+
+    char                    *pastState = dsf->GetColumn(lastIndex),
+                             *thisState = dsf->GetColumn(index);
+
+    for (nodeCount = startLeaf; nodeCount<=endLeaf; nodeCount++) {
+        f = dsf->theNodeMap.lData[nodeCount];
+        if (thisState[f]!=pastState[f]) {
+            travNode     = (_CalcNode*)(((BaseRef*)flatCLeaves.lData)[nodeCount]);
+            long* cCache = dsf->conversionCache.lData+(thisState[f]-40)*5;
+            travNode->theProbs[0] = *(cCache++);
+            travNode->theProbs[1] = *(cCache++);
+            travNode->theProbs[2] = *(cCache++);
+            travNode->theProbs[3] = *(cCache++);
+            travNode->lastState = *cCache;
+            theChildNode = ((_CalcNode*)((BaseRef*)variablePtrs.lData)
+                            [((node <long>*)(flatLeaves.lData[nodeCount]))->parent->in_object]);
+            if (theChildNode->cBase>0) {
+                theChildNode->cBase = -1;
+            }
+        }
+    }
+
+    f = topLevelNodes.lLength-1;
+    long mm = topLevelNodes.lData[f],
+         startINode = leftiNodes.lData[startLeaf];
+
+    for (long nI = 0; nI < f; nI++,mm>>=1) {
+        if (mm&1)
+            //if (1)
+            // marked for recalculation
+        {
+            long startAt = 0;
+
+            if (nI) {
+                startAt = topLevelNodes.lData[nI-1]+1;
+            }
+
+            if (startAt<startINode) {
+                startAt = startINode;
+            }
+
+            for (nodeCount=startAt; nodeCount<=topLevelNodes.lData[nI]; nodeCount++) {
+                theChildNode = (_CalcNode*)(((BaseRef*)flatTree.lData)[nodeCount]);
+                if (theChildNode->cBase == -1) { // marked for update
+                    nodeChild = ((node <long>*)(flatNodes.lData[nodeCount]));
+                    theChildNode->theProbs[0]=LIKELIHOOD_SCALER;
+                    theChildNode->theProbs[1]=LIKELIHOOD_SCALER;
+                    theChildNode->theProbs[2]=LIKELIHOOD_SCALER;
+                    theChildNode->theProbs[3]=LIKELIHOOD_SCALER;
+                    theChildNode->cBase = 4;
+
+                    for (long k=0; k <nodeChild->nodes.length; k++) {
+                        travNode =
+                            ((_CalcNode*)((BaseRef*)variablePtrs.lData)[nodeChild->nodes.data[k]->in_object]);
+                        fastIndex = travNode->compExp->theData;
+                        if (travNode->lastState<0) {
+                            _Parameter a = *(travNode->theProbs),
+                                       b = travNode->theProbs[1],
+                                       c = travNode->theProbs[2],
+                                       d = travNode->theProbs[3];
+
+                            _Parameter tmp = a * *(fastIndex++);
+                            tmp +=b* *(fastIndex++);
+                            tmp +=c* *(fastIndex++);
+                            theChildNode->theProbs[0]*=tmp+d* *(fastIndex++);
+
+                            tmp = a * *(fastIndex++);
+                            tmp +=b* *(fastIndex++);
+                            tmp +=c* *(fastIndex++);
+                            theChildNode->theProbs[1]*=tmp+d* *(fastIndex++);
+
+                            tmp = a * *(fastIndex++);
+                            tmp +=b* *(fastIndex++);
+                            tmp +=c* *(fastIndex++);
+                            theChildNode->theProbs[2]*=tmp+d* *(fastIndex++);
+
+                            tmp = a * *(fastIndex++);
+                            tmp +=b* *(fastIndex++);
+                            tmp +=c* *(fastIndex++);
+                            theChildNode->theProbs[3]*=tmp+d* *(fastIndex++);
+                        } else {
+                            fastIndex+=travNode->lastState;
+                            theChildNode->theProbs[0]*=*fastIndex;
+                            theChildNode->theProbs[1]*=fastIndex[4];
+                            theChildNode->theProbs[2]*=fastIndex[8];
+                            theChildNode->theProbs[3]*=fastIndex[12];
+                        }
+                    }
+                    ((_CalcNode*)((BaseRef*)variablePtrs.lData)[nodeChild->parent->in_object])->cBase = -1;
+
+                }
+            }
+            theChildNode = (_CalcNode*)(((BaseRef*)flatTree.lData)[topLevelNodes.lData[nI]]);
+            _Parameter* nodeProbs = theChildNode->theProbs;
+            fastIndex = rootIChildrenCache+position*4*(topLevelNodes.lLength-1)+4*nI;
+            fastIndex[0] = nodeProbs[0];
+            fastIndex[1] = nodeProbs[1];
+            fastIndex[2] = nodeProbs[2];
+            fastIndex[3] = nodeProbs[3];
+        } else {
+            _Parameter* nodeProbs = ((_CalcNode*)(((BaseRef*)flatTree.lData)[topLevelNodes.lData[nI]]))->theProbs;
+            fastIndex = rootIChildrenCache+position*4*(topLevelNodes.lLength-1)+4*nI;
+            nodeProbs[0] = fastIndex[0];
+            nodeProbs[1] = fastIndex[1];
+            nodeProbs[2] = fastIndex[2];
+            nodeProbs[3] = fastIndex[3];
+            nodeChild = ((node <long>*)(flatNodes.lData[topLevelNodes.lData[nI]]))->parent;
+            ((_CalcNode*)((BaseRef*)variablePtrs.lData)[nodeChild->in_object])->cBase = -1;
+        }
+    }
+
+    for (nodeCount=topLevelNodes.lData[f-1]+1; nodeCount<flatTree.lLength; nodeCount++)
+        //for (nodeCount=startINode; nodeCount<flatTree.lLength; nodeCount++)
+    {
+        theChildNode = (_CalcNode*)(((BaseRef*)flatTree.lData)[nodeCount]);
+        if (theChildNode->cBase == -1) { // marked for update
+            nodeChild = ((node <long>*)(flatNodes.lData[nodeCount]));
+            theChildNode->theProbs[0]=LIKELIHOOD_SCALER;
+            theChildNode->theProbs[1]=LIKELIHOOD_SCALER;
+            theChildNode->theProbs[2]=LIKELIHOOD_SCALER;
+            theChildNode->theProbs[3]=LIKELIHOOD_SCALER;
+            theChildNode->cBase = 4;
+
+            for (long k=0; k <nodeChild->nodes.length; k++) {
+                travNode =
+                    ((_CalcNode*)((BaseRef*)variablePtrs.lData)[nodeChild->nodes.data[k]->in_object]);
+                fastIndex = travNode->compExp->theData;
+                if (travNode->lastState<0) {
+                    _Parameter a = *(travNode->theProbs),
+                               b = travNode->theProbs[1],
+                               c = travNode->theProbs[2],
+                               d = travNode->theProbs[3];
+
+                    _Parameter tmp = a * *(fastIndex++);
+                    tmp +=b* *(fastIndex++);
+                    tmp +=c* *(fastIndex++);
+                    theChildNode->theProbs[0]*=tmp+d* *(fastIndex++);
+
+                    tmp = a * *(fastIndex++);
+                    tmp +=b* *(fastIndex++);
+                    tmp +=c* *(fastIndex++);
+                    theChildNode->theProbs[1]*=tmp+d* *(fastIndex++);
+
+                    tmp = a * *(fastIndex++);
+                    tmp +=b* *(fastIndex++);
+                    tmp +=c* *(fastIndex++);
+                    theChildNode->theProbs[2]*=tmp+d* *(fastIndex++);
+
+                    tmp = a * *(fastIndex++);
+                    tmp +=b* *(fastIndex++);
+                    tmp +=c* *(fastIndex++);
+                    theChildNode->theProbs[3]*=tmp+d* *(fastIndex++);
+                } else {
+                    fastIndex+=travNode->lastState;
+                    theChildNode->theProbs[0]*=*fastIndex;
+                    theChildNode->theProbs[1]*=fastIndex[4];
+                    theChildNode->theProbs[2]*=fastIndex[8];
+                    theChildNode->theProbs[3]*=fastIndex[12];
+                }
+            }
+            nodeChild = nodeChild->parent;
+            if (nodeChild) {
+                ((_CalcNode*)((BaseRef*)variablePtrs.lData)[nodeChild->in_object])->cBase = -1;
+            }
+        }
+    }
+
+    theChildNode->cBase = 4;
+
+    _Parameter  result = theProbs[0]*theChildNode->theProbs[0]+
+                         theProbs[1]*theChildNode->theProbs[1]+
+                         theProbs[2]*theChildNode->theProbs[2]+
+                         theProbs[3]*theChildNode->theProbs[3];
+
+    if (result<=0.0) {
+        return ALMOST_ZERO;
+    }
+
+    return result;
+}
+
+//_______________________________________________________________________________________________
+//_______________________________________________________________________________________________
+
+#if USE_SCALING_TO_FIX_UNDERFLOW
+_Parameter   _TheTree::ThreadReleafTreeChar4
+(_DataSetFilter* dsf, long index, long lastIndex, long startLeaf, long endLeaf, long position, long offset, long fixAttempt, _Parameter localScalingFactor)
+#else
+_Parameter   _TheTree::ThreadReleafTreeChar4
+(_DataSetFilter* dsf, long index, long lastIndex, long startLeaf, long endLeaf, long position, long offset)
+#endif
+{
+
+    _CalcNode               * travNode,
+                            * theChildNode;
+
+    long                    nodeCount,
+                            f = topLevelNodes.lLength-1,
+                            * ns  = nodeStates+(flatLeaves.lLength+flatNodes.lLength)*offset;
+
+    _Parameter              * fastIndex,
+                            * mlc = marginalLikelihoodCache+cBase*(flatLeaves.lLength+flatNodes.lLength)*offset;
+
+    node<long>              * nodeChild;
+
+    char                    *pastState ,
+                            *thisState      =   dsf->GetColumn(index),
+                             *nm             =   nodeMarkers+(flatNodes.lLength)*offset;
+
+    if (lastIndex>=0) {
+        pastState = dsf->GetColumn(lastIndex);
+    }
+
+#if USE_SCALING_TO_FIX_UNDERFLOW
+    if (lastIndex>=0 && scalingForUnderflow->theData[index] != scalingForUnderflow->theData[lastIndex]) {
+        lastIndex = -1;
+        startLeaf = 0;
+        endLeaf   = flatLeaves.lLength-1;
+    }
+    _Parameter scalingFactor = scalingForUnderflow->theData[index];
+    bool            overflowFlag = fixAttempt<0;
+    if (overflowFlag) {
+        fixAttempt = -fixAttempt;
+    }
+#endif
+
+    long mm         = topLevelNodes.lData[f],
+         startINode = leftiNodes.lData[startLeaf],
+         fromL        = startLeaf,
+         toL        = 0;
+
+    // mod SLKP 20070209 to skip over constant parts of the tree
+
+    for (long tlc = 0; tlc < topLevelNodes.lLength; tlc++,mm>>=1) {
+        if (mm&1) {
+            toL = topLevelRightL.lData[tlc];
+        } else {
+            toL = topLevelLeftL.lData[tlc]-1;
+        }
+
+        if (fromL<=toL) {
+            long l1 = MAX(startLeaf,fromL),
+                 l2 = MIN(endLeaf,  toL);
+
+            for (nodeCount = l1; nodeCount<=l2; nodeCount++) {
+                long f2 = dsf->theNodeMap.lData[nodeCount];
+                if ( lastIndex==-1 || thisState[f2]!=pastState[f2]
+#if USE_SCALING_TO_FIX_UNDERFLOW
+                        || scalingFactor != scalingForUnderflow->theData[lastIndex]
+#endif
+                   ) {
+                    travNode     = (_CalcNode*)(((BaseRef*)flatCLeaves.lData)[nodeCount]);
+                    long* cCache = dsf->conversionCache.lData+(thisState[f2]-40)*5;
+
+                    _Parameter* fi = mlc+nodeCount*4;
+
+                    fi[0] = cCache[0];
+                    fi[1] = cCache[1];
+                    fi[2] = cCache[2];
+                    fi[3] = cCache[3];
+
+#if USE_SCALING_TO_FIX_UNDERFLOW
+                    if (scalingFactor != 1.0) {
+                        fi[0] *= scalingFactor;
+                        fi[1] *= scalingFactor;
+                        fi[2] *= scalingFactor;
+                        fi[3] *= scalingFactor;
+                    }
+#endif
+
+                    ns[nodeCount] = cCache[4];
+
+                    theChildNode = ((_CalcNode*)((BaseRef*)variablePtrs.lData)
+                                    [((node <long>*)(flatLeaves.lData[nodeCount]))->parent->in_object]);
+
+                    f2  = theChildNode->nodeIndex-flatLeaves.lLength;
+
+                    if (nm[f2]>=0) {
+                        nm[f2] = -1;
+                    }
+                }
+            }
+        }
+        fromL = topLevelRightL.lData[tlc]+1;
+        if (fromL > endLeaf) {
+            break;
+        }
+    }
+
+    // end 20070209 mod
+
+    mm  = topLevelNodes.lData[f];
+
+    for (long nI = 0; nI < f; nI++,mm>>=1) {
+        if (mm&1)
+            // marked for recalculation
+        {
+            long startAt = 0;
+
+            if (nI) {
+                startAt = topLevelNodes.lData[nI-1]+1;
+            }
+
+            if (startAt<startINode) {
+                startAt = startINode;
+            }
+
+            for (nodeCount=startAt; nodeCount<=topLevelNodes.lData[nI]; nodeCount++) {
+                if (nm[nodeCount] == -1) { // marked for update
+                    nodeChild = ((node <long>*)(flatNodes.lData[nodeCount]));
+
+                    _Parameter * theseProbs = mlc + 4*(nodeCount+flatLeaves.lLength);
+                    theseProbs[0]=LIKELIHOOD_SCALER_INT;
+                    theseProbs[1]=LIKELIHOOD_SCALER_INT;
+                    theseProbs[2]=LIKELIHOOD_SCALER_INT;
+                    theseProbs[3]=LIKELIHOOD_SCALER_INT;
+                    nm[nodeCount] = 0;
+
+                    for (long k=0; k <nodeChild->nodes.length; k++) {
+                        travNode =
+                            ((_CalcNode*)((BaseRef*)variablePtrs.lData)[nodeChild->nodes.data[k]->in_object]);
+
+                        _Parameter * childProbs = mlc + 4*(travNode->nodeIndex);
+                        long         nState = ns[travNode->nodeIndex];
+
+                        fastIndex = travNode->compExp->theData;
+                        if (nState<0) {
+                            //marginalLFEvalsAmb ++;
+
+                            _Parameter a = *(childProbs),
+                                       b = childProbs[1],
+                                       c = childProbs[2],
+                                       d = childProbs[3];
+
+                            _Parameter tmp  =    a*  fastIndex[0]
+                                                 +b*  fastIndex[1]
+                                                 +c*  fastIndex[2]
+                                                 +d*  fastIndex[3],
+                                                 tmp2 =  a*  fastIndex[4]
+                                                         +b*  fastIndex[5]
+                                                         +c*  fastIndex[6]
+                                                         +d*  fastIndex[7],
+                                                         tmp3 =     a*  fastIndex[8]
+                                                                    +b*  fastIndex[9]
+                                                                    +c*  fastIndex[10]
+                                                                    +d*  fastIndex[11],
+                                                                    tmp4 =    a*  fastIndex[12]
+                                                                            +b*  fastIndex[13]
+                                                                            +c*  fastIndex[14]
+                                                                            +d*  fastIndex[15];
+
+                            theseProbs[0] *= tmp;
+                            theseProbs[1] *= tmp2;
+                            theseProbs[2] *= tmp3;
+                            theseProbs[3] *= tmp4;
+
+                        } else {
+                            //marginalLFEvals ++;
+                            fastIndex     += nState;
+#if USE_SCALING_TO_FIX_UNDERFLOW
+                            theseProbs[0] *= fastIndex[0] * scalingFactor;
+                            theseProbs[1] *= fastIndex[4] * scalingFactor;
+                            theseProbs[2] *= fastIndex[8] * scalingFactor;
+                            theseProbs[3] *= fastIndex[12]* scalingFactor;
+
+#else
+                            theseProbs[0] *= fastIndex[0];
+                            theseProbs[1] *= fastIndex[4];
+                            theseProbs[2] *= fastIndex[8];
+                            theseProbs[3] *= fastIndex[12];
+#endif
+                        }
+                    }
+                    nm[((_CalcNode*)((BaseRef*)variablePtrs.lData)
+                        [nodeChild->parent->in_object])->nodeIndex-flatLeaves.lLength] = -1;
+
+#if USE_SCALING_TO_FIX_UNDERFLOW
+                    if (theseProbs[0] == 0.0 && theseProbs[1] == 0.0 && theseProbs[2] == 0.0 && theseProbs[3] == 0.0) {
+                        return doChar4Scaling (dsf, index,  position, offset,fixAttempt,localScalingFactor,overflowFlag,false);
+                    } else if (theseProbs[0] >= 1e500 || theseProbs[1] >= 1e500 || theseProbs[2] >= 1e500 || theseProbs[3] >= 1e500 ) {
+                        return doChar4Scaling (dsf, index,  position, offset,fixAttempt,localScalingFactor,overflowFlag,true);
+                    }
+#endif
+
+                }
+            }
+
+            theChildNode = (_CalcNode*)(((BaseRef*)flatTree.lData)[topLevelNodes.lData[nI]]);
+
+            _Parameter* nodeProbs =  mlc+4*theChildNode->nodeIndex;
+
+            fastIndex = rootIChildrenCache+position*4*(topLevelNodes.lLength-1)+4*nI;
+
+            fastIndex[0] = nodeProbs[0];
+            fastIndex[1] = nodeProbs[1];
+            fastIndex[2] = nodeProbs[2];
+            fastIndex[3] = nodeProbs[3];
+        } else {
+            _Parameter* nodeProbs = mlc+
+                                    4*((_CalcNode*)(((BaseRef*)flatTree.lData)[topLevelNodes.lData[nI]]))->nodeIndex;
+            fastIndex = rootIChildrenCache+position*4*(topLevelNodes.lLength-1)+4*nI;
+            nodeProbs[0] = fastIndex[0];
+            nodeProbs[1] = fastIndex[1];
+            nodeProbs[2] = fastIndex[2];
+            nodeProbs[3] = fastIndex[3];
+            nodeChild = ((node <long>*)(flatNodes.lData[topLevelNodes.lData[nI]]))->parent;
+            nm[((_CalcNode*)((BaseRef*)variablePtrs.lData)
+                [nodeChild->in_object])->nodeIndex-flatLeaves.lLength] = -1;
+        }
+    }
+
+    for (nodeCount=topLevelNodes.lData[f-1]+1; nodeCount<flatTree.lLength; nodeCount++) {
+        if (nm[nodeCount] == -1) { // marked for update
+            nodeChild = ((node <long>*)(flatNodes.lData[nodeCount]));
+
+            _Parameter * theseProbs = mlc + 4*(nodeCount+flatLeaves.lLength);
+            theseProbs[0]=LIKELIHOOD_SCALER;
+            theseProbs[1]=LIKELIHOOD_SCALER;
+            theseProbs[2]=LIKELIHOOD_SCALER;
+            theseProbs[3]=LIKELIHOOD_SCALER;
+            nm[nodeCount] = 0;
+
+            for (long k=0; k <nodeChild->nodes.length; k++) {
+                travNode =
+                    ((_CalcNode*)((BaseRef*)variablePtrs.lData)[nodeChild->nodes.data[k]->in_object]);
+
+                _Parameter * childProbs = mlc + 4*(travNode->nodeIndex);
+                long         nState = ns[travNode->nodeIndex];
+
+                fastIndex = travNode->compExp->theData;
+                if (nState<0) {
+                    //marginalLFEvalsAmb++;
+
+                    _Parameter a = *(childProbs),
+                               b = childProbs[1],
+                               c = childProbs[2],
+                               d = childProbs[3];
+
+                    _Parameter tmp  =    a*  fastIndex[0]
+                                         +b*  fastIndex[1]
+                                         +c*  fastIndex[2]
+                                         +d*  fastIndex[3],
+                                         tmp2 =  a*  fastIndex[4]
+                                                 +b*  fastIndex[5]
+                                                 +c*  fastIndex[6]
+                                                 +d*  fastIndex[7],
+                                                 tmp3 =     a*  fastIndex[8]
+                                                            +b*  fastIndex[9]
+                                                            +c*  fastIndex[10]
+                                                            +d*  fastIndex[11],
+                                                            tmp4 =    a*  fastIndex[12]
+                                                                    +b*  fastIndex[13]
+                                                                    +c*  fastIndex[14]
+                                                                    +d*  fastIndex[15];
+
+                    theseProbs[0] *= tmp;
+                    theseProbs[1] *= tmp2;
+                    theseProbs[2] *= tmp3;
+                    theseProbs[3] *= tmp4;
+                } else {
+                    //marginalLFEvals++;
+
+                    fastIndex+=nState;
+#if USE_SCALING_TO_FIX_UNDERFLOW
+                    theseProbs[0] *= fastIndex[0] * scalingFactor;
+                    theseProbs[1] *= fastIndex[4] * scalingFactor;
+                    theseProbs[2] *= fastIndex[8] * scalingFactor;
+                    theseProbs[3] *= fastIndex[12]* scalingFactor;
+
+#else
+                    theseProbs[0] *= fastIndex[0];
+                    theseProbs[1] *= fastIndex[4];
+                    theseProbs[2] *= fastIndex[8];
+                    theseProbs[3] *= fastIndex[12];
+#endif
+                }
+            }
+
+#if USE_SCALING_TO_FIX_UNDERFLOW
+            if (theseProbs[0] == 0.0 && theseProbs[1] == 0.0 && theseProbs[2] == 0.0 && theseProbs[3] == 0.0) {
+                return doChar4Scaling (dsf, index,  position, offset,fixAttempt,localScalingFactor,overflowFlag,false);
+            } else if (theseProbs[0] >= 1e500 || theseProbs[1] >= 1e500 || theseProbs[2] >= 1e500 || theseProbs[3] >= 1e500 ) {
+                return doChar4Scaling (dsf, index , position, offset,fixAttempt,localScalingFactor,overflowFlag,true);
+            }
+#endif
+
+            nodeChild = nodeChild->parent;
+            if (nodeChild)
+                nm[((_CalcNode*)((BaseRef*)variablePtrs.lData)
+                    [nodeChild->in_object])->nodeIndex-flatLeaves.lLength] = -1;
+        }
+    }
+
+    //theChildNode->cBase = 4;
+
+    fastIndex = mlc+4*(flatLeaves.lLength+flatNodes.lLength-1);
+
+    _Parameter  result = theProbs[0]*fastIndex[0]+
+                         theProbs[1]*fastIndex[1]+
+                         theProbs[2]*fastIndex[2]+
+                         theProbs[3]*fastIndex[3];
+
+#if USE_SCALING_TO_FIX_UNDERFLOW
+    if (result <= 0.0) { // underflow
+        return doChar4Scaling (dsf, index, position, offset,fixAttempt,localScalingFactor,overflowFlag,false);
+    } else if (result >= 1e500) { // overflow
+        return doChar4Scaling (dsf, index, position, offset,fixAttempt,localScalingFactor,overflowFlag,true);
+    }
+
+#else
+    if (result<=0.0) {
+        return ALMOST_ZERO;
+    }
+#endif
+
+    return result;
+}
+//_______________________________________________________________________________________________
+
+#if USE_SCALING_TO_FIX_UNDERFLOW
+_Parameter   _TheTree::ReleafTreeChar4 (_DataSetFilter* dsf, long index, long lastIndex, long startLeaf, long endLeaf, long fixAttempt, _Parameter localScalingFactor)
+#else
+_Parameter   _TheTree::ReleafTreeChar4 (_DataSetFilter* dsf, long index, long lastIndex, long startLeaf, long endLeaf)
+#endif
+
+// set leaf value and re-prune w/o reexping
+// for subsequent entries into a datafilter
+{
+    _CalcNode* travNode,
+               * theChildNode ;
+
+    long nodeCount,f;
+
+    _Parameter* fastIndex;
+    node<long>* nodeChild;
+
+    char *pastState = nil,
+          *thisState = dsf->GetColumn(index);
+
+    if (lastIndex>=0) {
+        pastState = dsf->GetColumn(lastIndex);
+    }
+
+#if USE_SCALING_TO_FIX_UNDERFLOW
+    if (lastIndex>=0 && scalingForUnderflow->theData[index] != scalingForUnderflow->theData[lastIndex]) {
+        lastIndex = -1;
+        startLeaf = 0;
+        endLeaf   = flatLeaves.lLength-1;
+    }
+    _Parameter scalingFactor = scalingForUnderflow->theData[index];
+    bool            overflowFlag = fixAttempt<0;
+    if (overflowFlag) {
+        fixAttempt = -fixAttempt;
+    }
+#endif
+
+    for (nodeCount = startLeaf; nodeCount<=endLeaf; nodeCount++) {
+        f = dsf->theNodeMap.lData[nodeCount];
+        if ( lastIndex < 0 || thisState[f]!=pastState[f]
+#if USE_SCALING_TO_FIX_UNDERFLOW
+                || scalingFactor != scalingForUnderflow->theData[lastIndex]
+#endif
+           ) {
+            travNode     = (_CalcNode*)(((BaseRef*)flatCLeaves.lData)[nodeCount]);
+            long* cCache = dsf->conversionCache.lData+(thisState[f]-40)*5;
+
+#if USE_SCALING_TO_FIX_UNDERFLOW
+            travNode->theProbs[0] = *(cCache++)*scalingFactor;
+            travNode->theProbs[1] = *(cCache++)*scalingFactor;
+            travNode->theProbs[2] = *(cCache++)*scalingFactor;
+            travNode->theProbs[3] = *(cCache++)*scalingFactor;
+
+#else
+            travNode->theProbs[0] = *(cCache++);
+            travNode->theProbs[1] = *(cCache++);
+            travNode->theProbs[2] = *(cCache++);
+            travNode->theProbs[3] = *(cCache++);
+#endif
+
+            travNode->lastState = *cCache;
+
+            theChildNode = ((_CalcNode*)((BaseRef*)variablePtrs.lData)
+                            [((node <long>*)(flatLeaves.lData[nodeCount]))->parent->in_object]);
+            if (theChildNode->cBase>0) {
+                theChildNode->cBase = -1;
+            }
+        }
+    }
+
+    for (nodeCount= leftiNodes.lData[startLeaf]; nodeCount<flatTree.lLength; nodeCount++) {
+        theChildNode = (_CalcNode*)(((BaseRef*)flatTree.lData)[nodeCount]);
+        if (theChildNode->cBase == -1) { // marked for update
+            nodeChild = ((node <long>*)(flatNodes.lData[nodeCount]));
+            theChildNode->theProbs[0]=LIKELIHOOD_SCALER;
+            theChildNode->theProbs[1]=LIKELIHOOD_SCALER;
+            theChildNode->theProbs[2]=LIKELIHOOD_SCALER;
+            theChildNode->theProbs[3]=LIKELIHOOD_SCALER;
+            theChildNode->cBase = 4;
+
+            for (long k=0; k <nodeChild->nodes.length; k++) {
+                travNode =
+                    ((_CalcNode*)((BaseRef*)variablePtrs.lData)[nodeChild->nodes.data[k]->in_object]);
+                fastIndex = travNode->compExp->theData;
+                if (travNode->lastState<0) {
+                    _Parameter a = *(travNode->theProbs),
+                               b = travNode->theProbs[1],
+                               c = travNode->theProbs[2],
+                               d = travNode->theProbs[3];
+
+                    _Parameter tmp = a * *(fastIndex++);
+                    tmp +=b* *(fastIndex++);
+                    tmp +=c* *(fastIndex++);
+                    theChildNode->theProbs[0]*=tmp+d* *(fastIndex++);
+
+                    tmp = a * *(fastIndex++);
+                    tmp +=b* *(fastIndex++);
+                    tmp +=c* *(fastIndex++);
+                    theChildNode->theProbs[1]*=tmp+d* *(fastIndex++);
+
+                    tmp = a * *(fastIndex++);
+                    tmp +=b* *(fastIndex++);
+                    tmp +=c* *(fastIndex++);
+                    theChildNode->theProbs[2]*=tmp+d* *(fastIndex++);
+
+                    tmp = a * *(fastIndex++);
+                    tmp +=b* *(fastIndex++);
+                    tmp +=c* *(fastIndex++);
+                    theChildNode->theProbs[3]*=tmp+d* *(fastIndex++);
+                } else {
+                    fastIndex+=travNode->lastState;
+#if USE_SCALING_TO_FIX_UNDERFLOW
+                    theChildNode->theProbs[0]*=*fastIndex   * scalingFactor;
+                    theChildNode->theProbs[1]*=fastIndex[4] * scalingFactor;
+                    theChildNode->theProbs[2]*=fastIndex[8] * scalingFactor;
+                    theChildNode->theProbs[3]*=fastIndex[12]* scalingFactor;
+#else
+                    theChildNode->theProbs[0]*=*fastIndex;
+                    theChildNode->theProbs[1]*=fastIndex[4];
+                    theChildNode->theProbs[2]*=fastIndex[8];
+                    theChildNode->theProbs[3]*=fastIndex[12];
+#endif
+                }
+            }
+            travNode->cBase = 4;
+            nodeChild = nodeChild->parent;
+            if (nodeChild) {
+                ((_CalcNode*)((BaseRef*)variablePtrs.lData)[nodeChild->in_object])->cBase = -1;
+            }
+
+#if USE_SCALING_TO_FIX_UNDERFLOW
+            if (theChildNode->theProbs[0] == 0.0 && theChildNode->theProbs[1] == 0.0 && theChildNode->theProbs[2] == 0.0 && theChildNode->theProbs[3] == 0.0) {
+                return doChar4Scaling_nc (dsf, index, fixAttempt,localScalingFactor,overflowFlag,false);
+            } else if (theChildNode->theProbs[0] == HUGE_VAL || theChildNode->theProbs[1] == HUGE_VAL || theChildNode->theProbs[2] == HUGE_VAL || theChildNode->theProbs[3] == HUGE_VAL ) {
+                return doChar4Scaling_nc (dsf, index,fixAttempt,localScalingFactor,overflowFlag,true);
+            }
+#endif
+
+
+        }
+    }
+
+    theChildNode->cBase = 4;
+    _Parameter  result = theProbs[0]*theChildNode->theProbs[0]+
+                         theProbs[1]*theChildNode->theProbs[1]+
+                         theProbs[2]*theChildNode->theProbs[2]+
+                         theProbs[3]*theChildNode->theProbs[3];
+
+
+#if USE_SCALING_TO_FIX_UNDERFLOW
+    if (result == 0.0) {
+        return doChar4Scaling_nc (dsf, index, fixAttempt,localScalingFactor,overflowFlag,false);
+    } else if (result == HUGE_VAL) {
+        return doChar4Scaling_nc (dsf, index,fixAttempt,localScalingFactor,overflowFlag,true);
+    }
+#else
+    if (result<=0.0) {
+        return ALMOST_ZERO;
+    }
+#endif
+    return result;
+}
+
+
+
+//_______________________________________________________________________________________________
+
+_Parameter   _TheTree::ReleafTreeChar4Degenerate (_DataSetFilter* dsf, long index)
+// set leaf value and re-prune w/o reexping
+// for subsequent entries into a datafilter
+{
+
+    _CalcNode* travNode = ((_CalcNode*)((BaseRef*)variablePtrs.lData)[theRoot->in_object]),
+               * theChildNode = ((_CalcNode*)((BaseRef*)variablePtrs.lData)[theRoot->nodes.data[0]->in_object]);
+
+    char     *thisState = dsf->GetColumn(index);
+    long     * rootState = dsf->conversionCache.lData+(thisState[dsf->theNodeMap.lData[0]]-40)*5,
+               * tipState = dsf->conversionCache.lData+(thisState[dsf->theNodeMap.lData[1]]-40)*5,
+                 nodeCount = rootState[4],
+                 f = tipState[4];
+
+    _Matrix   * theTP = theChildNode->GetCompExp();
+
+    _Parameter reslt,
+               tmp,
+               * fastIdx = theTP->fastIndex(),
+                 * nodeProbs;
+
+    if ((nodeCount>=0)&&(f>=0)) { // 1-1
+        reslt =  fastIdx[nodeCount*4+f]*theProbs[nodeCount];
+    } else if (nodeCount>=0) { // 1-many
+        fastIdx += nodeCount*cBase;
+
+        tmp=*fastIdx* *tipState;
+        tmp+=fastIdx[1]*tipState[1];
+        tmp+=fastIdx[2]*tipState[2];
+        tmp+=fastIdx[3]*tipState[3];
+
+        reslt = theProbs[nodeCount]*tmp;
+    } else if (f>=0) { // many to 1
+        fastIdx += f;
+        nodeProbs  = travNode->theProbs;
+        *nodeProbs = *fastIdx** rootState;
+        nodeProbs[1] = fastIdx[4]* rootState[1];
+        nodeProbs[2] = fastIdx[8]* rootState[2];
+        nodeProbs[3] = fastIdx[12]* rootState[3];
+
+        reslt = *theProbs ** nodeProbs+
+                theProbs[1]*nodeProbs[1]+
+                theProbs[2]*nodeProbs[2]+
+                theProbs[3]*nodeProbs[3];
+
+    } else { // many to many
+        nodeProbs  = travNode->theProbs;
+        nodeProbs[0] = (fastIdx[0]*tipState[0]+
+                        fastIdx[1]*tipState[1]+
+                        fastIdx[2]*tipState[2]+
+                        fastIdx[3]*tipState[3])*rootState[0];
+        nodeProbs[1] = (fastIdx[4]*tipState[0]+
+                        fastIdx[5]*tipState[1]+
+                        fastIdx[6]*tipState[2]+
+                        fastIdx[7]*tipState[3])*rootState[1];
+        nodeProbs[2] = (fastIdx[8]*tipState[0]+
+                        fastIdx[9]*tipState[1]+
+                        fastIdx[10]*tipState[2]+
+                        fastIdx[11]*tipState[3])*rootState[2];
+        nodeProbs[3] = (fastIdx[12]*tipState[0]+
+                        fastIdx[13]*tipState[1]+
+                        fastIdx[14]*tipState[2]+
+                        fastIdx[15]*tipState[3])*rootState[3];
+
+        reslt = *theProbs ** nodeProbs+
+                theProbs[1]*nodeProbs[1]+
+                theProbs[2]*nodeProbs[2]+
+                theProbs[3]*nodeProbs[3];
+    }
+    if (reslt<=0.0) {
+        reslt = ALMOST_ZERO;
+    }
+    //printf ("%d\t%g\n", index, reslt);
+    return reslt;
+}
+
+//_______________________________________________________________________________________________
+
+_Parameter   _TheTree::ThreadReleafTreeCharCache (_DataSetFilter* dsf, long index, long lastIndex, long startLeaf, long endLeaf,
+        long position,long offset)
+// set leaf value and re-prune w/o reexping
+// for subsequent entries into a datafilter
+{
+
+
+    _CalcNode *travNode,
+              *theChildNode;
+
+    long       nodeCount,
+               f,
+               *ns  = nodeStates+(flatLeaves.lLength+flatNodes.lLength)*offset;
+
+    _Parameter*fastIndex,
+               *stopper,
+               *mlc = marginalLikelihoodCache+cBase*(flatLeaves.lLength+flatNodes.lLength)*offset;
+
+    node<long>* nodeChild;
+
+
+    char *pastState = nil,
+          *thisState = dsf->GetColumn(index),
+           *nm  = nodeMarkers+flatNodes.lLength*offset;
+
+    if (lastIndex>=0) {
+        pastState = dsf->GetColumn(lastIndex);
+    }
+
+    for (nodeCount = startLeaf; nodeCount<=endLeaf; nodeCount++) {
+        f = dsf->theNodeMap.lData[nodeCount];
+        if ((lastIndex==-1)||(thisState[f]!=pastState[f])) {
+            ns[nodeCount] = dsf->LookupConversion (thisState[f], mlc+cBase*nodeCount);
+            theChildNode = ((_CalcNode*)((BaseRef*)variablePtrs.lData)
+                            [((node <long>*)(flatLeaves.lData[nodeCount]))->parent->in_object]);
+            nm[theChildNode->nodeIndex-flatLeaves.lLength] = -1;
+        }
+    }
+
+
+    long lm1 = topLevelNodes.lLength-1,
+         mm = topLevelNodes.lData[lm1],
+         startINode = leftiNodes.lData[startLeaf];
+
+    for (long nI = 0; nI < lm1; nI++,mm>>=1) {
+        if (mm&1)
+            // marked for recalculation
+        {
+            long startAt = 0;
+
+            if (nI) {
+                startAt = topLevelNodes.lData[nI-1]+1;
+            }
+
+            if (startAt<startINode) {
+                startAt = startINode;
+            }
+
+            for (nodeCount=startAt; nodeCount<=topLevelNodes.lData[nI]; nodeCount++) {
+                if (nm[nodeCount]==-1) { // marked for update
+                    _Parameter * theseProbs = fastIndex = mlc+cBase*(nodeCount+flatLeaves.lLength);
+                    stopper =   fastIndex+cBase;
+
+                    for (; fastIndex!=stopper; *(fastIndex++)=1.) ;
+
+                    nodeChild = ((node <long>*)(flatNodes.lData[nodeCount]));
+
+                    nm[nodeCount] = 0;
+
+                    for (long k=0; k <nodeChild->nodes.length; k++) {
+                        travNode =
+                            ((_CalcNode*)((BaseRef*)variablePtrs.lData)[nodeChild->nodes.data[k]->in_object]);
+
+                        _Parameter* cProbs = mlc+cBase*travNode->nodeIndex,
+                                    * stopper2 = cProbs+cBase;
+                        fastIndex = travNode->compExp->theData;
+
+                        f = ns[travNode->nodeIndex];
+                        if (f<0) {
+                            for (long i=0; i<cBase; i++) {
+                                _Parameter tmp = *(cProbs) * *fastIndex;
+                                fastIndex++;
+                                stopper = cProbs+1;
+                                for (; stopper!=stopper2; fastIndex++, stopper++) {
+                                    tmp += *stopper * (*fastIndex);
+                                }
+                                theseProbs[i]*=tmp;
+                            }
+                        } else {
+                            fastIndex+=f;
+                            _Parameter tmp = cProbs[f];
+                            for (long i=0; i<cBase; i++,fastIndex+=cBase) {
+                                theseProbs[i]*=tmp* (*fastIndex);
+                            }
+                        }
+                    }
+                    nodeChild = nodeChild->parent;
+                    if (nodeChild) {
+                        nm[((_CalcNode*)((BaseRef*)variablePtrs.lData)[nodeChild->in_object])->nodeIndex-flatLeaves.lLength] = -1;
+                    }
+                }
+            }
+
+            theChildNode = (_CalcNode*)(((BaseRef*)flatTree.lData)[topLevelNodes.lData[nI]]);
+            _Parameter* nodeProbs = mlc+cBase*theChildNode->nodeIndex;
+            fastIndex = rootIChildrenCache+position*cBase*(topLevelNodes.lLength-1)+cBase*nI;
+            for (long i=0; i<cBase; i++) {
+                fastIndex[i] = nodeProbs[i];
+            }
+        } else {
+            _Parameter* nodeProbs = mlc+cBase*((_CalcNode*)(((BaseRef*)flatTree.lData)[topLevelNodes.lData[nI]]))->nodeIndex;
+            fastIndex = rootIChildrenCache+position*cBase*(topLevelNodes.lLength-1)+cBase*nI;
+            for (long i=0; i<cBase; i++) {
+                nodeProbs[i] =fastIndex[i];
+            }
+            nodeChild = ((node <long>*)(flatNodes.lData[topLevelNodes.lData[nI]]))->parent;
+            nm[((_CalcNode*)((BaseRef*)variablePtrs.lData)[nodeChild->in_object])->nodeIndex-flatLeaves.lLength] = -1;
+        }
+    }
+
+    for (nodeCount=topLevelNodes.lData[lm1-1]+1; nodeCount<flatTree.lLength; nodeCount++) {
+        if (nm[nodeCount]==-1) { // marked for update
+            _Parameter * theseProbs = fastIndex = mlc+cBase*(nodeCount+flatLeaves.lLength);
+
+            for (long zeroPop = 0; zeroPop < cBase; zeroPop++) {
+                fastIndex[zeroPop] = 1.;
+            }
+
+            nodeChild = ((node <long>*)(flatNodes.lData[nodeCount]));
+
+            nm[nodeCount] = 0;
+
+            for (long k=0; k <nodeChild->nodes.length; k++) {
+                travNode =
+                    ((_CalcNode*)((BaseRef*)variablePtrs.lData)[nodeChild->nodes.data[k]->in_object]);
+
+                _Parameter* cProbs = mlc+cBase*travNode->nodeIndex,
+                            * stopper2 = cProbs+cBase;
+
+                fastIndex = travNode->compExp->theData;
+
+                f = ns[travNode->nodeIndex];
+                if (f<0) {
+                    for (long i=0; i<cBase; i++) {
+                        _Parameter tmp = *(cProbs) * *fastIndex;
+                        fastIndex++;
+                        stopper = cProbs+1;
+                        for (; stopper!=stopper2; fastIndex++, stopper++) {
+                            tmp += *stopper * (*fastIndex);
+                        }
+                        theseProbs[i]*=tmp;
+                    }
+                    /*if (rem==1)
+                    {
+                        for (long i=0; i<cBase; i++)
+                        {
+                            _Parameter tmp1  = 0.0,
+                                       tmp2  = 0.0,
+                                       tmp3  = 0.0,
+                                       tmp4  = 0.0;
+
+                            for (long k=0; k<upTo; k+=4)
+                            {
+                                tmp1 += cProbs[k]  *fastIndex[k];
+                                tmp2 += cProbs[k+1]*fastIndex[k+1];
+                                tmp3 += cProbs[k+2]*fastIndex[k+2];
+                                tmp4 += cProbs[k+3]*fastIndex[k+3];
+                            }
+
+                            theseProbs[i] *= tmp1 + cProbs[upTo]*fastIndex[upTo] + tmp2+tmp3+tmp4;
+                            fastIndex += cBase;
+                        }
+                    }
+                    else
+                        if (rem==2)
+                        {
+                            for (long i=0; i<cBase; i++)
+                            {
+                                _Parameter tmp1  = 0.0,
+                                           tmp2  = 0.0,
+                                           tmp3  = 0.0,
+                                           tmp4  = 0.0;
+
+                                for (long k=0; k<upTo; k+=4)
+                                {
+                                    tmp1 += cProbs[k]  *fastIndex[k];
+                                    tmp2 += cProbs[k+1]*fastIndex[k+1];
+                                    tmp3 += cProbs[k+2]*fastIndex[k+2];
+                                    tmp4 += cProbs[k+3]*fastIndex[k+3];
+                                }
+
+                                theseProbs[i] *= tmp1+tmp2+tmp3+tmp4+
+                                                 + cProbs[upTo]*fastIndex[upTo] +
+                                                 + cProbs[upTo+1]*fastIndex[upTo+1];
+                                fastIndex += cBase;
+                            }
+                        }
+                        else
+                            if (rem==3)
+                                for (long i=0; i<cBase; i++)
+                                {
+                                    _Parameter tmp1  = 0.0,
+                                               tmp2  = 0.0,
+                                               tmp3  = 0.0,
+                                               tmp4  = 0.0;
+
+                                    for (long k=0; k<upTo; k+=4)
+                                    {
+                                        tmp1 += cProbs[k]  *fastIndex[k];
+                                        tmp2 += cProbs[k+1]*fastIndex[k+1];
+                                        tmp3 += cProbs[k+2]*fastIndex[k+2];
+                                        tmp4 += cProbs[k+3]*fastIndex[k+3];
+                                    }
+
+                                    theseProbs[i] *= tmp1+tmp2+tmp3+tmp4+
+                                                     + cProbs[upTo]*fastIndex[upTo] +
+                                                     + cProbs[upTo+1]*fastIndex[upTo+1];
+                                                     + cProbs[upTo+2]*fastIndex[upTo+2];
+
+                                    fastIndex += cBase;
+                                }
+                            else
+                                for (long i=0; i<cBase; i++)
+                                {
+                                    _Parameter tmp1  = 0.0,
+                                               tmp2  = 0.0,
+                                               tmp3  = 0.0,
+                                               tmp4  = 0.0;
+
+                                    for (long k=0; k<upTo; k+=4)
+                                    {
+                                        tmp1 += cProbs[k]  *fastIndex[k];
+                                        tmp2 += cProbs[k+1]*fastIndex[k+1];
+                                        tmp3 += cProbs[k+2]*fastIndex[k+2];
+                                        tmp4 += cProbs[k+3]*fastIndex[k+3];
+                                    }
+
+                                    theseProbs[i] *= tmp1+tmp2+tmp3+tmp4;
+                                    fastIndex     += cBase;
+                                }       */
+
+                } else {
+                    fastIndex+=f;
+                    _Parameter tmp = cProbs[f];
+                    for (long i=0; i<cBase; i++,fastIndex+=cBase) {
+                        theseProbs[i]*=tmp* (*fastIndex);
+                    }
+                }
+            }
+            nodeChild = nodeChild->parent;
+            if (nodeChild) {
+                nm[((_CalcNode*)((BaseRef*)variablePtrs.lData)[nodeChild->in_object])->nodeIndex-flatLeaves.lLength] = -1;
+            }
+        }
+    }
+
+    _Parameter result = 0.0;
+    fastIndex = mlc+cBase*(flatLeaves.lLength+flatTree.lLength-1);
+
+    for (long i=0; i<cBase; i++) {
+        result += theProbs[i] * fastIndex[i];
+    }
+
+    if (result<=0.0) {
+        return ALMOST_ZERO;
+    }
+    return result;
+}
+
+//_______________________________________________________________________________________________
+
+bool     _TheTree::IntPopulateLeaves (_DataSetFilter* dsf, long index, long)
+// assign proper values to leaf conditional probability vectors
+{
+    bool allGaps = true;
+
+    for (long nodeCount = 0; nodeCount<flatLeaves.lLength; nodeCount++)
+        //if (lastIndex<0 || !dsf->CompareTwoSites(lastIndex,index,nodeCount))
+    {
+        _CalcNode * travNode = (_CalcNode*)(((BaseRef*)flatCLeaves.lData)[nodeCount]);
+        allGaps &= ((travNode->lastState = dsf->Translate2Frequencies ((*dsf)(index,nodeCount), travNode->theProbs, true))<0);
+        if (allGaps) // check to see if all
+            for (long b = 0; b < cBase; b++)
+                if (travNode->theProbs[b] == 0.0) {
+                    allGaps = false;
+                    break;
+                }
+
+        _CalcNode * theChildNode = ((_CalcNode*)((BaseRef*)variablePtrs.lData)
+                                    [((node <long>*)(flatLeaves.lData[nodeCount]))->parent->in_object]);
+        theChildNode->cBase = -1;
+    }
+
+    return allGaps;
+}
+
+
+//_______________________________________________________________________________________________
+
+void     _TheTree::RecoverNodeSupportStates (_DataSetFilter* dsf, long index, long lastIndex, _Matrix& resultMatrix)
+// assume current values of all parameters
+// return 2 sets of vectors for each branch
+//   - top-down  conditionals
+//   - bottom-up conditionals
+//   resultMatrix is assumed to contain
+//      uniqueSites X (flatLeaves.lLength+flatTree.lLength)*cBase*2 X categoryCount
+{
+
+    long      globalShifter        = (flatLeaves.lLength+flatTree.lLength)*cBase,
+              catShifer             = dsf->NumberDistinctSites() * 2 * globalShifter;
+
+    IntPopulateLeaves (dsf, index,lastIndex);
+
+    /* pass 1; populate top-down vectors */
+    /* ugly top-bottom algorithm for debuggability and compactness */
+
+    for (long catCount   = 0; catCount < categoryCount; catCount ++) {
+        _Parameter* currentStateVector = resultMatrix.theData + 2*globalShifter*index + catShifer*catCount,
+                    *   vecPointer         = currentStateVector;
+
+        for (long nodeCount = 0; nodeCount<flatCLeaves.lLength; nodeCount++) {
+            _Parameter *leafVec     = ((_CalcNode*)(((BaseRef*)flatCLeaves.lData)[nodeCount]))->theProbs;
+
+            for (long cc = 0; cc < cBase; cc++,vecPointer++) {
+                *vecPointer = leafVec[cc];
+            }
+        }
+
+        for (long iNodeCount = 0; iNodeCount < flatTree.lLength; iNodeCount++) {
+            node<long>* thisINode       = (node<long>*)flatNodes.lData[iNodeCount];
+
+            for (long cc = 0; cc < cBase; cc++,vecPointer++) {
+                _Parameter      tmp = 1.0;
+                for (long nc = 0; nc < thisINode->nodes.length; nc++) {
+                    _Parameter  tmp2 = 0.0;
+                    _CalcNode   * child         = ((_CalcNode*)((BaseRef*)variablePtrs.lData)[thisINode->nodes.data[nc]->in_object]);
+                    _Parameter  * childSupport  = currentStateVector + child->nodeIndex*cBase,
+                                  * transMatrix   = child->GetCompExp(categoryCount>1?catCount:(-1))->theData + cc*cBase;
+
+                    for (long cc2 = 0; cc2 < cBase; cc2++) {
+                        tmp2 += transMatrix[cc2] * childSupport[cc2];
+                    }
+
+                    tmp *= tmp2;
+                }
+                *vecPointer = tmp;
+            }
+        }
+        RecoverNodeSupportStates2 (&GetRoot(),currentStateVector+globalShifter,currentStateVector,categoryCount>1?catCount:(-1));
+    }
+    /* pass 2; populate bottom-up vectors */
+    /* for this we need to traverse the tree pre-order */
+    /* because speed is not much of a concern, use a recursive call for compactness */
+
+}
+
+//_______________________________________________________________________________________________
+
+void     _TheTree::RecoverNodeSupportStates2 (node<long>* thisNode, _Parameter* resultVector, _Parameter* forwardVector, long catID)
+{
+    _CalcNode   * thisNodeC     = ((_CalcNode*)((BaseRef*)variablePtrs.lData)[thisNode->in_object]);
+    _Parameter  * vecPointer    = resultVector + thisNodeC->nodeIndex * cBase;
+
+    if (thisNode->parent) {
+        if (thisNode->parent->parent) {
+            for (long cc = 0; cc < cBase; cc++,vecPointer++) {
+                _Parameter tmp = 1.0;
+                for (long nc = 0; nc < thisNode->parent->nodes.length; nc++) {
+                    _Parameter  tmp2            = 0.0;
+                    _CalcNode   * child         = ((_CalcNode*)((BaseRef*)variablePtrs.lData)[thisNode->parent->nodes.data[nc]->in_object]);
+                    bool          invert        = (child == thisNodeC);;
+                    if (invert) {
+                        child = ((_CalcNode*)((BaseRef*)variablePtrs.lData)[thisNode->parent->in_object]);
+                    }
+
+                    _Parameter  * childSupport  = invert?resultVector + cBase*child->nodeIndex
+                                                  :forwardVector + child->nodeIndex*cBase,
+                                                  * transMatrix   = child->GetCompExp(catID)->theData + cc*cBase;
+
+                    for (long cc2 = 0; cc2 < cBase; cc2++) {
+                        tmp2 += transMatrix[cc2] * childSupport[cc2];
+                    }
+
+                    tmp *= tmp2;
+                }
+                *vecPointer = tmp;
+            }
+        } else {
+            for (long cc = 0; cc < cBase; cc++,vecPointer++) {
+                _Parameter tmp = 1.0;
+                for (long nc = 0; nc < thisNode->parent->nodes.length; nc++) {
+                    _Parameter  tmp2            = 0.0;
+                    _CalcNode   * child         = ((_CalcNode*)((BaseRef*)variablePtrs.lData)[thisNode->parent->nodes.data[nc]->in_object]);
+                    if (child != thisNodeC) {
+                        _Parameter  * childSupport  = forwardVector + child->nodeIndex*cBase,
+                                      * transMatrix   = child->GetCompExp(catID)->theData + cc*cBase;
+
+                        for (long cc2 = 0; cc2 < cBase; cc2++) {
+                            tmp2 += transMatrix[cc2] * childSupport[cc2];
+                        }
+
+                        tmp *= tmp2;
+                    }
+                }
+                *vecPointer = tmp;
+            }
+        }
+    } else
+        for (long cc=0; cc<cBase; cc++) {
+            vecPointer [cc] = 1.0;
+        }
+
+    for (long nc = 0; nc < thisNode->nodes.length; nc++) {
+        RecoverNodeSupportStates2 (thisNode->nodes.data[nc],resultVector,forwardVector,catID);
+    }
+}
+
+//_______________________________________________________________________________________________
+
+_List* _TheTree::MapCBaseToCharacters (_DataSetFilter* dsf, bool normalanc)
+// 20090203/SLKP: clean up
+{
+    _List               * reply = new _List;
+    checkPointer         (reply);
+
+    long unitLength = dsf->GetUnitLength();
+
+    for (long pad = 0; pad<unitLength ; pad ++) {
+        reply->AppendNewInstance (new _String (5,true));
+    }
+
+    _CalcNode*  theChildNode = StepWiseTraversal (true);
+    _String     rootValue = dsf->ConvertCodeToLetters (dsf->CorrectCode(theChildNode->cBase), unitLength);
+
+    for (long f=0; f<unitLength; f++) {
+        *((_String*)(*reply)(f)) << rootValue[f];
+    }
+
+    theChildNode = StepWiseTraversal (false);
+
+    while (theChildNode) {
+        if (!IsCurrentNodeATip()) {
+            if (normalanc) {
+                _CalcNode* travNode              =  (_CalcNode*)((BaseRef*)variablePtrs.lData)[currentNode->parent->in_object];
+                theChildNode->cBase  = theChildNode->theProbs[travNode->cBase];
+                theChildNode->categoryVariables.Delete(theChildNode->categoryVariables.lLength-1);
+            }
+
+            _String  letterValue = dsf->ConvertCodeToLetters (dsf->CorrectCode(theChildNode->cBase), unitLength);
+            for (long i=0; i<unitLength; i++) {
+                *((_String*)(*reply)(i)) << letterValue[i];
+            }
+        }
+        theChildNode = StepWiseTraversal (false);
+    }
+
+    for (long j = 0; j<unitLength ; j ++) {
+        ((_String*)(*reply)(j))->Finalize();
+    }
+
+    return reply;
+}
+
+//_______________________________________________________________________________________________
+
+_Parameter  _TheTree::ConditionalNodeLikelihood   (node<long>* parentNode, node<long>* thisNode, _Parameter* scoreBelow, _Parameter* myScore, long myState, long offset)
+{
+    if (parentNode) {
+        _Parameter       conditionalLikelihood = LIKELIHOOD_SCALER;
+
+        for (long child = 0; child<thisNode->nodes.length; child++) {
+            _CalcNode *                childCNode = ((_CalcNode*)((BaseRef*)variablePtrs.lData)[thisNode->nodes.data[child]->in_object]);
+            conditionalLikelihood      *= *(childCNode->compExp->theData + myState*cBase + childCNode->cBase) * childCNode->theValue;
+        }
+
+        myScore[myState] = conditionalLikelihood;
+
+        return ConditionalBranchLikelihood (parentNode, thisNode, myScore, scoreBelow, -1, offset);
+    } else {
+        _Parameter      tLik = theProbs[myState];
+
+        for (long child = 0; child<thisNode->nodes.length; child++) {
+            _CalcNode *      childCNode = ((_CalcNode*)((BaseRef*)variablePtrs.lData)[thisNode->nodes.data[child]->in_object]);
+            tLik      *= *(childCNode->compExp->theData + myState*cBase + childCNode->cBase) * childCNode->theValue;
+        }
+
+        return tLik;
+    }
+}
+
+//_______________________________________________________________________________________________
+
+_Parameter  _TheTree::ConditionalBranchLikelihood   (node<long>* parentNode, node<long>* thisNode, _Parameter* scoreBelow, _Parameter* myScore, long myState, long offset)
+{
+    for (long pstate = (myState>=0?myState:0); pstate < (myState>=0?myState+1:cBase); pstate ++) {
+        _Parameter       conditionalLikelihood = LIKELIHOOD_SCALER;
+        for (long child = 0; child<parentNode->nodes.length; child++) {
+            _Parameter       childContribution = 0.0;
+
+            node<long>*      childNode  = parentNode->nodes.data[child];
+            _CalcNode *      childCNode = ((_CalcNode*)((BaseRef*)variablePtrs.lData)[childNode->in_object]);
+
+            _Parameter*      conds,
+                             *       transitions = childCNode->compExp->theData + pstate*cBase,
+                                     *      stopper;
+
+            if (childNode==thisNode) { // use scoreBelow
+                conds = scoreBelow;
+            } else { // use existing conditionals
+                if (offset>=0) {
+                    conds = marginalLikelihoodCache+cBase*(flatLeaves.lLength+flatNodes.lLength)*offset + cBase*((long)childCNode->theProbs[0]);
+                } else {
+                    conds = childCNode->theProbs;
+                }
+            }
+
+            long      remaind = cBase%4;
+
+            if (remaind) {
+                stopper = conds + (cBase-remaind);
+                for (; conds!= stopper; ) {
+                    childContribution += *transitions * *conds;
+                    transitions++;
+                    conds++;
+                    childContribution += *transitions * *conds;
+                    transitions++;
+                    conds++;
+                    childContribution += *transitions * *conds;
+                    transitions++;
+                    conds++;
+                    childContribution += *transitions * *conds;
+                    transitions++;
+                    conds++;
+                }
+
+                switch (remaind) {
+                case 1: {
+                    childContribution += *(transitions) * *(conds);
+                    break;
+                }
+                case 2: {
+                    childContribution += *transitions * *conds;
+                    transitions++;
+                    conds++;
+                    childContribution += *transitions * *conds;
+                    break;
+                }
+                case 3: {
+                    childContribution += *transitions * *conds;
+                    transitions++;
+                    conds++;
+                    childContribution += *transitions * *conds;
+                    transitions++;
+                    conds++;
+                    childContribution += *transitions * *conds;
+                    break;
+                }
+                }
+            } else {
+                stopper = conds + cBase;
+                for (; conds!= stopper; ) {
+                    childContribution += *transitions * *conds;
+                    transitions++;
+                    conds++;
+                    childContribution += *transitions * *conds;
+                    transitions++;
+                    conds++;
+                    childContribution += *transitions * *conds;
+                    transitions++;
+                    conds++;
+                    childContribution += *transitions * *conds;
+                    transitions++;
+                    conds++;
+                }
+            }
+
+            conditionalLikelihood *= childContribution;
+
+            if (conditionalLikelihood == 0.0) {
+                if (myState >= 0) {
+                    return 0.0;
+                }
+                break;
+            }
+        }
+        myScore[pstate] = conditionalLikelihood;
+    }
+
+    if (parentNode->parent) {
+        return ConditionalBranchLikelihood (parentNode->parent, parentNode, myScore, scoreBelow, -1, offset);
+    }
+
+    if (myState < 0) {
+        _Parameter       treeLikelihood = 0.0;
+
+        for (long pstate = 0; pstate < cBase; pstate ++) {
+            treeLikelihood += theProbs[pstate] * myScore [pstate];
+        }
+
+        return          treeLikelihood;
+    }
+    return theProbs[myState]*myScore[myState];
+}
+
+//_______________________________________________________________________________________________
+
+void     _TheTree::WeightedCharacterDifferences (_Parameter siteLikelihood, _Matrix* res1, _Matrix* res2, long offset)
+// presumes that compExp is populated and so are all the state vectors in internal nodes
+{
+    if (cBase>128) {
+        WarnError ("State spaces with more than 128 states are not supported in WeightedCharacterDifferences");
+        return;
+    }
+
+    _Parameter vec1[128],
+               vec2[128];
+
+    //checkPointer (vec1);
+    //checkPointer (vec2);
+
+    //checkParameter (VerbosityLevelString,verbLevel, 0.0);
+    //long          branchCount = 0;
+
+    for (long       nodeCount=0; nodeCount<flatTree.lLength; nodeCount++) {
+        node<long>* disNode = ((node <long>*)(flatNodes.lData[nodeCount]));
+
+
+        for (long   childCount = disNode->nodes.length-1; childCount >= 0; childCount --) {
+            node<long>* childNode = disNode->nodes.data[childCount];
+
+            _CalcNode*  cNode = ((_CalcNode*)((BaseRef*)variablePtrs.lData)[childNode->in_object]);
+            _Parameter  weightFactor = cNode->Value(),
+                        consistencyCheck = 0.0;
+
+
+            for (long pState = 0; pState < cBase; pState ++) {
+                for (long cState = 0; cState < cBase; cState ++) {
+                    for (long eraser = 0; eraser < cBase; eraser++) {
+                        vec1[eraser] = 0.;
+                        vec2[eraser] = 0.;
+                    }
+
+                    if (offset>=0) {
+                        vec1[cState] = *(marginalLikelihoodCache+cBase*(flatLeaves.lLength+flatNodes.lLength)*offset + cBase*((long)cNode->theProbs[0])+cState);
+                    } else {
+                        vec1[cState] = cNode->theProbs[cState];
+                    }
+
+
+                    _Parameter  cLik = (ConditionalBranchLikelihood (disNode, childNode, vec1, vec2, pState, offset)/siteLikelihood);
+                    res1->theData[pState*cBase+cState] += cLik;
+                    res2->theData[pState*cBase+cState] += cLik*weightFactor;
+                    consistencyCheck += cLik;
+                }
+            }
+
+#if !defined __UNIX__ || defined __HEADLESS__ || defined __HYPHYQT__ || defined __HYPHY_GTK__
+            if ((cBase>=20)&&(offset<1)) {
+                yieldCPUTime();
+                if (terminateExecution) {
+                    return;
+                }
+            }
+#endif
+
+            if (!CheckEqual(consistencyCheck, 1.)) {
+                _String consistencyErra ("Failed Internal Consistency Check In WeightedCharacterDifferences at ");
+                consistencyErra = consistencyErra & * LocateVar(disNode->in_object)->GetName() & " and " & *cNode->GetName() &
+                                  ". Summed RLS to " & consistencyCheck;
+                WarnError (consistencyErra);
+            }
+        }
+    }
+
+    //delete vec1;
+    //delete vec2;
+}
+
+//_______________________________________________________________________________________________
+_AVLListX*  _TheTree::ConstructNodeToIndexMap (bool doINodes)
+{
+    _SimpleList * nodes  = new _SimpleList,
+    * whichL = doINodes?&flatNodes:&flatLeaves;
+    _AVLListX   * result = new _AVLListX (nodes);
+
+    for (unsigned long   pistolero = 0; pistolero < whichL->lLength; pistolero++) {
+        result->Insert ((BaseRef)whichL->lData[pistolero], pistolero, false);
+    }
+
+    return        result;
+
+}
+
+//_______________________________________________________________________________________________
+void _TheTree::MapPostOrderToInOderTraversal (_SimpleList& storeHere, bool doINodes)
+{
+    _AVLListX*          nodeMapper    = ConstructNodeToIndexMap (doINodes);
+    _CalcNode*          traversalNode = doINodes?StepWiseTraversal(true):DepthWiseTraversal(true);
+
+    long                allNodeCount = 0;
+
+    storeHere.Populate (doINodes?flatTree.lLength:flatLeaves.lLength, 0, 0);
+
+    while (traversalNode) {
+        bool isTip = IsCurrentNodeATip();
+        if ((isTip && !doINodes) || (!isTip && doINodes)) {
+            storeHere.lData[nodeMapper->GetXtra (nodeMapper->Find((BaseRef)(&GetCurrentNode())))] = allNodeCount++;
+        }
+
+        traversalNode = doINodes?StepWiseTraversal(false):DepthWiseTraversal(false);
+    }
+
+    nodeMapper->DeleteAll(false);
+    DeleteObject (nodeMapper);
+
+
+}
+
+//_______________________________________________________________________________________________
+void    _TheTree::MarkDone (void)
+{
+    _CalcNode*  travNode = StepWiseTraversal (TRUE);
+
+    while (travNode) {
+        travNode -> MarkDone();
+        travNode = StepWiseTraversal();
+    }
+}
+
+//_______________________________________________________________________________________________
+
+_Parameter  _TheTree::PruneTree (long categID)
+// notice that the limiting atomic probabilites are assumed to be stored in the
+// model matrix of the tree itself
+
+{
+    // do the depth first traversal to start at the leaves
+
+    _CalcNode* curNode = DepthWiseTraversal (true);
+    while (curNode) {
+        bool reexpnt = curNode->NeedToExponentiate(categID);
+        // flag all the nodes up the chain - to the root
+
+        if (reexpnt&&curNode->GetModelMatrix()) {
+            curNode->RecomputeMatrix(categID, categoryCount);
+        } else if (categID>=0) {
+            curNode->SetCompMatrix (categID);
+        }
+        // the probabilities below in the tree have already been computed
+        long    nNodes = currentNode->get_num_nodes();
+        if (nNodes) {
+            long j;
+            for (j = 0; j<nNodes; j++) {
+                _CalcNode* tC = ((_CalcNode*)(LocateVar(currentNode->get_node(j+1)->get_data())));
+                if(!tC->GetCompExp(categID)) {
+                    tC->RecomputeMatrix(categID, categoryCount);
+                } else if (categID>=0) {
+                    tC->SetCompMatrix(categID);
+                }
+            }
+        }
+        // the probabilities have now been set and the flag erased even if it had been raised before
+
+        curNode = DepthWiseTraversal();
+    }
+
+    return 0.0;
+}
+
+//_______________________________________________________________________________________________
+
+_Parameter  _TheTree::PruneTreeChar4 (long categID)
+// notice that the limiting atomic probabilites are assumed to be stored in the
+// model matrix of the tree itself
+
+{
+
+    long            nodeCount;
+    _Parameter*     fastIndex;
+    node<long>*     nodeChild;
+    bool            reexpnt;
+    _CalcNode*      theChildNode,
+                    *travNode;
+
+
+    for (nodeCount = 0; nodeCount<flatLeaves.lLength; nodeCount++) {
+        theChildNode = (_CalcNode*)(((BaseRef*)flatCLeaves.lData)[nodeCount]);
+        reexpnt = theChildNode->NeedToExponentiate(categID);
+        if (reexpnt&&theChildNode->GetModelMatrix()) {
+            theChildNode->RecomputeMatrix(categID, categoryCount);
+        } else if (categID>=0) {
+            theChildNode->SetCompMatrix (categID);
+        }
+    }
+
+    for (nodeCount=0; nodeCount<flatTree.lLength; nodeCount++) {
+        theChildNode = (_CalcNode*)(((BaseRef*)flatTree.lData)[nodeCount]);
+        theChildNode->theProbs[0]=LIKELIHOOD_SCALER;
+        theChildNode->theProbs[1]=LIKELIHOOD_SCALER;
+        theChildNode->theProbs[2]=LIKELIHOOD_SCALER;
+        theChildNode->theProbs[3]=LIKELIHOOD_SCALER;
+
+        reexpnt = theChildNode->NeedToExponentiate(categID);
+        if (reexpnt&&theChildNode->GetModelMatrix()) {
+            theChildNode->RecomputeMatrix(categID, categoryCount);
+            theChildNode->cBase = -1;
+        } else {
+            if (categID>=0) {
+                theChildNode->SetCompMatrix (categID);
+            }
+        }
+    }
+
+    for (nodeCount = 0; nodeCount<flatLeaves.lLength; nodeCount++) {
+        travNode = (_CalcNode*)(((BaseRef*)flatCLeaves.lData)[nodeCount]);
+        theChildNode = ((_CalcNode*)((BaseRef*)variablePtrs.lData)
+                        [((node <long>*)(flatLeaves.lData[nodeCount]))->parent->in_object]);
+
+        fastIndex = travNode->compExp->theData;
+        if (travNode->lastState>=0) {
+            fastIndex+=travNode->lastState;
+            theChildNode->theProbs[0]*=*fastIndex;
+            theChildNode->theProbs[1]*=fastIndex[4];
+            theChildNode->theProbs[2]*=fastIndex[8];
+            theChildNode->theProbs[3]*=fastIndex[12];
+        } else {
+            _Parameter a = *(travNode->theProbs),
+                       b = travNode->theProbs[1],
+                       c = travNode->theProbs[2],
+                       d = travNode->theProbs[3];
+
+            _Parameter tmp = a * *(fastIndex++);
+            tmp +=b* *(fastIndex++);
+            tmp +=c* *(fastIndex++);
+            theChildNode->theProbs[0]*=tmp+d* *(fastIndex++);
+
+            tmp = a * *(fastIndex++);
+            tmp +=b* *(fastIndex++);
+            tmp +=c* *(fastIndex++);
+            theChildNode->theProbs[1]*=tmp+d* *(fastIndex++);
+
+            tmp = a * *(fastIndex++);
+            tmp +=b* *(fastIndex++);
+            tmp +=c* *(fastIndex++);
+            theChildNode->theProbs[2]*=tmp+d* *(fastIndex++);
+
+            tmp = a * *(fastIndex++);
+            tmp +=b* *(fastIndex++);
+            tmp +=c* *(fastIndex++);
+            theChildNode->theProbs[3]*=tmp+d* *(fastIndex++);
+        }
+    }
+
+    for (nodeCount=0; nodeCount<flatTree.lLength-1; nodeCount++) {
+        travNode = (_CalcNode*)(((BaseRef*)flatTree.lData)[nodeCount]);
+        nodeChild = ((node <long>*)(flatNodes.lData[nodeCount]))->parent;
+        theChildNode =
+            ((_CalcNode*)((BaseRef*)variablePtrs.lData)[nodeChild->in_object]);
+
+        fastIndex = travNode->compExp->theData;
+
+        _Parameter a = *(travNode->theProbs),
+                   b = travNode->theProbs[1],
+                   c = travNode->theProbs[2],
+                   d = travNode->theProbs[3];
+
+        _Parameter tmp = a * *(fastIndex++);
+        tmp +=b* *(fastIndex++);
+        tmp +=c* *(fastIndex++);
+        theChildNode->theProbs[0]*=tmp+d* *(fastIndex++);
+
+        tmp = a * *(fastIndex++);
+        tmp +=b* *(fastIndex++);
+        tmp +=c* *(fastIndex++);
+        theChildNode->theProbs[1]*=tmp+d* *(fastIndex++);
+
+        tmp = a * *(fastIndex++);
+        tmp +=b* *(fastIndex++);
+        tmp +=c* *(fastIndex++);
+        theChildNode->theProbs[2]*=tmp+d* *(fastIndex++);
+
+        tmp = a * *(fastIndex++);
+        tmp +=b* *(fastIndex++);
+        tmp +=c* *(fastIndex++);
+        theChildNode->theProbs[3]*=tmp+d* *(fastIndex++);
+    }
+
+
+    theChildNode = (_CalcNode*)(((BaseRef*)variablePtrs.lData)[theRoot->in_object]);
+
+    _Parameter  result = theProbs[0]*theChildNode->theProbs[0]+
+                         theProbs[1]*theChildNode->theProbs[1]+
+                         theProbs[2]*theChildNode->theProbs[2]+
+                         theProbs[3]*theChildNode->theProbs[3];
+
+    if (result<=0.0) {
+        return ALMOST_ZERO;
+    }
+    return result;
+}
+
+//_______________________________________________________________________________________________
+
+_Parameter  _TheTree::PruneTreeChar4Cache (long categID)
+// notice that the limiting atomic probabilites are assumed to be stored in the
+// model matrix of the tree itself
+
+{
+
+    long            nodeCount;
+    _Parameter*     fastIndex;
+    node<long>*     nodeChild;
+    bool            reexpnt;
+    _CalcNode*      theChildNode,
+                    *travNode;
+
+
+    for (nodeCount = 0; nodeCount<flatLeaves.lLength; nodeCount++) {
+        theChildNode = (_CalcNode*)(((BaseRef*)flatCLeaves.lData)[nodeCount]);
+        reexpnt = theChildNode->NeedToExponentiate(categID);
+        if (reexpnt&&theChildNode->GetModelMatrix()) {
+            theChildNode->RecomputeMatrix(categID, categoryCount);
+            theChildNode = ((_CalcNode*)((BaseRef*)variablePtrs.lData)
+                            [((node <long>*)(flatLeaves.lData[nodeCount]))->parent->in_object]);
+            theChildNode->cBase = -1;
+        } else if (categID>=0) {
+            theChildNode->SetCompMatrix (categID);
+        }
+    }
+
+    for (nodeCount=0; nodeCount<flatTree.lLength; nodeCount++) {
+        theChildNode = (_CalcNode*)(((BaseRef*)flatTree.lData)[nodeCount]);
+        theChildNode->theProbs[0]=LIKELIHOOD_SCALER;
+        theChildNode->theProbs[1]=LIKELIHOOD_SCALER;
+        theChildNode->theProbs[2]=LIKELIHOOD_SCALER;
+        theChildNode->theProbs[3]=LIKELIHOOD_SCALER;
+        reexpnt = theChildNode->NeedToExponentiate(categID);
+        if (reexpnt&&theChildNode->GetModelMatrix()) {
+            theChildNode->RecomputeMatrix(categID, categoryCount);
+            theChildNode->cBase = -1;
+        } else {
+            if (categID>=0) {
+                theChildNode->SetCompMatrix (categID);
+            }
+        }
+        if (theChildNode->cBase==-1) {
+            nodeChild = ((node <long>*)(flatNodes.lData[nodeCount]))->parent;
+            if (nodeChild) {
+                theChildNode = ((_CalcNode*)((BaseRef*)variablePtrs.lData)[nodeChild->in_object]);
+                theChildNode->cBase = -1;
+            }
+        }
+    }
+
+    for (nodeCount = 0; nodeCount<flatLeaves.lLength; nodeCount++) {
+        travNode = (_CalcNode*)(((BaseRef*)flatCLeaves.lData)[nodeCount]);
+        theChildNode = ((_CalcNode*)((BaseRef*)variablePtrs.lData)
+                        [((node <long>*)(flatLeaves.lData[nodeCount]))->parent->in_object]);
+
+        fastIndex = travNode->GetCompExp()->fastIndex();
+        if (travNode->lastState>=0) {
+            fastIndex+=travNode->lastState;
+            theChildNode->theProbs[0]*=*fastIndex;
+            theChildNode->theProbs[1]*=fastIndex[4];
+            theChildNode->theProbs[2]*=fastIndex[8];
+            theChildNode->theProbs[3]*=fastIndex[12];
+        } else {
+            _Parameter a = *(travNode->theProbs),
+                       b = travNode->theProbs[1],
+                       c = travNode->theProbs[2],
+                       d = travNode->theProbs[3];
+
+            _Parameter tmp = a * *(fastIndex++);
+            tmp +=b* *(fastIndex++);
+            tmp +=c* *(fastIndex++);
+            theChildNode->theProbs[0]*=tmp+d* *(fastIndex++);
+
+            tmp = a * *(fastIndex++);
+            tmp +=b* *(fastIndex++);
+            tmp +=c* *(fastIndex++);
+            theChildNode->theProbs[1]*=tmp+d* *(fastIndex++);
+
+            tmp = a * *(fastIndex++);
+            tmp +=b* *(fastIndex++);
+            tmp +=c* *(fastIndex++);
+            theChildNode->theProbs[2]*=tmp+d* *(fastIndex++);
+
+            tmp = a * *(fastIndex++);
+            tmp +=b* *(fastIndex++);
+            tmp +=c* *(fastIndex++);
+            theChildNode->theProbs[3]*=tmp+d* *(fastIndex++);
+        }
+    }
+
+    for (nodeCount=0; nodeCount<flatTree.lLength-1; nodeCount++) {
+        travNode = (_CalcNode*)(((BaseRef*)flatTree.lData)[nodeCount]);
+        nodeChild = ((node <long>*)(flatNodes.lData[nodeCount]))->parent;
+        theChildNode =
+            ((_CalcNode*)((BaseRef*)variablePtrs.lData)[nodeChild->in_object]);
+
+        fastIndex = travNode->GetCompExp()->fastIndex();
+
+        _Parameter a = *(travNode->theProbs),
+                   b = travNode->theProbs[1],
+                   c = travNode->theProbs[2],
+                   d = travNode->theProbs[3];
+
+        _Parameter tmp = a * *(fastIndex++);
+        tmp +=b* *(fastIndex++);
+        tmp +=c* *(fastIndex++);
+        theChildNode->theProbs[0]*=tmp+d* *(fastIndex++);
+
+        tmp = a * *(fastIndex++);
+        tmp +=b* *(fastIndex++);
+        tmp +=c* *(fastIndex++);
+        theChildNode->theProbs[1]*=tmp+d* *(fastIndex++);
+
+        tmp = a * *(fastIndex++);
+        tmp +=b* *(fastIndex++);
+        tmp +=c* *(fastIndex++);
+        theChildNode->theProbs[2]*=tmp+d* *(fastIndex++);
+
+        tmp = a * *(fastIndex++);
+        tmp +=b* *(fastIndex++);
+        tmp +=c* *(fastIndex++);
+        theChildNode->theProbs[3]*=tmp+d* *(fastIndex++);
+    }
+
+    long c = 0, off = 1;
+    for (nodeCount=0; nodeCount<topLevelNodes.lLength-1; nodeCount++, off<<=1) {
+        travNode = (_CalcNode*)(((BaseRef*)flatTree.lData)[topLevelNodes.lData[nodeCount]]);
+        if (travNode->cBase<=-1) {
+            c |= off;
+        }
+    }
+    topLevelNodes.lData[topLevelNodes.lLength-1] = c;
+    for (nodeCount=0; nodeCount<flatTree.lLength; nodeCount++) {
+        theChildNode = (_CalcNode*)(((BaseRef*)flatTree.lData)[nodeCount]);
+        theChildNode->cBase = cBase;
+    }
+
+    _Parameter result = 0.0;
+
+    theChildNode = (_CalcNode*)(((BaseRef*)variablePtrs.lData)[theRoot->in_object]);
+    //((_CalcNode*)(LocateVar(theRoot->get_data())));
+
+    for (nodeCount=0; nodeCount<cBase; nodeCount++) {
+        result+= theProbs[nodeCount]*theChildNode->theProbs[nodeCount];
+    }
+
+    if (result<=0.0) {
+        return ALMOST_ZERO;
+    }
+
+    return result;
+}
+
+//_______________________________________________________________________________________________
+
+_Parameter  _TheTree::PruneTreeChar (long categID)
+// notice that the limiting atomic probabilites are assumed to be stored in the
+// model matrix of the tree itself
+
+{
+
+    long            nodeCount,j;
+    _Parameter*     fastIndex;
+    node<long>*     nodeChild;
+    bool            reexpnt;
+    _CalcNode*      theChildNode,
+                    *travNode;
+
+
+    for (nodeCount=0; nodeCount<flatTree.lLength; nodeCount++) {
+        theChildNode = (_CalcNode*)(((BaseRef*)flatTree.lData)[nodeCount]);
+        for (j=0; j<cBase; j++) {
+            theChildNode->theProbs[j]=LIKELIHOOD_SCALER;
+        }
+        reexpnt = theChildNode->NeedToExponentiate(categID);
+        if (reexpnt&&theChildNode->GetModelMatrix()) {
+            theChildNode->RecomputeMatrix(categID, categoryCount);
+        } else if (categID>=0) {
+            theChildNode->SetCompMatrix (categID);
+        }
+    }
+
+    for (nodeCount = 0; nodeCount<flatLeaves.lLength; nodeCount++) {
+        theChildNode = (_CalcNode*)(((BaseRef*)flatCLeaves.lData)[nodeCount]);
+        reexpnt = theChildNode->NeedToExponentiate(categID);
+        if (reexpnt&&theChildNode->GetModelMatrix()) {
+            theChildNode->RecomputeMatrix(categID, categoryCount);
+        } else if (categID>=0) {
+            theChildNode->SetCompMatrix (categID);
+        }
+    }
+
+    for (nodeCount = 0; nodeCount<flatLeaves.lLength; nodeCount++) {
+        travNode = (_CalcNode*)(((BaseRef*)flatCLeaves.lData)[nodeCount]);
+        theChildNode = ((_CalcNode*)((BaseRef*)variablePtrs.lData)
+                        [((node <long>*)(flatLeaves.lData[nodeCount]))->parent->in_object]);
+
+        fastIndex = travNode->GetCompExp()->fastIndex();
+        if (travNode->lastState>=0) {
+            fastIndex+=travNode->lastState;
+            _Parameter tmp = travNode->theProbs[travNode->lastState];
+            for (long i=0; i<cBase; i++,fastIndex+=cBase) {
+                theChildNode->theProbs[i]*=tmp* (*fastIndex);
+            }
+        } else {
+            for (j=0; j<cBase; j++) {
+                _Parameter tmp = *(travNode->theProbs) * *fastIndex;
+                fastIndex++;
+                for (long k = 1; k<cBase; k++,fastIndex++) {
+                    tmp +=travNode->theProbs[k]* (*fastIndex);
+                }
+                theChildNode->theProbs[j]*=tmp;
+            }
+        }
+    }
+
+    for (nodeCount=0; nodeCount<flatTree.lLength; nodeCount++) {
+        travNode = (_CalcNode*)(((BaseRef*)flatTree.lData)[nodeCount]);
+        nodeChild = ((node <long>*)(flatNodes.lData[nodeCount]))->parent;
+        if (nodeChild) { // not a root yet
+            theChildNode =
+                ((_CalcNode*)((BaseRef*)variablePtrs.lData)[nodeChild->in_object]);
+
+            fastIndex = travNode->GetCompExp()->fastIndex();
+
+            for (j=0; j<cBase; j++) {
+                _Parameter tmp = *(travNode->theProbs) * *fastIndex;
+                fastIndex++;
+                for (long k = 1; k<cBase; k++,fastIndex++) {
+                    tmp +=travNode->theProbs[k]* (*fastIndex);
+                }
+                theChildNode->theProbs[j]*=tmp;
+            }
+
+        }
+    }
+
+
+    _Parameter result = 0;
+
+    theChildNode = (_CalcNode*)(((BaseRef*)variablePtrs.lData)[theRoot->in_object]);
+    //((_CalcNode*)(LocateVar(theRoot->get_data())));
+
+    for (nodeCount=0; nodeCount<cBase; nodeCount++) {
+        result+= theProbs[nodeCount]*theChildNode->theProbs[nodeCount];
+    }
+
+    if (result<=0.0) {
+        return ALMOST_ZERO;
+    }
+    return result;
+}
+
+//_______________________________________________________________________________________________
+
+long    _TheTree::ComputeReleafingCostChar (_DataSetFilter* dsf, long firstIndex, long secondIndex)
+{
+
+    char *pastState = dsf->GetColumn(firstIndex),
+          *thisState = dsf->GetColumn(secondIndex);
+
+    _SimpleList markedNodes (flatTree.lLength, 0, 0);
+
+    for (long nodeID = 0; nodeID<flatLeaves.lLength; nodeID++) {
+        long f = dsf->theNodeMap.lData[nodeID];
+        if (thisState[f]!=pastState[f]) {
+            markedNodes.lData[flatParents.lData[nodeID]] = 1;
+        }
+    }
+
+    long theCost = 0;
+
+    for (long i=0; i<flatTree.lLength; i++) {
+        if (markedNodes.lData[i]) {
+            long myParent = flatParents.lData[i + flatLeaves.lLength];
+            if (myParent >= 0) {
+                markedNodes.lData[myParent] = 1;
+            }
+            theCost += ((node <long>*)(flatNodes.lData[i]))->nodes.length;
+        }
+    }
+
+    return theCost;
+
+}
+
+//_______________________________________________________________________________________________
+
+void    _TheTree::ClearConstraints (void)
+{
+    _CalcNode* travNode = StepWiseTraversal(true);
+    while(travNode) {
+        travNode->ClearConstraints();
+        travNode = StepWiseTraversal();
+    }
+}
+
+
+//_______________________________________________________________________________________________
+
+long    _TheTree::ComputeReleafingCost (_DataSetFilter* dsf, long firstIndex, long secondIndex, _SimpleList* traversalTags, long orderIndex)
+{
+
+    //static _SimpleList flatLeaves, nodeCount;
+    //static _List     flatTree;
+    long        filterL = dsf->NumberDistinctSites();
+
+    _SimpleList     markedNodes (flatTree.lLength,0,0);
+
+    for (long leafID = 0; leafID<flatLeaves.lLength; leafID++)
+        if (!dsf->CompareTwoSites(firstIndex,secondIndex,leafID)) {
+            markedNodes.lData [flatParents.lData[leafID]] = 1;
+        }
+
+    // now compute the cost
+
+    long theCost = 0;
+
+
+    for (long i=0; i<flatTree.lLength; i++) {
+        if (markedNodes.lData[i]) {
+            long myParent    =  flatParents.lData[flatLeaves.lLength + i];
+            if (myParent >= 0) {
+                markedNodes.lData[myParent] = 1;
+            }
+            theCost         += ((node <long>*)(flatNodes.lData[i]))->nodes.length;
+        } else if (traversalTags && orderIndex) {
+            long theIndex = filterL * i + orderIndex;
+            traversalTags->lData[theIndex/_HY_BITMASK_WIDTH_] |= bitMaskArray.masks[theIndex%_HY_BITMASK_WIDTH_];
+            /*printf ("%d %d %d %d %d %d\n", firstIndex, secondIndex, orderIndex, i, theIndex/_HY_BITMASK_WIDTH_, theIndex%_HY_BITMASK_WIDTH_);
+            char b[4]; b[3] = 0;
+            for (long k = 0; k < flatLeaves.lLength; k++)
+            {
+                dsf->GrabSite (firstIndex, dsf->theNodeMap.lData[k], b);
+                printf ("%s ", b);
+                dsf->GrabSite (secondIndex, dsf->theNodeMap.lData[k], b);
+                printf ("%s\n", b);
+            }*/
+        }
+    }
+
+    return theCost;
+
+}
+
+//_______________________________________________________________________________________________
+
+void    _TheTree::MarkMatches (_DataSetFilter* dsf, long firstIndex, long secondIndex)
+{
+
+    long n = 0,f;
+
+    _CalcNode* travNode ;
+
+    for (n = 0; n<flatLeaves.lLength; n++) {
+        travNode = (_CalcNode*)(((BaseRef*)flatCLeaves.lData)[n]);
+        if (!dsf->CompareTwoSites(firstIndex,secondIndex,n)) {
+            node <long>* theTreeNode = ((node <long>*)(flatLeaves.lData[n]))->parent;
+            _CalcNode* cN = ((_CalcNode*)((BaseRef*)variablePtrs.lData)[theTreeNode->in_object]);
+            cN->cBase = -1;
+        }
+    }
+    n = 0;
+    for (f=0; f<flatTree.lLength; f++) {
+        travNode = (_CalcNode*)(((BaseRef*)flatTree.lData)[f]);
+        if (travNode->cBase == -1) {
+            node <long>* theTreeNode = ((node <long>*)(flatNodes.lData[f]))->parent;
+            if (theTreeNode) {
+                _CalcNode* cN = ((_CalcNode*)((BaseRef*)variablePtrs.lData)[theTreeNode->in_object]);
+                cN->cBase = -1;
+            }
+        }
+    }
+    for (f=0; f<flatTree.lLength; f++) {
+        travNode = (_CalcNode*)(((BaseRef*)flatTree.lData)[f]);
+        if (travNode->cBase != -1) {
+            travNode->lastState = -2;
+        } else {
+            travNode->cBase = cBase;
+        }
+    }
+}
+
+//_______________________________________________________________________________________________
+
+long    _TheTree::GetLowerBoundOnCost(_DataSetFilter* dsf)
+{
+    long n = 0,
+         theCost = 0;
+
+    _CalcNode* travNode ;
+
+    for (long siteIndex = 0; siteIndex<dsf->theFrequencies.lLength; siteIndex++) {
+        for (n = 0; n<flatTree.lLength; n++) {
+            travNode = (_CalcNode*)(((BaseRef*)flatTree.lData)[n]);
+            travNode->lastState = -1;
+        }
+        for (long matchIndex = 0; matchIndex<dsf->theFrequencies.lLength; matchIndex++)
+            if (matchIndex!=siteIndex) {
+                MarkMatches (dsf,siteIndex,matchIndex);
+            }
+        for (n = 0; n<flatTree.lLength; n++) {
+            travNode = (_CalcNode*)(((BaseRef*)flatTree.lData)[n]);
+            if (travNode->lastState != -2) {
+                theCost += ((node <long>*)(flatNodes.lData[n]))->nodes.length;
+            }
+            travNode->lastState = -1;
+        }
+    }
+    return theCost;
+}
+
+//_______________________________________________________________________________________________
+
+long    _TheTree::GetLowerBoundOnCostWithOrder (_DataSetFilter* dsf, _SimpleList* sl)
+{
+    long n = 0,
+         theCost = 0;
+
+    _CalcNode* travNode ;
+
+    for (long siteIndex = 0; siteIndex<dsf->theFrequencies.lLength; siteIndex++) {
+        for (n = 0; n<flatTree.lLength; n++) {
+            travNode = (_CalcNode*)(((BaseRef*)flatTree.lData)[n]);
+            travNode->lastState = -1;
+        }
+        for (long matchIndex = 0; matchIndex<siteIndex; matchIndex++)
+            if (matchIndex!=siteIndex) {
+                MarkMatches (dsf,sl->lData[siteIndex],sl->lData[matchIndex]);
+            }
+
+        for (n = 0; n<flatTree.lLength; n++) {
+            travNode = (_CalcNode*)(((BaseRef*)flatTree.lData)[n]);
+            if (travNode->lastState != -2) {
+                theCost += ((node <long>*)(flatNodes.lData[n]))->nodes.length;
+            }
+            travNode->lastState = -1;
+        }
+    }
+    return theCost;
+}
+
+//_______________________________________________________________________________________________
+
+void    _TheTree::DumpingOrder (_DataSetFilter* dsf, _SimpleList& receptacle)
+{
+
+    _SimpleList flatLeaves, nodeCount;
+    _List       flatTree;
+    long        theCost,firstIndex,secondIndex;
+
+    _CalcNode* travNode ;
+
+    travNode = StepWiseTraversal (TRUE);
+
+    while   (travNode) {
+        travNode->GetProbs()[1]=1;
+        flatTree<<travNode;
+        nodeCount<<currentNode->get_num_nodes();
+        travNode = StepWiseTraversal ();
+        receptacle<<receptacle.lLength;
+    }
+
+    flatLeaves.Clear();
+    travNode = LeafWiseTraversal (TRUE);
+
+    while   (travNode) {
+        flatLeaves<<long(currentNode);
+        travNode = LeafWiseTraversal ();
+    }
+
+    for (firstIndex=0,secondIndex=1; secondIndex<dsf->NumberDistinctSites(); firstIndex=secondIndex++) {
+        for (theCost = 0; theCost<flatLeaves.lLength; theCost++) {
+            if ((*dsf)(firstIndex,theCost)!=(*dsf)(secondIndex,theCost)) {
+                // mark all the nodes up the ladder as "tainted"
+                node <long>* theTreeNode = (node <long>*)(flatLeaves(theCost));
+                while (theTreeNode) {
+                    ((_CalcNode*)(LocateVar(theTreeNode->get_data())))->SetSummedFlag();
+                    theTreeNode=theTreeNode->get_parent();
+                }
+            }
+        }
+
+        // now compute the cost
+
+        theCost = 0;
+
+        for (long i=0; i<flatTree.lLength; i++) {
+            travNode = (_CalcNode*)flatTree (i);
+            if (travNode->IsSummedFlagged()) {
+                travNode->RemoveSummedFlag();
+                travNode->GetProbs()[1]++;
+            }
+        }
+    }
+
+    _SimpleList ref;
+    for (theCost=0; theCost<flatTree.lLength; theCost++) {
+        ref<<((_CalcNode*)flatTree(theCost))->GetProbs()[1];
+    }
+    SortLists (&ref, &receptacle);
+
+}
+
+
+//_______________________________________________________________________________________________
+
+void    _TheTree::MolecularClock (_String& baseNode, _List& varsToConstrain)
+{
+    node<long>* topNode = nil;
+    _CalcNode * curNode = StepWiseTraversal (true);
+    if (!baseNode.Length()) { // called Molecular Clock on the entire tree
+        topNode = &GetRoot();
+        _String*  childNameP;
+        if (rooted == ROOTED_LEFT) { // run separate constraint on the right child of the root
+            childNameP = ((_CalcNode*)(((BaseRef*)variablePtrs.lData)[theRoot->go_down(theRoot->get_num_nodes())->in_object]))->GetName();
+            _String childName = childNameP->Cut(childNameP->Find('.')+1,-1);
+            MolecularClock (childName, varsToConstrain);
+        } else if (rooted == ROOTED_RIGHT) {
+            childNameP = ((_CalcNode*)(((BaseRef*)variablePtrs.lData)[theRoot->go_down(1)->in_object]))->GetName();
+            _String childName = childNameP->Cut(childNameP->Find('.')+1,-1);
+            MolecularClock (childName, varsToConstrain);
+        }
+    } else {
+        baseNode = _String(".")&baseNode;
+        while (curNode) {
+            if (curNode->GetName()->endswith(baseNode)) {
+                topNode = currentNode;
+                break;
+            }
+            curNode = StepWiseTraversal();
+        }
+    }
+
+    if (!topNode) {
+        WarnError (_String ("Molecular clock constraint has failed, since node '")
+                   &baseNode
+                   &"' is not a part of tree '"
+                   &*GetName() & "'");
+    } else
+        for (unsigned long k=1; k<varsToConstrain.lLength; k++) {
+            long varIndex = LocateVarByName (*(_String*)varsToConstrain (k));
+            if (varIndex<0) {
+                WarnError (_String ("Molecular clock constraint has failed, since variable' ") &*(_String*)varsToConstrain (k) &"' is undefined.");
+                return ;
+            }
+            curNode->RecurseMC (variableNames.GetXtra(varIndex), topNode, true, rooted);
+        }
+}
+
+
+
+//_______________________________________________________________________________________________
+
+node<long>* _CalcNode::LocateMeInTree (void)
+{
+
+    _String     baseNode = GetName()->Cut(0,GetName()->Find('.')-1);
+    _TheTree    *parentTree = (_TheTree*)FetchVar(LocateVarByName(baseNode));
+    _CalcNode   *curNode = parentTree->StepWiseTraversal (true);
+
+    baseNode = GetName()->Cut(GetName()->FindBackwards('.',0,-1),-1);
+    while (curNode) {
+        if (curNode->GetName()->endswith(baseNode)) {
+            return &parentTree->GetCurrentNode();
+        }
+        curNode = parentTree->StepWiseTraversal();
+    }
+    return nil;
+}
+
+//_______________________________________________________________________________________________
+
+long _CalcNode::ConvertToSimpleMatrix (void)
+{
+    _Formula * mf = GetExplicitFormModel();
+    if (mf) {
+        mf->ConvertMatrixArgumentsToSimpleOrComplexForm (false);
+    } else {
+        _Matrix * mm = GetModelMatrix();
+        if (mm) {
+            mm->MakeMeSimple();
+        }
+
+        mm = GetFreqMatrix();
+        if (mm) {
+            mm->MakeMeSimple();
+        }
+    }
+
+    return 0;
+}
+
+//_______________________________________________________________________________________________
+
+void _CalcNode::ConvertFromSimpleMatrix (void)
+{
+    _Formula * mf = GetExplicitFormModel();
+    if (mf) {
+        mf->ConvertMatrixArgumentsToSimpleOrComplexForm (true);
+    } else {
+        _Matrix * mm = GetModelMatrix();
+        if (mm) {
+            mm->MakeMeGeneral();
+        }
+
+        mm = GetFreqMatrix();
+
+        if (mm) {
+            mm->MakeMeGeneral();
+        }
+    }
+}
+
+//_______________________________________________________________________________________________
+
+_Formula*   _CalcNode::RecurseMC (long varToConstrain, node<long>* whereAmI, bool first, char rooted)
+{
+    long descendants = whereAmI->get_num_nodes(),
+         f = iVariables?iVariables->FindStepping(varToConstrain,2,1):-1,
+         k,
+         l,
+         m,
+         start = 0;
+
+    if ((f<0)&&(!first)) { // bad bongos!
+        _String errMsg ("Molecular clock constraint has failed, since variable ");
+        errMsg = errMsg&*LocateVar(varToConstrain)->GetName();
+        errMsg = errMsg&" is not an independent member of the node ";
+        errMsg = errMsg&*GetName();
+        WarnError (errMsg);
+        return nil;
+    }
+
+
+    if (descendants == 0) // leaf node
+        if (first) {
+            return nil;
+        } else {
+            return new _Formula (LocateVar(iVariables->lData[f-1]),true);
+        }
+
+    if (first && (!whereAmI->get_parent()) && (rooted == ROOTED_LEFT)) {
+        descendants --;
+    }
+    if (first && (!whereAmI->get_parent()) && (rooted == ROOTED_RIGHT)) {
+        start++;
+    }
+
+    // internal node - must do some work
+
+    _Formula**  nodeConditions = (_Formula**)MemAllocate((descendants-start)*sizeof(_Formula*));
+
+    for (k=start+1; k<=descendants; k++) {
+        node<long>* downWeGo = whereAmI->go_down(k);
+        if (!(nodeConditions[k-1-start] = ((_CalcNode*)LocateVar(downWeGo->get_data()))->RecurseMC (varToConstrain, downWeGo))) {
+            for (long f2 = 0; f2 < k-start-1; f2++) {
+                delete nodeConditions[f2];
+            }
+
+            free (nodeConditions);
+            return nil;
+        }
+    }
+
+    // all the conditions have been written. now check how we should resolve them
+
+    for (k=0; k<descendants-start; k++)
+        if ((nodeConditions[k])->GetList().lLength>1) {
+            break;
+        }
+
+    if (k==descendants-start) { // all underlying branches are "simple"
+        for (k=1; k<descendants-start; k++) {
+            LocateVar (((_Operation*)((*(nodeConditions[k])).GetList()(0)))->GetAVariable())->SetFormula (*nodeConditions[0]);
+            delete (nodeConditions[k]);
+            nodeConditions[k] = nil;
+        }
+        k = 0;
+    } else {
+
+        for (l=k+1; l<descendants-start; l++)
+            if (nodeConditions[l]->GetList().lLength>1) {
+                break;
+            }
+
+        if (l==descendants-start) // all but one underlying branches are "simple"
+            for (l=0; l<descendants-start; l++) {
+                if (l==k) {
+                    continue;
+                }
+                LocateVar (((_Operation*)((*(nodeConditions[l])).GetList()(0)))->GetAVariable())->SetFormula (*nodeConditions[k]);
+                delete (nodeConditions[l]);
+                nodeConditions[l] = nil;
+            }
+        // really bad bongos! must solve for non-additive constraint
+        else
+            for (l=0; l<descendants-start; l++) {
+                if (l==k) {
+                    continue;
+                }
+                if (nodeConditions[l]->GetList().lLength==1) {
+                    LocateVar (((_Operation*)((*(nodeConditions[l])).GetList()(0)))->GetAVariable())->SetFormula (*nodeConditions[k]);
+                } else { // solve for a non-additive constraint
+                    _Variable* nonAdd = LocateVar (((_Operation*)((*(nodeConditions[l])).GetList()(0)))->GetAVariable());
+                    nodeConditions[l]->GetList().Delete(0);
+                    _Formula  newConstraint;
+                    newConstraint.Duplicate((BaseRef)nodeConditions[k]);
+                    _String mns ("-");
+                    _Operation mins (mns,2L);
+                    for (m=0; m<nodeConditions[l]->GetList().lLength; m++) {
+                        _Operation* curOp = (_Operation*)(*nodeConditions[l]).GetList()(m);
+                        if (curOp->GetNoTerms()) {
+                            newConstraint.GetList()&& &mins;
+                        } else {
+                            newConstraint.GetList()<<curOp;
+                        }
+                    }
+                    delete (nodeConditions[l]);
+                    nodeConditions[l] = nil;
+                    nonAdd->SetFormula(newConstraint);
+                }
+            }
+    }
+
+
+    if(!first) {
+        _Formula     *result = nodeConditions[k];
+
+        _String      pls ('+');
+
+        _Operation   *newVar = new _Operation,
+        *plus   = new _Operation (pls, 2L);
+
+        if (!(newVar && plus)) {
+            checkPointer (nil);
+        }
+
+        newVar->SetAVariable (iVariables->lData[f-1]);
+
+        result->GetList() << newVar;
+        result->GetList() << plus;
+
+        DeleteObject (newVar);
+        DeleteObject (plus);
+
+        free (nodeConditions);
+        return result;
+    }
+
+    for (k=0; k<descendants-start; k++)
+        if (nodeConditions[k]) {
+            delete nodeConditions[k];
+        }
+
+    free (nodeConditions);
+    return nil;
+}
+
+//_______________________________________________________________________________________________
+
+void        _TheTree::ScanSubtreeVars  (_List& rec, char flags, _CalcNode* startAt)
+// flags = 1 - do ind
+// flags = 2 - do dep
+{
+    _SimpleList scanVars;
+    _VariableContainer*  thisV;
+    _String     chop;
+    long        k,
+                f;
+
+    if (startAt) {
+        thisV = startAt;
+    } else {
+        thisV = DepthWiseTraversal (true);
+    }
+
+    {
+        _AVLList scanVarsA (&scanVars);
+        if (flags&0x01) {
+            thisV->ScanForVariables (scanVarsA,scanVarsA);
+        }
+        if (flags&0x02) {
+            thisV->ScanForDVariables(scanVarsA,scanVarsA);
+        }
+
+        scanVarsA.ReorderList();
+    }
+
+    for (k=0; k<scanVars.lLength; k++) {
+        thisV = (_VariableContainer*)LocateVar (scanVars.lData[k]);
+        f = thisV->GetName()->FindBackwards('.',0,-1);
+        if (f>=0) {
+            chop = thisV->GetName()->Cut (f+1,-1);
+            rec&& & chop;
+        }
+    }
+
+    if (startAt) {
+        thisV = StepWiseTraversalLevel(k,true);
+        while (thisV&&(thisV!=startAt)) {
+            thisV = StepWiseTraversalLevel(k);
+        }
+        if (thisV) {
+            f = k;
+            while ((k==f)&&thisV) {
+                thisV = StepWiseTraversalLevel(k);
+            }
+            if (thisV) {
+                while ((k>f)&&rec.lLength) {
+                    thisV->MatchParametersToList(rec,true,(flags&0x02)!=0);
+                    thisV = StepWiseTraversalLevel(k);
+                }
+                return;
+            }
+        }
+        rec.Clear();
+    } else {
+        thisV = DepthWiseTraversal();
+        while (thisV&&rec.lLength&&(!IsCurrentNodeTheRoot())) {
+            thisV->MatchParametersToList(rec,true,(flags&0x02)!=0);
+            thisV = DepthWiseTraversal();
+        }
+    }
+}
+
+//_______________________________________________________________________________________________
+
+_String             _TreeTopology::CompareTrees      (_TreeTopology* compareTo)
+{
+    _List           myLeaves,
+                    otherLeaves;
+
+    _SimpleList     indexer,
+                    otherIndexer;
+
+    node<long>      *myCT,
+         *otherCT;
+
+    _String         rerootAt;
+
+    myCT            = prepTree4Comparison(myLeaves, indexer);
+    otherCT         = compareTo->prepTree4Comparison(otherLeaves, otherIndexer);
+
+    // first compare the set of leaf labels
+
+    if (myLeaves.Equal (otherLeaves)) {
+        _SimpleList * reindexer = nil;
+
+        if (!indexer.Equal (otherIndexer)) {
+            _SimpleList ilist ((unsigned long)myLeaves.lLength);
+            ilist.lLength = myLeaves.lLength;
+
+            for (long k2 = 0; k2 < indexer.lLength; k2++) {
+                ilist.lData[indexer.lData[k2]] = k2;
+            }
+
+            for (long k3 = 0; k3<otherIndexer.lLength; k3++) {
+                otherIndexer.lData[k3] = ilist.lData[otherIndexer.lData[k3]];
+            }
+
+            reindexer = &otherIndexer;
+        }
+
+        char compRes;
+
+        if ((compRes=internalTreeCompare (myCT, otherCT, reindexer, 1, myLeaves.lLength, nil, compareTo))>0) {
+            rerootAt = eqWithoutReroot;
+        } else {
+            long   tCount = 0;
+
+            node<long>* meNode = DepthWiseStepTraverser (otherCT);
+
+            while (meNode!=otherCT) {
+                if (meNode->get_num_nodes()) {
+                    compRes = internalTreeCompare (myCT, meNode, reindexer, 1, myLeaves.lLength, nil, compareTo);
+                    if (compRes>0) {
+                        break;
+                    } else if (compRes) {
+                        meNode = otherCT;
+                        break;
+                    }
+                }
+
+                tCount ++;
+                meNode = DepthWiseStepTraverser ((node<long>*)nil);
+            }
+
+            if (meNode!=otherCT) {
+                meNode = DepthWiseStepTraverser (compareTo->theRoot);
+                while (meNode!=theRoot) {
+                    if (tCount==1) {
+                        rerootAt = eqWithReroot & *LocateVar (meNode->in_object)->GetName() & '.';
+                        break;
+                    } else {
+                        tCount --;
+                    }
+
+                    meNode = DepthWiseStepTraverser ((node<long>*)nil);
+                }
+            }
+        }
+        if (!rerootAt.sLength) {
+            rerootAt = "Unequal topologies (matching label sets).";
+        }
+    } else {
+        rerootAt = "Unequal label sets.";
+    }
+
+    destroyCompTree (myCT);
+    destroyCompTree (otherCT);
+
+    return          rerootAt;
+}
+
+//_______________________________________________________________________________________________
+
+node<long>* _TreeTopology::prepTree4Comparison (_List& leafNames, _SimpleList& mapping, node<long>* topNode)
+{
+    node<long>* res     = topNode?topNode->duplicate_tree():theRoot->duplicate_tree(),
+                * meNode;
+
+    checkPointer (res);
+
+    meNode =        DepthWiseStepTraverser (res);
+
+    _SimpleList     indexer;
+
+    while (meNode) {
+        long        numChildren = meNode->get_num_nodes();
+
+        _SimpleList * descendants = new _SimpleList;
+        checkPointer (descendants);
+        if (numChildren) {
+            for (long k = 1; k <= numChildren; k++) {
+                node <long> * aChild = meNode->go_down(k);
+                (*descendants) << *(_SimpleList*)aChild->in_object;
+            }
+        } else {
+            (*descendants) << leafNames.lLength;
+            indexer        << leafNames.lLength;
+            _String     * dd = (_String*)checkPointer(new _String);// (*LocateVar (meNode->in_object)->GetName(),treeNameLength,-1);
+            GetNodeName (meNode, *dd);
+            leafNames.AppendNewInstance (dd);
+        }
+
+        meNode->in_object = (long)descendants;
+        meNode = DepthWiseStepTraverser ((node<long>*)nil);
+    }
+
+    // now sort leaf names and build the indexer
+
+    mapping.Clear();
+    mapping.Duplicate (&indexer);
+
+    SortLists (&leafNames, &indexer);
+    SortLists (&indexer, &mapping);
+
+    return res;
+}
+
+//_______________________________________________________________________________________________
+
+void    _TreeTopology::destroyCompTree (node<long>* compRoot)
+{
+    long    nc = compRoot->get_num_nodes();
+    for (int i=1; i<=nc; i++) {
+        destroyCompTree (compRoot->go_down(i));
+    }
+
+    DeleteObject ((BaseRef)compRoot->in_object);
+    delete (compRoot);
+}
+
+//_______________________________________________________________________________________________
+
+
+bool    _TheTree::MatchLeavesToDF (_SimpleList& tipMatches, _DataSetFilter* df, bool doNumeric)
+{
+    tipMatches.Clear();
+    _CalcNode*      travNode = StepWiseTraversal(true);
+    _List           tips;
+    long            j,k;
+
+    while (travNode) {
+        if (IsCurrentNodeATip()) {
+            _String tipName (travNode->GetName()->Cut(travNode->GetName()->FindBackwards('.',0,-1)+1,-1));
+            tips&& &tipName;
+        }
+        travNode = StepWiseTraversal(false);
+    }
+
+    /*for (j=0;j<tips.lLength;j++)
+    {
+        k = df->FindSpeciesName((_String*)tips(j));
+        if (k==-1) break;
+        tipMatches<<k;
+    }*/
+
+    j = df->FindSpeciesName (tips, tipMatches);
+
+    if (doNumeric) {
+        if (j!=tips.lLength) {
+            long sj = j;
+            for (j=0; j<tips.lLength; j++) {
+                _String *thisName = (_String*)tips(j);
+                k = atoi (thisName->sData);
+                _String tryAgain (k);
+                if ((tryAgain.Equal(thisName))&&(k<=tips.lLength)) {
+                    tipMatches<<k;
+                } else {
+                    break;
+                }
+            }
+            if (j==tips.lLength) {
+                if (tipMatches.Find(0)==-1) // map to indexing from 0
+                    for (j=0; j<tips.lLength; j++) {
+                        tipMatches.lData[j]--;
+                    }
+            } else {
+                j=sj;
+            }
+        }
+    }
+
+    return (j == tips.lLength);
+}
+//_______________________________________________________________________________________________
+
+_List*  _TreeTopology::SplitTreeIntoClustersInt (node<long>* , _List* , _AVLListX& , long , long )
+// returns the list of nodes included in the splits BELOW trav1
+{
+    /*_List * dependancies = nil;
+
+    for (long k = trav1->get_num_nodes(); k; k--)
+    {
+        _List * me = SplitTreeIntoClustersInt(trav1->go_down(k), res, counts, size, tol);
+        if (me)
+        {
+            if (!dependancies)
+                checkPointer (dependancies = new _List);
+
+            (*dependancies) << (*me);
+            DeleteObject (me);
+        }
+    }
+
+    long distinctElements = counts.GetXtra (counts.Find((BaseRef)trav1->in_object)),
+         dLength = dependancies?dependancies->lLength:0;
+
+    if (((trav1->parent==nil)||(distinctElements+dLength>=size-tol))&&(distinctElements+dLength<=size+tol))
+    {
+        _List   entry;
+        _String nName;
+        GetNodeName (trav1, nName);
+        entry && & nName;
+        entry && & _Constant (distinctElements);
+        if (dependancies)
+            entry << (*dependancies);
+        (*res) && & entry;
+
+        trav1 = trav1->parent;
+        while (trav1)
+        {
+            long aidx = counts.Find((BaseRef)trav1->in_object);
+            counts.SetXtra(aidx,counts.GetXtra (aidx) - distinctElements);
+            trav1 = trav1->parent;
+        }
+
+        if (dependancies)
+            dependancies->Clear();
+        else
+            checkPointer (dependancies = new _List);
+
+        (*dependancies) && & nName;
+    }
+
+    return dependancies;*/
+
+    // decide if child or i-node
+
+    /*if (trav1->get_num_nodes())
+    {
+
+    }
+    else
+    {
+        node <long>* pn = trav1->parent;
+
+        while (pn)
+        {
+            long pidx = counts.Find((BaseRef)pn->in_object);
+
+        }
+    }*/
+    // TBI
+    return new _List;
+}
+
+//_______________________________________________________________________________________________
+
+_List*  _TreeTopology::SplitTreeIntoClusters (unsigned long size, unsigned long tol)
+// assume fixed rooting for now
+// returns the list of list speccing pointers to calcnodes rooting the splits
+// the member list contains 2 or more entries for each node:
+// itself, the number of (independent)leaves encompassed by that node,
+// and an optional references to the node whose
+// results it depends on.
+
+// assumes that size-tol>=2
+
+{
+    _SimpleList     counts;
+    _AVLListX       cavl (&counts);
+
+    DepthWiseT      (true);
+
+    while (currentNode) {
+        long nC = currentNode->get_num_nodes();
+        if (nC) {
+            long c = 0;
+            for (long k=1; k<=nC; k++) {
+                c += counts.lData[currentNode->go_down(k)->in_object];
+            }
+            cavl.Insert((BaseRef)currentNode->in_object,c);
+        } else {
+            cavl.Insert((BaseRef)currentNode->in_object,1);
+        }
+
+        DepthWiseT (false);
+    }
+
+    _List*                    result = new _List;
+    checkPointer             (result);
+
+    DeleteObject(SplitTreeIntoClustersInt (theRoot, result, cavl, size, tol));
+
+    return           result;
+}
+
+//_______________________________________________________________________________________________
+
+_String _TreeTopology::MatchTreePattern (_TreeTopology* compareTo)
+// the pattern is this
+// compare to is the potential match
+{
+    _List           myLeaves,
+                    otherLeaves,
+                    overlappedLeaves;
+
+    _SimpleList     indexer,
+                    otherIndexer;
+
+    node<long>      *myCT,
+         *otherCT;
+
+    _String         rerootAt;
+
+    myCT            = prepTree4Comparison(myLeaves, indexer);
+    otherCT         = compareTo->prepTree4Comparison(otherLeaves, otherIndexer);
+
+
+    _SimpleList      matchedLeaves;
+
+    overlappedLeaves.Intersect (myLeaves, otherLeaves,&matchedLeaves);
+
+    if ((myLeaves.lLength>=otherLeaves.lLength)&&(overlappedLeaves.lLength == otherLeaves.lLength)) {
+        if (myLeaves.lLength>otherLeaves.lLength) {
+            // map leaves back to ordering space
+
+
+
+            // trim the pattern tree
+            _SimpleList     allowedLeaves  ((unsigned long)myLeaves.lLength),
+                            recordTransfer ((unsigned long)myLeaves.lLength),
+                            invertedMap    ((unsigned long)myLeaves.lLength);
+
+            allowedLeaves.lLength  = myLeaves.lLength;
+            recordTransfer.lLength = myLeaves.lLength;
+            invertedMap.lLength    = myLeaves.lLength;
+
+            for (long giantsSuck = 0; giantsSuck < myLeaves.lLength; giantsSuck++) {
+                invertedMap.lData[indexer.lData[giantsSuck]] = giantsSuck;
+            }
+
+            for (long padresSuck = 0; padresSuck < matchedLeaves.lLength; padresSuck ++) {
+                allowedLeaves.lData[invertedMap.lData[matchedLeaves.lData[padresSuck]]] = 1;
+            }
+
+            long slider = 0;
+
+            for (long dodgersSuck = 0; dodgersSuck < recordTransfer.lLength; dodgersSuck ++)
+                if (allowedLeaves.lData[dodgersSuck]) {
+                    recordTransfer [dodgersSuck] = slider++;
+                }
+
+            // pass 1 - delete all the superfluous leaves
+            node<long> * padresStillSuck = DepthWiseStepTraverser (myCT);
+            while (padresStillSuck != myCT) {
+                if (padresStillSuck->get_num_nodes() == 0) {
+                    _SimpleList*  descendants = ((_SimpleList*)padresStillSuck->in_object);
+
+                    if ((descendants&&(allowedLeaves.lData[descendants->lData[0]] == 0))||(!descendants)) {
+                        // mark this node for deletion
+                        if (descendants) {
+                            DeleteObject(descendants);
+                        }
+
+                        node<long>* sacLamb = padresStillSuck;
+                        padresStillSuck = DepthWiseStepTraverser ((node<long>*)nil);
+
+                        if (sacLamb->parent->get_num_nodes()==1) {
+                            DeleteObject((BaseRef)sacLamb->parent->in_object);
+                            sacLamb->parent->in_object = nil;
+                        }
+
+                        sacLamb->parent->detach_child (sacLamb->get_child_num());
+                        delete (sacLamb);
+                        continue;
+                    }
+                }
+                padresStillSuck = DepthWiseStepTraverser ((node<long>*)nil);
+            }
+
+            // pass 2 - prune internal nodes with exactly one child
+
+            // >O
+            padresStillSuck = DepthWiseStepTraverser (myCT);
+
+            while (padresStillSuck) {
+                long nn = padresStillSuck->get_num_nodes();
+                if (nn == 1) {
+                    node<long>* loneChild = padresStillSuck->go_down(1);
+                    DeleteObject((_SimpleList*)padresStillSuck->in_object);
+                    padresStillSuck->in_object = loneChild->in_object;
+                    padresStillSuck->detach_child (1);
+                    delete (loneChild);
+                } else {
+                    if (nn > 1) {
+                        _SimpleList * myDescs = (_SimpleList*)padresStillSuck->in_object;
+                        myDescs->Clear();
+
+                        for (long cc = 1; cc <= nn; cc++) {
+                            _SimpleList temp;
+
+                            temp.Union (*myDescs, *(_SimpleList*)padresStillSuck->go_down(cc)->in_object);
+
+                            myDescs->Clear();
+                            myDescs->Duplicate (&temp);
+                        }
+
+                        /*for (long cc2 = 0; cc2 < myDescs->lLength; cc2++)
+                            myDescs->lData[cc2] = recordTransfer.lData[myDescs->lData[cc2]];*/
+                    } else {
+                        ((_SimpleList*)padresStillSuck->in_object)->lData[0] = recordTransfer.lData[((_SimpleList*)padresStillSuck->in_object)->lData[0]];
+                    }
+
+                }
+                padresStillSuck = DepthWiseStepTraverser ((node<long>*)nil);
+            }
+
+            _List   newLeaves;
+            recordTransfer.Clear();
+            invertedMap.Clear();
+
+            for (long lc = 0; lc < allowedLeaves.lLength; lc++)
+                if (allowedLeaves.lData[lc]) {
+                    recordTransfer << newLeaves.lLength;
+                    invertedMap << newLeaves.lLength;
+                    newLeaves << myLeaves (indexer.lData[lc]);
+                }
+
+            SortLists (&newLeaves, &recordTransfer);
+            SortLists (&recordTransfer,&invertedMap);
+            indexer.Clear();
+            indexer.Duplicate (&invertedMap);
+            myLeaves.Clear();
+            myLeaves.Duplicate (&newLeaves);
+
+            // finally check whether the root still has 3 or more children
+
+            if (myCT->get_num_nodes()==2) {
+                node <long>* promoteMe = nil;
+
+                if (myCT->go_down(1)->get_num_nodes ()) {
+                    promoteMe = myCT->go_down(1);
+                } else {
+                    promoteMe = myCT->go_down(2);
+                }
+
+                long nn = promoteMe->get_num_nodes();
+                if (nn) {
+                    for (long cc = 1; cc <= nn; cc++) {
+                        myCT->add_node (*promoteMe->go_down(cc));
+                    }
+
+                    myCT->detach_child (promoteMe->get_child_num());
+                    DeleteObject ((BaseRef)promoteMe->in_object);
+                    delete promoteMe;
+                } else {
+                    WarnError ("Internal tree pattern error in MatchTreePattern");
+                    return   "Unequal: Error";
+                }
+            }
+        }
+
+        _SimpleList * reindexer = nil;
+
+        if (!indexer.Equal (otherIndexer)) {
+            _SimpleList ilist ((unsigned long)myLeaves.lLength);
+            ilist.lLength = myLeaves.lLength;
+
+            for (long k2 = 0; k2 < indexer.lLength; k2++) {
+                ilist.lData[indexer.lData[k2]] = k2;
+            }
+
+            for (long k3 = 0; k3<otherIndexer.lLength; k3++) {
+                otherIndexer.lData[k3] = ilist.lData[otherIndexer.lData[k3]];
+            }
+
+            reindexer = &otherIndexer;
+        }
+
+        char compRes;
+
+        if ((compRes=internalTreeCompare (myCT, otherCT, reindexer, 1, myLeaves.lLength, nil, compareTo, true))>0) {
+            rerootAt = "Equal w/o rerooting.";
+        } else {
+            long   tCount = 0;
+
+            node<long>* meNode = DepthWiseStepTraverser (otherCT);
+
+            while (meNode!=otherCT) {
+                if (meNode->get_num_nodes()) {
+                    compRes = internalTreeCompare (myCT, meNode, reindexer, 1, myLeaves.lLength, nil, compareTo, true);
+                    if (compRes>0) {
+                        break;
+                    } else if (compRes) {
+                        meNode = otherCT;
+                        break;
+                    }
+                }
+
+                tCount ++;
+                meNode = DepthWiseStepTraverser ((node<long>*)nil);
+            }
+
+            if (meNode!=otherCT) {
+                meNode = DepthWiseStepTraverser (compareTo->theRoot);
+                while (meNode!=theRoot) {
+                    if (tCount==1) {
+                        rerootAt = _String("Equal with reroot at ") & *LocateVar (meNode->in_object)->GetName() & '.';
+                        break;
+                    } else {
+                        tCount --;
+                    }
+
+                    meNode = DepthWiseStepTraverser ((node<long>*)nil);
+                }
+            }
+        }
+        if (!rerootAt.sLength) {
+            rerootAt = "Unequal topologies (matching label sets).";
+        }
+    } else {
+        rerootAt = "Unequal label sets.";
+    }
+
+    destroyCompTree (myCT);
+    destroyCompTree (otherCT);
+    return          rerootAt;
+}
+
+//_______________________________________________________________________________________________
+
+void     _TheTree::AddNodeNamesToDS (_DataSet* ds, bool doTips, bool doInternals, char dOrS)
+{
+    if (dOrS == 2 && doTips && doInternals) {
+        AddNodeNamesToDS (ds, false, true, 0);
+        AddNodeNamesToDS (ds, true, false, 0);
+        return;
+    }
+
+    _CalcNode*iNodeTraverser = dOrS?DepthWiseTraversal (true) :StepWiseTraversal (true);
+
+    long j = GetName()->sLength+1;
+
+
+    while (iNodeTraverser) {
+        if (IsCurrentNodeATip()) {
+            if (doTips) {
+                ds->GetNames().AppendNewInstance(new _String (*iNodeTraverser->GetName(), j, -1));
+            }
+        } else if (doInternals) {
+            ds->GetNames().AppendNewInstance(new _String (*iNodeTraverser->GetName(), j, -1));
+        }
+
+        iNodeTraverser = dOrS?DepthWiseTraversal (false) :StepWiseTraversal (false);
+    }
+}
diff --git a/src/core/calcnode2.cpp b/src/core/calcnode2.cpp
new file mode 100644
index 0000000..f06d8a6
--- /dev/null
+++ b/src/core/calcnode2.cpp
@@ -0,0 +1,2485 @@
+/*
+
+HyPhy - Hypothesis Testing Using Phylogenies.
+
+Copyright (C) 1997-now
+Core Developers:
+  Sergei L Kosakovsky Pond (spond at ucsd.edu)
+  Art FY Poon    (apoon at cfenet.ubc.ca)
+  Steven Weaver (sweaver at ucsd.edu)
+  
+Module Developers:
+	Lance Hepler (nlhepler at gmail.com)
+	Martin Smith (martin.audacis at gmail.com)
+
+Significant contributions from:
+  Spencer V Muse (muse at stat.ncsu.edu)
+  Simon DW Frost (sdf22 at cam.ac.uk)
+
+Permission is hereby granted, free of charge, to any person obtaining a
+copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be included
+in all copies or substantial portions of the Software.
+
+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.
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+*/
+
+#include "calcnode.h"
+#include "likefunc.h"
+#include "scfg.h"
+#include <math.h>
+#include <float.h>
+
+#ifdef    __HYPHYDMALLOC__
+#include "dmalloc.h"
+#endif
+
+
+//#define _UBER_VERBOSE_DUMP_MATRICES
+//#define _UBER_VERBOSE_DUMP 27
+
+extern  long likeFuncEvalCallCount,
+        matrixExpCount;
+
+#ifdef MDSOCL
+int launchmdsocl(long siteCount,
+                 long nodeCount,
+                 long alphabetDimension,
+                 _SimpleList& updateNodes,
+                 _SimpleList& flatParents,
+                 _SimpleList& flatNodes,
+                 _SimpleList& flatCLeaves,
+                 _SimpleList& flatLeaves,
+                 _SimpleList& flatTree,
+                 _Parameter* iNodeCache,
+                 long* lNodeFlags,
+                 _SimpleList taggedInternals,
+                 _GrowingVector* lNodeResolutions);
+#endif
+
+#ifdef  _SLKP_LFENGINE_REWRITE_
+
+
+_Parameter          _lfScalerUpwards          = pow(2.,200.),
+                    _lfScalingFactorThreshold = 1./_lfScalerUpwards,
+                    _logLFScaler            = 200. *log(2.);
+
+_GrowingVector      _scalerMultipliers,
+                    _scalerDividers;
+
+//_Parameter          eval_buffer [600];
+
+
+/*----------------------------------------------------------------------------------------------------------*/
+
+inline void _handle4x4_pruning_case (double* childVector, double* tMatrix, double* parentConditionals) {
+#ifdef _SLKP_USE_SSE_INTRINSICS
+        double tv [4]     __attribute__ ((aligned (16))) = {childVector[0],
+                                                            childVector[1],
+                                                            childVector[2],
+                                                            childVector[3]};
+                                                    
+        __m128d buffer0 = _mm_loadu_pd (tv),
+                buffer1 = _mm_loadu_pd (tv+2),
+                matrix01 = _mm_loadu_pd (tMatrix),
+                matrix12 = _mm_loadu_pd (tMatrix+2),
+                matrix34 = _mm_loadu_pd (tMatrix+4),
+                matrix56 = _mm_loadu_pd (tMatrix+6),
+                reg_storage  = _mm_mul_pd (buffer0, matrix01),
+                reg_storage2 = _mm_mul_pd (buffer0, matrix34);
+               
+        matrix34     = _mm_mul_pd(buffer1, matrix12);
+        matrix56     = _mm_mul_pd(buffer1, matrix56);
+        reg_storage  = _mm_add_pd (reg_storage, matrix34);
+        reg_storage2 = _mm_add_pd (reg_storage2, matrix56);
+        reg_storage  = _mm_hadd_pd (reg_storage,reg_storage2);
+        matrix01 = _mm_loadu_pd (parentConditionals);
+        matrix01 = _mm_mul_pd (reg_storage, matrix01);
+        _mm_storeu_pd (parentConditionals, matrix01);
+        
+                
+        
+        matrix01 = _mm_loadu_pd (tMatrix+8);
+        matrix12 = _mm_loadu_pd (tMatrix+10);
+        matrix34 = _mm_loadu_pd (tMatrix+12);
+        matrix56 = _mm_loadu_pd (tMatrix+14);
+        reg_storage  = _mm_mul_pd (buffer0, matrix01);
+        reg_storage2 = _mm_mul_pd (buffer0, matrix34);                
+              
+        matrix34     = _mm_mul_pd(buffer1, matrix12);
+        matrix56     = _mm_mul_pd(buffer1, matrix56);
+        reg_storage  = _mm_add_pd (reg_storage, matrix34);
+        reg_storage2 = _mm_add_pd (reg_storage2, matrix56);
+        reg_storage  = _mm_hadd_pd (reg_storage,reg_storage2);
+        
+        matrix01 = _mm_loadu_pd (parentConditionals+2);
+        matrix01 = _mm_mul_pd (reg_storage, matrix01);
+        _mm_storeu_pd (parentConditionals+2, matrix01);
+
+               
+#else  
+        _Parameter t1 = childVector[0] - childVector[3],
+                   t2 = childVector[1] - childVector[3],
+                   t3 = childVector[2] - childVector[3],
+                   t4 = childVector[3];
+                   
+        parentConditionals [0] *= tMatrix[0]  * t1 + tMatrix[1] * t2 + tMatrix[2] * t3 + t4;
+        parentConditionals [1] *= tMatrix[4]  * t1 + tMatrix[5] * t2 + tMatrix[6] * t3 + t4;
+        parentConditionals [2] *= tMatrix[8]  * t1 + tMatrix[9] * t2 + tMatrix[10] * t3 + t4;
+        parentConditionals [3] *= tMatrix[12] * t1 + tMatrix[13] * t2 + tMatrix[14] * t3 + t4;
+#endif
+
+}
+
+/*----------------------------------------------------------------------------------------------------------*/
+
+_Parameter  acquireScalerMultiplier (long s)
+{
+    if (s>0) {
+        if (s >= _scalerMultipliers.used)
+            for (long k = _scalerMultipliers.used; k <= s; k++) {
+                _scalerMultipliers.Store (exp (-_logLFScaler * k));
+            }
+        return _scalerMultipliers.theData[s];
+    }
+    s = -s;
+    if (s >= _scalerDividers.used)
+        for (long k = _scalerDividers.used; k <= s; k++) {
+            _scalerDividers.Store (exp (_logLFScaler * k));
+        }
+    return _scalerDividers.theData[s];
+}
+
+/*----------------------------------------------------------------------------------------------------------*/
+void        _TheTree::ExponentiateMatrices  (_List& expNodes, long tc, long catID)
+{
+    _List           matrixQueue,
+                    nodesToDo;
+                    
+    _SimpleList     isExplicitForm;
+    bool            hasExpForm = false;
+
+    for (unsigned long nodeID = 0; nodeID < expNodes.lLength; nodeID++) {
+        long didIncrease = matrixQueue.lLength;
+        _CalcNode* thisNode = (_CalcNode*) expNodes(nodeID);
+        if (thisNode->RecomputeMatrix (catID, categoryCount, nil, &matrixQueue,&isExplicitForm)) {
+             hasExpForm = true;
+        }
+        #ifdef _UBER_VERBOSE_DUMP
+          if (likeFuncEvalCallCount == _UBER_VERBOSE_DUMP)
+            printf ("NodeID %d (%s). Old length %ld, new length %ld\n", nodeID, thisNode->GetName()->sData, didIncrease,matrixQueue.lLength); 
+        #endif
+        if ((didIncrease = (matrixQueue.lLength - didIncrease))) {
+            for (long copies = 0; copies < didIncrease; copies++) {
+                nodesToDo << thisNode;
+            }
+        }
+    }
+    
+    //printf ("%ld %d\n", nodesToDo.lLength, hasExpForm);
+
+    unsigned long matrixID;
+    
+    _List * computedExponentials = hasExpForm? new _List (matrixQueue.lLength) : nil;
+    
+#ifdef _OPENMP
+    unsigned long nt = cBase<20?1:(MIN(tc, matrixQueue.lLength / 3 + 1));
+    matrixExpCount += matrixQueue.lLength;
+#endif
+
+    #pragma omp parallel for default(shared) private (matrixID) schedule(static) if (nt>1)  num_threads (nt)
+    for  (matrixID = 0; matrixID < matrixQueue.lLength; matrixID++) {
+        if (isExplicitForm.lData[matrixID] == 0) { // normal matrix to exponentiate
+            ((_CalcNode*) nodesToDo(matrixID))->SetCompExp (((_Matrix*)matrixQueue(matrixID))->Exponentiate(), catID);
+        } else {
+             (*computedExponentials) [matrixID] = ((_Matrix*)matrixQueue(matrixID))->Exponentiate();
+        }
+    }
+    
+    
+  
+
+
+    if (computedExponentials) {
+        _CalcNode * current_node         = nil;
+        _List       buffered_exponentials;
+        
+        for (unsigned long mx_index = 0; mx_index < nodesToDo.lLength; mx_index++) {
+            if (isExplicitForm.lData[mx_index]) {
+                _CalcNode *next_node = (_CalcNode*) nodesToDo (mx_index);
+                //printf ("%x %x\n", current_node, next_node);
+                if (next_node != current_node) {
+                    if (current_node) {
+                        current_node->RecomputeMatrix (catID, categoryCount, nil, nil, nil, &buffered_exponentials);
+                    }
+                    current_node = next_node;
+                    buffered_exponentials.Clear(true);
+                    buffered_exponentials.AppendNewInstance((*computedExponentials)(mx_index));
+                 }
+                else {
+                    buffered_exponentials.AppendNewInstance((*computedExponentials)(mx_index));
+                }
+            } else {
+                if (current_node) {
+                    current_node->RecomputeMatrix (catID, categoryCount, nil, nil, nil, &buffered_exponentials);
+                }
+                current_node = nil;
+            }
+        }
+        if (current_node) {
+            current_node->RecomputeMatrix (catID, categoryCount, nil, nil, nil, &buffered_exponentials);
+        }
+        DeleteObject(computedExponentials);
+    #ifdef _UBER_VERBOSE_DUMP_MATRICES
+      if (likeFuncEvalCallCount == _UBER_VERBOSE_DUMP) {
+        fprintf (stderr, "\n T_MATRIX = {"); 
+        for (unsigned long nodeID = 0; nodeID < flatLeaves.lLength + flatTree.lLength - 1; nodeID++) {
+            bool    isLeaf     = nodeID < flatLeaves.lLength;
+
+            _CalcNode * current_node = isLeaf? (((_CalcNode**) flatCLeaves.lData)[nodeID]):
+                              (((_CalcNode**) flatTree.lData)  [nodeID - flatLeaves.lLength]);
+            if (nodeID) {
+              fprintf (stderr, ",");
+            }
+            fprintf (stderr, "\n\"%s\":%s", current_node->GetName()->sData, _String((_String*)current_node->GetCompExp()->toStr()).sData); 
+            
+          }
+        fprintf (stderr, "\n};\n"); 
+      }
+    #endif
+
+
+    }
+}
+
+/*----------------------------------------------------------------------------------------------------------*/
+
+long        _TheTree::DetermineNodesForUpdate   (_SimpleList& updateNodes, _List* expNodes, long catID, long addOne, bool canClear)
+{
+    nodesToUpdate.Populate (flatLeaves.lLength + flatTree.lLength - 1, 0, 0);
+    _CalcNode       *currentTreeNode;
+    long            lastNodeID = -1;
+
+    // look for nodes with model changes and mark the path up to the root as needing an update
+
+
+    if (addOne >= 0) {
+        nodesToUpdate.lData[addOne] = 1;
+    }
+
+    if (forceRecalculationOnTheseBranches.lLength) {
+        for (unsigned long markedNode = 0; markedNode < forceRecalculationOnTheseBranches.lLength; markedNode++) {
+            nodesToUpdate.lData[forceRecalculationOnTheseBranches.lData[markedNode]] = 1;
+        }
+
+        if (canClear) {
+            forceRecalculationOnTheseBranches.Clear();
+        }
+    }
+
+    for (unsigned long nodeID = 0; nodeID < nodesToUpdate.lLength; nodeID++) {
+        bool    isLeaf     = nodeID < flatLeaves.lLength;
+
+        currentTreeNode = isLeaf? (((_CalcNode**) flatCLeaves.lData)[nodeID]):
+                          (((_CalcNode**) flatTree.lData)  [nodeID - flatLeaves.lLength]);
+
+        if (currentTreeNode->NeedToExponentiate (catID)) {
+            if (expNodes) {
+                (*expNodes) << currentTreeNode;
+                //printf ("EXP>%s\n", currentTreeNode->GetName()->sData);
+                lastNodeID = nodeID;
+            } else {
+                currentTreeNode->RecomputeMatrix (catID, categoryCount, nil);
+            }
+
+            nodesToUpdate.lData[nodeID] = 1;
+        }
+
+        if (nodesToUpdate.lData[nodeID]) {
+            nodesToUpdate.lData[flatParents.lData[nodeID]+flatLeaves.lLength] = 1;
+        }
+    }
+
+
+    // one more pass to pick up all descendants of changed internal nodes
+
+    for (unsigned long nodeID = 0; nodeID < nodesToUpdate.lLength; nodeID++)
+        if (nodesToUpdate.lData[flatLeaves.lLength+flatParents.lData[nodeID]] && nodesToUpdate.lData[nodeID] == 0) {
+            nodesToUpdate.lData[nodeID] = 1;
+        }
+
+    // write out all changed nodes
+
+    for (unsigned long nodeID = 0; nodeID < nodesToUpdate.lLength; nodeID++)
+        if (nodesToUpdate.lData[nodeID]) {
+            updateNodes << nodeID;
+        }
+
+    if (expNodes && expNodes->lLength == 1) {
+        return lastNodeID;
+    }
+
+    return -1;
+}
+
+/*----------------------------------------------------------------------------------------------------------*/
+
+void        _TheTree::FillInConditionals        (_DataSetFilter*        theFilter, _Parameter*  iNodeCache,  _SimpleList*   tcc)
+// this utility function will simply fill in all the conditional probability vectors for internal nodes,
+// including those that were skipped due to column sorting optimization
+// this is useful to avoid code duplication for other functions (e.g. ancestral sampling) that
+// make use of conditional probability vectors, but would not benefit from subtree caching
+{
+    if (!tcc) {
+        return;
+    }
+
+    long            alphabetDimension     =         theFilter->GetDimension(),
+                    siteCount           =         theFilter->NumberDistinctSites();
+
+    for  (long nodeID = 0; nodeID < flatTree.lLength; nodeID++) {
+        _Parameter * conditionals       = iNodeCache +(nodeID  * siteCount) * alphabetDimension;
+        long        currentTCCIndex     = siteCount * nodeID,
+                    currentTCCBit        = currentTCCIndex % _HY_BITMASK_WIDTH_;
+
+        currentTCCIndex /= _HY_BITMASK_WIDTH_;
+        for (long siteID = 0; siteID < siteCount; siteID++, conditionals += alphabetDimension) {
+            if (siteID  && (tcc->lData[currentTCCIndex] & bitMaskArray.masks[currentTCCBit]) > 0) {
+                for (long k = 0; k < alphabetDimension; k++) {
+                    conditionals[k] = conditionals[k-alphabetDimension];
+                }
+            }
+            if (++currentTCCBit == _HY_BITMASK_WIDTH_) {
+                currentTCCBit   = 0;
+                currentTCCIndex ++;
+            }
+
+        }
+    }
+}
+
+/*----------------------------------------------------------------------------------------------------------*/
+
+#ifdef MDSOCL
+_Parameter _TheTree::OCLLikelihoodEvaluator (			_SimpleList&		     updateNodes, 
+														_DataSetFilter*		 theFilter,
+                                                        _Parameter*			 iNodeCache,
+                                                        long	   *			 lNodeFlags,
+                                                        _GrowingVector*		 lNodeResolutions,
+														_OCLEvaluator& OCLEval)
+{
+
+	_SimpleList		taggedInternals					(flatNodes.lLength, 0, 0);
+	//printf("Launching a tree in OpenCL...\n");
+	return ((_Parameter) OCLEval.launchmdsocl(			updateNodes,
+														flatParents,
+														flatNodes,
+														flatCLeaves,
+														flatLeaves,
+														flatTree,
+														theProbs,
+														theFilter->theFrequencies,
+														lNodeFlags,
+														taggedInternals,
+														lNodeResolutions));
+}
+
+#endif
+
+/*----------------------------------------------------------------------------------------------------------*/
+
+_Parameter  _TheTree::VerySimpleLikelihoodEvaluator   (_SimpleList&          updateNodes,
+        _DataSetFilter*      theFilter,
+        _Parameter*          iNodeCache,
+        long       *             lNodeFlags,
+        _GrowingVector*      lNodeResolutions)
+{
+// set some useful global variables
+    _SimpleList     taggedInternals                 (flatNodes.lLength, 0, 0);
+    // as we are traversing the tree, we are ensuring that each node which changes
+    // forces the parent to change and preps the parent cache for computations
+    // by zeroing everything out
+
+    // flatNodes is the array of indices (post-order traveral) of _internal nodes_
+    // for example ((A,C)N1,D,(B,E)N2)Root will have
+    // N1 (index 0), N2 (index 1), Root (index 2) in this array
+
+    long            alphabetDimension     =         theFilter->GetDimension(),
+                    // the number of characters (and the dimension of transition matrices)
+
+                    siteCount           =         theFilter->NumberDistinctSites();
+    // how many unique sites are there
+
+    for  (long nodeID = 0; nodeID < updateNodes.lLength; nodeID++) {
+        long    nodeCode   = updateNodes.lData [nodeID],
+                parentCode = flatParents.lData [nodeCode];
+        // the INDEX of the parent node for the current node;
+        // this list (a member of _TheTree is computed when the tree is created
+        // for ((A,C)N1,D,(B,E)N2)Root this array will store
+        // 0 (A), 0(C), 2(D), 1(B), 1(E), 2(N1), 2(N3), -1 (root)
+
+        bool    isLeaf     = nodeCode < flatLeaves.lLength;
+
+        if (!isLeaf) {
+            nodeCode -=  flatLeaves.lLength;
+        }
+
+        _Parameter * parentConditionals = iNodeCache +  (parentCode  * siteCount) * alphabetDimension;
+        // this is a convenience pointer into the global cache
+        // each node will have siteCount*alphabetDimension contiguous doubles
+
+
+
+        if (taggedInternals.lData[parentCode] == 0)
+            // mark the parent for update and clear its conditionals if needed
+        {
+            taggedInternals.lData[parentCode]     = 1; // only do this once
+            for (long k = 0, k3 = 0; k < siteCount; k++)
+                for (long k2 = 0; k2 < alphabetDimension; k2++) {
+                    parentConditionals [k3++] = 1.0;
+                }
+        }
+
+
+
+        _Parameter  *       tMatrix = (isLeaf? ((_CalcNode*) flatCLeaves (nodeCode)):
+                                       ((_CalcNode*) flatTree    (nodeCode)))->GetCompExp(0)->theData;
+        // in the host code the transition matrix is retrieved from the _CalcNode object
+        // in the devide code there will probably be another array to grab it from
+
+        _Parameter  *       childVector; // the vector of conditional probabilities for
+        // THIS node (nodeCode)
+
+        if (!isLeaf) {
+            childVector = iNodeCache + (nodeCode * siteCount) * alphabetDimension;
+        }
+        // if THIS node is internal, simply look up the conditional vector in the same cache
+        // as the parent (just a different offset)
+
+        for (long siteID = 0; siteID < siteCount; siteID++,
+                parentConditionals += alphabetDimension) {
+            _Parameter  sum      = 0.0;
+
+            if (isLeaf)
+                // the leaves do NOT have a conditional probability vector because most of them are fully resolved
+                // For example the codon AAG is going to map to (AAA)0,(AAC)0,(AAG)1,.....,(TTT)0, so we can
+                // just store this as index 2, which says to put a '1' in the 2-nd index of the array (and assume the rest are 0)
+                // this is stored in lNodeFlags
+                // For ambiguous codons, e.g. AAR = {AAA,AAG}, the host code will resolve this to 1,0,1,0,...0 at prep time (because this will never change)
+                // and stores it in the lNodeResolutions (say at index K) and puts -K-1 into lNodeFlags, so that we now have to look it up here
+            {
+                long siteState = lNodeFlags[nodeCode*siteCount + siteID] ;
+
+                if (siteState >= 0)
+                    // a single character state; sweep down the appropriate column
+                    // note that one of the loops (over child state) drops out, since there is only one state
+                {
+                    long matrixIndex =  siteState;
+                    for (long k = 0; k < alphabetDimension; k++, matrixIndex += alphabetDimension) {
+                        parentConditionals[k] *= tMatrix[matrixIndex];
+                    }
+                    continue; // nothing else to do, move to the next site
+                } else {
+                    childVector = lNodeResolutions->theData + (-siteState-1) * alphabetDimension;
+                }
+                // look up the resolution for the ambugious node -- this will have to be on the device as well
+                // but can be in constant memory
+            }
+
+            _Parameter *matrixPointer = tMatrix;
+
+            for (long p = 0; p < alphabetDimension; p++) {
+                _Parameter      accumulator = 0.0;
+
+                for (long c = 0; c < alphabetDimension; c++) {
+                    accumulator +=  matrixPointer[c]   * childVector[c];
+                }
+
+                matrixPointer                 += alphabetDimension;
+
+                sum += (parentConditionals[p] *= accumulator);
+            }
+
+            // if (sum < small_number) -- handle underflow
+
+            childVector    += alphabetDimension;
+            // shift the position in childvector to the next site
+        }
+    }
+
+    // now just process the root and return the likelihood
+
+    _Parameter  * rootConditionals = iNodeCache + alphabetDimension * ((flatTree.lLength-1)  * siteCount),
+                  // the root is always the LAST internal node in all lists
+                  result = 0.0;
+
+
+    for (long siteID = 0; siteID < siteCount; siteID++) {
+        _Parameter accumulator = 0.;
+        for (long p = 0; p < alphabetDimension; p++,rootConditionals++) {
+            accumulator += *rootConditionals * theProbs[p];
+        }
+        /* theProbs is a member variable of the tree, which basically determines
+           what probability there is to observe a given character at the root
+           in simple cases it is fixed for the duration of optimization, but for more
+           complex models it may change from iteration to iteration
+         */
+        result += log(accumulator) * theFilter->theFrequencies [siteID];
+        // correct for the fact that identical alignment columns may appear more than once
+    }
+
+
+    return result;
+}
+
+
+/*----------------------------------------------------------------------------------------------------------*/
+
+_Parameter      _TheTree::ComputeTreeBlockByBranch  (                   _SimpleList&        siteOrdering,
+        _SimpleList&        updateNodes,
+        _SimpleList*        tcc,
+        _DataSetFilter*     theFilter,
+        _Parameter*         iNodeCache,
+        long      *         lNodeFlags,
+        _Parameter*         scalingAdjustments,
+        _GrowingVector*     lNodeResolutions,
+        long&               overallScaler,
+        long                siteFrom,
+        long                siteTo,
+        long                catID,
+        _Parameter*         storageVec,
+        long*               siteCorrectionCounts,
+        long                setBranch,
+        long*               setBranchTo
+                                                    )
+// the updateNodes flags the nodes (leaves followed by inodes in the same order as flatLeaves and flatNodes)
+// that must be recomputed
+{
+    // process the leaves first
+
+    _SimpleList     taggedInternals                 (flatNodes.lLength, 0, 0);
+    long            alphabetDimension     =         theFilter->GetDimension(),
+                    siteCount           =         theFilter->NumberDistinctSites(),
+                    alphabetDimensionmod4  =      alphabetDimension-alphabetDimension%4;
+
+    _CalcNode       *currentTreeNode;
+    long            localScalerChange     =         0;
+
+    if (siteTo  > siteCount)    {
+        siteTo = siteCount;
+    }
+
+    for  (unsigned long nodeID = 0; nodeID < updateNodes.lLength; nodeID++) {
+        long    nodeCode   = updateNodes.lData [nodeID],
+                parentCode = flatParents.lData [nodeCode];
+
+        bool    isLeaf     = nodeCode < flatLeaves.lLength;
+
+        if (!isLeaf) {
+            nodeCode -=  flatLeaves.lLength;
+        }
+
+        _Parameter * parentConditionals = iNodeCache +            (siteFrom + parentCode  * siteCount) * alphabetDimension;
+        if (taggedInternals.lData[parentCode] == 0)
+            // mark the parent for update and clear its conditionals if needed
+        {
+            taggedInternals.lData[parentCode]     = 1;
+            _Parameter      _hprestrict_ *localScalingFactor      = scalingAdjustments + parentCode*siteCount;
+
+            bool    matchSet   = (parentCode == setBranch);
+
+            if (alphabetDimension == 4) {
+                long k3     = 0;
+                if (matchSet)
+                    for (long k = siteFrom; k < siteTo; k++, k3+=4) {
+                        parentConditionals [k3]   = 0.;
+                        parentConditionals [k3+1] = 0.;
+                        parentConditionals [k3+2] = 0.;
+                        parentConditionals [k3+3] = 0.;
+                        parentConditionals [k3+setBranchTo[siteOrdering.lData[k]]] = localScalingFactor[k];
+                    }
+                else
+                    for (long k = siteFrom; k < siteTo; k++, k3+=4) {
+                        _Parameter scaler = localScalingFactor[k];
+                        parentConditionals [k3]   = scaler;
+                        parentConditionals [k3+1] = scaler;
+                        parentConditionals [k3+2] = scaler;
+                        parentConditionals [k3+3] = scaler;
+                    }
+            } else {
+                long k3     = 0;
+                if (matchSet) {
+                    for (long k = siteFrom; k < siteTo; k++) {
+                        for (long k2 = 0; k2 < alphabetDimension; k2++) {
+                            parentConditionals [k3+k2] = 0.;
+                        }
+
+                        parentConditionals[k3 + setBranchTo[siteOrdering.lData[k]]] = localScalingFactor[k];
+                        k3                 +=   alphabetDimension;
+                    }
+                } else {
+                    for (long k = siteFrom; k < siteTo; k++) {
+                        _Parameter scaler = localScalingFactor[k];
+                        for (long k2 = 0; k2 < alphabetDimension; k2++, k3++) {
+                            parentConditionals [k3] = scaler;
+                        }
+                    }
+                }
+            }
+        }
+
+        currentTreeNode = isLeaf? ((_CalcNode*) flatCLeaves (nodeCode)):
+                          ((_CalcNode*) flatTree    (nodeCode));
+
+        _Parameter  *       _hprestrict_ transitionMatrix = currentTreeNode->GetCompExp(catID)->theData;
+        _Parameter  *       childVector,
+                    *     lastUpdatedSite;
+
+        if (!isLeaf) {
+            childVector = iNodeCache + (siteFrom + nodeCode * siteCount) * alphabetDimension;
+        }
+
+        long currentTCCIndex        ,
+             currentTCCBit            ,
+             parentTCCIIndex      ,
+             parentTCCIBit            ;
+
+        if (tcc) {
+            parentTCCIIndex = siteCount * parentCode + siteFrom;
+            parentTCCIBit   = parentTCCIIndex % _HY_BITMASK_WIDTH_;
+            parentTCCIIndex = parentTCCIIndex / _HY_BITMASK_WIDTH_;
+            if (! isLeaf) {
+                currentTCCIndex = siteCount * nodeCode + siteFrom;
+                currentTCCBit   = currentTCCIndex % _HY_BITMASK_WIDTH_;
+                currentTCCIndex /= _HY_BITMASK_WIDTH_;
+            }
+        }
+
+        //long successiveSkips = 0;
+
+        for (long siteID = siteFrom; siteID < siteTo; siteID++, parentConditionals += alphabetDimension) {
+            if (tcc) {
+                if (parentTCCIBit == _HY_BITMASK_WIDTH_) {
+                    parentTCCIBit   = 0;
+                    parentTCCIIndex ++;
+                }
+
+                if (siteID > siteFrom && (tcc->lData[parentTCCIIndex] & bitMaskArray.masks[parentTCCIBit]) > 0) {
+                    if (!isLeaf) {
+                        childVector     += alphabetDimension;
+                        if (++currentTCCBit == _HY_BITMASK_WIDTH_) {
+                            currentTCCBit   = 0;
+                            currentTCCIndex ++;
+                        }
+                    }
+                    parentTCCIBit++;
+                    /*
+                    if (likeFuncEvalCallCount == 4 || likeFuncEvalCallCount == 5) {
+                        printf ("\nSKIPPED site %ld @ eval %ld\n", siteID, likeFuncEvalCallCount);
+                    }*/   
+                    continue;
+                }
+                parentTCCIBit++;
+            }
+
+            _Parameter  *tMatrix = transitionMatrix,
+                         sum         = 0.0;
+
+            char        didScale = 0;
+
+            if (isLeaf) {
+                long siteState;
+
+                if (setBranch == nodeCode + flatTree.lLength) {
+                    siteState = setBranchTo[siteOrdering.lData[siteID]] ;
+                } else {
+                    siteState = lNodeFlags[nodeCode*siteCount + siteOrdering.lData[siteID]] ;
+                }
+                if (siteState >= 0)
+                    // a single character state; sweep down the appropriate column
+                {
+                    tMatrix  +=  siteState;
+                    if (alphabetDimension == 4) {
+                        parentConditionals[0] *= tMatrix[0];
+                        parentConditionals[1] *= tMatrix[4];
+                        parentConditionals[2] *= tMatrix[8];
+                        parentConditionals[3] *= tMatrix[12];
+                    } else {
+                        long k = 0;
+                        for (; k < alphabetDimensionmod4; k+=4, tMatrix += alphabetDimension+alphabetDimension+alphabetDimension+alphabetDimension) {
+                            parentConditionals[k]   *= tMatrix[0];
+                            parentConditionals[k+1] *= tMatrix[alphabetDimension];
+                            parentConditionals[k+2] *= tMatrix[alphabetDimension+alphabetDimension];
+                            parentConditionals[k+3] *= tMatrix[alphabetDimension+alphabetDimension+alphabetDimension];
+                        }
+                        for (; k < alphabetDimension; k++, tMatrix += alphabetDimension) {
+                            parentConditionals[k] *= *tMatrix;
+                        }
+                    }
+                    continue;
+                } else {
+                    childVector = lNodeResolutions->theData + (-siteState-1) * alphabetDimension;
+                }
+            } else {
+                if (tcc) {
+                    if ((tcc->lData[currentTCCIndex] & bitMaskArray.masks[currentTCCBit]) > 0 && siteID > siteFrom) {
+                        for (long k = 0; k < alphabetDimension; k++) {
+                            childVector[k] = lastUpdatedSite[k];
+                        }
+                    }
+                    if (++currentTCCBit == _HY_BITMASK_WIDTH_) {
+                        currentTCCBit   = 0;
+                        currentTCCIndex ++;
+                    }
+                    lastUpdatedSite = childVector;
+                }
+            }
+
+            if (alphabetDimension == 4) { // special case for nuc data
+
+                _handle4x4_pruning_case (childVector, tMatrix, parentConditionals);
+
+                // handle scaling if necessary
+                // the check for sum > 0.0 is necessary for 'degenerate' log-L functions (-infinity)
+
+                sum     = parentConditionals [0] + parentConditionals [1] + parentConditionals [2] + parentConditionals [3];
+                if (sum < _lfScalingFactorThreshold && sum > 0.0) {
+                    _Parameter tryScale                                 = scalingAdjustments [parentCode*siteCount + siteID] * _lfScalerUpwards;
+                    if (tryScale < HUGE_VAL) {
+                        parentConditionals [0]                             *= _lfScalerUpwards;
+                        parentConditionals [1]                             *= _lfScalerUpwards;
+                        parentConditionals [2]                             *= _lfScalerUpwards;
+                        parentConditionals [3]                             *= _lfScalerUpwards;
+                        localScalerChange                                  += theFilter->theFrequencies [siteOrdering.lData[siteID]];
+                        scalingAdjustments [parentCode*siteCount + siteID]  = tryScale;
+                        didScale                                            = 1;
+                    }
+                } else {
+                    if (sum > _lfScalerUpwards) {
+                        scalingAdjustments [parentCode*siteCount + siteID] *= _lfScalingFactorThreshold;
+                        parentConditionals [0]                             *= _lfScalingFactorThreshold;
+                        parentConditionals [1]                             *= _lfScalingFactorThreshold;
+                        parentConditionals [2]                             *= _lfScalingFactorThreshold;
+                        parentConditionals [3]                             *= _lfScalingFactorThreshold;
+                        localScalerChange                                  -= theFilter->theFrequencies [siteOrdering.lData[siteID]];
+                        didScale                                            = -1;
+                    }
+                }
+
+                childVector += 4;
+            } else {
+                _Parameter sum = 0.0;
+
+#ifndef _SLKP_SSE_VECTORIZATION_
+
+                if (alphabetDimension > alphabetDimensionmod4){
+                    
+                    /*_Parameter maxParentP = _lfScalingFactorThreshold;
+                    
+                    for (long p = 0; p < alphabetDimension; p++)
+                        if (parentConditionals[p] > maxParentP) {
+                            maxParentP = parentConditionals[p];
+                        } 
+                        
+                    maxParentP *= DBL_EPSILON;  */      
+                    
+#ifdef _SLKP_USE_SSE_INTRINSICS
+                    double buffer[2] __attribute__ ((aligned (16)));
+#endif
+#ifdef _SLKP_USE_AVX_INTRINSICS
+                    double buffer[4] __attribute__ ((aligned (32)));
+#endif
+                    for (long p = 0; p < alphabetDimension; p++) {
+                        /*if (parentConditionals[p] < maxParentP) {
+                            tMatrix               += alphabetDimension;
+                            continue;
+                        }*/
+                        
+                        _Parameter      accumulator = 0.0;
+
+#ifdef _SLKP_USE_SSE_INTRINSICS
+
+                        __m128d buffer1,
+                                buffer2,
+                                buffer3 = _mm_setzero_pd(),
+                                buffer4 = _mm_setzero_pd(),
+                                load1, 
+                                load2,
+                                load3,
+                                load4;
+                                
+                        
+                        if (((long int)tMatrix & 0x1111b) == 0 && ((long int)childVector & 0x1111b) == 0){ 
+                           for (long c = 0; c < alphabetDimensionmod4; c+=4) {
+                                load1 = _mm_load_pd (tMatrix+c);
+                                load2 = _mm_load_pd (tMatrix+c+2);
+                                load3 = _mm_load_pd (childVector+c);
+                                load4 = _mm_load_pd (childVector+c+2);
+                                buffer1 = _mm_mul_pd (load1, load3);
+                                buffer2 = _mm_mul_pd (load2, load4);
+                                buffer3 = _mm_add_pd (buffer1,buffer3);
+                                buffer4 = _mm_add_pd (buffer2,buffer4);
+                            }      
+                        } else {
+                           for (long c = 0; c < alphabetDimensionmod4; c+=4) {
+                                load1 = _mm_loadu_pd (tMatrix+c);
+                                load2 = _mm_loadu_pd (tMatrix+c+2);
+                                load3 = _mm_loadu_pd (childVector+c);
+                                load4 = _mm_loadu_pd (childVector+c+2);
+                                buffer1 = _mm_mul_pd (load1, load3);
+                                buffer2 = _mm_mul_pd (load2, load4);
+                                buffer3 = _mm_add_pd (buffer1,buffer3);
+                                buffer4 = _mm_add_pd (buffer2,buffer4);
+                            }      
+                        
+                        }
+                        
+                        buffer3 = _mm_add_pd (buffer3, buffer4);    
+                        _mm_store_pd (buffer, buffer3);
+                        accumulator = buffer[0] + buffer[1];
+#elif defined _SLKP_USE_AVX_INTRINSICS
+                        
+                        __m256d buffer1,
+                                buffer3 = _mm256_setzero_pd(),
+                                load1,
+                                load3;
+                        
+                        
+                        if (((long int)tMatrix & 0x11111b) == 0 && ((long int)childVector & 0x11111b) == 0){
+                            for (long c = 0; c < alphabetDimensionmod4; c+=4) {
+                                load1 = _mm256_load_pd (tMatrix+c);
+                                load3 = _mm256_load_pd (childVector+c);
+                                buffer1 = _mm256_mul_pd (load1, load3);
+                                buffer3 = _mm256_add_pd (buffer1,buffer3);
+                             }
+                        } else {
+                            for (long c = 0; c < alphabetDimensionmod4; c+=4) {
+                                load1 = _mm256_loadu_pd (tMatrix+c);
+                                load3 = _mm256_loadu_pd (childVector+c);
+                                buffer1 = _mm256_mul_pd (load1, load3);
+                                buffer3 = _mm256_add_pd (buffer1,buffer3);
+                            }
+                            
+                        }
+                        
+                        _mm256_store_pd (buffer, buffer3);
+                        accumulator = buffer[0] + buffer[1] + buffer[2] + buffer[3];
+#else
+                        for (long c = 0; c < alphabetDimensionmod4; c+=4) {
+                        // 4 - unroll the loop
+                             _Parameter pr1 =    tMatrix[c]   * childVector[c],
+                                        pr2 =    tMatrix[c+1] * childVector[c+1],
+                                        pr3 =    tMatrix[c+2] * childVector[c+2],
+                                        pr4 =    tMatrix[c+3] * childVector[c+3];
+                            pr1 += pr2;
+                            pr3 += pr4;
+                            accumulator += pr1+pr3;
+                        }
+#endif
+
+                        for (long c = alphabetDimensionmod4; c < alphabetDimension; c++) {
+                            accumulator +=  tMatrix[c] * childVector[c];
+                        }
+
+                        tMatrix               += alphabetDimension;
+                        sum += (parentConditionals[p] *= accumulator);
+                    }
+                }
+                else
+                    for (long p = 0; p < alphabetDimension; p++) {
+                        _Parameter      accumulator = 0.0;
+
+                        for (long c = 0; c < alphabetDimensionmod4; c+=4) // 4 - unroll the loop
+                            accumulator +=  tMatrix[c]   * childVector[c] +
+                                            tMatrix[c+1] * childVector[c+1] +
+                                            tMatrix[c+2] * childVector[c+2] +
+                                            tMatrix[c+3] * childVector[c+3];
+
+                        tMatrix               += alphabetDimension;
+                        sum += (parentConditionals[p] *= accumulator);
+                    }
+#else
+                for (long p = 0; p < alphabetDimension; p++) {
+                    _Parameter      accumulator = 0.0;
+
+                    for (long c = 0; c < alphabetDimension; c++) {
+                        accumulator +=  tMatrix[c]   * childVector[c];
+                    }
+
+                    tMatrix               += alphabetDimension;
+                    sum += (parentConditionals[p] *= accumulator);
+                }
+
+#endif
+
+
+                if (sum < _lfScalingFactorThreshold && sum > 0.0) {
+                    _Parameter tryScale                                 = scalingAdjustments [parentCode*siteCount + siteID] * _lfScalerUpwards;
+                    if (tryScale < HUGE_VAL) {
+                        scalingAdjustments [parentCode*siteCount + siteID] = tryScale;
+                        for (long c = 0; c < alphabetDimension; c++) {
+                            parentConditionals [c] *= _lfScalerUpwards;
+                        }
+
+                        localScalerChange                                      += theFilter->theFrequencies [siteOrdering.lData[siteID]];
+                        didScale                                                = 1;
+                    }
+                } else {
+                    if (sum > _lfScalerUpwards) {
+                        scalingAdjustments [parentCode*siteCount + siteID] *= _lfScalingFactorThreshold;
+                        for (long c = 0; c < alphabetDimension; c++) {
+                            parentConditionals [c] *= _lfScalingFactorThreshold;
+                        }
+                        localScalerChange                                  -= theFilter->theFrequencies [siteOrdering.lData[siteID]];
+                        didScale                                            = -1;
+                    }
+                }
+                childVector    += alphabetDimension;
+            }
+
+            if (didScale) {
+                if (siteCorrectionCounts) {
+                    siteCorrectionCounts [siteOrdering.lData[siteID]] += didScale;
+                }
+
+                //printf ("NS: site %d node %d \n", siteOrdering.lData[siteID], parentCode);
+
+                if (tcc) {
+                    // look ahead to see if we need to correct for downstream cached nodes
+                    long cparentTCCIIndex   =   parentTCCIIndex,
+                         cparentTCCIBit   =   parentTCCIBit;
+
+                    _Parameter              scM;
+                    if (didScale < 0) {
+                        scM = _lfScalingFactorThreshold;
+                    } else {
+                        scM = _lfScalerUpwards;
+                    }
+
+
+                    for (long sid = siteID + 1; sid < siteTo; sid++,cparentTCCIBit++) {
+                        if (cparentTCCIBit == _HY_BITMASK_WIDTH_) {
+                            cparentTCCIBit   = 0;
+                            cparentTCCIIndex ++;
+                        }
+
+                        if ((tcc->lData[cparentTCCIIndex] & bitMaskArray.masks[cparentTCCIBit]) > 0) {
+                            if (siteCorrectionCounts) {
+                                siteCorrectionCounts [siteOrdering.lData[sid]] += didScale;
+                            }
+                            scalingAdjustments   [parentCode*siteCount + sid] *= scM;
+                            localScalerChange                               += didScale * theFilter->theFrequencies [siteOrdering.lData[sid]];
+                        } else {
+                            break;
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+    // assemble the entire likelihood
+
+    _Parameter _hprestrict_ * rootConditionals = iNodeCache + alphabetDimension * (siteFrom + (flatTree.lLength-1)  * siteCount);
+    _Parameter                result = 0.0;
+
+
+    for (long siteID = siteFrom; siteID < siteTo; siteID++) {
+        _Parameter accumulator = 0.;
+        if (setBranch == flatTree.lLength-1) {
+            long                rootState = setBranchTo[siteOrdering.lData[siteID]];
+            accumulator      += rootConditionals[rootState] * theProbs[rootState];
+            rootConditionals += alphabetDimension;
+        } else
+            for (long p = 0; p < alphabetDimension; p++,rootConditionals++) {
+                accumulator += *rootConditionals * theProbs[p];
+            }
+
+        /*#pragma omp critical
+        {
+            if (likeFuncEvalCallCount == 0) {
+                eval_buffer [siteID] = accumulator;
+            } else {
+                if (!CheckEqual (eval_buffer [siteID], accumulator)) {
+                    printf ("EVAL %ld, Site %ld/%ld, LogL %g, %g (%d)\n", likeFuncEvalCallCount, siteFrom, siteID, accumulator, eval_buffer [siteID],localScalerChange);
+                }
+                eval_buffer [siteID] = accumulator;
+            }
+        }*/
+
+        if (storageVec) {
+            storageVec [siteOrdering.lData[siteID]] = accumulator;
+        } else {
+            if (accumulator <= 0.0) {
+                result = -A_LARGE_NUMBER;
+                #pragma omp critical
+                {
+                    ReportWarning (_String("Site ") & (1L+siteOrdering.lData[siteID]) & " evaluated to a 0 probability in ComputeTreeBlockByBranch");
+                }
+                break;
+            }
+            if (theFilter->theFrequencies [siteOrdering.lData[siteID]] > 1) {
+                result += log(accumulator) * theFilter->theFrequencies [siteOrdering.lData[siteID]];
+            } else {
+                result += log(accumulator);
+            }
+        }
+    }
+
+    if (!storageVec && localScalerChange) {
+        #pragma omp atomic
+        overallScaler += localScalerChange;
+    }
+
+    return result;
+}
+
+#ifdef _SLKP_DEBUG_
+
+/*----------------------------------------------------------------------------------------------------------*/
+void echoNodeList (_SimpleList& theNodes, _SimpleList& leaves, _SimpleList& iNodes)
+{
+    for (long n = 0; n < theNodes.lLength; n++) {
+        node<long>* nd = (node<long>*)(theNodes(n)<leaves.lLength?leaves(theNodes(n)):iNodes(theNodes(n)-leaves.lLength));
+        printf ("%d %d %s\n", n, theNodes(n), LocateVar(nd->in_object)->GetName()->sData);
+    }
+}
+
+#endif
+
+/*----------------------------------------------------------------------------------------------------------*/
+
+void            _TheTree::ComputeBranchCache    (
+    _SimpleList&            siteOrdering,
+    long                    brID,
+    _Parameter*         cache,
+    _Parameter*         iNodeCache,
+    _DataSetFilter*     theFilter,
+    long           *        lNodeFlags,
+    _Parameter*         scalingAdjustments,
+    long        *           siteCorrectionCounts,
+    _GrowingVector*     lNodeResolutions,
+    long&                   overallScaler,
+    long                    siteFrom,
+    long                    siteTo,
+    long                    catID,
+    _SimpleList*            tcc,
+    _Parameter*         siteRes
+)
+{
+
+    //printf ("ComputeBranchCache\n");
+
+    _SimpleList taggedNodes (flatLeaves.lLength + flatNodes.lLength, 0, 0),
+                nodesToProcess,
+                rootPath;
+
+    long        myParent               = brID       -flatLeaves.lLength,
+                alphabetDimension     =            theFilter->GetDimension(),
+                alphabetDimensionmod4  =         alphabetDimension - alphabetDimension % 4,
+                siteCount               =            theFilter->NumberDistinctSites();
+
+    if (siteTo  > siteCount)    {
+        siteTo = siteCount;
+    }
+
+    do {
+        taggedNodes.lData[myParent+flatLeaves.lLength] = 1;
+        myParent = flatParents.lData[myParent+flatLeaves.lLength];
+    } while (myParent >= 0);
+
+
+    for (unsigned long k = 0; k <  flatLeaves.lLength+flatNodes.lLength; k++) {
+        myParent = flatParents.lData[k];
+        if (taggedNodes.lData[myParent+flatLeaves.lLength] == 1 && taggedNodes.lData[k] == 0) {
+            if (myParent != brID - flatLeaves.lLength) {
+                nodesToProcess << k;
+            }
+        }
+        if (taggedNodes.lData[k]) {
+            rootPath << k;
+        }
+    }
+
+    //printf ("ComputeBranchCache at branch %d; siteOdering %s\n",
+    //      brID, _String((_String*)siteOrdering.toStr()).sData);
+
+    //echoNodeList (rootPath,flatLeaves,flatNodes );
+    //echoNodeList (nodesToProcess,flatLeaves,flatNodes);
+
+    _Parameter * state = cache + alphabetDimension * siteFrom,
+                 * childVector;
+
+    long        localScalerChange = 0;
+
+    // first populate the downward looking vector of conditionals
+
+    if (brID < flatLeaves.lLength) { // a leaf
+        for (long siteID = siteFrom; siteID < siteTo; siteID ++, state += alphabetDimension) {
+            long siteState = lNodeFlags[brID*siteCount + siteOrdering.lData[siteID]] ;
+            if (siteState >= 0)
+                // a single character state; sweep down the appropriate column
+            {
+                for (long s = 0; s < alphabetDimension; s++) {
+                    state[s] = 0.;
+                }
+                state[siteState] = 1.;
+            } else {
+                childVector = lNodeResolutions->theData + (-siteState-1) * alphabetDimension;
+                for (long s = 0; s < alphabetDimension; s++) {
+                    state[s] = childVector[s];
+                }
+            }
+        }
+    } else { // an internal branch
+        long        nodeCode = brID - flatLeaves.lLength;
+        _Parameter *lastUpdated = iNodeCache + (nodeCode * siteCount + siteFrom) * alphabetDimension;
+
+        long currentTCCIndex        ,
+             currentTCCBit            ;
+
+        if (tcc) {
+            currentTCCIndex = siteCount * nodeCode + siteFrom;
+            currentTCCBit   = currentTCCIndex % _HY_BITMASK_WIDTH_;
+            currentTCCIndex /= _HY_BITMASK_WIDTH_;
+        }
+
+        for (long siteID = siteFrom; siteID < siteTo; siteID ++, state += alphabetDimension) {
+            if (tcc) {
+                if ((tcc->lData[currentTCCIndex] & bitMaskArray.masks[currentTCCBit]) == 0) {
+                    lastUpdated = iNodeCache + (nodeCode * siteCount + siteID) * alphabetDimension;
+                }
+            }
+
+            for (long s = 0; s < alphabetDimension; s++) {
+                state[s] = lastUpdated[s];
+            }
+
+            if (tcc) {
+                if (++currentTCCBit == _HY_BITMASK_WIDTH_) {
+                    currentTCCBit   = 0;
+                    currentTCCIndex ++;
+                }
+            } else {
+                lastUpdated += alphabetDimension;
+            }
+        }
+    }
+
+    state = cache + alphabetDimension * siteCount;
+
+    taggedNodes.Populate (flatTree.lLength, 0, 0);
+    rootPath.Flip ();
+
+    for  (long nodeID = 0; nodeID < nodesToProcess.lLength + rootPath.lLength - 2; nodeID++) {
+        bool    notPassedRoot = nodeID<nodesToProcess.lLength;
+
+        long    nodeCode   = notPassedRoot?nodesToProcess.lData [nodeID]:rootPath.lData[nodeID-nodesToProcess.lLength],
+                parentCode = notPassedRoot?flatParents.lData [nodeCode]:(rootPath.lData[nodeID-nodesToProcess.lLength+1] - flatLeaves.lLength);
+
+        bool    isLeaf     = nodeCode < flatLeaves.lLength;
+
+        if (!isLeaf) {
+            nodeCode -=  flatLeaves.lLength;
+        }
+
+        _Parameter * parentConditionals = iNodeCache +            (siteFrom + parentCode  * siteCount) * alphabetDimension;
+        if (taggedNodes.lData[parentCode] == 0)
+            // mark the parent for update and clear its conditionals if needed
+        {
+            taggedNodes.lData[parentCode]     = 1;
+            _Parameter      _hprestrict_ *localScalingFactor      = scalingAdjustments + parentCode*siteCount;
+            if (alphabetDimension == 4) {
+                long k3     = 0;
+                for (long k = siteFrom; k < siteTo; k++, k3+=4) {
+                    _Parameter scaler = localScalingFactor[k];
+                    parentConditionals [k3]   = scaler;
+                    parentConditionals [k3+1] = scaler;
+                    parentConditionals [k3+2] = scaler;
+                    parentConditionals [k3+3] = scaler;
+                }
+            } else {
+                long k3     = 0;
+                for (long k = siteFrom; k < siteTo; k++) {
+                    _Parameter scaler = localScalingFactor[k];
+                    for (long k2 = 0; k2 < alphabetDimension; k2++, k3++) {
+                        parentConditionals [k3] = scaler;
+                    }
+                }
+            }
+        }
+
+        _CalcNode    * currentTreeNode = isLeaf? ((_CalcNode*) flatCLeaves (nodeCode)):
+                                         ((_CalcNode*) flatTree    (notPassedRoot?nodeCode:parentCode));
+
+        _Parameter  *       _hprestrict_ transitionMatrix = currentTreeNode->GetCompExp(catID)->theData;
+
+        _Parameter  *       childVector,
+                    *     lastUpdatedSite;
+
+        if (!isLeaf) {
+            lastUpdatedSite = childVector = iNodeCache + (siteFrom + nodeCode * siteCount) * alphabetDimension;
+        }
+
+        long currentTCCIndex        ,
+             currentTCCBit            ,
+             parentTCCIIndex      ,
+             parentTCCIBit            ;
+
+        if (tcc) {
+            parentTCCIIndex = siteCount * parentCode + siteFrom;
+            parentTCCIBit   = parentTCCIIndex % _HY_BITMASK_WIDTH_;
+            parentTCCIIndex = parentTCCIIndex / _HY_BITMASK_WIDTH_;
+            if (! isLeaf) {
+                currentTCCIndex = siteCount * nodeCode + siteFrom;
+                currentTCCBit   = currentTCCIndex % _HY_BITMASK_WIDTH_;
+                currentTCCIndex /= _HY_BITMASK_WIDTH_;
+            }
+        }
+
+        for (long siteID = siteFrom; siteID < siteTo; siteID++, parentConditionals += alphabetDimension) {
+            _Parameter  *tMatrix = transitionMatrix;
+
+            char canScale = !notPassedRoot;
+
+            if (isLeaf) {
+                long siteState = lNodeFlags[nodeCode*siteCount + siteOrdering.lData[siteID]] ;
+                if (siteState >= 0)
+                    // a single character state; sweep down the appropriate column
+                {
+                    if (alphabetDimension == 4) { // special case for nuc data
+                        parentConditionals[0] *= tMatrix[siteState];
+                        parentConditionals[1] *= tMatrix[siteState+4];
+                        parentConditionals[2] *= tMatrix[siteState+8];
+                        parentConditionals[3] *= tMatrix[siteState+12];
+                    } else {
+                        tMatrix  +=  siteState;
+                        for (long k = 0; k < alphabetDimension; k++, tMatrix += alphabetDimension) {
+                            parentConditionals[k] *= *tMatrix;
+                        }
+
+                    }
+                    continue;
+                } else {
+                    childVector = lNodeResolutions->theData + (-siteState-1) * alphabetDimension;
+                }
+                canScale = 0;
+            } else {
+                if (tcc&&notPassedRoot) {
+                    if ((tcc->lData[currentTCCIndex] & bitMaskArray.masks[currentTCCBit]) > 0 && siteID > siteFrom)
+                        // the value of this conditional vector needs to be copied from a previously stored site
+                        // subtree duplication
+                        for (long k = 0; k < alphabetDimension; k++) {
+                            childVector[k] = lastUpdatedSite[k];
+                        }
+                    else {
+                        lastUpdatedSite = childVector;
+                    }
+
+                    if (++currentTCCBit == _HY_BITMASK_WIDTH_) {
+                        currentTCCBit   = 0;
+                        currentTCCIndex ++;
+                    }
+                    if (++parentTCCIBit == _HY_BITMASK_WIDTH_) {
+                        parentTCCIBit   = 0;
+                        parentTCCIIndex ++;
+                    }
+                }
+            }
+
+            _Parameter sum      = .0;
+            char       didScale = 0;
+
+            if (alphabetDimension == 4) { // special case for nuc data
+                _handle4x4_pruning_case (childVector, tMatrix, parentConditionals);
+
+                if (canScale) {
+                    sum     = parentConditionals [0] + parentConditionals [1] + parentConditionals [2] + parentConditionals [3];
+                    if (sum < _lfScalingFactorThreshold && sum > 0.0) {
+                        _Parameter tryScale                                 = scalingAdjustments [nodeCode*siteCount + siteID] * _lfScalerUpwards;
+                        if (tryScale < HUGE_VAL) {
+                            parentConditionals[0]                             *= _lfScalerUpwards;
+                            parentConditionals[1]                             *= _lfScalerUpwards;
+                            parentConditionals[2]                             *= _lfScalerUpwards;
+                            parentConditionals[3]                             *= _lfScalerUpwards;
+
+                            localScalerChange                                  += theFilter->theFrequencies [siteOrdering.lData[siteID]];
+                            didScale                                            = 1;
+                        }
+                    } else {
+                        if (sum > _lfScalerUpwards) {
+                            parentConditionals [0]                             *= _lfScalingFactorThreshold;
+                            parentConditionals [1]                             *= _lfScalingFactorThreshold;
+                            parentConditionals [2]                             *= _lfScalingFactorThreshold;
+                            parentConditionals [3]                             *= _lfScalingFactorThreshold;
+
+                            localScalerChange                                  -= theFilter->theFrequencies [siteOrdering.lData[siteID]];
+                            didScale                                            = -1;
+                        }
+                    }
+                }
+                childVector += 4;
+            } else {
+#ifdef _SLKP_USE_SSE_INTRINSICS
+                    double buffer[2] __attribute__ ((aligned (16)));
+#endif
+#ifndef _SLKP_SSE_VECTORIZATION_
+                for (long p = 0; p < alphabetDimension; p++) {
+                    _Parameter      accumulator = 0.0;
+#ifdef _SLKP_USE_SSE_INTRINSICS
+
+                        __m128d buffer1,
+                                buffer2,
+                                buffer3 = _mm_setzero_pd(),
+                                buffer4 = _mm_setzero_pd(),
+                                load1, 
+                                load2,
+                                load3,
+                                load4;
+                                
+                        
+                        if (((long int)tMatrix & 0x1111b) == 0 && ((long int)childVector & 0x1111b) == 0){ 
+                           for (long c = 0; c < alphabetDimensionmod4; c+=4) {
+                                load1 = _mm_load_pd (tMatrix+c);
+                                load2 = _mm_load_pd (tMatrix+c+2);
+                                load3 = _mm_load_pd (childVector+c);
+                                load4 = _mm_load_pd (childVector+c+2);
+                                buffer1 = _mm_mul_pd (load1, load3);
+                                buffer2 = _mm_mul_pd (load2, load4);
+                                buffer3 = _mm_add_pd (buffer1,buffer3);
+                                buffer4 = _mm_add_pd (buffer2,buffer4);
+                            }      
+                        } else {
+                           for (long c = 0; c < alphabetDimensionmod4; c+=4) {
+                                load1 = _mm_loadu_pd (tMatrix+c);
+                                load2 = _mm_loadu_pd (tMatrix+c+2);
+                                load3 = _mm_loadu_pd (childVector+c);
+                                load4 = _mm_loadu_pd (childVector+c+2);
+                                buffer1 = _mm_mul_pd (load1, load3);
+                                buffer2 = _mm_mul_pd (load2, load4);
+                                buffer3 = _mm_add_pd (buffer1,buffer3);
+                                buffer4 = _mm_add_pd (buffer2,buffer4);
+                            }      
+                        
+                        }
+                        
+                        buffer3 = _mm_add_pd (buffer3, buffer4);    
+                        _mm_store_pd (buffer, buffer3);
+                        accumulator = buffer[0] + buffer[1];
+                    
+#else
+                   for (long c = 0; c < alphabetDimensionmod4; c+=4) // 4 - unroll the loop
+                    {
+                        _Parameter  pr1 =    tMatrix[c]   * childVector[c],
+                                    pr2 =    tMatrix[c+1] * childVector[c+1],
+                                    pr3 =    tMatrix[c+2] * childVector[c+2],
+                                    pr4 =    tMatrix[c+3] * childVector[c+3];
+                         pr1 += pr2;
+                         pr3 += pr4;
+                         accumulator += pr1+pr3;
+                    }
+#endif
+
+                    for (long c = alphabetDimensionmod4; c < alphabetDimension; c++) {
+                        accumulator +=  tMatrix[c] * childVector[c];
+                    }
+
+                    tMatrix               += alphabetDimension;
+                    sum += (parentConditionals[p] *= accumulator);
+                }
+#else
+                for (long p = 0; p < alphabetDimension; p++) {
+                    _Parameter      accumulator = 0.0;
+
+                    for (long c = 0; c < alphabetDimension; c++) { // 4 - unroll the loop
+                        accumulator +=  tMatrix[c]   * childVector[c];
+                    }
+
+
+                    tMatrix               += alphabetDimension;
+                    sum += (parentConditionals[p] *= accumulator);
+                }
+#endif
+                if (canScale) {
+                    if (sum < _lfScalingFactorThreshold && sum > 0.0) {
+                        _Parameter tryScale                                 = scalingAdjustments [nodeCode*siteCount + siteID] * _lfScalerUpwards;
+                        if (tryScale < HUGE_VAL) {
+                            for (long c = 0; c < alphabetDimension; c++) {
+                                parentConditionals [c] *= _lfScalerUpwards;
+                            }
+
+                            localScalerChange                                      += theFilter->theFrequencies [siteOrdering.lData[siteID]];
+                            didScale                                                = 1;
+                        }
+                    } else {
+                        if (sum > _lfScalerUpwards) {
+                            for (long c = 0; c < alphabetDimension; c++) {
+                                parentConditionals [c] *= _lfScalingFactorThreshold;
+                            }
+
+                            localScalerChange                                  -= theFilter->theFrequencies [siteOrdering.lData[siteID]];
+                            didScale                                            = -1;
+                        }
+                    }
+                }
+                childVector    += alphabetDimension;
+            }
+
+            if (didScale&&siteCorrectionCounts) {
+                siteCorrectionCounts [siteOrdering.lData[siteID]] += didScale;
+                siteRes[siteOrdering.lData[siteID]] *= didScale<0?_lfScalingFactorThreshold:_lfScalerUpwards;
+            }
+        }
+    }
+
+
+    _Parameter _hprestrict_ *rootConditionals   = iNodeCache +  (rootPath.lData[rootPath.lLength-2] - flatLeaves.lLength)  * siteCount * alphabetDimension;
+
+    for (long ii = siteFrom * alphabetDimension; ii < alphabetDimension*siteTo; ii++) {
+        state[ii] = rootConditionals[ii];
+    }
+
+    if (!siteCorrectionCounts && localScalerChange) {
+        #pragma omp atomic
+        overallScaler += localScalerChange;
+    }
+}
+
+/*----------------------------------------------------------------------------------------------------------*/
+
+_Parameter          _TheTree::ComputeLLWithBranchCache (
+    _SimpleList&            siteOrdering,
+    long                    brID,
+    _Parameter*         cache,
+    _DataSetFilter*     theFilter,
+    long                    siteFrom,
+    long                    siteTo,
+    long                    catID,
+    _Parameter*         storageVec
+)
+{
+    long        alphabetDimension      = theFilter->GetDimension(),
+                //alphabetDimensionmod4  = alphabetDimension - alphabetDimension % 4,
+                siteCount            =  theFilter->NumberDistinctSites();
+
+    if (siteTo  > siteCount)    {
+        siteTo = siteCount;
+    }
+
+    _Parameter _hprestrict_ *branchConditionals = cache              + siteFrom * alphabetDimension;
+    _Parameter _hprestrict_ *rootConditionals   = branchConditionals + siteCount * alphabetDimension;
+    _Parameter  result = 0.0;
+
+
+    //printf ("ComputeLLWithBranchCache @ %d catID = %d branchID = %d\n", likeFuncEvalCallCount, catID, brID);
+
+    _CalcNode *givenTreeNode = brID < flatLeaves.lLength ? (((_CalcNode**) flatCLeaves.lData)[brID]):
+                               (((_CalcNode**) flatTree.lData)   [brID - flatLeaves.lLength]);
+
+    _Parameter  *   _hprestrict_ transitionMatrix = givenTreeNode->GetCompExp(catID)->theData;
+
+    for (long siteID = siteFrom; siteID < siteTo; siteID++) {
+        _Parameter accumulator = 0.;
+        
+
+
+        if (alphabetDimension == 4) {
+            accumulator =    rootConditionals[0] * theProbs[0] *
+                             (branchConditionals[0] *  transitionMatrix[0] + branchConditionals[1] *  transitionMatrix[1] + branchConditionals[2] *  transitionMatrix[2] + branchConditionals[3] *  transitionMatrix[3]) +
+                             rootConditionals[1] * theProbs[1] *
+                             (branchConditionals[0] *  transitionMatrix[4] + branchConditionals[1] *  transitionMatrix[5] + branchConditionals[2] *  transitionMatrix[6] + branchConditionals[3] *  transitionMatrix[7]) +
+                             rootConditionals[2] * theProbs[2] *
+                             (branchConditionals[0] *  transitionMatrix[8] + branchConditionals[1] *  transitionMatrix[9] + branchConditionals[2] *  transitionMatrix[10] + branchConditionals[3] *  transitionMatrix[11]) +
+                             rootConditionals[3] * theProbs[3] *
+                             (branchConditionals[0] *  transitionMatrix[12] + branchConditionals[1] *  transitionMatrix[13] + branchConditionals[2] *  transitionMatrix[14] + branchConditionals[3] *  transitionMatrix[15]);
+            rootConditionals += 4;
+        } else {
+            long       rmx = 0;
+            for (long p = 0; p < alphabetDimension; p++,rootConditionals++) {
+                _Parameter     r2 = 0.;
+                for (long c = 0; c < alphabetDimension; c++, rmx++) {
+                    r2 += branchConditionals[c] *  transitionMatrix[rmx];
+                }
+                accumulator += *rootConditionals * theProbs[p] * r2;
+            }
+
+        }
+
+        branchConditionals += alphabetDimension;
+
+        if (storageVec) {
+            storageVec [siteOrdering.lData[siteID]] = accumulator;
+        } else {
+            if (accumulator <= 0.0) {
+                result = -A_LARGE_NUMBER;
+                #pragma omp critical
+                {
+                    ReportWarning (_String("Site ") & (1L+siteOrdering.lData[siteID]) & " evaluated to a 0 probability in ComputeLLWithBranchCache");
+                }
+                break;
+            }
+            if (theFilter->theFrequencies [siteOrdering.lData[siteID]] > 1) {
+                result += log(accumulator) * theFilter->theFrequencies [siteOrdering.lData[siteID]];
+            } else {
+                result += log(accumulator);
+            }
+            //result += log(accumulator) * theFilter->theFrequencies [siteOrdering.lData[siteID]];
+        }
+    }
+    return result;
+}
+
+/*----------------------------------------------------------------------------------------------------------*/
+
+_Parameter      _TheTree::ComputeTwoSequenceLikelihood
+(
+    _SimpleList   & siteOrdering,
+    _DataSetFilter* theFilter,
+    long      *         lNodeFlags,
+    _GrowingVector* lNodeResolutions,
+    long                siteFrom,
+    long                siteTo,
+    long                catID,
+    _Parameter*     storageVec
+)
+// the updateNodes flags the nodes (leaves followed by inodes in the same order as flatLeaves and flatNodes)
+// that must be recomputed
+{
+    // process the leaves first
+
+    long            alphabetDimension      =            theFilter->GetDimension(),
+                    siteCount            =            theFilter->NumberDistinctSites(),
+                    alphabetDimensionmod4  =          alphabetDimension-alphabetDimension%4;
+
+    _CalcNode       *theNode               =            ((_CalcNode*) flatCLeaves (0));
+    _Parameter  *   _hprestrict_ transitionMatrix
+    =           theNode->GetCompExp(catID)->theData,
+    result                 =            0.;
+
+    if (siteTo  > siteCount)    {
+        siteTo = siteCount;
+    }
+
+    for (long siteID = siteFrom; siteID < siteTo; siteID++) {
+        _Parameter  *tMatrix = transitionMatrix,
+                     sum     = 0.;
+
+        long siteState1 = lNodeFlags[siteOrdering.lData[siteID]],
+             siteState2 = lNodeFlags[siteCount + siteOrdering.lData[siteID]];
+        
+        if (siteState1 >= 0)
+            // a single character state; sweep down the appropriate column
+        {
+            if (siteState2 >= 0) { // both completely resolved;
+                sum = tMatrix[siteState1*alphabetDimension + siteState2];
+            } else { // first resolved, second is not
+                _Parameter* childVector = lNodeResolutions->theData + (-siteState2-1) * alphabetDimension;
+                tMatrix   +=  siteState1*alphabetDimension;
+                if (alphabetDimension == 4) { // special case for nuc data
+                    sum = tMatrix[0] * childVector[0] +
+                          tMatrix[1] * childVector[1] +
+                          tMatrix[2] * childVector[2] +
+                          tMatrix[3] * childVector[3];
+                } else {
+                    for (long c = 0; c < alphabetDimensionmod4; c+=4) // 4 - unroll the loop
+                        sum +=  tMatrix[c]   * childVector[c] +
+                                tMatrix[c+1] * childVector[c+1] +
+                                tMatrix[c+2] * childVector[c+2] +
+                                tMatrix[c+3] * childVector[c+3];
+
+                    for (long c = alphabetDimensionmod4; c < alphabetDimension; c++) {
+                        sum +=  tMatrix[c] * childVector[c];
+                    }
+                }
+            }
+            sum *= theProbs[siteState1];
+        } else {
+            if (siteState2 >=0 ) { // second resolved, but not the first
+               _Parameter* childVector = lNodeResolutions->theData + (-siteState1-1) * alphabetDimension;
+                tMatrix                +=  siteState2;
+                if (alphabetDimension == 4) { // special case for nuc data
+                    sum = tMatrix[0] * childVector[0]  * theProbs[0]+
+                          tMatrix[4] * childVector[1]  * theProbs[1]+
+                          tMatrix[8] * childVector[2]  * theProbs[2]+
+                          tMatrix[12] * childVector[3] * theProbs[3];
+
+                } else {
+                    for (long c = 0; c < alphabetDimensionmod4; c+=4, tMatrix += 4*alphabetDimension) // 4 - unroll the loop
+                        sum +=  tMatrix[0]   * childVector[c] * theProbs[c]+
+                                tMatrix[alphabetDimension] * childVector[c+1] * theProbs[c+1]+
+                                tMatrix[alphabetDimension+alphabetDimension] * childVector[c+2] * theProbs[c+2]+
+                                tMatrix[alphabetDimension+alphabetDimension+alphabetDimension] * childVector[c+3] * theProbs[c+3];
+
+                    for (long c = alphabetDimensionmod4; c < alphabetDimension; c++, tMatrix += alphabetDimension) {
+                        sum +=  tMatrix[0] * childVector[c] * theProbs[c];
+                    }
+                }
+            } else
+                // both unresolved
+            {
+                _Parameter *childVector1 = lNodeResolutions->theData + (-siteState1-1) * alphabetDimension,
+                            *childVector2 = lNodeResolutions->theData + (-siteState2-1) * alphabetDimension;
+
+                if (alphabetDimension == 4) { // special case for nuc data
+                    sum = (tMatrix[0] * childVector2[0] + tMatrix[1] * childVector2[1] + tMatrix[2] * childVector2[2] + tMatrix[3] * childVector2[3])     * childVector1[0] * theProbs[0]+
+                          (tMatrix[4] * childVector2[0] + tMatrix[5] * childVector2[1] + tMatrix[6] * childVector2[2] + tMatrix[7] * childVector2[3])     * childVector1[1] * theProbs[1]+
+                          (tMatrix[8] * childVector2[0] + tMatrix[9] * childVector2[1] + tMatrix[10] * childVector2[2] + tMatrix[11] * childVector2[3])   * childVector1[2] * theProbs[2] +
+                          (tMatrix[12] * childVector2[0] + tMatrix[13] * childVector2[1] + tMatrix[14] * childVector2[2] + tMatrix[15] * childVector2[3]) * childVector1[3] * theProbs[3];
+
+                } else {
+                    for (long r = 0; r < alphabetDimension; r++) { // 4 - unroll the loop
+                        if (childVector1[r] > 0.0) {
+                            _Parameter sum2 = 0.0;
+                            for (long c = 0; c < alphabetDimensionmod4; c+=4, tMatrix += 4) // 4 - unroll the loop
+                                sum2   +=  tMatrix[0] * childVector2[c] +
+                                           tMatrix[1] * childVector2[c+1]+
+                                           tMatrix[2] * childVector2[c+2]+
+                                           tMatrix[3] * childVector2[c+3];
+
+                            for (long c = alphabetDimensionmod4; c < alphabetDimension; c++, tMatrix ++) {
+                                sum2 +=  tMatrix[0] * childVector2[c];
+                            }
+
+                            sum += sum2 * childVector1[r] * theProbs[r];
+                        } else {
+                            tMatrix += alphabetDimension;
+                        }
+                    }
+                }
+            }
+        }
+        if (storageVec) {
+            storageVec [siteOrdering.lData[siteID]] = sum;
+        } else {
+            if (sum <= 0.0) {
+                return -A_LARGE_NUMBER;
+            } else {
+                //printf ("%d: %g\n", siteID, sum);
+                result += log(sum) * theFilter->theFrequencies [siteOrdering.lData[siteID]];
+            }
+        }
+    }
+
+    return result;
+}
+
+//_______________________________________________________________________________________________
+
+void     _TheTree::SampleAncestorsBySequence (_DataSetFilter* dsf, _SimpleList& siteOrdering, node<long>* currentNode, _AVLListX* nodeToIndex, _Parameter* iNodeCache,
+        _List& result, _SimpleList* parentStates, _List& expandedSiteMap, _Parameter* catAssignments, long catCount)
+
+// must be called initially with the root node
+
+
+// dsf:                         the filter to sample from
+// siteOrdering:                the map from cache ordering to actual pattern ordering
+// currentNode:                 the node index to sample for
+// nodeToIndex:                 an AVL that maps the address of an internal node pointed to by node<long> to its order in the tree postorder traversal
+// iNodeCache:                  internal node likelihood caches
+// results:                     the list that will store sampled strings
+// parentStates:                sampled states for the parent of the current node
+// expandedSiteMap:             a list of simple lists giving site indices for each unique column pattern in the alignment
+// catAssignments:              a vector assigning a (partition specific) rate category to each site (nil if no rate variation)
+// catCount:                    the number of rate classes
+
+// this needs to be updated to deal with traversal caches!
+{
+    long                      childrenCount     = currentNode->get_num_nodes();
+
+    if (childrenCount) {
+        long            siteCount                       = dsf->NumberDistinctSites  (),
+                        alphabetDimension              = dsf->GetDimension         (),
+                        nodeIndex                       = nodeToIndex->GetXtra (nodeToIndex->Find ((BaseRef)currentNode)),
+                        unitLength                     = dsf->GetUnitLength(),
+                        catBlockShifter                    = catAssignments?(dsf->NumberDistinctSites()*GetINodeCount()):0;
+
+
+        _CalcNode *     currentTreeNode = ((_CalcNode*) flatTree (nodeIndex));
+        _SimpleList     sampledStates     (dsf->GetSiteCount (), 0, 0);
+
+        _Parameter  *       _hprestrict_ transitionMatrix = (catAssignments|| !parentStates)?nil:currentTreeNode->GetCompExp()->theData;
+        _Parameter  *       _hprestrict_ conditionals     = catAssignments?nil:(iNodeCache + nodeIndex  * siteCount * alphabetDimension);
+        _Parameter  *       _hprestrict_ cache            = new _Parameter [alphabetDimension];
+
+        for (long           pattern = 0; pattern < siteCount; pattern++) {
+            _SimpleList*    patternMap = (_SimpleList*) expandedSiteMap (siteOrdering.lData[pattern]);
+            if (catAssignments) {
+                long localCatID = catAssignments[siteOrdering.lData[pattern]];
+                if (parentStates) {
+                    transitionMatrix = currentTreeNode->GetCompExp(localCatID)->theData;
+                }
+
+                conditionals     = iNodeCache + localCatID*alphabetDimension*catBlockShifter + (pattern + nodeIndex  * siteCount) * alphabetDimension;
+            }
+
+            for (long site = 0; site < patternMap->lLength; site++) {
+                long        siteID =   patternMap->lData[site];
+
+                _Parameter  randVal  = genrand_real2(),
+                            totalSum = 0.;
+
+                _Parameter  *       _hprestrict_  matrixRow;
+
+                if  (parentStates == nil) {
+                    matrixRow = theProbs;
+                } else {
+                    matrixRow = transitionMatrix + parentStates->lData[siteID] * alphabetDimension;
+                }
+
+                for (long i = 0; i<alphabetDimension; i++) {
+                    totalSum += (cache[i] = matrixRow[i]*conditionals[i]);
+                }
+
+                randVal *= totalSum;
+                totalSum    = 0.0;
+                long        sampledChar = -1;
+                while       (totalSum < randVal) {
+                    sampledChar ++;
+                    totalSum += cache[sampledChar];
+                }
+
+                sampledStates.lData[siteID] = sampledChar;
+            }
+
+            if (catAssignments == nil) {
+                conditionals += alphabetDimension;
+            }
+        }
+
+        delete [] cache;
+
+        _SimpleList  conversion;
+        _AVLListXL   conversionAVL (&conversion);
+
+        _String * sampledSequence = new _String (siteCount*unitLength, true);
+        _String  letterValue (unitLength,false);
+        for (long charIndexer = 0; charIndexer < sampledStates.lLength; charIndexer++) {
+            dsf->ConvertCodeToLettersBuffered (dsf->CorrectCode(sampledStates.lData[charIndexer]), unitLength, letterValue.sData, &conversionAVL);
+            (*sampledSequence) << letterValue;
+        }
+        sampledSequence->Finalize();
+        result.AppendNewInstance(sampledSequence);
+        //printf ("%d: %s\n", nodeIndex, sampledSequence->sData);
+
+        for (long child = 1; child <= childrenCount; child ++) {
+            SampleAncestorsBySequence (dsf, siteOrdering, currentNode->go_down(child), nodeToIndex, iNodeCache, result, &sampledStates, expandedSiteMap, catAssignments, catCount);
+        }
+    }
+}
+
+
+//_______________________________________________________________________________________________
+
+_List*   _TheTree::RecoverAncestralSequences (_DataSetFilter* dsf,
+        _SimpleList& siteOrdering,
+        _List& expandedSiteMap,
+        _Parameter* iNodeCache,
+        _Parameter* catAssignments,
+        long catCount,
+        long* lNodeFlags,
+        _GrowingVector* lNodeResolutions,
+        bool              alsoDoLeaves
+                                             )
+
+
+// dsf:                         the filter to sample from
+// siteOrdering:                the map from cache ordering to actual pattern ordering
+// expandedSiteMap:             a list of simple lists giving site indices for each unique column pattern in the alignment
+// iNodeCache:                  internal node likelihood caches
+// catAssignments:              a vector assigning a (partition specific) rate category to each site
+// catCount:                    the number of rate classes
+// alsoDoLeaves:                if true, also return ML reconstruction of observed (or partially observed) sequences
+
+{
+    long            patternCount                    = dsf->NumberDistinctSites  (),
+                    alphabetDimension                = dsf->GetDimension         (),
+                    unitLength                        = dsf->GetUnitLength        (),
+                    iNodeCount                        = GetINodeCount             (),
+                    leafCount                     = GetLeafCount              (),
+                    siteCount                        = dsf->GetSiteCount         (),
+                    allNodeCount                    = 0,
+                    stateCacheDim                    = (alsoDoLeaves? (iNodeCount + leafCount): (iNodeCount)),
+                    *stateCache                        = new long [patternCount*(iNodeCount-1)*alphabetDimension],
+    *leafBuffer                     = new long [(alsoDoLeaves?leafCount*patternCount:1)*alphabetDimension];
+
+    // a Patterns x Int-Nodes x CharStates integer table
+    // with the best character assignment for node i given that its parent state is j for a given site
+
+    _Parameter          *buffer                         = new _Parameter [alphabetDimension];
+    // iNodeCache will be OVERWRITTEN with conditional pair (i,j) conditional likelihoods
+
+    checkPointer    (stateCache);
+    checkPointer    (leafBuffer);
+
+    _SimpleList     taggedInternals (iNodeCount, 0, 0),
+                    postToIn;
+
+    MapPostOrderToInOderTraversal (postToIn);
+    // all nodes except the root
+
+    allNodeCount = iNodeCount + leafCount - 1;
+
+    for  (long nodeID = 0; nodeID < allNodeCount; nodeID++) {
+        long    parentCode = flatParents.lData [nodeID],
+                nodeCode   = nodeID;
+
+        bool    isLeaf     = nodeID < flatLeaves.lLength;
+
+
+        if (!isLeaf) {
+            nodeCode -=  flatLeaves.lLength;
+            AddBranchToForcedRecomputeList (nodeCode);
+        }
+
+        _Parameter * parentConditionals = iNodeCache + parentCode * alphabetDimension * patternCount;
+
+        if (taggedInternals.lData[parentCode] == 0)
+            // mark the parent for update and clear its conditionals if needed
+        {
+            taggedInternals.lData[parentCode]     = 1;
+            long k3     = 0;
+            for (long k = 0; k < patternCount; k++) {
+                for (long k2 = 0; k2 < alphabetDimension; k2++, k3++) {
+                    parentConditionals [k3] = 1.;
+                }
+            }
+        }
+
+        _CalcNode *          currentTreeNode = isLeaf? ((_CalcNode*) flatCLeaves (nodeCode)):((_CalcNode*) flatTree    (nodeCode));
+        _Parameter  *       _hprestrict_ transitionMatrix = catAssignments?nil:currentTreeNode->GetCompExp()->theData;
+        // this will need to be toggled on a per site basis
+        _Parameter  *       childVector;
+
+        if (!isLeaf) {
+            childVector = iNodeCache + (nodeCode * patternCount) * alphabetDimension;
+        }
+
+        for (long siteID = 0; siteID < patternCount; siteID++, parentConditionals += alphabetDimension) {
+            if (catAssignments) {
+                transitionMatrix = currentTreeNode->GetCompExp(catAssignments[siteOrdering.lData[siteID]])->theData;
+            }
+
+            _Parameter  _hprestrict_ *tMatrix = transitionMatrix;
+            if (isLeaf) {
+                long siteState = lNodeFlags[nodeCode*patternCount + siteOrdering.lData[siteID]] ;
+                if (siteState >= 0)
+                    // a fully resolved leaf
+                {
+                    tMatrix  +=  siteState;
+                    for (long k = 0; k < alphabetDimension; k++, tMatrix += alphabetDimension) {
+                        parentConditionals[k] *= *tMatrix;
+                    }
+                    if (alsoDoLeaves) {
+                        for (long k = 0; k < alphabetDimension; k++) {
+                            leafBuffer[k] = siteState;
+                        }
+                        leafBuffer += alphabetDimension;
+                    }
+
+                    continue;
+                } else
+                    // an ambiguous leaf
+                {
+                    childVector = lNodeResolutions->theData + (-siteState-1) * alphabetDimension;
+                }
+
+            }
+
+            // now repopulate this vector as necessary -- if we are here this means
+            // that the subtree below has been completely processed,
+            // the i-th cell of childVector contains the likelihood of the _optimal_
+            // assignment in the subtree below given that the character at the current
+            // node is i.
+
+            // hence, given parent state 'p', we optimize
+            // max_i pr (p->i) childVector [i] and store it in the p cell of vector childVector
+
+            _Parameter overallMax                     = 0.0;
+
+            long       *stateBuffer                   = isLeaf?leafBuffer:stateCache;
+
+            // check for degeneracy
+
+            long howManyOnes = 0;
+            for (long k = 0; k < alphabetDimension; k++) {
+                howManyOnes += childVector[k]==1.;
+            }
+
+            if (howManyOnes == alphabetDimension) {
+                for (long k = 0; k < alphabetDimension; k++) {
+                    stateBuffer[k] = -1;
+                }
+            } else {
+                for (long p = 0; p < alphabetDimension; p++) {
+                    _Parameter max_lik = 0.;
+                    long       max_idx = 0;
+
+                    for (long c = 0; c < alphabetDimension; c++) {
+                        _Parameter thisV = tMatrix[c] * childVector[c];
+                        if (thisV > max_lik) {
+                            max_lik = thisV;
+                            max_idx = c;
+                        }
+                    }
+
+                    stateBuffer [p] = max_idx;
+                    buffer [p]      = max_lik;
+
+                    if (max_lik > overallMax) {
+                        overallMax = max_lik;
+                    }
+
+                    tMatrix += alphabetDimension;
+                }
+
+                if (overallMax > 0.0 && overallMax < _lfScalingFactorThreshold) {
+                    for (long k = 0; k < alphabetDimension; k++) {
+                        buffer[k] *= _lfScalerUpwards;
+                    }
+                }
+
+                // buffer[p] now contains the maximum likelihood of the tree
+                // from this point forward given that parent state is p
+                // and stateBuffer[p] stores the maximimizing assignment
+                // for this node
+
+                for (long k = 0; k < alphabetDimension; k++) {
+                    long stateValue = stateBuffer[k];
+                    if (stateValue >= 0) {
+                        parentConditionals[k] *= buffer[k];
+                    }
+                }
+            }
+
+            if (isLeaf) {
+                if (alsoDoLeaves) {
+                    leafBuffer += alphabetDimension;
+                }
+            } else {
+                stateCache += alphabetDimension;
+            }
+
+            childVector += alphabetDimension;
+        }
+    }
+
+    _List      *result = new _List;
+    for (long k = 0; k < stateCacheDim; k++) {
+        result->AppendNewInstance (new _String(siteCount*unitLength,false));
+    }
+
+    _Parameter   _hprestrict_ * rootConditionals = iNodeCache + alphabetDimension * ((iNodeCount-1)  * patternCount);
+    _SimpleList  parentStates (stateCacheDim,0,0),
+                 conversion;
+
+    stateCache -= patternCount*(iNodeCount-1)*alphabetDimension;
+    if (alsoDoLeaves) {
+        leafBuffer -= patternCount*leafCount*alphabetDimension;
+    }
+
+    _AVLListXL    conversionAVL (&conversion);
+    _String       codeBuffer    (unitLength, false);
+
+    for (long siteID = 0; siteID < patternCount; siteID++, rootConditionals += alphabetDimension) {
+        _Parameter max_lik = 0.;
+        long       max_idx = 0;
+
+        long howManyOnes = 0;
+        for (long k = 0; k < alphabetDimension; k++) {
+            howManyOnes += rootConditionals[k]==1.;
+        }
+
+        _SimpleList*    patternMap = (_SimpleList*) expandedSiteMap (siteOrdering.lData[siteID]);
+
+        if (howManyOnes != alphabetDimension) {
+            for (long c = 0; c < alphabetDimension; c++) {
+                _Parameter thisV = theProbs[c] * rootConditionals[c];
+                if (thisV > max_lik) {
+                    max_lik = thisV;
+                    max_idx = c;
+                }
+            }
+
+            parentStates.lData[iNodeCount-1] = max_idx;
+            for  (long nodeID = iNodeCount-2; nodeID >=0 ; nodeID--) {
+                long parentState = parentStates.lData[flatParents.lData [nodeID+flatLeaves.lLength]];
+                if (parentState == -1) {
+                    parentStates.lData[nodeID] = -1;
+                } else {
+                    parentStates.lData[nodeID] = stateCache[(patternCount*nodeID+siteID)*alphabetDimension + parentState];
+                }
+            }
+            if (alsoDoLeaves)
+                for  (long nodeID = 0; nodeID <leafCount ; nodeID++) {
+                    long parentState = parentStates.lData[flatParents.lData [nodeID]];
+                    if (parentState == -1) {
+                        parentStates.lData[nodeID+iNodeCount] = -1;
+                    } else {
+                        parentStates.lData[nodeID+iNodeCount] = leafBuffer[(patternCount*nodeID+siteID)*alphabetDimension + parentState];
+                    }
+                }
+        } else {
+            parentStates.Populate(stateCacheDim,-1,0);
+        }
+
+        for  (long nodeID = 0; nodeID < stateCacheDim ; nodeID++) {
+            dsf->ConvertCodeToLettersBuffered (dsf->CorrectCode(parentStates.lData[nodeID]), unitLength, codeBuffer.sData, &conversionAVL);
+            _String  *sequence   = (_String*) (*result)(nodeID<iNodeCount?postToIn.lData[nodeID]:nodeID);
+
+            for (long site = 0; site < patternMap->lLength; site++) {
+                char* storeHere = sequence->sData + patternMap->lData[site]*unitLength;
+                for (long charS = 0; charS < unitLength; charS ++) {
+                    storeHere[charS] = codeBuffer.sData[charS];
+                }
+            }
+        }
+    }
+
+    delete [] stateCache;
+    delete [] leafBuffer;
+    delete [] buffer;
+
+    return result;
+}
+//_______________________________________________________________________________________________
+
+void     _TheTree::SetupCategoryMapsForNodes (_List& containerVariables, _SimpleList& classCounter, _SimpleList& multipliers)
+{
+    _CalcNode* iterator = DepthWiseTraversal (true);
+    while (iterator) {
+        iterator->SetupCategoryMap (containerVariables,classCounter,multipliers);
+        iterator = DepthWiseTraversal(false);
+    }
+}
+//_______________________________________________________________________________________________
+
+void     _CalcNode::SetupCategoryMap (_List& containerVariables, _SimpleList& classCounter, _SimpleList& multipliers)
+{
+
+    long    totalCategories = classCounter.Element(-1),
+            globalCatCount  = containerVariables.lLength-1,
+            localCategories = 1,
+            catCount        = categoryVariables.lLength-1,
+            entriesPerCat   = 2+catCount;
+
+    //for (long k = 0; k<categoryVariables.lLength;k++)
+    //    printf ("%ld\n", categoryVariables(k));//, ((_Variable*)categoryVariables(k))->GetName()->sData);
+  
+    if (catCount<0) {
+        remapMyCategories.Clear();
+    } else {
+
+        remapMyCategories.Populate (totalCategories*entriesPerCat,0,0);
+
+        _SimpleList     remappedIDs,
+                        rateMultiplers (categoryVariables.lLength,1,0),
+                        categoryValues (globalCatCount+1,0,0);
+
+        for (long myCatID = 0; myCatID <= catCount; myCatID++) {
+            long coordinate = containerVariables.FindPointer(LocateVar(categoryVariables.lData[myCatID]));
+            if (coordinate < 0) {
+                WarnError ("Internal error in SetupCategoryMap. Please report to spond at ucsd.edu");
+            }
+            localCategories *= classCounter.lData[coordinate];
+            remappedIDs << coordinate;
+        }
+
+        for (long myCatID = catCount-1; myCatID >= 0; myCatID--) {
+            rateMultiplers.lData[myCatID] = rateMultiplers.lData[myCatID+1]*classCounter.lData[remappedIDs.lData[myCatID+1]];
+        }
+
+        for (long currentRateCombo  = 0; currentRateCombo < totalCategories; currentRateCombo++) {
+            long copyRateCombo = currentRateCombo;
+            for (long variableID = 0; variableID <= globalCatCount; variableID++) {
+                categoryValues.lData[variableID] = copyRateCombo / multipliers.lData[variableID];
+                copyRateCombo = copyRateCombo%multipliers.lData[variableID];
+                //printf ("%d %d %d %d\n", currentRateCombo, variableID, multipliers.lData[variableID], categoryValues.lData[variableID]);
+            }
+
+            long localCatID = 0;
+
+            for  (long localVariableID = 0; localVariableID<=catCount; localVariableID++) {
+                localCatID += rateMultiplers.lData[localVariableID] * categoryValues.lData[remappedIDs.lData[localVariableID]];
+            }
+
+            long offset = currentRateCombo * entriesPerCat;
+            remapMyCategories.lData[offset] = localCatID;
+           //printf ("[%ld] = %ld (%ld)\n", offset, localCatID, );
+
+            offset++;
+            for  (long localVariableID = 0; localVariableID<=catCount; localVariableID++) {
+                remapMyCategories[offset++] = categoryValues.lData[remappedIDs.lData[localVariableID]];
+            }
+
+        }
+    }
+
+  //printf ("Node remap at %s yielded %s\n", GetName()->sData, _String((_String*)remapMyCategories.toStr()).sData);
+
+}
+
+//_______________________________________________________________________________________________
+
+_Parameter   _TheTree::Process3TaxonNumericFilter (_DataSetFilterNumeric* dsf, long catID)
+{
+
+    _Parameter *l0 =  dsf->probabilityVectors.theData +
+                      dsf->categoryShifter * catID + dsf->theNodeMap.lData[0]*dsf->shifter,
+                      *l1 = dsf->probabilityVectors.theData +
+                            dsf->categoryShifter * catID + dsf->theNodeMap.lData[1]*dsf->shifter,
+                            *l2 = dsf->probabilityVectors.theData +
+                                  dsf->categoryShifter * catID + dsf->theNodeMap.lData[2]*dsf->shifter,
+                                  * matrix0 = ((_CalcNode*)(LocateVar(theRoot->nodes.data[0]->in_object)))->GetCompExp(catID)->theData,
+                                    * matrix1 = ((_CalcNode*)(LocateVar(theRoot->nodes.data[1]->in_object)))->GetCompExp(catID)->theData,
+                                      * matrix2 = ((_CalcNode*)(LocateVar(theRoot->nodes.data[2]->in_object)))->GetCompExp(catID)->theData,
+                                        overallResult = 0.;
+
+    long        patternCount =  dsf->NumberDistinctSites();
+
+    _Parameter  currentAccumulator = 1.;
+
+    for (long patternIndex = 0; patternIndex < patternCount; patternIndex ++, l0+=4, l1+=4, l2+=4) {
+        _Parameter rp0 = l0[0] * matrix0[0]+ l0[1]  * matrix0[1]  + l0[2] * matrix0[2]  + l0[3] * matrix0[3];
+        _Parameter rp1 = l0[0] * matrix0[4]+ l0[1]  * matrix0[5]  + l0[2] * matrix0[6]  + l0[3] * matrix0[7];
+        _Parameter rp2 = l0[0] * matrix0[8]+ l0[1]  * matrix0[9]  + l0[2] * matrix0[10] + l0[3] * matrix0[11];
+        _Parameter rp3 = l0[0] * matrix0[12]+ l0[1] * matrix0[13] + l0[2] * matrix0[14] + l0[3] * matrix0[15];
+
+        rp0 *= l1[0] * matrix1[0] + l1[1] * matrix1[1]  + l1[2] * matrix1[2]  + l1[3] * matrix1[3];
+        rp1 *= l1[0] * matrix1[4] + l1[1] * matrix1[5]  + l1[2] * matrix1[6]  + l1[3] * matrix1[7];
+        rp2 *= l1[0] * matrix1[8] + l1[1] * matrix1[9]  + l1[2] * matrix1[10] + l1[3] * matrix1[11];
+        rp3 *= l1[0] * matrix1[12]+ l1[1] * matrix1[13] + l1[2] * matrix1[14] + l1[3] * matrix1[15];
+
+        rp0 *= l2[0] * matrix2[0] + l2[1] * matrix2[1]  + l2[2] * matrix2[2]  + l2[3] * matrix2[3];
+        rp1 *= l2[0] * matrix2[4] + l2[1] * matrix2[5]  + l2[2] * matrix2[6]  + l2[3] * matrix2[7];
+        rp2 *= l2[0] * matrix2[8] + l2[1] * matrix2[9]  + l2[2] * matrix2[10] + l2[3] * matrix2[11];
+        rp3 *= l2[0] * matrix2[12]+ l2[1] * matrix2[13] + l2[2] * matrix2[14] + l2[3] * matrix2[15];
+
+        _Parameter  result = theProbs[0]*rp0+
+                             theProbs[1]*rp1+
+                             theProbs[2]*rp2+
+                             theProbs[3]*rp3;
+
+
+        if (result<=0.0) {
+            return -A_LARGE_NUMBER;
+        }
+
+        long patternFreq = dsf->theFrequencies[patternIndex];
+        for  (long freqIterator = 0; freqIterator < patternFreq; freqIterator++) {
+            _Parameter tryMultiplication = currentAccumulator*result;
+            if (tryMultiplication > 1.e-300) {
+                currentAccumulator = tryMultiplication;
+            } else {
+                overallResult += myLog (currentAccumulator);
+                currentAccumulator = result;
+            }
+        }
+    }
+    return overallResult + myLog (currentAccumulator);
+}
+
+//__________________________________________________________________________________
+// Tree cluster comparison functions
+//__________________________________________________________________________________
+
+void        _TreeTopology::ComputeClusterTable (_SimpleList& result, _SimpleList& pswRepresentation)
+{
+    long            leafCount = pswRepresentation.Element(-2),
+                    leafCode  = 0,
+                    L,R;
+
+    result.Clear    ();
+    result.Populate (3*leafCount,-1,0);
+
+    for (long k = 0; k < pswRepresentation.lLength-2; k+=2) {
+        if (pswRepresentation.lData[k] < leafCount) { // is a leaf
+            R = leafCode++;
+        } else {
+            long row;
+            L = pswRepresentation.lData[k-2*pswRepresentation.lData[k+1]];
+            if (k == pswRepresentation.lLength-4 /* root */
+                    || pswRepresentation.lData[k+3] == 0) {
+                row = R;
+            } else {
+                row = L;
+            }
+
+            result.lData[row*3] = L;
+            result.lData[row*3+1] = R;
+        }
+    }
+}
+//__________________________________________________________________________________
+_String*        _TreeTopology::ConvertFromPSW                       (_AVLListX& nodeMap,_SimpleList& pswRepresentation)
+{
+    _String * result = new _String (128L, true);
+    if (pswRepresentation.lLength > 4) {
+        long leafCount = pswRepresentation.Element (-2);
+        // traverse backwards
+        bool lastLeaf = false;
+        _SimpleList     bounds;
+
+        for (long k = pswRepresentation.lLength-4; k>=0; k-=2) {
+            if (lastLeaf) {
+                (*result) << ',';
+            }
+            if (pswRepresentation.lData[k] >= leafCount) { //
+                (*result) << ')';
+                lastLeaf = false;
+                bounds   << k-2*pswRepresentation.lData[k+1];
+            } else {
+                _String nodeName (*(_String*)nodeMap.Retrieve(pswRepresentation.lData[k]));
+                nodeName.Flip();
+                (*result) << nodeName;
+                while (bounds.Element(-1) == k && bounds.lLength) {
+                    (*result) << '(';
+                    bounds.Pop();
+                }
+                lastLeaf = true;
+            }
+        }
+    }
+    result->Finalize();
+    result->Flip();
+    return result;
+}
+
+//__________________________________________________________________________________
+bool        _TreeTopology::ConvertToPSW (_AVLListX& nodeMap, _List* inames, _SimpleList& pswRepresentation, bool reference)
+{
+    if (reference == false) {
+        nodeMap.Clear();
+    }
+
+    pswRepresentation.Clear();
+
+    long    leafIndex  = 0,
+            iNodeCount = -1,
+            level      = 0;
+
+    _String nodeName;
+
+    DepthWiseTLevel (level,&GetRoot());
+    _SimpleList levelBuffer;
+
+    while (currentNode) {
+        GetNodeName (currentNode,nodeName,false);
+
+
+        while (levelBuffer.countitems() <= level) {
+            levelBuffer << 0;
+        }
+
+        if (IsCurrentNodeATip()) {
+
+            pswRepresentation << leafIndex;
+            pswRepresentation << 0;
+            if (reference) {
+                long remapped = nodeMap.Find(&nodeName);
+                if (remapped < 0) {
+                    return false;
+                } else {
+                    remapped = nodeMap.GetXtra (remapped);
+                    if (remapped >= 0) {
+                        pswRepresentation << remapped;
+                    } else {
+                        return false;
+                    }
+                }
+
+                leafIndex++;
+            } else {
+                nodeMap.Insert(nodeName.makeDynamic(), leafIndex++, false);
+            }
+        } else {
+            pswRepresentation << iNodeCount;
+            pswRepresentation << levelBuffer.lData[level];
+            if (reference) {
+                pswRepresentation << 0;
+            } else {
+                (*inames) && &nodeName;
+            }
+
+            iNodeCount--;
+        }
+        if (level) {
+            levelBuffer.lData[level-1] += levelBuffer.lData[level]+1;
+        }
+        levelBuffer.lData[level]   = 0;
+        DepthWiseTLevel  (level,nil);
+    }
+
+    for (long k = 0; k < pswRepresentation.lLength; k+=(reference?3:2))
+        if (pswRepresentation.lData[k] < 0) {
+            pswRepresentation.lData[k] = leafIndex-pswRepresentation.lData[k]-1;
+        }
+
+    pswRepresentation << leafIndex;
+    pswRepresentation << (-iNodeCount-1);
+
+    return true;
+}
+
+
+//__________________________________________________________________________________
+
+_AssociativeList *   _TreeTopology::SplitsIdentity (_PMathObj p)
+// compare tree topologies
+{
+    _Matrix     * result = (_Matrix*) checkPointer(new _Matrix (2,1,false,true)),
+                  * result2 = nil;
+
+    _FString    * treeR  = new _FString();
+
+    _Constant * bc = (_Constant*) BranchCount ();
+    result->theData[0] = bc->Value();
+    result->theData[1] = -1;
+
+
+    if (p && (p->ObjectClass() == TOPOLOGY || p->ObjectClass() == TREE)) {
+        _List           avlSupport,
+                        iNames;
+
+        _AVLListX       nameMap  (&avlSupport);
+
+        _SimpleList     psw, psw2, clusters, inodeList;
+
+
+        ConvertToPSW            (nameMap, &iNames, psw);
+        ComputeClusterTable     (clusters, psw);
+        if (((_TreeTopology*)p)->ConvertToPSW           (nameMap, nil, psw2, true)) {
+            _SimpleList           workSpace;
+            long leafCount      = psw.Element (-2);
+
+            for (unsigned long k = 0; k < psw2.lLength-3; k+=3) {
+
+                if (psw2.lData[k] < leafCount) {
+                    workSpace << 1;
+                    workSpace << 1;
+                    workSpace << psw2.lData[k+2];
+                    workSpace << psw2.lData[k+2];
+                } else {
+                    _SimpleList quad;
+                    quad << leafCount+1;
+                    quad << 0;
+                    quad << 0;
+                    quad << 1;
+
+                    long  w = psw2.lData[k+1];
+                    while (w > 0) {
+                        _SimpleList quad2;
+                        quad2 << workSpace.Pop();
+                        quad2 << workSpace.Pop();
+                        quad2 << workSpace.Pop();
+                        quad2 << workSpace.Pop();
+                        w -= quad2.lData[3];
+                        quad.lData[0] = MIN(quad2.lData[0],quad.lData[0]);
+                        quad.lData[1] = MAX(quad2.lData[1],quad.lData[1]);
+                        quad.lData[2] += quad2.lData[2];
+                        quad.lData[3] += quad2.lData[3];
+                    }
+
+                    if (quad.lData[2] == quad.lData[1] - quad.lData[0] + 1) {
+                        if (clusters.lData[3*quad.lData[0]] == quad.lData[0] && clusters.lData[3*quad.lData[0]+1] == quad.lData[1]) {
+                            clusters.lData[3*quad.lData[0]+2] = 1;
+                        } else if (clusters.lData[3*quad.lData[1]] == quad.lData[0] && clusters.lData[3*quad.lData[1]+1] == quad.lData[1]) {
+                            clusters.lData[3*quad.lData[1]+2] = 1;
+                        }
+                    }
+                    quad.Flip();
+                    workSpace << quad;
+                }
+            }
+
+            psw2.Clear();
+            long matchCount = 0,
+                 iNodeCount = 0;
+
+            long L, R;
+
+            _SimpleList leafSpans (leafCount,0,0),
+                        iNodesTouched;
+
+            for (unsigned long k = 0; k < psw.lLength-2; k+=2) {
+                if (psw.lData[k] < leafCount) {
+                    R = psw.lData[k];
+                    psw2 << R;
+                    psw2 << 0;
+                    leafSpans.lData[R] = (psw2.lLength>>1);
+                } else {
+                    long ll = k-2*psw.lData[k+1];
+                    L       = psw.lData[ll];
+                    if ((clusters.lData[3*L] == L && clusters.lData[3*L+1] == R && clusters.lData[3*L+2] > 0)
+                            || (clusters.lData[3*R] == L && clusters.lData[3*R+1] == R && clusters.lData[3*R+2] > 0)) {
+                        L = (psw2.lLength>>1) - leafSpans.lData[L] + 1;
+                        psw2 << leafCount+iNodeCount++;
+                        psw2 << L;
+
+                        iNodesTouched << psw.lData[k];
+                    }
+                }
+            }
+
+            for (unsigned long k = 0; k < psw2.lLength; k+=2)
+                if (psw2.lData[k] < leafCount) {
+                    psw2.lData[k+1] = 0;
+                } else {
+                    matchCount++;
+                }
+
+            psw2 << leafCount;
+            psw2 << iNodeCount;
+
+            result->theData[0] = psw.Element (-1);
+            result->theData[1] = matchCount;
+
+
+            *treeR->theString  = ConvertFromPSW (nameMap, psw2);
+
+            _List sharedNames;
+            for (long k = 0; k < iNodesTouched.lLength; k++) {
+                sharedNames << iNames (iNodesTouched(k)-leafCount);
+            }
+
+            result2 = new _Matrix (sharedNames);
+        }
+
+    }
+
+    DeleteObject (bc);
+
+    _AssociativeList * resultList = new _AssociativeList;
+    resultList->MStore ("CLUSTERS", result, false);
+    if (result2) {
+        resultList->MStore ("NODES",    result2, false);
+    }
+    resultList->MStore ("CONSENSUS", treeR, false);
+    return resultList;
+}
+
+//_______________________________________________________________________________________________
+
+_VariableContainer*     _CalcNode::ParentTree(void) {
+    _String parentTree = ParentObjectName();
+    _VariableContainer * theParent = (_VariableContainer *)FetchVar(LocateVarByName(parentTree));
+    if (theParent && theParent->ObjectClass () == TREE) {
+        return theParent;
+    }
+    return nil;
+}
+
+
+#endif
diff --git a/src/core/category.cpp b/src/core/category.cpp
new file mode 100644
index 0000000..b8260d0
--- /dev/null
+++ b/src/core/category.cpp
@@ -0,0 +1,1268 @@
+/*
+
+HyPhy - Hypothesis Testing Using Phylogenies.
+
+Copyright (C) 1997-2009
+  Sergei L Kosakovsky Pond (spond at ucsd.edu)
+  Art FY Poon              (apoon at cfenet.ubc.ca)
+
+Permission is hereby granted, free of charge, to any person obtaining a
+copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be included
+in all copies or substantial portions of the Software.
+
+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.
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+*/
+
+#include  "category.h"
+#include  "math.h"
+
+#ifdef    __HYPHYDMALLOC__
+#include "dmalloc.h"
+#endif
+
+//___________________________________________________________________________________________
+
+_String    defaultEqual         ("EQUAL"),
+           medianRep          ("MEDIAN"),
+           scaledMedianRep        ("SCALED_MEDIAN"),
+           maxCatIvals            ("MAX_CATEGORY_INTERVALS"),
+           constantOnPartition    ("CONSTANT_ON_PARTITION");
+
+_Parameter maxCategoryIntervals = 100.0;
+
+#ifdef     _SLKP_LFENGINE_REWRITE_
+#define    SLIGHT_SHIFT  0.
+#else
+#define    SLIGHT_SHIFT  1e-150
+#endif
+
+_Variable  *_x_ = nil,
+            *_n_ = nil;
+
+extern     _List        modelNames;
+extern     _SimpleList  modelMatrixIndices,
+           modelFrequenciesIndices;
+
+bool       CheckEqual           (_Parameter, _Parameter);
+
+//___________________________________________________________________________________________
+
+_CategoryVariable::_CategoryVariable (_String& name, _List* parms, _VariableContainer* theP):_Variable (name)
+{
+    values = intervalEnds = weights = conditionalWeights = nil;
+    hiddenMarkovModel = HY_NO_MODEL;
+    flags             = 0;
+    covariant        = -1;
+    intervalSplitter = -1;
+    Construct (*parms, theP);
+}
+
+//___________________________________________________________________________________________
+bool _CategoryVariable::checkWeightMatrix(_Matrix& w, long row)
+{
+    bool    check = true;
+    _Constant iterate;
+    _Parameter sumCheck = 0;
+    if (row>=0) {
+        long shift = w.GetVDim()*row;
+        for (long i=0; i<intervals; i++) {
+            sumCheck+=w[shift+i];
+        }
+        if (fabs(sumCheck-1.0)>=1e-8) {
+            if (sumCheck<1.0) {
+                sumCheck = 1.0/sumCheck;
+            }
+            for (long k=0; k<intervals; k++) {
+                w[shift+k]/=sumCheck;
+            }
+        }
+    } else {
+        for (long i=0; i<intervals; i++) {
+            sumCheck+=w.theData[i];
+        }
+        if (fabs(sumCheck-1.0)>=1e-8) {
+            if (sumCheck<1.0) {
+                sumCheck = 1.0/sumCheck;
+            }
+            for (long k=0; k<intervals; k++) {
+                w.theData[k]/=sumCheck;
+            }
+        }
+    }
+    return check;
+}
+
+//___________________________________________________________________________________________
+
+void _CategoryVariable::Construct (_List& parameters, _VariableContainer *theP)
+// main workhorse constructor
+// expects a list of strings containing the following
+// number of intervals
+// types of representation (MEAN or MEDIAN)
+// probability weight formula or "EQUAL"
+// probability density function (must contain at least _x_)
+// (optional) cumulative distribution f-n (must contain at least _x_)
+// range for _x_
+
+{
+
+    _String xname ("_x_");
+    if (_hyApplicationGlobals.Find (&xname) < 0) {
+        _hyApplicationGlobals.Insert (new _String (xname));
+    }
+    _x_ = CheckReceptacle (&xname,empty,false,false);
+    xname = "_n_";
+    if (_hyApplicationGlobals.Find (&xname) < 0) {
+        _hyApplicationGlobals.Insert (new _String (xname));
+    }
+    _n_ = CheckReceptacle (&xname,empty,false,false);
+
+    _String     errorMsg = _String ("While attempting to construct category variable ") & *GetName() & ": ";
+
+    _SimpleList scannedVarsList,
+                variableDependanceAllocationsAux;
+
+    _AVLListXL  variableDependanceAllocations (&variableDependanceAllocationsAux);
+
+    bool    check,
+            covariantVar = false;
+
+    long    f;
+
+    Clear(); // clear this variable if needed
+
+
+    checkParameter (maxCatIvals, maxCategoryIntervals, 100);
+    // set up the number of intervals and the matrices
+    _String*            param = (_String*)parameters(0);
+    intervals                 = ProcessNumericArgument(param,theP);
+    if (intervals<=0) {
+        WarnError (errorMsg & _String("Category variable must have a positive number of classes - had ")
+                   & *param);
+        return;
+    }
+
+    if (intervals>maxCategoryIntervals) {
+        intervals = maxCategoryIntervals;
+        errorMsg = errorMsg & _String("Category variable cannot have more than ")&maxCatIvals&" classes - had "
+                   & *param&". Reset to "& _String(intervals);
+        ReportWarning (errorMsg);
+    }
+
+    checkPointer(values             = new _Matrix (intervals, 1, false, true));
+    checkPointer(intervalEnds       = new _Matrix (intervals, 1, false, true));
+    checkPointer(weights            = new _Matrix (intervals, 1, false, true));
+
+    // construct the formula for interval weights
+    param = (_String*)parameters (1);
+    check = false;
+    if (!param->Equal(&defaultEqual))
+        // do something here, otherwise they are just equal
+    {
+        _String             splitterName (AppendContainerName(*param,theP));
+        f = LocateVarByName (splitterName);
+
+        if (f>=0 && FetchVar(f)->IsCategory()) {
+            _CategoryVariable * iSplitter = (_CategoryVariable*)FetchVar(f);
+            if (!CheckEqual (iSplitter->GetMinX(),SLIGHT_SHIFT) ||
+                    !CheckEqual (iSplitter->GetMaxX(),1.0) ||
+                    theName->Equal(&splitterName) ||
+                    (intervals = iSplitter->GetNumberOfIntervals()+1) < 2) {
+                WarnError (errorMsg & _String("Category variables which specify interval splitting options must be supported on [0,1], and not result in circular dependance"));
+                return;
+            }
+
+            intervalSplitter = iSplitter->GetAVariable();
+
+            _AVLList      ivl (&scannedVarsList);
+            iSplitter->ScanForVariables (ivl, true);
+            ivl.ReorderList();
+
+            DeleteObject (values);
+            DeleteObject (intervalEnds);
+            DeleteObject (weights);
+            checkPointer(values             = new _Matrix (intervals, 1, false, true));
+            checkPointer(intervalEnds       = new _Matrix (intervals, 1, false, true));
+            checkPointer(weights            = new _Matrix (intervals, 1, false, true));
+            check = true;
+        } else {
+            _Formula      probabilities(*param,theP);
+            {
+                _AVLList      sv (&scannedVarsList);
+                probabilities.ScanFForVariables (sv, true);
+                sv.ReorderList();
+            }
+
+            _Matrix *tryMatrix = (_Matrix*)probabilities.GetTheMatrix();
+            // check to see if it is a matrix spec
+            if (tryMatrix) {
+                _Matrix* weightMatrix = (_Matrix*)tryMatrix;
+
+                if (!( ((weightMatrix->GetHDim()==1)&&(weightMatrix->GetVDim()==intervals))||
+                        ((weightMatrix->GetHDim()==intervals)&&(weightMatrix->GetVDim()==1)))) {
+                    if (weightMatrix->GetVDim() == intervals)
+                        // covariance structure here
+                    {
+                        if (weightMatrix->GetHDim() > 1) {
+                            check        = true;
+                            covariantVar = true;
+                            if (weightMatrix->IsIndependent())
+                                for (long k=0; check && (k<weightMatrix->GetHDim()); k++) {
+                                    check = check && checkWeightMatrix (*weightMatrix, k);
+                                }
+
+                            if (check) {
+                                weights->Duplicate(weightMatrix);
+                            }
+                        } else {
+                            check = false;
+                        }
+                    } else {
+                        check = false;
+                    }
+                } else
+                    // indepenent category variable
+                {
+                    if (weightMatrix->IsIndependent()) {
+                        check=checkWeightMatrix(*weightMatrix);
+                    } else {
+                        for (long k = 0; k < weightMatrix->GetHDim() * weightMatrix->GetVDim (); k++) {
+                            _Formula* thisCell = weightMatrix->GetFormula (k,-1);
+                            if (thisCell) {
+                                _SimpleList   probVars;
+                                _AVLList      sv (&probVars);
+                                thisCell->ScanFForVariables (sv, true);
+                                sv.ReorderList();
+                                for (long v = 0; v < probVars.lLength; v++) {
+                                    long f = variableDependanceAllocations.Find ((BaseRef)probVars.lData[v]);
+                                    if (f < 0) {
+                                        f = variableDependanceAllocations.Insert ((BaseRef)probVars.lData[v], (long)(new _SimpleList (intervals,0,0)),false);
+                                    }
+                                    ((_SimpleList*) variableDependanceAllocations.GetXtra (f))->lData[k] = 1;
+                                }
+                            }
+                        }
+                        check = true;
+                    }
+                    if (check) {
+                        weights->Duplicate(weightMatrix);
+                    }
+                }
+            } else {
+                if (scannedVarsList.lLength) {
+                    if(scannedVarsList.lLength==1) {
+                        if (scannedVarsList[0]==_n_->GetAVariable()) {
+                            check = true;
+                              for (unsigned long i=0; i<intervals; i++) {
+                                _n_->SetValue(new _Constant ((_Parameter)i), false);
+                                (*weights)[i]= probabilities.Compute()->Value();
+                            }
+                            check = checkWeightMatrix (*weights);
+                        }
+                    }
+                    if (!check) {
+                        errorMsg = errorMsg & _String("Interval weights must be specified in terms of _n_.");
+                        ReportWarning (errorMsg);
+                    }
+                    scannedVarsList.Clear();
+                }
+            }
+        }
+    } else {
+        for (long i=0; i<intervals; i++) {
+            (*weights)[i] = 1.0/intervals;
+        }
+        check = true;
+    }
+
+    if (!check) {
+        ReportWarning (errorMsg & _String("Invalid weight matrix for a category variable. Reset to EQUAL"));
+        covariantVar = false;
+        for (long i=0; i<intervals; i++) {
+            (*weights)[i] = 1.0/intervals;
+        }
+    }
+
+    // set the representation mode
+
+    param = (_String*)parameters(2);
+    if (medianRep.Equal(param)) {
+        representation = MEDIAN;
+    } else if (scaledMedianRep.Equal(param)) {
+        representation = SCALED_MEDIAN;
+    } else {
+        representation = MEAN;
+    }
+
+    // get the probability density
+
+    param = (_String*)parameters(3);
+
+    if (!covariantVar) {
+        _FormulaParsingContext fpc (nil, theP);
+        Parse (&density, *param, fpc, nil); // check if the formula is good
+    }
+
+    if (!density.IsEmpty()) {
+        if (covariantVar) {
+            errorMsg = errorMsg & "Continuous distributions are not supported by non-independent category variables - specify a discrete range.";
+            WarnError (errorMsg);
+            return;
+        }
+
+        {
+            _SimpleList   densityVars,
+                          existingVars (scannedVarsList);
+
+            _AVLList      sv (&densityVars);
+            density.ScanFForVariables (sv, true);
+            sv.ReorderList();
+            scannedVarsList.Union (densityVars,existingVars);
+        }
+
+        f = scannedVarsList.Find(_x_->GetAVariable());
+        if (f!=-1) { // no dummy variable
+            check = true;
+            scannedVarsList.Delete(f);
+        } else {
+            //scannedVars.Clear();
+            check = false;
+        }
+
+        // get the cumulative probability
+
+        param = (_String*)parameters(4);
+        if (!param->Length()) { // no cumul. dist'n specified - integration is yet to be implemented
+            ReportWarning (errorMsg & _String("Runtime integration of probability density can be _very_ slow - please provide the analytic form for cumulative distribution if known."));
+        } else {
+            if(check) {
+                _FormulaParsingContext fpc (nil, theP);
+                Parse(&cumulative,*param,fpc, nil);
+                {
+                    _SimpleList   densityVars,
+                                  existingVars (scannedVarsList);
+
+                    _AVLList      sv (&densityVars);
+                    cumulative.ScanFForVariables (sv, true);
+                    sv.ReorderList();
+                    scannedVarsList.Union (densityVars,existingVars);
+                }
+                f = scannedVarsList.BinaryFind(_x_->GetAVariable());
+                if (f<0) { // no dummy variable
+                    WarnError (errorMsg & _String("Cumulative distribution must be specified in terms of _x_. Had:")&*param);
+                    return;
+                } else {
+                    scannedVarsList.Delete(f);
+                }
+            }
+
+        }
+
+        // get the bounds here
+        param = (_String*)parameters(5);
+        x_min = param->toNum()+SLIGHT_SHIFT;
+
+        param = (_String*)parameters(6);
+        x_max = param->toNum()-SLIGHT_SHIFT;
+
+        if (x_max<=x_min) {
+            errorMsg = errorMsg & _String("Bad variable bounds. Had:")&*(_String*)parameters(5)&" and "&*param;
+            WarnError (errorMsg);
+            return;
+        }
+
+        if (x_max >= INFINITE_BOUND) {
+            x_max = INFINITE_BOUND;
+        }
+
+        if (!check) { // uniform distribution
+            if (x_max==INFINITE_BOUND) {
+                WarnError ( errorMsg & _String("Can't have uniform distributions over infinite intervals. "));
+                return;
+            } else {
+                errorMsg = errorMsg & _String("Since density ")&*(_String*)parameters(3)& " contains no _x_, the distribution was set to uniform over ["&_String(x_min)&","&_String(x_max)&"]";
+                ReportWarning (errorMsg);
+                density.Clear();
+                _Parameter dns = 1.0/(x_max-x_min);
+                errorMsg = _String(dns);
+                _FormulaParsingContext fpc;
+                Parse(&density, errorMsg,fpc, nil);
+                errorMsg = _String(dns)&"*(_x_-"&_String(x_min)&")";
+                Parse(&cumulative, errorMsg,fpc, nil);
+            }
+        }
+    } else { // enumerated interval parameters
+        x_min = 0.;
+        x_max = 1.;
+        // expect a matrix for the cumulative distribution
+        if (covariantVar) {
+            param               = (_String*)parameters(3);
+            _String             splitterName (AppendContainerName(*param,theP));
+            f = LocateVarByName (splitterName);
+            check = true;
+            if (f>=0) {
+                _Variable * cbase = FetchVar (f);
+                if (cbase->IsCategory()) {
+                    check = ((_CategoryVariable*)cbase)->IsUncorrelated();
+                } else {
+                    check = false;
+                }
+            } else {
+                check = false;
+            }
+
+            if (!check) {
+                errorMsg  = errorMsg & *param & " must be the identifier of an existing, independent category variable.";
+                WarnError (errorMsg);
+                return;
+            } else {
+                covariant = variableNames.GetXtra (f);
+                if (((_CategoryVariable*)FetchVar (f))->GetNumberOfIntervals() != weights->GetHDim()) {
+                    errorMsg  = errorMsg & *param & " is incompatible with the conditional probability matrix for " & *GetName() &". The number of possible values of " & *param &" must match the row count of the matrix.";
+                    WarnError (errorMsg );
+                    return;
+                }
+            }
+        }
+        param = (_String*)parameters(4);
+        _Formula cumulative(*param,theP);
+        {
+            _SimpleList   densityVars,
+                          existingVars (scannedVarsList);
+
+            _AVLList      sv (&densityVars);
+            cumulative.ScanFForVariables (sv, true);
+            sv.ReorderList();
+            scannedVarsList.Union (densityVars,existingVars);
+        }
+        // check to see if it is a matrix spec
+        _PMathObj  tryMatrix = cumulative.GetTheMatrix();
+        if (tryMatrix) {
+            _Matrix* catMatrix = (_Matrix*)tryMatrix;
+            if (!( ((catMatrix->GetHDim()==1)&&(catMatrix->GetVDim()==intervals))||
+                    ((catMatrix->GetHDim()==intervals)&&(catMatrix->GetVDim()==1)))) {
+                check = false;
+                errorMsg = errorMsg & ("Dimension of category representatives matrix is not the same as the number of categories");
+                WarnError (errorMsg );
+                return;
+            } else {
+                values->Duplicate(catMatrix);
+                if (!catMatrix->IsIndependent()) { // not a constant matrix
+                    for (long k = 0; k < catMatrix->GetHDim() * catMatrix->GetVDim (); k++) {
+                        _Formula* thisCell = catMatrix->GetFormula (k,-1);
+                        if (thisCell) {
+                            _SimpleList   densityVars,
+                                          existingVars (scannedVarsList);
+
+                            _AVLList      sv (&densityVars);
+                            thisCell->ScanFForVariables (sv, true);
+                            sv.ReorderList();
+                            for (long v = 0; v < densityVars.lLength; v++) {
+                                long f = variableDependanceAllocations.Find ((BaseRef)densityVars.lData[v]);
+                                if (f < 0) {
+                                    f = variableDependanceAllocations.Insert ((BaseRef)densityVars.lData[v], (long)(new _SimpleList (intervals,0,0)),false);
+                                }
+                                ((_SimpleList*) variableDependanceAllocations.GetXtra (f))->lData[k] = 1;
+                            }
+
+                            scannedVarsList.Union (densityVars,existingVars);
+                        }
+                    }
+                }
+            }
+        } else {
+            WarnError (errorMsg & ("Expected an explicit enumeration of category representatives in place of cumulative distribution. Had:") & _String((_String*)cumulative.toStr()) );
+            return;
+        }
+    }
+
+    // disallow category -> category dependance
+    for (long i=0; i<scannedVarsList.lLength; i++) {
+        _Variable * curVar = (_Variable*)variablePtrs (scannedVarsList.lData[i]);
+        if (curVar->IsCategory()) {
+            errorMsg = errorMsg & _String("Can't have a category variable depend on a category variable.");
+            WarnError (errorMsg);
+            return;
+        }
+    }
+
+
+
+    hiddenMarkovModel = HY_NO_MODEL;
+
+    parameterList.Duplicate  (&scannedVarsList);
+    // finally go thru all the variables and put them where they belong in dependance containers
+
+    _SimpleList     exclude;
+
+    if (parameters.countitems()>7) { // aux mean formula
+        param = (_String*)parameters(7);
+        _FormulaParsingContext fpc (nil, theP);
+        Parse    (&meanC,*param,fpc, nil);
+
+        if (parameters.lLength>8) {
+            _String hmmModelName = AppendContainerName(*(_String*)parameters(8),theP);
+            f = FindModelName(hmmModelName);
+            if (f==-1) {
+                if (constantOnPartition.Equal ((_String*)parameters (8))) {
+                    flags = CONSTANT_ON_PARTITION;
+                } else {
+                    WarnError (errorMsg & (*(_String*)parameters(8))& " is not an existing model identifier in call to 'category'");
+                    return;
+                }
+            } else {
+                if (covariantVar) {
+                    WarnError (errorMsg & "Non-independent random variables can't also be hidden Markov.");
+                    return;
+                }
+                long mindex = f;
+                _Matrix * hmm,
+                        * freq;
+
+                bool    mbf;
+
+                RetrieveModelComponents (mindex, hmm, freq, mbf);
+                mbf = false;
+
+                if (hmm) {
+
+                    f = weights->GetHDim()*weights->GetVDim();
+
+                    if (hmm->GetHDim()==f && hmm->GetVDim()==f) {
+                        _SimpleList   hmmVars,
+                                      existingVars (parameterList);
+
+                        _AVLList      sv (&hmmVars);
+
+                        hmm->ScanForVariables (sv,true);
+                        freq->ScanForVariables (sv,true);
+
+
+                        sv.ReorderList();
+                        parameterList.Union (hmmVars,existingVars);
+                        exclude.Subtract (hmmVars,existingVars);
+
+                        hiddenMarkovModel = mindex;
+                        mbf = true;
+                    }
+                }
+
+                if (!mbf) {
+                    WarnError (errorMsg & (*(_String*)parameters(8))& " is not a valid HMM-component model (square matrix of dimension "&_String (f) & ") identifier in call to 'category'");
+                }
+            }
+        }
+    }
+
+    for (long vid = 0; vid < parameterList.lLength; vid ++) {
+        long vf = variableDependanceAllocations.Find ((BaseRef)parameterList.lData[vid]);
+        if (vf >= 0) {
+            affectedClasses << (_SimpleList*)(variableDependanceAllocations.GetXtra (vf));
+        } else if (exclude.Find (parameterList.lData[vid]) >= 0) {
+            affectedClasses.AppendNewInstance (new _SimpleList (intervals,0,0));
+        } else {
+            affectedClasses.AppendNewInstance (new _SimpleList (intervals,1,0));
+        }
+
+        _String vlog = _String ("Variable ") & *LocateVar(parameterList.lData[vid])->GetName() & " mapped to class " & _String(((_String*)affectedClasses(vid)->toStr()));
+        ReportWarning (vlog);
+    }
+
+
+    if (covariant >= 0) {
+        conditionalWeights = new _Matrix (intervals, 1, false, true);
+    }
+
+    /*{
+        _SimpleList tl;
+        _AVLList    test (&tl);
+        ScanForVariables (test, true);
+
+        _String str (128L, true);
+
+        _SimpleList  hist;
+        long         ls, cn;
+
+        cn = test.Traverser (hist,ls,test.GetRoot());
+
+        while (cn>=0)
+        {
+            long keyVal = (long)test.Retrieve (cn);
+            str << *LocateVar(keyVal)->GetName();
+            if (LocateVar(keyVal)->IsGlobal())
+                str << "  Global";
+            str << '\n';
+            cn = test.Traverser (hist,ls);
+        }
+
+        StringToConsole (str);
+    }*/
+}
+
+//___________________________________________________________________________________________
+
+bool _CategoryVariable::IsUncorrelated (void)
+{
+    return covariant == -1;
+}
+
+//___________________________________________________________________________________________
+
+bool _CategoryVariable::IsLayered (void)
+{
+    return intervalSplitter >= 0;
+}
+
+//___________________________________________________________________________________________
+
+void _CategoryVariable::ChangeNumberOfIntervals (long newi)
+{
+    if (newi==intervals) {
+        return;
+    }
+
+    DeleteObject (values);
+    DeleteObject (intervalEnds);
+    DeleteObject (weights);
+    intervals = newi;
+    values = new _Matrix (intervals, 1, false, true);
+    intervalEnds = new _Matrix (intervals, 1, false, true);
+    weights = new _Matrix (intervals, 1, false, true);
+    checkPointer(values);
+    checkPointer(intervalEnds);
+    checkPointer(weights);
+    covariant = -1;
+    intervalSplitter = -1;
+
+    for (long i=0; i<intervals; i++) {
+        (*weights)[i] = 1.0/intervals;
+    }
+
+    UpdateIntervalsAndValues();
+}
+
+//___________________________________________________________________________________________
+
+BaseRef     _CategoryVariable::makeDynamic(void)
+{
+    _CategoryVariable* result = new _CategoryVariable();
+    checkPointer(result);
+    result->Duplicate(this);
+    return result;
+}
+//___________________________________________________________________________________________
+void        _CategoryVariable::Duplicate(BaseRef s)
+{
+    _CategoryVariable* cv = (_CategoryVariable*)s;
+    Clear();
+    intervals = cv->intervals;
+    density.Duplicate ((BaseRef)&cv->density);
+    cumulative.Duplicate ((BaseRef)&cv->cumulative);
+    meanC.Duplicate ((BaseRef)&cv->meanC);
+    representation = cv->representation;
+    x_min = cv->x_min;
+    x_max = cv->x_max;
+    if (cv->values) {
+        values = (_Matrix*)cv->values->makeDynamic();
+    } else {
+        values = nil;
+    }
+    if (cv->intervalEnds) {
+        intervalEnds = (_Matrix*)cv->intervalEnds->makeDynamic();
+    } else {
+        intervalEnds = nil;
+    }
+    if (cv->weights) {
+        weights = (_Matrix*)cv->weights->makeDynamic();
+    } else {
+        weights = nil;
+    }
+
+    if (cv->conditionalWeights) {
+        conditionalWeights = (_Matrix*)cv->conditionalWeights->makeDynamic();
+    } else {
+        conditionalWeights = nil;
+    }
+
+    covariant = cv->covariant;
+    intervalSplitter = cv->intervalSplitter;
+    hiddenMarkovModel = cv->hiddenMarkovModel;
+    flags = cv->flags;
+    parameterList.Duplicate (&cv->parameterList);
+    affectedClasses.Duplicate (&cv->affectedClasses);
+    this->_Variable::Duplicate (s);
+}
+
+//___________________________________________________________________________________________
+void    _CategoryVariable::Clear (void)
+{
+    density.Clear       ();
+    cumulative.Clear    ();
+    DeleteObject        (values);
+    DeleteObject        (intervalEnds);
+    DeleteObject        (weights);
+    DeleteObject        (conditionalWeights);
+    covariant         = -1;
+    intervalSplitter  = -1;
+    hiddenMarkovModel = HY_NO_MODEL;
+    flags             = 0;
+    parameterList.Clear();
+    affectedClasses.Clear();
+}
+
+//___________________________________________________________________________________________
+BaseRef _CategoryVariable::toStr (void)
+{
+    UpdateIntervalsAndValues(true);
+    _String result (10,true), *s, st;
+    if (weights) {
+        st = "\nClass weights are:";
+        result<<&st;
+        _Matrix* cw =(_Matrix*)weights->ComputeNumeric();
+        checkWeightMatrix(*cw);
+        s = (_String*)cw->toStr();
+        result<<s;
+        result<<'\n';
+        DeleteObject(s);
+    }
+    if (values) {
+        st = "Classes represented by:";
+        result<<&st;
+        s = (_String*)values->toStr();
+        result<<s;
+        DeleteObject(s);
+    }
+    if (intervalEnds) {
+        st = "Interval ends:";
+        result<<&st;
+        s = (_String*)intervalEnds->toStr();
+        result<<s;
+        DeleteObject(s);
+    }
+    if (!density.IsEmpty()) {
+        result << "\nSupported on [";
+        result << _String(x_min);
+        result << ',';
+        result << _String(x_max);
+        result << "]\n";
+    }
+    result.Finalize();
+    return result.makeDynamic();
+}
+
+//___________________________________________________________________________________________
+_Parameter  _CategoryVariable::SetIntervalValue (long ival, bool recalc)
+{
+    _Parameter newIntervalValue;
+    if (recalc) {
+        newIntervalValue  = GetValues()->theData[ival];
+    } else {
+        newIntervalValue = ((_Matrix*)values->RetrieveNumeric())->theData[ival];
+    }
+    SetValue (new _Constant(newIntervalValue),false);
+    return newIntervalValue;
+}
+
+//___________________________________________________________________________________________
+_Parameter  _CategoryVariable::GetIntervalValue (long ival)
+{
+    if (values) {
+        return GetValues()->theData[ival];
+    } else {
+        return 0.0;
+    }
+}
+
+//___________________________________________________________________________________________
+_Parameter  _CategoryVariable::GetIntervalWeight (long ival)
+{
+    if (weights) {
+        if (covariant >= 0 || intervalSplitter >= 0) {
+            return GetWeights()->theData[ival];
+        }
+
+        if (weights->IsIndependent()) {
+            return ((_Matrix*)weights->ComputeNumeric())->theData[ival];
+        } else {
+            _Matrix* cw = ((_Matrix*)weights->ComputeNumeric());
+            checkWeightMatrix(*cw);
+            return cw->theData[ival];
+        }
+    } else {
+        return 0.0;
+    }
+}
+
+//___________________________________________________________________________________________
+_Matrix*    _CategoryVariable::GetValues (void)
+{
+    return (_Matrix*)values->ComputeNumeric();
+}
+
+//___________________________________________________________________________________________
+long        _CategoryVariable::GetCurrentState (void)
+{
+    _Matrix         *v  = GetValues();
+    _Parameter      cv  = Compute()->Value();
+
+    for (long res = 0; res < intervals; res ++)
+        if (CheckEqual (cv, v->theData[res])) {
+            return res;
+        }
+
+    return 0;
+}
+
+
+//___________________________________________________________________________________________
+_Matrix*    _CategoryVariable::GetWeights (bool covAll)
+{
+    _Matrix * cw;
+
+    if (intervalSplitter>=0) {
+        _CategoryVariable * iSplitter = (_CategoryVariable*)LocateVar (intervalSplitter);
+        cw = iSplitter->GetValues();
+        _Parameter      minusMe = 0.0;
+        for (long k=0; k<intervals-1; k++) {
+            weights->theData[k] = cw->theData[k] - minusMe;
+            minusMe = cw->theData[k];
+        }
+        weights->theData[intervals-1] = 1.-minusMe;
+        return weights;
+    }
+
+
+    if (weights->IsIndependent()) {
+        cw = (_Matrix*)weights->ComputeNumeric();
+    } else {
+        cw = ((_Matrix*)weights->ComputeNumeric());
+        if (covariant < 0) {
+            checkWeightMatrix(*cw);
+        }
+    }
+
+    if (covariant >= 0) {
+        _CategoryVariable * cv = (_CategoryVariable*)LocateVar (covariant);
+        if (covAll) {
+            long iv2 = cv->GetNumberOfIntervals();
+
+            for (long m=0; m<iv2; m++) {
+                checkWeightMatrix (*cw, m);
+            }
+
+            _Matrix * cw2 = cv->GetWeights ();
+
+            for (long k=0; k<intervals; k++) {
+                _Parameter sum = 0.0;
+                for (long j=0; j<iv2; j++) {
+                    sum += cw2->theData[j]* (*cw)(j,k);
+                }
+
+                conditionalWeights->theData[k] = sum;
+            }
+            cw = conditionalWeights;
+        } else {
+            long        rowIdx = cv->GetCurrentState()*cw->GetVDim();
+            for (long k=0; k<intervals; k++) {
+                conditionalWeights->theData[k] = cw->theData[rowIdx+k];
+            }
+            cw = conditionalWeights;
+            checkWeightMatrix (*cw);
+        }
+    }
+
+    return cw;
+}
+
+//___________________________________________________________________________________________
+_Matrix*    _CategoryVariable::GetIntervalEnds (void)
+{
+    return (_Matrix*)intervalEnds->ComputeNumeric();
+}
+
+//___________________________________________________________________________________________
+_Matrix*    _CategoryVariable::ComputeHiddenMarkov (void)
+{
+    _Variable* theMX = LocateVar (modelMatrixIndices.lData[hiddenMarkovModel]);
+    return (_Matrix*)((_Matrix*)theMX->GetValue())->ComputeNumeric();
+}
+
+//___________________________________________________________________________________________
+_Matrix*    _CategoryVariable::ComputeHiddenMarkovFreqs (void)
+{
+    long       fIndex = modelFrequenciesIndices.lData[hiddenMarkovModel];
+    if (fIndex<0) {
+        fIndex = -fIndex-1;
+    }
+    _Variable* theMX = LocateVar (fIndex);
+    return (_Matrix*)((_Matrix*)theMX->GetValue())->ComputeNumeric();
+}
+
+//___________________________________________________________________________________________
+_Matrix*    _CategoryVariable::GetHiddenMarkov (void)
+{
+    _Variable* theMX = LocateVar (modelMatrixIndices.lData[hiddenMarkovModel]);
+    return (_Matrix*)theMX->GetValue();
+}
+
+//___________________________________________________________________________________________
+_Matrix*    _CategoryVariable::GetHiddenMarkovFreqs (void)
+{
+    long       fIndex = modelFrequenciesIndices.lData[hiddenMarkovModel];
+    if (fIndex<0) {
+        fIndex = -fIndex-1;
+    }
+    _Variable* theMX = LocateVar (fIndex);
+    return (_Matrix*)theMX->GetValue();
+}
+
+//___________________________________________________________________________________________
+bool    _CategoryVariable::HaveParametersChanged (long catID)
+{
+    for (unsigned long i=0; i<parameterList.lLength; i++) {
+        _Variable * p = LocateVar(parameterList.lData[i]);
+        if (p->HasChanged())
+            if (catID == -1 || ((_SimpleList**)affectedClasses.lData)[i]->lData[catID]) {
+                return true;
+            }
+    }
+
+    return false;
+}
+
+//___________________________________________________________________________________________
+bool    _CategoryVariable::IsConstant (void)
+{
+    for (unsigned long i=0; i<parameterList.lLength; i++)
+        if (LocateVar(parameterList.lData[i])->IsConstant() == false) {
+            return false;
+        }
+
+    return true;
+}
+
+//___________________________________________________________________________________________
+bool    _CategoryVariable::IsGlobal (void)
+{
+    return true;
+}
+
+//___________________________________________________________________________________________
+void      _CategoryVariable::ScanForVariables (_AVLList& l, bool globals, _AVLListX * tagger, long weight)
+{
+    density.ScanFForVariables(l,true, false, true, false, tagger, weight);
+    weights->ScanForVariables(l,true,tagger, weight);
+    values->ScanForVariables(l,true,tagger, weight);
+
+    if (hiddenMarkovModel != HY_NO_MODEL) {
+        GetHiddenMarkov()->ScanForVariables (l,true, tagger, weight);
+        GetHiddenMarkovFreqs()->ScanForVariables (l,true, tagger, weight);
+    }
+    if (intervalSplitter != HY_NO_MODEL) {
+        LocateVar(intervalSplitter)->ScanForVariables (l, globals, tagger, weight);
+    }
+
+    if (globals) {
+        l.Delete ((BaseRef)(_x_->GetAVariable()));
+    }
+
+}
+
+//___________________________________________________________________________________________
+void      _CategoryVariable::ScanForGVariables (_AVLList& l)
+{
+    _SimpleList temp;
+    {
+        _AVLList    tempA (&temp);
+        density.ScanFForVariables(tempA,true);
+        weights->ScanForVariables(tempA,true);
+        values->ScanForVariables(tempA,true);
+        if (hiddenMarkovModel != HY_NO_MODEL) {
+            GetHiddenMarkov()->ScanForVariables (tempA,true);
+            GetHiddenMarkovFreqs()->ScanForVariables (tempA,true);
+        }
+
+        tempA.ReorderList();
+    }
+
+    long xi = _x_->GetAVariable();
+
+    for (long i=0; i<temp.lLength; i++) {
+        if (temp.lData[i]!=xi) {
+            _Variable* theV = LocateVar(temp.lData[i]);
+
+            if (theV->IsGlobal()&& theV->IsIndependent()) {
+                l.Insert ((BaseRef)temp.lData[i]);
+            }
+        }
+    }
+}
+
+//___________________________________________________________________________________________
+_Parameter      _CategoryVariable::Mean (void)
+{
+    _Parameter mean = 0.;
+    _Matrix * wts = GetWeights(),
+              * val = GetValues();
+
+    for (long ii = 0; ii < intervals; ii++) {
+        mean += wts->theData[ii] * val->theData[ii];
+    }
+
+    return mean;
+}
+
+//___________________________________________________________________________________________
+bool        _CategoryVariable::UpdateIntervalsAndValues (bool force)
+{
+    if (density.IsEmpty()) {
+        return false;
+    }
+
+    long i=0;
+
+    if (intervalSplitter >= 0) {
+        force = ((_CategoryVariable*)LocateVar(intervalSplitter))->UpdateIntervalsAndValues(force);
+    }
+
+    if (!force) {
+        force = density.HasChanged();
+        if (!force) {
+            force = (*values)[0]==0.0;
+        }
+    }
+
+    if (force) { // stuff to do
+        _Matrix* ew;
+
+        if (intervalSplitter >= 0) {
+            ew = GetWeights();
+        } else {
+            ew = (_Matrix*)weights->ComputeNumeric();
+        }
+
+        if (!weights->IsIndependent() && !checkWeightMatrix(*ew)) {
+            WarnError (_String("Matrix of category weights invalid at runtime: ") & _String((_String*)ew->toStr()));
+        }
+
+        _Parameter currentBase = 0.0,
+                   currentLeft = x_min;
+
+        for (i = 0; i<intervals-1; i++) {
+            _Parameter    currentProb  = (*ew)[i];
+            currentBase+=currentProb;
+
+            if (!cumulative.IsEmpty()) {
+                (*intervalEnds)[i] = cumulative.Newton (density, currentBase, currentLeft,x_max, _x_);    // get the next interval point
+            } else {
+                (*intervalEnds)[i] = density.Newton ( _x_, currentBase,x_min, currentLeft);    // get the next interval point
+            }
+
+            if (currentProb) {
+                if (representation == MEAN) { // compute the MEAN
+                    // need to perform integration here of p(x) dx
+                    if (meanC.IsEmpty()) {
+                        values->theData[i] = density.MeanIntegral (_x_,currentLeft,(*intervalEnds)[i])/(*ew)[i];
+                    } else {
+                        _Constant    currentRight ((*intervalEnds)[i]);
+                        _x_->SetValue(&currentRight);
+                        values->theData[i] = meanC.Compute()->Value();
+                        currentRight.SetValue(currentLeft);
+                        _x_->SetValue(&currentRight);
+                        values->theData[i] = x_min+((*values)[i]- meanC.Compute()->Value())/(*ew)[i];
+                        if (values->theData[i]>x_max) {
+                            values->theData[i] = x_max;
+                        }
+                        if (i) {
+                            if (values->theData[i]<intervalEnds->theData[i-1]) {
+                                values->theData[i]=intervalEnds->theData[i-1];
+                            }
+                        } else if (values->theData[i]<x_min) {
+                            values->theData[i]=x_min;
+                        }
+                    }
+
+                } else { // compute the MEDIAN
+                    if (!cumulative.IsEmpty()) {
+                        (*values)[i] = cumulative.Newton (density,currentBase-(*ew)[i]/2, currentLeft, x_max ,_x_);
+                    } else {
+                        (*values)[i] = density.Newton (_x_, currentBase-(*ew)[i]/2,x_min, currentLeft);
+                    }
+                }
+            } else {
+                (*values)[i] = (*intervalEnds)[i];
+            }
+
+            currentLeft = (*intervalEnds)[i];
+        }
+        // finally do something special for the last interval, since it may be over (a,infinity)
+
+        _Parameter    lastProb  = (*ew)[i];
+        if (lastProb) {
+            if (representation == MEAN) { // compute the MEAN
+                // need to perform integration here of p(x) dx
+                if (meanC.IsEmpty()) {
+                    (*values)[i] = density.MeanIntegral (_x_,currentLeft,(*intervalEnds)[i],true)/(*ew)[i];
+                } else {
+                    _Constant    currentRight (x_max);
+                    _x_->SetValue(&currentRight);
+                    values->theData[i] = meanC.Compute()->Value();
+                    currentRight.SetValue(currentLeft);
+                    _x_->SetValue(&currentRight);
+                    values->theData[i] = x_min+((*values)[i]- meanC.Compute()->Value())/(*ew)[i];
+                    if (values->theData[i]>x_max) {
+                        values->theData[i] = x_max;
+                    }
+                    if (i) {
+                        if (values->theData[i]<intervalEnds->theData[i-1]) {
+                            values->theData[i]=intervalEnds->theData[i-1];
+                        }
+                    } else {
+                        if (values->theData[i]<x_min) {
+                            values->theData[i]=x_min;
+                        }
+                    }
+                }
+            } else { // compute the MEDIAN
+                if (!cumulative.IsEmpty()) {
+                    (*values)[i] = cumulative.Newton (density,currentBase+(*ew)[i]/2, currentLeft, x_max, _x_);
+                } else {
+                    (*values)[i] = density.Newton (_x_, currentBase+(*ew)[i]/2,x_min, currentLeft);
+                }
+            }
+        } else {
+            (*values)[i] = currentLeft;
+        }
+
+        if (representation == SCALED_MEDIAN) {
+
+            _Parameter distMean,discMean = 0;
+
+            if (meanC.IsEmpty()) {
+                distMean = density.MeanIntegral (_x_,x_min,x_max, true);
+            } else {
+                _Constant    currentRight (x_max);
+                _x_->SetValue(&currentRight);
+                distMean = meanC.Compute()->Value();
+            }
+
+            for (i=0; i<intervals; i++) {
+                discMean +=(*values)[i]*(*ew)[i];
+            }
+            discMean = distMean/discMean;
+            for (i=0; i<intervals; i++) {
+                (*values)[i]*=discMean;
+            }
+        }
+    }
+    _x_->MarkDone();
+
+    return force;
+}
+
+
+//___________________________________________________________________________________________
+void _CategoryVariable::SerializeCategory (_String& rec)
+{
+    _String     weightNames = *GetName()&'.'&"weights",
+                catNames    = *GetName()&'.'&"points",
+                *theFS;
+
+    if (intervalSplitter>=0) {
+        ((_CategoryVariable*)LocateVar(intervalSplitter))->SerializeCategory(rec);
+    }
+
+    bool        hasDensity = (!density.IsEmpty());
+
+    rec << '\n';
+    if (intervalSplitter==-1) {
+        weights->Serialize (rec, weightNames);
+    }
+
+    rec << '\n';
+    if (!hasDensity) {
+        values->Serialize (rec, catNames);
+    }
+
+    rec << '\n';
+    if (hiddenMarkovModel != HY_NO_MODEL) {
+        SerializeModel (rec,hiddenMarkovModel);
+    }
+
+    rec << "\ncategory ";
+    rec << *GetName();
+    rec << "=(";
+    rec << _String ((long)intervals);
+    rec << ',';
+
+    if (intervalSplitter==-1) {
+        rec << weightNames;
+    } else {
+        rec << LocateVar(intervalSplitter)->GetName();
+    }
+
+    rec << ',';
+    switch (representation) {
+    case MEDIAN:
+        rec << medianRep;
+        break;
+    case SCALED_MEDIAN:
+        rec << scaledMedianRep;
+        break;
+    default:
+        rec << "MEAN";
+        break;
+    }
+    rec << ',';
+    if (hasDensity) {
+        theFS = (_String*)density.toStr();
+        rec << *theFS;
+        DeleteObject (theFS);
+        rec << ',';
+        theFS = (_String*)cumulative.toStr();
+        rec << *theFS;
+        DeleteObject (theFS);
+    } else {
+        if (IsUncorrelated()) {
+            rec << ',';
+        } else {
+            rec << LocateVar (covariant)->GetName();
+            rec << ',';
+        }
+        rec << catNames;
+    }
+    rec << ',';
+    rec << _String(x_min-SLIGHT_SHIFT);
+    rec << ',';
+    rec << _String(x_max+SLIGHT_SHIFT);
+    rec << ',';
+    theFS = (_String*)meanC.toStr();
+    rec << *theFS;
+    DeleteObject (theFS);
+
+    if ((hiddenMarkovModel != HY_NO_MODEL)||(flags&CONSTANT_ON_PARTITION)) {
+        rec << ',';
+        if (hiddenMarkovModel != HY_NO_MODEL) {
+            rec << *(_String*)modelNames (hiddenMarkovModel);
+        }
+
+        if (flags&CONSTANT_ON_PARTITION) {
+            rec << constantOnPartition;
+        }
+    }
+    rec << ");\n";
+}
diff --git a/src/core/classes.cp b/src/core/classes.cp
new file mode 100644
index 0000000..8202429
--- /dev/null
+++ b/src/core/classes.cp
@@ -0,0 +1,556 @@
+/*
+
+HyPhy - Hypothesis Testing Using Phylogenies.
+
+Copyright (C) 1997-2006  
+Primary Development:
+  Sergei L Kosakovsky Pond (sergeilkp at mac.com)
+Significant contributions from:
+  Spencer V Muse (muse at stat.ncsu.edu)
+  Simon DW Frost (sdfrost at ucsd.edu)
+  Art FY Poon    (apoon at biomail.ucsd.edu)
+						 
+Some of the Original Code by William A Casey.
+
+Permission is hereby granted, free of charge, to any person obtaining a
+copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be included
+in all copies or substantial portions of the Software.
+
+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.
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+*/
+
+#include "errorfns.h"
+
+template <class node_data>
+node<node_data>* StepWiseTraverserLevel (node_data& level, node<node_data>* root)
+{
+	static node<node_data>* laststep;
+	node   <node_data>  * curstep, 
+                        * crashdummy;
+                        
+	bool   goingup = false;
+		
+	if (root) {
+		laststep = root;
+		level = 0;
+		return root;
+	}
+	
+	curstep = laststep;
+	while (curstep) {
+		if (!goingup) {
+			crashdummy = curstep->go_down(1);
+			if (crashdummy) {
+				level++;
+				curstep=crashdummy;
+				break;
+			}
+		}
+		crashdummy = curstep->go_next();
+		if (crashdummy) {
+			curstep=crashdummy;
+			break;
+		}
+		goingup=true;
+		curstep=curstep->go_up();
+		level--;
+	}
+	laststep = curstep;
+	return curstep;	
+}
+
+
+//-------------------------------------------------------------
+
+template <class node_data>
+node<node_data>* StepWiseTraverser (node<node_data>* root)
+{
+	long   ignored_level = 0;
+	return StepWiseTraverserLevel (ignored_level, root);
+}
+
+//-------------------------------------------------------------
+
+template <class node_data>
+node<node_data>* DepthWiseStepTraverser  (node<node_data>* root)
+{
+	static node<node_data>* laststep;
+	node<node_data>* curstep, *crashdummy;
+		
+	if (root)
+	{
+		laststep = root;
+		while ((crashdummy = laststep->go_down(1))) laststep = crashdummy;
+		return laststep;
+	}
+	
+	curstep = laststep;
+	crashdummy = curstep->go_next();
+	if (crashdummy)
+	{
+		curstep=crashdummy;
+		while ((crashdummy = curstep->go_down(1))) curstep = crashdummy;
+		return laststep = curstep;
+	}
+	curstep=curstep->go_up();
+	laststep = curstep;
+	return curstep;
+}
+
+template <class node_data>
+node<node_data>* DepthWiseStepTraverserRight  (node<node_data>* root)
+{
+	static node<node_data>* laststep;
+	node<node_data>* curstep, *crashdummy;
+		
+	if (root)
+	{
+		laststep = root;
+		while ((crashdummy = laststep->go_down(laststep->get_num_nodes())))
+			laststep = crashdummy;
+		return laststep;
+	}
+	
+	curstep = laststep;
+	crashdummy = curstep->go_previous();
+	if (crashdummy)
+	{
+		curstep=crashdummy;
+		while ((crashdummy = curstep->go_down(curstep->get_num_nodes())))
+			curstep = crashdummy;
+		return laststep = curstep;
+	}
+	curstep=curstep->go_up();
+	laststep = curstep;
+	return curstep;
+}
+
+
+template <class node_data>
+node<node_data>* DepthWiseStepTraverserWCount  (long& costCount, node<node_data>* root)
+{
+	static node<node_data>* laststep;
+	node<node_data>* curstep, *crashdummy;
+		
+	if (root)
+	{
+		laststep = root;
+		costCount = root->get_num_nodes();
+		while ((crashdummy = laststep->go_down(1)))
+		{
+			laststep = crashdummy;
+			costCount += laststep->get_num_nodes();
+		}
+		return laststep;
+	}
+	
+	curstep = laststep;
+	crashdummy = curstep->go_next();
+	if (crashdummy)
+	{
+		curstep=crashdummy;
+		while ((crashdummy = curstep->go_down(1)))
+		{
+			curstep = crashdummy;
+			costCount += curstep->get_num_nodes();
+		}
+		return laststep = curstep;
+	}
+	costCount -= curstep->get_num_nodes();
+	curstep=curstep->go_up();
+	laststep = curstep;
+	return curstep;
+}
+		
+		
+template <class node_data>
+node<node_data>* DepthWiseStepTraverserLevel  (long& level, node<node_data>* root)
+{
+	static node<node_data>* laststep,* locRoot;
+	node<node_data>* curstep, *crashdummy;
+		
+	if (root)
+	{
+		laststep = root;
+		level = 0;
+		while ((crashdummy = laststep->go_down(1))) 
+		{
+			laststep = crashdummy;
+			level++;
+		}
+		locRoot = root;
+		return laststep;
+	}
+	
+	if (laststep==locRoot) return nil;
+	
+	curstep = laststep;
+	crashdummy = curstep->go_next();
+	if (crashdummy)
+	{
+		curstep=crashdummy;
+		while ((crashdummy = curstep->go_down(1))) 
+		{
+			curstep = crashdummy;
+			level++;
+		}
+		return laststep = curstep;
+	}
+	curstep=curstep->go_up();
+	level--;
+	laststep = curstep;
+	return curstep;
+}
+		
+//-------------------------------------------------------------
+/*node <descendantInfo>* 	GatherTreeInfo	 (node<long>* oldRoot, long& leafCounter, _SimpleList& reindex)
+{ 		
+ 	node<descendantInfo>* result = new node<descendantInfo>;
+ 	
+ 	checkPointer		 (result);
+ 	
+ 	long	nc = oldRoot->get_num_nodes(),
+ 			i;
+ 	
+ 	for (i=1; i<=nc ; i++)
+		result->add_node(*GatherTreeInfo(oldRoot->go_down(i),leafCounter,reindex));
+ 	
+ 	if (nc)
+ 	{
+ 		result->in_object.leafList = new _SimpleList;
+ 		checkPointer		 (result->in_object.leafList);
+ 		
+
+ 		for (i=1; i<=nc ; i++)
+ 		{
+	 		node<descendantInfo>* thisChild = result->go_down (i);
+	 		if (thisChild->get_num_nodes())
+	 			(*result->in_object.leafList)<<*(thisChild->in_object.leafList);
+	 		else
+	 			(*result->in_object.leafList) << thisChild->in_object.leafIndex;
+		}
+		result->in_object.leafList->Sort();
+ 	}
+ 	else
+ 		result->in_object.leafIndex = reindex.lData[leafCounter++];
+ 	
+ 	return result;
+}
+
+//-------------------------------------------------------------
+bool 	SimpleMatch	 (node<descendantInfo>* root, _SimpleList& toMatch)
+{ 		
+ 	long	nc = root->get_num_nodes(),
+ 			i;
+ 	
+ 	for (i=1; i<=nc ; i++)
+ 	{
+		node<descendantInfo>* aChild = root->go_down (i);
+		if (aChild->get_num_nodes())
+		{
+			_SimpleList * nL = aChild->in_object.leafList;
+			if (nL->BinaryFind(toMatch.lData[0])>=0)
+			{
+				if (nL->lLength < toMatch.lLength)
+					return false;
+				if (nL->lLength == toMatch.lLength)
+					return toMatch.Equal (*nL);
+					
+				return SimpleMatch (aChild,toMatch);
+			}
+		}	
+	}
+ 	
+  	return false;
+}
+
+//-------------------------------------------------------------
+void 	PurgeTreeInfo	 (node <descendantInfo>* root)
+{ 		
+ 	long	nc = root->get_num_nodes(),
+ 			i;
+ 	
+ 	for (i=1; i<=nc ; i++)
+		PurgeTreeInfo(root->go_down(i));
+ 	
+ 	if (nc)
+  		DeleteObject (root->in_object.leafList);
+  		
+  	delete root;
+}
+*/
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+//-------------------------------------------------------------
+template <class node_data> void node<node_data>::delete_tree(bool delSelf){
+ 	
+ 	 long 	nc = get_num_nodes();
+ 	 for (int i=1; i<=nc; i++)
+ 	 {
+			go_down(i)->delete_tree(); 	 
+			delete (go_down(i));
+ 	 }
+	 if (delSelf)
+		 delete (this);
+}
+
+//-------------------------------------------------------------
+template <class node_data> node<node_data>* node<node_data>::duplicate_tree(){
+ 		
+ 	node<node_data>* result = new node<node_data>;
+ 	for (int i=1; i<=get_num_nodes(); i++) {
+		result->add_node(*(go_down(i)->duplicate_tree()));
+ 	}
+ 	result->in_object = in_object;
+ 	return result;
+}
+
+//-------------------------------------------------------------
+template <class node_data> bool node<node_data>::compare_subtree(node<node_data>* compareTo)
+{ 		
+	int nNodes = get_num_nodes();
+	if (nNodes==compareTo->get_num_nodes())
+	{
+		for (int i=1; i<=nNodes; i++)
+			if (!go_down(i)->compare_subtree (compareTo->go_down(i)))
+				return false;
+		return true;
+	}
+	return false; 	
+}
+
+
+//-------------------------------------------------------------
+
+template <class node_data> long NodePathTraverser (_SimpleList& history, node<node_data>* root)
+{
+	static long  going_up, branchCount, tipCount;
+	static node<node_data>* laststep;
+	node<node_data>* curstep, *crashdummy;
+		
+	if (root)
+	{
+		laststep = root;
+		branchCount=-1;
+		tipCount=-1;
+		history.Clear();
+		while ((crashdummy = laststep->go_down(1)))
+		{
+			laststep = crashdummy;
+			if (branchCount>-1)
+				history<<branchCount;
+			branchCount++;
+		}
+		tipCount=0;
+		branchCount--;
+		return 0;
+	}
+	
+	curstep = laststep;
+	crashdummy = curstep->go_next();
+	if (crashdummy)
+	{
+		curstep=crashdummy;
+		while ((crashdummy = curstep->go_down(1)))
+		{
+			branchCount++;
+			history<<branchCount;
+			curstep = crashdummy;
+		}
+		laststep = curstep;
+		going_up = false;
+		laststep = curstep;
+		return ++tipCount;
+	}
+	
+	curstep = curstep->parent;
+	history.Delete(history.countitems()-1);
+	if (!curstep) return -1;
+	crashdummy = curstep->go_next();
+	while (!crashdummy)
+	{
+		curstep=curstep->parent;
+		if (!curstep)
+		{
+			if (!crashdummy) return -1;
+		}
+		crashdummy = curstep->go_next();
+		history.Delete(history.countitems()-1);
+	}
+	going_up = true;
+	laststep = curstep;
+	return NodePathTraverser (history,(node<node_data>*)nil);
+
+	return -1;
+}
+
+
+
+//-------------------------------------------------------------
+template <class node_data> int node<node_data>::tree_depth(void)
+{
+	 int res = 0;
+	 for (int i=nodes.get_length(); i>0;i--)
+	 {
+	 	int t = go_down(i)->tree_depth();
+	 	if (t>res)
+	 		res = t;
+	 }
+	 return res+1;
+}
+
+//-------------------------------------------------------------
+template <class node_data>
+node<node_data>* NodeTraverser  (node<node_data>* root)
+{
+	static int  going_up;
+	static node<node_data>* laststep;
+	node<node_data>* curstep, *crashdummy;
+		
+	if (root)
+	{
+		laststep = root;
+		while ((crashdummy = laststep->go_down(1))) laststep = crashdummy;
+		going_up = false;
+		return laststep;
+	}
+	
+	curstep = laststep;
+	crashdummy = curstep->go_next();
+	if (crashdummy)
+	{
+		curstep=crashdummy;
+		while ((crashdummy = curstep->go_down(1))) curstep = crashdummy;
+		going_up = false;
+		return laststep = curstep;
+	}
+	curstep=curstep->get_parent();
+	going_up = true;
+	laststep = curstep;
+	return curstep;
+}
+//-----------------------------------Set Number 1----------------
+
+
+template <class node_data> void node<node_data>::replace_node(node<node_data>* existing, node<node_data>* newNode){
+	for (long j = 0; nodes.length; j++)
+	{
+		if (nodes.data[j] == existing)
+		{
+			nodes.data[j] = newNode;
+			break;
+		}
+	}	
+}
+
+//-----------------------------------Set Number 1----------------
+template <class node_data> int node<node_data>::get_child_num()
+{
+	 int num_siblings;
+	 if (parent != NULL)
+	   {
+		  num_siblings = (*parent).get_num_nodes();
+	      for (int i=1; i<num_siblings+1; i++)
+	        {
+	          if ((*parent).get_node(i) == this) return (i);
+	        }
+	   }
+ 	return -1;
+}
+//----------------------------------end no 1--------------------
+//---------Public set no 2-------------------------------------
+
+//--Bool (T/F) responses to potential tree moves
+ template <class node_data> int node<node_data>::down(int index)
+ {
+   if ((index > 0) && (index <= get_num_nodes())){
+	  return 1;
+   }
+   else return 0;
+ } //Truth of decent
+ 
+//-------------------------------------------------------------
+
+template <class node_data> int node<node_data>::next(){
+   
+   if (get_parent() == NULL) return 0;
+   if (get_child_num() < (get_parent())->get_num_nodes()) return 1;
+   return 0;
+ }
+
+//-------------------------------------------------------------
+ template <class node_data> int node<node_data>::up(){
+   
+   if (get_child_num() > 0) return 1;
+   else return 0;
+ }
+
+//--------MOVERS MOVERS through the tree
+template <class node_data> node<node_data>* node<node_data>::go_up(){
+  return get_parent();
+}
+
+//-------------------------------------------------------------
+template <class node_data> node<node_data>* node<node_data>::go_next(){
+  int marker1,marker2;
+  marker1 = get_child_num();
+  if (get_parent() == NULL) {
+    return NULL;
+  }
+  marker2 = (get_parent())->get_num_nodes();
+  if (marker1 < marker2) return ((get_parent())->get_node(marker1+1));
+  return NULL;
+}
+
+//-------------------------------------------------------------
+template <class node_data> node<node_data>* node<node_data>::go_previous(){
+  int marker1;
+  if (get_parent() == NULL) {
+    return NULL;
+  }
+  marker1 = get_child_num();
+  if (marker1 > 1) return ((get_parent())->get_node(marker1-1));
+  return NULL;
+}
+
+
+//-------------------------------------------------------------
+template <class node_data> node<node_data>* node<node_data>::go_down(int index){
+   if ((index > 0) && (index <= get_num_nodes()))
+  	 return (get_node(index));
+   
+   return NULL; //false=can go no further
+ }
+//-------------end public set no 2-----------------------------
diff --git a/src/core/constant.cpp b/src/core/constant.cpp
new file mode 100644
index 0000000..1b6a04f
--- /dev/null
+++ b/src/core/constant.cpp
@@ -0,0 +1,821 @@
+/*
+ 
+ HyPhy - Hypothesis Testing Using Phylogenies.
+ 
+ Copyright (C) 1997-now
+ Core Developers:
+ Sergei L Kosakovsky Pond (spond at ucsd.edu)
+ Art FY Poon    (apoon at cfenet.ubc.ca)
+ Steven Weaver (sweaver at ucsd.edu)
+ 
+ Module Developers:
+ Lance Hepler (nlhepler at gmail.com)
+ Martin Smith (martin.audacis at gmail.com)
+ 
+ Significant contributions from:
+ Spencer V Muse (muse at stat.ncsu.edu)
+ Simon DW Frost (sdf22 at cam.ac.uk)
+ 
+ Permission is hereby granted, free of charge, to any person obtaining a
+ copy of this software and associated documentation files (the
+ "Software"), to deal in the Software without restriction, including
+ without limitation the rights to use, copy, modify, merge, publish,
+ distribute, sublicense, and/or sell copies of the Software, and to
+ permit persons to whom the Software is furnished to do so, subject to
+ the following conditions:
+ 
+ The above copyright notice and this permission notice shall be included
+ in all copies or substantial portions of the Software.
+ 
+ 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.
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ 
+ */
+
+#include <math.h>
+#include <float.h>
+#include <limits.h>
+#include <stdio.h>
+#include "string.h"
+#include "stdlib.h"
+#include "time.h"
+
+#include "constant.h"
+
+//SW: This should be just helper functions
+#include "parser.h"
+
+_Formula *chi2 = nil,
+         *derchi2 = nil;
+
+long randomCount = 0;
+
+extern _Parameter machineEps;
+extern _Parameter tolerance;
+
+long            lastMatrixDeclared = -1,
+                dummyVariable1,
+                dummyVariable2,
+                expressionsParsed = 0;
+
+_Parameter gammaCoeff [7] = {
+    2.50662827463100050,
+    190.9551718944012,
+    -216.8366818451899,
+    60.19441758801798,
+    -3.087513097785903,
+    0.003029460875352382,
+    -0.00001345152485367085
+};
+
+_Parameter lngammaCoeff [6] = {
+    76.18009172947146,
+    -86.50532032941677,
+    24.01409824083091,
+    -1.231739572450155,
+    0.1208650973866179e-2,
+    -0.5395239384953e-5
+};
+
+//__________________________________________________________________________________
+_Constant::_Constant (_Parameter value)
+{
+    theValue = value;
+}
+//__________________________________________________________________________________
+
+void _Constant::Initialize (void)
+{
+    BaseObj::Initialize();
+    theValue = 0;
+}
+//__________________________________________________________________________________
+
+void _Constant::Duplicate (BaseRef c)
+{
+    BaseObj::Initialize();
+    theValue = ((_Constant*)c)->theValue;
+}
+
+//__________________________________________________________________________________
+
+BaseRef _Constant::makeDynamic (void)
+{
+    _Constant * res = (_Constant*)checkPointer(new _Constant);
+    res->Duplicate(this);
+    return res;
+}
+
+//__________________________________________________________________________________
+
+_Constant::_Constant (_String& s)
+{
+    theValue = atof (s.sData);
+}
+
+//__________________________________________________________________________________
+_Constant::_Constant (void)
+{
+    theValue = 0;
+}
+
+//__________________________________________________________________________________
+//_Constant::~_Constant (void)  {
+//}
+
+//__________________________________________________________________________________
+_Parameter    _Constant::Value (void)
+{
+    return theValue;
+}
+//__________________________________________________________________________________
+BaseRef _Constant::toStr(void)
+{
+    return parameterToString(Value());
+}
+
+//__________________________________________________________________________________
+_PMathObj _Constant::Add (_PMathObj theObj)
+{
+    if (theObj->ObjectClass() == STRING) {
+        return new _Constant ((theValue+((_FString*)theObj)->theString->toNum()));
+    } else {
+        return new _Constant ((theValue+((_Constant*)theObj)->theValue));
+    }
+}
+
+//__________________________________________________________________________________
+_PMathObj _Constant::Sub (_PMathObj theObj)
+{
+    //if (theObj) return nil;
+    return new _Constant ((theValue-((_Constant*)theObj)->theValue));
+    //else
+    //  return  nil;
+    //return       (_PMathObj)result.makeDynamic();
+}
+
+//__________________________________________________________________________________
+_PMathObj _Constant::Minus (void)
+{
+    return     new  _Constant (-Value());
+}
+
+//__________________________________________________________________________________
+_PMathObj _Constant::Sum (void)
+{
+    return     new  _Constant (Value());
+}
+
+//__________________________________________________________________________________
+_PMathObj _Constant::Mult (_PMathObj theObj)
+{
+//  if (!theObj) return nil;
+    return new _Constant ((theValue*((_Constant*)theObj)->theValue));
+}
+//__________________________________________________________________________________
+_PMathObj _Constant::Div (_PMathObj theObj)
+{
+//  if (!theObj) return nil;
+    return new _Constant ((theValue/((_Constant*)theObj)->theValue));
+}
+
+//__________________________________________________________________________________
+_PMathObj _Constant::lDiv (_PMathObj theObj) // %
+{
+    if (theObj) {
+        long       denom = ((_Constant*)theObj)->theValue;
+        return     denom?new _Constant  ((long)(Value())%denom):new _Constant  ((long)(Value()));
+    } else {
+        return nil;
+    }
+}
+//__________________________________________________________________________________
+_PMathObj _Constant::longDiv (_PMathObj theObj) // div
+{
+    if (theObj) {
+        long       denom = ((_Constant*)theObj)->theValue;
+        return     denom?new _Constant  ((long)(Value())/denom):new _Constant  (0.0);
+    } else {
+        return nil;
+    }
+}
+//__________________________________________________________________________________
+_PMathObj _Constant::Raise (_PMathObj theObj)
+{
+    if (!theObj) {
+        return nil;
+    }
+
+    _Parameter    base  = Value(),
+                  expon = theObj->Value();
+
+    if (base>0.0) {
+        return    new  _Constant (exp (log(base)*(expon)));;
+    } else {
+        if (base<0.0)
+            if (CheckEqual (expon, (long)expon)) {
+                return new _Constant (((((long)expon)%2)?-1:1)*exp (log(-base)*(expon)));
+            } else {
+                _String errMsg ("An invalid base/exponent pair passed to ^");
+                WarnError (errMsg.sData);
+            }
+
+        if (expon != 0.0)
+          return     new _Constant (0.0);
+        else
+          return     new _Constant (1.0);
+    }
+}
+
+//__________________________________________________________________________________
+_PMathObj _Constant::Random (_PMathObj upperB)
+{
+    if (randomCount == 0) {
+        randomCount++;
+    }
+    _Parameter l = theValue, u=((_Constant*)upperB)->theValue,r = l;
+    if (u>l) {
+        r=genrand_int32();
+        r/=RAND_MAX_32;
+        r =l+(u-l)*r;
+    }
+    return new _Constant (r);
+
+}
+
+//__________________________________________________________________________________
+void     _Constant::Assign (_PMathObj theObj)
+{
+    this->~_Constant ();
+    theValue = ((_Constant*)theObj)->theValue;
+}
+
+//__________________________________________________________________________________
+bool     _Constant::Equal (_PMathObj theObj)
+{
+    return theValue==((_Constant*)theObj)->theValue;
+}
+
+//__________________________________________________________________________________
+_PMathObj _Constant::Abs (void)
+{
+    return     new _Constant (fabs(theValue));
+}
+
+//__________________________________________________________________________________
+_PMathObj _Constant::Sin (void)
+{
+    return     new  _Constant (sin(theValue));
+}
+
+//__________________________________________________________________________________
+_PMathObj _Constant::Cos (void)
+{
+    return     new _Constant  (cos(theValue));
+}
+
+//__________________________________________________________________________________
+_PMathObj _Constant::Tan (void)
+{
+    return     new _Constant  (tan(theValue));
+}
+//__________________________________________________________________________________
+_PMathObj _Constant::Exp (void)
+{
+    return     new _Constant  (exp(theValue));
+}
+//__________________________________________________________________________________
+_PMathObj _Constant::FormatNumberString (_PMathObj p, _PMathObj p2)
+{
+    long       a1 = p->Value(),
+               a2 = p2->Value();
+
+    char       format[32],
+               buffer[256];
+
+#ifdef     __USE_LONG_DOUBLE__
+    if (a1>=0 && a2>=0) {
+        if (a1>0) {
+            snprintf    (format,32, "%%%ld.%ldLf",(long)a1,(long)a2);
+        } else {
+            snprintf    (format,32,"%%.%ldLf",(long)a2);
+        }
+    } else if (a1>=0) {
+        snprintf    (format,32,"%%%ldLf",(long)a1);
+    } else if (a2>=0) {
+        snprintf    (format,32,"%%.%ldLf",(long)a2);
+    } else {
+        snprintf    (format,32,"%%Lg");
+    }
+#else
+    if (a1>=0 && a2>=0) {
+        if (a1>0) {
+            snprintf    (format,32, "%%%ld.%ldf",(long)a1,(long)a2);
+        } else {
+            snprintf    (format,32, "%%.%ldf",(long)a2);
+        }
+    } else if (a1>=0) {
+        snprintf    (format,32, "%%%ldf",(long)a1);
+    } else if (a2>=0) {
+        snprintf    (format,32, "%%.%ldf",(long)a2);
+    } else {
+        snprintf    (format,32, "%%g");
+    }
+
+#endif
+    a1 = snprintf    (buffer,256, format,Value());
+    _String    t (buffer);
+    return     new _FString (t);
+}
+//__________________________________________________________________________________
+_PMathObj _Constant::Log (void)
+{
+    return     new _Constant  (log(theValue));
+}
+//__________________________________________________________________________________
+_PMathObj _Constant::Sqrt (void)
+{
+    return     new _Constant  (sqrt(theValue));
+}
+//__________________________________________________________________________________
+_PMathObj _Constant::Arctan (void)
+{
+    return     new _Constant  (atan(theValue));
+}
+
+//__________________________________________________________________________________
+_PMathObj _Constant::Gamma (void)
+{
+    _Parameter theV = theValue>=1.0?theValue:2-theValue, result = gammaCoeff[0], temp = theV;
+
+    for (long i=1; i<7; i++, temp+=1.0) {
+        result+=gammaCoeff[i]/temp;
+    }
+
+    temp = theV+4.5;
+    result *= exp(-temp+log(temp)*(theV-.5));
+
+    if (theValue>=1.0) {
+        return    new _Constant  (result);
+    }
+
+    else {
+        temp = pi_const*(1-theValue);
+
+        return     new _Constant  (temp/result/sin(temp));
+    }
+    return nil;
+}
+
+//__________________________________________________________________________________
+_PMathObj _Constant::LnGamma (void)
+{
+    // obtained from Numerical Recipes in C, p. 214 by afyp, February 7, 2007
+    _Parameter  x, y, tmp, ser;
+
+    y = x = theValue;
+    tmp = x + 5.5;
+    tmp -= (x+0.5) * log(tmp);
+    ser = 1.000000000190015;
+
+    for (long j = 0; j <= 5; j++) {
+        ser += lngammaCoeff[j] / ++y;
+    }
+
+    return new _Constant (-tmp + log(2.506628274631005*ser/x));
+}
+
+//__________________________________________________________________________________
+_PMathObj _Constant::Beta (_PMathObj arg)
+{
+    if (arg->ObjectClass()!=NUMBER) {
+        WarnError ("A non-numerical argument passed to Beta(x,y)");
+        return    nil;
+    }
+    
+    _Constant xy         = _Constant (theValue + ((_Constant*)arg)->theValue);
+    
+    _Constant * lnGammaX    = (_Constant *)LnGamma(),
+              * lnGammaY    = (_Constant *)arg->LnGamma(),
+              * lnGammaXY   = (_Constant *)xy.LnGamma(),
+              * result      = new _Constant (exp (lnGammaX->theValue + lnGammaY->theValue - lnGammaXY->theValue));
+         
+    DeleteObject (lnGammaX);
+    DeleteObject (lnGammaY);
+    DeleteObject (lnGammaXY);
+    
+    return result;
+}
+
+//__________________________________________________________________________________
+_PMathObj _Constant::IBeta (_PMathObj arg1, _PMathObj arg2)
+{
+    if (theValue<=0.0) {
+        if (theValue < 0.0) {
+            _String     errMsg;
+            errMsg = _String ("IBeta is defined for x betweeen 0 and 1. Had: ") & theValue;
+            ReportWarning   (errMsg);
+        }
+        return new _Constant (0.0);
+    }
+
+    if (theValue>=1.0) {
+        if (theValue>1.0) {
+            _String     errMsg;
+            errMsg = _String ("IBeta is defined for x betweeen 0 and 1. Had: ") & theValue;
+            ReportWarning   (errMsg);
+        }
+        return new _Constant (1.0);
+    }
+
+
+    if ((arg1->ObjectClass()!=NUMBER)||(arg2->ObjectClass()!=NUMBER)) {
+        _String     errMsg ("IBeta called with a non-scalar argument.");
+        WarnError   (errMsg);
+        return      nil;
+    }
+
+    _Constant        *ga = (_Constant*)arg1->LnGamma(),
+                     *gb = (_Constant*)arg2->LnGamma();
+
+    if (ga&&gb) {
+        _Constant    *ac = (_Constant*)arg1,
+                     *bc = (_Constant*)arg2;
+
+        _Parameter  a = ac->Value(),
+                    b = bc->Value(),
+                    x = theValue,
+                    aa,
+                    c,
+                    d,
+                    del,
+                    h,
+                    qab,
+                    qam,
+                    qap,
+                    FPMIN = 1e-100;
+
+        bool        swap = false;
+
+        long        m,
+                    m2;
+
+        if (x >= (a+1.)/(a+b+2.)) {
+            swap = true;
+            c = b;
+            b = a;
+            a = c;
+            x = 1. - x;
+        }
+
+        qab = a+b;
+        qap = a+1.;
+        qam = a-1.;
+        c   = 1.;
+        d   = 1. - qab*x/qap;
+        if  ((d<FPMIN)&&(d>-FPMIN)) {
+            d = FPMIN;
+        }
+        d   = 1./d;
+        h   = d;
+
+        for (m=1; m<100; m++) {
+            m2 = 2*m;
+            aa = m*(b-m)*x / ((qam+m2)*(a+m2));
+            d = 1.+aa*d;
+            if  ((d<FPMIN)&&(d>-FPMIN)) {
+                d = FPMIN;
+            }
+            c = 1.+aa/c;
+            if  ((c<FPMIN)&&(c>-FPMIN)) {
+                c = FPMIN;
+            }
+            d = 1./d;
+            h*= d*c;
+            aa = -(a+m)*(qab+m)*x/((a+m2)*(qap+m2));
+            d = 1.+aa*d;
+            if  ((d<FPMIN)&&(d>-FPMIN)) {
+                d = FPMIN;
+            }
+            c = 1.+aa/c;
+            if  ((c<FPMIN)&&(c>-FPMIN)) {
+                c = FPMIN;
+            }
+            d = 1./d;
+            del = d*c;
+            h*= del;
+            del -= 1.;
+            if  ((del<1.e-14)&&(del>-1.e-14))   {
+                break;
+            }
+        }
+
+        _Constant   * res = new _Constant (a+b);
+        ac  = (_Constant*)res->LnGamma();
+        c   = exp (a*log(x)+b*log(1-x)+ac->Value()-ga->Value()-gb->Value());
+
+        if (swap) {
+            res->theValue = 1.-c*h/a;
+        } else {
+            res->theValue = c*h/a;
+        }
+
+        DeleteObject (ac);
+        DeleteObject (ga);
+        DeleteObject (gb);
+        return  res;
+    }
+    DeleteObject (ga);
+    DeleteObject (gb);
+    return nil;
+}
+
+
+//__________________________________________________________________________________
+_PMathObj _Constant::IGamma (_PMathObj arg)
+{
+    if (arg->ObjectClass()!=NUMBER) {
+        _String errMsg ("A non-numerical argument passed to IGamma(a,x)");
+        WarnError (errMsg);
+        return new _Constant (0.0);
+    }
+    _Parameter x = ((_Constant*)arg)->theValue, sum=0.0;
+    if (x>1e25) {
+        x=1e25;
+    } else if (x<0) {
+        _String errMsg ("The domain of x is {x>0} for IGamma (a,x)");
+        WarnError (errMsg);
+        return new _Constant (0.0);
+    } else if (x==0.0) {
+        return new _Constant (0.0);
+    }
+
+
+    if (x<=theValue+1) // use the series representation
+        // IGamma (a,x)=exp(-x) x^a \sum_{n=0}^{\infty} \frac{\Gamma((a)}{\Gamma(a+1+n)} x^n
+    {
+        _Parameter term = 1.0/theValue, den = theValue+1;
+        long count = 0;
+        while ((fabs(term)>=fabs(sum)*machineEps)&&(count<500)) {
+            sum+=term;
+            term*=x/den;
+            den += 1.0;
+            count++;
+        }
+    } else // use the continue fraction representation
+        // IGamma (a,x)=exp(-x) x^a 1/x+/1-a/1+/1/x+/2-a/1+/2/x+...
+    {
+        _Parameter lastTerm = 0, a0 = 1.0, a1 = x, b0 = 0.0, b1 = 1.0, factor = 1.0, an, ana, anf;
+        for (long count = 1; count<500; count++) {
+            an = count;
+            ana = an - theValue;
+            a0 = (a1+a0*ana)*factor;
+            b0 = (b1+b0*ana)*factor;
+            anf = an*factor;
+            a1  = x*a0+anf*a1;
+            b1  = x*b0+anf*b1;
+            if (a1!=0.0) {
+                factor=1.0/a1;
+                sum = b1*factor;
+                if (fabs(sum-lastTerm)/sum<machineEps) {
+                    break;
+                }
+                lastTerm = sum;
+            }
+
+        }
+    }
+    _Constant *result = (_Constant*)Gamma();
+    result->SetValue(sum*exp(-x+theValue*log(x))/result->theValue);
+    if (x>theValue+1) {
+        result->SetValue (1.0-result->theValue);
+    }
+    return result;
+}
+
+//__________________________________________________________________________________
+_PMathObj _Constant::Erf (void)
+{
+    _Parameter lV = theValue;
+    _Constant  half (.5), sq = (lV*lV);
+    _PMathObj  IG = half.IGamma(&sq);
+    lV = ((_Constant*)IG)->theValue;
+    if (theValue<0) {
+        lV=-lV;
+    }
+    ((_Constant*)IG)->SetValue(lV);
+    return (_PMathObj)IG;
+}
+
+//__________________________________________________________________________________
+_PMathObj _Constant::ZCDF (void)
+{
+    _Parameter lV = theValue;
+
+    _Constant  half (.5),
+               sq (lV*lV/2);
+
+    _PMathObj  IG = half.IGamma(&sq);
+    lV = ((_Constant*)IG)->theValue/2;
+
+    if (theValue>0) {
+        ((_Constant*)IG)->SetValue(lV+.5);
+    } else {
+        ((_Constant*)IG)->SetValue(.5-lV);
+    }
+    return (_PMathObj)IG;
+}
+
+//__________________________________________________________________________________
+_PMathObj _Constant::Time (void)
+{
+    _Constant result;
+    if (theValue<1.0) {
+        result.theValue = ((_Parameter)clock()/CLOCKS_PER_SEC);
+    } else {
+        time_t tt;
+        result.theValue = ((_Parameter)time(&tt));
+    }
+    return     (_PMathObj)result.makeDynamic();
+}
+
+//__________________________________________________________________________________
+_PMathObj _Constant::Less (_PMathObj theObj)
+{
+    if (theObj) {
+        return new _Constant (theValue<((_Constant*)theObj)->theValue);
+    } else {
+        return nil;
+    }
+}
+
+//__________________________________________________________________________________
+_PMathObj _Constant::Greater (_PMathObj theObj)
+{
+    if (theObj) {
+        return new _Constant (theValue>((_Constant*)theObj)->theValue);
+    } else {
+        return nil;
+    }
+}
+
+//__________________________________________________________________________________
+_PMathObj _Constant::GammaDist (_PMathObj alpha, _PMathObj beta)
+{
+    _Parameter x = theValue, a = ((_Constant*)alpha)->theValue,
+               b = ((_Constant*)beta)->theValue, gd = exp(a * log(b) -b*x +(a-1)*log(x));
+    _Constant * c = (_Constant*)alpha->Gamma();
+    gd/=c->theValue;
+    c->SetValue(gd);
+    return c;
+}
+
+//__________________________________________________________________________________
+_PMathObj _Constant::CGammaDist (_PMathObj alpha, _PMathObj beta)
+{
+    _Parameter     arg = theValue*((_Constant*)beta)->theValue;
+    /*if (arg==0)
+    {
+        _Constant zer (0);
+        return    (_PMathObj)zer.makeDynamic();
+    }*/
+    _Constant newX (arg);
+    return alpha->IGamma( &newX);
+}
+
+//__________________________________________________________________________________
+_PMathObj _Constant::CChi2 (_PMathObj n)
+// chi^2 n d.f. probability up to x
+{
+    _Constant halfn (((_Constant*)n)->theValue*.5),
+              halfx (theValue*0.5);
+
+    if (theValue < 0. || halfn.theValue <= 0.) {
+        ReportWarning ("CChi2(x,n) only makes sense for both arguments positive");
+        return new _Constant (0.0);
+    }
+    return halfn.IGamma( &halfx);
+}
+
+//__________________________________________________________________________________
+_PMathObj _Constant::InvChi2 (_PMathObj n)
+// chi^2 n d.f. probability up to x
+{
+    if (!chi2) {
+        _String fla ("IGamma(_n_,_x_)");
+        chi2 = new _Formula (fla, nil);
+        fla = "_x_^(_n_-1)/Gamma(_n_)/Exp(_x_)";
+        derchi2 = new _Formula (fla,nil);
+    }
+    _Constant halfn (((_Constant*)n)->theValue*.5);
+    if ((theValue<0)||(halfn.theValue<0)||(theValue>1.0)) {
+        _String warnMsg ("InvChi2(x,n) only makes sense for n positive, and x in [0,1]");
+        ReportWarning (warnMsg);
+        return new _Constant (0.0);
+    }
+    LocateVar(dummyVariable2)->SetValue (&halfn);
+    halfn.SetValue(chi2->Newton(*derchi2,theValue,1e-25,1.e100,LocateVar(dummyVariable1))*2);
+    return (_PMathObj)halfn.makeDynamic();
+}
+
+//__________________________________________________________________________________
+_PMathObj _Constant::LessEq (_PMathObj theObj)
+{
+    if (theObj) {
+        return new _Constant (theValue<=((_Constant*)theObj)->theValue);
+    } else {
+        return nil;
+    }
+}
+
+//__________________________________________________________________________________
+_PMathObj _Constant::GreaterEq (_PMathObj theObj)
+{
+    if (theObj) {
+        return new _Constant (theValue>=((_Constant*)theObj)->theValue);
+    } else {
+        return nil;
+    }
+}
+//__________________________________________________________________________________
+_PMathObj _Constant::AreEqual (_PMathObj theObj)
+{
+    if (!theObj) {
+        return nil;
+    }
+
+    _Parameter a = theValue,
+               b = ((_Constant*)theObj)->theValue;
+
+    if (a==0.0) {
+        return new _Constant (b==0.0);
+    }
+
+    return new _Constant(fabs ((a-b)/a)<tolerance);
+}
+//__________________________________________________________________________________
+_PMathObj _Constant::NotEqual (_PMathObj theObj)
+{
+    if (!theObj) {
+        return nil;
+    }
+    _Parameter   a = theValue,
+                 b = ((_Constant*)theObj)->theValue;
+
+    if (a==0.0) {
+        return new _Constant (b!=0.0);
+    }
+
+    return new _Constant(fabs ((a-b)/a)>=tolerance);
+}
+//__________________________________________________________________________________
+_PMathObj _Constant::LAnd (_PMathObj theObj)
+{
+    if (!theObj) {
+        return nil;
+    }
+    return new _Constant ((long)(theValue)&&(long)(((_Constant*)theObj)->theValue));
+}
+//__________________________________________________________________________________
+_PMathObj _Constant::LOr (_PMathObj theObj)
+{
+    if (!theObj) {
+        return nil;
+    }
+    return new _Constant ((long)(theValue)||(long)(((_Constant*)theObj)->theValue));
+}
+
+//__________________________________________________________________________________
+_PMathObj _Constant::LNot ()
+{
+    return new _Constant (CheckEqual(theValue, 0.0));
+}
+
+//__________________________________________________________________________________
+_PMathObj _Constant::Min (_PMathObj theObj)
+{
+    if (!theObj) {
+        return nil;
+    }
+    if (theValue<((_Constant*)theObj)->theValue) {
+        return (_PMathObj) makeDynamic();
+    }
+    return   (_PMathObj) theObj->makeDynamic();
+}
+
+//__________________________________________________________________________________
+_PMathObj _Constant::Max (_PMathObj theObj)
+{
+    if (!theObj) {
+        return nil;
+    }
+    if (theValue>((_Constant*)theObj)->theValue) {
+        return (_PMathObj) makeDynamic();
+    }
+    return   (_PMathObj) theObj->makeDynamic();
+}
diff --git a/src/core/error.cpp b/src/core/error.cpp
new file mode 100644
index 0000000..3eba078
--- /dev/null
+++ b/src/core/error.cpp
@@ -0,0 +1,479 @@
+/*
+
+HyPhy - Hypothesis Testing Using Phylogenies.
+
+Copyright (C) 1997-2009
+  Sergei L Kosakovsky Pond (spond at ucsd.edu)
+  Art FY Poon              (apoon at cfenet.ubc.ca)
+
+Permission is hereby granted, free of charge, to any person obtaining a
+copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be included
+in all copies or substantial portions of the Software.
+
+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.
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+*/
+
+#include <stdlib.h>
+#include <stdio.h>
+#include "errorfns.h"
+#include "hy_strings.h"
+
+
+
+#if !defined __UNIX__ || defined __HEADLESS__ || defined __MAC__ || defined __HYPHY_GTK__
+#include "preferences.h"
+#endif
+
+#ifdef __MAC__
+#include <Dialogs.h>
+#include "HYUtils.h"
+#include "HYConsoleWindow.h"
+#include "HYDialogs.h"
+#endif
+
+#ifdef __WINDOZE__
+void WinErrorBox(_String&, bool);
+#include "HYDialogs.h"
+#endif
+
+#ifdef __HYPHY_GTK__
+#include <gtk/gtk.h>
+#include "HYConsoleWindow.h"
+#include "HYDialogs.h"
+#endif
+
+#ifdef   __UNIX__
+#if !defined __MINGW32__
+#include <sys/utsname.h>
+#endif
+
+#ifndef __HYPHY_GTK__
+extern  bool dropIntoDebugMode;
+#endif
+#else
+void    SaveConsole (void);
+#endif
+
+#include "batchlan.h"
+
+//_____________________________________________________________
+
+_String  DecodeError                    (long);
+_String* ConstructAnErrorMessage        (_String&);
+
+
+//_____________________________________________________________
+
+int      gError                         = _HYNOERROR;
+
+bool     isFixable                      = true,
+         skipWarningMessages            = false;
+
+_String  errorReportFormatExpression            ("ERROR_REPORT_FORMAT_EXPRESSION"),
+         errorReportFormatExpressionStr            ("_ERROR_TEXT_"),
+         errorReportFormatExpressionStack      ("_ERROR_CALL_STACK_"),
+         errorReportFormatExpressionStdin      ("_ERROR_STDIN_");
+
+
+//_____________________________________________________________
+
+bool gStatus(void)
+{
+    return gError == _HYNOERROR;
+}
+
+//_____________________________________________________________
+
+_String DecodeError (long errCode)
+{
+    switch (errCode) {
+    case -101:
+        return "Incompatible Operands";
+        break;
+    case -102:
+        return "Operation Undefined for Type";
+        break;
+    case -103:
+        return "Incompatible Matrix Dimensions";
+        break;
+    case -104:
+        return "Bad Matrix Definition";
+        break;
+    case -105:
+        return "Matrix Index Out of Range";
+        break;
+    case -106:
+        return "Bad Matrix Index";
+        break;
+    case -108:
+        return "Memory Full";
+        break;
+    case -109:
+        return "Syntax Error";
+        break;
+    case -110:
+        return "Runtime Expression Error";
+        break;
+    case -111:
+        return "Non-polynomial expression encountered in polynomial calculation";
+        break;
+    case -171:
+        return "Dataset index reference out of range";
+        break;
+    case -200:
+        return "Export Matrix Called With a Non-polynomial Matrix Argument";
+        break;
+    case -666:
+        return "Attempting to operate on an undefined value; this is probably a result of an earlier 'soft' error condition";
+        break;
+    default:
+        return "Unclassified Error";
+    }
+}
+
+//_____________________________________________________________
+bool isError (long errCode)
+{
+//  if (errCode == 0)
+//      acknError (false);
+    if (errCode!=_HYNOERROR)  {
+        if (errCode<0) {
+            gError = errCode;
+            isFixable = TRUE;
+            return FALSE;
+        }
+    }
+    gError = _HYNOERROR;
+    return TRUE;
+}
+
+//_____________________________________________________________
+
+void    warnError (long errCode)
+{
+    if (errCode == -108) {
+        warnError (DecodeError (errCode)&_String(" Exiting..."));
+    } else {
+        WarnError (DecodeError (errCode)&_String(" Exiting..."));
+    }
+}
+
+//_____________________________________________________________
+
+void    flagError (long errCode)
+{
+    warnError (DecodeError (errCode));
+}
+
+
+//_____________________________________________________________
+
+void    warnError (const char* theError)
+{
+    FlagError (theError);
+}
+
+//_____________________________________________________________
+
+void    acknError (const char* theError)
+{
+    WarnError (theError);
+}
+
+//_____________________________________________________________
+
+void*   checkPointer (void* p)
+{
+    if (p) {
+        return p;
+    }
+
+    warnError(-108);
+    return nil;
+}
+
+//_______________________________________________________________________
+void    ReportWarning (_String st)
+{
+    checkParameter          (MessageLogging, messageLogFlag, 1.0);
+
+#ifdef  __HEADLESS__
+    if (globalInterfaceInstance && messageLogFlag >= 0.1) {
+        globalInterfaceInstance->PushWarning (&st);
+    }
+#else
+    if ( !globalMessageFile || messageLogFlag<.1 ) {
+        return;
+    }
+
+    char   str[] = "\n";
+    fwrite (str, 1, 1, globalMessageFile);
+    fwrite (st.getStr(), 1, st.Length(), globalMessageFile);
+    fflush (globalMessageFile);
+#endif
+}
+
+
+//_______________________________________________________________________
+void    FlagError (_String st)
+{
+#ifdef  __HEADLESS__
+    if (globalInterfaceInstance) {
+        globalInterfaceInstance->PushError (&st);
+    }
+
+    terminateExecution = true;
+#else
+    char  str[] = "\nError:";
+
+
+    if (globalErrorFile) {
+        fwrite (str, 1, 7, globalErrorFile);
+        fwrite (st.getStr(), 1, st.Length(), globalErrorFile);
+        fflush(globalErrorFile);
+    }
+
+
+#ifdef __HYPHYMPI__
+    int     rank;
+    MPI_Comm_rank(MPI_COMM_WORLD, &rank);
+#endif
+
+#if !defined __MAC__ && !defined __WINDOZE__
+    _String errMsg;
+#ifdef __HYPHYMPI__
+    errMsg = _String("Received an error state from MPI node ") & (long)rank & '\n' & st;
+
+    if (rank > 0) {
+        errMsg = ConstructAnErrorMessage (st);
+        MPISendString (errMsg,0,true);
+    } else {
+        errMsg = _String ("\nMaster node received an error:") & st ;
+    }
+#else
+    errMsg = st;
+#endif
+
+    errMsg = ConstructAnErrorMessage (errMsg);
+
+#ifdef  _MINGW32_MEGA_
+    SetStatusLine  (errMsg);
+#else
+    _SimpleList color (255,2,0,0);
+    StringToConsole(errMsg, &color);
+#endif
+#endif
+
+#ifdef __HYPHYMPI__
+    if (rank==0) {
+        MPI_Abort (MPI_COMM_WORLD,1);
+    }
+#endif
+
+
+#if defined __UNIX__ && !defined __HYPHYQT_ &&! defined __HYPHY_GTK__
+    if (dropIntoDebugMode)
+        while (ExpressionCalculator()) ;
+#endif
+
+#ifdef _HY_ABORT_ON_ERROR
+    abort ();
+#else
+    PurgeAll(true);
+    exit(1);
+#endif
+#endif
+}
+
+//_______________________________________________________________________
+void    WarnErrorWhileParsing (_String st, _String& context)
+{
+    WarnError (_String ("While parsing:\n") & context & "\n" & st);
+}
+
+
+//_______________________________________________________________________
+void WarnError (_String st)
+{
+    if (currentExecutionList && currentExecutionList->errorHandlingMode == HY_BL_ERROR_HANDLING_SOFT) {
+        currentExecutionList->ReportAnExecutionError(st, true);
+        return;
+    }
+
+#ifdef  __HEADLESS__
+    if (globalInterfaceInstance) {
+        globalInterfaceInstance->PushError (&st);
+    }
+    terminateExecution = true;
+#else
+    char  str[] = "\nError:";
+
+    if (globalErrorFile) {
+        fwrite (str, 1, 7, globalErrorFile);
+        fwrite (st.getStr(), 1, st.Length(), globalErrorFile);
+        fflush (globalErrorFile);
+    }
+
+#ifdef __HYPHYMPI__
+    int     rank;
+    MPI_Comm_rank(MPI_COMM_WORLD, &rank);
+#endif
+    if (globalMessageFile) {
+        fprintf (globalMessageFile, "\n%s", st.sData);
+    }
+
+    _String errMsg;
+    #ifdef __HYPHYMPI__
+        errMsg = _String("Received an error state from MPI node ") & (long)rank & '\n' & st;
+
+        if (rank > 0) {
+            errMsg = ConstructAnErrorMessage (st);
+            fprintf (stderr, "HYPHYMPI terminated.\n%s\n\n", errMsg.sData);
+            MPI_Abort (MPI_COMM_WORLD,1);
+            abort   ();
+        } else {
+            errMsg = _String ("\nMaster node received an error:") & st;
+        }
+    #else
+        errMsg = st;
+    #endif
+
+
+
+    errMsg = ConstructAnErrorMessage (errMsg);
+    
+
+    #ifdef  _MINGW32_MEGA_
+        SetStatusLine  (errMsg);
+    #else
+        _SimpleList color (255,2,0,0);
+        StringToConsole(errMsg, &color);
+#ifdef __HYPHYQT__
+    return;
+#endif
+#endif
+
+
+#if defined __UNIX__ && !defined __HYPHY_GTK__ && !defined __HYPHY_QT__
+    if (dropIntoDebugMode)
+        while (ExpressionCalculator()) ;
+#endif
+#ifdef __HYPHYMPI__
+    if (rank==0) {
+        MPI_Abort (MPI_COMM_WORLD,1);
+    }
+#endif
+    //GlobalShutdown();
+
+#ifdef _HY_ABORT_ON_ERROR
+    abort ();
+#else
+    #if defined __MAC__ or defined __WINDOZE__ or defined __HYPHY_GTK__
+      terminateExecution = true;
+      ProblemReport (errMsg);
+    #else
+      exit(1);
+    #endif
+  
+#endif
+
+#endif
+}
+
+//____________________________________________________________________________________
+
+_String* ConstructAnErrorMessage         (_String& theMessage)
+{
+    _String* errMsg = new _String (128L,true);
+
+    _List    calls,
+             stdins;
+
+    ReturnCurrentCallStack (calls, stdins);
+
+    _FString * errorFormattingExpression = (_FString*)FetchObjectFromVariableByType (&errorReportFormatExpression, STRING);
+    bool     doDefault = true;
+
+    if (errorFormattingExpression) {
+        _Formula expression;
+        _String  expr (*errorFormattingExpression->theString),
+                 errMsgLocal;
+        _FormulaParsingContext fpc (&errMsgLocal, nil);
+        
+        if (Parse    (&expression, expr, fpc, nil) == HY_FORMULA_EXPRESSION) {
+            CheckReceptacleAndStore(&errorReportFormatExpressionStr, empty, false, new _FString (theMessage, false), false);
+            CheckReceptacleAndStore(&errorReportFormatExpressionStack, empty, false, new _Matrix (calls), false);
+            CheckReceptacleAndStore(&errorReportFormatExpressionStdin, empty, false, new _Matrix (stdins, false), false);
+            _PMathObj expr = expression.Compute();
+            if (!terminateExecution && expr && expr->ObjectClass() == STRING) {
+                (*errMsg) << ((_FString*)expr)->theString;
+                doDefault = false;
+            }
+        }
+    }
+
+    if (doDefault) {
+        (*errMsg) << "Error:\n";
+        (*errMsg) << theMessage;
+        if (calls.lLength) {
+            (*errMsg) << "\n\nFunction call stack\n";
+            for (unsigned long k = 0; k < calls.lLength; k++) {
+                (*errMsg) << (_String((long)k+1) & " : " & (*(_String*)calls(k)) & '\n');
+                _String* redir = (_String*)stdins (k);
+                if (redir->sLength) {
+                    (*errMsg) << "\tStandard input redirect:\n\t\t";
+                    (*errMsg) << redir->Replace ("\n","\n\t\t",true);
+                }
+                (*errMsg) << "-------\n";
+
+            }
+        }
+    }
+
+    errMsg->Finalize();
+    return errMsg;
+}
+
+//____________________________________________________________________________________
+
+void ReturnCurrentCallStack      (_List& calls, _List& stdins)
+{
+    calls.Clear  ();
+    stdins.Clear ();
+
+    if (executionStack.lLength) {
+        for (long callLevel = executionStack.lLength -1 ; callLevel >=0 ; callLevel --) {
+            _ExecutionList * currentLevel = (_ExecutionList*)executionStack (callLevel);
+
+            calls.AppendNewInstance(new _String ((_String*)((_ElementaryCommand*)(*currentLevel)(currentLevel->currentCommand?currentLevel->currentCommand-1:0))->toStr()));
+
+            if (currentLevel->stdinRedirect) {
+                stdins.AppendNewInstance ((_String*)currentLevel->stdinRedirect->toStr());
+            } else {
+                stdins.AppendNewInstance (new _String);
+            }
+        }
+    }
+}
+
+//_____________________________________________________________
+//EOF
+
+
+
+
+
diff --git a/src/core/fisher_exact.cpp b/src/core/fisher_exact.cpp
new file mode 100644
index 0000000..f76858c
--- /dev/null
+++ b/src/core/fisher_exact.cpp
@@ -0,0 +1,2395 @@
+/*
+
+This file is a C++ translation of the Mehta-Patel network
+algorithm for computing association p-values on NxM contigency
+table
+
+Original source from
+
+    http://portal.acm.org/citation.cfm?id=214326&jmp=indexterms&dl=GUIDE&dl=ACM
+
+Cleaned up and dapted for C++. Included a bug fix for negative keys
+in hash tables in f3xact_.
+
+Sergei L. Kosakovsky Pond,
+October 2003
+
+Function prototype is declared in matrix.h
+
+*/
+
+#include "hy_strings.h"
+#include <stdlib.h>
+#include <math.h>
+#ifdef    __HYPHYDMALLOC__
+#include "dmalloc.h"
+#endif
+
+/* ----------------------------------------------------------------------- */
+// Function Prototypes
+
+void        allocate_fexact_keys (long, long);
+void        free_fexact_keys     (void);
+
+int         fexact_(long,    long, double *, double , double , double , double *, double *);
+int         isort_ (long*,   long *);
+double      alogam_(double*, long *);
+double      gammds_(double*, double *, long *);
+int         f2xact_(long *, long *, double *,
+                    double *, double *, double *,
+                    double *, double *, double *, long *, long *, long *, long *, long *,
+                    long *, long *, long *, double *, long *,
+                    long *, double *, double *, double *,
+                    long *, long *, double *);
+
+
+int         f3xact_(long *, long *, long *, long *, double *, long *, double *,
+                    long *, long *, long *, long *, long *, long *, long *, long *, long *, double *, double *, double *);
+int         f4xact_(long *, long *, long *, long *, double *, double *, long *,
+                    long *, long *, long *, long *, long *, long *, double *, double *);
+int         f5xact_(double *, double *, long *, long *, long *, long *,
+                    double *, long *, long *, long *, long *, long *, long *, long *, bool *);
+int         f6xact_(long *,  long *, long *, long *, long *, long *, long *, long *);
+int         f7xact_(long *,  long *, long *, long *, long *, long *);
+int         f8xact_(long *,  long *, long *, long *, long *);
+double      f9xact_(long *,  long *, long *, double *);
+int         f10act_(long,  long *, long , long * , double * , bool * , double * , long * , long * , long *);
+void        f11act_(long *,  long, long, long *);
+long        i_dnnt (double *);
+/* ----------------------------------------------------------------------- */
+
+#define Minimum(a,b) (((a)<(b))?(a):(b))
+#define Maximum(a,b) (((a)>(b))?(a):(b))
+
+/* ----------------------------------------------------------------------- */
+inline long i_dnnt(double *x)
+{
+    return( (*x)>=0 ? (long) (*x + .5) : (long) (*x - .5) );
+}
+
+long    *fexact_i4 = nil,
+         *fexact_i5 = nil,
+          *fexact_i7 = nil,
+           *fexact_i10 = nil;
+
+double  *fexact_i6 = nil,
+         *fexact_i8 = nil,
+          *fexact_i9 = nil,
+           *fexact_i9a = nil;
+
+long    fexact_ldkey = 0,
+        fexact_ldstp = 0;
+
+/* ----------------------------------------------------------------------- */
+
+void    allocate_fexact_keys (long ldkey, long mult)
+{
+    fexact_ldkey = ldkey;
+    fexact_ldstp = ldkey * mult;
+    long    i__1    = ldkey << 1;
+
+    fexact_i4  = (long*) MemAllocate(i__1*sizeof (long));
+    fexact_i5 = (long*) MemAllocate(i__1*sizeof (long));
+    i__1 = fexact_ldstp << 1;
+    fexact_i6 = (double*) MemAllocate(i__1*sizeof (double));
+    i__1 = fexact_ldstp * 6;
+    fexact_i7 = (long*) MemAllocate(i__1*sizeof (long));
+    i__1 = ldkey << 1;
+    fexact_i8 = (double*) MemAllocate(i__1*sizeof (double));
+    fexact_i9  = (double*) MemAllocate(i__1*sizeof (double));
+    fexact_i9a = (double*) MemAllocate(i__1*sizeof (double));
+    fexact_i10  = (long*) MemAllocate(i__1*sizeof (long));
+}
+
+/* ----------------------------------------------------------------------- */
+
+void    free_fexact_keys (void)
+{
+    free (fexact_i4);
+    free (fexact_i5);
+    free (fexact_i6);
+    free (fexact_i7);
+    free (fexact_i8);
+    free (fexact_i9);
+    free (fexact_i9a);
+    free (fexact_i10);
+
+    fexact_i4 = nil;
+}
+
+
+
+/* ----------------------------------------------------------------------- */
+/*  Name:       isort_ */
+
+/*  Purpose:    Shell sort for an long vector. */
+
+/*  Usage:      isort_ (N, IX) */
+
+/*  Arguments: */
+/*     n      - Lenth of vector IX.  (Input) */
+/*     ix     - Vector to be sorted.  (Input/output) */
+/* ----------------------------------------------------------------------- */
+
+int isort_(long *n, long *ix)
+{
+    long i__,
+         j,
+         m,
+         il[10],
+         kl,
+         it,
+         iu[10],
+         ku,
+         ikey;
+    /* Parameter adjustments */
+    --ix;
+
+    /* Function Body */
+    m = 1;
+    i__ = 1;
+    j = *n;
+L10:
+    if (i__ >= j) {
+        goto L40;
+    }
+
+    kl = i__;
+    ku = j;
+    ikey = i__;
+    ++j;
+    /*                                  Find element in first half */
+L20:
+    ++i__;
+    if (i__ < j) {
+        if (ix[ikey] > ix[i__]) {
+            goto L20;
+        }
+    }
+    /*                                  Find element in second half */
+L30:
+    --j;
+    if (ix[j] > ix[ikey]) {
+        goto L30;
+    }
+    /*                                  Interchange */
+    if (i__ < j) {
+        it = ix[i__];
+        ix[i__] = ix[j];
+        ix[j] = it;
+        goto L20;
+    }
+    it = ix[ikey];
+    ix[ikey] = ix[j];
+    ix[j] = it;
+    /*                                  Save upper and lower subscripts of */
+    /*                                  the array yet to be sorted */
+    if (m < 11) {
+        if (j - kl < ku - j) {
+            il[m - 1] = j + 1;
+            iu[m - 1] = ku;
+            i__ = kl;
+            --j;
+        } else {
+            il[m - 1] = kl;
+            iu[m - 1] = j - 1;
+            i__ = j + 1;
+            j = ku;
+        }
+        ++m;
+        goto L10;
+    } else {
+        _String errorMsg ("Internal error in shell sort");
+        WarnError (errorMsg);
+    }
+    /*                                  Use another segment */
+L40:
+    --m;
+    if (m == 0) {
+        goto L9000;
+    }
+    i__ = il[m - 1];
+    j = iu[m - 1];
+    goto L10;
+
+L9000:
+    return 0;
+} /* isort_ */
+
+/* ----------------------------------------------------------------------- */
+/*  Name:       GAMMDS */
+
+/*  Purpose:    Cumulative distribution for the gamma distribution. */
+
+/*  Usage:      PGAMMA (Q, ALPHA,IFAULT) */
+
+/*  Arguments: */
+/*     Q      - Value at which the distribution is desired.  (Input) */
+/*     ALPHA  - Parameter in the gamma distribution.  (Input) */
+/*     IFAULT - Error indicator.  (Output) */
+/*               IFAULT  DEFINITION */
+/*                 0     No error */
+/*                 1     An argument is misspecified. */
+/*                 2     A numerical error has occurred. */
+/*     PGAMMA - The cdf for the gamma distribution with parameter alpha */
+/*              evaluated at Q.  (Output) */
+/* ----------------------------------------------------------------------- */
+
+double gammds_(double *y, double *p, long *ifault)
+{
+    /* Initialized data */
+
+    double e = 1e-6;
+    double zero = 0.;
+    double one = 1.;
+
+    /* System generated locals */
+    double ret_val, d__1, d__2;
+
+
+    /* Local variables */
+    double a, c__, f;
+    long ifail;
+
+    *ifault = 1;
+    ret_val = zero;
+    if (*y <= zero || *p <= zero) {
+        return ret_val;
+    }
+    *ifault = 2;
+
+    d__2 = *p + one;
+    d__1 = *p * log(*y) - alogam_(&d__2, &ifail) - *y;
+    f = exp(d__1);
+    if (f == zero) {
+        return ret_val;
+    }
+    *ifault = 0;
+
+    /*       Series begins */
+
+    c__ = one;
+    ret_val = one;
+    a = *p;
+L10:
+    a += one;
+    c__ = c__ * *y / a;
+    ret_val += c__;
+    if (c__ / ret_val > e) {
+        goto L10;
+    }
+    ret_val *= f;
+    return ret_val;
+} /* gammds_ */
+
+/* ----------------------------------------------------------------------- */
+/*  Name:       ALOGAM */
+
+/*  Purpose:    Value of the log-gamma function. */
+
+/*  Usage:      ALOGAM (X, IFAULT) */
+
+/*  Arguments: */
+/*     X      - Value at which the log-gamma function is to be evaluated. */
+/*              (Input) */
+/*     IFAULT  - Error indicator.  (Output) */
+/*               IFAULT  DEFINITION */
+/*                 0     No error */
+/*                 1     X .LT. 0 */
+/*     ALGAMA - The value of the log-gamma function at XX.  (Output) */
+/* ----------------------------------------------------------------------- */
+
+double alogam_(double *x, long *ifault)
+{
+    /* Initialized data */
+
+    static double a1 = .918938533204673;
+    static double a2 = 5.95238095238e-4;
+    static double a3 = 7.93650793651e-4;
+    static double a4 = .002777777777778;
+    static double a5 = .083333333333333;
+    static double half = .5;
+    static double zero = 0.;
+    static double one = 1.;
+    static double seven = 7.;
+
+    /* System generated locals */
+    double ret_val;
+
+    /* Local variables */
+    double f, y, z__;
+
+    ret_val = zero;
+    *ifault = 1;
+    if (*x < zero) {
+        return ret_val;
+    }
+    *ifault = 0;
+    y = *x;
+    f = zero;
+    if (y >= seven) {
+        goto L30;
+    }
+    f = y;
+L10:
+    y += one;
+    if (y >= seven) {
+        goto L20;
+    }
+    f *= y;
+    goto L10;
+L20:
+    f = -log(f);
+L30:
+    z__ = one / (y * y);
+    ret_val = f + (y - half) * log(y) - y + a1 + (((-a2 * z__ + a3) * z__ -
+              a4) * z__ + a5) / y;
+    return ret_val;
+} /* alogam_ */
+
+/* ----------------------------------------------------------------------- */
+/*  Name:       F11ACT */
+
+/*  Purpose:    Routine for revising row totals. */
+
+/*  Arguments: */
+/*     IROW   - Vector containing the row totals.  (Input) */
+/*     I1     - Indicator.  (Input) */
+/*     I2     - Indicator.  (Input) */
+/*     N      - Vector containing the row totals.  (Input) */
+/* ----------------------------------------------------------------------- */
+void f11act_(long *irow, long i1, long i2, long *n)
+{
+    for (long i = 0; i < i1-1; i++) {
+        n[i] = irow[i];
+    }
+    {
+        for (long i = i1-1; i < i2; i++) {
+            n[i] = irow[i + 1];
+        }
+    }
+} /* f11act_ */
+
+/* ----------------------------------------------------------------------- */
+/*  Name:       F10ACT */
+
+/*  Purpose:    Computes the shortest path length for special tables. */
+
+/*  Usage:      CALL F10ACT (NROW, IROW, NCOL, ICOL, VAL, XMIN, FACT, ND, */
+/*                          NE, M) */
+
+/*  Arguments: */
+/*     NROW   - The number of rows in the table.  (Input) */
+/*     IROW   - Vector of length NROW containing the row totals.  (Input) */
+/*     NCOL   - The number of columns in the table.  (Input) */
+/*     ICO    - Vector of length NCOL containing the column totals. */
+/*              (Input) */
+/*     VAL    - The shortest path.  (Output) */
+/*     XMIN   - Set to true if shortest path obtained.  (Output) */
+/*     FACT   - Vector containing the logarithms of factorials. */
+/*              (Input) */
+/*     ND     - Workspace vector of length NROW. */
+/*     NE     - Workspace vector of length NCOL. */
+/*     M      - Workspace vector of length NCOL. */
+
+/*  Chapter:    STAT/LIBRARY Categorical and Discrete Data Analysis */
+/* ----------------------------------------------------------------------- */
+int f10act_(long nrow, long *irow, long ncol, long *icol, double *val, bool *xmin, double *fact, long *nd, long *ne, long *m)
+{
+    /* System generated locals */
+    long is, ix;
+
+    /* Parameter adjustments */
+
+    long i__,
+         i__1;
+
+    --m;
+    --ne;
+    --nd;
+    --icol;
+    --irow;
+
+    /* Function Body */
+
+    //for (long i1 = 0; i1 < nrow; i1++)
+    //  nd[i1] = 0;
+
+    i__1 = nrow - 1;
+    for (i__ = 1; i__ <= i__1; ++i__) {
+        nd[i__] = 0;
+    }
+
+    is = icol[1] / nrow;
+    ne[1] = is;
+
+    //is = icol[0]/nrow;
+    //ne[0] = is;
+
+    ix = icol[1] - nrow * is;
+    m[1] = ix;
+
+    //ix = icol[0] - nrow*is;
+    //m[0] = ix;
+
+    //if (ix != 0)
+    //++nd[ix-1];
+
+    if (ix != 0) {
+        ++nd[ix];
+    }
+
+    i__1 = ncol;
+    for (i__ = 2; i__ <= i__1; ++i__) {
+        ix = icol[i__] / nrow;
+        ne[i__] = ix;
+        is += ix;
+        ix = icol[i__] - nrow * ix;
+        m[i__] = ix;
+        if (ix != 0) {
+            ++nd[ix];
+        }
+    }
+
+    /*for (long i2 = 1; i2 < ncol; i2++)
+    {
+        long t = icol[i2]/nrow;
+        ne[i2] = t;
+        is += t;
+        t = icol[i2] - nrow*t;
+        m[i2] = t;
+        if (t != 0)
+            nd[t-1]++;
+    }*/
+
+    for (i__ = nrow - 2; i__ >= 1; --i__) {
+        nd[i__] += nd[i__ + 1];
+    }
+
+    //for (long i3 = nrow-3; i3>=0; i3--)
+    //  nd[i3] += nd [i3+1];
+
+    ix = 0;
+    long nrw1 = nrow + 1;
+    for (i__ = nrow; i__ >= 2; --i__) {
+        ix = ix + is + nd[nrw1 - i__] - irow[i__];
+        if (ix < 0) {
+            return 0;
+        }
+    }
+
+    /*ix = 0;
+    for (long i4 = nrow; i4>=1; i4--)
+    {
+        ix += is + nd[nrow-i4+1] - irow[i4];
+        if (ix<0)
+            return 0;
+    }*/
+
+    i__1 = ncol;
+    for (i__ = 1; i__ <= i__1; ++i__) {
+        ix = ne[i__];
+        is = m[i__];
+        *val = *val + is * fact[ix + 1] + (nrow - is) * fact[ix];
+    }
+    *xmin = true;
+
+    /* double   temp = 0.0;
+
+     for (long i5 = 0; i5 < ncol; i5++)
+     {
+        ix = ne[i5];
+        is = m[i5];
+
+        temp += is *fact[ix+1] + (nrow-is)*fact[ix];
+     }
+     *val += temp;
+     *xmin = true;*/
+
+    return 0;
+}
+
+/* ----------------------------------------------------------------------- */
+/*  Name:       F9XACT */
+
+/*  Purpose:    Computes the log of a multinomial coefficient. */
+
+/*  Usage:      F9XACT(N, MM, IR, FACT) */
+
+/*  Arguments: */
+/*     N      - Length of IR.  (Input) */
+/*     MM     - Number for factorial in numerator.  (Input) */
+/*     IR     - Vector of length N containing the numebers for the */
+/*              denominator of the factorial.  (Input) */
+/*     FACT   - Table of log factorials.  (Input) */
+/*     F9XACT  - The log of the multinomal coefficient.  (Output) */
+/* ----------------------------------------------------------------------- */
+double f9xact_(long *n, long *mm, long *ir, double *fact)
+{
+    /* System generated locals */
+    long    i__1,
+            k;
+
+    double  ret_val;
+
+    /* Parameter adjustments */
+    --ir;
+
+    /* Function Body */
+    ret_val = fact[*mm];
+    i__1 = *n;
+    for (k = 1; k <= i__1; ++k) {
+        ret_val -= fact[ir[k]];
+    }
+
+    return ret_val;
+} /* f9xact_ */
+
+/* ----------------------------------------------------------------------- */
+/*  Name:       F8XACT */
+
+/*  Purpose:    Routine for reducing a vector when there is a zero */
+/*              element. */
+
+/*  Usage:      CALL F8XACT (IROW, IS, I1, IZERO, NEW) */
+
+/*  Arguments: */
+/*     IROW   - Vector containing the row counts.  (Input) */
+/*     IS     - Indicator.  (Input) */
+/*     I1     - Indicator.  (Input) */
+/*     IZERO  - Position of the zero.  (Input) */
+/*     NEW    - Vector of new row counts.  (Output) */
+/* ----------------------------------------------------------------------- */
+int f8xact_(long *irow, long *is, long *i1, long *izero, long *new__)
+{
+    /* System generated locals */
+    long i__1,
+         i__;
+
+    /* Parameter adjustments */
+    --new__;
+    --irow;
+
+    /* Function Body */
+    i__1 = *i1 - 1;
+    for (i__ = 1; i__ <= i__1; ++i__) {
+        new__[i__] = irow[i__];
+        /* L10: */
+    }
+
+    i__1 = *izero - 1;
+    for (i__ = *i1; i__ <= i__1; ++i__) {
+        if (*is >= irow[i__ + 1]) {
+            goto L30;
+        }
+        new__[i__] = irow[i__ + 1];
+        /* L20: */
+    }
+
+    i__ = *izero;
+L30:
+    new__[i__] = *is;
+L40:
+    ++i__;
+    if (i__ > *izero) {
+        return 0;
+    }
+    new__[i__] = irow[i__];
+    goto L40;
+} /* f8xact_ */
+
+/* ----------------------------------------------------------------------- */
+/*  Name:       F7XACT */
+
+/*  Purpose:    Generate the new nodes for given marinal totals. */
+
+/*  Usage:      CALL F7XACT (NROW, IMAX, IDIF, K, KS, IFLAG) */
+
+/*  Arguments: */
+/*     NROW   - The number of rows in the table.  (Input) */
+/*     IMAX   - The row marginal totals.  (Input) */
+/*     IDIF   - The column counts for the new column.  (Input/output) */
+/*     K      - Indicator for the row to decrement.  (Input/output) */
+/*     KS     - Indicator for the row to increment.  (Input/output) */
+/*     IFLAG  - Status indicator.  (Output) */
+/*              If IFLAG is zero, a new table was generated.  For */
+/*              IFLAG = 1, no additional tables could be generated. */
+/* ----------------------------------------------------------------------- */
+int f7xact_(long *nrow, long *imax, long *idif, long *k, long *ks, long *iflag)
+{
+    /* System generated locals */
+    long i__1, i__2, i__, m, k1, mm;
+
+    /* Parameter adjustments */
+    --idif;
+    --imax;
+
+    /* Function Body */
+    *iflag = 0;
+    /*                                  Find node which can be */
+    /*                                  incremented, ks */
+    if (*ks == 0) {
+L10:
+        ++(*ks);
+        if (idif[*ks] == imax[*ks]) {
+            goto L10;
+        }
+    }
+    /*                                 Find node to decrement (>ks) */
+    /* L20: */
+    if (idif[*k] > 0 && *k > *ks) {
+        --idif[*k];
+L30:
+        --(*k);
+        if (imax[*k] == 0) {
+            goto L30;
+        }
+        m = *k;
+        /*                                 Find node to increment (>=ks) */
+L40:
+        if (idif[m] >= imax[m]) {
+            --m;
+            goto L40;
+        }
+        ++idif[m];
+        /*                                 Change ks */
+        if (m == *ks) {
+            if (idif[m] == imax[m]) {
+                *ks = *k;
+            }
+        }
+    } else {
+        /*                                 Check for finish */
+L50:
+        i__1 = *nrow;
+        for (k1 = *k + 1; k1 <= i__1; ++k1) {
+            if (idif[k1] > 0) {
+                goto L70;
+            }
+            /* L60: */
+        }
+        *iflag = 1;
+        goto L9000;
+        /*                                 Reallocate counts */
+L70:
+        mm = 1;
+        i__1 = *k;
+        for (i__ = 1; i__ <= i__1; ++i__) {
+            mm += idif[i__];
+            idif[i__] = 0;
+            /* L80: */
+        }
+        *k = k1;
+L90:
+        --(*k);
+        /* Computing MIN */
+        i__1 = mm, i__2 = imax[*k];
+        m = Minimum(i__1,i__2);
+        idif[*k] = m;
+        mm -= m;
+        if (mm > 0 && *k != 1) {
+            goto L90;
+        }
+        /*                                 Check that all counts */
+        /*                                 reallocated */
+        if (mm > 0) {
+            if (k1 != *nrow) {
+                *k = k1;
+                goto L50;
+            }
+            *iflag = 1;
+            goto L9000;
+        }
+        /*                                 Get ks */
+        --idif[k1];
+        *ks = 0;
+L100:
+        ++(*ks);
+        if (*ks > *k) {
+            goto L9000;
+        }
+        if (idif[*ks] >= imax[*ks]) {
+            goto L100;
+        }
+    }
+
+L9000:
+    return 0;
+} /* f7xact_ */
+
+
+/* ----------------------------------------------------------------------- */
+/*  Name:       F6XACT */
+
+/*  Purpose:    Pop a node off the stack. */
+
+/*  Usage:      CALL F6XACT (NROW, IROW, IFLAG, KYY, KEY, LDKEY, LAST, */
+/*                          IPN) */
+
+/*  Arguments: */
+/*     NROW   - The number of rows in the table.  (Input) */
+/*     IROW   - Vector of length nrow containing the row sums on output. */
+/*              (Output) */
+/*     IFLAG  - Set to 3 if there are no additional nodes to process. */
+/*              (Output) */
+/*     KYY    - Constant mutlipliers used in forming the hash table key. */
+/*              (Input) */
+/*     KEY    - Vector of length LDKEY containing the hash table keys. */
+/*              (Input/output) */
+/*     LDKEY  - Length of vector KEY.  (Input) */
+/*     LAST   - Index of the last key popped off the stack. */
+/*              (Input/output) */
+/*     IPN    - Pointer to the linked list of past path lengths. */
+/*              (Output) */
+/* ----------------------------------------------------------------------- */
+int f6xact_(long *nrow, long *irow, long *iflag, long *kyy, long *key, long *ldkey, long *last, long *ipn)
+{
+    long j,
+         kval;
+
+
+    /* Parameter adjustments */
+    --key;
+    --kyy;
+    --irow;
+
+    /* Function Body */
+L10:
+    ++(*last);
+    if (*last <= *ldkey) {
+        if (key[*last] < 0) {
+            goto L10;
+        }
+        /*                                  Get KVAL from the stack */
+        kval = key[*last];
+        key[*last] = -9999;
+        for (j = *nrow; j >= 2; --j) {
+            irow[j] = kval / kyy[j];
+            kval -= irow[j] * kyy[j];
+            /* L20: */
+        }
+        irow[1] = kval;
+        *ipn = *last;
+    } else {
+        *last = 0;
+        *iflag = 3;
+    }
+    return 0;
+} /* f6xact_ */
+
+/* ----------------------------------------------------------------------- */
+/*  Name:       F5XACT */
+
+/*  Purpose:    Put node on stack in network algorithm. */
+
+/*  Usage:      CALL F5XACT (PASTP, TOL, KVAL, KEY, LDKEY, IPOIN, STP, */
+/*                          LDSTP, IFRQ, NPOIN, NR, NL, IFREQ, ITOP, */
+/*                          IPSH) */
+
+/*  Arguments: */
+/*     PASTP  - The past path length.  (Input) */
+/*     TOL    - Tolerance for equivalence of past path lengths.  (Input) */
+/*     KVAL   - Key value.  (Input) */
+/*     KEY    - Vector of length LDKEY containing the key values. */
+/*              (Input/output) */
+/*     LDKEY  - Length of vector KEY.  (Input) */
+/*     IPOIN  - Vector of length LDKEY pointing to the linked list */
+/*              of past path lengths.  (Input/output) */
+/*     STP    - Vector of length LSDTP containing the linked lists */
+/*              of past path lengths.  (Input/output) */
+/*     LDSTP  - Length of vector STP.  (Input) */
+/*     IFRQ   - Vector of length LDSTP containing the past path */
+/*              frequencies.  (Input/output) */
+/*     NPOIN  - Vector of length LDSTP containing the pointers to */
+/*              the next past path length.  (Input/output) */
+/*     NR     - Vector of length LDSTP containing the right object */
+/*              pointers in the tree of past path lengths. */
+/*              (Input/output) */
+/*     NL     - Vector of length LDSTP containing the left object */
+/*              pointers in the tree of past path lengths. */
+/*              (Input/output) */
+/*     IFREQ  - Frequency of the current path length.  (Input) */
+/*     ITOP   - Pointer to the top of STP.  (Input) */
+/*     IPSH   - Option parameter.  (Input) */
+/*              If IPSH is true, the past path length is found in the */
+/*              table KEY.  Otherwise the location of the past path */
+/*              length is assumed known and to have been found in */
+/*              a previous call. */
+/* ----------------------------------------------------------------------- */
+int f5xact_(double *pastp, double *tol, long *kval, long *key, long *ldkey, long *ipoin,
+            double *stp, long *ldstp, long *ifrq, long *npoin, long *nr, long *nl, long *ifreq, long *itop, bool *ipsh)
+{
+    /* System generated locals */
+    static  long    itp;
+
+    long    i__1,
+            ird,
+            ipn,
+            itmp;
+
+    double  test1,
+            test2;
+
+    _String errMsg;
+
+    /* Parameter adjustments */
+    --nl;
+    --nr;
+    --npoin;
+    --ifrq;
+    --stp;
+    --ipoin;
+    --key;
+
+    /* Function Body */
+    if (*ipsh) {
+        /*                                  Convert KVAL to long in range */
+        /*                                  1, ..., LDKEY. */
+        ird = *kval % *ldkey + 1;
+        /*                                  Search for an unused location */
+        i__1 = *ldkey;
+        for (itp = ird; itp <= i__1; ++itp) {
+            if (key[itp] == *kval) {
+                goto L40;
+            }
+            if (key[itp] < 0) {
+                goto L30;
+            }
+            /* L10: */
+        }
+
+        i__1 = ird - 1;
+        for (itp = 1; itp <= i__1; ++itp) {
+            if (key[itp] == *kval) {
+                goto L40;
+            }
+            if (key[itp] < 0) {
+                goto L30;
+            }
+            /* L20: */
+        }
+        /*                                  Return if KEY array is full */
+        errMsg = "Fisher Exact:LDKEY is too small for this problem.  It is not possible to estimate the value of LDKEY required, but twice the current value may be sufficient.";
+        WarnError (errMsg);
+        return 0;
+        /*                                  Update KEY */
+L30:
+        key[itp] = *kval;
+        ++(*itop);
+        ipoin[itp] = *itop;
+        /*                                  Return if STP array full */
+        if (*itop > *ldstp) {
+            errMsg = "Fisher Exact: LDSTP is too small for this problem.  It is not possible to estimate the value of LDSTP required, but twice the current value may be sufficient.";
+            WarnError (errMsg);
+            return 0;
+        }
+        /*                                  Update STP, etc. */
+        npoin[*itop] = -1;
+        nr[*itop] = -1;
+        nl[*itop] = -1;
+        stp[*itop] = *pastp;
+        ifrq[*itop] = *ifreq;
+        goto L9000;
+    }
+    /*                                  Find location, if any, of pastp */
+L40:
+    ipn = ipoin[itp];
+    test1 = *pastp - *tol;
+    test2 = *pastp + *tol;
+
+L50:
+    if (stp[ipn] < test1) {
+        ipn = nl[ipn];
+        if (ipn > 0) {
+            goto L50;
+        }
+    } else if (stp[ipn] > test2) {
+        ipn = nr[ipn];
+        if (ipn > 0) {
+            goto L50;
+        }
+    } else {
+        ifrq[ipn] += *ifreq;
+        goto L9000;
+    }
+    /*                                  Return if STP array full */
+    ++(*itop);
+    if (*itop > *ldstp) {
+        errMsg = "Fisher Exact: LDSTP is too small for this problem.  It is not possible to estimate the value of LDSTP required, but twice the current value may be sufficient.";
+        WarnError (errMsg);
+        goto L9000;
+    }
+    /*                                  Find location to add value */
+    ipn = ipoin[itp];
+    itmp = ipn;
+L60:
+    if (stp[ipn] < test1) {
+        itmp = ipn;
+        ipn = nl[ipn];
+        if (ipn > 0) {
+            goto L60;
+        } else {
+            nl[itmp] = *itop;
+        }
+    } else if (stp[ipn] > test2) {
+        itmp = ipn;
+        ipn = nr[ipn];
+        if (ipn > 0) {
+            goto L60;
+        } else {
+            nr[itmp] = *itop;
+        }
+    }
+    /*                                  Update STP, etc. */
+    npoin[*itop] = npoin[itmp];
+    npoin[itmp] = *itop;
+    stp[*itop] = *pastp;
+    ifrq[*itop] = *ifreq;
+    nl[*itop] = -1;
+    nr[*itop] = -1;
+
+L9000:
+    return 0;
+} /* f5xact_ */
+
+/* ----------------------------------------------------------------------- */
+/*  Name:       F4XACT */
+
+/*  Purpose:    Computes the longest path length for a given table. */
+
+/*  Usage:      CALL F4XACT (NROW, IROW, NCOL, ICOL, DSP, FACT, ICSTK, */
+/*                          NCSTK, LSTK, MSTK, NSTK, NRSTK, IRSTK, YSTK, */
+/*                          TOL) */
+
+/*  Arguments: */
+/*     NROW   - The number of rows in the table.  (Input) */
+/*     IROW   - Vector of length NROW containing the row sums for the */
+/*              table.  (Input) */
+/*     NCOL   - The number of columns in the table.  (Input) */
+/*     ICOL   - Vector of length K containing the column sums for the */
+/*              table.  (Input) */
+/*     DSP    - The shortest path for the table.  (Output) */
+/*     FACT   - Vector containing the logarithms of factorials.  (Input) */
+/*     ICSTK  - NCOL by NROW+NCOL+1 work array. */
+/*     NCSTK  - Work vector of length NROW+NCOL+1. */
+/*     LSTK   - Work vector of length NROW+NCOL+1. */
+/*     MSTK   - Work vector of length NROW+NCOL+1. */
+/*     NSTK   - Work vector of length NROW+NCOL+1. */
+/*     NRSTK  - Work vector of length NROW+NCOL+1. */
+/*     IRSTK  - NROW by MAX(NROW,NCOL) work array. */
+/*     YSTK   - Work vector of length NROW+NCOL+1. */
+/*     TOL    - Tolerance.  (Input) */
+/* ----------------------------------------------------------------------- */
+int f4xact_(long *nrow, long *irow, long *ncol,
+            long *icol, double *dsp, double *fact, long *icstk,
+            long *ncstk, long *lstk, long *mstk, long *nstk,
+            long *nrstk, long *irstk, double *ystk, double *tol)
+{
+    /* System generated locals */
+    long icstk_dim1,
+         icstk_offset,
+         irstk_dim1,
+         irstk_offset,
+         i__1,
+         i__,
+         j,
+         k,
+         l,
+         m,
+         n,
+         mn,
+         ic1,
+         ir1,
+         ict,
+         nco,
+         irt,
+         nro,
+         istk;
+
+    double y,
+           amx;
+
+
+    /* Parameter adjustments */
+    irstk_dim1 = *nrow;
+    irstk_offset = 1 + irstk_dim1;
+    irstk -= irstk_offset;
+    --irow;
+    icstk_dim1 = *ncol;
+    icstk_offset = 1 + icstk_dim1;
+    icstk -= icstk_offset;
+    --icol;
+    --ncstk;
+    --lstk;
+    --mstk;
+    --nstk;
+    --nrstk;
+    --ystk;
+
+    /* Function Body */
+    if (*nrow == 1) {
+        i__1 = *ncol;
+        for (i__ = 1; i__ <= i__1; ++i__) {
+            *dsp -= fact[icol[i__]];
+            /* L10: */
+        }
+        goto L9000;
+    }
+
+    if (*ncol == 1) {
+        i__1 = *nrow;
+        for (i__ = 1; i__ <= i__1; ++i__) {
+            *dsp -= fact[irow[i__]];
+            /* L20: */
+        }
+        goto L9000;
+    }
+
+    if (*nrow * *ncol == 4) {
+        if (irow[2] <= icol[2]) {
+            *dsp = *dsp - fact[irow[2]] - fact[icol[1]] - fact[icol[2] - irow[
+                        2]];
+        } else {
+            *dsp = *dsp - fact[icol[2]] - fact[irow[1]] - fact[irow[2] - icol[
+                        2]];
+        }
+        goto L9000;
+    }
+    /*                                  initialization before loop */
+    i__1 = *nrow;
+    for (i__ = 1; i__ <= i__1; ++i__) {
+        irstk[i__ + irstk_dim1] = irow[*nrow - i__ + 1];
+        /* L30: */
+    }
+
+    i__1 = *ncol;
+    for (j = 1; j <= i__1; ++j) {
+        icstk[j + icstk_dim1] = icol[*ncol - j + 1];
+        /* L40: */
+    }
+
+    nro = *nrow;
+    nco = *ncol;
+    nrstk[1] = nro;
+    ncstk[1] = nco;
+    ystk[1] = 0.f;
+    y = 0.f;
+    istk = 1;
+    l = 1;
+    amx = 0.f;
+
+L50:
+    ir1 = irstk[istk * irstk_dim1 + 1];
+    ic1 = icstk[istk * icstk_dim1 + 1];
+    if (ir1 > ic1) {
+        if (nro >= nco) {
+            m = nco - 1;
+            n = 2;
+        } else {
+            m = nro;
+            n = 1;
+        }
+    } else if (ir1 < ic1) {
+        if (nro <= nco) {
+            m = nro - 1;
+            n = 1;
+        } else {
+            m = nco;
+            n = 2;
+        }
+    } else {
+        if (nro <= nco) {
+            m = nro - 1;
+            n = 1;
+        } else {
+            m = nco - 1;
+            n = 2;
+        }
+    }
+
+L60:
+    if (n == 1) {
+        i__ = l;
+        j = 1;
+    } else {
+        i__ = 1;
+        j = l;
+    }
+
+    irt = irstk[i__ + istk * irstk_dim1];
+    ict = icstk[j + istk * icstk_dim1];
+    mn = irt;
+    if (mn > ict) {
+        mn = ict;
+    }
+    y += fact[mn];
+    if (irt == ict) {
+        --nro;
+        --nco;
+        f11act_(&irstk[istk * irstk_dim1 + 1], i__, nro, &irstk[(istk + 1) *
+                irstk_dim1 + 1]);
+        f11act_(&icstk[istk * icstk_dim1 + 1], j, nco, &icstk[(istk + 1) *
+                icstk_dim1 + 1]);
+    } else if (irt > ict) {
+        --nco;
+        f11act_(&icstk[istk * icstk_dim1 + 1], j, nco, &icstk[(istk + 1) *
+                icstk_dim1 + 1]);
+        i__1 = irt - ict;
+        f8xact_(&irstk[istk * irstk_dim1 + 1], &i__1, &i__, &nro, &irstk[(
+                    istk + 1) * irstk_dim1 + 1]);
+    } else {
+        --nro;
+        f11act_(&irstk[istk * irstk_dim1 + 1], i__, nro, &irstk[(istk + 1) *
+                irstk_dim1 + 1]);
+        i__1 = ict - irt;
+        f8xact_(&icstk[istk * icstk_dim1 + 1], &i__1, &j, &nco, &icstk[(istk
+                + 1) * icstk_dim1 + 1]);
+    }
+
+    if (nro == 1) {
+        i__1 = nco;
+        for (k = 1; k <= i__1; ++k) {
+            y += fact[icstk[k + (istk + 1) * icstk_dim1]];
+            /* L70: */
+        }
+        goto L90;
+    }
+
+    if (nco == 1) {
+        i__1 = nro;
+        for (k = 1; k <= i__1; ++k) {
+            y += fact[irstk[k + (istk + 1) * irstk_dim1]];
+            /* L80: */
+        }
+        goto L90;
+    }
+
+    lstk[istk] = l;
+    mstk[istk] = m;
+    nstk[istk] = n;
+    ++istk;
+    nrstk[istk] = nro;
+    ncstk[istk] = nco;
+    ystk[istk] = y;
+    l = 1;
+    goto L50;
+
+L90:
+    if (y > amx) {
+        amx = y;
+        if (*dsp - amx <= *tol) {
+            *dsp = 0.f;
+            goto L9000;
+        }
+    }
+
+L100:
+    --istk;
+    if (istk == 0) {
+        *dsp -= amx;
+        if (*dsp - amx <= *tol) {
+            *dsp = 0.f;
+        }
+        goto L9000;
+    }
+    l = lstk[istk] + 1;
+
+L110:
+    if (l > mstk[istk]) {
+        goto L100;
+    }
+    n = nstk[istk];
+    nro = nrstk[istk];
+    nco = ncstk[istk];
+    y = ystk[istk];
+    if (n == 1) {
+        if (irstk[l + istk * irstk_dim1] < irstk[l - 1 + istk * irstk_dim1]) {
+            goto L60;
+        }
+    } else if (n == 2) {
+        if (icstk[l + istk * icstk_dim1] < icstk[l - 1 + istk * icstk_dim1]) {
+            goto L60;
+        }
+    }
+
+    ++l;
+    goto L110;
+L9000:
+    return 0;
+} /* f4xact_ */
+
+
+/* ----------------------------------------------------------------------- */
+/*  Name:       F3XACT */
+
+/*  Purpose:    Computes the shortest path length for a given table. */
+
+/*  Usage:      CALL F3XACT (NROW, IROW, NCOL, ICOL, DLP, MM, FACT, ICO, */
+/*                          IRO, IT, LB, NR, NT, NU, ITC, IST, STV, ALEN, */
+/*                          TOL) */
+
+/*  Arguments: */
+/*     NROW   - The number of rows in the table.  (Input) */
+/*     IROW   - Vector of length NROW containing the row sums for the */
+/*              table.  (Input) */
+/*     NCOL   - The number of columns in the table.  (Input) */
+/*     ICOL   - Vector of length K containing the column sums for the */
+/*              table.  (Input) */
+/*     DLP    - The longest path for the table.  (Output) */
+/*     MM     - The total count in the table.  (Output) */
+/*     FACT   - Vector containing the logarithms of factorials.  (Input) */
+/*     ICO    - Work vector of length MAX(NROW,NCOL). */
+/*     IRO    - Work vector of length MAX(NROW,NCOL). */
+/*     IT     - Work vector of length MAX(NROW,NCOL). */
+/*     LB     - Work vector of length MAX(NROW,NCOL). */
+/*     NR     - Work vector of length MAX(NROW,NCOL). */
+/*     NT     - Work vector of length MAX(NROW,NCOL). */
+/*     NU     - Work vector of length MAX(NROW,NCOL). */
+/*     ITC    - Work vector of length 400. */
+/*     IST    - Work vector of length 400. */
+/*     STV    - Work vector of length 400. */
+/*     ALEN   - Work vector of length MAX(NROW,NCOL). */
+/*     TOL    - Tolerance.  (Input) */
+/* ----------------------------------------------------------------------- */
+int f3xact_(long *nrow, long *irow, long *ncol,
+            long *icol, double *dlp, long *mm, double *fact,
+            long *ico, long *iro, long *it, long *lb, long *nr,
+            long *nt, long *nu, long *itc, long *ist, double *stv,
+            double *alen, double *tol)
+{
+    /* Initialized data */
+
+    long ldst = 200;
+    long nst = 0;
+    long nitc = 0;
+
+    /* System generated locals */
+    long i__1;
+    double d__1, d__2;
+
+    /* Local variables */
+    long i__, k;
+    double v;
+    long n11, n12, ii, nn, ks, ic1, ic2, nc1, nn1, nr1, nco;
+    double val;
+    long nct, ipn, irl, key, lev, itp, nro;
+    double vmn;
+    long nrt, kyy, nc1s;
+    bool xmin;
+    _String errMsg;
+
+    /* Parameter adjustments */
+    --stv;
+    --ist;
+    --itc;
+    --nu;
+    --nt;
+    --nr;
+    --lb;
+    --it;
+    --iro;
+    --ico;
+    --icol;
+    --irow;
+
+    /* Function Body */
+
+    i__1 = *ncol;
+    for (i__ = 0; i__ <= i__1; ++i__) {
+        alen[i__] = 0.f;
+        /* L10: */
+    }
+    for (i__ = 1; i__ <= 400; ++i__) {
+        ist[i__] = -1;
+        /* L20: */
+    }
+    /*                                  nrow is 1 */
+    if (*nrow <= 1) {
+        if (*nrow > 0) {
+            *dlp -= fact[icol[1]];
+            i__1 = *ncol;
+            for (i__ = 2; i__ <= i__1; ++i__) {
+                *dlp -= fact[icol[i__]];
+                /* L30: */
+            }
+        }
+        goto L9000;
+    }
+    /*                                  ncol is 1 */
+    if (*ncol <= 1) {
+        if (*ncol > 0) {
+            *dlp = *dlp - fact[irow[1]] - fact[irow[2]];
+            i__1 = *nrow;
+            for (i__ = 3; i__ <= i__1; ++i__) {
+                *dlp -= fact[irow[i__]];
+                /* L40: */
+            }
+        }
+        goto L9000;
+    }
+    /*                                  2 by 2 table */
+    if (*nrow * *ncol == 4) {
+        n11 = (irow[1] + 1) * (icol[1] + 1) / (*mm + 2);
+        n12 = irow[1] - n11;
+        *dlp = *dlp - fact[n11] - fact[n12] - fact[icol[1] - n11] - fact[icol[
+                    2] - n12];
+        goto L9000;
+    }
+    /*                                  Test for optimal table */
+    val = 0.f;
+    xmin = false;
+    if (irow[*nrow] <= irow[1] + *ncol) {
+        f10act_(*nrow, &irow[1], *ncol, &icol[1], &val, &xmin, fact, &lb[1], &
+                nu[1], &nr[1]);
+    }
+    if (! xmin) {
+        if (icol[*ncol] <= icol[1] + *nrow) {
+            f10act_(*ncol, &icol[1], *nrow, &irow[1], &val, &xmin, fact, &lb[1],
+                    &nu[1], &nr[1]);
+        }
+    }
+
+    if (xmin) {
+        *dlp -= val;
+        goto L9000;
+    }
+    /*                                  Setup for dynamic programming */
+    nn = *mm;
+    /*                                  Minimize ncol */
+    if (*nrow >= *ncol) {
+        nro = *nrow;
+        nco = *ncol;
+
+        i__1 = *nrow;
+        for (i__ = 1; i__ <= i__1; ++i__) {
+            iro[i__] = irow[i__];
+            /* L50: */
+        }
+
+        ico[1] = icol[1];
+        nt[1] = nn - ico[1];
+        i__1 = *ncol;
+        for (i__ = 2; i__ <= i__1; ++i__) {
+            ico[i__] = icol[i__];
+            nt[i__] = nt[i__ - 1] - ico[i__];
+            /* L60: */
+        }
+    } else {
+        nro = *ncol;
+        nco = *nrow;
+
+        ico[1] = irow[1];
+        nt[1] = nn - ico[1];
+        i__1 = *nrow;
+        for (i__ = 2; i__ <= i__1; ++i__) {
+            ico[i__] = irow[i__];
+            nt[i__] = nt[i__ - 1] - ico[i__];
+            /* L70: */
+        }
+
+        i__1 = *ncol;
+        for (i__ = 1; i__ <= i__1; ++i__) {
+            iro[i__] = icol[i__];
+            /* L80: */
+        }
+    }
+    /*                                  Initialize pointers */
+    vmn = 1e10;
+    nc1s = nco - 1;
+    irl = 1;
+    ks = 0;
+    k = ldst;
+    kyy = ico[nco] + 1;
+    goto L100;
+    /*                                  Test for optimality */
+L90:
+    xmin = false;
+    if (iro[nro] <= iro[irl] + nco) {
+        f10act_(nro, &iro[irl], nco, &ico[1], &val, &xmin, fact, &lb[1], &
+                nu[1], &nr[1]);
+    }
+    if (! xmin) {
+        if (ico[nco] <= ico[1] + nro) {
+            f10act_(nco, &ico[1], nro, &iro[irl], &val, &xmin, fact, &lb[1],
+                    &nu[1], &nr[1]);
+        }
+    }
+
+    if (xmin) {
+        if (val < vmn) {
+            vmn = val;
+        }
+        goto L200;
+    }
+    /*                                  Setup to generate new node */
+L100:
+    lev = 1;
+    nr1 = nro - 1;
+    nrt = iro[irl];
+    nct = ico[1];
+    lb[1] = (long) ((double) ((nrt + 1) * (nct + 1)) / (double) (
+                        nn + nr1 * nc1s + 1) - *tol) - 1;
+    nu[1] = (long) ((double) ((nrt + nc1s) * (nct + nr1)) / (
+                        double) (nn + nr1 + nc1s)) - lb[1] + 1;
+    nr[1] = nrt - lb[1];
+    /*                                  Generate a node */
+L110:
+    --nu[lev];
+    if (nu[lev] == 0) {
+        if (lev == 1) {
+            goto L200;
+        }
+        --lev;
+        goto L110;
+    }
+    ++lb[lev];
+    --nr[lev];
+L120:
+    alen[lev] = alen[lev - 1] + fact[lb[lev]];
+    if (lev < nc1s) {
+        nn1 = nt[lev];
+        nrt = nr[lev];
+        ++lev;
+        nc1 = nco - lev;
+        nct = ico[lev];
+        lb[lev] = (long) ((double) ((nrt + 1) * (nct + 1)) / (
+                              double) (nn1 + nr1 * nc1 + 1) - *tol);
+        nu[lev] = (long) ((double) ((nrt + nc1) * (nct + nr1)) / (
+                              double) (nn1 + nr1 + nc1) - lb[lev] + 1);
+        nr[lev] = nrt - lb[lev];
+        goto L120;
+    }
+    alen[nco] = alen[lev] + fact[nr[lev]];
+    lb[nco] = nr[lev];
+
+    v = val + alen[nco];
+    if (nro == 2) {
+        /*                                  Only 1 row left */
+        v = v + fact[ico[1] - lb[1]] + fact[ico[2] - lb[2]];
+        i__1 = nco;
+        for (i__ = 3; i__ <= i__1; ++i__) {
+            v += fact[ico[i__] - lb[i__]];
+            /* L130: */
+        }
+        if (v < vmn) {
+            vmn = v;
+        }
+    } else if (nro == 3 && nco == 2) {
+        /*                                  3 rows and 2 columns */
+        nn1 = nn - iro[irl] + 2;
+        ic1 = ico[1] - lb[1];
+        ic2 = ico[2] - lb[2];
+        n11 = (iro[irl + 1] + 1) * (ic1 + 1) / nn1;
+        n12 = iro[irl + 1] - n11;
+        v = v + fact[n11] + fact[n12] + fact[ic1 - n11] + fact[ic2 - n12];
+        if (v < vmn) {
+            vmn = v;
+        }
+    } else {
+        /*                                  Column marginals are new node */
+        i__1 = nco;
+        for (i__ = 1; i__ <= i__1; ++i__) {
+            it[i__] = ico[i__] - lb[i__];
+            /* L140: */
+        }
+        /*                                  Sort column marginals */
+        if (nco == 2) {
+            if (it[1] > it[2]) {
+                ii = it[1];
+                it[1] = it[2];
+                it[2] = ii;
+            }
+        } else if (nco == 3) {
+            ii = it[1];
+            if (ii > it[3]) {
+                if (ii > it[2]) {
+                    if (it[2] > it[3]) {
+                        it[1] = it[3];
+                        it[3] = ii;
+                    } else {
+                        it[1] = it[2];
+                        it[2] = it[3];
+                        it[3] = ii;
+                    }
+                } else {
+                    it[1] = it[3];
+                    it[3] = it[2];
+                    it[2] = ii;
+                }
+            } else if (ii > it[2]) {
+                it[1] = it[2];
+                it[2] = ii;
+            } else if (it[2] > it[3]) {
+                ii = it[2];
+                it[2] = it[3];
+                it[3] = ii;
+            }
+        } else {
+            isort_(&nco, &it[1]);
+        }
+        /*                                  Compute hash value */
+        key = it[1] * kyy + it[2];
+        for (i__ = 3; i__ <= nco; ++i__) {
+            key = it[i__] + key * kyy;
+            /* L150: */
+        }
+        /*                                  Table index */
+
+        /*if(key < 0)
+        {
+            errMsg = "Negative key in f3xact";
+            WarnError (errMsg);
+            //return 0;
+        }*/
+
+        if ((ipn = key % ldst + 1) < 1) {
+            ipn += ldst;
+        }
+        /*                                  Find empty position */
+        ii = ks + ipn;
+
+        for (itp = ipn; itp <= ldst; ++itp) {
+            if (ist[ii] < 0) {
+                goto L180;
+            } else if (ist[ii] == key) {
+                goto L190;
+            }
+            ++ii;
+            /* L160: */
+        }
+
+        ii = ks + 1;
+        i__1 = ipn - 1;
+        for (itp = 1; itp <= i__1; ++itp) {
+            if (ist[ii] < 0) {
+                goto L180;
+            } else if (ist[ii] == key) {
+                goto L190;
+            }
+            ++ii;
+            /* L170: */
+        }
+
+        errMsg = ("Fisher Exact: Stack length exceeded in f3xact.  This problem should not occur.");
+        ReportWarning (errMsg);
+        return 0;
+        /*                                  Push onto stack */
+L180:
+        ist[ii] = key;
+        stv[ii] = v;
+        ++nst;
+        ii = nst + ks;
+        itc[ii] = itp;
+        goto L110;
+        /*                                  Marginals already on stack */
+L190:
+        /* Computing MIN */
+        d__1 = v, d__2 = stv[ii];
+        stv[ii] = Minimum(d__1,d__2);
+    }
+    goto L110;
+    /*                                  Pop item from stack */
+L200:
+    if (nitc > 0) {
+        /*                                  Stack index */
+        itp = itc[nitc + k] + k;
+        --nitc;
+        val = stv[itp];
+        key = ist[itp];
+        ist[itp] = -1;
+        /*                                  Compute marginals */
+        for (i__ = nco; i__ >= 2; --i__) {
+            ico[i__] = key % kyy;
+            key /= kyy;
+            /* L210: */
+        }
+        ico[1] = key;
+        /*                                  Set up nt array */
+        nt[1] = nn - ico[1];
+        i__1 = nco;
+        for (i__ = 2; i__ <= i__1; ++i__) {
+            nt[i__] = nt[i__ - 1] - ico[i__];
+            /* L220: */
+        }
+        goto L90;
+
+    } else if (nro > 2 && nst > 0) {
+        /*                                  Go to next level */
+        nitc = nst;
+        nst = 0;
+        k = ks;
+        ks = ldst - ks;
+        nn -= iro[irl];
+        ++irl;
+        --nro;
+        goto L200;
+    }
+
+    *dlp -= vmn;
+L9000:
+    return 0;
+} /* f3xact_ */
+
+/* ----------------------------------------------------------------------- */
+/*  Name:       F2XACT */
+
+/*  Purpose:    Computes Fisher's exact test for a contingency table, */
+/*              routine with workspace variables specified. */
+
+/*  Usage:      CALL F2XACT (NROW, NCOL, TABLE, EXPECT, PERCNT, */
+/*                          EMIN, PRT, PRE, FACT, ICO, IRO, KYY, IDIF, */
+/*                          IRN, KEY, LDKEY, IPOIN, STP, LDSTP, IFRQ, */
+/*                          DLP, DSP, TM, KEY2, IWK, RWK) */
+/* ----------------------------------------------------------------------- */
+int f2xact_(long *nrow, long *ncol, double *table,
+            double *expect, double *percnt, double *
+            emin, double *prt, double *pre, double *fact, long *
+            ico, long *iro, long *kyy, long *idif, long *irn, long
+            *key, long *ldkey, long *ipoin, double *stp, long *ldstp,
+            long *ifrq, double *dlp, double *dsp, double *tm,
+            long *key2, long *iwk, double *rwk)
+{
+    /* Initialized data */
+
+    static long   imax = 2147483647;
+    static double amiss = -12345.f;
+    static double tol = 3.45254e-7;
+    static double emx = 1e30f;
+
+    /* System generated locals */
+    long table_dim1, table_offset, i__1, i__2;
+    double d__1, d__2, d__3, d__4;
+
+    /* Local variables */
+    long i__, j, k, n, k1;
+    double dd, df;
+    long i31, i32, i33, i34, i35, i36, i37, i38, i39, i41, i42, i43,
+         i44, i45, i46, i47, i48, ii, kb, kd, ks;
+    double pv;
+    long i310, i311;
+    double ddf;
+    long nco, nrb;
+    double emn, drn, dro, obs;
+    long ipn, ipo, itp, nro;
+    double tmp, obs2, obs3;
+    long nro2, kval, kmax, jkey, last;
+    bool ipsh;
+    long itmp;
+    double dspt;
+    long itop, jstp, ntot, jstp2, jstp3, jstp4, iflag, ncell, ifreq;
+    bool chisq;
+    long ikkey;
+    double pastp;
+    long ikstp;
+    long ikstp2;
+    long ifault;
+
+    _String errMsg ("Fisher Exact:");
+
+    /*                                  SPECIFICATIONS FOR ARGUMENTS */
+    /*                                  SPECIFICATIONS FOR LOCAL VARIABLES */
+    /*                                  SPECIFICATIONS FOR INTRINSICS */
+    /*                                  SPECIFICATIONS FOR SUBROUTINES */
+    /*                                  SPECIFICATIONS FOR FUNCTIONS */
+    /* *********************************************************************** */
+    /*                                  IMAX is the largest representable */
+    /*                                  long on the machine */
+    /* *********************************************************************** */
+    /* Parameter adjustments */
+    table_dim1 = *nrow;
+    table_offset = 1 + table_dim1;
+    table -= table_offset;
+    --ico;
+    --iro;
+    --kyy;
+    --idif;
+    --irn;
+    --key;
+    --ipoin;
+    --stp;
+    --ifrq;
+    --dlp;
+    --dsp;
+    --tm;
+    --key2;
+    --iwk;
+    --rwk;
+
+    /* Function Body */
+    /* *********************************************************************** */
+    /*                                  AMISS is a missing value indicator */
+    /*                                  which is returned when the */
+    /*                                  probability is not defined. */
+    /* *********************************************************************** */
+    /* *********************************************************************** */
+    /*                                  TOL is chosen as the square root of */
+    /*                                  the smallest relative spacing */
+    /* *********************************************************************** */
+    /* *********************************************************************** */
+    /*                                  EMX is a large positive value used */
+    /*                                  in comparing expected values */
+    /* *********************************************************************** */
+    /*                                  Initialize KEY array */
+    i__1 = 2 * *ldkey;
+    for (i__ = 1; i__ <= i__1; ++i__) {
+        key[i__] = -9999;
+        key2[i__] = -9999;
+        /* L10: */
+    }
+    /*                                  Initialize parameters */
+    *pre = 0.f;
+    itop = 0;
+    if (*expect > 0.) {
+        emn = *emin;
+    } else {
+        emn = emx;
+    }
+    /*                                  Initialize pointers for workspace */
+    k = Maximum(*nrow,*ncol);
+    /*                                  f3xact */
+    i31 = 1;
+    i32 = i31 + k;
+    i33 = i32 + k;
+    i34 = i33 + k;
+    i35 = i34 + k;
+    i36 = i35 + k;
+    i37 = i36 + k;
+    i38 = i37 + k;
+    i39 = i38 + 400;
+    i310 = 1;
+    i311 = 401;
+    /*                                  f4xact */
+    k = *nrow + *ncol + 1;
+    i41 = 1;
+    i42 = i41 + k;
+    i43 = i42 + k;
+    i44 = i43 + k;
+    i45 = i44 + k;
+    i46 = i45 + k;
+    i47 = i46 + k * Maximum(*nrow,*ncol);
+    i48 = 1;
+    /*                                  Check table dimensions */
+    /* if (*nrow > *ldtabl) {
+        errMsg = errMsg & "NROW must be less than or equal to LDTABL.";
+        WarnError (errMsg);
+        return 0;
+     }*/
+    if (*ncol <= 1) {
+        errMsg = errMsg & "NCOL must be greater than 1.0";
+        WarnError (errMsg);
+        return 0;
+    }
+    /*                                  Compute row marginals and total */
+    ntot = 0;
+    i__1 = *nrow;
+    for (i__ = 1; i__ <= i__1; ++i__) {
+        iro[i__] = 0;
+        i__2 = *ncol;
+        for (j = 1; j <= i__2; ++j) {
+            if (table[i__ + j * table_dim1] < -1e-4) {
+                errMsg = errMsg & "All elements of TABLE must be positive.";
+                WarnError (errMsg);
+                return 0;
+            }
+            iro[i__] += i_dnnt(&table[i__ + j * table_dim1]);
+            ntot += i_dnnt(&table[i__ + j * table_dim1]);
+            /* L20: */
+        }
+        /* L30: */
+    }
+
+    if (ntot == 0) {
+        errMsg = errMsg & "All elements of TABLE are zero.  PRT and PRE are set to missing values (NaN, not a number)";
+        ReportWarning (errMsg);
+        return 0;
+        *prt = amiss;
+        *pre = amiss;
+        goto L9000;
+    }
+    /*                                  Column marginals */
+    i__1 = *ncol;
+    for (i__ = 1; i__ <= i__1; ++i__) {
+        ico[i__] = 0;
+        i__2 = *nrow;
+        for (j = 1; j <= i__2; ++j) {
+            ico[i__] += i_dnnt(&table[j + i__ * table_dim1]);
+            /* L40: */
+        }
+        /* L50: */
+    }
+    /*                                  sort */
+    isort_(nrow, &iro[1]);
+    isort_(ncol, &ico[1]);
+    /*                                  Determine row and column marginals */
+
+    if (*nrow > *ncol) {
+        nro = *ncol;
+        nco = *nrow;
+        /*                                  Interchange row and column marginals */
+        i__1 = *nrow;
+        for (i__ = 1; i__ <= i__1; ++i__) {
+            itmp = iro[i__];
+            if (i__ <= *ncol) {
+                iro[i__] = ico[i__];
+            }
+            ico[i__] = itmp;
+            /* L60: */
+        }
+    } else {
+        nro = *nrow;
+        nco = *ncol;
+    }
+
+    /*                                  Get multiplers for stack */
+    kyy[1] = 1;
+    i__1 = nro;
+    for (i__ = 2; i__ <= i__1; ++i__) {
+        /*                                  Hash table multipliers */
+        if (iro[i__ - 1] + 1 <= imax / kyy[i__ - 1]) {
+            kyy[i__] = kyy[i__ - 1] * (iro[i__ - 1] + 1);
+            j /= kyy[i__ - 1];
+        } else {
+            errMsg = errMsg & "The hash table key cannot be computed because the largest key is larger than the largest representable integer.  The algorithm cannot proceed.";
+            ReportWarning (errMsg);
+            return 0;
+        }
+        /* L70: */
+    }
+    /*                                  Maximum product */
+    if (iro[nro - 1] + 1 <= imax / kyy[nro - 1]) {
+        kmax = (iro[nro] + 1) * kyy[nro - 1];
+    } else {
+        errMsg = errMsg & "The hash table key cannot be computed because the largest key is larger than the largest representable integer.  The algorithm cannot proceed.";
+        ReportWarning (errMsg);
+        goto L9000;
+    }
+    /*                                  Compute log factorials */
+    fact[0] = 0.;
+    fact[1] = 0.;
+    fact[2] = log(2.);
+    i__1 = ntot;
+    for (i__ = 3; i__ <= i__1; i__ += 2) {
+        fact[i__] = fact[i__ - 1] + log((double) i__);
+        j = i__ + 1;
+        if (j <= ntot) {
+            fact[j] = fact[i__] + fact[2] + fact[j / 2] - fact[j / 2 - 1];
+        }
+        /* L80: */
+    }
+    /*                                  Compute observed path length: OBS */
+    obs = tol;
+    ntot = 0;
+    i__1 = nco;
+    for (j = 1; j <= i__1; ++j) {
+        dd = 0.f;
+        i__2 = nro;
+        for (i__ = 1; i__ <= i__2; ++i__) {
+            if (*nrow <= *ncol) {
+                dd += fact[i_dnnt(&table[i__ + j * table_dim1])];
+                ntot += i_dnnt(&table[i__ + j * table_dim1]);
+            } else {
+                dd += fact[i_dnnt(&table[j + i__ * table_dim1])];
+                ntot += i_dnnt(&table[j + i__ * table_dim1]);
+            }
+            /* L90: */
+        }
+        obs = obs + fact[ico[j]] - dd;
+        /* L100: */
+    }
+    /*                                  Denominator of observed table: DRO */
+    dro = f9xact_(&nro, &ntot, &iro[1], fact);
+    *prt = exp(obs - dro);
+    /*                                  Initialize pointers */
+    k = nco;
+    last = *ldkey + 1;
+    jkey = *ldkey + 1;
+    jstp = *ldstp + 1;
+    jstp2 = *ldstp * 3 + 1;
+    jstp3 = (*ldstp << 2) + 1;
+    jstp4 = *ldstp * 5 + 1;
+    ikkey = 0;
+    ikstp = 0;
+    ikstp2 = *ldstp << 1;
+    ipo = 1;
+    ipoin[1] = 1;
+    stp[1] = 0.f;
+    ifrq[1] = 1;
+    ifrq[ikstp2 + 1] = -1;
+
+L110:
+    kb = nco - k + 1;
+    ks = 0;
+    n = ico[kb];
+    kd = nro + 1;
+    kmax = nro;
+    /*                                  IDIF is the difference in going to th */
+    /*                                  daughter */
+    i__1 = nro;
+    for (i__ = 1; i__ <= i__1; ++i__) {
+        idif[i__] = 0;
+        /* L120: */
+    }
+    /*                                  Generate the first daughter */
+L130:
+    --kd;
+    /* Computing MIN */
+    i__1 = n, i__2 = iro[kd];
+    ntot = Minimum(i__1,i__2);
+    idif[kd] = ntot;
+    if (idif[kmax] == 0) {
+        --kmax;
+    }
+    n -= ntot;
+    if (n > 0 && kd != 1) {
+        goto L130;
+    }
+    if (n != 0) {
+        goto L310;
+    }
+
+    k1 = k - 1;
+    n = ico[kb];
+    ntot = 0;
+    i__1 = nco;
+    for (i__ = kb + 1; i__ <= i__1; ++i__) {
+        ntot += ico[i__];
+        /* L140: */
+    }
+    /*                                  Arc to daughter length=ICO(KB) */
+L150:
+    i__1 = nro;
+    for (i__ = 1; i__ <= i__1; ++i__) {
+        irn[i__] = iro[i__] - idif[i__];
+        /* L160: */
+    }
+    /*                                  Sort irn */
+    if (k1 > 1) {
+        if (nro == 2) {
+            if (irn[1] > irn[2]) {
+                ii = irn[1];
+                irn[1] = irn[2];
+                irn[2] = ii;
+            }
+        } else if (nro == 3) {
+            ii = irn[1];
+            if (ii > irn[3]) {
+                if (ii > irn[2]) {
+                    if (irn[2] > irn[3]) {
+                        irn[1] = irn[3];
+                        irn[3] = ii;
+                    } else {
+                        irn[1] = irn[2];
+                        irn[2] = irn[3];
+                        irn[3] = ii;
+                    }
+                } else {
+                    irn[1] = irn[3];
+                    irn[3] = irn[2];
+                    irn[2] = ii;
+                }
+            } else if (ii > irn[2]) {
+                irn[1] = irn[2];
+                irn[2] = ii;
+            } else if (irn[2] > irn[3]) {
+                ii = irn[2];
+                irn[2] = irn[3];
+                irn[3] = ii;
+            }
+        } else {
+            i__1 = nro;
+            for (j = 2; j <= i__1; ++j) {
+                i__ = j - 1;
+                ii = irn[j];
+L170:
+                if (ii < irn[i__]) {
+                    irn[i__ + 1] = irn[i__];
+                    --i__;
+                    if (i__ > 0) {
+                        goto L170;
+                    }
+                }
+                irn[i__ + 1] = ii;
+                /* L180: */
+            }
+        }
+        /*                                  Adjust start for zero */
+        i__1 = nro;
+        for (i__ = 1; i__ <= i__1; ++i__) {
+            if (irn[i__] != 0) {
+                goto L200;
+            }
+            /* L190: */
+        }
+L200:
+        nrb = i__;
+        nro2 = nro - i__ + 1;
+    } else {
+        nrb = 1;
+        nro2 = nro;
+    }
+    /*                                  Some table values */
+    ddf = f9xact_(&nro, &n, &idif[1], fact);
+    drn = f9xact_(&nro2, &ntot, &irn[nrb], fact) - dro + ddf;
+    /*                                  Get hash value */
+    if (k1 > 1) {
+        kval = irn[1] + irn[2] * kyy[2];
+        i__1 = nro;
+        for (i__ = 3; i__ <= i__1; ++i__) {
+            kval += irn[i__] * kyy[i__];
+            /* L210: */
+        }
+        /*                                  Get hash table entry */
+        i__ = kval % (*ldkey << 1) + 1;
+        /*                                  Search for unused location */
+        i__1 = *ldkey << 1;
+        for (itp = i__; itp <= i__1; ++itp) {
+            ii = key2[itp];
+            if (ii == kval) {
+                goto L240;
+            } else if (ii < 0) {
+                key2[itp] = kval;
+                dlp[itp] = 1.;
+                dsp[itp] = 1.;
+                goto L240;
+            }
+            /* L220: */
+        }
+
+        i__1 = i__ - 1;
+        for (itp = 1; itp <= i__1; ++itp) {
+            ii = key2[itp];
+            if (ii == kval) {
+                goto L240;
+            } else if (ii < 0) {
+                key2[itp] = kval;
+                dlp[itp] = 1.f;
+                goto L240;
+            }
+            /* L230: */
+        }
+
+        errMsg = errMsg & "LDKEY is too small.  It is not possible to give thevalue of LDKEY required, but you could try doubling LDKEY (and possibly LDSTP).";
+        ReportWarning (errMsg);
+        return 0;
+    }
+
+L240:
+    ipsh = true;
+    /*                                  Recover pastp */
+    ipn = ipoin[ipo + ikkey];
+    pastp = stp[ipn + ikstp];
+    ifreq = ifrq[ipn + ikstp];
+    /*                                  Compute shortest and longest path */
+    if (k1 > 1) {
+        obs2 = obs - fact[ico[kb + 1]] - fact[ico[kb + 2]] - ddf;
+        i__1 = k1;
+        for (i__ = 3; i__ <= i__1; ++i__) {
+            obs2 -= fact[ico[kb + i__]];
+            /* L250: */
+        }
+
+        if (dlp[itp] > 0.) {
+            dspt = obs - obs2 - ddf;
+            /*                                  Compute longest path */
+            dlp[itp] = 0.;
+            f3xact_(&nro2, &irn[nrb], &k1, &ico[kb + 1], &dlp[itp], &ntot,
+                    fact, &iwk[i31], &iwk[i32], &iwk[i33], &iwk[i34], &iwk[
+                        i35], &iwk[i36], &iwk[i37], &iwk[i38], &iwk[i39], &rwk[
+                        i310], &rwk[i311], &tol);
+            /* Computing Minimum */
+            d__1 = 0., d__2 = dlp[itp];
+            dlp[itp] = Minimum(d__1,d__2);
+            /*                                  Compute shortest path */
+            dsp[itp] = dspt;
+            f4xact_(&nro2, &irn[nrb], &k1, &ico[kb + 1], &dsp[itp], fact, &
+                    iwk[i47], &iwk[i41], &iwk[i42], &iwk[i43], &iwk[i44], &
+                    iwk[i45], &iwk[i46], &rwk[i48], &tol);
+            /* Computing Minimum */
+            d__1 = 0., d__2 = dsp[itp] - dspt;
+            dsp[itp] = Minimum(d__1,d__2);
+            /*                                  Use chi-squared approximation? */
+            if ((double) (irn[nrb] * ico[kb + 1]) / (double) ntot >
+                    emn) {
+                ncell = 0.f;
+                i__1 = nro2;
+                for (i__ = 1; i__ <= i__1; ++i__) {
+                    i__2 = k1;
+                    for (j = 1; j <= i__2; ++j) {
+                        if ((double) (irn[nrb + i__ - 1] * ico[kb + j]) >=
+                                ntot * *expect) {
+                            ++ncell;
+                        }
+                        /* L260: */
+                    }
+                    /* L270: */
+                }
+                if ((double) (ncell * 100) >= k1 * nro2 * *percnt) {
+                    tmp = 0.f;
+                    i__1 = nro2;
+                    for (i__ = 1; i__ <= i__1; ++i__) {
+                        tmp = tmp + fact[irn[nrb + i__ - 1]] - fact[irn[nrb +
+                                i__ - 1] - 1];
+                        /* L280: */
+                    }
+                    tmp *= k1 - 1;
+                    i__1 = k1;
+                    for (j = 1; j <= i__1; ++j) {
+                        tmp += (nro2 - 1) * (fact[ico[kb + j]] - fact[ico[kb
+                                             + j] - 1]);
+                        /* L290: */
+                    }
+                    df = (double) ((nro2 - 1) * (k1 - 1));
+                    tmp += df * 1.83787706640934548356065947281;
+                    tmp -= (nro2 * k1 - 1) * (fact[ntot] - fact[ntot - 1]);
+                    tm[itp] = (obs - dro) * -2. - tmp;
+                } else {
+                    /*                                  tm(itp) set to a flag value */
+                    tm[itp] = -9876.;
+                }
+            } else {
+                tm[itp] = -9876.;
+            }
+        }
+        obs3 = obs2 - dlp[itp];
+        obs2 -= dsp[itp];
+        if (tm[itp] == -9876.) {
+            chisq = false;
+        } else {
+            chisq = true;
+            tmp = tm[itp];
+        }
+    } else {
+        obs2 = obs - drn - dro;
+        obs3 = obs2;
+    }
+    /*                                  Process node with new PASTP */
+L300:
+    if (pastp <= obs3) {
+        /*                                  Update pre */
+        *pre += (double) ifreq * exp(pastp + drn);
+
+    } else if (pastp < obs2) {
+        if (chisq) {
+            df = (double) ((nro2 - 1) * (k1 - 1));
+            /* Computing MAX */
+            d__2 = 0., d__3 = tmp + (pastp + drn) * 2.;
+            d__1 = Maximum(d__2,d__3) / 2.;
+            d__4 = df / 2.;
+            pv = 1.f - gammds_(&d__1, &d__4, &ifault);
+            *pre += (double) ifreq * exp(pastp + drn) * pv;
+        } else {
+            /*                                  Put daughter on queue */
+            d__1 = pastp + ddf;
+            f5xact_(&d__1, &tol, &kval, &key[jkey], ldkey, &ipoin[jkey], &stp[
+                        jstp], ldstp, &ifrq[jstp], &ifrq[jstp2], &ifrq[jstp3], &
+                    ifrq[jstp4], &ifreq, &itop, &ipsh);
+            ipsh = false;
+        }
+    }
+    /*                                  Get next PASTP on chain */
+    ipn = ifrq[ipn + ikstp2];
+    if (ipn > 0) {
+        pastp = stp[ipn + ikstp];
+        ifreq = ifrq[ipn + ikstp];
+        goto L300;
+    }
+    /*                                  Generate a new daughter node */
+    f7xact_(&kmax, &iro[1], &idif[1], &kd, &ks, &iflag);
+    if (iflag != 1) {
+        goto L150;
+    }
+    /*                                  Go get a new mother from stage K */
+L310:
+    iflag = 1;
+    f6xact_(&nro, &iro[1], &iflag, &kyy[1], &key[ikkey + 1], ldkey, &last, &
+            ipo);
+    /*                                  Update pointers */
+    if (iflag == 3) {
+        --k;
+        itop = 0;
+        ikkey = jkey - 1;
+        ikstp = jstp - 1;
+        ikstp2 = jstp2 - 1;
+        jkey = *ldkey - jkey + 2;
+        jstp = *ldstp - jstp + 2;
+        jstp2 = (*ldstp << 1) + jstp;
+        i__1 = *ldkey << 1;
+        for (i__ = 1; i__ <= i__1; ++i__) {
+            key2[i__] = -9999;
+            /* L320: */
+        }
+        if (k >= 2) {
+            goto L310;
+        }
+    } else {
+        goto L110;
+    }
+
+L9000:
+    return 0;
+} /* f2xact_ */
+
+/* ----------------------------------------------------------------------- */
+/*  Name:       FEXACT */
+
+/*  Purpose:    Computes Fisher's exact test probabilities and a hybrid */
+/*              approximation to Fisher exact test probabilities for a */
+/*              contingency table using the network algorithm. */
+
+/*  Usage:      CALL FEXACT (NROW, NCOL, TABLE, LDTABL, EXPECT, PERCNT, */
+/*                          EMIN, PRT, PRE) */
+
+/*  Arguments: */
+/*     NROW   - The number of rows in the table.  (Input) */
+/*     NCOL   - The number of columns in the table.  (Input) */
+/*     TABLE  - NROW by NCOL matrix containing the contingency table. */
+/*              (Input) */
+/*     LDTABL - Leading dimension of TABLE exactly as specified in the */
+/*              dimension statement in the calling program.  (Input) */
+/*     EXPECT - Expected value used in the hybrid algorithm for */
+/*              deciding when to use asymptotic theory probabilities. */
+/*              (Input) */
+/*              If EXPECT .LE. 0.0 then asymptotic theory probabilities */
+/*              are not used and Fisher exact test probabilities are */
+/*              computed.  Otherwise, if PERCNT or more of the cells in */
+/*              the remaining table have estimated expected values of */
+/*              EXPECT or more, with no remaining cell having expected */
+/*              value less than EMIN, then asymptotic chi-squared */
+/*              probabilities are used.  See the algorithm section of the */
+/*              manual document for details.  Use EXPECT = 5.0 to obtain */
+/*              the 'Cochran' condition. */
+/*     PERCNT - Percentage of remaining cells that must have estimated */
+/*              expected  values greater than EXPECT before asymptotic */
+/*              probabilities can be used.  (Input) */
+/*              See argument EXPECT for details.  Use PERCNT = 80.0 to */
+/*              obtain the 'Cochran' condition. */
+/*     EMIN   - Minimum cell estimated expected value allowed for */
+/*              asymptotic chi-squared probabilities to be used.  (Input) */
+/*              See argument EXPECT for details.  Use EMIN = 1.0 to */
+/*              obtain the 'Cochran' condition. */
+/*     PRT    - Probability of the observed table for fixed marginal */
+/*              totals.  (Output) */
+/*     PRE    - Table p-value.  (Output) */
+/*              PRE is the probability of a more extreme table, where */
+/*              'extreme' is in a probabilistic sense. */
+/*              If EXPECT .LT. 0 then the Fisher exact probability */
+/*              is returned.  Otherwise, an approximation to the */
+/*              Fisher exact probability is computed based upon */
+/*              asymptotic chi-squared probabilities for ``large'' */
+/*              table expected values.  The user defines ``large'' */
+/*              through the arguments EXPECT, PERCNT, and EMIN. */
+
+/*  Remarks: */
+/*  1. For many problems one megabyte or more of workspace can be */
+/*     required.  If the environment supports it, the user should begin */
+/*     by increasing the workspace used to 200,000 units. */
+
+/*  2. In FEXACT, LDSTP = 30*LDKEY.  The proportion of table space used */
+/*     by STP may be changed by changing the line MULT = 30 below to */
+/*     another value. */
+
+/*  3. FEXACT may be converted to single precision by setting IREAL = 3, */
+/*     and converting all DOUBLE PRECISION specifications (except the */
+/*     specifications for RWRK, IWRK, and DWRK) to REAL.  This will */
+/*     require changing the names and specifications of the intrinsic */
+/*     functions ALOG, AMAX1, AMIN1, EXP, and REAL.  In addition, the */
+/*     machine specific constants will need to be changed, and the name */
+/*     DWRK will need to be changed to RWRK in the call to F2XACT. */
+
+/*  4. Machine specific constants are specified and documented in F2XACT. */
+/*     A missing value code is specified in both FEXACT and F2XACT. */
+
+/*  5. Although not a restriction, is is not generally practical to call */
+/*     this routine with large tables which are not sparse and in */
+/*     which the 'hybrid' algorithm has little effect.  For example, */
+/*     although it is feasible to compute exact probabilities for the */
+/*     table */
+/*            1 8 5 4 4 2 2 */
+/*            5 3 3 4 3 1 0 */
+/*           10 1 4 0 0 0 0, */
+/*     computing exact probabilities for a similar table which has been */
+/*     enlarged by the addition of an extra row (or column) may not be */
+/*     feasible. */
+/* ----------------------------------------------------------------------- */
+int fexact_(long nrow, long ncol, double *table, double expect, double percnt, double emin, double *prt, double *pre)
+{
+    long ntot;
+
+    _String errMsg ("Fisher Exact:");
+
+    /* *********************************************************************** */
+    /*                                  Set IREAL = 4 for DOUBLE PRECISION */
+    /*                                  Set IREAL = 3 for SINGLE PRECISION */
+    /* *********************************************************************** */
+
+    /* if (*nrow > *ldtabl) {
+        errMsg = errMsg &  "NROW must be less than or equal to LDTABL.";
+        WarnError(errMsg);
+        free (equiv_1);
+        return 0;
+     }*/
+
+    ntot = 0;
+    for (long i = 0; i<ncol*nrow; i++) {
+        if (table[i] < 0.) {
+            errMsg = errMsg &  "All elements of TABLE must be non-negative.";
+            WarnError(errMsg);
+            return 0;
+        }
+        ntot += (long)(table[i]+0.5);
+    }
+
+
+    if (ntot == 0) {
+        errMsg = errMsg & "All elements of TABLE are zero.  PRT and PRE are set to missing values (NaN, not a number).";
+        ReportWarning(errMsg);
+        *prt = -1.;
+        *pre = -1.;
+        return 0;
+    }
+
+    long    k       = nrow + ncol + 1,
+            kk   = k * ncol;
+
+
+    double * i1   = (double*)MemAllocate((ntot + 1)*sizeof(double)),
+             * irwk = (double*)MemAllocate(Maximum(ncol + 401,k)*sizeof(double));
+
+    bool    didAlloc = false;
+
+    long    *i2     = (long*) MemAllocate  (ncol*sizeof (long)),
+             *i3      = (long*) MemAllocate  (ncol*sizeof (long)),
+              *i3a  = (long*) MemAllocate  (ncol*sizeof (long)),
+               *i3b   = (long*) MemAllocate  (nrow*sizeof (long)),
+                *i3c    = (long*) MemAllocate  (nrow*sizeof (long)),
+                 *iiwk    = (long*) MemAllocate  (Maximum(k * 5 + (kk << 1),ncol * 7 + 800)*sizeof (long));
+
+
+    if (!fexact_i4) {
+        didAlloc = true;
+        allocate_fexact_keys(4096,30);
+    }
+
+
+    f2xact_ (&nrow, &ncol, table, &expect, &percnt, &emin, prt, pre, i1, i2, i3, i3a,
+             i3b, i3c, fexact_i4, &fexact_ldkey, fexact_i5, fexact_i6, &fexact_ldstp, fexact_i7, fexact_i8,
+             fexact_i9, fexact_i9a, fexact_i10, iiwk, irwk);
+
+    free (i1);
+    free (i2);
+    free (i3);
+    free (i3a);
+    free (i3b);
+    free (i3c);
+
+    free (irwk);
+    free (iiwk);
+
+    if   (didAlloc) {
+        free_fexact_keys();
+    }
+    return 0;
+} /* fexact_ */
+
+
+
diff --git a/src/core/formula.cpp b/src/core/formula.cpp
new file mode 100644
index 0000000..9f1f22c
--- /dev/null
+++ b/src/core/formula.cpp
@@ -0,0 +1,2678 @@
+#include <math.h>
+#include <float.h>
+#include "defines.h"
+#include "formula.h"
+
+//SW: This should be helper functions
+#include "parser.h"
+
+//Constants
+extern _Parameter twoOverSqrtPi;
+
+extern _List batchLanguageFunctionNames,
+             batchLanguageFunctionParameterLists;
+
+extern _SimpleList BinOps,
+       opPrecedence,
+       FunctionArgumentCount,
+       batchLanguageFunctionParameters,
+       batchLanguageFunctionClassification,
+       associativeOps;
+
+extern
+_SimpleList     simpleOperationCodes,
+                simpleOperationFunctions;
+
+extern  _Variable*  _x_, *_n_;
+
+extern _Parameter machineEps;
+extern _Parameter tolerance;
+
+extern _String intPrecFact;
+extern _String intMaxIter;
+
+_Parameter      maxRombergSteps = 8.,
+                integrationPrecisionFactor = 1.e-5;
+
+_Formula::_Formula (void)
+{
+    theTree     = nil;
+    resultCache = nil;
+}
+//__________________________________________________________________________________
+
+_Formula::_Formula (_PMathObj p, bool isAVar)
+{
+    theTree     = nil;
+    resultCache = nil;
+    if (!isAVar) {
+        theFormula.AppendNewInstance (new _Operation (p));
+    } else {
+        _Variable* v = (_Variable*)p;
+        theFormula.AppendNewInstance (new _Operation (true,*v->GetName(),v->IsGlobal(), nil));
+    }
+}
+//__________________________________________________________________________________
+void _Formula::Initialize (void) {}
+
+//__________________________________________________________________________________
+void _Formula::Duplicate  (BaseRef f)
+{
+    _Formula * f_cast = (_Formula*) f;
+
+    theFormula.Duplicate       (& f_cast->theFormula);
+    theStack.theStack.Duplicate(& f_cast->theStack.theStack);
+
+    if (f_cast->theTree) {
+        theTree = f_cast->theTree->duplicate_tree();
+    } else {
+        theTree = nil;
+    }
+
+    if (f_cast->resultCache) {
+        resultCache = (_List*)f_cast->resultCache->makeDynamic();
+    } else {
+        resultCache = nil;
+    }
+}
+
+//__________________________________________________________________________________
+void _Formula::DuplicateReference  (const _Formula* f)
+{
+    for (unsigned long i=0; i<f->theFormula.lLength; i++) {
+        _Operation *theO = ((_Operation**)f->theFormula.lData)[i];
+        if (theO->GetAVariable()==-2) {
+            theFormula.AppendNewInstance(new _Operation ((_PMathObj)LocateVar (-theO->GetNoTerms()-1)->Compute()->makeDynamic()));
+        } else {
+            theFormula&& theO;
+        }
+    }
+}
+
+//__________________________________________________________________________________
+BaseRef _Formula::makeDynamic (void)
+{
+    _Formula * res = (_Formula*) checkPointer (new _Formula);
+    res->Duplicate((BaseRef)this);
+    return (BaseRef)res;
+}
+//__________________________________________________________________________________
+
+_Formula::~_Formula (void)
+{
+    Clear();
+}
+
+//__________________________________________________________________________________
+void    _Formula::Clear (void)
+{
+    if (theTree) {
+        theTree->delete_tree();
+        delete theTree;
+    }
+    theTree = nil;
+    if (resultCache) {
+        DeleteObject (resultCache);
+    }
+
+    theFormula.Clear();
+//  theStack.Clear();
+}
+
+//__________________________________________________________________________________
+BaseRef _Formula::toStr (_List* matchedNames, bool dropTree)
+{
+    ConvertToTree(false);
+
+    _String * result = (_String*)checkPointer(new _String((unsigned long)16,true));
+
+    long          savepd = printDigits;
+    printDigits          = 0;
+
+    if (theTree) { // there is something to do
+        internalToStr (*result, theTree, -1, matchedNames);
+    } else {
+        if (theFormula.lLength) {
+            (*result) << "RPN:";
+            internalToStr (*result,nil,0,nil,(_Operation*)(theFormula(0)));
+            for (unsigned long k=1; k<theFormula.lLength; k++) {
+                (*result)<<',';
+                internalToStr (*result,nil,0,nil,(_Operation*)(theFormula(k)));
+            }
+        }
+    }
+
+    printDigits = savepd;
+    result->Finalize ();
+    if (theTree && dropTree) {
+        theTree->delete_tree();
+        delete theTree;
+        theTree = nil;
+    }
+    return result;
+}
+//__________________________________________________________________________________
+node<long>* _Formula::DuplicateFormula (node<long>* src, _Formula& tgt)
+{
+    node<long>* resNode = new node<long>;
+    checkPointer (resNode);
+
+    tgt.theFormula && (_Operation*) theFormula (src->in_object);
+
+    resNode->in_object = tgt.theFormula.lLength-1;
+
+    for (long k=1; k<=src->get_num_nodes(); k++) {
+        resNode->add_node (*DuplicateFormula (src->go_down (k), tgt));
+    }
+
+    return     resNode;
+}
+
+//__________________________________________________________________________________
+_Formula* _Formula::Differentiate (_String varName, bool bail)
+{
+    long          varID = LocateVarByName (varName),
+                  k;
+
+    if (varID<0) {
+        return new _Formula (new _Constant (0.0));
+    }
+
+    varID = variableNames.GetXtra (varID);
+
+    _Formula*     res = new _Formula ();
+    checkPointer  (res);
+
+    ConvertToTree    ();
+
+    _SimpleList  varRefs,
+                 dydx;
+
+
+    {
+        _AVLList al (&varRefs);
+        ScanFForVariables (al, true, true, true);
+        al.ReorderList ();
+    }
+
+    for (k=0; k < varRefs.lLength; k++) {
+        _Variable* thisVar = LocateVar (varRefs.lData[k]);
+        _Formula * dYdX;
+        if (thisVar->IsIndependent()) {
+            dYdX = new _Formula ((thisVar->GetName()->Equal (&varName))?new _Constant (1.0):new _Constant (0.0));
+            checkPointer (dYdX);
+            dYdX->ConvertToTree();
+            dydx << (long)dYdX;
+        } else {
+            dYdX = thisVar->varFormula->Differentiate (varName);
+            if (dYdX->theFormula.lLength == 0) {
+                delete (dYdX);
+                return res;
+            }
+            dydx << (long)dYdX;
+        }
+    }
+
+    SortLists             (&varRefs, &dydx);
+    node<long>*           dTree = nil;
+
+    if (!(dTree = InternalDifferentiate (theTree, varID, varRefs, dydx, *res))) {
+        for (k=0; k<dydx.lLength; k++) {
+            delete ((_Formula*)dydx.lData[k]);
+        }
+
+        if (bail) {
+            WarnError    (_String ("Differentiation of ") & _String((_String*)toStr()) & " failed.");
+            res->Clear();
+            return       res;
+        } else {
+            delete res;
+            return nil;
+        }
+    }
+
+    for (k=0; k<dydx.lLength; k++) {
+        delete ((_Formula*)dydx.lData[k]);
+    }
+
+    res->theFormula.AppendNewInstance (new _Operation(new _Constant (0.0))) ;
+    res->theTree         = dTree;
+    res->InternalSimplify (dTree);
+    res->ConvertFromTree  ();
+    return res;
+
+}
+
+
+//__________________________________________________________________________________
+bool _Formula::InternalSimplify (node<long>* startNode)
+// returns true if the subexpression at
+// and below startnode is constant
+{
+    long        numChildren = startNode->get_num_nodes(),
+                k,
+                collapse2 = -1;
+
+    bool        isConstant  = true,
+                firstConst  = true,
+                secondConst = (numChildren>1);
+
+    _Parameter  theVal      = 0.0;
+
+    _PMathObj   newVal      = nil;
+
+    _Operation* op = (_Operation*)theFormula (startNode->get_data());
+
+    if  (numChildren == 0) {
+        return !op->IsAVariable();
+    }
+
+    for  (k=1; k<=numChildren; k++) {
+        InternalSimplify (startNode->go_down(k));
+        if (k==1) {
+            firstConst = InternalSimplify (startNode->go_down(k));
+        } else if (k==2) {
+            secondConst = InternalSimplify (startNode->go_down(k));
+        } else {
+            isConstant = isConstant && InternalSimplify (startNode->go_down(k));
+        }
+    }
+
+    isConstant = isConstant && firstConst && (numChildren==1 || secondConst);
+
+    if (op->opCode > HY_OP_CODE_NONE) {
+        if (isConstant) { // this executes the subxpression starting at the current node
+            _Stack scrap;
+            for  (k=1; k<=numChildren; k++) {
+                ((_Operation*)theFormula (startNode->go_down(k)->get_data()))->Execute (scrap);
+            }
+            op->Execute (scrap);
+            newVal = (_PMathObj)scrap.Pop();//->makeDynamic();
+        } else {
+            if (firstConst||secondConst) {
+                theVal  =((_Operation*)theFormula (startNode->go_down(firstConst?1:2)->get_data()))->GetANumber()->Value();
+
+                switch (op->opCode) {
+                    case HY_OP_CODE_MUL: { // *
+                        if (CheckEqual (theVal,0.0)) { // *0 => 0
+                            newVal = new _Constant (0.0);
+                            break;
+                        }
+                        if (CheckEqual (theVal,1.0)) { // ?*1 => ?
+                            collapse2 = firstConst?2:1;
+                            break;
+                        }
+                    }
+                    break;
+
+                    case HY_OP_CODE_ADD: { // +
+                        if (CheckEqual (theVal,0.0)) { // ?+0 => ?
+                            collapse2 = firstConst?2:1;
+                            break;
+                        }
+                    }
+
+                    case HY_OP_CODE_SUB: { // -
+                        if (CheckEqual (theVal,0.0)) {
+                            collapse2 = firstConst?(-2):1;
+                            break;
+                        }
+                    }
+
+                    case HY_OP_CODE_DIV: { // /
+                        if (firstConst&&CheckEqual (theVal,0.0)) { // 0/? => 0
+                            newVal = new _Constant (0.0);
+                            break;
+                        }
+                        if (secondConst&&CheckEqual (theVal,1.0)) { // ?/1 => ?
+                            collapse2 = 1;
+                            break;
+                        }
+                    }
+                    break;
+
+                    case HY_OP_CODE_POWER: { // ^
+                        if (firstConst&&CheckEqual (theVal,1.0)) { // 1^? => 1
+                            newVal = new _Constant (1.0);
+                            break;
+                        }
+                        if (secondConst&&CheckEqual (theVal,1.0)) { // ?^1 => ?
+                            collapse2 = 1;
+                            break;
+                        }
+                    }
+                    break;
+                }
+            }
+        }
+    }
+
+    if (newVal) {
+        for  (k=numChildren; k; k--) {
+            startNode->go_down(k)->delete_tree(true);
+            startNode->kill_node (k);
+        }
+        startNode->in_object = theFormula.lLength;
+        theFormula.AppendNewInstance (new _Operation(newVal));
+    }
+
+    if (collapse2 !=- 1) {
+        if (collapse2>0) {
+            k = 3-collapse2;
+
+            startNode->go_down(k)->delete_tree(true);
+            node <long>*    replaceWith = startNode->go_down(collapse2);
+
+            startNode->kill_node(1);
+            startNode->kill_node(2);
+
+            for (k=1; k<=replaceWith->get_num_nodes(); k++) {
+                startNode->add_node (*replaceWith->go_down(k));
+            }
+
+            startNode->in_object = replaceWith->in_object;
+
+            delete (replaceWith);
+
+        } else { // 0-? => -?
+            delete   (startNode->go_down(1));
+            startNode->kill_node(1);
+        }
+    }
+    return isConstant;
+}
+
+
+//__________________________________________________________________________________
+void _Formula::internalToStr (_String& result, node<long>* currentNode, char opLevel, _List* matchNames, _Operation* thisNodeOperation)
+{
+    if (!thisNodeOperation) {
+        thisNodeOperation = (_Operation*)theFormula (currentNode->get_data());
+    }
+
+    // decide what to do about this operation
+
+    if (thisNodeOperation->IsAVariable(false))
+        // this operation is just a variable - add ident to string and return
+    {
+        if (subNumericValues) {
+            if (subNumericValues == 2) {
+                _Variable* theV = LocateVar(thisNodeOperation->GetAVariable());
+                if  (_x_&&(theV->GetAVariable()==_x_->GetAVariable())) {
+                    result << _x_->GetName();
+                    return;
+                }
+            }
+
+            _Variable *thisVariable = LocateVar(thisNodeOperation->GetAVariable());
+            _PMathObj subThisValue = thisVariable->Compute();
+
+            if (subThisValue->ObjectClass () == NUMBER) {
+                if (subNumericValues == 3) {
+                    result << LocateVar(thisNodeOperation->GetAVariable())->GetName();
+                    result << '[';
+                    result.AppendNewInstance(new _String (subThisValue->Value()));
+                    result << ':';
+                    result.AppendNewInstance(new _String (thisVariable->GetLowerBound()));
+                    result << '-';
+                    result.AppendNewInstance(new _String (thisVariable->GetUpperBound()));
+                    result << ']';
+
+                } else {
+                    result.AppendNewInstance(new _String (subThisValue->Value()));
+                }
+            } else if (subThisValue->ObjectClass () == STRING) {
+                result.AppendNewInstance((_String*)subThisValue->toStr());
+            } else {
+                result << LocateVar(thisNodeOperation->GetAVariable())->GetName();
+            }
+        } else {
+            long variableIDX = thisNodeOperation->GetAVariable();
+            if (variableIDX>=0) {
+                _String * vName = LocateVar(variableIDX)->GetName();
+                if (matchNames) {
+                    _List * p1 = (_List*)(*matchNames)(0),
+                            * p2 = (_List*)(*matchNames)(1);
+
+                    long  f = p1->Find (vName);
+
+                    if (f<0) {
+                        result<<vName;
+                    } else {
+                        result<<(_String*)(*p2)(f);
+                    }
+                } else {
+                    result<<vName;
+                }
+            }
+        }
+        return;
+    }
+
+    long nOps = thisNodeOperation->GetNoTerms();
+    if (nOps>0)
+        // a built-in operation or a function call
+    {
+        // check if it's a built-in binary operation
+        _String  opString (thisNodeOperation->GetCode());
+        long f = BinOps.Find ((opString.sLength>1)?(opString.sData[0]*256+opString.sData[1]):opString.sData[0]);
+        if (f!=-1)
+            // indeed - a binary operation is what we have. check if need to wrap the return in parentheses
+        {
+            if (!currentNode || currentNode->get_num_nodes()==2 ) {
+                char tOpLevel  = opPrecedence(f),
+                     tOpLevel2 = tOpLevel;
+
+                if (associativeOps.Find(f)<0) {
+                    tOpLevel2 ++;
+                }
+                if (opLevel>=0) { // need to worry about op's precedence
+                    {
+                        bool parens = opPrecedence(f)<opLevel;
+
+                        if (parens&&currentNode) { // put parentheses around the return of this expression
+                            result<<'(';
+                            internalToStr (result, currentNode->go_down(1),tOpLevel,matchNames);
+                            result<<&thisNodeOperation->GetCode();
+                            internalToStr (result, currentNode->go_down(2),tOpLevel2,matchNames);
+                            result<<')';
+                            return;
+                        }
+                    }
+                }
+                if (currentNode) {
+                    internalToStr (result, currentNode->go_down(1),tOpLevel,matchNames);
+                }
+                result<<&thisNodeOperation->GetCode();
+                if (currentNode) {
+                    internalToStr (result, currentNode->go_down(2),tOpLevel2,matchNames);
+                }
+                return;
+            } else { // mixed binary-unary operation
+                result<<&thisNodeOperation->GetCode();
+                if (currentNode) {
+                    result<<'(';
+                    internalToStr (result, currentNode->go_down(1),opPrecedence(f),matchNames);
+                    result<<')';
+                }
+                return;
+            }
+        } else {
+            _String mac ("MAccess");
+            if (!thisNodeOperation->GetCode().Equal(&mac)) {
+                result<<&thisNodeOperation->GetCode();
+                if (currentNode) {
+                    result<<'(';
+                    for (long k=1; k<=nOps; k++) {
+                        if (k>1) {
+                            result<<',';
+                        }
+                        internalToStr (result, currentNode->go_down(k),-1,matchNames);
+                    }
+                    result<<')';
+                }
+            } else { // matrix element access - treat specially
+                if (currentNode) {
+                    internalToStr (result, currentNode->go_down(1),-1,matchNames);
+                    for (long k=2; k<=nOps; k++) {
+                        result<<'[';
+                        internalToStr (result, currentNode->go_down(k),-1,matchNames);
+                        result<<']';
+                    }
+                }
+            }
+        }
+        return;
+    }
+    if (nOps<0)
+        // a user-defined function
+    {
+        result<<((_String*)batchLanguageFunctionNames(-nOps-1));
+        if (currentNode) {
+            result<<'(';
+            for (long k=1; k<=batchLanguageFunctionParameters(-nOps-1); k++) {
+                if(k>1) {
+                    result<<',';
+                }
+                internalToStr (result, currentNode->go_down(k),-1,matchNames);
+            }
+            result<<')';
+        }
+        return;
+    }
+    _PMathObj opValue = thisNodeOperation->GetANumber();
+    _String* conv = (_String*)opValue->toStr();
+    if (opValue->ObjectClass()==STRING) {
+        result<<'"';
+        result<<conv;
+        result<<'"';
+    } else {
+        if (opValue->ObjectClass() == NUMBER && opValue->Value() < 0.0) {
+            result<<'(';
+            result<<conv;
+            result<<')';
+        } else {
+            result<<conv;
+        }
+    }
+    DeleteObject(conv);
+}
+//__________________________________________________________________________________
+bool     _Formula::IsEmpty(void)
+// is there anything in the formula
+{
+    return bool(!theFormula.lLength);
+}
+
+//__________________________________________________________________________________
+_Parameter   _Formula::Newton(_Formula& derivative, _Variable* unknown, _Parameter targetValue, _Parameter left, _Parameter right)
+// find a root of the formulaic expression, using Newton's method, given the derivative and a bracketed root.
+// will alternate between bisections and Newton iterations based on what is fatser
+{
+    // check that there is indeed a sign change on the interval
+    _Constant   dummy;
+    _Parameter  t1,t2,t3,t4,t5,lastCorrection = 100., newCorrection;
+    _String     msg;
+    long        iterCount = 0;
+    dummy.SetValue (left);
+    unknown->SetValue(&dummy);
+    t1 = Compute()->Value()-targetValue;
+    if (t1==0.0) {
+        return left;
+    }
+    dummy.SetValue (right);
+    unknown->SetValue(&dummy);
+    t2 = Compute()->Value()-targetValue;
+    if (t2==0) {
+        return right;
+    }
+    if (t1*t2>0.0) {
+        subNumericValues = 2;
+        _String *s = (_String*)toStr();
+        subNumericValues = 0;
+        _String msg = *s&"="&_String(targetValue)&" has no (or multiple) roots in ["&_String(left)&",Inf)";
+        ReportWarning (msg);
+        DeleteObject (s);
+        return    left;
+    }
+    // else all is good we can start the machine
+    bool useNewton = false;
+    while ((fabs((right-left)/MAX(left,right))>machineEps*10.)&&(iterCount<200)) { // stuff to do
+        iterCount ++;
+        if (!useNewton) {
+            t3 = (right+left)/2;
+        }
+        dummy.SetValue(t3);
+        unknown->SetValue(&dummy);
+        t4 = Compute()->Value()-targetValue;
+        // get the correction term from the derivative
+        dummy.SetValue(t3);
+        unknown->SetValue(&dummy);
+        t5 = derivative.Compute()->Value();
+        useNewton = true;
+        if (t5==0.0) {
+            useNewton = false;
+        } else {
+            newCorrection = -t4/t5;
+            if (t3) {
+                if (fabs(newCorrection/t3)<machineEps*2.) { // correction too small - the root has been found
+                    return t3;
+                }
+            } else if (fabs(newCorrection)<machineEps*2.) { // correction too small - the root has been found
+                return t3;
+            }
+            if (fabs(newCorrection/lastCorrection)>4) { // Newton correction too large - revert to bisection
+                useNewton = false;
+            }
+            t5 = t3+newCorrection;
+            if ((t5<=left)||(t5>=right)) {
+                useNewton = false;
+            } else {
+                lastCorrection = newCorrection;
+            }
+        }
+        if (useNewton) {
+            t3 = t5;
+        } else {
+            dummy.SetValue(t3);
+            unknown->SetValue(&dummy);
+            t4 = Compute()->Value()-targetValue;
+            if (t4==0.0) {
+                return t3;
+            }
+            if (t4*t1 >0) {
+                t1 = t4;
+                left = t3;
+            } else {
+                t2 = t4;
+                right = t3;
+            }
+        }
+
+    }
+    return t3;
+}
+
+
+//__________________________________________________________________________________
+_Parameter   _Formula::Brent(_Variable* unknown, _Parameter a, _Parameter b, _Parameter tol, _List* storeEvals, _Parameter rhs)
+// find a root of the formulaic expression, using Brent's method and a bracketed root.
+{
+    // check that there is indeed a sign change on the interval
+    _Constant   dummy;
+
+    _Parameter  fa = 0.0,fb = 0.0,fc,d,e,min1,min2,xm,p,q,r,s,tol1,
+                c = b;
+
+    min1 = unknown->GetLowerBound();
+    min2 = unknown->GetUpperBound();
+
+    long        it = 0;
+
+    if (a>b) { // autobracket to the left
+        dummy.SetValue (b);
+        unknown->SetValue(&dummy);
+        fb = Compute()->Value();
+        if (storeEvals) {
+            (*storeEvals) && & dummy;
+            dummy.SetValue (fb);
+            (*storeEvals) && & dummy;
+        }
+
+        if (b<0.00001 && b>-0.00001) {
+            a = b-0.0001;
+        } else {
+            a = b-fabs(b)*0.1;
+        }
+
+        if (a<min1) {
+            a = min1+0.5*(b-min1);
+        }
+
+        dummy.SetValue (a);
+        unknown->SetValue(&dummy);
+        fa = Compute()->Value()-rhs;
+        if (storeEvals) {
+            (*storeEvals) && & dummy;
+            dummy.SetValue (fa);
+            (*storeEvals) && & dummy;
+        }
+
+        for (long k=0; k<50; k++) {
+            if (fb*fa<0.0) {
+                break;
+            }
+
+            d  = (b-a)*GOLDEN_RATIO;
+            b  = a;
+            a -= d;
+
+            if (a<min1) {
+                if (b>min1) {
+                    a = min1;
+                } else {
+                    break;
+                }
+            }
+
+            fb = fa;
+
+            dummy.SetValue (a);
+            unknown->SetValue(&dummy);
+            fa = Compute()->Value()-rhs;
+            if (storeEvals) {
+                (*storeEvals) && & dummy;
+                dummy.SetValue (fa);
+                (*storeEvals) && & dummy;
+            }
+        }
+    } else if (CheckEqual (a,b)) { // autobracket to the right
+        dummy.SetValue (a);
+        unknown->SetValue(&dummy);
+        fa = Compute()->Value()-rhs;
+
+        if (storeEvals) {
+            (*storeEvals) && & dummy;
+            dummy.SetValue (fa);
+            (*storeEvals) && & dummy;
+        }
+        a = b;
+
+        if ((b<0.00001)&&(b>-0.00001)) {
+            b = b+0.0001;
+        } else {
+            b = b+fabs(b)*0.1;
+        }
+
+        if (b>min2) {
+            b = a+0.5*(min2-a);
+        }
+
+        dummy.SetValue (b);
+        unknown->SetValue(&dummy);
+        fb = Compute()->Value()-rhs;
+
+        if (storeEvals) {
+            (*storeEvals) && & dummy;
+            dummy.SetValue (fb);
+            (*storeEvals) && & dummy;
+        }
+
+        for (long k=0; k<50; k++) {
+            if (fb*fa<0.0) {
+                break;
+            }
+
+            d  = (b-a)*GOLDEN_RATIO;
+            a  = b;
+            b += d;
+
+            if (b>min2) {
+                if (a<min2) {
+                    b = min2;
+                } else {
+                    break;
+                }
+            }
+
+            fa = fb;
+
+            dummy.SetValue (b);
+            unknown->SetValue(&dummy);
+            fb = Compute()->Value()-rhs;
+            if (storeEvals) {
+                (*storeEvals) && & dummy;
+                dummy.SetValue (fb);
+                (*storeEvals) && & dummy;
+            }
+        }
+    }
+
+
+    if (fa == 0.0) {
+        dummy.SetValue (a);
+        unknown->SetValue(&dummy);
+        fa = Compute()->Value()-rhs;
+        if (storeEvals) {
+            (*storeEvals) && & dummy;
+            dummy.SetValue (fa);
+            (*storeEvals) && & dummy;
+        }
+        if (fa == 0.0) {
+            return a;
+        }
+    }
+
+    if (fb == 0.0) {
+        dummy.SetValue (b);
+        unknown->SetValue(&dummy);
+        fb = Compute()->Value()-rhs;
+        if (storeEvals) {
+            (*storeEvals) && & dummy;
+            dummy.SetValue (fb);
+            (*storeEvals) && & dummy;
+        }
+        if (fb==0) {
+            return b;
+        }
+    }
+
+    if (fa*fb<0.0) {
+        fc = fb;
+
+        for (it = 0; it < MAX_BRENT_ITERATES; it++) {
+            if (fb*fc>0.0) {
+                fc = fa;
+                c  = a;
+                e = d = b-a;
+            }
+
+            if (fabs (fc) < fabs (fb)) {
+                a     = b;
+                b     = c;
+                c     = a;
+                fa    = fb;
+                fb    = fc;
+                fc    = fa;
+            }
+
+            tol1 = 2.*fabs(b)*machineEps+.5*tol;
+
+            xm = .5*(c-b);
+
+            if (fabs(xm)<=tol1 || fb == 0.0) {
+                return b;
+            }
+
+            if (fabs(e)>=tol1 && fabs (fa) > fabs (fb)) {
+                s = fb/fa;
+                if (a==c) {
+                    p = 2.*xm*s;
+                    q = 1.-s;
+                } else {
+                    q = fa/fc;
+                    r = fb/fc;
+                    p = s*(2.*xm*q*(q-r)-(b-a)*(r-1.0));
+                    q = (q-1.)*(r-1.)*(s-1.);
+                }
+                if (p>0.0) {
+                    q = -q;
+                }
+
+                if (p<0.0) {
+                    p = -p;
+                }
+
+                min1 = 3.*xm*q-fabs(tol1*q);
+                min2 = fabs (e*q);
+                if (2.*p < (min1<min2?min1:min2)) {
+                    e = d;
+                    d = p/q;
+                } else {
+                    d = xm;
+                    e = d;
+                }
+            } else {
+                d = xm;
+                e = d;
+            }
+            a = b;
+            fa = fb;
+            if (fabs(d)>tol1) {
+                b+=d;
+            } else {
+                b+=fabs(tol1)*(1.*2.*(xm>=.0));
+            }
+
+            dummy.SetValue (b);
+            unknown->SetValue(&dummy);
+            fb = Compute()->Value()-rhs;
+            if (storeEvals) {
+                (*storeEvals) && & dummy;
+                dummy.SetValue (fb);
+                (*storeEvals) && & dummy;
+            }
+        }
+    }
+
+    subNumericValues = 2;
+    _String msg ((_String*)toStr());
+    subNumericValues = 0;
+    msg = msg & "=" & rhs;
+    if (it < MAX_BRENT_ITERATES) {
+        msg =   msg & " has no (or multiple) roots in ["&_String(a)&","&_String(b)&"]";
+    } else {
+        msg =   msg & " failed to converge to sufficient precision in " & MAX_BRENT_ITERATES &" iterates.";
+    }
+
+    ReportWarning (msg);
+    return    b;
+}
+//__________________________________________________________________________________
+_Parameter   _Formula::Newton(_Formula& derivative, _Parameter targetValue, _Parameter left, _Parameter max_right, _Variable* unknown)
+// given a monotone function and a left bracket bound, found the right bracket bound and solve
+{
+    // check that there is indeed a sign change on the interval
+    _Constant   dummy;
+    dummy.SetValue (left);
+    unknown->SetValue(&dummy);
+    _Parameter  t1 = Compute()->Value(), right = left, t2, step = 1.0;
+
+    if (max_right-left < step * 100) {
+        step = (max_right-left)/100;
+    }
+    if  (step==0.0) {
+        return left;
+    }
+    do {
+        right += step;
+        if (right>max_right) { // function doesn't seem to have a root
+            subNumericValues = 2;
+            _String *s = (_String*)toStr();
+            subNumericValues = 0;
+            _String msg = *s&"="&_String(targetValue)&" has no (or multiple) roots in ["&_String(left)&","&_String(right)&")";
+            ReportWarning (msg);
+            DeleteObject (s);
+            return    left;
+        }
+        dummy.SetValue (right);
+        unknown->SetValue(&dummy);
+        t2 = Compute()->Value();
+        step*=2;
+        if (right+step>max_right)
+            if (right<max_right) {
+                step = max_right-right;
+            }
+    } while ((targetValue-t1)*(targetValue-t2)>0);
+    return Newton (derivative, unknown, targetValue, left, right);
+
+}
+
+//__________________________________________________________________________________
+_Parameter   _Formula::Newton(_Variable* unknown, _Parameter targetValue, _Parameter x_min, _Parameter left, _Parameter right)
+{
+    // check that there is indeed a sign change on the interval
+    _Constant   dummy;
+    _Parameter  t1,t2,t3,t4,t5,lastCorrection = 100, newCorrection;
+    _String     msg;
+    t1 =Integral(unknown, x_min, left)-targetValue;
+    if (t1==0.0) {
+        return left;
+    }
+    t2 = t1+Integral(unknown, left, right);
+    if (t2==0) {
+        return right;
+    }
+    if (t1*t2>0.0) {
+        subNumericValues = 2;
+        _String *s = (_String*)toStr();
+        subNumericValues = 0;
+        _String msg = *s&"="&_String(targetValue)&" has no (or multiple) roots in ["&_String(left)&","
+                      &_String (right)&"]";
+        ReportWarning (msg);
+        DeleteObject (s);
+        return    left;
+    }
+    // else all is good we can start the machine
+    bool useNewton = false;
+    while (right-left>1e-6) { // stuff to do
+        if (!useNewton) {
+            t3 = (right+left)/2;
+        }
+        dummy.SetValue(t3);
+        unknown->SetValue(&dummy);
+        t4 = Integral(unknown, x_min, t3)-targetValue;
+        // get the correction term from the derivative
+        dummy.SetValue(t3);
+        unknown->SetValue(&dummy);
+        t5 = Compute()->Value();
+        useNewton = true;
+        if (t5==0.0) {
+            useNewton = false;
+        } else {
+            newCorrection = -t4/t5;
+            if (fabs(newCorrection)<1e-5) { // correction too small - the root has been found
+                return t3;
+            }
+            if (fabs(newCorrection/lastCorrection)>4) { // Newton correction too large - revert to bisection
+                useNewton = false;
+            }
+            t5 = t3+newCorrection;
+            if ((t5<=left)||(t5>=right)) {
+                useNewton = false;
+            } else {
+                lastCorrection = newCorrection;
+            }
+        }
+        if (useNewton) {
+            t3 = t5;
+        } else {
+            t4 = Integral(unknown, x_min, t3)-targetValue;
+            if (t4==0.0) {
+                return t3;
+            }
+            if (t4*t1 >0) {
+                t1 = t4;
+                left = t3;
+            } else {
+                t2 = t4;
+                right = t3;
+            }
+        }
+
+    }
+    return t3;
+}
+
+//__________________________________________________________________________________
+_Parameter   _Formula::Newton( _Variable* unknown, _Parameter targetValue,_Parameter x_min, _Parameter left)
+// given a monotone function and a left bracket bound, found the right bracket bound and solve
+{
+    // check that there is indeed a sign change on the interval
+    _Parameter  t1 = Integral(unknown, x_min, left), right = left, t2, step = 1.0;
+    do {
+        right += step;
+        t2 = Integral(unknown, right-step, right);
+        step*=2;
+        if (right>=1e10) { // function doesn't seem to have a root
+            subNumericValues = 2;
+            _String *s = (_String*)toStr();
+            subNumericValues = 0;
+            _String msg = *s&"="&_String(targetValue)&" has no (or multiple) roots in ["&_String(left)&",Inf)";
+            WarnError (msg);
+            DeleteObject (s);
+            return    0.0;
+        }
+    } while ((targetValue-t1)*(targetValue-t2-t1)>=0);
+    return Newton ( unknown, targetValue,x_min, left, right);
+
+}
+
+_Parameter   _Formula::Integral(_Variable* dx, _Parameter left, _Parameter right, bool infinite)
+// uses Romberg's intergation method
+{
+    if (infinite) { // tweak "right" here
+        _Parameter value = 1.0, step = 1.0, right1=-1;
+        right = left;
+        while (value>machineEps) {
+            right+=step;
+            _Constant dummy (right);
+            dx->SetValue(&dummy);
+            value = fabs(Compute()->Value());
+            if ((value<0.001)&&(right1<0)) {
+                right1 = right;
+            }
+            step *= 2;
+            if (step>100000) { // integrand decreasing too slowly
+                _String msg, *s = (_String*)toStr();
+                msg = *s & " decreases too slowly to be integrated over an infinite interval";
+                DeleteObject(s);
+                WarnError (msg);
+                return 0.0;
+            }
+        }
+        if (right1<right-machineEps) {
+            return Integral(dx,left,right1,false)+Integral(dx,right1,right,false);
+        } else {
+            return Integral(dx,left,right1,false);
+        }
+    }
+
+    checkParameter(intPrecFact,integrationPrecisionFactor,1e-4);
+    checkParameter(intMaxIter,maxRombergSteps,8);
+
+    _Parameter ss,
+               dss,
+               *s,
+               *h;
+
+    s = new _Parameter [(long)maxRombergSteps];
+    h = new _Parameter [(long)(maxRombergSteps+1)];
+    checkPointer(s);
+    checkPointer(h);
+
+    h[0]=1.0;
+
+    long         interpolateSteps = 5,
+                 stackDepth = 0;
+
+    _SimpleList  fvidx,
+                 changingVars,
+                 idxMap;
+
+    _Parameter   * ic = new _Parameter[interpolateSteps],
+    * id = new _Parameter[interpolateSteps];
+
+    _SimpleFormulaDatum
+    * stack = nil,
+      * vvals = nil;
+
+    checkPointer (ic);
+    checkPointer (id);
+
+    if (AmISimple (stackDepth,fvidx)) {
+        stack = new _SimpleFormulaDatum [stackDepth];
+        checkPointer (stack);
+        vvals = new _SimpleFormulaDatum [fvidx.lLength];
+        checkPointer (vvals);
+        ConvertToSimple (fvidx);
+        stackDepth = dx->GetAVariable();
+        for (long vi = 0; vi < fvidx.lLength; vi++) {
+            _Variable * checkvar = LocateVar (fvidx.lData[vi]);
+            if (checkvar->CheckFForDependence (stackDepth,true)) {
+                changingVars << fvidx.lData[vi];
+                idxMap << vi;
+            }
+            vvals[vi].value = checkvar->Compute()->Value();
+        }
+        changingVars.InsertElement ((BaseRef)stackDepth,0,false,false);
+        idxMap.InsertElement ((BaseRef)fvidx.Find(stackDepth),0,false,false);
+    } else {
+        stackDepth = -1;
+    }
+
+    for (long j=0; j<(long)maxRombergSteps; j++) {
+        if (stackDepth>=0) {
+            s[j] = TrapezoidLevelKSimple(*this, dx, left, right, j+1, stack, vvals,changingVars,idxMap);
+        } else {
+            s[j] = TrapezoidLevelK(*this, dx, left, right, j+1);
+        }
+        if (j>=4) {
+            ss = InterpolateValue(&h[j-4],&s[j-4],interpolateSteps,ic,id,0.0, dss);
+            if (fabs(dss)<= integrationPrecisionFactor * fabs(ss)) {
+                delete s;
+                delete h;
+                delete ic;
+                delete id;
+                if (stackDepth>=0) {
+                    ConvertFromSimple(fvidx);
+                    delete (stack);
+                    delete (vvals);
+                }
+                return ss;
+            }
+        }
+        h[j+1] =  h[j]/9.0;
+    }
+
+    if (stackDepth>=0) {
+        ConvertFromSimple(fvidx);
+        delete (stack);
+        delete (vvals);
+    }
+    _String *str = (_String*)toStr(),
+             msg = _String("Integral of ")&*str & " over ["&_String(left)&","&_String(right)&"] converges slowly, loss of precision may occur. Change either INTEGRATION_PRECISION_FACTOR or INTEGRATION_MAX_ITERATES";
+
+    DeleteObject (str);
+    ReportWarning (msg);
+
+    delete s;
+    delete h;
+    delete ic;
+    delete id;
+    return ss;
+}
+
+//__________________________________________________________________________________
+_Parameter   _Formula::MeanIntegral(_Variable* dx, _Parameter left, _Parameter right, bool infinite)
+{
+    _Formula newF;
+    _String tim ("*");
+    _Operation times (tim,2);
+    _Operation term (true, *(dx->GetName()));
+    newF.Duplicate((BaseRef)this);
+    newF.theFormula&& (&term);
+    newF.theFormula&& (& times);
+    return newF.Integral (dx,left,right, infinite);
+}
+
+//__________________________________________________________________________________
+long     _Formula::NumberOperations(void)
+// number of operations in the formula
+{
+    return theFormula.lLength;
+}
+
+//__________________________________________________________________________________
+
+long      _Formula::ExtractMatrixExpArguments (_List* storage) {
+    long count = 0;
+    
+    if (resultCache && resultCache->lLength) {
+        long cacheID     = 0;     
+        bool cacheUpdated = false; 
+            // whether or not a cached result was used 
+            
+
+        for (unsigned long i=0; i<theFormula.lLength; i++) {
+            _Operation* thisOp ((_Operation*)(((BaseRef**)theFormula.lData)[i]));
+            if (i < theFormula.lLength-1) {
+                _Operation* nextOp  ((_Operation*)(((BaseRef**)theFormula.lData)[i+1]));
+
+                if (! cacheUpdated && nextOp->CanResultsBeCached(thisOp)) {
+                    _Stack temp;
+                    thisOp->Execute (temp);
+
+                    _Matrix *currentArg  = (_Matrix*)temp.Pop(true),
+                            *cachedArg   = (_Matrix*)((_PMathObj)(*resultCache)(cacheID)),
+                            *diff        = nil;
+
+                    if (cachedArg->ObjectClass() == MATRIX) {
+                        diff =  (_Matrix*)cachedArg->SubObj(currentArg);
+                    }
+
+                    if (diff && diff->MaxElement() <= 1e-12) {
+                        cacheID += 2;
+                        i ++;
+                    } else {
+                        cacheUpdated = true;
+                        cacheID++;
+                        if (nextOp->CanResultsBeCached(thisOp, true)) {
+                            storage->AppendNewInstance(currentArg);
+                            count ++;
+                        }
+                    }
+                    DeleteObject (diff);
+                    continue;
+                }
+                if (cacheUpdated) {
+                    cacheID++;
+                    cacheUpdated = false;
+                }            
+            }
+        }
+    }
+    
+    return count;
+}
+
+//__________________________________________________________________________________
+_Variable * _Formula::Dereference (bool ignore_context, _hyExecutionContext* theContext) {
+    _Variable * result = nil;
+    _PMathObj computedValue = Compute (0, theContext->GetContext(), nil, theContext->GetErrorBuffer());
+    if (computedValue && computedValue->ObjectClass() == STRING) {
+        result =  (_Variable*)((_FString*)computedValue)->Dereference(ignore_context, theContext, true);
+    }
+    
+    if (!result) {
+        theContext->ReportError( (_String ("Failed to dereference '") & _String ((_String*)toStr()) & "' in the " & (ignore_context ? "global" : "local") & " context"));
+    }
+    
+    return result;
+}
+
+
+//__________________________________________________________________________________
+_PMathObj _Formula::Compute (long startAt, _VariableContainer * nameSpace, _List* additionalCacheArguments, _String* errMsg) 
+// compute the value of the formula
+{
+    if (theFormula.lLength == 0) {
+        theStack.theStack.Clear();
+        theStack.Push (new _MathObject, false);
+    } else {
+        bool wellDone = true;
+
+        if (startAt == 0) {
+            theStack.theStack.Clear();
+        }
+
+        if (startAt == 0 && resultCache && resultCache->lLength) {
+            long cacheID     = 0;     
+                // where in the cache are we currently looking
+            bool cacheUpdated = false; 
+                // whether or not a cached result was used 
+
+            for (unsigned long i=0; i<theFormula.lLength; i++) {
+                _Operation* thisOp ((_Operation*)(((BaseRef**)theFormula.lData)[i]));
+                if (i < theFormula.lLength-1) {
+                    _Operation* nextOp  ((_Operation*)(((BaseRef**)theFormula.lData)[i+1]));
+
+                    if (! cacheUpdated && nextOp->CanResultsBeCached(thisOp)) {
+                        if (!thisOp->Execute(theStack,nameSpace, errMsg)) {
+                            wellDone = false;
+                            break;
+                        }
+
+                        _Matrix *currentArg  = (_Matrix*)theStack.Pop(false),
+                                *cachedArg   = (_Matrix*)((_PMathObj)(*resultCache)(cacheID)),
+                                *diff        = nil;
+
+                        if (cachedArg->ObjectClass() == MATRIX) {
+                            diff =  (_Matrix*)cachedArg->SubObj(currentArg);
+                        }
+                        
+                        bool    no_difference = diff && diff->MaxElement() <= 1e-12;
+
+                        if (no_difference || (additionalCacheArguments && additionalCacheArguments->lLength && nextOp->CanResultsBeCached(thisOp,true))) {
+                            DeleteObject  (theStack.Pop  ());
+                            if (no_difference) {
+                                theStack.Push ((_PMathObj)(*resultCache)(cacheID+1));
+                            } else {
+ 
+                                theStack.Push ((_PMathObj)(*additionalCacheArguments)(0)); 
+                                resultCache->Replace(cacheID,theStack.Pop(false),true);
+                                resultCache->Replace(cacheID+1,(*additionalCacheArguments)(0),false);
+                                additionalCacheArguments->Delete (0, false);                              
+                                //printf ("_Formula::Compute additional arguments %ld\n", additionalCacheArguments->lLength);
+                           }
+                            cacheID += 2;
+                            i ++;
+                            //printf ("Used formula cache %s\n", _String((_String*)nextOp->toStr()).sData);
+                        } else {
+                            cacheUpdated = true;
+                            resultCache->Replace(cacheID++,theStack.Pop(false),true);
+                            //printf ("Updated formula cache %s\n", _String((_String*)nextOp->toStr()).sData);
+                       }
+                       DeleteObject (diff);
+                       continue;
+                    }
+                }
+                if (!thisOp->Execute(theStack,nameSpace, errMsg)) { // does this always get executed?
+                    wellDone = false;
+                    break;
+                }
+                if (cacheUpdated) {
+                    resultCache->Replace(cacheID++,theStack.Pop(false),true);
+                    cacheUpdated = false;
+                }
+            }
+        } else {
+            for (unsigned long i=startAt; i<theFormula.lLength; i++)
+                if (!((_Operation*)(((BaseRef**)theFormula.lData)[i]))->Execute(theStack, nameSpace, errMsg)) {
+                    wellDone = false;
+                    break;
+                }
+        }
+        if (theStack.theStack.lLength != 1 || !wellDone) {
+            _String errorText = _String((_String*)toStr()) & _String(" contains errors.");
+            if (errMsg) {
+                *errMsg = *errMsg & errorText;
+            }
+            else {
+                WarnError (errorText);
+            }
+            theStack.theStack.Clear();
+            theStack.Push (new _Constant (0.0), false);
+         }
+    }
+
+    return theStack.Pop(false);
+}
+
+//__________________________________________________________________________________
+bool _Formula::CheckSimpleTerm (_PMathObj thisObj)
+{
+    if (thisObj) {
+        long oc = thisObj->ObjectClass();
+        if (oc !=NUMBER) {
+            if (oc ==MATRIX) {
+                _Matrix * mv = (_Matrix*)thisObj->Compute();
+                if (mv->IsIndependent () && !mv->SparseDataStructure()) {
+                    return true;
+                }
+            }
+        } else {
+            return true;
+        }
+    }
+    return false;
+}
+
+//__________________________________________________________________________________
+_Formula _Formula::operator+ (const _Formula& operand2) {
+    _Formula joint;
+    return joint.PatchFormulasTogether (*this,operand2,HY_OP_CODE_ADD);
+}
+
+//__________________________________________________________________________________
+_Formula _Formula::operator- (const _Formula& operand2) {
+    _Formula joint;
+    return joint.PatchFormulasTogether (*this,operand2,HY_OP_CODE_SUB);
+}
+
+//__________________________________________________________________________________
+_Formula _Formula::operator* (const _Formula& operand2) {
+    _Formula joint;
+    return joint.PatchFormulasTogether (*this,operand2,HY_OP_CODE_MUL);
+}
+
+//__________________________________________________________________________________
+_Formula _Formula::operator/ (const _Formula& operand2) {
+    _Formula joint;
+    return joint.PatchFormulasTogether (*this,operand2,HY_OP_CODE_DIV);
+}
+
+//__________________________________________________________________________________
+_Formula _Formula::operator^ (const _Formula& operand2) {
+    _Formula joint;
+    return joint.PatchFormulasTogether (*this,operand2,HY_OP_CODE_POWER);
+}
+
+//__________________________________________________________________________________
+_Formula& _Formula::PatchFormulasTogether (_Formula& target, const _Formula& operand2, const char op_code) {
+    target.Clear();
+    target.DuplicateReference(this);
+    target.DuplicateReference(&operand2);
+    target.theFormula.AppendNewInstance(new _Operation (op_code, 2));
+    return target;
+}
+
+
+//__________________________________________________________________________________
+void _Formula::ConvertMatrixArgumentsToSimpleOrComplexForm (bool makeComplex)
+{
+    if (makeComplex) {
+        if (resultCache) {
+            DeleteObject (resultCache);
+            resultCache = nil;
+        }
+    } else {
+        if (!resultCache) {
+            resultCache = new _List();
+            for (int i=1; i<theFormula.lLength; i++) {
+                _Operation* thisOp = ((_Operation*)(((BaseRef**)theFormula.lData)[i]));
+                if (thisOp->CanResultsBeCached(((_Operation*)(((BaseRef**)theFormula.lData)[i-1])))) {
+                    resultCache->AppendNewInstance(new _MathObject());
+                    resultCache->AppendNewInstance(new _MathObject());
+                }
+            }
+        }
+    }
+
+    for (int i=0; i<theFormula.lLength; i++) {
+        _Operation* thisOp = ((_Operation*)(((BaseRef**)theFormula.lData)[i]));
+
+        _Matrix   * thisMatrix = nil;
+
+        if (thisOp->theNumber) {
+            if (thisOp->theNumber->ObjectClass() == MATRIX) {
+                thisMatrix = (_Matrix*)thisOp->theNumber;
+            }
+        } else {
+            if (thisOp->theData>-1) {
+                _Variable* thisVar = LocateVar (thisOp->theData);
+                if (thisVar->ObjectClass() == MATRIX) {
+                    thisMatrix = (_Matrix*)thisVar->GetValue();
+                }
+            }
+        }
+
+        if (thisMatrix)
+            if (makeComplex) {
+                thisMatrix->MakeMeGeneral();
+            } else {
+                thisMatrix->MakeMeSimple();
+            }
+    }
+}
+
+//__________________________________________________________________________________
+bool _Formula::AmISimple (long& stackDepth, _SimpleList& variableIndex)
+{
+    if (!theFormula.lLength) {
+        return true;
+    }
+
+    long locDepth = 0;
+
+    for (int i=0; i<theFormula.lLength; i++) {
+        _Operation* thisOp = ((_Operation*)(((BaseRef**)theFormula.lData)[i]));
+        locDepth++;
+        if ( thisOp->theData<-2 || thisOp->numberOfTerms<0) {
+            return false;
+        }
+
+        if (thisOp->theNumber) {
+            if (thisOp->theNumber->ObjectClass() != NUMBER) {
+                return false;
+            }
+        } else {
+            if (thisOp->theData>-1) {
+                _Variable* thisVar = LocateVar (thisOp->theData);
+                if (thisVar->ObjectClass()!=NUMBER) {
+                    _PMathObj cv = thisVar->GetValue();
+                    if (!CheckSimpleTerm (cv)) {
+                        return false;
+                    }
+                }
+                if (variableIndex.Find (thisOp->theData)==-1) {
+                    variableIndex<<thisOp->theData;
+                }
+            } else {
+                if (simpleOperationCodes.Find(thisOp->opCode)==-1) {
+                    return false;
+                } else if ((thisOp->opCode == HY_OP_CODE_MACCESS || thisOp->opCode == HY_OP_CODE_MUL) && thisOp->numberOfTerms != 2) {
+                    return false;
+                }
+
+                locDepth-=thisOp->numberOfTerms;
+            }
+        }
+        if (locDepth>stackDepth) {
+            stackDepth = locDepth;
+        } else if (locDepth==0) {
+            _String errStr = _String("Invalid formula passed to _Formula::AmISimple") & _String ((_String*)toStr());
+            WarnError (errStr);
+            return false;
+        }
+    }
+    return true;
+}
+
+//__________________________________________________________________________________
+bool _Formula::IsArrayAccess (void){
+    if (theFormula.lLength) {
+        return ((_Operation*)(theFormula(theFormula.lLength-1)))->GetCode().Equal((_String*)BuiltInFunctions(HY_OP_CODE_MACCESS));
+    }
+    return false;
+}
+
+//__________________________________________________________________________________
+bool _Formula::ConvertToSimple (_SimpleList& variableIndex)
+{
+    bool has_volatiles = false;
+    if (theFormula.lLength)
+        for (unsigned long i=0; i<theFormula.lLength; i++) {
+            _Operation* thisOp = ((_Operation*)(((BaseRef**)theFormula.lData)[i]));
+            if (thisOp->theNumber) {
+                continue;
+            } else if (thisOp->theData >= 0) {
+                thisOp->theData = variableIndex.Find (thisOp->theData);
+            } else if (thisOp->opCode == HY_OP_CODE_SUB && thisOp->numberOfTerms == 1) {
+                thisOp->opCode = (long)MinusNumber;
+            } else {
+                if (thisOp->opCode == HY_OP_CODE_MACCESS) {
+                    thisOp->numberOfTerms = -2;
+                }
+                if (thisOp->opCode == HY_OP_CODE_RANDOM || thisOp->opCode == HY_OP_CODE_TIME)
+                    has_volatiles = true;
+                thisOp->opCode = simpleOperationFunctions(simpleOperationCodes.Find(thisOp->opCode));
+            }
+
+        }
+    return has_volatiles;
+}
+
+//__________________________________________________________________________________
+void _Formula::ConvertFromSimple (_SimpleList& variableIndex)
+{
+    if (!theFormula.lLength) {
+        return;
+    }
+
+    for (int i=0; i<theFormula.lLength; i++) {
+        _Operation* thisOp = ((_Operation*)(((BaseRef**)theFormula.lData)[i]));
+        if (thisOp->theNumber) {
+            continue;
+        } else {
+            if (thisOp->theData>-1) {
+                thisOp->theData = variableIndex[thisOp->theData];
+            } else if (thisOp->opCode == (long)MinusNumber) {
+                thisOp->opCode = HY_OP_CODE_SUB;
+            } else {
+                if (thisOp->opCode == (long)FastMxAccess) {
+                    thisOp->numberOfTerms = 2;
+                }
+                thisOp->opCode = simpleOperationCodes(simpleOperationFunctions.Find(thisOp->opCode));
+            }
+        }
+    }
+}
+
+//__________________________________________________________________________________
+_Parameter _Formula::ComputeSimple (_SimpleFormulaDatum* stack, _SimpleFormulaDatum* varValues)
+{
+    if (!theFormula.lLength) {
+        return 0.0;
+    }
+
+    long stackTop = 0;
+
+    for (int i=0; i<theFormula.lLength; i++) {
+        _Operation* thisOp = ((_Operation*)(((BaseRef**)theFormula.lData)[i]));
+        if (thisOp->theNumber) {
+            stack[stackTop++].value = thisOp->theNumber->Value();
+            continue;
+        } else {
+            if (thisOp->theData>-1) {
+                stack[stackTop++] = varValues[thisOp->theData];
+            } else {
+                stackTop--;
+                if (thisOp->numberOfTerms==2) {
+                    _Parameter  (*theFunc) (_Parameter, _Parameter);
+                    theFunc = (_Parameter(*)(_Parameter,_Parameter))thisOp->opCode;
+                    if (stackTop<1) {
+                        _String errMsg = "Internal error in _Formula::ComputeSimple - stack underflow.)";
+                        WarnError (errMsg);
+                        return 0.0;
+                    }
+                    stack[stackTop-1].value = (*theFunc)(stack[stackTop-1].value,stack[stackTop].value);
+                } else {
+                    if (thisOp->numberOfTerms==-2) {
+                        _Parameter  (*theFunc) (Ptr,_Parameter);
+                        theFunc = (_Parameter(*)(Ptr,_Parameter))thisOp->opCode;
+                        if (stackTop<1) {
+                            _String errMsg = "Internal error in _Formula::ComputeSimple - stack underflow.)";
+                            WarnError (errMsg);
+                            return 0.0;
+                        }
+                        stack[stackTop-1].value = (*theFunc)(stack[stackTop-1].reference,stack[stackTop].value);
+                    } else {
+                        _Parameter  (*theFunc) (_Parameter);
+                        theFunc = (_Parameter(*)(_Parameter))thisOp->opCode;
+                        stack[stackTop].value = (*theFunc)(stack[stackTop].value);
+                        ++stackTop;
+                    }
+                }
+            }
+        }
+    }
+
+    return stack->value;
+}
+
+//__________________________________________________________________________________
+bool _Formula::EqualFormula (_Formula* f)
+{
+    if (theFormula.lLength == f->theFormula.lLength) {
+        for (int i=0; i<theFormula.lLength; i++) {
+            if (!((_Operation*)(((BaseRef**)theFormula.lData)[i]))->EqualOp (((_Operation*)(((BaseRef**)f->theFormula.lData)[i])))) {
+                return false;
+            }
+        }
+        return true;
+    }
+    return false;
+}
+
+//__________________________________________________________________________________
+_PMathObj _Formula::ConstructPolynomial (void) // compute the value of the formula
+{
+    theStack.Reset();
+    bool wellDone = true;
+    _String errMsg; 
+
+    for (long i=0; i<theFormula.lLength; i++)
+        if (!((_Operation*)((BaseRef**)theFormula.lData)[i])->ExecutePolynomial(theStack, nil, &errMsg)) {
+            wellDone = false;
+            break;
+        }
+
+    if (theStack.theStack.lLength !=1 || !wellDone) {
+        return    nil;
+    }
+
+    return theStack.Pop(false);
+}
+//__________________________________________________________________________________
+bool _Formula::HasChanged (bool ingoreCats)
+{
+    _Operation *thisOp;
+    long dataID;
+    for (int i = 0; i<theFormula.lLength; i++) {
+        thisOp = (_Operation*)((BaseRef**)theFormula.lData)[i];
+        if (thisOp->IsAVariable()) {
+            dataID = thisOp->GetAVariable();
+            if (dataID>=0) {
+                if (((_Variable*)(((BaseRef*)(variablePtrs.lData))[dataID]))->HasChanged(ingoreCats)) {
+                    return true;
+                }
+            } else if (thisOp->theNumber->HasChanged()) {
+                return true;
+            }
+        } else if (thisOp->opCode == HY_OP_CODE_BRANCHLENGTH||thisOp->opCode == HY_OP_CODE_RANDOM||thisOp->opCode == HY_OP_CODE_TIME)
+            // time, random or branch length
+        {
+            return true;
+        } else if (thisOp->numberOfTerms<0) {
+            dataID = -thisOp->numberOfTerms-2;
+            if (dataID<batchLanguageFunctionClassification.lLength) {
+                if (batchLanguageFunctionClassification.lData[dataID] == BL_FUNCTION_NORMAL_UPDATE) {
+                    continue;
+                }
+            }
+            return true;
+        }
+    }
+    return false;
+}
+
+//__________________________________________________________________________________
+bool _Formula::HasChangedSimple (_SimpleList& variableIndex)
+{
+    _Operation *thisOp;
+    for (unsigned long i = 0; i<theFormula.lLength; i++) {
+        thisOp = (_Operation*)((BaseRef**)theFormula.lData)[i];
+        if (thisOp->theNumber) {
+            continue;
+        } else if (thisOp->theData >= 0) {
+            if (((_Variable*)(((BaseRef*)(variablePtrs.lData))[variableIndex.lData[thisOp->theData]]))->HasChanged(false)) {
+                return true;
+            }
+        } else {
+            if (thisOp->opCode == (long) RandomNumber) {
+                return true;
+            }
+        }
+    }
+    return false;
+}
+
+//__________________________________________________________________________________
+void _Formula::ScanFForVariables (_AVLList&l, bool includeGlobals, bool includeAll, bool includeCategs, bool skipMatrixAssignments, _AVLListX* tagger, long weight)
+{
+    for (unsigned long i = 0; i<theFormula.lLength; i++) {
+        _Operation* theObj = ((_Operation**)theFormula.lData)[i];
+        if (theObj->IsAVariable()) {
+            if (!includeGlobals)
+                // This change was part of a commit that introduced an optimizer bug (suspected location:
+                // src/core/batchlan2.cpp:2220). This change is suspicious as well (removed and undocumented condition).
+                //if ((((_Variable*)LocateVar(theObj->GetAVariable()))->IsGlobal())||
+                 //       (((_Variable*)LocateVar(theObj->GetAVariable()))->ObjectClass()!=NUMBER)) {
+                if (((_Variable*)LocateVar(theObj->GetAVariable()))->IsGlobal()) {
+                    continue;
+                }
+
+            long f = theObj->GetAVariable();
+
+            if (f>=0) {
+                _Variable * v = LocateVar(f);
+
+                if (v->IsCategory()&&includeCategs) {
+                    v->ScanForVariables (l,includeGlobals,tagger, weight);
+                }
+
+                if(includeAll || v->ObjectClass()==NUMBER) {
+                    l.Insert ((BaseRef)f);
+                    if (tagger) {
+                        tagger -> UpdateValue((BaseRef)f, weight, 0);
+                    }
+                }
+
+                if (skipMatrixAssignments) {
+                    if (v->ObjectClass()!=MATRIX || !theObj->AssignmentVariable()) {
+                        v->ScanForVariables(l,includeGlobals,tagger, weight);
+                    }
+                } else if (!v->IsIndependent()) {
+                    v->ScanForVariables(l,includeGlobals,tagger);
+                }
+            } else if (theObj->theNumber)
+                if (theObj->theNumber->ObjectClass()==MATRIX) {
+                    ((_Matrix*)theObj->theNumber)->ScanForVariables(l,includeGlobals,tagger, weight);
+                }
+        }
+    }
+}
+
+//__________________________________________________________________________________
+void _Formula::ScanFForType (_SimpleList &l, int type)
+{
+    for (long i = 0; i<theFormula.lLength; i++) {
+        _Operation* theObj = ((_Operation**)theFormula.lData)[i];
+        if (theObj->IsAVariable()) {
+            long f = theObj->GetAVariable();
+
+            if (f>=0) {
+                _Variable * v = LocateVar(f);
+
+                if(v->ObjectClass()==type) {
+                    l << f;
+                }
+
+            }
+        }
+    }
+}
+
+//__________________________________________________________________________________
+bool _Formula::CheckFForDependence (long varID, bool checkAll)
+{
+    for (int i = 0; i<theFormula.lLength; i++) {
+        _Operation* theObj = (_Operation*)theFormula(i);
+        long f;
+        if (theObj->IsAVariable()) {
+            f = theObj->GetAVariable();
+            if (f>=0) {
+                if (f == varID) {
+                    return true;
+                }
+                if (checkAll) {
+                    _Variable * v = LocateVar(f);
+                    if (!v->IsIndependent())
+                        if (v->CheckFForDependence(varID)) {
+                            return true;
+                        }
+                }
+            }
+        }
+    }
+    return false;
+}
+
+//__________________________________________________________________________________
+void  _Formula::LocalizeFormula (_Formula& ref, _String& parentName, _SimpleList& iv, _SimpleList& iiv, _SimpleList& dv, _SimpleList& idv)
+{
+    for (int i = 0; i<ref.theFormula.lLength; i++) {
+        if (((_Operation*)ref.theFormula(i))->IsAVariable()) {
+            long     vIndex = ((_Operation*)ref.theFormula(i))->GetAVariable();
+            _Variable* theV = LocateVar (vIndex);
+            if (theV->IsGlobal()) {
+                theFormula&& ref.theFormula(i);
+                continue;
+            }
+            if (theV->IsContainer()) {
+                continue;
+            }
+            _String  fullName = parentName&"."&*(theV->GetName());
+            long lvIndex = LocateVarByName(fullName);
+            if (lvIndex==-1)
+                // local variable doesn't yet exist - create
+            {
+                _Variable dummy (fullName);
+                lvIndex = LocateVarByName(fullName);
+                if (theV->IsIndependent()) {
+                    iv<<lvIndex;
+                    iiv<<vIndex;
+                } else {
+                    dv<<lvIndex;
+                    idv<<vIndex;
+                }
+            }
+            _Operation newVar (true, fullName);
+            theFormula && &newVar;
+        } else {
+            theFormula&& ref.theFormula(i);
+        }
+    }
+}
+
+//__________________________________________________________________________________
+bool _Formula::DependsOnVariable (long idx)
+{
+    for (long f = 0; f<theFormula.lLength; f++) {
+        _Operation * anOp = ((_Operation**)theFormula.lData)[f];
+        if (anOp->IsAVariable() && anOp->GetAVariable() == idx) {
+            return true;
+        }
+    }
+
+    return false;
+}
+
+//__________________________________________________________________________________
+_Operation* _Formula::GetIthTerm (long idx)
+{
+    if (idx >= 0 && idx < theFormula.lLength) {
+        return ((_Operation**)theFormula.lData)[idx];
+    }
+
+    return nil;
+}
+
+//__________________________________________________________________________________
+bool _Formula::IsAConstant (void)
+{
+    for (unsigned long i = 0; i<theFormula.lLength; i++)
+        if (((_Operation*)((BaseRef**)theFormula.lData)[i])->IsAVariable()) {
+            return false;
+        }
+
+    return true;
+}
+
+//__________________________________________________________________________________
+bool _Formula::IsConstant (void)
+{
+    for (unsigned long i = 0; i<theFormula.lLength; i++)
+        if (((_Operation*)((BaseRef**)theFormula.lData)[i])->IsConstant() == false) {
+            return false;
+        }
+
+    return true;
+}
+
+//__________________________________________________________________________________
+void _Formula::SimplifyConstants (void)
+{
+    theStack.theStack.Clear();
+    for (unsigned long i = 0; i<theFormula.countitems(); i++) {
+        long j;
+        _Operation* thisOp = ((_Operation*)((BaseRef**)theFormula.lData)[i]);
+        if ((thisOp->theData==-1)&&(thisOp->opCode>=0)&&(thisOp->numberOfTerms)) {
+            long nt = thisOp->numberOfTerms;
+            if (nt<0) {
+                nt = batchLanguageFunctionParameters.lData[-nt-1];
+            }
+
+            for (j = 1; j<=nt; j++) {
+                _Operation*  aTerm = ((_Operation*)((BaseRef**)theFormula.lData)[i-j]);
+                if ((aTerm->IsAVariable())||(aTerm->opCode>=0)) {
+                    break;
+                }
+            }
+
+            if (j>nt)
+                // all terms are constant -> Evaluate
+            {
+                for (j=i-thisOp->numberOfTerms; j<=i; j++) {
+                    ((_Operation*)((BaseRef**)theFormula.lData)[j])->Execute(theStack);
+                }
+                long n = i-thisOp->numberOfTerms;
+                thisOp = new _Operation (theStack.Pop());
+                for (j=n; j<=i; j++) {
+                    theFormula.Delete (n);
+                }
+                theFormula.InsertElement (thisOp,n,false);
+                i = n+1;
+                theStack.theStack.Clear();
+                thisOp->nInstances--;
+            } else {
+                if (thisOp->numberOfTerms == 2 &&
+                        (thisOp->opCode==HY_OP_CODE_MUL||thisOp->opCode==HY_OP_CODE_DIV||thisOp->opCode==HY_OP_CODE_POWER))
+                    // *,/,^ 1 can be removed
+                {
+                    _Operation*  aTerm = ((_Operation*)((BaseRef**)theFormula.lData)[i-1]);
+                    if (!((aTerm->IsAVariable())||(aTerm->opCode>=0))) {
+                        if (aTerm->theNumber->ObjectClass()==NUMBER && aTerm->theNumber->Value() == 1.) {
+                            theFormula.Delete (i);
+                            theFormula.Delete (i-1);
+                            i--;
+                        }
+                    }
+                }
+            }
+        }
+    }
+}
+
+//__________________________________________________________________________________
+_PMathObj _Formula::GetTheMatrix (void)
+{
+    if (theFormula.lLength==1) {
+        _Operation* firstOp = (_Operation*)theFormula(0);
+        _PMathObj   ret = firstOp->GetANumber();
+        if (ret&&(ret->ObjectClass()==MATRIX)) {
+            return ret;
+        } else {
+            if (firstOp->theData!=-1) {
+                _Variable* firstVar = LocateVar (firstOp->GetAVariable());
+                ret = firstVar->GetValue();
+                if (ret&&(ret->ObjectClass()==MATRIX)) {
+                    return ret;
+                }
+            }
+        }
+    }
+    return nil;
+}
+
+//__________________________________________________________________________________
+long _Formula::ObjectClass (void)
+{
+    if (theStack.theStack.lLength) {
+        return ((_PMathObj)theStack.theStack.lData[0])->ObjectClass();
+    }
+
+    _PMathObj res =   Compute();
+
+    if (res) {
+        return res->ObjectClass();
+    }
+
+    return HY_UNDEFINED;
+}
+
+//__________________________________________________________________________________
+_Formula::_Formula (_String&s, _VariableContainer* theParent, _String* reportErrors)
+// the parser itself
+{
+    theTree     = nil;
+    resultCache = nil;
+
+    _FormulaParsingContext fpc (reportErrors, theParent);
+    
+    if (Parse (this, s, fpc, nil) != HY_FORMULA_EXPRESSION) {
+        Clear();
+    }
+}
+//__________________________________________________________________________________
+void    _Formula::ConvertToTree (bool err_msg)
+{
+    if (!theTree&&theFormula.lLength) { // work to do
+        _SimpleList nodeStack;
+        
+        _Operation* currentOp;
+        for (unsigned long i=0; i<theFormula.lLength; i++) {
+            currentOp = (_Operation*)theFormula(i);
+            if (currentOp->TheCode()<0) { // a data bit
+                node<long>* leafNode = new node<long>;
+                checkPointer(leafNode);
+                leafNode->init(i);
+                nodeStack<<(long)leafNode;
+            } else { // an operation
+                long nTerms = currentOp->GetNoTerms();
+                if (nTerms<0) {
+                    nTerms = batchLanguageFunctionParameters(-nTerms-1);
+                }
+
+                if (nTerms>nodeStack.lLength) {
+                    if (err_msg) {
+                        WarnError (_String ("Insufficient number of arguments for a call to ") & _String ((_String*)currentOp->toStr()));
+                    }
+                    theTree = nil;
+                    return;
+                }
+
+                node<long>* operationNode = new node<long>;
+                checkPointer(operationNode);
+                operationNode->init(i);
+                for (long j=0; j<nTerms; j++) {
+                    operationNode->prepend_node(*((node<long>*)nodeStack(nodeStack.lLength-1)));
+                    nodeStack.Delete(nodeStack.lLength-1);
+                }
+                nodeStack<<(long)operationNode;
+            }
+        }
+        if (nodeStack.lLength!=1) {
+            if (err_msg) {
+                WarnError ((_String)"The expression '" & _String ((_String*)toStr()) & "' has " & (long)nodeStack.lLength & " terms left on the stack after evaluation");
+            }
+            theTree = nil;
+            return;
+        } else {
+            theTree = (node<long>*)nodeStack(0);
+        }
+    }
+}
+//__________________________________________________________________________________
+void    _Formula::ConvertFromTree (void)
+{
+    if (theTree) { // work to do
+        _SimpleList termOrder;
+        node<long>* currentNode = DepthWiseStepTraverser (theTree);
+        while (currentNode) {
+            termOrder<<currentNode->get_data();
+            currentNode = DepthWiseStepTraverser ((node<long>*)nil);
+        }
+        if (termOrder.lLength!=theFormula.lLength) { // something has changed
+            _List newFormula;
+            for (long i=0; i<termOrder.lLength; i++) {
+                newFormula<<theFormula(termOrder(i));
+            }
+            theFormula.Clear();
+            theFormula.Duplicate(&newFormula);
+            theTree->delete_tree();
+            delete (theTree);
+            theTree = nil;
+            ConvertToTree();
+        }
+    }
+}
+
+//__________________________________________________________________________________
+node<long>* _Formula::InternalDifferentiate (node<long>* currentSubExpression, long varID, _SimpleList& varRefs, _SimpleList& dydx, _Formula& tgt)
+{
+    _Operation * op = (_Operation*)theFormula (currentSubExpression->in_object);
+
+    if (op->theData!=-1) {
+        long k     = varRefs.BinaryFind (op->GetAVariable());
+        if (k<0) {
+            return nil;
+        }
+
+        _Formula* dYdX = (_Formula*)dydx(k);
+        return dYdX->DuplicateFormula (dYdX->theTree, tgt);
+    }
+
+    if (op->theNumber) {
+        _Formula src (new _Constant (0.0));
+        src.ConvertToTree ();
+        return   src.DuplicateFormula (src.theTree, tgt);
+    }
+
+    node<long>* newNode = (node<long>*)checkPointer (new node<long>);
+
+
+    switch (op->opCode) {
+    case HY_OP_CODE_MUL: {
+        node<long>* b1 = InternalDifferentiate (currentSubExpression->go_down(1), varID, varRefs, dydx, tgt),
+                    * b2 = InternalDifferentiate (currentSubExpression->go_down(2), varID, varRefs, dydx, tgt);
+
+        if (!b1 || !b2) {
+            newNode->delete_tree(true);
+            if (b1) {
+                b1->delete_tree (true);
+            }
+            if (b2) {
+                b2->delete_tree (true);
+            }
+            return nil;
+        }
+
+        _String           opC  ('*'),
+                          opC2 ('+');
+
+        _Operation*       newOp  = new _Operation (opC2,2),
+        *         newOp2 = new _Operation (opC ,2),
+        *         newOp3 = new _Operation (opC ,2);
+
+        checkPointer      (newOp);
+        checkPointer      (newOp2);
+        checkPointer      (newOp3);
+
+        node<long>*       newNode2 = (node<long>*)checkPointer(new node<long>);
+        node<long>*       newNode3 = (node<long>*)checkPointer(new node<long>);
+
+        newNode2->add_node (*b1);
+        newNode2->add_node (*DuplicateFormula (currentSubExpression->go_down(2),tgt));
+
+        newNode3->add_node (*b2);
+        newNode3->add_node (*DuplicateFormula (currentSubExpression->go_down(1),tgt));
+
+        newNode->add_node  (*newNode2);
+        newNode->add_node  (*newNode3);
+
+        newNode3->in_object = tgt.theFormula.lLength;
+        tgt.theFormula.AppendNewInstance (newOp3);
+        newNode2->in_object = tgt.theFormula.lLength;
+        tgt.theFormula. AppendNewInstance (newOp2);
+        newNode->in_object = tgt.theFormula.lLength;
+        tgt.theFormula.AppendNewInstance (newOp);
+
+        return          newNode;
+    }
+    break;
+
+    case HY_OP_CODE_ADD: // +
+    case HY_OP_CODE_SUB: { // -
+        node<long>* b1 = InternalDifferentiate (currentSubExpression->go_down(1), varID, varRefs, dydx, tgt),
+                    * b2 = nil;
+
+        if (!b1) {
+            newNode->delete_tree (true);
+            return nil;
+        }
+
+        long      isUnary = (currentSubExpression->get_num_nodes()==1);
+
+        if (!isUnary) {
+            b2 = InternalDifferentiate (currentSubExpression->go_down(2), varID, varRefs, dydx, tgt);
+            if (!b2) {
+                b1->delete_tree      (true);
+                newNode->delete_tree (true);
+                return nil;
+            }
+        }
+
+
+        _Operation*   newOp = new _Operation ();
+        checkPointer  (newOp);
+        newOp->Duplicate (op);
+        newNode->add_node (*b1);
+        if (!isUnary) {
+            newNode->add_node (*b2);
+        }
+        newNode->in_object = tgt.theFormula.lLength;
+
+        tgt.theFormula.AppendNewInstance(newOp);
+        return          newNode;
+    }
+    break;
+
+    case HY_OP_CODE_DIV: { // /
+        node<long>* b1 = InternalDifferentiate (currentSubExpression->go_down(1), varID, varRefs, dydx, tgt),
+                    * b2 = InternalDifferentiate (currentSubExpression->go_down(2), varID, varRefs, dydx, tgt);
+
+        if (!b1 || !b2) {
+            newNode->delete_tree(true);
+            if (b1) {
+                b1->delete_tree (true);
+            }
+            if (b2) {
+                b2->delete_tree (true);
+            }
+            return nil;
+        }
+
+        _String           opC  ('*'),
+                          opC2 ('-'),
+                          opC3 ('/'),
+                          opC4 ('^');
+
+        _Operation*       newOp  = new _Operation (opC3 ,2),
+        *         newOp2 = new _Operation (opC4 ,2),
+        *         newOp3 = new _Operation (opC2 ,2),
+        *         newOp4 = new _Operation (opC  ,2),
+        *         newOp5 = new _Operation (opC  ,2),
+        *         newOp6 = new _Operation (new _Constant (2.0));
+
+        checkPointer      (newOp);
+        checkPointer      (newOp2);
+        checkPointer      (newOp3);
+        checkPointer      (newOp4);
+        checkPointer      (newOp5);
+        checkPointer      (newOp6);
+
+        node<long>*       newNode2 = new node<long>;
+        node<long>*       newNode3 = new node<long>;
+        node<long>*       newNode4 = new node<long>;
+        node<long>*       newNode5 = new node<long>;
+        node<long>*       newNode6 = new node<long>;
+
+        checkPointer      (newNode2);
+        checkPointer      (newNode3);
+        checkPointer      (newNode4);
+        checkPointer      (newNode5);
+        checkPointer      (newNode6);
+
+        newNode6->add_node (*b1);
+        newNode6->add_node (*DuplicateFormula (currentSubExpression->go_down(2),tgt));
+
+        newNode5->add_node (*b2);
+        newNode5->add_node (*DuplicateFormula (currentSubExpression->go_down(1),tgt));
+
+        newNode4->add_node  (*newNode6);
+        newNode4->add_node  (*newNode5);
+
+        newNode2->add_node (*DuplicateFormula (currentSubExpression->go_down(2),tgt));
+        newNode2->add_node (*newNode3);
+
+        newNode->add_node  (*newNode4);
+        newNode->add_node  (*newNode2);
+
+        newNode6->in_object = tgt.theFormula.lLength;
+        tgt.theFormula.AppendNewInstance(newOp5);
+        newNode5->in_object = tgt.theFormula.lLength;
+        tgt.theFormula.AppendNewInstance(newOp4);
+        newNode4->in_object = tgt.theFormula.lLength;
+        tgt.theFormula.AppendNewInstance(newOp3);
+        newNode3->in_object = tgt.theFormula.lLength;
+        tgt.theFormula.AppendNewInstance(newOp6);
+        newNode2->in_object = tgt.theFormula.lLength;
+        tgt.theFormula.AppendNewInstance(newOp2);
+        newNode->in_object = tgt.theFormula.lLength;
+        tgt.theFormula.AppendNewInstance(newOp);
+
+
+        return          newNode;
+    }
+    break;
+
+    case HY_OP_CODE_ARCTAN: { // Arctan
+        node<long>* b1 = InternalDifferentiate (currentSubExpression->go_down(1), varID, varRefs, dydx, tgt);
+
+        if (!b1) {
+            newNode->delete_tree (true);
+            return nil;
+        }
+
+        _String           opC  ('/'),
+                          opC2 ('+'),
+                          opC3 ('^');
+
+        _Operation*       newOp  = new _Operation (opC ,2),
+        *         newOp2 = new _Operation (opC2 ,2),
+        *         newOp3 = new _Operation (new _Constant (1.0)),
+        *         newOp4 = new _Operation (opC3 ,2),
+        *         newOp5 = new _Operation (new _Constant (2.0));
+
+        checkPointer      (newOp);
+        checkPointer      (newOp2);
+        checkPointer      (newOp3);
+        checkPointer      (newOp4);
+
+        node<long>*       newNode2 = new node<long>;
+        node<long>*       newNode3 = new node<long>;
+        node<long>*       newNode4 = new node<long>;
+        node<long>*       newNode5 = new node<long>;
+
+        checkPointer      (newNode2);
+        checkPointer      (newNode3);
+        checkPointer      (newNode4);
+        checkPointer      (newNode5);
+
+        newNode4->add_node (*DuplicateFormula (currentSubExpression->go_down(1),tgt));
+        newNode4->add_node (*newNode5);
+
+        newNode2->add_node (*newNode3);
+        newNode2->add_node (*newNode4);
+
+        newNode->add_node (*b1);
+        newNode->add_node (*newNode2);
+
+        newNode5->in_object = tgt.theFormula.lLength;
+        tgt.theFormula.AppendNewInstance(newOp5);
+        newNode4->in_object = tgt.theFormula.lLength;
+        tgt.theFormula.AppendNewInstance(newOp4);
+        newNode3->in_object = tgt.theFormula.lLength;
+        tgt.theFormula.AppendNewInstance(newOp3);
+        newNode2->in_object = tgt.theFormula.lLength;
+        tgt.theFormula.AppendNewInstance(newOp2);
+        newNode->in_object = tgt.theFormula.lLength;
+        tgt.theFormula.AppendNewInstance(newOp);
+
+        return          newNode;
+    }
+    break;
+
+    case HY_OP_CODE_COS: { // Cos
+        node<long>* b1 = InternalDifferentiate (currentSubExpression->go_down(1), varID, varRefs, dydx, tgt);
+
+        if (!b1) {
+            newNode->delete_tree (true);
+            return nil;
+        }
+
+        _String           opC  ('*'),
+                          opC2 ('-'),
+                          opC3 ("Sin");
+
+        _Operation*       newOp  = new _Operation (opC  ,2),
+        *         newOp2 = new _Operation (opC2 ,1),
+        *         newOp3 = new _Operation (opC3 ,1);
+
+        checkPointer      (newOp);
+        checkPointer      (newOp2);
+        checkPointer      (newOp3);
+
+        node<long>*       newNode2 = new node<long>;
+        node<long>*       newNode3 = new node<long>;
+
+        checkPointer      (newNode2);
+        checkPointer      (newNode3);
+
+        newNode3->add_node (*DuplicateFormula (currentSubExpression->go_down(1),tgt));
+
+        newNode2->add_node (*newNode3);
+
+        newNode->add_node  (*newNode2);
+        newNode->add_node  (*b1);
+
+        newNode3->in_object = tgt.theFormula.lLength;
+        tgt.theFormula << newOp3;
+        newNode2->in_object = tgt.theFormula.lLength;
+        tgt.theFormula << newOp2;
+        newNode->in_object = tgt.theFormula.lLength;
+        tgt.theFormula << newOp;
+
+        DeleteObject    (newOp);
+        DeleteObject    (newOp2);
+        DeleteObject    (newOp3);
+
+        return          newNode;
+    }
+    break;
+
+    case HY_OP_CODE_ERF: { // Erf
+        node<long>* b1 = InternalDifferentiate (currentSubExpression->go_down(1), varID, varRefs, dydx, tgt);
+
+        if (!b1) {
+            newNode->delete_tree (true);
+            return nil;
+        }
+
+        _String           opC  ('*'),
+                          opC2 ('/'),
+                          opC3 ("Exp"),
+                          opC4 ("-"),
+                          opC5 ("^");
+
+        _Operation*       newOp  = new _Operation (opC  ,2),
+        *         newOp2 = new _Operation (opC2 ,2),
+        *         newOp3 = new _Operation (new _Constant (twoOverSqrtPi)),
+        *         newOp4 = new _Operation (opC3 ,1),
+        *         newOp5 = new _Operation (opC4 ,1),
+        *         newOp6 = new _Operation (opC5 ,2),
+        *         newOp7 = new _Operation (new _Constant (2.0));
+
+        checkPointer      (newOp);
+        checkPointer      (newOp2);
+        checkPointer      (newOp3);
+        checkPointer      (newOp4);
+        checkPointer      (newOp5);
+        checkPointer      (newOp6);
+        checkPointer      (newOp7);
+
+        node<long>*       newNode2 = new node<long>;
+        node<long>*       newNode3 = new node<long>;
+        node<long>*       newNode4 = new node<long>;
+        node<long>*       newNode5 = new node<long>;
+        node<long>*       newNode6 = new node<long>;
+        node<long>*       newNode7 = new node<long>;
+
+        checkPointer      (newNode2);
+        checkPointer      (newNode3);
+        checkPointer      (newNode4);
+        checkPointer      (newNode5);
+        checkPointer      (newNode6);
+        checkPointer      (newNode7);
+
+        newNode6->add_node (*DuplicateFormula (currentSubExpression->go_down(1),tgt));
+        newNode6->add_node (*newNode7);
+
+        newNode5->add_node (*newNode6);
+        newNode4->add_node (*newNode5);
+        newNode2->add_node (*newNode4);
+        newNode2->add_node (*newNode3);
+
+        newNode->add_node  (*b1);
+        newNode->add_node  (*newNode2);
+
+        newNode7->in_object = tgt.theFormula.lLength;
+        tgt.theFormula.AppendNewInstance(newOp7);
+        newNode6->in_object = tgt.theFormula.lLength;
+        tgt.theFormula.AppendNewInstance(newOp6);
+        newNode5->in_object = tgt.theFormula.lLength;
+        tgt.theFormula.AppendNewInstance(newOp5);
+        newNode4->in_object = tgt.theFormula.lLength;
+        tgt.theFormula.AppendNewInstance(newOp4);
+        newNode3->in_object = tgt.theFormula.lLength;
+        tgt.theFormula.AppendNewInstance(newOp3);
+        newNode2->in_object = tgt.theFormula.lLength;
+        tgt.theFormula.AppendNewInstance(newOp2);
+        newNode->in_object = tgt.theFormula.lLength;
+        tgt.theFormula.AppendNewInstance(newOp);
+
+        return          newNode;
+    }
+    break;
+
+    case HY_OP_CODE_EXP: // HY_OP_CODE_EXP
+    case HY_OP_CODE_SIN: { // HY_OP_CODE_SIN
+        node<long>* b1 = InternalDifferentiate (currentSubExpression->go_down(1), varID, varRefs, dydx, tgt);
+
+        if (!b1) {
+            newNode->delete_tree (true);
+            return nil;
+        }
+
+        _String           opC  ('*'),
+                          opC2;
+
+        if (op->opCode==HY_OP_CODE_SIN) {
+            opC2 = *(_String*)BuiltInFunctions(HY_OP_CODE_COS);
+        } else {
+            opC2 = *(_String*)BuiltInFunctions(HY_OP_CODE_EXP);
+        }
+
+        _Operation*       newOp  = new _Operation (opC  ,2),
+        *         newOp2 = new _Operation (opC2 ,1);
+
+        checkPointer      (newOp);
+        checkPointer      (newOp2);
+
+        node<long>*       newNode2 = new node<long>;
+
+        checkPointer      (newNode2);
+
+        newNode2->add_node (*DuplicateFormula (currentSubExpression->go_down(1),tgt));
+
+        newNode->add_node  (*newNode2);
+        newNode->add_node  (*b1);
+
+        newNode2->in_object = tgt.theFormula.lLength;
+        tgt.theFormula.AppendNewInstance(newOp2);
+        newNode->in_object = tgt.theFormula.lLength;
+        tgt.theFormula.AppendNewInstance(newOp);
+
+        return           newNode;
+    }
+    break;
+
+    case HY_OP_CODE_LOG: { // Log
+        node<long>* b1 = InternalDifferentiate (currentSubExpression->go_down(1), varID, varRefs, dydx, tgt);
+
+        if (!b1) {
+            newNode->delete_tree (true);
+            return nil;
+        }
+        _String           opC  ('/');
+
+        _Operation*       newOp  = new _Operation (opC  ,2);
+
+        checkPointer      (newOp);
+
+        newNode->add_node  (*b1);
+        newNode->add_node  (*DuplicateFormula (currentSubExpression->go_down(1),tgt));
+
+        newNode->in_object = tgt.theFormula.lLength;
+        tgt.theFormula.AppendNewInstance(newOp);
+
+        return           newNode;
+    }
+    break;
+
+    case HY_OP_CODE_SQRT: { // Sqrt
+        node<long>* b1 = InternalDifferentiate (currentSubExpression->go_down(1), varID, varRefs, dydx, tgt);
+
+        if (!b1) {
+            newNode->delete_tree (true);
+            return nil;
+        }
+
+        _String           opC  ('/'),
+                          opC2 ('*'),
+                          opC3 (*(_String*)BuiltInFunctions(HY_OP_CODE_SQRT));
+
+        _Operation*       newOp  = new _Operation (opC  ,2),
+        *         newOp2 = new _Operation (opC2 ,2),
+        *         newOp3 = new _Operation (opC3 ,1),
+        *         newOp4 = new _Operation (new _Constant (2.0));
+
+        checkPointer      (newOp);
+        checkPointer      (newOp2);
+        checkPointer      (newOp3);
+        checkPointer      (newOp4);
+
+        node<long>*       newNode2 = new node<long>;
+        node<long>*       newNode3 = new node<long>;
+        node<long>*       newNode4 = new node<long>;
+
+        checkPointer      (newNode2);
+        checkPointer      (newNode3);
+        checkPointer      (newNode4);
+
+        newNode3->add_node (*DuplicateFormula (currentSubExpression->go_down(1),tgt));
+
+        newNode2->add_node (*newNode4);
+        newNode2->add_node (*newNode3);
+
+        newNode->add_node  (*b1);
+        newNode->add_node  (*newNode2);
+
+        newNode4->in_object = tgt.theFormula.lLength;
+        tgt.theFormula.AppendNewInstance(newOp4);
+        newNode3->in_object = tgt.theFormula.lLength;
+        tgt.theFormula.AppendNewInstance(newOp3);
+        newNode2->in_object = tgt.theFormula.lLength;
+        tgt.theFormula.AppendNewInstance(newOp2);
+        newNode->in_object = tgt.theFormula.lLength;
+        tgt.theFormula.AppendNewInstance(newOp);
+
+        return          newNode;
+    }
+    break;
+
+    case HY_OP_CODE_TAN: { // Tan
+        node<long>* b1 = InternalDifferentiate (currentSubExpression->go_down(1), varID, varRefs, dydx, tgt);
+
+        if (!b1) {
+            newNode->delete_tree (true);
+            return nil;
+        }
+
+        _String           opC  ('/'),
+                          opC2 ('^'),
+                          opC3 (*(_String*)BuiltInFunctions(HY_OP_CODE_COS));
+
+        _Operation*       newOp  = new _Operation (opC ,2),
+        *         newOp2 = new _Operation (opC2,2),
+        *         newOp3 = new _Operation (new _Constant (2.0)),
+        *         newOp4 = new _Operation (opC3,1);
+
+        checkPointer      (newOp);
+        checkPointer      (newOp2);
+        checkPointer      (newOp3);
+
+        node<long>*       newNode2 = new node<long>;
+        node<long>*       newNode3 = new node<long>;
+        node<long>*       newNode4 = new node<long>;
+
+        checkPointer      (newNode2);
+        checkPointer      (newNode3);
+        checkPointer      (newNode4);
+
+        newNode4->add_node (*DuplicateFormula (currentSubExpression->go_down(1),tgt));
+
+        newNode2->add_node (*newNode4);
+        newNode2->add_node (*newNode3);
+
+        newNode->add_node (*b1);
+        newNode->add_node (*newNode2);
+
+        newNode4->in_object = tgt.theFormula.lLength;
+        tgt.theFormula.AppendNewInstance(newOp4);
+        newNode3->in_object = tgt.theFormula.lLength;
+        tgt.theFormula.AppendNewInstance(newOp3);
+        newNode2->in_object = tgt.theFormula.lLength;
+        tgt.theFormula.AppendNewInstance(newOp2);
+        newNode->in_object = tgt.theFormula.lLength;
+        tgt.theFormula.AppendNewInstance(newOp);
+
+        return          newNode;
+    }
+    break;
+
+    case HY_OP_CODE_POWER: // ^
+        // f[x]^g[x] (g'[x] Log[f[x]] + f'[x]g[x]/f[x])
+    {
+        node<long>* b1 = InternalDifferentiate (currentSubExpression->go_down(1), varID, varRefs, dydx, tgt);
+        if (!b1) {
+            newNode->delete_tree(true);
+            return nil;
+        }
+        node<long>* b2 = InternalDifferentiate (currentSubExpression->go_down(2), varID, varRefs, dydx, tgt);
+        if (!b2) {
+            newNode->delete_tree(true);
+            return nil;
+        }
+        
+        long opCodes[7] = {HY_OP_CODE_MUL, HY_OP_CODE_POWER, HY_OP_CODE_ADD, HY_OP_CODE_DIV, HY_OP_CODE_MUL, HY_OP_CODE_MUL, HY_OP_CODE_LOG};
+        long opArgs [7] = {2,2,2,2,2,2,1};
+
+        node<long> * newNodes [7];
+        newNodes[0] = newNode;
+        for (long k = 1; k < 7; k++) {
+            newNodes[k] = new node <long>;
+        }
+
+        newNodes[6]->add_node (*DuplicateFormula (currentSubExpression->go_down(1),tgt));
+
+        newNodes[5]->add_node (*b2);
+        newNodes[5]->add_node (*newNodes[6]);
+
+        newNodes[4]->add_node (*b1);
+        newNodes[4]->add_node (*DuplicateFormula (currentSubExpression->go_down(2),tgt));
+
+        newNodes[3]->add_node (*newNodes[4]);
+        newNodes[3]->add_node (*DuplicateFormula (currentSubExpression->go_down(1),tgt));
+
+        newNodes[2]->add_node (*newNodes[5]);
+        newNodes[2]->add_node (*newNodes[3]);
+
+        newNodes[1]->add_node (*DuplicateFormula (currentSubExpression->go_down(1),tgt));
+        newNodes[1]->add_node (*DuplicateFormula (currentSubExpression->go_down(2),tgt));
+
+        newNode->add_node  (*newNodes[1]);
+        newNode->add_node  (*newNodes[2]);
+        
+        for (long k = 6; k >=0 ; k--) {
+            newNodes[k]->in_object = tgt.theFormula.lLength;
+            tgt.theFormula .AppendNewInstance (new _Operation (opCodes[k], opArgs[k]));
+        } 
+
+        return          newNode;
+    }
+    }
+
+    delete (newNode);
+    return nil;
+}
+
+//__________________________________________________________________________________
+_FormulaParsingContext::_FormulaParsingContext (_String* err, _VariableContainer* scope) {
+    assignment_ref_id   = -1;
+    assignment_ref_type = HY_STRING_DIRECT_REFERENCE;
+    is_volatile = false;
+    err_msg = err;
+    formula_scope = scope;
+}
+
+//__________________________________________________________________________________
+_String _FormulaParsingContext::contextualizeRef (_String& ref) {
+    if (formula_scope) {
+        return *formula_scope->GetName () & '.' & ref;
+    }
+    return ref;
+}
+
diff --git a/src/core/fstring.cpp b/src/core/fstring.cpp
new file mode 100644
index 0000000..40f0657
--- /dev/null
+++ b/src/core/fstring.cpp
@@ -0,0 +1,888 @@
+/*
+ 
+ HyPhy - Hypothesis Testing Using Phylogenies.
+ 
+ Copyright (C) 1997-now
+ Core Developers:
+ Sergei L Kosakovsky Pond (spond at ucsd.edu)
+ Art FY Poon    (apoon at cfenet.ubc.ca)
+ Steven Weaver (sweaver at ucsd.edu)
+ 
+ Module Developers:
+ Lance Hepler (nlhepler at gmail.com)
+ Martin Smith (martin.audacis at gmail.com)
+ 
+ Significant contributions from:
+ Spencer V Muse (muse at stat.ncsu.edu)
+ Simon DW Frost (sdf22 at cam.ac.uk)
+ 
+ Permission is hereby granted, free of charge, to any person obtaining a
+ copy of this software and associated documentation files (the
+ "Software"), to deal in the Software without restriction, including
+ without limitation the rights to use, copy, modify, merge, publish,
+ distribute, sublicense, and/or sell copies of the Software, and to
+ permit persons to whom the Software is furnished to do so, subject to
+ the following conditions:
+ 
+ The above copyright notice and this permission notice shall be included
+ in all copies or substantial portions of the Software.
+ 
+ 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.
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ 
+ */
+
+#include "defines.h"
+#include "fstring.h"
+#include "constant.h"
+#include "matrix.h"
+#include "calcnode.h"
+
+extern long lastMatrixDeclared;
+extern _AVLListX _HY_GetStringGlobalTypes;
+
+extern _List likeFuncList,
+             batchLanguageFunctionNames,
+             dataSetFilterList,
+             dataSetList,
+             scfgList;
+
+extern _SimpleList modelMatrixIndices;
+extern _String lastModelParameterList;
+
+_String internalRerootTreeID("_INTERNAL_REROOT_TREE_");
+//__________________________________________________________________________________
+_FString::_FString (void)
+{
+    theString = new _String;
+}
+
+//__________________________________________________________________________________
+_FString::~_FString ()
+{
+    if (nInstances<=1) {
+        DeleteObject (theString);
+    } else {
+        nInstances--;
+    }
+
+}
+
+//__________________________________________________________________________________
+_FString::_FString (_String* data)
+{
+    theString = data;
+}
+
+//__________________________________________________________________________________
+_FString::_FString (long inData)
+{
+    checkPointer (theString = new _String (inData));
+}
+
+//__________________________________________________________________________________
+_FString::_FString (_String& data, bool meta)
+{
+    if (meta) {
+        unsigned long ssi = _String::storageIncrement;
+
+        if (data.sLength>ssi) {
+            _String::storageIncrement = data.sLength;
+        }
+
+        theString = new _String (data.sLength,true);
+        for (unsigned long k=0; k<data.sLength; k++) {
+            char c = data.sData[k];
+            if (c=='\\') {
+                if (k<data.sLength-1) {
+                    c = data.sData[k+1];
+                    switch (c) {
+                    case 'n':
+                        (*theString)<<'\n';
+                        break;
+                    case 't':
+                        (*theString)<<'\t';
+                        break;
+                    case '\\':
+                        (*theString)<<'\\';
+                        break;
+                    default:
+                        (*theString)<<'\\';
+                        (*theString)<<c;
+                    }
+                    k++;
+                    continue;
+                }
+            }
+            (*theString)<<c;
+        }
+        _String::storageIncrement = ssi;
+        theString->Finalize();
+    } else {
+        theString = new _String (data);
+    }
+}
+
+//__________________________________________________________________________________
+BaseRef _FString::makeDynamic (void)
+{
+    //_FString* res = new _FString;
+    //res->theString->Duplicate(theString);
+    return new _FString(*theString, false);
+}
+
+//__________________________________________________________________________________
+void _FString::Duplicate (BaseRef o)
+{
+    DeleteObject (theString);
+    _FString* m = (_FString*)o;
+    theString = (_String*)m->theString->makeDynamic();
+}
+
+//__________________________________________________________________________________
+_PMathObj _FString::Add (_PMathObj p)
+{
+    if (p->ObjectClass()==STRING) {
+        _FString* theStr = (_FString*)p;
+        _String * res    = new _String (theString->sLength+theStr->theString->sLength,true);
+        if (res) {
+            (*res) << theString;
+            (*res) << theStr->theString;
+            res->Finalize();
+            return new _FString (res);
+        } else {
+            checkPointer (nil);
+        }
+    }
+    _String* convStr = (_String*)p->toStr();
+    _String res (*theString& *((_String*)convStr));
+    DeleteObject (convStr);
+    return new _FString (res, false);
+}
+
+//__________________________________________________________________________________
+long _FString::AddOn (_PMathObj p)
+{
+    if (p->ObjectClass()==STRING) {
+        _FString* theStr = (_FString*)p;
+        (*theString) << theStr->theString;
+        return theStr->theString->sLength;
+    } else if (p->ObjectClass()==NUMBER) {
+        long s = p->Value();
+        if (s) {
+            delete theString;
+            checkPointer (theString = new _String (s, true));
+            return s;
+        } else {
+            theString->Finalize();
+        }
+    } else {
+        WarnError ("Invalid 2nd argument in call to string*number");
+    }
+    return 0;
+}
+
+//__________________________________________________________________________________
+_PMathObj _FString::AreEqual (_PMathObj p)
+{
+    if (p->ObjectClass()==STRING) {
+        _FString* theStr = (_FString*)p;
+        bool     equal = theString->Equal(theStr->theString);
+        return new _Constant ((_Parameter)equal);
+    } else {
+        /*_String* convStr = (_String*)p->toStr();
+         bool     equal = theString->Equal(convStr);
+         DeleteObject (convStr);
+         return new _Constant ((_Parameter)equal);*/
+         return new HY_CONSTANT_FALSE;
+    }
+}
+
+//__________________________________________________________________________________
+_PMathObj _FString::AreEqualCIS (_PMathObj p)
+{
+    if (p->ObjectClass()==STRING) {
+        _FString* theStr = (_FString*)p;
+        _String   t1 (*theString),
+                  t2 (*theStr->theString);
+        t1.UpCase();
+        t2.UpCase();
+        bool     equal = t1.Equal(&t2);
+        return new _Constant ((_Parameter)equal);
+    } else {
+        return AreEqual (p);
+    }
+}
+
+//__________________________________________________________________________________
+_PMathObj _FString::Join (_PMathObj p)
+{
+    _List theStrings;
+
+    if (p->ObjectClass()==MATRIX) {
+        ((_Matrix*)(p->Compute()))->FillInList (theStrings,true);
+    } else if (p->ObjectClass()==ASSOCIATIVE_LIST) {
+        ((_AssociativeList*)(p->Compute()))->FillInList (theStrings);
+    }
+
+    return new _FString((_String*)theStrings.Join(theString));
+}
+
+//__________________________________________________________________________________
+_PMathObj _FString::EqualAmb (_PMathObj p)
+{
+    if (p->ObjectClass()==STRING) {
+        _FString* theStr = (_FString*)p;
+        bool     equal = theString->EqualWithWildChar(theStr->theString);
+        return new _Constant ((_Parameter)equal);
+    } else {
+        _String  convStr      ((_String*)p->toStr());
+        return   new _Constant(theString->EqualWithWildChar(&convStr));
+    }
+}
+
+//__________________________________________________________________________________
+
+_PMathObj _FString::EqualRegExp (_PMathObj p, bool matchAll)
+{
+    if (p->ObjectClass()==STRING) {
+        _FString* theStr = (_FString*)p;
+        _SimpleList matches;
+
+        if (matchAll) {
+            int errNo = 0;
+            Ptr regex = PrepRegExp (theStr->theString, errNo, true);
+            if (regex) {
+                theString->RegExpMatchAll(regex, matches);
+                FlushRegExp (regex);
+            } else {
+                WarnError (GetRegExpError (errNo));
+            }
+        } else {
+            theString->RegExpMatchOnce(theStr->theString, matches, true, true);
+        }
+
+        if (matches.lLength == 0) {
+            matches << -1;
+            matches << -1;
+        }
+        _Matrix * res = new _Matrix (matches);
+        res->Transpose();
+        return res;
+    } else {
+        WarnError ("Invalid 2nd argument in call to string$reg.exp.");
+        return new _Matrix (2,1,false,true);
+    }
+}
+
+//__________________________________________________________________________________
+_PMathObj _FString::ReplaceReqExp (_PMathObj p)
+{
+    if (theString && theString->sLength) {
+        if (p->ObjectClass()==MATRIX) {
+            _Matrix * m = (_Matrix*)p;
+
+            if (m->IsAStringMatrix() && m->GetHDim() * m->GetVDim() >= 2) {
+                _FString* theStr  = (_FString*)m->GetFormula(0,0)->Compute(),
+                          * repWith = (_FString*)m->GetFormula(1,-1)->Compute();
+
+                _SimpleList matches;
+
+                int errNo = 0;
+                Ptr regex = PrepRegExp (theStr->theString, errNo, true);
+
+                if (!regex) {
+                    WarnError (GetRegExpError (errNo));
+                    return new _FString (empty);
+                }
+
+                theString->RegExpMatchAll(regex, matches);
+                _FString * res;
+                if (matches.lLength) {
+                    _String * newString = new _String (theString->sLength+1,true);
+                    checkPointer (newString);
+                    long      idx  = matches.lData[0],
+                              midx = 0;
+
+                    for (long k=0; k<theString->sLength;) {
+                        if (k==idx) {
+                            (*newString) << repWith->theString;
+                            k = matches.lData[midx+1]+1;
+                            midx += 2;
+                            if (midx == matches.lLength) {
+                                idx = -1;
+                            } else {
+                                idx = matches.lData[midx];
+                            }
+                        } else {
+                            (*newString) << theString->sData[k++];
+                        }
+                    }
+                    newString->Finalize();
+                    res = new _FString (newString);
+                } else {
+                    res = new _FString (*theString,false);
+                }
+
+                FlushRegExp (regex);
+                return res;
+            }
+        }
+
+        WarnError ("Invalid 2nd argument in call to string^{{pattern,replacement}}");
+    }
+    return new _FString (empty,false);
+}
+
+//__________________________________________________________________________________
+_PMathObj _FString::NotEqual (_PMathObj p)
+{
+    if (p->ObjectClass()==STRING) {
+        _FString* theStr = (_FString*)p;
+        bool     equal = theString->Equal(theStr->theString);
+        return new _Constant ((_Parameter)!equal);
+    } else {
+        //_String* convStr = (_String*)p->toStr();
+        //bool     equal = theString->Equal(convStr);
+        //DeleteObject (convStr);
+        //return new _Constant ((_Parameter)!equal);
+        return new HY_CONSTANT_TRUE;
+    }
+}
+
+//__________________________________________________________________________________
+_PMathObj _FString::Less (_PMathObj p)
+{
+    if (p->ObjectClass()==STRING) {
+        _FString* theStr = (_FString*)p;
+        bool     equal = theString->Less(theStr->theString);
+        return new _Constant ((_Parameter)equal);
+    } else {
+        _String* convStr = (_String*)p->toStr();
+        bool     equal = theString->Less(convStr);
+        DeleteObject (convStr);
+        return new _Constant ((_Parameter)equal);
+    }
+}
+
+//__________________________________________________________________________________
+_PMathObj _FString::LessEq (_PMathObj p)
+{
+    if (p->ObjectClass()==STRING) {
+        _FString* theStr = (_FString*)p;
+        bool     equal = theString->Less(theStr->theString)||theString->Equal(theStr->theString);
+        return new _Constant ((_Parameter)equal);
+    } else {
+        _String* convStr = (_String*)p->toStr();
+        bool     equal = theString->Less(convStr)||theString->Equal(convStr);
+        DeleteObject (convStr);
+        return new _Constant ((_Parameter)equal);
+    }
+}
+
+//__________________________________________________________________________________
+_PMathObj _FString::Differentiate (_PMathObj p)
+{
+    _Formula F;
+
+    _String  *X,
+             *DFDX = nil;
+
+    bool     deleteX = false;
+
+    if (p->ObjectClass()==STRING) {
+        X = ((_FString*)p)->theString;
+    } else {
+        deleteX = true;
+        X = (_String*)p->toStr();
+    }
+
+    _String copyMe (*theString);
+    _FormulaParsingContext fpc;
+    if (Parse (&F,copyMe, fpc, nil) == HY_FORMULA_EXPRESSION) {
+        _Formula *DF = F.Differentiate (*X,true);
+        if (DF) {
+            DFDX = (_String*)DF->toStr();
+        }
+
+    }
+
+    if (deleteX) {
+        DeleteObject (X);
+    }
+
+    return new _FString (DFDX?DFDX:new _String());
+
+}
+
+//__________________________________________________________________________________
+_PMathObj _FString::GreaterEq (_PMathObj p)
+{
+    if (p->ObjectClass()==STRING) {
+        _FString* theStr = (_FString*)p;
+        bool     equal = theString->Greater(theStr->theString)||theString->Equal(theStr->theString);
+        return new _Constant ((_Parameter)equal);
+    } else {
+        _String* convStr = (_String*)p->toStr();
+        bool     equal = theString->Greater(convStr)||theString->Equal(convStr);
+        DeleteObject (convStr);
+        return new _Constant ((_Parameter)equal);
+    }
+}
+
+//__________________________________________________________________________________
+_PMathObj _FString::Greater (_PMathObj p)
+{
+    if (p->ObjectClass()==STRING) {
+        _FString* theStr = (_FString*)p;
+        bool     equal = theString->Greater(theStr->theString);
+        return new _Constant ((_Parameter)equal);
+    } else {
+        _String* convStr = (_String*)p->toStr();
+        bool     equal = theString->Greater(convStr);
+        DeleteObject (convStr);
+        return new _Constant ((_Parameter)equal);
+    }
+}
+
+//__________________________________________________________________________________
+BaseRef  _FString::toStr()
+{
+    theString->nInstances++;
+    return theString;
+}
+
+//__________________________________________________________________________________
+_PMathObj _FString::RerootTree (void)
+{
+    long     stashedModelID = lastMatrixDeclared,
+             totalNodeCount = 0;
+
+    lastMatrixDeclared      = HY_NO_MODEL;
+    /* unset current model; do not want the internal tree to have an attached model */
+
+    _TheTree    rTree (internalRerootTreeID,*theString);
+
+    if (rTree.IsDegenerate()) { // no need to reroot two-sequence trees
+        lastMatrixDeclared = stashedModelID;
+        DeleteVariable  (internalRerootTreeID);
+        return new _FString (*theString, false);
+    }
+
+    if (terminateExecution) {
+        lastMatrixDeclared = stashedModelID;
+        DeleteVariable  (internalRerootTreeID);
+        return new _FString;
+    }
+
+    _CalcNode   *iterator = rTree.DepthWiseTraversal (true),
+                 *rerootAt;
+
+    node<long>  *cNode;
+
+    _GrowingVector  valueCache;
+
+    while       (iterator)
+        // count the number of descendants of a given node, store as numeric value of the CalcNode
+    {
+        cNode    = &rTree.GetCurrentNode();
+        valueCache.Store(iterator->Value());
+        if (long myNodeCount = cNode->get_num_nodes()) {
+            _Parameter tNodeCount = 0.0;
+
+            for (long k = 1; k <= myNodeCount; k++) {
+                tNodeCount += ((_CalcNode*)LocateVar(cNode->go_down(k)->in_object))->Value();
+            }
+
+            iterator->SetNumericValue(tNodeCount+1.0);
+        } else {
+            iterator->SetNumericValue(1.0);
+        }
+
+        iterator = rTree.DepthWiseTraversal (false);
+        totalNodeCount ++;
+    }
+
+    iterator = rTree.DepthWiseTraversal (true);
+
+    long        maxMin = 0;
+    _Parameter  bRatio  = 0.0;
+
+    while       (iterator) {
+        _Parameter      nodeMin   = totalNodeCount-iterator->Value(),
+                        thisRatio = nodeMin/(_Parameter)iterator->Value();
+
+        if (thisRatio>1.0) {
+            thisRatio = 1./thisRatio;
+        }
+
+        cNode    = &rTree.GetCurrentNode();
+        if (cNode->get_num_nodes()) {
+            for (long k = cNode->get_num_nodes(); k; k--) {
+                long tt = ((_CalcNode*)LocateVar(cNode->go_down(k)->in_object))->Value();
+                if (tt<nodeMin) {
+                    nodeMin = tt;
+                }
+            }
+        } else {
+            nodeMin = 1;
+        }
+
+        if ((nodeMin>maxMin)||((nodeMin==maxMin)&&(thisRatio>bRatio))) {
+            bRatio = thisRatio;
+            maxMin = nodeMin;
+            rerootAt = iterator;
+            if (!cNode->get_parent()) {
+                rerootAt = nil;
+            }
+        }
+        iterator = rTree.DepthWiseTraversal (false);
+    }
+
+    iterator        = rTree.DepthWiseTraversal (true);
+    totalNodeCount  = 0;
+    while       (iterator)
+        // restore branch lengths
+    {
+        iterator->SetNumericValue(valueCache.theData[totalNodeCount]);
+        iterator = rTree.DepthWiseTraversal (false);
+        totalNodeCount ++;
+    }
+
+    _FString* res;
+    if (rerootAt) {
+        _String stringCopy = *rerootAt->GetName();
+        stringCopy.Trim (stringCopy.FindBackwards ('.',0,-1)+1,-1);
+        _FString    rAt  (stringCopy);
+        res = (_FString*)rTree.RerootTree (&rAt);
+    } else {
+        res = new _FString (*theString, false);
+    }
+
+    DeleteVariable  (internalRerootTreeID);
+    lastMatrixDeclared = stashedModelID;
+
+    return      res;
+}
+
+//__________________________________________________________________________________
+
+_PMathObj _FString::Evaluate (_hyExecutionContext* context)
+{
+    if (theString && theString->sLength) {
+        _String     s (*theString);
+        _Formula    evaluator (s, (_VariableContainer*)context->GetContext());
+        _PMathObj   evalTo = evaluator.Compute(0,(_VariableContainer*)context->GetContext());
+
+        if (evalTo && !terminateExecution) {
+            evalTo->AddAReference();
+            return evalTo;
+        }
+    }
+    return new _Constant (.0);
+}
+
+//__________________________________________________________________________________
+
+_PMathObj _FString::Dereference(bool ignore_context, _hyExecutionContext* context, bool return_variable_ref) {
+    _String referencedVariable = *theString;
+    if (!ignore_context && context) {
+        referencedVariable = AppendContainerName(referencedVariable, (_VariableContainer *)context->GetContext());
+    }
+    if (return_variable_ref) {
+        return FetchVar (LocateVarByName(referencedVariable));
+    }
+    _PMathObj result = FetchObjectFromVariableByType(&referencedVariable, HY_ANY_OBJECT); 
+    //printf ("\n\nDereferencing %s in this context %x\n\n", referencedVariable.sData, context);
+    if (!result) {
+        _String errM = _String("Failed to dereference '") & referencedVariable & "'";
+        if (context) {
+            context->ReportError(errM);
+        } else {
+            WarnError (errM);
+        }
+        result = new _FString;
+    } else {
+        result->AddAReference();
+    }
+    return result;
+}
+
+//__________________________________________________________________________________
+
+
+_PMathObj _FString::Execute (long opCode, _PMathObj p, _PMathObj p2, _hyExecutionContext* context)   // execute this operation with the second arg if necessary
+{
+    switch (opCode) {
+    case HY_OP_CODE_NOT: // !
+        return FileExists();
+    case HY_OP_CODE_NEQ: // !=
+        return NotEqual(p);
+        break;
+    case HY_OP_CODE_IDIV: // $ match regexp
+        return EqualRegExp(p);
+        break;
+    case HY_OP_CODE_MOD: // % equal case insenstive
+        return AreEqualCIS(p);
+        break;
+    case HY_OP_CODE_AND: { // && upcase or lowercase
+        _Parameter pVal = 0.0;
+        if (p->ObjectClass () == NUMBER) {
+            pVal = p->Value();
+        }
+
+        if (pVal < 0.0) {
+            return (_PMathObj)makeDynamic();
+        } else {
+            _String * t = nil;
+
+
+            if (CheckEqual(pVal,2.0) || CheckEqual(pVal,3.0) || CheckEqual(pVal,4.0) || CheckEqual(pVal,5.0) || CheckEqual(pVal,6.0)) {
+                checkPointer (t = new _String (theString->sLength+1,true));
+                t->EscapeAndAppend (*theString, CheckEqual(pVal,3.0) + 2*CheckEqual(pVal,4.0) + 4*CheckEqual(pVal,5.0) + 5*CheckEqual(pVal,6.0));
+                t->Finalize();
+            } else {
+                t = new _String (*theString);
+                checkPointer (t);
+                if (CheckEqual(pVal,1.0)) {
+                    t->UpCase();
+                } else {
+                    t->LoCase();
+                }
+            }
+
+            return new _FString (t);
+        }
+    }
+    break;
+    case HY_OP_CODE_MUL: // *
+        if (p) {
+         // NOT a dereference
+            if (p->ObjectClass() == MATRIX) {
+                return      MapStringToVector (p);
+            } else {
+                return new _Constant(AddOn(p));
+            }
+        } else {
+            return Dereference(false, context);
+        }
+        break;
+    case HY_OP_CODE_ADD: // +
+        if (p) {
+            return Add(p);
+        } else {
+            return Sum();
+        }
+        break;
+    case HY_OP_CODE_DIV: // /
+        return EqualAmb(p);
+        break;
+    case HY_OP_CODE_LESS: // <
+        return Less(p);
+        break;
+    case HY_OP_CODE_LEQ: // <=
+        return LessEq(p);
+        break;
+    case HY_OP_CODE_EQ: // ==
+        return AreEqual(p);
+        break;
+    case HY_OP_CODE_GREATER: // >
+        return Greater(p);
+        break;
+    case HY_OP_CODE_GEQ: // >=
+        return GreaterEq(p);
+        break;
+    case HY_OP_CODE_ABS: // Abs
+        return new _Constant (theString->sLength);
+        break;
+    case HY_OP_CODE_DIFF: // Differentiate
+        return Differentiate(p);
+        break;
+    case HY_OP_CODE_EVAL: // Eval
+        return Evaluate(context);
+        break;
+    case HY_OP_CODE_EXP: // Exp
+        return new _Constant (theString->LempelZivProductionHistory(nil));
+        break;
+    case HY_OP_CODE_FORMAT: { // Format
+        _String cpyString (*theString);
+        _Formula f (cpyString);
+        _PMathObj fv = f.Compute();
+        if (fv && fv->ObjectClass () == NUMBER) {
+            return ((_Constant*)fv)->FormatNumberString (p,p2);
+        } else {
+            ReportWarning (_String("Failed to evaluate ")& *theString & " to a number in call to Format (string...)");
+            return new _FString();
+        }
+    }
+    break;
+    case HY_OP_CODE_INVERSE: { // Inverse
+        _FString * res = new _FString (*theString, false);
+        checkPointer (res);
+        for (long i1 = 0, i2 = theString->sLength-1; i1<theString->sLength; i1++, i2--) {
+            res->theString->sData[i1] = theString->sData[i2];
+        }
+
+        return res;
+    }
+    break;
+    case HY_OP_CODE_JOIN: // Inverse
+        return Join (p);
+
+    case HY_OP_CODE_LOG: // Log - check sum
+        return new _Constant (theString->Adler32());
+    case HY_OP_CODE_MACCESS: // MAccess
+        return CharAccess(p,p2);
+        break;
+    case HY_OP_CODE_REROOTTREE: // RerootTree
+        return RerootTree ();
+        break;
+    case HY_OP_CODE_ROWS: // Count Objects of given type
+        return CountGlobalObjects();
+        break;
+    case HY_OP_CODE_TYPE: // Type
+        return Type();
+        break;
+    case HY_OP_CODE_POWER: // Replace (^)
+        if (p)
+            return ReplaceReqExp (p);
+        return Dereference(true, context);
+        break;
+    case HY_OP_CODE_OR: // Match all instances of the reg.ex (||)
+        return EqualRegExp (p, true);
+        break;
+    }
+
+    WarnNotDefined (this, opCode,context);
+    return new _FString;
+
+}
+
+//__________________________________________________________________________________
+_PMathObj   _FString::MapStringToVector (_PMathObj p)
+{
+    if (theString->sLength && p->ObjectClass () == MATRIX) {
+        _Matrix         * factoringMatrix = (_Matrix *)p;
+
+        if (factoringMatrix->IsAVector () && factoringMatrix->IsAStringMatrix()) {
+            long            mapper [255],
+                            keys    = factoringMatrix->GetHDim() * factoringMatrix->GetVDim(),
+                            byRows   = factoringMatrix->IsAVector (HY_MATRIX_COLUMN_VECTOR);
+
+            for (long c = 0; c < 255; c++) {
+                mapper[c] = -1;
+            }
+
+            for (long r = 0; r < keys; r++) {
+                _FString* aKey = (_FString*)factoringMatrix->GetFormula(byRows?r:0,byRows?0:r)->Compute();
+                if (aKey->theString->sLength == 1) {
+                    unsigned char thisChar = aKey->theString->sData[0];
+                    if (mapper[thisChar] < 0) {
+                        mapper[thisChar] = r;
+                    }
+                }
+            }
+
+            _SimpleList mapped;
+            for (long s = 0; s < theString->sLength; s++) {
+                mapped << mapper[(unsigned char)theString->sData[s]];
+            }
+
+            return new _Matrix (mapped);
+        }
+    }
+
+    return new _Matrix;
+}
+
+//__________________________________________________________________________________
+_PMathObj   _FString::CharAccess (_PMathObj p,_PMathObj p2)
+{
+    unsigned long index = p->Value();
+    _String res;
+
+    if (p2) {
+        unsigned long index2 = p2->Value();
+        res = theString->Cut (index,index2);
+    } else if (index<theString->sLength) {
+        res = theString->sData[index];
+    }
+
+    return new _FString (res);
+}
+//__________________________________________________________________________________
+_PMathObj   _FString::FileExists (void)
+{
+    _Constant  * retValue = new _Constant (0.0);
+    if (theString) {
+        _String cpy (*theString);
+        cpy.ProcessFileName();
+        FILE * test = doFileOpen (cpy, "rb");
+        if (test) {
+            retValue->SetValue (1.0);
+            fclose (test);
+        }
+    }
+    return retValue;
+}
+
+//__________________________________________________________________________________
+_PMathObj   _FString::CountGlobalObjects (void)
+{
+    _Parameter res = 0.0;
+
+    long      standardType = _HY_GetStringGlobalTypes.Find(theString);
+    if (standardType >=0 ) {
+        standardType = _HY_GetStringGlobalTypes.GetXtra (standardType);
+    }
+
+    switch (standardType) {
+    case HY_BL_LIKELIHOOD_FUNCTION:
+        return new _Constant (likeFuncList.lLength);
+    case HY_BL_DATASET:
+        return new _Constant (dataSetList.lLength);
+    case HY_BL_DATASET_FILTER:
+        return new _Constant (dataSetFilterList.lLength);
+    case HY_BL_HBL_FUNCTION:
+        return new _Constant (batchLanguageFunctionNames.lLength);
+    case HY_BL_TREE: {
+        _SimpleList tc;
+        long        si,
+                    vi = variableNames.Traverser (tc,si,variableNames.GetRoot());
+
+        for (; vi >= 0; vi = variableNames.Traverser (tc,si))
+            if (((_Variable*)FetchVar(vi))->ObjectClass () == TREE) {
+                res += 1.;
+            }
+
+        break;
+    }
+
+    case HY_BL_SCFG:
+        return new _Constant (scfgList.lLength);
+    case HY_BL_VARIABLE:
+        return new _Constant (variableNames.countitems());
+
+    }
+
+    if (standardType < 0) {
+        if ((*theString)==lastModelParameterList) {
+            if (lastMatrixDeclared>=0) {
+                _SimpleList p;
+                _Variable *theM = LocateVar (modelMatrixIndices.lData[lastMatrixDeclared]);
+                {
+                    _AVLList pA (&p);
+                    theM->ScanForVariables (pA,false);
+                    pA.ReorderList();
+                }
+                res = p.lLength;
+            }
+        }
+    }
+    return new _Constant (res);
+}
diff --git a/src/core/include/_hyExecutionContext.h b/src/core/include/_hyExecutionContext.h
new file mode 100644
index 0000000..29c2e84
--- /dev/null
+++ b/src/core/include/_hyExecutionContext.h
@@ -0,0 +1,65 @@
+/*
+
+HyPhy - Hypothesis Testing Using Phylogenies.
+
+Copyright (C) 1997-now
+Core Developers:
+  Sergei L Kosakovsky Pond (spond at ucsd.edu)
+  Art FY Poon    (apoon at cfenet.ubc.ca)
+  Steven Weaver (sweaver at ucsd.edu)
+  
+Module Developers:
+	Lance Hepler (nlhepler at gmail.com)
+	Martin Smith (martin.audacis at gmail.com)
+
+Significant contributions from:
+  Spencer V Muse (muse at stat.ncsu.edu)
+  Simon DW Frost (sdf22 at cam.ac.uk)
+
+Permission is hereby granted, free of charge, to any person obtaining a
+copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be included
+in all copies or substantial portions of the Software.
+
+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.
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+*/
+
+#ifndef _HYEXECUTIONCONTEXT_
+#define _HYEXECUTIONCONTEXT_
+//#pragma once
+
+#include "baseobj.h"
+class _String;
+class _VariableContainer;
+
+//__________________________________________________________________________________
+
+class _hyExecutionContext {
+
+  _VariableContainer* contextSpec;
+  _String           * errMsg;
+
+public:
+                      _hyExecutionContext                   (_VariableContainer * = nil, _String* = nil);
+  _VariableContainer* GetContext                            (void);
+  void                ReportError                           (_String);
+  _String           * GetErrorBuffer                        (void);
+  
+};
+
+extern    _hyExecutionContext *_hyDefaultExecutionContext;
+
+#endif
diff --git a/src/core/include/alignment.h b/src/core/include/alignment.h
new file mode 100644
index 0000000..55095e6
--- /dev/null
+++ b/src/core/include/alignment.h
@@ -0,0 +1,50 @@
+
+#include "baseobj.h"
+#include "likefunc.h"
+#include "matrix.h"
+#include "simplelist.h"
+
+double AlignStrings( char * r_str
+                   , char * q_str
+                   , char * & r_res
+                   , char * & q_res
+                   , long * char_map
+                   , double * cost_matrix
+                   , const long cost_stride
+                   , const char gap
+                   , double open_insertion
+                   , double extend_insertion
+                   , double open_deletion
+                   , double extend_deletion
+                   , double miscall_cost
+                   , const bool do_local
+                   , const bool do_affine
+                   , const bool do_codon
+                   , const long char_count
+                   , double * codon3x5
+                   , double * codon3x4
+                   , double * codon3x2
+                   , double * codon3x1
+                   , const bool do_true_local = false
+                   );
+
+_Parameter LinearSpaceAlign( _String * s1           // first string
+                           , _String * s2           // second string
+                           , _SimpleList & cmap     // char -> position in scoring matrix mapper
+                           , _Matrix * ccost        // NxN matrix of edit distances on characters
+                           , _Parameter gopen       // the cost of opening a gap in sequence 1
+                           , _Parameter gextend     // the cost of extending a gap in sequence 1 (ignored unless doAffine == true)
+                           , _Parameter gopen2      // the cost of opening a gap in sequence 2
+                           , _Parameter gextend2    // the cost of opening a gap in sequence 2   (ignored unless doAffine == true)
+                           , bool doLocal           // ignore prefix and suffix gaps
+                           , bool doAffine          // use affine gap penalties
+                           , _SimpleList & ops      // edit operations for the optimal alignment
+                           , _Parameter scoreCheck  // check the score of the alignment
+                           , long from1
+                           , long to1
+                           , long from2
+                           , long to2
+                           , _Matrix ** buffer      // matrix storage,
+                           , char parentGapLink
+                           , char * ha
+                           );
diff --git a/src/core/include/avllist.h b/src/core/include/avllist.h
new file mode 100644
index 0000000..85df50f
--- /dev/null
+++ b/src/core/include/avllist.h
@@ -0,0 +1,109 @@
+/*
+
+HyPhy - Hypothesis Testing Using Phylogenies.
+
+Copyright (C) 1997-now
+Core Developers:
+  Sergei L Kosakovsky Pond (spond at ucsd.edu)
+  Art FY Poon    (apoon at cfenet.ubc.ca)
+  Steven Weaver (sweaver at ucsd.edu)
+  
+Module Developers:
+	Lance Hepler (nlhepler at gmail.com)
+	Martin Smith (martin.audacis at gmail.com)
+
+Significant contributions from:
+  Spencer V Muse (muse at stat.ncsu.edu)
+  Simon DW Frost (sdf22 at cam.ac.uk)
+
+Permission is hereby granted, free of charge, to any person obtaining a
+copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be included
+in all copies or substantial portions of the Software.
+
+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.
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+*/
+
+#ifndef _AVLLIST_
+#define _AVLLIST_
+//#pragma once
+#include "simplelist.h"
+
+#define  MEMORYSTEP 8
+
+//_____________________________________________________________________________
+class _AVLList: public BaseObj
+{
+
+    public:
+
+        //Data Members
+        _SimpleList *dataList,
+                    leftChild,
+                    rightChild,
+                    balanceFactor,
+                    emptySlots;
+
+        long root;
+
+        //Methods
+        _AVLList(_SimpleList*);
+
+        virtual ~_AVLList(void){}
+        virtual void Clear(bool = false);
+        virtual bool HasData(long);
+
+        virtual void ReorderList(_SimpleList* = nil);
+        virtual long InsertData(BaseRef, long, bool);
+        virtual BaseRef toStr(void);
+        virtual long Traverser(_SimpleList&, long &, long = -1);
+        virtual long GetRoot(void){return root;}
+        virtual void DeleteXtra(long){};
+        virtual void DeleteAll(bool cL){
+            Clear(cL);        
+            DeleteObject(dataList);
+        }
+
+        unsigned long countitems(void);
+
+        // 20100623: a shortcut function to look for integers only
+        // avoids calling ::Compare
+
+        long Find(BaseRef);
+        long Find(BaseRef,_SimpleList&);
+        long FindLong(long);
+        char FindBest(BaseRef, long&);
+
+        long Next(long,_SimpleList&);
+        long Prev(long,_SimpleList&);
+        long First(void);
+        long Last(void);
+
+        long GetByIndex(const long);
+
+        // the 1st bool flag is to say whether to dup the object being inserted
+        // the 2nd bool flag (if the first flag is false) if set to true,
+        // will cause failed inserts (key already exists) to delete the key
+        long Insert(BaseRef,long = 0,bool=true,bool=false);
+
+        BaseRef Retrieve(long);
+
+        void Delete(BaseRef,bool=false);
+        void ConsistencyCheck(void);
+
+};
+
+#endif
diff --git a/src/core/include/avllistx.h b/src/core/include/avllistx.h
new file mode 100644
index 0000000..6af9447
--- /dev/null
+++ b/src/core/include/avllistx.h
@@ -0,0 +1,79 @@
+/*
+
+HyPhy - Hypothesis Testing Using Phylogenies.
+
+Copyright (C) 1997-now
+Core Developers:
+  Sergei L Kosakovsky Pond (spond at ucsd.edu)
+  Art FY Poon    (apoon at cfenet.ubc.ca)
+  Steven Weaver (sweaver at ucsd.edu)
+  
+Module Developers:
+	Lance Hepler (nlhepler at gmail.com)
+	Martin Smith (martin.audacis at gmail.com)
+
+Significant contributions from:
+  Spencer V Muse (muse at stat.ncsu.edu)
+  Simon DW Frost (sdf22 at cam.ac.uk)
+
+Permission is hereby granted, free of charge, to any person obtaining a
+copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be included
+in all copies or substantial portions of the Software.
+
+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.
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+*/
+
+#ifndef _AVLLISTX_
+#define _AVLLISTX_
+//#pragma once
+#include "list.h"
+#include "avllist.h"
+
+#define  MEMORYSTEP 8
+
+//_____________________________________________________________________________
+
+class _AVLListX: public _AVLList
+{
+
+    public:
+        /* SLKP: 20090817
+            add key: index values from the list of strings
+         */
+
+        //Data Members
+        _SimpleList xtraD;
+
+        //Methods
+        _AVLListX(_SimpleList*);
+
+        virtual ~_AVLListX(void){}
+        virtual BaseRef toStr(void);
+
+        virtual void Clear(bool = false);
+        virtual void DeleteXtra(long);
+        virtual void PopulateFromList(_List&);
+
+        virtual long InsertData(BaseRef, long, bool);
+        virtual long UpdateValue (BaseRef, long, long);
+
+        void        SetXtra(long,long);
+        long        GetXtra(long);
+
+};
+
+#endif
diff --git a/src/core/include/avllistxl.h b/src/core/include/avllistxl.h
new file mode 100644
index 0000000..ff51006
--- /dev/null
+++ b/src/core/include/avllistxl.h
@@ -0,0 +1,76 @@
+/*
+
+HyPhy - Hypothesis Testing Using Phylogenies.
+
+Copyright (C) 1997-now
+Core Developers:
+  Sergei L Kosakovsky Pond (spond at ucsd.edu)
+  Art FY Poon    (apoon at cfenet.ubc.ca)
+  Steven Weaver (sweaver at ucsd.edu)
+  
+Module Developers:
+	Lance Hepler (nlhepler at gmail.com)
+	Martin Smith (martin.audacis at gmail.com)
+
+Significant contributions from:
+  Spencer V Muse (muse at stat.ncsu.edu)
+  Simon DW Frost (sdf22 at cam.ac.uk)
+
+Permission is hereby granted, free of charge, to any person obtaining a
+copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be included
+in all copies or substantial portions of the Software.
+
+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.
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+*/
+
+#ifndef _AVLLISTXL_
+#define _AVLLISTXL_
+
+//#pragma once
+#include "list.h"
+#include "avllist.h"
+
+#define  MEMORYSTEP 8
+
+//_____________________________________________________________________________
+
+class _AVLListXL: public _AVLList
+{
+
+public:
+
+    _AVLListXL(_SimpleList*);
+    BaseRef GetXtra(long);
+
+    void SetXtra(long,BaseRef,bool);
+
+    virtual ~_AVLListXL(void){}
+    virtual BaseRef toStr(void);
+    virtual BaseRef GetDataByKey (BaseRef);
+
+    virtual long InsertData(BaseRef, long,bool);
+    virtual void Clear(bool = false);
+    virtual void DeleteXtra(long);
+    virtual long UpdateValue (BaseRef, BaseRef, bool = false, bool = true);
+
+    _List xtraD;
+
+};
+
+//_____________________________________________________________________________
+
+#endif
diff --git a/src/core/include/baseobj.h b/src/core/include/baseobj.h
new file mode 100644
index 0000000..21d3e5b
--- /dev/null
+++ b/src/core/include/baseobj.h
@@ -0,0 +1,172 @@
+/*
+
+HyPhy - Hypothesis Testing Using Phylogenies.
+
+Copyright (C) 1997-now
+Core Developers:
+  Sergei L Kosakovsky Pond (spond at ucsd.edu)
+  Art FY Poon    (apoon at cfenet.ubc.ca)
+  Steven Weaver (sweaver at ucsd.edu)
+  
+Module Developers:
+	Lance Hepler (nlhepler at gmail.com)
+	Martin Smith (martin.audacis at gmail.com)
+
+Significant contributions from:
+  Spencer V Muse (muse at stat.ncsu.edu)
+  Simon DW Frost (sdf22 at cam.ac.uk)
+
+Permission is hereby granted, free of charge, to any person obtaining a
+copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be included
+in all copies or substantial portions of the Software.
+
+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.
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+*/
+
+#ifndef _HBASEOBJ_
+#define _HBASEOBJ_
+//#pragma once
+
+
+typedef char* Ptr;
+
+#ifndef FALSE
+#define FALSE 0
+#endif
+
+#ifndef TRUE
+#define TRUE  1
+#endif
+
+#ifndef nil
+#define nil   NULL
+#endif
+
+#ifdef      __HEADLESS__
+#include "THyPhy.h"
+#endif
+
+#ifdef __GNUC__
+#define _hprestrict_ __restrict
+#else
+#define _hprestrict_
+#endif
+
+#include "stdio.h"
+
+class BaseObj
+{
+
+    //base object class
+public:
+
+    BaseObj();
+
+    virtual ~BaseObj(void) {}
+
+    virtual BaseObj* toStr (void);
+
+    virtual BaseObj* toErrStr (void);
+
+    virtual void     toFileStr (FILE*);
+
+    /*virtual operator const char*(void);*/
+
+    virtual BaseObj* makeDynamic (void);
+
+    virtual long     FreeUpMemory (long) {
+        return 0;
+    }
+
+    virtual void     Initialize (void) {
+        nInstances=1;
+    }
+
+    virtual void     Duplicate (BaseObj* ref) {
+        nInstances=++ref->nInstances;
+    }
+
+    virtual void     AddAReference (void)     {
+        nInstances ++;
+    }
+
+    virtual void     RemoveAReference (void)     {
+        nInstances --;
+    }
+
+    long             nInstances;
+
+
+};
+
+typedef BaseObj*  BaseRef;
+
+extern  void      DeleteObject (BaseRef); // delete a dynamic object
+
+
+#ifdef  __HYPHYDMALLOC__
+#define MemAllocate(X)      malloc(X)
+#define MemReallocate(X,Y)  realloc(X,Y)
+#else
+char*   MemAllocate (long);
+char*   MemReallocate (Ptr, long);
+#endif
+
+bool    GlobalStartup();
+bool    GlobalShutdown();
+
+
+extern  FILE*   globalErrorFile;
+extern  FILE*   globalMessageFile;
+extern  bool    terminateExecution,
+        skipWarningMessages;
+
+extern long     systemCPUCount;
+
+void          PurgeAll                  (bool   all = true);
+void          init_genrand              (unsigned long);
+unsigned long genrand_int32             (void);
+double        genrand_real2             (void);
+FILE*         doFileOpen                (const char *, const char *, bool = false);
+// 20110324: SLKP added the bool flag to allow automatic "Can't open file" error reports
+double        TimerDifferenceFunction   (bool);
+
+#define       RAND_MAX_32               4294967295.0
+#define       USE_AVL_NAMES
+#define       HY_WIDTH_OF_LONG          ((long)(sizeof(long)*8))
+
+#define     PRINTF_FORMAT_STRING    "%.16g"
+typedef     double       _Parameter; // standard number type - used everywhere in matrices.
+
+
+#if !defined __UNIX__ || defined __HEADLESS__ || defined __HYPHY_GTK__ || defined __HYPHYQT__
+void    yieldCPUTime        (void);
+bool    handleGUI           (bool = false);
+#endif
+
+
+#ifdef _SLKP_USE_SSE_INTRINSICS
+#include <pmmintrin.h>
+#endif
+
+#ifdef _SLKP_USE_AVX_INTRINSICS
+#include <immintrin.h>
+#endif
+
+#endif
+
+//EOF
diff --git a/src/core/include/batchlan.h b/src/core/include/batchlan.h
new file mode 100644
index 0000000..b157491
--- /dev/null
+++ b/src/core/include/batchlan.h
@@ -0,0 +1,682 @@
+/*
+
+HyPhy - Hypothesis Testing Using Phylogenies.
+
+Copyright (C) 1997-now
+Core Developers:
+  Sergei L Kosakovsky Pond (spond at ucsd.edu)
+  Art FY Poon    (apoon at cfenet.ubc.ca)
+  Steven Weaver (sweaver at ucsd.edu)
+  
+Module Developers:
+	Lance Hepler (nlhepler at gmail.com)
+	Martin Smith (martin.audacis at gmail.com)
+
+Significant contributions from:
+  Spencer V Muse (muse at stat.ncsu.edu)
+  Simon DW Frost (sdf22 at cam.ac.uk)
+
+Permission is hereby granted, free of charge, to any person obtaining a
+copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be included
+in all copies or substantial portions of the Software.
+
+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.
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+*/
+
+#ifndef __BATCHLANGUAGE__
+#define __BATCHLANGUAGE__
+
+
+#include "parser.h"
+#include "site.h"
+#include "trie.h"
+#include <stdio.h>
+
+#define  HY_BL_ERROR_HANDLING_DEFAULT 0
+#define  HY_BL_ERROR_HANDLING_SOFT    1
+
+//____________________________________________________________________________________
+struct    _CELInternals {
+    _SimpleFormulaDatum     * values,
+                            * stack;
+
+    _SimpleList       varList,
+                      storeResults;
+
+};
+
+//____________________________________________________________________________________
+struct    _HBLCommandExtras {
+    long                cut_string;
+    char                extract_condition_separator;
+    _SimpleList         extract_conditions;
+    _List               command_invocation;
+    
+    bool                do_trim,
+                        is_assignment,
+                        needs_verb;
+};
+
+class _ElementaryCommand;
+
+//____________________________________________________________________________________
+class   _ExecutionList: public _List // a sequence of commands to be executed
+{
+public:
+    _ExecutionList (); // doesn't do much
+    _ExecutionList (_String&, _String* = nil, bool = false, bool* = nil);
+
+    virtual
+    ~_ExecutionList (void);
+
+    virtual
+    BaseRef     makeDynamic (void);
+
+    virtual
+    BaseRef     toStr (void);
+
+    virtual
+    void        Duplicate                   (BaseRef);
+    bool        BuildList                   (_String&, _SimpleList* = nil, bool = false, bool = false);
+
+    _PMathObj   Execute                     (void);             // run this execution list
+    _PMathObj   GetResult                   (void) {
+        return result;
+    }
+    void        ExecuteSimple               (void);             // run a simple compiled list
+    bool        TryToMakeSimple             (void);             // see if a list can be made into a compiled version
+
+    long        ExecuteAndClean             (long,_String* = nil);
+
+    void        ResetFormulae               (void);             // decompile formulas (for reference functions)
+    void        ResetNameSpace              (void);
+    void        SetNameSpace                (_String);
+    _String     GetFileName                 (void);
+    _String*    GetNameSpace                (void);
+    _String     AddNameSpaceToID            (_String&, _String * = nil);
+    _String     TrimNameSpaceFromID         (_String&);
+    _String*    FetchFromStdinRedirect      (void);
+    _ElementaryCommand* FetchLastCommand (void) {
+        if (currentCommand - 1 < lLength && currentCommand > 0) {
+            return (_ElementaryCommand*)(*this)(currentCommand - 1);
+        }
+        return nil;
+    }
+
+    void        GoToLastInstruction         (void) {
+        currentCommand = MAX(currentCommand,lLength-1);
+    }
+    
+    bool        IsErrorState    (void)     {
+            return errorState;
+    }
+
+    void              ReportAnExecutionError (_String  errMsg, bool doCommand = true, bool appendToExisting = false);
+    /**
+     * Handle an error message according to the reporting policy of this execution list (defined by errorHandlingMode)
+     * @param errMsg -- the current command text stream
+     * @param doCommand -- add standard text about the current command
+     * @param appendToExisting -- append text to existing error
+     
+     */
+
+
+    // data fields
+    // _____________________________________________________________
+
+    long                            currentCommand;
+    char                            doProfile;
+    int                             errorHandlingMode; // how does this execution list handle errors
+    bool                            errorState;
+
+    _PMathObj                       result;
+
+    _VariableContainer*             nameSpacePrefix;
+
+    _AVLListXL                      *stdinRedirect;
+
+    _List                           *stdinRedirectAux;
+
+    _String                         sourceFile,
+                                    sourceText;
+
+    _SimpleList                     callPoints,
+                                    lastif;
+
+    _Matrix                         *profileCounter;
+
+    _CELInternals                   *cli;
+
+};
+
+//____________________________________________________________________________________
+// an elementary command
+
+class   _ElementaryCommand: public _String // string contains the literal for this command
+{
+public:
+
+    _ElementaryCommand (void); //dummy default constructor
+    _ElementaryCommand (long); // with operation code
+    _ElementaryCommand (_String& command); // process this string (and maybe an entire scope)
+    // starting at a given position
+    virtual                  ~_ElementaryCommand (void);
+
+    virtual   BaseRef        makeDynamic (void);
+    virtual   void           Duplicate (BaseRef);
+    virtual   BaseRef        toStr (void);
+
+    bool      Execute        (_ExecutionList&); // perform this command in a given list
+    void      ExecuteCase0   (_ExecutionList&);
+    void      ExecuteCase4   (_ExecutionList&);
+    void      ExecuteCase5   (_ExecutionList&);
+    void      ExecuteDataFilterCases (_ExecutionList&);
+    void      ExecuteCase11  (_ExecutionList&);
+    void      ExecuteCase12  (_ExecutionList&);
+    void      ExecuteCase21  (_ExecutionList&);
+    void      ExecuteCase25  (_ExecutionList&, bool = false); // fscanf
+    void      ExecuteCase26  (_ExecutionList&); // ReplicateConstraint
+    void      ExecuteCase31  (_ExecutionList&); // model construction
+    void      ExecuteCase32  (_ExecutionList&); // list selection handler
+    void      ExecuteCase34  (_ExecutionList&); // CovarianceMatrix
+    void      ExecuteCase36  (_ExecutionList&); // OpenDataPanel
+    void      ExecuteCase37  (_ExecutionList&); // GetInformation
+    void      ExecuteCase38  (_ExecutionList&, bool); // Reconstruct Ancestors
+    void      ExecuteCase39  (_ExecutionList&); // Execute Commands
+    void      ExecuteCase40  (_ExecutionList&); // Open Window
+    void      ExecuteCase41  (_ExecutionList&); // Spawn LF
+    void      ExecuteCase43  (_ExecutionList&); // FindRoot
+    void      ExecuteCase44  (_ExecutionList&); // MPISend
+    void      ExecuteCase45  (_ExecutionList&); // MPIReceive
+    void      ExecuteCase46  (_ExecutionList&); // GetDataInfo
+    void      ExecuteCase47  (_ExecutionList&); // ConstructStateCounter
+    void      ExecuteCase52  (_ExecutionList&); // Simulate
+    void      ExecuteCase53  (_ExecutionList&); // DoSQL
+    void      ExecuteCase54  (_ExecutionList&); // Topology
+    void      ExecuteCase55  (_ExecutionList&); // AlignSequences
+    void      ExecuteCase57  (_ExecutionList&); // GetNeutralNull
+    void      ExecuteCase58  (_ExecutionList&); // Profile Code
+    void      ExecuteCase61  (_ExecutionList&); // SCFG
+    void      ExecuteCase63  (_ExecutionList&); // NN; currently not functional
+    void      ExecuteCase64  (_ExecutionList&); // BGM
+    
+    bool      HandleFprintf                         (_ExecutionList&);
+    bool      HandleHarvestFrequencies              (_ExecutionList&);
+    bool      HandleOptimizeCovarianceMatrix        (_ExecutionList&, bool);
+    bool      HandleComputeLFFunction               (_ExecutionList&);
+    bool      HandleSelectTemplateModel             (_ExecutionList&);
+    bool      HandleUseModel                        (_ExecutionList&);
+    bool      HandleSetParameter                    (_ExecutionList&);
+    bool      HandleAssert                          (_ExecutionList&);
+    bool      HandleRequireVersion                  (_ExecutionList&);
+    bool      HandleDeleteObject                    (_ExecutionList&);
+    bool      HandleClearConstraints                (_ExecutionList&);
+    bool      HandleMolecularClock                  (_ExecutionList&);
+    bool      HandleGetURL                          (_ExecutionList&);
+    bool      HandleGetString                       (_ExecutionList&);
+    bool      HandleExport                          (_ExecutionList&);
+    bool      HandleDifferentiate                   (_ExecutionList&);
+    long      GetCode                               (void) { return code; };
+    
+    static  _String   FindNextCommand       (_String&, bool = false);
+    // finds & returns the next command block in input
+    // chops the input to remove the newly found line
+
+    static  long      ExtractConditions     (_String& , long , _List&, char delimeter = ';', bool includeEmptyConditions = true);
+    // used to extract the loop, if-then conditions
+
+    static  bool      ExtractValidateAddHBLCommand (_String& current_stream, const long command_code, _List* pieces, _HBLCommandExtras* command_spec, _ExecutionList& command_list);
+    /**
+     * Take a command from the current command stream, extract it, make an _ElementaryCommand and add it to the execution list
+     * @param current_stream -- the current command text stream
+     * @param command_code   -- the numerical code (from HY_HBL_COMMAND_*)
+     * @param pieces         -- the list of parameters extracted from the () part of the command
+     * @param command_spec   -- command specification structure
+     * @param command_list   -- the command list object to append the command to
+     * @return success/failure. 
+     */
+   
+
+    static  bool      BuildFor              (_String&, _ExecutionList&, _List&);
+    // builds the for loop starting from
+    // the beginning of input
+    // this will process the loop header
+    // and the entire scope afterwards
+
+    static  bool      BuildIfThenElse       (_String&, _ExecutionList&, _SimpleList*);
+    // builds the if-then-else construct starting from
+    // the beginning of input
+    // this will process the loop header
+    // and the entire scope afterwards
+
+    static  bool      BuildWhile            (_String&, _ExecutionList&, _List&);
+    // builds the while(..) construct starting from
+    // the beginning of input
+    // this will process the loop header
+    // and the entire scope afterwards
+
+    static  bool      BuildDoWhile          (_String&, _ExecutionList&);
+    // builds the do {} while(..); construct starting from
+    // the beginning of input
+    // this will process the loop header
+    // and the entire scope afterwards
+
+    static  bool      ProcessInclude        (_String&, _ExecutionList&);
+    // processes the include command
+
+
+    static  bool      ConstructDataSet      (_String&, _ExecutionList&);
+    // construct a dataset from the string
+
+    static  bool      ConstructExport       (_String&, _ExecutionList&);
+    // construct a matrix export command
+
+    static  bool      ConstructGetString    (_String&, _ExecutionList&);
+    // construct a matrix import command
+
+    static  bool      ConstructDataSetFilter(_String&, _ExecutionList&);
+    // construct a dataset filter from the string
+
+    static  bool      ConstructTree         (_String&, _ExecutionList&);
+    // construct a tree
+
+    static  bool      ConstructFscanf       (_String&, _ExecutionList&);
+    // construct a fscanf command
+
+    static  bool      ConstructExecuteCommands
+    (_String&, _ExecutionList&);
+    // construct a fscanf command
+
+    static  bool      ConstructReplicateConstraint
+    (_String&, _ExecutionList&);
+    // construct a replicate constraint command
+
+    static  bool      ConstructLF           (_String&, _ExecutionList&);
+    // construct a likelihood function
+
+
+    static  bool      ConstructFunction     (_String&, _ExecutionList&);
+    // construct a fprintf command
+
+    static  bool      ConstructReturn       (_String&, _ExecutionList&);
+    // construct a fprintf command
+
+    static  bool      ConstructSetParameter (_String&, _ExecutionList&);
+    // construct a set parameter clause
+
+    static  bool      ConstructCategory     (_String&, _ExecutionList&);
+    // construct a category variable
+
+    static  bool      ConstructChoiceList   (_String&, _ExecutionList&);
+    // construct a category variable
+
+    static  bool      ConstructCategoryMatrix (_String&, _ExecutionList&);
+    // construct a category matrix for the optimized like func
+
+    static  bool      ConstructOpenDataPanel (_String&, _ExecutionList&);
+    // open data panel with given settings
+
+    static  bool      ConstructOpenWindow   (_String&, _ExecutionList&);
+
+    static  bool      ConstructSpawnLF      (_String&, _ExecutionList&);
+
+    static  bool      ConstructFindRoot     (_String&, _ExecutionList&);
+
+    static  bool      ConstructGetInformation
+    (_String&, _ExecutionList&);
+
+    static  bool      ConstructModel        (_String&, _ExecutionList&);
+
+    static  bool      ConstructMPISend      (_String&, _ExecutionList&);
+
+    static  bool      ConstructMPIReceive   (_String&, _ExecutionList&);
+
+    static  bool      ConstructGetDataInfo  (_String&, _ExecutionList&);
+
+    static  bool      ConstructStateCounter (_String&, _ExecutionList&);
+
+    static  bool      ConstructDoSQL        (_String&, _ExecutionList&);
+
+    static  bool      ConstructAlignSequences
+    (_String&, _ExecutionList&);
+
+    static  bool      ConstructGetNeutralNull
+    (_String&, _ExecutionList&);
+
+    static  bool      ConstructProfileStatement
+    (_String&, _ExecutionList&);
+
+    static  bool      ConstructDeleteObject
+    (_String&, _ExecutionList&);
+
+    static  bool      ConstructSCFG         (_String&, _ExecutionList&);
+
+    static  bool      ConstructNN           (_String&, _ExecutionList&);
+
+    static  bool      ConstructBGM          (_String&, _ExecutionList&);
+
+    static  bool      ConstructAssert       (_String&, _ExecutionList&);
+
+    static  bool      SelectTemplateModel   (_String&, _ExecutionList&);
+
+    static  bool      MakeGeneralizedLoop   (_String*, _String*, _String* , bool , _String&, _ExecutionList&);
+
+protected:
+
+
+    bool      MakeJumpCommand       (_String*,  long, long, _ExecutionList&);
+    // internal command used
+    // to build a jump command
+    // with two branches
+    // and a condition
+
+    void       addAndClean          (_ExecutionList&, _List* = nil, long = 0);
+
+
+    friend  class     _ExecutionList;
+    friend  void      DeleteVariable     (long, bool);
+    friend  void      UpdateChangingFlas (long);
+    friend  void      UpdateChangingFlas (_SimpleList&);
+
+protected:  // data members
+
+    _List       parameters;        // a list of parameters
+    _SimpleList simpleParameters;  // a list of numeric parameters
+    int         code;              // code describing this command
+
+};
+
+//____________________________________________________________________________________
+
+_ElementaryCommand               * makeNewCommand       (long);
+
+//____________________________________________________________________________________
+
+#ifdef __HYPHYMPI__
+#include <mpi.h>
+
+extern   _String                mpiNodeID,
+         mpiNodeCount;
+
+#define  HYPHY_MPI_SIZE_TAG     111
+#define  HYPHY_MPI_STRING_TAG   112
+#define  HYPHY_MPI_DONE_TAG     113
+#define  HYPHY_MPI_VARS_TAG     114
+#define  HYPHY_MPI_DATA_TAG     115
+
+#define  HYPHY_MPI_DIE_TAG      666
+
+
+void     ReportMPIError         (int, bool);
+void     MPISendString          (_String&,long,bool=false);
+_String* MPIRecvString          (long,long&);
+
+#endif
+//____________________________________________________________________________________
+
+extern  _List
+
+batchLanguageFunctions,
+batchLanguageFunctionNames,
+batchLanguageFunctionParameterLists,
+dataSetList,
+dataSetNamesList,
+likeFuncList,
+dataSetFilterList,
+dataSetFilterNamesList,
+templateModelList,
+scfgNamesList,
+scfgList,
+
+bgmNamesList,       // modified by afyp
+bgmList,
+
+likeFuncNamesList,
+modelNames,
+executionStack,
+compiledFormulaeParameters,
+standardLibraryPaths,
+standardLibraryExtensions;
+
+
+extern  _SimpleList
+
+batchLanguageFunctionParameters,
+batchLanguageFunctionClassification,
+modelMatrixIndices,
+modelTypeList,
+// SLKP: 20100313 this list stores 0 for  normal (rate-matrix based models),
+//       vs expression based matrices, for which the dimension is stored.
+modelFrequenciesIndices,
+listOfCompiledFormulae;
+
+extern  _String
+
+getDString,
+getFString,
+tempFString,
+baseDirectory,
+libDirectory,
+useLastFString,
+mpiMLELFValue,
+lf2SendBack,
+hyphyBaseDirectory,
+hyphyLibDirectory,
+platformDirectorySeparator,
+defFileNameValue,
+defFileString,
+blConstructCM,
+blFprintfRedirect               ,
+blFprintfDevNull                ,
+globalPolynomialCap             ,
+enforceGlobalPolynomialCap      ,
+dropPolynomialTerms             ,
+maxPolyTermsPerVariable         ,
+maxPolyExpIterates              ,
+polyExpPrecision                ,
+systemVariableDump              ,
+selfDump                        ,
+printDigitsSpec                 ,
+explicitFormMExp                ,
+multByFrequencies               ,
+getDString                      ,
+useLastFString                  ,
+getFString                      ,
+defFileString                   ,
+useLastModel                    ,
+VerbosityLevelString            ,
+hasEndBeenReached               ,
+clearFile                       ,
+keepFileOpen                    ,
+closeFile                       ,
+useLastDefinedMatrix            ,
+MessageLogging                  ,
+selectionStrings                ,
+useNoModel                      ,
+stdoutDestination               ,
+messageLogDestination           ,
+lastModelParameterList          ,
+dataPanelSourcePath             ,
+windowTypeTree                  ,
+windowTypeClose                 ,
+windowTypeTable                 ,
+windowTypeDistribTable          ,
+windowTypeDatabase              ,
+screenWidthVar                  ,
+screenHeightVar                 ,
+useNexusFileData                ,
+mpiMLELFValue                   ,
+lf2SendBack                     ,
+pcAmbiguitiesResolve            ,
+pcAmbiguitiesAverage            ,
+pcAmbiguitiesSkip               ,
+lfStartCompute                  ,
+lfDoneCompute                   ,
+getURLFileFlag                  ,
+versionString                   ,
+timeStamp                       ,
+simulationFilter                ,
+prefixDS                        ,
+prefixDF                        ,
+prefixLF                        ,
+replaceTreeStructure            ,
+hyphyBaseDirectory              ,
+platformDirectorySeparator      ,
+covarianceParameterList         ,
+matrixEvalCount                 ,
+scfgCorpus                      ,
+bgmData                         ,
+bgmWeights                      ,
+pathToCurrentBF                 ,
+statusBarUpdateString           ,
+statusBarProgressValue          ,
+errorReportFormatExpression     ,
+errorReportFormatExpressionStr  ,
+errorReportFormatExpressionStack,
+errorReportFormatExpressionStdin,
+lastModelUsed                   ,
+deferConstrainAssignment        ,
+bgmData                         ,
+bgmScores                       ,
+bgmGraph                        ,
+bgmNodeOrder                    ,
+bgmConstraintMx                 ,
+bgmParameters                   ,
+assertionBehavior               ,
+dialogPrompt                    ,
+_hyLastExecutionError           ,
+_hyExecutionErrorMode           ,
+#ifdef      __HYPHYMPI__
+mpiNodeID                       ,
+mpiNodeCount                    ,
+mpiLastSentMsg                  ,
+#endif
+hfCountGap                      ;
+
+extern  _ExecutionList              *currentExecutionList;
+
+extern  _AVLList                    loadedLibraryPaths;
+extern  _AVLListX                   _HY_HBLCommandHelper,
+                                    _HY_GetStringGlobalTypes;
+                                    
+extern  _Trie                       _HY_ValidHBLExpressions,
+                                    _HY_HBL_Namespaces;
+
+extern  long                        globalRandSeed,
+                                    matrixExpCount;
+ 
+
+long    FindDataSetName              (_String&);
+long    FindDataSetFilterName        (_String&);
+long    FindSCFGName                 (_String&);
+long    FindBFFunctionName           (_String&, _VariableContainer* = nil);
+
+long    FindBgmName                  (_String &);
+// added by afyp, March 18, 2007
+
+long    FindLikeFuncName             (_String&, bool = false);
+long    FindModelName                (_String&);
+void    ScanModelForVariables        (long modelID, _AVLList& theReceptacle, bool inclG, long modelID2, bool inclCat);
+/* 20100316 SLKP:
+    factored out a function call to scan a particular model
+    for variables to permit the use of explicit (formula-based) model definitions
+ */
+
+void    ReadBatchFile                (_String&, _ExecutionList&);
+_String ReturnDialogInput            (bool dispPath = false);
+_String ReturnFileDialogInput        (void);
+_String*ProcessCommandArgument       (_String*);
+_String WriteFileDialogInput         (void);
+_Parameter
+ProcessNumericArgument               (_String*,_VariableContainer*, _ExecutionList* = nil);
+_String ProcessLiteralArgument       (_String*,_VariableContainer*, _ExecutionList* = nil);
+_AssociativeList*
+ProcessDictionaryArgument (_String* data, _VariableContainer* theP, _ExecutionList* = nil);
+
+_String GetStringFromFormula         (_String*,_VariableContainer*);
+void    ExecuteBLString              (_String&,_VariableContainer*);
+
+void    SerializeModel               (_String&,long,_AVLList* = nil, bool = false);
+bool    Get_a_URL                    (_String&,_String* = nil);
+
+long    AddFilterToList              (_String&,_DataSetFilter*,bool = false);
+long    AddDataSetToList             (_String&,_DataSet*);
+void    SetDataFilterParameters      (_String&, _DataSetFilter*, bool);
+void    KillDataFilterRecord         (long, bool = false);
+void    KillLFRecord                 (long, bool = true);
+void    KillDataSetRecord            (long);
+void    KillModelRecord              (long);
+void    KillExplicitModelFormulae    (void);
+bool    PushFilePath                 (_String&, bool = true);
+void    PopFilePath                  (void);
+_Matrix*CheckMatrixArg               (_String*, bool);
+_AssociativeList *
+CheckAssociativeListArg      (_String*);
+void    RetrieveModelComponents      (long, _Matrix*&,     _Matrix*&, bool &);
+void    RetrieveModelComponents      (long, _Variable*&, _Variable*&, bool &);
+bool    IsModelReversible            (long);
+bool    IsModelOfExplicitForm        (long);
+
+void    ReadModelList                (void);
+_String ProcessStringArgument        (_String* data);
+_String*_HBLObjectNameByType         (const long type, const long index, bool correct_for_empties = true);
+_String _hblCommandAccessor          (_ExecutionList*, long);
+_String _HYGenerateANameSpace             (void);
+
+_PMathObj
+ProcessAnArgumentByType      (_String*, _VariableContainer*, long, _ExecutionList* = nil);
+
+void    _HBL_Init_Const_Arrays       (void);
+
+void    ReturnCurrentCallStack       (_List&, _List&);
+
+/**
+    An accessor function which attempts to retrieve a reference to a HyPhy Batch Language Object
+    by name. A list of acceptable object classes can be specified in the type parameter. Note that
+    types will be searched in the following order:
+
+        HY_BL_DATASET,HY_BL_DATASET_FILTER,HY_BL_LIKELIHOOD_FUNCTION,HY_BL_SCFG,HY_BL_BGM,HY_BL_MODEL,HY_BL_HBL_FUNCTION
+
+    i.e. if there is a dataset named 'foo' and a likelihood function named 'foo', then the dataset
+    will be returned.
+
+
+
+    @param   name provides a string with the name of the object to be retrieved.
+    @param   type [in] which types of objects will be searched.
+                 [out] which type of object was retrieved (HY_BL_NOT_DEFINED if not found)
+    @param   index (if not nil) will receive the index of the found object in the corresponding array
+    @param   errMsg if set to True, will cause the function to report an error if no object of corresponding type could be found
+    @param   tryLiteralLookup if set to True, will cause the function to, upon a failed lookup, to also try interpreting name as a string variable ID
+    @return  pointer to the retrieved object or nil if not found
+    @author  SLKP
+    @version 20120324
+*/
+
+BaseRef _HYRetrieveBLObjectByName       (_String& name, long& type, long* index = nil, bool errMsg = false, bool tryLiteralLookup = false);
+
+_String _HYHBLTypeToText                (long type);
+_String _HYStandardDirectory            (const unsigned long);
+
+_HBLCommandExtras* _hyInitCommandExtras (const long = 0, const long = 0, const _String = empty, const char = ';', const bool = true, const bool = false, const bool = false, _SimpleList* = nil);
+
+
+extern  bool                        numericalParameterSuccessFlag;
+extern  _Parameter                  messageLogFlag;
+
+
+#endif
diff --git a/src/core/include/calcnode.h b/src/core/include/calcnode.h
new file mode 100644
index 0000000..9a724f3
--- /dev/null
+++ b/src/core/include/calcnode.h
@@ -0,0 +1,863 @@
+/*
+
+HyPhy - Hypothesis Testing Using Phylogenies.
+
+Copyright (C) 1997-now
+Core Developers:
+  Sergei L Kosakovsky Pond (spond at ucsd.edu)
+  Art FY Poon    (apoon at cfenet.ubc.ca)
+  Steven Weaver (sweaver at ucsd.edu)
+  
+Module Developers:
+	Lance Hepler (nlhepler at gmail.com)
+	Martin Smith (martin.audacis at gmail.com)
+
+Significant contributions from:
+  Spencer V Muse (muse at stat.ncsu.edu)
+  Simon DW Frost (sdf22 at cam.ac.uk)
+
+Permission is hereby granted, free of charge, to any person obtaining a
+copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be included
+in all copies or substantial portions of the Software.
+
+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.
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+*/
+
+#ifndef     __CALCNODE__
+#define     __CALCNODE__
+
+#include "parser.h"
+#include "classes.h"
+#include "site.h"
+
+
+#define UNROOTED                        0
+#define ROOTED_LEFT                     1
+#define ROOTED_RIGHT                    2
+
+
+#ifdef MDSOCL
+
+class _OCLEvaluator 
+{
+
+private:
+	// OpenCL Vars
+
+	// Forward Declarations
+	// *********************************************************************
+	void Cleanup (int iExitCode);
+	unsigned int roundUpToNextPowerOfTwo(unsigned int x);
+	double roundDoubleUpToNextPowerOfTwo(double x);
+	// So the only thing that needs to be passed as an update for each LF is flatTree and flatCLeaves
+	// as those are what goes into the new transition matrix stuff. 
+	// So I could have a launchmdsocl that takes everything and if stuff is not NULL than update, if it is
+	// null use the existing values. How about that?
+	// The problem is that I need to have essentially the first LF's information to properly set everything up. 
+	// And how do I have subsequent LF's not pass stuff. 
+	// Oi, how do I not have to convert this into an object...
+	// alright, I can probably keep all of this in likefunc. That is because the LFEvaluation is done in the
+	// calc node
+	double oclmain(void);
+	bool contextSet;
+	int setupContext(void);
+
+
+public:
+	void init(		long esiteCount,
+						long ealphabetDimension,
+						_Parameter* eiNodeCache);
+
+
+	double launchmdsocl(	_SimpleList& updateNodes,
+							_SimpleList& flatParents,
+							_SimpleList& flatNodes,
+							_SimpleList& flatCLeaves,
+							_SimpleList& flatLeaves,
+							_SimpleList& flatTree,
+							_Parameter* theProbs,
+							_SimpleList& theFrequencies,
+							long* lNodeFlags,
+							_SimpleList& taggedInternals,
+							_GrowingVector* lNodeResolutions);
+	~_OCLEvaluator()
+	{
+		Cleanup(EXIT_SUCCESS);
+	}
+
+
+};
+#endif
+
+
+
+
+//_______________________________________________________________________________________________
+
+class       _CalcNode: public _VariableContainer
+{
+
+public:
+
+    // constructors
+
+    _CalcNode           (void);                 // default constructor, doesn't do much
+    _CalcNode           (_String, _String, int  = 4, _VariableContainer* = nil, _AVLListXL * = nil);
+    // construct a node from a string of the form
+    // codeBase specifies the number of distinct states (4 for nucleotides, 61 for codons etc)
+    // matrix name, <optional comma separated variable declarations, inititalizations>
+    // also should be passed the pointer to a container tree
+
+    _CalcNode           (_CalcNode* source, _VariableContainer* parentTree);
+ 
+    virtual             ~_CalcNode      (void);
+    virtual             _PMathObj      Compute                             (void);
+
+    virtual unsigned long        ObjectClass     (void) {
+        return TREE_NODE;
+    }
+
+    virtual void        Duplicate       (BaseRef);
+
+    virtual long        FreeUpMemory    (long);
+
+    void                InitializeCN    ( _String&, int, _VariableContainer*, _AVLListXL * = nil);
+
+    virtual BaseRef     makeDynamic     (void);
+    // creates a dynamic copy of this object
+
+    virtual BaseRef     toStr           (void);
+    // converts this object to string
+
+    _Parameter&         operator[]      (unsigned long);
+    // access the i-th element of the
+    // probabilities (i = 0..codeBase-1)
+
+    void                SetCodeBase      (int);
+    // change the codeBase value for this node
+    // this will resize the vector used to handle frequencies
+
+    bool                RecomputeMatrix  (long = 0, long = 1,_Matrix* = nil, _List* = nil, _SimpleList* = nil, _List* = nil);
+    // reexponentiate the transition matrix and
+    // store it in compExp.
+    // return TRUE if the matrix is an explicit exponential form
+
+    virtual bool        HasChanged       (void);
+    virtual bool        NeedToExponentiate(long = -1L);
+    virtual void        SetModel         (long, _AVLListXL*);
+
+    bool                IsFlagged        (void) {
+        return theProbs[0]==-3.1415296;
+    }
+    void                SetFlag          (void) {
+        theProbs[0]=-3.1415296;
+    }
+
+    void                SetSummedFlag    (void) {
+        if (theProbs[0]>=0) {
+            theProbs[0] -= 2.0;
+        }
+    }
+    bool                IsSummedFlagged (void) {
+        return theProbs[0]<0.0;
+    }
+    void                RemoveSummedFlag (void) {
+        if (theProbs[0]<0) {
+            theProbs[0]+= 2.0;
+        }
+    }
+
+    _Parameter          GetProbs        (long k) {
+        return theProbs[k];
+    }
+    _Parameter*         GetProbs        (void) {
+        return theProbs;
+    }
+
+    void                SetCompExp      (_Matrix*, long = -1);
+    void                SetCompMatrix   (long);
+    _Matrix*            GetCompExp      (long catID = -1, bool = false);
+
+    _Formula*           RecurseMC       (long , node<long>* , bool first = false, char rooted = UNROOTED);
+
+    long                GetCodeBase     (void) {
+        return cBase;
+    }
+
+    _Parameter          BranchLength    (void);
+    virtual long        SetDependance   (long);
+
+    node<long>*         LocateMeInTree  (void);
+    // return the tree structure node corresponing to this one...
+    long                ConvertToSimpleMatrix (void);
+    void                ConvertFromSimpleMatrix (void);
+    _Matrix*            ComputeModelMatrix(bool expMe=false);
+    long                GetTheModelID   (void) {
+        return theModel;
+    }
+    bool                MatchSubtree    (_CalcNode*);
+    virtual void        RemoveModel     (void);
+    virtual void        ReplaceModel    (_String & modelName, _VariableContainer* parentTree);
+    
+    virtual long        CheckForReferenceNode
+    (void);
+
+    void        SetRefNode      (long rn) {
+        referenceNode = rn;
+        slaveNodes = 0;
+    }
+    void        AddRefNode      (void) {
+        referenceNode --;
+    }
+
+    virtual void        ClearCategoryMap(void) {
+        remapMyCategories.Clear();
+    }
+    
+    _VariableContainer*           ParentTree      (void);
+
+    virtual void        SetupCategoryMap(_List&, _SimpleList&, _SimpleList&);
+    /* 20090324: SLKP
+            This function will take a list of category variables (assumed to be a superset of categoryVariables)
+            and the number of categories in each (second argument)
+            and the multipliers for each category in the composite category
+            and populate remapMyCategories
+            (see comments)
+     */
+
+    friend  class       _TheTree;
+
+public:
+    _Parameter*     theProbs;       // list of transitional probabilities
+    long            lastState;
+
+protected:
+
+    _SimpleList     categoryVariables,
+                    categoryIndexVars,
+                    remapMyCategories;
+
+    /*
+        20090324: SLKP
+            because this calcnode may be a part of a likelihood
+            function partition with more category variables,
+            this mapper object takes the composite category ID
+            from the container (likelihood function) and maps it
+            to a category ID understood by this node; a composite
+            ID is mapped to an N+1 tuplet (N is the number of
+            category variables that this node depends on):
+
+            composite ID inside this _CalcNode
+            classes of each category variable in the same order
+            as they appear in categoryVariables
+
+            Hence the list will have (N+1)*(Container classes)
+            entries.
+
+            This list is populated using the SetupCategoryMap
+            and cleared using ClearCategoryMap
+     */
+
+
+    _Matrix   *     compExp;        // matrix exponential computed previously
+    _Matrix   **    matrixCache;    // only meaningful for category computations
+
+    long            cBase,          // dimension of theProbs
+                    nodeIndex,
+                    referenceNode,
+                    slaveNodes;
+};
+
+//_______________________________________________________________________________________________
+
+#define     HY_BRANCH_SELECT        0x01
+#define     HY_BRANCH_DESELECT      0xFFFFFFFE
+
+struct      nodeCoord {
+
+    _Parameter  h,
+                v,
+                auxD,
+                bL,
+                label1,
+                label2;
+
+    long        varRef,
+                auxL,
+                textWidth,
+                color,
+                labelColor,
+                flags;
+
+    _String     branchName,
+                branchTag;
+
+}; // used for tree imaging
+
+//_______________________________________________________________________________________________
+
+typedef bool _HYTopologyTraversalFunction (node<long>*, Ptr);
+
+//_______________________________________________________________________________________________
+
+class _TheTree; // forward declaration for xlc
+
+
+//_______________________________________________________________________________________________
+
+class _TreeTopology: public _CalcNode
+{
+
+protected:
+
+    virtual void            PreTreeConstructor                  (bool);
+    virtual bool            MainTreeConstructor                 (_String&,bool = true);
+    virtual void            PostTreeConstructor                 (bool);
+    node<long>*     prepTree4Comparison                 (_List&, _SimpleList&, node<long>* = nil);
+    void            destroyCompTree                     (node<long>*);
+    _List*          SplitTreeIntoClustersInt            (node<long>*, _List*, _AVLListX&, long, long);
+    char            internalTreeCompare                 (node<long>*, node<long>*, _SimpleList*, char, long, node<long>*, _TreeTopology*, bool = false);
+    char            internalNodeCompare                 (node<long>*, node<long>*, _SimpleList&, _SimpleList*, bool, long, node<long>*, _TreeTopology*, bool = false);
+    virtual _PMathObj       FlatRepresentation                  (void);
+    void            FindCOTHelper                       (node<long>*, long, _Matrix&, _Matrix&, _Matrix&, _List&, _AVLListX&, _Parameter);
+    void            FindCOTHelper2                      (node<long>*, _Matrix&, _Matrix&, _AVLListX&, node<long>*, _Parameter);
+    void            AddANode                            (_PMathObj);
+    /*
+
+     20091006: SLKP
+
+     given an AVL with at least three key -> string pairs
+        "NAME" -> string (not a currently used node name)
+        "WHERE" -> string (an existing node)
+        "PARENT" -> string (not a currently used node name)
+
+
+
+     */
+
+    void            RemoveANode                          (_PMathObj);
+    
+    /*
+     
+        Delete a node from the tree by name
+     
+     */
+
+public:
+
+    node<long>      *theRoot,
+         *currentNode;
+
+    _List           flatTree,
+                    flatCLeaves;
+
+    char            rooted;
+
+    virtual void            toFileStr                           (FILE*);
+    virtual BaseRef         toStr                               (void);
+    void            RerootTreeInternalTraverser         (long, bool,_String&, long  = -1, bool = false);
+
+    _TreeTopology                       (void);
+    _TreeTopology                       (_String, _String&, bool = true);
+    _TreeTopology                       (_String*);
+    _TreeTopology                       (_TheTree*);
+
+    virtual                 ~_TreeTopology                      (void);
+
+    virtual  _FString*      Compare                             (_PMathObj);
+    virtual  BaseRef        makeDynamic                         (void);
+    node<long>* CopyTreeStructure                   (node<long>*, bool);
+    virtual  bool           FinalizeNode                        (node<long>*, long, _String&, _String&, _String&, _String* = NULL);
+
+
+    bool            IsCurrentNodeATip                   (void);
+    bool            IsCurrentNodeTheRoot                (void);
+    bool            IsDegenerate                        (void);
+
+    virtual _PMathObj       Execute                             (long, _PMathObj = nil , _PMathObj = nil, _hyExecutionContext* context = _hyDefaultExecutionContext);
+    virtual void            EdgeCount                           (long&, long&);
+    // SLKP 20100827: a utility function to count edges in a tree
+    //              : note that the root node WILL be counted as an internal node
+    //              : writes [leaf count, internal node count] into the arguments
+
+    virtual _PMathObj       TipCount                            (void);
+    virtual _PMathObj       BranchCount                         (void);
+    virtual _PMathObj       AVLRepresentation                   (_PMathObj);
+    virtual unsigned long   ObjectClass                         (void) {
+        return TOPOLOGY;
+    }
+    virtual _AssociativeList*
+    FindCOT                             (_PMathObj);
+
+    node<long>      *FindNodeByName                     (_String*);
+    /*
+
+     20091006: SLKP
+
+     return the node with the name supplied by the argument
+     or nil if no such node exists
+
+     */
+
+    void            DepthWiseT                          (bool = false, _HYTopologyTraversalFunction* = nil, Ptr = nil);
+    void            DepthWiseTRight                     (bool = false);
+    void            DepthWiseTLevel                     (long& level, bool = false);
+    void            StepWiseT                           (bool = false, _HYTopologyTraversalFunction* = nil, Ptr = nil);
+    void            StepWiseTLevel                      (long&, bool = false);
+    void            LeafWiseT                           (bool = false);
+    
+    _List*          MapNodesToModels                    (void);
+
+    virtual void            GetNodeName                         (node<long> *, _String&, bool = false);
+    virtual _String*        GetNodeModel                        (node<long> *);
+    virtual void            GetBranchLength                     (node<long> *, _String&, bool = false);
+    // SLKP 20100901:
+    //               added a boolean flag to ask to return branch length expression (if true) (returns "" for topologies)
+    //               just the numeric value (if false)
+
+
+    virtual void            GetBranchLength                     (node<long> *, _Parameter&);
+    virtual void            GetBranchValue                      (node<long> *, _String&);
+    virtual void            GetBranchVarValue                   (node<long> *, _String&, long);
+    virtual void            PasteBranchLength                   (node<long> *, _String&, long, _Parameter factor = 1.);
+
+    node<long>&     GetRoot                             (void) {
+        return *theRoot;
+    }
+    void            SetRoot                             (node<long>* r) {
+        theRoot = r;
+    }
+    node<long>&     GetCurrentNode                      (void) {
+        return *currentNode;
+    }
+    void            SubTreeString                       (_String&, bool = false, long = -1, _AVLListXL* = nil);
+
+    _String         CompareTrees                        (_TreeTopology*);
+    _String         MatchTreePattern                    (_TreeTopology*);
+    virtual _PMathObj       TipName                             (_PMathObj);
+    virtual _PMathObj       BranchName                          (_PMathObj, bool = false, _PMathObj = nil);
+    virtual _PMathObj       BranchLength                        (_PMathObj);
+    virtual _PMathObj       RerootTree                          (_PMathObj);
+    _List*          SplitTreeIntoClusters               (unsigned long, unsigned long);
+    void            SetLeafName                         (long, _String*);
+    _String         DetermineBranchLengthMappingMode    (_String*, char&);
+    _AssociativeList*
+    SplitsIdentity                      (_PMathObj);
+    /* 20090609: SLKP
+        given a tree agrument (p), the function returns an AVL with a 2x1 matrix (key "CLUSTERS")
+        and a string (key "CONSENSUS");
+        The first cell contains the number of splits in *this
+        The second cell contains the number of splits in the argument that are present in *this
+
+        This entry will contain -1 if the argument is invalid (nil or not a tree)
+        and if the set of leaves differs between two trees
+
+        The string will be empty (incomparable trees or another exception) or the Newick String
+        with the consensus string
+
+    */
+    bool            ConvertToPSW                        (_AVLListX&,_List*, _SimpleList&,bool = false);
+    /* 20090612: SLKP
+       20100510: Modified the function to also return internal node names in the second AVL
+
+        covert the topology into the post-order with weights representation
+        The first argument maps node names to their internal indices in the traversal order
+        (note that leaves are numbered 1..leaves-1 and internal indices as leaves-1...leaves+inodes-1)
+        The second argument stores doubles for each node; the index in the array itself (mod 2),
+        corresponds to the appropriate step in the post-order traversal;
+
+        <node index, number of nodes in the subtree below>
+
+        (((A,B)N1,C)N2,(D,E)N3)N0 will result in
+
+        A->0; B->1; N1->5; C->2; N2->6; D->3; E->4; N3->7; N0->8
+        <0,0>,<1,0>,<5,2>,<2,0>,<6,4>,<3,0>,<4,0>,<7,2>,<8,8>, <5,4>
+
+        The last two entries store the number of leaves and internal nodes
+
+
+        if the bool argument is TRUE, then each LEAF in the tree must be found in the reference
+        dictionary supplied by the FIRST argument; false will be returned if this is not the case.
+    */
+
+    _String*        ConvertFromPSW                      (_AVLListX&,_SimpleList&);
+    /* 20090612: SLKP
+            given a PSW tree traversal order and a labeling legend,
+            return the Newick string for the tree
+    */
+
+    void            ComputeClusterTable                 (_SimpleList&, _SimpleList&);
+    /* given the PSW traversal representation (arg 2)
+       compute the cluster table (as defined in William HE Day "Optimal Algorithms for Comparing Trees With Labels",
+       Page 16) and store in arg 1
+            the list a is a flat representation for an Nx3 (N = number of leaves) table
+            clusters spanning L<->R leaves will be stored in either row L or row R
+            i-th entry
+            <L = leftmost cluster leaf (in traversal order),
+             R = rightmost cluster leaf (in traversal order),
+             F = a binary toggle (set to 0 by this procedure)
+     */
+
+
+
+
+
+};
+
+#if USE_SCALING_TO_FIX_UNDERFLOW
+extern _Parameter scalingLogConstant;
+#endif
+
+//_______________________________________________________________________________________________
+
+class _TheTree: public _TreeTopology
+{
+
+// theModel matrix of _TheTree contains the column matrix of probabilities, which is computed
+// based on the DataSetFilter passed on to the tree at the initialization stage
+
+public:
+
+    _TheTree ();                                                // default constructor - doesn't do much
+    _TheTree (_String name, _String& parms, bool = true);       // builds a tree from a string
+    _TheTree (_String name, _TreeTopology*);                    // builds a tree from a tree topology
+    _TheTree (_String name, _TheTree*);                    // builds a tree from another tree
+
+
+    virtual                 ~_TheTree                   (void);
+    virtual bool            HasChanged                  (void);
+    virtual void            MarkDone                    (void);
+    bool            HasChanged2                 (void);
+
+    _CalcNode*      DepthWiseTraversal          (bool = false);
+    //performs a post-order traversal
+    _CalcNode*      DepthWiseTraversalRight     (bool = false);
+    //performs a post-order tree traversal going right first
+    _CalcNode*      DepthWiseTraversalLevel     (long&, bool = false);
+    //performs a post-order tree traversal
+    //storing current node depth
+    _CalcNode*      StepWiseTraversal           (bool = false);
+    //performs a pre-order  tree traversal
+    _CalcNode*      StepWiseTraversalLevel      (long&, bool = false);
+    //performs a pre-order wise tree traversal
+    //storing current node depth
+
+    _CalcNode*      LeafWiseTraversal           (bool = false);
+    //iterate through the leaves (left-to-right)
+
+    virtual  bool           FinalizeNode                (node<long>*, long, _String&, _String&, _String&, _String* = NULL);
+    virtual  BaseRef        makeDynamic                 (void);
+
+    virtual  BaseRef        makeDynamicCopy             (_String*);
+    node<long>* DuplicateTreeStructure      (node<long>*, _String*, bool);
+    virtual  BaseRef        toStr                       (void);
+    virtual unsigned long           ObjectClass                 (void) {
+        return TREE;
+    }
+
+    virtual  _PMathObj      Execute                     (long, _PMathObj = nil , _PMathObj = nil, _hyExecutionContext* context = _hyDefaultExecutionContext);
+    virtual  _PMathObj      TEXTreeString               (_PMathObj);
+    virtual  _PMathObj      PlainTreeString             (_PMathObj,_PMathObj);
+
+    virtual  void           GetNodeName                 (node<long> *, _String&, bool = false);
+    virtual  void           GetBranchLength             (node<long> *, _String&, bool = false);
+    virtual  void           GetBranchLength             (node<long> *, _Parameter&);
+    virtual  void           GetBranchValue              (node<long> *, _String&);
+    virtual  _String*       GetBranchSpec               (node<long> *);
+    virtual  void           GetBranchVarValue           (node<long> *, _String&, long);
+    virtual _String*        GetNodeModel                (node<long> *);
+    
+    void            InitializeTreeFrequencies   (_Matrix *, bool = false);
+
+    _Parameter      ReleafTreeAndCheck          (_DataSetFilter*, long, bool, long categID = -1);
+    _Parameter      ReleafTreeAndCheckChar4     (_DataSetFilter*, long, bool, long categID = -1);
+
+    _Parameter      ReleafTree                  (_DataSetFilter*,long,long,long,long);
+    _Parameter      ReleafTreeDegenerate        (_DataSetFilter*,long);
+
+    _Parameter      ReleafTreeCache             (_DataSetFilter*,long,long,long,long,long);
+#if USE_SCALING_TO_FIX_UNDERFLOW
+    _Parameter      ThreadReleafTreeCache       (_DataSetFilter*,long,long,long,long,long,long offset = 0,long fixAttempt = 0, _Parameter = 690.);
+    _Parameter      doScaling                   (_DataSetFilter*,long,long,long,long,_Parameter, bool, bool);
+#else
+    _Parameter      ThreadReleafTreeCache       (_DataSetFilter*,long,long,long,long,long,long offset = 0);
+#endif
+
+    _Parameter      Process3TaxonNumericFilter  (_DataSetFilterNumeric*, long = 0);
+
+
+    void            ThreadMatrixUpdate          (long, bool);
+    void            SerialMatrixUpdate          (long, bool);
+    void            MatrixCacheUpdate           (void);
+
+    _Parameter      ThreadReleafTreeCharCache   (_DataSetFilter*,long,long,long,long,long,long offset = 0);
+    _Parameter      ReleafTreeCharDegenerate    (_DataSetFilter*,long);
+    _Parameter      ReleafTreeChar4             (_DataSetFilter*,long,long,long,long,long);
+    _Parameter      ReleafTreeChar4Degenerate   (_DataSetFilter*,long);
+
+    _Parameter      ThreadReleafTreeChar4       (_DataSetFilter*,long,long,long,long,long,long offset = 0);
+    _Parameter      ReleafTreeChar4             (_DataSetFilter*,long,long,long,long);
+
+    _Parameter  Probij                          (long, long, _CalcNode*);
+    _Parameter  PruneTree                       (long categID = -1);
+    _Parameter  PruneTreeChar                   (long categID = -1);
+    _Parameter  PruneTreeCharCache              (long categID = -1);
+    _Parameter  PruneTreeChar4                  (long categID = -1);
+    _Parameter  PruneTreeChar4Cache             (long categID = -1);
+
+    _List*      RecoverAncestralSequences       (_DataSetFilter*, _SimpleList&, _List&, _Parameter*, _Parameter*, long, long*, _GrowingVector*, bool = false);
+    void        RecoverNodeSupportStates        (_DataSetFilter*, long, long, _Matrix&);
+    void        RecoverNodeSupportStates2       (node<long>*,_Parameter*,_Parameter*,long);
+    _List*      SampleAncestors                 (_DataSetFilter*, node<long>*);
+    void        PurgeTree                       (void);
+
+    long        ComputeReleafingCost            (_DataSetFilter*, long, long, _SimpleList* = nil, long = 0);
+    long        ComputeReleafingCostChar        (_DataSetFilter*, long, long);
+    void        DumpingOrder                    (_DataSetFilter*, _SimpleList&);
+    void        SetTreeCodeBase                 (long);
+    long        IsLinkedToALF                   (long&);
+
+    bool        HasCache                        (void) {
+        return topLevelNodes.lLength>0;
+    }
+
+    long        GetLeafCount                    (void) {
+        return flatLeaves.lLength;
+    }
+
+    long        GetINodeCount                   (void) {
+        return flatNodes.lLength    ;
+    }
+
+    void        ScanAndAttachVariables          (void);
+    void        ScanForVariables                (_AVLList& l, _AVLList& l2, _AVLListX* tagger = nil, long weight = 0);
+    void        ScanForDVariables               (_AVLList& l, _AVLList& l2);
+    void        ScanForGVariables               (_AVLList&, _AVLList&, _AVLListX* tagger = nil, long weight = 0);
+    void        ScanForCVariables               (_AVLList&);
+    void        MolecularClock                  (_String&, _List&);
+
+    void        SetUp                           (void);
+    void        SetUpMatrices                   (long);
+    void        CleanUpMatrices                 (void);
+    void        BuildTopLevelCache              (void);
+    void        KillTopLevelCache               (void);
+    void        SetCompMatrices                 (long);
+
+    virtual void        ClearConstraints                (void);
+
+    bool        FindScalingVariables            (_SimpleList&);
+    bool        HaveStringBranchLengths         (void);
+    void        AssignLabelsToBranches          (node<nodeCoord>*, _String*, bool);
+
+    node<nodeCoord>*
+    AlignedTipsMapping              (bool first = false, bool respectRoot = true);
+
+    void        AlignNodes                      (node<nodeCoord>*);
+
+    node<nodeCoord>*
+    ScaledBranchMapping             (node<nodeCoord>* , _String*, long, long&, char);
+
+    node<nodeCoord>*
+    RadialBranchMapping             (node<long>* , node<nodeCoord>*, _String*, _Parameter, long&, _Parameter&, char);
+
+    void        ScaledBranchReMapping           (node<nodeCoord>*, _Parameter);
+    char&       RootedFlag                      (void) {
+        return rooted;
+    }
+
+    nodeCoord   TreeTEXRecurse                  (node<nodeCoord>*,_String&,_Parameter,_Parameter,long,long);
+    void        TreePSRecurse                   (node<nodeCoord>*,_String&,_Parameter,_Parameter,long,long,long,long,_AssociativeList* = nil, char = 0, _Parameter* = nil);
+
+    bool        AllBranchesHaveModels           (long);
+    void        ScanSubtreeVars                 (_List&, char, _CalcNode*);
+    void        BuildINodeDependancies          (void);
+    void        AllocateResultsCache            (long);
+    long        CountTreeCategories             (void);
+    void        CompileListOfModels             (_SimpleList&);
+
+    void        MarkMatches                     (_DataSetFilter*,long,long);
+    long        GetLowerBoundOnCost             (_DataSetFilter*);
+    long        GetLowerBoundOnCostWithOrder    (_DataSetFilter*,_SimpleList*);
+    _SimpleList&GetLeftINodes                   (void) {
+        return leftiNodes;
+    }
+    bool        MatchLeavesToDF                 (_SimpleList&, _DataSetFilter*, bool);
+    virtual void
+    RemoveModel                     (void);
+    _String*    TreeUserParams                  (void);
+
+
+    _String     CompareSubTrees                 (_TheTree*, node<long>*);
+    _String     FindMaxCommonSubTree            (_TheTree*, long&, _List*);
+    void        WeightedCharacterDifferences    (_Parameter, _Matrix*, _Matrix*, long = -1);
+    void        AddNodeNamesToDS                (_DataSet*, bool, bool, char);
+    // if the
+    _Parameter  PSStringWidth                   (_String&);
+
+    _Parameter  DetermineBranchLengthGivenScalingParameter
+    (long, _String&, char);
+
+    _AVLListX*  ConstructNodeToIndexMap         (bool);
+    // 20090206: SLKP
+    // makes an AVL of with keys storing memory addresses of node<long> tree nodes
+    // and values showing the order in either flatLeaves (bool = false) or flatNodes (bool = true)
+
+    void        MapPostOrderToInOderTraversal   (_SimpleList&, bool = true);
+    // 20090306: SLKP
+    // 20100511: SLKP
+    // construct a post-order -> in-order traveral map for internal nodes
+    // bool = true (internal nodes), bool = false (leaf nodes)
+
+    void        AddBranchToForcedRecomputeList  (long idx)      {
+        forceRecalculationOnTheseBranches << idx;
+    }
+    void        ClearForcedRecomputeList        (void)          {
+        forceRecalculationOnTheseBranches.Clear();
+    }
+    bool        HasForcedRecomputeList          (void)          {
+        return forceRecalculationOnTheseBranches.lLength;
+    }
+    // 20090306: SLKP
+    // the previous two functions are used to manipulate the list of
+    // branches that are marked as 'dirty' for LF computation purposes
+    // because of external manipulations of the cache (e.g. computing the LF with one of the interior
+    // nodes set to
+
+    void        SetupCategoryMapsForNodes       (_List& , _SimpleList&, _SimpleList& );
+    /* 20090325: SLKP
+       a wrapper function to set up category variable maps for nodes;
+       see comments for remapMyCategories in _CalcNode
+     */
+
+    _Parameter  VerySimpleLikelihoodEvaluator   (_SimpleList&            updateNodes,
+            _DataSetFilter*      theFilter,
+            _Parameter*          iNodeCache,
+            long       *             lNodeFlags,
+            _GrowingVector*      lNodeResolutions);
+
+#ifdef MDSOCL
+			_Parameter OCLLikelihoodEvaluator (			_SimpleList&	     updateNodes, 
+                                                        _DataSetFilter*		 theFilter,
+                                                        _Parameter*			 iNodeCache,
+                                                         long	   *		 lNodeFlags,
+                                                        _GrowingVector*		 lNodeResolutions,
+														_OCLEvaluator& OCLEval);
+#endif
+
+#ifdef  _SLKP_LFENGINE_REWRITE_
+    void            SampleAncestorsBySequence       (_DataSetFilter*, _SimpleList&, node<long>*, _AVLListX*, _Parameter*, _List&, _SimpleList*, _List&, _Parameter*, long);
+
+    _Parameter      ComputeTreeBlockByBranch        (_SimpleList&, _SimpleList&, _SimpleList*, _DataSetFilter*, _Parameter*, long*, _Parameter*, _GrowingVector*, long&, long, long, long = -1, _Parameter* = nil, long* = nil, long = -1, long * = nil);
+    long            DetermineNodesForUpdate         (_SimpleList&,  _List* = nil, long = -1, long = -1, bool = true);
+    void            ExponentiateMatrices            (_List&, long, long = -1);
+    void            FillInConditionals              (_DataSetFilter*, _Parameter*,  _SimpleList*);
+
+    void            ComputeBranchCache              ( _SimpleList&,
+            long nodeID,
+            _Parameter*         cache,
+            _Parameter*         iNodeCache,
+            _DataSetFilter*     theFilter,
+            long           *        lNodeFlags,
+            _Parameter*         scalingAdjustments,
+            long*                   siteCorrectionCounts,
+            _GrowingVector*     lNodeResolutions,
+            long&                   overallScaler,
+            long                    siteFrom,
+            long                    siteTo,
+            long                    catID,
+            _SimpleList*            = nil,
+            _Parameter*         = nil
+                                                    );
+
+    _Parameter          ComputeLLWithBranchCache         (
+        _SimpleList&            siteOrdering,
+        long                    brID,
+        _Parameter*         cache,
+        _DataSetFilter*     theFilter,
+        long                    siteFrom,
+        long                    siteTo,
+        long                    catID,
+        _Parameter*         storageVec = nil
+    );
+
+    _Parameter          ComputeTwoSequenceLikelihood    (
+        _SimpleList&            siteOrdering,
+        _DataSetFilter*     theFilter,
+        long           *        lNodeFlags,
+        _GrowingVector*     lNodeResolutions,
+        long siteFrom,
+        long siteTo,
+        long catID,
+        _Parameter* storageVec = nil);
+#endif
+
+    // --------------------------
+
+
+    long      * nodeStates;
+    char      * nodeMarkers;
+
+    _Parameter* rootIChildrenCache,
+                * marginalLikelihoodCache;
+
+    _AVLListXL* aCache;
+
+    long        categoryCount;
+
+protected:
+
+
+    bool        IntPopulateLeaves   (_DataSetFilter*, long, long);
+
+    _Parameter  ConditionalBranchLikelihood
+    (node<long>* , node<long>* , _Parameter* , _Parameter* , long, long);
+
+    _Parameter  ConditionalNodeLikelihood
+    (node<long>* , node<long>* , _Parameter* , _Parameter* , long ,long);
+
+    _List*      MapCBaseToCharacters(_DataSetFilter*, bool = true);
+
+
+    virtual     void                PreTreeConstructor                  (bool);
+    virtual     void                PostTreeConstructor                 (bool);
+
+
+    // all of the following members exist to speed-up the pruning algorithm
+    // the are created by calling the function set up
+    _SimpleList flatLeaves,
+                flatNodes,
+                leftiNodes,
+                flatParents,
+                topLevelNodes,
+                topLevelLeftL,
+                topLevelRightL,
+                forceRecalculationOnTheseBranches,
+                nodesToUpdate;
+
+};
+
+extern char     isDefiningATree;
+extern _String  expectedNumberOfSubs,
+       stringSuppliedLengths,
+       includeModelSpecs,
+       treeOutputAVL,
+       treeOutputLayout;
+#ifdef _OPENMP
+#include "omp.h"
+#endif
+
+#endif
diff --git a/src/core/include/category.h b/src/core/include/category.h
new file mode 100644
index 0000000..4a2be84
--- /dev/null
+++ b/src/core/include/category.h
@@ -0,0 +1,232 @@
+/*
+
+HyPhy - Hypothesis Testing Using Phylogenies.
+
+Copyright (C) 1997-now
+Core Developers:
+  Sergei L Kosakovsky Pond (spond at ucsd.edu)
+  Art FY Poon    (apoon at cfenet.ubc.ca)
+  Steven Weaver (sweaver at ucsd.edu)
+  
+Module Developers:
+	Lance Hepler (nlhepler at gmail.com)
+	Martin Smith (martin.audacis at gmail.com)
+
+Significant contributions from:
+  Spencer V Muse (muse at stat.ncsu.edu)
+  Simon DW Frost (sdf22 at cam.ac.uk)
+
+Permission is hereby granted, free of charge, to any person obtaining a
+copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be included
+in all copies or substantial portions of the Software.
+
+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.
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+*/
+
+#ifndef     __CATEGORY__
+#define     __CATEGORY__
+
+#include  "parser.h"
+#include  "batchlan.h"
+#include  "matrix.h"
+
+#define    MEAN                     0
+#define    MEDIAN                   1
+#define    SCALED_MEDIAN            2
+#define    CONSTANT_ON_PARTITION    1
+
+#ifndef    __HYALTIVEC__
+#define    INFINITE_BOUND 1e50
+#else
+#define    INFINITE_BOUND 1e10
+#endif
+
+//__________________________________________________________________________________
+
+class     _CategoryVariable: public _Variable
+{
+
+public:
+    // c&d
+
+    _CategoryVariable () {
+        values = nil;
+        intervalEnds = nil;
+        weights = nil;
+        conditionalWeights = nil;
+    };
+    _CategoryVariable (_CategoryVariable& cv) {
+        Duplicate (&cv);
+    }
+    _CategoryVariable (_String& name, _List* parms, _VariableContainer*);
+
+    // std functions
+    virtual
+    ~_CategoryVariable () {
+        DeleteObject (values);
+        DeleteObject (intervalEnds);
+        DeleteObject (weights);
+    };
+    virtual
+    BaseRef     makeDynamic             (void);
+    virtual
+    void        Duplicate               (BaseRef);
+    virtual
+    BaseRef     toStr                   (void);
+
+    virtual
+    bool        IsGlobal                (void);
+
+    virtual
+    bool        IsConstant              (void);
+
+    virtual
+    bool        IsCategory              (void) {
+        return true;
+    }
+
+    virtual
+    void       ScanForVariables         (_AVLList&, bool = false, _AVLListX* tagger = nil, long weight = 0);
+
+    virtual
+    void       ScanForGVariables        (_AVLList&);
+
+    bool       HaveParametersChanged    (long = -1);
+
+    /*virtual
+        bool       IsIndependent (void) { return false;} */
+
+    // access functions
+
+    long        GetNumberOfIntervals () {
+        return intervals;
+    }
+
+    char        GetRepresentationType () {
+        return representation;
+    }
+
+    _Parameter  SetIntervalValue (long, bool recacl = true);
+    // set interval value is returned
+
+    _Parameter  Mean (void);
+
+    _Parameter  GetIntervalValue (long);
+
+    _Parameter  GetIntervalWeight(long);
+
+    _Parameter* GetIntervalWeights(void) {
+        return weights->fastIndex();
+    }
+
+    _Matrix*    GetValues (void);
+
+    _Matrix*    GetWeights(bool = false);
+
+    _Matrix*    GetIntervalEnds (void);
+
+    _Matrix*    ComputeHiddenMarkov (void);
+    _Matrix*    ComputeHiddenMarkovFreqs (void);
+    _Matrix*    GetHiddenMarkov (void);
+    _Matrix*    GetHiddenMarkovFreqs (void);
+
+    _Formula&   GetDensity(void) {
+        return density;
+    }
+
+    _Formula&   GetCumulative(void) {
+        return cumulative;
+    }
+
+
+    bool        Refresh(bool force=false) {
+        return UpdateIntervalsAndValues(force);
+    }
+
+    _Parameter  GetMinX (void)  {
+        return x_min;
+    }
+    _Parameter  GetMaxX (void)  {
+        return x_max;
+    }
+    bool        IsHiddenMarkov
+    (void)  {
+        return (hiddenMarkovModel!=-1);
+    }
+
+    bool        IsConstantOnPartition
+    (void)  {
+        return (flags&CONSTANT_ON_PARTITION);
+    }
+
+    void        ChangeNumberOfIntervals (long);
+    // assumes a 'standard' category variable - i.e.
+    // EQUAL freqs, and density/cumulative
+
+    void        SerializeCategory       (_String&);
+
+    long        GetCurrentState         (void);
+    bool        IsUncorrelated          (void);
+    bool        IsLayered               (void);
+
+private:
+
+    bool        UpdateIntervalsAndValues (bool force = false);
+    void        Construct   (_List&, _VariableContainer*);
+    void        Clear       (void);
+    bool        checkWeightMatrix (_Matrix&, long = -1);
+
+    // data members
+private:
+
+    long        intervals,  // number of intervals
+                hiddenMarkovModel,
+                covariant,
+                intervalSplitter;
+
+
+    char        flags;
+    _Formula    density,
+                cumulative,
+                meanC;
+    // weights of intervals
+    // probability density function, in terms of parameters and _x_
+    // cumulative prob function, in terms of parameters and _x_
+    char        representation;
+    // how to represent intervals, by means or medians
+
+    _Matrix     *values,
+                *intervalEnds,
+                *weights,
+                *conditionalWeights;
+
+    _Parameter  x_min,
+                x_max;      // distribution range
+
+    _SimpleList parameterList;
+    _List       affectedClasses;
+
+
+
+};
+
+//__________________________________________________________________________________
+
+extern  _Parameter  maxCategoryIntervals;
+extern  _Variable*  _x_, *_n_;
+
+#endif
diff --git a/src/core/include/classes.h b/src/core/include/classes.h
new file mode 100644
index 0000000..9a9cd79
--- /dev/null
+++ b/src/core/include/classes.h
@@ -0,0 +1,188 @@
+/*
+
+HyPhy - Hypothesis Testing Using Phylogenies.
+
+Copyright (C) 1997-now
+Core Developers:
+  Sergei L Kosakovsky Pond (spond at ucsd.edu)
+  Art FY Poon    (apoon at cfenet.ubc.ca)
+  Steven Weaver (sweaver at ucsd.edu)
+  
+Module Developers:
+	Lance Hepler (nlhepler at gmail.com)
+	Martin Smith (martin.audacis at gmail.com)
+
+Significant contributions from:
+  Spencer V Muse (muse at stat.ncsu.edu)
+  Simon DW Frost (sdf22 at cam.ac.uk)
+
+Some of the Original Code by William A Casey.
+
+Permission is hereby granted, free of charge, to any person obtaining a
+copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be included
+in all copies or substantial portions of the Software.
+
+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.
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+*/
+
+
+//#pragma once
+#ifndef __CLASSES__
+#define __CLASSES__
+
+#ifndef MAX
+#define MAX(a,b) ((a) >= (b) ? (a) : (b))
+#endif
+
+#ifndef MIN
+#define MIN(a,b) ((a) < (b) ? (a) : (b))
+#endif
+
+#define SWAP(a,b,c) ((c)=(a),(a)=(b),(b)=(c))
+#define DEBUG 0
+
+#include "simplelist.h"
+
+/*---------------------------------------------------------------------------*/
+
+template <class array_data> class ptr_array
+{
+
+public:
+    array_data  *data;                                            //points to an array of somethings
+    int             length;                                            //length of the array
+
+    ptr_array                   (void) {
+        data = NULL;
+        length = 0;
+    }
+    //default constructor
+    ~ptr_array              () {
+        if (data) {
+            delete [] data;
+        }
+    }
+    //default destructor
+    void            add                 (array_data);
+    //adds a node to the end of the array
+    void            prepend             (array_data);
+    //adds a node to the beginning of the array
+    void            delete_entry        (int);
+    int             get_length          (void) {
+        return length;
+    }
+    //returns the length of the array  array_data get_elem(int index);
+};
+
+/*---------------------------------------------------------------------------*/
+
+template <class node_data> class node
+{
+public:
+    node_data       in_object;
+    ptr_array<node*>    nodes;
+    node                *parent;
+    void                set_parent      (node &thenode) {
+        parent = &thenode;
+    }
+public:
+    node            (void) {
+        parent = NULL;
+    }
+    ~node()
+    {}
+    void                init            (node_data value) {
+        in_object = value;
+    }
+    node_data       get_data        (void) {
+        return in_object;
+    }
+    //TEST BELOW
+    void                detach_child    (int k) {
+        nodes.delete_entry(k);
+    }
+
+    int                 tree_depth      (void);
+
+    void                detach_parent   (void) {
+        parent = NULL;
+    }
+    int                 get_num_nodes   (void) {
+        return nodes.get_length();
+    }
+    void                add_node        (node& thenode) {
+        thenode.set_parent(*this);
+        nodes.add(&thenode);
+    }
+
+    void                replace_node    (node* existingNode, node* newNode);
+
+    void                prepend_node    (node &thenode) {
+        thenode.set_parent(*this);
+        nodes.prepend(&thenode);
+    }
+    void                kill_node       (int in) {
+        nodes.delete_entry(in);
+    }
+    node*           get_node        (int in) {
+        return nodes.data[in-1];
+    }
+    node*           get_parent      (void) {
+        return parent;
+    }
+    int                 get_child_num   (void);
+
+    node<node_data>*    go_up           (void);
+    node<node_data>*  go_next           (void);
+    node<node_data>*  go_previous       (void);
+    node<node_data>*  go_down           (int index);
+    int                 down            (int index);
+
+    int                 next            (void);
+    int                 up              (void);
+    void                delete_tree     (bool = false);
+    node<node_data>*  duplicate_tree  (void);
+    // traverse from this node down duplicating the tree and return
+    // pointer to the root of the duplicate;
+    bool                compare_subtree (node<node_data>*);
+
+};
+
+template <class node_data>  node<node_data>* StepWiseTraverser              (node<node_data>* root);
+template <class node_data>  node<node_data>* StepWiseTraverserLevel         (node_data& level, node<node_data>* root);
+//template <class array_data> node<node_data>* DepthWiseTraverserLevel      (node_data& level, node<node_data>* root);
+template <class node_data> node<node_data>* DepthWiseStepTraverser      (node<node_data>* root);
+template <class node_data> node<node_data>* DepthWiseStepTraverserRight     (node<node_data>* root);
+template <class node_data> long             NodePathTraverser               (_SimpleList& history, node<node_data>* root);
+template <class node_data> node<node_data>* DepthWiseStepTraverserWCount    (long& costCount, node<node_data>* root);
+template <class node_data> node<node_data>* DepthWiseStepTraverserLevel    (long& level, node<node_data>* root);
+
+typedef  union {
+    long         leafIndex;
+    _SimpleList *leafList;
+}
+descendantInfo;
+
+node <descendantInfo>*
+GatherTreeInfo                  (node<long>* oldRoot, long& leafCounter, _SimpleList& reindex);
+
+void        PurgeTreeInfo                   (node<descendantInfo>* root);
+
+#include "../ptr_array.cp"
+#include "../classes.cp"
+
+#endif
diff --git a/src/core/include/constant.h b/src/core/include/constant.h
new file mode 100644
index 0000000..df71ff3
--- /dev/null
+++ b/src/core/include/constant.h
@@ -0,0 +1,121 @@
+/*
+ 
+ HyPhy - Hypothesis Testing Using Phylogenies.
+ 
+ Copyright (C) 1997-now
+ Core Developers:
+ Sergei L Kosakovsky Pond (spond at ucsd.edu)
+ Art FY Poon    (apoon at cfenet.ubc.ca)
+ Steven Weaver (sweaver at ucsd.edu)
+ 
+ Module Developers:
+ Lance Hepler (nlhepler at gmail.com)
+ Martin Smith (martin.audacis at gmail.com)
+ 
+ Significant contributions from:
+ Spencer V Muse (muse at stat.ncsu.edu)
+ Simon DW Frost (sdf22 at cam.ac.uk)
+ 
+ Permission is hereby granted, free of charge, to any person obtaining a
+ copy of this software and associated documentation files (the
+ "Software"), to deal in the Software without restriction, including
+ without limitation the rights to use, copy, modify, merge, publish,
+ distribute, sublicense, and/or sell copies of the Software, and to
+ permit persons to whom the Software is furnished to do so, subject to
+ the following conditions:
+ 
+ The above copyright notice and this permission notice shall be included
+ in all copies or substantial portions of the Software.
+ 
+ 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.
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ 
+ */
+
+#ifndef     __CONSTANT__
+#define     __CONSTANT__
+
+#include "mathobj.h"
+
+class _Constant : public _MathObject   // a numerical constant
+{
+
+public:
+
+    _Constant (_Parameter);
+    _Constant (_String&);
+    _Constant (void);
+    ~_Constant (void) {}
+
+    virtual _PMathObj Add           (_PMathObj);
+    virtual _PMathObj Sub           (_PMathObj);
+    virtual _PMathObj Minus         (void) ;
+    virtual _PMathObj Sum           (void) ;
+    virtual _PMathObj Mult          (_PMathObj);
+    virtual _PMathObj Div           (_PMathObj);
+    virtual _PMathObj lDiv          (_PMathObj);
+    virtual _PMathObj longDiv       (_PMathObj);
+    virtual _PMathObj Raise         (_PMathObj);
+    virtual void      Assign        (_PMathObj);
+    virtual bool      Equal         (_PMathObj);
+    virtual _PMathObj Abs           (void);
+    virtual _PMathObj Sin           (void);
+    virtual _PMathObj Cos           (void);
+    virtual _PMathObj Tan           (void);
+    virtual _PMathObj Exp           (void);
+    virtual _PMathObj Log           (void);
+    virtual _PMathObj Sqrt          (void);
+    virtual _PMathObj Time          (void);
+    virtual _PMathObj Arctan        (void);
+    virtual _PMathObj Gamma         (void);
+    virtual _PMathObj LnGamma       (void);         /* <- added by afyp, February 8, 2007 */
+    virtual _PMathObj Beta          (_PMathObj);
+    virtual _PMathObj Min           (_PMathObj);
+    virtual _PMathObj Max           (_PMathObj);
+    virtual _PMathObj GammaDist     (_PMathObj,_PMathObj);
+    virtual _PMathObj CGammaDist    (_PMathObj,_PMathObj);
+    virtual _PMathObj IBeta         (_PMathObj,_PMathObj);
+    virtual _PMathObj IGamma        (_PMathObj);
+    virtual _PMathObj CChi2         (_PMathObj);
+    virtual _PMathObj InvChi2       (_PMathObj);
+    virtual _PMathObj Erf           (void);
+    virtual _PMathObj ZCDF          (void);
+    virtual _PMathObj Less          (_PMathObj);
+    virtual _PMathObj Greater       (_PMathObj);
+    virtual _PMathObj LessEq        (_PMathObj);
+    virtual _PMathObj GreaterEq     (_PMathObj);
+    virtual _PMathObj AreEqual      (_PMathObj);
+    virtual _PMathObj NotEqual      (_PMathObj);
+    virtual _PMathObj LAnd          (_PMathObj);
+    virtual _PMathObj LOr           (_PMathObj);
+    virtual _PMathObj LNot          ();
+    virtual _PMathObj Random        (_PMathObj);
+    virtual _Parameter
+    Value       (void);
+    virtual _PMathObj FormatNumberString
+    (_PMathObj,_PMathObj);
+    virtual _PMathObj Compute       (void) {
+        return this;
+    };
+
+    virtual   void    Initialize            (void);
+    virtual   void    Duplicate             (BaseRef);
+    virtual   BaseRef makeDynamic           (void);
+    virtual   BaseRef toStr                 (void);
+    virtual   unsigned long    ObjectClass           (void) {
+        return NUMBER;
+    }
+    virtual   void    SetValue              (_Parameter pl) {
+        theValue = pl;
+    }
+
+public:
+    _Parameter theValue;
+};
+
+#endif
diff --git a/src/core/include/defines.h b/src/core/include/defines.h
new file mode 100644
index 0000000..7e1fed0
--- /dev/null
+++ b/src/core/include/defines.h
@@ -0,0 +1,298 @@
+/*
+
+HyPhy - Hypothesis Testing Using Phylogenies.
+
+Copyright (C) 1997-now
+Core Developers:
+  Sergei L Kosakovsky Pond (spond at ucsd.edu)
+  Art FY Poon    (apoon at cfenet.ubc.ca)
+  Steven Weaver (sweaver at ucsd.edu)
+  
+Module Developers:
+	Lance Hepler (nlhepler at gmail.com)
+	Martin Smith (martin.audacis at gmail.com)
+
+Significant contributions from:
+  Spencer V Muse (muse at stat.ncsu.edu)
+  Simon DW Frost (sdf22 at cam.ac.uk)
+
+Permission is hereby granted, free of charge, to any person obtaining a
+copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be included
+in all copies or substantial portions of the Software.
+
+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.
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+*/
+
+#ifndef     __DEFINES__
+#define     __DEFINES__
+
+#define  HY_UNDEFINED       0x00UL
+#define  NUMBER             0x01UL
+#define  MATRIX             0x04UL
+#define  CONTAINER          0x08UL
+#define  TREE_NODE          0x10UL
+#define  TREE               0x20UL
+#define  STRING             0x40UL
+#define  ASSOCIATIVE_LIST   0x80UL
+#define  TOPOLOGY           0x100UL
+#define  POLYNOMIAL         0x200UL
+#define  HY_ANY_OBJECT      0xFFFFUL
+
+#define  DEFAULTLOWERBOUND  -1e26
+#define  DEFAULTUPPERBOUND  1e26
+
+#define  GLOBAL_VARIABLE   1
+#define  CATEGORY_VARIABLE 2
+#define  RANDOM_VARIABLE   3
+
+#define  HY_VARIABLE_GLOBAL     0x01
+#define  HY_VARIABLE_CHANGED    0x02
+#define  HY_DEP_V_COMPUTED      0x04
+#define  HY_DEP_V_INSPECTED     0x08
+#define  HY_DEP_V_INSPECTED_CLR 0xF7
+#define  HY_DEP_V_MODIFIED      0x10
+#define  HY_DEP_V_MODIFIED_CATS 0x20
+#define  HY_VC_NO_CHECK         0x40 // do not check this variable container in 
+// NeedToExponentiate
+#define  HY_VARIABLE_NOTSET     0x80
+#define  HY_VARIABLE_SET        0x7F
+
+#define  HY_VC_CLR_NO_CHECK     0xBF
+
+#define  HY_DEP_CLEAR_MASK      0xC7
+
+#define  HY_NO_MODEL            (-1)
+
+#define  GOLDEN_RATIO 1.618034
+#define MAX_BRENT_ITERATES 100L
+
+// START OPCODES
+
+#define  HY_OP_CODE_NONE            -1                              // noop
+
+#define  HY_OP_CODE_NOT             0                               // !
+#define  HY_OP_CODE_NEQ             (1+HY_OP_CODE_NOT)              // !=
+#define  HY_OP_CODE_IDIV            (1+HY_OP_CODE_NEQ)              // $
+#define  HY_OP_CODE_MOD             (1+HY_OP_CODE_IDIV)             // %
+#define  HY_OP_CODE_REF             (1+HY_OP_CODE_MOD)              // &
+#define  HY_OP_CODE_AND             (1+HY_OP_CODE_REF)              // &&
+#define  HY_OP_CODE_MUL             (1+HY_OP_CODE_AND)              // *
+#define  HY_OP_CODE_ADD             (1+HY_OP_CODE_MUL)              // +
+#define  HY_OP_CODE_SUB             (1+HY_OP_CODE_ADD)          // -
+#define  HY_OP_CODE_DIV             (1+HY_OP_CODE_SUB)              // /
+#define  HY_OP_CODE_LESS            (1+HY_OP_CODE_DIV)  // <
+
+#define  HY_OP_CODE_LEQ             (1+HY_OP_CODE_LESS) // <=
+#define  HY_OP_CODE_EQ              (1+HY_OP_CODE_LEQ) // ==
+#define  HY_OP_CODE_GREATER         (1+HY_OP_CODE_EQ) // >
+#define  HY_OP_CODE_GEQ             (1+HY_OP_CODE_GREATER) // >=
+#define  HY_OP_CODE_ABS             (1+HY_OP_CODE_GEQ) // Abs
+#define  HY_OP_CODE_ARCTAN          (1+HY_OP_CODE_ABS) // Arctan
+#define  HY_OP_CODE_BETA            (1+HY_OP_CODE_ARCTAN) // Beta
+#define  HY_OP_CODE_BRANCHCOUNT     (1+HY_OP_CODE_BETA) // BranchCount
+#define  HY_OP_CODE_BRANCHLENGTH    (1+HY_OP_CODE_BRANCHCOUNT) // BranchLength
+#define  HY_OP_CODE_BRANCHNAME      (1+HY_OP_CODE_BRANCHLENGTH) // BranchName
+
+#define  HY_OP_CODE_CCHI2           (1+HY_OP_CODE_BRANCHNAME) // CChi2
+#define  HY_OP_CODE_CGAMMADIST      (1+HY_OP_CODE_CCHI2) // CGammaDist
+#define  HY_OP_CODE_COLUMNS         (1+HY_OP_CODE_CGAMMADIST) // Columns
+#define  HY_OP_CODE_COS             (1+HY_OP_CODE_COLUMNS) // Cos
+#define  HY_OP_CODE_DIFF            (1+HY_OP_CODE_COS) // D
+#define  HY_OP_CODE_EIGENSYSTEM     (1+HY_OP_CODE_DIFF) // Eigensystem
+#define  HY_OP_CODE_ERF             (1+HY_OP_CODE_EIGENSYSTEM) // Erf
+#define  HY_OP_CODE_EVAL            (1+HY_OP_CODE_ERF) // Eval
+#define  HY_OP_CODE_EXP             (1+HY_OP_CODE_EVAL) // Exp
+#define  HY_OP_CODE_FORMAT          (1+HY_OP_CODE_EXP) // Format
+#define  HY_OP_CODE_GAMMA           (1+HY_OP_CODE_FORMAT) // Gamma
+
+#define  HY_OP_CODE_GAMMADIST       (1+HY_OP_CODE_GAMMA) // GammaDist
+#define  HY_OP_CODE_IBETA           (1+HY_OP_CODE_GAMMADIST) // IBeta
+#define  HY_OP_CODE_IGAMMA          (1+HY_OP_CODE_IBETA) // IGamma
+#define  HY_OP_CODE_INVCHI2         (1+HY_OP_CODE_IGAMMA) // InvChi2
+#define  HY_OP_CODE_INVERSE         (1+HY_OP_CODE_INVCHI2) // Inverse
+#define  HY_OP_CODE_JOIN            (1+HY_OP_CODE_INVERSE) // Join
+#define  HY_OP_CODE_LUDECOMPOSE     (1+HY_OP_CODE_JOIN) // LUDecompose
+#define  HY_OP_CODE_LUSOLVE         (1+HY_OP_CODE_LUDECOMPOSE) // LUSolve
+#define  HY_OP_CODE_LNGAMMA         (1+HY_OP_CODE_LUSOLVE) // LnGamma
+#define  HY_OP_CODE_LOG             (1+HY_OP_CODE_LNGAMMA) // Log
+#define  HY_OP_CODE_MACCESS         (1+HY_OP_CODE_LOG) // MAccess
+#define  HY_OP_CODE_MCOORD          (1+HY_OP_CODE_MACCESS) // MCoord
+
+#define  HY_OP_CODE_MAX             (1+HY_OP_CODE_MCOORD) // Max
+#define  HY_OP_CODE_MIN             (1+HY_OP_CODE_MAX) // Min
+#define  HY_OP_CODE_PSTREESTRING    (1+HY_OP_CODE_MIN) // PSTreeString
+#define  HY_OP_CODE_RANDOM          (1+HY_OP_CODE_PSTREESTRING) // Random
+#define  HY_OP_CODE_REROOTTREE      (1+HY_OP_CODE_RANDOM) // RerootTree
+#define  HY_OP_CODE_ROWS            (1+HY_OP_CODE_REROOTTREE) // Rows
+#define  HY_OP_CODE_SIMPLEX         (1+HY_OP_CODE_ROWS) // Simplex
+#define  HY_OP_CODE_SIN             (1+HY_OP_CODE_SIMPLEX) // Sin
+#define  HY_OP_CODE_SQRT            (1+HY_OP_CODE_SIN) // Sqrt
+#define  HY_OP_CODE_TEXTREESTRING   (1+HY_OP_CODE_SQRT) // TEXTreeString
+
+#define  HY_OP_CODE_TAN             (1+HY_OP_CODE_TEXTREESTRING) // Tan
+#define  HY_OP_CODE_TIME            (1+HY_OP_CODE_TAN) // Time
+#define  HY_OP_CODE_TIPCOUNT        (1+HY_OP_CODE_TIME) // TipCount
+#define  HY_OP_CODE_TIPNAME         (1+HY_OP_CODE_TIPCOUNT) // TipName
+#define  HY_OP_CODE_TRANSPOSE       (1+HY_OP_CODE_TIPNAME) // Transpose
+#define  HY_OP_CODE_TYPE            (1+HY_OP_CODE_TRANSPOSE) // Type
+#define  HY_OP_CODE_ZCDF            (1+HY_OP_CODE_TYPE) // ZCDF
+#define  HY_OP_CODE_POWER           (1+HY_OP_CODE_ZCDF) // ^
+#define  HY_OP_CODE_OR              (1+HY_OP_CODE_POWER) // ||
+
+// END OPCODES
+
+// START FORMULA RETURN CODES
+
+#define  HY_FORMULA_EXPRESSION                          0
+#define  HY_FORMULA_FAILED                              (-1)
+#define  HY_FORMULA_VARIABLE_VALUE_ASSIGNMENT           1
+#define  HY_FORMULA_VARIABLE_FORMULA_ASSIGNMENT         2
+#define  HY_FORMULA_FORMULA_FORMULA_ASSIGNMENT          3
+#define  HY_FORMULA_FORMULA_VALUE_ASSIGNMENT            4
+#define  HY_FORMULA_VARIABLE_LOWER_BOUND_ASSIGNMENT     5
+#define  HY_FORMULA_VARIABLE_UPPER_BOUND_ASSIGNMENT     6
+#define  HY_FORMULA_FORMULA_VALUE_INCREMENT             7
+#define  HY_FORMULA_REFERENCE_VALUE_ASSIGNMENT          20
+#define  HY_FORMULA_REFERENCE_FORMULA_ASSIGNMENT        30
+
+#define  HY_FORMULA_REFERENCE_LOWER_BOUND_ASSIGNMENT    40
+#define  HY_FORMULA_REFERENCE_UPPER_BOUND_ASSIGNMENT    41
+
+// END FORMULA RETURN CODES
+
+//Some useful defines
+#define  HY_INVALID_RETURN_VALUE                        NAN
+#define  HY_CONSTANT_FALSE                              _Constant (0.0)
+#define  HY_CONSTANT_TRUE                               _Constant (1.0)
+
+#define   BL_FUNCTION_ALWAYS_UPDATE     0
+#define   BL_FUNCTION_NORMAL_UPDATE     1
+
+//!  Batch Language 'Object' type codes
+/*!
+     20110608 SLKP introduced.
+
+     Bit flag style type tags and masks
+     This is primarily to be used for object retrieval
+     using the _HYRetrieveBLObjectByName function
+     and in the _HY_GetStringGlobalTypes list
+*/
+
+#define   HY_BL_NOT_DEFINED             0
+#define   HY_BL_DATASET                 1
+#define   HY_BL_DATASET_FILTER          2
+#define   HY_BL_LIKELIHOOD_FUNCTION     4
+#define   HY_BL_SCFG                    8
+#define   HY_BL_BGM                     16
+#define   HY_BL_MODEL                   32
+#define   HY_BL_HBL_FUNCTION            64
+#define   HY_BL_TREE                    128
+#define   HY_BL_VARIABLE                256
+
+#define   HY_BL_ANY                     65535
+
+//!  Batch Lanuage Command Codes 
+/*!
+     20111222 SLKP introduced.
+     Define tags to replace ExecuteCaseWhatever
+
+*/
+
+#define   HY_HBL_COMMAND_FORMULA                                        0L
+
+#define   HY_HBL_COMMAND_FOR                                            500L
+#define   HY_HBL_COMMAND_WHILE                                          501L
+#define   HY_HBL_COMMAND_FUNCTION                                       502L
+#define   HY_HBL_COMMAND_FFUNCTION                                      503L
+#define   HY_HBL_COMMAND_RETURNSPACE                                    504L
+#define   HY_HBL_COMMAND_RETURNPAREN                                    505L
+#define   HY_HBL_COMMAND_IF                                             506L
+#define   HY_HBL_COMMAND_ELSE                                           507L
+#define   HY_HBL_COMMAND_DO                                             508L
+#define   HY_HBL_COMMAND_BREAK                                          509L
+#define   HY_HBL_COMMAND_CONTINUE                                       510L
+#define   HY_HBL_COMMAND_INCLUDE                                        511L
+#define   HY_HBL_COMMAND_DATA_SET                                       512L
+#define   HY_HBL_COMMAND_DATA_SET_FILTER                                513L
+#define   HY_HBL_COMMAND_HARVEST_FREQUENCIES                            514L
+#define   HY_HBL_COMMAND_CONSTRUCT_CATEGORY_MATRIX                      515L
+#define   HY_HBL_COMMAND_TREE                                           516L
+#define   HY_HBL_COMMAND_LIKELIHOOD_FUNCTION                            517L
+#define   HY_HBL_COMMAND_LIKELIHOOD_FUNCTION_3                          518L
+#define   HY_HBL_COMMAND_OPTIMIZE                                       519L
+#define   HY_HBL_COMMAND_COVARIANCE_MATRIX                              520L
+#define   HY_HBL_COMMAND_MOLECULAR_CLOCK                                521L
+#define   HY_HBL_COMMAND_FPRINTF                                        522L
+#define   HY_HBL_COMMAND_FSCANF                                         523L
+#define   HY_HBL_COMMAND_SSCANF                                         524L
+#define   HY_HBL_COMMAND_GET_STRING                                     525L
+#define   HY_HBL_COMMAND_EXPORT                                         526L
+#define   HY_HBL_COMMAND_IMPORT                                         527L
+#define   HY_HBL_COMMAND_CATEGORY                                       528L
+#define   HY_HBL_COMMAND_CLEAR_CONSTRAINTS                              529L
+#define   HY_HBL_COMMAND_SET_DIALOG_PROMPT                              530L
+#define   HY_HBL_COMMAND_SELECT_TEMPLATE_MODEL                          531L
+#define   HY_HBL_COMMAND_USE_MODEL                                      532L
+#define   HY_HBL_COMMAND_MODEL                                          533L
+#define   HY_HBL_COMMAND_SET_PARAMETER                                  534L
+#define   HY_HBL_COMMAND_SET_CHOICE_LIST                                535L
+#define   HY_HBL_COMMAND_OPEN_DATA_PANEL                                536L
+#define   HY_HBL_COMMAND_GET_INFORMATION                                537L
+#define   HY_HBL_COMMAND_EXECUTE_COMMANDS                               538L
+#define   HY_HBL_COMMAND_EXECUTE_A_FILE                                 539L
+#define   HY_HBL_COMMAND_LOAD_FUNCTION_LIBRARY                          541L
+#define   HY_HBL_COMMAND_OPEN_WINDOW                                    542L
+#define   HY_HBL_COMMAND_SPAWN_LIKELIHOOD_FUNCTION                      543L
+#define   HY_HBL_COMMAND_DIFFERENTIATE                                  544L
+#define   HY_HBL_COMMAND_FIND_ROOT                                      545L
+#define   HY_HBL_COMMAND_MPI_RECEIVE                                    546L
+#define   HY_HBL_COMMAND_MPI_SEND                                       547L
+#define   HY_HBL_COMMAND_GET_DATA_INFO                                  548L
+#define   HY_HBL_COMMAND_STATE_COUNTER                                  549L
+#define   HY_HBL_COMMAND_INTEGRATE                                      550L
+#define   HY_HBL_COMMAND_LFCOMPUTE                                      551L
+#define   HY_HBL_COMMAND_GET_URL                                        552L
+#define   HY_HBL_COMMAND_DO_SQL                                         553L
+#define   HY_HBL_COMMAND_TOPOLOGY                                       554L
+#define   HY_HBL_COMMAND_ALIGN_SEQUENCES                                555L
+#define   HY_HBL_COMMAND_GET_NEUTRAL_NULL                               556L
+#define   HY_HBL_COMMAND_PROFILE                                        557L
+#define   HY_HBL_COMMAND_DELETE_OBJECT                                  558L
+#define   HY_HBL_COMMAND_REQUIRE_VERSION                                559L
+#define   HY_HBL_COMMAND_SCFG                                           560L
+#define   HY_HBL_COMMAND_NEURAL_NET                                     561L
+#define   HY_HBL_COMMAND_BGM                                            562L
+#define   HY_HBL_COMMAND_SIMULATE_DATA_SET                              563L
+#define   HY_HBL_COMMAND_ASSERT                                         564L
+#define   HY_HBL_COMMAND_REPLICATE_CONSTRAINT                           565L
+
+
+//!  HyPhy standard directory locations 
+/*!
+    retrieve using _HYStandardDirectory
+
+*/
+
+#define   HY_HBL_DIRECTORY_TEMPLATE_MODELS                              1000L
+
+#define   HY_MAX_LONG_VALUE                                             0xffffffffL
+
+
+#define   HY_HBL_GET_STRING_BGM_SCORE                                   0L
+#define   HY_HBL_GET_STRING_BGM_SERIALIZE                               1L
+
+#endif
diff --git a/src/core/include/errorfns.h b/src/core/include/errorfns.h
new file mode 100644
index 0000000..6cdd57d
--- /dev/null
+++ b/src/core/include/errorfns.h
@@ -0,0 +1,91 @@
+/*
+
+HyPhy - Hypothesis Testing Using Phylogenies.
+
+Copyright (C) 1997-now
+Core Developers:
+  Sergei L Kosakovsky Pond (spond at ucsd.edu)
+  Art FY Poon    (apoon at cfenet.ubc.ca)
+  Steven Weaver (sweaver at ucsd.edu)
+  
+Module Developers:
+	Lance Hepler (nlhepler at gmail.com)
+	Martin Smith (martin.audacis at gmail.com)
+
+Significant contributions from:
+  Spencer V Muse (muse at stat.ncsu.edu)
+  Simon DW Frost (sdf22 at cam.ac.uk)
+
+Permission is hereby granted, free of charge, to any person obtaining a
+copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be included
+in all copies or substantial portions of the Software.
+
+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.
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+*/
+
+#ifndef _HERROR_
+#define _HERROR_
+//#pragma once
+#include "baseobj.h"
+
+#define  _HYNOERROR 1
+
+//successful execution marker
+
+extern  int      gError;
+extern  bool  isFixable;
+
+
+bool gStatus(void);
+// global Error Status
+
+bool isError (long);
+// checks ToolBox function return, and if it is abnormal,
+// sets the error status to true;
+
+//bool acknError (bool);
+// function acknoledges Error with either fixable (True) or terminal (False)
+// flag, the latter causes acknError to terminate the program
+// writes error number to stderror
+
+void acknError (const char*);
+// function acknoledges Error with either fixable (True) or terminal (False)
+// flag, the latter causes acknError to terminate the program
+// writes error number to stderror
+
+void    warnError (const char*);
+// warns user of current error with a supplied string
+// writes to stderror
+
+void    warnError (long);
+// warns user of current error with a built in string
+// writes to stderror
+
+void    flagError (long);
+// reports the text of current error to the user with a built in string
+// writes to stderror
+// terminates execution of current BF
+
+void*   checkPointer  (void*);
+
+#if !defined __UNIX__  && !defined __HEADLESS__
+extern bool skipWarningMessages;
+#endif
+
+#endif
+
+
diff --git a/src/core/include/formula.h b/src/core/include/formula.h
new file mode 100644
index 0000000..547d835
--- /dev/null
+++ b/src/core/include/formula.h
@@ -0,0 +1,218 @@
+/*
+ 
+ HyPhy - Hypothesis Testing Using Phylogenies.
+ 
+ Copyright (C) 1997-now
+ Core Developers:
+ Sergei L Kosakovsky Pond (spond at ucsd.edu)
+ Art FY Poon    (apoon at cfenet.ubc.ca)
+ Steven Weaver (sweaver at ucsd.edu)
+ 
+ Module Developers:
+ Lance Hepler (nlhepler at gmail.com)
+ Martin Smith (martin.audacis at gmail.com)
+ 
+ Significant contributions from:
+ Spencer V Muse (muse at stat.ncsu.edu)
+ Simon DW Frost (sdf22 at cam.ac.uk)
+ 
+ Permission is hereby granted, free of charge, to any person obtaining a
+ copy of this software and associated documentation files (the
+ "Software"), to deal in the Software without restriction, including
+ without limitation the rights to use, copy, modify, merge, publish,
+ distribute, sublicense, and/or sell copies of the Software, and to
+ permit persons to whom the Software is furnished to do so, subject to
+ the following conditions:
+ 
+ The above copyright notice and this permission notice shall be included
+ in all copies or substantial portions of the Software.
+ 
+ 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.
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ 
+ */
+
+#ifndef     __FORMULAS__
+#define     __FORMULAS__
+
+#include "baseobj.h"
+#include "classes.h"
+#include "defines.h"
+#include "avllistx.h"
+#include "stack.h"
+#include "operation.h"
+
+class _Variable;
+class _VariableContainer;
+
+
+union       _SimpleFormulaDatum {
+    _Parameter value;
+    Ptr        reference;
+};
+
+
+class _FormulaParsingContext {
+
+    long                 assignment_ref_id;
+    char                 assignment_ref_type;
+    bool                 is_volatile;
+    _String            * err_msg;
+    _VariableContainer * formula_scope;
+    
+    public:
+        _FormulaParsingContext (_String* = nil, _VariableContainer* = nil);
+        bool&       isVolatile (void)                   { return is_volatile; }
+        long&       assignmentRefID (void)              { return assignment_ref_id; }
+        char&       assignmentRefType (void)            { return assignment_ref_type;} 
+        _String*    errMsg (void)                       { return err_msg; }
+        _VariableContainer* formulaScope (void)         { return formula_scope; }     
+        _String     contextualizeRef (_String&);
+};
+
+
+class   _Formula   // a computational formula
+{
+
+    friend class _Variable;
+    friend class _VariableContainer;
+
+public:
+    _Formula (void);
+    _Formula (_String&,_VariableContainer* theParent=nil,_String* errorString = nil);
+    _Formula (_PMathObj, bool isAVar = false);
+    virtual ~_Formula (void);
+    _PMathObj   Compute             (long = 0, _VariableContainer* = nil, _List* additionalCacheArguments = nil, _String *errMsg = nil);
+    // compute the value of the formula
+    // 1st argument : execute from this instruction onwards
+    // see the commend for ExecuteFormula for the second argument
+
+    bool        IsEmpty             (void); // is there anything in the formula
+    long        NumberOperations    (void); // how many ops in the formula?
+
+    friend  long        Parse               (_Formula*, _String&, _FormulaParsingContext&, _Formula*); 
+    // the main expression parser
+    
+    friend  long        ExecuteFormula      (_Formula*, _Formula*, long, long, _VariableContainer*, char);
+    // the execution block for "compiled formulae
+    /*
+     SLKP 20100119: added an execution name space to allow correct scoping of "pass-by-reference"
+                    arguments when calling ExecuteAFile within a namespace.
+
+                    e.g. in
+
+                    function foo (var&)
+                    {
+                        ...
+                    }
+
+                    foo ("varID");
+
+                    varID may need to be prefixed by a namespace ID.
+     */
+
+    bool        CheckFormula        (void); // check to see if this formula is valid and compute the obj class
+
+    _MathObject*ConstructPolynomial (void);
+
+    virtual void        Initialize          (void);
+    virtual void        Duplicate           (BaseRef);
+    void        DuplicateReference  (const _Formula*);
+    virtual BaseRef     makeDynamic         (void);
+    virtual BaseRef     toStr               (_List* matchNames = nil, bool = false);
+
+    virtual long        ObjectClass         (void);
+
+
+    virtual void        ScanFForVariables   (_AVLList&l, bool includeGlobals = false, bool includeAll = false, bool includeCateg = true, bool skipMatrixAssignments = false, _AVLListX* tagger = nil, long weight = 0);
+    virtual void        ScanFForType        (_SimpleList&,  int);
+    /* SLKP 20100716:
+            A simple utility function to retrieve all variables of a given type
+     */
+
+    virtual bool        CheckFForDependence (long, bool checkAll = false);
+    _List&      GetList             (void) {
+        return theFormula;
+    }
+
+    bool        HasChanged          (bool = false); // does  the formula need recomputing
+    bool        HasChangedSimple    (_SimpleList&);
+    bool        EqualFormula        (_Formula*);
+    bool        IsAConstant         (void); //  does this formula include variables, or is it just a constant?
+    bool        IsConstant          (void); //  does this formula depend on something other that constants and fixed parameters?
+    bool        DependsOnVariable   (long);
+    bool        IsArrayAccess       (void); // check to see if this formula performs a matrix access
+    /*
+        SLKP 20090315: added a missing utility function
+        given a variable index as an argument, returns true if
+        the formula depends on a it; false otherwise
+    */
+    _Operation* GetIthTerm          (long);
+    /*
+        SLKP 20090315: added a missing utility function
+        given an index (i) as the argument, the function retrieves
+        the i-th term of the formula
+    */
+    void        Clear               (void);
+    _PMathObj   GetTheMatrix        (void);
+
+    bool        AmISimple           (long& stackDepth, _SimpleList& variableIndex);
+    bool        ConvertToSimple     (_SimpleList& variableIndex);
+    void        ConvertFromSimple   (_SimpleList& variableIndex);
+    void        SimplifyConstants   (void);
+    _Variable * Dereference         (bool, _hyExecutionContext* = _hyDefaultExecutionContext);
+
+    _Parameter  ComputeSimple       (_SimpleFormulaDatum* stack, _SimpleFormulaDatum* varValues) ;
+
+    _Parameter  Newton              (_Formula&, _Variable*,  _Parameter, _Parameter, _Parameter);
+    _Parameter  Newton              (_Formula&, _Parameter, _Parameter, _Parameter, _Variable*);
+    _Parameter  Newton              (_Variable*,  _Parameter, _Parameter, _Parameter, _Parameter);
+    _Parameter  Newton              (_Variable*,_Parameter, _Parameter, _Parameter);
+
+    _Parameter  Brent               (_Variable*, _Parameter, _Parameter, _Parameter = 1.e-7, _List* = nil, _Parameter = 0.);
+
+    _Parameter  Integral            (_Variable*,_Parameter, _Parameter, bool inifinite = false);
+    _Parameter  MeanIntegral        (_Variable*,_Parameter, _Parameter, bool inifinite = false);
+    _Formula*   Differentiate       (_String, bool = true);
+    node<long>* InternalDifferentiate
+    (node<long>*, long,_SimpleList&, _SimpleList&, _Formula&);
+
+    bool        InternalSimplify    (node<long>*);
+
+    void        LocalizeFormula           (_Formula&, _String& parentName, _SimpleList& iv, _SimpleList& iiv, _SimpleList& dv, _SimpleList& idv);
+    void        ConvertMatrixArgumentsToSimpleOrComplexForm (bool);
+    long        ExtractMatrixExpArguments        (_List*);
+    
+    virtual     _Formula operator + (const _Formula&);
+    virtual     _Formula operator - (const _Formula&);
+    virtual     _Formula operator * (const _Formula&);
+    virtual     _Formula operator / (const _Formula&);
+    virtual     _Formula operator ^ (const _Formula&);
+    
+    _Formula&        PatchFormulasTogether (_Formula&, const _Formula&, const char op_code);
+
+protected:
+
+    void        internalToStr       (_String& result,node<long>*, char opLevel, _List* matchNames, _Operation* = nil);
+    void        ConvertToTree       (bool err_msg = true);
+    void        ConvertFromTree     (void);
+    bool        CheckSimpleTerm     (_PMathObj);
+    node<long>* DuplicateFormula    (node<long>*,_Formula&);
+
+    _List       theFormula,
+                *resultCache;
+
+    _Stack      theStack;
+    node<long>* theTree; // this formula converted to a tree for operation purposes
+    // such as simplification, differentiation and printing.
+    // trees store numbers referencing operations inside
+    // "theFormula"
+
+};
+
+#endif
diff --git a/src/core/include/fstring.h b/src/core/include/fstring.h
new file mode 100644
index 0000000..32f5762
--- /dev/null
+++ b/src/core/include/fstring.h
@@ -0,0 +1,110 @@
+/*
+ 
+ HyPhy - Hypothesis Testing Using Phylogenies.
+ 
+ Copyright (C) 1997-now
+ Core Developers:
+ Sergei L Kosakovsky Pond (spond at ucsd.edu)
+ Art FY Poon    (apoon at cfenet.ubc.ca)
+ Steven Weaver (sweaver at ucsd.edu)
+ 
+ Module Developers:
+ Lance Hepler (nlhepler at gmail.com)
+ Martin Smith (martin.audacis at gmail.com)
+ 
+ Significant contributions from:
+ Spencer V Muse (muse at stat.ncsu.edu)
+ Simon DW Frost (sdf22 at cam.ac.uk)
+ 
+ Permission is hereby granted, free of charge, to any person obtaining a
+ copy of this software and associated documentation files (the
+ "Software"), to deal in the Software without restriction, including
+ without limitation the rights to use, copy, modify, merge, publish,
+ distribute, sublicense, and/or sell copies of the Software, and to
+ permit persons to whom the Software is furnished to do so, subject to
+ the following conditions:
+ 
+ The above copyright notice and this permission notice shall be included
+ in all copies or substantial portions of the Software.
+ 
+ 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.
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ 
+ */
+
+#ifndef     __FSTRING__
+#define     __FSTRING__
+
+#include "mathobj.h"
+#include "_hyExecutionContext.h"
+
+//__________________________________________________________________________________
+
+class _FString : public _MathObject   // strings encountered in formulas
+{
+
+public:
+
+    _FString (_String&, bool = true);
+    _FString (long);
+    _FString (_String*);
+    _FString (void);
+    virtual  ~_FString ();
+//  ~_Constant (void);
+
+    virtual BaseRef   makeDynamic       (void);
+    virtual void      Duplicate         (BaseRef);
+    virtual _PMathObj Add               (_PMathObj);
+    virtual long      AddOn             (_PMathObj);
+    virtual _PMathObj AreEqual          (_PMathObj);
+    virtual _PMathObj AreEqualCIS       (_PMathObj);
+    virtual _PMathObj Less              (_PMathObj);
+    virtual _PMathObj LessEq            (_PMathObj);
+    virtual _PMathObj Greater           (_PMathObj);
+    virtual _PMathObj GreaterEq         (_PMathObj);
+    virtual _PMathObj NotEqual          (_PMathObj);
+    virtual _PMathObj RerootTree        (void);
+    virtual _PMathObj EqualAmb          (_PMathObj);
+    virtual _PMathObj EqualRegExp       (_PMathObj,bool = false);
+    virtual _PMathObj ReplaceReqExp     (_PMathObj);
+    virtual _PMathObj CountGlobalObjects(void);
+    virtual _PMathObj FileExists        (void);
+    virtual _PMathObj Evaluate          (_hyExecutionContext* context = _hyDefaultExecutionContext);
+    virtual _PMathObj Join              (_PMathObj);
+    virtual _PMathObj Differentiate     (_PMathObj);
+    virtual unsigned long      ObjectClass       (void) {
+        return STRING;
+    }
+    virtual _PMathObj Compute           (void) {
+        return this;
+    }
+    _PMathObj         Dereference       (bool ignore_context, _hyExecutionContext* context = _hyDefaultExecutionContext, bool return_variable_ref = false);
+
+    virtual _PMathObj MapStringToVector (_PMathObj);
+    virtual _PMathObj CharAccess        (_PMathObj,_PMathObj);
+    virtual _PMathObj Execute           (long opCode, _MathObject* p = nil , _MathObject* p2 = nil, _hyExecutionContext* context = _hyDefaultExecutionContext);
+    virtual BaseRef   toStr             (void);
+
+    virtual bool      IsVariable        (void) {
+        return true;
+    }
+
+    virtual bool      HasChanged        (void) {
+        return true;
+    }
+
+    virtual bool      IsEmpty           (void) {
+        return !theString || theString->sLength == 0;
+    }
+    // SLKP 20100907: a simple utility function to check if the object is an empty string
+
+    _String*          theString;
+
+};
+
+#endif
diff --git a/src/core/include/gnuregex.h b/src/core/include/gnuregex.h
new file mode 100644
index 0000000..26faa6e
--- /dev/null
+++ b/src/core/include/gnuregex.h
@@ -0,0 +1,490 @@
+/* Definitions for data structures and routines for the regular
+   expression library, version 0.12.
+
+   Copyright (C) 1985, 1989, 1990, 1991, 1992, 1993 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 2, 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., 675 Mass Ave, Cambridge, MA 02139, USA.  */
+
+#ifndef __REGEXP_LIBRARY_H__
+#define __REGEXP_LIBRARY_H__
+
+/* POSIX says that <sys/types.h> must be included (by the caller) before
+   <regex.h>.  */
+
+#ifdef VMS
+/* VMS doesn't have `size_t' in <sys/types.h>, even though POSIX says it
+   should be there.  */
+#include <stddef.h>
+#endif
+
+#ifndef __STDC__
+#define __STDC__
+#endif
+
+/* The following bits are used to determine the regexp syntax we
+   recognize.  The set/not-set meanings are chosen so that Emacs syntax
+   remains the value 0.  The bits are given in alphabetical order, and
+   the definitions shifted by one from the previous bit; thus, when we
+   add or remove a bit, only one other definition need change.  */
+typedef unsigned reg_syntax_t;
+
+/* If this bit is not set, then \ inside a bracket expression is literal.
+   If set, then such a \ quotes the following character.  */
+#define RE_BACKSLASH_ESCAPE_IN_LISTS (1)
+
+/* If this bit is not set, then + and ? are operators, and \+ and \? are
+     literals.
+   If set, then \+ and \? are operators and + and ? are literals.  */
+#define RE_BK_PLUS_QM (RE_BACKSLASH_ESCAPE_IN_LISTS << 1)
+
+/* If this bit is set, then character classes are supported.  They are:
+     [:alpha:], [:upper:], [:lower:],  [:digit:], [:alnum:], [:xdigit:],
+     [:space:], [:print:], [:punct:], [:graph:], and [:cntrl:].
+   If not set, then character classes are not supported.  */
+#define RE_CHAR_CLASSES (RE_BK_PLUS_QM << 1)
+
+/* If this bit is set, then ^ and $ are always anchors (outside bracket
+     expressions, of course).
+   If this bit is not set, then it depends:
+        ^  is an anchor if it is at the beginning of a regular
+           expression or after an open-group or an alternation operator;
+        $  is an anchor if it is at the end of a regular expression, or
+           before a close-group or an alternation operator.
+
+   This bit could be (re)combined with RE_CONTEXT_INDEP_OPS, because
+   POSIX draft 11.2 says that * etc. in leading positions is undefined.
+   We already implemented a previous draft which made those constructs
+   invalid, though, so we haven't changed the code back.  */
+#define RE_CONTEXT_INDEP_ANCHORS (RE_CHAR_CLASSES << 1)
+
+/* If this bit is set, then special characters are always special
+     regardless of where they are in the pattern.
+   If this bit is not set, then special characters are special only in
+     some contexts; otherwise they are ordinary.  Specifically,
+     * + ? and intervals are only special when not after the beginning,
+     open-group, or alternation operator.  */
+#define RE_CONTEXT_INDEP_OPS (RE_CONTEXT_INDEP_ANCHORS << 1)
+
+/* If this bit is set, then *, +, ?, and { cannot be first in an re or
+     immediately after an alternation or begin-group operator.  */
+#define RE_CONTEXT_INVALID_OPS (RE_CONTEXT_INDEP_OPS << 1)
+
+/* If this bit is set, then . matches newline.
+   If not set, then it doesn't.  */
+#define RE_DOT_NEWLINE (RE_CONTEXT_INVALID_OPS << 1)
+
+/* If this bit is set, then . doesn't match NUL.
+   If not set, then it does.  */
+#define RE_DOT_NOT_NULL (RE_DOT_NEWLINE << 1)
+
+/* If this bit is set, nonmatching lists [^...] do not match newline.
+   If not set, they do.  */
+#define RE_HAT_LISTS_NOT_NEWLINE (RE_DOT_NOT_NULL << 1)
+
+/* If this bit is set, either \{...\} or {...} defines an
+     interval, depending on RE_NO_BK_BRACES.
+   If not set, \{, \}, {, and } are literals.  */
+#define RE_INTERVALS (RE_HAT_LISTS_NOT_NEWLINE << 1)
+
+/* If this bit is set, +, ? and | aren't recognized as operators.
+   If not set, they are.  */
+#define RE_LIMITED_OPS (RE_INTERVALS << 1)
+
+/* If this bit is set, newline is an alternation operator.
+   If not set, newline is literal.  */
+#define RE_NEWLINE_ALT (RE_LIMITED_OPS << 1)
+
+/* If this bit is set, then `{...}' defines an interval, and \{ and \}
+     are literals.
+  If not set, then `\{...\}' defines an interval.  */
+#define RE_NO_BK_BRACES (RE_NEWLINE_ALT << 1)
+
+/* If this bit is set, (...) defines a group, and \( and \) are literals.
+   If not set, \(...\) defines a group, and ( and ) are literals.  */
+#define RE_NO_BK_PARENS (RE_NO_BK_BRACES << 1)
+
+/* If this bit is set, then \<digit> matches <digit>.
+   If not set, then \<digit> is a back-reference.  */
+#define RE_NO_BK_REFS (RE_NO_BK_PARENS << 1)
+
+/* If this bit is set, then | is an alternation operator, and \| is literal.
+   If not set, then \| is an alternation operator, and | is literal.  */
+#define RE_NO_BK_VBAR (RE_NO_BK_REFS << 1)
+
+/* If this bit is set, then an ending range point collating higher
+     than the starting range point, as in [z-a], is invalid.
+   If not set, then when ending range point collates higher than the
+     starting range point, the range is ignored.  */
+#define RE_NO_EMPTY_RANGES (RE_NO_BK_VBAR << 1)
+
+/* If this bit is set, then an unmatched ) is ordinary.
+   If not set, then an unmatched ) is invalid.  */
+#define RE_UNMATCHED_RIGHT_PAREN_ORD (RE_NO_EMPTY_RANGES << 1)
+
+/* This global variable defines the particular regexp syntax to use (for
+   some interfaces).  When a regexp is compiled, the syntax used is
+   stored in the pattern buffer, so changing this does not affect
+   already-compiled regexps.  */
+extern reg_syntax_t re_syntax_options;
+

+/* Define combinations of the above bits for the standard possibilities.
+   (The [[[ comments delimit what gets put into the Texinfo file, so
+   don't delete them!)  */
+/* [[[begin syntaxes]]] */
+#define RE_SYNTAX_EMACS 0
+
+#define RE_SYNTAX_AWK                           \
+  (RE_BACKSLASH_ESCAPE_IN_LISTS | RE_DOT_NOT_NULL           \
+   | RE_NO_BK_PARENS            | RE_NO_BK_REFS             \
+   | RE_NO_BK_VBAR               | RE_NO_EMPTY_RANGES           \
+   | RE_UNMATCHED_RIGHT_PAREN_ORD)
+
+#define RE_SYNTAX_POSIX_AWK                         \
+  (RE_SYNTAX_POSIX_EXTENDED | RE_BACKSLASH_ESCAPE_IN_LISTS)
+
+#define RE_SYNTAX_GREP                          \
+  (RE_BK_PLUS_QM              | RE_CHAR_CLASSES             \
+   | RE_HAT_LISTS_NOT_NEWLINE | RE_INTERVALS                \
+   | RE_NEWLINE_ALT)
+
+#define RE_SYNTAX_EGREP                         \
+  (RE_CHAR_CLASSES        | RE_CONTEXT_INDEP_ANCHORS            \
+   | RE_CONTEXT_INDEP_OPS | RE_HAT_LISTS_NOT_NEWLINE            \
+   | RE_NEWLINE_ALT       | RE_NO_BK_PARENS             \
+   | RE_NO_BK_VBAR)
+
+#define RE_SYNTAX_POSIX_EGREP                       \
+  (RE_SYNTAX_EGREP | RE_INTERVALS | RE_NO_BK_BRACES)
+
+/* P1003.2/D11.2, section 4.20.7.1, lines 5078ff.  */
+#define RE_SYNTAX_ED RE_SYNTAX_POSIX_BASIC
+
+#define RE_SYNTAX_SED RE_SYNTAX_POSIX_BASIC
+
+/* Syntax bits common to both basic and extended POSIX regex syntax.  */
+#define _RE_SYNTAX_POSIX_COMMON                     \
+  (RE_CHAR_CLASSES | RE_DOT_NEWLINE      | RE_DOT_NOT_NULL      \
+   | RE_INTERVALS  | RE_NO_EMPTY_RANGES)
+
+#define RE_SYNTAX_POSIX_BASIC                       \
+  (_RE_SYNTAX_POSIX_COMMON | RE_BK_PLUS_QM)
+
+/* Differs from ..._POSIX_BASIC only in that RE_BK_PLUS_QM becomes
+   RE_LIMITED_OPS, i.e., \? \+ \| are not recognized.  Actually, this
+   isn't minimal, since other operators, such as \`, aren't disabled.  */
+#define RE_SYNTAX_POSIX_MINIMAL_BASIC                   \
+  (_RE_SYNTAX_POSIX_COMMON | RE_LIMITED_OPS)
+
+#define RE_SYNTAX_POSIX_EXTENDED                    \
+  (_RE_SYNTAX_POSIX_COMMON | RE_CONTEXT_INDEP_ANCHORS           \
+   | RE_CONTEXT_INDEP_OPS  | RE_NO_BK_BRACES                \
+   | RE_NO_BK_PARENS       | RE_NO_BK_VBAR              \
+   | RE_UNMATCHED_RIGHT_PAREN_ORD)
+
+/* Differs from ..._POSIX_EXTENDED in that RE_CONTEXT_INVALID_OPS
+   replaces RE_CONTEXT_INDEP_OPS and RE_NO_BK_REFS is added.  */
+#define RE_SYNTAX_POSIX_MINIMAL_EXTENDED                \
+  (_RE_SYNTAX_POSIX_COMMON  | RE_CONTEXT_INDEP_ANCHORS          \
+   | RE_CONTEXT_INVALID_OPS | RE_NO_BK_BRACES               \
+   | RE_NO_BK_PARENS        | RE_NO_BK_REFS             \
+   | RE_NO_BK_VBAR      | RE_UNMATCHED_RIGHT_PAREN_ORD)
+/* [[[end syntaxes]]] */
+

+/* Maximum number of duplicates an interval can allow.  Some systems
+   (erroneously) define this in other header files, but we want our
+   value, so remove any previous define.  */
+#ifdef RE_DUP_MAX
+#undef RE_DUP_MAX
+#endif
+#define RE_DUP_MAX ((1 << 15) - 1)
+
+
+/* POSIX `cflags' bits (i.e., information for `regcomp').  */
+
+/* If this bit is set, then use extended regular expression syntax.
+   If not set, then use basic regular expression syntax.  */
+#define REG_EXTENDED 1
+
+/* If this bit is set, then ignore case when matching.
+   If not set, then case is significant.  */
+#define REG_ICASE (REG_EXTENDED << 1)
+
+/* If this bit is set, then anchors do not match at newline
+     characters in the string.
+   If not set, then anchors do match at newlines.  */
+#define REG_NEWLINE (REG_ICASE << 1)
+
+/* If this bit is set, then report only success or fail in regexec.
+   If not set, then returns differ between not matching and errors.  */
+#define REG_NOSUB (REG_NEWLINE << 1)
+
+
+/* POSIX `eflags' bits (i.e., information for regexec).  */
+
+/* If this bit is set, then the beginning-of-line operator doesn't match
+     the beginning of the string (presumably because it's not the
+     beginning of a line).
+   If not set, then the beginning-of-line operator does match the
+     beginning of the string.  */
+#define REG_NOTBOL 1
+
+/* Like REG_NOTBOL, except for the end-of-line.  */
+#define REG_NOTEOL (1 << 1)
+
+
+/* If any error codes are removed, changed, or added, update the
+   `re_error_msg' table in regex.c.  */
+typedef enum {
+    REG_NOERROR = 0,    /* Success.  */
+    REG_NOMATCH,        /* Didn't find a match (for regexec).  */
+
+    /* POSIX regcomp return error codes.  (In the order listed in the
+       standard.)  */
+    REG_BADPAT,     /* Invalid pattern.  */
+    REG_ECOLLATE,       /* Not implemented.  */
+    REG_ECTYPE,     /* Invalid character class name.  */
+    REG_EESCAPE,        /* Trailing backslash.  */
+    REG_ESUBREG,        /* Invalid back reference.  */
+    REG_EBRACK,     /* Unmatched left bracket.  */
+    REG_EPAREN,     /* Parenthesis imbalance.  */
+    REG_EBRACE,     /* Unmatched \{.  */
+    REG_BADBR,      /* Invalid contents of \{\}.  */
+    REG_ERANGE,     /* Invalid range end.  */
+    REG_ESPACE,     /* Ran out of memory.  */
+    REG_BADRPT,     /* No preceding re for repetition op.  */
+
+    /* Error codes we've added.  */
+    REG_EEND,       /* Premature end.  */
+    REG_ESIZE,      /* Compiled pattern bigger than 2^16 bytes.  */
+    REG_ERPAREN     /* Unmatched ) or \); not returned from regcomp.  */
+} reg_errcode_t;
+

+/* This data structure represents a compiled pattern.  Before calling
+   the pattern compiler, the fields `buffer', `allocated', `fastmap',
+   `translate', and `no_sub' can be set.  After the pattern has been
+   compiled, the `re_nsub' field is available.  All other fields are
+   private to the regex routines.  */
+
+struct re_pattern_buffer {
+    /* [[[begin pattern_buffer]]] */
+    /* Space that holds the compiled pattern.  It is declared as
+          `unsigned char *' because its elements are
+           sometimes used as array indexes.  */
+    unsigned char *buffer;
+
+    /* Number of bytes to which `buffer' points.  */
+    unsigned long allocated;
+
+    /* Number of bytes actually used in `buffer'.  */
+    unsigned long used;
+
+    /* Syntax setting with which the pattern was compiled.  */
+    reg_syntax_t syntax;
+
+    /* Pointer to a fastmap, if any, otherwise zero.  re_search uses
+       the fastmap, if there is one, to skip over impossible
+       starting points for matches.  */
+    char *fastmap;
+
+    /* Either a translate table to apply to all characters before
+       comparing them, or zero for no translation.  The translation
+       is applied to a pattern when it is compiled and to a string
+       when it is matched.  */
+    char *translate;
+
+    /* Number of subexpressions found by the compiler.  */
+    size_t re_nsub;
+
+    /* Zero if this pattern cannot match the empty string, one else.
+       Well, in truth it's used only in `re_search_2', to see
+       whether or not we should use the fastmap, so we don't set
+       this absolutely perfectly; see `re_compile_fastmap' (the
+       `duplicate' case).  */
+    unsigned can_be_null : 1;
+
+    /* If REGS_UNALLOCATED, allocate space in the `regs' structure
+         for `max (RE_NREGS, re_nsub + 1)' groups.
+       If REGS_REALLOCATE, reallocate space if necessary.
+       If REGS_FIXED, use what's there.  */
+#define REGS_UNALLOCATED 0
+#define REGS_REALLOCATE 1
+#define REGS_FIXED 2
+    unsigned regs_allocated : 2;
+
+    /* Set to zero when `regex_compile' compiles a pattern; set to one
+       by `re_compile_fastmap' if it updates the fastmap.  */
+    unsigned fastmap_accurate : 1;
+
+    /* If set, `re_match_2' does not return information about
+       subexpressions.  */
+    unsigned no_sub : 1;
+
+    /* If set, a beginning-of-line anchor doesn't match at the
+       beginning of the string.  */
+    unsigned not_bol : 1;
+
+    /* Similarly for an end-of-line anchor.  */
+    unsigned not_eol : 1;
+
+    /* If true, an anchor at a newline matches.  */
+    unsigned newline_anchor : 1;
+
+    /* [[[end pattern_buffer]]] */
+};
+
+typedef struct re_pattern_buffer regex_t;
+
+
+/* search.c (search_buffer) in Emacs needs this one opcode value.  It is
+   defined both in `regex.c' and here.  */
+#define RE_EXACTN_VALUE 1
+

+/* Type for byte offsets within the string.  POSIX mandates this.  */
+typedef int regoff_t;
+
+
+/* This is the structure we store register match data in.  See
+   regex.texinfo for a full description of what registers match.  */
+struct re_registers {
+    unsigned num_regs;
+    regoff_t *start;
+    regoff_t *end;
+};
+
+
+/* If `regs_allocated' is REGS_UNALLOCATED in the pattern buffer,
+   `re_match_2' returns information about at least this many registers
+   the first time a `regs' structure is passed.  */
+#ifndef RE_NREGS
+#define RE_NREGS 30
+#endif
+
+
+/* POSIX specification for registers.  Aside from the different names than
+   `re_registers', POSIX uses an array of structures, instead of a
+   structure of arrays.  */
+typedef struct {
+    regoff_t rm_so;  /* Byte offset from string's start to substring's start.  */
+    regoff_t rm_eo;  /* Byte offset from string's start to substring's end.  */
+} regmatch_t;
+

+/* Declarations for routines.  */
+
+/* To avoid duplicating every routine declaration -- once with a
+   prototype (if we are ANSI), and once without (if we aren't) -- we
+   use the following macro to declare argument types.  This
+   unfortunately clutters up the declarations a bit, but I think it's
+   worth it.  */
+
+
+#ifdef __STDC__
+
+#define _RE_ARGS(args) args
+
+#else
+
+#define _RE_ARGS(args) ()
+
+#endif /* not __STDC__ */
+
+/* Sets the current default syntax to SYNTAX, and return the old syntax.
+   You can also simply assign to the `re_syntax_options' variable.  */
+extern reg_syntax_t re_set_syntax _RE_ARGS ((reg_syntax_t syntax));
+
+/* Compile the regular expression PATTERN, with length LENGTH
+   and syntax given by the global `re_syntax_options', into the buffer
+   BUFFER.  Return NULL if successful, and an error string if not.  */
+extern const char *re_compile_pattern
+_RE_ARGS ((const char *pattern, int length,
+           struct re_pattern_buffer *buffer));
+
+
+/* Compile a fastmap for the compiled pattern in BUFFER; used to
+   accelerate searches.  Return 0 if successful and -2 if was an
+   internal error.  */
+extern int re_compile_fastmap _RE_ARGS ((struct re_pattern_buffer *buffer));
+
+
+/* Search in the string STRING (with length LENGTH) for the pattern
+   compiled into BUFFER.  Start searching at position START, for RANGE
+   characters.  Return the starting position of the match, -1 for no
+   match, or -2 for an internal error.  Also return register
+   information in REGS (if REGS and BUFFER->no_sub are nonzero).  */
+extern int re_search
+_RE_ARGS ((struct re_pattern_buffer *buffer, const char *string,
+           int length, int start, int range, struct re_registers *regs));
+
+
+/* Like `re_search', but search in the concatenation of STRING1 and
+   STRING2.  Also, stop searching at index START + STOP.  */
+extern int re_search_2
+_RE_ARGS ((struct re_pattern_buffer *buffer, const char *string1,
+           int length1, const char *string2, int length2,
+           int start, int range, struct re_registers *regs, int stop));
+
+
+/* Like `re_search', but return how many characters in STRING the regexp
+   in BUFFER matched, starting at position START.  */
+extern int re_match
+_RE_ARGS ((struct re_pattern_buffer *buffer, const char *string,
+           int length, int start, struct re_registers *regs));
+
+
+/* Relates to `re_match' as `re_search_2' relates to `re_search'.  */
+extern int re_match_2
+_RE_ARGS ((struct re_pattern_buffer *buffer, const char *string1,
+           int length1, const char *string2, int length2,
+           int start, struct re_registers *regs, int stop));
+
+
+/* Set REGS to hold NUM_REGS registers, storing them in STARTS and
+   ENDS.  Subsequent matches using BUFFER and REGS will use this memory
+   for recording register information.  STARTS and ENDS must be
+   allocated with malloc, and must each be at least `NUM_REGS * sizeof
+   (regoff_t)' bytes long.
+
+   If NUM_REGS == 0, then subsequent matches should allocate their own
+   register data.
+
+   Unless this function is called, the first search or match using
+   PATTERN_BUFFER will allocate its own register data, without
+   freeing the old data.  */
+extern void re_set_registers
+_RE_ARGS ((struct re_pattern_buffer *buffer, struct re_registers *regs,
+           unsigned num_regs, regoff_t *starts, regoff_t *ends));
+
+/* 4.2 bsd compatibility.  */
+extern char *re_comp _RE_ARGS ((const char *));
+extern int re_exec _RE_ARGS ((const char *));
+
+/* POSIX compatibility.  */
+extern int regcomp _RE_ARGS ((regex_t *preg, const char *pattern, int cflags));
+extern int regexec
+_RE_ARGS ((const regex_t *preg, const char *string, size_t nmatch,
+           regmatch_t pmatch[], int eflags));
+extern size_t regerror
+_RE_ARGS ((int errcode, const regex_t *preg, char *errbuf,
+           size_t errbuf_size));
+extern void regfree _RE_ARGS ((regex_t *preg));
+
+#endif /* not __REGEXP_LIBRARY_H__ */
+

+/*
+Local variables:
+make-backup-files: t
+version-control: t
+trim-versions-without-asking: nil
+End:
+*/
diff --git a/src/core/include/hy_strings.h b/src/core/include/hy_strings.h
new file mode 100644
index 0000000..bc3f30f
--- /dev/null
+++ b/src/core/include/hy_strings.h
@@ -0,0 +1,976 @@
+/*
+
+HyPhy - Hypothesis Testing Using Phylogenies.
+
+Copyright (C) 1997-now
+Core Developers:
+  Sergei L Kosakovsky Pond (spond at ucsd.edu)
+  Art FY Poon    (apoon at cfenet.ubc.ca)
+  Steven Weaver (sweaver at ucsd.edu)
+  
+Module Developers:
+	Lance Hepler (nlhepler at gmail.com)
+	Martin Smith (martin.audacis at gmail.com)
+
+Significant contributions from:
+  Spencer V Muse (muse at stat.ncsu.edu)
+  Simon DW Frost (sdf22 at cam.ac.uk)
+
+Permission is hereby granted, free of charge, to any person obtaining a
+copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be included
+in all copies or substantial portions of the Software.
+
+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.
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+*/
+
+#ifndef _HSTRINGS_
+#define _HSTRINGS_
+//#pragma once
+#include "baseobj.h"
+#include "simplelist.h"
+#include "list.h"
+
+class _ExecutionList; // forward declaration
+
+#define HY_STRING_INVALID_REFERENCE     0x00    
+#define HY_STRING_DIRECT_REFERENCE      0x01    
+#define HY_STRING_LOCAL_DEREFERENCE     0x02
+#define HY_STRING_GLOBAL_DEREFERENCE    0x03
+
+
+class _String:public BaseObj
+{
+
+    // contructor/destructor methods
+private:
+    int* kmpTable;
+public:
+
+    /**
+    * A constructor.
+    * A simple constructor that does nothing
+    */
+    _String (void);
+
+    /**
+    * Length constructor.
+    * @param sL Length of the string
+    * @param flag Allocates differently based on the flag
+    */
+    _String (unsigned long sL, bool flag = false);
+
+    /**
+    * A constructor that converts a long to string.
+    * @param sL The number to convert to string
+    */
+    _String (long);
+
+    /**
+    * A constructor that converts a _Parameter(double) to string.
+    * @param sL         The floating number to convert to string
+    * @param format     The C-style format string to use for the conversion
+    */
+    _String (_Parameter, const char * = nil);
+
+    /**
+    * A constructor that duplicates from another string.
+    */
+    _String (const _String&);
+
+    /**
+    * A constructor that duplicates from another string.
+    */
+    _String (_String*);
+
+    /**
+    * A constructor that duplicates from another string range.
+    * \n Cut a range of the original string
+    * @param from The starting position of the string to copy
+    * @param to The ending position of the string to copy
+    */
+    _String (const _String&, long, long);
+
+    /**
+    * A constructor that copies from a standard string.
+    */
+    _String (const char*);
+
+    /**
+    * A constructor that copies from a single char.
+    */
+    _String (const char);
+
+    /**
+    * A constructor that reads from an open file.
+    * @param F open file stream buffer to copy from
+    */
+    _String (FILE*);
+
+    /**
+    * A destructor.
+    */
+
+    virtual     ~_String(void);
+
+    /**
+    * Returns a dynamic string of the current instance.
+    * \n Usage: stringInstance.makeDynamic();
+    * @return BaseRef
+    */
+    virtual     BaseRef makeDynamic (void);
+
+    /**
+    * Initializes _String object to 0 length and 0 sData
+    */
+    virtual     void    Initialize (void);
+
+    /**
+    * Duplicates a string
+    * \n Usage: string.Duplicate(&existing_string)
+    * @param ref A pointer to the string to be duplicated
+    * @sa DuplicateErasing()
+    * @sa CopyDynamicString()
+    */
+    virtual     void    Duplicate (BaseRef);
+
+    /**
+    * Erases old data and duplicates a string
+    * \n Usage: string.DuplicateErasing(&existing_string)
+    * @param ref A pointer to the string to be duplicated
+    * @sa Duplicate()
+    * @sa CopyDynamicString()
+    */
+    virtual     void    DuplicateErasing (BaseRef);
+
+    /**
+    * Returns the character at a specified index
+    * \n Usage: char c = string.getChar(5);
+    * @param index The int location of the char in the string
+    * @return char located at specified location
+    */
+    const       char    getChar          (long);
+
+    /**
+    * Sets the character of the string instance at a specified index
+    * \n Usage: string->setChar(5, 'e');
+    * @param index The int location of the char to be replaced
+    * @param c The character to set the location with
+    * @return Nothing. Changes string instance
+    */
+    void    setChar          (long,char);
+
+    /**
+    * Copies a string dynamically and deletes the original string
+    * @param s A pointer to the string to be duplicated
+    * @param flushMe If true, free existing data before copying
+    * @sa Duplicate()
+    * @sa DuplicateErasing()
+    */
+    void    CopyDynamicString (_String*, bool = true);
+
+    /**
+    * Element location function
+    * @see getChar()
+    */
+    virtual     char& operator [] (long);
+
+
+    /**
+    * Element location function
+    * @see getChar()
+    */
+    char operator  () (unsigned long);
+
+    /**
+    * Sets string
+    * \n\n \b Example: \code _String str = _String("hyphy"); \endcode
+    * @see Duplicate()
+    */
+    void operator = (_String);
+
+    /**
+    * Returns the length of the string
+    * \n\n \b Example: \code long l = string.Length(); \endcode
+    * @return Length of string
+    */
+    unsigned long Length(void);
+
+    /**
+    * Append operator
+    * \n\n \b Example: \code _String new_string = _String("A") & _String("B") \endcode
+    * @return "AB"
+    * @sa EscapeAndAppend()
+    */
+    _String operator & (_String);
+
+    /**
+    * Append operator
+    * \n\n \b Example: \code _String new_string = _String("A") & _String("B") \endcode
+    * @return "AB"
+    * @sa EscapteAndAppend()
+    */
+    virtual void operator << (const _String*);
+
+    /**
+    * Append operator
+    */
+    virtual void operator << (const _String&);
+
+    /**
+    * Append operator
+    * \n\n \b Example: \code _String new_string = _String("A") & _String("B") \endcode
+    * @return "AB"
+    * @sa EscapteAndAppend()
+    */
+    void    AppendNewInstance (_String*);
+
+    /**
+    * Append operator
+    * \n\n \b Example: \code _String new_string = _String("A") & _String("B") \endcode
+    * @return "AB"
+    * @sa AppendNewInstance()
+    */
+    virtual void operator << (const char);
+
+    /**
+    * Escape all characters in a string and append to this string
+    * \n\n \b Example: \code _String("AB").EscapeAndAppend('<',4); \endcode
+    * \n Above code will transform string to "AB<"
+    * @param c The character to escape and append
+    * @param mode What sort of escaping
+    * \n mode = 0 : normal "text" escaping
+    * \n mode = 1: PostScript escaping
+    * \n mode = 2: SQLite escaping
+    * \n mode = 3: SQLite escaping
+    * \n mode = 4: HTML escaping
+    * \n mode = 5: Regexp escaping
+    */
+    virtual void EscapeAndAppend (const char, char);
+
+    /**
+    * Escape all characters in a string and append to this string
+    * \n\n \b Example: \code _String("AB").EscapeAndAppend('<',4); \endcode
+    * \n Above code will transform string to "AB<"
+    * @param s The string to escape and append
+    * @param mode What sort of escaping
+    * @see EscapeAndAppend(const char, char)
+    */
+    virtual void EscapeAndAppend (const _String &, char mode = 0);
+
+    /**
+    * Append into operator
+    */
+    virtual void operator << (const char*);
+
+    /**
+    * Finalizes a string by putting a 0 at the end of the string.
+    */
+    virtual void Finalize (void);
+
+    /**
+    * Checks if the string contains the substring
+    * \n\n \b Example: \code bool contains = _String("AABBCC").ContainsSubstring("BB")); \endcode
+    * @param s The substring to check
+    * @return Returns true if string contains substring
+    */
+    bool ContainsSubstring (_String&);
+
+    /**
+    * Converts a good ole char*
+    * \n\n \b Example: \code string.toStr(); \endcode
+    */
+    virtual     BaseRef toStr (void);
+
+    /**
+    * Return good ole char*
+    */
+    virtual     operator const char* (void);
+
+    /**
+    * Returns a good ole char*
+    * \n\n \b Example: \code char * new_str = string.getStr(); \endcode
+    * @return Returns a good ole char*
+    */
+    char*    getStr(void);
+
+    /**
+    * Removes part of string that is between the two specified indices
+    * \n\n \b Example: \code _String new_string = _String("AAABBBCCC").Chop(3,5) \endcode
+    * @param from The starting index to chop from
+    * @param to The ending index to chop from
+    * @return "AAACCC"
+    * @sa Cut()
+    * @sa Trim()
+    */
+    _String Chop(long, long);
+
+    /**
+    * Cuts part of string that is between the two specified indices
+    * \n\n \b Example: \code _String new_string = _String("AAABBBCCC").Cut(3,5) \endcode
+    * @param from The starting index to cut from
+    * @param to The ending index to cut from
+    * @return "BBB"
+    * @sa Chop()
+    * @sa Trim()
+    */
+    _String Cut (long, long);
+
+    /**
+    *
+    * In-place flip string
+    * \n s[0]...s[sLength-1] => s[sLength-1]...s[0]
+    * \n\n \b Example: \code _String("ABC").Flip() \endcode
+    * @return Transforms string to "CBA"
+    */
+    void    Flip(void);
+
+    /**
+    * Trim the string between from and to
+    * \n Cut string from, to (-1 for any means from beginning/to end)
+    * \n\n \b Example: \code _String("AAABBBCCC").Trim(3,5) \endcode
+    * @param from The starting index to cut from
+    * @param to The ending index to cut from
+    * @param softTrim If set to true, does not reallocate memory
+    * @return Transforms string to "BBB"
+    * @sa Cut()
+    * @sa Chop()
+    */
+
+    void    Trim(long, long, bool = false);
+
+
+    /**
+    * Insert a char at a given position (-1 - append)
+    * \n\n \b Example: \code _String("AA").insert('C',0) \endcode
+    * @param c Character to insert
+    * @param pos The position to insert the character into
+    * @return "CAA"
+    */
+
+    void    Insert (char, long);
+
+    /**
+    * Delete a range of chars from the string
+    * \n\n \b Example: \code _String("AAABBBCCC").Delete(3,5) \endcode
+    * @param from The starting index to delete from
+    * @param to The ending index to delete to
+    * @return Transforms String to "AAACCC"
+    * @sa Chop()
+    */
+    void    Delete (long, long);
+
+    /**
+    * Replace string 1 with string 2, all occurences true/false
+    * \n\n \b Example: \code _String("AAABBBCCC").Replace("BBB","ZZZ") \endcode
+    * @param s The substring to replace
+    * @param d The substring to replace the value with
+    * @param flag If true, replace all.
+    * @return "AAAZZZCCC"
+    */
+
+    _String Replace(_String, _String, bool);
+
+
+    /**
+    * Locate the first non-space character of the string
+    * \n\n \b Example: \code _String ("    hyphy").FirstNonSpaceIndex()\endcode
+    * @param start Beginning of string search
+    * @param end End of string search
+    * @param direction Choose between backwards and forwards
+    * @return The char of the first non-space, in the example, 'h'.
+    * @see FirstNonSpaceIndex()
+    */
+    char    FirstNonSpace(long start = 0, long end = -1, char direction = 1);
+
+    /**
+    * Locate the first non-space character of the string
+    * \n\n \b Example: \code _String ("    hyphy").FirstNonSpaceIndex()\endcode
+    * @param start Beginning of string search
+    * @param end End of string search
+    * @param direction Choose between backwards and forwards
+    * @return The index of the first non-space, in the example, 4.
+    * @see FirstNonSpaceIndex()
+    */
+    long    FirstNonSpaceIndex(long start = 0, long end = -1, char direction = 1);
+
+
+    /**
+    * Locate the first space character of the string
+    * \n Returns index of first space character
+    * \n\n \b Example: \code _String ("h yphy").FirstSpaceIndex()\endcode
+    * @param start starting index
+    * @param end ending index to search
+    * @param direction If the direction is less than 0, then go backwards
+    * @return Returns the index of the first non-space. 1 in the example.
+    * @sa FirstSpaceIndex()
+    */
+    long    FirstSpaceIndex(long start = 0, long end = -1, char direction = 1);
+
+    /**
+    * Finds end of an ID. An ID is made up of alphanumerics, periods, or '_'
+    * \n\n \b Example: \code _String ("AA$AAA").FindEndOfIdent()\endcode
+    * @param start Where to start looking
+    * @param end Where to end looking, -1 is the end of the string
+    * @param wild Wild character to skip as well
+    * @return Position after the end of the identifier. 3 in the example
+    */
+    long    FindEndOfIdent(long start = 0, long end = -1, char wild = '*');
+
+    /**
+    * Find first occurence of the string between from and to
+    * \n\n \b Example: \code _String ("AABBCC").Find("B")\endcode
+    * @param s The substring to find
+    * @param from The index to start searching from
+    * @param to The index to search to
+    * @return Returns the index of the first instance of the substr, -1 if not found. 2 in the example
+    * @sa FindKMP()
+    */
+    long    Find(_String s, long from = 0, long to = -1);
+
+    /**
+    *  @see Find()
+    */
+    long    Find(char s, long from = 0, long to = -1);
+
+    /**
+    * Find first occurence of the string between from and to
+    * @param s The substring to find
+    * @param from The index to start searching from
+    * @param to The index to search to
+    * @return Returns the index of the first instance of the substr, -1 if not found
+    * @sa Find()
+    * @sa buildKmpTable()
+    */
+    long    FindKMP(_String s, long from = 0, long to = -1);
+
+    /**
+    * Builds a KMP table for use with FindKMP
+    */
+    void    buildKmpTable(_String s);
+
+    /**
+    * Case insensitive Find
+    * @see Find()
+    */
+
+    long    FindAnyCase (_String, long from = 0, long to = -1);
+
+    /**
+    * Backwards Find
+    * @see Find()
+    */
+    long    FindBackwards(_String, long, long);
+
+    /**
+    * Binary searches for a char inside of a string
+    * \n\n \b Example: \code _String ("AABBCC").FindBinary('B')\endcode
+    * @param s The char to look for inside of the string
+    * @return The location of the char, -1 if doesn't exist. 3 in the example.
+    */
+    long    FindBinary(char);
+
+    /**
+    * Compute Adler-32 CRC for a string
+    * \n\n \b Example: \code _String result = new _String ("Wikipedia"); \endcode
+    * \n Implementation shamelessly lifted from http://en.wikipedia.org/wiki/Adler-32
+    * @return the Adler32 checksum. 300286872 returns in the Example
+    */
+    long    Adler32 (void);
+
+    /**
+    * Turns seconds into a time string in the form "hh:mm:ss"
+    * \n\n \b Example:
+    * \code
+    * long time_diff = 459132;
+    * _String("").FormatTimeString(time_diff);
+    * \endcode
+    * @param time_diff Seconds of time
+    * @return Transforms string to "127:32:12" in the example.
+    */
+
+    void    FormatTimeString (long);
+
+    /**
+    * Checks if string is lexicographically equal
+    * @see Equal()
+    */
+    bool    operator == (_String);
+
+    /**
+    * Lexicographic comparison
+    * \n Checks if Strings are equal lexicographic
+    * @param s Second string to compare
+    * @return true if strings are equal
+    * @sa Compare()
+    */
+    bool Equal   (_String*);
+
+    /**
+    * Case Insensitive Lexicographic comparison
+    * \n Checks if Strings are equal lexicographic
+    * @param s Second string to compare
+    * @return true if strings are equal
+    * @sa Compare()
+    */
+    bool iEqual   (_String*);
+
+    /**
+    * Lexicographic comparison
+    * \n Checks if a string is equal to one character 
+    * @param c the character to compare to 
+    * @return true if the string is equal to the character
+    * @sa Compare()
+    */
+    bool Equal   (const char c);
+
+    /**
+    * TODO: Lexicographic comparison
+    * \n Checks if Strings are equal lexicographic
+    * @param s Second string to compare
+    * @return 1 if strings are equal, -1 if strings are not
+    * @sa Equal()
+    */
+    char Compare (_String*);
+
+    /**
+    * Lexicographic comparison with a wild character
+    * \n Checks if Strings are equal lexicographically
+    * @param s Second string to compare
+    * @param wildchar The wildcharacter
+    * @return true if strings are equal
+    * @sa Equal()
+    */
+    bool EqualWithWildChar (_String* s, char wildChar = '*');
+
+    /**
+    * Checks if String is lexicographically greater
+    * @see Greater()
+    */
+    bool operator > (_String);
+
+    /**
+    * Checks if String is lexicographically less
+    * @see Less()
+    */
+    bool operator < (_String);
+
+    /**
+    * Checks if String is lexicographically greater
+    * \n Lexicographical essentially means alphabetical order in this context.
+    * \n\n \b Example: \code _String ("House").Greater("Household")\endcode
+    * \n @return House > Household would be false. The example returns false.
+    */
+    bool Greater (_String*);
+
+    /**
+    * Checks if String is lexicographically greater
+    * \n Lexicographical essentially means alphabetical order in this context.
+    * \n\n \b Example: \code _String ("House").Lesser("Household")\endcode
+    * \n House < Household would be true. The example would return true.
+    */
+    bool Less (_String*);
+
+    /**
+    * Checks if String is lexicographically greater or equal
+    * @see Greater()
+    */
+    bool operator >= (_String);
+
+    /**
+    * Checks if String is lexicographically less or equal
+    * @see Less()
+    */
+    bool operator <= (_String);
+
+    /**
+    * Checks if string is not lexicographically equal
+    * @see Equal()
+    */
+    bool operator != (_String);
+
+    /**
+    * Checks to see if string contains substring
+    * \n\n \b Example: \code _String("hyphy").contains("h")\endcode
+    * @return Returns true if string contains substring. Example returns true
+    * @see Find()
+    */
+    bool contains (_String);
+
+    /**
+    * Checks to see if string contains character
+    * @return Returns true if string contains character
+    * @see contains()
+    */
+    bool contains (char);
+
+    /**
+    * Checks to see if String begins with substring
+    * \n\n \b Example: \code _String("hyphy").beginswith("h")\endcode
+    * @param s Substring
+    * @param caseSensitive If true, it will be case sensitive. Default is case sensitive.
+    * @return true if string begins with substring. Example returns true
+    * @sa contains()
+    * @sa startswith()
+    * @sa endswith()
+    */
+    bool beginswith (_String, bool = true);
+
+    /**
+    * Checks to see if String starts with substring
+    * \n\n \b Example: \code _String("hyphy").startswith("h")\endcode
+    * @param s Substring
+    * @return true if string starts with substring. Example would return true
+    * @sa contains()
+    * @sa beginswith()
+    * @sa endswith()
+    */
+    bool startswith (_String&);
+
+    /**
+    * Checks to see if String ends with substring
+    * \n\n \b Example: \code _String("hyphy").endswith("y")\endcode
+    * @param s Substring
+    * @param caseSensitive If true, it will be case sensitive. Default is case sensitive.
+    * @return true if string ends with substring. Example would return true.
+    * @sa contains()
+    * @sa beginswith()
+    * @sa startswith()
+    */
+    bool endswith (_String, bool = true);
+
+    /**
+    * Converts string to upper case
+    * @sa LoCase()
+    */
+    void    UpCase (void);
+
+    /**
+    * Converts string to lower case
+    * @sa UpCase()
+    */
+    void    LoCase (void);
+
+    /**
+    * SLKP 20090817: A utility function to append a statement of the form
+    * \n\n \b Example: _String("hyphy").AppendAnAssignmentToBuffer("12","12",false,false,false) makes "hyphy12=12"
+    * @param id = value; to the current string assumed to be in the buffer form
+    * @param doFree free the 2nd string argument when done
+    * @param doQuotes put quotes around the value
+    * @param doBind use := instead of =
+    * @sa AppendNewInstance()
+    * @sa AppendVariableValueAVL()
+    */
+
+    void    AppendAnAssignmentToBuffer (_String*, _String*, bool = true, bool = false, bool = false);
+
+    /**
+    * SLKP 20090817:
+    * A utility function to append a statement of the form
+    * id["varname"] = varvalue; for each variable in the SimpleList arguments
+    * for String valued variables, their values are properly quoted
+    * @param id = value; to the current string assumed to be in the buffer form
+    * @param doFree free the 2nd string argument when done
+    * @param doQuotes put quotes around the value
+    * @param doBind use := instead of =
+    * @sa AppendNewInstance()
+    * @sa AppendAnAssignmentToBuffer()
+    */
+
+    void    AppendVariableValueAVL (_String*, _SimpleList&);
+
+    /**
+    * Returns a list from a string split by a substr
+    * \n\n \b Example: _String("hyphy, gattaca, protease").Tokenize(",") will create a list {"hyphy","gattaca","protease"}
+    * @param s The substring to split the string by
+    * @return A point to a *_List that holds a list of the resultant strings. Retrieve one by list->lData[i]
+    */
+    _List*  Tokenize (_String);
+
+    /**
+    * TODO: With batchlan
+    */
+    bool    ProcessFileName (bool isWrite = false, bool acceptStringVars = false, Ptr = nil, bool assume_platform_specific = false, _ExecutionList * caller = nil);
+
+    /**
+    * TODO: With batchlan
+    */
+    void    ProcessParameter (void);
+
+    /**
+    * Compose two UNIX paths (abs+rel)
+    * \n\n \b Example: \code _String("/home/sergei/hyphy").PathComposition("../datamonkey")\endcode
+    * @param relPath The relative path to change to
+    * @return New File Path, Example would return "/home/sergei/datamonkey"
+    */
+    _String PathComposition (_String);
+
+    /**
+    * Subtracts the string from the string passed.
+    * \n\n \b Example: \code _String("/home/sergei/hyphy").PathSubtraction("/home/sergei/")\endcode
+    * @param s String that will be subtracted
+    * @return Example would return "hyphy"
+    */
+    _String PathSubtraction (_String&, char);
+
+    /**
+    * Returns a list from a string split by a substr.
+    * \n\n \b Example: \code _String("\"hyphy\"").StripQuotes("")\endcode
+    * @return string with no quotes. "hyphy" in this example.
+    */
+    void    StripQuotes(void);
+
+    /**
+    * Checks if String is valid ident
+    * \n A valid ident is any alphanumeric or '_'
+    * \n\n \b Example: '$hyphy' is not legal.  'hy_phy' is legal.
+    * @param strict If strict, only alphabetic, no numerals.
+    * @sa ConvertToAnIdent();
+    */
+    bool    IsValidIdentifier(bool = true);
+
+    /**
+    * Same as IsValidIdentifier, but must end with a '&'
+    * \n\n \bExample: 'hyphy&' is a valid ref identifier
+    * @see IsValidIdentifier()
+    */
+    bool    IsValidRefIdentifier(void);
+
+    /**
+    * If it is enclosed in quotes, then it is a literal argument
+    * \n \n \b Example: "\"hyphy\"" is a literal argument
+    */
+    bool    IsALiteralArgument  (bool stripQuotes = FALSE);
+
+    /**
+    * Converts a string to a valid ident
+    * \n A valid ident is any alphanumeric or '_'
+    * \n\n \b Example: \code _String("$hyphy") \endcode
+    * @param strict If strict, only alphabetic, no numerals.
+    * @sa IsValidIdentifier();
+    * @return the example would return "_hyphy"
+    */
+    void    ConvertToAnIdent (bool = true);
+
+    /**
+    * Removes all spaces in a string
+    * \n\n \b Example: \code _String("   h  y p    h  y").KillSpaces \endcode
+    * @param result A reference to the string that will have stripped spaces. The original string will not be changed.
+    * @sa CompressSpaces()
+    * @return The example would return "hyphy"
+    */
+    void    KillSpaces       (_String&);
+
+    /**
+    * Removes all spaces in a string
+    * \n\n \b Example: \code _String("   h  y p    h  y").CompressSpaces() \endcode
+    * @return Example would transform the string to "h y p h y"
+    * @sa KillSpaces()
+    */
+    void    CompressSpaces   (void);
+
+    /**
+    * Shorten the var id by removing the matching beginning portion of the passed in String separated by a "."
+    * \n\n \b Example: _String("house.room")._String("house")
+    * @param containerID
+    * @return _String("house.room")._String("house.") will return "room". However, _String("houseroom") will return "houseroom"
+    */
+    _String ShortenVarID     (_String&);
+
+    /**
+    * Examine the string argument contained in this object, decide what it is, and process accordingly
+    * \n\n \bExample: \code 'hyphy'.ProcessVariableReferenceCases (object) \endcode is a direct reference to object hyphy
+    * \n\n \bExample: \code '\"hy\"+\"phy\"'.ProcessVariableReferenceCases (object) \endcode is a direct reference to object hyphy
+    * \n\n \bExample: \code '*hyphy'.ProcessVariableReferenceCases (object) \endcode is a reference to the object whose name is stored in the string variable hyphy 
+    * \n\n \bExample: \code '**hyphy'.ProcessVariableReferenceCases (object) \endcode is a reference to the object whose name is stored in the string variable hyphy in the global context
+    * @param referenced_object will store the handled variable ID
+    * @param context is the namespace of the referenced object; could be nil
+    * @return one of HY_STRING_INVALID_REFERENCE    HY_STRING_DIRECT_REFERENCE   HY_STRING_LOCAL_DEREFERENCE    HY_STRING_GLOBAL_DEREFERENCE 
+    * @see IsValidIdentifier()
+    */
+
+    unsigned char  ProcessVariableReferenceCases (_String& referenced_object, _String * context = nil);
+
+    
+    static  unsigned long     storageIncrement;
+
+    /**
+    * A regular expression match
+    * @param pattern A string(A Ptr is a char*) that holds the regex pattern
+    * @param matchedPairs A list that holds the start and end indexes of matches
+    * @sa RegExpMatchAll()
+    * @sa RegExpMatchOnce()
+    */
+    void    RegExpMatch      (Ptr, _SimpleList&);
+
+    /**
+    * A regular expression match
+    * @param pattern A string that holds the regex pattern
+    * @param matchedPairs A list that holds the start and end indexes of matches
+    * @sa RegExpMatch()
+    * @sa RegExpMatchOnce()
+    */
+    void    RegExpMatchAll   (Ptr, _SimpleList&);
+
+    /**
+    * A regular expression match that only matches once
+    * @param pattern A string that holds the regex pattern
+    * @param matchedPairs A list that holds the start and end indexes of matches
+    * @sa RegExpMatch()
+    * @sa RegExpMatchAll()
+    */
+    void    RegExpMatchOnce  (_String*, _SimpleList&, bool, bool);
+
+    /**
+    * Lexicographically sorts the string
+    * @param index Needs a list to act as an index
+    * @return sorted string
+    */
+    _String*Sort             (_SimpleList* = nil);
+
+    /**
+     * Generate a random string on 
+     * @param len (>0) The desired length of the string
+     * @param alphabet Which alphabet do the random charcters come from; in nil, then this will be generated from 1-128 ASCII codes 
+     * @return the random string
+     */
+    static _String Random             (const unsigned long len, const _String * alphabet = nil);
+
+    /**
+    * Computes Lempel-Ziv complexity of the string.
+    * \n The Lempel-Ziv complexity computes the number of separate substrings in a given string
+    * \n Example: 1001111011000010 = 6 because subset of all strings = {1, 0, 01, 1110, 1100, 0010 }
+    */
+    long    LempelZivProductionHistory
+    (_SimpleList* = nil);
+
+    /**
+    * Converts a string of form ":[\d\.]\+" into a double
+    * \n SLKP 20100831: a utility function to handle the
+    * conversion of branch length strings to parameters
+    * \n\n \b Example: string = ":3.14" returns 3.14
+    * \n If it is not of correct form, it will return 1e-10
+    * @sa toNum()
+    */
+    _Parameter
+    ProcessTreeBranchLength ();
+
+
+
+    /**
+    * Converts a string of form "[\d\.]\+" into a double
+    * \n\n \b Example: "3.14" becomes 3.14
+    * @sa ProcessTreeBranchLength()
+    */
+
+    _Parameter      toNum (void);
+
+    /**
+    * Sets Length
+    */
+    void    SetLength (unsigned long nl) {
+        sLength=nl;
+    }
+
+    /**
+    * Starting at index [argument 1],
+    * find a span that encloses an expression (nested) delimited by char[argument 2]
+    * and char[argument 3] (e.g. {}, ()) respecting quotes (argument 4), and allowing
+    * escaped characters (argument 5)
+    * \n SLKP 20090803
+    *
+    * @param &from The starting position of the segment will be stored here
+    * @param open The first character to look for. For example, and open bracket '[' or open paranthesis '('
+    * @param close The first character to look for. For example, and open bracket ']' or open paranthesis ')'
+    * @param respectQuote
+    * @param respectEscape
+    *
+    * @return Ending position is returned
+    *-1 is returned if the starting character could not be found or the expression did not terminate before the end of the string
+    *
+    */
+
+    long    ExtractEnclosedExpression (long&, char, char, bool, bool);
+
+    /**
+    * Starting at index [argument 1],
+    * find a span that terminates in one of the characters in [argument 2], while
+    * respecting (), [], {}, "" and escapes
+    * \n SLKP 20090805
+    * @param s The terminator to find
+    * @return -1 is returned if the starting character could not be found or the expression did not terminate before the end of the string
+    * @sa IsALiteralArgument()
+    *
+    */
+
+    long    FindTerminator          (long, _String&);
+
+
+    // Data Fields
+    unsigned long sLength;
+    Ptr           sData;
+};
+
+
+// _______________________________________________________________________
+
+
+
+extern _String empty,
+       emptyAssociativeList,
+       hyphyCiteString;
+
+#ifdef  __MAC__
+extern _String volumeName;
+#endif
+
+void    SetStatusBarValue           (long,_Parameter,_Parameter);
+void    SetStatusLine               (_String);
+void    SetStatusLine               (_String, _String, _String, long l);
+void    SetStatusLine               (_String, _String, _String);
+void    SetStatusLine               (_String, _String, _String, long, char);
+
+void    SetStatusLineUser           (_String);
+
+
+Ptr     PrepRegExp                  (_String*, int&, bool);
+void    FlushRegExp                 (Ptr);
+_String GetRegExpError              (int);
+void    ReportWarning               (_String);
+void    FlagError                   (_String);
+void    WarnErrorWhileParsing       (_String, _String&);
+void    WarnError                   (_String);
+_String GetVersionString            (void);
+_String GetTimeStamp                (bool = false);
+
+void    StringToConsole             (_String&, _SimpleList* = nil);
+void    BufferToConsole             (const char*, _SimpleList* = nil);
+void    NLToConsole                 (void);
+_String*StringFromConsole           (bool=true);
+
+char    GetPlatformDirectoryChar    (void);
+
+
+extern  _String                     __KERNEL__VERSION__;
+
+#ifdef __UNIX__
+	extern bool	needExtraNL;
+#endif
+
+typedef bool (*_hyStringValidatorType) (_String*);
+bool    hyIDValidator (_String*);
+
+#endif
diff --git a/src/core/include/likefunc.h b/src/core/include/likefunc.h
new file mode 100644
index 0000000..70fa622
--- /dev/null
+++ b/src/core/include/likefunc.h
@@ -0,0 +1,798 @@
+/*
+
+HyPhy - Hypothesis Testing Using Phylogenies.
+
+Copyright (C) 1997-now
+Core Developers:
+  Sergei L Kosakovsky Pond (spond at ucsd.edu)
+  Art FY Poon    (apoon at cfenet.ubc.ca)
+  Steven Weaver (sweaver at ucsd.edu)
+  
+Module Developers:
+	Lance Hepler (nlhepler at gmail.com)
+	Martin Smith (martin.audacis at gmail.com)
+
+Significant contributions from:
+  Spencer V Muse (muse at stat.ncsu.edu)
+  Simon DW Frost (sdf22 at cam.ac.uk)
+
+Permission is hereby granted, free of charge, to any person obtaining a
+copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be included
+in all copies or substantial portions of the Software.
+
+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.
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+*/
+
+#ifndef __LIKELIHOODF__
+#define __LIKELIHOODF__
+
+//#pragma once
+#include "category.h"
+#include "calcnode.h"
+
+#ifdef __HYALTIVEC__
+#define   A_LARGE_NUMBER          1.e35
+#else
+#define   A_LARGE_NUMBER          1.e100
+#endif
+
+#define   DEFAULTPARAMETERLBOUND  0.0
+#define   DEFAULTPARAMETERUBOUND  10000.0
+
+/* various run modes for PopulateConditionalProbabilities */
+
+#define   _hyphyLFConditionProbsRawMatrixMode       0
+#define   _hyphyLFConditionProbsScaledMatrixMode    1
+#define   _hyphyLFConditionProbsWeightedSum         2
+#define   _hyphyLFConditionProbsMaxProbClass        3
+#define   _hyphyLFConditionProbsClassWeights        4
+#define   _hyphyLFConditionMPIIterate               5
+
+/* computational template kinds for the likelihood function */
+
+#define   _hyphyLFComputationalTemplateNone         0
+#define   _hyphyLFComputationalTemplateBySite       1
+#define   _hyphyLFComputationalTemplateByPartition  2
+
+/* conditional likelihood matrix reconstruction modes */
+
+#define   _hyphyLFConstructCategoryMatrixConditionals   0
+#define   _hyphyLFConstructCategoryMatrixClasses        1
+#define   _hyphyLFConstructCategoryMatrixWeights        2
+#define   _hyphyLFConstructCategoryMatrixPosteriors     3
+#define   _hyphyLFConstructCategoryMatrixSiteProbabilities      4
+
+/* likelihood seialization model */
+
+#define   _hyphyLFSerializeModeVanilla                  0
+#define   _hyphyLFSerializeModeOptimize                 1
+#define   _hyphyLFSerializeModeLongMPI                  2
+#define   _hyphyLFSerializeModeCategoryAsGlobal         4
+#define   _hyphyLFSerializeModeShortMPI                 5
+
+/* likelihood function parallelize mode */
+
+#define   _hyphyLFMPIModeNone                           0
+#define   _hyphyLFMPIModePartitions                     1
+#define   _hyphyLFMPIModeSiteTemplate                   2
+#define   _hyphyLFMPIModeREL                            3
+#define   _hyphyLFMPIModeAuto                           4
+
+/* partition category variable types */
+
+#define   _hyphyCategoryNormal                          0x1
+#define   _hyphyCategoryHMM                             0x2
+#define   _hyphyCategoryCOP                             0x4
+
+/* interval mapping functions */
+
+#define   _hyphyIntervalMapID                           0x0 // identify
+#define   _hyphyIntervalMapExpit                        0x1 // expit -- maps [-infty,infty) to [0,1] 
+// 1/(1+exp[-x])
+#define   _hyphyIntervalMapSqueeze                      0x2 // maps [0,infty) to [0,1)
+// x / (1+x)
+
+
+//_______________________________________________________________________________________
+
+struct  MSTCache {
+    _List               computingOrder,
+                        storageOrder,
+                        referenceOrder,
+                        parentOrder,
+                        stashedLeafOrders;
+
+    _SimpleList         statesNCache,
+                        resultCache,
+                        statesCache,
+                        cacheSize;
+
+};
+
+//_______________________________________________________________________________________
+
+class   _LikelihoodFunction: public BaseObj
+{
+
+public:
+
+    // constructors
+
+    _LikelihoodFunction (void); // default - doesn't do much
+    _LikelihoodFunction (_String&, _VariableContainer*); // from triplets
+    _LikelihoodFunction (_LikelihoodFunction&); // stack copy
+    void        Init      (void);
+
+    bool        Construct (_List&,_VariableContainer*);
+
+    virtual ~_LikelihoodFunction (void) {
+        Cleanup();   // destructor
+    }
+
+    virtual BaseRef     toStr (void);
+
+    virtual BaseRef     makeDynamic (void);      // dynamic copy of this object
+
+    virtual void        Duplicate (BaseRef);         // duplicate an object into this one
+
+    _SimpleList&GetIndependentVars (void); // return a list of all indepenent variables
+    _SimpleList&GetDependentVars   (void); // get all dependent vars of this object
+    _SimpleList&GetCategoryVars    (void); // get all category variables
+    void        GetGlobalVars      (_SimpleList&);
+
+    long        CountObjects       (char);     // return object count
+    // 0 - partitions
+    // 1 - global variables
+    // 2 - local independents
+    // 3 - dependents
+    // 4 - category variables
+
+
+    _Parameter  GetIthIndependent           (long);     // get the value of i-th independent variable
+    _Parameter  GetIthDependent             (long);     // get the value of i-th dependent variable
+    void        GetAllIndependent           (_Matrix&); // store all indepenent values in a matrix
+    _Variable*  GetIthIndependentVar        (long);     // get the variable object of i-th independent variable
+    _Variable*  GetIthDependentVar          (long);     // get the variable object of i-th dependent variable
+    _Parameter  GetIthIndependentBound      (long, bool isLower = true);
+    // get the lower / upper bound for the i-th indepdendent variable
+
+    void        SetIthIndependent (long, _Parameter);           // set the value of i-th independent variable
+    bool        CheckAndSetIthIndependent (long, _Parameter);   // set the value of i-th independent variable
+    void        SetIthDependent           (long, _Parameter);   // set the value of i-th dependent variable
+    bool        IsIthParameterGlobal      (long);
+
+    long        SetAllIndependent         (_Matrix*);
+
+
+    void        UpdateIndependent (long,bool,_SimpleList* = nil,_SimpleList* = nil);
+    void        UpdateDependent (long);
+    _AssociativeList*
+    SimulateCodonNeutral (_Matrix*, _Matrix*, long);
+
+    bool        PreCompute      (void);
+    void        PostCompute     (void);
+    virtual
+    _Parameter  Compute         (void);
+
+    void        PrepareToCompute (bool = false);
+    void        DoneComputing    (bool = false);
+    virtual
+    _Matrix*    Optimize ();
+    _Matrix*    ConstructCategoryMatrix     (const _SimpleList&, char, bool = true, _String* = nil);
+
+    _Parameter  SimplexMethod               (_Parameter& precision);
+    void        Anneal                      (_Parameter& precision);
+
+    void        Simulate                    (_DataSet &,_List&, _Matrix* = nil, _Matrix* = nil, _Matrix* = nil, _String* = nil);
+
+    void        ReconstructAncestors        (_DataSet &, _SimpleList&, _String&, bool = false, bool = false, bool = false);
+    // 20090224: added an argument to allow the marginal state reconstruction
+    // 20091009: added an argument to allow the reconstruction of leaves
+
+    long        MaximumDimension            (void);
+
+    virtual _PMathObj   CovarianceMatrix            (_SimpleList* = nil);
+
+    // compute  covariance matrix  based on the Hessian
+    // optional list of parameters to estimate the conditional covariance for
+
+
+    virtual     void        RescanAllVariables      (void);
+
+    long        DependOnTree            (_String&);
+    long        DependOnModel           (_String&);
+    long        DependOnDS              (long);
+    bool        DependOnDF              (long ID) {
+        return theDataFilters.Find(ID)>=0;
+    }
+    bool        MapTreeTipsToData       (long, bool leafScan = false);
+    bool        UpdateFilterSize        (long);
+    void        VoidOldResults          (void) {
+        computationalResults.ZeroUsed();
+    }
+    _CategoryVariable*
+    FindCategoryVar         (long);
+    // return the category variable for a given partition
+    void        RankVariables           (_AVLListX* tagger = nil);
+    _SimpleList&GetTheTrees             (void) {
+        return theTrees;
+    }
+    _SimpleList&GetTheFilters           (void) {
+        return theDataFilters;
+    }
+    _SimpleList&GetBaseFreqs            (void) {
+        return theProbabilities;
+    }
+    
+    void        FillInConditionals      (long = -1);
+    
+    void        Setup                   (void);
+    bool&       HasBeenOptimized (void) {
+        return hasBeenOptimized;
+    }
+    void        ComputePruningEfficiency(long&, long&);
+
+    long        SequenceCount           (long);
+    long        SiteCount               (void);
+    void        Rebuild                 (void);
+    void        SerializeLF             (_String&, char=0, _SimpleList* = nil, _SimpleList* = nil);
+    _Formula*   HasComputingTemplate    (void) {
+        return computingTemplate;
+    }
+    void        StateCounter            (long);
+    void        MPI_LF_Compute          (long, bool = false);
+
+#if defined _SLKP_LFENGINE_REWRITE_
+#if defined _OPENMP
+    void        SetThreadCount            (long tc) {
+        if (tc != lfThreadCount) {
+            lfThreadCount = tc;
+            FillInConditionals ();
+        }
+    }
+    long        GetThreadCount            (void) {
+        return lfThreadCount;
+    }
+#else
+    long        GetThreadCount            (void) {
+        return 1;
+    }
+#endif
+#endif
+
+    bool            ProcessPartitionList        (_SimpleList&, _Matrix*, _String);
+    // given a matrix argument (argument 2; can be nil to include all)
+    // populate a sorted list (argument 1)
+    // of partitions indexed in the matrix (e.g. {{1,3}} would include the 2-nd and 4-th partitions
+    // the third argument is the ID of the calling function for error reporting
+    // returns true if at least one of the requested partitions is valid
+    // otherwise returns false
+
+    long            TotalRateClassesForAPartition (long, char = 0);
+    // given a partition index (assuming that category caches have been set up)
+    // returns how many total rate classes there are for this partition
+    // if the index is < 0, return the total number of categories for the LF as a whole
+
+    // char flag: 0 - all categories
+    //            1 - only HMM
+    //            2 - only constant on partition
+
+
+    bool            HasBeenSetup                (void) {
+        return hasBeenSetUp > 0;
+    }
+
+    /**
+       @return  an associative array with a variety of metrics (see GetString on HyPhy wiki)
+                about this LF.
+       @author  SLKP
+       @version 20110608
+    */
+
+    _AssociativeList*CollectLFAttributes         (void);
+protected:
+
+    _Matrix*        PairwiseDistances       (long index);
+    void            CheckDependentBounds    (void);
+    void            AllocateSiteResults     (void);
+    void            ZeroSiteResults         (void);
+    // 20090211: A utility function to reset site results.
+    void            GetInitialValues        (void);
+    bool            checkPermissibility     (_Matrix&m, long row);
+    _Parameter      computeAtAPoint         (_Matrix&m, long row = 0);
+    _Parameter      replaceAPoint           (_Matrix&m, long row, _Matrix&p, _Parameter& nV, _Matrix& fv);
+
+    void            ScanAllVariablesOnPartition
+    (_SimpleList&, _SimpleList&, _SimpleList&, _SimpleList&, bool = false);
+    // internal function to scan all the on a set of partitions variables in
+    // 20091103: SLKP
+    // the boolean flag (if true), requests that only tree-associated variables
+    // (no templates or frequencies) be scanned
+
+    virtual void            ScanAllVariables        (void);
+    // internal function to scan all the variables in
+
+    void            OptimalOrder            (long, _SimpleList&);
+    // determine the optimal order of compuation for a block
+
+    _Parameter      ComputeBlock            (long, _Parameter* siteResults = nil, long currentRateClass = -1, long = -1, _SimpleList* = nil);
+    // 20090224: SLKP
+    // added the option to pass an interior branch (referenced by the 3rd argument in the same order as flatTree)
+    // and a set of values for each site pattern (indexed left to right) in the 4th argument
+
+    void            SetReferenceNodes       (void);
+    // compute likelihood over block index i
+
+    // internal Setup, called from within constructors
+
+//      void            DumpingOrder            (long index, _SimpleList& sl);
+    // used for FreeUpMemory
+
+    void            Cleanup                 (void);
+    // internal cleanup, called from within destructors
+
+    void            Clear                   (void);
+
+
+    long            Bracket                 (long , _Parameter& , _Parameter& , _Parameter& ,
+            _Parameter& , _Parameter& , _Parameter& , _Parameter&, _Matrix* = nil);
+    //long          GradientBracketOneVar (_Matrix&, _Matrix& , _Matrix& , _Matrix&,  _Parameter& ,
+    //                                      _Parameter&, _Parameter&, _Parameter&, bool retry = false);
+    void            LocateTheBump         (long,_Parameter , _Parameter& , _Parameter&, _Parameter = -1.);
+    void            GradientLocateTheBump (_Parameter, _Parameter&, _Matrix&, _Matrix&);
+    void            GradientDescent       (_Parameter& , _Matrix& );
+    void            ConjugateGradientDescent
+    (_Parameter , _Matrix& , bool localOnly = false, long = 0x7fffffff,_SimpleList* only_these_parameters = nil, _Parameter check_lf = A_LARGE_NUMBER);
+
+    _Parameter      SetParametersAndCompute
+    (long, _Parameter, _Matrix* = nil, _Matrix* = nil);
+
+    long            CostOfPath            (_DataSetFilter*, _TheTree* , _SimpleList&, _SimpleList* = nil);
+
+    void            BuildLeafProbs        (node<long>& , long*, long&, _DataSet&, _TheTree*, long&, bool, long, _DataSetFilter*, long, _DataSet* = nil);
+    bool            SingleBuildLeafProbs  (node<long>&, long, _SimpleList&, _SimpleList&, _TheTree*, bool,_DataSetFilter*, _SimpleList* = nil);
+    void            CodonNeutralSimulate  (node<long>&, long, bool,_Matrix*,_Matrix*, _Parameter&, _Parameter&);
+
+    bool            HasBlockChanged       (long);
+    long            BlockLength           (long);
+    void            PartitionCatVars      (_SimpleList&, long);
+    // 20090210: extract variable indices for category variables in i-th partition
+    // and append them to _SimpleList
+
+
+    static  void            RandomizeList               (_SimpleList&, long);
+    static  void            CheckFibonacci              (_Parameter);
+
+
+
+    long            PartitionLengths            (char = 0,  _SimpleList const* = nil);
+    /*
+        SLKP: 20090317
+
+        argument = 0
+            return the length (sites) of the longest part in this
+            likelihood function
+        argument = 1
+            return the cumulative length (sites) of all parts in this
+            likelihood function
+
+        SLKP: 20090608
+
+            argument 2 provides an optional subcollection of partititons to operate on;
+                the default is to operate on all
+    */
+
+
+private:
+
+
+    void            ComputeParameterPenalty     (void);
+    
+    
+    
+    bool            SendOffToMPI                (long);
+    void            InitMPIOptimizer            (void);
+    void            CleanupMPIOptimizer         (void);
+    void            ComputeBlockInt1            (long,_Parameter&,_TheTree*,_DataSetFilter*, char);
+    void            CheckStep                   (_Parameter&, _Matrix, _Matrix* selection = nil);
+    void            GetGradientStepBound        (_Matrix&, _Parameter &, _Parameter &, long* = nil);
+    void            ComputeGradient             (_Matrix&, _Matrix&,  _Parameter&, _Matrix&, _SimpleList&,
+            long, bool normalize = true);
+    bool            SniffAround                 (_Matrix& , _Parameter& , _Parameter&);
+    long            HasPrecisionBeenAchieved    (_Parameter funcValue = 2.*A_LARGE_NUMBER, bool = false);
+    void            RecurseCategory             (long,long,long,long,_Parameter
+#ifdef _SLKP_LFENGINE_REWRITE_
+            ,_SimpleList* = nil, char = 0, _Parameter* = nil,
+            long = -1, _SimpleList* = nil
+#endif
+                                                );
+    void            RecurseConstantOnPartition  (long, long, long, long, _Parameter, _Matrix&);
+
+
+
+    void            SetNthBit                   (long&,char);
+    bool            CheckNthBit                 (long&,char);
+    void            BuildIncrements             (long, _SimpleList&);
+    char            HighestBit                  (long);
+    char            LowestBit                   (long);
+    long            HasHiddenMarkov             (long, bool hmm = true);
+    _Matrix*        RemapMatrix                 (_Matrix*, const _SimpleList&);
+    /* given a matrix where each column corresponds to a site pattern
+     and a list of partitions that are covered
+     this function returns a new matrix where each pattern is mapped
+     to the corresponding sites in the alignment
+    */
+    void            CleanUpOptimize             (void);
+    void            ComputeBlockForTemplate     (long, bool = false);
+    void            ComputeBlockForTemplate2    (long, _Parameter*, _Parameter*, long);
+    void            DeleteCaches                (bool = true);
+    void            PopulateConditionalProbabilities
+    (long index, char runMode, _Parameter* buffer, _SimpleList& scalers, long = -1, _SimpleList* = nil);
+    void            ComputeSiteLikelihoodsForABlock
+    (long, _Parameter*, _SimpleList&, long = -1, _SimpleList* = nil,  char = 0);
+
+    // this function computes a list of site probabilities for the i-th block (1st parameter)
+    // stores them in pattern (left to right) order (2nd argument)
+    // and writes scaling factors for each site into the third argument
+    // arguments 4 (branch index) and 5 (pattern assignments)
+    // allows the calculation of the probability vector while setting a specific interior branch
+    // to a given sequence
+
+    _Parameter          SumUpHiddenMarkov (const _Parameter *, _Matrix&, _Matrix&, _SimpleList *, const _SimpleList*, long);
+    /*
+        SLKP 20090420
+
+        given conditional probs                         (1)
+        the transition matrix for the HMM               (2)
+        the initial probabilities for the HMM           (3)
+        the duplicate map (or nil if no need to remap)  (4)
+        the vector of by-site scaling factors as        (5)
+            a concatenated _SimpleList if (4) is not nil or
+            as a _List of _SimpleLists if (4) is nil
+        partition length                                (6)
+
+        compute the log likelihood of the partition using the forward HMM algorithm with scaling
+     */
+
+    void                    RunViterbi (_Matrix & , const _Parameter * , _Matrix& , _Matrix& , _SimpleList * ,  const _SimpleList* , long );
+    /* Viterbi decoding for HMM; parameter meanings as in SumUpHiddenMarkov,
+       except the first, which will store the optimal path to be returned */
+
+    _Parameter              SumUpSiteLikelihoods        (long, const _Parameter*, const _SimpleList&);
+    /*
+     SLKP 20090318
+
+     given a partition index (argument 1),
+     a vector of _pattern_ likelihoods (argument 2) and
+     a list of pattern scaling factors (argument 3)
+
+     compute the log likelihood of the partition
+
+     */
+
+
+    void            UpdateBlockResult           (long, _Parameter);
+    /*
+        SLKP 20090318
+
+        update cached log-likelihood value for a given
+        partition
+    */
+
+
+    _List*          RecoverAncestralSequencesMarginal
+    (long, _Matrix&,_List&, bool = false);
+    void            DetermineLocalUpdatePolicy  (void);
+    void            FlushLocalUpdatePolicy      (void);
+    void            RestoreScalingFactors       (long, long, long, long*, long *);
+    void            SetupLFCaches               (void);
+    void            SetupCategoryCaches         (void);
+    bool            HasPartitionChanged         (long);
+    void            SetupParameterMapping       (void);
+    void            CleanupParameterMapping     (void);
+
+    _SimpleList     theTrees,
+                    theDataFilters,
+                    theProbabilities,
+                    indexInd,
+                    indexDep,
+                    indexCat,
+                    *nonConstantDep,
+                    blockDependancies,
+                    parameterTransformationFunction;
+    /* 20110718: SLKP this list holds the index of the parameter interval mapping function
+        used during optimization */
+
+    _GrowingVector  computationalResults;
+
+    _List           optimalOrders,
+                    leafSkips,
+                    categoryTraversalTemplate,
+                    /*SLKP: 20090225
+
+                         This list contains as many entries (themselves of type _List) as there are partitions
+                         The entry will be empty for a partition without category variables
+                         For a partition with N category variables the entry will contain a
+
+                         1). _List of references to category variables themselves in the order that
+                         they appear in the blockDependancies
+
+                         2). _SimpleList of category counts for each variable C_1, C_2, ... C_N + a final entry with
+                         C_1 * C_2 * ... * C_N -- the total number of rate categories for this partition
+
+                         3). _SimpleList of incremental loop offsets for each variable, e.g. if the
+                         _SimpleList in 2). is 2,3,4, then this _SimpleList is
+                         12,4,1
+
+                      SLKP: 20100416
+
+                         4). A _SimpleList including _relative_ indexing for the buffer array
+                             for HMM and "constant on partition" variables similar to 3, but
+                             ignoring all other variables. The last entry is the total number
+                             of HMM (or similar) rate classes on a partition
+
+                         5). A _SimpleList storing the type of each cat variable in a partition (flag)
+                             the last element is the cumulative flag composed of bit toggles to indicate
+                             what type of category variables there are for a given partition:
+                                _hyphyCategoryNormal
+                                _hyphyCategoryHMM
+                                _hyphyCategoryCOP
+                     */
+                    indVarsByPartition,
+                    depVarsByPartition;
+
+
+
+    long            evalsSinceLastSetup,
+                    // this is necessary to force internal caches to be filled in at least once
+                    // for trees where branches have different numbers of rate categories
+                    templateKind,
+
+                    /*
+                        _hyphyLFComputationalTemplateNone:
+                            no computational template: simply return the summed up log-likelihood
+                            for all partitions in the likelihood function
+
+                        _hyphyLFComputationalTemplateBySite:
+                            all partitons have the same number of sites
+                            the template is in terms of SITE_LIKELIHOOD
+                            meant to implement model/tree mixture constructs
+
+                        _hyphyLFComputationalTemplateByPartition
+                            the template is in terms of BLOCK_LIKELIHOOD
+                            meant to implement random effects on the level of partitions
+                            models
+
+                        <0                                          : (-1-variable index) if a hidden markov process on site likelihoods
+                        >_hyphyLFComputationalTemplateByPartition   : a _hyphyLFComputationalTemplateByPartition shifted index of a user
+                                                                      function that will assemble the likelihood
+                                                                      from site conditionals, written into matrices
+                                                                      SITE_LIKELIHOODS_0, SITE_LIKELIHOODS_1, ..
+                    */
+                    hasBeenSetUp;
+
+    _Matrix         *siteResults,
+                    *bySiteResults,
+                    *parameterValuesAndRanges;
+
+    /* 20110718 SLKP
+        this Nx4 (N is the number of adjustable parameters) matrix
+        stores variable bounds and values for each independent variable;
+        this is used for internal normalization transforms during optimization
+     */
+
+    bool            hasBeenOptimized,
+                    siteArrayPopulated;
+
+    _Formula*       computingTemplate;
+    MSTCache*       mstCache;
+    
+    _Parameter      smoothingTerm,
+                    smoothingReduction,
+                    smoothingPenalty;
+
+#ifdef  _SLKP_LFENGINE_REWRITE_
+    /*
+       these variables store conditional likelihoods for every paritition
+       internal node (post-order traversal)
+       and leaves;
+
+       -conditionalInternalNodeLikelihoodCaches: 3D vector
+
+            1st coordinate - the node index (in post-order traversal)
+            2nd coordinate - the site (unique pattern) index (left-to-right)
+            3rd coordiante - i-th marginal (for the i-th character; 0-filterCharDimension)
+
+            stores the probability for the subtree below this node given that i-th character
+            is present at the node
+
+            for partitions with category variables this vector is copied enough times to
+            store every combination of category values
+
+        -conditionalTerminalNodeStateFlag: 2D vector
+            1st coordinate - the leaf index (in post-order traversal)
+            2nd coordinate - the site (unique pattern) index (left-to-right)
+
+            stores a non-negative integer for a leaf with a simple (non-ambiguous) character
+            stores a negative value to index (-value-1) into the vector of conditionalTerminalNodeLikelihoodCaches
+            and read off filterCharDimension characters from there
+    */
+
+    _Parameter**        conditionalInternalNodeLikelihoodCaches,
+               **     siteScalingFactors,
+               **     branchCaches;
+
+    _List               conditionalTerminalNodeLikelihoodCaches;
+    long      **        conditionalTerminalNodeStateFlag;
+
+    _SimpleList         overallScalingFactors,
+                        overallScalingFactorsBackup,
+                        // this (and siteCorrectionsBackup)
+                        // is needed to store site/partition scaling factors when treeTraversalMasks
+                        // and branch caching are used, otherwise scaling done by ComputeBranchCaches
+                        // will fubar the scaling for ComputeTreeBlockByBranch depending on site
+                        // patterns
+                        canUseReversibleSpeedups,
+                        // a partition will be tagged with '1' if its tree has only
+                        // time-reversible models
+                        siteScalerBuffer
+                        // used for LF with category variables to
+                        // store site-by-site scaling factors
+                        ;
+
+    _List               localUpdatePolicy,
+                        matricesToExponentiate,
+                        treeTraversalMasks,
+                        computedLocalUpdatePolicy,
+                        siteCorrections,
+                        siteCorrectionsBackup,
+                        cachedBranches,
+                        // for models with categories, a list of site by site scaling operation counts
+                        partScalingCache,
+                        // used to store site by site scalers in computations that are performed
+                        // on a site-by-site basis; includes scratch cache for remapping
+                        gradientBlocks
+                        ;
+
+#ifdef  _OPENMP
+    long                lfThreadCount;
+#endif
+
+#endif
+};
+
+//_______________________________________________________________________________________
+
+class   _CustomFunction: public _LikelihoodFunction
+{
+
+public:
+
+    _CustomFunction         (_String*);
+
+    virtual     _Parameter  Compute                 (void);
+    virtual     void        RescanAllVariables      (void) {}
+
+
+
+    _Formula myBody;
+};
+
+
+//_______________________________________________________________________________________
+
+extern  bool forceRecomputation,
+        isInOptimize;
+
+extern  long lockedLFID;
+
+extern  _String // declare shared global keys/settings
+globalStartingPoint             ,
+randomStartingPerturbations    ,
+optimizationPrecision          ,
+startingPrecision              ,
+optimizationMethod                 ,
+useLastResults                     ,
+allowBoundary                  ,
+bracketingPersistence          ,
+intermediatePrecision          ,
+keepOptimalOrder               ,
+skipOmissions                  ,
+optimizeSummationOrder             ,
+optimizePartitionSize          ,
+maximumIterationsPerVariable   ,
+optimizationPrecisionMethod    ,
+relativePrecision              ,
+likefuncOutput                 ,
+dataFilePrintFormat                ,
+dataFileDefaultWidth           ,
+dataFileGapWidth               ,
+categorySimulationMethod       ,
+useInitialDistanceGuess            ,
+randomSeed                     ,
+assignedSeed                   ,
+covariancePrecision                ,
+cacheSubtrees                  ,
+likeFuncCountVar               ,
+doShuffleOrder                 ,
+forceDistanceEstimates         ,
+useDuplicateMatrixCaching      ,
+siteWiseMatrix                 ,
+blockWiseMatrix                    ,
+useFullMST                     ,
+stateCountMatrix               ,
+wStateCountMatrix              ,
+tryNumericSequenceMatch            ,
+allowSequenceMismatch          ,
+shortMPIReturn                 ,
+mpiPrefixCommand               ,
+skipConjugateGradient          ,
+useIntervalMapping             ,
+intervalMappingMethod          ,
+useAdaptiveVariableStep            ,
+storeRootSupportFlag           ,
+supportMatrixVariable          ,
+optimizationStatusFile         ,
+autoParalellizeLF              ,
+addLFSmoothing                 ,
+reduceLFSmoothing              ;
+
+
+
+bool    CheckEqual                  (_Parameter, _Parameter);
+void    StateCounterResultHandler   (_Formula&, _SimpleList*,long&,long&,long,_Matrix&,_Matrix&);
+
+_LikelihoodFunction*
+FindLikeFuncByName           (_String&);
+
+extern  bool                usedCachedResults;
+
+extern _Parameter           _lfScalerUpwards,
+       _lfScalingFactorThreshold,
+       _logLFScaler;
+
+extern  _GrowingVector      _scalerMultipliers,
+        _scalerDividers;
+
+_Parameter                  acquireScalerMultiplier (long);
+_Parameter                  myLog                   (_Parameter);
+_Parameter                  mapParameterToInverval  (_Parameter, char, bool);
+
+#ifdef  __HYPHYMPI__
+extern                  _Matrix     resTransferMatrix;
+extern                  long        hyphyMPIOptimizerMode;
+extern                  _String     mpiLoopSwitchToOptimize,
+                        mpiLoopSwitchToBGM;
+
+extern                  _SimpleList mpiNodesThatCantSwitch;
+
+long                    RetrieveMPICount            (char);
+void                    MPISwitchNodesToMPIMode     (long);
+
+
+#endif
+
+#endif
+
+
+
+
+
+
+
+
+
diff --git a/src/core/include/list.h b/src/core/include/list.h
new file mode 100644
index 0000000..2b29ae5
--- /dev/null
+++ b/src/core/include/list.h
@@ -0,0 +1,358 @@
+/*
+
+HyPhy - Hypothesis Testing Using Phylogenies.
+
+Copyright (C) 1997-now
+Core Developers:
+  Sergei L Kosakovsky Pond (spond at ucsd.edu)
+  Art FY Poon    (apoon at cfenet.ubc.ca)
+  Steven Weaver (sweaver at ucsd.edu)
+  
+Module Developers:
+	Lance Hepler (nlhepler at gmail.com)
+	Martin Smith (martin.audacis at gmail.com)
+
+Significant contributions from:
+  Spencer V Muse (muse at stat.ncsu.edu)
+  Simon DW Frost (sdf22 at cam.ac.uk)
+
+Permission is hereby granted, free of charge, to any person obtaining a
+copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be included
+in all copies or substantial portions of the Software.
+
+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.
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+*/
+
+#ifndef _HLIST_
+#define _HLIST_
+//#pragma once
+#include "simplelist.h"
+
+#define  MEMORYSTEP 8
+
+//_____________________________________________________________________________
+
+//_____________________________________________________________________________
+
+class _List:public _SimpleList
+{
+
+    public:
+
+        /**
+        * A constructor.
+        * A simple constructor that does nothing
+        */
+        _List();
+
+
+        /**
+        * Length constructor.
+        * @param sL Length of the string
+        */
+        _List(unsigned long);
+
+
+        /**
+        * Stack copy contructor
+        * @param l List to be copied
+        * @param from Beginning index to copy from 
+        * @param to Last index to copy to  
+        */
+        _List(const _List&,long=0,long=-1);
+
+        /**
+        * Construct a list of substrings from the original string separated by char
+        * \n\n \b Example: \code _List list = _List((BaseRef)new _String("one,two,three"), ','); \endcode
+        * @param ss The substring to be parsed, remember to cast it as a BaseRef
+        * @param sep The separator for the string  
+        */
+        _List(BaseRef,char);
+
+        /**
+        * Data constructor (1 member list)
+        * \n\n \b Example: \code _List list = _List((BaseRef)new _String("one")); \endcode
+        * @param br The object to be changed
+        */
+        _List(BaseRef);
+
+        /**
+        * Data constructor list of char* supplied as a variable 
+        * \n\n \b Example: \code _List list = _List((BaseRef)new _String("one")); \endcode
+        * @param char* the first string to add to the list
+        * @param const unsigned long the number of additional char* arguments supplied to the constructor
+        * @param 2-N: char* to be added to the list
+        */
+        _List(const char*, const unsigned long, ...);
+        
+        /**
+        * The deconstructor
+        */
+        virtual ~_List(void);
+
+        /**
+        * Element location function - read/write
+        */
+        BaseRef& operator [] (long);
+
+        /**
+        * Element location functions - read only
+        */
+        BaseRef operator () (const unsigned long);
+
+        /**
+        * Element location functions - read only
+        * used to avoid (*list)(3) which are hard to read
+        */
+        virtual BaseRef GetItem     (const unsigned long);
+
+        /**
+        * Element location functions - read only
+        */
+        virtual _List operator = (_List&);
+
+
+        /**
+        * Append operator
+        * \n\n \b Example: \code _List result_list = list & append_list; \endcode 
+        * @return New concatenated list
+        */
+        _List operator & (_List&);
+
+        /**
+        * Append operator
+        * \n\n \b Example: \code _List result_list = list && new _String("one"); \endcode 
+        * @return Nothing. Acts on list that is being operated on
+        */
+        void operator && (BaseRef);
+
+        /**
+        * Append operator
+        * \n\n \b Example: \code _List result_list = list && "one"; \endcode 
+        */
+        void operator && (const char*);
+
+        /**
+        * Append reference to *this
+        * \n\n \b Example: \code _List result_list << new _String("one"); \endcode 
+        * @return Nothing. Operates on the _List.
+        */
+        void operator << (BaseRef);
+
+        /**
+        * Appends existing list to *this
+        * \n\n \b Example: \code _List result_list << existing_list \endcode 
+        * @param l2 The list to be appended
+        * @return Nothing. Operates on the _List.
+        * @sa AppendNewInstance()
+        */
+        void operator << (_List&);
+
+        /**
+        * Append operator
+        */
+        _List operator & (BaseRef);
+
+        /**
+        * @sa Equal()
+        */
+        bool operator == (_List&);
+
+        /**
+        * Append reference to *this
+        * \n\n \b Example: \code _List result_list << existing_list \endcode 
+        * @param br The object to be appended
+        * @return Nothing. Operates on the _List.
+        * @sa AppendNewInstance()
+        */
+        void AppendNewInstance(BaseRef);
+
+        /**
+        * Find the position of a search string in the list of strings (ONLY)
+        * \n Faster than the Find(), since it assumes string entries
+        * \n\n \b Example: \code _String ("AABBCC").Find("B")\endcode
+        * @param s The substring to find
+        * @param startat The index to start searching from
+        * @param caseSensitive Pass true for a case sensitive search 
+        * @param upTo Upper limit for search index. 
+        * @return -1 if not found, the index if it is found.
+        * @sa Find()
+        * @sa BinaryFind()
+        */
+        virtual long BinaryFind(BaseRef);
+
+        /**
+        * Insert an element into the sorted list preserving the sortedness
+        */
+        long BinaryInsert(BaseRef);
+
+        /**
+        */
+        void bumpNInst(void);
+
+        /**
+        */
+        virtual long Compare(long,long);
+
+        /**
+        */
+        virtual long Compare(BaseRef,long);
+
+        /**
+        * Return number of elements 
+        */
+        unsigned long Count();
+
+        /**
+        */
+        virtual void Clear(bool=true);
+
+        /**
+        * Delete the item at a given poisiton
+        * if the bool flag is false, then only remove the reference to the object 
+        */
+        void Delete(long, bool = true);
+
+        /**
+        */
+        virtual void Duplicate(const BaseRef);
+
+        /**
+        * Delete the item at a given poisiton
+        */
+        virtual void DeleteList(const _SimpleList&);
+
+        /**
+        * Checks if Lists are identical to each other. Must be _String castable 
+        * \n\n \b Example: \code list1.Equal(list2) \endcode 
+        * @return bool, true if identical.
+        * @sa AppendNewInstance()
+        */
+        bool Equal(_List&);
+
+        /**
+        * Find the position of a search string in the list of strings (ONLY)
+        * \n\n \b Example: \code 
+        * _String* needle = new _String("two") 
+        * _List("zero","one,"two").Find((BaseRef)needle)
+        * \endcode
+        * @param s The integer to find
+        * @return -1 if not found, index if found
+        */
+        virtual long Find(BaseRef, long startat = 0);
+
+        /**
+        */
+        virtual long FindPointer(BaseRef b, long startat = 0) {
+
+            return _SimpleList::Find((long)b, startat);
+
+        }
+
+        /**
+        * Find the position of a search string in the list of strings (ONLY)
+        * \n Faster than the Find(), since it assumes string entries
+        * \n\n \b Example: \code _String ("AABBCC").Find("B")\endcode
+        * @param s The substring to find
+        * @param startat The index to start searching from
+        * @param caseSensitive Pass true for a case sensitive search 
+        * @param upTo Upper limit for search index. 
+        * @return -1 if not found, the index if it is found.
+        * @sa Find()
+        * @sa BinaryFind()
+        */
+        virtual long FindString(BaseRef,long startat=0,bool caseSensitive=true,long upTo=-1);
+
+        /**
+        */
+        virtual long FreeUpMemory(long);
+
+
+        /**
+        * Populate a Simple List with integers incrementally.
+        * Example: SimpleList sl.Populate(4, 1, 2) = [1, 3, 5, 7]
+        * @param s The substring to find
+        * @param startat The index to start searching from
+        * @param increment by Pass true for a case sensitive search 
+        * @return Nothing. Acts on the List object it was called from. 
+        */
+        virtual void InsertElement(BaseRef br,long insertAt=-1, bool store=true);
+
+        /**
+        */
+        void Intersect(_List&, _List&, _SimpleList* = nil, _SimpleList* = nil);
+
+        /**
+        * Find the position of a search string in the list of strings (ONLY)
+        * SLKP: 20100811
+        * \n Equivalent to Python's join using the argument as the spacer
+        * \n\n \b Example: \code _String ("AABBCC").Find("B")\endcode
+        * @param spacer What you want to be the spacer 
+        * @param startAt start at this list element 
+        * @param endAt end at this list element 
+        * @return A pointer to the new string 
+        * @sa Find()
+        */
+        BaseRef Join(BaseRef spacer, long startAt = 0, long endAt = -1);
+
+        /**
+        * Identical to << operator. Places new value at the end of the list.
+        * \n\n \b Example: \code list1.Place(new _String("one")) \endcode 
+        * @return Nothing, manipulates *this.
+        * @sa InsertElement()
+        */
+        void Place(BaseRef);
+        
+        
+        /**
+        * Map the values of the first list to the corresponding indices in the second list (treated as STRINGS).
+        * \n\n \b Example: \code ("a","b","d").Map (["b","c","a"], mapping); mapping = (2,0,-1)\endcode 
+        * @param target The target list of the mapping
+        * @param mapping The list that will store the mapping
+        * @return Nothing, manipulates mapping.
+        */
+
+        void Map (_List& target, _SimpleList& mapping);
+
+        /**
+        */
+        virtual BaseRef makeDynamic(void);
+
+        /**
+        * Replace an item
+        * \n\n \b Example: \code list.Replace(1, new _String("one"), false); \endcode 
+        * @param index The location in the list to be replaced
+        * @param newObj The object to be inserted
+        * @param dup Allows a duplication
+        * @return Nothing, manipulates *this.
+        */
+        void Replace(long,BaseRef,bool dup=true);
+
+        /**
+        */
+        virtual BaseRef toStr(void);
+
+        /**
+        */
+        virtual void toFileStr(FILE*);
+
+};
+
+//TODO:Can we avoid using this extern?
+extern _List pathNames;
+
+#endif
diff --git a/src/core/include/mathobj.h b/src/core/include/mathobj.h
new file mode 100644
index 0000000..060e766
--- /dev/null
+++ b/src/core/include/mathobj.h
@@ -0,0 +1,316 @@
+/*
+ 
+ HyPhy - Hypothesis Testing Using Phylogenies.
+ 
+ Copyright (C) 1997-now
+ Core Developers:
+ Sergei L Kosakovsky Pond (spond at ucsd.edu)
+ Art FY Poon    (apoon at cfenet.ubc.ca)
+ Steven Weaver (sweaver at ucsd.edu)
+ 
+ Module Developers:
+ Lance Hepler (nlhepler at gmail.com)
+ Martin Smith (martin.audacis at gmail.com)
+ 
+ Significant contributions from:
+ Spencer V Muse (muse at stat.ncsu.edu)
+ Simon DW Frost (sdf22 at cam.ac.uk)
+ 
+ Permission is hereby granted, free of charge, to any person obtaining a
+ copy of this software and associated documentation files (the
+ "Software"), to deal in the Software without restriction, including
+ without limitation the rights to use, copy, modify, merge, publish,
+ distribute, sublicense, and/or sell copies of the Software, and to
+ permit persons to whom the Software is furnished to do so, subject to
+ the following conditions:
+ 
+ The above copyright notice and this permission notice shall be included
+ in all copies or substantial portions of the Software.
+ 
+ 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.
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ 
+ */
+
+#ifndef     __MATHOBJ__
+#define     __MATHOBJ__
+
+#include "baseobj.h"
+#include "defines.h"
+#include "errorfns.h"
+#include "list.h"
+#include "avllistx.h"
+#include "hy_strings.h"
+#include "_hyExecutionContext.h"
+
+class   _MathObject : public BaseObj  //abstract math operations class
+{
+
+public:
+
+    virtual _MathObject* Add        (_MathObject*)     {
+        warnError (-666); ;
+        return this;
+    }
+    virtual _MathObject* Sub        (_MathObject*)     {
+        warnError (-666);
+        return this;
+    }
+    virtual _MathObject* Minus      (void)             {
+        warnError (-666);
+        return this;
+    }
+    virtual _MathObject* Sum        (void)             {
+        warnError (-666);
+        return this;
+    }
+    virtual _MathObject* Mult       (_MathObject*)     {
+        warnError (-666);
+        return this;
+    }
+    virtual _MathObject* Div        (_MathObject*)     {
+        warnError (-666);
+        return this;
+    }
+    virtual _MathObject* lDiv       (_MathObject*)     {
+        warnError (-666);
+        return this;
+    }
+    virtual _MathObject* longDiv    (_MathObject*)     {
+        warnError (-666);
+        return this;
+    }
+    virtual _MathObject* Raise      (_MathObject*)     {
+        warnError (-666);
+        return this;
+    }
+    virtual void         Assign     (_MathObject*)     {
+        warnError (-666);
+    }
+    virtual bool         Equal      (_MathObject*)     {
+        warnError (-666);
+        return false;
+    }
+    virtual _MathObject* Abs        (void)             {
+        warnError (-666);
+        return this;
+    }
+    virtual _MathObject* Sin        (void)             {
+        warnError (-666);
+        return this;
+    }
+    virtual _MathObject* Cos        (void)             {
+        warnError (-666);
+        return this;
+    }
+    virtual _MathObject* Tan        (void)             {
+        warnError (-666);
+        return this;
+    }
+    virtual _MathObject* Exp        (void)             {
+        warnError (-666);
+        return this;
+    }
+    virtual _MathObject* Log        (void)             {
+        warnError (-666);
+        return this;
+    }
+    virtual _MathObject* Sqrt       (void)             {
+        warnError (-666);
+        return this;
+    }
+    virtual _MathObject* Gamma      (void)             {
+        warnError (-666);
+        return this;
+    }
+    virtual _MathObject* Erf        (void)             {
+        warnError (-666);
+        return this;
+    }
+    virtual _MathObject* LnGamma    (void)             {
+        warnError (-666);    // <-- added by afyp, February 7, 2007
+        return this;
+    }
+    virtual _MathObject* Beta       (_MathObject*)     {
+        warnError (-666);
+        return this;
+    }
+    virtual _MathObject* IGamma     (_MathObject*)     {
+        warnError (-666);
+        return this;
+    }
+    virtual _MathObject* CChi2      (_MathObject*)     {
+        warnError (-666);
+        return this;
+    }
+    virtual _MathObject* IBeta      (_MathObject*,_MathObject*) {
+        warnError (-666);
+        return this;
+    }
+    virtual _MathObject* Simplex    (void)             {
+        warnError (-666);
+        return this;
+    }
+    virtual _MathObject* Min        (_MathObject*)     {
+        warnError (-666);
+        return this;
+    }
+    virtual _MathObject* Max        (_MathObject*)     {
+        warnError (-666);
+        return this;
+    }
+    virtual _MathObject* InvChi2    (_MathObject*)     {
+        warnError (-666);
+        return this;
+    }
+    virtual _MathObject* ZCDF       (void)             {
+        warnError (-666);
+        return this;
+    }
+    virtual _MathObject* Time       (void)             {
+        warnError (-666);
+        return this;
+    }
+    virtual _MathObject* Arctan     (void)             {
+        warnError (-666);
+        return this;
+    }
+    virtual _MathObject* Less       (_MathObject*)     {
+        warnError (-666);
+        return this;
+    }
+    virtual _MathObject* Random     (_MathObject*)     {
+        warnError (-666);
+        return this;
+    }
+    virtual _MathObject* Greater    (_MathObject*)     {
+        warnError (-666);
+        return this;
+    }
+    virtual _MathObject* LessEq     (_MathObject*)     {
+        warnError (-666);
+        return this;
+    }
+    virtual _MathObject* GreaterEq  (_MathObject*)     {
+        warnError (-666);
+        return this;
+    }
+    virtual _MathObject* AreEqual   (_MathObject*)     {
+        warnError (-666);
+        return this;
+    }
+    virtual _MathObject* NotEqual   (_MathObject*)     {
+        warnError (-666);
+        return this;
+    }
+    virtual _MathObject* LAnd       (_MathObject*)     {
+        warnError (-666);
+        return this;
+    }
+    virtual _MathObject* LOr        (_MathObject*)     {
+        warnError (-666);
+        return this;
+    }
+    virtual _MathObject* GammaDist  (_MathObject*,_MathObject*) {
+        warnError (-666);
+        return this;
+    }
+    virtual _MathObject* CGammaDist (_MathObject*,_MathObject*) {
+        warnError (-666);
+        return this;
+    }
+    virtual _MathObject* LNot       (void)             {
+        warnError (-666);
+        return this;
+    }
+    virtual _MathObject* TipCount   (void)             {
+        warnError (-666);
+        return this;
+    }
+    virtual _MathObject* BranchCount (void)            {
+        warnError (-666);
+        return this;
+    }
+    virtual _MathObject* TipName     (_MathObject*)    {
+        warnError (-666);
+        return this;
+    }
+    virtual _MathObject* BranchName  (_MathObject*)    {
+        warnError (-666);
+        return this;
+    }
+    virtual _MathObject* BranchLength(_MathObject*)    {
+        warnError (-666);
+        return this;
+    }
+    virtual _MathObject* RerootTree  (_MathObject*)    {
+        warnError (-666);
+        return this;
+    }
+    virtual _MathObject* TEXTreeString(_MathObject*) {
+        warnError (-666);
+        return this;
+    }
+    virtual _MathObject* Type                          (void);
+    virtual _MathObject* PlainTreeString(_MathObject*) {
+        warnError (-666);
+        return this;
+    }
+    virtual _MathObject* FormatNumberString (_MathObject*,_MathObject*) {
+        warnError (-666);
+        return this;
+    }
+    virtual _Parameter   Value (void)              {
+        warnError (-666);
+        return 0.0;
+    }
+    virtual _MathObject* Compute (void)            {
+        return this;
+    }
+    virtual void         ScanForVariables (_AVLList&,bool = false, _AVLListX* = nil, long = 0)
+    {}
+
+    virtual      BaseRef makeDynamic               (void);
+    virtual bool         IsVariable (void)         {
+        return false;
+    }
+    virtual bool         IsObjectEmpty (void)      {
+        return true;
+    }
+    virtual bool         IsPrintable (void)        {
+        return false;
+    }
+
+    virtual bool         IsIndependent (void)       {
+        return true;
+    }
+    virtual unsigned long  ObjectClass (void)       {
+        return HY_UNDEFINED;
+    }
+    // returns a unique ID for this object
+    // 0 - undefined
+    // 1 - number
+    // 4 - matrix
+
+    virtual _MathObject* Execute (long opCode, _MathObject* p = nil , _MathObject* p2 = nil, _hyExecutionContext* context = _hyDefaultExecutionContext);
+    // execute this operation with the list of Args
+
+    virtual bool         HasChanged (void) {
+        return false;
+    }
+
+    virtual   bool       IsConstant (void) {
+        return true;
+    }
+};
+
+// pointer to a math object
+typedef _MathObject* _PMathObj ;
+
+
+#endif
diff --git a/src/core/include/matrix.h b/src/core/include/matrix.h
new file mode 100644
index 0000000..0aa2da5
--- /dev/null
+++ b/src/core/include/matrix.h
@@ -0,0 +1,774 @@
+/*
+
+HyPhy - Hypothesis Testing Using Phylogenies.
+
+Copyright (C) 1997-now
+Core Developers:
+  Sergei L Kosakovsky Pond (spond at ucsd.edu)
+  Art FY Poon    (apoon at cfenet.ubc.ca)
+  Steven Weaver (sweaver at ucsd.edu)
+  
+Module Developers:
+	Lance Hepler (nlhepler at gmail.com)
+	Martin Smith (martin.audacis at gmail.com)
+
+Significant contributions from:
+  Spencer V Muse (muse at stat.ncsu.edu)
+  Simon DW Frost (sdf22 at cam.ac.uk)
+
+Permission is hereby granted, free of charge, to any person obtaining a
+copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be included
+in all copies or substantial portions of the Software.
+
+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.
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+*/
+
+#ifndef     __MATRIX__
+#define     __MATRIX__
+
+#include "hy_strings.h"
+#include "avllistx.h"
+#include "variablecontainer.h"
+#include "trie.h"
+
+#define     _POLYNOMIAL_TYPE 0
+#define     _NUMERICAL_TYPE  1
+#define     _FORMULA_TYPE 2
+#define     _SIMPLE_FORMULA_TYPE 3
+
+#define     HY_MATRIX_COLUMN_VECTOR     1
+#define     HY_MATRIX_ROW_VECTOR        2
+
+//_____________________________________________________________________________________________
+
+#define      _HY_MATRIX_RANDOM_DIRICHLET         01L
+#define      _HY_MATRIX_RANDOM_GAUSSIAN          02L
+#define      _HY_MATRIX_RANDOM_WISHART           03L
+#define      _HY_MATRIX_RANDOM_INVERSE_WISHART   04L
+#define      _HY_MATRIX_RANDOM_MULTINOMIAL       05L
+
+extern        _Trie        _HY_MatrixRandomValidPDFs;
+
+//_____________________________________________________________________________________________
+
+class _Formula;
+/*__________________________________________________________________________________________________________________________________________ */
+
+struct      _CompiledMatrixData {
+
+    _SimpleFormulaDatum * theStack,
+                        * varValues;
+
+    _Parameter         * formulaValues;
+
+    long      * formulaRefs;
+    bool        has_volatile_entries;
+
+    _SimpleList varIndex,
+                formulasToEval;
+
+};
+
+/*__________________________________________________________________________________________________________________________________________ */
+
+class       _Matrix: public _MathObject
+{
+
+public:
+
+    // constructors
+
+    _Matrix ();                                 // default constructor, doesn't do much
+
+    _Matrix (_String&, bool = false, _VariableContainer* = nil);
+    // matrix from a string of the form
+    // {{i11,i12,...}{i21,i22,..}{in1,in2..)})
+    // or {# rows,<# cols>{i1,j1,expr}{i2,j2,expr}..}
+    // elements may be arbitrary formulas
+
+    _Matrix (long theHDim, long theVDim, bool sparse = false, bool allocateStorage = false);    // create an empty matrix of given dimensions;
+
+
+
+    // creates an empty matrix of given dimensions;
+    // the first flag specifies whether it is sparse or not
+    // the second is the storage type -- see below
+
+//  _Matrix (long, long, int, bool);
+    // a test function which generates a random matrix of given dimensions
+    // where the third parameter specifies the percentage of 0 entries and
+    // the first flag indicates how to store the matrix: as spars or usual
+
+    _Matrix ( _Matrix &);                       //duplicator
+
+    _Matrix ( _SimpleList &, long = -1);        // make matrix from simple list
+    // the optional argument C (if > 0) tells HyPhy
+    // to make a matrix with C elements per row
+    // if <= 0 - a row matrix is returned
+
+    _Matrix ( _List &);                         //make string matrix from a list
+
+    _Matrix (_Parameter *, unsigned long, unsigned long);
+    /*
+        20110616 SLKP
+            added a simple constructor from a list of floating point values
+            first argument: the values (must be at least 2nd arg x 3rd arg long)
+            second argument: how many rows
+            second argument: how many columns
+
+    */
+
+    ~_Matrix (void);                            //destructor
+
+    virtual void    Clear (void);               //deletes all the entries w/o destroying the matrix
+
+    void    Initialize (void);                  // zeros all matrix structures
+
+    virtual void        Serialize (_String&,_String&);
+    // write the matrix definition in HBL
+
+    virtual bool        IsAVector (char = 0);   // is a vector? 0 - either row or column; 1 column; 2 row
+
+    _PMathObj           Evaluate (bool replace = true); // evaluates the matrix if contains formulas
+    // if replace is true, overwrites the original
+
+    virtual _PMathObj   Execute (long opCode, _PMathObj p = nil, _PMathObj p2 = nil, _hyExecutionContext* context = _hyDefaultExecutionContext);
+    // execute this operation with the list of Args
+
+    _PMathObj   MAccess (_PMathObj, _PMathObj);
+    // implements the M[i][j] operation for formulas
+    _PMathObj   MCoord (_PMathObj, _PMathObj);
+    // implements the M[i][j] operation for formulas
+
+    void        MStore (long, long, _Formula&, long = -1);
+    bool        MResolve (_PMathObj, _PMathObj, long&, long&);
+    // resolve coordiates from two Number arguments
+
+    bool        CheckCoordinates ( long&, long&);
+    // validate matrix coordinates
+
+    void        MStore (_PMathObj, _PMathObj, _Formula&, long = HY_OP_CODE_NONE);
+    // implements the M[i][j]= operation for formulas
+    /*
+        20100811: the last argument provides an op code (-1 = none)
+        to perform on the _Formula argument and the current value in the matrix;
+        this only applies to constant _Formula arguments
+
+        e.g. passing HY_OP_CODE_ADD implements +=
+     */
+
+    void        MStore (long, long, _PMathObj);
+    void        MStore (_PMathObj, _PMathObj, _PMathObj);
+    // implements the M[i][j]= operation for objects
+    virtual _PMathObj   Compute (void);         // returns the numeric value of this matrix
+
+    virtual _PMathObj   ComputeNumeric (bool = false);  // returns the numeric value of this matrix
+    virtual _PMathObj   RetrieveNumeric (void); // returns the numeric value of this matrix
+
+    virtual void        ScanForVariables  (_AVLList&, bool inclG = false, _AVLListX* tagger = nil,long weight = 0);
+    virtual void        ScanForVariables2 (_AVLList&, bool inclG = false, long modelID = -1, bool inclCat = true, _AVLListX* tagger = nil,long weight = 0);
+    // scans for all local independent variables on which the matrix depends
+    // and stores them in the list passed as the parameter
+
+    virtual bool        IsIndependent (void)   {
+        return storageType!=_FORMULA_TYPE;
+    }
+    // used to determine whether the matrix contains references
+    // to other unknowns
+
+    virtual unsigned long        ObjectClass (void)      {
+        return MATRIX;
+    }
+
+    void     operator = (_Matrix&);             // assignment operation on matrices
+    void     operator = (_Matrix*);             // assignment operation on matrices with temp results
+
+    virtual _PMathObj    Random (_PMathObj);    // reshuffle the matrix
+
+    virtual _PMathObj    AddObj (_PMathObj);    // addition operation on matrices
+
+    virtual _PMathObj    SubObj (_PMathObj);    // subtraction operation on matrices
+
+    virtual _PMathObj    MultObj (_PMathObj);   // multiplication operation on matrices
+
+    virtual _PMathObj    MultElements (_PMathObj, bool elementWiseDivide = false);  // element wise multiplication/division operation on matrices
+
+    virtual _PMathObj    Sum          (void);
+
+    _Matrix     operator + (_Matrix&);          // addition operation on matrices
+
+    _Matrix     operator - (_Matrix&);          // subtraction operation on matrices
+
+    _Matrix     operator * (_Matrix&);          // multiplication operation on matrices
+
+    _Matrix     operator * (_Parameter);        // multiplication of a matrix by a number
+
+    void        operator += (_Matrix&);         // add/store operation on matrices
+
+    void        operator -= (_Matrix&);         // subtract/store operation on matrices
+
+    void        operator *= (_Matrix&);         // multiply/store operation on matrices
+
+    void        operator *= (_Parameter);       // multiply by a #/store operation on matrices
+
+    void        AplusBx  (_Matrix&, _Parameter); // A = A + B*x (scalar)
+
+    void        Sqr         (_Parameter* _hprestrict_);
+    // square the matrix; takes a scratch vector
+    // of at least lDim doubles
+
+    _List*      ComputeRowAndColSums            (void);
+    _Matrix*    MutualInformation               (void);
+    void        FillInList                      (_List&, bool = false);
+    // SLKP 20101108:
+    //               added a boolean flag to allow numeric matrices
+    //               to be implicitly converted to strings
+
+    _Matrix*    NeighborJoin                    (bool);
+    _Matrix*    MakeTreeFromParent              (long);
+    _Matrix*    ExtractElementsByEnumeration    (_SimpleList*,_SimpleList*,bool=false);
+    _Matrix*    SimplexSolve                    (_Parameter = 1.e-6);
+
+
+//  void        SqrStrassen (void);
+// square the matrix by Strassen's Multiplication
+
+
+    _Matrix*    Exponentiate (void);                // exponent of a matrix
+    void        Transpose (void);                   // transpose a matrix
+    _Matrix     Gauss   (void);                     // Gaussian Triangularization process
+    _PMathObj   LUDecompose (void);
+    _PMathObj   CholeskyDecompose (void);
+    // added by afyp July 6, 2009
+    _PMathObj   Eigensystem (void);
+    _PMathObj   LUSolve (_PMathObj);
+    _PMathObj   Inverse (void);
+    _PMathObj   Abs (void);                     // returns the norm of a matrix
+    // if it is a vector - returns the Euclidean length
+    // otherwise returns the largest element
+
+    _Parameter  AbsValue                        (void);
+    virtual     _PMathObj Log                   (void);
+    // return the matrix of logs of every matrix element
+    
+    void        SwapRows (const long, const long);
+    long        CompareRows (const long, const long);
+
+    _Parameter  operator () (long, long);       // read access to an element in a matrix
+    _Parameter& operator [] (long);             // read/write access to an element in a matrix
+
+    void        Store               (long, long, _Parameter);                       // write access to an element in a matrix
+    void        StoreObject         (long, long, _MathObject*, bool dup = false);
+    void        StoreObject         (long,  _MathObject*,bool dup = false);
+    void        StoreFormula        (long, long, _Formula&, bool = true, bool = true);
+    void        NonZeroEntries      (_SimpleList&);
+
+    void        UpdateDiag          (long ,long , _MathObject*);
+
+    void        Swap                (_Matrix&);         // fast swap matrix data
+    friend      void                SetIncrement (int); // storage parameter access
+    friend      void                CreateMatrix    (_Matrix*, long, long, bool, bool, bool);
+    // an auxiliary function which creates an empty
+    // matrix of given dimensions and storage class (normal/sparse)
+    // and storage type (pointer/array)
+
+    friend      void                DuplicateMatrix (_Matrix*,  _Matrix*);
+    // an auxiliary function which duplicates a matrix
+
+
+    _Parameter          MaxElement      (char doSum = 0, long * = nil);
+    // SLKP 20101022: added an option to return the sum of all elements as an option (doSum = 1) or
+    // the sum of all absolute values (doSum == 2)
+    // returns the largest element's abs value for given matrix
+    // SLKP 20110523: added an option (doSum == 3) to return the largest element (no abs value)
+    // for run modes 0 and 3, if the 2nd argument is non-nil, the index of the winning element will be stored
+
+    _Parameter          MinElement      (char doAbs = 1, long * = nil);
+
+    // SLKP 20110620: added the 2nd argument to optionally store the index of the smallest element
+    //              : added the option to NOT do absolute values
+    // returns the smallest, non-zero element value for given matrix
+
+    bool                IsMaxElement    (_Parameter);
+    // true if there is an elem abs val of which is greater than the arg
+    // false otherwise
+
+
+    _Parameter              MaxRelError(_Matrix&);
+
+//  friend      _Matrix     IterateStrassen (_Matrix&, _Matrix&);
+    // used in Strassen Squaring
+
+    virtual     BaseRef     makeDynamic (void); // duplicate this object into a dynamic copy
+
+    virtual     void        Duplicate   (BaseRef obj); // duplicate this object into a dynamic copy
+
+    virtual     BaseRef     toStr       (void);       // convert this matrix to a string
+
+    virtual     void        toFileStr   (FILE*dest);
+
+    bool        AmISparse               (void);
+
+    _Parameter  ExpNumberOfSubs         (_Matrix*,bool);
+
+    virtual     bool        IsVariable  (void) {
+        return storageType != _NUMERICAL_TYPE;
+    }
+    // is this matrix a constant or a variable quantity?
+
+    virtual     bool        IsConstant  (void);
+
+    virtual     bool        IsPrintable (void) {
+        return storageType != _FORMULA_TYPE;
+    }
+    
+    virtual     bool        Equal       (_PMathObj);
+
+    void        ExportMatrixExp         (_Matrix*, FILE*);
+    bool        ImportMatrixExp         (FILE*);
+
+    _Parameter  FisherExact             (_Parameter, _Parameter, _Parameter);
+
+    virtual     bool        HasChanged  (void);
+    // have any variables which are referenced by the elements changed?
+
+    virtual     long
+    GetHDim                     (void) {
+        return hDim;
+    }
+    long        GetVDim                     (void) {
+        return vDim;
+    }
+    long        GetSize                     (void) {
+        return lDim;
+    }
+    long        GetMySize                   (void) {
+        return sizeof(_Matrix)+lDim*(storageType==_NUMERICAL_TYPE?sizeof(_Parameter):sizeof(Ptr));
+    }
+
+    void        PopulateConstantMatrix      (const _Parameter);
+    /* SLKP 20090818
+            fill out a numeric matrix with a fixed value
+            if the matrix is sparse, only will out the non-void entries
+     */
+
+    _Formula*   GetFormula                  (long, long);
+    _PMathObj   MultByFreqs                 (long);
+    _PMathObj   EvaluateSimple              (void);
+    _PMathObj   SortMatrixOnColumn          (_PMathObj);
+    _PMathObj   K_Means                     (_PMathObj);
+    _PMathObj   pFDR                        (_PMathObj);    // positive false discovery rate
+    _PMathObj   PoissonLL                   (_PMathObj);    // log likelihood of a vector of poisson samples given a parameter value
+
+
+    // added by afyp, July 1, 2009
+    _PMathObj   DirichletDeviate            (void);         // this matrix used for alpha hyperparameters
+    _PMathObj   GaussianDeviate             (_Matrix &);    //  "   "   "   "       mean hyperparameter, additional argument for variance
+    _PMathObj   InverseWishartDeviate       (_Matrix &);    //  "   "   "   "       rho hyperparameter, additional for phi matrix
+    _PMathObj   WishartDeviate              (_Matrix &, _Matrix &),
+                WishartDeviate                (_Matrix &);
+
+    _PMathObj   MultinomialSample           (_Constant*);
+    /* SLKP 20110208: an internal function to draw the multinomial sample
+
+        the matrix _base_ must be 2xN, where each _row_ lists
+
+            value (integer 0 to N-1, but not enforced), probability
+
+        the function will normalize by sum of all the values in the second column
+
+        the constant argument is the number of replicates (M) to draw
+
+        returns an 1xN matrix with counts of how often each value has been drawn
+
+     */
+
+
+
+    bool        IsReversible                (_Matrix* = nil);
+    // check if the matrix is reversible
+    // if given a base frequencies assumes that rate matrix entries will not be multiplied by freq terms
+
+    bool        IsAStringMatrix             (void);
+    void        MakeMeSimple                (void);
+    void        MakeMeGeneral               (void);
+    void        ConvertToSimpleList         (_SimpleList&);
+    void        CompressSparseMatrix        (bool, _Parameter*);
+    //prepare the transition probs matrix for exponentiation
+
+    long        Hash (long, long);                  // hashing function, which finds matrix
+    // physical element in local storage buffer
+    // returns -1 if insufficient storage
+    // returns a negative number
+    // if element was not found, the number returned
+    // indicates the first available slot
+
+    _Parameter*       fastIndex(void)   {
+        return (!theIndex)&&(storageType==_NUMERICAL_TYPE)?(_Parameter*)theData:nil;
+    }
+    inline            _Parameter&         directIndex(long k)   {
+        return theData[k];
+    }
+    long              MatrixType (void) {
+        return storageType;
+    }
+    bool              SparseDataStructure (void) {
+        return theIndex;
+    }
+    void              CheckIfSparseEnough (bool = false);       // check if matrix is sparse enough to justify
+    void              Convert2Formulas      (void);     // converts a numeric matrix to formula-based mx
+    // sparse storage
+
+    void              Resize                (long);     // resize a dense numeric matrix to have more rows
+
+    _String*          BranchLengthExpression(_Matrix*, bool);
+
+    void              CopyABlock                        (_Matrix*, long, long, long = 0, long = 0);
+    /* starting at element (row -- 2nd argument, column -- 3rd argument)
+       copy the source matrix (1st argument) row by row
+
+       e.g. if this matrix is 3x4 and the source matrix is 2x2
+       then copying from element 2,2 (0 - based as always)
+       will result in
+
+    [[ x x x x]
+       [ x x x x]
+     [ x x y y]]
+
+       where y is used to denote an element copied from the source
+     4th and 5th arguments override source.hDim and source.vDim,
+       respectively, if they are positive
+
+     Note that both matrices are ASSUMED to be numeric and dense
+
+       NO ERROR CHECKING IS DONE!
+
+     */
+    /*---------------------------------------------------*/
+
+    _Parameter   *theData;                            // matrix elements
+
+
+protected:
+
+    // data
+
+    long        hDim, vDim, lDim;               // matrix physical dimensions; lDim - length of
+    // actual storage allocated
+
+    long*       theIndex;                       // indices of matrix elements in logical storage
+
+private:
+
+    _Parameter  computePFDR         (_Parameter, _Parameter);
+    void        InitMxVar           (_SimpleList&   , _Parameter);
+    bool        ProcessFormulas     (long&, _SimpleList&, _SimpleList&, _SimpleList&, _AVLListX&, bool = false, _Matrix* = nil);
+
+    _PMathObj   PathLogLikelihood   (_PMathObj);
+    /* SLKP: 20100812
+
+     This function assumes that 'this' an 3xK matrix, where each column is of the form
+     A: integer in [0,N-1], B: integer in [0,N-1], T: real >= 0
+
+     and the argument is an NxN RATE matrix for a Markov chain
+
+     The return value is the \sum_ j = 0 ^ {K-1} Prob {A_j -> B_j | T_j}
+     */
+
+    _PMathObj   ProfileMeanFit      (_PMathObj);
+
+    _Matrix*    branchLengthStencil (void);
+
+    //bool      IsAStringMatrix     (void);
+    void        Add                 (_Matrix&, _Matrix&, bool sub = false);
+    // aux arithmetic rountines
+    bool        AddWithThreshold    (_Matrix&, _Parameter);
+    void        RowAndColumnMax     (_Parameter&, _Parameter&, _Parameter* = nil);
+    void        Subtract            (_Matrix&, _Matrix&);
+    void        Multiply            (_Matrix&, _Parameter);
+    void        Multiply            (_Matrix&, _Matrix&);
+    bool        IsNonEmpty          (long);
+    // checks to see if the i-th position in the storage is non-empty
+    bool        CheckDimensions     (_Matrix&);
+    // compare dims of 2 matrices to see if they can be multiplied
+    long        HashBack            (long);
+    // hashing function, which finds matrix
+    // physical element given local storage
+    void        MultbyS             (_Matrix&,bool,_Matrix* = nil, _Parameter* = nil);
+    // internal function used in exponentiating sparse matrices
+
+    void        Balance             (void);  // perform matrix balancing; i.e. a norm reduction which preserves the eigenvalues
+    // lifted from balanc function in NR
+
+    void        Schur               (void);  // reduce the matrix to Hessenberg form preserving eigenvalues
+    // lifted from elmhes function in NR
+
+    void        EigenDecomp         (_Matrix&,_Matrix&);  // find the eigenvalues of a real matrix
+    // return real and imaginary parts
+    // lifted from hqr in NR
+
+
+    bool        AmISparseFast       (_Matrix&);
+
+    bool        IncreaseStorage     (void);
+    // expand the buffer, where elements are held
+    // returns TRUE/FALSE for success/failure
+
+
+    void        BreakPoints             (long, long, _SimpleList*);
+    void        RecursiveIndexSort      (long, long, _SimpleList*);
+    void        ConvertFormulas2Poly    (bool force2numbers=true);
+    void        ConvertNumbers2Poly     (void);
+    void        AgreeObjects            (_Matrix&);
+
+    void        ClearFormulae           (void);             // internal reuseable purger
+    void        ClearObjects            (void);             // internal reuseable purger
+    inline
+    _MathObject*&
+    GetMatrixObject         (long ind) {
+        return ((_MathObject**)theData)[ind];
+    }
+    inline
+    bool        CheckObject             (long ind) {
+        return ((_MathObject**)theData)[ind]!=nil;
+    }
+
+    void        SimplexHelper1          (long, _SimpleList&, long, bool, long&, _Parameter&);
+    void        SimplexHelper2          (long&, long, _Parameter);
+    void        SimplexHelper3          (long,long,long,long);
+    //  helper functions for SimplexSolver
+
+    // if nil - matrix stored conventionally
+
+    static      int     storageIncrement,       // how many percent of full matrix size
+                // to allocate to the matrix storage per increment
+
+                precisionArg,                    // how many elements in exp series to truncate after
+
+                switchThreshold;                 // maximum percentage of non-zero elements
+    // to keep the matrix sparse
+
+    static      _Parameter truncPrecision;
+
+    // matrix exp truncation precision
+
+    long        storageType,                    // true element matrix(1) or a matrix of pointers(0) which do not need to be deleted
+                // 2, if elements of the matrix are actually formulas which must be initialized to numerics before use
+                // matrices of type two are merely storage tables and can not be operated on directly, i.e their
+                // numerical values are computed first
+                bufferPerRow,                   // values reflecting internal storage structure for
+                overflowBuffer,                 // sparse matrices
+                allocationBlock;
+
+    _CompiledMatrixData*
+    cmd;
+
+    _PMathObj   theValue;                       // stores evaluated values of the matrix
+};
+
+/*__________________________________________________________________________________________________________________________________________ */
+
+class   _GrowingVector: public _Matrix
+// automatically growing matrix class
+{
+
+public:
+    _GrowingVector  (bool = true);
+    virtual     ~_GrowingVector (void) {};
+
+    virtual     BaseRef     makeDynamic (void); // duplicate this object into a dynamic copy
+    virtual     void        Duplicate   (BaseRef); // duplicate an object from reference
+
+    virtual     void        Clear (void);
+
+    virtual     long        GetHDim                     (void) {
+        if (isColumn) {
+            return GetUsed();
+        }
+        return 1;
+    }
+    virtual     long        GetVDim                     (void) {
+        if (!isColumn) {
+            return GetUsed();
+        }
+        return 1;
+    }
+    long   Store            (_Parameter);
+    long   GetUsed          (void) {
+        return used;
+    }
+    void     ZeroUsed       (void) {
+        used = 0;
+    }
+
+    void    operator <<     (const _SimpleList&);
+
+    long   used;
+    bool   isColumn;
+};
+
+/*__________________________________________________________________________________________________________________________________________ */
+
+class   _NTupleStorage: public _Matrix
+// a way to associate floating points
+// with ordered K-tuples indices of the form 0<=i_1 < i_2 < ... < i_K < N, where N>=K
+// see http://en.wikipedia.org/wiki/Combinadic
+{
+
+public:
+    _NTupleStorage  (void) {
+        storageN = 0;
+        storageK = 0;
+    }
+    // null constructor; does next to nothing
+    _NTupleStorage  (unsigned long,unsigned long);
+    // [long] - what is the maximum value for an index (N>=0; N=0 - empty set)
+    // [long] - how many indices in an ordered K-tuple (K), must be <=N; if K>N, then it will be reset to Min(1,N)
+    // will allocate an array of the appropriate dimension and zero it
+    // _NTupleStorage will set N=K=0 if the memory required to store the array exceeds MAX_LONG bytes (a good proxy for
+    // the maximum addressable space in the system)
+
+    virtual     ~_NTupleStorage (void) {};
+
+    virtual     BaseRef     makeDynamic (void);
+    // create a copy of the object dynamic copy
+
+    // getters for N and K
+    unsigned long GetN      (void) {
+        return storageN;
+    }
+    unsigned long GetK      (void) {
+        return storageK;
+    }
+
+    bool            CheckKTuple     (_SimpleList&);
+    // modify (in-place) the argument to make it an ordered K-tuple; will also check dimensions and such
+    // returns true if the k-tuple if valid; false otherwise
+
+    unsigned long   Index           (_SimpleList&);
+    // return an index into the linear array pointed to by the K-tuple in the argument (ASSUMED to be valid here!)
+
+    _Parameter      DirectIndex     (unsigned long);
+    // retrieve a value using a direct index for the K-tuple (computed by Index)
+
+    unsigned long   Store           (_Parameter, _SimpleList&);
+    // associate a value with the K-tuple; returns the direct index for the value
+
+    _Parameter      Retrieve        (_SimpleList&);
+    // return the value associated with the K-tuple
+
+    void            IndexToTuple    (unsigned long, _SimpleList&);
+    // given a direct index in 0..(NcK-1); return a K-tuple corresponding to that index
+
+
+private:
+
+    unsigned long   storageN,
+             storageK;
+
+    _SimpleList     C_NK_Lookup; // an (K+1)x(N+1) linear array which stores I choose J in element (J,I)
+
+};
+
+
+
+/*__________________________________________________________________________________________________________________________________________ */
+
+class           _AssociativeList: public _MathObject
+{
+public:
+    _AssociativeList                    (void);
+    virtual ~_AssociativeList           (void) {}
+
+    bool    ParseStringRepresentation   (_String&, bool = true, _VariableContainer* = nil);
+    /* SLKP 20090803
+
+        Parse the list represented as
+            {"key": value, ...}
+
+        the boolean argument is supplied to request reporting/suppression of error messages
+
+        returns true on successful parse
+
+     */
+
+    virtual BaseRef     toStr           (void);
+    virtual _PMathObj   Execute         (long opCode, _PMathObj = nil, _PMathObj = nil, _hyExecutionContext* context = _hyDefaultExecutionContext);
+    virtual BaseRef     makeDynamic     (void);
+    virtual _PMathObj   Compute         (void);
+    virtual void        Merge           (_PMathObj);
+    /* 20100907: SLKP
+            A simple function to merge two lists;
+            the combined list will have the key set equal to the union of the two input key sets
+            if there are conflicting values for a given key, an undefined value will be stored in
+            for the corresponding key
+
+
+     */
+
+    virtual void        Duplicate       (BaseRef);
+    _PMathObj           MAccess         (_PMathObj);
+
+    _PMathObj           MIterator       (_PMathObj, _PMathObj);
+    /* perform a function call (ID stored in the first argument)
+       having performed [an optional] conditional check on the associated key (either empty for noop or a function ID)
+       Both functional IDs MUST be defined and take TWO and ONE argumens respectively
+
+       returns the number of items processed
+    */
+
+    _PMathObj           GetByKey        (_String&, long);
+    _PMathObj           GetByKey        (_String&);
+    _PMathObj           GetByKey        (long, long);
+    void                DeleteByKey     (_PMathObj);
+    _PMathObj           MCoord          (_PMathObj);
+    void                MStore          (_PMathObj, _PMathObj, bool = true, long = HY_OP_CODE_NONE);
+    // SLKP 20100811: see the comment for _Matrix::MStore
+
+    void                MStore          (_String  , _PMathObj, bool = true);
+    void                MStore          (_String  , _String);
+    virtual unsigned long        ObjectClass     (void)      {
+        return ASSOCIATIVE_LIST;
+    }
+    _List*              GetKeys         (void);
+    void                FillInList      (_List&);
+    _String*            Serialize       (_String&);
+    
+    /**
+     * Traverse the dictionary, cast each value into a float and return their sum.
+     * Note that matrices and dictionary values will be processed recursively, i.e. "Sum" will be called on them.
+     * All values that cannot be cast to a float will be treated as 0.
+     * @return The sum of all dictionary elements.
+     */
+    _PMathObj           Sum             (void);
+
+    _AVLListXL          avl;
+
+private:
+
+    _List           theData;
+};
+
+/*__________________________________________________________________________________________________________________________________________ */
+
+extern  _Matrix *GlobalFrequenciesMatrix;
+// the matrix of frequencies for the trees to be set by block likelihood evaluator
+extern  _Parameter  ANALYTIC_COMPUTATION_FLAG;
+
+void       InsertStringListIntoAVL  (_AssociativeList* , _String, _SimpleList&, _List&);
+void       InsertVarIDsInList       (_AssociativeList* , _String, _SimpleList&);
+#endif
diff --git a/src/core/include/mypthread.h b/src/core/include/mypthread.h
new file mode 100644
index 0000000..9f0b143
--- /dev/null
+++ b/src/core/include/mypthread.h
@@ -0,0 +1 @@
+/*
 
 HyPhy - Hypothesis Testing Using Phylogenies.
 
 Copyright (C) 1997-now
 Core Developers:
 Sergei L Kosakovsky Pond (spond at ucsd.edu)
 Art FY Poon    (apoon at cfenet.ubc.ca)
 Steven Weaver (sweaver at ucsd.edu)
 
 Module Developers:
 Lance Hepler (nlhepler at gmail.com)
 Martin Smith (martin.audacis at gmail.com)
 
 Significant contributions from:
 Spencer V Muse (muse at stat.ncsu.edu)
 Simon DW Frost (sdf22 at cam.ac.uk)
 
 Permission is hereby granted, free of charge, to any person obtaining a
 copy of this software and associated documentation files (the
 "Software"), to deal in the Software without restriction, including
 without limitation the rights to use, copy, modify, merge, publish,
 distribute, sublicense, and/or sell copies of the Software, and to
 permit persons to whom the Software is furnished to do so, subject to
 the following conditions:
 
 The above copyright notice and this permission notice shall be included
 in all copies or substantial portions of the Software.
 
 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.
 IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
 CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
 TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
 SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 
 */
//#define           _BSD_CLOCK_T_DEFINED_
//#define       _BSD_SIZE_T_DEFINED_
//#define           _BSD_SSIZE_T_DEFINED_
//#define           _BSD_TIME_T_DEFINED_
//#undef            __dest_os
//#define       __dest_os __mac_os_x
#include        "time.h"
#include        <pthread.h>
//#undef            __dest_os
//#define       __dest_os __mac_os

#include        "CFBundle.h"
#include        "CFString.h"
#include        "Folders.h"


/*#define            _MAC

#ifndef __POSIX_LIB__

struct _pthread_handler_rec
{
    void           (*routine)(void *);
    void           *arg;                 /
    struct _pthread_handler_rec *next;
};


extern "C"{

#define __PTHREAD_SIZE__           596
#define __PTHREAD_ATTR_SIZE__      36
#define __PTHREAD_MUTEXATTR_SIZE__ 8
#define __PTHREAD_MUTEX_SIZE__     40
#define __PTHREAD_CONDATTR_SIZE__  4
#define __PTHREAD_COND_SIZE__      24
#define __PTHREAD_ONCE_SIZE__      4


typedef struct _opaque_pthread_t { long sig; struct _pthread_handler_rec  *cleanup_stack; char opaque[__PTHREAD_SIZE__];} *pthread_t;

typedef struct _opaque_pthread_attr_t { long sig; char opaque[__PTHREAD_ATTR_SIZE__]; } pthread_attr_t;

typedef struct _opaque_pthread_mutexattr_t { long sig; char opaque[__PTHREAD_MUTEXATTR_SIZE__]; } pthread_mutexattr_t;

typedef struct _opaque_pthread_mutex_t { long sig; char opaque[__PTHREAD_MUTEX_SIZE__]; } pthread_mutex_t;

typedef struct _opaque_pthread_condattr_t { long sig; char opaque[__PTHREAD_CONDATTR_SIZE__]; } pthread_condattr_t;

typedef struct _opaque_pthread_cond_t { long sig;  char opaque[__PTHREAD_COND_SIZE__]; } pthread_cond_t;

typedef struct { long sig; char opaque[__PTHREAD_ONCE_SIZE__]; } pthread_once_t;

#endif

typedef unsigned long pthread_key_t;
}*/




/*extern "C"{
typedef int       (*pthread_join_ptr) (pthread_t thread, void **value_ptr);
typedef int       (*pthread_create_ptr)(pthread_t *thread,
                                         const pthread_attr_t *attr,
                                         void *(*start_routine)(void *),
                                         void *arg);

typedef int       (*pthread_mutex_lock_ptr)   (pthread_mutex_t *mutex);
typedef int       (*pthread_mutex_unlock_ptr) (pthread_mutex_t *mutex);

extern  pthread_join_ptr            pthread_join_p;
extern  pthread_create_ptr          pthread_create_p;
extern  pthread_mutex_lock_ptr      pthread_mutex_lock_p;
extern  pthread_mutex_unlock_ptr    pthread_mutex_unlock_p;
}
*/

typedef void*  (*PThreadHook)      ( void* data );

void    *MachOFunctionPointerForCFMFunctionPointer( void *cfmfp );

void*   ThreadReleafFunctionAA      (void* arg);
void*   ThreadReleafFunctionCodon   (void* arg);
void*   ThreadReleafFunctionNuc     (void* arg);
void*   ThreadReleafFunctionMNuc    (void* arg);
void*   ThreadReleafFunctionMAA     (void* arg);
void*   ThreadReleafFunctionMCodon  (void* arg);
void*   MatrixUpdateFunction        (void* arg);

extern  PThreadHook
ThreadReleafFunctionAAHook,
ThreadReleafFunctionCodonHook,
ThreadReleafFunctionNucHook,
ThreadReleafFunctionMNucHook,
ThreadReleafFunctionMAAHook,
ThreadReleafFunctionMCodonHook,
MatrixUpdateFunctionHook,
StateCounterMPHook;

OSStatus LoadFrameworkBundle(CFStringRef framework, CFBundleRef *bundlePtr);
void    ImportBundle (void);
\ No newline at end of file
diff --git a/src/core/include/operation.h b/src/core/include/operation.h
new file mode 100644
index 0000000..b9e8523
--- /dev/null
+++ b/src/core/include/operation.h
@@ -0,0 +1,149 @@
+/*
+ 
+ HyPhy - Hypothesis Testing Using Phylogenies.
+ 
+ Copyright (C) 1997-now
+ Core Developers:
+ Sergei L Kosakovsky Pond (spond at ucsd.edu)
+ Art FY Poon    (apoon at cfenet.ubc.ca)
+ Steven Weaver (sweaver at ucsd.edu)
+ 
+ Module Developers:
+ Lance Hepler (nlhepler at gmail.com)
+ Martin Smith (martin.audacis at gmail.com)
+ 
+ Significant contributions from:
+ Spencer V Muse (muse at stat.ncsu.edu)
+ Simon DW Frost (sdf22 at cam.ac.uk)
+ 
+ Permission is hereby granted, free of charge, to any person obtaining a
+ copy of this software and associated documentation files (the
+ "Software"), to deal in the Software without restriction, including
+ without limitation the rights to use, copy, modify, merge, publish,
+ distribute, sublicense, and/or sell copies of the Software, and to
+ permit persons to whom the Software is furnished to do so, subject to
+ the following conditions:
+ 
+ The above copyright notice and this permission notice shall be included
+ in all copies or substantial portions of the Software.
+ 
+ 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.
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ 
+ */
+
+#ifndef     __OPERATION__
+#define     __OPERATION__
+
+#include "baseobj.h"
+#include "list.h"
+#include "hy_strings.h"
+#include "mathobj.h"
+
+extern  _List BuiltInFunctions;
+
+
+class _Stack;
+class _VariableContainer;
+class _Formula;
+//__________________________________________________________________________________
+class   _Operation : public BaseObj
+{
+
+    friend class _Formula;
+    friend class _Variable;
+    friend class _VariableContainer;
+
+public:
+    _Operation  (void);
+    _Operation  (_String&, const long);
+    // construct the operation by its symbol and, if relevant -
+    // number of operands
+    _Operation  (const long,const long);
+
+    _Operation  (bool, _String&, bool isG = false, _VariableContainer*  = nil, bool take_a_reference = false);
+    // store a variable or a constant
+    _Operation  (_PMathObj);
+    // store a non-numeric constant
+
+    virtual ~_Operation (void);
+
+    virtual   BaseObj*      makeDynamic         (void);
+
+    bool            Execute             (_Stack&, _VariableContainer* = nil, _String* errMsg = nil); //execute this operation
+    // see the commend for _Formula::ExecuteFormula for the second argument
+    virtual   void          StackDepth          (long&);
+
+    bool            ExecutePolynomial   (_Stack&,_VariableContainer* nameSpace = nil, _String* errMsg = nil);
+    virtual   BaseObj*      toStr               (void);    //convert the op to string
+
+    virtual   void          Initialize          (void);
+    virtual   void          Duplicate           (BaseRef);
+    _String&    GetCode             (void) {
+        return (opCode>-1)&&(numberOfTerms>=0)?*(_String*)BuiltInFunctions(opCode):empty;
+    }
+    long&       TheCode             (void) {
+        return opCode;
+    }
+    virtual  bool           IsAVariable         (bool = true) ; // is this object a variable or not?
+    virtual  bool           IsConstant          (void);         // does this object depend on any independent variables or not?
+    virtual  bool           IsAFunctionCall          (void);       
+
+    virtual  long           UserFunctionID      (void) {
+        return numberOfTerms < 0 ? -numberOfTerms-1 : -1;
+    };
+    // return a non-neg number (function index) if this is a user function,
+    // otherwise, return -1
+
+    virtual  long           GetAVariable        (void) {    // return the index of the variable
+        return theData>=-2?theData:-theData-3;
+    }
+
+    virtual  void           SetAVariable        (long d) {  // return the index of the variable
+        theData=d;
+    }
+
+    virtual  bool           AssignmentVariable  (void) {
+        return theData<-2;
+    }
+
+    virtual  bool           HasChanged          (void);
+
+    virtual  void           SetTerms            (long d) {
+        numberOfTerms=d;
+    }
+
+    virtual  _PMathObj      GetANumber          (void) {
+        return theNumber;
+    }
+
+    virtual  void           SetNumber           (_PMathObj d) {
+        theNumber=d;
+    }
+
+    long            GetNoTerms          (void) {
+        return numberOfTerms;
+    }
+    long            PrecedenceLevel     (void);
+
+    bool            CanResultsBeCached (_Operation *, bool exp_only = false);
+
+
+    virtual bool            EqualOp             (_Operation*);
+
+protected:
+
+    bool        ReportOperationExecutionError ( _String, _String*);
+
+    long        opCode;         // internal operation code
+    long        numberOfTerms,  // 1 - unary, 2 - binary, etc
+                theData;
+    _PMathObj   theNumber;
+};
+
+#endif
diff --git a/src/core/include/parser.h b/src/core/include/parser.h
new file mode 100644
index 0000000..e17212c
--- /dev/null
+++ b/src/core/include/parser.h
@@ -0,0 +1,208 @@
+/*
+
+HyPhy - Hypothesis Testing Using Phylogenies.
+
+Copyright (C) 1997-now
+Core Developers:
+  Sergei L Kosakovsky Pond (spond at ucsd.edu)
+  Art FY Poon    (apoon at cfenet.ubc.ca)
+  Steven Weaver (sweaver at ucsd.edu)
+  
+Module Developers:
+	Lance Hepler (nlhepler at gmail.com)
+	Martin Smith (martin.audacis at gmail.com)
+
+Significant contributions from:
+  Spencer V Muse (muse at stat.ncsu.edu)
+  Simon DW Frost (sdf22 at cam.ac.uk)
+
+Permission is hereby granted, free of charge, to any person obtaining a
+copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be included
+in all copies or substantial portions of the Software.
+
+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.
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+*/
+
+#ifndef     __PARSER__
+#define     __PARSER__
+
+#include "baseobj.h"
+#include "list.h"
+#include "avllistx.h"
+#include "hy_strings.h"
+#include "errorfns.h"
+#include "stdio.h"
+#include "classes.h"
+
+//Parser specific includes
+#include "constant.h"
+#include "defines.h"
+#include "formula.h"
+#include "fstring.h"
+#include "mathobj.h"
+#include "operation.h"
+#include "stack.h"
+#include "variable.h"
+#include "variablecontainer.h"
+#include "trie.h"
+
+//End parser specific includes
+
+#include "matrix.h"
+
+extern  _List BuiltInFunctions;
+
+class   _ExecutionList; 
+class   _hyExecutionContext;
+
+
+//__________________________________________________________________________________
+
+#define  USE_POINTER_VC
+
+extern      _List           variablePtrs,
+            hyReservedWords;
+
+extern      _SimpleList     BuiltInFunctionParameterCount,
+            *deferSetFormula;
+
+extern      _AVLListX       variableNames;
+
+extern      _String         HalfOps;
+
+extern      _Trie           UnOps;
+
+extern      _Parameter      printDigits,
+            verbosityLevel;
+
+extern      long            lastMatrixDeclared,
+            subNumericValues;
+
+long        LocateVarByName (_String&);
+_Variable*  LocateVar       (long index);
+_Variable*  FetchVar        (long index);
+_PMathObj   FetchObjectFromVariableByType       (_String*, const unsigned long, long = -1, _String* = nil);
+_PMathObj   FetchObjectFromVariableByTypeIndex  (long, const unsigned long, long = -1, _String* = nil);
+_String     FetchObjectNameFromType (const unsigned long);
+_String&    AppendContainerName     (_String&, _VariableContainer*);
+_String&    AppendContainerName     (_String&, _String*);
+_String*    FetchMathObjectNameOfTypeByIndex (const unsigned long objectClass, const long objectIndex);
+
+void        DeleteVariable  (_String&, bool deleteself = true);
+void        DeleteVariable  (long, bool deleteself);
+
+void        DeleteTreeVariable
+(_String&, _SimpleList&,bool);
+void        checkParameter  (_String& name, _Parameter& dest, _Parameter def, _VariableContainer* = nil);
+void        stashParameter  (_String& name, _Parameter  newVal, bool);
+void        setParameter    (_String& name, _Parameter def, _String* = nil);
+void        setParameter    (_String& name, _PMathObj  def, bool = true, _String* = nil);
+
+long        VerbosityLevel (void);
+void        ReplaceVar      (_Variable*);
+void        RenameVariable  (_String*,_String*);
+void        CompileListOfUserExpressions
+(_SimpleList&,_List&, bool doAll = false);
+
+void        FindUnusedObjectName
+(_String&, _String&, _List&, bool = false);
+
+void        FindUnusedObjectName
+(_String&, _String&, _AVLListX&, bool = false);
+
+bool        ExpressionCalculator(void);
+bool        ExpressionCalculator(_String data);
+
+_Variable*  CheckReceptacle
+(_String*,_String, bool = true, bool = false);
+
+bool        CheckReceptacleAndStore
+(_String*,_String, bool, _PMathObj, bool = true);
+
+bool        CheckReceptacleAndStore
+(_String,_String, bool, _PMathObj, bool = true);
+
+_Variable*  CheckReceptacleCommandID
+(_String* name, const long id, bool checkValid, bool isGlobal = false, _ExecutionList* context = nil);
+
+bool        CheckReceptacleCommandIDAndStore
+(_String* name, const long id, bool checkValid, _PMathObj v, bool dup = true, bool isGlobal = false);
+
+void        FinishDeferredSF(void);
+
+void        SetupOperationLists (void);
+void        ExportIndVariables
+(_String&, _String&, _SimpleList*);
+void        ExportDepVariables
+(_String&, _String&, _SimpleList*);
+void        ExportCatVariables
+(_String&, _SimpleList*);
+
+void        SplitVariablesIntoClasses
+(_SimpleList&, _SimpleList&, _SimpleList&, _SimpleList&);
+bool        CheckEqual      (_Parameter,_Parameter);
+
+extern      _AVLListX       _hyApplicationGlobals;
+
+/**
+    A utility function to take a list of variable indices and split them into local and global
+
+    @param   inList supplies the input list (all variable indices are assumed to be valid!)
+    @param   outList a list of two _SimpleLists: index 0 for global variables, and index 1 for local variables
+    @author  SLKP
+    @version 20110608
+*/
+void        SplitVariableIDsIntoLocalAndGlobal (const _SimpleList& inList, _List& outList);
+
+_Parameter  AddNumbers  (_Parameter, _Parameter);
+_Parameter  SubNumbers  (_Parameter, _Parameter);
+_Parameter  MultNumbers (_Parameter, _Parameter);
+_Parameter  AndNumbers  (_Parameter, _Parameter);
+_Parameter  DivNumbers  (_Parameter, _Parameter);
+_Parameter  EqualNumbers(_Parameter, _Parameter);
+_Parameter  LessThan    (_Parameter, _Parameter);
+_Parameter  GreaterThan (_Parameter, _Parameter);
+_Parameter  LessThanE   (_Parameter, _Parameter);
+_Parameter  GreaterThanE(_Parameter, _Parameter);
+_Parameter  Power       (_Parameter, _Parameter);
+_Parameter  RandomNumber(_Parameter, _Parameter);
+_Parameter  ExpNumbers  (_Parameter);
+_Parameter  LogNumbers  (_Parameter);
+_Parameter  AbsNumber   (_Parameter);
+_Parameter  MinusNumber (_Parameter);
+_Parameter  MaxNumbers  (_Parameter, _Parameter);
+_Parameter  MinNumbers  (_Parameter, _Parameter);
+_Parameter  FastMxAccess(Ptr, _Parameter);
+
+BaseRef parameterToString       (_Parameter);
+void    parameterToCharBuffer   (_Parameter, char*, long, bool json = false);
+
+_Parameter  InterpolateValue        (_Parameter*, _Parameter*, long, _Parameter*, _Parameter*, _Parameter, _Parameter&);
+_Parameter  TrapezoidLevelK         (_Formula&, _Variable*, _Parameter, _Parameter, long);
+_Parameter  TrapezoidLevelKSimple   (_Formula&, _Variable*, _Parameter, _Parameter, long, _SimpleFormulaDatum*, _SimpleFormulaDatum*, _SimpleList&, _SimpleList&);
+
+
+void        PopulateArraysForASimpleFormula
+(_SimpleList&, _SimpleFormulaDatum*);
+
+void        WarnNotDefined (_PMathObj, long, _hyExecutionContext* );
+
+extern      _Parameter  pi_const;
+extern      bool        useGlobalUpdateFlag;
+extern      _String     noneToken;
+
+#endif
diff --git a/src/core/include/polynoml.h b/src/core/include/polynoml.h
new file mode 100644
index 0000000..c2aa7dc
--- /dev/null
+++ b/src/core/include/polynoml.h
@@ -0,0 +1,203 @@
+/*
+
+HyPhy - Hypothesis Testing Using Phylogenies.
+
+Copyright (C) 1997-now
+Core Developers:
+  Sergei L Kosakovsky Pond (spond at ucsd.edu)
+  Art FY Poon    (apoon at cfenet.ubc.ca)
+  Steven Weaver (sweaver at ucsd.edu)
+  
+Module Developers:
+	Lance Hepler (nlhepler at gmail.com)
+	Martin Smith (martin.audacis at gmail.com)
+
+Significant contributions from:
+  Spencer V Muse (muse at stat.ncsu.edu)
+  Simon DW Frost (sdf22 at cam.ac.uk)
+
+Permission is hereby granted, free of charge, to any person obtaining a
+copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be included
+in all copies or substantial portions of the Software.
+
+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.
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+*/
+
+#ifndef     __POLY__
+#define     __POLY__
+
+#include "parser.h"
+
+#define   POLY_DATA_INCREMENT 10
+#define   GLOBAL_VARIABLE   1
+#define   CATEGORY_VARIABLE 2
+#define   RANDOM_VARIABLE   3
+
+
+//__________________________________________________________________________________
+
+class _PolynomialData : public BaseObj
+{
+
+public:
+
+    _PolynomialData (void);
+    _PolynomialData (long);
+    _PolynomialData (_PolynomialData&);
+    _PolynomialData (long,long, _Parameter*);
+
+    virtual ~_PolynomialData ();
+
+    virtual BaseObj*    makeDynamic(void);
+    virtual void        Duplicate  (BaseRef);
+
+    inline  _Parameter*         GetCoeff (void) {
+        return theCoeff;
+    }
+    inline  _Parameter&         GetCoeff (long index) {
+        return theCoeff[index];
+    }
+
+    long    *           GetTerm (long);
+    long                GetNoTerms (void) {
+        return actTerms;
+    }
+    void                AddTerm (long*, _Parameter);
+    void                AddTerm (long*, _Parameter, long*, long);
+    void                AddTerm (_Parameter);
+    void                WriteTerm (long*,long);
+    void                DeleteTerm (long);
+    bool                IsFirstANumber (void);
+    inline long         NumberOfTerms (void) {
+        return actTerms;
+    }
+    long                SumOfPowers (long);
+    long                WeightedSumOfPowers (long,_Parameter*);
+
+    // temp!
+
+    bool                checkMe (void);
+
+    friend class _Polynomial;
+
+    void                MultiplyTerms (long*, long*, long*);
+    void                RaiseTerm     (long*, long);
+    static  _Parameter  BinaryRaise   (_Parameter, long);
+    static  void        RearrangeTerm (long*, long*, long*,long);
+    char                CompareTerms  (long*, long*);
+    char                CompareTerms  (long*, long*, long*, long);
+    char                CompareTerms  (long*, long*, long*, long*, long, long);
+    long                FindTerm      (long*, long*, long start = 0);
+    void                ResortTerms   (long*);
+    void                ChopTerms     (void);
+    bool                checkTerm     (_Parameter, long);
+
+
+protected:
+
+    _Parameter*     theCoeff;
+    long*           thePowers;
+    long            numberVars, actTerms, allocTerms;
+
+};
+
+//__________________________________________________________________________________
+
+class _Polynomial : public _MathObject
+{
+
+public:
+
+    _Polynomial             (void);
+    _Polynomial             (_SimpleList&);
+    _Polynomial             (_Polynomial&);
+    _Polynomial             (_Parameter);
+    _Polynomial             (_Variable&);
+    virtual                 ~_Polynomial ();
+    virtual                 _MathObject* Execute (long opCode, _MathObject* p = nil , _MathObject* p2 = nil, _hyExecutionContext* context = _hyDefaultExecutionContext);   // execute this operation with the list of Args
+
+    virtual BaseObj*        makeDynamic(void);
+    virtual void            Duplicate  (BaseRef);
+
+    virtual _MathObject*    Add                 (_MathObject*);
+    virtual _MathObject*    Plus                (_MathObject*, bool subtract = false);
+    virtual _MathObject*    Sub                 (_MathObject*);
+    virtual _MathObject*    Raise               (_MathObject*);
+    virtual _MathObject*    Minus               (void);
+    virtual _MathObject*    Mult                (_MathObject*);
+    virtual _MathObject*    Compute             (void);
+    virtual bool            Equal               (_MathObject*);
+    _Parameter              ComputePolynomial   (void);
+
+    _Parameter              ComputeP            (_Parameter* , _Parameter* , long , long, long*, long*);
+    _MathObject*            IsANumber           (bool = false);
+    virtual  bool           IsObjectEmpty       (void);
+
+    virtual unsigned long            ObjectClass (void) {
+        return POLYNOMIAL;
+    }
+    virtual _Parameter      Value (void) {
+        return ComputePolynomial();
+    }
+
+    virtual BaseObj*        toStr (void);
+    void                    CheckTerm(void);
+
+    virtual void            toFileStr (FILE*);
+
+    long                    GetNoVariables(void) {
+        return variableIndex.countitems();
+    }
+    _PolynomialData*        GetTheTerms(void) {
+        return theTerms;
+    }
+    void                    SetTheTerms(_PolynomialData* td) {
+        theTerms = td;
+    }
+    void                    SetCLists(_SimpleList& c1,_SimpleList& c2) {
+        compList1.Duplicate(&c1);
+        compList2.Duplicate(&c2);
+    }
+    virtual void            ScanForVariables (_AVLList &l, bool globals = false, _AVLListX* tagger = nil, long weight = 0);
+    virtual bool            HasChanged (void);
+    friend  void            ResetPolynomialCheck
+    (_Polynomial*);
+    long                    ComputationalSize (void) {
+        return compList1.countitems();
+    }
+    bool                    IsMaxElement    (_Parameter);
+    void                    Convert2ComputationForm
+    (_SimpleList *c1 = nil, _SimpleList *c2 = nil, _SimpleList* termsToInclude = nil);
+    void                    RankTerms       (_SimpleList*);
+protected:
+
+    void                DropSmallTerms(void);
+    void                Convert2OperationForm(void);
+
+    _SimpleList         variableIndex,
+                        compList1,
+                        compList2;
+
+    _PolynomialData *   theTerms;
+
+
+};
+
+extern _Parameter dropPrecision, topPolyCap, dropTerms, enforcePolyCap,
+       maximumPolyTermsPerVariable, maxPolynomialExpIterates,polynomialExpPrecision;
+void    SetPolyTermCap (long);
+#endif
\ No newline at end of file
diff --git a/src/core/include/sequence.h b/src/core/include/sequence.h
new file mode 100644
index 0000000..8c7f9cc
--- /dev/null
+++ b/src/core/include/sequence.h
@@ -0,0 +1,129 @@
+/*
+
+HyPhy - Hypothesis Testing Using Phylogenies.
+
+Copyright (C) 1997-now
+Core Developers:
+  Sergei L Kosakovsky Pond (spond at ucsd.edu)
+  Art FY Poon    (apoon at cfenet.ubc.ca)
+  Steven Weaver (sweaver at ucsd.edu)
+  
+Module Developers:
+	Lance Hepler (nlhepler at gmail.com)
+	Martin Smith (martin.audacis at gmail.com)
+
+Significant contributions from:
+  Spencer V Muse (muse at stat.ncsu.edu)
+  Simon DW Frost (sdf22 at cam.ac.uk)
+
+Permission is hereby granted, free of charge, to any person obtaining a
+copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be included
+in all copies or substantial portions of the Software.
+
+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.
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+*/
+
+#ifndef _HXSTRINGS_
+#define _HXSTRINGS_
+//#pragma once
+#include "hy_strings.h"
+
+#define    NOCOMPRESSION   0
+#define    LZWCOMPRESSION  1
+#define    FREQCOMPRESSION 2
+
+#define    NUCLEOTIDEALPHABET 128
+#define    CODONALPHABET      64
+#define    FULLALPHABET       32
+#define    FULLNUCLALPHABET   16
+
+
+
+//_________________________________________________________
+
+class _CString:public _String   // compressible string
+{
+
+public:
+    _CString (void);
+    //does nothing
+    _CString (_String&);
+    // string contructor
+    _CString (char*);
+    // data constructor
+    _CString (unsigned long l, bool flag);
+    // data constructor
+    _CString (char);
+    // data constructor
+    virtual     ~_CString(void);
+    //destructor
+
+    virtual void operator << (_String*);
+    // append into operator
+
+    virtual void operator << (char);
+    // append into operator
+
+    virtual void Finalize (void);
+
+    virtual     BaseRef makeDynamic (void);
+    // create a dynamic copy of this object
+
+    virtual     long    FreeUpMemory (long);
+
+    void        SetFlag (unsigned char flag) {
+        compressionType|=flag;
+    }
+    bool        IsFlag  (unsigned char flag) {
+        return (bool)(compressionType&flag);
+    }
+    static      _String*    SelectAlpha (unsigned char);
+
+    _Parameter      LZWCompress (unsigned char theAlpha); // returns compression ratio
+    _Parameter      FrequencyCompress(unsigned char theAlpha, bool  doit = true);
+    _Parameter      BestCompress(unsigned char theAlpha, long triggerSize = 25);
+
+    _String*        Decompress (void);
+
+    bool        IsCompressed (void) {
+        return (IsFlag (LZWCOMPRESSION)||IsFlag(FREQCOMPRESSION));
+    }
+
+    void        SetDecompressed (void) {
+        compressionType&=0xf0;
+    }
+
+    virtual     void    Duplicate (BaseRef ref);
+
+
+    _String*        DecompressFrequency (void);
+    _String*        DecompressLZW (void);
+
+    // compression flag
+
+    unsigned long            allocatedSpace;
+private:
+
+    unsigned char    compressionType;
+};
+
+//_________________________________________________________
+
+
+void        SetAlphabet (_String&);
+
+#endif
diff --git a/src/core/include/simplelist.h b/src/core/include/simplelist.h
new file mode 100644
index 0000000..345b853
--- /dev/null
+++ b/src/core/include/simplelist.h
@@ -0,0 +1,478 @@
+/*
+
+HyPhy - Hypothesis Testing Using Phylogenies.
+
+Copyright (C) 1997-now
+Core Developers:
+  Sergei L Kosakovsky Pond (spond at ucsd.edu)
+  Art FY Poon    (apoon at cfenet.ubc.ca)
+  Steven Weaver (sweaver at ucsd.edu)
+  
+Module Developers:
+	Lance Hepler (nlhepler at gmail.com)
+	Martin Smith (martin.audacis at gmail.com)
+
+Significant contributions from:
+  Spencer V Muse (muse at stat.ncsu.edu)
+  Simon DW Frost (sdf22 at cam.ac.uk)
+
+Permission is hereby granted, free of charge, to any person obtaining a
+copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be included
+in all copies or substantial portions of the Software.
+
+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.
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+*/
+
+#ifndef _SIMPLELIST_
+#define _SIMPLELIST_
+//#pragma once
+#include "string.h"
+#include "baseobj.h"
+
+#define  MEMORYSTEP 8
+
+class _SimpleList:public BaseObj
+{
+    friend class _AVLList;
+
+    protected:
+        //memory allocated enough for this many slots
+        unsigned long laLength;
+
+    public:
+        //Data Members
+        long* lData;
+        unsigned long lLength;//actual length
+
+        //Methods
+
+        /*
+        ==============================================================
+        Constructors
+        ==============================================================
+        */
+
+        //does nothing
+        _SimpleList();
+
+        //length constructor
+        _SimpleList(unsigned long);
+
+        // stack copy contructor
+        _SimpleList(_SimpleList&,long=0,long=-1);
+
+        // data constructor (1 member list)
+        _SimpleList(long);
+
+        // arithmetic series populator: size, first item, step
+        _SimpleList(long,long,long);
+
+        //destructor
+        virtual ~_SimpleList(void);
+
+
+        /**
+         * Data constructor list of longs supplied as a variable
+         * @param long the first string to add to the list
+         * @param const unsigned long the number of additional long arguments supplied to the constructor
+         * @param 2-N: long to be added to the list
+         */
+        _SimpleList(const long, const unsigned long, ...);
+
+    /*
+        ==============================================================
+        Operator Overloads
+        ==============================================================
+        */
+
+        // element location functions - read/write
+        long& operator [] (const long);
+
+        // element location functions - read only
+        long operator () (const unsigned long);
+
+        // assignment operator
+        virtual _SimpleList operator = (_SimpleList);
+
+        // append operator
+        virtual _SimpleList operator & (_SimpleList);
+
+        // append number to this
+        virtual void operator << (long);
+
+        // append number to this if it's not in the list (search first). List assumed unsorted.
+        virtual bool operator >> (long);
+
+        virtual void operator << (_SimpleList&);
+
+
+        /*
+        ==============================================================
+        Methods
+        ==============================================================
+        */
+
+        /**
+        * Retrieve the element in position index if index if positive or 
+        * length + index if index is negative
+        * Example: SimpleList(1,3,5,7).GetElement(1) = 3, SimpleList(1,3,5,7).GetElement(-1) = 7 
+        * @param index The index of the elemnt to retrieve 
+        * @return the value of the element at the specified index.
+        */
+        long GetElement (const long index);
+
+        /**
+        * Find the position of a search string in the list of strings (ONLY)
+        * Example: SimpleList(1,3,5,7).Find(3,3) = -1 
+        * @param s The integer to find
+        * @param startAt Index to start at 
+        * @return -1 if not found, index if found
+        */
+        virtual long BinaryFind(long, long startAt=0);
+
+        // insert an element into the sorted list preserving the sortedness
+        long BinaryInsert(long);
+
+        void Clear(bool = true);
+
+        /* SLKP: 20110209
+         * An UGLY hack to automate clearing lists that have pointers to formulas in them 
+        */
+        void ClearFormulasInList(void);
+
+        /**
+        * Compares two parts of the list 
+        * Example: SimpleList sl(1,3,5).Compare(0,1) = -1 
+        * @param i The index to compare 
+        * @param j The second index to compare
+        * @return -1 if i<j, 0 if i==j, or 1 if i>j 
+        */
+        virtual long Compare(long,long);
+        virtual long Compare(BaseRef,long);
+
+        long CountCommonElements(_SimpleList&, bool=false);
+
+        /**
+        //Lists length
+        * Example: SimpleList SimpleList([4, 1, 2]).countitems() = 4 
+        * @return Unsigned long of item length    
+        */
+        unsigned long countitems(void);
+
+        /**
+        * SLKP: 20090611    
+        * Print the names of variables whose indices are
+        * contained in the list
+        * @return Nothing. Prints out to screen 
+        */
+        void DebugVarList(void);
+
+        // delete the item at a given poisiton
+        void Delete(long, bool=true);
+
+        virtual void Duplicate(BaseRef);
+
+        /**
+        * Delete all duplicates in a sorted list
+        * Example: SimpleList(1,3,3,5,7).DeleteDuplicates() = [1,3,5,7] 
+        * @return Nothing. Acts on the List object it was called from. 
+        */
+        void DeleteDuplicates(void);
+
+        /**
+        * Delete list of indices in a sorted list
+        * Example: SimpleList(1,3,5,7).DeleteList([0,1,2]) = [7] 
+        * @param toDelete SimpleList of indices to  
+        * @return Nothing. Acts on the List object it was called from. 
+        */
+        virtual void DeleteList(const _SimpleList&);
+
+        // shift a range of elements in the array
+        void Displace(long,long,long);
+
+        /**
+        * Much like [] and () except negative indices return offsets from the end. Invalid indices return 0;
+        * Example: SimpleList(1,3,5,7).Element(1) = [3]
+        * @param index Which item you want.
+        * @return A long    
+        */
+        long Element(long);
+
+        /**
+        * Checks if list is identical to other list 
+        * Example: _SimpleList([4, 1, 2]).Equal(_SimpleList([4, 1, 2]) = 4 
+        * @return true if equal. 
+        */
+        bool Equal(_SimpleList&);
+
+        /**
+        * Retain all those elements that are between (strictly) the 1st and the 2nd argument
+        * Example: SimpleList(1,3,5,7).FilterRange(2,4) = [3,5,7] 
+        * @param lb Start of new list 
+        * @param ub End of new list 
+        * @return Nothing. Operates on class that called it. 
+        */
+        virtual void FilterRange(long, long);
+
+        /**
+        * Find the position of a search string in the list of strings (ONLY)
+        * Example: SimpleList(1,3,5,7).Find(3,3) = -1 
+        * @param s The integer to find
+        * @param startAt Index to start at 
+        * @return -1 if not found, index if found
+        */
+        virtual long Find(long, long startAt = 0);
+
+        /**
+        * Same as find, but steps over indices 
+        * Example: SimpleList(1,3,5,7).Find(3,3) = -1 
+        * @param s The integer to find
+        * @param step The number to skip between searches 
+        * @param startAt Index to start at 
+        * @return -1 if not found, index if found
+        */
+        virtual long FindStepping(long, long, long=0);
+
+        /** 
+        * Flips the list 
+        * Example: SimpleList sl(1,2,3).Flip() = [3,2,1]
+        * @return Nothing. Acts on the List object it was called from. 
+        */
+        void Flip(void); //flip the order of list elements
+
+        virtual void Initialize(bool = true);
+
+        /**
+        * Insert an element at a specific point
+        * Example: SimpleList sl.Populate(4, 1, 2).InsertElement(1,1,?,false)
+        * @param br The variable to insert 
+        * @param insertAt The position to insert into
+        * @param store 
+        * @param pointer 
+        * @return Nothing. Acts on the List object it was called from. 
+        */
+        virtual void InsertElement(BaseRef br,long insertAt=-1, bool store=true, bool pointer=true);
+
+        void Intersect(_SimpleList&, _SimpleList&);
+
+        BaseRef ListToPartitionString(void);
+
+        virtual BaseRef makeDynamic(void);
+
+        /**
+        * SLKP: 20090508
+        * Return the maximum value in the list 
+        * Example: _SimpleList([4, 1, 2]).Min() = 1 
+        * @return maximum value in the list 
+        */
+        long Max(void);
+
+
+        /**
+        * SLKP: 20090508
+        * Return the sum of all values in the list 
+        * Example: _SimpleList([4, 1, 2]).Sum() = 7 
+        * @return the sum of all values in the list 
+        */
+        long Sum (void);
+
+        /**
+        * Populate a Simple List with integers incrementally.
+        * Example: SimpleList sl.Populate(4, 1, 2) = [1, 3, 5, 7]
+        * @param s The substring to find
+        * @param startat The index to start searching from
+        * @param increment by Pass true for a case sensitive search 
+        * @return Nothing. Acts on the List object it was called from. 
+        */
+        void Merge(_SimpleList& l1, _SimpleList& l2, _SimpleList* mergeResults = nil, _SimpleList* mergeResults2 = nil);
+
+        /**
+        * SLKP: 20090508
+        * Return the minimum value in the list 
+        * Example: _SimpleList([4, 1, 2]).Min() = 1 
+        * @return minimum value in the list 
+        */
+        long Min(void);
+
+
+        /**
+        * Initialize the function to select all k-element subsets of a given simple list
+        * @param state  a state-storing simple list; will be approximately the same length as (*this) _SimpleList;
+        * DO NOT MANIPULATE this list outside NChooseKInit; it must persist between calls to NChooseK
+        * @param store the receptacle list that will store k-tuples
+        * @param stride how many elements to choose; must be <= lLength
+        * @param algorithm which algorithm to use for k-tuple generation; false - lexicographic (in the sense of the original list order)
+        * : true - 'revolving door' method - TBA
+        * @return true if successfully initialized
+        */
+        bool NChooseKInit(_SimpleList&, _SimpleList&, unsigned long, bool = false);
+
+        /**
+        * Select the next k-tuple
+        * Example: SimpleList(1,3,5,7).DeleteList([0,1,2]) = [7] 
+        * @param state the state-storing list previously populated by NChooseKInit
+        * @param store the receptacle that will store k-tuples 
+        * @return [bool] true is more k-tuples are available; [false] if the last one has just been stored
+        */
+        bool NChooseK(_SimpleList&, _SimpleList&);
+
+        /**
+        * SLKP: 20090316
+        * Given a range [from,to] and a given list,
+        * make the range conform to the list(e.g. resolve negative to and/or from coordinates)
+        * clip the range to fit the list etc
+        * Example: SimpleList sl.NormalizeCoordinates(4, 1, 2) = [1, 3, 5, 7]
+        * @param from The substring to find
+        * @param to The index to start searching from
+        * @param refLength The third argument is the length of the list to normalize with respect to.
+        * @return Nothing. Acts on the List object it was called from. 
+        */
+        static void NormalizeCoordinates(long&, long&, const unsigned long);
+
+
+        /**
+        * Add a number to each entry in the array
+        * Example: SimpleList(1,3,5,7).Offset(2) = [3, 5, 7, 9]
+        * @param shift Number to add 
+        * @return Nothing. Acts on the List object it was called from. 
+        */
+        void Offset(long);
+
+        /**
+        * TODO:Permute elements in blocks of given size
+        * Example: SimpleList(1,3,5,7).Offset(2) = [3, 5, 7, 9]
+        * @param shift Number to add 
+        * @return Nothing. Acts on the List object it was called from. 
+        */
+        void Permute(long);
+    
+
+        /**
+        * TODO:Permute elements in blocks of given size with possible replacement
+        * Example: SimpleList(1,3,5,7).Offset(2) = [3, 5, 7, 9]
+        * @param shift Number to add 
+        * @return Nothing. Acts on the List object it was called from. 
+        */
+        void PermuteWithReplacement(long);
+
+    
+        /**
+         * Select a number of list elements at random (either with or w/o replacement)
+         * Example: SimpleList(1,3,5,7).Subset(2) = (1,7)
+         * @param size How many elements to select (values >= lLength are rest to lLength)
+         * @param select Sample with our without replacement 
+         * @return Return the list of sampled elements
+         */
+        _SimpleList* Subset (unsigned long size, const bool replacement = false);
+    
+    
+        /**
+        * Retrive the last value and shorted the list by 1
+        * Example: SimpleList(1,3,5,7).Pop() = 7 
+        * @return Return last value from the list
+        */
+        long Pop();
+
+        /**
+        * Populate a Simple List with integers incrementally.
+        * Example: SimpleList sl.Populate(4, 1, 2) = [1, 3, 5, 7]
+        * @param s The substring to find
+        * @param startat The index to start searching from
+        * @param increment by Pass true for a case sensitive search 
+        * @return Nothing. Acts on the List object it was called from. 
+        */
+        void Populate(long, long, long); 
+
+        /**
+        * TODO
+        * Example: SimpleList sl(1,2,3).Flip() = [3,2,1]
+        * @return Nothing. Acts on the List object it was called from. 
+        */
+        void RecursiveIndexSort(long from, long to, _SimpleList* index);
+
+
+        /**
+        * Request space for a given # of elements 
+        * Example: _SimpleList([4, 1, 2]).Equal(_SimpleList([4, 1, 2]) = 4 
+        * @return true if equal. 
+        */
+        void RequestSpace(long);
+
+        void Subtract(_SimpleList&, _SimpleList&);
+
+        /**
+        * Swaps two positions  
+        * Example: SimpleList sl[1,3,5].Swap(0, 1) = [3,1]
+        * @param i First index to swap 
+        * @param j Second index to swap with
+        * @return Nothing. Acts on the List object it was called from. 
+        */
+        void Swap(long, long); //swap two elements
+
+        virtual BaseRef toStr(void);
+
+
+        /**
+        *
+        */
+        void TrimMemory(void);
+
+        /**
+        * Performs union of two SimpleLists
+        * Example: SimpleList(1,3,5,7).Offset(2) = [3, 5, 7, 9]
+        * @param shift Number to add 
+        * @return Nothing. Acts on the List object it was called from. 
+        */
+        void Union(_SimpleList&, _SimpleList&);
+
+        void XOR(_SimpleList&, _SimpleList&);
+
+
+        /**
+        * Sorts List 
+        * Example: SimpleList sl.Sort([5,4,3,2,1]) = [1, 2, 3, 4, 5]
+        * @param ascending true if ascending, false for descending sort 
+        * @return Nothing. Acts on the List object it was called from. 
+        */
+        void Sort(bool ascending=true);
+
+
+        /**
+        * SLKP: 20090508
+        * Implements a counting sort procedure, ASSUMING that all
+        * list values are in [0, upperBound-1]; if the 1st argument is <0, it is automatically
+        * determined
+        * @return a pointer to the sorted list
+        * if the second argument is not nil, then
+        * the new_order->old_order mapping is returned in the array pointed to
+        *
+        */
+        _SimpleList* CountingSort(long, _SimpleList* = nil);
+
+
+        void BubbleSort(void);
+        void QuickSort(long, long);
+
+        long* quickArrayAccess(void) {
+            return (long*)lData;
+        }
+};
+
+//TODO:Why is this a global function? If it needs to be, should be in helpers.cpp
+void SortLists(_SimpleList*, _SimpleList*);
+
+#endif
diff --git a/src/core/include/site.h b/src/core/include/site.h
new file mode 100644
index 0000000..984af3c
--- /dev/null
+++ b/src/core/include/site.h
@@ -0,0 +1,640 @@
+/*
+
+HyPhy - Hypothesis Testing Using Phylogenies.
+
+Copyright (C) 1997-now
+Core Developers:
+  Sergei L Kosakovsky Pond (spond at ucsd.edu)
+  Art FY Poon    (apoon at cfenet.ubc.ca)
+  Steven Weaver (sweaver at ucsd.edu)
+  
+Module Developers:
+	Lance Hepler (nlhepler at gmail.com)
+	Martin Smith (martin.audacis at gmail.com)
+
+Significant contributions from:
+  Spencer V Muse (muse at stat.ncsu.edu)
+  Simon DW Frost (sdf22 at cam.ac.uk)
+
+Permission is hereby granted, free of charge, to any person obtaining a
+copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be included
+in all copies or substantial portions of the Software.
+
+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.
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+*/
+
+#ifndef _GENSITE_
+#define _GENSITE_
+//#pragma once
+#include "sequence.h"
+#include "parser.h"
+#include "simplelist.h"
+#include "list.h"
+#include "avllist.h"
+#include "avllistx.h"
+#include "avllistxl.h"
+#include "stdlib.h"
+
+#define   NUCLEOTIDEDATA 0
+#define   CODONDATA      1
+
+
+
+
+
+//_________________________________________________________
+class _TranslationTable:public BaseObj
+{
+
+public:
+
+    _TranslationTable                       (void);
+    _TranslationTable                       (char);
+    _TranslationTable                       (_String&);
+    /* 20100618: SLKP
+
+            - new constructor (needed to handle ExecuteCase52 / Simulate properly)
+              which takes an alphabet string and checks to see if it's a standard one
+              DNA/RNA/Protein or Binary
+
+     */
+    _TranslationTable                       (_TranslationTable&);
+    virtual ~_TranslationTable              (void) {
+        if (checkTable) {
+            free (checkTable);
+        }
+    }
+    virtual BaseRef  makeDynamic            (void);
+
+    long    TokenCode                       (char);
+    char    CodeToLetter                    (long*);
+
+    void    AddBaseSet                      (_String&);
+    bool    TokenCode                       (char, long*, bool = true);
+    void    SplitTokenCode                  (long, long*);
+
+    void    AddTokenCode                    (char, _String&);
+    void    PrepareForChecks                (void);
+    bool    IsCharLegal                     (char);
+    char    GetSkipChar                     (void);
+    char    GetGapChar                      (void);
+    _String ConvertCodeToLetters            (long, char);
+    long    LengthOfAlphabet                (void);
+    bool    IsStandardBinary                (void) {
+        return baseLength==2 && baseSet.sLength==0;
+    }
+    bool    IsStandardNucleotide            (void) {
+        return baseLength==4 && baseSet.sLength==0;
+    }
+    bool    IsStandardAA                    (void) {
+        return baseLength==20&& baseSet.sLength==0;
+    }
+    _TranslationTable*
+    MergeTables                     (_TranslationTable*);
+
+    char                                    baseLength;
+    // number of "fundamental" tokens
+    //(4 for nucl, ACGT; 20 for amino acids)
+
+
+    _String                                 tokensAdded,
+                                            baseSet;
+
+    _SimpleList                             translationsAdded;
+    char*                                   checkTable;
+    // if null - then assume default translation table;
+};
+
+//_________________________________________________________
+
+// data set file state data struct
+struct FileState {
+
+    _TranslationTable* translationTable;
+    long
+    curSpecies,
+    totalSpeciesRead,
+    totalSitesRead,
+    totalSpeciesExpected,
+    totalSitesExpected,
+    curSite,
+    maxStringLength,
+    pInSrc;
+    bool
+    acceptingCommands,
+    allSpeciesDefined,
+    interleaved,
+    autoDetect,
+    isSkippingInNEXUS;
+    int
+    fileType,
+    baseLength;
+    char
+    repeat,
+    skip;
+
+    _String
+    *theSource,
+    *theNamespace;
+
+    _SimpleList
+    rawLinesFormat;
+};
+//_________________________________________________________
+
+class _Site:public _CString   // compressible string
+{
+
+public:
+    _Site (void);
+    //does nothing
+    _Site (_String&);
+    // data constructor
+    _Site (char);
+    // data constructor
+    _Site (long);
+    // reference constructor
+
+    virtual     ~_Site (void);
+    //destructor
+
+    void    Complete (void); // mark this site as complete and compress it
+
+    virtual     BaseRef makeDynamic(void);
+    virtual     void    Duplicate  (BaseRef);
+    virtual     void    Clear  (void);
+
+    void    PrepareToUse (void); // decompress the site preparing for intensive use
+    void    Archive      (void); // archive the site for later use
+
+    long    GetRefNo (void) {
+        return refNo<0?-refNo-2:refNo-2;
+    }
+
+    bool    IsComplete (void) {
+        return refNo<0;
+    }
+
+    void    SetRefNo (long r) {
+        refNo = -r-2;
+    }
+
+
+private:
+
+    long             refNo;      // if this site contains a reference to another one
+    // if refNo is negative, then shows whether the definition of this datatype has been completed
+};
+
+//_________________________________________________________
+
+// data set file state data struct
+struct _DSHelper {
+
+    _SimpleList characterPositions;
+    _List       incompletePatternStorage;
+    _AVLListX*  incompletePatterns;
+
+    _DSHelper(void) {
+        incompletePatterns = new _AVLListX (&incompletePatternStorage);
+        checkPointer (incompletePatterns);
+    }
+    ~_DSHelper(void) {
+        DeleteObject (incompletePatterns);
+    }
+};
+
+//_________________________________________________________
+
+class   _DataSet:public _List // a complete data set
+{
+public:
+
+    _DataSet                (void);
+    _DataSet                (long);
+    _DataSet                (FILE*);
+    // with estimated number of sites per file
+    virtual             ~_DataSet               (void);
+
+    virtual  BaseRef    makeDynamic             (void);
+
+    void        AddSite                 (char);
+
+    void        Write2Site              (long, char);
+    void        CheckMapping            (long);
+
+    void        Finalize                (void);
+    // remove duplicate data types and compress
+
+    long        GetNoTypes              (void);
+    // return the number of unique sites
+
+    long        GetCharDimension        (void);
+    // return the size of the alphabet space
+
+    long        GetFreqType             (long);
+    // return the frequency of a site
+
+    _Site*      GetSite                 (long index) {
+        return ((_Site**)lData)[theMap.lData[index]];
+    }
+
+    long        ComputeSize             (void);
+    // compute the size of this object in memory
+
+    void        Clear                   (void);
+
+    virtual  char       operator ()             (unsigned long, unsigned long, unsigned int);
+    // retrieve element pos of site-th site
+
+    virtual  BaseRef    toStr                   (void);
+    // convert to string
+
+    virtual  void       toFileStr               (FILE*dest);
+
+    void        Compact                 (long);
+    // release string overhead
+    void        ConvertRepresentations  (void);
+
+    _Matrix *           HarvestFrequencies      (char, char, bool, _SimpleList&, _SimpleList&, bool = true);
+    // this function counts observed frequencies of elements in a data set
+    // unit is the length of an info unit (nucl - 1, codons - 3)
+    // atom is the "minimal" countable element (nucl - 1, codons - 1)
+    // posSpec - if position of an atom within an item is to be accounted for
+    // segmentation - partition of the underlying DataSet to look at
+    // null for segmentation assumes the entire dataset
+
+    void        MatchIndices            (_Formula&, _SimpleList& , bool , long );
+    friend   void       printFileResults        (_DataSet* );
+    char        InternalStorageMode     (void) {
+        return useHorizontalRep;
+    }
+
+    long        NoOfSpecies             (void) {
+        return noOfSpecies;
+    }
+
+    long        NoOfColumns             (void) {
+        return theMap.lLength;
+    }
+    long        NoOfUniqueColumns       (void) {
+        return lLength;
+    }
+    void        AddName                 (_String&);
+    _List&     GetNames             (void) {
+        return theNames;
+    }
+    _SimpleList&
+    GetTheMap               (void) {
+        return theMap;
+    }
+    void        FindAllSitesLikeThisOne (long, _SimpleList&);
+
+    friend      class       _DataSetFilter;
+    friend      _DataSet*    ReadDataSetFile        (FILE*,char,_String*,_String*, _String*,_TranslationTable*);
+    friend      long         ProcessLine            (_String&s , FileState *fs, _DataSet& ds);
+
+    static      _DataSet*    Concatenate            (_SimpleList);
+    static      _DataSet*    Combine                (_SimpleList);
+
+    static      _TranslationTable*
+    CheckCompatibility(_SimpleList& ref, char concatOrCombine);
+
+
+    void         ProcessPartition       (_String&, _SimpleList&,  bool, _SimpleList* = nil, _SimpleList* = nil);
+    void         SetTranslationTable    (_DataSet *  newTT );
+    void         SetTranslationTable    (_TranslationTable *  newTT );
+    _TranslationTable*
+    GetTT                   (void) {
+        return theTT;
+    }
+    _Parameter   CheckAlphabetConsistency
+    (void);
+
+    void         SetNoSpecies           (long n) {
+        noOfSpecies = n;
+    }
+    void         ResetIHelper           (void);
+private:
+
+     void        constructFreq           (long*, _Parameter *, char, long, long, int, int, int);
+
+    _SimpleList theMap,
+                theFrequencies;         // remapping vector, and the counter of frequencies
+
+    unsigned int
+    noOfSpecies;
+
+    _TranslationTable*
+    theTT;                  // translation Table, if any
+
+    _List       theNames;               // Names of species
+    FILE*       streamThrough;
+
+    _DSHelper*  dsh;
+    bool        useHorizontalRep;
+
+};
+
+//_________________________________________________________
+
+class _DataSetFilter:public BaseObj
+{
+
+public:
+
+    _DataSetFilter               (void);
+    _DataSetFilter              (_DataSet*, char, _String&);
+
+    virtual                     ~_DataSetFilter (void);
+
+    virtual  BaseRef            toStr           (void);  // convert to string
+    virtual  void               toFileStr       (FILE*); // convert to string
+
+    virtual  BaseRef            makeDynamic     (void);
+    virtual  long               FreeUpMemory    (long);
+    virtual  bool               IsNormalFilter  (void) {
+        return true;
+    }
+
+    void                CopyFilter      (_DataSetFilter*);
+
+
+//  void     SetFilter  (_DataSet*, char, _String&);
+
+    void     SetFilter (_DataSet*, char, _SimpleList&, _SimpleList&, bool isFilteredAlready = false);
+
+    void     SetExclusions (_String*, bool = true);
+
+    _String* GetExclusions (void);
+
+    void     SetMap  (_String&); // used to allow nonsequential maps to tree leaves
+
+    void     SetMap  (_SimpleList& newMap) {
+        theNodeMap.Clear();    // used to allow nonsequential maps to tree leaves
+        theNodeMap.Duplicate(&newMap);
+    }
+
+    long     NumberDistinctSites (void) {
+        return theFrequencies.lLength;
+    }
+
+    long     NumberSpecies (void) {
+        return theNodeMap.lLength;
+    }
+
+    virtual  long
+    GetFullLengthSpecies (void) {
+        return theOriginalOrder.lLength;
+    }
+
+    virtual  long
+    GetSiteCount        (void) {
+        return duplicateMap.lLength;
+    }
+
+    long     GetFrequency  (long i) {
+        return theFrequencies(i);
+    }
+
+    long     GetUnitLength  (void) {
+        return unitLength;
+    }
+
+    virtual  long    GetDimension (bool correct = true);
+
+    long     GetOriginalToShortMap (long i);
+
+    void     ComputePairwiseDifferences (_Matrix&, long, long);
+    _Matrix* ComputePairwiseDifferences (long, long, char = 0);
+
+    BaseRef  GetMap (void) {
+        return theNodeMap.lLength?&theNodeMap:NULL;
+    }
+
+    virtual  _String&   operator () (unsigned long site, unsigned long pos);
+    // site indexes unique sites
+
+    virtual  void   RetrieveState (unsigned long site, unsigned long pos, _String&, bool = true);
+    // site indexes all sites, including duplicates
+
+    void     FindAllSitesLikeThisOne (long, _SimpleList&);
+
+    _String  GenerateConsensusString (_SimpleList* =nil);
+
+    void     GrabSite (unsigned long,unsigned long,_String&);
+    void     GrabSite (unsigned long,unsigned long,char*);
+
+    virtual  char      GetChar(unsigned long site, unsigned long pos);
+    long       SiteFrequency  (unsigned long site);
+    bool       HasDeletions   (unsigned long site, _AVLList* = nil);
+    long       HasExclusions  (unsigned long site, _SimpleList* theExc, _Parameter *buffer);
+    bool       IsConstant     (unsigned long site,  bool relaxedDeletions = true);
+
+    long     Translate2Frequencies (_String&, _Parameter*, bool);
+    long     MapStringToCharIndex  (_String&);
+    //long   Translate2Frequencies (char*,    _Parameter*, bool = true);
+    long     Translate2Frequencies (char,     _Parameter*, bool);
+
+    _Matrix* HarvestFrequencies (char unit, char atom, bool posSpec, bool = true);
+
+    void     Freeze (long);
+
+    void     UnFreeze (long);
+
+    void     MatchStartNEnd (_SimpleList&, _SimpleList&, _SimpleList* = nil);
+
+    _String* GetSequenceName(long idx) {
+        return (_String*)(theData->GetNames ()(theNodeMap.lData[idx]));
+    }
+
+    _String* GetSequenceCharacters
+    (long);
+
+    _DataSet*                       GetData                     (void) {
+        return theData;
+    }
+    void                            SetData                     (_DataSet* ds) {
+        theData = ds;
+    }
+    _String                         ConvertCodeToLetters        (long code, char base) {
+        return theData->theTT->ConvertCodeToLetters(code,base);
+    }
+
+    void                            ConvertCodeToLettersBuffered(long code, char base, char *, _AVLListXL* );
+    // 20090212: SLKP
+    // added this function to cache repeated character code -> string conversions
+    // and to skip returning temp objects but simply writing to buffer
+
+    /**
+    * Find all unique sequences in the data filter. 
+    *
+    * \n Usage: FindDuplicateSequences(uniqueIndex, instanceCount, true);
+    * @author SLKP
+    * @param indices For each sequence - the list of indices corresponding to the unique strings
+                     For example, if sequence 1 == sequence 3 and sequence 4 == sequence 5 this list 
+                     will contain 0,1,3 
+    * @param map The index of the unique string to which the current string is mapped
+                     For example, if sequence 1 == sequence 3 and sequence 4 == sequence 5 this list 
+                     will contain 0,1,0,2,2 
+    * @param counts  The number of copies for each unique string found
+                     For example, if sequence 1 == sequence 3 and sequence 4 == sequence 5 this list 
+                     will contain 2,1,2
+    * @param strict  Controls is the strings must match exactly (0), exactly + gap (1), via the superset rule (2) or via the partial match rule (3).
+                     Nucleotide letters A and - (or ?) (IUPAC code for A or G) will count as mismatched for mode 0 and matched for mode 1.
+                     Nucleotide letters A and R (IUPAC code for A or G) will count as mismatched for mode 0 and matched for
+                     modes 2 and 3 because R is a superset of A. (note that R matches R in all modes, even though the letter is
+                     an ambiguous nucleotide).
+                     Nucleotide letters R (A or G) and M (A or C) will match under mode 3 (because they both encode A as an option), 
+                     but not under modes 0-2. 
+                     Match in mode (0) => match in mode (1) => match in mode (2) => match in mode (3).
+                    
+    * @return The number of unique sequences. 
+    */
+    unsigned long                   FindUniqueSequences      (_SimpleList&, _SimpleList&, _SimpleList&, short = 0);
+
+
+    long                            CorrectCode                 (long code);
+    virtual  bool                   CompareTwoSites             (unsigned long, unsigned long,unsigned long);
+    bool                            CompareTwoSitesChar         (unsigned long, unsigned long,unsigned long);
+    long                            FindSpeciesName             (_List&, _SimpleList&);
+    _DataSetFilter*                 PairFilter                  (long, long, _DataSetFilter*);
+    void                            SetDimensions               ();
+    long                            LookupConversion            (char c, _Parameter* receptacle);
+    void                            SetupConversion             (void);
+    void                            FilterDeletions             (_SimpleList* theExc = nil);
+    _Matrix*                        GetFilterCharacters         (bool = false);
+    _SimpleList*                    CountAndResolve             (long, _Parameter* = nil, bool = false);
+    _Matrix*                        PairwiseCompare             (_SimpleList*, _SimpleList*, _List* = nil);
+
+    _List*                          ComputePatternToSiteMap     (void);
+    // 20090206: SLKP
+    // a utility function to return a _List of simplelists (one per unique site pattern) that provides an ordered list of
+    //           the indices of all sites that have the same pattern in the original alignment
+
+    void                            PatternToSiteMapper         (void*, void*, char, long);
+    /*
+        20090325: SLKP
+        a function that takes per pattern values (source, argument 1)
+        and maps them onto sites into target (argument 2)
+        the third argument is 0 to treat the pointers as _Parameter*
+        1 to treat them as long*
+        2 and to treat them as _Parameter* and long*, respetively
+        20090929: SLKP
+        the fourth argument is used to speficy a padding-size,
+            all values from the filter size up to that value are set to 1 (for mode 0) and 0 (for mode 1)
+            this is needed to handle uneven data filters in SITE_LIKELIHOOD constructs
+     */
+
+    _SimpleList
+    theFrequencies,
+    theNodeMap,
+    theMap,
+    theOriginalOrder,
+    theExclusions,
+    duplicateMap;
+
+    char*    GetColumn (long index) {
+        return ((_Site*)(((BaseRef*)theData->lData)[theData->theMap.lData[theMap.lData[index]]]))->sData;
+    }
+
+    _SimpleList     conversionCache;
+
+protected:
+
+    char            unitLength;
+    long            dimension;
+
+private:
+
+    void            internalToStr (FILE*,_String&);
+    _String*        accessCache;
+
+    long            undimension;
+
+    _DataSet*       theData;
+//      _SimpleList     conversionCache;
+
+    void            XferwCorrection (_Matrix& , _Parameter*, long);
+    void            XferwCorrection (_Parameter* , _Parameter*, long);
+    void            XferwCorrection (long* , _Parameter*, long);
+};
+
+
+
+//_________________________________________________________
+
+class _DataSetFilterNumeric:public _DataSetFilter
+{
+
+public:
+
+    _DataSetFilterNumeric                       (void) {
+    }
+    _DataSetFilterNumeric                       (_Matrix*, _List&,_DataSet*,long);
+
+    virtual  bool                                       IsNormalFilter          (void) {
+        return false;
+    }
+
+
+    virtual  BaseRef                                    makeDynamic             (void);
+    virtual  long                                       GetDimension            (bool) {
+        return dimension;
+    }
+
+    _Parameter*                 getProbabilityVector    (long,long,long = 0);
+    virtual  bool               CompareTwoSites         (unsigned long, unsigned long,unsigned long);
+
+    long                    shifter,
+                            categoryShifter,
+                            categoryCount;
+    _Matrix                 probabilityVectors;
+    // N x M dense matrix
+    // N = spec count
+    // M = unique sites * dimension
+
+};
+
+
+//_________________________________________________________
+
+extern          _TranslationTable       defaultTranslationTable;
+
+void            ReadNextLine            (FILE* fp, _String *s, FileState* fs, bool append = false, bool upCase = true);
+_DataSet*       ReadDataSetFile         (FILE*, char = 0, _String* = nil, _String* = nil, _String* = nil,_TranslationTable* = &defaultTranslationTable);
+void            fillDefaultCharTable    (void);
+void            printFileResults        (_DataSet*);
+void            printDSFilter           (_DataSetFilter* d);
+
+bool            StoreADataSet           (_DataSet*, _String*);
+
+
+extern _String  dataFileTree,
+       dataFileTreeString,
+       aminoAcidOneCharCodes,
+       dnaOneCharCodes,
+       rnaOneCharCodes,
+       binaryOneCharCodes,
+       nexusFileTreeMatrix,
+       dataFilePartitionMatrix,
+       defaultLargeFileCutoff,
+       nexusBFBody;
+
+extern _DataSet*lastNexusDataMatrix;
+
+#endif
diff --git a/src/core/include/stack.h b/src/core/include/stack.h
new file mode 100644
index 0000000..b076bbb
--- /dev/null
+++ b/src/core/include/stack.h
@@ -0,0 +1,71 @@
+/*
+ 
+ HyPhy - Hypothesis Testing Using Phylogenies.
+ 
+ Copyright (C) 1997-now
+ Core Developers:
+ Sergei L Kosakovsky Pond (spond at ucsd.edu)
+ Art FY Poon    (apoon at cfenet.ubc.ca)
+ Steven Weaver (sweaver at ucsd.edu)
+ 
+ Module Developers:
+ Lance Hepler (nlhepler at gmail.com)
+ Martin Smith (martin.audacis at gmail.com)
+ 
+ Significant contributions from:
+ Spencer V Muse (muse at stat.ncsu.edu)
+ Simon DW Frost (sdf22 at cam.ac.uk)
+ 
+ Permission is hereby granted, free of charge, to any person obtaining a
+ copy of this software and associated documentation files (the
+ "Software"), to deal in the Software without restriction, including
+ without limitation the rights to use, copy, modify, merge, publish,
+ distribute, sublicense, and/or sell copies of the Software, and to
+ permit persons to whom the Software is furnished to do so, subject to
+ the following conditions:
+ 
+ The above copyright notice and this permission notice shall be included
+ in all copies or substantial portions of the Software.
+ 
+ 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.
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ 
+ */
+
+#ifndef     __STACK__
+#define     __STACK__
+
+#include "mathobj.h"
+
+//__________________________________________________________________________________
+class   _Stack   //computational stack
+{
+
+    friend class _Formula;
+    friend class _Operation;
+    friend class _Variable;
+
+public:
+
+    _Stack (void);
+    ~_Stack (void);
+
+    bool      Push (_PMathObj, bool = true);     // push object onto the stack
+    _PMathObj Pop (bool del = true);            // pop object from the top of the stack
+    long      StackDepth (void);    // returns the depth of the stack
+    void      Reset (void);         // clear the stack
+
+    virtual   void    Initialize (void);
+    virtual   void    Duplicate (BaseRef);
+
+protected:
+
+    _List  theStack;
+};
+
+#endif
diff --git a/src/core/include/trie.h b/src/core/include/trie.h
new file mode 100644
index 0000000..b139921
--- /dev/null
+++ b/src/core/include/trie.h
@@ -0,0 +1,265 @@
+/*
+
+HyPhy - Hypothesis Testing Using Phylogenies.
+
+Copyright (C) 1997-now
+Core Developers:
+  Sergei L Kosakovsky Pond (spond at ucsd.edu)
+  Art FY Poon    (apoon at cfenet.ubc.ca)
+  Steven Weaver (sweaver at ucsd.edu)
+  
+Module Developers:
+	Lance Hepler (nlhepler at gmail.com)
+	Martin Smith (martin.audacis at gmail.com)
+
+Significant contributions from:
+  Spencer V Muse (muse at stat.ncsu.edu)
+  Simon DW Frost (sdf22 at cam.ac.uk)
+
+Permission is hereby granted, free of charge, to any person obtaining a
+copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be included
+in all copies or substantial portions of the Software.
+
+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.
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+*/
+
+#ifndef _HY_TRIE_
+#define _HY_TRIE_
+
+#include "simplelist.h"
+#include "hy_strings.h"
+#include "list.h"
+
+#define  HY_TRIE_NOTFOUND       -1L 
+#define  HY_TRIE_INVALID_LETTER -2L
+
+/*_____________________________________________________________________________
+    This is a simple class for representing prefix tries with integer values 
+    attached to each string key.
+*/
+
+//_____________________________________________________________________________
+class _Trie: public _List
+{
+    protected:
+        // data members
+        _SimpleList charMap,
+            /** charMap[c] maps a valid character to the internal index (0..validChars.sLength)
+             invalid characters are mapped to -1
+             e.g. if the alphabet is "CGTA", then charMap ['A']  = 3, and charMap['z'] = -1 
+             */
+            emptySlots,
+            /** allocated entries in the 'this' list that can be reused (e.g. those created by delete operations)
+             */
+            payload,
+            /** the values associated with each key in 'nodes' 
+             */
+            parents;
+            /** the index of the parent nodes (in 'nodes') for each node
+             */
+            
+    
+        /* base class will store the lunear representation of this trie */
+        
+            /** a linear representation of this trie    
+             each node is a _SimpleList that contains N pairs of entries 
+                (character index, integer index of the child node in 'nodes')
+                for each extension of the prefix encoded by the node
+             
+             for example, if the alphabet is "ABC" and if nodes[1] has children nodes[5] for "B" and nodes[7] for "A", then the _SimpleList for nodes[1] will be 1 (index of B),5 ('B' child index),0 (index of A),7 ('A' child index).
+             
+             */
+        
+
+    public:
+        _Trie (const _String* alphabet = nil);
+        /**
+         * Construct an empty trie over a given alphabet
+         * @param alphabet -- a string listing all valid characters (e.g. "ACGT"). By default (or if an empty string is passed), all ASCII characters are allowed
+         * @return Nothing. 
+         */
+       
+        virtual BaseRef toStr(void);
+        /**
+         * Return a string representation of this object
+         * @return An dictionary representation of the trie, i.e. {"key1":"value1", "key2":"value2", ...} pairs
+         */
+        
+        virtual BaseRef makeDynamic(void);
+        /**
+         * Return a dynamic representation of this object
+         * @return A _Trie reference created on the heap which is 'deep-copied' (i.e. all dynamic objects have a reference count of 1)
+         */
+       
+        virtual void    Duplicate(BaseRef storage);
+        /**
+         * Perform a deep copy of this object into storage (an allocated empty trie)
+         * @param storage -- the _Trie object to copy this one into
+         * @return Nothing. 
+         */
+       
+    
+        virtual void    Clear(bool all = TRUE);
+        /**
+         * Clear this trie; everything except the alphabet will be deleted
+         * @param all -- whether or not to clear out the lists completely
+         * @return Nothing
+         */
+   
+        virtual ~_Trie (void);
+        /**
+         * The destructor 
+         * @return Nothing. 
+         */
+        
+        long     Find (const _String& key, _SimpleList* path = nil, bool prefixOK = false);
+        /**
+         * Determine if 'key' is in the trie
+         * @param  key      -- the string to search for
+         * @param  path     -- store the indices for the trie traversal history (if supplied)
+         * @param  prefixOK -- returns a match if a prefix of 'key' in the trie
+         * @return the index of the key in 'nodes' if found, HY_TRIE_NOTFOUND/HY_TRIE_INVALID_LETTER otherwise  
+         */
+
+        long     Find (const char key, bool prefixOK = false);
+        /**
+         * Determine if 'key' is in the trie
+         * @param  key      -- the character to search for
+         * @param  prefixOK -- returns a match if a prefix of 'key' in the trie
+         * @return the index of the key in 'nodes' if found, HY_TRIE_NOTFOUND/HY_TRIE_INVALID_LETTER otherwise
+         */
+
+        long     GetValueFromString (const _String& key);
+        /**
+         * A convenience function which calls Find and then GetValue if teh key is found
+         * @param  key      -- the string to search for
+         * @return the value associated with the key if found, HY_TRIE_NOTFOUND otherwise  
+         */
+
+       long    Insert (const _String& key, const long value);
+        /**
+         * Insert the key into the trie
+         * @param key -- the string to insert
+         * @param value -- the value to associate with the key
+         * @return non-negative index if the insert was successful (also returned if key is already in this trie), otherwise HY_TRIE_NOTFOUND/HY_TRIE_INVALID_LETTER 
+         */
+    
+        long    Insert (const char *key, const long value, bool return_index = true);
+        /**
+         * Insert the key into the trie
+         * @param key -- the string to insert
+         * @param value -- the value to associate with the key
+         * @param return_index - whether or not to return the index of the string in the trie (if true) or the length of the key (if false)
+         * @return non-negative index if the insert was successful (also returned if key is already in this trie), otherwise HY_TRIE_NOTFOUND/HY_TRIE_INVALID_LETTER; if return_index == false, return strlen (key) if insert was successful
+         */
+
+        void     UpdateValue (const long key, const long value);
+        /**
+         * Update the value associated with the key _index_
+         * @param  key -- the index of the key (returned by Find for example); if key < 0 or key >= nodes.lLength, nothing is done
+         * @param  value -- new value to associate with the key
+         * @return None
+         */
+        
+        long     GetValue (const long key);
+        /**
+         * Retrieve the value associated with the key _index_
+         * @param  key -- the index of the key (returned by Find for example); if key < 0 or key >= nodes.lLength, nothing is done
+         * @return the value associated with the key
+
+         */
+         
+        unsigned long    Insert (const _List& key, const _SimpleList* values = nil);
+        /**
+         * Insert all keys in the list into the trie
+         * @param key -- the list of strings (non string objects will be cast to strings) to insert
+         * @param values -- the list of values to associate with the keys (the index of the key in the list by default)
+         * @return the number of elements successfully inserted (including those already present)
+         */
+
+        bool    Delete (const _String& key);
+        /**
+         * Delete the key from the trie
+         * @param key -- the string to delete
+         * @return True if the delete was successful (also returned if key is not in this trie), otherwise False 
+         */
+    
+        bool    Delete (const char* key);
+        /**
+         * Delete the key from the trie
+         * @param key -- the string to delete
+         * @return True if the delete was successful (also returned if key is not in this trie), otherwise False 
+         */
+                 unsigned long    Delete (const _List& key);
+        /**
+         * Delete all keys in the list from the trie
+         * @param key -- the list of strings (non string objects will be cast to strings) to delete
+         * @return the number of elements successfully deleted (including those not present)
+         */
+
+        _String*          RetrieveStringFromPath (const _SimpleList& path, _String* alphabet);
+         /**
+         * Given a traversal path of the trie (and an optional cached alphabet), retrive the _String object spelling the path
+         * @param path -- the traversal path (pairs of node index, character index)
+         * @param 
+         * @return the number of elements successfully deleted (including those not present)
+         */
+       
+        _String  Alphabet (void);
+        /**
+         * Return the valid alphabet for this Trie
+         * @return The string containing all the letters allowed for strings in this trie. The ordering of the letters is ASCII-alphabetical. 
+         */
+
+        _String  RetrieveKeyByPayload (const long key);
+        /**
+         * Return the string spelling the pay to the 'key'
+         * @param key -- the key for which we fish to retrieve the path
+         * @return The string spelling the path from the root to the node tagged with value 'key'. Empty string is returned if 'key' is not in this trie
+         */
+
+ private:
+        
+        void SetAlphabet        (const _String*, bool);
+        long FindNextLetter     (const char letter, const unsigned long currentIndex);
+        /**
+         * Given a current position in the trie (current_index), try to walk down the next character
+         * @param  letter -- the next letter
+         * @param  current_index -- where in the trie are we currently located 
+         * @return A non-negative index (next position) in the trie; HY_TRIE_NOTFOUND/ if the letter were valid but no extension could be found, and HY_TRIE_INVALID_LETTER if the letter were invalid
+         */
+        long InsertNextLetter     (const char letter, const unsigned long currentIndex);
+        /**
+         * Given a current position in the trie (current_index), insert the character (this assumes that the character is NOT present)
+         * @param  letter -- the next letter
+         * @param  current_index -- where in the trie are we currently located 
+         * @return A non-negative index (next position) in the trie; HY_TRIE_NOTFOUND/ if the letter were valid but no extension could be found, and HY_TRIE_INVALID_LETTER if the letter were invalid
+         */
+         long FindNextUnusedIndex (bool alloc = TRUE);
+         /**
+             Find the next index to store something to: place an empty _SimpleList there
+             This will either go to the end the list or to the last freed block (in emptySlots)
+             @param alloc -- allocate a new _SimpleList storage object
+             @return the index of the new empty _SimpleList in (this) List
+           */
+           
+        void    DumpRaw           (void);
+         
+     
+};
+
+#endif
diff --git a/src/core/include/variable.h b/src/core/include/variable.h
new file mode 100644
index 0000000..d2f0fbb
--- /dev/null
+++ b/src/core/include/variable.h
@@ -0,0 +1,173 @@
+/*
+ 
+ HyPhy - Hypothesis Testing Using Phylogenies.
+ 
+ Copyright (C) 1997-now
+ Core Developers:
+ Sergei L Kosakovsky Pond (spond at ucsd.edu)
+ Art FY Poon    (apoon at cfenet.ubc.ca)
+ Steven Weaver (sweaver at ucsd.edu)
+ 
+ Module Developers:
+ Lance Hepler (nlhepler at gmail.com)
+ Martin Smith (martin.audacis at gmail.com)
+ 
+ Significant contributions from:
+ Spencer V Muse (muse at stat.ncsu.edu)
+ Simon DW Frost (sdf22 at cam.ac.uk)
+ 
+ Permission is hereby granted, free of charge, to any person obtaining a
+ copy of this software and associated documentation files (the
+ "Software"), to deal in the Software without restriction, including
+ without limitation the rights to use, copy, modify, merge, publish,
+ distribute, sublicense, and/or sell copies of the Software, and to
+ permit persons to whom the Software is furnished to do so, subject to
+ the following conditions:
+ 
+ The above copyright notice and this permission notice shall be included
+ in all copies or substantial portions of the Software.
+ 
+ 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.
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ 
+ */
+
+#ifndef     __VARIABLE__
+#define     __VARIABLE__
+
+#include "constant.h"
+#include "hy_strings.h"
+#include "list.h"
+#include "avllist.h"
+#include "operation.h"
+#include "formula.h"
+
+
+class _Variable : public _Constant
+{
+
+    friend class _Operation;
+
+public:
+
+    _Variable (void);
+    _Variable (_String&, bool isG = false); // name
+    _Variable (_String&, _String&, bool isG = false); // name and formula
+
+    virtual ~_Variable (void);
+
+    virtual   void          Initialize (void);
+    virtual   void          Duplicate (BaseRef);
+    virtual   BaseRef       makeDynamic(void);
+    virtual   BaseRef       toStr (void);
+    virtual    void         toFileStr (FILE*);
+
+    virtual   void          MarkDone (void);
+
+    virtual     _PMathObj   Compute (void);       // compute or return the value
+    virtual     bool        IsVariable (void); //
+    virtual     bool        IsIndependent (void) {
+        return (varFormula&&varFormula->theFormula.lLength)?
+               false:
+               (varValue?varValue->IsIndependent():true);
+    }
+    virtual     bool        IsConstant (void);
+    void        SetValue (_PMathObj, bool = true); // set the value of the variable
+    void        SetNumericValue (_Parameter);
+    void        CheckAndSet (_Parameter, bool = false);
+    // set the value of the variable
+    // bool flag is used to indicate that out of bounds values should be rejected
+
+    _PMathObj   GetValue (void) {
+        return varValue;   // get the value of the variable
+    }
+    void        SetFormula (_Formula&); // set the variable to a new formula
+
+    virtual     bool        HasChanged      (bool = false);
+    virtual     void        PreMarkChanged  ();
+    virtual     void        PostMarkChanged ();
+    virtual     bool        IsGlobal (void) {
+        return varFlags & HY_VARIABLE_GLOBAL;
+    }
+    virtual     bool        IsCategory (void) {
+        return false;
+    }
+    virtual     long        GetAVariable (void) {
+        return theIndex;
+    }
+    virtual unsigned long        ObjectClass (void) {
+        return varValue?varValue->ObjectClass():((varFormula&&varFormula->theFormula.lLength)?varFormula->ObjectClass():1);
+    }
+    void        SetIndex (long i) {
+        theIndex = i;
+    }
+    long        GetIndex (void) {
+        return theIndex;
+    }
+    virtual     void        ScanForVariables (_AVLList& l, bool globals = false, _AVLListX* tagger = nil, long weight = 0);
+    virtual     bool        IsContainer (void) {
+        return false;
+    }
+
+    void        SetBounds (_Parameter lb, _Parameter ub);
+    void        EnsureTheValueIsInBounds (void);
+    bool        IsValueInBounds (_Parameter v)
+                           { return v >= lowerBound && v <= upperBound; }
+
+    _Parameter  GetLowerBound (void) {
+        return lowerBound;
+    }
+    _Parameter  GetUpperBound (void) {
+        return upperBound;
+    }
+
+    virtual     void        ClearConstraints    (void);
+    virtual     bool        CheckFForDependence (long, bool = false);
+
+    _String     ContextFreeName                 (void);
+    _String     ParentObjectName                 (void);
+ 
+    _String*    GetName                         (void) {
+        return theName;
+    }
+    _String*    GetFormulaString        (void) {
+        return varFormula?(_String*)varFormula->toStr():(_String*)empty.makeDynamic();
+    }
+
+    virtual     void        CompileListOfDependents (_SimpleList&);
+    virtual     _PMathObj   ComputeReference        (_PMathObj);
+
+
+    friend      void        ResetVariables          (void);
+    friend      _Variable*  LocateVar               (long);
+    friend      void        InsertVar               (_Variable*);
+
+public:
+
+    _String*   theName;
+
+    _PMathObj  varValue;
+
+    long       theIndex; // index of this variable in the global variable pool
+
+    // the class of this variable - i.e global, local, category or random
+    char       varFlags;
+
+    _Parameter lowerBound,
+               upperBound;
+    // dynamic lower and upper bounds here
+
+    _Formula*  varFormula;
+
+};
+
+long    DereferenceVariable (long index, _PMathObj context, char reference_type);
+long    DereferenceString   (_PMathObj, _PMathObj context, char reference_type);
+
+
+#endif
diff --git a/src/core/include/variablecontainer.h b/src/core/include/variablecontainer.h
new file mode 100644
index 0000000..81fe7f2
--- /dev/null
+++ b/src/core/include/variablecontainer.h
@@ -0,0 +1,156 @@
+/*
+ 
+ HyPhy - Hypothesis Testing Using Phylogenies.
+ 
+ Copyright (C) 1997-now
+ Core Developers:
+ Sergei L Kosakovsky Pond (spond at ucsd.edu)
+ Art FY Poon    (apoon at cfenet.ubc.ca)
+ Steven Weaver (sweaver at ucsd.edu)
+ 
+ Module Developers:
+ Lance Hepler (nlhepler at gmail.com)
+ Martin Smith (martin.audacis at gmail.com)
+ 
+ Significant contributions from:
+ Spencer V Muse (muse at stat.ncsu.edu)
+ Simon DW Frost (sdf22 at cam.ac.uk)
+ 
+ Permission is hereby granted, free of charge, to any person obtaining a
+ copy of this software and associated documentation files (the
+ "Software"), to deal in the Software without restriction, including
+ without limitation the rights to use, copy, modify, merge, publish,
+ distribute, sublicense, and/or sell copies of the Software, and to
+ permit persons to whom the Software is furnished to do so, subject to
+ the following conditions:
+ 
+ The above copyright notice and this permission notice shall be included
+ in all copies or substantial portions of the Software.
+ 
+ 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.
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ 
+ */
+
+#ifndef     __VARIABLECONTAINER__
+#define     __VARIABLECONTAINER__
+
+#include "variable.h"
+#include "baseobj.h"
+#include "list.h"
+#include "avllistx.h"
+#include "avllistxl.h"
+#include "operation.h"
+
+//__________________________________________________________________________________
+
+// this class defines a computational (or storage) class which, as a variable, may contain
+// other variables locally.
+
+class _Matrix;
+class   _VariableContainer: public _Variable
+{
+
+    friend class _Operation;
+    friend class _Variable;
+
+public:
+
+    _VariableContainer (void);
+    _VariableContainer (_String theName, _String theTmplt = "", _VariableContainer* theP = nil);
+    // name, matrix constructor, the parent (if there is one)
+    virtual ~_VariableContainer(void);
+
+    void                    InitializeVarCont       (_String&, _String&, _VariableContainer*, _AVLListXL* = nil);
+    void                    ScanModelBasedVariables (_String&, _AVLListXL*);
+    virtual     void        SetModel                (long,_AVLListXL*);
+
+    virtual     void        MarkDone (void);
+
+    // variable access/operation functions
+
+    virtual     bool        IsContainer                 (void) {
+        return true;
+    }
+
+    virtual     bool        HasChanged                  (void);
+    virtual     bool        NeedToExponentiate          (bool = false);
+
+    void        ScanAndAttachVariables      (void);
+
+    virtual     void        ScanForVariables            (_AVLList&,_AVLList&, _AVLListX* tagger = nil, long weight = 0);
+    virtual     void        ScanForDVariables           (_AVLList&,_AVLList&);
+    virtual     void        ScanForGVariables           (_AVLList&,_AVLList&, _AVLListX* tagger = nil, long weight = 0);
+
+    virtual     bool        IsModelVar                  (long);
+    virtual     bool        IsConstant                  (void);
+    virtual     BaseRef     makeDynamic                 (void);
+    virtual     void        Duplicate                   (BaseRef);
+
+    virtual     BaseRef     toStr                       (void);
+
+    bool        HasLocals                   (void);
+
+    virtual     bool        RemoveDependance            (long);
+    virtual     long        SetDependance               (long);
+    bool        SetMDependance              (_SimpleList&);
+
+    void        Clear                       (void);
+    virtual     void        ClearConstraints            (void);
+
+    long        CountIndependents           (void);
+    long        CountAll                    (void);
+
+    virtual     _Variable*  GetIthIndependent           (long);
+    virtual     _Variable*  GetIthDependent             (long);
+    virtual     _Variable*  GetIthParameter             (long);
+
+    long        CheckAndAddUserExpression   (_String&, long startWith = 0);
+    void        KillUserExpression          (long);
+    virtual     void        CompileListOfDependents     (_SimpleList&);
+
+    void        MatchParametersToList       (_List&, bool doAll = false, bool indOnly = false);
+    _Matrix*    GetModelMatrix              (_List* = nil, _SimpleList* = nil);
+    _Matrix*    GetFreqMatrix               (void);
+    bool        HasExplicitFormModel        (void);
+    _Formula*   GetExplicitFormModel        (void);
+
+    long        GetModelIndex               (void) {
+        return theModel;
+    }
+    
+    _String*    GetModelName                (void);
+    
+    long        GetModelDimension           (void);
+    /* 20100316 SLKP
+        return the dimension of the model; needed to handle the case
+        of explicit model exponentials
+     */
+
+    void        CopyMatrixParameters                (_VariableContainer*, bool match_by_name = false);
+    void        GetListOfModelParameters            (_List&);
+    _String*    GetSaveableListOfUserParameters     (void);
+    void        TrimMemory                          (void);
+    _VariableContainer* GetTheParent                (void) {
+        return theParent;
+    }
+
+protected: // data members
+
+    _SimpleList         *iVariables,
+                        *dVariables,
+                        *gVariables;
+
+    void               SortVars (void);
+
+    long                theModel;   // model template for the container
+    _VariableContainer  *theParent; // a higher level container, if there is one.
+
+};
+
+#endif
diff --git a/src/core/likefunc.cpp b/src/core/likefunc.cpp
new file mode 100644
index 0000000..0f1389c
--- /dev/null
+++ b/src/core/likefunc.cpp
@@ -0,0 +1,10815 @@
+/*
+
+HyPhy - Hypothesis Testing Using Phylogenies.
+
+Copyright (C) 1997-2009
+  Sergei L Kosakovsky Pond (spond at ucsd.edu)
+  Art FY Poon              (apoon at cfenet.ubc.ca)
+
+Permission is hereby granted, free of charge, to any person obtaining a
+copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be included
+in all copies or substantial portions of the Software.
+
+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.
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+*/
+
+//#define _UBER_VERBOSE_LF_DEBUG
+
+#include <string.h>
+#include <stdlib.h>
+#include <math.h>
+#include <time.h>
+#include <math.h>
+
+#include "likefunc.h"
+#include "calcnode.h"
+#include "site.h"
+#include "batchlan.h"
+#include "category.h"
+
+
+#ifdef __WINDOZE__
+#include     "windows.h"
+#endif
+
+#ifdef __MAC__
+#include     "timer.h"
+extern bool handleGUI(bool);
+#endif
+
+#ifdef      __MACPROFILE__
+#include "profiler.h"
+#endif
+
+#ifdef  _SLKP_LFENGINE_REWRITE_
+#include "scfg.h"
+#endif
+
+void    DecideOnDivideBy (_LikelihoodFunction*);
+
+long         siteEvalCount  =   0,
+             divideBy      =   10000000;
+
+
+#if !defined __UNIX__ || defined __HEADLESS__ || defined __HYPHYQT__ || defined __HYPHY_GTK__
+    #if !defined __HEADLESS__ && !defined __HYPHYQT__ && !defined __HYPHY_GTK__
+        #include     "HYTreePanel.h"
+        extern       _HYTreePanel*  feedbackTreePanel;
+    #endif
+
+
+#endif
+
+#ifdef MDSOCL
+	_OCLEvaluator *OCLEval;
+#endif
+
+#ifdef __MP__
+    #include <pthread.h>
+    struct   WancReleafTask {
+        _TheTree    *tree;
+
+        long        startAt,
+                    endAt,
+                    *doneSites,
+                    *lastDone,
+                    totalUniqueSites,
+                    threadIndex;
+
+        _DataSetFilter*
+        dsf;
+
+        _List      *dupList;
+        _Formula   *fla;
+
+    };
+#endif
+
+
+
+#ifdef  __HYPHYMPI__
+
+_List           parallelOptimizerTasks;
+
+_Matrix         varTransferMatrix,
+                resTransferMatrix;
+
+long            MPICategoryCount,
+                transferrableVars,
+                hyphyMPIOptimizerMode = _hyphyLFMPIModeNone;
+
+extern          int       _hy_mpi_node_rank;
+
+_String         mpiLoopSwitchToOptimize ("_CONTEXT_SWITCH_MPIPARTITIONS_"),
+                mpiLoopSwitchToBGM      ("_BGM_SWITCH_");
+
+#endif
+
+extern  _Parameter  machineEps;
+
+#define     SQR(A) (A)*(A)
+#define     GOLDEN_RATIO 1.618034
+#define     GOLDEN_RATIO_R  0.61803399
+#define     GOLDEN_RATIO_C  (1-GOLDEN_RATIO_R)
+
+
+#define   PERTURBATION_OF_ZERO    0.0
+
+long      likeFuncEvalCallCount = 0,
+          systemCPUCount        = 1,
+          lockedLFID         = -1;
+
+#ifndef  __HYALTIVEC__
+#define  STD_GRAD_STEP 1.0e-8
+#else
+#define  STD_GRAD_STEP 5.0e-6
+#endif
+
+#ifdef    __HYPHYDMALLOC__
+#include "dmalloc.h"
+#endif
+
+
+// some string constants
+
+_String
+
+globalStartingPoint             ("GLOBAL_STARTING_POINT"),
+                                randomStartingPerturbations     ("RANDOM_STARTING_PERTURBATIONS"),
+                                optimizationPrecision           ("OPTIMIZATION_PRECISION"),
+                                startingPrecision               ("STARTING_PRECISION"),
+                                optimizationMethod              ("OPTIMIZATION_METHOD"),
+                                useLastResults                  ("USE_LAST_RESULTS"),
+                                allowBoundary                   ("ALLOW_BOUNDARY"),
+                                bracketingPersistence           ("BRACKETING_PERSISTENCE"),
+                                intermediatePrecision           ("INTERMEDIATE_PRECISION"),
+                                keepOptimalOrder                ("KEEP_OPTIMAL_ORDER"),
+                                skipOmissions                   ("SKIP_OMISSIONS"),
+                                optimizeSummationOrder          ("OPTIMIZE_SUMMATION_ORDER"),
+                                optimizePartitionSize           ("OPTIMIZE_SUMMATION_ORDER_PARTITION"),
+                                maximumIterationsPerVariable    ("MAXIMUM_ITERATIONS_PER_VARIABLE"),
+                                optimizationPrecisionMethod     ("OPTIMIZATION_PRECISION_METHOD"),
+                                relativePrecision               ("RELATIVE_PRECISION"),
+                                likefuncOutput                  ("LIKELIHOOD_FUNCTION_OUTPUT"),
+                                dataFilePrintFormat             ("DATA_FILE_PRINT_FORMAT"),
+                                dataFileDefaultWidth            ("DATA_FILE_DEFAULT_WIDTH"),
+                                dataFileGapWidth                ("DATA_FILE_GAP_WIDTH"),
+                                categorySimulationMethod        ("CATEGORY_SIMULATION_METHOD"),
+                                useInitialDistanceGuess         ("USE_DISTANCES"),
+                                randomSeed                      ("RANDOM_SEED"),
+                                assignedSeed                    ("ASSIGNED_SEED"),
+                                covariancePrecision             ("COVARIANCE_PRECISION"),
+                                cacheSubtrees                   ("CACHE_SUBTREES"),
+                                likeFuncCountVar                ("LF_CALL_COUNT"),
+                                doShuffleOrder                  ("SHUFFLE_ORDER_OF_PARAMETERS"),
+                                forceDistanceEstimates          ("FORCE_DISTANCE_ESTIMATES"),
+                                useDuplicateMatrixCaching       ("USE_DUPLICATE_MATRIX_CACHING"),
+                                siteWiseMatrix                  ("SITE_LIKELIHOOD"),
+                                blockWiseMatrix                 ("BLOCK_LIKELIHOOD"),
+                                useFullMST                      ("USE_MST_HEURISTIC"),
+                                stateCountMatrix                ("STATE_COUNT_MATRIX"),
+                                wStateCountMatrix               ("WSTATE_COUNT_MATRIX"),
+                                tryNumericSequenceMatch         ("TRY_NUMERIC_SEQUENCE_MATCH"),
+                                allowSequenceMismatch           ("ALLOW_SEQUENCE_MISMATCH"),
+                                shortMPIReturn                  ("SHORT_MPI_RETURN"),
+                                mpiPrefixCommand                ("MPI_PREFIX_COMMAND"),
+                                skipConjugateGradient           ("SKIP_CONJUGATE_GRADIENT"),
+                                useIntervalMapping              ("USE_INTERVAL_MAPPING"),
+                                intervalMappingMethod           ("INTERVAL_MAPPING_METHOD"),
+                                useAdaptiveVariableStep         ("USE_ADAPTIVE_VARIABLE_STEP"),
+                                storeRootSupportFlag            ("STORE_ROOT_SUPPORT"),
+                                supportMatrixVariable           ("SUPPORT_MATRIX_LIST"),
+                                optimizationStatusFile          ("SAVE_OPT_STATUS_TO"),
+                                autoParalellizeLF               ("AUTO_PARALLELIZE_OPTIMIZE"),
+                                lfExtraLFExportCode             ("LF_NEXUS_EXPORT_EXTRA"),
+                                optimizationStringTemplate      ("OPTIMIZATION_PROGRESS_TEMPLATE"),
+                                // use
+                                // $1 for status
+                                // $2 for log L
+                                // $3 for percent done
+                                // $4 for time elapsed
+                                // $5 for evals/second
+                                // $6 for CPU load
+                                optimizationStringStatus        ("OPTIMIZATION_PROGRESS_STATUS"),
+                                optimizationStringQuantum       ("OPTIMIZATION_PROGRESS_QUANTUM"),
+                                assumeReversible                ("ASSUME_REVERSIBLE_MODELS"),
+                                categoryMatrixScalers           (".site_scalers"),
+                                categoryLogMultiplier           (".log_scale_multiplier"),
+                                optimizationHardLimit           ("OPTIMIZATION_TIME_HARD_LIMIT"),
+                                minimumSitesForAutoParallelize  ("MINIMUM_SITES_FOR_AUTO_PARALLELIZE"),
+                                userSuppliedVariableGrouping    ("PARAMETER_GROUPING"),
+                                addLFSmoothing                  ("LF_SMOOTHING_SCALER"),
+                                reduceLFSmoothing               ("LF_SMOOTHING_REDUCTION");
+
+    
+extern _String useNexusFileData,
+       VerbosityLevelString,
+       acceptRootedTrees;
+
+
+void        countingTraverse         (node<long>*, long&, long, long&, bool);
+void        countingTraverseArbRoot  (node<long>*, node<long>*, long&, long, long&);
+long        findAvailableSlot        (_SimpleList&, long&);
+void        setComputingArrays       (node<long>*, node<long>*, _SimpleList&, _SimpleList&, _SimpleList &, _SimpleList&, _SimpleList&, long&);
+
+#ifdef      __MP__
+void*   StateCounterMP           (void*);
+#endif
+_SimpleList Fibonacci;
+
+_Parameter  go2Bound = 0,
+            precision,
+            optimizationPrecMethod,
+            maxItersPerVar,
+            relPrec,
+            dFPrintFormat,
+            dFDefaultWidth,
+            assignedSeedVal = -1.0,
+            categorySimMethod;
+
+bool        forceRecomputation = false,
+            isInOptimize       = false,
+            usedCachedResults  = false;
+
+long        bracketFCount   = 0,
+            bracketCount   = 0,
+            oneDFCount       = 0,
+            oneDCount         = 0,
+            categID       = 0,
+            offsetCounter   = 1;
+
+extern      long
+matrixExpCount,
+taylorTermsCount,
+squaringsCount;
+
+extern      _List
+dataSetList,
+likeFuncList;
+
+bool        CheckOneDStep   (_Parameter&,_Parameter,_Parameter);
+bool        CheckEqual      (_Parameter, _Parameter);
+
+_Variable*  siteWiseVar     = nil,
+            *  blockWiseVar = nil;
+
+
+_String  *  progressFileString = nil;
+
+node<long>* DepthWiseStepTraverserLevel  (long&, node<long>* root);
+_Parameter  myLog (_Parameter);
+
+
+//__________________________________________________________________________________
+
+
+void         DecideOnDivideBy (_LikelihoodFunction* lf)
+{
+    long         alterIndex = 0;
+
+    if      (lf->HasComputingTemplate()) {
+        for (unsigned long k=0; k<lf->GetIndependentVars().lLength; k++)
+            if (!LocateVar (lf->GetIndependentVars().lData[k])->IsGlobal()) {
+                alterIndex = k;
+                break;
+            }
+    }
+
+
+#ifndef _SLKP_LFENGINE_REWRITE_
+    long                   stash1 = siteEvalCount;
+#endif
+#ifdef  _OPENMP
+    lf->SetThreadCount (1);
+#endif
+    TimerDifferenceFunction (false);
+    lf->SetIthIndependent (alterIndex,lf->GetIthIndependent(alterIndex));
+    lf->Compute           ();
+
+
+#ifdef _SLKP_LFENGINE_REWRITE_
+    _Parameter            tdiff = TimerDifferenceFunction(true);
+#ifdef  _OPENMP
+    if (systemCPUCount > 1) {
+        _Parameter          minDiff = tdiff;
+        long                bestTC  = 1;
+
+        for (long k = 2; k <= systemCPUCount; k++) {
+            lf->SetThreadCount              (k);
+            TimerDifferenceFunction         (false);
+            lf->SetIthIndependent           (alterIndex,lf->GetIthIndependent(alterIndex));
+            lf->Compute                     ();
+            tdiff = TimerDifferenceFunction (true);
+            if (tdiff < minDiff) {
+                minDiff = tdiff;
+                bestTC  = k;
+            } else {
+                break;
+            }
+        }
+        lf->SetThreadCount (bestTC);
+        divideBy              = MAX(1.0,0.5 / minDiff);
+        ReportWarning       (_String("Auto-benchmarked an optimal number (") & bestTC & ") of threads.");
+    } else
+#endif
+        divideBy              = MAX(1.0, 0.5 / tdiff);
+    ReportWarning       (_String("Set GUI update interval to every ") & divideBy & "-th LF evaluation.");
+
+#else
+    divideBy              = (siteEvalCount-stash1) * 0.5 / TimerDifferenceFunction(true);
+#endif
+
+}
+
+
+#if defined  __UNIX__ && !defined __HYPHYQT__ && !defined __HYPHY_GTK__
+
+void        UpdateOptimizationStatus (_Parameter, long, char, bool, _String * fileName = nil);
+
+//__________________________________________________________________________________
+
+void        UpdateOptimizationStatus (_Parameter max, long pdone, char init, bool optimization, _String* fileName)
+{
+    static long     lCount;
+    static long     lastDone;
+    static double   elapsed_time = 0.0;
+    static _Parameter
+    update_quantum = 0.0;
+    static _String  userReportString;
+    static _String  userStatusString;
+
+    static clock_t  userTimeStart;
+    FILE           *outFile = fileName?doFileOpen (fileName->sData,"w"):nil;
+    _FString*       t;
+
+    if (init==0) {
+        lCount          = likeFuncEvalCallCount;
+        TimerDifferenceFunction (false);
+#ifndef _MINGW32_MEGA_
+        setvbuf           (stdout,nil, _IONBF,1);
+#endif
+        lastDone        = 0;
+        userTimeStart   = clock();
+        checkParameter   (optimizationStringQuantum, update_quantum, 0.0);
+        t = (_FString*)FetchObjectFromVariableByType (&optimizationStringTemplate,STRING);
+        userReportString = t?*t->theString:empty;
+        t = (_FString*)FetchObjectFromVariableByType (&optimizationStringStatus,STRING);
+        userStatusString = t?*t->theString:empty;
+        elapsed_time     = 0.0;
+    } else if (init==1) {
+        double timeDiff = TimerDifferenceFunction (true);
+
+        //printf ("%g %g\n", timeDiff,elapsed_time);
+
+        if (pdone<0) {
+            pdone = lastDone;
+        }
+        lastDone = pdone;
+
+        if (timeDiff == 0.0 || timeDiff < update_quantum) {
+            return;
+        } else {
+            elapsed_time += timeDiff;
+            TimerDifferenceFunction (false);
+        }
+
+
+        if (userReportString.sLength) {
+            char buffer[255];
+
+            _String reportString = userReportString.Replace ("$1",userStatusString, true);
+            if (optimization) {
+                snprintf (buffer, sizeof(buffer), "%15.10g", (double)max);
+                reportString = reportString.Replace ("$2", buffer, true);
+            } else {
+                reportString = reportString.Replace ("$2", empty, true);
+            }
+            reportString = reportString.Replace ("$3", _String(pdone), true);
+            _String       tStamp;
+            tStamp.FormatTimeString(elapsed_time);
+            reportString = reportString.Replace ("$4",tStamp, true);
+            if (elapsed_time) {
+                snprintf (buffer,sizeof(buffer),"%8.4g", (clock()-userTimeStart)/((_Parameter)CLOCKS_PER_SEC*(elapsed_time)));
+                reportString = reportString.Replace ("$6", buffer, true);
+                snprintf (buffer, sizeof(buffer), "%8.4g", (likeFuncEvalCallCount-lCount)/elapsed_time);
+                reportString = reportString.Replace ("$5", buffer, true);
+            } else {
+                reportString = reportString.Replace ("$5", empty, true);
+                reportString = reportString.Replace ("$6", empty, true);
+            }
+
+            if (outFile) {
+                fprintf (outFile,"%s", reportString.sData);
+            } else
+#ifndef _MINGW32_MEGA_
+                printf ("\015%s", reportString.sData);
+#else
+                SetStatusLine (reportString);
+#endif
+        } else {
+            char buffer [1024];
+            if (optimization) {
+                if (outFile)
+                    fprintf (outFile,"Likelihood function optimization status\nCurrent Maximum: %-14.8g (%ld %% done)\nLikelihood Function evaluations/second: %-8.4g", (double)max, pdone,
+                             (likeFuncEvalCallCount-lCount)/elapsed_time);
+                else {
+                    long written = snprintf (buffer,1024,"Current Max: %-14.8g (%ld %% done) LF Evals/Sec: %-8.4g", (double)max, pdone, (likeFuncEvalCallCount-lCount)/elapsed_time);
+
+                    if (elapsed_time) {
+                        snprintf (buffer+written,1024-written, "CPU Load: %-8.4g", (clock()-userTimeStart)/((_Parameter)CLOCKS_PER_SEC*elapsed_time));
+                    }
+                }
+            } else {
+                snprintf (buffer, 1024, "Sites done: %g (%ld %% done)", (double)max, pdone);
+            }
+
+#ifndef _MINGW32_MEGA_
+            printf ("\015%s", buffer);
+#else
+            SetStatusLine (_String(buffer));
+#endif
+        }
+
+
+    } else {
+        if (outFile) {
+            fprintf (outFile,"DONE");
+        } else {
+#ifndef _MINGW32_MEGA_
+            printf ("\033\015 ");
+            setvbuf (stdout,nil,_IOLBF,1024);
+#endif
+        }
+    }
+    if (outFile) {
+        fclose (outFile);
+    }
+}
+
+#else
+
+
+#endif
+
+//__________________________________________________________________________________
+
+_Parameter myLog (_Parameter arg)
+{
+    return (arg>0.0)?log(arg):-1000000.;
+}
+
+
+//_______________________________________________________________________________________
+
+_LikelihoodFunction::_LikelihoodFunction (void)
+{
+    Init();
+}
+
+//_______________________________________________________________________________________
+
+void _LikelihoodFunction::Init (void)
+{
+    siteResults         = nil;
+    bySiteResults       = nil;
+    hasBeenOptimized    = false;
+    hasBeenSetUp        = 0;
+    templateKind        = _hyphyLFComputationalTemplateNone;
+    computingTemplate   = nil;
+    mstCache            = nil;
+    nonConstantDep      = nil;
+    evalsSinceLastSetup = 0;
+    siteArrayPopulated  = false;
+    smoothingTerm       = 0.;
+    smoothingPenalty    = 0.;
+
+    conditionalInternalNodeLikelihoodCaches = nil;
+    conditionalTerminalNodeStateFlag        = nil;
+    siteScalingFactors                      = nil;
+    branchCaches                            = nil;
+    parameterValuesAndRanges                = nil;
+    
+#ifdef  _OPENMP
+    SetThreadCount      (systemCPUCount);
+#endif
+
+}
+
+//_______________________________________________________________________________________
+
+_LikelihoodFunction::_LikelihoodFunction (_String& s, _VariableContainer* p)
+// from triplets
+//format: datasetfilter name, tree name, frequency matrix name; etc...
+{
+    Init     ();
+    _List    tripletsRaw (&s,';'),
+             tripletsSplit;
+    for (unsigned long k = 0; k < tripletsRaw.lLength; k++) {
+        _List thisTriplet (tripletsRaw(k),',');
+        tripletsSplit << thisTriplet;
+    }
+    Construct(tripletsSplit,p);
+}
+
+//_______________________________________________________________________________________
+
+bool    _LikelihoodFunction::MapTreeTipsToData (long f, bool leafScan) // from triplets
+{
+    _TheTree*       t = (_TheTree*)LocateVar (theTrees.lData[f]);
+    _CalcNode*      travNode = t->StepWiseTraversal(true);
+    _DataSetFilter* df = (_DataSetFilter*)dataSetFilterList.lData[theDataFilters.lData[f]];
+    long            dfDim = df->GetDimension(true);
+
+    _List           tips;
+
+    while (travNode) {
+        if (t->IsCurrentNodeATip()) {
+            _String tipName (travNode->GetName()->Cut(travNode->GetName()->FindBackwards('.',0,-1)+1,-1));
+            tips&& &tipName;
+        }
+        if (!t->IsCurrentNodeTheRoot()) {
+            if (travNode->GetModelIndex () == HY_NO_MODEL) {
+                WarnError (_String ("Model is not associated with the node:") & *travNode->GetName());
+                return false;
+            } else if (travNode->GetModelDimension() != dfDim) {
+                _String warnMsg ("The dimension of the transition matrix at node ");
+                warnMsg = warnMsg&travNode->GetName()->Cut(travNode->GetName()->FindBackwards('.',0,-1)+1,-1)
+                          &" is not equal to the state count in the data filter associated with the tree.";
+                WarnError (warnMsg);
+                return false;
+            }
+        }
+        travNode = t->StepWiseTraversal(false);
+    }
+    // now that "tips" contains all the names of tree tips we can
+    // scan thru the names in the datafilter and check whether there is a 1-1 match
+    if ((t->IsDegenerate()?2:tips.lLength)!=df->NumberSpecies()) {
+        WarnError (_String("The number of tree tips in ")&*t->GetName()& " (" & _String((long)tips.lLength)
+                   & ") is not equal to the number of species in the data filter associated with the tree " &
+                   '(' & _String((long)df->NumberSpecies()) & ")." );
+        return false;
+    }
+
+    if (!t->IsDegenerate()) {
+        long        j,
+                    k;
+
+        _SimpleList tipMatches;
+        // produce a sorted list of sequence names
+
+        j = df->FindSpeciesName (tips, tipMatches);
+
+        if (j!=tips.lLength) { // try numeric match
+            _Parameter      doNum = 0.0;
+            checkParameter (tryNumericSequenceMatch, doNum, 0.0);
+            if (doNum>0.5) {
+                long sj = j;
+                
+                for (j=0; j<tips.lLength; j++) {
+                    _String *thisName = (_String*)tips(j);
+                    k = atoi (thisName->sData);
+                    _String tryAgain (k);
+                    if (tryAgain.Equal(thisName) && k<=tips.lLength) {
+                        tipMatches<<k;
+                    } else {
+                        break;
+                    }
+                }
+                
+                if (j==tips.lLength) {
+                    if (tipMatches.Find(0)==-1) // map to indexing from 0
+                        tipMatches.Offset (-1);
+
+                    _SimpleList *dfMap = (_SimpleList*)df->GetMap();
+                    
+                    if (dfMap) {
+                        for (sj = 0; sj < tips.lLength; sj++) {
+                            tipMatches.lData[sj] = dfMap->lData[tipMatches.lData[sj]];
+                        }
+                    }
+                } else {
+                    j=sj;
+                }
+            }
+        }
+
+        if (j==tips.lLength) { // all matched
+            /*
+                20100913: SLKP need to check that reusing the datafilter will not mess up existing likelihood function dependendancies
+            */
+
+            _SimpleList * currentMap = (_SimpleList *)df->GetMap();
+            if (! currentMap || ! currentMap->Equal (tipMatches)) {
+                for (long lfID = 0; lfID < likeFuncList.lLength; lfID++) {
+                    _LikelihoodFunction* lfp = (_LikelihoodFunction*)likeFuncList(lfID);
+                    if (lfp && lfp != this && lfp->DependOnDF (theDataFilters.lData[f])) {
+                        WarnError (_String ("Cannot reuse the filter '") & _HBLObjectNameByType (HY_BL_DATASET_FILTER, theDataFilters.lData[f], false) &
+                                   "' because it is already being used by likelihood function '" &
+                                   *_HBLObjectNameByType (HY_BL_LIKELIHOOD_FUNCTION, lfID, false) & "', and the two likelihood functions impose different leaf-to-sequence mapping. " &
+                                   "Create a copy the filter and pass it to the second likelihood function to resolve this issue.");
+
+                        return false;
+                    }
+                }
+                df->SetMap(tipMatches);
+            }
+            ReportWarning (_String ("The tips of the tree:") & *t->GetName() &" were matched with the species names from the data as follows "& _String ((_String*)tipMatches.toStr()));
+        } else {
+            _String warnMsg = _String ("The leaf of the tree:") & *t->GetName() &" labeled " &*(_String*)tips(j)
+                              &" had no match in the data. Please make sure that all leaf names correspond to a sequence name in the data file.";
+            _Parameter asmm = 0.0;
+            checkParameter (allowSequenceMismatch, asmm, 0.0);
+            if (asmm<.5) {
+                WarnError (warnMsg);
+                return false;
+            }
+            ReportWarning (warnMsg);
+        }
+    }
+    if (leafScan) {
+        ((_SimpleList*)leafSkips(f))->Clear();
+        df->MatchStartNEnd(*(_SimpleList*)optimalOrders(f),*(_SimpleList*)leafSkips(f));
+        t->BuildINodeDependancies();
+    }
+    return true;
+}
+
+//_______________________________________________________________________________________
+
+bool    _LikelihoodFunction::UpdateFilterSize (long f) // from triplets
+{
+    _TheTree*       t = (_TheTree*)LocateVar (theTrees.lData[f]);
+    _CalcNode*      travNode = t->StepWiseTraversal(true);
+    _DataSetFilter* df = (_DataSetFilter*)dataSetFilterList.lData[f];
+
+    _List      tips;
+    while (travNode) {
+        if (t->IsCurrentNodeATip()) {
+            _String tipName (travNode->GetName()->Cut(travNode->GetName()->FindBackwards('.',0,-1)+1,-1));
+            tips&& &tipName;
+        }
+        travNode = t->StepWiseTraversal(false);
+    }
+
+    if (!t->IsDegenerate()) {
+        long    j;
+
+        _SimpleList tipMatches;
+        _List*      specNames = &df->GetData()->GetNames();
+
+        for (j=0; j<tips.lLength; j++) {
+            long k = specNames->Find((_String*)tips(j));
+            if   (k==-1) {
+                break;
+            }
+            tipMatches<<k;
+        }
+        if (j==tips.lLength) { // all matched
+            _SimpleList  sortedList,
+                         vertPart,
+                         theExclusions;
+
+            long                        unitSize = df->GetUnitLength();
+            sortedList.Duplicate        (&tipMatches);
+            sortedList.Sort             ();
+            vertPart.Duplicate          (&df->theOriginalOrder);
+            theExclusions.Duplicate     (&df->theExclusions);
+            df->SetFilter               (df->GetData(),unitSize,sortedList,vertPart,false);
+            df->SetMap                  (tipMatches);
+            df->FilterDeletions         (&theExclusions);
+            df->theExclusions.Duplicate (&theExclusions);
+            df->SetupConversion         ();
+            sortedList.Clear            ();
+
+            _SimpleList*                theOO = (_SimpleList*)optimalOrders (f),
+                                        *               theLS = (_SimpleList*)leafSkips (f);
+
+            theOO->Clear();
+            theLS->Clear();
+            theOO->Populate (df->theMap.lLength/unitSize,0,1);
+            df->MatchStartNEnd (*theOO,*theLS);
+        } else {
+            return false;
+        }
+    }
+    return true;
+}
+//_______________________________________________________________________________________
+
+void     _LikelihoodFunction::Rebuild (void)
+{
+    blockDependancies.Clear();
+    computationalResults.Clear();
+    hasBeenSetUp     = 0;
+    hasBeenOptimized = false;
+    Cleanup();
+    RescanAllVariables();
+    Setup();
+}
+//_______________________________________________________________________________________
+
+void     _LikelihoodFunction::Clear (void)
+{
+    DeleteCaches  ();
+    theTrees.Clear();
+    theDataFilters.Clear();
+    theProbabilities.Clear();
+    indexInd.Clear();
+    indexDep.Clear();
+    indexCat.Clear();
+    blockDependancies.Clear();
+    computationalResults.Clear();
+    partScalingCache.Clear();
+    indVarsByPartition.Clear();
+    depVarsByPartition.Clear();
+
+
+    optimalOrders.Clear();
+    leafSkips.Clear();
+    hasBeenSetUp            = 0;
+    hasBeenOptimized        = false;
+    if (computingTemplate) {
+        delete computingTemplate;
+        computingTemplate = nil;
+        templateKind      = _hyphyLFComputationalTemplateNone;
+    }
+    if (mstCache) {
+        delete (mstCache);
+        mstCache = nil;
+    }
+
+    treeTraversalMasks.Clear();
+    canUseReversibleSpeedups.Clear();
+#ifdef  _OPENMP
+    SetThreadCount      (systemCPUCount);
+#endif
+}
+
+
+//_______________________________________________________________________________________
+
+bool     _LikelihoodFunction::Construct(_List& triplets, _VariableContainer* theP)
+/* SLKP v2.0 code cleanup 20090316 */
+
+/* modified the code to take arguments as a pre-partitioned list,
+   instead of the string;
+   this will make building LFs from matrices of strings possible */
+
+// from triplets
+// format: datasetfilter name, tree name, frequency matrix name; etc...
+{
+
+    Clear ();
+    long i = 0;
+    for (; i< (long)triplets.lLength-2; i+=3) {
+        _String* objectName;
+        long     objectID;
+
+        // add datasetfilter
+        objectName = (_String*)triplets(i);
+        objectID   = FindDataSetFilterName(AppendContainerName(*objectName,theP));
+        if (objectID == -1) {
+            WarnError (_String("\nCould not locate a datafilter named: ")&*objectName);
+            return false;
+        } else {
+            theDataFilters<<objectID;
+        }
+
+        // add the tree
+        _TheTree   * treeVar = (_TheTree*)FetchObjectFromVariableByType (&AppendContainerName(*(_String*)triplets(i+1),theP), TREE);
+        if (!treeVar) {
+            WarnError (_String("\nCould not locate a tree variable named: ")&*objectName);
+            return false;
+        } else {
+            theTrees<<treeVar->GetAVariable();
+        }
+
+        // add the matrix of probabilities
+        objectName = (_String*)triplets(i+2);
+        objectID   = LocateVarByName(AppendContainerName(*objectName,theP));
+        _Matrix*   efv              = (_Matrix*)FetchObjectFromVariableByTypeIndex(objectID, MATRIX);
+        long       efvDim;
+        if (!efv) {
+            WarnError (_String("\nCould not locate a frequencies matrix named: ")&*objectName);
+            return false;
+        } else {
+            efvDim = efv->GetHDim();
+            theProbabilities<<variableNames.GetXtra(objectID);
+        }
+        // at this stage also check to see whether tree tips match to species names in the dataset filter and
+        // if they do - then remap
+        _SimpleList         remap;
+        _DataSetFilter*     df = ((_DataSetFilter*)dataSetFilterList(theDataFilters(theDataFilters.lLength-1)));
+
+        long dfDim          = df->GetDimension(true);
+
+        if ( efvDim!=dfDim) {
+            WarnError (_String("The dimension of the equilibrium frequencies vector ") &
+                       *(_String*)triplets(i+2) & " (" & efvDim & ") doesn't match the number of states in the dataset filter (" & dfDim & ") " &*(_String*)triplets(i));
+            return false;
+        }
+
+        if (df->IsNormalFilter() == false)
+            // do checks for the numeric filter
+        {
+            if (df->NumberSpecies() != 3 || df->GetDimension () != 4) {
+                WarnError ("Datafilters with numerical probability vectors must contain exactly three sequences and contain nucleotide data");
+
+                return false;
+            }
+        }
+        // first - produce the list of tip node names
+        if (!MapTreeTipsToData (theTrees.lLength-1)) {
+            return false;
+        }
+    }
+    if (i && i == triplets.lLength-1) {
+        _String templateFormulaString (ProcessLiteralArgument((_String*)triplets(i),theP));
+
+        if (templateFormulaString.sLength) {
+            siteWiseVar  = CheckReceptacle (&siteWiseMatrix,empty),
+            blockWiseVar = CheckReceptacle (&blockWiseMatrix,empty);
+
+            _String    copyString         (templateFormulaString);
+            // do this because _Formula constructor will consume the string parameter
+            _Formula   templateFormula    (templateFormulaString,theP);
+
+
+            if (templateFormula.IsEmpty()|| terminateExecution) {
+                WarnError (copyString  & " is not a valid formula specification in call to LikelihoodFunction");
+                Clear     ();
+                return    false;
+            }
+
+            bool  hasSiteMx         = templateFormula.DependsOnVariable(siteWiseVar->GetAVariable()),
+                  hasBlkMx            = templateFormula.DependsOnVariable(blockWiseVar->GetAVariable());
+
+            templateKind = _hyphyLFComputationalTemplateNone;
+            long            templateFormulaOpCount = templateFormula.NumberOperations();
+
+            if ( (hasBlkMx && hasSiteMx) || !(hasBlkMx||hasSiteMx) ) {
+                if (hasBlkMx||hasSiteMx == false) {
+                    if (templateFormulaOpCount==1)
+                        // potentially an HMM
+                    {
+                        _Operation * firstOp = templateFormula.GetIthTerm (0);
+                        if (firstOp->IsAVariable(false)) {
+                            _Variable * hmmVar = LocateVar(firstOp->GetAVariable());
+                            if (hmmVar->IsCategory() && ((_CategoryVariable*)hmmVar)->IsHiddenMarkov()) {
+                                templateKind = -hmmVar->GetAVariable()-1;
+                                hasSiteMx    = true;
+                            }
+                        }
+                    } else if (templateFormulaOpCount>=2) { // user function
+                        long         nOps   =  templateFormula.GetIthTerm (templateFormulaOpCount-1)->UserFunctionID();
+                        if (nOps>=0) { // user defined function
+                            templateKind = _hyphyLFComputationalTemplateByPartition+1+nOps;
+                            hasSiteMx    = true;
+                        }
+                    }
+                }
+                if (templateKind == _hyphyLFComputationalTemplateNone)
+                    // error condition here
+                {
+                    WarnError ( copyString & " must depend either on " & siteWiseMatrix & " or " & blockWiseMatrix & " (but not on both). Alternatively, it could be a reference to a HM category variable or a user defined BL function." );
+                    Clear     ();
+                    return false;
+                }
+            }
+
+            // determine the longest filter
+
+            long             maxFilterSize = 0;
+
+            if (hasSiteMx) {
+                if (templateKind == _hyphyLFComputationalTemplateNone) {
+                    templateKind = _hyphyLFComputationalTemplateBySite;
+                }
+
+                for (long f=0; f<theDataFilters.lLength; f++) {
+                    long            currentFilterSize =  ((_DataSetFilter*)dataSetFilterList(theDataFilters(f)))->GetSiteCount();
+
+                    if (currentFilterSize > maxFilterSize) {
+                        maxFilterSize = currentFilterSize;
+                    }
+                }
+            } else {
+                templateKind = hasBlkMx?_hyphyLFComputationalTemplateByPartition : _hyphyLFComputationalTemplateNone;
+            }
+
+            // now test evaluate the formula
+
+            if (templateKind==_hyphyLFComputationalTemplateBySite || templateKind==_hyphyLFComputationalTemplateByPartition) {
+                _Matrix         testMx  (theTrees.lLength,1,false,true),
+                                testMx2 (theTrees.lLength,1,false,true);
+                                
+                for (long testCount = 0; testCount<25; testCount++) {
+                    for (unsigned long di = 0; di < theTrees.lLength; di++) {
+                        testMx.theData[di]  = genrand_int32 ()/(_Parameter)RAND_MAX_32;
+                        testMx2.theData[di] = (genrand_int32 ()/(_Parameter)RAND_MAX_32)*(-1.);
+                    }
+
+                    siteWiseVar->SetValue  (&testMx);
+                    blockWiseVar->SetValue (&testMx2);
+
+                    _PMathObj    testResult = templateFormula.Compute();
+                    _String     errMessage;
+                    if (!testResult || terminateExecution) {
+                        errMessage = _String ("Failed to evaluate computation template formula (")& copyString & ") in LikelihoodFunction constructor.";
+                    } else {
+                        if (testResult->ObjectClass() == NUMBER) {
+                            if (testResult->Value()>0.0 ) {
+                                errMessage = _String ("Computation template formula (")& copyString & ") in LikelihoodFunction constructor evaluated to a positive value = " & testResult->Value() & " (as a log-likelihood - must be non-positive).";
+                            }
+                        } else {
+                            errMessage = _String ("Computation template formula (")& copyString & ") in LikelihoodFunction constructor evaluated to a non-scalar value.";
+                        }
+                    }
+
+                    if (errMessage.sLength) {
+                        WarnError (errMessage);
+                        Clear ();
+                        return false;
+                    }
+                }
+            }
+
+            computingTemplate = (_Formula*)templateFormula.makeDynamic();
+
+            if (templateKind < 0 || templateKind == _hyphyLFComputationalTemplateBySite) {
+#ifdef __HYPHYMPI__
+                bySiteResults = (_Matrix*)checkPointer(new _Matrix    (theTrees.lLength+3,maxFilterSize,false,true));
+#else
+                 bySiteResults = (_Matrix*)checkPointer(new _Matrix    (theTrees.lLength+2,maxFilterSize,false,true));
+#endif
+                for (long k = 0; k <= theTrees.lLength; k++) {
+                    partScalingCache.AppendNewInstance    (new _SimpleList(maxFilterSize, 0,0));
+                }
+            } else {
+                bySiteResults = nil;
+            }
+
+        }
+    }
+
+    if (theTrees.lLength>1) {
+        _SimpleList      checkDupTreeIDs (theTrees);
+        checkDupTreeIDs.Sort ();
+        for (long i=1; i<checkDupTreeIDs.lLength; i++)
+            if (checkDupTreeIDs.lData[i] == checkDupTreeIDs.lData[i-1]) {
+                WarnError (_String("The same tree - ")&*LocateVar(checkDupTreeIDs.lData[i])->GetName() &
+                           " - can't be used in multiple partitions in the same likelihood function. You should create an independent tree for each partition, and constrain the parameters instead.");
+                return false;
+            }
+    } else {
+        if (theTrees.lLength == 0) {
+            WarnError ("Too few arguments in call to _LikelihoodFunction::Construct");
+            Clear ();
+            return false;
+
+        }
+    }
+
+
+    ScanAllVariables();
+    Setup();
+    return true;
+}
+
+//_______________________________________________________________________________________
+
+_LikelihoodFunction::_LikelihoodFunction (_LikelihoodFunction& lf) // stack copy
+{
+    Clear();
+
+    hasBeenOptimized    = lf.hasBeenOptimized;
+    templateKind        = lf.templateKind;
+
+    if (lf.computingTemplate) {
+        computingTemplate   = (_Formula*)lf.computingTemplate->makeDynamic();
+    } else {
+        computingTemplate   = nil;
+    }
+
+    mstCache        = nil;
+    nonConstantDep  = nil;
+
+    Duplicate (&lf);
+}
+
+//_______________________________________________________________________________________
+
+BaseRef _LikelihoodFunction::makeDynamic (void)  // dynamic copy of this object
+{
+    _LikelihoodFunction * res = new _LikelihoodFunction;
+    checkPointer(res);
+    memcpy ((char*)res, (char*)this, sizeof (_LikelihoodFunction));
+    if (!res) {
+        isError(0);
+        return nil;
+    }
+    res->Duplicate(this);
+    return res;
+}
+
+//_______________________________________________________________________________________
+
+void    _LikelihoodFunction::Duplicate (BaseRef obj) // duplicate an object into this one
+{
+    _LikelihoodFunction* lf = (_LikelihoodFunction*)obj;
+    theTrees.Duplicate(&lf->theTrees);
+    theProbabilities.Duplicate(&lf->theProbabilities);
+    theDataFilters.Duplicate(&lf->theDataFilters);
+    indexInd.Duplicate(&lf->indexInd);
+    indexDep.Duplicate(&lf->indexDep);
+    indexCat.Duplicate(&lf->indexCat);
+    blockDependancies.Duplicate(&lf->blockDependancies);
+    computationalResults.Duplicate(&lf->computationalResults);
+    siteResults = nil;
+
+    optimalOrders.Duplicate(&lf->optimalOrders);
+    leafSkips.Duplicate (&lf->leafSkips);
+    templateKind        = lf->templateKind;
+
+    if (lf->computingTemplate) {
+        computingTemplate   = (_Formula*)lf->computingTemplate->makeDynamic();
+    } else {
+        computingTemplate   = nil;
+    }
+
+    if (lf->mstCache) {
+        mstCache = new MSTCache;
+        checkPointer (mstCache);
+
+        mstCache->computingOrder.Duplicate(&lf->mstCache->computingOrder);
+        mstCache->storageOrder.Duplicate  (&lf->mstCache->storageOrder);
+        mstCache->referenceOrder.Duplicate(&lf->mstCache->referenceOrder);
+        mstCache->parentOrder.Duplicate (&lf->mstCache->parentOrder);
+        mstCache->resultCache.Duplicate (&lf->mstCache->resultCache);
+        mstCache->statesCache.Duplicate (&lf->mstCache->statesCache);
+        mstCache->cacheSize.Duplicate(&lf->mstCache->cacheSize);
+    }
+
+    if (lf->bySiteResults) {
+        bySiteResults = (_Matrix*)lf->bySiteResults->makeDynamic();
+    } else {
+        bySiteResults = nil;
+    }
+
+    if (lf->nonConstantDep) {
+        nonConstantDep = (_SimpleList*)lf->nonConstantDep->makeDynamic();
+    } else {
+        nonConstantDep = nil;
+    }
+}
+
+
+//_______________________________________________________________________________________
+_SimpleList&    _LikelihoodFunction::GetIndependentVars (void)
+{
+    return indexInd;
+}
+
+//_______________________________________________________________________________________
+_SimpleList&    _LikelihoodFunction::GetDependentVars (void)
+{
+    return indexDep;
+}
+
+//_______________________________________________________________________________________
+_SimpleList&    _LikelihoodFunction::GetCategoryVars (void)
+{
+    return indexCat;
+}
+
+//_______________________________________________________________________________________
+void    _LikelihoodFunction::GetGlobalVars (_SimpleList& rec)
+{
+    _Variable*      thisV;
+    long            k;
+
+    for (k=0; k<indexInd.lLength; k++) {
+        thisV = LocateVar (indexInd.lData[k]);
+        if (thisV->IsGlobal()) {
+            rec << indexInd.lData[k];
+        }
+    }
+    for (k=0; k<indexDep.lLength; k++) {
+        thisV = LocateVar (indexDep.lData[k]);
+        if (thisV->IsGlobal()) {
+            rec << indexDep.lData[k];
+        }
+    }
+}
+
+//_______________________________________________________________________________________
+_Parameter  _LikelihoodFunction::GetIthIndependent (long index)
+{
+    if (parameterValuesAndRanges) {
+        return (*parameterValuesAndRanges)(index,1);
+    }
+
+    return ((_Constant*) LocateVar (indexInd.lData[index])->Compute())->Value();
+}
+
+
+//_______________________________________________________________________________________
+
+_Parameter  _LikelihoodFunction::GetIthIndependentBound      (long index, bool isLower)
+{
+    if (parameterValuesAndRanges) {
+        return (*parameterValuesAndRanges)(index,isLower?2:3);
+    }
+    if (isLower) {
+        return GetIthIndependentVar(index)->GetLowerBound();
+    }
+    return GetIthIndependentVar(index)->GetUpperBound();
+
+}
+//_______________________________________________________________________________________
+_Parameter  _LikelihoodFunction::GetIthDependent (long index)
+{
+    return ((_Constant*) LocateVar (indexDep.lData[index])->Compute())->Value();
+}
+
+//_______________________________________________________________________________________
+_Variable*  _LikelihoodFunction::GetIthIndependentVar (long index)
+{
+    return LocateVar (indexInd.lData[index]);
+}
+//_______________________________________________________________________________________
+_Variable*  _LikelihoodFunction::GetIthDependentVar (long index)
+{
+    return LocateVar (indexDep.lData[index]);
+}
+//_______________________________________________________________________________________
+void    _LikelihoodFunction::SetIthIndependent (long index, _Parameter p)
+{
+    if (parameterValuesAndRanges) {
+        parameterValuesAndRanges->Store(index,1,p);
+        p = mapParameterToInverval(p,parameterTransformationFunction.Element(index),true);
+        parameterValuesAndRanges->Store(index,0,p);
+    }
+    //printf ("%10.10g\n", p);
+    _Variable * v =(_Variable*) LocateVar (indexInd.lData[index]);
+    v->SetValue (new _Constant (p), false);
+}
+
+//_______________________________________________________________________________________
+bool    _LikelihoodFunction::IsIthParameterGlobal (long index)
+{
+    _Variable * v =(_Variable*) LocateVar (indexInd.lData[index]);
+    return v->IsGlobal();
+}
+
+
+//_______________________________________________________________________________________
+bool    _LikelihoodFunction::CheckAndSetIthIndependent (long index, _Parameter p)
+{
+    _Variable * v =(_Variable*) LocateVar (indexInd.lData[index]);
+
+    bool set;
+
+    if (parameterValuesAndRanges) {
+        parameterValuesAndRanges->Store(index,1,p);
+        p = mapParameterToInverval(p,parameterTransformationFunction.Element(index),true);
+        parameterValuesAndRanges->Store(index,0,p);
+    }
+
+    _Parameter oldValue = v->Value();
+
+    if (p!=0.0) {
+        set = (fabs((oldValue-p)/p))>machineEps;
+    } else {
+        set = fabs(oldValue-p)>machineEps;
+    }
+
+    if (set) {
+        v->SetValue (new _Constant (p), false);
+    }
+
+    return set;
+}
+
+//_______________________________________________________________________________________
+void    _LikelihoodFunction::SetIthDependent (long index, _Parameter p)
+{
+    _Variable * v =(_Variable*) LocateVar (indexDep.lData[index]);
+    v->SetValue (new _Constant (p),false);
+}
+
+//_______________________________________________________________________________________
+long    _LikelihoodFunction::SetAllIndependent (_Matrix* v)
+{
+    unsigned long upto = v->GetSize();
+    long     set_this_many = 0;
+    upto = MIN (upto, indexInd.lLength);
+    for (long k = 0; k < upto; k++) {
+        set_this_many += CheckAndSetIthIndependent (k, v->theData[k]);
+    }
+    return set_this_many;
+}
+
+//_______________________________________________________________________________________
+_Matrix*    _LikelihoodFunction::RemapMatrix(_Matrix* source, const _SimpleList& partsToDo)
+{
+    long hDim               =   source->GetHDim(),
+         vDim                =   0,
+         offsetInSource      =   0,
+         offsetInTarget      =   0;
+
+    for (long i=0; i<partsToDo.lLength; i++) {
+        vDim+=((_DataSetFilter*)dataSetFilterList(theDataFilters.lData[partsToDo.lData[i]]))->GetSiteCount();
+    }
+
+    _Matrix* res = (_Matrix*)checkPointer(new _Matrix (hDim,vDim,false,true));
+
+    for (long aPart = 0; aPart<partsToDo.lLength; aPart++) {
+        long partIndex = partsToDo.lData[aPart];
+        _DataSetFilter  * dsf = ((_DataSetFilter*)dataSetFilterList(theDataFilters(partIndex)));
+        long filterSize = dsf->GetSiteCount();
+
+        if (HasHiddenMarkov(blockDependancies.lData[partIndex])>=0)
+            // do nothing, just copy
+        {
+            for (long rowIndex = 0; rowIndex < hDim; rowIndex++)
+                for (long columnIndex = 0; columnIndex < filterSize; columnIndex++) {
+                    res->Store (rowIndex, columnIndex + offsetInTarget, (*source)(rowIndex, columnIndex + offsetInSource));
+                }
+
+            offsetInSource  +=  filterSize;
+        } else {
+            for (long rowIndex = 0; rowIndex < hDim; rowIndex++)
+                for (long columnIndex = 0; columnIndex < filterSize; columnIndex++) {
+                    res->Store (rowIndex, columnIndex + offsetInTarget, (*source)(rowIndex, dsf->duplicateMap.lData[columnIndex] + offsetInSource));
+                }
+
+            offsetInSource  +=  BlockLength(partIndex);
+        }
+        offsetInTarget  +=  filterSize;
+    }
+    res->AmISparse();
+    return res;
+
+}
+
+//_______________________________________________________________________________________
+
+#ifdef __HYPHYMPI__
+void        _LikelihoodFunction::MPI_LF_Compute (long senderID, bool partMode)
+#else
+void        _LikelihoodFunction::MPI_LF_Compute (long, bool)
+#endif
+{
+#ifdef __HYPHYMPI__
+
+    if (!partMode) {
+        AllocateSiteResults ();
+    }
+
+    _Matrix       variableStash (indexInd.lLength,1,false,true);
+    _Parameter    siteLL = 0.;
+
+    MPI_Status    status;
+    //ReportWarning (_String ("Waiting on:") & (long) indexInd.lLength & " MPI_DOUBLES");
+    ReportMPIError(MPI_Recv(variableStash.theData, indexInd.lLength, MPI_DOUBLE, senderID, HYPHY_MPI_VARS_TAG, MPI_COMM_WORLD,&status),false);
+
+    //printf ("[ENTER NODE] %d\n", _hy_mpi_node_rank);
+
+    while (variableStash.theData[0]>=-1e100)
+        // variableStash.theData[0] < -1e100 terminates the computation
+    {
+        //ReportWarning (_String("In at step  ") & loopie);
+        bool    doSomething = false;
+        for (long i = 0; i<indexInd.lLength; i++) {
+            _Variable *anInd = LocateVar(indexInd.lData[i]);
+            //ReportWarning (*anInd->GetName() & " = " & variableStash.theData[i]);
+            if (anInd->HasChanged() || !CheckEqual(anInd->Value(), variableStash.theData[i])) {
+                doSomething = true;
+                SetIthIndependent (i,variableStash.theData[i]);
+            }
+        }
+        if (doSomething) {
+            if (partMode) {
+                siteLL = Compute();
+            } else {
+
+                if (PreCompute()) {
+                    //ReportWarning ("Computing...");
+                    ComputeSiteLikelihoodsForABlock (0,siteResults->theData, siteScalerBuffer);
+                    PostCompute();
+                } else
+                    // dependant condition failed
+                {
+                    siteResults->PopulateConstantMatrix (1e-100);
+                    //printf ("[PWNED] %d\n", _hy_mpi_node_rank);
+                }
+
+                for (long k = 0; k < siteScalerBuffer.lLength; k++) {
+                    siteResults->theData[siteScalerBuffer.lLength+k] = siteScalerBuffer.lData[k];
+                    //printf ("%d %d => %g %g\n", _hy_mpi_node_rank, k, siteResults->theData[k], siteResults->theData[siteScalerBuffer.lLength+k]);
+                }
+            }
+
+        }
+        //else
+        //  printf ("%d : NOTHING TO DO!\n", _hy_mpi_node_rank);
+
+        //printf ("%d [mode = %d] %d/%d\n", _hy_mpi_node_rank, partMode, siteResults->GetSize(), siteScalerBuffer.lLength);
+
+        if (partMode) {
+            ReportMPIError(MPI_Send(&siteLL, 1, MPI_DOUBLE, senderID, HYPHY_MPI_DATA_TAG, MPI_COMM_WORLD),true);
+        } else
+            // need to send both
+        {
+            ReportMPIError(MPI_Send(siteResults->theData, siteResults->GetSize(), MPI_DOUBLE, senderID, HYPHY_MPI_DATA_TAG, MPI_COMM_WORLD),true);
+        }
+        ReportMPIError(MPI_Recv(variableStash.theData, indexInd.lLength, MPI_DOUBLE, senderID, HYPHY_MPI_VARS_TAG, MPI_COMM_WORLD,&status),false);
+    }
+    //ReportWarning (_String("Exiting slave loop after step  ") & loopie);
+#endif
+}
+
+
+
+//_______________________________________________________________________________________
+_Matrix*    _LikelihoodFunction::ConstructCategoryMatrix (const _SimpleList& whichParts, char runMode, bool remap, _String* storageID)
+{
+    long                        hDim = 1,
+                                vDim = 0,
+                                currentOffset = 0;
+
+
+    PrepareToCompute();
+    if (runMode == _hyphyLFConstructCategoryMatrixConditionals || runMode == _hyphyLFConstructCategoryMatrixWeights)
+        // just return the matrix with class weights
+    {
+        for (long whichPart=0; whichPart<whichParts.lLength; whichPart++) {
+            long myCatCount = TotalRateClassesForAPartition (whichParts.lData[whichPart]);
+            if (myCatCount > hDim) {
+                hDim = myCatCount;
+            }
+        }
+    }
+
+
+    if (runMode == _hyphyLFConstructCategoryMatrixWeights) {
+        _Matrix     * catWeights = new _Matrix (whichParts.lLength, hDim, false, true);
+        _SimpleList scalers;
+        for (long whichPart=0; whichPart<whichParts.lLength; whichPart++) {
+            PopulateConditionalProbabilities (whichParts.lData[whichPart],
+                                              _hyphyLFConditionProbsClassWeights,
+                                              catWeights->theData + hDim*whichPart,
+                                              scalers);
+
+        }
+        catWeights->Transpose();
+        DoneComputing();
+        return catWeights;
+    }
+
+    // compute the number of columns in the matrix
+
+    if (templateKind < 0) {
+        vDim    =   ((_DataSetFilter*)dataSetFilterList(theDataFilters.lData[0]))->GetSiteCount();
+    } else
+        for (long i=0; i<whichParts.lLength; i++)
+            if (runMode != _hyphyLFConstructCategoryMatrixConditionals
+                    && HasHiddenMarkov(blockDependancies.lData[whichParts.lData[i]])>=0) {
+                vDim    +=  ((_DataSetFilter*)dataSetFilterList(theDataFilters.lData[i]))->GetSiteCount();
+            }
+    // all sites
+            else {
+                vDim    +=      BlockLength(i);
+            }
+    // only unique patterns for now
+
+
+
+    if (runMode == _hyphyLFConstructCategoryMatrixClasses || runMode == _hyphyLFConstructCategoryMatrixSiteProbabilities)
+        // just return the maximum conditional likelihood category
+    {
+        _Matrix      *result = (_Matrix*)checkPointer(new _Matrix (hDim,vDim,false,true)),
+                      *cache     = nil;
+        _SimpleList  *scalerCache = nil;
+
+        bool         done         = false;
+
+        if (runMode == _hyphyLFConstructCategoryMatrixSiteProbabilities) {
+            long bufferL = PartitionLengths (0, &whichParts);
+            cache        = (_Matrix*)checkPointer (new _Matrix (bufferL,2,false,true));
+            scalerCache  = (_SimpleList*)checkPointer (new _SimpleList (bufferL,0,0));
+        } else {
+            if (templateKind < 0) { // HMM
+                _CategoryVariable*hmmVar = (_CategoryVariable*)FetchVar (-templateKind-1);
+
+                Compute                              ();
+
+                RunViterbi                           (*result,bySiteResults->theData,
+                                                      *hmmVar->ComputeHiddenMarkov(),
+                                                      *hmmVar->ComputeHiddenMarkovFreqs(),
+                                                      nil,
+                                                      &partScalingCache,
+                                                      vDim
+                                                     );
+
+                remap = false;
+                done = true;
+
+            }
+
+        }
+
+        // now proceed to compute each of the blocks
+        if (!done)
+            for (long whichPart=0; whichPart<whichParts.lLength; whichPart++) {
+                long i = whichParts.lData[whichPart];
+
+                if (runMode == _hyphyLFConstructCategoryMatrixSiteProbabilities) {
+                    long partititonSpan             = BlockLength (i);
+                    ComputeSiteLikelihoodsForABlock (i, cache->theData, *scalerCache);
+                    for (long c = 0; c < partititonSpan; c++) {
+                        result->theData[currentOffset+c] = log(cache->theData[c]);
+                        if (scalerCache->lData[c]) {
+                            result->theData[currentOffset+c] -= scalerCache->lData[c]*_logLFScaler;
+                        }
+
+
+                    }
+                    currentOffset                  += partititonSpan;
+                    continue;
+                }
+
+                if (blockDependancies.lData[i] > 0)
+                    // if a partition that does not depend on category variables
+                    // then the matrix is already populated with zeros
+                {
+                    _SimpleList      *catVarType         = (_SimpleList*)((*(_List*)categoryTraversalTemplate(i))(4)),
+                                      *filterMap          = &((_DataSetFilter*)dataSetFilterList (theDataFilters(i)))->duplicateMap;
+
+                    long             categoryType        = catVarType->Element (-1),
+                                     blockSize          = BlockLength (i),
+                                     siteCount          = filterMap->lLength;
+
+                    // check to see if we need to handle HMM or COP variables
+                    if (categoryType & _hyphyCategoryHMM) {
+                        _CategoryVariable*hmmVar        = (_CategoryVariable*)((*(_List*)(*(_List*)categoryTraversalTemplate(i))(0))(0));
+
+                        /*
+                           run the Viterbi algorithm to reconstruct the most likely
+                           HMM path
+                        */
+                        ComputeSiteLikelihoodsForABlock    (i, siteResults->theData, siteScalerBuffer);
+
+                        RunViterbi (*result,
+                                    siteResults->theData,
+                                    *hmmVar->ComputeHiddenMarkov(),
+                                    *hmmVar->ComputeHiddenMarkovFreqs(),
+                                    &((_DataSetFilter*)dataSetFilterList (theDataFilters(i)))->duplicateMap,
+                                    &siteScalerBuffer,
+                                    blockSize);
+
+
+                        currentOffset += siteCount;
+                    } else {
+
+                        long hasConstantOnPartition = HasHiddenMarkov(blockDependancies.lData[i],false);
+                        if (hasConstantOnPartition<0) {
+                            _SimpleList scalers (blockSize, 0, 0);
+                            // allocate a vector of 3*blockSize
+
+                            _Parameter  * likelihoodBuffer = new _Parameter[3*blockSize];
+                            PopulateConditionalProbabilities (i,_hyphyLFConditionProbsMaxProbClass,likelihoodBuffer,scalers);
+
+                            for (long i = 0; i < blockSize; i++) {
+                                result->theData[currentOffset+i] = likelihoodBuffer[i];
+                            }
+
+                            delete       [] likelihoodBuffer;
+                        } else {
+                            WarnError ("This feature has not yet been implemented in the new LF engine framework");
+                            return result;
+
+                            long    mxDim = 1,
+                                    bl = BlockLength (i),
+                                    j;
+
+                            for (j=0; j<=hasConstantOnPartition; j++)
+                                if (CheckNthBit (blockDependancies.lData[i],j)) {
+                                    _CategoryVariable* thisC = (_CategoryVariable*)LocateVar(indexCat.lData[j]);
+                                    mxDim *= thisC->GetNumberOfIntervals();
+                                }
+
+                            _Matrix ccache (mxDim,1,false,true);
+
+                            categID = 0;
+                            RecurseConstantOnPartition    (i,0,blockDependancies.lData[j],hasConstantOnPartition,1,ccache);
+                            categID = 0;
+
+                            /*
+                                FindMaxCategory(i,  HighestBit( blockDependancies.lData[i]), blockDependancies.lData[i], ff+1, currentOffset, result);
+                            */
+
+                            _Parameter maxValue = -1.e300;
+                            long       mxIndex  = -1;
+
+                            for (j=0; j<mxDim; j++)
+                                if (ccache.theData[j] > maxValue) {
+                                    maxValue = ccache.theData[j];
+                                    mxIndex = j;
+                                }
+
+                            mxDim = 1;
+                            for (j=HighestBit (blockDependancies.lData[i]); j>hasConstantOnPartition; j--)
+                                if (CheckNthBit (blockDependancies.lData[i],j)) {
+                                    _CategoryVariable* thisC = (_CategoryVariable*)LocateVar(indexCat.lData[j]);
+                                    mxDim *= thisC->GetNumberOfIntervals();
+                                }
+
+                            mxIndex *= mxDim;
+
+                            for   (long kk = 0; kk<bl; kk++) {
+                                result->theData[currentOffset+kk] += mxIndex;
+                            }
+
+                        }
+                        currentOffset+=blockSize;
+                    }
+                }
+            }
+        DoneComputing();
+        DeleteObject (cache);
+        DeleteObject (scalerCache);
+        if (remap) {
+            _Matrix * retObj = RemapMatrix(result, whichParts);
+            DeleteObject (result);
+            return retObj;
+        }
+        return result;
+    } else {
+        long maxPartSize = 0;
+        for (long whichPart=0; whichPart<whichParts.lLength; whichPart++) {
+            long myWidth        = BlockLength(whichParts.lData[whichPart]);
+            maxPartSize         = MAX (maxPartSize,myWidth);
+        }
+
+        _GrowingVector  allScalers (false);
+        _SimpleList     scalers;
+        // allocate a buffer big enough to store the matrix for each block
+
+        _Matrix         *result = new _Matrix (hDim,vDim,false,true),
+        *holder = new _Matrix (hDim, maxPartSize, false, true);
+
+        maxPartSize = 0; // reused as a shift index
+
+        for (long whichPart=0; whichPart<whichParts.lLength; whichPart++) {
+            PopulateConditionalProbabilities (whichParts.lData[whichPart],
+                                              _hyphyLFConditionProbsScaledMatrixMode,
+                                              holder->theData,
+                                              scalers);
+
+            allScalers << scalers;
+            long        thisBlockSiteCount = BlockLength(whichParts.lData[whichPart]);
+            result->CopyABlock (holder, 0, maxPartSize, ((_SimpleList*)(*(_List*)categoryTraversalTemplate(whichParts.lData[whichPart]))(1))->Element(-1), thisBlockSiteCount);
+            maxPartSize += thisBlockSiteCount;
+        }
+        DoneComputing   ();
+        DeleteObject    (holder);
+
+        if (remap) {
+            if (storageID) {
+                _Matrix * remappedCorrections = RemapMatrix(&allScalers, whichParts);
+                _String   scalerID            = (*storageID) & categoryMatrixScalers;
+                CheckReceptacleAndStore (&scalerID, empty, false, remappedCorrections, false);
+                scalerID = (*storageID) & categoryLogMultiplier;
+                CheckReceptacleAndStore (&scalerID, empty, false, new _Constant(_logLFScaler), false);
+            }
+
+            holder          = RemapMatrix(result, whichParts);
+            DeleteObject    (result);
+            return          holder;
+        } else {
+            return result;
+        }
+    }
+    return nil;
+}
+
+//_______________________________________________________________________________________
+long    _LikelihoodFunction::PartitionLengths       (char runMode,  _SimpleList const * filter)
+{
+    long maxDim = 0;
+
+    for (long i=0; i<(filter?filter->lLength:theTrees.lLength); i++) {
+        long bl = BlockLength (filter?filter->lData[i]:i);
+        if (runMode == 0) {
+            maxDim = MAX (maxDim, bl);
+        } else {
+            maxDim += bl;
+        }
+    }
+
+    return maxDim;
+}
+
+
+//_______________________________________________________________________________________
+void    _LikelihoodFunction::AllocateSiteResults        (void)
+{
+    long dim            = PartitionLengths(0),
+         catSpan       = TotalRateClassesForAPartition(-1,1) + 1;
+
+    siteResults         = (_Matrix*)checkPointer(new _Matrix (dim,catSpan,false,true));
+    siteScalerBuffer.Populate (dim,0,0);
+}
+
+//_______________________________________________________________________________________
+void    _LikelihoodFunction::ZeroSiteResults        (void)
+{
+    if (siteResults) {
+        long upperLimit = siteResults->GetSize();
+        for (long k=0; k<upperLimit; k++) {
+            siteResults->theData[k] = 0;
+        }
+        siteScalerBuffer.Populate (upperLimit,0,0);
+    }
+}
+
+
+//_______________________________________________________________________________________
+
+#ifndef __HYPHYMPI__
+bool      _LikelihoodFunction::SendOffToMPI       (long)
+{
+    return false;
+#else
+bool      _LikelihoodFunction::SendOffToMPI       (long index)
+// dispatch an MPI task to node 'index+1'
+{
+    bool                sendToSlave = (computationalResults.GetSize() < parallelOptimizerTasks.lLength);
+    _SimpleList     *   slaveParams = (_SimpleList*)parallelOptimizerTasks(index);
+
+    for (long varID = 0; varID < slaveParams->lLength; varID++) {
+        _Variable * aVar = LocateVar (slaveParams->lData[varID]);
+        if (aVar->IsIndependent()) {
+            varTransferMatrix.theData[varID] = aVar->Value();
+        } else {
+            varTransferMatrix.theData[varID] = aVar->Compute()->Value();
+        }
+
+        //printf ("%s => %g\n", aVar->GetName()->sData, varTransferMatrix.theData[varID]);
+        sendToSlave = sendToSlave || aVar->HasChanged();
+    }
+
+    if (sendToSlave) {
+        ReportMPIError(MPI_Send(varTransferMatrix.theData, slaveParams->lLength, MPI_DOUBLE, index+1 , HYPHY_MPI_VARS_TAG, MPI_COMM_WORLD),true);
+    }
+    return sendToSlave;
+
+
+#endif //__HYPHYMPI__
+
+}
+
+
+//_______________________________________________________________________________________
+
+bool    _LikelihoodFunction::PreCompute         (void)
+{
+
+    useGlobalUpdateFlag = true;
+    // mod 20060125 to only update large globals once
+    unsigned long i = 0;
+
+    _SimpleList * arrayToCheck = nonConstantDep?nonConstantDep:&indexDep;
+
+    for (; i < arrayToCheck->lLength; i++) {
+        _Variable* cornholio = LocateVar(arrayToCheck->lData[i]);
+        if (!cornholio->IsValueInBounds(((_Constant*) cornholio->Compute())->Value())){
+            break;
+        }
+    }
+
+    useGlobalUpdateFlag = false;
+    // mod 20060125 to only update large globals once
+
+    for (unsigned long j=0; j<arrayToCheck->lLength; j++) {
+        _Variable* cornholio = LocateVar(arrayToCheck->lData[j]);
+        if (cornholio->varFlags&HY_DEP_V_COMPUTED) {
+            cornholio->varFlags -= HY_DEP_V_COMPUTED;
+        }
+    }
+
+    return (i==arrayToCheck->lLength);
+}
+
+
+//_______________________________________________________________________________________
+
+void    _LikelihoodFunction::PostCompute        (void)
+{
+    _SimpleList * arrayToCheck = nonConstantDep?nonConstantDep:&indexDep;
+
+    //useGlobalUpdateFlag = true;
+    for (unsigned long i=0; i<arrayToCheck->lLength; i++)
+        //LocateVar (indexDep.lData[i])->PostMarkChanged();
+    {
+        LocateVar (arrayToCheck->lData[i])->Compute();
+    }
+    //useGlobalUpdateFlag = false;
+    // mod 20060125 comment out the compute loop; seems redundant
+    {
+        for (unsigned long i=0; i<indexInd.lLength; i++) {
+            LocateVar (indexInd.lData[i])->MarkDone();
+        }
+    }
+}
+
+
+
+//_______________________________________________________________________________________
+
+void    _LikelihoodFunction::ComputeBlockForTemplate        (long i, bool force)
+{
+    long          blockWidth = bySiteResults->GetVDim();
+    _Parameter   * resStore  = bySiteResults->theData+i*blockWidth;
+
+    ComputeSiteLikelihoodsForABlock (i,bySiteResults->theData+i*blockWidth,*(_SimpleList*)partScalingCache(i));
+    if (! usedCachedResults) {
+        long    *   siteCorrectors  = ((_SimpleList**)siteCorrections.lData)[i]->lData,
+                    upto           = ((_SimpleList**)siteCorrections.lData)[i]->lLength;
+        for (long s = 0; s < upto; s++) {
+            resStore[s] *= acquireScalerMultiplier(siteCorrectors[s]);
+        }
+    }
+
+    if (force || !usedCachedResults)
+        // remap compressed sites to full length
+    {
+        ComputeBlockForTemplate2 (i, resStore, resStore, blockWidth);
+    }
+}
+
+
+//_______________________________________________________________________________________
+
+void    _LikelihoodFunction::ComputeBlockForTemplate2       (long i, _Parameter* resTo, _Parameter* resFrom, long blockWidth)
+{
+    _DataSetFilter      *df = ((_DataSetFilter*)dataSetFilterList(theDataFilters.lData[i]));
+    long*               dupMap = df->duplicateMap.lData,
+                        dupL   = df->duplicateMap.lLength;
+
+    if (resTo == resFrom) {
+        _Matrix             temp (1,blockWidth,false,true);
+        for (long k1 = 0; k1 < dupL; k1++) {
+            temp.theData[k1] = resFrom[dupMap[k1]];
+        }
+
+        for (long k2 = 0; k2< dupL; k2++) {
+            resTo[k2] = temp.theData[k2];
+        }
+
+        for (long k3 = dupL; k3 < blockWidth; k3++) {
+            resTo[k3] = 1.;
+        }
+    } else {
+        for (long k1 = 0; k1 < dupL; k1++) {
+            resTo[k1] = resFrom[dupMap[k1]];
+        }
+
+        for (long k3 = dupL; k3 < blockWidth; k3++) {
+            resTo[k3] = 1.;
+        }
+    }
+}
+
+//_______________________________________________________________________________________
+
+_Parameter  _LikelihoodFunction::Compute        (void)
+/*
+    code cleanup SLKP: 20090317
+
+    todo: need to ensure that partitions that are changed between calls
+          are properly identified
+
+          in prepare to compute calls, perhaps set up a map of
+          independent variable ID -> partition/class pair
+*/
+{
+
+    _Parameter result = 0.;
+
+    if (!PreCompute()) {
+        return -A_LARGE_NUMBER;
+    }
+
+    /* GUI flag to verify whether MLEs have been altered
+       after last optimization
+     */
+
+    if (!isInOptimize && hasBeenOptimized)
+        for (unsigned long i=0; i<indexInd.lLength; i++)
+            if (LocateVar (indexInd.lData[i])->HasChanged()) {
+                hasBeenOptimized = false;
+                break;
+            }
+
+    /*  compute modes:
+
+            0. need only log-likelihood values for each partition; the likelihood function itself
+              is computed by summing individual partition log-likelihoods
+
+            1. need likelihoods by pattern; for each partition a vector of likelihoods and
+              a vector of scaling parameters is returned
+
+            2. need conditional likelihoods by pattern; for each partition a matrix of conditional
+              likelihoods (site/rate class pairing) is returned along with a vector of scaling
+              factors
+
+            3. need log-likelihoods by block: for each partition, the log-likelihood value is
+              returned
+
+            4. MPI compute mode: independent partitions
+    */
+
+    char       computeMode = 0;
+    if        (computingTemplate) {
+        if (templateKind > _hyphyLFComputationalTemplateByPartition) {
+            computeMode = 2;
+        } else if (templateKind == _hyphyLFComputationalTemplateByPartition) {
+            computeMode = 3;
+        } else {
+            computeMode = 1;
+        }
+
+        /*
+         write out matrices of conditional likelihoods for each partition
+         (into SITE_LIKELIHOODS_0, SITE_LIKELIHOODS_1 etc)
+         as well as site scaling factors
+         (into SITE_LIKELIHOODS_0.scalers, SITE_LIKELIHOODS_1.scalers ...)
+         */
+
+    }
+
+#ifdef __HYPHYMPI__
+    if ((hyphyMPIOptimizerMode ==  _hyphyLFMPIModePartitions || hyphyMPIOptimizerMode ==  _hyphyLFMPIModeAuto) &&   _hy_mpi_node_rank == 0) {
+        computeMode = 4;
+    }
+#endif
+
+    bool done = false;
+#ifdef _UBER_VERBOSE_LF_DEBUG
+    fprintf (stderr, "\n*** Likelihood function evaluation %ld ***\n", likeFuncEvalCallCount+1);
+    for (unsigned long i=0; i<indexInd.lLength; i++) {
+        _Variable *v = LocateVar (indexInd.lData[i]);
+        if (v->HasChanged()) {
+          fprintf (stderr, "[CHANGED] ");
+        }
+        fprintf (stderr, "%s = %15.12g\n", v->GetName()->sData, v->theValue);
+    }
+#endif
+    if (computeMode == 0 || computeMode == 3) {
+        _Matrix     * blockMatrix = nil;
+        if (computeMode == 3) {
+            blockWiseVar->SetValue      (new _Matrix (theTrees.lLength,1,false,true), false);
+            blockMatrix = (_Matrix*)blockWiseVar->GetValue();
+
+        }
+        for (unsigned long partID=0; partID<theTrees.lLength; partID++) {
+            if (blockDependancies.lData[partID])
+                // has category variables
+            {
+                if ( computationalResults.GetUsed()<=partID || HasBlockChanged(partID))
+                    // first time computing or partition requires updating
+                {
+                    /* TODO: add HMM and constant on partition test
+                       Roll into ComputeSiteLikelihoodsForABlock and SumUpSiteLikelihoods?
+                    */
+
+#ifdef __HYPHYMPI__
+                    if (_hy_mpi_node_rank == 0) {
+                        ComputeSiteLikelihoodsForABlock    (partID, siteResults->theData, siteScalerBuffer, -1, nil, hyphyMPIOptimizerMode);
+                    } else
+#endif
+                        ComputeSiteLikelihoodsForABlock    (partID, siteResults->theData, siteScalerBuffer);
+
+#ifdef _UBER_VERBOSE_LF_DEBUG
+                    fprintf (stderr, "Did compute %g\n", result);
+#endif
+                    _Parameter                       blockResult = SumUpSiteLikelihoods (partID, siteResults->theData, siteScalerBuffer);
+                    UpdateBlockResult               (partID, blockResult);
+                    if (blockMatrix) {
+                        blockMatrix->theData[partID] = blockResult;
+                    } else {
+                        result += blockResult;
+                    }
+                } else {
+                    if (blockMatrix) {
+                        blockMatrix->theData[partID] =  computationalResults.theData[partID];
+                    }  else {
+                        result += computationalResults.theData[partID];
+                    }
+                }
+            } else {
+                _Parameter  blockResult =  ComputeBlock (partID);
+                if (blockMatrix) {
+                    blockMatrix->theData[partID] = blockResult;
+                } else {
+                    result += blockResult;
+                }
+                UpdateBlockResult       (partID, blockResult);
+            }
+
+        }
+        if (blockMatrix) {
+            result = computingTemplate->Compute()->Value();
+        }
+        done = true;
+    } else if (computeMode == 1)
+        // handle _hyphyLFComputationalTemplateBySite
+    {
+        long    blockWidth = bySiteResults->GetVDim();
+
+#ifdef __HYPHYMPI__
+        if (hyphyMPIOptimizerMode == _hyphyLFMPIModeSiteTemplate && _hy_mpi_node_rank == 0) {
+            long    totalSent = 0,
+                    blockPatternSize = PartitionLengths (0);
+            for (long blockID = 0; blockID < parallelOptimizerTasks.lLength; blockID ++) {
+                bool sendToSlave = SendOffToMPI (blockID);
+                if (sendToSlave) {
+                    //printf ("[SEND]: %d\n", blockID, "\n");
+                    totalSent++;
+                }
+                /*
+                 else
+                    for (long k = 0; k < blockPatternSize; k++)
+                        printf ("[%d] %d %g %d\n", blockID, k, (bySiteResults->theData + blockID*theTrees.lLength)[k],  ((_SimpleList*)partScalingCache(blockID))->lData[k]);
+                */
+            }
+
+            while (totalSent) {
+                MPI_Status      status;
+
+                ReportMPIError  (MPI_Recv (bySiteResults->theData + blockWidth*theTrees.lLength, 2*blockPatternSize, MPI_DOUBLE, MPI_ANY_SOURCE , HYPHY_MPI_DATA_TAG, MPI_COMM_WORLD,&status),true);
+                long partID = status.MPI_SOURCE-1;
+
+                //printf ("[RECEIVE]: %d\n", partID, "\n");
+
+                _DataSetFilter * thisBlockFilter      = (_DataSetFilter*)dataSetFilterList (theDataFilters.lData[partID]);
+                thisBlockFilter->PatternToSiteMapper (bySiteResults->theData + blockWidth*theTrees.lLength, bySiteResults->theData + partID*blockWidth, 0,blockWidth);
+                _SimpleList* blockScalers = ((_SimpleList*)partScalingCache(partID));
+                thisBlockFilter->PatternToSiteMapper (bySiteResults->theData + (blockWidth*theTrees.lLength+blockPatternSize), blockScalers->lData, 2,blockWidth);
+                totalSent--;
+            }
+        } else
+#endif
+            for (long partID=0; partID<theTrees.lLength; partID++) {
+                ComputeSiteLikelihoodsForABlock      (partID, bySiteResults->theData + blockWidth*theTrees.lLength, *(_SimpleList*)partScalingCache(theTrees.lLength));
+                if (usedCachedResults == false) {
+                    _DataSetFilter * thisBlockFilter      = (_DataSetFilter*)dataSetFilterList (theDataFilters.lData[partID]);
+                    thisBlockFilter->PatternToSiteMapper (bySiteResults->theData + blockWidth*theTrees.lLength, bySiteResults->theData + partID*blockWidth, 0, blockWidth);
+                    thisBlockFilter->PatternToSiteMapper (((_SimpleList*)partScalingCache(theTrees.lLength))->lData, ((_SimpleList*)partScalingCache(partID))->lData, 1, blockWidth);
+                }
+            }
+
+
+        if (templateKind < 0) { // HMM
+            _CategoryVariable*hmmVar = (_CategoryVariable*)FetchVar (-templateKind-1);
+            _Matrix          *hmm    = hmmVar->ComputeHiddenMarkov(),
+                              *hmf    = hmmVar->ComputeHiddenMarkovFreqs();
+
+            result           = SumUpHiddenMarkov (bySiteResults->theData,
+                                                  *hmm,
+                                                  *hmf,
+                                                  nil,
+                                                  &partScalingCache,
+                                                  blockWidth
+                                                 );
+
+        } else {
+            // no need to remap; just process directly based on partition indices
+
+            siteArrayPopulated         = true;
+            siteWiseVar->SetValue      (new _Matrix (theTrees.lLength,1,false,true), false);
+            _SimpleList scalerCache    (theTrees.lLength,0,0);
+            _Matrix     * siteMatrix = (_Matrix*)siteWiseVar->GetValue();
+
+            for (long siteID = 0; siteID < blockWidth; siteID++) {
+                // pass one to determine scaling factors
+                long minScalingFactor = ((_SimpleList*)partScalingCache(0))->lData[siteID];
+                scalerCache.lData [0] = minScalingFactor;
+                for (long partID=1; partID<theTrees.lLength; partID++) {
+                    scalerCache.lData [partID] = ((_SimpleList*)partScalingCache(partID))->lData[siteID];
+                    if (minScalingFactor > scalerCache.lData [partID]) {
+                        minScalingFactor = scalerCache.lData [partID];
+                    }
+                }
+                for (long partID=0; partID<theTrees.lLength; partID++) {
+                    siteMatrix->theData[partID] = bySiteResults->theData[partID*blockWidth+siteID];
+                    long diff = scalerCache.lData[partID]-minScalingFactor;
+                    if (diff) {
+                        siteMatrix->theData[partID] *= acquireScalerMultiplier(diff);
+                    }
+                }
+
+
+
+                result += computingTemplate->Compute()->Value();
+                if (minScalingFactor) {
+                    result-=_logLFScaler*minScalingFactor;
+                }
+            }
+        }
+        done = true;
+    } else {
+        if (computeMode == 4) {
+#ifdef __HYPHYMPI__
+            if (_hy_mpi_node_rank == 0) {
+                long    totalSent = 0;
+                for (long blockID = 0; blockID < parallelOptimizerTasks.lLength; blockID ++) {
+                    bool sendToSlave = SendOffToMPI (blockID);
+                    if (sendToSlave) {
+                        totalSent++;
+                    } else {
+                        result += computationalResults[blockID];
+                    }
+                }
+
+                while (totalSent) {
+                    MPI_Status      status;
+                    _Parameter      blockRes;
+                    ReportMPIError(MPI_Recv (&blockRes, 1, MPI_DOUBLE, MPI_ANY_SOURCE , HYPHY_MPI_DATA_TAG, MPI_COMM_WORLD,&status),true);
+                    //printf ("Got %g from block %d \n", blockRes, status.MPI_SOURCE-1);
+
+                    result            += blockRes;
+                    UpdateBlockResult (status.MPI_SOURCE-1, blockRes);
+                    totalSent--;
+                }
+
+                done = true;
+            }
+#endif
+        }
+    }
+
+    if (done) {
+        likeFuncEvalCallCount ++;
+        evalsSinceLastSetup   ++;
+        PostCompute ();
+#ifdef _UBER_VERBOSE_LF_DEBUG
+        fprintf (stderr, "%g\n", result);
+#endif
+        if (isnan (result)) {
+            ReportWarning ("Likelihood function evaluation encountered a NaN (probably due to a parameterization error or a bug).");
+            return -A_LARGE_NUMBER;
+        }
+        
+        ComputeParameterPenalty ();
+
+        return result - smoothingPenalty;
+    }
+
+    WarnError ("Sorry; this likelihood feature has not yet been ported to the v2.0 LF engine in HyPhy");
+    return -A_LARGE_NUMBER;
+
+
+}
+//_______________________________________________________________________________________
+
+long        _LikelihoodFunction::BlockLength(long index)
+{
+    return ((_DataSetFilter*)dataSetFilterList(theDataFilters(index)))->NumberDistinctSites();
+}
+//_______________________________________________________________________________________
+
+bool        _LikelihoodFunction::HasBlockChanged(long index)
+{
+    return ((_TheTree*)LocateVar(theTrees(index)))->HasChanged2();
+}
+
+//_______________________________________________________________________________________
+
+void      _LikelihoodFunction::RecurseConstantOnPartition (long blockIndex, long index, long dependance, long highestIndex, _Parameter weight, _Matrix& cache)
+{
+    _CategoryVariable* thisC = (_CategoryVariable*)LocateVar(indexCat.lData[index]);
+    if (index<highestIndex) {
+        if ((!CheckNthBit(dependance,index))||thisC->IsHiddenMarkov()) {
+            RecurseCategory (blockIndex, index+1, dependance,highestIndex,weight);
+        } else {
+            thisC->Refresh();
+            long nI = thisC->GetNumberOfIntervals ();
+            offsetCounter *= nI;
+            for (long k = 0; k<nI; k++) {
+                thisC->SetIntervalValue(k);
+                RecurseConstantOnPartition(blockIndex,index+1,dependance, highestIndex,weight*thisC->GetIntervalWeight(k),cache);
+                categID+=offsetCounter/nI;
+            }
+            offsetCounter/=nI;
+            if (offsetCounter>1) {
+                categID-=nI*offsetCounter;
+            }
+        }
+    } else {
+        long        nI            = thisC->GetNumberOfIntervals (),
+                    currentOffset = BlockLength(blockIndex),
+                    hBit        = HighestBit(blockDependancies.lData[blockIndex]);
+
+        thisC->Refresh();
+
+        _Parameter* sR = siteResults->fastIndex();
+        _Matrix*    cws= thisC->GetWeights();
+
+        _DataSetFilter* df = ((_DataSetFilter*)dataSetFilterList(theDataFilters(blockIndex)));
+
+        for (long k = 0; k<nI; k++) {
+            thisC->SetIntervalValue(k,!k);
+
+            for   (long kk = 0; kk<currentOffset; kk++) {
+                sR[kk] = 0.0;
+            }
+
+            //sR -= currentOffset;
+
+            if (hBit>index) {
+                offsetCounter *= nI;
+                RecurseCategory (blockIndex,index+1,blockDependancies.lData[blockIndex],hBit,1);
+                offsetCounter /= nI;
+            } else {
+                ComputeBlock (blockIndex,sR);
+            }
+
+            _Parameter prod = 0.0;
+            {
+                for   (long kk = 0; kk<currentOffset; kk++,sR++) {
+                    prod +=  myLog (*sR)*df->theFrequencies.lData[kk];
+                }
+            }
+            prod += myLog (cws->theData[k]*weight);
+            cache.theData[categID] = prod;
+
+            categID+=offsetCounter;
+            sR -= currentOffset;
+        }
+
+        if (offsetCounter>1) {
+            categID-=nI*offsetCounter;
+        }
+    }
+}
+
+//_______________________________________________________________________________________
+
+void      _LikelihoodFunction::RecurseCategory(long blockIndex, long index, long dependance, long highestIndex, _Parameter weight
+#ifdef _SLKP_LFENGINE_REWRITE_
+        ,_SimpleList* siteMultipliers, char runMode, _Parameter *runStorage,
+        long branchIndex,              _SimpleList* branchValues
+#endif
+                                              )
+{
+    _CategoryVariable* thisC = (_CategoryVariable*)LocateVar(indexCat.lData[index]);
+    if (index<highestIndex) {
+        if ((!CheckNthBit(dependance,index))||thisC->IsHiddenMarkov())
+            RecurseCategory (blockIndex, index+1, dependance,highestIndex,weight
+#ifdef _SLKP_LFENGINE_REWRITE_
+                             ,siteMultipliers,runMode,runStorage
+#endif
+                            );
+        else {
+            thisC->Refresh();
+            long nI = thisC->GetNumberOfIntervals ();
+            offsetCounter *= nI;
+            for (long k = 0; k<nI; k++) {
+                thisC->SetIntervalValue(k);
+                RecurseCategory(blockIndex,index+1,dependance, highestIndex,weight*thisC->GetIntervalWeight(k)
+#ifdef _SLKP_LFENGINE_REWRITE_
+                                ,siteMultipliers,runMode,runStorage,branchIndex,branchValues
+#endif
+                               );
+                categID+=offsetCounter/nI;
+            }
+            offsetCounter/=nI;
+            if (offsetCounter>1) {
+                categID-=nI*offsetCounter;
+            }
+        }
+    } else {
+        if (thisC->IsHiddenMarkov()) {
+            if (offsetCounter == 1) { // this is the only categ for the block
+                ComputeBlock (blockIndex,siteResults->fastIndex());
+            }
+        } else {
+            long        hDim            = siteResults->GetHDim(),
+                        nI              = thisC->GetNumberOfIntervals (),
+                        currentOffset  = BlockLength(blockIndex);
+
+            thisC->Refresh();
+
+            _Parameter* sR  = siteResults->fastIndex();
+            _Matrix*    cws = thisC->GetWeights();
+
+#ifdef _SLKP_LFENGINE_REWRITE_
+            long    *   siteCorrectors  = ((_SimpleList**)siteCorrections.lData)[blockIndex]->lLength?
+                                          (((_SimpleList**)siteCorrections.lData)[blockIndex]->lData) + categID * currentOffset
+                                          :nil;
+#endif
+
+            for (long k = 0; k<nI; k++) {
+                thisC->SetIntervalValue     (k,!k);
+                ComputeBlock                (blockIndex,sR+hDim);
+                _Parameter                  localWeight = cws->theData[k]*weight ;
+#ifdef _SLKP_LFENGINE_REWRITE_
+                if (runMode == 1)
+                    // decide what is the most likely category assignment
+                {
+                    for (long r1 = 0, r2 = hDim; r1 < currentOffset; r1++,r2++) {
+                        bool doChange = false;
+                        if (siteCorrectors) {
+                            long scv = *siteCorrectors;
+
+                            if (scv < siteMultipliers->lData[r1]) { // this has a _smaller_ scaling factor
+                                _Parameter scaled = sR[r1]*acquireScalerMultiplier (siteMultipliers->lData[r1] - scv);
+                                if (sR[r2] > scaled) {
+                                    doChange = true;
+                                } else {
+                                    sR[r1] = scaled;
+                                }
+                                siteMultipliers->lData[r1] = scv;
+                            } else {
+                                if (scv > siteMultipliers->lData[r1]) { // this is a _larger_ scaling factor
+                                    sR[r2] *= acquireScalerMultiplier (scv - siteMultipliers->lData[r1]);
+                                }
+                                doChange = sR[r2] > sR[r1] && ! CheckEqual (sR[r2],sR[r1]);
+                            }
+
+                            siteCorrectors++;
+                        } else {
+                            doChange = sR[r2] > sR[r1] && ! CheckEqual (sR[r2],sR[r1]);
+                        }
+
+                        if (doChange) {
+                            sR[r1]         = sR[r2];
+                            runStorage[r1] = categID;
+                        }
+                    }
+                } else {
+                    /*if (runMode == 2)
+                    // write out conditional probs
+                    {
+                        for (long r1 = 0, r2 = hDim, r3 = categID*(hDim+columnShift); r1 < currentOffset; r1++,r2++,r3++)
+                        {
+                            if (siteCorrectors)
+                            {
+                                long scv = *siteCorrectors;
+                                if (scv < siteMultipliers->lData[r1]) // this has a _smaller_ scaling factor
+                                {
+                                    _Parameter scaled = acquireScalerMultiplier (siteMultipliers->lData[r1] - scv);
+                                    for (long z = r3-(hDim+columnShift); z >= 0; z-=(hDim+columnShift))
+                                        runStorage[z] *= scaled;
+                                    siteMultipliers->lData[r1] = scv;
+                                }
+                                else
+                                {
+                                    if (scv > siteMultipliers->lData[r1]) // this is a _larger_ scaling factor
+                                        sR[r2] *= acquireScalerMultiplier (scv - siteMultipliers->lData[r1]);
+                                }
+
+                                siteCorrectors++;
+                            }
+                            runStorage[r3] = sR[r2];
+                        }
+                    }
+                    else*/
+#endif
+                    for (long r1 = 0, r2 = hDim; r1 < currentOffset; r1++,r2++) {
+#ifdef _SLKP_LFENGINE_REWRITE_
+                        if (siteCorrectors) {
+                            long scv = *siteCorrectors;
+
+                            //if (likeFuncEvalCallCount == 43)
+                            //{
+                            //  printf ("catID %d site %d corrector %d (%d) value %g:%g\n", categID, r1, scv, siteMultipliers->lData[r1], sR[r2], sR[r2]*acquireScalerMultiplier (scv-siteMultipliers->lData[r1] ));
+                            //}
+
+                            if (scv < siteMultipliers->lData[r1]) { // this has a _smaller_ scaling factor
+                                sR[r1] = localWeight * sR[r2] + sR[r1] * acquireScalerMultiplier (siteMultipliers->lData[r1] - scv);
+                                siteMultipliers->lData[r1] = scv;
+                            } else {
+                                if (scv > siteMultipliers->lData[r1]) { // this is a _larger_ scaling factor
+                                    sR[r1] += localWeight * sR[r2] * acquireScalerMultiplier (scv - siteMultipliers->lData[r1]);
+                                } else { // same scaling factors
+                                    sR[r1] += localWeight * sR[r2];
+                                }
+                            }
+
+                            siteCorrectors++;
+                        } else
+#endif
+                            sR[r1] += localWeight * sR[r2];
+
+                    }
+#ifdef _SLKP_LFENGINE_REWRITE_
+                }
+#endif
+                categID+=offsetCounter;
+#ifdef _SLKP_LFENGINE_REWRITE_
+                if (offsetCounter > 1) {
+                    siteCorrectors += (offsetCounter-1) * currentOffset;
+                }
+#endif
+            }
+            if (offsetCounter>1) {
+                categID-=nI*offsetCounter;
+            }
+        }
+    }
+}
+
+//_______________________________________________________________________________________
+void        _LikelihoodFunction::RandomizeList (_SimpleList& orderList, long elements)
+{
+    long divisor = RAND_MAX_32/elements-1,i,n;
+    if (divisor<=0) {
+        divisor = 1;
+    }
+    orderList.Clear();
+    for (i=0; i<elements; i++) {
+        orderList<<-1;
+    }
+    for (i=0; i<elements; i++) {
+        do {
+            n = genrand_int32()/divisor;
+            if (n>elements) {
+                n = elements;
+            }
+        } while (orderList(n)>=0);
+        orderList[n]=i;
+    }
+}
+
+//_______________________________________________________________________________________
+void        _LikelihoodFunction::CheckFibonacci (_Parameter shrinkFactor)
+{
+    long n=Fibonacci.lLength-1;
+    if (n<0) {
+        Fibonacci<<1;
+        Fibonacci<<1;
+        n+=2;
+    }
+    while (Fibonacci(n)<shrinkFactor) {
+        Fibonacci<<Fibonacci(n)+Fibonacci(n-1);
+        n++;
+    }
+}
+//_______________________________________________________________________________________
+long     _LikelihoodFunction::HasPrecisionBeenAchieved (_Parameter funcVal, bool cleanup)
+{
+    static _Parameter lastValue = -A_LARGE_NUMBER, callcount = likeFuncEvalCallCount;
+    static _Parameter* oldVarValues = nil;
+
+    if (cleanup) {
+        lastValue = 0;
+        callcount = likeFuncEvalCallCount;
+        if (oldVarValues) {
+            delete [] oldVarValues;
+        }
+        oldVarValues = nil;
+        return 0;
+    }
+    if (funcVal >= A_LARGE_NUMBER) { // reset
+        lastValue = 0;
+        callcount = likeFuncEvalCallCount;
+        if (oldVarValues) {
+            delete oldVarValues;
+        }
+        oldVarValues = new _Parameter[indexInd.lLength];
+        checkPointer(oldVarValues);
+        for (long i=indexInd.lLength-1; i>=0; i--) {
+            oldVarValues[i]=0.0;
+        }
+        return 0;
+    }
+    if (likeFuncEvalCallCount-callcount>maxItersPerVar)
+        // too many computations - return "precision has been reached and spit a warning
+    {
+        _String warningMsg ("Optimization routines returning before requested precision goal met. The maximum iteration number specified by MAXIMUM_ITERATIONS_PER_VARIABLE has been reached");
+        ReportWarning (warningMsg);
+        // return precision reached
+        warningMsg = _String("Last absolute error in ln-lik function was:")&_String ((_Parameter)fabs(funcVal-lastValue));
+        ReportWarning (warningMsg);
+        if (optimizationPrecMethod>0.5) { // return precision in parameters
+            long maxIndex;
+            _Parameter average = 0.0, max = 0.0, vVal;
+            for (long i=0; i<=indexInd.lLength-1; i--) {
+                vVal = fabs(GetIthIndependent(i)-oldVarValues[i]);
+                if (vVal>max) {
+                    max = vVal;
+                    maxIndex = i;
+                }
+                average+=vVal;
+            }
+            warningMsg = _String("Average last step = ")&_String(average/indexInd.lLength)&
+                         ", with maximum occurring at "&(*LocateVar(indexInd(maxIndex))->GetName())&_String(" =")&_String (max);
+            ReportWarning (warningMsg);
+        }
+        return 1;
+    } else { // check whether the precision has been reached
+        bool done = false;
+        if (optimizationPrecMethod<0.5) {
+            if (relPrec>0.5) {
+                if (fabs((funcVal-lastValue)/funcVal)<precision) {
+                    done = true;
+                } else {
+                    lastValue = funcVal;
+                }
+            } else {
+                if (fabs(funcVal-lastValue)<precision) {
+                    done = true;
+                } else {
+                    lastValue = funcVal;
+                }
+            }
+            if (done) {
+                long maxIndex = 0;
+                _Parameter average = 0.0, max = 0.0, vVal;
+                for (long i=0; i<=indexInd.lLength-1; i--) {
+                    vVal = fabs(GetIthIndependent(i)-oldVarValues[i]);
+                    if (vVal>max) {
+                        max = vVal;
+                        maxIndex = i;
+                    }
+                    average+=vVal;
+                }
+                _String warningMsg = _String("Average last step = ")&_String((_Parameter)(average/indexInd.lLength))
+                                     &", with maximum occurring at "&(*LocateVar(indexInd(maxIndex))->GetName())&_String("=")&_String (max);
+                ReportWarning (warningMsg);
+                return 1;
+            }
+
+            for (long i=0; i<=indexInd.lLength-1; i++) {
+                _Variable* currentVar = LocateVar(indexInd[i]);
+                oldVarValues[i]=currentVar->Value();
+            }
+
+            return 0;
+        } else {
+            done = true;
+            if (relPrec>0.5) {
+                for (long i=0; i<=indexInd.lLength-1; i++) {
+                    _Variable* currentVar = LocateVar(indexInd[i]);
+                    if (done) {
+                        done = fabs ((currentVar->Value()-oldVarValues[i])/currentVar->Value())<precision;
+                    }
+                    oldVarValues[i]=currentVar->Value();
+                }
+            } else {
+                for (long i=0; i<=indexInd.lLength-1; i++) {
+                    _Variable* currentVar = LocateVar(indexInd[i]);
+                    if (done) {
+                        done = fabs (currentVar->Value()-oldVarValues[i])<precision;
+                    }
+                    oldVarValues[i]=currentVar->Value();
+                }
+            }
+            if (done) {
+                _String warningMsg = _String("Last absolute error in ln-lik was:")&_String ((_Parameter)fabs(lastValue-funcVal));
+                ReportWarning(warningMsg);
+                return 1;
+            }
+            lastValue = funcVal;
+            return 0;
+        }
+    }
+    return 0;
+}
+//_______________________________________________________________________________________
+
+void    _LikelihoodFunction::CheckDependentBounds (void)
+// this function makes sure that a constrained optimization starts within the domain
+// of allowed parameter values
+{
+    if  (!indexDep.lLength) { // nothing to do here
+        return;
+    }
+
+    long index,
+         i,
+         j,
+         badConstraint;
+
+    _Matrix currentValues (indexDep.lLength,1,false,true),
+            lowerBounds   (indexDep.lLength,1,false,true),
+            upperBounds   (indexDep.lLength,1,false,true);
+
+    bool    ohWell = false;
+
+    _Variable*  cornholio;
+    _SimpleList badIndices; //indices of dependent variables which are out of bounds
+
+    nonConstantDep = new _SimpleList;
+
+    for (index = 0; index<indexDep.lLength && !ohWell; index++)
+        // check whether any of the dependent variables are out of bounds
+    {
+        cornholio                       =   GetIthDependentVar(index);
+
+        currentValues.theData[index]    =   cornholio->Compute()->Value();
+        lowerBounds.theData[index]      =   cornholio->GetLowerBound();
+        upperBounds.theData[index]      =   cornholio->GetUpperBound();
+
+        bool badApple = currentValues.theData[index]<lowerBounds.theData[index] || currentValues.theData[index]>upperBounds.theData[index];
+        if (badApple) {
+            badIndices<<index;
+        }
+
+        if (cornholio->IsConstant()) {
+            badConstraint = indexDep.lData[index];
+            ohWell = badApple;
+            j      = index; // for error reporting at the bottom
+        } else {
+            (*nonConstantDep) << indexDep.lData[index];
+        }
+    }
+
+    if (badIndices.lLength && !ohWell) // one of the variables has left its prescribed bounds
+        // build a table of dependancies
+    {
+        _Matrix     dependancies (indexDep.lLength,indexInd.lLength,true,true);
+
+        // element (i,j) represents the dependance of i-th dep var on the j-th ind var
+        // 0 - no dep,
+        // 1 -> monotone increase,
+        // -1 -> monotone decrease
+
+        for (index = 0; index<indexInd.lLength; index++) {
+            _Parameter          temp = GetIthIndependent(index);
+            SetIthIndependent  (index,temp*1.000000000001);
+
+            for (j=indexDep.lLength-1; j>-1; j--) {
+                _Parameter temp1 = GetIthDependent(j);
+                if (temp1>currentValues[j]) {
+                    dependancies.Store(j,index,1.0);
+                } else if (temp1<currentValues[j]) {
+                    dependancies.Store(j,index,-1.0);
+                }
+            }
+            SetIthIndependent (index,temp);
+        }
+
+        // now we can go through the dependant variables which are out of bounds one at a time
+        // and attempt to move them back in.
+        for (index = badIndices.lLength-1; index>-1; index--) {
+            long       badVarIndex      = badIndices.lData[index];
+            _Parameter temp             = GetIthDependent(badVarIndex);
+
+            currentValues[badVarIndex]  = temp;
+
+            bool              tooLow = temp<lowerBounds[badVarIndex];
+
+            // look for an independent which will increase (if tooLow) or decrease (too high) this variable
+            // w/o decreasing the others
+            // this is equivalent to searching for the matrix of dependancies for a column w/o negative
+            // entries,such that row "index" has "1" in it
+
+            _Parameter correlation = 0.;
+
+            for (j = indexInd.lLength-1; j>-1; j--) {
+                if (correlation == dependancies(badVarIndex,j)) {
+                    for (i=0; i<badIndices.lLength; i++) {
+                        _Parameter depIJ = dependancies(badIndices.lData[i],j);
+                        if (depIJ && depIJ != correlation) {
+                            break;
+                        }
+                    }
+                    if (i==indexInd.lLength) {
+                        break;    //match found
+                    }
+                }
+
+            }
+
+            if (j==-1) { // no suitable variable found - try random permutations
+                break;
+            }
+
+            // now nudge the independent variable (indexed by "j") upward (or downward),
+            // until var badVarIndex is within limits again
+            // try this by a trivial bisection
+
+            _Parameter left         ,
+                       right      ,
+                       middle,
+                       lb         = tooLow?lowerBounds[badVarIndex]:upperBounds[badVarIndex];
+
+            bool    decrement = (correlation < 0. && tooLow) || (correlation > 0. && !tooLow);
+
+            if (decrement) { // need to decrement "j"
+                left  = GetIthIndependentBound(j,true);
+                right = GetIthIndependent(j);
+            } else { // need to increment "j"
+                right = GetIthIndependentBound(j,false);
+                left  = GetIthIndependent(j);
+            }
+
+
+            temp=right-left>0.001?
+                 0.00001:
+                 (right-left)*0.0001;
+
+            while (right-left>temp) {
+                middle                  = (left+right)/2.0;
+                SetIthIndependent         (j,middle);
+                _Parameter                adjusted = GetIthDependent          (badVarIndex);
+                if ((tooLow && adjusted > lb) || (!tooLow && adjusted < lb)) { // in range
+                    if (decrement) {
+                        left = middle;
+                    } else {
+                        right = middle;
+                    }
+
+                } else {
+                    if (decrement) {
+                        right = middle;
+                    } else {
+                        left = middle;
+                    }
+                }
+            }
+            // take "right" as the new value for the ind
+            SetIthIndependent(j,decrement?left:right);
+        }
+
+        // now we check to see whether all is well
+
+        if (index==-1) {
+            // verify that all dependent vars are now within allowed domains
+            for (index = indexDep.lLength-1; index>-1; index--)
+                // check whether any of the dependent variables are out of bounds
+            {
+                currentValues[index]=GetIthDependent(index);
+                if (currentValues[index]<lowerBounds[index] || currentValues[index]>upperBounds[index]) {
+                    break;
+                }
+            }
+            if (index == -1) { // we did it!
+                return;
+            }
+        }
+
+        // if we get here, then some of the dependent variables couldn't be moved withing bound
+        // we will try 10,000 random assignments of independent variables
+        // hoping that one of them will do the trick
+        // reuse the first two rows of "dependancies" to store
+        // the lower and upper bounds for the dependent vars
+
+        for (index = 0; index<indexInd.lLength; index++) {
+            dependancies.Store (0,index,GetIthIndependentBound (index,true));
+            dependancies.Store (1,index,(GetIthIndependentBound (index,false)>10?10:GetIthIndependentBound (index,true))-dependancies(0,index));
+        }
+
+        for (i=0; i<10000; i++) {
+            for (index = 0; index < indexInd.lLength; index++) {
+                SetIthIndependent   (index,dependancies(0,index)+genrand_real2()*dependancies(1,index));
+                for (j = 0; j < nonConstantDep->lLength; j++)
+                    // check whether any of the dependent variables are out of bounds
+                {
+                    currentValues.theData[j]    =   LocateVar(nonConstantDep->lData[j])->Compute()->Value();
+                    if (currentValues.theData[j]<lowerBounds.theData[j] || currentValues.theData[j]>upperBounds.theData[j]) {
+                        badConstraint = nonConstantDep->lData[j];
+                        break;
+                    }
+                }
+                if (j == nonConstantDep->lLength) {
+                    break;
+                }
+            }
+            if(index < indexInd.lLength) {
+                break;
+            }
+        }
+        ohWell = i==10000;
+    }
+    if (ohWell) {
+        cornholio              = LocateVar(badConstraint);
+
+        subNumericValues = 3;
+        _String         * cStr = (_String*)cornholio->GetFormulaString(),
+                          badX   = (*cornholio->GetName()) & ":=" & *cStr & " must be in [" & lowerBounds[j] & "," & upperBounds[j] &"]. Current value = " & currentValues[j] & ".";
+
+        subNumericValues = 0;
+        DeleteObject             (cStr);
+
+        WarnError(_String("Constrained optimization failed, since a starting point within the domain specified for the variables couldn't be found.\nSet it by hand, or check your constraints for compatibility.\nFailed constraint:")
+                  & badX);
+
+    }
+}
+//_______________________________________________________________________________________
+inline _Parameter sqr (_Parameter x)
+{
+    return x*x;
+}
+
+
+//_______________________________________________________________________________________
+void        _LikelihoodFunction::GetInitialValues (void)
+// compute pairwise distances for block index
+{
+    for (long index=0; index<theTrees.lLength; index++) {
+        _DataSetFilter* df = (_DataSetFilter*)dataSetFilterList(theDataFilters(index));
+        _TheTree *t        = (_TheTree*)LocateVar(theTrees.lData[index]);
+        long mDim          = df->NumberSpecies();
+
+        if (df->GetData()->GetTT()->IsStandardNucleotide() && df->IsNormalFilter() && mDim<150 && LocateVar(theProbabilities.lData[index])->IsIndependent()) {
+            // if not - use distance estimates
+
+            if (t->IsDegenerate()) {
+                continue;
+            }
+
+            long        branchCount=-1,
+                        i,
+                        j,
+                        k,
+                        m,
+                        eqCount=0;
+
+            _SimpleList history,
+                        history2;
+
+            _CalcNode*  dumpkopf = t->StepWiseTraversal(true);
+
+            bool two = false;
+
+            while (dumpkopf) {
+                branchCount++;
+                history.Clear();
+                {
+                    _AVLList hA (&history);
+                    dumpkopf->ScanForVariables(hA,hA);
+                    hA.ReorderList ();
+                }
+                if (history.lLength>=2) {
+                    two = true;
+                }
+                dumpkopf = t->StepWiseTraversal();
+            }
+
+            // first of all, construct the matrix of branch sums,
+            // which will be topology dependent
+            // the branches are associated with the node they terminate with
+            _Matrix  theSystem ((mDim-1)*mDim/2,branchCount,true,true), dichotomy (branchCount-mDim,mDim,true,true);
+            node<long>* theRoot = &t->GetRoot();
+            k = NodePathTraverser (history, theRoot);
+            while (k!=-1) {
+                for (m=history.lLength-1; m>=0; m--) {
+                    dichotomy[history.lData[m]*mDim+k]=1.0;
+                }
+                k = NodePathTraverser (history, (node<long>*)nil);
+            }
+
+            for (i=0; i<mDim-1; i++) {
+                for (j=i+1; j<mDim; j++) {
+                    theSystem.Store(eqCount,i,1.0);
+                    theSystem.Store(eqCount,j,1.0);
+                    for (k=0; k<branchCount-mDim; k++)
+                        if (dichotomy(k,i)!=dichotomy(k,j)) {
+                            theSystem.Store(eqCount,mDim+k,1.0);
+                        }
+                    eqCount++;
+                }
+            }
+
+            dichotomy.Clear();
+            _Matrix transversions (theSystem.GetHDim(),1,false,true),
+                    transitions   (theSystem.GetHDim(),1,false,true),
+                    jc (theSystem.GetHDim(),1,false,true),
+                    transpose(theSystem);
+
+            transpose.Transpose();
+            _Matrix AAst (transpose);
+            AAst*=theSystem;
+            _Matrix* LUSystem = (_Matrix*)AAst.LUDecompose();
+            if (!LUSystem) {
+                return;
+            }
+            // bingo - the system is now formulated
+            // now we build the right-hand sides.
+            AAst.Clear();
+            _Matrix *freq;
+            if (df->GetUnitLength()==1) {
+                freq = (_Matrix*)LocateVar(theProbabilities(index))->GetValue();
+            } else {
+                freq = df->HarvestFrequencies (1,1,false);
+            }
+
+            _Variable* cornholio;
+            _Matrix diffs (1,7,false,true);
+
+            long h = df->NumberSpecies();
+            // compute the universal frequency weights
+            _Parameter tmp,t2,
+                       cR = (*freq)[0]+(*freq)[2],
+                       cY = (*freq)[1]+(*freq)[3],
+                       c1=2*(*freq)[0]*(*freq)[2]/cR,
+                       c2=2*(*freq)[1]*(*freq)[3]/cY,
+                       c3=2*((*freq)[0]*(*freq)[2]*cY/cR
+                             +(*freq)[1]*(*freq)[3]*cR/cY), comps, fP = 1.0-sqr((*freq)[0])-sqr((*freq)[1])-sqr((*freq)[2])-sqr((*freq)[3]);
+
+            if (df->GetUnitLength()>1) {
+                DeleteObject(freq);
+            }
+
+            eqCount = 0;
+            for (i=0; i<h-1; i++)
+                for (j=i+1; j<h; j++) {
+                    // Tamura - Nei distance formula
+                    df->ComputePairwiseDifferences (diffs,i,j) ;
+                    _Parameter Q = diffs.theData[1]+diffs.theData[3]+
+                                   diffs.theData[4]+diffs.theData[6],P1=diffs.theData[2],
+                                                                     P2=diffs.theData[5];
+                    comps = Q+P1+P2+diffs.theData[0];
+                    if (comps==0.0) {
+                        continue;
+                    }
+                    if (two) {
+                        Q/=comps;
+                        P1/=comps;
+                        P2/=comps;
+                        tmp = 1-Q/(2*cR*cY);
+                        if (tmp>0.0) {
+                            transversions[eqCount] = -2*cR*cY*log(tmp);
+                        } else {
+                            transversions[eqCount] = 200*cR*cY;
+                        }
+
+                        tmp = 1.0-1.0/c1*P1-.5/cR*Q;
+                        if (tmp>0.0) {
+                            t2 = -c1*log(tmp);
+                        } else {
+                            t2 = c1*100;
+                        }
+
+                        tmp = 1.0-1.0/c2*P2-.5/cY*Q;
+                        if (tmp>0.0) {
+                            t2 -= c2*log(tmp);
+                        } else {
+                            t2 += c2*100;
+                        }
+
+                        tmp = 1-.5/(cR*cY)*Q;
+                        if (tmp>0.0) {
+                            t2 += c3*log(tmp);
+                        } else {
+                            t2 += c3*100;
+                        }
+
+                        transitions[eqCount]= t2;
+                    }
+                    _Parameter P = (Q+P1+P2)/comps;
+                    P = 1.0-P/fP;
+                    if (P>0) {
+                        jc[eqCount]=-fP*log(P);
+                    } else {
+                        jc[eqCount]=20.0;
+                    }
+                    eqCount++;
+                }
+            //DeleteObject(diffs);
+
+            _Matrix *trstEst=nil,
+                     *trvrEst=nil,
+                      *jcEst=nil;
+
+            theSystem=transpose;
+            theSystem*=jc;
+            jc.Clear();
+            jcEst = (_Matrix*)LUSystem->LUSolve(&theSystem);
+            if (two) {
+                theSystem=transpose;
+                transpose*=transversions;
+                theSystem*=transitions;
+                transitions.Clear();
+                transversions.Clear();
+                trstEst = (_Matrix*)LUSystem->LUSolve(&theSystem);
+                trvrEst = (_Matrix*)LUSystem->LUSolve(&transpose);
+            }
+            DeleteObject (LUSystem);
+            // now that we have the estimates set the values of branch parameters
+            // the numbering is as follows
+            // the tips : 0 to # tips in the same order as in the tree string
+            // the branches: # tips + 1 to # tips + #branches
+            // within each branch:
+            // if there is one ind variable present: set to sum of both
+            // if two parameters present - set first one to transition and the 2nd one to transversion
+            // for the third parameter and afterwards use the average of the two
+            // produce a list of depthwise traversed nodes
+            dumpkopf = t->StepWiseTraversal (true);
+            dumpkopf = t->StepWiseTraversal(false);
+            eqCount = 0; // used to count tips
+            h = mDim; // used to count internal nodes
+
+            while (dumpkopf) {
+                history.Clear();
+                history2.Clear();
+                {
+                    _AVLList h1 (&history),
+                             h2 (&history2);
+
+                    dumpkopf->ScanForVariables(h1,h2);
+
+                    h1.ReorderList();
+                    h2.ReorderList();
+                }
+                if (t->IsCurrentNodeATip()) {
+                    c3 = (*jcEst)[eqCount];
+                    if (two) {
+                        c1 = (*trstEst)[eqCount];
+                        c2 = (*trvrEst)[eqCount++];
+                    } else {
+                        eqCount++;
+                    }
+                } else {
+                    c3 = (*jcEst)[h];
+                    if (two) {
+                        c1 = (*trstEst)[h];
+                        c2 = (*trvrEst)[h++];
+                    } else {
+                        h++;
+                    }
+                }
+                if (history.lLength==1) {
+                    cornholio = LocateVar(history.lData[0]);
+                    if (!cornholio->HasChanged()) {
+                        ReportWarning(_String("Initial guess for ") & cornholio->GetName()->getStr() & " is " & (c3*.66667));
+                        cornholio->CheckAndSet (c3*.66667, true);
+                    }
+                } else if (history.lLength>=2) {
+                    cornholio = LocateVar(history.lData[0]);
+                    if (!cornholio->HasChanged()) {
+                        cornholio->CheckAndSet (c1, true);
+                    }
+                    cornholio = LocateVar(history.lData[1]);
+                    if (!cornholio->HasChanged()) {
+                        cornholio->CheckAndSet (c2, true);
+                    }
+                    c1 = (c1+c2)/2;
+                    for (i=2; i<history.lLength; i++) {
+                        cornholio = LocateVar(history.lData[i]);
+                        if (!cornholio->HasChanged()) {
+                            ReportWarning(_String("Initial guess for ") & cornholio->GetName()->getStr() & " is " & (c3*.66667));
+                            cornholio->CheckAndSet (c1, true);
+                        }
+                    }
+                }
+                dumpkopf = t->StepWiseTraversal(false);
+            }
+
+            DeleteObject(trstEst);
+            DeleteObject(trvrEst);
+            DeleteObject(jcEst);
+        } else {
+            _Parameter      initValue = 0.1;
+            checkParameter  (globalStartingPoint, initValue, 0.1);
+
+            _SimpleList     indeps;
+            _AVLList        iavl (&indeps);
+
+            t->ScanForVariables (iavl, iavl);
+
+            for (long vc = 0; vc < indeps.lLength; vc++) {
+                //char buf[512];
+                _Variable * localVar = LocateVar(indeps.lData[vc]);
+                if (localVar->IsIndependent() && !localVar->HasChanged() && !localVar->IsGlobal()) {
+                    localVar->CheckAndSet (initValue);
+                    //      snprintf (buf, sizeof(buf),"[PRESET]%s = %g\n", localVar->GetName()->sData, localVar->Compute()->Value());
+                }
+                //else
+                //  snprintf (buf, sizeof(buf),"[PRESET]%s = %g\n", localVar->GetName()->sData, localVar->Compute()->Value());
+                //BufferToConsole(buf);
+            }
+
+
+        }
+    }
+}
+//_______________________________________________________________________________________
+
+void        _LikelihoodFunction::SetReferenceNodes (void)
+{
+    _Parameter          cv;
+
+    checkParameter      (useDuplicateMatrixCaching, cv, 0.);
+
+    if (cv>0.5) {
+        _List               mappedNodes;
+        _SimpleList         mappedTo,
+                            canMap;
+
+        long                i;
+
+        for (i=0; i<theTrees.lLength; i++) {
+            _TheTree * cT = ((_TheTree*)(LocateVar(theTrees(i))));
+
+            _CalcNode * aNode = cT->DepthWiseTraversal (true);
+
+            while (aNode) {
+                long rV = aNode->CheckForReferenceNode ();
+                if (rV >= 0) {
+                    mappedNodes << aNode;
+                    mappedTo    << rV;
+                } else {
+                    canMap << aNode->GetAVariable();
+                }
+
+                aNode = cT->DepthWiseTraversal (false);
+            }
+        }
+
+        if (mappedNodes.lLength) {
+            canMap.Sort();
+            for (i=0; i<mappedNodes.lLength; i++) {
+                if (canMap.BinaryFind (mappedTo.lData[i])>=0) {
+                    _CalcNode * travNode = (_CalcNode*)mappedNodes(i);
+                    travNode->SetRefNode (mappedTo.lData[i]);
+                    ((_CalcNode*)LocateVar(mappedTo.lData[i]))->AddRefNode();
+                    _String msg = _String ("Matrix for node ") & travNode->GetName()->getStr() & " mapped to " &
+                                  LocateVar(mappedTo.lData[i])->GetName()->getStr();
+                    ReportWarning (msg);
+                }
+            }
+        }
+    }
+}
+
+//_______________________________________________________________________________________
+
+void    _LikelihoodFunction::InitMPIOptimizer (void)
+{
+#ifdef __HYPHYMPI__
+    parallelOptimizerTasks.Clear();
+    transferrableVars  = 0;
+
+    int                      totalNodeCount = RetrieveMPICount (0);
+    _Parameter               aplf = 0.0;
+    checkParameter           (autoParalellizeLF,aplf,0.0);
+    hyphyMPIOptimizerMode  = round(aplf);
+
+    if (hyphyMPIOptimizerMode == _hyphyLFMPIModeREL)
+        // this is the branch to deal with multiple rate categories
+    {
+
+        long        cacheSize  = PartitionLengths (0),
+                    categCount = TotalRateClassesForAPartition(-1);
+
+        if (categCount == 0) {
+            ReportWarning ("[MPI] Cannot use REL MPI optimization mode on nodes likelihood functions without rate categories");
+            return;
+        }
+
+        if (totalNodeCount <= categCount) {
+            ReportWarning ("[MPI] Cannot initialize REL MPI optimization because there must be at least one more node than there are rate categories");
+            return;
+        }
+
+        if (theTrees.lLength != 1) {
+            ReportWarning ("[MPI] Cannot initialize REL MPI because it does not support likelihood functions with multiple partitions");
+            return;
+        }
+
+        if (computingTemplate != _hyphyLFComputationalTemplateNone)
+            // have a custom computing template
+        {
+            ReportWarning ("[MPI] Cannot initialize REL MPI because it does not support likelihood functions with computational templates");
+            return;
+        }
+
+        for (long i=0; i<indexCat.lLength; i++) {
+            _CategoryVariable* thisCV = (_CategoryVariable*) LocateVar (indexCat.lData[i]);
+            if (thisCV->IsHiddenMarkov()||thisCV->IsConstantOnPartition()) {
+                ReportWarning ("[MPI] Cannot initialize REL MPI because it does not support 'Hidden Markov' or 'Constant on Partition' category variables");
+                return;
+            }
+        }
+
+        ReportWarning    (_String ("[MPI] with:") & categCount & " categories on " & (long)totalNodeCount & " MPI nodes");
+
+        MPISwitchNodesToMPIMode (categCount);
+
+        _String          sLF (8192L, true);
+        SerializeLF      (sLF,_hyphyLFSerializeModeCategoryAsGlobal);
+        sLF.Finalize     ();
+        long             senderID = 0;
+
+        // sets up a de-categorized LF on each compute node
+        for (long i = 1; i<=categCount; i++) {
+            MPISendString (sLF,i);
+        }
+
+        for (long i = 1; i<=categCount; i++) {
+            _String     *mapString  = MPIRecvString (i,senderID);
+
+            // this will return the ';' separated string of partition variable names
+            _List       *varNames           = mapString->Tokenize (";"),
+                         slaveNodeMapL;
+            _AVLListX    slaveNodeMap       (&slaveNodeMapL);
+            slaveNodeMap.PopulateFromList   (*varNames);
+
+            _SimpleList varMap,
+                        map2;
+
+
+            for (long vi = 0; vi < indexCat.lLength; vi++) {
+                _Variable * catVar   = LocateVar(indexCat.lData[vi]);
+                _String * searchTerm = catVar->GetName();
+                long f = slaveNodeMap.Find (searchTerm);
+                if (f<0) {
+                    WarnError (_String ("[MPI] InitMPIOptimizer failed to map category var ") & *searchTerm & " for MPI node " & i &".\nHad the following variables\n" & _String((_String*)slaveNodeMap.toStr()));
+                    return ;
+                }
+                varMap << slaveNodeMap.GetXtra(f);
+                map2   << catVar->GetAVariable();
+                //printf ("%s->%d\n", searchTerm->sData, slaveNodeMap.GetXtra(f));
+            }
+
+
+            for (long vi = 0; vi < indexInd.lLength; vi++) {
+                _Variable * indepVar  = LocateVar(indexInd.lData[vi]);
+                _String  *  searchTerm = indepVar->GetName();
+                long    f = slaveNodeMap.Find (searchTerm);
+                if (f<0 && !indepVar->IsGlobal()) {
+                    WarnError (_String ("[MPI] InitMPIOptimizer failed to map independent variable ") & *searchTerm & " for MPI node " & i &".\nHad the following variables\n" & _String((_String*)slaveNodeMap.toStr()));
+                    return;
+                } else if (f>0) {
+                    f = slaveNodeMap.GetXtra(f);
+                }
+
+                if (f>=0) {
+                    varMap << f;
+                    map2   << indepVar->GetAVariable();
+                }
+            }
+
+            _SimpleList* mappedVariables = new _SimpleList (map2.lLength,0,0);
+
+            for (long vi = 0; vi < map2.lLength; vi++) {
+                mappedVariables->lData[varMap.lData[vi]] = map2.lData[vi];
+            }
+            //printf ("%d->%s\n", varMap.lData[vi], LocateVar( map2.lData[vi])->GetName()->sData);
+
+
+            parallelOptimizerTasks.AppendNewInstance (mappedVariables);
+
+            if (transferrableVars > 0) {
+                if (transferrableVars != mappedVariables->lLength) {
+                    FlagError (_String ("[MPI] InitMPIOptimizer failed: inconsistent variable counts between spawned instances."));
+                }
+            } else {
+                transferrableVars = mappedVariables->lLength;
+            }
+
+            DeleteObject (varNames);
+            DeleteObject (mapString);
+
+            //ReportWarning (((_String*)parallelOptimizerTasks.toStr())->getStr());
+        }
+
+        CreateMatrix (&varTransferMatrix, 1, transferrableVars, false, true, false);
+        CreateMatrix (&resTransferMatrix, 2, cacheSize, false, true, false);
+        ReportWarning(_String("[MPI] InitMPIOptimizer successful. ") & transferrableVars & " transferrable parameters, " & cacheSize & " sites to be cached.");
+    } else {
+        if (hyphyMPIOptimizerMode == _hyphyLFMPIModePartitions || hyphyMPIOptimizerMode == _hyphyLFMPIModeAuto || hyphyMPIOptimizerMode == _hyphyLFMPIModeSiteTemplate) {
+            int     slaveNodes = totalNodeCount-1;
+
+            if (slaveNodes < 2) {
+                ReportWarning("[MPI] cannot initialize a partition (or auto) optimizer on fewer than 3 MPI nodes");
+                return;
+            }
+
+
+
+            if (hyphyMPIOptimizerMode == _hyphyLFMPIModePartitions   && theDataFilters.lLength>1 ||
+                    hyphyMPIOptimizerMode == _hyphyLFMPIModeAuto         && theDataFilters.lLength == 1 ||
+                    hyphyMPIOptimizerMode == _hyphyLFMPIModeSiteTemplate && theDataFilters.lLength>1 && slaveNodes>=theDataFilters.lLength) {
+
+                if (hyphyMPIOptimizerMode == _hyphyLFMPIModeSiteTemplate) {
+                    if (templateKind != _hyphyLFComputationalTemplateBySite) {
+                        ReportWarning ("[MPI] By site template optimizer cannot work with a not by site computational template");
+                        return;
+                    }
+                } else if (templateKind != _hyphyLFComputationalTemplateNone) {
+                    ReportWarning ("[MPI] Partition/Auto Parallel Optimizer does not presently work with computational templates");
+                    return;
+                }
+
+
+                long             senderID = 0,
+                                 fromPart = 0,
+                                 toPart   = 0;
+
+                transferrableVars = 0;
+                _List             masterNodeMapL;
+                _AVLListX         masterNodeMap (&masterNodeMapL);
+
+                for (long k = 0; k < indexInd.lLength; k++) {
+                    masterNodeMap.Insert(LocateVar(indexInd.lData[k])->GetName()->makeDynamic(),indexInd.lData[k],false);
+                }
+                for (long k = 0; k < indexDep.lLength; k++) {
+                    masterNodeMap.Insert(LocateVar(indexDep.lData[k])->GetName()->makeDynamic(),indexDep.lData[k],false);
+                }
+
+                if ( hyphyMPIOptimizerMode == _hyphyLFMPIModeAuto ) {
+                    _SimpleList    * optimalOrder = (_SimpleList*)(optimalOrders (0));
+                    _DataSetFilter * aDSF         = (_DataSetFilter*)dataSetFilterList(theDataFilters.lData[0]);
+
+                    _Parameter    minPatternsPerNode = 0.;
+                    checkParameter (minimumSitesForAutoParallelize, minPatternsPerNode, 50.);
+
+                    // adjust slaveNodes as needed
+                    slaveNodes = MIN(slaveNodes, ceil(optimalOrder->lLength/minPatternsPerNode));
+
+                    long          sitesPerNode  =  optimalOrder->lLength / slaveNodes,
+                                  overFlow         =  optimalOrder->lLength % slaveNodes,
+                                  unitLength  =  aDSF->GetUnitLength();
+
+
+                    _SimpleList * dupMap    = &aDSF->duplicateMap,
+                                  * orOrder   = &aDSF->theOriginalOrder;
+
+                    totalNodeCount     = slaveNodes + 1;
+
+                    if (overFlow) {
+                        overFlow = slaveNodes/overFlow;
+                    }
+
+                    ReportWarning    (_String ("InitMPIOptimizer (autoLF) with:") & (long)optimalOrder->lLength & " site patterns on " & (long)slaveNodes
+                                      & " MPI computational nodes. " & sitesPerNode & " site patterns per node (+1 every "
+                                      & overFlow & "-th node)");
+
+                    MPISwitchNodesToMPIMode (slaveNodes);
+                    for (long i = 1; i<=slaveNodes; i++) {
+                        toPart = sitesPerNode;
+                        if (overFlow && i%overFlow == 0)
+                            // add an extra site when needed
+                        {
+                            toPart++;
+                        }
+
+                        if (fromPart+toPart > optimalOrder->lLength || i == slaveNodes)
+                            // ensure that all remaining sites are added to the final block
+                        {
+                            toPart = optimalOrder->lLength-fromPart;
+                        }
+
+                        _SimpleList     map     (optimalOrder->lLength, 0, 0),
+                                        subset;
+
+                        for (long i2 = 0; i2 < toPart; i2++)
+                            // lay the sites out in optimal order
+                        {
+                            map.lData[optimalOrder->lData[fromPart+i2]] = 1;
+                        }
+
+                        //ReportWarning    (_String((_String*)map.toStr()));
+
+                        for (long i2 = 0; i2 < dupMap->lLength; i2++)
+                            if (map.lData[dupMap->lData[i2]])
+                                for (long cp = 0; cp < unitLength; cp++ ) {
+                                    subset << orOrder->lData[i2*unitLength+cp];
+                                }
+
+                        ReportWarning (_String((_String*)subset.toStr()));
+                        fromPart += toPart;
+
+                        _String          sLF (8192L, true);
+                        SerializeLF      (sLF,_hyphyLFSerializeModeVanilla,nil,&subset);
+                        sLF.Finalize     ();
+
+                        MPISendString (sLF,i);
+                        parallelOptimizerTasks.AppendNewInstance (new _SimpleList);
+                    }
+                }
+                // no autoParallelize
+                else {
+                    long     perNode        =  (hyphyMPIOptimizerMode == _hyphyLFMPIModeAuto)?1:theDataFilters.lLength / slaveNodes,
+                             overFlow     =  (hyphyMPIOptimizerMode == _hyphyLFMPIModeAuto)?0:theDataFilters.lLength % slaveNodes;
+
+                    if (perNode == 0) {
+                        slaveNodes         = theDataFilters.lLength;
+                        totalNodeCount     = slaveNodes + 1;
+                        perNode            = 1;
+                        overFlow           = 0;
+                    }
+
+                    if (overFlow) {
+                        overFlow = slaveNodes/overFlow;
+                    }
+
+                    ReportWarning    (_String ("InitMPIOptimizer with:") & (long)theDataFilters.lLength & " partitions on " & (long)slaveNodes
+                                      & " MPI computational nodes. " & perNode & " partitions per node (+1 every "
+                                      & overFlow & "-th node)");
+
+
+                    MPISwitchNodesToMPIMode (slaveNodes);
+                    for (long i = 1; i<totalNodeCount; i++) {
+                        toPart = perNode;
+                        if (overFlow && i%overFlow == 0) {
+                            toPart++;
+                        }
+
+                        if (fromPart+toPart > theDataFilters.lLength || i == slaveNodes) {
+                            toPart = theDataFilters.lLength-fromPart;
+                        }
+
+                        _SimpleList     subset (toPart,fromPart,1);
+
+                        ReportWarning (_String((_String*)subset.toStr()));
+                        fromPart += toPart;
+
+                        _String          sLF (8192L, true);
+                        SerializeLF      (sLF,_hyphyLFSerializeModeVanilla,&subset);
+                        sLF.Finalize     ();
+
+                        MPISendString    (sLF,i);
+                        parallelOptimizerTasks.AppendNewInstance (new _SimpleList);
+                    }
+                }
+
+
+                for (long i = 1; i<=parallelOptimizerTasks.lLength; i++) {
+                    _String         *mapString      =   MPIRecvString (-1,senderID);
+                    _List           *varNames       =   mapString->Tokenize (";");
+                    _SimpleList*    indexedSlaveV   =   (_SimpleList*)parallelOptimizerTasks(senderID-1);
+
+                    for (long i2 = 0; i2 < varNames->lLength; i2++) {
+                        long vi2    = masterNodeMap.Find((*varNames)(i2));
+                        if (vi2 < 0)
+                            FlagError (_String ("[MPI] InitMPIOptimizer: Failed to map independent variable ")
+                                       & *(_String*)(*varNames)(i2)
+                                       & " for MPI node " & senderID &". Had variable string:"
+                                       & *mapString);
+
+
+                        (*indexedSlaveV) << masterNodeMap.GetXtra(vi2);
+                    }
+
+                    if (indexedSlaveV->lLength > transferrableVars) {
+                        transferrableVars = indexedSlaveV->lLength;
+                    }
+
+                    DeleteObject (varNames);
+                    DeleteObject (mapString);
+                }
+
+                CreateMatrix (&varTransferMatrix, 1, transferrableVars, false, true, false);
+                ReportWarning(_String("[MPI] InitMPIOptimizer:Finished with the setup. Maximum of ") & transferrableVars & " transferrable parameters.");
+            }
+        }
+    }
+#endif //__HYPHYMPI__
+}
+
+//_______________________________________________________________________________________
+
+void    _LikelihoodFunction::CleanupMPIOptimizer (void)
+{
+#ifdef __HYPHYMPI__
+    if (hyphyMPIOptimizerMode!=_hyphyLFMPIModeNone && parallelOptimizerTasks.lLength) {
+        varTransferMatrix.theData[0] = -1.e101;
+
+
+        for (long i=0; i<parallelOptimizerTasks.lLength; i++) {
+            ReportMPIError(MPI_Send(varTransferMatrix.theData, ((_SimpleList*)parallelOptimizerTasks(i))->lLength , MPI_DOUBLE, i+1, HYPHY_MPI_VARS_TAG, MPI_COMM_WORLD),true);
+            MPISendString (empty, i+1);
+        }
+
+        if (hyphyMPIOptimizerMode == _hyphyLFMPIModeREL) {
+            resTransferMatrix.Clear();
+        }
+        varTransferMatrix.Clear();
+        parallelOptimizerTasks.Clear();
+    }
+    hyphyMPIOptimizerMode = _hyphyLFMPIModeNone;
+#endif
+}
+
+//_______________________________________________________________________________________
+void            _LikelihoodFunction::SetupLFCaches              (void)
+{
+    // need to decide which data represenation to use,
+    // large trees short alignments
+    // an acceptable cache size etc
+    categID = 0;
+    checkPointer(conditionalInternalNodeLikelihoodCaches = new _Parameter*   [theTrees.lLength]);
+    checkPointer(branchCaches                            = new _Parameter*   [theTrees.lLength]);
+    checkPointer(siteScalingFactors                      = new _Parameter*   [theTrees.lLength]);
+    checkPointer(conditionalTerminalNodeStateFlag        = new long*         [theTrees.lLength]);
+    overallScalingFactors.Populate                        (theTrees.lLength, 0,0);
+    overallScalingFactorsBackup.Populate                  (theTrees.lLength, 0,0);
+    matricesToExponentiate.Clear();
+
+#ifdef MDSOCL
+	OCLEval = new _OCLEvaluator[theTrees.lLength]();
+#endif
+
+    evalsSinceLastSetup = 0;
+
+    for (long i=0; i<theTrees.lLength; i++) {
+        _TheTree * cT = ((_TheTree*)(LocateVar(theTrees(i))));
+        _DataSetFilter *theFilter = ((_DataSetFilter*)dataSetFilterList(theDataFilters(i)));
+
+        conditionalInternalNodeLikelihoodCaches[i] = nil;
+        conditionalTerminalNodeStateFlag       [i] = nil;
+        siteScalingFactors                     [i] = nil;
+        branchCaches                           [i] = nil;
+
+        if (!theFilter->IsNormalFilter()) {
+            siteCorrections.AppendNewInstance      (new _SimpleList);
+            siteCorrectionsBackup.AppendNewInstance (new _SimpleList);
+            conditionalTerminalNodeLikelihoodCaches.AppendNewInstance (new _GrowingVector);
+            continue;
+        }
+
+        long patternCount   = theFilter->NumberDistinctSites(),
+             stateSpaceDim    = theFilter->GetDimension (),
+             leafCount      = cT->GetLeafCount(),
+             iNodeCount        = cT->GetINodeCount(),
+             atomSize      = theFilter->GetUnitLength();
+
+        if (leafCount > 1) {
+            checkPointer (conditionalInternalNodeLikelihoodCaches[i] = new _Parameter [patternCount*stateSpaceDim*iNodeCount*cT->categoryCount]);
+            checkPointer (branchCaches[i]                            = new _Parameter [2*patternCount*stateSpaceDim*cT->categoryCount]);
+        }
+
+        checkPointer (siteScalingFactors[i]                          = new _Parameter [patternCount*iNodeCount*cT->categoryCount]);
+        checkPointer (conditionalTerminalNodeStateFlag[i]            = new long       [patternCount*MAX(2,leafCount)]);
+
+        cachedBranches.AppendNewInstance (new _SimpleList (cT->categoryCount,-1,0));
+        if (cT->categoryCount == 1) {
+            siteCorrections.AppendNewInstance (new _SimpleList (patternCount,0,0));
+            siteCorrectionsBackup.AppendNewInstance (new _SimpleList (patternCount,0,0));
+        } else {
+            siteCorrections.AppendNewInstance (new _SimpleList (cT->categoryCount*patternCount,0,0));
+            siteCorrectionsBackup.AppendNewInstance (new _SimpleList (cT->categoryCount*patternCount,0,0));
+        }
+
+        for (long k = 0; k < patternCount*iNodeCount*cT->categoryCount; (siteScalingFactors[i])[k] = 1., k++) ;
+
+        // now process filter characters by site / column
+
+        _List        foundCharactersAux;
+        _AVLListX    foundCharacters (&foundCharactersAux);
+        _String      aState ((unsigned long)atomSize);
+
+        char            ** columnBlock      = new char*[atomSize];
+        checkPointer (columnBlock);
+        _Parameter      * translationCache  = new _Parameter [stateSpaceDim];
+        checkPointer (translationCache);
+        _GrowingVector  * ambigs            = new _GrowingVector();
+
+        for (long siteID = 0; siteID < patternCount; siteID ++) {
+            siteScalingFactors[i][siteID] = 1.;
+            for (long k = 0; k < atomSize; k++) {
+                columnBlock[k] = theFilter->GetColumn(siteID*atomSize+k);
+            }
+
+            long uptoL = MAX (2,leafCount);
+
+            for (long leafID = 0; leafID < uptoL; leafID ++) {
+                long mappedLeaf  = theFilter->theNodeMap.lData[leafID],
+                     translation;
+
+                for (long k = 0; k < atomSize; k++) {
+                    aState.sData[k] = columnBlock[k][mappedLeaf];
+                }
+
+                translation = foundCharacters.Find (&aState);
+                if (translation < 0) {
+                    translation = theFilter->Translate2Frequencies (aState, translationCache, true);
+                    if (translation < 0) {
+                        for (long j = 0; j < stateSpaceDim; j++) {
+                            ambigs->Store(translationCache[j]);
+                        }
+                        translation = -ambigs->GetUsed()/stateSpaceDim;
+                    }
+                    foundCharacters.Insert (new _String(aState), translation);
+                } else {
+                    translation = foundCharacters.GetXtra (translation);
+                }
+                conditionalTerminalNodeStateFlag [i][leafID*patternCount + siteID] = translation;
+                //printf ("%ld\n", translation);
+            }
+        }
+        conditionalTerminalNodeLikelihoodCaches.AppendNewInstance (ambigs);
+        delete [] columnBlock;
+        delete [] translationCache;
+
+#ifdef MDSOCL
+		OCLEval[i].init(patternCount, theFilter->GetDimension(), conditionalInternalNodeLikelihoodCaches[i]);
+#endif
+    }
+}
+
+//extern long marginalLFEvals, marginalLFEvalsAmb;
+
+//_______________________________________________________________________________________
+
+_Matrix*        _LikelihoodFunction::Optimize ()
+{
+    char           buffer [1024];
+
+    if (lockedLFID != -1) {
+        WarnError ("Optimize() could not be executed, because another optimization is already in progress.");
+        return new _Matrix (1,1,false,true);
+    }
+
+    RescanAllVariables ();
+
+    if (indexInd.lLength == 0) {
+        _Matrix result (2,indexDep.lLength<3?3:indexDep.lLength, false, true);
+        PrepareToCompute();
+        result.Store (1,0,Compute());
+        result.Store (1,1,indexInd.lLength);
+        result.Store (1,2,0);
+        for (long i=0; i<indexDep.lLength; i++) {
+            _PMathObj pm = (_PMathObj)(LocateVar (indexDep(i)))->Compute();
+            result.Store(0,i,pm->Value());
+        }
+        DoneComputing();
+        return (_Matrix*)result.makeDynamic();
+    }
+
+#ifdef      __MACPROFILE__
+    ProfilerInit(collectDetailed,bestTimeBase,1000,500);
+#endif
+
+    _Parameter  intermediateP,
+                wobble              = 0.,
+                maxSoFar           = -A_LARGE_NUMBER,
+                bestVal,
+                lastMax,
+                currentPrecision   = 0.1,
+                keepStartingPoint,
+                bP,
+                optMethodP,
+                percentDone      = 0.0,
+                bigLastMax;
+
+    long        i,
+                j,
+                fnDim               = MaximumDimension(),
+                evalsIn             = likeFuncEvalCallCount,
+                exponentiationsIn   = matrixExpCount;
+
+
+    TimerDifferenceFunction (false);
+
+    _Parameter              hardLimitOnOptimizationValue;
+    checkParameter          (optimizationHardLimit, hardLimitOnOptimizationValue, INFINITY);
+
+    hardLimitOnOptimizationValue = MAX (hardLimitOnOptimizationValue, 0.0);
+    if (hardLimitOnOptimizationValue != INFINITY) {
+        ReportWarning (_String("Set a hard time limit for optimization routines to ") & hardLimitOnOptimizationValue & " seconds\n");
+    }
+
+    isInOptimize    = true;
+    lockedLFID      = likeFuncList._SimpleList::Find ((long)this);
+
+    //RankVariables   ();
+    VerbosityLevel  ();
+
+#if defined __UNIX__ && ! defined __HEADLESS__ && !defined __HYPHYQT__ && !defined __HYPHY_GTK__
+#ifdef __HYPHYMPI__
+    if (_hy_mpi_node_rank == 0) {
+#endif
+        _Variable     * progressFile = CheckReceptacle (&optimizationStatusFile, empty, false);
+        progressFileString = nil;
+
+        if (progressFile->ObjectClass () == STRING) {
+            progressFileString = ((_FString*)progressFile->Compute())->theString;
+        }
+
+        if (verbosityLevel==1) {
+            UpdateOptimizationStatus (0,0,0,true,progressFileString);
+        }
+#ifdef __HYPHYMPI__
+    }
+#endif
+#endif
+
+
+    for (i=0; i<theTrees.lLength; i++) {
+        ((_TheTree*)(LocateVar(theTrees(i))))->CountTreeCategories();
+    }
+
+    SetupLFCaches       ();
+    SetupCategoryCaches ();
+    
+    
+    /*for (long k = 0; k < theTrees.lLength; k++){
+        _SimpleList subset(k);
+        _String          sLF (8192L, true);
+        SerializeLF      (sLF,_hyphyLFSerializeModeVanilla,&subset,nil);
+        sLF.Finalize     ();
+        FILE * F = doFileOpen(_String("/tmp/") & k & ".dump", "w");
+        printf ("%ld\n",k);
+        fprintf (F, "%s", sLF.sData);
+        fclose (F);
+    }*/
+
+
+#ifdef __HYPHYMPI__
+    if (_hy_mpi_node_rank == 0) {
+        InitMPIOptimizer ();
+        if (parallelOptimizerTasks.lLength == 0) {
+            hyphyMPIOptimizerMode = _hyphyLFMPIModeNone;
+        }
+    }
+
+    if (hyphyMPIOptimizerMode == _hyphyLFMPIModeNone) {
+
+#endif
+
+        checkParameter    (cacheSubtrees,precision,1);
+        SetReferenceNodes ();
+        checkParameter     (useFullMST,intermediateP,0.0);
+
+        for (i=0; i<theTrees.lLength; i++) {
+            _TheTree * cT = ((_TheTree*)(LocateVar(theTrees(i))));
+            cT->SetUpMatrices(cT->categoryCount);
+            /*#if USE_SCALING_TO_FIX_UNDERFLOW
+                cT->AllocateUnderflowScalers (((_DataSetFilter*)dataSetFilterList (theDataFilters(i)))->NumberDistinctSites());
+            #endif
+            if (mstCache&&(intermediateP>0.5))
+            {
+                long  cacheSize = mstCache->cacheSize[i];
+                if (cacheSize)
+                {
+                    j = cT->GetLeafCount()+cT->GetINodeCount();
+
+                    _Parameter**        mstResultCacheIndex = new _Parameter* [cacheSize+1];
+                    checkPointer        (mstResultCacheIndex);
+
+                    for (long kk=0; kk<cacheSize; kk++)
+                    {
+                        _Parameter*     cacheVector = new _Parameter [j*cT->GetCodeBase()];
+                        checkPointer (cacheVector);
+                        mstResultCacheIndex[kk] = cacheVector;
+                    }
+
+                    mstResultCacheIndex[cacheSize] = nil;
+                    mstCache->resultCache << (long)mstResultCacheIndex;
+
+
+                    long        **      mstStateCacheIndex = new long* [cacheSize+1];
+                    checkPointer        (mstStateCacheIndex);
+
+                    for (long kk2=0; kk2<cacheSize; kk2++)
+                    {
+                        long*       cacheVector = new long [j];
+                        checkPointer (cacheVector);
+                        mstStateCacheIndex[kk2] = cacheVector;
+                    }
+
+                    mstStateCacheIndex[cacheSize] = nil;
+                    mstCache->statesCache << (long)mstStateCacheIndex;
+
+
+
+                    char        **      mstStateNCacheIndex = new char* [cacheSize+1];
+                    checkPointer        (mstStateNCacheIndex);
+
+                    j = cT->GetINodeCount();
+
+                    for (long kk3=0; kk3<cacheSize; kk3++)
+                    {
+                        char*       cacheVector = new char [j];
+                        checkPointer (cacheVector);
+                        mstStateNCacheIndex[kk3] = cacheVector;
+                    }
+
+                    mstStateCacheIndex[cacheSize] = nil;
+                    mstCache->statesNCache << (long)mstStateNCacheIndex;
+
+                    mstCache->stashedLeafOrders && ((_SimpleList*)leafSkips(i));
+                    ((_SimpleList*)leafSkips(i))->Clear();
+                    ((_DataSetFilter*)dataSetFilterList.lData[theDataFilters.lData[i]])->MatchStartNEnd(*(_SimpleList*)mstCache->computingOrder(i),*(_SimpleList*)leafSkips(i),(_SimpleList*)mstCache->parentOrder(i));
+                    ReportWarning (_String("Using Full MST heurisic on block ") & i & " of likelihood function " & ((_String*)likeFuncNamesList (lockedLFID))->getStr());
+                }
+                else
+                {
+                    mstCache->resultCache  << 0;
+                    mstCache->statesCache  << 0;
+                    mstCache->statesNCache << 0;
+                    _SimpleList tl;
+                    mstCache->stashedLeafOrders && & tl;
+                }
+            }   */
+            //if (dupTrees.lData[i] == 0)
+            //{
+            /*  _DataSetFilter* dsf = (_DataSetFilter*)dataSetFilterList (theDataFilters.lData[i]);
+                _Constant*  tC = (_Constant*)cT->TipCount();
+                if ((precision>.1)&&((dsf->GetUnitLength()>1)||(tC->Value()>7)))
+                {
+                    cT->BuildTopLevelCache();
+                    cT->AllocateResultsCache(dsf->NumberDistinctSites());
+                }
+                DeleteObject (tC); */
+            //}
+        }
+
+        hasBeenSetUp = 1;
+
+#ifdef __HYPHYMPI__
+    }
+#endif
+
+    _Matrix variableValues(indexInd.lLength,1,false,true);
+    computationalResults.Clear();
+
+#if !defined __UNIX__ || defined __HEADLESS__ || defined __HYPHYQT__ || defined __HYPHY_GTK__ 
+    SetStatusBarValue (0,maxSoFar,0);
+#endif
+
+
+#ifdef __HYPHYMPI__
+    if (_hy_mpi_node_rank == 0) {
+#endif
+
+DecideOnDivideBy (this);
+
+
+#ifdef __HYPHYMPI__
+    }
+#endif
+    
+
+    bool            skipCG = false;
+    checkParameter (skipConjugateGradient,wobble,0.0);
+    skipCG = wobble>0.5;
+    checkParameter (randomStartingPerturbations,wobble,0.0);
+    checkParameter (useLastResults,keepStartingPoint,0.0);
+    checkParameter (allowBoundary,go2Bound,1.0);
+    checkParameter (useInitialDistanceGuess,precision,1);
+
+    if (floor(keepStartingPoint) == 0.0 && precision>0.1) {
+        GetInitialValues();
+     }
+
+    checkParameter  (globalStartingPoint,precision,0.1);
+    _Constant     c (precision);
+
+    if (fabs(keepStartingPoint) < 0.5) {
+        if ((long)wobble==0) {
+            for (i=0; i<indexInd.lLength; i++) {
+                _Variable *iv = LocateVar (indexInd.lData[i]);
+                if (iv->IsGlobal()) {
+                    if (iv->Value() < 1.e-10) {
+                        iv->SetValue(&c);
+                    }
+                } else {
+                    if (!iv->HasChanged()) {
+                        iv->SetValue(&c);
+                    }
+                }
+            }
+        } else {
+            for (i=0; i<indexInd.lLength; i++) {
+                _Variable *iv = LocateVar (indexInd(i));
+                if (!iv->HasChanged()) {
+                    _Parameter newV = precision*(1.0+genrand_int32()/(_Parameter)RAND_MAX_32);
+                    c.SetValue(newV);
+                    iv->SetValue(&c);
+                }
+            }
+        }
+    }
+
+#if !defined __UNIX__ || defined __HEADLESS__
+    SetStatusBarValue (5,maxSoFar,(likeFuncEvalCallCount-evalsIn)/TimerDifferenceFunction(true));
+#endif
+
+    CheckDependentBounds();
+
+    checkParameter (startingPrecision,currentPrecision,0.1);
+    checkParameter (optimizationMethod,optMethodP,4.0);
+    checkParameter (optimizationPrecisionMethod,optimizationPrecMethod,0.0);
+    checkParameter (optimizationPrecision,precision,0.001);
+    checkParameter (maximumIterationsPerVariable,maxItersPerVar,5000);
+
+    ReportWarning  (_String("Optimization settings:\n\t") & optimizationMethod & " = " & optMethodP &
+                    "\n\t" & optimizationPrecision & " = " & precision &
+                    "\n\t" & maximumIterationsPerVariable & " = " & maxItersPerVar
+                    &"\n\nInitial parameter values\n");
+    
+    for (long i = 0; i < indexInd.lLength; i++) {
+        ReportWarning (_String(LocateVar (indexInd.lData[i])->GetName()->sData) & " = " & GetIthIndependent (i));
+    }
+
+    maxItersPerVar *= indexInd.lLength;
+    checkParameter (relativePrecision,relPrec,0.0);
+
+#if !defined __UNIX__ || defined __HEADLESS__
+#ifdef __HYPHYMPI__
+    if (_hy_mpi_node_rank == 0)
+#endif
+        if (terminateExecution) {
+            CleanUpOptimize();
+            return new _Matrix (1,1,false,true);
+        }
+#endif
+
+    int optMethod = optMethodP;
+
+    SetupParameterMapping   ();
+
+    for (j=0; j<indexInd.lLength; j++) {
+        variableValues[j]=GetIthIndependent(j);
+    }
+
+    /*for (long pc = 0; pc < indexInd.lLength; pc++)
+    {
+        _String pv = _String (pc) & ' ' & GetIthIndependent (pc) &'\n';
+        StringToConsole (pv);
+    }*/
+
+    if (optMethod == 3) { // Powell's Method
+        _Matrix         bestSoFar (indexInd.lLength,1,false,true),
+                        savedStartingPoint(indexInd.lLength,1,false,true),
+                        extrapolatePoint(indexInd.lLength,1,false,true),
+                        temp(indexInd.lLength,1,false,true);
+        _List           startingDirections;
+
+        _Parameter      saveItMax;
+
+        long    indOfMaxIncrease;
+        currentPrecision = 0.01;
+        for (i=0; i<indexInd.lLength; i++) {
+            _Matrix *ithDir = new _Matrix (indexInd.lLength,1,false,true);
+            ithDir->theData[i]=1.0;
+            startingDirections<<ithDir;
+            DeleteObject(ithDir);
+            bestSoFar.theData[i]=GetIthIndependent(i);
+        }
+        indOfMaxIncrease = 1;
+
+        HasPrecisionBeenAchieved(2.*A_LARGE_NUMBER);
+
+
+        maxSoFar = Compute();
+
+        while (!HasPrecisionBeenAchieved (maxSoFar)) {
+            bP = 0;
+            saveItMax = maxSoFar;
+            savedStartingPoint.Duplicate(&bestSoFar);
+            keepStartingPoint = Compute();
+            for (i=0; i<indexInd.lLength; i++) {
+                lastMax = maxSoFar;
+                GradientLocateTheBump (currentPrecision, maxSoFar, bestSoFar, *((_Matrix*)startingDirections(i)));
+                //((_Matrix*)startingDirections(i))->Duplicate(&bestSoFar);
+                //*((_Matrix*)startingDirections(i))-=temp;
+#if !defined __UNIX__ || defined __HEADLESS__
+#ifdef __HYPHYMPI__
+                if (_hy_mpi_node_rank == 0)
+#endif
+                    if (terminateExecution) {
+                        CleanUpOptimize();
+                        return new _Matrix (1,1,false,true);
+                    }
+#endif
+                if (fabs(lastMax-maxSoFar)>bP) {
+                    indOfMaxIncrease = i;
+                    bP = fabs(lastMax-maxSoFar);
+                }
+                if (verbosityLevel>=5) {
+                    snprintf (buffer, sizeof(buffer),"\nPowell's direction %ld current Max = %g\n", i, maxSoFar);
+                    BufferToConsole (buffer);
+                }
+
+            }
+
+            /*_Constant * normConst;
+            extrapolatePoint.Duplicate(&bestSoFar);
+            extrapolatePoint*=2.0;
+            extrapolatePoint-=savedStartingPoint;
+            normConst = (_Constant*)extrapolatePoint.Abs();
+            extrapolatePoint*=1./normConst->Value();
+            DeleteObject (normConst);
+
+            for (i=0; i<indexInd.lLength; i++)
+                SetIthIndependent (i,extrapolatePoint(0,i));
+
+            wobble = Compute();
+
+            for (i=0; i<indexInd.lLength; i++)
+                SetIthIndependent (i,bestSoFar(0,i));
+
+            if (wobble > saveItMax)
+            {
+                //if (2.*(saveItMax-2.* maxSoFar+wobble) * SQR (
+                temp = bestSoFar;
+                temp -= savedStartingPoint;
+                normConst = (_Constant*)temp.Abs();
+                temp*=1./normConst->Value();
+                DeleteObject (normConst);
+                GradientLocateTheBump (currentPrecision, maxSoFar, bestSoFar, temp);
+
+                if (indOfMaxIncrease != indexInd.lLength-1)
+                    ((_Matrix*)startingDirections(indOfMaxIncrease))->Duplicate(startingDirections(indexInd.lLength-1));
+
+                ((_Matrix*)startingDirections(indOfMaxIncrease))->Duplicate(&temp);
+            }*/
+
+            if (verbosityLevel>=5) {
+                snprintf (buffer, sizeof(buffer),"\nAt Powell's Precision %g  current Max = %g", currentPrecision, maxSoFar);
+                BufferToConsole (buffer);
+            }
+
+            if (currentPrecision>1e-8) {
+                currentPrecision/=10;
+            }
+        }
+    }
+
+    if ((optMethod == 4)&&(indexInd.lLength == 1)) {
+        optMethod = 0;
+    }
+
+    if (optMethod) {
+        checkParameter (bracketingPersistence,bP,2.5);
+    } else {
+        checkParameter (bracketingPersistence,bP,3);
+    }
+
+    if (optMethod == 4 || optMethod == 6 || optMethod == 7) { // gradient descent
+        _Matrix bestSoFar;
+
+        GetAllIndependent (bestSoFar);
+
+        if (fnDim<21) {
+            checkParameter (intermediatePrecision,intermediateP,.1);
+        } else {
+            checkParameter (intermediatePrecision,intermediateP,.1);
+        }
+
+        if (verbosityLevel>20) {
+            snprintf (buffer, sizeof(buffer),"\nGradient Precision %g  Opt Precision = %g", intermediateP, precision);
+            BufferToConsole (buffer);
+        }
+
+        if (optMethod!=7) {
+            ConjugateGradientDescent (0.1, bestSoFar, true, 10);
+        } else {
+            _Parameter current_precision = MAX(1., precision);
+            while (current_precision > precision) {
+              ConjugateGradientDescent(current_precision, bestSoFar, true);
+              current_precision *= 0.1;
+            }
+            ConjugateGradientDescent(precision, bestSoFar, true);
+        }
+#if !defined __UNIX__ || defined __HEADLESS__
+#ifdef __HYPHYMPI__
+        if (_hy_mpi_node_rank == 0) {
+#endif
+            if (terminateExecution) {
+                CleanUpOptimize();
+                return new _Matrix (1,1,false,true);
+            }
+#ifndef __HEADLESS__
+            if (feedbackTreePanel)
+                if (windowObjectRefs.Find ((long)feedbackTreePanel) >= 0) {
+                    feedbackTreePanel->BuildTree (true);
+                    feedbackTreePanel->RenderTree();
+                } else {
+                    feedbackTreePanel = nil;
+                }
+#endif
+#ifdef __HYPHYMPI__
+        }
+#endif
+#endif
+        maxSoFar = Compute();
+        if (optMethod != 7) {
+            optMethod = optMethod!=6?0:5;
+        }
+        currentPrecision = optMethod==7?sqrt(precision):intermediateP;
+        percentDone = 10.0;
+        HasPrecisionBeenAchieved(2.*A_LARGE_NUMBER);
+    }
+
+    if (optMethod==5) { // randomized bracketing method
+        _SimpleList passOrder;
+        _Matrix optimizationStats (5, indexInd.lLength, false,true);
+
+        // initialize the statsMatrix
+
+        for (j=0; j<indexInd.lLength; j++) {
+            optimizationStats.Store(0,j,0); // number of passes
+            optimizationStats.Store(1,j,0); // average X change
+            optimizationStats.Store(2,j,0); // average Y change
+            optimizationStats.Store(3,j,currentPrecision); // bracketing precision
+            optimizationStats.Store(4,j,1); // probability of optimizing over this leaf
+        }
+
+        long    totalPasses, passesDone = 0, lastPassed = -1, counterR = 0;
+        totalPasses = indexInd.lLength*bP;
+        while (passesDone<totalPasses) {
+            counterR++;
+            RandomizeList (passOrder,indexInd.lLength);
+            _Parameter passThresh = (_Parameter)(genrand_int32())/RAND_MAX_32;
+            if (passesDone>=indexInd.lLength) {
+                passThresh/=exp((_Parameter)indexInd.lLength*log((_Parameter)(passesDone+1)/(_Parameter)indexInd.lLength));
+            }
+            for (j=0; j<indexInd.lLength; j++) {
+                if (optimizationStats(4,passOrder[j])>=passThresh) {
+                    long jj = passOrder[j];
+                    if (passOrder[j]==lastPassed) {
+                        continue;
+                    }
+                    _Parameter oldXValue = GetIthIndependent(passOrder[j]),
+                               oldYValue = passesDone?lastMax:Compute();
+                    if (!passesDone) {
+                        maxSoFar = oldYValue;
+                    }
+                    bestVal = oldXValue;
+                    lastMax = maxSoFar;
+                    LocateTheBump (jj,optimizationStats(3,jj), maxSoFar, bestVal);
+#ifdef __HYPHYMPI__
+                    if (_hy_mpi_node_rank == 0)
+#endif
+                        if (terminateExecution) {
+                            CleanUpOptimize();
+                            return new _Matrix (1,1,false,true);
+                        }
+                    if (verbosityLevel>1) {
+                        _String *s = (_String*)LocateVar(indexInd(passOrder[j]))->GetName();
+                        BufferToConsole ("\nAt ");
+                        StringToConsole (*s);
+                        snprintf (buffer, sizeof(buffer)," with bracketing precision %g current Max = %g. Prior value = %g, current value = %g, %ld", optimizationStats(3,jj), maxSoFar, oldXValue, GetIthIndependent(passOrder[j]), counterR);
+                        BufferToConsole (buffer);
+                    }
+                    passesDone++;
+                    _Parameter currentThresh = optimizationStats(4,jj);
+                    if (optimizationStats(1,jj)&&(optimizationStats(1,jj)<fabs(oldXValue-GetIthIndependent(jj)))) {
+                        currentThresh*=2;
+                    }
+                    if (optimizationStats(2,passOrder[j])&&(optimizationStats(2,passOrder[j])<fabs(oldYValue-maxSoFar))) {
+                        currentThresh*=2;
+                    }
+                    if (optimizationStats(0,jj)>totalPasses/passesDone) {
+                        currentThresh/=indexInd.lLength;
+                    }
+                    currentThresh/=indexInd.lLength;
+                    if (currentThresh>.5) {
+                        currentThresh = .5;
+                    }
+                    optimizationStats.Store(0,jj,optimizationStats(0,jj)+1);
+                    optimizationStats.Store(1,jj,(optimizationStats(1,jj)*(optimizationStats(0,jj)-1)+fabs(oldXValue-GetIthIndependent(jj)))/optimizationStats(0,jj));
+                    optimizationStats.Store(2,jj,(optimizationStats(1,jj)*(optimizationStats(0,jj)-1)+fabs(oldYValue-maxSoFar))/optimizationStats(0,jj));
+                    optimizationStats.Store(4,jj,currentThresh);
+                    optimizationStats.Store(3,jj,currentPrecision/exp(log((_Parameter)10.0)*optimizationStats(0,jj)));
+                    lastPassed = jj;
+
+                    break;
+                }
+
+            }
+        }
+
+        //control pass
+        RandomizeList (passOrder,indexInd.lLength);
+        for (j=0; j<indexInd.lLength; j++) {
+            bestVal = GetIthIndependent(j);
+            lastMax = maxSoFar;
+            LocateTheBump (j,precision, maxSoFar, bestVal);
+            if (verbosityLevel>1) {
+                snprintf (buffer, sizeof(buffer),"\nControl Pass At Var#%ld with precision %g current Max = %g. Prior value = %g, current value = %g", j, currentPrecision, maxSoFar, bestVal, GetIthIndependent(j));
+                BufferToConsole (buffer);
+            }
+        }
+
+
+    }
+
+    if (optMethod == 0) {
+        bool      forward = false;
+
+        _Parameter averageChange = 0,
+                   divFactor     = -1.0 ,
+                   oldAverage      = -1.0,
+                   stdFactor   = 10,
+                   loopCounter    = 0.0,
+                   sY              = 0.0,
+                   sXY           = 0.0,
+                   s           = 0.0,
+                   sX           = 0.0,
+                   sXX            = 0.0,
+                   nPercentDone,
+                   sigma,
+                   lastMaxValue,
+                   averageChange2 = 0.0,
+                   //currentPrecision2 = precision,
+                   doShuffle,
+                   useAdaptiveStep = 0.0;
+
+        long       stayPut      = 0,
+                   inCount       = 0,
+                   termFactor,
+                   lfCount         = likeFuncEvalCallCount;
+
+        _SimpleList noChange,
+                    glVars,
+                    shuffledOrder;
+
+        _List               *stepHistory = nil;
+        _GrowingVector      logLHistory;
+        
+        maxSoFar  = lastMaxValue = Compute();
+
+        logLHistory.Store(maxSoFar);
+
+        checkParameter (useAdaptiveVariableStep, useAdaptiveStep, 1.0);
+
+        if (useAdaptiveStep>0.5) {
+            stepHistory = new _List;
+            for (j=0; j<indexInd.lLength; j++) {
+                _GrowingVector      *varHistory = new _GrowingVector;
+                varHistory->Store(variableValues[j]);
+                stepHistory->AppendNewInstance(varHistory);
+            }
+        }
+
+        noChange << -1;
+
+#if !defined __UNIX__ || defined __HEADLESS__
+        SetStatusBarValue (percentDone,maxSoFar,(likeFuncEvalCallCount-evalsIn)*TimerDifferenceFunction(true));
+#endif
+
+        if (indexInd.lLength<8) {
+            stdFactor = 8.0;
+        } else if (indexInd.lLength<16) {
+            stdFactor = 4.0;
+        } else if (indexInd.lLength<32) {
+            stdFactor = 2.5;
+        } else {
+            stdFactor = .5*(1.+sqrt(5.));
+        }
+
+        for (j=0; j<indexInd.lLength; j++) {
+            averageChange+=fabs (variableValues[j]-GetIthIndependent(j));
+        }
+
+        if (averageChange == 0.0) {
+            averageChange = currentPrecision;
+        }
+
+        currentPrecision = precision>.1?precision:.1;
+
+
+        termFactor = stdFactor+1;
+        if (termFactor>indexInd.lLength/2) {
+            termFactor = indexInd.lLength/2;
+        }
+
+        if (termFactor<3) {
+            termFactor = 3;
+        }
+
+        checkParameter (doShuffleOrder, doShuffle, 0.0);
+
+        for (j=0; j<indexInd.lLength; j++)
+            if (LocateVar (indexInd.lData[j])->IsGlobal()) {
+                glVars << j;
+            }
+
+#define _HY_SLOW_CONVERGENCE_RATIO 2.
+#define _HY_SLOW_CONVERGENCE_RATIO_INV 1./_HY_SLOW_CONVERGENCE_RATIO
+
+
+        while (inCount<termFactor || smoothingTerm > 0.) {
+            if (smoothingTerm > 0. && inCount == termFactor) {
+              smoothingTerm = 0.;
+              inCount = 0;
+            }
+            if (likeFuncEvalCallCount-lfCount>maxItersPerVar) {
+                ReportWarning ("Optimization routines returning before requested precision goal met. The maximum iteration number specified by MAXIMUM_ITERATIONS_PER_VARIABLE has been reached");
+                DeleteObject  (stepHistory);
+                stepHistory = nil;
+                break;
+            }
+            if (averageChange <1e-20) {
+                averageChange = fabs(oldAverage)<1?fabs(oldAverage*oldAverage):.5;
+                if (averageChange<1e-20) {
+                    averageChange = 1e-8;
+                }
+            }
+
+            _Parameter diffs [5] = {0.,0.,0.,0.,0.};
+            char convergenceMode = 0;
+            /* 0, normal
+             * 1, accelerated (last cycle obtained a bigger LL drop than the one before)
+             * 2, slow convergence (last three cycles within a factor of 2 LL drop of each other)
+             * 3, really slow convergence (last five cycles within a factor of 2 LL drop of each other)
+            */
+
+
+            if (useAdaptiveStep > 0.5) {
+                convergenceMode = 0;
+                if (oldAverage<0.0) {
+                    divFactor = stdFactor;
+                } else {
+                    divFactor           = MIN(16,MAX(stdFactor,oldAverage/averageChange));
+
+                    long       steps    = logLHistory.GetUsed();
+                    for (long k = 1; k <= MIN(5, steps-1); k++) {
+                        diffs[k-1] = logLHistory.theData[steps-k] - logLHistory.theData[steps-k-1];
+                        //printf ("%ld : %g\n", k, diffs[k-1]);
+                    }
+                    if (steps > 2 && diffs[0] >= diffs[1]) {
+                        convergenceMode = 1;
+                    }
+
+                    if (diffs[0] < precision*0.001) {
+                        convergenceMode = 3;
+                    }
+
+                    if (convergenceMode < 2) {
+                        if (steps > 3) {
+                            if (diffs[0] > 0. && diffs[1] > 0. && diffs[2] > 0.) {
+                                if (diffs[0] / diffs[1] >= _HY_SLOW_CONVERGENCE_RATIO_INV && diffs[0] / diffs[1] <= _HY_SLOW_CONVERGENCE_RATIO &&
+                                        diffs[1] / diffs[2] >= _HY_SLOW_CONVERGENCE_RATIO_INV && diffs[1] / diffs[2] <= _HY_SLOW_CONVERGENCE_RATIO) {
+                                    convergenceMode = 2;
+                                    if (steps > 4) {
+                                        if (diffs [3] > 0.) {
+                                            if (diffs[2] / diffs[3] >= _HY_SLOW_CONVERGENCE_RATIO_INV && diffs[2] / diffs[3] <= _HY_SLOW_CONVERGENCE_RATIO) {
+                                                convergenceMode = 3;
+                                            }
+                                        } else {
+                                            convergenceMode = 3;
+                                        }
+                                    }
+                                }
+                            } else {
+                                convergenceMode = 2;
+                            }
+                        }
+
+                    }
+
+                    switch (convergenceMode) {
+                    case 1:
+                        divFactor = 1.;
+                        break;
+                    case 2:
+                        divFactor = 4.;
+                        break;
+                    case 3:
+                        divFactor = 10.;
+                        break;
+                        //default:
+                        //  divFactor = 4.;
+                    }
+
+                }
+            } else {
+                if (oldAverage<0.0 || stdFactor*averageChange>oldAverage) {
+                    divFactor = stdFactor;
+                } else {
+                    divFactor = oldAverage/averageChange;
+                }
+            }
+
+            oldAverage = averageChange;
+
+            averageChange  = 1e-25;
+            averageChange2 = 1e-25;
+
+            bigLastMax = maxSoFar;
+
+            if (verbosityLevel>1) {
+                snprintf (buffer, sizeof(buffer),"\n\nOptimization Pass %ld (%ld). LF evalutations : %ld\n", (long)loopCounter, inCount,likeFuncEvalCallCount-lfCount);
+                BufferToConsole (buffer);
+                if (useAdaptiveStep > 0.5 && logLHistory.GetUsed() > 2) {
+                    snprintf (buffer, sizeof(buffer), "\nLast cycle logL change = %g\n", diffs[0]);
+                    BufferToConsole (buffer);
+                }
+            }
+#if defined __UNIX__ && ! defined __HEADLESS__ && !defined __HYPHYQT__ && !defined __HYPHY_GTK__
+            else if (verbosityLevel==1) {
+                UpdateOptimizationStatus (maxSoFar,-1,1,true,progressFileString);
+            }
+#endif
+            if (smoothingTerm > 0.) {
+              smoothingTerm *= smoothingReduction;
+            }
+            
+            _SimpleList nc2;
+
+            long        ncp = 0,
+                        jjj;
+
+            averageChange2 = 0.0;
+
+            if (doShuffle > 0.1) {
+                for (j=0; j<indexInd.lLength; j++) {
+                    nc2 << j;
+                }
+
+                shuffledOrder.Subtract (nc2, glVars);
+                shuffledOrder.Permute  (1);
+
+                for (j=0; j<glVars.lLength; j++) {
+                    shuffledOrder << glVars.lData[j];
+                }
+
+                nc2.Clear();
+                shuffledOrder.Flip();
+            }
+
+            _Parameter stepScale = 1.;
+
+            if (useAdaptiveStep > 0.5) {
+                stepScale = 1/divFactor;
+                if (verbosityLevel>5) {
+                    snprintf (buffer, sizeof(buffer),"\n[BRACKET SHRINKAGE: %g]", divFactor);
+                    BufferToConsole (buffer);
+                    snprintf (buffer, sizeof(buffer),"\n[Convergence mode = %d]", convergenceMode);
+                    BufferToConsole (buffer);
+                    snprintf (buffer, sizeof(buffer),"\n[Unchanged variables = %ld]", noChange.lLength);
+                    BufferToConsole (buffer);
+                }
+                
+                if (hardLimitOnOptimizationValue < INFINITY && TimerDifferenceFunction(true) > hardLimitOnOptimizationValue) {
+                    ReportWarning (_String("Optimization terminated before convergence because the hard time limit was exceeded."));
+                    break;
+                }
+
+                if (convergenceMode > 2) {
+                    if (hardLimitOnOptimizationValue < INFINITY && TimerDifferenceFunction(true) > hardLimitOnOptimizationValue) {
+                        ReportWarning (_String("Optimization terminated before convergence because the hard time limit was exceeded."));
+                        break;
+                    }
+                    _Matrix             bestMSoFar;
+                    GetAllIndependent   (bestMSoFar);
+                    _Parameter prec = MIN (diffs[0], diffs[1]);
+
+                    prec = MAX (prec*0.01, precision*0.1);
+                    prec = MIN (prec, 0.1);
+                    
+                    /*_SimpleList* subset = _SimpleList (indexInd.lLength,0,1).Subset (10);
+
+                    BufferToConsole (_String ((_String*)subset->toStr()));
+                    NLToConsole();
+                    
+                    ConjugateGradientDescent (prec, bestMSoFar,true,5,subset);
+                    DeleteObject (subset);*/
+                    
+                    if (gradientBlocks.lLength) {
+                        for (long b = 0; b < gradientBlocks.lLength; b++) {
+                            ConjugateGradientDescent (prec, bestMSoFar,true,5,(_SimpleList*)(gradientBlocks(b)),maxSoFar);
+                        }
+                    } else {
+                        ConjugateGradientDescent (prec, bestMSoFar,true,5,nil,maxSoFar);
+                    }
+                    
+                    GetAllIndependent   (bestMSoFar);
+                    for (long k = 0; k < indexInd.lLength; k++) {
+                        ((_GrowingVector*)(*stepHistory)(k))->Store (bestMSoFar.theData[k]);
+                    }
+
+                    stepScale = 1.;
+                    logLHistory.Store(maxSoFar);
+                }
+            }
+            for (jjj=forward?0:indexInd.lLength-1; forward?(jjj<indexInd.lLength):jjj>=0; forward?jjj++:jjj--) {
+                if (hardLimitOnOptimizationValue < INFINITY && TimerDifferenceFunction(true) > hardLimitOnOptimizationValue) {
+                    break;
+                }
+                
+                if (doShuffle > 0.1) {
+                    j = shuffledOrder.lData[jjj];
+                } else {
+                    j = jjj;
+                }
+
+                bool amIGlobal = LocateVar (indexInd.lData[j])->IsGlobal();
+
+#ifdef __HYPHYMPI__
+                if (_hy_mpi_node_rank == 0)
+#endif
+                    if (terminateExecution) {
+                        CleanUpOptimize();
+                        return new _Matrix (1,1,false,true);
+                    }
+
+                bestVal = GetIthIndependent(j);
+                lastMax = maxSoFar;
+
+                if (j==noChange.lData[ncp]) {
+                    if (ncp<noChange.lLength-1) {
+                        ncp++;
+                    }
+                    averageChange2+=bestVal;
+                    continue;
+                }
+
+                _GrowingVector     *vH = nil;
+                _Parameter         precisionStep = 0.,
+                                   brackStep;
+
+
+                if (useAdaptiveStep>0.5) {
+                    vH  = (_GrowingVector*)(*stepHistory)(j);
+                    //_Parameter    suggestedPrecision  = currentPrecision*(1.+198./(1.+exp(sqrt(loopCounter))));
+
+                    long stepsSoFar = vH->GetUsed();
+
+                    if (stepsSoFar>1) {
+                        _Parameter  lastParameterValue          = vH->theData[stepsSoFar-1],
+                                    previousParameterValue       = vH->theData[stepsSoFar-2];
+
+                        //stepScale   = 0.25;
+
+                        brackStep     = fabs(lastParameterValue-previousParameterValue);
+                        if (brackStep == 0.0) {
+                            long k = MAX(stepsSoFar-3,0);
+
+                            for (; k && brackStep == 0.0; k--) {
+                                previousParameterValue          = vH->theData[k],
+                                lastParameterValue               = vH->theData[k+1];
+                                brackStep                       = fabs(lastParameterValue-previousParameterValue);
+                            }
+
+                            if (k == 0) {
+                                brackStep = MIN(0.001,precision*0.001);
+                            }
+                        }
+
+                        precisionStep = brackStep*stepScale;
+
+                        if (inCount) {
+                            precisionStep = lastParameterValue*precision;
+                        }
+
+                        precisionStep = MAX(precisionStep,lastParameterValue*precision);
+
+
+                        if (precisionStep == 0.0) {
+                            precisionStep = precision;
+                            brackStep = 2.*precisionStep;
+                        } else {
+                            brackStep *= 2.;
+                        }
+                        //if (IsIthParameterGlobal (j))
+                        //  precisionStep *= 2.0;
+
+                        if (verbosityLevel>50) {
+                            snprintf (buffer, sizeof(buffer),"\n[BRACKET STEP: current = %g: previous = %g (diff = %g). bracket = %g, prec = %g]",
+                                     lastParameterValue,
+                                     previousParameterValue,
+                                     lastParameterValue - previousParameterValue,
+                                     brackStep,
+                                     precisionStep);
+
+                            BufferToConsole (buffer);
+                        }
+
+                    } else {
+                        brackStep     = vH->theData[0];
+                        precisionStep = MAX(0.001,brackStep * 0.1);
+                    }
+
+                    if (brackStep < 1e-4) {
+                        brackStep = 1e-4;
+                    }
+                    if (precisionStep < 1e-6) {
+                        precisionStep = 1e-6;
+                    }
+                } else {
+                    if (amIGlobal)
+                        brackStep = pow(currentPrecision/**(bestVal>1.?pow(e,long(log(bestVal))):1.)*/,
+                                        .5+loopCounter/(indexInd.lLength*(loopCounter/indexInd.lLength+1)));
+                    else {
+                        brackStep = currentPrecision;
+                    }
+                }
+
+                long brackStepSave = bracketFCount,
+                     oneDStepSave  = oneDFCount;
+
+                if (useAdaptiveStep>0.5) {
+                    if (convergenceMode < 2) {
+                        LocateTheBump (j,precisionStep, maxSoFar, bestVal);
+                    } else {
+                        LocateTheBump (j,precisionStep, maxSoFar, bestVal, convergenceMode == 2? 0.001: 0.00001);
+                    }
+                } else {
+                    LocateTheBump (j,brackStep, maxSoFar, bestVal);
+                }
+
+                _Parameter  cj = GetIthIndependent(j),
+                            ch = fabs(bestVal-cj);
+
+
+
+                if (useAdaptiveStep>0.5) {
+                    if (cj != 0.) {
+                        averageChange += fabs (ch/cj);
+                    }
+                    if (ch < precisionStep*0.1 && inCount == 0) {
+                        nc2 << j;
+                    }
+                } else {
+                    averageChange  += ch;
+                    averageChange2 += cj;
+                    if (ch<currentPrecision/indexInd.lLength) {
+                        nc2 << j;
+                    }
+                }
+
+
+                if (vH) {
+                    vH->Store(cj);
+                }
+
+                variableValues[j] = ch;
+
+                if (verbosityLevel>1) {
+                    snprintf (buffer, sizeof(buffer),"\nindex = %ld\tlog(L) = %14.10g\t param value = %10.6g ( diff = %10.6g, bracket = %10.6g, precision %10.6g) EVALS: %ld (BRACKET), %ld (BRENT) ",
+                             j,
+                             maxSoFar,
+                             cj,
+                             ch,
+                             brackStep,
+                             precisionStep,
+                             bracketFCount-brackStepSave,
+                             oneDFCount - oneDStepSave
+                             );
+                    BufferToConsole (buffer);
+                    StringToConsole (*LocateVar(indexInd.lData[j])->GetName());
+                    BufferToConsole (CheckEqual(GetIthIndependentBound (j, true), cj)? ("[Lower bound]") : (CheckEqual(GetIthIndependentBound (j, false),cj) ? "[Upper bound]" : ""));
+                }
+#if defined __UNIX__ && ! defined __HEADLESS__ && !defined __HYPHYQT__ && !defined __HYPHY_GTK__
+                else if (verbosityLevel==1) {
+                    UpdateOptimizationStatus (maxSoFar,-1,1,true,progressFileString);
+                }
+#endif
+
+            }
+
+            if (!forward || doShuffle > 0.1) {
+                nc2.Sort();
+            }
+
+            averageChange2/=indexInd.lLength;                                   // mean of parameter values
+            averageChange/=(_Parameter)(indexInd.lLength-nc2.lLength+1);        // mean of change in parameter values during the last step
+
+            if (glVars.lLength == indexInd.lLength) {
+                noChange.Clear();
+                noChange.Duplicate (&nc2);
+            } else {
+                noChange.Subtract  (nc2,glVars);
+            }
+
+            if (noChange.lLength==0) {
+                noChange << -1;
+            }
+
+
+#if !defined __UNIX__ && ! defined __HEADLESS__
+#ifdef __HYPHYMPI__
+            if (_hy_mpi_node_rank == 0)
+#endif
+                if (feedbackTreePanel)
+                    if (windowObjectRefs.Find ((long)feedbackTreePanel) >= 0) {
+                        feedbackTreePanel->BuildTree (true);
+                        feedbackTreePanel->RenderTree();
+                    } else {
+                        feedbackTreePanel = nil;
+                    }
+#endif
+
+            forward = true;
+            loopCounter+=1;
+            nPercentDone = lastMax-bigLastMax;
+            if (nPercentDone == 0) {
+                nPercentDone = machineEps;
+            }
+
+            sigma = 2.0/nPercentDone;
+            s+= sigma;
+            sX+= sigma*(loopCounter);
+            sXX += sigma*(loopCounter)*(loopCounter);
+            sY+=nPercentDone*sigma;
+            sXY+=(loopCounter)*nPercentDone*sigma;
+
+            if (loopCounter>1.0) {
+                nPercentDone = (sX*sY-s*sXY);
+                if (nPercentDone != 0.0) {
+                    nPercentDone = (sXX*sY-sX*sXY)/nPercentDone;
+                }
+                if (nPercentDone != 0.0) {
+                    nPercentDone = loopCounter/nPercentDone;
+                }
+                nPercentDone -= .05;
+                if ((nPercentDone>0.0)&&(nPercentDone<.9999)) {
+                    nPercentDone = pow (nPercentDone,4)*100.0;
+                    if (nPercentDone>percentDone) {
+                        stayPut = 0;
+                        percentDone = nPercentDone;
+                    } else {
+                        if (percentDone<50.0) {
+                            percentDone+=1.0;
+                        }
+                        stayPut++;
+                    }
+                } else if (percentDone<50.0) {
+                    stayPut++;
+                    percentDone+=1.0;
+                }
+#if !defined __UNIX__ || defined __HEADLESS__ || defined __HYPHYQT__ || defined __HYPHY_GTK__
+                SetStatusBarValue (percentDone,maxSoFar,(likeFuncEvalCallCount-evalsIn)/TimerDifferenceFunction(true));
+#else
+                if (verbosityLevel==1) {
+                    UpdateOptimizationStatus (maxSoFar,percentDone,1,true,progressFileString);
+                }
+#endif
+            }
+            logLHistory.Store(maxSoFar);
+
+            if (verbosityLevel>5) {
+                snprintf (buffer, sizeof(buffer),"\nAverage Variable Change: %g %g %g %g %ld", averageChange, nPercentDone,divFactor,oldAverage/averageChange,stayPut);
+                BufferToConsole (buffer);
+                snprintf (buffer, sizeof(buffer),"\nDiff: %g, Precision: %16.12g, termFactor: %d", maxSoFar-lastMaxValue, precision, termFactor);
+                BufferToConsole (buffer);
+                snprintf (buffer, sizeof(buffer),"\nSmoothing term: %g", smoothingTerm);
+                BufferToConsole (buffer);
+
+            }
+
+            currentPrecision = averageChange/divFactor;
+
+            if(currentPrecision<1e-6) {
+                currentPrecision = 1e-6;
+            } else if (currentPrecision>averageChange2) {
+                currentPrecision = averageChange2;
+            }
+
+            if (maxSoFar-lastMaxValue<=precision/termFactor) {
+                inCount++;
+            } else {
+                inCount = 0;
+            }
+
+            lastMaxValue = maxSoFar;
+
+            if (useAdaptiveStep < 0.5)
+                if (!skipCG && loopCounter&& indexInd.lLength>1 && ( (((long)loopCounter)%indexInd.lLength)==0 )) {
+                    _Matrix             bestMSoFar;
+                    GetAllIndependent   (bestMSoFar);
+                    ConjugateGradientDescent (currentPrecision, bestMSoFar);
+                    logLHistory.Store(maxSoFar);
+                }
+
+            if (hardLimitOnOptimizationValue < INFINITY && TimerDifferenceFunction(true) > hardLimitOnOptimizationValue) {
+                ReportWarning (_String("Optimization terminated before convergence because the hard time limit was exceeded."));
+                break;
+            }
+
+        }
+
+        ReportWarning (_String("Optimization finished in ") & loopCounter & " loop passes.\n" & likeFuncEvalCallCount-evalsIn & " likelihood evaluation calls and " & matrixExpCount - exponentiationsIn & " matrix exponentiations calls were made\n");
+
+        if (optMethod == 7) {
+            _Matrix bestMSoFar (indexInd.lLength,1,false,true);
+            for (i=0; i<indexInd.lLength; i++) {
+                bestMSoFar[i]=GetIthIndependent(i);
+            }
+            ConjugateGradientDescent (currentPrecision*.01, bestMSoFar);
+        }
+
+        DeleteObject (stepHistory);
+
+    } else if (optMethod==1) {
+        SimplexMethod (precision);
+    }
+    if (optMethod==2) {
+        Anneal (precision);
+    }
+
+    _Matrix result (2,indexInd.lLength+indexDep.lLength<3?3:indexInd.lLength+indexDep.lLength, false, true);
+
+    //forceRecomputation = true;
+    result.Store (1,0,Compute());
+    //forceRecomputation = false;
+    result.Store (1,1,indexInd.lLength);
+    i = 0;
+    while (LocateVar(indexInd.lData[i])->IsGlobal()) {
+        i++;
+        if (i==indexInd.lLength) {
+            break;
+        }
+    }
+    result.Store (1,2,i);
+    _PMathObj pm;
+    for (i=0; i<indexInd.lLength; i++) {
+        pm = (LocateVar (indexInd(i)))->Compute();
+        result.Store(0,i,pm->Value());
+    }
+    for (i=0; i<indexDep.lLength; i++) {
+        pm = (LocateVar (indexDep(i)))->Compute();
+        result.Store(0,i+indexInd.lLength,pm->Value());
+    }
+
+    CleanUpOptimize();
+#if !defined __UNIX__ || defined __HEADLESS__
+    SetStatusBarValue (-1,maxSoFar,(likeFuncEvalCallCount-evalsIn)/TimerDifferenceFunction(true));
+#endif
+
+#ifdef      __MACPROFILE__
+    ProfilerDump("\pProfile");
+    ProfilerTerm();
+#endif
+
+    return (_Matrix*)result.makeDynamic();
+}
+
+//_______________________________________________________________________________________
+
+void _LikelihoodFunction::CleanUpOptimize (void)
+{
+
+    categID = 0;
+    CleanupParameterMapping ();
+    //printf ("Done OPT LF eval %d MEXP %d\n", likeFuncEvalCallCount, matrixExpCount);
+#ifdef __HYPHYMPI__
+    if (hyphyMPIOptimizerMode==_hyphyLFMPIModeNone) {
+#endif
+        for (long i=0; i<theTrees.lLength; i++) {
+            _TheTree * cT = ((_TheTree*)(LocateVar(theTrees(i))));
+            cT->CleanUpMatrices();
+            cT->KillTopLevelCache();
+        }
+
+        DeleteCaches (false);
+
+        if (mstCache) {
+            _Parameter      umst = 0.0;
+            checkParameter (useFullMST,umst,0.0);
+            if (umst>.5)
+                for (long kk=0; kk<mstCache->cacheSize.lLength; kk++) {
+                    long cS = mstCache->cacheSize.lData[kk];
+                    if ((cS>0)&&(mstCache->resultCache[kk])) {
+                        _Parameter ** c1 = (_Parameter**)mstCache->resultCache[kk];
+                        for (long k2 = 0; k2<cS; k2++) {
+                            delete c1[k2];
+                        }
+                        delete c1;
+
+                        long ** c2 = (long**)mstCache->statesCache[kk];
+                        for (long k3 = 0; k3<cS; k3++) {
+                            delete c2[k3];
+                        }
+                        delete c2;
+
+                        char ** c3 = (char**)mstCache->statesNCache[kk];
+                        for (long k4 = 0; k4<cS; k4++) {
+                            delete c3[k4];
+                        }
+                        delete c3;
+
+                        ((_SimpleList*)leafSkips(kk))->Clear();
+                        ((_SimpleList*)leafSkips(kk))->Duplicate (mstCache->stashedLeafOrders(kk));
+                        //printf ("\n%s\n", ((_String*)((_SimpleList*)leafSkips(kk))->toStr())->getStr());
+                    }
+                }
+            mstCache->resultCache.Clear();
+            mstCache->statesCache.Clear();
+            mstCache->statesNCache.Clear();
+            mstCache->stashedLeafOrders.Clear();
+        }
+#ifdef __HYPHYMPI__
+    } else {
+        CleanupMPIOptimizer();
+    }
+
+#endif
+
+
+#if defined __UNIX__ && ! defined __HEADLESS__ && !defined __HYPHYQT__ && !defined __HYPHY_GTK__
+    if (verbosityLevel==1) {
+        UpdateOptimizationStatus (0,0,2,true,progressFileString);
+    }
+#endif
+    //printf ("\n%d\n",matrixExpCount);
+    /*printf ("\nOptimization spool:\n");
+     for (i=0; i<indexInd.lLength; i++)
+     {
+     _Variable* vspool = LocateVar (indexInd(i));
+     printf ("%d %s %g\n", i, vspool->GetName()->getStr(), vspool->Compute()->Value());
+     }*/
+
+    setParameter (likeFuncCountVar,likeFuncEvalCallCount);
+    HasPrecisionBeenAchieved (0,true);
+    isInOptimize = false;
+    //DoneComputing();
+    hasBeenOptimized = true;
+    hasBeenSetUp     = 0;
+    lockedLFID       = -1;
+    DeleteObject     (nonConstantDep);
+    nonConstantDep = nil;
+#ifndef __UNIX__
+    divideBy = 0x0fffffff;
+#endif
+}
+
+//_______________________________________________________________________________________
+
+//_LikelihoodFunction*      _LikelihoodFunction::SearchTopologies ()
+// implement a star decomposition type topology search returning the best tree and
+// optimization results for the best tree.
+
+inline  bool CheckOneDStep (_Parameter& val, _Parameter lB, _Parameter uB)
+{
+    if (val<lB) {
+        val = lB;
+    } else if (val>uB) {
+        val = uB;
+    }
+    return true;
+}
+
+//_______________________________________________________________________________________
+bool CheckEqual (_Parameter a, _Parameter b)
+{
+    if (a!=0.0) {
+        a = (a>b)?(a-b)/a:(b-a)/a;
+        return a>0.0 ? a<=machineEps : a>=-machineEps;
+    }
+    return (b<=machineEps)&&(b>=-machineEps);
+}
+
+//_______________________________________________________________________________________
+_Parameter _LikelihoodFunction::SetParametersAndCompute (long index, _Parameter value, _Matrix* baseLine, _Matrix* direction)
+{
+    if (index >= 0) {
+        SetIthIndependent (index,value);
+    } else {
+        if (value < 0) {
+            WarnError ("Internal error in gradient bracket function\n");
+            return -A_LARGE_NUMBER;
+        }
+        _Matrix newValue (*baseLine);
+        newValue.AplusBx (*direction, value);
+        SetAllIndependent (&newValue);
+
+    }
+
+    _Parameter logL = Compute();
+    //if (index >=0)
+    //  printf ("[SetParametersAndCompute %g = %g]\n", value, logL);
+
+    return logL;
+
+    //return Compute();
+}
+
+//_______________________________________________________________________________________
+void _LikelihoodFunction::GetAllIndependent (_Matrix & storage)
+{
+    storage.Clear();
+    CreateMatrix (&storage, indexInd.lLength,1,false,true, false);
+    for (unsigned long i=0; i<indexInd.lLength; i++) {
+        storage.theData[i]=GetIthIndependent(i);
+    }
+
+}
+
+
+//_______________________________________________________________________________________
+long    _LikelihoodFunction::Bracket (long index, _Parameter& left, _Parameter& middle, _Parameter& right,  _Parameter& leftValue, _Parameter& middleValue, _Parameter& rightValue, _Parameter& initialStep, _Matrix* gradient)
+{
+    _Variable* curVar = index >= 0 ? GetIthIndependentVar (index) : nil;
+
+    bool       movingLeft = false,
+               first      = true;
+
+
+    _Parameter lowerBound = curVar?GetIthIndependentBound(index,true):0.,
+               upperBound = curVar?GetIthIndependentBound(index,false):0.,
+               practicalUB,
+               magR = 2.,//1.61803,
+               //r,q,u,d,
+               leftStep  = initialStep*.5,
+               rightStep = initialStep*.5,
+               lastLStep = -1.0,
+               lastRStep = -1.0,
+               saveL     = index<0?middle:NAN,
+               saveM     = index<0?NAN:middle,
+               saveR     = NAN,
+               saveLV    = index<0?middleValue:0.0,
+               saveMV    = index<0?0.0:middleValue,
+               saveRV    = 0.0;
+
+
+
+    _Matrix            currentValues;
+    if (index < 0) {
+        GetAllIndependent                      (currentValues);
+        GetGradientStepBound                   (*gradient, lowerBound, upperBound);
+        if (upperBound < 1e-10) {
+            long freezeCount = 0;
+            GetGradientStepBound                   (*gradient, lowerBound, upperBound, &freezeCount);
+            //printf ("[FREEZE %ld/%g]\n", freezeCount, upperBound);
+            if (freezeCount == 0 || freezeCount == indexInd.lLength || upperBound < 1e-10) {
+                return -2;
+            }
+        }
+        lowerBound                             = 0.;
+    }
+
+    practicalUB = upperBound>DEFAULTPARAMETERUBOUND?DEFAULTPARAMETERUBOUND:upperBound;
+    long               funcCounts = likeFuncEvalCallCount;
+
+
+    if (index >= 0) {
+        middle  =  GetIthIndependent (index);
+    } else {
+        middle  = initialStep;
+    }
+
+    if (lowerBound>middle || upperBound<middle) {
+        middle = (lowerBound+practicalUB) * .5;
+    }
+
+    if (CheckEqual(middle,lowerBound)) {
+        leftStep = initialStep * .2;
+        middle   = lowerBound+leftStep;
+        saveL    = lowerBound;
+        saveLV = middleValue;
+    }
+
+    if (middle == upperBound) {
+        rightStep = initialStep * .2;
+        middle    = upperBound-rightStep;
+        saveR     = upperBound;
+        saveRV = middleValue;
+    }
+
+    if (index < 0) {
+        leftStep = middle;
+    }
+
+    if (saveM != middle) {
+        saveM = NAN;
+    }
+
+
+    /*if (index < 0)
+    {
+        printf                                 ("[Bracket bounds %g - %g (%g)/%g]\n", lowerBound, upperBound, practicalUB, middle);
+        for (unsigned long i = 0; i < indexInd.lLength; i++) {
+            printf ("%s = %.16g\n", GetIthIndependentVar(i)->GetName()->sData, gradient->theData[i]);
+        }
+    }*/
+
+    if (verbosityLevel > 100) {
+        char buf [512];
+        snprintf (buf, sizeof(buf), "\n\t[_LikelihoodFunction::Bracket (index %ld) INITIAL BRACKET %15.12g <= %15.12g (current %15.12g) <= %15.12g]", index, middle-leftStep, middle, index>=0?GetIthIndependent (index):0.0, middle+rightStep);
+        BufferToConsole (buf);
+    }
+
+    /*
+    if (likeFuncEvalCallCount > 0) {
+      printf ("\n\n\nCHECK INDEX 6\n\n\n");
+      SetIthIndependent(6L, GetIthIndependent(6L));
+    }
+    */
+    
+    while (1) {
+
+        while ((middle-leftStep)<lowerBound) {
+            leftStep*=.125;
+            if ((leftStep<initialStep*.1 && index >0) || (index < 0 && leftStep < STD_GRAD_STEP)) {
+                if (!first) {
+                    if (go2Bound>.1) {
+                        middle=lowerBound==0.0?PERTURBATION_OF_ZERO:lowerBound;
+                        middleValue = SetParametersAndCompute (index, middle, &currentValues, gradient);
+                    }
+                    //if (index == 8)
+                    //  printf ("\n[FAIL lowerBound -2 %g]\n", middle);
+                    return -2;
+                } else {
+                    middle=MIN(lowerBound+initialStep*.1,upperBound-rightStep);
+                    first = false;
+                }
+            }
+        }
+
+
+        while ((rightStep+middle)>upperBound) {
+            rightStep*=.125;
+            if ((rightStep<initialStep*.1 && index >0) || (index < 0 && rightStep < STD_GRAD_STEP)) {
+                if (!first) {
+                    if (go2Bound>.1) {
+                        middleValue = SetParametersAndCompute (index, middle=upperBound, &currentValues, gradient);
+                    }
+                    //if (index == 8)
+                    //  printf ("\n[FAIL upperBound -2 %g]\n", middle);
+                    return -2;
+                } else {
+                    middle=MAX(upperBound-initialStep*.1,lowerBound+leftStep);
+                    first = false;
+                }
+            }
+
+        }
+
+
+        
+        if (CheckEqual(middle,saveL)) {
+            middleValue = saveLV;
+        } else if (CheckEqual(middle,saveR)) {
+            middleValue = saveRV;
+        } else if (CheckEqual(middle,saveM)) {
+            middleValue = saveMV;
+        } else {
+             middleValue = SetParametersAndCompute (index, middle, &currentValues, gradient);
+        }
+
+        left = middle-leftStep;
+
+        if (CheckEqual(left,saveL)) {
+            leftValue = saveLV;
+        } else if (CheckEqual(left,saveR)) {
+            leftValue = saveRV;
+        } else if (CheckEqual(left,saveM)) {
+            leftValue = saveMV;
+        } else {
+            leftValue = SetParametersAndCompute (index, left, &currentValues, gradient);
+        }
+
+
+        right = middle+rightStep;
+        if (CheckEqual(right,saveL)) {
+            rightValue = saveLV;
+        } else if (CheckEqual(right,saveR)) {
+            rightValue = saveRV;
+        } else if (CheckEqual(right,saveM)) {
+            rightValue = saveMV;
+        } else {
+            rightValue = SetParametersAndCompute (index, right, &currentValues, gradient);
+        }
+
+        if (verbosityLevel > 100) {
+            char buf [512];
+            snprintf (buf, 512, "\n\t[_LikelihoodFunction::Bracket (index %ld): BRACKET %g (diff: %15.12g) - %g (logL: %15.12g) - %g (diff: %15.12g)]", index, left, leftValue-middleValue, middle, middleValue, right, rightValue-middleValue);
+            BufferToConsole (buf);
+        }
+
+        saveL       = left;
+        saveLV      = leftValue;
+
+        saveM       = middle;
+        saveMV      = middleValue;
+
+        saveR       = right;
+        saveRV      = rightValue;
+
+        lastLStep   = leftStep;
+        lastRStep   = rightStep;
+
+        if (rightValue<=middleValue && leftValue<=middleValue) {
+            //if (index < 0) printf ("\nMaximum found\n");
+            break;
+        }
+
+        // case 1: /
+        if (rightValue>=middleValue && middleValue>=leftValue) {
+            if (movingLeft) {
+                rightStep/=magR;
+            } else {
+                leftStep = rightStep;
+                rightStep*=magR;
+            }
+            middle     = right;
+            movingLeft = false;
+        } else // case 2
+            if (rightValue<=middleValue && middleValue<=leftValue) {
+                if (!movingLeft && !first) {
+                    leftStep/=magR;
+                } else {
+                    rightStep =  leftStep;
+                    leftStep  *= magR;
+                }
+                if (index < 0) {
+                    if (CheckEqual (left, lowerBound)) {
+                        middle    = (middle-lowerBound)*0.5;
+                        leftStep  = middle;
+                        rightStep = middle;
+                    } else {
+                        middle     = left;
+                    }
+                } else {
+                    middle     = left;
+                }
+                movingLeft = true;
+            } else {
+                if (movingLeft) {
+                    middle = left;
+                } else {
+                    middle = right;
+                }
+            }
+
+        if (middle>=practicalUB) {
+            middleValue         = SetParametersAndCompute (index, middle = practicalUB, &currentValues, gradient);
+            //if (index < 0) printf ("\nmiddle>=practicalUB\n");
+            break;
+        }
+        /*
+        if (middle-lowerBound < STD_GRAD_STEP*0.5) {
+            middleValue         = SetParametersAndCompute (index, middle = lowerBound+STD_GRAD_STEP*0.5, &currentValues, gradient);
+            //if (index < 0) printf ("\nmiddle-lowerBound < STD_GRAD_STEP*0.5\n");
+            break;
+        }
+        */
+        first = false;
+
+    }
+
+    if (curVar) {
+        if (CheckAndSetIthIndependent(index,middle)) {
+            middleValue = Compute();
+        }
+    } else {
+        middleValue         = SetParametersAndCompute (index, middle, &currentValues, gradient);
+    }
+
+
+    if (verbosityLevel > 100) {
+        char buf [256];
+        snprintf (buf, 256, "\n\t[_LikelihoodFunction::Bracket (index %ld) BRACKET SUCCESSFUL: %15.12g <= %15.12g <= %15.12g. steps, L=%g, R=%g, values %15.12g : %15.12g - %15.12g]", index, left,middle,right, leftStep, rightStep, leftValue - middleValue, middleValue, rightValue - middleValue);
+        BufferToConsole (buf);
+    }
+
+
+    bracketFCount+=likeFuncEvalCallCount-funcCounts;
+    bracketCount++;
+    return (rightValue<=middleValue && leftValue<=middleValue) ? 0 : -1;
+}
+//_______________________________________________________________________________________
+
+void    _LikelihoodFunction::CheckStep (_Parameter& tryStep, _Matrix vect, _Matrix* selection)
+{
+    for (unsigned long index = 0; index<indexInd.lLength; index++) {
+
+        _Parameter  Bound,
+                    currentValue,
+                    locValue = vect.theData[index];
+
+        if (fabs(locValue)<1e-14) {
+            Bound = GetIthIndependentBound(index,false);
+            locValue = 0.0;
+        } else if (locValue<0) {
+            Bound = GetIthIndependentBound(index,true);
+        } else {
+            Bound = GetIthIndependentBound(index,false);
+        }
+
+
+        if (selection) {
+            currentValue = selection->theData[index];
+        } else {
+            currentValue = GetIthIndependent (index);
+        }
+
+        if (Bound>1000.) {
+            Bound = 1000.;
+        }
+        if (locValue>=0) {
+            while (currentValue+locValue*tryStep>Bound-1e-8) {
+                tryStep/=5;
+                if (tryStep<1e-8) {
+                    tryStep = 0.;
+                    return;
+                }
+            }
+        } else {
+            while (currentValue+locValue*tryStep<Bound+1e-8) {
+                tryStep/=5;
+                if (tryStep<1e-8) {
+                    tryStep = 0.;
+                    return;
+                }
+            }
+        }
+    }
+}
+
+//_______________________________________________________________________________________
+
+_PMathObj   _LikelihoodFunction::CovarianceMatrix (_SimpleList* parameterList)
+{
+    if (indexInd.lLength==0) {
+        return nil;
+    }
+
+    _Parameter  h = 1.e-5,//STD_GRAD_STEP,
+                functionValue,
+                t1,
+                t2,
+                cm; // small h and L(x_opt)
+
+    checkParameter (covariancePrecision,cm,1.0);
+
+    long        i = parameterList?parameterList->lLength:indexInd.lLength,
+                j;
+
+    PrepareToCompute();
+
+    functionValue = Compute();
+    _Variable      *thisVar;
+
+    bool        useIndirectIndexing = false;
+
+    if (parameterList) {
+        useIndirectIndexing = true;
+    } else {
+        parameterList = &indexInd;
+    }
+
+    if (cm<1.)
+        // use likelihood profile with the appropriate signifcance level
+    {
+        _Matrix     sigLevels  (i,7,false,true);
+
+        // find the appropriate significance level for chi2
+
+        {
+            _String xxc ("_xx_");
+            thisVar = CheckReceptacle (&xxc, empty);
+            thisVar->SetBounds (-1.e30,1.e30);
+        }
+
+        if (cm>0.0) {
+
+            _String     fString = _String ("CChi2(_xx_,1)-") & cm;
+            _Formula    CChi2Fla (fString,nil);
+            t1 = CChi2Fla.Brent (thisVar,0,0);
+            if (fabs(CChi2Fla.Compute()->Value())>1.e-6) {
+                _String errMsg ("Failed to compute chi-square significance level in call to CovarianceMatrix");
+                WarnError (errMsg);
+                DoneComputing();
+                return    (_PMathObj)sigLevels.makeDynamic();
+            }
+        } else {
+            if (cm<0.0) {
+                t1 = -2.*cm;
+            } else {
+                _String errMsg ("Must have a non-zero COVARIANCE_PRECISION in call to CovarianceMatrix.");
+                WarnError (errMsg);
+                DoneComputing();
+                return    (_PMathObj)sigLevels.makeDynamic();
+            }
+        }
+
+#if defined __MAC__ || defined __WINDOZE__ || defined __HYPHYQT__ || defined __HYPHY_GTK__
+        _Parameter totalCount    = 2*parameterList->lLength;
+
+        long       finishedCount = 0;
+
+        TimerDifferenceFunction  (false);
+        DecideOnDivideBy (this);
+#endif
+
+
+        thisVar->SetNumericValue (t1);
+
+
+        /* ____________________________________ NEW CODE BY AFYP _____________________________________ */
+        long        mastodon    = likeFuncList._SimpleList::Find((long)this);
+        _String *   myName;
+
+        if (mastodon < 0) {
+            mastodon    = scfgList._SimpleList::Find((long)this);
+            myName      = (_String *) scfgNamesList (mastodon);
+
+        } else {
+            // generate HBL
+            myName      = (_String*)likeFuncNamesList (mastodon);
+        }
+
+        _String     fString     = _String("function _profileFit(_xxv_,_variableIndex){SetParameter(")&*myName&",_variableIndex,_xxv_);LFCompute("
+                                  //    &*myName&(",_xxres);  fprintf (stdout,\"\\n\",_xxv_,\" \",_xxres);  return _xxres;}");
+                                  &*myName&(",_xxres);return _xxres;}");
+                                  
+
+
+        /* ___________________________________ ! NEW CODE BY AFYP ____________________________________ */
+
+
+        t1 = functionValue-.5*t1;
+
+        _ExecutionList exL (fString);
+        exL.Execute ();
+
+        for (i=0; i<parameterList->lLength; i++) {
+            j = useIndirectIndexing?parameterList->lData[i]:i;
+            t2 = GetIthIndependent (j);
+            _Variable* thisVar2 = LocateVar (indexInd.lData[j]);
+            thisVar->SetBounds (thisVar2->GetLowerBound(),thisVar2->GetUpperBound());
+            sigLevels.Store (i,1,t2);
+
+            char buffer[255];
+            snprintf (buffer, sizeof(buffer),"%.14g",t1);
+
+            fString = _String("_profileFit(_xx_,") & j & ")-(" & buffer& ')';
+            _Formula    FitFla (fString,nil);
+            if (CheckEqual(t2,thisVar2->GetLowerBound())) {
+                sigLevels.Store (i,0,t2);
+            } else {
+                h = FitFla.Brent (thisVar,t2+1,t2,t2*0.0001+0.000001);
+                //sigLevels.Store (i,0,MAX(h,thisVar2->GetLowerBound()));
+                 if (h <= thisVar2->GetLowerBound()) {
+                  _String lf_buffer ("_xxres");
+                  snprintf (buffer, sizeof(buffer),"%.14g",FetchVar(LocateVarByName(lf_buffer))->Value() + 0.0001);
+                  lf_buffer = _String("_profileFit(_xx_,") & j & ")-(" & buffer& ')';
+                  _Formula try_again (lf_buffer,nil);
+                  h = try_again.Brent (thisVar,t2+1,t2,t2*0.0001+0.000001);
+                  sigLevels.Store (i,5,h);
+                  sigLevels.Store (i,0,thisVar2->GetLowerBound());
+
+                } else {
+                  sigLevels.Store (i,0,h);
+                  sigLevels.Store (i,5,h);
+                }
+           }
+            
+            snprintf (buffer, sizeof(buffer),"%.14g",sigLevels (i,0));
+            _String checkLFDIFF = _String("CChi2(2*(-_profileFit(") & buffer & "," & j & ")+(" & functionValue & ")),1)";
+            _PMathObj lf_diff = (_PMathObj) _FString (checkLFDIFF, false).Evaluate(_hyDefaultExecutionContext);
+            sigLevels.Store (i,3,lf_diff->Value());
+            DeleteObject (lf_diff);
+
+#ifndef __UNIX__
+            finishedCount += 1;
+            if (TimerDifferenceFunction(true)>1.) {
+                SetStatusBarValue (finishedCount/totalCount*100.,1,0);
+                TimerDifferenceFunction (false);
+            }
+#endif
+
+
+            if (CheckEqual(t2,thisVar2->GetUpperBound())) {
+                sigLevels.Store (i,2,t2);
+            } else {
+                //_List store_evals;
+                h = FitFla.Brent (thisVar,t2,t2,t2*0.0001+0.000001);//, &store_evals);
+                if (h >= thisVar2->GetUpperBound()) {
+                  _String lf_buffer ("_xxres");
+                  snprintf (buffer, sizeof(buffer),"%.14g",FetchVar(LocateVarByName(lf_buffer))->Value() + 0.0001);
+                  lf_buffer = _String("_profileFit(_xx_,") & j & ")-(" & buffer& ')';
+                  _Formula try_again (lf_buffer,nil);
+                  h = try_again.Brent (thisVar, t2,t2,t2*0.0001+0.000001);
+                  sigLevels.Store (i,6,h);
+                  sigLevels.Store (i,2,thisVar2->GetUpperBound());
+
+                } else {
+                  sigLevels.Store (i,2,h);
+                  sigLevels.Store (i,6,h);
+                }
+            }
+
+             snprintf (buffer, sizeof(buffer),"%.14g",sigLevels (i,2));
+             checkLFDIFF =_String("CChi2(2*(-_profileFit(") & buffer & "," & j & ")+(" & functionValue & ")),1)";
+             lf_diff = (_PMathObj) _FString (checkLFDIFF, false).Evaluate(_hyDefaultExecutionContext);
+             sigLevels.Store (i,4,lf_diff->Value());
+             DeleteObject (lf_diff);
+
+#ifndef __UNIX__
+            finishedCount += 1;
+            if (TimerDifferenceFunction(true)>1.) {
+                SetStatusBarValue (finishedCount/totalCount*100.,1,0);
+                TimerDifferenceFunction (false);
+            }
+#endif
+
+            SetIthIndependent (j,t2);
+        }
+
+        DoneComputing();
+        return  (_PMathObj)sigLevels.makeDynamic();
+    }
+
+    _Matrix     hessian    (i,i,false,true),
+                funcValues (i,5,false,true),
+                *iMap = nil;
+
+    _AssociativeList * mapMethod = nil;
+
+    _Parameter      uim = 0.0;
+    checkParameter  (useIntervalMapping, uim, 0.0);
+
+    if (uim > 0.5) {
+        iMap = new _Matrix (i,3,false,true);
+        mapMethod = new _AssociativeList;
+
+        checkPointer (iMap);
+        checkPointer (mapMethod);
+
+    }
+    // y,x',x''
+    // first check for boundary values and move the parameter values a bit if needed
+    for (i=0; i<parameterList->lLength; i++) {
+        long     dIndex = useIndirectIndexing?parameterList->lData[i]:i;
+        thisVar = LocateVar (indexInd.lData[dIndex]);
+        t1 = thisVar->Value();
+        funcValues.Store (i,3,t1);
+
+        _Parameter locH = 1./131072.; //*(t1>10.?exp(log(10.)*((long)log(t1)/log(10.))):1.);
+
+        if (locH<1e-7) {
+            locH = 1e-7;
+        }
+
+        /*_Parameter locH = 1./1024.,
+                   tryH = locH * 0.25,
+                   dv1,
+                   dv2,
+                   lastErr = 1e100;
+
+        SetIthIndependent (dIndex, t1+locH);
+        dv1 = Compute();
+        SetIthIndependent (dIndex, t1-locH);
+        dv1 += Compute()-2.*functionValue;
+        dv1 /= 4.*locH*locH;
+
+        while (tryH >= 1e-12)
+        {
+            SetIthIndependent (dIndex, t1+tryH);
+            dv2 = Compute ();
+            SetIthIndependent (dIndex, t1-tryH);
+            dv2 += Compute ()-2.*functionValue;
+            dv2 /= 4.*tryH*tryH;
+            _Parameter err = fabs (dv2-dv1) / MAX (fabs(dv2), fabs(dv1));
+            if (err > lastErr)
+                break;
+            else
+                lastErr = err;
+            dv1 = dv2;
+            locH = tryH;
+            tryH *= 0.25;
+        }*/
+
+
+        funcValues.Store (i,4,(locH+t1)-t1);
+
+        if (t1+locH > thisVar->GetUpperBound()) {
+            SetIthIndependent (dIndex,thisVar->GetUpperBound()-2.0*locH);
+        } else if (t1-locH < thisVar->GetLowerBound()) {
+            SetIthIndependent (dIndex,thisVar->GetLowerBound()+2.0*locH);
+        }
+
+        if (uim > 0.5) {
+            _Parameter      lb  = thisVar->GetLowerBound(),
+                            ub  = thisVar->GetUpperBound(),
+                            y ,
+                            dy2,
+                            dy;
+
+            _FString        varKeyName (*thisVar->GetName());
+            _Constant       varMapMethod;
+
+            if (CheckEqual (lb, DEFAULTPARAMETERLBOUND) && CheckEqual (ub, DEFAULTPARAMETERUBOUND))
+                // use exp<->log map
+            {
+                y = log (t1-lb);
+                dy = exp(y);
+                dy2 = dy;
+                varMapMethod.SetValue(1.);
+            }
+            // use logistic map
+            else {
+                y   = (t1-lb)/(ub-lb);
+                t1  = y/(1-y);
+                y   = log (t1);
+                dy  = (ub-lb)*(t1/(t1+1)/(t1+1));
+                dy2 = dy*((1-t1*t1)/(t1+1)/(t1+1));
+                varMapMethod.SetValue(2.);
+            }
+            iMap->Store(i,0,y);
+            iMap->Store(i,1,dy);
+            iMap->Store(i,2,dy2);
+            mapMethod->MStore (&varKeyName, &varMapMethod, true);
+        }
+    }
+
+
+
+#if defined __MAC__ || defined __WINDOZE__ || defined __HYPHYQT__ || defined __HYPHY_GTK__
+    _Parameter totalCount    = 2*parameterList->lLength;
+
+    long       finishedCount = 0;
+
+    if (cm>1.1) {
+        totalCount += 2*parameterList->lLength*(parameterList->lLength-1);
+    } else {
+        totalCount += (parameterList->lLength*(parameterList->lLength-1)/2);
+    }
+
+    DecideOnDivideBy (this);
+#endif
+
+    // fill in funcValues with L(...,x_i\pm h,...) and 1st derivatives and get 2nd derivatives
+    for (i=0; i<parameterList->lLength; i++) {
+        long              pIdx = useIndirectIndexing?parameterList->lData[i]:i;
+
+        _Parameter        pVal = GetIthIndependent (pIdx),
+                          d1,
+                          locH = funcValues (i,4);
+
+        SetIthIndependent (pIdx,pVal-locH); // - step
+        t1 = Compute();
+        funcValues.Store (i,0,t1);
+        SetIthIndependent (pIdx,pVal+locH); // + step
+        t2 = Compute();
+        funcValues.Store (i,1,t2);          // reset value
+        SetIthIndependent (pIdx,pVal);
+        d1 = (t2-t1)/(2.0*locH);
+        // central 1st derivative
+        funcValues.Store (i,2,d1);
+
+        t1  = ((t1-functionValue)+(t2-functionValue))/(locH*locH);
+        // Standard central second derivative
+
+        if (uim < 0.5) {
+            hessian.Store (i,i,-t1);
+        } else {
+            hessian.Store (i,i,-(t1*(*iMap)(i,1)*(*iMap)(i,1)+(*iMap)(i,2)*d1));
+        }
+
+#ifndef __UNIX__
+        finishedCount += 2;
+        if (TimerDifferenceFunction(true)>1.) {
+            SetStatusBarValue (finishedCount/totalCount*100.,1,0);
+            TimerDifferenceFunction (false);
+        }
+#endif
+    }
+
+
+    if (cm>1.1) {
+        // fill in off-diagonal elements using the f-la
+        // f_xy = 1/4h^2 (f(x+h,y+h)-f(x+h,y-h)+f(x-h,y-h)-f(x-h,y+h))
+
+        for (i=0; i<parameterList->lLength-1; i++) {
+            long        iidx = useIndirectIndexing?parameterList->lData[i]:i;
+
+            _Parameter  ival  = GetIthIndependent(iidx),
+                        locHi = 1/8192.;//funcValues (i,4);
+
+            for (j=i+1; j<parameterList->lLength; j++) {
+                long        jidx = useIndirectIndexing?parameterList->lData[j]:j;
+
+                _Parameter  jval  = GetIthIndependent(jidx),
+                            locHj = locHi, //funcValues (j,4),
+                            a, // f (x+h,y+h)
+                            b, // f (x+h,y-h)
+                            c, // f (x-h,y-h)
+                            d; // f (x-h,y+h)
+
+                SetIthIndependent (iidx,ival+locHi);
+                SetIthIndependent (jidx,jval+locHj);
+                a = Compute();
+                SetIthIndependent (jidx,jval-locHj);
+                b = Compute();
+                SetIthIndependent (iidx,ival-locHi);
+                c = Compute();
+                SetIthIndependent (jidx,jval+locHj);
+                d = Compute();
+
+                t2 = (a-b-d+c)/(4*locHi*locHj);
+
+                if (uim > 0.5) {
+                    t2 *= (*iMap)(i,1)*(*iMap)(j,1);
+                }
+
+                hessian.Store (i,j,-t2);
+                hessian.Store (j,i,-t2);
+                SetIthIndependent (iidx,ival);
+                SetIthIndependent (jidx,jval);
+#ifndef __UNIX__
+                finishedCount += 4;
+                if (TimerDifferenceFunction(true)>1.) {
+                    SetStatusBarValue (finishedCount/totalCount*100.,1,0);
+                    TimerDifferenceFunction (false);
+                }
+#endif
+            }
+        }
+
+    } else {
+        // fill in off-diagonal elements using the f-la
+        // f_xy = 1/h^2 (f(x+h,y+h)-f(x)-f_x h -f_y h -.5h^2(f_xx+f_yy))
+
+        if (CheckEqual(cm,1.)) {
+            for (i=0; i<parameterList->lLength-1; i++) {
+                _Parameter t3 = GetIthIndependent(useIndirectIndexing?parameterList->lData[i]:i),
+                           t5 = hessian(i,i),
+                           t6 = funcValues(i,2);
+
+                SetIthIndependent (useIndirectIndexing?parameterList->lData[i]:i,t3+h);
+                for (j=i+1; j<parameterList->lLength; j++) {
+                    _Parameter t4 = GetIthIndependent(useIndirectIndexing?parameterList->lData[j]:j);
+                    SetIthIndependent (useIndirectIndexing?parameterList->lData[j]:j,t4+h);
+                    t1 = Compute();
+                    t2 = (t1-functionValue-(t6+funcValues(j,2)-.5*(t5+hessian(j,j))*h)*h)/(h*h);
+                    hessian.Store (i,j,-t2);
+                    hessian.Store (j,i,-t2);
+                    SetIthIndependent (useIndirectIndexing?parameterList->lData[j]:j,t4);
+#ifndef __UNIX__
+                    finishedCount ++;
+                    if (TimerDifferenceFunction(true)>1.) {
+                        SetStatusBarValue (finishedCount/totalCount*100.,1,0);
+                        TimerDifferenceFunction (false);
+                    }
+#endif
+                }
+                SetIthIndependent (useIndirectIndexing?parameterList->lData[i]:i,t3);
+            }
+        }
+    }
+    // undo changes to var values if needed
+
+    DoneComputing();
+
+    if (iMap) {
+        DeleteObject (iMap);
+        setParameter (intervalMappingMethod, mapMethod);
+        DeleteObject (mapMethod);
+    }
+
+    for (i=0; i<parameterList->lLength; i++) {
+        t1 = funcValues(i,3);
+        t2 = GetIthIndependent (useIndirectIndexing?parameterList->lData[i]:i);
+        if (!CheckEqual (t1,t2)) {
+            SetIthIndependent (useIndirectIndexing?parameterList->lData[i]:i,t1);
+        }
+    }
+    return hessian.Inverse();
+    //return (_Matrix*)hessian.makeDynamic();
+}
+
+//_______________________________________________________________________________________
+
+void    _LikelihoodFunction::GetGradientStepBound (_Matrix& gradient,_Parameter& left, _Parameter& right, long * freezeCount)
+{
+    left = right = DEFAULTPARAMETERUBOUND;
+
+    if (freezeCount) {
+        *freezeCount = 0;
+    }
+
+    for (unsigned long i = 0; i < indexInd.lLength; i++) {
+        _Parameter directionalStep = gradient.theData[i];
+        if (directionalStep) {
+            _Parameter currentValue = GetIthIndependent (i),
+                       ub                       = GetIthIndependentBound (i,false)-currentValue,
+                       lb                       = currentValue-GetIthIndependentBound (i,true);
+
+            //if (ub < 1e-10 || lb < 1e-10)
+            //  printf ("[HIT BOUNDARY AT %s; %g, %g]\n", cv->GetName()->sData, lb, ub);
+
+            if (directionalStep > 0.0) {
+                ub /= directionalStep;
+                lb /= directionalStep;
+            } else {
+                currentValue = -lb/directionalStep;
+                lb = -ub/directionalStep;
+                ub = currentValue;
+            }
+
+            left  = MIN(left, lb);
+            if (ub < 1e-6 && freezeCount) {
+                (*freezeCount) ++;
+                gradient.theData[i] = 0.;
+            } else {
+                right = MIN(right, ub);
+            }
+        }
+    }
+
+    if (left < 1.-8) {
+        left = 0.;
+    }
+    if (right < 1.-8) {
+        right = 0.;
+    }
+
+    left = -left;
+}
+
+//_______________________________________________________________________________________
+
+void    _LikelihoodFunction::ComputeGradient (_Matrix& gradient, _Matrix&unit,  _Parameter& gradientStep, _Matrix& values,_SimpleList& freeze, long order, bool normalize)
+{
+    _Parameter funcValue;
+
+    //CheckStep     (gradientStep,unit,&values);
+    /*if (order>1)
+    {
+        _Matrix nG (unit);
+        nG*=-1;
+        CheckStep (gradientStep,nG,&values);
+    }
+    if (gradientStep==0)
+        return;*/
+
+    if (order==1) {
+        funcValue = Compute();
+        for (long index=0; index<indexInd.lLength; index++) {
+            if (freeze.Find(index)!=-1) {
+                gradient[index]=0.;
+            } else {
+                //_Variable  *cv            = GetIthIndependentVar (index);
+                _Parameter currentValue = GetIthIndependent(index),
+                           ub           = GetIthIndependentBound(index,false)-currentValue,
+                           lb            = currentValue-GetIthIndependentBound(index,true),
+                           testStep    = MAX(currentValue * gradientStep,gradientStep);
+
+                if (testStep >= ub)
+                    if (testStep < lb) {
+                        testStep = -testStep;
+                    } else if (ub > lb) {
+                        testStep = ub;
+                    } else if (lb >= ub)
+                        if (lb == 0.) {
+                            testStep = 0.;
+                        } else {
+                            testStep = -lb;
+                        }
+
+                if (testStep) {
+                    SetIthIndependent(index,currentValue+testStep);
+                    gradient[index]=(Compute()-funcValue)/testStep;
+                    SetIthIndependent(index,currentValue);
+                } else {
+                    gradient[index]= 0.;
+                }
+
+                /*if (verbosityLevel > 50)
+                {
+                    printf ("[GRADIENT @ %s, [%g-%g-%g], %g. der = %g]\n", cv->GetName()->sData, lb, currentValue, ub, testStep, gradient[index]);
+                }*/
+            }
+        }
+    } else {
+        for (long index=0; index<indexInd.lLength; index++) {
+            if (freeze.Find(index)!=-1) {
+                gradient[index]=0.;
+            } else {
+                SetIthIndependent(index,GetIthIndependent(index)-gradientStep);
+                _Parameter temp = Compute();
+                SetIthIndependent(index,GetIthIndependent(index)+2*gradientStep);
+                gradient[index]=(Compute()-temp)/gradientStep/2;
+                SetIthIndependent(index,GetIthIndependent(index)-gradientStep);
+            }
+        }
+
+    }
+
+
+    // normalize the gradient
+    if (normalize) {
+        funcValue = 0.;
+        for (long index=0; index<indexInd.lLength; index++) {
+            funcValue+=gradient.theData[index]*gradient.theData[index];
+        }
+
+        //printf ("%10.10g\n",  funcValue);
+
+        if (CheckEqual (funcValue,0.0)) {
+            return;
+        }
+
+        funcValue = 1/sqrt(funcValue);
+        for (long index=0; index<indexInd.lLength; index++) {
+            gradient[index]*=funcValue;
+        }
+    }
+}
+//_______________________________________________________________________________________
+
+bool    _LikelihoodFunction::SniffAround (_Matrix& values, _Parameter& bestSoFar, _Parameter& step)
+{
+    for (long index = 0; index<indexInd.lLength; index++) {
+
+        _Parameter lowerBound       = GetIthIndependentBound(index, true),
+                   tryStep          = step,
+                   funcValue,
+                   upperBound       = GetIthIndependentBound(index, false),
+                   practicalUB      = upperBound>1000?1000:upperBound,
+                   val              = GetIthIndependent     (index);
+
+        // try moving backwards
+        while (val-tryStep<lowerBound+1e-8) {
+            tryStep/=2;
+            if (tryStep<1e-8) {
+                break;
+            }
+        }
+        if (tryStep>=1e-8) {
+            SetIthIndependent(index,val-tryStep);
+            funcValue = Compute();
+            if (funcValue>bestSoFar) {
+                bestSoFar = funcValue;
+                values[index]=val-tryStep;
+                return true;
+            }
+
+        }
+        tryStep = step  ;
+        while (val+tryStep>practicalUB-1e-8) {
+            tryStep/=2;
+            if (tryStep<1e-8) {
+                break;
+            }
+        }
+        if (tryStep>=1e-8) {
+            SetIthIndependent(index,val+tryStep);
+            funcValue = Compute();
+            if (funcValue>bestSoFar) {
+                bestSoFar = funcValue;
+                values[index]=val-tryStep;
+                return true;
+            }
+
+        }
+        SetIthIndependent(index,val);
+
+
+    }
+    return false;
+}
+
+//_______________________________________________________________________________________
+
+void    _LikelihoodFunction::ConjugateGradientDescent (_Parameter precision, _Matrix& bestVal, bool localOnly, long iterationLimit, _SimpleList* only_these_parameters, _Parameter check_value) {
+
+    _Parameter  gradientStep     = STD_GRAD_STEP,
+                temp,
+                maxSoFar          = Compute(),
+                initial_value     = maxSoFar,
+                currentPrecision = localOnly?precision:.01;
+                
+    if (check_value != A_LARGE_NUMBER) {
+      if (!CheckEqual(check_value, maxSoFar)) {
+        ReportWarning (_String("Internal error in _LikelihoodFunction::ConjugateGradientDescent. The function evaluated at current parameter values [") & check_value & "] does not match the last recorded LF maximum [" & maxSoFar & "]");
+        //return;
+      }
+    }
+    
+
+    _SimpleList freeze;
+
+    if (only_these_parameters) {
+        only_these_parameters->Sort();
+        _SimpleList all (indexInd.lLength,0,1);
+        freeze.Intersect (all, *only_these_parameters);
+    }
+            
+    
+    
+    _Matrix     unit     (bestVal),
+                gradient (bestVal);
+
+    long        vl = verbosityLevel;
+
+    char        buffer[1024];
+
+    unit.PopulateConstantMatrix (1.);
+
+    if (vl>1) {
+        snprintf (buffer, sizeof(buffer),"\nConjugate Gradient Pass %d, precision %g, gradient step %g, max so far %15.12g\n",0,precision,gradientStep,maxSoFar);
+        BufferToConsole (buffer);
+    }
+
+    _Matrix     G (bestVal),
+                H (bestVal),
+                S (bestVal);
+
+    _Parameter  gradL;
+
+    ComputeGradient     (gradient, unit, gradientStep, bestVal, freeze, 1, false);
+
+    gradL = gradient.AbsValue ();
+
+
+    if (gradL != 0.0) {
+
+        gradient            *= -1.;
+        G.Duplicate         (&gradient);
+        H.Duplicate         (&gradient);
+
+        for (long index = 0; index<200 && index < iterationLimit; index++, currentPrecision/=4) {
+            temp = maxSoFar;
+
+            if (currentPrecision < 0.00001) {
+                currentPrecision = 0.00001;
+            }
+
+            S      = gradient;
+            S     *= -1./gradient.AbsValue();
+            GradientLocateTheBump(localOnly?precision:currentPrecision, maxSoFar, bestVal, S);
+
+            if (vl>1) {
+                snprintf (buffer, sizeof(buffer),"Conjugate Gradient Pass %ld, precision %g, gradient step %g, max so far %15.12g\n",index+1,precision,gradientStep,maxSoFar);
+                BufferToConsole (buffer);
+            }
+            if (localOnly) {
+                if (fabs((maxSoFar-temp))<=precision) {
+                    break;
+                }
+            } else if (fabs((maxSoFar-temp)/maxSoFar)<=precision) {
+                break;
+            }
+
+            ComputeGradient (gradient, unit, gradientStep, bestVal, freeze, 1, false);
+            gradL =gradient.AbsValue ();
+            if (CheckEqual(gradL,0.0)) {
+                break;
+            }
+            S      = gradient;
+            //gradL  = S.AbsValue();
+            //S   *= 1.;
+
+            _Parameter      gg  = 0.,
+                            dgg = 0.;
+
+            for (unsigned long k = 0; k < indexInd.lLength; k++) {
+                gg  += G.theData[k]*G.theData[k];
+                dgg += (S.theData[k] + G.theData[k])*S.theData[k];
+            }
+
+            if (gg == 0.) {
+                break;
+            }
+
+            dgg /= gg;
+
+
+            for (unsigned long k = 0; k < indexInd.lLength; k++) {
+                G.theData[k] = -S.theData[k];
+                gradient.theData[k] = H.theData[k] = G.theData[k] + dgg * H.theData[k];
+            }
+            //printf ("%s %s\n", _String((_String*)S.toStr()).sData, _String((_String*)gradient.toStr()).sData);
+
+
+            if (terminateExecution) {
+                return;
+            }
+#if !defined __UNIX__ && !defined __HEADLESS__
+            if (feedbackTreePanel)
+                if (windowObjectRefs.Find ((long)feedbackTreePanel) >= 0) {
+                    feedbackTreePanel->BuildTree (true);
+                    feedbackTreePanel->RenderTree();
+                } else {
+                    feedbackTreePanel = nil;
+                }
+#endif
+        }
+    }
+
+    SetAllIndependent (&bestVal);
+    if (maxSoFar < initial_value && CheckEqual(maxSoFar, initial_value) == false) {
+        WarnError (_String("Internal optimization error in _LikelihoodFunction::ConjugateGradientDescent. Worsened likelihood score from ") & initial_value & " to " & maxSoFar);
+    }
+
+    if (vl>1) {
+        BufferToConsole("\n");
+    }
+
+}
+
+//_______________________________________________________________________________________
+
+void    _LikelihoodFunction::GradientDescent (_Parameter& gPrecision, _Matrix& bestVal)
+{
+
+    _Parameter      currentPrecision = 0.1,
+                    gradientStep     = STD_GRAD_STEP,
+                    temp,
+                    tryStep,
+                    maxSoFar = Compute(),
+                    bestTry;
+
+    _SimpleList     leastChange,
+                    freeze,
+                    countLC;
+
+    _Matrix         unit     (bestVal),
+                    gradient (bestVal);
+
+    long            vl = verbosityLevel,
+                    index;
+
+    for (index=0; index<unit.GetHDim(); index++) {
+        unit[index]=1;
+    }
+
+    while (currentPrecision>=gPrecision && freeze.lLength<indexInd.lLength) {
+
+        gradientStep = STD_GRAD_STEP;
+        if (terminateExecution) {
+            return;
+        }
+
+        char    buffer[128];
+        ComputeGradient (gradient, unit, gradientStep, bestVal, freeze, 1);
+        if (gradientStep==0) {
+            break;
+        }
+        bool done = false;
+        bestTry = tryStep = currentPrecision;
+        while(!done) {
+            CheckStep (tryStep,gradient, &bestVal);
+            if (tryStep == 0.0) {
+                long wereFrozen = freeze.lLength;
+                for (index=0; index<indexInd.lLength; index++) {
+                    if (freeze.Find(index)>=0) {
+                        continue;
+                    }
+
+                    if ((GetIthIndependent(index)-GetIthIndependentBound(index,true)<1.0e-20)
+                            && (gradient(0,index)<0.0)) {
+                        freeze<<index;
+                        break;
+                    }
+                    if ((-GetIthIndependent(index)+GetIthIndependentBound(index,false)<1.0e-20)
+                            && (gradient(0,index)>0.0)) {
+                        freeze<<index;
+                        break;
+                    }
+                }
+
+                tryStep = currentPrecision;
+                if (freeze.lLength==wereFrozen) {
+                    return;
+                }
+                break;
+            }
+            for (index=0; index<indexInd.lLength; index++) {
+                SetIthIndependent(index,bestVal(0,index)+tryStep*gradient(index,0));
+            }
+            temp = Compute();
+
+            if (temp>maxSoFar) {
+                if (vl>=5) {
+                    snprintf (buffer, sizeof(buffer),"\nMoving down along the gradient with step %g value %g", tryStep, temp);
+                    BufferToConsole (buffer);
+                }
+                _Matrix delta;
+                delta = gradient;
+                delta*=tryStep;
+                if ((temp-maxSoFar)/fabs(maxSoFar)<gPrecision) {
+                    maxSoFar = temp;
+                    bestVal += delta;
+                    return;
+                }
+
+                maxSoFar = temp;
+                bestVal += delta;
+                //see which variable changed the least
+                temp = A_LARGE_NUMBER;
+                long  suspect,f;
+                for (long i = 0; i<indexInd.lLength; i++) {
+                    if (fabs(delta(i,0))<temp) {
+                        if (freeze.Find(i)!=-1) {
+                            continue;
+                        }
+                        temp = fabs(delta(i,0));
+                        suspect = i;
+                    }
+
+                }
+
+                f = leastChange.Find(suspect);
+                if (f==-1) {
+                    leastChange<<suspect;
+                    countLC<<1;
+                }
+
+                if (tryStep<currentPrecision/10) {
+                    currentPrecision/=10;
+                } else {
+                    tryStep*=2;
+                }
+                done = true;
+            } else {
+                tryStep/=10;
+                if (tryStep<gPrecision) {
+                    for (index=0; index<indexInd.lLength; index++) {
+                        SetIthIndependent(index,bestVal(0,index));
+                    }
+                    if (leastChange.lLength) {
+                        SortLists(&leastChange, &countLC);
+                        if (vl>=5) {
+                            snprintf (buffer, sizeof(buffer),"\nFreezing Variable %ld",leastChange(leastChange.lLength-1));
+                            BufferToConsole (buffer);
+                        }
+                        freeze<<leastChange(leastChange.lLength-1);
+                        leastChange.Delete (leastChange.lLength-1);
+                        countLC.Delete (countLC.lLength-1);
+                        currentPrecision = sqrt(gPrecision);
+                        done = true;
+                        break;
+                    }
+                    currentPrecision=0;
+                    break;
+                }
+                if (vl>=5) {
+                    snprintf (buffer, sizeof(buffer),"\nShrinking step to %g (%g %g)", tryStep, tryStep, gPrecision);
+                    BufferToConsole (buffer);
+                }
+            }
+        }
+    }
+}
+
+
+
+//_______________________________________________________________________________________
+
+void    _LikelihoodFunction::GradientLocateTheBump (_Parameter gPrecision, _Parameter& maxSoFar, _Matrix& bestVal, _Matrix& gradient)
+{
+    DetermineLocalUpdatePolicy           ();
+    _Parameter  leftValue   = maxSoFar,
+                middleValue = maxSoFar,
+                rightValue  = maxSoFar,
+                initialValue = maxSoFar,
+                bp          = gPrecision*0.1,
+                lV = 0., rV = 0., ms = 0.;
+
+    _Matrix                     left        ;
+    GetAllIndependent               (left);
+    _Matrix         right           (left),
+                    middle          (left),
+                    newMiddle       (left);
+                
+   // _GrowingVector brentHistory; 
+
+
+    middle = bestVal;
+
+    int  outcome = Bracket(-1, lV,ms,rV,leftValue, middleValue, rightValue,bp, &gradient);
+    if (middleValue < initialValue) {
+        SetAllIndependent (&bestVal);
+        FlushLocalUpdatePolicy();
+        return;    
+    }
+    
+    if (outcome >=0 && (leftValue > middleValue || rightValue > middleValue)) {
+        WarnError (_String ("Internal error in  _LikelihoodFunction::GradientLocateTheBump: bracket reported successful (") & (long)outcome & "), but likelihood values are inconsistent with it. " & leftValue & " / " & middleValue & " / " & rightValue & " initial value = " & maxSoFar);
+        return;
+    }
+
+    //printf ("[LogL = %.20g GRADIENT BRACKET %g/%.20g, %g/%.20g, %g/%.20g; %d]\n",maxSoFar,lV,leftValue,ms,middleValue,rV,rightValue, outcome);
+
+    left.AplusBx   (gradient, lV);
+    middle.AplusBx (gradient, ms);
+    right.AplusBx  (gradient, rV);
+
+    bool reset = false;
+
+    if (outcome!=-1) { // successfull bracket
+        // set up left, right, middle
+
+        if (outcome == -2) {
+            if (middleValue>maxSoFar) {
+                maxSoFar = middleValue;
+                bestVal  = middle;
+                SetAllIndependent (&middle);
+            } else {
+                SetAllIndependent (&bestVal);
+            }
+            FlushLocalUpdatePolicy();
+            return;
+        }
+
+
+
+        if (outcome == indexInd.lLength) {
+            reset = true;
+        } else {
+            _Parameter U,V,W,X=ms,E=0,FX,FW,FV,XM,R,Q,P,ETEMP,D,FU;
+            _Matrix currentBestPoint (newMiddle);
+            currentBestPoint.AplusBx(gradient, ms);
+            W = .0;
+            V = .0;
+            FX = -middleValue;
+            FV = FX;
+            FW = FX;
+            outcome = 0;
+            bool pFitGood;
+            while (outcome < 20) {
+               // brentHistory.Store (-FX - initialValue);
+                pFitGood = false;
+                XM = .5*(lV+rV);
+
+                _Parameter tol1 = fabs (X) * gPrecision + 1.e-6,
+                           tol2 = 2.*tol1;
+
+                if (fabs(X-XM) <= tol2-0.5*(rV-lV)) {
+                    break;
+                }
+
+                if (fabs(E)>machineEps) {
+                    R = (X-W)*(FX-FV);
+                    Q = (X-V)*(FX-FW);
+                    P = (X-V)*Q-(X-W)*R;
+                    Q = 2.0 * (Q-R);
+                    if (Q>0) {
+                        P = -P;
+                    }
+                    Q = fabs(Q);
+                    ETEMP = E;
+                    E = D;
+                    if (!((fabs(P)>=fabs(.5*Q*ETEMP))||(P<=Q*(lV-X))||(P>=Q*(rV-X)))) {
+                        D = P/Q;
+                        U = X+D;
+                        pFitGood = true;
+                    }
+                }
+                if (!pFitGood) {
+                    if (X>=XM) {
+                        E = lV-X;
+                    } else {
+                        E = rV - X;
+                    }
+                    D = GOLDEN_RATIO_C*E;
+                }
+                U = X+D;
+                //for (index = 0; index < indexInd.lLength; index++)
+                //  SetIthIndependent (index,middle.theData[index]+U*gradient.theData[index]);
+                FU = -SetParametersAndCompute (-1,U,&newMiddle,&gradient);
+                //printf ("\n%g\n", FU);
+
+                if (FU<=FX) { // accept the move
+                    currentBestPoint = newMiddle;
+                    currentBestPoint.AplusBx(gradient, U);
+                    //brentHistory.Store (1.);
+                    //brentHistory.Store (U);
+                    //brentHistory.Store (X);
+                    if (U>=X) {
+                        lV = X;
+                    } else {
+                        rV = X;
+                    }
+                    V = W;
+                    FV = FW;
+                    W = X;
+                    FW = FX;
+                    X = U;
+                    FX = FU;
+                } else { 
+                   //brentHistory.Store (-1.);
+                   //brentHistory.Store (U);
+                   //brentHistory.Store (X);
+                   if (U<X) {
+                        lV = U;
+                    } else {
+                        rV = U;
+                    }
+                    if (FU<=FW || W==X ) {
+                        V = W;
+                        FV = FW;
+                        W = U;
+                        FW = FU;
+                    } else {
+                        if (FU<=FV || V==X || V==W) {
+                            V = U;
+                            FV = FU;
+                        }
+                    }
+
+                }
+                outcome++;
+
+            }
+
+            middleValue = -FX;
+            //brentHistory.Store (0.);
+            if (middleValue <= maxSoFar || CheckEqual(maxSoFar, middleValue)) {
+                //brentHistory.Store (-1.);
+                //brentHistory.Store (middleValue-initialValue);
+
+                SetAllIndependent (&bestVal);
+                maxSoFar = middleValue;
+            } else {
+                long changed = SetAllIndependent (&currentBestPoint);
+                maxSoFar    = Compute();
+                bestVal     = currentBestPoint;
+                /*brentHistory.Store (1.);
+                brentHistory.Store (changed);
+                brentHistory.Store (X);
+                brentHistory.Store (maxSoFar-initialValue);
+                brentHistory.Store (-FX-initialValue);*/
+            }
+                        
+            if (maxSoFar < initialValue && !CheckEqual (maxSoFar, initialValue)) {
+                 WarnError (_String ("Internal error in  _LikelihoodFunction::GradientLocateTheBump: in the Brent loop iteration ") & long(outcome) & ". " & maxSoFar & " / " & initialValue & ".\n");// & _String ((_String*)brentHistory.toStr()));
+                 return;   
+            }
+
+            //bestVal = middle;
+            //maxSoFar = middleValue;
+        }
+        //middle = X;
+    }
+
+    else {
+        reset = true;
+        if (verbosityLevel>1) {
+            BufferToConsole ("Line optimization unsuccessful\n");
+        }
+        if (leftValue>middleValue) {
+            middleValue = leftValue;
+            middle = left;
+        }
+        if (rightValue>middleValue) {
+            middleValue = rightValue;
+            middle = right;
+        }
+
+        if (middleValue>maxSoFar) {
+            SetAllIndependent (&middle);
+            maxSoFar = middleValue;
+            reset = false;
+        }
+    }
+    
+    if (reset)
+        SetAllIndependent (&bestVal);
+ 
+    FlushLocalUpdatePolicy();
+}
+
+//_______________________________________________________________________________________
+
+void    _LikelihoodFunction::LocateTheBump (long index,_Parameter gPrecision, _Parameter& maxSoFar, _Parameter& bestVal, _Parameter bracketSetting)
+{
+    _Parameter left,
+               right,
+               middle           = bestVal,
+               leftValue,
+               middleValue       = maxSoFar,
+               rightValue,
+               bp             = 2.*gPrecision,
+               brentPrec        = bracketSetting>0.?bracketSetting:gPrecision;
+
+
+    DetermineLocalUpdatePolicy           ();
+
+    int outcome = Bracket (index,left,middle,right,leftValue, middleValue, rightValue,bp);
+    long        fCount = likeFuncEvalCallCount;
+    if (outcome != -1) { // successfull bracket
+        _Parameter U,V,W,X=middle,E=0.,FX,FW,FV,XM,R,Q,P,ETEMP,D,FU;
+        W       = middle;
+        V       = middle;
+        FX      = -middleValue;
+        FV      = FX;
+        FW      = FX;
+        outcome = 0;
+        
+        bool   pFitGood;
+        
+        while (outcome < 20) {
+            pFitGood = false;
+            XM = .5*(left+right);
+            
+            if (verbosityLevel > 50) {
+                char buf [256];
+                snprintf (buf, 256, "\n\t[_LikelihoodFunction::LocateTheBump (index %ld) (current max = %15.12g) GOLDEN RATIO INTERVAL CHECK: %g <= %g (%g = %g) <= %g, span = %g]", index, bestVal, left, XM, X, fabs(X-XM), right, right-left);
+                BufferToConsole (buf);
+            }
+            
+            if (right - left < (bracketSetting>0.?bracketSetting:gPrecision)) {
+                break;
+            }
+            
+            if (fabs(E)>1.0e-10) {
+                R = (X-W)*(FX-FV);
+                Q = (X-V)*(FX-FW);
+                P = (X-V)*Q-(X-W)*R;
+                Q = 2.0 * (Q-R);
+                if (Q>0.) {
+                    P = -P;
+                }
+                Q = fabs(Q);
+                ETEMP = E;
+                E = D;
+                if (!((fabs(P)>=fabs(.5*Q*ETEMP))||(P<=Q*(left-X))||(P>=Q*(right-X)))) {
+                    D = P/Q;
+                    U = X+D;
+                    pFitGood = true;
+                }
+            }
+            
+            if (!pFitGood) {
+                if (X>=XM) {
+                    E = left-X;
+                } else {
+                    E = right - X;
+                }
+                D = GOLDEN_RATIO_C*E;
+            }
+            
+            U = X+D;
+            SetIthIndependent (index,U);
+            FU = -Compute();
+            
+            if (verbosityLevel > 50) {
+                char buf [256];
+                snprintf (buf, 256, "\n\t[_LikelihoodFunction::LocateTheBump (index %ld) GOLDEN RATIO TRY: param %g, log L %g]", index, U, FU);
+                BufferToConsole (buf);
+            }
+            
+            if (FU<=FX) {
+                if (U>=X) {
+                    left = X;
+                } else {
+                    right = X;
+                }
+                V = W;
+                FV = FW;
+                W = X;
+                FW = FX;
+                X = U;
+                FX = FU;
+            } else {
+                if (U < X) {
+                    left = U;
+                } else {
+                    right = U;
+                }
+                if ((FU<=FW)||(W==X)) {
+                    V = W;
+                    FV = FW;
+                    W = U;
+                    FW = FU;
+                } else {
+                    if ((FU<=FV)||(V==X)||(V==W)) {
+                        V = U;
+                        FV = FU;
+                    }
+                }
+            }
+            outcome++;
+            
+        }
+        
+        if (verbosityLevel > 50) {
+            char buf [256];
+            snprintf (buf, 256, "\n\t[_LikelihoodFunction::LocateTheBump (index %ld) GOLDEN RATIO SEARCH SUCCESSFUL: precision %g, parameter moved from %15.12g to %15.12g, Log L new/old = %g/%g ]\n\n", index, brentPrec, bestVal, X, -FX, maxSoFar);
+            BufferToConsole (buf);
+        }
+        middleValue = -FX;
+        middle      = X;
+         
+        if (middleValue<maxSoFar) {
+            SetIthIndependent(index,bestVal);
+        } else {
+            if (!CheckEqual(GetIthIndependent(index),middle)) {
+                SetIthIndependent (index,middle);
+            }
+            maxSoFar = middleValue;
+        }
+    }
+
+    oneDFCount += likeFuncEvalCallCount-fCount;
+    oneDCount ++;
+    FlushLocalUpdatePolicy            ();
+}
+
+//_______________________________________________________________________________________
+bool        _LikelihoodFunction::checkPermissibility (_Matrix&m, long row)
+{
+    for (unsigned long j=0; j<indexInd.lLength; j++) {
+        _Parameter junk = m (row,j);
+
+        _Variable *v = LocateVar (indexInd(j));
+
+        if (junk<v->GetLowerBound()) {
+            return FALSE;
+        } else if (junk>v->GetUpperBound()) {
+            return FALSE;
+        }
+    }
+
+    return true;
+}
+
+//_______________________________________________________________________________________
+_Parameter      _LikelihoodFunction::computeAtAPoint (_Matrix&m, long row)
+{
+
+    if (!checkPermissibility(m,row)) {
+        return -1e300;
+    }
+
+    for (long k=0; k < indexInd.lLength; k++) {
+        SetIthIndependent (k, m(row,k));
+    }
+
+    return Compute();
+}
+
+//_______________________________________________________________________________________
+_Parameter      _LikelihoodFunction::replaceAPoint (_Matrix&m, long row, _Matrix&p, _Parameter& nV, _Matrix& fv)
+{
+    for (long k=0; k < indexInd.lLength; k++) {
+        m.Store (row,k,p(0,k));
+    }
+    fv.Store (0,row,nV);
+    return nV;
+}
+
+
+//_______________________________________________________________________________________
+_Parameter      _LikelihoodFunction::SimplexMethod (_Parameter& gPrecision)
+{
+    _Matrix     points (indexInd.lLength+1, indexInd.lLength, false, true), //the matrix of points
+                functionalEvaluations (1, indexInd.lLength+1,false, true),
+                scratch1 (1, indexInd.lLength,false, true),
+                scratch2 (1, indexInd.lLength,false, true),
+                bestSoFar (1, indexInd.lLength+1,false, true),
+                temp;
+
+    _Parameter  lastBError      = 0.,
+                lastError        = 0.0,
+                simplexAlpha     = 1.0,
+                simplexBeta    = 0.5,
+                simplexGamma    = 2.0,
+                testValue,
+                minError      = 1.e300,
+                bumpingFactor    = 1.;
+
+    long        iterationsCount = 0,
+                nBumps          = 0;
+
+
+    // first populate the matrix of initial points
+    long j,k;
+
+    for (k=0; k<indexInd.lLength; k++) {
+        _Variable *v = LocateVar (indexInd (k));
+
+        _Parameter lowP     = v->GetLowerBound(),
+                   highP     = v->GetUpperBound(),
+                   span     = highP-lowP;
+
+        if (span>1) {
+            lowP += 0.1;
+            highP = lowP+1;
+        } else {
+            lowP += span/10;
+            highP += lowP+span/2;
+        }
+
+        for (j=0; j<k; j++) {
+            points.Store (j,k,lowP);
+        }
+
+        for (j=k+1; j<=indexInd.lLength; j++) {
+            points.Store (j,k,lowP);
+        }
+
+        points.Store (k,k,highP);
+    }
+
+
+    for (j=0; j<=indexInd.lLength; j++) {
+        functionalEvaluations.Store (0,j,computeAtAPoint(points,j));
+    }
+
+    do {
+        // compute the reflection
+        long            indexMin = 0,
+                        indexMax = 0,
+                        index2Min;
+
+        _Parameter      max  = -1e300,
+                        min  = 1e300,
+                        min2 = 1e300,
+                        error = 0;
+
+        for (j=0; j<=indexInd.lLength; j++) {
+            if (functionalEvaluations(0,j)>max) {
+                indexMax = j;
+                max = functionalEvaluations(0,j);
+            }
+            if (functionalEvaluations(0,j)<min) {
+                if (min<min2) {
+                    min2 = min;
+                    index2Min = indexMin;
+                }
+                indexMin = j;
+                min = functionalEvaluations(0,j);
+            } else {
+                if (functionalEvaluations(0,j)<min2) {
+                    index2Min = j;
+                    min2 = functionalEvaluations(0,j);
+                }
+            }
+        }
+
+
+
+
+        error = functionalEvaluations(0,indexMax)-functionalEvaluations(0,indexMin);
+        if (verbosityLevel>1) {
+            char    buffer[64];
+            snprintf (buffer, sizeof(buffer),"\n Error = %15.15g", error);
+            BufferToConsole (buffer);
+        }
+        if (error<minError) {
+            minError = error;
+            for (k=0; k < indexMax; k++) {
+                bestSoFar.Store(0,k,points(indexMax,k));
+            }
+        }
+
+        // find the centroid of all the points excluding the worst!
+        for (j=0; j<indexInd.lLength; j++) {
+            _Parameter junk = 0;
+            for (k=0; k < indexMin; k++) {
+                junk+= points(k,j);
+            }
+
+            for (k=indexMin+1; k <= indexInd.lLength; k++) {
+                junk+= points(k,j);
+            }
+            _Variable *v = LocateVar (indexInd(j));
+
+            junk/=indexInd.lLength;
+            if (junk<v->GetLowerBound()) {
+                scratch1.Store (0,j,v->GetLowerBound());
+            } else if (junk>v->GetUpperBound()) {
+                scratch1.Store (0,j,v->GetUpperBound());
+            } else {
+                scratch1.Store (0,j,junk);
+            }
+
+        }
+
+
+
+        if (error<gPrecision) {
+            break;
+        }
+        if (fabs(lastError-error)<gPrecision*error) {
+            iterationsCount++;
+            if (iterationsCount%10==0) {
+                if ((error>lastBError)||(iterationsCount%(30)==0)) {
+                    //perturb the coodinates of simplex vertices to escape a vicios loop
+                    nBumps++;
+                    for (k=0; k<indexInd.lLength; k++) {
+
+                        _Variable *v = LocateVar (indexInd (k));
+                        _Parameter lowP = v->GetLowerBound() , highP = v->GetUpperBound(), trial;
+
+                        if (fabs(lastBError-error)>gPrecision) {
+                            bumpingFactor*=10;
+                        } else {
+                            bumpingFactor = 1;
+                        }
+                        //trial = bestSoFar(0,k)+bumpingFactor*(genrand_int32()-RAND_MAX_32)/(_Parameter)RAND_MAX_32*error;
+//                      else
+//                          trial = scratch1(0,k)+100*(genrand_int32()-RAND_MAX_32)/(_Parameter)RAND_MAX_32*error;
+                        trial = lowP+(highP-lowP)*(genrand_int32()-RAND_MAX_32)/(_Parameter)RAND_MAX_32*error;
+
+                        if ((trial<(lowP+gPrecision))||(trial>(highP-gPrecision))) {
+                            trial = lowP+ genrand_int32()*(highP-lowP)/RAND_MAX_32;
+                        }
+                        scratch1.Store (0,k,trial);
+                        lastBError = error;
+
+                    }
+                    if (verbosityLevel>1) {
+                        char    buffer[64];
+                        snprintf (buffer, sizeof(buffer),"\nBUMPING... with factor %g", bumpingFactor);
+                        BufferToConsole (buffer);
+                    }
+                }
+
+            }
+            if (nBumps>25) {
+                char str[255];
+                snprintf (str, sizeof(str),"Simplex Method Failed to Converge to Desired Precision. Precision attained: %15.15g", minError);
+                ReportWarning (_String(str));
+                break;
+            }
+        } else {
+            iterationsCount = 0;
+        }
+        lastError = error;
+
+        for (k=0; k < indexInd.lLength; k++) {
+            scratch2.Store (0,k,points(indexMin,k));
+        }
+
+        // reflect the worst point across the centroid
+        _Matrix dummy;
+        temp = scratch2;
+        dummy = scratch1;
+        dummy -= temp;
+        dummy *=(1.0+simplexAlpha);
+        temp += dummy;
+
+        testValue = computeAtAPoint (temp);
+
+
+        if ((testValue>functionalEvaluations(0,indexMin))&&(testValue<functionalEvaluations(0,indexMax))) {
+            replaceAPoint (points, indexMin, temp, testValue, functionalEvaluations);
+        } else if (testValue>functionalEvaluations(0,indexMax)) {
+            replaceAPoint (points, indexMin, temp, testValue, functionalEvaluations);
+            scratch2 =temp;
+            scratch2*=simplexGamma;
+            scratch1*=(1-simplexGamma);
+            scratch2+=scratch1;
+            _Parameter testValue3 = computeAtAPoint (scratch2);
+
+            if (testValue3>functionalEvaluations(0,index2Min)) {
+                replaceAPoint (points, index2Min, scratch2,testValue3, functionalEvaluations);
+            }
+        } else {
+            for (k=0; k < indexInd.lLength; k++) {
+                scratch2.Store (0,k,points(indexMin,k));
+            }
+            temp=scratch2;
+            temp*=simplexBeta;
+            scratch1*=(1-simplexBeta);
+            temp+=scratch1;
+
+            _Parameter testValue2 = computeAtAPoint (temp);
+            if (testValue2>=testValue) {
+                replaceAPoint (points, indexMin, temp, testValue, functionalEvaluations);
+            } else {
+                for (j=0; j<indexInd.lLength; j++)
+                    for (k=0; k<=indexInd.lLength; k++) {
+                        points.Store (j,k,(points(j,k)+points(indexMax,k))/2);
+                    }
+            }
+        }
+    } while (1);
+
+    for (k=0; k < indexInd.lLength; k++) {
+        SetIthIndependent (k, bestSoFar(0,k));
+    }
+
+    return true;
+
+}
+
+
+//_______________________________________________________________________________________
+
+void    _LikelihoodFunction::Anneal (_Parameter&)
+// simple simulated annealing approach
+{
+    /*_Parameter jumpMagnitude , decreaseRate, startingRate, currentValue = -1e300, trialValue, bestValue = -1e300;
+    _Parameter iterationsPerDecrease, decisionOnConvergence, terminateAfter;
+    _Matrix jumpVector (1, indexInd.lLength,false, true),
+            currentPoint (1, indexInd.lLength,false, true),
+            trialPoint (1, indexInd.lLength,false, true),
+            bestPoint (1, indexInd.lLength,false, true);
+    long i,count = 0, smCount = 0;
+
+    checkParameter (_String("SA_JUMP_MAGNITUDE"),jumpMagnitude,0.1);
+    checkParameter (_String("SA_DECREASE_RATE"),decreaseRate,1.25);
+    checkParameter (_String("SA_STARTING_RATE"),startingRate,1);
+    checkParameter (_String("SA_ITERATIONS_PER_DECREASE"),iterationsPerDecrease,500);
+    checkParameter (_String("SA_CONVERGENCE_THERESHOLD"),decisionOnConvergence,100);
+    checkParameter (_String("SA_TERMINATION_THERESHOLD"),terminateAfter,1000000);
+
+
+    for (i=0; i<indexInd.lLength; i++)
+    {
+        trialPoint.Store(0,i,GetIthIndependent(0));
+    }
+
+
+    currentValue = computeAtAPoint (currentPoint);
+    while (1)
+    {
+        count++;
+        if (count>terminateAfter)
+        {
+            computeAtAPoint (bestPoint);
+            ReportWarning (_String("Simulated annealing terminated before convergence was attained"));
+            return;
+        }
+        if (count%(long)iterationsPerDecrease==0)
+        {
+            startingRate *= decreaseRate;
+            iterationsPerDecrease/=decreaseRate;
+        }
+        trialValue = computeAtAPoint (trialPoint);
+        // compare the trial value and the current value and decide what to do;
+        if (fabs(trialValue-currentValue)<gPrecision)
+        {
+            smCount++;
+        }
+        else
+            smCount=0;
+
+        if (smCount > decisionOnConvergence)
+        {
+            computeAtAPoint (bestPoint);
+            return;
+        }
+
+        if (trialValue > currentValue)
+        {
+            if (VerbosityLevel()>1)
+            {
+                printf ("\nJump Up to %g accepted", trialValue);
+            }
+            currentValue = trialValue;
+            currentPoint = trialPoint;
+        }
+        else
+        {
+            _Parameter decisionProb = exp((trialValue-currentValue)*startingRate);
+            if (((_Parameter)genrand_int32())/RAND_MAX_32<decisionProb)
+            {
+                currentValue = trialValue;
+                currentPoint = trialPoint;
+                if (VerbosityLevel()>1)
+                {
+                    printf ("\nJump down to %g accepted", currentValue);
+                }
+            }
+            else
+                if (VerbosityLevel()>900)
+                {
+                    printf ("\nJump to %g rejected", trialValue);
+                }
+
+        }
+
+        // see if we have the max
+
+        if (currentValue>bestValue)
+        {
+            bestValue = currentValue;
+            bestPoint = currentPoint;
+        }
+
+        // now generate a random jump
+        _Parameter distance = jumpMagnitude*genrand_int32()/(_Parameter)RAND_MAX_32, dist1 = 0;
+
+        // generate an arbitrary point in the allowed domain
+
+
+        for (i=0; i<indexInd.lLength; i++)
+        {
+            _Variable*v = LocateVar (indexInd(i));
+            jumpVector.Store (0,i,v->GetLowerBound()+(v->GetUpperBound()-v->GetLowerBound())*genrand_int32()/(_Parameter)RAND_MAX_32-currentPoint(0,i));
+            dist1+=jumpVector(0,i)*jumpVector(0,i);
+        }
+
+        jumpVector *= (distance/sqrt(dist1)); // normalize the jump;
+
+        trialPoint = jumpVector;
+        trialPoint += currentPoint;
+
+
+    }       */
+    _String errMsg ("Simulated Annealing is yet to be implemented. Sorry about that.");
+    WarnError (errMsg);
+}
+
+//_______________________________________________________________________________________
+void    _LikelihoodFunction::RescanAllVariables (void)
+{
+    indexCat.Clear ();
+    indexDep.Clear ();
+    indexInd.Clear ();
+    computationalResults.Clear();
+    indVarsByPartition.Clear  ();
+    depVarsByPartition.Clear  ();
+    ScanAllVariables();
+}
+
+//_______________________________________________________________________________________
+long    _LikelihoodFunction::DependOnTree (_String& treeName)
+{
+    long f = LocateVarByName (treeName);
+    if (f>=0) {
+        return theTrees.Find(variableNames.GetXtra(f));
+    }
+
+    return -1;
+}
+
+//_______________________________________________________________________________________
+long    _LikelihoodFunction::DependOnDS (long ID)
+{
+    for (long k = 0; k<theDataFilters.lLength; k++)
+        if (dataSetList._SimpleList::Find
+                ((long)((_DataSetFilter*)dataSetFilterList (theDataFilters.lData[k]))->GetData()) == ID) {
+            return k;
+        }
+    return -1;
+}
+
+//_______________________________________________________________________________________
+long    _LikelihoodFunction::DependOnModel (_String& modelTitle)
+{
+    if (modelTitle.sLength) {
+        long modelIndex = FindModelName(modelTitle);
+        if (modelIndex != HY_NO_MODEL) {
+            for (long k=0; k<theTrees.lLength; k++) {
+                _TheTree * t = (_TheTree*)LocateVar (theTrees.lData[k]);
+                _CalcNode* cN = t->DepthWiseTraversal (true);
+                while (cN) {
+                    if (cN->GetModelIndex() == modelIndex) {
+                        return k;
+                    }
+                    cN = t->DepthWiseTraversal (false);
+                }
+            }
+        }
+    }
+    return -1;
+}
+
+//_______________________________________________________________________________________
+_CategoryVariable*  _LikelihoodFunction::FindCategoryVar (long index)
+{
+    _CategoryVariable* res = nil;
+    if (index>=0 && index<blockDependancies.lLength) {
+        res = (_CategoryVariable*)LocateVar(indexCat(HighestBit(blockDependancies.lData[index])));
+    }
+    return res;
+}
+
+//_______________________________________________________________________________________
+void    _LikelihoodFunction::ScanAllVariables (void)
+{
+    _SimpleList   allVariables,
+                  covCat,
+                  cpCat,
+                  treeSizes,
+                  rankVariablesSupp;
+                  
+                   
+    _AVLListX    rankVariables (&rankVariablesSupp);
+
+
+    {
+        _AVLList avl (&allVariables);
+        for (unsigned long i=0; i<theProbabilities.lLength; i++) {
+            long iNodeCount, lNodeCount;
+            ((_TheTree*)(LocateVar(theTrees(i))))->EdgeCount (iNodeCount, lNodeCount);
+            treeSizes << (iNodeCount + lNodeCount);
+            (LocateVar(theProbabilities(i)))->ScanForVariables (avl,true,&rankVariables,treeSizes.GetElement(-1) << 16);
+        }
+
+
+        if (computingTemplate) {
+            computingTemplate->ScanFForVariables (avl,true,false,true, false, &rankVariables, treeSizes.Sum() << 16);
+        }
+
+        avl.ReorderList();
+    }
+
+    if (templateKind<0) {
+        allVariables.Delete (allVariables.Find(-templateKind-1));
+        rankVariables.Delete ((BaseRef)(-templateKind-1));
+    }
+
+    {
+        _AVLList iia (&indexInd),
+                 iid (&indexDep);
+
+        for (unsigned  long i=0; i<allVariables.lLength; i++) {
+            long variableIndex = allVariables.lData[i];
+            _Variable* theV = (_Variable*)LocateVar(variableIndex);
+            if (theV->IsCategory()) {
+                if (((_CategoryVariable*)theV)->IsUncorrelated()) {
+                    if (((_CategoryVariable*)theV)->IsConstantOnPartition()) {
+                        indexCat << variableIndex;
+                    } else {
+                        cpCat << variableIndex;
+                    }
+                } else {
+                    covCat<< variableIndex;
+                }
+                continue;
+            }
+            if (theV->IsIndependent()) {
+                iia.Insert ((BaseRef)variableIndex);
+            } else {
+                iid.Insert ((BaseRef)variableIndex);
+            }
+        }
+
+        for (unsigned long i=0; i<theTrees.lLength; i++) {
+            ((_TheTree*)(LocateVar(theTrees(i))))->ScanAndAttachVariables ();
+            ((_TheTree*)(LocateVar(theTrees(i))))->ScanForGVariables (iia, iid,&rankVariables, treeSizes.GetElement (i) << 16);
+        }
+        
+        for (unsigned long i=0; i<theTrees.lLength; i++) {
+            _TheTree * cT = ((_TheTree*)(LocateVar(theTrees(i))));
+            cT->ScanForVariables  (iia, iid, &rankVariables, 1 + treeSizes.GetElement (i));
+            cT->ScanForDVariables (iid, iia);
+            cT->SetUp();
+        }
+
+        iia.ReorderList ();
+        iid.ReorderList ();
+    }
+
+
+
+    /* mod 10/28/2005; Need to make two passes on trees; one to check for all category variables defined on the tree
+       and second to lay out dependency bits (after all the category variables have been concatenated) */
+
+    bool haveHMM                 = false,
+         haveConstantOnPartition = false;
+
+    for (unsigned long i=0; i<theTrees.lLength; i++) {
+        _SimpleList localCategVars;
+        {
+            _AVLList ca (&localCategVars);
+            ((_TheTree*)(LocateVar(theTrees(i))))->ScanForCVariables (ca);
+            ca.ReorderList();
+        }
+
+        for (unsigned long i2 = 0; i2 < localCategVars.lLength; i2++) {
+            _CategoryVariable * cvRef = (_CategoryVariable*)LocateVar (localCategVars.lData[i2]);
+            haveHMM                     = haveHMM || cvRef->IsHiddenMarkov();
+            haveConstantOnPartition     = haveConstantOnPartition || cvRef->IsConstantOnPartition();
+            if (cvRef->IsUncorrelated()) {
+                if (cvRef->IsConstantOnPartition()) {
+                    indexCat >> cvRef->GetAVariable();
+                } else {
+                    cpCat >> cvRef->GetAVariable();
+                }
+            } else {
+                covCat >> cvRef->GetAVariable();
+            }
+        }
+    }
+
+
+    if ((haveHMM || haveConstantOnPartition) && templateKind != _hyphyLFComputationalTemplateNone && templateKind != _hyphyLFComputationalTemplateByPartition) {
+        WarnError ("Non-partition based computational templates in likelihood functions cannot be combined with dependence on HMM or constant-on-partition random variables.");
+        return;
+    }
+
+    indexCat << cpCat;
+    indexCat << covCat;
+
+    if (indexCat.lLength>sizeof(long)*8) {
+        WarnError (_String ("The number of category variables exceeded ") &_String((long)sizeof(long)*8) );
+        return;
+    }
+
+    for (unsigned long i=0; i<theTrees.lLength; i++) {
+        _SimpleList categVars;
+        {
+            _AVLList ca (&categVars);
+            ((_TheTree*)(LocateVar(theTrees(i))))->ScanForCVariables (ca);
+            ca.ReorderList();
+        }
+
+        if (categVars.lLength) {
+            long dep = 0;
+            for (long k=categVars.lLength-1; k>=0; k--) {
+                SetNthBit(dep,indexCat.Find (categVars(k)));
+            }
+            blockDependancies<<dep;
+        } else {
+            blockDependancies<<0;
+        }
+    }
+
+    if (indexCat.lLength) // scan global variables upon which category variables depend
+        // which may have been missed
+        // indexInd will be sorted at this point
+    {
+        _SimpleList sortedCats (indexCat);
+        sortedCats.Sort();
+        if (sortedCats.CountCommonElements(indexInd,true)) {
+            _SimpleList newList;
+            newList.Subtract (indexInd,sortedCats);
+            indexInd.Clear();
+            indexInd.Duplicate(&newList);
+        }
+
+        {
+            _SimpleList   auxL;
+            _AVLList      auxa (&auxL);
+
+            for (unsigned long i=0; i<indexCat.lLength; i++) {
+                _CategoryVariable *theCV = (_CategoryVariable*)LocateVar(indexCat(i));
+                theCV->ScanForGVariables (auxa);
+            }
+
+            auxa.ReorderList();
+            if (auxL.lLength) {
+                _SimpleList nl;
+                nl.Union (indexInd,auxL);
+                if (nl.lLength > indexInd.lLength) {
+                    indexInd.Clear();
+                    indexInd.Duplicate (&nl);
+                }
+            }
+        }
+    }
+
+    _Parameter l = DEFAULTLOWERBOUND*(1.0-machineEps),
+               u = DEFAULTUPPERBOUND*(1.0-machineEps);
+               
+    
+
+    for (unsigned long i=0; i<indexInd.lLength; i++) {
+        _Variable *_cv = GetIthIndependentVar(i);
+        if (_cv->GetLowerBound()<=l) {
+            _cv->SetBounds(DEFAULTPARAMETERLBOUND,_cv->GetUpperBound());
+        }
+        if (_cv->GetUpperBound()>=u) {
+            _cv->SetBounds(_cv->GetLowerBound(),DEFAULTPARAMETERUBOUND);
+        }
+        //printf ("%s -> %d\n", _cv->theName->sData, rankVariables.GetXtra(rankVariables.Find ((BaseRef)indexInd.lData[i])));
+    }
+    
+    for (unsigned  long i=0; i<indexDep.lLength; i++) {
+        _Variable *_cv = GetIthDependentVar(i);
+        if (_cv->GetLowerBound()<=l) {
+            _cv->SetBounds(DEFAULTPARAMETERLBOUND,_cv->GetUpperBound());
+        }
+        if (_cv->GetUpperBound()>=u) {
+            _cv->SetBounds(_cv->GetLowerBound(),DEFAULTPARAMETERUBOUND);
+        }
+    }
+
+    _SimpleList pidx (1,0,0);
+    for (unsigned long p = 0; p < theTrees.lLength; p++) {
+        pidx.lData[0] = p;
+        _SimpleList iv,dv,cv;
+        ScanAllVariablesOnPartition (pidx, iv, dv, cv, true);
+        indVarsByPartition && & iv;
+        depVarsByPartition && & dv;
+    }
+
+    RankVariables(&rankVariables);
+
+    //for (long iid = 0; iid < indexInd.lLength; iid++)
+    //  printf ("%ld: %s\n", iid, LocateVar(indexInd.lData[iid])->GetName()->sData);
+
+}
+
+//_______________________________________________________________________________________
+void    _LikelihoodFunction::ScanAllVariablesOnPartition (_SimpleList& pidx, _SimpleList& iind, _SimpleList& idep, _SimpleList &icat, bool treeOnly)
+{
+    _SimpleList   allVariables,
+                  covCat,
+                  cpCat;
+
+
+    if (!treeOnly) {
+        _AVLList avl (&allVariables);
+        for (long i = 0; i < pidx.lLength; i++) {
+            LocateVar(theProbabilities(pidx(i)))->ScanForVariables (avl,true);
+        }
+
+        if (computingTemplate) {
+            computingTemplate->ScanFForVariables (avl,true,false,true);
+        }
+
+        avl.ReorderList();
+    }
+
+    if (treeOnly == false && templateKind<0) {
+        allVariables.Delete (allVariables.Find(-templateKind-1));
+    }
+
+    {
+        _AVLList iia (&iind),
+                 iid (&idep);
+
+        if (treeOnly == false) {
+            for (long i=0; i<allVariables.lLength; i++) {
+                _Variable* theV = ((_Variable*)LocateVar(allVariables(i)));
+                if (theV->IsCategory()) {
+                    if (((_CategoryVariable*)theV)->IsUncorrelated()) {
+                        if (((_CategoryVariable*)theV)->IsConstantOnPartition()) {
+                            icat << allVariables(i);
+                        } else {
+                            cpCat << allVariables(i);
+                        }
+                    } else {
+                        covCat<<allVariables(i);
+                    }
+                    continue;
+                }
+                if (theV->IsIndependent()) {
+                    iia.Insert ((BaseRef)allVariables(i));
+                } else {
+                    iid.Insert ((BaseRef)allVariables(i));
+                }
+            }
+
+            indexCat << cpCat;
+            indexCat << covCat;
+        }
+
+        for (long i2=0; i2<pidx.lLength; i2++) {
+            _TheTree * cT = (_TheTree*)(LocateVar(theTrees.lData[pidx.lData[i2]]));
+            cT->ScanForGVariables (iia, iid);
+        }
+
+        for (long i=0; i<pidx.lLength; i++) {
+            _TheTree * cT = (_TheTree*)(LocateVar(theTrees.lData[pidx.lData[i]]));
+            cT->ScanForVariables (iia,iid);
+            cT->ScanForDVariables (iid, iia);
+        }
+
+        iia.ReorderList ();
+        iid.ReorderList ();
+    }
+
+
+    for (long i=0; i<pidx.lLength; i++) {
+        _SimpleList categVars;
+        _AVLList ca (&categVars);
+        ((_TheTree*)(LocateVar(theTrees.lData[pidx.lData[i]])))->ScanForCVariables (ca);
+        ca.ReorderList();
+
+        if (categVars.lLength)
+            for (long k=categVars.lLength-1; k>=0; k--) {
+                long f = icat.Find (categVars(k));
+                if (f==-1) {
+                    icat<<categVars(k);
+                }
+            }
+    }
+
+    if (icat.lLength) {
+        for (long i=0; i<iind.lLength; i++) {
+            long t = icat.Find (iind.lData[i]);
+            if (t>=0) {
+                iind.Delete(i);
+                i--;
+            }
+        }
+        {
+            _SimpleList   auxL;
+            _AVLList      auxa (&auxL);
+
+            for (long i=0; i<icat.lLength; i++) {
+                _CategoryVariable *theCV = (_CategoryVariable*)LocateVar(icat(i));
+                theCV->ScanForGVariables (auxa);
+            }
+
+            auxa.ReorderList();
+            if (auxL.lLength) {
+                _SimpleList nl;
+                nl.Union (iind,auxL);
+                if (nl.lLength > iind.lLength) {
+                    iind.Clear();
+                    iind.Duplicate (&nl);
+                }
+            }
+        }
+    }
+}
+
+//_______________________________________________________________________________________
+void    _LikelihoodFunction::UpdateIndependent (long index, bool purgeResults, _SimpleList* whichList, _SimpleList* secondList)
+{
+    _SimpleList * theList = &indexInd;
+    if (whichList) {
+        theList = whichList;
+    } else {
+        secondList = &indexDep;
+    }
+
+    long f = theList->Find (index);
+    if (f!=-1) {
+        theList->Delete(f);
+        (*secondList)<<index;
+
+        _SimpleList   newVars;
+        {
+            _AVLList  al (&newVars);
+            LocateVar(index)->ScanForVariables(al,true);
+            al.ReorderList();
+        }
+
+        for (f=0; f<newVars.countitems(); f++) {
+            _Variable* cv = LocateVar(newVars.lData[f]);
+            if (cv->IsIndependent()&& theList->Find(newVars.lData[f])==-1) {
+                (*theList) << newVars.lData[f];
+            }
+        }
+
+        if (theList!=whichList) {
+            for (f = 0; f < indVarsByPartition.lLength; f++) {
+                UpdateIndependent (index, false, (_SimpleList*)indVarsByPartition(f), (_SimpleList*)depVarsByPartition(f));
+            }
+        }
+
+        if (purgeResults) {
+            computationalResults.Clear();
+        }
+    }
+
+}
+
+//_______________________________________________________________________________________
+void    _LikelihoodFunction::UpdateDependent (long index)
+{
+    long f = indexDep.Find (index);
+    if (f!=-1) {
+        indexDep.Delete(f);
+        indexInd<<index;
+        for (unsigned long k = 0; k<depVarsByPartition.lLength; k++) {
+            f = ((_SimpleList*)depVarsByPartition(k))->Find(index);
+            if (f >= 0) {
+                ((_SimpleList*)depVarsByPartition(k))->Delete(f);
+                (*(_SimpleList*)indVarsByPartition(k)) << index;
+            }
+        }
+    }
+
+}
+
+
+//_______________________________________________________________________________________
+
+void    _LikelihoodFunction::Cleanup (void)
+{
+    DeleteObject (parameterValuesAndRanges);
+    DeleteCaches();
+
+#ifdef MDSOCL
+	for (int i = 0; i < theTrees.lLength; i++)
+	{
+		OCLEval[i].~_OCLEvaluator();
+	}
+	delete [] OCLEval;
+#endif
+}
+
+
+//_______________________________________________________________________________________
+
+void    _LikelihoodFunction::DeleteCaches (bool all)
+{
+    if (all) {
+        DeleteObject (siteResults);
+        siteResults = nil;
+        DeleteObject (bySiteResults);
+        bySiteResults = nil;
+    }
+
+    conditionalTerminalNodeLikelihoodCaches.Clear();
+    cachedBranches.Clear();
+    siteCorrections.Clear();
+    siteCorrectionsBackup.Clear();
+    siteScalerBuffer.Clear();
+
+//  computedLocalUpdatePolicy.Clear();
+//  treeTraversalMasks.Clear();
+//  matricesToExponentiate.Clear();
+//  overallScalingFactors.Clear();
+//  localUpdatePolicy.Clear();
+
+    if (conditionalInternalNodeLikelihoodCaches) {
+        for (long k = 0; k < theTrees.lLength; k++)
+            if (conditionalInternalNodeLikelihoodCaches[k]) {
+                delete [] (conditionalInternalNodeLikelihoodCaches[k]);
+            }
+        delete [] conditionalInternalNodeLikelihoodCaches ;
+        conditionalInternalNodeLikelihoodCaches = nil;
+    }
+    if (branchCaches) {
+        for (long k = 0; k < theTrees.lLength; k++)
+            if (branchCaches[k]) {
+                delete [] branchCaches[k];
+            }
+        delete [] branchCaches;
+        branchCaches = nil;
+    }
+    if (conditionalTerminalNodeStateFlag) {
+        for (long k = 0; k < theTrees.lLength; k++)
+            if (conditionalTerminalNodeStateFlag[k]) {
+                delete [] conditionalTerminalNodeStateFlag[k];
+            }
+        delete [] conditionalTerminalNodeStateFlag;
+        conditionalTerminalNodeStateFlag = nil;
+    }
+    if (siteScalingFactors) {
+        for (long k = 0; k < theTrees.lLength; k++)
+            if (siteScalingFactors[k]) {
+                delete [] siteScalingFactors[k];
+            }
+        delete [] siteScalingFactors;
+        siteScalingFactors = nil;
+    }
+}
+
+
+//_______________________________________________________________________________________
+
+void    _LikelihoodFunction::Setup (void)
+{
+    _Parameter kp       = 0.0;
+    //RankVariables();
+    checkParameter      (useFullMST,kp,0.0);
+
+    if (kp>.5 && !mstCache) {
+        checkPointer (mstCache = new MSTCache);
+    }
+
+    if (theTrees.lLength==optimalOrders.lLength)
+        //check to see if we need to recompute the
+        // optimal summation order
+    {
+        checkParameter (keepOptimalOrder,kp,0.0);
+        if (kp) {
+            for (unsigned long i=0; i<theTrees.lLength; i++) {
+                _SimpleList*    s = (_SimpleList*)optimalOrders(i),
+                                *   l = (_SimpleList*)leafSkips(i);
+
+                _DataSetFilter* df          = ((_DataSetFilter*)dataSetFilterList(theDataFilters(i)));
+                _Matrix       *glFreqs      = (_Matrix*)LocateVar(theProbabilities.lData[i])->GetValue();
+                _TheTree      *t            = ((_TheTree*)LocateVar(theTrees.lData[i]));
+
+                t->InitializeTreeFrequencies (glFreqs, true);
+                if (s->lLength!=df->NumberDistinctSites()) {
+                    s->Clear();
+                    l->Clear();
+                    OptimalOrder (i,*s);
+                    df->MatchStartNEnd (*s,*l);
+                }
+            }
+            return;
+        }
+    }
+
+    optimalOrders.Clear();
+    leafSkips.Clear();
+
+    treeTraversalMasks.Clear();
+    canUseReversibleSpeedups.Clear();
+    _SimpleList alreadyDoneModelsL;
+    _AVLListX   alreadyDoneModels (&alreadyDoneModelsL);
+
+    _Parameter assumeRev = 0.;
+    checkParameter (assumeReversible,assumeRev,0.0);
+
+    for (unsigned long i=0; i<theTrees.lLength; i++) {
+        _Matrix         *glFreqs = (_Matrix*)LocateVar(theProbabilities.lData[i])->GetValue();
+        _DataSetFilter* df      = ((_DataSetFilter*)dataSetFilterList(theDataFilters(i)));
+        _TheTree        *t       = ((_TheTree*)LocateVar(theTrees.lData[i]));
+        t->InitializeTreeFrequencies (glFreqs, true);
+        _SimpleList        *s = new _SimpleList,
+        *l = new _SimpleList;
+
+        treeTraversalMasks.AppendNewInstance(new _SimpleList (t->GetINodeCount() * df->NumberDistinctSites() / _HY_BITMASK_WIDTH_ + 1,0,0));
+        OptimalOrder      (i,*s);
+        df->MatchStartNEnd(*s,*l);
+        optimalOrders.AppendNewInstance(s);
+        leafSkips.AppendNewInstance(l);
+
+        _SimpleList treeModels;
+        t->CompileListOfModels (treeModels);
+        bool isReversiblePartition = true;
+        if (assumeRev > 0.5) {
+            ReportWarning (_String ("Partition ") & long(i) & " is ASSUMED to have a reversible model");
+        } else {
+            if (assumeRev < -0.5) {
+              isReversiblePartition = false;
+              ReportWarning (_String ("Partition ") & long(i) & " is ASSUMED to have a non-reversible model");
+            } else {
+              for (unsigned long m = 0; m < treeModels.lLength && isReversiblePartition; m++) {
+                  long alreadyDone = alreadyDoneModels.Find ((BaseRef)treeModels.lData[m]);
+                  if (alreadyDone>=0) {
+                      alreadyDone = alreadyDoneModels.GetXtra (alreadyDone);
+                  } else {
+                      alreadyDone = IsModelReversible (treeModels.lData[m]);
+                      alreadyDoneModels.Insert ((BaseRef)treeModels.lData[m], alreadyDone);
+                  }
+                  isReversiblePartition = isReversiblePartition && alreadyDone;
+              }
+              ReportWarning (_String ("Partition ") & i & " reversible model flag computed as " & (long)isReversiblePartition);
+            }
+        }
+        canUseReversibleSpeedups << isReversiblePartition;
+
+    }
+
+}
+
+//_______________________________________________________________________________________
+
+bool    _LikelihoodFunction::HasPartitionChanged (long index)
+{
+    //return ((_TheTree*)LocateVar(theTrees.lData[index]))->HasChanged();
+
+    _SimpleList * idepList = (_SimpleList*)indVarsByPartition(index);
+
+    for (long i = 0; i < idepList->lLength; i++)
+        if (LocateVar(idepList->lData[i])->HasChanged()) {
+            return true;
+        }
+
+    return false;
+}
+
+//#define _HY_GPU_EXAMPLE_CALCULATOR
+
+//_______________________________________________________________________________________
+
+_Parameter  _LikelihoodFunction::ComputeBlock (long index, _Parameter* siteRes, long currentRateClass, long branchIndex, _SimpleList * branchValues)
+// compute likelihood over block index i
+/*
+    to optimize
+        -no need to recurse the entire tree to decide if it had changed;
+         should cache variable->block dependancies for rapid lookup
+*/
+{
+
+    // set up global matrix frequencies
+
+    _SimpleList               *sl = (_SimpleList*)optimalOrders.lData[index];
+
+    _Matrix                   *glFreqs          = (_Matrix*)LocateVar(theProbabilities.lData[index])->GetValue();
+    _DataSetFilter            *df               = ((_DataSetFilter*)dataSetFilterList(theDataFilters.lData[index]));
+    _TheTree                   *t               = ((_TheTree*)LocateVar(theTrees.lData[index]));
+    bool                       canClear         = true,
+                               rootFreqsChange  = forceRecomputation?true:glFreqs->HasChanged();
+
+    if (currentRateClass >=0 && t->HasForcedRecomputeList()) {
+        canClear = TotalRateClassesForAPartition(index) == currentRateClass+1;
+    }
+
+    t->InitializeTreeFrequencies          ((_Matrix*)glFreqs->ComputeNumeric());
+
+    usedCachedResults                   = false;
+
+    if (computingTemplate&&templateKind) {
+        if (!(forceRecomputation||!siteArrayPopulated||HasPartitionChanged(index)||rootFreqsChange)) {
+            usedCachedResults = true;
+            //printf ("\n[CACHED]\n");
+            return            -1e300;
+        }
+    } else {
+        if (!forceRecomputation && computationalResults.GetUsed()==optimalOrders.lLength && !siteRes && !HasPartitionChanged(index) && !rootFreqsChange) {
+            usedCachedResults = true;
+            //printf ("\n[CACHED]\n");
+            return computationalResults.theData[index];
+        }
+    }
+
+    if (conditionalInternalNodeLikelihoodCaches) {
+#ifdef  _HY_GPU_EXAMPLE_CALCULATOR
+
+        long        ciid             = MAX(0,currentRateClass); // ignore this for now as it pertains to more complex evolutionary models
+
+        /* step 1: determine which _branches_ need to be updated; most of the work is done in _TheTree::DetermineNodesForUpdate
+        We will store store both those branches which need to be traversed and
+        those matrices that need to be reexponentiated. Note that the first set can have branches not in the second set
+        (parents of "touched" nodes, whose matrices have not changed).
+
+
+        */
+
+        _List      changedModels;
+        /* retrieve the list of modified matrices for partition 'index' (initially always 0 for simple cases)
+         */
+
+        _SimpleList changedBranches;
+        /* this is the list of INDICES of branches that are going to be computed;
+
+           for a tree with N leaves and M < N internal nodes, the leaves will
+           be indexed from 0 to N-1 (in post-order traversal), while internal
+           branches from N to N + M - 1 (also in post-order traversal)
+
+           for example the tree ((A,C)N1,D,(B,E)N2)Root will be laid out as
+
+           A,C,D,B,E,N1,N2,Root
+
+           when we look at the index of a branch, we can decide if its a leaf by checking
+           that its index is < N.
+
+        */
+
+        t->DetermineNodesForUpdate (changedBranches, // this will receive the list of branch indices (in post-order traversal, with
+                                    // child ALWAYS preceding the parent (as in the tree example before)
+                                    &changedModels, // this will receive the list of _CalcNode objects which must be exponentitated
+                                    -1, -1, true); // don't worry about this now
+
+
+
+
+
+        /* step 2: update all the transition matrices that have been marked as modified are
+         this is normally done by _TheTree::ExponentiateMatrices
+         determination of WHICH matrices have been modifed is taken care of my the host code and is supplied
+         in the matricesToExponentiate member variable:  */
+
+
+
+
+        t->ExponentiateMatrices(changedModels,
+                                1 /* use one thread */,
+                                -1 /*ignore this flag for now */);
+
+        /* now for the kernel computation you would need to copy modified matrices onto the device using the code like
+
+            for (long nodeID = 0; nodeID < matrices->lLength; nodeID++)
+            {
+                _CalcNode* thisNode = (_CalcNode*) expNodes(nodeID);
+                thisNode->GetCompMatrix (ciid)->theData; // this is the class member which actually contains the double*
+                                                         // pointer to matrix entires (laid out row by row, i.e. [i*vDim + j]
+                                                         // indexes row i column j; here vDim is the "vertical" dimension, i.e.
+                                                         // the number of columns
+            }
+
+        */
+
+        /* step 3
+        */
+
+        /*
+            because much of the access is done using protected members of _TheTree, I defined a new function that does
+            the calculation as simply as possible
+        */
+
+        // this is to update the GUI.
+#if !defined __UNIX__ || defined __HEADLESS__ || defined __HYPHYQT__ || defined __HYPHY_GTK__
+        if (divideBy && (likeFuncEvalCallCount % divideBy == 0)) {
+            yieldCPUTime();
+        }
+#endif
+
+
+#ifdef MDSOCL
+
+        return t->OCLLikelihoodEvaluator (changedBranches, 
+              df, 
+              conditionalInternalNodeLikelihoodCaches[index],     
+              conditionalTerminalNodeStateFlag[index],
+              (_GrowingVector*)conditionalTerminalNodeLikelihoodCaches(index),
+              OCLEval[index]);
+#else
+
+        return t->VerySimpleLikelihoodEvaluator (changedBranches,
+                df,
+                conditionalInternalNodeLikelihoodCaches[index],
+                conditionalTerminalNodeStateFlag[index],
+                (_GrowingVector*)conditionalTerminalNodeLikelihoodCaches(index) );
+#endif
+
+#else
+        long        catID            = siteRes?currentRateClass:-1;
+
+        if (conditionalInternalNodeLikelihoodCaches[index])
+            // not a 2 sequence analysis
+        {
+            long blockID    = df->NumberDistinctSites()*t->GetINodeCount(),
+                 patternCnt = df->NumberDistinctSites();
+
+            _SimpleList         *tcc  = (_SimpleList*)treeTraversalMasks(index);
+
+            _Parameter          *inc  = (currentRateClass<1)?conditionalInternalNodeLikelihoodCaches[index]:
+                                        conditionalInternalNodeLikelihoodCaches[index] + currentRateClass*df->GetDimension()*blockID,
+                                *ssf  = (currentRateClass<1)?siteScalingFactors[index]: siteScalingFactors[index] + currentRateClass*blockID,
+                                *bc   = (currentRateClass<1)?branchCaches[index]: (branchCaches[index] + currentRateClass*patternCnt*df->GetDimension()*2);
+
+            long  *scc = nil,
+                  *sccb = nil;
+
+            if (siteRes) {
+                sccb = ((_SimpleList*)siteCorrectionsBackup(index))->lData + ((currentRateClass<1)?0:patternCnt*currentRateClass);
+                scc =  ((_SimpleList*)siteCorrections(index))->lData       + ((currentRateClass<1)?0:patternCnt*currentRateClass);
+            }
+
+            _SimpleList changedBranches, *branches;
+            _List       changedModels,   *matrices;
+            long        doCachedComp     = 0,     // whether or not to use a cached branch calculation when only one
+                        // local tree parameter is being adjusted at a time
+
+                        ciid          = MAX(0,currentRateClass),
+                        *cbid            = &(((_SimpleList*)cachedBranches(index))->lData[ciid]);
+
+            if (computedLocalUpdatePolicy.lLength && branchIndex < 0) {
+                branches = (_SimpleList*)(*((_List*)localUpdatePolicy(index)))(ciid);
+                matrices = (_List*)      (*((_List*)matricesToExponentiate(index)))(ciid) ;
+
+                long nodeID = ((_SimpleList*)computedLocalUpdatePolicy(index))->lData[ciid];
+                if (nodeID == 0 || nodeID == 1) {
+                    long snID = -1;
+
+                    if (nodeID == 1) {
+                        if (matrices->lLength == 2) {
+                            branches->Clear();
+                            matrices->Clear();
+
+                            snID = t->DetermineNodesForUpdate          (*branches, matrices,catID,*cbid,canClear);
+                        }
+                    } else {
+                        snID = t->DetermineNodesForUpdate          (*branches, matrices,catID,*cbid,canClear);
+                    }
+                    
+#ifdef _UBER_VERBOSE_LF_DEBUG
+                    fprintf (stderr, "\nCached %ld (%ld)/New %ld (%ld)\n", *cbid, nodeID, snID, matrices->lLength);
+#endif
+                    if (snID != *cbid) {
+                        RestoreScalingFactors (index, *cbid, patternCnt, scc, sccb);
+                        *cbid = -1;
+                        if (snID >= 0 && canUseReversibleSpeedups.lData[index]) {
+                            ((_SimpleList*)computedLocalUpdatePolicy(index))->lData[ciid] = snID+3;
+                            doCachedComp = -snID-1;
+                        } else {
+                            ((_SimpleList*)computedLocalUpdatePolicy(index))->lData[ciid] = nodeID + 1;
+                        }
+                    } else {
+                    // 20120718: SLKP added this branch to reuse the old cache if the branch that is being computed
+                    // is the same as the one cached last time, e.g. sequentially iterating through all local parameters
+                    // of a given branch.
+                        if (snID >= 0 && canUseReversibleSpeedups.lData[index]) {
+                            doCachedComp = ((_SimpleList*)computedLocalUpdatePolicy(index))->lData[ciid] = snID+3;
+                          } else {
+                            ((_SimpleList*)computedLocalUpdatePolicy(index))->lData[ciid] = nodeID + 1;
+                        }
+                    }
+                } else {
+                    doCachedComp = nodeID;
+                }
+            } else {
+                RestoreScalingFactors       (index, *cbid, patternCnt, scc, sccb);
+
+
+                t->DetermineNodesForUpdate  (changedBranches,&changedModels,catID,(branchIndex >=0 )?
+                                             (branchIndex<t->GetINodeCount()?branchIndex+t->GetLeafCount():branchIndex):*cbid,canClear);
+                *cbid                       = -1;
+                branches                    = &changedBranches;
+                matrices                    = &changedModels;
+            }
+
+            if (evalsSinceLastSetup == 0) {
+                branches->Populate (t->GetINodeCount()+t->GetLeafCount()-1,0,1);
+            }
+
+#ifdef _UBER_VERBOSE_LF_DEBUG
+            fprintf (stderr, "%d matrices, %d branches marked for rate class %d\n", matrices->lLength, branches->lLength, catID);
+            if (matrices->lLength == 0) {
+                fprintf (stderr, "Hmm\n");
+            }
+#endif
+            if (matrices->lLength) {
+                t->ExponentiateMatrices(*matrices, GetThreadCount(),catID);
+            }
+
+            //printf ("%d %d\n",likeFuncEvalCallCount, matrixExpCount);
+#if !defined __UNIX__ || defined __HEADLESS__ || defined __HYPHYQT__ || defined __HYPHY_GTK__
+            if (divideBy && (likeFuncEvalCallCount % divideBy == 0)) {
+                #pragma omp critical
+                yieldCPUTime();
+            }
+#endif
+
+
+
+
+            _Parameter sum  = 0.;
+            if (doCachedComp >= 3) {
+#ifdef _UBER_VERBOSE_LF_DEBUG
+                fprintf (stderr, "CACHE compute branch %d\n",doCachedComp-3);
+#endif
+                sum = t->ComputeLLWithBranchCache (*sl,
+                                                   doCachedComp-3,
+                                                   bc,
+                                                   df,
+                                                   0,
+                                                   df->NumberDistinctSites (),
+                                                   catID,
+                                                   siteRes)
+                      - _logLFScaler * overallScalingFactors.lData[index];
+                return sum;
+            }
+
+            long np = 1;
+#ifdef _OPENMP
+            np           = MIN(GetThreadCount(),omp_get_max_threads());
+#endif
+            long sitesPerP    = df->NumberDistinctSites() / np + 1;
+
+#ifdef _UBER_VERBOSE_LF_DEBUG
+                fprintf (stderr, "NORMAL compute lf \n");
+#endif
+
+            #pragma omp  parallel for default(shared) schedule(static,1) private(blockID) num_threads (np) reduction(+:sum) if (np>1)
+            for (blockID = 0; blockID < np; blockID ++) {
+                sum += t->ComputeTreeBlockByBranch (*sl,
+                                                    *branches,
+                                                    tcc,
+                                                    df,
+                                                    inc,
+                                                    conditionalTerminalNodeStateFlag[index],
+                                                    ssf,
+                                                    (_GrowingVector*)conditionalTerminalNodeLikelihoodCaches(index),
+                                                    overallScalingFactors.lData[index],
+                                                    blockID * sitesPerP,
+                                                    (1+blockID) * sitesPerP,
+                                                    catID,
+                                                    siteRes,
+                                                    scc,
+                                                    branchIndex,
+                                                    branchIndex >= 0 ? branchValues->lData: nil);
+            }
+
+            sum -= _logLFScaler * overallScalingFactors.lData[index];
+
+
+            if (doCachedComp < 0) {
+                //printf ("Cache check in %d %d\n", doCachedComp, overallScalingFactors[index]);
+                doCachedComp = -doCachedComp-1;
+                //printf ("Set up %d\n", doCachedComp);
+                *cbid = doCachedComp;
+
+                overallScalingFactorsBackup.lData[index] = overallScalingFactors.lData[index];
+                if (sccb)
+                    for (long recoverIndex = 0; recoverIndex < patternCnt; recoverIndex++) {
+                        sccb[recoverIndex] = scc[recoverIndex];
+                    }
+
+                #pragma omp  parallel for default(shared) schedule(static,1) private(blockID) num_threads (np) if (np>1)
+                for (blockID = 0; blockID < np; blockID ++) {
+                    t->ComputeBranchCache (*sl,doCachedComp, bc, inc, df,
+                                           conditionalTerminalNodeStateFlag[index],
+                                           ssf,
+                                           scc,
+                                           (_GrowingVector*)conditionalTerminalNodeLikelihoodCaches(index),
+                                           overallScalingFactors.lData[index],
+                                           blockID * sitesPerP,
+                                           (1+blockID) * sitesPerP,
+                                           catID,tcc,siteRes);
+                }
+
+                // need to update siteRes when computing cache and changing scaling factors!
+            }
+            return sum;
+        } else if (conditionalTerminalNodeStateFlag[index] || !df->IsNormalFilter())
+            // two sequence analysis
+        {
+            _SimpleList bc;
+            _List       mc;
+            t->DetermineNodesForUpdate         (bc, &mc);
+            if (mc.lLength) {
+                t->ExponentiateMatrices(mc, GetThreadCount(),catID);
+            }
+
+            //branchedGlobalCache.Clear(false);
+            //matricesGlobalCache.Clear(false);
+            if (df->IsNormalFilter())
+                return t->ComputeTwoSequenceLikelihood (*sl,
+                                                        df,
+                                                        conditionalTerminalNodeStateFlag[index],
+                                                        (_GrowingVector*)conditionalTerminalNodeLikelihoodCaches(index),
+                                                        0,
+                                                        df->NumberDistinctSites (),
+                                                        catID,
+                                                        siteRes);
+            else {
+                return t->Process3TaxonNumericFilter ((_DataSetFilterNumeric*)df);
+            }
+
+        }
+#endif
+
+    } else {
+        WarnError ("Dude -- lame! No cache. I can't compute like that with the new LF engine.");
+    }
+
+    return 0.0;
+}
+
+//_______________________________________________________________________________________
+long        _LikelihoodFunction::CostOfPath  (_DataSetFilter* df, _TheTree* t, _SimpleList& sl, _SimpleList* tcc)
+{
+    long res = 0;
+    for (long i=0; i<(long)sl.lLength-1; i++) {
+        res+=t->ComputeReleafingCost (df,sl.lData[i],sl.lData[i+1], tcc, i+1);
+    }
+    return res;
+}
+
+
+
+
+//_______________________________________________________________________________________
+
+//#define __SORTING_DEBUG
+#ifdef   __SORTING_DEBUG
+#include "HYChartWindow.h"
+#endif
+
+void    countingTraverse (node<long>* startingNode, long& totalLength, long currentSize, long& maxSize, bool add2Size)
+{
+    if (startingNode->parent) {
+        totalLength+=startingNode->in_object;
+    }
+
+    if (add2Size) {
+        currentSize++;
+    }
+
+    if (currentSize>maxSize) {
+        maxSize = currentSize;
+    }
+
+    for (long k=1; k<startingNode->nodes.length; k++) {
+        countingTraverse (startingNode->go_down(k), totalLength, currentSize, maxSize, true);
+    }
+
+    if (startingNode->nodes.length) {
+        countingTraverse (startingNode->go_down(startingNode->nodes.length), totalLength, currentSize, maxSize, false);
+    }
+}
+
+//_______________________________________________________________________________________
+
+void    countingTraverseArbRoot (node<long>* startingNode, node<long>* childNode, long& totalLength, long currentSize, long& maxSize)
+{
+    if (childNode)
+        for (long k=1; k<=startingNode->nodes.length; k++) {
+            node<long>* cNode = startingNode->go_down(k);
+            if (cNode!=childNode) {
+                countingTraverse (cNode, totalLength, currentSize, maxSize, true);
+            }
+        }
+    else
+        for (long k=1; k<=startingNode->nodes.length; k++) {
+            countingTraverse (startingNode->go_down(k), totalLength, currentSize, maxSize, true);
+        }
+
+    if (startingNode->parent) {
+        totalLength+=startingNode->in_object;
+        countingTraverseArbRoot (startingNode->parent, startingNode, totalLength, currentSize, maxSize);
+    }
+}
+//_______________________________________________________________________________________
+
+long    findAvailableSlot (_SimpleList& cs, long& ff)
+{
+    for (long k = ff; k<cs.lLength; k++)
+        if (cs.lData[k] == -1) {
+            ff = k+1;
+            return k;
+        }
+    {
+        for (long k = 0; k<ff; k++)
+            if (cs.lData[k] == -1) {
+                ff = k+1;
+                return k;
+            }
+    }
+    cs << -1;
+    ff = 0;
+    return cs.lLength-1;
+}
+
+//_______________________________________________________________________________________
+
+void    setComputingArrays (node<long>* startingNode, node<long>* childNode, _SimpleList& co, _SimpleList& so, _SimpleList &cs, _SimpleList& ro, _SimpleList& po, long& ff)
+{
+    bool isFirstNode = (co.lLength == 0);
+
+    co << startingNode->in_object;
+
+    if (isFirstNode || startingNode->nodes.length) {
+        long id = findAvailableSlot(cs,ff);
+        cs.lData[id] = startingNode->in_object;
+        startingNode->in_object = id;
+        so << id;
+        if (isFirstNode) {
+            ro << -1;
+            po << -1;
+        }
+    } else {
+        so << -1;
+    }
+
+    if (childNode) { // above root node
+        ro << cs.lData[childNode->in_object];
+        po << (long)childNode;
+
+        if (startingNode->parent) {
+            for (long k=1; k<=startingNode->nodes.length; k++) {
+                node<long>* cNode = startingNode->go_down(k);
+                if (cNode!=childNode) {
+                    setComputingArrays (startingNode->go_down(k), nil, co,so,cs,ro,po,ff);
+                }
+            }
+            cs.lData[childNode->in_object] = -1;
+            setComputingArrays (startingNode->parent, startingNode, co,so,cs,ro,po,ff);
+        } else { // actual tree root
+            bool passedUpPath = false;
+
+            for (long k=1; k<=startingNode->nodes.length; k++) {
+                node<long>* cNode = startingNode->go_down(k);
+                if (cNode!=childNode) {
+                    if ((k==startingNode->nodes.length)||((k==startingNode->nodes.length-1)&&(!passedUpPath))) {
+                        cs.lData[startingNode->in_object] = -1;
+                    }
+                    setComputingArrays (startingNode->go_down(k), nil, co,so,cs,ro,po,ff);
+                } else {
+                    passedUpPath = true;
+                }
+            }
+        }
+    } else { // "below" root node
+        if ((!isFirstNode)&&startingNode->parent) {
+            ro << startingNode->parent->in_object;
+            po << (long)startingNode->parent;
+        }
+
+        for (long k=1; k<startingNode->nodes.length; k++) {
+            setComputingArrays (startingNode->go_down(k), nil, co,so,cs,ro,po,ff);
+        }
+
+        if (!isFirstNode)
+            if (startingNode->nodes.length) {
+                cs.lData[startingNode->in_object] = -1;
+            }
+
+        if (startingNode->nodes.length) {
+            setComputingArrays (startingNode->go_down(startingNode->nodes.length), nil, co,so,cs,ro,po,ff);
+        }
+
+        if (isFirstNode&&startingNode->parent) {
+            cs.lData[startingNode->in_object] = -1;
+            setComputingArrays (startingNode->parent,startingNode, co,so,cs,ro,po,ff);
+        }
+
+    }
+}
+
+//_______________________________________________________________________________________
+
+void        _LikelihoodFunction::OptimalOrder    (long index, _SimpleList& sl)
+{
+
+    _DataSetFilter* df = (_DataSetFilter*)(dataSetFilterList(theDataFilters (index)));
+
+    long            partition           = -1,
+                    totalSites           = 0,
+                    completedSites         = 0,
+                    startpt,
+                    endpt,
+                    j,
+                    max                 = -1,
+                    k,
+                    intI,
+                    totalLength;
+
+
+
+    _Parameter      skipo = 1.0;
+    _TheTree        *t = (_TheTree*)LocateVar(theTrees(index));
+    checkParameter  (optimizeSummationOrder,skipo,1.0);
+
+    if (!skipo || df->NumberDistinctSites()==1 || t->IsDegenerate() || !df->IsNormalFilter ()) { // do not optimize
+        for (k = 0; k < df->NumberDistinctSites(); k++) {
+            sl<<k;
+        }
+        return;
+    }
+    SetStatusLine ("Optimizing data ordering");
+    checkParameter (optimizePartitionSize,skipo,0.0);
+    totalSites = df->NumberDistinctSites();
+    if (skipo) { //  partition the sequence into smaller subseqs. for optimization
+        partition = (long)skipo;
+        if ((partition<=0)||(partition>totalSites)) {
+            partition = totalSites;
+        }
+    } else { // revert to default partitioning
+        partition = totalSites>1500?1500:totalSites;
+    }
+
+    long    vLevel       = VerbosityLevel(),
+            globalLength = 0;
+
+    if (vLevel>5) {
+        char buffer [128];
+        snprintf (buffer, sizeof(buffer),"\nOptimizing Column Order for block %ld", index);
+        BufferToConsole (buffer);
+    }
+
+    _SimpleList   partitionSites, distances, edges;
+
+
+    while (completedSites<totalSites) {
+        if (totalSites-completedSites<partition) {
+            partition = totalSites-completedSites;
+        }
+
+        intI = 0; // internal index for partition
+
+        // populate sites allowed
+
+        if (df->GetUnitLength()==1) {
+            for (k=completedSites+1; k<completedSites+partition; k++) {
+                partitionSites<<k;
+                distances<<t->ComputeReleafingCostChar (df, completedSites, k);
+                edges<<completedSites;
+            }
+        } else {
+            for (k=completedSites+1; k<completedSites+partition; k++) {
+                partitionSites<<k;
+                distances<<t->ComputeReleafingCost (df, completedSites, k);
+                edges<<completedSites;
+            }
+        }
+
+        node<long>*   spanningTreeRoot;
+        _SimpleList   spanningTreePointers,
+                      spanningTreeSites;
+
+        if (mstCache) {
+            spanningTreeRoot = new node<long>;
+            spanningTreeSites << 0;
+            for (k=completedSites+1; k<completedSites+partition; k++) {
+                spanningTreePointers << (long)spanningTreeRoot;
+                spanningTreeSites << 0;
+            }
+            spanningTreeSites.lData[0] = (long)spanningTreeRoot;
+        }
+
+        sl << completedSites;
+
+        while (intI<partition-1) {
+            // search for the shortest branch to add to the tree.
+            max = 0x0fffffff;
+            long * pl  = distances.lData;
+
+            for (k=0; k<distances.lLength; k++,pl++)
+                if (*pl<=max) {
+                    max = *pl;
+                    endpt = partitionSites.lData[k];
+                    startpt = k;
+                }
+
+            // delete k from allowed sites
+            partitionSites.Delete(startpt);
+            distances.Delete(startpt);
+            // insert the endpt into the tree before the pt that the edge came from
+
+            node<long>*   spanningTreeNode;
+            if (mstCache) {
+                spanningTreeNode = new node<long>;
+                spanningTreeNode->in_object = max;
+                ((node<long>*)spanningTreePointers.lData[startpt])->add_node (*spanningTreeNode);
+                spanningTreeSites.lData[endpt-completedSites] = (long)spanningTreeNode;
+                spanningTreePointers.Delete(startpt);
+            }
+
+            j = sl.Find(edges.lData[startpt],completedSites);
+            sl.InsertElement ((BaseRef)endpt,j+1,false,false);
+            edges.Delete(startpt);
+
+            // make one more pass and update the distances if needed
+            if (df->GetUnitLength()==1) {
+                for (k=0; k<distances.lLength; k++) {
+                    j = t->ComputeReleafingCostChar (df,endpt, partitionSites.lData[k]);
+                    if (j<distances.lData[k]) {
+                        distances.lData[k]=j;
+                        edges.lData[k] = endpt;
+
+                        if (mstCache) {
+                            spanningTreePointers.lData[k] = (long)spanningTreeNode;
+                        }
+                    }
+                }
+            } else {
+                for (k=0; k<distances.lLength; k++) {
+                    j = t->ComputeReleafingCost (df,endpt, partitionSites.lData[k]);
+                    if (j<distances.lData[k]) {
+                        distances.lData[k]=j;
+                        edges.lData[k] = endpt;
+
+                        if (mstCache) {
+                            spanningTreePointers.lData[k] = (long)spanningTreeNode;
+                        }
+                    }
+                }
+            }
+
+            intI++;
+            if (intI%50==0) {
+#if !defined __UNIX__ || defined __HEADLESS__
+                SetStatusBarValue ((intI+completedSites)*100/totalSites,1.0, 0.0);
+#endif
+                //yieldCPUTime();
+            }
+        }
+
+
+
+        partitionSites.Clear();
+        distances.Clear();
+        edges.Clear();
+
+        if (mstCache) {
+            // print out the info on the spanning tree
+            // keep track of the "deepest path"
+            long        maxLevel    = 0;
+
+            totalLength = 0;
+            countingTraverse (spanningTreeRoot,totalLength,0,maxLevel,true);
+
+            globalLength += totalLength;
+
+            _String     * res = new _String((unsigned long)128,true);
+
+            long        level,
+                        nc          =   0;
+
+
+            node<long>* curNode= DepthWiseStepTraverser(spanningTreeRoot),
+                        *   bestRoot = spanningTreeRoot;
+
+            while (curNode!=spanningTreeRoot) {
+                long maxLevel2 = 0;
+                totalLength = 0;
+                countingTraverseArbRoot (curNode, nil, totalLength, 1, maxLevel2);
+                if (maxLevel2<maxLevel) {
+                    maxLevel = maxLevel2;
+                    bestRoot = curNode;
+                }
+                curNode= DepthWiseStepTraverser((node <long>*) nil);
+            }
+
+            _SimpleList   computingOrder,
+                          storageOrder,
+                          cacheSlots,
+                          referenceOrder,
+                          parentOrder;
+
+            for (level=0; level<maxLevel; level++) {
+                cacheSlots << -1;
+            }
+
+            for (level=0; level<spanningTreeSites.lLength; level++) {
+                ((node<long>*)spanningTreeSites.lData[level])->in_object = level+completedSites;
+            }
+
+            setComputingArrays (spanningTreeRoot, nil, computingOrder, storageOrder, cacheSlots, referenceOrder, parentOrder, nc);
+
+            for (level=0; level<spanningTreeSites.lLength; level++) {
+                ((node<long>*)spanningTreeSites.lData[level])->in_object = level+completedSites;
+            }
+
+            for (level=1; level<parentOrder.lLength; level++) {
+                parentOrder.lData[level] = ((node<long>*)parentOrder.lData[level])->in_object;
+            }
+
+            if (completedSites) {
+                level = mstCache->computingOrder.lLength-1;
+                (*(_SimpleList*)mstCache->computingOrder(level)) << computingOrder;
+                (*(_SimpleList*)mstCache->storageOrder(level)) << storageOrder;
+                (*(_SimpleList*)mstCache->referenceOrder(level)) << referenceOrder;
+                (*(_SimpleList*)mstCache->parentOrder(level)) << parentOrder;
+                if (cacheSlots.lLength > mstCache->cacheSize.lData[level]) {
+                    mstCache->cacheSize.lData[level] = cacheSlots.lLength;
+                }
+            } else {
+                mstCache->computingOrder    && & computingOrder;
+                mstCache->storageOrder      && & storageOrder;
+                mstCache->referenceOrder    && & referenceOrder;
+                mstCache->parentOrder       && & parentOrder;
+                mstCache->cacheSize         << cacheSlots.lLength;
+            }
+
+#ifdef __SORTING_DEBUG
+            char        buffer[512];
+            _Matrix     dataMx (computingOrder.lLength,4,false,true);
+
+            nc = 0;
+            for (level = 0; level < computingOrder.lLength; level++) {
+                dataMx.theData[nc++] = computingOrder.lData[level];
+                dataMx.theData[nc++] = storageOrder.lData[level];
+                dataMx.theData[nc++] = referenceOrder.lData[level];
+                dataMx.theData[nc++] = parentOrder.lData[level];
+            }
+
+
+            _List       titles;
+            titles  && &_String("Computing Order");
+            titles  && &_String("Storage Order");
+            titles  && &_String("Storage Reference Order");
+            titles  && &_String("Parent Order");
+
+            _HYChartWindow* ncw = new _HYChartWindow ("MST Debug", titles, dataMx, nil);
+            ncw->Activate();
+
+            for (level=0; level<spanningTreeSites.lLength; level++) {
+                ((node<long>*)spanningTreeSites.lData[level])->in_object = level;
+            }
+
+            nc = 0;
+            for (level=1; level<computingOrder.lLength; level++) {
+                nc += t->ComputeReleafingCost (df,computingOrder.lData[level],parentOrder.lData[level]);
+            }
+
+            snprintf (buffer, sizeof(buffer),"\nDouble check cost %d\n", nc);
+            BufferToConsole (buffer);
+
+            nc = 0;
+            curNode= DepthWiseStepTraverserLevel(myLevel,spanningTreeRoot);
+            node<long>*  nextNode;
+            level       = myLevel;
+
+
+            nextNode    =  DepthWiseStepTraverserLevel(myLevel,nil) ;
+
+            while (nextNode) {
+                if (level>lastLevel) {
+                    if (lastLevel) {
+                        (*res)<<',';
+                    }
+                    for (j=0; j<level-lastLevel; j++) {
+                        (*res)<<'(';
+                    }
+                } else if (level<lastLevel) {
+                    for (j=0; j<lastLevel-level; j++) {
+                        (*res)<<')';
+                    }
+                } else {
+                    (*res)<<',';
+                }
+
+                (*res)<<_String(nc++);
+
+                lastLevel = level;
+                level     = myLevel;
+                curNode   = nextNode;
+                nextNode    =  DepthWiseStepTraverserLevel(myLevel,nil) ;
+
+            }
+            for (j=0; j<lastLevel-level; j++) {
+                (*res)<<')';
+            }
+
+            (*res).Finalize();
+
+            _String      stree ("MST_STRING");
+            _FString fr  (res);
+            setParameter (stree, &fr);
+
+            //DeleteObject  (res);
+#else
+            res->Finalize();
+            DeleteObject (res);
+#endif
+            spanningTreeRoot->delete_tree();
+            delete (spanningTreeRoot); // dmalloc fix 06162005
+
+        }
+
+        completedSites+=partition;
+        if (vLevel>5) {
+            char   buffer[64];
+            snprintf (buffer, sizeof(buffer),"\n%ld %% done", (long)(completedSites*100/totalSites));
+            BufferToConsole (buffer);
+        }
+    }
+
+    _SimpleList straight (sl.lLength, 0, 1),
+                * tcc = nil;
+
+#ifdef _SLKP_LFENGINE_REWRITE_
+    if (treeTraversalMasks.lLength > index) {
+        tcc =  (_SimpleList*) treeTraversalMasks(index);
+    }
+
+#endif
+
+    _Parameter strl = CostOfPath (df,t,straight),
+               optl = CostOfPath (df,t,sl,tcc);
+
+    if (vLevel>500) {
+        _String* opPath = (_String*)sl.toStr();
+        BufferToConsole("\nSite ordering:");
+        StringToConsole(*opPath);
+        DeleteObject(opPath);
+    }
+
+    char buffer [512];
+    snprintf (buffer, sizeof(buffer),"\nPseudo-optimal path's cost %ld vs %ld for 1..k=> a %g x improvement",(long)optl,(long)strl,strl/(double)optl );
+    ReportWarning (buffer);
+    if (vLevel>5) {
+        BufferToConsole (buffer);
+    }
+
+    if (mstCache) {
+        long     memOverhead = mstCache->cacheSize.lData[mstCache->cacheSize.lLength-1];
+        if (memOverhead) {
+            memOverhead *= (t->GetINodeCount()*(sizeof(_Parameter)*t->GetCodeBase()+sizeof(long)+sizeof (char))+t->GetLeafCount()*(sizeof(_Parameter)+sizeof(long)))/1024;
+            snprintf (buffer, sizeof(buffer),"\nIf using full MST heurisitcs: %ld vs %ld for 1..k=> a %g x (relative %g x) improvement with %ld KB memory overhead",globalLength,(long)strl,strl/(double)globalLength,optl/(double)globalLength,memOverhead);
+            ReportWarning (buffer);
+            if (vLevel>5) {
+                BufferToConsole (buffer);
+            }
+        }
+    }
+
+#ifdef __SORTING_DEBUG
+    printf ("\nTheortical cost lower bound %ld",t->GetLowerBoundOnCost (df));
+    printf ("\nSave all cost lower bound %ld",t->GetLowerBoundOnCostWithOrder (df,&sl));
+#endif
+}
+//_______________________________________________________________________________________
+
+void    _LikelihoodFunction::ComputePruningEfficiency (long& full, long& saved)
+{
+    full = 0;
+    saved = 0;
+    for (long i=0; i<theTrees.lLength; i++) {
+        _TheTree    *cT = ((_TheTree*)(LocateVar(theTrees(i))));
+        _SimpleList *l  = (_SimpleList*)leafSkips (i);
+        _PMathObj   lc  = cT->TipCount();
+
+        long         leafCount = lc->Value(),
+                     iCount;
+
+        DeleteObject (lc);
+        lc = cT->BranchCount ();
+        iCount = lc->Value();
+        DeleteObject (lc);
+
+        saved += leafCount+iCount;
+        full  += (leafCount+iCount) * (l->lLength+1);
+
+        for (long k=0; k<l->lLength; k++) {
+            unsigned long j = l->lData[k],
+                          p1 = j&0xffff,
+                          p2 = ((j>>16)&0xffff);
+
+            saved += leafCount - p1 - (leafCount - 1 - p2);
+            saved += iCount - cT->GetLeftINodes().lData[p1];
+        }
+    }
+}
+
+//_______________________________________________________________________________________
+
+long    _LikelihoodFunction::CountObjects (char flag)
+{
+    switch (flag) {
+    case 1: {
+        long res = 0;
+        for (long k=0; k<indexInd.lLength; k++) {
+            _Variable *v = LocateVar (indexInd.lData[k]);
+            if (v->IsGlobal()) {
+                res++;
+            }
+        }
+        return res;
+    }
+    case 2:
+        return indexInd.lLength - CountObjects (1);
+    case 3:
+        return indexDep.lLength;
+    case 4:
+        return indexCat.lLength;
+    }
+    return theTrees.lLength;
+}
+
+//_______________________________________________________________________________________
+
+//______________________________________________________________________________
+void _LikelihoodFunction::SerializeLF(_String & rec, char opt,
+                                      _SimpleList * partitionList,
+                                      _SimpleList * exportPart) {
+
+    // first - check how many data sets the LF depends on;
+    // if only one - then spool it out into a NEXUS string;
+    // if more than one - output a NEXUS file where
+    // data sets after the first one are embedded as strings.
+    RescanAllVariables();
+
+    if (partitionList) {
+
+        // validate the list
+        _String errMsg;
+        if (partitionList->lLength == 0 ||
+            partitionList->lLength > theDataFilters.lLength) {
+            errMsg = "The partition list for sub-export passed to SerializeLF "
+                     "was either empty or too long";
+        } else {
+            // check for duplicates and index overrun
+            partitionList->Sort();
+            if (partitionList->lData[partitionList->lLength - 1] >=
+                theDataFilters.lLength) {
+                errMsg = "The partition list contained invalid partition "
+                         "indices (too high) in call to SerializeLF";
+            } else {
+                for (unsigned long k2 = 1; k2 < partitionList->lLength; k2++) {
+                    if (partitionList->lData[k2] ==
+                        partitionList->lData[k2 - 1]) {
+                        errMsg = "The partition list contained duplicate "
+                                 "partition indices in call to SerializeLF";
+                        break;
+                    }
+                }
+            }
+        }
+
+        if (errMsg.sLength) {
+            WarnError(errMsg);
+            return;
+        }
+    }
+
+    _String *lfName = (_String *)likeFuncNamesList(
+        likeFuncList._SimpleList::Find((long) this));
+
+    ReportWarning(_String("Serializing ") & *lfName & " with mode " &
+                  _String((long) opt));
+
+    if (opt == _hyphyLFSerializeModeShortMPI) {
+        _String resVarName = *lfName & "_MLES";
+        _Variable *resVar = FetchVar(LocateVarByName(resVarName));
+        if (resVar) {
+            rec.AppendAnAssignmentToBuffer(
+                &resVarName, (_String *)resVar->Compute()->toStr());
+        }
+
+        resVarName = *lfName & "_MLE_VALUES";
+
+        rec.AppendAnAssignmentToBuffer(&resVarName, &emptyAssociativeList,
+                                       false);
+        rec.AppendVariableValueAVL(&resVarName, indexInd);
+        rec.AppendVariableValueAVL(&resVarName, indexDep);
+
+        return;
+    }
+
+
+    _SimpleList *redirector = nil;
+    if (partitionList) {
+        redirector = new _SimpleList;
+        checkPointer(redirector);
+        for (unsigned long pidx = 0; pidx < partitionList->lLength;
+             pidx = pidx + 1) {
+            (*redirector) << theDataFilters.lData[partitionList->lData[pidx]];
+        }
+    } else {
+        redirector = &theDataFilters;
+    }
+
+    _SimpleList taggedDataSets, dataSetsByFilter;
+
+    _AVLListX taggedDS(&taggedDataSets);
+
+    for (unsigned long idx = 0; idx < redirector->lLength; idx++) {
+
+        long tIdx = dataSetList._SimpleList::Find(
+            (long)(((_DataSetFilter *)dataSetFilterList(redirector->lData[idx]))
+                       ->GetData()));
+        tIdx = taggedDS.Insert((BaseRef) tIdx, taggedDS.countitems());
+
+        if (tIdx < 0) {
+            tIdx = -tIdx - 1;
+        }
+
+        dataSetsByFilter << tIdx;
+
+    }
+
+    if (taggedDS.countitems() > 1 && exportPart) {
+        _String errMsg =
+            _String("Can't represent likelihood function ") &
+            *(_String *)likeFuncNamesList(
+                likeFuncList._SimpleList::Find((long) this)) &
+            " as a single file with a prespecified partition, because it "
+            "depends on multiple datasets. This is an internal error.";
+        WarnError(errMsg);
+        return;
+    }
+
+    _SimpleList indexedDataSets(taggedDS.countitems(), 0, 0);
+
+    for (unsigned long idx2 = 0; idx2 < taggedDataSets.lLength; idx2++) {
+        indexedDataSets.lData[taggedDS.xtraD.lData[idx2]] =
+            taggedDataSets.lData[idx2];
+    }
+
+    _List involvedSites, avlSupport, dV;
+
+    _SimpleList unique_sites;
+
+    for (unsigned long idx3 = 0; idx3 < indexedDataSets.lLength; idx3++) {
+        unique_sites << 0;
+        _SimpleList *esl = new _SimpleList;
+        checkPointer(esl);
+        avlSupport.AppendNewInstance(esl);
+        involvedSites.AppendNewInstance(new _AVLListX(esl));
+        dV.AppendNewInstance(new _SimpleList);
+    }
+
+    // create a dummy data filter and spool the data to a file
+    stashParameter(skipOmissions, 0.0, true);
+
+    if (partitionList || !exportPart) {
+        for (unsigned long idx = 0; idx < redirector->lLength; idx++) {
+
+            _SimpleList *originalOrderFF =
+                &((_DataSetFilter *)dataSetFilterList(redirector->lData[idx]))
+                    ->theOriginalOrder;
+
+            _AVLListX *involvedSitesL =
+                (_AVLListX *)(involvedSites(dataSetsByFilter.lData[idx]));
+
+            long *unique_sitesL =
+                unique_sites.lData + dataSetsByFilter.lData[idx];
+
+            for (unsigned long idx2 = 0; idx2 < originalOrderFF->lLength;
+                 idx2++) {
+                if (involvedSitesL->Insert(
+                        (BaseRef)(originalOrderFF->lData[idx2]),
+                        *unique_sitesL) >= 0) {
+                    (*unique_sitesL)++;
+                }
+            }
+        }
+
+        for (unsigned long idx4 = 0; idx4 < indexedDataSets.lLength; idx4++) {
+
+            _AVLListX *involvedSitesL = (_AVLListX *)involvedSites(idx4);
+            _SimpleList tcache, *dVL = (_SimpleList *)dV(idx4);
+
+            long iv, k = involvedSitesL->Traverser(tcache, iv,
+                                                   involvedSitesL->GetRoot());
+
+            for (; k >= 0; k = involvedSitesL->Traverser(tcache, iv)) {
+                (*dVL) << (long) involvedSitesL->Retrieve(k);
+                involvedSitesL->SetXtra(k, dVL->lLength - 1);
+            }
+        }
+    } else if (exportPart) {
+        ((_SimpleList *)dV(dataSetsByFilter(0)))->Duplicate(exportPart);
+    }
+
+    for (unsigned long idx5 = 0; idx5 < indexedDataSets.lLength; idx5++) {
+
+        _DataSetFilter *entireSet = new _DataSetFilter();
+        checkPointer(entireSet);
+        _SimpleList dH;
+        stashParameter(skipOmissions, 0.0, true);
+        entireSet->SetFilter(
+            (_DataSet *)dataSetList(indexedDataSets.lData[idx5]), 1, dH,
+            *(_SimpleList *)dV(idx5));
+        stashParameter(skipOmissions, 0.0, false);
+        if (idx5) {
+            stashParameter(dataFilePrintFormat, 0.0, true);
+        } else {
+            stashParameter(dataFilePrintFormat, 4.0, true);
+        }
+
+        _String *cs = (_String *)entireSet->toStr();
+
+        if (idx5) {
+            if (idx5 == 1) {
+                rec << "\n\nBEGIN HYPHY;\n\n";
+            }
+            rec << "_tdsstring_ = \"";
+            rec.EscapeAndAppend(*cs);
+            rec << "\";\nDataSet ";
+            rec << (_String *)dataSetNamesList(indexedDataSets.lData[idx5]);
+            rec << " = ReadFromString (_tdsstring_);\n_tdsstring_=0;\n";
+        } else {
+            rec.AppendNewInstance(cs);
+        }
+        DeleteObject(entireSet);
+        stashParameter(dataFilePrintFormat, 0.0, false);
+    }
+
+    if (indexedDataSets.lLength == 1) {
+        rec << "\n\nBEGIN HYPHY;\n\n";
+    }
+
+    if (opt == _hyphyLFSerializeModeOptimize) {
+        _Parameter p1, p2;
+        checkParameter(useLastResults, p1, 0.0);
+        checkParameter(useInitialDistanceGuess, p2, 1.0);
+        if (CheckEqual(p1, 0.0) && p2 > .1) {
+            for (unsigned long i = 0; i < indexInd.lLength; i++) {
+                LocateVar(indexInd.lData[i])->MarkDone();
+            }
+
+            GetInitialValues();
+        }
+
+        _FString *mpiPrefix = (_FString *)FetchObjectFromVariableByType(
+            &mpiPrefixCommand, STRING);
+
+        if (mpiPrefix) {
+            rec << mpiPrefix->theString;
+        }
+    }
+
+    // write out all globals
+    _String glVars(1024L, true), locVars(1024L, true);
+
+    char str[4096];
+
+    _SimpleList *indepVarList = nil, *depVarList = nil, *catVarList = nil;
+
+    if (partitionList) {
+        indepVarList = new _SimpleList;
+        depVarList = new _SimpleList;
+        catVarList = new _SimpleList;
+
+        checkPointer((Ptr)(indepVarList && depVarList && catVarList));
+        ScanAllVariablesOnPartition(*partitionList, *indepVarList, *depVarList,
+                                    *catVarList);
+    } else {
+        indepVarList = &indexInd;
+        depVarList = &indexDep;
+        catVarList = &indexCat;
+    }
+
+    ExportIndVariables(glVars, locVars, indepVarList);
+    ExportDepVariables(glVars, locVars, depVarList);
+
+    glVars.Finalize();
+    locVars.Finalize();
+
+    rec << glVars;
+
+    // write out all categs
+    if (opt == _hyphyLFSerializeModeCategoryAsGlobal) {
+        for (long idx = 0; idx < catVarList->lLength; idx++) {
+            _CategoryVariable *theC =
+                (_CategoryVariable *)LocateVar(catVarList->lData[idx]);
+            snprintf(str, sizeof(str), "\nglobal %s;",
+                     theC->GetName()->getStr());
+            rec << str;
+        }
+    } else {
+        ExportCatVariables(rec, catVarList);
+    }
+
+    //write out all the models
+    _SimpleList *redirectorT = nil, dH, dV2, dU;
+
+    if (partitionList) {
+        redirectorT = new _SimpleList;
+        checkPointer(redirectorT);
+        for (long pidx = 0; pidx < partitionList->lLength; pidx = pidx + 1) {
+            (*redirectorT) << theTrees.lData[partitionList->lData[pidx]];
+        }
+    } else {
+        redirectorT = &theTrees;
+    }
+
+    for (long idx = 0; idx < redirectorT->lLength; idx++) {
+        _SimpleList dT;
+        ((_TheTree *)LocateVar(redirectorT->lData[idx]))
+            ->CompileListOfModels(dT);
+
+        if (dT.lLength == 1) {
+            dV2 << dT.lData[0];
+        } else {
+            dV2 << -1;
+        }
+
+        dH.Union(dU, dT);
+        dU.Duplicate(&dH);
+    }
+
+    {
+        _SimpleList modelAux;
+        _AVLList modelDupChecker(&modelAux);
+        for (long idx = 0; idx < dH.lLength; idx++) {
+            SerializeModel(rec, dH.lData[idx], &modelDupChecker);
+        }
+
+    }
+
+
+    // write out all the trees, including model definitions if needed
+    _Parameter stashIM = 0.0;
+    checkParameter(tryNumericSequenceMatch, stashIM, 0.0);
+
+    rec.AppendAnAssignmentToBuffer(&tryNumericSequenceMatch,
+                                   new _String(stashIM));
+
+    checkParameter(acceptRootedTrees, stashIM, 0.0);
+    rec.AppendAnAssignmentToBuffer(&acceptRootedTrees, new _String(stashIM));
+
+    checkParameter(includeModelSpecs, stashIM, 0.0);
+    {
+        for (long idx = 0; idx < redirectorT->lLength; idx++) {
+            if (dV2.lData[idx] >= 0) {
+                rec << "\nUseModel (";
+                rec << *((_String *)modelNames(dV2.lData[idx]));
+                rec << ");\n";
+                setParameter(includeModelSpecs, 0.0);
+            } else {
+                setParameter(includeModelSpecs, 1.0);
+            }
+
+            rec << "Tree ";
+            rec << LocateVar(redirectorT->lData[idx])->GetName();
+            rec << '=';
+            rec.AppendNewInstance((_String *)(
+                (_TheTree *)LocateVar(redirectorT->lData[idx]))->toStr());
+            rec << '\n';
+        }
+    }
+    setParameter(includeModelSpecs, stashIM);
+
+    rec << locVars;
+
+    // spool out the specs for datafilter
+    rec << "\nDataSet ";
+    rec << ((_String *)dataSetNamesList(indexedDataSets.lData[0]))->getStr();
+    rec << " = ReadDataFile(";
+    rec << useNexusFileData;
+    rec << ");\n";
+
+    dU.Clear();
+    _AVLList writtenDF(&dU);
+
+    for (long idx = 0; idx < redirector->lLength; idx++) {
+        if (writtenDF.Insert((BaseRef) redirector->lData[idx]) >= 0) {
+            _DataSetFilter *theDF =
+                (_DataSetFilter *)dataSetFilterList(redirector->lData[idx]);
+            _String *horPart;
+
+            if (partitionList || !exportPart) {
+                _SimpleList remappedOO;
+                _AVLListX *involvedSitesL =
+                    (_AVLListX *)involvedSites(dataSetsByFilter.lData[idx]);
+                for (long idx2 = 0; idx2 < theDF->theOriginalOrder.lLength;
+                     idx2++) {
+                    remappedOO
+                        << involvedSitesL->GetXtra(involvedSitesL->Find(
+                               (BaseRef) theDF->theOriginalOrder.lData[idx2]));
+                }
+                horPart = (_String *)remappedOO.ListToPartitionString();
+            } else if (exportPart) {
+                horPart =
+                    new _String(_String("0-") & (long) exportPart->lLength - 1);
+            }
+            // else
+            // horPart = (_String*)theDF->theOriginalOrder.ListToPartitionString();
+
+            rec << "DataSetFilter ";
+            rec << ((_String *)dataSetFilterNamesList(redirector->lData[idx]))
+                       ->getStr();
+            rec << " = CreateFilter(";
+            rec << ((_String *)dataSetNamesList(
+                       indexedDataSets.lData[dataSetsByFilter.lData[idx]]))
+                       ->getStr();
+            rec << ',';
+            rec << _String((long) theDF->GetUnitLength());
+            rec << ',';
+            rec << '"';
+            rec << *horPart;
+            rec << '"';
+            DeleteObject(horPart);
+            horPart = (_String *)theDF->theNodeMap.ListToPartitionString();
+            rec << ',';
+            rec << '"';
+            rec << *horPart;
+            rec << '"';
+            DeleteObject(horPart);
+
+            horPart = theDF->GetExclusions();
+            if (horPart->sLength) {
+                rec << ',';
+                rec << '"';
+                rec << *horPart;
+                rec << '"';
+            }
+            DeleteObject(horPart);
+
+            rec << ");\n";
+        }
+    }
+
+    // write out the global variable for enforcing reversible models
+    checkParameter(assumeReversible, stashIM, 0.0);
+    rec.AppendAnAssignmentToBuffer(&assumeReversible, new _String(stashIM));
+
+    rec << "LikelihoodFunction ";
+    rec << *lfName;
+    rec << " = (";
+
+    long dsID = 0;
+    {
+        for (long idx = 0; idx < redirector->lLength; idx++) {
+            if (dsID) {
+                rec << ',';
+            } else {
+                dsID = 1;
+            }
+
+            rec << (_String *)dataSetFilterNamesList(redirector->lData[idx]);
+            rec << ',';
+            rec << *LocateVar(redirectorT->lData[idx])->GetName();
+        }
+    }
+    if (computingTemplate && templateKind == 1) {
+        rec << ",\"";
+        rec << (_String *)computingTemplate->toStr();
+        rec << '"';
+    }
+
+    if (opt == _hyphyLFSerializeModeOptimize) {
+        rec << ");\n";
+        _Parameter pv;
+        checkParameter(optimizationPrecision, pv, 0.001);
+        rec.AppendAnAssignmentToBuffer(&optimizationPrecision, new _String(pv));
+        checkParameter(optimizationMethod, pv, 4.);
+        rec.AppendAnAssignmentToBuffer(&optimizationMethod, new _String(pv));
+        checkParameter(useInitialDistanceGuess, pv, 1.);
+        rec.AppendAnAssignmentToBuffer(&useInitialDistanceGuess,
+                                       new _String(pv));
+        checkParameter(useLastResults, pv, 0.);
+        rec.AppendAnAssignmentToBuffer(&useLastResults, new _String(pv));
+        checkParameter(optimizationHardLimit, pv, -1.);
+        if (pv > 0.) {
+            rec.AppendAnAssignmentToBuffer(&optimizationHardLimit,
+                                           new _String(pv));
+        }
+        rec << "Optimize(";
+        rec << lfName;
+        rec << "_MLES,";
+        rec << lfName;
+        rec << ");\n";
+        rec << mpiMLELFValue;
+        rec << '=';
+        rec << lfName;
+        rec << "_MLES[1][0];\n";
+        rec << lf2SendBack;
+        rec << "=\"";
+        rec << lfName;
+        rec << "\";\n";
+        checkParameter(shortMPIReturn, pv, 0);
+        rec.AppendAnAssignmentToBuffer(&shortMPIReturn, new _String(pv));
+    } else if (opt == _hyphyLFSerializeModeLongMPI) {
+        rec << ");\n";
+        rec.AppendAnAssignmentToBuffer(
+            &mpiMLELFValue, new _String(FetchVar(LocateVarByName(mpiMLELFValue))
+                                            ->Compute()->Value()));
+
+        _String resVarName = *lfName & "_MLES";
+        _Variable *resVar = FetchVar(LocateVarByName(resVarName));
+        if (resVar) {
+            rec.AppendAnAssignmentToBuffer(
+                &resVarName, (_String *)resVar->Compute()->toStr());
+        }
+    } else {
+        rec << ");";
+    }
+
+    _FString *haveExtra =
+        (_FString *)FetchObjectFromVariableByType(&lfExtraLFExportCode, STRING);
+    if (haveExtra) {
+        rec << *(haveExtra->theString);
+    }
+
+    rec << "\n\nEND;";
+
+    if (partitionList) {
+        DeleteObject(redirector);
+        DeleteObject(indepVarList);
+        DeleteObject(depVarList);
+        DeleteObject(catVarList);
+        DeleteObject(redirectorT);
+    }
+}
+
+//_______________________________________________________________________________________
+
+BaseRef _LikelihoodFunction::toStr (void)
+{
+    _Parameter longOrShort,
+               value = 0.0;
+
+    checkParameter(likefuncOutput,longOrShort,2.0);
+
+    if (longOrShort < 4.0) {
+        PrepareToCompute();
+        value = Compute();
+    }
+
+
+    if (longOrShort>5.5) { // serialized self-contained LF
+        _String   *sLF = new _String (8192L, true);
+        checkPointer    (sLF);
+        //_SimpleList   dummySL (8,0,1);
+        SerializeLF     (*sLF);
+        sLF->Finalize   ();
+        return          sLF;
+    }
+
+    _String res(1,true);
+    char str [2048];
+
+    if (longOrShort>=4.0) { // just spool out the names of parameters
+        _Variable * thisVar;
+
+        for (long i=0; i<indexInd.lLength; i++) {
+            thisVar = LocateVar(indexInd.lData[i]);
+            if (thisVar->IsGlobal()) {
+                snprintf (str, sizeof(str), "\nglobal %s=%.16g;", thisVar->GetName()->getStr(),(double)GetIthIndependent(i));
+            } else {
+                snprintf (str, sizeof(str), "\n%s=%.16g;", thisVar->GetName()->getStr(),(double)GetIthIndependent(i));
+            }
+
+            res<<str;
+
+            if (!CheckEqual(thisVar->GetLowerBound(),DEFAULTPARAMETERLBOUND)) {
+                snprintf (str, sizeof(str), "\n%s:>%.16g;", thisVar->GetName()->getStr(),(double)thisVar->GetLowerBound());
+                res<<str;
+            }
+            if (!CheckEqual(thisVar->GetUpperBound(),DEFAULTPARAMETERUBOUND)) {
+                snprintf (str, sizeof(str), "\n%s:<%.16g;", thisVar->GetName()->getStr(),(double)thisVar->GetUpperBound());
+                res<<str;
+            }
+        }
+        if (indexDep.lLength>0) {
+            for (long i=0; i<indexDep.lLength; i++) {
+                thisVar = LocateVar(indexDep.lData[i]);
+                if (thisVar->IsGlobal()) {
+                    snprintf (str, sizeof(str), "\nglobal %s",thisVar->GetName()->getStr());
+                } else {
+                    snprintf (str, sizeof(str), "\n%s",thisVar->GetName()->getStr());
+                }
+                res<<str;
+                res<<":=";
+                _String* s = thisVar->GetFormulaString();
+                res<<s;
+                DeleteObject(s);
+                res<<';';
+                if (!CheckEqual(thisVar->GetLowerBound(),DEFAULTPARAMETERLBOUND)) {
+                    snprintf (str, sizeof(str), "\n%s:>%.16g;", thisVar->GetName()->getStr(),(double)thisVar->GetLowerBound());
+                    res<<str;
+                }
+                if (!CheckEqual(thisVar->GetUpperBound(),DEFAULTPARAMETERUBOUND)) {
+                    snprintf (str, sizeof(str), "\n%s:<%.16g;", thisVar->GetName()->getStr(),(double)thisVar->GetUpperBound());
+                    res<<str;
+                }
+            }
+        }
+        if (longOrShort>4.0) {
+            longOrShort = 2.5;
+        } else {
+            DoneComputing();
+            res.Finalize();
+            return res.makeDynamic();
+        }
+
+    }
+    if (longOrShort==3.0) { // just spool out the names of parameters
+        snprintf (str, sizeof(str), "Log Likelihood = %g;\n\n",(double)value);
+        res<<str;
+        snprintf (str, sizeof(str),"Independent Parameters List\n");
+        res<<str;
+        for (long i=0; i<indexInd.lLength; i++) {
+            snprintf (str, sizeof(str), "\n  Parameter %4ld : %s", i+1, LocateVar(indexInd.lData[i])->GetName()->getStr());
+            res<<str;
+        }
+        if (indexDep.lLength>0) {
+            snprintf (str, sizeof(str),"\n\nConstrained Parameters List\n");
+            res<<str;
+            for (long i=0; i<indexDep.lLength; i++) {
+                snprintf (str, sizeof(str), "\n  Parameter %4ld : %s", i+1, LocateVar(indexDep.lData[i])->GetName()->getStr());
+                res<<str;
+                res<<'=';
+                _String* s = LocateVar(indexDep.lData[i])->GetFormulaString();
+                res<<s;
+                DeleteObject(s);
+            }
+        }
+    } else if (longOrShort>1.1) {
+        if (longOrShort!=2.5) {
+            snprintf (str, sizeof(str), "Log Likelihood = %15.15g;",(double)value);
+            res<<str;
+            bool globals = false;
+            for (long i = 0; i<indexInd.lLength+indexDep.lLength; i++) {
+                bool doDep = (i>=indexInd.lLength);
+                _Variable* v = LocateVar (doDep?indexDep(i-indexInd.lLength):indexInd(i));
+                if (v->IsGlobal()) {
+                    if (!globals) {
+                        globals = true;
+                        res<< "\nShared Parameters:\n";
+                    }
+                    res<<v->GetName();
+                    res<<'=';
+                    if (doDep) {
+                        _String* fs = v->GetFormulaString();
+                        res<<fs;
+                        res<<'=';
+                        DeleteObject(fs);
+                    }
+                    _String* s = (_String*)v->toStr();
+                    res<<s;
+                    res<<'\n';
+                    DeleteObject(s);
+                }
+            }
+        }
+        // traverse the trees now
+        for (long treeCounter = 0; treeCounter<theTrees.lLength; treeCounter++) {
+            _TheTree* currentTree = (_TheTree*)LocateVar(theTrees(treeCounter));
+            long level = 0,myLevel=0,lastLevel = 0,l1,l2,j;
+            res<<"\nTree ";
+            res<<currentTree->GetName();
+            l1 = currentTree->GetName()->Length();
+            res<<'=';
+            _CalcNode* currentNode=currentTree->DepthWiseTraversalLevel(myLevel,true),*nextNode;
+            level = myLevel;
+            nextNode=currentTree->DepthWiseTraversalLevel(myLevel) ;
+            _SimpleList iV, dV2;
+            // decide if we can use expected substituion measure
+            bool    useExpectedSubstitutions = longOrShort<3;
+            /*if (blockDependancies.lData[i])
+                useExpectedSubstitutions = false;*/
+
+            while (nextNode) {
+                iV.Clear();
+                dV2.Clear();
+                if (level>lastLevel) {
+                    if (lastLevel) {
+                        res<<',';
+                    }
+                    for (j=0; j<level-lastLevel; j++) {
+                        res<<'(';
+                    }
+                } else if (level<lastLevel) {
+                    for (j=0; j<lastLevel-level; j++) {
+                        res<<')';
+                    }
+                } else {
+                    res<<',';
+                }
+                _String num = currentNode->GetName()->Cut(l1+1,-1);
+                l2 = l1+num.Length();
+                res<<#
+                if (!useExpectedSubstitutions) {
+                    res<<'{';
+                    {
+                        _AVLList    iVA (&iV),
+                                    dVA (&dV2);
+
+                        currentNode->ScanForVariables(iVA,dVA);
+                        currentNode->ScanForDVariables(dVA,iVA);
+
+                        iVA.ReorderList ();
+                        dVA.ReorderList ();
+                    }
+                    _String* s;
+                    _Variable* currentVar;
+
+                    for (j=0; j<iV.lLength; j++) {
+                        currentVar = LocateVar (iV(j));
+                        num = currentVar->GetName()->Cut(l2+2,-1);
+                        res<<#
+                        res<<'=';
+                        s = (_String*)currentVar->toStr();
+                        res<<s;
+                        if (j<iV.lLength-1) {
+                            res<<',';
+                        }
+                        DeleteObject(s);
+                    }
+
+                    for (j=0; j<dV2.lLength; j++) {
+                        if ((iV.lLength)||(j>0)) {
+                            res<<',';
+                        }
+                        currentVar = LocateVar (dV2(j));
+                        num = currentVar->GetName()->Cut(l2+2,-1);
+                        res<<#
+                        res<<'=';
+                        s = currentVar->GetFormulaString();
+                        res<<s;
+                        res<<'=';
+                        DeleteObject(s);
+                        s = (_String*)currentVar->toStr();
+                        res<<s;
+                        DeleteObject(s);
+                    }
+                    res<<'}';
+                } else {
+                    res<<':';
+                    _Matrix*    theMx = currentNode->ComputeModelMatrix();
+
+                    _String expSubStr;
+                    if (!theMx) {
+                        expSubStr = "NAN";
+                    } else {
+                        _Parameter expSubs = currentNode->BranchLength();
+                        expSubStr = (_Parameter)fabs(expSubs);
+                    }
+                    res<<&expSubStr;
+
+                }
+                lastLevel = level;
+                level = myLevel;
+                currentNode = nextNode;
+                nextNode=currentTree->DepthWiseTraversalLevel(myLevel) ;
+
+            }
+            for (j=0; j<lastLevel-level; j++) {
+                res<<')';
+            }
+            res<<';';
+        }
+        res << '\n';
+    } else if (longOrShort>.1) {
+        snprintf (str, sizeof(str), "Likelihood Function's Current Value = %15.15g\n",(double)value);
+        _String num (str);
+        res<<#
+
+        for (long i = 0; i<indexInd.lLength+indexDep.lLength; i++) {
+            bool doDep = (i>=indexInd.lLength);
+            _Variable* v = LocateVar (doDep?indexDep(i-indexInd.lLength):indexInd(i));
+            res<<v->GetName();
+            if (doDep) {
+                _String* fs = v->GetFormulaString();
+                res<<fs;
+                res<<'=';
+                DeleteObject (fs);
+            }
+            res<<'=';
+            _String* s = (_String*)v->toStr();
+            res<<s;
+            res<<'\n';
+            DeleteObject(s);
+        }
+    } else {
+        snprintf (str, sizeof(str), "%15.15g",(double)value);
+        _String num (str);
+        res<<#
+    }
+
+    if (longOrShort < 4.0) {
+        DoneComputing();
+    }
+
+    res.Finalize();
+    return res.makeDynamic();
+
+}
+
+//_______________________________________________________________________________________
+
+#ifdef      __MP__
+void*   StateCounterMP (void* arg)
+{
+    WancReleafTask * theTask = (WancReleafTask *)arg;
+
+    _Parameter      vls = VerbosityLevel();
+
+    for (long sites = theTask->startAt; sites < theTask->endAt; sites++) {
+        _Parameter siteLikelihood = theTask->tree->ThreadReleafTreeCache (theTask->dsf, sites, ((sites>theTask->startAt)?sites-1:-1), 0, theTask->tree->flatCLeaves.lLength-1,sites,theTask->threadIndex);
+        //pthread_mutex_lock(&wancMutex);
+
+        _Matrix  res1(theTask->tree->GetCodeBase() , theTask->tree->GetCodeBase(), false, true),
+                 res2(theTask->tree->GetCodeBase(),  theTask->tree->GetCodeBase(), false, true);
+
+        //pthread_mutex_unlock(&wancMutex);
+
+        if (vls>9.99) {
+            char     buffer[64];
+            snprintf (buffer, sizeof(buffer),"WeightedCharacterDifferences at site %ld\n", sites);
+            BufferToConsole (buffer);
+        }
+
+        theTask->tree->WeightedCharacterDifferences (siteLikelihood, &res1, &res2, theTask->threadIndex);
+
+        _SimpleList * dSites = (_SimpleList*)(*theTask->dupList)(sites);
+        StateCounterResultHandler (*theTask->fla,dSites, *theTask->doneSites, *theTask->lastDone, theTask->totalUniqueSites, res1, res2);
+    }
+    return nil;
+}
+
+#endif
+
+//_______________________________________________________________________________________
+
+void    StateCounterResultHandler (_Formula& fla, _SimpleList* dSites, long & doneSites, long & lastDone, long totalUniqueSites, _Matrix& res1, _Matrix& res2)
+{
+#ifdef __MP__
+    //if (systemCPUCount>1)
+    //  pthread_mutex_lock(&wancMutex);
+#endif
+
+    setParameter (stateCountMatrix,  &res1);
+    setParameter (wStateCountMatrix, &res2);
+
+    for (long dupSites = 0; dupSites < dSites->lLength; dupSites++) {
+        _Operation tempO (new _Constant(dSites->lData[dupSites]));
+        fla.GetList().InsertElement(&tempO,1,true);
+        fla.Compute();
+        fla.GetList().Delete(1);
+    }
+    doneSites ++;
+    if (((doneSites-lastDone)*100.)/totalUniqueSites>1.) {
+        lastDone = doneSites;
+#if !defined __UNIX__ || defined __HEADLESS__
+        SetStatusBarValue ((doneSites*100.)/totalUniqueSites,1.,0.);
+#endif
+#ifdef __MAC__
+        handleGUI(true);
+#endif
+        if (terminateExecution) {
+            return;
+        }
+    }
+#if defined __UNIX__ && ! defined __HEADLESS__ && !defined __HYPHYQT__ && !defined __HYPHY_GTK__
+    if (VerbosityLevel()==1) {
+        UpdateOptimizationStatus (doneSites, (doneSites*100.)/totalUniqueSites, 1, false);
+    }
+#endif
+
+
+#ifdef __MP__
+    //if (systemCPUCount>1)
+    //  pthread_mutex_unlock(&wancMutex);
+#endif
+}
+
+//_______________________________________________________________________________________
+
+void    _LikelihoodFunction::StateCounter (long functionCallback)
+{
+    PrepareToCompute();
+    computationalResults.Clear();
+
+    _Operation functionCallbackOp;
+
+    functionCallbackOp.SetTerms (-functionCallback-1);
+    functionCallbackOp.TheCode() = functionCallback;
+
+    _Formula           fla;
+
+    fla.GetList() && & functionCallbackOp;
+
+    long  totalUniqueSites = 0,
+          doneSites = 0,
+          lastDone  = 0;
+    {
+        for (long i = 0; i<theTrees.lLength; i++) {
+            _DataSetFilter * dsf  = (_DataSetFilter*)dataSetFilterList (theDataFilters(i));
+            totalUniqueSites += dsf->NumberDistinctSites();
+        }
+    }
+    for (long i = 0; i<theTrees.lLength; i++) {
+        long             offset = -1;
+
+        _TheTree       * tree = (_TheTree*)LocateVar(theTrees(i));
+        _DataSetFilter * dsf  = (_DataSetFilter*)dataSetFilterList (theDataFilters(i));
+
+        _Matrix             *glFreqs = (_Matrix*)LocateVar(theProbabilities.lData[i])->GetValue();
+
+        tree->InitializeTreeFrequencies ((_Matrix*)glFreqs->ComputeNumeric());
+
+        _List          duplicateMatches;
+
+        while (fla.GetList().countitems()>1) {
+            fla.GetList().Delete(0);
+        }
+
+        {
+            _Operation tempO (new _Constant(i+1));
+            fla.GetList().InsertElement(&tempO,0,true);
+        }
+
+        for (long mapper = 0; mapper < dsf->duplicateMap.lLength; mapper++) {
+            long matched = dsf->duplicateMap.lData[mapper];
+
+            if (duplicateMatches.lLength<=matched) {
+                _SimpleList tlist;
+                duplicateMatches && & tlist;
+            }
+
+            (*((_SimpleList*)duplicateMatches(matched))) << mapper;
+        }
+
+        _Parameter        scaler = 0.;
+
+        _CalcNode*        rambler = tree->DepthWiseTraversal (true);
+
+        while (!tree->IsCurrentNodeTheRoot()) {
+            _Parameter bLength = rambler->BranchLength();
+            _Constant tConst (bLength);
+            rambler->SetValue (&tConst);
+            scaler += bLength;
+            rambler = tree->DepthWiseTraversal (false);
+        }
+
+        rambler = tree->DepthWiseTraversal (true);
+
+        while (!tree->IsCurrentNodeTheRoot()) {
+            _Parameter bLength = rambler->Value();
+            _Constant tConst (bLength/scaler);
+            rambler->SetValue (&tConst);
+            rambler = tree->DepthWiseTraversal (false);
+        }
+
+        _SimpleList * dSites = (_SimpleList*)duplicateMatches(0);
+        SetStatusLine     ("Weighted ancestor counting...Computing transition matrices.");
+#ifdef __MAC__
+        handleGUI(true);
+#endif
+#if defined __UNIX__ && ! defined __HEADLESS__ && !defined __HYPHYQT__ && !defined __HYPHY_GTK__
+        if (VerbosityLevel()==1) {
+            UpdateOptimizationStatus (0,0,0,true);
+        }
+#endif
+#ifdef __MP__
+        long tstep = (dsf->NumberDistinctSites()-1)/systemCPUCount;
+        if ((systemCPUCount>1)&&tstep) {
+            tree->BuildTopLevelCache();
+            tree->AllocateResultsCache(dsf->NumberDistinctSites());
+            offset = 0;
+            for (long idx = 0; idx < tree->flatCLeaves.lLength; idx++) {
+                ((_CalcNode*)tree->flatCLeaves(idx))->theProbs[0] = idx;
+            }
+            for (long idx = 0; idx < tree->flatTree.lLength; idx++) {
+                ((_CalcNode*)tree->flatTree(idx))->theProbs[0] = idx+tree->flatCLeaves.lLength;
+            }
+        }
+        _Parameter siteLikelihood = tree->ReleafTreeAndCheck (dsf,0,tree->HasCache());
+#else
+        _Parameter siteLikelihood = tree->ReleafTreeAndCheck (dsf,0,false);
+#endif
+#if !defined __UNIX__ || defined __HEADLESS__
+        SetStatusLine     ("Weighted ancestor counting...Doing the counting.");
+        SetStatusBarValue (0,1.,0.);
+#endif
+#ifdef __MAC__
+        handleGUI(true);
+#endif
+        if (terminateExecution) {
+            return;
+        }
+
+        if (1) {
+            _Matrix  res1(tree->GetCodeBase() , tree->GetCodeBase(), false, true),
+                     res2(tree->GetCodeBase(),  tree->GetCodeBase(), false, true);
+            tree->WeightedCharacterDifferences (siteLikelihood, &res1, &res2, offset);
+            StateCounterResultHandler (fla, dSites,doneSites,lastDone,totalUniqueSites,res1,res2);
+        }
+
+        for (long sites = 1; sites < dsf->theFrequencies.lLength; sites++) {
+            dSites = (_SimpleList*)duplicateMatches(sites);
+
+            // populate tips
+
+            siteLikelihood = tree->ReleafTree (dsf, sites, sites-1, 0, tree->flatCLeaves.lLength-1);
+
+            _Matrix  res1(tree->GetCodeBase() , tree->GetCodeBase(), false, true),
+                     res2(tree->GetCodeBase(),  tree->GetCodeBase(), false, true);
+
+            tree->WeightedCharacterDifferences (siteLikelihood, &res1, &res2);
+
+            StateCounterResultHandler (fla, dSites,doneSites,lastDone,totalUniqueSites,res1,res2);
+        }
+    }
+
+    /*#ifdef __MP__
+    }
+    #endif*/
+
+#if !defined __UNIX__ || defined __HEADLESS__
+    SetStatusBarValue (-1,1.,0.);
+    SetStatusLine ("Idle");
+#endif
+#ifdef __MAC__
+    handleGUI(true);
+#endif
+
+#if defined __UNIX__ && ! defined __HEADLESS__ && !defined __HYPHYQT__ && !defined __HYPHY_GTK__
+    if (VerbosityLevel()==1) {
+        UpdateOptimizationStatus (0, 0, 2, false);
+    }
+#endif
+
+    DoneComputing ();
+}
+//_______________________________________________________________________________________
+
+void    _LikelihoodFunction::Simulate (_DataSet &target, _List& theExclusions, _Matrix* catValues, _Matrix* catNames, _Matrix* spawnValues, _String* storeIntermediates)
+{
+    // will step thru multiple trees of the project and simulate  a dataset from the likelihood function
+
+    long i,
+         j,
+         k;
+
+    char catSim = 0;
+    // 0 - not at all
+    // 1 - discrete,
+    // 2 - continuous
+
+    /*for (i=0; i<theTrees.lLength; i++)
+    {
+    }*/
+
+    _SimpleList     catCont,
+                    catDiscrete,
+                    catHMM,
+                    HMMState;
+
+    bool            columnWise = false;
+
+    if (indexCat.lLength) {
+        checkParameter (categorySimulationMethod,categorySimMethod,2.0);
+        // check to see if continuous method can actually be implemented
+        catSim = (char)categorySimMethod;
+        if (categorySimMethod >1.5) {
+            for (i=0; i<indexCat.lLength; i++) {
+                _CategoryVariable* thisC = (_CategoryVariable*)LocateVar (indexCat.lData[i]);
+                if (thisC->IsHiddenMarkov()) {
+                    catHMM << i;
+                    HMMState << 0;
+                } else if (thisC->GetCumulative().IsEmpty()) {
+                    _String warnMsg ("SimulateDataSet will treat category variable ");
+                    warnMsg = warnMsg & *thisC->GetName() & " as discrete since no cumulative dist'n is available.";
+                    ReportWarning(warnMsg);
+                    catDiscrete<<i;
+                    HMMState<<i;
+                } else {
+                    catCont<<i;
+                }
+            }
+        } else
+            for (i=0; i<indexCat.lLength; i++) {
+                ((_CategoryVariable*)LocateVar (indexCat.lData[i]))->Refresh(true); // mod Jan 3rd 2006
+                catDiscrete<<i;
+            }
+
+        if ((catNames)&&(indexCat.lLength)) {
+            catNames->Clear();
+            CreateMatrix (catNames,indexCat.lLength,1,false,true,false);
+            catNames->Convert2Formulas();
+            _String   thisFla;
+            for (i=0; i<catHMM.lLength; i++) {
+                thisFla = _String ("\"") & *LocateVar(indexCat.lData[catHMM.lData[i]])->GetName() & _String ("\"");
+                _Formula f (thisFla);
+                catNames->StoreFormula (i,0,f);
+            }
+            for (i=0; i<catDiscrete.lLength; i++) {
+                thisFla = _String ("\"") & *LocateVar(indexCat.lData[catDiscrete.lData[i]])->GetName() & _String ("\"");
+                _Formula f (thisFla);
+                catNames->StoreFormula (i+catHMM.lLength,0,f);
+            }
+            for (i=0; i<catCont.lLength; i++) {
+                thisFla = _String ("\"") & *LocateVar(indexCat.lData[catCont.lData[i]])->GetName() & _String ("\"");
+                _Formula f (thisFla);
+                catNames->StoreFormula (i+catHMM.lLength+catDiscrete.lLength,0,f);
+            }
+        }
+    }
+    /*else
+    {
+        Compute();
+    }*/
+
+    _DataSetFilter *dsf = (_DataSetFilter*)dataSetFilterList (theDataFilters(0));
+    //_String duh ("Simulated Species #");
+
+    i = dsf->NumberSpecies();
+
+    target.GetNames ().RequestSpace (i);
+
+    {
+        _List       * dsfNames = &dsf->GetData()->GetNames();
+        _SimpleList * mapList  = (_SimpleList*)dsf->GetMap();
+
+        for (long i2=0; i2< i; i2++) {
+            target.GetNames() <<  (*dsfNames)(mapList->lData[i2]);
+        }
+    }
+
+    long    countIntermediates = target.GetNames().lLength;
+
+    if (storeIntermediates && storeIntermediates->sLength == 0) {
+        _TheTree *datree = (_TheTree*)LocateVar(theTrees(0));
+        datree->AddNodeNamesToDS (&target,false,true,0);
+        countIntermediates = target.GetNames().lLength - countIntermediates;
+    } else {
+        countIntermediates = 0;
+    }
+
+    target.SetTranslationTable (dsf->GetData());
+
+    _List*      localExc;
+    _SimpleList localExclusions;
+    long   DSOffset       = 0,
+           siteOffset      = 0,
+           totalPositions = 0;
+
+    for (i = 0; i<theTrees.lLength; i++) {
+        dsf = (_DataSetFilter*)dataSetFilterList (theDataFilters(i));
+        totalPositions += dsf->theOriginalOrder.lLength/dsf->GetUnitLength();
+    }
+
+    if ((catValues)&&(indexCat.lLength)) {
+        catValues->Clear();
+        CreateMatrix (catValues,indexCat.lLength,totalPositions,false,true,false);
+    }
+
+    _Constant lastTime (0.0),
+              currentTime (0.0);
+    _PMathObj tValue = lastTime.Time();
+    lastTime.SetValue (tValue->Value());
+    DeleteObject (tValue);
+
+    for (i = 0; i<theTrees.lLength; i++) { // loop thru the trees one at a time
+        // will propagate a complete column thru the tree
+        // first generate a root sequence
+        dsf = (_DataSetFilter*)dataSetFilterList (theDataFilters(i));
+        if (dsf->NumberSpecies()+countIntermediates!=target.GetNames().lLength) { // incompatible likelihood function
+            ReportWarning ((_String("DataSet Simulation had to ignore part ")&_String(i)&" of the likelihood function since it has a different length than the first part."));
+            continue;
+        }
+        _Parameter *freqs = ((_Matrix*)LocateVar(theProbabilities(i))->Compute())->fastIndex();
+        _TheTree *tree = (_TheTree*)LocateVar(theTrees(i));
+        // how large will the propagating vector be?
+        long    vecSize = 0,leafCount = 0, good = 0;
+
+        localExclusions.Clear();
+
+        vecSize = dsf->theOriginalOrder.lLength/dsf->GetUnitLength();
+
+        if (theExclusions.lLength>i) {
+            localExc = (_List*)theExclusions(i);
+            if (localExc->lLength) {
+                _Parameter* translatedState = new _Parameter [dsf->GetDimension(false)];
+                checkPointer(translatedState);
+                for (j=0; j<localExc->lLength; j++) {
+                    dsf->Translate2Frequencies(*(_String*)(*localExc)(j),translatedState,true);
+                    k      = 0;
+                    long l = -1;
+
+                    for (long h=dsf->GetDimension(false)-1; h>=0; h--)
+                        if (translatedState[h]!=0) {
+                            k++;
+                            l = h;
+                        }
+
+                    if (k != 1) {
+                        _String warnMsg ("Excluded character ");
+                        warnMsg = warnMsg & *(_String*)(*localExc)(j) &" does not represent a unique state and will therefore be ignored in data simulation";
+                        ReportWarning (warnMsg);
+                    }
+
+                    localExclusions<<l;
+                }
+                delete [] translatedState;
+                columnWise = true;
+            }
+        }
+
+        if (catSim != 0) {
+            columnWise = true;
+        }
+
+        if (columnWise) {
+            _TheTree * cT = ((_TheTree*)(LocateVar(theTrees(i))));
+            cT->SetUpMatrices(1);
+            while (good<vecSize) {
+                _Parameter randVal = genrand_real2(),
+                           sumSoFar = 0.0;
+
+                long rootState = 0;
+
+                if (catSim) {
+                    while (randVal<1.0e-30) {
+                        randVal = genrand_real2();
+                    }
+
+                    for (j=0; j<catHMM.lLength; j++) { // deal with HMM
+                        _CategoryVariable* thisC = (_CategoryVariable*)LocateVar(indexCat.lData[catHMM.lData[j]]);
+                        _Parameter* iWeights;
+
+                        if (good==0) {
+                            iWeights = thisC->GetWeights()->fastIndex();
+                        } else {
+                            _Matrix * hmm = thisC->ComputeHiddenMarkov();
+                            iWeights = hmm->theData+hmm->GetVDim()*HMMState.lData[j];
+                        }
+
+                        while (sumSoFar<randVal) {
+                            sumSoFar+=iWeights[rootState++];
+                        }
+
+                        if (rootState) {
+                            rootState--;
+                        }
+                        thisC->SetIntervalValue(rootState);
+                        if (good>0) {
+                            HMMState.lData[j] = rootState;
+                        }
+
+                        randVal = genrand_real2();
+                        rootState = 0;
+                        sumSoFar = 0.0;
+
+                        if (randVal==0.0) {
+                            j--;
+                            continue;
+                        }
+                        if (catValues) {
+                            catValues->Store (j,siteOffset+good,thisC->Compute()->Value());
+                        }
+                    }
+
+                    for (j=0; j<catDiscrete.lLength; j++) { // use discrete values here
+                        _CategoryVariable* thisC = (_CategoryVariable*)LocateVar(indexCat.lData[catDiscrete.lData[j]]);
+                        _Parameter* iWeights = thisC->GetWeights()->fastIndex();
+
+                        while (sumSoFar<randVal) {
+                            sumSoFar+=iWeights[rootState++];
+                        }
+
+                        if (rootState) {
+                            rootState--;
+                        }
+                        thisC->SetIntervalValue(rootState);
+                        randVal = genrand_real2();
+                        rootState = 0;
+                        sumSoFar = 0.0;
+                        if (randVal==0.0) {
+                            j--;
+                            continue;
+                        }
+                        if (catValues) {
+                            catValues->Store (j+catHMM.lLength,siteOffset+good,thisC->Compute()->Value());
+                        }
+                    }
+
+                    for (j=0; j<catCont.lLength; j++) { // use continuous values here
+                        _CategoryVariable* thisC = (_CategoryVariable*)LocateVar(indexCat.lData[catCont.lData[j]]);
+                        randVal = thisC->GetCumulative().Newton(thisC->GetDensity(),randVal,thisC->GetMinX(),thisC->GetMaxX(),_x_);
+                        _Constant randCat (randVal);
+                        thisC->SetValue(&randCat);
+                        if (catValues) {
+                            catValues->Store (j+catHMM.lLength+catDiscrete.lLength,siteOffset+good,randVal);
+                        }
+                        randVal = 0.0;
+                        while (randVal<1.0e-30) {
+                            randVal = genrand_real2();
+                        }
+
+                    }
+                }
+
+                if (randVal==0.0) {
+                    continue;
+                }
+
+                if (spawnValues) {
+                    rootState = spawnValues->theData[siteOffset+good];
+                } else {
+                    k=0;
+                    while (randVal>sumSoFar) {
+                        sumSoFar+=freqs[k];
+                        k++;
+                    }
+                    if (k==0) {
+                        rootState = 0;
+                    } else {
+                        rootState=k-1;
+                    }
+                }
+
+                _SimpleList intermediates,
+                            thisSite;
+
+                if (SingleBuildLeafProbs    (tree->GetRoot(), rootState, thisSite, localExclusions,tree, true, dsf, storeIntermediates?&intermediates:nil)) {
+                    good++;
+                    //add this site to the simulated dataset
+                    rootState = dsf->GetUnitLength();
+
+                    _String topState(dsf->ConvertCodeToLetters (dsf->CorrectCode(thisSite.lData[0]),rootState));
+                    for (k=0; k<topState.sLength; k++) {
+                        target.AddSite(topState.sData[k]);
+                        leafCount++;
+                    }
+                    for (j=1; j<dsf->NumberSpecies(); j++) {
+                        topState = dsf->ConvertCodeToLetters (dsf->CorrectCode(thisSite.lData[j]),rootState);
+                        for (k=0; k<topState.sLength; k++) {
+                            target.Write2Site(DSOffset+leafCount-rootState+k,topState.sData[k]);
+                        }
+                    }
+
+                    target.ResetIHelper();
+                    for (k=0; k<topState.sLength; k++) {
+                        target.Compact(DSOffset+leafCount-rootState+k);
+                    }
+
+                    if (storeIntermediates) {
+                        for (j=0; j<intermediates.lLength; j++) {
+                            topState = dsf->ConvertCodeToLetters (dsf->CorrectCode(intermediates.lData[j]),rootState);
+                            for (k=0; k<topState.sLength; k++) {
+                                target.Write2Site(DSOffset+leafCount-rootState+k,topState.sData[k]);
+                            }
+                            target.ResetIHelper();
+                            for (k=0; k<topState.sLength; k++) {
+                                target.Compact(DSOffset+leafCount-rootState+k);
+                            }
+                        }
+                    }
+                    //for (k=0; k<rootState; k++)
+                    //target.CheckMapping (DSOffset+leafCount-rootState+k);
+
+                }
+                currentTime.SetValue (0.0);
+                tValue = currentTime.Time();
+                currentTime.SetValue (tValue->Value());
+                DeleteObject (tValue);
+                if (currentTime.Value()-lastTime.Value () > .25) {
+#if !defined __UNIX__ || defined __HEADLESS__
+                    SetStatusBarValue (100.*(DSOffset+good)/totalPositions, 1, 0);
+#endif
+                    lastTime.SetValue (currentTime.Value());
+#ifndef __UNIX__
+                    yieldCPUTime();
+#endif
+                }
+            }
+            DSOffset   += dsf->theOriginalOrder.lLength;
+            siteOffset += dsf->theOriginalOrder.lLength/dsf->GetUnitLength();
+            cT->CleanUpMatrices();
+            continue;
+        }
+
+        long*   baseVector = (long*)MemAllocate (sizeof(long)*(vecSize));
+
+        // generate a random "spawning vector"
+
+        if (spawnValues) // use supplied starting values
+            for (j=0;  j<vecSize; j++) {
+                baseVector[j] = spawnValues->theData[j+DSOffset];
+            }
+
+        else
+            for (j=0;  j<vecSize; j++) {
+                _Parameter randVal  = genrand_real2(),
+                           sumSoFar = 0;
+
+                if (randVal==0.0) {
+                    j--;
+                    continue;
+                }
+                k=0;
+                while (randVal>sumSoFar) {
+                    sumSoFar+=freqs[k];
+                    k++;
+                }
+                if (k==0) {
+                    baseVector[j]=0;
+                } else {
+                    baseVector[j]=k-1;
+                }
+            }
+
+        // now proceed down the tree branches to get the values of the probabilities at the leaves
+        // this is done recursively
+
+        _DataSet * intermediates = nil;
+
+        if (storeIntermediates) {
+            if (storeIntermediates->sLength) {
+                FILE * iff = doFileOpen (storeIntermediates->sData,"w");
+                if (!iff) {
+                    _String errMsg = _String ("Failed to open ") & *storeIntermediates & " for writing.";
+                    WarnError (errMsg);
+                    target.Finalize();
+                    return;
+                } else {
+                    intermediates = new _DataSet (iff);
+                    _TheTree *datree = (_TheTree*)LocateVar(theTrees(0));
+                    datree->AddNodeNamesToDS (intermediates,false,true,0);
+                }
+            } else {
+                intermediates = new _DataSet (vecSize);
+            }
+
+            checkPointer (intermediates);
+            intermediates->SetTranslationTable (dsf->GetData());
+        }
+
+        BuildLeafProbs (tree->GetRoot(), baseVector, vecSize, target, tree, leafCount, true, dsf->GetUnitLength(), dsf, DSOffset,intermediates);
+
+        if (intermediates) {
+            intermediates->Finalize();
+            if (storeIntermediates->sLength == 0) {
+                long      siteCount = intermediates->GetTheMap().lLength;
+
+                for (long p = 0; p<countIntermediates; p++)
+                    for (long c=DSOffset; c<siteCount+DSOffset; c++) {
+                        _Site*  aSite = intermediates->GetSite(c-DSOffset);
+                        target.Write2Site (c,aSite->sData[p]);
+                    }
+            }
+            DeleteObject (intermediates);
+        }
+
+        free (baseVector);
+        DSOffset += dsf->theOriginalOrder.lLength;
+
+    }
+
+    /*for (i=0; i<theTrees.lLength; i++)
+    {
+        _TheTree * cT = ((_TheTree*)(LocateVar(theTrees(i))));
+        cT->CleanUpMatrices();
+    }*/
+
+    target.Finalize();
+    target.SetNoSpecies(target.GetNames().lLength);
+}
+
+//_______________________________________________________________________________________
+
+void    _LikelihoodFunction::BuildLeafProbs (node<long>& curNode, long* baseVector, long& vecSize, _DataSet& target, _TheTree* curTree, long& leafCount, bool isRoot, long baseLength, _DataSetFilter* dsf, long DSOffset, _DataSet* intNodes)
+/* SLKP TODO check that this works with the new category spec route */
+
+{
+    long* curVector = nil,
+          i,
+          k,
+          m;
+
+    _CalcNode* ccurNode = (_CalcNode*)LocateVar (curNode.get_data());
+
+    if (!isRoot) {
+
+        curVector = (long*)MemAllocate (vecSize*sizeof(long));
+        // first "mutate" the parent vector
+
+        if (ccurNode->NeedToExponentiate(-1)) {
+            ccurNode->RecomputeMatrix(0,1);
+        }
+
+        _Parameter * baseI = ccurNode->GetCompExp()->fastIndex();
+
+        m = ccurNode->GetCompExp()->GetVDim();
+
+        for (i = 0; i<vecSize; i++) {
+            _Parameter randVal = genrand_int32()/(_Parameter)RAND_MAX_32,
+                       sumSoFar = 0,
+                       *fastI = baseI + baseVector[i]*m;
+            k=0;
+            while ((randVal>sumSoFar)&&(k<m)) {
+                sumSoFar+=fastI[k];
+                k++;
+            }
+            if (k==0) {
+                curVector[i]=0;
+            } else {
+                curVector[i]=k-1;
+            }
+        }
+    } else {
+        // handle the degenerate tree case
+        if (curNode.nodes.length == 1) {
+            for (k = 0; k<vecSize; k++) {
+                _String letterValue = dsf->ConvertCodeToLetters (dsf->CorrectCode(baseVector[k]), baseLength);
+                for (m = 0; m<letterValue.sLength; m++) {
+                    target.AddSite (letterValue.sData[m]);
+                }
+            }
+            leafCount++;
+            BuildLeafProbs (*curNode.go_down(1), baseVector, vecSize, target, curTree, leafCount, false, baseLength, dsf,DSOffset,intNodes);
+            return;
+        }
+    }
+
+    // now scan the "children" and pass on the parameters as needed
+
+    if (curNode.nodes.length) {
+        if (intNodes) {
+            bool writeOrAdd = intNodes->lLength;
+            for (k = 0; k<vecSize; k++) {
+                _String letterValue = dsf->ConvertCodeToLetters (dsf->CorrectCode(curVector?curVector[k]:baseVector[k]), baseLength);
+                if (writeOrAdd)
+                    for (m = 0; m<letterValue.sLength; m++) {
+                        intNodes->Write2Site (letterValue.sLength*k+m, letterValue.sData[m]);
+                    }
+                else
+                    for (m = 0; m<letterValue.sLength; m++) {
+                        intNodes->AddSite (letterValue.sData[m]);
+                    }
+            }
+        }
+        for (k = 1; k<=curNode.get_num_nodes(); k++) {
+            BuildLeafProbs (*curNode.go_down(k), curVector?curVector:baseVector, vecSize, target, curTree, leafCount, false, baseLength, dsf,DSOffset,intNodes);
+        }
+    } else
+        // reached a leaf
+    {
+        // attach a row to the new data set
+        long siteCount = DSOffset;
+        if (!leafCount) {
+            for (k = 0; k<vecSize; k++) {
+                _String letterValue = dsf->ConvertCodeToLetters (dsf->CorrectCode(curVector[k]), baseLength);
+                for (m = 0; m<letterValue.sLength; m++) {
+                    target.AddSite (letterValue.sData[m]);
+                }
+            }
+            leafCount++;
+        } else {
+            for (k = 0; k<vecSize; k++) {
+                _String letterValue = dsf->ConvertCodeToLetters (dsf->CorrectCode(curVector[k]), baseLength);
+                for (m = 0; m<letterValue.sLength; m++) {
+                    target.Write2Site (siteCount++, letterValue.sData[m]);
+                }
+            }
+        }
+    }
+
+    if (!isRoot) {
+        ccurNode->FreeUpMemory (0);
+    }
+
+    if (curVector) {
+        free (curVector);
+    }
+}
+
+//_______________________________________________________________________________________
+
+bool    _LikelihoodFunction::SingleBuildLeafProbs (node<long>& curNode, long parentState, _SimpleList& target, _SimpleList& theExc, _TheTree* curTree, bool isRoot, _DataSetFilter* dsf, _SimpleList * iNodes)
+{
+    long myState = 0;
+    if (!isRoot) {
+
+        // first "mutate" the parent vector
+        _CalcNode* ccurNode = (_CalcNode*)LocateVar (curNode.get_data());
+
+        if (ccurNode->NeedToExponentiate(-1)) {
+            ccurNode->RecomputeMatrix(0,1);
+        }
+
+        _Parameter* fastI = ccurNode->GetCompExp()->fastIndex()+parentState*ccurNode->GetCompExp()->GetVDim(),
+                    randVal = genrand_int32()/(_Parameter)RAND_MAX_32,
+                    sumSoFar = 0.0;
+
+        long   k=0,
+               n = ccurNode->GetCompExp()->GetVDim();
+
+        while  ((randVal>sumSoFar)&&(k<n)) {
+            sumSoFar+=fastI[k];
+            k++;
+        }
+
+        if (k==0) {
+            myState = 0;
+        } else {
+            myState=k-1;
+        }
+
+        if (curNode.nodes.length) {
+            if (iNodes) {
+                if (theExc.Find(myState)!=-1) {
+                    return false;
+                }
+                (*iNodes)<<myState;
+                //return true;
+            }
+        } else { // reached a leaf
+            // attach a row to the new data set
+            if (theExc.Find(myState)!=-1) {
+                return false;
+            }
+            target<<myState;
+            return true;
+
+        }
+    } else {
+        if (curNode.nodes.length == 1) {
+            target << parentState;
+        } else if (iNodes) {
+            (*iNodes)<<parentState;
+        }
+
+    }
+
+    // now scan the "children" and pass on the parameters as needed
+
+    for (long k = 1; k<=curNode.get_num_nodes(); k++) {
+        if(!SingleBuildLeafProbs (*curNode.go_down(k), isRoot?parentState:myState, target, theExc,curTree, false, dsf, iNodes)) {
+            return false;
+        }
+    }
+    return true;
+}
+
+//_______________________________________________________________________________________
+
+_AssociativeList*   _LikelihoodFunction::SimulateCodonNeutral (_Matrix* synCost, _Matrix* nsCost, long countPerState)
+{
+    _AssociativeList * resList = new _AssociativeList;
+
+    if (indexCat.lLength || theTrees.lLength != 1) {
+        _String errMsg ("SimulateCodonNeutral works only with likelihood functions which do not include rate variation and contain exactly one partition.");
+        WarnError (errMsg);
+    } else {
+        PrepareToCompute ();
+        Compute();
+        _TheTree * tree = (_TheTree*)LocateVar(theTrees(0));
+
+        long       stateCount = nsCost->GetVDim();
+        _FString   aKey;
+
+        long       maxSubCount = 3*(tree->GetLeafCount()+tree->GetINodeCount()),
+                   mxDim       = 1+3*((1+maxSubCount)*maxSubCount);
+
+        SetStatusLine ("Simulating the null distribution");
+
+        long      totalSimCount = stateCount * countPerState / 100,
+                  doneCount     = 0;
+
+        for (long k=0; k<stateCount; k++) {
+            /*_Matrix              simmedSites (countPerState,2,false,true),
+                                   *sortedStates = nil;*/
+
+            _Matrix               simmedStates (mxDim,1,false,true);
+
+            for (long it = 0; it < countPerState; it++) {
+                _Parameter s  = 0.0,
+                           ns = 0.0;
+
+
+                doneCount++;
+#if !defined __UNIX__ || defined __HEADLESS__
+                if (doneCount%totalSimCount==0) {
+                    SetStatusBarValue (doneCount/totalSimCount,1.0, 0.0);
+                }
+#endif
+
+                CodonNeutralSimulate    (tree->GetRoot(), k, true, synCost, nsCost, s, ns);
+
+#ifndef __BORLAND_HACK__
+                long nsi = round (s+ns);
+#else
+                long nsi = (long)(s+ns+0.5);
+#endif
+                if (ns <= maxSubCount) {
+                    if (nsi) {
+#ifndef __BORLAND_HACK__
+                        long si  = round(s*6.);
+#else
+                        long si  = (long)(s*6.+0.5);
+#endif
+
+                        simmedStates.theData[1+3*((nsi-1)*nsi)+si] += 1.0;
+                    } else {
+                        simmedStates.theData[0] += 1.0;
+                    }
+                }
+
+                /*simmedSites.theData[2*it]   = floor(s+ns);
+                simmedSites.theData[2*it+1] = s;*/
+            }
+
+            /* resort the matrix */
+
+            _AssociativeList      *stateAVL = new _AssociativeList;
+
+            for (long it2 = 0; it2 < maxSubCount; it2++) {
+                long    mxDim2 = it2?2+6*it2:2,
+                        offset = (it2>0)+3*((it2-1)*it2);
+
+                _Matrix * conditionalDistribution = new _Matrix (mxDim2,2,false,true);
+
+                _Parameter total = 0.0,
+                           mb    = 1./6.;
+
+                for (long idx2 = 0; idx2 < mxDim2-1; idx2++) {
+                    conditionalDistribution->theData[2*idx2+2] = idx2*mb;
+                    total += (conditionalDistribution->theData[2*idx2+3] = simmedStates.theData[offset+idx2]);
+                }
+
+                if (total>0.0) {
+                    conditionalDistribution->theData[0] = total;
+                    total = 1./total;
+                    conditionalDistribution->theData[3] *= total;
+                    for (long idx2 = 5; idx2 < 2*mxDim2; idx2+=2) {
+                        conditionalDistribution->theData[idx2] = conditionalDistribution->theData[idx2]*total+conditionalDistribution->theData[idx2-2];
+                    }
+
+                    *aKey.theString = it2;
+                    stateAVL->MStore (&aKey, conditionalDistribution, false);
+                } else {
+                    DeleteObject (conditionalDistribution);
+                }
+            }
+
+            *aKey.theString = k;
+            resList->MStore (&aKey, stateAVL, false);
+
+            /* now resort the values */
+
+            /*sortedStates = (_Matrix*)simmedSites.SortMatrixOnColumn (&_Constant (0.0));
+
+            _Parameter      lastV = sortedStates->theData[0];
+            long            lastI = 0,
+                            curI  = 0,
+                            mD    = 2*countPerState;
+
+            while (1)
+            {
+                while ( curI < mD && sortedStates->theData[curI] == lastV)
+                    curI += 2;
+
+                long        mxD = (curI - lastI)/2;
+
+                _Matrix     conditionalSample (mxD,1,false,true),
+                            * scs = nil;
+
+                for (long i2 = 0; i2 < mxD; i2++)
+                    conditionalSample.theData[i2] = sortedStates->theData[lastI+2*i2+1];
+
+
+                _Parameter      mxDI = 1./mxD;
+                scs = (_Matrix*)conditionalSample.SortMatrixOnColumn (&_Constant (0.0));
+
+                long    lastI2 = 0,
+                        curI2  = 0;
+
+                _Parameter lastV2 = scs->theData[0];
+
+                _AssociativeList condASL;
+
+                while (1)
+                {
+                    while (curI2 < mxD && scs->theData[curI2] == lastV2)
+                        curI2++;
+
+                    long mxD2 = curI2-lastI2;
+                    *aKey.theString = _String (lastV2);
+
+                    condASL.MStore (&aKey, new _Constant (mxD2*mxDI), false);
+                    lastI2 = curI2;
+
+                    if (curI2 < mxD)
+                        lastV2 = scs->theData[curI2];
+                    else
+                        break;
+                }
+
+                curI2 = condASL.avl.countitems();
+                _Matrix * condProbs = new _Matrix (curI2+1, 2, false, true);
+
+                condProbs->theData[0] = mxD;
+
+                _SimpleList tcache;
+
+                long        iv,
+                            k2 = condASL.avl.Traverser (tcache, iv, condASL.avl.GetRoot());
+
+                lastI2 = 2;
+                for (; k2>=0; k2 = condASL.avl.Traverser (tcache, iv))
+                {
+                    condProbs->theData[lastI2] = ((_String*)condASL.avl.Retrieve (k2))->toNum();
+                    condProbs->theData[lastI2+1] = ((_Constant*)condASL.avl.GetXtra (k2))->Value()+condProbs->theData[lastI2-1];
+                    lastI2+=2;
+                }
+
+                DeleteObject (scs);
+
+                *aKey.theString = lastV;
+                stateK->MStore (&aKey, condProbs, false);
+
+                lastI = curI;
+                if (curI < mD)
+                    lastV = sortedStates->theData[curI];
+                else
+                    break;
+
+            }
+
+            DeleteObject (sortedStates);
+            *aKey.theString = k;
+
+            resList->MStore (&aKey, stateK,false);*/
+
+        }
+        DoneComputing();
+    }
+    SetStatusLine ("Idle");
+    return resList;
+}
+
+//_______________________________________________________________________________________
+
+void    _LikelihoodFunction::CodonNeutralSimulate (node<long>& curNode, long parentState, bool isRoot, _Matrix* costMatrixS, _Matrix* costMatrixNS, _Parameter& synCount, _Parameter& nsCount)
+{
+    long myState = 0;
+
+    if (!isRoot) {
+        _CalcNode* ccurNode = (_CalcNode*)LocateVar (curNode.get_data());
+
+        _Matrix  * compExpMatrix = ccurNode->GetCompExp();
+
+        long   k=0,
+               n = compExpMatrix->GetVDim();
+
+        _Parameter* fastI = compExpMatrix->theData+parentState*n,
+                    randVal = genrand_int32()/(_Parameter)RAND_MAX_32,
+                    sumSoFar = 0.0;
+
+
+        while  ( randVal>sumSoFar && k<n) {
+            sumSoFar+=fastI[k];
+            k++;
+        }
+
+        if (k==0) {
+            myState = 0;
+        } else {
+            myState=k-1;
+        }
+
+        n = parentState * n + myState;
+        synCount += costMatrixS->theData[n];
+        nsCount  += costMatrixNS->theData[n];
+
+    }
+
+    // now scan the "children" and pass on the parameters as needed
+
+    for (long k = curNode.get_num_nodes(); k ; k--) {
+        CodonNeutralSimulate (*curNode.go_down(k), isRoot?parentState:myState, false, costMatrixS, costMatrixNS, synCount, nsCount);
+    }
+}
+
+//_______________________________________________________________________________________
+
+
+void    _LikelihoodFunction::SetNthBit (long& reference, char n)
+{
+    long bitshifter = 1;
+    bitshifter = bitshifter<<n;
+    reference = reference|bitshifter;
+}
+
+//_______________________________________________________________________________________
+
+bool    _LikelihoodFunction::CheckNthBit (long& reference, char n)
+{
+    unsigned long bitshifter = 1;
+    bitshifter = bitshifter<<n;
+    return reference&bitshifter;
+}
+
+//_______________________________________________________________________________________
+
+char    _LikelihoodFunction::HighestBit (long reference)
+{
+    unsigned long bitshifter = 1,count = sizeof(long)*8-1;
+    bitshifter = bitshifter<<(sizeof(long)*8-1);
+    while(!(reference&bitshifter)) {
+        bitshifter = bitshifter>>1;
+        count--;
+    }
+    return count;
+}
+
+//_______________________________________________________________________________________
+
+long    _LikelihoodFunction::HasHiddenMarkov (long reference, bool hmm)
+{
+    unsigned long bitshifter = 1, count = sizeof(long)*8-1;
+    long     hMarkov = -1;
+    bitshifter = bitshifter<<(sizeof(long)*8-1);
+    while(bitshifter) {
+        if (bitshifter&reference) {
+            _CategoryVariable* thisC = (_CategoryVariable*)LocateVar(indexCat.lData[count]);
+            if (hmm) {
+                if (thisC->IsHiddenMarkov ()) {
+                    hMarkov = count;
+                }
+            } else if (thisC->IsConstantOnPartition ()) {
+                return count;
+            }
+        }
+        bitshifter = bitshifter>>1;
+        count--;
+    }
+    return hMarkov;
+}
+
+//_______________________________________________________________________________________
+
+char    _LikelihoodFunction::LowestBit (long reference)
+{
+    unsigned long bitshifter = 1,count = 0;
+    while(!(reference&bitshifter)) {
+        bitshifter = bitshifter<<1;
+        count++;
+    }
+    return count;
+}
+
+//_______________________________________________________________________________________
+
+void    _LikelihoodFunction::BuildIncrements (long reference, _SimpleList& incList)
+{
+    unsigned long currentIncr = 1;
+    for (long i=0; i<indexCat.lLength; i++) {
+        if (CheckNthBit(reference,i)) {
+            incList<<currentIncr;
+            currentIncr*=((_CategoryVariable*)LocateVar(indexCat(i)))->GetNumberOfIntervals();
+        } else {
+            incList<<0;
+        }
+    }
+}
+
+//_______________________________________________________________________________________
+
+long    _LikelihoodFunction::MaximumDimension (void)
+{
+    long maxDim = 0;
+    for (long i=0; i<theTrees.lLength; i++) {
+        _Matrix *cM = (_Matrix*)LocateVar(theProbabilities.lData[i])->GetValue();
+        long myDim = cM->GetHDim()>cM->GetVDim()?cM->GetHDim():cM->GetVDim();
+        if (myDim>maxDim) {
+            maxDim = myDim;
+        }
+    }
+    return maxDim;
+}
+
+//_______________________________________________________________________________________
+
+long    _LikelihoodFunction::SequenceCount (long partID)
+{
+    if ((partID>=0)&&(partID<theTrees.lLength)) {
+        _TheTree * cT = ((_TheTree*)(LocateVar(theTrees(partID))));
+        _PMathObj  seqs = cT->TipCount();
+        long res = seqs->Value();
+        DeleteObject (seqs);
+        return res;
+    }
+    return -1;
+}
+
+//_______________________________________________________________________________________
+
+long    _LikelihoodFunction::SiteCount (void)
+{
+    long res = 0;
+
+    for (long i=0; i<theDataFilters.lLength; i++) {
+        _DataSetFilter * df = (_DataSetFilter*) dataSetFilterList (theDataFilters.lData[i]);
+        res += df->theOriginalOrder.lLength;
+    }
+
+    return res;
+}
+
+//_______________________________________________________________________________________
+
+
+
+//_______________________________________________________________________________________
+
+void    _LikelihoodFunction::PrepareToCompute (bool disableClear)
+{
+    if (hasBeenSetUp == 0) {
+        long categCount = 1;
+
+
+        for (long i=0; i<theTrees.lLength; i++) {
+            _TheTree            * cT = ((_TheTree*)(LocateVar(theTrees(i))));
+
+            long locCC = cT->CountTreeCategories();
+            if   (locCC >categCount) {
+                categCount = locCC;
+            }
+            cT->SetUpMatrices (locCC);
+
+#if USE_SCALING_TO_FIX_UNDERFLOW
+            cT->AllocateUnderflowScalers (((_DataSetFilter*)dataSetFilterList (theDataFilters(i)))->NumberDistinctSites());
+#endif
+
+        }
+
+        for (long i2=0; i2<theProbabilities.lLength; i2++) {
+            ((_Matrix*)LocateVar(theProbabilities.lData[i2])->GetValue())->MakeMeSimple();
+        }
+
+        SetupCategoryCaches   ();
+        SetupLFCaches         ();
+        SetReferenceNodes     ();
+
+        if (disableClear) {
+            hasBeenSetUp = 0x6FFFFFFF;
+        } else {
+            hasBeenSetUp ++;
+        }
+        siteArrayPopulated = false;
+ 
+    } else {
+        hasBeenSetUp++;
+    }
+}
+
+//_______________________________________________________________________________________
+
+void    _LikelihoodFunction::DoneComputing (bool force)
+{
+    if (hasBeenSetUp == 1 || (hasBeenSetUp > 0 && force)) {
+        for (unsigned long i=0; i<theTrees.lLength; i++) {
+            _TheTree * cT = ((_TheTree*)(LocateVar(theTrees(i))));
+            cT->CleanUpMatrices();
+        }
+        if (mstCache) {
+            mstCache->resultCache.Clear();
+            mstCache->statesCache.Clear();
+        }
+        for (unsigned long i=0; i<theProbabilities.lLength; i++) {
+            ((_Matrix*)LocateVar(theProbabilities.lData[i])->GetValue())->MakeMeGeneral();
+        }
+
+        DeleteObject (siteResults);
+        siteResults = 0;
+
+        DeleteCaches        (false);
+        categoryTraversalTemplate.Clear();
+        hasBeenSetUp       = 0;
+        siteArrayPopulated = false;
+    } else if (hasBeenSetUp) {
+        hasBeenSetUp --;
+    }
+}
+
+//_______________________________________________________________________________________
+void    _LikelihoodFunction::FillInConditionals(long partIndex) {
+    if (partIndex >= 0) {
+
+        long    catCounter = 0;
+        _SimpleList             pcats;
+        PartitionCatVars        (pcats,partIndex);
+        catCounter            = pcats.lLength;
+
+        _TheTree   *tree        = (_TheTree*)LocateVar(theTrees(partIndex));
+        _DataSetFilter *dsf = (_DataSetFilter*)dataSetFilterList (theDataFilters(partIndex));
+
+        _SimpleList* tcc            = (_SimpleList*)treeTraversalMasks(partIndex);
+        if (tcc) {
+            long shifter = dsf->GetDimension()*dsf->NumberDistinctSites()*tree->GetINodeCount();
+            for (long cc = 0; cc <= catCounter; cc++) {
+                tree->FillInConditionals(dsf, conditionalInternalNodeLikelihoodCaches[partIndex] + cc*shifter, tcc);
+            }
+        }
+    } else {
+        for (long i = 0; i < theTrees.lLength; i++) {
+            FillInConditionals (i);
+        }
+    }
+}
+//_______________________________________________________________________________________
+void    _LikelihoodFunction::RankVariables(_AVLListX* tagger)
+{
+    _SimpleList varRank (indexInd.lLength,0,0), 
+                holder;
+    
+    gradientBlocks.Clear();
+    
+    if (tagger) {
+        for (unsigned long k=0; k<indexInd.lLength; k++) {
+            long idx = tagger->Find((BaseRef)indexInd.lData[k]);
+            if (idx < 0) {
+                ReportWarning (_String("Internal error in '_LikelihoodFunction::RankVariables': missing parameter name ") & *LocateVar(indexInd.lData[k])->theName);
+            } else {
+                varRank.lData[k] = -tagger->GetXtra(idx);
+            }
+        }
+    }
+    else {
+        for (unsigned long k=0; k<indexInd.lLength; k++) {
+            if (LocateVar(indexInd.lData[k])->IsGlobal()) {
+                varRank<<10000;
+            } else {
+                varRank<<10050;
+            }
+            //printf ("%s -> %ld\n", LocateVar(indexInd.lData[k])->theName->sData, varRank.GetElement(-1));
+        }
+
+        for (unsigned long k=0; k<indexDep.lLength; k++) {
+            holder.Clear();
+            {
+                _AVLList   al (&holder);
+                LocateVar (indexDep.lData[k])->ScanForVariables(al,true);
+                al.ReorderList ();
+            }
+            for (unsigned long j=0; j<holder.lLength; j++) {
+                long f = indexInd.Find(holder.lData[j]);
+                if (f>=0) {
+                    varRank.lData[f]--;
+                }
+            }
+        }
+    }
+    
+    SortLists (&varRank,&indexInd);
+    gradientBlocks.Clear();
+    
+    // enforce user provided rankings 
+    
+    _AssociativeList * variableGrouping = (_AssociativeList*)FetchObjectFromVariableByType(&userSuppliedVariableGrouping, ASSOCIATIVE_LIST);
+    if (variableGrouping) {
+    
+        _SimpleList  hist,
+                     supportList;
+                      
+        _AVLListX    existingRanking (&supportList);
+        
+        long         ls,
+                     cn = variableGrouping->avl.Traverser (hist,ls,variableGrouping->avl.GetRoot());                     
+                     
+        for (unsigned long vi = 0; vi < indexInd.lLength; vi ++ ) {
+            existingRanking.Insert((BaseRef)indexInd.lData[vi], vi, true);
+        }          
+
+        long  offset = 1; 
+        bool  re_sort = false;
+        
+        while (cn >= 0) {
+            _PMathObj anEntry = (_PMathObj)variableGrouping->avl.GetXtra (cn);
+            if (anEntry->ObjectClass() == MATRIX) {
+                _Matrix *variableGroup = (_Matrix*) anEntry;
+                if (variableGroup -> IsAStringMatrix()) {
+                    unsigned long dimension = variableGroup->GetHDim() * variableGroup->GetVDim ();
+                    
+                    _SimpleList thisBlock;
+                    for (unsigned long variable_id = 0; variable_id < dimension; variable_id ++) {
+                        _String variableID ((_String*)variableGroup->GetFormula (variable_id,-1)->Compute()->toStr());
+                        long variableIndex = LocateVarByName(variableID);
+                        if (variableIndex >= 0) {
+                            existingRanking.UpdateValue((BaseRef)variableIndex, -offset - dimension + variable_id, 1);
+                            thisBlock << variableIndex;
+                            //printf ("%s<%ld>\n",variableID.sData, variableIndex );
+                            re_sort = true;
+                        }
+                    }
+                    if (thisBlock.lLength) {
+                        gradientBlocks && & thisBlock;
+                    }
+                    offset += dimension;
+                }
+            }
+            cn = variableGrouping->avl.Traverser (hist,ls);
+        }
+        if (re_sort) {
+            _SimpleList new_ranks;
+            
+            for (unsigned long vi = 0; vi < indexInd.lLength; vi ++ ) {
+                new_ranks << existingRanking.GetXtra(existingRanking.Find ((BaseRef)indexInd.lData[vi]));
+            }
+            SortLists (&new_ranks,&indexInd);
+
+            
+            if (gradientBlocks.lLength) {
+                _SimpleList  aux_list,
+                             included (indexInd.lLength, 0,0),
+                             not_listed;
+                
+                _AVLListX    indexIndToGlobalID (&aux_list);
+                
+                for (unsigned long vi = 0; vi < indexInd.lLength; vi ++ ) {
+                    indexIndToGlobalID.Insert((BaseRef)indexInd.lData[vi], vi, true);
+                    //printf ("[%ld]\n",indexInd.lData[vi] );
+                }
+                
+                for (long b = 0; b < gradientBlocks.countitems(); b++) {
+                    _SimpleList *a_block = (_SimpleList*)(gradientBlocks(b));
+                    for (long i = 0; i < a_block->countitems(); i++){
+                        long t = indexIndToGlobalID.Find ((BaseRef)a_block->lData[i]);
+                        //printf ("%ld %ld\n",i,t);
+                        if (t >= 0) {
+                            t = indexIndToGlobalID.GetXtra(t);
+                            //printf ("%ld %ld %ld/ %ld /%ld\n", b, i, a_block->lData[i], indexIndToGlobalID.Find ((BaseRef)a_block->lData[i]), t);
+                            a_block->lData[i] = t;
+                            included.lData  [t] = 1;
+                        } else {
+                            a_block->Delete (i--);
+                        }
+                   }
+                    if (a_block->lLength == 0) {
+                        gradientBlocks.Delete(b--);
+                    }
+                }
+                
+                if (gradientBlocks.lLength) {
+                    for (long t = 0; t < included.lLength; t++) {
+                        if (included.lData[t]==0) {
+                            not_listed << t;
+                        }
+                    }
+                    if (not_listed.lLength) {
+                        gradientBlocks && & not_listed;
+                    }
+                }
+                
+                /*for (long b = 0; b < gradientBlocks.lLength; b++) {
+                    _SimpleList *a_block = (_SimpleList*)(gradientBlocks(b));
+                    for (long i = 0; i < a_block->lLength; i++){
+                        printf ("Block %ld variable %s\n", b, LocateVar(indexInd.lData[a_block->lData[i]])->GetName()->sData);
+                    }
+                }*/
+                
+            }
+            
+        }
+    }
+    
+}
+
+//_______________________________________________________________________________________
+
+_CustomFunction::_CustomFunction (_String* arg)
+{
+    _String body    (*arg),
+            errMsg ;
+
+    _FormulaParsingContext fpc (&errMsg, nil);
+
+    if (Parse (&myBody, body, fpc, nil) == HY_FORMULA_EXPRESSION) {
+        _SimpleList myVars;
+        {
+            _AVLList al (&myVars);
+            myBody.ScanFForVariables(al,true,false,false);
+            al.ReorderList();
+        }
+        for (unsigned long k=0; k<myVars.lLength; k++)
+            if (LocateVar(myVars.lData[k])->IsIndependent()) {
+                GetIndependentVars() << myVars.lData[k];
+            }
+    } else {
+        WarnError (_String ("An invalid expression supplied for formula-based custom LF: '") & errMsg & '\'');
+    }
+}
+
+//_______________________________________________________________________________________
+
+_Parameter _CustomFunction::Compute (void)
+{
+    likeFuncEvalCallCount++;
+    _SimpleList * iv = &GetIndependentVars ();
+    for (unsigned long i=0; i<iv->lLength; i++) {
+        _Parameter result = GetIthIndependent(i);
+
+        if (result<GetIthIndependentBound (i,true) || result>GetIthIndependentBound (i,false)) {
+            return -A_LARGE_NUMBER;
+        }
+    }
+
+    _PMathObj res = myBody.Compute();
+    if (res) {
+        return res->Value();
+    }
+    return 0.0;
+}
diff --git a/src/core/likefunc2.cpp b/src/core/likefunc2.cpp
new file mode 100644
index 0000000..912c60d
--- /dev/null
+++ b/src/core/likefunc2.cpp
@@ -0,0 +1,1397 @@
+/*
+
+HyPhy - Hypothesis Testing Using Phylogenies.
+
+Copyright (C) 1997-now
+Core Developers:
+  Sergei L Kosakovsky Pond (spond at ucsd.edu)
+  Art FY Poon    (apoon at cfenet.ubc.ca)
+  Steven Weaver (sweaver at ucsd.edu)
+  
+Module Developers:
+	Lance Hepler (nlhepler at gmail.com)
+	Martin Smith (martin.audacis at gmail.com)
+
+Significant contributions from:
+  Spencer V Muse (muse at stat.ncsu.edu)
+  Simon DW Frost (sdf22 at cam.ac.uk)
+
+Permission is hereby granted, free of charge, to any person obtaining a
+copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be included
+in all copies or substantial portions of the Software.
+
+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.
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+*/
+
+#include "likefunc.h"
+#include <math.h>
+
+#ifdef    __HYPHYDMALLOC__
+#include "dmalloc.h"
+#endif
+
+#ifdef  _SLKP_LFENGINE_REWRITE_
+
+_String _hyMarginalSupportMatrix ("marginal_support_matrix");
+
+/*--------------------------------------------------------------------------------------------------*/
+
+void    _LikelihoodFunction::DetermineLocalUpdatePolicy (void)
+{
+    for (unsigned long k = 0; k < theTrees.lLength; k ++) {
+        unsigned long catCount = ((_TheTree*)LocateVar(theTrees(k)))->categoryCount;
+        
+        _List * lup = new _List,
+              * mte = new _List;
+
+        computedLocalUpdatePolicy.AppendNewInstance (new _SimpleList (catCount,0,0));
+        
+        for (unsigned long l = 0; l < catCount; l++) {
+            lup->AppendNewInstance (new _SimpleList);
+            mte->AppendNewInstance (new _List);
+        }
+
+        localUpdatePolicy.AppendNewInstance      (lup);
+        matricesToExponentiate.AppendNewInstance (mte);
+    }
+}
+
+
+/*--------------------------------------------------------------------------------------------------*/
+
+void    _LikelihoodFunction::ComputeParameterPenalty (void){
+  smoothingPenalty = 0.0;
+  if (smoothingTerm > 0.0) {
+      //printf ("\n_LikelihoodFunction::ComputeParameterPenalty\n");
+      for (unsigned long k = 0; k < indexInd.lLength; k ++) {
+        _Parameter lb = GetIthIndependentBound(k, true),
+                   ub = GetIthIndependentBound(k, false),
+                   mp = 0.5*(lb+ub),
+                   span = ub-lb,
+                   v  = GetIthIndependent(k);
+                   
+       _Parameter term = exp (50*log (2.*fabs (v-mp)/span));
+       /*if (term > 0.0) {
+        printf ("\n[_LikelihoodFunction::ComputeParameterPenalty %lu: %g %g %g %g]\n", k, lb, ub, v, term); 
+       }*/
+       smoothingPenalty += term;
+        // (2.*(v-mp)/span)^50
+      }
+  }
+}
+
+
+/*--------------------------------------------------------------------------------------------------*/
+
+void    _LikelihoodFunction::FlushLocalUpdatePolicy (void)
+{
+    computedLocalUpdatePolicy.Clear();
+    localUpdatePolicy.Clear();
+    matricesToExponentiate.Clear();
+}
+
+//_______________________________________________________________________________________
+void            _LikelihoodFunction::PartitionCatVars     (_SimpleList& storage, long partIndex)
+{
+    if (partIndex < blockDependancies.lLength) {
+        for (long bit = 0; bit < 32; bit++)
+            if (CheckNthBit(blockDependancies.lData[partIndex], bit)) {
+                storage << indexCat.lData[bit];
+            }
+    }
+}
+
+//_______________________________________________________________________________________
+long            _LikelihoodFunction::TotalRateClassesForAPartition    (long partIndex, char mode)
+{
+    if (partIndex >= 0 && partIndex < categoryTraversalTemplate.lLength) {
+        _List* myList = (_List*)categoryTraversalTemplate(partIndex);
+        if (myList->lLength)
+            if (mode == 0) {
+                return ((_SimpleList*)((*myList)(1)))->Element(-1);
+            } else {
+                long hmmCats = 1;
+                _SimpleList * catVars = (_SimpleList*)(*myList)(0);
+                for (long id = 0; id < catVars->lLength; id++)
+                    if (mode == 1) {
+                        if (((_CategoryVariable*)catVars->lData[id])->IsHiddenMarkov()) {
+                            hmmCats *= ((_SimpleList*)((*myList)(1)))->Element(id);
+                        }
+                    } else if (mode == 2) {
+                        if (((_CategoryVariable*)catVars->lData[id])->IsConstantOnPartition()) {
+                            hmmCats *= ((_SimpleList*)((*myList)(1)))->Element(id);
+                        }
+                    }
+                return hmmCats;
+
+            }
+    } else if (partIndex < 0) {
+        long catCount = 1;
+        if (mode == 0)
+            for (long k = 0; k < indexCat.lLength; k++) {
+                catCount *= ((_CategoryVariable*)LocateVar (indexCat.lData[k]))->GetNumberOfIntervals();
+            }
+        else if (mode == 1) {
+            for (long k = 0; k < categoryTraversalTemplate.lLength; k++) {
+                long partHMMCount = TotalRateClassesForAPartition(k,1);
+                catCount = MAX(partHMMCount,catCount);
+            }
+        }
+        return catCount;
+    }
+    return 1;
+}
+
+//_______________________________________________________________________________________
+void            _LikelihoodFunction::SetupCategoryCaches      (void)
+{
+    categoryTraversalTemplate.Clear();
+    for (long partIndex = 0; partIndex < theDataFilters.lLength; partIndex++)
+        if (blockDependancies.lData[partIndex] == 0) {
+            _List * noCatVarList = new _List;
+            noCatVarList->AppendNewInstance (new _List);
+            noCatVarList->AppendNewInstance (new _SimpleList((long)1L));
+            noCatVarList->AppendNewInstance (new _SimpleList((long)1L));
+            noCatVarList->AppendNewInstance (new _SimpleList());
+            noCatVarList->AppendNewInstance (new _SimpleList((long)0L));
+            categoryTraversalTemplate.AppendNewInstance (noCatVarList);
+        } else {
+            _SimpleList       myCats;
+            PartitionCatVars  (myCats, partIndex);
+            _List*            catVarReferences = new _List,
+            *             container        = new _List;
+
+            _SimpleList *     catVarCounts     = new _SimpleList,
+            *     catVarOffsets    = new _SimpleList (myCats.lLength,1,0),
+            *     hmmAndCOP        = new _SimpleList (),
+            *     varType          = new _SimpleList (myCats.lLength,1,0);
+
+            long              totalCatCount    = 1L,
+                              hmmCatCount      = 1L,
+                              catVarFlags      = 0L,
+                              varIndex;
+
+            for ( varIndex = 0; varIndex < myCats.lLength; varIndex++) {
+                _CategoryVariable * aCV = (_CategoryVariable *)LocateVar (myCats.lData[varIndex]);
+                (*catVarReferences) << aCV;
+                long                intervalCount = aCV->GetNumberOfIntervals();
+                (*catVarCounts)     << intervalCount;
+
+                if (aCV->IsHiddenMarkov() || aCV->IsConstantOnPartition()) {
+                    if (aCV->IsConstantOnPartition()) {
+                        if (catVarFlags & (_hyphyCategoryCOP|_hyphyCategoryHMM)) {
+                            break;
+                        }
+                        varType->lData[varIndex] = _hyphyCategoryCOP;
+                    } else {
+                        if (catVarFlags & (_hyphyCategoryCOP|_hyphyCategoryHMM)) {
+                            break;
+                        }
+                        varType->lData[varIndex] = _hyphyCategoryHMM;
+                    }
+
+                    (*hmmAndCOP) << intervalCount;
+                    hmmCatCount *= intervalCount;
+                } else {
+                    varType->lData[varIndex] = _hyphyCategoryNormal;
+                }
+
+                catVarFlags |= varType->lData[varIndex];
+                totalCatCount       *= intervalCount;
+            }
+
+            if (varIndex <  myCats.lLength) {
+                WarnError ("Currently, HyPhy can support at most one HMM or Constant on Partition variable per partition");
+                return;
+            }
+
+            (*catVarCounts) << totalCatCount;
+            (*varType)      << catVarFlags;
+
+            for (long varIndex = myCats.lLength-2; varIndex >= 0; varIndex--) {
+                catVarOffsets->lData[varIndex] = catVarOffsets->lData[varIndex+1]*catVarCounts->lData[varIndex+1];
+            }
+
+            for (long varIndex = hmmAndCOP->lLength-2; varIndex >= 0; varIndex--) {
+                hmmAndCOP->lData[varIndex] *= hmmAndCOP->lData[varIndex+1];
+            }
+
+            if (hmmAndCOP->lLength) {
+                (*hmmAndCOP) << hmmCatCount;
+            }
+
+            container->AppendNewInstance (catVarReferences);
+            container->AppendNewInstance (catVarCounts);
+            container->AppendNewInstance (catVarOffsets);
+            container->AppendNewInstance (hmmAndCOP);
+            container->AppendNewInstance (varType);
+
+            ((_TheTree*)LocateVar(theTrees(partIndex)))->SetupCategoryMapsForNodes(*catVarReferences,*catVarCounts,*catVarOffsets);
+
+            categoryTraversalTemplate.AppendNewInstance(container);
+        }
+
+    if (indexCat.lLength) {
+        if (siteResults) {
+            DeleteObject (siteResults);
+        }
+        AllocateSiteResults();
+    }
+}
+
+/*--------------------------------------------------------------------------------------------------*/
+
+void    _LikelihoodFunction::RestoreScalingFactors (long index, long branchID, long patternCnt, long* scc, long *sccb)
+{
+    if (branchID >= 0) { // finished using an existing cache
+        overallScalingFactors[index] = overallScalingFactorsBackup[index];
+        if (sccb)
+            for (long recoverIndex = 0; recoverIndex < patternCnt; recoverIndex++) {
+                scc[recoverIndex] = sccb[recoverIndex];
+            }
+    }
+}
+
+/*--------------------------------------------------------------------------------------------------*/
+
+bool    _LikelihoodFunction::ProcessPartitionList (_SimpleList& partsToDo, _Matrix* partitionList, _String caller)
+{
+    long    partCount = CountObjects(0);
+    partsToDo.Populate (partCount, 0, 1);
+    if (partitionList) {
+        partitionList->ConvertToSimpleList (partsToDo);
+        DeleteObject (partitionList);
+        partsToDo.Sort();
+        partsToDo.FilterRange (-1, partCount);
+        if (partsToDo.lLength == 0) {
+            WarnError (_String("An invalid partition specification in call to ") & caller);
+            return nil;
+        }
+    }
+
+    return true;
+}
+
+
+//_______________________________________________________________________________________
+
+void    _LikelihoodFunction::ReconstructAncestors (_DataSet &target,_SimpleList& doTheseOnes, _String& baseResultID,  bool sample, bool doMarginal, bool doLeaves)
+/*
+    Reconstruct ancestors for a likelihood function using
+
+-- target      :    the _DataSet object that will receive the results
+-- doTheseOnes :    a _sorted_ array of partition indices to include in this operation; is assumed to contain valid indices (i.e. 0 -- number of partitions - 1)
+-- baseResultID:    the HBL identifier of the dataset that will receive the result; used as a prefix for .marginal_support_matrix support matrix (when doMarginal = true)
+-- sample      :    if true, an ancestral sample (weighted by likelihood) is drawn, otherwise an ML (or maginal) reconstruction is carried out
+-- doMarginal  :    if sample == false, doMarginal determines how the ancestors are reconstructed; if true, the reconstruction is marginal (maximizes
+                    the likelihood of each node while summing over the rest), otherwise it is joint.
+-- doLeaves    :    if sample == false and doMarginal == false (for now) and doLeaves == true, then the procedure will also
+                    reconstruct (joint ML) the best assignment of leaves
+
+*/
+{
+    _DataSetFilter *dsf             = (_DataSetFilter*)dataSetFilterList (theDataFilters(doTheseOnes.lData[0]));
+    _TheTree        *firstTree      = (_TheTree*)LocateVar(theTrees(doTheseOnes.lData[0]));
+
+    target.SetTranslationTable      (dsf->GetData());
+    target.ConvertRepresentations();
+
+    computationalResults.ZeroUsed();
+    PrepareToCompute();
+
+    // check if we need to deal with rate variation
+    _Matrix         *rateAssignments = nil;
+    if  (!doMarginal && indexCat.lLength>0) {
+        rateAssignments = (_Matrix*)checkPointer(ConstructCategoryMatrix(doTheseOnes,_hyphyLFConstructCategoryMatrixClasses,false));
+    } else {
+        Compute();    // need to do this to populate rate matrices
+    }
+
+    long siteOffset         = 0,
+         patternOffset        = 0,
+         sequenceCount       ;
+
+    for (long i = 0; i<doTheseOnes.lLength; i++) {
+        long       partIndex    = doTheseOnes.lData[i];
+        _TheTree   *tree        = (_TheTree*)LocateVar(theTrees(partIndex));
+        dsf = (_DataSetFilter*)dataSetFilterList (theDataFilters(partIndex));
+
+        long    catCounter = 0;
+
+        if (rateAssignments) {
+            _SimpleList             pcats;
+            PartitionCatVars        (pcats,partIndex);
+            catCounter            = pcats.lLength;
+        }
+
+        if (i==0) {
+            tree->AddNodeNamesToDS (&target,sample == false && doLeaves,!(doLeaves && doMarginal) ,2*(doMarginal == false && sample == false && doLeaves));
+            // store internal or leaf node names in the dataset
+            sequenceCount = target.GetNames().lLength;
+        } else {
+            if (!tree->Equal(firstTree)) { // incompatible likelihood function
+                ReportWarning ((_String("Ancestor reconstruction had to ignore partition ")&_String(partIndex+1)&" of the likelihood function since it has a different tree topology than the first part."));
+                continue;
+            }
+            _TranslationTable * mtt = target.GetTT()->MergeTables(dsf->GetData()->GetTT());
+            if (mtt) {
+                target.SetTranslationTable      (mtt);
+                DeleteObject                    (mtt);
+            } else {
+                ReportWarning ((_String("Ancestor reconstruction had to ignore partition ")&_String(partIndex+1)&" of the likelihood function since it has a character alphabet incompatible with the first part."));
+                continue;
+            }
+        }
+
+        _List       * expandedMap   = dsf->ComputePatternToSiteMap(),
+                      * thisSet;
+
+        if (sample) {
+            _AVLListX   * nodeMapper    = tree->ConstructNodeToIndexMap(true);
+            thisSet                     = new _List;
+            _SimpleList* tcc            = (_SimpleList*)treeTraversalMasks(partIndex);
+            if (tcc) {
+                long shifter = dsf->GetDimension()*dsf->NumberDistinctSites()*tree->GetINodeCount();
+                for (long cc = 0; cc <= catCounter; cc++) {
+                    tree->FillInConditionals(dsf, conditionalInternalNodeLikelihoodCaches[partIndex] + cc*shifter, tcc);
+                }
+            }
+            tree->SampleAncestorsBySequence (dsf, *(_SimpleList*)optimalOrders.lData[partIndex],
+                                             &tree->GetRoot(),
+                                             nodeMapper,
+                                             conditionalInternalNodeLikelihoodCaches[partIndex],
+                                             *thisSet,
+                                             nil,
+                                             *expandedMap,
+                                             catCounter?rateAssignments->theData+siteOffset:nil,
+                                             catCounter);
+
+
+            nodeMapper->DeleteAll(false);
+            DeleteObject (nodeMapper);
+
+        } else {
+            if (doMarginal) {
+                _Matrix  *marginals = new _Matrix;
+                _String  supportMxID = baseResultID & '.' & _hyMarginalSupportMatrix;
+                thisSet = RecoverAncestralSequencesMarginal (partIndex, *marginals, *expandedMap, doLeaves);
+                CheckReceptacleAndStore(&supportMxID, "ReconstructAncestors", true, marginals, false);
+
+            } else
+                thisSet = tree->RecoverAncestralSequences (dsf,
+                          *(_SimpleList*)optimalOrders.lData[partIndex],
+                          *expandedMap,
+                          conditionalInternalNodeLikelihoodCaches[partIndex],
+                          catCounter?rateAssignments->theData+siteOffset:nil,
+                          catCounter,
+                          conditionalTerminalNodeStateFlag[partIndex],
+                          (_GrowingVector*)conditionalTerminalNodeLikelihoodCaches(partIndex),
+                          doLeaves
+                                                          );
+
+        }
+
+
+        _String * sampledString = (_String*)(*thisSet)(0);
+
+        for (long siteIdx = 0; siteIdx<sampledString->sLength; siteIdx++) {
+            target.AddSite (sampledString->sData[siteIdx]);
+        }
+
+        for (long seqIdx = 1; seqIdx < sequenceCount; seqIdx++) {
+            sampledString = (_String*)(*thisSet)(seqIdx);
+            for (long siteIdx = 0; siteIdx<sampledString->sLength; siteIdx++) {
+                target.Write2Site (siteOffset + siteIdx, sampledString->sData[siteIdx]);
+            }
+        }
+        DeleteObject (thisSet);
+        DeleteObject (expandedMap);
+        siteOffset    += dsf->GetSiteCount();
+        patternOffset += dsf->GetSiteCount();
+    }
+
+
+    target.Finalize();
+    target.SetNoSpecies(target.GetNames().lLength);
+
+    if (rateAssignments) {
+        DeleteObject (rateAssignments);
+    }
+
+    DoneComputing ();
+
+}
+
+//_______________________________________________________________________________________________
+
+void            _LikelihoodFunction::PopulateConditionalProbabilities   (long index, char runMode, _Parameter* buffer, _SimpleList& scalers, long branchIndex, _SimpleList* branchValues)
+// this function computes site probabilties for each rate class (or something else that involves iterating over rate classes)
+// see run options below
+
+// run mode can be one of the following
+
+// _hyphyLFConditionProbsRawMatrixMode : simply   populate an M (number of rate classes) x S (number of site patterns) matrix of conditional likelihoods
+//   : expected minimum dimension of buffer is M*S
+//   : scalers will have M*S entries laid out as S for rate class 0, S for rate class 1, .... S for rate class M-1
+
+// _hyphyLFConditionProbsScaledMatrixMode : simply   populate an M (number of rate classes) x S (number of site patterns) and scale to the lowest multiplier
+//   : expected minimum dimension of buffer is M*S
+//   : scalers will have S entries
+
+// _hyphyLFConditionProbsWeightedSum : compute  a sum for each site using weighted by the probability of a given category
+//   : expected minimum dimension of buffer is 2*S
+//   : scalers will have S entries
+//   : **note that the behavior is different if there are HMM (or constant on partition) variables
+//   : the size of the buffer is S*(N+1), where N is the cumulative number of categories in such variables for this partition
+//   : the size of the scaler is also S*N
+//   : the code will behave as _hyphyLFConditionProbsScaledMatrixMode with all other category variables
+//   : summed CONDITIONED on the values of HMM/Constant on partition
+
+// _hyphyLFConditionProbsMaxProbClass : compute the category index of maximum probability
+//   : expected minimum dimension of buffer is 3*S -- the result goes into offset 0
+//   : scalers will have S entries
+
+// _hyphyLFConditionProbsClassWeights : compute the weight of each rate class index
+//   : expected minimum dimension of buffer is M
+//   : scalers will have no entries
+
+// _hyphyLFConditionMPIIterate : compute conditional likelihoods of the partition using MPI
+//   : run mode effectively the same as _hyphyLFConditionProbsWeightedSum
+{
+    _List               *traversalPattern       = (_List*)categoryTraversalTemplate(index),
+                         *variables                = (_List*)((*traversalPattern)(0)),
+                          *catWeigths               = nil;
+
+    _SimpleList         *categoryCounts         = (_SimpleList*)((*traversalPattern)(1)),
+                         *categoryOffsets     = (_SimpleList*)((*traversalPattern)(2)),
+                          *hmmAndCOP                = (_SimpleList*)((*traversalPattern)(3)),
+                           categoryValues         (categoryCounts->lLength,0,0);
+
+    long                totalSteps              = categoryOffsets->lData[0] * categoryCounts->lData[0],
+                        catCount              = variables->lLength-1,
+                        blockLength               = BlockLength(index),
+                        hmmCatSize               = hmmAndCOP->Element(-1),
+                        hmmCatCount                = hmmAndCOP->lLength?(totalSteps/hmmCatSize):0,
+                        currentHMMCat         = 1,
+                        arrayDim              ;
+
+    bool                isTrivial               = variables->lLength == 0,
+                        switchingHMM         = false;
+
+    _CategoryVariable   *catVariable;
+
+
+    switch (runMode) {
+    case _hyphyLFConditionProbsRawMatrixMode:
+        arrayDim = catCount*blockLength;
+        break;
+    case _hyphyLFConditionProbsClassWeights:
+        arrayDim = 0;
+        break;
+    default:
+        arrayDim = hmmCatCount?blockLength*hmmCatSize:blockLength;
+    }
+
+    if (runMode == _hyphyLFConditionProbsWeightedSum || runMode == _hyphyLFConditionMPIIterate || runMode == _hyphyLFConditionProbsClassWeights) {
+        if (runMode == _hyphyLFConditionProbsWeightedSum || runMode == _hyphyLFConditionMPIIterate) {
+            long upperBound = hmmCatCount?hmmAndCOP->Element(-1)*blockLength:blockLength;
+            for (long r = 0; r < upperBound; r++) {
+                buffer[r] = 0.;
+            }
+        }
+        catWeigths = new _List;
+    } else if (runMode == _hyphyLFConditionProbsMaxProbClass)
+        for (long r = 0, r2 = 2*blockLength; r < blockLength; r++, r2++) {
+            buffer[r] = 0.0;
+            buffer[r2] = 0.0;
+        }
+
+    for                 (long currentCat        = 0; currentCat <= catCount; currentCat++) {
+        (catVariable = ((_CategoryVariable**)(variables->lData))[currentCat])->Refresh();
+        catVariable->SetIntervalValue(0,true);
+        if (runMode == _hyphyLFConditionProbsWeightedSum || runMode == _hyphyLFConditionMPIIterate || runMode == _hyphyLFConditionProbsClassWeights) {
+            (*catWeigths) << catVariable->GetWeights();
+        }
+    }
+
+
+    scalers.Populate    (arrayDim,0,0);
+
+#ifdef __HYPHYMPI__
+    _GrowingVector * computedWeights = nil;
+    if (runMode == _hyphyLFConditionMPIIterate) {
+        computedWeights = new _GrowingVector;
+    }
+    long                mpiTasksSent = 0;
+#endif
+
+    for                 (long pass = 0; pass < 1+(runMode == _hyphyLFConditionMPIIterate); pass++) {
+        for                 (long currentRateCombo  = 0; currentRateCombo < totalSteps; currentRateCombo++) {
+
+            // setting each category variable to its appropriate value
+
+            _Parameter       currentRateWeight = 1.;
+            if (pass == 0) {
+                if (!isTrivial) {
+                    long remainder = currentRateCombo % categoryCounts->lData[catCount];
+
+                    if (hmmCatCount) {
+                        currentHMMCat = currentRateCombo / hmmCatCount;
+                        switchingHMM = (currentRateCombo % hmmCatCount) == 0;
+                    }
+
+                    if (currentRateCombo && remainder  == 0) {
+                        categoryValues.lData[catCount] = 0;
+                        (((_CategoryVariable**)(variables->lData))[catCount])->SetIntervalValue(0);
+                        for (long uptick = catCount-1; uptick >= 0; uptick --) {
+                            categoryValues.lData[uptick]++;
+                            if (categoryValues.lData[uptick] == categoryCounts->lData[uptick]) {
+                                categoryValues.lData[uptick] = 0;
+                                (((_CategoryVariable**)(variables->lData))[uptick])->SetIntervalValue(0);
+                            } else {
+                                (((_CategoryVariable**)(variables->lData))[uptick])->SetIntervalValue(categoryValues.lData[uptick]);
+                                break;
+                            }
+                        }
+                    } else {
+                        if (currentRateCombo) {
+                            categoryValues.lData[catCount]++;
+                            (((_CategoryVariable**)(variables->lData))[catCount])->SetIntervalValue(remainder);
+                        }
+                    }
+                }
+
+                if (runMode == _hyphyLFConditionProbsWeightedSum || runMode == _hyphyLFConditionProbsClassWeights || runMode == _hyphyLFConditionMPIIterate) {
+                    for                 (long currentCat        = hmmCatCount; currentCat <= catCount; currentCat++) {
+                        currentRateWeight *= ((_Matrix**)catWeigths->lData)[currentCat]->theData[categoryValues.lData[currentCat]];
+                    }
+
+#ifdef __HYPHYMPI__
+                    if (runMode == _hyphyLFConditionMPIIterate && pass == 0) {
+                        computedWeights->Store(currentRateWeight);
+                    }
+#endif
+                    if (runMode == _hyphyLFConditionProbsClassWeights) {
+                        buffer [currentRateCombo] = currentRateWeight;
+                        continue;
+                    } else if (currentRateWeight == 0.0) { // nothing to do, eh?
+                        continue;
+                    }
+#ifdef __HYPHYMPI__
+                    else {
+                        if (runMode == _hyphyLFConditionMPIIterate) {
+                            SendOffToMPI (currentRateCombo);
+                            mpiTasksSent ++;
+                            continue;
+                        }
+                    }
+#endif
+                }
+            }
+
+            long useThisPartitonIndex = currentRateCombo;
+
+#ifdef __HYPHYMPI__
+            if (runMode == _hyphyLFConditionMPIIterate) {
+                MPI_Status     status;
+                ReportMPIError(MPI_Recv (resTransferMatrix.theData, resTransferMatrix.GetSize(), MPI_DOUBLE, MPI_ANY_SOURCE , HYPHY_MPI_DATA_TAG, MPI_COMM_WORLD,&status),true);
+                useThisPartitonIndex = status.MPI_SOURCE-1;
+                currentRateWeight    = computedWeights->theData[useThisPartitonIndex];
+            }
+#endif
+
+            // now that the categories are set we can proceed with the computing step
+            long             indexShifter                   = blockLength * useThisPartitonIndex;
+            long             *siteCorrectors                = ((_SimpleList**)siteCorrections.lData)[index]->lLength?
+                    (((_SimpleList**)siteCorrections.lData)[index]->lData) + indexShifter
+                    :nil;
+
+
+            if (runMode == _hyphyLFConditionProbsRawMatrixMode || runMode == _hyphyLFConditionProbsScaledMatrixMode)
+                // populate the matrix of conditionals and scaling factors
+            {
+                _Parameter  _hprestrict_ *bufferForThisCategory = buffer + indexShifter;
+
+                ComputeBlock    (index, bufferForThisCategory, useThisPartitonIndex, branchIndex, branchValues);
+                if (usedCachedResults) {
+                    bool saveFR = forceRecomputation;
+                    forceRecomputation = true;
+                    ComputeBlock    (index, bufferForThisCategory, useThisPartitonIndex, branchIndex, branchValues);
+                    forceRecomputation = saveFR;
+                }
+
+                if (runMode == _hyphyLFConditionProbsRawMatrixMode)
+                    for (long p = 0; p < blockLength; p++) {
+                        scalers.lData[p+indexShifter] = siteCorrectors[p];
+                    }
+                else {
+                    if (siteCorrectors) {
+                        for (long r1 = 0; r1 < blockLength; r1++) {
+                            long scv              = *siteCorrectors,
+                                 scalerDifference = scv-scalers.lData[r1];
+
+                            if (scalerDifference > 0)
+                                // this class has a _bigger_ scaling factor than at least one other class
+                                // hence it needs to be scaled down (unless it's the first class)
+                            {
+                                if (useThisPartitonIndex==0) { //(scalers.lData[r1] == -1)
+                                    scalers.lData[r1] = scv;
+                                } else {
+                                    bufferForThisCategory[r1] *= acquireScalerMultiplier (scalerDifference);
+                                }
+                            } else {
+                                if (scalerDifference < 0)
+                                    // this class is a smaller scaling factor, i.e. its the biggest among all those
+                                    // considered so far; all other classes need to be scaled down
+                                {
+                                    _Parameter scaled = acquireScalerMultiplier (-scalerDifference);
+                                    for (long z = indexShifter+r1-blockLength; z >= 0; z-=blockLength) {
+                                        buffer[z] *= scaled;
+                                    }
+
+                                    scalers.lData[r1] = scv;
+                                }
+                            }
+                            siteCorrectors++;
+                        }
+                    }
+                }
+            } else {
+                if (runMode == _hyphyLFConditionProbsWeightedSum || runMode == _hyphyLFConditionProbsMaxProbClass || runMode == _hyphyLFConditionMPIIterate) {
+                    //if (branchIndex>=0)
+                    //  ((_TheTree*)LocateVar(theTrees.lData[index]))->AddBranchToForcedRecomputeList (branchIndex+((_TheTree*)LocateVar(theTrees.lData[index]))->GetLeafCount());
+
+#ifdef          __HYPHYMPI__
+                    if (runMode == _hyphyLFConditionMPIIterate) {
+                        long offset = resTransferMatrix.GetVDim();
+
+                        for (long k = 0; k < blockLength; k++) {
+                            buffer[blockLength+k] = resTransferMatrix.theData[k];
+                            siteCorrectors[k]     = resTransferMatrix.theData[k+offset];
+                        }
+                    } else
+
+#endif
+
+                        ComputeBlock    (index, buffer + (hmmCatCount?hmmCatSize:1)*blockLength, useThisPartitonIndex, branchIndex, branchValues);
+
+                    if (runMode != _hyphyLFConditionMPIIterate && usedCachedResults) {
+                        bool saveFR = forceRecomputation;
+                        forceRecomputation = true;
+                        ComputeBlock    (index, buffer + (hmmCatCount?hmmCatSize:1)*blockLength, useThisPartitonIndex, branchIndex, branchValues);
+                        forceRecomputation = saveFR;
+                    }
+
+
+                    if (runMode == _hyphyLFConditionProbsWeightedSum || runMode == _hyphyLFConditionMPIIterate) {
+                        long lowerBound  = hmmCatCount?blockLength*currentHMMCat:0,
+                             upperBound  = hmmCatCount?blockLength*(1+currentHMMCat):blockLength,
+                             lowerBound2 = hmmCatCount?(hmmCatSize*blockLength):blockLength;
+
+
+                        for (long r1 = lowerBound, r2 = lowerBound2; r1 < upperBound; r1++,r2++) {
+                            if (siteCorrectors) {
+                                long scv = *siteCorrectors;
+
+                                if (scv < scalers.lData[r1]) { // this class has a _smaller_ scaling factor
+                                    buffer[r1] = currentRateWeight * buffer[r2] + buffer[r1] * acquireScalerMultiplier (scalers.lData[r1] - scv);
+                                    scalers.lData[r1] = scv;
+                                } else {
+                                    if (scv > scalers.lData[r1]) { // this is a _larger_ scaling factor
+                                        buffer[r1] += currentRateWeight * buffer[r2] * acquireScalerMultiplier (scv - scalers.lData[r1]);
+                                    } else { // same scaling factors
+                                        buffer[r1] += currentRateWeight * buffer[r2];
+                                    }
+                                }
+
+                                siteCorrectors++;
+                            } else {
+                                buffer[r1] += currentRateWeight * buffer[r2];
+                            }
+
+                        }
+                    } else { // runMode = _hyphyLFConditionProbsMaxProbClass
+                        for (long r1 = blockLength*2, r2 = blockLength, r3 = 0; r3 < blockLength; r1++,r2++,r3++) {
+                            bool doChange = false;
+                            if (siteCorrectors) {
+                                long scv  = *siteCorrectors,
+                                     diff = scv - scalers.lData[r3];
+
+                                if (diff<0) { // this has a _smaller_ scaling factor
+                                    _Parameter scaled = buffer[r1]*acquireScalerMultiplier (diff);
+                                    if (buffer[r2] > scaled) {
+                                        doChange = true;
+                                    } else {
+                                        buffer[r1] = scaled;
+                                    }
+                                    scalers.lData[r3] = scv;
+                                } else {
+                                    if (diff>0) { // this is a _larger_ scaling factor
+                                        buffer[r2] *= acquireScalerMultiplier (-diff);
+                                    }
+                                    doChange = buffer[r2] > buffer[r1] && ! CheckEqual (buffer[r2],buffer[r1]);
+                                }
+
+                                siteCorrectors++;
+                            } else {
+                                doChange = buffer[r2] > buffer[r1] && ! CheckEqual (buffer[r2],buffer[r1]);
+                            }
+
+                            if (doChange) {
+                                buffer[r1]         = buffer[r2];
+                                buffer[r3]         = useThisPartitonIndex;
+                            }
+                        }
+                    }
+                }
+            }
+#ifdef __HYPHYMPI__
+            if (--mpiTasksSent == 0) {
+                break;
+            }
+#endif
+        }
+    }
+#ifdef __HYPHYMPI__
+    DeleteObject (computedWeights);
+#endif
+    DeleteObject (catWeigths);
+}
+
+//_______________________________________________________________________________________________
+
+void            _LikelihoodFunction::ComputeSiteLikelihoodsForABlock    (long index, _Parameter* results, _SimpleList& scalers, long branchIndex, _SimpleList* branchValues, char mpiRunMode)
+// assumes that results is at least blockLength slots long
+{
+    if (blockDependancies.lData[index]) {
+        PopulateConditionalProbabilities(index, mpiRunMode == _hyphyLFMPIModeREL ?_hyphyLFConditionMPIIterate:_hyphyLFConditionProbsWeightedSum, results, scalers, branchIndex, branchValues);
+    } else {
+        ComputeBlock        (index, results, -1, branchIndex, branchValues);
+        scalers.Clear       ();
+        scalers.Duplicate   (siteCorrections(index));
+    }
+}
+
+//_______________________________________________________________________________________________
+
+_List*   _LikelihoodFunction::RecoverAncestralSequencesMarginal (long index, _Matrix & supportValues, _List& expandedSiteMap, bool doLeaves)
+// index:           which part to process
+// supportValues:   for each internal node and site stores alphabetDimension values for the
+//              :   relative support of each residue at a given site
+//              :   linearized 3D matrix
+//              :   1st - node index (same order as flatTree)
+//              :   2nd - site index (only unique patterns are stored)
+//              :   3rd - the character
+
+// doLeaves     :   compute support values leaves instead of internal nodes
+
+{
+
+    _DataSetFilter* dsf             = (_DataSetFilter*)dataSetFilterList (theDataFilters(index));
+    _TheTree        *blockTree      = (_TheTree*)LocateVar(theTrees.lData[index]);
+
+    long            patternCount                    = dsf->NumberDistinctSites  (),
+                    alphabetDimension                = dsf->GetDimension         (),
+                    unitLength                        = dsf->GetUnitLength        (),
+                    iNodeCount                        = blockTree->GetINodeCount  (),
+                    leafCount                     = blockTree->GetLeafCount   (),
+                    matrixSize                       = doLeaves?leafCount:iNodeCount,
+                    siteCount                        = dsf->GetSiteCount         (),
+                    shiftForTheNode                 = patternCount * alphabetDimension;
+
+    _Parameter      *siteLikelihoods                = new _Parameter [2*patternCount],
+    *siteLikelihoodsSpecState       = new _Parameter [2*patternCount];
+
+    _SimpleList     scalersBaseline,
+                    scalersSpecState,
+                    branchValues,
+                    postToIn;
+
+    blockTree->MapPostOrderToInOderTraversal (postToIn, doLeaves == false);
+    supportValues.Clear                      ();
+    CreateMatrix                             (&supportValues,matrixSize,shiftForTheNode,false,true,false);
+
+    ComputeSiteLikelihoodsForABlock          (index, siteLikelihoods, scalersBaseline);
+    // establish a baseline likelihood for each site
+
+    if (doLeaves) {
+        for                             (long currentChar = 0; currentChar < alphabetDimension; currentChar++) {
+            branchValues.Populate           (patternCount,currentChar,0);
+            for (long branchID = 0; branchID < leafCount; branchID ++) {
+                blockTree->AddBranchToForcedRecomputeList (branchID);
+                long mappedBranchID = postToIn.lData[branchID];
+                ComputeSiteLikelihoodsForABlock (index, siteLikelihoodsSpecState, scalersSpecState,
+                                                 branchID+iNodeCount, &branchValues);
+                for (long siteID = 0; siteID < patternCount; siteID++) {
+                    long scaleDiff = (scalersSpecState.lData[siteID]-scalersBaseline.lData[siteID]);
+                    _Parameter ratio = siteLikelihoodsSpecState[siteID]/siteLikelihoods[siteID];
+
+                    if (scaleDiff > 0) {
+                        ratio *= acquireScalerMultiplier(scaleDiff);
+                    }
+                    supportValues.theData[mappedBranchID*shiftForTheNode + siteID*alphabetDimension + currentChar] = ratio;
+                }
+                blockTree->AddBranchToForcedRecomputeList (branchID);
+            }
+        }
+    }
+
+    else
+        for                             (long currentChar = 0; currentChar < alphabetDimension-1; currentChar++)
+            // the prob for the last char is  (1 - sum (probs other chars))
+        {
+            branchValues.Populate           (patternCount,currentChar,0);
+            for (long branchID = 0; branchID < iNodeCount; branchID ++) {
+                long mappedBranchID = postToIn.lData[branchID];
+                ComputeSiteLikelihoodsForABlock (index, siteLikelihoodsSpecState, scalersSpecState, branchID, &branchValues);
+                for (long siteID = 0; siteID < patternCount; siteID++) {
+                    long scaleDiff = (scalersSpecState.lData[siteID]-scalersBaseline.lData[siteID]);
+                    _Parameter ratio = siteLikelihoodsSpecState[siteID]/siteLikelihoods[siteID];
+                    if (scaleDiff > 0) {
+                        ratio *= acquireScalerMultiplier(scaleDiff);
+                    }
+                    supportValues.theData[mappedBranchID*shiftForTheNode + siteID*alphabetDimension + currentChar] = ratio;
+                }
+                blockTree->AddBranchToForcedRecomputeList (branchID+leafCount);
+            }
+        }
+
+    _SimpleList  conversion;
+    _AVLListXL   conversionAVL (&conversion);
+    _String      codeBuffer    (unitLength, false);
+    _List        *result       = new _List;
+
+    for (long k = 0; k < matrixSize; k++) {
+        result->AppendNewInstance (new _String(siteCount*unitLength,false));
+    }
+
+    for (long siteID = 0; siteID < patternCount; siteID++) {
+        _SimpleList*    patternMap = (_SimpleList*) expandedSiteMap (siteID);
+
+        for  (long nodeID = 0; nodeID < matrixSize ; nodeID++) {
+            long            mappedNodeID = postToIn.lData[nodeID];
+            _Parameter      max_lik     = 0.,
+                            sum         = 0.,
+                            *scores       = supportValues.theData + shiftForTheNode*mappedNodeID +  siteID*alphabetDimension;
+            long            max_idx     = 0;
+
+            for (long charID = 0; charID < alphabetDimension-(!doLeaves); charID ++) {
+                sum+=scores[charID];
+                if (scores[charID] > max_lik) {
+                    max_idx = charID;
+                    max_lik = scores[charID];
+
+                }
+            }
+
+            //if (fabs(scores[alphabetDimension-1]+sum-1.) > 0.1)
+            //  WarnError (_String("Bad monkey!") & scores[alphabetDimension-1] & ":" & (1.-sum) );
+
+            if (doLeaves) {
+                sum = 1./sum;
+                for (long charID = 0; charID < alphabetDimension; charID ++) {
+                    scores [charID] *= sum;
+                    /*if (siteID == 16)
+                        printf ("Site %ld Leaf %ld (%ld) Char %ld = %g\n", siteID, nodeID, mappedNodeID, charID,
+                                supportValues.theData[mappedNodeID*shiftForTheNode + siteID*alphabetDimension + charID]);
+                     */
+
+                }
+            } else {
+                scores[alphabetDimension-1] = 1. - sum;
+
+                if (scores[alphabetDimension-1] > max_lik) {
+                    max_idx = alphabetDimension-1;
+                }
+            }
+
+            dsf->ConvertCodeToLettersBuffered (dsf->CorrectCode(max_idx), unitLength, codeBuffer.sData, &conversionAVL);
+            _String  *sequence   = (_String*) (*result)(mappedNodeID);
+
+            for (long site = 0; site < patternMap->lLength; site++) {
+                //if (patternMap->lData[site] == 119)
+                //  printf ("%ld\n",
+                //          siteID);
+                char* storeHere = sequence->sData + patternMap->lData[site]*unitLength;
+                for (long charS = 0; charS < unitLength; charS ++) {
+                    storeHere[charS] = codeBuffer.sData[charS];
+                }
+            }
+
+        }
+    }
+    delete [] siteLikelihoods;
+    delete [] siteLikelihoodsSpecState;
+    return result;
+}
+
+//__________________________________________________________________________________
+
+_Parameter          _LikelihoodFunction::SumUpHiddenMarkov (const _Parameter * patternLikelihoods, _Matrix& hmm, _Matrix& hmf, _SimpleList * duplicateMap, const _SimpleList* scalers, long bl)
+{
+    long               ni           = hmm.GetHDim(),
+                       mi           = duplicateMap?duplicateMap->lData[duplicateMap->lLength-1]:bl-1,
+                       siteScaler    = duplicateMap?scalers->lData[mi]:((_SimpleList*)((_List*)scalers)->lData[0])->lData[mi];
+
+    _Matrix            temp  (ni,1,false,true),
+                       temp2 (ni,1,false,true);
+
+    _Parameter         correctionFactor = 0; // correction factor
+
+    for (long m=0, mi2 = mi; m<ni; m++,mi2 += bl) {
+        long currentScaler = duplicateMap?scalers->lData[mi2]:((_SimpleList*)((_List*)scalers)->lData[m])->lData[mi];
+        if (currentScaler < siteScaler) { // this class has a _smaller_ scaling factor
+            _Parameter upby = acquireScalerMultiplier (siteScaler - currentScaler);
+            for (long rescale = 0; rescale < m; rescale ++) {
+                temp2.theData[rescale] *= upby;
+            }
+
+            temp2.theData[m] = patternLikelihoods[mi2];
+            siteScaler = currentScaler;
+        } else {
+            if (currentScaler > siteScaler) { // this is a _larger_ scaling factor
+                temp2.theData[m] = patternLikelihoods[mi2]*acquireScalerMultiplier (currentScaler - siteScaler);
+            } else { // same scaling factors
+                temp2.theData[m] = patternLikelihoods[mi2];
+            }
+        }
+    }
+
+    for (long i=duplicateMap?duplicateMap->lLength-2:bl-2; i>=0; i--) {
+        _Parameter max        = 0.;
+        long       siteScaler = duplicateMap?
+                                scalers->lData[duplicateMap->lData[i]]:
+                                ((_SimpleList*)((_List*)scalers)->lData[0])->lData[i];
+
+        for (long k=0; k<ni; k++) {
+            _Parameter scrap = 0.;
+
+            mi    = duplicateMap?duplicateMap->lData[i]:i;
+
+            for (long m=0; m<ni; m++,mi += bl) {
+                long currentScaler = duplicateMap?
+                                     scalers->lData[mi]:
+                                     ((_SimpleList*)((_List*)scalers)->lData[m])->lData[i];
+
+                if (currentScaler < siteScaler) { // this class has a _smaller_ scaling factor
+                    _Parameter upby = acquireScalerMultiplier (siteScaler - currentScaler);
+                    for (long rescale = 0; rescale < k; rescale ++) {
+                        temp.theData[rescale] *= upby;
+                    }
+
+                    scrap = scrap * upby + hmm.theData[k*ni+m] * patternLikelihoods[mi] * temp2.theData[m];
+                    siteScaler = currentScaler;
+                } else {
+                    if (currentScaler > siteScaler) // this is a _larger_ scaling factor
+                        scrap += hmm.theData[k*ni+m] * patternLikelihoods[mi] * temp2.theData[m]
+                                 *acquireScalerMultiplier (currentScaler - siteScaler);
+
+                    else { // same scaling factors
+                        scrap += hmm.theData[k*ni+m] * patternLikelihoods[mi] * temp2.theData[m];
+                    }
+                }
+            }
+
+            temp.theData[k] = scrap;
+
+            if (scrap>max) {
+                max = scrap;
+            }
+        }
+
+        if (max <= 0.0) {
+            return -A_LARGE_NUMBER;
+        }
+
+        correctionFactor -= log (max);
+        if (siteScaler) {
+            correctionFactor -= siteScaler * _logLFScaler;
+        }
+
+        max = 1./max;
+        for (long k=0; k<ni; k++) {
+            temp.theData[k] *= max;
+        }
+
+        _Parameter* swap = temp.theData;
+        temp.theData     = temp2.theData;
+        temp2.theData    = swap;
+    }
+
+    _Parameter scrap = 0.0;
+
+    for (long k=0; k<ni; k++) {
+        scrap += temp2.theData[k] * hmf.theData[k];
+    }
+
+    return myLog(scrap) - correctionFactor;
+}
+
+//__________________________________________________________________________________
+
+void        _LikelihoodFunction::RunViterbi ( _Matrix & result,                 const _Parameter * patternLikelihoods,
+        _Matrix & hmm,                  _Matrix& hmf,
+        _SimpleList * duplicateMap,       const _SimpleList* scalers,
+        long bl )
+{
+    long               ni           = hmm.GetHDim(),
+                       siteCount    = duplicateMap?duplicateMap->lLength:bl;
+
+    _Matrix            temp  (ni,1,false,true),
+                       temp2 (ni,1,false,true);
+
+    _SimpleList        pathRecovery (siteCount * ni, 0, 0);
+
+    if  ((duplicateMap?duplicateMap->lLength:bl) > 1)
+        // non-trivial case (more than one site)
+    {
+        for (long site = siteCount-1; site > 0; site --) {
+            for (long parentState = 0; parentState < ni; parentState ++) {
+                long            bestState     = 0,
+                                mi            = duplicateMap?
+                                                duplicateMap->lData[site]:
+                                                site,
+
+                                                currentScaler = duplicateMap?
+                                                        scalers->lData[mi]:
+                                                        ((_SimpleList*)((_List*)scalers)->lData[0])->lData[site];
+
+
+                _Parameter      bestValue = log(patternLikelihoods[mi]*hmm.theData[parentState*ni]) + temp.theData[0];
+                mi           += bl;
+
+                if (currentScaler) {
+                    bestValue -= currentScaler * _logLFScaler;
+                }
+
+                for (long currentState = 1; currentState < ni; currentState ++, mi += bl) {
+                    currentScaler = duplicateMap?
+                                    scalers->lData[mi]:
+                                    ((_SimpleList*)((_List*)scalers)->lData[currentState])->lData[site];
+
+                    _Parameter      currentValue = log(patternLikelihoods[mi]*hmm.theData[parentState*ni + currentState]) +
+                                                   temp.theData[currentState];
+                    if (currentScaler) {
+                        currentValue -= currentScaler * _logLFScaler;
+                    }
+
+                    if (currentValue > bestValue) {
+                        bestValue = currentValue;
+                        bestState = currentState;
+                    }
+                }
+                temp2.theData[parentState] = bestValue;
+                pathRecovery.lData[site*ni + parentState] = bestState;
+                //if (parentState != bestState && parentState == 1)
+                //  printf ("%d %d -> %d\n", site, parentState, bestState);
+            }
+            _Parameter* swap = temp.theData;
+            temp.theData     = temp2.theData;
+            temp2.theData    = swap;
+        }
+    } else {
+        for (long parentState = 0; parentState < ni; parentState ++) {
+            temp.theData[parentState] = log(patternLikelihoods[parentState]) +
+                                        (duplicateMap?scalers->lData[parentState]:((_SimpleList*)((_List*)scalers)->lData[parentState])->lData[0])*_logLFScaler;
+        }
+    }
+
+    long            mi        = duplicateMap?duplicateMap->lData[0]:0,
+                    bestState = 0;
+
+    _Parameter      bestValue     = log(patternLikelihoods [mi]*hmf.theData[0]) + temp.theData[0] +
+                                    (duplicateMap?scalers->lData[mi]:((_SimpleList*)((_List*)scalers)->lData[0])->lData[0])*_logLFScaler;
+
+    mi+=bl;
+
+
+    for (long initState = 1; initState < ni; initState ++, mi += bl) {
+        long currentScaler = duplicateMap?scalers->lData[mi]:((_SimpleList*)((_List*)scalers)->lData[initState])->lData[0];
+
+        _Parameter      currentValue = log(patternLikelihoods[mi]*hmf.theData[initState]) +
+                                       temp.theData[initState];
+        if (currentScaler) {
+            currentValue -= currentScaler * _logLFScaler;
+        }
+
+        if (currentValue > bestValue) {
+            bestValue = currentValue;
+            bestState = initState;
+        }
+    }
+
+    result.theData[0] = bestState;
+
+    for (long site = 1; site < siteCount; site++) {
+        result.theData[site] = pathRecovery.lData[site*ni + (long)result.theData[site-1]];
+        //printf ("%d: (%g) 0-%ld 1-%ld\n",  site,result.theData[site-1], pathRecovery.lData[site*ni], pathRecovery.lData[site*ni+1]);
+    }
+
+}
+
+//_______________________________________________________________________________________________
+
+
+_Parameter mapParameterToInverval (_Parameter in, char type, bool inverse)
+{
+    switch (type) {
+    case _hyphyIntervalMapExpit:
+        if (inverse) {
+            //return log (in / (1-in));
+            return tan (M_PI * (in - 0.5));
+        } else {
+            //return 1. / (1. + exp(-in));
+            return atan (in) * M_1_PI + 0.5;
+        }
+        break;
+    case _hyphyIntervalMapSqueeze:
+        if (inverse) {
+            return in/(1.-in);
+        } else {
+            return in/(1.+in);
+        }
+        break;
+
+    }
+    return in;
+}
+
+//_______________________________________________________________________________________________
+
+void _LikelihoodFunction::SetupParameterMapping (void)
+{
+    parameterTransformationFunction.Clear();
+    parameterValuesAndRanges = new _Matrix (indexInd.lLength, 4, false, true);
+    checkParameter(addLFSmoothing, smoothingTerm, 0.0);
+    checkParameter(reduceLFSmoothing, smoothingReduction, 0.8);
+    if (smoothingPenalty < 0.0) {
+      smoothingPenalty = 0.0;
+    }
+    if (smoothingReduction <= 0.0 || smoothingReduction >= 1.0) {
+      smoothingReduction = 0.8;
+    }
+    
+
+    for (unsigned long pIndex = 0; pIndex < indexInd.lLength; pIndex++) {
+        _Variable* cv        = GetIthIndependentVar(pIndex);
+        _Parameter thisLB    = cv->GetLowerBound(),
+                   thisUB    = cv->GetUpperBound(),
+                   thisValue = cv->Compute()->Value();
+
+        //parameterTransformationFunction << _hyphyIntervalMapID;
+        if (thisLB >= 0.0 && thisUB <= 1.0) {
+            parameterTransformationFunction << _hyphyIntervalMapID;
+        } else if (thisLB >=0.0) {
+            parameterTransformationFunction << _hyphyIntervalMapSqueeze;
+        } else {
+            parameterTransformationFunction << _hyphyIntervalMapExpit;
+        }
+
+
+        parameterValuesAndRanges->Store(pIndex,0,thisValue);
+        parameterValuesAndRanges->Store(pIndex,1,mapParameterToInverval(thisValue,parameterTransformationFunction.Element(-1),false));
+        parameterValuesAndRanges->Store(pIndex,2,mapParameterToInverval(thisLB,parameterTransformationFunction.Element(-1),false));
+        parameterValuesAndRanges->Store(pIndex,3,mapParameterToInverval(thisUB,parameterTransformationFunction.Element(-1),false));
+    }
+
+}
+
+//_______________________________________________________________________________________________
+
+void _LikelihoodFunction::CleanupParameterMapping (void)
+{
+    smoothingPenalty = 0.0;
+    smoothingTerm    = 0.0;
+    DeleteObject (parameterValuesAndRanges);
+    parameterValuesAndRanges = nil;
+    parameterTransformationFunction.Clear();
+}
+
+
+
+//_______________________________________________________________________________________________
+
+_Parameter _LikelihoodFunction::SumUpSiteLikelihoods (long index, const _Parameter * patternLikelihoods, const _SimpleList& patternScalers)
+/*
+ compute the likelihood of a partition (index), corrected for scaling,
+ by summing pattern likelihoods from patternLikelihoods, weighted by pattern frequencies
+ and corrected for scaling factors from patternScalers
+*/
+{
+
+    _Parameter       logL             = 0.;
+    _SimpleList      *catVarType      = (_SimpleList*)((*(_List*)categoryTraversalTemplate(index))(4));
+    long             cumulativeScaler = 0,
+                     categoryType     = catVarType->Element (-1);
+
+    _SimpleList     * patternFrequencies = &((_DataSetFilter*)dataSetFilterList (theDataFilters(index)))->theFrequencies;
+
+    // check to see if we need to handle HMM or COP variables
+    if (categoryType & _hyphyCategoryHMM) {
+        _CategoryVariable*hmmVar = (_CategoryVariable*)((*(_List*)(*(_List*)categoryTraversalTemplate(index))(0))(0));
+        _Matrix          *hmm    = hmmVar->ComputeHiddenMarkov(),
+                          *hmf    = hmmVar->ComputeHiddenMarkovFreqs();
+
+        _SimpleList      *dmap   = &((_DataSetFilter*)dataSetFilterList (theDataFilters(index)))->duplicateMap;
+
+        return           SumUpHiddenMarkov (patternLikelihoods,
+                                            *hmm,
+                                            *hmf,
+                                            dmap,
+                                            &patternScalers,
+                                            patternFrequencies->lLength
+                                           );
+    } else {
+        if (categoryType & _hyphyCategoryCOP) {
+            WarnError ("Constant-on-partition categories are currently not supported by the evaluation engine");
+        } else // simple sum clause
+
+        {
+            for              (long patternID = 0; patternID < patternFrequencies->lLength; patternID++) {
+                long patternFrequency = patternFrequencies->lData[patternID];
+                if (patternFrequency > 1) {
+                    logL             += myLog(patternLikelihoods[patternID])*patternFrequency;
+                    cumulativeScaler += patternScalers.lData[patternID]*patternFrequency;
+                } else
+                    // all this to avoid a double*long multiplication
+                {
+                    logL             += myLog(patternLikelihoods[patternID]);
+                    cumulativeScaler += patternScalers.lData[patternID];
+                }
+            }
+        }
+    }
+
+    return logL - cumulativeScaler * _logLFScaler;
+
+}
+
+//_______________________________________________________________________________________________
+// return the AVL with parameters
+// AVL will have the following entries
+// "Categories"
+// "Global Independent"
+// "Global Constrained"
+// "Local Independent"
+// "Local Constrained"
+// "Trees"
+// "Models"
+// "Base frequencies"
+// "Datafilters"
+// "Compute Template"
+
+_AssociativeList* _LikelihoodFunction::CollectLFAttributes (void)
+{
+    _AssociativeList * resList = new _AssociativeList;
+
+    _SimpleList         *vl,
+                        list1;
+
+    _List               modelList;
+
+    InsertVarIDsInList (resList, "Categories", GetCategoryVars ());
+
+    SplitVariableIDsIntoLocalAndGlobal (GetIndependentVars (), modelList);
+    InsertVarIDsInList (resList, "Global Independent", *(_SimpleList*)modelList(0));
+    InsertVarIDsInList (resList, "Local Independent",   *(_SimpleList*)modelList(1));
+
+    SplitVariableIDsIntoLocalAndGlobal (GetDependentVars (), modelList);
+    InsertVarIDsInList (resList, "Global Constrained", *(_SimpleList*)modelList(0));
+    InsertVarIDsInList (resList, "Local Constrained",   *(_SimpleList*)modelList(1));
+
+
+    list1.Clear();
+    vl = &GetTheTrees ();
+    modelList.Clear();
+
+    for (long n=0; n<vl->lLength; n++) {
+        list1 << vl->lData[n];
+        _SimpleList partModels;
+        ((_TheTree*)FetchVar (vl->lData[n]))->CompileListOfModels(partModels);
+        if (partModels.lLength == 1) {
+            modelList << modelNames (partModels.lData[0]);
+        } else {
+            modelList.AppendNewInstance(new _String ("__MULTIPLE__"));
+        }
+    }
+    InsertVarIDsInList (resList, "Trees", list1);
+
+
+    list1.Clear();
+    vl = &GetTheFilters ();
+    for (long p=0; p<vl->lLength; p++) {
+        list1 << vl->lData[p];
+    }
+
+    InsertStringListIntoAVL (resList, "Datafilters", list1, dataSetFilterNamesList);
+    InsertVarIDsInList (resList, "Base frequencies", GetBaseFreqs());
+    {
+        _SimpleList indexer         (modelList.lLength,0,1);
+        InsertStringListIntoAVL     (resList, "Models", indexer, modelList);
+    }
+
+    _Formula        *computeT = HasComputingTemplate();
+    resList->MStore (_String("Compute Template"), new _FString((_String*)(computeT?computeT->toStr():new _String)), false);
+
+    return resList;
+}
+
+//_______________________________________________________________________________________________
+
+void _LikelihoodFunction::UpdateBlockResult (long index, _Parameter new_value)
+{
+    if (computationalResults.GetUsed()>index) {
+        computationalResults.theData[index] = new_value;
+    } else {
+        computationalResults.Store(new_value);
+    }
+}
+
+
+
+//_______________________________________________________________________________________________
+#ifdef __HYPHYMPI__
+long RetrieveMPICount (char)
+{
+    int size;
+    MPI_Comm_size(MPI_COMM_WORLD, &size);
+    return size;
+}
+
+void MPISwitchNodesToMPIMode (long totalNodeCount)
+{
+    _String message = mpiLoopSwitchToOptimize & hyphyMPIOptimizerMode;
+
+    // send a context switch signal
+    for (long ni = 1; ni <= totalNodeCount; ni++) {
+        MPISendString (message, ni);
+    }
+    // receive confirmation of successful switch
+    for (long ni = 1; ni <= totalNodeCount; ni++) {
+        long fromNode = ni;
+        _String t (MPIRecvString (ni,fromNode));
+        if (!t.Equal (&mpiLoopSwitchToOptimize)) {
+            WarnError (_String("[MPI] Failed to confirm MPI mode switch at node ") & ni);
+            return;
+        } else {
+            ReportWarning (_String("[MPI] Successful mode switch to mode ") & hyphyMPIOptimizerMode & " confirmed from node " & ni);
+        }
+    }
+}
+
+#endif
+#endif
diff --git a/src/core/likefuncocl.cpp b/src/core/likefuncocl.cpp
new file mode 100644
index 0000000..b93872d
--- /dev/null
+++ b/src/core/likefuncocl.cpp
@@ -0,0 +1,1158 @@
+/*
+ 
+ HyPhy - Hypothesis Testing Using Phylogenies.
+ 
+ Copyright (C) 1997-now
+ Core Developers:
+ Sergei L Kosakovsky Pond (spond at ucsd.edu)
+ Art FY Poon    (apoon at cfenet.ubc.ca)
+ Steven Weaver (sweaver at ucsd.edu)
+ 
+ Module Developers:
+ Lance Hepler (nlhepler at gmail.com)
+ Martin Smith (martin.audacis at gmail.com)
+ 
+ Significant contributions from:
+ Spencer V Muse (muse at stat.ncsu.edu)
+ Simon DW Frost (sdf22 at cam.ac.uk)
+ 
+ Permission is hereby granted, free of charge, to any person obtaining a
+ copy of this software and associated documentation files (the
+ "Software"), to deal in the Software without restriction, including
+ without limitation the rights to use, copy, modify, merge, publish,
+ distribute, sublicense, and/or sell copies of the Software, and to
+ permit persons to whom the Software is furnished to do so, subject to
+ the following conditions:
+ 
+ The above copyright notice and this permission notice shall be included
+ in all copies or substantial portions of the Software.
+ 
+ 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.
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ 
+ */
+
+// *********************************************************************
+// OpenCL likelihood function Notes:
+//
+// Runs computations with OpenCL on the GPU device and then checks results
+// against basic host CPU/C++ computation.
+//
+//
+// *********************************************************************
+
+#ifdef MDSOCL
+
+#include <string>
+#include <stdio.h>
+#include <assert.h>
+#include <sys/sysctl.h>
+#include <sys/stat.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <time.h>
+#include <math.h>
+#include "calcnode.h"
+
+#include "opencl_kernels.h"
+
+//#define FLOAT
+//#define OCLVERBOSE
+
+#if defined(__APPLE__)
+#include <OpenCL/OpenCL.h>
+typedef float fpoint;
+typedef cl_float clfp;
+#define FLOATPREC "typedef float fpoint; \n"
+//#define PRAGMADEF "#pragma OPENCL EXTENSION cl_khr_fp64: enable \n"
+#define PRAGMADEF " \n"
+//#pragma OPENCL EXTENSION cl_khr_fp64: enable
+#elif defined(NVIDIA)
+#define __GPUResults__
+#define __OCLPOSIX__
+#include <oclUtils.h>
+typedef double fpoint;
+typedef cl_double clfp;
+#define FLOATPREC "typedef double fpoint; \n"
+#define PRAGMADEF "#pragma OPENCL EXTENSION cl_khr_fp64: enable \n"
+#pragma OPENCL EXTENSION cl_khr_fp64: enable
+#elif defined(AMD)
+#define __GPUResults__
+#define __OCLPOSIX__
+#include <CL/opencl.h>
+typedef double fpoint;
+typedef cl_double clfp;
+#define FLOATPREC "typedef double fpoint; \n"
+#define PRAGMADEF "#pragma OPENCL EXTENSION cl_amd_fp64: enable \n"
+#pragma OPENCL EXTENSION cl_amd_fp64: enable
+#elif defined(FLOAT)
+#include <CL/opencl.h>
+typedef float fpoint;
+typedef cl_float clfp;
+#define FLOATPREC "typedef float fpoint; \n"
+#define PRAGMADEF " \n"
+#endif
+
+//#define __VERBOSE__
+#define OCLGPU
+#ifdef OCLGPU
+#define OCLTARGET " #define BLOCK_SIZE 16 \n"
+#else
+#define OCLTARGET " #define BLOCK_SIZE 1 \n"
+#endif
+
+#ifdef __GPUResults__
+#define OCLGPUResults " #define __GPUResults__ \n"
+#else
+#define OCLGPUResults " \n"
+#endif
+
+
+// #define MIN(a,b) ((a)>(b)?(b):(a))
+
+// time stuff:
+#define BILLION 1E9
+struct timespec mainStart, mainEnd, bufferStart, bufferEnd, queueStart, queueEnd, setupStart, setupEnd;
+double mainSecs;
+double buffSecs;
+double queueSecs;
+double setupSecs;
+
+bool clean;
+
+cl_context cxGPUContext;        // OpenCL context
+cl_command_queue cqCommandQueue;// OpenCL command que
+cl_platform_id cpPlatform;      // OpenCL platform
+cl_device_id cdDevice;          // OpenCL device
+cl_program cpMLProgram;
+cl_program cpLeafProgram;
+cl_program cpInternalProgram;
+cl_program cpAmbigProgram;
+cl_program cpResultProgram;
+cl_kernel ckLeafKernel;
+cl_kernel ckInternalKernel;
+cl_kernel ckAmbigKernel;
+cl_kernel ckResultKernel;
+cl_kernel ckReductionKernel;
+size_t szGlobalWorkSize[2];        // 1D var for Total # of work items
+size_t szLocalWorkSize[2];         // 1D var for # of work items in the work group
+size_t localMemorySize;         // size of local memory buffer for kernel scratch
+size_t szParmDataBytes;         // Byte size of context information
+size_t szKernelLength;          // Byte size of kernel code
+cl_int ciErr1, ciErr2;          // Error code var
+
+cl_mem cmNode_cache;
+cl_mem cmModel_cache;
+cl_mem cmNodRes_cache;
+cl_mem cmNodFlag_cache;
+cl_mem cmroot_cache;
+cl_mem cmroot_scalings;
+cl_mem cmScalings_cache;
+cl_mem cmFreq_cache;
+cl_mem cmProb_cache;
+cl_mem cmResult_cache;
+long siteCount, alphabetDimension;
+long* lNodeFlags;
+_SimpleList     updateNodes,
+                flatParents,
+                flatNodes,
+                flatCLeaves,
+                flatLeaves,
+                flatTree,
+                theFrequencies;
+_Parameter      *iNodeCache,
+                *theProbs;
+_SimpleList taggedInternals;
+_GrowingVector* lNodeResolutions;
+float scalar;
+
+void *node_cache, *nodRes_cache, *nodFlag_cache, *scalings_cache, *prob_cache, *freq_cache, *root_cache, *result_cache, *root_scalings, *model;
+
+void _OCLEvaluator::init(   long esiteCount,
+                                    long ealphabetDimension,
+                                    _Parameter* eiNodeCache)
+{
+    clean = false;
+    contextSet = false;
+    siteCount = esiteCount;
+    alphabetDimension = ealphabetDimension;
+    iNodeCache = eiNodeCache;
+    mainSecs = 0.0;
+    buffSecs = 0.0;
+    queueSecs = 0.0;
+    setupSecs = 0.0;
+    scalar = 10.0;
+}
+
+// So the two interfacing functions will be the constructor, called in SetupLFCaches, and launchmdsocl, called in ComputeBlock.
+// Therefore all of these functions need to be finished, the context needs to be setup separately from the execution, the data needs
+// to be passed piecewise, and a pointer needs to be passed around in likefunc2.cpp. After that things should be going a bit faster,
+// though honestly this solution is geared towards analyses with a larger number of sites.
+
+// *********************************************************************
+int _OCLEvaluator::setupContext(void)
+{
+#ifdef __OCLPOSIX__
+    clock_gettime(CLOCK_MONOTONIC, &setupStart);
+#endif
+    //printf("Made it to the oclmain() function!\n");
+
+    //long nodeResCount = sizeof(lNodeResolutions->theData)/sizeof(lNodeResolutions->theData[0]);
+    long nodeFlagCount = flatLeaves.lLength*siteCount;
+    long nodeResCount = lNodeResolutions->GetUsed();
+    int roundCharacters = roundUpToNextPowerOfTwo(alphabetDimension);
+//    long nodeCount = flatLeaves.lLength + flatNodes.lLength + 1;
+//    long iNodeCount = flatNodes.lLength + 1;
+
+    bool ambiguousNodes = true;
+    if (nodeResCount == 0)
+    {
+        nodeResCount++;
+        ambiguousNodes = false;
+    }
+
+    //printf("Got the sizes of nodeRes and nodeFlag: %i, %i\n", nodeResCount, nodeFlagCount);
+
+    // Make transitionMatrixArray, do other host stuff:
+    node_cache      = (void*)malloc(sizeof(cl_float)*roundCharacters*siteCount*(flatNodes.lLength));
+    nodRes_cache    = (void*)malloc(sizeof(cl_float)*roundUpToNextPowerOfTwo(nodeResCount));
+    nodFlag_cache   = (void*)malloc(sizeof(cl_long)*roundUpToNextPowerOfTwo(nodeFlagCount));
+    scalings_cache  = (void*)malloc(sizeof(cl_int)*roundCharacters*siteCount*(flatNodes.lLength));
+    prob_cache      = (void*)malloc(sizeof(cl_float)*roundCharacters);
+    freq_cache      = (void*)malloc(sizeof(cl_int)*siteCount);
+    freq_cache      = (void*)malloc(sizeof(cl_int)*siteCount);
+    root_cache      = (void*)malloc(sizeof(cl_float)*siteCount*roundCharacters);
+    root_scalings   = (void*)malloc(sizeof(cl_int)*siteCount*roundCharacters);
+/*
+#ifdef __GPUResults__
+    result_cache    = (void*)malloc(sizeof(cl_double)*roundUpToNextPowerOfTwo(siteCount));
+#else
+    result_cache    = (void*)malloc(sizeof(cl_float)*roundUpToNextPowerOfTwo(siteCount));
+#endif
+*/
+    result_cache    = (void*)malloc(sizeof(clfp)*roundUpToNextPowerOfTwo(siteCount));
+    model           = (void*)malloc(sizeof(cl_float)*roundCharacters*roundCharacters*(flatParents.lLength-1));
+
+    //printf("Allocated all of the arrays!\n");
+    //printf("setup the model, fixed tagged internals!\n");
+    printf("flatleaves: %ld\n", flatLeaves.lLength);
+    printf("flatParents: %ld\n", flatParents.lLength);
+    //printf("flatCleaves: %i\n", flatCLeaves.lLength);
+    printf("flatNodes: %ld\n", flatNodes.lLength);
+    printf("updateNodes: %ld\n", updateNodes.lLength);
+    printf("flatTree: %ld\n", flatTree.lLength);
+    //printf("nodeFlagCount: %i\n", nodeFlagCount);
+    //printf("nodeResCount: %i\n", nodeResCount);
+
+    //for (int i = 0; i < nodeCount*siteCount*alphabetDimension; i++)
+    printf("siteCount: %ld, alphabetDimension: %ld \n", siteCount, alphabetDimension);
+    if (ambiguousNodes)
+        for (int i = 0; i < nodeResCount; i++)
+            ((float*)nodRes_cache)[i] = (float)(lNodeResolutions->theData[i]);
+    for (int i = 0; i < nodeFlagCount; i++)
+        ((long*)nodFlag_cache)[i] = lNodeFlags[i];
+    for (int i = 0; i < siteCount; i++)
+        ((int*)freq_cache)[i] = theFrequencies[i];
+    for (int i = 0; i < alphabetDimension; i++)
+        ((float*)prob_cache)[i] = theProbs[i];
+
+    //printf("Created all of the arrays!\n");
+
+    // alright, by now taggedInternals have been taken care of, and model has
+    // been filled with all of the transition matrices.
+
+#ifdef __OCLPOSIX__
+    clock_gettime(CLOCK_MONOTONIC, &setupEnd);
+    setupSecs += (setupEnd.tv_sec - setupStart.tv_sec)+(setupEnd.tv_nsec - setupStart.tv_nsec)/BILLION;
+#endif
+
+
+
+    //**************************************************
+
+    //Get an OpenCL platform
+    ciErr1 = clGetPlatformIDs(1, &cpPlatform, NULL);
+
+//    printf("clGetPlatformID...\n");
+    if (ciErr1 != CL_SUCCESS)
+    {
+        printf("Error in clGetPlatformID, Line %u in file %s !!!\n\n", __LINE__, __FILE__);
+        Cleanup(EXIT_FAILURE);
+    }
+
+
+    //Get the devices
+#ifdef OCLGPU
+    ciErr1 = clGetDeviceIDs(cpPlatform, CL_DEVICE_TYPE_GPU, 1, &cdDevice, NULL);
+#else
+    ciErr1 = clGetDeviceIDs(cpPlatform, CL_DEVICE_TYPE_CPU, 1, &cdDevice, NULL);
+#endif
+ //   printf("clGetDeviceIDs...\n");
+    if (ciErr1 != CL_SUCCESS)
+    {
+        printf("Error in clGetDeviceIDs, Line %u in file %s !!!\n\n", __LINE__, __FILE__);
+        Cleanup(EXIT_FAILURE);
+    }
+
+    size_t maxWorkGroupSize;
+    ciErr1 = clGetDeviceInfo(cdDevice, CL_DEVICE_MAX_WORK_GROUP_SIZE,
+                             sizeof(size_t), &maxWorkGroupSize, NULL);
+    if (ciErr1 != CL_SUCCESS)
+    {
+        printf("Getting max work group size failed!\n");
+    }
+    printf("Max work group size: %lu\n", (unsigned long)maxWorkGroupSize);
+
+    size_t maxLocalSize;
+    ciErr1 = clGetDeviceInfo(cdDevice, CL_DEVICE_LOCAL_MEM_SIZE,
+                             sizeof(size_t), &maxLocalSize, NULL);
+    size_t maxConstSize;
+    ciErr1 = clGetDeviceInfo(cdDevice, CL_DEVICE_MAX_CONSTANT_BUFFER_SIZE,
+                             sizeof(size_t), &maxConstSize, NULL);
+    printf("LocalSize: %ld, Const size: %ld\n", (long unsigned) maxLocalSize, (long unsigned) maxConstSize);
+
+    printf("sites: %ld\n", siteCount);
+
+    // set and log Global and Local work size dimensions
+
+#ifdef OCLGPU
+    szLocalWorkSize[0] = 16; // All of these will have to be generalized.
+    szLocalWorkSize[1] = 16;
+#else
+    szLocalWorkSize[0] = 1; // All of these will have to be generalized.
+    szLocalWorkSize[1] = 1;
+#endif
+    szGlobalWorkSize[0] = 64;
+    //szGlobalWorkSize[1] = ((siteCount + 16)/16)*16;
+    szGlobalWorkSize[1] = roundUpToNextPowerOfTwo(siteCount);
+    //szGlobalWorkSize[1] = roundUpToNextPowerOfTwo(siteCount);
+    printf("Global Work Size \t\t= %ld, %ld\nLocal Work Size \t\t= %ld, %ld\n# of Work Groups \t\t= %ld\n\n",
+           (long unsigned) szGlobalWorkSize[0],
+           (long unsigned) szGlobalWorkSize[1],
+           (long unsigned) szLocalWorkSize[0],
+           (long unsigned) szLocalWorkSize[1],
+           (long unsigned) ((szGlobalWorkSize[0]*szGlobalWorkSize[1])/(szLocalWorkSize[0]*szLocalWorkSize[1])));
+
+
+    size_t returned_size = 0;
+    cl_char vendor_name[1024] = {0};
+    cl_char device_name[1024] = {0};
+    ciErr1 = clGetDeviceInfo(cdDevice, CL_DEVICE_VENDOR, sizeof(vendor_name),
+                             vendor_name, &returned_size);
+    ciErr1 |= clGetDeviceInfo(cdDevice, CL_DEVICE_NAME, sizeof(device_name),
+                              device_name, &returned_size);
+    assert(ciErr1 == CL_SUCCESS);
+//    printf("Connecting to %s %s...\n", vendor_name, device_name);
+
+    //Create the context
+    cxGPUContext = clCreateContext(0, 1, &cdDevice, NULL, NULL, &ciErr1);
+//    printf("clCreateContext...\n");
+    if (ciErr1 != CL_SUCCESS)
+    {
+        printf("Error in clCreateContext, Line %u in file %s !!!\n\n", __LINE__, __FILE__);
+        Cleanup(EXIT_FAILURE);
+    }
+
+    // Create a command-queue
+    cqCommandQueue = clCreateCommandQueue(cxGPUContext, cdDevice, 0, &ciErr1);
+//    printf("clCreateCommandQueue...\n");
+    if (ciErr1 != CL_SUCCESS)
+    {
+        printf("Error in clCreateCommandQueue, Line %u in file %s !!!\n\n", __LINE__, __FILE__);
+        Cleanup(EXIT_FAILURE);
+    }
+
+
+    printf("Setup all of the OpenCL stuff!\n");
+
+    // Allocate the OpenCL buffer memory objects for the input and output on the
+    // device GMEM
+    cmNode_cache = clCreateBuffer(cxGPUContext, CL_MEM_READ_WRITE | CL_MEM_USE_HOST_PTR,
+                    sizeof(cl_float)*roundCharacters*siteCount*(flatNodes.lLength), node_cache,
+                    &ciErr1);
+    cmModel_cache = clCreateBuffer(cxGPUContext, CL_MEM_READ_ONLY,
+                    sizeof(cl_float)*roundCharacters*roundCharacters*(flatParents.lLength-1),
+                    NULL, &ciErr2);
+    ciErr1 |= ciErr2;
+    cmScalings_cache = clCreateBuffer(cxGPUContext, CL_MEM_READ_WRITE | CL_MEM_USE_HOST_PTR,
+                    sizeof(cl_int)*roundCharacters*siteCount*flatNodes.lLength, scalings_cache, &ciErr2);
+    ciErr1 |= ciErr2;
+    cmNodRes_cache = clCreateBuffer(cxGPUContext, CL_MEM_READ_ONLY | CL_MEM_USE_HOST_PTR,
+                    sizeof(cl_float)*roundUpToNextPowerOfTwo(nodeResCount), nodRes_cache, &ciErr2);
+    ciErr1 |= ciErr2;
+    cmNodFlag_cache = clCreateBuffer(cxGPUContext, CL_MEM_READ_ONLY | CL_MEM_USE_HOST_PTR,
+                    sizeof(cl_long)*roundUpToNextPowerOfTwo(nodeFlagCount), nodFlag_cache, &ciErr2);
+    ciErr1 |= ciErr2;
+    cmroot_cache = clCreateBuffer(cxGPUContext, CL_MEM_READ_WRITE,
+                    sizeof(cl_float)*siteCount*roundCharacters, NULL, &ciErr2);
+    ciErr1 |= ciErr2;
+    cmroot_scalings = clCreateBuffer(cxGPUContext, CL_MEM_READ_WRITE,
+                    sizeof(cl_int)*siteCount*roundCharacters, NULL, &ciErr2);
+    ciErr1 |= ciErr2;
+    cmProb_cache = clCreateBuffer(cxGPUContext, CL_MEM_READ_ONLY | CL_MEM_USE_HOST_PTR,
+                    sizeof(cl_float)*roundCharacters, prob_cache, &ciErr2);
+    ciErr1 |= ciErr2;
+    cmFreq_cache = clCreateBuffer(cxGPUContext, CL_MEM_READ_ONLY,
+                    sizeof(cl_float)*siteCount, NULL, &ciErr2);
+    ciErr1 |= ciErr2;
+    //cmResult_cache = clCreateBuffer(cxGPUContext, CL_MEM_WRITE_ONLY,
+     //               sizeof(cl_float)*siteCount, NULL, &ciErr2);
+/*
+#ifdef __GPUResults__
+    cmResult_cache = clCreateBuffer(cxGPUContext, CL_MEM_WRITE_ONLY,
+                    sizeof(cl_double)*roundUpToNextPowerOfTwo(siteCount), NULL, &ciErr2);
+#else
+    cmResult_cache = clCreateBuffer(cxGPUContext, CL_MEM_WRITE_ONLY,
+                    sizeof(cl_float)*roundUpToNextPowerOfTwo(siteCount), NULL, &ciErr2);
+#endif
+*/
+    cmResult_cache = clCreateBuffer(cxGPUContext, CL_MEM_WRITE_ONLY,
+                    sizeof(clfp)*roundUpToNextPowerOfTwo(siteCount), NULL, &ciErr2);
+    ciErr1 |= ciErr2;
+//    printf("clCreateBuffer...\n");
+    if (ciErr1 != CL_SUCCESS)
+    {
+        printf("Error in clCreateBuffer, Line %u in file %s !!!\n\n", __LINE__, __FILE__);
+        switch(ciErr1)
+        {
+            case   CL_INVALID_CONTEXT: printf("CL_INVALID_CONTEXT\n"); break;
+            case   CL_INVALID_VALUE: printf("CL_INVALID_VALUE\n"); break;
+            case   CL_INVALID_BUFFER_SIZE: printf("CL_INVALID_BUFFER_SIZE\n"); break;
+            case   CL_MEM_OBJECT_ALLOCATION_FAILURE: printf("CL_MEM_OBJECT_ALLOCATION_FAILURE\n"); break;
+            case   CL_OUT_OF_HOST_MEMORY: printf("CL_OUT_OF_HOST_MEMORY\n"); break;
+            default: printf("Strange error\n");
+        }
+        Cleanup(EXIT_FAILURE);
+    }
+
+
+#ifdef __OCLPOSIX__
+    clock_gettime(CLOCK_MONOTONIC, &setupStart);
+#endif
+/*
+    for (int i = 0; i < siteCount*roundCharacters; i++)
+    {
+        (root_cache)[i] = 0.0;
+        (root_scalings)[i] = 1;
+    }
+*/
+#ifdef __OCLPOSIX__
+    clock_gettime(CLOCK_MONOTONIC, &setupEnd);
+    setupSecs += (setupEnd.tv_sec - setupStart.tv_sec)+(setupEnd.tv_nsec - setupStart.tv_nsec)/BILLION;
+#endif
+
+    printf("Made all of the buffers on the device!\n");
+
+//    printf("clCreateBuffer...\n");
+    if (ciErr1 != CL_SUCCESS)
+    {
+        printf("Error in clCreateBuffer, Line %u in file %s !!!\n\n", __LINE__, __FILE__);
+        Cleanup(EXIT_FAILURE);
+    }
+
+    //  "" FLOATPREC
+    // Create the program
+    const char * program_source = "" OCLTARGET PRAGMADEF FLOATPREC OCLGPUResults KERNEL_STRING;
+
+// TODO: result_cache size can be reduced to siteCount/BLOCK_SIZE
+    cpMLProgram = clCreateProgramWithSource(cxGPUContext, 1, &program_source,
+                                          NULL, &ciErr1);
+    if (ciErr1 != CL_SUCCESS)
+    {
+        printf("Error in clCreateProgramWithSource, Line %u in file %s !!!\n\n", __LINE__, __FILE__);
+        Cleanup(EXIT_FAILURE);
+    }
+
+    ciErr1 = clBuildProgram(cpMLProgram, 1, &cdDevice, "-cl-mad-enable -cl-fast-relaxed-math", NULL, NULL);
+    //ciErr1 = clBuildProgram(cpMLProgram, 1, &cdDevice, NULL, NULL, NULL);
+    if (ciErr1 != CL_SUCCESS)
+    {
+        printf("%i\n", ciErr1); //prints "1"
+        switch(ciErr1)
+        {
+            case   CL_INVALID_PROGRAM: printf("CL_INVALID_PROGRAM\n"); break;
+            case   CL_INVALID_VALUE: printf("CL_INVALID_VALUE\n"); break;
+            case   CL_INVALID_DEVICE: printf("CL_INVALID_DEVICE\n"); break;
+            case   CL_INVALID_BINARY: printf("CL_INVALID_BINARY\n"); break;
+            case   CL_INVALID_BUILD_OPTIONS: printf("CL_INVALID_BUILD_OPTIONS\n"); break;
+            case   CL_COMPILER_NOT_AVAILABLE: printf("CL_COMPILER_NOT_AVAILABLE\n"); break;
+            case   CL_BUILD_PROGRAM_FAILURE: printf("CL_BUILD_PROGRAM_FAILURE\n"); break;
+            case   CL_INVALID_OPERATION: printf("CL_INVALID_OPERATION\n"); break;
+            case   CL_OUT_OF_HOST_MEMORY: printf("CL_OUT_OF_HOST_MEMORY\n"); break;
+            default: printf("Strange error\n"); //This is printed
+        }
+        printf("Error in clBuildProgram, Line %u in file %s !!!\n\n", __LINE__, __FILE__);
+        Cleanup(EXIT_FAILURE);
+    }
+
+
+    // Shows the log
+    char* build_log;
+    size_t log_size;
+    // First call to know the proper size
+    clGetProgramBuildInfo(cpMLProgram, cdDevice, CL_PROGRAM_BUILD_LOG, 0, NULL, &log_size);
+    build_log = new char[log_size+1];
+    // Second call to get the log
+    clGetProgramBuildInfo(cpMLProgram, cdDevice, CL_PROGRAM_BUILD_LOG, log_size, build_log, NULL);
+    build_log[log_size] = '\0';
+    printf("%s", build_log);
+    delete[] build_log;
+
+    if (ciErr1 != CL_SUCCESS)
+    {
+        printf("%i\n", ciErr1); //prints "1"
+        switch(ciErr1)
+        {
+            case   CL_INVALID_PROGRAM: printf("CL_INVALID_PROGRAM\n"); break;
+            case   CL_INVALID_VALUE: printf("CL_INVALID_VALUE\n"); break;
+            case   CL_INVALID_DEVICE: printf("CL_INVALID_DEVICE\n"); break;
+            case   CL_INVALID_BINARY: printf("CL_INVALID_BINARY\n"); break;
+            case   CL_INVALID_BUILD_OPTIONS: printf("CL_INVALID_BUILD_OPTIONS\n"); break;
+            case   CL_COMPILER_NOT_AVAILABLE: printf("CL_COMPILER_NOT_AVAILABLE\n"); break;
+            case   CL_BUILD_PROGRAM_FAILURE: printf("CL_BUILD_PROGRAM_FAILURE\n"); break;
+            case   CL_INVALID_OPERATION: printf("CL_INVALID_OPERATION\n"); break;
+            case   CL_OUT_OF_HOST_MEMORY: printf("CL_OUT_OF_HOST_MEMORY\n"); break;
+            default: printf("Strange error\n"); //This is printed
+        }
+        printf("Error in clBuildProgram, Line %u in file %s !!!\n\n", __LINE__, __FILE__);
+        Cleanup(EXIT_FAILURE);
+    }
+
+    // Create the kernel
+    //ckKernel = clCreateKernel(cpProgram, "FirstLoop", &ciErr1);
+    ckLeafKernel = clCreateKernel(cpMLProgram, "LeafKernel", &ciErr1);
+    printf("clCreateKernel (LeafKernel)...\n");
+    if (ciErr1 != CL_SUCCESS)
+    {
+        printf("Error in clCreateKernel, Line %u in file %s !!!\n\n", __LINE__, __FILE__);
+        Cleanup(EXIT_FAILURE);
+    }
+    ckAmbigKernel = clCreateKernel(cpMLProgram, "AmbigKernel", &ciErr1);
+    printf("clCreateKernel (AmbigKernel)...\n");
+    if (ciErr1 != CL_SUCCESS)
+    {
+        printf("Error in clCreateKernel, Line %u in file %s !!!\n\n", __LINE__, __FILE__);
+        Cleanup(EXIT_FAILURE);
+    }
+    ckInternalKernel = clCreateKernel(cpMLProgram, "InternalKernel", &ciErr1);
+    printf("clCreateKernel (InternalKernel)...\n");
+    if (ciErr1 != CL_SUCCESS)
+    {
+        printf("Error in clCreateKernel, Line %u in file %s !!!\n\n", __LINE__, __FILE__);
+        Cleanup(EXIT_FAILURE);
+    }
+    ckResultKernel = clCreateKernel(cpMLProgram, "ResultKernel", &ciErr1);
+    printf("clCreateKernel (ResultKernel)...\n");
+    if (ciErr1 != CL_SUCCESS)
+    {
+        printf("Error in clCreateKernel, Line %u in file %s !!!\n\n", __LINE__, __FILE__);
+        Cleanup(EXIT_FAILURE);
+    }
+    ckReductionKernel = clCreateKernel(cpMLProgram, "ReductionKernel", &ciErr1);
+    printf("clCreateKernel (ReductionKernel)...\n");
+    if (ciErr1 != CL_SUCCESS)
+    {
+        printf("Error in clCreateKernel, Line %u in file %s !!!\n\n", __LINE__, __FILE__);
+        Cleanup(EXIT_FAILURE);
+    }
+
+    size_t maxKernelSize;
+    ciErr1 = clGetKernelWorkGroupInfo(ckLeafKernel, cdDevice, CL_KERNEL_WORK_GROUP_SIZE,
+                             sizeof(size_t), &maxKernelSize, NULL);
+    printf("Max Leaf Kernel Work Group Size: %ld \n", (long unsigned) maxKernelSize);
+    ciErr1 = clGetKernelWorkGroupInfo(ckAmbigKernel, cdDevice, CL_KERNEL_WORK_GROUP_SIZE,
+                             sizeof(size_t), &maxKernelSize, NULL);
+    printf("Max Ambig Kernel Work Group Size: %ld \n", (long unsigned) maxKernelSize);
+    ciErr1 = clGetKernelWorkGroupInfo(ckInternalKernel, cdDevice, CL_KERNEL_WORK_GROUP_SIZE,
+                             sizeof(size_t), &maxKernelSize, NULL);
+    printf("Max Internal Kernel Work Group Size: %ld \n", (long unsigned) maxKernelSize);
+    ciErr1 = clGetKernelWorkGroupInfo(ckResultKernel, cdDevice, CL_KERNEL_WORK_GROUP_SIZE,
+                             sizeof(size_t), &maxKernelSize, NULL);
+    printf("Max Result Kernel Work Group Size: %ld \n", (long unsigned) maxKernelSize);
+    ciErr1 = clGetKernelWorkGroupInfo(ckReductionKernel, cdDevice, CL_KERNEL_WORK_GROUP_SIZE,
+                             sizeof(size_t), &maxKernelSize, NULL);
+    printf("Max Reduction Kernel Work Group Size: %ld \n", (long unsigned) maxKernelSize);
+
+    long tempLeafState = 1;
+    long tempSiteCount = siteCount;
+    long tempCharCount = alphabetDimension;
+    long tempChildNodeIndex = 0;
+    long tempParentNodeIndex = 0;
+    long tempRoundCharCount = roundUpToNextPowerOfTwo(alphabetDimension);
+    int  tempTagIntState = 0;
+    int   tempNodeID = 0;
+    float tempScalar = scalar;
+    float tempuFlowThresh = 0.000000001f;
+
+    ciErr1  = clSetKernelArg(ckLeafKernel, 0, sizeof(cl_mem), (void*)&cmNode_cache);
+    ciErr1 |= clSetKernelArg(ckLeafKernel, 1, sizeof(cl_mem), (void*)&cmModel_cache);
+    ciErr1 |= clSetKernelArg(ckLeafKernel, 2, sizeof(cl_mem), (void*)&cmNodRes_cache);
+    ciErr1 |= clSetKernelArg(ckLeafKernel, 3, sizeof(cl_mem), (void*)&cmNodFlag_cache);
+    ciErr1 |= clSetKernelArg(ckLeafKernel, 4, sizeof(cl_long), (void*)&tempSiteCount);
+    ciErr1 |= clSetKernelArg(ckLeafKernel, 5, sizeof(cl_long), (void*)&tempCharCount);
+    ciErr1 |= clSetKernelArg(ckLeafKernel, 6, sizeof(cl_long), (void*)&tempChildNodeIndex); // reset this in the loop
+    ciErr1 |= clSetKernelArg(ckLeafKernel, 7, sizeof(cl_long), (void*)&tempParentNodeIndex); // reset this in the loop
+    ciErr1 |= clSetKernelArg(ckLeafKernel, 8, sizeof(cl_long), (void*)&tempRoundCharCount);
+    ciErr1 |= clSetKernelArg(ckLeafKernel, 9, sizeof(cl_int), (void*)&tempTagIntState); // reset this in the loop
+    ciErr1 |= clSetKernelArg(ckLeafKernel, 10, sizeof(cl_int), (void*)&tempNodeID); // reset this in the loop
+    ciErr1 |= clSetKernelArg(ckLeafKernel, 11, sizeof(cl_mem), (void*)&cmScalings_cache);
+    ciErr1 |= clSetKernelArg(ckLeafKernel, 12, sizeof(cl_float), (void*)&tempScalar);
+    ciErr1 |= clSetKernelArg(ckLeafKernel, 13, sizeof(cl_float), (void*)&tempuFlowThresh);
+
+    ciErr1 |= clSetKernelArg(ckAmbigKernel, 0, sizeof(cl_mem), (void*)&cmNode_cache);
+    ciErr1 |= clSetKernelArg(ckAmbigKernel, 1, sizeof(cl_mem), (void*)&cmModel_cache);
+    ciErr1 |= clSetKernelArg(ckAmbigKernel, 2, sizeof(cl_mem), (void*)&cmNodRes_cache);
+    ciErr1 |= clSetKernelArg(ckAmbigKernel, 3, sizeof(cl_mem), (void*)&cmNodFlag_cache);
+    ciErr1 |= clSetKernelArg(ckAmbigKernel, 4, sizeof(cl_long), (void*)&tempSiteCount);
+    ciErr1 |= clSetKernelArg(ckAmbigKernel, 5, sizeof(cl_long), (void*)&tempCharCount);
+    ciErr1 |= clSetKernelArg(ckAmbigKernel, 6, sizeof(cl_long), (void*)&tempChildNodeIndex); // reset this in the loop
+    ciErr1 |= clSetKernelArg(ckAmbigKernel, 7, sizeof(cl_long), (void*)&tempParentNodeIndex); // reset this in the loop
+    ciErr1 |= clSetKernelArg(ckAmbigKernel, 8, sizeof(cl_long), (void*)&tempRoundCharCount);
+    ciErr1 |= clSetKernelArg(ckAmbigKernel, 9, sizeof(cl_int), (void*)&tempTagIntState);
+    ciErr1 |= clSetKernelArg(ckAmbigKernel, 10, sizeof(cl_int), (void*)&tempNodeID);
+    ciErr1 |= clSetKernelArg(ckAmbigKernel, 11, sizeof(cl_mem), (void*)&cmScalings_cache);
+    ciErr1 |= clSetKernelArg(ckAmbigKernel, 12, sizeof(cl_float), (void*)&tempScalar);
+    ciErr1 |= clSetKernelArg(ckAmbigKernel, 13, sizeof(cl_float), (void*)&tempuFlowThresh);
+
+    ciErr1 |= clSetKernelArg(ckInternalKernel, 0, sizeof(cl_mem), (void*)&cmNode_cache);
+    ciErr1 |= clSetKernelArg(ckInternalKernel, 1, sizeof(cl_mem), (void*)&cmModel_cache);
+    ciErr1 |= clSetKernelArg(ckInternalKernel, 2, sizeof(cl_mem), (void*)&cmNodRes_cache);
+    ciErr1 |= clSetKernelArg(ckInternalKernel, 3, sizeof(cl_long), (void*)&tempSiteCount);
+    ciErr1 |= clSetKernelArg(ckInternalKernel, 4, sizeof(cl_long), (void*)&tempCharCount);
+    ciErr1 |= clSetKernelArg(ckInternalKernel, 5, sizeof(cl_long), (void*)&tempChildNodeIndex); // reset this in the loop
+    ciErr1 |= clSetKernelArg(ckInternalKernel, 6, sizeof(cl_long), (void*)&tempParentNodeIndex); // reset this in the loop
+    ciErr1 |= clSetKernelArg(ckInternalKernel, 7, sizeof(cl_long), (void*)&tempRoundCharCount);
+    ciErr1 |= clSetKernelArg(ckInternalKernel, 8, sizeof(cl_int), (void*)&tempTagIntState); // reset this in the loop
+    ciErr1 |= clSetKernelArg(ckInternalKernel, 9, sizeof(cl_int), (void*)&tempNodeID); // reset this in the loop
+    ciErr1 |= clSetKernelArg(ckInternalKernel, 10, sizeof(cl_mem), (void*)&cmroot_cache);
+    ciErr1 |= clSetKernelArg(ckInternalKernel, 11, sizeof(cl_mem), (void*)&cmScalings_cache);
+    ciErr1 |= clSetKernelArg(ckInternalKernel, 12, sizeof(cl_float), (void*)&tempScalar);
+    ciErr1 |= clSetKernelArg(ckInternalKernel, 13, sizeof(cl_float), (void*)&tempuFlowThresh);
+    ciErr1 |= clSetKernelArg(ckInternalKernel, 14, sizeof(cl_mem), (void*)&cmroot_scalings);
+
+    ciErr1 |= clSetKernelArg(ckResultKernel, 0, sizeof(cl_mem), (void*)&cmFreq_cache);
+    ciErr1 |= clSetKernelArg(ckResultKernel, 1, sizeof(cl_mem), (void*)&cmProb_cache);
+    ciErr1 |= clSetKernelArg(ckResultKernel, 2, sizeof(cl_mem), (void*)&cmResult_cache);
+    ciErr1 |= clSetKernelArg(ckResultKernel, 3, sizeof(cl_mem), (void*)&cmroot_cache);
+    ciErr1 |= clSetKernelArg(ckResultKernel, 4, sizeof(cl_mem), (void*)&cmroot_scalings);
+    ciErr1 |= clSetKernelArg(ckResultKernel, 5, sizeof(cl_long), (void*)&tempSiteCount);
+    ciErr1 |= clSetKernelArg(ckResultKernel, 6, sizeof(cl_long), (void*)&tempRoundCharCount);
+    ciErr1 |= clSetKernelArg(ckResultKernel, 7, sizeof(cl_float), (void*)&tempScalar);
+    ciErr1 |= clSetKernelArg(ckResultKernel, 8, sizeof(cl_long), (void*)&tempCharCount);
+
+    ciErr1 |= clSetKernelArg(ckReductionKernel, 0, sizeof(cl_mem), (void*)&cmResult_cache);
+
+    //printf("clSetKernelArg 0 - 12...\n\n");
+    if (ciErr1 != CL_SUCCESS)
+    {
+        printf("Error in clSetKernelArg, Line %u in file %s !!!\n\n", __LINE__, __FILE__);
+        Cleanup(EXIT_FAILURE);
+    }
+
+    // --------------------------------------------------------
+    // Start Core sequence... copy input data to GPU, compute, copy results back
+    // Asynchronous write of data to GPU device
+    ciErr1 |= clEnqueueWriteBuffer(cqCommandQueue, cmFreq_cache, CL_FALSE, 0,
+                sizeof(cl_int)*siteCount, freq_cache, 0, NULL, NULL);
+    printf("clEnqueueWriteBuffer (root_cache, etc.)...");
+    if (ciErr1 != CL_SUCCESS)
+    {
+        printf("Error in clEnqueueWriteBuffer, Line %u in file %s !!!\n\n", __LINE__, __FILE__);
+        Cleanup(EXIT_FAILURE);
+    }
+    printf(" Done!\n");
+}
+
+double _OCLEvaluator::oclmain(void)
+{
+    //printf("newLF!\n");
+    //printf("LF");
+    // so far this wholebuffer rebuild takes almost no time at all. Perhaps not true re:queue
+    // Fix the model cache
+#ifdef __OCLPOSIX__
+    clock_gettime(CLOCK_MONOTONIC, &bufferStart);
+#endif
+    int roundCharacters = roundUpToNextPowerOfTwo(alphabetDimension);
+/*
+    printf("Update Nodes:");
+    for (int i = 0; i < updateNodes.lLength; i++)
+    {
+        printf(" %i ", updateNodes.lData[i]);
+    }
+    printf("\n");
+
+    printf("Tagged Internals:");
+    for (int i = 0; i < taggedInternals.lLength; i++)
+    {
+        printf(" %i", taggedInternals.lData[i]);
+    }
+    printf("\n");
+*/
+    long nodeCode, parentCode;
+    bool isLeaf;
+    _Parameter* tMatrix;
+    int a1, a2;
+    //printf("updateNodes.lLength: %i", updateNodes.lLength);
+    //#pragma omp parallel for default(none) shared(updateNodes, flatParents, flatLeaves, flatCLeaves, flatTree, alphabetDimension, model, roundCharacters) private(nodeCode, parentCode, isLeaf, tMatrix, a1, a2)
+    for (int nodeID = 0; nodeID < updateNodes.lLength; nodeID++)
+    {
+        nodeCode = updateNodes.lData[nodeID];
+        parentCode = flatParents.lData[nodeCode];
+
+        isLeaf = nodeCode < flatLeaves.lLength;
+
+        if (!isLeaf) nodeCode -= flatLeaves.lLength;
+
+        tMatrix = (isLeaf? ((_CalcNode*) flatCLeaves (nodeCode)):
+                   ((_CalcNode*) flatTree    (nodeCode)))->GetCompExp(0)->theData;
+
+        for (a1 = 0; a1 < alphabetDimension; a1++)
+        {
+            for (a2 = 0; a2 < alphabetDimension; a2++)
+            {
+                ((float*)model)[nodeID*roundCharacters*roundCharacters+a2*roundCharacters+a1] =
+                   (float)(tMatrix[a1*alphabetDimension+a2]);
+            }
+        }
+    }
+
+    // enqueueing the read and write buffers takes 1/2 the time, the kernel takes the other 1/2.
+    // with no queueing, however, we still only see ~700lf/s, which isn't much better than the threaded CPU code.
+    ciErr1 |= clEnqueueWriteBuffer(cqCommandQueue, cmModel_cache, CL_TRUE, 0,
+                sizeof(cl_float)*roundCharacters*roundCharacters*(flatParents.lLength-1),
+                model, 0, NULL, NULL);
+    //clFinish(cqCommandQueue);
+    if (ciErr1 != CL_SUCCESS)
+    {
+        printf("%i\n", ciErr1); //prints "1"
+        switch(ciErr1)
+        {
+            case   CL_INVALID_COMMAND_QUEUE: printf("CL_INVALID_COMMAND_QUEUE\n"); break;
+            case   CL_INVALID_CONTEXT: printf("CL_INVALID_CONTEXT\n"); break;
+            case   CL_INVALID_MEM_OBJECT: printf("CL_INVALID_MEM_OBJECT\n"); break;
+            case   CL_INVALID_VALUE: printf("CL_INVALID_VALUE\n"); break;
+            case   CL_INVALID_EVENT_WAIT_LIST: printf("CL_INVALID_EVENT_WAIT_LIST\n"); break;
+                //          case   CL_MISALIGNED_SUB_BUFFER_OFFSET: printf("CL_MISALIGNED_SUB_BUFFER_OFFSET\n"); break;
+                //          case   CL_EXEC_STATUS_ERROR_FOR_EVENTS_IN_WAIT_LIST: printf("CL_EXEC_STATUS_ERROR_FOR_EVENTS_IN_WAIT_LIST\n"); break;
+            case   CL_MEM_OBJECT_ALLOCATION_FAILURE: printf("CL_MEM_OBJECT_ALLOCATION_FAILURE\n"); break;
+            case   CL_OUT_OF_RESOURCES: printf("CL_OUT_OF_RESOURCES\n"); break;
+            case   CL_OUT_OF_HOST_MEMORY: printf("CL_OUT_OF_HOST_MEMORY\n"); break;
+            default: printf("Strange error\n"); //This is printed
+        }
+        printf("Error in clEnqueueWriteBuffer, Line %u in file %s !!!\n\n", __LINE__, __FILE__);
+        Cleanup(EXIT_FAILURE);
+    }
+    /*
+    if (ciErr1 != CL_SUCCESS)
+    {
+        printf("Error in clEnqueueWriteBuffer, Line %u in file %s !!!\n\n", __LINE__, __FILE__);
+        Cleanup(EXIT_FAILURE);
+    }
+    */
+#ifdef __OCLPOSIX__
+    clock_gettime(CLOCK_MONOTONIC, &bufferEnd);
+    buffSecs += (bufferEnd.tv_sec - bufferStart.tv_sec)+(bufferEnd.tv_nsec - bufferStart.tv_nsec)/BILLION;
+
+    clock_gettime(CLOCK_MONOTONIC, &queueStart);
+#endif
+    //printf("Finished writing the model stuff\n");
+    // Launch kernel
+    for (int nodeIndex = 0; nodeIndex < updateNodes.lLength; nodeIndex++)
+    {
+        //printf("NewNode\n");
+        long    nodeCode = updateNodes.lData[nodeIndex],
+                parentCode = flatParents.lData[nodeCode];
+
+        //printf("NewNode: %i, NodeCode: %i\n", nodeIndex, nodeCode);
+        bool isLeaf = nodeCode < flatLeaves.lLength;
+
+        if (isLeaf)
+        {
+            long nodeCodeTemp = nodeCode;
+            int tempIntTagState = taggedInternals.lData[parentCode];
+            int ambig = 0;
+            for (int aI = 0; aI < siteCount; aI++)
+                if (lNodeFlags[nodeCode*siteCount + aI] < 0)
+                    {
+                        ambig = 1;
+                    }
+            if (!ambig)
+            {
+                ciErr1 |= clSetKernelArg(ckLeafKernel, 6, sizeof(cl_long), (void*)&nodeCodeTemp);
+                ciErr1 |= clSetKernelArg(ckLeafKernel, 7, sizeof(cl_long), (void*)&parentCode);
+                ciErr1 |= clSetKernelArg(ckLeafKernel, 9, sizeof(cl_int), (void*)&tempIntTagState);
+                ciErr1 |= clSetKernelArg(ckLeafKernel, 10, sizeof(cl_int), (void*)&nodeIndex);
+                taggedInternals.lData[parentCode] = 1;
+
+                //printf("Leaf!\n");
+#ifdef __VERBOSE__
+                printf("Leaf/Ambig Started (ParentCode: %i)...", parentCode);
+#endif
+                ciErr1 = clEnqueueNDRangeKernel(cqCommandQueue, ckLeafKernel, 2, NULL,
+                                                szGlobalWorkSize, szLocalWorkSize, 0, NULL, NULL);
+            }
+            else
+            {
+                ciErr1 |= clSetKernelArg(ckAmbigKernel, 6, sizeof(cl_long), (void*)&nodeCodeTemp);
+                ciErr1 |= clSetKernelArg(ckAmbigKernel, 7, sizeof(cl_long), (void*)&parentCode);
+                ciErr1 |= clSetKernelArg(ckAmbigKernel, 9, sizeof(cl_int), (void*)&tempIntTagState);
+                ciErr1 |= clSetKernelArg(ckAmbigKernel, 10, sizeof(cl_int), (void*)&nodeIndex);
+                taggedInternals.lData[parentCode] = 1;
+
+                //printf("ambig!\n");
+#ifdef __VERBOSE__
+                printf("Leaf/Ambig Started ...");
+#endif
+                ciErr1 = clEnqueueNDRangeKernel(cqCommandQueue, ckAmbigKernel, 2, NULL,
+                                                szGlobalWorkSize, szLocalWorkSize, 0, NULL, NULL);
+            }
+            ciErr1 |= clFlush(cqCommandQueue);
+            clFinish(cqCommandQueue);
+#ifdef __VERBOSE__
+            printf("Finished\n");
+#endif
+        }
+        else
+        {
+            long tempLeafState = 0;
+            nodeCode -= flatLeaves.lLength;
+            long nodeCodeTemp = nodeCode;
+            int tempIntTagState = taggedInternals.lData[parentCode];
+            ciErr1 |= clSetKernelArg(ckInternalKernel, 5, sizeof(cl_long), (void*)&nodeCodeTemp);
+            ciErr1 |= clSetKernelArg(ckInternalKernel, 6, sizeof(cl_long), (void*)&parentCode);
+            ciErr1 |= clSetKernelArg(ckInternalKernel, 8, sizeof(cl_int), (void*)&tempIntTagState);
+            ciErr1 |= clSetKernelArg(ckInternalKernel, 9, sizeof(cl_int), (void*)&nodeIndex);
+            taggedInternals.lData[parentCode] = 1;
+#ifdef __VERBOSE__
+            printf("Internal Started (ParentCode: %i)...", parentCode);
+#endif
+            ciErr1 = clEnqueueNDRangeKernel(cqCommandQueue, ckInternalKernel, 2, NULL,
+                                            szGlobalWorkSize, szLocalWorkSize, 0, NULL, NULL);
+
+            //printf("internal!\n");
+            ciErr1 |= clFlush(cqCommandQueue);
+            clFinish(cqCommandQueue);
+#ifdef __VERBOSE__
+            printf("Finished\n");
+#endif
+        }
+        if (ciErr1 != CL_SUCCESS)
+        {
+            printf("%i\n", ciErr1); //prints "1"
+            switch(ciErr1)
+            {
+                case   CL_INVALID_PROGRAM_EXECUTABLE: printf("CL_INVALID_PROGRAM_EXECUTABLE\n"); break;
+                case   CL_INVALID_COMMAND_QUEUE: printf("CL_INVALID_COMMAND_QUEUE\n"); break;
+                case   CL_INVALID_KERNEL: printf("CL_INVALID_KERNEL\n"); break;
+                case   CL_INVALID_CONTEXT: printf("CL_INVALID_CONTEXT\n"); break;
+                case   CL_INVALID_KERNEL_ARGS: printf("CL_INVALID_KERNEL_ARGS\n"); break;
+                case   CL_INVALID_WORK_DIMENSION: printf("CL_INVALID_WORK_DIMENSION\n"); break;
+                case   CL_INVALID_GLOBAL_WORK_SIZE: printf("CL_INVALID_GLOBAL_WORK_SIZE\n"); break;
+                case   CL_INVALID_GLOBAL_OFFSET: printf("CL_INVALID_GLOBAL_OFFSET\n"); break;
+                case   CL_INVALID_WORK_GROUP_SIZE: printf("CL_INVALID_WORK_GROUP_SIZE\n"); break;
+                case   CL_INVALID_WORK_ITEM_SIZE: printf("CL_INVALID_WORK_ITEM_SIZE\n"); break;
+                case   CL_INVALID_IMAGE_SIZE: printf("CL_INVALID_IMAGE_SIZE\n"); break;
+                case   CL_OUT_OF_RESOURCES: printf("CL_OUT_OF_RESOURCES\n"); break;
+                case   CL_MEM_OBJECT_ALLOCATION_FAILURE: printf("CL_MEM_OBJECT_ALLOCATION_FAILURE\n"); break;
+                case   CL_INVALID_EVENT_WAIT_LIST: printf("CL_INVALID_EVENT_WAIT_LIST\n"); break;
+                case   CL_OUT_OF_HOST_MEMORY: printf("CL_OUT_OF_HOST_MEMORY\n"); break;
+                default: printf("Strange error\n"); //This is printed
+            }
+            printf("Error in clEnqueueNDRangeKernel, Line %u in file %s !!!\n\n", __LINE__, __FILE__);
+            Cleanup(EXIT_FAILURE);
+        }
+    }
+#ifdef __GPUResults__
+	size_t szGlobalWorkSize2 = 256;
+	size_t szLocalWorkSize2 = 256;
+	//size_t szLocalWorkSize2 = roundUpToNextPowerOfTwo(siteCount);
+	//size_t szLocalWorkSize2 = MIN(roundUpToNextPowerOfTwo(siteCount), 256*256);
+	size_t szGlobalWorkSize3 = 256;
+	size_t szLocalWorkSize3 = 256;
+
+    ciErr1 |= clEnqueueNDRangeKernel(cqCommandQueue, ckResultKernel, 1, NULL,
+        &szGlobalWorkSize2, &szLocalWorkSize2, 0, NULL, NULL);
+    ciErr1 |= clEnqueueNDRangeKernel(cqCommandQueue, ckReductionKernel, 1, NULL,
+        &szGlobalWorkSize3, &szLocalWorkSize3, 0, NULL, NULL);
+#else
+    ciErr1 |= clEnqueueNDRangeKernel(cqCommandQueue, ckResultKernel, 2, NULL,
+        szGlobalWorkSize, szLocalWorkSize, 0, NULL, NULL);
+#endif
+/*
+*/
+	/*
+    ciErr1 |= clEnqueueNDRangeKernel(cqCommandQueue, ckReductionKernel, 2, NULL,
+        szGlobalWorkSize, szLocalWorkSize, 0, NULL, NULL);
+	*/
+
+    if (ciErr1 != CL_SUCCESS)
+    {
+        printf("%i\n", ciErr1); //prints "1"
+        switch(ciErr1)
+        {
+            case   CL_INVALID_PROGRAM_EXECUTABLE: printf("CL_INVALID_PROGRAM_EXECUTABLE\n"); break;
+            case   CL_INVALID_COMMAND_QUEUE: printf("CL_INVALID_COMMAND_QUEUE\n"); break;
+            case   CL_INVALID_KERNEL: printf("CL_INVALID_KERNEL\n"); break;
+            case   CL_INVALID_CONTEXT: printf("CL_INVALID_CONTEXT\n"); break;
+            case   CL_INVALID_KERNEL_ARGS: printf("CL_INVALID_KERNEL_ARGS\n"); break;
+            case   CL_INVALID_WORK_DIMENSION: printf("CL_INVALID_WORK_DIMENSION\n"); break;
+            case   CL_INVALID_GLOBAL_WORK_SIZE: printf("CL_INVALID_GLOBAL_WORK_SIZE\n"); break;
+            case   CL_INVALID_GLOBAL_OFFSET: printf("CL_INVALID_GLOBAL_OFFSET\n"); break;
+            case   CL_INVALID_WORK_GROUP_SIZE: printf("CL_INVALID_WORK_GROUP_SIZE\n"); break;
+            case   CL_INVALID_WORK_ITEM_SIZE: printf("CL_INVALID_WORK_ITEM_SIZE\n"); break;
+                //          case   CL_MISALIGNED_SUB_BUFFER_OFFSET: printf("CL_OUT_OF_HOST_MEMORY\n"); break;
+            case   CL_INVALID_IMAGE_SIZE: printf("CL_INVALID_IMAGE_SIZE\n"); break;
+            case   CL_OUT_OF_RESOURCES: printf("CL_OUT_OF_RESOURCES\n"); break;
+            case   CL_MEM_OBJECT_ALLOCATION_FAILURE: printf("CL_MEM_OBJECT_ALLOCATION_FAILURE\n"); break;
+            case   CL_INVALID_EVENT_WAIT_LIST: printf("CL_INVALID_EVENT_WAIT_LIST\n"); break;
+            case   CL_OUT_OF_HOST_MEMORY: printf("CL_OUT_OF_HOST_MEMORY\n"); break;
+            default: printf("Strange error\n"); //This is printed
+        }
+        printf("Error in clEnqueueNDRangeKernel, Line %u in file %s !!!\n\n", __LINE__, __FILE__);
+        Cleanup(EXIT_FAILURE);
+    }
+    // Synchronous/blocking read of results, and check accumulated errors
+/*
+#ifdef __GPUResults_
+    ciErr1 = clEnqueueReadBuffer(cqCommandQueue, cmResult_cache, CL_FALSE, 0,
+            sizeof(cl_double)*roundUpToNextPowerOfTwo(siteCount), result_cache, 0,
+            NULL, NULL);
+    //ciErr1 = clEnqueueReadBuffer(cqCommandQueue, cmResult_cache, CL_FALSE, 0,
+     //       sizeof(cl_double)*1, result_cache, 0,
+      //      NULL, NULL);
+#else
+    //ciErr1 = clEnqueueReadBuffer(cqCommandQueue, cmResult_cache, CL_FALSE, 0,
+     //       sizeof(cl_float)*roundUpToNextPowerOfTwo(siteCount), result_cache, 0,
+      //      NULL, NULL);
+    ciErr1 = clEnqueueReadBuffer(cqCommandQueue, cmResult_cache, CL_FALSE, 0,
+            sizeof(cl_float)*roundUpToNextPowerOfTwo(siteCount), result_cache, 0,
+            NULL, NULL);
+
+#endif
+*/
+    ciErr1 = clEnqueueReadBuffer(cqCommandQueue, cmResult_cache, CL_FALSE, 0,
+            sizeof(clfp)*roundUpToNextPowerOfTwo(siteCount), result_cache, 0,
+            NULL, NULL);
+
+    if (ciErr1 != CL_SUCCESS)
+    {
+        printf("%i\n", ciErr1); //prints "1"
+        switch(ciErr1)
+        {
+            case   CL_INVALID_COMMAND_QUEUE: printf("CL_INVALID_COMMAND_QUEUE\n"); break;
+            case   CL_INVALID_CONTEXT: printf("CL_INVALID_CONTEXT\n"); break;
+            case   CL_INVALID_MEM_OBJECT: printf("CL_INVALID_MEM_OBJECT\n"); break;
+            case   CL_INVALID_VALUE: printf("CL_INVALID_VALUE\n"); break;
+            case   CL_INVALID_EVENT_WAIT_LIST: printf("CL_INVALID_EVENT_WAIT_LIST\n"); break;
+                //          case   CL_MISALIGNED_SUB_BUFFER_OFFSET: printf("CL_MISALIGNED_SUB_BUFFER_OFFSET\n"); break;
+                //          case   CL_EXEC_STATUS_ERROR_FOR_EVENTS_IN_WAIT_LIST: printf("CL_EXEC_STATUS_ERROR_FOR_EVENTS_IN_WAIT_LIST\n"); break;
+            case   CL_MEM_OBJECT_ALLOCATION_FAILURE: printf("CL_MEM_OBJECT_ALLOCATION_FAILURE\n"); break;
+            case   CL_OUT_OF_RESOURCES: printf("CL_OUT_OF_RESOURCES\n"); break;
+            case   CL_OUT_OF_HOST_MEMORY: printf("CL_OUT_OF_HOST_MEMORY\n"); break;
+            default: printf("Strange error\n"); //This is printed
+        }
+        printf("Error in clEnqueueReadBuffer, Line %u in file %s !!!\n\n", __LINE__, __FILE__);
+        Cleanup(EXIT_FAILURE);
+    }
+    //--------------------------------------------------------
+
+
+    clFinish(cqCommandQueue);
+    double oResult = 0.0;
+
+#ifdef __GPUResults__
+	/*
+    for (int i = 0; i < siteCount; i++)
+    {
+        oResult += ((fpoint*)result_cache)[i];
+    }
+#ifdef __VERBOSE__
+    printf("Result_Cache: \n");
+    for (int i = 0; i < siteCount; i++)
+        printf("%4.10g ", ((fpoint*)result_cache)[i]);
+    printf("\n\n");
+#endif
+    for (int i = 0; i < siteCount; i++)
+    {
+        oResult += ((float*)result_cache)[i];
+    }
+    //oResult = ((double*)result_cache)[0];
+    printf("Result_Cache: \n");
+    for (int i = 0; i < siteCount; i++)
+        printf("%4.10g ", ((fpoint*)result_cache)[i]);
+    printf("\n\n");
+	*/
+    oResult = ((fpoint*)result_cache)[0];
+#else
+#ifdef __OCLPOSIX__
+    clock_gettime(CLOCK_MONOTONIC, &queueEnd);
+    queueSecs += (queueEnd.tv_sec - queueStart.tv_sec)+(queueEnd.tv_nsec - queueStart.tv_nsec)/BILLION;
+    clock_gettime(CLOCK_MONOTONIC, &mainStart);
+#endif
+    //#pragma omp parallel for reduction (+:oResult) schedule(static)
+    for (int i = 0; i < siteCount; i++)
+    {
+        oResult += ((fpoint*)result_cache)[i];
+    }
+#ifdef __VERBOSE__
+    printf("Result_Cache: \n");
+    for (int i = 0; i < siteCount; i++)
+        printf("%4.10g ", ((float*)result_cache)[i]);
+    printf("\n\n");
+#endif
+#ifdef __OCLPOSIX__
+    clock_gettime(CLOCK_MONOTONIC, &mainEnd);
+    mainSecs += (mainEnd.tv_sec - mainStart.tv_sec)+(mainEnd.tv_nsec - mainStart.tv_nsec)/BILLION;
+#endif
+#endif
+/*
+*/
+/*
+    //#pragma omp parallel for reduction (+:oResult) schedule(static)
+    for (int i = 0; i < siteCount; i++)
+    {
+        oResult += ((float*)result_cache)[i];
+    }
+    printf("Result_Cache: \n");
+    for (int i = 0; i < siteCount; i++)
+        printf("%4.10g ", ((float*)result_cache)[i]);
+    printf("\n\n");
+*/
+/*
+    //printf("! ");
+    //return result;
+    printf("oResult: %4.10g, gpuResult: %4.10g\n", oResult, ((double*)result_cache)[4]);
+    if (oResult != ((double*)result_cache)[4])
+    {
+        printf("Result_Cache: \n");
+        //for (int i = 0; i < roundUpToNextPowerOfTwo(siteCount); i++)
+        for (int i = 0; i < 5; i++)
+            printf("%4.10g ", ((double*)result_cache)[i]);
+        printf("\n\n");
+    }
+*/
+    return oResult;
+}
+
+
+double _OCLEvaluator::launchmdsocl( _SimpleList& eupdateNodes,
+                                    _SimpleList& eflatParents,
+                                    _SimpleList& eflatNodes,
+                                    _SimpleList& eflatCLeaves,
+                                    _SimpleList& eflatLeaves,
+                                    _SimpleList& eflatTree,
+                                    _Parameter* etheProbs,
+                                    _SimpleList& etheFrequencies,
+                                    long* elNodeFlags,
+                                    _SimpleList& etaggedInternals,
+                                    _GrowingVector* elNodeResolutions)
+{
+#ifdef __OCLPOSIX__
+    clock_gettime(CLOCK_MONOTONIC, &mainStart);
+#endif
+
+
+    updateNodes = eupdateNodes;
+    taggedInternals = etaggedInternals;
+    theFrequencies = etheFrequencies;
+
+
+    if (!contextSet)
+    {
+        theProbs = etheProbs;
+        flatNodes = eflatNodes;
+        flatCLeaves = eflatCLeaves;
+        flatLeaves = eflatLeaves;
+        flatTree = eflatTree;
+        flatParents = eflatParents;
+        lNodeFlags = elNodeFlags;
+        lNodeResolutions = elNodeResolutions;
+        setupContext();
+        contextSet = true;
+    }
+
+#ifdef __OCLPOSIX__
+    clock_gettime(CLOCK_MONOTONIC, &mainEnd);
+    mainSecs += (mainEnd.tv_sec - mainStart.tv_sec)+(mainEnd.tv_nsec - mainStart.tv_nsec)/BILLION;
+#endif
+
+    return oclmain();
+}
+
+
+void _OCLEvaluator::Cleanup (int iExitCode)
+{
+    if (!clean)
+    {
+        printf("Time in main: %.4lf seconds\n", mainSecs);
+        printf("Time in updating transition buffer: %.4lf seconds\n", buffSecs);
+        printf("Time in queue: %.4lf seconds\n", queueSecs);
+        printf("Time in Setup: %.4lf seconds\n", setupSecs);
+        // Cleanup allocated objects
+        printf("Starting Cleanup...\n\n");
+        if(ckLeafKernel)clReleaseKernel(ckLeafKernel);
+        if(ckInternalKernel)clReleaseKernel(ckInternalKernel);
+        if(ckAmbigKernel)clReleaseKernel(ckAmbigKernel);
+        if(ckResultKernel)clReleaseKernel(ckResultKernel);
+        if(cpLeafProgram)clReleaseProgram(cpLeafProgram);
+        if(cpInternalProgram)clReleaseProgram(cpInternalProgram);
+        if(cpAmbigProgram)clReleaseProgram(cpAmbigProgram);
+        if(cpResultProgram)clReleaseProgram(cpResultProgram);
+        if(cqCommandQueue)clReleaseCommandQueue(cqCommandQueue);
+        printf("Halfway...\n\n");
+        if(cxGPUContext)clReleaseContext(cxGPUContext);
+        if(cmNode_cache)clReleaseMemObject(cmNode_cache);
+        if(cmModel_cache)clReleaseMemObject(cmModel_cache);
+        if(cmNodRes_cache)clReleaseMemObject(cmNodRes_cache);
+        if(cmNodFlag_cache)clReleaseMemObject(cmNodFlag_cache);
+        if(cmroot_cache)clReleaseMemObject(cmroot_cache);
+        if(cmroot_scalings)clReleaseMemObject(cmroot_scalings);
+        if(cmScalings_cache)clReleaseMemObject(cmScalings_cache);
+        if(cmFreq_cache)clReleaseMemObject(cmFreq_cache);
+        if(cmProb_cache)clReleaseMemObject(cmProb_cache);
+        if(cmResult_cache)clReleaseMemObject(cmResult_cache);
+        printf("Done with ocl stuff...\n\n");
+        // Free host memory
+        free(node_cache);
+        free(model);
+        free(nodRes_cache);
+        free(nodFlag_cache);
+        free(scalings_cache);
+        free(prob_cache);
+        free(freq_cache);
+        free(root_cache);
+        free(result_cache);
+        free(root_scalings);
+        printf("Done!\n\n");
+        clean = true;
+        exit(0);
+
+        if (iExitCode = EXIT_FAILURE)
+            exit (iExitCode);
+    }
+}
+
+unsigned int _OCLEvaluator::roundUpToNextPowerOfTwo(unsigned int x)
+{
+    x--;
+    x |= x >> 1;
+    x |= x >> 2;
+    x |= x >> 4;
+    x |= x >> 8;
+    x |= x >> 16;
+    x++;
+
+    return x;
+}
+
+double _OCLEvaluator::roundDoubleUpToNextPowerOfTwo(double x)
+{
+    return pow(2, ceil(log2(x)));
+}
+#endif
+
diff --git a/src/core/list.cpp b/src/core/list.cpp
new file mode 100644
index 0000000..901287c
--- /dev/null
+++ b/src/core/list.cpp
@@ -0,0 +1,684 @@
+/*
+
+HyPhy - Hypothesis Testing Using Phylogenies.
+
+Copyright (C) 1997-2009
+  Sergei L Kosakovsky Pond (spond at ucsd.edu)
+  Art FY Poon              (apoon at cfenet.ubc.ca)
+
+Permission is hereby granted, free of charge, to any person obtaining a
+copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be included
+in all copies or substantial portions of the Software.
+
+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.
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+_AVLList    structure inspired by the excellent documentation of
+GNU libavl 2.0.1 by Ben Pfaff (http://www.msu.edu/~pfaffben/avl/index.html)
+
+*/
+
+#include "list.h"
+#include "hy_strings.h"
+#include "errorfns.h"
+#include "parser.h"
+#include <stdlib.h>
+#include <string.h>
+#include <stdio.h>
+#include <ctype.h>
+#include <math.h>
+#include <limits.h>
+#include <stdarg.h>
+
+#ifdef    __HYPHYDMALLOC__
+#include "dmalloc.h"
+#endif
+
+
+/*
+==============================================================
+Constructors
+==============================================================
+*/
+
+// Does nothing
+_List::_List ()
+{
+}
+
+// Length constructor
+_List::_List (unsigned long l):_SimpleList(l)
+{
+}
+
+// Stack Copy contructor
+_List::_List (const _List& l, long from, long to)
+{
+    if (from == 0 && to == -1) { // copy the whole thing
+        BaseRef   br = (BaseRef)&l;
+        Duplicate (br);
+    } else {
+        Initialize           ();
+        NormalizeCoordinates (from, to, l.lLength);
+
+        for (long i = from; i <= to; i++) {
+            (*this) << ((BaseRef*)l.lData)[i];
+        }
+    }
+}
+
+// Construct a list of substrings from the original string separated by char
+_List::_List (BaseRef ss, char sep)
+{
+    _String* s = (_String*)ss;
+    if (s->Length()!=0) {
+        long cp=0,cpp;
+        while ((cpp = s->Find(sep,cp,-1))!=-1) {
+            if (cpp>cp) {
+                AppendNewInstance (new _String(*s,cp,cpp-1));
+            } else {
+                AppendNewInstance (new _String);
+            }
+            cp=cpp+1;
+        }
+
+        AppendNewInstance (new _String(*s,cp,-1));
+    }
+}
+
+// Data constructor (1 member list)
+_List::_List (BaseRef br)
+{
+    lLength = 1;
+    laLength = MEMORYSTEP;
+    lData = (long*)MemAllocate (laLength * sizeof(Ptr));
+    ((BaseRef*)lData)[0]= br->makeDynamic();
+}
+
+// Data constructor (variable number of string constants)
+_List::_List (const char* firstString, const unsigned long number, ...)
+{
+    va_list vl;
+    AppendNewInstance (new _String (firstString));
+    va_start(vl,number);
+    for (unsigned long arg_id =0;arg_id<number;arg_id++) {
+        char * val=va_arg(vl,char *);
+        AppendNewInstance (new _String (val));
+    }
+    va_end(vl);
+}
+
+//Destructor
+_List::~_List(void)
+{
+    if (nInstances<=1) {
+        for (unsigned long i = 0; i<lLength; i++) {
+            BaseRef t = ((BaseRef*)lData)[i];
+            if (t) {
+                if (t->nInstances<=1) {
+                    DeleteObject(t);
+                } else {
+                    t->nInstances--;
+                }
+            }
+        }
+    }
+
+
+}
+
+/*
+==============================================================
+Operator Overloads
+==============================================================
+*/
+
+// Element location functions (0,llength - 1)
+BaseRef& _List::operator [] (long i)
+{
+    BaseRef t = BaseRef(_SimpleList::operator[] (i));
+    if (t)
+        if (t->nInstances>1) {
+            t->nInstances--;
+            ((BaseRef*)(lData))[i]=t->makeDynamic();
+        }
+
+    return ((BaseRef*)(lData))[i];
+}
+
+// Element location functions (0,llength - 1)
+BaseRef _List::operator () (const unsigned long i)
+{
+    return ((BaseRef*)lData)[i];
+}
+
+// Element location functions (0,llength - 1)
+BaseRef _List::GetItem (const unsigned long i)
+{
+    return ((BaseRef*)lData)[i];
+}
+
+// Assignment operator
+_List _List::operator = (_List& l)
+{
+    this->~_List();
+    lLength = l.lLength;
+    laLength = l.laLength;
+    lData = l.lData;
+    l.nInstances++;
+    for (unsigned long i = 0; i<lLength; i++) {
+        ((BaseRef*)(lData))[i]->nInstances++;
+    }
+    return *this;
+}
+
+// Assignment compare 
+bool _List::operator == (_List& l2)
+{
+    return this->Equal(l2);
+}
+
+// Append operator
+_List _List::operator & (_List& l)
+{
+    _List res (l.lLength + lLength);
+    if (!res.laLength) {
+        return res;
+    }
+
+    if (lData&&lLength) {
+        memcpy(res.lData,lData,lLength*sizeof(void*));
+    }
+    if (l.lData&&l.lLength) {
+        memcpy((char*)res.lData+lLength*sizeof(void*),l.lData, l.lLength*sizeof(void*));
+    }
+    res.lLength = l.lLength + lLength;
+    unsigned long i;
+    for (i = 0; (i<lLength); i++) {
+        ((BaseRef*)lData)[i]->nInstances++;
+
+    }
+    for (i=0; i<l.lLength; i++) {
+        ((BaseRef*)l.lData)[i]->nInstances++;
+    }
+    return res;
+}
+
+// Append operator
+_List _List::operator & (BaseRef br)
+{
+    _List res (lLength+1);
+    if (!res.laLength) {
+        return res;
+    }
+
+    if (lData) {
+        memcpy(res.lData,lData,lLength*sizeof(void*));
+    }
+    for (unsigned long i = 0; (i<lLength); i++) {
+        ((BaseRef*)lData)[i]->nInstances++;
+    }
+    res.lLength=lLength+1;
+    ((BaseRef*)res.lData)[lLength]=br->makeDynamic();
+    return res;
+}
+
+void _List::operator && (BaseRef br)
+{
+    InsertElement (br);
+}
+
+void _List::operator && (const char * buffer)
+{
+    _String*        newString = new _String (buffer);
+    checkPointer    (newString);
+    InsertElement   (newString,-1,false);
+    DeleteObject    (newString);
+}
+
+void _List::operator << (BaseRef br)
+{
+//  InsertElement (br, -1, false);
+    lLength++;
+    if (lLength>laLength) {
+        unsigned long incBy = (MEMORYSTEP*5 > lLength)? MEMORYSTEP: lLength/5;
+
+        laLength+=incBy;
+
+        if (lData) {
+            checkPointer (lData = (long*)MemReallocate((char*)lData, laLength*sizeof(void*)));
+        } else {
+            checkPointer (lData = (long*)MemAllocate(laLength*sizeof(void*)));
+        }
+    }
+
+    ((BaseRef*)lData)[lLength-1]=br;
+    br->nInstances++;
+}
+
+void _List::operator << (_List& source)
+{
+    for (long k=0; k<source.lLength; k++) {
+        (*this) << ((BaseRef*)source.lData)[k];
+    }
+}
+
+
+/*
+==============================================================
+Methods
+==============================================================
+*/
+
+void _List::AppendNewInstance (BaseRef br)
+{
+    if (br) {
+        (*this)<<br;
+        br->nInstances--;
+    } else {
+        checkPointer (br);
+    }
+}
+
+long  _List::BinaryFind (BaseRef s)
+{
+    _String * st = (_String*)s;
+    long top=lLength-1, bottom=0, middle;
+
+    if (top==-1) {
+        return -1;
+    }
+    while (top>bottom) {
+        middle = (top+bottom)/2;
+        _String* stp = (_String*)(((BaseRef*)lData)[middle]->toStr());
+
+        int      cres = st->Compare (stp);
+        DeleteObject (stp);
+
+        if (cres < 0) {
+            top = middle==top?top-1:middle;
+        } else if (cres == 0) {
+            return middle;
+        } else {
+            bottom = middle==bottom?bottom+1:middle;
+        }
+
+    }
+    middle = top;
+    _String* stp=(_String*)(((BaseRef*)lData)[middle]->toStr());
+    if (st->Equal(stp)) {
+        DeleteObject(stp);
+        return middle;
+    }
+    DeleteObject(stp);
+    return -middle-2;
+}
+
+long  _List::BinaryInsert (BaseRef s)
+{
+
+    if (!lLength) {
+        InsertElement (s,0,true);
+        return 0;
+    }
+
+    long pos = -BinaryFind (s)-2;
+    if (pos<0) {
+        return -pos+2;
+    }
+    _String *s1 = (_String*)s->toStr(), *s2 =(_String*) ((*this)(pos))->toStr();
+    if (*s2<*s1) {
+        pos++;
+    }
+    DeleteObject(s1);
+    DeleteObject(s2);
+    InsertElement (s,pos,true);
+    return pos>=lLength?lLength-1:pos;
+
+}
+
+void    _List::bumpNInst (void)
+{
+    for (unsigned long i = 0; i<lLength; i++) {
+        ((BaseRef*)lData)[i]->nInstances++;
+    }
+}
+
+void  _List::Clear (bool completeClear)
+{
+    if (nInstances<=1) {
+        for (unsigned long i = 0; i<lLength; i++) {
+            DeleteObject (((BaseRef*)lData)[i]);
+        }
+        _SimpleList::Clear(completeClear);
+
+    } else {
+        nInstances--;
+    }
+}
+
+long  _List::Compare (long i, long j)
+{
+    _String             *si = (_String*)lData[i],
+                         *sj = (_String*)lData[j];
+
+    return  si->Compare(sj);
+}
+
+long  _List::Compare (BaseRef i, long j)
+{
+    _String             *sj = (_String*)lData[j],
+                         *si = (_String*)i;
+
+    return  si->Compare(sj);
+}
+
+unsigned long _List::Count()
+{
+    return lLength;
+}
+
+// Delete item at index (>=0)
+void  _List::Delete (long index, bool delete_object)
+{
+    if (index>=0 && index<lLength) {
+        if (delete_object) {
+            DeleteObject (((BaseRef*)lData)[index]);
+        }
+        lLength--;
+        if (lLength-index)
+            for (unsigned long i = index; i < lLength; i++) {
+                lData[i] = lData[i+1];
+            }
+        //memcpy ((Ptr)lData+sizeof(BaseRef)*(index),(Ptr)lData+sizeof(BaseRef)*(index+1),sizeof(BaseRef)*(lLength-index));
+    }
+    if (laLength-lLength>MEMORYSTEP) {
+        laLength -= ((laLength-lLength)/MEMORYSTEP)*MEMORYSTEP;
+        lData = (long*)MemReallocate ((char*)lData, laLength*sizeof(Ptr));
+    }
+
+}
+
+// Delete item at index (>=0)
+void  _List::DeleteList (const _SimpleList& toDelete)
+{
+    if (toDelete.lLength) {
+        long k = 0;
+        for (unsigned long i = 0; i<lLength; i++) {
+            if (k<toDelete.lLength && i==toDelete.lData[k]) {
+                DeleteObject (((BaseRef*)lData)[i]);
+                //if (k<toDelete.lLength)
+                k++;
+            } else {
+                ((BaseRef*)lData)[i-k] = ((BaseRef*)lData)[i];
+            }
+        }
+        lLength -= toDelete.lLength;
+        if (laLength-lLength>MEMORYSTEP) {
+            laLength -= ((laLength-lLength)/MEMORYSTEP)*MEMORYSTEP;
+            lData = (long*)MemReallocate ((char*)lData, laLength*sizeof(Ptr));
+        }
+    }
+}
+
+void    _List::Duplicate (const BaseRef theRef)
+{
+    _SimpleList::Duplicate (theRef);
+    if (lData)
+        for (unsigned long i = 0; i<lLength; i++) {
+            if (((BaseRef*)lData)[i]) {
+                (((BaseRef*)lData)[i])->nInstances++;
+            }
+        }
+}
+
+bool _List::Equal(_List& l2)
+{
+    if (lLength!=l2.lLength) {
+        return false;
+    }
+
+    for (unsigned long i=0; i<lLength; i++)
+        if (!((_String*)lData[i])->Equal ((_String*)l2.lData[i])) {
+            return false;
+        }
+
+    return true;
+}
+
+long  _List::Find (BaseRef s, long startat)
+{
+    _String * st = (_String*)s;
+    for (unsigned long i = startat; i<lLength; i++) {
+        _String * sp = (_String*)(((BaseRef*)lData)[i]->toStr());
+
+        if (st->Equal(sp)) {
+            DeleteObject(sp);
+            return i;
+        }
+        DeleteObject(sp);
+    }
+    return -1;
+}
+
+long  _List::FindString (BaseRef s, long startat, bool caseSensitive, long upTo)
+{
+    char * s1, *s2;
+    long t = ((_String*)s)->sLength;
+
+    if (upTo < 0 || upTo >= lLength) {
+        upTo = lLength-1;
+    }
+
+    for (long i = startat; i<= upTo; i++) {
+        s1 = ((_String*)s)->sData;
+        if (((_String*)(((BaseRef*)lData)[i]))->sLength==t) {
+            s2 = ((_String*)(((BaseRef*)lData)[i]))->sData;
+            long j = 0;
+            if (caseSensitive)
+                for (j=0; (*s1==*s2)&&(j<t); j++,s1++,s2++) ;
+            else
+                for (j=0; (toupper(*s1)==toupper(*s2))&&(j<t); j++,s1++,s2++) ;
+
+            if (j==t) {
+                return i;
+            }
+        }
+    }
+    return -1;
+}
+
+long  _List::FreeUpMemory (long requestedBytes)
+{
+    long freed = 0;
+    for (unsigned long i = 0; i<lLength; i++) {
+        BaseRef t = ((BaseRef*)lData)[i];
+        freed+=t->FreeUpMemory(requestedBytes-freed);
+        if (freed>=requestedBytes) {
+            return freed;
+        }
+    }
+    return freed;
+}
+
+// Append & store operator
+void _List::InsertElement (BaseRef br, long insertAt, bool store)
+{
+    _SimpleList::InsertElement (br, insertAt, store);
+}
+
+void    _List::Intersect (_List& l1, _List& l2, _SimpleList* idx, _SimpleList* idx2)
+{
+    // compute the union of two sorted lists
+    // each repeat appears exactly once
+    if (lLength) {
+        Clear();
+    }
+
+    long  c1 = 0,
+          c2 = 0;
+
+    while (c1<l1.lLength && c2<l2.lLength) {
+        while (c1<l1.lLength && ((_String*)l1(c1))->Compare((_String*)l2(c2))<0) {
+            c1++;
+        }
+        if (c1==l1.lLength) {
+            break;
+        }
+
+        while (c1<l1.lLength && c2<l2.lLength &&((_String*)l1(c1))->Equal((_String*)l2(c2))) {
+            if (idx) {
+                (*idx) << c1;
+            }
+            if (idx2) {
+                (*idx2) << c2;
+            }
+
+            (*this) << l1(c1++);
+            c2++;
+        }
+        if (c1==l1.lLength || c2==l2.lLength) {
+            break;
+        }
+        while (c2<l2.lLength && ((_String*)l2(c2))->Compare((_String*)l1(c1))<0) {
+            c2++;
+        }
+    }
+}
+
+BaseRef  _List::Join (BaseRef spacer, long startAt, long endAt)
+{
+    _String *joined = new _String (256L,true);
+    if (endAt < 0) { 
+        endAt = lLength; 
+    } else if (endAt > lLength) {
+        endAt = lLength;
+    }
+
+    for (unsigned long k = MAX(0,startAt); k < endAt; k++) {
+        if (k) {
+            (*joined) << *(_String*)spacer;
+        }
+        joined->AppendNewInstance((_String*) ((BaseRef*)lData)[k]->toStr());
+    }
+
+    joined->Finalize();
+    return joined;
+}
+
+void _List::Place (BaseRef br)
+{
+//  InsertElement (br, -1, false);
+    lLength++;
+    if (lLength>laLength) {
+        laLength+=MEMORYSTEP;
+        if (lData) {
+            checkPointer (lData = (long*)MemReallocate((char*)lData, laLength*sizeof(void*)));
+        } else {
+            checkPointer (lData = (long*)MemAllocate(laLength*sizeof(void*)));
+        }
+    }
+    ((BaseRef*)lData)[lLength-1]=br;
+}
+
+//TODO: makeDynamic should be MakeDynamic to follow convention.
+BaseRef _List::makeDynamic(void)
+{
+    _List * Res = new _List;
+    checkPointer(Res);
+    //lData = nil;
+    memcpy ((char*)Res, (char*)this, sizeof (_List));
+    Res->nInstances = 1;
+    Res->lData = nil;
+    Res->Duplicate (this);
+    return Res;
+}
+
+void  _List::Replace (long index, BaseRef newObj, bool dup)
+{
+    if (index>=0 && index<lLength) {
+        DeleteObject (((BaseRef*)lData)[index]);
+        ((BaseRef*)lData)[index] = dup?newObj->makeDynamic():newObj;
+    }
+}
+
+// Char* conversion
+//TODO: toFileStr should be ToFileStr to follow convention.
+void _List::toFileStr(FILE* dest)
+{
+    fprintf (dest,"{");
+
+    for (unsigned long i = 0; (i<lLength); i++) {
+        ((BaseRef*)lData)[i]->toFileStr(dest);
+        if (i<lLength-1) {
+            fprintf (dest,",");
+        }
+    }
+    fprintf (dest,"}");
+}
+
+// Char* conversion
+//TODO: toFileStr should be ToStr to follow convention.
+BaseRef _List::toStr(void)
+{
+    _String * s = new _String((unsigned long)20*(lLength+1),true);
+
+    checkPointer (s);
+
+    (*s)<<'{';
+
+    for (unsigned long i = 0; (i<lLength); i++) {
+        _String* t = (_String*)(((BaseRef*)lData)[i]->toStr());
+        if (t) {
+            (*s)<<t;
+            DeleteObject (t);
+        }
+        if (i<lLength-1) {
+            (*s)<<',';
+        }
+    }
+    (*s)<<'}';
+    s->Finalize();
+    return s;
+}
+
+void    _List::Map (_List& target, _SimpleList& mapping) {
+    mapping.Clear();
+    if (lLength == 0) {
+        return ;
+    }
+    _List     aux;
+    _AVLListX theMapping (&aux);
+    for (unsigned long t = 0; t < target.lLength; t++) {
+        _String * s = (_String *)target.GetItem(t)->toStr();
+        theMapping.Insert (s, t);
+        //printf ("Target %ld:%s\n", t, s->sData);
+    }
+    
+    mapping.Clear();
+    for (unsigned long s = 0; s < lLength; s++) {
+        _String * s_object = (_String*)GetItem (s)->toStr();
+        //printf ("Source %ld : %s\n", s, s_object->sData);
+        long      idx = theMapping.Find (s_object);
+        if (idx >= 0) {
+            mapping << theMapping.GetXtra (idx);
+        } else {
+            mapping << -1;
+        }
+        DeleteObject (s_object);
+    }
+}
+
+
diff --git a/src/core/mathobj.cpp b/src/core/mathobj.cpp
new file mode 100644
index 0000000..5bd2967
--- /dev/null
+++ b/src/core/mathobj.cpp
@@ -0,0 +1,176 @@
+#include "parser.h"
+#include "mathobj.h"
+
+//SW: This calls the function with the opcode after it's been parsed
+_PMathObj _MathObject::Execute (long opCode, _PMathObj p, _PMathObj p2, _hyExecutionContext* context)   // execute this operation with the second arg if necessary
+{
+    switch (opCode) {
+    case HY_OP_CODE_NOT: // !
+        return LNot();
+    case HY_OP_CODE_NEQ: // !=
+        if (ObjectClass () == HY_UNDEFINED) {
+            if (p->ObjectClass () == HY_UNDEFINED)
+                return new HY_CONSTANT_FALSE;
+            else
+                return new HY_CONSTANT_TRUE;
+        }
+        if (p->ObjectClass() == NUMBER)
+            return NotEqual(p);
+        return new HY_CONSTANT_TRUE;
+    case HY_OP_CODE_IDIV: // $
+        return longDiv(p);
+    case HY_OP_CODE_MOD: // %
+        return lDiv(p);
+    case HY_OP_CODE_AND: // &&
+        return LAnd(p);
+    case HY_OP_CODE_MUL: // *
+        if (p)
+            return Mult(p);
+        break;
+    case HY_OP_CODE_ADD: // +
+        if (p) 
+            return Add(p);
+        return Sum ();
+    case HY_OP_CODE_SUB: // -
+        if (p) 
+            return Sub(p);
+        return Minus();
+        break;
+    case HY_OP_CODE_DIV: // /
+        return Div(p);
+    case HY_OP_CODE_LESS: // <
+        return Less(p);
+    case HY_OP_CODE_LEQ: // <=
+        return LessEq(p);
+    case HY_OP_CODE_EQ: // ==
+        {
+            if (ObjectClass () == HY_UNDEFINED) {
+                if (p->ObjectClass () == HY_UNDEFINED)
+                    return new HY_CONSTANT_TRUE;
+                else
+                    return new HY_CONSTANT_FALSE;
+            }
+            if (p->ObjectClass() == NUMBER)
+                return AreEqual(p);
+            return new HY_CONSTANT_FALSE;
+        }
+        break;
+    case HY_OP_CODE_GREATER: // >
+        return Greater(p);
+    case HY_OP_CODE_GEQ: // >=
+        return GreaterEq(p);
+    case HY_OP_CODE_ABS: // Abs
+        return Abs();
+    case HY_OP_CODE_ARCTAN: // Arctan
+        return Arctan();
+    case HY_OP_CODE_BETA: // Beta
+        return Beta(p);
+    case HY_OP_CODE_CCHI2: // CChi2
+        return CChi2(p);
+    case HY_OP_CODE_CGAMMADIST: // CGammaDist
+        return CGammaDist(p,p2);
+    case HY_OP_CODE_COS: // Cos
+        return Cos();
+    case HY_OP_CODE_COLUMNS: // Columns
+    case HY_OP_CODE_ROWS: // Rows
+        return new _Constant (0.0);
+    case HY_OP_CODE_ERF: // Erf
+        return Erf();
+    case HY_OP_CODE_EVAL:
+        return (_PMathObj)Compute()->makeDynamic();
+    case HY_OP_CODE_EXP: // Exp
+        return Exp();
+    case HY_OP_CODE_FORMAT: // Format
+        return FormatNumberString(p,p2);
+    case HY_OP_CODE_GAMMA: // Gamma
+        return Gamma();
+    case HY_OP_CODE_GAMMADIST: // GammaDist
+        return GammaDist(p,p2);
+    case HY_OP_CODE_IBETA: // IBeta
+        return IBeta(p,p2);
+    case HY_OP_CODE_IGAMMA: // IGamma
+        return IGamma(p);
+    case HY_OP_CODE_INVCHI2: // InvChi2
+        return InvChi2(p);
+    case HY_OP_CODE_LNGAMMA: // LnGamma
+        return LnGamma();
+    case HY_OP_CODE_LOG: // Log
+        return Log();
+    case HY_OP_CODE_MAX: // Max
+        return Max(p);
+    case HY_OP_CODE_MIN: // Min
+        return Min(p);
+    case HY_OP_CODE_RANDOM: // Random
+        return Random(p);
+    case HY_OP_CODE_SIMPLEX: // Simplex
+        return Simplex();
+    case HY_OP_CODE_SIN: // Sin
+        return Sin();
+    case HY_OP_CODE_SQRT: // Sqrt
+        return Sqrt();
+    case HY_OP_CODE_TAN: // Tan
+        return Tan();
+    case HY_OP_CODE_TIME: // Time
+        return Time();
+    case HY_OP_CODE_TYPE: // Type
+        return Type();
+    case HY_OP_CODE_ZCDF: // ZCDF
+        return ZCDF();
+    case HY_OP_CODE_POWER: // ^
+        if (p)
+            return Raise(p);
+        break;
+    case HY_OP_CODE_OR: // ||
+        return LOr(p);
+    }
+    WarnNotDefined (this, opCode,context);
+    return new _MathObject;
+}
+
+//__________________________________________________________________________________
+
+BaseRef _MathObject::makeDynamic (void)
+{
+    return(_PMathObj)checkPointer(new _MathObject);
+}
+
+//SW: Why do we need a string for the type?
+_PMathObj _MathObject::Type (void)
+{
+    _FString * ts = new _FString();
+    switch (ObjectClass()) {
+
+    case NUMBER:
+        *(ts->theString)="Number";
+        break;
+    case MATRIX:
+        *(ts->theString)="Matrix";
+        break;
+    case CONTAINER:
+        *(ts->theString)="Container";
+        break;
+    case TREE_NODE:
+        *(ts->theString)="TreeNode";
+        break;
+    case TREE:
+        *(ts->theString)="Tree";
+        break;
+    case STRING:
+        *(ts->theString)="String";
+        break;
+    case ASSOCIATIVE_LIST:
+        *(ts->theString)="AssociativeList";
+        break;
+    case TOPOLOGY:
+        *(ts->theString)="Topology";
+        break;
+    case POLYNOMIAL:
+        *(ts->theString)="Polynomial";
+        break;
+    default:
+        *(ts->theString) = "Unknown";
+
+    }
+
+    return ts;
+}
diff --git a/src/core/matrix.cpp b/src/core/matrix.cpp
new file mode 100644
index 0000000..4f22876
--- /dev/null
+++ b/src/core/matrix.cpp
@@ -0,0 +1,9914 @@
+/*
+
+HyPhy - Hypothesis Testing Using Phylogenies.
+
+Copyright (C) 1997-2009
+  Sergei L Kosakovsky Pond (spond at ucsd.edu)
+  Art FY Poon              (apoon at cfenet.ubc.ca)
+
+Permission is hereby granted, free of charge, to any person obtaining a
+copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be included
+in all copies or substantial portions of the Software.
+
+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.
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+*/
+
+#include <stdlib.h>
+#include <string.h>
+#include <stdio.h>
+#include <time.h>
+#include <float.h>
+#include <math.h>
+#include <limits.h>
+
+#include "batchlan.h"
+#include "polynoml.h"
+#include "likefunc.h"
+
+#include "avllist.h"
+#include "avllistx.h"
+#include "avllistxl.h"
+
+#ifdef    __HYPHYDMALLOC__
+    #include "dmalloc.h"
+#endif
+
+/*SLKP 20110209; include progress report updates */
+#if !defined __UNIX__ && !defined __HEADLESS__
+#include "HYConsoleWindow.h"
+#endif
+/*SLKP*/
+
+//#include "profiler.h"
+
+#define MEMORYERROR "Out of Memory"
+#define ZEROOBJECT  0.0
+#define ZEROPOINTER nil
+
+
+_String     MATRIX_AGREEMENT            = "CONVERT_TO_POLYNOMIALS",
+            ANAL_COMP_FLAG              = "ANALYTIC_COMPUTATIONS",
+            ANAL_MATRIX_TOLERANCE      = "ANAL_MATRIX_TOLERANCE",
+            USE_JSON_FOR_MATRIX      = "USE_JSON_FOR_MATRIX",
+            PROFILE_MEAN_VAR_MULT      = "PROFILE_MEAN_VAR_MULT",
+            CACHE_FORMULA_DEPENDANCY  = "CACHE_FORMULA_DEPENDANCY",
+            BRANCH_LENGTH_STENCIL      = "BRANCH_LENGTH_STENCIL",
+            AVL_ITERATOR_ORDER          = "INDEXORDER",
+            AVL_ITERATOR_ORDER_VALUE    = "VALUEINDEXORDER";
+
+int _Matrix::precisionArg = 0;
+int _Matrix::storageIncrement = 16;
+//  percent of total size (reasonable values divide 100)
+int _Matrix::switchThreshold = 40;
+
+#ifndef     __HYALTIVEC__
+_Parameter  _Matrix::truncPrecision = 1e-13;
+#define     MatrixMemAllocate(X) MemAllocate(X)
+#define     MatrixMemFree(X)     free(X)
+#else
+#define     MatrixMemAllocate(X) VecMemAllocate(X)
+#define     MatrixMemFree(X)     vec_free(X)
+extern      vector float VECTOR_ZERO;
+_Parameter  _Matrix::truncPrecision = 1e-8;
+#endif
+
+_Parameter  analMatrixTolerance = 1e-6,
+            zero = 0,
+            ANALYTIC_COMPUTATION_FLAG = 0,
+            AUTO_PAD_DIAGONAL = 1,
+            toPolyOrNot=0.0,
+            toMorNot2M=1.0;
+
+
+_List       builtInMatrixFunctions;
+
+_Matrix     *GlobalFrequenciesMatrix;
+
+long        matrixExpCount = 0,
+            taylorTermsCount = 0,
+            squaringsCount = 0,
+            non0count = 0;
+
+extern      _String         printDigitsSpec;
+
+_Trie        _HY_MatrixRandomValidPDFs;
+
+//__________________________________________________________________________________
+
+int         fexact_                 (long , long , double *, double , double , double , double *, double *);
+void        MatrixIndexError        (long, long, long, long);
+
+
+// function prototypes
+_Parameter  lnGamma (_Parameter),
+            gammaDeviate (double, double = 1.);
+
+
+//__________________________________________________________________________________________________________
+_Parameter  lnGamma(_Parameter theValue)
+{
+    //  Returns Log(gamma(x))
+    if (theValue <= 0) {
+        _String oops ("ERROR (matrix.cpp): Requested lnGamma(x) for x <= 0.");
+        WarnError (oops);
+
+        return 0.;
+    }
+
+    static _Parameter lngammaCoeff [6] = {   76.18009172947146,
+                                         -86.50532032941677,
+                                         24.01409824083091,
+                                         -1.231739572450155,
+                                         0.1208650973866179e-2,
+                                         -0.5395239384953e-5
+                                         };
+
+    static _Parameter lookUpTable [20] = {   0.       ,  0.       ,  0.6931472,  1.7917595,  3.1780538,
+                                         4.7874917,  6.5792512,  8.5251614, 10.6046029, 12.8018275,
+                                         15.1044126, 17.5023078, 19.9872145, 22.5521639, 25.1912212,
+                                         27.8992714, 30.6718601, 33.5050735, 36.3954452, 39.3398842
+                                         };
+
+    // use look-up table for small integer values
+    if (theValue <= 20 && (theValue - (long)theValue) == 0.) {
+        return (lookUpTable [(long) theValue - 1]);
+    }
+
+    // else do it the hard way
+    _Parameter  x, y, tmp, ser;
+
+    y = x = theValue;
+    tmp = x + 5.5;
+    tmp -= (x+0.5) * log(tmp);
+    ser = 1.000000000190015;
+
+    for (long j = 0; j <= 5; j++) {
+        ser += lngammaCoeff[j] / ++y;
+    }
+
+    return (-tmp + log(2.506628274631005*ser/x));
+}
+
+
+//___________________________________________________________________________________________
+_Parameter  gaussDeviate (void)
+{
+    /*
+     Use Box-Muller transform to generate random deviates from Gaussian distribution with
+     zero mean and unit variance (Numerical Recipes).
+     */
+
+    static int      iset = 0;
+    static double   gset;
+    double          fac, rsq, v1, v2;
+
+    if (iset == 0) {
+        do {
+            v1 = 2.0 * genrand_real2() - 1.0;   // uniform random number on (0,1), i.e. no endpoints
+            v2 = 2.0 * genrand_real2() - 1.0;
+            rsq = v1*v1 + v2*v2;
+        } while (rsq >= 1.0 || rsq == 0.0);
+
+        fac = sqrt(-2.0 * log(rsq)/rsq);
+        gset = v1 * fac;
+        iset = 1;           // set flag to indicate second deviate available
+
+        return (_Parameter) (v2 * fac);
+    } else {
+        iset = 0;
+        return (_Parameter) gset;       // use second deviate
+    }
+}
+
+
+//__________________________________________________________________________________________________________
+_Parameter  exponDeviate (void)
+{
+    return -log(1.0-genrand_real2());   // uniform random number on interval (0,1]
+}
+
+
+
+//__________________________________________________________________________________________________________
+_Parameter  gammaDeviate (double a, double scale)
+{
+    /* -----------------------------------------
+     GS algorithm from GNU GPL rgamma.c
+     *  Mathlib : A C Library of Special Functions
+     *  Copyright (C) 1998 Ross Ihaka
+     *  Copyright (C) 2000--2008 The R Development Core Team
+
+     * Ziggurat algorithm from Marsaglia and Tsang (2000) "A Simple Method
+     *  for Generating Gamma Variables" ACM Trans Math Soft 26(3) 363-372
+     ----------------------------------------- */
+
+    const static double exp_m1 = 0.36787944117144232159;    /* exp(-1) = 1/e */
+
+    double              e, x, p;
+
+    if (a < 0.0) {
+        ReportWarning ("NaN in gammaDeviate()");
+        return 0.;
+    } else if (a == 0.0) {
+        return 0.;
+    } else if (a < 1.0) {   // GS algorithm for parameters 0 < a < 1
+        if(a == 0) {
+            return 0.;
+        }
+
+        e = 1.0 + exp_m1 * a;
+
+        while (1) {
+            p = e * genrand_real2();    // should be uniform random number on open interval (0,1)
+            // but genrand_real3 scoping (baseobj.cpp) is insufficient
+            if (p >= 1.0) {
+                x = -log((e - p) / a);
+                if (exponDeviate() >= (1.0 - a) * log(x)) {
+                    break;
+                }
+            } else {
+                x = exp(log(p) / a);
+                if (exponDeviate() >= x) {
+                    break;
+                }
+            }
+        }
+
+        return x*scale;
+    }
+
+    else if (a == 1.0) {
+        return exponDeviate() * scale;
+    }
+
+    else {  // a > 1., Ziggurat algorithm
+        double  x, v, u,
+                d   = a - 1./3.,
+                c = 1. / sqrt(9.*d);
+
+        for (;;) {
+            do {
+                x = gaussDeviate();
+                v = 1. + c * x;
+            } while (v <= 0.);
+
+            v = v * v * v;
+            u = genrand_real2();
+
+            if (u < 1. - 0.0331 * (x*x)*(x*x) ) {
+                return (d * v * scale);
+            }
+
+            if ( log(u) < 0.5*x*x + d*(1.-v+log(v)) ) {
+                return (d * v * scale);
+            }
+        }
+    }
+}
+
+
+
+//__________________________________________________________________________________
+_Parameter  chisqDeviate (double df)
+{
+    if (df < 0.0) {
+        WarnError (_String("ERROR in chisqDeviate(): require positive degrees of freedom"));
+        return 0;
+    }
+
+    return gammaDeviate(df/2.0, 2.0);   // chi-square distribution is special case of gamma
+}
+
+
+
+//__________________________________________________________________________________
+
+void    MatrixIndexError (long hPos, long vPos, long hDim, long vDim)
+{
+    _String errMsg ("Invalid Matrix Index [");
+    errMsg = errMsg & _String ((long)hPos) & "][" & _String ((long)vPos) &
+             "] in a " &_String (hDim) & " by " &_String (vDim) & " matrix.";
+    WarnError (errMsg);
+}
+
+
+
+//_____________________________________________________________________________________________
+
+inline  bool    _Matrix::IsNonEmpty  (long logicalIndex)
+{
+    return  (theIndex?theIndex [logicalIndex]!=-1:(storageType!=1?GetMatrixObject(logicalIndex)!=ZEROPOINTER:true));
+}
+
+//__________________________________________________________________________________
+
+bool        _Matrix::HasChanged(void)
+{
+    if (storageType == 2) {
+        _Formula* theF, **theFormulae = (_Formula**)theData;
+        if (theIndex) {
+            for (long i=0; i<lDim; i++) {
+                if (IsNonEmpty(i)) {
+                    theF = theFormulae[i];
+                    if (theF->HasChanged()) {
+                        return true;
+                    }
+                }
+            }
+        } else {
+            for (long i=0; i<lDim; i++) {
+                theF = theFormulae[i];
+                if ((theF!=(_Formula*)ZEROPOINTER)&&(theF->HasChanged())) {
+                    return true;
+                }
+            }
+        }
+
+    } else if (storageType == 0) {
+        _MathObject *theO, **objData=(_MathObject**)theData;
+        if (theIndex) {
+            for (long i=0; i<lDim; i++) {
+                if (IsNonEmpty(i)) {
+                    if (objData[i]->HasChanged()) {
+                        return true;
+                    }
+                }
+            }
+        } else {
+            for (long i=0; i<lDim; i++) {
+                theO = objData[i];
+                if (theO&&theO->HasChanged()) {
+                    return true;
+                }
+            }
+        }
+
+    } else if (storageType == 3) {
+        if (cmd->has_volatile_entries) return true;
+    
+        for (unsigned long vid = 0; vid < cmd->varIndex.lLength; vid++) {
+            if (((_Variable*)(((BaseRef*)(variablePtrs.lData))[cmd->varIndex.lData[vid]]))->HasChanged ())
+                return true;
+        }
+        // SLKP 20120404 need to add a check for "volatile" formulae, i.e. Time and Random
+        /*for (long fid = 0; fid < cmd->formulasToEval.lLength; fid++)
+            if (((_Formula*)cmd->formulasToEval.lData[fid])->HasChangedSimple(cmd->varIndex)) {
+                return true;
+            }*/
+    }
+    return false;
+}
+//__________________________________________________________________________________
+
+
+inline static void ROTATE(_Parameter * a, long i, long j, long k, long l, _Parameter & g, _Parameter & h, _Parameter s, _Parameter tau, long hDim)
+{
+    g = a[i*hDim + j];
+    h = a[k*hDim + l];
+    a[i*hDim + j] = g - s*(h + g*tau);
+    a[k*hDim + l] = h + s*(g - h*tau);
+}
+
+//__________________________________________________________________________________
+void        _Matrix::Balance (void)
+{
+    if (storageType!=1 || hDim!=vDim || hDim==0) { // only works for numerical matrices at this stage
+        _String errorMsg ("Balance only works with numerical non-empty square dense matrices");
+        WarnError (errorMsg);
+        return;
+    }
+
+    _Parameter       Squared_Radix = 2.0 * 2.0;
+
+    bool             done = false;
+
+    while (!done) {
+        done = true;
+
+        for (long i = 0; i < hDim; i++) {
+            _Parameter r = 0.0,
+                       c = 0.0;
+
+            for (long j = 0; j < vDim; j++)
+                if (i!=j) {
+                    r += fabs (theData[i*vDim+j]);
+                    c += fabs (theData[j*vDim+i]);
+                }
+
+            if (r > 0.0 && c > 0.0) {
+                _Parameter g = r / Squared_Radix,
+                           f = 1.,
+                           s = c+r;
+
+                while (c<g) {
+                    f *= 2.0;
+                    c *= Squared_Radix;
+                }
+
+                g = r * 2.0;
+
+                while (c>g) {
+                    f /= 2.0;
+                    c /= Squared_Radix;
+                }
+
+                if ((c+r)/f < 0.95*s) {
+                    done = false;
+                    g = 1. / f;
+                    for (long j = 0; j < vDim; j++) {
+                        theData[i*vDim+j] *= g;
+                        theData[j*vDim+i] *= f;
+                    }
+                }
+
+            }
+        }
+    }
+}
+
+//__________________________________________________________________________________
+void        _Matrix::Schur (void)
+{
+    if (storageType!=1 || hDim!=vDim || hDim==0) { // only works for numerical matrices at this stage
+        _String errorMsg ("Hessenberg only works with numerical non-empty square dense matrices");
+        WarnError (errorMsg);
+        return;
+    }
+
+    for (long m = 1; m < hDim-1; m++) {
+        _Parameter x = 0.0;
+        long       i = m;
+
+        for (long j = m; j < hDim; j++)
+            if (fabs (theData[j*vDim + m-1]) > x) {
+                x = theData[j*vDim + m-1];
+                i = j;
+            }
+
+        if (i!=m) {
+            for (long j=m-1; j<hDim; j++) {
+                _Parameter t = theData[i*vDim + j];
+                theData[i*vDim + j] = theData[m*vDim + j];
+                theData[m*vDim + j] = t;
+            }
+            {
+                for (long j=0; j<hDim; j++) {
+                    _Parameter t = theData[j*vDim + i];
+                    theData[j*vDim + i] = theData[j*vDim + m];
+                    theData[j*vDim + m] = t;
+                }
+            }
+        }
+
+        if (x)
+            for (long i = m+1; i < hDim; i++) {
+                _Parameter y = theData[i*vDim + m -1];
+                if (y != 0.0) {
+                    y /= x;
+                    theData[i*vDim + m -1] = y;
+                    for (long j = m; j < hDim; j++) {
+                        theData[i*vDim+j] -= y*theData[m*vDim+j];
+                    }
+                    {
+                        for (long j = 0; j < hDim; j++) {
+                            theData[j*vDim+m] += y*theData[j*vDim+i];
+                        }
+                    }
+                }
+            }
+    }
+
+    for (long r = 2; r < hDim; r++)
+        for (long c = 0; c<r-1; c++) {
+            theData[r*hDim+c] = 0.0;
+        }
+
+}
+
+//__________________________________________________________________________________
+
+#define MX_ACCESS(a,b) theData[(a)*hDim+(b)]
+
+//__________________________________________________________________________________
+void        _Matrix::EigenDecomp (_Matrix& real, _Matrix & imag)
+{
+    if (storageType!=1 || hDim!=vDim || hDim==0) { // only works for numerical matrices at this stage
+        _String errorMsg ("EigenDecomp only works with numerical non-empty square dense matrices");
+        WarnError (errorMsg);
+        return;
+    }
+
+    _Parameter anorm = 0.0;
+
+    for (long k = 0; k < hDim; k++)
+        for (long k2 = k?k-1:0; k2 < hDim; k2++) {
+            anorm += fabs (MX_ACCESS(k,k2));
+        }
+
+    long        nn = hDim - 1;
+    _Parameter  t  = 0;
+
+    CreateMatrix (&real, hDim, 1, false, true, false);
+    CreateMatrix (&imag, hDim, 1, false, true, false);
+
+    while (nn >= 0) {
+        long its = 0,
+             l   = 0;
+        do {
+            for (l = nn; l>=1; l--) {
+                _Parameter s = fabs (MX_ACCESS(l-1,l-1)) + fabs (MX_ACCESS(l,l));
+                if (s == 0.0) {
+                    s = anorm;
+                }
+
+                if (fabs (MX_ACCESS(l,l-1)) + s == s) {
+                    break;
+                }
+            }
+
+            _Parameter x = MX_ACCESS(nn,nn);
+            if (l  == nn) { // one root
+                real.theData[nn]   = x + t;
+                imag.theData[nn--] = 0.0;
+            } else {
+                _Parameter y = MX_ACCESS(nn-1,nn-1),
+                           w = MX_ACCESS(nn,nn-1)*MX_ACCESS(nn-1,nn);
+
+                if ( l == nn - 1) { // two roots
+                    _Parameter p = 0.5 * (y-x),
+                               q = p*p + w,
+                               z = sqrt (fabs(q));
+
+                    x += t;
+
+                    if (q >= 0.0) { // real pair
+                        z = p + (p>0.0?z:-z);
+                        real.theData[nn] = real.theData[nn-1] = x+z;
+                        if (z) {
+                            real.theData[nn] = x-w/z;
+                        }
+                        imag.theData[nn] = imag.theData[nn-1] = 0.0;
+                    } else { // complex pair
+                        real.theData[nn]   = real.theData [nn-1] = x+p;
+                        imag.theData[nn-1] = -(imag.theData[nn] = z);
+                    }
+                    nn -= 2;
+                } else { // no roots; continue iteration
+
+                    _Parameter p,q,r,z,s;
+
+                    if (its == 30) {
+                        _String errMsg ("Too many QR iterations in EigenDecomp");
+                        WarnError (errMsg);
+                        return;
+                    }
+
+                    if (its == 10 || its == 20) {
+                        t += x;
+                        for (long i=0; i<hDim; i++) {
+                            MX_ACCESS(i,i) -= x;
+                        }
+                        _Parameter s = fabs(MX_ACCESS(nn,nn-1)) + fabs (MX_ACCESS(nn-1,nn-2));
+                        y = x = 0.75 * s;
+                        w = -0.4375*s*s;
+                    }
+                    its++;
+
+                    long m = nn-2;
+
+                    for (; m>=l; m--) {
+                        z = MX_ACCESS(m,m);
+                        r = x-z;
+                        s = y-z;
+                        p = (r*s - w)/MX_ACCESS(m+1,m) + MX_ACCESS(m,m+1);
+                        q = MX_ACCESS(m+1,m+1)-z-r-s;
+                        r = MX_ACCESS(m+2,m+1);
+                        s = fabs (p) + fabs (q) + fabs (r);
+
+                        p/=s;
+                        q/=s;
+                        r/=s;
+
+                        if (m == l) {
+                            break;
+                        }
+
+                        _Parameter u = fabs (MX_ACCESS(m,m-1)) * (fabs (q) + fabs (r)),
+                                   v = fabs (p) * (fabs (MX_ACCESS(m-1,m-1)) + fabs(z) + fabs(MX_ACCESS(m+1,m+1)));
+
+                        if (u+v == v) {
+                            break;
+                        }
+
+                    }
+
+                    for (long i = m+2; i<hDim; i++) {
+                        MX_ACCESS(i,i-2) = 0.0;
+                        if (i!=m+2) {
+                            MX_ACCESS(i,i-3) = 0.0;
+                        }
+                    }
+
+                    for (long k = m; k <= nn-1; k++) {
+                        if (k!=m) {
+                            p = MX_ACCESS(k,k-1),
+                            q = MX_ACCESS(k+1,k-1),
+                            r = 0.0;
+                            if (k != nn-1) {
+                                r = MX_ACCESS(k+2,k-1);
+                            }
+
+                            if ((x = fabs(p) + fabs(q) + fabs(r)) != 0.0) {
+                                p /= x;
+                                q /= x;
+                                r /= x;
+                            }
+                        }
+
+                        s = sqrt (p*p+q*q+r*r);
+
+                        if (s != 0.0) {
+                            if (p < 0.0) {
+                                s = -s;
+                            }
+
+                            if (k == m) {
+                                if (l!=m) {
+                                    MX_ACCESS(k,k-1) = -MX_ACCESS(k,k-1);
+                                }
+                            } else {
+                                MX_ACCESS(k,k-1) = -s*x;
+                            }
+
+                            p += s;
+                            x = p/s;
+                            y = q/s;
+                            z=r/s;
+                            q/=p;
+                            r/=p;
+                            for (long j=k; j<=nn; j++) {
+                                p = MX_ACCESS(k,j)+q*MX_ACCESS(k+1,j);
+                                if (k!=nn-1) {
+                                    p += r*MX_ACCESS(k+2,j);
+                                    MX_ACCESS(k+2,j) -= p*z;
+                                }
+                                MX_ACCESS(k+1,j) -= p*y;
+                                MX_ACCESS(k,j)   -= p*x;
+                            }
+
+                            long mmin = nn < k+3 ? nn: k+3;
+                            for (long i = 0; i<=mmin; i++) {
+                                p = x*MX_ACCESS(i,k) + y*MX_ACCESS(i,k+1);
+                                if (k!=nn-1) {
+                                    p += z*MX_ACCESS(i,k+2);
+                                    MX_ACCESS(i,k+2) -= p*r;
+                                }
+                                MX_ACCESS(i,k+1) -= p*q;
+                                MX_ACCESS(i,k) -= p;
+                            }
+                        }
+                    }
+                }
+            }
+
+        } while (l < nn - 1);
+    }
+
+}
+
+//__________________________________________________________________________________
+_PMathObj   _Matrix::Eigensystem (void)
+{
+    // find the eigenvectors of a symmetric matrix using Jacobi rotations
+    // The original matrix is preserved.
+    // returns an associative list with a sorted vector of eigenvalues and
+    // a square matrix where columns are the corresponding eigenvalues
+
+    if ((storageType!=1)||(hDim!=vDim)||(hDim==0)) { // only works for numerical matrices at this stage
+        _String errorMsg ("Eigensystem only works with numerical non-empty square matrices");
+        WarnError (errorMsg);
+        return    new _AssociativeList();
+    }
+
+    // check for symmetry
+
+    for (long k=0; k<hDim; k++) {
+        for (long v=k+1; v<hDim; v++) {
+            if (!CheckEqual((*this)(k,v), (*this)(v,k))) {
+                //_String errorMsg ("Eigensystem presently only works on symmetric matrices");
+                //WarnError (errorMsg);
+                //return      new _AssociativeList();
+
+                //_String nonSym = _String("Failed symmetry check:" ) & k & ":" & v;
+                //WarnError (nonSym);
+
+                _AssociativeList * res = new _AssociativeList;
+
+                _Matrix            *cpy = new _Matrix (*this),
+                *rl  = new _Matrix,
+                *im  = new _Matrix;
+
+                _String            key ("0");
+
+                cpy->CheckIfSparseEnough(true);
+
+                checkPointer (cpy);
+                cpy->Balance ();
+                cpy->Schur   ();
+                cpy->EigenDecomp (*rl,*im);
+
+                key = "0";
+                {
+                    _FString fk (key, false);
+                    res->MStore (&fk, rl, false);
+                }
+                key = "1";
+                {
+                    _FString fk (key, false);
+                    res->MStore (&fk, im, false);
+                }
+                key = "2";
+                DeleteObject (cpy);
+                return res;
+            }
+        }
+    }
+    _Matrix a (*this);
+    a.CheckIfSparseEnough (true);
+
+    _Parameter* b = new _Parameter[hDim],
+    *   z = new _Parameter[hDim];
+
+    _Matrix * d = new _Matrix(hDim,1,false, true),
+    * v = new _Matrix(hDim,hDim,false,true);
+
+    checkPointer ((Ptr)(b && z && d && v));
+
+    for (long cnt = 0, diagIndex=0; cnt < hDim; cnt ++, diagIndex+=hDim+1) {
+        v->theData[diagIndex] = 1.;
+        b[cnt] = (d->theData[cnt] = a.theData [diagIndex]);
+        z[cnt] = 0.0;
+    }
+
+    for (long pass = 0; pass < 50; pass ++) {
+        _Parameter sm = 0.,
+                   tresh = 0.;
+
+        {
+            for (long ec = 0; ec < hDim-1; ec ++)
+                for (long ec2 = ec+1; ec2 < hDim; ec2++) {
+                    sm += fabs(a.theData[ec*hDim+ec2]);
+                }
+        }
+
+        if (sm == 0.0) {
+            break;
+        }
+
+        if (pass < 3) {
+            tresh = 0.2 * sm / (hDim*hDim);
+        }
+
+        for (long ec=0; ec < hDim-1; ec++) {
+            for (long ec2=ec+1; ec2 < hDim; ec2++) {
+                long       midx = ec*hDim+ec2;
+
+                _Parameter mel = a.theData[midx],
+                           g   = 100. * fabs (mel),
+                           t   = fabs (d->theData[ec]),
+                           c   = fabs (d->theData[ec2]);
+
+                if (pass>3 && t+g == t && c+g == c) {
+                    a.theData[midx] = 0.;
+                } else if (fabs(mel) > tresh) {
+                    _Parameter h = d->theData[ec2]-d->theData[ec];
+                    if (fabs (h) + g == fabs (h)) {
+                        t = mel/h;
+                    } else {
+                        _Parameter theta = 0.5*h/mel;
+                        t = 1./(fabs(theta)+sqrt(1.+theta*theta));
+                        if (theta<0.0) {
+                            t = -t;
+                        }
+                    }
+
+                    c = 1.0/sqrt(1.0+t*t);
+
+                    _Parameter s    = t*c;
+                    _Parameter tau  = s/(1.0+c);
+
+                    h = t*mel;
+
+                    z[ec]           -= h;
+                    z[ec2]          += h;
+                    d->theData[ec]  -= h;
+                    d->theData[ec2] += h;
+
+                    /*_String checkV = (c*c-s*s)*mel + s*c*(a.theData[ec*hDim+ec]-a.theData[ec2*hDim+ec2]);
+                    StringToConsole (checkV);
+                    BufferToConsole ("\n");*/
+
+                    a.theData[midx] = 0.;
+
+                    for (long j=0; j<ec; j++) {
+                        ROTATE (a.theData, j, ec, j, ec2, g, h, s, tau, hDim);
+                    }
+
+                    {
+                        for (long j=ec+1; j<ec2; j++) {
+                            ROTATE (a.theData, ec, j, j, ec2, g, h, s, tau, hDim);
+                        }
+                    }
+                    {
+                        for (long j=ec2+1; j<hDim; j++) {
+                            ROTATE (a.theData, ec, j, ec2, j, g, h, s, tau, hDim);
+                        }
+                    }
+                    {
+                        for (long j=0; j<hDim; j++) {
+                            ROTATE (v->theData, j, ec, j, ec2, g, h, s, tau, hDim);
+                        }
+                    }
+                }
+            }
+        }
+        {
+            for (long ec=0; ec<hDim; ec++) {
+                b[ec] += z[ec];
+                d->theData[ec] = b[ec];
+                z[ec] = 0.;
+            }
+        }
+    }
+
+
+
+    _Matrix * ds = new _Matrix(hDim,2,false, true),
+    * vs = new _Matrix(hDim,hDim,false,true),
+    * dss;
+
+    for (long r=0; r<hDim; r++) {
+        ds->theData[2*r]   = -d->theData[r];
+        ds->theData[2*r+1] = r;
+    }
+
+    _Constant sc (0.0);
+    dss = (_Matrix*)ds->SortMatrixOnColumn (&sc);
+    DeleteObject (ds);
+    {
+        for (long r=0; r<hDim; r++) {
+            d->theData[r] = -dss->theData[2*r];
+            for (long c1 = r, c2 = dss->theData[2*r+1]; c1<hDim*hDim; c1+=hDim, c2+=hDim) {
+                vs->theData[c1] = v->theData[c2];
+            }
+        }
+    }
+
+    _AssociativeList * res = new _AssociativeList ();
+    checkPointer (res);
+
+    _String            key ("0");
+
+    {
+        _FString fk (key, false);
+        res->MStore (&fk, d, false);
+    }
+
+    key = "1";
+
+    {
+        _FString fk (key, false);
+        res->MStore (&fk, vs, false);
+    }
+
+    DeleteObject (v);
+    //DeleteObject (d);
+    DeleteObject (dss);
+    //DeleteObject (vs);
+
+    delete [] b;
+    delete [] z;
+
+
+    return res;
+}
+
+//__________________________________________________________________________________
+_PMathObj   _Matrix::LUDecompose (void)
+{
+    // perform the LU decomposition using Crout's algorithm with partial pivoting
+    // The original matrix is preserved.
+    // after performing this decomposition, the routine LUSolve can be called with an arbitrary vector
+    // the return object is an nx(n+1) matrix which contains the LU decomposition followed
+    // by a vector of row interchanges
+    if (storageType!=1 || hDim!=vDim || hDim==0) { // only works for numerical matrices at this stage
+        _String errorMsg ("LUDecompose only works with numerical non-empty square matrices");
+        WarnError (errorMsg);
+        return    new _Matrix();
+    }
+
+    _Parameter *        scalings = new _Parameter[hDim];
+    checkPointer        (scalings);
+
+    long perRow = vDim+1;
+    _Matrix * result = new _Matrix (hDim,perRow,false,true);
+
+    checkPointer (result);
+    // duplicate the original matrix into result
+    if (theIndex) //matrix is sparse
+        for (long i=0; i<lDim; i++) {
+            if (IsNonEmpty(i)) {
+                long maxRow = theIndex[i];
+                result->Store(maxRow/vDim,maxRow%vDim,theData[i]);
+            }
+        }
+    else
+        for (long i=0; i<hDim; i++) {
+            long maxRow = i*vDim;
+            for (long j=0; j<vDim; j++) {
+                result->theData[maxRow+i+j]=theData[maxRow+j];
+            }
+        }
+
+    // produce the scaling vector used in interchanging the rows
+    for (long i=0; i<vDim; i++) {
+        _Parameter rowMax = 0.0,
+                   cell;
+
+        for (long j=i*perRow; j<(i+1)*perRow-1; j++)
+            if ((cell=fabs(result->theData[j]))>rowMax) {
+                rowMax = cell;
+            }
+
+        if (rowMax==0.0) {
+            _String errorMsg = _String("LUDecompose doesn't work on singular matrices (row ") & i & ')';
+            WarnError (errorMsg);
+            return    nil;
+        }
+        scalings[i]=1.0/rowMax;
+    }
+    // main loop for finding L and U
+
+    for (long j=0; j<vDim; j++) {
+        {
+            for (long i=0; i<j; i++) {
+                // fill in superdiagonal elements (U) in column j
+                _Parameter sum = result->theData[i*perRow+j];
+                for (long k=0; k<i; k++) {
+                    sum -= result->theData[i*perRow+k]*result->theData[k*perRow+j];
+                }
+                result->theData[i*perRow+j] = sum;
+            }
+        }
+        long       maxRow = 0;
+        _Parameter rowMax = 0.0,
+                   cell;
+
+        for (long i=j; i<hDim; i++) {
+            // calculate the unscaled version of elements of L and the diagonal
+            _Parameter sum = result->theData[i*perRow+j];
+
+            for (long k=0; k<j; k++) {
+                sum -= result->theData[i*perRow+k]*result->theData[k*perRow+j];
+            }
+
+            result->theData[i*perRow+j]=sum;
+
+            if ((cell=scalings[i]*fabs(sum))>= rowMax) { // find max under the diagonal in column j
+                rowMax = cell;
+                maxRow = i;
+            }
+        }
+
+        if (j!=maxRow) { // interchange rows
+            for (long k=0; k<hDim; k++) {
+                cell                                    =   result->theData[maxRow*perRow+k];
+                result->theData[maxRow*perRow+k]        =   result->theData[j*perRow+k];
+                result->theData[j*perRow+k]             =   cell;
+            }
+            scalings[maxRow]=scalings[j];
+        }
+        // store the index permutation
+        result->theData[j*perRow+vDim] = maxRow;
+
+        if (result->theData[j*perRow+j]==0.0) {
+            result->theData[j*perRow+j] = 1.0e-25;
+        }
+
+        // divide by the pivoting element
+
+        if (j!=hDim-1) {
+            cell = 1.0/result->theData[j*perRow+j];
+            for (long i=j+1; i<hDim; i++) {
+                result->theData[i*perRow+j]*=cell;
+            }
+        }
+    }
+    delete [] scalings;
+    return result;
+}
+//__________________________________________________________________________________
+_PMathObj   _Matrix::LUSolve (_PMathObj p)
+// takes a matrix in LU decomposed state and a vector of row permutation returned by LU
+// returns a vector of solutions
+{
+
+    if ((storageType!=1)||(hDim+1!=vDim)||(vDim<=0)) { // only works for numerical matrices at this stage
+        _String errorMsg ("LUSolve only works with numerical non-empty matrices of dimension nx(n+1) returned by LUDecompose.");
+        WarnError (errorMsg);
+        return    nil;
+    }
+    if (p->ObjectClass()==MATRIX) {
+        _Matrix *b=(_Matrix*)p;
+        if (!((b->hDim!=hDim)||(b->vDim!=1)||(b->storageType!=1))) {
+            _Parameter sum;
+            _Matrix result (*b);
+            result.CheckIfSparseEnough(true);
+            long i,j,trueI, firstI = -1;
+            for (i=0; i<hDim; i++) {
+                trueI = (*this)(i,vDim-1);
+                if ((trueI<0)||(trueI>=hDim)) {
+                    break;
+                }
+                sum = result.theData[trueI];
+                result.theData[trueI]=result.theData[i];
+                if (firstI>=0)
+                    for (j=firstI; j<i; j++) {
+                        sum -= theData[i*vDim+j]*result.theData[j];
+                    }
+                else if (sum) {
+                    firstI = i;
+                }
+                result.theData[i]=sum;
+            }
+            if (i==hDim) {
+                for (i=hDim-1; i>-1; i--) {
+                    sum = result.theData[i];
+                    for (j=i+1; j<hDim; j++) {
+                        sum-=theData[i*vDim+j]*result.theData[j];
+                    }
+                    result.theData[i]=sum/theData[i*vDim+i];
+                }
+                return (_PMathObj)result.makeDynamic();
+            }
+        }
+    }
+    _String errorMsg ("LUSolve expects the 2nd parameter to be a column vector defining the right hand side of LUx=b");
+    WarnError (errorMsg);
+    return new _Matrix(1,1,false,true);
+
+}
+
+
+
+//__________________________________________________________________________________
+_PMathObj   _Matrix::CholeskyDecompose (void)
+{
+    /* ---------------------------------------------------
+        CholeskyDecompose()
+            Constrcts lower triangular matrix L such that
+            its own transpose can serve as upper part in
+            LU decomposition.
+            Requires that matrix is symmetric and positive
+            definite.
+        * algorithm based on Numerical Recipes
+       --------------------------------------------------- */
+
+    if (storageType!=1 || hDim!=vDim || hDim==0) { // only works for numerical square matrices at this stage
+        _String errorMsg ("CholeskyDecompose only works with numerical non-empty square matrices");
+        WarnError (errorMsg);
+        return    new _Matrix();
+    }
+
+    long        n           = GetHDim();
+    _Parameter  sum;
+    _Matrix *   lowerTri    = new _Matrix ((_Matrix &)*this);   // duplication constructor
+
+    checkPointer (lowerTri);
+
+    for (long i = 0; i < n; i++) {
+        for (long j = i; j < n; j++) {
+            sum = (*lowerTri)(i,j);
+
+            for (long k = i-1; k >= 0; k--) {
+                sum -= (*lowerTri)(i,k) * (*lowerTri)(j,k);
+            }
+
+            if (i==j) {
+                if (sum <= 0.0) {   // matrix is not positive-definite
+                    WarnError(_String("In CholeskyDecompose(): matrix not positive definite, (row ") & i & ')');
+                    return nil;
+                }
+
+                lowerTri->Store (i, i, sqrt(sum));
+            }
+
+            else {
+                lowerTri->Store (j, i, sum / ((*lowerTri)(i,i)));
+            }
+        }
+    }
+
+    /* zero upper triagonal entries */
+    for (long i = 0; i < n; i++) {
+        for (long j = i+1; j < n; j++) {
+            lowerTri->Store (i, j, 0.);
+        }
+    }
+
+    //ReportWarning (_String("_Matrix::CholeskyDecompose returning with ") & (_String *) lowerTri->toStr());
+
+    return lowerTri;
+}
+
+
+
+//__________________________________________________________________________________
+_PMathObj   _Matrix::Log (void)
+{
+    if (storageType==1) {
+        _Matrix* res = new _Matrix;
+        checkPointer (res);
+        res->Duplicate (this);
+        if (theIndex) {
+            for (long k=0; k<lDim; k++)
+                if (theIndex[k]>=0) {
+                    res->theData[k] = log(theData[k]);
+                }
+        } else {
+            for (long k=0; k<lDim; k++) {
+                res->theData[k] = log(theData[k]);
+            }
+        }
+        return res;
+    }
+    _String errorMsg ("Can't apply logs to non-numeric matrices.");
+    WarnError (errorMsg);
+    return new _Matrix(1,1,false,true);
+}
+
+//__________________________________________________________________________________
+_PMathObj   _Matrix::Inverse (void)
+{
+    if ((storageType!=1)||(hDim!=vDim)||(hDim==0)) {
+        _String errorMsg ("Inverse only works with numerical non-empty square matrices.");
+        WarnError (errorMsg);
+        return    nil;
+    }
+    _Matrix * LUdec = (_Matrix*)LUDecompose();
+    if (LUdec) {
+        _Matrix b      (hDim,1,false,true),
+                result (hDim,vDim,false,true);
+        b.theData[0]=1.0;
+        for (long i=0; i<hDim; i++) {
+            if (i) {
+                b.theData[i]=1.0;
+                b.theData[i-1]=0.0;
+            }
+            _Matrix* invVector = (_Matrix*)LUdec->LUSolve(&b);
+            _Matrix* corrTerm = (_Matrix*)(*this*(*invVector)-b).makeDynamic();
+            _Matrix* corrX =  (_Matrix*)LUdec->LUSolve(corrTerm);
+            *invVector-=*corrX;
+            DeleteObject (corrX);
+            DeleteObject (corrTerm);
+            for (long j=0; j<hDim; j++) {
+                result.theData[j*vDim+i]=invVector->theData[j];
+            }
+            DeleteObject (invVector);
+        }
+        DeleteObject (LUdec);
+        return (_PMathObj)result.makeDynamic();
+    }
+    return new _Matrix (1,1,false,true);
+
+}
+
+//__________________________________________________________________________________
+_PMathObj   _Matrix::MultByFreqs (long freqID)
+// multiply this transition probs matrix by frequencies
+{
+    _PMathObj value = ComputeNumeric(true);
+
+    if (freqID>=0) {
+        _Matrix* freqMatrix = nil;
+        freqID = modelFrequenciesIndices.lData[freqID];
+        if (freqID>=0) {
+            freqMatrix = (_Matrix*)LocateVar(freqID)->GetValue();
+            if (freqMatrix->storageType != 1) {
+                if (freqMatrix->theValue) {
+                    freqMatrix = (_Matrix*)freqMatrix->theValue;
+                } else {
+                    freqMatrix = (_Matrix*)freqMatrix->ComputeNumeric();
+                }
+            }
+        }
+
+        if (theIndex) {
+            _Matrix*    vm = (_Matrix*) value;
+            _Parameter *dp = vm ->theData;
+
+            _Parameter *tempDiags = new _Parameter [hDim];
+
+            for (long i=0; i<hDim; i++) {
+                tempDiags[i] = 0.0;
+            }
+
+            if (freqMatrix)
+                for (long i=0; i<lDim; i++) {
+                    long p;
+                    if ((p = theIndex[i])!=-1) {
+                        long h = p/vDim;
+                        p %= vDim;
+                        if (h!=p) {
+                            tempDiags[h] += (dp[i] *= freqMatrix->theData[p]);
+                        }
+                    }
+                }
+            else
+                for (long i=0; i<lDim; i++) {
+                    long p;
+                    if ((p = theIndex[i])!=-1) {
+                        long h = p/vDim;
+                        p %= vDim;
+                        if (h!=p) {
+                            tempDiags[h] += dp[i];
+                        }
+                    }
+                }
+
+            for (long j=0; j<hDim; j++) {
+                vm->Store (j,j,-tempDiags[j]);
+            }
+
+            delete [] tempDiags;
+        } else {
+            _Parameter * theMatrix = ((_Matrix*)value)->theData;
+
+            if (freqMatrix) {
+                if (freqMatrix->theIndex) {
+                    for (long i=0; i<lDim; i++) {
+                        theMatrix[i] *= (*freqMatrix)[i%vDim];
+                    }
+                } else {
+                    for (long i=0; i<lDim; i++) {
+                        theMatrix[i] *= freqMatrix->theData[i%vDim];
+                    }
+                }
+            }
+            {
+                for (long i=0; i<lDim; i+=(vDim+1)) {
+                    theMatrix[i] = 0.;
+                }
+            }
+            for (long i=0; i<lDim; i++) {
+                long h = i/vDim,v = i%vDim;
+                if (h!=v) {
+                    theMatrix[h*vDim+h]-=theMatrix[h*vDim+v];
+                }
+            }
+        }
+
+    }
+    return value;
+}
+
+
+//__________________________________________________________________________________
+_PMathObj   _Matrix::Compute (void)
+{
+    //if ((storageType != 1)&&(storageType != 2))
+    if (storageType != _NUMERICAL_TYPE) {
+      if (storageType == _POLYNOMIAL_TYPE) {
+            if (ANALYTIC_COMPUTATION_FLAG) {
+                return this;
+            }
+        }
+        if (IsAStringMatrix()) {
+            return this;
+        }
+
+        if (theValue) {
+            DeleteObject (theValue);
+        }
+        if (storageType != _SIMPLE_FORMULA_TYPE) {
+            theValue = Evaluate(false);
+        } else {
+            theValue  = EvaluateSimple ();
+        }
+        return theValue;
+    }
+    return this;
+}
+
+//__________________________________________________________________________________
+_PMathObj   _Matrix::ComputeNumeric (bool copy)
+{
+    if (storageType != _NUMERICAL_TYPE) {
+        if (storageType == 0 && ANALYTIC_COMPUTATION_FLAG) {
+            return this;
+        }
+
+        if (theValue) {
+            DeleteObject (theValue);
+        }
+
+        if (storageType != _SIMPLE_FORMULA_TYPE) {
+            theValue  = Evaluate(false);
+        } else {
+            theValue  = EvaluateSimple ();
+        }
+        return theValue;
+    }
+    if (copy) {
+        if (theValue) {
+            DeleteObject (theValue);
+        }
+
+        theValue = (_Matrix*)makeDynamic();
+        return theValue;
+    }
+    return this;
+}
+
+//__________________________________________________________________________________
+_PMathObj   _Matrix::RetrieveNumeric (void)
+{
+    if (storageType != _NUMERICAL_TYPE) {
+        if (theValue) {
+            return theValue;
+        }
+
+        return ComputeNumeric();
+    }
+    return this;
+}
+
+//__________________________________________________________________________________
+_PMathObj   _Matrix::Sum (void)
+{
+    return new _Constant (MaxElement (1));
+}
+
+//__________________________________________________________________________________
+
+
+_PMathObj _Matrix::Execute (long opCode, _PMathObj p, _PMathObj p2, _hyExecutionContext* context)   // execute this operation with the second arg if necessary
+{
+    //_Constant res;
+    // why was static?? mod 07/21/2003
+
+
+    switch (opCode) {
+    case HY_OP_CODE_IDIV: // $
+    case HY_OP_CODE_DIV: // /
+        return MultElements(p,opCode == HY_OP_CODE_DIV);
+        break;
+    case HY_OP_CODE_MOD: // %
+        return SortMatrixOnColumn (p);
+        break;
+    case HY_OP_CODE_AND: // &&
+        return pFDR (p);
+        break;
+    case HY_OP_CODE_MUL: // *
+        if (p)
+            return MultObj(p);
+        break;
+    case HY_OP_CODE_ADD: // +
+        if (p) {
+            return AddObj (p);
+        } else {
+            return Sum ();
+        }
+        break;
+    case HY_OP_CODE_SUB: // -
+        if (p) {
+            return SubObj(p);
+        } else {
+            return (_PMathObj)((*this)*(-1.0)).makeDynamic();
+        }
+        break;
+    case HY_OP_CODE_LESS: // <
+        return PathLogLikelihood(p);
+        break;
+    case HY_OP_CODE_LEQ: // <=
+        return K_Means(p);
+        break;
+    case HY_OP_CODE_EQ: // ==
+        return ProfileMeanFit(p);
+        break;
+    case HY_OP_CODE_GREATER: // >
+        return NeighborJoin (!CheckEqual(p->Value(),0.0));
+        break;
+    case HY_OP_CODE_GEQ: // >=
+        return MakeTreeFromParent (p->Value());
+        break;
+    case HY_OP_CODE_ABS: // Abs
+        return Abs();
+        break;
+    case HY_OP_CODE_CCHI2: //CChi2
+        if (p->ObjectClass()==NUMBER && p->Value()>0.999 ) {
+            return new _Constant (FisherExact(5.,80.,1.));
+        } else {
+            return new _Constant (FisherExact(0.,0.,0.));
+        }
+        break;
+    case HY_OP_CODE_COLUMNS:  //Columns
+        return new _Constant (vDim);
+        break;
+    case HY_OP_CODE_EIGENSYSTEM: //Eigensystem
+        return Eigensystem();
+        break;
+    case HY_OP_CODE_EXP: //Exp
+        return Exponentiate();
+        break;
+    case HY_OP_CODE_INVERSE: //Inverse
+        return Inverse();
+        break;
+    case HY_OP_CODE_LUDECOMPOSE: // LUDecompose
+        return LUDecompose();
+        break;
+    case HY_OP_CODE_LUSOLVE: // LUSolve
+        return LUSolve (p);
+        break;
+    case HY_OP_CODE_LOG: // Log
+        return Log();
+        break;
+    case HY_OP_CODE_MACCESS: // MAccess
+        return MAccess (p,p2);
+        break;
+    case HY_OP_CODE_MAX: // Max
+    case HY_OP_CODE_MIN: // Max
+        if (p->ObjectClass()==NUMBER) {
+            if (CheckEqual (p->Value(), 1)) {
+                long index = 0L;
+                _Parameter v[2] = {opCode == HY_OP_CODE_MAX?MaxElement (0,&index):MinElement(0,&index),0.0};
+                v[1] = index;
+                return new _Matrix (v,1,2);
+            }
+        }
+        return new _Constant (opCode == HY_OP_CODE_MAX?MaxElement (0):MinElement (0));
+        break;
+
+    case HY_OP_CODE_MCOORD: // MCoord
+        return MCoord (p,p2);
+        break;
+    case HY_OP_CODE_RANDOM: // Random
+        return Random (p);
+        break;
+    case HY_OP_CODE_ROWS: // Rows
+        return new _Constant (hDim);
+        break;
+    case HY_OP_CODE_SIMPLEX: // Simplex
+        return SimplexSolve();
+        break;
+    case HY_OP_CODE_TRANSPOSE: { // Transpose
+        _Matrix* result = (_Matrix*)makeDynamic();
+        result->Transpose();
+        return result;
+    }
+    case HY_OP_CODE_TYPE: // Type
+        return Type();
+        break;
+    case HY_OP_CODE_POWER: // ^ (Poisson log-likelihood)
+        if (p)
+            return  PoissonLL (p);
+    }
+
+    WarnNotDefined (this, opCode, context);
+    return nil;
+}
+//_____________________________________________________________________________________________
+
+_Matrix::_Matrix ()                             // default constructor, doesn't do much
+{
+    Initialize();
+}
+//_____________________________________________________________________________________________
+
+void _Matrix::Initialize ()                             // default constructor, doesn't do much
+{
+    theData         = nil;
+    theIndex        = nil;
+    vDim = hDim = lDim  = bufferPerRow = overflowBuffer = 0;
+    storageType     = 1;
+    allocationBlock = 1;
+    theValue        = nil;
+
+}
+
+//_____________________________________________________________________________________________
+void    CreateMatrix    (_Matrix* theMatrix, long theHDim, long theVDim,  bool sparse = false, bool allocateStorage = false, bool isFla = false)
+{
+    long i;
+
+    theMatrix->theValue     = nil;
+    theMatrix->storageType  = allocateStorage;
+    if (theHDim && theVDim) {
+        if (sparse) { // store matrix as sparse
+            theMatrix->lDim = theHDim*theVDim*theMatrix->storageIncrement/100+1; // size of storage in elements
+            if (theMatrix->lDim-1<theHDim)
+                // either the matrix or the allocation block are too small
+                // to sensibly store the matrix as sparse.
+            {
+                CreateMatrix (theMatrix, theHDim, theVDim, false, allocateStorage, isFla);
+                return;
+            }
+            if (!(theMatrix->theIndex = (long*)MatrixMemAllocate(sizeof(long)*theMatrix->lDim))) { // allocate element index storage
+                warnError(-108);
+                return;
+            } else {
+                for (i = 0; i<theMatrix->lDim; i++) {
+                    theMatrix->theIndex[i] = -1;
+                }
+            }
+
+        } else {
+            theMatrix->lDim = theHDim*theVDim;
+            theMatrix->theIndex = nil; // no index storage needed
+        }
+
+        if (!allocateStorage)
+            // matrix will store pointers to elements
+        {
+            if (!(theMatrix->theData =(_Parameter*)MatrixMemAllocate(theMatrix->lDim*sizeof(void*)))) { // allocate element index storage
+                warnError(-108);
+                return;
+            } else {
+                // populate with zero data pointers
+                if (!isFla)
+                    for (i = 0; i<theMatrix->lDim; i++) {
+                        ((_MathObject**)theMatrix->theData)[i] = ZEROPOINTER;
+                    }
+                else
+                    for (i = 0; i<theMatrix->lDim; i++) {
+                        ((_Formula**)theMatrix->theData)[i]    = ZEROPOINTER;
+                    }
+            }
+
+        } else {
+            if (!(theMatrix->theData =(_Parameter*)MatrixMemAllocate (sizeof(_Parameter)*theMatrix->lDim))) { // allocate element index storage
+                warnError(-108);
+                return;
+            }
+
+            else {
+                // populate with zero data objects
+                memset (theMatrix->theData, 0, theMatrix->lDim*sizeof(_Parameter));
+            }
+        }
+    } else {
+        theMatrix->lDim      = 0;
+        theMatrix->theIndex  = nil;
+        theMatrix->theData   = nil;
+    }
+
+    theMatrix->hDim = theHDim;
+    theMatrix->vDim = theVDim;
+    theMatrix->bufferPerRow = theMatrix->overflowBuffer =  theMatrix->allocationBlock = 0;
+
+}
+//_____________________________________________________________________________________________
+bool    _Matrix::AmISparse(void)
+{
+    if (theIndex) {
+        return true;    // duh!
+    }
+    if (storageType==2) {
+        return false;
+    }
+
+    long k=0;
+    if (storageType==1) {
+        for (long i=0; i<lDim; i++)
+            if (theData[i]!=ZEROOBJECT) {
+                k++;
+            }
+    } else {
+        for (long i=0; i<lDim; i++)
+            if (IsNonEmpty(i) && !GetMatrixObject(i)->IsObjectEmpty()) {
+                k++;
+            }
+    }
+
+
+    if ((_Parameter(k)/lDim*100.)<=_Matrix::switchThreshold) {
+        // we indeed are sparse enough
+        _Matrix sparseMe (hDim,vDim,true,storageType==1);
+        if (storageType==1) {
+            for (long i=0; i<lDim; i++) {
+                if (theData[i]!=ZEROOBJECT) {
+                    sparseMe[i]=theData[i];
+                }
+            }
+        } else if (storageType==0) {
+            for (long i=0; i<lDim; i++) {
+                if ((GetMatrixObject(i)!=ZEROPOINTER)&&(!GetMatrixObject(i)->IsObjectEmpty())) {
+                    sparseMe.StoreObject(i,GetMatrixObject(i));
+                }
+                GetMatrixObject(i)->nInstances++;
+            }
+        }
+
+        Clear();
+        DuplicateMatrix (this, &sparseMe);
+        return true;
+    }
+    return false;
+}
+
+//_____________________________________________________________________________________________
+bool    _Matrix::AmISparseFast (_Matrix& whereTo)
+{
+    if (theIndex) {
+        return true;    // duh!
+    }
+
+    long k = 0,
+         i,
+         threshold = lDim*_Matrix::switchThreshold/100;
+    
+    for (i=0; i<lDim; i++)
+        if (theData[i]!=ZEROOBJECT) {
+            k++;
+            if (k >= threshold) break;
+        }
+
+    if (k < threshold) {
+        // we indeed are sparse enough
+        
+        if (k == 0) {
+            k = 1;
+        }
+
+       _Parameter *          newData  = (_Parameter*)MatrixMemAllocate (k*sizeof(_Parameter));
+        if (whereTo.theIndex) {
+            free (whereTo.theIndex);
+        }
+        whereTo.theIndex               = (long*)MemAllocate (k*sizeof(long));
+
+        if (!(newData&&whereTo.theIndex)) {
+            warnError (-108);
+        }
+
+        long p = 0;
+
+        whereTo.theIndex[0] = -1;
+
+        for (i=0; i<lDim; i++)
+            if (theData[i]!=ZEROOBJECT) {
+                whereTo.theIndex[p] = i;
+                newData[p++]=theData[i];
+            }
+
+        whereTo.lDim     = k;
+        free     (whereTo.theData);
+        whereTo.theData = newData;
+        return true;
+    }
+
+    return false;
+}
+
+//_____________________________________________________________________________________________
+
+bool    _Matrix::IsReversible(_Matrix* freqs)
+{
+    if (hDim != vDim || (freqs && freqs->hDim * freqs->vDim != hDim)
+            || (storageType != 1 && storageType != 2) ||
+            (freqs && freqs->storageType != 1 && freqs->storageType != 2)) {
+        return false;
+    }
+
+    bool   needAnalytics = storageType == 2 || (freqs && freqs->storageType == 2);
+    if (needAnalytics) {
+        if (freqs) {
+            for (long r = 0; r < hDim; r++)
+                for (long c = r+1; c < hDim; c++) {
+                    bool compResult = true;
+                    if (storageType == 2) {
+                        _Formula* rc = GetFormula(r,c),
+                                  * cr = GetFormula(c,r);
+
+                        if (rc && cr) {
+                            _Polynomial *rcp = (_Polynomial *)rc->ConstructPolynomial(),
+                                         *crp = (_Polynomial *)cr->ConstructPolynomial();
+
+                            if (rcp && crp) {
+                                _PMathObj     tr = nil,
+                                              tc = nil;
+
+                                if (freqs->storageType == 2) {
+                                    if (freqs->GetFormula(r,0)) {
+                                        tr = freqs->GetFormula(r,0)->ConstructPolynomial();
+                                        if (tr) {
+                                            tr->nInstances++;
+                                        } else {
+                                            return false;
+                                        }
+                                    }
+                                    if (freqs->GetFormula(c,0)) {
+                                        tc = freqs->GetFormula(c,0)->ConstructPolynomial();
+                                        if (tc) {
+                                            tc->nInstances++;
+                                        } else {
+                                            DeleteObject (tr);
+                                            return false;
+                                        }
+                                    }
+
+                                } else {
+                                    tr = new _Constant ((*freqs)[r]);
+                                    tc = new _Constant ((*freqs)[c]);
+                                }
+                                if (tr && tc) {
+                                    _Polynomial        * rcpF = (_Polynomial*)rcp->Mult(tr),
+                                                         * crpF = (_Polynomial*)crp->Mult(tc);
+
+                                    compResult         = rcpF->Equal(crpF);
+                                    DeleteObject (rcpF);
+                                    DeleteObject (crpF);
+                                } else {
+                                    compResult = !(tr||tc);
+                                }
+
+                                DeleteObject (tr);
+                                DeleteObject (tc);
+                            } else {
+                                compResult = false;
+                            }
+
+                            //DeleteObject (rcp); DeleteObject (crp);
+                        } else {
+                            compResult = !(rc || cr);
+                        }
+                    }
+                    if (!compResult) {
+                        return false;
+                    }
+                }
+        } else {
+            for (long r = 0; r < hDim; r++)
+                for (long c = r+1; c < hDim; c++) {
+                    bool compResult = true;
+                    _Formula* rc = GetFormula(r,c),
+                              * cr = GetFormula(c,r);
+
+                    if (rc && cr) {
+                        _Polynomial *rcp = (_Polynomial *)rc->ConstructPolynomial(),
+                                     *crp = (_Polynomial *)cr->ConstructPolynomial();
+
+                        if (rcp && crp) {
+                            compResult = rcp->Equal(crp);
+                        } else {
+                            compResult = rc->EqualFormula(cr);
+                        }
+
+                        //DeleteObject (rcp); DeleteObject (crp);
+                    } else {
+                        compResult = !(rc || cr);
+                    }
+
+                    if (!compResult) {
+                        return false;
+                    }
+                }
+        }
+        return true;
+    } else {
+        if (freqs) {
+            for (long r = 0; r < hDim; r++)
+                for (long c = r+1; c < hDim; c++)
+                    if (! CheckEqual ((*this)(r,c)*(*freqs)[r], (*this)(c,r)*(*freqs)[c])) {
+                        return false;
+                    }
+        } else {
+            for (long r = 0; r < hDim; r++)
+                for (long c = r+1; c < hDim; c++)
+                    if (! CheckEqual ((*this)(r,c), (*this)(c,r))) {
+                        return false;
+                    }
+        }
+        return true;
+    }
+    return false;
+}
+
+//_____________________________________________________________________________________________
+
+void    _Matrix::CheckIfSparseEnough(bool force)
+
+// check if matrix is sparse enough to justify compressed storage
+{
+    long i;
+
+    if (theIndex && (force || lDim>hDim*vDim*::_Matrix::switchThreshold/100))
+        // switch to normal matrix storage - more than half elements are non-zero
+    {
+        // -= allocationBlock;
+        if (storageType!=1)
+            // pointers
+        {
+            long* tempData;
+
+            if (!(tempData = (long*) MatrixMemAllocate(hDim*vDim*sizeof(Ptr)))) {
+                warnError(-108);
+            } else {
+                for (i = 0; i<hDim*vDim; i++) {
+                    tempData[i]=0;
+                }
+                for (i = 0; i<lDim; i++) {
+                    if (IsNonEmpty(i)) {
+                        tempData[theIndex[i]]=((long*)theData)[i];
+                    }
+                }
+                MatrixMemFree (theData);
+                theData = (_Parameter*)tempData;
+            }
+        } else
+            //objects
+        {
+            _Parameter* tempData;
+            if (!(tempData =  (_Parameter*)MatrixMemAllocate (sizeof(_Parameter)*hDim*vDim))) {
+                warnError(-108);
+            } else {
+                for (i = 0; i<hDim*vDim; i++) {
+                    tempData [i] = ZEROOBJECT;
+                }
+                for (i = 0; i<lDim; i++) {
+                    long k = theIndex[i];
+                    if (k!=-1) {
+                        tempData [k] = ((_Parameter*)theData) [i];
+                    }
+                }
+                MatrixMemFree( theData);
+                theData = tempData;
+            }
+
+        }
+        MatrixMemFree (theIndex);
+        theIndex = nil;
+        bufferPerRow = overflowBuffer = allocationBlock = 0;
+        lDim = vDim*hDim;
+    }
+}
+
+//_____________________________________________________________________________________________
+bool    _Matrix::IncreaseStorage    (void)
+{
+    lDim += allocationBlock;
+
+    long* tempIndex, i;
+
+    if (!(tempIndex = (long*)MatrixMemAllocate(lDim*sizeof(long)))) {
+        warnError(-108);
+    } else {
+        memcpy (tempIndex, theIndex, (lDim-allocationBlock)*sizeof(long));
+        MatrixMemFree( theIndex);
+
+        for (i = lDim-1; i>=lDim-allocationBlock; i--) {
+            tempIndex [i] = -1;
+        }
+        theIndex = tempIndex;
+    }
+
+    if (storageType != 1)
+        // pointers or formulas
+    {
+        _MathObject** tempData;
+        if (!(tempData = (_MathObject**) MatrixMemAllocate(sizeof( char)* lDim*sizeof(void*)))) {
+            warnError(-108);
+        } else {
+            memcpy (tempData, theData, (lDim-allocationBlock)*sizeof(void*));
+            MatrixMemFree (theData);
+            for (i = lDim-1; i>=lDim-allocationBlock; i--) {
+                tempData [i] = ZEROPOINTER;
+            }
+            theData = (_Parameter*)tempData;
+        }
+    } else
+        //objects
+    {
+        _Parameter* tempData;
+        if (!(tempData =  (_Parameter*)MatrixMemAllocate(sizeof(_Parameter)* lDim))) {
+            warnError(-108);
+        } else {
+            for (i = lDim-1; i>=lDim-allocationBlock; i--) {
+                tempData [i] = ZEROOBJECT;
+            }
+            for (; i>=0; i--) {
+                tempData [i] = ((_Parameter*)theData) [i];
+            }
+            MatrixMemFree( theData);
+            theData = tempData;
+        }
+    }
+    return TRUE;
+
+}
+
+//_____________________________________________________________________________________________
+void    DuplicateMatrix (_Matrix* targetMatrix, _Matrix* sourceMatrix)
+{
+    if (targetMatrix==sourceMatrix) {
+        return;
+    }
+    targetMatrix->lDim = sourceMatrix->lDim;
+    targetMatrix->hDim = sourceMatrix->hDim;
+    targetMatrix->vDim = sourceMatrix->vDim;
+    targetMatrix->storageType = sourceMatrix->storageType;
+    targetMatrix->bufferPerRow =sourceMatrix->bufferPerRow;
+    targetMatrix->overflowBuffer = sourceMatrix->overflowBuffer;
+    targetMatrix->allocationBlock = sourceMatrix->allocationBlock;
+    targetMatrix->theValue = nil;
+
+    if (sourceMatrix->theIndex) {
+        if (!(targetMatrix->theIndex = (long*)MatrixMemAllocate(sizeof(long) *sourceMatrix->lDim))) { // allocate element index storage
+            warnError(-108);
+        } else {
+            memcpy ((void*)targetMatrix->theIndex,(void*)sourceMatrix->theIndex,sourceMatrix->lDim*sizeof(long));
+        }
+    } else {
+        targetMatrix->theIndex = nil;
+    }
+
+
+    targetMatrix->theData = nil;
+
+    if (sourceMatrix->lDim) {
+        if (sourceMatrix->storageType==0)
+            // matrix will store pointers to elements
+        {
+            if (targetMatrix->lDim) {
+                if (!(targetMatrix->theData = (_Parameter*)MatrixMemAllocate(sizeof( char)*sourceMatrix->lDim*sizeof(void*)))) { // allocate element index storage
+                    warnError(-108);
+                } else {
+                    memcpy ((void*)targetMatrix->theData,(void*)sourceMatrix->theData,sourceMatrix->lDim*sizeof(void*));
+                    if (!sourceMatrix->theIndex) { // non-sparse matrix
+                        for (long i=0; i<sourceMatrix->lDim; i++)
+                            if (sourceMatrix->GetMatrixObject(i)) {
+                                (sourceMatrix->GetMatrixObject(i))->nInstances++;
+                            }
+                    } else
+                        for (long i=0; i<sourceMatrix->lDim; i++) {
+                            _MathObject* theO = (sourceMatrix->GetMatrixObject(i));
+                            if (theO!=ZEROPOINTER) {
+                                theO->nInstances++;
+                            }
+                        }
+
+                }
+            }
+        } else if (sourceMatrix->storageType==2) {
+            if (targetMatrix->lDim) {
+                targetMatrix->theData = (_Parameter*)MatrixMemAllocate(sourceMatrix->lDim*sizeof(void*));
+                _Formula ** theFormulas = (_Formula**)(sourceMatrix->theData), **newFormulas =
+                                              (_Formula**)(targetMatrix->theData);
+                if (sourceMatrix->theIndex) {
+                    for (long i = 0; i<sourceMatrix->lDim; i++)
+                        if (sourceMatrix->IsNonEmpty(i)) {
+                            newFormulas[i] = (_Formula*)theFormulas[i]->makeDynamic();
+                        }
+                } else
+                    for (long i = 0; i<sourceMatrix->lDim; i++)
+                        if(theFormulas[i]!=(_Formula*)ZEROPOINTER) {
+                            newFormulas[i] = (_Formula*)theFormulas[i]->makeDynamic();
+                        } else {
+                            newFormulas[i]=ZEROPOINTER;
+                        }
+            }
+        } else {
+            if (targetMatrix->lDim) {
+                if (!(targetMatrix->theData =(_Parameter*)MatrixMemAllocate(sizeof( _Parameter)*targetMatrix->lDim))) { // allocate element index storage
+                    warnError(-108);
+                } else {
+                    memcpy ((Ptr)targetMatrix->theData,(Ptr)sourceMatrix->theData,sizeof(_Parameter)*sourceMatrix->lDim);
+                }
+            }
+        }
+    } else {
+        targetMatrix->theData = nil;
+        targetMatrix->lDim    = 0;
+    }
+
+}
+//_____________________________________________________________________________________________
+BaseRef _Matrix::makeDynamic (void)
+{
+    _Matrix * result = new _Matrix;
+    DuplicateMatrix (result, this);
+
+    return result;
+}
+
+//_____________________________________________________________________________________________
+void _Matrix::Duplicate (BaseRef obj)
+{
+
+    _Matrix* m = (_Matrix*)obj;
+    Clear();
+    DuplicateMatrix (this,m);
+}
+
+
+//_____________________________________________________________________________________________
+
+_Matrix::_Matrix (long theHDim, long theVDim, bool sparse, bool allocateStorage)    // create an empty matrix of given dimensions;
+// the flag specifies whether it is sparse or not
+
+{
+    CreateMatrix (this, theHDim, theVDim, sparse, allocateStorage);
+}
+
+
+//_____________________________________________________________________________________________
+
+void    _Matrix::Convert2Formulas (void)
+{
+    if (storageType == 1) {
+        storageType = 2;
+        _Formula** tempData = (_Formula**)MatrixMemAllocate (sizeof(void*)*lDim);
+        if (!theIndex) {
+            for (long i = 0; i<lDim; i++) {
+                tempData[i] = new _Formula (new _Constant (((_Parameter*)theData)[i]));
+            }
+        } else
+            for (long i = 0; i<lDim; i++) {
+                if (IsNonEmpty(i)) {
+                    //_Constant c (((_Parameter*)theData)[i]);
+                    //_Formula f((_PMathObj)c.makeDynamic());
+                    //tempData[i] = (_Formula*)f.makeDynamic();
+                    tempData[i] = new _Formula (new _Constant (((_Parameter*)theData)[i]));
+                } else {
+                    tempData[i]=nil;
+                }
+            }
+
+        MatrixMemFree (theData);
+        theData = (_Parameter*)tempData;
+    }
+}
+
+
+
+//_____________________________________________________________________________________________
+
+_Matrix::_Matrix (_String& s, bool isNumeric, _VariableContainer* theP)
+// takes two separate formats
+// 1st : {{i11,...,i1n}{i21,...,i2n}....{in1,...,inn}} // all elements must be explicitly specified
+// 2st : {hor dim, <vert dim>,{hor index, vert index, value or formula}{...}...}
+{
+    // decide which input type is being presented
+    Initialize();
+
+    bool    isAConstant = true; // is this a matrix of numbers, or formulas
+    char    cc;
+
+
+    long    i=s.FirstNonSpaceIndex(),
+            j=s.FirstNonSpaceIndex(i+1),
+            k=0,
+            hPos = 0,
+            vPos = 0;
+
+    _String terminators (",}");
+
+    if (j>i && s.sLength>4) { // non-empty string
+        _String term;
+        if (s.sData[i]=='{' && s.sData[j]=='{') { // first type
+            i = j+1;
+            // read the dimensions first
+
+            while (i<s.sLength) {
+                i = s.FindTerminator (i, terminators);
+                if (i < 0) {
+                    WarnError ("Unterminated matrix definition");
+                    return;
+                }
+                cc = s.sData[i];
+
+                if (cc=='}') {
+                    break;
+                }
+
+                if (cc==',') {
+                    vDim++;
+                }
+                i++;
+            }
+
+            vDim++;
+            hDim = 1;
+
+            for (i = i + 1; i<s.sLength-1; i++) {
+                i = s.ExtractEnclosedExpression (i,'{','}',true, true);
+                if (i < 0) {
+                    break;
+                }
+                hDim ++;
+            }
+
+            if ( hDim<=0 || vDim<=0) {
+                return;
+            }
+
+            if (isNumeric) {
+                CreateMatrix (this, hDim, vDim, false, true, false);
+            } else {
+                CreateMatrix (this, hDim, vDim, false, false, true);
+            }
+
+            // scan the elements one-by-one
+
+            for (i=1; i<s.sLength-1; i++) {
+                if (s.sData[i]=='{') {
+                    while (s.sData[i]!='}') {
+                        i++;
+                        j = s.FindTerminator (i, terminators);
+
+                        if (j<0) {
+                            WarnError ("Unterminated matrix definition");
+                            return;
+                        }
+
+                        _String lterm (s,s.FirstNonSpaceIndex(i,j-1,1),j-1); // store the term in a string
+
+                        //printf ("%s\n", lterm.sData);
+
+                        if (isNumeric) {
+                            if (lterm.sLength == 1 && lterm.sData[0]=='*') {
+                                lterm = empty;    // dummy element in probability matrix
+                            }
+
+                            theData[vDim*hPos+vPos] = lterm.toNum();
+                        } else {
+                            if (lterm.sLength == 1 && lterm.sData[0]=='*') {
+                                lterm = empty;    // dummy element in probability matrix
+                            }
+
+                            _Formula*  theTerm = (_Formula*)checkPointer(new _Formula (lterm, theP));
+
+                            if (isAConstant) // there is hope that this matrix is of numbers
+                                if (theTerm->ObjectClass() == NUMBER) {
+                                    isAConstant = theTerm->IsAConstant();
+                                } else {
+                                    isAConstant = false;
+                                }
+
+                            ((_Formula**)theData)[vDim*hPos+vPos] = theTerm;
+                        }
+
+                        vPos++;
+                        if (vPos>vDim) {
+                            WarnError ("Rows of unequal lengths in matrix definition");
+                            return;
+                        }
+
+                        i=j;
+                    }
+                }
+                if (s[i]=='}') {
+                    if (vPos!=vDim) {
+                        warnError(-104);
+                        return;
+                    }
+                    hPos++;
+                    vPos = 0;
+                    if (hPos>hDim) {
+                        warnError(-104);
+                        return;
+                    }
+                }
+            }
+            if (hPos!=hDim) {
+                warnError(-104);
+                return;
+            }
+        } else { // second type of input
+            for (i=j,j=0; s.sData[i]!='{' && s.sData[i]!='}' && i<s.sLength; i++) {
+                if (s.sData[i]==',') { // neither hDim nore vDim have been specified
+                    if (j > 0) {
+                        break;
+                    }
+                    term = s.Cut(1,i-1);
+                    hDim = round(ProcessNumericArgument (&term,theP));
+                    j    = i+1;
+                }
+            }
+
+            if (j) { // both hDim and vDim specified
+                term = s.Cut(j,i-1);
+                vDim = ProcessNumericArgument (&term,theP);
+            } else { // only one dim specified, matrix assumed to be square
+                term = s.Cut(1,i-1);
+                hDim = ProcessNumericArgument (&term,theP);
+                vDim = hDim;
+            }
+
+            if (hDim<=0 || vDim<=0) {
+                return;
+            }
+
+            if (isNumeric) {
+                CreateMatrix (this, hDim, vDim, true, true, false);
+            } else {
+                CreateMatrix (this, hDim, vDim, true, false, true);
+            }
+
+            // read the terms now
+
+            for (; i<s.sLength; i++) {
+                if (s.sData[i]=='{') {
+                    hPos = -1;
+                    vPos = -1;
+                    k    = i+1;
+
+                    for (j=i+1; j<s.sLength && s.sData[j]!='}'; j++) {
+                        j = s.FindTerminator (j, terminators);
+
+                        if (j<0) {
+                            WarnError ("Unterminated matrix definition");
+                            return;
+                        }
+
+                        if (s.sData[j]==',') {
+                            term = s.Cut (s.FirstNonSpaceIndex(k,j-1,1),j-1);
+                            _Formula coordF (term,theP);
+                            _Parameter coordV = coordF.Compute()->Value();
+                            if (hPos == -1) {
+                                hPos = coordV;
+                            } else {
+                                vPos = coordV;
+                            }
+                            k = j+1;
+                        } else {
+                            j--;
+                        }
+                    }
+
+                    if (hPos <0 || vPos<0 || hPos>=hDim || vPos>=vDim)
+                        // bad index
+                    {
+                        MatrixIndexError (hPos,vPos,hDim,vDim);
+                        return;
+                    }
+
+                    term = s.Cut(k,j-1); // read the element
+
+                    if (isNumeric) {
+                        if ((term.sLength == 1) && (term.sData[0]=='*')) {
+                            term = empty;    // dummy element in probability matrix
+                        }
+
+                        (*this)[vDim*hPos+vPos];
+                        k = Hash (hPos,vPos);
+                        theData[k]=term.toNum();
+                    } else {
+                        if ((term.sLength == 1) && (term.sData[0]=='*')) {
+                            term = empty;    // dummy element in probability matrix
+                        }
+
+                        _Formula theTerm (term,theP);
+                        if (isAConstant) { // there is hope that this matrix is of numbers
+                            isAConstant = theTerm.IsAConstant();
+                        }
+
+                        (*this)[vDim*hPos+vPos];
+                        k = Hash (hPos,vPos);
+                        ((_Formula**)theData)[k]=(_Formula*)theTerm.makeDynamic();
+                    }
+                    i = j;
+                }
+            }
+        } // end else
+
+        if (!isNumeric) {
+            storageType = 2; // formula elements
+            checkParameter (ANAL_COMP_FLAG, ANALYTIC_COMPUTATION_FLAG, 0);
+            if ((ANALYTIC_COMPUTATION_FLAG)&&!isAConstant) {
+                ConvertFormulas2Poly (false);
+            }
+
+            if (isAConstant) { // a matrix of numbers - store as such
+                Evaluate ();
+            }
+            AmISparse();
+        }
+    }
+}
+
+
+//_____________________________________________________________________________________________
+
+_Matrix::_Matrix (_Matrix& m)
+{
+    DuplicateMatrix (this, &m);
+}
+
+//_____________________________________________________________________________________________
+
+_Matrix::_Matrix (_SimpleList& sl, long colArg)
+{
+    if (sl.lLength) {
+        if (colArg > 0 && colArg < sl.lLength) {
+            CreateMatrix (this, sl.lLength/colArg + colArg*(sl.lLength%colArg > 0), colArg,     false, true, false);
+        } else {
+            CreateMatrix (this, 1, sl.lLength,  false, true, false);
+        }
+        for (long k=0; k<sl.lLength; k++) {
+            theData[k] = sl.lData[k];
+        }
+    } else {
+        Initialize();
+    }
+}
+
+//_____________________________________________________________________________________________
+
+_Matrix::_Matrix (_Parameter* inList, unsigned long rows, unsigned long columns)
+{
+    CreateMatrix (this, rows, columns, false, true, false);
+    for (unsigned long k = 0; k < rows*columns; k++) {
+        theData[k] = inList[k];
+    }
+}
+
+
+//_____________________________________________________________________________________________
+
+_Matrix::_Matrix (_List& sl)
+// list of strings
+{
+    if (sl.lLength) {
+        CreateMatrix     (this, 1, sl.lLength,  false, true, false);
+        _Constant        hi (0.),
+                         vi;
+
+        for (unsigned long k=0; k<sl.lLength; k++) {
+            _FString  *choiceString = new _FString (*(_String*) sl(k));
+            _Formula  sf (choiceString);
+            vi.SetValue (k);
+            MStore(&hi,&vi,sf);
+            //DeleteObject (choiceString);
+        }
+    } else {
+        Initialize();
+    }
+}
+
+//_____________________________________________________________________________________________
+
+void    _Matrix:: ScanForVariables(_AVLList& theReceptacle, bool inclG, _AVLListX* tagger, long weights)
+{
+    ScanForVariables2 (theReceptacle, inclG, -1, true, tagger, weights);
+}
+//_____________________________________________________________________________________________
+
+void    _Matrix:: ScanForVariables2(_AVLList& theReceptacle, bool inclG, long modelID, bool inclCat, _AVLListX* tagger, long weights)
+{
+    if (storageType == 2) { // a formula based matrix, there is stuff to do
+        if (modelID >= 0) {
+            _AssociativeList*      definedCache = nil;
+            _Variable*             cachedDeps = FetchVar(LocateVarByName (CACHE_FORMULA_DEPENDANCY));
+
+            if (cachedDeps && cachedDeps->ObjectClass () == ASSOCIATIVE_LIST)
+                // 20100316 SLKP: I am pretty sure this is broken...
+            {
+                definedCache = (_AssociativeList*)cachedDeps->GetValue();
+                _String     matrixKey (modelID);
+                _Matrix*    cachedValues = (_Matrix*)definedCache->GetByKey (matrixKey,MATRIX);
+
+                if (cachedValues == nil) {
+                    _Formula ** theFormulas = (_Formula**)theData;
+
+                    _SimpleList sl1,
+                                sl2;
+                    _AVLList    a1 (&sl1),
+                                a2 (&sl2);
+
+                    if (theIndex) {
+                        for (long i = 0; i<lDim; i++)
+                            if (IsNonEmpty(i)) {
+                                theFormulas[i]->ScanFForVariables(a1,false);
+                                theFormulas[i]->ScanFForVariables(a2,true);
+                            }
+                    } else
+                        for (long i = 0; i<lDim; i++)
+                            if (theFormulas[i]!=(_Formula*)ZEROPOINTER) {
+                                theFormulas[i]->ScanFForVariables(a1,false);
+                                theFormulas[i]->ScanFForVariables(a2,true);
+                            }
+
+                    a1.ReorderList();
+                    a2.ReorderList();
+
+                    cachedValues = new _Matrix (2,sl2.lLength,false,true);
+                    checkPointer (cachedValues);
+
+                    for (unsigned long k=0; k<sl1.lLength; k++) {
+                        cachedValues->theData[k] = sl1.lData[k];
+                    }
+                    {
+                        for (unsigned long k=sl1.lLength; k<sl2.lLength; k++) {
+                            cachedValues->theData[k] = -1.;
+                        }
+                    }
+                    {
+                        for (unsigned long k=0; k<sl2.lLength; k++) {
+                            cachedValues->theData[k+sl2.lLength] = sl2.lData[k];
+                        }
+                    }
+
+                    _FString aKey (matrixKey,false);
+
+                    definedCache->MStore (&aKey, cachedValues, false);
+
+                }
+
+                long colCount = cachedValues->GetVDim(),
+                     rowIndex = inclG?colCount:0;
+
+                for (long k=0; k<colCount; k++,rowIndex++) {
+                    long vI = cachedValues->theData[rowIndex];
+                    if (vI >= 0) {
+                        theReceptacle.Insert ((BaseRef)vI);
+                        if (tagger) {
+                            tagger->UpdateValue((BaseRef)vI, weights, 0);
+                        }
+                    } else {
+                        break;
+                    }
+                }
+
+                return;
+            }
+
+        }
+
+        _Formula ** theFormulas = (_Formula**)theData;
+
+        if (theIndex) {
+            for (long i = 0; i<lDim; i++)
+                if (IsNonEmpty(i)) {
+                    theFormulas[i]->ScanFForVariables(theReceptacle,inclG,false,inclCat, false, tagger, weights);
+                }
+        } else
+            for (long i = 0; i<lDim; i++) {
+                if (theFormulas[i]!=(_Formula*)ZEROPOINTER) {
+                    theFormulas[i]->ScanFForVariables (theReceptacle,inclG,false,inclCat, false, tagger, weights);
+                }
+            }
+    } else if (storageType == 0) { // a polynomial based matrix, there is stuff to do
+        _MathObject ** thePoly = (_MathObject**)theData;
+        if (theIndex)
+            for (long i = 0; i<lDim; i++) {
+                if (IsNonEmpty(i)) {
+                    thePoly[i]->ScanForVariables(theReceptacle,inclG,tagger, weights);
+                }
+            }
+        else
+            for (long i = 0; i<lDim; i++) {
+                if (thePoly[i]!=ZEROPOINTER) {
+                    thePoly[i]->ScanForVariables (theReceptacle,inclG,tagger, weights);
+                }
+            }
+    }
+
+}
+
+//_____________________________________________________________________________________________
+
+bool    _Matrix::IsConstant(void)
+{
+    if (storageType == 1) {
+        return true;
+    }
+
+    if (storageType == 2) { // a formula based matrix, there is stuff to do
+        _Formula ** theFormulas = (_Formula**)theData;
+        if (theIndex) {
+            for (long i = 0; i<lDim; i++)
+                if (IsNonEmpty(i) && !theFormulas[i]->IsConstant()) {
+                    return false;
+                }
+        } else
+            for (long i = 0; i<lDim; i++)
+                if (theFormulas[i]!=(_Formula*)ZEROPOINTER && !theFormulas[i]->IsConstant()) {
+                    return false;
+                }
+
+        return true;
+
+    }
+    return false;
+}
+
+//_____________________________________________________________________________________________
+
+bool        _Matrix::ProcessFormulas (long& stackLength, _SimpleList& varList,   _SimpleList& newFormulas,
+                                      _SimpleList& references, _AVLListX& flaStrings,
+                                      bool runAll, _Matrix * stencil)
+{
+    _Formula *      thisFormula = nil;
+    _Formula **     theFormulas = (_Formula**)theData;
+
+    bool isGood = true;
+
+    if (theIndex) {
+        for (long i = 0; i<lDim; i++) {
+            long cellIndex = theIndex [i];
+            if (cellIndex>-1) {
+                if (stencil && CheckEqual(stencil->theData[cellIndex],0.0)) {
+                    references << -1;
+                    continue;
+                }
+                thisFormula = theFormulas[i];
+
+                if (runAll || thisFormula->AmISimple(stackLength,varList)) {
+                    _String * flaString = (_String*)thisFormula->toStr(nil,true);
+                    long      fref = flaStrings.Insert(flaString,newFormulas.lLength);
+                    if (fref < 0) {
+                        references << flaStrings.GetXtra (-fref-1);
+                        DeleteObject (flaString);
+                    } else {
+                        newFormulas << (long)thisFormula;
+                        references << fref;
+                    }
+
+                } else {
+                    isGood = false;
+                    break;
+                }
+            } else {
+                references << -1;
+            }
+        }
+    } else {
+        for (long i = 0; i<lDim; i++) {
+            if ((theFormulas[i]!=(_Formula*)ZEROPOINTER)&&(!theFormulas[i]->IsEmpty())) {
+                thisFormula = theFormulas[i];
+
+                if (stencil && CheckEqual(stencil->theData[i],0.0)) {
+                    references << -1;
+                    continue;
+                }
+
+                if (runAll || thisFormula->AmISimple(stackLength,varList)) {
+                    _String * flaString = (_String*)thisFormula->toStr(nil,true);
+                    long      fref = flaStrings.Insert(flaString,newFormulas.lLength);
+                    if (fref < 0) {
+                        references << flaStrings.GetXtra (-fref-1);
+                        DeleteObject (flaString);
+                    } else {
+                        newFormulas << (long)thisFormula;
+                        references << fref;
+                    }
+                } else {
+                    isGood = false;
+                    break;
+                }
+            } else {
+                references << -1;
+            }
+        }
+    }
+    return isGood;
+}
+
+//_____________________________________________________________________________________________
+_Matrix*        _Matrix::branchLengthStencil (void)
+{
+    _Matrix * stencil = (_Matrix*)FetchObjectFromVariableByType (&BRANCH_LENGTH_STENCIL,MATRIX);
+    if (stencil) {
+        if (stencil->storageType==1 && stencil->hDim==stencil->vDim && stencil->hDim == hDim) {
+            stencil->CheckIfSparseEnough (true);
+        } else {
+            stencil = nil;
+        }
+    }
+
+    return stencil;
+}
+
+//_____________________________________________________________________________________________
+_String*        _Matrix::BranchLengthExpression (_Matrix* baseFreqs, bool mbf)
+{
+    if (storageType == 2) {
+
+        long            stackLength = 0;
+
+        _SimpleList     varList,
+                        newFormulas,
+                        references;
+
+        _List           flaStringsL;
+        _AVLListX       flaStrings(&flaStringsL);
+        _Matrix*        stencil = branchLengthStencil();
+
+        ProcessFormulas (stackLength,varList,newFormulas,references,flaStrings,true,stencil);
+
+        _String * sendMeBack = new _String(128L, true);
+        if (baseFreqs->storageType == 1)
+            // numerical base frequencies
+        {
+            _Matrix   multipliersByRate (newFormulas.lLength,1,false,true);
+            for (long i = 0; i<lDim; i++) {
+                long thisRef = references.lData[i];
+                if (thisRef>=0) {
+                    long cellIndex = i;
+                    if (theIndex) {
+                        cellIndex = theIndex[i];
+                    }
+
+                    multipliersByRate.theData[thisRef] += (*baseFreqs)(cellIndex/vDim,0) *
+                                                          (mbf?(*baseFreqs)(cellIndex%vDim,0):1.0);
+                }
+            }
+
+
+            bool    firstDone = false;
+            for (long k=0; k<newFormulas.lLength; k++) {
+                if (!CheckEqual(multipliersByRate.theData[k],0.0)) {
+                    if (firstDone) {
+                        (*sendMeBack) << '+';
+                    }
+                    _String * fStr = (_String*)flaStringsL(k);
+                    (*sendMeBack) << '(';
+                    (*sendMeBack) << fStr;
+                    (*sendMeBack) << ")*";
+                    (*sendMeBack) << _String(multipliersByRate.theData[k]);
+                    firstDone = true;
+                }
+            }
+        } else if (baseFreqs->storageType == 2)
+            // formula-based equilibrium frequencies
+        {
+            _List   freqFla,
+                    multipliersByRate;
+
+            for (long k=0; k<newFormulas.lLength; k++) {
+                multipliersByRate.AppendNewInstance(new _String (128L,true));
+            }
+
+            for (long i = 0; i<hDim; i++) {
+                freqFla.AppendNewInstance ((_String*)baseFreqs->GetFormula(i,0)->toStr(nil,true));
+            }
+
+            for (long i = 0; i<lDim; i++) {
+                long thisRef = references.lData[i];
+                if (thisRef>=0) {
+                    _String * thisAdder = (_String*)multipliersByRate(thisRef);
+                    if (thisAdder->sLength) {
+                        (*thisAdder) << '+';
+                    }
+
+                    long cellIndex = i;
+                    if (theIndex) {
+                        cellIndex = theIndex[i];
+                    }
+
+                    (*thisAdder) << '(';
+                    if (mbf) {
+
+                        (*thisAdder) << (_String*)freqFla(cellIndex%vDim);
+                        (*thisAdder) << ")*(";
+                    }
+
+                    (*thisAdder) << (_String*)freqFla(cellIndex/vDim);
+                    (*thisAdder) << ')';
+                }
+            }
+
+            for (long k=0; k<newFormulas.lLength; k++) {
+                ((_String*)multipliersByRate(k))->Finalize();
+            }
+
+            for (long k=0; k<newFormulas.lLength; k++) {
+                if (k) {
+                    (*sendMeBack) << '+';
+                }
+                (*sendMeBack) << '(';
+                (*sendMeBack) << (_String*)flaStringsL(k);
+                (*sendMeBack) << ")*(";
+                (*sendMeBack) << (_String*)multipliersByRate(k);
+                (*sendMeBack) << ')';
+            }
+        }
+        sendMeBack->Finalize();
+        if (sendMeBack->sLength) {
+            _Formula        blF (*sendMeBack);
+            _Polynomial*    isPoly = (_Polynomial*)blF.ConstructPolynomial();
+            if (isPoly) {
+                DeleteObject (sendMeBack);
+                sendMeBack = (_String*)isPoly->toStr();
+            }
+        }
+        return sendMeBack;
+    }
+    return new _String;
+}
+
+//_____________________________________________________________________________________________
+void        _Matrix::MakeMeSimple (void)
+{
+    if (storageType == 2) {
+        long            stackLength = 0;
+        bool            isGood      = true;
+
+        _SimpleList     varList,
+                        newFormulas,
+                        references;
+
+        _List           flaStringsL;
+        _AVLListX       flaStrings(&flaStringsL);
+
+        isGood      =   ProcessFormulas (stackLength,varList,newFormulas,references,flaStrings);
+
+        if (isGood) {
+            storageType = 3;
+
+            cmd                         = new _CompiledMatrixData;
+            cmd->has_volatile_entries   = false;
+            for (unsigned long k = 0; k < newFormulas.lLength; k++) {
+                cmd->has_volatile_entries = cmd->has_volatile_entries || ((_Formula*)newFormulas.lData[k])->ConvertToSimple(varList);
+            }
+
+            cmd->varIndex.Duplicate (&varList);
+            cmd->theStack               = (_SimpleFormulaDatum*)MatrixMemAllocate (stackLength*sizeof(_SimpleFormulaDatum));
+            cmd->varValues              = (_SimpleFormulaDatum*)MatrixMemAllocate ((cmd->varIndex.lLength>0?varList.lLength:1)*sizeof(_SimpleFormulaDatum));
+            cmd->formulaRefs            = references.lData;
+            references.lData            = nil;
+            cmd->formulaValues          = new _Parameter [newFormulas.lLength];
+            checkPointer (cmd->formulaValues);
+            cmd->formulasToEval.Duplicate (&newFormulas);
+        }
+
+    }
+}
+//_____________________________________________________________________________________________
+void        _Matrix::MakeMeGeneral (void)
+{
+    if (storageType == 3) {
+        for (long k = 0; k < cmd->formulasToEval.lLength; k++) {
+            ((_Formula*)cmd->formulasToEval.lData[k])->ConvertFromSimple(cmd->varIndex);
+        }
+
+        delete [] cmd->formulaValues;
+        free   (cmd->formulaRefs);
+
+        MatrixMemFree   (cmd->theStack);
+        MatrixMemFree   (cmd->varValues);
+        delete          (cmd);
+        cmd             = nil;
+        storageType     = 2;
+    }
+}
+//_____________________________________________________________________________________________
+_PMathObj   _Matrix::Evaluate (bool replace)
+// evaluate the matrix  overwriting (or not) the old one
+{
+    _Matrix result (hDim, vDim, bool (theIndex), true);
+
+    if (storageType == 2) {
+        _PMathObj formValue = nil;
+        _Formula ** theFormulas = (_Formula**)theData;
+        if (theIndex) {
+            for (long i = 0; i<lDim; i++) {
+                //long k =
+                if (theIndex[i]!=-1) {
+                    formValue = theFormulas[i]->Compute();
+                    if (formValue) {
+                        result[HashBack(i)] = formValue->Value();
+                        //DeleteObject (formValue);
+                    } else {
+                        result[HashBack(i)] = 0;
+                    }
+                }
+            }
+            // check for probablilty matrices * fillers
+            if ((hDim==vDim)&&(!replace))
+                for (long i = 0; i<hDim; i++) {
+                    long k = Hash(i,i);
+                    if ((k>=0)&&theFormulas[k]->IsEmpty()) {
+                        _Parameter *st = &result[k];
+                        *st=0;
+                        for (long j = 0; j<vDim; j++) {
+                            if (j==i) {
+                                continue;
+                            }
+                            *st-=result(i,j);
+                        }
+                    } else if (k<0) {
+                        _Parameter *st = &result[i*vDim+i];
+                        *st=0;
+                        for (long j = 0; j<vDim; j++) {
+                            if (j==i) {
+                                continue;
+                            }
+                            *st-=result(i,j);
+                        }
+                    }
+                }
+        } else {
+            for (long i = 0; i<lDim; i++) {
+                if (theFormulas[i]!=(_Formula*)ZEROPOINTER) {
+                    formValue = theFormulas[i]->Compute();
+                    if (formValue && formValue->ObjectClass() == NUMBER) {
+                        result.theData[i] = formValue->Value();
+                        //DeleteObject (formValue);
+                    } else {
+                        result.theData[i] = 0;
+                    }
+                }
+            }
+            // check for probablilty matrices * fillers
+
+            if ((hDim==vDim)&&(!replace))
+                for (long i = 0; i<lDim; i+=vDim+1) {
+                    if (theFormulas[i]!=(_Formula*)ZEROPOINTER) {
+                        if (theFormulas[i]->IsEmpty()) {
+                            _Parameter st = 0;
+                            long k = i/vDim,j;
+                            for (j = k*vDim; j<k*vDim+k; j++) {
+                                st-=result.theData[j];
+                            }
+                            for (j = k*vDim+k+1; j<(k+1)*vDim; j++) {
+                                st-=result.theData[j];
+                            }
+                            result.theData[i] = st;
+                        }
+                    }
+                }
+        }
+    }
+    if (storageType == 0) {
+        _PMathObj polValue = nil;
+        _MathObject ** thePoly = (_MathObject**)theData;
+        if (theIndex) {
+            for (long i = 0; i<lDim; i++) {
+                if (IsNonEmpty(i)) {
+                    polValue = thePoly[i]->Compute();
+                    if (polValue) {
+                        result[HashBack(i)] = polValue->Value();
+                        DeleteObject (polValue);
+                    } else {
+                        result[i] = 0;
+                    }
+                }
+            }
+
+        } else {
+            for (long i = 0; i<lDim; i++) {
+                if (thePoly[i]!=(_MathObject*)ZEROPOINTER) {
+                    polValue = thePoly[i]->Compute();
+                    if (polValue) {
+                        result[i] = polValue->Value();
+                        DeleteObject (polValue);
+                    } else {
+                        result[i] = 0;
+                    }
+                }
+            }
+        }
+    }
+    if (replace) {
+        *this = result;
+    } else {
+        return (_PMathObj)result.makeDynamic();
+    }
+    return nil;
+}
+
+//_____________________________________________________________________________________________
+void        _Matrix::ConvertToSimpleList (_SimpleList & sl)
+{
+    sl.Clear();
+    if (storageType == 1) {
+        sl.RequestSpace (hDim*vDim+1);
+
+        for (long i=0; i<hDim; i++)
+            for (long j=0; j<vDim; j++) {
+                sl << (*this)(i,j);
+            }
+    }
+}
+
+//_____________________________________________________________________________________________
+bool        _Matrix::IsAStringMatrix (void)
+// check if a formula matrix contains strings
+{
+    if (storageType == _FORMULA_TYPE) {
+        _PMathObj   formValue = nil;
+        _Formula ** theFormulas = (_Formula**)theData;
+        if (theIndex)
+            for (long i = 0; i<lDim; i++) {
+                if (theIndex[i]!=-1 && !(theFormulas[i]->IsEmpty())) {
+                    formValue = theFormulas[i]->Compute();
+                    if (formValue) {
+                        return formValue->ObjectClass() == STRING;
+                    }
+                }
+            }
+        else
+            for (long i = 0; i<lDim; i++)
+                if (theFormulas[i]!=(_Formula*)ZEROPOINTER && !(theFormulas[i]->IsEmpty())) {
+                    formValue = theFormulas[i]->Compute();
+                    if (formValue) {
+                        return formValue->ObjectClass() == STRING;
+                    }
+                }
+
+    }
+    return false;
+}
+
+//_____________________________________________________________________________________________
+void        _Matrix::FillInList (_List& fillMe, bool doNumeric)
+// check if a formula matrix contains strings
+{
+    if (storageType == _FORMULA_TYPE)
+        for (long r=0; r<hDim; r++)
+            for (long c=0; c<vDim; c++) {
+                _Formula * entryFla = GetFormula(r,c);
+                if (entryFla) {
+                    _PMathObj computedValue = entryFla->Compute();
+                    if (computedValue)
+                        if (computedValue->ObjectClass() == STRING) {
+                            fillMe && ((_FString*)computedValue)->theString;
+                        } else {
+                            fillMe.Clear();
+                            return;
+                        }
+                }
+            }
+    else {
+        if (doNumeric && storageType == _NUMERICAL_TYPE) {
+            for (long r=0; r<hDim; r++)
+                for (long c=0; c<vDim; c++) {
+                    fillMe.AppendNewInstance (new _String ((*this)(r,c)));
+                }
+        }
+    }
+}
+
+//_____________________________________________________________________________________________
+_PMathObj   _Matrix::EvaluateSimple (void)
+// evaluate the matrix  overwriting the old one
+{
+    _Matrix * result = new _Matrix (hDim, vDim, bool (theIndex), true);
+    checkPointer (result);
+
+
+    if (cmd->varIndex.lLength) {
+        for (long i=0; i<cmd->varIndex.lLength; i++) {
+            _Variable* curVar = LocateVar(cmd->varIndex.lData[i]);
+            if (curVar->ObjectClass () != MATRIX) {
+                if (curVar->IsIndependent()) {
+                    cmd->varValues[i].value = LocateVar (cmd->varIndex.lData[i])->Value();
+                } else {
+                    cmd->varValues[i].value = LocateVar (cmd->varIndex.lData[i])->Compute()->Value();
+                }
+            } else {
+                cmd->varValues[i].reference = (Ptr)((_Matrix*)LocateVar (cmd->varIndex.lData[i])->Compute())->theData;
+            }
+        }
+    }
+
+
+    for (long f = 0; f < cmd->formulasToEval.lLength; f++) {
+        cmd->formulaValues [f] = ((_Formula*)cmd->formulasToEval.lData[f])->ComputeSimple(cmd->theStack, cmd->varValues);
+        /*if (terminateExecution)
+        {
+            ((_Formula*)cmd->formulasToEval.lData[f])->ConvertFromSimple(cmd->varIndex);
+            _String * s = (_String*)((_Formula*)cmd->formulasToEval.lData[f])->toStr();
+            WarnError (*s);
+            DeleteObject (s);
+            return result;
+        }*/
+    }
+
+    long * fidx = cmd->formulaRefs;
+
+    if (theIndex) {
+        result->lDim = lDim;
+        result->bufferPerRow = bufferPerRow;
+        result->overflowBuffer = overflowBuffer;
+        result->allocationBlock = allocationBlock;
+        result->theIndex = (long*)MemReallocate((Ptr)result->theIndex,sizeof(long)*lDim);
+        result->theData = (_Parameter*)MemReallocate ((Ptr)result->theData,sizeof(_Parameter)*lDim);
+
+        /*memcpy (result->theIndex,theIndex,sizeof(long)*lDim);*/
+
+
+
+
+        for (long i = 0; i<lDim; i++) {
+            long idx = theIndex[i];
+
+            if (idx != -1) {
+                result->theData[i] = cmd->formulaValues[fidx[i]];
+            }
+
+            result->theIndex[i] = idx;
+        }
+
+        /*for (long i = 0; i<lDim; i++)
+        {
+            if (theIndex[i]!=-1)
+            {
+                formValue = theFormulas[i]->ComputeSimple(cmd->theStack, cmd->varValues);
+                result.theData[i] = formValue;
+            }
+        } */
+
+        if (hDim==vDim) {
+            _Parameter* diagStorage = new _Parameter [hDim];
+            checkPointer ((Ptr)diagStorage);
+            {
+                for (long i = 0; i<hDim; i++) {
+                    diagStorage[i] = 0.0;
+                }
+            }
+            for (long i = 0; i<lDim; i++) {
+                long k = result->theIndex[i];
+                if (k!=-1) {
+                    diagStorage[k/hDim] -= result->theData[i];
+                }
+            }
+            {
+                for (long i = 0; i<hDim; i++) {
+                    (*result)[i*hDim+i] = diagStorage[i];
+                }
+            }
+            delete [] diagStorage;
+        }
+    } else {
+        /*long i;
+        for (i = 0; i<lDim; i++)
+        {
+            if (theFormulas[i]!=(_Formula*)ZEROPOINTER)
+            {
+                formValue = theFormulas[i]->ComputeSimple(cmd->theStack,cmd->varValues);
+                result.theData[i] = formValue;
+                //break;
+            }
+        }       */
+
+        for (long i = 0; i<lDim; i++) {
+            if (fidx[i]>= 0) {
+                result->theData[i] = cmd->formulaValues[fidx[i]];
+            }
+        }
+
+        if (hDim==vDim)
+            for (long i = 0; i<lDim; i+=vDim+1) {
+                if (fidx[i] < 0) { // mod Aug 2 2005
+                    //if (theFormulas[i]->IsEmpty())
+                    //{
+                    _Parameter st = 0;
+                    long k = i/vDim,j;
+                    for (j = k*vDim; j<k*vDim+k; j++) {
+                        st-=result->theData[j];
+                    }
+
+                    for (j = k*vDim+k+1; j<(k+1)*vDim; j++) {
+                        st-=result->theData[j];
+                    }
+
+                    result->theData[i] = st;
+                    //}
+                }
+            }
+    }
+    //return (_PMathObj)result.makeDynamic();
+    return result;
+}
+//_____________________________________________________________________________________________
+void    _Matrix::ClearFormulae (void)
+{
+    _Formula ** theFormulas = (_Formula**)theData;
+    if (theIndex) {
+        for (long i = 0; i<lDim; i++) {
+            if (IsNonEmpty(i)) {
+                delete (theFormulas[i]);
+            }
+        }
+    } else
+        for (long i = 0; i<lDim; i++) {
+            if (theFormulas[i]!=(_Formula*)ZEROPOINTER) {
+                delete (theFormulas[i]);
+            }
+        }
+}
+
+//_____________________________________________________________________________________________
+void    _Matrix::ClearObjects (void)
+{
+    _MathObject ** thePolys = (_MathObject**)theData;
+    if (theIndex) {
+        for (long i = 0; i<lDim; i++) {
+            if (IsNonEmpty(i)) {
+                DeleteObject (thePolys[i]);
+            }
+        }
+    } else
+        for (long i = 0; i<lDim; i++) {
+            if (thePolys[i]!=(_MathObject*)ZEROPOINTER) {
+                DeleteObject (thePolys[i]);
+            }
+        }
+}
+
+//_____________________________________________________________________________________________
+
+void    _Matrix::Clear (void)
+{
+    DeleteObject (theValue);
+    if (storageType == 2) { // has formulas in it - must delete
+        ClearFormulae();
+    }
+    if (storageType == 0) { // has objects in it - must delete
+        ClearObjects();
+    }
+    if (theIndex) {
+        MatrixMemFree (theIndex);
+        theIndex = nil;
+    }
+    if (theData) {
+        MatrixMemFree (theData);
+        hDim = vDim = 0;
+        theData = nil;
+    }
+
+}
+
+//_____________________________________________________________________________________________
+
+void    _Matrix::Resize (long newH)
+{
+    if (newH >= 0 && newH != hDim && storageType == 1 && theIndex == nil) {
+        hDim = newH;
+        lDim = newH*vDim;
+
+        if (theData) {
+            theData = (_Parameter*) MemReallocate ((Ptr)theData,sizeof (_Parameter)*lDim);
+        } else {
+            theData = (_Parameter*) MemAllocate (sizeof (_Parameter)*lDim);
+        }
+
+    }
+}
+
+//_____________________________________________________________________________________________
+
+_Matrix::~_Matrix (void)
+{
+    Clear();
+}
+
+//_____________________________________________________________________________________________
+
+void    _Matrix::operator = (_Matrix& m)
+{
+    Clear();
+    DuplicateMatrix (this, &m);
+}
+
+//_____________________________________________________________________________________________
+
+void    _Matrix::operator = (_Matrix* m)
+{
+    Clear();
+    DuplicateMatrix (this, m);
+}
+
+
+//_____________________________________________________________________________________________
+_Parameter _Matrix::AbsValue (void)
+{
+    if (storageType == 1 && (hDim==1 || vDim == 1)) {
+        _Parameter norm = 0.;
+        if (theIndex) {
+            for (long k = 0; k<lDim; k++)
+                if (long i = theIndex[k] >= 0) {
+                    norm += theData[i]*theData[i];
+                }
+
+            norm = sqrt(norm);
+        } else {
+            for (long k = 0; k<lDim; k++) {
+                norm += theData[k]*theData[k];
+            }
+            norm = sqrt(norm);
+        }
+        return norm;
+    }
+
+    return 0.;
+}
+
+//_____________________________________________________________________________________________
+_PMathObj _Matrix::Abs (void)
+{
+    if (storageType == 1 && (hDim==1 || vDim == 1)) {
+        return new _Constant (AbsValue());
+    }
+    return new _Constant(MaxElement());
+
+}
+
+//_____________________________________________________________________________________________
+
+void    _Matrix::Add  (_Matrix& storage, _Matrix& secondArg, bool subtract)
+// addition operation on matrices
+// internal function
+
+{
+
+    // check matrix dimensions to ensure that they are addable
+    if (!((hDim==secondArg.hDim)&&(storage.hDim==secondArg.hDim)&&(vDim==secondArg.vDim)&&(storage.vDim==secondArg.vDim))) {
+        _String  errMsg = _String ("Incompatible dimensions when trying to add or subtract matrices: first argument was a ") & _String (hDim) & 'x'
+                          & _String (vDim) & " matrix and the second was a "& _String (secondArg.hDim) & 'x'  & _String (secondArg.vDim) & " matrix.";
+        WarnError (errMsg);
+        /*warnError( -103);*/
+        return;
+    }
+
+    if (storageType == 1) {
+        if (&storage != this) { // not an add&store operation
+            // copy *this to storage
+            if (theIndex) { //sparse matrix
+                for (long i = 0; i<lDim; i++) {
+                    long k = theIndex[i];
+                    if (k!=-1) {
+                        storage[k] = theData[i];
+                    }
+                }
+            } else { // dense matrix
+                memcpy (storage.theData, theData, sizeof (_Parameter)*lDim);
+            }
+        }
+
+        if (secondArg.theIndex) { //sparse matrix
+            if (storage.theIndex) {
+                if (subtract) {
+                    for (long i = 0; i<secondArg.lDim; i++) {
+                        long k = secondArg.theIndex[i];
+                        if (k!=-1) {
+                            storage[k]-=secondArg.theData[i];
+                        }
+                    }
+                } else {
+                    for (long i = 0; i<secondArg.lDim; i++) {
+                        long k = secondArg.theIndex[i];
+                        if (k!=-1) {
+                            storage[k]+=secondArg.theData[i];
+                        }
+                    }
+                }
+            } else {
+                if (subtract) {
+                    for (long i = 0; i<secondArg.lDim; i++) {
+                        long k = secondArg.theIndex[i];
+                        if (k!=-1) {
+                            storage.theData[k]-=secondArg.theData[i];
+                        }
+                    }
+                } else {
+                    for (long i = 0; i<secondArg.lDim; i++) {
+                        long k = secondArg.theIndex[i];
+                        if (k!=-1) {
+                            storage.theData[k]+=secondArg.theData[i];
+                        }
+                    }
+                }
+            }
+
+        } else {
+            _Parameter _hprestrict_ * argData = secondArg.theData;
+            _Parameter _hprestrict_ * stData  = storage.theData;
+            
+            long    upto = secondArg.lDim - secondArg.lDim%4;
+                       
+            if (subtract)
+                for (long idx = 0; idx < upto; idx+=4) {
+                    stData[idx]-=argData[idx];
+                    stData[idx+1]-=argData[idx+1];
+                    stData[idx+2]-=argData[idx+2];
+                    stData[idx+3]-=argData[idx+3];
+                }
+            else
+                for (long idx = 0; idx < upto; idx+=4) {
+                    stData[idx]+=argData[idx];
+                    stData[idx+1]+=argData[idx+1];
+                    stData[idx+2]+=argData[idx+2];
+                    stData[idx+3]+=argData[idx+3];
+                }
+                
+            if (subtract)
+                for (long idx = upto; idx < secondArg.lDim; idx++) {
+                    stData[idx]-=argData[idx];
+                 }
+            else
+                for (long idx = upto; idx < secondArg.lDim; idx++) {
+                    stData[idx]+=argData[idx];
+                 }
+ 
+        }
+    } else
+
+        if (storageType == 0) {
+            long i;
+            if (&storage != this) { // not an add&store operation
+                /*              if (theIndex) //sparse matrix
+                                {
+                                    for (i = 0; i<lDim; i++)
+                                        if (IsNonEmpty(i))
+                                            storage.StoreObject(theIndex[i],GetMatrixObject(i),true);
+                                }
+                                else // normal matrix
+                                {
+                                    for (i = 0; i<lDim; i++)
+                                        storage.StoreObject(i,GetMatrixObject(i),true);
+                                }*/
+            }
+
+            if (secondArg.theIndex) { //sparse matrix
+                if (theIndex) { // both matrices are sparse
+                    if (subtract) {
+                        for (i = 0; i<secondArg.lDim; i++)
+                            if (secondArg.IsNonEmpty(i)) {
+                                long hb =secondArg.HashBack (i), h = Hash (hb/vDim, hb%vDim);
+                                if (h<0) { // empty slot in matrix 1
+                                    storage.StoreObject (hb,secondArg.GetMatrixObject(i)->Minus());
+                                } else {
+                                    storage.StoreObject (hb, GetMatrixObject(h)->Sub (secondArg.GetMatrixObject(i)));
+                                }
+                            }
+                    } else {
+                        for (i = 0; i<secondArg.lDim; i++)
+                            if (secondArg.IsNonEmpty(i)) {
+                                long hb =secondArg.HashBack (i), h = Hash (hb/vDim, hb%vDim);
+                                if (h<0) { // empty slot in matrix 1
+                                    storage.StoreObject (hb,secondArg.GetMatrixObject(i),true);
+                                } else {
+                                    storage.StoreObject (hb,GetMatrixObject(h)->Add (secondArg.GetMatrixObject(i)));
+                                }
+                            }
+                    }
+                } else { // *this is not sparse
+                    DuplicateMatrix(&storage,this);
+                    if (subtract) {
+                        for (i = 0; i<secondArg.lDim; i++)
+                            if (secondArg.IsNonEmpty(i)) {
+                                long p = secondArg.HashBack (i);
+                                if (CheckObject(p)) {
+                                    storage.StoreObject (p,GetMatrixObject(p)->Sub(secondArg.GetMatrixObject(i)));
+                                } else {
+                                    storage.StoreObject (p,secondArg.GetMatrixObject(i)->Minus());
+                                }
+                            }
+                    } else {
+                        for (i = 0; i<secondArg.lDim; i++)
+                            if (secondArg.IsNonEmpty(i)) {
+                                long p = secondArg.HashBack (i);
+                                if (CheckObject(p)) {
+                                    storage.StoreObject (p,GetMatrixObject(p)->Add(secondArg.GetMatrixObject(i)));
+                                } else {
+                                    storage.StoreObject (p,secondArg.GetMatrixObject(i),true);
+                                }
+                            }
+                    }
+                }
+            } else { // secondarg isn't sparse - storage must also be non-sparse
+                if (storage.theIndex) { // storage is sparse - oops
+                    storage.CheckIfSparseEnough(true);    // force to non-sparse storage
+                }
+                if (!theIndex) { // * this is not sparse
+                    _PMathObj tempP;
+                    DuplicateMatrix(&storage,this);
+                    if (subtract) {
+                        for (i = 0; i<secondArg.lDim; i++) {
+                            tempP = secondArg.GetMatrixObject(i);
+                            if (tempP) {
+                                if (CheckObject(i)) {
+                                    storage.StoreObject(i,GetMatrixObject(i)->Sub(tempP));
+                                } else {
+                                    storage.StoreObject(i,tempP->Minus());
+                                }
+                            }
+                        }
+                    } else {
+                        for (i = 0; i<secondArg.lDim; i++) {
+                            tempP = secondArg.GetMatrixObject(i);
+                            if (tempP) {
+                                if (CheckObject(i)) {
+                                    storage.StoreObject(i,GetMatrixObject(i)->Add(tempP));
+                                } else {
+                                    storage.StoreObject(i,tempP,true);
+                                }
+                            }
+                        }
+                    }
+                } else { // *this is sparse
+                    _PMathObj tempP;
+                    long h;
+                    if (subtract) {
+                        for (i = 0; i<secondArg.lDim; i++) {
+                            tempP = secondArg.GetMatrixObject(i);
+                            if (tempP) {
+                                h = Hash (i/hDim,i%hDim);
+                                if (h>=0) {
+                                    storage.StoreObject(i,GetMatrixObject(h)->Sub(tempP));
+                                } else {
+                                    storage.StoreObject(i,tempP->Minus());
+                                }
+                            }
+                        }
+                    } else {
+                        for (i = 0; i<secondArg.lDim; i++) {
+                            tempP = secondArg.GetMatrixObject(i);
+                            if (tempP) {
+                                h = Hash (i/hDim,i%hDim);
+                                if (h>=0) {
+                                    storage.StoreObject(i,GetMatrixObject(h)->Add(tempP));
+                                } else {
+                                    storage.StoreObject(i,tempP,true);
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+        }
+    if (storage.theIndex) {
+        storage.CheckIfSparseEnough();
+    }
+}
+
+//_____________________________________________________________________________________________
+
+bool    _Matrix::AddWithThreshold  (_Matrix& secondArg, _Parameter prec)
+{
+    bool res = true;
+    if (secondArg.theIndex) { //sparse matrix
+        long i,k;
+        for (i = 0; res&&(i<secondArg.lDim); i++) {
+            k = secondArg.theIndex[i];
+            if (k!=-1) {
+                if (secondArg.theData[i]/theData[k] > prec) {
+                    res = false;
+                }
+                theData[k]+=secondArg.theData[i];
+            }
+        }
+        for (; i<secondArg.lDim; i++) {
+            k = secondArg.theIndex[i];
+            if (k!=-1) {
+                theData[k]+=secondArg.theData[i];
+            }
+        }
+    } else {
+        _Parameter* argData = secondArg.theData, *stData = theData,
+                    *bound = theData+lDim;
+        for (; res&&(stData!=bound); argData++, stData++) {
+            if (*argData/ *stData> prec) {
+                res = false;
+            }
+            *stData+=*argData;
+        }
+        for (; stData!=bound; argData++, stData++) {
+            *stData+=*argData;
+        }
+    }
+    return !res;
+}
+
+//_____________________________________________________________________________________________
+
+void    _Matrix::Subtract  (_Matrix& storage, _Matrix& secondArg)
+// subtraction operation on matrices
+// internal function
+
+{
+    Add (storage,secondArg,true);
+}
+
+//_____________________________________________________________________________________________
+
+void    _Matrix::Multiply  (_Matrix& storage, _Parameter c)
+// multiply a matrix by a scalar
+// internal function
+
+{
+    if (storageType == 1) { // numbers
+        _Parameter _hprestrict_ * destination = storage.theData;
+        _Parameter _hprestrict_           * source      = theData;
+            
+        if (theIndex) {
+            for (long k = 0; k < lDim; k++)
+                if (storage.theIndex[k] != -1) {
+                    destination[k] = source[k]*c;
+                }
+        } else {
+            for (long k = 0; k < lDim; k++) {
+                destination[k] = source[k]*c;
+            }
+        }
+            
+    } else {
+        _Constant * cc = new _Constant (c);
+        checkPointer (cc);
+
+        if (storageType == 2) {
+            _String    star ('*');
+            _Operation * cOp = new _Operation (cc),
+            * mOp = new _Operation (star,2);
+
+            checkPointer (cOp);
+            checkPointer (mOp);
+            for (long i=0; i<lDim; i++)
+                if (IsNonEmpty (i)) {
+                    long h       = HashBack (i);
+                    _Formula * f = GetFormula (h/vDim,h%vDim);
+                    f->GetList().AppendNewInstance (cOp);
+                    f->GetList().AppendNewInstance (mOp);
+                }
+        } else {
+            if (storageType != 3) {
+                if (theIndex)
+                    //sparse matrix
+                {
+                    for (long i=0; i<lDim; i++)
+                        if (IsNonEmpty (i)) {
+                            storage.StoreObject (HashBack(i),GetMatrixObject(i)->Mult (cc));
+                        }
+                } else {
+                    for (long i=0; i<lDim; i++)
+                        if (IsNonEmpty (i)) {
+                            storage.StoreObject (i,GetMatrixObject(i)->Mult (cc));
+                        }
+                }
+            }
+            DeleteObject (cc);
+        }
+
+    }
+}
+
+
+//_____________________________________________________________________________________________
+
+void    _Matrix::Multiply  (_Matrix& storage, _Matrix& secondArg)
+// multiplication operation on matrices
+// internal function
+// storage is assumed to NOT be *this
+
+{
+    _PMathObj tempP, tempP2;
+
+    if ( !theIndex && !secondArg.theIndex)
+        // simplest case of two non-sparse matrices - multiply in a straightforward way
+    {
+        if ( storageType == 0 && secondArg.storageType ==0) { // both matrices are polynomial in nature
+            for (long i=0; i<hDim; i++)
+                for (long j=i*secondArg.vDim; j<(i+1)*secondArg.vDim; j++) {
+                    _MathObject* secTerm = secondArg.GetMatrixObject(j%secondArg.vDim), *firstTerm = GetMatrixObject (i*vDim);
+                    if (firstTerm&&secTerm) {
+                        storage.StoreObject (j,firstTerm->Mult (secTerm));
+                    } else {
+                        storage.StoreObject (j,new _Polynomial(0.0));
+                    }
+                    for (long k=i*vDim+1, l=j%secondArg.vDim+secondArg.vDim; k<(i+1)*vDim; k++, l+=secondArg.vDim) {
+                        tempP = GetMatrixObject (k), tempP2 = secondArg.GetMatrixObject(l);
+                        if (tempP&&tempP2) {
+                            _MathObject* temp = tempP->Mult (tempP2);
+                            storage.StoreObject (j,temp->Add(storage.GetMatrixObject(j)));
+                            DeleteObject (temp);
+                        }
+                    }
+                }
+        } else {
+            if ( hDim == vDim && secondArg.hDim == secondArg.vDim)
+                /* two square dense matrices */
+            {
+                long cumulativeIndex = 0,
+                     dimm4 = vDim - vDim%4;
+
+                _Parameter _hprestrict_ * row = theData;
+                _Parameter _hprestrict_ * dest = storage.theData;
+
+#ifndef _SLKP_SSE_VECTORIZATION_
+                
+               
+                for (long i=0; i<hDim; i++, row += vDim) {
+                    for (long j=0; j<secondArg.vDim; j++) {
+                        _Parameter resCell  = 0.0;
+
+                        long k = 0, 
+                             column = j;
+                        
+                        for (; k < dimm4; k+=4, column += (secondArg.vDim<<2)) {
+                            _Parameter pr1 = row[k]   * secondArg.theData [column],                         
+                                       pr2 = row[k+1] * secondArg.theData [column + secondArg.vDim ],      
+                                       pr3 = row[k+2] * secondArg.theData [column + (secondArg.vDim << 1)],
+                                       pr4 = row[k+3] * secondArg.theData [column + secondArg.vDim * 3];
+                            resCell += pr1 + pr2 + pr3 + pr4;
+                        }
+                        
+                        if (dimm4 < vDim)
+                            for (; k < vDim; k++, column += secondArg.vDim) {
+                                resCell += row[k] * secondArg.theData[column];
+                            }
+
+                        dest[cumulativeIndex++] = resCell;
+
+                    }
+                }
+                /*_Parameter cache [128];
+                for (long i=0; i<hDim; i++, row += vDim) {
+                    for (long j=0; j<secondArg.vDim; j++) {
+                        _Parameter resCell  = 0.0;
+                        for (long l = 0, m = j; l < secondArg.vDim; l++, m += secondArg.vDim)
+                            cache[l] = secondArg.theData [m ];
+                            
+                        long k = 0;
+                        
+                        for (; k < dimm4; k+=4) {
+                            _Parameter pr1 = row[k]   * cache[k],                         
+                            pr2 = row[k+1] * cache[k+1],      
+                            pr3 = row[k+2] * cache[k+2],
+                            pr4 = row[k+3] * cache[k+3];
+                            pr1 += pr2;
+                            pr3 += pr4;
+                            resCell += pr1 + pr3;
+                        }
+                        
+                        if (dimm4 < vDim)
+                            for (; k < vDim; k++) {
+                                resCell += row[k] * cache[k];
+                            }
+                        
+                        storage.theData[cumulativeIndex++] = resCell;
+                        
+                    }
+                }*/
+                /*} else {
+                    for (long i=0; i<hDim; i++, row += vDim) {
+                        for (long j=0; j<secondArg.vDim; j++) {
+                            _Parameter resCell = 0.0;
+
+                            for (long k = 0, column = j; k < vDim; k++, column += secondArg.vDim) {
+                                resCell += row[k] * secondArg.theData[column];
+                            }
+
+                            storage.theData[cumulativeIndex++] = resCell;
+                        }
+                    }
+                }*/
+#else
+                secondArg.Transpose();
+                for (long i=0; i<hDim; i++, row += vDim) {
+                    for (long j=0; j<hDim; j++) {
+                        _Parameter resCell  = 0.0;
+                        for (long k = 0, column = j*hDim; k < vDim; k++, column ++) {
+                            resCell += row[k] * secondArg.theData [column];
+                        }
+
+                        storage.theData[cumulativeIndex++] = resCell;
+                    }
+                }
+                secondArg.Transpose();
+#endif
+            } else
+                /* rectangular matrices */
+            {   
+#define _HY_MATRIX_CACHE_BLOCK 128
+                 if (vDim >= 256) {
+#ifdef _OPENMP
+                      #define GCC_VERSION (__GNUC__ * 10000 \
+                               + __GNUC_MINOR__ * 100 \
+                               + __GNUC_PATCHLEVEL__)
+                
+                     long nt           = MIN(omp_get_max_threads(),secondArg.vDim / _HY_MATRIX_CACHE_BLOCK + 1);
+#endif
+                     for (long r = 0; r < hDim; r ++) {
+#ifdef _OPENMP                     
+#if GCC_VERSION > 40400
+#pragma omp parallel for default(none) shared(r,secondArg,storage) schedule(static) if (nt>1)  num_threads (nt)
+#else
+#pragma omp parallel for default(none) shared(r) schedule(static) if (nt>1)  num_threads (nt)
+#endif
+#endif
+                         for (long c = 0; c < secondArg.vDim; c+= _HY_MATRIX_CACHE_BLOCK) {
+                             _Parameter cacheBlockInMatrix2 [_HY_MATRIX_CACHE_BLOCK][_HY_MATRIX_CACHE_BLOCK];
+                             const long upto_p = (secondArg.vDim-c>=_HY_MATRIX_CACHE_BLOCK)?_HY_MATRIX_CACHE_BLOCK:(secondArg.vDim-c);
+                             for (long r2 = 0; r2 < secondArg.hDim; r2+= _HY_MATRIX_CACHE_BLOCK) {
+                                 const long upto_p2 = (secondArg.hDim-r2)>=_HY_MATRIX_CACHE_BLOCK?_HY_MATRIX_CACHE_BLOCK:(secondArg.hDim-r2);
+                                 for (long p = 0; p < upto_p; p++) {
+                                     for (long p2 = 0; p2 < upto_p2; p2++) {
+                                         cacheBlockInMatrix2[p][p2] = secondArg.theData [(r2+p2)*secondArg.vDim+c+p];
+                                     }
+                                 }
+                                 if (upto_p2 % 4 == 0) {
+                                     for (long p = 0; p < upto_p; p++) {
+                                         _Parameter updater = 0.;
+                                         for (long p2 = 0; p2 < upto_p2; p2+=4) {
+                                             _Parameter pr1 = theData[r*vDim + r2 + p2]*cacheBlockInMatrix2[p][p2],
+                                                        pr2 = theData[r*vDim + r2 + p2+1]*cacheBlockInMatrix2[p][p2+1],
+                                                        pr3 = theData[r*vDim + r2 + p2+2]*cacheBlockInMatrix2[p][p2+2],
+                                                        pr4 = theData[r*vDim + r2 + p2+3]*cacheBlockInMatrix2[p][p2+3];
+                                             pr1 += pr2;
+                                             pr3 += pr4;
+                                             updater += pr1 + pr3;
+                                         }
+                                         storage.theData[r*secondArg.vDim + c + p] += updater;
+                                     } 
+                                 } else
+                                     for (long p = 0; p < upto_p; p++) {
+                                         _Parameter updater = 0.;
+                                         for (long p2 = 0; p2 < upto_p2; p2++) {
+                                             updater += theData[r*vDim + r2 + p2]*cacheBlockInMatrix2[p][p2];
+                                         }
+                                         storage.theData[r*secondArg.vDim + c + p] += updater;
+                                     } 
+                             }
+                         }
+                     }
+                     
+                 } else {
+                     
+                     
+                    if (vDim % 4) {
+                        long mod4 = vDim-vDim%4;
+                        for (long i=0; i<hDim; i++) {
+                            for (long j=0; j<secondArg.vDim; j++) {
+                                _Parameter resCell = 0.0;
+                                long k = 0;
+                                for (; k < mod4; k+=4) {
+                                    resCell += theData[i*vDim + k] * secondArg.theData[k*secondArg.vDim + j] +
+                                    theData[i*vDim + k + 1] * secondArg.theData[(k+1)*secondArg.vDim + j] +
+                                    theData[i*vDim + k + 2] * secondArg.theData[(k+2)*secondArg.vDim + j] +
+                                    theData[i*vDim + k + 3] * secondArg.theData[(k+3)*secondArg.vDim + j];
+                                }
+                                for (; k < vDim; k++) {
+                                    resCell += theData[i*vDim + k] * secondArg.theData[k*secondArg.vDim + j];
+                                }
+                                
+                                storage.theData[i*secondArg.vDim + j] = resCell;
+                            }
+                        }
+                    } else {
+                        for (long i=0; i<hDim; i++) {
+                            for (long j=0; j<secondArg.vDim; j++) {
+                                _Parameter resCell = 0.0;
+                                for (long k = 0; k < vDim; k+=4) {
+                                    resCell += theData[i*vDim + k] * secondArg.theData[k*secondArg.vDim + j] +
+                                    theData[i*vDim + k + 1] * secondArg.theData[(k+1)*secondArg.vDim + j] +
+                                    theData[i*vDim + k + 2] * secondArg.theData[(k+2)*secondArg.vDim + j] +
+                                    theData[i*vDim + k + 3] * secondArg.theData[(k+3)*secondArg.vDim + j];
+                                }
+                                
+                                
+                                storage.theData[i*secondArg.vDim + j] = resCell;
+                            }
+                        }
+                    }
+                }
+                
+            }
+        }
+
+    } else if (theIndex && !secondArg.theIndex) { // sparse multiplied by non-sparse
+        if (storageType == 1 && secondArg.storageType ==1) { // both numeric
+            if ( vDim == hDim && secondArg.vDim==secondArg.hDim) { // both square and same dimension
+                long loopBound = vDim - vDim%4;
+
+                for (long k=0; k<lDim; k++) { // loop over entries in the 1st matrix
+                    long m = theIndex[k];
+                    if  (m!=-1) { // non-zero
+                        long i;
+                        if (vDim == 61) {
+                            i = m % 61;
+                        } else {
+                            i = m%vDim;
+                        }
+                        // this element will contribute to (r, c' = [0..vDim-1]) entries in the result matrix
+                        // in the form of A_rc * B_cc'
+
+                        _Parameter  value                           = theData[k];
+                        _Parameter  _hprestrict_ *res               = storage.theData    + (m-i);
+                        _Parameter  _hprestrict_ *secArg            = secondArg.theData  + i*vDim;
+
+#ifndef _SLKP_SSE_VECTORIZATION_
+#ifdef  _SLKP_USE_SSE_INTRINSICS
+
+                         __m128d buffer1,
+                                buffer2,
+                                buffer3,
+                                buffer4,
+                                value_op = _mm_load1_pd (&value);
+                                
+                        if (((long int)secArg & 0x1111b) == 0 && ((long int)res & 0x1111b) == 0) {
+                            for (long i = 0; i < loopBound; i+=4) {
+                                buffer1 = _mm_load_pd (secArg+i);
+                                buffer2 = _mm_load_pd (secArg+i+2);
+                                buffer3 = _mm_load_pd (res+i);
+                                buffer4 = _mm_load_pd (res+i+2);
+                                buffer1 = _mm_mul_pd (buffer1, value_op);
+                                buffer2 = _mm_mul_pd (buffer2, value_op);
+                                buffer3 = _mm_add_pd (buffer3, buffer1);
+                                buffer4 = _mm_add_pd (buffer4, buffer2);
+                                _mm_store_pd (res+i, buffer3);
+                                _mm_store_pd (res+i+2, buffer4);
+                             }
+                        } else {
+                            for (long i = 0; i < loopBound; i+=4) {
+                                buffer1 = _mm_loadu_pd (secArg+i);
+                                buffer2 = _mm_loadu_pd (secArg+i+2);
+                                buffer3 = _mm_loadu_pd (res+i);
+                                buffer4 = _mm_loadu_pd (res+i+2);
+                                buffer1 = _mm_mul_pd (buffer1, value_op);
+                                buffer2 = _mm_mul_pd (buffer2, value_op);
+                                buffer3 = _mm_add_pd (buffer3, buffer1);
+                                buffer4 = _mm_add_pd (buffer4, buffer2);
+                                _mm_storeu_pd (res+i, buffer3);
+                                _mm_storeu_pd (res+i+2, buffer4);
+                             }
+                        }
+
+#endif
+                        
+#ifdef  _SLKP_USE_AVX_INTRINSICS
+                        __m256d buffer1,
+                                buffer2,
+                                value_op = _mm256_set_pd (value,value,value,value);
+                        
+                        if (((long int)secArg & 0x11111b) == 0 && ((long int)res & 0x11111b) == 0) {
+                            for (long i = 0; i < loopBound; i+=4) {
+                                buffer1 = _mm256_load_pd (secArg+i);
+                                buffer2 = _mm256_load_pd (res+i);
+                                buffer1 = _mm256_mul_pd (buffer1, value_op);
+                                buffer2 = _mm256_add_pd (buffer2, buffer1);
+                                _mm256_store_pd (res+i, buffer2);
+                            }
+                        } else {
+                            for (long i = 0; i < loopBound; i+=4) {
+                                buffer1 = _mm256_loadu_pd (secArg+i);
+                                buffer2 = _mm256_loadu_pd (res+i);
+                                buffer1 = _mm256_mul_pd (buffer1, value_op);
+                                buffer2 = _mm256_add_pd (buffer2, buffer1);
+                                _mm256_storeu_pd (res+i, buffer2);
+                            }
+                        }
+#endif
+                        
+#if not defined  _SLKP_USE_AVX_INTRINSICS and not defined _SLKP_USE_SSE_INTRINSICS
+                        for (long i = 0; i < loopBound; i+=4) {
+                            res[i] += value * secArg[i];
+                            res[i+1] += value * secArg[i+1];
+                            res[i+2] += value * secArg[i+2];
+                            res[i+3] += value * secArg[i+3];
+                        }
+#endif
+                        for (long j = loopBound; j < vDim; j++) {
+                            res[j]   += value * secArg[j];
+                        }
+#else
+                        for (long i = 0; i < vDim; i++) {
+                            res[i]   += value * secArg[i];
+                        }
+#endif
+
+                    }
+                }
+            } else {
+                for (long k=0; k<lDim; k++) {
+                    long m = theIndex[k];
+                    if (m!=-1) {
+                        long i = m/vDim;
+                        long j = m%vDim;
+                        _Parameter c = theData[k];
+                        _Parameter* stData = storage.theData+i*secondArg.vDim,
+                                    * secArgData=secondArg.theData+j*secondArg.vDim,
+                                      * stopper = secArgData+secondArg.vDim;
+                        for (; secArgData!=stopper; stData++,secArgData++) {
+                            *stData+=c**secArgData;
+                        }
+                    }
+                }
+            }
+        } else { // polynomial entries
+            for (long k=0; k<lDim; k++) {
+                if (IsNonEmpty(k)) {
+                    long i = theIndex[k]/vDim;
+                    long j = theIndex[k]%vDim;
+                    _MathObject* p = GetMatrixObject(k);
+                    for (long l=j*secondArg.vDim, m=i*secondArg.vDim; l<(j+1)*secondArg.vDim; l++,m++) {
+                        tempP = secondArg.GetMatrixObject (l);
+                        if (!tempP) {
+                            continue;
+                        }
+                        _MathObject* temp = p->Mult (secondArg.GetMatrixObject (l));
+                        tempP = storage.GetMatrixObject(m);
+                        if (tempP) {
+                            storage.StoreObject (m, tempP->Add (temp));
+                        } else {
+                            storage.StoreObject (m, temp, true);
+                        }
+                        DeleteObject (temp);
+                    }
+                }
+            }
+        }
+
+    } else if ( !theIndex && secondArg.theIndex)
+        // non-sparse multiplied by sparse
+    {
+        if ( storageType == 1 && secondArg.storageType ==1) {
+            if (vDim == hDim && secondArg.vDim==secondArg.hDim)
+                // both are square matrices
+            {
+                for (long k=0; k<secondArg.lDim; k++) {
+                    long m = secondArg.theIndex[k];
+                    if (m!=-1) { // a non-zero value
+                        // because r_ij = sum_k a_ik * b_kj
+                        // a non-zero b_kj will contribute a_ik * b_kj to the a_ij cell of the result
+                        // loop over i...
+
+                        _Parameter c = secondArg.theData[k];
+
+                        for (long cell = m%secondArg.vDim, secondCell = m/secondArg.vDim; cell < lDim; cell += vDim, secondCell += vDim) {
+                            storage.theData[cell] += c * theData[secondCell];
+                        }
+
+                    }
+                }
+            } else {
+                for (long k=0; k<secondArg.lDim; k++) {
+                    long m = secondArg.theIndex[k];
+                    if (m!=-1) {
+                        long i = m/secondArg.vDim;
+                        long j = m%secondArg.vDim;
+                        _Parameter c = secondArg.theData[k];
+                        _Parameter *stData = storage.theData+j,
+                                    *secData = theData+i,
+                                     *stopper = theData+lDim;
+                        for (; secData<stopper; secData+=vDim, stData+=secondArg.vDim) {
+                            *stData += c**secData;
+                        }
+                    }
+                }
+            }
+        } else { // polynomial entries
+            for (long k=0; k<secondArg.lDim; k++) {
+
+                if (secondArg.IsNonEmpty(k)) {
+                    long i = secondArg.theIndex[k]/secondArg.vDim;
+                    long j = secondArg.theIndex[k]%secondArg.vDim;
+                    _MathObject* p = secondArg.GetMatrixObject(k);
+                    for (long l=i, m=j; l<lDim; l+=vDim,m+=secondArg.vDim) {
+                        tempP = GetMatrixObject (l);
+                        if (!tempP) {
+                            continue;
+                        }
+                        _MathObject* temp = p->Mult (tempP);
+                        tempP = storage.GetMatrixObject(m);
+                        if (tempP) {
+                            storage.StoreObject (m, tempP->Add (temp));
+                        } else {
+                            storage.StoreObject (m, temp, true);
+                        }
+                        DeleteObject (temp);
+                    }
+                }
+            }
+
+        }
+    } else
+        //sparse by sparse
+    {
+        long *indexTable,
+             *indexTable2,
+             *indexVector,
+             //indexTableDim = secondArg.hDim*(secondArg.vDim+1),
+             indexTableDim = secondArg.hDim*secondArg.vDim,
+             t,
+             //dd = secondArg.vDim+1 ;
+             dd = secondArg.vDim;
+        indexTable  = (long*)MatrixMemAllocate( sizeof(long)*indexTableDim);
+        indexTable2 = (long*)MatrixMemAllocate( sizeof(long)*indexTableDim);
+        indexVector = (long*)MatrixMemAllocate( sizeof(long)*secondArg.hDim);
+
+        if (!(indexTable&&indexTable2&&indexVector)) {
+            warnError (-108);
+        }
+
+        memset (indexTable,0,indexTableDim*sizeof(long));
+        memset (indexTable2,0,indexTableDim*sizeof(long));
+        memset (indexVector,0,secondArg.hDim*sizeof(long));
+        if (storageType == 1)
+            // numeric
+        {
+            for (long i=0; i<secondArg.lDim; i++) {
+                if ((t=secondArg.theIndex[i])!=-1) {
+                    long k = t/secondArg.vDim;
+                    long j = k*dd+(indexVector[k]++);
+                    indexTable [j] = t%secondArg.vDim;
+                    indexTable2[j] = i;
+                }
+            }
+            for (long k=0; k<lDim; k++) {
+                if ((t=theIndex[k])!=-1) {
+                    long i = t/vDim;
+                    long j = t%vDim;
+                    _Parameter c = theData[k];
+                    long n = j*dd;
+                    long m = i*secondArg.vDim;
+                    for (long l=n; l<n+indexVector[j]; l++) {
+                        storage.theData[m+indexTable[l]]+= c*secondArg.theData[indexTable2[l]];
+                    }
+                }
+            }
+        } else { // polynomial entries
+            for (long i=0; i<secondArg.lDim; i++) {
+                t=secondArg.theIndex[i];
+                if (IsNonEmpty(i)) {
+                    long k = t/secondArg.vDim;
+                    long j = k*dd+(indexVector[k]++);
+                    indexTable [j] = t%secondArg.vDim;
+                    indexTable2[j] = i;
+                }
+            }
+            for (long k=0; k<lDim; k++) {
+                if (IsNonEmpty(k)) {
+                    long i = theIndex[k]/vDim;
+                    long j = theIndex[k]%vDim;
+                    _MathObject* p = GetMatrixObject(k);
+                    long n = j*dd;
+                    long m = i*secondArg.vDim;
+                    for (long l=n; l<n+indexVector[j]; l++) {
+                        _MathObject* temp = p->Mult (secondArg.GetMatrixObject (indexTable2[l]));
+                        tempP = storage.GetMatrixObject(m+indexTable[l]%secondArg.vDim);
+                        if (tempP) {
+                            storage.StoreObject (m+indexTable[l]%secondArg.vDim, tempP->Add (temp));
+                        } else {
+                            storage.StoreObject (m+indexTable[l]%secondArg.vDim, temp, true);
+                        }
+
+                        DeleteObject (temp);
+                    }
+                }
+            }
+        }
+
+        MatrixMemFree( indexTable);
+        MatrixMemFree( indexTable2);
+        MatrixMemFree( indexVector);
+
+    }
+
+
+}
+
+//_____________________________________________________________________________________________
+
+long    _Matrix::HashBack  (long logicalIndex)
+// returns element's matrix index in the form vDim*(i-1)+j, where i, j are the matrix coordinates
+// given a buffer index
+{
+    return theIndex?theIndex [logicalIndex]:logicalIndex;
+}
+
+//_____________________________________________________________________________________________
+
+_Parameter  _Matrix::MaxElement  (char runMode, long* indexStore)
+// returns matrix's largest abs value element
+{
+    if (storageType == 1) {
+        _Parameter max  = 0.0,
+                   temp;
+
+        bool doAbsValue = runMode != 1 && runMode != 3,
+             doMaxElement = runMode == 0 || runMode == 3;
+
+        if (doMaxElement) {
+            max = -A_LARGE_NUMBER;
+        }
+
+        if (theIndex) {
+            for (long i = 0; i<lDim; i++) {
+                long k = theIndex[i];
+                if  (k != -1) {
+                    temp = theData[i];
+                    if (doAbsValue && temp<0.0) {
+                        temp = -temp;
+                    }
+
+                    if (doMaxElement) {
+                        if (temp>max) {
+                            max = temp;
+                            if (indexStore) {
+                                *indexStore = k;
+                            }
+                        }
+                    } else {
+                        max += temp;
+                    }
+                }
+            }
+            return max;
+        } else {
+            for (long i = 0; i<lDim; i++) {
+                temp = theData[i];
+                if (doAbsValue && temp<0.0) {
+                    temp = -temp;
+                }
+
+                if (doMaxElement) {
+                    if (temp>max) {
+                        max = temp;
+                        if (indexStore) {
+                            *indexStore = i;
+                        }
+                    }
+                } else {
+                    max += temp;
+                }
+            }
+            return max;
+        }
+    }
+    if (runMode) {
+        return 0;
+    }
+
+    return 10.0;
+}
+
+//_____________________________________________________________________________________________
+
+void    _Matrix::RowAndColumnMax  (_Parameter& r, _Parameter &c, _Parameter * cache)
+
+// returns the maximum row sum / column sum
+// the cache must be big enough to hold hDim + vDim
+// leave as nil to allocate cache run time
+
+{
+    r = c = 10.;
+
+    if (storageType == 1) { // numeric matrix
+        _Parameter  *maxScratch = cache;
+        r = c = 0.;
+
+        if (maxScratch == nil) {
+            checkPointer (maxScratch = (_Parameter*)calloc (hDim+vDim,sizeof(_Parameter)));
+        } else
+            for (long k = 0; k < hDim + vDim; k++) {
+                maxScratch[k] = .0;
+            }
+
+        _Parameter * rowMax = maxScratch,
+                     * colMax = maxScratch + hDim;
+
+        if (theIndex)
+            // sparse matrix
+            for (long i = 0; i<lDim; i++) {
+                long k = theIndex[i];
+                if  (k!=-1) {
+                    _Parameter temp = theData[i];
+
+                    if (temp<0.0) {
+                        rowMax[k/vDim] -= temp;
+                        colMax[k%vDim] -= temp;
+                    } else {
+                        rowMax[k/vDim] += temp;
+                        colMax[k%vDim] += temp;
+                    }
+                }
+            }
+        else
+            // dense matrix
+            for (long i = 0, k=0; i<hDim; i++) {
+                for (long j=0; j<vDim; j++, k++) {
+                    _Parameter temp = theData[k];
+                    if (temp<0.0) {
+                        rowMax[i] -= temp;
+                        colMax[j] -= temp;
+                    } else {
+                        rowMax[i] += temp;
+                        colMax[j] += temp;
+                    }
+                }
+            }
+
+        for (long i=0; i<hDim; i++) if (rowMax[i]>r)    {
+                r = rowMax [i];
+            }
+        for (long j=0; j<vDim; j++) if (colMax[j]>c)    {
+                c = colMax [j];
+            }
+
+        if (!cache) {
+            free(maxScratch);
+        }
+    }
+}
+
+//_____________________________________________________________________________________________
+
+bool    _Matrix::IsMaxElement  (_Parameter bench)
+// returns matrix's largest abs value element
+{
+    if (storageType == 1) {
+        _Parameter t,
+                   mBench = -bench;
+        for (long i = 0; i<lDim; i++) {
+            t = theData[i];
+            if ((t<mBench)||(t>bench)) {
+                return true;
+            }
+        }
+        return false;
+    } else if (storageType == 0) {
+        _Polynomial ** pData = (_Polynomial **)theData;
+        for (long i = 0; i<lDim; i++, pData++) {
+            if ((*pData)->IsMaxElement(bench)) {
+                return true;
+            }
+        }
+        return false;
+    }
+    return true;
+}
+
+//_____________________________________________________________________________________________
+
+_Parameter  _Matrix::MaxRelError  (_Matrix& compMx)
+// returns matrix's largest abs value element
+{
+    if (storageType == 1) {
+        _Parameter max = 0, temp;
+        for (long i = 0; i<lDim; i++) {
+            temp = theData[i]/compMx.theData[i];
+            if (temp<0.0) {
+                temp*=-1.0;
+            }
+            if (temp>max) {
+                max = temp;
+            }
+        }
+        return max;
+    }
+    return 10.0;
+}
+
+//_____________________________________________________________________________________________
+
+bool    _Matrix::IsAVector  (char type)
+{
+    if (GetHDim() == 1) {
+        return type != HY_MATRIX_COLUMN_VECTOR;
+    }
+    if (GetVDim() == 1) {
+        return (type != HY_MATRIX_ROW_VECTOR);
+    }
+    return false;
+}
+
+//_____________________________________________________________________________________________
+
+_Parameter  _Matrix::MinElement  (char doAbsValue, long* storeIndex)
+// returns matrix's smalles non-zero abs value element
+{
+    if (storageType == 1) {
+        _Parameter min = DBL_MAX;
+
+        if (theIndex)
+            for (long i = 0; i<lDim; i++) {
+                if (theIndex[i] < 0) {
+                    continue;
+                }
+
+                _Parameter temp = theData[i];
+
+                if (temp < 0.0 && doAbsValue) {
+                    temp = -temp;
+                }
+
+                if (temp<min) {
+                    if (storeIndex) {
+                        *storeIndex = theIndex[i];
+                    }
+                    min = temp;
+                }
+
+            }
+        else
+            for (long i = 0; i<lDim; i++) {
+                _Parameter temp = theData[i];
+
+                if (temp < 0.0 && doAbsValue) {
+                    temp = -temp;
+                }
+
+                if (temp<min) {
+                    if (storeIndex) {
+                        *storeIndex = i;
+                    }
+                    min = temp;
+                }
+            }
+
+        return min;
+    } else {
+        return 1.0;
+    }
+}
+//_____________________________________________________________________________________________
+void    _Matrix::Transpose (void)
+// transpose a matrix
+{
+    if (storageType == 1) {
+        if (hDim == vDim) { // do an in place swap
+            if (!theIndex) { // non-sparse
+                for (long i = 0; i<hDim; i++)
+                    for (long j = i+1; j<vDim; j++) {
+                        _Parameter z      = theData[i*vDim+j];
+                        theData[i*vDim+j] = theData[j*vDim+i];
+                        theData[j*vDim+i] = z;
+                    }
+            } else { // sparse
+                for (long i = 0; i<lDim; i++) {
+                    long p = theIndex[i];
+                    if (p!=-1) {
+                        long k      = p/vDim;
+                        long l      = p%vDim;
+
+                        if (l!=k) { // off - diag
+                            p            = Hash (l,k);
+                            _Parameter z = theData[i];
+                            if (p>=0) {
+                                theData[i] = theData[p];
+                                theData[p] = z;
+                            } else {
+                                theIndex[i]=-1;
+                                (*this)[l*vDim+k]=z;
+                            }
+                        }
+                    }
+                }
+            }
+        } else {
+            _Matrix result (vDim, hDim, bool(theIndex), true);
+            if (!theIndex) { // dense
+                for (long i = 0; i<hDim; i++)
+                    for (long j = 0; j<vDim; j++) {
+                        result.theData[j*hDim+i]=theData[i*vDim+j];
+                    }
+            } else {
+                for (long i = 0; i<lDim; i++)
+                    if (IsNonEmpty(i)) {
+                        long r = theIndex[i]/vDim,
+                             c = theIndex[i]%vDim;
+
+                        result[c*hDim+r]=theData[i];
+                    }
+            }
+            *this = result;
+        }
+    } else { // polynomial entries
+        Ptr z;
+        if (hDim == vDim) {
+            if (!theIndex) { // non-sparse
+                for (long i = 0; i<hDim; i++)
+                    for (long j = i+1; j<vDim; j++) {
+                        if (storageType==2) {
+                            z = (Ptr)GetFormula(i,j);
+                        } else {
+                            z = (Ptr)GetMatrixObject(i*vDim+j);
+                        }
+
+                        if (storageType==2) {
+                            ((_Formula**)theData)[i*vDim+j] = GetFormula(j,i);
+                        } else {
+                            ((_PMathObj*)theData)[i*vDim+j] = GetMatrixObject(j*vDim+i);
+                        }
+
+                        ((Ptr*)theData)[j*vDim+i] = z;
+                    }
+            } else { // sparse
+                long i,k,l,p;
+                for (i = 0; i<lDim; i++) {
+                    if (IsNonEmpty(i)) {
+                        k = theIndex[i]/vDim;
+                        l = theIndex[i]%vDim;
+                        if (l!=k) {
+                            p = Hash (l,k);
+
+                            if (storageType==2) {
+                                z = (Ptr)GetFormula(k,l);
+                            } else {
+                                z = (Ptr)GetMatrixObject(i);
+                            }
+
+                            if (p>=0) {
+                                if (storageType==2) {
+                                    ((_Formula**)theData)[i]    = GetFormula(l,k);
+                                } else {
+                                    ((_MathObject**)theData)[i] = GetMatrixObject(p);
+                                }
+
+                                ((Ptr*)theData)[p] = z;
+                            } else {
+                                theIndex[i]=-1;
+                                if (storageType==2) {
+                                    StoreFormula(l,k,*(_Formula*)z,false,false);
+                                } else {
+                                    StoreObject(l*vDim+k,(_PMathObj)z);
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+        } else {
+
+            _Matrix result;
+            CreateMatrix (&result,vDim, hDim, bool(theIndex),false,storageType==2);
+            result.storageType = storageType;
+            if (!theIndex) {
+                for (long i = 0; i<hDim; i++)
+                    for (long j = 0; j<vDim; j++) {
+                        if (storageType == 2) {
+                            result.StoreFormula(j,i,*GetFormula(i,j),true,false);
+                        } else {
+                            z =   (Ptr)GetMatrixObject (i*vDim+j);
+                            result.StoreObject(j*hDim+i,(_PMathObj)z);
+                            ((_PMathObj)z)->nInstances++;
+                        }
+                    }
+            } else {
+                long r,c;
+                for (long i = 0; i<lDim; i++)
+                    if (IsNonEmpty(i)) {
+                        r = theIndex[i]/vDim;
+                        c = theIndex[i]%vDim;
+                        if (storageType == 2) {
+                            result.StoreFormula(c,r,*GetFormula(r,c),true,false);
+                        } else {
+                            z =   (Ptr)GetMatrixObject (i);
+                            result.StoreObject(c*hDim+r,(_PMathObj)z);
+                            ((_PMathObj)z)->nInstances++;
+                        }
+                    }
+            }
+            Swap (result);
+            //*this = result;
+        }
+    }
+}
+
+//_____________________________________________________________________________________________
+
+void    _Matrix::CompressSparseMatrix (bool transpose, _Parameter * stash)
+{
+    if (theIndex) {
+        _SimpleList sortedIndex  ((unsigned long)lDim)
+        ,sortedIndex3 ((unsigned long)lDim)
+        ,sortedIndex2
+        ;
+
+
+        long blockChunk = 32,
+             blockShift = hDim / blockChunk + 1,
+             max        = 0;
+
+
+        for (long i2=0; i2<lDim; i2++) {
+            long k = theIndex[i2];
+            if  (k!=-1) {
+                long r = transpose?(k/vDim):(k%vDim),
+                     c = transpose?(k%vDim):(k/vDim),
+                     r2 = c / blockChunk * blockShift + r / blockChunk,
+                     r3 = r2 * lDim + r * vDim + c;
+
+                sortedIndex  << (c*vDim + r);
+                sortedIndex3 << r3;
+                stash[sortedIndex.lLength-1] = theData[i2];
+                if (r3 > max) {
+                    max = r3;
+                }
+            }
+        }
+
+        if (max > (lDim<<4)) {
+            sortedIndex2. Populate(sortedIndex.lLength,0,1);
+            SortLists(&sortedIndex3,&sortedIndex2);
+        } else {
+            DeleteObject (sortedIndex3.CountingSort(-1, &sortedIndex2));
+        }
+
+        for (long i=0; i<sortedIndex.lLength; i++) {
+            theIndex[i] = sortedIndex.lData[sortedIndex2.lData[i]];
+            theData[i]  = stash[sortedIndex2.lData[i]];
+        }
+
+        lDim = sortedIndex.lLength;
+    }
+}
+
+
+//_____________________________________________________________________________________________
+
+_Matrix*    _Matrix::Exponentiate (void)
+{
+    // find the maximal elements of the matrix
+    long i,
+         power2 = 0;
+
+#ifndef _OPENMP
+    matrixExpCount++;
+#endif
+
+    _Parameter max     = 1.0,
+               *stash  = new _Parameter[hDim*(1+vDim)];
+
+    if (storageType) {
+        _Parameter t;
+        RowAndColumnMax (max, t, stash);
+        max *= t;
+        if (max > .1) {
+            max             = sqrt (10.*max);
+            power2          = (long)((log (max)/log ((_Parameter)2.0)))+1;
+            max             = exp (power2 * log ((_Parameter)2.0));
+            (*this)         *= 1.0/max;
+        } else {
+            power2 = 0;
+        }
+
+        if (theIndex)
+            // transpose sparse matrix
+        {
+            CompressSparseMatrix (true,stash);
+        }
+
+    } else {
+        max = 1.;
+    }
+
+    _Matrix *result = new _Matrix(hDim, vDim , !storageType, storageType),
+    temp    (*this);
+
+    checkPointer (result);
+    // put ones on the diagonal
+
+    if (storageType) {
+        for (i=0; i<result->lDim; i+=vDim+1) {
+            result->theData[i]=1.0;
+        }
+    } else {
+        _Polynomial one (1.0);
+        for (i=0; i<(*result).hDim*(*result).vDim; i+=vDim+1) {
+            (*result).StoreObject(i,&one,true);
+        }
+    }
+
+    if (max == 0.0) {
+        delete [] stash;
+        return result;
+    }
+
+    (*result) += (*this);
+
+    i = 2;
+
+    if (precisionArg||!storageType) {
+        if (storageType)
+            for (; i<=precisionArg; i++) {
+                temp      *= (*this);
+                temp      *= 1.0/i;
+                (*result) += temp;
+            }
+        else {
+            while (temp.IsMaxElement (polynomialExpPrecision)) {
+                if (i>maxPolynomialExpIterates) {
+                    break;
+                }
+                temp        *= (*this);
+                temp        *= 1.0/i;
+                (*result)   += temp;
+                i++;
+            }
+            if (i>maxPolynomialExpIterates) {
+                _String   wM ("Polynomial Matrix Exponential Failed to achieve accuracy POLYNOMIAL_EXP_PRECISION in under MAX_POLYNOMIAL_EXP_ITERATES. Either decrease the precision, or increase the maximum number of iterates.");
+                ReportWarning (wM);
+            }
+        }
+    } else {
+        _Parameter tMax = MAX(MinElement()*sqrt ((_Parameter)hDim),truncPrecision);
+
+        i=2;
+
+        _Matrix tempS (hDim, vDim, false, temp.storageType);
+        do {
+            temp.MultbyS        (*this,theIndex!=nil, &tempS, stash);
+            temp      *= 1.0/i;
+            (*result) += temp;
+            i         ++;
+#ifndef _OPENMP
+            taylorTermsCount++;
+#endif
+        } while (temp.IsMaxElement(tMax*truncPrecision*i));
+
+        // use Pade (4,4) here
+
+        /*_Matrix temp (*this), top (result) , bottom (result);
+        temp *= .5;
+        top+=temp;
+        bottom-=temp;
+        temp *= *this;
+        temp *= 3.0/14.0;
+        top+=temp;
+        bottom+=temp;
+        temp *= *this;
+        temp *= 1.0/9.0;
+        top+=temp;
+        bottom-=temp;
+        temp *= 1.0/20.0;
+        top+=temp;
+        bottom+=temp;
+        _Matrix* inv = (_Matrix*)bottom.Inverse();
+        top *= *inv;
+        DeleteObject (inv);
+        result = top;*/
+    }
+
+    if (power2) {
+        (*this)*=max;
+    }
+
+    if (theIndex)
+        // transpose back
+    {
+        for (i=0; i<lDim; i++) {
+            long k = theIndex[i];
+            if  (k!=-1) {
+                theIndex[i] = (k%vDim)*vDim + k/vDim;
+            }
+        }
+        result->Transpose();
+    }
+
+
+    for (long s = 0; s<power2; s++) {
+#ifndef _OPENMP
+        squaringsCount++;
+#endif
+        result->Sqr(stash);
+    }
+    delete [] stash;
+
+    return result;
+}
+
+//_____________________________________________________________________________________________
+
+long    _Matrix::Hash  (long i, long j)
+// returns element's position in the buffer (-1 if not found)
+{
+    if (!bufferPerRow)
+        // first call, need to set up hashing parameters
+    {
+        bufferPerRow = lDim/hDim;
+        overflowBuffer = hDim*storageIncrement/100;
+        if (!(bufferPerRow = (lDim-overflowBuffer)/hDim)) {
+            bufferPerRow = 1;
+        }
+        overflowBuffer = lDim-bufferPerRow*hDim;
+        allocationBlock = hDim*vDim*storageIncrement/100+1;
+    }
+
+    if (!theIndex) {
+        return i*vDim+j;
+    }
+    // ordinary matrix
+
+    long elementIndex = i*vDim+j, k, l, m=i*bufferPerRow,n,p;
+
+    for (k = 0; k<lDim/allocationBlock; k++,m+=allocationBlock) {
+        for (l=m; l<m+bufferPerRow; l++) {
+            p = theIndex[l];
+            if (p!=elementIndex) {
+                if (p==-1) {
+                    return -l-2;
+                }
+            } else {
+                return l;
+            }
+        }
+        n = (k+1)*allocationBlock-1;
+        for (l = n; l>n-overflowBuffer; l--) {
+            p = theIndex[l];
+            if (p!=elementIndex) {
+                if (p==-1) {
+                    return -l-2;
+                }
+            } else {
+                return l;
+            }
+        }
+    }
+    return -1;
+}
+
+//_____________________________________________________________________________________________
+_Parameter      _Matrix::operator () (long i, long j)
+{
+    long lIndex = Hash (i,j);
+    if (lIndex<0) {
+        return ZEROOBJECT;
+    } else {
+        return theData[lIndex];
+    }
+}
+
+//_____________________________________________________________________________________________
+_Matrix*        _Matrix::ExtractElementsByEnumeration (_SimpleList*h, _SimpleList*v, bool column) // extract by row
+{
+    if (storageType && h->lLength == v->lLength && h->lLength > 0) {
+        _Matrix * result = new _Matrix (column?h->lLength:1,column?1:h->lLength,false,true);
+        checkPointer (result);
+
+        if (storageType == 2) // formulae
+            for (long k=0; k<h->lLength; k++) {
+                result->StoreFormula(column?k:0,column?0:k,*GetFormula(h->lData[k],v->lData[k]));
+            }
+        else
+            for (long k=0; k<h->lLength; k++) {
+                result->theData[k] = (*this)(h->lData[k],v->lData[k]);
+            }
+
+        return result;
+    }
+    return new _Matrix;
+}
+
+
+
+//_____________________________________________________________________________________________
+_PMathObj _Matrix::MAccess (_PMathObj p, _PMathObj p2)
+{
+    if (!p) {
+        warnError(-106);
+        return new _Constant (0.0);
+    }
+
+    if (hDim <= 0 || vDim <= 0) {
+        return new _Constant (0.0);
+    }
+
+    if (p->ObjectClass() == MATRIX) {
+        if (p2 == nil) {
+            _Matrix * nn = (_Matrix*)p;
+            if (nn->storageType == 1)
+                if (nn->hDim == hDim && nn->vDim == vDim) {
+                    _SimpleList hL,
+                                vL;
+
+                    for (long r=0; r<hDim; r++)
+                        for (long c=0; c<vDim; c++)
+                            if ((*nn)(r,c) > 0.0) {
+                                hL << r;
+                                vL << c;
+                            }
+
+                    return ExtractElementsByEnumeration (&hL,&vL);
+                } else {
+                    if (nn->hDim > 0 && nn->vDim == 1) { // extract by row
+                        _SimpleList hL;
+
+                        for (long r=0; r<nn->hDim; r++) {
+                            long v = (*nn)(r,0);
+                            if (v>=0 && v<hDim) {
+                                hL<<v;
+                            }
+                        }
+
+                        if (hL.lLength) {
+                            _Matrix * result = new _Matrix (hL.lLength,vDim,false,true);
+                            checkPointer (result);
+                            long k = 0;
+                            for (long r=0; r<hL.lLength; r++) {
+                                long ri = hL.lData[r];
+                                for (long c=0; c<vDim; c++,k++) {
+                                    result->theData[k] = (*this)(ri,c);
+                                }
+                            }
+                            return result;
+                        }
+
+                        return new _Matrix;
+                    } else if (nn->vDim > 0 && nn->hDim == 1) { // extract by column
+                        _SimpleList hL;
+
+                        for (long r=0; r<nn->vDim; r++) {
+                            long v = (*nn)(0,r);
+                            if (v>=0 && v<vDim) {
+                                hL<<v;
+                            }
+                        }
+
+                        if (hL.lLength) {
+                            _Matrix * result = new _Matrix (hDim,hL.lLength,false,true);
+                            checkPointer (result);
+                            long k = 0;
+                            for (long c=0; c<hDim; c++)
+                                for (long r=0; r<hL.lLength; r++,k++) {
+                                    result->theData[k] = (*this)(c,hL.lData[r]);
+                                }
+                            return result;
+                        }
+
+                        return new _Matrix;
+                    }
+                }
+
+            ReportWarning ("Incorrect dimensions or matrix type (must be numeric) for an indexing matrix in call to []");
+        } else {
+            if (p2->ObjectClass() == MATRIX) {
+                _Matrix * nn =  (_Matrix*)((_Matrix*)p)->ComputeNumeric();
+                _Matrix * nn2 = (_Matrix*)((_Matrix*)p2)->ComputeNumeric();
+
+                if (nn->hDim == 1 && nn->vDim == 2 && nn->storageType == 1 && nn2->hDim == 1 && nn2->vDim == 2 && nn2->storageType == 1) {
+                    long left   = (*nn)(0,0),
+                         top    = (*nn)(0,1),
+                         bottom = (*nn2)(0,1),
+                         right  = (*nn2)(0,0);
+
+                    if (left >= 0 && left < hDim && right >= 0 && right < hDim && left <=right &&
+                            top >= 0 && top < vDim && bottom >=0 && bottom < vDim && top <= bottom) {
+                        _SimpleList hL,
+                                    vL;
+
+                        for (long r=left; r<=right; r++)
+                            for (long c=top; c<=bottom; c++) {
+                                hL << r;
+                                vL << c;
+                            }
+
+                        _Matrix * subM = ExtractElementsByEnumeration (&hL,&vL);
+                        subM->hDim = right-left+1;
+                        subM->vDim = bottom-top+1;
+
+                        return subM;
+                    }
+                }
+                ReportWarning ("Incorrect dimensions or matrix type (must be numeric 2x1 matrices) for an rectangular extract in call to []");
+            }
+
+        }
+        return new _Constant (0.0);
+    } else {
+        if (p->ObjectClass() == STRING) {
+
+
+            _String aFormulaString = *((_FString*)p)->theString;
+            _Formula f (aFormulaString);
+
+            if (!f.IsEmpty()) {
+                /* check formula validity */
+
+                _String cell_value ("_MATRIX_ELEMENT_VALUE_"),
+                        cell_row   ("_MATRIX_ELEMENT_ROW_"),
+                        cell_column("_MATRIX_ELEMENT_COLUMN_");
+
+                _Variable * cv = CheckReceptacle(&cell_value, empty, false),
+                            * cr = CheckReceptacle(&cell_row, empty, false),
+                              * cc = CheckReceptacle(&cell_column, empty, false);
+
+                cv->CheckAndSet (0.0);
+                cr->CheckAndSet (0.0);
+                cc->CheckAndSet (0.0);
+
+                f.Compute();
+                if (terminateExecution) {
+                    return new _Matrix ();
+                } else {
+
+                    _Formula * conditionalCheck = nil;
+
+                    if (p2 && p2->ObjectClass() == STRING) {
+                        conditionalCheck = new _Formula (*((_FString*)p2)->theString);
+                        if (conditionalCheck->IsEmpty()) {
+                            delete conditionalCheck;
+                            conditionalCheck = nil;
+                        }
+
+                        conditionalCheck->Compute();
+                        if (terminateExecution) {
+                            delete conditionalCheck;
+                            return new _Matrix ();
+                        }
+                    }
+
+                    _Matrix   * retMatrix = new _Matrix (hDim,vDim,false,true);
+
+                    long          stackDepth = 0;
+                    _SimpleList   vIndex;
+
+                    if (f.AmISimple (stackDepth,vIndex) && (!conditionalCheck || conditionalCheck->AmISimple(stackDepth,vIndex))) {
+                        _SimpleFormulaDatum * stack     = new _SimpleFormulaDatum [stackDepth+1],
+                        * varValues = new _SimpleFormulaDatum [vIndex.lLength];
+
+                        bool                constantValue = false;
+                        _Parameter          constantV     = f.Compute()->Value();
+
+                        if (f.IsConstant()) {
+                            constantValue = true;
+                            constantV     = f.Compute()->Value();
+                        } else {
+                            f.ConvertToSimple (vIndex);
+                        }
+                        
+ 
+                        if (conditionalCheck) {
+                            conditionalCheck->ConvertToSimple(vIndex);
+                        }
+
+                        if (constantValue && !conditionalCheck) {
+                            for (long r=0; r<hDim; r++)
+                                for (long c=0; c<vDim; c++) {
+                                    retMatrix->Store (r,c,constantV);
+                                }
+                        } else {
+
+                            long rid []= {cr->GetAVariable(),cc->GetAVariable(),cv->GetAVariable()};
+
+                            for (long k=0; k<3; k++) {
+                                rid[k] = vIndex.Find(rid[k]);
+                            }
+
+                            PopulateArraysForASimpleFormula(vIndex, varValues);
+
+                            for (long r=0; r<hDim; r++) {
+
+                                if (rid[0]>=0) {
+                                    varValues[rid[0]].value = r;
+                                }
+
+                                for (long c=0; c<vDim; c++) {
+                                    if (rid[1]>=0) {
+                                        varValues[rid[1]].value = c;
+                                    }
+
+                                    if (rid[2]>=0) {
+                                        varValues[rid[2]].value = (*this)(r,c);
+                                    }
+
+                                    if (conditionalCheck && CheckEqual(conditionalCheck->ComputeSimple(stack,varValues),0.0)) {
+                                        if (rid[2]>=0) {
+                                            retMatrix->Store (r,c,varValues[rid[2]].value);
+                                        } else {
+                                            retMatrix->Store (r,c, (*this)(r,c));
+                                        }
+                                        continue;
+                                    }
+
+                                    if (constantValue) {
+                                        retMatrix->Store (r,c,constantV);
+                                    } else {
+                                        //printf ("Formula eval (stack depth= %d) (%d, %g, %g) %g\n", stackDepth, rid[2], varValues[rid[2]], f.ComputeSimple(stack,varValues));
+
+                                        retMatrix->Store (r,c,f.ComputeSimple(stack,varValues));
+                                    }
+                                }
+                            }
+
+                            f.ConvertFromSimple (vIndex);
+                        }
+                        if (conditionalCheck) {
+                            conditionalCheck->ConvertFromSimple(vIndex);
+                        }
+
+                        delete  [] stack;
+                        delete  [] varValues;
+                    } else {
+                        for (long r=0; r<hDim; r++) {
+                            cr->CheckAndSet (r);
+                            for (long c=0; c<vDim; c++) {
+                                cc->CheckAndSet (c);
+                                cv->CheckAndSet ((*this)(r,c));
+                                _PMathObj fv;
+
+                                if (conditionalCheck) {
+                                    fv = conditionalCheck->Compute();
+                                    if (fv->ObjectClass() == NUMBER)
+                                        if (CheckEqual (fv->Value(), 0.0)) {
+                                            retMatrix->Store (r,c,cv->Value());
+                                            continue;
+                                        }
+                                }
+
+                                fv = f.Compute();
+                                if (fv->ObjectClass()==NUMBER) {
+                                    retMatrix->Store (r,c,fv->Value());
+                                }
+                            }
+                        }
+                    }
+                    retMatrix->AmISparse();
+                    if (conditionalCheck) {
+                        delete conditionalCheck;
+                    }
+                    return retMatrix;
+                }
+            }
+            ReportWarning (_String("Invalid formula expression for element-wise matrix operations: ") & *((_FString*)p)->theString);
+            return new _Matrix;
+        }
+    }
+
+    long    ind1 = p->Value(),
+            ind2 = -1;
+
+    if (p2) {
+        ind2 = p2->Value();
+        // handle the row/column access operations here i.e. [R][-1] or [-1][R]
+
+        if (ind1 == -1 && ind2 >=0 && ind2 <vDim) { // valid column access
+            _SimpleList hL (hDim,0,1),
+                        vL (hDim,ind2,0);
+            return ExtractElementsByEnumeration (&hL,&vL,true);
+        }
+
+        if (ind2 == -1 && ind1 >=0 && ind1 <hDim) { // valid row access
+            _SimpleList hL (vDim,ind1,0),
+                        vL (vDim,0,1);
+            return ExtractElementsByEnumeration (&hL,&vL);
+        }
+    }
+
+    if (hDim == 1) {
+        if (ind2<0) {
+            ind2 = ind1;
+        }
+        ind1=0;
+    }
+
+    if (vDim == 1) {
+        ind2 = 0;
+    }
+
+    if (ind2<0) { // allow direct vectorlike indexing, i.e m[21] = m[3][3] (if the dim is *x6)
+        ind2  = ind1%vDim;
+        ind1 /=vDim;
+    }
+
+    if (ind1<0 || ind1>=hDim || ind2>=vDim) {
+        MatrixIndexError     (ind1,ind2,hDim,vDim);
+        return new _Constant (0.0);
+    }
+
+    if (ind2>=0) { // element access
+        if (storageType == 2) { // formulas
+            if (!theIndex) {
+                _Formula * entryFla = (((_Formula**)theData)[ind1*vDim+ind2]);
+                if (entryFla) {
+                    return (_PMathObj)entryFla->Compute()->makeDynamic();
+                } else {
+                    return new _Constant (0.0);
+                }
+            } else {
+                long p = Hash (ind1, ind2);
+                if (p<0) {
+                    return new _Constant (0.0);
+                } else {
+                    return (_PMathObj)(((_Formula**)theData)[p])->Compute()->makeDynamic();
+                }
+            }
+        } else {
+            if (storageType == 1) {
+                if (theIndex) {
+                    return new _Constant ((*this)(ind1,ind2));
+                } else {
+                    return new _Constant (theData[ind1*vDim+ind2]);
+                }
+
+            } else {
+                _MathObject* cell;
+                if (!theIndex) {
+                    cell = (_MathObject*)GetMatrixObject (ind1*vDim+ind2)->makeDynamic();
+                } else {
+                    long p = Hash (ind1, ind2);
+                    if (p<0) {
+                        cell = new _Constant (0.0);
+                    } else {
+                        cell = (_MathObject*)GetMatrixObject (p)->makeDynamic();
+                    }
+                }
+                return cell;
+            }
+        }
+    }
+
+    return new _Constant (0.0);
+}
+
+//_____________________________________________________________________________________________
+_Formula* _Matrix::GetFormula (long ind1, long ind2)
+{
+
+    if (hDim == 1) {
+        if (ind2<0) {
+            ind2 = ind1;
+        }
+        ind1=0;
+    }
+
+    if (vDim == 1) {
+        ind2 = 0;
+    }
+
+    if (ind2<0) {
+        ind2 = ind1%vDim;
+        ind1/=vDim;
+    }
+
+    if ( ind1<0 || ind1>=hDim || ind2>=vDim) {
+        MatrixIndexError (ind1,ind2,hDim,vDim);
+        return nil;
+    }
+
+
+    if (ind2>=0) { // element access
+        if (storageType == 2) { // formulas
+            if (!theIndex) {
+                return (((_Formula**)theData)[ind1*vDim+ind2]);
+            } else {
+                long p = Hash (ind1, ind2);
+                if (p<0) {
+                    return nil;
+                } else {
+                    return (((_Formula**)theData)[p]);
+                }
+            }
+        }
+    }
+
+    return nil;
+}
+
+//_____________________________________________________________________________________________
+_PMathObj _Matrix::MCoord (_PMathObj p, _PMathObj p2)
+{
+    long ind1 = -1,
+         ind2 = -1;
+
+    if (!p) {
+        warnError( -106);
+    }
+
+    ind1 = p->Value();
+    if (p2) {
+        ind2 = p2->Value();
+    }
+
+
+    if (hDim == 1) {
+        if (ind2<0) {
+            ind2 = ind1;
+        }
+        ind1=0;
+    }
+
+    if (vDim == 1) {
+        ind2 = 0;
+    }
+
+    if (ind2<0) { // allow direct vectorlike indexing, i.e m[21] = m[3][3] (if the dim is *x6)
+        ind2 = ind1%vDim;
+    }
+
+    _Matrix * res = new _Matrix (1,2,false,true);
+    if (res) {
+        res->theData[0]=ind1;
+        res->theData[1]=ind2;
+    } else {
+        checkPointer (res);
+    }
+    return res;
+
+}
+
+//_____________________________________________________________________________________________
+bool _Matrix::MResolve (_PMathObj p, _PMathObj p2, long& ind1, long& ind2)
+{
+    ind1 = -1;
+    ind2 = -1;
+
+    if (!p) {
+        warnError(-106);
+        return false;
+    }
+
+    ind1 = p->Value();
+    if (p2) {
+        ind2 = p2->Value();
+    }
+
+    return CheckCoordinates (ind1,ind2);
+}
+
+//_____________________________________________________________________________________________
+
+bool _Matrix::CheckCoordinates (long& ind1, long& ind2)
+{
+    if (hDim == 1) {
+        if (ind2<0) {
+            ind2 = ind1;
+        }
+        ind1=0;
+    }
+
+    if (vDim == 1) {
+        ind2 = 0;
+    }
+
+    if (ind2<0) { // allow direct vectorlike indexing, i.e m[21] = m[3][3] (if the dim is *x6)
+        if (vDim > 1) {
+            ind2 = ind1%vDim;
+            ind1/= vDim;
+        } else {
+            ind2 = 0;
+        }
+    }
+
+    if (ind1<0 || ind1>=hDim || ind2>=vDim) {
+        MatrixIndexError (ind1,ind2, hDim, vDim);
+        return false;
+    }
+    return true;
+}
+
+
+//_____________________________________________________________________________________________
+void _Matrix::MStore (long ind1, long ind2, _Formula& f, long opCode)
+{
+    if (ind2>=0) { // element storage
+        if (storageType == 2) { // formulas
+            if (opCode == HY_OP_CODE_ADD) {
+                _Formula * addOn = GetFormula(ind1,ind2);
+                if (addOn) {
+                    _Formula f_joint;
+                    addOn->PatchFormulasTogether(f_joint, f, HY_OP_CODE_ADD);
+                    StoreFormula (ind1,ind2,f_joint);
+                    return;
+                }
+            } 
+            StoreFormula (ind1,ind2,f);
+        } else {
+            if (!f.IsAConstant()) {
+                Convert2Formulas();
+                StoreFormula (ind1,ind2,f);
+            } else {
+                _PMathObj res = f.Compute();
+                _Parameter toStore = res->Value();
+                if (opCode == HY_OP_CODE_ADD) {
+                    toStore += (*this)(ind1,ind2);
+                }
+                Store(ind1,ind2,toStore);
+            }
+        }
+    }
+}
+
+//_____________________________________________________________________________________________
+void _Matrix::MStore (_PMathObj p, _PMathObj p2, _Formula& f, long opCode)
+{
+    long      ind1, ind2;
+    if (MResolve (p,p2, ind1,ind2)) {
+        MStore   (ind1,ind2,f, opCode);
+    }
+}
+
+//_____________________________________________________________________________________________
+void _Matrix::MStore (_PMathObj p, _PMathObj p2, _PMathObj poly)
+{
+    long      ind1, ind2;
+    if (MResolve (p,p2, ind1,ind2)) {
+        MStore   (ind1,ind2,poly);
+    }
+
+}
+//_____________________________________________________________________________________________
+void _Matrix::MStore (long ind1, long ind2, _PMathObj poly)
+{
+    if (ind2>=0) { // element storage
+        if (storageType == 0) { // formulas
+            StoreObject (ind1,ind2,poly,true);
+            if (AUTO_PAD_DIAGONAL) {
+                UpdateDiag (ind1,ind2,poly);
+            }
+        } else {
+            _Polynomial* pp = (_Polynomial*)poly;
+            poly = pp->IsANumber();
+            if (!poly) { // just a number
+                storageType==1?ConvertNumbers2Poly():ConvertFormulas2Poly();
+                StoreObject (ind1,ind2,pp,true);
+            } else {
+                (*this)[Hash(ind1,ind2)] = poly->Value();
+            }
+        }
+    }
+}
+
+
+//_____________________________________________________________________________________________
+_Parameter&     _Matrix::operator [] (long i)
+{
+    long lIndex = Hash (i/vDim, i%vDim);
+    if (lIndex == -1) {
+        IncreaseStorage();
+        lIndex = Hash (i/vDim, i%vDim);
+    }
+    if (lIndex<0) {
+        theIndex[-lIndex-2] = i;
+        return ((_Parameter*)theData)[-lIndex-2];
+    } else {
+        return ((_Parameter*)theData)[lIndex];
+    }
+}
+
+//_____________________________________________________________________________________________
+void        _Matrix::Store (long i, long j, _Parameter value)
+{
+    if (storageType!=1) {
+        return;
+    }
+
+    long lIndex;
+
+    if (theIndex) {
+        lIndex = Hash (i, j);
+
+        if (lIndex == -1) {
+            IncreaseStorage();
+            lIndex = Hash (i, j);
+        }
+    } else {
+        lIndex = i*vDim + j;
+    }
+
+    if (lIndex<0) {
+        theIndex[-lIndex-2] = i*vDim+j;
+        ((_Parameter*)theData)[-lIndex-2] = value;
+    } else {
+        ((_Parameter*)theData)[lIndex] = value;
+    }
+
+}
+
+//_____________________________________________________________________________________________
+void        _Matrix::StoreObject (long i, long j, _MathObject* value, bool dup)
+{
+    if (storageType) {
+        return;
+    }
+
+    long lIndex = Hash (i, j);
+    if (lIndex == -1) {
+        IncreaseStorage();
+        lIndex = Hash (i, j);
+    }
+
+    if (dup) {
+        value = (_MathObject*) value->makeDynamic();
+    }
+    if (lIndex<0) {
+        theIndex[-lIndex-2] = i*vDim+j;
+        ((_MathObject**)theData)[-lIndex-2] = value;
+    } else {
+        DeleteObject (GetMatrixObject(lIndex));
+        ((_MathObject**)theData)[lIndex] = value;
+    }
+    if (AUTO_PAD_DIAGONAL) { // correct the diagonal entry
+    }
+
+}
+//_____________________________________________________________________________________________
+
+void        _Matrix::UpdateDiag  (long i,long j, _MathObject* value)
+{
+    if (i!=j) {
+        _MathObject * diagCell = nil, *newCell;
+        if (!theIndex) {
+            diagCell = GetMatrixObject(i*hDim+i);
+        } else {
+            long lIndex = Hash (i,i);
+            if (lIndex>=0) {
+                diagCell = GetMatrixObject(lIndex);
+            }
+        }
+        if (!diagCell) {
+            newCell = value->Minus();
+        } else {
+            newCell = diagCell->Sub(value);
+        }
+        StoreObject(i,i,newCell,false);
+    }
+}
+//_____________________________________________________________________________________________
+void        _Matrix::StoreObject (long k, _MathObject* value, bool dup)
+{
+    StoreObject (k/vDim, k%vDim, value, dup);
+}
+
+//_____________________________________________________________________________________________
+void        _Matrix::StoreFormula (long i, long j, _Formula& f, bool copyF, bool simplify)
+{
+    if (storageType!=2) {
+        return;
+    }
+
+    long lIndex = Hash (i, j);
+    if (lIndex == -1) {
+        IncreaseStorage();
+        lIndex = Hash (i, j);
+    }
+
+    if (lIndex<0) {
+        theIndex[-lIndex-2] = i*vDim+j;
+        ((_Formula**)theData)[-lIndex-2] = copyF?(_Formula*)f.makeDynamic():&f;
+        if (simplify) {
+            ((_Formula**)theData)[-lIndex-2]->SimplifyConstants();
+        }
+    } else {
+        if (copyF && ((_Formula**)theData)[lIndex]!=(_Formula*)ZEROPOINTER) {
+            delete ((_Formula**)theData)[lIndex];
+        }
+        ((_Formula**)theData)[lIndex] = copyF?(_Formula*)f.makeDynamic():&f;
+        if (simplify) {
+            ((_Formula**)theData)[lIndex]->SimplifyConstants();
+        }
+    }
+
+    CheckIfSparseEnough();
+}
+
+//_____________________________________________________________________________________________
+
+
+void        _Matrix::Swap (_Matrix& m)
+{
+    long         *tIndex,
+                 t;
+
+    _Parameter   *tData;
+    _PMathObj    tObj;
+    _CompiledMatrixData *tCmd;
+
+    SWAP(theData,m.theData,tData);
+    SWAP(hDim,m.hDim,t);
+    SWAP(vDim,m.vDim,t);
+    SWAP(lDim,m.lDim,t);
+    SWAP(theIndex,m.theIndex,tIndex);
+    SWAP(storageType,m.storageType,t);
+    SWAP(bufferPerRow,m.bufferPerRow,t);
+    SWAP(overflowBuffer,m.overflowBuffer,t);
+    SWAP(allocationBlock,m.allocationBlock,t);
+    SWAP(theValue,m.theValue,tObj);
+    SWAP(cmd,m.cmd,tCmd);
+}
+
+//_____________________________________________________________________________________________
+/*_Matrix       IterateStrassen (_Matrix& source1, _Matrix& source2)
+// square the matrix
+{
+
+    if ((source1.storageType!=1)||(source2.storageType!=1)) warnError (-111);
+    long iterationDim = source1.hDim, i;
+
+    if (iterationDim>2)
+    {
+        // create four quadrants of each matrix and temporary storage
+        _Matrix a11 (iterationDim/2, iterationDim/2, (bool)false, true),
+                a12 (iterationDim/2, iterationDim/2, (bool)false, true),
+                a21 (iterationDim/2, iterationDim/2, (bool)false, true),
+                a22 (iterationDim/2, iterationDim/2, (bool)false, true),
+                b11 (iterationDim/2, iterationDim/2, (bool)false, true),
+                b12 (iterationDim/2, iterationDim/2, (bool)false, true),
+                b21 (iterationDim/2, iterationDim/2, (bool)false, true),
+                b22 (iterationDim/2, iterationDim/2, (bool)false, true),
+                s1 (iterationDim/2, iterationDim/2, (bool)false, true),
+                s2 (iterationDim/2, iterationDim/2, (bool)false, true),
+                s3 (iterationDim/2, iterationDim/2, (bool)false, true),
+                s4 (iterationDim/2, iterationDim/2, (bool)false, true),
+                s5 (iterationDim/2, iterationDim/2, (bool)false, true),
+                s6 (iterationDim/2, iterationDim/2, (bool)false, true),
+                t1 (iterationDim/2, iterationDim/2, (bool)false, true),
+                t2 (iterationDim/2, iterationDim/2, (bool)false, true),
+                c11 (iterationDim/2, iterationDim/2, (bool)false, true),
+                c12 (iterationDim/2, iterationDim/2, (bool)false, true),
+                c21 (iterationDim/2, iterationDim/2, (bool)false, true),
+                c22 (iterationDim/2, iterationDim/2, (bool)false, true);
+
+        // copy data to quadrants
+
+        iterationDim/=2;
+        for (i=0;i<iterationDim;i++)
+        {
+            memcpy ((_Parameter*)a11.theData+i*iterationDim, (_Parameter*)source1.theData+i*source1.hDim, iterationDim*sizeof (_Parameter));
+            memcpy ((_Parameter*)a12.theData+i*iterationDim, (_Parameter*)source1.theData+i*source1.hDim+iterationDim, iterationDim*sizeof (_Parameter));
+            memcpy ((_Parameter*)a21.theData+i*iterationDim, (_Parameter*)source1.theData+(i+iterationDim)*source1.hDim, iterationDim*sizeof (_Parameter));
+            memcpy ((_Parameter*)a22.theData+i*iterationDim, (_Parameter*)source1.theData+(i+iterationDim)*source1.hDim+iterationDim, iterationDim*sizeof (_Parameter));
+            memcpy ((_Parameter*)b11.theData+i*iterationDim, (_Parameter*)source2.theData+i*source2.hDim, iterationDim*sizeof (_Parameter));
+            memcpy ((_Parameter*)b12.theData+i*iterationDim, (_Parameter*)source2.theData+i*source2.hDim+iterationDim, iterationDim*sizeof (_Parameter));
+            memcpy ((_Parameter*)b21.theData+i*iterationDim, (_Parameter*)source2.theData+(i+iterationDim)*source2.hDim, iterationDim*sizeof (_Parameter));
+            memcpy ((_Parameter*)b22.theData+i*iterationDim, (_Parameter*)source2.theData+(i+iterationDim)*source2.hDim+iterationDim, iterationDim*sizeof (_Parameter));
+        }
+
+        // compute strassen blocks
+
+        t1=a12;
+        t1-=a22;
+        t2=b21;
+        t2+=b22;
+        s1=IterateStrassen (t1,t2);
+
+        t1=a11;
+        t1+=a22;
+        t2=b11;
+        t2+=b22;
+        s2=IterateStrassen (t1,t2);
+
+        t1=a11;
+        t1-=a21;
+        t2=b11;
+        t2+=b12;
+        s3=IterateStrassen (t1,t2);
+
+        t1=a11;
+        t1+=a12;
+        s4=IterateStrassen (t1,b22);
+
+        t1=b12;
+        t1-=b22;
+        s5=IterateStrassen (a11,t1);
+
+        t1=b21;
+        t1-=b11;
+        s6=IterateStrassen (a22,t1);
+
+        c11 = s1;
+        c11 += s2;
+        c11 -= s4;
+        c11 += s6;
+
+        c12 = s4;
+        c12 += s5;
+
+        t1=a21;
+        t1+=a22;
+        s1=IterateStrassen (t1,b11);
+
+        c21 = s6;
+        c21 += s1;
+
+        c22 = s2;
+        c22 -= s3;
+        c22 += s5;
+        c22 -= s1;
+
+        _Matrix result (source1.hDim, source1.hDim, (bool)false, true);
+
+        // copy the results from four resultant quadrants c11..c22
+
+
+        for (i=0;i<iterationDim;i++)
+        {
+            memcpy ((_Parameter*)result.theData+i*source1.hDim,(_Parameter*)c11.theData+i*iterationDim, iterationDim*sizeof (_Parameter));
+            memcpy ((_Parameter*)result.theData+i*source1.hDim+iterationDim,(_Parameter*)c12.theData+i*iterationDim, iterationDim*sizeof (_Parameter));
+            memcpy ((_Parameter*)result.theData+(i+iterationDim)*source1.hDim,(_Parameter*)c21.theData+i*iterationDim, iterationDim*sizeof (_Parameter));
+            memcpy ((_Parameter*)result.theData+(i+iterationDim)*source1.hDim+iterationDim,(_Parameter*)c22.theData+i*iterationDim, iterationDim*sizeof (_Parameter));
+        }
+
+        return result;
+    }
+    else
+        return source1*source2;
+}
+
+
+//_____________________________________________________________________________________________
+void        _Matrix::SqrStrassen (void)
+// square the matrix
+// the matrix is assumed to be a non-pointer matrix
+{
+    if (hDim!=vDim) return;
+    // a non-square matrix
+
+    if (theIndex)
+    // sparse matrix - multiply directly at better speed
+    {
+        _Matrix temp (hDim, vDim, (bool)false, true);
+        Multiply (temp, *this);
+        Swap(temp);
+    }
+    else
+    {
+        // pad the matrix with zeros to make the dimension a power of two;
+        long newDim = 2,i;
+        while (newDim<hDim) newDim*=2;
+
+
+        // copies the entries of the original to the padded matrix
+
+        if (newDim != hDim)
+        {
+            _Matrix paddedMatrix (newDim, newDim, (bool)false, true);
+            for (i=0; i<hDim; i++)
+                memcpy ((_Parameter*)paddedMatrix.theData+i*newDim, (_Parameter*)theData+i*hDim, hDim*sizeof (_Parameter));
+
+            // call Strassen iteration function
+
+
+            paddedMatrix .Swap( IterateStrassen (paddedMatrix,paddedMatrix));
+
+            // strip unneeded elements and copy them back into the original;
+
+            for (i=0; i<hDim; i++)
+                memcpy ((_Parameter*)theData+i*hDim,(_Parameter*)paddedMatrix.theData+i*newDim, hDim*sizeof (_Parameter));
+        }
+        else
+            Swap( IterateStrassen (*this,*this));
+
+    }
+}
+*/
+
+//_____________________________________________________________________________________________
+
+void        _Matrix::AplusBx (_Matrix& B, _Parameter x)
+{
+    _Matrix temp (B);
+    temp *= x;
+    *this+=temp;
+}
+
+//#define _SLKP_USE_SSE_INTRINSICS
+
+//_____________________________________________________________________________________________
+void        _Matrix::Sqr (_Parameter* _hprestrict_ stash)
+{
+    if (hDim!=vDim) {
+        return;
+    }
+    // not a square matrix
+
+    if (theIndex|| storageType!=1 )
+        // sparse or non-numeric matrix
+    {
+        _Matrix temp (hDim, vDim, storageType==0?theIndex!=nil:false, storageType);
+        Multiply (temp, *this);
+        Swap(temp);
+    } else {
+        if (hDim==4)
+            // special case for nucleotides
+        {
+            for (long i=0, k = 0; i<16; i+=4) {
+                for (long j=0; j<4; j++, k++) {
+                    stash[k] = theData[i]   * theData [j]
+                               + theData[i+1] * theData [j+4]
+                               + theData[i+2] * theData [j+8]
+                               + theData[i+3] * theData [j+12];
+                }
+            }
+        } else {
+            long loopBound = vDim - vDim % 4;
+
+
+            // loop interchange rocks!
+
+#ifdef _SLKP_USE_SSE_INTRINSICS
+            double buffer[2] __attribute__ ((aligned (16)));
+#endif
+            
+#ifdef _SLKP_USE_AVX_INTRINSICS
+            double buffer[4] __attribute__ ((aligned (32)));
+#endif
+            
+            _Parameter  _hprestrict_ * column = stash+lDim;
+            _Parameter  _hprestrict_ * source = theData;
+
+            for (long j = 0; j < vDim; j++) {
+                for (long c = 0; c < vDim; c++) {
+                    column[c] = source[j + c * vDim];
+                }
+
+#ifdef _SLKP_USE_SSE_INTRINSICS
+
+                for (long i = 0; i < lDim; i += vDim) {
+                    _Parameter * row = theData + i;
+                    
+                    
+                    __m128d buffer1,
+                            buffer2,
+                            buffer3 = _mm_setzero_pd(),
+                            buffer4 = _mm_setzero_pd(),
+                            load1, 
+                            load2,
+                            load3,
+                            load4;
+                            
+                    long k;
+                    
+                    if (((long int)row & 0x1111b) == 0 && ((long int)column & 0x1111b) == 0){ 
+                         for (k = 0; k < loopBound; k += 4) {
+                            load1 = _mm_load_pd (row+k);
+                            load2 = _mm_load_pd (row+k+2);
+                            load3 = _mm_load_pd (column+k);
+                            load4 = _mm_load_pd (column+k+2);
+                            buffer1 = _mm_mul_pd (load1, load3);
+                            buffer2 = _mm_mul_pd (load2, load4);
+                            buffer3 = _mm_add_pd (buffer1,buffer3);
+                            buffer4 = _mm_add_pd (buffer2,buffer4);
+                        }    
+                   
+                    } else {
+                        for (k = 0; k < loopBound; k += 4) {
+                            load1 = _mm_loadu_pd (row+k);
+                            load2 = _mm_loadu_pd (row+k+2);
+                            load3 = _mm_loadu_pd (column+k);
+                            load4 = _mm_loadu_pd (column+k+2);
+                            buffer1 = _mm_mul_pd (load1, load3);
+                            buffer2 = _mm_mul_pd (load2, load4);
+                            buffer3 = _mm_add_pd (buffer1,buffer3);
+                            buffer4 = _mm_add_pd (buffer2,buffer4);
+                        }    
+                    }
+                    
+                    buffer3 = _mm_add_pd (buffer3, buffer4);    
+                    _mm_store_pd (buffer, buffer3);
+                    
+                    for (; k < vDim; k++) {
+                        buffer[0] += row[k] * column [k];
+                    }
+                
+                    stash[i+j] = buffer[0] + buffer[1];
+                 
+                }
+
+#elif defined _SLKP_USE_AVX_INTRINSICS
+
+                for (long i = 0; i < lDim; i += vDim) {
+                    _Parameter * row = theData + i;
+                    
+                    
+                    __m256d   buffer1,
+                              buffer2 = _mm256_setzero_pd(),
+                              load1,
+                              load2;
+                    
+                    long k;
+                    
+                    if (((long int)row & 0x11111b) == 0 && ((long int)column & 0x11111b) == 0){
+                        for (k = 0; k < loopBound; k += 4) {
+                            load1 = _mm256_load_pd (row+k);
+                            load2 = _mm256_load_pd (column+k);
+                            buffer1 = _mm256_mul_pd (load1, load2);
+                            buffer2 = _mm256_add_pd (buffer1,buffer2);
+                        }
+                        
+                    } else {
+                        for (k = 0; k < loopBound; k += 4) {
+                            load1 = _mm256_loadu_pd (row+k);
+                            load2 = _mm256_loadu_pd (column+k);
+                            buffer1 = _mm256_mul_pd (load1, load2);
+                            buffer2 = _mm256_add_pd (buffer1,buffer2);
+                        }
+                    }
+                    
+                    _mm256_store_pd (buffer, buffer2);
+                    
+                    for (; k < vDim; k++) {
+                        buffer[0] += row[k] * column [k];
+                    }
+                    
+                    stash[i+j] = buffer[0] + buffer[1] + buffer[2] + buffer[3];
+                    
+                }
+
+#else
+                for (long i = 0; i < lDim; i += vDim) {
+                    _Parameter * row    = theData + i,
+                                 buffer [4] = {0.,0.,0.,0.};
+
+
+#ifndef _SLKP_SSE_VECTORIZATION_
+                    long        k;
+
+                    for (k = 0; k < loopBound; k += 4) {
+                        buffer [0] += row[k] * column [k];
+                        buffer [1] += row[k+1] * column [k+1];
+                        buffer [2] += row[k+2] * column [k+2];
+                        buffer [3] += row[k+3] * column [k+3];
+                    }
+
+                    for (; k < vDim; k++) {
+                        buffer[0] += row[k] * column [k];
+                    }
+#else
+                    for (long k = 0; k < vDim; k++) {
+                        buffer[0] += row[k]   * column [k];
+                    }
+
+#endif
+                    stash[i+j] = buffer[0] + buffer[1] + buffer[2] + buffer[3];
+                }
+#endif
+           }
+        }
+        
+        memcpy (theData, stash, lDim * sizeof (_Parameter));
+
+        /*for (long s = 0; s < lDim; s++) {
+            theData[s] = stash[s];
+        }*/
+    }
+}
+//_____________________________________________________________________________________________
+void        _Matrix::AgreeObjects (_Matrix& m)
+{
+    if (storageType==2)
+        if (toPolyOrNot!=0.0) {
+            ConvertFormulas2Poly ();
+        } else {
+            Evaluate(true);
+        }
+
+    if (m.storageType==2)
+        if (toPolyOrNot!=0.0) {
+            m.ConvertFormulas2Poly ();
+        } else {
+            m.Evaluate(true);
+        }
+
+    if (storageType!=m.storageType) {
+        if (toPolyOrNot) {
+            if (storageType == 1) {
+                ConvertNumbers2Poly ();
+            } else {
+                m.ConvertNumbers2Poly ();
+            }
+        } else {
+            if (storageType == 1) {
+                m.Evaluate (true);
+            } else {
+                Evaluate ();
+            }
+        }
+    }
+}
+//_____________________________________________________________________________________________
+void        _Matrix::ConvertFormulas2Poly (bool force2numbers)
+{
+    bool conversionFlag = true;
+    _MathObject** tempStorage = (_MathObject**)MatrixMemAllocate(sizeof(void*)*lDim);
+
+    long i;
+
+    for (i=0; i<lDim; i++) {
+        tempStorage[i]=ZEROPOINTER;
+    }
+
+
+    if (theIndex) { // sparse
+        for (i=0; i<lDim; i++) {
+            if (IsNonEmpty(i)) {
+                _PMathObj polyCell = ((_Formula**)theData)[i]->ConstructPolynomial();
+                if (polyCell) { // valid polynomial conversion
+                    tempStorage[i] = (_PMathObj)polyCell;
+                    polyCell->nInstances++;
+                } else {
+                    conversionFlag = false;
+                    break;
+                }
+            }
+        }
+        if (conversionFlag) {
+            // check for "*" entries
+            for (i=0; i<lDim; i++) {
+                if (IsNonEmpty(i)) {
+                    if (((_Formula**)theData)[i]->IsEmpty()) { // "*" entry
+                        long r = theIndex[i]/vDim, c = theIndex[i]%vDim;
+                        _Polynomial diag;
+                        for (long j=0; j<vDim; j++) {
+                            if (j==c) {
+                                continue;
+                            }
+                            long h = Hash (r,j);
+                            if (h>=0) {
+                                _Polynomial * temp = (_Polynomial *)diag.Sub(tempStorage[h]);
+                                diag.Duplicate (temp);
+                                DeleteObject (temp);
+                            }
+                        }
+                        DeleteObject(tempStorage[i]);
+                        tempStorage[i]=(_Polynomial*)diag.makeDynamic();
+                    }
+                }
+            }
+        }
+    } else {
+        for (long i=0; i<lDim; i++) {
+            _Formula* f = ((_Formula**)theData)[i];
+            if (f->IsEmpty()) {
+                continue;
+            }
+            _PMathObj polyCell = f->ConstructPolynomial();
+            if (polyCell) { // valid polynomial conversion
+                tempStorage[i] = (_PMathObj)polyCell;
+                polyCell->nInstances++;
+            } else {
+                conversionFlag = false;
+                break;
+            }
+        }
+        if (conversionFlag) {
+            // check for "*" entries
+            for (long i=0; i<lDim; i++) {
+                if (((_Formula**)theData)[i]->IsEmpty()) { // "*" entry
+                    long r = i/vDim;
+                    _Polynomial diag;
+                    for (long j=vDim*r; j<vDim*(r+1); j++) {
+                        if (j==i) {
+                            continue;
+                        }
+                        _Polynomial * temp = (_Polynomial *)diag.Sub(tempStorage[j]);
+                        diag.Duplicate (temp);
+                        DeleteObject (temp);
+                    }
+                    DeleteObject(tempStorage[i]);
+                    tempStorage[i]=(_Polynomial*)diag.makeDynamic();
+                }
+            }
+        }
+    }
+
+    if (conversionFlag) { // successful conversion
+        ClearFormulae();
+        MatrixMemFree (theData);
+        theData = (_Parameter*) tempStorage;
+        storageType = 0;
+        if (!theIndex) {
+            _Polynomial zero;
+            for (i=0; i<lDim; i++)
+                if (!GetMatrixObject (i)) {
+                    StoreObject (i,&zero,true);
+                }
+        }
+    } else {
+        for (long i=0; i<lDim; i++) {
+            DeleteObject (tempStorage[i]);
+        }
+        MatrixMemFree (tempStorage);
+        if (force2numbers) {
+            Evaluate(true);
+        }
+    }
+
+}
+
+//_____________________________________________________________________________________________
+void        _Matrix::ConvertNumbers2Poly (void)
+{
+    _MathObject ** tempStorage = (_MathObject**)MatrixMemAllocate (lDim*sizeof (void*));
+    if (!theIndex) {
+        for (long i=0; i<lDim; i++) {
+            tempStorage[i]=new _Polynomial (theData[i]);
+        }
+    } else {
+        for (long i=0; i<lDim; i++)
+            if (IsNonEmpty (i)) {
+                tempStorage[i]=new _Polynomial (theData[i]);
+            } else {
+                tempStorage[i] = nil;
+            }
+    }
+    MatrixMemFree (theData);
+    theData = (_Parameter*) tempStorage;
+    storageType = 0;
+}
+
+
+//_____________________________________________________________________________________________
+void        _Matrix::operator += (_Matrix& m)
+{
+    AgreeObjects (m);
+    if ((!m.theIndex) && theIndex) {
+        CheckIfSparseEnough(true);
+    }
+    Add (*this,m);
+}
+
+//______________________________________________________________
+
+long    _Matrix::CompareRows (const long row1, const long row2) {
+    for (long column_id = 0; column_id < vDim; column_id ++) {
+        _Parameter v1 = theData[row1*vDim+column_id],
+                   v2 = theData[row2*vDim+column_id];
+        if (!CheckEqual (v1,v2)) {
+            return (v1 < v2)?-1L:1L;
+        }
+    }
+    return 0L;
+}
+
+//______________________________________________________________
+
+void    _Matrix::SwapRows (const long row1, const long row2) {
+    long idx1 = row1*vDim,
+         idx2 = row2*vDim;
+    for (long column_id = 0; column_id < vDim; column_id ++) {
+        _Parameter t = theData[idx1];
+        theData[idx1++] = theData[idx2];
+        theData[idx2++] = t;
+    }
+}
+//______________________________________________________________
+
+void    _Matrix::RecursiveIndexSort (long from, long to, _SimpleList* index)
+{
+    long            middle          = (from+to) >> 1,
+                    bottommove      = 1L,
+                    topmove         = 1L;
+
+    /*
+        Use '+' to denote an element that is gretae than 'M' (the 'middle' element)
+        and '-' to denote an element than is less than 'M'
+     
+        Initially we may have something like
+     
+        --++--+M--+++--++-
+        and we want to end up with
+        ---------M+++++++
+     
+        Initially, we arrange the elements as
+     
+        ----+++M-----++++++, and then swap 'bottommove' pluses (of which there are 3 in this case)
+                            with 'topmove' minuses (of which there are 5)
+    
+     */
+    
+
+    if (middle)
+        while (middle-bottommove>=from && CompareRows (middle-bottommove, middle) >= 0L) {
+            bottommove++;
+        }
+    if (from<to)
+        while (middle+topmove<=to && CompareRows (middle+topmove,middle) <= 0L) {
+            topmove++;
+        }
+
+    for (long i=from; i<middle-bottommove; i++)
+        if (CompareRows (i, middle) >= 0L) {
+            SwapRows (middle-bottommove, i);
+            index->Swap(middle-bottommove,i);
+            bottommove++;
+
+            while (middle-bottommove>=from && CompareRows (middle-bottommove, middle) >= 0L) {
+                bottommove++;
+            }
+        }
+
+    {
+        for (long i=middle+topmove+1; i<=to; i++)
+            if (CompareRows(i,middle) <= 0L) {
+                SwapRows   (i, middle+topmove);
+                index->Swap(i, middle+topmove);
+                
+                topmove++;
+                while (middle+topmove<=to && CompareRows (middle+topmove,middle) <= 0L) {
+                   topmove++;
+                }
+            }
+    }
+
+    if (topmove==bottommove) {
+        for (long i=1; i<bottommove; i++) {
+            SwapRows(middle+i, middle-i);
+            index->Swap (middle+i, middle-i);
+        }
+    } else if (topmove>bottommove) {
+        long shift = topmove-bottommove;
+        // in the example above, shift = 2
+        
+        for (long i=1; i<bottommove; i++) {
+             SwapRows (middle-i, middle+i+shift);
+             index->Swap(middle-i, middle+i+shift);
+        }
+        // at the end of this loop, the example above will look like 
+        // -------M--+++++++++, so now if we swap 'M' with the last '-', we'll arrive at the desired configuration
+        
+        SwapRows    (middle, middle+shift);
+        index->Swap (middle, middle+shift);
+        middle+=shift;
+        
+    } else {
+        long shift = bottommove-topmove;
+        for (long i=1; i<topmove; i++) {
+            SwapRows (middle+i, middle-i-shift);
+            index->Swap (middle+i, middle-i-shift);
+        }
+
+        SwapRows    (middle, middle-shift);
+        index->Swap (middle, middle-shift);
+        middle-=shift;
+    }
+
+    if (to>middle+1) {
+        RecursiveIndexSort (middle+1,to, index);
+    }
+    if (from<middle-1) {
+        RecursiveIndexSort (from,middle-1, index);
+    }
+}
+
+//_____________________________________________________________________________________________
+_PMathObj       _Matrix::SortMatrixOnColumn (_PMathObj mp)
+{
+    if (storageType!=1) {
+        WarnError  ("Only numeric matrices can be sorted");
+        return new _MathObject();
+    }
+
+    if (theData == nil) {
+        return new _Matrix (0,0);
+    }
+
+    _SimpleList sortOn;
+
+    if (mp->ObjectClass () != NUMBER || mp->Value() < 0.0 || mp->Value () > GetVDim()-1) {
+        bool goodMe = false;
+        if (mp->ObjectClass () == MATRIX) {
+            _Matrix * sortOnM = (_Matrix*)((_Matrix*)mp)->ComputeNumeric();
+            long sortBy      = sortOnM->GetHDim()*sortOnM->GetVDim(),
+                 maxColumnID = GetVDim();
+                  
+            for (long k=0; k<sortBy; k=k+1) {
+                long idx = (*sortOnM)[k];
+                if (idx < 0 || idx >= maxColumnID) {
+                    WarnError (_String("Invalid column index to sort on in call to ") & __func__ & " : " & idx); 
+                    return new _MathObject();               
+                }
+                sortOn << idx;
+            }
+            goodMe = sortOn.lLength;
+        }
+        if (!goodMe) {
+            _String    errMsg ("Invalid column index to sort the matrix on:");
+            errMsg = errMsg & _String((_String*)mp->toStr());
+            WarnError  (errMsg);
+            return new _MathObject;
+        }
+    } else {
+        sortOn << mp->Value();
+    }
+
+    // SLKP 20111109 -- replace with a generic sort function
+                     // the code below is BROKEN
+    
+    _SimpleList             idx (hDim,0,1);
+    _Matrix theColumn   (hDim,sortOn.lLength,false,true);
+
+    for (unsigned long col2Sort = 0; col2Sort < sortOn.lLength; col2Sort++) {
+        long colIdx = sortOn.lData[col2Sort];
+
+        if (theIndex)
+            for (long k=0; k<hDim; k++) {
+                theColumn.theData[col2Sort+k*sortOn.lLength] = (*this)(k, colIdx);
+            }
+        else
+            for (long k=0, j = colIdx; k<hDim; k++, j+=vDim) {
+                theColumn.theData[col2Sort+k*sortOn.lLength] = theData[j];
+            }
+
+    }
+
+    theColumn.RecursiveIndexSort (0, hDim-1, &idx);
+    _Matrix                 *result     = new _Matrix (hDim, vDim, theIndex, 1);
+
+    if (theIndex) {
+        _SimpleList    revIdx (hDim,0,1);
+        SortLists (&idx, &revIdx);
+        for (long r=0; r<lDim; r++) {
+            long oi = theIndex[r];
+
+            if (oi >= 0) {
+                long     v  = oi%vDim,
+                         h  = oi/vDim,
+                         ni = revIdx.lData[h]*vDim+v;
+
+                (*result)[ni] = theData[r];
+            }
+        }
+    } else
+        for (long r=0; r<hDim; r++) {
+            long remapped = idx.lData[r];
+            remapped *= vDim;
+            for (long c=r*vDim; c<r*vDim+vDim; c++, remapped++) {
+                result->theData[c] = theData[remapped];
+            }
+        }
+
+    if (!result) {
+        checkPointer (result);
+    }
+
+    return result;
+}
+
+//_____________________________________________________________________________________________
+_PMathObj       _Matrix::PoissonLL (_PMathObj mp)
+{
+    if (storageType!=1) {
+        _String    errMsg ("Only numeric matrices can be passed to Poisson Log-Likelihood");
+        WarnError  (errMsg);
+        return new _Constant (0.0);
+    }
+
+    if (mp->ObjectClass () != NUMBER || mp->Value() < 0.0) {
+        _String    errMsg ("Invalid Poisson distribution parameter");
+        errMsg = errMsg & _String((_String*)mp->toStr());
+        WarnError  (errMsg);
+        return new _Constant (0.0);
+    }
+
+    _Parameter     loglik = 0.0,
+                   *logFactorials = new _Parameter [101],
+    lambda        = mp->Value(),
+    logLambda     = log (lambda),
+    log2p         = log (sqrt(8.*atan(1.)));
+
+    checkPointer (logFactorials);
+
+    logFactorials[0] = 0.;
+    logFactorials[1] = 0.;
+
+    long           maxFactorialDone = 1;
+
+    for (long idx = 0; idx < lDim; idx++) {
+        long  cellValue = 0;
+        if (theIndex) {
+            cellValue = theIndex[idx];
+            if (cellValue<0) {
+                continue;
+            }
+
+            cellValue = theData[cellValue];
+        } else {
+            cellValue = theData[idx];
+        }
+
+        if (cellValue>=0) {
+            if (maxFactorialDone>=cellValue) {
+                loglik += logLambda * cellValue - lambda - logFactorials [cellValue];
+            } else {
+                if (cellValue<=100) {
+                    for (long idx2 = maxFactorialDone+1; idx2 <= cellValue; idx2++) {
+                        logFactorials[idx2] = logFactorials[idx2-1]+log((_Parameter)idx2);
+                    }
+                    loglik += logLambda * cellValue - lambda - logFactorials [cellValue];
+                    maxFactorialDone = cellValue;
+                } else
+                    // use Stirling's formula
+                {
+                    loglik += logLambda * cellValue - lambda + cellValue - (cellValue+0.5)*log((_Parameter)cellValue)-log2p;
+                }
+            }
+        }
+    }
+
+    delete      [] logFactorials;
+
+    return new _Constant (loglik);
+}
+
+
+//_____________________________________________________________________________________________
+_PMathObj       _Matrix::PathLogLikelihood (_PMathObj mp)
+{
+    _Matrix                 *m          = nil;
+
+    _String                 errMsg;
+
+    if (storageType!=1 || hDim != 3) {
+        errMsg = ("First argument in call to < (PathLogLikelihood) must be a numeric 3xN matrix");
+    } else {
+        errMsg = ("Second argument in call to < (PathLogLikelihood) must be a square matrix");
+        if (mp->ObjectClass () == MATRIX) {
+            m = (_Matrix*)mp->Compute();
+            if (m->GetHDim() == m->GetVDim()) {
+                errMsg = empty;
+            }
+        }
+    }
+
+    if (errMsg.sLength) {
+        WarnError  (errMsg);
+        return new _Constant (0.);
+    }
+
+    CheckIfSparseEnough     (true);
+
+    _Parameter              res     = 0.0;
+    long                    maxDim  = m->GetHDim();
+
+    for (long step = 0; step < vDim; step++) {
+        long       i1 = theData[step],
+                   i2 = theData[vDim+step];
+
+        _Parameter t  = theData[2*vDim+step];
+
+        if (i1<0 || i2 < 0 || i1 >= maxDim || i2 >= maxDim || t<0.0) {
+            errMsg = _String ("An invalid transition in step ") & (step+1) & " of the chain: " & i1 & " to " & i2 & " in time " & t;
+            WarnError  (errMsg);
+            return new _Constant (0.);
+        }
+
+        _Matrix         rateMx (*m);
+        rateMx *= t;
+        _Matrix   * tMatrix = rateMx.Exponentiate ();
+
+        t = tMatrix->theData[maxDim*i1+i2];
+        DeleteObject (tMatrix);
+
+        if (t>0.0) {
+            res += log (t);
+        } else {
+            return new _Constant (-1.e300);
+        }
+    }
+
+    return new _Constant (res);
+}
+
+//_____________________________________________________________________________________________
+_PMathObj       _Matrix::pFDR (_PMathObj classes)
+{
+    _String         errMsg;
+    long            k,
+                    steps     = 20,
+                    iterCount = 500;
+
+    _Parameter      pVal = 0.0,
+                    maxLambda = 0.0;
+
+
+    if (theIndex) {
+        CheckIfSparseEnough (true);
+    }
+
+    if (storageType!=1) {
+        errMsg = "Only numeric matrices can be passed to && (pFDR)";
+    } else {
+        if ((GetVDim () != 1 && GetHDim() != 1) || GetVDim()*GetHDim() < 1) {
+            errMsg = "The first argument of && (pFDR) must be an Nx1 matrix.";
+        } else if (classes->ObjectClass () != NUMBER || classes->Value() > 1. || (pVal = classes->Value()) < 0.0) {
+            errMsg = _String ("Invalid baseline p-value (must be in (0,1)):") & _String((_String*)classes->toStr());
+        } else {
+            for (long i=1; i<lDim; i++) {
+                _Parameter pCount = theData[i];
+                if (pCount < 0.0 || pCount > 1.0) {
+                    errMsg = _String ("Invalid p-value entry in matrix passed to pFDR (must be a positive integer):");
+                }
+                if (pCount > maxLambda) {
+                    maxLambda = pCount;
+                }
+            }
+        }
+    }
+
+
+    if (errMsg.sLength) {
+        WarnError  (errMsg);
+        return new _Constant (0.0);
+    }
+
+    _Matrix        lamdbaRange (steps,1,false,true),
+                   pFDRs       (steps,1,false,true);
+
+    _Parameter     anLamdba           = 0.0,
+                   minPFDR          = 5.0,
+                   uberPFDR        = 0.0,
+                   uberPFDRUpperLimit = 0.0,
+                   minMSE             = 1.e100,
+                   aStep            = 1.0/steps;
+
+
+    k = 0;
+    while (anLamdba<1.0) {
+        lamdbaRange.theData[k] = anLamdba;
+
+        if ((pFDRs.theData[k] = computePFDR (anLamdba, pVal))<minPFDR) {
+            minPFDR = pFDRs.theData[k];
+        }
+
+        k++;
+        anLamdba += aStep;
+    }
+
+    for (k=0; k<steps; k++) {
+        _Parameter mse    = 0.0;
+        _Matrix    ITpDFR (iterCount,1,false,true);
+
+        for (long it = 0; it < iterCount; it = it+1) {
+            _Matrix         sampledPs (lDim,1,false,true);
+            _SimpleList     sample    (lDim,0,1);
+            sample.PermuteWithReplacement (1);
+
+            for (long el = 0; el < lDim; el++) {
+                sampledPs.theData[el] = theData[sample.lData[el]];
+            }
+
+            ITpDFR.theData[it] = sampledPs.computePFDR (lamdbaRange.theData[k], pVal);
+
+            mse += (ITpDFR.theData[it]-minPFDR)*(ITpDFR.theData[it]-minPFDR);
+        }
+
+        mse /= iterCount;
+
+        if (mse < minMSE) {
+            minMSE = mse;
+            uberPFDR = pFDRs.theData[k];
+            _Constant  zer (0.0);
+            _Matrix* sorted = (_Matrix*)ITpDFR.SortMatrixOnColumn (&zer);
+            uberPFDRUpperLimit = sorted->theData[((long)(0.95*iterCount))];
+            DeleteObject (sorted);
+        }
+    }
+
+    _Matrix * resMx = new _Matrix(2,1,false,true);
+    checkPointer (resMx);
+    resMx->theData[0] = uberPFDR;
+    resMx->theData[1] = uberPFDRUpperLimit;
+
+    return resMx;
+}
+
+//_____________________________________________________________________________________________
+_Parameter      _Matrix::computePFDR (_Parameter lambda, _Parameter gamma)
+// assumes a non-sparse row/column matrix
+{
+    long        rejected    = 0,
+                null         = 0;
+
+    for (long idx = 0; idx < lDim; idx++) {
+        if (theData[idx] <= gamma) {
+            rejected++;
+        }
+        if (theData[idx] > lambda) {
+            null++;
+        }
+    }
+
+    if (null) {
+        _Parameter pi_0 = null/(lDim*(1.-lambda)),
+                   pr_p = 0;
+
+        if (rejected) {
+            pr_p = rejected/(_Parameter)lDim;
+        } else {
+            pr_p = 1./(_Parameter)lDim;
+        }
+
+        return pi_0 * gamma / (pr_p /** (1.-exp(log(1.-gamma)*lDim))*/);
+
+    } else {
+        return 1;
+    }
+}
+
+//_____________________________________________________________________________________________
+
+_PMathObj _Matrix::Random (_PMathObj kind)
+{
+    _String     errMsg;
+
+    long myVDim = GetVDim(),
+         myHDim = GetHDim();
+
+    if (kind->ObjectClass() == NUMBER) {
+        bool    resample = (kind->Compute()->Value()>0);
+
+
+        _SimpleList     remapped (myVDim,0,1);
+
+        if (resample) {
+            remapped.PermuteWithReplacement(1);
+        } else {
+            remapped.Permute(1);
+        }
+
+
+        if (storageType==1) {   // numeric matrix
+            _Matrix * res = new _Matrix (GetHDim(), GetVDim(),theIndex,true);
+            checkPointer (res);
+
+            if (!theIndex)
+                for (unsigned long vv = 0; vv<lDim; vv+=myVDim)
+                    for (unsigned long k2=0; k2<remapped.lLength; k2++) {
+                        res->theData[vv+k2] = theData[vv+remapped.lData[k2]];
+                    }
+            else {
+                for (unsigned long vv = 0; vv<myHDim; vv++)
+                    for (unsigned long k=0; k<remapped.lLength; k++) {
+                        long ki = remapped.lData[k];
+                        if ((ki = Hash (vv,ki)) >= 0) {
+                            res->Store (vv,k,theData[ki]);
+                        }
+                    }
+            }
+            return res;
+        } else {            // formula matrix
+            if (storageType==2) {
+                _Matrix * res = new _Matrix (GetHDim(), GetVDim(),theIndex,false);
+                checkPointer (res);
+
+                for (unsigned long vv = 0; vv<myHDim; vv++)
+                    for (unsigned long k=0; k<remapped.lLength; k++) {
+                        long ki = remapped.lData[k];
+                        _Formula * ff = GetFormula (vv,ki);
+                        if (ff) {
+                            res->StoreFormula (vv, k, *ff);
+                        }
+                    }
+                return res;
+            }
+        }
+    }
+
+    else if (kind->ObjectClass() == ASSOCIATIVE_LIST) {
+        //ReportWarning (_String("_Matrix::Random() with associative list as first argument."));
+
+        // Associative list should contain following arguments:
+        //  "PDF" - string corresponding to p.d.f. ("Gamma", "Normal")
+        //  "ARG0" ... "ARGn" - whatever parameter arguments (matrices) are required for the p.d.f.
+        
+        _AssociativeList    * pdfArgs   = (_AssociativeList *)kind;
+        _List               * keys      = pdfArgs->GetKeys();
+        _String             pdfkey      ("PDF"),
+                            * arg0      = (_String *)(*keys)(0);
+
+        if (arg0->Equal(&pdfkey)) {
+            _String     pdf ((_String *) (pdfArgs->GetByKey(pdfkey,STRING))->toStr()),
+                        arg ("ARG0");
+                        
+            long        pdfCode = _HY_MatrixRandomValidPDFs.GetValueFromString (pdf);
+            
+             switch (pdfCode) {
+                case _HY_MATRIX_RANDOM_DIRICHLET:
+                    return (_Matrix *) DirichletDeviate();
+                case _HY_MATRIX_RANDOM_GAUSSIAN:
+                    return (_Matrix *) GaussianDeviate (*(_Matrix *) pdfArgs->GetByKey (arg, MATRIX));
+                case _HY_MATRIX_RANDOM_WISHART:
+                    return (_Matrix *) WishartDeviate (*(_Matrix *) pdfArgs->GetByKey (arg, MATRIX));
+                case _HY_MATRIX_RANDOM_INVERSE_WISHART:
+                    return (_Matrix *) InverseWishartDeviate (*(_Matrix *) pdfArgs->GetByKey (arg, MATRIX));
+                case _HY_MATRIX_RANDOM_MULTINOMIAL:
+                    return (_Matrix *) MultinomialSample ((_Constant *) pdfArgs->GetByKey (arg, NUMBER));
+                default:
+                    errMsg = _String("String argument passed to Random not a supported PDF: '") & pdf & "'";
+            }
+        } else {
+            errMsg = _String("Expecting \"PDF\" key in associative list argument passed to Random(), received: ") & ((_String *)(*keys)(0))->getStr();
+        }
+
+    } else if (kind->ObjectClass () == STRING) {
+        _String key = *((_FString*)kind->Compute())->theString;
+        if (key == _String("LHS"))
+            // latin hypercube sampling: samples are in ROWS
+        {
+            _Matrix * lhc = new _Matrix (myHDim, myVDim, false, true);
+
+            _SimpleList permutation (myHDim,0,1);
+
+            for (long c = 0; c < myVDim; c++) {
+                permutation.Permute (1);
+                for (long r = 0; r < myHDim; r++) {
+                    lhc->theData[r*myVDim + c] = theData[permutation.lData[r]*myVDim + c];
+                }
+            }
+
+            return lhc;
+        }
+        errMsg = _String ("Invalid string argument passed to matrix Random :") & key;
+    } else {
+        errMsg = _String ("Invalid argument passes to matrix Random (should be a number, an associative list or a string):") & _String((_String*)kind->toStr());
+    }
+
+    // error handling
+    WarnError (errMsg);
+    return new _Matrix (1,1);
+}
+
+//_____________________________________________________________________________________________
+_PMathObj       _Matrix::K_Means (_PMathObj classes)
+{
+    _String         errMsg;
+    _Matrix     *   arg;
+    long            clusterCount,
+                    iterCount,
+                    dataPoints = 0;
+
+    if (theIndex) {
+        CheckIfSparseEnough (true);
+    }
+
+    if (storageType!=1) {
+        errMsg = "Only numeric matrices can be passed to <= (K-means)";
+    } else {
+        if (GetVDim () != 2) {
+            errMsg = "The first argument of <= (K-means) must be an Nx2 matrix, with samples in the first columns, and counts in the 2nd.";
+        } else if (classes->ObjectClass () != MATRIX) {
+            errMsg = _String ("Invalid number of clusters is call to K-means (must be >=1):") & _String((_String*)classes->toStr());
+        } else {
+            arg = (_Matrix*)classes->Compute();
+            if (arg->GetVDim () != 1 || arg->GetHDim () != 2 || (clusterCount=arg->theData[0]) < 1 || (iterCount = arg->theData[1]) < 1) {
+                errMsg = _String ("Invalid second argument is call to K-means (must be a 2x1 matrix of positive integers):") & _String((_String*)classes->toStr());
+            } else {
+                for (long i=1; i<lDim; i+=2) {
+                    long pCount = theData[i];
+                    if (pCount <= 0) {
+                        errMsg = _String ("Invalid count entry in matrix passed to K-means (must be a positive integer):");
+                    }
+                    dataPoints += pCount;
+                }
+            }
+        }
+    }
+
+
+    if (errMsg.sLength) {
+        WarnError  (errMsg);
+        return new _Matrix (1,1);
+    }
+
+    _Matrix * res = new _Matrix (2, clusterCount, false, true);
+    checkPointer (res);
+
+    if (clusterCount == 1) {
+        _Parameter sampleMean    = 0.,
+                   errorEstimate = 0.;
+
+        for (long c1=0, c2=1; c1 < 2*hDim; c1+=2, c2+=2) {
+            sampleMean +=  theData[c1] * theData[c2];
+        }
+
+        sampleMean /= dataPoints;
+
+        {
+            for (long c1=0, c2=1; c1 < 2*hDim; c1+=2, c2+=2) {
+                _Parameter locErr = theData[c1] - sampleMean;
+                //if (locErr > 0.0)
+                errorEstimate += locErr*locErr*theData[c2];
+                //else
+                //errorEstimate -= locErr*theData[c2];
+            }
+        }
+
+        res->theData[0] = sampleMean;
+        res->theData[1] = errorEstimate;
+    } else {
+        _Matrix     clusterBreaks       (clusterCount,1,false,true),
+                    lastClusterBreaks   (clusterCount,1,false,true),
+                    clusterMeans        (clusterCount,2,false,true);
+
+        _Parameter  minError    = 1.e100;
+        long        hitMinError,
+                    toggle      = 0;
+
+        _SimpleList randomMapper    ((unsigned long)dataPoints,0,0),
+                    allowedPoints (hDim+1,1,0);
+
+
+        for (long c1 = 0; c1 < hDim; c1++) {
+            hitMinError = theData[c1*2+1];
+
+            for (long c2 = 0; c2 < hitMinError; c2++) {
+                randomMapper.lData[toggle+c2] = c1;
+            }
+
+            toggle += hitMinError;
+
+        }
+
+        allowedPoints.lData[hDim] = 0;
+
+        hitMinError = 0;
+        toggle      = 0;
+
+        for (long sampleCount = 0; sampleCount < iterCount; sampleCount ++) {
+            _SimpleList       chosenMeans (clusterCount,0,0);
+
+            for (long cc = 0; cc < clusterCount; cc = cc+1) {
+                long sfrom = hDim;
+
+                while (allowedPoints.lData[sfrom] == 0) {
+                    sfrom = randomMapper.lData[(long)(genrand_real2()*dataPoints)];
+                }
+
+                chosenMeans.lData[cc] = sfrom;
+                allowedPoints.lData[sfrom] = 0;
+            }
+
+            chosenMeans.Sort ();
+            {
+                for (long cc = 0; cc < clusterCount; cc = cc+1) {
+                    clusterMeans.theData[toggle+cc] = theData[2*chosenMeans.lData[cc]];
+                    allowedPoints.lData[chosenMeans.lData[cc]] = 1;
+                }
+            }
+
+            _Parameter            lastErrorEstimate = 1.e100,
+                                  errorEstimate = 0.;
+
+            for (long cIters = 0; cIters < 250; cIters = cIters + 1) {
+                if (fabs (lastErrorEstimate-errorEstimate) > 0.0001 || (clusterBreaks-lastClusterBreaks).MaxElement() > 0.0001 ) {
+                    lastClusterBreaks = clusterBreaks;
+                    lastErrorEstimate = errorEstimate;
+
+                    {
+                        long    breakPoint = 0,
+                                k = 0,
+                                kp1 = 1;
+
+                        for (; k<clusterCount-1 && breakPoint < hDim; k=k+1, kp1++) {
+                            _Parameter cm4 = clusterMeans.theData[toggle+k],
+                                       cm2 = clusterMeans.theData[toggle+kp1],
+                                       cm3 = theData[2*breakPoint];
+
+                            while (fabs(cm3-cm4)<fabs(cm3-cm2)) {
+                                breakPoint ++;
+                                if (breakPoint == hDim) {
+                                    break;
+                                }
+                                cm3 = theData[2*breakPoint];
+                            }
+                            clusterBreaks.theData[k] = breakPoint;
+                        }
+                        clusterBreaks.theData[k] = hDim;
+                    }
+
+                    errorEstimate = 0.0;
+
+                    long        currentStart = 0;
+
+                    for (long cm1 = 0; cm1 < clusterCount && currentStart < hDim-1; cm1 = cm1+1) {
+                        _Parameter  cm2 = 0.;
+
+
+                        long        k,
+                                    cm4 = 0;
+
+                        for (k=currentStart; k<clusterBreaks.theData[cm1]; k=k+1) {
+                            cm2 += theData[k*2] * theData[k*2+1];
+                            cm4 += theData[k*2+1];
+                        }
+
+                        long  cm3 = k-currentStart;
+
+                        if (cm3>0) {
+                            cm2 /= cm4;
+
+                            clusterMeans.theData[cm1+toggle] = cm2;
+
+                            for (long k=currentStart; k<clusterBreaks.theData[cm1]; k=k+1) {
+                                _Parameter locError = theData[2*k] - cm2;
+                                //if (locError < 0.0)
+                                //  errorEstimate -= locError*theData[2*k+1];
+                                //else
+                                errorEstimate += locError*locError*theData[2*k+1];
+                            }
+
+                            currentStart = clusterBreaks.theData[cm1];
+                        }
+                    }
+                } else {
+                    break;
+                }
+            }
+
+            if (minError == 0.0 || fabs((minError-errorEstimate)/minError) < 0.001) {
+                hitMinError ++;
+            } else if (errorEstimate < minError) {
+                hitMinError = 1;
+                toggle      = (toggle+clusterCount)%(2*clusterCount);
+                minError    = errorEstimate;
+            }
+        }
+
+        toggle  = (toggle+clusterCount)%(2*clusterCount);
+        for (long k2 = 0; k2 < clusterCount; k2++) {
+            res->theData[k2] = clusterMeans.theData[toggle+k2];
+        }
+        res->theData[clusterCount]   = minError;
+        res->theData[clusterCount+1] = hitMinError;
+    }
+
+    return res;
+}
+
+//_____________________________________________________________________________________________
+_PMathObj       _Matrix::ProfileMeanFit (_PMathObj classes)
+{
+    _String         errMsg;
+    _Matrix     *   arg;
+    long            weightClasses;
+
+    _Parameter      dataPoints = 0.;
+
+    if (theIndex) {
+        CheckIfSparseEnough (true);
+    }
+
+    if (storageType!=1) {
+        errMsg = "Only numeric matrices can be passed to <= (K-means)";
+    } else {
+        if (GetHDim () != 2) {
+            errMsg = "The first argument of ProfileMeanFit must be an 2xN matrix, with samples in the first row, and counts in the 2nd.";
+        } else if (classes->ObjectClass () != MATRIX) {
+            errMsg = _String ("Invalid second argument for ProfileMeanFit (must be a column vector):") & _String((_String*)classes->toStr());
+        } else {
+            arg = (_Matrix*)classes->Compute();
+            if (arg->GetVDim () != 1) {
+                errMsg = _String ("Invalid second argument is call to ProfileMeanFit (must be a column vector):") & _String((_String*)classes->toStr());
+            } else {
+                weightClasses = arg->GetHDim ();
+
+                for (long i=vDim; i<lDim; i++) {
+                    long pCount = theData[i];
+                    if (pCount <= 0) {
+                        errMsg = _String ("Invalid count entry in matrix passed to ProfileMeanFit (must be a positive integer):");
+                    }
+                    dataPoints += pCount;
+                }
+            }
+        }
+    }
+
+
+    if (errMsg.sLength) {
+        WarnError  (errMsg);
+        return new _Matrix (1,1);
+    }
+
+    _Matrix * res           = new _Matrix (4, weightClasses, false, true);
+    //_SimpleList               splitRuns (weightClasses,0,0);
+    checkPointer (res);
+
+    _Parameter      runningSum      = 0.,
+                    targetSum        = arg->theData[0],
+                    valueSum      = 0.,
+                    logLikelihood   = 0.,
+                    varMult;
+
+    checkParameter  (PROFILE_MEAN_VAR_MULT, varMult, 1.);
+
+
+
+    long            currentIndex    = 0,
+                    currentSlider = 0,
+                    runningSize     = 1,
+                    currentSpan      = theData[vDim+currentIndex],
+                    runningOffset = 0;
+
+    while (currentIndex < vDim - 1) {
+        runningSum = runningSum + theData[vDim+currentIndex]/dataPoints;
+
+        if ((runningSum >= targetSum)||(vDim-currentIndex <= weightClasses - currentSlider)) {
+            res->theData[currentSlider]                 = currentIndex;
+            res->theData[weightClasses+currentSlider]   = runningSize;
+            res->theData[weightClasses*2+currentSlider] =
+                (theData[currentIndex]*theData[vDim+currentIndex]+valueSum)/(currentSpan+theData[vDim+currentIndex]);
+
+            //splitRuns.lData[currentSlider] = currentSpan;
+            runningSize   = 1;
+            valueSum      = 0.;
+            currentSlider ++;
+            targetSum     = targetSum + arg->theData[currentSlider];
+            currentSpan   = 0;
+        } else {
+            valueSum    +=  theData[currentIndex]*theData[vDim+currentIndex];
+            runningSize ++;
+            currentSpan +=  theData[vDim+currentIndex];
+        }
+        currentIndex++;
+    }
+
+    currentSpan += theData[vDim+currentIndex];
+    valueSum    += theData[currentIndex]*theData[vDim+currentIndex];
+
+    res->theData[currentSlider]                 = currentIndex;
+    res->theData[weightClasses+currentSlider]   = runningSize;
+    res->theData[2*weightClasses+currentSlider] = valueSum/currentSpan;
+    //splitRuns.lData[currentSlider] = currentSpan;
+
+    currentIndex    = 0;
+    currentSlider   = 0;
+    runningOffset   = 0;
+
+    _Matrix          REWEIGHTED_MATRIX (vDim,1,false,true);
+
+    while (currentSlider < weightClasses) {
+        long        classSize   = res->theData[weightClasses+currentSlider];
+        _Parameter  classWeight = arg->theData[currentSlider];//splitRuns.lData[currentSlider]/dataPoints;
+
+        if (classWeight > 0.0) {
+            if (classSize == 1) {
+                logLikelihood += theData[vDim+runningOffset] * log (classWeight);
+            } else {
+                _Parameter      classMean       = res->theData[2*weightClasses+currentSlider],
+                                //classNorm         = 0.,
+                                classVar        = (fabs(classMean)>0.05)?0.5/(varMult*fabs(classMean)):0.5/(varMult*0.025);
+
+                currentIndex    = runningOffset+classSize;
+
+                for (long   reslider = runningOffset; reslider < currentIndex; reslider = reslider+1) {
+                    targetSum = theData[reslider]-classMean;
+                    targetSum = -targetSum*targetSum*classVar;
+                    REWEIGHTED_MATRIX.theData[reslider] = targetSum;
+                    //classNorm += exp(targetSum);
+                }
+
+                classWeight = log (classWeight);
+                {
+                    for (long reslider = runningOffset; reslider < currentIndex; reslider = reslider+1) {
+                        logLikelihood += (REWEIGHTED_MATRIX.theData[reslider]+classWeight)*theData[vDim+reslider];
+                    }
+                }
+            }
+        } else {
+            if (classSize>0) {
+                logLikelihood = -1e100;
+                break;
+            }
+        }
+        runningOffset += classSize;
+        currentSlider++;
+    }
+
+    res->theData[3*weightClasses] = logLikelihood;
+    return res;
+}
+
+//_____________________________________________________________________________________________
+void            _Matrix::PopulateConstantMatrix (const _Parameter v)
+{
+    if (storageType == 1)
+        for (long r=0; r<lDim; r++) {
+            theData[r] =v;
+        }
+}
+
+//_____________________________________________________________________________________________
+_PMathObj       _Matrix::AddObj (_PMathObj mp)
+{
+    if (_Matrix::ObjectClass()!=mp->ObjectClass()) {
+        if (mp->ObjectClass () == STRING) {
+            _Matrix * convMatrix = new _Matrix (*((_FString*)mp)->theString),
+            * res;
+            checkPointer (convMatrix);
+            res = (_Matrix*)AddObj (convMatrix);
+            DeleteObject (convMatrix);
+            return res;
+        }
+        if (mp->ObjectClass () == NUMBER) {
+            _Matrix* aNum = (_Matrix*)ComputeNumeric ();
+            if (aNum->storageType == 1) {
+                _Matrix * plusStuff = new _Matrix (hDim,vDim,false,true);
+                checkPointer (plusStuff);
+                _Parameter plusValue = mp->Value();
+
+                if (theIndex) {
+                    for (long k=0; k<hDim*vDim; k++) {
+                        plusStuff->theData[k] = plusValue;
+                    }
+
+                    for (long l=0; l<lDim; l++) {
+                        long rI = theIndex[l];
+                        if (rI>0) {
+                            plusStuff->theData[rI] += theData[l];
+                        }
+                    }
+                } else
+                    for (long r=0; r<lDim; r++) {
+                        plusStuff->theData[r] = theData[r] + plusValue;
+                    }
+
+                return plusStuff;
+            }
+        }
+
+        warnError( -101);
+        return new _Matrix (1,1);
+    }
+
+    _Matrix * m = (_Matrix*)mp;
+    AgreeObjects (*m);
+    _Matrix * result = new _Matrix (hDim, vDim, bool((theIndex!=nil)&&(m->theIndex!=nil)), storageType);
+    if (!result) {
+        checkPointer (result);
+    }
+    Add (*result,*m);
+    return result;
+}
+
+//_____________________________________________________________________________________________
+void        _Matrix::operator -= (_Matrix& m)
+{
+    AgreeObjects (m);
+    if ((!m.theIndex)&&theIndex) {
+        CheckIfSparseEnough(true);
+    }
+    Subtract (*this,m);
+}
+
+//_____________________________________________________________________________________________
+void       _Matrix::NonZeroEntries (_SimpleList& target) {
+    if (theIndex && storageType == 1) {
+        target.Clear();
+        target.RequestSpace(lDim);
+        for (long elementID = 0; elementID < lDim; elementID ++) {
+            if (theIndex[elementID] >= 0) {
+                target << theIndex[elementID];
+            }
+        }
+        target.Sort();
+    }
+}
+
+//_____________________________________________________________________________________________
+bool       _Matrix::Equal(_PMathObj mp)
+{
+    if (mp->ObjectClass()!=ObjectClass()) {
+        return false;
+    }
+
+    _Matrix * m = (_Matrix*)mp;
+    
+    if (m->storageType == storageType && storageType == 1 && (bool) m->theIndex == (bool) theIndex && m->hDim == hDim && m->vDim == vDim) {
+        if (theIndex) {
+        
+            _SimpleList       nonZeroThis ((unsigned long)lDim),
+                              nonZeroOther((unsigned long)m->lDim),
+                              shared;
+                        
+            NonZeroEntries    (nonZeroThis);
+            m->NonZeroEntries (nonZeroOther);
+    
+            shared.Intersect(nonZeroThis, nonZeroOther);
+            for (long elementID = 0; elementID < lDim; elementID ++) {
+            
+            }
+                        
+        } else {
+            for (long elementID = 0; elementID < lDim; elementID ++) {
+                if (!CheckEqual(theData[elementID], m->theData[elementID])) {
+                    return false;
+                }
+            }
+        }
+        
+        return true;
+    }
+    
+    return false;
+}
+
+
+//_____________________________________________________________________________________________
+_PMathObj       _Matrix::SubObj (_PMathObj mp)
+{
+    if (mp->ObjectClass()!=ObjectClass()) {
+        warnError( -101);
+        return new _Matrix (1,1);
+    }
+
+    _Matrix * m = (_Matrix*)mp;
+    AgreeObjects (*m);
+    _Matrix * result = new _Matrix (hDim, vDim, bool( theIndex && m->theIndex ), storageType);
+    if (!result) {
+        checkPointer (result);
+    }
+    Subtract (*result,*m);
+    return result;
+}
+
+//_____________________________________________________________________________________________
+void        _Matrix::operator *= (_Parameter c)
+{
+    Multiply (*this,c);
+}
+
+//_____________________________________________________________________________________________
+_Matrix     _Matrix::operator * (_Parameter c)
+{
+    _Matrix result (*this);
+    Multiply (result,c);
+    return result;
+}
+
+//_____________________________________________________________________________________________
+void        _Matrix::operator *= (_Matrix& m)
+{
+    if (CheckDimensions     (m)) {
+        AgreeObjects        (m);
+        _Matrix   result    (hDim, m.vDim, false, storageType);
+        Multiply            (result,m);
+        //if ((theIndex!=nil)||(m.theIndex!=nil)) result.AmISparse();
+        if (theIndex!=nil && m.theIndex!=nil) {
+            result.AmISparse();
+        }
+        Swap                (result);
+    }
+}
+
+//_____________________________________________________________________________________________
+void        _Matrix::MultbyS (_Matrix& m, bool leftMultiply, _Matrix* externalStorage, _Parameter* stash)
+{
+    _Matrix * result = nil;
+    if (!externalStorage) {
+        result = new _Matrix (hDim, m.vDim, false, storageType);
+    }
+
+    _Matrix * receptacle = (externalStorage?externalStorage:result);
+
+    if (leftMultiply) {
+        m.Multiply (*receptacle,*this);
+    } else {
+        Multiply   (*receptacle,m);
+    }
+
+    if (theIndex&&m.theIndex) {
+        if (receptacle->AmISparseFast(*this) == false) {
+            Swap            (*receptacle);
+        } else {
+            CompressSparseMatrix(false,stash);
+        }
+    } else { // both dense
+        Swap            (*receptacle);
+    }
+
+    if (!externalStorage) {
+        DeleteObject (result);
+    } else {
+        externalStorage->CheckIfSparseEnough (true);
+        memset (externalStorage->theData, 0, sizeof (_Parameter)*externalStorage->lDim);
+        //for (long s = 0; s < externalStorage->lDim; s++) externalStorage->theData[s] = 0.0;
+    }
+}
+
+//_____________________________________________________________________________________________
+_PMathObj       _Matrix::MultObj (_PMathObj mp)
+{
+
+    if (mp->ObjectClass()!=ObjectClass())
+        if (mp->ObjectClass()!=NUMBER) {
+            warnError(-101);
+            return new _Matrix (1,1);
+        } else {
+            _Parameter theV = mp->Value();
+            return (_PMathObj)((*this)*theV).makeDynamic();
+        }
+
+    _Matrix*        m = (_Matrix*)mp;
+    if (!CheckDimensions (*m)) return new _MathObject;
+    AgreeObjects    (*m);
+
+    _Matrix*      result = new _Matrix (hDim, m->vDim, false, storageType);
+    checkPointer  (result);
+    
+    Multiply      (*result,*m);
+    return        result;
+
+}
+
+//_____________________________________________________________________________________________
+_PMathObj       _Matrix::MultElements (_PMathObj mp, bool elementWiseDivide)
+{
+
+    if (mp->ObjectClass()!=ObjectClass()) {
+        warnError(-101);
+        return new _Matrix (1,1);
+    }
+
+    _Matrix* m = (_Matrix*)mp;
+
+    if ((GetHDim()!=m->GetHDim()) || (GetVDim()!=m->GetVDim())) {
+        WarnError ("Element-wise multiplication/division requires matrixes of the same dimension.");
+        return new _Matrix (1,1);
+    }
+
+    if ((storageType!=1)||(m->storageType != 1)) {
+        WarnError ("Element-wise multiplication/division only works on numeric matrices");
+        return new _Matrix (1,1);
+    }
+
+    _Matrix*      result = new _Matrix (hDim, vDim, false, true);
+    checkPointer  (result);
+
+    if (elementWiseDivide) {
+        if (theIndex) {
+            if (m->theIndex) {
+                for (long k=0; k<lDim; k++) {
+                    long    i = theIndex[k];
+                    if (i>=0) {
+                        result->theData [i] = theData[k] / (*m)(i/vDim, i%vDim);
+                    }
+                }
+            } else {
+                for (long k=0; k<lDim; k++) {
+                    long    i = theIndex[k];
+                    if (i>=0) {
+                        result->theData [i] = theData[k] / m->theData[i];
+                    }
+                }
+            }
+        } else {
+            if (m->theIndex) {
+                for (long k=0; k<m->lDim; k++) {
+                    long    i = m->theIndex[k];
+                    if (i>=0) {
+                        result->theData [i] = theData[i] / m->theData[k];
+                    }
+                }
+            } else
+                for (long k=0; k<lDim; k++) {
+                    result->theData [k] = theData[k] / m->theData[k];
+                }
+        }    
+    }
+    else {
+        if (theIndex) {
+            if (m->theIndex) {
+                for (long k=0; k<lDim; k++) {
+                    long    i = theIndex[k];
+                    if (i>=0) {
+                        result->theData [i] = theData[k] * (*m)(i/vDim, i%vDim);
+                    }
+                }
+            } else {
+                for (long k=0; k<lDim; k++) {
+                    long    i = theIndex[k];
+                    if (i>=0) {
+                        result->theData [i] = theData[k] * m->theData[i];
+                    }
+                }
+            }
+        } else {
+            if (m->theIndex) {
+                for (long k=0; k<m->lDim; k++) {
+                    long    i = m->theIndex[k];
+                    if (i>=0) {
+                        result->theData [i] = theData[i] * m->theData[k];
+                    }
+                }
+            } else
+                for (long k=0; k<lDim; k++) {
+                    result->theData [k] = theData[k] * m->theData[k];
+                }
+        }
+    }
+
+    if (theIndex||m->theIndex) {
+        result->AmISparse();
+    }
+
+    return  result;
+}
+
+//_____________________________________________________________________________________________
+bool    _Matrix::CheckDimensions (_Matrix& secondArg)
+// check matrix dimensions to ensure that they are multipliable
+{
+    if (vDim!=secondArg.hDim) {
+        if (hDim == 1 && secondArg.hDim==1 && vDim == secondArg.vDim) { // handle scalar product separately
+            secondArg.Transpose();
+        } else {
+            char str[255];
+            snprintf (str, sizeof(str),"Incompatible matrix dimensions in call to CheckDimension: %ldx%ld and %ldx%ld\n",hDim,vDim,secondArg.hDim,secondArg.vDim);
+            WarnError (str);
+            return false;
+        }
+    }
+    return true;
+}
+
+//_____________________________________________________________________________________________
+_Matrix     _Matrix::operator * (_Matrix& m)
+{
+    if (!CheckDimensions (m)) {   
+        _Matrix d;
+        return d;
+    }
+    
+    AgreeObjects (m);
+    _Matrix result (hDim, m.vDim, false, storageType);
+    Multiply (result,m);
+    if ((theIndex!=nil)||(m.theIndex!=nil)) {
+        result.AmISparse();
+    }
+    return result;
+
+}
+//_____________________________________________________________________________________________
+_Matrix     _Matrix::operator + (_Matrix& m)
+{
+    AgreeObjects (m);
+    _Matrix result (hDim, vDim, bool((theIndex!=nil)&&(m.theIndex!=nil)), storageType);
+    Add (result,m);
+    return result;
+
+}
+//_____________________________________________________________________________________________
+_Matrix     _Matrix::operator - (_Matrix& m)
+{
+    AgreeObjects (m);
+    _Matrix result (hDim, vDim, bool((theIndex!=nil)&&(m.theIndex!=nil)), storageType);
+    Subtract (result,m);
+    return result;
+}
+
+
+//_____________________________________________________________________________________________
+
+BaseRef _Matrix::toStr(void)
+{
+  _String result(2048L,true);
+  checkParameter (printDigitsSpec,printDigits,0);
+  long digs = printDigits;
+  
+  char number_buffer [256];
+  
+  //if (vDim<500)
+  {
+    if (storageType == 1 || (storageType == 2 && IsAStringMatrix())) {
+      bool printStrings = storageType != 1;
+ 
+      _Parameter useJSON = 0.0;
+       checkParameter (USE_JSON_FOR_MATRIX, useJSON, 0.0);
+      bool doJSON = !CheckEqual(useJSON, 0.0);
+      
+      char openBracket  = doJSON ? '[' : '{',
+      closeBracket = doJSON ? ']' : '}';
+      
+      result << openBracket;
+      result << '\n';
+      for (long i = 0; i<hDim; i++) {
+        if (i && doJSON) {
+          result << ',';
+        }
+        result<<openBracket;
+        char str[100];
+        for (long j = 0; j<vDim; j++) {
+          if (printStrings) {
+            result << '"';
+            _Formula * f = GetFormula (i,j);
+            _PMathObj fv;
+            if (f && (fv=f->Compute())) {
+              if (fv->ObjectClass() == STRING) {
+                result << ((_FString*)fv)->theString;
+              } else {
+                result << (_String*)fv->toStr();
+              }
+            }
+            result << '"';
+          } else {
+            parameterToCharBuffer ((*this)(i,j), number_buffer, 255, doJSON);
+            result<<number_buffer;
+            
+          }
+          if (j<vDim-1) {
+            result<<',';
+          }
+        }
+        result<<closeBracket;
+        result<<'\n';
+      }
+      result<<closeBracket;
+      result<<'\n';
+      result.Finalize();
+    } else if (storageType == 0) {
+      checkParameter (ANAL_COMP_FLAG, ANALYTIC_COMPUTATION_FLAG, 0);
+      if (!ANALYTIC_COMPUTATION_FLAG) {
+        return Compute()->toStr();
+      }
+      for (long i = 0; i<hDim; i++) {
+        result<<'\n';
+        result<<'[';
+        for (long j = 0; j<vDim; j++) {
+          long p = Hash (i,j);
+          if (GetMatrixObject(p)) {
+            if (p>=0) {
+              _String *sp = (_String*) GetMatrixObject (p)->toStr();
+              result<<sp;
+              if (j<vDim-1) {
+                result<<',';
+              }
+              result<<' ';
+              DeleteObject (sp);
+              continue;
+            }
+          }
+          result<<'0';
+        }
+        result<<']';
+      }
+      result<<'\n';
+      result<<'\n';
+      result.Finalize();
+    } else {
+      _Matrix* eval = (_Matrix*)ComputeNumeric();
+      result.Finalize();
+      _String* ss = (_String*)eval->toStr();
+      return ss;
+    }
+    
+    
+  }
+  
+  return result.makeDynamic();
+}
+
+//_____________________________________________________________________________________________
+
+void     _Matrix::Serialize (_String& res, _String& myID)
+{
+    if (storageType) {
+        res << '\n';
+        res <<  myID;
+        if (storageType == 1) {
+            _String * mStr = (_String*)toStr();
+            res << '=';
+            res << *mStr;
+            res << ';';
+            DeleteObject (mStr);
+        } else if (storageType == 2) {
+            _String mHeader = _String ("={") & hDim & ',' & vDim & "};\n";
+            res << mHeader;
+            for (long h=0; h<hDim; h++)
+                for (long v=0; v<vDim; v++) {
+                    _Formula *theCell = GetFormula (h,v);
+                    if (theCell&&(!theCell->IsEmpty())) {
+                        _String * fStr = (_String*)theCell->toStr();
+                        res << myID;
+                        res << '[';
+                        res << _String(h);
+                        res << "][";
+                        res << _String(v);
+                        res << "]:=";
+                        res << *fStr;
+                        res << ";\n";
+                        DeleteObject (fStr);
+                    }
+                }
+        }
+    }
+}
+
+//_________________________________________________________
+void    _Matrix::toFileStr (FILE*dest){
+  if (storageType == 1 || (storageType == 2 && IsAStringMatrix())) {
+    bool printStrings = storageType != 1;
+    long digs         = -1;
+    
+    char number_buffer [256];
+    _Parameter useJSON = 0.0;
+    checkParameter (USE_JSON_FOR_MATRIX, useJSON, 0.0);
+    bool doJSON = !CheckEqual(useJSON, 0.0);
+    
+    char openBracket  = doJSON ? '[' : '{',
+         closeBracket = doJSON ? ']' : '}';
+    
+    if (!printStrings) {
+      checkParameter (printDigitsSpec,printDigits,0);
+      digs =  printDigits;
+    }
+    
+    if (!printStrings && digs != -1) {
+      _String formatStr;
+      if (digs<=0 || digs>15) {
+        digs = 8;
+      }
+      formatStr = "%";
+      formatStr = formatStr&_String(digs+6)&'.'&_String(digs)&'g';
+      char *fs = formatStr.getStr();
+      fprintf (dest, "\n%c", openBracket);
+      for (long i = 0; i<hDim; i++) {
+        fprintf (dest, "%c", openBracket);
+        for (long j = 0; j<vDim; j++) {
+          fprintf(dest, fs, (*this)(i,j));
+          if (j<vDim-1) {
+            fprintf (dest, ",");
+          }
+          if (j%100==0) {
+            fflush(dest);
+          }
+        }
+        fprintf (dest, "}\n");
+      }
+      fprintf (dest, "}\n");
+    } else {
+      fprintf (dest, "\n{");
+      for (long i = 0; i<hDim; i++) {
+        fprintf (dest, "{");
+        for (long j = 0; j<vDim; j++) {
+          if (j) {
+            fprintf (dest,",");
+          }
+          
+          if (printStrings) {
+            fprintf (dest,"\"");;
+            _Formula * f = GetFormula (i,j);
+            _PMathObj fv;
+            if (f && (fv=f->Compute())) {
+              fprintf (dest,"%s",((_FString*)fv)->theString->sData);
+            }
+            fprintf (dest,"\"");
+          } else {
+            parameterToCharBuffer ((*this)(i,j), number_buffer, 255, doJSON);
+            fprintf(dest, "%s", number_buffer);
+          }
+        }
+        fprintf (dest, "%c%c\n", closeBracket, doJSON ? ',' : ' ');
+      }
+      fprintf (dest, "%c\n", closeBracket);
+    }
+  } else if (storageType==0) {
+    checkParameter (ANAL_COMP_FLAG, ANALYTIC_COMPUTATION_FLAG, 0);
+    if (!ANALYTIC_COMPUTATION_FLAG) {
+      Compute()->toFileStr(dest);
+      return;
+    }
+    for (long i = 0; i<hDim; i++) {
+      fprintf (dest, "\n[");
+      for (long j = 0; j<vDim; j++) {
+        long p = Hash (i,j);
+        if (p>=0) {
+          _String *sp = (_String*) GetMatrixObject (p)->toStr();
+          fprintf(dest, "%s", sp->sData);
+          fprintf (dest, ",");
+          DeleteObject (sp);
+        } else {
+          fprintf(dest, "%g", 0.0);
+        }
+      }
+      fprintf (dest, "]");
+    }
+  } else {
+    _Matrix* eval = (_Matrix*)(storageType==3?EvaluateSimple():Evaluate(false));
+    eval->toFileStr(dest);
+    DeleteObject (eval);
+  }
+}
+
+//_____________________________________________________________________________________________
+
+void    SetIncrement (int m)
+{
+    _Matrix::storageIncrement = m;
+}
+//_____________________________________________________________________________________________
+void    _Matrix::InitMxVar (_SimpleList& mxVariables, _Parameter glValue)
+{
+    _Constant gv (glValue);
+    for (long k=0; k<mxVariables.countitems(); k++) {
+        _Variable* theV = LocateVar(mxVariables(k));
+        theV->SetValue (&gv);
+    }
+
+}
+//_____________________________________________________________________________________________
+bool    _Matrix::ImportMatrixExp (FILE* theSource)
+{
+    long mDim=0,i,k=0,j,m;
+    char buffer[255],fc=0;
+    buffer[0]=0;
+    while(1) {
+        buffer[mDim]=fgetc(theSource);
+        if (feof(theSource)) {
+            return false;
+        }
+        if (buffer[mDim]==',') {
+            break;
+        }
+        mDim++;
+    }
+    buffer[mDim] = 0;
+    mDim = atol (buffer); // matrix dimension
+    Clear();
+    CreateMatrix (this,mDim,mDim,false,false);
+    // read in the variables
+    i = 0;
+    _SimpleList varList,c1,c2;
+    while (fc!=';') {
+        fc = fgetc (theSource);
+        if ((fc==',')||(fc==';')) {
+            buffer [i] = 0;
+            _String varName (buffer);
+
+            _Variable * ppv = CheckReceptacle (&varName, empty, true);
+            varList << ppv->GetAVariable();
+            i = 0;
+        } else {
+            buffer[i]=fc;
+            i++;
+        }
+        if (feof(theSource)) {
+            return false;
+        }
+    }
+    do {
+        fc = fgetc (theSource);
+        if (feof(theSource)) {
+            return false;
+        }
+    } while (fc!=';');
+
+    k = 0; // term counter
+
+    while (k<mDim*mDim) {
+        i = 0;
+        _Polynomial* thisCell = new _Polynomial (varList);
+        checkPointer(thisCell);
+        while (fc!='{') {
+            fc = fgetc (theSource);
+            buffer[i] = fc;
+            i++;
+            if (feof(theSource)) {
+                return false;
+            }
+        }
+        m = atol (buffer);
+        _Parameter* theCoeffs = (_Parameter*)MatrixMemAllocate(m*sizeof(_Parameter));
+        j = 0;
+        while (fc!='}') {
+            i = 0;
+            do {
+                buffer[i] = fc = fgetc (theSource);
+                i++;
+                if (feof(theSource)) {
+                    return false;
+                }
+            } while ((fc!=',')&&(fc!='}'));
+            buffer[i]=0;
+            theCoeffs[j]=atof (buffer);
+            j++;
+            if (j>m) {
+                return false;
+            }
+        }
+        _PolynomialData *pd = new _PolynomialData (varList.countitems(),j,theCoeffs);
+        checkPointer(pd);
+        MatrixMemFree (theCoeffs);
+        fc = fgetc(theSource);
+        if (fc != '{') {
+            return false;
+        }
+        c1.Clear();
+        while (fc!='}') {
+            i = 0;
+            do {
+                buffer[i] = fc = fgetc (theSource);
+                i++;
+                if (feof(theSource)) {
+                    return false;
+                }
+            } while ((fc!=',')&&(fc!='}'));
+            buffer[i]=0;
+            c1<<atol (buffer);
+        }
+        fc = fgetc(theSource);
+        if (fc != '{') {
+            return false;
+        }
+        c2.Clear();
+        while (fc!='}') {
+            i = 0;
+            do {
+                buffer[i] = fc = fgetc (theSource);
+                i++;
+                if (feof(theSource)) {
+                    return false;
+                }
+            } while ((fc!=',')&&(fc!='}'));
+            buffer[i]=0;
+            c2<<atol (buffer);
+        }
+        thisCell->SetTheTerms(pd);
+        thisCell->SetCLists (c1,c2);
+        StoreObject(k,thisCell);
+        k++;
+    }
+
+    return true;
+}
+
+//_____________________________________________________________________________________________
+
+void    _Matrix::ExportMatrixExp (_Matrix* theBase, FILE* theDump)
+// export the matrix's computational form in the following format
+// matrix dimension followed by a comma
+// a comma separated list of variable names followed by a semicolon
+// a list of (precision, maxcap) followed by a semicolon
+// for each matrix entry
+// number of coeffs,
+// a {} enclosed list of coefficients
+// a {} enclosed first computational list
+// a {} enclosed second computational list
+// followed by a comma
+{
+    // write out the preliminaries
+    if (storageType!=0) {
+        warnError(-200);
+        return;
+    }
+    fprintf (theDump,"%ld,",hDim);
+    _SimpleList mxVariables;
+    {
+        _AVLList        mxA (&mxVariables);
+        ScanForVariables(mxA,true);
+        mxA.ReorderList();
+    }
+
+
+    long k, i=0;
+    _Parameter* varPool = (_Parameter*)MatrixMemAllocate (mxVariables.countitems()*sizeof(_Parameter));
+    for (k=0; k<mxVariables.countitems(); k++) {
+        fprintf (theDump,"%s",LocateVar(mxVariables(k))->GetName()->sData);
+        if (k<mxVariables.countitems()-1) {
+            fprintf (theDump,"%c",',');
+        } else {
+            fprintf (theDump,"%c",';');
+        }
+        varPool[k]=topPolyCap;
+    }
+
+    // begin by computing the actual "numerical exponential"
+    // initialize all the variables to the polycap value
+
+    InitMxVar   (mxVariables, topPolyCap);
+
+    _Matrix     *dummy = (_Matrix*)theBase->Evaluate(false);
+    _Matrix     *numExp = (_Matrix*)(dummy->Exponentiate());
+
+    DeleteObject(dummy);
+    checkParameter (ANAL_MATRIX_TOLERANCE,analMatrixTolerance,1e-6);
+    fprintf (theDump,"%g,%g;",analMatrixTolerance,topPolyCap);
+
+    // now loop thru the cells and check the precision term by term
+    for (k=0; k<lDim; k++) {
+        _SimpleList termRank, termIndex,c1,c2;
+        _Polynomial* thisCell = ((_Polynomial**)theData)[k];
+        long nTerms = thisCell->GetTheTerms()->NumberOfTerms(),
+             step = nTerms/10+1, upTo = step, tup,j;
+        _Parameter* coeffHolder =  (_Parameter*)MatrixMemAllocate (nTerms*sizeof(_Parameter)), error, bestError = 1;
+
+        thisCell->RankTerms(&termRank);
+        for (i=0; i<nTerms; i++) {
+            termIndex<<i;
+        }
+        SortLists (&termRank,&termIndex);
+        termRank.Clear();
+        for (i=0; i<nTerms; i++) {
+            termRank<<(nTerms-termIndex.Find(i)-1);
+        }
+        bestError = 1;
+        while(upTo<nTerms+step) {
+            if (upTo<nTerms) {
+                tup = upTo;
+            } else {
+                tup = nTerms-1;
+            }
+            termIndex.Clear();
+            for (i=0,j=0; (i<nTerms)&&(j<=tup); i++) {
+                if (termRank.lData[i]<=tup) {
+                    coeffHolder[j]=thisCell->GetTheTerms()->GetCoeff(i);
+                    j++;
+                    termIndex<<i;
+                }
+            }
+            thisCell->Convert2ComputationForm(&c1,&c2,&termIndex);
+            error = fabs(thisCell->ComputeP(varPool,coeffHolder,thisCell->GetNoVariables()+1,c1.countitems(),c1.quickArrayAccess(),
+                                            c2.quickArrayAccess())-numExp->directIndex(k));
+            if (error<bestError) {
+                bestError = error;
+            }
+            if (bestError<=analMatrixTolerance) {
+                break;
+            }
+            upTo+=step;
+        }
+
+        if (bestError>analMatrixTolerance) {
+            char be[100];
+            snprintf (be, sizeof(be),"%g",bestError);
+            _String wm ("Polynomial Matrix Exp approximation failed tolerance test in cell (");
+            wm = wm&_String(k/hDim)&","&_String(k%hDim)&"). Tolerance achieved is:"&be;
+            ReportWarning (wm);
+        }
+        fprintf(theDump,"%ld{",tup+1);
+        for (i=0; i<=tup; i++) {
+            if (i) {
+                fprintf(theDump,",%18.16g",coeffHolder[i]);
+            } else {
+                fprintf(theDump,"%18.16g",coeffHolder[i]);
+            }
+        }
+        fprintf(theDump,"}%ld",tup);
+        c1.toFileStr(theDump);
+        c2.toFileStr(theDump);
+        MatrixMemFree (coeffHolder);
+
+    }
+    MatrixMemFree (varPool);
+    DeleteObject (numExp);
+
+    /*  // scan the maximum number of terms in the polynomial cells
+        for (k=0;k<lDim;k++)
+        {
+            _Polynomial* currentCell = ((_Polynomial**)theData)[k];
+            currentCell->Compute();
+            if (currentCell->ComputationalSize()>maxterms)
+            {
+                maxterms = currentCell->ComputationalSize();
+            }
+        }
+
+        // divide the number of terms in 10 subgroups and compute the absolute error, then try for the maxcap
+        _Parameter  stdCap = 0.0;
+        if (enforcePolyCap)
+            stdCap = topPolyCap;
+        else
+        {
+            _Parameter ub,lb;
+            for (k=0;k<mxVariables.countitems(); k++)
+            {
+                _Variable* theV = LocateVar(mxVariables(k));
+                lb = fabs(theV->GetLowerBound());
+                ub = fabs(theV->GetUpperBound());
+                if (ub>stdCap)
+                    stdCap = ub;
+                if (lb>stdCap)
+                    stdCap = lb;
+            }
+        }
+        if (stdCap>10.0)
+            stdCap = 10.0;
+
+        long  partitionSize = maxterms/10+1, currentSize = maxterms-partitionSize;
+        _Matrix     *polym, *numm, *numm1, *errMx;
+        _Parameter  error =0.0 ,step = stdCap/10, tryCap = stdCap+step, stdError;
+        InitMxVar (mxVariables,stdCap);
+        numm = (_Matrix*)theBase->Evaluate(false);
+        // first run the precision analysis on the max terms setting
+
+        InitMxVar (mxVariables,stdCap);
+        polym = (_Matrix*)Evaluate(false);
+
+        errMx = (_Matrix*)polym->SubObj(&numm->Exponentiate());
+        stdError = errMx->MaxElement();
+        DeleteObject (errMx);
+        DeleteObject (polym);
+        stdError = exp(log(10.0)*long(log(stdError)/log(10.0)));
+
+        while (error<=stdError)
+        {
+            InitMxVar (mxVariables,tryCap);
+            polym = (_Matrix*)Evaluate(false);
+            numm1 = (_Matrix*)theBase->Evaluate(false);
+            _Matrix *errMx = (_Matrix*)polym->SubObj(&numm1->Exponentiate());
+            error = errMx->MaxElement();
+            DeleteObject (errMx);
+            DeleteObject (polym);
+            DeleteObject (numm1);
+            tryCap+=step;
+            if (tryCap>10.0) break;
+        }
+
+        fprintf(theDump,"%d,%g,%g;", maxterms, stdError,tryCap-step);
+
+
+        while (currentSize>0)
+        {
+            SetPolyTermCap (currentSize);
+            InitMxVar (mxVariables,stdCap);
+            polym = (_Matrix*)Evaluate(false);
+            _Matrix *errMx = (_Matrix*)polym->SubObj(&numm->Exponentiate());
+            error = errMx->MaxElement();
+            DeleteObject (errMx);
+            DeleteObject (polym);
+            error = exp(log(10.0)*long(log(error)/log(10.0)));
+            tryCap = stdCap;
+            while (error>stdError)
+            {
+                InitMxVar (mxVariables,tryCap);
+                polym = (_Matrix*)Evaluate(false);
+                numm1 = (_Matrix*)theBase->Evaluate(false);
+                errMx = (_Matrix*)polym->SubObj(&numm1->Exponentiate());
+                error = errMx->MaxElement();
+                DeleteObject (errMx);
+                DeleteObject (polym);
+                DeleteObject (numm1);
+                tryCap-=step;
+                if (tryCap<0) break;
+            }
+            if ((tryCap<0)||(error>stdError)) break;
+            fprintf(theDump,"%d,%g,%g;", currentSize, stdError,tryCap+step);
+            currentSize-=partitionSize;
+        }
+
+        DeleteObject (numm);
+        SetPolyTermCap (0x1fffffff);
+
+        for (k=0;k<lDim;k++)
+        {
+            if (k)
+                fprintf(theDump,",");
+            _Polynomial* currentCell = ((_Polynomial**)theData)[k];
+            fprintf(theDump,"{");
+            _PolynomialData* cD = currentCell->GetTheTerms();
+            for (long l=0; l<cD->GetNoTerms();l++)
+            {
+                if (l)
+                    fprintf(theDump,",%18.16g",cD->GetCoeff(l));
+                else
+                    fprintf(theDump,"%18.16g",cD->GetCoeff(l));
+            }
+            fprintf(theDump,"}");
+            currentCell->toFileStr(theDump);
+        }*/
+
+}
+
+//_____________________________________________________________________________________________
+
+_Parameter  _Matrix::ExpNumberOfSubs  (_Matrix* freqs, bool mbf)
+{
+    if (storageType!=1 || freqs->storageType!=1 || hDim!=vDim) {
+        return 0.0;
+    }
+
+    _Parameter      result      =   0.0;
+    _Matrix         *nf         =   nil,
+                     *stencil =   branchLengthStencil();
+
+    if (freqs->theIndex) {
+        nf = new _Matrix (*freqs);
+        checkPointer (nf);
+        nf->CheckIfSparseEnough (true);
+    } else {
+        nf = freqs;
+    }
+
+
+    if (theIndex) {
+        _Parameter*   diags = new _Parameter[hDim];
+        checkPointer (diags);
+        for (long k=0; k<hDim; k++) {
+            diags[k] = 0.0;
+        }
+
+        if (mbf) {
+            for (long k=0; k<lDim; k++) {
+                long l=theIndex[k];
+                if (l>=0) {
+                    long i = l%vDim;
+                    long j = l/vDim;
+
+                    if (i!=j && (!stencil || stencil->theData[l] > 0.0)) {
+                        diags[j] += theData[k]*nf->theData[i];
+                    }
+                }
+            }
+        } else {
+            for (long k=0; k<lDim; k++) {
+                long l=theIndex[k];
+                if (l>=0) {
+                    long i = l%vDim;
+                    long j = l/vDim;
+
+                    if (i!=j && (!stencil || stencil->theData[l] > 0.0)) {
+                        diags[j] += theData[k];
+                    }
+                }
+            }
+        }
+        {
+            for (long k=0; k<hDim; k++) {
+                result += diags[k]*nf->theData[k];
+            }
+        }
+        delete [] diags;
+    } else {
+        if (mbf) {
+            for (long k=0; k<hDim; k++) {
+                long i,j;
+
+                _Parameter diag = 0.;
+                for (j=k*vDim,i=0; j<k*(vDim+1); j++,i++)
+                    if (!stencil || stencil->theData[j] > 0.0) {
+                        diag += theData[j]*nf->theData[i];
+                    }
+
+                j++;
+                i++;
+                for (; j<vDim*(k+1); j++,i++)
+                    if (!stencil || stencil->theData[j] > 0.0) {
+                        diag += theData[j]*nf->theData[i];
+                    }
+
+                result += diag * nf->theData[k];
+            }
+        } else {
+            for (long k=0; k<hDim; k++) {
+                long j;
+                _Parameter diag = 0.;
+
+                for (j=k*vDim; j<k*(vDim+1); j++)
+                    if (!stencil || stencil->theData[j] > 0.0) {
+                        diag += theData[j];
+                    }
+
+                j++;
+                for (; j<vDim*(k+1); j++)
+                    if (!stencil || stencil->theData[j] > 0.0) {
+                        diag += theData[j];
+                    }
+
+                result += diag * nf->theData[k];
+            }
+        }
+    }
+
+    if (nf!=freqs) {
+        DeleteObject (nf);
+    }
+
+    return result;
+}
+
+//_____________________________________________________________________________________________
+_List*      _Matrix::ComputeRowAndColSums (void)
+// the first entry is the matrix with row sums
+// the second - the entry with column sums
+// the third  - a constant with the total sum
+{
+    if ((storageType == 1) && (hDim >= 1) && (vDim >= 1)) {
+        _List*      resList = new _List;
+        _Matrix     *rowSums     = new _Matrix (hDim,1,false,true),
+        *columnSums  = new _Matrix (vDim,1,false,true);
+
+        if (!(rowSums && columnSums && resList)) {
+            checkPointer (nil);
+        }
+
+        _Parameter totals = 0.0;
+
+        if (theIndex) {
+            for (long item = 0; item < lDim; item ++) {
+                long idx = theIndex[item];
+                if (idx>=0) {
+
+                    _Parameter      v = theData[idx];
+
+                    rowSums->theData[idx/vDim] += v;
+                    columnSums->theData[idx%vDim] += v;
+                    totals += v;
+                }
+            }
+        } else {
+            for (long rows = 0; rows < hDim; rows++) {
+                _Parameter rowSum = 0.;
+
+                for (long columns = 0; columns < vDim; columns ++) {
+                    rowSum += theData[rows*vDim+columns];
+                }
+
+                rowSums->theData[rows] = rowSum;
+                totals += rowSum;
+            }
+
+            for (long columns = 0; columns < vDim; columns++) {
+                _Parameter colSum = 0.;
+
+                for (long rows = 0; rows < hDim; rows ++) {
+                    colSum += theData[rows*vDim+columns];
+                }
+
+                columnSums->theData[columns] = colSum;
+            }
+        }
+
+        (*resList) << rowSums;
+        (*resList) << columnSums;
+
+        DeleteObject (rowSums);
+        DeleteObject (columnSums);
+
+        {
+            _Constant tempC (totals);
+            (*resList) && & tempC;
+        }
+
+        return resList;
+
+    }
+    return nil;
+}
+
+//_____________________________________________________________________________________________
+
+_Matrix* _Matrix::NeighborJoin (bool methodIndex)
+{
+    long          specCount = GetHDim();
+
+    if (storageType != 1 ||  specCount!= GetVDim() || specCount < 4) {
+        WarnError ("NeigborJoin needs a square numeric matrix of dimension >= 4");
+        return    new _Matrix;
+    }
+
+    CheckIfSparseEnough (true);
+
+    _Matrix              netDivergence (specCount,1,false,true);
+    _SimpleList          useColumn     (specCount,0,1),
+                         columnIndex   (specCount,0,1);
+
+    _Matrix*             res = new _Matrix         ((specCount+1)*2,3,false,true);
+
+    checkPointer         (res);
+
+
+    for (long k=0; k<specCount ; k=k+1) {
+        for (long j=0; j<k; j=j+1) {
+            _Parameter d = theData[j*specCount+k];
+
+            netDivergence.theData[k] += d;
+            netDivergence.theData[j] += d;
+
+        }
+        res->theData[k*3+2] = 1;
+    }
+
+    long   cladesMade = 1;
+
+    while (cladesMade < specCount) {
+        _Parameter      min = 1.e100;
+
+        long            minIndex  = -1,
+                        minIndex2 = -1,
+                        minIndexR = -1,
+                        minIndexC = -1,
+                        k = specCount-1-cladesMade;
+
+        _Parameter      recRemaining = 1./k;
+
+        if (cladesMade == specCount-1) {
+            minIndex = useColumn.lData[1];
+
+            _Parameter d = theData[minIndex];
+
+            if ((d<0)&&methodIndex) {
+                d = 0;
+            }
+
+            k = columnIndex.lData[1];
+
+            if (k>=specCount+cladesMade-2) {
+                k = columnIndex[0];
+            }
+
+            long    m = specCount+cladesMade-2;
+
+            res->theData[k*3+1]  = d;
+            res->theData[k*3]    = m;
+            res->theData[3*m+2] += res->theData[3*k+2];
+            res->theData[3*m]    = -1;
+
+            break;
+        }
+
+        for (long i=1; i<useColumn.lLength; i=i+1) {
+            long c1 = useColumn.lData[i];
+
+            for (long j=0; j<i; j=j+1) {
+                long c2 = useColumn.lData[j];
+
+                //if (c2>=c1)
+                //break;
+
+                _Parameter d = theData[c2*specCount+c1]-(netDivergence.theData[c1]+netDivergence.theData[c2])*recRemaining;
+
+                if (d<min) {
+                    min         = d;
+                    minIndex    = c2;
+                    minIndex2   = c1;
+                    minIndexR   = j;
+                    minIndexC   = i;
+                }
+            }
+        }
+
+        if (minIndex < 0 || minIndex2 < 0 || minIndexR < 0 || minIndexC < 0) {
+            _String err ("Invalid distance matrix passed to NeighborJoin. Matrices written onto messages.log"),
+                    invalidMx ((_String*)toStr());
+            ReportWarning (invalidMx);
+            ReportWarning (_String((_String*)netDivergence.toStr()));
+            ReportWarning (_String((_String*)useColumn.toStr()));
+            WarnError (err);
+            DeleteObject (res);
+            return new _Matrix;
+        }
+
+        _Parameter      D  = theData[minIndex*specCount+minIndex2],
+                        d  = (D - (netDivergence.theData[minIndex2]-netDivergence.theData[minIndex])*recRemaining)*0.5,
+                        d2 = D - d;
+
+        if (methodIndex) {
+            if (d<0) {
+                d = 0.0;
+                d2 = D;
+            }
+            if (d2<0) {
+                d2 = 0.0;
+                d = D;
+                if (d<0) {
+                    d = 0;
+                }
+            }
+        }
+
+        long    m = columnIndex.lData [minIndexC],
+                n = columnIndex.lData [minIndexR];
+
+        k       = specCount+cladesMade-1;
+
+        res->theData[n*3]       =   k;
+        res->theData[n*3+1]     =   d;
+
+        res->theData[m*3]       =   k;
+        res->theData[m*3+1]     =   d2;
+
+        res->theData[k*3+2] = res->theData[n*3+2]+res->theData[m*3+2]+1;
+
+        d = theData[minIndex*specCount+minIndex2];
+
+        netDivergence.theData[minIndex]  = 0;
+        netDivergence.theData[minIndex2] = 0;
+
+        useColumn.Delete(minIndexC);
+        columnIndex.Delete(minIndexC);
+
+        for (k=0; k<useColumn.lLength; k++) {
+            long  k2 = useColumn.lData[k];
+
+            if (k2>=minIndex) {
+                if (k2 == minIndex) {
+                    k++;
+                }
+                break;
+            }
+
+            _Parameter d2 = theData[k2*specCount+minIndex]+theData[k2*specCount+minIndex2],
+                       t  =  (d2-d)*.5;
+
+            netDivergence.theData  [k2]               += t-d2;
+            theData [k2*specCount+minIndex]            = t;
+            netDivergence.theData[minIndex]           += t;
+
+        }
+
+        for (; k<useColumn.lLength; k++) {
+            long  k2 = useColumn.lData[k];
+            if (k2 >= minIndex2) {
+                if (k2 == minIndex2) {
+                    k++;
+                }
+                break;
+            }
+
+            _Parameter  d2 = theData[minIndex*specCount+k2]+theData[k2*specCount+minIndex2],
+                        t =  (d2-d)*.5;
+
+            netDivergence.theData [k2]                  += t-d2;
+            theData[minIndex*specCount+k2]               = t;
+            netDivergence.theData[minIndex]             += t;
+
+        }
+
+        //for (k=minIndex2+1;k<ds.species; k=k+1)
+        for (; k<useColumn.lLength; k++) {
+            long  k2 = useColumn.lData[k];
+
+            _Parameter  d2 = theData[minIndex*specCount+k2]+theData[minIndex2*specCount+k2],
+                        t =  (d2-d)*.5;
+
+            netDivergence.theData [k2]                   += t-d2;
+            theData[minIndex*specCount+k2]                = t;
+            netDivergence.theData[minIndex]              += t;
+        }
+
+        columnIndex.lData[minIndexR] = specCount+cladesMade-1;
+        {
+            for (long i=0; i<minIndex2; i++) {
+                theData[i*specCount+minIndex2] = 0;
+            }
+        }
+        {
+            for (long i=minIndex2+1; i<specCount; i++) {
+                theData[minIndex2*specCount+i]=0;
+            }
+        }
+
+        cladesMade ++;
+    }
+
+
+    //_Matrix    *tree  = res->MakeTreeFromParent (specCount);
+    //DeleteObject (res);
+    //return tree;
+    return res;
+}
+
+//_____________________________________________________________________________________________
+_Matrix*        _Matrix::MakeTreeFromParent (long specCount)
+{
+    if (hDim == 0 || vDim == 0) {
+        return new _Matrix;
+    }
+
+    if(specCount<0) {
+        _String errMsg = "Parameter must be greater than or equal to 0";
+        WarnError (errMsg);
+        return new _Matrix (1,1,false,true);
+    }
+
+    _Matrix     *tree = new _Matrix (2*(specCount+1),5,false,true),
+    CI  (2*(specCount+1),1,false,true);
+
+    checkPointer (tree);
+
+    for (long kk = 0; kk < specCount-1; kk++) {
+        tree->theData[kk*5+4] = -1;
+    }
+
+    long cladesMade = 0;
+
+    for (long nodeID2 = 0; nodeID2 < specCount; nodeID2 ++) {
+        long        nodeID       = nodeID2,
+                    nodeDepth    = 0,
+                    saveNodeID   = nodeID,
+                    parentID     = theData[nodeID*3],
+                    layoutOffset = cladesMade,
+                    m,
+                    n;
+
+        while (parentID>=0) {
+            n = tree->theData[(parentID-specCount)*5+4];
+            if (n >= 0) {
+                layoutOffset = n+tree->theData[(parentID-specCount)*5+3];
+                break;
+            }
+            parentID  = theData[parentID*3];
+        }
+
+        parentID   = theData[nodeID*3];
+
+        while (parentID>=0) {
+            n = parentID-specCount;
+            m = theData[nodeID*3+2];
+
+            if (tree->theData[n*5+4] < 0)
+                /* this node hasn't been laid out yet */
+            {
+                if (theData[parentID*3]>=0) {
+                    tree->theData[n*5+4] = layoutOffset; /* where the layout for the clade begins */
+                    tree->theData[n*5+3]   = m; /* offset for that layout */
+                }
+
+                m += layoutOffset - 1;
+
+                tree->theData[m*5]   = nodeID;
+                tree->theData[m*5+2] = theData[nodeID*3+1];
+
+                CI.theData[nodeID] = m;
+            } else
+                /* it has been laid out */
+            {
+                m += tree->theData[n*5+3]+tree->theData[n*5+4] - 1;
+
+                tree->theData[m*5]   = nodeID;
+                tree->theData[m*5+2] = theData[nodeID*3+1];
+
+                tree->theData[n*5+3] = m + theData[nodeID*3+2];
+
+                CI.theData[nodeID]   = m;
+                nodeDepth ++;
+
+                break;
+            }
+            nodeDepth++;
+            nodeID    = parentID;
+            parentID  = theData[nodeID*3];
+        }
+
+        /* update levels of nodes */
+
+        if (parentID<0) {
+            nodeID   = saveNodeID;
+            parentID = theData[nodeID*3];
+
+            while (parentID>=0) {
+                m = CI.theData[nodeID];
+                tree->theData[m*5+1] = nodeDepth;
+                nodeDepth --;
+                saveNodeID = nodeID;
+                nodeID     = parentID;
+                parentID   = theData[nodeID*3];
+            }
+
+            cladesMade += theData[3*saveNodeID+2];
+        } else {
+            m = CI.theData[parentID];
+
+            n = tree->theData[m*5+1];/* depth of the parent */
+
+            nodeID   = saveNodeID;
+
+            while (nodeDepth >= 0) {
+                m = CI.theData[nodeID];
+
+                tree->theData[m*5+1] = nodeDepth+n;
+
+                nodeDepth --;
+                nodeID  = theData[nodeID*3];
+            }
+        }
+    }
+    tree->theData[cladesMade*5]      = 2*specCount-2;
+    tree->theData[cladesMade*5+1]    = 0;
+    tree->theData[(specCount-2)*5+4] = 0;
+    return tree;
+}
+
+
+//_____________________________________________________________________________________________
+_Parameter      _Matrix::FisherExact (_Parameter p1, _Parameter p2, _Parameter p3)
+{
+    if ((hDim>=1)&&(vDim>=1)&&(hDim+vDim>2)) {
+        if (vDim<hDim) {
+            _Matrix temp (*this);
+            temp.Transpose();
+            return  temp.FisherExact (p1,p2,p3);
+        }
+        _Matrix *  numericMx = (_Matrix*)ComputeNumeric();
+
+        double     prob,
+                   pval;
+
+        numericMx->CheckIfSparseEnough (true);
+
+        double        *tempArray = new double [numericMx->lDim];
+        checkPointer (tempArray);
+
+        for (long i=0; i<hDim; i++)
+            for (long j=0; j<vDim; j++) {
+                tempArray[j*hDim+i] = numericMx->theData[i*vDim+j];
+            }
+
+        fexact_ (hDim,vDim,tempArray,p1,p2,p3,&prob,&pval);
+        delete  []  tempArray;
+        return pval;
+
+    }
+    return 1.;
+}
+
+//_____________________________________________________________________________________________
+
+void        _Matrix::SimplexHelper1 (long rowIndex, _SimpleList& columnList, long columnCount, bool useAbsValue, long& maxIndex, _Parameter& maxValue)
+// find the maximum element (using absolute value of not) in row rowIndex+1 of this matrix,
+// over first columnCount columns indexed by columnList
+//  column indexing is offset by + 1 to account for the first column not being eligible for pivoting
+{
+    if (columnCount <= 0) {
+        maxValue = 0.0;
+    } else {
+        rowIndex = (rowIndex+1)*vDim;
+        maxIndex = columnList.lData[0];
+        maxValue = theData[rowIndex+maxIndex+1];
+        for (long k=1; k<columnCount; k++) {
+            _Parameter t = useAbsValue?
+                           (fabs(theData[rowIndex+columnList.lData[k]+1])-fabs(maxValue))
+                           :(theData[rowIndex+columnList.lData[k]+1]-maxValue);
+            if (t>0.) {
+                maxValue = theData[rowIndex+columnList.lData[k]+1];
+                maxIndex = columnList.lData[k];
+            }
+        }
+    }
+}
+
+//_____________________________________________________________________________________________
+
+void        _Matrix::SimplexHelper2 (long& pivotIndex, long columnToExamine, _Parameter eps)
+{
+    long            m = hDim-2,
+                    n = vDim-1,
+                    i = 0;
+
+    _Parameter      q1,
+                    q;
+
+    pivotIndex = -1;
+    for (; i<m; i++)
+        if (theData[(i+1)*vDim+columnToExamine+1] < -eps) {
+            break;
+        }
+    if (i>=m) {
+        return;    // function is unbounded
+    }
+    q1              = -theData[(i+1)*vDim]/theData[(i+1)*vDim+columnToExamine+1];
+    pivotIndex      = i;
+    for (i=pivotIndex+1; i<m; i++) {
+        if (theData[(i+1)*vDim+columnToExamine+1] < -eps) {
+            q = -theData[(i+1)*vDim]/theData[(i+1)*vDim+columnToExamine+1];
+            if (q<q1) {
+                pivotIndex = i;
+                q1         = q;
+            } else {
+                _Parameter q0, qp;
+                if (q==q1) { // degeneracy
+                    for (long k=0; k<n; k++) {
+                        qp = -theData[(pivotIndex+1)*vDim + k + 1]/theData[(pivotIndex+1)*vDim+columnToExamine+1];
+                        q0 = -theData[(i+1)*vDim + k + 1]/theData[(i+1)*vDim+columnToExamine+1];
+                        if (q0!=qp) {
+                            break;
+                        }
+                    }
+                    if (q0 < qp) {
+                        pivotIndex = i;
+                    }
+                }
+            }
+        }
+    }
+
+}
+
+//_____________________________________________________________________________________________
+
+void        _Matrix::SimplexHelper3 (long i1, long k1, long ip, long kp)
+{
+    _Parameter piv = 1./theData[(ip+1)*vDim+kp+1];
+    for (long i=0; i<=i1+1; i++)
+        if (i-1 != ip) { // not the pivot row
+            theData[i*vDim+kp+1] *= piv;
+            for (long k=0; k<=k1+1; k++)
+                if (k-1 != kp) {
+                    theData[i*vDim+k] -= theData[(ip+1)*vDim+k] * theData[i*vDim+kp+1];
+                }
+        }
+    for (long k=0; k<=k1+1; k++)
+        if (k-1 != kp)  {
+            theData[(ip+1)*vDim+k] *= -piv;
+        }
+    theData[(ip+1)*vDim+kp+1] = piv;
+}
+
+//_____________________________________________________________________________________________
+_Matrix*    _Matrix::SimplexSolve (_Parameter desiredPrecision )
+// this function is adapted from the Num. Recipes in C version; but with 0 indexing
+// hyphy primitives
+// and without goto labels
+
+// the of dimension RxC is interpreted as follows
+// R-1 constraints
+// C-2 variables
+
+// the first row:
+//      cell   0      - current value of the objective function
+//      cells  1-C-2  - coefficient of variable x_k in the objective function
+//      cell   C-1    - if >=0. then maximize the function
+//                    - if <0   then minimize the function
+
+// other rows
+// constraint j written in the form
+// b_j - a_j1 x_1 - a_j2 x_2 - ... -a_jk x_k
+// last cell is what type of constraint it is:
+// < 0: <= inequality
+// > 0: >= inequality
+// = 0 equality
+
+// upon return, will contain a row matrix of either C-1 cells:
+// extreme value of the objective function in the first cell
+// variable values in the same order as originally supplied
+// if an empty matrix is returned - no feasible solution could be found
+// if a 1x1 matrix is returned - the objective function is unbounded
+
+{
+    _String errMsg;
+
+    long n = vDim-2, // number of variables
+         m = hDim-1; // number of constraints
+
+    if (storageType == 1 && n>0 && m>0) {
+        while (1) // artificial construct used to break out on error
+            // an to avoid goto statements
+        {
+            bool        doMaximize = (*this)(0,n+1) >= 0.0;
+
+            // allocate temporary storage
+            _Matrix     tempMatrix (m+2,n+1,false,true);
+            // first, copy the objective function row
+            for (long i=0; i<=n; i++) {
+                tempMatrix.Store(0,i,doMaximize?(*this)(0,i):-(*this)(0,i));
+            }
+
+            // now, count the number of constraints of each type and reorder things
+
+            long    m1 = 0, // <= constraints
+                    m2 = 0, // >= constraints
+                    m3 = 0; // == constraints
+
+            {
+                for (long i=1; i<=m; i++) {
+                    _Parameter t = (*this)(i,n+1);
+                    if (t<0.0) {
+                        m1++;
+                    } else if (t>0.0) {
+                        m2++;
+                    } else {
+                        m3++;
+                    }
+                    if ((*this)(i,0) < 0.0) {
+                        errMsg = "Negative values are not allowed in the first column of the simplex tableau";
+                        break;
+                    }
+                }
+            }
+
+            if (errMsg.sLength) {
+                break;
+            }
+
+            // copy coefficients into the temp matrix, sorting the constraints in the <=, >= and == order
+            {
+                for (long i=1, t1=0, t2=0, t3=0; i<=m; i++) {
+                    _Parameter t   = (*this)(i,n+1);
+                    long       idx;
+                    if (t<0.0) {
+                        idx=1+t1++;
+                    } else if (t>0.0) {
+                        idx=1+m1+t2++;
+                    } else {
+                        idx=1+m1+m2+t3++;
+                    }
+                    for (long j=0; j<=n; j++) {
+                        tempMatrix.Store(idx,j,(*this)(i,j));
+                    }
+
+                }
+            }
+            // allocate temporary storage
+
+            _SimpleList l1      (n+1,0,1),
+                        l3       (m,0,0),
+                        izrov    (n,0,1),
+                        iposv    (m,n,1);
+
+            long        nl1     = n;
+
+            if (m2+m3) { // >= and == constraints exist; origin is not a feasible solution
+                for (long i=0; i<m2; l3.lData[i] = 1,i++) ; // slack variables in the list of 'basis' variables
+                for (long k=0; k<=n; k++) { // compute the auxiliary objective function
+                    _Parameter q = 0.;
+                    for (long k2 = m1+1; k2<=m; k2++) {
+                        q += tempMatrix(k2,k);
+                    }
+                    tempMatrix.Store (m+1,k,-q);
+                }
+                while (1) { // initial artifical construct
+                    long        pivotColumn,
+                                ip;
+                    _Parameter  pivotValue;
+
+                    tempMatrix.SimplexHelper1 (m,l1,nl1,false,pivotColumn, pivotValue);
+                    if (pivotValue <= desiredPrecision && tempMatrix(m+1,0) < -desiredPrecision)
+                        // aux objective is still negative and can't be improved
+                        // no feasible solution
+                    {
+                        return new _Matrix;
+                    }
+                    if (pivotValue <= desiredPrecision && tempMatrix(m+1,0) <= desiredPrecision)
+                        // aux objective is zero and can't be improved
+                        // found a feasible solution; clean up artificial variables and move on to phase 2
+                    {
+                        for (ip = m1+m2; ip < m; ip++) {
+                            if (iposv.lData[ip] == ip + n) {
+                                tempMatrix.SimplexHelper1 (ip,l1,nl1,true,pivotColumn, pivotValue);
+                                if (pivotValue > desiredPrecision) {
+                                    goto one;
+                                }
+                            }
+                        }
+                        for (long i = m1; i<m1+m2; i++)
+                            if (l3.lData[i-m1] == 1)
+                                for (long k=0; k<=n; k++) {
+                                    tempMatrix.Store (i+1,k,-tempMatrix(i+1,k));
+                                }
+
+                        break;
+                    }
+
+                    tempMatrix.SimplexHelper2 (ip,pivotColumn,desiredPrecision);
+                    if (ip<0) {
+                        return new _Matrix (1,1,false,true);    // unbounded function
+                    }
+
+one:
+                    tempMatrix.SimplexHelper3 (m,n-1,ip,pivotColumn);
+                    if (iposv.lData[ip] >= n+m1+m2) {
+                        long k = 0;
+                        for (k=0; k<nl1; k++)
+                            if (l1.lData[k] == pivotColumn) {
+                                break;
+                            }
+                        nl1--;
+                        for (long i2=k; i2<nl1; i2++) {
+                            l1.lData[i2] = l1.lData[i2+1];
+                        }
+                    } else {
+                        long k2 = iposv.lData[ip] - m1 - n;
+                        if (k2 >= 0 && l3.lData[k2]) {
+                            l3.lData[k2] = 0;
+                            tempMatrix.theData[(m+1)*tempMatrix.vDim + pivotColumn + 1] ++;
+                            for (long i=0; i<m+2; i++) {
+                                tempMatrix.theData[i*tempMatrix.vDim + pivotColumn + 1] *= -1.0;
+                            }
+                        }
+                    }
+                    long s = izrov.lData[pivotColumn];
+                    izrov.lData[pivotColumn] = iposv.lData[ip];
+                    iposv.lData[ip] = s;
+                }// end of phase 1
+            }
+
+            while (1) {
+                long            pivotColumn,
+                                pivotRow;
+                _Parameter      pivotValue;
+
+                tempMatrix.SimplexHelper1 (-1,l1,nl1,false,pivotColumn,pivotValue);
+                if (pivotValue < desiredPrecision) { // done!
+                    // produce the final solution
+                    _Matrix * resMatrix = new _Matrix (1,n+1,false,true);
+                    checkPointer (resMatrix);
+                    resMatrix->Store(0,0,doMaximize?tempMatrix(0,0):-tempMatrix(0,0));
+                    for (long k=0; k<iposv.lLength; k++)
+                        if (iposv.lData[k]<n) {
+                            resMatrix->Store(0,iposv.lData[k]+1,tempMatrix(k+1,0));
+                        }
+                    return resMatrix;
+                }
+                tempMatrix.SimplexHelper2 (pivotRow,pivotColumn,desiredPrecision);
+                if (pivotRow<0) {
+                    return new _Matrix (1,1,false,true);
+                }
+                tempMatrix.SimplexHelper3 (m-1,n-1,pivotRow,pivotColumn);
+                long s = izrov.lData[pivotColumn];
+                izrov.lData[pivotColumn] = iposv.lData[pivotRow];
+                iposv.lData[pivotRow] = s;
+            }
+
+        }
+    } else {
+        errMsg = "SimplexSolve requires a numeric matrix with > 1 row and > 2 columns";
+    }
+
+    WarnError (errMsg);
+    return new _Matrix;
+}
+
+//_____________________________________________________________________________________________
+
+void    _Matrix::CopyABlock (_Matrix * source, long startRow, long startColumn, long rowSpan, long colSpan)
+{
+    long indexTarget = startRow*vDim + startColumn,
+         indexSource = 0,
+         sourceHDim  = rowSpan<=0?source->hDim:rowSpan,
+         sourceVDim  = colSpan<=0?source->vDim:colSpan,
+         maxRow         = MIN (hDim, startRow    + sourceHDim),
+         maxColumn   = MIN (vDim, startColumn + sourceVDim);
+
+    for  (long r = startRow; r < maxRow; r++) {
+        for (long c = startColumn, c2 = 0; c < maxColumn; c++, c2++) {
+            theData[indexTarget+c2] = source->theData[indexSource+c2];
+        }
+
+        indexSource += sourceVDim;
+        indexTarget += vDim;
+    }
+}
+
+
+//_____________________________________________________________________________________________
+_PMathObj   _Matrix::DirichletDeviate (void)
+{
+    /* -----------------------------------------------------------
+        DirichletDeviate()
+            Generate vector of random deviates from the Dirichlet
+            distribution defined by contents of this matrix as
+            hyperparameters (a > 0).
+       ----------------------------------------------------------- */
+
+    _String     errMsg;
+
+    long        dim;
+
+    _Parameter  denom   = 0.;
+
+    _Matrix     res (1, dim = GetHDim()*GetVDim(), false, true);    // row vector
+
+
+    if (storageType != 1) {
+        errMsg = "Only numeric vectors can be passed to <= (DirichletDeviate)";
+    }
+
+    if (IsAVector()) {
+        // generate a random deviate from gamma distribution for each hyperparameter
+        for (long i = 0; i < dim; i++) {
+            if (theData[i] < 0) {
+                WarnError (_String("Dirichlet not defined for negative parameter values."));
+                return new _Matrix (1,1,false,true);
+            }
+
+            res.Store (0, i, gammaDeviate(theData[i]));
+            denom += res(0,i);
+        }
+
+        // normalize by sum
+        for (long i = 0; i < dim; i++) {
+            res.Store (0, i, res(0,i)/denom);
+        }
+
+        return (_PMathObj) res.makeDynamic();
+    } else {
+        errMsg = "Argument must be a row- or column-vector.";
+    }
+
+    WarnError (errMsg);
+    return new _Matrix (1,1,false,true);
+}
+
+
+
+//_____________________________________________________________________________________________
+_PMathObj   _Matrix::GaussianDeviate (_Matrix & cov)
+{
+    /* ------------------------------------------------------
+        GaussianDeviate()
+            Generate vector of random deviates from k-
+            dimensional Gaussian distribution given contents
+            of this matrix as mean parameters, and argument
+            as covariance matrix.
+
+            Use algorithm described in Numerical Recipes
+            3rd ed., p.379
+       ------------------------------------------------------ */
+
+    //ReportWarning (_String("Entered _Matrix::GaussianDeviate() with cov = ") & (_String *)(cov.toStr()));
+
+    _String     errMsg;
+
+    if (storageType != 1 || GetHDim() > 1) {
+        WarnError (_String("ERROR in _Matrix::GaussianDeviate(), expecting to be called on numeric row vector matrix, current dimensions: ") & GetHDim() & "x" & GetVDim());
+        return new _Matrix;
+    }
+
+    long kdim = GetVDim();    // number of entries in this _Matrix object as vector of means
+
+    if (cov.GetHDim() == kdim && cov.GetVDim() == kdim) {
+        _Matrix* cov_cd = (_Matrix *) cov.CholeskyDecompose();
+        _Matrix gaussvec (1, kdim, false, true);
+
+        //ReportWarning (_String("\nCholesky decomposition of cov = ") & (_String *) cov_cd->toStr());
+
+        // fill column vector with independent standard normal deviates
+        for (long i = 0; i < kdim; i++) {
+            gaussvec.Store (0, i, gaussDeviate());
+        }
+
+        //ReportWarning (_String ("\nvector of gaussian deviates = ") & (_String *) gaussvec.toStr());
+
+        // left multiply vector by Cholesky decomposition of covariance matrix
+        gaussvec *= (_Matrix &) (*cov_cd);
+
+        // shift mean
+        for (long i = 0; i < kdim; i++) {
+            gaussvec.Store (0, i, gaussvec(0,i) + theData[i]);
+        }
+
+        DeleteObject (cov_cd);
+        return (_PMathObj) gaussvec.makeDynamic();
+    }
+
+    WarnError (_String("Error in _Matrix::GaussianDeviate(), incompatible dimensions in covariance matrix: ") & cov.GetHDim() & "x" & cov.GetVDim());
+    return new _Matrix;
+}
+
+
+//_____________________________________________________________________________________________
+_PMathObj   _Matrix::MultinomialSample (_Constant *replicates)
+{
+    _String       errMsg;
+    long          values      = GetHDim();
+    unsigned long samples     = replicates?replicates->Value ():0;
+
+    _Matrix     *eval    = (_Matrix*)Compute (),
+                * sorted = nil,
+                * result = nil;
+
+    if (samples < 1) {
+        errMsg = "Expected a numerical (>=1) value for the number of replicates";
+    } else if (eval->storageType != 1 || GetVDim() != 2 || values < 2) {
+        errMsg = "Expecting numerical Nx2 (with N>=1) matrix.";
+    } else {
+        _Constant one (1.);
+        sorted = (_Matrix*) eval->SortMatrixOnColumn(&one);
+
+
+        _Parameter      sum = 0.;
+
+        for (long n = 1; n < 2*values; n+=2) {
+            _Parameter v = sorted->theData[n];
+            if (v < 0.) {
+                sum = 0.;
+                break;
+            }
+            sum += v;
+        }
+
+
+
+        if (CheckEqual (sum, 0.)) {
+            errMsg = "The probabilities (second column) cannot add to 0 or be negative";
+        } else {
+            sum = 1./sum;
+
+            _Matrix     *raw_result  = new _Matrix (1, values, false, true),
+            *normalized  = new _Matrix (1, values, false, true);
+
+            for (long v = 0; v < values; v++) {
+                normalized->theData[values-1-v] = sorted->theData[1+2*v] * sum;
+            }
+
+            //BufferToConsole (_String(*(_String*)normalized->toStr()).sData);
+            //NLToConsole ();
+
+            _String      _HYMultinomialStatus       ("Generating multinomial samples");
+
+
+#if !defined __UNIX__ || defined __HEADLESS__
+            TimerDifferenceFunction(false); // save initial timer; will only update every 1 second
+#if !defined __HEADLESS__
+            SetStatusLine     (empty,_HYMultinomialStatus, empty, 0, HY_SL_TASK|HY_SL_PERCENT);
+#else
+            SetStatusLine     (_HYMultinomialStatus);
+#endif
+            _Parameter  seconds_accumulator = .0,
+                        temp;
+#endif
+
+            for (unsigned long it = 0; it < samples; it++) {
+                _Parameter randomValue = genrand_real2(),
+                           sum   = normalized->theData[0];
+                long       index = 0;
+
+                while (sum < randomValue) {
+                    index++;
+                    sum += normalized->theData[index];
+                }
+
+                raw_result->theData[index] += 1.;
+#if !defined __UNIX__ || defined __HEADLESS__
+                if ((it % 1000 == 0) && (temp=TimerDifferenceFunction(true))>1.0) { // time to update
+                    seconds_accumulator += temp;
+
+                    _String statusLine = _HYMultinomialStatus & " " & (_Parameter)(it+1) & "/" & (_Parameter)samples
+                                         & " samples drawn (" & (1.0+it)/seconds_accumulator & "/second)";
+
+#if defined __HEADLESS__
+                    SetStatusLine (statusLine);
+#else
+                    SetStatusLine (empty,statusLine,empty,100*(float)it/(samples),HY_SL_TASK|HY_SL_PERCENT);
+#endif
+                    TimerDifferenceFunction (false); // reset timer for the next second
+                    yieldCPUTime (); // let the GUI handle user actions
+
+                    if (terminateExecution) { // user wants to cancel the analysis
+                        break;
+                    }
+                }
+#endif
+            }
+
+            result = new _Matrix (values, 2, false, true);
+
+            for (long v = 0; v < values; v++) {
+                result->theData[2*v]   = (long)sorted->theData[2*(values-1-v)];
+                result->theData[2*v+1] = raw_result->theData[v];
+            }
+
+            DeleteObject (raw_result);
+            DeleteObject (sorted);
+            sorted = normalized;
+        }
+    }
+
+
+    DeleteObject (sorted);
+    if (errMsg.sLength) {
+        WarnError (_String("Error in _Matrix::MultinomialSample(). ") & errMsg);
+        DeleteObject (result);
+        return new _Matrix;
+    }
+    return result;
+}
+
+
+//_____________________________________________________________________________________________
+_PMathObj   _Matrix::InverseWishartDeviate (_Matrix & df)
+{
+    /* ---------------------------------------------------
+        InverseWishartDeviate()
+            Generates a random matrix whose inverse
+            has the Wishart distribution with this matrix
+            supplying the covariance matrix parameter and
+            a degrees of freedom vector argument.
+       --------------------------------------------------- */
+
+    _String     errMsg;
+    long        n       = GetHDim();
+
+
+    if (storageType != 1 || GetHDim() != GetVDim()) {
+        errMsg = "expecting numerical symmetric matrix.";
+    }
+
+    else if (df.MatrixType() != 1 || df.GetHDim() != n || df.GetVDim() > 1) {
+        errMsg = "expecting numerical row vector for second argument (degrees of freedom).";
+    } else {
+        // compute Cholesky factor for this matrix inverse, extract the diagonal
+        _Matrix * inv       = (_Matrix *) Inverse();
+        _Matrix * invCD     = (_Matrix *) (inv->CholeskyDecompose());
+
+        _Matrix decomp ((_Matrix &) *invCD);    // duplication constructor
+
+        DeleteObject (invCD);
+
+        return WishartDeviate (df, decomp);
+    }
+
+
+
+    WarnError (_String ("ERROR in _Matrix::InverseWishartDeviate, ") & errMsg);
+    return new _Matrix;
+}
+
+//_____________________________________________________________________________________________
+_PMathObj   _Matrix::WishartDeviate (_Matrix & df)
+{
+    _Matrix     diag;   // calls default constructor
+    return WishartDeviate (df, diag);
+}
+
+
+_PMathObj   _Matrix::WishartDeviate (_Matrix & df, _Matrix & decomp)
+{
+    /* ---------------------------------------------------
+     WishartDeviate()
+        Generates a random matrix following the Wishart
+        distribution with this matrix supplying the
+        covariance matrix parameter.
+
+        First argument: degrees of freedom vector.
+        Second argument (optional):
+            Diagonal of Cholesky decomposition of
+            covariance matrix, overrides this matrix.
+     --------------------------------------------------- */
+
+
+    // debugging
+    //ReportWarning (_String("Entered _Matrix::WishartDeviate() with this matrix: ") & (_String *) this->toStr() & " and df vector " & (_String *) df.toStr());
+
+
+    long        n   = GetHDim();
+
+    _Matrix     rdeviates (n, n, false, true),
+                rd_transpose;
+
+
+    if (!df.IsAVector(0)) {
+        WarnError (_String ("ERROR in _Matrix::WishartDeviate(), expecting row vector for degrees of freedom argument."));
+        return new _Matrix (1,1,false,true);
+    } else if (df.IsAVector(1)) {
+        df.Transpose(); // convert column vector to row vector
+    }
+
+
+    if (decomp.GetHDim() == 0) {    // no second argument, perform Cholesky decomposition
+        if (storageType != 1 || GetHDim() != GetVDim()) {
+            WarnError (_String ("ERROR in _Matrix::WishartDeviate(), expecting square numeric matrix."));
+            return new _Matrix (1,1,false,true);
+        } else {
+            _Matrix     * cholesky = (_Matrix *) CholeskyDecompose();
+
+            if (cholesky->GetHDim() > 0) {
+                // duplicate
+                CreateMatrix (&decomp, cholesky->GetHDim(), cholesky->GetVDim(), false, true, false);
+
+                for (long i = 0; i < cholesky->GetHDim(); i++) {
+                    for (long j = 0; j < cholesky->GetVDim(); j++) {
+                        decomp.Store(i, j, (*cholesky)(i,j));
+                    }
+                }
+
+                DeleteObject (cholesky);
+            } else {
+                return (cholesky);  // empty _Matrix from error in CholeskyDecompose()
+            }
+        }
+    }
+
+    //ReportWarning (_String("diag=") & (_String *)decomp.toStr());   // column vector
+
+
+    // populate diagonal with square root of i.i.d. chi-square random deviates
+    for (long i = 0; i < n; i++) {
+        rdeviates.Store (i, i, sqrt(chisqDeviate(df(0,i)-i+1)) );
+
+        // populate upper triagonal with i.i.d. standard normal N(0,1) deviates
+        for (long j = i+1; j < n; j++) {
+            rdeviates.Store (i, j, gaussDeviate());
+        }
+    }
+
+    //ReportWarning (_String("rdeviates(A)=") & (_String *)rdeviates.toStr());
+
+
+    // result is obtained from D^T B D, where B = A^T A, ^T is matrix transpose
+    rd_transpose = (_Matrix &) rdeviates;
+    rd_transpose.Transpose();
+    //ReportWarning (_String("transpose(A)=") & (_String *)rd_transpose.toStr());
+    rd_transpose *= (_Matrix &) rdeviates;  // A^T A
+    //ReportWarning (_String("A^T A=") & (_String *)rd_transpose.toStr());
+    rd_transpose *= (_Matrix &) decomp; // A^T A D
+    //ReportWarning (_String("A^T A D=") & (_String *)rd_transpose.toStr());
+
+    decomp.Transpose();
+    decomp *= (_Matrix &) rd_transpose; // D^T A^T A D
+    //ReportWarning (_String("D^T A^T A D=") & (_String *)decomp.toStr());
+
+    return (_PMathObj) decomp.makeDynamic();
+}
+
+
+
+
+//_____________________________________________________________________________________________
+// AssociativeList
+//_____________________________________________________________________________________________
+
+_AssociativeList::_AssociativeList (void):avl(&theData)
+{
+}
+
+//_____________________________________________________________________________________________
+
+BaseRef _AssociativeList::makeDynamic (void)
+{
+    _AssociativeList * newAL = new _AssociativeList ();
+    newAL->Duplicate (this);
+    return newAL;
+}
+
+//_____________________________________________________________________________________________
+
+bool _AssociativeList::ParseStringRepresentation (_String& serializedForm, bool doErrors, _VariableContainer* theP)
+{
+    _List               splitKeys;
+    _ElementaryCommand::ExtractConditions (serializedForm, 0, splitKeys, ',' , false);
+    for (long k = 0; k < splitKeys.lLength; k = k + 1) {
+        _List aPair;
+        _ElementaryCommand::ExtractConditions (*(_String*)splitKeys(k), 0, aPair, ':' , false);
+        if (aPair.lLength == 2) {
+            _String  key        (ProcessLiteralArgument((_String*)aPair(0),theP)),
+                     errMsg;
+                     
+            _Formula value      (*(_String*)aPair(1),theP, doErrors?nil:&errMsg);
+
+            _PMathObj   valueC  = value.Compute();
+            if (valueC) {
+                MStore (key, valueC, true);
+            } else {
+                if (doErrors) {
+                    WarnError (*(_String*)aPair(1) & " could not be evaluated");
+                }
+                return false;
+
+            }
+        } else {
+            if (doErrors) {
+                WarnError (*(_String*)splitKeys(k) & " does not appear to specify a valid key:value pair");
+            }
+            return false;
+        }
+    }
+    return true;
+}
+
+//_____________________________________________________________________________________________
+
+BaseRef _AssociativeList::toStr (void)
+{
+    _String defName   ("_hyphyAssociativeArray");
+    return Serialize  (defName);
+}
+
+//_____________________________________________________________________________________________
+
+void _AssociativeList::Duplicate (BaseRef br)
+{
+    nInstances = 1;
+    _AssociativeList * copyMe = (_AssociativeList*)br;
+    theData.Duplicate (&copyMe->theData);
+    avl.leftChild.Duplicate (&copyMe->avl.leftChild);
+    avl.rightChild.Duplicate (&copyMe->avl.rightChild);
+    avl.balanceFactor.Duplicate (&copyMe->avl.balanceFactor);
+    avl.emptySlots.Duplicate (&copyMe->avl.emptySlots);
+    avl.xtraD.Duplicate (&copyMe->avl.xtraD);
+    avl.root = copyMe->avl.root;
+}
+
+//_____________________________________________________________________________________________
+
+_PMathObj _AssociativeList::MCoord (_PMathObj p)
+{
+    return new _FString ((_String*)p->toStr());
+}
+
+//_____________________________________________________________________________________________
+_PMathObj _AssociativeList::MAccess (_PMathObj p)
+{
+    long        f;
+
+    if (p->ObjectClass() == STRING) {
+        f = avl.Find (((_FString*)p)->theString);
+    } else {
+        _String s ((_String*)p->toStr());
+        f = avl.Find (&s);
+    }
+    if (f>=0) {
+        _PMathObj res = (_PMathObj)avl.GetXtra (f);
+        res->nInstances++;
+        return res;
+    } else {
+        return new _Constant (0.0);
+    }
+}
+
+//_____________________________________________________________________________________________
+_PMathObj _AssociativeList::MIterator (_PMathObj p, _PMathObj p2)
+{
+    long done = 0;
+
+
+    if (p->ObjectClass() == STRING && p2->ObjectClass() == STRING) {
+
+        long avlRoot = avl.GetRoot();
+
+        if (avlRoot >= 0) {
+            _String * s  = (_String*)p->toStr(),
+                      * s2 = (_String*)p2->toStr();
+
+            long    fID  = FindBFFunctionName (*s),
+                    fID2 = FindBFFunctionName (*s2);
+
+            if (fID < 0 || batchLanguageFunctionParameters.lData[fID] != 2) {
+                WarnError ("The first argument in an iterator call for Associative Arrays must be a valid identifier of a function taking two arguments (key, value)");
+            } else {
+                if (fID2 >= 0 && batchLanguageFunctionParameters.lData[fID2] != 1) {
+                    WarnError ("The second argument in an iterator call for Associative Arrays must be either empty or a valid identifier of a function taking a single argument");
+                }
+
+                _Formula      testFormula,
+                              actionFormula;
+
+                actionFormula.GetList().AppendNewInstance(new _Operation());
+                actionFormula.GetList().AppendNewInstance(new _Operation());
+                actionFormula.GetList().AppendNewInstance(new _Operation(empty,-fID-1));
+
+                if (fID2 >= 0) {
+                    testFormula.GetList().AppendNewInstance(new _Operation());
+                    testFormula.GetList().AppendNewInstance(new _Operation(empty,-fID2-1));
+                }
+
+
+                _SimpleList  hist;
+                long         ls,
+                             cn = avl.Traverser (hist,ls,avlRoot);
+
+                _FString * fKey = new _FString;
+                while (cn >= 0) {
+                    _String* aKey = ((_String**)avl.dataList->lData)[cn];
+                    if (aKey) {
+                        DeleteObject (fKey->theString);
+                        fKey->theString = (_String*)aKey->toStr();
+                        if (fID2 >= 0) {
+                            ((_Operation**)testFormula.GetList().lData)[0]->SetNumber(fKey);
+                            if (CheckEqual(testFormula.Compute()->Value(),0.0)) {
+                                cn = avl.Traverser (hist,ls);
+                                continue;
+                            }
+                        }
+                        ((_Operation**)actionFormula.GetList().lData)[0]->SetNumber(fKey);
+                        ((_Operation**)actionFormula.GetList().lData)[1]->SetNumber((_PMathObj)avl.GetXtra (cn));
+                        actionFormula.Compute();
+                        done ++;
+                    }
+                    cn = avl.Traverser (hist,ls);
+                }
+                DeleteObject (fKey);
+
+                ((_Operation**)actionFormula.GetList().lData)[0]->SetNumber(nil);
+                ((_Operation**)actionFormula.GetList().lData)[1]->SetNumber(nil);
+                if (fID2 >= 0) {
+                    ((_Operation**)testFormula.GetList().lData)[0]->SetNumber(nil);
+                }
+
+            }
+            DeleteObject (s) ;
+            DeleteObject (s2);
+        }
+    } else if (p->ObjectClass () == STRING && p2->ObjectClass () == NUMBER) {
+        _String * s  = (_String*)p->toStr();
+
+        if (s->Equal (&AVL_ITERATOR_ORDER) || s->Equal (&AVL_ITERATOR_ORDER_VALUE)) {
+            long index = avl.GetByIndex(p2->Compute()->Value());
+            if (index >= 0) {
+                return s->Equal (&AVL_ITERATOR_ORDER)? (new _FString(*((_String**)avl.dataList->lData)[index],false)): ((_PMathObj)avl.GetXtra (index)->makeDynamic());
+            } else {
+                WarnError ("Index out of bounds in call to AVL iterator (by index)");
+            }
+        }
+
+        DeleteObject (s);
+    } else {
+        WarnError ("Both arguments must be Strings (or a String Literal and a number) in an iterator call for Associative Arrays");
+    }
+    return new _Constant (done);
+}
+
+//_____________________________________________________________________________________________
+_PMathObj _AssociativeList::GetByKey (_String& key, long objType)
+{
+    long        f = avl.Find (&key);
+
+    if (f>=0) {
+        _PMathObj res = (_PMathObj)avl.GetXtra (f);
+        if (res->ObjectClass () == objType) {
+            return res;
+        }
+    }
+
+    return nil;
+}
+
+//_____________________________________________________________________________________________
+_PMathObj _AssociativeList::GetByKey (_String& key)
+{
+    long        f = avl.Find (&key);
+
+    if (f>=0) {
+        return (_PMathObj)avl.GetXtra (f);
+    }
+
+    return nil;
+}
+
+//_____________________________________________________________________________________________
+_PMathObj _AssociativeList::GetByKey (long nKey, long objType)
+{
+    _String key (nKey);
+    return GetByKey (key, objType);
+}
+
+//_____________________________________________________________________________________________
+void _AssociativeList::DeleteByKey (_PMathObj p)
+{
+    if (p->ObjectClass() == STRING) {
+        avl.Delete (((_FString*)p)->theString,true);
+    } else {
+        if (p->ObjectClass() == ASSOCIATIVE_LIST) {
+            _List * keys2remove = ((_AssociativeList*)p)->GetKeys();
+            for (long ki = 0; ki < keys2remove->lLength; ki++) {
+                avl.Delete ((_String*)(*keys2remove)(ki),true);
+            }
+        } else {
+            _String * s = (_String*)p->toStr();
+            avl.Delete (s,true);
+            DeleteObject (s);
+        }
+    }
+}
+
+
+//_____________________________________________________________________________________________
+void _AssociativeList::MStore (_PMathObj p, _PMathObj inObject, bool repl, long opCode)
+{
+    if (!p) {
+        return;
+    }
+
+    _FString * index = (_FString*)p;
+    long       f     = avl.Find (index->theString);
+
+    if (f>=0) { // already exists - replace
+        if (opCode == HY_OP_CODE_ADD) {
+            _PMathObj newObject = ((_PMathObj)avl.GetXtra(f))->Execute (HY_OP_CODE_ADD,inObject);
+            if (repl == false) {
+                DeleteObject (inObject);
+            } else {
+                repl = false;
+            }
+            inObject = newObject;
+        }
+        avl.xtraD.Replace (f, inObject, repl);
+    } else { // insert new
+        if (repl) {
+            BaseRef br = inObject->makeDynamic();
+            avl.Insert (index->theString->makeDynamic(),(long)br,false);
+            //br->nInstances--;
+        } else {
+            avl.Insert (index->theString->makeDynamic(),(long)inObject,false);
+        }
+    }
+}
+
+//_____________________________________________________________________________________________
+void _AssociativeList::MStore (_String obj, _PMathObj inObject, bool repl)
+{
+    _FString f (obj);
+    MStore (&f,inObject, repl);
+}
+
+//_____________________________________________________________________________________________
+void _AssociativeList::MStore (_String obj, _String info)
+{
+    _FString inf (info);
+    MStore (obj, &inf, true);
+}
+
+
+//_____________________________________________________________________________________________
+_String* _AssociativeList::Serialize (_String& avlName)
+{
+    _String * outString = new _String (1024L,true);
+    checkPointer (outString);
+
+    (*outString) << "{";
+    bool        doComma = false;
+    _List * meKeys = GetKeys();
+    for (long k = 0; k < meKeys->lLength; k=k+1) {
+        _String   *thisKey  = (_String*)(*meKeys)(k);
+        if (thisKey) {
+            if (doComma) {
+                (*outString) << ',';
+                (*outString) << '\n';
+            }
+
+            (*outString) << '"';
+            outString->EscapeAndAppend(*thisKey, false);
+            (*outString) << '"';
+
+            _PMathObj anObject = GetByKey (*thisKey);
+
+            (*outString) << ':';
+            if (anObject->ObjectClass() == STRING) {
+                (*outString) << '"';
+                outString->EscapeAndAppend(_String ((_String*)anObject->toStr()),0);
+                (*outString) << '"';
+            } else {
+                (*outString) << _String ((_String*)anObject->toStr());
+            }
+            doComma = true;
+        }
+    }
+    (*outString) << "}";
+    outString->Finalize ();
+    return outString;
+}
+
+
+//__________________________________________________________________________________
+_PMathObj _AssociativeList::Compute (void)
+{
+    return this;
+}
+
+//__________________________________________________________________________________
+_List* _AssociativeList::GetKeys (void)
+{
+    return (_List*)avl.dataList;
+}
+
+//_____________________________________________________________________________________________
+void        _AssociativeList::FillInList (_List& fillMe)
+{
+    _SimpleList  hist;
+    long         ls,
+                 cn = avl.Traverser (hist,ls,avl.GetRoot());
+
+    while (cn >= 0) {
+        _String* aKey = ((_String**)avl.dataList->lData)[cn];
+        if (aKey) {
+            fillMe.AppendNewInstance(avl.GetXtra (cn)->toStr());
+        }
+        cn = avl.Traverser (hist,ls);
+    }
+}
+
+
+//_____________________________________________________________________________________________
+void        _AssociativeList::Merge (_PMathObj p)
+{
+    //SW20111207: I don't think we should ever have to worry about avl traversing 
+    //here as long as the other methods are implemented properly
+
+
+    if(p==this){
+        return;
+    }
+
+    if (p && p->ObjectClass() == ASSOCIATIVE_LIST) {
+
+        _AssociativeList *rhs = (_AssociativeList*) p;
+      
+      if (rhs->avl.countitems()) {
+       
+          _SimpleList  hist;
+          long         ls,
+                       cn = rhs->avl.Traverser (hist,ls,rhs->avl.GetRoot());
+
+
+    
+         /*   SLKP20120111: we need to skip over "blanks" (e.g. resulting from previous delete operations)
+              here; using the traversal of the second list is the easiest way to go. */
+          
+          while (cn >= 0) {
+              MStore(*(_String*)(*(_List*)rhs->avl.dataList)(cn),(_PMathObj)rhs->avl.GetXtra (cn),true);
+              cn = rhs->avl.Traverser (hist,ls);
+          }
+      }
+    }
+    else {
+        WarnError ("Associative list merge operation requires an associative list argument.");
+    }
+}
+
+//_____________________________________________________________________________________________
+_PMathObj        _AssociativeList::Sum (void)
+{
+    _Parameter sum = 0.;
+        
+    _SimpleList  hist;
+    long         ls,
+    cn = avl.Traverser (hist,ls,avl.GetRoot());
+        
+    while (cn >= 0) {
+        _PMathObj value = (_PMathObj)avl.GetXtra (cn);
+        switch (value->ObjectClass()){
+            case NUMBER:
+                sum += ((_Constant*)value)->Value();
+                break;
+            case STRING:
+                sum += ((_FString*)value)->theString->toNum();
+                break;
+            case MATRIX: {
+                _Constant * sumOfValue = (_Constant*) ((_Matrix*)value->Compute())->Sum();
+                sum += sumOfValue->Value();
+                DeleteObject (sumOfValue);
+                break;
+            }
+            case ASSOCIATIVE_LIST: {
+                _Constant * sumOfValue = (_Constant*) ((_AssociativeList*)value->Compute())->Sum();
+                sum += sumOfValue->Value();
+                DeleteObject (sumOfValue);
+                break;
+            }
+        }
+        cn = avl.Traverser (hist,ls);
+    }
+    
+    return new _Constant (sum);
+}
+
+//__________________________________________________________________________________
+
+
+_PMathObj _AssociativeList::Execute (long opCode, _PMathObj p, _PMathObj p2, _hyExecutionContext* context)   // execute this operation with the second arg if necessary
+{
+
+    switch (opCode) {
+    case HY_OP_CODE_ADD: // +
+        if (p){
+            MStore (_String((long)avl.countitems()), p, true);
+            return new _Constant (avl.countitems());
+        } else {
+            return Sum();
+        }
+
+    case HY_OP_CODE_MUL: // merge
+        Merge (p);
+        return new _Constant (avl.countitems());
+
+    case HY_OP_CODE_SUB:
+    case HY_OP_CODE_ABS:
+        if (opCode == HY_OP_CODE_SUB) {
+            DeleteByKey (p);
+        }
+        return new _Constant (avl.countitems());
+        break;
+    case HY_OP_CODE_MACCESS: // MAccess
+        if (p2) {
+            return MIterator (p,p2);
+        } else {
+            return MAccess   (p);
+        }
+        break;
+    case HY_OP_CODE_MCOORD: // MCoord
+        return MCoord (p);
+        break;
+    case HY_OP_CODE_COLUMNS: {
+        // Columns -- get all unique values (as strings) 
+          _List    unique_values_aux;
+          _AVLList unique_values (&unique_values_aux);
+          
+          for (unsigned long k=0UL; k<avl.dataList->lLength; k++) {
+                BaseRef anItem = ((BaseRef*)avl.dataList->lData)[k];
+                if (anItem) {
+                   unique_values.Insert (avl.GetXtra(k)->toStr(), 0L, true);
+                }
+            }
+          unique_values.ReorderList();
+          return new _Matrix (*(_List*)unique_values.dataList);
+          
+          break;
+        }
+    case HY_OP_CODE_ROWS: // Rows - get keys
+        if (avl.emptySlots.lLength) {
+            _List  dataListCompact;
+            for (long k=0; k<avl.dataList->lLength; k++) {
+                BaseRef anItem = ((BaseRef*)avl.dataList->lData)[k];
+                if (anItem) {
+                    dataListCompact << anItem;
+                }
+            }
+            return new _Matrix (dataListCompact);
+        } else {
+            return new _Matrix (*(_List*)avl.dataList);
+        }
+        break;
+    case HY_OP_CODE_TYPE: // Type
+        return Type();
+        break;
+    }
+
+
+    WarnNotDefined (this, opCode, context);
+    return nil;
+
+}
+
+/*--------------------------------------------------------------------------------------------------------------------------------*/
+// Growing Vector
+/*--------------------------------------------------------------------------------------------------------------------------------*/
+
+_GrowingVector::_GrowingVector (bool iscol) : _Matrix (64,1,false,true)
+{
+    used = 0;
+    isColumn = iscol;
+}
+
+/*--------------------------------------------------------------------------------------------------------------------------------*/
+
+BaseRef     _GrowingVector::makeDynamic (void)
+{
+    _GrowingVector * result = (_GrowingVector*)checkPointer(new _GrowingVector);
+    result->_Matrix::Duplicate (this);
+    result->used = used;
+    result->vDim = 1;
+    result->isColumn = isColumn;
+    return result;
+}
+
+/*--------------------------------------------------------------------------------------------------------------------------------*/
+
+long        _GrowingVector::Store (_Parameter toStore)
+{
+    if (used < hDim) {
+        theData[used++] = toStore;  // increment AFTER argument is sent to function
+        return used-1;
+    } else {
+        Resize (used + MAX (used/8,64));    // allocate another block of 64
+        return Store (toStore);
+    }
+}
+
+/*--------------------------------------------------------------------------------------------------------------------------------*/
+
+void        _GrowingVector::operator << (const _SimpleList& theSource)
+{
+    for (long k = 0; k < theSource.lLength; k++) {
+        Store (theSource.lData[k]);
+    }
+}
+
+/*--------------------------------------------------------------------------------------------------------------------------------*/
+
+void        _GrowingVector::Clear (void)
+{
+    _Matrix::Clear();
+    ZeroUsed();
+    vDim = 1;
+}
+
+//_____________________________________________________________________________________________
+void _GrowingVector::Duplicate (BaseRef obj)
+{
+    _Matrix::Duplicate (obj);
+    used = ((_GrowingVector*)obj)->used;
+    isColumn = ((_GrowingVector*)obj)->isColumn;
+}
+
+
+/*--------------------------------------------------------------------------------------------------------------------------------*/
+// _NTupleStorage
+/*--------------------------------------------------------------------------------------------------------------------------------*/
+
+_NTupleStorage::_NTupleStorage (unsigned long N, unsigned long K)
+{
+    storageN        = N;
+    storageK        = (K>N)?MIN(N,1):K;
+    unsigned long   matrixDimension = 1;
+
+    // now compute what dimension of the matrix will be required
+    // handle the special cases first
+
+    if (storageK) { // not just the empty set
+        // populate C_NK_Lookup
+        for (long i2=0; i2<=storageN; i2++) {
+            C_NK_Lookup << 1;    // N choose 0 is always 1 for every N
+        }
+        for (long i=1; i<=storageK; i++) {
+            for (long filler = 0; filler < i; filler++, C_NK_Lookup<<0); // N choose K where K>N is invalid
+            C_NK_Lookup << 1;
+            // K choose K is 1
+            for (long j=i+1; j<=storageN; j=j+1) {
+                // N choose K = N/(N-K) times (N-1) choose K
+                C_NK_Lookup << C_NK_Lookup.lData[C_NK_Lookup.lLength-1] * j/(j-i);
+            }
+        }
+    }
+
+    /*  for (long i=0; i<=storageK; i++)
+        {
+            long offset = i*(storageN+1);
+            for (long j=0; j<=storageN; j++)
+                printf ("(%d,%d) = %d\n", j,i, C_NK_Lookup.lData[offset+j]);
+        }
+    */
+
+    matrixDimension = C_NK_Lookup.lData[C_NK_Lookup.lLength-1];
+    CreateMatrix (this, 1, matrixDimension, false, true);
+}
+
+/*--------------------------------------------------------------------------------------------------------------------------------*/
+
+BaseRef _NTupleStorage::makeDynamic (void)
+{
+    _NTupleStorage* copy = new _NTupleStorage;
+    checkPointer (copy);
+    copy->_Matrix::Duplicate (this);
+    copy->storageN = storageN;
+    copy->storageK = storageK;
+    copy->C_NK_Lookup.Duplicate (&C_NK_Lookup);
+    return copy;
+}
+
+/*--------------------------------------------------------------------------------------------------------------------------------*/
+
+bool    _NTupleStorage::CheckKTuple (_SimpleList& kTuple)
+{
+    if (kTuple.lLength == storageK) {
+        if (storageK) {
+            kTuple.Sort();
+            for (long k=0; k<kTuple.lLength; k++)
+                if (kTuple.lData[k] < 0 || kTuple.lData[k] >= storageN || (k && kTuple.lData[k] == kTuple.lData[k-1])) {
+                    return false;
+                }
+        }
+        return true;
+    }
+    return false;
+}
+
+
+/*--------------------------------------------------------------------------------------------------------------------------------*/
+
+unsigned long   _NTupleStorage::Index (_SimpleList& kTuple)
+{
+    unsigned long myIndex = 0;
+    if (storageK)
+        for (long k=kTuple.lLength-1; k >=0; k--) {
+            myIndex += C_NK_Lookup.lData[(k+1)*(1+storageN) + kTuple.lData[k]];
+        }
+    return myIndex;
+}
+
+/*--------------------------------------------------------------------------------------------------------------------------------*/
+
+_Parameter  _NTupleStorage::DirectIndex (unsigned long directIndex)
+{
+    return theData[directIndex];
+}
+
+/*--------------------------------------------------------------------------------------------------------------------------------*/
+
+unsigned long   _NTupleStorage::Store (_Parameter value, _SimpleList& kTuple)
+{
+    unsigned long myIndex = Index (kTuple);
+    theData[myIndex] = value;
+    return myIndex;
+}
+
+/*--------------------------------------------------------------------------------------------------------------------------------*/
+
+_Parameter  _NTupleStorage::Retrieve (_SimpleList& kTuple)
+{
+    unsigned long myIndex = Index (kTuple);
+    return theData[myIndex];
+}
+
+/*--------------------------------------------------------------------------------------------------------------------------------*/
+
+void    _NTupleStorage::IndexToTuple (unsigned long directIndex, _SimpleList& kTuple)
+{
+    kTuple.Clear();
+    if (storageK && directIndex < C_NK_Lookup.lData[C_NK_Lookup.lLength-1]) {
+        long currentN = storageN-1;
+        for (long k=storageK; k > 0; k--) {
+            long  i             = currentN,
+                  lookup_offset = k*(storageN+1);
+
+            while (C_NK_Lookup.lData[lookup_offset+i] > directIndex) {
+                //printf ("(%d, %d) -> %d\n", k, i, C_NK_Lookup.lData[lookup_offset+i]);
+                i--;
+            }
+            //printf ("(%d, %d) -> %d\n", k, i, C_NK_Lookup.lData[lookup_offset+i]);
+            kTuple << i;
+            //printf ("Stored %d\n", i);
+
+            currentN     = i-1;
+            directIndex -= C_NK_Lookup.lData[lookup_offset+i];
+        }
+    }
+    kTuple.Flip();
+}
+
diff --git a/src/core/nexus.cpp b/src/core/nexus.cpp
new file mode 100644
index 0000000..e342482
--- /dev/null
+++ b/src/core/nexus.cpp
@@ -0,0 +1,1413 @@
+/*
+
+HyPhy - Hypothesis Testing Using Phylogenies.
+
+Copyright (C) 1997-2009
+  Sergei L Kosakovsky Pond (spond at ucsd.edu)
+  Art FY Poon              (apoon at cfenet.ubc.ca)
+
+Permission is hereby granted, free of charge, to any person obtaining a
+copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be included
+in all copies or substantial portions of the Software.
+
+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.
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+*/
+#include "site.h"
+#include "string.h"
+#include "ctype.h"
+#include "stdlib.h"
+#include "list.h"
+#include "batchlan.h"
+
+#include "math.h"
+#ifdef    __HYPHYDMALLOC__
+#include "dmalloc.h"
+#endif
+//_________________________________________________________
+
+_DataSet* lastNexusDataMatrix = nil;
+_String   nexusBFBody;
+
+
+void    checkTTStatus               (FileState* fs);
+void    processCommand              (_String*s, FileState*fs);
+void    FilterRawString             (_String& s, FileState* fs, _DataSet & ds);
+long    ProcessLine                 (_String&s , FileState *fs, _DataSet& ds);
+void    PadLine                     (FileState& fState, _DataSet& result);
+void    ISelector                   (FileState& fState, _String& CurrentLine, _DataSet& result);
+bool    SkipLine                    (_String& theLine, FileState* fS);
+void    TrimPhylipLine              (_String& CurrentLine, _DataSet& ds);
+void    ReadNexusFile               (FileState& fState, FILE*f, _DataSet& result);
+bool    ProcessNexusData            (FileState&, long,  FILE*, _String&, _DataSet&);
+void    ProcessNexusHYPHY           (FileState&, long,  FILE*, _String&, _DataSet&);
+void    ProcessNexusAssumptions     (FileState&, long,  FILE*, _String&, _DataSet&);
+void    ProcessNexusTaxa            (FileState&,long, FILE*, _String&, _DataSet&);
+void    ProcessNexusTrees           (FileState&, long, FILE*, _String&, _DataSet&);
+bool    FindNextNexusToken          (FileState& fState, FILE* f, _String& CurrentLine, long pos);
+bool    SkipUntilNexusBlockEnd      (FileState& fState, FILE* f, _String& CurrentLine, long pos);
+bool    ReadNextNexusStatement      (FileState&, FILE* , _String&, long, _String&, bool, bool = true, bool = true, bool = false, bool = false, bool = false);
+long    ReadNextNexusEquate         (FileState&, FILE* , _String&, long, _String&, bool = false, bool = true);
+void    NexusParseEqualStatement    (_String&);
+
+
+//_________________________________________________________
+
+bool    FindNextNexusToken (FileState& fState, FILE* f, _String& CurrentLine, long pos)
+{
+    pos = CurrentLine.FirstNonSpaceIndex (pos,-1,1);
+    if (pos==-1) {
+        ReadNextLine(f,&CurrentLine,&fState,false);
+        pos = CurrentLine.FirstNonSpaceIndex (0,-1,1);
+        if (pos==-1) {
+            return false;
+        }
+    }
+    CurrentLine.Trim (pos, -1);
+    return true;
+}
+
+
+//_________________________________________________________
+
+bool    SkipUntilNexusBlockEnd (FileState& fState, FILE* file, _String& CurrentLine, long pos)
+{
+    static _String endMark ("END");
+    pos = CurrentLine.Find (endMark,pos+1,-1);
+    while (pos<0) {
+        ReadNextLine(file,&CurrentLine,&fState,false);
+        if (!CurrentLine.sLength) {
+            return false;
+        }
+        pos = CurrentLine.Find (endMark,0,-1);
+        if (pos>=0) {
+            pos = CurrentLine.Find (';',pos+endMark.sLength,-1);
+            if (pos>=0) {
+                CurrentLine.Trim (pos+endMark.sLength, -1);
+                if (!CurrentLine.sLength) {
+                    ReadNextLine(file,&CurrentLine,&fState,false);
+                }
+            } else {
+                _String errMsg ("Found END w/o a trailing semicolon. Assuming end of block and skipping the rest of the line.");
+                ReportWarning (errMsg);
+                ReadNextLine(file,&CurrentLine,&fState,false);
+            }
+            return true;
+        }
+    }
+    return false;
+}
+//_________________________________________________________
+void    NexusParseEqualStatement (_String& source)
+{
+    long f = source.Find('=');
+    if (f>=0) {
+        f = source.FirstNonSpaceIndex (f+1,-1);
+        if (f>=0) {
+            source.Trim (f,-1);
+            return;
+        }
+    }
+    source = "";
+
+}
+//_________________________________________________________
+
+bool ReadNextNexusStatement (FileState& fState, FILE* f, _String& CurrentLine, long pos, _String& blank, bool stopOnSpace, bool stopOnComma, bool stopOnQuote, bool NLonly, bool preserveSpaces, bool preserveQuotes)
+{
+    bool done          = false,
+         insideLiteral = false,
+         startedReading = false;
+
+    long newPos = pos>0?pos+1:pos;
+    char c;
+
+    while (1) {
+        while (newPos<CurrentLine.sLength) {
+            c = CurrentLine.sData[newPos];
+            if (isspace(c)) {
+                if (stopOnSpace && startedReading && (!insideLiteral) && (!NLonly || (NLonly && (c==10 || c==13)))) {
+                    done = true;
+                    break;
+                } else {
+                    if (insideLiteral||preserveSpaces) {
+                        blank<<' ';
+                    }
+                }
+            } else {
+                if (c==';' && ! insideLiteral) { // terminate always
+                    done = true;
+                    newPos++;
+                    break;
+                } else if (stopOnComma && c==',' && ! insideLiteral) {
+                    done = true;
+                    newPos++;
+                    break;
+                } else if (! preserveQuotes && (c=='\'' || c=='"') ) {
+                    if (c=='\'') {
+                        if (newPos+1<CurrentLine.sLength)
+                            // check for a double quote
+                        {
+                            c = CurrentLine.sData[newPos+1];
+                            if (c=='\'') {
+                                newPos += 2;
+                                blank<<c;
+                                continue;
+                            }
+                            //else
+                            //  if (!startedReading || insideLiteral)
+                            //      newPos--;
+                        }
+                    }
+                    if (startedReading &&stopOnQuote) {
+                        done = true;
+                        newPos++;
+                        break;
+                    } else {
+                        insideLiteral = !insideLiteral;
+                    }
+                } else {
+                    startedReading = true;
+                    blank<<c;
+                }
+            }
+            newPos++;
+        }
+        if (!done) {
+            if (NLonly&&(blank.FirstNonSpaceIndex(0,-1,1)>=0)) {
+                break;
+            }
+            ReadNextLine(f,&CurrentLine,&fState,false);
+            newPos = 0;
+            if (!CurrentLine.sLength) {
+                c=';';
+                break;
+            }
+        } else {
+            break;
+        }
+
+    }
+    blank.Finalize();
+    blank.UpCase();
+    if (newPos<CurrentLine.sLength) {
+        CurrentLine.Trim (newPos,-1);
+    } else {
+        CurrentLine = "";
+    }
+    return c==';';
+}
+
+//_________________________________________________________
+
+long    ReadNextNexusEquate (FileState& fState, FILE* f, _String& CurrentLine, long pos2, _String& blank, bool resetP, bool demandSemicolon)
+{
+    long pos = blank.Find ('=',pos2,-1), res;
+    if (pos>=0) {
+        if (pos<blank.sLength-1) {
+            blank.Trim (pos+1,-1);
+            return 1;
+        } else {
+            _String blank2 ((unsigned long)10, true);
+            res = ReadNextNexusStatement (fState, f, CurrentLine, resetP?0:pos, blank2, true, true, false,false,false);
+            if (blank2.sLength) {
+                blank = blank2;
+                return res?2:1;
+            }
+        }
+        return 0;
+    } else {
+        _String blank2 ((unsigned long)10, true);
+        res = ReadNextNexusStatement (fState, f, CurrentLine, pos2, blank2, true, true, false,false,false)?2:1;
+        if (res!=2 && demandSemicolon) {
+            if((res=ReadNextNexusEquate (fState, f, CurrentLine, 0, blank2))) {
+                blank = blank2;
+                return res;
+            }
+        } else if((res = ReadNextNexusEquate (fState, f, CurrentLine, 0, blank2, resetP, false))) {
+            blank = blank2;
+            return res;
+        } else {
+            return 0;
+        }
+    }
+    return 0;
+}
+
+//_________________________________________________________
+void    ProcessNexusTaxa (FileState& fState, long pos, FILE*f, _String& CurrentLine, _DataSet& result)
+{
+    _String key1 = "DIMENSIONS", key2 = "NTAX", key3 = "TAXLABELS", keyEnd = "END";
+
+    bool    done = false;
+
+    long    speciesExpected = -1, offset;
+
+    while (!done) {
+        if (!FindNextNexusToken (fState, f, CurrentLine, pos)) {
+            break;
+        }
+        // now that we've got stuff to work with see what it is
+
+        if (CurrentLine.beginswith (keyEnd, false)) {
+            pos = -1;
+            break;
+        }
+
+        if (CurrentLine.beginswith (key1, false)) {
+            if (result.GetNames().lLength) { // check the number of dimensions
+                // some data already present
+                key1 = "Only one taxa definition per NEXUS file is recognized, the others will be ignored.";
+                ReportWarning (key1);
+                SkipUntilNexusBlockEnd (fState, f,CurrentLine, pos);
+                break;
+            } else {
+                _String blank ((unsigned long)10, true);
+                ReadNextNexusStatement (fState, f, CurrentLine, key1.sLength, blank, false,true, true,false,false);
+                // this will actually return '= number'
+                NexusParseEqualStatement (blank);
+                speciesExpected = blank.toNum();
+            }
+        } else if (CurrentLine.beginswith (key3, false)) {
+            if (speciesExpected == -1) {
+                key1 = "TAXLABELS must be preceded by a valid NTAX statement. Skipping the entire TAXA block.";
+                ReportWarning (key1);
+                SkipUntilNexusBlockEnd (fState, f,CurrentLine, pos);
+                break;
+            } else {
+                offset = key3.sLength;
+                do {
+                    _String blank ((unsigned long)10, true);
+                    if (ReadNextNexusStatement (fState, f, CurrentLine,offset, blank, true,true,true,false,false)) {
+                        if (blank.sLength) {
+                            result.GetNames()&& & blank;
+                        }
+                        break;
+                    } else {
+                        if (blank.sLength) {
+                            result.GetNames()&& & blank;
+                        }
+                    }
+                    offset = 0;
+
+                } while (1);
+                if (result.GetNames().lLength!=speciesExpected) {
+                    key1 = "TAXALABELS provided ";
+                    key1 = key1& _String ((long)result.GetNames().lLength) &" species, whereas the NTAX statement promised:";
+                    key1 = key1& _String (speciesExpected) & ". HYPHY will use TAXALABELS count.";
+                    ReportWarning (key1);
+                }
+                done = true;
+            }
+        } else {
+            long offSet;
+
+            _String errMsg = CurrentLine.Cut (0, offSet = CurrentLine.FirstSpaceIndex(1,-1)) & " is not used by HYPHY";
+            ReportWarning (errMsg);
+            while (!done) {
+                _String blank ((unsigned long)10, true);
+                done = ReadNextNexusStatement (fState, f, CurrentLine, offSet, blank, false, false,true,false,false);
+            }
+            done = false;
+        }
+
+        if (!done) {
+            pos = 0;
+        }
+
+        //if (!done)
+        //{
+        //  ReadNextLine(f,&CurrentLine,&fState,false);
+        //}
+    }
+
+    SkipUntilNexusBlockEnd (fState, f,CurrentLine, pos);
+}
+
+//_________________________________________________________
+
+void    ProcessNexusAssumptions (FileState& fState, long pos, FILE*f, _String& CurrentLine, _DataSet&)
+{
+    _String key1 = "CHARSET", keyEnd = "END",
+            errMsg;
+
+    bool    done = false;
+
+    _List   charSetIDs,
+            charSetSpec;
+
+    while (!done) {
+        if (!FindNextNexusToken (fState, f, CurrentLine, pos)) {
+            break;
+        }
+        // now that we've got stuff to work with see what it is
+
+        if (CurrentLine.beginswith (keyEnd, false)) {
+            pos = -1;
+            break;
+        }
+
+        if (CurrentLine.beginswith (key1, false)) { // actual tree strings & idents
+            _String blank ((unsigned long)10, true);
+            if (!ReadNextNexusStatement (fState, f, CurrentLine, key1.sLength, blank, false, false, false,false,true)) {
+                errMsg = _String("CHARSET construct not followed by ';'.");
+                ReportWarning (errMsg);
+                done = true;
+                break;
+            } else {
+                pos = blank.Find ('=',1,-1);
+                if (pos==-1) {
+                    errMsg = blank&": is not of the form Charset ID = specification of the partition.";
+                    ReportWarning (errMsg);
+                } else {
+                    long pos2 = blank.FirstNonSpaceIndex (0,pos-1,-1);
+                    if (pos2>=0) {
+                        long j = blank.FirstNonSpaceIndex (0,pos2-1,1);
+                        if (j>=0) {
+                            if (blank.sData[j]=='*') {
+                                j = blank.FirstNonSpaceIndex (j+1,pos2-1,1);
+                            }
+
+                            if (j>=0) {
+                                _String CharSetID (blank.Cut (j,pos2));
+
+                                if (!CharSetID.IsValidIdentifier()) {
+                                    _String dummy;
+                                    errMsg = CharSetID & " is not a valid data filter identifier in HYPHY. Replacing with: ";
+                                    CharSetID.ConvertToAnIdent();
+                                    FindUnusedObjectName (dummy,CharSetID, dataSetFilterNamesList, true);
+                                    FindUnusedObjectName (dummy,CharSetID,charSetIDs, false);
+                                    errMsg = errMsg &  CharSetID;
+                                    ReportWarning (errMsg);
+                                } else {
+                                    _String dummy;
+                                    FindUnusedObjectName (dummy,CharSetID, dataSetFilterNamesList, true);
+                                    FindUnusedObjectName (dummy,CharSetID,charSetIDs, false);
+                                }
+
+                                //  now get the rest of the tree string
+                                pos2 = blank.FirstNonSpaceIndex(pos+1,-1);
+                                pos  = blank.FirstNonSpaceIndex(pos2,-1,-1);
+                                blank.Trim (pos2,pos);
+                                blank.CompressSpaces ();
+                                blank = blank & " ";
+
+                                _String hpSpec (blank.sLength+1, true),
+                                        numberOne,
+                                        numberTwo,
+                                        numberThree;
+
+                                bool    spoolInto2nd = false,
+                                        spoolInto3rd = false,
+                                        hitASpace    = false,
+                                        okFlag         = true,
+                                        firstFlag  = true;
+
+                                for (long k=0; k<blank.sLength; k++) {
+                                    char ch = blank.sData[k];
+
+                                    if ((ch>='0' && ch<='9') || ch=='.') {
+                                        if (spoolInto2nd) {
+                                            numberTwo = numberTwo & ch;
+                                        } else if (spoolInto3rd) {
+                                            numberThree = numberThree & ch;
+                                        } else {
+                                            numberOne = numberOne & ch;
+                                        }
+                                        hitASpace = false;
+                                    }
+
+                                    if (ch==' ') {
+                                        if (numberTwo.sLength == 1 && numberTwo.sData[0] == '.') {
+                                            numberTwo = (long)fState.totalSitesRead;
+                                        }
+
+                                        if (spoolInto3rd) {
+                                            spoolInto3rd = false;
+                                            // handle 'every' n-th
+                                            //if (!firstFlag)
+                                            //hpSpec << ',';
+
+
+                                            long    from = numberOne.toNum()-1,
+                                                    upto = numberTwo.toNum()-1,
+                                                    step = numberThree.toNum();
+
+                                            if ((upto>=from)&&(step>0)) {
+                                                if (!firstFlag) {
+                                                    hpSpec << ',';
+                                                }
+                                                hpSpec << _String(from);
+                                                for (long kk = from+step; kk<=upto; kk+=step) {
+                                                    hpSpec << ',';
+                                                    hpSpec << (_String)(kk);
+                                                }
+
+                                                numberOne   = empty;
+                                                numberTwo   = empty;
+                                                numberThree = empty;
+                                            } else {
+                                                errMsg = _String("Invalid from-to\\step specification: ") & blank.Cut (0,k) & " <=? " & blank.Cut (k+1,-1);
+                                                ReportWarning (errMsg);
+                                                okFlag = false;
+                                                break;
+                                            }
+
+                                            firstFlag = false;
+                                        } else {
+                                            if (spoolInto2nd) {
+                                                spoolInto2nd = false;
+                                                if (!firstFlag) {
+                                                    hpSpec << ',';
+                                                }
+
+                                                numberOne = numberOne.toNum()-1;
+                                                hpSpec << numberOne;
+                                                numberOne = ch;
+                                                hpSpec << '-';
+                                                numberTwo = numberTwo.toNum()-1;
+                                                hpSpec << numberTwo;
+                                                numberTwo = empty;
+                                                firstFlag = false;
+
+                                            } else {
+                                                if (numberOne.sLength && numberOne.toNum() > 0) {
+                                                    numberOne = numberOne.toNum()-1;
+                                                    if (!firstFlag) {
+                                                        hpSpec << ',';
+                                                    }
+                                                    hpSpec << numberOne;
+                                                }
+                                                numberOne = empty;
+                                                firstFlag = false;
+                                            }
+                                        }
+                                        //hitASpace = true;
+                                        hitASpace = false;
+                                    } else if (ch=='-') {
+                                        if (spoolInto2nd||spoolInto3rd) {
+                                            errMsg = _String("Misplaced '-' in CHARSET specification: ") & blank.Cut (0,k) & " <=? " & blank.Cut (k+1,-1);
+                                            ReportWarning (errMsg);
+                                            okFlag = false;
+                                            break;
+                                        }
+                                        spoolInto2nd = true;
+                                    } else if (ch=='\\') {
+                                        if ((!spoolInto2nd)||spoolInto3rd) {
+                                            errMsg = _String("Misplaced '\\' in CHARSET specification: ") & blank;
+                                            ReportWarning (errMsg);
+                                            okFlag = false;
+                                            break;
+                                        }
+                                        spoolInto2nd = false;
+                                        spoolInto3rd = true;
+                                    }
+                                }
+
+                                hpSpec.Finalize();
+
+                                if (okFlag) {
+                                    charSetIDs && & CharSetID;
+                                    charSetSpec && & hpSpec;
+                                }
+                            }
+                        }
+                        if (j<0) {
+                            errMsg = _String("Could not find a charset identifier in:")␣
+                            ReportWarning (errMsg);
+                        }
+                    } else {
+                        errMsg = blank&" is not of the form CharSetID = char set string";
+                        ReportWarning (errMsg);
+                    }
+                }
+            }
+        } else {
+            long offSet;
+
+            _String errMsg = CurrentLine.Cut (0, offSet = CurrentLine.FirstSpaceIndex(1,-1)) & " is not used by HYPHY";
+            ReportWarning (errMsg);
+            while (!done) {
+                _String blank ((unsigned long)10, true);
+                done = ReadNextNexusStatement (fState, f, CurrentLine, offSet, blank, false, false,true,false,false);
+            }
+            done = false;
+        }
+
+        if (!done) {
+            //ReadNextLine(f,&CurrentLine,&fState,false);
+            pos = 0;
+        }
+    }
+
+    if (charSetIDs.lLength) {
+        _String defineCharsets (128L, true);
+
+        defineCharsets << dataFilePartitionMatrix;
+        defineCharsets << "={2,";
+        defineCharsets << _String ((long)charSetIDs.lLength);
+        defineCharsets << "};\n";
+
+        for (long id = 0; id < charSetIDs.lLength; id++) {
+            defineCharsets << dataFilePartitionMatrix;
+            defineCharsets << "[0][";
+            defineCharsets << _String (id);
+            defineCharsets << "]:=\"";
+            defineCharsets << (_String*)charSetIDs(id);
+            defineCharsets << "\";\n";
+            defineCharsets << dataFilePartitionMatrix;
+            defineCharsets << "[1][";
+            defineCharsets << _String (id);
+            defineCharsets << "]:=\"";
+            defineCharsets << (_String*)charSetSpec(id);
+            defineCharsets << "\";\n";
+        }
+        defineCharsets.Finalize();
+        _ExecutionList defMx (defineCharsets);
+        defMx.Execute();
+        terminateExecution = false;
+    }
+
+    SkipUntilNexusBlockEnd (fState, f,CurrentLine, pos);
+}
+
+//_________________________________________________________
+
+void    ProcessNexusTrees (FileState& fState, long pos, FILE*f, _String& CurrentLine, _DataSet& result)
+{
+    _String key1 = "TRANSLATE", key2 = "TREE", errMsg, keyEnd = "END";
+
+    bool    done = false, readResult, good;
+    _List   translationsFrom, translationsTo;
+    _List   treeIdents, treeStrings;
+    long    treeSelected = 0, insertPos = 0;
+
+    while (!done) {
+        if (!FindNextNexusToken (fState, f, CurrentLine, pos)) {
+            break;
+        }
+        // now that we've got stuff to work with see what it is
+
+        if (CurrentLine.beginswith (keyEnd, false)) {
+            pos = -1;
+            break;
+        }
+
+        if (CurrentLine.beginswith (key1, false)) {
+            // set up translations between nodes and data labels
+            long offset = key1.sLength;
+            do {
+                _String blank ((unsigned long)10, true);
+                readResult = ReadNextNexusStatement (fState, f, CurrentLine, offset, blank, true, true,true,false,false);
+                if (blank.sLength) {
+                    if (translationsTo.lLength<translationsFrom.lLength) {
+                        good = (result.GetNames().Find(&blank)>=0);
+                        if (good) {
+                            translationsTo.InsertElement (&blank, insertPos);
+                        } else {
+                            errMsg = blank & " is not a valid taxon name for TRANSLATE";
+                            ReportWarning (errMsg);
+                            translationsFrom.Delete (insertPos);
+                        }
+
+                    } else {
+                        if (!readResult) {
+                            //translationsFrom && & blank;
+                            insertPos = translationsFrom.BinaryInsert (&blank);
+                        }
+                    }
+                }
+                if (readResult) {
+                    break;
+                }
+                if  ((f&&feof(f))||(fState.theSource&&(fState.theSource->sLength<=fState.pInSrc))) {
+                    break;
+                }
+                offset = 0;
+
+            } while (1);
+        } else if (CurrentLine.beginswith (key2, false)) { // actual tree strings & idents
+            _String blank ((unsigned long)10, true);
+            if (!ReadNextNexusStatement (fState, f, CurrentLine, key2.sLength, blank, false, false, false,false,false, true)) {
+                errMsg = _String("TREE construct not followed by ';'.");
+                ReportWarning (errMsg);
+                done = true;
+                break;
+            } else {
+                // here goes the tree string in the form: treeID = treeString
+                // pull the ID out first - check if it is a valid one
+                // next crudely parse the tree string, extracting species names and
+                pos = blank.Find ('=',1,-1);
+                if (pos==-1) {
+                    errMsg = blank&": is not of the form Tree Name = Tree String";
+                    ReportWarning (errMsg);
+                } else {
+                    long pos2 = blank.FirstNonSpaceIndex (0,pos-1,-1);
+                    if (pos2>=0) {
+                        long j = blank.FirstNonSpaceIndex (0,pos2-1,1);
+                        if (j>=0) {
+                            if (blank.sData[j]=='*') {
+                                j = blank.FirstNonSpaceIndex (j+1,pos2-1,1);
+                                treeSelected = treeIdents.lLength;
+                            }
+                            if (j>=0) {
+                                _String TreeID (blank.Cut (j,pos2));
+
+                                if (!TreeID.IsValidIdentifier()) {
+                                    _String dummy;
+                                    errMsg = TreeID & " is not a valid variable (tree) identifier in HYPHY. Replacing with: ";
+                                    TreeID = "Tree";
+                                    FindUnusedObjectName (dummy, TreeID, variableNames, true);
+                                    FindUnusedObjectName (dummy, TreeID, treeIdents, true);
+                                    errMsg = errMsg & TreeID;
+                                    ReportWarning (errMsg);
+                                } else {
+                                    _String dummy;
+                                    FindUnusedObjectName (dummy, TreeID, variableNames, true);
+                                    FindUnusedObjectName (dummy, TreeID, treeIdents, true);
+                                }
+
+                                treeIdents && & TreeID;
+                                //  now get the rest of the tree string
+                                pos2 = blank.FirstNonSpaceIndex(pos+1,-1);
+                                blank.Trim (pos2,-1);
+                                treeStrings && & blank;
+                            }
+                        }
+                        if (j<0) {
+                            errMsg = _String("Could not find a tree identifier in:")␣
+                            ReportWarning (errMsg);
+                        }
+                    } else {
+                        errMsg = blank&" is not of the form TreeID = TreeString";
+                        ReportWarning (errMsg);
+                    }
+                }
+
+            }
+        } else {
+
+            long offSet = 0;
+
+            _String errMsg = CurrentLine.Cut (0,CurrentLine.FirstSpaceIndex(1,-1)) & " is not used by HYPHY in TREES block";
+            ReportWarning (errMsg);
+            while (!done) {
+                _String blank ((unsigned long)10, true);
+                done = ReadNextNexusStatement (fState, f, CurrentLine, offSet, blank, false, false,true,false,false);
+            }
+            done = false;
+        }
+
+        if (!done) {
+            //ReadNextLine(f,&CurrentLine,&fState,false);
+            pos = 0;
+        }
+    }
+
+    // now we shall check the string and match up node names with those present in the file
+
+    for (long id = 0; id<treeStrings.lLength; id++) {
+        key1 = *((_String*)treeStrings.lData[id]);
+        long    treeLevel = 0, lastNode, i;
+        _String revisedTreeString ((unsigned long)10, true);
+        char    c;
+        for (i=0; i<key1.sLength; i++) {
+            switch (key1.sData[i]) {
+            case '(': { // creating a new internal node one level down
+                treeLevel++;
+                revisedTreeString<<'(';
+                break;
+            }
+
+            case ',':
+            case ')': { // creating a new node on the same level and finishes updating the list of parameters
+                if (key1.sData[i]==')') { // also create a new node on the same level
+                    treeLevel--;
+                }
+                revisedTreeString<<key1.sData[i];
+                break;
+            }
+
+            case ':' : { // tree branch definition
+                lastNode = i+1;
+                revisedTreeString<<':';
+                c = key1.sData[lastNode];
+                while (((c<='9')&&(c>='0'))||(c=='.')||(c=='-')||(c=='e')||(c=='E')) {
+                    if (lastNode<key1.sLength) {
+                        lastNode++;
+                        revisedTreeString<<c;
+                        c = key1.sData[lastNode];
+                    } else {
+                        break;
+                    }
+                }
+                i = lastNode-1;
+                break;
+            }
+
+            default: { // node name
+                lastNode = i;
+                c = key1.sData[lastNode];
+                if (isspace (c)) {
+                    break;
+                }
+                if (!(isalnum(c)||(c=='_'))) {
+                    errMsg = ((_String("Node names should begin with a letter, a number, or an underscore")&key1.Cut(0,i)&"?"&key1.Cut(i+1,-1)));
+                    ReportWarning (errMsg);
+                    i = key1.sLength+2;
+                    break;
+                }
+                while (isalnum(c)||(c=='_')) {
+                    if (lastNode<key1.Length()) {
+                        lastNode++;
+                        c = key1.sData[lastNode];
+                    } else {
+                        break;
+                    }
+                }
+                key2 = key1.Cut(i,lastNode-1);
+                i = lastNode-1;
+                lastNode = translationsFrom.BinaryFind (&key2);
+                if (lastNode>=0) {
+                    revisedTreeString<< (_String*)translationsTo.lData[lastNode];
+                } else {
+                    revisedTreeString<< &key2;
+                }
+                break;
+            }
+            }
+        }
+        revisedTreeString.Finalize();
+        if (treeLevel) {
+            errMsg = _String("Unbalanced '(,)' in the tree string:") & revisedTreeString;
+            ReportWarning (errMsg);
+        } else if (i==key1.sLength) {
+            ((_String*)treeStrings.lData[id])->DuplicateErasing(&revisedTreeString);
+        }
+    }
+
+    if (treeSelected < treeStrings.lLength) {
+        setParameter (dataFileTree,1.0,fState.theNamespace);
+        setParameter (dataFileTreeString, new _FString((*(_String*)treeStrings.lData[treeSelected])),fState.theNamespace);
+    }
+
+    if (treeStrings.lLength) {
+        _String initTreeMatrix (1024L, true);
+
+        initTreeMatrix << nexusFileTreeMatrix;
+        initTreeMatrix << "={";
+        initTreeMatrix << _String ((long)treeStrings.lLength);
+        initTreeMatrix << ",2};\n";
+
+
+        for (long id = 0; id < treeStrings.lLength; id++) {
+            initTreeMatrix << nexusFileTreeMatrix;
+            initTreeMatrix << '[';
+            initTreeMatrix << _String (id);
+            initTreeMatrix << "][0]=\"";
+            initTreeMatrix << (_String*)treeIdents(id);
+            initTreeMatrix << "\";\n";
+            initTreeMatrix << nexusFileTreeMatrix;
+            initTreeMatrix << '[';
+            initTreeMatrix << _String (id);
+            initTreeMatrix << "][1]=\"";
+            initTreeMatrix << (_String*)treeStrings(id);
+            initTreeMatrix << "\";\n";
+        }
+        initTreeMatrix.Finalize();
+
+        _ExecutionList el (initTreeMatrix);
+        el.Execute();
+        terminateExecution = false;
+    }
+    SkipUntilNexusBlockEnd (fState, f,CurrentLine, pos);
+}
+
+//_________________________________________________________
+
+void    ProcessNexusHYPHY (FileState& fState, long pos, FILE*file, _String& CurrentLine, _DataSet&)
+{
+    _String endMark ("END;"),
+            bfBody  (128L,true);
+
+    long      p2 = pos;
+    pos = CurrentLine.FindAnyCase (endMark,pos+1,-1);
+
+    fState.fileType = 0;
+
+    if (pos>=0) {
+        bfBody << CurrentLine.Cut (p2,pos-1);
+        CurrentLine.Trim(pos+endMark.sLength,-1);
+    } else {
+        bfBody << CurrentLine.Cut (p2,-1);
+        while (pos<0) {
+            ReadNextLine(file,&CurrentLine,&fState,false,false);
+            if (!CurrentLine.sLength) {
+                break;
+            }
+
+            pos = CurrentLine.FindAnyCase (endMark,0,-1);
+            if (pos>=0) {
+                if (pos>0) {
+                    bfBody << CurrentLine.Cut (0,pos-1);
+                }
+
+                CurrentLine.Trim (pos+endMark.sLength, -1);
+                if (!CurrentLine.sLength) {
+                    ReadNextLine(file,&CurrentLine,&fState,false,false);
+                }
+
+                break;
+            } else {
+                bfBody << CurrentLine;
+            }
+
+        }
+    }
+    bfBody.Finalize();
+
+    nexusBFBody = bfBody;
+
+    fState.fileType = 3;
+
+    CurrentLine.UpCase();
+
+}
+
+//_________________________________________________________
+
+bool    ProcessNexusData (FileState& fState, long pos, FILE*f, _String& CurrentLine, _DataSet& result)
+{
+    _String key1 ("DIMENSIONS"), key11 ("NTAX"), key12 ("NCHAR"),
+            key2 ("FORMAT"),key21 ("DATATYPE"), key22 ("MISSING"), key23 ("GAP"), key24 ("SYMBOLS"),
+            key25 ("EQUATE"), key26 ("MATCHCHAR"), key27 ("NOLABELS"), key28 ("INTERLEAVE"), key3 ("MATRIX"), keyEnd ("END"),
+            errMsg, newAlph;
+
+    bool    done = false,
+            labels = true;
+
+    char    charState = 0;
+
+    _List   translations;
+    char    missing = '?', gap = '-' , repeat = '.', charSwitcher;
+
+    long    offSet, count, spExp = result.GetNames().lLength, sitesExp = 0;
+
+    while (!done) {
+        if (!FindNextNexusToken (fState, f, CurrentLine, pos)) {
+            break;
+        }
+
+        if (CurrentLine.beginswith (keyEnd, false)) {
+            pos = -1;
+            break;
+        }
+
+        if (CurrentLine.beginswith (key1, false)) {
+            offSet = key1.sLength;
+            while (!done) {
+                _String blank ((unsigned long)10, true);
+                done = ReadNextNexusStatement (fState, f, CurrentLine, offSet, blank, true, true,true,false,false);
+
+                if (blank.beginswith(key11, false)) {
+                    if (result.GetNames().lLength) {
+                        errMsg = "NTAX will override the definition of taxa names from the TAXA block";
+                        ReportWarning (errMsg);
+                    }
+                    if (!(count=ReadNextNexusEquate (fState,f,CurrentLine, 0 ,blank))) {
+                        errMsg = "NTAX is not followed by '= number-of-taxa'";
+                        ReportWarning (errMsg);
+                        done = true;
+                    } else {
+                        done = done||(count>1);
+                        spExp = blank.toNum();
+                        if(spExp<=0) {
+                            errMsg = "NTAX must be a positive number";
+                            ReportWarning (errMsg);
+                            done = true;
+                            spExp = result.GetNames().lLength?result.GetNames().lLength:1;
+                        }
+                    }
+                } else if (blank.beginswith(key12, false)) {
+                    if (!(count=ReadNextNexusEquate (fState,f,CurrentLine, 0 ,blank))) {
+                        errMsg = "NCHAR is not followed by '= number-of-charaters'";
+                        ReportWarning (errMsg);
+                        done = true;
+                    } else {
+                        done = done||(count>1);
+                        sitesExp = blank.toNum();
+                    }
+                }
+                offSet = 0;
+            }
+            done = false;
+        } else if (CurrentLine.beginswith (key2, false)) { // format instruction
+            offSet = key2.sLength;
+            while (!done) {
+                charSwitcher = 0;
+                _String blank ((unsigned long)10, true);
+                done = ReadNextNexusStatement (fState, f, CurrentLine, offSet, blank, true, true,true,false,false);
+                offSet = 0;
+                blank.Trim (blank.FirstNonSpaceIndex(),-1);
+                if (blank.beginswith(key21)) { // datatype
+                    if (!(count=ReadNextNexusEquate (fState,f,CurrentLine, 0 ,blank))) {
+                        errMsg = "DATATYPE is not followed by '= DNA|RNA|NUCLEOTIDE|PROTEIN|BINARY'";
+                        ReportWarning (errMsg);
+                        done = true;
+                    } else {
+                        done = done||(count>1);
+                        if ((blank==_String("DNA"))||(blank==_String("RNA"))||(blank==_String("NUCLEOTIDE"))) {
+                            if (newAlph.sLength) {
+                                errMsg = _String("DNA|RNA|NUCLEOTIDE datatype directive will over-ride the custom symbols definition: ") & newAlph;
+                                newAlph = empty;
+                                ReportWarning (errMsg);
+                            }
+                            if (done) {
+                                done = false;
+                                break;
+                            }
+                            continue;
+                        } else if (blank==_String("PROTEIN") || blank == _String ("BINARY")) {
+                            charState = 1+(blank==_String("BINARY"));
+                            if (newAlph.sLength) {
+                                errMsg = _String("PROTEIN|BINARY datatype directive will override the custom symbols definition: ") & newAlph;
+                                newAlph = empty;
+                                ReportWarning (errMsg);
+                            }
+                            if (done) {
+                                done = false;
+                                break;
+                            }
+                            continue;
+                        } else {
+                            errMsg = blank&" is not a recognized data type (DNA|RNA|NUCLEOTIDE|PROTEIN|BINARY are allowed).";
+                            ReportWarning (errMsg);
+                            done = false;
+                        }
+                    }
+                } else if (blank.beginswith(key22, false)) { // MISSING
+                    charSwitcher = 1;
+                } else if (blank.beginswith(key23, false)) { // GAP
+                    charSwitcher = 2;
+                } else if (blank.beginswith(key26, false)) { // MATCHCHAR
+                    charSwitcher = 3;
+                } else if (blank.beginswith(key27, false)) { // NOLABELS
+                    labels = false;
+                } else if (blank.beginswith(key28, false)) { // INTERLEAVE
+                    fState.interleaved = true;
+                } else if (blank.beginswith(key24, false)) { // SYMBOLS
+                    count=ReadNextNexusEquate (fState,f,CurrentLine, 0 ,blank, true,false);
+                    if (blank.sLength == 0) {
+                        errMsg = blank& _String("is not of the form SYMBOLS = \"sym1 sym2 ...\". The entire block is ignored.");
+                        ReportWarning (errMsg);
+                        done = true;
+                        break;
+                    }
+                    _String tempNewAlpha ((unsigned long)10, true);
+                    //bool  mult = false;
+                    for (long pos1 = 0; pos1<blank.sLength; pos1++) {
+                        charSwitcher = blank.sData[pos1];
+                        if (!isspace(charSwitcher))
+                            //{
+                            //if (!mult)
+                            //{
+                        {
+                            tempNewAlpha<<charSwitcher;
+                        }
+                        //mult = true;
+                        //}
+                        //else
+                        //{
+                        //done = true;
+                        //errMsg = "Multicharacter symbols are not supported by HYPHY kernel. Skipping the entire data block";
+                        //break;
+                        //}
+                        //}
+                        //else
+                        //mult = false;
+                    }
+                    if (done) {
+                        break;
+                    }
+                    tempNewAlpha.Finalize();
+                    newAlph = tempNewAlpha;
+                    charSwitcher = 0;
+                    done = done||(count>1);
+                } else if (blank.beginswith(key25, false)) { // EQUATE
+                    blank.Trim(key25.sLength,-1);
+                    if (!(count=ReadNextNexusEquate (fState,f,CurrentLine, 0,blank,true,false))) {
+                        errMsg = errMsg&" is not followed by '=char'";
+                        ReportWarning (errMsg);
+                        done = true;
+                    }
+                    done = done||(count>1);
+                    // blank now contains a full list of the form token=(token)
+                    _String symbol, meaning;
+                    bool    symbolDefined = false, meaningDefined = false;
+                    for (count=0; count<blank.sLength; count++) {
+                        charSwitcher = blank.sData[count];
+                        if (isspace(charSwitcher)) {
+                            /*if (meaningDefined)
+                            {
+                                translations&& &symbol;
+                                translations&& &meaning;
+                                symbol = "";
+                                meaning = "";
+                                symbolDefined = false;
+                                meaningDefined = false;
+                            }   */
+                            continue;
+                        } else if (charSwitcher == '=') {
+                            if (symbolDefined&&!meaningDefined) {
+                                meaningDefined = true;
+                            }
+                        } else
+                            //if (((charSwitcher>='A')&&(charSwitcher<='Z'))||((charSwitcher>='0')&&(charSwitcher<='9')))
+                        {
+                            if (!symbolDefined) {
+                                symbolDefined = true;
+                                symbol = charSwitcher;
+                                continue;
+                            }
+                            if (!meaningDefined) {
+                                errMsg = "EQUATE can only be used to define single-character tokens. Ignoring the EQUATE command.";
+                                translations.Clear();
+                                break;
+                            }
+                            meaning = meaning & charSwitcher;
+                        }
+                    }
+                    if (symbol.sLength&&meaning.sLength) {
+                        translations&& &symbol;
+                        translations&& &meaning;
+                    }
+                    charSwitcher = 0;
+                    blank = empty;
+                }
+
+                offSet = 0;
+                if (charSwitcher) {
+                    switch (charSwitcher) {
+                    case 1:
+                        errMsg = "MISSING";
+                        break;
+                    case 2:
+                        errMsg = "GAP";
+                        break;
+                    case 3:
+                        errMsg = "MATCHCHAR";
+                        break;
+                    }
+                    if (!(count=ReadNextNexusEquate (fState,f,CurrentLine, 0 ,blank, true))) {
+                        errMsg = errMsg&" is not followed by '=char'";
+                        ReportWarning (errMsg);
+                        done = true;
+                    } else {
+                        done = done||(count>1);
+                        if (blank.sLength!=1) {
+                            errMsg = blank&" is not a valid "&errMsg&" character.";
+                            ReportWarning (errMsg);
+                        }
+                    }
+                    switch (charSwitcher) {
+                    case 1:
+                        missing = blank.getChar(0);
+                        if (gap == missing) {
+                            gap = 0;
+                        }
+                        if (repeat == missing) {
+                            repeat = 0;
+                        }
+
+                        break;
+                    case 2:
+                        gap = blank.getChar(0);
+                        if (missing == gap) {
+                            missing = 0;
+                        }
+                        if (repeat == gap) {
+                            repeat= 0;
+                        }
+
+                        break;
+                    case 3:
+                        repeat = blank.getChar(0);
+                        if (missing == repeat) {
+                            missing = 0;
+                        }
+                        if (repeat == gap) {
+                            gap = 0;
+                        }
+
+                        break;
+                    }
+                }
+
+                if (done) {
+                    done = false;
+                    break;
+                }
+                done = false;
+            }
+        } else if (CurrentLine.beginswith (key3, false)) { // matrix instruction
+            // if needed, set up a new symbol set
+            offSet = key3.sLength;
+            if (newAlph.sLength>1) { // a valid new alphabet set
+                checkTTStatus (&fState);
+                fState.translationTable->AddBaseSet (newAlph);
+            } else {
+                if (charState) {
+                    checkTTStatus (&fState);
+                    if (charState==1) {
+                        newAlph = aminoAcidOneCharCodes;
+                        fState.translationTable->baseLength = 20;
+                    } else {
+                        newAlph = binaryOneCharCodes;
+                        fState.translationTable->baseLength = 2;
+                    }
+                } else {
+                    newAlph = dnaOneCharCodes;
+                }
+            }
+            // set up translations
+            if (translations.lLength) {
+                checkTTStatus (&fState);
+            }
+
+            for (long k = 0; k<translations.lLength; k+=2) {
+                char c = ((_String*)translations(k))->sData[0];
+                fState.translationTable->AddTokenCode (c,*((_String*)translations(k+1)));
+            }
+
+            if (fState.translationTable->GetSkipChar()!=missing) {
+                checkTTStatus (&fState);
+                fState.translationTable->AddTokenCode (missing,newAlph);
+            }
+
+            if (fState.translationTable->GetGapChar()!=gap) {
+                checkTTStatus (&fState);
+                newAlph = "";
+                fState.translationTable->AddTokenCode (gap,newAlph);
+            }
+
+            if (repeat == missing) {
+                repeat = 0;
+            }
+
+            fState.repeat               = repeat;
+            fState.skip                 = missing;
+
+            //fState.totalSitesExpected   = sitesExp;
+
+            // now proceed to read the data
+
+            long loopIterations = 0;
+            if (labels == true) {
+                result.GetNames().Clear();
+            }
+
+
+            done = false;
+            while (1) {
+                _String  blank  ((unsigned long)10, true),
+                         blank2 ((unsigned long)10, true),
+                         *source;
+
+                done = ReadNextNexusStatement (fState, f, CurrentLine, offSet?offSet+1:0, blank, true, true,true,!labels,false);
+                offSet = 0;
+                // in each line that should produce first the name of the taxon
+                // and then the data string for the taxon
+
+                if (labels) {
+                    if (result.GetNames().lLength<spExp) {
+                        if ((spExp>0)&&(blank.sLength==0)) {
+                            errMsg = _String("Could not find NTAX taxon names in the matrix. Read: ")&_String((long)result.GetNames().lLength) & " sequences.";
+                            ReportWarning (errMsg);
+                            done = true;
+                            blank2.Finalize(); // dmalloc fix 06162005
+                            break;
+                        }
+
+                        if (!(sitesExp&&fState.curSite&&(fState.curSite<sitesExp)&&(!fState.interleaved))) {
+                            result.AddName(blank);
+                            fState.totalSpeciesExpected++;
+                        }
+                    } else {
+                        if (done) {
+                            blank2.Finalize();  // dmalloc fix 06162005
+                            break;
+                        }
+                    }
+
+                    if (!(sitesExp&&fState.curSite&&(fState.curSite<sitesExp)&&(!fState.interleaved))) {
+                        done = ReadNextNexusStatement (fState, f, CurrentLine, offSet, blank2, true, true,true,true,false);
+                        source = &blank2;
+                    } else {
+                        blank2.Finalize();  // dmalloc fix 06162005
+                        source = ␣
+                    }
+                } else {
+                    blank2.Finalize();  // dmalloc fix 06162005
+
+                    if (loopIterations<spExp) {
+                        if (!(sitesExp&&fState.curSite&&(fState.curSite<sitesExp)&&(!fState.interleaved))) {
+                            fState.totalSpeciesExpected++;
+                        } else {
+                            loopIterations --;
+                        }
+                    }
+                    source = ␣
+                }
+
+                if (source->sLength==0) {
+                    errMsg = _String("Could not find NTAX data strings in the matrix. Read: ")&_String((long)result.GetNames().lLength) & " sequences.";
+                    ReportWarning (errMsg);
+                    done = true;
+                    break;
+                }
+                loopIterations++;
+                ISelector (fState, *source, result);
+
+                if (done)
+                    if (loopIterations>=fState.totalSpeciesExpected) {
+                        break;    // finished reading
+                    }
+
+                if  ((f&&feof(f))||(fState.theSource&&(fState.theSource->sLength<=fState.pInSrc))) {
+                    break;
+                }
+            }
+
+
+            if (result.GetNames().lLength!=spExp) {
+                errMsg = _String ("Expected ")&spExp&" taxa, but found "&(long)result.GetNames().lLength;
+                ReportWarning(errMsg);
+            }
+            if (result.lLength!=sitesExp && result.InternalStorageMode() == 0) {
+                errMsg = _String ("Expected ")&sitesExp&" sites, but found "&(long)result.lLength;
+                ReportWarning(errMsg);
+            }
+            if (loopIterations%spExp) {
+                errMsg = _String ("There is an inconsistency between NTAX and the number of data strings in the matrix");
+                ReportWarning(errMsg);
+            }
+            done = true;
+        } else {
+            errMsg = CurrentLine.Cut (0, CurrentLine.FirstSpaceIndex(1,-1)) & " is not used by HYPHY";
+            ReportWarning (errMsg);
+            while (!done) {
+                _String blank ((unsigned long)10, true);
+                done = ReadNextNexusStatement (fState, f, CurrentLine, offSet, blank, true, false,true,false,false);
+            }
+            done = false;
+        }
+        if (!done) {
+            if (CurrentLine.sLength == 0) {
+                ReadNextLine(f,&CurrentLine,&fState,false);
+            }
+            pos = 0;
+            if (CurrentLine.sLength==0) {
+                done = true;
+            }
+        }
+    }
+
+    SkipUntilNexusBlockEnd (fState, f,CurrentLine, pos);
+    return true;
+}
+
+//_________________________________________________________
+
+void    ReadNexusFile (FileState& fState, FILE*file, _DataSet& result)
+{
+    bool   dataRead = false, lookForEnd = false;
+    long   f,g;
+
+    fState.fileType = 3; // NEXUS
+    _String CurrentLine, beginMark ("BEGIN"), endMark ("END"), blockName, data ("DATA"), chars ("CHARACTERS"),
+            taxa ("TAXA"), trees ("TREES"), assumptions ("ASSUMPTIONS"), hyphy ("HYPHY"), sets ("SETS");
+
+    ReadNextLine(file,&CurrentLine,&fState,false);
+    while (CurrentLine.sLength) {
+        f = 0;
+        while ((f = CurrentLine.FindAnyCase(beginMark,f,-1 ))>=0) {
+            f = CurrentLine.FirstNonSpaceIndex (f+beginMark.sLength,-1,1);
+            if (f!=-1) { // process
+                g = CurrentLine.Find (';', f, -1);
+                if (g!=-1) {
+                    blockName = CurrentLine.Cut (f,g-1);
+                    // dispatch to block readers
+                    if (blockName.iEqual(&data)) {
+                        blockName = blockName &" block is now deprecated in NEXUS and should not be used.";
+                        ReportWarning (blockName);
+
+                        if (!dataRead) {
+                            dataRead = ProcessNexusData (fState, g+1, file, CurrentLine, result);
+                        }
+                        //SkipUntilNexusBlockEnd (fState,file,CurrentLine,f);
+
+                        else {
+                            blockName = "Only one data set per NEXUS file is read by ReadDataSet - the 1st valid one.";
+                            ReportWarning (blockName);
+                        }
+                    } else if (blockName.iEqual(&taxa)) {
+                        if (!dataRead) {
+                            ProcessNexusTaxa (fState, g+1, file, CurrentLine, result);
+                        } else {
+                            blockName = "The TAXA block was encountered after CHARACTER had been read and will be ignored.";
+                            ReportWarning (blockName);
+                        }
+                    } else if (blockName.iEqual(&trees)) {
+                        ProcessNexusTrees (fState, g+1, file, CurrentLine, result);
+                    } else if (blockName.iEqual(&chars)) {
+                        if (!dataRead) {
+                            dataRead = ProcessNexusData (fState, g+1, file, CurrentLine, result);
+                        } else {
+                            blockName = "Only one data set per NEXUS file is read by ReadDataSet - the 1st valid one.";
+                            ReportWarning (blockName);
+                        }
+                    } else if (blockName.iEqual(&assumptions)||blockName.iEqual(&sets)) {
+                        ProcessNexusAssumptions (fState, g+1, file, CurrentLine, result);
+                    } else if (blockName.iEqual(&hyphy)) {
+                        ProcessNexusHYPHY (fState, g+1, file, CurrentLine, result);
+                    } else {
+                        blockName = _String("NEXUS blocks ")&blockName&(" are not used by HYPHY.");
+                        ReportWarning (blockName);
+                        lookForEnd = true;
+                        break;
+                        // now look for the end of this block
+                    }
+
+                } else {
+                    break;
+                }
+            } else {
+                blockName = _String ("NEXUS BEGIN must be followed by the name of the block. Skipping until next BEGIN statement.");
+                ReportWarning (blockName);
+                break;
+            }
+        }
+
+        if (lookForEnd) {
+            lookForEnd = false;
+            SkipUntilNexusBlockEnd (fState,file,CurrentLine,f);
+        } else {
+            ReadNextLine(file,&CurrentLine,&fState,false);
+        }
+
+    }
+
+}
diff --git a/src/core/operation.cpp b/src/core/operation.cpp
new file mode 100644
index 0000000..a3969f1
--- /dev/null
+++ b/src/core/operation.cpp
@@ -0,0 +1,613 @@
+/*
+ 
+ HyPhy - Hypothesis Testing Using Phylogenies.
+ 
+ Copyright (C) 1997-now
+ Core Developers:
+ Sergei L Kosakovsky Pond (spond at ucsd.edu)
+ Art FY Poon    (apoon at cfenet.ubc.ca)
+ Steven Weaver (sweaver at ucsd.edu)
+ 
+ Module Developers:
+ Lance Hepler (nlhepler at gmail.com)
+ Martin Smith (martin.audacis at gmail.com)
+ 
+ Significant contributions from:
+ Spencer V Muse (muse at stat.ncsu.edu)
+ Simon DW Frost (sdf22 at cam.ac.uk)
+ 
+ Permission is hereby granted, free of charge, to any person obtaining a
+ copy of this software and associated documentation files (the
+ "Software"), to deal in the Software without restriction, including
+ without limitation the rights to use, copy, modify, merge, publish,
+ distribute, sublicense, and/or sell copies of the Software, and to
+ permit persons to whom the Software is furnished to do so, subject to
+ the following conditions:
+ 
+ The above copyright notice and this permission notice shall be included
+ in all copies or substantial portions of the Software.
+ 
+ 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.
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ 
+ */
+
+#include "defines.h"
+#include "variable.h"
+#include "operation.h"
+
+#include "parser.h"
+#include "polynoml.h"
+#include "batchlan.h"
+
+extern _SimpleList BinOps,
+       opPrecedence,
+       FunctionArgumentCount,
+       batchLanguageFunctionParameters,
+       batchLanguageFunctionClassification,
+       associativeOps;
+
+//__________________________________________________________________________________
+
+_Operation::_Operation  (void)
+{
+    numberOfTerms = 0;
+    theData = -1;
+    theNumber = nil;
+}
+
+//__________________________________________________________________________________
+void    _Operation::Initialize(void)
+{
+    numberOfTerms = 0;
+    theData = -1;
+    theNumber = nil;
+}
+
+//__________________________________________________________________________________
+BaseRef _Operation::makeDynamic (void)
+{
+    _Operation * res = new _Operation;
+    checkPointer(res);
+    //memcpy ((char*)res, (char*)this, sizeof (_Operation));
+    res->Duplicate(this);
+    return res;
+}
+
+//__________________________________________________________________________________
+void    _Operation::Duplicate(BaseRef r)
+{
+    _Operation * o = (_Operation*)r;
+    numberOfTerms  = o->numberOfTerms;
+    theData        = o->theData;
+    theNumber      = o->theNumber;
+    opCode         = o->opCode;
+    if (theNumber) {
+        theNumber->nInstances++;
+    }
+}
+
+
+//__________________________________________________________________________________
+BaseRef _Operation::toStr(void)
+{
+    _String res, *dump = nil;
+    if (theData!=-1) {
+        dump = (_String*)((_Variable*)LocateVar(theData))->toStr();
+        res = _String("Variable ")& *dump;
+    } else if (theNumber) {
+        dump = (_String*)theNumber->toStr();
+        res = _String("Constant ")& *dump;
+    } else {
+        res = _String("Operation ")&*(_String*)BuiltInFunctions(opCode);
+    }
+
+    if(dump) {
+        DeleteObject (dump);
+    }
+    return res.makeDynamic();
+
+}
+
+//__________________________________________________________________________________
+_Operation::_Operation  (const long theCode, const long opNo = 2)
+// by opcode
+{
+    opCode = theCode;
+    numberOfTerms = opNo;
+    theData       = -1;
+    theNumber     = nil;
+}
+
+//__________________________________________________________________________________
+_Operation::_Operation  (_String& opc, const long opNo = 2)
+// construct the operation by its symbol and, if relevant -
+// number of operands
+{
+    if(opNo>=0) {
+        opCode = BuiltInFunctions.BinaryFind(&opc);
+    } else {
+        opCode = -opNo-1;
+    }
+
+    if (opCode<0) {
+        WarnError(_String ("Operation: '") & opc &"' is not defined." );
+        opCode = 0;
+    }
+
+    numberOfTerms = opNo;
+    theData       = -1;
+    theNumber     = nil;
+}
+//__________________________________________________________________________________
+_Operation::_Operation  (_PMathObj theObj)
+// construct the operation by its symbol and, if relevant -
+// number of operands
+{
+    numberOfTerms = 0;
+    theData       = -1;
+    opCode        = -1;
+    theNumber     = theObj;
+}
+
+//__________________________________________________________________________________
+bool _Operation::CanResultsBeCached (_Operation* prev, bool exp_only)
+{
+    if (theNumber == nil && theData == -1 && numberOfTerms == 1) {
+        if ((prev->theNumber && prev->theNumber->ObjectClass() == MATRIX)
+           || (prev->theData >= 0 && LocateVar (prev->theData)->ObjectClass () == MATRIX)) {
+            if (! exp_only || opCode == HY_OP_CODE_EXP)
+                return true;
+        }
+    }
+    return false;
+}
+
+//__________________________________________________________________________________
+
+bool _Operation::HasChanged (void)
+{
+    if (theNumber) {
+        return theNumber->HasChanged();
+    }
+    if (theData >= 0) {
+        return LocateVar (GetAVariable())->HasChanged();
+    }
+
+    return false;
+}
+
+//__________________________________________________________________________________
+_Operation::_Operation  (bool isVar, _String& stuff, bool isG, _VariableContainer* theParent, bool take_a_reference)
+{
+    if (isVar) { // creating a variable
+        long f;
+        _String theS (stuff);
+        if (theParent/*&&(!isG)*/) { // 20070620: SLKP the commenting may break default behavior!
+            f = LocateVarByName(theS);
+
+            if (f>=0 && !FetchVar(f)->IsGlobal()) {
+                f = -1;
+            }
+
+            if (f<0) {
+                theS = (*theParent->theName)&"."&theS;
+            }
+        }
+
+        f = LocateVarByName(theS);
+
+        if (f<0) {
+            _Variable v (theS, isG);
+            f = v.theIndex;
+        } else {
+            f = variableNames.GetXtra(f);
+        }
+
+        theData       = f;
+        theNumber     = nil;
+        numberOfTerms = take_a_reference?(1):0;
+        
+    } else {
+        numberOfTerms = 0;
+        if (stuff.Equal (&noneToken))
+            theNumber = new _MathObject;            
+        else
+            theNumber = new _Constant (stuff);
+        theData = -1;
+    }
+    opCode = -1;
+
+}
+
+
+//__________________________________________________________________________________
+_Operation::~_Operation (void)
+{
+
+    if (theNumber) {
+        DeleteObject (theNumber);
+    }
+}
+
+//__________________________________________________________________________________
+bool _Operation::IsAVariable(bool deep)
+{
+    if (theData==-1) {
+        if (deep&&theNumber) {
+            return theNumber->IsVariable();
+        }
+        return false;
+    }
+    return true;
+
+}
+
+//__________________________________________________________________________________
+bool _Operation::IsAFunctionCall (void)
+{
+    return theData == -1 && numberOfTerms < 0;
+
+}
+
+//__________________________________________________________________________________
+bool _Operation::IsConstant (void)
+{
+    if (theData==-1) {
+        if (theNumber) {
+            return theNumber->IsConstant();
+        }
+
+        return !(opCode == HY_OP_CODE_BRANCHLENGTH||opCode == HY_OP_CODE_RANDOM||opCode == HY_OP_CODE_TIME);
+    }
+    return LocateVar(GetAVariable())->IsConstant();
+
+}
+
+//__________________________________________________________________________________
+bool        _Operation::EqualOp (_Operation* otherOp)
+{
+    if (theNumber) {
+        if (otherOp->theNumber) {
+            long oc = theNumber->ObjectClass();
+
+            if ((oc == NUMBER) && (oc==otherOp->theNumber->ObjectClass())) {
+                return CheckEqual (theNumber->Value(), otherOp->theNumber->Value());
+            }
+        }
+        return false;
+    } else if (theData==-1) {
+        if (numberOfTerms<0) {
+            return numberOfTerms == otherOp->numberOfTerms;
+        } else {
+            return opCode == otherOp->opCode;
+        }
+    } else {
+        return theData == otherOp->theData;
+    }
+
+    return false;
+}
+//__________________________________________________________________________________
+
+bool        _Operation::ReportOperationExecutionError(_String text, _String * errMsg) {
+    _String theError = text & ". "; 
+    
+    if (errMsg) {
+        *errMsg = theError;
+    } else {
+        WarnError (theError);
+    }
+    
+    return false;
+}
+
+//__________________________________________________________________________________
+bool        _Operation::Execute (_Stack& theScrap, _VariableContainer* nameSpace, _String* errMsg)
+{
+    if (theNumber) {
+        theScrap.Push(theNumber);
+        return true;
+    }
+    if (theData >= 0) { // variable reference
+        if (numberOfTerms <= 0) { // compute and push value
+            theScrap.Push(((_Variable*)((BaseRef*)variablePtrs.lData)[theData])->Compute());
+        } else {
+            theScrap.Push (((_Variable*)((BaseRef*)variablePtrs.lData)[theData])->ComputeReference(nameSpace),false);
+        }
+        return true;
+    }
+    if (theData < -2) {
+        theScrap.Push(((_Variable*)((BaseRef*)variablePtrs.lData)[-theData-3])->GetValue());
+        return true;
+    }
+    if (numberOfTerms<0) { // execute a user-defined function
+        {
+            long functionID = -numberOfTerms-1;
+            if (functionID >= batchLanguageFunctionParameters.lLength) {   
+                return ReportOperationExecutionError ("Attempted to call an undefined user function ", errMsg);
+            }
+            
+            long numb = batchLanguageFunctionParameters(functionID);
+            if (theScrap.StackDepth()<numb) {
+                return ReportOperationExecutionError (_String("User-defined function:") & 
+                            &*(_String*)batchLanguageFunctionNames(functionID)
+                            &" needs "&_String(numb)& " parameters: "&_String(theScrap.StackDepth())&" were supplied ", errMsg);
+            }
+
+            _List       displacedVars,
+                        *funcVarList = (_List*)batchLanguageFunctionParameterLists(functionID),
+                         displacedValues,
+                         referenceArgs;
+
+            _SimpleList existingIVars,
+                        existingDVars,
+                        displacedReferences;
+
+            _String     *argNameString;
+            long        i;
+            bool        purgeFlas = false;
+
+            for (long k=numb-1; k>=0; k--) {
+                bool            isRefVar = false;
+                argNameString = (_String*)(*funcVarList)(k);
+
+                if (argNameString->sData[argNameString->sLength-1]=='&') {
+                    argNameString->Trim(0,argNameString->sLength-2);
+                    isRefVar  = true;
+                    purgeFlas = true;
+                }
+
+                long      f = LocateVarByName (*argNameString);
+
+                _PMathObj nthterm = theScrap.Pop();
+
+                if (isRefVar && nthterm->ObjectClass()!=STRING) {
+                    _FString * type = (_FString*)nthterm->Type();
+                    _String errText = _String ("User-defined function '")
+                                     &*(_String*)batchLanguageFunctionNames(-numberOfTerms-1)
+                                     &"' expected a string for the reference variable '"
+                                     & *argNameString
+                                     &"' but was passed a " & *type->theString
+                                     & " with the value of " & _String((_String*)nthterm->toStr());
+
+                    DeleteObject (type);
+                    return ReportOperationExecutionError (errText, errMsg);
+                }
+
+                if (f<0) { // not an existing var
+                    _Variable newV (*argNameString);
+                    f =  LocateVarByName (*argNameString);
+                }
+                _Variable* theV = FetchVar (f);
+
+                if (!isRefVar) {
+                    if (theV->IsIndependent())
+                        // if the variable exists and is independent then
+                        // simply swap the value of the var, otherwise
+                        // duplicate the entire variable
+                    {
+                        theV->varFlags &= HY_VARIABLE_SET;
+                        if (!theV->varValue) {
+                            theV->Compute();
+                        }
+                        displacedValues<<theV->varValue;
+                        theV->varFlags |= HY_VARIABLE_CHANGED;
+                        /*if (*theV->GetName() == _String("gbdd1"))
+                        {
+                             printf ("Setting argument value of %s to %s\n",
+                             theV->GetName()->sData,
+                             _String((_String*)nthterm->toStr()).sData
+                         );
+                        }*/
+
+                        theV->varValue = nthterm;
+                        existingIVars<<theV->GetAVariable();
+                    } else {
+                        _Variable newV (*argNameString);
+                        newV.SetValue(nthterm);
+                        existingDVars<<theV->GetAVariable();
+                        displacedVars<<theV;
+                        variablePtrs.Replace (theV->GetAVariable(),(_PMathObj)newV.makeDynamic());
+                        DeleteObject (nthterm);
+                    }
+                } else {
+                    referenceArgs<< variableNames.Retrieve(f);
+                    displacedReferences<<theV->GetAVariable();
+
+                    _String * refArgName = ((_FString*)nthterm)->theString;
+
+                    if (nameSpace) {
+                        *refArgName = AppendContainerName (*refArgName, nameSpace);
+                    }
+
+                    i = LocateVarByName (*refArgName);
+
+                    if (i<0) {
+                        _Variable newAV (*refArgName);
+                        i =  LocateVarByName (*refArgName);
+                    }
+                    variableNames.SetXtra (f, variableNames.GetXtra (i));
+                    *argNameString = *argNameString&'&';
+                    DeleteObject (nthterm);
+                }
+            }
+
+            if (purgeFlas) {
+                ((_ExecutionList*)batchLanguageFunctions(opCode))->ResetFormulae();
+            }
+
+            _ExecutionList * functionBody = ((_ExecutionList*)batchLanguageFunctions(opCode));
+            if (currentExecutionList && currentExecutionList->stdinRedirect) {
+                functionBody -> stdinRedirect    = currentExecutionList->stdinRedirect;
+                functionBody -> stdinRedirectAux = currentExecutionList->stdinRedirectAux;
+            }
+            _PMathObj ret = functionBody->Execute();
+
+            functionBody -> stdinRedirect    = nil;
+            functionBody -> stdinRedirectAux = nil;
+
+            if (terminateExecution) {
+                theScrap.Push (new _Constant (0.0));
+                return true;
+            }
+
+            if (ret) {
+                theScrap.Push (ret);
+            }
+
+            for (unsigned long di = 0; di < referenceArgs.lLength; di++) {
+                variableNames.SetXtra(LocateVarByName (*(_String*)referenceArgs(di)),displacedReferences.lData[di]);
+            }
+
+            //for (i= referenceArgs.lLength-1; i>=0; i--)
+            //  variableNames.SetXtra(LocateVarByName (*(_String*)referenceArgs(i)),displacedReferences.lData[i]);
+
+            for (unsigned long dv = 0; dv < displacedVars.lLength; dv++) {
+                variablePtrs.Replace (existingDVars.lData[dv],(_PMathObj)displacedVars(dv));
+            }
+
+            //for (i= displacedVars.lLength-1; i>=0; i--)
+            //  variablePtrs.Replace (existingDVars(i),(_PMathObj)displacedVars(i));
+
+            for (unsigned long dv2 = 0; dv2 < displacedValues.lLength; dv2++) {
+                _Variable* theV = LocateVar (existingIVars.lData[dv2]);
+                DeleteObject(theV->varValue);
+                theV->varValue = ((_PMathObj)displacedValues(dv2));
+            }
+
+            //for (i= displacedValues.lLength-1; i>=0; i--)
+            //{
+            //  _Variable* theV = LocateVar (existingIVars(i));
+            //  DeleteObject(theV->varValue);
+            //  theV->varValue = ((_PMathObj)displacedValues(i));
+            //}
+
+
+        }
+        return true;
+
+    }
+
+    if (theScrap.theStack.lLength<numberOfTerms) {
+        return ReportOperationExecutionError (_String((_String*)toStr())&
+                         " needs "&_String(numberOfTerms)& " arguments; "&_String(theScrap.StackDepth())&" were supplied", errMsg);
+
+    }
+
+    _PMathObj term1, term2 = nil, term3 = nil, temp;
+    
+    _hyExecutionContext localContext (nameSpace, errMsg);
+
+
+    if (numberOfTerms >= 3) {
+        long sL = theScrap.theStack.lLength-1;
+        term3 = (_PMathObj)theScrap.theStack.lData[sL--];
+        term2 = (_PMathObj)theScrap.theStack.lData[sL--];
+        term1 = (_PMathObj)theScrap.theStack.lData[sL];
+        theScrap.theStack.lLength = sL;
+        temp = term1->Execute (opCode, term2, term3, &localContext);
+        DeleteObject (term1);
+        DeleteObject (term2);
+        DeleteObject (term3);
+    } else if (numberOfTerms == 2) {
+        long sL = theScrap.theStack.lLength-1;
+        term2 = (_PMathObj)theScrap.theStack.lData[sL--];
+        term1 = (_PMathObj)theScrap.theStack.lData[sL];
+        theScrap.theStack.lLength = sL;
+        temp = term1->Execute (opCode, term2, nil, &localContext);
+        DeleteObject (term1);
+        DeleteObject (term2);
+    } else {
+        term1 = (_PMathObj)theScrap.theStack.lData[--theScrap.theStack.lLength];
+        temp = term1->Execute (opCode, nil, nil, &localContext);
+        DeleteObject (term1);
+    }
+
+
+    if (temp) {
+        theScrap.theStack.Place(temp);
+        return true;
+    } else {
+        return false;
+    }
+
+}
+
+//__________________________________________________________________________________
+void        _Operation::StackDepth (long& depth)
+{
+    if (theNumber || theData > -1 || theData < -2) {
+        depth++;
+        return;
+    }
+
+    if (numberOfTerms<0) { // execute a user-defined function
+        depth -= batchLanguageFunctionParameters(-numberOfTerms-1) - 1;
+        return;
+    }
+    depth -= numberOfTerms - 1;
+}
+
+
+//__________________________________________________________________________________
+bool        _Operation::ExecutePolynomial (_Stack& theScrap, _VariableContainer* nameSpace, _String* errMsg)
+{
+    if (theData<=-2 || numberOfTerms < 0) {
+        return false;
+    }
+
+    _Polynomial*p = nil;
+    if (theNumber) {
+        p= (_Polynomial*)checkPointer(new _Polynomial(theNumber->Value()));
+    }
+
+    if (theData>-1) {
+        p= (_Polynomial*)checkPointer(new _Polynomial(*LocateVar(theData>-1?theData:-theData-2)));
+    }
+
+    if (p) {
+        theScrap.Push(p);
+        DeleteObject(p);
+        return true;
+    }
+
+    if (theScrap.StackDepth()<numberOfTerms) {
+        _String s((_String*)toStr());
+        return ReportOperationExecutionError (s&
+                   " needs "&_String(numberOfTerms)& " arguments. Only "&_String(theScrap.StackDepth())&" were given", errMsg);
+    }
+
+    _PMathObj term1,
+              term2 = nil,
+              temp;
+
+    bool      opResult = true;
+
+    if (numberOfTerms == 2) {
+        term2 = theScrap.Pop();
+    }
+
+    _hyExecutionContext localContext (nameSpace, errMsg);
+    term1 = theScrap.Pop();
+    temp  = term1->Execute (opCode, term2, nil, &localContext);
+    DeleteObject (term1);
+
+    if (temp) {
+        theScrap.Push (temp, false);
+    } else {
+        opResult = false;
+    }
+
+    if (term2) {
+        DeleteObject (term2);
+    }
+
+    return opResult;
+}
+
diff --git a/src/core/parser.cpp b/src/core/parser.cpp
new file mode 100644
index 0000000..a0be2e2
--- /dev/null
+++ b/src/core/parser.cpp
@@ -0,0 +1,1210 @@
+/*
+
+HyPhy - Hypothesis Testing Using Phylogenies.
+
+Copyright (C) 1997-2009
+  Sergei L Kosakovsky Pond (spond at ucsd.edu)
+  Art FY Poon              (apoon at cfenet.ubc.ca)
+
+Permission is hereby granted, free of charge, to any person obtaining a
+copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be included
+in all copies or substantial portions of the Software.
+
+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.
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+*/
+
+#include <math.h>
+#include <float.h>
+#include <limits.h>
+
+#include "likefunc.h"
+#include "parser.h"
+#include "matrix.h"
+#include "stdlib.h"
+#include "string.h"
+
+#include <stdio.h>
+#include "time.h"
+
+#include "ctype.h"
+#include "polynoml.h"
+#include "batchlan.h"
+
+
+#ifdef    __HYPHYDMALLOC__
+#include "dmalloc.h"
+#endif
+
+extern
+_SimpleList     simpleOperationCodes,
+                simpleOperationFunctions;
+
+_List           globalNamesSupportList,
+                hyReservedWords,
+                varNamesSupportList,
+                variablePtrs;   // stores all the variables declared so far
+
+_AVLList        *lookAside = nil;
+
+_AVLListX       variableNames (&varNamesSupportList),
+                _hyApplicationGlobals (&globalNamesSupportList);
+
+_Parameter printDigits;
+
+
+
+// indices of all independent variables
+
+
+_List           FunctionNameList,
+                BuiltInFunctions;
+
+_SimpleList     FunctionArgumentCount,
+                freeSlots,
+                deferIsConstant,
+                *deferSetFormula = nil;
+
+bool            useGlobalUpdateFlag = false;
+
+
+_String         HalfOps (":<>=!&|");
+
+_Trie           UnOps;
+
+_SimpleList opPrecedence,
+            BinOps,
+            associativeOps;
+
+_Parameter pi_const = 3.141592653589793,
+long_max = (_Parameter)LONG_MAX;
+
+/**********************************/
+/* Defining Globals here for now */
+/********************************/
+ 
+//Used in formula, and constant
+
+#ifndef  __HYALTIVEC__
+_Parameter  machineEps = 2.*DBL_EPSILON,
+tolerance  = DBL_EPSILON;
+#else
+_Parameter  machineEps = 1e-7,
+tolerance  = FLT_EPSILON;
+#endif
+
+//Used in formula
+_String         intPrecFact ("INTEGRATION_PRECISION_FACTOR"),
+                intMaxIter  ("INTEGRATION_MAX_ITERATES");
+
+
+//Used in parser2 and formula
+_Parameter sqrtPi = 1.77245385090551603;
+_Parameter twoOverSqrtPi = 2./sqrtPi;
+
+/*********************************/
+/*          End Globals         */
+/*******************************/
+
+//__________________________________________________________________________________
+//SW: Helper functions
+
+//__________________________________________________________________________________
+void            DeleteTreeVariable      (long, _SimpleList &, bool);
+
+//__________________________________________________________________________________
+_Variable * LocateVar (long index)
+{
+    return (_Variable *)(((BaseRef*)variablePtrs.lData)[index]);
+}
+
+//__________________________________________________________________________________
+void     parameterToCharBuffer (_Parameter value, char* dump, long length, bool json)
+{
+    if (json) {
+      if (isnan (value)) {
+        snprintf (dump, length, "null");
+        return;
+      }
+      if (isinf(value)) {
+        snprintf (dump, length, value < 0 ? "-1e9999" : "1e9999");
+        return;
+      }
+    }
+  
+    long digs = printDigits;
+    if (digs<=0 || digs>15) {
+        if (round(value) == value && fabs (value) < long_max) {
+            snprintf (dump,length, "%ld",lrint (value));
+        } else {
+            snprintf (dump,length, PRINTF_FORMAT_STRING,value);
+        }
+    } else {
+        _String format("%-");
+#ifdef __USE_LONG_DOUBLE__
+        format = format&_String(digs)&"Lg";
+#else
+        format = format&_String(digs)&'g';
+#endif
+        snprintf (dump,length,(const char*)format.sData,value);
+    }
+}
+
+
+//__________________________________________________________________________________
+BaseRef     parameterToString (_Parameter value)
+{
+    char dump [256];
+    parameterToCharBuffer (value, dump, 256);
+    return new _String (dump);
+}
+
+//__________________________________________________________________________________
+void SplitVariableIDsIntoLocalAndGlobal (const _SimpleList& theList, _List& splitStorage)
+{
+    splitStorage.Clear();
+    splitStorage.AppendNewInstance(new _SimpleList);
+    splitStorage.AppendNewInstance(new _SimpleList);
+
+    for (unsigned long k=0; k<theList.lLength; k++) {
+        long varID = theList.lData[k];
+        (*(_SimpleList*)splitStorage(1-LocateVar (varID)->IsGlobal())) << varID;
+    }
+}
+
+//__________________________________________________________________________________
+_String FetchObjectNameFromType (const unsigned long objectClass) {
+    switch (objectClass) {
+        case HY_UNDEFINED:
+            return "Undefined";
+        case NUMBER:
+            return "Number";
+        case MATRIX:
+            return "Container variable";
+        case TREE_NODE:
+            return "Tree node";
+        case TREE:
+            return "Tree";
+        case STRING:
+            return "String";
+        case ASSOCIATIVE_LIST:
+            return "Associative Array";
+        case TOPOLOGY:
+            return "Topology";
+        case POLYNOMIAL:
+            return "Polynomial";
+        case HY_ANY_OBJECT:
+            return "Any HyPhy object";
+    }
+    
+    return empty;
+}
+
+//__________________________________________________________________________________
+_String*   FetchMathObjectNameOfTypeByIndex (const unsigned long objectClass, const long objectIndex)
+{
+    if (objectIndex >=0 && objectIndex < variableNames.countitems()) {
+            long tc = 0;
+            _SimpleList nts;
+            long        rt,
+                        vi = variableNames.Traverser (nts, rt, variableNames.GetRoot());
+
+            for (; vi >= 0; vi = variableNames.Traverser (nts, rt))
+                if (FetchVar(variableNames.GetXtra (vi))->ObjectClass () == objectClass) {
+                    if (tc==objectIndex) {
+                        return (_String*)variableNames.Retrieve(vi);
+                        break;
+                    } else {
+                        tc++;
+                    }
+                }    
+    }
+    return nil;
+}
+
+//__________________________________________________________________________________
+_PMathObj   FetchObjectFromVariableByType (_String* id, const unsigned long objectClass, long command_id, _String *errMsg)
+{
+    if (id) {
+        _Variable * v = FetchVar (LocateVarByName (*id));
+        if (v && (objectClass == HY_ANY_OBJECT || v->ObjectClass () == objectClass)) {
+            return v->Compute();
+        }
+        if (command_id >= 0 || errMsg) {
+            if (command_id >= 0) {
+                WarnError (_String ("'") & *id & ("' must refer to a ") & FetchObjectNameFromType (objectClass) & " in call to " 
+                                         &_HY_ValidHBLExpressions.RetrieveKeyByPayload(command_id) & '.');
+            } else {
+                WarnError (errMsg->Replace ("_VAR_NAME_ID_", *id, true));
+            }
+        }
+    }
+    return nil;
+}
+
+
+//__________________________________________________________________________________
+_PMathObj   FetchObjectFromVariableByTypeIndex (long idx, const unsigned long objectClass, long command_id, _String *errMsg)
+{
+    _Variable * v = FetchVar (idx);
+    if (v && (objectClass == HY_ANY_OBJECT || v->ObjectClass () == objectClass)) {
+        return v->GetValue();
+    }
+    if (command_id >= 0 || errMsg) {
+        if (command_id >= 0) {
+            WarnError (_String ("'") & *v->GetName() & ("' must refer to a ") & FetchObjectNameFromType (objectClass) & " in call to " 
+                                     &_HY_ValidHBLExpressions.RetrieveKeyByPayload(command_id) & '.');
+        } else {
+            WarnError (errMsg->Replace ("_VAR_NAME_ID_", *v->GetName(), true));
+        }
+    }    
+    return nil;
+}
+
+//__________________________________________________________________________________
+long LocateVarByName (_String& name)
+{
+    return variableNames.Find (&name);
+}
+
+//__________________________________________________________________________________
+_Variable* FetchVar (long index)
+{
+    return index>=0?(_Variable *)variablePtrs(variableNames.GetXtra(index)):nil;
+}
+
+//__________________________________________________________________________________
+void       UpdateChangingFlas (long vN)
+{
+    // check to see if formulae contain a reference to this var
+    // if so: "decompile" them
+
+    long topLimit = compiledFormulaeParameters.lLength;
+
+    _SimpleList * toDelete = nil;
+
+    for (long k = 0; k<topLimit; k++) {
+        long g = ((_SimpleList*)compiledFormulaeParameters.lData[k])->BinaryFind (vN,0);
+
+        if (g>=0) {
+            _ElementaryCommand* thisCommand = (_ElementaryCommand*)listOfCompiledFormulae.lData[k];
+            _Formula  *f  = (_Formula*)(thisCommand->simpleParameters.lData[1]),
+                       *f2 = (_Formula*)(thisCommand->simpleParameters.lData[2]);
+
+            delete f;
+            delete f2;
+
+            thisCommand->simpleParameters.Clear();
+
+            // MOD 10/21/2005
+
+            if (!toDelete) {
+                checkPointer(toDelete = new _SimpleList);
+            }
+
+            //listOfCompiledFormulae.    Delete(k);
+            //compiledFormulaeParameters.Delete(k);
+
+            //k--;
+            //topLimit--;
+
+            *toDelete << k;
+        }
+    }
+
+    if (toDelete) {
+        listOfCompiledFormulae.DeleteList       (*toDelete);
+        compiledFormulaeParameters.DeleteList   (*toDelete);
+        DeleteObject (toDelete);
+    }
+}
+
+//__________________________________________________________________________________
+void       UpdateChangingFlas (_SimpleList & involvedVariables)
+{
+
+    long          topLimit         = compiledFormulaeParameters.lLength;
+    _SimpleList * toDelete         = nil;
+
+    for (long k = 0; k<topLimit; k++) {
+        long g = ((_SimpleList*)compiledFormulaeParameters.lData[k])->CountCommonElements (involvedVariables,true);
+
+        if (g>0) {
+            _ElementaryCommand* thisCommand = (_ElementaryCommand*)listOfCompiledFormulae.lData[k];
+
+            _Formula  *f  = (_Formula*)(thisCommand->simpleParameters.lData[1]),
+                       *f2 = (_Formula*)(thisCommand->simpleParameters.lData[2]);
+
+            delete f;
+            delete f2;
+
+            thisCommand->simpleParameters.Clear();
+
+            if (!toDelete) {
+                checkPointer(toDelete = new _SimpleList);
+            }
+
+            *toDelete << k;
+        }
+    }
+
+    if (toDelete) {
+        listOfCompiledFormulae.DeleteList       (*toDelete);
+        compiledFormulaeParameters.DeleteList   (*toDelete);
+        DeleteObject (toDelete);
+    }
+}
+
+//__________________________________________________________________________________
+void DeleteVariable (long dv, bool deleteself)
+{
+    if (dv>=0) {
+
+        _String *name  = (_String*)variableNames.Retrieve (dv);
+        _String myName = *name&'.';
+        long    vidx   = variableNames.GetXtra (dv);
+
+        UpdateChangingFlas (vidx);
+
+        _SimpleList recCache;
+        variableNames.Find (name,recCache);
+        _String     nextVarID;// = *(_String*)variableNames.Retrieve(variableNames.Next (dv,recCache));
+        long        nvid;
+        if ((nvid = variableNames.Next (dv,recCache))>=0) {
+            nextVarID = *(_String*)variableNames.Retrieve(nvid);
+        }
+
+        if (deleteself) {
+            _SimpleList tcache;
+            long        iv,
+                        k = variableNames.Traverser (tcache, iv, variableNames.GetRoot());
+
+            for (; k>=0; k = variableNames.Traverser (tcache, iv)) {
+                _Variable * thisVar = FetchVar(k);
+
+                if (thisVar->CheckFForDependence (vidx,false)) {
+                    _PMathObj curValue = thisVar->Compute();
+                    curValue->nInstances++; // this could be a leak 01/05/2004.
+                    thisVar->SetValue (curValue);
+                    DeleteObject (curValue);
+                }
+            }
+
+            _Variable* delvar = (FetchVar(dv));
+            DeleteObject (delvar);
+
+            variableNames.Delete (variableNames.Retrieve(dv),true);
+            (*((_SimpleList*)&variablePtrs))[vidx]=0;
+            freeSlots<<vidx;
+        } else {
+            _Variable* delvar = (FetchVar(dv));
+            if (delvar->IsContainer()) {
+                _VariableContainer* dc = (_VariableContainer*)delvar;
+                dc->Clear();
+            }
+        }
+
+        _List       toDelete;
+
+        recCache.Clear();
+        long nextVar = variableNames.Find (&nextVarID,recCache);
+
+        for (; nextVar>=0; nextVar = variableNames.Next (nextVar, recCache)) {
+            _String dependent = *(_String*)variableNames.Retrieve (nextVar);
+            if (dependent.startswith(myName)) {
+                toDelete && & dependent;
+            } else {
+                break;
+            }
+        }
+
+        for (unsigned long k=0; k< toDelete.lLength; k++) {
+            DeleteVariable (*(_String*)toDelete(k));
+        }
+    }
+}
+
+//__________________________________________________________________________________
+void DeleteTreeVariable (long dv, _SimpleList & parms, bool doDeps)
+{
+    if (dv>=0) {
+        _String *name  = (_String*)variableNames.Retrieve (dv);
+        _String myName = *name&".";
+        long    vidx   = variableNames.GetXtra (dv);
+
+        UpdateChangingFlas (vidx);
+
+        _SimpleList recCache;
+        variableNames.Find (name,recCache);
+        _String     nextVarID;
+        long        nvid;
+        if ((nvid = variableNames.Next (dv,recCache))>=0) {
+            nextVarID = *(_String*)variableNames.Retrieve(nvid);
+        }
+
+
+        {
+            _SimpleList tcache;
+            long        iv,
+                        k = variableNames.Traverser (tcache, iv, variableNames.GetRoot());
+
+            for (; k>=0; k = variableNames.Traverser (tcache, iv)) {
+                _Variable * thisVar = FetchVar(k);
+
+                if (thisVar->CheckFForDependence (vidx,false)) {
+                    _PMathObj curValue = thisVar->Compute();
+                    curValue->nInstances++;
+                    thisVar->SetValue (curValue);
+                    DeleteObject (curValue);
+                }
+            }
+        }
+
+        _Variable* delvar = (FetchVar(dv));
+        if (delvar->ObjectClass() != TREE) {
+            variableNames.Delete (variableNames.Retrieve(dv),true);
+            (*((_SimpleList*)&variablePtrs))[vidx]=0;
+            freeSlots<<vidx;
+            DeleteObject (delvar);
+        } else {
+            ((_VariableContainer*)delvar)->Clear();
+        }
+        if (doDeps) {
+            _List toDelete;
+            recCache.Clear();
+            long nextVar = variableNames.Find (&nextVarID,recCache);
+            for (; nextVar>=0; nextVar = variableNames.Next (nextVar, recCache)) {
+                _String dependent = *(_String*)variableNames.Retrieve (nextVar);
+                if (dependent.startswith(myName)) {
+                    if (dependent.Find ('.', myName.sLength+1, -1)>=0) {
+                        _Variable * checkDep = FetchVar (nextVar);
+                        if (!checkDep->IsIndependent()) {
+                            _PMathObj curValue = checkDep->Compute();
+                            curValue->nInstances++;
+                            checkDep->SetValue (curValue);
+                            DeleteObject (curValue);
+                        }
+                        parms << variableNames.GetXtra (nextVar);
+                    } else {
+                        toDelete && & dependent;
+                    }
+                } else {
+                    break;
+                }
+            }
+
+            for (unsigned long k=0; k<toDelete.lLength; k++) {
+                //StringToConsole (*(_String*)toDelete(k));
+                //BufferToConsole ("\n");
+                DeleteTreeVariable (*(_String*)toDelete(k),parms,false);
+            }
+        }
+    }
+}
+//__________________________________________________________________________________
+void DeleteVariable (_String&name, bool deleteself)
+{
+    DeleteVariable(LocateVarByName (name), deleteself);
+}
+
+//__________________________________________________________________________________
+void DeleteTreeVariable (_String&name, _SimpleList& parms, bool doDeps)
+{
+    DeleteTreeVariable(LocateVarByName (name), parms,doDeps);
+}
+
+//__________________________________________________________________________________
+_Variable* CheckReceptacle (_String* name, _String fID, bool checkValid, bool isGlobal)
+{
+    if (checkValid && (!name->IsValidIdentifier())) {
+        _String errMsg = *name & " is not a valid variable identifier in call to " & fID;
+        WarnError (errMsg);
+        return nil;
+    }
+
+    long    f = LocateVarByName (*name);
+    if (f<0) {
+        _Variable dummy (*name, isGlobal);
+        f = LocateVarByName (*name);
+    }
+
+    return FetchVar(f);
+}
+//__________________________________________________________________________________
+_Variable* CheckReceptacleCommandID (_String* name, const long id, bool checkValid, bool isGlobal, _ExecutionList* context)
+{
+    if (checkValid && (!name->IsValidIdentifier())) {
+        _String errMsg = _String ("'") & *name & "' is not a valid variable identifier in call to " & _HY_ValidHBLExpressions.RetrieveKeyByPayload(id) & '.';
+        if (context) {
+            context->ReportAnExecutionError(errMsg);
+        } else {
+            WarnError (errMsg);
+        }
+        return nil;
+    }
+    
+    long    f = LocateVarByName (*name);
+    if (f<0) {
+        _Variable dummy (*name, isGlobal);
+        f = LocateVarByName (*name);
+    }
+    
+    return FetchVar(f);
+}
+
+//__________________________________________________________________________________
+bool CheckReceptacleCommandIDAndStore (_String* name, const long id, bool checkValid, _PMathObj v, bool dup, bool isGlobal)
+{
+    _Variable *theV = CheckReceptacleCommandID (name, id, checkValid, isGlobal);
+    if (theV) {
+        theV->SetValue (v, dup);
+        return true;
+    }
+    if (!dup) {
+        DeleteObject (v);
+    }
+    return false;
+}
+
+
+//__________________________________________________________________________________
+bool CheckReceptacleAndStore (_String* name, _String fID, bool checkValid, _PMathObj v, bool dup)
+{
+    _Variable * theV = CheckReceptacle(name, fID, checkValid);
+    if (theV) {
+        theV->SetValue (v, dup);
+        return true;
+    }
+    if (!dup) {
+        DeleteObject (v);
+    }
+    return false;
+}
+
+//__________________________________________________________________________________
+bool CheckReceptacleAndStore (_String name, _String fID, bool checkValid, _PMathObj v, bool dup)
+{
+    return CheckReceptacleAndStore (&name, fID, checkValid, v, dup);
+}
+
+//__________________________________________________________________________________
+void  InsertVar (_Variable* theV)
+{
+    long pos = variableNames.Insert (theV->theName);
+
+    /*if (theV->GetName()->Equal (&_String("PS_2")))
+    {
+        printf ("Making...\n");
+    }*/
+
+
+    if (pos < 0 && isDefiningATree > 1)
+        // automatically fix duplicate autogenerated tree node name
+    {
+        long trySuffix  = 1;
+        _String * tryName = new _String;
+        do {
+            *tryName = *theV->theName & "_" & trySuffix;
+            pos      = variableNames.Insert (tryName);
+            trySuffix ++;
+        } while (pos < 0);
+        DeleteObject(theV->theName);
+        theV->theName = tryName;
+    }
+
+    if (pos < 0) {
+        if (isDefiningATree == 1) {
+            WarnError(_String("Error while creating a tree: duplicate node name '") & *theV->GetName() & "'");
+            return;
+        }
+
+        theV->theIndex = variableNames.GetXtra(-pos-1);
+        return;
+    } else {
+        theV->theName->nInstances++;
+    }
+
+    if (freeSlots.lLength) {
+        theV->theIndex = freeSlots.lData[freeSlots.lLength-1];
+        variablePtrs[theV->theIndex]=theV->makeDynamic();
+        freeSlots.Delete(freeSlots.lLength-1);
+    } else {
+        theV->theIndex = variablePtrs.lLength;
+        variablePtrs&&theV;
+    }
+    variableNames.SetXtra (pos, theV->theIndex);
+}
+
+//__________________________________________________________________________________
+_String&  AppendContainerName (_String& inString, _VariableContainer* theP)
+{
+    return AppendContainerName (inString, theP?theP->GetName():nil);
+}
+
+//__________________________________________________________________________________
+_String&  AppendContainerName (_String& inString, _String* namescp)
+{
+    static _String returnMe;
+
+    if (_hyApplicationGlobals.Find (&inString) >= 0) {
+        return inString;
+    }
+    
+    unsigned char reference_type = inString.ProcessVariableReferenceCases (returnMe, namescp && namescp -> sLength? namescp : nil);
+    
+
+    if (reference_type != HY_STRING_INVALID_REFERENCE) {
+        return returnMe;
+    }
+    return inString;
+}
+
+
+//__________________________________________________________________________________
+void  RenameVariable (_String* oldName, _String* newName)
+{
+    _String     oldNamePrefix (*oldName&'.'),
+                newNamePrefix (*newName&'.');
+
+    _List           toRename;
+    _SimpleList     xtras,
+                    traverser;
+
+    long f = variableNames.Find (oldName, traverser);
+    if (f>=0) {
+        toRename << oldName;
+        xtras    << variableNames.GetXtra (f);
+        f = variableNames.Next (f, traverser);
+
+        for  (; f>=0 && ((_String*)variableNames.Retrieve (f))->startswith (oldNamePrefix); f = variableNames.Next (f, traverser)) {
+            toRename << variableNames.Retrieve (f);
+            xtras << variableNames.GetXtra (f);
+        }
+    }
+
+    for (unsigned long k = 0; k < toRename.lLength; k++) {
+        _Variable * thisVar = FetchVar (xtras.lData[k]);
+        thisVar->GetName()->RemoveAReference();
+        if (k) {
+            thisVar->theName = new _String(thisVar->GetName()->Replace(oldNamePrefix,newNamePrefix,true));
+        } else {
+            thisVar->theName = new _String(*newName);
+        }
+
+        variableNames.Delete (toRename (k), true);
+        variableNames.Insert (thisVar->GetName(),xtras.lData[k]);
+        thisVar->GetName()->nInstances++;
+    }
+}
+
+//__________________________________________________________________________________
+void  ReplaceVar (_Variable* theV)
+{
+    long pos = variableNames.Find (theV->theName);
+    if (pos>=0) {
+        pos = variableNames.GetXtra(pos);
+        UpdateChangingFlas   (pos);
+        variablePtrs.Replace (pos,theV,true);
+    } else {
+        InsertVar (theV);
+    }
+}
+
+//__________________________________________________________________________________
+void    SetupOperationLists (void)
+{
+
+    _List all_unary_ops ("-",29,
+                         "!",
+                         "+",
+                         "*",
+                         "^",
+                         "&",
+                         "Abs",
+                         "Sin",
+                         "Cos",
+                         "Tan",
+                         "Exp",
+                         "Log",
+                         "Arctan",
+                         "Time",
+                         "Gamma",
+                         "Transpose",
+                         "Sqrt",
+                         "Erf",
+                         "Rows",
+                         "Columns",
+                         "LUDecompose",
+                         "Inverse",
+                         "BranchCount",
+                         "TipCount",
+                         "ZCDF",
+                         "Eigensystem",
+                         "Simplex",
+                         "Type",
+                         "Eval",
+                         "LnGamma"
+                         );
+ 
+
+    UnOps.Insert (all_unary_ops);
+        
+    BinOps<<'|'*256+'|';
+    opPrecedence<<1;
+    BinOps<<'&'*256+'&';
+    opPrecedence<<2;
+    BinOps<<'='*256+'=';
+    opPrecedence<<3;
+    BinOps<<'!'*256+'=';
+    opPrecedence<<3;
+    BinOps<<'<';
+    opPrecedence<<4;
+    BinOps<<'>';
+    opPrecedence<<4;
+    BinOps<<'<'*256+'=';
+    opPrecedence<<4;
+    BinOps<<'>'*256+'=';
+    opPrecedence<<4;
+    BinOps<<'+';
+    associativeOps << opPrecedence.lLength;
+    opPrecedence<<5;
+    BinOps<<'-';
+    opPrecedence<<5;
+    BinOps<<'*';
+    associativeOps << opPrecedence.lLength;
+    opPrecedence<<6;
+    BinOps<<'/';
+    opPrecedence<<6;
+    BinOps<<'%';
+    opPrecedence<<6;
+    BinOps<<'$';
+    opPrecedence<<6;
+    BinOps<<'^';
+    opPrecedence<<7;
+    BinOps<<'+'*256+'=';
+    opPrecedence<<8;
+
+    if (BuiltInFunctions.lLength==0)
+        // construct a list of operations
+        // don't forget to update SimplifyConstants, simpleOperationCodes, InternalDifferentiate, InternalSimplify, Formula::HasChanged and all Execute commands
+        // also MAccess and MCoord codes are used in Parse to merge multiple matrix access operations
+    {
+        //HY_OP_CODE_NOT
+        BuiltInFunctions.AppendNewInstance (new _String ('!'));
+
+        //HY_OP_CODE_NEQ
+        BuiltInFunctions.AppendNewInstance (new _String ("!="));
+
+        //HY_OP_CODE_IDIV
+        BuiltInFunctions.AppendNewInstance (new _String ('$'));
+
+        //HY_OP_CODE_MOD
+        BuiltInFunctions.AppendNewInstance (new _String ('%'));
+
+        //HY_OP_CODE_REF
+        BuiltInFunctions.AppendNewInstance (new _String ('&'));
+ 
+        //HY_OP_CODE_AND
+        BuiltInFunctions.AppendNewInstance (new _String ("&&"));
+        simpleOperationCodes    << HY_OP_CODE_AND;
+        simpleOperationFunctions<< (long)AndNumbers;
+
+        //HY_OP_CODE_MUL
+        BuiltInFunctions.AppendNewInstance (new _String ('*'));
+        simpleOperationCodes    << HY_OP_CODE_MUL;
+        simpleOperationFunctions<< (long)MultNumbers;
+
+        //HY_OP_CODE_ADD
+        BuiltInFunctions.AppendNewInstance (new _String ('+'));
+        simpleOperationCodes<< HY_OP_CODE_ADD;
+        simpleOperationFunctions<<(long)AddNumbers;
+
+        //HY_OP_CODE_SUB
+        BuiltInFunctions.AppendNewInstance (new _String ('-'));
+        simpleOperationCodes<<HY_OP_CODE_SUB;
+        simpleOperationFunctions<<(long)SubNumbers;
+
+        //HY_OP_CODE_DIV
+        BuiltInFunctions.AppendNewInstance (new _String ('/'));
+        simpleOperationCodes<<HY_OP_CODE_DIV;
+        simpleOperationFunctions<<(long)DivNumbers;
+
+        //HY_OP_CODE_LESS
+        BuiltInFunctions.AppendNewInstance (new _String ('<'));
+        simpleOperationCodes<<HY_OP_CODE_LESS;
+        simpleOperationFunctions<<(long)LessThan;
+
+        //HY_OP_CODE_LEQ
+        BuiltInFunctions.AppendNewInstance (new _String ("<="));
+        simpleOperationCodes<<HY_OP_CODE_LEQ;
+        simpleOperationFunctions<<(long)LessThanE;
+
+        //HY_OP_CODE_EQ
+        BuiltInFunctions.AppendNewInstance (new _String ("=="));
+        simpleOperationCodes<<HY_OP_CODE_EQ;
+        simpleOperationFunctions<<(long)EqualNumbers;
+
+        //HY_OP_CODE_GREATER
+        BuiltInFunctions.AppendNewInstance (new _String ('>'));
+        simpleOperationCodes<<HY_OP_CODE_GREATER;
+        simpleOperationFunctions<<(long)GreaterThan;
+
+        //HY_OP_CODE_GEQ
+        BuiltInFunctions.AppendNewInstance (new _String (">="));
+        simpleOperationCodes<<HY_OP_CODE_GEQ;
+        simpleOperationFunctions<<(long)GreaterThanE;
+
+        //HY_OP_CODE_ABS
+        BuiltInFunctions.AppendNewInstance (new _String ("Abs"));
+        simpleOperationCodes<<HY_OP_CODE_ABS;
+        simpleOperationFunctions<<(long)AbsNumber;
+
+        //HY_OP_CODE_ARCTAN
+        BuiltInFunctions.AppendNewInstance (new _String ("Arctan"));
+
+        //HY_OP_CODE_BETA
+        BuiltInFunctions.AppendNewInstance (new _String ("Beta"));
+        FunctionNameList << BuiltInFunctions (HY_OP_CODE_BETA);
+        FunctionArgumentCount << 2;
+
+        //HY_OP_CODE_BRANCHCOUNT
+        BuiltInFunctions.AppendNewInstance (new _String ("BranchCount"));
+        FunctionNameList << BuiltInFunctions (HY_OP_CODE_BRANCHCOUNT);
+        FunctionArgumentCount << 2;
+
+        //HY_OP_CODE_BRANCHLENGTH
+        BuiltInFunctions.AppendNewInstance (new _String ("BranchLength"));
+        FunctionNameList << BuiltInFunctions (HY_OP_CODE_BRANCHLENGTH);
+        FunctionArgumentCount << 2;
+
+        //HY_OP_CODE_BRANCHNAME
+        BuiltInFunctions.AppendNewInstance (new _String ("BranchName"));
+        FunctionNameList << BuiltInFunctions (HY_OP_CODE_BRANCHNAME);
+        FunctionArgumentCount << 2;
+
+        //HY_OP_CODE_CCHI2
+        BuiltInFunctions.AppendNewInstance (new _String ("CChi2"));
+        FunctionNameList << BuiltInFunctions (HY_OP_CODE_CCHI2);
+        FunctionArgumentCount << 2;
+
+        //HY_OP_CODE_CGAMMADIST
+        BuiltInFunctions.AppendNewInstance (new _String ("CGammaDist"));
+        FunctionNameList << BuiltInFunctions (HY_OP_CODE_CGAMMADIST);
+        FunctionArgumentCount << 3;
+
+        //HY_OP_CODE_COLUMNS
+        BuiltInFunctions.AppendNewInstance (new _String ("Columns"));
+
+        //HY_OP_CODE_COS
+        BuiltInFunctions.AppendNewInstance (new _String ("Cos"));
+
+        //HY_OP_CODE_DIFF
+        BuiltInFunctions.AppendNewInstance (new _String ("Differentiate"));
+        FunctionNameList << BuiltInFunctions (HY_OP_CODE_DIFF);
+        FunctionArgumentCount << 2;
+
+        //HY_OP_CODE_EIGENSYSTEM
+        BuiltInFunctions.AppendNewInstance (new _String ("Eigensystem"));
+
+        //HY_OP_CODE_ERF
+        BuiltInFunctions.AppendNewInstance (new _String ("Erf"));
+
+        //HY_OP_CODE_EVAL
+        BuiltInFunctions.AppendNewInstance (new _String ("Eval"));
+
+        //HY_OP_CODE_EXP
+        BuiltInFunctions.AppendNewInstance (new _String ("Exp"));
+        simpleOperationCodes<<HY_OP_CODE_EXP;
+        simpleOperationFunctions<<(long)ExpNumbers;
+
+        //HY_OP_CODE_FORMAT
+        BuiltInFunctions.AppendNewInstance (new _String ("Format"));
+        FunctionNameList << BuiltInFunctions (HY_OP_CODE_FORMAT);
+        FunctionArgumentCount << 3;
+
+        //HY_OP_CODE_GAMMA
+        BuiltInFunctions.AppendNewInstance (new _String ("Gamma"));
+
+        //HY_OP_CODE_GAMMADIST
+        BuiltInFunctions.AppendNewInstance (new _String ("GammaDist"));
+        FunctionNameList << BuiltInFunctions (HY_OP_CODE_GAMMADIST);
+        FunctionArgumentCount << 3;
+
+        //HY_OP_CODE_IBETA
+        BuiltInFunctions.AppendNewInstance (new _String ("IBeta"));
+        FunctionNameList << BuiltInFunctions (HY_OP_CODE_IBETA);
+        FunctionArgumentCount << 3;
+
+        //HY_OP_CODE_IGAMMA
+        BuiltInFunctions.AppendNewInstance (new _String ("IGamma"));
+        FunctionNameList << BuiltInFunctions (HY_OP_CODE_IGAMMA);
+        FunctionArgumentCount << 2;
+
+        //HY_OP_CODE_INVCHI2
+        BuiltInFunctions.AppendNewInstance (new _String ("InvChi2"));
+        FunctionNameList << BuiltInFunctions (HY_OP_CODE_INVCHI2);
+        FunctionArgumentCount << 2;
+
+        //HY_OP_CODE_INVERSE
+        BuiltInFunctions.AppendNewInstance (new _String ("Inverse"));
+
+        //HY_OP_CODE_JOIN
+        BuiltInFunctions.AppendNewInstance (new _String ("Join"));
+        FunctionNameList << BuiltInFunctions (HY_OP_CODE_JOIN);
+        FunctionArgumentCount << 2;
+
+        //HY_OP_CODE_LUDECOMPOSE
+        BuiltInFunctions.AppendNewInstance (new _String ("LUDecompose"));
+
+        //HY_OP_CODE_LUSOLVE
+        BuiltInFunctions.AppendNewInstance (new _String ("LUSolve"));
+        FunctionNameList << BuiltInFunctions (HY_OP_CODE_LUSOLVE);
+        FunctionArgumentCount << 2;
+
+        //HY_OP_CODE_LOG_GAMMA
+        BuiltInFunctions.AppendNewInstance (new _String ("LnGamma"));
+
+
+        //HY_OP_CODE_LOG
+        BuiltInFunctions.AppendNewInstance (new _String ("Log"));
+        simpleOperationCodes<<HY_OP_CODE_LOG;
+        simpleOperationFunctions<<(long)LogNumbers;
+
+        //HY_OP_CODE_MACCESS
+        BuiltInFunctions.AppendNewInstance (new _String ("MAccess"));
+        simpleOperationCodes<<HY_OP_CODE_MACCESS;
+        simpleOperationFunctions<<(long)FastMxAccess;
+
+        //HY_OP_CODE_MCOORD
+        BuiltInFunctions.AppendNewInstance (new _String ("MCoord"));
+
+        //HY_OP_CODE_MAX
+        BuiltInFunctions.AppendNewInstance (new _String ("Max"));
+        FunctionNameList << BuiltInFunctions (HY_OP_CODE_MAX);
+        FunctionArgumentCount << 2;
+        simpleOperationCodes<<HY_OP_CODE_MAX;
+        simpleOperationFunctions<<(long)MaxNumbers;
+
+        //HY_OP_CODE_MIN
+        BuiltInFunctions.AppendNewInstance (new _String ("Min"));
+        FunctionNameList << BuiltInFunctions (HY_OP_CODE_MIN);
+        FunctionArgumentCount << 2;
+        simpleOperationCodes<<HY_OP_CODE_MIN;
+        simpleOperationFunctions<<(long)MinNumbers;
+
+        //HY_OP_CODE_PSTREESTRING
+        BuiltInFunctions.AppendNewInstance (new _String ("PSTreeString"));
+        FunctionNameList << BuiltInFunctions (HY_OP_CODE_PSTREESTRING);
+        FunctionArgumentCount << 3;
+
+        //HY_OP_CODE_RANDOM
+        BuiltInFunctions.AppendNewInstance (new _String ("Random"));
+        FunctionNameList << BuiltInFunctions (HY_OP_CODE_RANDOM);
+        FunctionArgumentCount << 2;
+        simpleOperationCodes<<HY_OP_CODE_RANDOM;
+        simpleOperationFunctions<<(long)RandomNumber;
+
+        //HY_OP_CODE_REROOTTREE
+        BuiltInFunctions.AppendNewInstance (new _String ("RerootTree"));
+        FunctionNameList << BuiltInFunctions (HY_OP_CODE_REROOTTREE);
+        FunctionArgumentCount << 2;
+
+        //HY_OP_CODE_ROWS
+        BuiltInFunctions.AppendNewInstance (new _String ("Rows"));
+
+        //HY_OP_CODE_SIMPLEX
+        BuiltInFunctions.AppendNewInstance (new _String ("Simplex"));
+
+        //HY_OP_CODE_SIN
+        BuiltInFunctions.AppendNewInstance (new _String ("Sin"));
+
+        //HY_OP_CODE_SQRT
+        BuiltInFunctions.AppendNewInstance (new _String ("Sqrt"));
+
+        //HY_OP_CODE_TEXTREESTRING
+        BuiltInFunctions.AppendNewInstance (new _String ("TEXTreeString"));
+        FunctionNameList << BuiltInFunctions (HY_OP_CODE_TEXTREESTRING);
+        FunctionArgumentCount << 2;
+
+        //HY_OP_CODE_TAN
+        BuiltInFunctions.AppendNewInstance (new _String ("Tan"));
+
+        //HY_OP_CODE_TIME
+        BuiltInFunctions.AppendNewInstance (new _String ("Time"));
+
+        //HY_OP_CODE_TIPCOUNT
+        BuiltInFunctions.AppendNewInstance (new _String ("TipCount"));
+
+        //HY_OP_CODE_TIPNAME
+        BuiltInFunctions.AppendNewInstance (new _String ("TipName"));
+        FunctionNameList << BuiltInFunctions (HY_OP_CODE_TIPNAME);
+        FunctionArgumentCount << 2;
+
+        //HY_OP_CODE_TRANSPOSE
+        BuiltInFunctions.AppendNewInstance (new _String ("Transpose"));
+
+        //HY_OP_CODE_TYPE
+        BuiltInFunctions.AppendNewInstance (new _String ("Type"));
+
+        //HY_OP_CODE_ZCDF
+        BuiltInFunctions.AppendNewInstance (new _String ("ZCDF"));
+
+        //HY_OP_CODE_POWER
+        BuiltInFunctions.AppendNewInstance (new _String ('^'));
+        simpleOperationCodes<<HY_OP_CODE_POWER;
+        simpleOperationFunctions<<(long)Power;
+
+        //HY_OP_CODE_OR
+        BuiltInFunctions.AppendNewInstance (new _String ("||"));
+
+        hyReservedWords << BuiltInFunctions;
+        hyReservedWords.AppendNewInstance (new _String("global"));
+        hyReservedWords.Sort();
+    }
+
+
+
+}
+
+//__________________________________________________________________________________
+void    CompileListOfUserExpressions (_SimpleList& varRefs,_List& rec, bool doAll)
+{
+    rec.Clear();
+    if (varRefs.lLength == 0) {
+        return;
+    }
+
+    long i;
+    _SimpleList startVars;
+    _VariableContainer*  firstVar = (_VariableContainer*)LocateVar(varRefs.lData[0]);
+
+    firstVar->ScanAndAttachVariables();
+
+    {
+        _AVLList sA (&startVars);
+        if (doAll) {
+
+            firstVar->ScanForVariables (sA,sA);
+            firstVar->ScanForGVariables (sA,sA);
+        }
+
+        firstVar->ScanForDVariables (sA,sA);
+        sA.ReorderList ();
+    }
+
+    if (!doAll) {
+        for (i=startVars.lLength-1; i>=0; i--) {
+            if (firstVar->IsModelVar(i)) {
+                startVars.Delete(i);
+            }
+        }
+    }
+
+    for (i=0; i<startVars.lLength; i++) {
+        _String thisName (LocateVar(startVars.lData[i])->GetName()->Cut
+                          (LocateVar(startVars.lData[i])->GetName()->FindBackwards('.',0,-1),-1));
+        rec && &thisName;
+    }
+
+    for (i=varRefs.lLength-1; i>=1; i--) {
+        firstVar = (_VariableContainer*)LocateVar(varRefs.lData[i]);
+        firstVar->ScanAndAttachVariables();
+        firstVar->MatchParametersToList (rec,doAll);
+    }
+
+    for (i=rec.lLength-1; i>=0; i--) {
+        _String* thisLine = ((_String*)rec(i));
+        thisLine->Trim(1,-1);
+        if (doAll)
+            if (LocateVarByName(*thisLine)<0) {
+                *thisLine = _String('!')&*thisLine;
+            }
+    }
+
+}
+
+//__________________________________________________________________________________
+
+void  FindUnusedObjectName (_String& prefix, _String& partName, _List& names, bool sorted)
+{
+    if (partName.sLength==0) {
+        partName = prefix;
+    }
+
+    _String tryName (partName);
+    long    k = 1;
+
+    if (sorted)
+        while (names.BinaryFind(&tryName)>=0) {
+            k++;
+            tryName = partName&k;
+        }
+    else
+        while (names.Find(&tryName)>=0) {
+            k++;
+            tryName = partName&k;
+        }
+
+    partName = tryName;
+}
+//__________________________________________________________________________________
+
+void  FindUnusedObjectName (_String& prefix, _String& partName, _AVLListX& names, bool)
+{
+    if (partName.sLength==0) {
+        partName = prefix;
+    }
+
+    _String tryName (partName);
+    long    k = 1;
+
+    while (names.Find(&tryName)>=0) {
+        k++;
+        tryName = partName&k;
+    }
+
+    partName = tryName;
+}
+
+//__________________________________________________________________________________
+
+void  FinishDeferredSF (void)
+{
+    if (deferSetFormula->lLength) {
+        SortLists (deferSetFormula, &deferIsConstant);
+        _SimpleList tcache;
+        long        iv,
+                    i = variableNames.Traverser (tcache,iv,variableNames.GetRoot());
+
+        for (; i >= 0; i = variableNames.Traverser (tcache,iv)) {
+            _Variable* theV = FetchVar(i);
+            if (theV->IsContainer()) {
+                ((_VariableContainer*)theV)->SetMDependance (*deferSetFormula);
+            }
+        }
+
+        for (long j = 0; j<likeFuncList.lLength; j++)
+            if (((_String*)likeFuncNamesList(j))->sLength) {
+                _LikelihoodFunction * lf = (_LikelihoodFunction*)likeFuncList(j);
+                for (long k = 0; k < deferSetFormula->lLength; k++) {
+                    lf->UpdateIndependent(deferSetFormula->lData[k],deferIsConstant.lData[k]);
+                }
+            }
+    }
+    DeleteObject (deferSetFormula);
+    deferSetFormula = nil;
+    deferIsConstant.Clear();
+}
diff --git a/src/core/parser2.cpp b/src/core/parser2.cpp
new file mode 100644
index 0000000..80b7e6a
--- /dev/null
+++ b/src/core/parser2.cpp
@@ -0,0 +1,1809 @@
+/*
+
+HyPhy - Hypothesis Testing Using Phylogenies.
+
+Copyright (C) 1997-2009
+  Sergei L Kosakovsky Pond (spond at ucsd.edu)
+  Art FY Poon              (apoon at cfenet.ubc.ca)
+
+Permission is hereby granted, free of charge, to any person obtaining a
+copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be included
+in all copies or substantial portions of the Software.
+
+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.
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+*/
+
+#include "parser.h"
+#include "matrix.h"
+#include "math.h"
+#include "stdlib.h"
+#include "string.h"
+#include "stdio.h"
+#include "ctype.h"
+#include "calcnode.h"
+#include "time.h"
+#include "likefunc.h"
+#include "polynoml.h"
+#include "float.h"
+#include "batchlan.h"
+#include "category.h"
+
+#ifdef    __HYPHYDMALLOC__
+#include "dmalloc.h"
+#endif
+
+
+#define  GOLDEN_RATIO 1.618034
+#define MAX_BRENT_ITERATES 100L
+
+extern   _SimpleList BinOps,
+         opPrecedence,
+         FunctionArgumentCount,
+         associativeOps;
+
+extern   long           expressionsParsed;
+
+extern    _List         FunctionNameList;
+
+extern    _AVLListX     _HY_GetStringGlobalTypes;
+
+extern    _Parameter    tolerance,
+          sqrtPi,
+          maxRombergSteps,
+          integrationPrecisionFactor,
+          machineEps;
+
+extern    _String       intPrecFact ,
+          intMaxIter;
+
+_Parameter  verbosityLevel = 0.0;
+
+extern _Parameter twoOverSqrtPi;
+
+_SimpleList simpleOperationCodes,
+            simpleOperationFunctions;
+
+
+long        subNumericValues = 0;
+
+//__________________________________________________________________________________
+_Parameter  AddNumbers  (_Parameter x, _Parameter y)
+{
+    return x+y;
+}
+_Parameter  SubNumbers  (_Parameter x, _Parameter y)
+{
+    return x-y;
+}
+_Parameter  MinusNumber (_Parameter x)
+{
+    return -x;
+}
+_Parameter  MultNumbers (_Parameter x, _Parameter y)
+{
+    return x*y;
+}
+_Parameter  DivNumbers  (_Parameter x, _Parameter y)
+{
+    return x/y;
+}
+_Parameter  LessThan    (_Parameter x, _Parameter y)
+{
+    return x<y;
+}
+_Parameter  GreaterThan (_Parameter x, _Parameter y)
+{
+    return x>y;
+}
+_Parameter  LessThanE   (_Parameter x, _Parameter y)
+{
+    return x<=y;
+}
+_Parameter  GreaterThanE(_Parameter x, _Parameter y)
+{
+    return x>=y;
+}
+_Parameter  Power       (_Parameter x, _Parameter y)
+{ 
+    if (x==0.0) {
+      if (y > 0.0) {
+        return 0.0;
+      } else {
+        return 1.0;
+      }
+    }
+    return pow(x,y);
+}
+_Parameter  MaxNumbers  (_Parameter x, _Parameter y)
+{
+    return x<y?y:x;
+}
+_Parameter  MinNumbers  (_Parameter x, _Parameter y)
+{
+    return x<y?x:y;
+}
+_Parameter  ExpNumbers  (_Parameter x)
+{
+    return exp(x);
+}
+_Parameter  LogNumbers  (_Parameter x)
+{
+    return log(x);
+}
+_Parameter  FastMxAccess(Ptr m, _Parameter index)
+{
+    return ((_Parameter*)m)[(long)index];
+}
+_Parameter  AndNumbers  (_Parameter x, _Parameter y)
+{
+    return x != 0.0 && y != 0.0;
+}
+_Parameter  AbsNumber  (_Parameter x)
+{
+    return fabs (x);
+}
+
+//__________________________________________________________________________________
+
+_Parameter  RandomNumber(_Parameter l, _Parameter u)
+{
+    _Parameter r = l;
+    if (u>l) {
+        r=genrand_int32();
+        r/=RAND_MAX_32;
+        r =l+(u-l)*r;
+    }
+    return r;
+}
+
+
+
+//_______________________________________________________________________________________
+_Parameter  EqualNumbers(_Parameter a, _Parameter b)
+{
+    if (a!=0.0) {
+        a = (a>b)?(a-b)/a:(b-a)/a;
+        return ((a>0.)?(a<=machineEps):(a>=-machineEps));
+    }
+    return (b<=machineEps)&&(b>=-machineEps);
+}
+
+//_______________________________________________________________________________________
+void        PopulateArraysForASimpleFormula (_SimpleList& vars, _SimpleFormulaDatum* values)
+{
+    for (unsigned long k2 = 0; k2 < vars.lLength; k2++) {
+        _PMathObj varValue = LocateVar (vars.lData[k2])->Compute();
+        if (varValue->ObjectClass() == NUMBER) {
+            values[k2].value = varValue->Value();
+        } else {
+            values[k2].reference = (Ptr)((_Matrix*)varValue)->theData;
+        }
+    }
+}
+
+
+//__________________________________________________________________________________
+
+void        WarnNotDefined (_PMathObj p, long opCode, _hyExecutionContext* context)
+{
+    _FString * t = (_FString*)p->Type();
+    context->ReportError  (_String("Operation '")&*(_String*)BuiltInFunctions(opCode)&"' is not implemented/defined for a " & *t->theString);        
+    DeleteObject (t);
+}
+
+
+//__________________________________________________________________________________
+_Parameter  InterpolateValue (_Parameter* theX, _Parameter* theY, long n, _Parameter *c , _Parameter *d, _Parameter x, _Parameter& err)
+{
+    _Parameter y,
+               den,
+               dif = 1e10,
+               dift,
+               ho,
+               hp,
+               w;
+
+    long   ns;
+
+    for (long i=0; i<n; i++) {
+        dift = fabs(x-theX[i]);
+        if (dift<dif) {
+            ns = i;
+            dif = dift;
+        }
+        c[i] = d[i] = theY[i];
+    }
+
+    y = theY[ns];
+    ns --;
+
+    for (long m=1; m<n; m++) {
+        for (long i=0; i<=n-m-1; i++) {
+            ho = theX[i]-x;
+            hp = theX[i+m]-x;
+            w = c[i+1]-d[i];
+            den = w/(ho-hp);
+            d[i] = hp*den;
+            c[i] = ho*den;
+        }
+        err = 2*ns< (n-m)? c[ns+1]: d[ns--];
+        y += err;
+    }
+
+    return y;
+}
+
+//__________________________________________________________________________________
+_Parameter  TrapezoidLevelKSimple (_Formula&f, _Variable* xvar, _Parameter left, _Parameter right, long k, _SimpleFormulaDatum * stack, _SimpleFormulaDatum* values, _SimpleList& changingVars, _SimpleList& varToStack)
+{
+    _Parameter x,
+               tnm,
+               sum,
+               del,
+               ddel;
+
+    static _Parameter s;
+
+    //_Constant dummy;
+
+    long        it,
+                j;
+
+    if (k==1) {
+        if (changingVars.lLength == 1) {
+            values[varToStack.lData[0]].value = (left+right)*0.5;
+        } else {
+            xvar->SetValue  (new _Constant ((left+right)*0.5), false);
+            for (long vi = 0; vi < changingVars.lLength; vi++) {
+                values[varToStack.lData[vi]].value = LocateVar(changingVars.lData[vi])->Compute()->Value();
+            }
+        }
+        s = f.ComputeSimple(stack, values);
+        return s;
+    }
+
+    for (it=1, j=1; j<k-1; j++) {
+        it*=3;
+    }
+
+    tnm = it;
+    del = (right-left)/(3.0*tnm);
+    ddel = del+del;
+    x   = left+del*.5;
+    for (sum=0.0, j=1; j<=it; j++, x+=del) {
+        if (changingVars.lLength == 1) {
+            values[varToStack.lData[0]].value = x;
+        } else {
+            xvar->SetValue(new _Constant (x), false);
+            for (long vi = 0; vi < changingVars.lLength; vi++) {
+                values[varToStack.lData[vi]].value = LocateVar(changingVars.lData[vi])->Compute()->Value();
+            }
+        }
+        sum += f.ComputeSimple(stack, values);
+
+        x+=ddel;
+
+        if (changingVars.lLength == 1) {
+            values[varToStack.lData[0]].value = x;
+        } else {
+            xvar->SetValue(new _Constant (x), false);
+            for (long vi = 0; vi < changingVars.lLength; vi++) {
+                values[varToStack.lData[vi]].value = LocateVar(changingVars.lData[vi])->Compute()->Value();
+            }
+        }
+        sum += f.ComputeSimple(stack, values);
+    }
+    s = (s+(right-left)*sum/tnm)/3.0;
+    return s;
+}
+
+//__________________________________________________________________________________
+_Parameter  TrapezoidLevelK (_Formula&f, _Variable* xvar, _Parameter left, _Parameter right, long k)
+{
+    _Parameter x,
+               tnm,
+               sum,
+               del,
+               ddel;
+
+    static _Parameter s;
+
+    _Constant dummy;
+
+    long        it,
+                j;
+
+    if (k==1) {
+        dummy.SetValue((left+right)/2);
+        xvar->SetValue (&dummy);
+        s = f.Compute()->Value();
+        return s;
+    }
+
+    for (it=1, j=1; j<k-1; j++) {
+        it*=3;
+    }
+
+    tnm = it;
+    del = (right-left)/(3.0*tnm);
+    ddel = del+del;
+    x   = left+del*.5;
+    for (sum=0.0, j=1; j<=it; j++, x+=del) {
+        dummy.SetValue(x);
+        xvar->SetValue(&dummy);
+        sum += f.Compute()->Value();
+        x+=ddel;
+        dummy.SetValue(x);
+        xvar->SetValue(&dummy);
+        sum += f.Compute()->Value();
+    }
+    s = (s+(right-left)*sum/tnm)/3.0;
+    return s;
+}
+
+//__________________________________________________________________________________
+
+long       ExecuteFormula (_Formula*f , _Formula* f2, long code, long reference, _VariableContainer* nameSpace, char assignment_type)
+{
+    if (assignment_type != HY_STRING_DIRECT_REFERENCE && reference >= 0) {
+        long dereferenced = DereferenceVariable(reference, nameSpace, assignment_type);
+        if (dereferenced < 0) {
+            WarnError (_String ("Failed to dereference '") & *FetchVar(reference)->GetName() & "' in the " & ((assignment_type == HY_STRING_GLOBAL_DEREFERENCE) ? "global" : "local") & " context");
+            return 0;
+        }
+        reference = dereferenced;
+    }
+    
+    if (code == HY_FORMULA_EXPRESSION || code == HY_FORMULA_VARIABLE_VALUE_ASSIGNMENT || code == HY_FORMULA_REFERENCE_VALUE_ASSIGNMENT) {
+        _PMathObj  formulaValue = (code == HY_FORMULA_REFERENCE_VALUE_ASSIGNMENT)?f2->Compute(0, nameSpace):f->Compute(0,nameSpace);
+        if (!formulaValue) {
+            return 0;
+        }
+
+        if (code == HY_FORMULA_VARIABLE_VALUE_ASSIGNMENT) {
+            LocateVar (reference)->SetValue (formulaValue);
+            return 1;
+        }
+        
+        if (code == HY_FORMULA_REFERENCE_VALUE_ASSIGNMENT) {
+            _hyExecutionContext localContext (nameSpace);
+            _Variable * theV = f->Dereference(assignment_type == HY_STRING_GLOBAL_DEREFERENCE, &localContext);
+            if (theV) {
+                theV->SetValue (formulaValue);
+            } else {
+                return 0;
+            }
+            return 1;
+        }
+        return 0;
+    }
+
+    if (code == HY_FORMULA_VARIABLE_FORMULA_ASSIGNMENT) {
+        _Formula fFixed;
+        fFixed.DuplicateReference(f);
+        LocateVar (reference)->SetFormula (fFixed);
+        return 1;
+    }
+
+    if (code == HY_FORMULA_REFERENCE_FORMULA_ASSIGNMENT) {
+        _hyExecutionContext localContext (nameSpace);
+        _Variable * theV = f->Dereference(assignment_type == HY_STRING_GLOBAL_DEREFERENCE, &localContext);
+        if (theV) {
+            _Formula fFixed;
+            fFixed.DuplicateReference(f2);
+            theV->SetFormula (fFixed);
+            return 1;
+        } else {
+            return 0;
+        }
+       
+    }
+    
+    if (code == HY_FORMULA_VARIABLE_UPPER_BOUND_ASSIGNMENT || code == HY_FORMULA_VARIABLE_LOWER_BOUND_ASSIGNMENT || 
+        code == HY_FORMULA_REFERENCE_UPPER_BOUND_ASSIGNMENT || code == HY_FORMULA_REFERENCE_LOWER_BOUND_ASSIGNMENT ) {
+        if (f2->IsEmpty()) {
+            WarnError ("Empty RHS in a constraint assignment.");
+            return 0;
+        }
+
+        _PMathObj varObj = f2->Compute(0, nameSpace);
+        if (varObj->ObjectClass()!=NUMBER) {
+            WarnError ("Not a numeric RHS in a constraint assignment.");
+            return 0;
+        }
+
+        _Variable * theV;
+        
+        if (code == HY_FORMULA_VARIABLE_UPPER_BOUND_ASSIGNMENT || code == HY_FORMULA_VARIABLE_LOWER_BOUND_ASSIGNMENT) {
+            theV= LocateVar (reference);
+        } else {
+            _hyExecutionContext localContext (nameSpace);
+            theV = f->Dereference(assignment_type == HY_STRING_GLOBAL_DEREFERENCE, &localContext);
+            if (!theV) {
+                return 0;
+            }
+        }
+
+        if (code == HY_FORMULA_VARIABLE_UPPER_BOUND_ASSIGNMENT || code == HY_FORMULA_REFERENCE_UPPER_BOUND_ASSIGNMENT) {
+            theV->SetBounds(varObj->Value(),theV->GetUpperBound());
+        } else {
+            theV->SetBounds(theV->GetLowerBound(),varObj->Value());
+        }
+
+
+        /*
+            SLKP 20110301 if the new constraint makes the current variable value
+            invalid, then the value will be modified to stay in bounds*/
+
+        theV->EnsureTheValueIsInBounds();
+
+    }
+
+
+    if ( code== HY_FORMULA_FORMULA_FORMULA_ASSIGNMENT || code== HY_FORMULA_FORMULA_VALUE_ASSIGNMENT || code == HY_FORMULA_FORMULA_VALUE_INCREMENT) {
+        _Formula newF;
+
+        if (f2->IsEmpty()) {
+            WarnError ("Empty RHS in an assignment.");
+            return 0;
+        }
+
+        if (code == HY_FORMULA_FORMULA_FORMULA_ASSIGNMENT) {
+            newF.DuplicateReference(f2);
+        } else {
+            newF.theFormula.AppendNewInstance(new _Operation((_PMathObj)f2->Compute(0, nameSpace)->makeDynamic()));
+        }
+
+        long stackD = -1,
+             last0  = 0;
+
+        for (long opID = 0; opID < f->theFormula.lLength - 1; opID ++) {
+            ((_Operation*)f->theFormula(opID)) -> StackDepth (stackD);
+            if (stackD == 0) {
+                last0 = opID;
+            }
+        }
+
+        _Matrix          * mmx = nil;
+        _AssociativeList * mma = nil;
+
+        if (last0 > 0) {
+            stackD = f->theFormula.lLength;
+            f->theFormula.lLength       = last0+1;
+            _PMathObj   lvalue  = f->Compute(0, nameSpace);
+            f->theFormula.lLength = stackD;
+            if (lvalue->ObjectClass () == MATRIX) {
+                mmx = (_Matrix*)lvalue;
+            }
+            if (lvalue->ObjectClass () == ASSOCIATIVE_LIST) {
+                mma = (_AssociativeList*)lvalue;
+            }
+            last0++;
+        } else {
+            _Variable* mmo = LocateVar(((_Operation*)f->theFormula(0))->GetAVariable());
+
+            if (mmo)
+                if (mmo->ObjectClass () == MATRIX) {
+                    mmx = (_Matrix*)(mmo->GetValue());
+                    ((_Operation*)f->theFormula(0))->SetAVariable(-((_Operation*)f->theFormula(0))->GetAVariable()-3);
+                } else if (mmo->ObjectClass () == ASSOCIATIVE_LIST) {
+                    mma = (_AssociativeList*)(mmo->GetValue());
+                    ((_Operation*)f->theFormula(0))->SetAVariable(-((_Operation*)f->theFormula(0))->GetAVariable()-3);
+                }
+        }
+
+        _PMathObj coordMx = nil;
+        if (mma || mmx) {
+            long expectedType = mmx?MATRIX:STRING;
+            coordMx = f->Compute(last0);
+            if (!coordMx || coordMx->ObjectClass() != expectedType) {
+                if (mmx) {
+                    WarnError (_String("Matrix expected but not supplied."));
+                } else {
+                    WarnError (_String("String key expected but not supplied."));
+                }
+
+                return 0;
+            }
+        } else {
+            WarnError ("Matrix/List LHS expected but not supplied.");
+            return 0;
+        }
+
+
+        if (mmx) { // matrix LHS
+            _Matrix * mcoord = (_Matrix*)coordMx;
+
+            long hC = mcoord->theData[0],
+                 vC = mcoord->theData[1];
+
+            if (mmx->CheckCoordinates (hC,vC)) {
+                if (!ANALYTIC_COMPUTATION_FLAG) {
+                    mmx->MStore (hC, vC, newF, (code==HY_FORMULA_FORMULA_VALUE_INCREMENT)?HY_OP_CODE_ADD:HY_OP_CODE_NONE);
+                } else {
+                    _PMathObj newP = newF.ConstructPolynomial();
+                    if (!newP) {
+                        warnError (_String("Can't assign non-polynomial entries to polynomial matrices."));
+                    } else {
+                        mmx->MStore (hC,vC, newP);
+                    }
+                }
+                mmx->CheckIfSparseEnough();
+            }
+        } else if (mma) { // Associative array LHS
+            mma->MStore (coordMx, newF.Compute(), true, (code==HY_FORMULA_FORMULA_VALUE_INCREMENT)?HY_OP_CODE_ADD:HY_OP_CODE_NONE);
+        }
+
+        return 1;
+    }
+    return 0;
+}
+
+//__________________________________________________________________________________
+
+struct      characterChecker {
+    characterChecker (_String s) {
+        for (long r = 0; r<256; r++) {
+            isAllowed [r] = false;
+        }
+        for (long r2 = 0; r2<s.sLength; r2++) {
+            isAllowed [(unsigned char)s.sData[r2]] = true;
+        }
+    }
+    bool     isAllowed [256];
+}
+alpha       ("ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz"),
+            numeric     (".0123456789eE");
+
+_String     globalToken ("global"),
+            noneToken   ("None");
+
+/*
+_String     alpha   ("ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz"),
+            numeric (".0123456789eE");
+*/
+
+#define CONTEXT_TRUNCATION 24 
+
+//__________________________________________________________________________________
+long        HandleFormulaParsingError (_String errMsg, _String* saveError, _String& s, long index) {
+    if (index >= 0) {
+        errMsg = errMsg & " in the following context: '"&s.Cut(MAX(0,index-CONTEXT_TRUNCATION),index)&"<ERROR HERE>"&s.Cut(index+1,MIN (index+CONTEXT_TRUNCATION, s.sLength-1)) & "'";
+    }
+    if (saveError) {
+        *saveError = errMsg;
+    } else {
+        WarnError(errMsg);
+    }
+    return HY_FORMULA_FAILED;
+}
+
+//__________________________________________________________________________________
+bool        checkLHS (_List* levelOps, _List* levelData, _String& errMsg, char & deref, _Formula * f, _Variable*& lhs) {
+    bool check = true;
+    
+    lhs = nil;
+    
+    if (f->IsEmpty()) {
+    /* nothing has been added to the formula previously, so this should be a simple assignment 
+       to a variable */ 
+        if (levelOps->lLength == 0) {
+            if (levelData->lLength == 0) {
+                errMsg = "An empty left-hand side";
+                return false;
+            }
+        }   
+    } else {
+        if (levelData->lLength > 0) {
+             errMsg = "Only simple variable references [e.g. var = value or *ref = value or *(string expression) = value] can appear on the LHS of assignments";
+             return false;
+        }
+    }
+                  
+    deref = HY_STRING_DIRECT_REFERENCE;
+    if (levelOps->lLength > 0) { // this is where 'f is non-empty' cases will go
+        check = false;
+        if (levelOps->lLength == 1) {
+            char buffered_op = ((_Operation*)((*levelOps)(0)))->TheCode(); 
+            if (buffered_op == HY_OP_CODE_MUL) {
+                check = true; deref = HY_STRING_LOCAL_DEREFERENCE;
+            } else {
+                if (buffered_op == HY_OP_CODE_POWER) {
+                    check = true; deref = HY_STRING_GLOBAL_DEREFERENCE;
+                } else {
+                    errMsg = "* and ^ are the two supported de-referencing operations";
+                }
+            }
+        } else {
+            errMsg = "Expressions (other than matrix/dict access) cannot appear on the left-hand side of assignments";
+        }
+    } else {
+        if (levelData->lLength != 1) {
+            errMsg = "The left hand side expression does not contain an object reference";
+            check = false;
+        }
+    }
+    if (check && levelData->lLength == 1) {
+        _Operation * theOp = (_Operation*)(*levelData)(0);
+        if (!theOp->IsAVariable(false)) {
+            errMsg = "The left-hand side of an assignment must be a variable (not a constant)";
+            return false;
+        }        
+        lhs = LocateVar(theOp->GetAVariable());
+    }   
+    return check;
+}
+
+//__________________________________________________________________________________
+long _parserHelperHandleInlineBoundCases (_String& s, _FormulaParsingContext& parsingContext, long i, _Variable* lhs_variable, _Formula * f, char deref, _Formula &newF) {
+    _PMathObj varObj = newF.Compute();
+    if (varObj->ObjectClass()!=NUMBER) {
+        return HandleFormulaParsingError ("Variable bound must evaluate to a number ", parsingContext.errMsg(), s, i);
+    }
+
+    long varID;
+    
+    if (lhs_variable) {   
+        varID = DereferenceVariable(lhs_variable->GetAVariable(), parsingContext.formulaScope(), deref);
+    } else {
+        varID = DereferenceString(f->Compute(0, parsingContext.formulaScope(), nil, parsingContext.errMsg()), parsingContext.formulaScope(), deref);
+    }
+    if (varID < 0) {
+        return HandleFormulaParsingError ("Failed to dereference ", parsingContext.errMsg(), s, i);
+    }
+    
+    _Variable * theV = (_Variable*)LocateVar(varID);
+        
+    if (s.getChar(i)=='>') {
+        theV->SetBounds(varObj->Value(),theV->GetUpperBound());
+    } else {
+        theV->SetBounds(theV->GetLowerBound(),varObj->Value());
+    }
+    return HY_FORMULA_EXPRESSION;
+}
+
+//__________________________________________________________________________________
+long _parserHelperHandleInlineAssignmentCases (_String& s, _FormulaParsingContext& parsingContext, long i, _Variable* lhs_variable, _Formula * f, char deref, _Formula &newF, bool twoToken) {
+
+
+    long varID;
+    
+    if (lhs_variable) {   
+        varID = DereferenceVariable(lhs_variable->GetAVariable(), parsingContext.formulaScope(), deref);
+    } else {
+        varID = DereferenceString(f->Compute(0, parsingContext.formulaScope(), nil, parsingContext.errMsg()), parsingContext.formulaScope(), deref);
+    }
+    if (varID < 0) {
+        return HandleFormulaParsingError ("Failed to dereference ", parsingContext.errMsg(), s, i);
+    }
+    _Variable * theV = (_Variable*)LocateVar(varID);
+    
+    if (s.getChar(i-1) != ':') {
+        _PMathObj varObj = newF.Compute();
+        if (!varObj) {
+            return HandleFormulaParsingError ("Invalid RHS in an assignment ", parsingContext.errMsg(), s, i);
+        }
+        if (twoToken && s.getChar(i-1) == '+') {
+            theV->SetValue(theV->Compute()->Execute(HY_OP_CODE_ADD,varObj));
+        } else {
+            theV->SetValue(varObj);
+        }
+    } else {
+        theV->SetFormula (newF);
+    }
+    return HY_FORMULA_EXPRESSION;
+}
+
+
+//__________________________________________________________________________________
+long        Parse (_Formula* f, _String& s, _FormulaParsingContext& parsingContext, _Formula* f2)
+/* SLKP 20110908: added the concept of a 'volatile' formula, i.e. something that should be reparsed every time in ExecuteCase0
+                : currently those include
+                :    inline constructors (matrices, dictionaries)
+                :    `` substitutions in strings
+                
+    
+   SLKP 20100817: decoupled return code from variable reference return
+*/
+
+// returns:
+
+/*
+
+ case                       | return value                                  | parsingContext.assignment_ref_id value
+
+ parse failed               | HY_FORMULA_FAILED                             | undefined
+ expresion (no LHS)         | HY_FORMULA_EXPRESSION                         | undefined
+ z = x/y                    | HY_FORMULA_VARIABLE_VALUE_ASSIGNMENT          | index of the LHS
+ *|^(expr) = expr           | HY_FORMULA_REFERENCE_VALUE_ASSIGNMENT         | undefined
+ z := x/y                   | HY_FORMULA_VARIABLE_FORMULA_ASSIGNMENT        | index of the LHS
+ object[a] := x/y           | HY_FORMULA_FORMULA_FORMULA_ASSIGNMENT         | undefined
+ object[a] = x/y            | HY_FORMULA_FORMULA_VALUE_ASSIGNMENT           | undefined
+ z :< expr                  | HY_FORMULA_VARIABLE_LOWER_BOUND_ASSIGNMENT    | index of the LHS
+ z :> expr                  | HY_FORMULA_VARIABLE_UPPER_BOUND_ASSIGNMENT    | index of the LHS
+ 
+ Further, for (HY_FORMULA_VARIABLE_VALUE_ASSIGNMENT,  HY_FORMULA_VARIABLE_FORMULA_ASSIGNMENT, 
+ HY_FORMULA_VARIABLE_LOWER_BOUND_ASSIGNMENT, HY_FORMULA_VARIABLE_UPPER_BOUND_ASSIGNMENT, 
+ HY_FORMULA_REFERENCE_VALUE_ASSIGNMENT):
+ 
+ case            |   parsingContext.assignment_ref_type value
+
+ z op x/y        |   HY_STRING_DIRECT_REFERENCE
+ *z op x/y       |   HY_STRING_LOCAL_DEREFERENCE
+ ^z op x/y       |   HY_STRING_GLOBAL_DEREFERENCE
+
+
+*/
+
+{
+    static bool inAssignment = false;
+
+    expressionsParsed++;
+
+    _List           operations,
+                    operands,
+                    *levelOps,
+                    *levelData;
+
+    /*04252006*/
+
+    _SimpleList     squareBrackets,
+                    mergeMAccess,
+                    mergeMAccessLevel;
+                    
+
+
+    long            level                 = 0;
+    /* 04252006 mlevel = -1, */
+    /* mcount = 0 ; */
+
+    _String curOp;
+
+    bool            impliedMult = false,
+                    globalKey   = false,
+                    twoToken    = false;
+
+    char            storage     = 0;
+
+
+    operations.AppendNewInstance (new _List);
+    operands.AppendNewInstance (new _List);
+
+    levelOps  = (_List*)(operations(level));
+    levelData = (_List*)(operands(level));
+
+    for (long i = 0; i<=s.sLength; i++) {
+        storage = 0; // no implied ops by default
+
+        if (isspace(s.getChar(i))) { // skip spaces and tabs
+            continue;
+        }
+
+        char     lookAtMe = s.getChar(i);
+
+        if (i==s.sLength || lookAtMe == ')' || lookAtMe == ']' || lookAtMe == ',') // closing ) or ]
+            // or a parameter list
+        {
+
+            /* 04252006 if (level == mlevel && s.getChar(i)!=']')*/
+            if (squareBrackets.lLength && squareBrackets.lData[squareBrackets.lLength-1] == level && lookAtMe != ']') {
+                return HandleFormulaParsingError ("Missing or unbalanced '[]' ", parsingContext.errMsg(), s, i);
+             }
+
+            /* 04252006 if (s.getChar(i)==']' && s.getChar(i+1)!='[')
+                mlevel = -1; */
+
+            if (lookAtMe != ',')
+                if (i != s.sLength) {
+                    level--;
+                } else if (level) {
+                    level = -1;
+                }
+
+            /* 04252206 if (i!=s.sLength && lookAtMe != ',')
+                level --;
+            else
+                if (lookAtMe !=',' && level)
+                    level = -1; */
+
+            if (level<0) {
+                return HandleFormulaParsingError ("Unbalanced '()' parentheses ", parsingContext.errMsg(), s, i);
+            }
+
+            if (lookAtMe ==',' && (level<1 || (squareBrackets.lLength && squareBrackets.lData[squareBrackets.lLength-1] == level))) {
+                return HandleFormulaParsingError ("Parameter list is out of context ", parsingContext.errMsg(), s, i);
+            }
+
+            if (levelOps->lLength) { // there are some buffered operations left
+                if (levelOps->lLength > 3 || levelData->lLength > 2) {
+                    return HandleFormulaParsingError ("Syntax error ", parsingContext.errMsg(), s, i);
+                }
+
+                for (int i = 0; i<levelData->countitems(); i++) {
+                    f->theFormula << (*levelData)(i);    // mod 07072006 to not duplicate
+                }
+
+                levelData->Clear();
+
+                for (int k = levelOps->countitems()-1; k>=0; k--) {
+                    f->theFormula << (*levelOps)(k);    // mod 07072006 to not duplicate
+                }
+
+                levelOps->Clear();
+            } else {
+                if (levelData->lLength>1) {
+                    return HandleFormulaParsingError ("Syntax error ", parsingContext.errMsg(), s, i);
+                } else if (levelData->lLength) {
+                    f->theFormula << (*levelData)(0);    // mod 07072006 to not duplicate
+                }
+
+                levelData->Clear();
+            }
+
+            if (i<s.sLength && lookAtMe !=',' ) {
+                operations.Delete(level+1);
+                operands.Delete(level+1);
+                levelOps    = (_List*)(operations(level));
+                levelData   = (_List*)(operands(level));
+
+                if (lookAtMe !=']')
+                    if ( BinOps.Find(s.getChar(i+1))==-1 && i<s.sLength-1 && s.getChar(i+1)!=')' && s.getChar(i+1)!=']' && s.getChar(i+1)!='[' && HalfOps.Find(s.getChar(i+1))==-1 && s.getChar(i+1)!=',') {
+                        storage = s.getChar(i);
+                        s.setChar(i,'*');
+                    }
+            }
+
+            if (lookAtMe ==']') {
+                if (!squareBrackets.lLength || squareBrackets.lData [squareBrackets.lLength-1] != level + 1) {
+                    return HandleFormulaParsingError ("Unexpected ']' ", parsingContext.errMsg(), s, i);
+                }
+                squareBrackets.Delete(squareBrackets.lLength-1);
+                curOp = *(_String*)BuiltInFunctions(HY_OP_CODE_MACCESS);
+                if (mergeMAccess.lLength && mergeMAccess.lData[mergeMAccess.lLength-1] >= 0 && mergeMAccessLevel.lData[mergeMAccessLevel.lLength-1] == level) {
+                    long mergeIndex              = mergeMAccess.lData[mergeMAccess.lLength-1];
+                    _Operation * previousMaccess = (_Operation*) f->theFormula (mergeIndex);
+                    if (previousMaccess->GetCode () != curOp) {
+                        return HandleFormulaParsingError ("Internal error in Parse. Incorrect matrix access token code ", parsingContext.errMsg(), s, i);
+                    }
+                    
+                    if (previousMaccess->GetNoTerms() > 2) {
+                        mergeMAccess.Delete (mergeMAccess.lLength-1,false);
+                        mergeMAccessLevel.Delete (mergeMAccessLevel.lLength-1,false);
+                        f->theFormula.AppendNewInstance(new _Operation (curOp ,2));
+                    } else {
+                        previousMaccess->SetTerms(3);
+                        mergeMAccess.Delete (mergeMAccess.lLength-1,false);
+                        mergeMAccessLevel.Delete (mergeMAccessLevel.lLength-1,false);
+                        previousMaccess->nInstances++;
+                        f->theFormula.Delete (mergeIndex);
+                        f->theFormula << previousMaccess;
+                        previousMaccess->nInstances--;
+                    }
+                } else {
+                    f->theFormula.AppendNewInstance(new _Operation (curOp ,2));
+                }
+            }
+
+            if (!storage) {
+                continue;
+            }
+        }
+
+
+        if (s.getChar(i) == '=' && s.getChar(i+1) != '=' && (!twoToken || s.getChar(i-1)==':' || s.getChar (i-1) == '+')) { // assignment operator
+            _String  errMsg;
+
+            bool check               = !inAssignment,
+                 is_array_assignment = f->IsArrayAccess();
+                 
+            char deref = 0; 
+            
+            _Variable *lhs_variable = nil;
+
+ 
+            if (check) {
+                if (is_array_assignment) {
+                    (((_Operation*)((f->theFormula)(f->theFormula.lLength-1)))->TheCode()) = HY_OP_CODE_MCOORD;
+                } else {
+                    check = checkLHS (levelOps, levelData, errMsg, deref, f, lhs_variable);
+                }
+            } else {
+                errMsg = "Can't assign within another assignment";
+            }
+            
+            if (!check) {
+                return HandleFormulaParsingError (errMsg, parsingContext.errMsg(), s, i);
+            }
+
+            inAssignment = true;
+            _String ss (s,i+1,-1); // this is the RHS
+            _Formula  newF;
+           
+            if (Parse(&newF,ss,parsingContext, f2) != HY_FORMULA_EXPRESSION) {
+                inAssignment = false;
+                return HY_FORMULA_FAILED;
+            }
+            inAssignment = false;
+            if (!is_array_assignment && lhs_variable)
+                // normal variable assignment
+            {
+                if (!f2) { // immediate execution
+                    if (_parserHelperHandleInlineAssignmentCases (s,parsingContext, i, lhs_variable, f,  deref, newF, twoToken) == HY_FORMULA_FAILED) {
+                        return HY_FORMULA_FAILED;
+                    }
+                } else { // this gets called from ExecuteCase0...
+                    if (twoToken && s.getChar(i-1) == '+') { // += gets handled here
+                    
+                        _Operation* self = new _Operation ();
+                        self->SetAVariable(lhs_variable->GetAVariable());
+                        newF.theFormula.InsertElement (self,0,false);
+                        DeleteObject (self);
+                        if (deref != HY_STRING_DIRECT_REFERENCE) {
+                             _Operation* ref = new _Operation (*(_String*)BuiltInFunctions(deref == HY_STRING_GLOBAL_DEREFERENCE ? HY_OP_CODE_POWER : HY_OP_CODE_MUL),1);
+                             newF.theFormula.InsertElement (ref,1,false);
+                             DeleteObject (ref);
+                      }
+                      newF.theFormula.AppendNewInstance (new _Operation (*(_String*)BuiltInFunctions(HY_OP_CODE_ADD),2));
+                    }
+                    f->Duplicate((BaseRef)&newF);
+                }
+                twoToken     = false;
+
+                parsingContext.assignmentRefID()   = lhs_variable->GetAVariable();
+                parsingContext.assignmentRefType() = deref;
+
+                return (s.getChar(i-1)==':')?HY_FORMULA_VARIABLE_FORMULA_ASSIGNMENT:HY_FORMULA_VARIABLE_VALUE_ASSIGNMENT;
+            } else
+                // matrix/associative array element assignment
+            {
+                if (is_array_assignment) {
+                    long stackD = -1,
+                         last0  = 0;
+
+                    for (unsigned long opID = 0; opID < f->theFormula.lLength - 1; opID ++) {
+                        ((_Operation*)f->theFormula(opID)) -> StackDepth (stackD);
+                        if (stackD == 0) {
+                            last0 = opID;
+                        }
+                    }
+
+                    if (!f2) { // immediate execution
+                        bool       anError = false;
+
+                        if (newF.IsAConstant() || s.getChar(i-1) !=':') {
+                            _PMathObj       currentValue = (_PMathObj)newF.Compute();
+                            currentValue->AddAReference();
+                            newF.theFormula.Clear();
+                            newF.theFormula.AppendNewInstance (new _Operation(currentValue));
+                        }
+
+
+                        _Matrix          * mmx = nil;
+                        _AssociativeList * mma = nil;
+
+                        if (last0 > 0) {
+                            stackD = f->theFormula.lLength;
+                            f->theFormula.lLength   = last0+1;
+                            _PMathObj   lvalue      = f->Compute();
+                            f->theFormula.lLength   = stackD;
+
+                            if (lvalue->ObjectClass () == MATRIX) {
+                                mmx = (_Matrix*)lvalue;
+                            } else if (lvalue->ObjectClass () == ASSOCIATIVE_LIST) {
+                                mma = (_AssociativeList*)lvalue;
+                            }
+
+                            last0++;
+                        } else {
+                            _Variable* mmo = ((_Operation*)f->theFormula(0))->IsAVariable()?LocateVar(((_Operation*)f->theFormula(0))->GetAVariable()):nil;
+
+                            if (mmo)
+                                if (mmo->ObjectClass () == MATRIX) {
+                                    mmx = (_Matrix*)(mmo->GetValue());
+                                    ((_Operation*)f->theFormula(0))->SetAVariable(-((_Operation*)f->theFormula(0))->GetAVariable()-3);
+                                } else if (mmo->ObjectClass () == ASSOCIATIVE_LIST) {
+                                    mma = (_AssociativeList*)(mmo->GetValue());
+                                    ((_Operation*)f->theFormula(0))->SetAVariable(-((_Operation*)f->theFormula(0))->GetAVariable()-3);
+                                }
+                        }
+
+                        if (mmx) {
+                            _Matrix  *mcoord;
+                            _PMathObj coordMx = f->Compute(last0);
+
+                            if (!coordMx|| coordMx->ObjectClass()!=MATRIX) {
+                                anError = true;
+                            } else {
+                                mcoord = (_Matrix*)coordMx;
+                                _Constant hC ((*mcoord)[0]),
+                                          vC ((*mcoord)[1]);
+
+                                mmx->MStore (&hC, &vC, newF, (twoToken && s.getChar(i-1) =='+')?HY_OP_CODE_ADD:HY_OP_CODE_NONE);
+                            }
+                        } else if (mma) {
+                            _PMathObj coordIdx = f->Compute(last0);
+
+                            if (!coordIdx|| coordIdx->ObjectClass() != STRING ) {
+                                anError = true;
+                            } else {
+                                mma->MStore (coordIdx, newF.Compute(),true, (twoToken && s.getChar(i-1) =='+')?HY_OP_CODE_ADD:HY_OP_CODE_NONE);
+                            }
+                        } else {
+                            anError = true;
+                        }
+
+
+                        if (anError) {
+                            return HandleFormulaParsingError ("Invalid matrix/associative list ident supplied ", parsingContext.errMsg(), s, i);
+                        }
+
+                        return HY_FORMULA_EXPRESSION;
+                    } else {
+                        bool isSimple = (s.getChar(i-1) != ':');
+                        f2->Duplicate   ((BaseRef)&newF);
+                        if (last0 == 0) {
+                            ((_Operation*)f->theFormula(0))->SetAVariable(-((_Operation*)f->theFormula(0))->GetAVariable()-3);
+                        }
+                        return isSimple?((s.getChar(i-1) == '+')?HY_FORMULA_FORMULA_VALUE_INCREMENT:HY_FORMULA_FORMULA_VALUE_ASSIGNMENT):HY_FORMULA_FORMULA_FORMULA_ASSIGNMENT;
+                    }
+                } else {
+                // *(expression) reference
+                    if (f2) {
+                        bool isSimple = (s.getChar(i-1) != ':');
+
+                        if (twoToken && s.getChar(i-1) == '+') { // += gets handled here
+                            newF.theFormula.InsertElement (new _Operation (*(_String*)BuiltInFunctions(deref == HY_STRING_GLOBAL_DEREFERENCE ? HY_OP_CODE_POWER : HY_OP_CODE_MUL),1), 0, false);
+                            for (long lhs_ops = f->theFormula.lLength-1; lhs_ops >= 0; lhs_ops --) {  
+                                newF.theFormula.InsertElement (f->theFormula(lhs_ops), 0, true);
+                            }
+                            newF.theFormula.AppendNewInstance (new _Operation (*(_String*)BuiltInFunctions(HY_OP_CODE_ADD),2));
+                        }
+                        f2->Duplicate   ((BaseRef)&newF);
+                        parsingContext.assignmentRefType() = deref;
+                        return isSimple?HY_FORMULA_REFERENCE_VALUE_ASSIGNMENT:HY_FORMULA_REFERENCE_FORMULA_ASSIGNMENT;
+                   
+                    } else {
+                        if (_parserHelperHandleInlineAssignmentCases (s,parsingContext, i, lhs_variable, f,  deref, newF, twoToken) == HY_FORMULA_FAILED) {
+                            return HY_FORMULA_FAILED;
+                        }                  
+                    }
+                }
+            }
+        }
+
+        if ( s.getChar(i-1)==':' && (s.getChar(i)=='<' || s.getChar(i)=='>')) { // variable bounds
+            _Variable * lhs = nil;
+            _String errMsg;
+            char    deref;
+            
+            if (inAssignment||f->IsArrayAccess()||! checkLHS (levelOps, levelData, errMsg, deref, f, lhs)) {
+               return HandleFormulaParsingError ("Can't set bounds like this ", parsingContext.errMsg(), s, i);
+            }
+
+            inAssignment = true;
+
+            _String ss (s,i+1,-1);
+            _Formula newF;
+
+            if (Parse(&newF,ss,parsingContext,f2) != HY_FORMULA_EXPRESSION) {
+                inAssignment = false;
+                return HY_FORMULA_FAILED;
+            }
+
+
+            inAssignment = false;
+            twoToken     = false;
+
+
+    
+            if (lhs) {
+                if (!f2) {
+                    if (_parserHelperHandleInlineBoundCases (s,parsingContext,i,lhs,f, deref, newF) == HY_FORMULA_FAILED) {
+                        return HY_FORMULA_FAILED;
+                    } 
+                } else { // BOUND ASSIGNMENTS
+                    f2->Duplicate   ((BaseRef)&newF);
+
+                    parsingContext.assignmentRefID()   = lhs->GetAVariable();
+                    parsingContext.assignmentRefType() = deref;
+
+                    return (s.getChar(i)=='>')?HY_FORMULA_VARIABLE_UPPER_BOUND_ASSIGNMENT:HY_FORMULA_VARIABLE_LOWER_BOUND_ASSIGNMENT;
+                }
+            } else {
+                if (!f2) {
+                    if (_parserHelperHandleInlineBoundCases (s,parsingContext,i,lhs,f, deref, newF) == HY_FORMULA_FAILED) {
+                        return HY_FORMULA_FAILED;
+                    } 
+                } else { // BOUND ASSIGNMENTS
+                    f2->Duplicate   ((BaseRef)&newF);
+                    parsingContext.assignmentRefType() = deref;
+                    return (s.getChar(i)=='>')?HY_FORMULA_REFERENCE_UPPER_BOUND_ASSIGNMENT:HY_FORMULA_REFERENCE_LOWER_BOUND_ASSIGNMENT;
+                }
+            
+            }
+
+            return HY_FORMULA_EXPRESSION;
+        }
+
+
+        if (s.getChar(i) == '{') // a matrix
+            /* 20090803 SLKP:
+                 fixed the code to deal with
+            */
+        {
+        
+            parsingContext.isVolatile() = true;
+            
+            int     j       = s.ExtractEnclosedExpression (i,'{','}',true,true);
+
+            if (j<0) {
+                return HandleFormulaParsingError ("Poorly formed matrix/associative array construct ", parsingContext.errMsg(), s, i);
+            }
+
+            _String matrixDef   (s,i,j);
+
+            if (matrixDef.sLength == 2 || matrixDef.sData[1] == '"') {
+                _AssociativeList *theList = new _AssociativeList ();
+                if (!theList) {
+                    checkPointer (theList);
+                }
+                if (matrixDef.sLength > 2) {
+                    matrixDef.Trim (1,matrixDef.sLength-2);
+                    if (!theList->ParseStringRepresentation (matrixDef,parsingContext.errMsg() == nil, parsingContext.formulaScope())) {
+                        return HandleFormulaParsingError ("Poorly formed associative array construct ", parsingContext.errMsg(), s, i);
+                    }
+                }
+
+                levelData->AppendNewInstance (new _Operation (theList));
+            } else {
+                _Matrix *theMatrix = new _Matrix (matrixDef,false,parsingContext.formulaScope());
+                if (!theMatrix) {
+                    checkPointer (theMatrix);
+                }
+                levelData->AppendNewInstance (new _Operation (theMatrix));
+            }
+
+            i = j;
+            continue;
+            
+        }
+
+        if (s.getChar(i) == '[') { // opening [
+            long  lastCode = -1;
+
+            if (!f->IsEmpty()) {
+                lastCode = ((_Operation*)((f->theFormula)(f->theFormula.lLength-1)))->TheCode();
+            }
+
+            if (lastCode == HY_OP_CODE_MACCESS && s.getChar(i-1) == ']') {
+                mergeMAccess << f->theFormula.lLength-1;
+                mergeMAccessLevel << level;
+            } else {
+                if (levelData->lLength == 0 && f->IsEmpty()) {
+                   return HandleFormulaParsingError ("[..] must be preceded by an object to index ", parsingContext.errMsg(), s, i);
+                }
+
+                if (levelData->lLength) {
+                    f->theFormula.AppendNewInstance((*levelData)[levelData->lLength-1]);
+                    levelData->Delete(levelData->lLength-1,false);
+                }
+            }
+
+            squareBrackets << ++level;
+
+            curOp       = empty;
+            operations.AppendNewInstance(new _List);
+            operands.AppendNewInstance(new _List);
+            levelOps   = (_List*) (operations(level));
+            levelData  = (_List*) (operands  (level));
+
+            continue;
+        }
+
+
+        if (s.getChar(i) == '(') { // opening (
+            level++;
+            operations.AppendNewInstance (new _List);
+            operands.AppendNewInstance   (new _List);
+            levelOps    =   (_List*)(operations(level));
+            levelData   =   (_List*)(operands(level));
+            curOp       =   empty;
+            continue;
+        }
+
+        if (s.getChar(i)=='"') { // a string literal
+            long j             = 1,
+                 inPlaceID     = -1;
+
+            _String * literal = (_String*)checkPointer(new _String (16,true));
+
+            while (i+j<s.sLength) {
+                char aChar = s.sData[i+j];
+                if (aChar =='\\') {
+                    if (i+j+1<s.sLength) {
+                        if (s.sData[i+j+1]=='"' ||s.sData[i+j+1]=='`' ) {
+                            j++;
+                            (*literal)<<s.sData[i+j++];
+                        } else {
+                            (*literal)<<s.sData[i+j++];
+                            (*literal)<<s.sData[i+j++];
+                        }
+                    }
+                    continue;
+                }
+
+                if (aChar =='"' && inPlaceID < 0) {
+                    break;
+                }
+
+                if (aChar == '`') {
+                    if (inPlaceID < 0) {
+                        inPlaceID = ++j;
+                    } else if (j == inPlaceID) {
+                        return HandleFormulaParsingError ("Attempted to string substitute an empty quotation ", parsingContext.errMsg(), s, i);
+                    } else {
+                        _String     inPlaceVID (s,i+inPlaceID,i+j-1),
+                                    inPlaceValue = ProcessLiteralArgument(&inPlaceVID, parsingContext.formulaScope());
+
+                        /*if (!inPlaceValue) {
+                            inPlaceValue = (_FString*)ProcessLiteralArgument(&inPlaceVID, theParent);
+                            if (!inPlaceValue) {
+                                return HandleFormulaParsingError ("Attempted to string substitute something other that a string variable/expression ", saveError, s, i);
+                            }
+                        }*/
+
+                        (*literal) << inPlaceValue;
+                        inPlaceID = -1;
+                        parsingContext.isVolatile() = true;
+                        j++;
+                    }
+
+                } else {
+                    if (inPlaceID < 0) {
+                        (*literal)<<s.sData[i+j];
+                    }
+                    j++;
+                }
+            }
+            literal->Finalize();
+            if (inPlaceID >= 0) {
+                return HandleFormulaParsingError ("Unterminated string substitution inside a literal ", parsingContext.errMsg(), s, i);
+            }
+            levelData->AppendNewInstance (new _Operation (new _FString(*literal)));
+            DeleteObject(literal);
+
+            i += j;
+            continue;
+
+        }
+
+        if (alpha.isAllowed [(unsigned char)s.getChar(i)]) { // an identifier
+            bool takeVarReference = false;
+            
+            if (twoToken) {
+                char opChar = s.getChar(i-1);
+                if (((_String*)BuiltInFunctions(HY_OP_CODE_REF))->Equal(opChar)) {
+                    takeVarReference = true;
+                } else {
+                    _String thisOp (opChar);
+                    levelOps->AppendNewInstance (new _Operation (thisOp,1L));
+                }
+            }
+            
+            impliedMult = (i && numeric.isAllowed [(unsigned char)s.getChar(i-1)]);
+
+            long j = 1;
+            while ( i+j<s.sLength && (alpha.isAllowed [(unsigned char)s.getChar(i+j)]|| numeric.isAllowed [(unsigned char)s.getChar(i+j)]) ) {
+                j++;
+            }
+
+            curOp =  (s.Cut(i,i+j-1));
+            i+=j-1;
+
+            if (curOp.Equal(&globalToken)) {
+                if (takeVarReference) {
+                    return HandleFormulaParsingError (_String("Cannot make a reference from a reserved word ") & globalToken, parsingContext.errMsg(), s, i);
+                }
+                globalKey = true;
+                continue;
+            }
+            
+            bool noneObject = false;
+            if (curOp.Equal(&noneToken)) {
+                 if (takeVarReference) {
+                    return HandleFormulaParsingError (_String("Cannot make a reference from a reserved word ") & noneToken, parsingContext.errMsg(), s, i);
+                }
+               noneObject = true;
+                globalKey  = true;
+            }
+                
+            if (UnOps.Find(curOp)>=0) { // a standard function
+                if (takeVarReference) {
+                    return HandleFormulaParsingError ("Cannot make a reference from a built-in function", parsingContext.errMsg(), s, i);
+                }
+                                
+                levelOps->AppendNewInstance (new _Operation (curOp,1));
+                continue;
+            } else { // a variable
+                // check if this is a function defined  in the list of "standard functions"
+                long bLang = noneObject?-1:FunctionNameList.BinaryFind(&curOp);
+                if (bLang>=0) {
+                    if (takeVarReference) {
+                        return HandleFormulaParsingError ("Cannot make a reference from a built-in function", parsingContext.errMsg(), s, i);
+                    }
+                    levelOps->AppendNewInstance (new _Operation (curOp,FunctionArgumentCount(bLang)));
+                    continue;
+                }
+
+                // check if this is a function defined in the batch language
+
+                if ((bLang =  noneObject?-1:FindBFFunctionName (curOp, parsingContext.formulaScope()))>=0) {
+                    if (takeVarReference) {
+                        return HandleFormulaParsingError ("Cannot make a reference from user-defined function", parsingContext.errMsg(), s, i);
+                    }
+                    levelOps->AppendNewInstance (new _Operation (curOp,-bLang-1));
+                    continue;
+                }
+
+                long curOpl = curOp.sLength;
+                if (curOpl>2 && curOp[curOpl-1]=='_' && curOp[curOpl-2]=='_') { // instant variable refrence
+                    _String realVarName (curOp,0,curOpl-3);
+
+                    realVarName = parsingContext.contextualizeRef (realVarName);
+                   
+
+                    long realVarLoc = LocateVarByName (realVarName);
+                    if (realVarLoc<0) { // bad instant variable reference
+                        return HandleFormulaParsingError ("Attempted to take value of undeclared variable ", parsingContext.errMsg(), s, i);
+                     }
+                    if (!f2) { // 03/25/2004 ? Confused why the else
+                        levelData->AppendNewInstance(new _Operation((_MathObject*)FetchVar (realVarLoc)->Compute()->makeDynamic()));
+                    } else {
+                        _Operation theVar (true, realVarName, globalKey, parsingContext.formulaScope());
+                        theVar.SetTerms(-variableNames.GetXtra (realVarLoc)-1);
+                        theVar.SetAVariable(-2);
+                        (*levelData) && (&theVar);
+                    }
+                } else {
+                    if (noneObject)
+                        levelData->AppendNewInstance (new _Operation (false, curOp));
+                    else
+                        if (parsingContext.formulaScope() && _hyApplicationGlobals.Find(&curOp) >= 0) {
+                            levelData->AppendNewInstance (new _Operation(true, curOp, globalKey, nil, takeVarReference));
+                        } else {
+                            levelData->AppendNewInstance (new _Operation(true, curOp, globalKey, parsingContext.formulaScope(), takeVarReference));
+                        }
+                }
+                globalKey = false;
+                if (impliedMult) {
+                    storage = s.getChar(i);
+                    s.setChar(i,((_String*)BuiltInFunctions(HY_OP_CODE_MUL))->getChar(0));
+                } else if (s.getChar(i+1)=='(') {
+                    if (!storage) {
+                        storage = s.getChar(i);
+                        s.setChar(i,((_String*)BuiltInFunctions(HY_OP_CODE_MUL))->getChar(0));
+                    } else {
+                        curOp = *(_String*)BuiltInFunctions(HY_OP_CODE_MUL);
+                        levelOps->AppendNewInstance(new _Operation (curOp,2));
+                    }
+                }
+                if (!storage) {
+                    continue;
+                }
+            }
+        }
+
+        if (numeric.isAllowed [(unsigned char)s.getChar(i)]) {
+            if (twoToken) {
+                _String thisOp (s.getChar(i-1));
+                levelOps->AppendNewInstance (new _Operation (thisOp,1L));
+            }
+            long j = 1;
+
+            while ( i+j<s.sLength && (numeric.isAllowed [(unsigned char)s.getChar(i+j)] || ((s.getChar(i+j)=='-' || s.getChar(i+j)=='+' )&& tolower(s.getChar(i+j-1))=='e')) ) {
+                j++;
+            }
+
+            curOp =  (s.Cut(i,i+j-1));
+            i+=j-1;
+            levelData->AppendNewInstance (new _Operation (false, curOp));
+            if (i<s.sLength-1 && s.getChar(i+1)=='(') {
+                storage = s.getChar(i);
+                s.setChar(i,((_String*)BuiltInFunctions(HY_OP_CODE_MUL))->getChar(0));
+            } else {
+                continue;
+            }
+        }
+        
+        if ( BinOps.Find (s.getChar(i))!=-1 || (twoToken&& (BinOps.Find(s.getChar(i-1)*(long)256+s.getChar(i))!=-1)) ) {
+            if (!twoToken && BinOps.Find(s.getChar(i)*(long)256+s.getChar(i+1)) != -1) {
+                twoToken = true;
+                continue;
+            }
+
+            if (twoToken||(BinOps.Find(s.getChar(i)*256+s.getChar(i+1))!=-1)) {
+                if (!twoToken) {
+                    i++;
+                }
+                curOp = _String(s.getChar(i-1))&(_String)(s.getChar(i));
+            } else {
+                curOp = s.getChar(i);
+            }
+
+            long twoOrOne = 2;
+
+            if (storage) {
+                s.setChar(i,storage);
+            }
+
+            if (levelData->countitems()==0) {
+                if (s[i-curOp.sLength]!=')' && storage!=')' && s[i-curOp.sLength] !=']') {
+                    if (!twoToken && UnOps.Find (s.getChar(i)) >= 0) {
+                        twoOrOne = 1;
+                    } else {
+                        return HandleFormulaParsingError ("Bad binary operator placement ", parsingContext.errMsg(), s, i);
+                    }
+                }
+            }
+
+            twoToken = false;
+
+            if (levelData->countitems()) {
+                if (storage) {
+                    BaseRef newS = (*levelData)(levelData->countitems()-1)->makeDynamic();
+                    for (unsigned long k = 0; k<levelData->countitems()-1; k++) {
+                        f->theFormula&&((*levelData)(k));
+                    }
+
+                    levelData->Clear();
+                    levelData->AppendNewInstance (newS);
+                } else {
+                    for (unsigned long k = 0; k<levelData->countitems(); k++) {
+                        f->theFormula << ((*levelData)(k));
+                    }
+                    levelData->Clear();
+                }
+            }
+
+            if (!levelOps->countitems()) {
+                levelOps->AppendNewInstance (new _Operation (curOp,twoOrOne));
+                if (terminateExecution) {
+                    return HY_FORMULA_FAILED;
+                }
+                continue;
+            }
+
+            // check operation precedence
+
+            long h,g;
+            _String prevOp = *((((_Operation*)((*levelOps)(levelOps->countitems()-1)))->GetCode()));
+
+            h = BinOps.Find(prevOp.sLength==2?prevOp.getChar(0)*256+prevOp.getChar(1):prevOp.getChar(0));
+            g = BinOps.Find(curOp.sLength==2?curOp.getChar(0)*256+curOp.getChar(1):curOp.getChar(0));
+
+            if (h!=-1) {
+                h = opPrecedence (h);
+            }
+
+            g = opPrecedence (g);
+
+
+
+            if (g>h && h!=-1) { // store the op, don't do it yet!
+                levelOps->AppendNewInstance (new _Operation (curOp,twoOrOne));
+                if (terminateExecution) {
+                    return HY_FORMULA_FAILED;
+                }
+                continue;
+            }
+
+            // do the stored operations now
+
+            for (int j = levelOps->countitems()-1; j>=0; j--) {
+                _String  sss = (((_Operation*)((*levelOps)(levelOps->countitems()-1)))->GetCode());
+                h = BinOps.Find(sss.sLength==2?sss.getChar(0)*256+sss.getChar(1):sss.getChar(0));
+                if (h==-1) {
+                    h=100;
+                } else {
+                    h = opPrecedence (h);
+                }
+
+                if (h<g) {
+                    break;
+                }
+                f->theFormula&&((*levelOps)(j));
+                levelOps->Delete((*levelOps).lLength-1);
+            }
+            levelOps->AppendNewInstance (new _Operation (curOp,twoOrOne));
+            if (terminateExecution) {
+                return HY_FORMULA_FAILED;
+            }
+            continue;
+        } else if (UnOps.Find(s.getChar(i)) >= 0) {
+            if ((s.getChar(i)=='-' || s.getChar(i)=='+') && (!i|| s.getChar(i-1)=='(')) { // unary minus?
+                curOp   = s.getChar(i);
+                levelOps->AppendNewInstance (new _Operation (curOp,1));
+                continue;
+            } else {
+                if (HalfOps.contains(s.getChar(i))) {
+                    twoToken = true;
+                    continue;
+                }
+                return HandleFormulaParsingError ("Bad binary operator placement ", parsingContext.errMsg(), s, i);
+            }
+        } else {
+            if (!HalfOps.contains(s.getChar(i))) {
+                return HandleFormulaParsingError ("Unexpected symbol ", parsingContext.errMsg(), s, i);
+            } else {
+                twoToken = true;
+            }
+
+        }
+    }
+    return HY_FORMULA_EXPRESSION;
+}
+//__________________________________________________________________________________
+
+long     VerbosityLevel (void)
+{
+    checkParameter (VerbosityLevelString, verbosityLevel, -1.0);
+    return verbosityLevel;
+}
+
+//__________________________________________________________________________________
+void  checkParameter (_String& name, _Parameter& dest, _Parameter def, _VariableContainer* theP)
+{
+    long f;
+    if (theP) {
+        _String ppn = *theP->GetName() & '.' & name;
+        f = LocateVarByName(ppn);
+    } else {
+        f = LocateVarByName (name);
+    }
+    if (f<0) {
+        dest = def;
+    } else {
+        dest = FetchVar(f)->Value();
+    }
+}
+
+//__________________________________________________________________________________
+void  stashParameter (_String& name, _Parameter v, bool set)
+{
+    static  _Parameter stash = 0.0;
+
+    long f = LocateVarByName (name);
+    if (f>=0) {
+        _Variable *thisV = FetchVar(f);
+        if (set) {
+            stash = thisV->Value();
+            _Constant dummy (v);
+            thisV->SetValue (&dummy);
+        } else {
+            _Constant dummy (stash);
+            thisV->SetValue (&dummy);
+        }
+    } else if (set) {
+        stash = v;
+        setParameter (name,v);
+    }
+}
+
+
+//__________________________________________________________________________________
+void  setParameter (_String& name, _Parameter def, _String* namespc)
+{
+    if (namespc) {
+        _String namespcd = AppendContainerName(name,namespc);
+        setParameter (namespcd,def);
+    } else {
+        long f = LocateVarByName (name);
+        if (f<0) {
+            _Variable cornholio(name);
+            setParameter (name,def);
+        } else {
+            FetchVar(f)->SetValue(new _Constant (def), false);
+        }
+    }
+}
+
+//__________________________________________________________________________________
+
+void  setParameter (_String& name, _PMathObj def, bool dup, _String* namespc)
+{
+    if (namespc) {
+        _String namespcd = AppendContainerName(name,namespc);
+        setParameter (namespcd,def,dup);
+    } else {
+        long f = LocateVarByName (name);
+        if (f<0) {
+            _Variable cornholio(name);
+            setParameter (name,def,dup);
+        } else {
+            FetchVar(f)->SetValue(def,dup);
+        }
+    }
+}
+
+//__________________________________________________________________________________
+
+void ExportIndVariables (_String& glVars, _String& locVars, _SimpleList* indepVarList)
+{
+    _String * stIn,
+              str;
+             
+    for (unsigned long   i=0; i<indepVarList->lLength; i++) {
+        _Variable *thisVar = LocateVar(indepVarList->lData[i]);
+        if (thisVar->IsGlobal()) {
+            str = _String ("\nglobal ") & *thisVar->GetName() & '=' & _String((_String*)parameterToString(thisVar->Compute()->Value())) & ';';
+            stIn = &glVars;
+        } else {
+            str = _String ("\n") & *thisVar->GetName() & '=' & _String((_String*)parameterToString(thisVar->Compute()->Value())) & ';';
+            stIn = &locVars;
+        }
+        *stIn << str;
+        if (!CheckEqual(thisVar->GetLowerBound(),DEFAULTPARAMETERLBOUND)) {
+            str = _String ("\n") & *thisVar->GetName() & ":>" & _String((_String*)parameterToString(thisVar->GetLowerBound())) & ';';
+            *stIn << str;
+        }
+        if (!CheckEqual(thisVar->GetUpperBound(),DEFAULTPARAMETERUBOUND)) {
+            str = _String ("\n") & *thisVar->GetName() & ":<" & _String((_String*)parameterToString(thisVar->GetUpperBound())) & ';';
+            *stIn << str;
+        }
+    }
+}
+
+//__________________________________________________________________________________
+
+void ExportDepVariables (_String& glVars, _String& locVars, _SimpleList* depVarList)
+{
+    if (depVarList->lLength) {
+        _String * stIn,
+                  str;
+
+        /* first we have to reorder global variables, so that dependent global variables which depend
+           on other dependent global variables are written afterwards (lest they be implicitly declared 
+           as local).
+           The algorithm is very ugly, but since there are only a few global dependent variables (in general...) */
+
+        _SimpleList     _globalVariablesList,
+                        lfDepGlobs,
+                        tl1;
+
+        _List           dependancyLists;
+        {
+            for (unsigned long i=0; i<depVarList->lLength; i++)
+                if (LocateVar(depVarList->lData[i])->IsGlobal()) {
+                    lfDepGlobs << depVarList->lData[i];
+                }
+        }
+        lfDepGlobs.Sort();
+
+        for (unsigned long i=0; i<depVarList->lLength; i++) {
+            _Variable * thisVar = LocateVar(depVarList->lData[i]);
+            if (thisVar->IsGlobal()) {
+                _SimpleList                 globDependancyList,
+                                            prunedList;
+
+                _AVLList                    globDependancyListAVL (&globDependancyList);
+
+                thisVar->ScanForVariables (globDependancyListAVL,true);
+
+                globDependancyListAVL.ReorderList ();
+
+                prunedList.Intersect (globDependancyList,lfDepGlobs);
+
+                if (prunedList.lLength) {
+                    _globalVariablesList << i;
+                    dependancyLists && & prunedList;
+                    continue;
+                }
+                str = _String("\nglobal ") & *thisVar->GetName();
+                stIn = &glVars;
+            } else {
+                str = _String("\n") & *thisVar->GetName();
+                 stIn = &locVars;
+            }
+            (*stIn)<<str;
+            (*stIn)<<":=";
+            stIn->AppendNewInstance(thisVar->GetFormulaString());
+            (*stIn)<<';';
+            if (!CheckEqual(thisVar->GetLowerBound(),DEFAULTPARAMETERLBOUND)) {
+                str = _String ("\n") & *thisVar->GetName() & ":>" & _String((_String*)parameterToString(thisVar->GetLowerBound())) & ';';
+                (*stIn)<<str;
+            }
+            if (!CheckEqual(thisVar->GetUpperBound(),DEFAULTPARAMETERUBOUND)) {
+                str = _String ("\n") & *thisVar->GetName() & ":<" & _String((_String*)parameterToString(thisVar->GetUpperBound())) & ';';
+                (*stIn)<<str;
+            }
+        }
+
+        if (_globalVariablesList.lLength)
+            // check internal dependancies
+        {
+            _SimpleList writeOrder (_globalVariablesList.lLength,0,1),
+                        indexList  (_globalVariablesList.lLength,0,1);
+
+
+            for (unsigned long i2 = 0; i2 < _globalVariablesList.lLength; i2++) {
+                long updatedIndex = writeOrder.lData[i2];
+                _SimpleList * depList = (_SimpleList*)dependancyLists(i2);
+                for (unsigned long i3 = 0; i3 < depList->lLength; i3 ++) {
+                    long i4 = _globalVariablesList.Find (depList->lData[i3]);
+                    if (i4 >= 0 && updatedIndex < writeOrder.lData[i4]) {
+                        updatedIndex = writeOrder.lData[i4] + 1;
+                    }
+                }
+                writeOrder.lData[i2] = updatedIndex;
+            }
+
+            SortLists (&writeOrder, &indexList);
+
+            for (unsigned long i=0; i<_globalVariablesList.lLength; i++) {
+                _Variable * thisVar = LocateVar(depVarList->lData[_globalVariablesList.lData[indexList.lData[i]]]);
+                str = _String("\nglobal ") & *thisVar->GetName();
+                glVars<<str;
+                glVars<<":=";
+                glVars<< thisVar->GetFormulaString();
+                glVars<<';';
+                if (!CheckEqual(thisVar->GetLowerBound(),DEFAULTPARAMETERLBOUND)) {
+                    str = _String ("\n") & *thisVar->GetName() & ":>" & _String((_String*)parameterToString(thisVar->GetLowerBound())) & ';';
+                    glVars<<str;
+                }
+                if (!CheckEqual(thisVar->GetUpperBound(),DEFAULTPARAMETERUBOUND)) {
+                    str = _String ("\n") & *thisVar->GetName() & ":<" & _String((_String*)parameterToString(thisVar->GetUpperBound())) & ';';
+                    glVars<<str;
+                }
+            }
+        }
+    }
+}
+
+//__________________________________________________________________________________
+
+void ExportCatVariables (_String& rec, _SimpleList* catVarList)
+{
+    _SimpleList     nonInd;
+
+    for (long idx = 0; idx < catVarList->lLength; idx++)
+        if (((_CategoryVariable*)LocateVar(catVarList->lData[idx]))->IsUncorrelated()) {
+            ((_CategoryVariable*)LocateVar(catVarList->lData[idx]))->SerializeCategory (rec);
+        } else {
+            nonInd << idx;
+        }
+    {
+        for (long idx = 0; idx < nonInd.lLength; idx++) {
+            ((_CategoryVariable*)LocateVar(catVarList->lData[nonInd.lData[idx]]))->SerializeCategory (rec);
+        }
+    }
+}
+
+//__________________________________________________________________________________
+
+void SplitVariablesIntoClasses (_SimpleList& all, _SimpleList& i, _SimpleList& d, _SimpleList& c)
+{
+    for (long idx = 0; idx < all.lLength; idx++) {
+        _Variable* thisVar = LocateVar (all.lData[idx]);
+        if (thisVar->IsCategory()) {
+            c << all.lData[idx];
+        } else if (thisVar->IsIndependent()) {
+            i << all.lData[idx];
+        } else {
+            d << all.lData[idx];
+        }
+    }
+}
diff --git a/src/core/polynoml.cpp b/src/core/polynoml.cpp
new file mode 100644
index 0000000..236001c
--- /dev/null
+++ b/src/core/polynoml.cpp
@@ -0,0 +1,2858 @@
+/*
+
+HyPhy - Hypothesis Testing Using Phylogenies.
+
+Copyright (C) 1997-2009
+  Sergei L Kosakovsky Pond (spond at ucsd.edu)
+  Art FY Poon              (apoon at cfenet.ubc.ca)
+
+Permission is hereby granted, free of charge, to any person obtaining a
+copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be included
+in all copies or substantial portions of the Software.
+
+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.
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+*/
+
+#include "string.h"
+#include "math.h"
+#include "stdlib.h"
+#include "polynoml.h"
+#ifdef    __HYPHYDMALLOC__
+#include "dmalloc.h"
+#endif
+
+
+//_String polyBOperations ("+-*^"), polyUOperations ("-");
+
+_Parameter dropPrecision        = log(1e-9),
+           drop2Precision      = log(1e-18),
+           topPolyCap           = 5.0,
+           dropTerms          = 1.0,
+           enforcePolyCap      = 1.0,
+           *varCheckArray       = nil,
+            dropThreshold        = 0.0,
+            maximumPolyTermsPerVariable  = 500,
+            maxPolynomialExpIterates     = 20,
+            polynomialExpPrecision         = 1e-10;
+
+long       varCheckAllocated  = 0,
+           polyTermCap        = 0x1fffffff;
+
+bool       checkReset         = true;
+
+
+//__________________________________________________________________________________
+_PolynomialData::_PolynomialData (void)
+{
+    theCoeff = nil;
+    thePowers = nil;
+    numberVars = 0;
+    actTerms = 0;
+    allocTerms = 0;
+}
+
+//__________________________________________________________________________________
+_PolynomialData::_PolynomialData (long vars)
+{
+    numberVars = vars>=0?vars:0;
+    theCoeff = (_Parameter*)MemAllocate (sizeof(_Parameter)*POLY_DATA_INCREMENT);
+    if (numberVars) {
+        thePowers =  (long*)MemAllocate (sizeof(long)*POLY_DATA_INCREMENT*vars);
+    } else {
+        thePowers = nil;
+    }
+    allocTerms = POLY_DATA_INCREMENT;
+    actTerms = 0;
+}
+
+//__________________________________________________________________________________
+_PolynomialData::_PolynomialData (_PolynomialData& source)
+{
+    Duplicate(&source);
+}
+
+//__________________________________________________________________________________
+_PolynomialData::_PolynomialData (long vars, long terms, _Parameter* theCoeffs)
+{
+    numberVars = vars>=0?vars:0;
+    allocTerms = (terms/POLY_DATA_INCREMENT+1)*POLY_DATA_INCREMENT;
+    actTerms = terms;
+    theCoeff = (_Parameter*)MemAllocate (sizeof(_Parameter)*allocTerms);
+    memcpy (theCoeff,theCoeffs,sizeof(_Parameter)*terms);
+    thePowers = nil;
+}
+
+//__________________________________________________________________________________
+_PolynomialData::~_PolynomialData (void)
+{
+    if (nInstances<=1) {
+        if (theCoeff) {
+            free (theCoeff);
+        }
+        if (thePowers) {
+            free (thePowers);
+        }
+        allocTerms = 0;
+        actTerms = 0;
+    }
+}
+
+//__________________________________________________________________________________
+BaseRef _PolynomialData::makeDynamic (void)
+{
+    _PolynomialData *ret = new _PolynomialData;
+    checkPointer(ret);
+    nInstances++;
+    ret->allocTerms = allocTerms;
+    ret->actTerms = actTerms;
+    ret->numberVars = numberVars;
+    ret->theCoeff = theCoeff;
+    ret->thePowers = thePowers;
+    return ret;
+}
+
+//__________________________________________________________________________________
+void _PolynomialData::Duplicate (BaseRef source)
+{
+    _PolynomialData *s = (_PolynomialData*)source;
+    nInstances=1;
+    allocTerms = s->allocTerms;
+    actTerms = s->actTerms;
+    numberVars = s->numberVars;
+    if (actTerms) {
+        theCoeff = (_Parameter*)MemAllocate (sizeof(_Parameter)*allocTerms);
+        memcpy (theCoeff, s->theCoeff, sizeof (_Parameter)*actTerms);
+        if (numberVars) {
+            thePowers = (long*)MemAllocate (sizeof(long)*allocTerms*numberVars);
+            memcpy (thePowers, s->thePowers, sizeof(long)*actTerms*numberVars);
+        } else {
+            thePowers = nil;
+        }
+
+    } else {
+        thePowers = nil;
+        theCoeff = nil;
+    }
+}
+
+//__________________________________________________________________________________
+bool    _PolynomialData::checkMe (void)
+{
+    if (actTerms>1) {
+        long *t1 = GetTerm(0),
+              *t2;
+        for (long i=1; i<actTerms; i++) {
+            t2 = GetTerm(i);
+            if (CompareTerms (t1,t2)>=0) {
+                WarnError ("\n Internal polynomial error!");
+                return false;
+            }
+            t1 = t2;
+        }
+    }
+    return true;
+}
+//__________________________________________________________________________________
+long*   _PolynomialData::GetTerm (long index)
+{
+    return thePowers+index*numberVars;
+}
+
+//__________________________________________________________________________________
+void    _PolynomialData::AddTerm (long * theTerm, _Parameter theC)
+{
+    if (!(allocTerms-actTerms)) { // no space left - reallocate
+        allocTerms+=POLY_DATA_INCREMENT;
+        if (theCoeff) {
+            theCoeff = (_Parameter*)MemReallocate ((char*)theCoeff, allocTerms*sizeof(_Parameter));
+        } else {
+            theCoeff = (_Parameter*)MemAllocate (allocTerms*sizeof(_Parameter));
+        }
+        if (numberVars) {
+            if (thePowers) {
+                thePowers = (long*)MemReallocate ((char*)thePowers, allocTerms*sizeof(long)*numberVars);
+            } else {
+                thePowers = (long*)MemAllocate (allocTerms*sizeof(long)*numberVars);
+            }
+        }
+    }
+    theCoeff[actTerms] = theC;
+    if (numberVars>2) {
+        long *stTerm = thePowers+actTerms*numberVars;
+        for (long i=0; i<numberVars; i++,theTerm++,stTerm++) {
+            *stTerm=*theTerm;
+        }
+//      memcpy (thePowers+actTerms*numberVars, theTerm, numberVars*sizeof(long));
+    } else {
+        if (numberVars == 2) {
+            *(thePowers+actTerms*numberVars) = *theTerm;
+            *(thePowers+actTerms*numberVars+1) = *(theTerm+1);
+        } else if (numberVars == 1) {
+            *(thePowers+actTerms*numberVars) = *theTerm;
+        }
+    }
+    actTerms++;
+
+}
+
+//__________________________________________________________________________________
+void    _PolynomialData::WriteTerm (long * theTerm, long index)
+{
+    if (numberVars>2) {
+        long *stTerm = thePowers+index*numberVars;
+        for (long i=0; i<numberVars; i++,theTerm++,stTerm++) {
+            *stTerm=*theTerm;
+        }
+//      memcpy (thePowers+index*numberVars, theTerm, numberVars*sizeof(long));
+    } else {
+        if (numberVars == 2) {
+            *(thePowers+index*numberVars) = *theTerm;
+            *(thePowers+index*numberVars+1) = *(theTerm+1);
+        } else if (numberVars == 1) {
+            *(thePowers+index*numberVars) = *theTerm;
+        }
+    }
+    actTerms++;
+
+}
+
+//__________________________________________________________________________________
+void    _PolynomialData::AddTerm (long * theTerm, _Parameter theC, long* reindexer, long actLength)
+{
+    if (!(allocTerms-actTerms)) { // no space left - reallocate
+        allocTerms+=POLY_DATA_INCREMENT;
+        if (theCoeff) {
+            theCoeff = (_Parameter*)MemReallocate ((char*)theCoeff, allocTerms*sizeof(_Parameter));
+        } else {
+            theCoeff = (_Parameter*)MemAllocate (allocTerms*sizeof(_Parameter));
+        }
+        if (numberVars) {
+            if (thePowers) {
+                thePowers = (long*)MemReallocate ((char*)thePowers, allocTerms*sizeof(long)*numberVars);
+            } else {
+                thePowers = (long*)MemAllocate (allocTerms*sizeof(long)*numberVars);
+            }
+        }
+    }
+    theCoeff[actTerms] = theC;
+    if (numberVars>2) {
+        long *newTerm = thePowers+actTerms*numberVars;
+        for (long i=0; i<numberVars; i++) {
+            newTerm[i] = 0L;
+        }
+ 
+        for (long i=0; i<actLength; i++) {
+            newTerm[reindexer[i]] = theTerm[i];
+        }
+
+    } else {
+        *(thePowers+actTerms*numberVars) = 0;
+        *(thePowers+actTerms*numberVars+1) = 0;
+        *(thePowers+actTerms*numberVars+*reindexer) = *theTerm;
+    }
+    actTerms++;
+
+}
+
+//__________________________________________________________________________________
+void    _PolynomialData::AddTerm (_Parameter theC)
+{
+    if (numberVars==0) {
+        AddTerm (nil,0);
+    } else {
+        if (!(allocTerms-actTerms)) { // no space left - reallocate
+            allocTerms+=POLY_DATA_INCREMENT;
+            if (theCoeff) {
+                theCoeff = (_Parameter*)MemReallocate ((char*)theCoeff, allocTerms*sizeof(_Parameter));
+            } else {
+                theCoeff = (_Parameter*)MemAllocate (allocTerms*sizeof(_Parameter));
+            }
+            if (numberVars) {
+                if (thePowers) {
+                    thePowers = (long*)MemReallocate ((char*)thePowers, allocTerms*sizeof(long)*numberVars);
+                } else {
+                    thePowers = (long*)MemAllocate (allocTerms*sizeof(long)*numberVars);
+                }
+            }
+        }
+        memmove (thePowers+numberVars,thePowers, numberVars*actTerms*sizeof(long));
+        memmove (theCoeff+1,theCoeff,sizeof(_Parameter)*actTerms);
+        *theCoeff = theC;
+        for (long i=0; i<numberVars; *thePowers=0,i++,thePowers++) {}
+        thePowers-=numberVars;
+//      memset (thePowers,0,numberVars*sizeof(long));
+        actTerms++;
+    }
+
+}
+
+
+//__________________________________________________________________________________
+void    _PolynomialData::DeleteTerm (long index)
+{
+    actTerms--;
+    if (index!=actTerms) { // shift stuff
+        memmove ((void*)(theCoeff+index), (void*)(theCoeff+index+1), (actTerms-index)*sizeof(_Parameter));
+        if (numberVars)
+            memmove ((void*)(thePowers+index*numberVars), (void*)(thePowers+(1+index)*numberVars),
+                     (actTerms-index)*numberVars*sizeof(long));
+    }
+    if (allocTerms-actTerms>POLY_DATA_INCREMENT) {
+        allocTerms-=POLY_DATA_INCREMENT;
+        theCoeff = (_Parameter*)MemReallocate ((char*)theCoeff, allocTerms*sizeof(_Parameter));
+        if (numberVars) {
+            thePowers = (long*)MemReallocate ((char*)thePowers, allocTerms*sizeof(long)*numberVars);
+        }
+    }
+}
+
+//__________________________________________________________________________________
+long    _PolynomialData::SumOfPowers (long index)
+{
+    if (numberVars) {
+        long* theTerm = GetTerm (index), res = 0;
+        for (long i=0; i<numberVars; i++, theTerm++) {
+            res+=*theTerm;
+        }
+        return res;
+    }
+    return 0;
+}
+
+//__________________________________________________________________________________
+long    _PolynomialData::WeightedSumOfPowers (long index, _Parameter* w)
+{
+    if (numberVars) {
+        long* theTerm = GetTerm (index), res = 0;
+        for (long i=0; i<numberVars; i++, theTerm++, w++) {
+            res+=((_Parameter)*theTerm)**w;
+        }
+        return res;
+    }
+    return 0;
+}
+
+//__________________________________________________________________________________
+bool    _PolynomialData::IsFirstANumber (void)
+{
+    long* fst = GetTerm(0);
+    for (long i=0; i<numberVars; i++)
+        if (fst[i]) {
+            return false;
+        }
+
+    return true;
+}
+
+
+//__________________________________________________________________________________
+void    _PolynomialData::MultiplyTerms (long* target, long* s1, long* s2)
+{
+    for (long i=0; i<numberVars; i++,target++,s1++,s2++) {
+        *target = *s1+*s2;
+    }
+}
+
+//__________________________________________________________________________________
+void    _PolynomialData::RaiseTerm (long* target, long power)
+{
+    for (long i=0; i<numberVars; i++,target++) {
+        *target *= power;
+    }
+}
+
+//__________________________________________________________________________________
+_Parameter  _PolynomialData::BinaryRaise (_Parameter base, long pwr)
+{
+    _Parameter result = 1;
+    char bits[sizeof(long)*8];
+    unsigned char nLength = 0;
+    while (pwr) {
+        bits[nLength]=pwr%2;
+        pwr/=2;
+        nLength++;
+    }
+    while (nLength) {
+        nLength--;
+        if (bits[nLength]) {
+            result*=base;
+        }
+        if (nLength) {
+            result*=result;
+        }
+    }
+    return result;
+}
+
+//__________________________________________________________________________________
+long    _PolynomialData::FindTerm (long* theTerm,long* reIndex, long start)
+{
+    long top=actTerms-1, bottom=start, middle;
+    char comp;
+
+    if (top==-1) {
+        return -2;
+    }
+
+    while (top>bottom) {
+        middle = (top+bottom)/2;
+        // compare the two
+        comp = CompareTerms (GetTerm (reIndex[middle]), theTerm);
+        if (comp==1) {
+            top = middle==top?top-1:middle;
+        } else if (comp==-1) {
+            bottom = middle==bottom?bottom+1:middle;
+        } else {
+            return middle;
+        }
+
+
+    }
+    middle = top;
+    comp = CompareTerms (GetTerm (reIndex[middle]), theTerm);
+    if (!comp) {
+        return middle;
+    }
+    return comp<0?-middle-3:-middle-2;
+}
+
+//__________________________________________________________________________________
+void    _PolynomialData::ResortTerms (long* reIndex)
+{
+    long i,j,*source,*target, deleted = 0;
+
+    _Parameter* newCoeff = (_Parameter*)MemAllocate (allocTerms*sizeof(_Parameter));
+    long*       newPowers = (long*)MemAllocate(allocTerms*numberVars*sizeof(long));
+
+    // pass 1 to check for deletions
+    for (i=0; i<actTerms; i++, reIndex++) {
+        if (checkTerm (theCoeff[*reIndex], *reIndex)) {
+            newCoeff[i] = theCoeff[*reIndex];
+        } else {
+            newCoeff[i]=0.0;
+        }
+    }
+
+    reIndex-=actTerms;
+    // pass 2 copy
+    for (i=0; i<actTerms; i++, newCoeff++, reIndex++) {
+        if (*newCoeff!=0.0) {
+            if (deleted) {
+                *(newCoeff-deleted)=*newCoeff;
+            }
+            target = newPowers+numberVars*(i-deleted);
+            source = thePowers+numberVars*(*reIndex);
+            for (j=0; j<numberVars; j++,source++,target++) {
+                *target = *source;
+            }
+        } else {
+            deleted++;
+        }
+    }
+    free (theCoeff);
+    free (thePowers);
+    theCoeff = newCoeff-actTerms;
+    thePowers = newPowers;
+    actTerms -= deleted;
+    if (allocTerms-actTerms>POLY_DATA_INCREMENT) {
+        long theCut = ((allocTerms-actTerms)/POLY_DATA_INCREMENT)*POLY_DATA_INCREMENT;
+        allocTerms-=theCut;
+        theCoeff = (_Parameter*)MemReallocate ((char*)theCoeff, allocTerms*sizeof(_Parameter));
+        if (numberVars) {
+            thePowers = (long*)MemReallocate ((char*)thePowers, allocTerms*sizeof(long)*numberVars);
+        }
+    }
+
+}
+//__________________________________________________________________________________
+void    _PolynomialData::ChopTerms (void)
+{
+    long maxAllowedTerms = maximumPolyTermsPerVariable*numberVars;
+    if (actTerms<=maxAllowedTerms) {
+        return;    // nothing to do
+    } else {
+        _SimpleList terms, index;
+        long i,*qa,k,j;
+        _Parameter  logTop = log(topPolyCap),*qc;
+        for (i = 0; i<actTerms; i++,theCoeff++) {
+            index<<i;
+            terms<<(long)(log(fabs(*theCoeff))+logTop*SumOfPowers(i));
+        }
+        SortLists (&terms,&index);
+        terms.Clear();
+        theCoeff -= actTerms;
+        qa = index.quickArrayAccess()+maxAllowedTerms;
+        for (i=maxAllowedTerms; i<actTerms; i++,qa++) {
+            theCoeff[*qa] = 0.0;
+        }
+
+        allocTerms = (maxAllowedTerms/POLY_DATA_INCREMENT+1)*POLY_DATA_INCREMENT;
+        _Parameter* newCoeff = (_Parameter*)MemAllocate (allocTerms*sizeof(_Parameter)),*nP = newCoeff;
+        long*       newPowers = (long*)MemAllocate(allocTerms*numberVars*sizeof(long)), *target, *source;
+
+        target = newPowers;
+        source = thePowers;
+        k = 0;
+        qc = GetCoeff();
+        for (i=0; i<actTerms; i++, qc++, source+=numberVars) {
+            if (*qc!=0.0) {
+                *nP = *qc;
+                nP++;
+                for (j=0; j<numberVars; j++,source++,target++) {
+                    *target = *source;
+                }
+            } else {
+                k++;
+            }
+        }
+        free (theCoeff);
+        free (thePowers);
+        theCoeff = newCoeff;
+        thePowers = newPowers;
+        actTerms -= k;
+    }
+
+}
+
+//__________________________________________________________________________________
+void  _PolynomialData::RearrangeTerm (long* target, long* source, long* markup, long items)
+{
+    for (long i=0; i<items; i++, source++, markup++) {
+        target[*markup] = *source;
+    }
+}
+//__________________________________________________________________________________
+char    _PolynomialData::CompareTerms (long* s1, long* s2)
+{
+    for (long i=0; i<numberVars; i++) {
+        long comp = s1[i]-s2[i];
+        if (comp>0L) {
+            return 1;
+        }
+        if (comp<0L) {
+            return -1;
+        }
+    }
+    return 0;
+}
+
+//__________________________________________________________________________________
+char    _PolynomialData::CompareTerms (long* s1, long* s2, long* secondReindex, long actLength)
+{
+    long second_index = 0;
+    for (long k = 0L; k < numberVars; k++) {
+      long v1 = s1[k],
+            v2 = 0;
+      if (second_index < actLength && k == secondReindex[second_index]) {
+        v2 = s2[second_index];
+        second_index++;
+      }
+      
+      if (v1 != v2) {
+        return v1 > v2 ? 1 : -1;
+      }
+    }
+  
+    return 0;
+  
+    /*long comp,i;
+  
+    for (i=0; i<actLength; i++,s1++,s2++,secondReindex++) {
+        comp = *secondReindex-i;
+        if (comp>0) {
+            if (*s1) {
+                return 1;
+            } else {
+                s2--;
+                secondReindex--;
+                actLength++;
+                continue;
+            }
+        }
+        comp = *s1-*s2;
+        if (comp>0) {
+            return 1;
+        }
+        if (comp<0) {
+            return -1;
+        }
+    }
+    for (; i<numberVars; i++,s1++) {
+        if (*s1) {
+            return 1;
+        }
+    }
+    return 0;*/
+}
+
+//__________________________________________________________________________________
+char    _PolynomialData::CompareTerms (long* s1, long* s2, long* firstReindex, long* secondReindex,long actLength1,  long actLength2)
+{
+    long first_index = 0L,
+         second_index = 0L,
+         k;
+  
+    for (k = 0; k < numberVars; k ++) {
+      
+      long v1 = 0,
+           v2 = 0;
+      
+      if (first_index < actLength1) {
+        if (k == firstReindex[first_index]) {
+          v1 = s1 [first_index];
+          first_index ++;
+        }
+      }
+
+      if (second_index < actLength2) {
+        if (k == secondReindex[second_index]) {
+          v2 = s2 [second_index];
+          second_index ++;
+        }
+      }
+      
+      if (v1 != v2) {
+        return v1 < v2 ? -1 : 1;
+      }
+      
+    }
+      
+    return 0;
+  
+    /*bool secondLonger = actLength1<actLength2,
+         firstLonger  = actLength1>actLength2;
+
+    long minLength = actLength1<actLength2?actLength1:actLength2,
+         i;
+
+    for (i=0; i<minLength; i++,s1++,s2++,firstReindex++,secondReindex++) {
+        long comp = *firstReindex-*secondReindex;
+        if (comp<0) {
+            if (*s1) {
+                return 1;
+            }
+            secondReindex--;
+            s2--;
+
+            if (firstLonger && minLength!=actLength1) {
+                minLength++;
+            }
+
+            continue;
+        }
+        if (comp>0) {
+            if (*s2) {
+                return -1;
+            }
+            firstReindex--;
+            s1--;
+
+            if (minLength!=actLength2 && secondLonger) {
+                minLength++;
+            }
+            continue;
+        }
+
+        comp = *s1-*s2;
+        if (comp>0) {
+            return 1;
+        }
+        if (comp<0) {
+            return -1;
+        }
+    }
+    if (actLength1>minLength)
+        for (; i<actLength1; i++,s1++) {
+            if (*s1) {
+                return 1;
+            }
+        }
+    else
+        for (; i<actLength2; i++,s2++) {
+            if (*s2) {
+                return -1;
+            }
+        }
+    return 0;*/
+}
+
+//__________________________________________________________________________________
+bool        _PolynomialData::checkTerm (_Parameter myCoeff, long myIndex)
+{
+    if (myCoeff==0.0) { // delete in any case
+        return false;
+    }
+    if (checkReset) {
+        checkReset = false;
+        dropThreshold = dropPrecision+log(fabs(myCoeff));
+        if (dropThreshold<drop2Precision) {
+            dropThreshold = drop2Precision;
+            if (enforcePolyCap) {
+                dropThreshold += SumOfPowers(myIndex)*log(topPolyCap);
+            } else {
+                dropThreshold += WeightedSumOfPowers(myIndex,varCheckArray);
+            }
+            return false;
+        }
+        if (enforcePolyCap) {
+            dropThreshold += SumOfPowers(myIndex)*log(topPolyCap);
+        } else {
+            dropThreshold += WeightedSumOfPowers(myIndex,varCheckArray);
+        }
+        return true;
+
+    }
+    if (dropTerms) {
+        if (enforcePolyCap) {
+            if (log(fabs(myCoeff))+log(topPolyCap)*(_Parameter)(SumOfPowers(myIndex))<dropThreshold) {
+                return false;
+            }
+        } else if (enforcePolyCap) {
+            if (log(fabs(myCoeff))+WeightedSumOfPowers(myIndex,varCheckArray)<dropThreshold) {
+                return false;
+            }
+        }
+    }
+    return true;
+}
+
+//__________________________________________________________________________________
+
+_Polynomial::_Polynomial (void)
+{
+    theTerms = new _PolynomialData;
+    checkPointer(theTerms);
+}
+
+//__________________________________________________________________________________
+
+_Polynomial::_Polynomial (_SimpleList& vars)
+{
+    variableIndex.Duplicate (&vars);
+    theTerms = new _PolynomialData (vars.countitems());
+    checkPointer(theTerms);
+}
+
+//__________________________________________________________________________________
+
+_Polynomial::_Polynomial (_Parameter value)
+// a constant polynomial
+{
+    theTerms = new _PolynomialData;
+    checkPointer(theTerms);
+    theTerms->AddTerm (nil, value);
+}
+
+//__________________________________________________________________________________
+
+_Polynomial::_Polynomial (_Variable& v)
+// a monic monomial
+{
+    variableIndex<<v.GetIndex();
+    theTerms = new _PolynomialData (1);
+    checkPointer(theTerms);
+    long  vIndex = 1;
+    theTerms->AddTerm (&vIndex,1.0);
+}
+
+//__________________________________________________________________________________
+
+_Polynomial::_Polynomial (_Polynomial& p)
+{
+    variableIndex.Duplicate (&p.variableIndex);
+    theTerms = new _PolynomialData;
+    checkPointer(theTerms);
+    if (p.theTerms) {
+        theTerms->Duplicate (p.theTerms);
+    } else {
+        theTerms->numberVars = variableIndex.countitems();
+    }
+    compList1.Duplicate (&p.compList1);
+    compList2.Duplicate (&p.compList2);
+}
+
+//__________________________________________________________________________________
+
+_Polynomial::~_Polynomial ()
+{
+    if (theTerms) {
+        DeleteObject(theTerms);
+    }
+}
+
+//__________________________________________________________________________________
+
+BaseObj*    _Polynomial::makeDynamic(void)
+{
+    _Polynomial* res = new _Polynomial;
+    checkPointer(res);
+
+    res->variableIndex.Duplicate (&variableIndex);
+    res->compList1.Duplicate (&compList1);
+    res->compList2.Duplicate (&compList2);
+
+    if (theTerms) {
+        res->theTerms->Duplicate (theTerms);
+    } else {
+        DeleteObject (res->theTerms);
+        res->theTerms = nil;
+    }
+    return res;
+}
+
+//__________________________________________________________________________________
+
+void    _Polynomial::Duplicate  (BaseRef tp)
+{
+    _Polynomial* p = (_Polynomial*)tp;
+    variableIndex.Clear();
+    variableIndex.Duplicate (&p->variableIndex);
+    compList1.Duplicate (&p->compList1);
+    compList2.Duplicate (&p->compList2);
+    DeleteObject(theTerms);
+    if (p->theTerms) {
+        theTerms =  new _PolynomialData (*(p->theTerms));
+        checkPointer(theTerms);
+    }
+}
+//__________________________________________________________________________________
+
+
+_PMathObj _Polynomial::Execute (long opCode, _PMathObj p, _PMathObj, _hyExecutionContext* context)   // execute this operation with the second arg if necessary
+{
+    switch (opCode) {
+    case HY_OP_CODE_MUL: //*
+        if (p)
+            return Mult(p);
+        break;
+    case HY_OP_CODE_ADD: // +
+        if (p) {
+            return Add(p);
+        } else {
+            return Sum ();
+        }
+        break;
+    case HY_OP_CODE_SUB: // -
+        if (p) {
+            return Sub(p);
+        } else {
+            return Minus();
+        }
+        break;
+    case HY_OP_CODE_TYPE: // Type
+        return Type();
+        break;
+    case HY_OP_CODE_POWER: // ^
+        if (p)
+            Raise(p);
+        break;
+    }
+
+    WarnNotDefined (this, opCode, context);
+    return nil;
+
+}
+
+//__________________________________________________________________________________
+_MathObject*    _Polynomial::IsANumber (bool returnLeading)
+{
+    long nV = variableIndex.countitems();
+    if (!nV) {
+        if (theTerms->NumberOfTerms()>0) {
+            return new _Constant(theTerms->theCoeff[0]);
+        } else {
+            return new _Constant(0.0);
+        }
+
+    }
+    if (theTerms->NumberOfTerms()<=1) {
+        if (theTerms->NumberOfTerms()==0) {
+            return new _Constant(0.0);
+        }
+        if (theTerms->IsFirstANumber() || returnLeading) {
+            return new _Constant(theTerms->theCoeff[0]);
+        }
+    }
+    return nil;
+}
+
+//__________________________________________________________________________________
+_MathObject* _Polynomial::Add (_MathObject* m)
+{
+    return Plus(m);
+}
+//__________________________________________________________________________________
+
+void    ResetPolynomialCheck (_Polynomial* p)
+{
+    if (dropTerms) {
+        if(!enforcePolyCap) {
+            if (varCheckAllocated!=p->variableIndex.countitems()) {
+                if (varCheckArray) {
+                    free (varCheckArray);
+                }
+                varCheckAllocated=p->variableIndex.countitems();
+                varCheckArray = (_Parameter*)MemAllocate (varCheckAllocated*sizeof(_Parameter));
+                _Parameter lb, ub;
+                for (long j=varCheckAllocated-1; j>=0; j--) {
+                    _Variable* theV = LocateVar(p->variableIndex(j));
+                    lb = fabs(theV->GetLowerBound());
+                    ub = fabs(theV->GetUpperBound());
+                    varCheckArray[j]=log(lb>ub?lb:ub);
+                }
+            }
+        }
+    }
+    checkReset = true;
+
+}
+
+//__________________________________________________________________________________
+void _Polynomial::CheckTerm (void)
+{
+    long myIndex = theTerms->actTerms-1;
+    _Parameter myCoeff = theTerms->GetCoeff(myIndex);
+    if (!theTerms->checkTerm (myCoeff,myIndex)) {
+        theTerms->DeleteTerm(myIndex);
+    }
+
+}
+
+//__________________________________________________________________________________
+
+bool         _Polynomial::Equal(_MathObject* m)
+{
+    bool result = false;
+    if (m->ObjectClass() == POLYNOMIAL || m->ObjectClass() == NUMBER) {
+        _Polynomial * diff = (_Polynomial *)Sub(m);
+        if (diff) {
+            _Constant * v = (_Constant*)diff->IsANumber(true);
+            if (v!=nil) {
+                result = fabs (v->Value()) < 1.e-6;
+                DeleteObject (v);
+            }
+            //_String * diffS = (_String*)diff->toStr();
+            //printf ("%s\n", diffS->getStr());
+            DeleteObject (diff);
+        }
+
+    }
+    return result;
+}
+
+
+//__________________________________________________________________________________
+_MathObject* _Polynomial::Plus (_MathObject* m, bool subtract)
+{
+    long objectT = m->ObjectClass();
+
+    if (objectT==1) { // a number
+        Convert2OperationForm();
+        _Polynomial* result = new _Polynomial (*this);
+        checkPointer(result);
+        _Parameter mV = subtract?-m->Value():m->Value();
+
+        if (!variableIndex.lLength) { // constant poly
+            if (theTerms->NumberOfTerms()) {
+                result->theTerms->GetCoeff(0)+=mV;
+                if (result->theTerms->GetCoeff(0)==0.0) {
+                    result->theTerms->DeleteTerm(0);
+                }
+            } else {
+                if (mV) {
+                    result->theTerms->AddTerm(nil,mV);
+                }
+            }
+        } else { // variable containing poly
+            if (theTerms->NumberOfTerms()) {
+                if (theTerms->IsFirstANumber()) {
+                    result->theTerms->GetCoeff(0)+=mV;
+                    if (result->theTerms->GetCoeff(0)==0.0) {
+                        result->theTerms->DeleteTerm(0);
+                    }
+                } else {
+                    result->theTerms->AddTerm(mV);
+                }
+            } else {
+                result->theTerms->AddTerm (mV);
+            }
+        }
+        return result;
+    }
+
+    if (objectT == POLYNOMIAL) { // another polynomial
+        Convert2OperationForm();
+        _Polynomial* p2 = (_Polynomial*)m;
+      
+      
+      
+      
+        if (variableIndex.lLength == 0) {
+            if (theTerms->NumberOfTerms()) {
+                _Constant coef1 (theTerms->GetCoeff(0));
+                if (!subtract) {
+                    return p2->Plus (&coef1,false);
+                } else {
+                    _Polynomial *ppp = (_Polynomial*)p2->Plus (&coef1,true);
+                    _Parameter  *invC = ppp->theTerms->theCoeff;
+                    for (long inv = 0; inv<ppp->theTerms->actTerms; inv++, invC++) {
+                        (*invC) *= -1.0;
+                    }
+                    return ppp;
+                }
+            } else {
+                if (!subtract) {
+                    return new _Polynomial(*p2);
+                } else {
+                    _Polynomial* ppp = new _Polynomial (*p2);
+                    checkPointer(ppp);
+                    _Parameter *invC = ppp->theTerms->theCoeff;
+                    for (long inv = 0; inv<ppp->theTerms->actTerms; inv++, invC++) {
+                        (*invC)*=(-1.0);
+                    }
+
+                    return ppp;
+                }
+            }
+
+        }
+        if (p2->variableIndex.lLength == 0) {
+            if (p2->theTerms->NumberOfTerms()) {
+                _Constant coef2 (p2->theTerms->GetCoeff(0));
+                return    Plus (&coef2,subtract);
+            } else {
+                if (!subtract) {
+                    return new _Polynomial(*this);
+                } else {
+                    _Polynomial* ppp = new _Polynomial (*this);
+                    checkPointer(ppp);
+                    _Parameter *invC = ppp->theTerms->theCoeff;
+                    for (long inv = 0; inv<ppp->theTerms->actTerms; inv++, invC++) {
+                        (*invC)*=(-1.0);
+                    }
+
+                    return ppp;
+                }
+            }
+        }
+
+        p2->Convert2OperationForm();
+
+        long nt2        = p2->theTerms->NumberOfTerms(),
+             nt1      = theTerms->NumberOfTerms(),
+             pos1      = 0,
+             pos2        = 0,
+             * term1,
+             * term2;
+
+        char c          = 0,
+             advancing  = -1;
+
+        _Parameter * coeff1 = theTerms->GetCoeff(),
+                     *coeff2 = p2->theTerms->GetCoeff();
+
+        _Polynomial* res;
+
+        if (variableIndex.Equal(p2->variableIndex))
+            // same variable arrays - proceed to the operation directly
+        {
+            res = new _Polynomial (variableIndex); // create a blank new result holder
+            checkPointer        (res);
+            ResetPolynomialCheck(res);
+            while (1) { // stuff left to do
+                if (advancing == 0) { // advancing in the 1st polynomial
+                    pos1++;
+                    if (pos1>=nt1) {
+                        advancing = 2;
+                        continue;
+                    }
+                    coeff1++;
+                    term1 = theTerms->GetTerm (pos1);
+                    c = res->theTerms->CompareTerms (term1, term2);
+                    if (c<=0) {
+                        res->theTerms->AddTerm (term1,*coeff1);
+                        if (c<0) {
+                            continue;
+                        }
+                    }
+                    if (c>0) {
+                        advancing = 1;
+                        res->theTerms->AddTerm (term2,subtract?-*coeff2:*coeff2);
+                        continue;
+                    }
+                } else if (advancing == 1) { // advancing in the 2nd polynomial
+                    pos2++;
+                    if (pos2>=nt2) {
+                        advancing = 3;
+                        continue;
+                    }
+                    coeff2++;
+                    term2 = p2->theTerms->GetTerm (pos2);
+                    c = res->theTerms->CompareTerms (term2, term1);
+                    if (c<=0) {
+                        res->theTerms->AddTerm (term2,subtract?-*coeff2:*coeff2);
+                        if (c<0) {
+                            continue;
+                        }
+                    }
+                    if (c>0) {
+                        advancing = 0;
+                        res->theTerms->AddTerm (term1,*coeff1);
+                        continue;
+                    }
+                } else if (advancing == 2) { // flush out the 2nd poly
+                    while (pos2<nt2) {
+                        res->theTerms->AddTerm (p2->theTerms->GetTerm(pos2),subtract?-*coeff2:*coeff2);
+                        pos2++;
+                        coeff2++;
+                    }
+                    break;
+                } else if (advancing == 3) { // flush out the 2nd poly
+                    while (pos1<nt1) {
+                        res->theTerms->AddTerm (theTerms->GetTerm(pos1),*coeff1);
+                        pos1++;
+                        coeff1++;
+                    }
+                    break;
+                } else if (advancing == -1) { // just starting
+                    if (!nt1) { // first poly is empty!
+                        advancing = 3;
+                        continue;
+                    }
+                    if (!nt2) { // second poly is empty!
+                        advancing = 2;
+                        continue;
+                    }
+                    term1 = theTerms->GetTerm(0);
+                    term2 = p2->theTerms->GetTerm(0);
+                    c = res->theTerms->CompareTerms (term1, term2);
+                    if (c<=0) { // begin with the first poly
+                        res->theTerms->AddTerm (term1, *coeff1);
+                        advancing = 0;
+                        if (c) {
+                            continue;
+                        } else {
+                            if (subtract) {
+                                res->theTerms->GetCoeff (res->theTerms->actTerms-1)-= *coeff2;
+                            } else {
+                                res->theTerms->GetCoeff (res->theTerms->actTerms-1)+= *coeff2;
+                            }
+                            pos2++;
+                            if (pos2==nt2) {
+                                pos1++;
+                                coeff1++;
+                                advancing = 3;
+                            } else {
+                                term2 = p2->theTerms->GetTerm (pos2);
+                                coeff2++;
+                            }
+                            res->CheckTerm();
+                            continue;
+                        }
+                    } else {
+                        res->theTerms->AddTerm (term2, subtract?-*coeff2:*coeff2);
+                        advancing = 1;
+                        continue;
+                    }
+
+                }
+
+                // will only get here when there are like terms
+                // see which one is being added
+                if (advancing == 0) { // moving up in the first term
+                    if (subtract) {
+                        res->theTerms->GetCoeff (res->theTerms->actTerms-1)-= *coeff2;
+                    } else {
+                        res->theTerms->GetCoeff (res->theTerms->actTerms-1)+= *coeff2;
+                    }
+                    pos1++;
+                    if (pos1>=nt1) {
+                        advancing = 2;
+                        pos2++;
+                        term2 = p2->theTerms->GetTerm (pos2);
+                        coeff2++;
+                    } else {
+                        term1 = theTerms->GetTerm (pos1);
+                        coeff1++;
+                        advancing = 1;
+                    }
+
+                } else {
+                    //if (subtract)
+                    //  res->theTerms->GetCoeff (res->theTerms->actTerms-1)-= *coeff1;
+                    //else
+                    res->theTerms->GetCoeff (res->theTerms->actTerms-1)+= *coeff1;
+                    pos2++;
+                    if (pos2>=nt2) {
+                        advancing = 3;
+                        pos1++;
+                        term1 = theTerms->GetTerm (pos1);
+                        coeff1++;
+                    } else {
+                        term2 = p2->theTerms->GetTerm (pos2);
+                        coeff2++;
+                        advancing = 0;
+                    }
+                }
+
+                // check to see if the term is significant
+                res->CheckTerm(); // by default will check the last term
+            }
+
+
+        } else {
+            _SimpleList mergedVariables, merge1, merge2;
+            mergedVariables.Merge(variableIndex, p2->variableIndex, &merge1, &merge2);
+            if ( merge1.countitems()==mergedVariables.countitems() || merge2.countitems()==mergedVariables.countitems()) {
+                bool  firstBigger = merge1.countitems()==mergedVariables.countitems(); // is the first poly bigger than the second
+              
+                long  *reindexList = firstBigger?merge2.quickArrayAccess():merge1.quickArrayAccess(),
+                       reindexLength = firstBigger?merge2.countitems():merge1.countitems();
+              
+              
+                res = new _Polynomial (mergedVariables); // create a blank new result holder
+
+                ResetPolynomialCheck(res);
+                while (1) { // stuff left to do
+                    if (advancing == 0) { // advancing in the 1st polynomial
+                        pos1++;
+                        if (pos1>=nt1) {
+                            advancing = 2;
+                            continue;
+                        }
+                        coeff1++;
+                        term1 = theTerms->GetTerm (pos1);
+                        c = firstBigger?res->theTerms->CompareTerms (term1, term2,reindexList,reindexLength):
+                            -res->theTerms->CompareTerms (term2, term1,reindexList,reindexLength);
+                        if (c<=0) {
+                            if (firstBigger) {
+                                res->theTerms->AddTerm (term1,*coeff1);
+                            } else {
+                                res->theTerms->AddTerm (term1,*coeff1,reindexList, reindexLength);
+                            }
+                            if (c<0) {
+                                continue;
+                            }
+                        }
+                        if (c>0) {
+                            advancing = 1;
+                            if (firstBigger) {
+                                res->theTerms->AddTerm (term2,subtract?-*coeff2:*coeff2,reindexList,reindexLength);
+                            } else {
+                                res->theTerms->AddTerm (term2,subtract?-*coeff2:*coeff2);
+                            }
+                            continue;
+                        }
+
+                    } else if (advancing == 1) { // advancing in the 2nd polynomial
+                        pos2++;
+                        if (pos2>=nt2) {
+                            advancing = 3;
+                            continue;
+                        }
+                        coeff2++;
+                        term2 = p2->theTerms->GetTerm (pos2);
+                        c = firstBigger?-res->theTerms->CompareTerms (term1, term2,reindexList,reindexLength):
+                            res->theTerms->CompareTerms (term2, term1,reindexList,reindexLength);
+                        if (c<=0) {
+                            if (firstBigger) {
+                                res->theTerms->AddTerm (term2,subtract?-*coeff2:*coeff2,reindexList, reindexLength);
+                            } else {
+                                res->theTerms->AddTerm (term2,subtract?-*coeff2:*coeff2);
+                            }
+                            if (c<0) {
+                                continue;
+                            }
+                        }
+                        if (c>0) {
+                            advancing = 0;
+                            if (firstBigger) {
+                                res->theTerms->AddTerm (term1,*coeff1);
+                            } else {
+                                res->theTerms->AddTerm (term1,*coeff1,reindexList, reindexLength);
+                            }
+                            continue;
+                        }
+                    } else if (advancing == 2) { // flush out the 2nd poly
+                        if (firstBigger)
+                            while (pos2<nt2) {
+                                res->theTerms->AddTerm (p2->theTerms->GetTerm(pos2),subtract?-*coeff2:*coeff2,reindexList,reindexLength);
+                                pos2++;
+                                coeff2++;
+                            }
+                        else
+                            while (pos2<nt2) {
+                                res->theTerms->AddTerm (p2->theTerms->GetTerm(pos2),subtract?-*coeff2:*coeff2);
+                                pos2++;
+                                coeff2++;
+                            }
+                        break;
+                    } else if (advancing == 3) { // flush out the 2nd poly
+                        if (firstBigger)
+                            while (pos1<nt1) {
+                                res->theTerms->AddTerm (theTerms->GetTerm(pos1),*coeff1);
+                                pos1++;
+                                coeff1++;
+                            }
+                        else
+                            while (pos1<nt1) {
+                                res->theTerms->AddTerm (theTerms->GetTerm(pos1),*coeff1,reindexList,reindexLength);
+                                pos1++;
+                                coeff1++;
+                            }
+                        break;
+                    } else if (advancing == -1) { // just starting
+                        if (!nt1) { // first poly is empty!
+                            advancing = 3;
+                            continue;
+                        }
+                        if (!nt2) { // second poly is empty!
+                            advancing = 2;
+                            continue;
+                        }
+                        term1 = theTerms->GetTerm(0);
+                        term2 = p2->theTerms->GetTerm(0);
+                        c = firstBigger?res->theTerms->CompareTerms (term1, term2,reindexList,reindexLength):
+                            -res->theTerms->CompareTerms (term2, term1,reindexList,reindexLength);
+                        if (c<=0) { // begin with the first poly
+                            if (firstBigger) {
+                                res->theTerms->AddTerm (term1, *coeff1);
+                            } else {
+                                res->theTerms->AddTerm (term1, *coeff1,reindexList, reindexLength);
+                            }
+                            advancing = 0;
+                            if (c) {
+                                continue;
+                            } else {
+                                if (subtract) {
+                                    res->theTerms->GetCoeff (res->theTerms->actTerms-1)-= *coeff2;
+                                } else {
+                                    res->theTerms->GetCoeff (res->theTerms->actTerms-1)+= *coeff2;
+                                }
+                                pos2++;
+                                if (pos2>=nt2) {
+                                    advancing = 3;
+                                    coeff1++;
+                                    pos1++;
+                                } else {
+                                    term2 = p2->theTerms->GetTerm (pos2);
+                                    coeff2++;
+                                }
+                                res->CheckTerm();
+                                continue;
+                            }
+                        } else {
+                            if (firstBigger) {
+                                res->theTerms->AddTerm (term2, subtract?-*coeff2:*coeff2,reindexList, reindexLength);
+                            } else {
+                                res->theTerms->AddTerm (term2, subtract?-*coeff2:*coeff2);
+                            }
+                            advancing = 1;
+                            continue;
+                        }
+
+                    }
+
+                    // will only get here when there are like terms
+                    // see which one is being added
+                    if (advancing == 0) { // moving up in the first term
+                        if (subtract) {
+                            res->theTerms->GetCoeff (res->theTerms->actTerms-1)-= *coeff2;
+                        } else {
+                            res->theTerms->GetCoeff (res->theTerms->actTerms-1)+= *coeff2;
+                        }
+                        pos1++;
+                        if (pos1>=nt1) {
+                            advancing = 2;
+                            pos2++;
+                            term2 = p2->theTerms->GetTerm (pos2);
+                            coeff2++;
+                        } else {
+                            term1 = theTerms->GetTerm (pos1);
+                            coeff1++;
+                            advancing = 1;
+                        }
+
+                    } else {
+                        //if (subtract)
+                        //  res->theTerms->GetCoeff (res->theTerms->actTerms-1)-= *coeff1;
+                        //else
+                        res->theTerms->GetCoeff (res->theTerms->actTerms-1)+= *coeff1;
+                        pos2++;
+                        if (pos2>=nt2) {
+                            advancing = 3;
+                            pos1++;
+                            coeff1++;
+                            term1 = theTerms->GetTerm (pos1);
+                        } else {
+                            term2 = p2->theTerms->GetTerm (pos2);
+                            coeff2++;
+                            advancing = 0;
+                        }
+                    }
+
+                    // check to see if the term is significant
+                    res->CheckTerm(); // by default will check the last term
+                }
+            } else
+                // both variable indices must be reindexed
+            {
+                long  *ri1 = merge1.quickArrayAccess(),
+                       *ri2 = merge2.quickArrayAccess(),
+                        rl1 = merge1.countitems(),
+                        rl2 = merge2.countitems() ;
+
+                res = new _Polynomial (mergedVariables); // create a blank new result holder
+                checkPointer(res);
+                ResetPolynomialCheck(res);
+
+                while (1) { // stuff left to do
+                    if (advancing == 0) { // advancing in the 1st polynomial
+                        pos1++;
+                        if (pos1>=nt1) {
+                            advancing = 2;
+                            continue;
+                        }
+                        coeff1++;
+                        term1 = theTerms->GetTerm (pos1);
+                        c = res->theTerms->CompareTerms (term1, term2,ri1,ri2,rl1,rl2);
+                        if (c<=0) {
+                            res->theTerms->AddTerm (term1,*coeff1,ri1, rl1);
+                            if (c<0) {
+                                continue;
+                            }
+                        }
+                        if (c>0) {
+                            advancing = 1;
+                            res->theTerms->AddTerm (term2,subtract?-*coeff2:*coeff2,ri2,rl2);
+                            continue;
+                        }
+
+                    } else if (advancing == 1) { // advancing in the 2nd polynomial
+                        pos2++;
+                        if (pos2>=nt2) {
+                            advancing = 3;
+                            continue;
+                        }
+                        coeff2++;
+                        term2 = p2->theTerms->GetTerm (pos2);
+                        c = res->theTerms->CompareTerms (term2, term1,ri2,ri1,rl2,rl1);
+                        if (c<=0) {
+                            res->theTerms->AddTerm (term2,subtract?-*coeff2:*coeff2,ri2, rl2);
+                            if (c<0) {
+                                continue;
+                            }
+                        }
+                        if (c>0) {
+                            advancing = 0;
+                            res->theTerms->AddTerm (term1,*coeff1,ri1, rl1);
+                            continue;
+                        }
+                    } else if (advancing == 2) { // flush out the 2nd poly
+                        while (pos2<nt2) {
+                            res->theTerms->AddTerm (p2->theTerms->GetTerm(pos2),subtract?-*coeff2:*coeff2,ri2,rl2);
+                            pos2++;
+                            coeff2++;
+                        }
+                        break;
+                    } else if (advancing == 3) { // flush out the 2nd poly
+                        while (pos1<nt1) {
+                            res->theTerms->AddTerm (theTerms->GetTerm(pos1),*coeff1,ri1,rl1);
+                            pos1++;
+                            coeff1++;
+                        }
+                        break;
+                    } else if (advancing == -1) { // just starting
+                        if (!nt1) { // first poly is empty!
+                            advancing = 3;
+                            continue;
+                        }
+                        if (!nt2) { // second poly is empty!
+                            advancing = 2;
+                            continue;
+                        }
+                        term1 = theTerms->GetTerm(0);
+                        term2 = p2->theTerms->GetTerm(0);
+                        c = res->theTerms->CompareTerms (term1, term2,ri1,ri2,rl1,rl2);
+                        if (c<=0) { // begin with the first poly
+                            res->theTerms->AddTerm (term1, *coeff1,ri1, rl1);
+                            advancing = 0;
+                            if (c) {
+                                continue;
+                            } else {
+                                if (subtract) {
+                                    res->theTerms->GetCoeff (res->theTerms->actTerms-1)-= *coeff2;
+                                } else {
+                                    res->theTerms->GetCoeff (res->theTerms->actTerms-1)+= *coeff2;
+                                }
+                                pos2++;
+                                if (pos2==nt2) {
+                                    pos1++;
+                                    coeff1++;
+                                    advancing = 3;
+                                } else {
+                                    term2 = p2->theTerms->GetTerm (pos2);
+                                    coeff2++;
+                                }
+                                res->CheckTerm();
+                                continue;
+                            }
+                        } else {
+                            res->theTerms->AddTerm (term2, subtract?-*coeff2:*coeff2,ri2, rl2);
+                            advancing = 1;
+                            continue;
+                        }
+
+                    }
+
+                    // will only get here when there are like terms
+                    // see which one is being added
+                    if (advancing == 0) { // moving up in the first term
+                        if (subtract) {
+                            res->theTerms->GetCoeff (res->theTerms->actTerms-1)-= *coeff2;
+                        } else {
+                            res->theTerms->GetCoeff (res->theTerms->actTerms-1)+= *coeff2;
+                        }
+                        pos1++;
+                        if (pos1>=nt1) {
+                            advancing = 2;
+                            pos2++;
+                            term2 = p2->theTerms->GetTerm (pos2);
+                            coeff2++;
+                        } else {
+                            term1 = theTerms->GetTerm (pos1);
+                            coeff1++;
+                            advancing = 1;
+                        }
+
+                    } else {
+                        //if (subtract)
+                        //  res->theTerms->GetCoeff (res->theTerms->actTerms-1)-= *coeff1;
+                        //else
+                        res->theTerms->GetCoeff (res->theTerms->actTerms-1)+= *coeff1;
+                        pos2++;
+                        if (pos2>=nt2) {
+                            advancing = 3;
+                            pos1++;
+                            term1 = theTerms->GetTerm (pos1);
+                            coeff1++;
+                        } else {
+                            term2 = p2->theTerms->GetTerm (pos2);
+                            coeff2++;
+                            advancing = 0;
+                        }
+                    }
+
+                    // check to see if the term is significant
+                    res->CheckTerm(); // by default will check the last term
+                }
+            }
+        }
+
+ 
+      
+      /*
+      NLToConsole();
+      NLToConsole();
+      BufferToConsole (_String((_String*)this->toStr()).getStr());
+      BufferToConsole("\n+\n");
+      BufferToConsole (_String((_String*)p2->toStr()).getStr());
+      BufferToConsole("\n=\n");
+      BufferToConsole (_String((_String*)res->toStr()).getStr());
+      NLToConsole();
+       */
+      
+
+      if (!res->theTerms->checkMe()) {
+            return nil;
+      }
+//      res->theTerms->ChopTerms();
+        if (res->theTerms->GetNoTerms()==0) {
+            DeleteObject (res);
+            return new _Polynomial (0.0);
+        }
+        return res;
+    }
+
+    _String errMsg ("An incompatible operand was supplied to polynomial addition/subtraction");
+    FlagError (&errMsg);
+    return nil;
+}
+
+//__________________________________________________________________________________
+_MathObject* _Polynomial::Sub (_MathObject* m)
+{
+    return Plus (m,true);
+}
+
+//__________________________________________________________________________________
+_MathObject* _Polynomial::Minus (void)
+{
+    _Constant min (-1.0);
+    return Mult (&min);
+}
+
+//__________________________________________________________________________________
+_MathObject* _Polynomial::Mult (_MathObject* m)
+{
+    long objectT = m->ObjectClass();
+
+    if (objectT==NUMBER) { // a number or a monomial
+        Convert2OperationForm();
+        _Parameter nb = ((_Constant*)m)->Value();
+        if (nb==0.0) {
+            return new _Polynomial;
+        }
+
+        _Polynomial* result = new _Polynomial (*this);
+        checkPointer(result);
+        for (long i = theTerms->NumberOfTerms()-1; i>=0; i--) {
+            result->theTerms->GetCoeff(i)*=nb;
+        }
+        return result;
+    }
+
+    if (objectT == POLYNOMIAL) { // another polynomial
+        /*      Convert2OperationForm();
+                _Polynomial* p2 = (_Polynomial*)m, *res;
+                p2->Convert2OperationForm();
+                if (!variableIndex.countitems())
+                {
+                    if (theTerms->NumberOfTerms())
+                    {
+                        _Constant coef1 (theTerms->GetCoeff(0));
+                        return p2->Mult (&coef1);
+                    }
+                    else
+                        return new _Polynomial();
+                }
+                if (!p2->variableIndex.countitems())
+                {
+                    if (p2->theTerms->NumberOfTerms())
+                    {
+                        _Constant coef2 (p2->theTerms->GetCoeff(0));
+                        return Mult (&coef2);
+                    }
+                    else
+                        return new _Polynomial();
+                }
+
+                long nt1 = theTerms->NumberOfTerms ()-1, nt2 = p2->theTerms->NumberOfTerms ()-1,
+                     csp = 0, cwp = 0;
+
+                long *positionArray = (long*)MemAllocate ((nt2+1)*sizeof(long)), temp1, temp2, resVars;
+                char compRes, compRes2, compRes3, status = 0;
+                if ((nt1<0) || (nt2<0)) return new _Polynomial();
+                memset (positionArray,0,(nt2+1)*sizeof(long));
+                long* terms1, *terms2, *holder1, *holder2, *holder3;
+
+                //set up proper variable/term agreement
+                if (variableIndex.Equal(p2->variableIndex))
+                // same variables - the simplest case
+                {
+                    terms1 = theTerms->GetTerm(0);
+                    terms2 = p2->theTerms->GetTerm(0);
+                    resVars = variableIndex.countitems();
+                    res = new _Polynomial (variableIndex);
+                }
+                else
+                {
+                    _SimpleList mergedVars, merge1, merge2;
+                    mergedVars.Merge (variableIndex,p2->variableIndex, &merge1, &merge2);
+                    if (!merge1.countitems()) // 1 is a superset of 2
+                    {
+                        res = new _Polynomial (variableIndex);
+                        temp2 = p2->variableIndex.countitems();
+                        resVars = temp1 = variableIndex.countitems();
+                        terms1 = theTerms->GetTerm(0);
+                        holder2 = terms2 = (long*)MemAllocate (nt2*sizeof(long)*temp1);
+                        holder3 = p2->theTerms->GetTerm(0);
+                        holder1 = merge2.quickArrayAccess();
+                        for (;csp<nt2;csp++,holder2+=temp1, holder3+= temp2)
+                        {
+                            _PolynomialData::RearrangeTerm (holder2, holder3, holder1, temp2);
+                        }
+                    }
+                    else
+                        if (!merge2.countitems()) // 2 is a superset of 1
+                        {
+                            res = new _Polynomial (p2->variableIndex);
+                            resVars = temp2 = p2->variableIndex.countitems();
+                            temp1 = variableIndex.countitems();
+                            terms2 = p2->theTerms->GetTerm(0);
+                            holder1 = terms1 = (long*)MemAllocate (nt1*sizeof(long)*temp2);
+                            holder3 = theTerms->GetTerm(0);
+                            holder2 = merge1.quickArrayAccess();
+                            for (;csp<nt1;csp++,holder1+=temp2, holder3+= temp1)
+                            {
+                                _PolynomialData::RearrangeTerm (holder1, holder3, holder2, temp1);
+                            }
+                        }
+                        else // no inclusions
+                        {
+                            res = new _Polynomial (mergedVars);
+                            resVars = mergedVars.countitems();
+
+                            temp2 = p2->variableIndex.countitems();
+                            temp1 = variableIndex.countitems();
+                            holder2 = terms2 = (long*)MemAllocate (nt2*sizeof(long)*resVars);
+                            holder3 = p2->theTerms->GetTerm(0);
+                            holder1 = merge2.quickArrayAccess();
+                            for (;csp<nt2;csp++,holder2+=resVars, holder3+= temp2)
+                            {
+                                _PolynomialData::RearrangeTerm (holder2, holder3, holder1, temp2);
+                            }
+                            holder1 = terms1 = (long*)MemAllocate (nt1*sizeof(long)*resVars);
+                            holder3 = theTerms->GetTerm(0);
+                            holder2 = merge1.quickArrayAccess();
+                            for (;csp<nt1;csp++,holder1+=resVars, holder3+= temp1)
+                            {
+                                _PolynomialData::RearrangeTerm (holder1, holder3, holder2, temp1);
+                            }
+                        }
+
+                    } // done arranging variables
+
+                    ResetPolynomialCheck(res);
+                    holder1 = (long*)MemAllocate (resVars*sizeof(long));
+                    holder2 = (long*)MemAllocate (resVars*sizeof(long));
+                    holder3 = (long*)MemAllocate (resVars*sizeof(long));
+
+                    _Parameter *tempCoeff = (_Parameter*)MemAllocate (theTerms->NumberOfTerms()*sizeof(_Parameter));
+                    memcpy (tempCoeff, theTerms->GetCoeff(), theTerms->NumberOfTerms()*sizeof(_Parameter));
+
+
+                    res->theTerms->MultiplyTerms    (holder1, terms1, terms2); // add the first term
+
+                    res->theTerms->AddTerm (holder1, *tempCoeff * *p2->theTerms->GetCoeff());
+
+
+                    while (1)
+                    {
+                        if ((status==0)&&(cwp==csp))
+                        {
+                            temp1 = positionArray[csp]+1;
+                            if (temp1>nt2)
+                            {
+                                csp++;
+                                cwp = csp;
+                                if (csp>nt1) break;
+                                if (csp==nt1)
+                                {
+                                    long i = positionArray[csp]+1;
+                                    _Parameter coe = theTerms->GetCoeff (csp);
+                                    while (i<=nt2)
+                                    {
+                                        res->theTerms->MultiplyTerms (holder1, theTerms->GetTerm(csp), p2->theTerms->GetTerm(i));
+                                        res->theTerms->AddTerm (holder1, coe*p2->theTerms->GetCoeff (i));
+                                        i++;
+                                    }
+                                    break;
+                                }
+                                continue;
+                            }
+                            compRes = 0;
+                        }
+                        else
+                        {
+                            if (positionArray[cwp]+1>nt2)
+                            {
+                                csp = cwp+1;
+                                if (csp==nt1)
+                                {
+                                    long i = positionArray[csp]+1;
+                                    _Parameter coe = theTerms->GetCoeff (csp);
+                                    while (i<=nt2)
+                                    {
+                                        res->theTerms->MultiplyTerms (holder1, theTerms->GetTerm(csp), p2->theTerms->GetTerm(i));
+                                        res->theTerms->AddTerm (holder1, coe*p2->theTerms->GetCoeff (i));
+                                        i++;
+                                    }
+                                    break;
+                                }
+                                cwp = csp;
+                                status = 0;
+                                continue;
+                            }
+                        }
+                        res->theTerms->MultiplyTerms (holder1, terms1+resVars*cwp, terms2+resVars*(positionArray[cwp]+1));
+
+                        if ((compRes>=0)||status)
+                            res->theTerms->MultiplyTerms    (holder2, terms1+resVars*(cwp+1), terms2+resVars*positionArray[cwp+1]);
+
+                        if (status==0)
+                        {
+                            compRes = res->theTerms->CompareTerms (holder1, holder2);
+                        }
+                        else
+                            compRes = 1;
+
+                        if (compRes<0)
+                        {
+                            if (status==1)
+                            {
+                                cwp --;
+                                if (cwp==csp) status = 0;
+                                continue;
+                            }
+                            res->theTerms->AddTerm(holder1,tempCoeff[cwp]*p2->theTerms->GetCoeff (positionArray[cwp]));
+                            if (cwp>csp)
+                            {
+                                tempCoeff[cwp]=theTerms->GetCoeff(cwp);
+                            }
+                            res->CheckTerm();
+                            positionArray[cwp]++;
+                            status = 0;
+                            continue;
+                        }
+                        if (compRes==0)
+                        {
+                            positionArray[cwp]++;
+                            tempCoeff[cwp+1]+= tempCoeff[cwp]*p2->theTerms->GetCoeff (positionArray[cwp])/
+                                                         p2->theTerms->GetCoeff (positionArray[cwp+1]);
+                            status = 0;
+                            continue;
+                        }
+
+                        if ((cwp-csp>1)||(cwp==nt1-1))
+                        {
+                            compRes3 = 1;
+                            for (long k=csp; k<cwp-1;k++)
+                            {
+                                res->theTerms->MultiplyTerms    (holder3, terms1+resVars*(k), terms2+resVars*(positionArray[k]+1));
+                                compRes3 = res->theTerms->CompareTerms (holder3, holder2);
+                                if (!compRes3)
+                                {
+                                    tempCoeff[cwp+1]+= tempCoeff[k]*p2->theTerms->GetCoeff (positionArray[k])/
+                                                         p2->theTerms->GetCoeff (positionArray[k+1]);
+                                    positionArray[csp]++;
+                                    if (k==csp)
+                                        if (positionArray[csp]>=nt2)
+                                            csp++;
+                                    break;
+                                }
+                                if (compRes3<0) break;
+                            }
+
+                        }
+                        res->theTerms->AddTerm(holder2,tempCoeff[cwp+1]*p2->theTerms->GetCoeff (positionArray[cwp+1]));
+                        tempCoeff[cwp+1]=theTerms->GetCoeff(cwp+1);
+                        res->CheckTerm();
+
+                        temp1 = (positionArray[cwp+1]+1);
+                        res->theTerms->MultiplyTerms    (holder2, terms1+resVars*(cwp+1), terms2+resVars*(temp1));
+                        compRes2 = res->theTerms->CompareTerms (holder1, holder2);
+                        if (compRes2<=0)
+                        {
+                            if (!compRes2)
+                            {
+                                positionArray[cwp]++;
+                                tempCoeff[cwp+1]+= tempCoeff[cwp]*p2->theTerms->GetCoeff (positionArray[cwp])/
+                                                         p2->theTerms->GetCoeff (temp1);
+                                if (cwp>csp)
+                                {
+                                    tempCoeff[cwp]=theTerms->GetCoeff(cwp);
+                                }
+                            }
+
+                            if (cwp<=nt1-2)
+                            {
+                                res->theTerms->MultiplyTerms    (holder3,  terms1+resVars*(cwp+2),  terms2+resVars*(positionArray[cwp+2]));
+                                compRes3 = res->theTerms->CompareTerms (holder2, holder3);
+                                compRes = res->theTerms->CompareTerms (holder1, holder3);
+                                if (!compRes)
+                                {
+                                    positionArray[csp]++;
+                                    tempCoeff[cwp+2]+= tempCoeff[csp]*p2->theTerms->GetCoeff (positionArray[csp])/
+                                                             p2->theTerms->GetCoeff (positionArray[cwp+2]);
+                                    if (positionArray[csp]>nt2)
+                                        csp++;
+                                }
+                            }
+                            else
+                            {
+                                compRes3 = -1;
+                            }
+
+                            if (compRes3<0)
+                            {
+                                positionArray[cwp+1]=temp1;
+                                res->theTerms->AddTerm (holder1, tempCoeff[cwp+1]*p2->theTerms->GetCoeff (positionArray[cwp+1]));
+                                tempCoeff[cwp+1]=theTerms->GetCoeff(cwp+1);
+                                res->CheckTerm();
+                                compRes = 1;
+                                if (status==1)
+                                {
+                                    if (compRes2==0)
+                                    {
+                                        positionArray[cwp+1]++;
+                                        if (positionArray[cwp+1]>nt2)
+                                        {
+                                            csp = cwp+1;
+                                            if (cwp<csp)
+                                            {
+                                                cwp = csp;
+                                                status = 0;
+                                            }
+                                        }
+                                        else
+                                            if (positionArray[cwp+1]==nt2)
+                                            {
+                                                positionArray[cwp+1]--;
+                                            }
+                                    }
+                                }
+                                continue;
+                            }
+
+                            if (!compRes3)
+                            {
+                                tempCoeff[cwp+2]+= tempCoeff[cwp+1]*p2->theTerms->GetCoeff (positionArray[cwp+1])/
+                                                         p2->theTerms->GetCoeff (positionArray[cwp+2]);
+                                tempCoeff[cwp+1]=theTerms->GetCoeff(cwp+1);
+                                status = 0;
+                                continue;
+                            }
+
+                            cwp++;
+                            status = 1;
+                            continue;
+                        }
+                        else
+                        {
+                            if (cwp<=nt1-2)
+                            {
+                                res->theTerms->MultiplyTerms    (holder3,  terms1+resVars*(cwp+2),  terms2+resVars*(positionArray[cwp+2]));
+                                compRes3 = res->theTerms->CompareTerms (holder2, holder3);
+                            }
+                            else
+                            {
+                                compRes3 = -1;
+                            }
+                            if (compRes3 < 0)
+                            {
+                                positionArray[cwp+1]=temp1;
+                                tempCoeff[cwp+1]=theTerms->GetCoeff(cwp+1);
+                                status = 1;
+                                continue;
+                            }
+
+                            cwp++;
+                            if (compRes3 == 0)
+                            {
+                                tempCoeff[cwp+1]+= tempCoeff[cwp]*p2->theTerms->GetCoeff (positionArray[cwp])/p2->theTerms->GetCoeff (positionArray[cwp+1]);
+                                tempCoeff[cwp]=theTerms->GetCoeff(cwp);
+                                continue;
+                            }
+
+                            status = 1;
+                            continue;
+
+                        }
+
+                    }
+
+                    free (positionArray);
+                    free (holder1);
+                    free (holder2);
+                    free (holder3);
+                    free (tempCoeff);
+                    if (terms1!=theTerms->GetTerm(0))
+                        free (terms1);
+                    if (terms2!=p2->theTerms->GetTerm(0))
+                        free (terms2);
+                    res->theTerms->checkMe();
+                    return res;*/
+
+
+        Convert2OperationForm();
+        _Polynomial* p2 = (_Polynomial*)m;
+        p2->Convert2OperationForm();
+        if (!variableIndex.countitems()) {
+            if (theTerms->NumberOfTerms()) {
+                _Constant coef1 (theTerms->GetCoeff(0));
+                return p2->Mult (&coef1);
+            } else {
+                return new _Polynomial();
+            }
+
+        }
+        if (!p2->variableIndex.countitems()) {
+            if (p2->theTerms->NumberOfTerms()) {
+                _Constant coef2 (p2->theTerms->GetCoeff(0));
+                return Mult (&coef2);
+            } else {
+                return new _Polynomial();
+            }
+        }
+        long nt2 = p2->theTerms->NumberOfTerms(), nt1 = theTerms->NumberOfTerms(),
+             ref = (variableIndex.countitems()+p2->variableIndex.countitems())*maximumPolyTermsPerVariable,
+             *idx1;
+        _Polynomial* res;
+        _SimpleList  reIndex, terms1, terms2;
+
+        if (nt1*nt2>ref)
+            // too many terms expected - chop b4 multiplying
+        {
+            _SimpleList  index;
+            long i;
+            _Parameter  logTop = log(topPolyCap), *theCoeff = theTerms->GetCoeff();
+            for (i = 0; i<nt1; i++,theCoeff++) {
+                index<<i;
+                terms1<<(long)(log(fabs(*theCoeff))+logTop*theTerms->SumOfPowers(i));
+            }
+            theCoeff = p2->theTerms->GetCoeff();
+            for (i = 0; i<nt2; i++,theCoeff++) {
+                index<<i+nt1;
+                terms1<<(long)(log(fabs(*theCoeff))+logTop*p2->theTerms->SumOfPowers(i));
+            }
+            SortLists (&terms1,&index);
+            terms1.Clear();
+            terms2.Clear();
+            idx1 = index.quickArrayAccess()+nt1+nt2-1;
+            long temp1 = sqrt((_Parameter)ref*nt1/nt2)+1, temp2 = sqrt((_Parameter)ref*nt2/nt1)+1;
+            if (temp1>nt1) {
+                temp1 = nt1;
+            }
+            if (temp2>nt2) {
+                temp2 = nt2;
+            }
+            for (i = 0; i<ref; i++, idx1--) {
+                if (*idx1>=nt1) {
+                    terms2<<*idx1;
+                } else {
+                    terms1<<*idx1;
+                }
+            }
+            if (terms1.countitems()==0) {
+                terms1<<0;
+            }
+            if (terms2.countitems()==0) {
+                terms2<<0;
+            }
+
+        }
+
+        if (!terms1.countitems()) {
+            if (variableIndex.Equal(p2->variableIndex)) { // same variable arrays - proceed to the operation directly
+                res = new _Polynomial (variableIndex);
+                checkPointer(res);
+                ResetPolynomialCheck(res);
+                long* newTerm = new long[res->variableIndex.countitems()],*term1,f;
+                checkPointer(newTerm);
+                for (long i=0; i<nt1; i++) {
+                    ref = 0;
+                    _Parameter c1 = theTerms->GetCoeff(i);
+                    term1 = theTerms->GetTerm(i);
+                    for (long j=0; j<nt2; j++) {
+                        res->theTerms->MultiplyTerms (newTerm, term1, p2->theTerms->GetTerm(j));
+                        f = res->theTerms->FindTerm (newTerm,reIndex.quickArrayAccess(), ref);
+                        if (f>=0) { // existing term - add or sub
+                            res->theTerms->GetCoeff(reIndex(f))+=c1*p2->theTerms->GetCoeff(j);
+                            ref = f+1;
+                        } else { // new term - insert
+                            reIndex.InsertElement ((BaseRef)res->theTerms->actTerms,-f-2, false,false);
+                            res->theTerms->AddTerm (newTerm, c1*p2->theTerms->GetCoeff(j));
+                            ref = -f-1;
+                        }
+                    }
+                }
+
+                delete newTerm;
+            } else {
+                _SimpleList merge1, merge2, joint;
+                joint.Merge (variableIndex, p2->variableIndex,&merge1,&merge2);
+                res = new _Polynomial (joint);
+                checkPointer(res);
+                ResetPolynomialCheck(res);
+                long  f,nv = res->variableIndex.countitems(),* scratch1 = new long[nv],
+                * scratch3,k,* scratch2;
+                checkPointer(scratch1);
+                bool do1 = merge1.countitems()!=0, do2 = merge2.countitems()!=0;
+                if (do1) {
+                    scratch2 = new long[nv];
+                    checkPointer(scratch2);
+                }
+                if (do2) {
+                    scratch3 = new long[nv];
+                    checkPointer(scratch3);
+                }
+                for (long i=0; i<nt1; i++) {
+                    _Parameter c1 = theTerms->GetCoeff(i);
+                    ref = 0;
+                    if (do1) {
+                        for (k=0; k<nv; k++,scratch2++) {
+                            *scratch2 = 0;
+                        }
+                        scratch2 -= nv;
+                        theTerms->RearrangeTerm (scratch2, theTerms->GetTerm(i), merge1.quickArrayAccess(), merge1.countitems());
+                    } else {
+                        scratch2 = theTerms->GetTerm(i);
+                    }
+                    for (long j=0; j<nt2; j++) {
+                        if (do2) {
+                            for (k=0; k<nv; k++,scratch3++) {
+                                *scratch3 = 0;
+                            }
+                            scratch3 -= nv;
+                            theTerms->RearrangeTerm (scratch3, p2->theTerms->GetTerm(j), merge2.quickArrayAccess(),merge2.countitems());
+                        } else {
+                            scratch3 = p2->theTerms->GetTerm(j);
+                        }
+                        res->theTerms->MultiplyTerms (scratch1,scratch2,scratch3);
+                        f = res->theTerms->FindTerm (scratch1,reIndex.quickArrayAccess(), ref);
+                        if (f>=0) { // existing term - add or sub
+                            res->theTerms->GetCoeff(reIndex(f))+=c1*p2->theTerms->GetCoeff(j);
+                            ref = f+1;
+                        } else { // new term - insert
+                            reIndex.InsertElement ((BaseRef)res->theTerms->actTerms,-f-2, false,false);
+                            res->theTerms->AddTerm (scratch1, c1*p2->theTerms->GetCoeff(j));
+                            ref = -f-1;
+                        }
+                    }
+                }
+                delete [] scratch1;
+                if (do1) {
+                    delete [] scratch2;
+                }
+                if (do2) {
+                    delete [] scratch3;
+                }
+            }
+
+        } else {
+            terms1.Sort();
+            terms2.Sort();
+            long* onOff = (long*)MemAllocate (nt2*sizeof(long));
+            onOff+=(nt2-1);
+            for (long i=nt2-1; i>=0; i--,onOff--)
+                if (terms2.BinaryFind(i)>=0) {
+                    *onOff = 1;
+                } else {
+                    *onOff = 0;
+                }
+            onOff++;
+            if (variableIndex.Equal(p2->variableIndex)) { // same variable arrays - proceed to the operation directly
+                res = new _Polynomial (variableIndex);
+                checkPointer(res);
+                ResetPolynomialCheck(res);
+                long* newTerm = new long[res->variableIndex.countitems()],*term1,f;
+                checkPointer(newTerm);
+                for (long i=0; i<nt1; i++) {
+                    if (terms1.BinaryFind(i)<0) {
+                        continue;
+                    }
+                    ref = 0;
+                    _Parameter c1 = theTerms->GetCoeff(i);
+                    term1 = theTerms->GetTerm(i);
+                    for (long j=0; j<nt2; j++) {
+                        if (onOff[j]==0) {
+                            continue;
+                        }
+                        res->theTerms->MultiplyTerms (newTerm, term1, p2->theTerms->GetTerm(j));
+                        f = res->theTerms->FindTerm (newTerm,reIndex.quickArrayAccess(), ref);
+                        if (f>=0) { // existing term - add or sub
+                            res->theTerms->GetCoeff(reIndex(f))+=c1*p2->theTerms->GetCoeff(j);
+                            ref = f+1;
+                        } else { // new term - insert
+                            reIndex.InsertElement ((BaseRef)res->theTerms->actTerms,-f-2, false,false);
+                            res->theTerms->AddTerm (newTerm, c1*p2->theTerms->GetCoeff(j));
+                            ref = -f-1;
+                        }
+                    }
+                }
+
+                delete []newTerm;
+            } else {
+                _SimpleList merge1, merge2, joint;
+                joint.Merge (variableIndex, p2->variableIndex,&merge1,&merge2);
+                res = new _Polynomial (joint);
+                checkPointer(res);
+                ResetPolynomialCheck(res);
+                long  f,nv = res->variableIndex.countitems(),* scratch1 = new long[nv],
+                * scratch3,k,* scratch2;
+                checkPointer(scratch1);
+                bool do1 = merge1.countitems()!=0, do2 = merge2.countitems()!=0;
+                if (do1) {
+                    scratch2 = new long[nv];
+                    checkPointer(scratch2);
+                }
+                if (do2) {
+                    scratch3 = new long[nv];
+                    checkPointer(scratch3);
+                }
+                for (long i=0; i<nt1; i++) {
+                    _Parameter c1 = theTerms->GetCoeff(i);
+                    ref = 0;
+                    if (do1) {
+                        for (k=0; k<nv; k++,scratch2++) {
+                            *scratch2 = 0;
+                        }
+                        scratch2 -= nv;
+                        theTerms->RearrangeTerm (scratch2, theTerms->GetTerm(i), merge1.quickArrayAccess(), merge1.countitems());
+                    } else {
+                        scratch2 = theTerms->GetTerm(i);
+                    }
+                    for (long j=0; j<nt2; j++) {
+                        if (do2) {
+                            for (k=0; k<nv; k++,scratch3++) {
+                                *scratch3 = 0;
+                            }
+                            scratch3 -= nv;
+                            theTerms->RearrangeTerm (scratch3, p2->theTerms->GetTerm(j), merge2.quickArrayAccess(),merge2.countitems());
+                        } else {
+                            scratch3 = p2->theTerms->GetTerm(j);
+                        }
+                        res->theTerms->MultiplyTerms (scratch1,scratch2,scratch3);
+                        f = res->theTerms->FindTerm (scratch1,reIndex.quickArrayAccess(), ref);
+                        if (f>=0) { // existing term - add or sub
+                            res->theTerms->GetCoeff(reIndex(f))+=c1*p2->theTerms->GetCoeff(j);
+                            ref = f+1;
+                        } else { // new term - insert
+                            reIndex.InsertElement ((BaseRef)res->theTerms->actTerms,-f-2, false,false);
+                            res->theTerms->AddTerm (scratch1, c1*p2->theTerms->GetCoeff(j));
+                            ref = -f-1;
+                        }
+                    }
+                }
+                delete []scratch1;
+                if (do1) {
+                    delete []scratch2;
+                }
+                if (do2) {
+                    delete []scratch3;
+                }
+            }
+            free (onOff);
+        }
+
+        res->theTerms->ResortTerms(reIndex.quickArrayAccess());
+        res->theTerms->checkMe();
+//      res->theTerms->ChopTerms();
+        return res;
+
+    }
+
+    _String errMsg ("An incompatible operand was supplied to polynomial multiplication");
+    FlagError (&errMsg);
+    return nil;
+}
+
+
+//__________________________________________________________________________________
+_MathObject* _Polynomial::Raise (_MathObject* m)
+{
+    long objectT = m->ObjectClass();
+    bool del = false;
+    if (objectT==POLYNOMIAL) {
+        m = ((_Polynomial*)m)->IsANumber();
+        if (!m) {
+            return nil;
+        }
+        del = true;
+        objectT = m->ObjectClass();
+    }
+    if (objectT==1) { // a number
+        Convert2OperationForm();
+        _Polynomial* result;
+        if (theTerms->NumberOfTerms()==1) { // just a monomial
+            long power = (long)m->Value();
+            result = new _Polynomial (*this);
+            checkPointer(result);
+            result->theTerms->RaiseTerm (result->theTerms->GetTerm(0),power);
+            result->theTerms->GetCoeff(0)=_PolynomialData::BinaryRaise(result->theTerms->GetCoeff(0),power);
+
+        } else { // binary raise
+            result = new _Polynomial(1.0);
+            checkPointer(result);
+            _Polynomial* oldR;
+            char bits[sizeof(long)*8], nLength = 0;
+            long pwr = m->Value();
+            while (pwr) {
+                bits[nLength]=pwr%2;
+                pwr/=2;
+                nLength++;
+            }
+            while (nLength) {
+                oldR = result;
+                nLength--;
+                if (bits[nLength]) {
+                    result=(_Polynomial*)result->Mult(this);
+                    DeleteObject( oldR);
+                }
+                oldR = result;
+                if (nLength) {
+                    result=(_Polynomial*)result->Mult(result);
+                    DeleteObject( oldR);
+                }
+            }
+        }
+        if (del) {
+            DeleteObject(m);
+        }
+        return result;
+    }
+    _String errMsg ("An incompatible operand was supplied to polynomial raise to power");
+    FlagError (&errMsg);
+    return nil;
+}
+//__________________________________________________________________________________
+void    _Polynomial::Convert2ComputationForm(_SimpleList* c1, _SimpleList* c2, _SimpleList* termsToInclude)
+{
+    // compList1 and two one will contain pairs of numbers to be interpreted as follows
+    // for pair (m,n)
+    // m>=0, n>=0, m!=last var
+    // m<0, n<0 - mult by -n-th power of var -m-1, do not add yet
+    // m<0, n>0 - mult by -n-th power of var -m-1, do add
+    // m>=0, n<0 - reset all vars after m and set the power of m-the var to -n, do not compute yet
+    // m>=0, n>0 - reset all vars after m and set the power of m-the var to -n, do add
+    // last var, n>0 - add n successive powers of last var
+    if ((theTerms->NumberOfTerms()!=0)&&(compList1.countitems()==0)) { // stuff to do
+        _SimpleList* cL1, *cL2, ti;
+
+        long i = 0,n=variableIndex.countitems()-1,p,l, s=0,j,*vi;
+        if (c1&&c2&&termsToInclude) {
+            cL1 = c1;
+            cL2 = c2;
+            ti.Duplicate (termsToInclude);
+        } else {
+            cL1 = &compList1;
+            cL2 = &compList2;
+            for (i=0; i<theTerms->actTerms; i++) {
+                ti<<i;
+            }
+            i = 0;
+        }
+        l = ti.countitems();
+        vi = ti.quickArrayAccess();
+        (*cL1).Clear();
+        (*cL2).Clear();
+
+        if (!theTerms->IsFirstANumber()) {
+            long* fst = theTerms->GetTerm(vi[0]);
+            p = fst[n];
+            // set up the first term
+            (*cL1)<<-n-1;
+            (*cL2)<<-p;
+
+            for (j=variableIndex.countitems()-2; j>=0; j--) {
+                p = fst[j];
+                if (p) {
+                    (*cL1)<<-j-1;
+                    (*cL2)<<-p;
+                }
+            }
+            (*cL2)[(*cL2).countitems()-1]*=-1;
+            if ((*cL2).countitems()>1) {
+                if (fst[n]==0) {
+                    (*cL2).Delete(0);
+                    (*cL1).Delete(0);
+                }
+            }
+        } else {
+            (*cL1)<<n;
+            (*cL2)<<0;
+        }
+        i++;
+        long* powerDiff = new long[n+2];
+        checkPointer(powerDiff);
+        for (; i<l; i++) { // even more stuff to do
+
+            long* cM = theTerms->GetTerm(vi[i]),
+                  * prevM = theTerms->GetTerm(vi[i-1]);
+            long k = 0, ch = -1;
+            bool    reset = false;
+            for (j=0; j<n; j++,cM++,prevM++) {
+                powerDiff[j]=*cM-*prevM;
+                if (powerDiff[j]) {
+                    if (ch<0) {
+                        ch = j;
+                    }
+                    k--;
+                    if (!reset) {
+                        reset = powerDiff[j]<0;
+                    }
+                }
+            }
+
+            powerDiff[j]=*cM-*prevM;
+
+            if (!reset) {
+                reset = powerDiff[n]<0;
+            }
+            if (!k) {
+                k = powerDiff[n];
+            } else if (powerDiff[n]) {
+                k--;
+            }
+            // analyze the difference
+            if (k==1) {
+                s++;
+                continue;
+            } else {
+                if (s>0) {
+                    (*cL1)<<n;
+                    (*cL2)<<s;
+                    s=0;
+                }
+                if (k>0) {
+                    (*cL1)<<n;
+                    (*cL2)<<-k;
+                    continue;
+                }
+                if (k<0) {
+                    // difference in more than one power
+                    if (k==-1) { // change in exactly one variable
+                        (*cL1)<<-ch-1;
+                        (*cL2)<<powerDiff[ch];
+
+                        continue;
+                    }
+                    // change in more than one variable
+                    (*cL1)<<(reset?ch:-ch-1);
+                    (*cL2)<<-powerDiff[ch];
+                    long c = ch+1;
+                    prevM = theTerms->GetTerm(vi[i-1])+c;
+                    for (; c<n; c++,prevM++) {
+                        if (powerDiff[c]>0) {
+                            (*cL1)<<-c-1;
+                            (*cL2)<<(reset?-(*prevM+powerDiff[c]):-powerDiff[c]);
+                        } else if (powerDiff[c]<0) {
+                            long tp = -(*prevM+powerDiff[c]);
+                            if (tp) {
+                                (*cL1)<<-c-1;
+                                (*cL2)<<tp;
+                            }
+                        } else if (reset) {
+                            if (*prevM) {
+                                (*cL1)<<-c-1;
+                                (*cL2)<<-*prevM;
+                            }
+                        }
+
+                    }
+                    if (powerDiff[n]>0) {
+                        (*cL1)<<-n-1;
+                        (*cL2)<<(reset?(-(*prevM+powerDiff[n])):-powerDiff[n]);
+                    } else if (powerDiff[n]<0) {
+                        long tp = -(*prevM+powerDiff[n]);
+                        if (tp) {
+                            (*cL1)<<-n-1;
+                            (*cL2)<<tp;
+                        }
+                    } else if (reset) {
+                        if (*prevM) {
+                            (*cL1)<<-n-1;
+                            (*cL2)<<-*prevM;
+
+                        }
+                    }
+                    (*cL2)[(*cL2).countitems()-1]*=-1;
+
+                }
+            }
+        }
+        if (s>0) {
+            (*cL1)<<n;
+            (*cL2)<<s;
+        }
+
+        delete (powerDiff);
+        if (!(c1&&c2)) {
+            free(theTerms->thePowers);
+            theTerms->thePowers = nil;
+        }
+    }
+}
+
+//__________________________________________________________________________________
+void _Polynomial::Convert2OperationForm (void)
+{
+    // see if anything needs to be done at all
+    if (compList1.countitems()&&!theTerms->thePowers) {
+        long  n = variableIndex.countitems()+1, m = compList1.countitems();
+        long  i1,i2,i,lp=n-2,*scratch=nil,index=0;
+        if (n>1) {
+            theTerms->thePowers = (long*)MemAllocate (theTerms->allocTerms*sizeof(long)*(n-1));
+            scratch = new long [n-1];
+            checkPointer(scratch);
+            memset (scratch,0,sizeof(long)*(n-1));
+            memset (theTerms->thePowers,0,theTerms->allocTerms*sizeof(long)*(n-1));
+        }
+
+        for (i=0; i<m; i++) { // loop over all commands
+            i1=compList1(i);
+            i2=compList2(i);
+            if (i1==lp) { // operations with the last var
+                if (i2>0) { // do several iterations
+                    for (long k=0; k<i2; k++,index++) {
+                        scratch[lp]++;
+                        theTerms->WriteTerm(scratch,index);
+                    }
+                } else {
+                    if (!i2) {
+                        theTerms->WriteTerm(scratch,index);
+                    } else {
+                        scratch[lp]-=i2;
+                        theTerms->WriteTerm(scratch,index);
+                    }
+                    index++;
+                }
+            } else {
+                if (i1<0) {
+                    bool compute = i2<0;
+                    i1=-i1-1;
+                    if (i2<0) {
+                        i2=-i2;
+                    }
+                    if (i2==1) {
+                        scratch[i1]++;
+                    } else {
+                        scratch[i1]+=i2;
+                    }
+                    if (compute) {
+                        continue;
+                    }
+                    theTerms->WriteTerm(scratch,index);
+                    index++;
+                } else {
+                    bool compute = i2<0;
+                    for (long k=i1+1; k<=lp; k++) {
+                        scratch[k]=0;
+                    }
+                    if (i2<0) {
+                        i2=-i2;
+                    }
+                    if (i2==1) {
+                        scratch[i1]++;
+                    } else {
+                        scratch[i1]+=i2;
+                    }
+
+                    if (compute) {
+                        continue;
+                    }
+                    theTerms->WriteTerm(scratch,index);
+                    index++;
+                }
+
+
+            }
+        }
+        if (scratch) {
+            delete scratch;
+        }
+        compList1.Clear();
+        compList2.Clear();
+    }
+
+}
+//__________________________________________________________________________________
+_MathObject* _Polynomial::Compute (void)
+{
+    return new _Constant (ComputePolynomial());
+}
+
+//__________________________________________________________________________________
+_Parameter _Polynomial::ComputePolynomial (void)
+//assumed that the poly is already in the comp form
+{
+    Convert2ComputationForm();
+    long n = variableIndex.countitems()+1;
+    _Parameter * varValues = new _Parameter[n];
+    checkPointer(varValues);
+    for (long i=0; i<n-1; i++) {
+        varValues[i]=LocateVar(variableIndex(i))->Compute()->Value();
+    }
+    _Parameter result = ComputeP (varValues, theTerms->GetCoeff(),n,compList1.countitems(),
+                                  compList1.quickArrayAccess(), compList2.quickArrayAccess());
+    delete varValues;
+    return result;
+}
+//__________________________________________________________________________________
+
+_Parameter      _Polynomial::ComputeP (_Parameter* varValues, _Parameter* compCoeff, long n, long m, long* c1, long* c2)
+{
+    _Parameter * holder = new _Parameter[n],term=1,result = 0,lv;
+    checkPointer(holder);
+    long  i1,i2,i,lp=n-2;
+    for (i=0; i<n-1; i++) {
+        holder[i]=1;
+    }
+    lv = n>1?varValues[n-2]:1;
+    for (i=0; i<m; i++,c1++,c2++) { // loop over all commands
+        i1=*c1;
+        i2=*c2;
+        if (i1==lp) { // operations with the last var
+            if (i2>0) { // do several iterations
+                for (long k=0; k<i2; k++,compCoeff++) {
+                    term*=lv;
+                    result+=term**compCoeff;
+                }
+            } else {
+                if (!i2) {
+                    result+=*compCoeff;
+                } else {
+                    term*=_PolynomialData::BinaryRaise(lv,-i2);
+                    result+=term**compCoeff;
+                }
+                compCoeff++;
+            }
+        } else {
+            if (i1<0) {
+                bool compute = i2<0;
+                i1=-i1-1;
+                if (compute) {
+                    i2=-i2;
+                }
+                if (i2==1) {
+                    holder[i1]*=varValues[i1];
+                    term*=varValues[i1];
+                } else {
+                    _Parameter p2 = _PolynomialData::BinaryRaise(varValues[i1],i2);
+                    holder[i1]*=p2;
+                    term*=p2;
+                }
+                if (compute) {
+                    continue;
+                }
+                result+=term**compCoeff;
+                compCoeff++;
+            } else {
+                bool compute = i2<0;
+                long k;
+                for (k=i1+1; k<=lp; k++) {
+                    holder[k]=1;
+                }
+                if (i2<0) {
+                    i2=-i2;
+                }
+                if (i2==1) {
+                    holder[i1]*=varValues[i1];
+                } else {
+                    holder[i1]*=_PolynomialData::BinaryRaise(varValues[i1],i2);
+                }
+                term = 1;
+                for (k=0; k<=i1; k++) {
+                    term*=holder[k];
+                }
+
+                if (compute) {
+                    continue;
+                }
+                result+=term**compCoeff;
+                compCoeff++;
+            }
+
+
+        }
+    }
+    delete holder;
+    return result;
+}
+//__________________________________________________________________________________
+
+void    _Polynomial::RankTerms(_SimpleList* receptacle)
+{
+    receptacle->Clear();
+    _Parameter  logTop = log(topPolyCap), *theCoeff = theTerms->GetCoeff();
+
+    for (long i = 0; i<theTerms->actTerms; i++,theCoeff++) {
+        (*receptacle)<<(long)(log(fabs(*theCoeff))+logTop*theTerms->SumOfPowers(i));
+    }
+}
+
+//__________________________________________________________________________________
+
+BaseObj* _Polynomial::toStr (void) {
+  _String result (10, true);
+  if (theTerms->NumberOfTerms()) {
+    long i;
+    _List _varNames;
+    for (i=0; i<variableIndex.countitems(); i++) {
+      _varNames<<LocateVar(variableIndex(i))->GetName();
+    }
+    
+    bool       firstN = theTerms->IsFirstANumber();
+    for (i=0; i<theTerms->NumberOfTerms(); i++) {
+      char        number [100];
+      
+      _Parameter  coeff = theTerms->GetCoeff(i);
+      
+      bool print_coeff = false;
+      
+      if ((i == 0 && firstN) || !CheckEqual(coeff, 1)) {
+        print_coeff = true;
+      }
+      
+      snprintf (number, sizeof(number),PRINTF_FORMAT_STRING,coeff);
+      if (i>0 && coeff >= 0.) {
+        result<<'+';
+      }
+      
+      if (print_coeff) {
+        result<<number;
+      }
+      
+      if (i>0 || !firstN) {
+        if (print_coeff) {
+          result<<'*';
+        }
+        long *cT = theTerms->GetTerm(i);
+        bool      printedFirst = false;
+        for (long k=0; k<variableIndex.countitems(); k++,cT++) {
+          if (*cT>0) {
+            if (printedFirst) {
+              result<<'*';
+            } else {
+              printedFirst = true;
+            }
+            
+            result<<(_String*)_varNames(k);
+            if (*cT>1) {
+              result<<'^';
+              _String st (*cT);
+              result<< *cT;
+            }
+          }
+        }
+      }
+    }
+  } else {
+    _String*s = (_String*)compList1.toStr();
+    result<<s;
+    result<<'\n';
+    DeleteObject(s);
+    s = (_String*)compList2.toStr();
+    result<<s;
+    result<<'\n';
+    DeleteObject(s);
+  }
+  result.Finalize();
+  return result.makeDynamic();
+}
+
+//__________________________________________________________________________________
+
+void _Polynomial::toFileStr (FILE*f)
+{
+    if (theTerms->NumberOfTerms()&&theTerms->thePowers) {
+        fprintf(f,"p(");
+        _List _varNames;
+        long i;
+        for (i=0; i<variableIndex.countitems(); i++) {
+            _varNames<<LocateVar(variableIndex(i))->GetName();
+            fprintf(f,"%s",((_String*)_varNames(i))->sData);
+            if (i<variableIndex.countitems()-1) {
+                fprintf(f,",");
+            }
+        }
+        fprintf(f,")=");
+        for (i=0; i<theTerms->NumberOfTerms(); i++) {
+            char number [100];
+            snprintf (number, sizeof(number),PRINTF_FORMAT_STRING,theTerms->GetCoeff(i));
+            if ((i>0)&&(number[0]!='-')) {
+                fprintf(f,"+");
+            }
+            fprintf(f,"%s",number);
+            if ((i>0)||!theTerms->IsFirstANumber()) {
+                fprintf(f,"*");
+                long *cT = theTerms->GetTerm(i);
+                for (long k=0; k<variableIndex.countitems(); k++,cT++) {
+                    if (*cT>0) {
+                        fprintf(f,"%s",((_String*)_varNames(k))->sData);
+                        if (*cT>1) {
+                            fprintf(f,"^");;
+                            fprintf(f,"%ld",*cT);
+                        }
+                    }
+                }
+            }
+        }
+    } else {
+        compList1.toFileStr(f);
+        compList2.toFileStr(f);
+    }
+}
+
+//__________________________________________________________________________________
+void    _Polynomial::ScanForVariables (_AVLList&l, bool globals, _AVLListX* tagger, long weight)
+{
+    for (long i = 0; i<variableIndex.lLength; i++) {
+        long vi = variableIndex(i);
+
+        _Variable* v = LocateVar (vi);
+        if (v->IsGlobal()) {
+            if (globals) {
+                l.Insert ((BaseRef)vi);
+                if (tagger) {
+                    tagger->UpdateValue((BaseRef)vi, weight, 0);
+                }
+            }
+        } else {
+            l.Insert ((BaseRef)vi);
+            if (tagger) {
+                tagger->UpdateValue((BaseRef)vi, weight, 0);
+            }
+       }
+    }
+}
+
+//__________________________________________________________________________________
+bool    _Polynomial::IsObjectEmpty (void)
+{
+    if (compList1.countitems()) {
+        return false;
+    }
+    if (theTerms->NumberOfTerms()) {
+        if (theTerms->NumberOfTerms()==1) {
+            if(theTerms->IsFirstANumber()) {
+                return theTerms->theCoeff[0]==0.0;
+            }
+        }
+        return false;
+    }
+    return true;
+}
+//__________________________________________________________________________________
+bool    _Polynomial::HasChanged (void)
+{
+    for (long k=variableIndex.countitems()-1; k>=0; k--) {
+        if (LocateVar(variableIndex(k))->HasChanged()) {
+            return true;
+        }
+    }
+    return false;
+}
+
+//__________________________________________________________________________________
+bool    _Polynomial::IsMaxElement (_Parameter bench)
+{
+    _Parameter* tc = theTerms->GetCoeff();
+    for (long k=0; k<theTerms->actTerms; k++, tc++) {
+        if (fabs(*tc)>=bench) {
+            return true;
+        }
+    }
+    return false;
+}
+
+//__________________________________________________________________________________
+void    SetPolyTermCap (long t)
+{
+    polyTermCap = t;
+}
diff --git a/src/core/ptr_array.cp b/src/core/ptr_array.cp
new file mode 100644
index 0000000..724682c
--- /dev/null
+++ b/src/core/ptr_array.cp
@@ -0,0 +1,97 @@
+/*
+
+HyPhy - Hypothesis Testing Using Phylogenies.
+
+Copyright (C) 1997-2006  
+Primary Development:
+  Sergei L Kosakovsky Pond (sergeilkp at mac.com)
+Significant contributions from:
+  Spencer V Muse (muse at stat.ncsu.edu)
+  Simon DW Frost (sdfrost at ucsd.edu)
+  Art FY Poon    (apoon at biomail.ucsd.edu)
+						 
+Some of the Original Code by William A Casey.
+
+Permission is hereby granted, free of charge, to any person obtaining a
+copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be included
+in all copies or substantial portions of the Software.
+
+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.
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+*/
+
+
+//------------------------------------------------------------------------
+
+template <class array_data> void ptr_array<array_data >::add(array_data in){
+
+		length++;
+        if (length > 1)
+		{
+			 array_data *temp = new array_data[length];
+			 for (long i=0;i < length - 1; i++)
+				temp[i] = data[i];
+			 delete [] data;
+			 data = temp;
+			 data[length-1] = in;
+		}
+        else
+		{
+			 data = new array_data[1];
+			 data[0] = in;
+		}
+}
+
+//------------------------------------------------------------------------
+
+template <class array_data>	void ptr_array<array_data >::prepend(array_data in){
+	
+		length++;
+        if (length > 1)
+		{
+			 array_data *temp = new array_data[length];
+			 for (long i=1;i < (length); i++)
+				temp[i] = data[i-1];
+			 delete [] data;
+			 data = temp;
+			 data[0] = in;
+		}
+        else
+		{
+			 data = new array_data[1];
+			 data[0] = in;
+		}
+}
+
+//------------------------------------------------------------------------
+
+template <class array_data>	void ptr_array<array_data>::delete_entry(int index){
+
+  array_data *temp;
+  if (length > 0){
+	  length--;
+      if (length) {
+          temp = new array_data [length];
+          for (long i=0; i < index-1 ; i++) temp[i] = data[i];
+          for (long k=index-1; k < length; k++) temp[k] = data[k+1];
+      } else {
+        temp = nil;
+      } 
+      delete [] data;
+      data = temp;
+  }
+}
+///____________________________________________________________
diff --git a/src/core/regex.cpp b/src/core/regex.cpp
new file mode 100644
index 0000000..90aac01
--- /dev/null
+++ b/src/core/regex.cpp
@@ -0,0 +1,5075 @@
+/* Extended regular expression matching and search library,
+   version 0.12.
+   (Implements POSIX draft P10003.2/D11.2, except for
+   internationalization features.)
+
+   Copyright (C) 1993 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 2, 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., 675 Mass Ave, Cambridge, MA 02139, USA.  */
+
+/* Modified by Sergei L. Kosakovsky Pond.
+   C style declarations converted to C++.
+   Functions prototypes included.
+   Compiles with Metrowerks CW 8.3.
+   Runs with Mac OS Carbon and Win 32
+*/
+
+/* AIX requires this to be the first thing in the file. */
+#if defined (_AIX) && !defined (REGEX_MALLOC)
+#pragma alloca
+#endif
+
+#if !defined REGEX_MALLOC && !defined __MINGW32__
+#include <alloca.h>
+#endif
+
+#ifndef _GNU_SOURCE
+#define _GNU_SOURCE
+#endif
+
+/* We need this for `regex.h', and perhaps for the Emacs include files.  */
+/*#include <sys/types.h>*/
+#include <stddef.h>
+
+#if defined (_AIX)
+#define _H_REGEX
+#include "gnuregex.h"
+#endif
+
+#define STDC_HEADERS
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+/* The `emacs' switch turns on certain matching commands
+   that make sense only in Emacs. */
+#ifdef emacs
+
+#include "lisp.h"
+#include "buffer.h"
+#include "syntax.h"
+
+/* Emacs uses `NULL' as a predicate.  */
+#undef NULL
+
+#else  /* not emacs */
+
+/* We used to test for `BSTRING' here, but only GCC and Emacs define
+   `BSTRING', as far as I know, and neither of them use this code.  */
+#ifdef STDC_HEADERS
+#include <string.h>
+#ifndef bcmp
+#define bcmp(s1, s2, n) memcmp ((s1), (s2), (n))
+#endif
+#ifndef bcopy
+#define bcopy(s, d, n)  memcpy ((d), (s), (n))
+#endif
+#ifndef bzero
+#define bzero(s, n) memset ((s), 0, (n))
+#endif
+#else
+#include <strings.h>
+#endif
+
+#ifdef STDC_HEADERS
+#include <stdlib.h>
+#else
+char *malloc ();
+char *realloc ();
+#endif
+
+typedef const unsigned char *fail_stack_elt_t;
+
+/* Declarations and macros for re_match_2.  */
+
+/*static int bcmp_translate ();
+static boolean alt_match_null_string_p (),
+               common_op_match_null_string_p (),
+               group_match_null_string_p ();*/
+
+/* Structure for per-register (a.k.a. per-group) information.
+   This must not be longer than one word, because we push this value
+   onto the failure stack.  Other register information, such as the
+   starting and ending positions (which are addresses), and the list of
+   inner groups (which is a bits list) are maintained in separate
+   variables.
+
+   We are making a (strictly speaking) nonportable assumption here: that
+   the compiler will pack our bit fields into something that fits into
+   the type of `word', i.e., is something that fits into one item on the
+   failure stack.  */
+typedef union {
+    fail_stack_elt_t word;
+    struct {
+        /* This field is one if this group can match the empty string,
+           zero if not.  If not yet determined,  `MATCH_NULL_UNSET_VALUE'.  */
+#define MATCH_NULL_UNSET_VALUE 3
+        unsigned match_null_string_p : 2;
+        unsigned is_active : 1;
+        unsigned matched_something : 1;
+        unsigned ever_matched_something : 1;
+    } bits;
+} register_info_type;
+
+
+/* Define the syntax stuff for \<, \>, etc.  */
+
+/* This must be nonzero for the wordchar and notwordchar pattern
+   commands in re_match_2.  */
+#ifndef Sword
+#define Sword 1
+#endif
+
+#ifdef SYNTAX_TABLE
+
+extern char *re_syntax_table;
+
+#else /* not SYNTAX_TABLE */
+
+/* How many characters in the character set.  */
+#define CHAR_SET_SIZE 256
+
+static char re_syntax_table[CHAR_SET_SIZE];
+
+static void
+init_syntax_once (void)
+{
+    register int c;
+    static int done = 0;
+
+    if (done) {
+        return;
+    }
+
+    bzero (re_syntax_table, sizeof re_syntax_table);
+
+    for (c = 'a'; c <= 'z'; c++) {
+        re_syntax_table[c] = Sword;
+    }
+
+    for (c = 'A'; c <= 'Z'; c++) {
+        re_syntax_table[c] = Sword;
+    }
+
+    for (c = '0'; c <= '9'; c++) {
+        re_syntax_table[c] = Sword;
+    }
+
+    re_syntax_table['_'] = Sword;
+
+    done = 1;
+}
+
+#endif /* not SYNTAX_TABLE */
+
+#define SYNTAX(c) re_syntax_table[c]
+
+#endif /* not emacs */
+
+/* Get the interface, including the syntax bits.  */
+#if !defined (_AIX)
+#include "gnuregex.h"
+#endif
+
+/* isalpha etc. are used for the character classes.  */
+#include <ctype.h>
+
+#ifndef isascii
+#define isascii(c) 1
+#endif
+
+#ifdef isblank
+#define ISBLANK(c) (isascii (c) && isblank (c))
+#else
+#define ISBLANK(c) ((c) == ' ' || (c) == '\t')
+#endif
+#ifdef isgraph
+#define ISGRAPH(c) (isascii (c) && isgraph (c))
+#else
+#define ISGRAPH(c) (isascii (c) && isprint (c) && !isspace (c))
+#endif
+
+#define ISPRINT(c) (isascii (c) && isprint (c))
+#define ISDIGIT(c) (isascii (c) && isdigit (c))
+#define ISALNUM(c) (isascii (c) && isalnum (c))
+#define ISALPHA(c) (isascii (c) && isalpha (c))
+#define ISCNTRL(c) (isascii (c) && iscntrl (c))
+#define ISLOWER(c) (isascii (c) && islower (c))
+#define ISPUNCT(c) (isascii (c) && ispunct (c))
+#define ISSPACE(c) (isascii (c) && isspace (c))
+#define ISUPPER(c) (isascii (c) && isupper (c))
+#define ISXDIGIT(c) (isascii (c) && isxdigit (c))
+
+#ifndef NULL
+#define NULL 0
+#endif
+
+/* We remove any previous definition of `SIGN_EXTEND_CHAR',
+   since ours (we hope) works properly with all combinations of
+   machines, compilers, `char' and `unsigned char' argument types.
+   (Per Bothner suggested the basic approach.)  */
+#undef SIGN_EXTEND_CHAR
+#ifdef __STDC__
+#define SIGN_EXTEND_CHAR(c) ((signed char) (c))
+#else  /* not __STDC__ */
+/* As in Harbison and Steele.  */
+#define SIGN_EXTEND_CHAR(c) ((((unsigned char) (c)) ^ 128) - 128)
+#endif
+

+/* Should we use malloc or alloca?  If REGEX_MALLOC is not defined, we
+   use `alloca' instead of `malloc'.  This is because using malloc in
+   re_search* or re_match* could cause memory leaks when C-g is used in
+   Emacs; also, malloc is slower and causes storage fragmentation.  On
+   the other hand, malloc is more portable, and easier to debug.
+
+   Because we sometimes use alloca, some routines have to be macros,
+   not functions -- `alloca'-allocated space disappears at the end of the
+   function it is called in.  */
+
+#ifdef REGEX_MALLOC
+
+#define REGEX_ALLOCATE malloc
+#define REGEX_REALLOCATE(source, osize, nsize) realloc (source, nsize)
+
+#else /* not REGEX_MALLOC  */
+
+/* Emacs already defines alloca, sometimes.  */
+#ifndef alloca
+
+/* Make alloca work the best possible way.  */
+#ifdef __GNUC__
+#define alloca __builtin_alloca
+#else /* not __GNUC__ */
+#if HAVE_ALLOCA_H
+#include <alloca.h>
+#else /* not __GNUC__ or HAVE_ALLOCA_H */
+#ifndef _AIX /* Already did AIX, up at the top.  */
+char *alloca ();
+#endif /* not _AIX */
+#endif /* not HAVE_ALLOCA_H */
+#endif /* not __GNUC__ */
+
+#endif /* not alloca */
+
+#define REGEX_ALLOCATE alloca
+
+/* Assumes a `char *destination' variable.  */
+#define REGEX_REALLOCATE(source, osize, nsize)              \
+  (destination = (char *) alloca (nsize),               \
+   bcopy (source, destination, osize),                  \
+   destination)
+
+#endif /* not REGEX_MALLOC */
+
+
+/* True if `size1' is non-NULL and PTR is pointing anywhere inside
+   `string1' or just past its end.  This works if PTR is NULL, which is
+   a good thing.  */
+#define FIRST_STRING_P(ptr)                     \
+  (size1 && string1 <= (ptr) && (ptr) <= string1 + size1)
+
+/* (Re)Allocate N items of type T using malloc, or fail.  */
+#define TALLOC(n, t) ((t *) malloc ((n) * sizeof (t)))
+#define RETALLOC(addr, n, t) ((addr) = (t *) realloc (addr, (n) * sizeof (t)))
+#define REGEX_TALLOC(n, t) ((t *) REGEX_ALLOCATE ((n) * sizeof (t)))
+
+#define BYTEWIDTH 8 /* In bits.  */
+
+#define STREQ(s1, s2) ((strcmp (s1, s2) == 0))
+
+#define MAX(a, b) ((a) > (b) ? (a) : (b))
+#define MIN(a, b) ((a) < (b) ? (a) : (b))
+
+#if !defined __WINDOZE__  || defined __BORLAND_HACK__ || defined __MINGW32__
+typedef char boolean;
+#endif
+
+#define false 0
+#define true 1
+
+/* These are the command codes that appear in compiled regular
+   expressions.  Some opcodes are followed by argument bytes.  A
+   command code can specify any interpretation whatsoever for its
+   arguments.  Zero bytes may appear in the compiled regular expression.
+
+   The value of `exactn' is needed in search.c (search_buffer) in Emacs.
+   So regex.h defines a symbol `RE_EXACTN_VALUE' to be 1; the value of
+   `exactn' we use here must also be 1.  */
+
+typedef enum {
+    no_op = 0,
+
+    /* Followed by one byte giving n, then by n literal bytes.  */
+    exactn = 1,
+
+    /* Matches any (more or less) character.  */
+    anychar,
+
+    /* Matches any one char belonging to specified set.  First
+       following byte is number of bitmap bytes.  Then come bytes
+       for a bitmap saying which chars are in.  Bits in each byte
+       are ordered low-bit-first.  A character is in the set if its
+       bit is 1.  A character too large to have a bit in the map is
+       automatically not in the set.  */
+    charset,
+
+    /* Same parameters as charset, but match any character that is
+       not one of those specified.  */
+    charset_not,
+
+    /* Start remembering the text that is matched, for storing in a
+       register.  Followed by one byte with the register number, in
+       the range 0 to one less than the pattern buffer's re_nsub
+       field.  Then followed by one byte with the number of groups
+       inner to this one.  (This last has to be part of the
+       start_memory only because we need it in the on_failure_jump
+       of re_match_2.)  */
+    start_memory,
+
+    /* Stop remembering the text that is matched and store it in a
+       memory register.  Followed by one byte with the register
+       number, in the range 0 to one less than `re_nsub' in the
+       pattern buffer, and one byte with the number of inner groups,
+       just like `start_memory'.  (We need the number of inner
+       groups here because we don't have any easy way of finding the
+       corresponding start_memory when we're at a stop_memory.)  */
+    stop_memory,
+
+    /* Match a duplicate of something remembered. Followed by one
+       byte containing the register number.  */
+    duplicate,
+
+    /* Fail unless at beginning of line.  */
+    begline,
+
+    /* Fail unless at end of line.  */
+    endline,
+
+    /* Succeeds if at beginning of buffer (if emacs) or at beginning
+       of string to be matched (if not).  */
+    begbuf,
+
+    /* Analogously, for end of buffer/string.  */
+    endbuf,
+
+    /* Followed by two byte relative address to which to jump.  */
+    jump,
+
+    /* Same as jump, but marks the end of an alternative.  */
+    jump_past_alt,
+
+    /* Followed by two-byte relative address of place to resume at
+       in case of failure.  */
+    on_failure_jump,
+
+    /* Like on_failure_jump, but pushes a placeholder instead of the
+       current string position when executed.  */
+    on_failure_keep_string_jump,
+
+    /* Throw away latest failure point and then jump to following
+       two-byte relative address.  */
+    pop_failure_jump,
+
+    /* Change to pop_failure_jump if know won't have to backtrack to
+       match; otherwise change to jump.  This is used to jump
+       back to the beginning of a repeat.  If what follows this jump
+       clearly won't match what the repeat does, such that we can be
+       sure that there is no use backtracking out of repetitions
+       already matched, then we change it to a pop_failure_jump.
+       Followed by two-byte address.  */
+    maybe_pop_jump,
+
+    /* Jump to following two-byte address, and push a dummy failure
+       point. This failure point will be thrown away if an attempt
+       is made to use it for a failure.  A `+' construct makes this
+       before the first repeat.  Also used as an intermediary kind
+       of jump when compiling an alternative.  */
+    dummy_failure_jump,
+
+    /* Push a dummy failure point and continue.  Used at the end of
+       alternatives.  */
+    push_dummy_failure,
+
+    /* Followed by two-byte relative address and two-byte number n.
+       After matching N times, jump to the address upon failure.  */
+    succeed_n,
+
+    /* Followed by two-byte relative address, and two-byte number n.
+       Jump to the address N times, then fail.  */
+    jump_n,
+
+    /* Set the following two-byte relative address to the
+       subsequent two-byte number.  The address *includes* the two
+       bytes of number.  */
+    set_number_at,
+
+    wordchar,   /* Matches any word-constituent character.  */
+    notwordchar,    /* Matches any char that is not a word-constituent.  */
+
+    wordbeg,    /* Succeeds if at word beginning.  */
+    wordend,    /* Succeeds if at word end.  */
+
+    wordbound,  /* Succeeds if at a word boundary.  */
+    notwordbound    /* Succeeds if not at a word boundary.  */
+
+#ifdef emacs
+    ,before_dot,    /* Succeeds if before point.  */
+    at_dot, /* Succeeds if at point.  */
+    after_dot,  /* Succeeds if after point.  */
+
+    /* Matches any character whose syntax is specified.  Followed by
+           a byte which contains a syntax code, e.g., Sword.  */
+    syntaxspec,
+
+    /* Matches any character whose syntax is not that specified.  */
+    notsyntaxspec
+#endif /* emacs */
+} re_opcode_t;
+

+/* Common operations on the compiled pattern.  */
+
+/* Store NUMBER in two contiguous bytes starting at DESTINATION.  */
+
+#define STORE_NUMBER(destination, number)               \
+  do {                                  \
+    (destination)[0] = (number) & 0377;                 \
+    (destination)[1] = (number) >> 8;                   \
+  } while (0)
+
+/* Same as STORE_NUMBER, except increment DESTINATION to
+   the byte after where the number is stored.  Therefore, DESTINATION
+   must be an lvalue.  */
+
+#define STORE_NUMBER_AND_INCR(destination, number)          \
+  do {                                  \
+    STORE_NUMBER (destination, number);                 \
+    (destination) += 2;                         \
+  } while (0)
+
+/* Put into DESTINATION a number stored in two contiguous bytes starting
+   at SOURCE.  */
+
+#define EXTRACT_NUMBER(destination, source)             \
+  do {                                  \
+    (destination) = *(source) & 0377;                   \
+    (destination) += SIGN_EXTEND_CHAR (*((source) + 1)) << 8;       \
+  } while (0)
+
+#ifdef DEBUG
+static void
+extract_number (
+    int *dest,
+    unsigned char *source)
+{
+    int temp = SIGN_EXTEND_CHAR (*(source + 1));
+    *dest = *source & 0377;
+    *dest += temp << 8;
+}
+
+#ifndef EXTRACT_MACROS /* To debug the macros.  */
+#undef EXTRACT_NUMBER
+#define EXTRACT_NUMBER(dest, src) extract_number (&dest, src)
+#endif /* not EXTRACT_MACROS */
+
+#endif /* DEBUG */
+
+/* Same as EXTRACT_NUMBER, except increment SOURCE to after the number.
+   SOURCE must be an lvalue.  */
+
+#define EXTRACT_NUMBER_AND_INCR(destination, source)            \
+  do {                                  \
+    EXTRACT_NUMBER (destination, source);               \
+    (source) += 2;                          \
+  } while (0)
+
+#ifdef DEBUG
+static void
+extract_number_and_incr (
+    int *destination,
+    unsigned char **source)
+{
+    extract_number (destination, *source);
+    *source += 2;
+}
+
+#ifndef EXTRACT_MACROS
+#undef EXTRACT_NUMBER_AND_INCR
+#define EXTRACT_NUMBER_AND_INCR(dest, src) \
+  extract_number_and_incr (&dest, &src)
+#endif /* not EXTRACT_MACROS */
+
+#endif /* DEBUG */
+

+/* If DEBUG is defined, Regex prints many voluminous messages about what
+   it is doing (if the variable `debug' is nonzero).  If linked with the
+   main program in `iregex.c', you can enter patterns and strings
+   interactively.  And if linked with the main program in `main.c' and
+   the other test files, you can run the already-written tests.  */
+
+
+#ifdef DEBUG
+
+/* We use standard I/O for debugging.  */
+#include <stdio.h>
+
+/* It is useful to test things that ``must'' be true when debugging.  */
+#include <assert.h>
+
+static int debug = 0;
+
+#define DEBUG_STATEMENT(e) e
+#define DEBUG_PRINT1(x) if (debug) printf (x)
+#define DEBUG_PRINT2(x1, x2) if (debug) printf (x1, x2)
+#define DEBUG_PRINT3(x1, x2, x3) if (debug) printf (x1, x2, x3)
+#define DEBUG_PRINT4(x1, x2, x3, x4) if (debug) printf (x1, x2, x3, x4)
+#define DEBUG_PRINT_COMPILED_PATTERN(p, s, e)               \
+  if (debug) print_partial_compiled_pattern (s, e)
+#define DEBUG_PRINT_DOUBLE_STRING(w, s1, sz1, s2, sz2)          \
+  if (debug) print_double_string (w, s1, sz1, s2, sz2)
+
+extern void printchar ();
+
+/* Print the fastmap in human-readable form.  */
+
+void    print_fastmap (char *fastmap)
+{
+    unsigned was_a_range = 0;
+    unsigned i = 0;
+
+    while (i < (1 << BYTEWIDTH)) {
+        if (fastmap[i++]) {
+            was_a_range = 0;
+            printchar (i - 1);
+            while (i < (1 << BYTEWIDTH)  &&  fastmap[i]) {
+                was_a_range = 1;
+                i++;
+            }
+            if (was_a_range) {
+                printf ("-");
+                printchar (i - 1);
+            }
+        }
+    }
+    putchar ('\n');
+}
+
+
+/* Print a compiled pattern string in human-readable form, starting at
+   the START pointer into it and ending just before the pointer END.  */
+
+void
+print_partial_compiled_pattern (unsigned char *start, unsigned char *end)
+{
+    int mcnt, mcnt2;
+    unsigned char *p = start;
+    unsigned char *pend = end;
+
+    if (start == NULL) {
+        printf ("(null)\n");
+        return;
+    }
+
+    /* Loop over pattern commands.  */
+    while (p < pend) {
+        switch ((re_opcode_t) *p++) {
+        case no_op:
+            printf ("/no_op");
+            break;
+
+        case exactn:
+            mcnt = *p++;
+            printf ("/exactn/%d", mcnt);
+            do {
+                putchar ('/');
+                printchar (*p++);
+            } while (--mcnt);
+            break;
+
+        case start_memory:
+            mcnt = *p++;
+            printf ("/start_memory/%d/%d", mcnt, *p++);
+            break;
+
+        case stop_memory:
+            mcnt = *p++;
+            printf ("/stop_memory/%d/%d", mcnt, *p++);
+            break;
+
+        case duplicate:
+            printf ("/duplicate/%d", *p++);
+            break;
+
+        case anychar:
+            printf ("/anychar");
+            break;
+
+        case charset:
+        case charset_not: {
+            register int c;
+
+            printf ("/charset%s",
+                    (re_opcode_t) *(p - 1) == charset_not ? "_not" : "");
+
+            assert (p + *p < pend);
+
+            for (c = 0; c < *p; c++) {
+                unsigned bit;
+                unsigned char map_byte = p[1 + c];
+
+                putchar ('/');
+
+                for (bit = 0; bit < BYTEWIDTH; bit++)
+                    if (map_byte & (1 << bit)) {
+                        printchar (c * BYTEWIDTH + bit);
+                    }
+            }
+            p += 1 + *p;
+            break;
+        }
+
+        case begline:
+            printf ("/begline");
+            break;
+
+        case endline:
+            printf ("/endline");
+            break;
+
+        case on_failure_jump:
+            extract_number_and_incr (&mcnt, &p);
+            printf ("/on_failure_jump/0/%d", mcnt);
+            break;
+
+        case on_failure_keep_string_jump:
+            extract_number_and_incr (&mcnt, &p);
+            printf ("/on_failure_keep_string_jump/0/%d", mcnt);
+            break;
+
+        case dummy_failure_jump:
+            extract_number_and_incr (&mcnt, &p);
+            printf ("/dummy_failure_jump/0/%d", mcnt);
+            break;
+
+        case push_dummy_failure:
+            printf ("/push_dummy_failure");
+            break;
+
+        case maybe_pop_jump:
+            extract_number_and_incr (&mcnt, &p);
+            printf ("/maybe_pop_jump/0/%d", mcnt);
+            break;
+
+        case pop_failure_jump:
+            extract_number_and_incr (&mcnt, &p);
+            printf ("/pop_failure_jump/0/%d", mcnt);
+            break;
+
+        case jump_past_alt:
+            extract_number_and_incr (&mcnt, &p);
+            printf ("/jump_past_alt/0/%d", mcnt);
+            break;
+
+        case jump:
+            extract_number_and_incr (&mcnt, &p);
+            printf ("/jump/0/%d", mcnt);
+            break;
+
+        case succeed_n:
+            extract_number_and_incr (&mcnt, &p);
+            extract_number_and_incr (&mcnt2, &p);
+            printf ("/succeed_n/0/%d/0/%d", mcnt, mcnt2);
+            break;
+
+        case jump_n:
+            extract_number_and_incr (&mcnt, &p);
+            extract_number_and_incr (&mcnt2, &p);
+            printf ("/jump_n/0/%d/0/%d", mcnt, mcnt2);
+            break;
+
+        case set_number_at:
+            extract_number_and_incr (&mcnt, &p);
+            extract_number_and_incr (&mcnt2, &p);
+            printf ("/set_number_at/0/%d/0/%d", mcnt, mcnt2);
+            break;
+
+        case wordbound:
+            printf ("/wordbound");
+            break;
+
+        case notwordbound:
+            printf ("/notwordbound");
+            break;
+
+        case wordbeg:
+            printf ("/wordbeg");
+            break;
+
+        case wordend:
+            printf ("/wordend");
+
+#ifdef emacs
+        case before_dot:
+            printf ("/before_dot");
+            break;
+
+        case at_dot:
+            printf ("/at_dot");
+            break;
+
+        case after_dot:
+            printf ("/after_dot");
+            break;
+
+        case syntaxspec:
+            printf ("/syntaxspec");
+            mcnt = *p++;
+            printf ("/%d", mcnt);
+            break;
+
+        case notsyntaxspec:
+            printf ("/notsyntaxspec");
+            mcnt = *p++;
+            printf ("/%d", mcnt);
+            break;
+#endif /* emacs */
+
+        case wordchar:
+            printf ("/wordchar");
+            break;
+
+        case notwordchar:
+            printf ("/notwordchar");
+            break;
+
+        case begbuf:
+            printf ("/begbuf");
+            break;
+
+        case endbuf:
+            printf ("/endbuf");
+            break;
+
+        default:
+            printf ("?%d", *(p-1));
+        }
+    }
+    printf ("/\n");
+}
+
+
+void
+print_compiled_pattern (struct re_pattern_buffer *bufp)
+{
+    unsigned char *buffer = bufp->buffer;
+
+    print_partial_compiled_pattern (buffer, buffer + bufp->used);
+    printf ("%d bytes used/%d bytes allocated.\n", bufp->used, bufp->allocated);
+
+    if (bufp->fastmap_accurate && bufp->fastmap) {
+        printf ("fastmap: ");
+        print_fastmap (bufp->fastmap);
+    }
+
+    printf ("re_nsub: %d\t", bufp->re_nsub);
+    printf ("regs_alloc: %d\t", bufp->regs_allocated);
+    printf ("can_be_null: %d\t", bufp->can_be_null);
+    printf ("newline_anchor: %d\n", bufp->newline_anchor);
+    printf ("no_sub: %d\t", bufp->no_sub);
+    printf ("not_bol: %d\t", bufp->not_bol);
+    printf ("not_eol: %d\t", bufp->not_eol);
+    printf ("syntax: %d\n", bufp->syntax);
+    /* Perhaps we should print the translate table?  */
+}
+
+
+void
+print_double_string (
+    const char *where,
+    const char *string1,
+    const char *string2,
+    int size1,
+    int size2)
+{
+    unsigned this_char;
+
+    if (where == NULL) {
+        printf ("(null)");
+    } else {
+        if (FIRST_STRING_P (where)) {
+            for (this_char = where - string1; this_char < size1; this_char++) {
+                printchar (string1[this_char]);
+            }
+
+            where = string2;
+        }
+
+        for (this_char = where - string2; this_char < size2; this_char++) {
+            printchar (string2[this_char]);
+        }
+    }
+}
+
+#else /* not DEBUG */
+
+#undef assert
+#define assert(e)
+
+#define DEBUG_STATEMENT(e)
+#define DEBUG_PRINT1(x)
+#define DEBUG_PRINT2(x1, x2)
+#define DEBUG_PRINT3(x1, x2, x3)
+#define DEBUG_PRINT4(x1, x2, x3, x4)
+#define DEBUG_PRINT_COMPILED_PATTERN(p, s, e)
+#define DEBUG_PRINT_DOUBLE_STRING(w, s1, sz1, s2, sz2)
+
+#endif /* not DEBUG */
+

+/* Set by `re_set_syntax' to the current regexp syntax to recognize.  Can
+   also be assigned to arbitrarily: each pattern buffer stores its own
+   syntax, so it can be changed between regex compilations.  */
+reg_syntax_t re_syntax_options = RE_SYNTAX_EMACS;
+
+
+/* Specify the precise syntax of regexps for compilation.  This provides
+   for compatibility for various utilities which historically have
+   different, incompatible syntaxes.
+
+   The argument SYNTAX is a bit mask comprised of the various bits
+   defined in regex.h.  We return the old syntax.  */
+
+reg_syntax_t    re_set_syntax (reg_syntax_t syntax)
+{
+    reg_syntax_t ret = re_syntax_options;
+
+    re_syntax_options = syntax;
+    return ret;
+}
+

+/* This table gives an error message for each of the error codes listed
+   in regex.h.  Obviously the order here has to be same as there.  */
+
+static const char *re_error_msg[] = {
+    NULL,                   /* REG_NOERROR */
+    "No match",                 /* REG_NOMATCH */
+    "Invalid regular expression",       /* REG_BADPAT */
+    "Invalid collation character",      /* REG_ECOLLATE */
+    "Invalid character class name",     /* REG_ECTYPE */
+    "Trailing backslash",           /* REG_EESCAPE */
+    "Invalid back reference",           /* REG_ESUBREG */
+    "Unmatched [ or [^",            /* REG_EBRACK */
+    "Unmatched ( or \\(",           /* REG_EPAREN */
+    "Unmatched \\{",                /* REG_EBRACE */
+    "Invalid content of \\{\\}",        /* REG_BADBR */
+    "Invalid range end",            /* REG_ERANGE */
+    "Memory exhausted",             /* REG_ESPACE */
+    "Invalid preceding regular expression", /* REG_BADRPT */
+    "Premature end of regular expression",  /* REG_EEND */
+    "Regular expression too big",       /* REG_ESIZE */
+    "Unmatched ) or \\)",           /* REG_ERPAREN */
+};
+

+/* Subroutine declarations and macros for regex_compile.  */
+
+/*static void store_op1 (), store_op2 ();
+static void insert_op1 (), insert_op2 ();
+static boolean at_begline_loc_p (), at_endline_loc_p ();
+static boolean group_in_compile_stack ();
+static reg_errcode_t compile_range ();*/
+
+/* Fetch the next character in the uncompiled pattern---translating it
+   if necessary.  Also cast from a signed character in the constant
+   string passed to us by the user to an unsigned char that we can use
+   as an array index (in, e.g., `translate').  */
+#define PATFETCH(c)                         \
+  do {if (p == pend) return REG_EEND;                   \
+    c = (unsigned char) *p++;                       \
+    if (translate) c = translate[c];                    \
+  } while (0)
+
+/* Fetch the next character in the uncompiled pattern, with no
+   translation.  */
+#define PATFETCH_RAW(c)                         \
+  do {if (p == pend) return REG_EEND;                   \
+    c = (unsigned char) *p++;                       \
+  } while (0)
+
+/* Go backwards one character in the pattern.  */
+#define PATUNFETCH p--
+
+
+/* If `translate' is non-null, return translate[D], else just D.  We
+   cast the subscript to translate because some data is declared as
+   `char *', to avoid warnings when a string constant is passed.  But
+   when we use a character as a subscript we must make it unsigned.  */
+#define TRANSLATE(d) (translate ? translate[(unsigned char) (d)] : (d))
+
+
+/* Macros for outputting the compiled pattern into `buffer'.  */
+
+/* If the buffer isn't allocated when it comes in, use this.  */
+#define INIT_BUF_SIZE  32
+
+/* Make sure we have at least N more bytes of space in buffer.  */
+#define GET_BUFFER_SPACE(n)                     \
+    while (b - bufp->buffer + (n) > bufp->allocated)            \
+      EXTEND_BUFFER ()
+
+/* Make sure we have one more byte of buffer space and then add C to it.  */
+#define BUF_PUSH(c)                         \
+  do {                                  \
+    GET_BUFFER_SPACE (1);                       \
+    *b++ = (unsigned char) (c);                     \
+  } while (0)
+
+
+/* Ensure we have two more bytes of buffer space and then append C1 and C2.  */
+#define BUF_PUSH_2(c1, c2)                      \
+  do {                                  \
+    GET_BUFFER_SPACE (2);                       \
+    *b++ = (unsigned char) (c1);                    \
+    *b++ = (unsigned char) (c2);                    \
+  } while (0)
+
+
+/* As with BUF_PUSH_2, except for three bytes.  */
+#define BUF_PUSH_3(c1, c2, c3)                      \
+  do {                                  \
+    GET_BUFFER_SPACE (3);                       \
+    *b++ = (unsigned char) (c1);                    \
+    *b++ = (unsigned char) (c2);                    \
+    *b++ = (unsigned char) (c3);                    \
+  } while (0)
+
+
+/* Store a jump with opcode OP at LOC to location TO.  We store a
+   relative address offset by the three bytes the jump itself occupies.  */
+#define STORE_JUMP(op, loc, to) \
+  store_op1 (op, loc, (to) - (loc) - 3)
+
+/* Likewise, for a two-argument jump.  */
+#define STORE_JUMP2(op, loc, to, arg) \
+  store_op2 (op, loc, (to) - (loc) - 3, arg)
+
+/* Like `STORE_JUMP', but for inserting.  Assume `b' is the buffer end.  */
+#define INSERT_JUMP(op, loc, to) \
+  insert_op1 (op, loc, (to) - (loc) - 3, b)
+
+/* Like `STORE_JUMP2', but for inserting.  Assume `b' is the buffer end.  */
+#define INSERT_JUMP2(op, loc, to, arg) \
+  insert_op2 (op, loc, (to) - (loc) - 3, arg, b)
+
+
+/* This is not an arbitrary limit: the arguments which represent offsets
+   into the pattern are two bytes long.  So if 2^16 bytes turns out to
+   be too small, many things would have to change.  */
+#define MAX_BUF_SIZE (1L << 16)
+
+
+/* Extend the buffer by twice its current size via realloc and
+   reset the pointers that pointed into the old block to point to the
+   correct places in the new one.  If extending the buffer results in it
+   being larger than MAX_BUF_SIZE, then flag memory exhausted.  */
+#define EXTEND_BUFFER()                         \
+  do {                                  \
+    unsigned char *old_buffer = bufp->buffer;               \
+    if (bufp->allocated == MAX_BUF_SIZE)                \
+      return REG_ESIZE;                         \
+    bufp->allocated <<= 1;                      \
+    if (bufp->allocated > MAX_BUF_SIZE)                 \
+      bufp->allocated = MAX_BUF_SIZE;                   \
+    bufp->buffer = (unsigned char *) realloc (bufp->buffer, bufp->allocated);\
+    if (bufp->buffer == NULL)                       \
+      return REG_ESPACE;                        \
+    /* If the buffer moved, move all the pointers into it.  */      \
+    if (old_buffer != bufp->buffer)                 \
+      {                                 \
+        b = (b - old_buffer) + bufp->buffer;                \
+        begalt = (begalt - old_buffer) + bufp->buffer;          \
+        if (fixup_alt_jump)                     \
+          fixup_alt_jump = (fixup_alt_jump - old_buffer) + bufp->buffer;\
+        if (laststart)                          \
+          laststart = (laststart - old_buffer) + bufp->buffer;      \
+        if (pending_exact)                      \
+          pending_exact = (pending_exact - old_buffer) + bufp->buffer;  \
+      }                                 \
+  } while (0)
+
+
+/* Since we have one byte reserved for the register number argument to
+   {start,stop}_memory, the maximum number of groups we can report
+   things about is what fits in that byte.  */
+#define MAX_REGNUM 255
+
+/* But patterns can have more than `MAX_REGNUM' registers.  We just
+   ignore the excess.  */
+typedef unsigned regnum_t;
+
+
+/* Macros for the compile stack.  */
+
+/* Since offsets can go either forwards or backwards, this type needs to
+   be able to hold values from -(MAX_BUF_SIZE - 1) to MAX_BUF_SIZE - 1.  */
+typedef int pattern_offset_t;
+
+typedef struct {
+    pattern_offset_t begalt_offset;
+    pattern_offset_t fixup_alt_jump;
+    pattern_offset_t inner_group_offset;
+    pattern_offset_t laststart_offset;
+    regnum_t regnum;
+} compile_stack_elt_t;
+
+
+typedef struct {
+    compile_stack_elt_t *stack;
+    unsigned size;
+    unsigned avail;         /* Offset of next open position.  */
+} compile_stack_type;
+
+
+#define INIT_COMPILE_STACK_SIZE 32
+
+#define COMPILE_STACK_EMPTY  (compile_stack.avail == 0)
+#define COMPILE_STACK_FULL  (compile_stack.avail == compile_stack.size)
+
+/* The next available element.  */
+#define COMPILE_STACK_TOP (compile_stack.stack[compile_stack.avail])
+
+
+/* Set the bit for character C in a list.  */
+#define SET_LIST_BIT(c)                               \
+  (b[((unsigned char) (c)) / BYTEWIDTH]               \
+   |= 1 << (((unsigned char) c) % BYTEWIDTH))
+
+
+/* Get the next unsigned number in the uncompiled pattern.  */
+#define GET_UNSIGNED_NUMBER(num)                    \
+  { if (p != pend)                          \
+     {                                  \
+       PATFETCH (c);                            \
+       while (ISDIGIT (c))                      \
+         {                              \
+           if (num < 0)                         \
+              num = 0;                          \
+           num = num * 10 + c - '0';                    \
+           if (p == pend)                       \
+              break;                            \
+           PATFETCH (c);                        \
+         }                              \
+       }                                \
+    }
+
+#define CHAR_CLASS_MAX_LENGTH  6 /* Namely, `xdigit'.  */
+
+#define IS_CHAR_CLASS(string)                       \
+   (STREQ (string, "alpha") || STREQ (string, "upper")          \
+    || STREQ (string, "lower") || STREQ (string, "digit")       \
+    || STREQ (string, "alnum") || STREQ (string, "xdigit")      \
+    || STREQ (string, "space") || STREQ (string, "print")       \
+    || STREQ (string, "punct") || STREQ (string, "graph")       \
+    || STREQ (string, "cntrl") || STREQ (string, "blank"))
+

+
+
+/* function prototypes */
+
+static boolean  at_begline_loc_p (const char *, const char *, reg_syntax_t);
+static boolean  at_endline_loc_p (const char *p, const char *pend, int syntax);
+static void     store_op1        (re_opcode_t op,unsigned char *loc,int arg);
+static void     insert_op1       (re_opcode_t op,unsigned char *loc,int arg,unsigned char *end);
+static void     insert_op2       (re_opcode_t op,unsigned char *loc,int arg1, int arg2,unsigned char *end);
+static reg_errcode_t
+compile_range    (const char **p_ptr, const char *pend,char *translate, reg_syntax_t syntax, unsigned char *b);
+
+static void     store_op2        (re_opcode_t op,   unsigned char *loc, int arg1, int arg2);
+static boolean  group_in_compile_stack (compile_stack_type compile_stack,regnum_t regnum);
+static int      bcmp_translate   (unsigned char *s1, unsigned char*s2, register int len, char *translate);
+static boolean
+alt_match_null_string_p (unsigned char * p, unsigned char * end, register_info_type * reg_info);
+
+static boolean  group_match_null_string_p (unsigned char **p, unsigned char *end,register_info_type *reg_info);
+static boolean  common_op_match_null_string_p ( unsigned char **p, unsigned char *end, register_info_type *reg_info);
+/* end function prototypes */
+
+
+
+/* `regex_compile' compiles PATTERN (of length SIZE) according to SYNTAX.
+   Returns one of error codes defined in `regex.h', or zero for success.
+
+   Assumes the `allocated' (and perhaps `buffer') and `translate'
+   fields are set in BUFP on entry.
+
+   If it succeeds, results are put in BUFP (if it returns an error, the
+   contents of BUFP are undefined):
+     `buffer' is the compiled pattern;
+     `syntax' is set to SYNTAX;
+     `used' is set to the length of the compiled pattern;
+     `fastmap_accurate' is zero;
+     `re_nsub' is the number of subexpressions in PATTERN;
+     `not_bol' and `not_eol' are zero;
+
+   The `fastmap' and `newline_anchor' fields are neither
+   examined nor set.  */
+
+static reg_errcode_t
+regex_compile (
+    const char *pattern,
+    int size,
+    reg_syntax_t syntax,
+    struct re_pattern_buffer *bufp)
+{
+    /* We fetch characters from PATTERN here.  Even though PATTERN is
+       `char *' (i.e., signed), we declare these variables as unsigned, so
+       they can be reliably used as array indices.  */
+    register unsigned char c, c1;
+
+    /* A random tempory spot in PATTERN.  */
+    const char *p1;
+
+    /* Points to the end of the buffer, where we should append.  */
+    register unsigned char *b;
+
+    /* Keeps track of unclosed groups.  */
+    compile_stack_type compile_stack;
+
+    /* Points to the current (ending) position in the pattern.  */
+    const char *p = pattern;
+    const char *pend = pattern + size;
+
+    /* How to translate the characters in the pattern.  */
+    char *translate = bufp->translate;
+
+    /* Address of the count-byte of the most recently inserted `exactn'
+       command.  This makes it possible to tell if a new exact-match
+       character can be added to that command or if the character requires
+       a new `exactn' command.  */
+    unsigned char *pending_exact = 0;
+
+    /* Address of start of the most recently finished expression.
+       This tells, e.g., postfix * where to find the start of its
+       operand.  Reset at the beginning of groups and alternatives.  */
+    unsigned char *laststart = 0;
+
+    /* Address of beginning of regexp, or inside of last group.  */
+    unsigned char *begalt;
+
+    /* Place in the uncompiled pattern (i.e., the {) to
+       which to go back if the interval is invalid.  */
+    const char *beg_interval;
+
+    /* Address of the place where a forward jump should go to the end of
+       the containing expression.  Each alternative of an `or' -- except the
+       last -- ends with a forward jump of this sort.  */
+    unsigned char *fixup_alt_jump = 0;
+
+    /* Counts open-groups as they are encountered.  Remembered for the
+       matching close-group on the compile stack, so the same register
+       number is put in the stop_memory as the start_memory.  */
+    regnum_t regnum = 0;
+
+#ifdef DEBUG
+    DEBUG_PRINT1 ("\nCompiling pattern: ");
+    if (debug) {
+        unsigned debug_count;
+
+        for (debug_count = 0; debug_count < size; debug_count++) {
+            printchar (pattern[debug_count]);
+        }
+        putchar ('\n');
+    }
+#endif /* DEBUG */
+
+    /* Initialize the compile stack.  */
+    compile_stack.stack = TALLOC (INIT_COMPILE_STACK_SIZE, compile_stack_elt_t);
+    if (compile_stack.stack == NULL) {
+        return REG_ESPACE;
+    }
+
+    compile_stack.size = INIT_COMPILE_STACK_SIZE;
+    compile_stack.avail = 0;
+
+    /* Initialize the pattern buffer.  */
+    bufp->syntax = syntax;
+    bufp->fastmap_accurate = 0;
+    bufp->not_bol = bufp->not_eol = 0;
+
+    /* Set `used' to zero, so that if we return an error, the pattern
+       printer (for debugging) will think there's no pattern.  We reset it
+       at the end.  */
+    bufp->used = 0;
+
+    /* Always count groups, whether or not bufp->no_sub is set.  */
+    bufp->re_nsub = 0;
+
+#if !defined (emacs) && !defined (SYNTAX_TABLE)
+    /* Initialize the syntax table.  */
+    init_syntax_once ();
+#endif
+
+    if (bufp->allocated == 0) {
+        if (bufp->buffer) {
+            /* If zero allocated, but buffer is non-null, try to realloc
+                   enough space.  This loses if buffer's address is bogus, but
+                   that is the user's responsibility.  */
+            RETALLOC (bufp->buffer, INIT_BUF_SIZE, unsigned char);
+        } else {
+            /* Caller did not allocate a buffer.  Do it for them.  */
+            bufp->buffer = TALLOC (INIT_BUF_SIZE, unsigned char);
+        }
+        if (!bufp->buffer) {
+            return REG_ESPACE;
+        }
+
+        bufp->allocated = INIT_BUF_SIZE;
+    }
+
+    begalt = b = bufp->buffer;
+
+    /* Loop through the uncompiled pattern until we're at the end.  */
+    while (p != pend) {
+        PATFETCH (c);
+
+        switch (c) {
+        case '^': {
+            if (   /* If at start of pattern, it's an operator.  */
+                p == pattern + 1
+                /* If context independent, it's an operator.  */
+                || syntax & RE_CONTEXT_INDEP_ANCHORS
+                /* Otherwise, depends on what's come before.  */
+                || at_begline_loc_p (pattern, p, syntax)) {
+                BUF_PUSH (begline);
+            } else {
+                goto normal_char;
+            }
+        }
+        break;
+
+
+        case '$': {
+            if (   /* If at end of pattern, it's an operator.  */
+                p == pend
+                /* If context independent, it's an operator.  */
+                || syntax & RE_CONTEXT_INDEP_ANCHORS
+                /* Otherwise, depends on what's next.  */
+                || at_endline_loc_p (p, pend, syntax)) {
+                BUF_PUSH (endline);
+            } else {
+                goto normal_char;
+            }
+        }
+        break;
+
+
+        case '+':
+        case '?':
+            if ((syntax & RE_BK_PLUS_QM)
+                    || (syntax & RE_LIMITED_OPS)) {
+                goto normal_char;
+            }
+handle_plus:
+        case '*':
+            /* If there is no previous pattern... */
+            if (!laststart) {
+                if (syntax & RE_CONTEXT_INVALID_OPS) {
+                    return REG_BADRPT;
+                } else if (!(syntax & RE_CONTEXT_INDEP_OPS)) {
+                    goto normal_char;
+                }
+            }
+
+            {
+                /* Are we optimizing this jump?  */
+                boolean keep_string_p = false;
+
+                /* 1 means zero (many) matches is allowed.  */
+                char zero_times_ok = 0, many_times_ok = 0;
+
+                /* If there is a sequence of repetition chars, collapse it
+                   down to just one (the right one).  We can't combine
+                   interval operators with these because of, e.g., `a{2}*',
+                   which should only match an even number of `a's.  */
+
+                for (;;) {
+                    zero_times_ok |= c != '+';
+                    many_times_ok |= c != '?';
+
+                    if (p == pend) {
+                        break;
+                    }
+
+                    PATFETCH (c);
+
+                    if (c == '*'
+                            || (!(syntax & RE_BK_PLUS_QM) && (c == '+' || c == '?')))
+                        ;
+
+                    else if (syntax & RE_BK_PLUS_QM  &&  c == '\\') {
+                        if (p == pend) {
+                            return REG_EESCAPE;
+                        }
+
+                        PATFETCH (c1);
+                        if (!(c1 == '+' || c1 == '?')) {
+                            PATUNFETCH;
+                            PATUNFETCH;
+                            break;
+                        }
+
+                        c = c1;
+                    } else {
+                        PATUNFETCH;
+                        break;
+                    }
+
+                    /* If we get here, we found another repeat character.  */
+                }
+
+                /* Star, etc. applied to an empty pattern is equivalent
+                   to an empty pattern.  */
+                if (!laststart) {
+                    break;
+                }
+
+                /* Now we know whether or not zero matches is allowed
+                   and also whether or not two or more matches is allowed.  */
+                if (many_times_ok) {
+                    /* More than one repetition is allowed, so put in at the
+                       end a backward relative jump from `b' to before the next
+                       jump we're going to put in below (which jumps from
+                       laststart to after this jump).
+
+                       But if we are at the `*' in the exact sequence `.*\n',
+                       insert an unconditional jump backwards to the .,
+                       instead of the beginning of the loop.  This way we only
+                       push a failure point once, instead of every time
+                       through the loop.  */
+                    assert (p - 1 > pattern);
+
+                    /* Allocate the space for the jump.  */
+                    GET_BUFFER_SPACE (3);
+
+                    /* We know we are not at the first character of the pattern,
+                       because laststart was nonzero.  And we've already
+                       incremented `p', by the way, to be the character after
+                       the `*'.  Do we have to do something analogous here
+                       for null bytes, because of RE_DOT_NOT_NULL?  */
+                    if (TRANSLATE (*(p - 2)) == TRANSLATE ('.')
+                            && zero_times_ok
+                            && p < pend && TRANSLATE (*p) == TRANSLATE ('\n')
+                            && !(syntax & RE_DOT_NEWLINE)) {
+                        /* We have .*\n.  */
+                        STORE_JUMP (jump, b, laststart);
+                        keep_string_p = true;
+                    } else
+                        /* Anything else.  */
+                    {
+                        STORE_JUMP (maybe_pop_jump, b, laststart - 3);
+                    }
+
+                    /* We've added more stuff to the buffer.  */
+                    b += 3;
+                }
+
+                /* On failure, jump from laststart to b + 3, which will be the
+                   end of the buffer after this jump is inserted.  */
+                GET_BUFFER_SPACE (3);
+                INSERT_JUMP (keep_string_p ? on_failure_keep_string_jump
+                             : on_failure_jump,
+                             laststart, b + 3);
+                pending_exact = 0;
+                b += 3;
+
+                if (!zero_times_ok) {
+                    /* At least one repetition is required, so insert a
+                       `dummy_failure_jump' before the initial
+                       `on_failure_jump' instruction of the loop. This
+                       effects a skip over that instruction the first time
+                       we hit that loop.  */
+                    GET_BUFFER_SPACE (3);
+                    INSERT_JUMP (dummy_failure_jump, laststart, laststart + 6);
+                    b += 3;
+                }
+            }
+            break;
+
+
+        case '.':
+            laststart = b;
+            BUF_PUSH (anychar);
+            break;
+
+
+        case '[': {
+            boolean had_char_class = false;
+
+            if (p == pend) {
+                return REG_EBRACK;
+            }
+
+            /* Ensure that we have enough space to push a charset: the
+               opcode, the length count, and the bitset; 34 bytes in all.  */
+            GET_BUFFER_SPACE (34);
+
+            laststart = b;
+
+            /* We test `*p == '^' twice, instead of using an if
+               statement, so we only need one BUF_PUSH.  */
+            BUF_PUSH (*p == '^' ? charset_not : charset);
+            if (*p == '^') {
+                p++;
+            }
+
+            /* Remember the first position in the bracket expression.  */
+            p1 = p;
+
+            /* Push the number of bytes in the bitmap.  */
+            BUF_PUSH ((1 << BYTEWIDTH) / BYTEWIDTH);
+
+            /* Clear the whole map.  */
+            bzero (b, (1 << BYTEWIDTH) / BYTEWIDTH);
+
+            /* charset_not matches newline according to a syntax bit.  */
+            if ((re_opcode_t) b[-2] == charset_not
+                    && (syntax & RE_HAT_LISTS_NOT_NEWLINE)) {
+                SET_LIST_BIT ('\n');
+            }
+
+            /* Read in characters and ranges, setting map bits.  */
+            for (;;) {
+                if (p == pend) {
+                    return REG_EBRACK;
+                }
+
+                PATFETCH (c);
+
+                /* \ might escape characters inside [...] and [^...].  */
+                if ((syntax & RE_BACKSLASH_ESCAPE_IN_LISTS) && c == '\\') {
+                    if (p == pend) {
+                        return REG_EESCAPE;
+                    }
+
+                    PATFETCH (c1);
+                    SET_LIST_BIT (c1);
+                    continue;
+                }
+
+                /* Could be the end of the bracket expression.  If it's
+                   not (i.e., when the bracket expression is `[]' so
+                   far), the ']' character bit gets set way below.  */
+                if (c == ']' && p != p1 + 1) {
+                    break;
+                }
+
+                /* Look ahead to see if it's a range when the last thing
+                   was a character class.  */
+                if (had_char_class && c == '-' && *p != ']') {
+                    return REG_ERANGE;
+                }
+
+                /* Look ahead to see if it's a range when the last thing
+                   was a character: if this is a hyphen not at the
+                   beginning or the end of a list, then it's the range
+                   operator.  */
+                if (c == '-'
+                        && !(p - 2 >= pattern && p[-2] == '[')
+                        && !(p - 3 >= pattern && p[-3] == '[' && p[-2] == '^')
+                        && *p != ']') {
+                    reg_errcode_t ret
+                        = compile_range (&p, pend, translate, syntax, b);
+                    if (ret != REG_NOERROR) {
+                        return ret;
+                    }
+                }
+
+                else if (p[0] == '-' && p[1] != ']') {
+                    /* This handles ranges made up of characters only.  */
+                    reg_errcode_t ret;
+
+                    /* Move past the `-'.  */
+                    PATFETCH (c1);
+
+                    ret = compile_range (&p, pend, translate, syntax, b);
+                    if (ret != REG_NOERROR) {
+                        return ret;
+                    }
+                }
+
+                /* See if we're at the beginning of a possible character
+                   class.  */
+
+                else if (syntax & RE_CHAR_CLASSES && c == '[' && *p == ':') {
+                    /* Leave room for the null.  */
+                    char str[CHAR_CLASS_MAX_LENGTH + 1];
+
+                    PATFETCH (c);
+                    c1 = 0;
+
+                    /* If pattern is `[[:'.  */
+                    if (p == pend) {
+                        return REG_EBRACK;
+                    }
+
+                    for (;;) {
+                        PATFETCH (c);
+                        if (c == ':' || c == ']' || p == pend
+                                || c1 == CHAR_CLASS_MAX_LENGTH) {
+                            break;
+                        }
+                        str[c1++] = c;
+                    }
+                    str[c1] = '\0';
+
+                    /* If isn't a word bracketed by `[:' and:`]':
+                       undo the ending character, the letters, and leave
+                       the leading `:' and `[' (but set bits for them).  */
+                    if (c == ':' && *p == ']') {
+                        int ch;
+                        boolean is_alnum = STREQ (str, "alnum");
+                        boolean is_alpha = STREQ (str, "alpha");
+                        boolean is_blank = STREQ (str, "blank");
+                        boolean is_cntrl = STREQ (str, "cntrl");
+                        boolean is_digit = STREQ (str, "digit");
+                        boolean is_graph = STREQ (str, "graph");
+                        boolean is_lower = STREQ (str, "lower");
+                        boolean is_print = STREQ (str, "print");
+                        boolean is_punct = STREQ (str, "punct");
+                        boolean is_space = STREQ (str, "space");
+                        boolean is_upper = STREQ (str, "upper");
+                        boolean is_xdigit = STREQ (str, "xdigit");
+
+                        if (!IS_CHAR_CLASS (str)) {
+                            return REG_ECTYPE;
+                        }
+
+                        /* Throw away the ] at the end of the character
+                           class.  */
+                        PATFETCH (c);
+
+                        if (p == pend) {
+                            return REG_EBRACK;
+                        }
+
+                        for (ch = 0; ch < 1 << BYTEWIDTH; ch++) {
+                            if (   (is_alnum  && ISALNUM (ch))
+                                    || (is_alpha  && ISALPHA (ch))
+                                    || (is_blank  && ISBLANK (ch))
+                                    || (is_cntrl  && ISCNTRL (ch))
+                                    || (is_digit  && ISDIGIT (ch))
+                                    || (is_graph  && ISGRAPH (ch))
+                                    || (is_lower  && ISLOWER (ch))
+                                    || (is_print  && ISPRINT (ch))
+                                    || (is_punct  && ISPUNCT (ch))
+                                    || (is_space  && ISSPACE (ch))
+                                    || (is_upper  && ISUPPER (ch))
+                                    || (is_xdigit && ISXDIGIT (ch))) {
+                                SET_LIST_BIT (ch);
+                            }
+                        }
+                        had_char_class = true;
+                    } else {
+                        c1++;
+                        while (c1--) {
+                            PATUNFETCH;
+                        }
+                        SET_LIST_BIT ('[');
+                        SET_LIST_BIT (':');
+                        had_char_class = false;
+                    }
+                } else {
+                    had_char_class = false;
+                    SET_LIST_BIT (c);
+                }
+            }
+
+            /* Discard any (non)matching list bytes that are all 0 at the
+               end of the map.  Decrease the map-length byte too.  */
+            while ((int) b[-1] > 0 && b[b[-1] - 1] == 0) {
+                b[-1]--;
+            }
+            b += b[-1];
+        }
+        break;
+
+
+        case '(':
+            if (syntax & RE_NO_BK_PARENS) {
+                goto handle_open;
+            } else {
+                goto normal_char;
+            }
+
+
+        case ')':
+            if (syntax & RE_NO_BK_PARENS) {
+                goto handle_close;
+            } else {
+                goto normal_char;
+            }
+
+
+        case '\n':
+            if (syntax & RE_NEWLINE_ALT) {
+                goto handle_alt;
+            } else {
+                goto normal_char;
+            }
+
+
+        case '|':
+            if (syntax & RE_NO_BK_VBAR) {
+                goto handle_alt;
+            } else {
+                goto normal_char;
+            }
+
+
+        case '{':
+            if (syntax & RE_INTERVALS && syntax & RE_NO_BK_BRACES) {
+                goto handle_interval;
+            } else {
+                goto normal_char;
+            }
+
+
+        case '\\':
+            if (p == pend) {
+                return REG_EESCAPE;
+            }
+
+            /* Do not translate the character after the \, so that we can
+               distinguish, e.g., \B from \b, even if we normally would
+               translate, e.g., B to b.  */
+            PATFETCH_RAW (c);
+
+            switch (c) {
+            case '(':
+                if (syntax & RE_NO_BK_PARENS) {
+                    goto normal_backslash;
+                }
+
+handle_open:
+                bufp->re_nsub++;
+                regnum++;
+
+                if (COMPILE_STACK_FULL) {
+                    RETALLOC (compile_stack.stack, compile_stack.size << 1,
+                              compile_stack_elt_t);
+                    if (compile_stack.stack == NULL) {
+                        return REG_ESPACE;
+                    }
+
+                    compile_stack.size <<= 1;
+                }
+
+                /* These are the values to restore when we hit end of this
+                   group.  They are all relative offsets, so that if the
+                   whole pattern moves because of realloc, they will still
+                   be valid.  */
+                COMPILE_STACK_TOP.begalt_offset = begalt - bufp->buffer;
+                COMPILE_STACK_TOP.fixup_alt_jump
+                    = fixup_alt_jump ? fixup_alt_jump - bufp->buffer + 1 : 0;
+                COMPILE_STACK_TOP.laststart_offset = b - bufp->buffer;
+                COMPILE_STACK_TOP.regnum = regnum;
+
+                /* We will eventually replace the 0 with the number of
+                   groups inner to this one.  But do not push a
+                   start_memory for groups beyond the last one we can
+                   represent in the compiled pattern.  */
+                if (regnum <= MAX_REGNUM) {
+                    COMPILE_STACK_TOP.inner_group_offset = b - bufp->buffer + 2;
+                    BUF_PUSH_3 (start_memory, regnum, 0);
+                }
+
+                compile_stack.avail++;
+
+                fixup_alt_jump = 0;
+                laststart = 0;
+                begalt = b;
+                /* If we've reached MAX_REGNUM groups, then this open
+                won't actually generate any code, so we'll have to
+                 clear pending_exact explicitly.  */
+                pending_exact = 0;
+                break;
+
+
+            case ')':
+                if (syntax & RE_NO_BK_PARENS) {
+                    goto normal_backslash;
+                }
+
+                if (COMPILE_STACK_EMPTY)
+                    if (syntax & RE_UNMATCHED_RIGHT_PAREN_ORD) {
+                        goto normal_backslash;
+                    } else {
+                        return REG_ERPAREN;
+                    }
+
+handle_close:
+                if (fixup_alt_jump) {
+                    /* Push a dummy failure point at the end of the
+                       alternative for a possible future
+                       `pop_failure_jump' to pop.  See comments at
+                       `push_dummy_failure' in `re_match_2'.  */
+                    BUF_PUSH (push_dummy_failure);
+
+                    /* We allocated space for this jump when we assigned
+                       to `fixup_alt_jump', in the `handle_alt' case below.  */
+                    STORE_JUMP (jump_past_alt, fixup_alt_jump, b - 1);
+                }
+
+                /* See similar code for backslashed left paren above.  */
+                if (COMPILE_STACK_EMPTY)
+                    if (syntax & RE_UNMATCHED_RIGHT_PAREN_ORD) {
+                        goto normal_char;
+                    } else {
+                        return REG_ERPAREN;
+                    }
+
+                /* Since we just checked for an empty stack above, this
+                   ``can't happen''.  */
+                assert (compile_stack.avail != 0);
+                {
+                    /* We don't just want to restore into `regnum', because
+                       later groups should continue to be numbered higher,
+                       as in `(ab)c(de)' -- the second group is #2.  */
+                    regnum_t this_group_regnum;
+
+                    compile_stack.avail--;
+                    begalt = bufp->buffer + COMPILE_STACK_TOP.begalt_offset;
+                    fixup_alt_jump
+                        = COMPILE_STACK_TOP.fixup_alt_jump
+                          ? bufp->buffer + COMPILE_STACK_TOP.fixup_alt_jump - 1
+                          : 0;
+                    laststart = bufp->buffer + COMPILE_STACK_TOP.laststart_offset;
+                    this_group_regnum = COMPILE_STACK_TOP.regnum;
+                    /* If we've reached MAX_REGNUM groups, then this open
+                       won't actually generate any code, so we'll have to
+                       clear pending_exact explicitly.  */
+                    pending_exact = 0;
+
+                    /* We're at the end of the group, so now we know how many
+                       groups were inside this one.  */
+                    if (this_group_regnum <= MAX_REGNUM) {
+                        unsigned char *inner_group_loc
+                            = bufp->buffer + COMPILE_STACK_TOP.inner_group_offset;
+
+                        *inner_group_loc = regnum - this_group_regnum;
+                        BUF_PUSH_3 (stop_memory, this_group_regnum,
+                                    regnum - this_group_regnum);
+                    }
+                }
+                break;
+
+
+            case '|':                   /* `\|'.  */
+                if (syntax & RE_LIMITED_OPS || syntax & RE_NO_BK_VBAR) {
+                    goto normal_backslash;
+                }
+handle_alt:
+                if (syntax & RE_LIMITED_OPS) {
+                    goto normal_char;
+                }
+
+                /* Insert before the previous alternative a jump which
+                   jumps to this alternative if the former fails.  */
+                GET_BUFFER_SPACE (3);
+                INSERT_JUMP (on_failure_jump, begalt, b + 6);
+                pending_exact = 0;
+                b += 3;
+
+                /* The alternative before this one has a jump after it
+                   which gets executed if it gets matched.  Adjust that
+                   jump so it will jump to this alternative's analogous
+                   jump (put in below, which in turn will jump to the next
+                   (if any) alternative's such jump, etc.).  The last such
+                   jump jumps to the correct final destination.  A picture:
+                            _____ _____
+                            |   | |   |
+                            |   v |   v
+                           a | b   | c
+
+                   If we are at `b', then fixup_alt_jump right now points to a
+                   three-byte space after `a'.  We'll put in the jump, set
+                   fixup_alt_jump to right after `b', and leave behind three
+                   bytes which we'll fill in when we get to after `c'.  */
+
+                if (fixup_alt_jump) {
+                    STORE_JUMP (jump_past_alt, fixup_alt_jump, b);
+                }
+
+                /* Mark and leave space for a jump after this alternative,
+                   to be filled in later either by next alternative or
+                   when know we're at the end of a series of alternatives.  */
+                fixup_alt_jump = b;
+                GET_BUFFER_SPACE (3);
+                b += 3;
+
+                laststart = 0;
+                begalt = b;
+                break;
+
+
+            case '{':
+                /* If \{ is a literal.  */
+                if (!(syntax & RE_INTERVALS)
+                        /* If we're at `\{' and it's not the open-interval
+                           operator.  */
+                        || ((syntax & RE_INTERVALS) && (syntax & RE_NO_BK_BRACES))
+                        || (p - 2 == pattern  &&  p == pend)) {
+                    goto normal_backslash;
+                }
+
+handle_interval: {
+                    /* If got here, then the syntax allows intervals.  */
+
+                    /* At least (most) this many matches must be made.  */
+                    int lower_bound = -1, upper_bound = -1;
+
+                    beg_interval = p - 1;
+
+                    if (p == pend) {
+                        if (syntax & RE_NO_BK_BRACES) {
+                            goto unfetch_interval;
+                        } else {
+                            return REG_EBRACE;
+                        }
+                    }
+
+                    GET_UNSIGNED_NUMBER (lower_bound);
+
+                    if (c == ',') {
+                        GET_UNSIGNED_NUMBER (upper_bound);
+                        if (upper_bound < 0) {
+                            upper_bound = RE_DUP_MAX;
+                        }
+                    } else
+                        /* Interval such as `{1}' => match exactly once. */
+                    {
+                        upper_bound = lower_bound;
+                    }
+
+                    if (lower_bound < 0 || upper_bound > RE_DUP_MAX
+                            || lower_bound > upper_bound) {
+                        if (syntax & RE_NO_BK_BRACES) {
+                            goto unfetch_interval;
+                        } else {
+                            return REG_BADBR;
+                        }
+                    }
+
+                    if (!(syntax & RE_NO_BK_BRACES)) {
+                        if (c != '\\') {
+                            return REG_EBRACE;
+                        }
+
+                        PATFETCH (c);
+                    }
+
+                    if (c != '}') {
+                        if (syntax & RE_NO_BK_BRACES) {
+                            goto unfetch_interval;
+                        } else {
+                            return REG_BADBR;
+                        }
+                    }
+
+                    /* We just parsed a valid interval.  */
+
+                    /* If it's invalid to have no preceding re.  */
+                    if (!laststart) {
+                        if (syntax & RE_CONTEXT_INVALID_OPS) {
+                            return REG_BADRPT;
+                        } else if (syntax & RE_CONTEXT_INDEP_OPS) {
+                            laststart = b;
+                        } else {
+                            goto unfetch_interval;
+                        }
+                    }
+
+                    /* If the upper bound is zero, don't want to succeed at
+                       all; jump from `laststart' to `b + 3', which will be
+                       the end of the buffer after we insert the jump.  */
+                    if (upper_bound == 0) {
+                        GET_BUFFER_SPACE (3);
+                        INSERT_JUMP (jump, laststart, b + 3);
+                        b += 3;
+                    }
+
+                    /* Otherwise, we have a nontrivial interval.  When
+                       we're all done, the pattern will look like:
+                         set_number_at <jump count> <upper bound>
+                         set_number_at <succeed_n count> <lower bound>
+                         succeed_n <after jump addr> <succed_n count>
+                         <body of loop>
+                         jump_n <succeed_n addr> <jump count>
+                       (The upper bound and `jump_n' are omitted if
+                       `upper_bound' is 1, though.)  */
+                    else {
+                        /* If the upper bound is > 1, we need to insert
+                           more at the end of the loop.  */
+                        unsigned nbytes = 10 + (upper_bound > 1) * 10;
+
+                        GET_BUFFER_SPACE (nbytes);
+
+                        /* Initialize lower bound of the `succeed_n', even
+                           though it will be set during matching by its
+                           attendant `set_number_at' (inserted next),
+                           because `re_compile_fastmap' needs to know.
+                           Jump to the `jump_n' we might insert below.  */
+                        INSERT_JUMP2 (succeed_n, laststart,
+                                      b + 5 + (upper_bound > 1) * 5,
+                                      lower_bound);
+                        b += 5;
+
+                        /* Code to initialize the lower bound.  Insert
+                           before the `succeed_n'.  The `5' is the last two
+                           bytes of this `set_number_at', plus 3 bytes of
+                           the following `succeed_n'.  */
+                        insert_op2 (set_number_at, laststart, 5, lower_bound, b);
+                        b += 5;
+
+                        if (upper_bound > 1) {
+                            /* More than one repetition is allowed, so
+                               append a backward jump to the `succeed_n'
+                               that starts this interval.
+
+                               When we've reached this during matching,
+                               we'll have matched the interval once, so
+                               jump back only `upper_bound - 1' times.  */
+                            STORE_JUMP2 (jump_n, b, laststart + 5,
+                                         upper_bound - 1);
+                            b += 5;
+
+                            /* The location we want to set is the second
+                               parameter of the `jump_n'; that is `b-2' as
+                               an absolute address.  `laststart' will be
+                               the `set_number_at' we're about to insert;
+                               `laststart+3' the number to set, the source
+                               for the relative address.  But we are
+                               inserting into the middle of the pattern --
+                               so everything is getting moved up by 5.
+                               Conclusion: (b - 2) - (laststart + 3) + 5,
+                               i.e., b - laststart.
+
+                               We insert this at the beginning of the loop
+                               so that if we fail during matching, we'll
+                               reinitialize the bounds.  */
+                            insert_op2 (set_number_at, laststart, b - laststart,
+                                        upper_bound - 1, b);
+                            b += 5;
+                        }
+                    }
+                    pending_exact = 0;
+                    beg_interval = NULL;
+                }
+                break;
+
+unfetch_interval:
+                /* If an invalid interval, match the characters as literals.  */
+                assert (beg_interval);
+                p = beg_interval;
+                beg_interval = NULL;
+
+                /* normal_char and normal_backslash need `c'.  */
+                PATFETCH (c);
+
+                if (!(syntax & RE_NO_BK_BRACES)) {
+                    if (p > pattern  &&  p[-1] == '\\') {
+                        goto normal_backslash;
+                    }
+                }
+                goto normal_char;
+
+#ifdef emacs
+                /* There is no way to specify the before_dot and after_dot
+                   operators.  rms says this is ok.  --karl  */
+            case '=':
+                BUF_PUSH (at_dot);
+                break;
+
+            case 's':
+                laststart = b;
+                PATFETCH (c);
+                BUF_PUSH_2 (syntaxspec, syntax_spec_code[c]);
+                break;
+
+            case 'S':
+                laststart = b;
+                PATFETCH (c);
+                BUF_PUSH_2 (notsyntaxspec, syntax_spec_code[c]);
+                break;
+#endif /* emacs */
+
+
+            case 'w':
+                laststart = b;
+                BUF_PUSH (wordchar);
+                break;
+
+
+            case 'W':
+                laststart = b;
+                BUF_PUSH (notwordchar);
+                break;
+
+
+            case '<':
+                BUF_PUSH (wordbeg);
+                break;
+
+            case '>':
+                BUF_PUSH (wordend);
+                break;
+
+            case 'b':
+                BUF_PUSH (wordbound);
+                break;
+
+            case 'B':
+                BUF_PUSH (notwordbound);
+                break;
+
+            case '`':
+                BUF_PUSH (begbuf);
+                break;
+
+            case '\'':
+                BUF_PUSH (endbuf);
+                break;
+
+            case '1':
+            case '2':
+            case '3':
+            case '4':
+            case '5':
+            case '6':
+            case '7':
+            case '8':
+            case '9':
+                if (syntax & RE_NO_BK_REFS) {
+                    goto normal_char;
+                }
+
+                c1 = c - '0';
+
+                if (c1 > regnum) {
+                    return REG_ESUBREG;
+                }
+
+                /* Can't back reference to a subexpression if inside of it.  */
+                if (group_in_compile_stack (compile_stack, c1)) {
+                    goto normal_char;
+                }
+
+                laststart = b;
+                BUF_PUSH_2 (duplicate, c1);
+                break;
+
+
+            case '+':
+            case '?':
+                if (syntax & RE_BK_PLUS_QM) {
+                    goto handle_plus;
+                } else {
+                    goto normal_backslash;
+                }
+
+            default:
+normal_backslash:
+                /* You might think it would be useful for \ to mean
+                   not to translate; but if we don't translate it
+                   it will never match anything.  */
+                c = TRANSLATE (c);
+                goto normal_char;
+            }
+            break;
+
+
+        default:
+            /* Expects the character in `c'.  */
+normal_char:
+            /* If no exactn currently being built.  */
+            if (!pending_exact
+
+                    /* If last exactn not at current position.  */
+                    || pending_exact + *pending_exact + 1 != b
+
+                    /* We have only one byte following the exactn for the count.  */
+                    || *pending_exact == (1 << BYTEWIDTH) - 1
+
+                    /* If followed by a repetition operator.  */
+                    || *p == '*' || *p == '^'
+                    || ((syntax & RE_BK_PLUS_QM)
+                        ? *p == '\\' && (p[1] == '+' || p[1] == '?')
+                        : (*p == '+' || *p == '?'))
+                    || ((syntax & RE_INTERVALS)
+                        && ((syntax & RE_NO_BK_BRACES)
+                            ? *p == '{'
+                            : (p[0] == '\\' && p[1] == '{')))) {
+                /* Start building a new exactn.  */
+
+                laststart = b;
+
+                BUF_PUSH_2 (exactn, 0);
+                pending_exact = b - 1;
+            }
+
+            BUF_PUSH (c);
+            (*pending_exact)++;
+            break;
+        } /* switch (c) */
+    } /* while p != pend */
+
+
+    /* Through the pattern now.  */
+
+    if (fixup_alt_jump) {
+        STORE_JUMP (jump_past_alt, fixup_alt_jump, b);
+    }
+
+    if (!COMPILE_STACK_EMPTY) {
+        return REG_EPAREN;
+    }
+
+    free (compile_stack.stack);
+
+    /* We have succeeded; set the length of the buffer.  */
+    bufp->used = b - bufp->buffer;
+
+#ifdef DEBUG
+    if (debug) {
+        DEBUG_PRINT1 ("\nCompiled pattern: ");
+        print_compiled_pattern (bufp);
+    }
+#endif /* DEBUG */
+
+    return REG_NOERROR;
+} /* regex_compile */
+

+/* Subroutines for `regex_compile'.  */
+
+/* Store OP at LOC followed by two-byte integer parameter ARG.  */
+
+static void
+store_op1 (
+    re_opcode_t op,
+    unsigned char *loc,
+    int arg)
+{
+    *loc = (unsigned char) op;
+    STORE_NUMBER (loc + 1, arg);
+}
+
+
+/* Like `store_op1', but for two two-byte parameters ARG1 and ARG2.  */
+
+static void
+store_op2 (
+    re_opcode_t op,
+    unsigned char *loc,
+    int arg1, int arg2)
+{
+    *loc = (unsigned char) op;
+    STORE_NUMBER (loc + 1, arg1);
+    STORE_NUMBER (loc + 3, arg2);
+}
+
+
+/* Copy the bytes from LOC to END to open up three bytes of space at LOC
+   for OP followed by two-byte integer parameter ARG.  */
+
+static void
+insert_op1 (
+    re_opcode_t op,
+    unsigned char *loc,
+    int arg,
+    unsigned char *end)
+{
+    register unsigned char *pfrom = end;
+    register unsigned char *pto = end + 3;
+
+    while (pfrom != loc) {
+        *--pto = *--pfrom;
+    }
+
+    store_op1 (op, loc, arg);
+}
+
+
+/* Like `insert_op1', but for two two-byte parameters ARG1 and ARG2.  */
+
+static void
+insert_op2 (
+    re_opcode_t op,
+    unsigned char *loc,
+    int arg1, int arg2,
+    unsigned char *end)
+{
+    register unsigned char *pfrom = end;
+    register unsigned char *pto = end + 5;
+
+    while (pfrom != loc) {
+        *--pto = *--pfrom;
+    }
+
+    store_op2 (op, loc, arg1, arg2);
+}
+
+
+/* P points to just after a ^ in PATTERN.  Return true if that ^ comes
+   after an alternative or a begin-subexpression.  We assume there is at
+   least one character before the ^.  */
+
+static boolean  at_begline_loc_p (const char *pattern, const char *p, reg_syntax_t syntax)
+{
+    const char *prev = p - 2;
+    boolean prev_prev_backslash = prev > pattern && prev[-1] == '\\';
+
+    return
+        /* After a subexpression?  */
+        (*prev == '(' && (syntax & RE_NO_BK_PARENS || prev_prev_backslash))
+        /* After an alternative?  */
+        || (*prev == '|' && (syntax & RE_NO_BK_VBAR || prev_prev_backslash));
+}
+
+
+/* The dual of at_begline_loc_p.  This one is for $.  We assume there is
+   at least one character after the $, i.e., `P < PEND'.  */
+
+static boolean  at_endline_loc_p (const char *p, const char *pend, int syntax)
+{
+    const char *next = p;
+    boolean next_backslash = *next == '\\';
+    const char *next_next = p + 1 < pend ? p + 1 : NULL;
+
+    return
+        /* Before a subexpression?  */
+        (syntax & RE_NO_BK_PARENS ? *next == ')'
+         : next_backslash && next_next && *next_next == ')')
+        /* Before an alternative?  */
+        || (syntax & RE_NO_BK_VBAR ? *next == '|'
+            : next_backslash && next_next && *next_next == '|');
+}
+
+
+/* Returns true if REGNUM is in one of COMPILE_STACK's elements and
+   false if it's not.  */
+
+static boolean
+group_in_compile_stack (
+    compile_stack_type compile_stack,
+    regnum_t regnum)
+{
+    int this_element;
+
+    for (this_element = compile_stack.avail - 1;
+            this_element >= 0;
+            this_element--)
+        if (compile_stack.stack[this_element].regnum == regnum) {
+            return true;
+        }
+
+    return false;
+}
+
+
+/* Read the ending character of a range (in a bracket expression) from the
+   uncompiled pattern *P_PTR (which ends at PEND).  We assume the
+   starting character is in `P[-2]'.  (`P[-1]' is the character `-'.)
+   Then we set the translation of all bits between the starting and
+   ending characters (inclusive) in the compiled pattern B.
+
+   Return an error code.
+
+   We use these short variable names so we can use the same macros as
+   `regex_compile' itself.  */
+
+static reg_errcode_t
+compile_range (
+    const char **p_ptr, const char *pend,
+    char *translate,
+    reg_syntax_t syntax,
+    unsigned char *b)
+{
+    unsigned this_char;
+
+    const char *p = *p_ptr;
+    int range_start, range_end;
+
+    if (p == pend) {
+        return REG_ERANGE;
+    }
+
+    /* Even though the pattern is a signed `char *', we need to fetch
+       with unsigned char *'s; if the high bit of the pattern character
+       is set, the range endpoints will be negative if we fetch using a
+       signed char *.
+
+       We also want to fetch the endpoints without translating them; the
+       appropriate translation is done in the bit-setting loop below.  */
+    range_start = ((unsigned char *) p)[-2];
+    range_end   = ((unsigned char *) p)[0];
+
+    /* Have to increment the pointer into the pattern string, so the
+       caller isn't still at the ending character.  */
+    (*p_ptr)++;
+
+    /* If the start is after the end, the range is empty.  */
+    if (range_start > range_end) {
+        return syntax & RE_NO_EMPTY_RANGES ? REG_ERANGE : REG_NOERROR;
+    }
+
+    /* Here we see why `this_char' has to be larger than an `unsigned
+       char' -- the range is inclusive, so if `range_end' == 0xff
+       (assuming 8-bit characters), we would otherwise go into an infinite
+       loop, since all characters <= 0xff.  */
+    for (this_char = range_start; this_char <= range_end; this_char++) {
+        SET_LIST_BIT (TRANSLATE (this_char));
+    }
+
+    return REG_NOERROR;
+}
+

+/* Failure stack declarations and macros; both re_compile_fastmap and
+   re_match_2 use a failure stack.  These have to be macros because of
+   REGEX_ALLOCATE.  */
+
+
+/* Number of failure points for which to initially allocate space
+   when matching.  If this number is exceeded, we allocate more
+   space, so it is not a hard limit.  */
+#ifndef INIT_FAILURE_ALLOC
+#define INIT_FAILURE_ALLOC 5
+#endif
+
+/* Roughly the maximum number of failure points on the stack.  Would be
+   exactly that if always used MAX_FAILURE_SPACE each time we failed.
+   This is a variable only so users of regex can assign to it; we never
+   change it ourselves.  */
+int re_max_failures = 2000;
+
+/*
+typedef const unsigned char *fail_stack_elt_t;
+*/
+
+typedef struct {
+    fail_stack_elt_t *stack;
+    unsigned size;
+    unsigned avail;         /* Offset of next open position.  */
+} fail_stack_type;
+
+#define FAIL_STACK_EMPTY()     (fail_stack.avail == 0)
+#define FAIL_STACK_PTR_EMPTY() (fail_stack_ptr->avail == 0)
+#define FAIL_STACK_FULL()      (fail_stack.avail == fail_stack.size)
+#define FAIL_STACK_TOP()       (fail_stack.stack[fail_stack.avail])
+
+
+/* Initialize `fail_stack'.  Do `return -2' if the alloc fails.  */
+
+#define INIT_FAIL_STACK()                       \
+  do {                                  \
+    fail_stack.stack = (fail_stack_elt_t *)             \
+      REGEX_ALLOCATE (INIT_FAILURE_ALLOC * sizeof (fail_stack_elt_t));  \
+                                    \
+    if (fail_stack.stack == NULL)                   \
+      return -2;                            \
+                                    \
+    fail_stack.size = INIT_FAILURE_ALLOC;               \
+    fail_stack.avail = 0;                       \
+  } while (0)
+
+
+/* Double the size of FAIL_STACK, up to approximately `re_max_failures' items.
+
+   Return 1 if succeeds, and 0 if either ran out of memory
+   allocating space for it or it was already too large.
+
+   REGEX_REALLOCATE requires `destination' be declared.   */
+
+#define DOUBLE_FAIL_STACK(fail_stack)                   \
+  ((fail_stack).size > re_max_failures * MAX_FAILURE_ITEMS      \
+   ? 0                                  \
+   : ((fail_stack).stack = (fail_stack_elt_t *)             \
+        REGEX_REALLOCATE ((fail_stack).stack,               \
+          (fail_stack).size * sizeof (fail_stack_elt_t),        \
+          ((fail_stack).size << 1) * sizeof (fail_stack_elt_t)),    \
+                                    \
+      (fail_stack).stack == NULL                    \
+      ? 0                               \
+      : ((fail_stack).size <<= 1,                   \
+         1)))
+
+
+/* Push PATTERN_OP on FAIL_STACK.
+
+   Return 1 if was able to do so and 0 if ran out of memory allocating
+   space to do so.  */
+#define PUSH_PATTERN_OP(pattern_op, fail_stack)             \
+  ((FAIL_STACK_FULL ()                          \
+    && !DOUBLE_FAIL_STACK (fail_stack))                 \
+    ? 0                                 \
+    : ((fail_stack).stack[(fail_stack).avail++] = pattern_op,       \
+       1))
+
+/* This pushes an item onto the failure stack.  Must be a four-byte
+   value.  Assumes the variable `fail_stack'.  Probably should only
+   be called from within `PUSH_FAILURE_POINT'.  */
+#define PUSH_FAILURE_ITEM(item)                     \
+  fail_stack.stack[fail_stack.avail++] = (fail_stack_elt_t) item
+
+/* The complement operation.  Assumes `fail_stack' is nonempty.  */
+#define POP_FAILURE_ITEM() fail_stack.stack[--fail_stack.avail]
+
+/* Used to omit pushing failure point id's when we're not debugging.  */
+#ifdef DEBUG
+#define DEBUG_PUSH PUSH_FAILURE_ITEM
+#define DEBUG_POP(item_addr) *(item_addr) = POP_FAILURE_ITEM ()
+#else
+#define DEBUG_PUSH(item)
+#define DEBUG_POP(item_addr)
+#endif
+
+
+/* Push the information about the state we will need
+   if we ever fail back to it.
+
+   Requires variables fail_stack, regstart, regend, reg_info, and
+   num_regs be declared.  DOUBLE_FAIL_STACK requires `destination' be
+   declared.
+
+   Does `return FAILURE_CODE' if runs out of memory.  */
+
+#define PUSH_FAILURE_POINT(pattern_place, string_place, failure_code)   \
+  do {                                  \
+    char *destination;                          \
+    /* Must be int, so when we don't save any registers, the arithmetic \
+       of 0 + -1 isn't done as unsigned.  */                \
+    int this_reg;                           \
+                                        \
+    DEBUG_STATEMENT (failure_id++);                 \
+    DEBUG_STATEMENT (nfailure_points_pushed++);             \
+    DEBUG_PRINT2 ("\nPUSH_FAILURE_POINT #%u:\n", failure_id);       \
+    DEBUG_PRINT2 ("  Before push, next avail: %d\n", (fail_stack).avail);\
+    DEBUG_PRINT2 ("                     size: %d\n", (fail_stack).size);\
+                                    \
+    DEBUG_PRINT2 ("  slots needed: %d\n", NUM_FAILURE_ITEMS);       \
+    DEBUG_PRINT2 ("     available: %d\n", REMAINING_AVAIL_SLOTS);   \
+                                    \
+    /* Ensure we have enough space allocated for what we will push.  */ \
+    while (REMAINING_AVAIL_SLOTS < NUM_FAILURE_ITEMS)           \
+      {                                 \
+        if (!DOUBLE_FAIL_STACK (fail_stack))            \
+          return failure_code;                      \
+                                    \
+        DEBUG_PRINT2 ("\n  Doubled stack; size now: %d\n",      \
+               (fail_stack).size);              \
+        DEBUG_PRINT2 ("  slots available: %d\n", REMAINING_AVAIL_SLOTS);\
+      }                                 \
+                                    \
+    /* Push the info, starting with the registers.  */          \
+    DEBUG_PRINT1 ("\n");                        \
+                                    \
+    for (this_reg = lowest_active_reg; this_reg <= highest_active_reg;  \
+         this_reg++)                            \
+      {                                 \
+    DEBUG_PRINT2 ("  Pushing reg: %d\n", this_reg);         \
+        DEBUG_STATEMENT (num_regs_pushed++);                \
+                                    \
+    DEBUG_PRINT2 ("    start: 0x%x\n", regstart[this_reg]);     \
+        PUSH_FAILURE_ITEM (regstart[this_reg]);             \
+                                                                        \
+    DEBUG_PRINT2 ("    end: 0x%x\n", regend[this_reg]);     \
+        PUSH_FAILURE_ITEM (regend[this_reg]);               \
+                                    \
+    DEBUG_PRINT2 ("    info: 0x%x\n      ", reg_info[this_reg]);    \
+        DEBUG_PRINT2 (" match_null=%d",                 \
+                      REG_MATCH_NULL_STRING_P (reg_info[this_reg]));    \
+        DEBUG_PRINT2 (" active=%d", IS_ACTIVE (reg_info[this_reg]));    \
+        DEBUG_PRINT2 (" matched_something=%d",              \
+                      MATCHED_SOMETHING (reg_info[this_reg]));      \
+        DEBUG_PRINT2 (" ever_matched=%d",               \
+                      EVER_MATCHED_SOMETHING (reg_info[this_reg])); \
+    DEBUG_PRINT1 ("\n");                        \
+        PUSH_FAILURE_ITEM (reg_info[this_reg].word);            \
+      }                                 \
+                                    \
+    DEBUG_PRINT2 ("  Pushing  low active reg: %d\n", lowest_active_reg);\
+    PUSH_FAILURE_ITEM (lowest_active_reg);              \
+                                    \
+    DEBUG_PRINT2 ("  Pushing high active reg: %d\n", highest_active_reg);\
+    PUSH_FAILURE_ITEM (highest_active_reg);             \
+                                    \
+    DEBUG_PRINT2 ("  Pushing pattern 0x%x: ", pattern_place);       \
+    DEBUG_PRINT_COMPILED_PATTERN (bufp, pattern_place, pend);       \
+    PUSH_FAILURE_ITEM (pattern_place);                  \
+                                    \
+    DEBUG_PRINT2 ("  Pushing string 0x%x: `", string_place);        \
+    DEBUG_PRINT_DOUBLE_STRING (string_place, string1, size1, string2,   \
+                 size2);                \
+    DEBUG_PRINT1 ("'\n");                       \
+    PUSH_FAILURE_ITEM (string_place);                   \
+                                    \
+    DEBUG_PRINT2 ("  Pushing failure id: %u\n", failure_id);        \
+    DEBUG_PUSH (failure_id);                        \
+  } while (0)
+
+/* This is the number of items that are pushed and popped on the stack
+   for each register.  */
+#define NUM_REG_ITEMS  3
+
+/* Individual items aside from the registers.  */
+#ifdef DEBUG
+#define NUM_NONREG_ITEMS 5 /* Includes failure point id.  */
+#else
+#define NUM_NONREG_ITEMS 4
+#endif
+
+/* We push at most this many items on the stack.  */
+#define MAX_FAILURE_ITEMS ((num_regs - 1) * NUM_REG_ITEMS + NUM_NONREG_ITEMS)
+
+/* We actually push this many items.  */
+#define NUM_FAILURE_ITEMS                       \
+  ((highest_active_reg - lowest_active_reg + 1) * NUM_REG_ITEMS     \
+    + NUM_NONREG_ITEMS)
+
+/* How many items can still be added to the stack without overflowing it.  */
+#define REMAINING_AVAIL_SLOTS ((fail_stack).size - (fail_stack).avail)
+
+
+/* Pops what PUSH_FAIL_STACK pushes.
+
+   We restore into the parameters, all of which should be lvalues:
+     STR -- the saved data position.
+     PAT -- the saved pattern position.
+     LOW_REG, HIGH_REG -- the highest and lowest active registers.
+     REGSTART, REGEND -- arrays of string positions.
+     REG_INFO -- array of information about each subexpression.
+
+   Also assumes the variables `fail_stack' and (if debugging), `bufp',
+   `pend', `string1', `size1', `string2', and `size2'.  */
+
+#ifdef __HYPHY_64__
+#define POP_FAILURE_POINT(str, pat, low_reg, high_reg, regstart, regend, reg_info)\
+{                                   \
+  DEBUG_STATEMENT (fail_stack_elt_t failure_id;)            \
+  int this_reg;                             \
+  const unsigned char *string_temp;                 \
+                                    \
+  assert (!FAIL_STACK_EMPTY ());                    \
+                                    \
+  /* Remove failure points and point to how many regs pushed.  */   \
+  DEBUG_PRINT1 ("POP_FAILURE_POINT:\n");                \
+  DEBUG_PRINT2 ("  Before pop, next avail: %d\n", fail_stack.avail);    \
+  DEBUG_PRINT2 ("                    size: %d\n", fail_stack.size); \
+                                    \
+  assert (fail_stack.avail >= NUM_NONREG_ITEMS);            \
+                                    \
+  DEBUG_POP (&failure_id);                      \
+  DEBUG_PRINT2 ("  Popping failure id: %u\n", failure_id);      \
+                                    \
+  /* If the saved string location is NULL, it came from an      \
+     on_failure_keep_string_jump opcode, and we want to throw away the  \
+     saved NULL, thus retaining our current position in the string.  */ \
+  string_temp = POP_FAILURE_ITEM ();                    \
+  if (string_temp != NULL)                      \
+    str = (const char *) string_temp;                   \
+                                    \
+  DEBUG_PRINT2 ("  Popping string 0x%x: `", str);           \
+  DEBUG_PRINT_DOUBLE_STRING (str, string1, size1, string2, size2);  \
+  DEBUG_PRINT1 ("'\n");                         \
+                                    \
+  pat = (unsigned char *) POP_FAILURE_ITEM ();              \
+  DEBUG_PRINT2 ("  Popping pattern 0x%x: ", pat);           \
+  DEBUG_PRINT_COMPILED_PATTERN (bufp, pat, pend);           \
+                                    \
+  /* Restore register info.  */                     \
+  high_reg = (unsigned long) POP_FAILURE_ITEM ();               \
+  DEBUG_PRINT2 ("  Popping high active reg: %d\n", high_reg);       \
+                                    \
+  low_reg = (unsigned long) POP_FAILURE_ITEM ();                \
+  DEBUG_PRINT2 ("  Popping  low active reg: %d\n", low_reg);        \
+                                    \
+  for (this_reg = high_reg; this_reg >= low_reg; this_reg--)        \
+    {                                   \
+      DEBUG_PRINT2 ("    Popping reg: %d\n", this_reg);         \
+                                    \
+      reg_info[this_reg].word = POP_FAILURE_ITEM ();            \
+      DEBUG_PRINT2 ("      info: 0x%x\n", reg_info[this_reg]);      \
+                                    \
+      regend[this_reg] = (const char *) POP_FAILURE_ITEM ();        \
+      DEBUG_PRINT2 ("      end: 0x%x\n", regend[this_reg]);     \
+                                    \
+      regstart[this_reg] = (const char *) POP_FAILURE_ITEM ();      \
+      DEBUG_PRINT2 ("      start: 0x%x\n", regstart[this_reg]);     \
+    }                                   \
+                                    \
+  DEBUG_STATEMENT (nfailure_points_popped++);               \
+} /* POP_FAILURE_POINT */
+#else
+#define POP_FAILURE_POINT(str, pat, low_reg, high_reg, regstart, regend, reg_info)\
+{                                   \
+  DEBUG_STATEMENT (fail_stack_elt_t failure_id;)            \
+  int this_reg;                             \
+  const unsigned char *string_temp;                 \
+                                    \
+  assert (!FAIL_STACK_EMPTY ());                    \
+                                    \
+  /* Remove failure points and point to how many regs pushed.  */   \
+  DEBUG_PRINT1 ("POP_FAILURE_POINT:\n");                \
+  DEBUG_PRINT2 ("  Before pop, next avail: %d\n", fail_stack.avail);    \
+  DEBUG_PRINT2 ("                    size: %d\n", fail_stack.size); \
+                                    \
+  assert (fail_stack.avail >= NUM_NONREG_ITEMS);            \
+                                    \
+  DEBUG_POP (&failure_id);                      \
+  DEBUG_PRINT2 ("  Popping failure id: %u\n", failure_id);      \
+                                    \
+  /* If the saved string location is NULL, it came from an      \
+     on_failure_keep_string_jump opcode, and we want to throw away the  \
+     saved NULL, thus retaining our current position in the string.  */ \
+  string_temp = POP_FAILURE_ITEM ();                    \
+  if (string_temp != NULL)                      \
+    str = (const char *) string_temp;                   \
+                                    \
+  DEBUG_PRINT2 ("  Popping string 0x%x: `", str);           \
+  DEBUG_PRINT_DOUBLE_STRING (str, string1, size1, string2, size2);  \
+  DEBUG_PRINT1 ("'\n");                         \
+                                    \
+  pat = (unsigned char *) POP_FAILURE_ITEM ();              \
+  DEBUG_PRINT2 ("  Popping pattern 0x%x: ", pat);           \
+  DEBUG_PRINT_COMPILED_PATTERN (bufp, pat, pend);           \
+                                    \
+  /* Restore register info.  */                     \
+  high_reg = (unsigned) POP_FAILURE_ITEM ();                \
+  DEBUG_PRINT2 ("  Popping high active reg: %d\n", high_reg);       \
+                                    \
+  low_reg = (unsigned) POP_FAILURE_ITEM ();             \
+  DEBUG_PRINT2 ("  Popping  low active reg: %d\n", low_reg);        \
+                                    \
+  for (this_reg = high_reg; this_reg >= low_reg; this_reg--)        \
+    {                                   \
+      DEBUG_PRINT2 ("    Popping reg: %d\n", this_reg);         \
+                                    \
+      reg_info[this_reg].word = POP_FAILURE_ITEM ();            \
+      DEBUG_PRINT2 ("      info: 0x%x\n", reg_info[this_reg]);      \
+                                    \
+      regend[this_reg] = (const char *) POP_FAILURE_ITEM ();        \
+      DEBUG_PRINT2 ("      end: 0x%x\n", regend[this_reg]);     \
+                                    \
+      regstart[this_reg] = (const char *) POP_FAILURE_ITEM ();      \
+      DEBUG_PRINT2 ("      start: 0x%x\n", regstart[this_reg]);     \
+    }                                   \
+                                    \
+  DEBUG_STATEMENT (nfailure_points_popped++);               \
+} /* POP_FAILURE_POINT */
+#endif
+/* re_compile_fastmap computes a ``fastmap'' for the compiled pattern in
+   BUFP.  A fastmap records which of the (1 << BYTEWIDTH) possible
+   characters can start a string that matches the pattern.  This fastmap
+   is used by re_search to skip quickly over impossible starting points.
+
+   The caller must supply the address of a (1 << BYTEWIDTH)-byte data
+   area as BUFP->fastmap.
+
+   We set the `fastmap', `fastmap_accurate', and `can_be_null' fields in
+   the pattern buffer.
+
+   Returns 0 if we succeed, -2 if an internal error.   */
+
+int
+re_compile_fastmap (struct re_pattern_buffer *bufp)
+{
+    int j, k;
+    fail_stack_type fail_stack;
+#ifndef REGEX_MALLOC
+    char *destination;
+#endif
+    /* We don't push any register information onto the failure stack.  */
+    unsigned num_regs = 0;
+
+    register char *fastmap = bufp->fastmap;
+    unsigned char *pattern = bufp->buffer;
+    unsigned long size = bufp->used;
+    const unsigned char *p = pattern;
+    register unsigned char *pend = pattern + size;
+
+    /* Assume that each path through the pattern can be null until
+       proven otherwise.  We set this false at the bottom of switch
+       statement, to which we get only if a particular path doesn't
+       match the empty string.  */
+    boolean path_can_be_null = true;
+
+    /* We aren't doing a `succeed_n' to begin with.  */
+    boolean succeed_n_p = false;
+
+    assert (fastmap != NULL && p != NULL);
+
+    INIT_FAIL_STACK ();
+    bzero (fastmap, 1 << BYTEWIDTH);  /* Assume nothing's valid.  */
+    bufp->fastmap_accurate = 1;     /* It will be when we're done.  */
+    bufp->can_be_null = 0;
+
+    while (p != pend || !FAIL_STACK_EMPTY ()) {
+        if (p == pend) {
+            bufp->can_be_null |= path_can_be_null;
+
+            /* Reset for next path.  */
+            path_can_be_null = true;
+
+            p = fail_stack.stack[--fail_stack.avail];
+        }
+
+        /* We should never be about to go beyond the end of the pattern.  */
+        assert (p < pend);
+
+#ifdef SWITCH_ENUM_BUG
+        switch ((int) ((re_opcode_t) *p++))
+#else
+        switch ((re_opcode_t) *p++)
+#endif
+        {
+
+            /* I guess the idea here is to simply not bother with a fastmap
+               if a backreference is used, since it's too hard to figure out
+               the fastmap for the corresponding group.  Setting
+               `can_be_null' stops `re_search_2' from using the fastmap, so
+               that is all we do.  */
+        case duplicate:
+            bufp->can_be_null = 1;
+            return 0;
+
+
+            /* Following are the cases which match a character.  These end
+               with `break'.  */
+
+        case exactn:
+            fastmap[p[1]] = 1;
+            break;
+
+
+        case charset:
+            for (j = *p++ * BYTEWIDTH - 1; j >= 0; j--)
+                if (p[j / BYTEWIDTH] & (1 << (j % BYTEWIDTH))) {
+                    fastmap[j] = 1;
+                }
+            break;
+
+
+        case charset_not:
+            /* Chars beyond end of map must be allowed.  */
+            for (j = *p * BYTEWIDTH; j < (1 << BYTEWIDTH); j++) {
+                fastmap[j] = 1;
+            }
+
+            for (j = *p++ * BYTEWIDTH - 1; j >= 0; j--)
+                if (!(p[j / BYTEWIDTH] & (1 << (j % BYTEWIDTH)))) {
+                    fastmap[j] = 1;
+                }
+            break;
+
+
+        case wordchar:
+            for (j = 0; j < (1 << BYTEWIDTH); j++)
+                if (SYNTAX (j) == Sword) {
+                    fastmap[j] = 1;
+                }
+            break;
+
+
+        case notwordchar:
+            for (j = 0; j < (1 << BYTEWIDTH); j++)
+                if (SYNTAX (j) != Sword) {
+                    fastmap[j] = 1;
+                }
+            break;
+
+
+        case anychar:
+            /* `.' matches anything ...  */
+            for (j = 0; j < (1 << BYTEWIDTH); j++) {
+                fastmap[j] = 1;
+            }
+
+            /* ... except perhaps newline.  */
+            if (!(bufp->syntax & RE_DOT_NEWLINE)) {
+                fastmap['\n'] = 0;
+            }
+
+            /* Return if we have already set `can_be_null'; if we have,
+               then the fastmap is irrelevant.  Something's wrong here.  */
+            else if (bufp->can_be_null) {
+                return 0;
+            }
+
+            /* Otherwise, have to check alternative paths.  */
+            break;
+
+
+#ifdef emacs
+        case syntaxspec:
+            k = *p++;
+            for (j = 0; j < (1 << BYTEWIDTH); j++)
+                if (SYNTAX (j) == (enum syntaxcode) k) {
+                    fastmap[j] = 1;
+                }
+            break;
+
+
+        case notsyntaxspec:
+            k = *p++;
+            for (j = 0; j < (1 << BYTEWIDTH); j++)
+                if (SYNTAX (j) != (enum syntaxcode) k) {
+                    fastmap[j] = 1;
+                }
+            break;
+
+
+            /* All cases after this match the empty string.  These end with
+               `continue'.  */
+
+
+        case before_dot:
+        case at_dot:
+        case after_dot:
+            continue;
+#endif /* not emacs */
+
+
+        case no_op:
+        case begline:
+        case endline:
+        case begbuf:
+        case endbuf:
+        case wordbound:
+        case notwordbound:
+        case wordbeg:
+        case wordend:
+        case push_dummy_failure:
+            continue;
+
+
+        case jump_n:
+        case pop_failure_jump:
+        case maybe_pop_jump:
+        case jump:
+        case jump_past_alt:
+        case dummy_failure_jump:
+            EXTRACT_NUMBER_AND_INCR (j, p);
+            p += j;
+            if (j > 0) {
+                continue;
+            }
+
+            /* Jump backward implies we just went through the body of a
+               loop and matched nothing.  Opcode jumped to should be
+               `on_failure_jump' or `succeed_n'.  Just treat it like an
+               ordinary jump.  For a * loop, it has pushed its failure
+               point already; if so, discard that as redundant.  */
+            if ((re_opcode_t) *p != on_failure_jump
+                    && (re_opcode_t) *p != succeed_n) {
+                continue;
+            }
+
+            p++;
+            EXTRACT_NUMBER_AND_INCR (j, p);
+            p += j;
+
+            /* If what's on the stack is where we are now, pop it.  */
+            if (!FAIL_STACK_EMPTY ()
+                    && fail_stack.stack[fail_stack.avail - 1] == p) {
+                fail_stack.avail--;
+            }
+
+            continue;
+
+
+        case on_failure_jump:
+        case on_failure_keep_string_jump:
+handle_on_failure_jump:
+            EXTRACT_NUMBER_AND_INCR (j, p);
+
+            /* For some patterns, e.g., `(a?)?', `p+j' here points to the
+               end of the pattern.  We don't want to push such a point,
+               since when we restore it above, entering the switch will
+               increment `p' past the end of the pattern.  We don't need
+               to push such a point since we obviously won't find any more
+               fastmap entries beyond `pend'.  Such a pattern can match
+               the null string, though.  */
+            if (p + j < pend) {
+                if (!PUSH_PATTERN_OP (p + j, fail_stack)) {
+                    return -2;
+                }
+            } else {
+                bufp->can_be_null = 1;
+            }
+
+            if (succeed_n_p) {
+                EXTRACT_NUMBER_AND_INCR (k, p); /* Skip the n.  */
+                succeed_n_p = false;
+            }
+
+            continue;
+
+
+        case succeed_n:
+            /* Get to the number of times to succeed.  */
+            p += 2;
+
+            /* Increment p past the n for when k != 0.  */
+            EXTRACT_NUMBER_AND_INCR (k, p);
+            if (k == 0) {
+                p -= 4;
+                succeed_n_p = true;  /* Spaghetti code alert.  */
+                goto handle_on_failure_jump;
+            }
+            continue;
+
+
+        case set_number_at:
+            p += 4;
+            continue;
+
+
+        case start_memory:
+        case stop_memory:
+            p += 2;
+            continue;
+
+
+        default:
+            abort (); /* We have listed all the cases.  */
+        } /* switch *p++ */
+
+        /* Getting here means we have found the possible starting
+           characters for one path of the pattern -- and that the empty
+           string does not match.  We need not follow this path further.
+           Instead, look at the next alternative (remembered on the
+           stack), or quit if no more.  The test at the top of the loop
+           does these things.  */
+        path_can_be_null = false;
+        p = pend;
+    } /* while p */
+
+    /* Set `can_be_null' for the last path (also the first path, if the
+       pattern is empty).  */
+    bufp->can_be_null |= path_can_be_null;
+    return 0;
+} /* re_compile_fastmap */
+

+/* Set REGS to hold NUM_REGS registers, storing them in STARTS and
+   ENDS.  Subsequent matches using PATTERN_BUFFER and REGS will use
+   this memory for recording register information.  STARTS and ENDS
+   must be allocated using the malloc library routine, and must each
+   be at least NUM_REGS * sizeof (regoff_t) bytes long.
+
+   If NUM_REGS == 0, then subsequent matches should allocate their own
+   register data.
+
+   Unless this function is called, the first search or match using
+   PATTERN_BUFFER will allocate its own register data, without
+   freeing the old data.  */
+
+void
+re_set_registers (
+    struct re_pattern_buffer *bufp,
+    struct re_registers *regs,
+    unsigned num_regs,
+    regoff_t *starts, regoff_t *ends)
+{
+    if (num_regs) {
+        bufp->regs_allocated = REGS_REALLOCATE;
+        regs->num_regs = num_regs;
+        regs->start = starts;
+        regs->end = ends;
+    } else {
+        bufp->regs_allocated = REGS_UNALLOCATED;
+        regs->num_regs = 0;
+        regs->start = regs->end = (regoff_t) 0;
+    }
+}
+

+/* Searching routines.  */
+
+/* Like re_search_2, below, but only one string is specified, and
+   doesn't let you say where to stop matching. */
+
+int
+re_search (
+    struct re_pattern_buffer *bufp,
+    const char *string,
+    int size, int startpos, int range,
+    struct re_registers *regs)
+{
+    return re_search_2 (bufp, NULL, 0, string, size, startpos, range,
+                        regs, size);
+}
+
+
+/* Using the compiled pattern in BUFP->buffer, first tries to match the
+   virtual concatenation of STRING1 and STRING2, starting first at index
+   STARTPOS, then at STARTPOS + 1, and so on.
+
+   STRING1 and STRING2 have length SIZE1 and SIZE2, respectively.
+
+   RANGE is how far to scan while trying to match.  RANGE = 0 means try
+   only at STARTPOS; in general, the last start tried is STARTPOS +
+   RANGE.
+
+   In REGS, return the indices of the virtual concatenation of STRING1
+   and STRING2 that matched the entire BUFP->buffer and its contained
+   subexpressions.
+
+   Do not consider matching one past the index STOP in the virtual
+   concatenation of STRING1 and STRING2.
+
+   We return either the position in the strings at which the match was
+   found, -1 if no match, or -2 if error (such as failure
+   stack overflow).  */
+
+int
+re_search_2 (
+    struct re_pattern_buffer *bufp,
+    const char *string1, int size1, const char *string2,
+    int size2,
+    int startpos,
+    int range,
+    struct re_registers *regs,
+    int stop)
+{
+    int val;
+    register char *fastmap = bufp->fastmap;
+    register char *translate = bufp->translate;
+    int total_size = size1 + size2;
+    int endpos = startpos + range;
+
+    /* Check for out-of-range STARTPOS.  */
+    if (startpos < 0 || startpos > total_size) {
+        return -1;
+    }
+
+    /* Fix up RANGE if it might eventually take us outside
+       the virtual concatenation of STRING1 and STRING2.  */
+    if (endpos < -1) {
+        range = -1 - startpos;
+    } else if (endpos > total_size) {
+        range = total_size - startpos;
+    }
+
+    /* If the search isn't to be a backwards one, don't waste time in a
+       search for a pattern that must be anchored.  */
+    if (bufp->used > 0 && (re_opcode_t) bufp->buffer[0] == begbuf && range > 0) {
+        if (startpos > 0) {
+            return -1;
+        } else {
+            range = 1;
+        }
+    }
+
+    /* Update the fastmap now if not correct already.  */
+    if (fastmap && !bufp->fastmap_accurate)
+        if (re_compile_fastmap (bufp) == -2) {
+            return -2;
+        }
+
+    /* Loop through the string, looking for a place to start matching.  */
+    for (;;) {
+        /* If a fastmap is supplied, skip quickly over characters that
+           cannot be the start of a match.  If the pattern can match the
+           null string, however, we don't need to skip characters; we want
+           the first null string.  */
+        if (fastmap && startpos < total_size && !bufp->can_be_null) {
+            if (range > 0) {    /* Searching forwards.  */
+                register const char *d;
+                register int lim = 0;
+                int irange = range;
+
+                if (startpos < size1 && startpos + range >= size1) {
+                    lim = range - (size1 - startpos);
+                }
+
+                d = (startpos >= size1 ? string2 - size1 : string1) + startpos;
+
+                /* Written out as an if-else to avoid testing `translate'
+                   inside the loop.  */
+                if (translate)
+                    while (range > lim
+                            && !fastmap[(unsigned char)
+                                        translate[(unsigned char) *d++]]) {
+                        range--;
+                    }
+                else
+                    while (range > lim && !fastmap[(unsigned char) *d++]) {
+                        range--;
+                    }
+
+                startpos += irange - range;
+            } else {            /* Searching backwards.  */
+                register char c = (size1 == 0 || startpos >= size1
+                                   ? string2[startpos - size1]
+                                   : string1[startpos]);
+
+                if (!fastmap[(unsigned char) TRANSLATE (c)]) {
+                    goto advance;
+                }
+            }
+        }
+
+        /* If can't match the null string, and that's all we have left, fail.  */
+        if (range >= 0 && startpos == total_size && fastmap
+                && !bufp->can_be_null) {
+            return -1;
+        }
+
+        val = re_match_2 (bufp, string1, size1, string2, size2,
+                          startpos, regs, stop);
+        if (val >= 0) {
+            return startpos;
+        }
+
+        if (val == -2) {
+            return -2;
+        }
+
+advance:
+        if (!range) {
+            break;
+        } else if (range > 0) {
+            range--;
+            startpos++;
+        } else {
+            range++;
+            startpos--;
+        }
+    }
+    return -1;
+} /* re_search_2 */
+

+
+
+#define REG_MATCH_NULL_STRING_P(R)  ((R).bits.match_null_string_p)
+#define IS_ACTIVE(R)  ((R).bits.is_active)
+#define MATCHED_SOMETHING(R)  ((R).bits.matched_something)
+#define EVER_MATCHED_SOMETHING(R)  ((R).bits.ever_matched_something)
+
+
+/* Call this when have matched a real character; it sets `matched' flags
+   for the subexpressions which we are currently inside.  Also records
+   that those subexprs have matched.  */
+#define SET_REGS_MATCHED()                      \
+  do                                    \
+    {                                   \
+      unsigned r;                           \
+      for (r = lowest_active_reg; r <= highest_active_reg; r++)     \
+        {                               \
+          MATCHED_SOMETHING (reg_info[r])               \
+            = EVER_MATCHED_SOMETHING (reg_info[r])          \
+            = 1;                            \
+        }                               \
+    }                                   \
+  while (0)
+
+
+/* This converts PTR, a pointer into one of the search strings `string1'
+   and `string2' into an offset from the beginning of that string.  */
+#define POINTER_TO_OFFSET(ptr)                      \
+  (FIRST_STRING_P (ptr) ? (ptr) - string1 : (ptr) - string2 + size1)
+
+/* Registers are set to a sentinel when they haven't yet matched.  */
+#define REG_UNSET_VALUE ((char *) -1)
+#define REG_UNSET(e) ((e) == REG_UNSET_VALUE)
+
+
+/* Macros for dealing with the split strings in re_match_2.  */
+
+#define MATCHING_IN_FIRST_STRING  (dend == end_match_1)
+
+/* Call before fetching a character with *d.  This switches over to
+   string2 if necessary.  */
+#define PREFETCH()                          \
+  while (d == dend)                             \
+    {                                   \
+      /* End of string2 => fail.  */                    \
+      if (dend == end_match_2)                      \
+        goto fail;                          \
+      /* End of string1 => advance to string2.  */          \
+      d = string2;                              \
+      dend = end_match_2;                       \
+    }
+
+
+/* Test if at very beginning or at very end of the virtual concatenation
+   of `string1' and `string2'.  If only one string, it's `string2'.  */
+#define AT_STRINGS_BEG(d) ((d) == (size1 ? string1 : string2) || !size2)
+#define AT_STRINGS_END(d) ((d) == end2)
+
+
+/* Test if D points to a character which is word-constituent.  We have
+   two special cases to check for: if past the end of string1, look at
+   the first character in string2; and if before the beginning of
+   string2, look at the last character in string1.  */
+#define WORDCHAR_P(d)                           \
+  (SYNTAX ((d) == end1 ? *string2                   \
+           : (d) == string2 - 1 ? *(end1 - 1) : *(d))           \
+   == Sword)
+
+/* Test if the character before D and the one at D differ with respect
+   to being word-constituent.  */
+#define AT_WORD_BOUNDARY(d)                     \
+  (AT_STRINGS_BEG (d) || AT_STRINGS_END (d)             \
+   || WORDCHAR_P (d - 1) != WORDCHAR_P (d))
+
+
+/* Free everything we malloc.  */
+#ifdef REGEX_MALLOC
+#define FREE_VAR(var) if (var) free (var); var = NULL
+#define FREE_VARIABLES()                        \
+  do {                                  \
+    FREE_VAR (fail_stack.stack);                    \
+    FREE_VAR (regstart);                        \
+    FREE_VAR (regend);                          \
+    FREE_VAR (old_regstart);                        \
+    FREE_VAR (old_regend);                      \
+    FREE_VAR (best_regstart);                       \
+    FREE_VAR (best_regend);                     \
+    FREE_VAR (reg_info);                        \
+    FREE_VAR (reg_dummy);                       \
+    FREE_VAR (reg_info_dummy);                      \
+  } while (0)
+#else /* not REGEX_MALLOC */
+/* Some MIPS systems (at least) want this to free alloca'd storage.  */
+#define FREE_VARIABLES() alloca (0)
+#endif /* not REGEX_MALLOC */
+
+
+/* These values must meet several constraints.  They must not be valid
+   register values; since we have a limit of 255 registers (because
+   we use only one byte in the pattern for the register number), we can
+   use numbers larger than 255.  They must differ by 1, because of
+   NUM_FAILURE_ITEMS above.  And the value for the lowest register must
+   be larger than the value for the highest register, so we do not try
+   to actually save any registers when none are active.  */
+#define NO_HIGHEST_ACTIVE_REG (1 << BYTEWIDTH)
+#define NO_LOWEST_ACTIVE_REG (NO_HIGHEST_ACTIVE_REG + 1)
+

+/* Matching routines.  */
+
+#ifndef emacs   /* Emacs never uses this.  */
+/* re_match is like re_match_2 except it takes only a single string.  */
+
+int
+re_match (
+    struct re_pattern_buffer *bufp,
+    const char *string,
+    int size, int pos,
+    struct re_registers *regs)
+{
+    return re_match_2 (bufp, NULL, 0, string, size, pos, regs, size);
+}
+#endif /* not emacs */
+
+
+/* re_match_2 matches the compiled pattern in BUFP against the
+   the (virtual) concatenation of STRING1 and STRING2 (of length SIZE1
+   and SIZE2, respectively).  We start matching at POS, and stop
+   matching at STOP.
+
+   If REGS is non-null and the `no_sub' field of BUFP is nonzero, we
+   store offsets for the substring each group matched in REGS.  See the
+   documentation for exactly how many groups we fill.
+
+   We return -1 if no match, -2 if an internal error (such as the
+   failure stack overflowing).  Otherwise, we return the length of the
+   matched substring.  */
+
+int
+re_match_2 (
+    struct re_pattern_buffer *bufp,
+    const char *string1,int size1, const char *string2,
+    int size2,
+    int pos,
+    struct re_registers *regs,
+    int stop)
+{
+    /* General temporaries.  */
+    int mcnt;
+    unsigned char *p1;
+
+    /* Just past the end of the corresponding string.  */
+    const char *end1, *end2;
+
+    /* Pointers into string1 and string2, just past the last characters in
+       each to consider matching.  */
+    const char *end_match_1, *end_match_2;
+
+    /* Where we are in the data, and the end of the current string.  */
+    const char *d, *dend;
+
+    /* Where we are in the pattern, and the end of the pattern.  */
+    unsigned char *p = bufp->buffer;
+    register unsigned char *pend = p + bufp->used;
+
+    /* We use this to map every character in the string.  */
+    char *translate = bufp->translate;
+
+    /* Failure point stack.  Each place that can handle a failure further
+       down the line pushes a failure point on this stack.  It consists of
+       restart, regend, and reg_info for all registers corresponding to
+       the subexpressions we're currently inside, plus the number of such
+       registers, and, finally, two char *'s.  The first char * is where
+       to resume scanning the pattern; the second one is where to resume
+       scanning the strings.  If the latter is zero, the failure point is
+       a ``dummy''; if a failure happens and the failure point is a dummy,
+       it gets discarded and the next next one is tried.  */
+    fail_stack_type fail_stack;
+#ifdef DEBUG
+    static unsigned failure_id = 0;
+    unsigned nfailure_points_pushed = 0, nfailure_points_popped = 0;
+#endif
+
+    /* We fill all the registers internally, independent of what we
+       return, for use in backreferences.  The number here includes
+       an element for register zero.  */
+    unsigned num_regs = bufp->re_nsub + 1;
+
+    /* The currently active registers.  */
+    unsigned lowest_active_reg = NO_LOWEST_ACTIVE_REG;
+    unsigned highest_active_reg = NO_HIGHEST_ACTIVE_REG;
+
+    /* Information on the contents of registers. These are pointers into
+       the input strings; they record just what was matched (on this
+       attempt) by a subexpression part of the pattern, that is, the
+       regnum-th regstart pointer points to where in the pattern we began
+       matching and the regnum-th regend points to right after where we
+       stopped matching the regnum-th subexpression.  (The zeroth register
+       keeps track of what the whole pattern matches.)  */
+    const char **regstart, **regend;
+
+    /* If a group that's operated upon by a repetition operator fails to
+       match anything, then the register for its start will need to be
+       restored because it will have been set to wherever in the string we
+       are when we last see its open-group operator.  Similarly for a
+       register's end.  */
+    const char **old_regstart, **old_regend;
+
+    /* The is_active field of reg_info helps us keep track of which (possibly
+       nested) subexpressions we are currently in. The matched_something
+       field of reg_info[reg_num] helps us tell whether or not we have
+       matched any of the pattern so far this time through the reg_num-th
+       subexpression.  These two fields get reset each time through any
+       loop their register is in.  */
+    register_info_type *reg_info;
+
+    /* The following record the register info as found in the above
+       variables when we find a match better than any we've seen before.
+       This happens as we backtrack through the failure points, which in
+       turn happens only if we have not yet matched the entire string. */
+    unsigned best_regs_set = false;
+    const char **best_regstart, **best_regend;
+
+    /* Logically, this is `best_regend[0]'.  But we don't want to have to
+       allocate space for that if we're not allocating space for anything
+       else (see below).  Also, we never need info about register 0 for
+       any of the other register vectors, and it seems rather a kludge to
+       treat `best_regend' differently than the rest.  So we keep track of
+       the end of the best match so far in a separate variable.  We
+       initialize this to NULL so that when we backtrack the first time
+       and need to test it, it's not garbage.  */
+    const char *match_end = NULL;
+
+    /* Used when we pop values we don't care about.  */
+    const char **reg_dummy;
+    register_info_type *reg_info_dummy;
+
+#ifdef DEBUG
+    /* Counts the total number of registers pushed.  */
+    unsigned num_regs_pushed = 0;
+#endif
+
+    DEBUG_PRINT1 ("\n\nEntering re_match_2.\n");
+
+    INIT_FAIL_STACK ();
+
+    /* Do not bother to initialize all the register variables if there are
+       no groups in the pattern, as it takes a fair amount of time.  If
+       there are groups, we include space for register 0 (the whole
+       pattern), even though we never use it, since it simplifies the
+       array indexing.  We should fix this.  */
+    if (bufp->re_nsub) {
+        regstart = REGEX_TALLOC (num_regs, const char *);
+        regend = REGEX_TALLOC (num_regs, const char *);
+        old_regstart = REGEX_TALLOC (num_regs, const char *);
+        old_regend = REGEX_TALLOC (num_regs, const char *);
+        best_regstart = REGEX_TALLOC (num_regs, const char *);
+        best_regend = REGEX_TALLOC (num_regs, const char *);
+        reg_info = REGEX_TALLOC (num_regs, register_info_type);
+        reg_dummy = REGEX_TALLOC (num_regs, const char *);
+        reg_info_dummy = REGEX_TALLOC (num_regs, register_info_type);
+
+        if (!(regstart && regend && old_regstart && old_regend && reg_info
+                && best_regstart && best_regend && reg_dummy && reg_info_dummy)) {
+            FREE_VARIABLES ();
+            return -2;
+        }
+    }
+#ifdef REGEX_MALLOC
+    else {
+        /* We must initialize all our variables to NULL, so that
+           `FREE_VARIABLES' doesn't try to free them.  */
+        regstart = regend = old_regstart = old_regend = best_regstart
+                                           = best_regend = reg_dummy = NULL;
+        reg_info = reg_info_dummy = (register_info_type *) NULL;
+    }
+#endif /* REGEX_MALLOC */
+
+    /* The starting position is bogus.  */
+    if (pos < 0 || pos > size1 + size2) {
+        FREE_VARIABLES ();
+        return -1;
+    }
+
+    /* Initialize subexpression text positions to -1 to mark ones that no
+       start_memory/stop_memory has been seen for. Also initialize the
+       register information struct.  */
+    for (mcnt = 1; mcnt < num_regs; mcnt++) {
+        regstart[mcnt] = regend[mcnt]
+                         = old_regstart[mcnt] = old_regend[mcnt] = REG_UNSET_VALUE;
+
+        REG_MATCH_NULL_STRING_P (reg_info[mcnt]) = MATCH_NULL_UNSET_VALUE;
+        IS_ACTIVE (reg_info[mcnt]) = 0;
+        MATCHED_SOMETHING (reg_info[mcnt]) = 0;
+        EVER_MATCHED_SOMETHING (reg_info[mcnt]) = 0;
+    }
+
+    /* We move `string1' into `string2' if the latter's empty -- but not if
+       `string1' is null.  */
+    if (size2 == 0 && string1 != NULL) {
+        string2 = string1;
+        size2 = size1;
+        string1 = 0;
+        size1 = 0;
+    }
+    end1 = string1 + size1;
+    end2 = string2 + size2;
+
+    /* Compute where to stop matching, within the two strings.  */
+    if (stop <= size1) {
+        end_match_1 = string1 + stop;
+        end_match_2 = string2;
+    } else {
+        end_match_1 = end1;
+        end_match_2 = string2 + stop - size1;
+    }
+
+    /* `p' scans through the pattern as `d' scans through the data.
+       `dend' is the end of the input string that `d' points within.  `d'
+       is advanced into the following input string whenever necessary, but
+       this happens before fetching; therefore, at the beginning of the
+       loop, `d' can be pointing at the end of a string, but it cannot
+       equal `string2'.  */
+    if (size1 > 0 && pos <= size1) {
+        d = string1 + pos;
+        dend = end_match_1;
+    } else {
+        d = string2 + pos - size1;
+        dend = end_match_2;
+    }
+
+    DEBUG_PRINT1 ("The compiled pattern is: ");
+    DEBUG_PRINT_COMPILED_PATTERN (bufp, p, pend);
+    DEBUG_PRINT1 ("The string to match is: `");
+    DEBUG_PRINT_DOUBLE_STRING (d, string1, size1, string2, size2);
+    DEBUG_PRINT1 ("'\n");
+
+    /* This loops over pattern commands.  It exits by returning from the
+       function if the match is complete, or it drops through if the match
+       fails at this starting point in the input data.  */
+    for (;;) {
+        DEBUG_PRINT2 ("\n0x%x: ", p);
+
+        if (p == pend) {
+            /* End of pattern means we might have succeeded.  */
+            DEBUG_PRINT1 ("end of pattern ... ");
+
+            /* If we haven't matched the entire string, and we want the
+                   longest match, try backtracking.  */
+            if (d != end_match_2) {
+                DEBUG_PRINT1 ("backtracking.\n");
+
+                if (!FAIL_STACK_EMPTY ()) {
+                    /* More failure points to try.  */
+                    boolean same_str_p = (FIRST_STRING_P (match_end)
+                                          == MATCHING_IN_FIRST_STRING);
+
+                    /* If exceeds best match so far, save it.  */
+                    if (!best_regs_set
+                            || (same_str_p && d > match_end)
+                            || (!same_str_p && !MATCHING_IN_FIRST_STRING)) {
+                        best_regs_set = true;
+                        match_end = d;
+
+                        DEBUG_PRINT1 ("\nSAVING match as best so far.\n");
+
+                        for (mcnt = 1; mcnt < num_regs; mcnt++) {
+                            best_regstart[mcnt] = regstart[mcnt];
+                            best_regend[mcnt] = regend[mcnt];
+                        }
+                    }
+                    goto fail;
+                }
+
+                /* If no failure points, don't restore garbage.  */
+                else if (best_regs_set) {
+restore_best_regs:
+                    /* Restore best match.  It may happen that `dend ==
+                       end_match_1' while the restored d is in string2.
+                       For example, the pattern `x.*y.*z' against the
+                       strings `x-' and `y-z-', if the two strings are
+                       not consecutive in memory.  */
+                    DEBUG_PRINT1 ("Restoring best registers.\n");
+
+                    d = match_end;
+                    dend = ((d >= string1 && d <= end1)
+                            ? end_match_1 : end_match_2);
+
+                    for (mcnt = 1; mcnt < num_regs; mcnt++) {
+                        regstart[mcnt] = best_regstart[mcnt];
+                        regend[mcnt] = best_regend[mcnt];
+                    }
+                }
+            } /* d != end_match_2 */
+
+            DEBUG_PRINT1 ("Accepting match.\n");
+
+            /* If caller wants register contents data back, do it.  */
+            if (regs && !bufp->no_sub) {
+                /* Have the register data arrays been allocated?  */
+                if (bufp->regs_allocated == REGS_UNALLOCATED) {
+                    /* No.  So allocate them with malloc.  We need one
+                       extra element beyond `num_regs' for the `-1' marker
+                       GNU code uses.  */
+                    regs->num_regs = MAX (RE_NREGS, num_regs + 1);
+                    regs->start = TALLOC (regs->num_regs, regoff_t);
+                    regs->end = TALLOC (regs->num_regs, regoff_t);
+                    if (regs->start == NULL || regs->end == NULL) {
+                        return -2;
+                    }
+                    bufp->regs_allocated = REGS_REALLOCATE;
+                } else if (bufp->regs_allocated == REGS_REALLOCATE) {
+                    /* Yes.  If we need more elements than were already
+                       allocated, reallocate them.  If we need fewer, just
+                       leave it alone.  */
+                    if (regs->num_regs < num_regs + 1) {
+                        regs->num_regs = num_regs + 1;
+                        RETALLOC (regs->start, regs->num_regs, regoff_t);
+                        RETALLOC (regs->end, regs->num_regs, regoff_t);
+                        if (regs->start == NULL || regs->end == NULL) {
+                            return -2;
+                        }
+                    }
+                } else {
+                    assert (bufp->regs_allocated == REGS_FIXED);
+                }
+
+                /* Convert the pointer data in `regstart' and `regend' to
+                   indices.  Register zero has to be set differently,
+                   since we haven't kept track of any info for it.  */
+                if (regs->num_regs > 0) {
+                    regs->start[0] = pos;
+                    regs->end[0] = (MATCHING_IN_FIRST_STRING ? d - string1
+                                    : d - string2 + size1);
+                }
+
+                /* Go through the first `min (num_regs, regs->num_regs)'
+                   registers, since that is all we initialized.  */
+                for (mcnt = 1; mcnt < MIN (num_regs, regs->num_regs); mcnt++) {
+                    if (REG_UNSET (regstart[mcnt]) || REG_UNSET (regend[mcnt])) {
+                        regs->start[mcnt] = regs->end[mcnt] = -1;
+                    } else {
+                        regs->start[mcnt] = POINTER_TO_OFFSET (regstart[mcnt]);
+                        regs->end[mcnt] = POINTER_TO_OFFSET (regend[mcnt]);
+                    }
+                }
+
+                /* If the regs structure we return has more elements than
+                   were in the pattern, set the extra elements to -1.  If
+                   we (re)allocated the registers, this is the case,
+                   because we always allocate enough to have at least one
+                   -1 at the end.  */
+                for (mcnt = num_regs; mcnt < regs->num_regs; mcnt++) {
+                    regs->start[mcnt] = regs->end[mcnt] = -1;
+                }
+            } /* regs && !bufp->no_sub */
+
+            FREE_VARIABLES ();
+            DEBUG_PRINT4 ("%u failure points pushed, %u popped (%u remain).\n",
+                          nfailure_points_pushed, nfailure_points_popped,
+                          nfailure_points_pushed - nfailure_points_popped);
+            DEBUG_PRINT2 ("%u registers pushed.\n", num_regs_pushed);
+
+            mcnt = d - pos - (MATCHING_IN_FIRST_STRING
+                              ? string1
+                              : string2 - size1);
+
+            DEBUG_PRINT2 ("Returning %d from re_match_2.\n", mcnt);
+
+            return mcnt;
+        }
+
+        /* Otherwise match next pattern command.  */
+#ifdef SWITCH_ENUM_BUG
+        switch ((int) ((re_opcode_t) *p++))
+#else
+        switch ((re_opcode_t) *p++)
+#endif
+        {
+            /* Ignore these.  Used to ignore the n of succeed_n's which
+               currently have n == 0.  */
+        case no_op:
+            DEBUG_PRINT1 ("EXECUTING no_op.\n");
+            break;
+
+
+            /* Match the next n pattern characters exactly.  The following
+               byte in the pattern defines n, and the n bytes after that
+               are the characters to match.  */
+        case exactn:
+            mcnt = *p++;
+            DEBUG_PRINT2 ("EXECUTING exactn %d.\n", mcnt);
+
+            /* This is written out as an if-else so we don't waste time
+               testing `translate' inside the loop.  */
+            if (translate) {
+                do {
+                    PREFETCH ();
+                    if (translate[(unsigned char) *d++] != (char) *p++) {
+                        goto fail;
+                    }
+                } while (--mcnt);
+            } else {
+                do {
+                    PREFETCH ();
+                    if (*d++ != (char) *p++) {
+                        goto fail;
+                    }
+                } while (--mcnt);
+            }
+            SET_REGS_MATCHED ();
+            break;
+
+
+            /* Match any character except possibly a newline or a null.  */
+        case anychar:
+            DEBUG_PRINT1 ("EXECUTING anychar.\n");
+
+            PREFETCH ();
+
+            if ((!(bufp->syntax & RE_DOT_NEWLINE) && TRANSLATE (*d) == '\n')
+                    || (bufp->syntax & RE_DOT_NOT_NULL && TRANSLATE (*d) == '\000')) {
+                goto fail;
+            }
+
+            SET_REGS_MATCHED ();
+            DEBUG_PRINT2 ("  Matched `%d'.\n", *d);
+            d++;
+            break;
+
+
+        case charset:
+        case charset_not: {
+            register unsigned char c;
+            boolean not_ = (re_opcode_t) *(p - 1) == charset_not;
+
+            DEBUG_PRINT2 ("EXECUTING charset%s.\n", not_ ? "_not" : "");
+
+            PREFETCH ();
+            c = TRANSLATE (*d); /* The character to match.  */
+
+            /* Cast to `unsigned' instead of `unsigned char' in case the
+               bit list is a full 32 bytes long.  */
+            if (c < (unsigned) (*p * BYTEWIDTH)
+                    && p[1 + c / BYTEWIDTH] & (1 << (c % BYTEWIDTH))) {
+                not_ = !not_;
+            }
+
+            p += 1 + *p;
+
+            if (!not_) {
+                goto fail;
+            }
+
+            SET_REGS_MATCHED ();
+            d++;
+            break;
+        }
+
+
+        /* The beginning of a group is represented by start_memory.
+           The arguments are the register number in the next byte, and the
+           number of groups inner to this one in the next.  The text
+           matched within the group is recorded (in the internal
+           registers data structure) under the register number.  */
+        case start_memory:
+            DEBUG_PRINT3 ("EXECUTING start_memory %d (%d):\n", *p, p[1]);
+
+            /* Find out if this group can match the empty string.  */
+            p1 = p;     /* To send to group_match_null_string_p.  */
+
+            if (REG_MATCH_NULL_STRING_P (reg_info[*p]) == MATCH_NULL_UNSET_VALUE)
+                REG_MATCH_NULL_STRING_P (reg_info[*p])
+                    = group_match_null_string_p (&p1, pend, reg_info);
+
+            /* Save the position in the string where we were the last time
+               we were at this open-group operator in case the group is
+               operated upon by a repetition operator, e.g., with `(a*)*b'
+               against `ab'; then we want to ignore where we are now in
+               the string in case this attempt to match fails.  */
+            old_regstart[*p] = REG_MATCH_NULL_STRING_P (reg_info[*p])
+                               ? REG_UNSET (regstart[*p]) ? d : regstart[*p]
+                   : regstart[*p];
+            DEBUG_PRINT2 ("  old_regstart: %d\n",
+                          POINTER_TO_OFFSET (old_regstart[*p]));
+
+            regstart[*p] = d;
+            DEBUG_PRINT2 ("  regstart: %d\n", POINTER_TO_OFFSET (regstart[*p]));
+
+            IS_ACTIVE (reg_info[*p]) = 1;
+            MATCHED_SOMETHING (reg_info[*p]) = 0;
+
+            /* This is the new highest active register.  */
+            highest_active_reg = *p;
+
+            /* If nothing was active before, this is the new lowest active
+               register.  */
+            if (lowest_active_reg == NO_LOWEST_ACTIVE_REG) {
+                lowest_active_reg = *p;
+            }
+
+            /* Move past the register number and inner group count.  */
+            p += 2;
+            break;
+
+
+            /* The stop_memory opcode represents the end of a group.  Its
+               arguments are the same as start_memory's: the register
+               number, and the number of inner groups.  */
+        case stop_memory:
+            DEBUG_PRINT3 ("EXECUTING stop_memory %d (%d):\n", *p, p[1]);
+
+            /* We need to save the string position the last time we were at
+               this close-group operator in case the group is operated
+               upon by a repetition operator, e.g., with `((a*)*(b*)*)*'
+               against `aba'; then we want to ignore where we are now in
+               the string in case this attempt to match fails.  */
+            old_regend[*p] = REG_MATCH_NULL_STRING_P (reg_info[*p])
+                             ? REG_UNSET (regend[*p]) ? d : regend[*p]
+                 : regend[*p];
+            DEBUG_PRINT2 ("      old_regend: %d\n",
+                          POINTER_TO_OFFSET (old_regend[*p]));
+
+            regend[*p] = d;
+            DEBUG_PRINT2 ("      regend: %d\n", POINTER_TO_OFFSET (regend[*p]));
+
+            /* This register isn't active anymore.  */
+            IS_ACTIVE (reg_info[*p]) = 0;
+
+            /* If this was the only register active, nothing is active
+               anymore.  */
+            if (lowest_active_reg == highest_active_reg) {
+                lowest_active_reg = NO_LOWEST_ACTIVE_REG;
+                highest_active_reg = NO_HIGHEST_ACTIVE_REG;
+            } else {
+                /* We must scan for the new highest active register, since
+                   it isn't necessarily one less than now: consider
+                   (a(b)c(d(e)f)g).  When group 3 ends, after the f), the
+                   new highest active register is 1.  */
+                unsigned char r = *p - 1;
+                while (r > 0 && !IS_ACTIVE (reg_info[r])) {
+                    r--;
+                }
+
+                /* If we end up at register zero, that means that we saved
+                   the registers as the result of an `on_failure_jump', not
+                   a `start_memory', and we jumped to past the innermost
+                   `stop_memory'.  For example, in ((.)*) we save
+                   registers 1 and 2 as a result of the *, but when we pop
+                   back to the second ), we are at the stop_memory 1.
+                   Thus, nothing is active.  */
+                if (r == 0) {
+                    lowest_active_reg = NO_LOWEST_ACTIVE_REG;
+                    highest_active_reg = NO_HIGHEST_ACTIVE_REG;
+                } else {
+                    highest_active_reg = r;
+                }
+            }
+
+            /* If just failed to match something this time around with a
+               group that's operated on by a repetition operator, try to
+               force exit from the ``loop'', and restore the register
+               information for this group that we had before trying this
+               last match.  */
+            if ((!MATCHED_SOMETHING (reg_info[*p])
+                    || (re_opcode_t) p[-3] == start_memory)
+                    && (p + 2) < pend) {
+                boolean is_a_jump_n = false;
+
+                p1 = p + 2;
+                mcnt = 0;
+                switch ((re_opcode_t) *p1++) {
+                case jump_n:
+                    is_a_jump_n = true;
+                case pop_failure_jump:
+                case maybe_pop_jump:
+                case jump:
+                case dummy_failure_jump:
+                    EXTRACT_NUMBER_AND_INCR (mcnt, p1);
+                    if (is_a_jump_n) {
+                        p1 += 2;
+                    }
+                    break;
+
+                default:
+                    /* do nothing */
+                    ;
+                }
+                p1 += mcnt;
+
+                /* If the next operation is a jump backwards in the pattern
+                to an on_failure_jump right before the start_memory
+                   corresponding to this stop_memory, exit from the loop
+                   by forcing a failure after pushing on the stack the
+                   on_failure_jump's jump in the pattern, and d.  */
+                if (mcnt < 0 && (re_opcode_t) *p1 == on_failure_jump
+                        && (re_opcode_t) p1[3] == start_memory && p1[4] == *p) {
+                    /* If this group ever matched anything, then restore
+                       what its registers were before trying this last
+                       failed match, e.g., with `(a*)*b' against `ab' for
+                       regstart[1], and, e.g., with `((a*)*(b*)*)*'
+                       against `aba' for regend[3].
+
+                       Also restore the registers for inner groups for,
+                       e.g., `((a*)(b*))*' against `aba' (register 3 would
+                       otherwise get trashed).  */
+
+                    if (EVER_MATCHED_SOMETHING (reg_info[*p])) {
+                        unsigned r;
+
+                        EVER_MATCHED_SOMETHING (reg_info[*p]) = 0;
+
+                        /* Restore this and inner groups' (if any) registers.  */
+                        for (r = *p; r < *p + *(p + 1); r++) {
+                            regstart[r] = old_regstart[r];
+
+                            /* xx why this test?  */
+#ifdef __HYPHY_64__
+                            if ((long) old_regend[r] >= (long) regstart[r])
+#else
+                            if ((int) old_regend[r] >= (int) regstart[r])
+#endif
+                                regend[r] = old_regend[r];
+                        }
+                    }
+                    p1++;
+                    EXTRACT_NUMBER_AND_INCR (mcnt, p1);
+                    PUSH_FAILURE_POINT (p1 + mcnt, d, -2);
+
+                    goto fail;
+                }
+            }
+
+            /* Move past the register number and the inner group count.  */
+            p += 2;
+            break;
+
+
+            /* \<digit> has been turned into a `duplicate' command which is
+                   followed by the numeric value of <digit> as the register number.  */
+        case duplicate: {
+            register const char *d2, *dend2;
+            int regno = *p++;   /* Get which register to match against.  */
+            DEBUG_PRINT2 ("EXECUTING duplicate %d.\n", regno);
+
+            /* Can't back reference a group which we've never matched.  */
+            if (REG_UNSET (regstart[regno]) || REG_UNSET (regend[regno])) {
+                goto fail;
+            }
+
+            /* Where in input to try to start matching.  */
+            d2 = regstart[regno];
+
+            /* Where to stop matching; if both the place to start and
+               the place to stop matching are in the same string, then
+               set to the place to stop, otherwise, for now have to use
+               the end of the first string.  */
+
+            dend2 = ((FIRST_STRING_P (regstart[regno])
+                      == FIRST_STRING_P (regend[regno]))
+                     ? regend[regno] : end_match_1);
+            for (;;) {
+                /* If necessary, advance to next segment in register
+                           contents.  */
+                while (d2 == dend2) {
+                    if (dend2 == end_match_2) {
+                        break;
+                    }
+                    if (dend2 == regend[regno]) {
+                        break;
+                    }
+
+                    /* End of string1 => advance to string2. */
+                    d2 = string2;
+                    dend2 = regend[regno];
+                }
+                /* At end of register contents => success */
+                if (d2 == dend2) {
+                    break;
+                }
+
+                /* If necessary, advance to next segment in data.  */
+                PREFETCH ();
+
+                /* How many characters left in this segment to match.  */
+                mcnt = dend - d;
+
+                /* Want how many consecutive characters we can match in
+                           one shot, so, if necessary, adjust the count.  */
+                if (mcnt > dend2 - d2) {
+                    mcnt = dend2 - d2;
+                }
+
+                /* Compare that many; failure if mismatch, else move
+                           past them.  */
+                if (translate
+                        ? bcmp_translate ((unsigned char*)d, (unsigned char*)d2, mcnt, translate)
+                        : bcmp (d, d2, mcnt)) {
+                    goto fail;
+                }
+                d += mcnt, d2 += mcnt;
+            }
+        }
+        break;
+
+
+        /* begline matches the empty string at the beginning of the string
+           (unless `not_bol' is set in `bufp'), and, if
+           `newline_anchor' is set, after newlines.  */
+        case begline:
+            DEBUG_PRINT1 ("EXECUTING begline.\n");
+
+            if (AT_STRINGS_BEG (d)) {
+                if (!bufp->not_bol) {
+                    break;
+                }
+            } else if (d[-1] == '\n' && bufp->newline_anchor) {
+                break;
+            }
+            /* In all other cases, we fail.  */
+            goto fail;
+
+
+            /* endline is the dual of begline.  */
+        case endline:
+            DEBUG_PRINT1 ("EXECUTING endline.\n");
+
+            if (AT_STRINGS_END (d)) {
+                if (!bufp->not_eol) {
+                    break;
+                }
+            }
+
+            /* We have to ``prefetch'' the next character.  */
+            else if ((d == end1 ? *string2 : *d) == '\n'
+                     && bufp->newline_anchor) {
+                break;
+            }
+            goto fail;
+
+
+            /* Match at the very beginning of the data.  */
+        case begbuf:
+            DEBUG_PRINT1 ("EXECUTING begbuf.\n");
+            if (AT_STRINGS_BEG (d)) {
+                break;
+            }
+            goto fail;
+
+
+            /* Match at the very end of the data.  */
+        case endbuf:
+            DEBUG_PRINT1 ("EXECUTING endbuf.\n");
+            if (AT_STRINGS_END (d)) {
+                break;
+            }
+            goto fail;
+
+
+            /* on_failure_keep_string_jump is used to optimize `.*\n'.  It
+               pushes NULL as the value for the string on the stack.  Then
+               `pop_failure_point' will keep the current value for the
+               string, instead of restoring it.  To see why, consider
+               matching `foo\nbar' against `.*\n'.  The .* matches the foo;
+               then the . fails against the \n.  But the next thing we want
+               to do is match the \n against the \n; if we restored the
+               string value, we would be back at the foo.
+
+               Because this is used only in specific cases, we don't need to
+               check all the things that `on_failure_jump' does, to make
+               sure the right things get saved on the stack.  Hence we don't
+               share its code.  The only reason to push anything on the
+               stack at all is that otherwise we would have to change
+               `anychar's code to do something besides goto fail in this
+               case; that seems worse than this.  */
+        case on_failure_keep_string_jump:
+            DEBUG_PRINT1 ("EXECUTING on_failure_keep_string_jump");
+
+            EXTRACT_NUMBER_AND_INCR (mcnt, p);
+            DEBUG_PRINT3 (" %d (to 0x%x):\n", mcnt, p + mcnt);
+
+            PUSH_FAILURE_POINT (p + mcnt, NULL, -2);
+            break;
+
+
+            /* Uses of on_failure_jump:
+
+                   Each alternative starts with an on_failure_jump that points
+                   to the beginning of the next alternative.  Each alternative
+                   except the last ends with a jump that in effect jumps past
+                   the rest of the alternatives.  (They really jump to the
+                   ending jump of the following alternative, because tensioning
+                   these jumps is a hassle.)
+
+                   Repeats start with an on_failure_jump that points past both
+                   the repetition text and either the following jump or
+                   pop_failure_jump back to this on_failure_jump.  */
+        case on_failure_jump:
+on_failure:
+            DEBUG_PRINT1 ("EXECUTING on_failure_jump");
+
+            EXTRACT_NUMBER_AND_INCR (mcnt, p);
+            DEBUG_PRINT3 (" %d (to 0x%x)", mcnt, p + mcnt);
+
+            /* If this on_failure_jump comes right before a group (i.e.,
+               the original * applied to a group), save the information
+               for that group and all inner ones, so that if we fail back
+               to this point, the group's information will be correct.
+               For example, in \(a*\)*\1, we need the preceding group,
+               and in \(\(a*\)b*\)\2, we need the inner group.  */
+
+            /* We can't use `p' to check ahead because we push
+               a failure point to `p + mcnt' after we do this.  */
+            p1 = p;
+
+            /* We need to skip no_op's before we look for the
+               start_memory in case this on_failure_jump is happening as
+               the result of a completed succeed_n, as in \(a\)\{1,3\}b\1
+               against aba.  */
+            while (p1 < pend && (re_opcode_t) *p1 == no_op) {
+                p1++;
+            }
+
+            if (p1 < pend && (re_opcode_t) *p1 == start_memory) {
+                /* We have a new highest active register now.  This will
+                   get reset at the start_memory we are about to get to,
+                   but we will have saved all the registers relevant to
+                   this repetition op, as described above.  */
+                highest_active_reg = *(p1 + 1) + *(p1 + 2);
+                if (lowest_active_reg == NO_LOWEST_ACTIVE_REG) {
+                    lowest_active_reg = *(p1 + 1);
+                }
+            }
+
+            DEBUG_PRINT1 (":\n");
+            PUSH_FAILURE_POINT (p + mcnt, d, -2);
+            break;
+
+
+            /* A smart repeat ends with `maybe_pop_jump'.
+            We change it to either `pop_failure_jump' or `jump'.  */
+        case maybe_pop_jump:
+            EXTRACT_NUMBER_AND_INCR (mcnt, p);
+            DEBUG_PRINT2 ("EXECUTING maybe_pop_jump %d.\n", mcnt);
+            {
+                register unsigned char *p2 = p;
+
+                /* Compare the beginning of the repeat with what in the
+                   pattern follows its end. If we can establish that there
+                   is nothing that they would both match, i.e., that we
+                   would have to backtrack because of (as in, e.g., `a*a')
+                   then we can change to pop_failure_jump, because we'll
+                   never have to backtrack.
+
+                   This is not true in the case of alternatives: in
+                   `(a|ab)*' we do need to backtrack to the `ab' alternative
+                   (e.g., if the string was `ab').  But instead of trying to
+                   detect that here, the alternative has put on a dummy
+                   failure point which is what we will end up popping.  */
+
+                /* Skip over open/close-group commands.  */
+                while (p2 + 2 < pend
+                        && ((re_opcode_t) *p2 == stop_memory
+                            || (re_opcode_t) *p2 == start_memory)) {
+                    p2 += 3;    /* Skip over args, too.  */
+                }
+
+                /* If we're at the end of the pattern, we can change.  */
+                if (p2 == pend) {
+                    /* Consider what happens when matching ":\(.*\)"
+                       against ":/".  I don't really understand this code
+                       yet.  */
+                    p[-3] = (unsigned char) pop_failure_jump;
+                    DEBUG_PRINT1
+                    ("  End of pattern: change to `pop_failure_jump'.\n");
+                }
+
+                else if ((re_opcode_t) *p2 == exactn
+                         || (bufp->newline_anchor && (re_opcode_t) *p2 == endline)) {
+                    register unsigned char c
+                        = *p2 == (unsigned char) endline ? '\n' : p2[2];
+                    p1 = p + mcnt;
+
+                    /* p1[0] ... p1[2] are the `on_failure_jump' corresponding
+                       to the `maybe_finalize_jump' of this case.  Examine what
+                       follows.  */
+                    if ((re_opcode_t) p1[3] == exactn && p1[5] != c) {
+                        p[-3] = (unsigned char) pop_failure_jump;
+                        DEBUG_PRINT3 ("  %c != %c => pop_failure_jump.\n",
+                                      c, p1[5]);
+                    }
+
+                    else if ((re_opcode_t) p1[3] == charset
+                             || (re_opcode_t) p1[3] == charset_not) {
+                        int not_ = (re_opcode_t) p1[3] == charset_not;
+
+                        if (c < (unsigned char) (p1[4] * BYTEWIDTH)
+                                && p1[5 + c / BYTEWIDTH] & (1 << (c % BYTEWIDTH))) {
+                            not_ = !not_;
+                        }
+
+                        /* `not' is equal to 1 if c would match, which means
+                            that we can't change to pop_failure_jump.  */
+                        if (!not_) {
+                            p[-3] = (unsigned char) pop_failure_jump;
+                            DEBUG_PRINT1 ("  No match => pop_failure_jump.\n");
+                        }
+                    }
+                }
+            }
+            p -= 2;     /* Point at relative address again.  */
+            if ((re_opcode_t) p[-1] != pop_failure_jump) {
+                p[-1] = (unsigned char) jump;
+                DEBUG_PRINT1 ("  Match => jump.\n");
+                goto unconditional_jump;
+            }
+            /* Note fall through.  */
+
+
+            /* The end of a simple repeat has a pop_failure_jump back to
+                   its matching on_failure_jump, where the latter will push a
+                   failure point.  The pop_failure_jump takes off failure
+                   points put on by this pop_failure_jump's matching
+                   on_failure_jump; we got through the pattern to here from the
+                   matching on_failure_jump, so didn't fail.  */
+        case pop_failure_jump: {
+            /* We need to pass separate storage for the lowest and
+               highest registers, even though we don't care about the
+               actual values.  Otherwise, we will restore only one
+               register from the stack, since lowest will == highest in
+               `pop_failure_point'.  */
+            unsigned dummy_low_reg, dummy_high_reg;
+            unsigned char *pdummy;
+            const char *sdummy;
+
+            DEBUG_PRINT1 ("EXECUTING pop_failure_jump.\n");
+            POP_FAILURE_POINT (sdummy, pdummy,
+                               dummy_low_reg, dummy_high_reg,
+                               reg_dummy, reg_dummy, reg_info_dummy);
+        }
+        /* Note fall through.  */
+
+
+        /* Unconditionally jump (without popping any failure points).  */
+        case jump:
+unconditional_jump:
+            EXTRACT_NUMBER_AND_INCR (mcnt, p);  /* Get the amount to jump.  */
+            DEBUG_PRINT2 ("EXECUTING jump %d ", mcnt);
+            p += mcnt;              /* Do the jump.  */
+            DEBUG_PRINT2 ("(to 0x%x).\n", p);
+            break;
+
+
+            /* We need this opcode so we can detect where alternatives end
+               in `group_match_null_string_p' et al.  */
+        case jump_past_alt:
+            DEBUG_PRINT1 ("EXECUTING jump_past_alt.\n");
+            goto unconditional_jump;
+
+
+            /* Normally, the on_failure_jump pushes a failure point, which
+               then gets popped at pop_failure_jump.  We will end up at
+               pop_failure_jump, also, and with a pattern of, say, `a+', we
+               are skipping over the on_failure_jump, so we have to push
+               something meaningless for pop_failure_jump to pop.  */
+        case dummy_failure_jump:
+            DEBUG_PRINT1 ("EXECUTING dummy_failure_jump.\n");
+            /* It doesn't matter what we push for the string here.  What
+               the code at `fail' tests is the value for the pattern.  */
+            PUSH_FAILURE_POINT (0, 0, -2);
+            goto unconditional_jump;
+
+
+            /* At the end of an alternative, we need to push a dummy failure
+               point in case we are followed by a `pop_failure_jump', because
+               we don't want the failure point for the alternative to be
+               popped.  For example, matching `(a|ab)*' against `aab'
+               requires that we match the `ab' alternative.  */
+        case push_dummy_failure:
+            DEBUG_PRINT1 ("EXECUTING push_dummy_failure.\n");
+            /* See comments just above at `dummy_failure_jump' about the
+               two zeroes.  */
+            PUSH_FAILURE_POINT (0, 0, -2);
+            break;
+
+            /* Have to succeed matching what follows at least n times.
+               After that, handle like `on_failure_jump'.  */
+        case succeed_n:
+            EXTRACT_NUMBER (mcnt, p + 2);
+            DEBUG_PRINT2 ("EXECUTING succeed_n %d.\n", mcnt);
+
+            assert (mcnt >= 0);
+            /* Originally, this is how many times we HAVE to succeed.  */
+            if (mcnt > 0) {
+                mcnt--;
+                p += 2;
+                STORE_NUMBER_AND_INCR (p, mcnt);
+                DEBUG_PRINT3 ("  Setting 0x%x to %d.\n", p, mcnt);
+            } else if (mcnt == 0) {
+                DEBUG_PRINT2 ("  Setting two bytes from 0x%x to no_op.\n", p+2);
+                p[2] = (unsigned char) no_op;
+                p[3] = (unsigned char) no_op;
+                goto on_failure;
+            }
+            break;
+
+        case jump_n:
+            EXTRACT_NUMBER (mcnt, p + 2);
+            DEBUG_PRINT2 ("EXECUTING jump_n %d.\n", mcnt);
+
+            /* Originally, this is how many times we CAN jump.  */
+            if (mcnt) {
+                mcnt--;
+                STORE_NUMBER (p + 2, mcnt);
+                goto unconditional_jump;
+            }
+            /* If don't have to jump any more, skip over the rest of command.  */
+            else {
+                p += 4;
+            }
+            break;
+
+        case set_number_at: {
+            DEBUG_PRINT1 ("EXECUTING set_number_at.\n");
+
+            EXTRACT_NUMBER_AND_INCR (mcnt, p);
+            p1 = p + mcnt;
+            EXTRACT_NUMBER_AND_INCR (mcnt, p);
+            DEBUG_PRINT3 ("  Setting 0x%x to %d.\n", p1, mcnt);
+            STORE_NUMBER (p1, mcnt);
+            break;
+        }
+
+        case wordbound:
+            DEBUG_PRINT1 ("EXECUTING wordbound.\n");
+            if (AT_WORD_BOUNDARY (d)) {
+                break;
+            }
+            goto fail;
+
+        case notwordbound:
+            DEBUG_PRINT1 ("EXECUTING notwordbound.\n");
+            if (AT_WORD_BOUNDARY (d)) {
+                goto fail;
+            }
+            break;
+
+        case wordbeg:
+            DEBUG_PRINT1 ("EXECUTING wordbeg.\n");
+            if (WORDCHAR_P (d) && (AT_STRINGS_BEG (d) || !WORDCHAR_P (d - 1))) {
+                break;
+            }
+            goto fail;
+
+        case wordend:
+            DEBUG_PRINT1 ("EXECUTING wordend.\n");
+            if (!AT_STRINGS_BEG (d) && WORDCHAR_P (d - 1)
+                    && (!WORDCHAR_P (d) || AT_STRINGS_END (d))) {
+                break;
+            }
+            goto fail;
+
+#ifdef emacs
+#ifdef emacs19
+        case before_dot:
+            DEBUG_PRINT1 ("EXECUTING before_dot.\n");
+            if (PTR_CHAR_POS ((unsigned char *) d) >= point) {
+                goto fail;
+            }
+            break;
+
+        case at_dot:
+            DEBUG_PRINT1 ("EXECUTING at_dot.\n");
+            if (PTR_CHAR_POS ((unsigned char *) d) != point) {
+                goto fail;
+            }
+            break;
+
+        case after_dot:
+            DEBUG_PRINT1 ("EXECUTING after_dot.\n");
+            if (PTR_CHAR_POS ((unsigned char *) d) <= point) {
+                goto fail;
+            }
+            break;
+#else /* not emacs19 */
+        case at_dot:
+            DEBUG_PRINT1 ("EXECUTING at_dot.\n");
+            if (PTR_CHAR_POS ((unsigned char *) d) + 1 != point) {
+                goto fail;
+            }
+            break;
+#endif /* not emacs19 */
+
+        case syntaxspec:
+            DEBUG_PRINT2 ("EXECUTING syntaxspec %d.\n", mcnt);
+            mcnt = *p++;
+            goto matchsyntax;
+
+        case wordchar:
+            DEBUG_PRINT1 ("EXECUTING Emacs wordchar.\n");
+            mcnt = (int) Sword;
+matchsyntax:
+            PREFETCH ();
+            if (SYNTAX (*d++) != (enum syntaxcode) mcnt) {
+                goto fail;
+            }
+            SET_REGS_MATCHED ();
+            break;
+
+        case notsyntaxspec:
+            DEBUG_PRINT2 ("EXECUTING notsyntaxspec %d.\n", mcnt);
+            mcnt = *p++;
+            goto matchnotsyntax;
+
+        case notwordchar:
+            DEBUG_PRINT1 ("EXECUTING Emacs notwordchar.\n");
+            mcnt = (int) Sword;
+matchnotsyntax:
+            PREFETCH ();
+            if (SYNTAX (*d++) == (enum syntaxcode) mcnt) {
+                goto fail;
+            }
+            SET_REGS_MATCHED ();
+            break;
+
+#else /* not emacs */
+        case wordchar:
+            DEBUG_PRINT1 ("EXECUTING non-Emacs wordchar.\n");
+            PREFETCH ();
+            if (!WORDCHAR_P (d)) {
+                goto fail;
+            }
+            SET_REGS_MATCHED ();
+            d++;
+            break;
+
+        case notwordchar:
+            DEBUG_PRINT1 ("EXECUTING non-Emacs notwordchar.\n");
+            PREFETCH ();
+            if (WORDCHAR_P (d)) {
+                goto fail;
+            }
+            SET_REGS_MATCHED ();
+            d++;
+            break;
+#endif /* not emacs */
+
+        default:
+            abort ();
+        }
+        continue;  /* Successfully executed one pattern command; keep going.  */
+
+
+        /* We goto here if a matching operation fails. */
+fail:
+        if (!FAIL_STACK_EMPTY ()) {
+            /* A restart point is known.  Restore to that state.  */
+            DEBUG_PRINT1 ("\nFAIL:\n");
+            POP_FAILURE_POINT (d, p,
+                               lowest_active_reg, highest_active_reg,
+                               regstart, regend, reg_info);
+
+            /* If this failure point is a dummy, try the next one.  */
+            if (!p) {
+                goto fail;
+            }
+
+            /* If we failed to the end of the pattern, don't examine *p.  */
+            assert (p <= pend);
+            if (p < pend) {
+                boolean is_a_jump_n = false;
+
+                /* If failed to a backwards jump that's part of a repetition
+                   loop, need to pop this failure point and use the next one.  */
+                switch ((re_opcode_t) *p) {
+                case jump_n:
+                    is_a_jump_n = true;
+                case maybe_pop_jump:
+                case pop_failure_jump:
+                case jump:
+                    p1 = p + 1;
+                    EXTRACT_NUMBER_AND_INCR (mcnt, p1);
+                    p1 += mcnt;
+
+                    if ((is_a_jump_n && (re_opcode_t) *p1 == succeed_n)
+                            || (!is_a_jump_n
+                                && (re_opcode_t) *p1 == on_failure_jump)) {
+                        goto fail;
+                    }
+                    break;
+                default:
+                    /* do nothing */
+                    ;
+                }
+            }
+
+            if (d >= string1 && d <= end1) {
+                dend = end_match_1;
+            }
+        } else {
+            break;    /* Matching at this starting point really fails.  */
+        }
+    } /* for (;;) */
+
+    if (best_regs_set) {
+        goto restore_best_regs;
+    }
+
+    FREE_VARIABLES ();
+
+    return -1;                  /* Failure to match.  */
+} /* re_match_2 */
+

+/* Subroutine definitions for re_match_2.  */
+
+
+/* We are passed P pointing to a register number after a start_memory.
+
+   Return true if the pattern up to the corresponding stop_memory can
+   match the empty string, and false otherwise.
+
+   If we find the matching stop_memory, sets P to point to one past its number.
+   Otherwise, sets P to an undefined byte less than or equal to END.
+
+   We don't handle duplicates properly (yet).  */
+
+static boolean
+group_match_null_string_p (
+    unsigned char **p, unsigned char *end,
+    register_info_type *reg_info)
+{
+    int mcnt;
+    /* Point to after the args to the start_memory.  */
+    unsigned char *p1 = *p + 2;
+
+    while (p1 < end) {
+        /* Skip over opcodes that can match nothing, and return true or
+        false, as appropriate, when we get to one that can't, or to the
+               matching stop_memory.  */
+
+        switch ((re_opcode_t) *p1) {
+            /* Could be either a loop or a series of alternatives.  */
+        case on_failure_jump:
+            p1++;
+            EXTRACT_NUMBER_AND_INCR (mcnt, p1);
+
+            /* If the next operation is not a jump backwards in the
+            pattern.  */
+
+            if (mcnt >= 0) {
+                /* Go through the on_failure_jumps of the alternatives,
+                   seeing if any of the alternatives cannot match nothing.
+                   The last alternative starts with only a jump,
+                   whereas the rest start with on_failure_jump and end
+                   with a jump, e.g., here is the pattern for `a|b|c':
+
+                   /on_failure_jump/0/6/exactn/1/a/jump_past_alt/0/6
+                   /on_failure_jump/0/6/exactn/1/b/jump_past_alt/0/3
+                   /exactn/1/c
+
+                   So, we have to first go through the first (n-1)
+                   alternatives and then deal with the last one separately.  */
+
+
+                /* Deal with the first (n-1) alternatives, which start
+                   with an on_failure_jump (see above) that jumps to right
+                   past a jump_past_alt.  */
+
+                while ((re_opcode_t) p1[mcnt-3] == jump_past_alt) {
+                    /* `mcnt' holds how many bytes long the alternative
+                       is, including the ending `jump_past_alt' and
+                       its number.  */
+
+                    if (!alt_match_null_string_p (p1, p1 + mcnt - 3,
+                                                  reg_info)) {
+                        return false;
+                    }
+
+                    /* Move to right after this alternative, including the
+                    jump_past_alt.  */
+                    p1 += mcnt;
+
+                    /* Break if it's the beginning of an n-th alternative
+                       that doesn't begin with an on_failure_jump.  */
+                    if ((re_opcode_t) *p1 != on_failure_jump) {
+                        break;
+                    }
+
+                    /* Still have to check that it's not an n-th
+                       alternative that starts with an on_failure_jump.  */
+                    p1++;
+                    EXTRACT_NUMBER_AND_INCR (mcnt, p1);
+                    if ((re_opcode_t) p1[mcnt-3] != jump_past_alt) {
+                        /* Get to the beginning of the n-th alternative.  */
+                        p1 -= 3;
+                        break;
+                    }
+                }
+
+                /* Deal with the last alternative: go back and get number
+                   of the `jump_past_alt' just before it.  `mcnt' contains
+                   the length of the alternative.  */
+                EXTRACT_NUMBER (mcnt, p1 - 2);
+
+                if (!alt_match_null_string_p (p1, p1 + mcnt, reg_info)) {
+                    return false;
+                }
+
+                p1 += mcnt; /* Get past the n-th alternative.  */
+            } /* if mcnt > 0 */
+            break;
+
+
+        case stop_memory:
+            assert (p1[1] == **p);
+            *p = p1 + 2;
+            return true;
+
+
+        default:
+            if (!common_op_match_null_string_p (&p1, end, reg_info)) {
+                return false;
+            }
+        }
+    } /* while p1 < end */
+
+    return false;
+} /* group_match_null_string_p */
+
+
+/* Similar to group_match_null_string_p, but doesn't deal with alternatives:
+   It expects P to be the first byte of a single alternative and END one
+   byte past the last. The alternative can contain groups.  */
+
+static boolean
+alt_match_null_string_p (unsigned char * p, unsigned char * end, register_info_type * reg_info)
+{
+    int mcnt;
+    unsigned char *p1 = p;
+
+    while (p1 < end) {
+        /* Skip over opcodes that can match nothing, and break when we get
+           to one that can't.  */
+
+        switch ((re_opcode_t) *p1) {
+            /* It's a loop.  */
+        case on_failure_jump:
+            p1++;
+            EXTRACT_NUMBER_AND_INCR (mcnt, p1);
+            p1 += mcnt;
+            break;
+
+        default:
+            if (!common_op_match_null_string_p (&p1, end, reg_info)) {
+                return false;
+            }
+        }
+    }  /* while p1 < end */
+
+    return true;
+} /* alt_match_null_string_p */
+
+
+/* Deals with the ops common to group_match_null_string_p and
+   alt_match_null_string_p.
+
+   Sets P to one after the op and its arguments, if any.  */
+
+static boolean
+common_op_match_null_string_p (
+    unsigned char **p, unsigned char *end,
+    register_info_type *reg_info)
+{
+    int mcnt;
+    boolean ret;
+    int reg_no;
+    unsigned char *p1 = *p;
+
+    switch ((re_opcode_t) *p1++) {
+    case no_op:
+    case begline:
+    case endline:
+    case begbuf:
+    case endbuf:
+    case wordbeg:
+    case wordend:
+    case wordbound:
+    case notwordbound:
+#ifdef emacs
+    case before_dot:
+    case at_dot:
+    case after_dot:
+#endif
+        break;
+
+    case start_memory:
+        reg_no = *p1;
+        assert (reg_no > 0 && reg_no <= MAX_REGNUM);
+        ret = group_match_null_string_p (&p1, end, reg_info);
+
+        /* Have to set this here in case we're checking a group which
+           contains a group and a back reference to it.  */
+
+        if (REG_MATCH_NULL_STRING_P (reg_info[reg_no]) == MATCH_NULL_UNSET_VALUE) {
+            REG_MATCH_NULL_STRING_P (reg_info[reg_no]) = ret;
+        }
+
+        if (!ret) {
+            return false;
+        }
+        break;
+
+        /* If this is an optimized succeed_n for zero times, make the jump.  */
+    case jump:
+        EXTRACT_NUMBER_AND_INCR (mcnt, p1);
+        if (mcnt >= 0) {
+            p1 += mcnt;
+        } else {
+            return false;
+        }
+        break;
+
+    case succeed_n:
+        /* Get to the number of times to succeed.  */
+        p1 += 2;
+        EXTRACT_NUMBER_AND_INCR (mcnt, p1);
+
+        if (mcnt == 0) {
+            p1 -= 4;
+            EXTRACT_NUMBER_AND_INCR (mcnt, p1);
+            p1 += mcnt;
+        } else {
+            return false;
+        }
+        break;
+
+    case duplicate:
+        if (!REG_MATCH_NULL_STRING_P (reg_info[*p1])) {
+            return false;
+        }
+        break;
+
+    case set_number_at:
+        p1 += 4;
+
+    default:
+        /* All other opcodes mean we cannot match the empty string.  */
+        return false;
+    }
+
+    *p = p1;
+    return true;
+} /* common_op_match_null_string_p */
+
+
+/* Return zero if TRANSLATE[S1] and TRANSLATE[S2] are identical for LEN
+   bytes; nonzero otherwise.  */
+
+static int
+bcmp_translate(
+    unsigned char *s1, unsigned char*s2,
+    register int len,
+    char *translate)
+{
+    register unsigned char *p1 = s1, *p2 = s2;
+    while (len) {
+        if (translate[*p1++] != translate[*p2++]) {
+            return 1;
+        }
+        len--;
+    }
+    return 0;
+}
+

+/* Entry points for GNU code.  */
+
+/* re_compile_pattern is the GNU regular expression compiler: it
+   compiles PATTERN (of length SIZE) and puts the result in BUFP.
+   Returns 0 if the pattern was valid, otherwise an error string.
+
+   Assumes the `allocated' (and perhaps `buffer') and `translate' fields
+   are set in BUFP on entry.
+
+   We call regex_compile to do the actual compilation.  */
+
+const char *
+re_compile_pattern (
+    const char *pattern,
+    int length,
+    struct re_pattern_buffer *bufp)
+{
+    reg_errcode_t ret;
+
+    /* GNU code is written to assume at least RE_NREGS registers will be set
+       (and at least one extra will be -1).  */
+    bufp->regs_allocated = REGS_UNALLOCATED;
+
+    /* And GNU code determines whether or not to get register information
+       by passing null for the REGS argument to re_match, etc., not by
+       setting no_sub.  */
+    bufp->no_sub = 0;
+
+    /* Match anchors at newline.  */
+    bufp->newline_anchor = 1;
+
+    ret = regex_compile (pattern, length, re_syntax_options, bufp);
+
+    return re_error_msg[(int) ret];
+}
+

+/* Entry points compatible with 4.2 BSD regex library.  We don't define
+   them if this is an Emacs or POSIX compilation.  */
+
+#if !defined (emacs) && !defined (_POSIX_SOURCE)
+
+/* BSD has one and only one pattern buffer.  */
+static struct re_pattern_buffer re_comp_buf;
+
+char *
+re_comp (const char *s)
+{
+    reg_errcode_t ret;
+
+    if (!s) {
+        if (!re_comp_buf.buffer) {
+            return (char*)"No previous regular expression";
+        }
+        return 0;
+    }
+
+    if (!re_comp_buf.buffer) {
+        re_comp_buf.buffer = (unsigned char *) malloc (200);
+        if (re_comp_buf.buffer == NULL) {
+            return (char*)"Memory exhausted";
+        }
+        re_comp_buf.allocated = 200;
+
+        re_comp_buf.fastmap = (char *) malloc (1 << BYTEWIDTH);
+        if (re_comp_buf.fastmap == NULL) {
+            return (char*) "Memory exhausted";
+        }
+    }
+
+    /* Since `re_exec' always passes NULL for the `regs' argument, we
+       don't need to initialize the pattern buffer fields which affect it.  */
+
+    /* Match anchors at newlines.  */
+    re_comp_buf.newline_anchor = 1;
+
+    ret = regex_compile (s, strlen (s), re_syntax_options, &re_comp_buf);
+
+    /* Yes, we're discarding `const' here.  */
+    return (char *) re_error_msg[(int) ret];
+}
+
+
+int
+re_exec (const char *s)
+{
+    const int len = strlen (s);
+    return
+        0 <= re_search (&re_comp_buf, s, len, 0, len, (struct re_registers *) 0);
+}
+#endif /* not emacs and not _POSIX_SOURCE */
+

+/* POSIX.2 functions.  Don't define these for Emacs.  */
+
+#ifndef emacs
+
+/* regcomp takes a regular expression as a string and compiles it.
+
+   PREG is a regex_t *.  We do not expect any fields to be initialized,
+   since POSIX says we shouldn't.  Thus, we set
+
+     `buffer' to the compiled pattern;
+     `used' to the length of the compiled pattern;
+     `syntax' to RE_SYNTAX_POSIX_EXTENDED if the
+       REG_EXTENDED bit in CFLAGS is set; otherwise, to
+       RE_SYNTAX_POSIX_BASIC;
+     `newline_anchor' to REG_NEWLINE being set in CFLAGS;
+     `fastmap' and `fastmap_accurate' to zero;
+     `re_nsub' to the number of subexpressions in PATTERN.
+
+   PATTERN is the address of the pattern string.
+
+   CFLAGS is a series of bits which affect compilation.
+
+     If REG_EXTENDED is set, we use POSIX extended syntax; otherwise, we
+     use POSIX basic syntax.
+
+     If REG_NEWLINE is set, then . and [^...] don't match newline.
+     Also, regexec will try a match beginning after every newline.
+
+     If REG_ICASE is set, then we considers upper- and lowercase
+     versions of letters to be equivalent when matching.
+
+     If REG_NOSUB is set, then when PREG is passed to regexec, that
+     routine will report only success or failure, and nothing about the
+     registers.
+
+   It returns 0 if it succeeds, nonzero if it doesn't.  (See regex.h for
+   the return codes and their meanings.)  */
+
+int
+regcomp (regex_t *preg,const char *pattern,int cflags)
+{
+    reg_errcode_t ret;
+    unsigned syntax
+        = (cflags & REG_EXTENDED) ?
+          RE_SYNTAX_POSIX_EXTENDED : RE_SYNTAX_POSIX_BASIC;
+
+    /* regex_compile will allocate the space for the compiled pattern.  */
+    preg->buffer = 0;
+    preg->allocated = 0;
+
+    /* Don't bother to use a fastmap when searching.  This simplifies the
+       REG_NEWLINE case: if we used a fastmap, we'd have to put all the
+       characters after newlines into the fastmap.  This way, we just try
+       every character.  */
+    preg->fastmap = 0;
+
+    if (cflags & REG_ICASE) {
+        unsigned i;
+
+        preg->translate = (char *) malloc (CHAR_SET_SIZE);
+        if (preg->translate == NULL) {
+            return (int) REG_ESPACE;
+        }
+
+        /* Map uppercase characters to corresponding lowercase ones.  */
+        for (i = 0; i < CHAR_SET_SIZE; i++) {
+            preg->translate[i] = ISUPPER (i) ? tolower (i) : i;
+        }
+    } else {
+        preg->translate = NULL;
+    }
+
+    /* If REG_NEWLINE is set, newlines are treated differently.  */
+    if (cflags & REG_NEWLINE) {
+        /* REG_NEWLINE implies neither . nor [^...] match newline.  */
+        syntax &= ~RE_DOT_NEWLINE;
+        syntax |= RE_HAT_LISTS_NOT_NEWLINE;
+        /* It also changes the matching behavior.  */
+        preg->newline_anchor = 1;
+    } else {
+        preg->newline_anchor = 0;
+    }
+
+    preg->no_sub = !!(cflags & REG_NOSUB);
+
+    /* POSIX says a null character in the pattern terminates it, so we
+       can use strlen here in compiling the pattern.  */
+    ret = regex_compile (pattern, strlen (pattern), syntax, preg);
+
+    /* POSIX doesn't distinguish between an unmatched open-group and an
+       unmatched close-group: both are REG_EPAREN.  */
+    if (ret == REG_ERPAREN) {
+        ret = REG_EPAREN;
+    }
+
+    return (int) ret;
+}
+
+
+/* regexec searches for a given pattern, specified by PREG, in the
+   string STRING.
+
+   If NMATCH is zero or REG_NOSUB was set in the cflags argument to
+   `regcomp', we ignore PMATCH.  Otherwise, we assume PMATCH has at
+   least NMATCH elements, and we set them to the offsets of the
+   corresponding matched substrings.
+
+   EFLAGS specifies `execution flags' which affect matching: if
+   REG_NOTBOL is set, then ^ does not match at the beginning of the
+   string; if REG_NOTEOL is set, then $ does not match at the end.
+
+   We return 0 if we find a match and REG_NOMATCH if not.  */
+
+int
+regexec (
+    const regex_t *preg,
+    const char *string,
+    size_t nmatch,
+    regmatch_t pmatch[],
+    int eflags)
+{
+    int ret;
+    struct re_registers regs;
+    regex_t private_preg;
+    int len = strlen (string);
+    boolean want_reg_info = !preg->no_sub && nmatch > 0;
+
+    private_preg = *preg;
+
+    private_preg.not_bol = !!(eflags & REG_NOTBOL);
+    private_preg.not_eol = !!(eflags & REG_NOTEOL);
+
+    /* The user has told us exactly how many registers to return
+       information about, via `nmatch'.  We have to pass that on to the
+       matching routines.  */
+    private_preg.regs_allocated = REGS_FIXED;
+
+    if (want_reg_info) {
+        regs.num_regs = nmatch;
+        regs.start = TALLOC (nmatch, regoff_t);
+        regs.end = TALLOC (nmatch, regoff_t);
+        if (regs.start == NULL || regs.end == NULL) {
+            return (int) REG_NOMATCH;
+        }
+    }
+
+    /* Perform the searching operation.  */
+    ret = re_search (&private_preg, string, len,
+                     /* start: */ 0, /* range: */ len,
+                     want_reg_info ? &regs : (struct re_registers *) 0);
+
+    /* Copy the register information to the POSIX structure.  */
+    if (want_reg_info) {
+        if (ret >= 0) {
+            unsigned r;
+
+            for (r = 0; r < nmatch; r++) {
+                pmatch[r].rm_so = regs.start[r];
+                pmatch[r].rm_eo = regs.end[r];
+            }
+        }
+
+        /* If we needed the temporary register info, free the space now.  */
+        free (regs.start);
+        free (regs.end);
+    }
+
+    /* We want zero return to mean success, unlike `re_search'.  */
+    return ret >= 0 ? (int) REG_NOERROR : (int) REG_NOMATCH;
+}
+
+
+/* Returns a message corresponding to an error code, ERRCODE, returned
+   from either regcomp or regexec.   We don't use PREG here.  */
+
+size_t
+regerror (
+    int errcode,
+    const regex_t *preg,
+    char *errbuf,
+    size_t errbuf_size)
+{
+    const char *msg;
+    size_t msg_size;
+
+    if (errcode < 0
+            || errcode >= (sizeof (re_error_msg) / sizeof (re_error_msg[0])))
+        /* Only error codes returned by the rest of the code should be passed
+           to this routine.  If we are given anything else, or if other regex
+           code generates an invalid error code, then the program has a bug.
+           Dump core so we can fix it.  */
+    {
+        abort ();
+    }
+
+    msg = re_error_msg[errcode];
+
+    /* POSIX doesn't require that we do anything in this case, but why
+       not be nice.  */
+    if (! msg) {
+        msg = "Success";
+    }
+
+    msg_size = strlen (msg) + 1; /* Includes the null.  */
+
+    if (errbuf_size != 0) {
+        if (msg_size > errbuf_size) {
+            strncpy (errbuf, msg, errbuf_size - 1);
+            errbuf[errbuf_size - 1] = 0;
+        } else {
+            strcpy (errbuf, msg);
+        }
+    }
+
+    return msg_size;
+}
+
+
+/* Free dynamically allocated space used by PREG.  */
+
+void
+regfree (regex_t *preg)
+{
+    if (preg->buffer != NULL) {
+        free (preg->buffer);
+    }
+    preg->buffer = NULL;
+
+    preg->allocated = 0;
+    preg->used = 0;
+
+    if (preg->fastmap != NULL) {
+        free (preg->fastmap);
+    }
+    preg->fastmap = NULL;
+    preg->fastmap_accurate = 0;
+
+    if (preg->translate != NULL) {
+        free (preg->translate);
+    }
+    preg->translate = NULL;
+}
+
+#endif /* not emacs  */
+

+/*
+Local variables:
+make-backup-files: t
+version-control: t
+trim-versions-without-asking: nil
+End:
+*/
diff --git a/src/core/sequence.cpp b/src/core/sequence.cpp
new file mode 100644
index 0000000..b4b7b7a
--- /dev/null
+++ b/src/core/sequence.cpp
@@ -0,0 +1,760 @@
+/*
+
+HyPhy - Hypothesis Testing Using Phylogenies.
+
+Copyright (C) 1997-2009
+  Sergei L Kosakovsky Pond (spond at ucsd.edu)
+  Art FY Poon              (apoon at cfenet.ubc.ca)
+
+Permission is hereby granted, free of charge, to any person obtaining a
+copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be included
+in all copies or substantial portions of the Software.
+
+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.
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+*/
+
+#include "sequence.h"
+#include "errorfns.h"
+#include "stdio.h"
+#include "string.h"
+#ifdef    __HYPHYDMALLOC__
+#include "dmalloc.h"
+#endif
+
+_String   NuclAlphabet          = "ACGT-?",
+          CodonAlphabet       = "ABCDEFGHIJKLMNOPQRSTUVWXYZ*?-.",
+          FullAlphabet,
+          CompleteNuclAlphabet  = "AGCTUYRWSKMBDHVXN?0-.";
+
+long     countCompress = 0,
+         countDecompress = 0;
+
+void     initFullAlphabet  (void);
+void     WriteBitsToString (_String&, long&, char);
+
+//_________________________________________________________
+
+void    initFullAlphabet (void)
+{
+    _String fA ((unsigned long)256);
+    for (long i=0; i<256; i++) {
+        fA[i]=i;
+    }
+    FullAlphabet = fA;
+}
+
+//_________________________________________________________
+
+_CString::_CString (void)
+{
+    allocatedSpace = 0;
+    if (FullAlphabet.sLength==0) {
+        initFullAlphabet();
+    }
+    compressionType = NOCOMPRESSION;
+}
+
+//_________________________________________________________
+
+_CString::_CString (_String&s): _String(s)
+{
+    allocatedSpace = 0;
+    if (FullAlphabet.sLength==0) {
+        initFullAlphabet();
+    }
+    compressionType = NOCOMPRESSION;
+}
+//_________________________________________________________
+_CString::_CString (char* s): _String(s)
+{
+    allocatedSpace = 0;
+    if (FullAlphabet.sLength==0) {
+        initFullAlphabet();
+    }
+    compressionType = NOCOMPRESSION;
+}
+//_________________________________________________________
+_CString::_CString (char s): _String(s)
+{
+    allocatedSpace = 0;
+    if (FullAlphabet.sLength==0) {
+        initFullAlphabet();
+    }
+    compressionType = NOCOMPRESSION;
+}
+
+//_________________________________________________________
+_CString::_CString (unsigned long sL, bool flag)
+{
+    if (flag) {
+        sLength = 0;
+        if (sL<storageIncrement) {
+            sL = storageIncrement;
+        }
+        sData = (char*)MemAllocate (sL*sizeof (char));
+        allocatedSpace = sL;
+        if (!sData) {
+            warnError( -108);
+        }
+    } else {
+        allocatedSpace = 0;
+        sLength = sL;
+        sData = (char*)MemAllocate (sL+1);
+        if (sData) {
+            memset (sData,0,sL+1);
+        } else {
+            sLength = 0;
+            isError(0);
+        }
+    }
+    compressionType = NOCOMPRESSION;
+}
+
+//_________________________________________________________
+_CString::~_CString(void)
+{
+}
+//_________________________________________________________
+long    _CString::FreeUpMemory(long)
+{
+    if (!IsCompressed()) {
+        _Parameter comprratio = BestCompress (NUCLEOTIDEALPHABET);
+        if (comprratio == 1) {
+            comprratio = BestCompress (CODONALPHABET);
+        }
+        return sLength*(1/comprratio-1);
+    }
+    return 0;
+
+}
+
+//_______________________________________________________________________
+// append operator
+void _CString::Finalize (void)
+{
+    sData = MemReallocate (sData,sLength+1);
+
+    if (!sData) {
+        warnError(-108);
+    }
+
+    sData[sLength]=0;
+    allocatedSpace = 0;
+}
+
+//_______________________________________________________________________
+// append operator
+void _CString::operator << (char c)
+{
+    if (allocatedSpace <= sLength) {
+        unsigned long incBy = ((storageIncrement*8 > sLength)? storageIncrement: (sLength/8+1));
+
+        allocatedSpace+=incBy;
+
+        sData = (char*)MemReallocate((char*)sData, allocatedSpace*sizeof(char));
+
+        if (!sData) {
+            checkPointer (sData);
+        }
+    }
+
+    sData[sLength++]=c;
+}
+
+//_______________________________________________________________________
+// append operator
+void _CString::operator << (_String* s)
+{
+    if ( s && s->sLength) {
+        if (allocatedSpace < sLength + s->sLength) {
+            unsigned long incBy = sLength + s->sLength - nInstances;
+
+            if (incBy < storageIncrement) {
+                incBy = storageIncrement;
+            }
+
+            if (incBy < sLength/8) {
+                incBy = sLength/8;
+            }
+
+            allocatedSpace+=incBy;
+
+            sData = (char*)MemReallocate((char*)sData, allocatedSpace*sizeof(char));
+
+            if (!sData) {
+                checkPointer (sData);
+            }
+        }
+
+        memcpy(sData+sLength,s->sData,s->sLength);
+        sLength+=s->sLength;
+    }
+}
+
+//_________________________________________________________
+
+BaseRef   _CString::makeDynamic (void)
+{
+    _CString* res = (_CString*)new _CString;
+    checkPointer(res);
+
+    _String::Duplicate (res);
+
+    res->compressionType = compressionType;
+
+    return  res;
+
+}
+
+//_________________________________________________________
+
+void      _CString::Duplicate (BaseRef res)
+{
+    _String::Duplicate (res);
+
+    ((_CString*)res)->compressionType = compressionType;
+}
+
+//_________________________________________________________
+
+unsigned char powersOf2[9]= {0,2,6,14,30,62,126,254,0};
+unsigned char realPowersOf2[8]= {1,2,4,8,16,32,64,128};
+
+// auxiliary string bit write function
+
+//_________________________________________________________
+
+void    WriteBitsToString (_String&s, long& bitAt, char lengthToWrite)
+{
+    long leftOver = 8-bitAt%8, curPos = bitAt/8;
+    if (leftOver >= lengthToWrite) { // will fit in current byte
+        unsigned char value = (unsigned char)s[curPos];
+        value += powersOf2[leftOver-1]-powersOf2[leftOver-lengthToWrite];
+        s[curPos]=value;
+    } else {
+        unsigned char value = (unsigned char)s[curPos];
+        value += powersOf2[leftOver-1]+1;
+        s[curPos]=value;
+        char fullBytes = (lengthToWrite-leftOver-1)/8;
+        while (fullBytes) {
+            s[++curPos]=255;
+            fullBytes--;
+        }
+        s[++curPos]=254-powersOf2[8-(lengthToWrite-leftOver)%8];
+    }
+    bitAt+=lengthToWrite;
+}
+
+//_________________________________________________________
+
+/*
+void    PrintStringBitWise (char* str, long theL)
+{
+    unsigned int theByte;
+    char    byteout[9];
+    byteout[8] = 0;
+    long    i = 0;
+    for (;i<theL;i++)
+    {
+        if(i) printf(", ");
+        theByte = (unsigned int) (str[i]);
+        for (int k=0; k<8; k++)
+        {
+            byteout[7-k]='0'+theByte%2;
+            theByte/=2;
+        }
+        printf ("%s", byteout);
+    }
+}
+*/
+
+
+
+//_________________________________________________________
+_String* _CString::SelectAlpha (unsigned char alpha)
+{
+    alpha&=0xf0;
+    switch (alpha) {
+    case NUCLEOTIDEALPHABET:
+        return &NuclAlphabet;
+    case CODONALPHABET:
+        return &CodonAlphabet;
+    case FULLNUCLALPHABET:
+        return &CompleteNuclAlphabet;
+    }
+    return &FullAlphabet;
+}
+
+
+//_________________________________________________________
+
+_Parameter      _CString::FrequencyCompress(unsigned char theAlpha,bool doit)
+{
+
+    _String* theAlphabet = SelectAlpha (theAlpha);
+    if ((*theAlphabet).sLength>31) {
+        return 1;    // can't do much - the alphabet is too large
+    }
+    char codeLength[256];
+    long freqs [256],j,t;
+    long maxOccurences[256], locationsOfMaxSymbols[256] ; //simply ensures that we
+    // won't have symbols out of the alphabet
+
+
+    //analyze the frequency distribution of alphabetic symbols
+
+    for (j=0; j<256; freqs[j]=0,codeLength[j]=0,maxOccurences[j]=0, j++ ) {}
+
+
+    for (j=0; j<sLength; j++) {
+        freqs[sData[j]]++;
+    }
+
+    t = 0;
+    for (j=0; j<theAlphabet->sLength; j++) {
+        freqs[NuclAlphabet[j]]*=-1;
+    }
+
+    //make sure that the alphabet is "large" enough for the nucleotide case
+    // NEW 03/29/98
+    for (j=0; j<256; j++)
+        if (freqs[j]>0) {
+            t = 1;
+            break;
+        } else {
+            freqs[j]*=-1;
+        }
+    if (t) {
+        if (theAlphabet == &NuclAlphabet) {
+            return FrequencyCompress (FULLNUCLALPHABET, doit);
+        } else {
+            return 1;
+        }
+    }
+
+
+
+    // now build the prefix code for the alphabet
+    // fisrt find four most frequently occurring symbols
+
+    for (j=0; j<(*theAlphabet).sLength; j++) {
+        for (long k = 0; k<(*theAlphabet).sLength; k++)
+            if (freqs[(*theAlphabet)[j]]>=maxOccurences[k]) {
+                for (long l=(*theAlphabet).sLength-1; l>=k+1; l--) {
+                    maxOccurences[l]=maxOccurences[l-1];
+                    locationsOfMaxSymbols[l]=locationsOfMaxSymbols[l-1];
+                }
+                maxOccurences[k]=freqs[(*theAlphabet)[j]];
+                locationsOfMaxSymbols[k]=(*theAlphabet)[j];
+                break;
+            }
+    }
+
+
+    // compute efficiency
+    //j will store the predicted bit length of the compressed string
+
+    j = (*theAlphabet).sLength*5; // translation table size
+    j=8*((j%8)?(j/8+1):j/8);
+
+    // we are also ready to build the code table
+
+    for (long k = 0; k<(*theAlphabet).sLength; k++) {
+        long l;
+        for (l=0; l<(*theAlphabet).sLength; l++)
+            if ((*theAlphabet)[k]==locationsOfMaxSymbols[l]) {
+                j+=(l+1)*freqs[(*theAlphabet)[k]];
+                codeLength [locationsOfMaxSymbols[l]] = l+1;
+                break;
+            }
+    }
+
+//  if (j>Length()*8) return 1;
+// no compression could be performed
+    if (!doit) {
+        return j/8.0/sLength;
+    }
+
+    _String result ((unsigned long)(j%8?j/8+1:j/8)); // allocate output string
+
+
+// let's roll!!
+    long csize = 0; //will indicate the current bit position in the target string
+    t = 0; // current position in the string
+    //first we must write out the encoding table as 5 bits of length per each
+
+    for (j=0; j<(*theAlphabet).sLength; j++, csize+=5, t = csize/8) {
+        long leftover = 8-csize%8;
+        if (leftover>=5) {
+            unsigned char value = result[t];
+            switch (leftover) {
+            case 5:
+                value+=codeLength[(*theAlphabet)[j]];
+                break;
+            case 6:
+                value+=codeLength[(*theAlphabet)[j]]*2;
+                break;
+            case 7:
+                value+=codeLength[(*theAlphabet)[j]]*4;
+                break;
+            default:
+                value+=codeLength[(*theAlphabet)[j]]*8;
+            }
+            result[t]=value;
+        } else {
+            result[t]+=codeLength[(*theAlphabet)[j]]/realPowersOf2[5-leftover];
+            result[++t]=(codeLength[(*theAlphabet)[j]]%realPowersOf2[5-leftover])*realPowersOf2[3+leftover];
+        }
+    }
+
+
+
+    //  result[++t]=0;
+    // mark the end of tabular encoding
+    t++;
+    // now encode the actual sequence
+    t*=8;
+    //t+=8;
+
+    for (j=0; j<sLength; j++) {
+        WriteBitsToString (result,t,codeLength[(unsigned char)sData[j]]);
+    }
+
+    // pad the rest of the last byte in the string by ones
+
+    if (t%8) {
+        unsigned char value = result [t/8];
+        value += powersOf2[7-t%8]+1;
+        result[t/8]=value;
+        t++;
+    }
+
+    // yahoo! we are done - store compression flag and replace the string with compressed string
+    _Parameter factor = result.sLength/(_Parameter)sLength;
+    if (factor<1) { // compression took place
+        DuplicateErasing(&result);
+        SetFlag( FREQCOMPRESSION);
+        SetFlag (theAlpha);
+    }
+    return factor;
+
+}
+
+//_________________________________________________________
+
+_String*    _CString::DecompressFrequency(void)
+{
+
+    _String* theAlphabet = SelectAlpha (compressionType);
+
+    if (!IsFlag(FREQCOMPRESSION)) {
+        return nil;    // wrong compression type nothing to do
+    }
+    unsigned char *codeMaps = new unsigned char [(*theAlphabet).sLength];
+
+    if (!codeMaps) {
+        warnError( -108);    // no memory
+    }
+
+    unsigned int i,j,k,l,t; // temporary vars
+
+
+    // read in the alphabet encoding
+    i=0;
+    t=0;
+
+    for (j=0; j<(*theAlphabet).sLength; j++, i+=5, t = i/8) {
+        long leftover = 8-i%8;
+        unsigned char value = sData[t];
+        if (leftover>=5) {
+            switch (leftover) {
+            case 5:
+                value%=32;
+                break;
+            case 6:
+                value=(value%64)/2;
+                break;
+            case 7:
+                value=(value%128)/4;
+                break;
+            default:
+                value=value/8;
+            }
+
+        } else {
+            value=((unsigned char) sData[t])%realPowersOf2[leftover]*realPowersOf2[5-leftover];
+            value+=((unsigned char) sData[t+1])/realPowersOf2[3+leftover];
+        }
+        codeMaps[value-1]=j;
+    }
+
+    if(i%8) {
+        t++;    //possible rounding error
+    }
+
+    // now read in the data
+    // first we must guess the correct size of the string, but to be safe we'll just set it to
+    // the maximum possible value (i.e. if all the bytes compressed to 1 bit)
+
+    _String     result (10,true);
+
+    // k will count the actual length
+    // j,l will be used for relative positions of 0's
+
+    for (k=0,j=t*8;; ) { // go by bits
+        l=j; // look for the next zero bit in the stream
+        while (1) {
+            for (i=8-l%8; i>0; i--) {
+                if (!(sData[t]&realPowersOf2[i-1])) {
+                    break;
+                }
+            }
+            if (i) {
+                l+=(8-i)-l%8;
+                break;
+            }
+            if (t<sLength-1)    {
+                t++;
+            } else {
+                l=0;
+                break;
+            }
+            l=t*8;
+        }
+        if (!l) {
+            break;
+        }
+        l++;
+        _String addOn (theAlphabet->getChar(codeMaps[l-j-1]));
+        result<<&addOn;
+        if ((t=l/8)>=sLength) {
+            break;
+        }
+        j=l;
+        k++;
+    }
+    result.Finalize();
+    delete [] codeMaps;
+    return (_String*)(_String (result.getStr())).makeDynamic();
+
+}
+
+//_________________________________________________________
+inline unsigned int     ToLZWCode (long l)
+{
+    return (l>127)?l|0x8000:l;
+}
+#include "stdio.h"
+
+//_________________________________________________________
+
+_Parameter      _CString::LZWCompress (unsigned char theAlpha)
+{
+    _List theTable;
+    _SimpleList theCodes;
+
+    _String* theAlphabet = SelectAlpha (theAlpha);
+
+    _String output (*this), curString(""), testString;
+    long k = 0, pos, codeMax = 0, pos1;
+    char checkTable [256];
+
+    for (; k<256; checkTable[k++]=0) {}
+    for (k=0; k<theAlphabet->sLength; checkTable[(*theAlphabet)[k++]]=1) {}
+
+    // init the table
+
+    for (long j = 0; j<(*theAlphabet).sLength; j++) {
+        _String a((*theAlphabet)[j]);
+        theCodes.InsertElement ((BaseRef)ToLZWCode(j),theTable.BinaryInsert(&a),false,false);
+    }
+
+    codeMax = (*theAlphabet).sLength;
+
+    for (long p=0; p<sLength; p++) {
+        if (!checkTable[sData[p]]) {
+            return 1;    // symbol not in alphabet - can't compress
+        }
+        testString = curString&sData[p];
+        pos = theTable.BinaryFind(&testString);
+        if (pos<0) {
+            pos=theTable.BinaryInsert(&testString);
+            theCodes.InsertElement ((BaseRef)ToLZWCode(codeMax++),pos,false,false);
+            curString = sData[p];
+            long acode = theCodes(pos1);
+            pos1 = theTable.BinaryFind(&curString);
+            if (acode>127) {
+                output[k+1]=acode%256;
+                output[k]=acode/256;
+                k+=2;
+            } else {
+                output[k++]=acode;
+            }
+
+        } else {
+            pos1=pos;
+            curString = testString;
+        }
+    }
+
+    long acode = theCodes(pos1);
+    if (acode>127) {
+        output[k+1]=acode%256;
+        output[k]=acode/256;
+        k+=2;
+    } else {
+        output[k++]=acode;
+    }
+
+    output[k]=0;
+
+    // debugging info
+    /*  _String* bs = (_String*)theTable.toStr(), *bss = (_String*)theCodes.toStr();
+        printf ("\nString Table:%s\nCode Table:%s\n",bs->getStr(), bss->getStr());
+        DeleteObject(bs);
+        DeleteObject(bss);
+        for (long j=0;j<k; j++)
+        {
+            unsigned int value = output[j];
+            if (value>127)
+            {
+                value&0x7f;
+                value*=256;
+                value+=output[++j];
+            }
+            printf ("%u,",value);
+        }*/
+    // end debugging
+    output.SetLength(k+1);
+    _Parameter factor = k/_Parameter(sLength);
+    if (factor<1) {
+        DuplicateErasing(&output);
+        SetFlag( LZWCOMPRESSION);
+        SetFlag (theAlpha);
+    }
+    return factor;
+}
+//_________________________________________________________
+inline unsigned int     GetNextCode (_String& s, long& p)
+{
+    if (s.sData[p]<0) {
+        unsigned int val = s.sData[p++]&0x7f;
+        val *= 256;
+        val += (unsigned char)(s.sData[p++]);
+        return val;
+    }
+    return s[p++];
+}
+
+//_________________________________________________________
+
+_String*        _CString::DecompressLZW (void)
+{
+    _String* theAlphabet = SelectAlpha (this->compressionType);
+
+
+    if (!sLength||(!IsFlag( LZWCOMPRESSION))) {
+        return nil;    //nothing to do!
+    }
+    _List theTable;
+
+    _String output(storageIncrement,true), testString;
+    long codeMax = 0, oldCode;
+
+    // init the table
+
+    for (long j = 0; j<(*theAlphabet).sLength; j++) {
+        _String a((*theAlphabet)[j]);
+        theTable&&(&a);
+    }
+
+    long p = 0;
+
+    oldCode = GetNextCode(*this,p);
+//  output = output&*  (_String*)theTable(oldCode);
+    output <<  (_String*)theTable(oldCode);
+
+    for (; p<sLength-1;) {
+        codeMax=GetNextCode(*this,p);
+        if (theTable.countitems()-1>=codeMax) {
+            output << (_String*)theTable(codeMax);
+//          output = output& *(_String*)theTable(codeMax);
+            _String addOn((*(_String*)theTable(oldCode)));
+            addOn =addOn&*((_String*)theTable(codeMax))[0];
+            theTable&& &addOn;
+            oldCode = codeMax;
+        } else {
+            testString =  *(_String*)theTable(oldCode);
+            testString = testString&testString.getChar(0);
+            theTable&&(&testString);
+            output << &testString;
+//          output = output & testString;
+            oldCode = codeMax;
+        }
+    }
+    output.Finalize();
+
+    // debugging info
+//  _String* bs = (_String*)theTable.toStr();
+//  printf ("\nString Table:%s\n",bs->getStr());
+//  DeleteObject(bs);
+
+    // end debugging
+
+    return (_String*)output.makeDynamic();
+}
+
+//_________________________________________________________
+
+_Parameter _CString::BestCompress(unsigned char theAlpha, long triggerSize)
+{
+    countCompress++;
+    _Parameter freqcomp = FrequencyCompress(theAlpha, false), lzwcomp = 1;
+    _CString test(*this);
+    if ((triggerSize>=sLength)||(triggerSize==-1)) {
+        lzwcomp  = test.LZWCompress (theAlpha);
+    }
+    if ((freqcomp<1)||(lzwcomp<1)) { // stuff to do
+        if (freqcomp<lzwcomp) {
+            FrequencyCompress(theAlpha, true);
+            return freqcomp;
+        } else {
+            DuplicateErasing (&test);
+            compressionType = test.compressionType;
+            return lzwcomp;
+        }
+    }
+    SetDecompressed ();
+    return 1;
+}
+
+//_________________________________________________________
+
+_String* _CString::Decompress(void)
+{
+    countDecompress++;
+    if (IsFlag(LZWCOMPRESSION)) {
+        return DecompressLZW();
+    }
+    if (IsFlag(FREQCOMPRESSION)) {
+        return DecompressFrequency();
+    }
+    if (compressionType==NOCOMPRESSION) {
+        return (_String*)toStr();
+    }
+    return nil;
+}
diff --git a/src/core/simplelist.cpp b/src/core/simplelist.cpp
new file mode 100644
index 0000000..39f0da0
--- /dev/null
+++ b/src/core/simplelist.cpp
@@ -0,0 +1,1744 @@
+/*
+
+HyPhy - Hypothesis Testing Using Phylogenies.
+
+Copyright (C) 1997-2009
+  Sergei L Kosakovsky Pond (spond at ucsd.edu)
+  Art FY Poon              (apoon at cfenet.ubc.ca)
+
+Permission is hereby granted, free of charge, to any person obtaining a
+copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be included
+in all copies or substantial portions of the Software.
+
+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.
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+_AVLList    structure inspired by the excellent documentation of
+GNU libavl 2.0.1 by Ben Pfaff (http://www.msu.edu/~pfaffben/avl/index.html)
+
+*/
+
+#include "hy_strings.h"
+#include "errorfns.h" 
+#include "list.h"
+#include "simplelist.h"
+#include "parser.h"
+#include <stdlib.h>
+#include <string.h>
+#include <stdio.h>
+#include <ctype.h>
+#include <math.h>
+#include <limits.h>
+#include <stdarg.h>
+
+#ifdef    __HYPHYDMALLOC__
+#include "dmalloc.h"
+#endif
+
+
+/*
+==============================================================
+Constructors
+==============================================================
+*/
+
+// Does nothing
+_SimpleList::_SimpleList ()
+{
+    Initialize(false);
+}
+
+//Data constructor (1 member list)
+_SimpleList::_SimpleList (long br)
+{
+    lLength = 1;
+    laLength = MEMORYSTEP;
+    lData = (long*)MemAllocate (laLength * sizeof(Ptr));
+    ((long*)lData)[0]= br;
+}
+
+//Length constructor and populator
+_SimpleList::_SimpleList (long l, long start, long step)
+{
+    Initialize (false);
+    Populate   (l,start,step);
+}
+
+//Length constructor
+_SimpleList::_SimpleList (unsigned long l)
+{
+    lLength = 0;
+    laLength = (l/MEMORYSTEP + 1)*MEMORYSTEP;
+    lData = (long*)MemAllocate (laLength * sizeof(Ptr));
+    memset (lData,0,laLength * sizeof(Ptr));
+}
+
+//Stack copy contructor
+_SimpleList::_SimpleList (_SimpleList& l, long from, long to)
+{
+    if (from == 0 && to == -1) { // copy the whole thing
+        Duplicate (&l);
+    } else {
+        Initialize           ();
+        NormalizeCoordinates (from, to, l.lLength);
+        RequestSpace(to-from);
+        long upto = to-from ; 
+        for (long k = 0; k < upto; k++) {
+            lData[k] = l.lData[from+k];
+        }
+        /*
+        for (long i = from; i < to; i++) {
+            (*this) << l.lData[i];
+        }
+        */
+    }
+}
+
+// Data constructor (variable number of long constants)
+_SimpleList::_SimpleList (const long value1, const unsigned long number, ...)
+{
+    Initialize (true);
+    va_list vl;
+    
+    (*this) << value1;
+    
+    va_start(vl,number);
+    for (unsigned long arg_id =0;arg_id<number;arg_id++) {
+        const long this_arg =va_arg(vl,long);
+        (*this) << this_arg;
+    }
+    va_end(vl);
+}
+
+//Destructor
+_SimpleList::~_SimpleList(void)
+{
+    if (nInstances<=1) {
+        if (lData) {
+            free (lData);
+        }
+    } else {
+        nInstances--;
+    }
+
+
+}
+
+/*
+==============================================================
+Operator Overloads
+==============================================================
+*/
+
+//Element location functions (0,llength - 1)
+long& _SimpleList::operator [] (const long i)
+{
+    if (lLength == 0) {
+        return lData[0];
+    }
+
+    const unsigned long in = (const unsigned long)i;
+    if (in>lLength-1) {
+        return lData[lLength-1];
+    }
+
+    return lData[in];
+}
+//Element location functions (0,llength - 1)
+long _SimpleList::operator () (const unsigned long i)
+{
+    //if (lLength == 0) return 0;
+    //Is there a reason why this is commented out?
+    //if (i>=lLength) i = lLength-1;
+    if(i < lLength) {
+        return lData[i];
+    }
+    warnError("List index out of range");
+    return -1;
+}
+
+//Assignment operator
+_SimpleList _SimpleList::operator = (_SimpleList l)
+{
+    Clear();
+    lLength  = l.lLength;
+    laLength = l.laLength;
+    if (laLength) {
+        checkPointer (lData = (long*)MemAllocate (laLength*sizeof (Ptr)));
+        if (lLength) {
+            memcpy (lData,l.lData,lLength*sizeof (Ptr));
+        }
+    }
+
+    return *this;
+}
+
+//Append operator
+_SimpleList _SimpleList::operator & (_SimpleList l)
+{
+    _SimpleList res (l.lLength + lLength);
+    if (!res.laLength) {
+        return res;
+    }
+
+    if (lData&&lLength) {
+        memcpy(res.lData,lData,lLength*sizeof(void*));
+    }
+
+    if (l.lData&&l.lLength) {
+        memcpy((char*)res.lData+lLength*sizeof(void*),l.lData, l.lLength*sizeof(void*));
+    }
+
+    res.lLength = l.lLength + lLength;
+
+    return res;
+}
+
+void _SimpleList::operator << (long br)
+{
+    InsertElement ((BaseRef)br, -1, false, false);
+}
+
+bool _SimpleList::operator >> (long br)
+{
+    if (Find(br) == -1) {
+        InsertElement ((BaseRef)br, -1, false, false);
+        return true;
+    }
+    return false;
+}
+
+void _SimpleList::operator << (_SimpleList& source)
+{
+    for (unsigned long k=0; k<source.lLength; k++) {
+        (*this) << source.lData[k];
+    }
+}
+
+/*
+==============================================================
+Methods
+==============================================================
+*/
+
+
+//Element location functions (0,llength - 1), negative values return 
+// elements from the end of the list
+
+long _SimpleList::GetElement (const long index)
+{
+    if (index >= 0) {
+        if ((const unsigned long) index < lLength) {
+            return lData [index];
+        }
+    } 
+    if ((const unsigned long) (-index) <= lLength) {
+        return lData[lLength + index];
+    }
+    warnError(_String("List index '") & (long)((const unsigned long) (-index)) & "' out of range in _SimpleList::GetElement on list of length " & long (lLength));    
+    return 0;
+}
+
+
+long  _SimpleList::BinaryFind (long s, long startAt)
+{
+    long top    =   lLength-1,
+         bottom  =   startAt,
+         middle;
+
+    if (top == -1) {
+        return -2;
+    }
+
+    while (top>bottom) {
+        middle = (top+bottom)/2;
+        if (s<((long*)lData)[middle]) {
+            top = middle==top?top-1:middle;
+        } else if (s>((long*)lData)[middle]) {
+            bottom = middle==bottom?bottom+1:middle;
+        } else {
+            return middle;
+        }
+    }
+
+    middle     = top;
+    long comp  = ((long*)lData)[middle]-s;
+    if (!comp) {
+        return middle;
+    }
+
+    return comp<0?-middle-3:-middle-2;
+}
+
+long  _SimpleList::BinaryInsert (long n)
+{
+    if (!lLength) {
+        (*this) << n;
+        return 0;
+    }
+
+    long pos = -BinaryFind (n)-2;
+
+    if (pos<0) {
+        return -pos+2;
+    }
+
+    if (lData[pos]<n) {
+        pos++;
+    }
+
+    InsertElement ((BaseRef)n,pos,false,false);
+
+    return pos>=lLength?lLength-1:pos;
+}
+
+void _SimpleList::ClearFormulasInList(void)
+{
+    for (unsigned long k = 0; k < lLength; k++)
+        if (lData[k]) {
+            delete (_Formula*)lData[k];
+        }
+}
+
+long _SimpleList::Sum (void) {
+    long sum = 0;
+    for (unsigned long k = 0; k < lLength; k++) {
+       sum += lData[k];
+    }
+    return sum;
+}
+
+long  _SimpleList::Compare (long i, long j)
+{
+    long    v1 = ((long*)lData)[i],
+            v2 = ((long*)lData)[j];
+
+
+    if (v1<v2) {
+        return -1;
+    } else if (v1==v2) {
+        return 0;
+    } else {
+        return 1;
+    }
+
+
+    //return ((long*)lData)[i]-((long*)lData)[j];
+}
+
+long  _SimpleList::Compare (BaseRef i, long j)
+{
+    long    v1 = (long)i,
+            v2 = ((long*)lData)[j];
+
+
+    if (v1<v2) {
+        return -1;
+    } else if (v1==v2) {
+        return 0;
+    } else {
+        return 1;
+    }
+
+    //return (long)i-((long*)lData)[j];
+}
+
+// Compute the number of shared of two sorted lists
+long    _SimpleList::CountCommonElements (_SimpleList& l1, bool yesNo)
+{
+    long  c1    = 0,
+          c2    = 0,
+          res   = 0;
+
+
+    while (c1<l1.lLength && c2<lLength) {
+        while (l1.lData[c1]<lData[c2]) {
+            c1++;
+            if (c1==l1.lLength) {
+                break;
+            }
+        }
+        if (c1==l1.lLength) {
+            break;
+        }
+
+        while (l1.lData[c1]==lData[c2]) {
+            c2++;
+            if (yesNo) {
+                return 1;
+            } else {
+                res++;
+            }
+            if (c1==l1.lLength || c2==lLength) {
+                break;
+            }
+        }
+        if (c1==l1.lLength || c2==lLength) {
+            break;
+        }
+        while (lData[c2]<l1.lData[c1]) {
+            c2++;
+            if (c2==lLength) {
+                break;
+            }
+        }
+    }
+
+    return res;
+}
+
+//List length
+unsigned long _SimpleList::countitems(void)
+{
+    return lLength;
+}
+
+
+_SimpleList*  _SimpleList::CountingSort (long upperBound, _SimpleList* ordering)
+{
+    if (ordering) {
+        ordering->Clear();
+    }
+
+    if (lLength) {
+        if (upperBound < 0) {
+            upperBound = Max()+1;
+        }
+
+        _SimpleList buffer      (upperBound, 0, 0),
+                    * result    =  new _SimpleList (lLength);
+        for (long pass1 = 0; pass1 < lLength; pass1 ++) {
+            buffer.lData[lData[pass1]] ++;
+        }
+        for (long pass2 = 1; pass2 < upperBound; pass2 ++) {
+            buffer.lData[pass2] += buffer.lData[pass2-1];
+        }
+        if (ordering) {
+            ordering->Populate (lLength, 0, 0);
+            for (long pass3 = lLength-1; pass3 >=0; pass3--) {
+                result->lData[--buffer.lData[lData[pass3]]] = lData[pass3];
+                ordering->lData[buffer.lData[lData[pass3]]] = pass3;
+            }
+        } else
+            for (long pass3 = lLength-1; pass3 >=0; pass3--) {
+                result->lData[--buffer.lData[lData[pass3]]] = lData[pass3];
+            }
+        result->lLength = lLength;
+
+        return result;
+    }
+    return new _SimpleList;
+}
+
+void  _SimpleList::Clear (bool completeClear)
+{
+    if (nInstances<=1) {
+        lLength = 0;
+        if (completeClear) {
+            laLength = 0;
+            if (lData) {
+                free (lData);
+            }
+            lData = nil;
+        }
+    } else {
+        nInstances--;
+    }
+}
+
+void _SimpleList::DebugVarList(void)
+{
+    printf ("\nVariable list dump:\n");
+    for  (unsigned long e = 0; e < lLength; e++) {
+        if (lData[e] >= 0) {
+            _Variable * theV = LocateVar (lData[e]);
+            if (theV) {
+                printf ("[%s]\n", theV->GetName()->getStr());
+                continue;
+            }
+        }
+        printf ("[Empty]\n");
+    }
+}
+
+//Delete item at index (>=0)
+void  _SimpleList::Delete (long index, bool compact)
+{
+    if (index>=0 && index<lLength) {
+        lLength--;
+        if (lLength-index) {
+            memmove ((Ptr)lData+sizeof(BaseRef)*(index),(Ptr)lData+sizeof(BaseRef)*(index+1),sizeof(BaseRef)*(lLength-index));
+        }
+    }
+    if (compact && laLength-lLength>MEMORYSTEP) {
+        laLength -= ((laLength-lLength)/MEMORYSTEP)*MEMORYSTEP;
+        if (laLength) {
+            lData = (long*)MemReallocate ((char*)lData, laLength*sizeof(Ptr));
+        } else {
+            free (lData);
+            lData = nil;
+        }
+    }
+
+}
+
+//Delete duplicates from a sorted list
+void  _SimpleList::DeleteDuplicates (void)
+{
+    if (lLength>1) {
+        _SimpleList noDups;
+
+        long    lastValue = lData[0]+1;
+        for (unsigned long k=0; k<lLength; k++) {
+            long thisValue = lData[k];
+            if (thisValue!=lastValue) {
+                noDups << thisValue;
+                lastValue = thisValue;
+            }
+        }
+
+        if (noDups.lLength!=lLength) {
+            Duplicate (&noDups);
+        }
+    }
+
+}
+
+//Delete items from a sorted list
+void  _SimpleList::DeleteList (const _SimpleList& toDelete)
+{
+    if (toDelete.lLength) {
+        unsigned long k = 0;
+        for (unsigned long i = 0; i<lLength; i++) {
+            if (k<toDelete.lLength && i==toDelete.lData[k])
+                //if (k<toDelete.lLength)
+            {
+                k++;
+            } else {
+                lData[i-k] = lData[i];
+            }
+        }
+        lLength -= toDelete.lLength;
+    }
+    if (laLength-lLength>MEMORYSTEP) {
+        laLength -= ((laLength-lLength)/MEMORYSTEP)*MEMORYSTEP;
+        if (laLength) {
+            lData = (long*)MemReallocate ((char*)lData, laLength*sizeof(Ptr));
+        } else {
+            free (lData);
+            lData = nil;
+        }
+    }
+}
+
+//Shift the range from start to end
+void  _SimpleList::Displace (long start, long end, long delta)
+{
+    if (start<0) {
+        start = 0;
+    } else if (start>=lLength) {
+        start = lLength-1;
+    }
+
+    if (end<0) {
+        end = lLength-1;
+    } else if (end>=lLength) {
+        end = lLength-1;
+    }
+
+    if ((end-start>=0) && delta && (end-start<lLength-1))
+    {
+        if (delta>0 && lLength-end <= delta) { // shift up
+            delta = lLength-end-1;
+        } else if (start-delta<0){
+            delta = start;
+        }
+
+        if (delta) {
+            long i,j,delta2 = end-start+1;
+            _SimpleList swapList ((unsigned long)(end-start+1));
+
+            for (i=start; i<=end; i++) {
+                swapList << lData[i];
+            }
+
+            if (delta>0) {
+
+                for (i=end+1; i<=end+delta; i++) {
+                    lData[i-delta2] = lData[i];
+                }
+
+            } else {
+                for (i=start-1; i>=start+delta; i--) {
+                    lData[i+delta2] = lData[i];
+                }
+            }
+
+            for (i=start+delta, j=0; i<=end+delta; i++,j++) {
+                lData[i] = swapList.lData[j];
+            }
+        }
+
+    }
+}
+
+void _SimpleList::Duplicate(BaseRef theRef)
+{
+    _SimpleList* l  = (_SimpleList*)theRef;
+    lLength         = l->lLength;
+    laLength        = l->laLength;
+    lData           = l->lData;
+    if (lData) {
+        checkPointer (lData = (long*)MemAllocate (laLength*sizeof (Ptr)));
+        memcpy ((char*)lData, (char*)l->lData, lLength*sizeof (Ptr));
+    }
+}
+
+//Element location functions (0,llength - 1)
+//Negative indices return offsets from the end of the list
+long _SimpleList::Element(long index)
+{
+    if (index >= 0 && index < lLength) {
+        return lData[index];
+    }
+
+    else if(-index <= lLength) {
+        return lData[(long)lLength+index];
+    }
+
+    return 0;
+}
+
+bool _SimpleList::Equal(_SimpleList& l2)
+{
+    if (lLength!=l2.lLength) {
+        return false;
+    }
+
+    for (long i=0; i<lLength; i++)
+        if (lData[i] != l2.lData[i]) {
+            return false;
+        }
+
+    return true;
+}
+
+long  _SimpleList::Find (long s, long startAt)
+{
+    for (unsigned long i = startAt; i<lLength; i++) {
+        if ( ((long*)(lData))[i] == s ) {
+            return i;
+        }
+    }
+    return -1;
+}
+
+long  _SimpleList::FindStepping (long s, long step, long startAt)
+{
+    for (unsigned long i = startAt; i<lLength; i+=step)
+        if (lData[i] == s) {
+            return i;
+        }
+
+    return -1;
+}
+
+void  _SimpleList::FilterRange (long lb, long ub)
+{
+    if (ub <= lb) {
+        Clear();
+    } else {
+        _SimpleList toDelete;
+        for (long k = 0; k < lLength; k++)
+            if (lData[k] <= lb || lData[k] >= ub) {
+                toDelete << k;
+            }
+        DeleteList (toDelete);
+    }
+}
+
+void _SimpleList::Flip ()
+{
+    for (long k=0, l=lLength-1; k<l; k++,l--) {
+        void * pt = ((void**)lData)[k];
+        ((void**)lData)[k] = ((void**)lData)[l];
+        ((void**)lData)[l] = pt;
+    }
+}
+
+void _SimpleList::Initialize(bool doMemAlloc)
+{
+    BaseObj::Initialize();
+    lLength = 0;
+    if (doMemAlloc) {
+        laLength = MEMORYSTEP;
+        lData = (long*)MemAllocate (laLength * sizeof(Ptr));
+    } else {
+        laLength = 0;
+        lData    = nil;
+    }
+}
+
+//Append & store operator
+void _SimpleList::InsertElement (BaseRef br, long insertAt, bool store, bool pointer)
+{
+    lLength++;
+    if (lLength>laLength) {
+        unsigned long incBy = (MEMORYSTEP*5 > lLength)? MEMORYSTEP: lLength/5;
+
+        laLength+=incBy;
+
+        //memAlloc += sizeof(Ptr)*incBy;
+
+        if (lData) {
+            lData = (long*)MemReallocate((char*)lData, laLength*sizeof(void*));
+        } else {
+            lData = (long*)MemAllocate(laLength*sizeof(void*));
+        }
+
+        if (!lData) {
+            checkPointer (lData);
+        }
+    }
+    if (insertAt==-1) {
+        if (store) {
+            ((BaseRef*)lData)[lLength-1]=br->makeDynamic();
+        } else {
+            ((BaseRef*)lData)[lLength-1]=br;
+            if (pointer) {
+                br->nInstances++;
+            }
+        }
+    } else {
+        //insertAt = insertAt>=lLength?lLength:insertAt;
+        insertAt = insertAt>=lLength?lLength-1:insertAt;
+        long     moveThisMany = (laLength-insertAt-1);
+        if (moveThisMany < 32)
+            for (long k=insertAt+moveThisMany; k> insertAt ; k--) {
+                lData[k] = lData[k-1];
+            }
+        else {
+            memmove (((char**)lData)+(insertAt+1), ((char**)lData)+insertAt, moveThisMany*sizeof(void*));
+        }
+
+        if (store) {
+            ((BaseRef*)lData)[insertAt]=br->makeDynamic();
+        } else {
+            ((BaseRef*)lData)[insertAt]=br;
+            if (pointer) {
+                br->nInstances++;
+            }
+        }
+    }
+
+
+}
+
+//Convert a list into a partition style string
+BaseRef _SimpleList::ListToPartitionString ()
+{
+    _String *result = new _String ((unsigned long)64,true),
+    conv;
+
+    for (long k=0; k<lLength; k++) {
+        long m;
+        for (m=k+1; m<lLength; m++)
+            if (lData[m]-lData[m-1]!=1) {
+                break;
+            }
+        if (m>k+2) {
+            conv = lData[k];
+            (*result) << & conv;
+            (*result) << '-';
+            conv = lData[m-1];
+            (*result) << & conv;
+            if (m<lLength) {
+                (*result) << ',';
+            }
+            k = m-1;
+        } else {
+            conv = lData[k];
+            (*result) << &conv;
+            if (k<lLength-1) {
+                (*result) << ',';
+            }
+        }
+    }
+    (*result).Finalize();
+    return result;
+}
+
+BaseRef _SimpleList::makeDynamic(void)
+{
+    _SimpleList * Res = new _SimpleList;
+    checkPointer(Res);
+    memcpy ((char*)Res, (char*)this, sizeof (_SimpleList));
+    Res->nInstances = 1;
+    Res->lData = nil;
+    Res->Duplicate (this);
+    return Res;
+}
+
+long _SimpleList::Max(void)
+{
+    long res = LONG_MIN;
+    for  (long e = 0; e < lLength; e++)
+        if (lData[e] > res) {
+            res = lData[e];
+        }
+    return res;
+}
+
+long _SimpleList::Min(void)
+{
+    long res = LONG_MAX;
+    for  (long e = 0; e < lLength; e++)
+        if (lData[e] < res) {
+            res = lData[e];
+        }
+    return res;
+}
+
+//Merge 2 lists (sorted)
+
+void _SimpleList::Merge(_SimpleList& l1, _SimpleList& l2, _SimpleList* mergeResults1, _SimpleList* mergeResults2) {
+  
+  this->Clear();
+  if (mergeResults1) {
+    mergeResults1->Clear();
+  }
+  if (mergeResults2) {
+    mergeResults2->Clear();
+  }
+
+  enum    machine_states {INIT, ADVANCE1, ADVANCE2, FLUSH1, FLUSH2} advancing = INIT;
+
+  unsigned long   pos1 = 0,
+                  pos2 = 0,
+                  nt1 = l1.countitems(),
+                  nt2 = l2.countitems();
+
+
+  bool  keep_going = true;
+
+  while (keep_going) {
+    switch (advancing) {
+        
+      case ADVANCE1: { // advancing in the 1st list
+        pos1++;
+        if (pos1==nt1) {
+          advancing = FLUSH2;
+          continue;
+        }
+        
+        long cmp = l1.lData[pos1] - l2.lData [pos2];
+        //if (l1lData[pos1] <= l2->lData[pos2]) {
+        if ( cmp <= 0L) {
+          if (mergeResults1) {
+            //printf("MERGE line number %d in file %s\n", __LINE__, __FILE__);
+            (*mergeResults1)<<this->lLength;
+          }
+          
+          (*this) << (l1.lData[pos1]);
+          
+          //        if (mergeResults2 && l1->lData[pos1] < l2->lData[pos2]) {
+          if (cmp < 0L) {
+            if (mergeResults2 && mergeResults2->countitems () == 0UL && pos1 >= pos2) {
+              for (unsigned long i=0UL; i<pos2; i++) {
+                (*mergeResults2) << i;
+              }
+            }
+            continue;
+          }
+        }
+        
+        if (cmp > 0L) {
+          //if (l1->lData[pos1] > l2->lData[pos2]) {
+          advancing = ADVANCE2;
+          if (mergeResults1 && mergeResults1->countitems () == 0UL ) {
+            for (unsigned long i=0UL; i<pos1; i++) {
+              //printf("MERGE line number %d in file %s\n", __LINE__, __FILE__);
+              (*mergeResults1) << i;
+            }
+          }
+          
+          if (mergeResults2) {
+            (*mergeResults2)<<this->lLength;
+          }
+          
+          //printf ("this->append (l2->AtIndex(pos2))\n");
+          (*this)  << l2.lData[pos2];
+          continue;
+        }
+        break;
+      }
+        
+      case ADVANCE2: { // advancing in the 2nd list
+        pos2++;
+        if (pos2==nt2) {
+          advancing = FLUSH1;
+          continue;
+        }
+        
+        long cmp = l2.lData[pos2] - l1.lData[pos1];
+        
+        //if (l2->lData[pos2] <= l1->lData[pos1]) {
+        if (cmp <= 0L) {
+          if (mergeResults2) {
+            (*mergeResults2)<<this->lLength;
+          }
+          
+          (*this) << l2.lData[pos2];
+          
+          //if (l2->lData[pos2] < l1->lData[pos1] && mergeResults1 && !doMerge1 && pos2>=pos1) {
+          if (cmp < 0L ) {
+            if(mergeResults1 && mergeResults1->countitems() == 0 && pos2>=pos1) {
+              for (unsigned long i=0UL; i<pos1; i++) {
+                //printf("MERGE line number %d in file %s\n", __LINE__, __FILE__);
+                (*mergeResults1)<<i;
+              }
+            }
+            continue;
+          }
+        }
+        
+        //if (l2->lData[pos2] > l1->lData[pos1]) {
+        if (cmp > 0L) {
+          advancing = ADVANCE1;
+          if (mergeResults2 && mergeResults2->countitems() == 0) {
+            for (unsigned long i=0UL; i<pos2; i++) {
+              (*mergeResults2)<<i;
+            }
+          }
+          if (mergeResults1) {
+            //printf("MERGE line number %d in file %s\n", __LINE__, __FILE__);
+            (*mergeResults1)<<this->lLength;
+          }
+          (*this) << l1.lData[pos1];
+          continue;
+        }
+        break;
+      }
+      case FLUSH2: { // flush out the 2nd list
+        if (mergeResults1 && pos2<nt2 ) {
+          for (unsigned long i=pos1; i<nt1; i++) {
+            //printf("MERGE line number %d in file %s\n", __LINE__, __FILE__);
+            (*mergeResults1)<<i;
+          }
+        }
+        if (mergeResults2)
+          while (pos2<nt2) {
+            (*mergeResults2)<<this->lLength;
+            (*this) << (l2.lData[pos2++]);
+          }
+        else
+          while (pos2<nt2) {
+            (*this) << (l2.lData[pos2++]);
+          }
+        keep_going = false;
+        break;
+      }
+      case FLUSH1: { // flush out the 1st list
+        if (mergeResults2 && pos1<nt1) {
+          for (unsigned long i=pos2; i<nt2; i++) {
+            (*mergeResults2)<<i;
+          }
+        }
+        if (mergeResults1)
+          while (pos1<nt1) {
+            //printf("MERGE line number %d in file %s\n", __LINE__, __FILE__);
+            (*mergeResults1)<<this->lLength;
+            (*this) << (l1.lData[pos1++]);
+          }
+        else
+          while (pos1<nt1) {
+            (*this) << (l1.lData[pos1++]);
+          }
+        keep_going = false;
+        break;
+      }
+      case INIT: { // just starting
+        if (!nt1) { // first list is empty!
+          advancing = FLUSH2;
+          continue;
+        }
+        if (!nt2) { // second list is empty!
+          advancing = FLUSH1;
+          continue;
+        }
+        
+        //if (l1->lData[pos1] <= l2->lData[pos2]) { // begin with the first list
+        
+        long cmp = l1.lData[pos1] - l2.lData[pos2];
+        
+        if (cmp <= 0L) { // begin with the first list
+          if (mergeResults1) {
+            (*mergeResults1)<<this->lLength;
+          }
+          (*this) << (l1.lData[0]);
+          advancing = ADVANCE1;
+          if (cmp != 0L) {
+            continue;
+          }
+        } else {
+          if (mergeResults2) {
+            (*mergeResults2)<<this->lLength;
+          }
+          (*this) << (l2.lData[0]);
+          advancing = ADVANCE2;
+          continue;
+        }
+        break;
+      }
+    } // end SWITCH
+    
+    if (keep_going) {
+      if (advancing == ADVANCE1) { // moving up in the second term
+        pos1++;
+        if (pos1==nt1) {
+          pos2++;
+          if (mergeResults2) {
+            (*mergeResults2)<<this->lLength-1UL;
+          }
+          advancing = FLUSH2;
+          continue;
+        } else {
+          advancing = ADVANCE2;
+          if (mergeResults2) {
+            (*mergeResults2)<<this->lLength-1UL;
+          }
+        }
+      } else {
+        pos2++;
+        if (pos2==nt2) {
+          pos1++;
+          if (mergeResults1) {
+            (*mergeResults1)<<this->lLength-1UL;
+          }
+          advancing = FLUSH1;
+          continue;
+        } else {
+          advancing = ADVANCE1;
+          if (mergeResults1) {
+            (*mergeResults1)<<this->lLength-1UL;
+          }
+        }
+      }
+    }
+  }
+}
+
+// Together with the next function
+// Implements algorithm NEXKSB from p.27 of http://www.math.upenn.edu/~wilf/website/CombinatorialAlgorithms.pdf
+bool  _SimpleList::NChooseKInit (_SimpleList& state, _SimpleList& store, unsigned long stride, bool algorithm)
+{
+    if (stride <= lLength && lLength) {
+        state.Clear();
+        state.RequestSpace (stride+3);
+        state << stride;
+        store.Clear();
+        store.RequestSpace (stride);
+        return true;
+    }
+    return false;
+}
+
+// Implements algorithm NEXKSB from p.27 of http://www.math.upenn.edu/~wilf/website/CombinatorialAlgorithms.pdf
+bool  _SimpleList::NChooseK (_SimpleList& state, _SimpleList& store)
+{
+    if (state.lLength == 1) { // first pass
+        state << 0;              // m
+        state << state.lData[0]; // h
+        state.lLength = state.lData[0]+3;
+        store.lLength = state.lData[0];
+        if (store.lLength == 0) {
+            return false;
+        }
+    } else {
+        if (state.lData[1] < lLength - state.lData[2]) {
+            state.lData[2] = 0;
+        }
+        state.lData[2] ++;
+        state.lData[1] = state.lData[3 + state.lData[0] - state.lData[2]] + 1;
+    }
+    for (long j=1; j <= state.lData[2]; j++) {
+        long  anIndex   = j+state.lData[0]-state.lData[2],
+              anIndex2    = state.lData[1]+j;
+        state.lData[anIndex+2]   = anIndex2-1;
+        store.lData[anIndex-1]   = lData[anIndex2-1];
+    }
+    return state.lData[3] < lLength-state.lData[0];
+}
+
+//Coordinate normalizer
+void _SimpleList::NormalizeCoordinates (long& from, long& to, const unsigned long refLength)
+{
+    if (to < 0) {
+        to = refLength+to;
+    } else {
+        to = to < refLength-1 ? to : refLength - 1;
+    }
+    if (from < 0) {
+        from = refLength+from;
+    }
+}
+
+void _SimpleList::Offset (long shift)
+{
+    if (lData) {
+        for (long k=0; k<lLength; k++) {
+            lData[k] += shift;
+        }
+    }
+}
+
+_SimpleList* _SimpleList::Subset (unsigned long size, bool replacement)
+{
+    _SimpleList* result = new _SimpleList;
+    if (size > 0) {
+        size = MIN(size, lLength);
+        if (replacement) {
+            for (long k = 0; k < size; k++) {
+                (*result) << lData[genrand_int32()%lLength];
+            }
+        } else {
+            (*result) << (*this);
+            for (long k = 0; k < size; k++) {
+                long idx = lData[genrand_int32()%(lLength-k)];
+                long t = result->lData[k];
+                result->lData[k] = result->lData[idx];
+                result->lData[idx] = t;
+            }
+            result->lLength = size;
+            result->TrimMemory();
+        }
+    }
+    return result;
+}
+
+// Create a permutation of the list's elements
+void  _SimpleList::Permute (long blockLength)
+{
+    unsigned long blockCount = lLength/blockLength;
+
+    if (blockLength>1) {
+        /*_SimpleList     result ((unsigned long)(blockCount*blockLength));
+        while (blockCount)
+        {
+            unsigned long sample = (unsigned long)(genrand_real2()*blockCount);
+            sample *= blockLength;
+            for (long j = 0; j<blockLength; j++)
+            {
+                result<<lData[sample];
+                Delete(sample);
+            }
+            blockCount --;
+        }
+        Duplicate(&result); */
+
+        for (unsigned long k=0; k<blockCount-1; k=k+1) {
+            unsigned long k2 = genrand_real2()*(blockCount-k);
+            if (k2) {
+                k2 += k;
+                k2 *= blockLength;
+
+                for (long j = 0; j<blockLength; j++) {
+                    long t = lData[k2+j];
+                    lData[k2+j] = lData[k*blockLength+j];
+                    lData[k*blockLength+j] = t;
+                }
+            }
+        }
+
+    } else {
+        for (unsigned long k=0; k<blockCount-1; k=k+1) {
+            unsigned long k2 = genrand_real2()*(blockCount-k);
+            if (k2) {
+                k2+=k;
+                long t = lData[k2];
+                lData[k2] = lData[k];
+                lData[k] = t;
+            }
+        }
+        /*{
+            while (blockCount)
+            {
+                unsigned long sample = genrand_real2()*blockCount;
+                result<<lData[sample];
+                Delete(sample);
+                blockCount --;
+            }
+        }*/
+    }
+}
+
+// Create a permutation of the list's elements with possible repetitions
+void  _SimpleList::PermuteWithReplacement (long blockLength)
+{
+    unsigned long blockCount = lLength/blockLength;
+    _SimpleList   result ((unsigned long)(blockCount*blockLength));
+    if (blockLength>1)
+        for (long i = 0; i<blockCount; i++) {
+            unsigned long sample = (unsigned long)(genrand_real2()*blockCount);
+            sample *= blockLength;
+            for (long j = 0; j<blockLength; j++,sample++) {
+                result<<lData[sample];
+            }
+        } else {
+            for (long i = 0; i<blockCount; i++) {
+                unsigned long sample = genrand_real2()*blockCount;
+                result<<lData[sample];
+            }
+        }
+
+    Clear();
+    Duplicate(&result);
+
+}
+
+long _SimpleList::Pop (void)
+{
+    if (lLength > 0) {
+        lLength --;
+        return lData[lLength];
+    }
+
+    return 0;
+}
+
+//Length constructor and populator
+void _SimpleList::Populate (long l, long start, long step)
+{
+    RequestSpace (l);
+    for (long k = 0; k < l; k++, start+=step) {
+        lData[k] = start;
+    }
+
+    lLength = l;
+}
+
+void _SimpleList::RecursiveIndexSort (long from, long to, _SimpleList* index)
+{
+    long middle = (from+to)/2, middleV = lData[middle],
+         bottommove = 1, topmove = 1, temp,i, imiddleV = (*index)(middle);
+    long *idata = (*index).quickArrayAccess();
+    if (middle)
+        while ((middle-bottommove>=from)&&(Compare(middle-bottommove,middle)>=0)) {
+            bottommove++;
+        }
+
+    if (from<to)
+        while ((middle+topmove<=to)&&(Compare(middle+topmove,middle)<=0)) {
+            topmove++;
+        }
+
+    // now shuffle
+    for (i=from; i<middle-bottommove; i++) {
+        if (Compare(i,middle)>=0) {
+            temp = lData[middle-bottommove];
+            lData[middle-bottommove] = lData[i];
+            lData[i]=temp;
+            temp = idata[middle-bottommove];
+            idata[middle-bottommove] = idata[i];
+            idata[i]=temp;
+            bottommove++;
+            while ((middle-bottommove>=from)&&(Compare(middle-bottommove,middle)>=0)) {
+                bottommove++;
+            }
+        }
+    }
+
+    for (i=middle+topmove+1; i<=to; i++) {
+        if (Compare(i,middle)<=0) {
+            temp = lData[middle+topmove];
+            lData[middle+topmove] = lData[i];
+            lData[i]=temp;
+            temp = idata[middle+topmove];
+            idata[middle+topmove] = idata[i];
+            idata[i]=temp;
+            topmove++;
+            while ((middle+topmove<=to)&&(Compare(middle+topmove,middle)<=0)) {
+                topmove++;
+            }
+        }
+    }
+
+    if (topmove==bottommove) {
+        for (i=1; i<bottommove; i++) {
+            temp = lData[middle+i];
+            lData[middle+i] = lData[middle-i];
+            lData[middle-i]=temp;
+            temp = idata[middle+i];
+            idata[middle+i] = idata[middle-i];
+            idata[middle-i]=temp;
+        }
+    } else if (topmove>bottommove) {
+        long shift = topmove-bottommove;
+        for (i=1; i<bottommove; i++) {
+            temp = lData[middle+i+shift];
+            lData[middle+i+shift] = lData[middle-i];
+            lData[middle-i]=temp;
+            temp = idata[middle+i+shift];
+            idata[middle+i+shift] = idata[middle-i];
+            idata[middle-i]=temp;
+        }
+        for (i=0; i<shift; i++) {
+            lData[middle+i]=lData[middle+i+1];
+            idata[middle+i]=idata[middle+i+1];
+        }
+        middle+=shift;
+        lData[middle]=middleV;
+        idata[middle]=imiddleV;
+    } else {
+        long shift = bottommove-topmove;
+        for (i=1; i<topmove; i++) {
+            temp = lData[middle-i-shift];
+            lData[middle-i-shift] = lData[middle+i];
+            lData[middle+i]=temp;
+            temp = idata[middle-i-shift];
+            idata[middle-i-shift] = idata[middle+i];
+            idata[middle+i]=temp;
+        }
+        for (i=0; i<shift; i++) {
+            lData[middle-i]=lData[middle-i-1];
+            idata[middle-i]=idata[middle-i-1];
+        }
+        middle-=shift;
+        lData[middle]=middleV;
+        idata[middle]=imiddleV;
+    }
+    if (to>middle+1) {
+        RecursiveIndexSort (middle+1,to, index);
+    }
+    if (from<middle-1) {
+        RecursiveIndexSort (from,middle-1, index);
+    }
+}
+
+//Append & store operator
+void _SimpleList::RequestSpace (long slots)
+{
+    if (slots>laLength) {
+        laLength=(slots/MEMORYSTEP+1)*MEMORYSTEP;
+        if (lData) {
+            checkPointer (lData = (long*)MemReallocate((char*)lData, laLength*sizeof(void*)));
+        } else {
+            checkPointer (lData = (long*)MemAllocate(laLength*sizeof(void*)));
+        }
+    }
+}
+
+// Compute the union of two sorted lists
+// Each repeat appears exactly once
+void    _SimpleList::Subtract (_SimpleList& l1, _SimpleList& l2)
+{
+    if (lLength) {
+        Clear();
+    }
+
+    long  c1 = 0,
+          c2 = 0;
+
+    while (c1<l1.lLength && c2<l2.lLength) {
+        while (c1<l1.lLength && l1.lData[c1]<l2.lData[c2]) {
+            (*this) << l1.lData[c1++];
+        }
+        if (c1==l1.lLength) {
+            break;
+        }
+        while ( c1<l1.lLength && c2<l2.lLength  && l1.lData[c1]==l2.lData[c2] ) {
+            c1++;
+            c2++;
+        }
+        if (c1==l1.lLength || c2==l2.lLength) {
+            break;
+        }
+        while (c2<l2.lLength && l2.lData[c2]<l1.lData[c1]) {
+            c2++;
+        }
+    }
+
+    while (c1<l1.lLength) {
+        (*this) << l1.lData[c1++];
+    }
+}
+
+void _SimpleList::Swap (long i, long j)
+{
+    if ( i>=lLength || j>=lLength ) {
+        return;
+    }
+
+    void * pt = ((void**)lData)[j];
+    ((void**)lData)[j] = ((void**)lData)[i];
+    ((void**)lData)[i] = pt;
+}
+
+//Char* conversion
+BaseRef _SimpleList::toStr(void)
+{
+    if (lLength) {
+        unsigned long ssi = _String::storageIncrement,
+                      ma  = lLength*(1+log10((double)lLength));
+
+        if ( ma > ssi) {
+            _String::storageIncrement = ma;
+        }
+
+        _String * s = new _String (10L, true);
+
+        checkPointer (s);
+
+        (*s) << "{";
+
+        for (unsigned long i = 0; i<lLength; i++) {
+            char c[32];
+            snprintf (c, sizeof(c),"%ld",((long*)lData)[i]),
+                    (*s) << c;
+            if (i<lLength-1) {
+                (*s) << ',';
+            }
+        }
+
+        (*s) << '}';
+
+        s->Finalize();
+        _String::storageIncrement = ssi;
+        return s;
+    } else {
+        return new _String ("{}");
+    }
+}
+
+
+//Delete item at index (>=0)
+void  _SimpleList::TrimMemory (void)
+{
+    if (laLength>lLength) {
+        laLength = lLength;
+        if (laLength) {
+            if (lData) {
+                lData = (long*)MemReallocate ((char*)lData, laLength*sizeof(Ptr));
+            } else {
+                lData = (long*)MemAllocate (laLength*sizeof(Ptr));
+            }
+            if (!lData) {
+                checkPointer (lData);
+            }
+        } else {
+            if (lData) {
+                free (lData);
+                lData = nil;
+            }
+        }
+    }
+}
+
+/*
+==============================================================
+Sort Methods
+==============================================================
+*/
+
+void  _SimpleList::Sort (bool ascending)
+{
+    if (lLength<10) { // use bubble sort
+        BubbleSort();
+    } else {
+        QuickSort(0,lLength-1);
+    }
+
+    if (!ascending) {
+        long swap,i,j;
+        for (i=0, j=lLength-1; i<j; i++,j--) {
+            swap = ((long*)lData)[i];
+            ((long*)lData)[i]=((long*)lData)[j];
+            ((long*)lData)[j]=swap;
+        }
+    }
+}
+
+void  _SimpleList::BubbleSort (void)
+{
+    bool done = false;
+    long swap,i,j;
+    while (!done) {
+        done = true;
+        for (i=lLength-1,j=i-1; i>0; i--,j--) {
+            if (Compare(i,j)<0) {
+                done = false;
+                swap = ((long*)lData)[i];
+                ((long*)lData)[i]=((long*)lData)[j];
+                ((long*)lData)[j]=swap;
+            }
+        }
+    }
+}
+
+void  _SimpleList::QuickSort (long from, long to)
+{
+    long middle = (from+to)/2,
+         middleV = ((long*)lData)[middle],
+         top = to,
+         bottommove = 1,
+         topmove = 1,
+         temp,
+         i;
+
+    if (middle)
+        //while ((middle-bottommove>=from)&&(((long*)lData)[middle-bottommove]>middleV))
+        while ((middle-bottommove>=from)&&(Compare(middle-bottommove,middle)>0)) {
+            bottommove++;
+        }
+
+    if (from<to)
+        //while ((middle+topmove<=to)&&(((long*)lData)[middle+topmove]<middleV))
+        while ((middle+topmove<=to)&&(Compare(middle+topmove,middle)<0)) {
+            topmove++;
+        }
+    // now shuffle
+    for (i=from; i<middle-bottommove; i++) {
+        if (Compare(i,middle)>0) {
+            temp = ((long*)lData)[middle-bottommove];
+            ((long*)lData)[middle-bottommove] = ((long*)lData)[i];
+            ((long*)lData)[i]=temp;
+            bottommove++;
+
+            //while ((middle-bottommove>=from)&&(((long*)lData)[middle-bottommove]>middleV))
+            while ((middle-bottommove>=from)&&(Compare(middle-bottommove,middle)>0)) {
+                bottommove++;
+            }
+        }
+    }
+
+    for (i=middle+topmove+1; i<=top; i++) {
+        if (Compare(i,middle)<0) {
+            temp = ((long*)lData)[middle+topmove];
+            ((long*)lData)[middle+topmove] = ((long*)lData)[i];
+            ((long*)lData)[i]=temp;
+            topmove++;
+
+            //while ((middle+topmove<=to)&&(((long*)lData)[middle+topmove]<middleV))
+            while ((middle+topmove<=to)&&(Compare(middle+topmove,middle)<0)) {
+                topmove++;
+            }
+        }
+    }
+
+    if (topmove==bottommove) {
+        for (i=1; i<bottommove; i++) {
+            temp = ((long*)lData)[middle+i];
+            ((long*)lData)[middle+i] = ((long*)lData)[middle-i];
+            ((long*)lData)[middle-i]=temp;
+        }
+    } else if (topmove>bottommove) {
+        long shift = topmove-bottommove;
+        for (i=1; i<bottommove; i++) {
+            temp = ((long*)lData)[middle+i+shift];
+            ((long*)lData)[middle+i+shift] = ((long*)lData)[middle-i];
+            ((long*)lData)[middle-i]=temp;
+        }
+        for (i=0; i<shift; i++) {
+            ((long*)lData)[middle+i]=((long*)lData)[middle+i+1];
+        }
+        middle+=shift;
+        ((long*)lData)[middle]=middleV;
+    } else {
+        long shift = bottommove-topmove;
+        for (i=1; i<topmove; i++) {
+            temp = ((long*)lData)[middle-i-shift];
+            ((long*)lData)[middle-i-shift] = ((long*)lData)[middle+i];
+            ((long*)lData)[middle+i]=temp;
+        }
+        for (i=0; i<shift; i++) {
+            ((long*)lData)[middle-i]=((long*)lData)[middle-i-1];
+        }
+        middle-=shift;
+        ((long*)lData)[middle]=middleV;
+    }
+    if (to>middle+1) {
+        QuickSort (middle+1,top);
+    }
+    if (from<middle-1) {
+        QuickSort (from,middle-1);
+    }
+}
+
+//TODO: This is a global. Should it be here?
+void SortLists (_SimpleList* ref, _SimpleList* index)
+{
+    if ((*ref).lLength!=index->lLength) {
+        return;
+    }
+    if ((*ref).lLength<=10) {
+        bool done = false;
+
+        while (!done) {
+            done = true;
+            for (long i=1; i<(*ref).lLength; i++) {
+                if (ref->Compare(i-1,i)>0) {
+                    long swap;
+                    swap = ((long*)ref->lData)[i];
+                    ((long*)ref->lData)[i]=((long*)ref->lData)[i-1];
+                    ((long*)ref->lData)[i-1]=swap;
+                    swap = ((long*)index->lData)[i];
+                    ((long*)index->lData)[i]=((long*)index->lData)[i-1];
+                    ((long*)index->lData)[i-1]=swap;
+                    done = false;
+                }
+            }
+        }
+    } else {
+        (*ref).RecursiveIndexSort (0, (*ref).lLength-1,index);
+    }
+}
+
+/*
+==============================================================
+Set Methods
+==============================================================
+*/
+
+// Compute the intersection of two sorted lists
+void    _SimpleList::Intersect (_SimpleList& l1, _SimpleList& l2)
+{
+    if (lLength) {
+        Clear();
+    }
+
+    long  c1 = 0,
+          c2 = 0;
+
+    while (c1<l1.lLength && c2<l2.lLength) {
+        while (l1.lData[c1]<l2.lData[c2]) {
+            c1++;
+            if (c1==l1.lLength) {
+                break;
+            }
+        }
+        if (c1==l1.lLength) {
+            break;
+        }
+
+        while (l1.lData[c1]==l2.lData[c2]) {
+            (*this) << l1.lData[c1++];
+            c2++;
+            if (c1==l1.lLength || c2==l2.lLength) {
+                break;
+            }
+        }
+        if (c1==l1.lLength || c2==l2.lLength) {
+            break;
+        }
+        while (l2.lData[c2]<l1.lData[c1]) {
+            c2++;
+            if (c2==l2.lLength) {
+                break;
+            }
+        }
+    }
+}
+
+// Compute the union of two sorted lists
+// Each repeat appears exactly once
+void    _SimpleList::Union (_SimpleList& l1, _SimpleList& l2)
+{
+    if (lLength) {
+        Clear();
+    }
+
+    long  c1 = 0,
+          c2 = 0;
+
+    while (c1<l1.lLength && c2<l2.lLength) {
+        while (l1.lData[c1]<l2.lData[c2]) {
+            (*this) << l1.lData[c1++];
+            if (c1==l1.lLength) {
+                break;
+            }
+        }
+
+        if (c1==l1.lLength) {
+            break;
+        }
+
+        while (l1.lData[c1]==l2.lData[c2]) {
+            (*this) << l1.lData[c1++];
+            c2++;
+            if (c1==l1.lLength || c2==l2.lLength) {
+                break;
+            }
+        }
+
+        if (c1==l1.lLength || c2==l2.lLength) {
+            break;
+        }
+
+        while (l2.lData[c2]<l1.lData[c1]) {
+            (*this) << l2.lData[c2++];
+            if (c2==l2.lLength) {
+                break;
+            }
+        }
+    }
+
+    while (c1<l1.lLength) {
+        (*this) << l1.lData[c1++];
+    }
+    while (c2<l2.lLength) {
+        (*this) << l2.lData[c2++];
+    }
+
+}
+
+// Compute the union of two sorted lists
+// Each repeat appears exactly once
+void    _SimpleList::XOR (_SimpleList& l1, _SimpleList& l2)
+{
+    if (lLength) {
+        Clear();
+    }
+
+    long  c1 = 0,
+          c2 = 0;
+
+    while ((c1<l1.lLength)&&(c2<l2.lLength)) {
+        while (c1<l1.lLength && l1.lData[c1]<l2.lData[c2]) {
+            (*this) << l1.lData[c1++];
+        }
+        if (c1==l1.lLength) {
+            break;
+        }
+        while (c1<l1.lLength && c2<l2.lLength && l1.lData[c1]==l2.lData[c2] ) {
+            c1++;
+            c2++;
+        }
+        if (c1==l1.lLength||c2==l2.lLength) {
+            break;
+        }
+
+        while (c2<l2.lLength && l2.lData[c2]<l1.lData[c1]) {
+            (*this) << l2.lData[c2++];
+        }
+    }
+
+    while (c1<l1.lLength) {
+        (*this) << l1.lData[c1++];
+    }
+    while (c2<l2.lLength) {
+        (*this) << l2.lData[c2++];
+    }
+}
+
diff --git a/src/core/site.cpp b/src/core/site.cpp
new file mode 100644
index 0000000..37e9bff
--- /dev/null
+++ b/src/core/site.cpp
@@ -0,0 +1,6529 @@
+/*
+
+HyPhy - Hypothesis Testing Using Phylogenies.
+
+Copyright (C) 1997-2009
+  Sergei L Kosakovsky Pond (spond at ucsd.edu)
+  Art FY Poon              (apoon at cfenet.ubc.ca)
+
+Permission is hereby granted, free of charge, to any person obtaining a
+copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be included
+in all copies or substantial portions of the Software.
+
+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.
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+*/
+
+#include <string.h>
+#include <ctype.h>
+#include <stdlib.h>
+
+#define  HYPHY_SITE_DEFAULT_BUFFER_SIZE 256
+
+#include "likefunc.h"
+
+#define   DATA_SET_SWITCH_THRESHOLD     100000
+
+#include "math.h"
+
+#ifdef __MAC__
+extern bool handleGUI(bool);
+#endif
+
+#if !defined  __UNIX__ && !defined __HEADLESS__
+#include "HYDataPanel.h"
+#endif
+
+#if !defined  __UNIX__ || defined __HEADLESS__
+#include "preferences.h"
+#endif
+
+#ifdef    __HYPHYDMALLOC__
+#include "dmalloc.h"
+#endif
+
+#ifdef    __HYPHYMPI__
+extern int _hy_mpi_node_rank;
+#endif
+
+
+_TranslationTable      defaultTranslationTable;
+
+//_________________________________________________________
+
+extern _Parameter dFPrintFormat,
+       dFDefaultWidth;
+
+//_________________________________________________________
+
+_String           dataFileTree             ("IS_TREE_PRESENT_IN_DATA"),
+                  dataFileTreeString       ("DATAFILE_TREE"),
+                  aminoAcidOneCharCodes    ("ACDEFGHIKLMNPQRSTVWY"),
+                  dnaOneCharCodes          ("ACGT"),
+                  rnaOneCharCodes          ("ACGU"),
+                  binaryOneCharCodes       ("01"),
+                  nexusFileTreeMatrix      ("NEXUS_FILE_TREE_MATRIX"),
+                  dataFilePartitionMatrix  ("DATA_FILE_PARTITION_MATRIX"),
+                  useTraversalHeuristic    ("USE_TRAVERSAL_HEURISTIC"),
+                  defaultLargeFileCutoff   ("USE_MEMORY_SAVING_DATA_STRUCTURES"),
+                  fileTreeString;
+
+//_________________________________________________________
+
+/* function declarations */
+
+void    checkTTStatus (FileState* fs);
+void    processCommand (_String*s, FileState*fs);
+void    FilterRawString (_String& s, FileState* fs, _DataSet & ds);
+long    ProcessLine (_String&s , FileState *fs, _DataSet& ds);
+void    PadLine (FileState& fState, _DataSet& result);
+void    ISelector (FileState& fState, _String& CurrentLine, _DataSet& result);
+bool    SkipLine (_String& theLine, FileState* fS);
+void    TrimPhylipLine (_String& CurrentLine, _DataSet& ds);
+void    ProcessTree    (FileState*, FILE*, _String&);
+void    ReadNexusFile (FileState& fState, FILE*f, _DataSet& result);
+
+//_________________________________________________________
+_TranslationTable::_TranslationTable (void)
+{
+    baseLength = 4;
+    checkTable = NULL;
+}
+
+//_________________________________________________________
+_TranslationTable::_TranslationTable (char baseL)
+{
+    baseLength = (baseL==20)?20:4;
+    checkTable = NULL;
+}
+
+//_________________________________________________________
+_TranslationTable::_TranslationTable (_TranslationTable& t)
+{
+    tokensAdded = t.tokensAdded;
+    baseLength = t.baseLength;
+    baseSet = t.baseSet;
+    translationsAdded.Duplicate (&t.translationsAdded);
+    checkTable = NULL;
+}
+
+//_________________________________________________________
+_TranslationTable::_TranslationTable (_String& alphabet)
+{
+    baseLength = alphabet.sLength;
+    checkTable = NULL;
+    if (!(alphabet.Equal (&dnaOneCharCodes) || alphabet.Equal (&rnaOneCharCodes) ||
+            alphabet.Equal (&binaryOneCharCodes) || alphabet.Equal (&aminoAcidOneCharCodes))) {
+        AddBaseSet (alphabet);
+    }
+}
+
+//_________________________________________________________
+BaseRef     _TranslationTable::makeDynamic (void)
+{
+    _TranslationTable * r = new _TranslationTable;
+    checkPointer(r);
+
+    memcpy ((char*)r, (char*)this, sizeof (_TranslationTable));
+    r->nInstances = 1;
+    r->tokensAdded.Duplicate (&tokensAdded);
+    r->baseSet.Duplicate (&baseSet);
+    r->translationsAdded.Duplicate (&translationsAdded);
+    r->checkTable = NULL;
+    return r;
+}
+
+//_________________________________________________________
+long    _TranslationTable::TokenCode (char token)
+{
+    // standard translations
+    long * receptacle       = new long[baseLength];
+    if (!receptacle) {
+        checkPointer    (receptacle);
+    }
+    TokenCode               (token,receptacle);
+
+    long                    theCode         = 0,
+                            shifter       = 1;
+
+    for (int i = 0; i<baseLength; i++, shifter <<= 1) {
+        theCode +=  shifter*receptacle[i];
+    }
+
+    delete receptacle;
+    return theCode;
+}
+
+//_________________________________________________________
+char    _TranslationTable::CodeToLetter (long* split)
+// assumes a non-unique translation of split
+// for unique - use ConvertCodeToLetters
+{
+    long     shifter = 1,
+             trsl    = 0;
+
+    for (long k=0; k<(baseSet.sLength?baseSet.sLength:baseLength); k++,shifter<<=1) {
+        trsl+=shifter*split[k];
+    }
+
+    if (baseSet.sLength == 0)
+        // one of the standard alphabers
+    {
+        if (baseLength==4)
+            // nucleotides
+        {
+            switch (trsl) {
+            case 3:
+                return 'M';
+            case 5:
+                return 'S';
+            case 6:
+                return 'R';
+            case 7:
+                return 'V';
+            case 9:
+                return 'W';
+            case 10:
+                return 'Y';
+            case 11:
+                return 'H';
+            case 12:
+                return 'K';
+            case 14:
+                return 'B';
+            }
+        } else if (baseLength==20)
+            // amino acids
+        {
+            switch (trsl) {
+            case 2052:
+                return 'B';
+            case 8200:
+                return 'Z';
+            }
+        }
+    } else if (tokensAdded.sLength) {
+        shifter = translationsAdded.Find(trsl);
+        // linear search for (binary) translations
+        if (shifter>=0) {
+            return tokensAdded.sData[shifter];
+        }
+    }
+    return '?';
+}
+
+//_________________________________________________________
+void    _TranslationTable::SplitTokenCode (long code, long* receptacle)
+{
+    long shifter = 1;
+    for (int i=0; i<baseLength; i++) {
+        receptacle[i] = ((code&shifter)!=0);
+        shifter*=2;
+    }
+}
+
+//_________________________________________________________
+long    _TranslationTable::LengthOfAlphabet (void)
+{
+    return baseSet.sLength?baseSet.sLength:baseLength;
+}
+
+//_________________________________________________________
+
+bool    _TranslationTable::TokenCode (char token, long* receptacle, bool gapToOnes)
+{
+
+    long f = tokensAdded.sLength?tokensAdded.Find (token):-1;
+    // check for custom translations
+    // OPTIMIZE FLAG linear search:
+    // SLKP 20071002 should really be a 256 char lookup table
+
+    if (f != -1) {
+        SplitTokenCode(translationsAdded.lData[f], receptacle);
+        return true;
+    }
+
+    if (baseSet.sLength)
+        // custom base alphabet
+    {
+        for (long k=0; k<baseLength; k++) {
+            receptacle[k] = 0;
+        }
+
+        f = baseSet.Find(token);
+        // OPTIMIZE FLAG linear search:
+        // SLKP 20071002 should really be a 256 char lookup table
+
+        if (f!=-1) {
+            receptacle[f] = 1;
+        }
+
+        return true;
+    }
+
+    if (baseLength==4)
+        // standard nucleotide
+    {
+        receptacle[0]=0;
+        receptacle[1]=0;
+        receptacle[2]=0;
+        receptacle[3]=0;
+
+        switch (token) {
+        case 'A':
+            receptacle[0]=1;
+            break;
+
+        case 'C':
+            receptacle[1]=1;
+            break;
+
+        case 'G':
+            receptacle[2]=1;
+            break;
+
+        case 'T':
+        case 'U':
+            receptacle[3]=1;
+            break;
+
+        case 'Y':
+            receptacle[3]=1;
+            receptacle[1]=1;
+            break;
+
+        case 'R':
+            receptacle[0]=1;
+            receptacle[2]=1;
+            break;
+
+        case 'W':
+            receptacle[3]=1;
+            receptacle[0]=1;
+            break;
+
+        case 'S':
+            receptacle[1]=1;
+            receptacle[2]=1;
+            break;
+
+        case 'K':
+            receptacle[3]=1;
+            receptacle[2]=1;
+            break;
+
+        case 'M':
+            receptacle[1]=1;
+            receptacle[0]=1;
+            break;
+
+        case 'B':
+            receptacle[1]=1;
+            receptacle[2]=1;
+            receptacle[3]=1;
+            break;
+
+        case 'D':
+            receptacle[0]=1;
+            receptacle[2]=1;
+            receptacle[3]=1;
+            break;
+
+        case 'H':
+            receptacle[1]=1;
+            receptacle[0]=1;
+            receptacle[3]=1;
+            break;
+
+        case 'V':
+            receptacle[1]=1;
+            receptacle[2]=1;
+            receptacle[0]=1;
+            break;
+
+        case 'X':
+        case 'N':
+        case '?':
+        case '.':
+        case '*':
+            receptacle[1]=1;
+            receptacle[2]=1;
+            receptacle[3]=1;
+            receptacle[0]=1;
+            break;
+
+        case '-':
+            if (gapToOnes) {
+                receptacle[1]=1;
+                receptacle[2]=1;
+                receptacle[3]=1;
+                receptacle[0]=1;
+                break;
+            }
+        }
+    } else {
+        if (baseLength==20) {
+            for (long k=0; k<baseLength; k++) {
+                receptacle[k] = 0;
+            }
+
+            switch (token) {
+            case 'A':
+                receptacle[0]=1;
+                break;
+
+            case 'B':
+                receptacle[2]=1;
+                receptacle[11]=1;
+                break;
+
+            case 'C':
+                receptacle[1]=1;
+                break;
+
+            case 'D':
+                receptacle[2]=1;
+                break;
+
+            case 'E':
+                receptacle[3]=1;
+                break;
+
+            case 'F':
+                receptacle[4]=1;
+                break;
+
+            case 'G':
+                receptacle[5]=1;
+                break;
+
+            case 'H':
+                receptacle[6]=1;
+                break;
+
+            case 'I':
+                receptacle[7]=1;
+                break;
+
+            case 'K':
+                receptacle[8]=1;
+                break;
+
+            case 'L':
+                receptacle[9]=1;
+                break;
+
+            case 'M':
+                receptacle[10]=1;
+                break;
+
+            case 'N':
+                receptacle[11]=1;
+                break;
+
+            case 'P':
+                receptacle[12]=1;
+                break;
+
+            case 'Q':
+                receptacle[13]=1;
+                break;
+
+            case 'R':
+                receptacle[14]=1;
+                break;
+
+            case 'S':
+                receptacle[15]=1;
+                break;
+
+            case 'T':
+                receptacle[16]=1;
+                break;
+
+            case 'V':
+                receptacle[17]=1;
+                break;
+
+            case 'W':
+                receptacle[18]=1;
+                break;
+
+            case 'Y':
+                receptacle[19]=1;
+                break;
+
+            case 'Z':
+                receptacle[3]=1;
+                receptacle[13]=1;
+                break;
+
+            case 'X':
+            case '?':
+            case '.':
+            case '*': {
+                for (int j = 0; j<20; j++) {
+                    receptacle[j] = 1;
+                }
+            }
+            break;
+            case '-': {
+                if (gapToOnes)
+                    for (int j = 0; j<20; j++) {
+                        receptacle[j] = 1;
+                    }
+            }
+            break;
+            }
+        } else
+            // binary
+        {
+            receptacle[0] = 0;
+            receptacle[1] = 0;
+            switch (token) {
+            case '0':
+                receptacle[0]=1;
+                break;
+
+            case '1':
+                receptacle[1]=1;
+                break;
+
+            case 'X':
+            case '?':
+            case '.':
+            case '*': {
+                receptacle[0] = 1;
+                receptacle[1] = 1;
+            }
+            break;
+            case '-': {
+                if (gapToOnes) {
+                    receptacle[0] = 1;
+                    receptacle[1] = 1;
+                }
+            }
+            break;
+            }
+
+        }
+    }
+    return false;
+
+}
+//_________________________________________________________
+void    _TranslationTable::PrepareForChecks (void)
+{
+    if (checkTable == NULL) {
+        checkTable = MemAllocate (256);
+    }
+
+    for (long i2=0; i2<256; i2++) {
+        checkTable[i2]=0;
+    }
+
+    _String checkSymbols;
+//  if (baseLength == 4)
+//      checkSymbols = _String("ACGTUYRWSKMBDHVXN?O-.")&tokensAdded;
+    if (baseSet.sLength) {
+        checkSymbols = baseSet&tokensAdded;
+    } else if (baseLength == 2) {
+        checkSymbols = _String("01*?-.")&tokensAdded;
+    } else {
+        checkSymbols = _String("ABCDEFGHIJKLMNOPQRSTUVWXYZ*?-.")&tokensAdded;
+    }
+
+    for (long i=0; i<checkSymbols.sLength; i++) {
+        checkTable[checkSymbols(i)] = 1;
+    }
+}
+
+//_________________________________________________________
+bool    _TranslationTable::IsCharLegal (char c)
+{
+    if (!checkTable) {
+        PrepareForChecks();
+    }
+    return checkTable[c];
+}
+//___________________________________________
+
+void    _TranslationTable::AddTokenCode (char token, _String& code)
+{
+    long    f,
+            newCode = 0;
+
+    bool    killBS = false;
+
+    if (baseSet.sLength==0)
+        // fill in baseSet for standard alphabets
+    {
+        if (baseLength == 4) {
+            baseSet = dnaOneCharCodes;
+        } else if (baseLength == 20) {
+            baseSet = aminoAcidOneCharCodes;
+        } else {
+            baseSet = binaryOneCharCodes;
+        }
+        killBS = true;
+    }
+
+
+    if (baseSet.sLength) {
+        long shifter = 1;
+        for (int j = 0; j<baseSet.sLength; j++, shifter*=2)
+            if (code.Find (baseSet.sData[j])>=0) {
+                newCode += shifter;
+            }
+    }
+
+    f = baseSet.Find (token);
+    if (killBS) {
+        baseSet = empty;
+    }
+    if (f>=0) {
+        return;
+    }
+    // see if the character being added is a base
+    // character; those cannot be redefined
+
+    f = tokensAdded.Find (token,0,-1);
+    // new definition or redefinition?
+
+    if (f==-1) { // new
+        tokensAdded             = tokensAdded&token;
+        translationsAdded       << 0;
+        f                       = tokensAdded.sLength-1;
+    }
+
+    translationsAdded.lData[f] = newCode;
+}
+
+//_________________________________________________________
+
+void    _TranslationTable::AddBaseSet (_String& code)
+{
+    baseSet         = code;
+    baseSet.StripQuotes();
+    baseLength      = baseSet.sLength;
+    if (baseLength > HY_WIDTH_OF_LONG)
+        // longer than the bit size of 'long'
+        // can't handle those
+    {
+        _String err = _String ("Alphabets with more than ")
+                      & HY_WIDTH_OF_LONG &
+                      " characters are not supported";
+        WarnError (err);
+    }
+
+}
+
+//_________________________________________________________
+
+char    _TranslationTable::GetSkipChar (void)
+{
+    if ( baseSet.sLength==0 && translationsAdded.lLength==0 ) {
+        return '?';    // this is the default
+    }
+
+    // see if there is a symbol
+    // which maps to all '1'
+
+    long    all     = 0,
+            ul       = baseSet.sLength?baseSet.sLength:baseLength,
+            shifter = 1;
+
+    for  (long f=0; f<ul; f++, shifter <<= 1) {
+        all |= shifter;
+    }
+
+    if  ((all = translationsAdded.Find(all))==-1) {
+        return '?';
+    } else {
+        return tokensAdded[all];
+    }
+}
+
+//_________________________________________________________
+
+char    _TranslationTable::GetGapChar (void)
+{
+    if ( baseSet.sLength==0 && translationsAdded.lLength==0 ) {
+        return '-';    // default gap character
+    }
+
+    long f = translationsAdded.Find(0L);
+
+    if  (f==-1) {
+        return 0;
+    } else {
+        return tokensAdded[f];
+    }
+}
+
+//_________________________________________________________
+_String _TranslationTable::ConvertCodeToLetters (long code, char base)
+{
+
+    _String res (base,false);
+    if (code >= 0) {
+        // OPTIMIZE FLAG; repeated memory allocation/deallocation
+        if (baseSet.sLength)
+            for (long k=1; k<=base; k++, code/=baseLength) {
+                res.sData[base-k]=baseSet.sData[code%baseLength];
+            }
+        else if (baseLength==4) {
+            for (long k=1; k<=base; k++, code/=baseLength) {
+                switch (code%baseLength) {
+                case 0:
+                    res[base-k]='A';
+                    break;
+                case 1:
+                    res[base-k]='C';
+                    break;
+                case 2:
+                    res[base-k]='G';
+                    break;
+                case 3:
+                    res[base-k]='T';
+                    break;
+                }
+            }
+        } else if (baseLength == 20) {
+            for (long k=1; k<=base; k++, code/=baseLength) {
+                char out = code%baseLength;
+                if (out==0) {
+                    res[base-k] = 'A';
+                } else if (out<=7) {
+                    res[base-k] = 'B'+out;
+                } else if (out<=11) {
+                    res[base-k] = 'C'+out;
+                } else if (out<=16) {
+                    res[base-k] = 'D'+out;
+                } else if (out<=18) {
+                    res[base-k] = 'E'+out;
+                } else {
+                    res[base-k]='Y';
+                }
+            }
+        } else if (baseLength == 2)
+            for (long k=1; k<=base; k++, code/=baseLength) {
+                switch (code%baseLength) {
+                case 0:
+                    res[base-k]='0';
+                    break;
+                case 1:
+                    res[base-k]='1';
+                    break;
+                }
+            }
+    } else {
+        char c = GetGapChar();
+        for (long k=0; k<base; k++) {
+            res.sData[k] = c;
+        }
+    }
+    return res;
+
+
+}
+
+//_________________________________________________________
+
+_TranslationTable*  _TranslationTable::MergeTables (_TranslationTable* table2)
+// merge the translation tables if they are compatible, return the result,
+// otherwise return nil
+{
+    if (baseSet.sLength==table2->baseSet.sLength) {
+        if (baseSet.sLength==0) { // standard alphabet
+            if (baseLength!=table2->baseLength) {
+                return nil;
+            }
+        } else if(!(baseSet.Equal (&table2->baseSet))) {
+            return nil;
+        }
+
+        _TranslationTable* result = new _TranslationTable (*this);
+        checkPointer     (result);
+        if (table2->tokensAdded.sLength) {
+            for (long i=0; i<table2->tokensAdded.sLength; i++) {
+                long f = tokensAdded.Find (table2->tokensAdded[i]);
+                if (f==-1) {
+                    result->tokensAdded       && table2->tokensAdded[i];
+                    // SLKP 20071002 added the next line;
+                    // was not adding the translation for the new token
+                    result->translationsAdded << table2->translationsAdded[i];
+                } else if (translationsAdded.lData[f] != table2->translationsAdded.lData[i]) {
+                    DeleteObject (result);
+                    return nil;
+                }
+            }
+            return result;
+        } else {
+            return result;
+        }
+    }
+    return nil;
+}
+
+//_________________________________________________________
+
+_Site::_Site (void):_CString(16,true)
+{
+    refNo = -1;
+}
+
+//_________________________________________________________
+_Site::_Site (_String& s):_CString (s.sLength, true)
+{
+    refNo = -1;
+    (*this)<<&s;
+}
+
+//_________________________________________________________
+_Site::_Site (char s):_CString (16, true)
+{
+    refNo = -1;
+    (*this)<<s;
+}
+
+//_________________________________________________________
+_Site::_Site (long s)
+//:_CString (1, true)
+{
+    SetRefNo (s);
+}
+
+//_________________________________________________________
+_Site::~_Site (void)
+{}
+
+//_________________________________________________________
+void    _Site::Complete (void)
+{
+    if (refNo==-1) {
+        _String::Finalize();
+    }
+
+    refNo = refNo<0?-refNo:refNo;
+}
+//_________________________________________________________
+BaseRef _Site::makeDynamic(void)
+{
+    _Site * r = new _Site;
+    checkPointer(r);
+
+    memcpy ((char*)r, (char*)this, sizeof (_Site));
+    r->nInstances = 1;
+    nInstances++;
+    return r;
+}
+
+//_______________________________________________________________________
+void    _Site::Duplicate (BaseRef ref)
+{
+    _Site * s = (_Site*)ref;
+    sLength = s->sLength;
+    if (sData) {
+        free(sData);
+    }
+    sData      = s->sData;
+    allocatedSpace = s->allocatedSpace;
+    //nInstances = ref->nInstances;
+    if (sData) {
+        /*long theLength = sLength/storageIncrement;
+        if (!sLength||sLength%storageIncrement) theLength++;
+        theLength*=storageIncrement;
+        checkPointer (sData = (char*)MemAllocate (theLength));
+        memcpy (sData, s->sData, sLength);*/
+        if (allocatedSpace) {
+            checkPointer (sData = (char*)MemAllocate (allocatedSpace*sizeof(char)));
+        } else {
+            checkPointer (sData = (char*)MemAllocate (sLength*sizeof(char)));
+        }
+        memcpy (sData, s->sData, sLength);
+    }
+    refNo = -1;
+}
+
+//_______________________________________________________________________
+void    _Site::Clear (void)
+{
+    if (sData) {
+        free(sData);
+        sData = NULL;
+
+        //nInstances = 0;
+    }
+    allocatedSpace = 0;
+    sLength = 0;
+}
+//_______________________________________________________________________
+void    _Site::PrepareToUse (void)
+{
+    if (IsCompressed()) {
+        _String * s = Decompress();
+        DuplicateErasing(s);;
+        DeleteObject (s);
+        SetDecompressed();
+    }
+}
+//_______________________________________________________________________
+void    _Site::Archive (void)
+{
+    if ((!IsCompressed())&&(GetRefNo()>=0)) {
+        BestCompress (NUCLEOTIDEALPHABET);
+    }
+}
+
+
+//_______________________________________________________________________
+//  _DataSet Functions
+//_______________________________________________________________________
+
+_DataSet::_DataSet (void)
+{
+    theTT                = &defaultTranslationTable;
+    streamThrough        = nil;
+    dsh                  = nil;
+    useHorizontalRep     = false;
+}
+
+//_______________________________________________________________________
+
+_DataSet::_DataSet (long l):_List((unsigned long)l),theFrequencies((unsigned long)l) // with estimated number of sites per file
+{
+    dsh                 = nil;
+    streamThrough       = nil;
+    theTT               = &defaultTranslationTable;
+    useHorizontalRep     = false;
+}
+
+//_______________________________________________________________________
+
+_DataSet::_DataSet (FILE *f)
+{
+    dsh                  = nil;
+    useHorizontalRep     = false;
+    theTT                = &defaultTranslationTable;
+    streamThrough        = f;
+    theMap << 0; // current sequence
+    theMap << 0; // current site
+    theMap << 0; // total sites
+}
+
+//_______________________________________________________________________
+
+_DataSet::~_DataSet (void)
+{
+    if (theTT != &defaultTranslationTable) {
+        DeleteObject (theTT);
+    }
+}
+
+//_______________________________________________________________________
+
+void _DataSet::Clear (void)
+{
+    _List::Clear();
+    theMap.Clear();
+    theFrequencies.Clear();
+    theNames.Clear();
+    if (theTT != &defaultTranslationTable) {
+        DeleteObject (theTT);
+        theTT = &defaultTranslationTable;
+    }
+    noOfSpecies = 0;
+    if (dsh) {
+        dsh->incompletePatterns->Clear(false);
+        delete (dsh);
+        dsh = nil;
+    }
+    useHorizontalRep     = false;
+}
+
+//_______________________________________________________________________
+
+BaseRef _DataSet::makeDynamic (void)
+{
+    _DataSet * r = new _DataSet;
+    checkPointer(r);
+    memcpy ((char*)r, (char*)this, sizeof (_DataSet));
+    r->nInstances = 1;
+    r->theMap.Duplicate (&theMap);
+    r->theFrequencies.Duplicate (&theFrequencies);
+    if (theTT!=&defaultTranslationTable) {
+        r->theTT->nInstances++;
+    }
+    r->theNames.Duplicate (&theNames);
+    r->streamThrough = streamThrough;
+    nInstances++;
+    r->dsh = nil;
+    r->useHorizontalRep      = false;
+    return r;
+}
+
+//_______________________________________________________________________
+
+void     _DataSet::ResetIHelper (void)
+{
+    if (dsh && dsh->characterPositions.lLength == 256)
+        for (long k=0; k<256; k++) {
+            dsh->characterPositions.lData[k] = -1;
+        }
+}
+
+//_______________________________________________________________________
+
+void     _DataSet::ConvertRepresentations (void)
+{
+    if (useHorizontalRep == false) {
+        _List horStrings;
+
+        if (lLength == 0) {
+            AppendNewInstance (new _Site);
+        } else {
+            _Site * aSite = (_Site*)lData[0];
+
+            for (long str = 0; str < aSite->sLength; str++) {
+                _String * aString = new _String (DATA_SET_SWITCH_THRESHOLD,true);
+                horStrings << aString;
+                aString->nInstances --;
+            }
+
+            for  (long s = 0; s < lLength; s++) {
+                _Site * aSite = (_Site*)lData[s];
+                if (aSite->sLength>horStrings.lLength || aSite->GetRefNo() != -1) {
+                    FlagError ("Irrecoverable internal error in _DataSet::ConvertRepresentations. Sorry about that.");
+                    return;
+                }
+                aSite->Finalize();
+                for (long s2 = 0; s2 < aSite->sLength; s2++) {
+                    (*(_String*)horStrings.lData[s2]) << aSite->sData[s2];
+                }
+            }
+
+            _List::Clear();
+            theFrequencies.Clear();
+            {
+                for  (long s = 0; s < horStrings.lLength; s++) {
+                    (*this) << horStrings(s);
+                }
+            }
+        }
+        useHorizontalRep = true;
+    }
+}
+
+//_______________________________________________________________________
+
+void     _DataSet::AddSite (char c)
+{
+    if (streamThrough) {
+        if (theMap.lData[0] == 0) {
+            if (theMap.lData[1] == 0) {
+                if (theNames.lLength) {
+                    fprintf (streamThrough,">%s\n",((_String*)theNames(0))->getStr());
+                } else {
+                    fprintf (streamThrough,">Sequence 1\n");
+                }
+                (*this) && & empty;
+            }
+
+            theMap.lData[1]++;
+            theMap.lData[2]++;
+            fputc (c,streamThrough);
+        } else {
+            WarnError ("Can't add more sites to a file based data set, when more that one sequence has been written!");
+        }
+    } else {
+        if (useHorizontalRep == false) {
+            if (lLength < DATA_SET_SWITCH_THRESHOLD) {
+                _Site* nC = new _Site(c);
+                checkPointer(nC);
+                theFrequencies<<1;
+                (*this)<<nC;
+                nC->nInstances --;
+                return;
+            } else {
+                ConvertRepresentations ();
+            }
+        }
+
+        (*((_String*)lData[0])) << c;
+
+        /*long  f;
+
+        if (!dsh)
+        {
+            checkPointer (dsh = new _DSHelper);
+            for (f=0; f<256; f++)
+                dsh->characterPositions << -1;
+        }
+
+        f = dsh->characterPositions.lData[c];
+
+        if (f!=-1)
+        {
+            _Site* nC = new _Site(f);
+            checkPointer(nC);
+            theFrequencies[f]++;
+            theFrequencies<<0;
+            (*this)<<nC;
+            nC->nInstances --;
+        }
+        else
+        {
+            dsh->characterPositions.lData[c] = lLength;*/
+        //}
+    }
+}
+//_______________________________________________________________________
+
+void     _DataSet::Write2Site (long index, char c)
+{
+    if (streamThrough) {
+        if (index == 0) {
+            if (theMap.lData[2] == theMap.lData[1]) {
+                theMap.lData[0] ++;
+
+                if (theNames.lLength > theMap.lData[0]) {
+                    fprintf (streamThrough,"\n>%s\n",((_String*)theNames(theMap.lData[0]))->getStr());
+                } else {
+                    fprintf (streamThrough,"\n>Sequence %ld\n",theMap.lData[0]+1);
+                }
+
+                theMap.lData[1] = 0;
+            } else {
+                WarnError ("Can't write sequences of unequal lengths to a file based data set.");
+                return;
+            }
+        } else if (index != theMap.lData[1]) {
+            WarnError ("Can't write sites which are not consecutive to a file based data set.");
+            return;
+        }
+
+        theMap.lData[1] ++;
+        fputc (c,streamThrough);
+    } else {
+        /*if (!dsh)
+        {
+            WarnError ("Internal Error in 'Write2Site' - called Write2Site before any AddSite calls");
+            return;
+        }*/
+
+        if (useHorizontalRep) {
+            long     currentWritten = ((_String*)lData[0])->sLength;
+
+            if (index>=currentWritten) {
+                WarnError ("Internal Error in 'Write2Site' - index is too high (using compact representation)");
+                return;
+            } else {
+                if (index == 0) {
+                    _String * newString = new _String (currentWritten,true);
+                    (*newString) << c;
+                    (*this) << newString;
+                    newString->nInstances --;
+                } else {
+                    long s = 1;
+                    for (; s<lLength; s++) {
+                        _String *aString = (_String*)lData[s];
+                        if (aString->sLength == index) {
+                            (*aString) << c;
+                            break;
+                        }
+                    }
+                    if (s == lLength) {
+                        WarnError ("Internal Error in 'Write2Site' - no appropriate  string to write too (compact representation)");
+                        return;
+                    }
+                }
+            }
+        } else {
+            if (index>=lLength) {
+                WarnError ("Internal Error in 'Write2Site' - index is too high");
+                return;
+            }
+            _Site* s = (_Site*)lData[index];
+            long rN = s->GetRefNo();
+            if (rN==-1) { // independent site
+                //dsh->incompletePatterns->Delete (s,false);
+                (*s)<<c;
+                //dsh->incompletePatterns->Insert (s,index);
+            } else {
+                _Site *ss = (_Site*)lData[rN];
+                long sL = ss->sLength-1;
+                if (ss->sData[sL] != c) { // appending distinct char
+                    s->Duplicate (ss);
+                    s->sData[sL]=c;
+                    theFrequencies.lData[rN]--;
+
+                    rN = dsh->incompletePatterns->Find (s);
+                    if (rN>=0) {
+                        rN =  dsh->incompletePatterns->GetXtra (rN);
+                        /*_Site* s2 = (_Site*)lData[rN];
+                        if (s2->GetRefNo() != -1 || !s->Equal(s2))
+                        {
+                            WarnError ("Mapping Error");
+                        }*/
+                        theFrequencies[rN]++;
+                        s->Clear();
+                        s->SetRefNo(rN);
+                    } else {
+                        theFrequencies[index]++;
+                        s->SetRefNo(-1);
+                        dsh->incompletePatterns->Insert (s,index);
+                    }
+                }
+            }
+        }
+    }
+}
+
+
+
+//_______________________________________________________________________
+
+void     _DataSet::CheckMapping (long index)
+{
+    if (index>=lLength) {
+        FlagError ("Internal Error in 'CheckMapping' - index is too high");
+    }
+
+    _Site* s = (_Site*)lData[index];
+
+    for (long k = 0; k < index; k ++) {
+        _Site* ss = (_Site*)lData[k];
+        if (ss->GetRefNo() == -1) {
+            if (s->Equal(ss)) {
+                theFrequencies[index]--;
+                theFrequencies[k]++;
+                s->Clear();
+                s->SetRefNo(k);
+            }
+        }
+    }
+}
+
+//_______________________________________________________________________
+
+long     _DataSet::GetCharDimension         (void)  // return the size of the alphabet space
+{
+    return theTT->baseLength;
+}
+
+//_______________________________________________________________________
+
+long     _DataSet::GetNoTypes (void)  // return the number of unique columns
+{
+    return theMap.countitems ();
+}
+//_______________________________________________________________________
+
+long     _DataSet::GetFreqType (long index)  // return the frequency of a site
+{
+    return theFrequencies(theMap(index));
+}
+//_______________________________________________________________________
+
+void    _DataSet:: SetTranslationTable (_DataSet *  newTT )
+{
+    if (theTT&&(theTT!= &defaultTranslationTable)) {
+        DeleteObject (theTT);
+    }
+    theTT = (_TranslationTable*)newTT->theTT->makeDynamic();
+
+}
+
+//_______________________________________________________________________
+
+void    _DataSet:: SetTranslationTable (_TranslationTable *  newTT )
+{
+    if (theTT&&(theTT!= &defaultTranslationTable)) {
+        DeleteObject (theTT);
+    }
+    theTT = (_TranslationTable*)newTT->makeDynamic();
+
+}
+//_______________________________________________________________________
+void    _DataSet::Finalize (void)
+{
+    if (streamThrough) {
+        fclose (streamThrough);
+        streamThrough = nil;
+        theMap.Clear();
+    } else {
+        if (useHorizontalRep) {
+            bool  good = true;
+            for (long s = 0; s<lLength; s++) {
+                ((_String*)lData[s])->Finalize();
+                good = good && ((_String*)lData[0])->sLength == ((_String*)lData[s])->sLength;
+            }
+
+            if (!good) {
+                Clear();
+                WarnError ("Internal Error in _DataSet::Finalize. Unequal sequence lengths in compact representation");
+                return;
+            }
+
+            _List               dups;
+            _List               uniquePats;
+            _AVLListX           dupsAVL (&dups);
+
+            long  siteCounter = ((_String*)lData[0])->sLength;
+
+            for (long i1 = 0; i1<siteCounter; i1++) {
+                _Site * tC = new _Site ();
+                checkPointer (tC);
+
+                for (long i2 = 0; i2 < lLength; i2++) {
+                    (*tC) << ((_String*)lData[i2])->sData[i1];
+                }
+
+                tC->Finalize();
+
+                long ff = dupsAVL.Find(tC);
+                if (ff<0) {
+                    uniquePats << tC;
+                    dupsAVL.Insert(tC,theFrequencies.lLength);
+                    theMap         << theFrequencies.lLength;
+                    theFrequencies << 1;
+                } else {
+                    ff =  dupsAVL.GetXtra(ff);
+                    theMap << ff;
+                    theFrequencies.lData[ff] ++;
+                }
+
+                DeleteObject (tC);
+            }
+            dupsAVL.Clear(false);
+            _List::Clear();
+            _List::Duplicate(&uniquePats);
+        } else {
+            long j,
+                 k;
+
+            _Site         *tC;
+            {
+                _List          dups;
+                _AVLListX      dupsAVL (&dups);
+
+                for (long i1 = 0; i1<lLength; i1++) {
+                    tC = (_Site*)lData[i1];
+                    long ff = dupsAVL.Find(tC);
+                    if (ff<0) {
+                        dupsAVL.Insert(tC,i1);
+                    } else {
+                        ff =  dupsAVL.GetXtra(ff);
+                        tC->Clear();
+                        tC->SetRefNo(ff);
+                        theFrequencies.lData[ff] ++;
+                    }
+                }
+                dupsAVL.Clear(false);
+            }
+
+            _SimpleList  refs(lLength),
+                         toDelete(lLength);
+            j = 0;
+
+            for (long i1 = 0; i1<lLength; i1++) {
+                tC = (_Site*)(*(_List*)this)(i1);
+                k = tC->GetRefNo();
+                if (k==-1) {
+                    refs << j++;
+                } else {
+                    toDelete << i1;
+                    refs << -1;
+                }
+            }
+
+            for (long i2=0; i2<lLength; i2++) {
+                tC = (_Site*)(*(_List*)this)(i2);
+                k = tC->GetRefNo();
+                if (k>=0) {
+                    j = refs.lData[k];
+                    if (j<0) {
+                        warnError (-171);
+                    } else {
+                        refs.lData[i2]=j;
+                    }
+                }
+            }
+
+            theMap.Clear();
+            theMap.Duplicate (&refs);
+            DeleteList (toDelete);
+            theFrequencies.DeleteList (toDelete);
+
+            for (long i3 = 0; i3<lLength; i3++) {
+                tC = (_Site*)(*(_List*)this)(i3);
+                tC->SetRefNo (0);
+                tC->Finalize();
+            }
+            if (dsh) {
+                dsh->incompletePatterns->Clear(false);
+                delete (dsh);
+                dsh = nil;
+            }
+        }
+    }
+}
+//_______________________________________________________________________
+void    _DataSet::Compact (long index)
+{
+    if (useHorizontalRep) {
+        WarnError ("Internal Error: _DataSet::Compact called with compact represntation");
+        return;
+    }
+
+    _Site* tC = (_Site*)(*(_List*)this)(index);
+    if (tC->GetRefNo()!=-1)
+        // take care of double referencing
+    {
+        _Site*tCC=tC;
+        long lastRef, count = 0;
+        do {
+            lastRef = tCC->GetRefNo();
+            count++;
+            tCC = (_Site*)(*(_List*)this)(tCC->GetRefNo());
+        } while (tCC->GetRefNo()!=-1);
+        if (count>1) {
+            theFrequencies[lastRef]++;
+        }
+
+        tC->SetRefNo(lastRef);
+    }
+    /*if (tC->GetRefNo()==-1)
+    {
+     long f = dsh->incompletePatterns->Find(tC);
+     if (f >= 0)
+     {
+            f = dsh->incompletePatterns->GetXtra (f);
+            if (f<index)
+            {
+            theFrequencies[f]++;
+            tC->Clear();
+            tC->SetRefNo(f);
+        }
+        else
+            tC->Finalize();
+     }
+    }*/
+}
+
+
+//_______________________________________________________________________
+inline char  _DataSet::operator () (unsigned long site, unsigned long pos, unsigned int)
+{
+    return (((_String**)lData)[theMap.lData[site]])->sData[pos];
+}
+
+
+//_________________________________________________________
+long _DataSet::ComputeSize(void)
+{
+    long res = sizeof (_DataSet);
+
+    res+=(theMap.lLength+lLength+theFrequencies.lLength)*sizeof(long);
+    res+=lLength*sizeof(_Site);
+
+    for (long i=0; i<lLength; i++) {
+        res+= ((_Site*)(*(_List*)this)(i))->sLength;
+    }
+
+    return res;
+}
+
+//_________________________________________________________
+_Parameter _DataSet::CheckAlphabetConsistency(void)
+{
+    long        charsIn = 0,
+                gaps    = 0,
+                total   = 0;
+
+    char        checks    [256],
+                gapChar = theTT->GetGapChar();
+
+    _String     baseSymbols;
+
+    if (theTT->baseSet.sLength) {
+        baseSymbols = theTT->baseSet;
+    } else if (theTT->baseLength == 4) {
+        baseSymbols = "ACGUT";
+    } else if (theTT->baseLength == 20) {
+        baseSymbols = "ACDEFGHIKLMNOPQRSTVWY";
+    } else {
+        baseSymbols = binaryOneCharCodes;
+    }
+
+
+
+    for (; charsIn<256; charsIn++) {
+        checks[charsIn] = 0;
+    }
+
+    for (charsIn=0; charsIn<baseSymbols.sLength; charsIn++) {
+        checks[baseSymbols.sData[charsIn]] = 1;
+    }
+
+    charsIn = 0;
+
+    for (long i = 0; i<lLength; i++) {
+        _String* thisColumn = (_String*)lData[i];
+        long     w = theFrequencies.lData[i];
+        for (long j = 0; j<thisColumn->sLength; j++)
+            if (checks[thisColumn->sData[j]]) {
+                charsIn+=w;
+            } else if (gapChar == thisColumn->sData[j]) {
+                gaps += w;
+            }
+
+        total += w*thisColumn->sLength;
+    }
+
+    return (_Parameter)charsIn/(total-gaps+1.);
+
+}
+
+//___________________________________________________
+
+BaseRef _DataSet::toStr (void)
+{
+    _String * s = new _String(NoOfSpecies()*30, true),
+    *str;
+
+    checkPointer (s);
+    (*s) << _String ((long)NoOfSpecies());
+    (*s) << " species:";
+
+    str = (_String*)theNames.toStr();
+    (*s) << *str;
+    DeleteObject(str);
+
+    (*s) << ";\nTotal Sites:";
+    (*s) << _String((long)GetNoTypes());
+    (*s) << ";\nDistinct Sites:";
+    (*s) << _String((long)theFrequencies.lLength);
+
+    s->Finalize();
+
+    return s;
+}
+
+//___________________________________________________
+
+void    _DataSet::toFileStr (FILE* dest)
+{
+    fprintf (dest, "%ld species: ",NoOfSpecies());
+    theNames.toFileStr(dest);
+
+    fprintf (dest, ";\nTotal Sites: %ld",GetNoTypes()) ;
+    fprintf (dest, ";\nDistinct Sites: %ld",theFrequencies.lLength);
+
+    /*  fprintf (dest,"\n");
+        for (long j=0; j<noOfSpecies;j++)
+        {
+            fprintf (dest,"\n");
+            for (long i=0; i<theMap.lLength; i++)
+            {
+                fprintf (dest,"%c",(*this)(i,j,1));
+            }
+        }*/
+
+}
+
+
+//_________________________________________________________
+
+void    _DataSet::AddName (_String& s)
+{
+    theNames.AppendNewInstance (new _String (s,0,s.FirstNonSpaceIndex (0,-1,-1)));
+}
+
+
+
+//_________________________________________________________
+
+void    _DataSet::MatchIndices (_Formula&f, _SimpleList& receptacle, bool isVert, long limit)
+{
+    _String     varName  = isVert ? "siteIndex" : "speciesIndex";
+    _Variable   *v       = CheckReceptacle (&varName, empty, false);
+
+    for (long i=0; i<limit; i++) {
+        v->SetValue (new _Constant(i), nil);
+        _PMathObj res = f.Compute();
+        if (res && !CheckEqual(res->Value(),0.0)) {
+            receptacle<<i;
+        }
+    }
+    v->SetValue (new _Constant(0.0), nil);
+}
+
+//_________________________________________________________
+
+void    _DataSet::FindAllSitesLikeThisOne (long index, _SimpleList& receptacle)
+{
+    if (index>=0 && index<theMap.lLength) {
+        index = theMap.lData[index];
+        for (long k=0; k<theMap.lLength; k++)
+            if (theMap.lData[k]==index) {
+                receptacle << k;
+            }
+    }
+}
+
+//_________________________________________________________
+
+_TranslationTable*      _DataSet::CheckCompatibility (_SimpleList& ref, char concatOrCombine)
+{
+    _DataSet* currentSet = (_DataSet*)dataSetList(ref(0));
+
+    _TranslationTable* theEnd = new _TranslationTable (*(currentSet->theTT));
+    checkPointer(theEnd);
+    long    refNo     =  concatOrCombine?currentSet->NoOfSpecies():currentSet->NoOfColumns();
+    char    emptyChar = theEnd->GetSkipChar();
+
+    for (long k=1; k<ref.lLength; k++) {
+        currentSet = (_DataSet*)dataSetList(ref(k));
+
+        _TranslationTable* tryMe = theEnd->MergeTables (currentSet->theTT);
+
+        if (tryMe) {
+            if (emptyChar) {
+                DeleteObject (theEnd);
+                theEnd = tryMe;
+                continue;
+            } else {
+                if ((concatOrCombine&&(currentSet->NoOfSpecies()==refNo))||(!concatOrCombine&&(currentSet->NoOfColumns()==refNo))) {
+                    DeleteObject (theEnd);
+                    theEnd = tryMe;
+                    continue;
+                }
+            }
+        }
+        _String warningMessage ("The data set:");
+        warningMessage = warningMessage & *((_String*)dataSetNamesList(ref(k))) & _String (" was found incompatible with one of the following data sets:");
+        for (long i=0; i<k; i++) {
+            warningMessage = warningMessage & *((_String*)dataSetNamesList(ref(i))) & _String (",");
+        }
+        warningMessage = warningMessage &  _String (" and was dropped from the dataset merging operation");
+        ReportWarning (warningMessage);
+        ref.Delete (k);
+        k--;
+    }
+
+    return theEnd;
+}
+
+//_________________________________________________________
+
+_DataSet*   _DataSet::Concatenate (_SimpleList ref)
+
+// concatenates (adds columns together) several datasets
+// in case the number of species in the datasets are different the deficiencies will be padded
+// by omission symbols
+// in case translation tables are different, they will be merged, provided it can be done,
+// otherwise the incompatible datasets will be ignored during this operation.
+
+{
+    _TranslationTable  * jointTable;
+
+    jointTable = CheckCompatibility (ref,1);
+
+    _DataSet           * bigDataSet = new _DataSet;
+    checkPointer(bigDataSet);
+
+    bigDataSet->theTT = jointTable;
+
+    // pass one - determine the max max number of species present and what dataset are they coming from
+
+    long      maxSpecies=0,
+              maxDataSet=0,
+              siteIndex;
+
+    _DataSet *currentSet;
+
+    char     emptySlot = jointTable->GetSkipChar();
+
+    for (long i=0; i<ref.lLength; i++) {
+        currentSet = (_DataSet*)dataSetList(ref(i));
+
+        long       specCount = currentSet->NoOfSpecies(),
+                   siteCount = currentSet->NoOfColumns();
+
+
+        if (specCount>maxSpecies) {
+            maxSpecies = specCount;
+            maxDataSet = i;
+        }
+        for (long j=0; j<siteCount; j++) {
+            bigDataSet->AddSite((*currentSet)(j,0,1));
+        }
+    }
+
+    for (long k=1; k<maxSpecies; k++) {
+        siteIndex = 0;
+        for (long i=0; i<ref.lLength; i++) {
+            currentSet = (_DataSet*)dataSetList(ref.lData[i]);
+
+            long       cns = currentSet->NoOfSpecies(),
+                       cnc = currentSet->NoOfColumns();
+
+            if (cns<=k)
+                for (long j=0; j< cnc; j++, siteIndex++) {
+                    bigDataSet->Write2Site(siteIndex,emptySlot);
+                }
+            else
+                for (long j=0; j< cnc; j++, siteIndex++) {
+                    bigDataSet->Write2Site(siteIndex,(*currentSet)(j,k,1));
+                }
+        }
+    }
+
+    currentSet = (_DataSet*)dataSetList(ref(maxDataSet));
+    {
+        for (long i=0; i<maxSpecies; i++) {
+            bigDataSet->AddName (*((_String*)(currentSet->GetNames())(i)));
+        }
+    }
+
+    bigDataSet->Finalize();
+    bigDataSet->SetNoSpecies (maxSpecies);
+    return bigDataSet;
+}
+
+//_________________________________________________________
+
+_DataSet*   _DataSet::Combine (_SimpleList ref)
+
+// combines (adds rows together) several datasets
+// in case the number of species in the datasets are different the deficiencies will be padded
+// by omission symbols
+// in case translation tables are different, they will be merged, provided it can be done,
+// otherwise the incompatible datasets will be ignored during this operation.
+
+{
+    _TranslationTable  * jointTable;
+
+    jointTable = CheckCompatibility (ref,0);
+
+    _DataSet           * bigDataSet = new _DataSet;
+    checkPointer(bigDataSet);
+    bigDataSet->theTT = jointTable;
+
+    // pass one - determine the max max number of sites present and what dataset are they coming from
+
+    long     i,
+             j,
+             k,
+             maxSites=0,
+             sitesAvail,
+             nsc = 0;
+
+    _DataSet *currentSet;
+
+    char     emptySlot = jointTable->GetSkipChar();
+
+    for (i=0; i<ref.lLength; i++) {
+        currentSet = (_DataSet*)dataSetList(ref(i));
+        if (currentSet->NoOfColumns()>maxSites) {
+            maxSites = currentSet->NoOfColumns();
+        }
+        nsc += currentSet->NoOfSpecies();
+    }
+
+
+    for (k=0; k<ref.lLength; k++) {
+        currentSet = (_DataSet*)dataSetList(ref(k));
+        sitesAvail = currentSet->NoOfColumns();
+
+        long     cns = currentSet->NoOfSpecies();
+        for (i=0; i<cns; i++) {
+            bigDataSet->AddName (*((_String*)(currentSet->GetNames())(i)));
+            if (!(k||i)) {
+                for (j=0; j<sitesAvail; j++) {
+                    bigDataSet->AddSite ((*currentSet)(j,0,1));
+                }
+                for (; j<maxSites; j++) {
+                    bigDataSet->AddSite (emptySlot);
+                }
+            } else {
+                for (j=0; j<sitesAvail; j++) {
+                    bigDataSet->Write2Site (j,(*currentSet)(j,i,1));
+                }
+                for (; j<maxSites; j++) {
+                    bigDataSet->Write2Site (j,emptySlot);
+                }
+            }
+        }
+    }
+
+    bigDataSet->Finalize();
+    bigDataSet->SetNoSpecies(nsc);
+    return bigDataSet;
+}
+
+//_________________________________________________________
+// Data Set Filter/Numeric
+//_________________________________________________________
+
+_DataSetFilter::_DataSetFilter (void)
+{
+    unitLength = 0;
+    theData = NULL;
+    accessCache = nil;
+}
+//_________________________________________________________
+_DataSetFilter::_DataSetFilter (_DataSet* ds, char, _String&)
+{
+    theData     = ds;
+    accessCache = nil;
+}
+//_________________________________________________________
+_DataSetFilter::~_DataSetFilter (void)
+{
+    if (accessCache) {
+        DeleteObject (accessCache);
+    }
+}
+
+//_______________________________________________________________________
+
+_DataSetFilterNumeric::_DataSetFilterNumeric (_Matrix* freqs, _List& values, _DataSet *ds, long cc)
+{
+    unitLength      = 1;
+    categoryCount   = cc;
+
+    SetData         (ds);
+
+    _SimpleList     baseFreqs;
+
+    freqs->ConvertToSimpleList (baseFreqs);
+    dimension =                ((_Matrix*)values(0))->GetVDim();
+
+    theNodeMap.Populate         (ds->GetNames().lLength,0,1);
+    theOriginalOrder.Populate   (((_Matrix*)values(0))->GetHDim()/categoryCount,0,1);
+
+    //theMap.Populate           (theFrequencies.lLength,0,1);
+    //theOriginalOrder.Populate     (theFrequencies.lLength,0,1);
+    //duplicateMap.Populate     (theFrequencies.lLength,0,1);
+
+
+    /*CreateMatrix (&probabilityVectors, theNodeMap.lLength, shifter,false,true, false);
+
+    _Parameter   *storeHere = probabilityVectors.theData;
+    for (long spec = 0; spec < theNodeMap.lLength; spec++)
+    {
+        _Matrix * specMatrix = (_Matrix*)values(spec);
+        for (long site = 0; site < theFrequencies.lLength; site++)
+            for (long state = 0; state < dimension; state++,storeHere++)
+                //probabilityVectors.theData [shifter*spec + site*dimension+state]
+                *storeHere= specMatrix->theData[site*dimension+state];
+    }*/
+
+    _List        siteScores;
+    _AVLListXL   siteIndices(&siteScores);
+
+    duplicateMap.RequestSpace (baseFreqs.lLength+1);
+
+    //bool       startD = false;
+
+    char buffer[255];
+
+    for (long site =0; site <baseFreqs.lLength; site++) {
+        _Parameter      testV = 0.0;
+
+        for (long k=0; k<theNodeMap.lLength; k++) // sweep down the columns
+            for (long state = 0; state < dimension; state++) {
+                testV += ((_Matrix*)(((_Matrix**)values.lData)[k]))->theData[site*dimension+state];
+            }
+
+        snprintf (buffer, sizeof(buffer), "%20.18g", testV);
+        _String     testS (buffer);
+        long        f = siteIndices.Find (&testS);
+
+        _SimpleList * sameScore = nil;
+
+        if (f>=0) {
+            sameScore = (_SimpleList*)siteIndices.GetXtra (f);
+            for (long k = 0; k<sameScore->lLength; k++) {
+                bool fit = true;
+                f        = sameScore->lData[k];
+
+
+                for (long spec=0; spec<theNodeMap.lLength && fit; spec++) { // sweep down the columns
+                    _Matrix * specMatrix =(_Matrix*)(((_Matrix**)values.lData)[spec]);
+                    for (long state = 0; state < dimension; state++)
+                        if (specMatrix->theData[site*dimension+state]!=specMatrix->theData[theMap.lData[f]*dimension+state]) {
+                            fit = false;
+                            break;
+                        }
+                }
+
+                if (fit) {
+                    theFrequencies[f]+=baseFreqs[site];
+                    duplicateMap<<f;
+                    f = 0;
+                    break;
+                } else {
+                    f = -1;
+                }
+            }
+        }
+        if (f==-1) {
+            if (!sameScore) {
+                checkPointer        (sameScore = new _SimpleList);
+                if (siteIndices.Insert  (testS.makeDynamic(),(long)sameScore,false) < 0) {
+                    _String eh ("WTF?");
+                    StringToConsole(eh);
+                }
+            }
+
+            (*sameScore) << theFrequencies.lLength;
+
+            duplicateMap<<theFrequencies.lLength;
+            theFrequencies<<baseFreqs[site];
+            theMap<<site;
+        }
+    }
+
+    siteIndices.Clear(true);
+    shifter         = theFrequencies.lLength*dimension;
+    categoryShifter = shifter*theNodeMap.lLength;
+
+    CreateMatrix (&probabilityVectors, theNodeMap.lLength, shifter*categoryCount,false,true, false);
+    _Parameter   *storeHere    = probabilityVectors.theData;
+
+    long      refShifter = 0;
+    for (long cc = 0; cc < categoryCount; cc++, refShifter += theOriginalOrder.lLength * dimension) {
+        for (long spec = 0; spec < theNodeMap.lLength; spec++) {
+            _Matrix * specMatrix = (_Matrix*)values(spec);
+            for (long site = 0; site < theFrequencies.lLength; site++)
+                for (long state = 0; state < dimension; state++,storeHere++) {
+                    *storeHere = specMatrix->theData[refShifter + theMap.lData[site]*dimension+state];
+                }
+        }
+    }
+}
+
+
+//_______________________________________________________________________
+
+void _DataSetFilter::CopyFilter (_DataSetFilter *copyFrom)
+{
+    memcpy ((char*)this, (char*)copyFrom, sizeof (_DataSetFilter));
+
+    theFrequencies.Duplicate        (&copyFrom->theFrequencies);
+    theNodeMap.Duplicate            (&copyFrom->theNodeMap);
+    theMap.Duplicate                (&copyFrom->theMap);
+    theOriginalOrder.Duplicate      (&copyFrom->theOriginalOrder);
+    conversionCache.Duplicate       (&copyFrom->conversionCache);
+    duplicateMap.Duplicate          (&copyFrom->duplicateMap);
+
+    nInstances              = 1;
+    dimension               = copyFrom->dimension;
+    undimension             = copyFrom->undimension;
+    unitLength              = copyFrom->unitLength;
+    accessCache             = nil;
+
+}
+
+
+//_______________________________________________________________________
+
+BaseRef _DataSetFilter::makeDynamic (void)
+{
+    _DataSetFilter * r = new _DataSetFilter;
+    checkPointer    (r);
+    r->CopyFilter   (this);
+
+    return r;
+}
+
+
+//_______________________________________________________________________
+
+BaseRef _DataSetFilterNumeric::makeDynamic (void)
+{
+    _DataSetFilterNumeric * r = new _DataSetFilterNumeric();
+    checkPointer            (r);
+    r->CopyFilter           (this);
+    r->probabilityVectors.Duplicate(&probabilityVectors);
+    return r;
+}
+
+//_______________________________________________________________________
+
+_Parameter * _DataSetFilterNumeric::getProbabilityVector (long spec, long site, long categoryID)
+{
+    return probabilityVectors.theData + categoryID * categoryShifter + spec * shifter + site * dimension;
+}
+
+//_______________________________________________________________________
+long    _DataSetFilter::FreeUpMemory (long requestedBytes)
+{
+    long res = 0;
+    for (long i=0; (i<theMap.lLength)&&(res<requestedBytes); i++) {
+        res+=(theData->GetSite(theMap[i]))->FreeUpMemory(requestedBytes-res);
+    }
+    return res;
+}
+
+
+//_______________________________________________________________________
+void    _DataSetFilter::SetDimensions (void)
+{
+    dimension   = GetDimension(true);
+    undimension = GetDimension(false);
+}
+
+//_______________________________________________________________________
+unsigned long    _DataSetFilter::FindUniqueSequences  (_SimpleList& indices, _SimpleList& map, _SimpleList& counts, short mode)
+{
+    indices.Clear(); map.Clear(); counts.Clear();
+    
+    unsigned long             sites  = theMap.lLength,
+    seqs   = theNodeMap.lLength,
+    unit   = GetUnitLength();
+    
+    if (mode == 0)
+        {
+        _SimpleList hashSupport;        
+        _AVLListXL  sequenceHashes     (&hashSupport);
+        
+        for (unsigned long sequenceIndex = 0; sequenceIndex < seqs; sequenceIndex ++){
+            _String * thisSequence = GetSequenceCharacters (sequenceIndex);
+            
+            long     sequenceHash   = thisSequence->Adler32(),
+            f              = sequenceHashes.Find ((BaseRef)sequenceHash),
+            rawSequenceIdx = theNodeMap.lData[sequenceIndex];
+            
+            DeleteObject (thisSequence);
+            
+            _SimpleList * sameScore = nil;
+            if (f>=0) {
+                sameScore = (_SimpleList*)sequenceHashes.GetXtra (f);
+                for (long k = 0; k<sameScore->lLength; k++) {
+                    bool fit = true;
+                    f = sameScore->lData[k];
+                    
+                    long fRaw = theNodeMap.lData[indices.lData[f]];
+                    
+                    for (unsigned long site = 0; site < sites && fit; site++){
+                        for (unsigned long unitIndex = 0; unitIndex < unit; unitIndex ++){
+                            _Site * thisSite = theData->GetSite(theMap.lData[unit*site+unitIndex]);
+                            if (thisSite->sData[fRaw] != thisSite->sData[rawSequenceIdx]){
+                                fit = false;
+                                break;
+                            }
+                        }
+                    }
+                    
+                    if (fit) {
+                        map << f;
+                        counts.lData[f] ++;
+                        
+                    } else {
+                        f = -1;
+                    }
+                }
+            }
+            if (f==-1) { // fit failed or unique site
+                if (!sameScore) {
+                    sameScore = (_SimpleList*)checkPointer(new _SimpleList);
+                    sequenceHashes.Insert ((BaseRef)sequenceHash,(long)sameScore,false);
+                }
+                
+                (*sameScore) << indices.lLength;
+                map     << indices.lLength;
+                indices << sequenceIndex;
+                counts  << 1;
+            }
+        }
+        
+        }
+    else{
+        long             vd  = GetDimension(true);
+        
+        _Parameter      *translatedVector = (_Parameter*)checkPointer(new _Parameter [vd]),
+        *translatedVector2= (_Parameter*)checkPointer(new _Parameter [vd]);
+        
+        _String         state1 (unit,false),
+        state2 (unit,false);
+        
+        for (long sequenceIndex = 0; sequenceIndex < seqs; sequenceIndex++) {
+            bool checkState = false;
+            for (long idx=0; idx<indices.countitems(); idx++) {
+                for (long m=0; m<sites; m++) {
+                    RetrieveState (m,sequenceIndex, state1,false);
+                    RetrieveState (m,indices.lData[idx], state2,false);
+                    
+                    checkState = true;
+                    long idx1 = Translate2Frequencies (state1, translatedVector,  true),
+                    idx2 = Translate2Frequencies (state2, translatedVector2, true);
+                    
+                    //printf ("(%ld, %ld) %ld = %ld %ld\n", sequenceIndex, indices.lData[idx], m, idx1, idx2); 
+                    
+                    if (idx2 >=0 && idx1 >=0) {
+                        if (idx1==idx2) {
+                            continue;
+                        } else {
+                            checkState = false;
+                            break;
+                        }
+                    } else {
+                        
+                        // check for equal ambigs 
+                        long k = 0;
+                        for (; k < vd; k++){
+                            if (translatedVector[k] != translatedVector2[k]){
+                                break;
+                            }
+                        }
+                            
+                        if (k == vd)
+                            continue;
+                            
+                        if (mode == 1){
+                            
+                                long count1 = 0,
+                                     count2 = 0;
+                                
+                                for (long t = 0; t<vd; t++) {
+                                    count1 += translatedVector[t]>0.0;
+                                    count2 += translatedVector2[t]>0.0;
+                                }
+                                
+                                if (count1 < vd && count2 < vd) {
+                                    checkState = false;
+                                    break;
+                                }
+                                
+                            } else {
+                                bool first  = mode==2,
+                                second = mode==2;
+                                if (mode == 2){
+                                    for (long t = 0; (first||second)&&(t<vd); t++) {
+                                        if (translatedVector[t]>0.0) {
+                                            second &= (translatedVector2[t]>0.0);
+                                        }
+                                        if (translatedVector2[t]>0.0) {
+                                            first  &= (translatedVector[t]>0.0);
+                                        }
+                                    }
+                                    if (!(first||second)) {
+                                        checkState = false;
+                                        break;
+                                    }
+                                } else {
+                                    for (long t = 0; t<vd; t++) {
+                                        if (translatedVector[t]>0.0) {
+                                            second |= (translatedVector2[t]>0.0);
+                                        }
+                                        if (translatedVector2[t]>0.0) {
+                                            first  |= (translatedVector[t]>0.0);
+                                        }
+                                    }                       
+                                    if (!(first&&second)) {
+                                        checkState = false;
+                                        break;
+                                    }
+                                }
+                            }
+                        }
+                    }
+                
+                if (checkState) {
+                    map << idx;
+                    counts.lData[idx] ++;
+                    break;
+                }
+            }
+            
+            if (!checkState){
+                map     << indices.lLength;
+                indices << sequenceIndex;
+                counts  << 1;
+            }
+            
+        }
+        
+        delete [] translatedVector;
+        delete [] translatedVector2;   
+    }
+    
+    
+    return indices.lLength;
+}
+
+//_______________________________________________________________________
+
+void    _DataSetFilter::SetFilter (_DataSet* ds, char unit, _SimpleList& horizontalList, _SimpleList& verticalList, bool isFilteredAlready)
+{
+    // we must step thru the underlying dataset and recompute the frequenices
+    // we will store the vertical map in theMap
+    // and the horizontal map in theNodeMap
+    // theFrequencies will be store the new frequencies
+    // theOriginalOrder is the receptacle for the original site order in the data filter
+
+    bool            copiedSelf = false; // tag if refiltering self
+
+    _DataSetFilter* firstOne = nil;
+    if (isFilteredAlready) {
+        if ((Ptr)this == (Ptr)ds) {
+            firstOne = (_DataSetFilter*)makeDynamic();
+            copiedSelf = true;
+        } else {
+            firstOne = (_DataSetFilter*)ds;
+        }
+        ds       = firstOne->theData;
+    }
+
+    theMap.Clear();
+    theNodeMap.Clear();
+    theOriginalOrder.Clear();
+    theFrequencies.Clear();
+    theExclusions.Clear();
+    conversionCache.Clear();
+    duplicateMap.Clear();
+
+    theData     = ds;
+    unitLength  = unit;
+
+    long        i,
+                j;
+
+    // security checks
+    if (!horizontalList.lLength||(verticalList.lLength<unit)) {
+        ReportWarning (_String("Row and/or column partition is empty. All the data will be used by default."));
+        if (horizontalList.lLength==0) {
+            if (!isFilteredAlready) {
+                j = ds->NoOfSpecies();
+            } else {
+                j = firstOne->theNodeMap.lLength;
+            }
+
+            horizontalList.Populate (j,0,1);
+        }
+        if (verticalList.lLength<unit) {
+            verticalList.Clear();
+            if (!isFilteredAlready) {
+                j = ds->GetNoTypes();
+            } else {
+                j = firstOne->theOriginalOrder.lLength;
+            }
+
+            verticalList.Populate (j,0,1);
+        }
+    }
+
+    if (!isFilteredAlready) {
+        theNodeMap.Clear();
+        theNodeMap.Duplicate (&horizontalList);
+    } else {
+        for (long k = 0; k<horizontalList.lLength; k++) {
+            theNodeMap<<firstOne->theNodeMap.lData[horizontalList.lData[k]];
+        }
+
+        horizontalList.Clear();
+        horizontalList.Duplicate(&verticalList);
+        verticalList.Clear();
+        verticalList.RequestSpace(firstOne->theOriginalOrder.lLength);
+
+        for (i = 0; i<horizontalList.lLength; i++) {
+            j = horizontalList.lData[i];
+            if (j>=0 && j<firstOne->theOriginalOrder.lLength) {
+                verticalList<<firstOne->theOriginalOrder.lData[j];
+            } else {
+                _String tooBig (j);
+                if (j<0) {
+                    ReportWarning  (tooBig &" is a negative site index and is ignored");
+                } else {
+                    ReportWarning  (tooBig &" exceeds the number of sites in the underlying data filter and is ignored");
+                }
+            }
+        }
+    }
+
+    j = ds->NoOfSpecies();
+
+    for (i=0; i<theNodeMap.lLength; i++) {
+        if (theNodeMap.lData[i]>=j) {
+            _String invalid(theNodeMap.lData[i]);
+            ReportWarning ((invalid&" exceeds the number of species in the underlying dataset and is ignored"));
+            theNodeMap.Delete(i);
+            i--;
+        }
+    }
+
+    j = ds->GetNoTypes();
+    for (i=0; i<verticalList.lLength; i++)
+        if (verticalList.lData[i]>=j) {
+            _String invalid(verticalList.lData[i]);
+            ReportWarning ((invalid&" exceeds the number of sites in the underlying dataset and is ignored"));
+            verticalList.Delete(i);
+            i--;
+        }
+
+    if (verticalList.lLength%unit!=0) {
+        ReportWarning (_String("Number of sites in datasetfilter is not divisible by the unit - will truncate to the nearest integer"));
+        while(verticalList.lLength%unit) {
+            verticalList.Delete(verticalList.lLength-1);
+        }
+    }
+
+
+    theOriginalOrder.Duplicate (&verticalList);
+
+
+    // done with security checks
+
+    _SimpleList indices;        // numeric indices intended to facilitate the reindexing
+    _AVLListXL  siteIndices     (&indices);
+
+
+    // sweep through the columns left to right
+
+    duplicateMap.RequestSpace (verticalList.lLength/unit+1);
+
+    _String      siteHolder   (unit*theNodeMap.lLength,false);
+
+    //bool       startD = false;
+
+    for (i=0; i<verticalList.lLength; i+=unit) {
+        long colIndex = 0;
+
+        for (j=0; j<unit; j++) // sweep within one block
+            for (long k=0; k<theNodeMap.lLength; k++) // sweep down the columns
+                //colIndex+=
+                //(((_String**)ds->lData)[ds->theMap.lData[verticalList.lData[i+j]]])->sData[theNodeMap.lData[k]];
+            {
+                siteHolder[colIndex++] = (((_String**)ds->lData)[ds->theMap.lData[verticalList.lData[i+j]]])->sData[theNodeMap.lData[k]];
+            }
+
+        colIndex = siteHolder.Adler32();
+
+        long        f = siteIndices.Find ((BaseRef)colIndex);
+        _SimpleList * sameScore = nil;
+        
+        if (f>=0) {
+            sameScore = (_SimpleList*)siteIndices.GetXtra (f);
+            for (long k = 0; k<sameScore->lLength; k++) {
+                bool fit = true;
+                f = sameScore->lData[k];
+                for (long j=0; fit&&(j<unit); j++) { // sweep within one block
+                    _Site * site1 = ds->GetSite(verticalList.lData[i+j]),
+                          * site2 = ds->GetSite(theMap.lData[unit*f+j]); 
+                            
+                    for (long k=0; k<theNodeMap.lLength; k++) // sweep down the columns
+                        if (site1->sData[theNodeMap.lData[k]]!=site2->sData[theNodeMap.lData[k]]) {
+                            fit = false;
+                            break;
+                        }
+                }
+
+                if (fit) {
+                    theFrequencies[f]++;
+                    duplicateMap<<f;
+                    f = 0;
+                    break;
+                } else {
+                    f = -1;
+                }
+            }
+        }
+        if (f==-1) { // fit failed or unique site
+            if (!sameScore) {
+                sameScore = (_SimpleList*)checkPointer(new _SimpleList);
+                siteIndices.Insert ((BaseRef)colIndex,(long)sameScore,false);
+             }
+
+            (*sameScore) << theFrequencies.lLength;
+            duplicateMap<<theFrequencies.lLength;
+            theFrequencies<<1;
+            for (j=0; j<unit; j++) {
+                theMap<<verticalList.lData[i+j];
+            }
+        }
+    }
+
+    siteIndices.Clear();
+
+    duplicateMap.TrimMemory();
+    theOriginalOrder.TrimMemory();
+
+    if (copiedSelf) {
+        DeleteObject (firstOne);
+    }
+
+    SetDimensions();
+    FilterDeletions();
+
+}
+//_______________________________________________________________________
+long    _DataSetFilter::FindSpeciesName (_List& s, _SimpleList& r)
+{
+    // MOD 12/16/03
+    r.Clear();
+
+    _List           newNames;
+    _AVLListX       matched (&newNames);
+
+    for (long k=0; k<theNodeMap.lLength; k++) {
+        long i = theNodeMap.lData[k];
+        _String * uC = new _String (*(_String*)theData->theNames (i));
+        uC->UpCase();
+        matched.Insert (uC,i);
+    }
+
+    for (long m = 0; m < s.lLength; m++) {
+        _String ts (*((_String*)s(m)));
+        ts.UpCase();
+        long f = matched.Find (&ts);
+        if (f>=0) {
+            r << matched.GetXtra (f);
+        } else {
+            break;
+        }
+    }
+
+    return r.lLength;
+}
+
+//_______________________________________________________________________
+extern _String skipOmissions;
+
+void    _DataSetFilter::FilterDeletions(_SimpleList *theExc)
+{
+    _Parameter      skipo;
+    checkParameter (skipOmissions,skipo,0.0);
+
+    if (skipo>.5 || theExc ) { // delete omissions
+        //build up the list of "bad" sites
+        _SimpleList sitesWithDeletions;
+        if (!theExc) {
+            for (long i=0; i<theFrequencies.lLength; i++)
+                if (HasDeletions(i)) {
+                    sitesWithDeletions<<i;
+                }
+        } else {
+            _Parameter   *store_vec = (_Parameter*)checkPointer(new _Parameter [GetDimension(false)]);
+
+            for (long i=0; i<theFrequencies.lLength; i++) {
+                long pos = HasExclusions(i,theExc,store_vec);
+                if  (pos != -1) {
+                    sitesWithDeletions<<i;
+                    _String warnMsg ((*this)(i,pos));
+                    warnMsg = warnMsg & " was encountered in sequence "& *GetSequenceName (pos) & " at site pattern " & i
+                              & ". All corresponding alignment columns will be removed from subsequent analyses.";
+                    ReportWarning (warnMsg);
+                }
+            }
+
+            delete [] store_vec;
+        }
+
+        if (sitesWithDeletions.lLength==theFrequencies.lLength) {
+            _String errMsg ("All the sites in the datafilter have deletions and removing them creates an empty filter");
+            ReportWarning(errMsg);
+        }
+
+        _SimpleList allDeleted,
+                    dupDeletes;
+
+        for (long k=0; k < duplicateMap.lLength; k++)
+            if (sitesWithDeletions.BinaryFind (duplicateMap.lData[k]) >= 0) {
+                dupDeletes << k;
+                for (long j = 0; j < unitLength; j++ ) {
+                    allDeleted << k*unitLength + j;
+                }
+            }
+
+        duplicateMap.DeleteList (dupDeletes);
+        dupDeletes.Clear();
+        theOriginalOrder.DeleteList (allDeleted);
+        theFrequencies.DeleteList (sitesWithDeletions);
+
+
+        for (long i=0; i<sitesWithDeletions.lLength; i++) {
+            long sitePos = sitesWithDeletions.lData[i];
+
+            for (long j=0; j<unitLength; j++) {
+                theMap.lData[sitePos*unitLength+j]=-1;
+                dupDeletes << sitePos*unitLength+j;
+            }
+        }
+
+
+        if (allDeleted.lLength) {
+            /*allDeleted.Sort();*/
+
+            _String     warnMsg ("The following sites are being omitted:"),
+                        *s = (_String*)allDeleted.toStr();
+
+            if (!theExc) {
+                warnMsg = warnMsg & "(b/c of deletions/omissions)";
+            }
+
+            warnMsg = warnMsg&*s;
+            DeleteObject(s);
+            ReportWarning(warnMsg);
+
+            _SimpleList shiftIdxBy (sitesWithDeletions.lLength+theFrequencies.lLength);
+
+            long        shiftBy = sitesWithDeletions.lLength,
+                        marker  = sitesWithDeletions.lData[sitesWithDeletions.lLength-1],
+                        markerI = sitesWithDeletions.lLength-2;
+
+            shiftIdxBy.lLength = sitesWithDeletions.lLength+theFrequencies.lLength;
+
+            for (long i=shiftIdxBy.lLength-1; i>=0; i--) {
+                if (i==marker) {
+                    shiftBy--;
+                    if (markerI>=0) {
+                        marker = sitesWithDeletions.lData[markerI];
+                        markerI --;
+                    } else {
+                        marker = -1;
+                    }
+                }
+                shiftIdxBy.lData[i] = shiftBy;
+            }
+            {
+                for (long i=0; i<duplicateMap.lLength; i++) {
+                    duplicateMap.lData[i] -= shiftIdxBy.lData[duplicateMap.lData[i]];
+                }
+            }
+        }
+
+        // one final pass on theMap to clear it out
+        /*for (long i=theMap.lLength-1;i>=0;i--)
+            if (theMap(i)<0)
+                theMap.Delete(i);*/
+        _SimpleList saveMap (theMap);
+        theMap.DeleteList (dupDeletes);
+        {
+            for (long k=0; k<theMap.lLength; k++)
+                if (theMap.lData[k] < 0) {
+                    saveMap.DeleteList (dupDeletes);
+                    WarnError ("Internal Error in _DataSetFilter::FilterDeletions");
+                }
+        }
+    }
+
+}
+//_______________________________________________________________________
+_DataSetFilter*  _DataSetFilter::PairFilter (long index1, long index2, _DataSetFilter* result)
+{
+    _SimpleList species;
+    species<<theNodeMap(index1);
+    species<<theNodeMap(index2);
+    result->SetFilter (theData,unitLength,species,theMap);
+    if (theExclusions.lLength) {
+        _String* s = (_String*)theExclusions.toStr();
+        *s = s->Cut (1,s->Length()-2);
+        result->SetExclusions   (s);
+        DeleteObject(s);
+    }
+    return result;
+}
+
+//_________________________________________________________
+
+void    _DataSetFilter::MatchStartNEnd (_SimpleList& order, _SimpleList& positions, _SimpleList* parent)
+{
+    if (order.lLength == 0) {
+        return;
+    }
+
+    long p0 = order.lData[0];
+
+    _Parameter uth;
+    checkParameter (useTraversalHeuristic,uth,1.0);
+
+    if (uth>.5) {
+        if (parent)
+            for (long i = 1; i < order.lLength; i++) {
+                unsigned long
+                j       = 0,
+                n       = theNodeMap.lLength-1,
+                p0  = parent->lData[i],
+                p1  = order.lData[i];
+
+                while (CompareTwoSites(p0,p1,j)) {
+                    j++;
+                }
+                while (CompareTwoSites(p0,p1,n)) {
+                    n--;
+                }
+                n = (n<<16) + j;
+                positions << n;
+            }
+        else
+            for (long i = 1; i < order.lLength; i++) {
+                unsigned long j = 0,
+                              n = theNodeMap.lLength-1,
+                              p1 = order.lData[i];
+
+                while (CompareTwoSites(p0,p1,j)) {
+                    j++;
+                }
+                while (CompareTwoSites(p0,p1,n)) {
+                    n--;
+                }
+                n = (n<<16) + j;
+                positions << n;
+                p0 = p1;
+            }
+    } else
+        for (long i = 1; i < order.lLength; i++) {
+            unsigned long j = 0,
+                          n = theNodeMap.lLength-1;
+
+            n = (n<<16) + j;
+            positions << n;
+        }
+
+}
+
+//_______________________________________________________________________
+
+void    _DataSetFilter::SetExclusions (_String* theList, bool filter)
+{
+
+    theExclusions.Clear();
+    theList->StripQuotes();
+
+    if (theList->sLength == 0) {
+        return;
+    }
+
+    _List        *tokens = theList->Tokenize(',');
+    _SimpleList  holder;
+    _AVLList     exclusions (&holder);
+
+    for (long k = 0; k < tokens->lLength; k++) {
+        long posMarker = MapStringToCharIndex(*(_String*)((*tokens)(k)));
+
+        if (posMarker < 0) {
+            ReportWarning (_String("Exclusion request for '") & *(_String*)((*tokens)(k)) &"' does not represent a unique state and will therefore be ignored.");
+        } else {
+            if (exclusions.Insert((BaseRef)posMarker) < 0) {
+                ReportWarning (_String("Exclusion symbol for '") & *(_String*)((*tokens)(k)) &"' is included more than once.");
+            }
+        }
+    }
+
+    DeleteObject (tokens);
+    exclusions.ReorderList();
+
+    if (filter) {
+        FilterDeletions (&holder);
+    }
+
+    theExclusions<<holder;
+}
+
+//_______________________________________________________________________
+
+_String*    _DataSetFilter::GetExclusions (void)
+{
+    _String * res = new _String (16L, true);
+    checkPointer (res);
+
+    if (theExclusions.lLength) {
+        for (long k=0; k<theExclusions.lLength-1; k++) {
+            (*res) << ConvertCodeToLetters (theExclusions.lData[k], unitLength);
+            (*res) << ',';
+        }
+
+        (*res) << ConvertCodeToLetters (theExclusions.lData[theExclusions.lLength-1], unitLength);
+    }
+
+    res->Finalize();
+
+    return res;
+}
+
+//_______________________________________________________________________
+
+long    _DataSetFilter::GetDimension (bool correct)
+{
+    long result = theData->theTT->baseLength;
+    for (long i=1; i<unitLength; i++) {
+        result *= theData->theTT->baseLength;
+    }
+    if (correct) {
+        result-=theExclusions.lLength;
+    }
+    return result;
+}
+
+//____________________________________________________________________________________
+//  20110610: SLKP, some cleanup and refactoring
+
+void    _DataSet::ProcessPartition (_String& input2 , _SimpleList& target , bool isVertical, _SimpleList* additionalFilter, _SimpleList* otherDimension)
+{
+    if (!input2.sLength) {
+        return;
+    }
+    // decide if the input is an enumeration or a formula
+    long totalLength;
+
+    if (additionalFilter) {
+        totalLength = additionalFilter->lLength;
+    } else {
+        totalLength = isVertical?theMap.lLength:noOfSpecies;
+    }
+
+    _String input (input2);
+
+    if (!input.IsALiteralArgument(true)) { // not a literal argument
+        _Formula fmla, lhs;
+
+        _FormulaParsingContext fpc;
+        long     outcome = Parse (&fmla, input, fpc,&lhs);
+
+        if (outcome!=HY_FORMULA_EXPRESSION) {
+            WarnError (input & _String(" is an invalid partition specification"));
+            return;
+        }
+        _PMathObj   fV = fmla.Compute();
+        if (fV && fV->ObjectClass()==STRING) {
+            _String newSpec (128L, true);
+            newSpec << '"';
+            newSpec << ((_FString*)fV)->theString;
+            newSpec << '"';
+            newSpec.Finalize();
+            ProcessPartition (newSpec, target, isVertical, additionalFilter);
+        } else {
+            _DataSet::MatchIndices (fmla, target, isVertical, totalLength);
+        }
+    } else { // an explicit enumeration or a regular expression
+        if (input.getChar(0)=='/' && input.getChar(input.sLength-1)=='/')
+            // a regular expression
+        {
+            input.Trim(1,input.sLength-2);
+            int   errCode;
+            Ptr   regex = PrepRegExp (&input, errCode, true);
+            if (errCode) {
+                WarnError(GetRegExpError(errCode));
+                return;
+            }
+            // now set do the matching
+            // using only the sites that are specced in the additionalFilter
+
+            if (!isVertical) {
+                _SimpleList*        eligibleSeqs;
+
+                if (additionalFilter) {
+                    eligibleSeqs = additionalFilter;
+                } else {
+                    eligibleSeqs = new _SimpleList (0, totalLength, 1);
+                }
+
+                _SimpleList matches;
+                for (long specCount = 0; specCount < eligibleSeqs->lLength; specCount++) {
+                    _String pattern (theMap.lLength, false);
+                    long    seqPos = eligibleSeqs->lData[specCount];
+
+                    if (otherDimension)
+                        for (long seqSlider = 0; seqSlider < otherDimension->lLength; seqSlider ++) {
+                            pattern.sData[seqSlider] =  GetSite(otherDimension->lData[seqSlider])->sData[seqPos];
+                        }
+                    else
+                        for (long seqSlider = 0; seqSlider < theMap.lLength; seqSlider ++) {
+                            pattern.sData[seqSlider] =  GetSite(seqSlider)->sData[seqPos];
+                        }
+
+                    matches.Clear();
+                    pattern.RegExpMatch (regex, matches);
+                    if (matches.lLength) {
+                        target << specCount;
+                    }
+                }
+
+                if (eligibleSeqs != additionalFilter) {
+                    DeleteObject (eligibleSeqs);
+                }
+            } else {
+                bool         *eligibleMarks = new bool[lLength];
+                checkPointer (eligibleMarks);
+
+                for (long fillerID = 0; fillerID < lLength; fillerID++) {
+                    eligibleMarks [fillerID] = false;
+                }
+
+                if (additionalFilter)
+                    for (long siteIndex = 0; siteIndex < additionalFilter->lLength; siteIndex ++) {
+                        eligibleMarks[theMap.lData[additionalFilter->lData[siteIndex]]] = true;
+                    }
+                else
+                    for (long siteIndex = 0; siteIndex < lLength; siteIndex ++) {
+                        eligibleMarks[siteIndex] = true;
+                    }
+
+                _SimpleList matches;
+                _String     *tempString = nil;
+                if (otherDimension) {
+                    tempString = new _String (otherDimension->lLength,false);
+                }
+
+                for (long siteCounter = 0; siteCounter < lLength; siteCounter ++)
+                    if (eligibleMarks[siteCounter]) {
+                        matches.Clear();
+                        if (otherDimension) {
+                            _Site * aSite = ((_Site**)lData)[siteCounter];
+                            for (long tc = 0; tc < otherDimension->lLength; tc++) {
+                                tempString->sData[tc] = aSite->sData[otherDimension->lData[tc]];
+                            }
+                            tempString->RegExpMatch (regex, matches);
+                        } else {
+                            ((_Site**)lData)[siteCounter]->RegExpMatch (regex, matches);
+                        }
+                        if (matches.lLength == 0) {
+                            eligibleMarks[siteCounter] = false;
+                        }
+                    }
+
+                DeleteObject (tempString);
+
+                if (additionalFilter) {
+                    for (long afi = 0; afi < additionalFilter->lLength; afi++)
+                        if (eligibleMarks[theMap.lData[additionalFilter->lData[afi]]]) {
+                            target << afi;
+                        }
+                } else {
+                    for (long afi = 0; afi < theMap.lLength; afi++)
+                        if (eligibleMarks[theMap.lData[afi]]) {
+                            target << afi;
+                        }
+                }
+                delete eligibleMarks;
+            }
+            FlushRegExp (regex);
+        } else {
+            input.KillSpaces (input);
+            // now process the string
+            long count = 0,anchor,k;
+
+            _SimpleList numbers,
+                        links;
+
+            numbers.RequestSpace (1024);
+            links.RequestSpace (1024);
+
+            // first check if it is has a comb filter
+            if ((input.sData[0]=='<')&&(input.sData[input.sLength-1]=='>')) {
+                for (count=1; count<input.sLength-1; count++) {
+                    if (input.sData[count]!='0') {
+                        numbers<<count-1;
+                    }
+                }
+                if (numbers.lLength) {
+                    k = input.sLength-2; // step size
+                    anchor = 0;
+                    if (totalLength == -1) {
+                        totalLength = theMap.lLength;
+                    }
+                    while (anchor<totalLength-k) {
+                        for (count = 0; count< numbers.lLength; count++) {
+                            target<<anchor+numbers.lData[count];
+                        }
+                        anchor+=k;
+                    }
+                    if ( (k=totalLength-1-anchor) ) {
+                        for (count = 0; count< numbers.lLength; count++) {
+                            if (numbers.lData[count]>k) {
+                                break;
+                            }
+                            target<<anchor+numbers.lData[count];
+                        }
+                    }
+                    return;
+
+                }
+            }
+
+            while (count<input.sLength) {
+                anchor = count;
+                for (; (count<input.sLength)&&(isdigit(input[count])); count++) ;
+                long    aNumber = (input.Cut (anchor,count-1)).toNum();
+                if (aNumber < 0) {
+                    _String warnMsg ("A negative number was found in partition specification: ");
+                    ReportWarning (warnMsg & input.Cut (0,anchor-1) & '?' & input.Cut (anchor,-1));
+                    target.Clear();
+                    return;
+                }
+                numbers<< aNumber;
+
+                if ((input[count]=='<')||(input[count]=='>')) {
+                    _String warnMsg ("A comb partition cannot be combined with other types. The entire partition is reset to first..last");
+                    ReportWarning (warnMsg & input.Cut (0,anchor-1) & '?' & input.Cut (anchor,-1));
+                    target.Clear();
+                    return;
+                }
+                if (input[count]=='&') {
+                    links << numbers.lLength;
+                }
+                if ((input[count]==',')||(count==input.sLength)) { // wrap it up dude
+                    if (numbers.lLength==1) {
+                        target<<numbers(0);
+                    } else {
+                        if (links.lLength==0) {
+                            if (numbers[0]>numbers[1]) { // backward order
+                                for (k = numbers[0]; k>=numbers[1]; k--) {
+                                    target<<k;
+                                }
+                            } else {
+                                for (k = numbers[0]; k<=numbers[1]; k++) {
+                                    target<<k;
+                                }
+                            }
+                        } else {
+                            // linked locations
+                            if (links.lLength!=(numbers.lLength-2)/2) {
+                                _String errMsg ("A part of the partition specification has not been understood and has been skipped.");
+                                ReportWarning (errMsg);
+                                target.Clear();
+                                return;
+                            } else {
+                                _SimpleList signs;
+                                signs<<(numbers(0)<numbers(1)?1:-1);
+                                for (k = 0; k<links.lLength; k++) {
+                                    signs<<(numbers(links(k))<numbers(links(k)+1)?1:-1);
+                                }
+
+                                long l,m;
+                                for (k=numbers(0), l=0 ; signs(0)*k<=signs(0)*numbers(1); k+=signs(0), l++) {
+                                    target<<numbers(0)+l*signs(0);
+                                    for (m=0; m<links.lLength; m++) {
+                                        target<<numbers(links(m))+l*signs(m+1);
+                                    }
+                                }
+
+                            }
+                        }
+                    }
+                    numbers.Clear();
+                    links.Clear();
+                }
+                count++;
+            }
+        }
+    }
+}
+//_______________________________________________________________________
+
+void     _DataSetFilter::SetMap  (_String&s)
+{
+    theNodeMap.Clear();
+    if (s.Length()) {
+        long f,g=0;
+        //_String sc(",");
+        f = s.Find(',');
+        while (f!=-1) {
+            theNodeMap<<(long)s.Cut(g,f-1).toNum();
+            g = f+1;
+            f = s.Find (',',f+1,-1);
+        }
+        theNodeMap<<(long)s.Cut(g,-1).toNum();
+    }
+}
+
+//_________________________________________________________
+
+void    _DataSetFilter::FindAllSitesLikeThisOne (long index, _SimpleList& receptacle)
+{
+    long   oindex = theOriginalOrder.Find(index),m;
+
+    if (oindex<0) {
+        return;
+    }
+
+    if (theData->NoOfSpecies()==theNodeMap.lLength) {
+        long *matchMap = new long[unitLength];
+
+        checkPointer (matchMap);
+        for (m=0; m<unitLength; m++)
+            //matchMap[m] = theData->theMap.lData[theOriginalOrder.lData[oindex+1]];
+        {
+            matchMap[m] = theData->theMap.lData[theOriginalOrder.lData[oindex+m]];
+        }
+
+
+        for (long k=0; k<theOriginalOrder.lLength; k+=unitLength) {
+            for (m=0; m<unitLength; m++) {
+                if (theData->theMap.lData[theOriginalOrder.lData[k+m]]!=matchMap[m]) {
+                    break;
+                }
+            }
+            if (m==unitLength)
+                for (m=0; m<unitLength; m++) {
+                    receptacle<<theOriginalOrder.lData[k+m];
+                }
+        }
+
+        delete matchMap;
+    } else {
+        char ** matchMap = (char**)MemAllocate (sizeof (char*) * unitLength);
+        checkPointer (matchMap);
+
+        for (m=0; m<unitLength; m++) {
+            matchMap[m] = ((_Site*)(((BaseRef*)theData->lData)[theData->theMap.lData[oindex+m]]))->sData;
+        }
+        for (long k=0; k<theOriginalOrder.lLength; k+=unitLength) {
+            for (m=0; m<unitLength; m++) {
+                char* checkStr = ((_Site*)(((BaseRef*)theData->lData)[theData->theMap.lData[k+m]]))->sData;
+                long t;
+                for (t = 0; t<theNodeMap.lLength; t++) {
+                    if (checkStr[t]!=matchMap[m][t]) {
+                        break;
+                    }
+                }
+                if (t<theNodeMap.lLength) {
+                    break;
+                }
+            }
+            if (m==unitLength)
+                for (m=0; m<unitLength; m++) {
+                    receptacle<<theOriginalOrder.lData[k+m];
+                }
+        }
+        delete matchMap;
+    }
+}
+
+
+//_______________________________________________________________________
+
+_String&     _DataSetFilter::operator () (unsigned long site, unsigned long pos)
+{
+    if (!accessCache || accessCache->sLength != unitLength) {
+        if (accessCache) {
+            DeleteObject (accessCache);
+        }
+        checkPointer(accessCache = new _String ((unsigned long)unitLength, false));
+    }
+
+    long vIndex = theNodeMap.lData[pos];
+    if (unitLength==1) {
+        accessCache->sData[0]=(((_String**)theData->lData)[theData->theMap.lData[theMap.lData[site]]])->sData[vIndex];
+    } else {
+        site*=unitLength;
+        for (int k = 0; k<unitLength; k++) {
+            accessCache->sData[k] = (((_String**)theData->lData)[theData->theMap.lData[theMap.lData[site++]]])->sData[vIndex];
+        }
+    }
+    return *accessCache;
+}
+
+//_______________________________________________________________________
+
+void     _DataSetFilter::RetrieveState (unsigned long site, unsigned long pos, _String& reply, bool map)
+{
+    long vIndex = theNodeMap.lData[pos];
+    if (map) {
+        if (unitLength==1) {
+            reply.sData[0]=(((_String**)theData->lData)[theData->theMap.lData[theMap.lData[duplicateMap.lData[site]]]])->sData[vIndex];
+        } else {
+            site = unitLength*duplicateMap.lData[site];
+            for (int k = 0; k<unitLength; k++) {
+                reply.sData[k] = (((_String**)theData->lData)[theData->theMap.lData[theMap.lData[site++]]])->sData[vIndex];
+            }
+        }
+    } else {
+        if (unitLength==1) {
+            reply.sData[0]=(((_String**)theData->lData)[theData->theMap.lData[theMap.lData[site]]])->sData[vIndex];
+        } else
+            for (int k = 0; k<unitLength; k++) {
+                reply.sData[k] = (((_String**)theData->lData)[theData->theMap.lData[theMap.lData[site++]]])->sData[vIndex];
+            }
+    }
+}
+
+//_______________________________________________________________________
+
+void _DataSetFilter::GrabSite (unsigned long site, unsigned long pos, _String& storage)
+{
+
+    long vIndex = theNodeMap.lData[pos];
+    if (unitLength==1) {
+        storage.sData[0]=(((_String**)theData->lData)[theData->theMap.lData[theMap.lData[site]]])->sData[vIndex];
+    } else {
+        site*=unitLength;
+        for (int k = 0; k<unitLength; k++) {
+            storage.sData[k] = (((_String**)theData->lData)[theData->theMap.lData[theMap.lData[site++]]])->sData[vIndex];
+        }
+    }
+}
+
+//_______________________________________________________________________
+
+void _DataSetFilter::GrabSite (unsigned long site, unsigned long pos, char * s)
+{
+    long vIndex = theNodeMap.lData[pos];
+    if (unitLength==1) {
+        s[0]=(((_String**)theData->lData)[theData->theMap.lData[theMap.lData[site]]])->sData[vIndex];
+    } else {
+        site*=unitLength;
+        for (int k = 0; k<unitLength; k++) {
+            s[k] = (((_String**)theData->lData)[theData->theMap.lData[theMap.lData[site++]]])->sData[vIndex];
+        }
+    }
+}
+
+//_______________________________________________________________________
+
+_SimpleList* _DataSetFilter::CountAndResolve (long pattern, _Parameter * storage, bool randomly)
+// last cell in the list contains the count of distinct characters in the column
+{
+    _SimpleList* resList = new _SimpleList (theNodeMap.lLength+1,0,0),
+    counts (dimension,0,0);
+
+    checkPointer (resList);
+
+    _List        ambStates;
+    _String      aState  (unitLength, false);
+
+    _Parameter*  freqStorage = storage;
+
+    if (!freqStorage) {
+        freqStorage = new _Parameter [undimension];
+    }
+
+    long    normalizingSum = 0,
+            charCount      = 0;
+
+    for (long k=0; k<theNodeMap.lLength; k++) {
+        GrabSite (pattern, k, aState);
+        long      characterRes = Translate2Frequencies (aState, freqStorage, true);
+        if (characterRes>=0) {
+            resList->lData[k] = characterRes;
+
+            if (characterRes >= dimension) {
+                WarnError (_String("Internal error in _DataSetFilter::CountAndResolve\n"));
+            }
+
+            if ((counts.lData[characterRes]++) == 0) {
+                normalizingSum ++;
+            }
+
+            charCount ++;
+        } else {
+            _SimpleList * possibleResolutions = new _SimpleList;
+            if (!possibleResolutions) {
+                checkPointer (possibleResolutions);
+            }
+
+            (*possibleResolutions) << k;
+
+            for (long m=0; m<dimension; m++)
+                if (freqStorage[m]>0.) {
+                    (*possibleResolutions) << m;
+                }
+
+            ambStates.AppendNewInstance (possibleResolutions);
+        }
+    }
+
+    if (normalizingSum > 0) {
+        if (ambStates.lLength) {
+            _SimpleList  ambResolutions (dimension,0,0);
+            for (long t=0; t<ambStates.lLength; t++) {
+                _SimpleList * stateResolutions = (_SimpleList*)ambStates(t);
+
+                if (!randomly) {
+                    long          totalSum = 0,
+                                  idx = 0;
+
+                    for (long l=1; l<stateResolutions->lLength; l++) {
+                        long tmp = counts.lData[stateResolutions->lData[l]];
+                        if (tmp>totalSum) {
+                            idx = l;
+                            totalSum = tmp;
+                        }
+                    }
+                    if (idx > 0)
+                        // if no resolutions, resolve randomly
+                    {
+                        idx = stateResolutions->lData[idx];
+                        resList->lData[stateResolutions->lData[0]] = idx;
+                        ambResolutions.lData [idx] ++;
+                        continue;
+                    }
+
+                }
+
+                long          totalSum = 0;
+                for (long l=1; l<stateResolutions->lLength; l++) {
+                    totalSum += counts.lData[stateResolutions->lData[l]];
+                }
+
+                if (totalSum > 0) {
+                    long          randomN = genrand_real2() * totalSum - counts.lData[stateResolutions->lData[1]],
+                                  ind = 1;
+
+                    while (randomN > 0) {
+                        randomN -= counts.lData[stateResolutions->lData[++ind]];
+                    }
+
+                    totalSum = stateResolutions->lData[ind];
+                } else {
+                    long          randomN = genrand_real2() * charCount - counts.lData[0],
+                                  ind = 0;
+
+                    while (randomN > 0) {
+                        randomN -= counts.lData[++ind];
+                    }
+                }
+                resList->lData[stateResolutions->lData[0]] = totalSum;
+                ambResolutions.lData [totalSum] ++;
+            }
+
+            for (long l=0; l<dimension; l++)
+                if (ambResolutions.lData[l] && !counts.lData[l]) {
+                    normalizingSum ++;
+                }
+        }
+    }
+
+    resList->lData[theNodeMap.lLength] = normalizingSum;
+
+    if (freqStorage != storage) {
+        delete freqStorage;
+    }
+
+    return       resList;
+}
+
+//_______________________________________________________________________
+
+_Matrix* _DataSetFilter::PairwiseCompare (_SimpleList* s1, _SimpleList *s2, _List* labels)
+// s1 and s2 are the lists produced by CountAndResolve
+// if labels is not nil, then it will receive row and column labels in the contigency table
+// the result matrix has rows labeled by states in s1, and columns - by states in s2
+{
+    long    * sort1 = new long[dimension],
+    * sort2 = new long[dimension],
+    c = s2->lData[s2->lLength-1];
+
+    _Matrix * res   = new _Matrix (s1->lData[s1->lLength-1],c,false,true);
+
+    if (sort1 && sort2 && res) {
+        for (long k = 0; k<dimension; k++) {
+            sort1[k] = -1;
+            sort2[k] = -1;
+        }
+
+        long idx1 = 0,
+             idx2 = 0;
+
+        _SimpleList  *lbl1 = nil,
+                      *lbl2 = nil;
+
+        if (labels) {
+            lbl1 = new _SimpleList;
+            lbl2 = new _SimpleList;
+
+            checkPointer (lbl1);
+            checkPointer (lbl2);
+
+            (*labels) << lbl1;
+            (*labels) << lbl2;
+
+            DeleteObject (lbl1);
+            DeleteObject (lbl2);
+        }
+
+        for (long k2 = 0; k2 < s1->lLength-1; k2++) {
+            long c1 = s1->lData[k2],
+                 c2 = s2->lData[k2];
+
+            if (sort1[c1] < 0) {
+                sort1[c1] = idx1;
+                if (lbl1) {
+                    (*lbl1) << c1;
+                }
+                c1 = idx1++;
+            } else {
+                c1 = sort1[c1];
+            }
+
+            if (sort2[c2] < 0) {
+                sort2[c2] = idx2;
+                if (lbl2) {
+                    (*lbl2) << c2;
+                }
+                c2 = idx2++;
+            } else {
+                c2 = sort2[c2];
+            }
+
+            /*if ((c1>=res->GetHDim())||(c2>=res->GetVDim()))
+            {
+                printf ("\nInternal Error\n");
+            }*/
+
+            res->theData[c1*c+c2] += 1.;
+        }
+
+        delete sort1;
+        delete sort2;
+    } else {
+        checkPointer (nil);
+    }
+
+    return res;
+}
+
+//_______________________________________________________________________
+
+_List *  _DataSetFilter::ComputePatternToSiteMap (void)
+{
+    _List * result = new _List ();
+    for (long k = 0; k < theFrequencies.lLength; k++) {
+        result->AppendNewInstance (new _SimpleList);
+    }
+    for (long s = 0; s < duplicateMap.lLength; s++) {
+        *((_SimpleList**)result->lData)[duplicateMap.lData[s]] << s;
+    }
+    return result;
+}
+
+//_______________________________________________________________________
+
+char     _DataSetFilter::GetChar (unsigned long site, unsigned long pos)
+{
+    //long vIndex = theNodeMap.lLength?theNodeMap.lData[pos]:pos;
+    return (*theData)(theMap.lData[site],theNodeMap.lData[pos],1);
+}
+//_______________________________________________________________________
+
+bool     _DataSetFilter::CompareTwoSites (unsigned long site1, unsigned long site2, unsigned long pos1)
+{
+    pos1 = theNodeMap.lData[pos1];
+
+    if (unitLength == 3) { // codon
+        site1*=3;
+        site2*=3;
+        if (
+            ((((_String**)theData->lData)[theData->theMap.lData[theMap.lData[site1]]])->sData[pos1]==
+             ( ((_String**)theData->lData)[theData->theMap.lData[theMap.lData[site2]]])->sData[pos1])
+            &&((((_String**)theData->lData)[theData->theMap.lData[theMap.lData[site1+1]]])->sData[pos1]==
+               (((_String**)theData->lData)[theData->theMap.lData[theMap.lData[site2+1]]])->sData[pos1])
+            &&((((_String**)theData->lData)[theData->theMap.lData[theMap.lData[site1+2]]])->sData[pos1]==
+               (((_String**)theData->lData)[theData->theMap.lData[theMap.lData[site2+2]]])->sData[pos1])) {
+            return true;
+        }
+    } else {
+        site1*=unitLength;
+        site2*=unitLength;
+        long k;
+
+        /*if ((((_String**)theData->lData)[theData->theMap.lData[theMap.lData[site1]]])->sLength<=pos1)
+        {
+            printf ("(%d)%s\n(%d)%s\n",site1,(((_String**)theData->lData)[theData->theMap.lData[theMap.lData[site1]]])->sData,
+                    site2,(((_String**)theData->lData)[theData->theMap.lData[theMap.lData[site2]]])->sData);
+            FlagError ("Internal DataSetFilter bug\n");
+        }*/
+
+        for (k = 0; k<unitLength; k++) {
+            if ((((_String**)theData->lData)[theData->theMap.lData[theMap.lData[site1]]])->sData[pos1]!=
+                    (((_String**)theData->lData)[theData->theMap.lData[theMap.lData[site2]]])->sData[pos1]) {
+                break;
+            }
+            site1++;
+            site2++;
+        }
+        if (k==unitLength) {
+            return true;
+        }
+    }
+    return false;
+}
+
+//_______________________________________________________________________
+
+bool     _DataSetFilterNumeric::CompareTwoSites (unsigned long, unsigned long, unsigned long)
+{
+    return false;
+}
+
+
+//_______________________________________________________________________
+
+bool     _DataSetFilter::CompareTwoSitesChar (unsigned long site1, unsigned long site2, unsigned long pos1)
+{
+
+//  long *fI = theMap.quickArrayAccess();
+
+//  if (theNodeMap.lLength)
+//  {
+    pos1 = theNodeMap(pos1);
+//  }
+//  else
+//  {
+//      vIndex1=pos1;
+//  }
+//  return ((*theData)(fI[site1],pos1, 1)==(*theData)(fI[site2],pos1, 1));
+    return ((*theData)(theMap.lData[site1],pos1, 1)==(*theData)(theMap.lData[site2],pos1, 1));
+}
+//_______________________________________________________________________
+long    _DataSetFilter::SiteFrequency (unsigned long site)
+{
+    return theFrequencies.lData[site];
+}
+
+//_______________________________________________________________________
+bool    _DataSetFilter::HasDeletions (unsigned long site, _AVLList* storage)
+{
+    long        loopDim  = GetDimension();
+    _Parameter* store    = new _Parameter [loopDim];
+
+    if (!store) {
+        warnError( -108);
+    }
+
+    long j,
+         upTo = theNodeMap.lLength?theNodeMap.lLength:theData->NoOfSpecies();
+
+    bool outcome = false;
+
+    for (unsigned int k = 0; k<upTo; k++) {
+        Translate2Frequencies ((*this)(site,k), store, false);
+
+        bool oneF = false,
+             zeroF = false;
+
+        for (j=0; j<loopDim; j++) {
+            if (store[j]==0.0) {
+                zeroF = true;
+            } else if (store[j]==1.0) {
+                oneF = true;
+            }
+        }
+        if (!(oneF&&zeroF)) {
+            if (storage) {
+                outcome = true;
+                storage->Insert ((BaseRef)theNodeMap.lData[k]);
+            } else {
+                delete store;
+                return true;
+            }
+        }
+    }
+
+    delete store;
+    return outcome;
+}
+
+
+//_______________________________________________________________________
+bool    _DataSetFilter::IsConstant (unsigned long site,bool relaxedDeletions)
+{
+    _Parameter* store = nil, *store2 = nil;
+
+    store = new _Parameter [GetDimension()];
+    store2 = new _Parameter [GetDimension()];
+
+    if (!(store&&store2)) {
+        warnError(-108);
+    }
+    long j,
+         upTo = theNodeMap.lLength?theNodeMap.lLength:theData->NoOfSpecies(),
+         loopDim = GetDimension();
+
+    Translate2Frequencies ((*this)(site,0), store, false);
+
+    if (relaxedDeletions) {
+        for (unsigned int k = 1; k<upTo; k++) {
+            Translate2Frequencies ((*this)(site,k), store2, false);
+            for (j=0; j<loopDim; j++) {
+                if (store2[j]==0.0) {
+                    store[j]=0.0;
+                }
+            }
+        }
+        for (j=0; j<loopDim; j++)
+            if (store[j]!=0.0) {
+                delete store;
+                delete store2;
+                return true;
+            }
+        if (j==loopDim) {
+            delete store;
+            delete store2;
+            return false;
+        }
+    } else {
+        for (unsigned int k = 1; k<upTo; k++) {
+            Translate2Frequencies ((*this)(site,k), store2, false);
+            for (j=0; j<loopDim; j++)
+                if (store[j]!=store2[j]) {
+                    delete store;
+                    delete store2;
+                    return false;
+                }
+        }
+    }
+
+    return true;
+}
+
+//_______________________________________________________________________
+
+_Matrix*        _DataSetFilter::GetFilterCharacters (bool flip)
+{
+    long        unitLength = GetUnitLength (),
+                seqLength  = flip?theFrequencies.lLength:(GetFullLengthSpecies () / unitLength),
+                f          = NumberSpecies();
+
+    _List       result;
+
+    _String      aState ((long)GetUnitLength(),false);
+
+    if (flip) {
+        for (long k=0; k<seqLength; k++) {
+            _String *aSite = new _String (128L,true);
+            for (long k2=0; k2<f; k2++) {
+                RetrieveState(k,k2,aState,false);
+                (*aSite) << aState;
+            }
+            aSite->Finalize();
+            result      << aSite;
+            DeleteObject (aSite);
+        }
+    } else
+        for (long k=0; k<f; k++) {
+            _String *fstr = GetSequenceCharacters(k);
+            result      << fstr;
+            DeleteObject (fstr);
+        }
+
+    return new _Matrix (result);
+}
+
+//_______________________________________________________________________
+
+_String*        _DataSetFilter::GetSequenceCharacters (long seqID)
+{
+    long            unitSizeL   = GetUnitLength();
+    _String * aSequence = new _String (theOriginalOrder.lLength,true);
+
+    if (seqID >= 0 && seqID < theNodeMap.lLength) {
+        _String      aState (unitSizeL,false);
+        long        upTo = theOriginalOrder.lLength/unitSizeL;
+        for (long k2=0; k2<upTo; k2++) {
+            RetrieveState(k2,seqID,aState);
+            (*aSequence) << aState;
+        }
+    }
+    aSequence->Finalize();
+    return aSequence;
+}
+
+//_______________________________________________________________________
+long    _DataSetFilter::HasExclusions (unsigned long site, _SimpleList* theExc, _Parameter*store )
+{
+    long   filterDim = GetDimension(false);
+
+    if (theNodeMap.lLength)
+        for (unsigned long k = 0; k<theNodeMap.lLength; k++) {
+            Translate2Frequencies   ((*this)(site,k), store, false);
+
+            long                    j                       = 0,
+                                    s                      = 0;
+
+            for (j=0; j<filterDim; j++)
+                if (store[j] > 0.0) {
+                    s++;
+                    if (theExc->Find(j) < 0) {
+                        break;
+                    }
+                }
+
+            if (j == filterDim && s) {
+                return k;
+            }
+        }
+
+    return -1;
+}
+//_______________________________________________________________________
+void    _DataSetFilter::Freeze (long site)
+{
+    for (int k = 0; k<unitLength; k++) {
+        _Site* tC = (_Site*)((*(_List*)theData)(theData->theMap(this->theMap(site*unitLength+k))));
+        tC->SetRefNo(-1);
+        tC->PrepareToUse();
+    }
+}
+
+//_______________________________________________________________________
+void    _DataSetFilter::UnFreeze (long site)
+{
+    for (int k = 0; k<unitLength; k++) {
+        _Site* tC = (_Site*)((*(_List*)theData)(theData->theMap(this->theMap(site*unitLength+k))));
+        tC->SetRefNo(0);
+//      tC->Archive();
+    }
+}
+
+//_________________________________________________________
+_Matrix* _DataSetFilter::ComputePairwiseDifferences (long i, long j, char amb)
+{
+    if (unitLength > 3) {
+        WarnError ("ComputePairwiseDifferences is not implemented for data filters with unit size > 3");
+        return    new _Matrix (1,1,false,true);
+    }
+
+    long    mxDim       = GetDimension (true);
+
+    _Matrix*res         = new _Matrix  (mxDim,mxDim,false,true);
+
+    _Parameter
+    *sm1   = new _Parameter[mxDim],
+    *sm2   = new _Parameter[mxDim];
+
+
+    checkPointer (res);
+    checkPointer (sm1);
+    checkPointer (sm2);
+
+    _String      state1 (unitLength,false),
+                 state2 (unitLength,false);
+
+
+    if (!conversionCache.lLength) {
+        SetupConversion();
+    }
+
+    long        *tcodes  = conversionCache.lData+89,
+                 *ccodes  = conversionCache.lData+1,
+                  ccount   = conversionCache.lData[0];
+
+    for (long k=0; k<theFrequencies.lLength; k++) {
+        long s1 = -1,
+             s2 = -1;
+
+        int c1, c2;
+
+        c1 = (((_String**)theData->lData)[theData->theMap.lData[theMap.lData[unitLength*k]]])->sData[theNodeMap.lData[i]],
+        c2 = (((_String**)theData->lData)[theData->theMap.lData[theMap.lData[unitLength*k]]])->sData[theNodeMap.lData[j]];
+
+        if (unitLength == 1) {
+            s1 = conversionCache.lData[(c1-40)*(undimension+1)+undimension],
+            s2 = conversionCache.lData[(c2-40)*(undimension+1)+undimension];
+        } else {
+            int         c12 = (((_String**)theData->lData)[theData->theMap.lData[theMap.lData[unitLength*k+1]]])->sData[theNodeMap.lData[i]],
+                        c22 = (((_String**)theData->lData)[theData->theMap.lData[theMap.lData[unitLength*k+1]]])->sData[theNodeMap.lData[j]];
+
+
+            state1.sData[0] = c1;
+            state1.sData[1] = c12;
+
+            state2.sData[0] = c2;
+            state2.sData[1] = c22;
+
+            c1  = ccodes[c1-40];
+            c12 = ccodes[c12-40];
+
+            c2  = ccodes[c2-40];
+            c22 = ccodes[c22-40];
+
+            if (unitLength == 2) {
+                if ((c1>=0)&&(c12>=0)) {
+                    s1 = tcodes[c1*ccount+c12];
+                }
+
+                if ((c2>=0)&&(c22>=0)) {
+                    s2 = tcodes[c2*ccount+c22];
+                }
+            } else {
+                int         c13 = (((_String**)theData->lData)[theData->theMap.lData[theMap.lData[unitLength*k+2]]])->sData[theNodeMap.lData[i]],
+                            c23 = (((_String**)theData->lData)[theData->theMap.lData[theMap.lData[unitLength*k+2]]])->sData[theNodeMap.lData[j]];
+
+                //printf ("\n%c %c", c13, c23);
+
+                state1.sData[2] = c13;
+                state2.sData[2] = c23;
+
+                c13 = ccodes[c13-40];
+                c23 = ccodes[c23-40];
+
+                //printf (" %d %d %s %s\n", c13, c23, state1.sData, state2.sData);
+
+                if ((c1>=0)&&(c12>=0)&&(c13>=0)) {
+                    s1 = tcodes[ccount*(c1*ccount+c12)+c13];
+                }
+
+                if ((c2>=0)&&(c22>=0)&&(c23>=0)) {
+                    s2 = tcodes[ccount*(c2*ccount+c22)+c23];
+                }
+            }
+        }
+
+        if (s1>=0 && s2>=0)
+            // one to one
+        {
+            res->theData[s1*mxDim+s2] += theFrequencies.lData[k];
+        } else {
+            if (amb<3) {
+                _Matrix * freqsAtSite = nil;
+                if (amb) {
+                    _SimpleList   //seqList,
+                    siteList;
+
+                    //seqList  << theNodeMap[i];
+                    //seqList  << theNodeMap[j];
+
+                    for (long si = 0; si < unitLength; si++) {
+                        siteList << theMap.lData[unitLength*k+si];
+                    }
+
+                    freqsAtSite     = theData->HarvestFrequencies (unitLength, unitLength, 0, theNodeMap, siteList);
+                    if (theExclusions.lLength) {
+                        long k = 0,
+                             u = GetDimension (false);
+
+                        for (long i = 0; i<u; i++) {
+                            if (i==theExclusions.lData[k] && k<theExclusions.lLength) {
+                                k++;
+                                continue;
+                            }
+                            freqsAtSite->theData[i-k] = freqsAtSite->theData[i];
+                        }
+                    }
+                    //XferwCorrection (freqsAtSite->theData, freqsAtSite->theData, mxDim);
+                }
+
+                if (s1>=0)
+                    // one to many
+                {
+                    if (unitLength>1) {
+                        Translate2Frequencies (state2,sm1,false);
+                    } else {
+                        Translate2Frequencies (c2,sm1,false);
+                    }
+
+                    if (freqsAtSite) {
+                        if (amb == 1) {
+                            _Parameter totalW = 0.0;
+
+                            for  (long m=0; m<mxDim; m++)
+                                if (sm1[m]>0.0) {
+                                    totalW += freqsAtSite->theData[m];
+                                }
+
+                            if (totalW>0.0) {
+                                s1 = s1*mxDim;
+
+                                for  (long m=0; m<mxDim; m++,s1++)
+                                    if (sm1[m]>0.0) {
+                                        res->theData[s1] += theFrequencies.lData[k]*freqsAtSite->theData[m]/totalW;
+                                    }
+                            }
+
+                        } else {
+                            _Parameter maxW   = 0.0;
+                            long       maxIdx = -1;
+
+                            for  (long m=0; m<mxDim; m++) {
+                                if (sm1[m]>0.0) {
+                                    _Parameter myWeight = freqsAtSite->theData[m];
+                                    if (myWeight > maxW) {
+                                        maxW = myWeight;
+                                        maxIdx = m;
+                                    }
+                                }
+                            }
+
+                            if (maxIdx>=0) {
+                                res->theData[s1*mxDim+maxIdx] += theFrequencies.lData[k];
+                            }
+                        }
+                    } else {
+                        /* adopt the following convention here:
+                            - if ambig resolves to one s1 - count as a match
+                            - otherwise - count all contributions equally
+                        */
+
+                        if (sm1[s1] > 0.0) {
+                            res->theData[s1*mxDim+s1] += theFrequencies.lData[k];
+                        } else {
+                            long ambCount = 0;
+                            {
+                                for  (long m=0; m<mxDim; m++)
+                                    if (sm1[m]>0.0) {
+                                        ambCount ++;
+                                    }
+                            }
+                            s1 *= mxDim;
+
+                            _Parameter addFac = theFrequencies.lData[k]/(_Parameter)ambCount;
+
+                            for  (long m=0; m<mxDim; m++,s1++)
+                                if (sm1[m]>0.0) {
+                                    res->theData[s1] += addFac;
+                                }
+                        }
+                    }
+                } else {
+                    if (s2>=0)
+                        // many to one
+                    {
+                        if (unitLength>1) {
+                            Translate2Frequencies (state1,sm1,false);
+                        } else {
+                            Translate2Frequencies (c1,sm1,false);
+                        }
+
+                        if (freqsAtSite) {
+                            if (amb == 1) {
+                                _Parameter totalW = 0.0;
+
+                                for  (long m=0; m<mxDim; m++)
+                                    if (sm1[m]>0.0) {
+                                        totalW += freqsAtSite->theData[m];
+                                    }
+
+                                if (totalW>0.0) {
+                                    for  (long m=0; m<mxDim; m++,s2+=mxDim)
+                                        if (sm1[m]>0.0) {
+                                            res->theData[s2] += theFrequencies.lData[k]*freqsAtSite->theData[m]/totalW;
+                                        }
+                                }
+
+                            } else {
+                                _Parameter maxW   = 0.0;
+                                long       maxIdx = -1;
+
+                                for  (long m=0; m<mxDim; m++) {
+                                    if (sm1[m]>0.0) {
+                                        _Parameter myWeight = freqsAtSite->theData[m];
+                                        if (myWeight > maxW) {
+                                            maxW = myWeight;
+                                            maxIdx = m;
+                                        }
+                                    }
+                                }
+
+                                if (maxIdx>=0) {
+                                    res->theData[maxIdx*mxDim+s2] += theFrequencies.lData[k];
+                                }
+                            }
+                        } else {
+                            if (sm1[s2] > 0.0) {
+                                res->theData[s2*mxDim+s2] += theFrequencies.lData[k];
+                            } else {
+                                long ambCount = 0;
+                                for  (long m=0; m<mxDim; m++)
+                                    if (sm1[m]>0.0) {
+                                        ambCount ++;
+                                    }
+
+                                _Parameter addFac = theFrequencies.lData[k]/(_Parameter)ambCount;
+                                {
+                                    for  (long m=0; m<mxDim; m++,s2+=mxDim)
+                                        if (sm1[m]>0.0) {
+                                            res->theData[s2] += addFac;
+                                        }
+                                }
+                            }
+                        }
+                    } else
+                        // many to many
+                    {
+                        if (unitLength>1) {
+                            Translate2Frequencies (state1,sm1,false);
+                            Translate2Frequencies (state2,sm2,false);
+                        } else {
+                            Translate2Frequencies (c1,sm1,false);
+                            Translate2Frequencies (c2,sm2,false);
+                        }
+
+                        if (freqsAtSite) {
+                            if (amb == 1) {
+                                _Parameter totalW = 0.0;
+
+                                for  (long m=0; m<mxDim; m++)
+                                    if (sm1[m]>0)
+                                        for  (long m2=0; m2<mxDim; m2++)
+                                            if (sm2[m2]>0) {
+                                                totalW += freqsAtSite->theData[m]*freqsAtSite->theData[m2];
+                                            }
+
+                                if (totalW>0.0) {
+                                    for  (long m=0; m<mxDim; m++)
+                                        if (sm1[m]>0)
+                                            for  (long m2=0; m2<mxDim; m2++)
+                                                if (sm2[m2]>0) {
+                                                    res->theData[m*mxDim+m2] += theFrequencies.lData[k]*freqsAtSite->theData[m]*freqsAtSite->theData[m2]/totalW;
+                                                }
+                                }
+
+                            } else {
+                                _Parameter maxW   = 0.0;
+                                long       maxIdx  = -1,
+                                           maxIdx2 = -1;
+
+                                for  (long m=0; m<mxDim; m++)
+                                    if (sm1[m]>0)
+                                        for  (long m2=0; m2<mxDim; m2++)
+                                            if (sm2[m2]>0) {
+                                                _Parameter myWeight = freqsAtSite->theData[m]*freqsAtSite->theData[m2];
+                                                if (myWeight > maxW) {
+                                                    maxW = myWeight;
+                                                    maxIdx  = m;
+                                                    maxIdx2 = m2;
+                                                }
+                                            }
+
+                                if (maxIdx>=0) {
+                                    res->theData[maxIdx*mxDim+maxIdx2] += theFrequencies.lData[k];
+                                }
+                            }
+                        } else {
+                            long ambCount  = 0,
+                                 ambCount2 = 0,
+                                 m         = 0;
+
+                            for  (; m<mxDim; m++) {
+                                if (sm1[m]>0.0) {
+                                    if (sm2[m]>0.0) {
+                                        break;
+                                    } else {
+                                        ambCount ++;
+                                    }
+                                } else if (sm2[m]>0.0) {
+                                    ambCount2 ++;
+                                }
+                            }
+
+                            if (m==mxDim) {
+                                _Parameter addFac = theFrequencies.lData[k]/(_Parameter)(ambCount*ambCount2);
+
+                                for  (long m=0; m<mxDim; m++)
+                                    if (sm1[m]>0)
+                                        for  (long m2=0; m2<mxDim; m2++)
+                                            if (sm2[m2]>0) {
+                                                res->theData[m*mxDim+m2] += addFac;
+                                            }
+                            }
+                        }
+                    }
+                }
+                DeleteObject (freqsAtSite);
+            }
+        }
+    }
+
+    delete[] sm1;
+    delete[] sm2;
+
+    return res;
+}
+
+//_________________________________________________________
+
+void _DataSetFilter::ComputePairwiseDifferences (_Matrix& target, long i, long j)
+// matrix of dimension nx4n containing pairwise distances as follows (n=number of species)
+// first lower diag - count the same (AA,CC,GG,TT)
+// first upper diag - count AC,CA
+// 2nd   lower diag - count AG,GA
+// 2nd   upper diag - count AT,TA
+// 3rd   lower diag - count CG,GC
+// 3rd   upper diag - count CT,TC
+// 4th   lower diag - count GT,TG
+{
+    if ((target.GetHDim()!=1)||(target.GetVDim()!=7)) {
+        CreateMatrix (&target,1,7,false,true,false);
+    }
+
+    if (!theData->theTT->IsStandardNucleotide()) {
+        return;
+    }
+    long k,l,m;
+
+    for (k=0; k<7; k++) {
+        target[k] = 0;
+    }
+    k = theNodeMap.lData[i];
+    l = theNodeMap.lData[j];
+    if (l>k) {
+        m=l;
+        l=k;
+        k=m;
+    }
+
+    for (m=theMap.lLength-1; m>-1; m--) {
+        char * thisSite = GetColumn (m);
+        char a = thisSite[k],
+             b = thisSite[l],
+             c;
+
+        long fc = theFrequencies.lData[m/unitLength];
+
+        if (a>b) {
+            c=a;
+            a=b;
+            b=c;
+        }
+        if (a==b) {
+            target[0]+=fc;
+        } else {
+            if (a=='A') {
+                switch (b) {
+                case 'C': {
+                    target[1]+=fc;
+                    break;
+                }
+                case 'G': {
+                    target[2]+=fc;
+                    break;
+                }
+                case 'T': {
+                    target[3]+=fc;
+                    break;
+                }
+                }
+            } else if (a=='C') {
+                switch (b) {
+                case 'G': {
+                    target[4]+=fc;
+                    break;
+                }
+                case 'T': {
+                    target[5]+=fc;
+                    break;
+                }
+                }
+            } else if (a=='G') {
+                if (b=='T') {
+                    target[6]+=fc;
+                }
+            }
+
+        }
+    }
+}
+
+//_________________________________________________________
+
+_Matrix * _DataSetFilter::HarvestFrequencies (char unit, char atom, bool posSpec, bool countGaps)
+{
+    return theData->HarvestFrequencies (unit,atom, posSpec, theNodeMap, theOriginalOrder, countGaps);
+}
+//_______________________________________________________________________
+void    _DataSetFilter::XferwCorrection (_Matrix& source, _Parameter* target, long _length)
+{
+    long k=0;
+    _Parameter* mxdata = source.fastIndex();
+    if (theExclusions.lLength==0) {
+        for (long i = 0; i<_length; i++) {
+            target[i] = (mxdata[i]!=0.0);
+        }
+    } else {
+        for (long i = 0; i<_length; i++) {
+            if (k<theExclusions.lLength && i==theExclusions.lData[k]) {
+                k++;
+                continue;
+            }
+            target[i-k] = (mxdata[i] != 0.);
+        }
+    }
+}
+//_______________________________________________________________________
+void    _DataSetFilter::XferwCorrection (_Parameter* source, _Parameter* target, long _length)
+{
+    long k=0;
+    if (theExclusions.lLength==0) {
+        for (long i = 0; i<_length; i++) {
+            target[i] = (source[i]!=0.0);
+        }
+    } else {
+        for (long i = 0; i<_length; i++) {
+            if (i==theExclusions.lData[k] && k<theExclusions.lLength) {
+                k++;
+                continue;
+            }
+            target[i-k] = (source[i]!=0);
+        }
+    }
+}
+//_______________________________________________________________________
+
+void    _DataSetFilter::XferwCorrection (long* source, _Parameter* target, long _length)
+{
+    long k=0;
+    if (theExclusions.lLength==0) {
+        for (long i = 0; i<_length; i++) {
+            target[i] = source[i];
+        }
+    } else {
+        for (long i = 0; i<_length; i++) {
+            if (i==theExclusions[k]) {
+                k++;
+                continue;
+            }
+            target[i-k] = source[i];
+        }
+    }
+}
+
+/*
+//_______________________________________________________________________
+long    _DataSetFilter::GetVectorCode(long site,long seq)
+{
+    if (!symbolVector) return -1;
+    long* fi = symbolVector->quickArrayAccess();
+    return fi[*fi*site+seq+1];
+}
+//_______________________________________________________________________
+
+void    _DataSetFilter::ProduceSymbolVector(bool smear)
+{
+    // compute the size of the vector cells
+    _Parameter cellSize=log((_Parameter)theData->theTT->LengthOfAlphabet())*_Parameter(unitLength)/log(128.0);
+    if (cellSize>2.0)
+    {
+        _String errMsg ("DataSetFilter has more than 32767 states, which is currently unsupported");
+        FlagError(errMsg);
+    }
+    long intCellSize = cellSize>1.0?2:1;
+    // now produce the conversion vector
+    long sites = theMap.lLength, species= theNodeMap.lLength?theNodeMap.lLength:theData->NoOfSpecies();
+    symbolVector = new _SimpleList ();
+    checkPointer(symbolVector);
+//  (*symbolVector)<<intCellSize;
+    (*symbolVector)<<species;
+    // we will now speciate into byte and word size cases
+    // the data will be stored column by column
+    // if there is a unique code translation, we then store that code in the symbol vector for faster
+    // processing during tree pruning business.
+    // use a standard convert to frequencies function to check whether a character has a unique convertion
+    if (intCellSize==1) // char based storage
+    {
+        union
+        {
+            long composite;
+            char bytes[sizeof(long)];
+        } converterb;
+        char byteposition = 0, bytesPerLong = sizeof(long);
+        for (long i=0;i<sites;i++)
+        {
+            for (long j=0; j<species; j++)
+            {
+//              if (byteposition==bytesPerLong)
+//              {
+//                  byteposition = 0;
+//                  (*symbolVector)<<converterb.composite;
+//              }
+//              converterb.bytes[byteposition]=(char)Translate2Frequencies((*this)(i,j),nil,smear,false);
+//              byteposition++;
+                (*symbolVector)<<Translate2Frequencies((*this)(i,j),nil,smear,false);
+            }
+        }
+        if (byteposition)
+        {
+            for(long i=sizeof(long)-1;i>=byteposition;i--)
+            {
+                converterb.bytes[i]=0;
+            }
+            (*symbolVector)<<converterb.composite;
+        }
+
+    }
+    else
+    {
+        union
+        {
+            long composite;
+            short int words[sizeof(long)/2];
+        } converterw;
+        char wordposition = 0, wordsPerLong = sizeof(long);
+        for (long i=0;i<sites;i++)
+        {
+            for (long j=0; j<species; j++)
+            {
+                if (wordposition==wordsPerLong)
+                {
+                    wordposition = 0;
+                    (*symbolVector)<<converterw.composite;
+                }
+                converterw.words[wordposition]=(char)Translate2Frequencies((*this)(i,j),nil,smear,false);
+            }
+        }
+        if (wordposition)
+        {
+            for(long i=sizeof(long)/2-1;i>=wordposition;i--)
+            {
+                converterw.words[i]=0;
+            }
+            (*symbolVector)<<converterw.composite;
+        }
+    }
+}*/
+
+//_______________________________________________________________________
+
+long    _DataSetFilter::CorrectCode (long code)
+{
+    if (theExclusions.lLength!=0) {
+        for (long k=0; k<theExclusions.lLength; k++)
+            if (code>=theExclusions.lData[k]) {
+                code++;
+            }
+    }
+    return code;
+}
+
+//_______________________________________________________________________
+long    _DataSetFilter::Translate2Frequencies (_String& str, _Parameter* parvect, bool smear)
+{
+    long count      = 0,
+         nonzeropos = 0,
+         store      [HYPHY_SITE_DEFAULT_BUFFER_SIZE];
+
+
+    if (unitLength == 1) {
+        theData->theTT->TokenCode (str.sData[0],store,smear);
+        if (theExclusions.lLength==0) {
+            for (long i = 0; i<undimension; i++)
+                if ( (parvect[i]=store [i]) ) {
+                    nonzeropos = i;
+                    count++;
+                }
+        } else {
+            long k=0;
+            for (long i = 0; i<undimension; i++) {
+                if (i==theExclusions.lData[k] && k<theExclusions.lLength) {
+                    k++;
+                } else if ( store [i] ) {
+                    nonzeropos = i;
+                    count++;
+                }
+                parvect[i-k]=store[i];
+            }
+        }
+        if (count == 0) {
+            if (smear)
+                for (long i = 0; i<undimension; i++) {
+                    parvect[i] = 1.;
+                }
+
+            return -1;
+        }
+
+        if (count>1) {
+            return -1;
+        }
+
+        return nonzeropos;
+    } else {
+        //pull the frequencies out of the Translation table
+        _Matrix     out (undimension,1,false,true);
+
+        long        m,
+                    n,
+                    index = 0,
+                    shifter = 1,
+                    *lp,
+                    *storeP;
+
+        _Parameter* fl;
+
+        if (theData->theTT->baseLength * unitLength >= HYPHY_SITE_DEFAULT_BUFFER_SIZE) {
+            storeP = new long [theData->theTT->baseLength * unitLength];
+        } else {
+            storeP = store;
+        }
+
+        count = 1;
+        for (m = 0; m<unitLength; m++ ) {
+            theData->theTT->TokenCode (str.sData[m], storeP+theData->theTT->baseLength*m);
+        }
+
+        for (m = unitLength-1; m>=0; m--) {
+            int smcount = 0;
+            lp = storeP+theData->theTT->baseLength*m;
+            for (n = 0; n<theData->theTT->baseLength; n++,lp++) {
+                if (*lp) {
+                    index += shifter*n;
+                    smcount++;
+                }
+            }
+            if ((smcount==0)&&smear) { // deletion -- replace with 1's
+                lp = storeP+theData->theTT->baseLength*m;
+                for (n = 0; n<theData->theTT->baseLength; n++,lp++) {
+                    *lp=1;
+                }
+                smcount = theData->theTT->baseLength;
+            }
+
+            shifter*=theData->theTT->baseLength;
+            count *=smcount;
+        }
+
+
+        if (count>1) {
+            theData->constructFreq (storeP, out.theData, 1, 0, count, unitLength-1 , 1, 0);
+        } else if (count == 1) {
+            out.theData[index] = count;
+        }
+
+        if (storeP != store) {
+            delete [] storeP;
+        }
+
+        if (count==1) {
+            fl = out.theData;
+            m = 0;
+            if (theExclusions.lLength) {
+                for (n = 0; n<undimension; n++, fl++) {
+                    if (m <theExclusions.lLength && n==theExclusions.lData[m]) {
+                        m++;
+                        continue;
+                    }
+
+
+                    if (*fl>0.) {
+                        parvect[n-m] = 1.0;
+                        break;
+                    } else {
+                        parvect[n-m] = 0.0;
+                    }
+                }
+                if (n<undimension) {
+                    n-=m-1;
+                    parvect+=n;
+                    for (; n<dimension; n++,parvect++) {
+                        *parvect = 0.0;
+                    }
+                    return index-m;
+                } else {
+                    if (smear)
+                        for (n = 0; n<dimension; n++, parvect++) {
+                            *parvect = 1.0;
+                        }
+                    return -1;
+                }
+
+            } else {
+                if (count) {
+                    for (n = 0; n<undimension; n++,fl++) {
+                        parvect[n] = *fl>0.0?1.0:0.0;
+                    }
+                }
+                return index;
+            }
+        } else {
+            XferwCorrection(out, parvect,undimension);
+
+            if (smear) {
+                for (count = 0; count<dimension; count++)
+                    if (parvect[count]>0.0) {
+                        break;
+                    }
+                if (count==dimension) {
+                    for (count = 0; count<dimension; count++) {
+                        parvect[count]=1.0;
+                    }
+                }
+            }
+            return -1;
+        }
+    }
+    return 0;
+}
+
+
+//_______________________________________________________________________
+
+long    _DataSetFilter::MapStringToCharIndex (_String& str)
+{
+    long    count       = 0,
+            nonzeropos  = 0,
+            store       [HYPHY_SITE_DEFAULT_BUFFER_SIZE];
+
+    if (unitLength == 1) {
+        theData->theTT->TokenCode (str.sData[0],store);
+
+        if (theExclusions.lLength==0) {
+            for (long i = 0; i<undimension; i++)
+                if (store [i]) {
+                    nonzeropos = i;
+                    count++;
+                }
+        } else {
+            long k=0;
+            for (long i = 0; i<undimension; i++) {
+                if (i==theExclusions.lData[k] && k<theExclusions.lLength) {
+                    k++;
+                } else if ( store [i] ) {
+                    nonzeropos = i;
+                    count++;
+                }
+            }
+        }
+
+        if (count != 1) {
+            return -1;
+        }
+
+        return nonzeropos;
+    } else {
+        long    m,
+                n,
+                index = 0,
+                shifter = 1,
+                *lp,
+                *storeP;
+
+        count = 1;
+
+        if (theData->theTT->baseLength * unitLength >= HYPHY_SITE_DEFAULT_BUFFER_SIZE) {
+            storeP = new long [theData->theTT->baseLength * unitLength];
+        } else {
+            storeP = store;
+        }
+
+        for (m = 0; m<unitLength; m++ ) {
+            theData->theTT->TokenCode (str.sData[m], storeP+theData->theTT->baseLength*m);
+        }
+
+        for (m = unitLength-1; m>=0; m--) {
+            int smcount = 0;
+
+            lp = storeP+theData->theTT->baseLength*m;
+
+            for (n = 0; n<theData->theTT->baseLength; n++,lp++)
+                if (*lp) {
+                    index += shifter*n;
+                    smcount++;
+                }
+
+            if (smcount==0) {
+                lp = storeP+theData->theTT->baseLength*m;
+
+                for (n = 0; n<theData->theTT->baseLength; n++,lp++) {
+                    *lp=1;
+                }
+
+                smcount = theData->theTT->baseLength;
+            }
+
+            shifter *= theData->theTT->baseLength;
+
+            count *=smcount;
+        }
+
+
+        if (storeP != store) {
+            delete [] storeP;
+        }
+
+        if (count==1) {
+            m = 0;
+            if (theExclusions.lLength) {
+                for (long exc = 0; exc < theExclusions.lLength; exc++)
+                    if (index == theExclusions.lData[exc]) {
+                        return -1;
+                    } else if (theExclusions.lData[exc] > index) {
+                        return index - exc;
+                    }
+
+                return index - theExclusions.lLength;
+            } else {
+                return index;
+            }
+        } else {
+            return -1;
+        }
+    }
+
+    return 0;
+}
+
+
+//_______________________________________________________________________
+long    _DataSetFilter::Translate2Frequencies (char s, _Parameter* parvect, bool smear)
+{
+    long     count =0,
+             store [HYPHY_SITE_DEFAULT_BUFFER_SIZE];
+
+    theData->theTT->TokenCode (s,store, smear);
+
+    if (theExclusions.lLength) {
+        long k = 0;
+        for (long i = 0; i<undimension; i++) {
+            if (i==theExclusions[k]) {
+                k++;
+            } else if ( store [i] ) {
+                count++;
+            }
+        }
+        if (count) {
+            XferwCorrection (store, parvect,undimension);
+        }
+    } else {
+        for (long i = 0; i<undimension; i++)
+            if ( (parvect[i]=store [i]) ) {
+                count++;
+            }
+    }
+
+    if (count == 0 && smear)
+        for (long i = 0; i<undimension; i++) {
+            parvect[i] = 1.0;
+        }
+
+    return count==1?1:-1;
+}
+
+//_______________________________________________________________________
+long    _DataSetFilter::LookupConversion (char s, _Parameter* parvect)
+{
+    if (undimension==4) {
+        //int idx = (s-40)*5;
+        long* cCache = conversionCache.lData+(s-40)*5;
+        /*parvect[0] = conversionCache.lData[idx++];
+        parvect[1] = conversionCache.lData[idx++];
+        parvect[2] = conversionCache.lData[idx++];
+        parvect[3] = conversionCache.lData[idx++];
+        return conversionCache.lData[idx];*/
+        parvect[0] = *cCache;
+        cCache++;
+        parvect[1] = *cCache;
+        cCache++;
+        parvect[2] = *cCache;
+        cCache++;
+        parvect[3] = *cCache;
+        return *(++cCache);
+
+    } else {
+        int idx = (s-40)*(undimension+1);
+        for (long i=0; i<undimension; parvect[i++] = conversionCache.lData[idx++]) ;
+        return conversionCache.lData[idx];
+    }
+}
+
+//_______________________________________________________________________
+void    _DataSetFilter::SetupConversion (void)
+{
+    if (conversionCache.lLength) {
+        return;
+    }
+
+    if ( unitLength==1 ) { // do stuff
+        char c = 40;
+
+        long i,
+             charCount,
+             theCode;
+
+        _Parameter *temp    = new _Parameter [undimension+1];
+
+        while(c<127) {
+            for (i=0; i<undimension; i++) {
+                temp[i]=0;
+            }
+
+            Translate2Frequencies(c,temp,true);
+
+            charCount = -1;
+            for (i=0; i<undimension; i++) {
+                theCode =  (long)temp[i];
+                conversionCache <<theCode;
+                if (theCode) {
+                    if (charCount==-1) {
+                        charCount = i;
+                    } else {
+                        charCount = -2;
+                    }
+                }
+            }
+            conversionCache<<charCount;
+            c++;
+        }
+        delete[] temp;
+    } else {
+        if (unitLength==2 || unitLength==3) {
+            _String alphabet (16,true);
+            if (theData->theTT->baseSet.sLength == 0) {
+                if (theData->theTT->baseLength == 4) {
+                    alphabet << 'A';
+                    alphabet << 'C';
+                    alphabet << 'G';
+                    alphabet << 'T';
+                } else {
+                    if (theData->theTT->baseLength == 20) {
+                        alphabet << 'A';
+                        alphabet << 'C';
+                        alphabet << 'D';
+                        alphabet << 'E';
+                        alphabet << 'F';
+                        alphabet << 'G';
+                        alphabet << 'H';
+                        alphabet << 'I';
+                        alphabet << 'K';
+                        alphabet << 'L';
+                        alphabet << 'M';
+                        alphabet << 'N';
+                        alphabet << 'P';
+                        alphabet << 'Q';
+                        alphabet << 'R';
+                        alphabet << 'S';
+                        alphabet << 'T';
+                        alphabet << 'V';
+                        alphabet << 'W';
+                        alphabet << 'Y';
+                    } else {
+                        alphabet << '0';
+                        alphabet << '1';
+                    }
+                }
+            } else {
+                alphabet << &theData->theTT->baseSet;
+            }
+
+
+            alphabet.Finalize();
+
+
+            long  ccache [88],
+                  i,
+                  k = GetDimension(false) ;
+
+            conversionCache.RequestSpace (89+k);
+            conversionCache << alphabet.sLength;
+
+            for (i=0; i<88; i++) {
+                ccache[i] = -1;
+            }
+            for (i=0; i<alphabet.sLength; i++) {
+                ccache [alphabet.sData[i]-40] = i;
+            }
+            for (i=0; i<88; i++) {
+                conversionCache << ccache[i];
+            }
+
+            long       *tcache = new long [k];
+            checkPointer (tcache);
+            //_Parameter *vcache = new _Parameter [k];
+            //checkPointer (vcache);
+
+            if (unitLength == 3) {
+                _String s (3,false);
+                i = 0;
+                for (long a = 0; a<alphabet.sLength; a++,i+=alphabet.sLength*alphabet.sLength) {
+                    s.sData[0] = alphabet.sData[a];
+                    for (long b = 0; b<alphabet.sLength; b++) {
+                        s.sData[1] = alphabet.sData[b];
+                        for (long c = 0; c<alphabet.sLength; c++) {
+                            s.sData[2] = alphabet.sData[c];
+                            //tcache [i+b*alphabet.sLength+c] = Translate2Frequencies (s,vcache,true);
+                            tcache [i+b*alphabet.sLength+c] = MapStringToCharIndex (s);
+                        }
+                    }
+                }
+            } else {
+                _String s (2,false);
+                i = 0;
+                for (long a = 0; a<alphabet.sLength; a++,i+=alphabet.sLength) {
+                    s.sData[0] = alphabet.sData[a];
+                    for (long b = 0; b<alphabet.sLength; b++) {
+                        s.sData[1] = alphabet.sData[b];
+                        //tcache [i+b] = Translate2Frequencies (s,vcache,true);
+                        tcache [i+b] = MapStringToCharIndex (s);
+                    }
+                }
+            }
+            for (i=0; i<k; i++) {
+                conversionCache << tcache[i];
+            }
+
+            //delete vcache;
+            delete [] tcache;
+        }
+    }
+}
+
+
+
+//_________________________________________________________
+//_________________________________________________________
+// reading the data set file in here
+
+
+
+//_________________________________________________________
+void    checkTTStatus (FileState* fs) // check whether the translation table needs to be refreshed
+{
+    if (fs->translationTable == &defaultTranslationTable) {
+        fs->translationTable =  (_TranslationTable*)defaultTranslationTable.makeDynamic();
+    }
+}
+//_________________________________________________________
+void    processCommand (_String*s, FileState*fs)
+{
+    // loop thru understood values of commands
+    static _List CommandList;
+    if (CommandList.lLength == 0)
+        // first time in, should init commands
+    {
+        _String command ("BASESET");
+        CommandList&& & command;
+        command="FORMAT";
+        CommandList&& & command;
+        command="RAWLINE";
+        CommandList&& & command;
+        command="REPEAT";
+        CommandList&& & command;
+        command="TOKEN";
+        CommandList&& & command;
+    }
+
+    long f = -1;
+    long i,k = 0,l = 0,m;
+    for (i=0; (i<CommandList.lLength); i++) {
+        f = s->Find (*(_String*)CommandList(i));
+        if (f!=-1) {
+            break;
+        }
+    }
+
+    if (f==-1) { // unrecognized command
+        return;
+    } else {
+        // trim the string
+        s->Trim (f+((_String*)CommandList(i))->Length(),-1);
+        f = s->Find (":");
+        if (f==-1) { // poorly formed command
+            return;
+        } else {
+            s->Trim (f+1,-1);
+        }
+
+        if ((i>=1)&&(i<=3)) {
+            k = s->Find ('\"');
+            if (k==-1) {
+                return;
+            }
+            l = s->Find ('\"', k+1,-1);
+            if (l==-1) {
+                return;
+            }
+            if (l<=k) {
+                return;
+            }
+            s->Trim (k+1,l-1);
+        }
+
+        switch (i) {
+            char c;
+        case 4: // new token
+            checkTTStatus (fs);
+            // attempt to extract a token. Looking for (e.g):   "c" = "AC"
+            k = s->Find ('"');
+            if (k==-1) {
+                return;
+            }
+            if ((*s)[k+2]!='"') {
+                return;
+            }
+            l = s->Find ('"',k+3,-1);
+            m = s->Find ('"',l+1,-1);
+            if ((l==-1)||(m==-1)) {
+                return;
+            }
+
+            c = (*s)[k+1];
+            s->Trim (l+1,m-1);
+            fs->translationTable->AddTokenCode (c,*s);
+            break;
+
+
+        case 0:// new code set, e.g  "ACGU"
+            checkTTStatus(fs);
+            // erase previous char definitions
+            fs->translationTable->translationsAdded.Clear();
+            fs->translationTable->tokensAdded = "";
+            if (*s!=_String("BASE20")) {
+                fs->translationTable->AddBaseSet (*s);
+            } else {
+                fs->translationTable->AddBaseSet (empty);
+                fs->translationTable->baseLength = 20;
+            }
+            break;
+
+        case 1: //FORMAT
+            if (*s==_String("PHYLIPI")) { // PHYLIP Interleaved
+                fs->fileType = 1;
+                fs->interleaved = TRUE;
+            } else if (*s==_String("PHYLIPS")) { // PHYLIP sequential
+                fs->fileType = 1;
+                fs->interleaved = FALSE;
+            }
+            if (*s==_String("RAW")) { // RAW Sequential Data (as in NEXUS)
+                fs->fileType = 2;
+                fs->interleaved = FALSE;
+            }
+            fs->autoDetect = false;
+            break;
+
+        case 3: // REPEAT CHAR
+            fs->repeat = s->getChar(0);
+            break;
+
+        case 2: // RAWLINE template e.g 1,-1 skips one word at the beginning and one word at the end
+            _List chips (s,',');
+            for (int i = 0; i<chips.lLength; i++) {
+                fs->rawLinesFormat<<(long)(((_String*)chips(i))->toNum());
+            }
+
+        }
+    }
+}
+//_________________________________________________________
+
+void    FilterRawString (_String& s, FileState* fs, _DataSet & ds)
+{
+    int i;
+    for (i = 0; i<fs->rawLinesFormat.lLength; i++) {
+        long f = fs->rawLinesFormat (i),p=0,l=0;
+        if (f>0) {
+            for (int j = 0; (j<f)&&(p>=0)&&(l>=0); j++) {
+                p = s.FirstNonSpaceIndex(l,-1,1);
+                l = s.FirstSpaceIndex(p,-1,1);
+            }
+            if (l<0) {
+                break;
+            }
+            p = s.FirstNonSpaceIndex(l,-1,1);
+            s.Trim(p,-1);
+        } else {
+            if (f!=0) {
+                p = 0;
+                l = 0;
+                for (int j = 0; (j>f)&&(p>=0)&&(l>=0); j--) {
+                    p = s.FirstNonSpaceIndex(p,-1,-1);
+                    l = s.FirstSpaceIndex(0,p,-1);
+                }
+                if (l<0) {
+                    break;
+                }
+                p = s.FirstNonSpaceIndex(0,l,-1);
+                s.Trim(0,p);
+            } else {
+                // Name
+                p = s.FirstNonSpaceIndex();
+                l = s.FirstSpaceIndex(p+1,-1,1);
+                if ((p<0)||(l<0)) {
+                    break;
+                }
+                _String Name = s.Cut (p,l-1);
+                ds.AddName (Name);
+                s.Trim (s.FirstNonSpaceIndex(l,-1,1),-1);
+            }
+        }
+
+    }
+    if (i!=fs->rawLinesFormat.lLength) {
+        s = "";
+    }
+}
+//_________________________________________________________
+void    ProcessTree (FileState *fState, FILE* f, _String& CurrentLine)
+{
+    long j = 0, i=0; // parenthesis balance
+    char c;
+    _String treeString ((unsigned long)10, true);
+    do {
+        for (i=0; i<CurrentLine.sLength; i++) {
+            c = CurrentLine.sData[i];
+            if (!isspace (c)) {
+                treeString<<c;
+                if (c==')') {
+                    j--;
+                    if (!j) {
+                        break;
+                    }
+                } else if (c=='(') {
+                    j++;
+                }
+            }
+
+        }
+        ReadNextLine (f,&CurrentLine,fState, false);
+    } while (j&&CurrentLine.sLength);
+
+    if (j) {
+        _String errMsg ("Tree string found in data file had unbalanced parentheses: ");
+        if (j>0) {
+            errMsg = errMsg & j & " too few closing parentheses.";
+        } else {
+            errMsg = errMsg & (-j) & " too many closing parentheses.";
+        }
+        ReportWarning (errMsg);
+    } else {
+        treeString.Finalize();
+        setParameter (dataFileTree,1.0,fState->theNamespace);
+        setParameter (dataFileTreeString, new _FString (treeString), false);
+    }
+
+}
+
+//_________________________________________________________
+
+long    ProcessLine (_String&s , FileState *fs, _DataSet& ds)
+{
+    long sitesAttached = 0,sL=s.Length();
+
+    for (long l = 0; l<sL; l++) {
+        // see if it is a legal char
+        char c = toupper (s.sData[l]);
+        if (fs->translationTable->IsCharLegal(c)) { // go on
+            if (fs->curSpecies==0) { // add new column
+                ds.AddSite (c);
+                sitesAttached++;
+            } else { //append to exisiting column
+                //if (c == fs->skip) continue;
+                // check to see if this species needs to be padded
+
+                if (c == fs->repeat) {
+                    if (fs->curSite+sitesAttached >= ds.lLength) { // a dot not matched by a previously read character; ignore
+                        return sitesAttached;
+                    }
+
+                    c = ((_Site*)(ds._List::operator () (fs->curSite+sitesAttached)))->getChar(0);
+                    if (c==0)
+                        c = ((_Site*)(ds._List::operator ()
+                                      (((_Site*)(ds._List::operator () (fs->curSite+sitesAttached)))->GetRefNo())))->getChar(0);
+                }
+
+                if (fs->curSite+sitesAttached+1>fs->totalSitesRead) {
+                    // pad previous species to full length
+                    _Site * newS = new _Site (fs->skip);
+                    checkPointer (newS);
+
+                    for (long j = 1; j<fs->curSpecies; j++) {
+                        (*newS) << fs->skip;
+                    }
+
+                    (*newS) << c;
+
+                    /*long rN = ds.dsh->incompletePatterns->Find (newS);
+
+                    if (rN>=0)
+                    {
+                        rN =  ds.dsh->incompletePatterns->GetXtra (rN);
+                        ds.theFrequencies[rN]++;
+                        newS->Clear();
+                        newS->SetRefNo(rN);
+                        ds.theFrequencies << 0;
+                    }
+                    else
+                    {*/
+                    ds.theFrequencies << 1;
+                    newS->SetRefNo(-1);
+                    //}
+
+                    ds << newS;
+                    newS->nInstances --;
+
+                    fs->totalSitesRead++;
+                } else {
+                    ds.Write2Site (fs->curSite+sitesAttached, c);
+                }
+
+                sitesAttached++;
+            }
+        }
+    }
+    // make sure that this species has enough data in it, and if not - pad it with '?'
+
+    if ((fs->curSite+sitesAttached<fs->totalSitesRead)&&(fs->interleaved)) {
+        // pad this species to full length
+        for (long j = fs->curSite+sitesAttached; j<fs->totalSitesRead; j++) {
+            ds.Write2Site (j, fs->skip);
+        }
+    }
+    if (!fs->curSpecies) {
+        fs->totalSitesRead+=sitesAttached;
+    }
+    return sitesAttached;
+}
+
+//_________________________________________________________
+void    PadLine (FileState& fState, _DataSet& result) // make sure that there is enough data in this line
+// and if not - "pad" it with '?''s
+{
+    if (fState.curSite<fState.totalSitesRead) // pad line if needed
+        for (long j = fState.curSite; j<fState.totalSitesRead; j++) {
+            result.Write2Site (j, fState.skip);
+        }
+}
+
+//_________________________________________________________
+void    ISelector (FileState& fState, _String& CurrentLine, _DataSet& result)
+{
+    if (fState.interleaved) { // interleaved file
+        if (fState.curSpecies&&(!((fState.curSpecies)%fState.totalSpeciesExpected))) { // read a chunk of all species
+            if (fState.totalSitesRead && !result.InternalStorageMode()) {
+                for (long i = fState.curSite; i<fState.totalSitesRead; i++) {
+                    result.Compact(i);
+                }
+
+                result.ResetIHelper();
+
+            }
+            fState.curSite = fState.totalSitesRead;
+            fState.curSpecies = 0;
+            ProcessLine (CurrentLine, &fState, result);
+            fState.curSpecies = 1;
+            if (!fState.curSite) {
+                fState.totalSpeciesRead++;
+            }
+        } else {
+            ProcessLine (CurrentLine, &fState, result);
+            if (!fState.curSite) {
+                fState.totalSpeciesRead++;
+            }
+            fState.curSpecies++;
+        }
+    } else {
+        if (fState.curSpecies+1<fState.totalSpeciesExpected) {
+            fState.curSpecies++;
+        }
+        if (fState.curSpecies == fState.totalSpeciesRead) {
+            PadLine (fState, result);
+            fState.curSite = 0;
+        }
+        if (fState.totalSpeciesRead<fState.totalSpeciesExpected) {
+            fState.totalSpeciesRead++;
+        }
+
+        fState.curSite+=ProcessLine (CurrentLine, &fState, result);
+
+    }
+}
+
+//_________________________________________________________
+bool SkipLine (_String& theLine, FileState* fS)
+{
+    if ( theLine.sData[0]=='/' && theLine.sData[1]=='/' ) {
+        return true;
+    }
+
+    char c = theLine.FirstNonSpace();
+
+    if (c&& (!((c=='$')&&(!fS->acceptingCommands))) ) {
+        return false;
+    }
+
+    return true;
+}
+
+//_________________________________________________________
+
+#define     READ_NEXT_LINE_BUFFER_SIZE      1024*1024
+
+
+//_________________________________________________________
+void ReadNextLine (FILE* fp, _String *s, FileState* fs, bool, bool upCase)
+{
+    _String  tempBuffer (1024L, true);
+
+    char lastc;
+
+    if (fp) {
+        lastc = fgetc(fp);
+    } else {
+        lastc = fs->pInSrc<fs->theSource->sLength?fs->theSource->sData[fs->pInSrc++]:0;
+    }
+
+    if (fs->fileType != 3) { // not NEXUS - do not skip [..]
+        if (fp)
+            while ( !feof(fp) && lastc!=10 && lastc!=13 ) {
+                if (lastc) {
+                    tempBuffer << lastc;
+                }
+
+                lastc = fgetc(fp);
+            }
+        else
+            while (lastc && lastc!=10 && lastc!=13 ) {
+                tempBuffer << lastc;
+                lastc = fs->theSource->sData[fs->pInSrc++];
+            }
+
+    } else {
+        if (upCase) {
+            lastc = toupper(lastc);
+        }
+
+        while (((fp&&(!feof(fp)))||(fs->theSource&&(fs->pInSrc<=fs->theSource->sLength))) && lastc!=10 && lastc!=13) {
+            if (lastc=='[') {
+                if (fs->isSkippingInNEXUS) {
+                    ReportWarning ("Nested comments in NEXUS really shouldn't be used.");
+                } else {
+                    fs->isSkippingInNEXUS = true;
+                }
+            }
+            if (fs->isSkippingInNEXUS) {
+                if (lastc==']') {
+                    fs->isSkippingInNEXUS = false;
+                    tempBuffer << ' ';
+                }
+            } else {
+                tempBuffer << lastc;
+            }
+
+            if (fp) {
+                if (upCase) {
+                    lastc = toupper(fgetc(fp));
+                } else {
+                    lastc = fgetc(fp);
+                }
+            } else {
+                if (upCase) {
+                    lastc = toupper(fs->theSource->sData[fs->pInSrc++]);
+                } else {
+                    lastc = fs->theSource->sData[fs->pInSrc++];
+                }
+            }
+
+        }
+
+        if ( lastc==10 || lastc==13 ) {
+            tempBuffer << ' ';
+        }
+    }
+
+    tempBuffer.Finalize();
+
+    if ( (fp && feof(fp)) || (fs->theSource && fs->pInSrc >= fs->theSource->sLength) )
+        if (tempBuffer.sLength == 0) {
+            *s = "";
+            return;
+        }
+
+    if (s->nInstances > 1) {
+        *s = tempBuffer;
+    } else {
+        Ptr         saveData = s->sData;
+        s->sData    = tempBuffer.sData;
+        tempBuffer.sData = saveData;
+
+        s->sLength  = tempBuffer.sLength;
+    }
+
+    if (SkipLine (*s, fs)) {
+        ReadNextLine(fp,s,fs,false,upCase);
+    }
+
+    if (s->sLength && s->sData[s->sLength-1]== '\n') {
+        s->Trim (0,s->sLength-2);
+    }
+}
+//_________________________________________________________
+void    TrimPhylipLine (_String& CurrentLine, _DataSet& ds)
+{
+    int  fNS      = CurrentLine.FirstNonSpaceIndex(),
+         space2   = CurrentLine.FirstSpaceIndex (fNS + 1);
+    
+    // hack for PAML support
+    if (space2 > fNS && isspace(CurrentLine.getChar (space2+1))) {
+        _String     sequence_name (CurrentLine,fNS, space2);
+        CurrentLine.Trim(space2+2,-1); // chop out the name
+        ds.AddName(sequence_name);        
+    } else {
+        _String     sequence_name (CurrentLine,fNS, fNS+9);
+        CurrentLine.Trim(fNS+10,-1); // chop out the name
+        ds.AddName(sequence_name);
+    }
+}
+
+
+//_________________________________________________________
+_DataSet* ReadDataSetFile (FILE*f, char execBF, _String* theS, _String* bfName, _String* namespaceID, _TranslationTable* dT)
+{
+
+    bool     doAlphaConsistencyCheck = true;
+    _String::storageIncrement = 16;
+    _DataSet* result = new _DataSet;
+    fileTreeString = "";
+
+
+    _String         CurrentLine = dataFilePartitionMatrix & "={{}};",
+                    savedLine;
+
+    if (1) {
+        _ExecutionList reset (CurrentLine);
+        reset.Execute();
+#ifdef __HYPHYMPI__
+        if (_hy_mpi_node_rank == 0)
+#endif
+            terminateExecution = false;
+    }
+
+    // initialize the instance of a file state variable
+    setParameter(dataFileTree, 0.0);
+    FileState   fState;
+    fState.translationTable =  dT;
+    fState.curSpecies =
+        fState.totalSpeciesRead =
+            fState.totalSitesRead =
+                fState.totalSpeciesExpected =
+                    fState.totalSitesExpected =
+                        fState.curSite =
+                            fState.maxStringLength   = 0;
+    fState.acceptingCommands = true;
+    fState.allSpeciesDefined = false;
+    fState.interleaved       = false;
+    fState.isSkippingInNEXUS = false;
+    fState.autoDetect        = true;
+    fState.fileType          = -1;
+    fState.baseLength        = 4;
+    fState.repeat            = '.',
+           fState.skip            = 0;
+    fState.theSource         = theS;
+    fState.pInSrc            = 0;
+    fState.theNamespace      = namespaceID;
+
+    if (!(f||theS)) {
+        CurrentLine = "ReadDataSetFile received null file AND string references. At least one must be specified";
+        warnError     (CurrentLine);
+    }
+    // done initializing
+
+    long     fileLength = 0,
+             lastDone = 10,
+             cDone;
+
+#ifdef __HYPHYMPI__
+    if (_hy_mpi_node_rank == 0) {
+#endif
+        if       (f) {
+            fseek    (f,0,SEEK_END);
+            fileLength = ftell(f);
+            rewind  (f);
+        } else {
+            fileLength = theS->sLength;
+        }
+
+#ifdef __HYPHYMPI__
+    }
+#endif
+
+
+
+    //if (f==NULL) return (_DataSet*)result.makeDynamic();
+    // nothing to do
+
+    CurrentLine = empty;
+
+    ReadNextLine (f,&CurrentLine,&fState);
+    if (!CurrentLine.sLength) {
+        CurrentLine = "Empty File Encountered By ReadDataSet.";
+        WarnError (CurrentLine);
+        return result;
+    } else {
+        if (CurrentLine.beginswith ("#NEXUS",false)) {
+            ReadNexusFile (fState,f,(*result));
+            doAlphaConsistencyCheck = false;
+        } else {
+            long i,j,k, filePosition = -1, saveSpecExpected;
+            char c;
+            while (CurrentLine.sLength) { // stuff to do
+                // check if the line has a command in it
+#ifdef __HYPHYMPI__
+                if (_hy_mpi_node_rank == 0) {
+#endif
+                    if (f) {
+                        cDone = ftell (f)*100./fileLength;
+                    } else {
+                        cDone = fState.pInSrc*100./fileLength;
+                    }
+
+                    if (cDone>lastDone) {
+                        SetStatusBarValue (lastDone,1,0);
+#ifdef __MAC__
+                        handleGUI(true);
+#endif
+                        lastDone+=10;
+                    }
+#ifdef __HYPHYMPI__
+                }
+#endif
+
+                c = CurrentLine.FirstNonSpace();
+                while (1) {
+                    if (fState.acceptingCommands) {
+                        if (c == '$') { // command line
+                            processCommand(&CurrentLine, &fState);
+                            break;
+                        }
+                    }
+
+                    if (!fState.skip) {
+                        fState.skip = fState.translationTable->GetSkipChar();
+                    }
+                    fState.acceptingCommands = FALSE;
+
+                    if (fState.fileType==-1) { // undecided file type - assume it is PHYLIP sequential
+                        if ((c == '#')||(c=='>')) { // hash-mark format
+                            fState.fileType = 0;
+                        } else { // assume this is a sequential PHYLIP file
+                            fState.fileType = 1;
+                            fState.interleaved = false;
+                        }
+
+                    }
+                    // decide what to do next
+                    // if format is PHYLIP and we do not know the expected dimensions,
+                    //   we must read those in first
+                    if (fState.fileType==1) { // PHYLIP
+                        if ((filePosition<0)&&(fState.autoDetect)) {
+                            filePosition = (f?
+                                            ftell (f)
+#ifdef __WINDOZE__
+                                            -1
+#endif
+                                            :fState.pInSrc);
+                            savedLine = CurrentLine;
+                        }
+
+                        if ((fState.totalSitesExpected==0)||(fState.totalSpeciesExpected==0)) { // must read dimensions first
+                            i = CurrentLine.FirstNonSpaceIndex();
+                            j = CurrentLine.FirstSpaceIndex(i,-1,1);
+                            if (j>=0) {
+                                k = CurrentLine.FirstNonSpaceIndex(j,-1,1);
+                                if (k>=0) { // could have dimensions
+                                    saveSpecExpected = fState.totalSpeciesExpected=CurrentLine.Cut(i,j-1).toNum();
+                                    fState.totalSitesExpected=CurrentLine.Cut(k,-1).toNum();
+                                }
+                                if (CurrentLine.Find ('I', k, -1)>=0) { // interleaved
+                                    fState.interleaved = true;
+                                }
+                            }
+                        } else
+                            // now for the data crunching part
+                            // detect a line, diagnose it and dispatch accordingly
+                        {
+                            if (fState.interleaved) {
+                                if (fState.totalSpeciesRead<fState.totalSpeciesExpected) {
+                                    TrimPhylipLine (CurrentLine, (*result));
+                                }
+                                if ((fState.curSite)&&(fState.curSpecies >= saveSpecExpected)&&
+                                        (fState.totalSitesRead >= fState.totalSitesExpected)) {
+                                    // reached the end of the data - see maybe there is a tree
+                                    ReadNextLine (f,&CurrentLine,&fState);
+                                    if (CurrentLine.sLength) {
+                                        if (CurrentLine.FirstNonSpace()=='(') { // could be a tree string
+                                            ProcessTree (&fState,f, CurrentLine);
+                                        }
+                                    }
+                                    break;
+                                }
+
+                            } else {
+                                if (fState.totalSitesRead > fState.totalSitesExpected)
+                                    // oops - autodetect incorrectly assumed that the file was sequential
+                                {
+                                    fState.curSpecies =
+                                        fState.totalSpeciesRead =
+                                            fState.totalSitesRead =
+                                                fState.curSite =
+                                                    fState.totalSpeciesExpected =
+                                                        fState.totalSitesExpected =
+                                                            fState.maxStringLength = 0;
+                                    fState.allSpeciesDefined = false;
+                                    fState.interleaved = true;
+                                    fState.autoDetect = true;
+
+                                    if(f) {
+                                        fseek (f, filePosition, SEEK_SET);
+                                    } else {
+                                        fState.pInSrc = filePosition;
+                                    }
+
+                                    CurrentLine = savedLine;
+                                    for (long idx = 0; idx < (*result).lLength; idx++) {
+                                        ((_Site*)(*result).lData[idx])->Finalize();
+                                    }
+                                    (*result).theNames.Clear();
+                                    (*result).theMap.Clear();
+                                    (*result).Clear();
+                                    (*result).theFrequencies.Clear();
+                                    if ((*result).dsh) {
+                                        (*result).dsh->incompletePatterns->Clear(false);
+                                        delete ((*result).dsh);
+                                        (*result).dsh = nil;
+                                    }
+                                    continue;
+                                }
+                                if (fState.totalSpeciesRead==0) {
+                                    fState.totalSpeciesExpected = 1;
+                                    if (!fState.curSite) {
+                                        TrimPhylipLine (CurrentLine, (*result));
+                                    }
+                                }
+
+                                else if (fState.curSite>=fState.totalSitesExpected) {
+                                    fState.totalSpeciesExpected++;
+                                    if (fState.totalSpeciesExpected>saveSpecExpected) {
+                                        // reached the end of the data - see maybe there is a tree
+                                        ReadNextLine (f,&CurrentLine,&fState);
+                                        if (CurrentLine.sLength) {
+                                            if (CurrentLine.FirstNonSpace()=='(') { // could be a tree string
+                                                ProcessTree (&fState,f, CurrentLine);
+                                            }
+                                        }
+                                        break;
+                                    }
+                                    TrimPhylipLine (CurrentLine, (*result));
+                                }
+                            }
+
+                            ISelector (fState, CurrentLine, (*result));
+                        }
+                        break;
+                    }
+                    // that's all for PHYLIP
+
+                    // now handle raw data case
+                    if (fState.fileType == 2) { // raw data
+                        FilterRawString(CurrentLine, &fState, (*result));
+                        if (CurrentLine.sLength) {
+                            break;
+                        }
+                        if (ProcessLine (CurrentLine, &fState, (*result))) {
+                            fState.curSpecies++;
+                            fState.totalSpeciesRead++;
+                        }
+                        break;
+                    }
+
+                    // lastly, handle the auto-detect standard case
+
+                    // check to see if the string defines a name
+                    if ((c=='#')||(c=='>')) { // a name it is
+                        if (fState.allSpeciesDefined) { // can't define the species after data
+                            break;
+                        } else {
+                            if ((!fState.totalSpeciesRead)&&(fState.totalSpeciesExpected>=1)) {
+                                fState.interleaved = TRUE;
+                            } else {
+                                fState.interleaved = FALSE;
+                            }
+                            fState.totalSpeciesExpected++;
+                            CurrentLine.Trim(CurrentLine.FirstNonSpaceIndex(1,-1,1),-1);
+                            if ((CurrentLine.sData[0]=='#')||(CurrentLine.sData[0]=='>')) {
+                                CurrentLine = _String("Species")&_String(fState.totalSpeciesExpected);
+                            }
+                            (*result).AddName (CurrentLine);
+                        }
+                        break;
+                    }
+                    // check to see if the string defines a tree
+                    if (c=='(') {
+                        ProcessTree (&fState,f, CurrentLine);
+                        ReadNextLine (f,&CurrentLine,&fState);
+                    }
+
+                    // check to see where to stick the incoming line
+
+                    if (!fState.totalSpeciesExpected)
+                        // raw data fed before names defined - skip
+                    {
+                        break;
+                    }
+                    if((fState.totalSpeciesExpected>1)&&(!fState.totalSpeciesRead)) {
+                        fState.allSpeciesDefined = TRUE;
+                    }
+
+                    // repeat the structure of PHYLIP reader
+
+                    ISelector (fState, CurrentLine, (*result));
+
+                    break;
+                }
+
+                ReadNextLine (f,&CurrentLine,&fState);
+
+            }
+        }
+    }
+
+
+
+    if (fState.totalSitesRead && fState.interleaved && !result->InternalStorageMode()) {
+        for (int i = fState.curSite; i<fState.totalSitesRead; i++) {
+            (*result).Compact(i);
+        }
+        (*result).ResetIHelper();
+    }
+
+    if ((!fState.interleaved)&&(fState.fileType!=2)) {
+        PadLine (fState, (*result));
+    }
+
+
+#ifdef __HYPHYMPI__
+    if (_hy_mpi_node_rank == 0) {
+#endif
+        SetStatusBarValue (-1,1,0);
+#ifdef __MAC__
+        handleGUI(true);
+#endif
+#ifdef __HYPHYMPI__
+    }
+#endif
+
+    // make sure interleaved duplications are handled correctly
+
+    (*result).Finalize();
+    _String::storageIncrement   = 64;
+    (*result).noOfSpecies       = fState.totalSpeciesRead;
+    (*result).theTT             = fState.translationTable;
+
+    // check to see if result may be an amino-acid data
+    if (doAlphaConsistencyCheck && result->theTT == &defaultTranslationTable) {
+        if (result->GetNoTypes() == 0)
+            // empty data set
+            // try binary data
+        {
+            _TranslationTable *trialTable = new _TranslationTable (defaultTranslationTable);
+            trialTable->baseLength = 2;
+            _DataSet * res2 = ReadDataSetFile (f, execBF, theS, bfName, namespaceID, trialTable);
+            if (res2->GetNoTypes()) {
+                DeleteObject (result);
+                return res2;
+            }
+            DeleteObject (trialTable);
+        } else
+            // check it out
+            if (result->CheckAlphabetConsistency()<0.5)
+                // less than 50% of the data in the alphabet is not in the basic alphabet
+            {
+                _TranslationTable trialTable (defaultTranslationTable);
+                trialTable.baseLength = 20;
+                (*result).theTT = &trialTable;
+                if ((*result).CheckAlphabetConsistency()<0.5) {
+                    CurrentLine = "More than 50% of characters in the data are not in the alphabet.";
+                    (*result).theTT =  &defaultTranslationTable;
+                    ReportWarning (CurrentLine);
+                } else {
+                    (*result).theTT = (_TranslationTable*)trialTable.makeDynamic();
+                }
+
+            }
+
+    }
+    if (nexusBFBody.sLength) {
+        if (execBF == 1) {
+            lastNexusDataMatrix = result;
+
+            long            bfl = batchLanguageFunctions.lLength;
+
+            _ExecutionList nexusBF (nexusBFBody,namespaceID);
+            if (bfName) {
+                nexusBF.sourceFile = *bfName;
+            }
+
+#ifndef __UNIX__
+#ifdef __HYPHYMPI__
+            if (_hy_mpi_node_rank == 0)
+#endif
+                ApplyPreferences();
+#endif
+
+            nexusBF.ExecuteAndClean(bfl);
+            nexusBFBody         = empty;
+        } else if (execBF == 0) {
+            nexusBFBody         = empty;
+        }
+    }
+
+    return result;
+}
+
+//_________________________________________________________
+
+BaseRef _DataSetFilter::toStr (void)
+{
+    //return new _String("DataSetFilters only print to files");
+    _String * res = new _String (4096L, true);
+    checkPointer (res);
+    internalToStr (nil,*res);
+    res->Finalize();
+    return res;
+}
+
+//_________________________________________________________
+
+void    _DataSetFilter::PatternToSiteMapper (void* source, void* target, char mode, long padup)
+{
+    for (long site = 0; site < duplicateMap.lLength; site++)
+        if (mode == 0) {
+            ((_Parameter*)target)[site] = ((_Parameter*)source)[duplicateMap.lData[site]];
+        } else if (mode == 1) {
+            ((long*)target)[site] = ((long*)source)[duplicateMap.lData[site]];
+        } else if (mode == 2) {
+            ((long*)target)[site] = ((_Parameter*)source)[duplicateMap.lData[site]];
+        }
+
+
+    for (long site = duplicateMap.lLength; site < padup; site++)
+        if (mode == 0) {
+            ((_Parameter*)target)[site] = 1.;
+        } else if (mode == 1) {
+            ((long*)target)[site] = 0;
+        }
+}
+
+
+//_________________________________________________________
+
+long    _DataSetFilter::GetOriginalToShortMap(long index)
+{
+    long pos1=theData->theMap.lData[theOriginalOrder.lData[index]],pos2;
+    pos2 = theMap.Find(pos1);
+    if (pos2==-1) {
+        for (long i=theData->theMap.lLength-1; i>=0; i--) {
+            if (theData->theMap.lData[i]==pos1) {
+                pos2 = theMap.Find(i);
+                if (pos2!=-1) {
+                    break;
+                }
+            }
+        }
+    }
+    return pos2;
+}
+
+//_________________________________________________________
+
+_String _DataSetFilter::GenerateConsensusString (_SimpleList* majority)
+{
+    if (unitLength > 3) {
+        return empty;
+    }
+
+    _String     result ((unsigned long)theOriginalOrder.lLength),
+                tRes   ((unsigned long)(unitLength*theFrequencies.lLength));
+
+    long        charStates         = GetDimension(false),
+                *translationBuffer = (long*)MemAllocate(sizeof(long)*charStates);
+
+    _Parameter* countBuffer = (_Parameter*)MemAllocate(sizeof(_Parameter)*charStates),
+                nf;
+
+    SetupConversion ();
+
+    for (long k=0; k<theFrequencies.lLength; k++) {
+        long    m,
+                t = theMap.lData[k],
+                f;
+
+        for (m=0; m<charStates; m++) {
+            countBuffer[m] = 0.0;
+        }
+
+        for (long p=0; p<theNodeMap.lLength; p++) {
+            theData->theTT->TokenCode ((*theData)(t, theNodeMap.lData[p],1),translationBuffer);
+            f = 0;
+
+            for (m=0; m<charStates; m++)
+                if (translationBuffer[m]) {
+                    f++;
+                }
+
+            if (f>1) {
+                nf = 1./f;
+                for (m=0; m<charStates; m++)
+                    if (translationBuffer[m]) {
+                        countBuffer[m]+=nf;
+                    }
+            } else {
+                if (f==1) {
+                    m=0;
+                    while (!translationBuffer[m++]) ;
+                    countBuffer[m-1]+=1.;
+                }
+            }
+        }
+
+        nf = -1;
+        f  =  1;
+
+        for (m=0; m<charStates; m++) {
+            if (countBuffer[m]>nf) {
+                nf = countBuffer[m];
+                t = m;
+                f = 1;
+            } else if (countBuffer[m]==nf) {
+                f++;
+            }
+        }
+
+        if (f>1) {
+            for (m=0; m<charStates; m++) {
+                if (countBuffer[m]==nf) {
+                    translationBuffer[m] = 1;
+                } else {
+                    translationBuffer[m] = 0;
+                }
+            }
+            tRes.sData[k]=theData->theTT->CodeToLetter(translationBuffer);
+            if (majority)
+                //(*majority) << -1;
+            {
+                (*majority) << nf;
+            }
+        } else {
+            _String conv = theData->theTT->ConvertCodeToLetters(t,1);
+            tRes.sData[k] = conv.sData[0];
+            if (majority) {
+                (*majority) << nf;
+            }
+        }
+    }
+
+    free (countBuffer);
+    free (translationBuffer);
+
+    for (long m=0; m<theOriginalOrder.lLength; m++) {
+        result.sData[m] = tRes.sData[duplicateMap.lData[m]];
+    }
+
+    return result;
+}
+
+
+//_________________________________________________________
+void    _DataSetFilter::toFileStr (FILE*dest)
+{
+// write out the file with this dataset filter
+    if (!dest) {
+        return;
+    }
+
+    _String       dummy;
+    internalToStr (dest,dummy);
+}
+
+//_________________________________________________________
+void    _DataSetFilter::ConvertCodeToLettersBuffered (long code, char unit, char* storage, _AVLListXL* lookup)
+{
+    // write out the file with this dataset filter
+    long      lookupC     = lookup->Find ((BaseRef)code);
+    char      *lookupV;
+    if (lookupC>=0) {
+        lookupV = ((_String*)lookup->GetXtra(lookupC))->sData;
+    } else {
+        _String * newT = new _String (ConvertCodeToLetters (code,unit));
+        lookup->Insert ((BaseRef)code, (long)newT, false);
+        lookupV = newT->sData;
+    }
+
+    for (long k = 0; k < unit; k++) {
+        storage[k] = lookupV[k];
+    }
+}
+
+
+//_________________________________________________________
+
+void    _DataSetFilter::internalToStr (FILE*dest,_String& rec)
+{
+// write out the file with this dataset filter
+    checkParameter (dataFilePrintFormat,dFPrintFormat,6.0);
+    checkParameter (dataFileDefaultWidth,dFDefaultWidth,50.0);
+    _Parameter  gW;
+
+    long outputFormat = dFPrintFormat,
+         printWidth   = dFDefaultWidth,
+         gapWidth;
+
+    checkParameter (dataFileGapWidth,gW,10.0);
+    if(!printWidth) {
+        printWidth = 50;
+    }
+
+    gapWidth = gW;
+    if (gapWidth<=0) {
+        gapWidth = printWidth;
+    }
+
+    long i,
+         j;
+
+    if (outputFormat < 4 || outputFormat > 8)
+        if (!(theData->theTT->IsStandardNucleotide() || theData->theTT->IsStandardAA())) {
+            _String * bSet = &theData->theTT->baseSet;
+            if (dest) {
+                fprintf (dest,"$BASESET:\"%s\"\n",bSet->sData);
+                if (theData->theTT->tokensAdded.sLength) {
+                    for (long at = 0; at < theData->theTT->tokensAdded.sLength; at++) {
+                        fprintf (dest, "$TOKEN:\"%c\" = \"", theData->theTT->tokensAdded.sData[at]);
+                        long    buf [256];
+                        theData->theTT->SplitTokenCode(theData->theTT->TokenCode(theData->theTT->tokensAdded.sData[at]), buf);
+                        for (long tc = 0; tc < bSet->sLength; tc++)
+                            if (buf[tc]) {
+                                fprintf (dest, "%c", bSet->sData[tc]);
+                            }
+                        fprintf (dest, "\"\n");
+                    }
+                }
+            } else {
+                rec << "$BASESET:\"";
+                rec << *bSet;
+                rec << "\"\n";
+                if (theData->theTT->tokensAdded.sLength) {
+                    for (long at = 0; at < theData->theTT->tokensAdded.sLength; at++) {
+                        rec << "$TOKEN:\"";
+                        rec << theData->theTT->tokensAdded.sData[at];
+                        rec << "\" = \"";
+                        long    buf [256];
+                        theData->theTT->SplitTokenCode(theData->theTT->TokenCode(theData->theTT->tokensAdded.sData[at]), buf);
+                        for (long tc = 0; tc < bSet->sLength; tc++)
+                            if (buf[tc]) {
+                                rec << bSet->sData[tc];
+                            }
+                        rec << "\"\n";
+                    }
+                }
+            }
+        }
+
+    switch (outputFormat) {
+    case 1: // hash-mark interleaved
+    case 10: { // FASTA interleaved
+        long sitesDone    = 0,
+             upTo;
+        char seqDelimiter = (outputFormat==1)?'#':'>';
+
+        for ( i = 0; i<theNodeMap.lLength; i++) {
+            _String * curName = (_String *)theData->GetNames() (theNodeMap.lData[i]);
+            if (dest) {
+                fprintf (dest, "%c%s\n", seqDelimiter,curName->sData);
+            } else {
+                rec << *curName;
+                rec << '\n';
+            }
+        }
+        while (sitesDone<theOriginalOrder.lLength) {
+            if (dest) {
+                fprintf (dest,"\n\n");
+            } else {
+                rec << '\n';
+                rec << '\n';
+            }
+
+            upTo = sitesDone+printWidth;
+            if (upTo>theOriginalOrder.lLength) {
+                upTo = theOriginalOrder.lLength;
+            }
+
+            if (dest)
+                for ( i = 0; i<theNodeMap.lLength; i++) {
+                    for ( j = sitesDone; j<upTo; j++) {
+                        if ((j-sitesDone)%gapWidth==0) {
+                            fprintf (dest, " ");
+                        }
+                        fprintf (dest, "%c",(*theData)(theOriginalOrder.lData[j],theNodeMap.lData[i],1));
+                    }
+
+                    fprintf (dest, "\n");
+                }
+            else
+                for ( i = 0; i<theNodeMap.lLength; i++) {
+                    for ( j = sitesDone; j<upTo; j++) {
+                        if ((j-sitesDone)%gapWidth==0) {
+                            rec << ' ';
+                        }
+                        rec << (*theData)(theOriginalOrder.lData[j],theNodeMap.lData[i],1);
+                    }
+
+                    rec << '\n';
+                }
+
+            sitesDone = upTo;
+        }
+        break;
+    }
+
+    case 2:     // phylip sequential
+    case 11:    // PAML 
+    {
+        
+        
+        if (dest) {
+            fprintf (dest,"%ld\t%ld\n",theNodeMap.lLength,theOriginalOrder.lLength);
+        } else {
+            rec << _String((long)theNodeMap.lLength);
+            rec << '\t';
+            rec << _String((long)theNodeMap.lLength,theOriginalOrder.lLength);
+            rec << '\n';
+        }
+        // proceed to spool out the data
+        for ( i = 0; i<theNodeMap.lLength; i++) {
+            _String * curName = (_String *)theData->GetNames() (theNodeMap(i)), 
+                     choppedTo10Chars;
+            if (outputFormat == 2) {
+                if (curName->Length()>=10) {
+                    choppedTo10Chars = curName->Cut(0,9)&' ';
+                } else {
+                    choppedTo10Chars = *curName;
+                    while (choppedTo10Chars.Length()<11) {
+                        choppedTo10Chars=choppedTo10Chars&' ';
+                    }
+                }
+            } else {
+                choppedTo10Chars = *curName & "  ";
+            }
+
+            if (dest) {
+                fprintf (dest, "%s",choppedTo10Chars.sData);
+
+                for ( j = 0; j<theOriginalOrder.lLength; j++) {
+                    if ((j%printWidth==0)&&j) {
+                        fprintf(dest,"\n           ");
+                    }
+                    fprintf (dest, "%c",(*theData)(theOriginalOrder(j),theNodeMap(i),1));
+                    if (j%gapWidth==gapWidth-1) {
+                        fprintf (dest, " ");
+                    }
+                }
+                fprintf (dest, "\n");
+            } else {
+                rec << choppedTo10Chars;
+
+                for ( j = 0; j<theOriginalOrder.lLength; j++) {
+                    if ((j%printWidth==0)&&j) {
+                        rec << "\n           ";
+                    }
+
+                    rec << (*theData)(theOriginalOrder(j),theNodeMap(i),1);
+                    if (j%gapWidth==gapWidth-1) {
+                        rec << ' ';
+                    }
+                }
+                rec << '\n';
+            }
+
+        }
+        break;
+    }
+    case 3: { // phylip interleaved
+        // print PHYLIP format header
+        //fprintf (dest,"$FORMAT:\"PHYLIPI\"\n");
+        // print number of species and sites
+        if (dest) {
+            fprintf (dest,"%ld\t%ld\n",theNodeMap.lLength,theOriginalOrder.lLength);
+        } else {
+            rec << _String((long)theNodeMap.lLength);
+            rec << '\t';
+            rec << _String((long)theNodeMap.lLength,theOriginalOrder.lLength);
+            rec << '\n';
+        }
+        // proceed to spool out the data
+        for ( i = 0; i<theNodeMap.lLength; i++) {
+            _String * curName = (_String *)theData->GetNames() (theNodeMap(i)), choppedTo10Chars;
+            if (curName->Length()>=10) {
+                choppedTo10Chars = curName->Cut(0,9)&' ';
+            } else {
+                choppedTo10Chars = *curName;
+                while (choppedTo10Chars.Length()<11) {
+                    choppedTo10Chars=choppedTo10Chars&' ';
+                }
+            }
+
+            if (dest) {
+                fprintf (dest, "%s",choppedTo10Chars.sData);
+
+                for ( j = 0; j<theOriginalOrder.lLength; j++) {
+                    if (j==printWidth) {
+                        fprintf(dest,"\n");
+                        break;
+                    }
+                    if (j%gapWidth==0) {
+                        fprintf (dest, " ");
+                    }
+                    fprintf (dest, "%c",(*theData)(theOriginalOrder.lData[j],theNodeMap.lData[i],1));
+                }
+            } else {
+                rec << choppedTo10Chars;
+
+                for ( j = 0; j<theOriginalOrder.lLength; j++) {
+                    if (j==printWidth) {
+                        rec << '\n';
+                        break;
+                    }
+                    if (j%gapWidth==0) {
+                        rec << ' ';
+                    }
+                    rec << (*theData)(theOriginalOrder.lData[j],theNodeMap.lData[i],1);
+                }
+            }
+
+        }
+
+        long completed = printWidth;
+
+        if (dest) {
+            while (completed<theOriginalOrder.lLength-1) {
+                long upTo = completed+printWidth<theOriginalOrder.lLength?completed+printWidth:theOriginalOrder.lLength;
+                for ( i = 0; i<theNodeMap.lLength; i++) {
+                    fprintf(dest,"\n           ");
+                    for ( j = completed; j<upTo; j++) {
+                        if ((j-completed)%gapWidth==0) {
+                            fprintf (dest, " ");
+                        }
+                        fprintf (dest, "%c",(*theData)(theOriginalOrder.lData[j],theNodeMap.lData[i],1));
+                    }
+                }
+                completed+=printWidth;
+                fprintf (dest,"\n");
+            }
+        } else {
+            while (completed<theOriginalOrder.lLength-1) {
+                long upTo = completed+printWidth<theOriginalOrder.lLength?completed+printWidth:theOriginalOrder.lLength;
+                for ( i = 0; i<theNodeMap.lLength; i++) {
+                    rec << "\n           ";
+                    for ( j = completed; j<upTo; j++) {
+                        if ((j-completed)%gapWidth==0) {
+                            rec <<  ' ';
+                        }
+                        rec << (*theData)(theOriginalOrder.lData[j],theNodeMap.lData[i],1);
+                    }
+                }
+                completed+=printWidth;
+                rec << '\n';
+            }
+        }
+
+        break;
+    }
+
+    // various flavors of NEXUS
+
+    case 4: // labels, sequential
+    case 5: // labels, interleaved
+    case 6: // no labels, sequential
+    case 7: { // no labels, interleaved
+        // write out the header
+        j = theNodeMap.lLength;
+        if (dest) {
+            fprintf (dest, "#NEXUS\n\n[\nGenerated by %s on %s\n]\n\nBEGIN TAXA;\n\tDIMENSIONS NTAX = %ld;\n\tTAXLABELS\n\t\t", GetVersionString().getStr() , GetTimeStamp().getStr(), j);
+            for (i=0; i<j; i++) {
+                fprintf (dest, "'%s' ", ((_String*)theData->GetNames().lData[theNodeMap.lData[i]])->sData);
+            }
+
+            fprintf (dest,";\nEND;\n\nBEGIN CHARACTERS;\n\tDIMENSIONS NCHAR = %ld;\n\tFORMAT\n\t\t",theOriginalOrder.lLength);
+            if (theData->theTT->IsStandardNucleotide()) {
+                fprintf (dest,"DATATYPE = DNA\n");
+            } else {
+                if (theData->theTT->IsStandardAA()) {
+                    fprintf (dest,"DATATYPE = PROTEIN\n");
+                } else if (theData->theTT->IsStandardBinary()) {
+                    fprintf (dest,"DATATYPE = BINARY\n");
+                } else {
+                    _String * bSet = &theData->theTT->baseSet;
+                    fprintf (dest, "\n\tSYMBOLS = \"");
+                    for (long bc = 0; bc < bSet->sLength-1; bc++) {
+                        fprintf (dest, "%c ", bSet->sData[bc]);
+                    }
+                    fprintf (dest, "%c\"\n", bSet->sData[bSet->sLength-1]);
+                    if (theData->theTT->tokensAdded.sLength) {
+                        for (long at = 0; at < theData->theTT->tokensAdded.sLength; at++) {
+                            fprintf (dest,"\n\tEQUATE=\"%c = ", theData->theTT->tokensAdded.sData[at]);
+                            long    buf [256];
+                            theData->theTT->SplitTokenCode(theData->theTT->TokenCode(theData->theTT->tokensAdded.sData[at]), buf);
+                            for (long tc = 0; tc < bSet->sLength; tc++)
+                                if (buf[tc]) {
+                                    fprintf (dest, "%c", bSet->sData[tc]);
+                                }
+                            fprintf (dest, "\"");
+                        }
+                    }
+                }
+            }
+            if (theData->theTT->GetGapChar()) {
+                fprintf (dest,"\n\t\tGAP=%c",theData->theTT->GetGapChar());
+            }
+            if (theData->theTT->GetSkipChar()) {
+                fprintf (dest,"\n\t\tMISSING=%c",theData->theTT->GetSkipChar());
+            }
+
+
+            if (outputFormat>5) {
+                fprintf (dest,"\n\t\tNOLABELS");
+            }
+            if (outputFormat%2) {
+                fprintf (dest,"\n\t\tINTERLEAVE");
+            }
+
+            fprintf (dest,"\n\t;\n\nMATRIX");
+        } else {
+            rec << "#NEXUS\n\nBEGIN TAXA;\n\tDIMENSIONS NTAX = ";
+            rec << _String ((long)j);
+            rec << ";\n\tTAXLABELS\n\t\t";
+
+            for (i=0; i<j; i++) {
+                rec << "'";
+                rec << ((_String*)theData->GetNames().lData[theNodeMap.lData[i]]);
+                rec <<  "' ";
+            }
+            rec << ";\nEND;\n\nBEGIN CHARACTERS;\n\tDIMENSIONS NCHAR = ";
+            rec << _String((long)theOriginalOrder.lLength);
+            rec << ";\n\tFORMAT\n\t\t";
+
+            if (theData->theTT->IsStandardNucleotide()) {
+                rec << "DATATYPE = DNA\n";
+            } else {
+                if (theData->theTT->IsStandardAA()) {
+                    rec << "DATATYPE = PROTEIN\n";
+                } else if (theData->theTT->IsStandardBinary()) {
+                    rec << "DATATYPE = BINARY\n";
+                } else {
+                    rec << "\t\tSYMBOLS = \"";
+                    _String * bSet = &theData->theTT->baseSet;
+                    for (long bc = 0; bc < bSet->sLength-1; bc++) {
+                        rec << bSet->sData[bc];
+                        rec << ' ';
+                    }
+                    rec << bSet->sData[bSet->sLength-1];
+                    rec << "\"\n";
+                    if (theData->theTT->tokensAdded.sLength)
+                        for (long at = 0; at < theData->theTT->tokensAdded.sLength; at++) {
+                            rec << "\nEQUATE =\"";
+                            rec << theData->theTT->tokensAdded.sData[at];
+                            rec << " = ";
+                            long    buf [256];
+                            theData->theTT->SplitTokenCode(theData->theTT->TokenCode(theData->theTT->tokensAdded.sData[at]), buf);
+                            for (long tc = 0; tc < bSet->sLength; tc++)
+                                if (buf[tc]) {
+                                    rec << bSet->sData[tc];
+                                }
+
+                            rec << "\"";
+                        }
+                }
+            }
+            if (theData->theTT->GetGapChar()) {
+                rec << "\t\tGAP=";
+                rec << theData->theTT->GetGapChar();
+            }
+            if (theData->theTT->GetSkipChar()) {
+                rec << "\n\t\tMISSING=";
+                rec << theData->theTT->GetSkipChar();
+            }
+            if (outputFormat>5) {
+                rec << "\n\t\tNOLABELS";
+            }
+            if (outputFormat%2) {
+                rec << "\n\t\tINTERLEAVE";
+            }
+
+            rec << "\n\t;\n\nMATRIX";
+
+        }
+
+        //compute space alignment for different taxa names
+        // two passes - one to locate the max length and 2nd to compute padding lengths
+
+        j = 0;
+        for (i=0; i<theNodeMap.lLength; i++) {
+            if (((_String *)theData->GetNames() (theNodeMap(i)))->sLength>j) {
+                j = ((_String *)theData->GetNames() (theNodeMap(i)))->sLength;
+            }
+        }
+
+        _SimpleList taxaNamesPadding;
+
+        for (i=0; i<theNodeMap.lLength; i++) {
+            taxaNamesPadding<<(j - ((_String *)theData->GetNames() (theNodeMap(i)))->sLength);
+        }
+
+        if (outputFormat%2==0) { // sequential
+            if (dest)
+                for (i=0; i<theNodeMap.lLength; i++) {
+                    if (outputFormat == 4) { // labels
+                        fprintf (dest,"\n\t'%s'",((_String *)theData->GetNames() (theNodeMap(i)))->sData);
+                        for (j=0; j<=taxaNamesPadding.lData[i]; j++) {
+                            fprintf (dest," ");
+                        }
+                    } else {
+                        fprintf (dest, "\n");
+                    }
+                    fprintf (dest," ");
+                    for ( j = 0; j<theOriginalOrder.lLength; j++) {
+                        fprintf (dest, "%c",(*theData)(theOriginalOrder.lData[j],theNodeMap.lData[i],1));
+                    }
+                }
+            else
+                for (i=0; i<theNodeMap.lLength; i++) {
+                    if (outputFormat == 4) { // labels
+                        rec << "\n\t'";
+                        rec << (*(_String *)theData->GetNames() (theNodeMap(i)));
+                        rec << "'";
+
+                        for (j=0; j<=taxaNamesPadding.lData[i]; j++) {
+                            rec << ' ';
+                        }
+                    } else {
+                        rec << '\n';
+                    }
+                    rec << ' ';
+                    for ( j = 0; j<theOriginalOrder.lLength; j++) {
+                        rec << (*theData)(theOriginalOrder.lData[j],theNodeMap.lData[i],1);
+                    }
+                }
+        } else {
+            long  sitesDone = 0, upTo;
+
+            while (sitesDone<theOriginalOrder.lLength) {
+                upTo = sitesDone+printWidth;
+                if (upTo>theOriginalOrder.lLength) {
+                    upTo = theOriginalOrder.lLength;
+                }
+
+
+                if (dest) {
+                    for (i = 0; i<theNodeMap.lLength; i++) {
+                        if (outputFormat == 5) { // labels
+                            fprintf (dest,"\n\t'%s'",((_String *)theData->GetNames() (theNodeMap(i)))->sData);
+                            for (j=0; j<=taxaNamesPadding.lData[i]; j++) {
+                                fprintf (dest," ");
+                            }
+                        } else {
+                            fprintf (dest,"\n");
+                        }
+                        fprintf (dest," ");
+                        for ( j = sitesDone; j<upTo; j++) {
+                            fprintf (dest, "%c",(*theData)(theOriginalOrder.lData[j],theNodeMap.lData[i],1));
+                        }
+                    }
+                    fprintf (dest,"\n\n");
+                } else {
+                    for (i = 0; i<theNodeMap.lLength; i++) {
+                        if (outputFormat == 5) { // labels
+                            rec << "\n\t'";
+                            rec << (*(_String *)theData->GetNames() (theNodeMap(i)));
+                            rec << "'";
+                            for (j=0; j<=taxaNamesPadding.lData[i]; j++) {
+                                rec << ' ';
+                            }
+                        } else {
+                            rec << '\n';
+                        }
+
+                        rec << ' ';
+                        for ( j = sitesDone; j<upTo; j++) {
+                            rec << (*theData)(theOriginalOrder.lData[j],theNodeMap.lData[i],1);
+                        }
+                    }
+                    rec << '\n';
+                    rec << '\n';
+                }
+
+                sitesDone = upTo;
+            }
+
+        }
+        if (dest) {
+            fprintf (dest,";\nEND;");
+        } else {
+            rec << ";\nEND;";
+        }
+        break;
+    }
+
+    case 8: {
+        for ( i = 0; i<theNodeMap.lLength; i++) {
+            if (dest) {
+                fprintf (dest, "%c",(*theData)(theOriginalOrder(0),theNodeMap(i),1));
+                for ( j = 1; j<theOriginalOrder.lLength; j++) {
+                    fprintf (dest, ",%c",(*theData)(theOriginalOrder(j),theNodeMap(i),1));
+                }
+                fprintf (dest, "\n");
+            } else {
+                rec << (*theData)(theOriginalOrder(0),theNodeMap(i),1);
+                for ( j = 1; j<theOriginalOrder.lLength; j++) {
+                    rec << ',';
+                    rec << (*theData)(theOriginalOrder(j),theNodeMap(i),1);
+                }
+                rec << '\n';
+            }
+        }
+        break;
+    }
+
+    default: { // hash-mark sequential
+        char seqDelimiter = (outputFormat==9)?'>':'#';
+
+        for ( i = 0; i<theNodeMap.lLength; i++) {
+            _String * curName = (_String *)theData->GetNames() (theNodeMap(i));
+
+            if (dest) {
+                fprintf (dest, "%c%s", seqDelimiter ,curName->sData);
+                for ( j = 0; j<theOriginalOrder.lLength; j++) {
+                    if (j%printWidth==0) {
+                        fprintf(dest,"\n");
+                    }
+                    fprintf (dest, "%c",(*theData)(theOriginalOrder(j),theNodeMap(i),1));
+                }
+                fprintf (dest, "\n");
+            } else {
+                rec << seqDelimiter;
+                rec << *curName;
+                for ( j = 0; j<theOriginalOrder.lLength; j++) {
+                    if (j%printWidth==0) {
+                        rec << '\n';
+                    }
+                    rec << (*theData)(theOriginalOrder(j),theNodeMap(i),1);
+                }
+                rec << '\n';
+            }
+        }
+    }
+
+    // finally see if we need to write out a tree
+
+    }
+
+    if (outputFormat != 8) {
+        _Parameter  treeDefined;
+        checkParameter (dataFileTree, treeDefined,0.0);
+        if (treeDefined) {
+            _Variable *treeVar = FetchVar(LocateVarByName (dataFileTreeString));
+            if (treeVar) {
+                _String* treeString = (_String*)(treeVar->Compute())->toStr();
+                switch (outputFormat) {
+                case 0:
+                case 1:
+                case 9:
+                case 10: {
+                    if (dest) {
+                        fprintf (dest,"\n\n%s;",treeString->sData);
+                    } else {
+                        rec << '\n';
+                        rec << '\n';
+                        rec << *treeString;
+                    }
+                    break;
+                }
+                case 2:
+                case 3: {
+                    if (dest) {
+                        fprintf (dest,"\n1\n%s;",treeString->sData);
+                    } else {
+                        rec << "\n1\n";
+                        rec << *treeString;
+                    }
+                    break;
+                }
+                default: {
+                    if (dest) {
+                        fprintf (dest,"\n\nBEGIN TREES;\n\tTREE tree = %s;\nEND;",treeString->sData);
+                    } else {
+                        rec << "\n\nBEGIN TREES;\n\tTREE tree = ";
+                        rec << *treeString;
+                        rec << ";\nEND;";
+                    }
+                }
+
+                }
+                DeleteObject (treeString);
+            }
+        }
+    }
+
+}
+
+//_________________________________________________________
+
+bool    StoreADataSet (_DataSet* ds, _String* setName)
+{
+    if (!setName->IsValidIdentifier (true)) {
+        WarnError (*setName & " is not a valid identifier while constructing a DataSet");
+        return false;
+    }
+
+    long pos = FindDataSetName (*setName);
+
+    if (pos==-1) {
+        dataSetNamesList << setName;
+        dataSetList.AppendNewInstance(ds);
+    } else {
+#if !defined __UNIX__ && ! defined __HEADLESS__
+        if (!RequestDataSetReplace (pos)) {
+            terminateExecution = true;
+            DeleteObject (ds);
+            return false;
+        }
+#endif
+
+        _DataSet* existingDS = (_DataSet*)dataSetList (pos);
+
+        bool isDifferent = existingDS->NoOfSpecies () != ds->NoOfSpecies() ||
+                           existingDS->NoOfColumns () != ds->NoOfColumns() ||
+                           existingDS->NoOfUniqueColumns () != ds->NoOfUniqueColumns() ||
+                           existingDS->GetTT () != ds->GetTT();
+
+
+        for (long dfIdx = 0; dfIdx < dataSetFilterNamesList.lLength; dfIdx++)
+            if (((_String*)dataSetFilterNamesList(dfIdx))->sLength) {
+                _DataSetFilter * aDF = (_DataSetFilter*)dataSetFilterList(dfIdx);
+                if (aDF->GetData() == existingDS) {
+                    if (isDifferent) {
+                        ReportWarning (_String("Overwriting dataset '") & *setName & "' caused DataSetFilter '" & *((_String*)dataSetFilterNamesList(dfIdx)) & "' to be deleted");
+                        KillDataFilterRecord(dfIdx, false);
+                    } else {
+                        aDF->SetData(ds);
+                    }
+                }
+            }
+        dataSetList.Replace(pos,ds,false);
+    }
+
+
+    CheckReceptacleAndStore (*setName&".species",empty,false, new _Constant (ds->NoOfSpecies()), false);
+    CheckReceptacleAndStore (*setName&".sites",empty,false, new _Constant (ds->NoOfColumns()), false);
+    CheckReceptacleAndStore (*setName&".unique_sites",empty,false, new _Constant (ds->NoOfUniqueColumns()), false);
+
+    return true;
+}
+
+//_________________________________________________________
+
+_Matrix * _DataSet::HarvestFrequencies (char unit, char atom, bool posSpec, _SimpleList& hSegmentation, _SimpleList& vSegmentation, bool countGaps)
+{
+    unsigned long    vD,
+                     hD = 1L;
+            
+    if (hSegmentation.lLength == 0L || vSegmentation.lLength<unit) { // revert to default (all data)
+        if (hSegmentation.lLength==0) {
+            hSegmentation.Populate (NoOfSpecies(),0,1);
+        }
+        if (vSegmentation.lLength<unit) {
+            vSegmentation.Clear();
+            vSegmentation.Populate (GetNoTypes(),0,1);
+        }
+    }
+
+    if (unit%atom > 0) { // 20120814 SLKP: changed this behavior to throw errors
+        WarnError ("Atom should divide unit in HarvestFrequencies call");
+        return new _Matrix (1,1);
+    }
+
+    // create the output Matrix
+
+    for (unsigned long i=0; i<atom; i++) {
+        hD*=theTT->baseLength;
+    }
+
+    vD = posSpec?unit/atom:1;
+
+    _Matrix   *  out = (_Matrix*) checkPointer(new _Matrix (hD, vD, false, true));
+
+    long     positions  =   unit/atom,
+             *store        = new long[atom*theTT->baseLength];
+
+    for (unsigned long i = 0; i<vSegmentation.lLength; i+=unit) { // loop over the set of segments
+        // make sure the partition is kosher
+
+        if (i+unit>vSegmentation.lLength) {
+            break;
+        }
+
+        for (unsigned long jj=i; jj<i+unit; jj+=atom) {
+            long   k = (jj-i)/atom;
+            
+            for (unsigned long ll = 0; ll<hSegmentation.lLength; ll++)
+                // loop down each column
+            {
+                int l = hSegmentation.lData[ll];
+                unsigned long count = 1L;
+                // build atomic probabilities
+                for (unsigned long m = 0; m<atom; m++ ) {
+                    theTT->TokenCode ((*this)(vSegmentation.lData[jj+m],l,atom), store+theTT->baseLength*m,countGaps);
+                }
+
+                long index = 0, shifter = 1;
+                for (int m = atom-1; m>=0; m--) {
+                    int smcount = 0;
+                    for (int n = 0; n<theTT->baseLength; n++) {
+                        if (store[theTT->baseLength*m+n]) {
+                            index += shifter*n;
+                            smcount++;
+                        }
+                    }
+                    shifter*=theTT->baseLength;
+                    count *=smcount;
+                }
+
+                if (count>1) {
+                    constructFreq (store, out->theData, posSpec?positions:1, posSpec?k:0, count, atom-1 , 1, 0);
+                } else {
+                    out->theData[posSpec?index*positions+k:index] += count;
+                }
+            }
+        }
+    }
+
+    delete[] store;
+    //scale the matrix now
+
+    hD = out->GetHDim();
+    vD = out->GetVDim();
+    for (unsigned long i=0; i<vD; i++) { // normalize each _column_ to sum to 1.
+        _Parameter temp = 0.0;
+
+        for (long r=hD-1; r>=0; r--) {
+            temp+=out->theData[r*vD+i];
+        }
+
+        for (long r=i; r<vD*hD; r+=posSpec?positions:1) {
+            out->theData[r]/=temp;
+        }
+    }
+
+
+    return out;
+}
+
+//_________________________________________________________
+void    _DataSet::constructFreq (long* d, _Parameter *m, char positions, long column, long counter, int level, int shifter, int index) {
+    for(unsigned i=0; i<theTT->baseLength; i++) {
+        if (d[level*theTT->baseLength+i]) {
+            if (level) {
+                constructFreq (d,m,positions,column,counter, level-1,shifter*theTT->baseLength,index + i*shifter);
+            } else {
+                m[(index + i*shifter)*positions+column]+=1.0/counter;
+            }
+        }
+    }
+}
+
+
+
diff --git a/src/core/stack.cpp b/src/core/stack.cpp
new file mode 100644
index 0000000..fb9c13d
--- /dev/null
+++ b/src/core/stack.cpp
@@ -0,0 +1,94 @@
+/*
+ 
+ HyPhy - Hypothesis Testing Using Phylogenies.
+ 
+ Copyright (C) 1997-now
+ Core Developers:
+ Sergei L Kosakovsky Pond (spond at ucsd.edu)
+ Art FY Poon    (apoon at cfenet.ubc.ca)
+ Steven Weaver (sweaver at ucsd.edu)
+ 
+ Module Developers:
+ Lance Hepler (nlhepler at gmail.com)
+ Martin Smith (martin.audacis at gmail.com)
+ 
+ Significant contributions from:
+ Spencer V Muse (muse at stat.ncsu.edu)
+ Simon DW Frost (sdf22 at cam.ac.uk)
+ 
+ Permission is hereby granted, free of charge, to any person obtaining a
+ copy of this software and associated documentation files (the
+ "Software"), to deal in the Software without restriction, including
+ without limitation the rights to use, copy, modify, merge, publish,
+ distribute, sublicense, and/or sell copies of the Software, and to
+ permit persons to whom the Software is furnished to do so, subject to
+ the following conditions:
+ 
+ The above copyright notice and this permission notice shall be included
+ in all copies or substantial portions of the Software.
+ 
+ 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.
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ 
+ */
+
+#include "stack.h"
+
+//__________________________________________________________________________________
+_Stack::_Stack (void)
+{
+}
+
+//__________________________________________________________________________________
+void _Stack::Initialize (void)
+{
+    theStack.Initialize();
+}
+
+//__________________________________________________________________________________
+void _Stack::Duplicate (BaseRef s)
+{
+    theStack.Duplicate(&((_Stack*)s)->theStack);
+}
+
+//__________________________________________________________________________________
+_Stack::~_Stack (void)
+{
+}
+
+//__________________________________________________________________________________
+bool _Stack::Push (_PMathObj newObj, bool dup)    // push object onto the stack
+{
+    if (dup)
+        theStack<<(newObj);
+    else
+        theStack.AppendNewInstance(newObj);
+    return true;
+}
+
+//__________________________________________________________________________________
+_PMathObj _Stack::Pop (bool del)        // pop object from the top of the stack
+{
+    _PMathObj r = (_PMathObj)theStack.lData[theStack.lLength-1];
+    if (del) {
+        theStack.lLength--;
+    }
+    return r;
+}
+
+//__________________________________________________________________________________
+long _Stack::StackDepth (void)  // returns the depth of the stack
+{
+    return theStack.lLength;
+}
+
+//__________________________________________________________________________________
+void _Stack::Reset (void)   // clears the stack
+{
+    theStack.Clear();
+}
diff --git a/src/core/strings.cpp b/src/core/strings.cpp
new file mode 100644
index 0000000..8e5d953
--- /dev/null
+++ b/src/core/strings.cpp
@@ -0,0 +1,2518 @@
+/*
+
+HyPhy - Hypothesis Testing Using Phylogenies.
+
+Copyright (C) 1997-2009
+  Sergei L Kosakovsky Pond (spond at ucsd.edu)
+  Art FY Poon              (apoon at cfenet.ubc.ca)
+
+Permission is hereby granted, free of charge, to any person obtaining a
+copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be included
+in all copies or substantial portions of the Software.
+
+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.
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+*/
+
+
+#include "hy_strings.h"
+
+#ifndef __HYPHYXCODE__
+#include "gnuregex.h"
+#else
+#include "regex.h"
+#include <unistd.h>
+#endif
+
+#ifdef   __UNIX__
+#if !defined __MINGW32__
+#include <sys/utsname.h>
+#endif
+#include <unistd.h>
+#endif
+
+#ifdef    __HYPHYDMALLOC__
+#include "dmalloc.h"
+#endif
+
+#include "batchlan.h"
+
+#include <stdlib.h>
+#include <string.h>
+#include <stdio.h>
+#include <ctype.h>
+#include <time.h>
+
+
+#define MOD_ADLER 65521
+
+_String   compileDate = __DATE__,
+          __KERNEL__VERSION__ = _String ("2.2") & compileDate.Cut (7,10) & compileDate.Cut (0,2).Replace("Jan", "01", true).
+                                                                                                  Replace("Feb", "02", true).
+                                                                                                  Replace("Mar", "03", true).
+                                                                                                  Replace("Apr", "04", true).
+                                                                                                  Replace("May", "05", true).
+                                                                                                  Replace("Jun", "06", true).
+                                                                                                  Replace("Jul", "07", true).
+                                                                                                  Replace("Aug", "08", true).
+                                                                                                  Replace("Sep", "09", true).
+                                                                                                  Replace("Oct", "10", true).
+                                                                                                  Replace("Nov", "11", true).
+                                                                                                  Replace("Dec", "12", true)
+                                                                                                  & compileDate.Cut (4,5).Replace (" ", "0", true) & "beta";
+
+ 
+_String     empty(""),
+            emptyAssociativeList ("{}"),
+            hyphyCiteString ("\nPlease cite S.L. Kosakovsky Pond, S. D. W. Frost and S.V. Muse. (2005) HyPhy: hypothesis testing using phylogenies. Bioinformatics 21: 676-679 if you use HyPhy in a publication\nIf you are a new HyPhy user, the tutorial located at http://www.hyphy.org/docs/HyphyDocs.pdf may be a good starting point.\n");
+
+char        defaultReturn = 0;
+unsigned    long _String::storageIncrement = 32;
+
+/*extern int _hy_mpi_node_rank;
+long  loopCount      = 3;
+char* addrBreak      = 0x583088;*/
+
+struct _hyValidIDCharsType {
+    bool valid_chars[256];
+    _hyValidIDCharsType(void) {
+        for (int c = 0; c < 256; c++) {
+            valid_chars[c] = false;
+        }
+        {
+            for (unsigned char c='a'; c<='z'; c++) {
+                valid_chars[c] = true;
+            }
+        }
+        {
+            for (unsigned char c='A'; c<='Z'; c++) {
+                valid_chars[c] = true;
+            }
+        }
+        {
+            for (unsigned char c='0'; c<='9'; c++) {
+                valid_chars[c] = true;
+            }
+        }
+        valid_chars[(unsigned char)'_'] = true;
+    }
+}
+_hyValidIDChars;
+
+
+/*
+==============================================================
+Constructors
+==============================================================
+*/
+
+//Does nothing
+_String::_String (void)
+{
+    sLength = 0;
+    sData = nil;
+}
+
+//Length constructor
+_String::_String (unsigned long sL, bool flag)
+{
+
+    if (flag) {
+        sLength = 0;
+        nInstances = sL>storageIncrement?sL:storageIncrement;
+        sData = (char*)MemAllocate (nInstances*sizeof (char));
+        //sData = (char*)MemAllocate (storageIncrement*sizeof (char));
+        if (!sData) {
+            nInstances = 1;
+            warnError(-108);
+        }
+    } else {
+        sLength = sL;
+        sData = (char*)MemAllocate (sL+1);
+        /* if (sData == addrBreak && _hy_mpi_node_rank == 1)
+         {
+             printf ("Here %d %d\n", sLength, getpid());
+             sleep (10);
+             loopCount--;
+             assert (loopCount > 0);
+         }*/
+
+        if (sData) {
+            memset (sData,0,sL+1);
+        } else {
+            sLength = 0;
+            warnError (-108);
+        }
+    }
+}
+
+//Length constructor
+_String::_String (long sL)
+{
+
+    char s [32];
+    snprintf (s, sizeof(s),"%ld", sL);
+    for(sLength=0; s[sLength]; sLength++) ;
+    checkPointer (sData = (char*)MemAllocate(sLength+1));
+    memcpy       (sData, s, sLength+1);
+}
+
+_String::_String (const _String& source, long from, long to)
+{
+    if (source.sLength) {
+        if (from == -1) {
+            from = 0;
+        }
+
+        if (to < 0 || to >= source.sLength) {
+            to   = ((long)source.sLength)-1;
+        } 
+
+        if (to>=from) {
+            sLength = to-from+1;
+            sData = (char*)MemAllocate (sLength+1);
+            if (!sData) {
+                warnError( -108);
+            }
+
+            if (sLength > 32) {
+                memcpy (sData,source.sData+from ,sLength);
+            } else
+                for (long k=0; k<sLength; k++) {
+                    sData[k] = source.sData[k+from];
+                }
+
+            sData[sLength] = 0;
+            return;
+        }
+    }
+
+    sLength = 0;
+    sData = (char*)MemAllocate (1);
+    sData[0] = 0;
+}
+
+//Stack copy contructor
+_String::_String (const _String& s)
+{
+    Duplicate ((BaseRef)&s);
+}
+
+_String::_String (_String* s)
+{
+    CopyDynamicString (s, false);
+}
+
+//Data constructor
+_String::_String (const char* s)
+{
+    // room for the null terminator
+    sLength = strlen( s );
+    checkPointer (sData = (char*)MemAllocate (sLength+1));
+    memcpy (sData, s, sLength+1);
+}
+
+//Data constructor
+_String::_String (const char s)
+{
+    sLength = 1;
+    checkPointer (sData = (char*)MemAllocate (sLength+1));
+    sData[0]=s;
+    sData[1]=0;
+}
+
+//Data constructor
+_String::_String (_Parameter val, const char * format)
+{
+    char s_val[128];
+    sLength = snprintf (s_val,128, format?format:PRINTF_FORMAT_STRING,val);
+    checkPointer (sData = (char*)MemAllocate (sLength+1));
+    for (unsigned long k=0; k<=sLength; k++) {
+        sData[k] = s_val[k];
+    }
+}
+
+//Does nothing
+_String::_String (FILE* F)
+{
+    sLength = 0;
+    sData   = nil;
+    if (F) {
+        fseek (F,0,SEEK_END);
+        sLength = (unsigned long)ftell(F);
+        sData = (char*)MemAllocate (sLength+1);
+        rewind (F);
+        fread (sData,1,sLength,F);
+        sData[sLength] = 0;
+    }
+}
+
+//Destructor
+_String::~_String(void)
+{
+    if (nInstances<=1) {
+        if (sData) {
+            free (sData);
+            sData = nil;
+        }
+        sLength = 0;
+    } else {
+        nInstances--;
+    }
+}
+
+
+/*
+==============================================================
+Operator Overloads
+==============================================================
+*/
+
+// Element location functions
+char& _String::operator [] (long index)
+{
+    if (((unsigned long)index)<sLength) {
+        return sData[index];
+    }
+    return defaultReturn;
+}
+
+//Element location functions
+char _String::operator () (unsigned long index)
+{
+    if (index<sLength) {
+        return sData[index];
+    }
+
+    return 0;
+}
+
+// Assignment operator
+void _String::operator = (_String s)
+{
+    if (sData) {
+        free (sData);
+    }
+
+    Duplicate (&s);
+}
+
+// lexicographic comparison
+bool _String::operator == (_String s)
+{
+    return Equal(&s);
+}
+
+//Append operator
+_String _String::operator & (_String s)
+{
+    if (sLength+s.sLength == 0) {
+        return empty;
+    }
+
+    _String res (sLength+s.sLength,false);
+
+    if (sLength) {
+        memcpy((res.sData),sData,sLength);
+    }
+
+    if (s.sLength) {
+        memcpy(res.sData+sLength,s.sData,s.sLength);
+    }
+
+    res.sData[res.sLength]=0;
+    return res;
+}
+
+// append operator
+void _String::operator << (const _String* s)
+{
+    if ( s && s->sLength) {
+        if (nInstances < sLength + s->sLength) {
+            unsigned long incBy = sLength + s->sLength - nInstances;
+
+            if (incBy < storageIncrement) {
+                incBy = storageIncrement;
+            }
+
+            if (incBy < sLength/8) {
+                incBy = sLength/8;
+            }
+
+            nInstances+=incBy;
+
+            sData = (char*)MemReallocate((char*)sData, nInstances*sizeof(char));
+
+            if (!sData) {
+                checkPointer (sData);
+            }
+        }
+
+        for (long k = 0; k < s->sLength; k++) {
+            sData[sLength+k] = s->sData[k];
+        }
+
+        //memcpy(sData+sLength,s->sData,s->sLength);
+        sLength+=s->sLength;
+    }
+}
+
+// append operator
+void _String::operator << (const _String& s)
+{
+   (*this) << &s;
+}
+
+//Append operator
+void _String::operator << (const char* str)
+{
+    _String conv (str);
+    (*this)<<&conv;
+}
+
+//Append operator
+void _String::operator << (const char c)
+{
+    if (nInstances <= sLength) {
+        nInstances  += ((storageIncrement*8 > sLength)? storageIncrement: (sLength/8+1));
+        checkPointer (sData = (char*)MemReallocate((char*)sData, nInstances*sizeof(char)));
+    }
+
+    sData[sLength++]=c;
+}
+
+//Return good ole char*
+_String::operator const char* (void)
+{
+    return sData;
+}
+
+//Lexicographic comparison
+bool _String::operator > (_String s)
+{
+    return Greater(&s);
+}
+
+//Lexicographic comparison
+bool _String::operator <= (_String s)
+{
+    return !((*this)>s);
+}
+
+//Lexicographic comparison
+bool _String::operator >= (_String s)
+{
+    return (((*this)>s)||(*this==s));
+}
+
+//Lexicographic comparison
+bool _String::operator != (_String s)
+{
+    return !(*this==s);
+}
+
+//Lexicographic comparison
+bool _String::operator < (_String s)
+{
+    return Less(&s);
+}
+
+
+/*
+==============================================================
+Methods
+==============================================================
+*/
+
+// Compute Adler-32 CRC for a string
+// Implementation shamelessly lifted from http://en.wikipedia.org/wiki/Adler-32
+long _String::Adler32(void)
+{
+    unsigned char  *data = (unsigned char*)sData;
+
+    unsigned long len = sLength,
+                  a   = 1,
+                  b      = 0;
+
+    while (len) {
+        unsigned tlen = len > 5550 ? 5550 : len;
+        len -= tlen;
+        do {
+            a += *data++;
+            b += a;
+        } while (--tlen);
+        a = (a & 0xffff) + (a >> 16) * (65536-MOD_ADLER);
+        b = (b & 0xffff) + (b >> 16) * (65536-MOD_ADLER);
+    }
+
+    if (a >= MOD_ADLER) {
+        a -= MOD_ADLER;
+    }
+
+    b = (b & 0xffff) + (b >> 16) * (65536-MOD_ADLER);
+
+    if (b >= MOD_ADLER) {
+        b -= MOD_ADLER;
+    }
+
+    return b << 16 | a;
+}
+
+//Append and delete operator
+void _String::AppendNewInstance (_String* s)
+{
+    (*this) << s;
+    DeleteObject (s);
+}
+
+void _String::AppendAnAssignmentToBuffer(_String* id, _String *value, bool doFree, bool doQuotes, bool doBind)
+{
+    (*this) << id;
+    if (doBind) {
+        (*this) << ':';
+    }
+    (*this) << '=';
+    if (doQuotes) {
+        (*this) << '"';
+    }
+    (*this) << value;
+    if (doQuotes) {
+        (*this) << '"';
+    }
+    (*this) << ";\n";
+    if (doFree) {
+        DeleteObject (value);
+    }
+}
+
+void _String::AppendVariableValueAVL (_String* id, _SimpleList& varNumbers)
+{
+    for (long k=0; k<varNumbers.lLength; k++) {
+        _Variable *tiv = LocateVar(varNumbers.lData[k]);
+        if (tiv) {
+            (*this) << id;
+            (*this) << "[\"";
+            (*this) << tiv->GetName();
+            (*this) << "\"]=";
+            _PMathObj varValue = tiv->Compute();
+            switch (varValue->ObjectClass()) {
+            case NUMBER:
+                (*this) << _String (varValue->Value());
+                break;
+            case STRING:
+                (*this) << '"';
+                EscapeAndAppend (*((_FString*)varValue)->theString);
+                (*this) << '"';
+                break;
+            default:
+                AppendNewInstance ((_String*)(varValue->toStr()));
+                break;
+
+            }
+            (*this) << ";\n";
+        }
+    }
+}
+
+_String _String::Chop(long from, long to)
+{
+    if (!sLength) {
+        return empty;
+    }
+    if (from == -1) {
+        from = 0;
+    }
+    if (to == -1) {
+        to = ((long)sLength)-1;
+    }
+    if (to<from) {
+        return empty;
+    }
+    _String res ((unsigned long)(sLength+from-to+1));
+    if (from) {
+        memcpy (res.sData,sData, from);
+    }
+    if ((to<((long)sLength)-1)&&(to>from)) {
+        memcpy (res.sData+from,sData+to+1, sLength-to-1);
+    }
+    return res;
+}
+
+// find first occurence of the string between from and to
+bool _String::ContainsSubstring(_String& s)
+// -1, indicates that search term has not been found
+{
+    if (!sLength) {
+        return false;
+    }
+    if (sLength<s.sLength) {
+        return false;
+    }
+    char *sP = sData, *ssP = s.sData;
+    for (long i=0; i<sLength-s.sLength; i++,sP++) {
+        long j = 0;
+        for (; (sP[j]==ssP[j])&&(j<s.sLength); j++) ;
+        if (j==s.sLength) {
+            return true;
+        }
+    }
+    return false;
+}
+
+void _String::CopyDynamicString (_String *s, bool flushMe)
+{
+    if (flushMe && sData) {
+        free (sData);
+    }
+    sLength     = s->sLength;
+    if (s->nInstances == 1) {
+        sData       = s->sData;
+        s->sData    = nil;
+        DeleteObject (s);
+    } else {
+        checkPointer (sData = (char*)MemAllocate (sLength+1));
+        if (s->sData) {
+            memcpy (sData, s->sData, sLength+1);
+        } else {
+            sData[0] = 0;
+        }
+        s->nInstances --;
+    }
+}
+
+//Cut string from, to (-1 for any means from beginning/to end)
+_String _String::Cut(long from, long to)
+{
+    if (!sLength) {
+        return empty;
+    }
+    if (from == -1) {
+        from = 0;
+    }
+    if (to == -1 || to >= sLength) {
+        to = ((long)sLength)-1;
+    }
+    if (to<from) {
+        return empty;
+    }
+    _String res ((unsigned long)(to-from+1));
+    if (to-from+1) {
+        memcpy (res.sData,sData+from,  to-from+1);
+    }
+    return res;
+}
+
+//Delete range char operator
+void _String::Delete (long from, long to)
+{
+    if (from<0) {
+        from = 0;
+    }
+
+    if (to<0) {
+        to = sLength-1;
+    }
+
+    if (to<sLength-1) {
+        memmove (sData+from, sData+to+1, sLength-to-1);
+    }
+    sLength -= to-from+1;
+    sData = MemReallocate (sData,sizeof(char)*(sLength+1));
+    sData[sLength]=0;
+}
+
+void    _String::Duplicate (BaseRef ref)
+{
+    _String * s = (_String*)ref;
+
+    sLength = s->sLength;
+    sData   = s->sData;
+
+    if (sData) {
+        checkPointer (sData = (char*)MemAllocate (sLength+1));
+        memcpy (sData, s->sData, sLength+1);
+    }
+
+}
+
+void    _String::DuplicateErasing (BaseRef ref)
+{
+    if (sData) {
+        free (sData);
+    }
+
+    Duplicate(ref);
+
+}
+
+//Append operator
+void _String::EscapeAndAppend (const char c, char mode)
+{
+    if (mode == 2) {
+        (*this) << c;
+        switch (c) {
+        case '\'':
+            (*this) << c;
+        }
+        return;
+    } else {
+        if (mode == 1) {
+            switch (c) {
+            case '(':
+            case ')':
+            case '%':
+                (*this) << '\\';
+                (*this) << c;
+                return;
+            }
+        } else {
+            if (mode == 4) {
+                switch (c) {
+                case '"':
+                    (*this) << """;
+                    break;
+                case '\'':
+                    (*this) << "'";
+                    break;
+                case '<':
+                    (*this) << "<";
+                    break;
+                case '>':
+                    (*this) << ">";
+                    break;
+                case '&':
+                    (*this) << "&";
+                    break;
+                default:
+                    (*this) << c;
+                }
+                return;
+            } else {
+                if (mode == 5) { // regexp
+                    switch (c) {
+                    case '[':
+                    case '^':
+                    case '$':
+                    case '.':
+                    case '|':
+                    case '?':
+                    case '*':
+                    case '+':
+                    case '(':
+                    case ')':
+                        (*this) << '\\';
+                        (*this) << c;
+                        break;
+                    case '\\':
+                        (*this) << "\\\\";
+                        break;
+                    default:
+                        (*this) << c;
+                    }
+                    return;
+
+                }
+            }
+        }
+    }
+    switch (c) {
+    case '\n':
+        (*this) << '\\';
+        (*this) << 'n';
+        break;
+    case '\t':
+        (*this) << '\\';
+        (*this) << 't';
+        break;
+    case '"':
+        (*this) << '\\';
+        (*this) << '"';
+        break;
+    case '\\':
+        (*this) << '\\';
+        (*this) << '\\';
+        break;
+    default:
+        (*this) << c;
+    }
+}
+
+//Append operator
+void _String::EscapeAndAppend (const _String & s, char mode)
+{
+    for (long i=0; i<s.sLength;  i++) {
+        EscapeAndAppend (s.sData[i], mode);
+    }
+}
+
+//Replace string 1 with string 2, all occurences true/false
+void _String::FormatTimeString(long time_diff)
+{
+    long secs = time_diff,
+         mins = secs/60,
+         hrs  = mins/60;
+
+    mins = mins%60;
+    secs = secs%60;
+    if (hrs<10) {
+        (*this) = _String('0')&hrs;
+    } else {
+        (*this) = _String(hrs);
+    }
+    (*this) = (*this) &':';
+    if (mins<10) {
+        (*this) = (*this)&_String('0')&mins;
+    } else {
+        (*this) = (*this)&_String(mins);
+    }
+    (*this) = (*this) &':';
+    if (secs<10) {
+        (*this) = (*this)&_String('0')&secs;
+    } else {
+        (*this) = (*this)&_String(secs);
+    }
+}
+
+//Finalize buffer string
+void _String::Finalize (void)
+{
+
+    if (!(sData = MemReallocate (sData, sLength+1))) {
+        warnError (-108);
+    }
+
+    sData[sLength]  = 0;
+    nInstances      = 1;
+
+}
+
+long _String::FindEndOfIdent(long start, long end, char wild)
+{
+    if(sLength==0) {
+        return -1;
+    }
+
+    if (start == -1) {
+        start = ((long)sLength)-1;
+    }
+    if (end == -1) {
+        end = ((long)sLength)-1;
+    }
+
+    long i = start;
+
+    for (; i<=end; i++)
+        if (!(isalnum(sData[i])||sData[i]=='.'||sData[i]==wild||sData[i]=='_')) {
+            break;
+        }
+
+    if (i>start+2 && sData[i-1] == '_' && sData[i-2] == '_') {
+        return i-3;
+    }
+
+    return i-1;
+}
+
+// find first occurence of the string between from and to
+long _String::Find(_String s, long from, long to)
+// -1, indicates that search term has not been found
+{
+    if (!sLength) {
+        return -1;
+    }
+    if (from == -1) {
+        from = 0;
+    }
+    if (to == -1) {
+        to = ((long)sLength)-1;
+    }
+    if (to<from) {
+        return -1;
+    }
+    if (to-from+1<s.sLength) {
+        return -1;
+    }
+    char *sP = sData+from, *ssP = s.sData;
+    for (long i=from; i<=to-s.sLength+1; i++,sP++) {
+        long j;
+        for (j = 0; (sP[j]==ssP[j])&&(j<s.sLength); j++) ;
+        if (j==s.sLength) {
+            return i;
+        }
+    }
+    return -1;
+}
+
+long _String::FindKMP(_String s, long from, long to)
+// -1, indicates that search term has not been found
+{
+    //Reproduced from http://en.wikipedia.org/wiki/Knuth–Morris–Pratt_algorithm
+
+    if (!sLength) {
+        return -1;
+    }
+    if (from == -1) {
+        from = 0;
+    }
+    if (to == -1) {
+        to = ((long)sLength)-1;
+    }
+    if (to<from) {
+        return -1;
+    }
+    if (to-from+1<s.sLength) {
+        return -1;
+    }
+
+    char *sP = sData+from; //Start of Haystack substring
+    char *ssP = s.sData;  //Start of Needle substring
+    int m = 0; //beginning of the current match in haystack
+    int i = 0; //the position of the current character in needle
+
+    while(m+i < (to-m+i+1)) {
+        if(ssP[i] == sP[m+i]) {
+            if (i == (s.sLength-1)) {
+                return m;
+            }
+            ++i;
+        }
+
+        else {
+            m = m + i - this->kmpTable[i];
+            if(this->kmpTable[i] > -1) {
+                i = this->kmpTable[i];
+            } else {
+                i = 0;
+            }
+        }
+    }
+
+    return -1;
+}
+
+// Construct a KMP table
+void _String::buildKmpTable(_String s)
+{
+    //Reproduced from http://en.wikipedia.org/wiki/Knuth–Morris–Pratt_algorithm
+    int pos = 2;
+    int cnd = 0;
+
+    this->kmpTable = new int[sizeof(int) * sLength];
+
+    this->kmpTable[0] = -1;
+    this->kmpTable[1] =  0;
+
+    char *ssP = s.sData;  //Start of Needle substring
+
+    while (pos < s.sLength) {
+        if(ssP[pos-1] == ssP[cnd]) {
+            ++cnd;
+            this->kmpTable[pos] = cnd;
+            ++pos;
+        }
+
+        else if(cnd > 0) {
+            cnd = this->kmpTable[cnd];
+        }
+
+        else {
+            this->kmpTable[pos] = 0;
+            ++pos;
+        }
+    }
+}
+
+// find first occurence of the string between from and to
+// case insensitive
+long _String::FindAnyCase (_String s, long from, long to)
+// -1, indicates that search term has not been found
+{
+    if (!sLength) {
+        return -1;
+    }
+    if (from == -1) {
+        from = 0;
+    }
+    if (to == -1) {
+        to = ((long)sLength)-1;
+    }
+    if (to<from) {
+        return -1;
+    }
+    if (to-from+1<s.sLength) {
+        return -1;
+    }
+
+    s.UpCase();
+    char *sP = sData+from, *ssP = s.sData;
+    for (long i=from; i<=to-s.sLength+1; i++,sP++) {
+        long j;
+        for (j = 0; (toupper(sP[j])==ssP[j])&&(j<s.sLength); j++) ;
+        if (j==s.sLength) {
+            return i;
+        }
+    }
+    return -1;
+}
+
+long _String::ExtractEnclosedExpression (long& from, char open, char close, bool respectQuote, bool respectEscape)
+{
+    long   currentPosition = from,
+           currentLevel    = 0;
+
+    bool   isQuote = false,
+           doEscape = false;
+
+    while (currentPosition < sLength) {
+        char thisChar = sData[currentPosition];
+
+        if (!doEscape) {
+            if (thisChar == '"' && respectQuote && !doEscape) {
+                isQuote = !isQuote;
+            } else if (thisChar == open && !isQuote) {
+                // handle the case when close and open are the same
+                if (currentLevel == 1 && open == close && from < currentPosition) {
+                    return currentPosition;
+                }
+                currentLevel++;
+                if (currentLevel == 1) {
+                    from = currentPosition;
+                }
+            } else if (thisChar == close && !isQuote) {
+                currentLevel--;
+                if (currentLevel == 0 && from < currentPosition) {
+                    return currentPosition;
+                }
+                if (currentLevel < 0) {
+                    return -1;
+                }
+            } else if (thisChar == '\\' && respectEscape && isQuote && !doEscape) {
+                doEscape = true;
+            }
+        }
+
+        else {
+            doEscape = false;
+        }
+
+        currentPosition++;
+    }
+
+    return -1;
+}
+
+
+//Find first occurence of the string between from and to
+long _String::Find(char s, long from, long to)
+{
+    if (!sLength) {
+        return -1;
+    }
+    if (from == -1) {
+        from = 0;
+    }
+    if (to == -1) {
+        to = ((long)sLength)-1;
+    }
+    if (to<from) {
+        return -1;
+    }
+    //if (to-from<0) return -1;
+
+    for (long i=from; i<=to; i++)
+        if (sData[i]==s) {
+            return i;
+        }
+
+    return -1;
+}
+
+//Find first occurence of the string between from and to
+long _String::FindBackwards(_String s, long from, long to)
+// -1, indicates that search term has not been found
+{
+    if (!sLength) {
+        return -1;
+    }
+    if (from == -1) {
+        from = 0;
+    }
+    if (to == -1) {
+        to = ((long)sLength)-1;
+    }
+    if (to<from) {
+        return -1;
+    }
+    if (to-from+1<s.sLength) {
+        return -1;
+    }
+    char *sP = sData, *ssP = (s.sData);
+    for (long i=to-s.sLength+1; i>=(long)from; i--) {
+        long j;
+        for (j = 0; (sP[i+j]==ssP[j])&&(j<s.sLength); j++) ;
+        if (j==s.sLength) {
+            return i;
+        }
+    }
+    return -1;
+}
+
+//Find first occurence of the string
+long _String::FindBinary(char s)
+// -1, indicates that search term has not been found
+{
+    for (long i=0; i < sLength; ++i) {
+        if (sData[i] == s) {
+            return i;
+        }
+    }
+    return -1;
+}
+
+long _String::FindTerminator (long from, _String& terminators)
+{
+    long   currentPosition  = from,
+           currentCurly     = 0,
+           currentSquare    = 0,
+           currentParen = 0;
+
+    bool   isQuote = false,
+           doEscape = false;
+
+    while (currentPosition < sLength) {
+        char thisChar = sData[currentPosition];
+        if (!doEscape) {
+            if (thisChar == '"' && !doEscape) {
+                isQuote = !isQuote;
+            } else {
+                if (!isQuote) {
+                    if (thisChar == '{') {
+                        currentCurly ++;
+                    } else if (thisChar == '[') {
+                        currentSquare ++;
+                    } else if (thisChar == '(') {
+                        currentParen ++;
+                    }
+                    if (currentCurly > 0 && thisChar == '}') {
+                        currentCurly --;
+                    } else if (currentSquare > 0 && thisChar == ']') {
+                        currentSquare --;
+                    } else if (currentParen > 0 && thisChar == ')') {
+                        currentParen --;
+                    } else if (currentParen == 0 && currentSquare == 0 && currentCurly == 0)
+                        for (long s = 0; s < terminators.sLength; s++)
+                            if (thisChar == terminators.sData[s]) {
+                                return currentPosition;
+                            }
+                } else {
+                    if (thisChar == '\\' && isQuote && !doEscape) {
+                        doEscape = true;
+                    }
+                }
+            }
+        } else {
+            doEscape = false;
+        }
+
+        currentPosition++;
+    }
+
+    return -1;
+}
+
+//s[0]...s[sLength-1] => s[sLength-1]...s[0]
+void _String::Flip(void)
+{
+    for (unsigned long i = 0; i < sLength/2; i++) {
+        char c = sData[i];
+        sData[i] = sData[sLength-1-i];
+        sData[sLength-1-i] = c;
+    }
+}
+
+// Return good ole char*
+char * _String::getStr (void)
+{
+    return sData;
+}
+
+//Element location functions
+const char _String::getChar (long index)
+{
+    if (((unsigned long)index)<sLength) {
+        return sData[index];
+    }
+    return defaultReturn;
+}
+
+void    _String::Initialize (void)
+{
+    BaseObj::Initialize();
+    sLength = 0;
+    sData = 0;
+}
+
+//Insert char operator
+void _String::Insert (char c, long pos)
+{
+    if (pos<0) {
+        pos = sLength;
+    }
+
+    sData = MemReallocate (sData,sizeof(char)*(sLength+2));
+
+    if (pos<sLength) {
+        memmove(sData+pos+1,sData+pos, sLength-pos);
+    }
+    sData[pos] = c;
+    sLength++;
+    sData[sLength] = 0;
+}
+
+long _String::LempelZivProductionHistory (_SimpleList* rec)
+{
+    if (rec) {
+        rec->Clear();
+    }
+
+    if (sLength == 0) {
+        return 0;
+    }
+
+    if (rec) {
+        (*rec) << 0;
+    }
+
+    long   cp = 1,
+           pH = 1;
+
+    while (cp<sLength) {
+        long maxExtension = 0;
+
+        for (long ip = 0; ip < cp; ip++) {
+            long sp = ip,
+                 mp = cp;
+
+            while ((mp<sLength) && (sData[mp] == sData[sp])) {
+                mp++;
+                sp++;
+            }
+
+            if (mp==sLength) {
+                maxExtension = sLength-cp;
+                break;
+            } else {
+                if ((mp = mp-cp+1)>maxExtension) {
+                    maxExtension = mp;
+                }
+            }
+        }
+
+        cp = cp+maxExtension;
+        if (rec) {
+            (*rec) << cp-1;
+        } else {
+            pH ++;
+        }
+    }
+
+    if (rec) {
+        return rec->lLength;
+    }
+
+    return pH;
+}
+
+//String length
+unsigned long _String::Length(void)
+{
+    return sLength;
+}
+
+//Make dynamic copy
+BaseRef _String::makeDynamic (void)
+{
+    _String * r = new _String;
+    if (!r) {
+        checkPointer(r);
+    }
+    //memcpy ((char*)r, (char*)this, sizeof (_String));
+    //r->nInstances = 1;
+    r->Duplicate(this);
+    return r;
+}
+
+//Replace string 1 with string 2, all occurences true/false
+_String _String::Replace(_String s, _String d, bool flag)
+{
+    if (!sLength) {
+        return empty;
+    }
+    if (sLength<s.sLength) {
+        return *this;
+    }
+    if (s.sLength == 0) {
+        return (*this);
+    }
+
+    if (flag) { // replace all
+        // max possible number of replaces
+        unsigned long t = sLength, cp=0;
+
+        // allocate space for positions of substring s in this
+        long *finds = (long *)MemAllocate(t*sizeof(long)), curSlot = 0;
+
+
+        // find all substrings s in this
+        finds[0]=Find(s);
+        if (finds[0]!=-1) {
+            curSlot++;
+            while ((finds[curSlot]=Find(s,finds[curSlot-1]+s.sLength,-1))!=-1) {
+                curSlot++;
+            }
+        }
+
+        // calculate the length of resulting string
+
+        _String Res(sLength-(s.sLength-d.sLength)*curSlot);
+
+        if (!curSlot) { // not found
+            free ((char*)finds);
+            return *this;
+        }
+
+        char *rP = (Res.sData), *dsP =(d.sData), *sP=(sData);
+
+        if (finds[0]) {
+            memcpy(rP,sP,finds[0]);    //head of the string;
+        }
+        cp+=finds[0];
+
+        for (t=0; t<curSlot-1; t++) { // do the replacing
+            if (d.sLength) {
+                memcpy(rP+cp,dsP,d.sLength);
+            }
+            cp+=d.sLength;
+            if (finds[t+1]-finds[t]-s.sLength) {
+                memcpy(rP+cp,sP+finds[t]+s.sLength,finds[t+1]-finds[t]-s.sLength);
+            }
+            cp+=finds[t+1]-finds[t]-s.sLength;
+        }
+        if (d.sLength) {
+            memcpy(rP+cp,dsP,d.sLength);
+        }
+        cp+=d.sLength;
+        if(sLength-finds[curSlot-1]-s.sLength) {
+            memcpy(rP+cp,sP+finds[curSlot-1]+s.sLength,sLength-finds[curSlot-1]-s.sLength);
+        }
+        //tail
+        free((char*)finds);
+        return Res;
+    }
+
+    //first occurrence replace
+    long t = Find(s),cp=0;
+    if (t==-1) {
+        return *this;
+    }
+    // substring not found
+
+    _String Res(sLength-(s.sLength-d.sLength));
+
+    char *rP = Res.sData, *dsP =d.sData, *sP=sData;
+    if(t) {
+        memcpy(rP,sP,t);    //head of the string;
+    }
+    cp+=t;
+    if (d.sLength) {
+        memcpy(rP+cp,dsP,d.sLength);
+    }
+    cp+=d.sLength;
+    if (sLength-t-s.sLength) {
+        memcpy(rP+cp,sP+t+s.sLength,sLength-t-s.sLength);
+    }
+    //tail
+    return Res;
+
+}
+
+//Element location functions
+void _String::setChar (long index, char c)
+{
+    if (((unsigned long)index)<sLength) {
+        sData[index] = c;
+    }
+}
+
+_String* _String::Sort (_SimpleList* index)
+{
+    if (index) {
+        index->Clear();
+    }
+
+    if (sLength) {
+        _SimpleList charList (sLength);
+        if (index) {
+            for (unsigned long i=0; i<sLength; i++) {
+                charList << sData[i];
+                (*index) << i;
+            }
+            SortLists (&charList, index);
+        } else {
+            for (unsigned long i=0; i<sLength; i++) {
+                charList << sData[i];
+            }
+
+            charList.Sort();
+        }
+        _String * sorted = new _String (sLength);
+        checkPointer (sorted);
+        for (unsigned long i=0; i<sLength; i++) {
+            sorted->sData[i] = charList.lData[i];
+        }
+
+        return sorted;
+    }
+
+    return new _String;
+}
+
+void    _String::StripQuotes (void)
+{
+    if (sLength&&(sData[sLength-1]=='"')&&(sData[0]=='"')) {
+        Trim(1,sLength-2);
+    }    
+}
+
+
+_List* _String::Tokenize (_String s)
+{
+    _List *res = new _List;
+    if (s.sLength!=0) {
+        long cp=0,cpp;
+        while ((cpp = Find(s,cp,-1))!=-1) {
+            if (cpp>cp) {
+                res->AppendNewInstance (new _String (*this,cp,cpp-1));
+            } else {
+                (*res) && (&empty);
+            }
+
+            cp=cpp+s.sLength;
+        }
+
+        res->AppendNewInstance (new _String (*this,cp,-1));
+    }
+    return res;
+}
+
+_Parameter _String::toNum (void)
+{
+    if (sLength == 0) {
+        return 0.;
+    }
+    char * endP;
+    return strtod(sData,&endP);
+}
+
+//Return good ole char*
+BaseRef _String::toStr (void)
+{
+    nInstances++;
+    return this;
+}
+
+_Parameter  _String::ProcessTreeBranchLength (void)
+{
+    _Parameter res = -1.; 
+
+    if (sLength) {
+        if (sData[0]==':') {
+            res = Cut(1,-1).toNum();
+        } else {
+            res = toNum();
+        }    
+
+
+        if (res < 1e-10) {
+            res = 1e-10;
+        }    
+    }    
+
+    return res; 
+}
+
+
+bool    _String::IsALiteralArgument (bool stripQuotes)
+{
+    if (sLength >= 2) { 
+        long from = 0, 
+             to = ExtractEnclosedExpression (from,'"','"',false,true);
+
+        if (from == 0 && to == sLength - 1) { 
+            if (stripQuotes){
+                Trim (1, sLength-2);
+            }    
+            return true;
+        }    
+    }    
+    return false;
+}
+
+//TODO: This is a global function.
+bool    hyIDValidator (_String* s)
+{
+    return s->IsValidIdentifier(false);
+}
+
+/*
+==============================================================
+Space Methods
+==============================================================
+*/
+
+//Replace all space runs with a single space
+void _String::CompressSpaces (void)
+{
+    _String temp (sLength+1,true);
+    bool    skipping = false;
+
+    for (long k=0; k<sLength; k++)
+        if (isspace (sData[k])) {
+            if (!skipping) {
+                skipping = true;
+                temp << ' ';
+            }
+        } else {
+            temp << sData[k];
+            skipping = false;
+        }
+    temp.Finalize();
+    *this = temp;
+}
+
+//Locate the first non-space charachter of the string
+char _String::FirstNonSpace(long start, long end, char direction)
+{
+    long r = FirstNonSpaceIndex(start,end,direction);
+    return r==-1?0:sData[r];
+}
+
+//Locate the first non-space charachter of the string
+long _String::FirstNonSpaceIndex(long start, long end, char direction)
+{
+    if (start == -1) {
+        start = ((long)sLength)-1;
+    }
+    if (end == -1) {
+        end = ((long)sLength)-1;
+    }
+    if (direction<0) {
+        //long t = start;
+        start = end;
+        end = start;
+    }
+    if (sLength&&(start<sLength)&&(!isspace (sData[start]))) {
+        return start;    // first char is non-space
+    }
+    char* str = sData+start;
+    for (int i = start; i<=end; i+=direction, str+=direction)
+        if (!(((*str>=9)&&(*str<=13))||(*str==' '))) {
+            return i;
+        }
+
+    return -1;
+}
+
+//Locate the first non-space charachter of the string
+long _String::FirstSpaceIndex(long start, long end, char direction)
+{
+    if (start == -1) {
+        start = ((long)sLength)-1;
+    }
+    if (end == -1) {
+        end = ((long)sLength)-1;
+    }
+    if (direction<0) {
+        //long t = start;
+        start = end;
+        end = start;
+    }
+    if (sLength&&(isspace (sData[start]))) {
+        return start;    // first char is non-space
+    }
+    char* str = sData+start;
+    for (int i = start; i<=end; i+=direction, str+=direction)
+        if ((((*str>=9)&&(*str<=13))||(*str==' '))) {
+            return i;
+        }
+
+    return -1;
+}
+
+//Remove all spaces
+void _String::KillSpaces (_String& result)
+{
+    _String temp (sLength+1,true);
+    for (long k=0; k<sLength; k++)
+        if (!isspace (sData[k])) {
+            temp << sData[k];
+        }
+    temp.Finalize();
+    result = temp;
+}
+
+//Cut string from, to (-1 for any means from beginning/to end)
+void _String::Trim(long from, long to, bool softTrim)
+{
+    if (!sLength) {
+        return;
+    }
+    if (from < 0) {
+        from = 0;
+    } else if (from>=sLength) {
+        from = ((long)sLength)-1;
+    }
+    if (to < 0) {
+        to = ((long)sLength)-1;
+    } else if (to>=sLength) {
+        to = ((long)sLength)-1;
+    }
+
+    if (softTrim) {
+        sData += from;
+        sLength = to-from+1;
+    } else if (to-from+1>0) {
+        if (from) {
+            memmove (sData,sData+from,  to-from+1);
+        }
+
+        sLength = to-from+1;
+        sData = MemReallocate (sData, to-from+2);
+        sData[to-from+1]=0;
+    } else {
+        sLength = 0;
+        sData = MemReallocate (sData, 1);
+        sData [0] = 0;
+    }
+}
+
+/*
+==============================================================
+Lexicographic Comparison Methods
+==============================================================
+*/
+
+bool _String::contains (_String s)
+{
+    return Find(s)!=-1;
+}
+
+bool _String::contains (char c)
+{
+    return Find(c)!=-1;
+}
+
+char    _String::Compare (_String* s)
+{
+    long upTo;
+
+    if  (sLength>s->sLength) {
+        upTo = s->sLength;
+    } else {
+        upTo = sLength;
+    }
+
+    for (long i=0; i<upTo; i++) {
+        int res = (sData[i]-s->sData[i]);
+        if (res < 0) {
+            return -1;
+        } else if (res>0) {
+            return 1;
+        }
+    }
+
+    if (sLength == s->sLength) {
+        return 0;
+    }
+
+    return 1-2*(sLength<s->sLength);
+}
+
+bool _String::Equal (_String* s)
+{
+    if  (sLength!=s->sLength) {
+        return false;
+    }
+
+    for (long i=0; i<sLength; i++)
+        if (sData[i]!=s->sData[i]) {
+            return false;
+        }
+
+    return true;
+}
+
+bool _String::iEqual(_String* s)
+{
+    if  (sLength!=s->sLength) {
+        return false;
+    }
+
+    for (long i=0; i<sLength; i++)
+        if (tolower(sData[i])!=tolower(s->sData[i])) {
+            return false;
+        }
+
+    return true;
+}
+
+
+bool _String::Equal (const char c)
+{
+    return sLength == 1 &&  sData[0] == c;
+}
+
+//S may contain a wild char
+bool _String::EqualWithWildChar (_String* s, char wildchar)
+{
+    char *sP = sData, *ssP = (s->sData); // optimize
+    // we start comparing the strings until we run into a wildchar.
+    long matchLength, t, q, p, curPos = 0;
+    while (*ssP) {
+        if (*ssP!=wildchar) {
+            if (*ssP==*sP) {
+                ssP++;
+                sP++;
+                curPos++;
+                continue;
+            } else {
+                return false;
+            }
+        }
+        // wildchar found
+        // skip the wildchar and scroll the 1st string until match is found
+        matchLength = 0;
+        ssP++;
+        while (*ssP&&(*ssP!=wildchar)) {
+            ssP++;
+            matchLength++;
+        }
+        if (!matchLength) { // wildchar is the last symbol in expression
+            if (!*ssP) {
+                return true; // expressions matched
+            }
+        } else { // check sP for a possible match
+            t = matchLength-1;
+            q = matchLength+curPos-1;
+            ssP--;
+            while (q<sLength) {
+                if (sP[t]==*ssP) {
+                    p = 1;
+                    while (p<matchLength) {
+                        char c = *(ssP-p);
+                        if (sP[t-p]!=c) {
+                            break;
+                        }
+                        p++;
+                    }
+                    if (p==matchLength) {
+                        sP += t+1;
+                        curPos = q+1;
+                        ssP++;
+                        break;
+//                      ssP++;
+                    }
+                }
+                t++;
+                q++;
+            }
+            if (q==sLength) {
+                return false;
+            }
+        }
+    }
+
+    return (*sP==0);
+}
+
+bool _String::Greater (_String *s)
+{
+    unsigned long top = ((s->sLength>sLength)?sLength:s->sLength);
+
+    for (long i=0; i<top; i++) {
+        int j = sData[i]-s->sData[i];
+        if (j>0) {
+            return true;
+        }
+        if (j<0) {
+            return false;
+        }
+    }
+
+    return (sLength>s->sLength);
+}
+
+bool _String::Less (_String *s)
+{
+    unsigned long top = ((s->sLength>sLength)?sLength:s->sLength);
+
+    for (long i=0; i<top; i++) {
+        int j= sData[i]-s->sData[i];
+        if (j>0) {
+            return false;
+        }
+        if (j<0) {
+            return true;
+        }
+    }
+
+    return (sLength<s->sLength);
+
+}
+
+
+/*
+==============================================================
+Begins and Ends With Methods
+==============================================================
+*/
+
+//Begins with string
+bool _String::beginswith (_String s, bool caseSensitive)
+{
+    if (sLength<s.sLength) {
+        return FALSE;
+    }
+    char *sP = sData, *ssP = (s.sData);
+    if (caseSensitive) {
+        for (long i=0; i<s.sLength; i++)
+            if (sP[i]!=ssP[i]) {
+                return FALSE;
+            }
+    } else
+        for (long i=0; i<s.sLength; i++)
+            if (toupper(sP[i])!=toupper(ssP[i])) {
+                return FALSE;
+            }
+
+
+    return TRUE;
+}
+
+//Begins with string
+bool _String::startswith (_String& s)
+{
+    if (sLength<s.sLength) {
+        return FALSE;
+    }
+
+    char *sP  = sData,
+          *ssP = s.sData;
+
+    for (; *ssP; sP++,ssP++)
+        if (*sP!=*ssP) {
+            return false;
+        }
+
+    return true;
+}
+
+//Ends with string
+bool _String::endswith (_String s, bool caseSensitive)
+{
+    if (sLength<s.sLength) {
+        return FALSE;
+    }
+    char *sP = sData+sLength-s.sLength,
+          *ssP = (s.sData),
+           *ssP2 = s.sData+s.sLength;
+
+    if (caseSensitive) {
+        for (; ssP!=ssP2; ssP++,sP++)
+            if (*sP-*ssP) {
+                return FALSE;
+            }
+    } else
+        for (; ssP!=ssP2; ssP++,sP++)
+            if (toupper(*sP)!=toupper(*ssP)) {
+                return FALSE;
+            }
+
+    return TRUE;
+}
+
+/*
+==============================================================
+Case Methods
+==============================================================
+*/
+
+void    _String::UpCase (void)
+{
+    for (unsigned long i = 0; i<sLength; i++) {
+        sData[i] = toupper (sData[i]);
+    }
+}
+
+void    _String::LoCase (void)
+{
+    for (unsigned long i = 0; i<sLength; i++) {
+        sData[i] = tolower (sData[i]);
+    }
+}
+
+void    _String::ProcessParameter(void)
+{
+    if (Equal(&getDString)) {
+        *this = ReturnDialogInput();
+    }
+}
+
+//==============================================================
+//Filename and Platform Methods
+//==============================================================
+
+bool    _String::ProcessFileName (bool isWrite, bool acceptStringVars, Ptr theP, bool assume_platform_specific, _ExecutionList * caller)
+{
+    _String errMsg;
+    
+    try {
+        if (Equal(&getFString) || Equal (&tempFString)) { // prompt user for file
+            if (Equal (&tempFString)) {
+                #if not defined __MINGW32__ && not defined __WINDOZE__
+                    #ifdef __MAC__
+                        char tmpFileName[] = "HYPHY-XXXXXX";
+                    #else
+                        char tmpFileName[] = "/tmp/HYPHY-XXXXXX";
+                    #endif
+                    
+                    int fileDescriptor = mkstemp(tmpFileName);
+                    if (fileDescriptor == -1){
+                        throw ("Failed to create a temporary file name");
+                    }
+                    *this = tmpFileName;
+                    CheckReceptacleAndStore(&useLastFString,empty,false, new _FString (*this, false), false);
+                    close (fileDescriptor);
+                    return true;
+                #else
+                    throw (tempFString & " is not implemented for this platform");
+                #endif
+            } else {
+                if (!isWrite) {
+                    *this = ReturnFileDialogInput();
+                } else {
+                    *this = WriteFileDialogInput ();
+                }
+            }
+            ProcessFileName(false,false,theP,
+            #if defined __MAC__ || defined __WINDOZE__
+                true
+            #else
+                false
+            #endif
+            ,caller);
+            
+            CheckReceptacleAndStore(&useLastFString,empty,false, new _FString (*this, false), false);
+            return true;
+        }
+
+        if (acceptStringVars) {
+            *this = ProcessLiteralArgument (this,(_VariableContainer*)theP, caller);
+            if (caller && caller->IsErrorState()) {
+                return false;
+            }
+        } else {
+            StripQuotes();
+        }
+
+        if (!sLength) {
+            return true;
+        }
+    }
+    
+    catch (_String errmsg) {
+        if (caller) {
+            caller->ReportAnExecutionError(errMsg);
+        } else {
+            WarnError(errMsg);
+        }
+        return false;
+    }
+
+
+#if (defined __UNIX__ || defined __HYPHY_GTK__) && !defined __MINGW32__
+//UNIX LINES HERE
+    if (Find('\\')!=-1) { // DOS (ASSUME RELATIVE) PATH
+        *this = Replace ("\\","/",true);
+    } else if (Find(':')!=-1) { // Mac (Assume Relative) PATH
+        *this = Replace ("::",":../", true);
+        if (getChar(0)==':') {
+            Trim(1,-1);
+        }
+        *this = Replace (':','/',true);
+    }
+
+    if (getChar(0) != '/') { // relative path
+        if (pathNames.lLength) {
+            _String*    lastPath = (_String*)pathNames(pathNames.lLength-1);
+            long        f = lastPath->sLength-2,
+                        k = 0;
+
+            // check the last stored absolute path and reprocess this relative path into an absolute.
+            while (beginswith("../")) {
+                if ( (f = lastPath->FindBackwards('/',0,f)-1) ==-1) {
+                    return true;
+                }
+                Trim(3,-1);
+                k++;
+            }
+            if (k==0) {
+                *this = *lastPath& (*this);
+            } else {
+                *this = lastPath->Cut(0,f+1)& (*this);
+            }
+        } 
+    }
+#endif
+
+#if defined __WINDOZE__ || defined __MINGW32__ // WIN/DOS code
+    if (Find('/')!=-1) { // UNIX PATH
+        if (getChar(0)=='/') {
+            Trim(1,-1);
+        }
+        *this = Replace ("/","\\",true);
+    } else {
+        if (Find('\\')==-1) {
+            // check to see if this is a relative path
+            *this = Replace ("::",":..\\", true);
+            if ((sData[0]==':')) {
+                Trim(1,-1);
+            }
+            *this = Replace (':','\\',true);
+        }
+    }
+
+    if (Find(':')==-1 && Find("\\\\",0,1)==-1) { // relative path
+
+        if (pathNames.lLength) {
+            _String* lastPath = (_String*)pathNames(pathNames.lLength-1);
+            long f = lastPath->sLength-2, k = 0;
+            // check the last stored absolute path and reprocess this relative path into an absolute.
+            while (beginswith("..\\")) {
+                f = lastPath->FindBackwards('\\',0,f)-1;
+                if (f==-1) {
+                    return false;
+                }
+                Trim(3,-1);
+                k++;
+            }
+            if (k==0) {
+                if (lastPath->sData[lastPath->sLength-1]!='\\') {
+                    *this = *lastPath&'\\'& (*this);
+                } else {
+                    *this = *lastPath& (*this);
+                }
+            } else {
+                *this = lastPath->Cut(0,f+1)& (*this);
+            }
+        } 
+
+    }
+
+    _String escapedString (sLength, true);
+    for (long stringIndex = 0; stringIndex < sLength; stringIndex ++) {
+        char currentChar = getChar (stringIndex);
+        //char b[256];
+        //snprintf (b, sizeof(b),"%c %d\n", currentChar, currentChar);
+        //BufferToConsole (b);
+        switch (currentChar) {
+        case '\t':
+            escapedString << '\\';
+            escapedString << 't';
+            break;
+        case '\n':
+            escapedString << '\\';
+            escapedString << 'n';
+            break;
+        default:
+            escapedString << currentChar;
+        }
+    }
+    escapedString.Finalize();
+    (*this) = escapedString;
+
+#endif
+
+#ifdef __MAC__
+    if (!assume_platform_specific && Find('/')!=-1) { // UNIX PATH
+        bool rootPath = false;
+        if (sData[0]=='/') {
+            rootPath = true;
+            *this = volumeName&Cut(1,-1);
+        }
+
+        if (beginswith("..")) {
+            *this = _String('/')&Cut(2,-1);
+        }
+
+        *this = Replace ("/",":",true);
+        *this = Replace ("..","",true);
+
+        if (sData[0]!=':' && !rootPath) {
+            *this = _String(':')&*this;
+        }
+    } else {
+        if (!assume_platform_specific && Find('\\')!=-1) { // DOS PATH (ASSUME PARTIAL)
+            if (beginswith("..")) {
+                *this = _String('\\')&Cut(2,-1);
+            }
+            *this = Replace ("\\",":",true);
+            *this = Replace ("..","",true);
+            if (Find(':')!=-1) {
+                *this = _String(':')&*this;
+            }
+        } else { // MAC PATH
+            if (Find(':')!=-1) {
+                if (sData[0]!=':') {
+                    if (!beginswith(volumeName)) {
+                        if (pathNames.lLength) {
+                            _String* lastPath = (_String*)pathNames(pathNames.lLength-1);
+                            if (!beginswith (lastPath->Cut (0,lastPath->Find(':')))) {
+                                *this = _String(':')&*this;
+                            }
+                        } else {
+                            *this = _String(':')&*this;
+                        }
+                    }
+                }
+            } else {
+                *this = _String(':')&*this;
+            }
+        }
+    }
+
+    if (sData[0]==':') { // relative path
+        long f = -1, k = 0;
+        if (pathNames.lLength) {
+            _String* lastPath = (_String*)pathNames(pathNames.lLength-1);
+            // check the last stored absolute path and reprocess this relative path into an absolute.
+            while (sData[k]==':') {
+                f = lastPath->FindBackwards(':',0,f)-1;
+                if (f==-1) {
+                    return true;
+                }
+                k++;
+            }
+            *this = lastPath->Cut(0,f+1)& Cut(k,-1);
+        } else {
+            *this = empty;
+        }
+    }
+#endif
+    return true;
+}
+
+//Compose two UNIX paths (abs+rel)
+_String _String::PathComposition (_String relPath)
+{
+    if (relPath.sData[0]!='/') { // relative path
+        long f = -1, k = 0;
+        f = sLength-2;
+        _String result = *this;
+
+        while (relPath.beginswith("../")) {
+
+            //Cut Trim relPath
+            f = FindBackwards('/',0,f)-1;
+
+            relPath = relPath.Chop(0,2);
+            result.Trim(0,f+1);
+
+            if (f==-1) {
+                return empty;
+            }
+            k++;
+
+        }
+
+        return result&relPath;
+    }
+
+    else {
+        return relPath;
+    }
+    return empty;
+}
+
+//Mac only so far
+_String _String::PathSubtraction (_String& p2, char)
+{
+    _String result;
+    char separator = GetPlatformDirectoryChar();
+
+    //if (pStyle == 0)
+    //    separator = ':';
+    long k;
+    for (k=0; (k<sLength)&&(k<p2.sLength)&&(sData[k]==p2.sData[k]); k++) ;
+    if (k>0) {
+        while (sData[k]!=separator) {
+            k--;
+        }
+        if (k>0) {
+            long m=k+1, levels = 0;
+            for (; m<sLength; m++)
+                if (sData[m]==separator) {
+                    levels++;
+                }
+            if (levels) {
+                result = separator;
+                while (levels) {
+                    result.Insert (separator,-1);
+                    levels--;
+                }
+            }
+            result = result & p2.Cut(k+1,-1);
+            return result;
+        }
+    }
+    return empty;
+}
+
+//TODO: These are global methods. Should they even be here?
+char GetPlatformDirectoryChar (void)
+{
+    char c = '/';
+#ifdef __MAC__
+    c = ':';
+#endif
+#if defined __WINDOZE__ || defined __MINGW32__
+    c = '\\';
+#endif
+
+    return c;
+}
+
+_String GetVersionString (void)
+{
+    _String theMessage = _String("HYPHY ")&__KERNEL__VERSION__;
+#ifdef __MP__
+    theMessage = theMessage & "(MP)";
+#endif
+#ifdef __HYPHYMPI__
+    theMessage = theMessage & "(MPI)";
+#endif
+    theMessage = theMessage & " for ";
+#ifdef __MAC__
+    theMessage = theMessage & "MacOS";
+#ifdef __HYPHYXCODE__
+    theMessage = theMessage & "(Universal Binary)";
+#else
+#ifdef TARGET_API_MAC_CARBON
+    theMessage = theMessage & "(Carbon)";
+#endif
+#endif
+#endif
+#ifdef __WINDOZE__
+    theMessage = theMessage & "Windows (Win32)";
+#endif
+#ifdef __UNIX__
+#if !defined __HEADLESS_WIN32__ && ! defined __MINGW32__
+    struct      utsname      name;
+    uname       (&name);
+    theMessage = theMessage & name.sysname & " on " & name.machine;
+#endif
+#if defined __MINGW32__
+    theMessage = theMessage & "MinGW ";// " & __MINGW32_VERSION;
+#endif
+#endif
+    return theMessage;
+}
+
+_String GetTimeStamp (bool doGMT)
+{
+    time_t cTime;
+    time (&cTime);
+
+    if (doGMT) {
+        tm* gmt = gmtime (&cTime);
+        return _String ((long)1900+gmt->tm_year) & '/' & _String (1+(long)gmt->tm_mon) & '/'
+               & _String ((long)gmt->tm_mday) & ' ' & _String ((long)gmt->tm_hour) & ':' & _String ((long)gmt->tm_min);
+    }
+
+    tm*     localTime = localtime (&cTime);
+
+    return  asctime (localTime);
+
+}
+
+/*
+==============================================================
+Identifier Methods
+==============================================================
+*/
+
+bool    _String::IsValidIdentifier (bool strict)
+{
+    if (sLength == 0) { 
+        return false;
+    }    
+
+    if (strict) {
+        if (!(isalpha(sData[0]) || sData[0]=='_' )) { 
+            return false;
+        }    
+    } else if (!(isalnum(sData[0]) || sData[0]=='_' )) { 
+        return false;
+    }    
+
+
+    for(unsigned long p = 1; p<sLength; p++) {
+        char c = sData[p];
+        if (!(isalnum(c)|| c=='_' || (strict && c == '.'))) {
+            return false;
+        }    
+    }    
+
+    // check to see if it's not a keyword / function name etc
+
+    return hyReservedWords.Find (this) == -1;
+}
+
+bool    _String::IsValidRefIdentifier (void)
+{
+    if (sLength<2) {
+        return false;
+    }
+    if (sData[sLength-1]=='&') {
+        return Cut(0,sLength-2).IsValidIdentifier();
+    }
+    return false;
+}
+
+//Convert a string to a valid ident
+void _String::ConvertToAnIdent (bool strict)
+{
+    _String * result = new _String ((unsigned long)sLength+1,true);
+    if (!result) {
+        checkPointer (result);
+    }
+
+    if (sLength) {
+        if (strict) {
+            if (((sData[0]>='a')&&(sData[0]<='z'))||((sData[0]>='A')&&(sData[0]<='Z'))||(sData[0]=='_')) {
+                (*result)<<sData[0];
+            } else {
+                (*result)<<'_';
+            }
+        } else {
+            if (((sData[0]>='a')&&(sData[0]<='z'))||((sData[0]>='A')&&(sData[0]<='Z'))||(sData[0]=='_')||((sData[0]>='0')&&(sData[0]<='9'))) {
+                (*result)<<sData[0];
+            } else {
+                (*result)<<'_';
+            }
+        }
+
+        long l = 0;
+        for (long k=1; k<sLength; k++) {
+            unsigned char c = sData[k];
+            if (_hyValidIDChars.valid_chars[c]) {
+                (*result)<<c;
+                l++;
+            } else if (result->sData[l] != '_') {
+                (*result)<<'_';
+                l++;
+            }
+        }
+    }
+    result->Finalize();
+
+    CopyDynamicString (result, true);
+}
+
+_String _String::ShortenVarID (_String& containerID)
+{
+    long matched=-1,
+         upTo = sLength<containerID.sLength?sLength:containerID.sLength,
+         k;
+
+    for (k=0; k<upTo; k++) {
+        if (sData[k]!=containerID.sData[k]) {
+            break;
+        } else if (sData[k] == '.') {
+            matched = k;
+        }
+    }
+
+    if ((upTo==containerID.sLength)&&(upTo<sLength)&&(k==upTo)&&(sData[upTo]=='.')) {
+        matched = upTo;
+    }
+
+    return Cut (matched+1,-1);
+}
+
+/*
+==============================================================
+Regular Expression Methods
+==============================================================
+*/
+
+_String GetRegExpError(int error)
+{
+    char buffer [512];
+    buffer[regerror (error, nil, buffer, 511)] = 0;
+    return _String("Regular Expression error:")&buffer;
+}
+
+void FlushRegExp(Ptr regExpP)
+{
+    regex_t*        regEx = (regex_t*)regExpP;
+    regfree        (regEx);
+    delete          regEx;
+}
+
+Ptr PrepRegExp(_String* source, int& errCode, bool caseSensitive)
+{
+    regex_t  * res = new regex_t;
+    checkPointer (res);
+
+    errCode = regcomp (res, source->sData, REG_EXTENDED|(caseSensitive?0:REG_ICASE));
+
+    if (errCode) {
+        FlushRegExp ((Ptr)res);
+        return nil;
+    }
+    return (Ptr)res;
+}
+
+void _String::RegExpMatch(Ptr pattern, _SimpleList& matchedPairs)
+{
+    if (sLength) {
+        regex_t*        regEx = (regex_t*)pattern;
+
+        regmatch_t*     matches = new regmatch_t [regEx->re_nsub+1];
+        int             errNo = regexec (regEx, sData,regEx->re_nsub+1, matches, 0);
+        if (errNo == 0) {
+            for (long k=0; k<=regEx->re_nsub; k++) {
+                matchedPairs << matches[k].rm_so;
+                matchedPairs << matches[k].rm_eo-1;
+            }
+        }
+        delete      []  matches;
+    }
+}
+
+void _String::RegExpMatchAll(Ptr pattern, _SimpleList& matchedPairs)
+{
+    if (sLength) {
+        regex_t*        regEx = (regex_t*)pattern;
+
+        regmatch_t*     matches = new regmatch_t [regEx->re_nsub+1];
+        int             errNo =  regexec (regEx, sData,regEx->re_nsub+1, matches, 0);
+        while (errNo == 0) {
+            long         offset = matchedPairs.lLength?matchedPairs.lData[matchedPairs.lLength-1]+1:0;
+
+            matchedPairs << matches[0].rm_so+offset;
+            matchedPairs << matches[0].rm_eo-1+offset;
+
+            offset += matches[0].rm_eo;
+            if (offset < sLength) {
+                errNo =  regexec (regEx, sData+offset ,regEx->re_nsub+1, matches, 0);
+            } else {
+                break;
+            }
+        }
+        delete  []      matches;
+    }
+}
+
+void _String::RegExpMatchOnce(_String* pattern, _SimpleList& matchedPairs, bool caseSensitive, bool handleErrors)
+{
+    if (sLength) {
+        int errNo = 0;
+        Ptr regex = PrepRegExp (pattern, errNo, caseSensitive);
+        if (regex) {
+            RegExpMatch (regex, matchedPairs);
+            FlushRegExp (regex);
+        } else if (handleErrors) {
+            WarnError (GetRegExpError (errNo));
+        }
+    }
+}
+
+_String _String::Random(const unsigned long length, const _String * alphabet)
+{
+    _String random (length + 1, true);
+    unsigned long alphabet_length = alphabet?alphabet->sLength:127;
+    if (length > 0 && alphabet_length > 0) {
+        for (unsigned long c = 0; c < length; c++) {
+            unsigned long idx = genrand_int32 () % alphabet_length;
+            if (alphabet) {
+                random << alphabet->sData[idx];
+            } else {
+                random << (char)(1+idx);
+            }
+        }
+    }
+    
+    random.Finalize();
+    return random;
+}
+
+unsigned char _String::ProcessVariableReferenceCases (_String& referenced_object, _String * context) {
+    char first_char    = getChar(0);
+    bool is_func_ref  = getChar(sLength-1) == '&';
+         
+    if (first_char == '*' || first_char == '^') {
+        if (is_func_ref) {
+            referenced_object = empty;
+            return HY_STRING_INVALID_REFERENCE;
+        }
+        bool is_global_ref = first_char == '^';
+        _String   choppedVarID (*this, 1, -1);
+        if (context) {
+            choppedVarID = *context & '.' & choppedVarID;
+        }
+        _FString * dereferenced_value = (_FString*)FetchObjectFromVariableByType(&choppedVarID, STRING);
+        if (dereferenced_value && dereferenced_value->theString->ProcessVariableReferenceCases (referenced_object) == HY_STRING_DIRECT_REFERENCE) {
+            if (!is_global_ref && context) {
+                referenced_object = *context & '.' & referenced_object;
+            }
+            return is_global_ref?HY_STRING_GLOBAL_DEREFERENCE:HY_STRING_LOCAL_DEREFERENCE;
+        }
+    }
+    
+    if (is_func_ref) {
+        referenced_object = Cut (0, sLength-2);
+        if (referenced_object.IsValidIdentifier()) {
+            referenced_object = (context? (*context & '.' & referenced_object): (referenced_object)) & '&';
+            return HY_STRING_DIRECT_REFERENCE;
+        }    
+    }
+    else {
+        if (IsValidIdentifier()) {
+          if (context) {
+            _String cdot = *context & '.';
+            referenced_object = startswith(cdot) ? * this : (cdot & *this);
+          } else {
+            referenced_object = *this;
+          }
+            return HY_STRING_DIRECT_REFERENCE;
+        }
+    }
+    
+    referenced_object = empty;
+    return HY_STRING_INVALID_REFERENCE;
+}
diff --git a/src/core/trie.cpp b/src/core/trie.cpp
new file mode 100644
index 0000000..58a8e42
--- /dev/null
+++ b/src/core/trie.cpp
@@ -0,0 +1,463 @@
+/*
+
+HyPhy - Hypothesis Testing Using Phylogenies.
+
+Copyright (C) 1997-now
+Core Developers:
+  Sergei L Kosakovsky Pond (spond at ucsd.edu)
+  Art FY Poon    (apoon at cfenet.ubc.ca)
+  Steven Weaver (sweaver at ucsd.edu)
+  
+Module Developers:
+	Lance Hepler (nlhepler at gmail.com)
+	Martin Smith (martin.audacis at gmail.com)
+
+Significant contributions from:
+  Spencer V Muse (muse at stat.ncsu.edu)
+  Simon DW Frost (sdf22 at cam.ac.uk)
+
+Permission is hereby granted, free of charge, to any person obtaining a
+copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be included
+in all copies or substantial portions of the Software.
+
+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.
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+*/
+
+#include "trie.h"
+
+//----------------------------------------------------------------------------------------------------------------------
+
+_Trie::_Trie (const _String* alphabet) {
+    SetAlphabet (alphabet, false);
+    AppendNewInstance(new _SimpleList);
+    payload << 0L;
+    parents <<-1L;
+}
+       
+//----------------------------------------------------------------------------------------------------------------------
+
+_Trie::~_Trie (void){
+    
+}
+       
+//----------------------------------------------------------------------------------------------------------------------
+
+void _Trie::Clear (bool all){
+    _List::Clear (all);
+    payload.Clear(all);
+    emptySlots.Clear(all);
+    AppendNewInstance(new _SimpleList);
+    payload << 0L;
+    parents <<-1L;
+}
+
+//----------------------------------------------------------------------------------------------------------------------
+
+_String _Trie::Alphabet (void)
+{
+    _String result (256L, true);
+    for (unsigned long charIndex = 0; charIndex < 256; charIndex++) {
+        if (charMap.lData[charIndex] >= 0)
+            result << char (charIndex);
+    }
+    result.Finalize();
+    return result;
+}
+
+//----------------------------------------------------------------------------------------------------------------------
+
+void _Trie::SetAlphabet (const _String* alphabet, bool doClear)
+{
+    if (doClear) {
+        Clear (true);
+        charMap.Clear();
+    }
+
+    if (alphabet) {
+        charMap.Populate (256,-1,0);
+        unsigned long charCounter = 0;
+        charMap.lData[0] = 1; // always allow the '\0' character
+        for (unsigned long charIndex = 0; charIndex < alphabet->sLength; charIndex++) {
+            charMap.lData [(unsigned char)alphabet->sData[charIndex]] = 1;
+        }
+        // now sort alphabetically
+        for (unsigned long charIndex = 0; charIndex < 256; charIndex++) {
+            if (charMap.lData[charIndex] == 1)
+                charMap.lData[charIndex] = charCounter++;
+        }
+    } else {
+        charMap.Populate (256,0,1);
+    }
+}
+
+//----------------------------------------------------------------------------------------------------------------------
+
+BaseRef _Trie::makeDynamic (void) {
+    _Trie *newTrie = new _Trie ();
+    newTrie->Duplicate (newTrie);
+    return newTrie;
+          
+}
+
+//----------------------------------------------------------------------------------------------------------------------
+
+void _Trie::Duplicate (BaseRef storage) {
+    _Trie* newTrie = (_Trie*)storage;
+    _String myAlphabet = Alphabet();
+    newTrie->SetAlphabet (&myAlphabet, true);
+    newTrie->_List::Duplicate ((_List*)this);
+    newTrie->charMap.Duplicate (&charMap);
+    newTrie->emptySlots.Duplicate (&emptySlots);
+    newTrie->payload.Duplicate(&payload);
+    newTrie->parents.Duplicate(&parents);
+          
+}        
+    
+//----------------------------------------------------------------------------------------------------------------------
+
+long    _Trie::FindNextLetter (const char letter, const unsigned long current_index) {
+    long letterKey = charMap.lData[(const unsigned char)letter];
+    if (letterKey >= 0) {
+        _SimpleList* thisList = ((_SimpleList**)lData)[current_index];
+        letterKey = thisList->FindStepping (letterKey, 2, 0);
+        if (letterKey < 0)
+            return HY_TRIE_NOTFOUND;
+        return thisList->lData[letterKey+1];
+    }
+    return HY_TRIE_INVALID_LETTER;
+}
+
+//----------------------------------------------------------------------------------------------------------------------
+long  _Trie::FindNextUnusedIndex (bool alloc){
+    
+    if (emptySlots.lLength) {
+        long newIndex = emptySlots.Pop();
+        if (alloc)
+            ((_SimpleList**)lData)[newIndex] = new _SimpleList;
+        return newIndex;
+    }  
+    payload << 0;
+    parents << 0;
+    if (alloc)
+        AppendNewInstance(new _SimpleList);
+    else
+        *((_SimpleList*)this)<<0L;
+
+    return lLength - 1;
+}
+
+//----------------------------------------------------------------------------------------------------------------------
+
+long    _Trie::InsertNextLetter (const char letter, const unsigned long current_index) {
+    long letter_key = charMap.lData[(const unsigned char)letter];
+    if (letter_key >= 0) {
+        long next_index = FindNextUnusedIndex (letter != 0);
+        _SimpleList * currentList = ((_SimpleList**)lData)[current_index];
+        (*currentList) << letter_key;
+        (*currentList) << next_index;
+        parents.lData[next_index] = current_index;
+        return next_index;
+    }
+    return HY_TRIE_INVALID_LETTER;
+}
+
+
+//----------------------------------------------------------------------------------------------------------------------
+long     _Trie::Find (const _String& key, _SimpleList* path, bool prefixOK){
+    long current_index = 0,
+         next_index    = 0;
+    for (long k = 0; k <= key.sLength && current_index >= 0; k++){
+       next_index = FindNextLetter (key.sData[k], current_index);
+       if (path)
+            (*path) << next_index;
+       if (next_index < 0 && prefixOK) {
+           next_index = FindNextLetter (0, current_index);
+           current_index = next_index;
+           break;
+       }
+       current_index = next_index;
+    }
+    return current_index;
+}
+
+//----------------------------------------------------------------------------------------------------------------------
+long     _Trie::Find (const char key, bool prefixOK){
+    long current_index = 0,
+    next_index    = FindNextLetter (key, current_index);
+    if (next_index < 0 && prefixOK) {
+        next_index = FindNextLetter (0, current_index);
+    }
+    current_index = next_index;
+    return current_index;
+}
+
+//----------------------------------------------------------------------------------------------------------------------
+long     _Trie::GetValueFromString (const _String& key){
+    long keyIndex = Find(key);
+    if (keyIndex != HY_TRIE_NOTFOUND) {
+        return GetValue (keyIndex);
+    }
+    return HY_TRIE_NOTFOUND;
+}
+
+
+//----------------------------------------------------------------------------------------------------------------------
+void     _Trie::UpdateValue(const long key, const long value) {
+    if (key >= 0 && key < payload.lLength)
+        payload.lData[key] = value;
+}
+
+//----------------------------------------------------------------------------------------------------------------------
+long     _Trie::GetValue(const long key) {
+    if (key >= 0 && key < payload.lLength)
+        return payload.lData[key];
+    
+    return 0L;
+}
+
+//----------------------------------------------------------------------------------------------------------------------
+
+long    _Trie::Insert (const char* key, const long value, bool return_index) {
+    _String key_string(key);
+    long ret_value = Insert  (key_string, value);
+    if (ret_value >= 0 && return_index == false) {
+        return key_string.sLength;
+    }
+    return ret_value;
+}
+
+
+//----------------------------------------------------------------------------------------------------------------------
+
+long    _Trie::Insert (const _String& key, const long value) {
+    // the root is always at index 0
+    long current_index  = 0, 
+         current_char   = 0,
+         next_index     = FindNextLetter(key.sData[current_char++], current_index);
+    
+    while (next_index >= 0 && current_char <= key.sLength) {
+        current_index = next_index;
+        next_index     = FindNextLetter(key.sData[current_char++], current_index);
+    }
+    
+    if (next_index == HY_TRIE_INVALID_LETTER)
+        return HY_TRIE_INVALID_LETTER;
+    
+    if (current_char == key.sLength && next_index >= 0)
+        return next_index;
+    
+    current_char --;
+    
+    // validate the rest of the string
+    
+    for (long k = current_char; k <= key.sLength; k++) {
+        if (charMap[key.sData[k]] < 0)
+            return HY_TRIE_INVALID_LETTER;
+    }
+    
+     // insert the rest of the string
+    for (; current_char <= key.sLength; current_char++) {
+        //printf ("\nInserting %c\n", key.sData[current_char]);
+        current_index = InsertNextLetter (key.sData[current_char], current_index);      
+        //DumpRaw ();
+   }
+    
+    UpdateValue (current_index, value);
+
+    return current_index;
+}
+
+//----------------------------------------------------------------------------------------------------------------------
+
+unsigned long    _Trie::Insert (const _List& key, const _SimpleList* values) {
+    unsigned long how_many = 0;
+    for (long k = 0; k < key.lLength; k++) {
+        _String serializedKey ((_String*)((BaseRef*)key.lData)[k]->toStr());
+        
+        long this_index = Insert (serializedKey, values?values->lData[k]:0);
+        if (this_index >= 0) {
+            how_many ++;
+        }
+    }
+    return how_many;
+}
+
+//----------------------------------------------------------------------------------------------------------------------
+bool    _Trie::Delete (const _String& key){
+    _SimpleList history;
+    long found_key = Find (key, &history);
+    if (found_key >= 0) {
+        // now traverse the history list backwards and delete all keys that have no children
+        for (long k = history.lLength-1; k>=0; k--) {
+            _SimpleList * current_list = ((_SimpleList**)lData)[history.lData[k]];
+            if (current_list == nil || current_list->lLength <= 1){
+                emptySlots << history.lData[k];
+                payload.lData[history.lData[k]] = 0L;
+                parents.lData[history.lData[k]] = -1L;
+                _SimpleList * parentList = ((_SimpleList**)lData)[history.lData[k-1]];
+                unsigned long parentNode = parentList->FindStepping (history.lData[k],2, 1) - 1;
+                parentList->Delete (parentNode);
+                parentList->Delete (parentNode);
+                DeleteObject (current_list);
+                ((_SimpleList**)lData)[history.lData[k]] = nil;
+            }
+        }
+        return true;
+    }
+    return false;
+}
+
+//----------------------------------------------------------------------------------------------------------------------
+bool    _Trie::Delete (const char* key){
+    _String string_key (key);
+    return Delete (string_key);
+}
+
+//----------------------------------------------------------------------------------------------------------------------
+unsigned long     _Trie::Delete (const _List& key){
+     unsigned long how_many = 0;
+    for (long k = 0; k < key.lLength; k++) {
+        _String serializedKey ((_String*)((BaseRef*)key.lData)[k]->toStr());
+        
+        long this_index = Delete (serializedKey);
+        
+        if (this_index >= 0) {
+            how_many ++;
+        }
+    }
+    return how_many;
+}
+
+ //----------------------------------------------------------------------------------------------------------------------
+_String*         _Trie::RetrieveStringFromPath (const _SimpleList& path, _String* alphabet) {
+    _String* this_string = new _String (128L,true),
+           * my_alph      = alphabet? alphabet : new _String (Alphabet());
+    
+    
+    for (long k = 0; k < path.lLength - 4; k+=2) {
+         _SimpleList* current_list     = ((_SimpleList**)lData)[path.lData[k]];
+         long         current_position = path.lData[k+1];
+         (*this_string) << my_alph->sData[current_list->lData[current_position]];
+    }
+    
+    this_string->Finalize();
+    
+    if (!alphabet)
+        DeleteObject(my_alph);
+    
+    return this_string;
+}
+  
+//----------------------------------------------------------------------------------------------------------------------
+void    _Trie::DumpRaw() {
+    _String alph       = Alphabet(); 
+    for (long k = 0; k < lLength; k++) {
+        if (emptySlots.Find(k) < 0) {
+            printf ("Position %ld:\n", k);
+            _SimpleList * this_list = ((_SimpleList**)lData)[k];
+            for (long m = 0; m < this_list->lLength; m+=2) {
+                printf ("'%c'(%ld) -> %ld\n", (char)this_list->lData[m], this_list->lData[m], this_list->lData[m+1]);
+            }
+            
+        } else {
+            printf ("Position %ld is unused\n", k);
+        }
+    }
+}
+                                                            
+//----------------------------------------------------------------------------------------------------------------------
+
+BaseRef     _Trie::toStr() {
+    _String         * serialized = new _String (128L, true),
+                      alph       = Alphabet();
+                      
+    _SimpleList       traversal_history, 
+                        // 2 indices per entry: node and current position (in multiples of 2)
+                      *root_list = ((_SimpleList**)lData)[0];
+                      
+    traversal_history << 0; traversal_history << 0;
+    
+    bool doComma = false;
+    
+    (*serialized) << '{';
+    while (!(traversal_history.lLength == 2 && traversal_history.lData[1] == root_list->lLength)) {
+        _SimpleList* current_list = ((_SimpleList**)lData)[traversal_history.lData[traversal_history.lLength-2]];
+        long current_position = traversal_history.lData[traversal_history.lLength-1];
+        // if current list is empty, then generate a string based on the path, and advance up the chain
+        if (current_list && current_list->lLength) {
+            if (current_position < current_list->lLength) {
+                traversal_history << current_list->lData[current_position+1];
+                traversal_history << 0;
+            } else {
+                traversal_history.Pop();
+                traversal_history.Pop();
+                traversal_history.lData[traversal_history.lLength-1] += 2; // advance the counter in the parent
+           }
+        } else {
+            _String * this_string = RetrieveStringFromPath(traversal_history, &alph);
+            (*serialized) << '"';
+            (*serialized) << this_string;
+            (*serialized) << "\":";
+            (*serialized) << _String (GetValue (traversal_history.lData[traversal_history.lLength-2]));
+            if (doComma) {
+                (*serialized) << ',';
+            } else {
+                doComma = true;
+            }
+            (*serialized) << '\n';
+            traversal_history.Pop();
+            traversal_history.Pop();            
+            traversal_history.lData[traversal_history.lLength-1] += 2; // advance the counter in the parent
+       }
+    }
+    
+    (*serialized) << '}';
+    serialized->Finalize();
+    return serialized;
+}
+ 
+//----------------------------------------------------------------------------------------------------------------------
+
+_String  _Trie::RetrieveKeyByPayload (const long key){
+    long key_index = payload.Find (key);
+    if (key_index >= 0) {
+        _SimpleList parent_indices,
+                    traversal_history;
+        long keyer = key_index;
+        do{
+            parent_indices << keyer;
+            keyer = parents.lData[keyer];
+        }
+        while (keyer > 0);
+        parent_indices << 0;
+        parent_indices.Flip();
+        
+        
+        for (long i = 0; i < parent_indices.lLength-1; i++) {
+            traversal_history << parent_indices.lData[i];
+            traversal_history << (((_SimpleList**)lData)[parent_indices.lData[i]])->FindStepping (parent_indices.lData[i+1],2,1)-1;
+        }
+        traversal_history << key_index;
+        traversal_history << 0L;
+        _String alph = Alphabet();
+        return _String(RetrieveStringFromPath(traversal_history, &alph));
+        
+    }
+    return empty;
+}
+
+
diff --git a/src/core/variable.cpp b/src/core/variable.cpp
new file mode 100644
index 0000000..fbc7cae
--- /dev/null
+++ b/src/core/variable.cpp
@@ -0,0 +1,676 @@
+/*
+ 
+ HyPhy - Hypothesis Testing Using Phylogenies.
+ 
+ Copyright (C) 1997-now
+ Core Developers:
+ Sergei L Kosakovsky Pond (spond at ucsd.edu)
+ Art FY Poon    (apoon at cfenet.ubc.ca)
+ Steven Weaver (sweaver at ucsd.edu)
+ 
+ Module Developers:
+ Lance Hepler (nlhepler at gmail.com)
+ Martin Smith (martin.audacis at gmail.com)
+ 
+ Significant contributions from:
+ Spencer V Muse (muse at stat.ncsu.edu)
+ Simon DW Frost (sdf22 at cam.ac.uk)
+ 
+ Permission is hereby granted, free of charge, to any person obtaining a
+ copy of this software and associated documentation files (the
+ "Software"), to deal in the Software without restriction, including
+ without limitation the rights to use, copy, modify, merge, publish,
+ distribute, sublicense, and/or sell copies of the Software, and to
+ permit persons to whom the Software is furnished to do so, subject to
+ the following conditions:
+ 
+ The above copyright notice and this permission notice shall be included
+ in all copies or substantial portions of the Software.
+ 
+ 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.
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ 
+ */
+
+#include "defines.h"
+#include "variable.h"
+#include "operation.h"
+
+#include "likefunc.h"
+#include "parser.h"
+#include "polynoml.h"
+#include "batchlan.h"
+
+extern _SimpleList freeSlots;
+extern _SimpleList deferIsConstant;
+
+//__________________________________________________________________________________
+
+_Variable::_Variable (void)
+{
+    varFormula = nil;
+    varFlags   = HY_VARIABLE_NOTSET;
+    theName    = nil;
+    varValue   = nil;
+    theIndex   = -1;
+    SetBounds (DEFAULTLOWERBOUND, DEFAULTUPPERBOUND);
+}
+
+//__________________________________________________________________________________
+void _Variable::Initialize (void)
+{
+    //_Formula::Initialize();
+    _Constant::Initialize();
+    theName = (_String*)checkPointer(new _String());
+    varValue = nil;
+    theIndex = -1;
+    varFlags = HY_VARIABLE_NOTSET;
+    SetBounds (DEFAULTLOWERBOUND, DEFAULTUPPERBOUND);
+}
+
+//__________________________________________________________________________________
+void _Variable::Duplicate (BaseRef r)
+{
+    _Variable *v = (_Variable*)r;
+    //theFormula.Duplicate (&(v->theFormula));
+    if (v->varFormula) {
+        varFormula = new _Formula();
+        varFormula->theFormula.Duplicate (&v->varFormula->theFormula);
+    } else {
+        varFormula = nil;
+    }
+
+    //theStack.theStack.Duplicate (&(v->theStack.theStack));
+    //theStack.theStack.Clear();
+    theValue = v->theValue;
+    varValue = v->varValue;
+    if (varValue) {
+        varValue->nInstances++;
+    }
+    theIndex = v->theIndex;
+    theName = v->theName;
+    theName->nInstances++;
+    lowerBound = v->lowerBound;
+    upperBound = v->upperBound;
+    //hasBeenChanged = v->hasBeenChanged;
+    varFlags = v->varFlags;
+}
+
+//__________________________________________________________________________________
+BaseRef _Variable::makeDynamic (void)
+{
+    _Variable * res = new _Variable;
+    if (!res) {
+        isError(0);
+        return nil;
+    }
+    //memcpy ((char*)res, (char*)this, sizeof (_Variable));
+    res->Duplicate(this);
+    return res;
+}
+
+//__________________________________________________________________________________
+bool _Variable::CheckFForDependence (long idx, bool opt)
+{
+    if (varFormula) {
+        return varFormula->CheckFForDependence (idx, opt);
+    }
+
+    return false;
+}
+
+//__________________________________________________________________________________
+BaseRef _Variable::toStr(void)
+{
+    if (varValue&&varValue->IsPrintable()) {
+        return varValue->toStr();
+    }
+    _PMathObj vv = Compute();
+    if (!vv) {
+        return new _String("NAN");
+    }
+    return new _String((_String*)vv->toStr());
+}
+
+//__________________________________________________________________________________
+void _Variable::toFileStr(FILE* f)
+{
+    if (varValue&&varValue->IsPrintable()) {
+        varValue->toFileStr(f);
+    } else {
+        _PMathObj vv = Compute();
+        if (!vv) {
+            fprintf(f,"NAN");
+        } else {
+            vv->toFileStr(f);
+        }
+    }
+
+}
+//__________________________________________________________________________________
+
+_Variable::_Variable (_String&s, bool isG)
+{
+    theName         = (_String*)checkPointer(new _String(s));
+    varFlags        = HY_VARIABLE_NOTSET|(isG?HY_VARIABLE_GLOBAL:0);
+    varValue        = nil;
+    varFormula      = nil;
+    SetBounds       (DEFAULTLOWERBOUND, DEFAULTUPPERBOUND);
+    InsertVar       (this);
+}
+
+//__________________________________________________________________________________
+
+_Variable::_Variable (_String&s, _String&f, bool isG)//:  _Formula (f)
+{
+    //hasBeenChanged = false;
+    //isGlobal = isG;
+    theName     = (_String*)checkPointer(new _String(s));
+    varFlags    = isG?HY_VARIABLE_GLOBAL:0;
+    varValue    = nil;
+    SetBounds   (DEFAULTLOWERBOUND, DEFAULTUPPERBOUND);
+    InsertVar   (this);
+    varFormula = new _Formula (f);
+    if (varFormula->IsAConstant()) {
+        _PMathObj theP = varFormula->Compute();
+        if (theP) {
+            SetValue (theP);
+            delete   (varFormula);
+            varFormula = nil;
+        } else {
+            return;
+        }
+    }
+}
+
+
+
+//__________________________________________________________________________________
+
+_Variable::~_Variable (void)
+{
+    nInstances++;
+    if (varValue) {
+        DeleteObject (varValue);
+    }
+    if (theName) {
+        DeleteObject (theName);
+    }
+    if (varFormula) {
+        delete (varFormula);
+    }
+}
+
+//__________________________________________________________________________________
+bool    _Variable::IsVariable (void)
+{
+    return true;
+}
+
+//__________________________________________________________________________________
+
+void        _Variable::ScanForVariables (_AVLList& l, bool globals, _AVLListX* tagger, long weight) {
+    if (varValue) {
+        varValue->ScanForVariables (l, globals,tagger, weight);
+    }
+    if (varFormula && varFormula->theFormula.lLength) {
+        varFormula->ScanFForVariables(l,globals, false, true, false,tagger, weight);
+    }
+}
+
+
+//__________________________________________________________________________________
+
+_PMathObj  _Variable::Compute (void) // compute or return the value
+{
+    if (varFormula == nil) { // no formula, just return the value
+        if (varValue) {
+            return varValue->Compute();
+        }
+
+        if (varFlags & HY_VARIABLE_NOTSET) {
+            ReportWarning (_String ("Variable '") & *GetName() & "' was not initialized prior to being used");
+        }
+
+        varValue =  new _Constant(theValue);
+    } else {
+        //printf ("Recomputing value of %s\n", theName->sData);
+        if (useGlobalUpdateFlag) {
+            if ((varFlags & HY_DEP_V_COMPUTED) && varValue) {
+                return varValue;
+            } else if (varFormula->HasChanged()||!varValue) {
+                DeleteObject (varValue);
+                varValue = (_PMathObj)varFormula->Compute()->makeDynamic();
+            }
+
+            varFlags |= HY_DEP_V_COMPUTED;
+        } else if (varFormula->HasChanged()||!varValue) {
+            DeleteObject (varValue);
+            varValue = (_PMathObj)varFormula->Compute()->makeDynamic();
+        }
+
+    }
+
+    return varValue;
+}
+
+//__________________________________________________________________________________
+
+void  _Variable::CompileListOfDependents (_SimpleList& rec)
+{
+    _SimpleList tcache;
+    long        iv,
+                i = variableNames.Traverser (tcache,iv,variableNames.GetRoot());
+
+    for (; i >= 0; i = variableNames.Traverser (tcache,iv)) {
+        _Variable* thisVar = FetchVar (i);
+        if (!thisVar->IsIndependent()) {
+            if (thisVar->CheckFForDependence (theIndex)) {
+                long f = thisVar->GetAVariable();
+                if (rec.Find(f)<0) {
+                    rec<<f;
+                }
+            }
+        }
+    }
+}
+
+//__________________________________________________________________________________
+void  _Variable::SetValue (_PMathObj theP, bool dup) // set the value of the var
+{
+    //hasBeenChanged = true;
+    varFlags &= HY_VARIABLE_SET;
+    varFlags |= HY_VARIABLE_CHANGED;
+
+    long     valueClass = theP->ObjectClass();
+
+    if (valueClass==NUMBER) {
+        if (varFormula) {
+
+            // also update the fact that this variable is no longer dependent in all declared
+            // variable containers which contain references to this variable
+            for (unsigned long i = 0UL; i<variablePtrs.lLength; i++) {
+                if (freeSlots.Find(i)>=0) {
+                    continue;
+                }
+                _Variable* theV = (_Variable*)variablePtrs(i);
+                if (theV->IsContainer()) {
+                    _VariableContainer* theVC = (_VariableContainer*)theV;
+                    if (!theVC->RemoveDependance (theIndex)) {
+                        ReportWarning ((_String("Can't make variable ")&*GetName()&" independent in the context of "&*theVC->GetName()&" because its template variable is not independent."));
+                        continue;
+                    }
+                }
+            }
+            for (unsigned long i = 0UL; i<likeFuncList.lLength; i++)
+                if (((_String*)likeFuncNamesList(i))->sLength) {
+                    ((_LikelihoodFunction*)likeFuncList(i))->UpdateDependent(theIndex);
+                }
+
+            //_Formula::Clear();
+            delete (varFormula);
+            varFormula = nil;
+        }
+        if (varValue) {
+            DeleteObject (varValue);
+            varValue=nil;
+        }
+
+        theValue = theP->Value();
+
+        if (!dup) {
+            DeleteObject (theP);
+        }
+
+        if (theValue<lowerBound || theValue>upperBound) {
+            if (theValue <= lowerBound+1e-50) {
+                theValue = lowerBound;
+            } else {
+                theValue = upperBound;
+            }
+        }
+    } else {
+        if (varFormula) {
+            delete (varFormula);
+            varFormula = nil;
+            //theFormula.Clear();
+        }
+        if (varValue) {
+            DeleteObject (varValue);
+            varValue=nil;
+        }
+        if (valueClass==TREE) {
+            variablePtrs.lData[theIndex] = (long)(((_TheTree*)theP)->makeDynamicCopy(GetName()));
+            DeleteObject(this);
+        } else {
+            if (dup) {
+                varValue = (_PMathObj)theP->makeDynamic();
+            } else {
+                varValue = theP;
+            }
+        }
+    }
+}
+
+//__________________________________________________________________________________
+void  _Variable::SetNumericValue (_Parameter v) // set the value of the var to a number
+{
+    //hasBeenChanged = true;
+    varFlags &= HY_VARIABLE_SET;
+    varFlags |= HY_VARIABLE_CHANGED;
+    theValue = v;
+
+    if (theValue<lowerBound || theValue>upperBound) {
+        if (theValue<=lowerBound+1e-50) {
+            theValue = lowerBound;
+        } else {
+            theValue = upperBound;
+        }
+    }
+}
+
+//__________________________________________________________________________________
+
+void  _Variable::CheckAndSet (_Parameter c, bool oob) // set the value of the var
+{
+    //hasBeenChanged = true;
+    varFlags &= HY_VARIABLE_SET;
+    varFlags |= HY_VARIABLE_CHANGED;
+    _Parameter l = lowerBound+1.0e-30,
+               u = upperBound-1.0e-30;
+    if (c<l || c>u ) {
+        if (oob) {
+            return;
+        }
+
+        if (c<l) {
+            theValue = l;
+        } else {
+            theValue = u;
+        }
+    } else {
+        theValue = c;
+    }
+
+    if (varValue) {
+        DeleteObject (varValue);
+    }
+
+    varValue =  new _Constant(theValue);
+}
+
+//__________________________________________________________________________________
+void    _Variable::SetBounds (_Parameter lb, _Parameter ub)
+{
+    lowerBound = lb;
+    upperBound = ub;
+
+    /*_String * myName = GetName();
+    if (myName)
+        ReportWarning (_String ("Set variable bounds for '") & *myName & "' to [" & lb & ',' & ub & "].");
+     */
+}
+
+//__________________________________________________________________________________
+void    _Variable::EnsureTheValueIsInBounds (void)
+{
+    if (ObjectClass () == NUMBER && IsIndependent()) {
+        _Constant*   myValue = (_Constant*) Compute();
+        if (myValue->Value() < lowerBound) {
+            SetValue (new _Constant (lowerBound),false);
+        } else if (myValue->Value() > upperBound) {
+            SetValue (new _Constant (upperBound),false);
+        }
+    }
+}
+
+
+//__________________________________________________________________________________
+void    _Variable::ClearConstraints (void)
+{
+    if (IsCategory ()) {
+        _Variable newVar (*GetName(), IsGlobal());
+        newVar.SetValue ((_PMathObj)Compute()->makeDynamic(),false);
+        ReplaceVar ( &newVar);
+        /*_Matrix * modelMatrix = (_Matrix*)LocateVar(modelMatrixIndices.lData[1])->GetValue();
+        for (long k=0; k<4; k++)
+            for (long k2 = 0; k2<4; k2++)
+                if (k!=k2)
+                {
+                    StringToConsole (*(_String*)modelMatrix->GetFormula(k,k2)->toStr());
+                    BufferToConsole ("\n");
+                }
+        */
+    } else {
+        if (!IsIndependent()) {
+            SetValue ((_PMathObj)Compute()->makeDynamic(),false);
+        }
+        SetBounds (DEFAULTLOWERBOUND,DEFAULTUPPERBOUND);
+    }
+}
+
+//__________________________________________________________________________________
+bool _Variable::IsConstant (void)
+{
+    if (varFormula && varFormula->theFormula.lLength) {
+        return varFormula->IsConstant();
+    }
+
+    if (varValue && varValue->ObjectClass () != NUMBER) {
+        return varValue->IsConstant();
+    }
+
+    return false;
+}
+
+//__________________________________________________________________________________
+
+void  _Variable::SetFormula (_Formula& theF) // set the value of the var to a formula
+{
+    bool changeMe    = false,
+         isAConstant = theF.IsAConstant();
+
+    _Formula* myF = &theF;
+
+    if (isAConstant) {
+        _PMathObj theP = theF.Compute();
+        if (theP) {
+            myF = new _Formula ((_PMathObj)theP->makeDynamic(),false);
+            checkPointer (myF);
+        } else {
+            return;
+        }
+    }
+
+    _SimpleList vars;
+    {
+        _AVLList vA (&vars);
+        theF.ScanFForVariables (vA,true);
+        vA.ReorderList();
+    }
+
+    if (vars.BinaryFind(theIndex)>=0) {
+        _String * sf = (_String*)theF.toStr();
+        WarnError ((_String("Can't set variable ")&*GetName()&" to "&*sf&" because it would create a circular dependance."));
+        DeleteObject(sf);
+        if (&theF!=myF) {
+            delete myF;
+        }
+        return;
+    }
+
+    varFlags &= HY_VARIABLE_SET;
+
+    if (varFlags & HY_VARIABLE_CHANGED) {
+        varFlags -= HY_VARIABLE_CHANGED;
+    }
+
+
+    if (varFormula) {
+        delete (varFormula);
+        varFormula = nil;
+    } else {
+        changeMe = true;
+    }
+
+    if (varValue) {
+        DeleteObject (varValue);
+        varValue=nil;
+    }
+
+    //_Formula::Duplicate ((BaseRef)myF);
+    varFormula = new _Formula;
+    varFormula->Duplicate ((BaseRef)myF);
+
+    // mod 20060125 added a call to simplify constants
+    varFormula->SimplifyConstants ();
+
+    // also update the fact that this variable is no longer independent in all declared
+    // variable containers which contain references to this variable
+    if (changeMe)
+        if (deferSetFormula) {
+            *deferSetFormula << theIndex;
+            deferIsConstant  << isAConstant;
+        } else {
+            long i;
+            _SimpleList tcache;
+            long        iv;
+
+            i = variableNames.Traverser (tcache,iv,variableNames.GetRoot());
+
+            for (; i >= 0; i = variableNames.Traverser (tcache,iv)) {
+                _Variable* theV = FetchVar(i);
+                if (theV->IsContainer()) {
+                    _VariableContainer* theVC = (_VariableContainer*)theV;
+                    if (theVC->SetDependance(theIndex) == -2) {
+                        ReportWarning ((_String("Can't make variable ")&*GetName()&" dependent in the context of "&*theVC->GetName()&" because its template variable is bound by another relation in the global context."));
+                        continue;
+                    }
+                }
+            }
+            {
+                for (long i = 0; i<likeFuncList.lLength; i++)
+                    if (((_String*)likeFuncNamesList(i))->sLength) {
+                        ((_LikelihoodFunction*)likeFuncList(i))->UpdateIndependent(theIndex,isAConstant);
+                    }
+            }
+        }
+
+    if (&theF!=myF) {
+        delete myF;
+    }
+}
+
+//__________________________________________________________________________________
+void  _Variable::PreMarkChanged (void)
+{
+    if (varFormula) {
+        varFlags &= HY_DEP_V_INSPECTED_CLR;
+
+        if (HasChanged(false)) {
+            varFlags |= HY_DEP_V_MODIFIED;
+        }
+        if (HasChanged(true)) {
+            varFlags |= HY_DEP_V_MODIFIED_CATS;
+        }
+
+        varFlags |= HY_DEP_V_INSPECTED;
+    }
+}
+
+//__________________________________________________________________________________
+void  _Variable::PostMarkChanged (void)
+{
+    varFlags &= HY_DEP_CLEAR_MASK;
+}
+
+
+//__________________________________________________________________________________
+bool  _Variable::HasChanged (bool ignoreCats) // does this variable need recomputing
+{
+    if (varFormula) {
+        if (useGlobalUpdateFlag && (varFlags&HY_DEP_V_COMPUTED)) {
+            return false;
+        }
+
+        if (varFlags&HY_DEP_V_INSPECTED) {
+            return ignoreCats?(varFlags&HY_DEP_V_MODIFIED_CATS):(varFlags&HY_DEP_V_MODIFIED);
+        }
+
+        return  varFormula->HasChanged(ignoreCats);
+
+    } else {
+        if (varValue&&(varValue->IsVariable())) {
+            return varValue->HasChanged();
+        }
+        if (ignoreCats && IsCategory()) {
+            return false;
+        }
+        return varFlags & HY_VARIABLE_CHANGED;
+    }
+
+}
+
+//__________________________________________________________________________________
+
+void _Variable::MarkDone (void)
+{
+    if (!varFormula && (varFlags & HY_VARIABLE_CHANGED) && !(varValue && varValue->IsVariable())) {
+        varFlags -= HY_VARIABLE_CHANGED;
+    }
+}
+
+//__________________________________________________________________________________
+_PMathObj    _Variable::ComputeReference (_PMathObj context)
+{
+    _String reference_string (*GetName());
+    reference_string = AppendContainerName(reference_string, (_VariableContainer*)context);
+    
+    return new _FString (reference_string, false);
+}
+
+//__________________________________________________________________________________
+_String    _Variable::ContextFreeName(void) {
+    long location = theName->FindBackwards (".", 0, -1);
+    if (location > 0) {
+       return theName->Cut (location+1,-1); 
+    }  
+    return *theName;
+}
+
+//__________________________________________________________________________________
+_String    _Variable::ParentObjectName(void) {
+    long location = theName->FindBackwards (".", 0, -1);
+    if (location > 0) {
+       return theName->Cut (0,location-1); 
+    }  
+    return empty;
+}
+
+//__________________________________________________________________________________
+long    DereferenceString (_PMathObj v, _PMathObj context, char reference_type){
+    if (v && v->ObjectClass () == STRING) {
+        _FString * value = (_FString*)v;
+        _String referencedVariable = *value->theString;
+        if (reference_type == HY_STRING_LOCAL_DEREFERENCE && context) {
+            referencedVariable = AppendContainerName(referencedVariable, (_VariableContainer*)context);
+        }
+        return LocateVarByName(referencedVariable);
+    }
+    return -1;
+}
+
+//__________________________________________________________________________________
+long    DereferenceVariable (long index, _PMathObj context, char reference_type){
+    if (reference_type == HY_STRING_DIRECT_REFERENCE) {
+        return index;
+    }
+    
+    return  DereferenceString (FetchObjectFromVariableByTypeIndex(index, STRING), context, reference_type);
+}
+
diff --git a/src/core/variablecontainer.cpp b/src/core/variablecontainer.cpp
new file mode 100644
index 0000000..e5a35e4
--- /dev/null
+++ b/src/core/variablecontainer.cpp
@@ -0,0 +1,1188 @@
+/*
+ 
+ HyPhy - Hypothesis Testing Using Phylogenies.
+ 
+ Copyright (C) 1997-now
+ Core Developers:
+ Sergei L Kosakovsky Pond (spond at ucsd.edu)
+ Art FY Poon    (apoon at cfenet.ubc.ca)
+ Steven Weaver (sweaver at ucsd.edu)
+ 
+ Module Developers:
+ Lance Hepler (nlhepler at gmail.com)
+ Martin Smith (martin.audacis at gmail.com)
+ 
+ Significant contributions from:
+ Spencer V Muse (muse at stat.ncsu.edu)
+ Simon DW Frost (sdf22 at cam.ac.uk)
+ 
+ Permission is hereby granted, free of charge, to any person obtaining a
+ copy of this software and associated documentation files (the
+ "Software"), to deal in the Software without restriction, including
+ without limitation the rights to use, copy, modify, merge, publish,
+ distribute, sublicense, and/or sell copies of the Software, and to
+ permit persons to whom the Software is furnished to do so, subject to
+ the following conditions:
+ 
+ The above copyright notice and this permission notice shall be included
+ in all copies or substantial portions of the Software.
+ 
+ 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.
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ 
+ */
+
+#include "defines.h"
+#include "variablecontainer.h"
+#include "operation.h"
+
+#include "likefunc.h"
+#include "parser.h"
+#include "polynoml.h"
+#include "batchlan.h"
+
+
+//__________________________________________________________________________________
+
+_VariableContainer::_VariableContainer (void)
+{
+    theParent = nil;
+    theModel = -1;
+    iVariables = nil;
+    dVariables = nil;
+    gVariables = nil;
+}
+
+//__________________________________________________________________________________
+
+void    _VariableContainer::Duplicate (BaseRef theO)
+{
+    _Variable::Duplicate (theO);
+    _VariableContainer *theVC = (_VariableContainer*)theO;
+    theParent= theVC->theParent;
+    theModel = theVC->theModel;
+    if (theVC->iVariables) {
+        if (iVariables) {
+            iVariables->Clear();
+        } else {
+            checkPointer(iVariables = new _SimpleList);
+        }
+        iVariables->Duplicate (theVC->iVariables);
+    } else {
+        if (iVariables) {
+            delete (iVariables);
+            iVariables = nil;
+        }
+    }
+    if (theVC->dVariables) {
+        if (dVariables) {
+            dVariables->Clear();
+        } else {
+            checkPointer(dVariables = new _SimpleList);
+        }
+        dVariables->Duplicate (theVC->dVariables);
+    } else {
+        if (dVariables) {
+            delete (dVariables);
+            dVariables = nil;
+        }
+    }
+    if (theVC->gVariables) {
+        if (gVariables) {
+            gVariables->Clear();
+        } else {
+            checkPointer (gVariables = new _SimpleList);
+        }
+        gVariables->Duplicate (theVC->gVariables);
+    } else {
+        if (gVariables) {
+            delete (gVariables);
+            gVariables = nil;
+        }
+    }
+}
+
+
+//__________________________________________________________________________________
+
+void    _VariableContainer::TrimMemory ()
+{
+    if (iVariables) {
+        iVariables->TrimMemory();
+    }
+    if (dVariables) {
+        dVariables->TrimMemory();
+    }
+    if (gVariables) {
+        gVariables->TrimMemory();
+    }
+}
+
+//__________________________________________________________________________________
+
+BaseRef _VariableContainer::makeDynamic (void)
+{
+    _VariableContainer * res = new _VariableContainer;
+    checkPointer(res);
+    memcpy ((char*)res, (char*)this, sizeof (_VariableContainer)); // ???
+    res->Duplicate(this);
+    return res;
+}
+
+//__________________________________________________________________________________
+
+BaseRef _VariableContainer::toStr (void)
+{
+    _String * res = new _String (128L,true);
+
+    checkPointer (res);
+
+    (*res) << "Container Class:";
+    (*res) << theName;
+    (*res) << ":{ Independent Variables:";
+
+    if (iVariables)
+        for (long i = 0; i<iVariables->lLength; i+=2) {
+            _String* s = (_String*)variablePtrs(iVariables->lData[i])->toStr();
+            (*res) << s;
+#ifndef USE_POINTER_VC
+            if (i<independentVars.lLength-1)
+#else
+            if (i<iVariables->lLength-2)
+#endif
+                (*res) << ',';
+            DeleteObject(s);
+        }
+
+    (*res) << "; Dependent Variables:";
+
+    if (dVariables)
+        for (long i2 = 0; i2<dVariables->lLength; i2+=2) {
+            _String* s = (_String*)variablePtrs(dVariables->lData[i2])->toStr();
+            (*res) << s;
+#ifndef USE_POINTER_VC
+            if (i2<independentVars.lLength-1)
+#else
+            if (i2<dVariables->lLength-2)
+#endif
+                (*res) << ',';
+            DeleteObject(s);
+        }
+
+    (*res) << '}';
+    res->Finalize();
+    return res;
+}
+
+//__________________________________________________________________________________
+
+_VariableContainer::_VariableContainer (_String theName, _String theTmplt, _VariableContainer* theP)
+{
+    iVariables = nil;
+    dVariables = nil;
+    gVariables = nil;
+    InitializeVarCont (theName, theTmplt,theP);
+}
+
+//__________________________________________________________________________________
+
+bool _VariableContainer::HasExplicitFormModel (void)
+{
+    if (theModel == -1) {
+        return false;
+    }
+    return (modelTypeList.lData[theModel]);
+}
+
+//__________________________________________________________________________________
+
+_Formula* _VariableContainer::GetExplicitFormModel (void)
+{
+    if (theModel == -1) {
+        return nil;
+    }
+    if (modelTypeList.lData[theModel]) { // an explicit formula based matrix
+        return (_Formula*)modelMatrixIndices.lData[theModel];
+    }
+    return nil;
+}
+
+//__________________________________________________________________________________
+
+_String* _VariableContainer::GetModelName (void) {
+    _String * res = _HBLObjectNameByType (HY_BL_MODEL, theModel, false);
+    if (res) {
+        return res;
+    }
+    return ∅
+}
+
+//__________________________________________________________________________________
+
+_Matrix* _VariableContainer::GetModelMatrix (_List* queue, _SimpleList* tags)
+{
+    if (theModel == -1) {
+        return nil;
+    }
+
+    if (modelTypeList.lData[theModel]) { // an explicit formula based matrix
+        if (queue && tags) {
+            long currentQueueLength = ((_Formula*)modelMatrixIndices.lData[theModel])->ExtractMatrixExpArguments (queue);
+            if (currentQueueLength) {
+                for (long k = 0; k < currentQueueLength; k++) 
+                    (*tags) << currentQueueLength;
+                return nil;
+            }
+        }
+        _Matrix* result = (_Matrix *)((_Formula *)modelMatrixIndices.lData[theModel])->Compute();
+        result->CheckIfSparseEnough(true);
+        return result;
+    }
+
+    return (_Matrix*) (LocateVar(modelMatrixIndices.lData[theModel])->GetValue());
+}
+
+//__________________________________________________________________________________
+
+long _VariableContainer::GetModelDimension (void)
+{
+    long matrixDim = 0;
+    if (theModel >= 0) {
+        matrixDim = modelTypeList.lData[theModel];
+        if (matrixDim == 0) {
+            return GetModelMatrix()->GetHDim();
+        }
+    }
+    return matrixDim;
+}
+
+//__________________________________________________________________________________
+
+_Matrix* _VariableContainer::GetFreqMatrix (void)
+{
+    if (theModel>=0) {
+        long freqID = modelFrequenciesIndices.lData[theModel];
+        if (freqID>=0) {
+            return (_Matrix*) (LocateVar(freqID)->GetValue());
+        } else {
+            return (_Matrix*) (LocateVar(-freqID-1)->GetValue());
+        }
+    }
+    return nil;
+}
+
+//__________________________________________________________________________________
+void    _VariableContainer::ScanModelBasedVariables (_String& fullName, _AVLListXL* varCache)
+{
+    if (theModel!= HY_NO_MODEL) { // build the matrix variables
+        _SimpleList       mVars;
+        _String           varName;
+        
+        {
+            
+            long cachedID = -1;
+            bool doScan   = !varCache || (cachedID = varCache->Find ((BaseRef) theModel)) < 0 ;
+
+            if (doScan) {
+
+                _AVLList                ma (&mVars);
+                ScanModelForVariables   (GetModelIndex(), ma,true,theModel,false);
+
+                long freqID     = modelFrequenciesIndices.lData[theModel];
+                if (freqID>=0) {
+                    ((_Matrix*) (LocateVar(freqID)->GetValue()))->ScanForVariables2(ma,true,-1,false);
+                }
+
+                ma.ReorderList();
+
+                if (varCache) {
+                    varCache->Insert ((BaseRef)theModel, (long)mVars.makeDynamic(),false);
+                }
+            } else if (varCache) {
+                mVars.Duplicate (varCache->GetXtra (cachedID));
+            }
+
+        }
+
+        for (long i=0; i<mVars.lLength; i++) {
+            _Variable * aVar = (_Variable*)variablePtrs (mVars.lData[i]);
+            if (aVar->IsGlobal()) {
+                //if (curVar->IsIndependent())
+                {
+                    if (!gVariables) {
+                        checkPointer (gVariables = new _SimpleList);
+                    }
+                    (*gVariables) << aVar->GetAVariable();
+                }
+                continue;
+            }
+
+            long f = aVar->theName->FindBackwards('.',0,-1);
+            if (f>=0) {
+                varName = fullName&'.'& aVar->theName->Cut(f+1,-1);
+            } else {
+                varName = fullName&'.'& *aVar->theName;
+            }
+
+
+            f = LocateVarByName (varName);
+            if (f<0) {
+                _Variable v (varName);
+                //printf ("%x %s\n", v.theName, v.theName->sData);
+                f = v.theIndex;
+            } else {
+                f = variableNames.GetXtra (f);
+            }
+
+            _Variable * spawnedVar = FetchVar (f);
+            spawnedVar->SetBounds (aVar->GetLowerBound(), aVar->GetUpperBound());
+
+            if (aVar->IsIndependent()) {
+                if (!iVariables) {
+                    checkPointer (iVariables = new _SimpleList);
+                }
+                (*iVariables) << f;
+                (*iVariables) << mVars.lData[i];
+            } else {
+                if (!dVariables) {
+                    checkPointer (dVariables = new _SimpleList);
+                }
+                (*dVariables) << f;
+                (*dVariables) << mVars.lData[i];
+            }
+        }
+    }
+}
+
+//__________________________________________________________________________________
+void    _VariableContainer::SetModel (long modelID, _AVLListXL* varCache)
+{
+    theModel = modelID;
+    ScanModelBasedVariables (*theName, varCache);
+    SortVars();
+}
+
+//__________________________________________________________________________________
+void    _VariableContainer::InitializeVarCont (_String& aName, _String& theTmplt, _VariableContainer* theP, _AVLListXL* varCache)
+{
+    _String fullName (aName);
+    
+    theParent = theP;
+
+
+    if (aName.sLength) {
+        long f = aName.Find('.');
+
+        while (theP) {
+            if (f!=-1) {
+                f = aName.Find('.',f+1,-1);
+            } else {
+                break;
+            }
+
+            theP = theP->theParent;
+        }
+
+        if (theP) {
+            fullName = (*(theP->theName))&'.'&fullName;
+        }
+
+        theName = (_String*)(fullName.makeDynamic());
+        InsertVar (this);
+    } else {
+        fullName = *theName;
+    }
+    
+    SetModel (FindModelName(theTmplt), varCache);
+}
+
+//__________________________________________________________________________________
+
+void _VariableContainer::ScanAndAttachVariables (void)
+{
+    _Variable* curVar;
+    _SimpleList travcache;
+
+    long f = variableNames.Find (theName,travcache);
+    if (f<0) {
+        return;
+    }
+
+    _String theNameAndADot (*theName);
+    theNameAndADot = theNameAndADot&'.';
+
+    for (f = variableNames.Next (f, travcache); f>=0; f = variableNames.Next (f, travcache)) {
+        curVar = FetchVar (f);
+
+        if (curVar->theName->startswith(theNameAndADot)) {
+            //printf ("[ScanAndAttachVariables %s]\n", curVar->GetName()->getStr());
+            if (!curVar->IsContainer()) {
+                long   vix = variableNames.GetXtra (f);
+
+                if (curVar->IsIndependent()) {
+                    if ( ((!iVariables)||iVariables->FindStepping(vix,2)==-1) && ((!dVariables)||dVariables->FindStepping(vix,2)==-1)) {
+                        if (!iVariables) {
+                            checkPointer (iVariables = new _SimpleList);
+                        }
+                        (*iVariables)<<vix;
+                        (*iVariables)<<-1;
+                    }
+                } else {
+                    if ( ((!iVariables)||iVariables->FindStepping(vix,2)==-1) && ((!dVariables)||dVariables->FindStepping(vix,2)==-1)) {
+                        if (!dVariables) {
+                            checkPointer (dVariables = new _SimpleList);
+                        }
+                        (*dVariables)<<vix;
+                        (*dVariables)<<-1;
+                    }
+                }
+            }
+        } else {
+            break;
+        }
+    }
+
+
+
+}
+//__________________________________________________________________________________
+
+_VariableContainer::~_VariableContainer(void)
+{
+    if (iVariables) {
+        delete iVariables;
+    }
+    if (dVariables) {
+        delete dVariables;
+    }
+    if (gVariables) {
+        delete gVariables;
+    }
+}
+
+//__________________________________________________________________________________
+
+bool _VariableContainer::HasChanged (void)
+{
+    unsigned long i;
+    if (iVariables)
+        for (i = 0; i<iVariables->lLength; i+=2)
+            if (LocateVar (iVariables->lData[i])->HasChanged()) {
+                return true;
+            }
+
+    if (gVariables)
+        for (i = 0; i<gVariables->lLength; i++)
+            if (LocateVar (gVariables->lData[i])->HasChanged()) {
+                return true;
+            }
+
+    if (dVariables)
+        for (i = 0; i<dVariables->lLength; i+=2)
+            if (LocateVar (dVariables->lData[i])->HasChanged()) {
+                return true;
+            }
+
+    return false;
+}
+
+//__________________________________________________________________________________
+
+_Variable* _VariableContainer::GetIthIndependent (long index)
+{
+    if (iVariables && (index*=2)<iVariables->lLength) {
+        return LocateVar (iVariables->lData[index]);
+    } else {
+        return nil;
+    }
+}
+
+//__________________________________________________________________________________
+
+_Variable* _VariableContainer::GetIthDependent (long index)
+{
+    if (dVariables && (index*=2)<dVariables->lLength) {
+        return LocateVar (dVariables->lData[index]);
+    } else {
+        return nil;
+    }
+}
+
+//__________________________________________________________________________________
+
+_Variable* _VariableContainer::GetIthParameter (long index)
+{
+    if (iVariables) {
+        if ( (index*=2) <iVariables->lLength) {
+            return LocateVar (iVariables->lData[index]);
+        } else {
+            if (dVariables) {
+                index-=iVariables->lLength;
+                if (index<dVariables->lLength) {
+                    return LocateVar (dVariables->lData[index]);
+                }
+            }
+        }
+    } else {
+        if (dVariables && (index*=2) <dVariables->lLength) {
+            return LocateVar (dVariables->lData[index]);
+        }
+    }
+    return nil;
+}
+
+//__________________________________________________________________________________
+
+bool _VariableContainer::NeedToExponentiate (bool ignoreCats)
+{
+    if (HY_VC_NO_CHECK&varFlags) {
+        return false;
+    }
+
+    if (iVariables)
+        for (unsigned long i = 0; i<iVariables->lLength && iVariables->lData[i+1] >= 0; i+=2) {
+            if (LocateVar (iVariables->lData[i])->HasChanged(ignoreCats)) {
+                //printf ("%s -> %s\n", theName->sData, LocateVar (iVariables->lData[i])->theName->sData);
+                return true;
+            }
+        }
+
+    if (gVariables)
+        for (unsigned long i = 0; i<gVariables->lLength; i++)
+            if (LocateVar (gVariables->lData[i])->HasChanged(ignoreCats)) {
+                //printf ("%s -> %s\n", theName->sData, LocateVar (gVariables->lData[i])->theName->sData);
+                return true;
+            }
+    if (dVariables)
+        for (unsigned long i = 0; i<dVariables->lLength && dVariables->lData[i+1] >= 0; i+=2)
+            if (LocateVar (dVariables->lData[i])->HasChanged(ignoreCats)) {
+                //printf ("%s -> %s\n", theName->sData, LocateVar (dVariables->lData[i])->theName->sData);
+                return true;
+            }
+
+    return false;
+}
+
+//__________________________________________________________________________________
+void      _VariableContainer::SortVars(void)
+{
+    // sort independents 1st
+    // use dumb bubble sort
+    bool        done = false;
+    long        t,
+                index;
+
+    _String     *s1,
+                *s2;
+
+    if (iVariables && iVariables->lLength>2) {
+        while (!done) {
+            done = true;
+            s1 = LocateVar(iVariables->lData[0])->GetName();
+            for (index = 2; index<iVariables->lLength; index+=2) {
+                s2 = LocateVar(iVariables->lData[index])->GetName();
+                if (s2->Less (s1)) {
+                    done = false;
+                    t = iVariables->lData[index];
+                    iVariables->lData    [index] = iVariables->lData[index-2];
+                    iVariables->lData    [index-2] = t;
+
+                    t = iVariables->lData[index+1];
+                    iVariables->lData    [index+1] = iVariables->lData[index-1];
+                    iVariables->lData    [index-1] = t;
+                }
+
+            }
+        }
+    }
+    if (dVariables && dVariables->lLength>2) {
+        done = false;
+        while (!done) {
+            done = true;
+            s1 = LocateVar(dVariables->lData[0])->GetName();
+            for (index = 2; index<dVariables->lLength; index+=2) {
+                s2 = LocateVar(dVariables->lData[index])->GetName();
+                if (s2->Less (s1)) {
+                    done = false;
+                    t = dVariables->lData[index];
+                    dVariables->lData    [index] = dVariables->lData[index-2];
+                    dVariables->lData    [index-2] = t;
+
+                    t = dVariables->lData[index+1];
+                    dVariables->lData    [index+1] = dVariables->lData[index-1];
+                    dVariables->lData    [index-1] = t;
+                }
+
+            }
+        }
+    }
+}
+//__________________________________________________________________________________
+bool      _VariableContainer::RemoveDependance (long varIndex)
+{
+    if (dVariables) {
+        long f = dVariables->FindStepping(varIndex,2);
+
+        if (f!=-1) {
+
+            /*printf ("Moving dep->ind for %s from %s\n", LocateVar (varIndex)->GetName()->sData,
+                  GetName()->sData);
+             */
+
+            /*if (dVariables->lData[f+1]>=0)
+            {
+              _Variable* checkVar = LocateVar(dVariables->lData[f+1]);
+               printf ("Local variable %s\n", checkVar->GetName()->sData);
+              //if (!checkVar->IsIndependent())
+                //  return false;
+            }*/
+
+            _String* thisName = LocateVar (dVariables->lData[f])->GetName();
+
+            long insPos = 0;
+
+            if (!iVariables) {
+                checkPointer (iVariables = new _SimpleList);
+            }
+
+            while (insPos<iVariables->lLength && (thisName->Greater (LocateVar (iVariables->lData[insPos])->GetName()))) {
+                insPos+=2;
+            }
+
+
+            iVariables->InsertElement ((BaseRef)varIndex, insPos, false, false);
+            iVariables->InsertElement ((BaseRef)dVariables->lData[f+1], insPos+1, false, false);
+
+            if (dVariables->lLength>2) {
+                dVariables->Delete(f);
+                dVariables->Delete(f);
+                dVariables->TrimMemory();
+            } else {
+                delete dVariables;
+                dVariables = nil;
+            }
+        }
+    }
+    return true;
+}
+
+//__________________________________________________________________________________
+long      _VariableContainer::CheckAndAddUserExpression (_String& pName, long startWith)
+{
+    _String tryName, tryName2;
+    tryName = (*theName)&'.'&pName;
+    tryName2 = tryName;
+    long    k = startWith>2?startWith:2;
+    if (startWith>=2) {
+        tryName2 = tryName&startWith;
+    }
+
+    while (LocateVarByName(tryName2)>=0) {
+        tryName2 = tryName&k;
+        k++;
+    }
+
+    if (startWith<0) {
+        return k>2?k-1:0;
+    }
+
+    if (startWith<2) {
+        if (k>2) {
+            pName = pName&_String(k-1);
+        }
+    } else {
+        if (k>startWith) {
+            pName = pName & _String (k-1);
+        } else {
+            pName = pName & _String (startWith);
+        }
+    }
+
+    _Variable newVar (tryName2);
+    k =  newVar.GetAVariable();
+
+    if (!dVariables) {
+        checkPointer (dVariables = new _SimpleList);
+    }
+    (*dVariables) << k;
+    (*dVariables) << -1;
+    return k;
+}
+
+//__________________________________________________________________________________
+void      _VariableContainer::CopyMatrixParameters (_VariableContainer* source, bool match_by_name)
+{
+    if (iVariables && (source->iVariables || source->dVariables))
+        if (match_by_name) {
+            _List source_vars,
+                  target_vars;
+                  
+            _SimpleList model_vars_in_source,
+                        model_vars_in_target;
+                        
+            if (source->iVariables) 
+                for (unsigned long i=0; i< source->iVariables->lLength; i+=2) {
+                    long   template_var_index = source->iVariables->lData[i+1];
+                    if (template_var_index >= 0) {
+                        source_vars << LocateVar (template_var_index)->GetName();
+                        model_vars_in_source << i;
+                    }             
+                }
+           
+            if (source->dVariables) 
+                for (unsigned long i=0; i< source->dVariables->lLength; i+=2) {
+                    long   template_var_index = source->dVariables->lData[i+1];
+                    if (template_var_index >= 0) {
+                        source_vars << LocateVar (template_var_index)->GetName();
+                        model_vars_in_source << (-2-i);
+                    }             
+                }
+
+            for (unsigned long i=0; i<iVariables->lLength; i+=2) {
+                long   template_var_index = iVariables->lData[i+1];
+                if (template_var_index >= 0) {
+                    target_vars << LocateVar (template_var_index)->GetName();
+                    model_vars_in_target << i;
+                }
+            }
+
+
+            _SimpleList the_mapping;
+            
+            
+            target_vars.Map (source_vars, the_mapping);
+            /*
+            printf ("\n_VariableContainer::CopyMatrixParameters %s :\n\t%s\n\t%s\n\t%s\n", theName->sData, _String((_String*)source_vars.toStr()).sData, 
+            _String((_String*)target_vars.toStr()).sData, 
+            _String((_String*)the_mapping.toStr()).sData);
+            */
+            
+            for (unsigned long i=0; i<the_mapping.lLength; i++) {
+                long source_var = the_mapping[i];
+                if (source_var >= 0) {
+                    long which_idx = model_vars_in_source.lData[source_var];
+                    if (which_idx >= 0) {
+                        LocateVar (iVariables->lData[model_vars_in_target.lData[i]])->SetValue(LocateVar (source->iVariables->lData[which_idx])->Compute());
+                    } else {
+                        LocateVar (iVariables->lData[model_vars_in_target.lData[i]])->SetValue(LocateVar (source->dVariables->lData[-which_idx-2])->Compute());                    
+                    }
+                }
+            }
+            
+            
+        } else {
+            for (unsigned long i=0; i<iVariables->lLength && i< source->iVariables->lLength; i+=2) {
+                LocateVar (iVariables->lData[i])->SetValue(LocateVar (source->iVariables->lData[i])->Compute());
+            }        
+        }
+
+    _PMathObj srcVal = source->Compute();
+    SetValue (srcVal);
+}
+
+//__________________________________________________________________________________
+void      _VariableContainer::KillUserExpression (long varID)
+{
+    if (dVariables) {
+        long f = dVariables->FindStepping(varID,2);
+        if (f>=0) {
+            DeleteVariable (*LocateVar(varID)->GetName(),true);
+            if (dVariables->lLength > 2) {
+                dVariables->Delete (f);
+                dVariables->Delete (f);
+                dVariables->TrimMemory ();
+            } else {
+                delete dVariables;
+                dVariables = nil;
+            }
+        }
+    }
+}
+
+//__________________________________________________________________________________
+long      _VariableContainer::SetDependance (long varIndex)
+{
+    if (iVariables) {
+        long f;
+
+        if (varIndex>=0) {
+            f = iVariables->FindStepping(varIndex,2);
+            if (f<0) {
+                return -1;
+            }
+        } else {
+            f = -varIndex-1;
+            varIndex = iVariables->lData[f];
+        }
+
+
+        //printf ("Moving ind->dep for %s from %s\n", LocateVar (varIndex)->GetName()->sData,
+        //      GetName()->sData);
+
+        if (iVariables->lData[f+1]>=0) {
+            //printf ("Local variable %s\n", LocateVar (iVariables->lData[f+1])->GetName()->sData);
+            if (!LocateVar(iVariables->lData[f+1])->IsIndependent()) {
+                return -2;
+            }
+        }
+
+        _String* thisName = LocateVar (iVariables->lData[f])->GetName();
+
+        long    insPos = 0;
+
+        if (!dVariables) {
+            checkPointer (dVariables = new _SimpleList);
+        }
+
+        while (insPos<dVariables->lLength) {
+            _Variable *dVar = LocateVar (dVariables->lData[insPos]);
+            if (!dVar) {
+                FlagError ("Internal error in SetDependance()");
+                return -1;
+            }
+            if (!thisName->Greater (dVar->GetName())) {
+                break;
+            }
+            insPos+=2;
+        }
+
+        dVariables->InsertElement ((BaseRef)varIndex, insPos, false, false);
+        dVariables->InsertElement ((BaseRef)iVariables->lData[f+1], insPos+1, false, false);
+
+        if (iVariables->lLength > 2) {
+            iVariables->Delete(f);
+            iVariables->Delete(f);
+            iVariables->TrimMemory();
+        } else {
+            delete iVariables;
+            iVariables = nil;
+        }
+
+        return varIndex;
+    }
+    return -1;
+}
+
+//__________________________________________________________________________________
+bool      _VariableContainer::SetMDependance (_SimpleList& mDep)
+{
+    if (iVariables)
+        if (mDep.lLength*2 > iVariables->lLength)
+            for (long k=iVariables->lLength-2; k>=0; k-=2) {
+                long f = mDep.BinaryFind (iVariables->lData[k]);
+                if (f>=0) {
+                    SetDependance (-k-1);
+                }
+            }
+        else
+            for (unsigned long k=0; iVariables && k<mDep.lLength; k++) {
+                SetDependance (mDep.lData[k]);
+            }
+
+    return true;
+}
+
+
+//__________________________________________________________________________________
+void      _VariableContainer::Clear(void)
+{
+    theModel = HY_NO_MODEL;
+    if (iVariables) {
+        delete iVariables;
+        iVariables = nil;
+    }
+    if (dVariables) {
+        delete dVariables;
+        dVariables = nil;
+    }
+    if (gVariables) {
+        delete gVariables;
+        gVariables = nil;
+    }
+}
+
+//__________________________________________________________________________________
+long      _VariableContainer::CountAll(void)
+{
+    return (iVariables?iVariables->lLength/2:0)+(dVariables?dVariables->lLength/2:0);
+}
+
+//__________________________________________________________________________________
+long      _VariableContainer::CountIndependents(void)
+{
+    return iVariables?iVariables->lLength/2:0;
+}
+
+//__________________________________________________________________________________
+bool      _VariableContainer::HasLocals  (void)
+{
+    return (iVariables && iVariables->lLength)||(dVariables&&dVariables->lLength);
+}
+
+//__________________________________________________________________________________
+bool      _VariableContainer::IsModelVar  (long i)
+{
+    return dVariables->lData[2*i+1]>=0;
+}
+
+//__________________________________________________________________________________
+
+_String*    _VariableContainer::GetSaveableListOfUserParameters (void)
+{
+    _String * result = new _String (64L, true);
+    checkPointer (result);
+
+    if (dVariables)
+        for (long i=0; i<dVariables->lLength; i+=2)
+            if (dVariables->lData[i+1]<0) {
+                _Variable * userParm  = (_Variable*) LocateVar (dVariables->lData[i]);
+                _String   * varString = (_String*)userParm->GetFormulaString();
+                *result << userParm->GetName();
+                *result << ':';
+                *result << '=';
+                *result << varString;
+                DeleteObject (varString);
+                *result << ';';
+                *result << '\n';
+            }
+
+    result->Finalize();
+    return result;
+}
+
+//__________________________________________________________________________________
+void      _VariableContainer::ClearConstraints(void)
+{
+    while (dVariables) {
+        LocateVar(dVariables->lData[0])->ClearConstraints();
+    }
+}
+
+//__________________________________________________________________________________
+
+void  _VariableContainer::CompileListOfDependents (_SimpleList& rec)
+{
+    if (iVariables)
+        for (unsigned long i=0; i<iVariables->lLength; i+=2) {
+            LocateVar(iVariables->lData[i])->CompileListOfDependents (rec);
+        }
+
+    if (gVariables)
+        for (unsigned long i=0; i<gVariables->lLength; i++) {
+            LocateVar(gVariables->lData[i])->CompileListOfDependents (rec);
+        }
+
+    if (dVariables) {
+        for (unsigned long i=0; i<dVariables->lLength; i+=2) {
+            LocateVar(dVariables->lData[i])->CompileListOfDependents (rec);
+        }
+
+        {
+            for (unsigned long i=0; i<dVariables->lLength; i+=2) {
+                long f = rec.Find (dVariables->lData[i]);
+                if (f>=0) {
+                    rec.Delete (f);
+                }
+            }
+        }
+    }
+}
+
+
+//__________________________________________________________________________________
+
+void _VariableContainer::MarkDone (void)
+{
+    if (iVariables)
+        for (unsigned long i = 0; i<iVariables->lLength && iVariables->lData[i+1] >= 0; i+=2) {
+            LocateVar (iVariables->lData[i])->MarkDone();
+        }
+    if (gVariables)
+        for (unsigned long i = 0; i<gVariables->lLength; i++) {
+            LocateVar (gVariables->lData[i])->MarkDone();
+        }
+}
+
+//__________________________________________________________________________________
+
+void _VariableContainer::MatchParametersToList (_List& suffixes, bool doAll, bool indOnly)
+{
+    if (doAll) {
+        for (long i=suffixes.lLength-1; i>=0; i--) {
+            long j;
+            if (!indOnly) {
+                if (dVariables) {
+                    for (j=0; j<dVariables->lLength; j+=2)
+                        if (LocateVar(dVariables->lData[j])->GetName()->endswith (*(_String*)suffixes.lData[i])) {
+                            break;
+                        }
+
+                    if (j<dVariables->lLength) {
+                        continue;
+                    }
+                }
+            }
+            if (iVariables) {
+                for (j=0; j<iVariables->lLength; j+=2) {
+                    if (LocateVar(iVariables->lData[j])->GetName()->endswith (*(_String*)suffixes.lData[i])) {
+                        break;
+                    }
+                }
+                if (j==iVariables->lLength) {
+                    suffixes.Delete (i);
+                }
+            } else {
+                suffixes.Delete (i);
+            }
+        }
+    } else {
+        for (long i=suffixes.lLength-1; i>=0; i--) {
+            long j;
+            if (dVariables) {
+                for (j=0; j<dVariables->lLength; j+=2) {
+                    if (dVariables->lData[j+1]<0) {
+                        if (LocateVar(dVariables->lData[j])->GetName()->endswith (*(_String*)suffixes.lData[i])) {
+                            break;
+                        }
+                    }
+                }
+                if (j==dVariables->lLength) {
+                    suffixes.Delete (i);
+                }
+            } else {
+                suffixes.Delete(i);
+            }
+        }
+    }
+}
+
+//__________________________________________________________________________________
+
+bool _VariableContainer::IsConstant (void)
+{
+    if (iVariables) {
+        return false;
+    }
+
+    if (dVariables)
+        for (unsigned long i = 0; i<dVariables->lLength; i+=2)
+            if (!LocateVar(dVariables->lData[i])->IsConstant()) {
+                return false;
+            }
+
+    if (gVariables)
+        for (unsigned long i = 0; i<gVariables->lLength; i++)
+            if (!LocateVar(gVariables->lData[i])->IsConstant()) {
+                return false;
+            }
+
+    return true;
+}
+
+//__________________________________________________________________________________
+
+void _VariableContainer::ScanForVariables (_AVLList& l,_AVLList& l2, _AVLListX * tagger, long weight)
+{
+    if (iVariables)
+        for (unsigned long i = 0; i<iVariables->lLength; i+=2) {
+            l.Insert ((BaseRef)iVariables->lData[i]);
+            if (tagger) {
+                tagger->UpdateValue ((BaseRef)iVariables->lData[i], weight, 0);
+            }
+        }
+    if (dVariables)
+        for (unsigned long i = 0; i<dVariables->lLength; i+=2) {
+            l2.Insert ((BaseRef)dVariables->lData[i]);
+            _SimpleList temp;
+            {
+                _AVLList  ta (&temp);
+                LocateVar (dVariables->lData[i])->ScanForVariables(ta, true, tagger, weight);
+                ta.ReorderList();
+            }
+            // see if any of them are global
+            for (unsigned long j=0; j<temp.lLength; j++) {
+                long p = temp.lData[j];
+                _Variable * v = LocateVar(p);
+                if (!v->IsGlobal() && v->IsIndependent()) {
+                    l.Insert ((BaseRef)p);
+                    if (tagger) {
+                        tagger->UpdateValue ((BaseRef)p, weight, 0);
+                    }
+               }
+            }
+        }
+}
+
+//__________________________________________________________________________________
+
+void _VariableContainer::ScanForDVariables (_AVLList& l,_AVLList&)
+{
+    if (dVariables)
+        for (unsigned long i = 0; i<dVariables->lLength; i+=2) {
+            l.Insert ((BaseRef)dVariables->lData[i]);
+        }
+}
+
+//__________________________________________________________________________________
+
+void _VariableContainer::GetListOfModelParameters (_List& rec)
+{
+    if (iVariables)
+        for (unsigned long i = 1; i<iVariables->lLength; i+=2) {
+            long p = iVariables->lData[i];
+            if (p>=0) {
+                rec << LocateVar(p)->GetName();
+            }
+        }
+}
+
+//__________________________________________________________________________________
+
+void _VariableContainer::ScanForGVariables (_AVLList& l,_AVLList& l2, _AVLListX* tagger, long weight)
+{
+    if (gVariables)
+        for (unsigned long i = 0; i<gVariables->lLength; i++) {
+            long p = gVariables->lData[i];
+            _Variable *v = LocateVar (p);
+            if (v->IsIndependent()) {
+                l.Insert ((BaseRef)p);
+                if (tagger) {
+                    tagger->UpdateValue((BaseRef)p, weight, 0);
+                }
+            } else {
+                l2.Insert ((BaseRef)p);
+            }
+        }
+    // additionally, check to see if there is any implicit dependence on the global variables yet unseen
+    if (dVariables)
+        for (unsigned long i = 0; i<dVariables->lLength; i+=2) {
+            _SimpleList temp;
+            {
+                _AVLList  al (&temp);
+                _Variable *v = LocateVar (dVariables->lData[i]);
+                v->ScanForVariables(al, true);
+                al.ReorderList();
+            }
+            // see if any of them are global
+            for (unsigned long j=0; j<temp.lLength; j++) {
+                long p = temp.lData[j];
+                _Variable * v = LocateVar(p);
+                if (v->IsGlobal()) { // good sign!
+                    if (v->IsIndependent()) {
+                        l.Insert ((BaseRef)p);
+                        if (tagger) {
+                            tagger->UpdateValue((BaseRef)p, weight, 0);
+                        }
+                    } else {
+                        l2.Insert ((BaseRef)p);
+                    }
+
+                }
+            }
+        }
+}
diff --git a/src/gui/Components/HYButton.cpp b/src/gui/Components/HYButton.cpp
new file mode 100644
index 0000000..e62f9fc
--- /dev/null
+++ b/src/gui/Components/HYButton.cpp
@@ -0,0 +1 @@
+/*
    Push button component

    Sergei L. Kosakovsky Pond, May 2000 - December 2002.
*/

#include "HYEventTypes.h"
#include "HYButton.h"
#include "HYGraphicPane.h"

#ifdef    __HYPHYDMALLOC__
#include "dmalloc.h"
#endif
//__________________________________________________________________

_HYButton::_HYButton (_HYRect r,Ptr p):_HYComponent (r,p)
{
    backColor.R = backColor.G = backColor.B = 255;
    buttonFont.style = HY_FONT_PLAIN;
#ifndef __HYPHY_GTK__
    buttonFont.size = 12;
    buttonFont.face = "System Font";
#else
    buttonFont.size = 10;
    buttonFont.face = _HY_SANS_FONT;
#endif
    alignFlags = 0;
    buttonKind = 0;
    isEnabled = true;
}

//__________________________________________________________________

_HYButton::~_HYButton()
{
}

//__________________________________________________________________

void        _HYButton::SetBackColor (_HYColor c)
{
    if ((c.R!=backColor.R)||(c.G!=backColor.G)||(c.B!=backColor.B)) {
        backColor = c;
        _SetBackColor (c);
        _MarkForUpdate();
    }
}

//__________________________________________________________________

_HYColor&       _HYButton::GetBackColor (void)
{
    return backColor;
}

//__________________________________________________________________
void            _HYButton::SetText (_String newText)
{
    buttonText = newText;
    _SetText ();
    _MarkForUpdate();
}

//__________________________________________________________________

_String&        _HYButton::GetText (void)
{
    return buttonText;
}

//__________________________________________________________________

_HYFont&        _HYButton::GetFont (void)
{
    return buttonFont;
}

//__________________________________________________________________

void            _HYButton::SetFont (_HYFont&f)
{
    if ((f.face!=buttonFont.face)||(f.size!=buttonFont.size)||(f.style!=buttonFont.style)) {
        _SetFont (f);
        buttonFont.face = f.face;
        buttonFont.size = f.size;
        buttonFont.style = f.style;
        _MarkForUpdate();
    }
}

//__________________________________________________________________
void            _HYButton::SetVisibleSize (_HYRect rel)
{
    _HYComponent::SetVisibleSize (rel);
    _HYPlatformButton::_SetVisibleSize (rel);
}



//__________________________________________________________________

void            _HYButton::EnableButton (bool e)
{
    if (isEnabled!=e) {
        isEnabled = e;
        _EnableButton (e);
    }
}

//__________________________________________________________________

void            _HYButton::SetButtonKind (unsigned char k)
{
    if (buttonKind != k) {
        buttonKind = k;
        _SetButtonKind (k);
    }
}
\ No newline at end of file
diff --git a/src/gui/Components/HYButtonBar.cpp b/src/gui/Components/HYButtonBar.cpp
new file mode 100644
index 0000000..942f573
--- /dev/null
+++ b/src/gui/Components/HYButtonBar.cpp
@@ -0,0 +1,199 @@
+/*
+    Iconic button bar (toolbar) component
+
+    Sergei L. Kosakovsky Pond, May 2000 - December 2002.
+*/
+
+#include "HYEventTypes.h"
+#include "HYButtonBar.h"
+#include "HYGraphicPane.h"
+
+#ifdef    __HYPHYDMALLOC__
+#include "dmalloc.h"
+#endif
+
+//__________________________________________________________________
+
+_HYButtonBar::_HYButtonBar(_HYRect r,Ptr p):_HYComponent (r,p)
+{
+    backColor.R = backColor.G = backColor.B = 255;
+    barW = 100;
+    buttonDim = 32;
+    alignFlags = 0;
+}
+
+//__________________________________________________________________
+
+_HYButtonBar::~_HYButtonBar()
+{
+    _DisposeButtons();
+}
+
+//__________________________________________________________________
+void        _HYButtonBar::SetBackColor (_HYColor c)
+{
+    if ((c.R!=backColor.R)||(c.G!=backColor.G)||(c.B!=backColor.B)) {
+        backColor = c;
+        _SetBackColor (c);
+        _MarkForUpdate();
+    }
+}
+
+
+//__________________________________________________________________
+
+_HYColor&       _HYButtonBar::GetBackColor (void)
+{
+    return backColor;
+}
+
+//__________________________________________________________________
+
+void        _HYButtonBar::AddButton (Ptr p, _String* toolTip)
+{
+    if (p) {
+        enabledButtons<<buttons.lLength;
+        buttons<<(long)p;
+        if (toolTip) {
+            toolTips && toolTip;
+        } else {
+            toolTips && & empty;
+        }
+        _MarkForUpdate();
+    }
+}
+
+//__________________________________________________________________
+
+void        _HYButtonBar::SetToolTip (long index, _String* toolTip)
+{
+    if ((index>=0)&&(index<buttons.lLength)) {
+        toolTips.Replace (index,toolTip,true);
+    }
+}
+
+//__________________________________________________________________
+
+void        _HYButtonBar::ReplaceButton (long index,Ptr p, _String * tt)
+{
+    if (p) {
+        if ((index>=0)&&(index<=buttons.lLength)) {
+            _DisposeButton (index);
+            buttons.lData[index] = (long)p;
+            if (tt) {
+                toolTips.Replace (index, tt, true);
+            }
+            _MarkButtonForUpdate (index);
+        }
+    }
+}
+
+//__________________________________________________________________
+
+Ptr     _HYButtonBar::GetButtonIcon (long index)
+{
+    if ((index>=0)&&(index<=buttons.lLength)) {
+        return (Ptr)buttons.lData[index];
+    }
+
+    return nil;
+}
+//__________________________________________________________________
+
+void        _HYButtonBar::DeleteButton (long index)
+{
+    long f = enabledButtons.BinaryFind(index);
+    if (f>=0) {
+        enabledButtons.Delete(f);
+    }
+    f = pullDownButtons.Find (index);
+    if (f>=0) {
+        pullDownButtons.Delete (f);
+    }
+    buttons.Delete(index);
+    toolTips.Delete (index);
+    _MarkForUpdate();
+}
+
+//__________________________________________________________________
+
+void        _HYButtonBar::MarkAsPullDown (long index, bool add)
+{
+    long f = pullDownButtons.Find (index);
+    if ((f>=0)&&(!add)) {
+        pullDownButtons.Delete (f);
+    }
+    if (add&&(f<=0)) {
+        pullDownButtons << index;
+    }
+}
+
+//__________________________________________________________________
+
+void        _HYButtonBar::EnableButton (long index, bool onOff)
+{
+    long f = enabledButtons.Find(index);
+    if (onOff) {
+        if (f<0) {
+            _MarkButtonForUpdate(index);
+            enabledButtons.InsertElement ((BaseRef)index,-1,false,false);
+        }
+    } else {
+        if (f>=0) {
+            enabledButtons.Delete(f);
+            _MarkButtonForUpdate(index);
+        }
+    }
+}
+
+
+//__________________________________________________________________
+
+void        _HYButtonBar::GetButtonLoc (int b, int& h, int& v, bool c)
+{
+    _HYRect    cRect = _GetButtonRect(c);
+
+    int   step = GetButtonDim()+2*HY_BUTTONBAR_BORDER;
+
+    h = cRect.left+ (b%barW)*step;
+    v = cRect.top + (b/barW)*step;
+}
+
+//__________________________________________________________________
+void        _HYButtonBar::SendButtonPush (int bID)
+{
+    if (messageRecipient) {
+        messageRecipient->ProcessEvent (generateButtonPushEvent (GetID(),bID));
+    }
+}
+
+//__________________________________________________________________
+void        _HYButtonBar::SetVisibleSize     (_HYRect rel)
+{
+    _HYComponent::SetVisibleSize (rel);
+    _HYPlatformButtonBar::_SetVisibleSize (rel);
+}
+
+//__________________________________________________________________
+bool        _HYButtonBar::ProcessEvent (_HYEvent* e)
+{
+    DeleteObject (e);
+    return false;
+}
+
+//__________________________________________________________________
+_HYRect _HYButtonBar::_SuggestDimensions (void)
+{
+    _HYRect res = {10,10,10,10,HY_COMPONENT_NO_SCROLL};
+    int w = ButtonCount(),
+        h=1;
+
+    if (w>BarWidth()) {
+        w = BarWidth();
+        h = ButtonCount()/w+(ButtonCount()%w>0);
+    }
+
+    res.right =  w*(buttonDim+2*HY_BUTTONBAR_BORDER);
+    res.bottom = h*(buttonDim+2*HY_BUTTONBAR_BORDER);
+    return res;
+}
\ No newline at end of file
diff --git a/src/gui/Components/HYCheckBox.cpp b/src/gui/Components/HYCheckBox.cpp
new file mode 100644
index 0000000..652532a
--- /dev/null
+++ b/src/gui/Components/HYCheckBox.cpp
@@ -0,0 +1 @@
+/*
    Check box (with an optional label) component

    Sergei L. Kosakovsky Pond, May 2000 - December 2002.
*/

#include "HYEventTypes.h"
#include "HYLabel.h"
#include "HYGraphicPane.h"

#ifdef    __HYPHYDMALLOC__
#include "dmalloc.h"
#endif
//__________________________________________________________________

_HYCheckbox::_HYCheckbox (_HYRect r,Ptr p, bool isR):_HYLabel (r,p), _HYPlatformCheckbox (isR)
{
    checkState   = false;
    isEnabled    = true;
    checkSpacing = 5;
}

//__________________________________________________________________

_HYCheckbox::~_HYCheckbox()
{
}

//__________________________________________________________________

void    _HYCheckbox::SetState(bool ns, bool sendMessage)
{
    if (checkState!=ns) {
        checkState = ns;
        _SetState (ns);
        if (sendMessage&&messageRecipient) {
            messageRecipient->ProcessEvent (generateButtonPushEvent (GetID(), ns));
        }
    }
}

//__________________________________________________________________

void    _HYCheckbox::SetSpacing (long ns)
{
    if (checkSpacing!=ns) {
        checkSpacing = ns;
        SetVisibleSize (rel);
    }
}

//__________________________________________________________________

void    _HYCheckbox::Enable (bool e)
{
    if (isEnabled!=e) {
        isEnabled = e;
        _Enable (e);
    }
}


//__________________________________________________________________
void        _HYCheckbox::SetVisibleSize  (_HYRect rel)
{
    _HYComponent::SetVisibleSize (rel);
    _HYPlatformCheckbox::_SetVisibleSize (rel);
}
\ No newline at end of file
diff --git a/src/gui/Components/HYLabel.cpp b/src/gui/Components/HYLabel.cpp
new file mode 100644
index 0000000..b7c259e
--- /dev/null
+++ b/src/gui/Components/HYLabel.cpp
@@ -0,0 +1 @@
+/*
    Static Label component

    Sergei L. Kosakovsky Pond, May 2000 - November 2001.
*/

#include "HYEventTypes.h"
#include "HYLabel.h"
#include "HYGraphicPane.h"

#ifdef    __HYPHYDMALLOC__
#include "dmalloc.h"
#endif

//__________________________________________________________________

_HYLabel::_HYLabel(_HYRect r,Ptr p):_HYComponent (r,p)
{
    backColor.R = backColor.G = backColor.B = 255;
    foreColor.R = foreColor.G = foreColor.B = 0;
    labelFont.size = 9;
    labelFont.style = HY_FONT_PLAIN;
    labelFont.face = "Monaco";
    alignFlags = 0;
    visFlags = 0;
}

//__________________________________________________________________

_HYLabel::~_HYLabel()
{
}

//__________________________________________________________________
void        _HYLabel::SetBackColor (_HYColor c)
{
    if ((c.R!=backColor.R)||(c.G!=backColor.G)||(c.B!=backColor.B)) {
        backColor = c;
        _SetBackColor (c);
        _MarkForUpdate();
    }
}


//__________________________________________________________________

_HYColor&       _HYLabel::GetBackColor (void)
{
    return backColor;
}

//__________________________________________________________________
void        _HYLabel::SetForeColor (_HYColor c)
{
    if ((c.R!=foreColor.R)||(c.G!=foreColor.G)||(c.B!=foreColor.B)) {
        foreColor = c;
        _SetForeColor (c);
        _MarkForUpdate();
    }
}

//__________________________________________________________________

_HYColor&       _HYLabel::GetForeColor (void)
{
    return foreColor;
}

//__________________________________________________________________
void        _HYLabel::SetText (_String newText)
{
    if (labelText.Equal(&newText)) {
        return;
    }

    labelText = newText;
    _SetText ();
    _MarkForUpdate();
}

//__________________________________________________________________

_String&        _HYLabel::GetText (void)
{
    return labelText;
}

//__________________________________________________________________

_HYFont&        _HYLabel::GetFont (void)
{
    return labelFont;
}

//__________________________________________________________________

void        _HYLabel::SetShadow (bool toggle)
{
    if (toggle) {
        if (!(HY_LABEL_SHADOW&visFlags)) {
            visFlags|=HY_LABEL_SHADOW;
            _MarkForUpdate();
        }
    } else {
        if (HY_LABEL_SHADOW&visFlags) {
            visFlags&=(0xff-HY_LABEL_SHADOW);
            _MarkForUpdate();
        }
    }
}

//__________________________________________________________________

void            _HYLabel::SetFont (_HYFont&f)
{
    if ((f.face!=labelFont.face)||(f.size!=labelFont.size)||(f.style!=labelFont.style)) {
        _SetFont (f);
        labelFont.face = f.face;
        labelFont.size = f.size;
        labelFont.style = f.style;
        _HYPlatformLabel::_SetVisibleSize (rel);
        _MarkForUpdate();
    }
}

//__________________________________________________________________
void        _HYLabel::SetVisibleSize     (_HYRect rel)
{
    _HYComponent::SetVisibleSize (rel);
    _HYPlatformLabel::_SetVisibleSize (rel);
}
\ No newline at end of file
diff --git a/src/gui/Components/HYPullDown.cpp b/src/gui/Components/HYPullDown.cpp
new file mode 100644
index 0000000..0e408e8
--- /dev/null
+++ b/src/gui/Components/HYPullDown.cpp
@@ -0,0 +1,192 @@
+/*
+    Pull-down menu component
+
+    Sergei L. Kosakovsky Pond, May 2000 - November 2001.
+*/
+
+#include "HYEventTypes.h"
+#include "HYPullDown.h"
+
+#ifdef    __HYPHYDMALLOC__
+#include "dmalloc.h"
+#endif
+
+_String         menuSeparator       ("SEPARATOR");
+
+//__________________________________________________________________
+
+_HYPullDown::_HYPullDown(_HYRect r,Ptr p):_HYComponent (r,p)
+{
+    backColor.R = backColor.G = backColor.B = 255;
+    enabledFlag = true;
+    alignFlags = 0;
+}
+
+//__________________________________________________________________
+
+_HYPullDown::~_HYPullDown()
+{
+}
+
+//__________________________________________________________________
+BaseRef     _HYPullDown::makeDynamic()
+{
+    /*_HYPullDown* res = new _HYPullDown();
+    memcpy ((Ptr)res,(Ptr)this,sizeof (_HYPullDown));
+    res->menuSelections.Duplicate (&menuSelections);
+    res->_Duplicate ((Ptr)this);
+    return res;*/
+    return nil;
+}
+
+//__________________________________________________________________
+void        _HYPullDown::SetBackColor (_HYColor c)
+{
+    if ((c.R!=backColor.R)||(c.G!=backColor.G)||(c.B!=backColor.B)) {
+        backColor = c;
+        _SetBackColor (c);
+        _MarkForUpdate();
+    }
+}
+
+
+//__________________________________________________________________
+
+_HYColor&       _HYPullDown::GetBackColor (void)
+{
+    return backColor;
+}
+
+//__________________________________________________________________
+
+void            _HYPullDown::AddMenuItem  (_String newItem, long loc)
+{
+    menuSelections.InsertElement (&newItem,loc,true);
+    _AddMenuItem (newItem,loc);
+}
+
+//__________________________________________________________________
+
+void            _HYPullDown::SetMenuItem  (_String newItem, long loc)
+{
+    if ((loc>=0)&&(loc<menuSelections.lLength)) {
+        menuSelections.Replace (loc,&newItem,true);
+        _SetMenuItem (newItem,loc);
+    }
+}
+
+//__________________________________________________________________
+
+void            _HYPullDown::DeleteMenuItem  (long loc)
+{
+    if ((loc>=0)&&(loc<menuSelections.lLength)) {
+        menuSelections.Delete (loc);
+        _DeleteMenuItem (loc);
+    }
+}
+
+//__________________________________________________________________
+
+void            _HYPullDown::DeleteAllItems  (void)
+{
+    for (long k=menuSelections.lLength-1; k>=0; k--) {
+        _DeleteMenuItem (k);
+    }
+
+    menuSelections.Clear ();
+}
+
+//__________________________________________________________________
+_String*        _HYPullDown::GetMenuItem  (long loc)
+{
+    if ((loc>=0)&&(loc<menuSelections.lLength)) {
+        return (_String*)menuSelections (loc);
+    }
+    return nil;
+}
+
+//__________________________________________________________________
+long        _HYPullDown::GetSelection (void)
+{
+    return _GetSelection ();
+}
+
+//__________________________________________________________________
+
+void            _HYPullDown::Activate  (void)
+{
+    _HYComponent::Activate();
+    if (IsEnabled()) {
+        _MarkForUpdate();
+    }
+}
+
+//__________________________________________________________________
+
+void            _HYPullDown::Deactivate  (void)
+{
+    _HYComponent::Deactivate();
+    if (IsEnabled()) {
+        _MarkForUpdate();
+    }
+}
+
+
+
+//__________________________________________________________________
+void        _HYPullDown::SendSelectionChange (void)
+{
+    if (messageRecipient) {
+        messageRecipient->ProcessEvent (generateMenuSelChangeEvent (GetID(),GetSelection()));
+    }
+}
+
+//__________________________________________________________________
+void        _HYPullDown::EnableMenu      (bool flag)
+{
+    if (flag!=enabledFlag) {
+        enabledFlag = flag;
+        _EnableMenu    (flag);
+        _MarkForUpdate ();
+    }
+}
+
+//__________________________________________________________________
+bool        _HYPullDown::IsEnabled   (void)
+{
+    return enabledFlag;
+}
+
+//__________________________________________________________________
+void        _HYPullDown::SetVisibleSize  (_HYRect rel)
+{
+    _HYComponent::SetVisibleSize (rel);
+    _HYPlatformPullDown::_SetVisibleSize (rel);
+}
+
+//__________________________________________________________________
+void        _HYPullDown::ChangeSelection     (long newSel, bool eventSend)
+{
+    if ((newSel>=0)&&(newSel<menuSelections.lLength)) {
+        selection = newSel;
+        if (eventSend) {
+            SendSelectionChange();
+        }
+        _MarkForUpdate();
+    }
+}
+
+//__________________________________________________________________
+void        _HYPullDown::EnableItem  (long theItem, bool toggle)
+{
+    if ((theItem>=0)&&(theItem<menuSelections.lLength)) {
+        _EnableItem (theItem,toggle);
+    }
+}
+
+//__________________________________________________________________
+bool        _HYPullDown::ProcessEvent (_HYEvent* e)
+{
+    DeleteObject (e);
+    return false;
+}
\ No newline at end of file
diff --git a/src/gui/Components/HYSequencePanel.cpp b/src/gui/Components/HYSequencePanel.cpp
new file mode 100644
index 0000000..3e8b27e
--- /dev/null
+++ b/src/gui/Components/HYSequencePanel.cpp
@@ -0,0 +1,1667 @@
+/*
+    Sequence panel code
+
+    Sergei L. Kosakovsky Pond, August 2000.
+*/
+
+#include "HYComponent.h"
+#include "HYEventTypes.h"
+#include "HYCanvas.h"
+#include "HYSequencePanel.h"
+#include "HYUtils.h"
+#include "HYPlatformWindow.h"
+#include "math.h"
+#include "HYDialogs.h"
+
+
+
+#ifdef    __HYPHYDMALLOC__
+#include "dmalloc.h"
+#endif
+//__________________________________________________________________
+
+_HYSequencePane::_HYSequencePane(_HYRect s, Ptr p, int h, int w):_HYCanvas (s,p,h,w,32)
+{
+    startColumn = endColumn = startRow = endRow = headerWidth = 0;
+    for (long i=0; i<256; i++) {
+        colorMap[i] = 0;
+    }
+    _HYFont displayFont;
+#ifdef __MAC__
+    displayFont.face = "Monaco";
+    displayFont.size = 10;
+#endif
+#ifdef __WINDOZE__
+    displayFont.face = "Courier";
+    displayFont.size = 14;
+#endif
+#ifdef __HYPHY_GTK__
+    displayFont.face = _HY_MONO_FONT;
+    displayFont.size = 12;
+#endif
+    displayFont.style = HY_FONT_PLAIN;
+    StartDraw();
+    _HYGraphicPane::SetFont(displayFont);
+    EndDraw();
+    charWidth    = GetMaxCharWidth (displayFont)+1;
+    invertColors = false;
+    backColor = (_HYColor) {
+        0xDE,0xDE,0xDE
+    };
+
+    headerColor = (_HYColor) {
+        180,167,150
+    };
+
+    highlightColor = (_HYColor) {
+        75,75,75
+    };
+
+    characterColors<<0;
+    headerWidth = 0;
+    blockWidth = 10;
+    recentClick = -1;
+    showDots = false;
+    nameDisplayFlags = HY_SEQUENCE_PANE_NAMES_ALL;
+    shortHeaderWidth = 0;
+    fullHeaderWidth = 0;
+    active = true;
+    numbers = true;
+    dragScrollCounter = 0;
+}
+
+//__________________________________________________________________
+void _HYSequencePane::InsertColumn(_String* newColumn, long newIndex, bool update)
+{
+    if (newColumn->sLength) {
+        if (columnStrings.lLength) {
+            if (((_String*)columnStrings(0))->sLength!=newColumn->sLength) {
+                return;
+            }
+        }
+        columnStrings.InsertElement (newColumn,newIndex,false);
+    }
+    if (update) {
+        BuildPane();
+    }
+}
+//__________________________________________________________________
+void _HYSequencePane::RemoveColumn(long killIndex, bool update)
+{
+    if ((killIndex>=0)&&(killIndex<columnStrings.lLength)) {
+        long k;
+        if ((k=hiliteColumns.BinaryFind(killIndex))>=0) {
+            hiliteColumns.Delete (k);
+        }
+        columnStrings.Delete(killIndex);
+        if (update) {
+            BuildPane();
+        }
+    }
+}
+//__________________________________________________________________
+void _HYSequencePane::SetCharColor (unsigned char c, _HYColor newColor, bool update)
+{
+    long k      = HYColorToLong (newColor),
+         f,
+         count   =0;
+
+    for (f=0; f<256; f++)
+        if (colorMap[f]==colorMap[c]) {
+            count++;
+        }
+
+    f = characterColors.Find(k);
+    if (count>1) {
+        if (f<0) {
+            f = characterColors.lLength;
+            characterColors<<k;
+        }
+    } else {
+        if (f<0) {
+            characterColors.lData[colorMap[c]] = k;
+            f = colorMap[c];
+        } else {
+            count = colorMap[c];
+            if (k!=characterColors[count]) {
+                characterColors.Delete(count);
+                for (k=0; k<256; k++) {
+                    if (colorMap[k]>count) {
+                        colorMap[k]--;
+                    }
+                }
+            }
+        }
+    }
+    colorMap[c] = f;
+    if (update) {
+        BuildPane();
+    }
+}
+
+//__________________________________________________________________
+void    _HYSequencePane::SetFont(_HYFont newFont)
+{
+    charWidth = GetMaxCharWidth (newFont)+1;
+    StartDraw ();
+    _HYGraphicPane::SetFont (newFont);
+    EndDraw ();
+    SetHeaders (nil,false);
+}
+
+//__________________________________________________________________
+void    _HYSequencePane::SetBackColor (_HYColor newColor)
+{
+    backColor = newColor;
+    BuildPane();
+    _MarkForUpdate();
+}
+
+//__________________________________________________________________
+void    _HYSequencePane::SetHeaderColor (_HYColor newColor)
+{
+    headerColor = newColor;
+    BuildPane();
+    _MarkForUpdate();
+}
+
+//__________________________________________________________________
+void    _HYSequencePane::SetHighliteColor (_HYColor newColor)
+{
+    highlightColor = newColor;
+    BuildPane();
+    _MarkForUpdate();
+}
+
+//__________________________________________________________________
+void    _HYSequencePane::BuildHeaders (void)
+{
+    long h,v,slotHeight = GetSlotHeight(),k;
+    long visWidth = _HYCanvas::GetMaxW()-headerWidth-5,
+         visHeight = _HYCanvas::GetMaxH()-5,
+         selectionIndex = 0;
+
+    if (settings.width&HY_COMPONENT_V_SCROLL) {
+        visWidth-=HY_SCROLLER_WIDTH;
+    }
+    if (settings.width&HY_COMPONENT_H_SCROLL) {
+        visHeight-=HY_SCROLLER_WIDTH;
+    }
+
+    if (headerWidth) {
+        _HYRect  r = {0,0,0,0,1};
+        _HYColor    blackC = {0,0,0},
+                    selectColor = highlightColor;
+
+        SetColor(headerColor);
+        r.right =  headerWidth;
+        if (numbers) {
+            r.bottom = (GetSlotHeight()+1)-1;
+            FillRect(r);
+            r.top = r.bottom+2;
+        } else {
+            r.top = 0;
+        }
+        r.bottom = visHeight;
+        FillRect(r);
+
+        if (numbers) {
+            v = slotHeight+(GetSlotHeight()+1);
+        } else {
+            v = slotHeight;
+        }
+
+        if (vselection.lLength) {
+            SetColor (selectColor);
+            for (h=startRow; h<endRow; h++) {
+                if (selectionIndex<vselection.lLength) {
+                    k = vselection.lData[selectionIndex];
+                    while ((k<h)&&(selectionIndex<vselection.lLength)) {
+                        selectionIndex++;
+                        k = vselection.lData[selectionIndex];
+                    }
+                    if (h==k) {
+                        _HYRect invR;
+                        invR.left = 0;
+                        invR.right = headerWidth;
+                        invR.top = (h-startRow)*slotHeight+(GetSlotHeight()+1)+2;
+                        invR.bottom = invR.top+slotHeight;
+                        FillRect (invR);
+                        selectionIndex++;
+                    }
+                } else {
+                    break;
+                }
+            }
+        }
+        SetColor (blackC);
+        for (h=startRow; h<endRow; h++)
+            if (nameDisplayFlags&HY_SEQUENCE_PANE_NAMES_SHORT) {
+                for (h=startRow; h<endRow; h++,v+=slotHeight) {
+                    _String *thisString = (_String*)rowHeaders(speciesIndex.lData[h]);
+                    if (thisString->sLength<=HY_SEQUENCE_PANE_SHORT_WIDTH) {
+                        DisplayText (*thisString,v,HY_SEQUENCE_PANE_CHAR_SPACING/2,true);
+                    } else {
+                        _String chopped (*thisString);
+                        chopped.Trim(0,HY_SEQUENCE_PANE_SHORT_WIDTH-1);
+                        chopped.sData[HY_SEQUENCE_PANE_SHORT_WIDTH-1]='-';
+                        DisplayText (chopped,v,HY_SEQUENCE_PANE_CHAR_SPACING/2,true);
+                    }
+                }
+            } else
+                for (h=startRow; h<endRow; h++,v+=slotHeight) {
+                    DisplayText (*(_String*)rowHeaders(speciesIndex.lData[h]),v,HY_SEQUENCE_PANE_CHAR_SPACING/2,true);
+                }
+    }
+}
+
+//long buildCounter = 0;
+//__________________________________________________________________
+void    _HYSequencePane::BuildPane (bool setport)
+{
+    if (setport) {
+        StartDraw();
+        EraseAll();
+    }
+    if (columnStrings.lLength) {
+        long visWidth  = _HYCanvas::GetMaxW()-headerWidth-5,
+             visHeight = _HYCanvas::GetMaxH()-5,
+             rowCount = speciesIndex.lLength,
+             slotHeight = GetSlotHeight(),h,v,lastColor = -1, selectionIndex = 0,
+             c;
+        if (settings.width&HY_COMPONENT_V_SCROLL) {
+            visWidth-=HY_SCROLLER_WIDTH;
+        }
+        if (settings.width&HY_COMPONENT_H_SCROLL) {
+            visHeight-=HY_SCROLLER_WIDTH;
+        }
+        if (startColumn<0) {
+            startColumn = 0;
+        }
+        if (startRow<0) {
+            startRow = 0;
+        }
+        if (setport) {
+            endColumn = startColumn+visWidth/charWidth;
+            h = (endColumn-startColumn)/5;
+            endColumn = startColumn+(visWidth-h)/charWidth;
+            endRow = startRow+visHeight/slotHeight;
+        }
+        if (endColumn>columnStrings.lLength) {
+            endColumn = columnStrings.lLength;
+        }
+        if (endRow>rowCount) {
+            endRow = rowCount;
+        }
+
+        _HYRect     r = {0,0,visHeight,visWidth+headerWidth,1},
+                    backCharRect;
+
+        _HYColor    blackC      = {0,0,0},
+                    charColor   = {0,0,0},
+                    whiteC      = {255,255,255},
+                    selectColor = highlightColor;
+
+        if (setport) {
+            SetColor    (backColor);
+        } else {
+            selectColor = (_HYColor) {
+                160,160,160
+            };
+            SetColor      (whiteC);
+        }
+
+        FillRect    (r);
+
+        SetColor (blackC);
+        BuildHeaders();
+        if (numbers) {
+            r.left = 0;
+            r.right = visWidth+headerWidth;
+            r.bottom = (GetSlotHeight()+1);
+            SetColor (headerColor);
+            FillRect(r);
+            if (setport) {
+                SetColor (blackC);
+                r.top = r.bottom;
+                DrawLine    (r);
+            }
+        }
+
+        if (setport) {
+            r.left = r.right = headerWidth;
+            r.top = 0;
+            r.bottom = visHeight;
+            DrawLine    (r);
+        }
+        r.left = r.right = headerWidth;
+        r.top = 0;
+        r.bottom = visHeight;
+        h = HY_SEQUENCE_PANE_CHAR_SPACING/2+headerWidth;
+        visWidth+=headerWidth;
+        for (c = startColumn; c < endColumn; c++,h+=charWidth) {
+            if (h+charWidth>visWidth) {
+                endColumn = c;
+                break;
+            }
+
+            bool isColumnSelected = false;
+
+            if (selectionIndex<selection.lLength) {
+                rowCount = selection.lData[selectionIndex];
+                while ((rowCount<c)&&(selectionIndex<selection.lLength)) {
+                    selectionIndex++;
+                    rowCount = selection.lData[selectionIndex];
+                }
+
+                if (c==rowCount) {
+                    if (!invertColors) {
+                        _HYRect invR;
+                        invR.top    = (GetSlotHeight()+1)+1;
+                        invR.bottom = visHeight-1;
+                        invR.right  = h+charWidth;
+                        invR.left   = h;
+
+                        if (c&&(c%blockWidth==0)) {
+                            invR.right+=2;
+                        } else if (c+1==endColumn) {
+                            invR.right+=3;
+                        }
+
+                        charColor = GetColor();
+                        SetColor (selectColor);
+                        FillRect (invR);
+                        SetColor (charColor);
+
+                    }
+                    selectionIndex++;
+                    isColumnSelected = true;
+                }
+            }
+
+            if (c && (c%blockWidth==0) && (setport|| c>startColumn) ) {
+                SetColor (blackC);
+                if (numbers) {
+                    _String number (c);
+#ifdef __MAC__
+                    rowCount = h-2-GetVisibleStringWidth(number);
+#else
+                    rowCount = h-2-GetVisibleStringWidth(number, font);
+#endif
+                    if (rowCount>headerWidth) {
+                        DisplayText (number,slotHeight-3,rowCount,true);
+                    }
+                }
+                if (setport) {
+                    r.left = r.right = h;
+                    DrawLine (r);
+                }
+                SetColor (charColor);
+                h+=2;
+            }
+
+            if (numbers) {
+                v = slotHeight+(GetSlotHeight()+1);
+            } else {
+                v = slotHeight;
+            }
+
+            _String       *thisString = (_String*)columnStrings(c);
+
+            unsigned char topChar = showDots?thisString->sData[speciesIndex.lData[0]]:0;
+
+            //if (!setport)
+            //SetColor (blackC);
+
+            backCharRect = (_HYRect) {
+                v-slotHeight+1,h-1,v+1,h+charWidth-1,0
+            };
+            if ((c+1)%blockWidth == 0) {
+                backCharRect.right++;
+            }
+
+            for (long r = startRow; r < endRow; r++,v+=slotHeight) {
+                unsigned char thisC = thisString->sData[speciesIndex.lData[r]];
+                long     myColor    = colorMap[thisC];
+
+                if (r && thisC==topChar) {
+                    thisC = '.';
+                }
+
+                //if (setport)
+                {
+                    if (invertColors && !isColumnSelected) {
+                        charColor = LongToHYColor (characterColors.lData[myColor]);
+                        if ((long)charColor.R+charColor.G+charColor.B > 100) {
+                            SetColor (charColor);
+                            FillRect    (backCharRect);
+                        }
+                        backCharRect.top    += slotHeight;
+                        backCharRect.bottom += slotHeight;
+                        SetColor    (blackC);
+                    } else if (colorMap[thisC]!=lastColor) {
+                        lastColor = colorMap[thisC];
+                        charColor = LongToHYColor(characterColors.lData[lastColor]);
+                        SetColor (charColor);
+                    }
+                }
+                DisplayChar (thisC,v,h);
+            }
+        }
+
+        if ((!setport)&&(c%blockWidth == 0)) {
+            SetColor (blackC);
+            if (numbers) {
+                _String number (c);
+#ifdef __MAC__
+                rowCount = h-2-GetVisibleStringWidth(number);
+#else
+                rowCount = h-2-GetVisibleStringWidth(number, font);
+#endif
+                if (rowCount>headerWidth) {
+                    DisplayText (number,slotHeight-3,rowCount,true);
+                }
+            }
+        }
+        SetColor (blackC);
+        r.left = 0;
+        r.right = visWidth;
+
+
+        if (settings.width&HY_COMPONENT_BORDER_B) {
+            r.top = r.bottom = visHeight-1;
+            if (setport) {
+                DrawLine(r);
+            }
+        }
+
+    }
+    if (setport) {
+        EndDraw();
+    }
+}
+
+//__________________________________________________________________
+void    _HYSequencePane::HScrollPane (long dx)
+{
+#ifndef __HYPHY_GTK__
+    if (abs(dx)>=endColumn-startColumn-5)
+#endif
+    {
+        startColumn+=dx;
+        BuildPane();
+        _MarkForUpdate();
+        return;
+    }
+
+    long visWidth = _HYCanvas::GetMaxW()-headerWidth-5,
+         visHeight = _HYCanvas::GetMaxH()-5,
+         slotHeight = GetSlotHeight(),h,v,lastColor = -1,adx,
+         loopStart,loopEnd,selectionIndex = 0;
+
+    if (settings.width&HY_COMPONENT_V_SCROLL) {
+        visWidth-=HY_SCROLLER_WIDTH;
+    }
+    if (settings.width&HY_COMPONENT_H_SCROLL) {
+        visHeight-=HY_SCROLLER_WIDTH;
+    }
+
+    if (dx>0) {
+        if (endColumn+dx>columnStrings.lLength) {
+            dx = columnStrings.lLength-endColumn;
+        }
+        adx = dx;
+        v = (startColumn+dx)/blockWidth-startColumn/blockWidth;
+        if (startColumn&&(startColumn%blockWidth==0)) {
+            v++;
+        }
+        if ((startColumn+dx)&&((startColumn+dx)%blockWidth==0)) {
+            v--;
+        }
+    } else {
+        if  (startColumn<-dx) {
+            dx=-startColumn;
+        }
+        adx = -dx;
+        v = startColumn/blockWidth-(startColumn+dx)/blockWidth;
+        if (startColumn&&(startColumn%blockWidth==0)) {
+            v--;
+        }
+        if ((startColumn+dx)&&((startColumn+dx)%blockWidth==0)) {
+            v++;
+        }
+    }
+    if (!dx) {
+        return;
+    }
+
+    StartDraw();
+
+    h = adx*charWidth+2*v;
+    _HYRect     r = {0,0,visHeight,0,1},
+                backCharRect;
+
+    visWidth+=headerWidth;
+
+    startColumn+=dx;
+    endColumn+=dx;
+
+    if (dx>0) {
+        r.left = headerWidth+1;
+        r.right = visWidth;
+        _SlideRect (r,0,-h);
+    } else {
+        r.left = headerWidth+1;
+        r.right = visWidth;
+        _SlideRect (r,0,h);
+    }
+
+
+    if (dx>0) {
+        r.right = visWidth;
+        r.left = r.right-h;
+    } else {
+        r.left = headerWidth+1;
+        r.right = headerWidth+h+1;
+    }
+    SetColor    (backColor);
+    FillRect    (r);
+    _HYColor    blackC = {0,0,0},
+                charColor = {0,0,0},
+                selectColor = highlightColor;
+
+    r.top = 0;
+    if (numbers) {
+        r.bottom = (GetSlotHeight()+1);
+        SetColor(headerColor);
+        FillRect(r);
+        r.top = r.bottom;
+    } else {
+        r.top = r.bottom = 0;
+    }
+    SetColor    (blackC);
+
+    if (settings.width&HY_COMPONENT_BORDER_T) {
+        DrawLine    (r);
+    }
+
+    if (settings.width&HY_COMPONENT_BORDER_B) {
+        r.top = r.bottom = visHeight-1;
+        DrawLine (r);
+    }
+    r.top = 0;
+    if (dx<0) {
+        if (numbers) {
+            SetColor (headerColor);
+            r.bottom = (GetSlotHeight()+1);
+            r.left = 0;
+            r.right = headerWidth;
+            FillRect (r);
+        }
+        h = HY_SEQUENCE_PANE_CHAR_SPACING/2+headerWidth;
+    } else {
+        h = HY_SEQUENCE_PANE_CHAR_SPACING/2+headerWidth;
+        for (v=startColumn; v<endColumn-dx; v++,h+=charWidth)
+            if (v&&(v%blockWidth)==0) {
+                h+=2;
+            }
+    }
+    r.bottom = visHeight;
+    loopStart = dx>0?endColumn-dx:startColumn;
+    loopEnd =  dx>0?endColumn:startColumn-dx;
+
+    if (loopStart<0) {
+        loopStart = 0;
+    }
+    if (loopEnd<0) {
+        loopEnd = 0;
+    }
+    if (loopStart>columnStrings.lLength) {
+        loopStart = columnStrings.lLength;
+    }
+    if (loopEnd>columnStrings.lLength) {
+        loopEnd = columnStrings.lLength;
+    }
+
+    for (long c = loopStart; c < loopEnd; c++,h+=charWidth) {
+        bool isColumnSelected = false;
+        if (selectionIndex<selection.lLength) {
+            visWidth = selection.lData[selectionIndex];
+            while ((visWidth<c)&&(selectionIndex<selection.lLength)) {
+                selectionIndex++;
+                visWidth = selection.lData[selectionIndex];
+            }
+            if (c==visWidth) {
+                if (!invertColors) {
+                    _HYRect invR;
+                    invR.top = (GetSlotHeight()+1)+1;
+                    invR.bottom = visHeight-1;
+                    invR.right = h+charWidth;
+                    invR.left = h-2;
+                    if (c&&(c%blockWidth==0)) {
+                        invR.right+=2;
+                    }
+                    /*else
+                        if ((c+1==loopEnd)&&(dx>0))
+                            invR.right+=3;
+                    */
+                    charColor = GetColor();
+                    SetColor (selectColor);
+                    FillRect (invR);
+                    SetColor (charColor);
+                }
+                selectionIndex++;
+                isColumnSelected = true;
+            }
+        }
+        if (c&&(c%blockWidth==0)) {
+            SetColor (blackC);
+            if (numbers) {
+                _String number (c);
+
+#ifdef __MAC__
+                visWidth = h-2-GetVisibleStringWidth(number);
+#else
+                visWidth = h-2-GetVisibleStringWidth(number, font);
+#endif
+
+                if (visWidth>headerWidth) {
+                    DisplayText (number,slotHeight-3,visWidth,true);
+                }
+            }
+            r.left = r.right = h;
+            DrawLine (r);
+            SetColor (charColor);
+            h+=2;
+        }
+        if (numbers) {
+            v = slotHeight+(GetSlotHeight()+1);
+        } else {
+            v = slotHeight;
+        }
+
+        _String *thisString = (_String*)columnStrings(c);
+        unsigned char topChar = showDots?thisString->sData[speciesIndex.lData[0]]:0;
+
+        backCharRect = (_HYRect) {
+            v-slotHeight+1,h-1,v+1,h+charWidth-1,0
+        };
+        if ((c+1)%blockWidth == 0) {
+            backCharRect.right++;
+        }
+
+        for (long r = startRow; r < endRow; r++,v+=slotHeight) {
+            /*unsigned char thisC = thisString->sData[speciesIndex.lData[r]];
+            if (r&&(thisC==topChar))
+                thisC = '.';
+            if (colorMap[thisC]!=lastColor)
+            {
+                lastColor = colorMap[thisC];
+                charColor = LongToHYColor(characterColors.lData[lastColor]);
+                SetColor (charColor);
+            }
+            DisplayChar (thisC,v,h);*/
+            unsigned char thisC = thisString->sData[speciesIndex.lData[r]];
+            long     myColor    = colorMap[thisC];
+
+            if (r && thisC==topChar) {
+                thisC = '.';
+            }
+
+            if (invertColors && !isColumnSelected) {
+                charColor = LongToHYColor (characterColors.lData[myColor]);
+                if ((long)charColor.R+charColor.G+charColor.B > 100) {
+                    SetColor (charColor);
+                    FillRect    (backCharRect);
+                }
+                backCharRect.top += slotHeight;
+                backCharRect.bottom += slotHeight;
+                SetColor    (blackC);
+            } else if (colorMap[thisC]!=lastColor) {
+                lastColor = colorMap[thisC];
+                charColor = LongToHYColor(characterColors.lData[lastColor]);
+                SetColor (charColor);
+            }
+            DisplayChar (thisC,v,h);
+        }
+    }
+
+    if (numbers&&(dx<0)) {
+        loopEnd--;
+        v = loopEnd%blockWidth;
+        visWidth = blockWidth-log(double(loopEnd+blockWidth-1))/log((double)blockWidth);
+
+        if (adx<blockWidth) {
+            loopStart = (startColumn-dx)%blockWidth;
+            if ((startColumn-dx)/blockWidth!=startColumn/blockWidth)
+                // scrolled thru a block divider
+            {
+                if (loopStart==0) {
+                    h += (blockWidth-v-1)*charWidth;
+                } else {
+                    h = 0;
+                }
+            } else {
+                if (loopStart>visWidth) {
+                    h += (blockWidth-v-1)*charWidth;
+                } else {
+                    h = 0;
+                }
+            }
+        } else {
+            loopStart = (startColumn-dx)%blockWidth;
+
+            if (loopStart)
+                if (loopStart>=visWidth) {
+                    h -= (loopStart-blockWidth)*charWidth;
+                } else {
+                    h = 0;
+                }
+
+        }
+
+        if (h) {
+            _String number (v?((loopEnd/blockWidth)+1)*blockWidth:loopEnd);
+            SetColor (blackC);
+#ifdef __MAC__
+            visWidth = h-2-GetVisibleStringWidth(number);
+#else
+            visWidth = h-2-GetVisibleStringWidth(number, font);
+#endif
+            while ((visWidth < headerWidth)&&(number.sLength)) {
+                number.Trim (1,-1);
+#ifdef __MAC__
+                visWidth = h-2-GetVisibleStringWidth(number);
+#else
+                visWidth = h-2-GetVisibleStringWidth(number, font);
+#endif
+            }
+            if (number.sLength) {
+                DisplayText (number,slotHeight-3,visWidth,true);
+            }
+        }
+    }
+
+    EndDraw();
+    if (messageRecipient) {
+        messageRecipient->ProcessEvent(generateScrollEvent(0,0));
+    }
+    _MarkForUpdate();
+}
+//__________________________________________________________________
+void    _HYSequencePane::ScrollToHSelection (void)
+{
+    if (selection.lLength) {
+        long        dx = selection.lData[0]-startColumn;
+        if ((dx<0)&&(-dx>startColumn)) {
+            dx = -startColumn;
+        } else if ((dx>0)&&(endColumn+dx>columnStrings.lLength)) {
+            dx = columnStrings.lLength-endColumn;
+        }
+
+        HScrollPane (dx);
+    }
+}
+
+
+//__________________________________________________________________
+bool    _HYSequencePane::ProcessEvent(_HYEvent* e)
+{
+    if (e->EventClass() == _hyScrollingEvent) {
+        long h,v,k,t;
+        _String firstArg = e->EventCode().Cut (0,(v=e->EventCode().Find(','))-1);
+        h = firstArg.toNum();
+        firstArg = e->EventCode().Cut (v+1,-1);
+        DeleteObject(e);
+        v = firstArg.toNum();
+        if (h||v) {
+            if (h) {
+                if (settings.width&HY_COMPONENT_H_SCROLL) {
+                    k = columnStrings.lLength-endColumn+startColumn+1;
+                    t = _GetHScrollerPos()*(_Parameter)k/MAX_CONTROL_VALUE;
+                    if (startColumn == t) {
+                        if (h>0) {
+                            t++;
+                        } else {
+                            t--;
+                        }
+                        _SetHScrollerPos((MAX_CONTROL_VALUE*(_Parameter)t)/k);
+                    }
+                    if (!v) {
+                        HScrollPane (t-startColumn);
+                        return true;
+                    }
+                    startColumn = t;
+                } else {
+                    HScrollPane (h);
+                }
+                //startColumn += v;
+
+            } else {
+                if (settings.width&HY_COMPONENT_V_SCROLL) {
+                    k = RowCount()-endRow+startRow+1;
+                    t = (_GetVScrollerPos()*(_Parameter)k) /MAX_CONTROL_VALUE;
+                    if (startRow != t) {
+                        startRow = t;
+                    } else {
+                        if (v>0) {
+                            startRow++;
+                        } else {
+                            startRow--;
+                        }
+                        _SetVScrollerPos((MAX_CONTROL_VALUE*(_Parameter)startRow)/k);
+                    }
+                } else {
+                    startRow += v;
+                }
+                BuildPane();
+            }
+            if (messageRecipient) {
+                messageRecipient->ProcessEvent (generateScrollEvent(0,0));
+            }
+
+            _MarkForUpdate();
+        }
+        return true;
+    }
+    DeleteObject (e);
+    return false;
+}
+
+//__________________________________________________________________
+int         _HYSequencePane::GetMaxW (void)
+{
+    int res = charWidth*(columnStrings.lLength)+headerWidth;
+    res+=(columnStrings.lLength/blockWidth)*2;
+    if (settings.width&HY_COMPONENT_V_SCROLL) {
+        res+=2*HY_SCROLLER_WIDTH;
+    }
+    if (res<settings.right) {
+        res = settings.right;
+    }
+    return res;
+}
+
+//__________________________________________________________________
+int         _HYSequencePane::GetMaxH (void)
+{
+    int res = (GetFont().size+HY_SEQUENCE_PANE_CHAR_SPACING)*(RowCount())+3;
+    if (settings.width&HY_COMPONENT_H_SCROLL) {
+        res+=2*HY_SCROLLER_WIDTH;
+    } else {
+        res+=2;
+    }
+    if (numbers) {
+        res += (GetSlotHeight()+1);
+    }
+
+    return res;
+}
+
+//__________________________________________________________________
+int         _HYSequencePane::GetMinH (void)
+{
+    int res = GetFont().size+HY_SEQUENCE_PANE_CHAR_SPACING*2;
+
+    if (numbers) {
+        res += (GetSlotHeight()+1)+HY_SEQUENCE_PANE_CHAR_SPACING+2;
+    }
+
+    return res;
+}
+//__________________________________________________________________
+long            _HYSequencePane::RowCount (void)
+{
+    int res = 0;
+    if (columnStrings.lLength) {
+        res = speciesIndex.lLength;
+    }
+    return res;
+}
+//__________________________________________________________________
+long            _HYSequencePane::GetSlotHeight (void)
+{
+    return GetFont().size+HY_SEQUENCE_PANE_CHAR_SPACING;
+}
+
+//__________________________________________________________________
+
+void        _HYSequencePane::SetVisibleSize (_HYRect r)
+{
+    int ht = r.bottom-r.top+5,
+        wd = r.right-r.left+5;
+
+    SetPaneSize (ht,wd,32);
+    hOrigin = vOrigin = 0;
+    settings.right = hSize = wd;
+    settings.bottom = vSize = ht;
+    needUpdate = true;
+//  check if resizing also requires scrolling
+
+    long visWidth  = _HYCanvas::GetMaxW()-headerWidth-5,
+         visHeight = _HYCanvas::GetMaxH()-5,
+         rowCount = speciesIndex.lLength;
+
+    if (settings.width&HY_COMPONENT_V_SCROLL) {
+        visWidth-=HY_SCROLLER_WIDTH;
+    }
+    if (settings.width&HY_COMPONENT_H_SCROLL) {
+        visHeight-=HY_SCROLLER_WIDTH;
+    }
+
+    endColumn = startColumn+visWidth/charWidth;
+    ht = (endColumn-startColumn)/5;
+    endColumn = startColumn+(visWidth-ht)/charWidth;
+    endRow = startRow+visHeight/GetSlotHeight();
+
+    if (endColumn>columnStrings.lLength) {
+        startColumn -= endColumn-columnStrings.lLength-1;
+        if (startColumn<0) {
+            startColumn = 0;
+        }
+        endColumn = columnStrings.lLength;
+    }
+
+    if (endRow>rowCount) {
+        startRow -= endRow-rowCount-1;
+        if (startRow<0) {
+            startRow = 0;
+        }
+        endRow = rowCount;
+    }
+
+    if (settings.width&HY_COMPONENT_V_SCROLL) {
+        long k = RowCount()-endRow+startRow+1;
+        _SetVScrollerPos((MAX_CONTROL_VALUE*(_Parameter)startRow)/k);
+    }
+
+    BuildPane();
+    r.bottom ++;
+    _HYComponent::SetVisibleSize(r);
+    rel.bottom--;
+}
+
+
+//__________________________________________________________________
+
+void        _HYSequencePane::SetBlockWidth (long bw, bool update)
+{
+    if (bw!=blockWidth) {
+        blockWidth = bw;
+        if (update) {
+            BuildPane();
+        }
+    }
+}
+
+//__________________________________________________________________
+
+void        _HYSequencePane::SetHeaders (_List* newH, bool update)
+{
+    if (newH) {
+        rowHeaders.Clear();
+        rowHeaders.Duplicate (newH);
+        speciesIndex.Clear();
+    }
+
+    headerWidth = 0;
+    shortHeaderWidth = 0;
+    StartDraw();
+    for (long k=0; k<rowHeaders.lLength; k++) {
+        _String * thisString = (_String*)rowHeaders(k);
+#ifdef __MAC__
+        long lW = GetVisibleStringWidth(*thisString);
+#else
+        long lW = GetVisibleStringWidth(*thisString, font);
+#endif
+        if (lW>headerWidth) {
+            headerWidth = lW;
+        }
+        if (thisString->sLength<=HY_SEQUENCE_PANE_SHORT_WIDTH) {
+            if (lW>shortHeaderWidth) {
+                shortHeaderWidth = lW;
+            }
+        } else {
+            _String chopped (*thisString);
+            chopped.Trim(0,HY_SEQUENCE_PANE_SHORT_WIDTH-1);
+#ifdef __MAC__
+            long sW = GetVisibleStringWidth (chopped);
+#else
+            long sW = GetVisibleStringWidth (chopped, font);
+#endif
+            if (sW>shortHeaderWidth) {
+                shortHeaderWidth = sW;
+            }
+        }
+        if (newH) {
+            speciesIndex  << k;
+        }
+    }
+    headerWidth         += HY_SEQUENCE_PANE_CHAR_SPACING;
+    shortHeaderWidth    += HY_SEQUENCE_PANE_CHAR_SPACING;
+    EndDraw();
+    fullHeaderWidth = headerWidth;
+
+    if (update) {
+        BuildPane();
+    }
+}
+
+//__________________________________________________________________
+
+void        _HYSequencePane::ChangeHeaders (void)
+{
+    BuildPane();
+    _MarkForUpdate();
+    SendSelectionChange(true);
+}
+
+//__________________________________________________________________
+
+void        _HYSequencePane::SetNameDisplayMode (unsigned char newMode, bool update)
+{
+    if (nameDisplayFlags!=newMode) {
+        nameDisplayFlags = newMode;
+        if (newMode&HY_SEQUENCE_PANE_NAMES_SHORT) {
+            headerWidth = shortHeaderWidth;
+        } else if (newMode&HY_SEQUENCE_PANE_NAMES_ALL) {
+            headerWidth = fullHeaderWidth;
+        } else {
+            headerWidth = 0;
+        }
+
+        if (update) {
+            BuildPane();
+            _MarkForUpdate();
+        }
+    }
+}
+
+//__________________________________________________________________
+void        _HYSequencePane::AddColumnToSelection (long c)
+{
+    if ((c>0)&&(c<columnStrings.lLength)) {
+        if (selection.lLength) {
+            long f = selection.BinaryFind (c);
+            if (f<0) {
+                selection.InsertElement ((BaseRef)c,-f-2,false,false);
+            }
+        } else {
+            selection<<c;
+        }
+    }
+}
+
+//__________________________________________________________________
+void        _HYSequencePane::AddSpeciesToSelection (long c)
+{
+    if (c>0 && c<speciesIndex.lLength)
+        if (vselection.lLength) {
+            long f = vselection.BinaryFind (c);
+            if (f<0) {
+                vselection.InsertElement ((BaseRef)c,-f-2,false,false);
+            }
+        } else {
+            vselection<<c;
+        }
+}
+
+
+//__________________________________________________________________
+void        _HYSequencePane::SelectSequenceNames (_List& list, bool send)
+{
+    selection.Clear();
+    vselection.Clear();
+
+    for (long k=0; k<rowHeaders.lLength; k++) {
+        _String * aSeq = (_String*)rowHeaders(speciesIndex.lData[k]);
+        if (list.BinaryFind (aSeq) >= 0) {
+            vselection << k;
+        }
+    }
+
+    BuildPane();
+    _MarkForUpdate();
+    if (send) {
+        SendSelectionChange (true);
+    }
+}
+
+
+//__________________________________________________________________
+void        _HYSequencePane::SelectAll (bool flag)
+{
+    if (flag) {
+        if (selection.lLength!=columnStrings.lLength) {
+            selection.Clear();
+            vselection.Clear();
+            selection.RequestSpace (columnStrings.lLength);
+            for (long k=0; k<columnStrings.lLength; k++) {
+                selection<<k;
+            }
+            BuildPane();
+            _MarkForUpdate();
+            SendSelectionChange();
+        }
+    } else {
+        if (selection.lLength) {
+            selection.Clear();
+            BuildPane();
+            _MarkForUpdate();
+            SendSelectionChange();
+        }
+    }
+}
+
+//__________________________________________________________________
+void        _HYSequencePane::SelectRange (_SimpleList& range, bool vert)
+{
+    if (vert) {
+        selection.Clear();
+        vselection.Clear();
+        vselection.Duplicate(&range);
+        vselection.Sort();
+    } else {
+        vselection.Clear();
+        selection.Clear();
+        selection.Duplicate(&range);
+        selection.Sort();
+    }
+    BuildPane();
+    _MarkForUpdate();
+}
+
+//__________________________________________________________________
+void        _HYSequencePane::MoveSpecies (long oldIndex, long newIndex)
+{
+    if ((newIndex!=oldIndex)&&(newIndex>=-1)) {
+        long c = speciesIndex.lData[oldIndex];
+        speciesIndex.InsertElement ((BaseRef)c,newIndex+1,false,false);
+        if (oldIndex>newIndex) {
+            oldIndex++;
+            newIndex++;
+        }
+        vselection.lData[0] = newIndex;
+        speciesIndex.Delete(oldIndex);
+        BuildPane();
+        _MarkForUpdate();
+    }
+}
+
+//__________________________________________________________________
+void        _HYSequencePane::SetSequenceOrder (_SimpleList& no)
+{
+    speciesIndex.Duplicate (&no);
+    BuildPane();
+    _MarkForUpdate();
+}
+
+//__________________________________________________________________
+void        _HYSequencePane::ProcessSelectionChange (long h, long v, bool shift, bool command, bool drag)
+{
+    if (vselection.lLength) {
+        vselection.Clear();
+        SendSelectionChange(true);
+    }
+    if (drag) {
+        long k = columnStrings.lLength-endColumn+startColumn+1,
+             scrollAmount = 0;
+
+        if ( h<headerWidth && v>GetSlotHeight()+1)
+            // scroll in columns from the left
+        {
+            if (selection.lData[0]>startColumn) {
+                h = selection.lData[0];
+                for (v=h-1; v>=startColumn; v--) {
+                    selection.InsertElement((BaseRef)v,0,false,false);
+                }
+                BuildPane();
+                if (startColumn == 0) {
+                    _MarkForUpdate();
+                }
+            }
+            if (startColumn>0) {
+                long dsc = abs(dragScrollCounter);
+
+                if (dsc < 25) {
+                    scrollAmount = 1;
+                } else if (dsc < 50) {
+                    scrollAmount = 2;
+                } else if (dsc < 150) {
+                    scrollAmount = 3;
+                } else {
+                    scrollAmount = 5;
+                }
+
+                if (scrollAmount>startColumn) {
+                    scrollAmount = startColumn;
+                }
+
+                if (selection.lData[0] >= startColumn) {
+                    for (dsc = startColumn-1; dsc>=startColumn-scrollAmount; dsc--) {
+                        selection.InsertElement((BaseRef)(dsc),0,false,false);
+                    }
+                } else {
+                    if (selection.lLength) {
+                        if (selection.lLength < scrollAmount) {
+                            scrollAmount = selection.lLength;
+                        }
+
+                        if (selection.lData[selection.lLength] >= startColumn) {
+                            while (selection.lLength && (selection.lData[selection.lLength] >= startColumn)) {
+                                selection.Delete (selection.lLength-1);
+                            }
+                            BuildPane();
+                        }
+
+                        for (dsc = 0; (dsc<scrollAmount)&&(selection.lLength>1); dsc++) {
+                            selection.Delete (selection.lLength-1);
+                        }
+                    }
+                }
+
+
+                HScrollPane(-scrollAmount);
+
+                dragScrollCounter -= scrollAmount;
+
+                _SetHScrollerPos(((double)MAX_CONTROL_VALUE*startColumn)/k);
+                SendSelectionChange();
+
+                return;
+            }
+        } else {
+            if (h>=_HYCanvas::GetMaxW()-5 && v>GetSlotHeight()+1)
+                // scroll in columns from the right
+            {
+                if (selection.lData[selection.lLength-1]<endColumn-1) {
+                    for (v=selection.lData[selection.lLength-1]+1; v<endColumn; v++) {
+                        selection<<v;
+                    }
+                    BuildPane();
+                    if (endColumn==columnStrings.lLength) {
+                        _MarkForUpdate();
+                    }
+                }
+                if (endColumn<columnStrings.lLength) {
+                    long dsc = abs(dragScrollCounter);
+
+                    if (dsc < 25) {
+                        scrollAmount = 1;
+                    } else if (dsc < 50) {
+                        scrollAmount = 2;
+                    } else if (dsc < 150) {
+                        scrollAmount = 3;
+                    } else {
+                        scrollAmount = 5;
+                    }
+
+                    if (scrollAmount>columnStrings.lLength-endColumn) {
+                        scrollAmount = columnStrings.lLength-endColumn;
+                    }
+
+
+                    if ((!selection.lLength)||(selection.lData[selection.lLength-1]<=endColumn))
+                        for (dsc = endColumn; dsc<endColumn+scrollAmount; dsc++) {
+                            selection << dsc;
+                        }
+                    else {
+                        if (selection.lLength) {
+                            if (selection.lLength < scrollAmount) {
+                                scrollAmount = selection.lLength;
+                            }
+
+                            if (selection.lData[0] < endColumn) {
+                                while (selection.lLength && (selection.lData[0] < endColumn)) {
+                                    selection.Delete (0);
+                                }
+                                BuildPane();
+                            }
+
+                            for (dsc = 0; (dsc<scrollAmount)&&(selection.lLength>1); dsc++) {
+                                selection.Delete (0);
+                            }
+                        }
+                    }
+
+
+                    HScrollPane(scrollAmount);
+
+                    dragScrollCounter+= scrollAmount;
+
+                    _SetHScrollerPos(((double)MAX_CONTROL_VALUE*startColumn)/k);
+                    SendSelectionChange();
+                    return;
+                }
+            } else {
+                dragScrollCounter = 0;
+            }
+        }
+    } else {
+        dragScrollCounter = 0;
+    }
+
+    if ( h>headerWidth && v>GetSlotHeight()+1 ) {
+        v=startRow+(v-(GetSlotHeight()+1))/(GetFont().size+HY_SEQUENCE_PANE_CHAR_SPACING);
+
+        long    k,
+                p = headerWidth+charWidth+HY_SEQUENCE_PANE_CHAR_SPACING/2;
+
+        for (k=startColumn; k<endColumn; k++,p+=charWidth)
+            // find which column was clicked
+        {
+            if (k&&(k%blockWidth==0)) {
+                p+=2;
+            }
+            if (p>=h) {
+                break;
+            }
+        }
+        h = k;
+        if (shift) {
+            if (recentClick!=-1) {
+                if (h==recentClick) {
+                    return;
+                }
+
+                _SimpleList   * saveSelection = nil;
+
+                if ( !command || drag) {
+                    saveSelection = (_SimpleList*)selection.makeDynamic();
+                    selection.Clear();
+                }
+
+                if (h>recentClick) {
+                    k=recentClick;
+                    p=h;
+                } else {
+                    p=recentClick;
+                    k=h;
+                }
+                //if (!drag)
+                {
+                    if (!command||!selection.lLength||drag)
+                        for (v=k; v<=p; v++) {
+                            selection<<v;
+                        }
+                    else {
+                        for (v=k; v<=p; v++) {
+                            AddColumnToSelection(v);
+                        }
+                    }
+                }
+                if (saveSelection) {
+                    bool doUpdate = false;
+                    if (!saveSelection->Equal(selection)) {
+                        doUpdate = true;
+                    }
+                    DeleteObject (saveSelection);
+                    if (!doUpdate) {
+                        return;
+                    }
+                }
+                BuildPane();
+                _MarkForUpdate();
+                SendSelectionChange();
+                return;
+            }
+        } else {
+            if (command) {
+                v = selection.BinaryFind (h);
+                if (v>=0) {
+                    selection.Delete(v);
+                } else {
+                    selection.InsertElement ((BaseRef)h,-v-2,false,false);
+                }
+                BuildPane();
+                _MarkForUpdate();
+                SendSelectionChange();
+                return;
+            }
+        }
+        //if (selection.BinaryFind(h)>0) return;
+        selection.Clear();
+        selection<<h;
+        recentClick = h;
+        BuildPane();
+        _MarkForUpdate();
+    } else if ((h<headerWidth)&&(v<(GetSlotHeight()+1))) {
+        if ((!drag)&&selection.lLength) {
+            selection.Clear();
+            vselection.Clear();
+            BuildPane();
+            _MarkForUpdate();
+        }
+    }
+    SendSelectionChange();
+}
+//__________________________________________________________________
+void        _HYSequencePane::AlphabetizeSpecies (void)
+{
+    _List currentActiveNames;
+    long  k;
+
+    for (k=0; k<speciesIndex.lLength; k++) {
+        currentActiveNames << rowHeaders (speciesIndex.lData[k]);
+    }
+
+    SortLists (&currentActiveNames,&speciesIndex);
+
+    BuildPane ();
+    _MarkForUpdate();
+}
+
+//__________________________________________________________________
+void        _HYSequencePane::RevertFileOrder (void)
+{
+    speciesIndex.Sort();
+    BuildPane ();
+    _MarkForUpdate();
+}
+
+//__________________________________________________________________
+void        _HYSequencePane::CleanUpSequenceNames (void)
+{
+    bool    doSomething = false;
+
+    _List       namesl;
+    _AVLList    names (&namesl);
+
+    for    (long k=0; k<speciesIndex.lLength; k++) {
+        _String * thisString = (_String*)rowHeaders (speciesIndex.lData[k]);
+        if (!thisString->IsValidIdentifier(false)) {
+            BufferToConsole ("Changed ");
+            StringToConsole(*thisString);
+            thisString->ConvertToAnIdent(false);
+            BufferToConsole (" to ");
+            StringToConsole(*thisString);
+            NLToConsole();
+            doSomething = true;
+        }
+
+        _String * testString = new _String (*thisString);
+
+        if (!testString) {
+            checkPointer (testString);
+        }
+
+        long    tryThisSuffix = 2;
+
+        while (names.Find (testString)>=0) {
+            *testString = *thisString & '_' & tryThisSuffix;
+            tryThisSuffix++;
+        }
+
+        if (tryThisSuffix>2) {
+            BufferToConsole ("Changed ");
+            StringToConsole(*thisString);
+            BufferToConsole (" to ");
+            StringToConsole(*testString);
+            BufferToConsole (" to avoid duplicate identifiers\n");
+            doSomething  = true;
+            thisString->CopyDynamicString (testString,true);
+        } else {
+            DeleteObject (testString);
+        }
+
+        names.Insert(thisString);
+        thisString->nInstances++;
+    }
+
+    if (doSomething) {
+        SetHeaders (nil,true);
+        _MarkForUpdate();
+    }
+}
+
+//__________________________________________________________________
+void        _HYSequencePane::BatchRenameSequences (_List& oldNames,_List& newNames)
+{
+    bool touched = false;
+    for (long k=0; k<oldNames.lLength; k++) {
+        long nID = rowHeaders.Find (oldNames(k));
+        if (nID >= 0 && rowHeaders.Find (newNames(k)) < 0) {
+            rowHeaders (nID)->Duplicate (newNames(k));
+            touched = true;
+        }
+    }
+    if (touched) {
+        SetHeaders (nil,true);
+        _MarkForUpdate();
+    }
+}
+
+
+//__________________________________________________________________
+void        _HYSequencePane::EditSequenceName (long k)
+{
+    _String prompt ("Edit Sequence Name"),
+            *present = ((_String*)rowHeaders (speciesIndex.lData[k])),
+             edited = *present;
+
+    if (EnterStringDialog ( edited, prompt,(Ptr)messageRecipient)) {
+        if (!edited.Equal (present)) {
+            if (rowHeaders.Find (&edited)>=0) {
+                prompt = _String("Another sequence is already named ") & edited & ". Please choose another name.";
+                ProblemReport (prompt, (Ptr)messageRecipient);
+                return;
+            }
+            present->Duplicate (&edited);
+            SetHeaders (nil,true);
+            _MarkForUpdate();
+        }
+    }
+}
+
+//__________________________________________________________________
+void        _HYSequencePane::ProcessVSelectionChange (long h, long v, bool shift, bool command, bool drag, bool editName)
+{
+    if (selection.lLength) {
+        selection.Clear();
+        BuildPane();
+        _MarkForUpdate();
+        SendSelectionChange();
+    }
+
+    if (drag) {
+        return;
+    }
+
+    if ((h<headerWidth)&&(v>(GetSlotHeight()+1))) {
+        long k, p;
+        v = (v-(GetSlotHeight()+1))/(GetFont().size+HY_SEQUENCE_PANE_CHAR_SPACING)+startRow;
+        if (v>=endRow) {
+            return;
+        }
+
+        if (editName) {
+            EditSequenceName (v);
+            return;
+        }
+
+        if (shift) {
+            if (recentClick!=-1) {
+                if (v==recentClick) {
+                    return;
+                }
+                if ((!command)||drag) {
+                    vselection.Clear();
+                }
+                if (v>recentClick) {
+                    k=recentClick;
+                    p=v;
+                } else {
+                    p=recentClick;
+                    k=v;
+                }
+                if (!command||!vselection.lLength||drag)
+                    for (h=k; h<=p; h++) {
+                        vselection<<h;
+                    }
+                else {
+                    for (h=k; h<=p; h++) {
+                        AddSpeciesToSelection(h);
+                    }
+                }
+                StartDraw();
+                BuildHeaders();
+                EndDraw();
+                _MarkForUpdate();
+                SendSelectionChange();
+                return;
+            }
+        } else {
+            if (command) {
+                h = vselection.BinaryFind (v);
+                if (h>=0) {
+                    vselection.Delete(h);
+                } else {
+                    vselection.InsertElement ((BaseRef)v,-h-2,false,false);
+                }
+                StartDraw();
+                BuildHeaders();
+                EndDraw();
+                _MarkForUpdate();
+                SendSelectionChange(true);
+                return;
+            }
+        }
+        if (vselection.BinaryFind(v)>0) {
+            return;
+        }
+        vselection.Clear();
+        vselection<<v;
+        recentClick = v;
+        StartDraw();
+        BuildHeaders();
+        EndDraw();
+        _MarkForUpdate();
+    }
+
+    SendSelectionChange(true);
+}
+
+
+
+//__________________________________________________________________
+
+void        _HYSequencePane::SendSelectionChange (bool vert)
+{
+    if (messageRecipient) {
+        messageRecipient->ProcessEvent (generateMenuSelChangeEvent(GetID(),vert));
+    }
+}
+
+//__________________________________________________________________
+
+void        _HYSequencePane::ProcessContextualPopUp (long l, long t)
+{
+    if (messageRecipient) {
+        messageRecipient->ProcessEvent (generateContextPopUpEvent(GetID(),l,t));
+    }
+}
+
+
+
+
+//EOF
\ No newline at end of file
diff --git a/src/gui/Components/HYTable.cpp b/src/gui/Components/HYTable.cpp
new file mode 100644
index 0000000..730faac
--- /dev/null
+++ b/src/gui/Components/HYTable.cpp
@@ -0,0 +1 @@
+/*
    A table GUI object

    Sergei L. Kosakovsky Pond, January 2001.
*/

#include "HYTableComponent.h"
#include "HYUtils.h"
#include "HYPlatformWindow.h"
#include "HYTableWindow.h"
#include "HYGraphicPane.h"
#include "HYEventTypes.h"
#include "HYDialogs.h"
#include "batchlan.h"

#include "math.h"

#ifdef    __HYPHYDMALLOC__
#include "dmalloc.h"
#endif

//extern     _HYColor   _BLACK_;


_HYColor tableDefaultBk  = {235,235,235},
         tableDefaultBk2 = {200,200,200};

_String  iconExportString ("[ICON]");

//__________________________________________________________________

_HYTable::_HYTable(_HYRect rel,Ptr w,long r, long c, long h, long v, long defType):
    _HYComponent (rel,w)
{
    SetTableSize (r,c,defType,h,v);
    SetTextColor ((_HYColor) {
        0,0,0
    });
    SetBackColor (tableDefaultBk);
    SetBackColor2(tableDefaultBk2);
    _HYFont      defFont;

#ifdef __MAC__
    defFont.face = "Times";
    defFont.size = 12;
#else
#ifdef __HYPHY_GTK__
    defFont.face = _HY_SANS_FONT;
    defFont.size = 11;
#else
    defFont.face = "Verdana";
    defFont.size = 12;
#endif
#endif

    defFont.style = HY_FONT_PLAIN;
    SetFont      (defFont);
    editCellID      = -1;
    selectionType   = 0;
    undoString      = nil;
    undoIndex       = undoIndex2 = -1;
    stretchWidth    = -1;
    stretchHeight   = -1;
}

//__________________________________________________________________

_HYTable::~_HYTable(void)
{
}

//__________________________________________________________________

void    _HYTable::SetTableSize(long r, long c, long defType, long h, long v)
{
    long      i;
    for (i=h; i<=c*h; i+=h) {
        horizontalSpaces<<i;
    }

    for (i=0; i<r; i++) {
        AddRow (-1,v,defType);
    }
}

//__________________________________________________________________

void    _HYTable::AddRow (long where, long h, long defType)
{
    long        i,w;
    if (where==-1) {
        where = verticalSpaces.lLength;
    }
    verticalSpaces<<0;
    for (i=verticalSpaces.lLength-1; i>where; i--) {
        verticalSpaces.lData[i]=verticalSpaces.lData[i-1]+h;
    }
    if (where) {
        verticalSpaces.lData[where]=verticalSpaces.lData[where-1]+h;
    } else {
        verticalSpaces.lData[0] = h;
    }

    w = where*horizontalSpaces.lLength;
    if ((defType&HY_TABLE_STATIC_TEXT)||(defType&HY_TABLE_EDIT_TEXT))
        // text
    {
        _String dummy;
        for (i=0; i<horizontalSpaces.lLength; i++) {
            cellData.InsertElement (&dummy,w,true);
            cellTypes.InsertElement((BaseRef)defType,w,false,false);
        }
    } else
        // icons
    {
        _SimpleList dummy;
        for (i=0; i<horizontalSpaces.lLength; i++) {
            cellData.InsertElement (&dummy,w,true);
            cellTypes.InsertElement((BaseRef)defType,w,false,false);
        }
    }

    stretchHeight = -1;
}

//__________________________________________________________________

void    _HYTable::RequestSpace (long r, long c)
{
    verticalSpaces.RequestSpace (r);
    cellData.RequestSpace (r*c);
    cellTypes.RequestSpace (r*c);
}

//__________________________________________________________________

void    _HYTable::DeleteRow (long where)
{
    long        i,h;
    if ((where<0)||(where>=verticalSpaces.lLength)) {
        return;
    }
    h = GetRowSpacing (where);

    for (i=where; i<verticalSpaces.lLength-1; i++) {
        verticalSpaces.lData[i]=verticalSpaces.lData[i+1]-h;
    }

    h = where*horizontalSpaces.lLength;
    for (i=0; i<horizontalSpaces.lLength; i++) {
        cellData.Delete (h);
        cellTypes.Delete(h);
    }
    verticalSpaces.Delete (verticalSpaces.lLength-1);

    stretchHeight = -1;
}

//__________________________________________________________________

void    _HYTable::AddColumn (long where, long h, long defType)
{
    long        i,w;
    if (where==-1) {
        where = horizontalSpaces.lLength;
    }
    horizontalSpaces<<0;
    for (i=horizontalSpaces.lLength-1; i>where; i--) {
        horizontalSpaces.lData[i]=horizontalSpaces.lData[i-1]+h;
    }
    if (where) {
        horizontalSpaces.lData[where]=horizontalSpaces.lData[where-1]+h;
    } else {
        horizontalSpaces.lData[0] = h;
    }
    w = where*horizontalSpaces.lLength;
    if ((defType&HY_TABLE_STATIC_TEXT)||(defType&HY_TABLE_EDIT_TEXT))
        // text
    {
        _String dummy;
        for (i=0; (i<horizontalSpaces.lLength)&&(w<cellData.lLength); i++, w+=verticalSpaces.lLength) {
            cellData.InsertElement (&dummy,w,true);
            cellTypes.InsertElement((BaseRef)defType,w,false,false);
        }
    } else
        // icons
    {
        _SimpleList dummy;
        for (i=0; (i<horizontalSpaces.lLength)&&(w<cellData.lLength); i++, w+=verticalSpaces.lLength) {
            cellData.InsertElement (&dummy,w,true);
            cellTypes.InsertElement((BaseRef)defType,w,false,false);
        }
    }

    stretchWidth = -1;
}

//__________________________________________________________________

void    _HYTable::DeleteColumn (long where)
{
    long        i,h;
    if ((where<0)||(where>=horizontalSpaces.lLength)) {
        return;
    }
    h = GetColumnSpacing (where);
    for (i=where; i<horizontalSpaces.lLength; i++) {
        horizontalSpaces.lData[i]=horizontalSpaces.lData[i+1]-h;
    }
    for (i=cellData.lLength-verticalSpaces.lLength-1+where; i>=0; i-=verticalSpaces.lLength) {
        cellData.Delete (i);
        cellTypes.Delete(i);
    }
    stretchWidth = -1;
}

//__________________________________________________________________

long    _HYTable::GetRowSpacing (long index)
{
    if (index>0) {
        return verticalSpaces.lData[index]-verticalSpaces.lData[index-1];
    }
    return verticalSpaces.lData[0];
}

//__________________________________________________________________

long    _HYTable::GetColumnSpacing (long index)
{
    if (index>0) {
        return horizontalSpaces.lData[index]-horizontalSpaces.lData[index-1];
    }
    return horizontalSpaces.lData[0];
}

//__________________________________________________________________

void    _HYTable::ClearTable (bool all)
{
    cellData.Clear();
    cellTypes.Clear();
    if (all) {
        horizontalSpaces.Clear();
    }
    verticalSpaces.Clear();
    hOrigin = vOrigin = 0;
}

//__________________________________________________________________

void    _HYTable::SetTableFromMx (_Matrix* data, long rowWidth, long colHeight, long cellType)
{
    ClearTable (true);
    long        rc = data->GetHDim(),
                cc = data->GetVDim(),
                spacer = rowWidth;

    verticalSpaces.RequestSpace (rc);

    for (long k=0; k<rc; k++) {
        verticalSpaces.lData[k] = spacer;
        spacer+=rowWidth;
    }
    verticalSpaces.lLength = rc;

    spacer = colHeight;
    horizontalSpaces.RequestSpace (cc);

    for (long k=0; k<cc; k++) {
        horizontalSpaces.lData[k] = spacer;
        spacer+=colHeight;
    }
    horizontalSpaces.lLength = cc;

    cellTypes.RequestSpace (cc*rc);
    for (long k=0; k<rc*cc; k++) {
        cellTypes.lData[k] = cellType;
    }

    cellTypes.lLength = rc*cc;

    cellData.RequestSpace (cc*rc);

    BaseRef * brf = (BaseRef*)(cellData.lData);

    for (long h=0; h<rc*cc; h++) {
        _String* cellData = new _String ((*data)(h/cc,h%cc));
        if (!(brf[h] = cellData)) {
            checkPointer (cellData);
        }
    }


    cellData.lLength = rc*cc;
}

//__________________________________________________________________

void    _HYTable::SetBackColor (_HYColor nc)
{
    backColor = nc;
    _SetBackColor (nc);
}

//__________________________________________________________________

void    _HYTable::SetBackColor2 (_HYColor nc)
{
    backColor2 = nc;
    _SetBackColor2 (nc);
}

//__________________________________________________________________

void    _HYTable::SetTextColor (_HYColor nc)
{
    textColor = nc;
}

//__________________________________________________________________

void    _HYTable::SetFont (_HYFont& nf)
{
    bool  t = !textFont.face.Equal(&nf.face);
    if ( textFont.size!=nf.size || textFont.style!=nf.style ||t) {
        textFont.size = nf.size;
        textFont.style = nf.style;
        if (t) {
            textFont.face = nf.face;
            _SetFont ();
        }
    }
}

//__________________________________________________________________

int     _HYTable::GetMaxW(void)
{
    long res = horizontalSpaces.lData[horizontalSpaces.lLength-1]+((settings.width&HY_COMPONENT_V_SCROLL)?HY_SCROLLER_WIDTH:0);
    if (res > 0x7ffff) {
        return 0x7ffff;
    }
    return res;
}

//__________________________________________________________________

int     _HYTable::GetMaxH(void)
{
    long res = verticalSpaces.lData[verticalSpaces.lLength-1]+((settings.width&HY_COMPONENT_H_SCROLL)?HY_SCROLLER_WIDTH:0);
    if (res > 0x7ffff) {
        return 0x7ffff;
    }
    return res;
}

//__________________________________________________________________

int     _HYTable::GetMaxLW(void)
{
    if (selectionType&HY_TABLE_DONT_GROW_HORIZ) {
        return _HYComponent::GetMaxW();
    } else if (selectionType&HY_TABLE_HORZ_STRETCH) {
        return 0x7ffff;
    } else {
        return GetMaxW();
    }
}

//__________________________________________________________________

int     _HYTable::GetMaxLH(void)
{
    if (selectionType&HY_TABLE_DONT_GROW_VERT) {
        return _HYComponent::GetMaxH();
    } else if (selectionType&HY_TABLE_VERT_STRETCH) {
        return 0x7ffff;
    } else {
        return GetMaxH();
    }
}

//__________________________________________________________________

bool        _HYTable::CheckForHSizeLocation (long h)
{
    h += hOrigin;
    for (long k = 0; k<horizontalSpaces.lLength; k++)
        if ((h>=horizontalSpaces.lData[k]-2)&&(h<=horizontalSpaces.lData[k]+2)) {
            return true;
        }
    return false;
}

//__________________________________________________________________

void        _HYTable::DragRow(long row, long after)
{
    if ((row>=0)&&(row<verticalSpaces.lLength)&&(after<verticalSpaces.lLength)&&(row!=after)) {
        cellTypes.Displace (row*horizontalSpaces.lLength,(row+1)*horizontalSpaces.lLength-1,
                            (after-row)*horizontalSpaces.lLength);
        cellData.Displace (row*horizontalSpaces.lLength,(row+1)*horizontalSpaces.lLength-1,
                           (after-row)*horizontalSpaces.lLength);
        _MarkForUpdate();
    }
}

//__________________________________________________________________

long        _HYTable::FindString (_String* s, long startat)
{
    for (long k=(startat>=0?startat:0); k<cellData.lLength; k++)
        if ((cellTypes.lData[k]&(HY_TABLE_STATIC_TEXT+HY_TABLE_EDIT_TEXT))&&
                (s->Equal((_String*)cellData(k))))

        {
            return k;
        }
    return -1;
}

//__________________________________________________________________

long        _HYTable::FindClickedTableCell (long hc,long vc,long& h, long& v)
{
    hc+=hOrigin;
    vc+=vOrigin;

    for (h = 0; h<horizontalSpaces.lLength; h++)
        if (hc<horizontalSpaces.lData[h]-2) {
            break;
        }
    if (h<horizontalSpaces.lLength) {
        for (v = 0; v<verticalSpaces.lLength; v++)
            if (vc<verticalSpaces.lData[v]-2) {
                break;
            }

        if (v<verticalSpaces.lLength) {
            long index = v*horizontalSpaces.lLength+h;
            if (cellTypes.lData[index]&HY_TABLE_PULLDOWN) {
                if ((hc>horizontalSpaces.lData[h]-15)&&(abs(2*(verticalSpaces.lData[v]-vc)-GetRowSpacing(v))<tPDMh)) {
                    return -2;
                }
            }
            return index;
        }
    }
    return -1;
}

//__________________________________________________________________

/*void      _HYTable::PlotAlignedIcon (_HYRect& store, long iconW, long iconH)
{

}*/

//__________________________________________________________________

void        _HYTable::EditBoxHandler (long index, _HYRect& r)
{
    if (_HasTextBox()) {
        _String editRes = _RetrieveTextValue();
        _KillTextBox();
        if (!editRes.Equal ((_String*)GetCellData(editCellID%horizontalSpaces.lLength,
                            editCellID/horizontalSpaces.lLength))) {
            SetCellData (&editRes,editCellID/horizontalSpaces.lLength,
                         editCellID%horizontalSpaces.lLength,
                         cellTypes.lData[editCellID],
                         true);
            if (messageRecipient) {
                messageRecipient->ProcessEvent (generateTableEditCellEvent(GetID(),editCellID));
            }
        }
        _SimpleList     dummy;
        dummy           <<  editCellID;
        _MarkCellsForUpdate (dummy);
        editCellID      = -1;
    }

    if (index>=0) {
        editCellID= index;
        long    v = index/horizontalSpaces.lLength;
        index     = index%horizontalSpaces.lLength;

        _HYRect textRect = r;

        if (index) {
            textRect.left += horizontalSpaces.lData[index-1] - hOrigin;
        } else {
            textRect.left -= hOrigin;
        }
        if (v) {
            textRect.top  += verticalSpaces.lData[v-1] - vOrigin;
        } else {
            textRect.top  -= vOrigin;
        }

        textRect.right     = r.left+horizontalSpaces.lData[index] - hOrigin;
        textRect.bottom    = r.top+verticalSpaces.lData[v] - vOrigin;

        if (settings.width&HY_COMPONENT_V_SCROLL) {
            if (textRect.right > r.right - HY_SCROLLER_WIDTH) {
                textRect.right = r.right - HY_SCROLLER_WIDTH;
            }
        } else if (textRect.right >= r.right) {
            textRect.right = r.right - 1;
        }

        if (settings.width&HY_COMPONENT_H_SCROLL) {
            if (textRect.bottom > r.bottom - HY_SCROLLER_WIDTH) {
                textRect.bottom = r.bottom - HY_SCROLLER_WIDTH;
            }
        } else if (textRect.bottom >= r.bottom) {
            textRect.bottom = r.bottom - 1;
        }


        textRect.left   +=2;
        //textRect.top  +=2;
        textRect.right  -=2;
        //textRect.bottom -=3;

        if ((textRect.right>textRect.left+textFont.size)&&(textRect.bottom>textRect.top+textFont.size)) {
            if (messageRecipient) {
                messageRecipient->ProcessEvent(generateKeyboardFocusEvent(GetID()));
            }
            _CreateTextBox (textRect, *(_String*)GetCellData(index,v));
            _SimpleList     dummy;
            dummy           <<  v*horizontalSpaces.lLength+index;
            _MarkCellsForUpdate (dummy);
        }
    } else {
        if ((messageRecipient)&&((selectionType&HY_TABLE_IS_FOCUSED)==0)) {
            messageRecipient->ProcessEvent(generateKeyboardFocusEvent(-1));
        }
    }
}

//__________________________________________________________________

void        _HYTable::ClearSelection (bool standAlone)
{
    _SimpleList modCells;
    for (long c = 0; c<cellTypes.lLength; c++) {
        if (cellTypes.lData[c]&HY_TABLE_SELECTED) {
            cellTypes.lData[c] -= HY_TABLE_SELECTED;
            modCells << c;
        }
    }
    if (modCells.lLength) {
        _MarkCellsForUpdate(modCells);
        if (_HasTextBox()) {
            _HYRect        dummy;
            EditBoxHandler (-1,dummy);
        }
        if (standAlone&&messageRecipient) {
            messageRecipient->ProcessEvent (generateTableChangeSelEvent(GetID()));
        }
    }
}

//__________________________________________________________________

void        _HYTable::SetRowSelection (const _SimpleList& rows)
{
    ClearSelection (false);
    _SimpleList modCells;
    modCells.RequestSpace (rows.lLength * horizontalSpaces.lLength);
    for (long t=0; t<rows.lLength; t++) {
        long rowN = rows.lData[t];
        if ((rowN>=0)&&(rowN<verticalSpaces.lLength)) {
            for (long k=rowN*horizontalSpaces.lLength; k<(rowN+1)*horizontalSpaces.lLength; k++) {
                if (!(cellTypes.lData[k]&HY_TABLE_CANTSELECT)) {
                    cellTypes.lData[k]|=HY_TABLE_SELECTED;
                    modCells << k;
                }
            }
        }
    }
    if (modCells.lLength) {
        for (long t=0; t<rows.lLength; t++) {
            _MarkRowForUpdate(rows.lData[t]);
        }

        if (_HasTextBox()) {
            _HYRect        dummy;
            EditBoxHandler (-1,dummy);
        }
        if (messageRecipient) {
            messageRecipient->ProcessEvent (generateTableChangeSelEvent(GetID()));
        }
    }
}

//__________________________________________________________________

void        _HYTable::SetColumnSelection (const _SimpleList& columns)
{
    ClearSelection (false);
    _SimpleList modCells;
    modCells.RequestSpace (columns.lLength * verticalSpaces.lLength);
    for (long t=0; t<columns.lLength; t++) {
        long rowN = columns.lData[t];
        if ((rowN>=0)&&(rowN<verticalSpaces.lLength)) {
            for (long k=rowN; k<cellTypes.lLength; k+=horizontalSpaces.lLength) {
                if (!(cellTypes.lData[k]&HY_TABLE_CANTSELECT)) {
                    cellTypes.lData[k]|=HY_TABLE_SELECTED;
                    modCells << k;
                }
            }
        }
    }
    if (modCells.lLength) {
        for (long t=0; t<columns.lLength; t++) {
            _MarkColumnForUpdate(columns.lData[t]);
        }

        if (_HasTextBox()) {
            _HYRect        dummy;
            EditBoxHandler (-1,dummy);
        }
        if (messageRecipient) {
            messageRecipient->ProcessEvent (generateTableChangeSelEvent(GetID()));
        }
    }
}


//__________________________________________________________________

void        _HYTable::ModifySelection (long h,long v, bool shift, bool control, bool message)
{
    long t = v*horizontalSpaces.lLength+h,t2;

    if (selectionType & HY_TABLE_SINGLE_SELECTION) {
        shift   = false;
        control = false;
    }

    if (cellTypes.lData[t]&HY_TABLE_CANTSELECT) {
        if (!shift) {
            ClearSelection();
            return;
        }
    }

    bool sel = cellTypes.lData[t]&HY_TABLE_SELECTED;

    _SimpleList  modCells;

    if (control) {
        _SimpleList  selection;
        GetSelection (selection);

        if (selection.lLength != 1) {
            return;
        }

        long    selRow = selection.lData[0]/horizontalSpaces.lLength,
                selCol = selection.lData[0]%horizontalSpaces.lLength,
                minRow,
                minCol,
                maxRow,
                maxCol;

        if (v<selRow) {
            minRow = v;
            maxRow = selRow;
        } else {
            maxRow = v;
            minRow = selRow;
        }

        if (h<selCol) {
            minCol = h;
            maxCol = selCol;
        } else {
            maxCol = h;
            minCol = selCol;
        }

        modCells.RequestSpace ((maxRow-minRow+1)*(maxCol-minCol+1));
        for (long r = minRow; r<=maxRow; r++)
            for (long c = r*horizontalSpaces.lLength+minCol; c<=r*horizontalSpaces.lLength+maxCol; c++) {
                if (!(cellTypes.lData[c]&HY_TABLE_CANTSELECT)) {
                    cellTypes.lData[c]|=HY_TABLE_SELECTED;
                }
                modCells<<c;
            }
    } else {
        if (shift) {
            if (!(cellTypes.lData[t]&HY_TABLE_CANTSELECT)) {
                if (sel) {
                    cellTypes.lData[t]-=HY_TABLE_SELECTED;
                } else {
                    cellTypes.lData[t]+=HY_TABLE_SELECTED;
                }
                modCells<<t;
            }
        } else {
            if (!sel) {
                for (long k=0; k<horizontalSpaces.lLength; k++)
                    for (long l=0; l<verticalSpaces.lLength; l++) {
                        t2 = l*horizontalSpaces.lLength+k;
                        if (t==t2) {
                            continue;
                        }
                        if (cellTypes.lData[t2]&HY_TABLE_CANTSELECT) {
                            continue;
                        }

                        if (cellTypes.lData[t2]&HY_TABLE_SELECTED) {
                            cellTypes.lData[t2]-=HY_TABLE_SELECTED;
                            modCells<<t2;
                        }
                    }
                if (!(cellTypes.lData[t]&HY_TABLE_CANTSELECT)) {
                    cellTypes.lData[t]+=HY_TABLE_SELECTED;
                }

                modCells<<t;
            } else {
                return;
            }
        }
    }

    if (selectionType&HY_TABLE_SEL_ROWS) {
        sel = cellTypes.lData[t]&HY_TABLE_SELECTED;
        if (sel)
            for (long k=v*horizontalSpaces.lLength; k<(v+1)*horizontalSpaces.lLength; k++) {
                if ((k==t)||(cellTypes.lData[k]&HY_TABLE_CANTSELECT)) {
                    continue;
                }
                cellTypes.lData[k]|=HY_TABLE_SELECTED;
                modCells<<k;
            }
        else
            for (long k=v*horizontalSpaces.lLength; k<(v+1)*horizontalSpaces.lLength; k++) {
                if ((k==t)||(cellTypes.lData[k]&HY_TABLE_CANTSELECT)) {
                    continue;
                }
                cellTypes.lData[k]&=HY_TABLE_DESELECT;
                modCells<<k;
            }
    } else if (selectionType&HY_TABLE_SEL_COLS) {
        sel = cellTypes.lData[t]&HY_TABLE_SELECTED;
        if (sel)
            for (long k=h; k<verticalSpaces.lLength*horizontalSpaces.lLength; k+=horizontalSpaces.lLength) {
                if ((k==t)||(cellTypes.lData[k]&HY_TABLE_CANTSELECT)) {
                    continue;
                }
                cellTypes.lData[k]|=HY_TABLE_SELECTED;
                modCells<<k;
            }
        else
            for (long k=h; k<verticalSpaces.lLength*horizontalSpaces.lLength; k+=horizontalSpaces.lLength) {
                if ((k==t)||(cellTypes.lData[k]&HY_TABLE_CANTSELECT)) {
                    continue;
                }
                cellTypes.lData[k]&=HY_TABLE_DESELECT;
                modCells<<k;
            }
    }

    if (modCells.lLength) {
        _MarkCellsForUpdate(modCells);
        if (_HasTextBox()) {
            _HYRect        dummy;
            EditBoxHandler (-1,dummy);
        }
        if (message&&messageRecipient) {
            messageRecipient->ProcessEvent (generateTableChangeSelEvent(GetID()));
        }
    }
}

//__________________________________________________________________

void        _HYTable::ExpungeSelection (void)
{
    _SimpleList  updateCells;
    for (long k=0; k<horizontalSpaces.lLength*verticalSpaces.lLength; k++) {
        if (cellTypes.lData[k]&HY_TABLE_SELECTED) {
            cellTypes.lData[k]&=HY_TABLE_DESELECT;
            updateCells<<k;
        }
    }
    _MarkCellsForUpdate (updateCells);
}

//__________________________________________________________________

void        _HYTable::SetColumnSpacing (long index, long h, bool update)
{
    if (h) {
        for (long k=index; k<horizontalSpaces.lLength; k++) {
            horizontalSpaces.lData[k]+=h;
        }
        if (update) {
            SetVisibleSize (rel);
            _MarkForUpdate();
        }
    }
    if (stretchWidth >= 0) {
        stretchWidth += h;
        if (stretchWidth < 0) {
            stretchWidth = -1;
        }
    }
}

//__________________________________________________________________

void        _HYTable::SetRowSpacing (long index, long v, bool update)
{
    if (v) {
        for (long k=index; k<verticalSpaces.lLength; k++) {
            verticalSpaces.lData[k]+=v;
        }
        if (update) {
            SetVisibleSize (rel);
            _MarkForUpdate();
        }

    }
    if (stretchHeight >= 0) {
        stretchHeight += v;
        if (stretchHeight < 0) {
            stretchHeight = -1;
        }
    }
}


//__________________________________________________________________

void        _HYTable::AutoFitColumn (long index, bool, bool increaseOnly)
{
    long maxWidth  = 0,
         cellWidth = 5;

    bool iconsOnly = true;

    for (long k=index; k<verticalSpaces.lLength*horizontalSpaces.lLength; k+=horizontalSpaces.lLength) {
        if (cellTypes.lData[k]&HY_TABLE_ICON) {
            cellWidth = ((_SimpleList*)cellData[k])->lData[1]+2;
        } else {
            _String*  cellValue = (_String*) cellData[k];
            if (cellTypes.lData[k]&HY_TABLE_BOLD) {
                textFont.style |= HY_FONT_BOLD;
            }
            if (cellTypes.lData[k]&HY_TABLE_ITALIC) {
                textFont.style |= HY_FONT_ITALIC;
            }
            cellWidth = GetVisibleStringWidth (*cellValue, textFont);
            if (cellTypes.lData[k]&HY_TABLE_PULLDOWN) {
                cellWidth += 5+tPDMw;
            }
            textFont.style = HY_FONT_PLAIN;
            iconsOnly = false;
        }
        if (cellWidth > maxWidth) {
            maxWidth = cellWidth;
        }
    }

    if (iconsOnly) {
        maxWidth+=2;
    } else {
        maxWidth+=textFont.size;
    }

    if (increaseOnly && (GetColumnSpacing(index)>maxWidth)) {
        return;
    }

    SetColumnSpacing (index,maxWidth-GetColumnSpacing(index),false);
}

//__________________________________________________________________

void        _HYTable::EnforceWidth (long width, long index, bool l)
{
    if ((index>=horizontalSpaces.lLength)||l) {
        index = horizontalSpaces.lLength-1;
    }

    if (horizontalSpaces.lData[index]<width) {
        long step = (width-horizontalSpaces.lData[index])/(index+1);
        if (!l)
            for (long k=0; k<index; k++) {
                horizontalSpaces.lData[k] += step*(k+1);
            }
        horizontalSpaces.lData[index] = width;
    }
}

//__________________________________________________________________

void        _HYTable::EnforceHeight (long height, long index, bool l)
{
    if ((index>=verticalSpaces.lLength)||l) {
        index = verticalSpaces.lLength-1;
    }

    if (verticalSpaces.lData[index]<height) {
        long step = (height-verticalSpaces.lData[index])/(index+1);
        if (!l)
            for (long k=0; k<index; k++) {
                verticalSpaces.lData[k] += step*(k+1);
            }
        verticalSpaces.lData[index] = height;
    }
}

//__________________________________________________________________

void        _HYTable::AutoFitWidth (void)
{
    for (long k=0; k<horizontalSpaces.lLength-1; k++) {
        AutoFitColumn (k,false);
    }
    AutoFitColumn (horizontalSpaces.lLength-1,true);
}


//__________________________________________________________________

void        _HYTable::AutoFitWidth (_HYTable& table2, long cshift)
{
    long k,
         w1,
         w2;

    AutoFitWidth();
    table2.AutoFitWidth();

    _SimpleList newWidths,
                oldWidths,
                oldWidths2;

    if (horizontalSpaces.lLength==table2.horizontalSpaces.lLength)
        for (k=0; k<horizontalSpaces.lLength; k++) {
            w1 = GetColumnSpacing (k);
            w2 = table2.GetColumnSpacing (k);
            if (k==horizontalSpaces.lLength-1)
                if ((settings.width&HY_COMPONENT_V_SCROLL)&&!(table2.settings.width&HY_COMPONENT_V_SCROLL)) {
                    w1 += HY_SCROLLER_WIDTH;
                } else if (!(settings.width&HY_COMPONENT_V_SCROLL)&&(table2.settings.width&HY_COMPONENT_V_SCROLL)) {
                    w2 += HY_SCROLLER_WIDTH;
                }

            if (w1>w2) {
                newWidths << w1;
            } else {
                newWidths << w2;
            }
            oldWidths << w1;
            oldWidths2 << w2;
        }
    else
        for (k=0; k<horizontalSpaces.lLength; k++) {
            w1 = GetColumnSpacing (k);
            w2 = table2.GetColumnSpacing (k+cshift);

            if (w1>w2) {
                newWidths << w1;
            } else {
                newWidths << w2;
            }
            oldWidths << w1;
            oldWidths2 << w2;
        }

    long shift1 = 0,
         shift2 = 0;

    for (k=0; k<newWidths.lLength; k++) {
        shift1 += newWidths.lData[k] - oldWidths.lData[k];
        shift2 += newWidths.lData[k] - oldWidths2.lData[k];
        horizontalSpaces.lData[k] += shift1;
        table2.horizontalSpaces.lData[k+cshift] += shift2;
    }

    for (; k < table2.horizontalSpaces.lLength; k++) {
        table2.horizontalSpaces.lData[k] += shift2;
    }


}

//__________________________________________________________________
bool    _HYTable::ProcessEvent(_HYEvent* e)
{
    if (e->EventClass() == _hyScrollingEvent) {
        long h,v,k,w;
        _String firstArg = e->EventCode().Cut (0,(v=e->EventCode().Find(','))-1);
        h = firstArg.toNum();
        firstArg = e->EventCode().Cut (v+1,-1);
        v = firstArg.toNum();
        if (h||v) {
            if (h) {
                w = horizontalSpaces.lData[horizontalSpaces.lLength-1]-hSize;
                if (settings.width&HY_COMPONENT_V_SCROLL) {
                    w += HY_SCROLLER_WIDTH;
                }
                k = (double)h/MAX_CONTROL_VALUE * w;
                if (!k) {
                    k = h>0?5:-5;
                }
                _SetHScrollerPos (_GetHScrollerPos()+(double)k*MAX_CONTROL_VALUE/w-h);
                hOrigin += k;
                if (hOrigin<0) {
                    hOrigin -= k;
                    k=-hOrigin;
                    hOrigin = 0;
                    _SetHScrollerPos (0);
                } else if (hOrigin+hSize > w+hSize) {
                    hOrigin -= k;
                    k = w-hOrigin;
                    hOrigin = w;
                    _SetHScrollerPos (MAX_CONTROL_VALUE);
                }
                _HScrollTable(k);

                if (messageRecipient) {
                    messageRecipient->ProcessEvent (generateScrollEvent(h,0,GetID()));
                }
            } else {
                w = verticalSpaces.lData[verticalSpaces.lLength-1]-vSize;
                if (settings.width&HY_COMPONENT_H_SCROLL) {
                    w += HY_SCROLLER_WIDTH;
                }
                k = ((double)v/MAX_CONTROL_VALUE) * w;
                if (!k) {
                    k = v>0?10:-10;
                }

                _SetVScrollerPos (_GetVScrollerPos()+(double)k*MAX_CONTROL_VALUE/w-v);
                vOrigin += k;
                if (vOrigin<0) {
                    vOrigin -= k;
                    k = - vOrigin;
                    vOrigin = 0;
                    _SetVScrollerPos (0);
                } else if (vOrigin+vSize > w+vSize) {
                    vOrigin -= k;
                    k = w-vOrigin;
                    vOrigin = w;
                    _SetVScrollerPos (MAX_CONTROL_VALUE);
                }
                _VScrollTable(k);

                if (messageRecipient) {
                    messageRecipient->ProcessEvent (generateScrollEvent(0,v,GetID()));
                }
            }
        }
        DeleteObject(e);
        return true;
    }
    DeleteObject (e);
    return false;
}
//__________________________________________________________________

BaseRef _HYTable::GetCellData (long h, long v)
{
    return cellData(v*horizontalSpaces.lLength+h);
}

//__________________________________________________________________

void    _HYTable::SetCellData (BaseRef data, long h, long v, long type, bool copy)
{
    long idx = h*horizontalSpaces.lLength+v;
    cellTypes.lData[idx] = type;
    cellData.Replace (idx,data,copy);
}

//__________________________________________________________________

void    _HYTable::SetRowOrder (_SimpleList& order)
{
    if ((order.lLength == verticalSpaces.lLength)&&(order.lLength)) {
        _List           newData(cellData.lLength);
        _SimpleList     newTypes(cellTypes.lLength),
                        newSpaces;

        long            k,m,p;
        for (k=0; k<verticalSpaces.lLength; k++)
            for (m=0; m<horizontalSpaces.lLength; m++) {
                newTypes<<-1;
            }

        for (k=0; k<verticalSpaces.lLength; k++) {
            p = order.lData[k];
            for (m=0; m<horizontalSpaces.lLength; m++) {
                newTypes.lData[k*horizontalSpaces.lLength+m] = cellTypes.lData[p*horizontalSpaces.lLength+m];
                newData << GetCellData(m,p);
            }
        }
        if (newTypes.Find(-1)>=0) {
            return;
        }
        newSpaces << GetRowSpacing (order.lData[0]);
        for (k=1; k<verticalSpaces.lLength; k++) {
            newSpaces << GetRowSpacing (order.lData[k])+newSpaces.lData[k-1];
        }
        cellData.Clear();
        cellTypes.Clear();
        verticalSpaces.Clear();
        cellData.Duplicate(&newData);
        cellTypes.Duplicate(&newTypes);
        verticalSpaces.Duplicate(&newSpaces);

        _MarkForUpdate();
    }

}

//__________________________________________________________________

bool    _HYTable::ScrollToRow (long where)
{
    if ((where>=0)&&(where<verticalSpaces.lLength)) {
        long hs, hf, vs, vf;
        GetDisplayRange (&rel,vs,vf,hs,hf);
        if ((where<hs)||(where>=hf)) {
            if (where<hs) {
                if (where==0) {
                    vs = 0;
                } else {
                    vs = verticalSpaces.lData[where-1];
                }

                vs -= vOrigin;
            } else {
                vs = verticalSpaces.lData[where]-(rel.bottom-rel.top)/2-vOrigin;
            }

            vf = verticalSpaces.lData[verticalSpaces.lLength-1]-vSize;
            if (settings.width&HY_COMPONENT_H_SCROLL) {
                vf += HY_SCROLLER_WIDTH;
            }
            vs =(_Parameter) MAX_CONTROL_VALUE * (_Parameter)vs/(_Parameter)vf;
            _SetVScrollerPos (_GetVScrollerPos()+vs);
            ProcessEvent (generateScrollEvent(0,vs));
            return true;
        }
    }
    return false;
}

//__________________________________________________________________

bool    _HYTable::ScrollToColumn (long where)
{
    if ((where>=0)&&(where<horizontalSpaces.lLength)) {
        long hs, hf, vs, vf;
        GetDisplayRange (&rel,vs,vf,hs,hf);
        if ((where<vs)||(where>=vf)) {
            if (where<vs) {
                if (where==0) {
                    hs = 0;
                } else {
                    hs = verticalSpaces.lData[where-1];
                }

                hs -= hOrigin;
            } else {
                hs = horizontalSpaces.lData[where]-(rel.right-rel.left)/2-hOrigin;
            }

            hf = horizontalSpaces.lData[horizontalSpaces.lLength-1]-hSize;
            if (settings.width&HY_COMPONENT_V_SCROLL) {
                hf += HY_SCROLLER_WIDTH;
            }
            hs = (_Parameter)MAX_CONTROL_VALUE * (_Parameter)hs/(_Parameter)hf;
            _SetHScrollerPos (_GetHScrollerPos()+hs);
            ProcessEvent (generateScrollEvent(hs,0));
            return true;
        }
    }
    return false;
}

//__________________________________________________________________

void    _HYTable::SetVisibleSize (_HYRect r)
{
    EditBoxHandler  (-1,r);

    if (settings.width&HY_COMPONENT_V_SCROLL) {
        horizontalSpaces.lData[horizontalSpaces.lLength-1]+=HY_SCROLLER_WIDTH-1;
    }
    if (settings.width&HY_COMPONENT_H_SCROLL) {
        verticalSpaces.lData[verticalSpaces.lLength-1]+=HY_SCROLLER_WIDTH-1;
    }
    _HYComponent::SetVisibleSize(r);
    if (settings.width&HY_COMPONENT_V_SCROLL) {
        horizontalSpaces.lData[horizontalSpaces.lLength-1]-=HY_SCROLLER_WIDTH-1;
    }
    if (settings.width&HY_COMPONENT_H_SCROLL) {
        verticalSpaces.lData[verticalSpaces.lLength-1]-=HY_SCROLLER_WIDTH-1;
    }



    if (selectionType&HY_TABLE_HORZ_STRETCH) {
        if (stretchWidth>0) {
            SetColumnSpacing ( horizontalSpaces.lLength-1,-stretchWidth,false);
        }

        stretchWidth = horizontalSpaces.lData[horizontalSpaces.lLength-1];
        EnforceWidth (r.right-r.left+1-(settings.width&HY_COMPONENT_V_SCROLL?HY_SCROLLER_WIDTH:0), 0x7fffffff,true);
        stretchWidth = horizontalSpaces.lData[horizontalSpaces.lLength-1]-stretchWidth;
        //EnforceWidth (r.right-r.left+1, 0x7fffffff,true);
    }

    if (selectionType&HY_TABLE_VERT_STRETCH) {
        if (stretchHeight>0) {
            SetRowSpacing ( verticalSpaces.lLength-1,-stretchHeight,false);
        }

        stretchHeight = verticalSpaces.lData[verticalSpaces.lLength-1];
        EnforceHeight (r.bottom-r.top+1-(settings.width&HY_COMPONENT_H_SCROLL?HY_SCROLLER_WIDTH:0), 0x7fffffff,true);
        stretchHeight = verticalSpaces.lData[verticalSpaces.lLength-1]-stretchHeight;

    }

    long        t = GetMaxW();

    if (hOrigin+r.right-r.left>t) {
        hOrigin = t-r.right+r.left;
        _SetHScrollerPos (MAX_CONTROL_VALUE);
    }

    if (settings.width&HY_COMPONENT_H_SCROLL) {
        _Parameter c2 = hOrigin/(_Parameter)(t-r.right+r.left); // invisible section
        _SetHScrollerPos (c2*MAX_CONTROL_VALUE);
    }

    t = GetMaxH();
    if (vOrigin+r.bottom-r.top>t) {
        vOrigin = t-r.bottom+r.top;
        _SetVScrollerPos (MAX_CONTROL_VALUE);
    }

    if (settings.width&HY_COMPONENT_V_SCROLL) {
        _Parameter c2 = vOrigin/(_Parameter)(t-r.bottom+r.top); // invisible section
        _SetVScrollerPos (c2*MAX_CONTROL_VALUE);
    }
}

//__________________________________________________________________

void    _HYTable::GetDisplayRange (_HYRect* relRect, long& hs, long& hf, long& vs, long& vf )
{
    long    t = hOrigin;
    for (hs=0; hs<horizontalSpaces.lLength; hs++)
        if (horizontalSpaces.lData[hs]>t) {
            break;
        }
    if (hs==horizontalSpaces.lLength) {
        hs--;
    }
    t = relRect->right-relRect->left+hOrigin;
    if (settings.width&HY_COMPONENT_V_SCROLL) {
        t-=HY_SCROLLER_WIDTH;
    }

    for (hf=hs; hf<horizontalSpaces.lLength; hf++)
        if (horizontalSpaces.lData[hf]>t) {
            break;
        }
    if (hf==horizontalSpaces.lLength) {
        hf--;
    }

    t = vOrigin;
    for (vs=0; vs<verticalSpaces.lLength; vs++)
        if (verticalSpaces.lData[vs]>t) {
            break;
        }
    if (vs==verticalSpaces.lLength) {
        vs--;
    }
    t = relRect->bottom-relRect->top+vOrigin;
    if (settings.width&HY_COMPONENT_H_SCROLL) {
        t-=HY_SCROLLER_WIDTH;
    }

    for (vf=vs; vf<verticalSpaces.lLength; vf++)
        if (verticalSpaces.lData[vf]>t) {
            break;
        }
    if (vf==verticalSpaces.lLength) {
        vf--;
    }
}

//__________________________________________________________________

void    _HYTable::GetSelection (_SimpleList& rec)
{
    long selectedCount = 0;
    for (long k=0; k<cellTypes.lLength; k++)
        if (cellTypes.lData[k]&HY_TABLE_SELECTED) {
            selectedCount ++;
        }

    rec.RequestSpace (rec.lLength+selectedCount);
    for (long k=0; k<cellTypes.lLength; k++)
        if (cellTypes.lData[k]&HY_TABLE_SELECTED) {
            rec << k;
        }

}

//__________________________________________________________________

void    _HYTable::SetSelection (_SimpleList& rec, bool update)
{
    for (long k=0; k<rec.lLength; k++) {
        long idx = rec.lData[k];
        if (idx<cellTypes.lLength)
            if (!(cellTypes.lData[idx]&HY_TABLE_CANTSELECT)) {
                cellTypes.lData[idx] |= HY_TABLE_SELECTED;
            }
    }
    if (update&&messageRecipient) {
        messageRecipient->ProcessEvent (generateTableChangeSelEvent(GetID()));
    }
}

//__________________________________________________________________

void    _HYTable::InvertSelection (void)
{
    for (long idx=0; idx<cellTypes.lLength; idx++) {
        if (!(cellTypes.lData[idx]&HY_TABLE_CANTSELECT)) {
            if (cellTypes.lData[idx] & HY_TABLE_SELECTED) {
                cellTypes.lData[idx] -= HY_TABLE_SELECTED;
            } else {
                cellTypes.lData[idx] += HY_TABLE_SELECTED;
            }
        }
    }
    if (messageRecipient) {
        messageRecipient->ProcessEvent (generateTableChangeSelEvent(GetID()));
    }
}

//__________________________________________________________________

void    _HYTable::GetRowSelection (_SimpleList& rec, long shift)
{
    for (long k=0; k<cellTypes.lLength; k+=horizontalSpaces.lLength) {
        if (cellTypes.lData[k+shift]&HY_TABLE_SELECTED) {
            rec<<k/horizontalSpaces.lLength;
        }
    }
}

//__________________________________________________________________

void    _HYTable::ScanRowSelection (_SimpleList& rec)
{
    for (long k=0; k<cellTypes.lLength; k+=horizontalSpaces.lLength)
        for (long k2=0; k2<horizontalSpaces.lLength; k2++)
            if (cellTypes.lData[k+k2]&HY_TABLE_SELECTED) {
                rec << k/horizontalSpaces.lLength;
                break;
            }
}

//__________________________________________________________________

void    _HYTable::ScanColumnSelection (_SimpleList& rec)
{
    for (long k2=0; k2<horizontalSpaces.lLength; k2++)
        for (long k=k2; k<cellTypes.lLength; k+=horizontalSpaces.lLength)
            if (cellTypes.lData[k]&HY_TABLE_SELECTED) {
                rec << k2;
                break;
            }
}

//__________________________________________________________________

long    _HYTable::GetFirstRowSelection (void)
{
    _SimpleList rs;
    GetRowSelection (rs);
    if (rs.lLength) {
        return rs.lData[0];
    }
    return -1;
}

//__________________________________________________________________

bool    _HYTable::IsRowSelectionSimple (void)
{
    bool    res = false;
    for (long k=0; k<cellTypes.lLength; k+=horizontalSpaces.lLength) {
        if (cellTypes.lData[k]&HY_TABLE_SELECTED)
            if (res) {
                return false;
            } else {
                res = true;
            }
    }
    return res;
}

//__________________________________________________________________
bool    _HYTable::CanCopy (void)
{
    _SimpleList   sel;
    GetSelection (sel);

    return      sel.lLength;
}

//__________________________________________________________________
BaseRef _HYTable::CanPaste (_String& clip)
{
    _SimpleList   sel;
    GetSelection (sel);

    if (sel.lLength!=1) {
        return nil;
    }

    long rIdx = sel.lData[0]/horizontalSpaces.lLength,
         cIdx = sel.lData[0]%horizontalSpaces.lLength;

    _List        clipContents;

    _ElementaryCommand::ExtractConditions (clip,0,clipContents,';');

    if (verticalSpaces.lLength+1-rIdx < clipContents.lLength) {
        return nil;
    }

    _List*       clipData = new _List;

    if (!clipData) {
        return nil;
    }

    for (long k=0; k<clipContents.lLength; k++) {
        _List thisRow;
        _ElementaryCommand::ExtractConditions ((*(_String*)clipContents(k)),0,thisRow,',');
        if (horizontalSpaces.lLength+1-cIdx < thisRow.lLength) {
            DeleteObject (clipData);
            return       nil;
        }
        for (long kk=0; kk<thisRow.lLength; kk++) {
            ((_String*)thisRow(kk))->StripQuotes();
        }

        (*clipData) && & thisRow;
    }
    return clipData;
}

//__________________________________________________________________
_String*    _HYTable::HandleCopy (void)
{
    _String*     res = new _String (128L, true);

    _SimpleList  sel;
    GetSelection (sel);

    long         lastRow = -1;

    for (long k=0; k<sel.lLength; k++) {
        long rIndex = sel.lData[k]/horizontalSpaces.lLength,
             cIndex = sel.lData[k]%horizontalSpaces.lLength;

        if  (rIndex!=lastRow) {
            lastRow = rIndex;
            if (k) {
                (*res) << ';';
            }
        } else {
            (*res) << ',';
        }

        (*res) << '"';
        (*res) << (_String*)GetCellData (cIndex, rIndex);
        (*res) << '"';
    }

    res->Finalize();
    return       res;
}

//__________________________________________________________________

void    _HYTable::HandlePaste (BaseRef data)
{
    _List * pasteData = (_List*)data;

    _SimpleList  sel;
    GetSelection (sel);

    if (sel.lLength!=1) {
        return;
    }

    long rIdx = sel.lData[0]/horizontalSpaces.lLength,
         cIdx = sel.lData[0]%horizontalSpaces.lLength;

    _SimpleList taint;

    for (long k=0; k<pasteData->lLength; k++) {
        _List *thisRow = (_List*)(*pasteData)(k);

        for (long kk=0; kk<thisRow->lLength; kk++) {
            long idx = (rIdx+k)*horizontalSpaces.lLength + cIdx+kk;
            SetCellData ((_String*)(*thisRow)(kk),rIdx+k, cIdx+kk, cellTypes.lData[idx],true);
            taint << idx;
        }

    }

    _MarkCellsForUpdate (taint);

    if (messageRecipient) {
        messageRecipient->ProcessEvent (generateTableEditCellEvent(GetID(),sel.lData[0]));
    }

}


//__________________________________________________________________
void    _HYTable::GetColumnSelection (_SimpleList& rec)
{
    for (long k=0; k<horizontalSpaces.lLength; k++) {
        if (cellTypes.lData[k]&HY_TABLE_SELECTED) {
            rec<<k;
        }
    }
}

//__________________________________________________________________
void    _HYTable::UnfocusComponent (void)
{
    if (_HasTextBox()) {
        _HYRect        dummy;
        EditBoxHandler (-1,dummy);
    }
    if (selectionType&HY_TABLE_IS_FOCUSED) {
        selectionType -= HY_TABLE_IS_FOCUSED;
    }

    _HYComponent::UnfocusComponent();
}

//__________________________________________________________________
void    _HYTable::FocusComponent (void)
{
    if (!(selectionType&HY_TABLE_IS_FOCUSED)) {
        selectionType += HY_TABLE_IS_FOCUSED;
    }

    _SimpleList    cs;
    GetSelection   (cs);

    if (cs.lLength == 0) {
        long k;
        for (k=0; k<cellTypes.lLength; k++)
            if (cellTypes.lData[k]&HY_TABLE_CANTSELECT) {
                break;
            }

        if  (k<cellTypes.lLength) {
            cs << k;
            if ((selectionType&HY_TABLE_SEL_ROWS)==0) {
                cs.lData[0] /= horizontalSpaces.lLength;
                SetRowSelection (cs);
            }
            if (selectionType&HY_TABLE_SEL_COLS) {
                cs.lData[0] %= horizontalSpaces.lLength;
                SetColumnSelection (cs);
            } else {
                SetSelection (cs);
            }
        }
    }

    _FocusComponent ();
    _HYComponent::FocusComponent();
}

//__________________________________________________________________
void    _HYTable::_PrintTable (_HYTable* ch)
{
    _SimpleList rows,
                columns;

    long        k;

    for (k=0; k<horizontalSpaces.lLength; k++) {
        columns << k;
    }

    for (k=0; k<verticalSpaces.lLength; k++) {
        rows << k;
    }

    _PrintTable (columns, rows, ch);
}

//__________________________________________________________________
void    _HYTable::_PrintTable (_SimpleList& columns, _HYTable* ch)
{
    _SimpleList rows;

    long        k;

    for (k=0; k<verticalSpaces.lLength; k++) {
        rows << k;
    }

    _PrintTable (columns, rows, ch);
}

//__________________________________________________________________

void    _HYTable::SaveTable (_HYTable* ch, _HYTable *rh, long format, FILE * dest, _String& title)
{
    _SimpleList rows,
                columns;

    long        k;

    for (k=0; k<horizontalSpaces.lLength; k++) {
        columns << k;
    }

    for (k=0; k<verticalSpaces.lLength; k++) {
        rows << k;
    }

    SaveTable (ch,rh, format,dest,title, columns, rows);
}

//__________________________________________________________________

void    _HYTable::SaveTable (_HYTable* ch, _HYTable *rh, long format, FILE * dest, _String& title, _SimpleList& columns, _SimpleList& rows)
{
    long        i,j,k,t;
    if (columns.lLength&&rows.lLength&&dest) {
        switch (format) {
        case 0: // comma separated
        case 1: { // tab     separated
            char sep = format?'\t':',';
            if (ch) {
                if (rh) {
                    fputc (sep,dest);
                }
                for (i=0; i<columns.lLength-1; i++) {
                    ch->ExportCell (dest,format,0,columns.lData[i]);
                    fputc (sep,dest);
                }
                ch->ExportCell (dest,format,0,columns.lData[i]);
                fprintf (dest,"\n");
            }
            for (j=0; j<rows.lLength; j++) {
                if (rh) {
                    rh->ExportCell (dest,format,rows.lData[j],0);
                    fputc (sep,dest);
                }
                for (i=0; i<columns.lLength-1; i++) {
                    ExportCell (dest,format,rows.lData[j],columns.lData[i]);
                    fputc (sep,dest);
                }
                ExportCell (dest,format,rows.lData[j],columns.lData[i]);
                fprintf (dest,"\n");
            }
        }
        break;

        case 2: { // LaTEX table
            fprintf (dest, "{\\small\n\\begin{table}[t]\n\\begin{tabular}{");
            if (rh) {
                fprintf (dest,"r");
            }

            for (i=0; i<columns.lLength; i++) {
                fprintf (dest,"r");
            }

            fprintf (dest, "}\n\\hline\n");
            if (ch) {
                if (rh) {
                    fputc ('&',dest);
                }

                for (i=0; i<columns.lLength-1; i++) {
                    ch->ExportCell (dest,format,0,columns.lData[i]);
                    fputc ('&',dest);
                }
                ch->ExportCell (dest,format,0,columns.lData[i]);
                fprintf (dest, "\\\\\n\\hline\n");
            }
            for (j=0; j<rows.lLength; j++) {
                if (rh) {
                    rh->ExportCell (dest,format,rows.lData[j],0);
                    fputc ('&',dest);
                }
                for (i=0; i<columns.lLength-1; i++) {
                    ExportCell (dest,format,rows.lData[j],columns.lData[i]);
                    fputc ('&',dest);
                }
                ExportCell (dest,format,rows.lData[j],columns.lData[i]);
                fprintf (dest, "\\\\\n");
            }
            fprintf (dest,"\n\\end{tabular}\n\\caption{%s}\n\\end{table}\n}\n",title.sData);
        }
        break;

        case 3: { // HTML  table
            fprintf (dest, "<html>\n<head>\n<title>\n%s</title></head><body bgcolor = \"#FFFFFF\">\n<table border = \"0\" cellpadding = \"0\" cellspacing = \"1\">",title.sData);
            if (ch) {
                fprintf (dest, "\n<tr>\n");
                if (rh) {
                    fprintf (dest,"<td></td>");
                }
                for (i=0; i<columns.lLength; i++) {
                    ch->ExportCell (dest,format,0,columns.lData[i]);
                }
                fprintf (dest, "\n</tr>\n");
            }
            for (j=0; j<rows.lLength; j++) {
                fprintf (dest, "\n<tr>\n");
                if (rh) {
                    rh->ExportCell (dest,format,rows.lData[j],0);
                }
                for (i=0; i<columns.lLength; i++) {
                    ExportCell (dest,format,rows.lData[j],columns.lData[i]);
                }
                fprintf (dest, "\n</tr>\n");
            }
            fprintf (dest, "\n</table>\n</body>\n</html>\n");
        }
        break;

        case 4: { // ASCII art table
            _SimpleList width;

            for (i=0; i<columns.lLength; i++) {
                k = ch?ch->GetCellWidth (0,columns.lData[i]):2;

                for (j=0; j<rows.lLength; j++) {
                    t = GetCellWidth (rows.lData[j],columns.lData[i]);
                    if (t>k) {
                        k = t;
                    }
                }
                width << k;
            }

            fprintf (dest,"%s\n\n", title.sData);

            _String rowSeparator (128L, true);
            rowSeparator << '+';
            for (i=0; i<columns.lLength; i++) {
                for (j=-1; j<=width.lData[i]; j++) {
                    rowSeparator << '-';
                }
                rowSeparator << '+';
            }
            rowSeparator.Finalize();

            fprintf (dest, "%s\n", rowSeparator.sData);

            if (ch) {
                fputc ('|', dest);
                for (i=0; i<columns.lLength; i++) {
                    k = ch->GetCellWidth (0,columns.lData[i]);
                    ch->ExportCell (dest,format,0,columns.lData[i]);
                    for (t = k; t < width.lData[i]; t++) {
                        fputc (' ', dest);
                    }
                    fputc ('|', dest);
                }
                fprintf (dest, "\n%s\n", rowSeparator.sData);
            }

            for (j=0; j<rows.lLength; j++) {
                fputc ('|', dest);
                for (i=0; i<columns.lLength; i++) {
                    k = GetCellWidth (rows.lData[j],columns.lData[i]);
                    ExportCell (dest,format,rows.lData[j],columns.lData[i]);
                    for (t = k; t < width.lData[i]; t++) {
                        fputc (' ', dest);
                    }
                    fputc ('|', dest);
                }
                fprintf (dest, "\n%s\n", rowSeparator.sData);
            }
        }
        case 5: { // hyphy matrix
            fprintf (dest,"\n{\n");
            for (j=0; j<rows.lLength; j++) {
                fputc ('{',dest);
                for (i=0; i<columns.lLength-1; i++) {
                    ExportCell (dest,format,rows.lData[j],columns.lData[i]);
                    fputc (',',dest);
                }
                ExportCell (dest,format,rows.lData[j],columns.lData[i]);
                fprintf (dest,"}\n");
            }
            fprintf (dest,"}");
        }
        break;
        break;
        default: {
            _String wrongFormat ("SaveTable was passed an invalid format code");
            ProblemReport (wrongFormat);
        }
        }
    }
}

//__________________________________________________________________

long    _HYTable::GetCellWidth (long r, long c)
{
    long idx  = r*horizontalSpaces.lLength+c,
         type = cellTypes.lData[idx];

    if (type&HY_TABLE_ICON) {
        return iconExportString.sLength;
    }

    return ((_String*)GetCellData (c,r))->sLength;
}

//__________________________________________________________________

void    _HYTable::ExportCell (FILE* dest, long format, long r, long c)
{
    long idx  = r*horizontalSpaces.lLength+c,
         type = cellTypes.lData[idx];

    _String * contents;

    bool boldOn   = type&HY_TABLE_BOLD,
         italicOn = type&HY_TABLE_ITALIC;

    if (type&HY_TABLE_ICON) {
        contents = &iconExportString;
    } else {
        contents = ((_String*)GetCellData (c,r));
    }

    switch  (format) {
    case 2: { // LaTEX table
        if (boldOn) {
            fprintf (dest, "{\\bf ");
        }
        if (italicOn) {
            fprintf (dest, "{\\it ");
        }
    }
    break;
    case 3: { // HTML table
        fprintf (dest, "\n\t<td align = \"left\" valign = \"center\" bgcolor = \"#%s\">",
                 ((type&HY_TABLE_BEVELED)?backColor2:backColor).HTMLColor().getStr());
        if (boldOn) {
            fprintf (dest, "<b>");
        }
        if (italicOn) {
            fprintf (dest, "<i>");
        }
        fprintf (dest,"<font color = \"#%s\"> ",textColor.HTMLColor().getStr());
    }
    break;
    case 4:
        fputc (' ', dest);
        break;
    }

    if (format == 2) {
        fprintf (dest, "%s", contents->Replace ("_","\\_",true).sData);
    } else {
        fprintf (dest, "%s", contents->sData);
    }

    switch  (format) {
    case 2: { // LaTEX table
        if (italicOn) {
            fprintf (dest, "}");
        }
        if (boldOn) {
            fprintf (dest, "}");
        }
    }
    break;
    case 3: { // HTML table
        fprintf (dest,"</font>");
        if (italicOn) {
            fprintf (dest, "</i>");
        }
        if (boldOn) {
            fprintf (dest, "</b>");
        }
        fprintf (dest, " </td>");
    }
    case 4:
        fputc (' ', dest);
        break;
    }
}

//__________________________________________________________________

void    _HYTable::GetTableFormats (_List& rec)
{
    _String format ("Comma Separated");
    rec && & format;
    format = "Tab Separated";
    rec && & format;
    format = "LaTEX Table";
    rec && & format;
    format = "HTML Table";
    rec && & format;
    format = "ASCII Table";
    rec && & format;
    format = "HyPhy Matrix";
    rec && & format;
}

//__________________________________________________________________

void    _HYTable::HandleKeyMove (char dir, bool )
{
    bool         rowSel = selectionType&HY_TABLE_SEL_ROWS;

    _SimpleList  ts;

    if (rowSel) {
        GetRowSelection(ts);
        if (ts.lLength<=1) {
            long adder = -1,
                 startIndex = -1;

            if (dir) {
                adder = 1;
            }

            if (ts.lLength == 1) {
                startIndex = ts.lData[0];
            } else {
                if (dir) {
                    startIndex = -1;
                } else {
                    startIndex = verticalSpaces.lLength;
                }
            }

            startIndex += adder;
            ts.Clear();
            while ((startIndex>=0)&&(startIndex<verticalSpaces.lLength)) {
                if ((cellTypes.lData[startIndex*horizontalSpaces.lLength]&HY_TABLE_CANTSELECT)==0) {
                    ts << startIndex;
                    bool mod;
                    mod = ScrollToRow(startIndex);

                    ExpungeSelection ();
                    SetRowSelection (ts);
                    if (mod) {
                        forceUpdateForScrolling = true;
                        _MarkForUpdate();
                        forceUpdateForScrolling = false;
                    } else {
                        _MarkCellsForUpdate (ts);
                    }
                    break;
                }
                startIndex += adder;
            }
        }
    } else {
        GetSelection (ts);
        if (ts.lLength<=1) {
            long adder = 1,
                 startIndex = -1;

            switch (dir) {
            case 0: // up
                adder = -horizontalSpaces.lLength;
                break;
            case 1: // down
                adder = horizontalSpaces.lLength;
                break;
            case 2: // left
                adder = -1;
                break;
            }

            if (ts.lLength == 1) {
                startIndex = ts.lData[0];
            } else {
                switch (dir) {
                case 0: // up
                    startIndex = cellTypes.lLength;
                    break;
                case 1: // down
                    startIndex = -adder;
                    break;
                case 3: // right
                    startIndex = horizontalSpaces.lLength;
                    break;
                }
            }

            startIndex += adder;
            ts.Clear();
            while ((startIndex>=0)&&(startIndex<cellTypes.lLength)) {
                if ((cellTypes.lData[startIndex]&HY_TABLE_CANTSELECT)==0) {
                    ts << startIndex;
                    bool mod;
                    if (dir<2) {
                        mod = ScrollToRow(startIndex/horizontalSpaces.lLength);
                    } else {
                        mod = ScrollToColumn(startIndex%horizontalSpaces.lLength);
                    }
                    ExpungeSelection ();
                    SetSelection (ts,true);
                    if (mod) {
                        forceUpdateForScrolling = true;
                        _MarkForUpdate();
                        forceUpdateForScrolling = false;
                    } else {
                        _MarkCellsForUpdate (ts);
                    }
                    break;
                }
                startIndex += adder;
            }
        }
    }
}

//__________________________________________________________________
// HYHList
//__________________________________________________________________

_SimpleList*          openArrow   = nil,
                      *       closedArrow = nil;

//__________________________________________________________________

_HYHList::_HYHList (_HYRect relr,Ptr w,_List& ld, bool sing):
    _HYTable (relr,w,ld.lLength,2,20,20,HY_TABLE_STATIC_TEXT)
{
    listData.Duplicate (&ld);

    if (!openArrow) {
        openArrow = new _SimpleList ((unsigned long)3);
        checkPointer (openArrow);

        (*openArrow) << (long) ProcureIconResource(131);
        (*openArrow) << 16;
        (*openArrow) << 16;

        closedArrow = new _SimpleList ((unsigned long)3);
        checkPointer (closedArrow);

        (*closedArrow) << (long) ProcureIconResource(132);
        (*closedArrow) << 16;
        (*closedArrow) << 16;
    }

    _HYFont     df;
#ifdef __MAC__
    df.face = "Times";
    df.size = 12;
#else
#ifdef __HYPHY_GTK__
    df.face = _HY_SANS_FONT;
    df.size = 12;
#else
    df.face = "Arial";
    df.size = 14;
#endif
#endif

    df.style = HY_FONT_PLAIN;
    SetFont (df);

    for (long k=0; k<ld.lLength; k++) {
        _List * thisEntry = (_List*) listData (k);
        SetCellData (closedArrow, k, 0, HY_TABLE_ICON | HY_TABLE_CANTSELECT,true);
        SetCellData ((*thisEntry)(0), k, 1, HY_TABLE_STATIC_TEXT|HY_TABLE_BOLD ,true);
        rubrikIndex << k;
    }

    SetColumnSpacing  (1,relr.right-40-HY_SCROLLER_WIDTH,false);

    if (settings.width & HY_COMPONENT_H_SCROLL) {
        FitToHeight (relr.bottom-HY_SCROLLER_WIDTH);
    } else {
        FitToHeight (relr.bottom);
    }

    selectionType = HY_TABLE_DONT_SIZE|HY_TABLE_NO_COLS_LINES|HY_TABLE_DONT_GROW_HORIZ|HY_TABLE_DONT_GROW_VERT;
    single        = sing;
}

//__________________________________________________________________

void    _HYHList::AddRubrik (_String& rubrikName, _List& rubrikItems, long index)
{
    long        insertionPoint = 0;
    if ((index < 0) && (index >= rubrikIndex.lLength)) {
        index          = rubrikIndex.lLength;
        if (HasPadding()) {
            insertionPoint = verticalSpaces.lLength-1;
        } else {
            insertionPoint = verticalSpaces.lLength;
        }
    } else {
        insertionPoint = rubrikIndex.lData[index];
    }

    _List * newRubrik = new _List;

    checkPointer (newRubrik);

    (*newRubrik) && & rubrikName;
    (*newRubrik) && & rubrikItems;

    listData.InsertElement (newRubrik, index, false);
    rubrikIndex.InsertElement ((BaseRef)insertionPoint, index, false, false);
    DeleteObject (newRubrik);


    for (long   k = index+1; k < rubrikIndex.lLength; k++) {
        rubrikIndex.lData[k] ++;
    }


    AddRow      (insertionPoint, 20, HY_TABLE_STATIC_TEXT);
    SetCellData (closedArrow, insertionPoint, 0, HY_TABLE_ICON | HY_TABLE_CANTSELECT,true);
    SetCellData (&rubrikName, insertionPoint, 1, HY_TABLE_STATIC_TEXT|HY_TABLE_BOLD ,true);

    if (settings.width & HY_COMPONENT_H_SCROLL) {
        FitToHeight (rel.bottom-rel.top-HY_SCROLLER_WIDTH+1);
    } else {
        FitToHeight (rel.bottom-rel.top+1);
    }

    _MarkForUpdate();

}

//__________________________________________________________________

long    _HYHList::IsSingleRubrik (_SimpleList& sl)
{
    if (sl.lLength == 0) {
        return -1;
    }

    if (rubrikIndex.lLength == 0) {
        return 0;
    }

    long rIndex = 1;
    while ((sl.lData[0] >= rubrikIndex.lData[rIndex]) && (rIndex < rubrikIndex.lLength)) {
        rIndex ++;
    }

    if (rIndex == rubrikIndex.lLength) {
        sl.Offset (-rubrikIndex.lData[rIndex-1]);
        return rIndex-1;
    } else {
        long nextB = rubrikIndex.lData[rIndex],
             i = 1;

        for (; (i< sl.lLength)&&(sl.lData[i]<nextB); i++) ;

        if (i == sl.lLength) {
            sl.Offset (-rubrikIndex.lData[rIndex-1]);
            return rIndex-1;
        }
    }

    return -1;
}

//__________________________________________________________________

void    _HYHList::DeleteRubrik (long index)
{
    if ((index>=0) && (index<rubrikIndex.lLength)) {
        long delCount;

        if (index <  rubrikIndex.lLength - 1) {
            delCount = rubrikIndex.lData[index+1] - rubrikIndex.lData[index];
        } else {
            delCount = HasPadding()?verticalSpaces.lLength - rubrikIndex.lData[index]-1:verticalSpaces.lLength - rubrikIndex.lData[index];
        }

        for (long k=index+1; k<rubrikIndex.lLength; k++) {
            rubrikIndex.lData[k] -= delCount;
        }

        while (delCount) {
            DeleteRow (rubrikIndex.lData[index]);
            delCount --;
        }

        rubrikIndex.Delete (index);
        listData.Delete (index);

        if (settings.width & HY_COMPONENT_H_SCROLL) {
            FitToHeight (rel.bottom-rel.top-HY_SCROLLER_WIDTH+1);
        } else {
            FitToHeight (rel.bottom-rel.top+1);
        }
    }
    _MarkForUpdate();
}


//__________________________________________________________________

long    _HYHList::IsARubrik (long index)
{
    return rubrikIndex.Find (index);
}

//__________________________________________________________________

long    _HYHList::FindString (_String* s, long startat)
{
    for (long k=(startat>=0?startat:0); k<listData.lLength; k++) {
        _List * thisRubrik = (_List*)(*((_List*)listData(k)))(1);
        for (long j=0; j<thisRubrik->lLength; j++)
            if (s->Equal((_String*)(*thisRubrik)(j))) {
                return (k<<16)+j;
            }
    }
    return -1;
}

//__________________________________________________________________

bool    _HYHList::IsRubrikOpen (long index)
{
    if ((index>=0)&&(index<listData.lLength)) {
        if (index<listData.lLength-1) {
            return (rubrikIndex[index+1]-rubrikIndex[index]-1>0);
        } else {
            if (HasPadding()) {
                return rubrikIndex[index]<verticalSpaces.lLength-2;
            } else {
                return rubrikIndex[index]<verticalSpaces.lLength-1;
            }
        }
    }
    return false;
}

//__________________________________________________________________

long    _HYHList::RubrikIndex (long index)
{
    long result = 0;
    while ((result<rubrikIndex.lLength)&&(rubrikIndex.lData[result]<index)) {
        result ++;
    }

    if ((rubrikIndex.lData[result]>index)||(result==rubrikIndex.lLength)) {
        result--;
    }

    return (result<<16)+(index-rubrikIndex.lData[result]);
}


//__________________________________________________________________

long    _HYHList::AbsoluteIndex (long rubrik, long item)
{
    long result = 0,
         k;

    for (k=0; k<rubrik; k++) {
        _List * thisEntry = (_List*) listData (k);
        result = result + ((_List*)(*thisEntry)(1))->lLength + 1;
    }
    return result+item;
}

//__________________________________________________________________

void        _HYHList::ModifySelection (long h,long v, bool shift, bool control, bool message)
{
    if (h==0) {
        long f = IsARubrik(v);
        if (f>=0) {
            _List       * rubrikItems = (_List*) (*(_List*) listData (f))(1);
            if (IsRubrikOpen(f)) {
                SetCellData (closedArrow, v, 0, HY_TABLE_ICON | HY_TABLE_CANTSELECT,true);
                for (f=f+1; f<listData.lLength; f++) {
                    rubrikIndex.lData[f] -= rubrikItems->lLength;
                }

                for (f = v+1; f <= v+rubrikItems->lLength; f++) {
                    DeleteRow (v+1);
                }


                if (settings.width & HY_COMPONENT_H_SCROLL) {
                    FitToHeight (rel.bottom-rel.top-HY_SCROLLER_WIDTH+1);
                } else {
                    FitToHeight (rel.bottom-rel.top+1);
                }
            } else {
                for (f=f+1; f<listData.lLength; f++) {
                    rubrikIndex.lData[f] += rubrikItems->lLength;
                }

                SetCellData (openArrow, v, 0, HY_TABLE_ICON | HY_TABLE_CANTSELECT,true);

                for (f = v+1; f <= v+rubrikItems->lLength; f++) {
                    AddRow      (f,20, HY_TABLE_STATIC_TEXT);
                    SetCellData (&empty, f, 0, HY_TABLE_STATIC_TEXT | HY_TABLE_CANTSELECT,true);
                    SetCellData ((*rubrikItems)(f-v-1), f, 1, HY_TABLE_STATIC_TEXT,true);
                }

                if (settings.width & HY_COMPONENT_H_SCROLL) {
                    FitToHeight (rel.bottom-rel.top-HY_SCROLLER_WIDTH+1);
                } else {
                    FitToHeight (rel.bottom-rel.top+1);
                }
            }
            _SimpleList modRows;
            for (f=v; f<verticalSpaces.lLength; f++) {
                modRows << 2*f;
                modRows << 2*f+1;
            }
            _MarkCellsForUpdate (modRows);

            _HYTable::ModifySelection (1,v,false,false,message);
            return;
        }
    }
    _HYTable::ModifySelection (h,v,(!single)&&shift,(!single)&&control,message);
}

//__________________________________________________________________

void    _HYHList::FitToHeight (long height)
{
    bool           hasPadding = HasPadding();
    long           h = verticalSpaces.lData[verticalSpaces.lLength-(hasPadding?2:1)];

    if (hasPadding) {
        if (h<height) {
            SetRowSpacing (verticalSpaces.lLength-1,height-h-GetRowSpacing (verticalSpaces.lLength-1),false);
        } else {
            DeleteRow (verticalSpaces.lLength-1);
        }
    } else if (h<height) {
        AddRow (-1,height-h,HY_TABLE_STATIC_TEXT|HY_TABLE_CANTSELECT);
    }

    SetVisibleSize (rel);
}

//__________________________________________________________________

bool    _HYHList::HasPadding (void)
{
    if (cellTypes.lLength) {
        return (cellTypes.lData[cellTypes.lLength-1] & HY_TABLE_CANTSELECT);
    } else {
        return false;
    }
}

//__________________________________________________________________

void    _HYHList::HandleKeyMove (char dir, bool mod)
{
    _SimpleList  ts;
    GetSelection (ts);
    if (ts.lLength<=1) {
        if (dir<2) {
            _HYTable::HandleKeyMove (dir,mod);
            return;
        }

        if (ts.lLength == 1) {
            long f = IsARubrik (ts.lData[0]/2);
            if ((f>=0)&&(((dir == 3)&&(!IsRubrikOpen(f)))||((dir == 2)&&(IsRubrikOpen(f))))) {
                ModifySelection (0, ts.lData[0]/2, false, false,false);
            }
        }
    }
}
\ No newline at end of file
diff --git a/src/gui/Components/HYTextBox.cpp b/src/gui/Components/HYTextBox.cpp
new file mode 100644
index 0000000..219971b
--- /dev/null
+++ b/src/gui/Components/HYTextBox.cpp
@@ -0,0 +1 @@
+/*
    Text field component

    Sergei L. Kosakovsky Pond, May 2000 - December 2002.
*/

#include "HYEventTypes.h"
#include "HYTextBox.h"
#include "HYGraphicPane.h"

#ifdef    __HYPHYDMALLOC__
#include "dmalloc.h"
#endif
//__________________________________________________________________

_HYTextBox::_HYTextBox (_HYRect r,Ptr p, bool bt):_HYComponent (r,p),_HYPlatformTextBox()
{
    backColor.R       = backColor.G
                        = backColor.B
                          = 255;

    foreColor.R       = foreColor.G
                        = foreColor.B
                          = 0;


    editBoxFont.size  = 10;
    editBoxFont.style = HY_FONT_PLAIN;
    editBoxFont.face  = "Helvetica";

    alignFlags        = HY_ALIGN_LEFT;

    margins.left      = margins.right
                        = margins.top
                          = margins.bottom
                            = 5;

    boxFlags = HY_TB_ENABLED | (bt?HY_TB_BIGBOX:0);

    //boxType             = bt;
}

//__________________________________________________________________

_HYTextBox::~_HYTextBox()
{
}

//__________________________________________________________________

void            _HYTextBox::SetBackColor (_HYColor c)
{
    if ((c.R!=backColor.R)||(c.G!=backColor.G)||(c.B!=backColor.B)) {
        backColor = c;
        _SetBackColor (c);
        _MarkForUpdate();
    }
}

//__________________________________________________________________

_HYColor&       _HYTextBox::GetBackColor (void)
{
    return backColor;
}

//__________________________________________________________________

void            _HYTextBox::SetForeColor (_HYColor c)
{
    if ((c.R!=foreColor.R)||(c.G!=foreColor.G)||(c.B!=foreColor.B)) {
        foreColor = c;
        _SetForeColor (c);
        _MarkForUpdate();
    }
}

//__________________________________________________________________

void            _HYTextBox::SetBackTColor (_HYColor c)
{
    if ((c.R!=backTextColor.R)||(c.G!=backTextColor.G)||(c.B!=backTextColor.B)) {
        backTextColor = c;
        _SetBackTColor (c);
        _MarkForUpdate();
    }
}

//__________________________________________________________________

_HYColor&       _HYTextBox::GetForeColor (void)
{
    return foreColor;
}

//__________________________________________________________________

_HYColor&       _HYTextBox::GetBackTColor (void)
{
    return backTextColor;
}


//__________________________________________________________________
void            _HYTextBox::SetText (const _String& newText, bool update)
{
    _SetText (newText);
    _MarkForUpdate();
    if (messageRecipient && update) {
        messageRecipient->ProcessEvent (generateTextEditChangeEvent (GetID(),1));
    }
}

//__________________________________________________________________
void            _HYTextBox::InsertText (const _String& newText, bool update, bool append)
{
    _InsertText (newText, append);
    _MarkForUpdate();
    if (messageRecipient && update) {
        messageRecipient->ProcessEvent (generateTextEditChangeEvent (GetID(),1));
    }
}

//__________________________________________________________________

_String         _HYTextBox::GetText (void)
{
    return _GetText();
}


//__________________________________________________________________

void            _HYTextBox::StoreText (_String*& rec, bool selOnly)
{
    return _StoreText(rec, selOnly);
}

//__________________________________________________________________

_HYFont&        _HYTextBox::GetFont (void)
{
    return editBoxFont;
}

//__________________________________________________________________
void            _HYTextBox::SetMargins (_HYRect m)
{
    if ((m.top!=margins.top)||(m.bottom!=margins.bottom)
            ||(m.left!=margins.left)||(m.right!=margins.right)) {
        margins = m;
        SetVisibleSize (rel);
        _MarkForUpdate ();
    }
}

//__________________________________________________________________

void            _HYTextBox::SetFont (_HYFont&f)
{
    if ((!f.face.Equal(&editBoxFont.face))||(f.size!=editBoxFont.size)||(f.style!=editBoxFont.style)) {
        _SetFont (f);
        editBoxFont.face  = f.face;
        editBoxFont.size  = f.size;
        editBoxFont.style = f.style;
        _MarkForUpdate();
    }
}

//__________________________________________________________________
void            _HYTextBox::SetVisibleSize (_HYRect rel)
{
    _HYComponent::SetVisibleSize (rel);
    _HYPlatformTextBox::_SetVisibleSize (rel);
}

//__________________________________________________________________

void            _HYTextBox::EnableTextEdit (bool e)
{
    bool ie = boxFlags&HY_TB_ENABLED;
    if (ie!=e) {
        if (e) {
            boxFlags |= HY_TB_ENABLED;
        } else {
            boxFlags -= HY_TB_ENABLED;
        }

        _EnableTextBox (e);
        _MarkForUpdate ();
    }
}

//__________________________________________________________________

void            _HYTextBox::FocusComponent (void)
{
#ifndef __WINDOZE__
    if (!(boxFlags&HY_TB_FOCUSED))
#endif
    {
        boxFlags |= HY_TB_FOCUSED;
        if (!(boxFlags&HY_TB_BIGBOX)) {
            SetSelection   (0,0x7fffffff);
        }
        _FocusComponent();
        _MarkForUpdate();
    }
}

//__________________________________________________________________

void            _HYTextBox::UnfocusComponent (void)
{
    if (boxFlags&HY_TB_FOCUSED) {
        boxFlags -= HY_TB_FOCUSED;
        _UnfocusComponent();
        _MarkForUpdate();
    }
}
\ No newline at end of file
diff --git a/src/gui/HYBaseGUI.cpp b/src/gui/HYBaseGUI.cpp
new file mode 100644
index 0000000..35ffc61
--- /dev/null
+++ b/src/gui/HYBaseGUI.cpp
@@ -0,0 +1,227 @@
+/*
+ 
+ HyPhy - Hypothesis Testing Using Phylogenies.
+ 
+ Copyright (C) 1997-now
+ Core Developers:
+ Sergei L Kosakovsky Pond (spond at ucsd.edu)
+ Art FY Poon    (apoon at cfenet.ubc.ca)
+ Steven Weaver (sweaver at ucsd.edu)
+ 
+ Module Developers:
+ Lance Hepler (nlhepler at gmail.com)
+ Martin Smith (martin.audacis at gmail.com)
+ 
+ Significant contributions from:
+ Spencer V Muse (muse at stat.ncsu.edu)
+ Simon DW Frost (sdf22 at cam.ac.uk)
+ 
+ Permission is hereby granted, free of charge, to any person obtaining a
+ copy of this software and associated documentation files (the
+ "Software"), to deal in the Software without restriction, including
+ without limitation the rights to use, copy, modify, merge, publish,
+ distribute, sublicense, and/or sell copies of the Software, and to
+ permit persons to whom the Software is furnished to do so, subject to
+ the following conditions:
+ 
+ The above copyright notice and this permission notice shall be included
+ in all copies or substantial portions of the Software.
+ 
+ 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.
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ 
+ */
+
+#include "HYBaseGUI.h"
+#include "baseobj.h"
+
+#ifdef    __HYPHYDMALLOC__
+#include "dmalloc.h"
+#endif
+//__________________________________________________________________
+
+unsigned long GUIObjectGlobalCounter = 0;
+_List    GlobalGUIEventQueue;
+_String  ReportThisError
+(" Please report this error using a bug report form at http://peppercat.stat.ncsu.edu.");
+
+//______________________________________________________________
+//  Function Definitions for _HYGuiObject
+//______________________________________________________________
+
+_HYGuiObject::_HYGuiObject (void)
+{
+    ID = ++GUIObjectGlobalCounter;
+}
+
+//__________________________________________________________________
+
+_HYGuiObject::~_HYGuiObject (void)
+{
+}
+
+//__________________________________________________________________
+
+bool _HYGuiObject::MatchID (unsigned long testID)
+{
+    return ID==testID;
+}
+
+//__________________________________________________________________
+
+unsigned long _HYGuiObject::GetID (void)
+{
+    return ID;
+}
+
+
+//______________________________________________________________
+//  Function Definitions for _HYEvent
+//______________________________________________________________
+
+_HYEvent::_HYEvent() {}
+
+//______________________________________________________________
+
+_HYEvent::_HYEvent(_HYEvent& he)
+{
+    Duplicate (&he);
+}
+
+//______________________________________________________________
+
+_HYEvent::_HYEvent(_String eCl, _String eCo)
+{
+    eventClass.Duplicate(&eCl);
+    eventCode.Duplicate(&eCo);
+}
+
+//______________________________________________________________
+
+_HYEvent::~_HYEvent(void) {}
+
+//______________________________________________________________
+
+BaseRef _HYEvent::toStr (void)
+{
+    _String result ("Event class = ");
+    result = result & eventClass & " code = " & eventCode;
+    return result.makeDynamic();
+}
+
+//______________________________________________________________
+
+BaseObj* _HYEvent::makeDynamic (void)
+{
+    return new _HYEvent (*this);
+}
+
+//______________________________________________________________
+
+void    _HYEvent::Duplicate (BaseObj* ref)
+{
+    _HYEvent* he = (_HYEvent*)ref;
+    eventClass.Duplicate (&he->eventClass);
+    eventCode.Duplicate(&he->eventCode);
+}
+
+//______________________________________________________________
+
+_String& _HYEvent::EventClass (void)
+{
+    return eventClass;
+}
+
+//______________________________________________________________
+
+_String& _HYEvent::EventCode (void)
+{
+    return eventCode;
+}
+
+//______________________________________________________________
+
+_HYRect  makeHYRect (int t,int l,int b,int r,int w)
+{
+    _HYRect res;
+    res.top = t;
+    res.bottom = b;
+    res.left = l;
+    res.right = r;
+    res.width = w;
+    return res;
+
+}
+
+//______________________________________________________________
+
+bool    _HYRect::Contains (int h, int v)
+{
+    return ((h>=left)&&(h<=right)&&(v>=top)&&(v<=bottom));
+}
+
+//______________________________________________________________
+
+long    _HYRect::Width (void)
+{
+    return right-left+1;
+}
+
+//______________________________________________________________
+
+long    _HYRect::Height (void)
+{
+    return bottom-top+1;
+}
+
+
+
+//______________________________________________________________
+
+_String _HYColor::HTMLColor (void)
+{
+    char out[7];
+
+    snprintf (out, 7, "%x%x%x", R, G, B);
+
+    return _String (out);
+}
+
+//______________________________________________________________
+
+bool    _HYColor::operator ==  (_HYColor& c)
+{
+    return ((c.R==R)&&(c.G==G)&&(c.B==B));
+}
+
+//______________________________________________________________
+
+long    HYColorToLong (_HYColor c)
+{
+    return (long)c.R*0x00010000+(long)c.G*0x00000100+(long)c.B;
+}
+
+//______________________________________________________________
+
+_HYColor
+LongToHYColor (long c)
+{
+    _HYColor hc;
+    hc.B = c%256;
+    c=c>>8;
+    hc.G = c%256;
+    c=c>>8;
+    hc.R = c;
+    return hc;
+}
+
+
+
+
+
+//EOF
\ No newline at end of file
diff --git a/src/gui/HYChartWindow.cpp b/src/gui/HYChartWindow.cpp
new file mode 100644
index 0000000..a725a22
--- /dev/null
+++ b/src/gui/HYChartWindow.cpp
@@ -0,0 +1,5004 @@
+/*
+ 
+ HyPhy - Hypothesis Testing Using Phylogenies.
+ 
+ Copyright (C) 1997-now
+ Core Developers:
+ Sergei L Kosakovsky Pond (spond at ucsd.edu)
+ Art FY Poon    (apoon at cfenet.ubc.ca)
+ Steven Weaver (sweaver at ucsd.edu)
+ 
+ Module Developers:
+ Lance Hepler (nlhepler at gmail.com)
+ Martin Smith (martin.audacis at gmail.com)
+ 
+ Significant contributions from:
+ Spencer V Muse (muse at stat.ncsu.edu)
+ Simon DW Frost (sdf22 at cam.ac.uk)
+ 
+ Permission is hereby granted, free of charge, to any person obtaining a
+ copy of this software and associated documentation files (the
+ "Software"), to deal in the Software without restriction, including
+ without limitation the rights to use, copy, modify, merge, publish,
+ distribute, sublicense, and/or sell copies of the Software, and to
+ permit persons to whom the Software is furnished to do so, subject to
+ the following conditions:
+ 
+ The above copyright notice and this permission notice shall be included
+ in all copies or substantial portions of the Software.
+ 
+ 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.
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ 
+ */
+
+/*
+    Chart Window
+
+    Sergei L. Kosakovsky Pond, December 2001
+    Rev                        April 2002,
+                                 Added contrast plot
+                                 Added 3D Plot
+                                 Added Legends and Labels
+                               January 2003
+                                 Added more options to saving
+                                 Added 3D scaled plots
+*/
+
+
+#include "HYChartWindow.h"
+#include "HYLabel.h"
+#include "HYButtonBar.h"
+#include "HYTextBox.h"
+#include "HYUtils.h"
+#include "HYEventTypes.h"
+#include "HYCanvas.h"
+#include "HYDialogs.h"
+#include "parser.h"
+#include "likefunc.h"
+#include "batchlan.h"
+#include "math.h"
+#include "HYButton.h"
+
+#include "HYDataPanel.h"
+
+#ifdef    __HYPHYDMALLOC__
+#include "dmalloc.h"
+#endif
+
+#define     HY_CHART_COLOR_AXIS_LABEL           0
+#define     HY_CHART_COLOR_COORD_LABEL          1
+#define     HY_CHART_COLOR_BACKGROUND           2
+#define     HY_CHART_COLOR_VALUELINE            3
+#define     HY_CHART_COLOR_BARBORDER            4
+#define     HY_CHART_COLOR_LEGEND               5
+#define     HY_CHART_COLOR_OVERPLOT             6
+
+#define     HY_CHART_COLOR_3D_FLOOR             7
+#define     HY_CHART_COLOR_3D_LEFT              8
+#define     HY_CHART_COLOR_3D_BACK              9
+#define     HY_CHART_COLOR_3D_VALUELINE         10
+#define     HY_CHART_COLOR_3D_HISTOGRAM         11
+#define     HY_CHART_COLOR_WINDOW_BACKGROUND    12
+
+#define     HY_CHART_COLOR_OFFSET               13
+
+extern      _SimpleList                         windowObjects;
+
+extern      _HYColor                            tableDefaultBk2,
+            labelBColor,
+            labelFColor,
+            black;
+
+extern      _String                             donotWarnAgain,
+            windowTypeTable,
+            windowTypeDistribTable;
+
+_HYColor            chartColors [HY_CHART_COLOR_COUNT] = {
+    {255*.94, 255*.12, 255*.11 },//(Red)
+    {255*.41, 255*.46, 255*.91 },//(Evening Blue)
+    {255    , 255*.91, 255*.34 },//(Banana)
+    {255*.18, 255*.55, 255*.13 },//(Clover)
+    {255*.55, 255*.38, 255*.21 },//(Dirt)
+    {255*.42, 255*.09, 255*.69 },//(Royal Violet)
+    {255*.09, 255*.29, 255*.51 },//(Sea Blue)
+    {255   ,  255*.57, 255*.09 },//(Orange)
+    {255*.67, 255*.67, 255*.67 },//(Concrete)
+    {255*.85, 255*.27, 255*.42 } //(Carnation)
+};
+
+extern      _Parameter  pi_const;
+
+_List       chartProcessors,
+            distribProcessors;
+
+_String     chartProcessorDataMatrix ("SELECTED_CHART_DATA"),
+            chartProcessorRowMatrix  ("SELECTED_CHART_ROWS"),
+            chartProcessorColMatrix  ("SELECTED_CHART_COLS"),
+            updateCellData           ("UPDATE_CELL_DATA"),
+            updateTableSelection     ("UPDATE_CHART_SELECTION"),
+            tableDimensions          ("CHART_DIMENSIONS"),
+            chartColumnHeaders       ("CHART_COLUMN_HEADERS"),
+            nonEmptyChartSelection   ("NON_EMPTY_SELECTION"),
+            chartColorChange         ("Change chart color"),
+            chartCustomColumnColors  ("_CHART_CUSTOM_COLUMN_COLORS_"),
+
+chartColorLabels        [HY_CHART_COLOR_OFFSET] = {
+    "Axis label",
+    "Coordinate labels",
+    "Chart background",
+    "Value line",
+    "Bar border",
+    "Legend text and border",
+    "Overplot",
+    "3D Floor",
+    "3D Left Wall",
+    "3D Back Wall",
+    "3D Value line",
+    "3D Histogram",
+    "Window Background"
+};
+
+#define     HY_LARGE_COMPONENT_SIZE  10000L
+
+
+
+//__________________________________________________________
+_HYChartWindow::_HYChartWindow (_String name, _List& columns, _Matrix& data, _HYWindow*):_HYTWindow (name, true)
+{
+
+    long            hDim = data.GetHDim();
+
+    _HYRect         canvasSettings =
+    {25,40,25,40,HY_COMPONENT_NO_SCROLL|HY_COMPONENT_BORDER_B};
+
+    _HYLabel*       l1      = new _HYLabel (canvasSettings, GetOSWindowData());
+
+    canvasSettings.left     = 100;
+    canvasSettings.right    = 100;
+    _HYPullDown*    p1      = new _HYPullDown (canvasSettings,GetOSWindowData());
+
+    canvasSettings.left     = 20;
+    canvasSettings.right    = 20;
+    _HYLabel*       l2      = new _HYLabel (canvasSettings,GetOSWindowData());
+    _HYLabel*       l3      = new _HYLabel (canvasSettings,GetOSWindowData());
+
+    canvasSettings.left     = 100;
+    canvasSettings.right    = 100;
+    _HYPullDown*    p2      = new _HYPullDown (canvasSettings,GetOSWindowData());
+    canvasSettings.right    = HY_LARGE_COMPONENT_SIZE;
+    _HYPullDown*    p3      = new _HYPullDown (canvasSettings,GetOSWindowData());
+
+    canvasSettings.top      = HY_CHART_TABLE_HEIGHT+HY_SCROLLER_WIDTH;
+    canvasSettings.bottom   = HY_CHART_TABLE_HEIGHT+HY_SCROLLER_WIDTH;
+
+    canvasSettings.width    = HY_COMPONENT_V_SCROLL|HY_COMPONENT_H_SCROLL;
+    _HYTable*   table       = new _HYTable (canvasSettings,GetOSWindowData(),1,1,100,16,HY_TABLE_STATIC_TEXT);
+
+    canvasSettings.top      = canvasSettings.bottom     = 18;
+    canvasSettings.width    = HY_COMPONENT_NO_SCROLL | HY_COMPONENT_BORDER_T | HY_COMPONENT_BORDER_B;
+
+    _HYTable*   tableHead   = new _HYTable (canvasSettings,GetOSWindowData(),1,1,100,18,HY_TABLE_STATIC_TEXT);
+    canvasSettings.left     = canvasSettings.right = 40;
+    canvasSettings.top      = HY_CHART_TABLE_HEIGHT+HY_SCROLLER_WIDTH;
+    canvasSettings.bottom   = HY_CHART_TABLE_HEIGHT+HY_SCROLLER_WIDTH;
+
+    canvasSettings.width    = HY_COMPONENT_NO_SCROLL|HY_COMPONENT_BORDER_R;
+    _HYTable*   tableLeft   = new _HYTable (canvasSettings,GetOSWindowData(),1,1,40,16,HY_TABLE_STATIC_TEXT);
+
+    table->selectionType    = HY_TABLE_DONT_SIZE|HY_TABLE_DONT_GROW_VERT|HY_TABLE_FOCUSABLE|HY_TABLE_HORZ_STRETCH;
+    tableHead->selectionType= HY_TABLE_DONT_GROW_VERT|HY_TABLE_HORZ_STRETCH;
+    tableLeft->selectionType= HY_TABLE_DONT_SIZE|HY_TABLE_DONT_GROW_VERT;
+
+    canvasSettings.left     = canvasSettings.right  = 40;
+    canvasSettings.top      = canvasSettings.bottom = 18;
+
+    canvasSettings.width    = HY_COMPONENT_NO_SCROLL | HY_COMPONENT_BORDER_T | HY_COMPONENT_BORDER_R | HY_COMPONENT_BORDER_B;
+    _HYLabel*   l4          = new _HYLabel (canvasSettings, GetOSWindowData());
+
+    canvasSettings.left     = 380;
+    canvasSettings.right    = HY_LARGE_COMPONENT_SIZE;
+    canvasSettings.bottom   = HY_LARGE_COMPONENT_SIZE;
+    canvasSettings.top      = HY_CHART_TABLE_HEIGHT;
+
+    canvasSettings.width    = HY_COMPONENT_NO_SCROLL;
+
+    _HYStretchCanvas* cn    = new _HYStretchCanvas (canvasSettings,GetOSWindowData(),200,380,32,HY_SCANVAS_HORIZONTAL|HY_SCANVAS_VERTICAL);
+
+    table->SetMessageRecipient (this);
+    tableHead->SetMessageRecipient (this);
+    tableLeft->SetMessageRecipient (this);
+    p1->SetMessageRecipient (this);
+    p2->SetMessageRecipient (this);
+    p3->SetMessageRecipient (this);
+    cn->SetMessageRecipient (this);
+
+    AddObject (cn);        // 0
+    AddObject (table);     // 1
+    AddObject (tableHead); // 2
+    AddObject (tableLeft); // 3
+    AddObject (p1);        // 4
+    AddObject (p2);        // 5
+    AddObject (p3);        // 6
+    AddObject (l1);        // 7
+    AddObject (l2);        // 8
+    AddObject (l3);        // 9
+    AddObject (l4);        // 10
+
+    SetTableDimensions (4,6);
+
+    SetCell   (HY_CHART_MENU_ROW,0,l1);
+    SetCell   (HY_CHART_MENU_ROW,1,p1);
+    SetCell   (HY_CHART_MENU_ROW,2,l2);
+    SetCell   (HY_CHART_MENU_ROW,3,p2);
+    SetCell   (HY_CHART_MENU_ROW,4,l3);
+    SetCell   (HY_CHART_MENU_ROW,5,p3);
+
+    SetCell   (HY_CHART_CHART_ROW,0,cn);
+    SetCell   (HY_CHART_CHART_ROW,1,cn);
+    SetCell   (HY_CHART_CHART_ROW,2,cn);
+    SetCell   (HY_CHART_CHART_ROW,3,cn);
+    SetCell   (HY_CHART_CHART_ROW,4,cn);
+    SetCell   (HY_CHART_CHART_ROW,5,cn);
+
+    SetCell   (HY_CHART_HEADER_ROW,0,l4);
+    SetCell   (HY_CHART_HEADER_ROW,1,tableHead);
+    SetCell   (HY_CHART_HEADER_ROW,2,tableHead);
+    SetCell   (HY_CHART_HEADER_ROW,3,tableHead);
+    SetCell   (HY_CHART_HEADER_ROW,4,tableHead);
+    SetCell   (HY_CHART_HEADER_ROW,5,tableHead);
+
+    SetCell   (HY_CHART_TABLE_ROW,0,tableLeft);
+    SetCell   (HY_CHART_TABLE_ROW,1,table);
+    SetCell   (HY_CHART_TABLE_ROW,2,table);
+    SetCell   (HY_CHART_TABLE_ROW,3,table);
+    SetCell   (HY_CHART_TABLE_ROW,4,table);
+    SetCell   (HY_CHART_TABLE_ROW,5,table);
+
+
+    p1->SetBackColor (labelBColor);
+    p2->SetBackColor (labelBColor);
+    p3->SetBackColor (labelBColor);
+
+    l1->SetForeColor (labelFColor);
+    l2->SetForeColor (labelFColor);
+    l3->SetForeColor (labelFColor);
+
+    l1->SetBackColor (labelBColor);
+    l2->SetBackColor (labelBColor);
+    l3->SetBackColor (labelBColor);
+
+    _HYFont  labelFont;
+
+#ifdef __WINDOZE__
+    labelFont.face = "Arial";
+    labelFont.size = 14;
+#else
+    labelFont.face = "Geneva";
+    labelFont.size = 10;
+#endif
+
+    labelFont.style = HY_FONT_PLAIN;
+
+    table->SetFont(labelFont);
+    tableHead->SetFont(labelFont);
+    tableLeft->SetFont(labelFont);
+
+#ifdef __WINDOZE__
+    labelFont.size = 14;
+#else
+    labelFont.size = 12;
+#endif
+
+    p1->SetAlignFlags (HY_ALIGN_LEFT);
+    p2->SetAlignFlags (HY_ALIGN_LEFT);
+    p3->SetAlignFlags (HY_ALIGN_LEFT);
+
+    p1->AddMenuItem ("None",-1);
+    p1->AddMenuItem ("Bar Chart",-1);
+    p1->AddMenuItem ("Pie Chart",-1);
+    p1->AddMenuItem ("Scatterplot",-1);
+    p1->AddMenuItem ("Line Plot",-1);
+    p1->AddMenuItem ("Step Plot",-1);
+    p1->AddMenuItem ("Stacked Bars",-1);
+    p1->AddMenuItem ("Contrast Bars",-1);
+    p1->AddMenuItem ("Error Bars",-1);
+    p1->AddMenuItem ("3D Bar Chart",-1);
+    p1->AddMenuItem ("3D Histogram",-1);
+    p1->AddMenuItem ("3D Scatterplot",-1);
+
+
+    p2->EnableMenu  (false);
+    p3->EnableMenu  (false);
+
+    l1->SetAlignFlags (HY_ALIGN_LEFT);
+    l2->SetAlignFlags (HY_ALIGN_LEFT);
+    l3->SetAlignFlags (HY_ALIGN_LEFT);
+
+    l1->SetShadow (true);
+    l2->SetShadow (true);
+    l3->SetShadow (true);
+
+    l1->SetFont (labelFont);
+    l2->SetFont (labelFont);
+    l3->SetFont (labelFont);
+
+    l1->SetText ("Type:");
+    l2->SetText ("X:");
+    l3->SetText ("Y:");
+
+    l4->SetBackColor (tableDefaultBk2);
+
+    backColor1.R = backColor1.G = backColor1.B =
+                                      backColor2.R = backColor2.G = backColor2.B = 255;
+
+    labelFont1.face  = "Times";
+    labelFont1.style = HY_FONT_PLAIN;
+#ifdef __WINDOZE__
+    labelFont1.size = 14;
+#else
+    labelFont1.size = 12;
+#endif
+
+    labelFont2.face  = "Times";
+    labelFont2.style = HY_FONT_PLAIN;
+#ifdef __WINDOZE__
+    labelFont2.size = 12;
+#else
+    labelFont2.size = 10;
+#endif
+
+    labelFont3.face  = "Times";
+    labelFont3.style = HY_FONT_ITALIC;
+#ifdef __WINDOZE__
+    labelFont3.size = 14;
+#else
+    labelFont3.size = 12;
+#endif
+
+    headerFont.face  = "Times";
+    headerFont.style = HY_FONT_ITALIC;
+#ifdef __WINDOZE__
+    labelFont.size = 20;
+#else
+    labelFont.size = 18;
+#endif
+
+    // define default colors
+
+    theColors << HYColorToLong (black);
+    theColors << HYColorToLong (black);
+    theColors << HYColorToLong ((_HYColor) {
+        210,210,210
+    });
+    theColors << HYColorToLong ((_HYColor) {
+        255,255,255
+    });
+    theColors << HYColorToLong (black);
+    theColors << HYColorToLong (black);
+    theColors << HYColorToLong ((_HYColor) {
+        100,100,100
+    });
+
+    theColors << HYColorToLong ((_HYColor) {
+        180,180,180
+    });
+    theColors << HYColorToLong ((_HYColor) {
+        200,200,200
+    });
+    theColors << HYColorToLong ((_HYColor) {
+        220,220,220
+    });
+    theColors << HYColorToLong (black);
+    theColors << HYColorToLong ((_HYColor) {
+        60,60,60
+    });
+    theColors << HYColorToLong ((_HYColor) {
+        255,255,255
+    });
+
+    for (hDim = 0; hDim < HY_CHART_COLOR_COUNT; hDim ++) {
+        theColors << HYColorToLong (chartColors[hDim]);
+    }
+
+    SetTable           (columns,data);
+    SetPosition        (70,70);
+    SetWindowRectangle (0,0,400,400);
+
+    userMin = 0.;
+    userMax = 0.;
+
+    projectionMatrix  = nil;
+
+    showLegend = HY_CHART_LEGEND_NONE;
+
+    xyAngle = pi_const/2.4;
+    zAngle  = pi_const/4;
+    oR = 10;
+    ComputeProjectionSettings ();
+    xScale = 1.;
+    yScale = 1.;
+    xShift = 0.;
+    yShift = 0.;
+
+    xAxis3DScale = -1;
+    yAxis3DScale = -1;
+    surfaceDivs  = 16;
+
+    projectionMatrix = ComputeProjectionMatrix();
+    suspendDraw      = false;
+
+
+    if (chartProcessors.lLength==0) {
+        ReadChartProcessors ();
+    }
+
+    DeleteObject (table);
+    DeleteObject (tableHead);
+    DeleteObject (tableLeft);
+    DeleteObject (l1);
+    DeleteObject (l2);
+    DeleteObject (l3);
+    DeleteObject (l4);
+    DeleteObject (p1);
+    DeleteObject (p2);
+    DeleteObject (p3);
+    DeleteObject (cn);
+}
+
+//__________________________________________________________
+_HYChartWindow::~_HYChartWindow()
+{
+    if (projectionMatrix) {
+        DeleteObject (projectionMatrix);
+    }
+}
+
+//__________________________________________________________
+
+void    _HYChartWindow::ComputeProjectionSettings (void)
+{
+    projectionSettings[0] = oR*sin(zAngle)*cos(xyAngle);
+    projectionSettings[1] = oR*sin(zAngle)*sin(xyAngle);
+    projectionSettings[2] = -oR*cos(zAngle);
+    projectionSettings[3] = -projectionSettings[0]/oR;
+    projectionSettings[4] = -projectionSettings[1]/oR;
+    projectionSettings[5] = -projectionSettings[2]/oR;
+    projectionSettings[6] = oR;
+}
+
+
+//__________________________________________________________
+
+void    _HYChartWindow::SetColumnHeaders (_List& h)
+{
+    _HYTable* th = (_HYTable*)GetObject (2),
+              * t  = (_HYTable*)GetObject (1);
+
+    if (h.lLength >= th->horizontalSpaces.lLength) {
+        for (long k=0; k<th->horizontalSpaces.lLength; k++) {
+            th->SetCellData (h(k),0,k,HY_TABLE_EDIT_TEXT|HY_TABLE_BEVELED|HY_TABLE_BOLD,true);
+        }
+
+        th->AutoFitWidth (*t);
+
+        if (h.lLength ==  th->horizontalSpaces.lLength+1) {
+            _String * rowHeaders = (_String*)h(th->horizontalSpaces.lLength);
+            _List   * split      = rowHeaders->Tokenize (";");
+            SetRowHeaders   (*split);
+            DeleteObject (split);
+        }
+    }
+
+    t->_MarkForUpdate();
+    th->_MarkForUpdate();
+    SetPullDowns (h);
+}
+
+//__________________________________________________________
+
+void    _HYChartWindow::SetDataMatrix (_Matrix& h)
+{
+    _HYTable* th = (_HYTable*)GetObject (2),
+              * t  = (_HYTable*)GetObject (1);
+
+    if ((h.GetVDim() >= th->horizontalSpaces.lLength)&&(h.GetHDim() >= t->verticalSpaces.lLength)) {
+        _Matrix * numberMatrix = (_Matrix*)h.ComputeNumeric();
+        for (long k=0; k<th->horizontalSpaces.lLength; k++)
+            for (long j=0; j<t->verticalSpaces.lLength; j++) {
+                _String cellData ((*numberMatrix)(j,k));
+                th->SetCellData (&cellData,j,k,HY_TABLE_EDIT_TEXT,true);
+            }
+        t->AutoFitWidth (*th);
+    }
+    t->_MarkForUpdate();
+    th->_MarkForUpdate();
+}
+
+//__________________________________________________________
+
+bool    _HYChartWindow::SetUserBounds (_Parameter minY, _Parameter maxY, bool redraw)
+{
+    bool changed = false;
+    if (!CheckEqual (minY, userMin)) {
+        changed = true;
+        userMin = minY;
+    }
+    if (!CheckEqual (maxY, userMax)) {
+        changed = true;
+        userMax = maxY;
+    }
+
+    if (!CheckEqual (userMin, userMax)) {
+        if (userMax < userMin) {
+            changed = true;
+            userMax = userMin + 1.;
+        }
+    }
+
+    if (changed && redraw) {
+        DrawChart ();
+    }
+
+    return changed;
+}
+
+//__________________________________________________________
+
+void    _HYChartWindow::SetRowHeaders (_List& l)
+{
+    _HYTable* tl = (_HYTable*)GetObject (3);
+
+    _String   space (" ");
+
+    if (l.lLength == tl->verticalSpaces.lLength) {
+        for (long k=1; k<l.lLength; k++) {
+            _String* rowHeader = (_String*)l(k);
+            if (rowHeader->sLength==0) {
+                rowHeader = &space;
+            }
+
+            tl->SetCellData (rowHeader,k-1,0,tl->cellTypes[k-1],true);
+        }
+
+        _HYLabel* l4 = (_HYLabel*)GetObject   (10);
+        l4->SetAlignFlags (HY_ALIGN_LEFT);
+        _HYFont hFont = tl->textFont;
+        hFont.style = HY_FONT_BOLD;
+        l4->SetFont (hFont);
+        _String* rowHeader = (_String*)l(0);
+        l4->SetText (*rowHeader);
+#ifdef __WINDOZE__
+        l4->SetAlignFlags (HY_ALIGN_BOTTOM);
+#endif
+        // now compute new dimensions
+
+        _HYRect     labelSize = l4->_SuggestDimensions();
+        tl->AutoFitColumn (0, false, false);
+
+        long        newWidth = tl->GetColumnSpacing(0);
+
+        if (labelSize.right > newWidth) {
+            tl->SetColumnSpacing (0,labelSize.right-newWidth,false);
+            newWidth = labelSize.right;
+        }
+
+        l4->settings.left = l4->settings.right = newWidth;
+        tl->settings.left = tl->settings.right = newWidth;
+
+        _HYRect         windowRect = GetWindowRect();
+
+        SetWindowRectangle (windowRect.top, windowRect.left, windowRect.bottom, windowRect.right);
+    }
+}
+
+//__________________________________________________________
+
+void    _HYChartWindow::SetTable (_List& l, _Matrix& h)
+{
+    _HYTable* th = (_HYTable*)GetObject (2),
+              * t  = (_HYTable*)GetObject (1),
+                * tl = (_HYTable*)GetObject (3);
+
+    SetUserBounds ();
+
+    if (((h.GetVDim() == l.lLength)||(h.GetVDim()+1 == l.lLength))&&(h.GetHDim() >= 1)&&(l.lLength>=1)) {
+        long      cC = h.GetVDim();
+        _Matrix * n = (_Matrix*)h.ComputeNumeric();
+
+        if (terminateExecution) {
+            terminateExecution = false;
+            _String errMsg ("Matrix evaluation failed in 'SetTable'.");
+            ProblemReport (errMsg);
+            return;
+        }
+
+        th->ClearTable(true);
+        tl->ClearTable();
+        t->ClearTable (true);
+
+        long k;
+
+        for (k=0; k<cC; k++) {
+            th->AddColumn   (-1,40,HY_TABLE_STATIC_TEXT);
+            t->AddColumn   (-1,40,HY_TABLE_STATIC_TEXT);
+        }
+
+        th->AddRow (-1,18,HY_TABLE_STATIC_TEXT);
+        for (k=0; k<cC; k++) {
+            th->SetCellData (l(k),0,k,HY_TABLE_EDIT_TEXT|HY_TABLE_BEVELED|HY_TABLE_BOLD,true);
+        }
+
+        th->AutoFitWidth();
+        //th->SetColumnSpacing (cC-1,HY_LARGE_COMPONENT_SIZE-th->GetColumnSpacing (cC-1),false);
+
+        for (k=0; k<h.GetHDim(); k++) {
+            _String cellData (k+1);
+            tl->AddRow (-1,16,HY_TABLE_STATIC_TEXT);
+            tl->SetCellData (&cellData,k,0,HY_TABLE_STATIC_TEXT|HY_TABLE_BEVELED|HY_TABLE_BOLD,true);
+            /*t->AddRow (-1,16,HY_TABLE_STATIC_TEXT);
+            for (j=0; j<cC; j++)
+            {
+                cellData = (*n)(k,j);
+                t->SetCellData (&cellData,k,j,HY_TABLE_EDIT_TEXT,true);
+            }*/
+        }
+        t->SetTableFromMx (n,16,40,HY_TABLE_EDIT_TEXT);
+        t->AutoFitWidth (*th);
+
+        //t->SetColumnSpacing (cC-1,HY_LARGE_COMPONENT_SIZE-t->GetColumnSpacing(cC-1),false);
+        //th->SetColumnSpacing (cC-1,HY_LARGE_COMPONENT_SIZE-th->GetColumnSpacing(cC-1),false);
+
+        t->EnforceWidth  (componentR.lData[1]-componentL.lData[1]+1-HY_SCROLLER_WIDTH, 0x7fffffff,true);
+        th->EnforceWidth (componentR.lData[2]-componentL.lData[2]+1, 0x7fffffff,true);
+
+        t->EnforceHeight(HY_CHART_TABLE_HEIGHT,0x7fffffff);
+        tl->EnforceHeight(HY_CHART_TABLE_HEIGHT,0x7fffffff);
+        tl->AddRow (-1,HY_SCROLLER_WIDTH,HY_TABLE_STATIC_TEXT);
+        t->_MarkForUpdate();
+        tl->_MarkForUpdate();
+        th->_MarkForUpdate();
+        SetPullDowns (l);
+
+        if (l.lLength > cC) {
+            _String * rowHeaders = (_String*)l(cC);
+            _List   * split      = rowHeaders->Tokenize (";");
+            SetRowHeaders   (*split);
+            DeleteObject (split);
+        }
+    }
+}
+
+
+//__________________________________________________________
+
+void    _HYChartWindow::SetPullDowns (_List& l)
+{
+    _HYTable* t  = (_HYTable*)GetObject (1);
+
+    _HYPullDown* p2 = (_HYPullDown*)GetObject (5),
+                 * p3 = (_HYPullDown*)GetObject (6);
+
+    p2->DeleteAllItems();
+    p3->DeleteAllItems();
+
+    p2->AddMenuItem     ("Index",-1);
+    p3->AddMenuItem     ("None",-1);
+
+    long        upto = t->horizontalSpaces.lLength;
+
+    for (long k=0; k<upto; k++) {
+        p2->AddMenuItem (*((_String*)l(k)),-1);
+        p3->AddMenuItem (*((_String*)l(k)),-1);
+    }
+}
+//__________________________________________________________
+
+void    _HYChartWindow::SetYPullDown (void)
+{
+    _HYPullDown* p3 = (_HYPullDown*)GetObject (6);
+
+    long f = p3->MenuItemCount(),
+         k;
+
+    for (k=1; k<f; k++) {
+        p3->_SetMenuItemTextStyle (k,HY_FONT_PLAIN);
+        _String itemText = * p3->GetMenuItem (k);
+        long g = itemText.FindBackwards (" [",0,-1);
+        if (g>=0) {
+            itemText.Trim (0,g-1);
+            p3->SetMenuItem (itemText,k);
+        }
+    }
+
+    if (ySeries.lLength) {
+        for (k=0; k<ySeries.lLength; k++) {
+            p3->_SetMenuItemTextStyle (ySeries.lData[k]+1,HY_FONT_ITALIC);
+            _String itemText = * p3->GetMenuItem (ySeries.lData[k]+1);
+
+            itemText = itemText & " [" & (long)(k+1) & ']';
+            p3->SetMenuItem (itemText,ySeries.lData[k]+1);
+        }
+        p3->ChangeSelection (ySeries.lData[0]+1,false);
+    } else {
+        p3->ChangeSelection (0,false);
+    }
+}
+
+//__________________________________________________________
+
+void    _HYChartWindow::SetChartType (_String t1, _String t2, _String t3, bool doDraw)
+{
+    _HYPullDown* p1 = (_HYPullDown*)GetObject (4);
+    _HYPullDown* p2 = (_HYPullDown*)GetObject (5);
+    _HYPullDown* p3 = (_HYPullDown*)GetObject (6);
+
+    _List   *ySer = t3.Tokenize(";");
+
+    _String* ySerV = (_String*)(*ySer)(0);
+
+    long     f3 = p3->FindMenuItem (*ySerV),
+             f2 = p2->FindMenuItem (t2),
+             f1 = p1->FindMenuItem (t1);
+
+    suspendDraw = true;
+    if ((f1>=0)&&(f2>=0)&&(f3>=0)) {
+        ySeries.Clear();
+        p3->ChangeSelection (f3,true);
+        p2->ChangeSelection (f2,true);
+        p1->ChangeSelection (f1,true);
+    }
+
+    for (long k=1; k<ySer->lLength; k++) {
+        ySerV = (_String*)(*ySer)(k);
+        f3 = p3->FindMenuItem (*ySerV);
+        if (f3>=0) {
+            p3->ChangeSelection (f3,true);
+        }
+    }
+
+    DeleteObject (ySer);
+    suspendDraw = false;
+    if (doDraw) {
+        DrawChart    ();
+    }
+}
+
+
+//__________________________________________________________
+
+bool    _HYChartWindow::ProcessEvent (_HYEvent* e)
+{
+    _String firstArg,
+            secondArg,
+            thirdArg;
+    long    k,i,f;
+
+    bool    done = false;
+
+    if (e->EventClass()==_hyScrollingEvent) {
+        firstArg = e->EventCode().Cut (0,(f=e->EventCode().Find(','))-1);
+        long g = e->EventCode().Find(',',f+1);
+        if (g>=0) {
+            k = firstArg.toNum();
+            for (i=0; i<components.lLength; i++) {
+                if (((_HYGuiObject*)components(i))->MatchID(k)) {
+                    break;
+                }
+            }
+            _HYTable* theTable = nil;
+            if ((i==1)||(i==3)) {
+                firstArg = e->EventCode().Cut (g+1,-1);
+                k = firstArg.toNum();
+                if (k) {
+                    theTable    = (_HYTable*) ((i==1)?GetObject(3):
+                                               GetObject(1));
+                    theTable->SetMessageRecipient (nil);
+                    theTable->ProcessEvent (generateScrollEvent (0,k));
+                } else if (i==1) {
+                    firstArg = e->EventCode().Cut (f+1,g-1);
+                    k = firstArg.toNum();
+                    if (k) {
+                        theTable    = (_HYTable*) GetObject(2);
+                        theTable->SetMessageRecipient (nil);
+                        theTable->ProcessEvent (generateScrollEvent (k,0));
+                    }
+                }
+                done = true;
+            } else if (i==2) {
+                firstArg = e->EventCode().Cut (f+1,g-1);
+                k = firstArg.toNum();
+                if (k) {
+                    theTable    = (_HYTable*)     GetObject  (1);
+                    theTable->ProcessEvent (generateScrollEvent (k,0));
+                    theTable->SetMessageRecipient (nil);
+                }
+                done = true;
+            }
+            if (theTable) {
+                theTable->SetMessageRecipient (this);
+            }
+        }
+    } else if (e->EventClass()==_hyTableResizeCEvent) {
+        firstArg = e->EventCode().Cut (0,(f=e->EventCode().Find(','))-1);
+        k = firstArg.toNum();
+        for (i=0; i<components.lLength; i++) {
+            if (((_HYGuiObject*)components(i))->MatchID(k)) {
+                break;
+            }
+        }
+        if (i==2) {
+            firstArg = e->EventCode().Cut (f+1,-1);
+            f = firstArg.Find(',');
+            k = firstArg.Cut(f+1,-1).toNum(); // shift
+            f = firstArg.Cut(0,f-1).toNum();  // column
+            _HYTable*     table = (_HYTable*)     GetObject  (1);
+            table->SetColumnSpacing (f,k,true);
+            dim = MinMaxWindowDimensions ();
+            done = true;
+        }
+    } else if (e->EventClass()==_hyTableChangeSelEvent) {
+        k = e->EventCode().toNum();
+        for (i=0; i<components.lLength; i++) {
+            if (((_HYGuiObject*)components(i))->MatchID(k)) {
+                break;
+            }
+        }
+
+        done = true;
+
+        _HYTable* t1 = (_HYTable*)GetObject (1),
+                  * t2 = (_HYTable*)GetObject (3),
+                    * t3 = (_HYTable*)GetObject (2);
+
+        if ((i==2)||(i==3)) {
+            _SimpleList tSel, tSel2;
+            t2->GetSelection (tSel);
+            t3->GetSelection (tSel2);
+            if (tSel.lLength||tSel2.lLength) {
+                if (i==3) {
+                    t3->ClearSelection();
+                    t2->SetMessageRecipient (nil);
+                    t1->SetRowSelection(tSel);
+                    t2->SetMessageRecipient (this);
+                } else {
+                    t2->ClearSelection();
+                    t2->SetMessageRecipient (nil);
+                    t1->SetColumnSelection(tSel2);
+                    t2->SetMessageRecipient (this);
+                }
+            }
+        } else {
+            if (i==1) {
+                if (t2->messageRecipient) {
+                    t2->ClearSelection();
+                    t3->ClearSelection();
+                }
+                _SimpleList newSelection;
+                t1->GetSelection (newSelection);
+            }
+        }
+    } else if (e->EventClass()==_hyMenuSelChangeEvent) {
+        firstArg = e->EventCode().Cut (0,(f=e->EventCode().Find(','))-1);
+        k = firstArg.toNum();
+        for (i=0; i<components.lLength; i++) {
+            if (((_HYGuiObject*)components(i))->MatchID(k)) {
+                break;
+            }
+        }
+        k = e->EventCode().Cut (f+1,-1).toNum();
+        if (i==4) {
+            HandleChartTypeChange (k);
+            done = true;
+        } else {
+            if (i==6) {
+                _HYPullDown* p3 = (_HYPullDown*)GetObject (6);
+                f = p3->MenuItemCount();
+                if (k) {
+                    i = ySeries.Find (k-1);
+                    if (i<0) {
+                        ySeries << k-1;
+                    } else {
+                        ySeries.Delete (i);
+                    }
+                } else {
+                    ySeries.Clear();
+                }
+                SetYPullDown();
+            }
+            DrawChart ();
+            done = true;
+        }
+    } else if (e->EventClass()==_hyRebuildSCanvasEvent) {
+        k = e->EventCode().toNum();
+        for (i=0; i<components.lLength; i++) {
+            if (((_HYGuiObject*)components(i))->MatchID(k)) {
+                break;
+            }
+        }
+        if (i==0) {
+            DrawChart();
+        }
+
+        done = true;
+    } else if (e->EventClass()==_hyTableEditCellEvent) {
+        firstArg = e->EventCode().Cut (0,(f=e->EventCode().Find(','))-1);
+        k = firstArg.toNum();
+        for (i=0; i<components.lLength; i++) {
+            if (((_HYGuiObject*)components(i))->MatchID(k)) {
+                break;
+            }
+        }
+        if (i==1) {
+            firstArg        = e->EventCode().Cut (f+1,-1);
+            HandleCellEditEvent (firstArg.toNum());
+            done = true;
+        } else if (i==2) {
+            // update the pulldown menu as well
+            _HYTable    *header = (_HYTable*)GetObject    (2);
+            _HYPullDown *p2     = (_HYPullDown*)GetObject (5);
+            _HYPullDown *p3     = (_HYPullDown*)GetObject (6);
+
+            k = e->EventCode().Cut (f+1,-1).toNum();
+
+            _String*    newName  = (_String*)header->GetCellData(k,0),
+                        menuItem = *p3->GetMenuItem(k+1),
+                        appendix;
+
+            if (menuItem.sLength>3) {
+                if (menuItem.sData[menuItem.sLength-1] == ']') {
+                    f = menuItem.FindBackwards ("[",0,menuItem.sLength-2);
+                    if (f>=0) {
+                        appendix = _String(" ") & menuItem.Cut (f,-1);
+                    }
+                }
+            }
+
+            p2->SetMenuItem (*newName,k+1);
+            p2->_MarkForUpdate();
+            menuItem = *newName & appendix;
+            p3->SetMenuItem (menuItem,k+1);
+            p3->_MarkForUpdate();
+            if (showLegend!=HY_CHART_LEGEND_NONE) {
+                DrawChart();
+            }
+
+            done = true;
+        }
+    }
+
+    /*else
+        if (e->EventClass()==_hyMenuOpenEvent)
+        {
+            k = e->EventCode().toNum();
+            for (i=0;i<components.lLength;i++)
+            {
+                if (((_HYGuiObject*)components(i))->MatchID(k))
+                    break;
+            }
+            if (i==3)
+            {
+                PrepareLFMenu();
+                done = true;
+            }
+        }
+        */
+    if (done) {
+        DeleteObject (e);
+        return true;
+    }
+    return _HYTWindow::ProcessEvent(e);
+}
+
+//__________________________________________________________
+
+void    _HYChartWindow::HandleChartTypeChange (long type)
+{
+    _HYPullDown         *p2 = (_HYPullDown*)GetObject (5),
+                         *p3 = (_HYPullDown*)GetObject (6);
+
+    p2->EnableMenu      (type&&(type<=8));
+    p3->EnableMenu      (type&&(type!=2));
+
+    DrawChart           ();
+}
+
+//__________________________________________________________
+
+void    _HYChartWindow::DrawLegend (_HYRect & plotRect, long chartType, bool isPie)
+{
+    if ((showLegend != HY_CHART_LEGEND_NONE) && chartType&& (chartType!=2 || isPie ) && (ySeries.lLength || isPie)) {
+        // compute the size of the legend box
+
+        _HYStretchCanvas    *sc = (_HYStretchCanvas*)GetObject (0);
+        sc->SetFont (labelFont2);
+
+        long  legendWidth  = (labelFont2.size*5)/2,
+              legendHeight = (3*ySeries.lLength*labelFont2.size)/2,
+              k,
+              m,
+              s;
+
+        _HYTable            *th  = (_HYTable*)GetObject (isPie?3:2);
+        _List seriesLabels;
+
+        if (isPie) {
+            legendHeight = (3*(th->verticalSpaces.lLength-1)*labelFont2.size)/2;
+            for (k=0; k<th->verticalSpaces.lLength-1; k++) {
+                seriesLabels << th->GetCellData (0,k);
+            }
+        } else
+            for (k=0; k<ySeries.lLength; k++) {
+                seriesLabels << th->GetCellData (ySeries.lData[k],0);
+            }
+
+        m = 0;
+        for (k=0; k<seriesLabels.lLength; k++) {
+            s = GetVisibleStringWidth (*(_String*)seriesLabels(k), labelFont2);
+            if (s>m) {
+                m = s;
+            }
+        }
+
+        legendWidth += m;
+
+        _HYRect     legendBox,
+                    shrunkPlot = plotRect;
+
+        switch (showLegend) {
+        case HY_CHART_LEGEND_TOP_LEFT:
+            legendBox.left   = plotRect.left+5;
+            legendBox.top    = 5;
+            shrunkPlot.left += legendWidth+5;
+            break;
+
+        case HY_CHART_LEGEND_TOP_MID:
+            legendBox.left   = (plotRect.right+plotRect.left-legendWidth)/2;
+            legendBox.top    = 5;
+            shrunkPlot.top  += legendHeight+5;
+            break;
+
+        case HY_CHART_LEGEND_TOP_RIGHT:
+            legendBox.left   = plotRect.right-5-legendWidth;
+            legendBox.top    = 5;
+            shrunkPlot.right-= legendWidth+5;
+            break;
+
+        case HY_CHART_LEGEND_BOT_LEFT:
+            legendBox.left   = plotRect.left+5;
+            legendBox.top    = plotRect.bottom-5-legendWidth;
+            shrunkPlot.left += legendWidth+5;
+            break;
+
+        case HY_CHART_LEGEND_BOT_MID:
+            legendBox.left   = (plotRect.right+plotRect.left-legendWidth)/2;
+            legendBox.top    = plotRect.bottom-5-legendWidth;
+            shrunkPlot.bottom -= legendHeight+5;
+            break;
+
+        case HY_CHART_LEGEND_BOT_RIGHT:
+            legendBox.left   = plotRect.right-5-legendWidth;
+            legendBox.top    = plotRect.bottom-5-legendWidth;
+            shrunkPlot.right-= legendWidth+5;
+            break;
+
+        case HY_CHART_LEGEND_MID_LEFT:
+            legendBox.left   = plotRect.left+5;
+            legendBox.top    = (plotRect.bottom+plotRect.top-legendHeight)/2;
+            shrunkPlot.left += legendWidth+5;
+            break;
+
+        case HY_CHART_LEGEND_MID_RIGHT:
+            legendBox.left   = plotRect.right-5-legendWidth;
+            legendBox.top    = (plotRect.bottom+plotRect.top-legendHeight)/2;
+            shrunkPlot.right-= legendWidth+5;
+            break;
+        }
+
+        legendBox.right  = legendBox.left +  legendWidth;
+        legendBox.bottom = legendBox.top  +  legendHeight;
+        legendBox.width = 1;
+
+        if ((shrunkPlot.right-shrunkPlot.left<100)||(shrunkPlot.bottom-shrunkPlot.top<100)) {
+            sc->DisplayText ("Can't display legend - the chart is too small",labelFont2.size+2,2,true);
+            return;
+        }
+
+        plotRect = shrunkPlot;
+
+        _HYColor blk =  LongToHYColor(theColors[HY_CHART_COLOR_LEGEND]);
+
+        sc->SetColor (blk);
+        sc->DrawRect (legendBox);
+
+        m = legendBox.left + labelFont2.size/4;
+        s = legendBox.top  + (labelFont2.size*5)/4;
+
+        for (k=0; k<seriesLabels.lLength; k++) {
+            legendBox.left      = m;
+            legendBox.bottom    = s;
+            legendBox.right     = m+labelFont2.size;
+            legendBox.top       = s-labelFont2.size;
+
+            sc->SetColor (LongToHYColor(theColors[HY_CHART_COLOR_OFFSET+k%HY_CHART_COLOR_COUNT]));
+            if (chartType != 3) {
+                sc->FillRect (legendBox);
+                sc->SetColor (blk);
+                sc->DrawRect (legendBox);
+            } else {
+                switch (k) {
+                case 1:
+                case 5: {
+                    _SimpleList diamond;
+                    diamond << legendBox.left;
+                    diamond << legendBox.top+labelFont2.size/2;
+                    diamond << legendBox.left+labelFont2.size/2;
+                    diamond << legendBox.top;
+                    diamond << legendBox.right;
+                    diamond << legendBox.top+labelFont2.size/2;
+                    diamond << legendBox.left+labelFont2.size/2;
+                    diamond << legendBox.bottom;
+                    if (k==5) {
+                        sc->FillPolygon (diamond);
+                    } else {
+                        sc->DrawPolygon (diamond);
+                    }
+                    break;
+                }
+                case 2: {
+                    sc->DrawRect (legendBox);
+                    break;
+                }
+                case 3: {
+                    sc->FillOval (legendBox);
+                    break;
+                }
+                case 4: {
+                    sc->FillRect (legendBox);
+                    break;
+                }
+                default: {
+                    sc->DrawOval (legendBox);
+                    break;
+                }
+                }
+
+            }
+
+            sc->DisplayText (*(_String*)seriesLabels(k),s-labelFont2.size/4,m+2*labelFont2.size,true);
+
+            s += (labelFont2.size*3)/2;
+        }
+
+    }
+}
+
+//__________________________________________________________
+
+void    _HYChartWindow::DrawChart (_HYRect * printRect)
+{
+    if (suspendDraw) {
+        return;
+    }
+
+    _HYPullDown         *p2 = (_HYPullDown*)GetObject (5),
+                         *p1 = (_HYPullDown*)GetObject (4);
+    _HYStretchCanvas    *sc = (_HYStretchCanvas*)GetObject (0);
+    _HYRect             plotRect;
+
+    if (!printRect) {
+        sc->StartDraw();
+        sc->EraseAll();
+        plotRect = sc->GetCanvasSize();
+    } else {
+        plotRect = *printRect;
+    }
+
+
+    long    mc = p1->GetSelection();
+
+    sc->SetColor (LongToHYColor (theColors[HY_CHART_COLOR_WINDOW_BACKGROUND]));
+    sc->FillRect (plotRect);
+
+    DrawLegend   (plotRect,mc);
+    sc->SetColor ((_HYColor) {
+        0,0,0
+    });
+    _HYFont      bailOut;
+
+    bailOut.face  = "System Font";
+    bailOut.size  = 10;
+    bailOut.style = HY_FONT_PLAIN;
+
+    sc->SetFont (bailOut);
+
+    switch  (mc) {
+    case 1:
+    case 3:
+    case 4:
+    case 5:
+    case 6:
+    case 7:
+    case 8: {
+        _SimpleList      choices;
+        choices << p2->GetSelection()-1;
+        choices << ySeries;
+        GenerateBarChart        (choices,plotRect,(mc>=3)?mc-2:0);
+        break;
+    }
+    case 2:
+        GeneratePieChart (p2->GetSelection(),plotRect);
+        break;
+
+    case 9:
+    case 10:
+    case 11: {
+        _SimpleList      choices;
+        choices << ySeries;
+        Generate3DChart         (choices,plotRect,mc-9);
+        break;
+    }
+
+    }
+
+    if (!printRect) {
+        sc->EndDraw ();
+        sc->_MarkForUpdate();
+    }
+}
+
+//__________________________________________________________
+
+void    _HYChartWindow::GeneratePieChart (long source, _HYRect plotRect)
+{
+    _HYTable            *t  = (_HYTable*)GetObject (1);
+    _HYStretchCanvas    *sc = (_HYStretchCanvas*)GetObject (0);
+
+    DrawLegend   (plotRect,2,true);
+
+    long        k, dividerR = 1, dividerG = 1, dividerB = 1;
+    _Matrix     numbers (1,t->verticalSpaces.lLength,false,true);
+    _Parameter   startAngle = 0.,
+                 endAngle   = 0.;
+
+    if  (source)
+        for (k=0; k<numbers.GetVDim(); k++) {
+            numbers.theData [k] = ((_String*)t->GetCellData (source-1,k))->toNum();
+            endAngle += numbers.theData [k];
+        }
+    else
+        for (k=0; k<numbers.GetVDim(); k++) {
+            numbers.theData [k] = k+1;
+            endAngle += numbers.theData [k];
+        }
+
+    numbers *= (360./endAngle);
+
+    _HYRect      chartRect  = {plotRect.top+20,plotRect.left+20,plotRect.bottom-20,plotRect.right-20,3};
+
+    sc->SetColor (LongToHYColor(theColors[HY_CHART_COLOR_BARBORDER]));
+    sc->DrawOval (chartRect);
+
+    chartRect.width = 2;
+
+    for    (k=0; k<numbers.GetVDim(); k++) {
+        if (k&&(k%HY_CHART_COLOR_COUNT==0))
+            switch ((k/HY_CHART_COLOR_COUNT)%3) {
+            case 0:
+                dividerR *= 2;
+                break;
+            case 1:
+                dividerB *=2;
+                break;
+            case 2:
+                dividerG *=2;
+                break;
+            }
+
+        _HYColor    currentColor = LongToHYColor(theColors[HY_CHART_COLOR_OFFSET+k%HY_CHART_COLOR_COUNT]);
+
+        currentColor.R /= dividerR;
+        currentColor.B /= dividerB;
+        currentColor.G /= dividerG;
+
+        sc->SetColor (currentColor);
+        sc->FillArc  (chartRect, startAngle, ceil(numbers.theData[k]));
+        startAngle += numbers.theData[k];
+    }
+
+    sc->SetColor (LongToHYColor(theColors[HY_CHART_COLOR_BARBORDER]));
+    sc->DrawOval (chartRect);
+}
+
+//__________________________________________________________
+
+void    _HYChartWindow::Generate3DChart (_SimpleList& columns, _HYRect plotRect, char options)
+{
+    _HYStretchCanvas    *sc = (_HYStretchCanvas*)GetObject (0);
+
+    _HYTable            *t  = (_HYTable*)GetObject (1);
+
+    long                k,
+                        j,
+                        m = t->verticalSpaces.lLength,
+                        counter,
+                        lS;
+
+    _Parameter          minY,
+                        maxY,
+                        x,
+                        yTick,
+                        ySc,
+                        tp,
+                        x3Dtick = -1.,
+                        y3Dtick = -1.,
+                        x3DMax  = 0.,
+                        y3DMax  = 0.;
+
+    _String             label;
+
+    _SimpleList         cache;
+
+    _Matrix             xSpacing (1,options<2?columns.lLength:2,false,true),
+                        ySpacing (1,options<2?m:2,false,true);
+
+    if (options == 2 && columns.lLength != 3) {
+        label = "Choose exactly 3 columns (X,Y,Value) to produce a 3D histogram.";
+        sc->DisplayText (label,15,10,true);
+        return;
+    } else if (columns.lLength == 0) {
+        label = "Choose some data from the 'Y' menu to plot.";
+        sc->DisplayText (label,15,10,true);
+        return;
+    }
+
+    _Matrix             numbers (columns.lLength,m,false,true),
+                        unitCube (8,4,false,true),
+                        *projP;
+
+    for (j=0; j<columns.lLength; j++)
+        for (k=0; k<m; k++) {
+            numbers.theData [j*m+k] = ((_String*)t->GetCellData (columns.lData[j],k))->toNum();
+        }
+
+
+    // determine the range of the plot
+    minY        = 1e100;
+    maxY        = -1e100;
+    if (options == 2) {
+        xSpacing.theData[0] = 1.e100;
+        xSpacing.theData[1] =-1.e100;
+
+        for (j=0; j<m; j++) {
+            x = numbers.theData [j];
+
+            if (x>xSpacing.theData[1]) {
+                xSpacing.theData[1] = x;
+            }
+            if (x<xSpacing.theData[0]) {
+                xSpacing.theData[0] = x;
+            }
+
+            x = numbers.theData [m+j];
+
+            if (x>xSpacing.theData[1]) {
+                xSpacing.theData[1] = x;
+            }
+            if (x<xSpacing.theData[0]) {
+                xSpacing.theData[0] = x;
+            }
+
+            x = numbers.theData [2*m+j];
+
+            if (x>maxY) {
+                maxY = x;
+            }
+            if (x<minY) {
+                minY = x;
+            }
+        }
+
+        if (xSpacing.theData[0] == xSpacing.theData[1]) {
+            xSpacing.theData[1] = xSpacing.theData[0]+0.001;
+        }
+
+        ySpacing.theData[0] = xSpacing.theData[0];
+        ySpacing.theData[1] = xSpacing.theData[1];
+    } else
+        for         (k=0; k<m; k++) {
+            if (options==0)
+                for (j=0; j<columns.lLength; j++) {
+                    x = numbers.theData [j*m+k];
+
+                    if (x>maxY) {
+                        maxY = x;
+                    }
+                    if (x<minY) {
+                        minY = x;
+                    }
+                }
+            else {
+                x = 0;
+                for (j=0; j<columns.lLength; j++) {
+                    x += numbers.theData [j*m+k];
+                }
+                if (x>maxY) {
+                    maxY = x;
+                }
+                if (x<minY) {
+                    minY = x;
+                }
+            }
+        }
+
+    if (options==1)
+        for         (k=0; k<columns.lLength; k++) {
+            x = 0;
+            for (j=0; j<m; j++) {
+                x += numbers.theData [k*m+j];
+            }
+
+            if (x>maxY) {
+                maxY = x;
+            }
+            if (x<minY) {
+                minY = x;
+            }
+        }
+
+    if ((minY<0)||(maxY<0)) {
+        label = "Negative valued data can't be properly represented by this charting option.";
+        sc->DisplayText (label,15,10,true);
+        return;
+    }
+
+
+    if ((minY>0)&&(maxY>0)) {
+        minY = 0.0;
+    }
+
+    if  (maxY==minY) {
+        maxY = minY+1.;
+    }
+
+    yTick = (maxY-minY);
+
+    if (yTick>0.0) {
+        yTick = pow (10,floor(log (yTick)/log (10.)));
+        while ((maxY-minY)/yTick<2) {
+            yTick /= 2.;
+        }
+    }
+
+
+
+    plotRect.top    += 17;
+    plotRect.bottom -= (3*labelFont1.size)/2;
+    plotRect.right  -= 10;
+
+    if (minY<0.0) {
+        x = - floor (-minY/yTick) * yTick;
+    } else {
+        x = minY;
+    }
+
+    tp = x;
+    sc->SetFont (labelFont1);
+    counter = 0;
+    while (tp<=maxY) {
+        label = tp;
+        k = GetVisibleStringWidth (label, labelFont1);
+        cache << k;
+        if (k>counter) {
+            counter = k;
+        }
+        tp += yTick;
+    }
+
+    plotRect.left    += counter+7;
+    plotRect.right   -= counter+7;
+    plotRect.bottom  -= 2;
+    plotRect.top     += 2;
+
+    lS = counter+7;
+
+    if (maxY-minY) {
+        ySc = 1./(maxY-minY);
+    }
+
+    /* calculate scaling constants */
+
+
+    // (0,0,0,1) [0-3]
+    unitCube.theData[3] = 1;
+    // (0,0,1,1) [4-7]
+    unitCube.theData[6] = 1;
+    unitCube.theData[7] = 1;
+    // (0,1,0,1) [8-11]
+    unitCube.theData[9]  = 1;
+    unitCube.theData[11] = 1;
+    // (0,1,1,1) [12-15]
+    unitCube.theData[13] = 1;
+    unitCube.theData[14] = 1;
+    unitCube.theData[15] = 1;
+    // (1,0,0,1) [16-19]
+    unitCube.theData[16] = 1;
+    unitCube.theData[19] = 1;
+    // (1,0,1,1) [20-23]
+    unitCube.theData[20] = 1;
+    unitCube.theData[22] = 1;
+    unitCube.theData[23] = 1;
+    // (1,0,1,1) [24-27]
+    unitCube.theData[24] = 1;
+    unitCube.theData[26] = 1;
+    unitCube.theData[27] = 1;
+    // (1,1,1,1) [28-31]
+    unitCube.theData[28] = 1;
+    unitCube.theData[29] = 1;
+    unitCube.theData[30] = 1;
+    unitCube.theData[31] = 1;
+
+    xShift = 1e100;
+    yShift = 1e100;
+    xScale  = 0.0;
+    yScale  = 0.0;
+
+    projP = (_Matrix*)unitCube.MultObj (projectionMatrix);
+
+    for (counter = 0; counter < 32; counter+=4) {
+        _Parameter scaling = 1./projP->theData[counter+3],
+                   a,
+                   b;
+
+        a = (projP->theData[counter]     *= scaling);
+        b = (projP->theData[counter+1]   *= scaling);
+
+        if (a<xShift) {
+            xShift = a;
+        }
+        if (b<yShift) {
+            yShift = b;
+        }
+    }
+
+    for (counter = 0; counter < 32; counter+=4) {
+        _Parameter a = projP->theData[counter],
+                   b = projP->theData[counter+1];
+
+        if (a-xShift>xScale) {
+            xScale = a-xShift;
+        }
+        if (b-yShift>yScale) {
+            yScale = b-yShift;
+        }
+    }
+
+
+    xScale = (plotRect.right-plotRect.left)/xScale;
+    yScale = (plotRect.bottom-plotRect.top)/yScale;
+
+    /*if (yScale>xScale)
+        yScale = xScale;
+    if (xScale>yScale)
+        xScale = yScale;*/
+
+    xShift *= xScale;
+    yShift *= yScale;
+    DeleteObject (projP);
+
+    /* plot the coordinate walls */
+
+    // back wall
+    _Matrix      planeP (4,3,false, true);
+    planeP.theData[0] = 0;
+    planeP.theData[1] = 1;
+    planeP.theData[2] = 1;
+    planeP.theData[3] = 1;
+    planeP.theData[4] = 1;
+    planeP.theData[5] = 1;
+    planeP.theData[6] = 0;
+    planeP.theData[7] = 0;
+    planeP.theData[8] = 1;
+    planeP.theData[9] = 1;
+    planeP.theData[10] = 0;
+    planeP.theData[11] = 1;
+
+    sc->SetColor (LongToHYColor (theColors(HY_CHART_COLOR_3D_BACK)));
+
+    DrawAPlane   (planeP,0,1,plotRect);
+
+    // left wall
+    planeP.theData[2]  = 0;
+    planeP.theData[3]  = 0;
+    planeP.theData[8]  = 0;
+    planeP.theData[9]  = 0;
+    planeP.theData[10] = 0;
+    planeP.theData[11] = 1;
+
+    sc->SetColor (LongToHYColor (theColors(HY_CHART_COLOR_3D_LEFT)));
+
+    DrawAPlane   (planeP,0,1,plotRect);
+    // ground wall
+
+    planeP.theData[0] = 1;
+    planeP.theData[1] = 0;
+    planeP.theData[4] = 0;
+    planeP.theData[5] = 0;
+    planeP.theData[6] = 1;
+    planeP.theData[8] = 1;
+
+    sc->SetColor (LongToHYColor (theColors(HY_CHART_COLOR_3D_FLOOR)));
+    DrawAPlane   (planeP,0,1,plotRect);
+
+    tp = x;
+    k  = 0;
+
+    // plot z lines and ticks
+
+    sc->SetColor (LongToHYColor (theColors(HY_CHART_COLOR_3D_VALUELINE)));
+    while (tp<=maxY) {
+        label = tp;
+        _Matrix coordLine (2,3,false,true);
+        coordLine.theData[0] = 1;
+        coordLine.theData[1] = coordLine.theData[4] = (tp-minY)*ySc;
+        coordLine.theData[2] = coordLine.theData[5] = 1;
+        coordLine.theData[3] = 0;
+        DrawALine   (coordLine,0,1.,plotRect,1,&label,4,0);
+        coordLine.theData[0] = coordLine.theData[2] = 0;
+        DrawALine   (coordLine,0,1.,plotRect,1,&label,-4-cache.lData[k++],0);
+        tp += yTick;
+    }
+
+
+    _Parameter      stashMY   = maxY,
+                    stashMinY = minY;
+
+
+    if (options == 2)
+        // draw a 3D Historgram
+    {
+        minY = xSpacing.theData[1]-xSpacing.theData[0];
+
+        x =  xSpacing.theData[0]/minY;
+
+        x3Dtick = pow (10,floor(log (minY)/log (10.)));
+
+        while (minY/x3Dtick<2) {
+            x3Dtick /= 2.;
+        }
+
+        if (x>maxY) {
+            x=maxY;
+        } else {
+            maxY=x;
+        }
+
+        tp     = 1./minY;
+        yTick  = 1./minY;
+
+        x3DMax  = xSpacing.theData[1];
+        y3DMax  = x3DMax;
+        y3Dtick = x3Dtick;
+
+
+        for (j=0; j<m; j++) {
+            numbers.theData [j]   = (numbers.theData [j]-xSpacing.theData[0])/minY;
+            numbers.theData [m+j] = (numbers.theData [m+j]-xSpacing.theData[0])/minY;
+        }
+
+        /* set those for coordinate gridlines */
+
+        j = 0;
+        k = 0;
+
+        minY = 0.0;
+        maxY = 0.0;
+    } else {
+        // now draw the bars, starting with the back row, left to right
+
+        minY = 1./(2*m);               // spacing per column width-wise
+        maxY = 1./(2*columns.lLength); // spacing per column depth wise
+
+        j = -1;
+        k = -1;
+
+        if ((xAxis3DScale>=0)&&(xAxis3DScale<t->horizontalSpaces.lLength)&&(columns.lLength>1)) {
+            if (t->verticalSpaces.lLength>=columns.lLength) {
+                for (counter = 0; counter < columns.lLength; counter++) {
+                    xSpacing.theData[counter] = ((_String*)t->GetCellData (xAxis3DScale,counter))->toNum();
+                }
+
+
+                x = 1e100;
+
+                for (counter = 1; counter < columns.lLength; counter++) {
+                    yTick = (xSpacing.theData[counter]-xSpacing.theData[counter-1])/2;
+                    if (yTick<=0) {
+                        break;
+                    }
+                    if (yTick<x) {
+                        x = yTick;
+                    }
+                }
+
+                if (counter == columns.lLength) { // valid coordinates
+                    x /= (xSpacing.theData[columns.lLength-1]-xSpacing.theData[0]);
+
+                    x3Dtick = (xSpacing.theData[columns.lLength-1]-xSpacing.theData[0]);
+
+                    x3Dtick = pow (10,floor(log (x3Dtick)/log (10.)));
+                    while ((xSpacing.theData[columns.lLength-1]-xSpacing.theData[0])/x3Dtick<2) {
+                        x3Dtick /= 2.;
+                    }
+
+
+                    if (x>maxY) {
+                        x=maxY;
+                    } else {
+                        maxY=x;
+                    }
+
+                    tp = (1-2*maxY)/(xSpacing.theData[columns.lLength-1]-xSpacing.theData[0]);
+                    x3DMax = xSpacing.theData[columns.lLength-1];
+                    j = 0;
+                }
+            }
+        }
+
+        if ((yAxis3DScale>=0)&&(yAxis3DScale<t->horizontalSpaces.lLength)&&(m>1)) {
+            if (t->verticalSpaces.lLength>=m) {
+                for (counter = 0; counter < m; counter++) {
+                    ySpacing.theData[counter] = ((_String*)t->GetCellData (yAxis3DScale,counter))->toNum();
+                }
+
+
+                x = 1e100;
+
+                for (counter = 1; counter < m; counter++) {
+                    yTick = (ySpacing.theData[counter]-ySpacing.theData[counter-1])/2;
+                    if (yTick<=0) {
+                        break;
+                    }
+                    if (yTick<x) {
+                        x = yTick;
+                    }
+                }
+
+                if (counter == m) {
+                    x /= (ySpacing.theData[m-1]-ySpacing.theData[0]);
+
+                    y3Dtick = (ySpacing.theData[m-1]-ySpacing.theData[0]);
+
+                    y3Dtick = pow (10,floor(log (y3Dtick)/log (10.)));
+                    while ((ySpacing.theData[m-1]-ySpacing.theData[0])/y3Dtick<2) {
+                        y3Dtick /= 2.;
+                    }
+
+                    if (x>minY) {
+                        x=minY;
+                    } else {
+                        minY=x;
+                    }
+
+                    y3DMax = ySpacing.theData[m-1];
+                    yTick = (1-2*minY)/(ySpacing.theData[m-1]-ySpacing.theData[0]);
+                    k = 0;
+                }
+            }
+        }
+    }
+
+
+    if ((j>=0)&&(k>=0)) {
+        if (yTick>tp) {
+            minY *= tp/yTick;
+            yTick = tp;
+        } else {
+            maxY *= yTick/tp;
+            tp = yTick;
+        }
+
+        if (maxY>minY) {
+            maxY = minY;
+        } else {
+            minY = maxY;
+        }
+
+        if (x3Dtick>y3Dtick) {
+            y3Dtick = x3Dtick;
+        } else {
+            x3Dtick = y3Dtick;
+        }
+
+        if (y3DMax-ySpacing.theData[0]>x3DMax-xSpacing.theData[0]) {
+            x3DMax = y3DMax-ySpacing.theData[0]+xSpacing.theData[0];
+        } else {
+            y3DMax = x3DMax-xSpacing.theData[0]+ySpacing.theData[0];
+        }
+    }
+
+    if (j<0) {
+        for (counter = 0; counter < columns.lLength; counter ++) {
+            xSpacing.theData [columns.lLength-counter-1] = 1- (2*counter+1)*maxY;
+        }
+    } else {
+        if (x3Dtick>0.0) {
+            x = ceil (xSpacing.theData[0]/x3Dtick) * x3Dtick;
+
+            while (x<=x3DMax) {
+                label = x;
+                _Matrix coordLine (2,3,false,true);
+
+                coordLine.theData[0] = 1;
+                coordLine.theData[1] = coordLine.theData[4] = 0; // z-coordinate
+                coordLine.theData[2] = coordLine.theData[5] = (x-xSpacing.theData[0])*tp + maxY;
+                coordLine.theData[3] = 0;
+
+                DrawALine   (coordLine,0,1.,plotRect,1,&label,labelFont1.size,labelFont1.size);
+                x += x3Dtick;
+            }
+        }
+
+        if (options < 2) {
+            for (counter = 1; counter < columns.lLength; counter++) {
+                xSpacing.theData[counter] = (xSpacing.theData[counter]-xSpacing.theData[0]) * tp + maxY;
+            }
+
+            xSpacing.theData[0] = maxY;
+        }
+    }
+
+    if (k<0) {
+        for (counter = 0; counter < m; counter ++) {
+            ySpacing.theData [counter] = minY + 2*counter*minY;
+        }
+    } else {
+        if (y3Dtick>0.0) {
+
+            x = ceil (ySpacing.theData[0]/y3Dtick) * y3Dtick;
+
+            while (x<=y3DMax) {
+                label = x;
+                _Matrix coordLine (2,3,false,true);
+
+                coordLine.theData[0] = coordLine.theData[3] = (x-ySpacing.theData[0])*yTick + minY;
+                coordLine.theData[1] = coordLine.theData[4] = 0; // z-coordinate
+
+                coordLine.theData[2] = 0;
+                coordLine.theData[5] = 1;
+
+                DrawALine   (coordLine,0,1.,plotRect,1,&label,-GetVisibleStringWidth (label, labelFont1) - labelFont1.size/2,labelFont1.size);
+                x += y3Dtick;
+            }
+        }
+
+        if (options < 2) {
+            for (counter = 1; counter < m; counter++) {
+                ySpacing.theData[counter] = (ySpacing.theData[counter]-ySpacing.theData[0]) * yTick + minY;
+            }
+
+            ySpacing.theData[0] = minY;
+        }
+    }
+
+    maxY/=2;
+    minY/=2;
+
+
+    if (options==1)
+        // generate coordinate histogram
+    {
+        sc->SetColor (LongToHYColor (theColors(HY_CHART_COLOR_3D_HISTOGRAM)));
+        // back wall first
+
+        planeP.theData[1]  =
+            planeP.theData[4]  = 0;
+
+        planeP.theData[2]  =
+            planeP.theData[5]  =
+                planeP.theData[8]  =
+                    planeP.theData[11] = 1;
+
+        for (j=0; j<m; j++) {
+            planeP.theData[0]  =
+                planeP.theData[6]  = ySpacing.theData [j] - minY;
+            planeP.theData[3]  =
+                planeP.theData[9]  = ySpacing.theData [j] + minY;
+
+            _Parameter sum = 0;
+            for (counter = 0; counter < columns.lLength; counter++) {
+                sum += numbers.theData [j+counter*m];
+            }
+
+            planeP.theData[7]  =
+                planeP.theData[10] = sum*ySc;
+
+            DrawAPlane (planeP,0,1.,plotRect);
+
+        }
+
+        // now - the left wall
+        planeP.theData[0] =
+            planeP.theData[1] =
+                planeP.theData[3] =
+                    planeP.theData[4] =
+                        planeP.theData[6] =
+                            planeP.theData[9] = 0;
+
+
+        for (j=columns.lLength-1; j>=0; j--) {
+            planeP.theData[2] =
+                planeP.theData[8] = xSpacing.theData [j] - maxY;
+
+            planeP.theData[5]  =
+                planeP.theData[11] = xSpacing.theData[j] + maxY;
+
+            _Parameter sum = 0;
+            for (counter = 0; counter < m; counter++) {
+                sum += numbers.theData [m*j+counter];
+            }
+
+            planeP.theData[7] = planeP.theData[10] = sum*ySc;
+            DrawAPlane (planeP,0,1.,plotRect);
+        }
+    }
+
+    // handle possible spacing issues
+    if (options < 2)
+        for (counter = columns.lLength-1; counter >=0; counter --) {
+            // current position witdh wise
+            sc->SetColor (LongToHYColor(theColors[HY_CHART_COLOR_OFFSET+counter%HY_CHART_COLOR_COUNT]));
+
+            unitCube.theData[2]  = unitCube.theData[5]  = unitCube.theData[14] = unitCube.theData[17] =
+                                       xSpacing.theData[counter] - maxY;
+
+            unitCube.theData[8]  = unitCube.theData[11]  = unitCube.theData[20] = unitCube.theData[23] =
+                                       xSpacing.theData[counter] + maxY;
+
+            unitCube.theData[0]  =
+                unitCube.theData[6]  =
+                    unitCube.theData[12] =
+                        unitCube.theData[18] = ySpacing.theData[0] - minY;
+
+            unitCube.theData[3]  =
+                unitCube.theData[9]  =
+                    unitCube.theData[15] =
+                        unitCube.theData[21] = ySpacing.theData[0] + minY;
+
+            unitCube.theData[13] = 0;
+            unitCube.theData[16] = 0;
+            unitCube.theData[19] = 0;
+            unitCube.theData[22] = 0;
+
+            for (long counter2 = 0; counter2 < m; counter2++) {
+                if (counter2) {
+                    for (j=0; j<24; j+=6) {
+                        unitCube.theData[j] = ySpacing.theData[counter2] - minY;
+                    }
+
+                    for (j=3; j<24; j+=6) {
+                        unitCube.theData[j] = ySpacing.theData[counter2] + minY;
+                    }
+                }
+
+                unitCube.theData[1] = unitCube.theData[4] = unitCube.theData[7] = unitCube.theData[10] =
+                                          numbers.theData [counter2+counter*m]*ySc;
+
+                DrawAParallelogram (unitCube,0,1,plotRect);
+
+            }
+            //x -= 2*maxY;
+            // current position depth wise
+        }
+    else {
+        sc->SetColor (LongToHYColor(theColors[HY_CHART_COLOR_OFFSET]));
+
+        for (counter = 0; counter<m; counter=counter+1) {
+
+            unitCube.theData[2]  = unitCube.theData[5]  = unitCube.theData[14] = unitCube.theData[17] =
+                                       numbers.theData [counter]-0.01;
+
+            unitCube.theData[8]  = unitCube.theData[11]  = unitCube.theData[20] = unitCube.theData[23] =
+                                       numbers.theData [counter]+0.01;
+
+            unitCube.theData[0]  =
+                unitCube.theData[6]  =
+                    unitCube.theData[12] =
+                        unitCube.theData[18] = numbers.theData [counter+m]-0.01;
+
+            unitCube.theData[3]  =
+                unitCube.theData[9]  =
+                    unitCube.theData[15] =
+                        unitCube.theData[21] = numbers.theData [counter+m]+0.01;
+
+            unitCube.theData[13] =
+                unitCube.theData[16] =
+                    unitCube.theData[19] =
+                        unitCube.theData[22] = numbers.theData [counter+2*m]*ySc-0.01;
+
+            unitCube.theData[1] =
+                unitCube.theData[4] =
+                    unitCube.theData[7] =
+                        unitCube.theData[10] = numbers.theData [counter+2*m]*ySc+0.01;;
+
+            DrawAParallelogram (unitCube,0,1,plotRect);
+        }
+
+    }
+    // produce an overplot
+
+    if (!overlayPlot.IsEmpty()) {
+        _Matrix         plotValues    (surfaceDivs,surfaceDivs,false,true),
+                        plotBase      (2,surfaceDivs,false,true);
+
+        for (j=0; j<surfaceDivs; j++) {
+            plotBase.Store (0,j,.1*j);
+            plotBase.Store (1,j,.1*j);
+        }
+
+        if (x3DMax!=0.0) {
+            x3DMax = (xSpacing.theData[0]-maxY)/tp;
+
+            for (j=0; j<surfaceDivs; j++) {
+                plotBase.theData[j] = plotBase.theData[j]/tp + x3DMax;
+            }
+        }
+
+        if (y3DMax!=0.0) {
+            y3DMax = (xSpacing.theData[0]-minY)/yTick;
+
+            for (j=surfaceDivs; j<2*surfaceDivs; j++) {
+                plotBase.theData[j] = plotBase.theData[j]/yTick + y3DMax;
+            }
+        }
+
+        label = "_x_";
+        _Variable*  xVar = CheckReceptacle (&label, empty);
+        label = "_y_";
+        _Variable*  yVar = CheckReceptacle (&label, empty);
+
+        for (j=0; j<surfaceDivs; j++) {
+            xVar->SetValue (new _Constant(plotBase.theData[j]), false);
+            for (k=0; k<surfaceDivs; k++) {
+                yVar->SetValue (new _Constant (plotBase.theData[surfaceDivs+k]), false);
+                y3DMax = overlayPlot.Compute()->Value();
+                if (y3DMax < 0) {
+                    y3DMax = 0.;
+                } else if (y3DMax > stashMY) {
+                    y3DMax = stashMY;
+                }
+                plotValues.Store(j,k,(y3DMax-stashMinY)*ySc);
+            }
+        }
+
+        // now plot the thing
+
+        x3DMax = (1-2*maxY)/(surfaceDivs-1.);
+        y3DMax = (1-2*minY)/(surfaceDivs-1.);
+
+        sc->SetColor (LongToHYColor(theColors[HY_CHART_COLOR_OVERPLOT]));
+
+        for (j=0; j<surfaceDivs-1; j++) {
+
+            planeP.theData[0] =
+                planeP.theData[3] = maxY+j*x3DMax;
+
+            planeP.theData[2] =
+                planeP.theData[8] = 1-minY-y3DMax;
+
+            planeP.theData[5] =
+                planeP.theData[11] = 1-minY;
+
+            planeP.theData[6] =
+                planeP.theData[9] = planeP.theData[0]+x3DMax;
+
+
+            for (k=surfaceDivs-2; k>=0; k--) {
+                planeP.theData[1]  = plotValues (j,k);
+                planeP.theData[4]  = plotValues (j,k+1);
+                planeP.theData[7]  = plotValues (j+1,k);
+                planeP.theData[10] = plotValues (j+1,k+1);
+
+                DrawAPlane (planeP,2,1.,plotRect);
+
+                planeP.theData[2] -= y3DMax;
+                planeP.theData[5] -= y3DMax;
+                planeP.theData[8] -= y3DMax;
+                planeP.theData[11]-= y3DMax;
+            }
+        }
+
+    }
+}
+
+
+//__________________________________________________________
+
+void    _HYChartWindow::GenerateBarChart (_SimpleList& columns, _HYRect plotRect, char options)
+{
+    _HYTable            *t  = (_HYTable*)GetObject (1);
+    _HYStretchCanvas    *sc = (_HYStretchCanvas*)GetObject (0);
+
+    if ((xLabel.sLength+zLabel.sLength)||(yLabel.sLength&&(options==5))) {
+        if ((xLabel.sLength)||(yLabel.sLength&&(options==5))) {
+            plotRect.bottom -= labelFont3.size;
+        }
+
+        if (zLabel.sLength) {
+            plotRect.top += (3*labelFont3.size)/2-8;
+        }
+
+        if (plotRect.bottom-plotRect.top<50) {
+            sc->DisplayText (_String("Can't display x-axis label: chart is too short"),15,2,true);
+            return;
+        }
+    }
+
+
+    long        k,
+                j,
+                m = t->verticalSpaces.lLength,
+                barWidth = 10,
+                s,
+                lS;
+
+    _Matrix     numbers (columns.lLength,m,false,true);
+
+    _Parameter  minX,
+                maxX,
+                minY,
+                maxY,
+                x,
+                yTick,
+                //xTick,
+                yScale,
+                xScale,
+                tp;
+
+    _String     label;
+
+    _HYRect     lr;
+
+    _SimpleList cache;
+
+    if (columns.lLength < 2) {
+        label = "Choose some data from the 'Y' menu to plot.";
+        sc->DisplayText (label,15,10,true);
+        return;
+    }
+
+    if ((options==5)&&(columns.lLength!=3)) {
+        label = "Choose two columns of positive data from the 'Y' menu to plot.";
+        sc->DisplayText (label,15,10,true);
+        return;
+    }
+
+    if ((options==6)&&(columns.lLength!=4)&&(columns.lLength!=5)) {
+        label = "Choose three or four columns (low, high, median, optional extra point) of data from the 'Y' menu to plot.";
+        sc->DisplayText (label,15,10,true);
+        return;
+    }
+
+
+    for (j=0; j<columns.lLength; j++) {
+        if (columns.lData[j]==-1)
+            for (k=0; k<m; k++) {
+                numbers.theData [j*m+k] = k+1;
+            }
+        else
+            for (k=0; k<m; k++) {
+                numbers.theData [j*m+k] = ((_String*)t->GetCellData (columns.lData[j],k))->toNum();
+            }
+    }
+
+    if (options==5)
+        for (k=0; k<m; k++) {
+            numbers.theData [2*m+k] *= -1;
+        }
+
+    _SimpleList  barPositions;
+
+
+    // determine the range of the plot
+    minX        = 1e100;
+    maxX        = -1e100;
+    minY        = 1e100;
+    maxY        = -1e100;
+    for         (k=0; k<m; k++) {
+        x = numbers.theData[k];
+        if (isfinite (x)) {
+            if (x>maxX) {
+                maxX = x;
+            }
+            if (x<minX) {
+                minX = x;
+            }
+            if (options!=4)
+                for (j=1; j<columns.lLength; j++) {
+                    x = numbers.theData [j*m+k];
+                    if (isfinite(x)) {
+                        if (x>maxY) {
+                            maxY = x;
+                        }
+                        if (x<minY) {
+                            minY = x;
+                        }
+                    }
+                }
+            else {
+                x = 0.;
+                for (j=1; j<columns.lLength; j++) {
+                    x += numbers.theData [j*m+k];
+                }
+
+                if (x>maxY) {
+                    maxY = x;
+                }
+                if (x<minY) {
+                    minY = x;
+                }
+            }
+        }
+    }
+
+    if (minY>0 && maxY>0) {
+        minY = 0.0;
+    } else if (minY<0 && maxY<0) {
+        maxY = 0.0;
+    }
+
+    if (options==5) {
+        if (-minY>maxY) {
+            maxY = -minY;
+        } else {
+            minY = -maxY;
+        }
+    }
+
+    if (maxY==minY) {
+        maxY = minY+1;
+    }
+
+    if (!CheckEqual (userMin, userMax)) {
+        minY = userMin;
+        maxY = userMax;
+    }
+
+
+
+    yTick = (maxY-minY);
+
+    if (yTick>0.0) {
+        yTick = pow (10,floor(log (yTick)/log (10.)));
+        /*while ((maxY-minY)/yTick>5)
+            yTick *= 2.;*/
+        while ((maxY-minY)/yTick<2) {
+            yTick /= 2.;
+        }
+    }
+
+
+
+//  plotRect = sc->GetCanvasSize();
+
+    plotRect.top    += 17;
+    plotRect.bottom -= (labelFont1.size*3)/2;
+    plotRect.right  -= 10;
+
+    if (minY<0.0) {
+        x = - floor (-minY/yTick) * yTick;
+    } else {
+        x = minY;
+    }
+
+    tp = x;
+    sc->SetFont (labelFont1);
+    while (tp<=maxY) {
+        if (options==5 && tp<0) {
+            label = -tp;
+        } else {
+            label = tp;
+        }
+
+        k = GetVisibleStringWidth (label, labelFont1);
+        cache << k;
+        if (k>plotRect.left) {
+            plotRect.left = k;
+            lS = k;
+        }
+        tp += yTick;
+    }
+
+    plotRect.left += 7;
+    lS += 7;
+
+    if (maxY-minY) {
+        yScale = (plotRect.bottom-plotRect.top-4)/(maxY-minY);
+    }
+
+
+
+
+    sc->SetColor (LongToHYColor (theColors[HY_CHART_COLOR_BACKGROUND]));
+    sc->FillRect (plotRect);
+
+    plotRect.bottom -= 2;
+    plotRect.top +=2;
+
+    sc->SetColor (LongToHYColor (theColors[HY_CHART_COLOR_COORD_LABEL]));
+    tp = x;
+    k=0;
+    while (tp<=maxY) {
+        if ((options==5)&&(tp<0)) {
+            label = -tp;
+        } else {
+            label = tp;
+        }
+
+        sc->DisplayText (label,plotRect.bottom - (tp-minY)*yScale,plotRect.left-4-cache.lData[k++],true);
+        tp += yTick;
+    }
+    lr.left = plotRect.left;
+    lr.right = plotRect.right;
+    lr.width = 1;
+
+    sc->SetColor(LongToHYColor (theColors[HY_CHART_COLOR_VALUELINE]));
+    tp = x;
+    while (tp<=maxY) {
+        lr.top = lr.bottom = plotRect.bottom - (tp-minY)*yScale;
+        sc->DrawLine (lr);
+        tp += yTick;
+    }
+
+    if ((options == 0)||(options == 4)||(options == 5)) {
+        if (options) {
+            s = 1;
+        } else {
+            s = columns.lLength - 1;
+        }
+
+        barWidth = (plotRect.right-plotRect.left)/(s*m+.5*(s+1));
+
+        if (barWidth <= 1) {
+            barWidth = 1;
+        }
+
+        plotRect.left  += barWidth*s/2+5;
+        plotRect.right -= barWidth*s/2+5;
+    }
+
+    if (maxX-minX) {
+        xScale = (plotRect.right-plotRect.left)/(maxX-minX);
+    } else {
+        xScale = 0.0;
+    }
+
+
+    if (options&&(options!=4)&&(options!=5)) {
+        _SimpleList sortedOrder;
+
+        for (j=0; j<m; j++) {
+            sortedOrder << j;
+        }
+
+        bool doneSorting = false;
+
+        while (!doneSorting) {
+            doneSorting = true;
+            for (j=0; j<m-1; j++) {
+                if (numbers.theData [sortedOrder.lData[j]] > numbers.theData [sortedOrder.lData[j+1]]) {
+                    k = sortedOrder.lData[j];
+                    sortedOrder.lData[j] = sortedOrder.lData[j+1];
+                    sortedOrder.lData[j+1] = k;
+                    doneSorting = false;
+                }
+            }
+        }
+        lr.width = 1;
+        for (j=1; j<columns.lLength; j++) {
+            sc->SetColor (LongToHYColor(theColors[HY_CHART_COLOR_OFFSET+(j-1)%HY_CHART_COLOR_COUNT]));
+            for (k=0; k<m; k++) {
+                x = (numbers.theData[sortedOrder.lData[k]]-minX)*xScale;
+                lr.left   = plotRect.left + x - 1;
+                lr.top    = plotRect.bottom-(numbers.theData [j*m+sortedOrder.lData[k]]-minY)*yScale;
+                if (options==2) {
+                    if (k!=m-1) {
+                        lr.right = plotRect.left + (numbers.theData[sortedOrder.lData[k+1]]-minX)*xScale;
+                        lr.bottom = plotRect.bottom-(numbers.theData [j*m+sortedOrder.lData[k+1]]-minY)*yScale;
+                        lr.width = 2;
+                        sc->DrawLine (lr);
+                    }
+                    lr.bottom = lr.top + 3;
+                    lr.top   -= 3;
+                    lr.right  = lr.left +3;
+                    lr.left  -= 3;
+                    lr.width = 1;
+                    sc->FillRect (lr);
+                } else {
+                    if (options == 3) {
+                        if (k!=m-1) {
+                            lr.right  =  plotRect.left + (numbers.theData[sortedOrder.lData[k+1]]-minX)*xScale - 1;
+                            lr.bottom = lr.top;
+                            lr.width  = 2;
+                            sc->DrawLine (lr);
+                            lr.left   = lr.right;
+                            lr.bottom = plotRect.bottom-(numbers.theData [j*m+sortedOrder.lData[k+1]]-minY)*yScale;
+                            sc->DrawLine (lr);
+                        }
+                    } else {
+                        lr.left = lr.right =  plotRect.left + (numbers.theData[sortedOrder.lData[k]]-minX)*xScale - 1;
+                        lr.top = lr.bottom = plotRect.bottom-(numbers.theData [j*m+sortedOrder.lData[k]]-minY)*yScale;
+
+                        if (options == 6) {
+                            if (j==4) {
+                                _SimpleList triag;
+                                triag << lr.left-4;
+                                triag << lr.bottom;
+                                triag << lr.left;
+                                triag << lr.bottom-4;
+                                triag << lr.left+4;
+                                triag << lr.bottom;
+
+                                sc->FillPolygon (triag);
+                            } else {
+                                if (j==3) {
+                                    lr.top      -=  3;
+                                    lr.bottom   +=  4;
+                                    lr.right    +=  4;
+                                    lr.left     -=  3;
+
+                                    sc->FillOval (lr);
+                                } else {
+
+                                    long tcoord = plotRect.bottom-(numbers.theData [m*2+sortedOrder.lData[k]]-minY)*yScale;
+
+                                    lr.left     -=  3;
+                                    lr.right    +=  3;
+
+                                    sc->DrawLine (lr);
+                                    lr.bottom ++;
+                                    lr.top ++;
+                                    sc->DrawLine (lr);
+                                    lr.bottom--;
+                                    lr.top++;
+
+                                    lr.left     +=  3;
+                                    lr.right    -=  3;
+
+                                    if (tcoord < lr.bottom) {
+                                        lr.top = tcoord;
+                                    } else {
+                                        lr.bottom = tcoord;
+                                    }
+
+                                    if (lr.bottom>=lr.top) {
+                                        sc->DrawLine (lr);
+                                    }
+                                }
+                            }
+                        } else {
+                            lr.top      -=3;
+                            lr.bottom   +=3;
+                            lr.right    +=3;
+                            lr.left     -=3;
+                            switch (j) {
+                            case 2:
+                            case 6: {
+                                _SimpleList diamond;
+                                diamond << lr.left;
+                                diamond << lr.top+3;
+                                diamond << lr.left+3;
+                                diamond << lr.top;
+                                diamond << lr.right;
+                                diamond << lr.top+3;
+                                diamond << lr.left+3;
+                                diamond << lr.bottom;
+                                if (j==6) {
+                                    sc->FillPolygon (diamond);
+                                } else {
+                                    sc->DrawPolygon (diamond);
+                                }
+                                break;
+                            }
+                            case 3: {
+                                sc->DrawRect (lr);
+                                break;
+                            }
+                            case 4: {
+                                sc->FillOval (lr);
+                                break;
+                            }
+                            case 5: {
+                                sc->FillRect (lr);
+                                break;
+                            }
+                            default: {
+                                sc->DrawOval (lr);
+                                break;
+                            }
+                            }
+                        }
+                    }
+                }
+            }
+        }
+    } else {
+        lr.width = 1;
+        if (options==4) {
+            _Matrix     sums    (1,m,false,true);
+
+            yTick = -barWidth*.5;
+
+            for (j=1; j<columns.lLength; j++) {
+                sc->SetColor (LongToHYColor(theColors[HY_CHART_COLOR_OFFSET+(j-1)%HY_CHART_COLOR_COUNT]));
+                for (k=0; k<m; k++) {
+                    x = (numbers.theData[k]-minX)*xScale;
+                    lr.left = plotRect.left+x+yTick+1;
+                    lr.right = lr.left+barWidth;
+                    tp = numbers.theData [j*m+k];
+
+                    if (tp>=0.0) {
+                        lr.bottom = plotRect.bottom+(minY-sums.theData[k])*yScale;
+                        lr.top    = lr.bottom - tp*yScale;
+                    } else {
+                        lr.top    = plotRect.bottom+minY*yScale;
+                        lr.bottom = plotRect.bottom-(tp-minY-sums.theData[k])*yScale;
+                    }
+
+                    sc->FillRect (lr);
+                    sums.theData[k]+=tp;
+
+                    if ((barWidth>2)&&(j==columns.lLength-1)) {
+                        tp = sums.theData[k];
+                        if (tp>=0.0) {
+                            lr.bottom = plotRect.bottom+minY*yScale;
+                            lr.top = lr.bottom - tp*yScale;
+                        } else {
+                            lr.top    = plotRect.bottom+minY*yScale;
+                            lr.bottom = plotRect.bottom-(tp-minY)*yScale;
+                        }
+                        sc->SetColor (LongToHYColor(theColors[HY_CHART_COLOR_BARBORDER]));
+                        sc->DrawRect (lr);
+                        sc->SetColor (LongToHYColor(theColors[HY_CHART_COLOR_OFFSET+(j-1)%HY_CHART_COLOR_COUNT]));
+                    }
+                }
+            }
+        } else {
+
+            // check for custom colors
+
+            _Variable * ucs                 = FetchVar (LocateVarByName(chartCustomColumnColors));
+            _Matrix   * customColColors     = nil;
+            bool        tags = false;
+
+            if (ucs && ucs->ObjectClass () == MATRIX) {
+                customColColors = (_Matrix*)ucs->Compute();
+                if (customColColors->GetHDim()!=m || customColColors->GetVDim()<columns.lLength-1 || customColColors->IsAStringMatrix()) {
+                    customColColors = nil;
+                } else {
+                    tags = (options == 5 && customColColors->GetVDim() == 4);
+                }
+            }
+
+            long  checkBarWidth = barWidth;
+
+            for (k=0; k<m; k++) {
+                x = (numbers.theData[k]-minX)*xScale;
+
+                lr.left = x;
+
+                if (k) {
+                    if (lr.left<=lr.right) {
+                        if (options==5) {
+                            checkBarWidth -= lr.right-lr.left+1;
+                        } else {
+                            checkBarWidth -= ceil((lr.right-lr.left)/((_Parameter)columns.lLength-1)) + 1;
+                        }
+
+                        if (checkBarWidth<1) {
+                            checkBarWidth = 1;
+                        }
+
+                    }
+                }
+
+                if (options==5) {
+                    lr.right = lr.left+checkBarWidth;
+                } else {
+                    lr.right = lr.left+(columns.lLength-1)*checkBarWidth;
+                }
+            }
+
+            for (j=1; j<columns.lLength; j++) {
+                if (options==5) {
+                    yTick = -.5*checkBarWidth;
+                } else {
+                    yTick = checkBarWidth*(j-(columns.lLength-1.)/2-1);
+                }
+
+                if (!customColColors) {
+                    sc->SetColor (LongToHYColor(theColors[HY_CHART_COLOR_OFFSET+(j-1)%HY_CHART_COLOR_COUNT]));
+                }
+
+                for (k=0; k<m; k++) {
+                    x = (numbers.theData[k]-minX)*xScale;
+
+                    if (options==5) {
+                        lr.left = plotRect.left + x + yTick + 1;
+                    } else {
+                        lr.left = plotRect.left + x + yTick-j+1;
+                    }
+
+                    lr.right = lr.left+checkBarWidth;
+                    tp = numbers.theData [j*m+k];
+                    if (tp>=0.0) {
+                        lr.bottom = plotRect.bottom+minY*yScale;
+                        lr.top = lr.bottom - tp*yScale;
+                    } else {
+                        lr.top    = plotRect.bottom+minY*yScale;
+                        lr.bottom = plotRect.bottom-(tp-minY)*yScale;
+                    }
+
+                    if (customColColors) {
+                        sc->SetColor (LongToHYColor((*customColColors)(k,j-1)));
+                    }
+
+                    sc->FillRect (lr);
+
+                    if (checkBarWidth>2 && !tags) {
+                        sc->SetColor (LongToHYColor(theColors[HY_CHART_COLOR_BARBORDER]));
+                        sc->DrawRect (lr);
+                        if (!customColColors) {
+                            sc->SetColor (LongToHYColor(theColors[HY_CHART_COLOR_OFFSET+(j-1)%HY_CHART_COLOR_COUNT]));
+                        }
+                    }
+
+                    if (tags && (*customColColors)(k,1+j) > 0.0) {
+                        sc->SetColor (black);
+                        long     diam = MIN(lr.bottom-lr.top,lr.right-lr.left);
+                        _HYRect  circRect;
+                        circRect.left  = (lr.right+lr.left-diam)/2;
+                        circRect.right = circRect.left + diam;
+                        if (j==1) {
+                            circRect.top    = lr.top - diam*3/2;
+                            circRect.bottom = circRect.top+diam;
+                        } else {
+                            circRect.bottom = lr.bottom + diam*3/2;
+                            circRect.top    = circRect.bottom-diam;
+                        }
+                        sc->FillOval (circRect);
+                    }
+                }
+            }
+        }
+
+        plotRect.left  -= barWidth*s/2+5;
+        plotRect.right += barWidth*s/2+5;
+    }
+
+    lr.width = 2;
+
+    if ((options!=5)&&(!overlayPlot.IsEmpty())) {
+        label = "_x_";
+
+        _Variable* thisVar = CheckReceptacle(&label,label,false);
+
+        _Parameter   ox1 = minX,
+                     ox2,
+                     shifter = 0;
+
+        ox2 = ox1+1./xScale;
+
+        if ((columns.lData[0]==-1)&&((options==0)||(options==4)||(options==5))) {
+            //maxX += .5;
+            shifter = -.5;
+        }
+
+
+        setParameter (label,ox1);
+
+        x = overlayPlot.Compute ()->Value();
+
+        if (terminateExecution) {
+            terminateExecution = false;
+        }
+
+        else {
+
+            sc->SetColor (LongToHYColor(theColors[HY_CHART_COLOR_OVERPLOT]));
+
+            while (1) {
+                if (ox2>maxX) {
+                    ox2 = maxX;
+                }
+
+                _Constant cv (ox2);
+
+                thisVar->SetValue (&cv);
+
+                yTick = overlayPlot.Compute ()->Value();
+
+                if (terminateExecution) {
+                    terminateExecution = false;
+                    break;
+                }
+
+                lr.left  = (ox1-(minX+shifter))*xScale+plotRect.left;
+                lr.right = (ox2-(minX+shifter))*xScale+plotRect.left;
+
+                bool      plotThisPair = false;
+
+                if (yTick>=minY) {
+                    if (yTick<=maxY) {
+                        plotThisPair = true;
+                        lr.bottom = plotRect.bottom-(yTick-minY)*yScale;
+                    } else {
+                        lr.bottom = plotRect.bottom-(maxY-minY)*yScale;
+                    }
+                } else {
+                    lr.bottom = plotRect.bottom;
+                }
+
+                if (x>=minY) {
+                    if (x<=maxY) {
+                        plotThisPair = true;
+                        lr.top = plotRect.bottom-(x-minY)*yScale;
+                    } else {
+                        lr.top = plotRect.bottom-(maxY-minY)*yScale;
+                    }
+                } else {
+                    lr.top = plotRect.bottom;
+                }
+
+
+
+                if (ox2==maxX) {
+                    break;
+                }
+
+                x = yTick;
+
+                if (plotThisPair) {
+                    sc->DrawLine (lr);
+                }
+
+                ox1 = ox2;
+                ox2+= 1./xScale;
+            }
+        }
+        if ((columns.lData[0]==-1)&&((options==0)||(options==4)||(options==5))) {
+            minX-=.5;
+            maxX+=.5;
+        }
+    } else if ((columns.lData[0]==-1)&&((options==0)||(options==4)||(options==5))) {
+        minX-=.5;
+        maxX+=.5;
+    }
+
+    if (options != 6) {
+        if (CheckEqual (userMin, userMax)) {
+            lr.top = lr.bottom = plotRect.bottom + minY*yScale-1;
+        } else {
+            lr.top = lr.bottom = plotRect.bottom -1;
+        }
+    } else {
+        lr.top = lr.bottom = plotRect.bottom -1;
+    }
+
+    lr.right = plotRect.right;
+    lr.left  = plotRect.left;
+
+    sc->SetColor (LongToHYColor(theColors[HY_CHART_COLOR_COORD_LABEL]));
+    sc->DrawLine (lr);
+    _List       labels;
+    _SimpleList labelInfo;
+
+    ComputeHashMarkPlacement (lr,minX,maxX,minY,maxY,labelInfo,labels,4,labelFont1);
+
+    lr.width = 5;
+
+    sc->DrawHashes (lr,labelInfo,labels,labelFont1.size/2+1,1+labelFont1.size/10);
+
+    if (xLabel.sLength+zLabel.sLength+(yLabel.sLength&&(options==5))) {
+        sc->SetColor (LongToHYColor(theColors[HY_CHART_COLOR_AXIS_LABEL]));
+        sc->SetFont  (labelFont3);
+
+        if (xLabel.sLength) {
+            sc->DisplayText (xLabel,plotRect.bottom+labelFont3.size+labelFont1.size, (plotRect.left+plotRect.right-GetVisibleStringWidth(xLabel,labelFont3))/2,true);
+        }
+        if (zLabel.sLength) {
+            sc->DisplayText (zLabel,(5*labelFont3.size)/4,plotRect.left-lS+labelFont3.size/4,true);
+        }
+        if (yLabel.sLength&&(options==5)) {
+            sc->DisplayText (yLabel,plotRect.bottom+labelFont3.size+labelFont1.size,plotRect.left-lS+labelFont3.size/4,true);
+        }
+    }
+
+}
+
+
+
+
+
+//__________________________________________________________
+
+
+
+void    _HYChartWindow::HandleCellEditEvent (long index)
+{
+
+    _HYTable*   table = (_HYTable*)GetObject (1);
+
+    long        h = index%table->horizontalSpaces.lLength,
+                v = index/table->horizontalSpaces.lLength;
+
+    bool        good = true;
+
+    _String     *currentValue = (_String*)table->GetCellData (h,v);
+
+    _Formula    f (*currentValue);
+
+    if          (f.IsEmpty()) {
+        good = false;
+    } else {
+        _PMathObj p = (_PMathObj)f.Compute();
+        if (p&&(p->ObjectClass()==NUMBER)) {
+            currentValue = (_String*)p->toStr();
+        } else {
+            good = false;
+        }
+    }
+
+    if (good) {
+        table->SetCellData (currentValue,v,h,table->cellTypes.lData[index],false);
+    } else {
+        table->SetCellData (&empty,v,h,table->cellTypes.lData[index],true);
+    }
+
+    table->_MarkCellForUpdate (index);
+
+    if (NeedToRedrawChart(h)) {
+        DrawChart();
+    }
+}
+
+//__________________________________________________________
+
+bool    _HYChartWindow::NeedToRedrawChart (long index)
+{
+    bool res = false;
+    _HYPullDown         *p1 = (_HYPullDown*)GetObject (4);
+
+    long m = p1->GetSelection();
+
+    if (m==2) {
+        p1 = (_HYPullDown*)GetObject (5);
+        res = (p1->GetSelection()==index);
+    } else {
+        p1 = (_HYPullDown*)GetObject (5);
+        if (m<9) {
+            res = (p1->GetSelection()==index);
+        }
+        if (!res) {
+            res = (ySeries.Find (index)>=0)||(index==xAxis3DScale)||(index==yAxis3DScale);
+        }
+    }
+
+    return res;
+}
+
+//__________________________________________________________
+
+void    _HYChartWindow::ToggleSuspend (bool s)
+{
+    suspendDraw = s;
+}
+
+//__________________________________________________________
+
+void    _HYChartWindow::SetProjection (_Parameter a, _Parameter b, _Parameter c)
+{
+    oR      = a;
+    xyAngle = b;
+    zAngle  = c;
+    ComputeProjectionSettings ();
+    projectionMatrix = ComputeProjectionMatrix   ();
+}
+
+//__________________________________________________________
+
+void    _HYChartWindow::SetFonts      (_List * data)
+{
+    _HYFont * fonts2Set [4] = {&labelFont1, &labelFont2, &labelFont3, &headerFont};
+    for (long k = 0; k < data->lLength; k++) {
+        _List * fontSpec = ((_String*)(*data)(k))->Tokenize (":");
+        if (fontSpec->lLength == 3) {
+            fonts2Set [k]->face  = *((_String*)(*fontSpec)(0));
+            fonts2Set [k]->size  = ((_String*)(*fontSpec)(1))->toNum();
+            fonts2Set [k]->style = ((_String*)(*fontSpec)(2))->toNum();
+        }
+        DeleteObject (fontSpec);
+        if (k==3) {
+            break;
+        }
+    }
+}
+
+//__________________________________________________________
+
+void    _HYChartWindow::SetColors      (_List * data)
+{
+    for (long k = 0; k < data->lLength; k++) {
+        theColors [k] = ((_String*)(*data)(k))->toNum();
+
+        if (k==theColors.lLength-1) {
+            break;
+        }
+    }
+}
+
+//__________________________________________________________
+
+bool    ReadDataFromFile (_String fileName, char delimiter, _Matrix& data, _List& names)
+{
+    _List readStrings;
+    long  columns = 0,
+          lastRead;
+
+    FILE* f = doFileOpen (fileName.sData,"rb");
+    if (!f) {
+        _String errMsg;
+        errMsg = _String ('"') & fileName & "\" could not be open for writing.";
+        ProblemReport (errMsg);
+        return false;
+    }
+
+    int  c = fgetc (f);
+    while (!feof(f)) {
+        lastRead = readStrings.lLength;
+
+        _String  *currentTerm = new _String (16L, true);
+        checkPointer (currentTerm);
+
+        while ((c!='\n')&&(c!='\r')&&(c!=-1)) {
+            if (c==delimiter) {
+                currentTerm->Finalize();
+                readStrings << currentTerm;
+                currentTerm = new _String (16L, true);
+                checkPointer (currentTerm);
+            } else {
+                (*currentTerm) << (char)c;
+            }
+            c = fgetc (f);
+        }
+
+        currentTerm->Finalize();
+        if ((readStrings.lLength>lastRead)||(currentTerm->FirstNonSpaceIndex(0,-1,1)>=0)) {
+            readStrings << currentTerm;
+        } else {
+            DeleteObject (currentTerm);
+        }
+
+        c = fgetc (f);
+        while ((c=='\n')||(c=='\r')) {
+            c = fgetc(f);
+        }
+
+        if (lastRead==0) {
+            columns = readStrings.lLength;
+        }
+    }
+
+    fclose (f);
+
+    if (columns&&(readStrings.lLength>=2*columns)&&(readStrings.lLength%columns==0)) {
+        data.Clear();
+        CreateMatrix(&data,readStrings.lLength/columns-1,columns,false,true,false);
+
+        _Constant h, v;
+
+        for (lastRead = 1; lastRead < readStrings.lLength/columns; lastRead++) {
+            h.SetValue (lastRead-1);
+            for (long k=0; k<columns; k++) {
+                _String * thisString = (_String*)readStrings (lastRead*columns+k);
+                if ((thisString->sLength)&&(thisString->FirstNonSpaceIndex (0,-1)>=0)) {
+                    _Formula f (*thisString,nil,false);
+                    v.SetValue (k);
+                    if (!f.IsEmpty()) {
+                        data.MStore (&h,&v,f);
+                    }
+                }
+            }
+        }
+
+        for (lastRead = 0; lastRead < columns; lastRead++) {
+            names << readStrings (lastRead);
+        }
+    } else {
+        _String errMsg ("HyPhy didn't find a well-defined '");
+        errMsg = errMsg & delimiter & "'-separated data table in the input file.";
+        if (columns == 0) {
+            errMsg = errMsg & " Input file was empty...";
+        } else if (readStrings.lLength<2*columns) {
+            errMsg = errMsg & " Input file contained less than a single valid entry line";
+        } else {
+            errMsg = errMsg & " The number of fields read (" &(long)readStrings.lLength& ") was not divisible by the number of columns ("& columns &").";
+        }
+
+        ProblemReport (errMsg);
+        return false;
+    }
+
+    return true;
+}
+
+//__________________________________________________________
+
+void    _HYChartWindow::DoSave (long option, _String* distrib)
+{
+
+    if (option==2) {
+        _HYTable*       table = (_HYTable*)    GetObject (1),
+                        *       head  = (_HYTable*)    GetObject (2),
+                                *       left  = (_HYTable*)    GetObject (3);
+
+        _List           menuOptions;
+        _String         menuChoice,
+                        filePath,
+                        str1 ("Save data table as"),
+                        str2;
+
+        _HYTable::GetTableFormats(menuOptions);
+
+        str2 = GetTitle() & " Data Table";
+
+        long menuSel = SaveFileWithPopUp (filePath, str1 ,str2 , empty, menuOptions);
+
+        if (menuSel>=0) {
+            FILE*   outFile = doFileOpen (filePath.sData,"w");
+            if (!outFile) {
+                menuChoice = filePath & " could not be opened for writing.";
+                ProblemReport (menuChoice,(Ptr)this);
+                return;
+            }
+            table->SaveTable (head,left,menuSel,outFile,GetTitle());
+            fclose (outFile);
+        }
+    } else {
+        if (option==1) {
+            _HYCanvas* sc =  (_HYCanvas*)GetObject (0);
+            sc->_SavePicture (_String("Chart ")&GetTitle());
+        } else {
+            _String filePath,
+                    cPrompt  ("Save chart as:"),
+                    cPrompt2 (GetTitle()),
+                    cSaveAs  ("Format:");
+
+            filePath = "HYPHY Batch File";
+
+            _List   fFormats;
+
+            fFormats && & filePath;
+
+            option = SaveFileWithPopUp (filePath,cPrompt,cPrompt2,cSaveAs,fFormats);
+            if (option!=-1) {
+                FILE * f = doFileOpen (filePath.getStr(), "w");
+                if (!f) {
+                    filePath = _String ("I couldn't open \"") & filePath & "\" for writing.";
+                    ProblemReport (filePath,(Ptr)this);
+                }
+
+                fprintf (f,"columnHeaders = {{");
+                _HYTable*       table = (_HYTable*)    GetObject (1),
+                                *       head  = (_HYTable*)    GetObject (2),
+                                        *       tl    = (_HYTable*)    GetObject (3);
+
+                for (option = 0; option < head->horizontalSpaces.lLength; option++) {
+                    fprintf (f,"\"%s\",",((_String*)head->GetCellData(option,0))->getStr());
+                }
+
+
+                _HYLabel* l4 = (_HYLabel*)GetObject   (10);
+                fprintf (f,"\"%s", l4->GetText().getStr());
+
+                for (option = 0; option < tl->verticalSpaces.lLength-1; option++) {
+                    fprintf (f,";%s",((_String*)tl->GetCellData(0,option))->getStr());
+                }
+
+                fprintf (f,"\"}};\ntableData = {\n");
+
+                for (option = 0; option < table->verticalSpaces.lLength; option++) {
+                    fprintf (f,"{");
+                    fprintf (f,"%s",((_String*)table->GetCellData(0,option))->getStr());
+
+                    for (long option2 = 1; option2 < table->horizontalSpaces.lLength; option2++) {
+                        fprintf (f,",%s",((_String*)table->GetCellData(option2,option))->getStr());
+                    }
+                    fprintf (f,"}\n");
+                }
+
+                _HYRect wr = GetWindowRect ();
+
+                _HYPullDown         *p1 = (_HYPullDown*)GetObject (4);
+                _HYPullDown         *p2 = (_HYPullDown*)GetObject (5);
+
+                _String             windowType = distrib?windowTypeDistribTable:windowTypeTable;
+
+                fprintf (f,"};\nOpenWindow (%s,{{\"%s\"}\n\t\t{\"columnHeaders\"}\n\t\t{\"tableData\"}\n\t\t{\"%s\"}\n\t\t{\"%s\"}\n\t\t{\"",
+                         windowType.getStr(),
+                         GetTitle().getStr(),
+                         p1->GetMenuItem(p1->GetSelection())->getStr(),
+                         p2->GetMenuItem(p2->GetSelection())->getStr());
+
+                if (ySeries.lLength==0) {
+                    fprintf (f,"None");
+                } else {
+                    fprintf (f,"%s",((_String*)head->GetCellData(ySeries.lData[0],0))->getStr());
+                    for (option = 1; option < ySeries.lLength; option++) {
+                        fprintf (f,";%s",((_String*)head->GetCellData(ySeries.lData[option],0))->getStr());
+                    }
+                }
+
+                _String * fla = (_String*)overlayPlot.toStr();
+
+                fprintf (f,
+                         "\"}\n\t\t{\"%s\"}\n\t\t{\"%s\"}\n\t\t{\"%s\"}\n\t\t{\"%d\"}\n\t\t{\"%s\"}\n\t\t{\"%ld;%ld\"}\n\t\t{\"%g;%g;%g\"}\n\t\t{\"%s:%d:%d;%s:%d:%d;%s:%d:%d\"}\n\t\t{\"",
+                         xLabel.getStr(),
+                         yLabel.getStr(),
+                         zLabel.getStr(),
+                         (int)showLegend,
+                         fla->getStr(),
+                         xAxis3DScale+1,
+                         yAxis3DScale+1,
+                         oR,
+                         xyAngle,
+                         zAngle,
+                         labelFont1.face.sData,
+                         labelFont1.size,
+                         labelFont1.style,
+                         labelFont2.face.sData,
+                         labelFont2.size,
+                         labelFont2.style,
+                         labelFont3.face.sData,
+                         labelFont3.size,
+                         labelFont3.style);
+
+                fprintf (f, "%ld", theColors.lData[0]);
+                for (option = 1; option<theColors.lLength; option++) {
+                    fprintf (f, ";%ld", theColors.lData[option]);
+                }
+
+
+                if (distrib)
+                    fprintf (f,"\"}\n\t\t{\"%ld,%g,%g\"}\n\t\t{\"%s\"}\n\t\t}",
+                             surfaceDivs,userMin,userMax,
+                             distrib->getStr());
+
+                else
+                    fprintf (f,"\"}\n\t\t{\"%ld,%g,%g\"}\n\t\t}",
+                             surfaceDivs,userMin,userMax);
+
+                fprintf (f,",\n\t\t\"%ld;%ld;%ld;%ld\");",
+                         wr.right-wr.left,
+                         wr.bottom-wr.top,
+                         wr.left,
+                         wr.top);
+
+                DeleteObject (fla);
+                fclose (f);
+            }
+        }
+    }
+}
+
+//__________________________________________________________
+
+void    _HYChartWindow::DoPrint (long option)
+{
+    if (option) {
+        _HYTable*       table = (_HYTable*)    GetObject (1),
+                        *       head  = (_HYTable*)    GetObject (2);
+
+        table->_PrintTable (head);
+    } else {
+        _PrintChart();
+    }
+
+}
+
+//__________________________________________________________
+
+_Matrix* _HYChartWindow::ComputeProjectionMatrix (void)
+{
+    if (projectionMatrix) {
+        DeleteObject (projectionMatrix);
+        projectionMatrix = nil;
+    }
+
+    _Matrix      *res = new _Matrix (4,4,false,true);
+    checkPointer (res);
+
+    _Parameter   den = 1+projectionSettings[5],
+                 a = projectionSettings[0],
+                 b = projectionSettings[1],
+                 c = projectionSettings[2],
+                 d = projectionSettings[3],
+                 e = projectionSettings[4],
+                 f = projectionSettings[5],
+                 r = 1./projectionSettings[6];
+
+    res->theData[0] = (e*e+f*(1+f))/den;
+    res->theData[1] = res->theData[4] = -d*e/den;
+    res->theData[2] = res->theData[6] = res->theData[10] = res->theData[14];
+    res->theData[3] = d*r;
+    res->theData[5] = (d*d+f*(1+f))/den;
+    res->theData[7] = e*r;
+    res->theData[8] = -d;
+    res->theData[9] = -e;
+    res->theData[11] = f*r;
+    res->theData[12] = (c*d+b*d*e-a*e*e-a*f+c*d*f-a*f*f)/den;
+    res->theData[13] = (-b*d*d+c*e+a*d*e-b*f+c*e*f-b*f*f)/den;
+    res->theData[15] = -(a*d+b*e+c*f)*r;
+
+    return res;
+}
+
+//__________________________________________________________
+
+void    _HYChartWindow::DrawAParallelogram  (_Matrix& pData ,char  ,_Parameter ,_HYRect& cRect)
+
+/* order of points:
+
+    x direction -> left
+    y direction -> up
+    z direction -> away
+
+    3------4 (farther)
+    |      |
+    |      | (top face) (x direction ---->)
+    |      |
+    1------2 (closer)
+
+    7------8 (farther)
+    |      |
+    |      | (bottom face)
+    |      |
+    5------6 (closer)
+
+    order of painting the faces:
+
+        3487 (back)
+        5687 (bottom)
+        1375 (left)
+        2486 (right)
+        1243 (top)
+        5621 (front)
+*/
+
+{
+
+    _Matrix    *projP = ComputeProjection (pData);
+
+    PaintAFace (*projP,2,3,7,6,cRect);
+    PaintAFace (*projP,4,5,7,6,cRect);
+    PaintAFace (*projP,0,2,6,4,cRect);
+    PaintAFace (*projP,1,3,7,5,cRect,.7);
+    PaintAFace (*projP,0,1,3,2,cRect,.8);
+    PaintAFace (*projP,4,5,1,0,cRect);
+
+    DeleteObject (projP);
+}
+
+//__________________________________________________________
+
+_Matrix*    _HYChartWindow::ComputeProjection   (_Matrix& pData)
+{
+    _Matrix             hompc (pData.GetHDim(),4,false,true),
+                        *projP;
+
+    long                counter;
+
+    for (counter = 0; counter < hompc.GetHDim(); counter++) {
+        hompc.theData[counter*4]   = pData.theData[counter*3];
+        hompc.theData[counter*4+1] = pData.theData[counter*3+1];
+        hompc.theData[counter*4+2] = pData.theData[counter*3+2];
+        hompc.theData[counter*4+3] = 1;
+    }
+
+    projP = (_Matrix*)hompc.MultObj (projectionMatrix);
+
+    for (counter = 0; counter < hompc.GetHDim(); counter++) {
+        _Parameter scaling = 1./projP->theData[counter*4+3];
+
+        projP->theData[counter*4]   *= scaling;
+        projP->theData[counter*4+1] *= scaling;
+        projP->theData[counter*4+2] *= scaling;
+    }
+
+    return projP;
+}
+
+//__________________________________________________________
+
+void    _HYChartWindow::DrawALine           (_Matrix& pData ,char  ,_Parameter ,_HYRect& cRect, long width,
+        _String* label, long xSpace, long ySpace)
+
+{
+    _HYStretchCanvas    *sc = (_HYStretchCanvas*)GetObject (0);
+    _Matrix             *projP = ComputeProjection (pData);
+    _HYRect             lineRect;
+
+    lineRect.left       = cRect.left   - xShift + xScale*(*projP)(0,0);
+    lineRect.right      = cRect.left   - xShift + xScale*(*projP)(1,0);
+    lineRect.top        = cRect.bottom + yShift - yScale*(*projP)(0,1);
+    lineRect.bottom     = cRect.bottom + yShift - yScale*(*projP)(1,1);
+    lineRect.width      = width;
+
+    sc->DrawLine (lineRect);
+
+    if (label) {
+        _HYColor       bc = sc->GetColor();
+
+        sc->SetColor    (LongToHYColor (theColors[HY_CHART_COLOR_COORD_LABEL]));
+        sc->DisplayText (*label, lineRect.top+ySpace, lineRect.left+xSpace, true);
+        sc->SetColor    (bc);
+    }
+}
+
+//__________________________________________________________
+
+void    _HYChartWindow::DrawAPlane          (_Matrix& pData ,char opt ,_Parameter ,_HYRect& cRect)
+/* specify the plane (rectangle) as follows
+
+    1----2
+    |    |
+    |    |
+    3----4
+*/
+
+{
+    _Matrix             *projP = ComputeProjection (pData);
+    PaintAFace          (*projP,0,1,3,2,cRect,1., opt);
+    DeleteObject        (projP);
+}
+
+//__________________________________________________________
+
+void    _HYChartWindow::PaintAFace          (_Matrix& pData ,long v1, long v2, long v3, long v4,_HYRect& cRect,_Parameter shading, char opt)
+{
+    _HYStretchCanvas    *sc = (_HYStretchCanvas*)GetObject (0);
+
+    _SimpleList         points;
+
+    points << cRect.left   - xShift + xScale*pData(v1,0);
+    points << cRect.bottom + yShift - yScale*pData(v1,1);
+    points << cRect.left   - xShift + xScale* pData(v2,0);
+    points << cRect.bottom + yShift - yScale* pData(v2,1);
+    points << cRect.left   - xShift + xScale* pData(v3,0);
+    points << cRect.bottom + yShift - yScale* pData(v3,1);
+    points << cRect.left   - xShift + xScale* pData(v4,0);
+    points << cRect.bottom + yShift - yScale* pData(v4,1);
+
+    _HYColor       bc = sc->GetColor(),
+                   nc = sc->GetColor();
+
+    if (opt == 0) {
+        if (shading!=1.0) {
+            nc.R   *= shading;
+            nc.B   *= shading;
+            nc.G   *= shading;
+            sc->SetColor (nc);
+        }
+        sc->FillPolygon  (points);
+    }
+
+    if (opt != 2) {
+        sc->SetColor (LongToHYColor(theColors[HY_CHART_COLOR_BARBORDER]));
+    } else {
+        sc->SetColor (LongToHYColor(theColors[HY_CHART_COLOR_OVERPLOT]));
+    }
+
+    sc->DrawPolygon  (points,1);
+    sc->SetColor (bc);
+
+}
+
+//__________________________________________________________
+
+void    _HYChartWindow::SetFont     (_HYFont& newFont)
+{
+    if (whichFont == 0) {
+        labelFont1 = newFont;
+        DrawChart ();
+    } else {
+        if (whichFont == 1) {
+            labelFont2 = newFont;
+            if (showLegend != HY_CHART_LEGEND_NONE) {
+                DrawChart();
+            }
+        } else {
+            labelFont3 = newFont;
+            if (xLabel.sLength+yLabel.sLength+zLabel.sLength) {
+                DrawChart();
+            }
+        }
+    }
+}
+
+//__________________________________________________________
+
+void    _HYChartWindow::DoChangeFont        (long item)
+{
+    _HYFont *inFont;
+    switch (item) {
+    case 0:
+        inFont = &labelFont1;
+        break;
+    case 1:
+        inFont = &labelFont2;
+        break;
+    case 2:
+        inFont = &labelFont3;
+        break;
+    }
+    _HYFontDialog * fD = new _HYFontDialog (*inFont,this);
+    checkPointer  (fD);
+
+    fD->BringToFront();
+
+    whichFont = item;
+
+    while (windowObjectRefs.Find ((long)fD)>=0) {
+        handleGUI();
+    }
+}
+
+//__________________________________________________________
+
+void    _HYChartWindow::HandleChartOptions      (void)
+{
+    _List       args;
+
+    _String*    overlayString = (_String*)overlayPlot.toStr();
+
+    args && & xLabel;
+    args && & yLabel;
+    args && & zLabel;
+    args << overlayString;
+    args.AppendNewInstance(new _String (xAxis3DScale));
+    args.AppendNewInstance(new _String (yAxis3DScale));
+    args.AppendNewInstance(new _String (surfaceDivs));
+    if (!CheckEqual (userMin, userMax)) {
+        args.AppendNewInstance(new _String (userMin));
+        args.AppendNewInstance(new _String (userMax));
+    } else {
+        args && & empty;
+        args && & empty;
+    }
+
+    long        lsel = showLegend;
+    bool        res  = false;
+    _SimpleList clst;
+
+    clst.Duplicate (&theColors);
+
+    _HYChartOptionDialog * fD = new _HYChartOptionDialog (&args,&lsel,&res,&clst, this);
+    checkPointer  (fD);
+
+    fD->BringToFront();
+
+    while (windowObjectRefs.Find ((long)fD)>=0) {
+        handleGUI();
+    }
+
+    if (res) {
+        res = false;
+
+        if (!((_String*)args(0))->Equal(&xLabel)) {
+            res = true;
+            xLabel = *(_String*)args(0);
+        }
+        if (!((_String*)args(1))->Equal(&yLabel)) {
+            res = true;
+            yLabel = *(_String*)args(1);
+        }
+        if (!((_String*)args(2))->Equal(&zLabel)) {
+            res = true;
+            zLabel = *(_String*)args(2);
+        }
+        if (lsel!=showLegend) {
+            res = true;
+            showLegend = lsel;
+        }
+
+        if (!((_String*)args(3))->Equal(overlayString)) {
+            DeleteObject (overlayString);
+            overlayString = (_String*)args(3);
+            res = true;
+            overlayPlot.Clear();
+
+
+
+            if (overlayString->sLength) {
+                long varRef = 0;
+                _String errMsg;
+              _FormulaParsingContext fpc(&errMsg, nil);
+		if (Parse (&overlayPlot, *(_String*)args(3),fpc,nil)!= HY_FORMULA_EXPRESSION) {
+                    overlayPlot.Clear();
+                }
+            }
+        } else {
+            DeleteObject (overlayString);
+        }
+
+        lsel = ((_String*)args(4))->toNum();
+
+        if (xAxis3DScale!=lsel) {
+            xAxis3DScale = lsel;
+        }
+
+        lsel = ((_String*)args(5))->toNum();
+
+        if (yAxis3DScale!=lsel) {
+            yAxis3DScale = lsel;
+        }
+
+        lsel = ((_String*)args(6))->toNum();
+
+        if ((surfaceDivs != lsel)&&(lsel>1)) {
+            surfaceDivs = lsel;
+            res = true;
+        }
+
+        res |= SetUserBounds (((_String*)args(7))->toNum(), ((_String*)args(8))->toNum());
+
+        for (lsel = 0; lsel < clst.lLength; lsel++)
+            if (clst.lData[lsel] != theColors.lData[lsel]) {
+                theColors.Duplicate (&clst);
+                res = true;
+                break;
+            }
+
+        if (res) {
+            DrawChart();
+        }
+    }
+
+}
+
+//__________________________________________________________
+
+void    _HYChartWindow::SetLabels       (_String xx, _String yy, _String zz, long vv, _String fla, long xs, long ys, long sDiv, _Parameter uMin, _Parameter uMax)
+{
+    xLabel      =   xx;
+    yLabel      =   yy;
+    zLabel      =   zz;
+    showLegend  =   vv;
+    overlayPlot.Clear();
+
+    if (fla.sLength) {
+        long varRef = 0;
+        _String errMsg;
+      _FormulaParsingContext fpc (&errMsg);
+        if (Parse (&overlayPlot, fla,fpc, nil)!= HY_FORMULA_EXPRESSION) {
+            overlayPlot.Clear();
+        }
+    }
+
+    xAxis3DScale = xs;
+    yAxis3DScale = ys;
+
+    if (sDiv>1) {
+        surfaceDivs = sDiv;
+    }
+
+    SetUserBounds (uMin, uMax);
+
+    DrawChart   ();
+}
+
+//__________________________________________________________
+
+long    _HYChartWindow::Get3DScaling        (bool isY)
+{
+    return isY?yAxis3DScale:xAxis3DScale;
+}
+
+//__________________________________________________________________
+void        _HYChartWindow::HandleCopyPaste (bool paste)
+{
+    if (!paste) {
+        _HYTable*               table = (_HYTable*)    GetObject (1);
+        _SimpleList             tSel;
+
+        table->GetSelection     (tSel);
+
+        if (tSel.lLength == 0) {
+            _CopyChart ();
+            return;
+        }
+    }
+
+    _HYTWindow::HandleCopyPaste (paste);
+}
+
+//__________________________________________________________________
+void        _HYChartWindow::RenameChartWindow (void)
+{
+    _String currentName = GetTitle(),
+            prompt      = "New Chart Name:",
+            newName     = currentName;
+
+    if (EnterStringDialog (newName, prompt, (Ptr)this)) {
+        if (!newName.Equal (&currentName)) {
+            SetTitle (newName);
+        }
+    }
+}
+
+//__________________________________________________________
+
+void    _HYChartWindow::ExecuteProcessor (long cID)
+{
+    if (cID<chartProcessors.lLength) {
+        _HYTable*               table   = (_HYTable*)      GetObject (1);
+        _HYTable*               tableH = (_HYTable*)       GetObject (2);
+        _SimpleList             tableSel;
+
+        table->GetSelection     (tableSel);
+
+        if (tableSel.lLength > 0) {
+            //_String         eM ("Please select some entries in the data table before calling result processing modules.");
+            //ProblemReport (eM);
+            //return;
+            //}
+            //else
+            //{
+            _Matrix selData(1,tableSel.lLength,false,true),
+                    selRows(1,tableSel.lLength,false,true),
+                    selCols(1,tableSel.lLength,false,true);
+
+            for (long k=0; k<tableSel.lLength; k++) {
+                long r = tableSel.lData[k]/table->horizontalSpaces.lLength,
+                     c = tableSel.lData[k]%table->horizontalSpaces.lLength;
+
+                selData.theData[k] = ((_String*)table->GetCellData(c,r))->toNum();
+                selRows.theData[k] = r;
+                selCols.theData[k] = c;
+            }
+
+            setParameter (chartProcessorDataMatrix,&selData);
+            setParameter (chartProcessorRowMatrix, &selRows);
+            setParameter (chartProcessorColMatrix, &selCols);
+        }
+
+        _List            colNList;
+
+        for (long cc = 0; cc < tableH->horizontalSpaces.lLength; cc++) {
+            colNList << tableH->GetCellData (cc, 0);
+        }
+
+        _Matrix       colNames (colNList);
+        setParameter (chartColumnHeaders, &colNames);
+        setParameter (nonEmptyChartSelection, tableSel.lLength);
+
+        _Matrix tableDims (1,2,false,true);
+        tableDims.theData[0] = table->verticalSpaces.lLength;
+        tableDims.theData[1] = table->horizontalSpaces.lLength;
+        setParameter (tableDimensions, &tableDims);
+
+        FILE * thisFile = doFileOpen (((_String*)chartProcessors(cID))->sData,"rb");
+        if (thisFile) {
+            _String buffer (thisFile);
+            fclose (thisFile);
+
+            long   g = batchLanguageFunctionNames.lLength;
+
+            setParameter (updateCellData,0.0);
+            setParameter (updateTableSelection,0.0);
+
+            _String cpp = *((_String*)chartProcessors(cID));
+
+            PushFilePath (cpp);
+            _ExecutionList   thisList;
+            terminateExecution = false;
+            thisList.BuildList (buffer);
+            thisList.ExecuteAndClean(g);
+            terminateExecution = false;
+
+            PopFilePath ();
+
+            _Parameter setValues = 0.0;
+
+            checkParameter (nonEmptyChartSelection, setValues, 0.0);
+
+            if (setValues < -.1) {
+                _String       eM ("Please select some entries in the data table before calling result processing modules.");
+                ProblemReport (eM);
+            } else {
+                checkParameter (updateCellData, setValues, 0.0);
+
+                if (setValues>0.1) {
+                    _Variable * rM = FetchVar(LocateVarByName (chartProcessorRowMatrix)),
+                                * cM = FetchVar(LocateVarByName (chartProcessorColMatrix)),
+                                  * cV = FetchVar(LocateVarByName (chartProcessorDataMatrix));
+
+                    if ((rM->ObjectClass()==MATRIX)&&(cM->ObjectClass()==MATRIX)&&(cV->ObjectClass()==MATRIX)) {
+                        _Matrix   * rowIndices      = (_Matrix*)rM->Compute(),
+                                    * colIndices     = (_Matrix*)cM->Compute(),
+                                      * cellValues      = (_Matrix*)cV->Compute();
+
+                        if ((rowIndices->GetHDim()==1)&&(colIndices->GetHDim()==1)&&(cellValues->GetHDim()==1)
+                                &&(rowIndices->GetVDim()==colIndices->GetVDim())&&(cellValues->GetVDim()==colIndices->GetVDim())) {
+                            _SimpleList   toUpdate;
+
+                            for (long jj = 0; jj < cellValues->GetVDim(); jj++) {
+                                _String newVal ((*cellValues)(0,jj));
+
+                                long    cI = (*colIndices)(0,jj),
+                                        rI = (*rowIndices)(0,jj);
+
+                                if ((rI<table->verticalSpaces.lLength)&&(cI<table->horizontalSpaces.lLength)) {
+                                    long idx = rI*table->horizontalSpaces.lLength + cI;
+                                    table->SetCellData (&newVal,rI,cI,table->cellTypes.lData[idx],true);
+                                    toUpdate << idx;
+                                }
+                            }
+
+                            table->_MarkCellsForUpdate (toUpdate);
+                            DrawChart ();
+
+                        } else {
+                            _String       eM = _String ("Can't update cell values because the three matrices: ") & chartProcessorRowMatrix &
+                                               ',' & chartProcessorColMatrix & " or " & chartProcessorDataMatrix & " are not column vector of the same dimension.";
+
+                            ProblemReport (eM);
+                            return;
+                        }
+                    } else {
+                        _String       eM = _String ("Can't update cell values because one of the three variables: ") & chartProcessorRowMatrix &
+                                           ',' & chartProcessorColMatrix & " or " & chartProcessorDataMatrix & " is not a matrix, as expected";
+                        ProblemReport (eM);
+                        return;
+                    }
+                } else {
+                    checkParameter (updateTableSelection, setValues, 0.0);
+                    if (setValues > 0.1) {
+                        _Variable * cM = FetchVar(LocateVarByName (chartProcessorColMatrix)),
+                                    * rM = FetchVar(LocateVarByName (chartProcessorRowMatrix));
+
+                        if ((rM->ObjectClass()==MATRIX)&&(cM->ObjectClass()==MATRIX)) {
+                            _Matrix   * rowIndices      = (_Matrix*)rM->Compute(),
+                                        * colIndices     = (_Matrix*)cM->Compute();
+
+                            if ((rowIndices->GetHDim()==1)&&(colIndices->GetHDim()==1)&&(rowIndices->GetVDim()==colIndices->GetVDim())) {
+                                _SimpleList   toUpdate;
+                                for (long jj = 0; jj < rowIndices->GetVDim(); jj++) {
+                                    toUpdate << rowIndices->theData[jj] * table->horizontalSpaces.lLength+
+                                             colIndices->theData[jj];
+                                }
+                                table->SetSelection (toUpdate,true);
+                                table->_MarkForUpdate();
+                            } else {
+                                _String       eM = _String ("Can't update cell values because the two matrices: ") & chartProcessorRowMatrix &
+                                                   ',' & chartProcessorColMatrix & " are not column vector of the same dimension.";
+
+                                ProblemReport (eM);
+                                return;
+                            }
+                        } else {
+                            _String       eM = _String ("Can't update cell values because one of the two variables: ") & chartProcessorRowMatrix &
+                                               ',' & chartProcessorColMatrix & " is not a matrix, as expected";
+                            ProblemReport (eM);
+                            return;
+                        }
+                    }
+                }
+            }
+        } else {
+            _String eMsg = _String("Problem reading file:") & *((_String*)chartProcessors(cID));
+            ProblemReport (eMsg);
+        }
+
+        DeleteVariable (chartProcessorRowMatrix);
+        DeleteVariable (chartProcessorColMatrix);
+        DeleteVariable (chartProcessorDataMatrix);
+        DeleteVariable (tableDimensions);
+        DeleteVariable (chartColumnHeaders);
+    }
+}
+
+//__________________________________________________________
+
+_HYChartOptionDialog::_HYChartOptionDialog (_List* argList, long* legOpt, bool* retVal, _SimpleList* clst,_HYChartWindow* pw):_HYTWindow ("HyPhy Chart Preferences", false, true, (Ptr)pw)
+{
+    _HYRect         canvasSettings = {30,100,30,100,HY_COMPONENT_NO_SCROLL|HY_COMPONENT_TRANSP_BG};
+
+    args                = argList;
+    msel                = legOpt;
+    res                 = retVal;
+    parWin              = pw;
+    colorsPicked        = clst;
+
+    _HYLabel*       l1      = new _HYLabel (canvasSettings, GetOSWindowData());
+    _HYLabel*       l2      = new _HYLabel (canvasSettings, GetOSWindowData());
+    _HYLabel*       l3      = new _HYLabel (canvasSettings, GetOSWindowData());
+    _HYLabel*       l4      = new _HYLabel (canvasSettings, GetOSWindowData());
+    _HYLabel*       l5      = new _HYLabel (canvasSettings, GetOSWindowData());
+    _HYLabel*       l6      = new _HYLabel (canvasSettings, GetOSWindowData());
+    _HYLabel*       l7      = new _HYLabel (canvasSettings, GetOSWindowData());
+    _HYLabel*       l8      = new _HYLabel (canvasSettings, GetOSWindowData());
+    _HYLabel*       l9      = new _HYLabel (canvasSettings, GetOSWindowData());
+    _HYLabel*       l10     = new _HYLabel (canvasSettings, GetOSWindowData());
+
+    checkPointer   (l1);
+    checkPointer   (l2);
+    checkPointer   (l3);
+    checkPointer   (l4);
+    checkPointer   (l5);
+    checkPointer   (l6);
+    checkPointer   (l7);
+    checkPointer   (l8);
+    checkPointer   (l9);
+    checkPointer   (l10);
+
+    _HYColor        bgc     = GetDialogBackgroundColor();
+
+    canvasSettings.left = canvasSettings.right = 200;
+
+    _HYPullDown*    p1      = new _HYPullDown (canvasSettings, GetOSWindowData());
+    _HYPullDown*    p2      = new _HYPullDown (canvasSettings, GetOSWindowData());
+    _HYPullDown*    p3      = new _HYPullDown (canvasSettings, GetOSWindowData());
+    _HYPullDown*    p4      = new _HYPullDown (canvasSettings, GetOSWindowData());
+
+    checkPointer   (p1);
+    checkPointer   (p2);
+    checkPointer   (p3);
+    checkPointer   (p4);
+
+    _HYTextBox *    t1      = new _HYTextBox (canvasSettings, GetOSWindowData());
+    _HYTextBox *    t2      = new _HYTextBox (canvasSettings, GetOSWindowData());
+    _HYTextBox *    t3      = new _HYTextBox (canvasSettings, GetOSWindowData());
+    _HYTextBox *    t4      = new _HYTextBox (canvasSettings, GetOSWindowData());
+    _HYTextBox *    t5      = new _HYTextBox (canvasSettings, GetOSWindowData());
+
+    checkPointer    (t1);
+    checkPointer    (t2);
+    checkPointer    (t3);
+    checkPointer    (t4);
+    checkPointer    (t5);
+
+    canvasSettings.left = canvasSettings.right = 100;
+
+    _HYTextBox *    t6      = new _HYTextBox (canvasSettings, GetOSWindowData());
+    _HYTextBox *    t7      = new _HYTextBox (canvasSettings, GetOSWindowData());
+
+    checkPointer    (t6);
+    checkPointer    (t7);
+
+    canvasSettings.left = canvasSettings.right = 101;
+    _HYButton*      b1      = new _HYButton (canvasSettings, GetOSWindowData());
+
+    canvasSettings.left = canvasSettings.right = 101;
+    _HYButton*      b2      = new _HYButton (canvasSettings, GetOSWindowData());
+
+    canvasSettings.left = canvasSettings.right = 100;
+    _HYButton*      b3      = new _HYButton (canvasSettings, GetOSWindowData());
+
+    canvasSettings.left = canvasSettings.right = 300;
+    _HYCanvas*      color   = new _HYCanvas (canvasSettings, GetOSWindowData(), canvasSettings.top, canvasSettings.left, 32);
+    checkPointer    (color);
+
+    b1->SetMessageRecipient (this);
+    b2->SetMessageRecipient (this);
+    b3->SetMessageRecipient (this);
+    t1->SetMessageRecipient (this);
+    t2->SetMessageRecipient (this);
+    t3->SetMessageRecipient (this);
+    t4->SetMessageRecipient (this);
+    t5->SetMessageRecipient (this);
+    t6->SetMessageRecipient (this);
+    t7->SetMessageRecipient (this);
+
+    p4->SetMessageRecipient (this);
+    color->SetMessageRecipient (this);
+    color->SetMouseClick       (true);
+
+    AddObject (l1); // 0
+    AddObject (l2); // 1
+    AddObject (l3); // 2
+    AddObject (l4); // 3
+    AddObject (l5); // 4
+
+    AddObject (p1); // 5
+
+    AddObject (t1); // 6
+    AddObject (t2); // 7
+    AddObject (t3); // 8
+    AddObject (t4); // 9
+
+    AddObject (b1); // 10
+    AddObject (b2); // 11
+    AddObject (b3); // 12
+
+    AddObject (l6); // 13
+    AddObject (l7); // 14
+
+    AddObject (p2); // 15
+    AddObject (p3); // 16
+
+    AddObject (l8); // 17
+    AddObject (p4); // 18
+    AddObject (color); // 19
+
+    AddObject (l9); // 20
+    AddObject (t5); // 21
+
+    AddObject (l10); // 22
+    AddObject (t6); // 23
+    AddObject (t7); // 24
+
+
+
+
+    keyboardFocusChain << 6;
+    keyboardFocusChain << 7;
+    keyboardFocusChain << 8;
+    keyboardFocusChain << 9;
+    keyboardFocusChain << 21;
+    keyboardFocusChain << 23;
+    keyboardFocusChain << 24;
+
+    SetTableDimensions (12,4);
+
+    SetCell   (0,0,l1);
+    SetCell   (0,1,t1);
+    SetCell   (0,2,t1);
+    SetCell   (0,3,t1);
+
+    SetCell   (1,0,l2);
+    SetCell   (1,1,t2);
+    SetCell   (1,2,t2);
+    SetCell   (1,3,t2);
+
+    SetCell   (2,0,l3);
+    SetCell   (2,1,t3);
+    SetCell   (2,2,t3);
+    SetCell   (2,3,t3);
+
+    SetCell   (3,0,l5);
+    SetCell   (3,1,t4);
+    SetCell   (3,2,t4);
+    SetCell   (3,3,t4);
+
+    SetCell   (4,0,l9);
+    SetCell   (4,1,t5);
+    SetCell   (4,2,t5);
+    SetCell   (4,3,t5);
+
+    SetCell   (5,0,l10);
+    SetCell   (5,1,t6);
+    SetCell   (5,2,t7);
+    SetCell   (5,3,t7);
+
+    SetCell   (6,0,l4);
+    SetCell   (6,1,p1);
+    SetCell   (6,2,p1);
+    SetCell   (6,3,p1);
+
+    SetCell   (7,0,l6);
+    SetCell   (7,1,p2);
+    SetCell   (7,2,p2);
+    SetCell   (7,3,p2);
+
+    SetCell   (8,0,l7);
+    SetCell   (8,1,p3);
+    SetCell   (8,2,p3);
+    SetCell   (8,3,p3);
+
+    SetCell   (9,0,l8);
+    SetCell   (9,1,p4);
+    SetCell   (9,2,p4);
+    SetCell   (9,3,p4);
+
+    SetCell   (10,0,color);
+    SetCell   (10,1,color);
+    SetCell   (10,2,color);
+    SetCell   (10,3,color);
+
+    SetCell   (11,0,b3);
+    SetCell   (11,1,b1);
+    SetCell   (11,2,b2);
+    SetCell   (11,3,b2);
+
+
+    _HYFont  labelFont;
+    l1->SetBackColor (bgc);
+    l2->SetBackColor (bgc);
+    l3->SetBackColor (bgc);
+    l4->SetBackColor (bgc);
+    l5->SetBackColor (bgc);
+    l6->SetBackColor (bgc);
+    l7->SetBackColor (bgc);
+    l8->SetBackColor (bgc);
+    l9->SetBackColor (bgc);
+    l10->SetBackColor (bgc);
+
+    p1->SetBackColor (bgc);
+
+    t1->SetBackColor (bgc);
+    t2->SetBackColor (bgc);
+    t3->SetBackColor (bgc);
+    t4->SetBackColor (bgc);
+    t5->SetBackColor (bgc);
+    t6->SetBackColor (bgc);
+    t7->SetBackColor (bgc);
+
+    b1->SetBackColor (bgc);
+    b2->SetBackColor (bgc);
+    b3->SetBackColor (bgc);
+
+
+    labelFont.face  = "System Font";
+    labelFont.size  = 12;
+    labelFont.style = HY_FONT_PLAIN;
+
+    l1->SetFont (labelFont);
+    l2->SetFont (labelFont);
+    l3->SetFont (labelFont);
+    l4->SetFont (labelFont);
+    l5->SetFont (labelFont);
+    l6->SetFont (labelFont);
+    l7->SetFont (labelFont);
+    l8->SetFont (labelFont);
+    l9->SetFont (labelFont);
+    l10->SetFont (labelFont);
+
+    b1->SetFont (labelFont);
+    b2->SetFont (labelFont);
+    b3->SetFont (labelFont);
+
+    labelFont.face  = "Times";
+
+    t1->SetFont (labelFont);
+    t2->SetFont (labelFont);
+    t3->SetFont (labelFont);
+    t4->SetFont (labelFont);
+    t5->SetFont (labelFont);
+    t6->SetFont (labelFont);
+    t7->SetFont (labelFont);
+
+    color->StartDraw();
+    color->SetFont (labelFont);
+    color->SetDialogBG ();
+    color->EndDraw();
+
+    l1->SetAlignFlags (HY_ALIGN_LEFT);
+    l2->SetAlignFlags (HY_ALIGN_LEFT);
+    l3->SetAlignFlags (HY_ALIGN_LEFT);
+    l4->SetAlignFlags (HY_ALIGN_LEFT);
+    l5->SetAlignFlags (HY_ALIGN_LEFT);
+    l6->SetAlignFlags (HY_ALIGN_LEFT);
+    l7->SetAlignFlags (HY_ALIGN_LEFT);
+    l8->SetAlignFlags (HY_ALIGN_LEFT);
+    l9->SetAlignFlags (HY_ALIGN_LEFT);
+    l10->SetAlignFlags (HY_ALIGN_LEFT);
+
+    t1->SetAlignFlags (HY_ALIGN_LEFT);
+    t2->SetAlignFlags (HY_ALIGN_LEFT);
+    t3->SetAlignFlags (HY_ALIGN_LEFT);
+    t4->SetAlignFlags (HY_ALIGN_LEFT);
+    t5->SetAlignFlags (HY_ALIGN_LEFT);
+    t6->SetAlignFlags (HY_ALIGN_LEFT);
+    t7->SetAlignFlags (HY_ALIGN_LEFT);
+
+    //b3->SetAlignFlags (HY_ALIGN_LEFT);
+    b1->SetAlignFlags (HY_ALIGN_RIGHT);
+
+    p1->SetAlignFlags (HY_ALIGN_LEFT);
+    p2->SetAlignFlags (HY_ALIGN_LEFT);
+    p3->SetAlignFlags (HY_ALIGN_LEFT);
+    p4->SetAlignFlags (HY_ALIGN_LEFT);
+
+    l1->SetText       ("X Axis:");
+    l2->SetText       ("Y Axis:");
+    l3->SetText       ("Value Axis:");
+
+    l4->SetText       ("Legend:");
+    l5->SetText       ("Overplot f(_x_)=");
+
+    l6->SetText       ("3D X scaling:");
+    l7->SetText       ("3D Y scaling:");
+    l8->SetText       ("Colors:");
+
+    l9->SetText       ("Surface Divisions:");
+
+    l10->SetText      ("Y Range:");
+
+    b1->SetText       ("  OK  ");
+    b1->SetButtonKind (HY_BUTTON_OK);
+    b2->SetText       (" Cancel ");
+    b2->SetButtonKind (HY_BUTTON_CANCEL);
+    b3->SetText       (" Apply ");
+
+
+    p1->AddMenuItem   ("None",-1);
+    p1->AddMenuItem   ("Top Left",-1);
+    p1->AddMenuItem   ("Top Middle",-1);
+    p1->AddMenuItem   ("Top Right",-1);
+    p1->AddMenuItem   ("Bottom Left",-1);
+    p1->AddMenuItem   ("Bottom Middle",-1);
+    p1->AddMenuItem   ("Bottom Right",-1);
+    p1->AddMenuItem   ("Middle Left",-1);
+    p1->AddMenuItem   ("Middle Right",-1);
+    p1->ChangeSelection
+    (*msel,false);
+
+    p2->AddMenuItem   ("None",-1);
+    p2->AddMenuItem   (menuSeparator,-1);
+    p3->AddMenuItem   ("None",-1);
+    p3->AddMenuItem   (menuSeparator,-1);
+
+    _HYTable*         thead = (_HYTable*)pw->GetObject (2);
+
+    for (long k=0; k<thead->horizontalSpaces.lLength; k++) {
+        _String* tentry = (_String*)thead->GetCellData (k,0);
+        p2->AddMenuItem (*tentry,-1);
+        p3->AddMenuItem (*tentry,-1);
+    }
+
+    if (pw->Get3DScaling (false)>=0) {
+        p2->ChangeSelection (pw->Get3DScaling (false)+2, false);
+    }
+
+    if (pw->Get3DScaling (true)>=0) {
+        p3->ChangeSelection (pw->Get3DScaling (true)+2, false);
+    }
+
+    t1->SetText       (*(_String*)(*args)(0),false);
+    t2->SetText       (*(_String*)(*args)(1),false);
+    t3->SetText       (*(_String*)(*args)(2),false);
+    t4->SetText       (*(_String*)(*args)(3),false);
+    t5->SetText       (*(_String*)(*args)(6),false);
+    t6->SetText       (*(_String*)(*args)(7),false);
+    t7->SetText       (*(_String*)(*args)(8),false);
+
+    for (long k=0; k<HY_CHART_COLOR_OFFSET; k++) {
+        p4->AddMenuItem (chartColorLabels[k], -1);
+    }
+
+    for (long k=1; k<=HY_CHART_COLOR_COUNT; k++) {
+        _String lbl = "Series ";
+        lbl = lbl & k & " color";
+        p4->AddMenuItem (lbl, -1);
+    }
+
+    DrawColorCanvas ();
+
+    DeleteObject    (l1);
+    DeleteObject    (l2);
+    DeleteObject    (l3);
+    DeleteObject    (l4);
+    DeleteObject    (l5);
+    DeleteObject    (l6);
+    DeleteObject    (l7);
+    DeleteObject    (l8);
+    DeleteObject    (l9);
+    DeleteObject    (l10);
+
+    DeleteObject    (p1);
+    DeleteObject    (p2);
+    DeleteObject    (p3);
+    DeleteObject    (p4);
+
+    DeleteObject    (b1);
+    DeleteObject    (b2);
+    DeleteObject    (t1);
+    DeleteObject    (t2);
+    DeleteObject    (t3);
+    DeleteObject    (t4);
+    DeleteObject    (t5);
+    DeleteObject    (t6);
+    DeleteObject    (t7);
+
+    DeleteObject    (color);
+
+    _HYRect     dim = MinMaxWindowDimensions();
+
+    SetWindowRectangle  (0,0,dim.bottom,dim.right);
+    CenterWindow        (this);
+}
+//__________________________________________________________
+
+void    _HYChartOptionDialog::DrawColorCanvas (void)
+{
+    _HYCanvas  * cnvs = (_HYCanvas*)   GetObject (19);
+    _HYPullDown* pd   = (_HYPullDown*) GetObject (18);
+
+    _HYColor    clr = LongToHYColor ((*colorsPicked)[pd->GetSelection()]);
+
+    _HYRect     colorRect = {5,80,25,120,1};
+    cnvs->StartDraw();
+    cnvs->EraseAll ();
+    cnvs->SetColor (clr);
+    cnvs->FillRect (colorRect);
+    cnvs->SetColor (black);
+    cnvs->DrawRect (colorRect);
+
+    cnvs->DisplayText ("Click to change", 5+cnvs->GetFont().size, 120+cnvs->GetFont().size, true);
+    cnvs->EndDraw  ();
+    cnvs->_MarkForUpdate ();
+}
+
+//__________________________________________________________
+
+bool    _HYChartOptionDialog::ProcessEvent (_HYEvent* e)
+{
+    bool        done = false;
+    _String     firstArg;
+    long        i,f,k;
+
+    if (e->EventClass()==_hyButtonPushEvent) {
+        firstArg = e->EventCode().Cut (0,(f=e->EventCode().Find(','))-1);
+        i = MatchComponentID (firstArg);
+
+        if (i==10) { // OK
+            *res = true;
+            postWindowCloseEvent (GetID());
+
+            for (k=6; k<=9; k++) {
+                _String tbv (((_HYTextBox*)GetObject (k))->GetText());
+                args->Replace (k-6,&tbv, true);
+            }
+
+            args->Replace (4,new _String (((_HYPullDown*)GetObject(15))->GetSelection()-2),false);
+            args->Replace (5,new _String (((_HYPullDown*)GetObject(16))->GetSelection()-2),false);
+            _String       *tb;
+            ((_HYTextBox*)GetObject (21))->StoreText (tb);
+            args->Replace (6,tb,false);
+            ((_HYTextBox*)GetObject (23))->StoreText (tb);
+            args->Replace (7,tb,false);
+            ((_HYTextBox*)GetObject (24))->StoreText (tb);
+            args->Replace (8,tb,false);
+
+            *msel = ((_HYPullDown*)GetObject (5))->GetSelection();
+            postWindowCloseEvent (GetID());
+        } else if (i==11) { // Cancel
+            *res = false;
+            postWindowCloseEvent (GetID());
+        } else if (i==12) {
+            parWin->GetColors().Duplicate (colorsPicked);
+            parWin->SetLabels (((_HYTextBox*)GetObject (6))->GetText(),
+                               ((_HYTextBox*)GetObject (7))->GetText(),
+                               ((_HYTextBox*)GetObject (8))->GetText(),
+                               ((_HYPullDown*)GetObject(5))->GetSelection(),
+                               ((_HYTextBox*)GetObject (9))->GetText(),
+                               ((_HYPullDown*)GetObject(15))->GetSelection()-2,
+                               ((_HYPullDown*)GetObject(16))->GetSelection()-2,
+                               ((_HYTextBox*)GetObject (21))->GetText().toNum(),
+                               ((_HYTextBox*)GetObject (23))->GetText().toNum(),
+                               ((_HYTextBox*)GetObject (24))->GetText().toNum());
+        }
+
+        done = true;
+    } else if (e->EventClass()==_hyMenuSelChangeEvent) {
+        firstArg = e->EventCode().Cut (0,(f=e->EventCode().Find(','))-1);
+        i = MatchComponentID (firstArg);
+        if (i==18) {
+            DrawColorCanvas ();
+            done = true;
+        }
+    } else if (e->EventClass()==_hyContextPopUp) {
+        firstArg = e->EventCode().Cut (0,(f=e->EventCode().Find(','))-1);
+        i = MatchComponentID (firstArg);
+        if (i==19) {
+            i = ((_HYPullDown*)GetObject (18))->GetSelection();
+            _HYColor curColor = LongToHYColor (colorsPicked->lData[i]);
+            colorsPicked->lData[i] = HYColorToLong(SelectAColor (curColor, chartColorChange));
+            DrawColorCanvas ();
+            done = true;
+        }
+    }
+
+    if (done) {
+        DeleteObject (e);
+        return true;
+    }
+    return _HYTWindow::ProcessEvent(e);
+}
+
+//__________________________________________________________
+
+void ReadChartProcessors (bool distribs)
+{
+    _String     pathToModelTemplates;
+    _List       receptacle;
+
+    pathToModelTemplates =libDirectory&"ChartAddIns";
+
+    if (distribs) {
+        pathToModelTemplates = pathToModelTemplates&GetPlatformDirectoryChar()&"DistributionAddIns";
+    }
+
+    ScanDirectoryForFileNames (pathToModelTemplates,receptacle,false);
+
+    for (long k=0; k<receptacle.lLength; k++) {
+        FILE * thisFile = doFileOpen (((_String*)receptacle(k))->sData,"rb");
+        if (thisFile) {
+            _String buffer (thisFile);
+            fclose (thisFile);
+            if (buffer.sLength) {
+                if (distribs) {
+                    distribProcessors << receptacle (k);
+                } else {
+                    chartProcessors << receptacle(k);
+                }
+            }
+        }
+    }
+}
+
+//__________________________________________________________
+// _HYDistributionChartWindow
+//__________________________________________________________
+
+_String         catMarginalMatrix ("_MARGINAL_MATRIX_"),
+                catVariableCDF    ("_CATEGORY_VARIABLE_CDF_"),
+                catVariableEvent  ("_CATEGORY_VARIABLE_EVENT_"),
+                catVariableID     ("_CATEGORY_VARIABLE_ID_");
+
+//__________________________________________________________
+
+_HYDistributionChartWindow::_HYDistributionChartWindow (_String name, _List& columns, _Matrix& data, _List& vars, _HYWindow* pw):_HYChartWindow (name, columns, data, pw)
+{
+    _HYRect         canvasSettings = {HY_CHART_TABLE_HEIGHT+HY_SCROLLER_WIDTH,260,HY_CHART_TABLE_HEIGHT+HY_SCROLLER_WIDTH,260,
+                                      HY_COMPONENT_V_SCROLL|HY_COMPONENT_BORDER_R
+                                     };
+
+    _List*    cvi     = BuildAtoms (data, vars);
+    _HYHList* catVars = new _HYHList (canvasSettings, GetOSWindowData(), *cvi, false);
+    checkPointer (catVars);
+    DeleteObject (cvi);
+
+    canvasSettings.top = canvasSettings.bottom = 18;
+    canvasSettings.width = HY_COMPONENT_BORDER_B|HY_COMPONENT_BORDER_T|HY_COMPONENT_BORDER_R;
+
+    _HYLabel* l5     =  new _HYLabel (canvasSettings, GetOSWindowData());
+    checkPointer (l5);
+
+    l5->SetBackColor (tableDefaultBk2);
+    l5->SetAlignFlags(HY_ALIGN_LEFT);
+    l5->SetText      ("Category Variables");
+
+    _HYFont tf = ((_HYTable*)GetObject (2))->textFont;
+    tf.style = HY_FONT_BOLD;
+    l5->SetFont (tf);
+
+    AddObject (catVars);           // 11
+    AddObject (l5);                // 12
+
+
+    SetCell   (HY_CHART_HEADER_ROW,0,l5);
+    SetCell   (HY_CHART_HEADER_ROW,1,l5);
+    SetCell   (HY_CHART_HEADER_ROW,2,l5);
+    SetCell   (HY_CHART_HEADER_ROW,3,l5);
+    SetCell   (HY_CHART_HEADER_ROW,4,(_HYGuiObject*)components(10));
+
+    SetCell   (HY_CHART_TABLE_ROW,0,catVars);
+    SetCell   (HY_CHART_TABLE_ROW,1,catVars);
+    SetCell   (HY_CHART_TABLE_ROW,2,catVars);
+    SetCell   (HY_CHART_TABLE_ROW,3,catVars);
+    SetCell   (HY_CHART_TABLE_ROW,4,(_HYGuiObject*)components(3));
+
+    catVars->SetMessageRecipient (this);
+
+    if (distribProcessors.lLength==0) {
+        ReadChartProcessors (true);
+    }
+
+    SetWindowRectangle (0,0,600,600);
+    DeleteObject (catVars);
+    DeleteObject (l5);
+}
+
+//__________________________________________________________
+
+bool    _HYDistributionChartWindow::ProcessEvent (_HYEvent* e)
+{
+    return _HYChartWindow::ProcessEvent (e);
+}
+
+//__________________________________________________________
+
+_List*  _HYDistributionChartWindow::BuildAtoms (_Matrix& data, _List& vars)
+{
+    atoms.Clear();
+    atomNames.Clear();
+    derived.Clear();
+    derivedDependencies.Clear();
+    derivedNames.Clear();
+    derivedRemaps.Clear();
+    atomSizes.Clear();
+    atomMultiples.Clear();
+
+
+    _List* catVarHL = new   _List;
+    checkPointer (catVarHL);
+
+    marginals.Duplicate (&data);
+
+    for (long k = 0; k < vars.lLength; k++) {
+        _List               *thisList = (_List*)vars(k);
+
+        _List               anEntry,
+                            dist;
+
+        anEntry << (*thisList)(0);
+
+        _Matrix *wts    =  (_Matrix*)(*thisList)(1),//cv->GetWeights(),
+                 *vals    =  (_Matrix*)(*thisList)(2);//cv->GetValues();
+
+
+        long          k2 = wts->GetHDim() * wts->GetVDim();
+        atomSizes     << k2;
+
+        _List       atomInfo;
+
+        atomInfo    && wts;
+        atomInfo    && vals;
+
+        atoms && & atomInfo;
+        atomNames << (*thisList)(0);
+        atomMultiples << 1;
+
+        _Constant   f1 (8.), f2 (6.);
+
+        for (long k3 = 0; k3 < k2; k3++) {
+            _Constant f3 (vals->theData[k3]);
+            _FString* fs = (_FString*)f3.FormatNumberString(&f1,&f2);
+
+            _String dEntry = *fs->theString & " (pr =";
+            f3.SetValue (wts->theData[k3]);
+            DeleteObject (fs);
+            fs = (_FString*)f3.FormatNumberString(&f1,&f2);
+            dEntry = dEntry & *fs->theString & ')';
+            DeleteObject (fs);
+            dist && & dEntry;
+        }
+
+        anEntry && & dist;
+        (*catVarHL) && & anEntry;
+    }
+
+    for (long k = vars.lLength-2; k >= 0; k--) {
+        atomMultiples.lData[k] = atomMultiples.lData[k+1]*atomSizes.lData[k+1];
+    }
+
+    return catVarHL;
+}
+//__________________________________________________________
+
+void    _HYDistributionChartWindow::SetAtoms (_Matrix& data, _List& vars)
+{
+    _List       *cinf = BuildAtoms (data, vars);
+
+    _HYHList    *clst = (_HYHList*)GetObject (11);
+    clst->ClearTable();
+
+    for (long k=0; k<cinf->lLength; k++) {
+        _List * anItem = (_List*)(*cinf)(k);
+        clst->AddRubrik (*(_String*)(*anItem)(0),*(_List*)(*anItem)(1),-1);
+    }
+
+    DeleteObject (cinf);
+}
+
+//__________________________________________________________
+
+void    _HYDistributionChartWindow::AddVariable (_String * expr)
+{
+    _String newExpression,
+            aPrompt ("Expression for the new variable"),
+            cPrompt ("Remember this expression");
+
+    long    msel;
+
+    bool    resC = savedExpression.sLength;
+
+    if (resC) {
+        newExpression = savedExpression;
+    }
+
+    if (expr || EnterStringDialogWithPulldown (newExpression, aPrompt, cPrompt, msel, atomNames, &atomNames, resC, 0, (Ptr)this)) {
+        if (expr) {
+            newExpression = *expr;
+        }
+
+        if (resC) {
+            savedExpression = newExpression;
+        } else {
+            savedExpression = empty;
+        }
+
+        aPrompt = newExpression;
+
+        _Formula f (newExpression, nil,false);
+
+        if (f.IsEmpty()) {
+            newExpression = _String("Failed to parse the expression :") & aPrompt;
+            ProblemReport (newExpression, (Ptr)this);
+            return;
+        }
+
+        // now check to see that all variables have been properly defined
+
+        _SimpleList         scanVariables,
+                            map;
+
+        {
+            _AVLList sva (&scanVariables);
+            f.ScanFForVariables (sva, true, true, true);
+            sva.ReorderList();
+        }
+
+        long k = 0;
+
+        for (; k < scanVariables.countitems(); k++) {
+            _Variable* thisV = LocateVar (scanVariables.lData[k]);
+            long f = atomNames.Find (thisV->GetName());
+            if (f == -1) {
+                if (!thisV->IsCategory()) {
+                    scanVariables.Delete (k);
+                    k--;
+                    continue;
+                }
+                break;
+            }
+            map << f;
+        }
+
+        if (k && k == scanVariables.lLength) {
+            SortLists (&map, &scanVariables);
+            _HYHList * hl = (_HYHList*)GetObject (11);
+
+            _List      newDistribution,
+                       rubrikItems;
+
+            ProduceDistribution (scanVariables, map, newDistribution, f, 0, 1.);
+
+            derivedDependencies && & map;
+            derivedNames && & aPrompt;
+
+            k = newDistribution.lLength/2;
+
+            _SimpleList     derivedRemap (k, 0, 1);
+
+            _Matrix         wts     (k,1,false,true),
+                            probs   (k,1,false,true);
+
+            _Constant   f1 (8.),
+                        f2 (6.);
+
+            bool        goOn = true;
+
+            while (goOn) {
+                goOn = false;
+
+                for (long k3 = 1; k3 < k; k3++) {
+                    _Constant   *f3 = (_Constant*)newDistribution(2*derivedRemap[k3-1]),
+                                 *f4 = (_Constant*)newDistribution(2*derivedRemap[k3]);
+
+                    if (f3->Value () > f4->Value()) {
+                        goOn = true;
+                        long   t = derivedRemap[k3];
+                        derivedRemap[k3] = derivedRemap[k3-1];
+                        derivedRemap[k3-1] = t;
+                    }
+                }
+            }
+
+
+            for (long k2 = 0; k2 < k; k2++) {
+                _Constant   *f3 = (_Constant*)newDistribution(2*derivedRemap[k2]),
+                             *f4 = (_Constant*)newDistribution(2*derivedRemap[k2]+1);
+
+                _FString* fs = (_FString*)f3->FormatNumberString(&f1,&f2);
+                _String dEntry = *fs->theString & " (pr =";
+                DeleteObject (fs);
+                fs = (_FString*)f4->FormatNumberString(&f1,&f2);
+                dEntry = dEntry & *fs->theString & ')';
+                DeleteObject (fs);
+                rubrikItems && & dEntry;
+
+                wts.theData[k2] = f4->Value();
+                probs.theData[k2] = f3->Value();
+            }
+
+            newDistribution.Clear();
+            newDistribution && & wts;
+            newDistribution && & probs;
+
+            derived && & newDistribution;
+            derivedRemaps && & derivedRemap;
+
+            hl->AddRubrik (aPrompt, rubrikItems, -1);
+        } else {
+            newExpression = aPrompt & " must depend on at least one model category variable and no other variables";
+            ProblemReport (newExpression, (Ptr)this);
+            return;
+        }
+    }
+}
+//__________________________________________________________
+
+void        _HYDistributionChartWindow::ProduceDistribution (_SimpleList& vars, _SimpleList& map, _List& res, _Formula& f, long idx, _Parameter p)
+{
+    long vIdx = map.lData[idx];
+
+    _Matrix * wts   = (_Matrix*) (*(_List*)atoms (vIdx))(0),
+              * probs = (_Matrix*) (*(_List*)atoms (vIdx))(1);
+
+    _Variable*v     = LocateVar (vars.lData[idx]);
+
+    for (long k = 0; k < wts->GetHDim () * wts->GetVDim (); k++) {
+        v->SetValue (new _Constant ((*probs)[k]),false);
+
+        if (idx < vars.lLength-1) {
+            ProduceDistribution (vars, map, res, f, idx+1, p*(*wts)[k]);
+        } else {
+            res.AppendNewInstance (new _Constant (f.Compute ()->Value()));
+            res.AppendNewInstance (new _Constant (p*(*wts)[k]));
+        }
+    }
+}
+
+//__________________________________________________________
+
+void        _HYDistributionChartWindow::ShowMarginals   (void)
+{
+    _List           choices;
+
+    _SimpleList     all,
+                    selectors;
+
+    selectors << 0;
+    selectors << 1;
+
+    for (long vi = 0; vi < atomNames.lLength; vi++) {
+        _List   aChoice;
+        aChoice << atomNames (vi);
+        aChoice << atomNames (vi);
+        choices && & aChoice;
+        all << all.lLength;
+    }
+
+    for (long vi = 0; vi < derivedNames.lLength; vi++) {
+        _List   aChoice;
+        aChoice << derivedNames (vi);
+        aChoice << derivedNames (vi);
+        choices && & aChoice;
+        all << all.lLength;
+    }
+
+    long idx = HandleListSelection (choices,selectors, all, "Variable to Delete", all,1,(Ptr)this);
+    if (idx >= 0) {
+
+        _Matrix * res = ComputeConditionals (idx);
+        _String aName = _String ("Marginal distributions in ") & *(_String*) (*(_List*)choices(idx))(0),
+                testName = aName;
+
+        _List     labels;
+        for (idx = 1; idx <= marginals.GetHDim(); idx++) {
+            _String aLabel = _String ("Site ") & idx;
+            labels && & aLabel;
+        }
+
+        idx = 2;
+        while (FindWindowByName (testName) >= 0) {
+            testName = aName & " " & idx++;
+        }
+
+        _HYChartWindow * conditionals = new _HYChartWindow (testName,labels,*res);
+        checkPointer (conditionals);
+        conditionals->BringToFront ();
+        DeleteObject (res);
+    }
+}
+
+//__________________________________________________________
+
+_Matrix*    _HYDistributionChartWindow::ComputeConditionals (long idx)
+{
+    _SimpleList varstc,
+                *remap = nil;
+
+    if (idx < atoms.lLength) {
+        varstc << idx;
+    } else {
+        varstc << *(_SimpleList*)derivedDependencies (idx-atoms.lLength);
+        varstc.Sort();
+        remap = (_SimpleList*)derivedRemaps (idx-atoms.lLength);
+    }
+
+    return  ComputeConditionals (varstc, remap);
+
+}
+
+//__________________________________________________________
+
+_Matrix*    _HYDistributionChartWindow::MakeCDF (long idx)
+{
+    _Matrix*    wts,
+                *    prb;
+
+    if (idx < atoms.lLength) {
+        wts = (_Matrix*)(*(_List*)atoms(idx))(0);
+        prb = (_Matrix*)(*(_List*)atoms(idx))(1);
+
+    } else {
+        idx -= atoms.lLength;
+        wts = (_Matrix*)(*(_List*)derived(idx))(0);
+        prb = (_Matrix*)(*(_List*)derived(idx))(1);
+    }
+
+    idx = wts->GetHDim() * wts->GetVDim();
+    _Matrix * res = new _Matrix (2, idx , false, true);
+    checkPointer (res);
+
+    for (long k=0; k<idx; k++) {
+        res->Store (0,k, wts->theData[k]);
+        res->Store (1,k, prb->theData[k]);
+    }
+
+    return res;
+}
+
+//__________________________________________________________
+
+void    _HYDistributionChartWindow::RemoveVariable (void)
+{
+    if (derived.lLength) {
+        _List           choices;
+
+        _SimpleList     all,
+                        selectors;
+
+        selectors << 0;
+        selectors << 1;
+
+        for (long vi = 0; vi < derivedNames.lLength; vi++) {
+            _List   aChoice;
+            aChoice << derivedNames (vi);
+            aChoice << derivedNames (vi);
+            choices && & aChoice;
+            all << all.lLength;
+        }
+
+        long choice = HandleListSelection (choices,selectors, all, "Variable to Delete", all,1,(Ptr)this);
+        if (choice >= 0) {
+            _HYHList * hl = (_HYHList*)GetObject (11);
+            hl->DeleteRubrik            (choice + atoms.lLength);
+            derivedNames.Delete         (choice);
+            derived.Delete              (choice);
+            derivedDependencies.Delete  (choice);
+            derivedRemaps.Delete        (choice);
+        }
+    } else {
+        _String errMsg = "There are no user defined variables to delete";
+        ProblemReport (errMsg, (Ptr)this);
+    }
+}
+
+//__________________________________________________________
+
+_Matrix*    _HYDistributionChartWindow::ComputeConditionals (_SimpleList& varstc, _SimpleList* remap)
+{
+    if (varstc.lLength == atoms.lLength) {
+        if (remap) {
+            _Matrix * cond = new _Matrix (marginals.GetVDim(), marginals.GetHDim(), false, true);
+            checkPointer (cond);
+
+            long    tc = marginals.GetHDim(),
+                    tr = marginals.GetVDim();
+
+            for (long c=0; c<tc; c++)
+                for (long r=0; r<tr; r++) {
+                    cond->Store (r,c,marginals(c,remap->lData[r]));
+                }
+
+            return      cond;
+        } else {
+            _Matrix* cnd = new _Matrix (marginals);
+            checkPointer (cnd);
+            cnd->Transpose();
+            return cnd;
+        }
+    } else {
+        long            ts = 1,
+                        colCount = marginals.GetHDim();
+
+        for (long k=0;  k < varstc.lLength; k++) {
+            long       tsz = atomSizes.lData [varstc.lData[k]];
+            ts *= tsz;
+        }
+
+        _Matrix * cond = new _Matrix (ts, colCount , false, true);
+        checkPointer (cond);
+
+        _SimpleList  toAdjust   (varstc.lLength,0,0),
+                     expectOver    (atoms.lLength,0,1),
+                     adjustable;
+
+        adjustable.Subtract (expectOver, varstc);
+        toAdjust.lData[toAdjust.lLength-1] = -1;
+
+        for (long cs = 0; cs < ts; cs++) {
+            long sp = 0;
+            while (toAdjust.lData[sp] == atomSizes.lData[varstc.lData[sp]]-1) {
+                toAdjust.lData[sp++] = 0;
+            }
+
+            toAdjust.lData[sp] ++;
+
+            long   totalAdditive = 0;
+
+            for (sp=0; sp<varstc.lLength; sp++) {
+                totalAdditive += toAdjust.lData[sp] * atomMultiples.lData[varstc.lData[sp]];
+            }
+
+            _SimpleList adjOver (adjustable.lLength,0,0);
+
+            long r = remap?remap->lData[cs]:cs;
+            adjOver.lData[adjOver.lLength-1] = -1;
+
+            while (1) {
+                long sp2 = 0;
+                while ((sp2<adjustable.lLength) && (adjOver.lData[sp2] == atomSizes.lData[adjustable.lData[sp2]]-1)) {
+                    adjOver.lData[sp2++] = 0;
+                }
+
+                if (sp2 == adjustable.lLength) {
+                    break;
+                }
+
+                adjOver.lData[sp2] ++;
+
+                _Parameter  pr = 1.;
+
+                long ta2  = totalAdditive;
+
+                for  (sp2=0; sp2<adjustable.lLength; sp2++) {
+                    ta2 += adjOver.lData[sp2] * atomMultiples.lData[adjustable.lData[sp2]];
+                    pr *= ((_Matrix*)((*(_List*)atoms(adjustable.lData[sp2]))(0)))->theData[adjOver.lData[sp2]];
+                }
+
+                for (long cc = 0; cc < colCount; cc++) {
+                    cond->Store (r,cc,(*cond)(r,cc) + pr*marginals(cc,ta2));
+                }
+            }
+        }
+
+        return cond;
+    }
+}
+
+//__________________________________________________________
+
+void    _HYDistributionChartWindow::HandleCatPostProcessor (long procIdx)
+{
+    if (procIdx<distribProcessors.lLength) {
+        _HYHList*               hList = (_HYHList*)    GetObject (11);
+        _SimpleList             tableSel;
+
+        hList->GetRowSelection  (tableSel,1);
+
+        if (tableSel.lLength > 0) {
+            long ridx = hList->IsSingleRubrik (tableSel);
+            if (ridx>=0) {
+                FILE * thisFile = doFileOpen (((_String*)distribProcessors(procIdx))->sData,"rb");
+                if (thisFile) {
+                    _String buffer (thisFile);
+                    fclose (thisFile);
+
+                    tableSel.Offset (-1);
+                    if (tableSel.lLength>1)
+                        if (tableSel.lData[0] == -1) {
+                            tableSel.Delete (0);
+                        }
+
+                    _Matrix * m = ComputeConditionals (ridx),
+                              * c = MakeCDF           (ridx),
+                                * e = new _Matrix         (tableSel);
+
+                    _FString*   vn;
+
+                    if (ridx < atomNames.lLength) {
+                        vn = new _FString (*(_String*)atomNames(ridx));
+                    } else {
+                        vn = new _FString (*(_String*)derivedNames(ridx-atomNames.lLength));
+                    }
+
+
+                    checkPointer (c);
+                    checkPointer (e);
+                    checkPointer (m);
+                    checkPointer (vn);
+
+
+                    setParameter (catMarginalMatrix,m);
+                    setParameter (catVariableCDF,   c);
+                    setParameter (catVariableEvent, e);
+                    setParameter (catVariableID, vn);
+
+                    DeleteObject (c);
+                    DeleteObject (e);
+                    DeleteObject (m);
+                    DeleteObject (vn);
+
+                    long   g = batchLanguageFunctionNames.lLength;
+
+                    _String dpp = *((_String*)distribProcessors(procIdx));
+                    PushFilePath (dpp);
+
+                    _ExecutionList   thisList;
+                    terminateExecution = false;
+                    thisList.BuildList (buffer);
+                    thisList.ExecuteAndClean(g);
+
+                    PopFilePath ();
+
+                    DeleteVariable (catMarginalMatrix);
+                    DeleteVariable (catVariableCDF);
+                    DeleteVariable (catVariableEvent);
+                } else {
+                    _String eMsg = _String("Problem reading file:") & *((_String*)distribProcessors(procIdx));
+                    ProblemReport (eMsg);
+                }
+            } else {
+                _String wm2 ("All values (events) must come from a single category variable.");
+                ProblemReport (wm2, (Ptr)this);
+            }
+        } else {
+            _String wm    ("Please select some category variables to process");
+            ProblemReport (wm, (Ptr)this);
+        }
+    }
+}
+
+//__________________________________________________________
+
+void    _HYDistributionChartWindow::DoSave (long option, _String*)
+{
+    _String result (128L, true);
+
+    for (long k=0; k<atoms.lLength; k++) {
+        if (k) {
+            result << ';';
+        }
+        result << (_String*)atomNames (k);
+        for (long p = 0; p < 2; p++) {
+            _Matrix * m = (_Matrix*)(*(_List*)atoms(k))(p);
+            for (long n=0; n <atomSizes.lData[k]; n++) {
+                result << ':';
+                result << _String(m->theData[n]);
+            }
+        }
+    }
+
+    for (long k=0; k<derivedNames.lLength; k++) {
+        result << ';';
+        result << (_String*)derivedNames (k);
+    }
+
+    result.Finalize();
+    _HYChartWindow::DoSave (option, &result);
+}
+
+
+
+// EOF
diff --git a/src/gui/HYComponent.cpp b/src/gui/HYComponent.cpp
new file mode 100644
index 0000000..0ac178a
--- /dev/null
+++ b/src/gui/HYComponent.cpp
@@ -0,0 +1 @@
+/*
 
 HyPhy - Hypothesis Testing Using Phylogenies.
 
 Copyright (C) 1997-now
 Core Developers:
 Sergei L Kosakovsky Pond (spond at ucsd.edu)
 Art FY Poon    (apoon at cfenet.ubc.ca)
 Steven Weaver (sweaver at ucsd.edu)
 
 Module Developers:
 Lance Hepler (nlhepler at gmail.com)
 Martin Smith (martin.audacis at gmail.com)
 
 Significant contributions from:
 Spencer V Muse (muse at stat.ncsu.edu)
 Simon DW Frost (sdf22 at cam.ac.uk)
 
 Permission is hereby granted, free of charge, to any person obtaining a
 copy of this software and associated documentation files (the
 "Software"), to deal in the Software without restriction, including
 without limitation the rights to use, copy, modify, merge, publish,
 distribute, sublicense, and/or sell copies of the Software, and to
 permit persons to whom the Software is furnished to do so, subject to
 the following conditions:
 
 The above copyright notice and this permission notice shall be included
 in all copies or substantial portions of the Software.
 
 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.
 IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
 CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
 TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
 SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 
 */

#include "HYComponent.h"
#include "HYEventTypes.h"
#include "HYCanvas.h"
#include "HYUtils.h"
#include "HYPlatformWindow.h"
#include "math.h"

#ifdef    __HYPHYDMALLOC__
#include "dmalloc.h"
#endif
//__________________________________________________________________

_HYComponent::_HYComponent(void)
{
    hOrigin = vOrigin = 0;
    hSize = vSize = 0;
    needUpdate = false;
    messageRecipient = nil;
}

//__________________________________________________________________

_HYComponent::_HYComponent(_HYRect r,Ptr p):_HYPlatformComponent (r,p)
{
    settings.width = r.width;
    SetDimensions (r,r);
    hSize = r.left;
    vSize = r.top;
    messageRecipient = nil;
}

//__________________________________________________________________

_HYComponent::~_HYComponent(void)
{
    if (nInstances<=1) {
        _CleanUp();
    }
}

//__________________________________________________________________

BaseRef     _HYComponent::makeDynamic(void)
{
    _HYComponent* res = new _HYComponent;
    res->Duplicate(this);
    nInstances++;
    return res;
}

//__________________________________________________________________
void        _HYComponent::Duplicate (BaseRef s)
{
    _HYComponent * theS = (_HYComponent*)s;
    theS->_HYPlatformComponent::Duplicate(s);
    settings = theS->settings;
    hOrigin = theS->hOrigin;
    vOrigin = theS->vOrigin;
    hSize = theS->hSize;
    vSize = theS->vSize;
    needUpdate = theS->needUpdate;
}

//__________________________________________________________________
int         _HYComponent::GetMinW (void)
{
    return settings.left;
}

//__________________________________________________________________
int         _HYComponent::GetMaxW (void)
{
    return settings.right;
}

//__________________________________________________________________
int         _HYComponent::GetMaxLW (void)
{
    return GetMaxW();
}

//__________________________________________________________________
int         _HYComponent::GetMaxH (void)
{
    return settings.bottom;
}

//__________________________________________________________________

int         _HYComponent::GetMinH (void)
{
    return settings.top;
}

//__________________________________________________________________
int         _HYComponent::GetMaxLH (void)
{
    return GetMaxH();
}

//__________________________________________________________________

int     _HYComponent::GetHSize (void)
{
    return hSize;
}

//__________________________________________________________________

int     _HYComponent::GetVSize (void)
{
    return vSize;
}

//__________________________________________________________________

bool        _HYComponent::IsHElastic (void)
{
    return settings.left!=settings.right;
}

//__________________________________________________________________

bool        _HYComponent::IsVElastic (void)
{
    return settings.top!=settings.bottom;
}

//__________________________________________________________________

void        _HYComponent::SetDimensions (_HYRect r,_HYRect rel)
{
    int saveSettings = settings.width;
    hOrigin = vOrigin = 0;
    hSize = rel.right-rel.left;
    vSize = rel.bottom-rel.top;
    needUpdate = true;
    settings = r;
    settings.width = saveSettings;
    _SetDimensions (r,rel);
}

//__________________________________________________________________
void        _HYComponent::SetOrigin (int nv,int nh)
{
    int m = GetMaxW();
    if (nh+hSize>m) {
        nh = m-hSize;
    }

    if (nh<0) {
        nh = 0;
    }
    needUpdate = false;
    if (hOrigin != nh) {
        needUpdate = true;
        hOrigin = nh;
    }
    m = GetMaxH();
    if (nv+vSize>m) {
        nv = m-vSize;
    }
    if (nv<0) {
        nv = 0;
    }
    if (vOrigin != nv) {
        needUpdate = true;
        vOrigin = nv;
    }
    if (needUpdate) {
        _MarkForUpdate();
        needUpdate = false;
    }
}

//__________________________________________________________________
void        _HYComponent::SetVisibleSize (_HYRect r)
{
    int h = r.right-r.left,
        v = r.bottom-r.top;

    //if ((hSize != h)||(vSize != v))
    {
        needUpdate = true;
        hSize = h;
        vSize = v;
        SetOrigin (vOrigin,hOrigin);
        _SetVisibleSize (r);
    }
}

//__________________________________________________________________
void        _HYComponent::Paint (Ptr p)
// p holds a pointer to _HYRect - relative rect in host window
{
    _Paint (p);
    needUpdate = false;
}

//__________________________________________________________________

void        _HYComponent::Update (Ptr p)
// p holds a pointer to _HYRect - relative rect in host window
{
    _Update (p);
    needUpdate = false;
}

//__________________________________________________________________

_HYRect     _HYComponent::VisibleContents (Ptr p)
{
    return _VisibleContents(p);
}

//__________________________________________________________________
bool    _HYComponent::ProcessEvent(_HYEvent* e)
{
    if (e->EventClass() == _hyScrollingEvent) {
        _MarkForUpdate();
        DeleteObject (e);
        return true;
    }
    DeleteObject (e);
    return false;
}

//__________________________________________________________________

_HYCanvas::_HYCanvas(_HYRect s, Ptr p, int h, int w, int d):_HYGraphicPane (h,w,d),_HYComponent (s,p)
{
    doMouseClicks = false;
}


//__________________________________________________________________
void _HYCanvas::SetCanvasSize(int ht, int wd, int d)
{
    SetPaneSize (ht,wd,d);
    _HYRect     newD = {settings.top,settings.left,ht,wd,Settings()};
    SetDimensions (newD,newD);
}
//__________________________________________________________________
_HYRect _HYCanvas::GetCanvasSize(void)
{
    _HYRect res = {0,0,0,0,0};
    res.right = GetMaxW();
    res.bottom = GetMaxH();
    return res;
}

//__________________________________________________________________
bool    _HYCanvas::ProcessEvent(_HYEvent* e)
{
    if (e->EventClass() == _hyScrollingEvent) {
        long h,
             v;

        _String firstArg = e->EventCode().Cut (0,(v=e->EventCode().Find(','))-1);
        h = firstArg.toNum();
        firstArg = e->EventCode().Cut (v+1,-1);
        DeleteObject(e);
        v = firstArg.toNum();
        if (h||v) {
            //char buf [255];
            //sprintf (buf,"Canvas Scroll %d %d\n", h,v);
            //BufferToConsole(buf);
            Paint ((Ptr)&rel);
        }
        return true;
    }
    return _HYGuiObject::ProcessEvent (e);
}
//__________________________________________________________________
void    _HYCanvas::CrossfadeText (_String& , _String&t2, _HYRect& b, long t, long d, char al, char rValue)
{
    /*_HYColor saveFG   = color,
             colorOut = color,
             colorIn  = bColor,
             white    = {255,255,255},
             black    = {0,0,0};

    if (t<=1)
        t = 1;

    _Parameter diffR = (color.R-bColor.R)/(_Parameter)t,
               diffG = (color.G-bColor.G)/(_Parameter)t,
               diffB = (color.B-bColor.B)/(_Parameter)t;

    StartDraw   ();
    EraseRect   (b);
    EndDraw     ();

    for (long k=1; k<t; k++)
    {
        colorIn.R += diffR;
        colorIn.G += diffG;
        colorIn.B += diffB;

        colorOut.R -= diffR;
        colorOut.G -= diffG;
        colorOut.B -= diffB;


        StartDraw   ();
        EraseRect   (b);
        SetColor    (colorIn);
        DisplayText (t2,b,al);
        SetColor    (colorOut);
        DisplayText (t1,b,al);
        EndDraw     ();
        DelayNMs    (d);
        Paint       ((Ptr)&rel);
    }

    StartDraw   ();
    EraseRect   (b);
    SetColor    (saveFG);
    DisplayText (t2,b,al);
    EndDraw     ();
    Paint       ((Ptr)&rel);*/

    if (t<=1) {
        t = 1;
    }

    _HYRect     slideOut = b,
                slideIn  = b;


    long        diff   = (b.bottom-b.top-font.size)/t,
                diff2  = (b.bottom-b.top)/t,
                hDiff  = (b.right-b.left)/t,
                diffR  = (color.R-bColor.R)/t,
                diffG  = (color.G-bColor.G)/t,
                diffB  = (color.B-bColor.B)/t;

    _HYColor saveFG   = color,
             colorIn  = bColor;

    if (rValue<0) {
        rValue = (4*genrand_int32())/RAND_MAX_32;
    }

//  rValue = 3;

    switch (rValue) {
    case 0: // up
        slideIn.bottom -= font.size;
        slideIn.top = slideIn.bottom;
        break;
    case 1: // down
        slideIn.bottom = slideIn.top;
        break;
    case 2: // left
        slideIn.left = slideIn.right;
        break;
    default: // right
        slideIn.right = slideIn.left;
        break;

    }

    for (; t>1; t--) {
        colorIn.R += diffR;
        colorIn.G += diffG;
        colorIn.B += diffB;
        StartDraw();
        SetColor   (colorIn);
        switch (rValue) {
        case 0: // up
            slideIn.top -= diff;
            _SlideRect (slideOut,-diff2,0);
            DisplayText(t2,slideIn,al);
            slideOut.bottom -= diff2;
            break;
        case 1: // down
            slideIn.bottom += diff;
            _SlideRect (slideOut,diff,0);
            DisplayText(t2,slideIn,al);
            slideOut.top += diff;
            break;
        case 2: // left
            slideIn.left -= hDiff;
            _SlideRect (slideOut,0,-hDiff);
            DisplayText(t2,slideIn,al);
            slideOut.right -= hDiff;
            break;
        default: // right
            slideIn.right += hDiff;
            _SlideRect (slideOut,0,hDiff);
            DisplayText(t2,slideIn,al);
            slideOut.left += hDiff;
            break;

        }
        EndDraw();
        DelayNMs    (d);
        Paint       ((Ptr)&rel);
    }
    StartDraw();
    SetColor (saveFG);
    EraseRect  (b);
    DisplayText(t2,b,al);
    EndDraw();
    Paint       ((Ptr)&rel);

}
//__________________________________________________________________

_HYStretchCanvas::_HYStretchCanvas(_HYRect s, Ptr p, int h, int w, int d, char flags):_HYCanvas (s,p,h,w,d)
{
    canvasFlags = flags;
    canvasDepth = d;
}

//__________________________________________________________________

int _HYStretchCanvas::GetMaxW(void)
{
    if (canvasFlags&HY_SCANVAS_HORIZONTAL) {
        return 0x7FFF;
    }
    return _HYComponent::GetMaxW();
}

//__________________________________________________________________

int _HYStretchCanvas::GetMaxH(void)
{
    if (canvasFlags&HY_SCANVAS_VERTICAL) {
        return 0x7FFF;
    }
    return _HYComponent::GetMaxH();
}

//__________________________________________________________________

void        _HYStretchCanvas::SetVisibleSize (_HYRect r)
{
    long h,v;
    if (canvasFlags&HY_SCANVAS_HORIZONTAL) {
        h = r.right-r.left;
    } else {
        h = GetMaxW();
    }
    if (canvasFlags&HY_SCANVAS_VERTICAL) {
        v = r.bottom-r.top;
    } else {
        v = GetMaxH();
    }
    //if ((h!=w)||(v!=h))
    //{
    SetCanvasSize(v,h,canvasDepth);
    _HYComponent::SetVisibleSize(r);
    if (messageRecipient) {
        messageRecipient->ProcessEvent (generateRebuildSCanvas (GetID()));
    }
    //}
}

//__________________________________________________________________
_HYRect _HYStretchCanvas::GetCanvasSize(void)
{
    _HYRect res = {0,0,0,0,0};
    res.right =  _HYCanvas::GetMaxW();
    res.bottom = _HYCanvas::GetMaxH();
    return res;
}
\ No newline at end of file
diff --git a/src/gui/HYConsoleWindow.cpp b/src/gui/HYConsoleWindow.cpp
new file mode 100644
index 0000000..a3aa213
--- /dev/null
+++ b/src/gui/HYConsoleWindow.cpp
@@ -0,0 +1,794 @@
+/*
+ 
+ HyPhy - Hypothesis Testing Using Phylogenies.
+ 
+ Copyright (C) 1997-now
+ Core Developers:
+ Sergei L Kosakovsky Pond (spond at ucsd.edu)
+ Art FY Poon    (apoon at cfenet.ubc.ca)
+ Steven Weaver (sweaver at ucsd.edu)
+ 
+ Module Developers:
+ Lance Hepler (nlhepler at gmail.com)
+ Martin Smith (martin.audacis at gmail.com)
+ 
+ Significant contributions from:
+ Spencer V Muse (muse at stat.ncsu.edu)
+ Simon DW Frost (sdf22 at cam.ac.uk)
+ 
+ Permission is hereby granted, free of charge, to any person obtaining a
+ copy of this software and associated documentation files (the
+ "Software"), to deal in the Software without restriction, including
+ without limitation the rights to use, copy, modify, merge, publish,
+ distribute, sublicense, and/or sell copies of the Software, and to
+ permit persons to whom the Software is furnished to do so, subject to
+ the following conditions:
+ 
+ The above copyright notice and this permission notice shall be included
+ in all copies or substantial portions of the Software.
+ 
+ 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.
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ 
+ */
+
+#include "HYConsoleWindow.h"
+#include "HYTextBox.h"
+#include "HYButtonBar.h"
+#include "HYLabel.h"
+#include "HYUtils.h"
+#include "HYEventTypes.h"
+#include "HYCanvas.h"
+#include "HYDialogs.h"
+#include "HYUtils.h"
+#include "batchlan.h"
+
+#ifdef    __HYPHYDMALLOC__
+#include "dmalloc.h"
+#endif
+
+#define  HY_CONSOLE_OUT_ROW  0
+#define  HY_CONSOLE_IN_ROW   1
+
+_HYColor consoleIBarColor = {168,173,176};
+
+_String  startEchoing  ("Begin saving to file"),
+         stopEchoing   ("Stop saving to file"),
+         pauseEchoing  ("Pause saving to file"),
+         resumeEchoing ("Resume saving to file"),
+         cState        ("File"),
+         cTask         ("Status"),
+         cInput        ("Waiting on user input"),
+         suspendedPref ("(Suspended)"),
+         newLN         ("\n"),
+         userHookinDir ("UserAddins");
+
+
+
+extern   _String            dialogPrompt,
+         baseDirectory;
+
+_HYConsoleWindow*  hyphyConsoleWindow = nil,
+                * _hyPrimaryConsoleWindow = nil;
+
+_List    userHookins;
+
+#ifdef  __WINDOZE__
+extern bool hyphyExiting;
+#endif
+
+#ifdef __HYPHYMPI__
+extern int  _hy_mpi_node_rank;
+#endif
+
+
+//__________________________________________________________
+
+_String WriteFileDialogInput    (void);
+void    LoadUserHookins         (void);
+void    FlushConsoleBuffer      (void);
+
+
+//__________________________________________________________
+_HYConsoleWindow::_HYConsoleWindow (_String name):_HYTWindow (name, 2)
+{
+
+    if (!userHookins.lLength) {
+        LoadUserHookins ();
+    }
+
+    _HYRect         canvasSettings = {10,10,0xffff,0xffff,HY_COMPONENT_NO_SCROLL};
+
+    _HYTextBox*     ow      = new _HYTextBox (canvasSettings, GetOSWindowData(), true);
+
+    canvasSettings.top      = 90;
+    canvasSettings.bottom   = 90;
+
+    _HYTextBox*     iw      = new _HYTextBox (canvasSettings, GetOSWindowData());
+
+    canvasSettings.left     = 25;
+    canvasSettings.right    = 25;
+
+    _HYButtonBar*   bb      = new _HYButtonBar (canvasSettings,GetOSWindowData());
+
+    bb->SetMessageRecipient (this);
+    iw->SetMessageRecipient (this);
+    ow->SetMessageRecipient (this);
+    iw->boxFlags |= HY_TB_WRAP;
+
+    AddObject (ow,false);      // 0
+    AddObject (iw,false);      // 1
+    AddObject (bb,false);      // 2
+
+    SetTableDimensions (2,2);
+
+    SetCell   (HY_CONSOLE_OUT_ROW,0,ow);
+    SetCell   (HY_CONSOLE_OUT_ROW,1,ow);
+
+    SetCell   (HY_CONSOLE_IN_ROW,0,iw);
+    SetCell   (HY_CONSOLE_IN_ROW,1,bb);
+
+    iw->SetBackColor (consoleIBarColor);
+    bb->SetBackColor (consoleIBarColor);
+    bb->SetButtonLayoutW (1);
+
+    _HYFont         defFont;
+
+#ifdef __MAC__
+    defFont.face = "Monaco";
+    defFont.size = 9;
+#endif
+#ifdef __WINDOZE__
+    defFont.face = "MS Sans Serif";
+    defFont.size = 12;
+#endif
+#ifdef __HYPHY_GTK__
+    defFont.face = _HY_SANS_FONT;
+    defFont.size = 10;
+#endif
+
+    defFont.style = HY_FONT_PLAIN;
+    ow->SetFont (defFont);
+
+    ow->margins = (_HYRect) {
+        0,0,0,0,0
+    };
+    ow->SetText ("");
+    iw->SetAlignFlags (HY_ALIGN_LEFT);
+    iw->SetText ("Input");
+
+    bb->SetAlignFlags (HY_ALIGN_LEFT);
+    bb->SetButtonDim(16);
+
+    _String s = "User Actions";
+    bb->AddButton (ProcureIconResource(6006),&s);
+    s = "Look-up Command";
+    bb->AddButton (ProcureIconResource(6011),&s);
+    s = "File echo";
+    bb->AddButton (ProcureIconResource(6042),&s);
+    s = "Web Update";
+    bb->AddButton (ProcureIconResource(7050),&s);
+
+    bb->EnableButton   (0,userHookins.lLength);
+    bb->EnableButton   (1,false);
+    bb->EnableButton   (2,true);
+    bb->MarkAsPullDown (0,true);
+    bb->MarkAsPullDown (1,true);
+    bb->MarkAsPullDown (2,true);
+    bb->EnableButton   (3,true);
+    iw->SetMargins     ((_HYRect) {
+        5,5,5,5,0
+    });
+
+    SetWindowRectangle (0,0,400,600);
+
+    //keyboardFocusChain << 0;
+    keyboardFocusChain << 1;
+
+    echoFileRef     = nil;
+    echoStatus      = 0;
+    percentDone     = -1;
+    timer           = "00:00:00";
+    editOptions     = 0;
+    inputStatus     = 0;
+
+}
+
+//__________________________________________________________
+_HYConsoleWindow::~_HYConsoleWindow()
+{
+    if (echoFileRef) {
+        fclose (echoFileRef);
+    }
+}
+
+//__________________________________________________________
+
+bool    _HYConsoleWindow::ConfirmClose (void)
+{
+    return false;
+}
+
+//__________________________________________________________
+
+bool    _HYConsoleWindow::ProcessEvent (_HYEvent* e)
+{
+    bool    done = false;
+
+    _String firstArg;
+    long    i,f,k;
+
+    if (e->EventClass().Equal(&_hyButtonPushEvent)) {
+        firstArg = e->EventCode().Cut (0,(f=e->EventCode().Find(','))-1);
+        k = firstArg.toNum();
+        for (i=0; i<components.lLength; i++) {
+            if (((_HYGuiObject*)components(i))->MatchID(k)) {
+                break;
+            }
+        }
+        if (i==2) {
+            firstArg        = e->EventCode().Cut (f+1,-1);
+            k               = firstArg.toNum();
+            _HYButtonBar * bb = (_HYButtonBar*)GetObject (2);
+
+            switch  (k) {
+            case 0:
+            case 1: {
+
+                _List menuChoices;
+                if (k==0)
+                    for (long k=0; k<userHookins.lLength; k++) {
+                        _String *dName =  (_String*)userHookins(k),
+                                 aName (*dName, dName->FindBackwards (
+#ifdef __MAC__
+                                            ':'
+#else
+#ifdef __WINDOZE__
+                                            '\\'
+#else
+                                            '/'
+#endif
+#endif
+                                            ,0,-1)+1,-1);
+
+                        menuChoices && & aName;
+                    }
+                else {
+                    firstArg = "Search Commands";
+                    menuChoices && & firstArg;
+                    firstArg = "Search Descriptions";
+                    menuChoices && & firstArg;
+                    firstArg = "Search Notes";
+                    menuChoices && & firstArg;
+                    firstArg = "Export to LaTeX by name";
+                    menuChoices && & firstArg;
+                    firstArg = menuSeparator;
+                    menuChoices && & firstArg;
+                    firstArg = "Open in a window";
+                    menuChoices && & firstArg;
+                }
+
+                int h,v;
+                bb->GetButtonLoc(k,h,v,true);
+                _String userAction  = HandlePullDown (menuChoices,h,v,0),
+                        justTheName = userAction;
+
+                bb->_UnpushButton();
+                i = menuChoices.Find (&userAction);
+                if (i>=0) {
+                    _ExecutionList uxl;
+                    if (k==0) {
+                        userAction = ((_String*)userHookins(i))->getStr();
+                    } else {
+                        userAction = baseDirectory&"Help"&baseDirectory.sData[baseDirectory.sLength-1]&"Commands"&baseDirectory.sData[baseDirectory.sLength-1]&"query.bf";
+                    }
+
+                    h = PushFilePath  (userAction);
+                    ReadBatchFile (userAction, uxl);
+
+                    SetStatusLine ( justTheName, "Loading", "00:00:00", -1);
+                    if (k==1) {
+                        _String addin;
+                        switch (i) {
+                        case 0:
+                            addin = "Command";
+                            break;
+                        case 1:
+                            addin = "Description";
+                            break;
+                        case 2:
+                            addin = "Notes";
+                            break;
+                        case 3:
+                            addin = "Export";
+                            break;
+                        case 5:
+                            addin = "Window";
+                            break;
+                        }
+                        firstArg = ((_HYTextBox*)GetObject (1))->GetText();
+                        _FString qf = _FString (addin,false),
+                                 qt = _FString (firstArg,false);
+
+                        firstArg = "QUERY_FIELD";
+                        setParameter (firstArg,&qf);
+                        firstArg = "QUERY_TERM";
+                        setParameter (firstArg,&qt);
+                    }
+
+                    uxl.Execute();
+                    terminateExecution = false;
+                    if (h) {
+                        PopFilePath   ();
+                    }
+                    /*}
+                    else
+                    {
+                        userAction = userAction & " could not be found. Perhaps the file was recently moved or deleted.";
+                        ProblemReport (userAction, (Ptr)this);
+                    }*/
+                    SetStatusLine     (justTheName, "Finished", empty, -1, HY_SL_FILE|HY_SL_TASK);
+                }
+            }
+            break;
+
+            case 2:
+                DoEcho();
+                break;
+
+            case 3: {
+                _String webUpdate = libDirectory&"TemplateBatchFiles"&GetPlatformDirectoryChar()&"WebUpdate.bf";
+                _ExecutionList wbl;
+                k = PushFilePath  (webUpdate);
+                ReadBatchFile (webUpdate, wbl);
+                wbl.Execute();
+                terminateExecution = false;
+                if (k) {
+                    PopFilePath   ();
+                }
+
+            }
+            }
+
+            done = true;
+        }
+    } else if (e->EventClass().Equal(&_hyTextEditChange)) {
+        firstArg = e->EventCode().Cut (0,(f=e->EventCode().Find(','))-1);
+        k = firstArg.toNum();
+        for (i=0; i<components.lLength; i++) {
+            if (((_HYGuiObject*)components(i))->MatchID(k)) {
+                break;
+            }
+        }
+        if (i==0) { // out box
+            _UpdateEditMenu();
+            done = true;
+        } else if (i==1) { // in box
+            firstArg        = e->EventCode().Cut (f+1,-1);
+            k               = firstArg.toNum();
+            _HYTextBox * ib = (_HYTextBox*)GetObject (1);
+
+            if (k==2) {
+                if (inputStatus == 1) {
+                    inputStatus = 2;
+                }
+            } else {
+                if (k==3)
+                    // down arrow
+                {
+                    if (inputLocation<recentInputs.lLength-1) {
+                        ib->SetText (*(_String*)recentInputs(++inputLocation), false);
+                    }
+                } else if (k==4)
+                    // up arrow
+                {
+                    if (inputLocation>0) {
+                        ib->SetText (*(_String*)recentInputs(--inputLocation), false);
+                    }
+                } else {
+                    if (inputStatus == 1) {
+                        inputLocation = recentInputs.lLength;
+                    }
+
+                    _HYButtonBar * bb = (_HYButtonBar*)GetObject (2);
+                    bool    onOff = ! ib->_IsEmpty();
+                    bb->EnableButton   (1,onOff);
+                }
+            }
+            done = true;
+        }
+    }
+
+    if (done) {
+        DeleteObject (e);
+        return true;
+    }
+    return _HYTWindow::ProcessEvent(e);
+}
+
+//__________________________________________________________
+
+void    _HYConsoleWindow::PrintString   (_String& s)
+{
+    if (s.sLength) {
+        if (echoFileRef && echoStatus == 1) {
+            fprintf (echoFileRef,"%s",s.sData);
+        }
+        //#ifndef __MAC__
+        forceUpdateForScrolling = true;
+        //#endif
+        ((_HYTextBox *)components(0))->InsertText (s,true,true);
+        //#ifndef __MAC__
+        forceUpdateForScrolling = false;
+        //#endif
+#ifdef __WINDOZE__
+        yieldCPUTime ();
+#endif
+    }
+}
+
+
+//__________________________________________________________
+
+_String* _HYConsoleWindow::ReadString    (void)
+{
+    BringToFront ();
+    _String * res = nil;
+
+    _HYTextBox * inbox = ((_HYTextBox*)GetObject(1));
+
+    inbox->SetText        (empty,false);
+
+    ProcessEvent (generateKeyboardFocusEvent(inbox->GetID()));
+
+    inputStatus   = 1;
+    inputLocation = recentInputs.lLength;
+
+    _PaintStatusBar();
+
+    inbox->boxFlags |= HY_TB_ARROWS;
+
+#ifndef __WINDOZE__
+    while ((inputStatus != 2)&&(!terminateExecution)) {
+        handleGUI();
+    }
+#else
+    while ((inputStatus != 2)&&(!terminateExecution)&&(!hyphyExiting)) {
+        handleGUI();
+    }
+
+    if (hyphyExiting) {
+        return new _String;
+    }
+#endif
+
+    inbox->boxFlags -= HY_TB_ARROWS;
+
+    inbox->StoreText (res);
+
+    inputStatus = 0;
+
+    if (res->sLength) {
+        if (recentInputs.lLength > 100) {
+            recentInputs.Delete (0);
+        }
+        recentInputs && res;
+    }
+
+    _PaintStatusBar();
+
+    if (echoFileRef && echoStatus == 1) {
+        fprintf (echoFileRef,"\n>Input:%s",res->sData);
+    }
+
+    return res;
+}
+
+//__________________________________________________________
+
+void _HYConsoleWindow::DoFind        (bool prompt)
+{
+    _String promptS ("Look for:");
+    if (prompt)
+        if (!EnterStringDialog (searchTerm, promptS, (Ptr)this)) {
+            return;
+        }
+
+    if (searchTerm.sLength) {
+        ((_HYTextBox*)GetObject(0))->_DoFind(searchTerm);
+    }
+}
+
+//__________________________________________________________
+
+void _HYConsoleWindow::DoSave        (void)
+{
+}
+
+
+
+//__________________________________________________________
+
+void _HYConsoleWindow::DoEcho        (void)
+{
+    _List           menuChoices;
+
+    if (!echoFileRef) {
+        menuChoices && & startEchoing;
+    } else {
+        menuChoices && & stopEchoing;
+
+        if (echoStatus == 0) { // paused
+            menuChoices && & resumeEchoing;
+        } else {
+            menuChoices && & pauseEchoing;
+        }
+    }
+
+    int h,v;
+
+    _HYButtonBar * bb = (_HYButtonBar*)GetObject (2);
+
+    bb->GetButtonLoc(2,h,v,true);
+
+    _String choice = HandlePullDown (menuChoices,h,v,0);
+
+    if (choice.Equal (&startEchoing)) {
+        _String saveDP (dialogPrompt),
+                fileName;
+
+        dialogPrompt = "Echo HyPhy console to:";
+        fileName = WriteFileDialogInput ();
+        if (fileName.sLength) {
+            echoFileRef = doFileOpen (fileName.sData,"w");
+            if (!echoFileRef) {
+                fileName = _String ("File '")&fileName& "' couldn't be opened for writing.";
+                ProblemReport (fileName);
+            }
+        }
+        dialogPrompt = saveDP;
+        echoStatus   = 1;
+    } else if (choice.Equal (&stopEchoing)) {
+        fclose (echoFileRef);
+        echoFileRef = nil;
+        echoStatus  = 0;
+    } else if (choice.Equal (&pauseEchoing)) {
+        echoStatus = 0;
+    } else if (choice.Equal (&resumeEchoing)) {
+        echoStatus = 1;
+    }
+
+    bb->_UnpushButton();
+    _PaintStatusBar();
+}
+
+//_________________________________________________________________________
+
+#define CONSOLE_BUFFERING  1024L
+
+_String * consoleBuffer         = new _String (CONSOLE_BUFFERING, true);
+long      consoleBufferAdded    = 0;
+
+//_________________________________________________________________________
+
+void    FlushConsoleBuffer (void)
+{
+    if (consoleBufferAdded) {
+        consoleBuffer->Finalize();
+        hyphyConsoleWindow->PrintString (*consoleBuffer);
+        consoleBufferAdded = 0;
+        DeleteObject (consoleBuffer);
+        consoleBuffer     = new _String (CONSOLE_BUFFERING,true);
+        checkPointer (consoleBuffer);
+    }
+}
+
+//_________________________________________________________________________
+
+void    StringToConsole (_String & s, _SimpleList* )
+{
+
+    if (s.sLength) {
+        if (s.sLength + consoleBufferAdded >= CONSOLE_BUFFERING) {
+            FlushConsoleBuffer ();
+            hyphyConsoleWindow->PrintString (s);
+        } else
+            for (long k=0; k<s.sLength; k++, consoleBufferAdded++) {
+                char c=s.sData[k];
+
+                if ( c=='\n' || c=='\r' || consoleBufferAdded>=CONSOLE_BUFFERING) {
+                    *consoleBuffer << c;
+                    consoleBufferAdded++;
+                    FlushConsoleBuffer ();
+                } else {
+                    *consoleBuffer << c;
+                }
+            }
+
+        //hyphyConsoleWindow->PrintString (s);
+    }
+}
+
+//_________________________________________________________________________
+
+void    BufferToConsole (const char* buffer, _SimpleList* dummy)
+{
+    _String s (buffer);
+    StringToConsole (s, dummy);
+}
+
+//_________________________________________________________________________
+
+void    SaveConsole (void)
+{
+
+    _String     sDP = dialogPrompt;
+
+    dialogPrompt = "Save HyPhy console to:";
+
+    _String     fileName(WriteFileDialogInput ());
+
+    if (fileName.sLength == 0) {
+        return;
+    }
+
+    FILE *      f = doFileOpen (fileName.getStr(),"w");
+    if (!f) {
+        fileName = _String ("Could not open '") & fileName & "' for writing.";
+        ProblemReport (fileName, (Ptr)hyphyConsoleWindow);
+    } else {
+        fileName = GetVersionString () & " console saved on " & GetTimeStamp () & "\n\n";
+        fwrite (fileName.sData,1,fileName.sLength, f);
+        _String *cS;
+        ((_HYTextBox*)hyphyConsoleWindow->GetObject (0))->StoreText (cS);
+#ifdef __WINDOZE__
+        for (long k=0; k<cS->sLength; k++) {
+            char c = cS->sData[k];
+            if (c=='\r') {
+                fprintf (f,"\n");
+            } else {
+                fputc (c,f);
+            }
+        }
+#else
+        fprintf (f,"%s",cS->sData);
+#endif
+        fclose (f);
+        DeleteObject (cS);
+    }
+
+    dialogPrompt = sDP;
+}
+
+//_________________________________________________________________________
+
+void    NLToConsole (void)
+{
+    StringToConsole (newLN);
+}
+
+//_________________________________________________________________________
+
+_String*    StringFromConsole (bool echo)
+{
+    FlushConsoleBuffer();
+    _String * res = hyphyConsoleWindow->ReadString ();
+    if (echo) {
+        hyphyConsoleWindow->PrintString (*res);
+        hyphyConsoleWindow->PrintString (newLN);
+    }
+    return res;
+}
+
+//_________________________________________________________________________
+
+void    SetStatusLine (_String arg)
+{
+#ifdef __HYPHYMPI__
+    if (_hy_mpi_node_rank > 0) {
+        return;
+    }
+#endif
+
+    hyphyConsoleWindow->action = arg;
+    hyphyConsoleWindow->_PaintStatusBar();
+
+}
+
+//_________________________________________________________________________
+
+void    SetStatusBarValue (long l,_Parameter max, _Parameter rate)
+{
+#ifdef __HYPHYMPI__
+    if (_hy_mpi_node_rank > 0) {
+        return;
+    }
+#endif
+
+    hyphyConsoleWindow->percentDone = l;
+    if (max<=0.0) {
+        hyphyConsoleWindow->action   = _String ("LF Optimization. Value=") & _String (max) &", "&_String (rate) & " evals/sec.";
+    }
+    hyphyConsoleWindow->_PaintStatusBar();
+}
+
+//_________________________________________________________________________
+
+void    SetStatusLine (_String arg, _String arg2, _String arg3)
+{
+#ifdef __HYPHYMPI__
+    if (_hy_mpi_node_rank > 0) {
+        return;
+    }
+#endif
+
+    hyphyConsoleWindow->action = arg2;
+    hyphyConsoleWindow->fileName = arg;
+    hyphyConsoleWindow->timer = arg3;
+    hyphyConsoleWindow->_PaintStatusBar();
+}
+
+//_________________________________________________________________________
+
+void    SetStatusLine (_String arg, _String arg2, _String arg3, long l)
+{
+#ifdef __HYPHYMPI__
+    if (_hy_mpi_node_rank > 0) {
+        return;
+    }
+#endif
+
+    hyphyConsoleWindow->action = arg2;
+    hyphyConsoleWindow->fileName = arg;
+    hyphyConsoleWindow->timer = arg3;
+    hyphyConsoleWindow->percentDone = l;
+    hyphyConsoleWindow->_PaintStatusBar();
+}
+
+//_________________________________________________________________________
+
+void    SetStatusLine (_String arg, _String arg2, _String arg3, long l, char c)
+{
+#ifdef __HYPHYMPI__
+    if (_hy_mpi_node_rank > 0) {
+        return;
+    }
+#endif
+
+    if (c & HY_SL_FILE) {
+        hyphyConsoleWindow->fileName = arg;
+    }
+    if (c & HY_SL_TASK) {
+        hyphyConsoleWindow->action = arg2;
+    }
+    if (c & HY_SL_TIMER) {
+        hyphyConsoleWindow->timer = arg3;
+    }
+    if (c & HY_SL_PERCENT) {
+        hyphyConsoleWindow->percentDone = l;
+    }
+    if (c & HY_SL_SUSPEND) {
+        hyphyConsoleWindow->action = suspendedPref & hyphyConsoleWindow->action;
+    }
+    if (c & HY_SL_RESUME) {
+        hyphyConsoleWindow->action.Trim (suspendedPref.sLength,-1);
+    }
+
+    hyphyConsoleWindow->_PaintStatusBar(nil,(c & HY_SL_FORCE));
+}
+
+//_________________________________________________________________________
+
+void    LoadUserHookins (void)
+{
+    _String baseDir = libDirectory & userHookinDir;
+    ScanDirectoryForFileNames (baseDir,userHookins,false);
+}
+
+
+// EOF
diff --git a/src/gui/HYDBWindow.cpp b/src/gui/HYDBWindow.cpp
new file mode 100644
index 0000000..7fb123a
--- /dev/null
+++ b/src/gui/HYDBWindow.cpp
@@ -0,0 +1,1194 @@
+/*
+ 
+ HyPhy - Hypothesis Testing Using Phylogenies.
+ 
+ Copyright (C) 1997-now
+ Core Developers:
+ Sergei L Kosakovsky Pond (spond at ucsd.edu)
+ Art FY Poon    (apoon at cfenet.ubc.ca)
+ Steven Weaver (sweaver at ucsd.edu)
+ 
+ Module Developers:
+ Lance Hepler (nlhepler at gmail.com)
+ Martin Smith (martin.audacis at gmail.com)
+ 
+ Significant contributions from:
+ Spencer V Muse (muse at stat.ncsu.edu)
+ Simon DW Frost (sdf22 at cam.ac.uk)
+ 
+ Permission is hereby granted, free of charge, to any person obtaining a
+ copy of this software and associated documentation files (the
+ "Software"), to deal in the Software without restriction, including
+ without limitation the rights to use, copy, modify, merge, publish,
+ distribute, sublicense, and/or sell copies of the Software, and to
+ permit persons to whom the Software is furnished to do so, subject to
+ the following conditions:
+ 
+ The above copyright notice and this permission notice shall be included
+ in all copies or substantial portions of the Software.
+ 
+ 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.
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ 
+ */
+
+#include "batchlan.h"
+#include "HYDBWindow.h"
+
+#include "HYLabel.h"
+#include "HYPullDown.h"
+#include "HYButtonBar.h"
+#include "HYTextBox.h"
+#include "HYGraphicPane.h"
+#include "HYModelWindow.h"
+#include "HYUtils.h"
+#include "HYDialogs.h"
+#include "HYEventTypes.h"
+
+#include "string.h"
+
+#ifdef    __HYPHYDMALLOC__
+#include "dmalloc.h"
+#endif
+
+
+extern      _SimpleList                         windowObjects,
+            sqlDatabases;
+
+extern      _HYColor                            tableDefaultBk2,
+            labelBColor,
+            labelFColor,
+            black;
+
+extern      _String                             donotWarnAgain,
+            windowTypeTable,
+            windowTypeDistribTable,
+            none;
+
+
+#define     HY_LARGE_COMPONENT_SIZE             10000L
+#define     HY_DBW_DEFAULT_TRUNCATE_TEXT        50
+#define     HY_DBW_DEFAULT_RECORD_LIMIT         1000
+
+_String     internalSQLiteIndex                 ("__HYPHY_INTERNAL_SQLITE_INDEX"),
+            _HY_DBW_longFieldEdit               ("Edit a long database field"),
+            _HY_DBW_TemplateFileName            ("HY_DBW_TemplateList"),
+            _HY_DBW_TablePlaceholder            ("_HY_DBW_TABLE_NAME_"),
+            _HY_DBW_ColumnPlaceholder           ("_HY_DBW_COLUMN_NAMES_"),
+            _HY_DBW_RowValues                   ("_HY_DBW_ROW_VALUES_"),
+            _HY_DBW_OutputProcessorFunction     ("_HY_DBW_OUTPUT_PROCESSOR_FUNCTION_"),
+            _HY_DBW_OutputProcessorName         ("_HY_DBW_OUTPUT_PROCESSOR_NAME_"),
+            _HY_DBW_OutputDBID                  ("_HY_DBW_OUTPUT_DB_ID_"),
+            _HY_DBW_SqlQuery                    ("_HY_DBW_SQL_QUERY"),
+            _HY_DBW_RunMe                       ("_HY_DBW_OUTPUT_RUN_ME_");
+
+
+_List       _HYDBW_Templates,
+            _HYDBW_OutputProcessors,
+            _HYDBW_FilePaths;
+
+
+//____________________________________________________________________________________
+
+int  _HYDBWCallBack (void* aL,int cc, char** rd, char** cn)
+{
+    _List * aList = (_List*)aL;
+
+    if (aList && cc && aList) {
+        if (aList->lLength == 0) { // first call; populate column headers
+            for (long cnt = 0; cnt < cc; cnt++) {
+                _List * newList     = new _List (2L),
+                * emptyList = new _List ();
+
+                checkPointer (newList);
+                checkPointer (emptyList);
+
+                if (cn[cnt]) {
+                    _String * colData = new _String (cn[cnt]);
+                    (*newList) << colData;
+                    DeleteObject (colData);
+                } else {
+                    (*newList) && & empty;
+                }
+
+                (*newList) << emptyList;
+                DeleteObject (emptyList);
+                (*aList) << newList;
+                DeleteObject (newList);
+            }
+
+        }
+        for (long cnt = 0; cnt < cc; cnt++) {
+            _List * storeIn = (_List *)(*((_List*)(*aList) (cnt)))(1);
+
+            if (rd[cnt]) {
+                _String * colData = new _String (rd[cnt]);
+                (*storeIn) << colData;
+                DeleteObject (colData);
+            } else {
+                (*storeIn) && & empty;
+            }
+        }
+
+    }
+    return 0;
+}
+
+//____________________________________________________________________________________
+
+int  _HYDBWTablePopulatorCallBack (void* aL,int cc, char** rd, char** cn)
+{
+    _HYDBWindow * aWindow = (_HYDBWindow*)aL;
+
+    if (cc && aWindow) {
+        _HYTable * ttop   = (_HYTable*)aWindow->GetObject (1),
+                   * tleft  = (_HYTable*)aWindow->GetObject (2),
+                     * tmain  = (_HYTable*)aWindow->GetObject (0);
+
+
+        if (ttop->horizontalSpaces.lLength < cc) {
+            long defWidth  = (aWindow->componentR[1]-aWindow->componentL[1]+1),
+                 defCWidth = aWindow->componentR[2]-aWindow->componentL[2]+1;
+
+            for (long cnt = 0; cnt < cc; cnt++) {
+                tmain->AddColumn (-1,defWidth/cc,HY_TABLE_STATIC_TEXT);
+                ttop->AddColumn  (-1,defWidth/cc,HY_TABLE_STATIC_TEXT);
+            }
+
+
+            ttop-> AddRow (-1,18,HY_TABLE_STATIC_TEXT|HY_TABLE_BEVELED);
+            tleft->AddColumn (-1,defCWidth,HY_TABLE_STATIC_TEXT);
+
+
+            for (long cnt = 0; cnt < cc; cnt++) {
+                if (cn[cnt]) {
+                    _String * colData = new _String (cn[cnt]);
+                    ttop->SetCellData (colData,0,cnt,HY_TABLE_STATIC_TEXT|HY_TABLE_BEVELED,false);
+                } else {
+                    ttop->SetCellData (&empty,0,cnt,HY_TABLE_STATIC_TEXT|HY_TABLE_BEVELED,true);
+                }
+
+                ttop->AutoFitColumn (cnt,true);
+            }
+
+            ttop  -> EnforceWidth   (defWidth,-1,true);
+
+        }
+
+        if (tleft->verticalSpaces.lLength < aWindow->recordLimit) {
+            tleft-> AddRow (-1,tleft->textFont.size+6,HY_TABLE_STATIC_TEXT|HY_TABLE_BEVELED);
+            tmain-> AddRow (-1,tleft->textFont.size+6,HY_TABLE_STATIC_TEXT);
+
+            _String rowIndex ((long)tleft->verticalSpaces.lLength);
+            tleft->SetCellData (&rowIndex,tleft->verticalSpaces.lLength-1,0,HY_TABLE_STATIC_TEXT|HY_TABLE_BEVELED,true);
+
+            for (long cnt = 0; cnt < cc; cnt++) {
+                if (rd[cnt]) {
+                    long ll = strlen (rd[cnt]);
+
+                    if (ll>HY_DBW_DEFAULT_TRUNCATE_TEXT) {
+                        _String * cellData = new _String(HY_DBW_DEFAULT_TRUNCATE_TEXT,true);
+                        checkPointer (cellData);
+                        for (long k=0; k<HY_DBW_DEFAULT_TRUNCATE_TEXT; k++) {
+                            (*cellData) << rd[cnt][k];
+                        }
+                        (*cellData) << "...";
+                        cellData->Finalize();
+                        tmain->SetCellData (cellData,tleft->verticalSpaces.lLength-1,cnt,HY_TABLE_STATIC_TEXT,false);
+                    } else {
+                        _String * cellData = new _String(rd[cnt]);
+                        checkPointer (cellData);
+                        tmain->SetCellData (cellData,tleft->verticalSpaces.lLength-1,cnt,HY_TABLE_STATIC_TEXT,false);
+                    }
+                }
+            }
+        }
+    }
+    return 0;
+}
+
+//____________________________________________________________________________________
+
+int  _HYDBWTableCellCounter (void* aL,int cc, char**, char**)
+{
+    long * aCounter = (long*)aL;
+
+    if (aCounter) {
+        aCounter[0] ++;
+        aCounter[1] = cc;
+    }
+
+    return 0;
+}
+
+//__________________________________________________________
+
+_HYDBWindow::_HYDBWindow (_String name, _String *filePath):_HYTWindow (name, true)
+{
+
+    if (!_HYDBW_Templates.lLength && !_HYDBW_OutputProcessors.lLength) {
+        ReadSQLPlugins();
+    }
+
+    _HYRect         canvasSettings = {30,50,30,50,HY_COMPONENT_NO_SCROLL};
+
+    _HYLabel*       l1      = new _HYLabel (canvasSettings, GetOSWindowData());
+    _HYLabel*       l2      = new _HYLabel (canvasSettings, GetOSWindowData());
+
+    canvasSettings.left     = 100;
+    canvasSettings.right    = 150;
+
+    _HYPullDown*    p1      = new _HYPullDown (canvasSettings,GetOSWindowData());
+    _HYPullDown*    p2      = new _HYPullDown (canvasSettings,GetOSWindowData());
+
+    canvasSettings.left     = 100;
+    canvasSettings.right    = 100;
+
+    canvasSettings.top      = 200;
+    canvasSettings.bottom   = HY_LARGE_COMPONENT_SIZE;
+    canvasSettings.right    = HY_LARGE_COMPONENT_SIZE;
+
+    canvasSettings.width    = HY_COMPONENT_V_SCROLL|HY_COMPONENT_H_SCROLL|HY_TABLE_DONT_GROW_HORIZ;
+    _HYTable*   table       = new _HYTable (canvasSettings,GetOSWindowData(),1,1,100,16,HY_TABLE_STATIC_TEXT);
+
+    canvasSettings.top      = canvasSettings.bottom     = 20;
+    canvasSettings.width    = HY_COMPONENT_NO_SCROLL|HY_TABLE_DONT_GROW_HORIZ;
+
+    _HYTable*   tableHead   = new _HYTable (canvasSettings,GetOSWindowData(),1,1,100,18,HY_TABLE_STATIC_TEXT);
+    canvasSettings.left     = canvasSettings.right = 40;
+    canvasSettings.top      = 200;
+    canvasSettings.bottom   = HY_LARGE_COMPONENT_SIZE;
+
+    canvasSettings.width    = HY_COMPONENT_NO_SCROLL|HY_COMPONENT_BORDER_R|HY_TABLE_DONT_GROW_HORIZ|HY_TABLE_DONT_GROW_VERT;
+    _HYTable*   tableLeft   = new _HYTable (canvasSettings,GetOSWindowData(),1,1,40,16,HY_TABLE_STATIC_TEXT);
+
+    table->selectionType    = HY_TABLE_FOCUSABLE|HY_TABLE_HORZ_STRETCH|HY_TABLE_VERT_STRETCH;
+    tableHead->selectionType= HY_TABLE_HORZ_STRETCH;
+    tableLeft->selectionType= HY_TABLE_DONT_GROW_VERT|HY_TABLE_VERT_STRETCH;
+
+    canvasSettings.top      = canvasSettings.bottom     = 18;
+    canvasSettings.width    = HY_COMPONENT_NO_SCROLL|HY_COMPONENT_BORDER_T|HY_COMPONENT_BORDER_R;
+    _HYLabel*       l3      = new _HYLabel (canvasSettings, GetOSWindowData());
+
+    canvasSettings.top      = canvasSettings.bottom     = HY_SCROLLER_WIDTH+1;
+    canvasSettings.width    = HY_COMPONENT_NO_SCROLL|HY_COMPONENT_BORDER_T|HY_COMPONENT_BORDER_R;
+    _HYLabel*       l4      = new _HYLabel (canvasSettings, GetOSWindowData());
+
+    canvasSettings.left     = 100;
+    canvasSettings.right    = HY_LARGE_COMPONENT_SIZE;
+    canvasSettings.bottom   = 61;
+    canvasSettings.top      = 61;
+
+    canvasSettings.width    = HY_COMPONENT_NO_SCROLL;
+
+    _HYTextBox  * sqlView   = new _HYTextBox (canvasSettings,GetOSWindowData(),false);
+
+    canvasSettings.left = canvasSettings.right = 50;
+    _HYButtonBar*   bb2     = new _HYButtonBar (canvasSettings,GetOSWindowData());
+
+    _String btnTT ("Run typed SQL command");
+    bb2->SetButtonDim     (16);
+    bb2->SetButtonLayoutW (2);
+    bb2->AddButton (ProcureIconResource(HY_MODELWINDOW_ICON_BASE+20),&btnTT);
+    btnTT = "Paste a predefined SQL command";
+    bb2->AddButton (ProcureIconResource(6042),&btnTT);
+    btnTT = "SQL Command History";
+    bb2->AddButton (ProcureIconResource(6006),&btnTT);
+    bb2->MarkAsPullDown (1,true);
+    bb2->MarkAsPullDown (2,true);
+    bb2->EnableButton  (0,false);
+    bb2->EnableButton  (1,false);
+    bb2->EnableButton  (2,false);
+
+    table->SetMessageRecipient      (this);
+    tableHead->SetMessageRecipient  (this);
+    tableLeft->SetMessageRecipient  (this);
+    p1->SetMessageRecipient         (this);
+    p2->SetMessageRecipient         (this);
+    sqlView->SetMessageRecipient    (this);
+    bb2->SetMessageRecipient        (this);
+
+    AddObject (table);     // 0
+    AddObject (tableHead); // 1
+    AddObject (tableLeft); // 2
+    AddObject (p1);        // 3
+    AddObject (p2);        // 4
+    AddObject (l1);        // 5
+    AddObject (l2);        // 6
+    AddObject (bb2);       // 7
+    AddObject (sqlView);   // 8
+    AddObject (l3);        // 9
+    AddObject (l4);        // 10
+
+    SetTableDimensions (5,5);
+
+    SetCell   (0,0,l1);
+    SetCell   (0,1,p1);
+    SetCell   (0,2,sqlView);
+    SetCell   (0,3,sqlView);
+    SetCell   (0,4,bb2);
+
+    SetCell   (1,0,l2);
+    SetCell   (1,1,p2);
+    SetCell   (1,2,sqlView);
+    SetCell   (1,3,sqlView);
+    SetCell   (1,4,bb2);
+
+    SetCell   (2,0,l3);
+    SetCell   (2,1,tableHead);
+    SetCell   (2,2,tableHead);
+    SetCell   (2,3,tableHead);
+    SetCell   (2,4,tableHead);
+
+    SetCell   (3,0,tableLeft);
+    SetCell   (3,1,table);
+    SetCell   (3,2,table);
+    SetCell   (3,3,table);
+    SetCell   (3,4,table);
+
+    SetCell   (4,0,l4);
+    SetCell   (4,1,table);
+    SetCell   (4,2,table);
+    SetCell   (4,3,table);
+    SetCell   (4,4,table);
+
+    p1->SetBackColor (labelBColor);
+    p2->SetBackColor (labelBColor);
+
+    l1->SetForeColor (labelFColor);
+    l2->SetForeColor (labelFColor);
+
+    l1->SetBackColor (labelBColor);
+    l2->SetBackColor (labelBColor);
+    l3->SetBackColor (tableHead->backColor2);
+    l4->SetBackColor (tableHead->backColor2);
+
+    sqlView->SetBackColor (labelBColor);
+
+    bb2->SetBackColor (labelBColor);
+
+    _HYFont  labelFont;
+
+#ifdef __WINDOZE__
+    labelFont.face = "Arial";
+    labelFont.size = 14;
+#else
+    labelFont.face = "Geneva";
+    labelFont.size = 10;
+#endif
+
+    labelFont.style = HY_FONT_PLAIN;
+
+    table->SetFont(labelFont);
+    tableHead->SetFont(labelFont);
+    tableLeft->SetFont(labelFont);
+
+#ifdef __WINDOZE__
+    labelFont.size = 14;
+#else
+    labelFont.size = 12;
+#endif
+
+    p1->SetAlignFlags (HY_ALIGN_LEFT);
+    p2->SetAlignFlags (HY_ALIGN_LEFT);
+
+    p1->AddMenuItem (none,-1);
+    p2->AddMenuItem ("Table",-1);
+
+    if (_HYDBW_OutputProcessors.lLength) {
+        p2->AddMenuItem (menuSeparator,-1);
+        for (long pi = 0; pi < _HYDBW_OutputProcessors.lLength; pi++) {
+            p2->AddMenuItem (*(_String*)_HYDBW_OutputProcessors(pi),-1);
+        }
+    }
+
+    l1->SetAlignFlags (HY_ALIGN_LEFT);
+    l2->SetAlignFlags (HY_ALIGN_LEFT);
+    l3->SetAlignFlags (HY_ALIGN_LEFT);
+
+    l1->SetShadow (true);
+    l2->SetShadow (true);
+
+    l1->SetFont (labelFont);
+    l2->SetFont (labelFont);
+    l3->SetFont (tableHead->textFont);
+
+    l1->SetText ("Table:");
+    l2->SetText ("Output:");
+    l3->SetText ("Index");
+
+    backColor1.R = backColor1.G = backColor1.B =
+                                      backColor2.R = backColor2.G = backColor2.B = 255;
+
+    labelFont1.face  = "Times";
+    labelFont1.style = HY_FONT_PLAIN;
+#ifdef __WINDOZE__
+    labelFont1.size = 14;
+#else
+    labelFont1.size = 12;
+#endif
+
+    labelFont2.face  = "Times";
+    labelFont2.style = HY_FONT_PLAIN;
+#ifdef __WINDOZE__
+    labelFont2.size = 12;
+#else
+    labelFont2.size = 10;
+#endif
+
+    labelFont3.face  = "Times";
+    labelFont3.style = HY_FONT_ITALIC;
+#ifdef __WINDOZE__
+    labelFont3.size = 14;
+#else
+    labelFont3.size = 12;
+#endif
+
+    headerFont.face  = "Times";
+    headerFont.style = HY_FONT_ITALIC;
+#ifdef __WINDOZE__
+    labelFont.size = 20;
+#else
+    labelFont.size = 18;
+#endif
+
+    dbID         = -1;
+    currentTable = -1;
+    lengthLimit  = HY_DBW_DEFAULT_TRUNCATE_TEXT;
+    recordLimit  = HY_DBW_DEFAULT_RECORD_LIMIT;
+
+    SetPosition        (70,70);
+    SetWindowRectangle (0,0,400,400);
+
+    if (filePath) {
+        SetDB (*filePath);
+    }
+
+    //LoadTable (0);
+
+    sqlView->SetText ("SQL Query");
+
+    DeleteObject (table);
+    DeleteObject (tableHead);
+    DeleteObject (tableLeft);
+    DeleteObject (l1);
+    DeleteObject (l2);
+    DeleteObject (l3);
+    DeleteObject (l4);
+    DeleteObject (bb2);
+    DeleteObject (p1);
+    DeleteObject (p2);
+    DeleteObject (sqlView);
+}
+
+//__________________________________________________________
+_HYDBWindow::~_HYDBWindow()
+{
+    CloseCurrentDB ();
+}
+
+//__________________________________________________________
+void    _HYDBWindow::SetDB (_String filePath)
+{
+    CloseCurrentDB ();
+
+    _String             openCommands = _String("DoSQL(SQL_OPEN,\"") &filePath & "\"," & internalSQLiteIndex & ");";
+
+    if (ExecuteSomeCodeAndCheck (openCommands)) {
+        _Parameter db;
+        checkParameter  (internalSQLiteIndex, db, -1.);
+        dbID = db;
+        ScanTables (true);
+    }
+}
+
+//__________________________________________________________
+void    _HYDBWindow::CloseCurrentDB (void)
+{
+    if (dbID >= 0) {
+        _String             closeCommands = _String("DoSQL(SQL_CLOSE,\"\",") & internalSQLiteIndex & ");";
+        ExecuteSomeCodeAndCheck (closeCommands);
+        tableList.Clear();
+        currentTable    = -1;
+        dbID            = -1;
+    }
+}
+
+//__________________________________________________________
+void    _HYDBWindow::UpdateStatusBar (void)
+{
+    _String statusLine;
+
+    if (dbID >= 0) {
+        _HYTable        * tmain  = (_HYTable*)GetObject (0);
+
+        statusLine = _String ("Tables: ") & (long)tableList.lLength & ". Displaying " & (long)tmain->horizontalSpaces.lLength & " fields for " & (long)(tmain->verticalSpaces.lLength-1) & " records.";
+    } else {
+        statusLine = "No database is currently loaded";
+    }
+
+    SetStatusBar (statusLine);
+}
+
+//__________________________________________________________
+void    _HYDBWindow::ScanTables (bool forceCreate)
+{
+    _String getTables ("SELECT name FROM sqlite_master\nWHERE type='table'\nORDER BY name"),
+            curTableName;
+
+    _List * checkTables = ExecuteSQLBlurb (getTables);
+
+    if (currentTable >= 0 && currentTable < tableList.lLength) {
+        curTableName = *(_String*)tableList (currentTable);
+    }
+
+    tableList.Clear();
+
+    _HYPullDown * p1 = (_HYPullDown*) GetObject (3);
+    p1->DeleteAllItems();
+    if (checkTables->lLength) {
+        tableList.Duplicate((*((_List*)(*checkTables) (0)))(1));
+        if (tableList.lLength) {
+            for (long mi = 0; mi < tableList.lLength; mi++) {
+                p1->AddMenuItem (*(_String*)tableList(mi), -1);
+            }
+
+            currentTable = tableList.Find (&curTableName);
+            if (currentTable >= 0) {
+                p1->ChangeSelection (currentTable,false);
+            } else {
+                p1->ChangeSelection (0,true);
+            }
+        }
+    } else {
+        if (forceCreate) {
+            _String createTable ("CREATE TABLE TABLE_ID (\na INTEGER PRIMARY KEY,\nb INTEGER);"),
+                    createTableP ("Enter SQL instructions to make a table");
+
+            /*BringToFront();*/
+            if (EnterStringDialog (createTable,createTableP,nil)) {
+                DeleteObject (ExecuteSQLBlurb (createTable));
+                ScanTables (true);
+                return;
+            }
+        }
+
+        getTables = "Could not load any SQLite tables";
+        ProblemReport (getTables,(Ptr)this);
+        p1->AddMenuItem     (none,-1);
+        p1->ChangeSelection (0,false);
+
+    }
+
+    DeleteObject (checkTables);
+    UpdateStatusBar ();
+}
+
+//__________________________________________________________
+bool    _HYDBWindow::LoadTable (long tableIndex, _String* code)
+{
+    bool result = false;
+    if (dbID >= 0 && tableIndex < tableList.lLength && tableIndex >= 0) {
+        _HYTable        * ttop   = (_HYTable*)GetObject (1),
+                          * tleft  = (_HYTable*)GetObject (2),
+                            * tmain  = (_HYTable*)GetObject (0);
+
+        _HYButtonBar    * bb2    = (_HYButtonBar*)GetObject (7);
+
+        bb2->EnableButton(0,false);
+        bb2->EnableButton(1,false);
+
+        ttop->ClearTable  (true);
+        tleft->ClearTable (true);
+        tmain->ClearTable (true);
+
+        _String getTables    = code ? *code:(_String("SELECT * FROM ") & *(_String*)tableList (tableIndex));
+
+        char  * errMsg         = nil;
+        long    recordCount[2] = {0,0};
+
+        sqlite3_exec((sqlite3*)sqlDatabases.lData[dbID], getTables.sData, _HYDBWTableCellCounter, (Ptr)recordCount, &errMsg);
+
+        if (recordCount [0]) {
+            if (recordCount [0] > recordLimit) {
+                _String     res (recordLimit),
+                            prompt = _String("Large table warning: ") & recordCount [0] & " rows. Display:";
+
+                tmain->AddColumn (-1,10,HY_TABLE_STATIC_TEXT|HY_TABLE_CANTSELECT);
+                ttop ->AddColumn (-1,10,HY_TABLE_STATIC_TEXT|HY_TABLE_CANTSELECT);
+                tleft->AddColumn (-1,tleft->settings.left,HY_TABLE_STATIC_TEXT|HY_TABLE_CANTSELECT);
+                ttop ->AddRow    (-1,1,HY_TABLE_STATIC_TEXT|HY_TABLE_CANTSELECT);
+                tmain -> AddRow (-1,1,HY_TABLE_STATIC_TEXT|HY_TABLE_CANTSELECT);
+                tleft -> AddRow (-1,1,HY_TABLE_STATIC_TEXT|HY_TABLE_CANTSELECT);
+
+                if (EnterStringDialog (res,prompt,nil)) {
+                    recordLimit = res.toNum();
+                    if (recordLimit < 1) {
+                        recordLimit = HY_DBW_DEFAULT_RECORD_LIMIT;
+                    }
+                }
+                ttop->ClearTable  (true);
+                tleft->ClearTable (true);
+                tmain->ClearTable (true);
+            }
+            recordCount[0] = MIN (recordCount[0],recordLimit);
+
+            tmain -> RequestSpace (recordCount[0], recordCount[1]);
+            tleft -> RequestSpace (recordCount[0], 1);
+            sqlite3_exec((sqlite3*)sqlDatabases.lData[dbID], getTables.sData, _HYDBWTablePopulatorCallBack, (Ptr)this, &errMsg);
+
+        } else if (tmain->horizontalSpaces.lLength == 0 && tmain->verticalSpaces.lLength == 0) {
+            tmain->AddColumn (-1,10,HY_TABLE_STATIC_TEXT|HY_TABLE_CANTSELECT);
+            ttop ->AddColumn (-1,10,HY_TABLE_STATIC_TEXT|HY_TABLE_CANTSELECT);
+            tleft->AddColumn (-1,tleft->settings.left,HY_TABLE_STATIC_TEXT|HY_TABLE_CANTSELECT);
+            ttop ->AddRow    (-1,1,HY_TABLE_STATIC_TEXT|HY_TABLE_CANTSELECT);
+        }
+
+        tmain -> AddRow (-1,1,HY_TABLE_STATIC_TEXT|HY_TABLE_CANTSELECT);
+        tleft -> AddRow (-1,1,HY_TABLE_STATIC_TEXT|HY_TABLE_CANTSELECT);
+
+        tmain -> AutoFitWidth   (*ttop);
+        ttop  -> SetVisibleSize (ttop->rel);
+        tleft -> SetVisibleSize (tleft->rel);
+        tmain -> SetVisibleSize (tmain->rel);
+        ttop  -> _MarkForUpdate ();
+        tleft -> _MarkForUpdate ();
+        tmain -> _MarkForUpdate ();
+
+        bb2->EnableButton(0,true);
+        bb2->EnableButton(1,true);
+
+
+        if (errMsg) {
+            _String         errStr (errMsg);
+            sqlite3_free    (errMsg);
+            ProblemReport   (errStr, (Ptr)this);
+        } else {
+            result = true;
+        }
+
+        currentTable = tableIndex;
+        UpdateStatusBar ();
+    }
+    return result;
+}
+
+//__________________________________________________________
+_List*  _HYDBWindow::ExecuteSQLBlurb (_String& theBlurb)
+{
+    _List      * outList = new _List;
+    checkPointer (outList);
+    if (dbID >= 0) {
+        char  * errMsg = nil;
+        if (sqlite3_exec((sqlite3*)sqlDatabases.lData[dbID], theBlurb.sData, _HYDBWCallBack, (Ptr)outList, &errMsg) != SQLITE_OK) {
+            _String errStr = _String("SQL Error:") & errMsg;
+            ProblemReport (errStr, (Ptr)this);
+            sqlite3_free (errMsg);
+            outList->Clear();
+            return outList;
+        }
+    }
+    return outList;
+}
+
+
+
+//__________________________________________________________
+
+bool ExecuteSomeCodeAndCheck (_String & code)
+{
+    _ExecutionList      exl  (code);
+    exl.Execute ();
+    if (terminateExecution) {
+        terminateExecution = false;
+        return false;
+    }
+    return true;
+}
+//__________________________________________________________
+
+_List*  _HYDBWindow::RetrieveRecord (long row, _String& columns, bool report, _String * newValue)
+{
+    if (dbID >= 0 && currentTable >= 0) {
+        _String    queryString (128L, true),
+                   whereString (128L, true);
+
+        _HYTable * tmain = (_HYTable*)GetObject (0),
+                   * ttop    = (_HYTable*)GetObject (1);
+
+        queryString << "SELECT ALL ";
+        queryString << columns;
+        queryString << " FROM ";
+        queryString << (_String*)tableList(currentTable);
+        whereString << " WHERE (";
+
+        bool        addAnd = false;
+
+        for (long k=0; k<tmain->horizontalSpaces.lLength; k++) {
+            _String * cellData = (_String*)tmain->GetCellData (k,row);
+            if (cellData->sLength) {
+                if (addAnd) {
+                    whereString << " AND ";
+                }
+
+                whereString << (_String*)ttop->GetCellData (k,0);
+                if (cellData->endswith ("...")) {
+                    whereString << " LIKE '";
+                    whereString << cellData->Cut (0, cellData->sLength-4);
+                    whereString << "%";
+                } else {
+                    whereString << " = '";
+                    whereString << cellData;
+                }
+                whereString << '\'';
+
+                addAnd = true;
+
+            }
+        }
+
+        whereString << ")";
+        whereString.Finalize();
+        queryString << whereString;
+        queryString.Finalize();
+
+        _List * ml = ExecuteSQLBlurb (queryString);
+
+        if (ml->lLength) {
+            if (((_List*)(*ml)(0))->lLength > 2) {
+                if (report) {
+                    queryString = "Internal Error: could not extract a record from the database, because multiple records matched selected column values";
+                    ProblemReport (queryString,(Ptr)this);
+                }
+                ml->Clear();
+                return ml;
+            } else {
+                if (newValue) {
+                    ml->Clear();
+
+                    _String replaceString (128L,true);
+
+                    replaceString << "UPDATE OR REPLACE  ";
+                    replaceString << (_String*)tableList(currentTable);
+                    replaceString << " SET ";
+                    replaceString << columns;
+                    replaceString << " = '";
+                    replaceString << newValue;
+                    replaceString << "' ";
+                    replaceString << whereString;
+                    replaceString.Finalize();
+
+                    char  * errMsg = nil;
+                    if (sqlite3_exec((sqlite3*)sqlDatabases.lData[dbID], replaceString.sData, NULL, NULL, &errMsg) != SQLITE_OK) {
+                        _String errStr = _String("SQL Error:") & errMsg;
+                        ProblemReport (errStr, (Ptr)this);
+                        sqlite3_free (errMsg);
+                        return ml;
+                    }
+                    (*ml) && & empty;
+                    return ml;
+                } else {
+                    _List * records = new _List;
+                    checkPointer (records);
+
+                    for (long k=0; k<ml->lLength; k++) {
+                        (*records) << (*((_List*)(*((_List*)(*ml)(k)))(1)))(0);
+                    }
+
+                    DeleteObject (ml);
+                    return records;
+                }
+            }
+        } else {
+            if (report) {
+                queryString = "Internal Error: could not extract a record from the database, because no records matched column values";
+                ProblemReport (queryString,(Ptr)this);
+            }
+        }
+
+        return ml;
+    }
+
+    return new _List;
+
+}
+
+//__________________________________________________________
+
+void    _HYDBWindow::EditLongEntry (void)
+{
+    _HYTable * tmain = (_HYTable*)GetObject (0),
+               * ttop  = (_HYTable*)GetObject (1);
+
+    _SimpleList tsel;
+    tmain->GetSelection (tsel);
+
+    if (tsel.lLength == 1) {
+        _List* outRec = RetrieveRecord (tsel.lData[0]/tmain->horizontalSpaces.lLength,
+                                        *(_String*) ttop->GetCellData(tsel.lData[0]%tmain->horizontalSpaces.lLength,0),
+                                        true
+                                       );
+
+        if (outRec->lLength) {
+            _String * newValue = new _String (*(_String*)(*outRec)(0));
+            checkPointer (newValue);
+
+            if (!EnterStringDialog (*newValue, _HY_DBW_longFieldEdit, (Ptr)this)) {
+                DeleteObject (newValue);
+                DeleteObject (outRec);
+                return;
+            }
+
+
+            _List * repResult = RetrieveRecord (tsel.lData[0]/tmain->horizontalSpaces.lLength,
+                                                *(_String*) ttop->GetCellData(tsel.lData[0]%tmain->horizontalSpaces.lLength,0),
+                                                true,
+                                                newValue
+                                               );
+
+            if (repResult->lLength) {
+                if (newValue->sLength > lengthLimit) {
+                    newValue->Trim(0,lengthLimit-1);
+                    *newValue = *newValue & "...";
+                }
+                tmain->SetCellData (newValue,tsel.lData[0]/tmain->horizontalSpaces.lLength,tsel.lData[0]%tmain->horizontalSpaces.lLength,HY_TABLE_STATIC_TEXT,false);
+                tmain->_MarkCellsForUpdate (tsel);
+            } else {
+                DeleteObject (newValue);
+            }
+
+
+            DeleteObject (repResult);
+
+        }
+        DeleteObject (outRec);
+    }
+}
+
+
+//__________________________________________________________
+
+void    _HYDBWindow::RunSQLQuery (void)
+{
+    if (dbID >= 0 && currentTable >=0) {
+        _HYTextBox * sqlCommand = (_HYTextBox*)GetObject (8);
+        _String      sqlText    (sqlCommand->GetText());
+
+        bool         addToHistory = true;
+        long         curSel       = ((_HYPullDown*)GetObject (4))->GetSelection();
+
+        if (curSel == 0) {
+            addToHistory = LoadTable (currentTable, &sqlText);
+        } else {
+            FILE * thisFile = doFileOpen (((_String*)_HYDBW_FilePaths(curSel-2))->sData,"rb");
+            _String processorCode (thisFile);
+            fclose (thisFile);
+            processorCode = _HY_DBW_RunMe & "=1;\n" & _HY_DBW_OutputDBID & "=" & (long)dbID & ";\n" & _HY_DBW_SqlQuery & " = \"" & sqlText.Replace ("\"","\\\"",true) & "\";\n" & processorCode;
+            addToHistory = ExecuteSomeCodeAndCheck (processorCode);
+            DeleteVariable (_HY_DBW_RunMe,true);
+            DeleteVariable (_HY_DBW_OutputDBID,true);
+            DeleteVariable (_HY_DBW_SqlQuery,true);
+        }
+
+        if (addToHistory) {
+            if (sqlHistory.lLength > 100) {
+                sqlHistory.Delete (0);
+            }
+
+            sqlHistory && & sqlText;
+        }
+        ((_HYButtonBar*)GetObject(7))->EnableButton (2,sqlHistory.lLength);
+        ScanTables ();
+    }
+}
+
+//__________________________________________________________
+
+bool    _HYDBWindow::ProcessEvent (_HYEvent* e)
+{
+    _String firstArg,
+            secondArg,
+            thirdArg;
+
+    long    k,i,f;
+
+    bool    done = false;
+
+    if (e->EventClass()==_hyScrollingEvent) {
+        firstArg = e->EventCode().Cut (0,(f=e->EventCode().Find(','))-1);
+        long g = e->EventCode().Find(',',f+1);
+        if (g>=0) {
+            i = MatchComponentID (firstArg);
+            _HYTable* theTable = nil;
+            if ( i==0 || i==2 ) {
+                firstArg = e->EventCode().Cut (g+1,-1);
+                k = firstArg.toNum();
+                if (k) {
+                    theTable    = (_HYTable*) ((i==0)?GetObject(2):
+                                               GetObject(0));
+                    theTable->SetMessageRecipient (nil);
+                    theTable->ProcessEvent (generateScrollEvent (0,k));
+                } else if (i==0) {
+                    firstArg = e->EventCode().Cut (f+1,g-1);
+                    k = firstArg.toNum();
+                    if (k) {
+                        theTable    = (_HYTable*) GetObject(1);
+                        theTable->SetMessageRecipient (nil);
+                        theTable->ProcessEvent (generateScrollEvent (k,0));
+                    }
+                }
+                done = true;
+            } else if (i==1) {
+                firstArg = e->EventCode().Cut (f+1,g-1);
+                k = firstArg.toNum();
+                if (k) {
+                    theTable    = (_HYTable*)     GetObject  (0);
+                    theTable->ProcessEvent (generateScrollEvent (k,0));
+                    theTable->SetMessageRecipient (nil);
+                }
+                done = true;
+            }
+            if (theTable) {
+                theTable->SetMessageRecipient (this);
+            }
+        }
+    } else if (e->EventClass()==_hyTableResizeCEvent) {
+        firstArg = e->EventCode().Cut (0,(f=e->EventCode().Find(','))-1);
+        i = MatchComponentID (firstArg);
+        if (i==0 || i==1) {
+            firstArg = e->EventCode().Cut (f+1,-1);
+            f = firstArg.Find(',');
+            k = firstArg.Cut(f+1,-1).toNum(); // shift
+            f = firstArg.Cut(0,f-1).toNum();  // column
+            _HYTable*     table = (_HYTable*)     GetObject  (1-i);
+            table->SetColumnSpacing (f,k,true);
+            dim = MinMaxWindowDimensions ();
+            done = true;
+        }
+    } else if (e->EventClass()==_hyTableChangeSelEvent) {
+        i = MatchComponentID (e->EventCode());
+        done = true;
+
+        _HYTable* tmain = (_HYTable*)GetObject (0),
+                  * ttop  = (_HYTable*)GetObject (1),
+                    * tleft = (_HYTable*)GetObject (2);
+
+        if (i==1 || i==2) {
+            _SimpleList      tSel,
+                             tSel2;
+
+            ttop  -> GetSelection (tSel);
+            tleft -> GetSelection (tSel2);
+
+            if (tSel.lLength||tSel2.lLength) {
+                if (i==1) {
+                    tleft->ClearSelection();
+                    tmain->SetColumnSelection(tSel);
+                } else {
+                    ttop->ClearSelection();
+                    tmain->SetRowSelection(tSel2);
+                }
+            }
+        }
+    } else {
+        if (e->EventClass() == _hyTableDblClickEvent) {
+            i = MatchComponentID (e->EventCode());
+            if (i==0) {
+                done = true;
+                EditLongEntry ();
+            }
+        } else if (e->EventClass()==_hyButtonPushEvent) {
+            firstArg = e->EventCode().Cut (0,(f=e->EventCode().Find(','))-1);
+            i = MatchComponentID (firstArg);
+            if (i==7) {
+                firstArg        = e->EventCode().Cut (f+1,-1);
+                k               = firstArg.toNum();
+                switch  (k) {
+                case 0:
+                    RunSQLQuery ();
+                    break;
+                case 1:
+                case 2: {
+                    int h,v;
+
+                    _HYButtonBar * bb2 = (_HYButtonBar*)GetObject(7);
+
+                    _HYTable     * tmain = (_HYTable*)GetObject (0),
+                                   * ttop  = (_HYTable*)GetObject (1);
+
+                    bb2->GetButtonLoc(k,h,v,true);
+                    _List  menuOptions;
+
+                    if (k==1)
+                        for (f=0; f<_HYDBW_Templates.lLength; f++) {
+                            if (((_String*)(*((_List*)_HYDBW_Templates(f)))(1))->sLength) {
+                                menuOptions << (*((_List*)_HYDBW_Templates(f)))(0);
+                            } else {
+                                menuOptions << & menuSeparator;
+                            }
+                        }
+                    else
+                        for (f=0; f<sqlHistory.lLength; f++) {
+                            _String option ((long)(1+f)),
+                                    *command = (_String*)sqlHistory(f);
+
+                            option = option & ". ";
+                            i = command->Find (' ',command->FirstNonSpace(0,-1,1),-1);
+                            long f2 = command->Find ('(');
+                            if (i<0) {
+                                i = 50;
+                            }
+                            if (f2<0) {
+                                f2 = 50;
+                            }
+                            i = MIN(50,MIN(i,f2))-1;
+                            if (i<command->sLength) {
+                                option = option & command->Cut (0,i) & "...";
+                            } else {
+                                option = option & *command;
+                            }
+
+                            menuOptions && &option;
+                        }
+
+                    firstArg = HandlePullDown (menuOptions,h,v,0);
+                    bb2->_UnpushButton();
+
+                    if (firstArg.sLength) {
+                        f = menuOptions.Find (&firstArg);
+                        if (f>=0) {
+                            if (k==1) {
+                                _String command (*(_String*)(*((_List*)_HYDBW_Templates(f)))(1));
+                                if (dbID >= 0 && currentTable >= 0) {
+                                    command = command.Replace (_HY_DBW_TablePlaceholder,*(_String*)tableList(currentTable),true);
+
+                                    _SimpleList colSelection;
+
+                                    tmain->ScanRowSelection (colSelection);
+                                    if (colSelection.lLength == 1) {
+                                        colSelection.Clear();
+                                        tmain->GetSelection (colSelection);
+
+                                        _String rowSel (128L,true);
+                                        for (long i2=0; i2<colSelection.lLength; i2++) {
+                                            long i2c = colSelection.lData[i2]%tmain->horizontalSpaces.lLength,
+                                                 i2r = colSelection.lData[i2]/tmain->horizontalSpaces.lLength;
+
+                                            if (i2) {
+                                                rowSel << " AND ";
+                                            }
+                                            rowSel << (_String*)ttop->GetCellData (i2c,0);
+                                            rowSel << " = '";
+                                            rowSel << (_String*)tmain->GetCellData (i2c,i2r);
+                                            rowSel << "' ";
+                                        }
+                                        rowSel.Finalize();
+                                        command = command.Replace (_HY_DBW_RowValues,rowSel,true);
+                                        colSelection.Clear();
+                                        tmain->ScanColumnSelection (colSelection);
+                                    } else {
+                                        colSelection.Clear();
+                                        ttop->GetColumnSelection (colSelection);
+                                    }
+
+                                    if (colSelection.lLength) {
+                                        _String colNames (128L,true);
+                                        for (long i2=0; i2<colSelection.lLength; i2++) {
+                                            if (i2) {
+                                                colNames << ',';
+                                            }
+                                            colNames << (_String*)ttop->GetCellData (colSelection.lData[i2],0);
+                                        }
+                                        colNames.Finalize();
+                                        command = command.Replace (_HY_DBW_ColumnPlaceholder,colNames,true);
+                                    }
+                                }
+
+                                ((_HYTextBox*)GetObject(8))->SetText (command,true);
+                            } else {
+                                ((_HYTextBox*)GetObject(8))->SetText (*(_String*)sqlHistory(f),true);
+                            }
+                        }
+                    }
+                }
+
+                }
+                done = true;
+            }
+        } else if (e->EventClass() == _hyMenuSelChangeEvent) {
+            firstArg = e->EventCode().Cut (0,(f=e->EventCode().Find(','))-1);
+            i =  MatchComponentID (firstArg);
+            firstArg = e->EventCode().Cut (f+1,-1);
+            k = firstArg.toNum();
+            if (i == 3) {
+                LoadTable (k);
+            }
+        }
+    }
+
+    if (done) {
+        DeleteObject (e);
+        return true;
+    }
+    return _HYTWindow::ProcessEvent(e);
+}
+
+//__________________________________________________________
+
+void     ReadSQLPlugins (void)
+{
+    _String     pathToModelTemplates;
+    _List       receptacle;
+
+    pathToModelTemplates = baseDirectory&"ChartAddIns"&baseDirectory.sData[baseDirectory.sLength-1]&"DBAddIns";
+    ScanDirectoryForFileNames (pathToModelTemplates,receptacle,false);
+
+    for (long k=0; k<receptacle.lLength; k++) {
+        FILE * thisFile = doFileOpen (((_String*)receptacle(k))->sData,"rb");
+        if (thisFile) {
+            _String buffer (thisFile);
+            fclose (thisFile);
+            if (buffer.sLength) {
+                _ExecutionList ex (buffer);
+                long f = ex.ExecuteAndClean (batchLanguageFunctionNames.lLength,&_HY_DBW_OutputProcessorFunction);
+
+                if ((((_String*)receptacle(k)))->endswith(_HY_DBW_TemplateFileName)) {
+                    _Variable * opList = CheckReceptacle (&_HY_DBW_TemplateFileName,empty,false);
+                    if (opList && opList->ObjectClass () == ASSOCIATIVE_LIST) {
+                        _AssociativeList * aList = (_AssociativeList*)opList->GetValue ();
+                        _List * meKeys = aList->GetKeys ();
+
+                        for (long k=0; k<meKeys->lLength; k++) {
+                            _String*  aKey   = (_String*)(*meKeys)(k);
+                            _PMathObj aValue = aList->GetByKey (*aKey,STRING);
+                            if (aValue) {
+                                _List * aPair = new _List;
+                                checkPointer (aPair);
+                                (*aPair) << aKey;
+                                (*aPair) << ((_FString*)aValue)->theString;
+                                _HYDBW_Templates << aPair;
+                            }
+                        }
+
+                    }
+                } else {
+                    _Variable * postProcName = CheckReceptacle (&_HY_DBW_OutputProcessorName,empty,false);
+                    if (f >= 0 && postProcName && postProcName->ObjectClass () == STRING) {
+                        _HYDBW_FilePaths << receptacle (k);
+                        _HYDBW_OutputProcessors << ((_FString*)postProcName->GetValue())->theString;
+                    }
+                    DeleteVariable (_HY_DBW_OutputProcessorName,true);
+                }
+
+            }
+        }
+    }
+}
+
+
+// EOF
\ No newline at end of file
diff --git a/src/gui/HYDataPanel.cpp b/src/gui/HYDataPanel.cpp
new file mode 100644
index 0000000..53640be
--- /dev/null
+++ b/src/gui/HYDataPanel.cpp
@@ -0,0 +1,9218 @@
+/*
+ 
+ HyPhy - Hypothesis Testing Using Phylogenies.
+ 
+ Copyright (C) 1997-now
+ Core Developers:
+ Sergei L Kosakovsky Pond (spond at ucsd.edu)
+ Art FY Poon    (apoon at cfenet.ubc.ca)
+ Steven Weaver (sweaver at ucsd.edu)
+ 
+ Module Developers:
+ Lance Hepler (nlhepler at gmail.com)
+ Martin Smith (martin.audacis at gmail.com)
+ 
+ Significant contributions from:
+ Spencer V Muse (muse at stat.ncsu.edu)
+ Simon DW Frost (sdf22 at cam.ac.uk)
+ 
+ Permission is hereby granted, free of charge, to any person obtaining a
+ copy of this software and associated documentation files (the
+ "Software"), to deal in the Software without restriction, including
+ without limitation the rights to use, copy, modify, merge, publish,
+ distribute, sublicense, and/or sell copies of the Software, and to
+ permit persons to whom the Software is furnished to do so, subject to
+ the following conditions:
+ 
+ The above copyright notice and this permission notice shall be included
+ in all copies or substantial portions of the Software.
+ 
+ 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.
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ 
+ */
+
+/*
+    Data Panel Window
+
+    Sergei L. Kosakovsky Pond, Basic version August-December 2000.
+
+    Revisions (many not listed)
+                  August 2001 - Removed horizontal scroll bar.
+                  March  2002 - Replaced a list with a table
+                  April  2006 - Added user plug-ins
+*/
+
+
+#include "HYDataPanel.h"
+#include "HYSharedMain.h"
+#include "HYUtils.h"
+#include "batchlan.h"
+#include "HYDialogs.h"
+#include "HYChartWindow.h"
+#include "math.h"
+#include "HYParameterTable.h"
+#include "HYTreePanel.h"
+#include "HYButtonBar.h"
+#include "HYTableComponent.h"
+#include "HYEventTypes.h"
+
+#ifdef    __HYPHYDMALLOC__
+#include "dmalloc.h"
+#endif
+
+extern  _HYColor navFill,
+        navSelect,
+        black;
+
+extern  _List    dataSetList,
+        dataSetNamesList,
+        dataSetFilterNamesList,
+        dataSetFilterList,
+        modelNames,
+        theModelList,
+        likeFuncNamesList,
+        likeFuncList;
+
+extern  _SimpleList
+windowObjects,
+modelMatrixIndices,
+modelFrequenciesIndices;
+
+
+_HYColor nucDefaults[5] = {{187,45,63},{40,148,109},{0x80,0x37,0x90},{210,135,0},{180,120,0}},
+
+aaDefaults[20] = {{102,51,51},{153,204,153},{102,0,153},{153,0,153},
+    {255,51,51},{102,0,153},{255,204,0},{153,255,153},
+    {102,153,51},{102,204,102},{0,51,153},{255,102,0},
+    {153,153,51},{255,153,0},{153,51,102},{153,153,153},
+    {102,102,153},{153,51,51},{204,51,51},{102,153,102}
+},
+dataColors[HY_DATAPANEL_DEF_COLORS]= {
+    {220,100,3}, // Red
+    {0,0,212},   // Blue
+    {0,100,18},  // Dark Green
+    {87,43,5},   // Brown
+    {255,234,23},// Lemon
+    {107,23,176},// Violet
+    {255,100,2}, // Orange
+    {2,170,234}, // Light Blue
+    {41,25,16},  // Sepia
+    {242,8,133}
+},// Pink
+thermFill   = {245,245,245},
+labelFColor = {254,242,208},
+labelBColor = {102,90,88},
+_hyWhiteColor =  {255,255,255};
+
+_String  nucDataType         ("Nucleotide"),
+         dinucDataType          ("Di-Nucl."),
+         codonDataType          ("Codon"),
+         proteinDataType    ("Protein"),
+         binaryDataType         ("Binary"),
+         disequonDataType   ("Disequon"),
+         unknownDataType    ("Unknown"),
+         none               ("None"),
+         makeNewTree        ("Create New Tree..."),
+         readTreeFile       ("Read Tree From File..."),
+         inferTreeStr       ("Infer Tree"),
+         useTreeModels          ("Use Tree Models"),
+         overlapWarning         ("Neither overlaps more than 4 deep, nor any overlaps with more than 255 partitions are allowed."),
+         contextString1     ("Nucelotide Frequencies"),
+         contextString1_5   ("Binary Frequencies"),
+         contextString2     ("Aminoacid Frequencies"),
+         contextString3     ("Codon Frequencies"),
+         contextString4     ("Select all sites like this one"),
+         contextString5     ("Show differences from consensus"),
+         contextString6     ("Show proportions of rate classes"),
+         contextString7     ("Select all sites in class rate "),
+         contextString8         ("Show differences from reference"),
+         contextString9         ("Clean up singletons"),
+         contextString10    ("Copy consensus to clipboard"),
+         contextString11    ("Spawn a new data panel with selected sequences"),
+         contextString12    ("Filter selected sequences by ambiguity content"),
+         contextString13    ("Copy selected sites to clipboard as partition string"),
+         contextString14    ("Sort on character in this column"),
+         contextString15     ("Change highlight color"),
+         contextString16     ("Select chosen sequences in a tree"),
+         contextString17     ("Copy selected Amino Acid sites to clipboard as CODON partition string"),
+         lfKillWarning      ("This operation will invalidate the likelihood function attached to current dataset. You will need to rebuild the likelihood function for further analyses."),
+         lfCantKillWarning   ("Can't proceed with the operation, because the likelihood function is being used in another task."),
+         seqOmitWarning     ("You are about to remove all selected species from analyses. To restore them later, choose an appropriate item in the \"Data\" menu."),
+         cantOmitWarning    ("There must be at least two sequences remaining for meaningful analyses."),
+         statusConsensus    ("Consensus"),
+         statusGamma        ("Rate Class"),
+         statusTranslate    ("Translated"),
+         consensusInfoString ("Consensus"),
+         rateClassInfoString ("Rate Class"),
+         translatedInfoString("Translated"),
+         enterPartitionString("Enter a HYPHY partition specification string"),
+         useOneBasedIndices     ("Indexing begins at 1 (default = 0)"),
+         invalidPartString      ("I didn't understand the partition specification string."),
+         saveDSPrompt         ("This data set only exists in memory. I must must write it to disk before any partitioning info can be saved."),
+         modelName                ("Model_Name"),
+         modelOptions         ("Model_Options"),
+         modelDimension       ("Model_Dimension"),
+         modelMatrixDimension  ("ModelMatrixDimension"),
+         modelFunction        ("GUIPopulateModelMatrix"),
+         efvFunction          ("EFVEstimated"),
+         buildCodonFrequencies ("GUIBuildCodonFrequencies"),
+         selectionStatPrefix   (" Current Selection:"),
+         multiplyByFrequencies ("MULTIPLY_BY_FREQS"),
+         savedLFMatrix            ("LF_CACHE_MATRIX"),
+         globalPrefix         ("globalVariable"),
+         categoryPrefix           ("categoryVariable"),
+         modelEFVVector           ("Model_EFV_Vector"),
+         dataPartitionIDString ("Data_Partition_ID"),
+         dataSetIDString      ("Data_Set_ID"),
+         userModelEFV         ("GUIHandleFrequenciesCollection"),
+         copySeqsToClip           ("Copy Selected Sequences to Clipboard"),
+         parameterOption[3] =  {"Local",
+                                "Global",
+                                "Rate Het."
+                               },
+
+                               freqOption[5]       =  {"Partition",
+                                       "Dataset",
+                                       "Equal",
+                                       "Estimate",
+                                       "Model Spec."
+                                                      },
+
+                                       nullSuffix          (" [null]"),
+                                       alterSuffix     (" [alternative]"),
+                                       inferenceDSID       ("INFERENCE_DATA_SET"),
+                                       inferenceDWID       ("INFERENCE_DATA_WINDOW"),
+                                       inferenceNofSeqs    ("_NUMBER_OF_SEQUENCES"),
+                                       inferenceDummyTree ("_Internal_Inferred_Tree"),
+                                       inferenceDummyLF    ("_INTERNAL_HYPHY_DUMMY_LF_"),
+                                       datapanelProcDF ("_DATAPANEL_DATAFILTER_"),
+                                       datapanelProcVS ("_DATAPANEL_SELECTED_SEQUENCES_"),
+                                       datapanelProcHS ("_DATAPANEL_SELECTED_SITES_"),
+                                       datapanelProcGC ("_DATAPANEL_GENETIC_CODE_"),
+                                       datapanelProcUS ("_DATAPANEL_UNIT_SIZE_"),
+                                       datapanelProcEX ("_DATAPANEL_EXCLUSIONS_"),
+                                       datapanelProcSF ("_DATAPANEL_SELECTED_FILTERS_"),
+                                       datapanelProcRF ("_DATAPANEL_RETURNED_FILTERS_"),
+                                       datapanelProcDS ("_DATAPANEL_DATASET_NAME_"),
+                                       dataPanelSearchTerm,
+                                       dpsandString1,
+                                       dpsandString2;
+
+extern   _String dataFilePrintFormat,
+         aminoAcidOneCharCodes,
+         donotWarnAgain,
+         baseDirectory,
+         dataPanelSourcePath,
+         dialogPrompt,
+         likefuncOutput,
+         modelGenCode,
+         blMolClock,
+         blReplicate,
+         useNexusFileData,
+         noInternalLabels,
+         VerbosityLevelString;
+
+
+extern  _TranslationTable      defaultTranslationTable;
+
+bool     warnOmit           = false,
+         warnKillLF      = false,
+         autoPopLFTable     = true,
+         regExpSearch     = false,
+         useOneBased       = false;
+
+bool     HandlePreferences (_List&, _String, bool);
+_String  WriteFileDialogInput (void);
+
+_List    dfFilterFormats,
+         geneticCodes,
+         modelTemplates,
+         dataPanelProcessors;
+
+extern   long  likeFuncEvalCallCount;
+
+#define  LN_2               0.693147180559945309417232
+#define  DF_COLOR_COLUMN    0
+#define  DF_ID_COLUMN       1
+#define  DF_TYPE_COLUMN     2
+#define  DF_TREE_COLUMN     3
+#define  DF_MODEL_COLUMN    4
+#define  DF_MDL_OPT_COLUMN  5
+#define  DF_MDL_EFV_COLUMN  6
+#define  DF_MDL_CLS_COLUMN  7
+
+#define  DF_COLUMN_COUNT    8
+
+long     findPanelSelection = 0;
+//__________________________________________________________
+
+void    allocate_fexact_keys (long,long);
+void    free_fexact_keys     (void);
+
+//__________________________________________________________
+_HYDataPanel::_HYDataPanel(_String& title,_String& argument):_HYTWindow (_String ("DataSet ")&title)
+{
+    dataWrapper         = nil;
+    tainted             = false;
+    addedLines          = 0;
+
+    referenceSequence   = translatedSequence
+                          = 0;
+
+    genCodeID           = -1;
+    lfID                = -1;
+    cantDeleteLF        = false;
+
+    flags              |= HY_WINDOW_STATUS_BAR_LIGHT_LEFT;
+
+    _HYRect         canvasSettings = {50,50,50,200,HY_COMPONENT_V_SCROLL|HY_COMPONENT_BORDER_T|HY_COMPONENT_BORDER_B};
+
+    _HYSequencePane*sp   = new _HYSequencePane (canvasSettings,GetOSWindowData(),50,200);
+    canvasSettings.top   = canvasSettings.bottom = 30;
+    canvasSettings.width = HY_COMPONENT_NO_SCROLL;
+    _HYStretchCanvas*sc  = new _HYStretchCanvas (canvasSettings,GetOSWindowData(),50,200,32,HY_SCANVAS_HORIZONTAL);
+
+    canvasSettings.top   = canvasSettings.bottom = 100;
+    canvasSettings.left  = 700;
+    canvasSettings.right = 10000;
+    canvasSettings.width = HY_COMPONENT_V_SCROLL;
+
+    _HYTable* partList    = new _HYTable (canvasSettings, GetOSWindowData(), 1, DF_COLUMN_COUNT, 70, 100, HY_TABLE_STATIC_TEXT|HY_TABLE_CANTSELECT);
+    checkPointer (partList);
+
+    partList->selectionType = HY_TABLE_SEL_ROWS|HY_TABLE_DONT_SIZE|HY_TABLE_NODRAG_SELECTION|HY_TABLE_DONT_GROW_VERT;
+    canvasSettings.top   = canvasSettings.bottom = 20;
+    canvasSettings.width = HY_COMPONENT_NO_SCROLL|HY_COMPONENT_BORDER_T;
+
+    _String toolTipText;
+
+    _HYTable* partHead    = new _HYTable (canvasSettings, GetOSWindowData(), 1, DF_COLUMN_COUNT, 80, 20, HY_TABLE_STATIC_TEXT|HY_TABLE_BEVELED|HY_TABLE_BOLD);
+    checkPointer (partHead);
+    partHead->selectionType = HY_TABLE_SEL_ROWS|HY_TABLE_NODRAG_SELECTION;
+    _SimpleList clrIcon;
+
+    clrIcon << (long)ProcureIconResource (HY_DATAPANEL_ICON_ID+12);
+    clrIcon << 15;
+    clrIcon << 15;
+
+    partHead->SetCellData (&clrIcon,0,DF_COLOR_COLUMN,HY_TABLE_ICON|HY_TABLE_BEVELED|HY_TABLE_CANTSELECT,true);
+    toolTipText = "Partition Name";
+    partHead->SetCellData (&toolTipText,0,DF_ID_COLUMN,HY_TABLE_STATIC_TEXT|HY_TABLE_BEVELED|HY_TABLE_BOLD|HY_TABLE_CANTSELECT,true);
+    toolTipText = "Partition Type";
+    partHead->SetCellData (&toolTipText,0,DF_TYPE_COLUMN,HY_TABLE_STATIC_TEXT|HY_TABLE_BEVELED|HY_TABLE_BOLD|HY_TABLE_CANTSELECT,true);
+    toolTipText = "Tree Topology";
+    partHead->SetCellData (&toolTipText,0,DF_TREE_COLUMN,HY_TABLE_STATIC_TEXT|HY_TABLE_BEVELED|HY_TABLE_BOLD|HY_TABLE_CANTSELECT|HY_TABLE_PULLDOWN,true);
+    toolTipText = "Substitution Model";
+    partHead->SetCellData (&toolTipText,0,DF_MODEL_COLUMN,HY_TABLE_STATIC_TEXT|HY_TABLE_BEVELED|HY_TABLE_BOLD|HY_TABLE_CANTSELECT|HY_TABLE_PULLDOWN,true);
+    toolTipText = "Parameters";
+    partHead->SetCellData (&toolTipText,0,DF_MDL_OPT_COLUMN,HY_TABLE_STATIC_TEXT|HY_TABLE_BEVELED|HY_TABLE_BOLD|HY_TABLE_CANTSELECT|HY_TABLE_PULLDOWN,true);
+    toolTipText = "Equilibrium Freqs.";
+    partHead->SetCellData (&toolTipText,0,DF_MDL_EFV_COLUMN,HY_TABLE_STATIC_TEXT|HY_TABLE_BEVELED|HY_TABLE_BOLD|HY_TABLE_CANTSELECT|HY_TABLE_PULLDOWN,true);
+    toolTipText = "Rate Classes";
+    partHead->SetCellData (&toolTipText,0,DF_MDL_CLS_COLUMN,HY_TABLE_STATIC_TEXT|HY_TABLE_BEVELED|HY_TABLE_BOLD|HY_TABLE_CANTSELECT,true);
+
+
+    _HYFont         tableFont;
+
+#ifdef __MAC__
+    tableFont.face = "Times";
+#else
+    tableFont.face = "MS Sans Serif";
+#endif
+    tableFont.size = 12;
+    tableFont.style = HY_FONT_PLAIN;
+
+    partHead->SetFont (tableFont);
+    partHead->AutoFitWidth ();
+    partList->SetFont (tableFont);
+    partList->AutoFitWidth (*partHead);
+    partHead->SetColumnSpacing (DF_MDL_CLS_COLUMN,5000,false);
+    partList->SetColumnSpacing (DF_MDL_CLS_COLUMN,5000,false);
+
+    canvasSettings.top   = canvasSettings.bottom = 119;
+    canvasSettings.left  = canvasSettings.right = 50;
+    canvasSettings.width = HY_COMPONENT_BORDER_R|HY_COMPONENT_BORDER_T;
+
+    _HYButtonBar*   b1 = new _HYButtonBar(canvasSettings,GetOSWindowData());
+
+    canvasSettings.top   = canvasSettings.bottom=7;
+    canvasSettings.left  = 50;
+    canvasSettings.right = 200;
+    canvasSettings.width = HY_COMPONENT_NO_SCROLL;
+    _HYStretchCanvas*marks = new _HYStretchCanvas (canvasSettings,GetOSWindowData(),5,200,32,HY_SCANVAS_HORIZONTAL);
+
+    canvasSettings.left = canvasSettings.top = canvasSettings.bottom = 14;
+    canvasSettings.width = HY_COMPONENT_BORDER_B;
+
+
+    _HYSequencePane*sp2 = new _HYSequencePane (canvasSettings,GetOSWindowData(),14,200);
+    sp2->SetActiveOrPassive (false);
+    sp2->SetNumberDisplay   (false);
+
+    sc->SetMessageRecipient (this);
+    sp->SetMessageRecipient (this);
+    b1->SetMessageRecipient (this);
+    sp2->SetMessageRecipient(this);
+    partList->SetMessageRecipient(this);
+    partHead->SetMessageRecipient(this);
+    toolTipText = ("Cut partition in 2");
+    b1->AddButton (ProcureIconResource(HY_DATAPANEL_ICON_ID),&toolTipText);
+    toolTipText = "Join 2 Partitions";
+    b1->AddButton (ProcureIconResource(HY_DATAPANEL_ICON_ID+1),&toolTipText);
+    toolTipText = "Subtract 2 Overlapping Partitions";
+    b1->AddButton (ProcureIconResource(HY_DATAPANEL_ICON_ID+2),&toolTipText);
+    toolTipText = "Delete Partition";
+    b1->AddButton (ProcureIconResource(HY_DATAPANEL_ICON_ID+3),&toolTipText);
+    toolTipText = "Comb Selection/Partition";
+    b1->AddButton (ProcureIconResource(HY_DATAPANEL_ICON_ID+4),&toolTipText);
+    toolTipText = "Save Partition to Disk";
+    b1->AddButton (ProcureIconResource(HY_DATAPANEL_ICON_ID+5),&toolTipText);
+    toolTipText = "Interleave Disjoint Nucleotide Partitions";
+    b1->AddButton (ProcureIconResource(HY_DATAPANEL_ICON_ID+6),&toolTipText);
+    toolTipText = "Data Operations";
+    b1->AddButton (ProcureIconResource(HY_DATAPANEL_ICON_ID+11),&toolTipText);
+    toolTipText = "Display Table of Parameter Values";
+    b1->AddButton (ProcureIconResource(HY_DATAPANEL_ICON_ID+10),&toolTipText);
+    toolTipText = "Toggle Coloring Mode";
+    b1->AddButton (ProcureIconResource(HY_DATAPANEL_ICON_ID+13),&toolTipText);
+
+    b1->EnableButton(0,false);
+    b1->EnableButton(1,false);
+    b1->EnableButton(2,false);
+    b1->EnableButton(3,false);
+    b1->EnableButton(4,false);
+    b1->EnableButton(5,false);
+    b1->EnableButton(6,false);
+    b1->EnableButton(7,false);
+    b1->EnableButton(8,false);
+    b1->MarkAsPullDown (2,true);
+    b1->MarkAsPullDown (6,true);
+    b1->MarkAsPullDown (7,true);
+    b1->SetButtonDim(16);
+    b1->SetButtonLayoutW (2);
+    b1->SetBackColor(labelBColor);
+
+
+    marks->SetMessageRecipient (this);
+    AddObject (sp);      // 0
+    AddObject (sc);      // 1
+    AddObject (b1);      // 2
+    AddObject (marks);   // 3
+    AddObject (sp2);     // 4
+    AddObject (partList);// 5
+    AddObject (partHead);// 6
+
+    SetTableDimensions (5,2);
+    SetCell (0,0,sc);
+    SetCell (0,1,sc);
+    SetCell (1,0,marks);
+    SetCell (1,1,marks);
+    SetCell (2,0,sp);
+    SetCell (2,1,sp);
+    SetCell (3,0,b1);
+    SetCell (3,1,partHead);
+    SetCell (4,0,b1);
+    SetCell (4,1,partList);
+
+
+    DeleteObject (sc);
+    DeleteObject (sp);
+    DeleteObject (b1);
+    DeleteObject (marks);
+    DeleteObject (sp2);
+    DeleteObject (partList);
+    DeleteObject (partHead);
+
+    if (dataPanelProcessors.lLength==0) {
+        ReadDataPanelProcessors ();
+    }
+
+    SetDataSetReference(argument);
+}
+
+//__________________________________________________________
+_HYDataPanel::~_HYDataPanel()
+{
+    if (lfID>=0) {
+        PurgeLF(false);
+    }
+
+    if (dataWrapper) {
+        DeleteObject (dataWrapper);
+    }
+}
+
+//__________________________________________________________
+void    _HYDataPanel::GenerateStatusLine (void)
+{
+    _String  statBar ("Custom Character Data. ");
+    if (dataType&HY_DATAPANEL_NUCDATA) {
+        statBar = "Nucleotide Data. ";
+    } else if (dataType&HY_DATAPANEL_PROTDATA) {
+        statBar = "Aminoacid Data. ";
+    } else if (dataType&HY_DATAPANEL_BINARYDATA) {
+        statBar = "Binary Data. ";
+    }
+
+    if (!dataWrapper) {
+        _DataSet *theDS = (_DataSet*)dataSetList(dataSetID);
+        statBar = statBar & _String (theDS->NoOfColumns()) &" sites ("&_String (theDS->NoOfUniqueColumns())&" distinct patterns), "&
+                  _String(theDS->NoOfSpecies())& " species.";
+    } else
+        statBar = statBar & _String (dataWrapper->GetFullLengthSpecies()) &" sites ("&_String (dataWrapper->NumberDistinctSites())&" distinct patterns), "&
+                  _String(dataWrapper->NumberSpecies())& " species.";
+    statBar = statBar & selectionStatPrefix & "empty";
+    SetStatusBar(statBar);
+}
+//__________________________________________________________
+
+bool    _HYDataPanel::ProcessGEvent (_HYEvent* e)
+{
+    _String firstArg,
+            secondArg;
+    long    k,f;
+
+    bool    done = false;
+
+    if (e->EventClass()==_hyGlobalLFKillEvent) {
+        firstArg = e->EventCode().Cut (0,(f=e->EventCode().Find(','))-1);
+        k = firstArg.toNum();
+        if (k!=GetID()) {
+            firstArg        = e->EventCode().Cut (f+1,-1);
+            if (lfID==firstArg.toNum()) {
+                lfID = -1;
+                _PaintLFStatus();
+            }
+        }
+        done = true;
+    } else if (e->EventClass()==_hyGlobalDFKillEvent) {
+        if (lfID>=0) {
+            firstArg = e->EventCode().Cut ((f=e->EventCode().Find(','))+1,-1);
+            k = firstArg.toNum();
+            if (((_LikelihoodFunction*)likeFuncList(lfID))->DependOnDF(k)) {
+                postLFKillEvent (-1,lfID);
+                KillLFRecord(lfID);
+                lfID = -1;
+            }
+        }
+        done = true;
+    } else if (e->EventClass()==_hyGlobalTreeKillEvent) {
+        firstArg = e->EventCode().Cut ((f=e->EventCode().Find(','))+1,-1);
+        k = firstArg.toNum();
+        if ((f = treeVarReferences.Find(k))>=0) {
+            treeVarReferences.lData[f] = -1;
+            _List mOptions;
+            GenerateModelList (mOptions,f);
+            RefreshPartRow(mOptions,f,true);
+        }
+        done = true;
+    } else if (e->EventClass()==_hyGlobalDSKillEvent) {
+        firstArg = e->EventCode().Cut ((f=e->EventCode().Find(','))+1,-1);
+        k = firstArg.toNum();
+        if (dataSetID==k) {
+            tainted = false;
+            postWindowCloseEvent (GetID());
+        }
+        done = true;
+    }
+    if (done) {
+        return true;
+    }
+    return _HYWindow::ProcessGEvent (e);
+}
+//__________________________________________________________
+
+void    _HYDataPanel::RefreshPartRow (_List& modelList, long r, bool doTree, bool doNonTree)
+{
+    _HYTable*   pl = (_HYTable*)GetObject (5);
+    _SimpleList changedCells;
+    long        baseIndex = r*pl->horizontalSpaces.lLength,
+                selected = (pl->cellTypes[r*pl->horizontalSpaces.lLength] & HY_TABLE_SELECTED)?HY_TABLE_SELECTED:0,
+                color    = ((_SimpleList*)pl->GetCellData (DF_COLOR_COLUMN,r))->lData[0];
+
+
+    if (doNonTree) {
+        int         model,
+                    params,
+                    freqs,
+                    rates;
+
+        LongToModelData (modelReferences.lData[r],model,params,freqs,rates);
+
+        _String *   rightModel  = (_String*)modelList(model),
+                    *   rightParams = &empty,
+                        *   rightFreqs  = &empty,
+                            rightRates,
+
+                            *   presModel   = (_String*) pl->GetCellData (DF_MODEL_COLUMN,r),
+                                *   presParams  = (_String*) pl->GetCellData (DF_MDL_OPT_COLUMN,r),
+                                    *   presFreqs   = (_String*) pl->GetCellData (DF_MDL_EFV_COLUMN,r),
+                                        *   presRates   = (_String*) pl->GetCellData (DF_MDL_CLS_COLUMN,r);
+
+        if (model) {
+            rightParams = &parameterOption[params];
+            rightFreqs  = &freqOption[freqs];
+
+            if (rates) {
+                rightRates = _String((long)rates);
+            }
+        }
+
+        if (!presModel->Equal(rightModel)) {
+            changedCells << baseIndex+DF_MODEL_COLUMN;
+            pl->SetCellData (rightModel,r,DF_MODEL_COLUMN,selected|HY_TABLE_STATIC_TEXT|HY_TABLE_PULLDOWN,true);
+        }
+        if (!presParams->Equal(rightParams)) {
+            changedCells << baseIndex+DF_MDL_OPT_COLUMN;
+            if (rightParams->sLength) {
+                pl->SetCellData (rightParams,r,DF_MDL_OPT_COLUMN,selected|HY_TABLE_STATIC_TEXT|HY_TABLE_PULLDOWN,true);
+            } else {
+                pl->SetCellData (rightParams,r,DF_MDL_OPT_COLUMN,selected|HY_TABLE_STATIC_TEXT,true);
+            }
+        }
+        if (!presFreqs->Equal(rightFreqs)) {
+            changedCells << baseIndex+DF_MDL_EFV_COLUMN;
+            if (rightFreqs->sLength) {
+                pl->SetCellData (rightFreqs,r,DF_MDL_EFV_COLUMN,selected|HY_TABLE_STATIC_TEXT|HY_TABLE_PULLDOWN,true);
+            } else {
+                pl->SetCellData (rightFreqs,r,DF_MDL_EFV_COLUMN,selected|HY_TABLE_STATIC_TEXT,true);
+            }
+
+        }
+        if (!presRates->Equal(&rightRates)) {
+            changedCells << baseIndex+DF_MDL_CLS_COLUMN;
+            if (rightRates.sLength) {
+                pl->SetCellData (&rightRates,r,DF_MDL_CLS_COLUMN,selected|HY_TABLE_EDIT_TEXT,true);
+            } else {
+                pl->SetCellData (&rightRates,r,DF_MDL_CLS_COLUMN,selected|HY_TABLE_STATIC_TEXT,true);
+            }
+        }
+        if (color != partitionColors.lData[r]) {
+            ((_SimpleList*)pl->GetCellData (DF_COLOR_COLUMN,r))->lData[0] = partitionColors.lData[r];
+            changedCells << baseIndex+DF_COLOR_COLUMN;
+        }
+    }
+
+    if (doTree) {
+        _String *   rightTree   = &none,
+                    * presTree    = (_String*) pl->GetCellData (DF_TREE_COLUMN,r);
+
+        if (treeVarReferences.lData[r]>=0) {
+            rightTree = LocateVar(treeVarReferences.lData[r])->GetName();
+        }
+
+        if (!presTree->Equal(rightTree)) {
+            changedCells << baseIndex+DF_TREE_COLUMN;
+            pl->SetCellData (rightTree,r,DF_TREE_COLUMN,selected|HY_TABLE_STATIC_TEXT|HY_TABLE_PULLDOWN,true);
+        }
+    }
+
+    if (changedCells.lLength) {
+        pl->_MarkRowForUpdate (r);
+    }
+}
+
+//__________________________________________________________
+
+void  _HYDataPanel::HandleSearchAndReplace (void)
+{
+    _String p1 ("Search for reg.exp.:"),
+            p2 ("Replace with string:");
+
+    if (EnterString2Dialog (dpsandString1, dpsandString2, p1, p2, (Ptr)this)) {
+        int errNo = 0;
+        Ptr regex = PrepRegExp (&dpsandString1, errNo, true);
+
+        if (!regex) {
+            WarnError (GetRegExpError (errNo));
+        }
+
+        _HYSequencePane* sp = (_HYSequencePane*)components (0);
+
+        _List   oldNames (sp->rowHeaders),
+                newNames;
+
+        bool    doSomething = false;
+
+        for (long k=0; k<oldNames.lLength; k++) {
+            _SimpleList matches;
+            _String * theString = (_String*)oldNames(k);
+            theString->RegExpMatchAll(regex, matches);
+            if (matches.lLength) {
+                _String * newString = new _String (theString->sLength+1,true);
+                checkPointer (newString);
+
+                long      idx  = matches.lData[0],
+                          midx = 0;
+
+                for (long k2=0; k2<theString->sLength;) {
+                    if (k2==idx) {
+                        (*newString) << dpsandString2;
+                        k2 = matches.lData[midx+1]+1;
+                        midx += 2;
+                        if (midx == matches.lLength) {
+                            idx = -1;
+                        } else {
+                            idx = matches.lData[midx];
+                        }
+                    } else {
+                        (*newString) << theString->sData[k2++];
+                    }
+                }
+                newString->Finalize();
+                newNames << newString;
+                DeleteObject (newString);
+                doSomething = true;
+            } else {
+                newNames && theString;
+            }
+        }
+
+        FlushRegExp (regex);
+        if (doSomething) {
+            sp->BatchRenameSequences (oldNames, newNames);
+        }
+    }
+}
+
+//__________________________________________________________
+
+bool    _HYDataPanel::ProcessEvent (_HYEvent* e)
+{
+    long        f,i,k,p;
+    _String     firstArg;
+    bool        done = false;
+    _HYTable*   pl = (_HYTable*)GetObject (5);
+
+    if (e->EventClass()==_hyMenuSelChangeEvent) {
+        firstArg = e->EventCode().Cut (0,(f=e->EventCode().Find(','))-1);
+        k = firstArg.toNum();
+        for (i=0; i<components.lLength; i++) {
+            if (((_HYGuiObject*)components(i))->MatchID(k)) {
+                break;
+            }
+        }
+        firstArg = e->EventCode().Cut (f+1,-1);
+        k = firstArg.toNum();
+        if (i==0)
+            // selection change in the sequence pane
+        {
+            UpdateSelDepPartitionOperations();
+            _UpdateSelectionChoices(IsSelectionNonEmpty());
+        }
+        tainted = true;
+        done = true;
+    } else {
+        if (e->EventClass()==_hyRebuildSCanvasEvent) {
+            k = e->EventCode().toNum();
+            for (i=0; i<components.lLength; i++) {
+                if (((_HYGuiObject*)components(i))->MatchID(k)) {
+                    break;
+                }
+            }
+            if (i==1) {
+                BuildThermometer();
+            } else {
+                BuildMarksPane();
+            }
+            done = true;
+        } else if (e->EventClass()==_hyScrollingEvent) {
+            _HYSequencePane* sp = (_HYSequencePane*)components (0),
+                             * sp2= (_HYSequencePane*)components (4);
+
+            if (addedLines)
+                if (sp2->startColumn!=sp->startColumn) {
+                    sp2->HScrollPane (sp->startColumn-sp2->startColumn);
+                }
+            BuildMarksPane();
+            _PaintThermRect(true);
+            done = true;
+        } else if (e->EventClass()==_hyTableChangeSelEvent) {
+            UpdatePartitionOperations();
+            done = true;
+        } else {
+            if (e->EventClass()==_hyButtonPushEvent) {
+                tainted = true;
+                firstArg = e->EventCode().Cut (0,(f=e->EventCode().Find(','))-1);
+                _HYSequencePane* sp = (_HYSequencePane*)GetObject(0);
+                k = firstArg.toNum();
+                for (i=0; i<components.lLength; i++) {
+                    if (((_HYGuiObject*)components(i))->MatchID(k)) {
+                        break;
+                    }
+                }
+                firstArg = e->EventCode().Cut (f+1,-1);
+                k = firstArg.toNum();
+                if (i==2) { // button bar
+                    _HYButtonBar*   bb  = (_HYButtonBar*)GetObject (2);
+                    _SimpleList     sel;
+
+                    pl->GetRowSelection (sel);
+
+                    int h,v;
+
+                    bb->GetButtonLoc(k,h,v,true);
+
+                    switch (k) {
+                    case 0: { // split button
+                        SplitPartition(sel.lData[0],sp->selection.lData[0]);
+                        break;
+                    }
+                    case 1: { // join button
+                        if (sel.lLength>=2) {
+                            h = sel.lData[0];
+                            for (long pi=1; pi<sel.lLength; pi++) {
+                                JoinPartitions(h,sel.lData[pi]-(pi-1));
+                            }
+                        } else {
+                            JoinSpeciesDisplay ();
+                        }
+                        break;
+                    }
+                    case 2: { //
+                        if (sel.lLength>=2) {
+                            int i=sel.lData[0],
+                                j=sel.lData[1];
+
+                            _String * p1 = (_String*)pl->GetCellData(DF_ID_COLUMN,i),
+                                      * p2 = (_String*)pl->GetCellData(DF_ID_COLUMN,j);
+
+                            firstArg = *p1 & '=' & *p1 & '-' &*p2;
+                            _List  menuOptions;
+                            menuOptions && & firstArg;
+                            firstArg = *p2 & '=' & *p2 & '-' &*p1;
+                            menuOptions && & firstArg;
+                            firstArg = HandlePullDown (menuOptions,h,v,0);
+                            bb->_UnpushButton();
+                            if (firstArg.sLength) {
+                                if (firstArg.beginswith(*p1&'=')) {
+                                    SubtractPartitions (i,j);
+                                } else {
+                                    SubtractPartitions (j,i);
+                                }
+                            }
+                        }
+                        break;
+                    }
+                    case 3: { // kill button
+                        if (sel.lLength)
+                            for (long k=sel.lLength-1; k>=0; k--) {
+                                KillPartition(sel.lData[k]);
+                            }
+                        else {
+                            OmitSelectedSpecies();
+                        }
+                        break;
+                    }
+
+                    case 4: { // comb button
+                        CombPartition((sel.lLength)?sel.lData[0]:-1);
+                        break;
+                    }
+
+                    case 5: { // save file
+                        SavePartition(sel.lData[0]);
+                        break;
+                    }
+                    case 6: { // interleave
+                        if (sel.lLength==2) {
+                            int i=sel.lData[0],
+                                j=sel.lData[1];
+
+                            _String * p1 = (_String*)pl->GetCellData(DF_ID_COLUMN,i),
+                                      * p2 = (_String*)pl->GetCellData(DF_ID_COLUMN,j);
+
+                            firstArg = *p1 & '&' & *p2;
+                            _List  menuOptions;
+                            menuOptions && & firstArg;
+                            firstArg = *p1 & '&' & *p2 & "[Reverse]";
+                            menuOptions && & firstArg;
+                            firstArg = *p1 & "[Reverse]&" & *p2;
+                            menuOptions && & firstArg;
+                            firstArg = *p1 & "[Reverse]&" & *p2 & "[Reverse]";
+                            menuOptions && & firstArg;
+                            bb->_UnpushButton();
+                            firstArg = HandlePullDown (menuOptions,h,v,0);
+                            if (firstArg.sLength) {
+                                bool d1 = firstArg.beginswith(*p1&'&'),
+                                     d2 = firstArg.endswith ("[Reverse]");
+                                InterleavePartitions (i,j,!d1,d2);
+                            }
+                        }
+                        break;
+                    }
+                    case 7: { // deletions/constants
+                        if (sel.lLength==1) {
+                            _DataSetFilter* df = (_DataSetFilter*)dataSetFilterList(dataPartitions.lData[sel.lData[0]]);
+                            firstArg = "Constant Sites"; // 0
+                            _List  menuOptions;
+                            menuOptions && &firstArg;
+                            firstArg = "Constant Sites Matching Ambiguities"; // 1
+                            menuOptions && &firstArg;
+                            firstArg = menuSeparator;
+                            menuOptions && &firstArg;
+                            firstArg = "Sites with Deletions"; // 3
+                            menuOptions && &firstArg;
+                            firstArg = "Sites with All Deletions"; // 4
+                            menuOptions && &firstArg;
+                            firstArg = "Sequences with Deletions"; //5
+                            menuOptions && &firstArg;
+                            firstArg = menuSeparator;
+                            menuOptions && &firstArg;
+                            firstArg = "Identical Sequences"; // 7
+                            menuOptions && &firstArg;
+                            firstArg = "Identical Sequences Matching Ambiguities"; //8
+                            menuOptions && &firstArg;
+                            menuOptions && &menuSeparator;
+                            firstArg = "Association [Pearson chi2]"; // 10
+                            menuOptions && &firstArg;
+                            firstArg = "Association [Fisher Exact]"; // 11
+                            menuOptions && &firstArg;
+                            firstArg = "Show Contigency Tables"; // 12
+                            menuOptions && &firstArg;
+                            menuOptions && &menuSeparator;
+                            firstArg = "Character Usage By Site"; // 14
+                            menuOptions && &firstArg;
+                            firstArg = "Character Entropy"; // 15
+                            menuOptions && &firstArg;
+                            firstArg = "Ambiguous Characters By Sequence"; // 16
+                            menuOptions && &firstArg;
+                            if (df->GetUnitLength() == 3) {
+                                firstArg = "Codon Usage"; // 17
+                                menuOptions && &firstArg;
+                            } else if (df->GetUnitLength() == 1) {
+                                firstArg = "Count differences from consensus"; // 17
+                                menuOptions && &firstArg;
+                                firstArg = "Clean up singletons"; //18
+                                menuOptions && &firstArg;
+                            }
+
+                            bb->_UnpushButton();
+                            firstArg = HandlePullDown (menuOptions,h,v,0);
+                            k = menuOptions.Find (&firstArg);
+                            switch (k) {
+                            case 0:
+                                ShowConstantSites (false);
+                                break;
+                            case 1:
+                                ShowConstantSites (false,true);
+                                break;
+                            case 3:
+                                ShowConstantSites (true);
+                                break;
+                            case 4:
+                                ShowConstantSites (true,true);
+                                break;
+                            case 5:
+                                ShowConstantSites (true,true,true);
+                                break;
+                            case 7:
+                                ShowDuplicateSequences (false);
+                                break;
+                            case 8:
+                                ShowDuplicateSequences (true);
+                                break;
+                            case 10:
+                            case 11:
+                            case 12:
+                                ShowAssociation (sel.lData[0],k-10);
+                                break;
+                            case 14:
+                                ShowCharacterUsage (sel.lData[0],false);
+                                break;
+                            case 15:
+                                ShowCharacterUsage (sel.lData[0],true);
+                                break;
+                            case 17:
+                                if (df->GetUnitLength() == 3) {
+                                    ShowCodonUsage (sel.lData[0]);
+                                } else {
+                                    ShowMutantCount (sel.lData[0]);
+                                }
+                                break;
+
+                            case 18:
+                                CleanupSingletons (sel.lData[0]);
+                                break;
+                            }
+                            bb->_UnpushButton();
+                        }
+                    }
+                    break;
+
+                    case 8: // display parameter table
+                        DisplayParameterTable ();
+                        bb->_UnpushButton();
+                        break;
+
+                    case 9: // color toggle
+                        sp->invertColors = !sp->invertColors;
+                        bb->ReplaceButton (9,ProcureIconResource(HY_DATAPANEL_ICON_ID+13+(sp->invertColors)),nil);
+                        sp->BuildPane();
+                        sp->_MarkForUpdate();
+                        _HYSequencePane * sp2      = (_HYSequencePane*)GetObject (4);
+                        sp2->invertColors = !sp2->invertColors;
+                        sp2->BuildPane();
+                        sp2->_MarkForUpdate();
+                        break;
+                    }
+                }
+                done = true;
+            } else {
+                if (e->EventClass()==_hyTableDblClickEvent) {
+                    if (pl->IsRowSelectionSimple()) {
+                        EditPartitionProperties(pl->GetFirstRowSelection());
+                    }
+
+                    done = true;
+                } else if (e->EventClass()==_hyTablePullDownEvent) {
+                    f = e->EventCode().Find(',',0,-1);
+                    p = e->EventCode().FindBackwards(',',0,-1);
+                    k = e->EventCode().Cut (0,f-1).toNum();
+                    f = e->EventCode().Cut (f+1,p-1).toNum();
+                    p = e->EventCode().Cut (p+1,-1).toNum();
+
+                    for (i=0; i<components.lLength; i++) {
+                        if (((_HYGuiObject*)components(i))->MatchID(k)) {
+                            break;
+                        }
+                    }
+                    if ((i==5)||(i==6)) {
+                        k = p>>16;   // x - coord
+                        p = p&0xffff;// y - coord
+                        int     r = f/pl->horizontalSpaces.lLength,
+                                c = f%pl->horizontalSpaces.lLength;
+                        _List   mOptions;
+
+                        _String * currentType = (_String*)pl->GetCellData (c,r),
+                                  mChoice;
+
+
+                        switch (c) {
+                        case DF_TYPE_COLUMN: { // data type change
+                            if (i==5) {
+                                ConstructDataTypeOptions (mOptions);
+                                mChoice = HandlePullDown (mOptions,k,p,mOptions.Find (currentType)+1);
+                                if (mChoice.sLength&&(!mChoice.Equal(currentType))) {
+                                    if (DataTypeChange (r,mOptions.Find (&mChoice))) {
+                                        pl->SetCellData (&mChoice,r,c,pl->cellTypes.lData[f],true);
+                                        mOptions.Clear();
+                                        GenerateModelList (mOptions,r);
+                                        RefreshPartRow(mOptions,r,false);
+                                        pl->_MarkCellForUpdate(f);
+                                        tainted = true;
+                                    }
+                                }
+                            }
+                            break;
+                        }
+                        case DF_TREE_COLUMN: { // tree topology change
+                            if ((i==6)&&((lfID>=0)||(dataPartitions.lLength==0))) {
+                                break;
+                            }
+                            GenerateTreeList (mOptions);
+                            mChoice = HandlePullDown (mOptions,k,p,mOptions.Find (currentType)+1);
+                            if (mChoice.sLength) {
+                                _String mRes;
+                                if (i==5) {
+                                    if (mChoice.Equal(currentType)) {
+                                        break;
+                                    }
+
+                                    mRes = TreeTopologyChange (r,&mChoice);
+                                    pl->SetCellData (&mRes,r,c,pl->cellTypes.lData[f],true);
+                                    pl->_MarkCellForUpdate(f);
+                                    tainted = true;
+                                } else {
+                                    for (i=0; i<dataPartitions.lLength; i++)
+                                        if (!mChoice.Equal((_String*)pl->GetCellData (c,i))) {
+                                            break;
+                                        }
+
+                                    if (i==dataPartitions.lLength) {
+                                        break;
+                                    }
+
+                                    mRes = TreeTopologyChange (0,&mChoice);
+                                    pl->SetCellData (&mRes,0,c,pl->cellTypes.lData[c],true);
+                                    f = c;
+                                    for (i=1; i<dataPartitions.lLength; i++) {
+                                        f += pl->horizontalSpaces.lLength;
+                                        mRes = TreeTopologyChange (i,&mRes);
+                                        pl->SetCellData (&mRes,i,c,pl->cellTypes.lData[f],true);
+                                    }
+                                    pl->_MarkColumnForUpdate(c);
+                                    tainted = true;
+                                }
+                            }
+                            _VerifyInferMenu();
+                            break;
+                        }
+
+                        case DF_MODEL_COLUMN: { // model change
+                            if ((i==6)&&((lfID>=0)||(dataPartitions.lLength==0))) {
+                                break;
+                            }
+
+                            if (i==5) {
+                                GenerateModelList (mOptions,r);
+                            } else {
+                                _String   *firstDataType = (_String*)pl->GetCellData(DF_TYPE_COLUMN,0);
+                                for (f=1; f<dataPartitions.lLength; f++)
+                                    if (!firstDataType->Equal((_String*)pl->GetCellData(DF_TYPE_COLUMN,f))) {
+                                        break;
+                                    }
+
+                                if (f==dataPartitions.lLength) {
+                                    GenerateModelList (mOptions,0);
+                                } else {
+                                    break;
+                                }
+                            }
+                            mChoice = HandlePullDown (mOptions,k,p,mOptions.Find (currentType)+1);
+                            if (mChoice.sLength) {
+                                if (i==5) {
+                                    if (mChoice.Equal(currentType)) {
+                                        break;
+                                    }
+                                } else {
+                                    for (f=0; f<dataPartitions.lLength; f++)
+                                        if (!mChoice.Equal((_String*)pl->GetCellData (c,f))) {
+                                            break;
+                                        }
+
+                                    if (f==dataPartitions.lLength) {
+                                        break;
+                                    }
+                                }
+
+                                k = mOptions.Find(&mChoice);
+                                ModelChange (&mChoice,r,k);
+                                RefreshPartRow(mOptions,r,false);
+                                if (i==6) {
+                                    for (i=1; i<dataPartitions.lLength; i++) {
+                                        ModelChange  (&mChoice,i,k);
+                                        RefreshPartRow(mOptions,i,false);
+                                    }
+                                }
+                                tainted = true;
+                            }
+                            _VerifyInferMenu();
+                            break;
+                        }
+
+                        case DF_MDL_OPT_COLUMN:
+                        case DF_MDL_EFV_COLUMN: {
+                            if ((i==6)&&((lfID>=0)||(dataPartitions.lLength==0))) {
+                                break;
+                            }
+
+                            if (c==DF_MDL_OPT_COLUMN) {
+                                GenerateModelPOptionList (mOptions,r);
+                            } else {
+                                GenerateModelFOptionList (mOptions,r);
+                            }
+
+                            if (i==6) {
+                                for (f=1; f<dataPartitions.lLength; f++)
+                                    if (!currentType->Equal ((_String*)pl->GetCellData (DF_MODEL_COLUMN,f))) {
+                                        _List lOptions;
+                                        if (c==DF_MDL_OPT_COLUMN) {
+                                            GenerateModelPOptionList (lOptions,f);
+                                        } else {
+                                            GenerateModelFOptionList (lOptions,f);
+                                        }
+
+                                        for (long jj = 0; jj<mOptions.countitems();)
+                                            if (lOptions.Find (mOptions (jj))<0) {
+                                                mOptions.Delete (jj);
+                                            } else {
+                                                jj++;
+                                            }
+                                    }
+                            }
+
+                            mChoice = HandlePullDown (mOptions,k,p,mOptions.Find (currentType)+1);
+
+                            if (mChoice.sLength&&(!mChoice.Equal(currentType))) {
+                                if (c==DF_MDL_OPT_COLUMN) {
+                                    ModelOptionChange (&mChoice,r);
+                                } else {
+                                    ModelFreqChange (&mChoice,r);
+                                }
+
+                                mOptions.Clear();
+                                GenerateModelList (mOptions,r);
+                                RefreshPartRow(mOptions,r,false);
+
+                                if (i==6)
+                                    for (f=1; f<dataPartitions.lLength; f++) {
+                                        if (c==DF_MDL_OPT_COLUMN) {
+                                            ModelOptionChange (&mChoice,f);
+                                        } else {
+                                            ModelFreqChange (&mChoice,f);
+                                        }
+
+                                        mOptions.Clear();
+                                        GenerateModelList (mOptions,f);
+                                        RefreshPartRow(mOptions,f,false);
+                                    }
+                                tainted = true;
+                            }
+                            break;
+                        }
+
+                        /*case 5: // freq change
+                        {
+                            mChoice = HandlePullDown (mOptions,k,p,mOptions.Find (currentType)+1);
+                            if (mChoice.sLength&&(!mChoice.Equal(currentType)))
+                            {
+                                ModelFreqChange (&mChoice,r);
+                                mOptions.Clear();
+                                GenerateModelList (mOptions,r);
+                                RefreshPartRow(mOptions,r,false);
+                            }
+                            break;
+                        }*/
+                        }
+                    }
+                    done = true;
+                } else if (e->EventClass()==_hyContextPopUp) {
+                    f = e->EventCode().Find(',',0,-1);
+                    p = e->EventCode().FindBackwards(',',0,-1);
+                    if (p>f+1) {
+
+                        k = e->EventCode().Cut (0,f-1).toNum();
+                        f = e->EventCode().Cut (f+1,p-1).toNum();
+                        p = e->EventCode().Cut (p+1,-1).toNum();
+
+                        for (i=0; i<components.lLength; i++) {
+                            if (((_HYGuiObject*)components(i))->MatchID(k)) {
+                                break;
+                            }
+                        }
+                        if (i==0) {
+                            ProcessContextualPopUpMain(f,p);
+                        } else if (i==4) {
+                            ProcessContextualPopUpAux(f,p);
+                        }
+
+
+                        done = true;
+                    }
+                } else if (e->EventClass()==_hyTableEditCellEvent) {
+                    f = e->EventCode().Find(',',0,-1);
+                    k = e->EventCode().Cut (0,f-1).toNum();
+                    f = e->EventCode().Cut (f+1,-1).toNum();
+
+                    for (i=0; i<components.lLength; i++)
+                        if (((_HYGuiObject*)components(i))->MatchID(k)) {
+                            break;
+                        }
+
+                    if (i==5) {
+                        int r = f/pl->horizontalSpaces.lLength,
+                            c = f%pl->horizontalSpaces.lLength;
+
+                        if (c==DF_MDL_CLS_COLUMN) {
+                            k = ((_String*)pl->GetCellData (c,r))->toNum();
+                            if  (k>1) {
+                                ModelRateClassChange (r,k);
+                            } else {
+                                _String warnMsg ;
+                                warnMsg = *(_String*)pl->GetCellData (c,r) & " is not an integer greater than 1.";
+                                ProblemReport (warnMsg, (Ptr)this);
+                            }
+                            _List mOptions;
+                            GenerateModelList (mOptions,r);
+                            RefreshPartRow(mOptions,r,false);
+                        }
+                    }
+                    done = true;
+                } else if (e->EventClass()==_hyTableResizeCEvent ) {
+                    f = e->EventCode().Find(',',0,-1);
+                    k = e->EventCode().Find(',',f+1,-1);
+                    long g = e->EventCode().Cut (0,f-1).toNum();
+                    f = e->EventCode().Cut (f+1,k-1).toNum();
+                    k = e->EventCode().Cut (k+1,-1).toNum();
+
+                    for (i=0; i<components.lLength; i++)
+                        if (((_HYGuiObject*)components(i))->MatchID(g)) {
+                            break;
+                        }
+
+                    if (i==6) {
+                        pl->SetColumnSpacing (f,k,true);
+                    }
+
+                    done = true;
+                }
+            }
+        }
+    }
+    if (done) {
+        DeleteObject (e);
+        return true;
+    }
+    return _HYTWindow::ProcessEvent(e);
+}
+
+//__________________________________________________________
+
+void    _HYDataPanel::GetMutantCount (long partIndex, _SimpleList& counts, _String* storeConsensus)
+{
+    _DataSetFilter *df = (_DataSetFilter*)dataSetFilterList(dataPartitions.lData[partIndex]);
+
+    _SimpleList                 mutantCount;
+
+    if (storeConsensus) {
+        *storeConsensus = df->GenerateConsensusString (&mutantCount);
+    } else {
+        df->GenerateConsensusString (&mutantCount);
+    }
+
+    long            seqCount = df->NumberSpecies();
+    //half   = seqCount/2;
+
+    for (long k=0; k<df->theFrequencies.lLength; k++)
+        //if (mutantCount.lData[k]>half)
+    {
+        mutantCount.lData[k] = seqCount-mutantCount.lData[k];
+    }
+    //else
+    //mutantCount.lData[k] = -1;
+
+    for (long kk=0; kk<df->duplicateMap.lLength; kk++) {
+        counts << mutantCount.lData[df->duplicateMap.lData[kk]];
+    }
+}
+
+//__________________________________________________________
+
+void    _HYDataPanel::ShowMutantCount (long partIndex)
+{
+    _SimpleList       counts;
+    GetMutantCount (partIndex, counts, nil);
+
+    _List        colHeaders;
+    _String      aString ("Mutant Count");
+
+    _Matrix      res (counts.lLength, 1, false, true);
+
+    for (long k=0; k<counts.lLength; k++) {
+        res.theData[k] = counts.lData[k];
+    }
+
+    colHeaders && & aString;
+
+    aString = _String("Mutant Count For ") &
+              *(_String*)dataSetFilterNamesList(dataPartitions.lData[partIndex]);
+
+    long f = FindWindowByName (aString);
+    _HYChartWindow * nc;
+    if (f>=0) {
+        nc = (_HYChartWindow*)windowObjectRefs (f);
+        nc->SetTable (colHeaders,res);
+    } else {
+        nc = new _HYChartWindow (aString, colHeaders, res, nil);
+        checkPointer (nc);
+    }
+    nc->SetChartType ("Bar Chart","Index","Mutant Count", true);
+    nc->BringToFront();
+
+}
+
+//__________________________________________________________
+
+void    _HYDataPanel::CleanupSingletons (long partIndex)
+{
+    _DataSetFilter *df = (_DataSetFilter*)dataSetFilterList(dataPartitions.lData[partIndex]);
+
+    if (df->GetUnitLength() == 1) {
+        _String           consensus;
+        _SimpleList       counts;
+
+        GetMutantCount (partIndex, counts, &consensus);
+
+        _SimpleList    singletonCount;
+
+        for (long k=0; k<counts.lLength; k++)
+            if (counts.lData[k] == 1) {
+                singletonCount << k;
+            }
+
+        if (singletonCount.lLength == 0) {
+            consensus = "No singleton mutations found.";
+            ProblemReport (consensus, (Ptr)this);
+        } else {
+            _DataSet*       newDS = new _DataSet();
+            _String         state(1,false);
+            long            k,
+                            shifter = 0;
+
+            singletonCount << -1;
+
+            for (k=0; k<consensus.sLength; k++) {
+                if (k == singletonCount.lData[shifter]) {
+                    shifter++;
+                    newDS->AddSite (consensus.sData[k]);
+                } else {
+                    df->RetrieveState (k,0,state);
+                    newDS->AddSite (state.sData[0]);
+                }
+            }
+
+            newDS->AddName(*df->GetSequenceName(0));
+
+            for (k=1; k<df->NumberSpecies(); k++) {
+                newDS->AddName(*df->GetSequenceName(k));
+                shifter = 0;
+                for (long j=0; j<consensus.sLength; j++)
+                    if (j == singletonCount.lData[shifter]) {
+                        shifter++;
+                        newDS->Write2Site (j,consensus.sData[j]);
+                    } else {
+                        df->RetrieveState (j,k,state);
+                        newDS->Write2Site (j,state.sData[0]);
+                    }
+            }
+
+            newDS->Finalize();
+            newDS->SetTranslationTable (df->GetData()->GetTT());
+            newDS->SetNoSpecies (df->NumberSpecies());
+            consensus = (*(_String*)dataSetFilterNamesList(partIndex))&("_cleaned");
+            AddDataSetToList (consensus, newDS);
+            _HYDataPanel* myTWindow = new _HYDataPanel(consensus,consensus);
+            myTWindow->BringToFront();
+            consensus = _String("Cleaned up ") & (long)singletonCount.lLength & " singletons.";
+            ProblemReport (consensus, (Ptr)myTWindow);
+        }
+    }
+}
+
+//__________________________________________________________
+
+void    _HYDataPanel::ShowCharacterUsage (long partIndex, bool useEntropy)
+{
+    _DataSetFilter *df = (_DataSetFilter*)dataSetFilterList(dataPartitions.lData[partIndex]);
+
+    long            stateCount      = df->GetDimension (true),
+                    fullCount        = df->GetDimension (false),
+                    stateSize       = df->GetUnitLength(),
+                    siteCount          = df->GetFullLengthSpecies()/stateSize,
+                    patternCount    = df->NumberDistinctSites();
+
+    _Matrix         res  (useEntropy?1:stateCount, siteCount, false, true),
+                    res2 (useEntropy?1:stateCount, patternCount, false, true);
+
+    _SimpleList     mapper;
+
+    if (df->theExclusions.lLength) {
+        long k = 0;
+        for (long i = 0; i<fullCount; i++) {
+            if (i==df->theExclusions[k]) {
+                k++;
+                continue;
+            }
+            mapper << i;
+        }
+    } else
+        for (long k0=0; k0<stateCount; k0++) {
+            mapper << k0;
+        }
+
+    for (long k=0; k<patternCount; k++) {
+        _SimpleList          vSeq;
+
+        for (long k2=0; k2<stateSize; k2++) {
+            vSeq << df->theMap[k*stateSize+k2];
+        }
+
+        _Matrix* siteFreqs = df->GetData()->HarvestFrequencies (stateSize,stateSize,0,df->theNodeMap, vSeq, false);
+
+        if (useEntropy) {
+            _Parameter entropy = 0.0;
+
+            for (long k3=0; k3<stateCount; k3++) {
+                _Parameter siteFreq = siteFreqs->theData[mapper.lData[k3]];
+                if (siteFreq > 0.0) {
+                    entropy -= log(siteFreq)*siteFreq/LN_2;
+                }
+            }
+
+            res2.theData[k] = entropy;
+        } else {
+            long k4 = 0;
+
+            for (long k3=k; k3<stateCount*patternCount; k3+=patternCount) {
+                res2.theData[k3] = siteFreqs->theData[mapper.lData[k4++]];
+            }
+        }
+
+        DeleteObject (siteFreqs);
+    }
+
+
+    _List colHeaders;
+
+    _String  rowLabels (128L, true);
+
+    if (useEntropy) {
+        for (long k5=0; k5<siteCount; k5++) {
+            res.theData[k5] = res2.theData[df->duplicateMap[k5]];
+        }
+
+        rowLabels << "Entropy";
+        rowLabels.Finalize();
+
+        colHeaders && & rowLabels;
+
+        rowLabels = _String("Character entropy for ") &
+                    *(_String*)dataSetFilterNamesList(dataPartitions.lData[partIndex]);
+
+    } else {
+
+        for (long k9=1; k9<=siteCount; k9++) {
+            rowLabels << ";Site ";
+            rowLabels << _String(k9);
+        }
+
+        rowLabels.Finalize();
+        for (long k5=0; k5<siteCount; k5++) {
+            long dIndex = df->duplicateMap[k5];
+
+            long k7 = dIndex;
+
+            for (long k6=k5; k6<stateCount*siteCount; k6+=siteCount, k7+=patternCount) {
+                res.theData[k6] = res2.theData[k7];
+            }
+        }
+
+        for (long k8=0; k8<stateCount; k8++) {
+            _String tts (df->ConvertCodeToLetters (df->CorrectCode(k8), stateSize));
+            colHeaders && & tts;
+        }
+
+        colHeaders && & rowLabels;
+        rowLabels = _String("Character Usage Across Sites In ") &
+                    *(_String*)dataSetFilterNamesList(dataPartitions.lData[partIndex]);
+
+    }
+
+    long f = FindWindowByName (rowLabels);
+    res.Transpose();
+
+    _HYChartWindow * nc;
+
+    if (f>=0) {
+        nc = (_HYChartWindow*)windowObjectRefs (f);
+        nc->SetTable (colHeaders,res);
+    } else {
+        nc = new _HYChartWindow (rowLabels, colHeaders, res, nil);
+        checkPointer (nc);
+    }
+
+    if (useEntropy) {
+        nc->SetChartType ("Bar Chart","Index","Entropy",true);
+    }
+
+    nc->BringToFront();
+
+}
+
+//__________________________________________________________
+
+void    _HYDataPanel::ShowAssociation (long partIndex, char options)
+{
+    _String         prompt  ("Significance level [0,1]:"),
+                    cPrompt ("Resolve ambiguities randomly"),
+                    sig;
+
+    bool            randomly = false;
+
+    if (options == 2 || EnterStringDialogWithCheckbox (sig, prompt, cPrompt,randomly, (Ptr)this)) {
+        _Parameter      pvalue = sig.toNum();
+
+        _DataSetFilter *df = (_DataSetFilter*)dataSetFilterList(dataPartitions.lData[partIndex]);
+
+        long            stateSize       = df->GetUnitLength(),
+                        siteCount          = df->GetFullLengthSpecies()/stateSize,
+                        patternCount    = df->NumberDistinctSites();
+
+        if (options == 2 && (siteCount > 4 || siteCount < 2)) {
+            prompt = "Pairwise contigency tables only work with filters with 2,3 or 4 sites - otherwise too many windows would need to be open. Chop your data partition into smaller sections.";
+            ProblemReport (prompt, (Ptr)this);
+            return;
+        }
+
+        _Matrix         patternRes        (patternCount, patternCount, false, true);
+        _List           patterns;
+
+
+        _Parameter      * fv = new _Parameter [df->GetDimension (true)];
+        checkPointer (fv);
+
+        for (long site = 0; site < patternCount; site++) {
+            _SimpleList* sitePat = df->CountAndResolve (site,fv,randomly);
+            patterns << sitePat;
+            DeleteObject (sitePat);
+        }
+
+        delete (fv);
+
+        long    totalCount = patternCount*(patternCount-1)/2,
+                totalDone  = 0,
+                lastDone   = 0;
+
+        if (options == 2) {
+            for (long site1=0; site1<siteCount-1; site1++) {
+                for (long site2=site1+1; site2<siteCount; site2++) {
+                    if (df->duplicateMap[site1]!=df->duplicateMap[site2]) {
+                        _List       labels,
+                                    listLabels;
+                        _Matrix     * pc  = df->PairwiseCompare ((_SimpleList*)patterns(df->duplicateMap[site1]),
+                                            (_SimpleList*)patterns(df->duplicateMap[site2]),
+                                            &labels);
+
+                        _SimpleList *rowLabels = (_SimpleList*)labels(1);
+                        for (long lc = 0; lc < rowLabels->lLength; lc++) {
+                            _String    tts (df->ConvertCodeToLetters (df->CorrectCode (rowLabels->lData[lc]),stateSize));
+                            listLabels && & tts;
+                        }
+                        _String temp (128L, true);
+                        temp<<"C";
+
+                        rowLabels = (_SimpleList*)labels(0);
+                        for (long lc = 0; lc < rowLabels->lLength; lc++) {
+                            temp << ';';
+                            temp << df->ConvertCodeToLetters (df->CorrectCode (rowLabels->lData[lc]),stateSize);
+                        }
+
+                        temp.Finalize();
+                        listLabels && & temp;
+                        prompt = _String ("Contigency tables for sites ") & (site1+1) & " and " & (site2+1) & " in " &  *(_String*)dataSetFilterNamesList(dataPartitions.lData[partIndex]);
+
+                        _HYChartWindow * reportChart = (_HYChartWindow*) FindWindowByNameAndOpen (prompt);
+                        if (reportChart) {
+                            reportChart->SetTable(listLabels, *pc);
+                        } else {
+                            reportChart = new _HYChartWindow (prompt, listLabels, *pc, nil);
+                        }
+
+                        reportChart->BringToFront();
+
+                        DeleteObject (pc);
+                    }
+                }
+            }
+        } else {
+            allocate_fexact_keys (4096,32);
+            SetStatusLine ("Computing Associations");
+
+            for (long site1=0; site1<patternCount-1; site1++) {
+                _SimpleList * sp1 = (_SimpleList*) patterns (site1);
+                long          sp1c = sp1->lData[sp1->lLength-1];
+
+                for (long site2=site1+1; site2 < patternCount; site2++) {
+                    _SimpleList * sp2 = (_SimpleList*) patterns (site2);
+                    if ((sp1c > 1) && (sp2->lData[sp2->lLength-1] > 1)) {
+                        _Matrix     * pc  = df->PairwiseCompare (sp1,sp2);
+                        if (options) {
+                            patternRes.theData[site1*patternCount+site2] = pc->FisherExact (5.,80.,1.);
+                        } else
+                            // use chi^2
+                        {
+                            long     rcnt = pc->GetHDim(),
+                                     ccnt = pc->GetVDim();
+
+
+                            _List*     rcc = pc->ComputeRowAndColSums();
+
+                            _Parameter chi2statistic = 0.0,
+                                       totals        = ((_Constant*)(*rcc)(2))->Value();
+
+                            _Matrix*   rowSums       = (_Matrix*)(*rcc)(0),
+                                       *   columnSums     = (_Matrix*)(*rcc)(1);
+
+                            for (long rows = 0; rows < rcnt; rows++) {
+                                for (long columns = 0; columns < ccnt; columns ++) {
+                                    _Parameter eTerm = rowSums->theData[rows]*columnSums->theData[columns]/totals,
+                                               aTerm = (pc->theData[rows*ccnt+columns]-eTerm);
+
+                                    chi2statistic += aTerm * aTerm / eTerm;
+                                }
+                            }
+
+                            totals = rcnt*ccnt-rcnt-ccnt+1;
+
+                            _Constant val (chi2statistic),
+                                      degs (totals),
+                                      *res = (_Constant*)val.CChi2(&degs);
+
+                            patternRes.theData[site1*patternCount+site2] = 1.-res->Value();
+                            DeleteObject (res);
+                            DeleteObject (rcc);
+
+                        }
+                        patternRes.theData[site2*patternCount+site1] = patternRes.theData[site1*patternCount+site2];
+                        DeleteObject (pc);
+                    } else {
+                        patternRes.theData[site2*patternCount+site1] = patternRes.theData[site1*patternCount+site2] = 1.;
+                    }
+                    totalDone ++;
+                    long testDone = (100.*totalDone)/totalCount;
+                    if (testDone > lastDone) {
+                        lastDone = testDone;
+                        SetStatusBarValue (lastDone,1.,0);
+                    }
+                }
+            }
+
+            free_fexact_keys ();
+            SetStatusBarValue (-1,1.,0);
+            SetStatusLine ("Idle");
+
+            _SimpleList    matchedPairs;
+            _List          pValues;
+
+            for (long site1=0; site1<siteCount-1; site1++) {
+                for (long site2=site1+1; site2<siteCount; site2++) {
+                    if (df->duplicateMap[site1]!=df->duplicateMap[site2]) {
+                        _Parameter locP = patternRes.theData[df->duplicateMap[site1]*patternCount+df->duplicateMap[site2]];
+                        if (locP <= pvalue) {
+                            _Constant locPC (locP);
+                            matchedPairs << site1+1;
+                            matchedPairs << site2+1;
+                            pValues && & locPC;
+                        }
+                    }
+                }
+            }
+            if (pValues.lLength) {
+
+                _List colHeaders;
+
+                sig = "Site 1";
+                colHeaders && & sig;
+
+                sig = "Site 2";
+                colHeaders && & sig;
+
+                sig = "p-value";
+                colHeaders && & sig;
+
+                _Matrix res (pValues.lLength,3,false,true);
+
+                for (long cntr = 0; cntr < pValues.lLength; cntr++) {
+                    res.Store (cntr,0,matchedPairs[2*cntr]);
+                    res.Store (cntr,1,matchedPairs[2*cntr+1]);
+                    res.Store (cntr,2,((_Constant*)(pValues(cntr)))->Value());
+                }
+
+                sig = _String("Significant association at level  ") & pvalue & " in " &
+                      *(_String*)dataSetFilterNamesList(dataPartitions.lData[partIndex]);
+
+                long f = FindWindowByName (sig);
+                _HYChartWindow * nc;
+                if (f>=0) {
+                    nc = (_HYChartWindow*)windowObjectRefs (f);
+                    nc->SetTable (colHeaders,res);
+                } else {
+                    nc = new _HYChartWindow (sig, colHeaders, res, nil);
+                    checkPointer (nc);
+                }
+                nc->BringToFront();
+
+                _List           mappedAssociations;
+                _SimpleList     associatedSite;
+
+                for (long kc = 0; kc < pValues.lLength; kc++) {
+                    long st1 = matchedPairs.lData[kc<<1],
+                         st2 = matchedPairs.lData[(kc<<1)+1];
+
+                    long f = associatedSite.BinaryFind (st1);
+
+                    _SimpleList* assSites;
+
+                    if (f<0) {
+                        f = associatedSite.BinaryInsert (st1);
+                        _SimpleList d (st1);
+                        mappedAssociations.InsertElement (&d, f, true);
+                    }
+
+                    assSites = (_SimpleList*)mappedAssociations (f);
+                    assSites->BinaryInsert(st2);
+
+                    f = associatedSite.BinaryFind (st2);
+
+                    if (f<0) {
+                        f = associatedSite.BinaryInsert (st2);
+                        _SimpleList d (st2);
+                        mappedAssociations.InsertElement (&d, f, true);
+                    }
+
+                    assSites = (_SimpleList*)mappedAssociations (f);
+                    assSites->BinaryInsert(st1);
+                }
+
+                _List   associatedClusters;
+
+                for (long ma=0; ma<mappedAssociations.lLength; ma++) {
+                    _SimpleList* mappedAssoc = (_SimpleList*)mappedAssociations (ma);
+                    if (mappedAssoc->lLength == 2) { // special case
+                        _SimpleList assC;
+                        assC << *mappedAssoc;
+                        associatedClusters && & assC;
+
+                        mappedAssoc = (_SimpleList*)mappedAssociations (associatedSite. BinaryFind (mappedAssoc->lData[1]));
+
+                        mappedAssoc->Delete (mappedAssoc->BinaryFind (associatedSite.lData[ma]));
+                    } else {
+                        if (mappedAssoc->lLength > 2) {
+                            _SimpleList    workSpace (*mappedAssoc);
+
+                            while (mappedAssoc->countitems() > 1) {
+                                long runningCount = 2;
+
+                                for (long k=0; k<mappedAssoc->lLength; k++) {
+                                    if (mappedAssoc->lData[k] != associatedSite.lData[ma]) {
+                                        _SimpleList temp;
+                                        _SimpleList *otherAssoc = (_SimpleList*) mappedAssociations (associatedSite.BinaryFind(mappedAssoc->lData[k]));
+                                        temp.Intersect (workSpace,*otherAssoc);
+                                        if ((temp.lLength < runningCount)||(k==mappedAssoc->lLength-1)) {
+                                            // reached end of the line
+                                            associatedClusters && & workSpace;
+                                            for (long kk = 0; kk < workSpace.lLength; kk++) {
+                                                long li = associatedSite.BinaryFind(workSpace.lData[kk]);
+                                                temp.Subtract (*(_SimpleList*) mappedAssociations (li), workSpace);
+                                                temp.BinaryInsert (workSpace.lData[kk]);
+                                                ((_SimpleList*) mappedAssociations (li))->Duplicate (&temp);
+                                            }
+                                            workSpace.Duplicate (mappedAssoc);
+
+                                            break;
+                                        } else {
+                                            runningCount ++;
+                                            workSpace.Duplicate(&temp);
+                                        }
+
+                                    }
+                                }
+                            }
+                        }
+                    }
+                }
+
+                if (associatedClusters.lLength > 10) {
+                    prompt = _String ((long)associatedClusters.lLength) & " association clusters have been found. Are you sure you want to create a partition for each one of them?";
+                    if (!ProceedPrompt (prompt, (Ptr)this)) {
+                        return;
+                    }
+                }
+
+                prompt = *(_String*)dataSetFilterNamesList(dataPartitions.lData[partIndex]) & "_cluster";
+
+                bool     doExclusions = false;
+                if ((stateSize == 3)&&(df->theExclusions.lLength)) {
+                    char            a;
+
+                    LongToPartData (partData.lData[partIndex],a,doExclusions,patternCount);
+                    if (patternCount>=0) {
+                        doExclusions = true;
+                    }
+                }
+
+
+                for (long cc = 0; cc < associatedClusters.lLength; cc++) {
+                    _SimpleList clusterSites;
+                    _SimpleList * cls = (_SimpleList*)associatedClusters (cc);
+                    cPrompt = prompt;
+                    for (long sc=0; sc < cls->lLength; sc++)
+                        //for (long uc = 0; uc < stateSize; uc++)
+                    {
+                        clusterSites << df->theOriginalOrder[(cls->lData[sc]-1)*stateSize];
+                        cPrompt = cPrompt & "_" & _String(cls->lData[sc]);
+                    }
+
+
+
+                    CreatePartition (clusterSites, stateSize, false, & cPrompt);
+                    if (doExclusions) {
+                        SetCodonExclusions ((_DataSetFilter*)dataSetFilterList(dataPartitions.lData[dataPartitions.lLength-1]),dataPartitions.lLength-1,patternCount);
+                        partData.lData[dataPartitions.lLength-1] = PartDataToLong (0,false,patternCount);
+                    }
+                }
+            } else {
+                sig = _String ("No association with significance at or better than ") & pvalue;
+                ProblemReport (sig, (Ptr)this);
+            }
+        }
+    }
+
+}
+
+//__________________________________________________________
+
+void    _HYDataPanel::ShowCodonUsage (long partIndex)
+{
+    // go filter by filter; take each codon filter, apply properties and translate
+    _DataSetFilter *df = (_DataSetFilter*)dataSetFilterList(dataPartitions.lData[partIndex]);
+    _Matrix        *codonUsage = df->HarvestFrequencies (3,3,false);
+
+    char            offset;
+    bool            rev;
+    long            code,
+                    cCount = df->NumberSpecies ()*df->theOriginalOrder.lLength/3;
+
+    LongToPartData  (partData.lData[partIndex], offset, rev, code);
+
+    _SimpleList*    gCode = (_SimpleList*)(*((_List*)geneticCodes (code)))(2);
+
+
+    code = 0;
+
+    char            buffer [1024];
+    _String         rec;
+
+    snprintf (buffer, sizeof(buffer),"\nCodon Usage Report\n\nAltogether : %ld codons\n\nBy codon:\n\n", cCount);
+    BufferToConsole (buffer);
+
+    char            nucs[] = "ACGT";
+
+    for (long k=0; k<gCode->lLength; k++) {
+        if (gCode->lData[k] == 10) {
+            code++;
+        } else {
+            _Parameter cUsage = codonUsage->theData[k];
+            if (cUsage) {
+                CodeTo3AA (rec, k, gCode);
+                snprintf (buffer, sizeof(buffer),"%c%c%c(%s) : %10ld (%10.4g %%)\n", nucs[k/16], nucs[(k%16)/4], nucs[k%4], rec.getStr(), (long)(cUsage*cCount), 100.*cUsage);
+                BufferToConsole (buffer);
+            }
+        }
+    }
+
+    BufferToConsole ("\n\nBy aminoacid:\n\n");
+
+    for (long kk=0; kk<=20; kk++) {
+        if (kk != 10) {
+            bool   t = true;
+            code = 0;
+            for (long k=0; k<gCode->lLength; k++) {
+                _Parameter cUsage = codonUsage->theData[k];
+                if ((gCode->lData[k] == kk)&&(cUsage)) {
+                    if (t) {
+                        CodeTo3AA (rec, k, gCode);
+                        snprintf (buffer, sizeof(buffer),"%s=>\t", rec.getStr());
+                        t = false;
+                        BufferToConsole (buffer);
+
+                    }
+                    snprintf (buffer, sizeof(buffer),"%c%c%c:%6ld (%6.4g %%)\t", nucs[k/16], nucs[(k%16)/4], nucs[k%4], (long)(cUsage*cCount), 100.*cUsage);
+                    BufferToConsole (buffer);
+                } else if (gCode->lData[k] == 10) {
+                    code++;
+                }
+            }
+            if (!t) {
+                NLToConsole();
+            }
+        }
+    }
+
+    NLToConsole();
+    DeleteObject    (codonUsage);
+
+}
+
+//__________________________________________________________
+
+void    _HYDataPanel::ExecuteProcessor (long procID)
+{
+    if (procID<dataPanelProcessors.lLength) {
+        _String * filePathToProc = (_String*)dataPanelProcessors(procID);
+        FILE *    thisFile       = doFileOpen (filePathToProc->sData,"rb");
+        if (thisFile) {
+            _HYSequencePane* sp        = (_HYSequencePane*) components (0);
+            _HYTable*        pList     = (_HYTable*)        GetObject  (5);
+            _Matrix          *site_sel = nil,
+                              *seqs_sel = nil,
+                               *dflt_sel = nil,
+                                *dfdm_sel = nil;
+
+            _AssociativeList *genc_sel = new _AssociativeList,
+            *excl_sel = new _AssociativeList;
+
+            long             createdFilterID = -1;
+
+            _DataSetFilter*  passedDataFilter = nil;
+
+            if (sp->vselection.lLength) {
+                seqs_sel = new _Matrix (sp->vselection);
+            } else if (sp->selection.lLength) {
+                site_sel = new _Matrix (sp->selection);
+            }
+
+            if (!site_sel) {
+                site_sel = new _Matrix;
+            }
+            if (!seqs_sel) {
+                seqs_sel = new _Matrix;
+            }
+
+            _SimpleList    uti,
+                           ld;
+
+            pList->GetRowSelection (uti);
+            if (uti.lLength > 0) {
+                if (uti.lLength == 1) {
+                    passedDataFilter = (_DataSetFilter*)((_DataSetFilter*)dataSetFilterList(dataPartitions.lData[uti.lData[0]]))->makeDynamic();
+                } else if (dataWrapper) {
+                    passedDataFilter = (_DataSetFilter*)dataWrapper->makeDynamic();
+                } else {
+                    checkPointer (passedDataFilter = new _DataSetFilter);
+                    _SimpleList  blank, blank2;
+                    passedDataFilter->SetFilter ((_DataSet*)dataSetList (dataSetID),1,blank,blank2,0);
+                }
+
+
+                _List   selectedFilters;
+                for (long ti = 0; ti < uti.lLength; ti++) {
+                    selectedFilters << dataSetFilterNamesList(dataPartitions.lData[uti.lData[ti]]);
+                    _Matrix         * gCode = nil;
+                    _DataSetFilter  * dsf = (_DataSetFilter*)dataSetFilterList(dataPartitions.lData[uti.lData[ti]]);
+                    _FString        * excl = nil;
+                    if (dsf->GetUnitLength()==3) {
+                        char            offset;
+                        bool            rev;
+                        long            code;
+                        LongToPartData  (partData.lData[ti], offset, rev, code);
+                        gCode = new _Matrix(*(_SimpleList*)(*((_List*)geneticCodes (code)))(2));
+                        excl  = new _FString (GetExclusionsFromCode (code));
+                    } else {
+                        gCode = new _Matrix;
+                        excl  = new _FString;
+                    }
+
+                    ld << dsf->GetUnitLength();
+                    _String   *keyString = new _String (ti);
+                    _FString  aKey (keyString);
+                    genc_sel->MStore (&aKey, gCode, false);
+                    if (excl) {
+                        excl_sel->MStore (&aKey, excl, false);
+                    }
+                }
+                dflt_sel = new _Matrix (selectedFilters);
+            } else {
+                if (dataWrapper) {
+                    passedDataFilter = (_DataSetFilter*)dataWrapper->makeDynamic();
+                } else {
+                    checkPointer (passedDataFilter = new _DataSetFilter);
+                    _SimpleList  blank;
+                    passedDataFilter->SetFilter ((_DataSet*)dataSetList (dataSetID),1,uti,blank,0);
+                }
+                dflt_sel = new _Matrix;
+                ld << 1;
+            }
+
+            if (passedDataFilter) {
+                createdFilterID = AddFilterToList (datapanelProcDF, passedDataFilter, true);
+            }
+
+            dfdm_sel = new _Matrix (ld);
+
+            setParameter (datapanelProcHS,site_sel,false);
+            setParameter (datapanelProcVS,seqs_sel,false);
+            setParameter (datapanelProcSF,dflt_sel,false);
+            setParameter (datapanelProcGC,genc_sel,false);
+            setParameter (datapanelProcUS,dfdm_sel,false);
+            setParameter (datapanelProcEX,excl_sel,false);
+            setParameter (datapanelProcDS,new _FString (*(_String*)dataSetNamesList (dataSetID), false),false);
+
+            _String buffer (thisFile);
+            fclose (thisFile);
+
+            long   g = batchLanguageFunctionNames.lLength;
+
+            _String dpp = *filePathToProc;
+            PushFilePath (dpp);
+
+            _ExecutionList   thisList;
+            terminateExecution = false;
+
+            thisList.BuildList (buffer);
+            thisList.ExecuteAndClean(g);
+            terminateExecution = false;
+            PopFilePath ();
+
+            if ((excl_sel = CheckAssociativeListArg (&datapanelProcRF))) { // returned some filters to make
+                _List * returnedSpecs = excl_sel->GetKeys();
+                for (g = 0; g < returnedSpecs->lLength; g++) {
+                    _String * proposedName = (_String*)(*returnedSpecs) (g);
+                    if ((genc_sel = (_AssociativeList*)excl_sel->GetByKey(*proposedName, ASSOCIATIVE_LIST))) {
+                        // should have a _row_ matrices with key "SITES" (for now)
+                        _String tID (*proposedName);
+                        tID.ConvertToAnIdent();
+                        if (tID.IsValidIdentifier (false)) {
+                            _String aKey ("SITES");
+                            site_sel = (_Matrix*)genc_sel->GetByKey (aKey, MATRIX);
+                            if (site_sel) {
+                                site_sel->ConvertToSimpleList (uti);
+                                CreatePartition (uti, 1, false, &tID);
+                            }
+                        }
+                    }
+                }
+            }
+
+            DeleteVariable (datapanelProcHS);
+            DeleteVariable (datapanelProcVS);
+            DeleteVariable (datapanelProcSF);
+            DeleteVariable (datapanelProcGC);
+            DeleteVariable (datapanelProcUS);
+            DeleteVariable (datapanelProcEX);
+            DeleteVariable (datapanelProcDS);
+            DeleteVariable (datapanelProcRF);
+
+            if (createdFilterID>=0) {
+                KillDataFilterRecord (createdFilterID, true);
+            }
+        } else {
+            _String eMsg = _String("Problem reading file:") & *filePathToProc;
+            ProblemReport (eMsg);
+        }
+    }
+}
+
+//__________________________________________________________
+
+bool    _HYDataPanel::EditPartitionProperties (long index, char changeType)
+{
+    if (dataSetID>=0) {
+        if ((index<0)||(index>=dataPartitions.lLength)) {
+            return false;
+        }
+
+        long             dfID = dataPartitions[index], geneticCode = 0;
+        _DataSetFilter*  thisDF = (_DataSetFilter*)dataSetFilterList(dfID);
+        _String          currentName = *((_String*)dataSetFilterNamesList(dfID)),
+                         partitionInfo;
+        _HYColor         currentColor = LongToHYColor(partitionColors.lData[index]),
+                         oldColor = currentColor;
+        _HYTable*        pList = (_HYTable*)GetObject (5);
+        bool             direction = true;
+        char             readFrame = 0;
+
+        LongToPartData (partData.lData[index],readFrame,direction,geneticCode);
+
+
+        if (changeType) {
+            partitionInfo = "Changing partition data type";
+        } else {
+            partitionInfo = _String (thisDF->NumberSpecies())& " sequences, "&
+                            _String ((long)(thisDF->theOriginalOrder.lLength/thisDF->GetUnitLength()))&
+                            " total data sites, with "& _String ((long)thisDF->theFrequencies.lLength)
+                            &" unique patterns. ";
+
+            if (dataType&HY_DATAPANEL_NUCDATA || dataType&HY_DATAPANEL_BINARYDATA ) {
+                switch(thisDF->GetUnitLength()) {
+                case 2:
+                    partitionInfo = partitionInfo &
+                                    ((dataType&HY_DATAPANEL_NUCDATA)?dinucDataType:disequonDataType);
+                    break;
+                case 3:
+                    partitionInfo = partitionInfo & codonDataType;
+                    break;
+                default:
+                    partitionInfo = partitionInfo &
+                                    ((dataType&HY_DATAPANEL_NUCDATA)?nucDataType:binaryDataType);
+                }
+
+                partitionInfo = partitionInfo & " partition.";
+            } else if (dataType&HY_DATAPANEL_PROTDATA) {
+                partitionInfo = partitionInfo & proteinDataType &" partition.";
+            }
+        }
+
+        bool        okcancel = false;
+
+        _HYPartitionDialog* sd = new _HYPartitionDialog (partitionInfo,&currentName,&currentColor,&direction,&readFrame,&geneticCode,dfID,&okcancel,
+                changeType?changeType-1:thisDF->GetUnitLength()-1, (Ptr)this);
+        sd->Activate();
+        while (windowObjectRefs.Find ((long)sd)>=0) {
+            handleGUI();
+        }
+
+        //if (PartitionEditDialog(partitionInfo,currentName,currentColor,direction,readFrame,geneticCode,dfID,
+        //  changeType?changeType-1:thisDF->GetUnitLength()-1))
+        if (okcancel) {
+            long cellID = pList->horizontalSpaces.lLength*index;
+            if (!(((_String*)dataSetFilterNamesList(dfID))->Equal(&currentName))) {
+                // rename the filter
+                ((_String*)dataSetFilterNamesList(dfID))->Duplicate(&currentName);
+                pList->SetCellData (&currentName, index, DF_ID_COLUMN, pList->cellTypes[cellID+DF_ID_COLUMN], true);
+                pList->_MarkCellForUpdate (cellID+DF_ID_COLUMN);
+            }
+            if (!(currentColor==oldColor)) {
+                partitionColors.lData[index] = HYColorToLong (currentColor);
+                ((_SimpleList*)pList->GetCellData (DF_COLOR_COLUMN,index))->lData[0] = partitionColors.lData[index];
+                pList->_MarkCellForUpdate (cellID+DF_COLOR_COLUMN);
+                BuildThermometer();
+                BuildMarksPane();
+            }
+            long newCode = PartDataToLong (readFrame,direction,geneticCode);
+            if (!changeType) {
+                if (newCode!=partData.lData[index]) {
+                    PurgeLFFilter (index);
+                    if (((partData.lData[index]&HY_DATAPANEL_CODEMASK)>>16)!=geneticCode) {
+                        SetCodonExclusions (thisDF,dfID,geneticCode);
+                    }
+
+                    partData.lData[index] = newCode;
+                    if (addedLines&HY_DATAPANEL_TRANSLATION) {
+                        UpdateTranslationString (partitionInfo,translatedSequence,true);
+                    }
+                }
+            } else {
+                partData.lData[index] = newCode;
+            }
+
+            tainted = true;
+            return true;
+        }
+    }
+    return false;
+}
+
+//__________________________________________________________
+
+void    _HYDataPanel::InputPartitionString (void)
+{
+    if (dataSetID>=0) {
+        _String  partSpec;
+        if (EnterStringDialogWithCheckbox (partSpec,enterPartitionString,useOneBasedIndices,useOneBased, (Ptr)this)) {
+            _SimpleList newPart;
+            _DataSet* thisDS = (_DataSet*)dataSetList (dataSetID);
+            partSpec.Insert('"',0);
+            partSpec.Insert('"',-1);
+            thisDS->ProcessPartition (partSpec,newPart,true);
+            if (useOneBased)
+                for (long k=0; k<newPart.lLength; k++) {
+                    newPart.lData[k]--;
+                }
+
+            if (newPart.lLength) {
+                CreatePartition (newPart);
+            } else {
+                ProblemReport(invalidPartString,(Ptr)this);
+            }
+        }
+    }
+}
+
+//__________________________________________________________
+
+void    _HYDataPanel::SetDataSetReference (_String& varName, _SimpleList* specFilter)
+{
+    long f = dataSetNamesList.Find(&varName);
+    dataType = 0;
+    if (f>=0) {
+        _DataSet        * theDS    = (_DataSet*) dataSetList (f);
+        _HYSequencePane * sp       = (_HYSequencePane*)GetObject (0);
+        _HYSequencePane * sp2      = (_HYSequencePane*)GetObject (4);
+        dataSetID = f;
+        sp->columnStrings.Clear();
+        sp->selection.Clear();
+        sp->speciesIndex.Clear();
+
+        long upToC = theDS->NoOfColumns();
+        siteAssignments.RequestSpace(upToC);
+        overlaps.RequestSpace (upToC);
+        sp->columnStrings.RequestSpace (upToC);
+        for (long k=0; k<upToC; k++) {
+            sp->InsertColumn (theDS->GetSite(k),-1,false);
+            siteAssignments<<-1;
+            overlaps<<0;
+        }
+        sp->SetHeaders   (&theDS->GetNames(),false);
+        if (specFilter) {
+            sp->speciesIndex.Clear();
+            sp->speciesIndex.Duplicate (specFilter);
+        }
+        if (theDS->GetTT()->IsStandardNucleotide()) {
+            sp->SetCharColor ('A',nucDefaults[0],false);
+            sp->SetCharColor ('C',nucDefaults[1],false);
+            sp->SetCharColor ('G',nucDefaults[2],false);
+            sp->SetCharColor ('T',nucDefaults[3],false);
+            sp->SetCharColor ('U',nucDefaults[4],false);
+            sp2->SetCharColor ('A',nucDefaults[0],false);
+            sp2->SetCharColor ('C',nucDefaults[1],false);
+            sp2->SetCharColor ('G',nucDefaults[2],false);
+            sp2->SetCharColor ('T',nucDefaults[3],false);
+            sp2->SetCharColor ('U',nucDefaults[4],false);
+            dataType = HY_DATAPANEL_NUCDATA;
+        } else if (theDS->GetTT()->IsStandardAA()) {
+            for (long k=0; k<20; k++) {
+                sp->SetCharColor  (aminoAcidOneCharCodes.sData[k],aaDefaults[k],false);
+                sp2->SetCharColor (aminoAcidOneCharCodes.sData[k],aaDefaults[k],false);
+            }
+            dataType = HY_DATAPANEL_PROTDATA;
+        } else if (theDS->GetTT()->IsStandardBinary()) {
+            sp->SetCharColor (binaryOneCharCodes.sData[0],nucDefaults[0],false);
+            sp->SetCharColor (binaryOneCharCodes.sData[1],nucDefaults[1],false);
+            dataType = HY_DATAPANEL_BINARYDATA;
+        }
+
+        dataSetName = (_String*)dataSetNamesList (dataSetID);
+        _String     newWindowName ("DataSet ");
+        newWindowName = newWindowName & varName;
+        SetTitle (newWindowName);
+        BuildDataPartitions();
+        _HYRect  screenRect = GetScreenDimensions();
+
+        SetWindowRectangle (0,0,screenRect.bottom-250,screenRect.right-20);
+
+#ifdef __MAC__
+        SetPosition (5,40);
+        screenRect.left     =   5;
+        screenRect.top      =   bottom + 52;
+        screenRect.bottom   -=  10;
+        screenRect.right    =   right+5;
+#else
+        SetPosition (5,5);
+        screenRect.left     = 5;
+        screenRect.top      = bottom + 52;
+        screenRect.bottom   -= 10;
+        screenRect.right    = right+5;
+#endif
+        if (doAutoConsoleMove) {
+            MoveConsoleWindow(screenRect);
+        }
+    }
+}
+
+
+//__________________________________________________________
+
+void    _HYDataPanel::Update (Ptr p)
+{
+    _HYTWindow::Update(p);
+    _HYCanvas* theCanvas = (_HYCanvas*)GetObject (1);
+#ifdef __MAC__
+    forceUpdateForScrolling=true;
+    theCanvas->_MarkForUpdate();
+    forceUpdateForScrolling=false;
+#endif
+    _PaintThermRect();
+}
+
+//__________________________________________________________
+
+void    _HYDataPanel::Activate (void)
+{
+    // check the validity of the trees attached
+    // to the data partitions
+    long    k, f;
+    _String errMsg;
+    _TheTree * thisTree;
+    if (lfID>=0) {
+        for (k=0; k<dataPartitions.lLength; k++) {
+            f = treeVarReferences.lData[k];
+            if (f>=0) {
+                thisTree = (_TheTree*)LocateVar(f);
+                if (!thisTree->AllBranchesHaveModels(((_DataSetFilter*)dataSetFilterList(dataPartitions.lData[k]))->GetDimension(true))) {
+                    errMsg = _String ("Likelihood function was killed b/c some of the tree models were edited/deleted");
+                    ReportWarning (errMsg);
+                    terminateExecution = false;
+                    PurgeLF();
+                    break;
+                }
+            }
+        }
+    }
+
+    for (k=0; k<dataPartitions.lLength; k++) {
+        f = treeVarReferences.lData[k];
+        if (f>=0) {
+            thisTree = (_TheTree*)LocateVar(f);
+            _PMathObj tc = thisTree->TipCount();
+            if (tc->Value()!=((_DataSetFilter*)dataSetFilterList(dataPartitions.lData[k]))->NumberSpecies() &&
+                    (!(tc->Value()==1 && ((_DataSetFilter*)dataSetFilterList(dataPartitions.lData[k]))->NumberSpecies()==2))) {
+                if (errMsg.sLength) {
+                    errMsg = errMsg&',';
+                }
+                errMsg = errMsg & *thisTree->GetName() &'(' & _String((long)tc->Value()) &')';
+                treeVarReferences.lData[k]=-1;
+                _List dummy;
+                RefreshPartRow (dummy,k,true,false);
+
+            }
+            DeleteObject (tc);
+        }
+    }
+
+    if (errMsg.sLength) {
+        errMsg = _String("HyPhy detected that the following trees had their number of leaves changed since this window was last active:")
+                 &errMsg&".\n";
+        StringToConsole (errMsg);
+    }
+
+    _HYTWindow::Activate();
+    UpdatePartitionOperations();
+    _UpdateSelectionChoices(IsSelectionNonEmpty());
+}
+
+//__________________________________________________________
+
+void    _HYDataPanel::Paint (Ptr p)
+{
+    _HYTWindow::Paint(p);
+    _HYCanvas* theCanvas = (_HYCanvas*)GetObject (1);
+#ifdef __MAC__
+    forceUpdateForScrolling=true;
+    theCanvas->_MarkForUpdate();
+    forceUpdateForScrolling=false;
+#endif
+    _PaintThermRect();
+}
+
+
+//__________________________________________________________
+
+bool    _HYDataPanel::BuildDataPanel (void)
+{
+    return true;
+}
+
+//__________________________________________________________
+
+void    _HYDataPanel::ComputeLikelihoodFunction (long option)
+{
+    if (lfID>=0) {
+        if (lfID != lockedLFID) {
+            _LikelihoodFunction *lf = (_LikelihoodFunction*)likeFuncList (lfID);
+            stashParameter (likefuncOutput,option,true);
+            _String* lfStr = (_String*)lf->toStr();
+            _String outString (256L,true);
+            outString << '\n';
+            outString << lfStr;
+            outString << '\n';
+            outString.Finalize();
+            StringToConsole (outString);
+            DeleteObject (lfStr);
+            stashParameter (likefuncOutput,0.0,false);
+        } else {
+            ProblemReport (lfCantKillWarning, (Ptr)this);
+        }
+    }
+}
+
+//__________________________________________________________
+
+void    _HYDataPanel::SimulateDataSet (long option, bool ancestors)
+{
+    if (lfID>=0) {
+        if (lfID != lockedLFID) {
+            _LikelihoodFunction *lf = (_LikelihoodFunction*)likeFuncList (lfID);
+            /*if (ancestors)
+            {
+                if (lf->GetCategoryVars().lLength)
+                {
+                    _String errMsg ("Can't reconstruct ancestors in models with rate variation");
+                    ProblemReport (errMsg, (Ptr)this);
+                    return;
+                }
+            }*/
+            _DataSet * target = new _DataSet;
+            _List      emptyList;
+
+            if (!ancestors) {
+                lf->Simulate (*target, emptyList);
+            } else {
+                _SimpleList allP (lf->CountObjects(0), 0, 1);
+                lf->ReconstructAncestors (*target, allP, empty);
+            }
+
+            if (option==1) { // save to file
+                dialogPrompt = "Save simulated data set to";
+                _String pathName (WriteFileDialogInput());
+                if (pathName.sLength) {
+                    FILE * outfile = doFileOpen (pathName.getStr(),"w");
+                    if (outfile) {
+                        _DataSetFilter dsf;
+                        _SimpleList e1, e2;
+                        dsf.SetFilter (target,1,e1,e2,false);
+                        dsf.toFileStr(outfile);
+                        fclose (outfile);
+                    } else {
+                        ReportWarning (_String("Could not open file '") & pathName & "' for writing.");
+                    }
+                }
+            } else {
+                if (option==2) { // save to file
+                    _String promptString ("10"), folderName ("Number of replicates:");
+                    if (EnterStringDialog (promptString,folderName, (Ptr)this)) {
+                        long nIterates = promptString.toNum();
+                        if (nIterates>0) {
+                            dialogPrompt = "Save simulated data sets to";
+                            folderName = ChooseAFolder(dialogPrompt);
+                            if (folderName.sLength)
+                                for (long k=1; k<=nIterates; k++) {
+                                    if (k>1) {
+                                        DeleteObject (target);
+                                        target = new _DataSet;
+                                        lf->Simulate (*target, emptyList);
+                                    }
+                                    _String fileName = folderName & (*(_String*)dataSetNamesList(dataSetID))&("_sim.") & _String (k);
+                                    FILE * outfile = doFileOpen (fileName.getStr(),"w");
+                                    if (outfile) {
+                                        _DataSetFilter dsf;
+                                        _SimpleList e1, e2;
+                                        dsf.SetFilter (target,1,e1,e2,false);
+                                        dsf.toFileStr(outfile);
+                                        fclose (outfile);
+                                    } else {
+                                        ReportWarning (_String("Could not open file '") & fileName & "' for writing.");
+                                        break;
+                                    }
+                                }
+                        }
+                    }
+                } else {
+                    _String newDataString = (*(_String*)dataSetNamesList(dataSetID));
+                    if (ancestors) {
+                        newDataString = newDataString & "_ancestors";
+                    } else {
+                        newDataString = newDataString & "_sim";
+                    }
+
+                    AddDataSetToList (newDataString, target);
+                    _HYDataPanel* myTWindow = new _HYDataPanel(newDataString,newDataString);
+                    myTWindow->BringToFront();
+                    //myTWindow->Show();
+                    return;
+                }
+            }
+            DeleteObject (target);
+        } else {
+            ProblemReport (lfCantKillWarning, (Ptr)this);
+        }
+    }
+}
+//__________________________________________________________
+
+void    _HYDataPanel::OptimizeLikelihoodFunction (void)
+{
+    if (lfID>=0) {
+        if (lfID!=lockedLFID) {
+            _LikelihoodFunction *lf = (_LikelihoodFunction*)likeFuncList (lfID);
+
+            long                 startingLFEvalsCount = likeFuncEvalCallCount;
+            _PMathObj            startingTime         = _Constant (0.0).Time(),
+                                 endingTime;
+
+            ToggleAnalysisMenu (true);
+            StartBarTimer ();
+            _Matrix* res = lf->Optimize();
+            StopBarTimer  ();
+            ToggleAnalysisMenu (false);
+            terminateExecution = false;
+
+            startingLFEvalsCount = likeFuncEvalCallCount - startingLFEvalsCount;
+            endingTime = _Constant (0.0).Time();
+
+            DeleteObject (res);
+            ComputeLikelihoodFunction (2);
+            char    buffer [1024];
+            snprintf (buffer, sizeof(buffer),"\n\tTime taken = %g seconds\n\tLF evaluations/second = % g\n",
+                     endingTime->Value()-startingTime->Value(),
+                     startingLFEvalsCount/(endingTime->Value()-startingTime->Value()));
+            BufferToConsole (buffer);
+
+            postChangeLFEvent (GetID(),lfID);
+            if (autoPopLFTable) {
+                DisplayParameterTable();
+            }
+
+            ReportAnalysisAsFinished (empty);
+
+        } else {
+            ProblemReport (lfCantKillWarning, (Ptr)this);
+        }
+    }
+}
+
+//__________________________________________________________
+
+void    _HYDataPanel::RestoreSavedLFs (void)
+{
+    if (lfID>=0) {
+        long k = LocateVarByName (savedLFMatrix);
+        if (k>=0) {
+            _Variable* saveLF = FetchVar (k);
+            if (saveLF->ObjectClass() == MATRIX) {
+                _Matrix* saveLFMatrix = (_Matrix*)saveLF->varValue;
+                if (saveLFMatrix->GetVDim()==2) {
+                    for (k=0; k<saveLFMatrix->GetHDim(); k++) {
+                        _PMathObj p1 = ((_Formula**)saveLFMatrix->theData)[2*k]->Compute(),
+                                  p2 = ((_Formula**)saveLFMatrix->theData)[2*k+1]->Compute();
+
+                        if ((p1->ObjectClass() == STRING)&&(p2->ObjectClass() == STRING)) {
+                            savedLFNames  << ((_FString*)p1)->theString;
+                            savedLFStates << ((_FString*)p2)->theString;
+                        }
+
+                    }
+                }
+            }
+            DeleteVariable (savedLFMatrix);
+        }
+    }
+}
+//__________________________________________________________
+
+bool    _HYDataPanel::GenerateGoodPartitions (_SimpleList& goodPartitions)
+{
+    bool retval = false;
+    long k = 0;
+    for (; k<dataPartitions.lLength; k++) {
+        if (modelReferences.lData[k] == 0) {
+            continue;
+        }
+
+        if (treeVarReferences.lData[k]<0) {
+            if (treeVarReferences.lData[k]!=-3) {
+                continue;
+            }
+            goodPartitions << k;
+            retval = true;
+        } else {
+            goodPartitions << k;
+        }
+    }
+    return retval;
+}
+
+//__________________________________________________________
+
+void    _HYDataPanel::InferTopologies (bool useConstr)
+{
+    if (!cantDeleteLF) {
+        bool    needToDoFixed = false;
+        _String pathToFiles = libDirectory&"TopologyInference";
+
+        _List   receptacle,
+                fNames,
+                pathNameList;
+
+        _SimpleList l1,
+                    l2,
+                    l3,
+                    l4;
+
+        if (useConstr) {
+            topConstr                      = empty;
+            _String         dummyTree      = _String ("Tree ")&inferenceDummyTree&" = (0,1);";
+            _ExecutionList  spawnDummyTree (dummyTree);
+            spawnDummyTree.Execute ();
+
+            long            treeID = LocateVarByName (inferenceDummyTree);
+
+            if (treeID < 0) {
+                pathToFiles = "Internal error in InferTopologies - failed to spawn dummy tree.";
+                ProblemReport (pathToFiles);
+                return;
+            }
+
+#ifndef USE_AVL_NAMES
+            treeID = variableReindex.lData[treeID];
+#else
+            treeID = variableNames.GetXtra(treeID);
+#endif
+
+            _SimpleList sillySubset;
+
+            sillySubset << 0;
+            sillySubset << 1;
+
+            BuildLikelihoodFunction (&inferenceDummyLF, &sillySubset, treeID);
+
+            if (lfID < 0) {
+                pathToFiles = "Internal error in InferTopologies - failed to spawn dummy LF.";
+                ProblemReport (pathToFiles);
+                return;
+            } else {
+                _LikelihoodFunction *me = (_LikelihoodFunction*) likeFuncList (lfID);
+
+                _SimpleList    *myTrees = &me->GetTheTrees(),
+                                glVarIDs,
+                                localVarIDs;
+
+
+                _List          treeNames,
+                               globalVars,
+                               localVars,
+                               localVarID,
+                               templateConstraints,
+                               templateConstraintStrings;
+
+                dummyTree =  blMolClock &" tree ID or node ID, variable)";
+                templateConstraintStrings && & dummyTree;
+                dummyTree = "Molecular Clock";
+                templateConstraints && & dummyTree;
+
+                dummyTree =  blReplicate & "\"this1.?.varID:=this2.?.varID\", tree or node id, tree or node id)";
+                templateConstraintStrings && & dummyTree;
+                dummyTree = "Replicate Constraints";
+                templateConstraints && & dummyTree;
+
+                for (treeID = 0; treeID < myTrees->lLength; treeID ++) {
+                    long       counter = 0;
+                    _String    varName;
+
+                    _TheTree*  aTree = (_TheTree*)LocateVar (myTrees->lData[treeID]);
+                    treeNames << aTree->GetName();
+                    glVarIDs.Clear();
+                    {
+                        _AVLList gav (&glVarIDs);
+                        aTree->ScanForGVariables (gav, gav);
+                        gav.ReorderList ();
+                    }
+                    for (counter = 0; counter < glVarIDs.lLength; counter++) {
+                        _Variable* aVar = LocateVar (glVarIDs.lData[counter]);
+                        if (!aVar->IsCategory()) {
+                            globalVars << aVar->GetName();
+                        }
+
+                    }
+                    _SimpleList  localsForTree;
+                    aTree->FindScalingVariables (localsForTree);
+
+                    for (counter = 0; counter < localsForTree.lLength; counter++) {
+                        varName =  * LocateVar (localsForTree.lData[counter])->GetName();
+                        localVarID && & varName;
+                        varName =  varName & " [" & *aTree->GetName() & ']';
+                        localVars && & varName;
+                    }
+                }
+
+                KillLFRecord (lfID);
+                lfID = -1;
+
+                bool resB = false;
+
+                _HYFont def;
+                def.face  = "System Font";
+                def.size  = 12;
+                def.style = HY_FONT_PLAIN;
+
+                _String constrPrompt ("Apply the following tree constraints:");
+
+                _HYInferenceConstraints * sd =
+                    new _HYInferenceConstraints (constrPrompt,localVars, globalVars, treeNames, templateConstraints,
+                                                 localVarID, globalVars, treeNames, templateConstraintStrings,
+                                                 def,&resB,&topConstr, (Ptr)this);
+                sd->Activate();
+                while (windowObjectRefs.Find ((long)sd)>=0) {
+                    handleGUI();
+                }
+
+                if (!resB) {
+                    return;
+                }
+
+            }
+
+            //_String constrPrompt ("Apply the following tree constraints:");
+            //if (!EnterStringDialog (topConstr, constrPrompt, (Ptr)this))
+            //return;
+        }
+
+        char del = ScanDirectoryForFileNames (pathToFiles,receptacle,false);
+
+        for (long k=0; k<receptacle.lLength; k++) {
+            FILE * thisFile = doFileOpen (((_String*)receptacle(k))->sData,"r");
+            if (thisFile) {
+                fclose (thisFile);
+                _String   fName = *(_String*)receptacle(k);
+                long      kk = fName.FindBackwards (del,0,-1);
+                fName.Trim (kk+1,-1);
+                _List      thisFile;
+
+                thisFile && & fName;
+                thisFile && & fName;
+
+                l1 << fNames.lLength;
+                l4 << k;
+                fNames && & thisFile;
+                _String  tts (*(_String*)receptacle(k),0,kk);
+                pathNameList && & tts;
+            }
+        }
+
+        if (fNames.lLength == 0) {
+            pathToFiles = "Could not infer topologies, because inference modules could not be found. Check you distribution for missing files.";
+            ProblemReport (pathToFiles, (Ptr)this);
+            return;
+        }
+
+        if (omittedSeqs.lLength) {
+            pathToFiles = "Can't infer topologies when some sequences of the original data set have been omitted. Consider saving the smaller data set as a separate file, and running topology reconstuction on the smaller data set.";
+            ProblemReport (pathToFiles, (Ptr)this);
+            return;
+        }
+
+        l2 << 0;
+        l2 << 1;
+
+        long        choice = HandleListSelection (fNames, l2, l1, "Inference Method", l3, 1);
+
+        if (choice>=0) {
+            _String infFile (1024L,true);
+            infFile << inferenceNofSeqs;
+            infFile << "=";
+            infFile << _String ((long) ((_DataSet*)dataSetList (dataSetID))->GetNames().lLength);
+            infFile << ";\n";
+            infFile << inferenceDWID;
+            infFile << "=\"";
+            infFile << GetTitle();
+            infFile << "\";\n";
+
+            pathNames << pathNameList (choice);
+
+            _SimpleList  stashedTrees,
+                         stashedTreeIDs;
+
+            long         g;
+
+
+            FILE * thisFile = doFileOpen (((_String*)receptacle (l4.lData[choice]))->getStr(),"rb");
+            if (!thisFile) {
+                pathToFiles = "Could not infer topologies, because the selected inference module could not be read. It may have been deleted.";
+                ProblemReport (pathToFiles, (Ptr)this);
+                infFile.Finalize();
+                return;
+            }
+            infFile << _String (thisFile);
+            fclose (thisFile);
+            infFile.Finalize();
+            infFile = infFile.Replace (inferenceDSID, *(_String*)dataSetNamesList (dataSetID), true);
+
+
+            g = batchLanguageFunctionNames.lLength;
+
+            _ExecutionList infL (infFile);
+
+            if (terminateExecution) {
+                terminateExecution = false;
+                return;
+            }
+
+            SetLockState        (true);
+
+            VerbosityLevel ();
+            ToggleAnalysisMenu  (true);
+            StartBarTimer       ();
+            infL.ExecuteAndClean(g);
+            StopBarTimer        ();
+            ToggleAnalysisMenu  (false);
+
+            pathNames.Delete    (pathNames.lLength-1);
+
+            if (terminateExecution) {
+                terminateExecution = false;
+            } else {
+                if (inferCache.lLength) {
+                    long iCount = 0;
+                    _HYTable*       pl = (_HYTable*)GetObject (5);
+
+                    KillLFRecord (lfID,false);
+
+                    _String      alteredTopConstr = topConstr;
+
+                    for (g=0; g<dataPartitions.lLength; g++) {
+                        if (treeVarReferences[g] == -3) {
+#ifndef USE_AVL_NAMES
+                            treeVarReferences[g] = variableReindex.lData[LocateVarByName(*(_String*)inferCache(iCount))];
+#else
+                            treeVarReferences[g] = variableNames.GetXtra(LocateVarByName(*(_String*)inferCache(iCount)));
+#endif
+
+                            pl->SetCellData ((_String*)inferCache(iCount),g,DF_TREE_COLUMN,pl->cellTypes.lData[g*pl->horizontalSpaces.lLength+DF_TREE_COLUMN],true);
+
+                            pl->_MarkCellForUpdate (g*pl->horizontalSpaces.lLength+DF_TREE_COLUMN);
+
+                            if (topConstr.sLength)
+                                alteredTopConstr = alteredTopConstr.Replace (*(_String*)dataSetFilterNamesList (inferCacheDF.lData[iCount]),
+                                                   *(_String*)dataSetFilterNamesList (dataPartitions.lData[g]),
+                                                   true);
+
+                            KillDataFilterRecord (inferCacheDF.lData[iCount++]);
+                        }
+                    }
+
+                    lfID = -1;
+
+                    if (!needToDoFixed)
+                        for (g = 0; g<stashedTrees.lLength; g++) {
+                            treeVarReferences.lData[stashedTrees.lData[g]] = stashedTreeIDs.lData[g];
+                        }
+
+                    stashedTrees.Clear();
+
+                    BuildLikelihoodFunction ();
+                    if (topConstr.sLength) {
+                        _String        dtc    (alteredTopConstr);
+                        _ExecutionList constr (dtc);
+                        constr.Execute();
+                        terminateExecution = false;
+                    }
+                    OptimizeLikelihoodFunction ();
+                    inferCache.Clear();
+                    inferCacheDF.Clear();
+                    SetLockState (false);
+                    return;
+                } else {
+                    pathToFiles = "Tree inference failed.";
+                    ProblemReport (pathToFiles, (Ptr)this);
+                }
+            }
+
+
+            SetLockState (false);
+            _HYTable* pl = (_HYTable*)GetObject (5);
+            _SimpleList changedCells;
+
+            for (long k=DF_ID_COLUMN; k<pl->cellTypes.lLength; k+=pl->horizontalSpaces.lLength) {
+                if (pl->cellTypes.lData[k] & HY_TABLE_BOLD) {
+                    pl->cellTypes.lData[k] &= (0xffffffff-HY_TABLE_BOLD);
+                    changedCells << k;
+                    treeVarReferences.lData[k/pl->horizontalSpaces.lLength] = -3;
+                }
+            }
+
+            pl->_MarkCellsForUpdate (changedCells);
+
+            for (g = 0; g<stashedTrees.lLength; g++) {
+                treeVarReferences.lData[stashedTrees.lData[g]] = stashedTreeIDs.lData[g];
+            }
+
+            if (lfID>=0) {
+                KillLFRecord (lfID);
+            }
+
+            lfID = -1;
+        }
+    }
+}
+
+//__________________________________________________________
+
+void    _HYDataPanel::BuildLikelihoodFunction (_String* lName, _SimpleList* subset, long treeRef)
+{
+    _String     errMsg;
+    if (dataPartitions.lLength==0) {
+        errMsg = _String("I can't create the likelihood function without at least one partition defined.");
+        ProblemReport (errMsg,(Ptr)this);
+        return;
+    }
+
+    long            k=0,
+                    g,
+                    l,
+                    inferCount  = 0,
+                    treeRefID   = 0;
+
+
+    _SimpleList     goodPartitions;
+
+    _List           cachedTreeNames;
+
+    bool            infer = GenerateGoodPartitions (goodPartitions);
+
+    if (infer && (!subset)) {
+        InferTopologies ();
+        return;
+    }
+
+    if (goodPartitions.lLength==0) {
+        errMsg = _String ("I can't build the likelihood function because no partition has both a tree and a model attached to it.");
+        ProblemReport (errMsg,(Ptr)this);
+        return;
+    }
+
+    if (lfID>=0) {
+        if (lfID != lockedLFID) {
+            errMsg = _String("There already exists a likelihood function for this data set. Would you like to rebuild the likelihood function now?");
+            if (treeRef < 0) {
+                if (ProceedPrompt (errMsg, (Ptr)this)) {
+                    bool saveWLF = warnKillLF;
+                    warnKillLF = true;
+                    PurgeLF();
+                    warnKillLF = saveWLF;
+                } else {
+                    return;
+                }
+            }
+        } else {
+            ProblemReport (lfCantKillWarning, (Ptr)this);
+            return;
+        }
+    }
+    // all is good; we can build a likelihood function
+    // go through the partitions and define the models one by one
+
+    _DataSetFilter* thisPartition;
+
+    _List           treesList,
+                    otherTreeList;
+
+    for (l=0; l<likeFuncNamesList.lLength; l++)
+        if (((_String*)likeFuncNamesList(l))->sLength) {
+            _SimpleList * otherTrees = &((_LikelihoodFunction*) likeFuncList (l))->GetTheTrees();
+            for (k = 0; k < otherTrees->lLength; k++) {
+                otherTreeList << LocateVar(otherTrees->lData[k])->GetName();
+            }
+        }
+
+    for (l=0; l<dataPartitions.lLength; l++)
+        if (treeVarReferences.lData[l]>=0) {
+            cachedTreeNames << LocateVar (treeVarReferences.lData[l])->GetName();
+        } else {
+            cachedTreeNames && & empty;
+        }
+
+    _HYTable*       pl = (_HYTable*)GetObject (5);
+
+    for (l=0; l<goodPartitions.lLength; l++) {
+        k = goodPartitions.lData[l];
+
+        treeRefID = treeVarReferences.lData[k];
+
+        long        partIDVal;
+
+        if (treeRefID >= 0) {
+            partIDVal = dataPartitions.lData[k];
+            thisPartition = (_DataSetFilter*)dataSetFilterList (partIDVal);
+        } else {
+            if (inferCount < inferCacheDF.lLength) {
+                thisPartition = (_DataSetFilter*)dataSetFilterList (inferCacheDF.lData[inferCount]);
+            } else {
+                thisPartition = new _DataSetFilter ();
+                checkPointer (thisPartition);
+                _String         tempFilterName ("TempFilter");
+                inferCacheDF  << AddFilterToList (tempFilterName, thisPartition);
+            }
+
+            _DataSetFilter   *  refFilter = (_DataSetFilter*)dataSetFilterList (dataPartitions.lData[k]);
+            _SimpleList         vList,
+                                hList (*subset);
+
+            thisPartition->SetFilter((_DataSet*)refFilter,refFilter->GetUnitLength(), hList, vList, true);
+
+            hList.Duplicate (&refFilter->theExclusions);
+            if (hList.lLength) {
+                _String *string = GetExclusionsFromExcList (&hList);
+                thisPartition->SetExclusions (string);
+                DeleteObject (string);
+            }
+
+            partIDVal = inferCacheDF.lData[inferCount];
+        }
+
+        int model,
+            options,
+            freqs,
+            classes;
+
+        LongToModelData (modelReferences.lData[k],model,options,freqs,classes);
+        _List*     theModel = FindModelTemplate (model-1,thisPartition->GetDimension());
+        _String*   modelDef = nil;
+        if (theModel) {
+            FILE * thisModel = doFileOpen (((_String*)(*theModel)(2))->getStr(),"rb");
+            if (thisModel) {
+                modelDef = new _String (thisModel);
+                fclose (thisModel);
+                _String ident, ident2, ident3;
+                *modelDef = _String ("modelType=")&_String ((long)options)&';'&*modelDef;
+                ident = *(_String*)dataSetFilterNamesList (partIDVal) & "_Shared";
+                if (!infer) {
+                    FindUnusedObjectName (errMsg, ident, variableNames,true);
+                }
+
+                *modelDef = modelDef->Replace (globalPrefix,ident,true);
+                if (options) {
+                    if (options>1) {
+                        ident = *(_String*)dataSetFilterNamesList (partIDVal) & "_Categ";
+                        if (!infer) {
+                            FindUnusedObjectName (errMsg, ident, variableNames,true);
+                        }
+                        *modelDef = modelDef->Replace (categoryPrefix,ident,true);
+
+                        ident = *(_String*)dataSetFilterNamesList (partIDVal) & "_Shape";
+                        if (!infer) {
+                            FindUnusedObjectName (errMsg, ident, variableNames,true);
+                        }
+                        *modelDef = modelDef->Replace ("shapeParameter",ident,true);
+
+                        ident = _String ((long)(classes));
+                        *modelDef = modelDef->Replace ("rateClassCount",ident,true);
+                    }
+                }
+                ident = *(_String*)dataSetFilterNamesList (partIDVal) & "_Freqs";
+
+                if (!infer) {
+                    FindUnusedObjectName (errMsg, ident, variableNames,true);
+                }
+
+                switch (freqs) {
+                case 0: // partition
+                    *modelDef = *modelDef & "\nHarvestFrequencies("&ident&','&
+                                *(_String*)dataSetFilterNamesList (partIDVal)&","& (long)thisPartition->GetUnitLength() &",1,1);";
+                    break;
+                case 1: // dataset
+                    *modelDef = *modelDef & "\nHarvestFrequencies("&ident&','&
+                                *(_String*)dataSetNamesList (dataSetID)&","& (long)thisPartition->GetUnitLength() &",1,1);";
+                    break;
+                case 2: { // equal
+                    long                        colDim =    thisPartition->GetUnitLength(),
+                                                rowDim =    (colDim==1) ?
+                                                            thisPartition->GetDimension():
+                                                            thisPartition->GetData()->GetCharDimension();
+
+                    _Matrix                     eqMatrix (rowDim,colDim,false,true);
+                    _Parameter                  fe        = 1./rowDim;
+
+                    for (long r = 0; r < rowDim; r++)
+                        for (long c=0; c<colDim; c++) {
+                            eqMatrix.Store(r,c,fe);
+                        }
+
+                    *modelDef = *modelDef & '\n' & ident & '=' & _String((_String*)eqMatrix.toStr()) & ';';
+                }
+                break;
+                case 3: { // estimate
+                    ident2 = ident & "_emp";
+
+                    if (!infer) {
+                        FindUnusedObjectName (errMsg,ident2,variableNames,true);
+                    }
+
+                    ident3 = *(_String*)dataSetFilterNamesList (partIDVal) & "_EstFreq";
+
+                    if (!infer) {
+                        FindUnusedObjectName (errMsg,ident3,variableNames,true);
+                    }
+
+                    *modelDef = modelDef->Replace ("frequencyVariable",ident3,true);
+                    *modelDef = *modelDef & "\nHarvestFrequencies("&ident2&','&
+                                *(_String*)dataSetFilterNamesList (partIDVal)&",1,1,1);";
+
+                    *modelDef = *modelDef & '\n' & ident &" = 0;\ndummy = " & efvFunction & "(\"" &
+                                ident & "\"," & ident2 & ");";
+                }
+                break;
+                case 4: { // model spec
+                    *modelDef = modelDef->Replace (dataPartitionIDString,*(_String*)dataSetFilterNamesList (partIDVal),true);
+                    *modelDef = modelDef->Replace (dataSetIDString,*(_String*)dataSetNamesList (dataSetID),true);
+                    *modelDef = modelDef->Replace (modelEFVVector,ident,true);
+                    *modelDef = *modelDef & "dummy=" & userModelEFV & "(0);\n";
+                }
+                break;
+                }
+                // if codon, then create genetic code vector
+                if (thisPartition->GetUnitLength()==3) {
+                    _String * genT = GetMatrixFromCode ((partData.lData[k]&HY_DATAPANEL_CODEMASK)>>16);
+                    *modelDef = *modelDef & '\n'  &modelGenCode & '=' & *genT &';' &  modelMatrixDimension & "=0;\n";
+                    DeleteObject (genT);
+                }
+
+                ident2 = *(_String*)dataSetFilterNamesList (partIDVal) & '_'& *((_String*)(*theModel)(0));
+                if (!infer) {
+                    FindUnusedObjectName (ident, ident2, variableNames,true);
+                }
+
+                ident3 = ident2 & "_model";
+                if (!infer) {
+                    FindUnusedObjectName (ident, ident3, modelNames);
+                }
+
+                if (freqs<4) {
+                    *modelDef = *modelDef & '\n' & ident2 &" = 0;\n"&multiplyByFrequencies&'=' & modelFunction & "(\"" & ident2 & "\"," & ident & ");";
+                } else {
+                    *modelDef = *modelDef & '\n' & ident2 &" = 0;\ndummy=" & modelFunction & "(\"" & ident2 & "\"," & ident & ");";
+                }
+
+                if (thisPartition->GetUnitLength()>1) {
+                    *modelDef = *modelDef & '\n' & ident & '=' & buildCodonFrequencies & '(' & ident & ");";
+                }
+                *modelDef = *modelDef & "\nModel "& ident3 & "=("& ident2 &','& ident & ','& multiplyByFrequencies&");";
+
+                /*FILE * flfl = doFileOpen ("debug.dump","w");
+                fprintf (flfl,"%s\n", modelDef->getStr());
+                fclose (flfl);*/
+
+                _Variable *thisTree;
+
+                _String   *treeString,
+                          treeName;
+
+                if (treeRefID>=0) {
+                    thisTree = FetchVar(LocateVarByName (*(_String*)cachedTreeNames (k)));
+
+                    treeString = (_String*) thisTree->toStr();
+                    treeName   = *thisTree->GetName();
+
+                    if (!(infer && inferCache.lLength))
+                        if ((treesList.Find (&treeName)>=0)||(otherTreeList.Find (&treeName)>=0)) {
+                            _String  os (128L, true);
+                            os << "\nTree topology";
+                            os << treeName;
+                            os << " was cloned for partition ";
+                            os << ((_String*)dataSetFilterNamesList (dataPartitions.lData[k]));
+                            os.Finalize ();
+                            StringToConsole (os);
+
+                            FindUnusedObjectName (treeName,treeName,variableNames,true);
+                            pl->SetCellData (&treeName,k,DF_TREE_COLUMN,pl->cellTypes.lData[k*pl->horizontalSpaces.lLength+DF_TREE_COLUMN],true);
+                            pl->_MarkCellForUpdate (k*pl->horizontalSpaces.lLength+DF_TREE_COLUMN);
+                        }
+
+                } else {
+                    thisTree = LocateVar (treeRef);
+
+                    treeString = (_String*) thisTree->toStr(),
+                    treeName   = *(_String*)dataSetNamesList (dataSetID) & '_' & *thisTree->GetName();
+
+                    if (inferCount < inferCache.lLength) {
+                        treeName = *(_String*)inferCache (inferCount);
+                    } else {
+                        if ((treesList.Find (&treeName)>=0)||(otherTreeList.Find (&treeName)>=0)) {
+                            FindUnusedObjectName (treeName,treeName,variableNames,true);
+                        }
+
+                        inferCache && & treeName;
+                    }
+                    inferCount ++;
+                }
+
+                treesList && &treeName;
+                *modelDef = *modelDef & "\nTree " & treeName & '=' & *treeString;
+                DeleteObject (treeString);
+
+                g = batchLanguageFunctionNames.lLength;
+
+                _ExecutionList      ex;
+                ex.BuildList (*modelDef);
+                ex.ExecuteAndClean(g);
+                if (terminateExecution) {
+                    terminateExecution = false;
+                    DeleteObject (modelDef);
+                    return;
+                }
+
+                if (treeRefID>=0)
+#ifndef USE_AVL_NAMES
+                    treeVarReferences.lData[k]=variableReindex.lData[LocateVarByName(treeName)];
+#else
+                    treeVarReferences.lData[k]=variableNames.GetXtra(LocateVarByName(treeName));
+#endif
+            }
+        }
+        // finally write the likelihood function
+        if (!(theModel&&modelDef)) {
+            errMsg = _String ("I can't build the likelihood function because partition '")&
+                     *(_String*)dataSetFilterNamesList(partIDVal)& _String("'s model definition file couldn't be found/read. ")&
+                     ReportThisError;
+            ProblemReport (errMsg,(Ptr)this);
+            return;
+        }
+        thisPartition->SetDimensions();
+        thisPartition->SetupConversion();
+        DeleteObject (modelDef);
+    }
+
+    if ( lName ) {
+        errMsg = *lName;
+    } else {
+        errMsg = *(_String*)dataSetNamesList (dataSetID)&"_LF";
+    }
+
+    if (!infer) {
+        FindUnusedObjectName (errMsg, errMsg, likeFuncNamesList);
+    }
+
+    _String   lfSetup ((unsigned long)32,true);
+    lfSetup << "\nLikelihoodFunction ";
+    lfSetup << &errMsg;
+    lfSetup << '=';
+    lfSetup << '(';
+
+    inferCount = 0;
+
+    for (l=0; l<goodPartitions.lLength; l++) {
+        k = goodPartitions.lData[l];
+        if (l) {
+            lfSetup<<',';
+        }
+
+        long        treeRefID = treeVarReferences.lData[k];
+
+        if (treeRefID >= 0) {
+            treeRefID = dataPartitions.lData[k];
+        } else {
+            treeRefID = inferCacheDF.lData[inferCount++];
+        }
+
+        lfSetup << (_String*)dataSetFilterNamesList(treeRefID);
+        lfSetup << ',';
+        lfSetup << (_String*)treesList(l);
+        k *= pl->horizontalSpaces.lLength;
+        k ++;
+        if (!(pl->cellTypes.lData[k]&HY_TABLE_BOLD)) {
+            pl->cellTypes.lData[k]|=HY_TABLE_BOLD;
+            pl->_MarkCellForUpdate (k);
+        }
+    }
+    lfSetup << ')';
+    lfSetup << ';';
+    lfSetup.Finalize();
+    _ExecutionList      ex;
+    ex.BuildList (lfSetup);
+    ex.Execute();
+    if (terminateExecution) {
+        if (!subset) {
+            terminateExecution = false;
+        }
+        return;
+    }
+
+    _PaintThermRect();
+
+    lfID = likeFuncNamesList.Find (&errMsg);
+
+    if (!infer) {
+        _LikelihoodFunction *lf = (_LikelihoodFunction*)likeFuncList (lfID);
+
+        char    buffer [1024];
+
+        snprintf (buffer, sizeof(buffer),"\nCreated likelihood function '%s' with\n %ld\tpartitions,\n %ld\tshared parameters,\n %ld\tlocal parameters,\n %ld\tconstrained parameters.\n",
+                 errMsg.getStr(), lf->CountObjects (0),  lf->CountObjects (1),  lf->CountObjects (2),  lf->CountObjects (3));
+
+        BufferToConsole (buffer);
+
+        lf->ComputePruningEfficiency (k,g);
+        snprintf (buffer, sizeof(buffer),"\nPruning efficiency %ld vs %ld (%g %% savings)\n", g,k, 100.-g*100./k);
+        BufferToConsole (buffer);
+    } else {
+        if (topConstr.sLength) {
+            _String        dtc    (topConstr);
+            _ExecutionList constr (dtc);
+            constr.Execute();
+            if (terminateExecution) {
+                errMsg = "Problems with topology constraints; tree inference failed.";
+                ProblemReport (errMsg);
+            }
+        }
+    }
+
+    long verbLebel = VerbosityLevel ();
+    ApplyPreferences();
+    setParameter (VerbosityLevelString,verbLebel);
+    SetStatusBarValue (-1,1,0);
+    SetStatusLine ("Idle");
+
+    _HYButtonBar*       bb = (_HYButtonBar*)GetObject (2);
+    bb->EnableButton (8,true);
+
+    _UpdateLFMenu();
+    ReportAnalysisAsFinished("Likelihood function build finished");
+    postLFSpawnEvent (GetID(),lfID);
+}
+
+//__________________________________________________________
+
+long    _HYDataPanel::SpawnLikelihoodFunction (_DataSet* ds, _String* dsName, _List& partitionCache, _SimpleList& sequenceCache, _SimpleList* remapper, _SimpleList* seqMap)
+{
+    if (lfID>=0) {
+        _String         errMsg;
+        _DataSetFilter* thisPartition;
+        long            k,g;
+        int             model,options,freqs,classes;
+
+        bool            restore = (partitionCache.lLength>0);
+
+
+        _SimpleList     goodPartitions;
+        GenerateGoodPartitions (goodPartitions);
+
+        long            globalOffset = 0;
+
+        for (long j=0; j<goodPartitions.lLength; j++) {
+            k = goodPartitions.lData[j];
+            thisPartition = (_DataSetFilter*)dataSetFilterList (dataPartitions.lData[k]);
+            _SimpleList  vSpec,
+                         hSpec,
+                         excl (thisPartition->theExclusions);
+
+            if (restore) {
+                hSpec.Duplicate (&sequenceCache);
+                vSpec.Duplicate (partitionCache(j));
+            } else {
+                partitionCache && & thisPartition->theOriginalOrder;
+                if (sequenceCache.lLength==0) {
+                    sequenceCache.Duplicate (&thisPartition->theNodeMap);
+                }
+
+                if (seqMap) {
+                    hSpec.Duplicate (seqMap);
+                } else {
+                    for (g=0; g<thisPartition->theNodeMap.lLength; g++) {
+                        hSpec << g;
+                    }
+                }
+
+                if (remapper) {
+                    /* this will break if the null and the alternative
+                       span different ranges of sites
+                    */
+                    for (g = 0; g < thisPartition->theOriginalOrder.lLength; g++) {
+                        vSpec << remapper->lData[thisPartition->theOriginalOrder[g]];
+                    }
+                } else
+                    for (g=0; g<thisPartition->theOriginalOrder.lLength; g++) {
+                        vSpec << globalOffset+g;
+                    }
+
+
+                globalOffset += thisPartition->theOriginalOrder.lLength;
+            }
+
+
+            thisPartition->SetFilter (ds,thisPartition->GetUnitLength(),hSpec,vSpec,false);
+
+            if (excl.lLength) {
+                _String *string = GetExclusionsFromExcList (&excl);
+                thisPartition->SetExclusions (string, false);
+                DeleteObject (string);
+            }
+
+            LongToModelData (modelReferences.lData[k],model,options,freqs,classes);
+
+            if (freqs<2) {
+                _List*     theModel = FindModelTemplate (model-1,thisPartition->GetDimension());
+                _String*   modelDef = nil;
+
+                if (theModel) {
+                    FILE * thisModel = doFileOpen (((_String*)(*theModel)(2))->getStr(),"rb");
+                    if (thisModel) {
+                        modelDef = new _String (thisModel);
+                        fclose (thisModel);
+
+                        _SimpleList modelID;
+                        _TheTree*   thisTree = (_TheTree*)LocateVar (treeVarReferences.lData[k]);
+                        thisTree->CompileListOfModels (modelID);
+
+                        g = modelFrequenciesIndices.lData[modelID.lData[0]];
+                        if (g<0) {
+                            g = -g-1;
+                        }
+
+                        _String ident = *LocateVar(g)->GetName();
+
+                        switch (freqs) {
+                        case 0: // partition
+                            *modelDef = *modelDef & "\nHarvestFrequencies("&ident&','&
+                                        *(_String*)dataSetFilterNamesList (dataPartitions.lData[k])&",1,1,1);";
+                            break;
+                        case 1: // dataset
+                            *modelDef = *modelDef & "\nHarvestFrequencies("&ident&','&
+                                        *dsName&",1,1,1);";
+                            break;
+                        }
+                        // if codon, then create genetic code vector
+                        if (thisPartition->GetUnitLength()==3) {
+                            _String * genT = GetMatrixFromCode ((partData.lData[k]&HY_DATAPANEL_CODEMASK)>>16);
+                            *modelDef = *modelDef & '\n'  &modelGenCode & '=' & *genT &';';
+                            DeleteObject (genT);
+
+                        }
+                        if (thisPartition->GetUnitLength()==3) {
+                            *modelDef = *modelDef & '\n' & ident & '=' & buildCodonFrequencies & '(' & ident & ");";
+                        }
+
+                        g = batchLanguageFunctionNames.lLength;
+
+                        _ExecutionList      ex;
+                        ex.BuildList (*modelDef);
+                        ex.ExecuteAndClean(g);
+                        if (terminateExecution) {
+                            terminateExecution = false;
+                            DeleteObject (modelDef);
+                            return -1;
+                        }
+                    }
+                }
+                DeleteObject (modelDef);
+            }
+            thisPartition->SetDimensions();
+            thisPartition->SetupConversion();
+        }
+
+        _LikelihoodFunction * thisLF = (_LikelihoodFunction*)likeFuncList (lfID);
+        thisLF->Rebuild();
+        long verbLebel = VerbosityLevel ();
+        ApplyPreferences();
+        setParameter (VerbosityLevelString,verbLebel);
+        SetStatusBarValue (-1,1,0);
+        SetStatusLine ("Idle");
+        return  lfID;
+    }
+    return -1;
+}
+
+//__________________________________________________________
+
+void    _HYDataPanel::RefreshCategoryVars (void)
+{
+    if (lfID>=0) {
+        _SimpleList * cVars = &((_LikelihoodFunction*)likeFuncList (lfID))->GetCategoryVars();
+        for (long k=0; k<cVars->lLength; k++) {
+            ((_CategoryVariable*)LocateVar(cVars->lData[k]))->Refresh(true);
+        }
+    }
+}
+
+
+//__________________________________________________________
+
+long    _HYDataPanel::SpawnLikelihoodFunctionNP (_List& cachedPartitions, bool permute)
+{
+    if (lfID>=0) {
+        _String         errMsg;
+        _DataSetFilter* thisPartition;
+        _DataSet*       ds = (_DataSet*)dataSetList (dataSetID);
+        long            k,g;
+        int             model,options,freqs,classes;
+        bool            restore = (cachedPartitions.lLength > 0);
+
+
+        _SimpleList     goodPartitions;
+        GenerateGoodPartitions (goodPartitions);
+
+        for (long j=0; j<goodPartitions.lLength; j++) {
+            k = goodPartitions.lData[j];
+            thisPartition = (_DataSetFilter*)dataSetFilterList (dataPartitions.lData[k]);
+            _SimpleList  vSpec      ,
+                         hSpec       (thisPartition->theNodeMap),
+                         excl        (thisPartition->theExclusions);
+
+            if (restore) {
+                vSpec.Duplicate (cachedPartitions(j));
+            } else {
+                vSpec.Duplicate (&thisPartition->theOriginalOrder);
+                if (permute) {
+                    vSpec.Permute (thisPartition->GetUnitLength());
+                } else {
+                    vSpec.PermuteWithReplacement (thisPartition->GetUnitLength());
+                }
+                cachedPartitions && &thisPartition->theOriginalOrder;
+            }
+
+            thisPartition->SetFilter (ds,thisPartition->GetUnitLength(),hSpec,vSpec,false);
+
+            if (excl.lLength) {
+                _String *string = GetExclusionsFromExcList (&excl);
+                thisPartition->SetExclusions (string, false);
+                DeleteObject (string);
+            }
+
+            LongToModelData (modelReferences.lData[k],model,options,freqs,classes);
+
+            if (freqs==0) {
+                _List*     theModel = FindModelTemplate (model-1,thisPartition->GetDimension());
+                _String*   modelDef = nil;
+
+                if (theModel) {
+                    FILE * thisModel = doFileOpen (((_String*)(*theModel)(2))->getStr(),"rb");
+                    if (thisModel) {
+                        modelDef = new _String (thisModel);
+                        fclose (thisModel);
+
+                        _SimpleList modelID;
+                        _TheTree*   thisTree = (_TheTree*)LocateVar (treeVarReferences.lData[k]);
+                        thisTree->CompileListOfModels (modelID);
+
+                        g = modelFrequenciesIndices.lData[modelID.lData[0]];
+                        if (g<0) {
+                            g = -g-1;
+                        }
+
+                        _String ident = *LocateVar(g)->GetName();
+
+                        *modelDef = *modelDef & "\nHarvestFrequencies("&ident&','&
+                                    *(_String*)dataSetFilterNamesList (dataPartitions.lData[k])&",1,1,1);";
+
+                        // if codon, then create genetic code vector
+                        if (thisPartition->GetUnitLength()==3) {
+                            _String * genT = GetMatrixFromCode ((partData.lData[k]&HY_DATAPANEL_CODEMASK)>>16);
+                            *modelDef = *modelDef & '\n'  &modelGenCode & '=' & *genT &';';
+                            DeleteObject (genT);
+
+                        }
+                        if (thisPartition->GetUnitLength()==3) {
+                            *modelDef = *modelDef & '\n' & ident & '=' & buildCodonFrequencies & '(' & ident & ");";
+                        }
+
+                        g = batchLanguageFunctionNames.lLength;
+
+                        _ExecutionList      ex;
+                        ex.BuildList (*modelDef);
+                        ex.Execute();
+                        if (terminateExecution) {
+                            terminateExecution = false;
+                            DeleteObject (modelDef);
+                            return -1;
+                        }
+
+                        while (g<batchLanguageFunctionNames.lLength) {
+                            batchLanguageFunctionNames.Delete (g);
+                            batchLanguageFunctionParameters.Delete (g);
+                            batchLanguageFunctions.Delete(g);
+                            batchLanguageFunctionParameterLists.Delete(g);
+                            batchLanguageFunctionClassification.Delete(g);
+                        }
+
+                    }
+                }
+                DeleteObject (modelDef);
+            }
+            thisPartition->SetDimensions();
+            thisPartition->SetupConversion();
+        }
+
+        _LikelihoodFunction * thisLF = (_LikelihoodFunction*)likeFuncList (lfID);
+        thisLF->Rebuild();
+        long verbLebel = VerbosityLevel ();
+        ApplyPreferences();
+        setParameter (VerbosityLevelString,verbLebel);
+        SetStatusBarValue (-1,1,0);
+        SetStatusLine ("Idle");
+        return  lfID;
+    }
+    return -1;
+}
+//__________________________________________________________
+void    _HYDataPanel::ConstructDataTypeOptions (_List& options)
+{
+    if (dataType&HY_DATAPANEL_NUCDATA) {
+        options && & nucDataType;
+        options && & dinucDataType;
+        options && & codonDataType;
+    } else if (dataType&HY_DATAPANEL_PROTDATA) {
+        options && & proteinDataType;
+    } else if (dataType&HY_DATAPANEL_BINARYDATA) {
+        options && & binaryDataType;
+        options && & disequonDataType;
+    } else {
+        options && & unknownDataType;
+    }
+
+}
+//__________________________________________________________
+void    _HYDataPanel::BuildDataPartitions (void)
+{
+    if (dataSetID>=0) {
+        _DataSet *theDS = (_DataSet*)dataSetList (dataSetID);
+        _HYSequencePane* sp = (_HYSequencePane*)GetObject (0);
+
+        for (long k=0; k<dataSetFilterList.lLength; k++) {
+            _DataSetFilter * thisDF = (_DataSetFilter*) dataSetFilterList (k);
+            if (thisDF && thisDF->GetData()==theDS) {
+                if (thisDF->theNodeMap.Equal (sp->speciesIndex)) {
+                    AddPartition(thisDF);
+                }
+            }
+        }
+        /* add missing species to the 'omitted list'*/
+        if (sp->speciesIndex.lLength<theDS->NoOfSpecies()) {
+            _SimpleList sorted;
+            sorted.Duplicate (&sp->speciesIndex);
+            sorted.Sort();
+            long   shift = 0;
+            for (long k=0; k<sorted.lLength; k++,shift++) {
+                while (sorted.lData[k]>shift) {
+                    omittedSeqs<<shift;
+                    shift++;
+                }
+            }
+        }
+        GenerateStatusLine();
+    }
+}
+
+//__________________________________________________________
+bool    _HYDataPanel::ConfirmClose (void)
+{
+    if ((lfID>=0)&&(lfID == lockedLFID)) {
+        ProblemReport (lfCantKillWarning, (Ptr)this);
+        return false;
+    }
+
+    if ((tainted)||((filePath.sLength==0)&&(savePath.sLength==0))) {
+        _String warnMessage ("Would you like to save partitioning info before '");
+        warnMessage = warnMessage & GetTitle() & "' is closed?";
+        char    res = YesNoCancelPrompt(warnMessage);
+        if (res!=2) {
+            if (res==1)
+                // generate the save
+            {
+                if (!SaveDataPanel (savePath.sLength)) {
+                    return false;
+                }
+            }
+        } else {
+            return false;
+        }
+    }
+
+    // check to see if standard analyses made use of this data set
+
+    for (long k2 = likeFuncList.lLength-1; k2 >= 0; k2--) {
+        if (k2 != lfID && likeFuncList(k2)) {
+            if (((_LikelihoodFunction*)likeFuncList(k2))-> DependOnDS (dataSetID)>=0) {
+                postLFKillEvent (GetID(),k2);
+                KillLFRecord (k2);
+            }
+        }
+    }
+
+    if (lfID>=0) {
+        postLFKillEvent (GetID(),lfID);
+        KillLFRecord (lfID);
+        lfID = -1;
+    }
+
+
+    for (long k=0; k<treeVarReferences.lLength; k++)
+        if (treeVarReferences.lData[k]>=0) {
+            _TheTree * thisTree = (_TheTree*)LocateVar(treeVarReferences.lData[k]);
+            if (thisTree) {
+                postTreeKillEvent (GetID(),treeVarReferences.lData[k]);
+                handleGUI();
+                DeleteVariable (*thisTree->GetName());
+            }
+        }
+
+    for (long k=0; k<dataPartitions.lLength; k++) {
+        KillDataFilterRecord (dataPartitions.lData[k]);
+    }
+
+    KillDataSetRecord (dataSetID);
+
+    return true;
+}
+
+//__________________________________________________________
+_DataSet*   _HYDataPanel::GenerateOrderedDataSet (void)
+{
+    _DataSet* newDS = new _DataSet();
+    checkPointer (newDS);
+
+    if (lfID>=0) {
+        _SimpleList    *lfFilters = &((_LikelihoodFunction*)likeFuncList(lfID))->GetTheFilters ();
+        _DataSetFilter *dsf = (_DataSetFilter*)dataSetFilterList (lfFilters->lData[0]);
+        _DataSet       *cDS = dsf->GetData();
+
+        long           i,
+                       k,
+                       sc;
+
+        for (i=0; i<dsf->NumberSpecies(); i++) {
+            newDS->GetNames() << dsf->GetData()->GetNames() (((_SimpleList*)dsf->GetMap())->lData[i]);
+        }
+
+        sc = newDS->GetNames().lLength;
+
+        for (i=0; i<lfFilters->lLength; i++) {
+            dsf = (_DataSetFilter*)dataSetFilterList (lfFilters->lData[i]);
+            for (k=0; k<dsf->theOriginalOrder.lLength; k++) {
+                _Site * thisS = cDS->GetSite(dsf->theOriginalOrder.lData[k]);
+                newDS->AddSite(thisS->sData[0]);
+            }
+
+            for (long j=1; j<sc; j++) {
+                _Site * thisS = cDS->GetSite(dsf->theOriginalOrder.lData[k]);
+                for (k=0; k<dsf->theOriginalOrder.lLength; k++) {
+                    newDS->Write2Site (k, thisS->sData[j]);
+                }
+            }
+        }
+
+        newDS->SetTranslationTable (dsf->GetData());
+    }
+
+    newDS->Finalize();
+    newDS->SetNoSpecies(newDS->GetNames().lLength);
+    return newDS;
+
+}
+
+//__________________________________________________________
+bool    _HYDataPanel::SaveDataPanel (bool saveAs, _String* saveFile, _String* dsPath, bool saveAllStates, _DataSet* dsXtra, bool straightOrder)
+{
+    FILE* dsout = nil;
+
+    long    includeData = 0;
+
+    if ((filePath.sLength==0)||dsXtra) {
+        if (dsPath||savePath.sLength||ProceedPrompt (saveDSPrompt,(Ptr)this)) {
+            if (dsPath) {
+                if (dsXtra) {
+                    *dsPath = SavePartition (-1,dsPath, dsXtra);
+                    if (dsPath->sLength==0) {
+                        return false;
+                    }
+                }
+            } else {
+                if (savePath.sLength) {
+                    includeData = 1;
+                } else {
+                    filePath = SavePartition (-1);
+                    if (filePath.sLength==0) {
+                        return false;
+                    }
+                }
+            }
+        } else {
+            return false;
+        }
+    }
+
+
+    if (((savePath.sLength == 0)||saveAs)&&(!saveFile))
+        // prompt for destination
+    {
+        _String ffPrompt ("Save partitioning info to:"),
+                foPrompt ("Format:"),
+                ffDefName(*((_String*)dataSetNamesList(dataSetID))),
+                ffOption1("Do not include sequence data"),
+                ffOption2("Include sequence data, NEXUS"),
+                ffOption3("Export data, partitions and trees to NEXUS");
+
+        _List   ffOptions;
+
+        ffOptions && & ffOption1;
+        ffOptions && & ffOption2;
+        ffOptions && & ffOption3;
+
+
+        includeData = SaveFileWithPopUp (savePath,ffPrompt,ffDefName,foPrompt,ffOptions);
+
+        if (includeData < 0) {
+            return false;
+        }
+
+        terminateExecution = false;
+        if (savePath.sLength == 0) {
+            return false;
+        }
+    }
+
+    _DataSet* thisDS = (_DataSet*)dataSetList (dataSetID);
+
+    _String   relPath;
+
+    if (saveFile) {
+        if (dsPath) {
+            relPath = saveFile->PathSubtraction(*dsPath,1);
+            if (relPath.sLength == 0) {
+                relPath = *dsPath;
+            }
+        } else {
+            relPath = savePath.PathSubtraction(filePath,1);
+            if (relPath.sLength == 0) {
+                relPath = filePath;
+            }
+        }
+    } else {
+        relPath = savePath.PathSubtraction(filePath,1);
+        if (relPath.sLength == 0) {
+            relPath = filePath;
+        }
+    }
+
+    _HYSequencePane* sp = (_HYSequencePane*)GetObject (0);
+
+    dsout = doFileOpen ((saveFile?saveFile->sData:savePath.sData),"w");
+
+    if (!dsout) {
+        _String errMsg = _String("Trying to open '")&(saveFile?*saveFile:savePath)&"' for writing failed. Oops!";
+        ProblemReport (errMsg,(Ptr)this);
+        return false;
+    }
+
+    if (includeData == 2) {
+        stashParameter (dataFilePrintFormat,4,true);
+        _SimpleList     dummyH, dummyV;
+        _DataSetFilter  dummyDF;
+
+        stashParameter (dataFileTree,0,true);
+        dummyDF.SetFilter ((_DataSet*)dataSetList(dataSetID),1,dummyH,dummyV);
+        dummyDF.toFileStr (dsout);
+        stashParameter (dataFileTree,0,false);
+
+        if (dataPartitions.lLength) {
+            fprintf (dsout, "\n\nBEGIN ASSUMPTIONS;");
+            for (long k=0; k<dataPartitions.lLength; k++) {
+                _DataSetFilter* theDF = (_DataSetFilter*)dataSetFilterList (dataPartitions.lData[k]);
+                fprintf (dsout, "\n\tCHARSET %s = ", ((_String*)dataSetFilterNamesList (dataPartitions.lData[k]))->sData);
+
+                _SimpleList offsetList;
+                for (long k2 = 0; k2 < theDF->theOriginalOrder.lLength; k2=k2+1) {
+                    offsetList << (theDF->theOriginalOrder.lData[k2]+1);
+                }
+
+                _String partString ((_String*)offsetList.ListToPartitionString());
+                fprintf (dsout, "%s;", partString.sData);
+            }
+            fprintf (dsout, "\nEND;\n\n");
+
+            fprintf (dsout, "\n\nBEGIN TREES;\n\n");
+
+            _SimpleList     alreadyDone;
+            _AVLList        alreadyDoneAVL (&alreadyDone);
+
+            for (long k=0; k<treeVarReferences.lLength; k++) {
+                long k2 = treeVarReferences.lData[k];
+                if (k2>=0 && alreadyDoneAVL.Find ((BaseRef)k2) < 0) {
+                    _TheTree* myTree = (_TheTree*)LocateVar (k2);
+                    myTree->StepWiseT(true);
+                    _String  *tStr = new _String  ((unsigned long)1024,true);
+                    myTree->SubTreeString (*tStr, false, -1, nil);
+                    tStr->Finalize();
+                    fprintf (dsout, "\n\tTREE %s = %s;", myTree->GetName()->sData, tStr->sData);
+                    DeleteObject (tStr);
+                    alreadyDoneAVL.Insert ((BaseRef)k2);
+                }
+            }
+            fprintf (dsout, "\nEND;\n\n");
+        }
+    } else {
+        if (includeData) {
+            stashParameter (dataFilePrintFormat,4,true);
+            _SimpleList     dummyH, dummyV;
+            _DataSetFilter  dummyDF;
+
+            dummyDF.SetFilter ((_DataSet*)dataSetList(dataSetID),1,dummyH,dummyV);
+            dummyDF.toFileStr (dsout);
+
+            fprintf (dsout, "\n\nBEGIN HYPHY;\n\n");
+
+            stashParameter (dataFilePrintFormat,0,false);
+
+            relPath = empty;
+        }
+
+        fprintf (dsout, "%s=\"%s\";\nDataSet %s = ReadDataFile (%s);\n",
+                 dataPanelSourcePath.getStr(),
+                 relPath.getStr(),
+                 ((_String*)dataSetNamesList(dataSetID))->getStr(),
+                 (includeData?useNexusFileData.getStr():dataPanelSourcePath.getStr()));
+
+        _String  *vertPart;
+
+        if (sp->speciesIndex.lLength == thisDS->NoOfSpecies()) {
+            vertPart = new _String(empty);
+        } else {
+            vertPart = (_String*)sp->speciesIndex.ListToPartitionString();
+        }
+
+        _String         partInfo (16,true);
+        _List           treeList;
+        _SimpleList*    lfDFs = lfID>=0?(&((_LikelihoodFunction*)likeFuncList(lfID))->GetTheFilters()):nil;
+        long            glOffset = 0;
+
+        for (long k=0; k<dataPartitions.lLength; k++) {
+            if (lfDFs && (!saveAllStates))
+                if (lfDFs->Find (dataPartitions.lData[k])<0) {
+                    continue;
+                }
+
+            _DataSetFilter* theDF = (_DataSetFilter*)dataSetFilterList (dataPartitions.lData[k]);
+            _String       * horPart;
+
+            if (straightOrder) {
+                horPart = new _String(empty);
+                checkPointer (horPart);
+                *horPart = _String (glOffset) & '-' & _String((long)(glOffset+theDF->theOriginalOrder.lLength-1));
+            } else {
+                horPart = (_String*)theDF->theOriginalOrder.ListToPartitionString();
+            }
+
+            _String         exclusions (empty);
+            if (theDF->GetUnitLength()==3 &&theDF->theExclusions.lLength) {
+                DFExclusionsToString      (theDF,exclusions);
+            }
+
+            fprintf (dsout, "DataSetFilter %s = CreateFilter (%s,%ld,\"%s\",\"%s\",\"%s\");\n",
+                     ((_String*)dataSetFilterNamesList(dataPartitions.lData[k]))->getStr(),
+                     ((_String*)dataSetNamesList(dataSetID))->getStr(),
+                     theDF->GetUnitLength(),
+                     horPart->getStr(),
+                     vertPart->getStr(),
+                     exclusions.getStr());
+
+            DeleteObject (horPart);
+            //partInfo << _String (modelReferences.lData[k]).getStr();
+            int model, options, freqs, classes;
+            LongToModelData (modelReferences.lData[k],model,options,freqs,classes);
+            _List*   mList = FindModelTemplate (model-1,theDF->GetDimension());
+            if (mList) {
+                partInfo << (_String*)(*mList)(0);
+                partInfo << ',';
+                partInfo << _String (modelReferences.lData[k]).getStr();
+            } else {
+                partInfo << _String ((long)-1);
+                partInfo << ',';
+                partInfo << _String ((long)0);
+            }
+            partInfo << ',';
+            partInfo << _String (partData.lData[k]).getStr();
+            partInfo << ',';
+            partInfo << _String (partitionColors.lData[k]).getStr();
+            partInfo << ',';
+
+            if (treeVarReferences.lData[k]>=0) {
+                _String * tName = LocateVar (treeVarReferences.lData[k])->GetName();
+                partInfo << tName;
+                if (treeList.Find (tName) < 0) {
+                    treeList << tName;
+                }
+            } else {
+                partInfo << "No_tree";
+            }
+
+            if (k<dataPartitions.lLength-1) {
+                partInfo << ';';
+            }
+
+            glOffset += theDF->theOriginalOrder.lLength;
+        }
+
+        partInfo.Finalize();
+        for (long m=0; m<treeList.lLength; m++) {
+            _TheTree* tVar = (_TheTree*)FetchVar(LocateVarByName (*(_String*)treeList(m)));
+            _String* tStr = (_String*)tVar->toStr();
+            fprintf (dsout, "Tree %s=%s\n", ((_String*)treeList(m))->getStr(), tStr->getStr());
+            DeleteObject (tStr);
+            /*tStr = tVar->TreeUserParams();
+            if (tStr->sLength)
+                fprintf (dsout, "%s\n", tStr->getStr());
+            DeleteObject (tStr);*/
+        }
+        _String     panelState (16,true);
+        panelState << _String((long)addedLines).getStr();
+        panelState << ',';
+        panelState << _String(referenceSequence).getStr();
+        panelState << ',';
+        panelState << _String(translatedSequence).getStr();
+        panelState << ',';
+        panelState << _String(sp->startColumn).getStr();
+        panelState << ',';
+        panelState << _String((long)sp->nameDisplayFlags).getStr();
+        panelState << ',';
+        panelState << _String((long)sp->showDots).getStr();
+        panelState << ',';
+        panelState << _String((long)sp->blockWidth).getStr();
+        panelState.Finalize();
+        //panelState << ',';
+
+        if (savedLFNames.lLength && saveAllStates) {
+            fprintf (dsout, "\n%s = {", savedLFMatrix.getStr());
+
+            for (long idx = 0; idx<savedLFNames.lLength; idx++)
+                fprintf (dsout, "\n{\"%s\",\n\"%s\"}", ((_String*)savedLFNames(idx))->getStr(),
+                         ((_String*)savedLFStates(idx))->getStr());
+            fprintf (dsout, "\n};\n\n");
+        }
+
+        fprintf (dsout, "OpenDataPanel(%s,\"%s\",\"%s\",\"%s\"",
+                 ((_String*)dataSetNamesList(dataSetID))->getStr(),
+                 vertPart->getStr(),panelState.getStr(),partInfo.getStr());
+        if (lfID>=0) {
+            fprintf (dsout,",%s);\n",((_String*)likeFuncNamesList(lfID))->getStr());
+            stashParameter (likefuncOutput,4.0,true);
+            ((_LikelihoodFunction *)likeFuncList (lfID))->toFileStr(dsout);
+            stashParameter (likefuncOutput,0.0,false);
+        } else {
+            fprintf (dsout,");\n");
+        }
+        if (includeData) {
+            fprintf (dsout, "\n\nEND;\n");
+        }
+        DeleteObject (vertPart);
+    }
+    fclose (dsout);
+    tainted = false;
+    return  true;
+}
+//__________________________________________________________
+void    _HYDataPanel::RestorePartInfo (_String* pInfo)
+{
+    _List parts;
+    pInfo->StripQuotes();
+    _ElementaryCommand::ExtractConditions (*pInfo,0,parts,';');
+    for (long k=0; (k<parts.lLength)&&(k<dataPartitions.lLength); k++) {
+        _List    thisPart;
+        _String* thisInfo = (_String*)parts(k),
+                 errMsg;
+        _ElementaryCommand::ExtractConditions (*thisInfo,0,thisPart,',');
+        if (thisPart.lLength == 5) {
+#ifndef USE_AVL_NAMES
+            treeVarReferences.lData[k]= variableNames.BinaryFind((_String*)thisPart(4));
+            if (treeVarReferences.lData[k]>=0) {
+                treeVarReferences.lData[k] = variableReindex.lData[treeVarReferences.lData[k]];
+            } else {
+                treeVarReferences.lData[k]=-1;
+            }
+#else
+            treeVarReferences.lData[k]=  LocateVarByName (*(_String*)thisPart(4));
+            if (treeVarReferences.lData[k]>=0) {
+                treeVarReferences.lData[k] = variableNames.GetXtra(treeVarReferences.lData[k]);
+            } else {
+                treeVarReferences.lData[k]=-1;
+            }
+#endif
+
+            _DataSetFilter* theDF = (_DataSetFilter*)dataSetFilterList (dataPartitions.lData[k]);
+            long thisModel = FindModelTemplate (((_String*)thisPart(0)),theDF->GetDimension());
+            if (thisModel>=0) {
+                partData.lData[k]=((_String*)thisPart(2))->toNum();
+                partitionColors.lData[k]=((_String*)thisPart(3))->toNum();
+                int model, options, freqs, classes;
+                LongToModelData (((_String*)thisPart(1))->toNum(),model,options,freqs,classes);
+
+                _List* modelInfo = FindModelTemplate ((_String*)thisPart(0));
+                long   modelOption = ((_SimpleList*)(*modelInfo)(1))->lData[0];
+
+                bool   allowedStates [5] = {
+                    (!(modelOption&HY_DATAPANEL_MODEL_MODELS))||(!(modelOption&(HY_DATAPANEL_MODEL_GLOBAL|HY_DATAPANEL_MODEL_GLOBALG))),
+                    modelOption&HY_DATAPANEL_MODEL_GLOBAL,
+                    modelOption&HY_DATAPANEL_MODEL_GLOBALG,
+                    false,
+                    false
+                };
+
+                if ((options>2)||(!allowedStates[options])) {
+                    errMsg = _String ("Invalid parameter options supplied for model ") & *(_String*)thisPart(0);
+                    ProblemReport (errMsg);
+                    continue;
+                }
+                allowedStates[0] = !(modelOption&HY_DATAPANEL_MODEL_MODELS);
+                allowedStates[1] = !(modelOption&HY_DATAPANEL_MODEL_MODELS);
+                allowedStates[2] = !(modelOption&HY_DATAPANEL_MODEL_MODELS);
+                allowedStates[3] = modelOption&HY_DATAPANEL_MODEL_EFVEST;
+                allowedStates[4] = modelOption&HY_DATAPANEL_MODEL_MODELS;
+
+                if ((freqs>4)||(!allowedStates[freqs])) {
+                    errMsg = _String ("Invalid frequency options supplied for model ") & *(_String*)thisPart(0);
+                    ProblemReport (errMsg);
+                    continue;
+                }
+
+                if (classes>HY_DATAPANEL_MAX_CLASSES) {
+                    errMsg = "Too many rate classes requested.";
+                    ProblemReport (errMsg);
+                    continue;
+                }
+
+                modelReferences.lData[k] = ModelDataToLong (thisModel+1,options,freqs,classes);
+
+                _List           modelList;
+                GenerateModelList (modelList,k);
+
+                RefreshPartRow (modelList,k,true);
+
+            } else {
+                _List dummy;
+                RefreshPartRow (dummy,k,true,false);
+            }
+        }
+    }
+    BuildThermometer();
+    BuildMarksPane();
+}
+
+//__________________________________________________________
+void    _HYDataPanel::RestorePanelSettings (_String* pInfo)
+{
+    _List parts;
+    pInfo->StripQuotes();
+    _ElementaryCommand::ExtractConditions (*pInfo,0,parts,',');
+    if (parts.lLength==7) {
+        _String* thisArg = (_String*)parts(0);
+        _HYSequencePane*  sp = (_HYSequencePane*)GetObject (0);
+        _DataSet*         ds = (_DataSet*)dataSetList (dataSetID);
+        long     savedAL = thisArg->toNum();
+
+        if (savedAL&HY_DATAPANEL_CONSENSUS) {
+            AdjustStatusLine (0,false,0);
+        }
+        if (savedAL&HY_DATAPANEL_TRANSLATION) {
+            thisArg = (_String*)parts(2);
+            translatedSequence = thisArg->toNum();
+            if ((translatedSequence>=0)&&(translatedSequence<ds->NoOfSpecies())) {
+                AdjustStatusLine (2,false,translatedSequence+1);
+            } else {
+                translatedSequence = -1;
+            }
+
+        }
+        if (savedAL&HY_DATAPANEL_REFERENCE) {
+            thisArg = (_String*)parts(1);
+            referenceSequence = thisArg->toNum();
+            if ((referenceSequence>=0)&&(referenceSequence<ds->NoOfSpecies())) {
+                AdjustStatusLine (3,false,referenceSequence+1);
+            } else {
+                referenceSequence = -1;
+            }
+
+        }
+
+        /*thisArg = (_String*)parts(2);
+        translatedSequence = thisArg->toNum();  */
+
+        //thisArg = (_String*)parts(3);
+        //sp->startColumn = thisArg->toNum();
+        //if ((sp->startColumn<0)||(sp->startColumn>=siteAssignments.lLength))
+        //  sp->startColumn = 0;
+        thisArg = (_String*)parts(4);
+        sp->SetNameDisplayMode (thisArg->toNum(),false);
+        thisArg = (_String*)parts(5);
+        sp->showDots = thisArg->toNum();
+        thisArg = (_String*)parts(6);
+        sp->blockWidth = thisArg->toNum();
+        if ((sp->blockWidth!=9)&&(sp->blockWidth!=10)) {
+            sp->blockWidth = 10;
+        }
+        sp->BuildPane();
+    }
+}
+
+
+//__________________________________________________________
+void    _HYDataPanel::BuildThermometer (_HYRect * printRect)
+{
+    _HYStretchCanvas* therm = (_HYStretchCanvas*)GetObject (1);
+    _HYSequencePane*  sp    = (_HYSequencePane*)GetObject (0);
+
+    _HYRect canvasDim = printRect?*printRect:therm->GetCanvasSize(),
+            backupTherm;
+
+    canvasDim.width = 1;
+
+    if (!printRect) {
+        therm->StartDraw();
+        therm->SetColor (labelBColor);
+        therm->FillRect (canvasDim);
+    } else {
+        backupTherm = thermRect;
+    }
+
+    canvasDim.bottom--;
+    therm->SetColor (black);
+
+    if (!printRect) {
+        therm->DrawRect(canvasDim);
+    }
+
+    thermRect = canvasDim;
+
+    if (!printRect) {
+        thermRect.left      +=  sp->headerWidth;
+        thermRect.right     -=  HY_DATAPANEL_THERM_HSPACE;
+        thermRect.top       +=  HY_DATAPANEL_THERM_VSPACE;
+        thermRect.bottom    -=  HY_DATAPANEL_THERM_VSPACE+2;
+        therm->SetColor (thermFill);
+    } else {
+        therm->SetColor (_hyWhiteColor);
+    }
+
+    therm->FillRect (thermRect);
+    therm->SetColor (black);
+    therm->DrawRect(thermRect);
+
+    long    pixelWidth   = thermRect.right-thermRect.left,
+            k,
+            lastColor = -1,
+            thisAss,
+            lastOverlap=0;
+
+    double  pixelsPerSite = pixelWidth/(double)siteAssignments.lLength,
+            currentFPixel = 0.0;
+
+
+    _HYRect siteRect = {thermRect.top+1,thermRect.left+1,thermRect.bottom-1,thermRect.left+1,1};
+
+    //if (pixelsPerSite>=1.0)
+    {
+        for (k=0; k<siteAssignments.lLength; k++,currentFPixel+=pixelsPerSite) {
+            thisAss = siteAssignments.lData[k];
+            if ((thisAss!=lastColor)||((thisAss==lastColor)&&(lastColor==-2)&&(lastOverlap!=overlaps.lData[k]))) {
+                siteRect.right = thermRect.left+1+currentFPixel;
+                if (lastColor>=0) {
+                    long thisColor = partitionColors.lData[lastColor];
+                    therm->SetColor (LongToHYColor(thisColor));
+                    therm->FillRect (siteRect);
+                } else if (lastColor == -2) {
+                    //therm->SetColor(black);
+                    //therm->FillRect (siteRect);
+                    long p4 = (lastOverlap&0xFF000000)>>24,
+                         p3 = (lastOverlap&0x00FF0000)>>16,
+                         p2 = (lastOverlap&0x0000FF00)>>8,
+                         p1 = (lastOverlap&0x000000FF),
+                         smallH;
+
+                    _HYRect smallRect = siteRect;
+
+                    if(p4>0) { // four overlaps
+                        smallH = (smallRect.bottom-smallRect.top)/4;
+                        smallRect.bottom = smallRect.top+smallH;
+                        therm->SetColor(LongToHYColor(partitionColors.lData[p4]));
+                        therm->FillRect(smallRect);
+                        therm->SetColor(LongToHYColor(partitionColors.lData[p3]));
+                        smallRect.top = smallRect.bottom;
+                        smallRect.bottom = smallRect.top+smallH;
+                        therm->FillRect(smallRect);
+                    } else if(p3>0) {
+                        smallH = (smallRect.bottom-smallRect.top)/3;
+                        smallRect.bottom = smallRect.top+smallH;
+                        therm->SetColor(LongToHYColor(partitionColors.lData[p3]));
+                        therm->FillRect(smallRect);
+                    } else {
+                        smallH = (smallRect.bottom-smallRect.top)/2;
+                        smallRect.bottom=smallRect.top;
+                    }
+                    therm->SetColor(LongToHYColor(partitionColors.lData[p2]));
+                    smallRect.top = smallRect.bottom;
+                    smallRect.bottom = smallRect.top+smallH;
+                    therm->FillRect(smallRect);
+                    therm->SetColor(LongToHYColor(partitionColors.lData[p1]));
+                    smallRect.top = smallRect.bottom;
+                    smallRect.bottom = siteRect.bottom;
+                    therm->FillRect(smallRect);
+                }
+                lastColor = thisAss;
+                siteRect.left = siteRect.right;
+                lastOverlap = overlaps.lData[k];
+            }
+        }
+        siteRect.right = thermRect.right-1;
+        if (lastColor>=0) {
+            long thisColor = partitionColors.lData[lastColor];
+            therm->SetColor (LongToHYColor(thisColor));
+            therm->FillRect (siteRect);
+        } else {
+            if (lastColor == -2) {
+                long p4 = (lastOverlap&0xFF000000)>>24,
+                     p3 = (lastOverlap&0x00FF0000)>>16,
+                     p2 = (lastOverlap&0x0000FF00)>>8,
+                     p1 = (lastOverlap&0x000000FF),
+                     smallH;
+
+                _HYRect smallRect = siteRect;
+
+                if(p4>0) { // four overlaps
+                    smallH = (smallRect.bottom-smallRect.top)/4;
+                    smallRect.bottom = smallRect.top+smallH;
+                    therm->SetColor(LongToHYColor(partitionColors.lData[p4]));
+                    therm->FillRect(smallRect);
+                    therm->SetColor(LongToHYColor(partitionColors.lData[p3]));
+                    smallRect.top = smallRect.bottom;
+                    smallRect.bottom = smallRect.top+smallH;
+                    therm->FillRect(smallRect);
+                } else if(p3>0) {
+                    smallH = (smallRect.bottom-smallRect.top)/3;
+                    smallRect.bottom = smallRect.top+smallH;
+                    therm->SetColor(LongToHYColor(partitionColors.lData[p3]));
+                    therm->FillRect(smallRect);
+                } else {
+                    smallH = (smallRect.bottom-smallRect.top)/2;
+                    smallRect.bottom=smallRect.top;
+                }
+                therm->SetColor(LongToHYColor(partitionColors.lData[p2]));
+                smallRect.top = smallRect.bottom;
+                smallRect.bottom = smallRect.top+smallH;
+                therm->FillRect(smallRect);
+                therm->SetColor(LongToHYColor(partitionColors.lData[p1]));
+                smallRect.top = smallRect.bottom;
+                smallRect.bottom = siteRect.bottom;
+                therm->FillRect(smallRect);
+            }
+        }
+    }
+
+    if (printRect) {
+        _SimpleList * p_coords,
+                    * p_count;
+
+        if (dataPartitions.lLength) {
+            checkPointer(p_coords = new _SimpleList (dataPartitions.lLength,0,0));
+            checkPointer(p_count  = new _SimpleList (dataPartitions.lLength,0,0));
+            for (k=0; k<siteAssignments.lLength; k++) {
+                thisAss = siteAssignments.lData[k];
+                if (thisAss==-2) { // overlap
+                    break;
+                }
+                if (thisAss>=0) {
+                    p_coords->lData[thisAss] += k;
+                    p_count->lData[thisAss]  ++;
+                }
+            }
+            if (k==siteAssignments.lLength) {
+                for (k=0; k<dataPartitions.lLength; k++) {
+                    currentFPixel = (pixelsPerSite*p_coords->lData[k])/p_count->lData[k]+0.5*pixelsPerSite;
+                    _HYFont labelFont = {"Times", (thermRect.bottom-thermRect.top)*2/3,HY_FONT_PLAIN};
+                    _String partName = ((_String*)dataSetFilterNamesList (dataPartitions.lData[k]))->Replace ("_"," ",true);
+                    thisAss = GetVisibleStringWidth (partName,labelFont)/2+1;
+
+                    _HYColor partColor = LongToHYColor(partitionColors.lData[lastColor]);
+                    if (MAX(partColor.R,MAX(partColor.B,partColor.G))<=128) {
+                        therm->SetColor (_hyWhiteColor);
+                    } else {
+                        therm->SetColor (black);
+                    }
+
+                    therm->SetFont (labelFont);
+                    therm->DisplayText (partName, thermRect.top+labelFont.size*7/6, thermRect.left+currentFPixel-thisAss,true);
+                }
+            }
+            DeleteObject (p_coords);
+            DeleteObject (p_count);
+        }
+    }
+
+    if (!printRect) {
+        therm->EndDraw();
+        therm->_MarkForUpdate();
+    } else {
+        thermRect = backupTherm;
+    }
+}
+
+//__________________________________________________________
+void    _HYDataPanel::BuildMarksPane (void)
+{
+    _HYStretchCanvas* marks = (_HYStretchCanvas*)GetObject (3);
+    _HYSequencePane*  sp    = (_HYSequencePane*) GetObject (0);
+
+    _HYRect canvasDim = marks->GetCanvasSize(),
+            sRect = {canvasDim.bottom-2,0,canvasDim.bottom-2,canvasDim.right,1};
+
+    marks->StartDraw();
+    marks->EraseAll();
+
+    marks->SetColor(black);
+    marks->DrawLine (sRect);
+
+    long  k,
+          a=-1,
+          b,
+          c=-1,
+          d;
+
+    sRect.top     = canvasDim.top;
+    sRect.bottom -= 2;
+    sRect.left = sp->headerWidth;
+    for (k=sp->startColumn; k<sp->endColumn-1; k++) {
+        b = siteAssignments.lData[k];
+        d = overlaps.lData[k];
+        if ((a!=b)||((a==-2)&&(c!=d))) {
+            if (a>=0) {
+                marks->SetColor (LongToHYColor(partitionColors.lData[a]));
+                sRect.right     =   sRect.left;
+                sRect.top       =   0;
+                sRect.bottom    =   canvasDim.bottom-3;
+                marks->DrawLine (sRect);
+                sRect.right=(sRect.left--);
+                sRect.top++;
+                marks->DrawLine (sRect);
+                sRect.right=(sRect.left--);
+                sRect.top++;
+                sRect.bottom--;
+                marks->DrawLine (sRect);
+                sRect.left+=2;
+            }
+            if (b>=0) {
+                marks->SetColor (LongToHYColor(partitionColors.lData[b]));
+                sRect.right=(sRect.left+=2);
+                sRect.top = 0;
+                sRect.bottom=canvasDim.bottom-3;
+                marks->DrawLine (sRect);
+                sRect.right=(sRect.left++);
+                sRect.top++;
+                marks->DrawLine (sRect);
+                sRect.right=(sRect.left++);
+                sRect.top++;
+                sRect.bottom--;
+                marks->DrawLine (sRect);
+                sRect.left-=4;
+            }
+        }
+        sRect.left+=sp->charWidth;
+        if (k&&(k%sp->blockWidth==0)) {
+            sRect.left+=2;
+        }
+        a=b;
+        c=d;
+    }
+    if (k==siteAssignments.lLength-1) {
+        b = siteAssignments.lData[k];
+        sRect.left+=sp->charWidth;
+        if (k&&(k%sp->blockWidth==0)) {
+            sRect.left+=2;
+        }
+        if (b>=0) {
+            marks->SetColor (LongToHYColor(partitionColors.lData[b]));
+            sRect.right=sRect.left;
+            sRect.top = 0;
+            sRect.bottom=canvasDim.bottom-3;
+            marks->DrawLine (sRect);
+            sRect.right=(sRect.left--);
+            sRect.top++;
+            marks->DrawLine (sRect);
+            sRect.right=(sRect.left--);
+            sRect.top++;
+            sRect.bottom--;
+            marks->DrawLine (sRect);
+            sRect.left+=2;
+        }
+    }
+    marks->EndDraw();
+    marks->_MarkForUpdate();
+}
+
+//__________________________________________________________
+_HYRect  _HYDataPanel::ComputeNavRect (void)
+{
+    _HYRect            res;
+    _HYSequencePane*   seqPane      = (_HYSequencePane*)    GetObject (0);
+
+    res.width = 1;
+
+    _Parameter  nS = thermRect.right-thermRect.left+1;
+
+    _Parameter visProp = (seqPane->endColumn-seqPane->startColumn)/(_Parameter)seqPane->columnStrings.lLength;
+    res.left  = seqPane->startColumn*nS/(_Parameter)seqPane->columnStrings.lLength;
+    res.right = res.left+visProp*nS;
+
+    if (res.right<res.left+3) {
+        res.right = res.left+3;
+    }
+
+    visProp    = (seqPane->endRow-seqPane->startRow)/(_Parameter)seqPane->RowCount();
+    res.top    = 0;
+    res.bottom = HY_DATAPANEL_THERMWIDTH;
+    return res;
+}
+//__________________________________________________________
+void  _HYDataPanel::SetNavRectCenter (long h, long)
+{
+    _HYSequencePane * bigCanvas = (_HYSequencePane*)GetObject (0);
+
+    long        nS = thermRect.right-thermRect.left+1,
+                t;
+
+    t   = navRect.right-navRect.left;
+    h  -= t/2;
+
+    if (h<0) {
+        h=0;
+    }
+
+    if (h+t>nS) {
+        h=nS-t;
+    }
+
+    h  = (h*(_Parameter)bigCanvas->columnStrings.lLength)/nS;
+    if (h<0) {
+        h = 0;
+    }
+
+    if (h!=bigCanvas->startColumn) {
+        bigCanvas->ProcessEvent(generateScrollEvent(h-bigCanvas->startColumn,0));
+        ProcessEvent (generateScrollEvent(0,0));
+    }
+}
+
+//__________________________________________________________
+long  _HYDataPanel::FindUnusedColor (void)
+{
+    long tryColor;
+    for (long d=1; d<4; d++) {
+        for (long k=0; k<HY_DATAPANEL_DEF_COLORS; k++) {
+            _HYColor thisColor = dataColors[k];
+            switch (d) {
+            case 2:
+                thisColor.R/=1.5;
+                thisColor.G/=1.5;
+                thisColor.B/=1.5;
+                break;
+            case 3:
+                thisColor.R = (thisColor.R+0x0000ffff)/2;
+                thisColor.G = (thisColor.G+0x0000ffff)/2;
+                thisColor.B = (thisColor.B+0x0000ffff)/2;
+                break;
+            }
+            tryColor = HYColorToLong (thisColor);
+            if (partitionColors.Find (tryColor)<0) {
+                return tryColor;
+            }
+        }
+    }
+    _HYColor bailOut = {0,0,0};
+    _String bailOutString ("Select a color for the partition");
+    return HYColorToLong (SelectAColor(bailOut,bailOutString));
+}
+
+//__________________________________________________________
+void  _HYDataPanel::MarkSites (_SimpleList& siteList,long k)
+{
+    long p;
+    for (long j=0; j<siteList.lLength; j++) {
+        long index = siteList.lData[j];
+
+        p = siteAssignments.lData[index];
+        if (p==-1) {
+            siteAssignments.lData[index]=k;
+        } else if (p>=0) {
+            if (k<p) {
+                overlaps.lData[index] = (p<<8)+k;
+            } else {
+                overlaps.lData[index] = (k<<8)+p;
+            }
+            siteAssignments.lData[index]=-2;
+        } else {
+            p = overlaps.lData[index];
+            long p3 = (p&0x00FF0000)>>16,
+                 p2 = (p&0x0000FF00)>>8,
+                 p1 = p&0x000000FF,
+                 p4;
+            if (p3&&(k>p3)) {
+                p4 = k;
+            } else if (p2&&(k>p2)) {
+                p4 = p3;
+                p3 = k;
+            } else if (k>p1) {
+                p4=p3;
+                p3=p2;
+                p2=k;
+            } else {
+                p4=p3;
+                p3=p2;
+                p2=p1;
+                p1=k;
+            }
+            overlaps.lData[index]=(p4<<24)+(p3<<16)+(p2<<8)+p1;
+        }
+    }
+}
+//__________________________________________________________
+void  _HYDataPanel::NavBarDblClick (long k)
+{
+    _HYTable*         dl    = (_HYTable*)GetObject (5);
+    double  pixelsPerSite = (thermRect.right-thermRect.left)/(double)siteAssignments.lLength;
+    long    index,t;
+    k/=pixelsPerSite;
+    _SimpleList newSelection;
+    index = siteAssignments.lData[k];
+    if (index>=0) {
+        newSelection<<index;
+    } else if (index==-2) {
+        index = overlaps.lData[k];
+        t = (index&0x000000FF);
+        newSelection<<t;
+        index=index>>8;
+        t=index%256;
+        while(t&&index) {
+            newSelection<<t;
+            index=index>>8;
+            t=index%256;
+        }
+    }
+    if (newSelection.lLength) {
+        _SimpleList oldSelection;
+        dl->GetRowSelection (oldSelection);
+
+        if (!oldSelection.Equal(newSelection)) {
+            dl->SetRowSelection(newSelection);
+            UpdatePartitionOperations();
+        }
+        if (newSelection.lLength==1) {
+            EditPartitionProperties (newSelection.lData[0]);
+        }
+    }
+}
+//__________________________________________________________
+
+void  _HYDataPanel::GenerateTreeList (_List& trees)
+{
+    long         k,
+                 mT;
+
+    if (dataWrapper) {
+        mT = dataWrapper->NumberSpecies();
+    } else {
+        mT = ((_DataSet*)dataSetList(dataSetID))->NoOfSpecies();
+    }
+
+    trees && & none;
+    trees && & makeNewTree;
+    trees && & readTreeFile;
+    trees && & inferTreeStr;
+
+    for (k=0; k<variablePtrs.lLength; k++) {
+        _Variable* thisVar = LocateVar(k);
+        if (thisVar&&(thisVar->ObjectClass()==TREE)) {
+            _TheTree* thisTree = (_TheTree*)thisVar;
+            _PMathObj tipCount = thisTree->TipCount();
+            if (tipCount->Value()==mT || (mT==2 && tipCount->Value()==1)) {
+                if (trees.lLength==4) {
+                    trees << & menuSeparator;
+                }
+                trees << thisTree->GetName();
+            }
+            DeleteObject (tipCount);
+        }
+    }
+
+}
+
+//__________________________________________________________
+void  _HYDataPanel::GenerateModelList (_List& modelList, long partID)
+{
+
+    long  mT;
+
+    _DataSetFilter * theDF = (_DataSetFilter*)dataSetFilterList (dataPartitions.lData[partID]);
+
+    mT = theDF->GetDimension();
+
+    modelList && & none;
+
+    for (long k=0; k<modelTemplates.lLength; k++) {
+        _List * thisModel = (_List*)modelTemplates (k);
+        _SimpleList* modelOptions = (_SimpleList*)(*thisModel)(1);
+        if ((modelOptions->lData[1]==mT)||((modelOptions->lData[1]==64)&&(theDF->GetUnitLength()==3))) {
+            modelList <<  (_String*)(*thisModel)(0);
+        }
+    }
+}
+
+//__________________________________________________________
+void  _HYDataPanel::GenerateModelPOptionList (_List& optionsList, long partID)
+{
+    _DataSetFilter* thisPartition = (_DataSetFilter*)dataSetFilterList (dataPartitions.lData[partID]);
+    _List*          theModel = FindModelTemplate ((HY_DATAPANEL_MODELID&modelReferences.lData[partID])-1,thisPartition->GetDimension());
+
+    if (theModel) {
+        _SimpleList* opt = (_SimpleList*)(*theModel)(1);
+
+        if (!(opt->lData[0]&HY_DATAPANEL_MODEL_MODELS)) {
+            optionsList && & parameterOption[0];
+            if (opt->lData[0]&HY_DATAPANEL_MODEL_GLOBAL) {
+                optionsList && & parameterOption[1];
+            }
+
+            if (opt->lData[0]&HY_DATAPANEL_MODEL_GLOBALG) {
+                optionsList && & parameterOption[2];
+            }
+        } else {
+            partID = 0;
+            if (opt->lData[0]&HY_DATAPANEL_MODEL_GLOBALG) {
+                partID = 2;
+            } else if (opt->lData[0]&HY_DATAPANEL_MODEL_GLOBAL) {
+                partID = 1;
+            }
+            optionsList && & parameterOption[partID];
+        }
+    }
+}
+
+//__________________________________________________________
+void  _HYDataPanel::GenerateModelFOptionList (_List& optionsList, long partID)
+{
+    _DataSetFilter* thisPartition = (_DataSetFilter*)dataSetFilterList (dataPartitions.lData[partID]);
+    _List*     theModel = FindModelTemplate ((modelReferences.lData[partID]&HY_DATAPANEL_MODELID)-1,thisPartition->GetDimension());
+
+    if (theModel) {
+        _SimpleList* opt = (_SimpleList*)(*theModel)(1);
+
+        if (!(opt->lData[0]&HY_DATAPANEL_MODEL_MODELS))
+            for (partID=0; partID<4; partID++) {
+                optionsList && & freqOption[partID];
+            }
+        else {
+            optionsList && & freqOption[4];
+        }
+    }
+}
+
+//__________________________________________________________
+void  _HYDataPanel::UnmarkSites (_SimpleList& sL,long ind)
+{
+    _SimpleList     siteList;
+
+    siteList.Duplicate (&sL);
+    siteList.Sort();
+    long p;
+    for (long j=0; j<siteList.lLength; j++) {
+        long index = siteList.lData[j];
+        p = siteAssignments.lData[index];
+        if (p==ind) {
+            siteAssignments.lData[index]=-1;
+        } else if (p==-2) {
+            p = overlaps.lData[index];
+            long p3 = (p&0x00FF0000)>>16,
+                 p2 = (p&0x0000FF00)>>8,
+                 p1 = p&0x000000FF,
+                 p4 = (p&0xFF000000)>>24;
+            if (ind==p1) {
+                p1 = p2;
+                p2 = p3;
+                p3 = p4;
+                p4 = 0;
+            } else if (ind==p2) {
+                p2=p3;
+                p3=p4;
+                p4=0;
+            } else if (p3&&(ind==p3)) {
+                p3=p4;
+                p4=0;
+            } else if (p4&&(ind==p4)) {
+                p4=0;
+            }
+
+            p=(p4<<24)+(p3<<16)+(p2<<8)+p1;
+            if (p<256) {
+                siteAssignments.lData[index]=p;
+                overlaps.lData[index]=0;
+            } else {
+                overlaps.lData[index]=p;
+            }
+        }
+    }
+}
+
+//__________________________________________________________
+void  _HYDataPanel::CorrectSites (long ind)
+{
+    long p;
+    for (long j=0; j<siteAssignments.lLength; j++) {
+        p = siteAssignments.lData[j];
+        if (p>ind) {
+            siteAssignments.lData[j]--;
+        } else if (p==-2) {
+            p = overlaps.lData[j];
+            long p3 = (p&0x00FF0000)>>16,
+                 p2 = (p&0x0000FF00)>>8,
+                 p1 = p&0x000000FF,
+                 p4 = (p&0xFF000000)>>24;
+
+            if (p4>ind) {
+                p4--;
+            }
+            if (p3>ind) {
+                p3--;
+            }
+            if (p2>ind) {
+                p2--;
+            }
+            if (p1>ind) {
+                p1--;
+            }
+
+            p=(p4<<24)+(p3<<16)+(p2<<8)+p1;
+            overlaps.lData[j]=p;
+        }
+    }
+}
+//__________________________________________________________
+bool  _HYDataPanel::IsSelectionNonEmpty (void)
+{
+    return ((_HYSequencePane*)GetObject(0))->selection.lLength>0;
+}
+
+//__________________________________________________________
+
+void  _HYDataPanel::UpdateConsensusSequence (_String& newDataString, bool applyChanges)
+{
+    if (dataWrapper) {
+        newDataString = dataWrapper->GenerateConsensusString();
+    } else {
+        _DataSetFilter temp;
+        _SimpleList    empty1, empty2;
+        temp.SetFilter ((_DataSet*)dataSetList (dataSetID), 1, empty1, empty2, false);
+        newDataString = temp.GenerateConsensusString()&"    ";
+    }
+
+    if (applyChanges) {
+        if (addedLines&HY_DATAPANEL_CONSENSUS) {
+            _HYSequencePane* sp2 = (_HYSequencePane*)components(4);
+            for (long k=0; k<newDataString.sLength; k++) {
+                ((_String*)statusData(k))->sData[0] = newDataString[k];
+            }
+            sp2->BuildPane();
+            sp2->_MarkForUpdate();
+        }
+    }
+}
+
+//__________________________________________________________
+
+void  _HYDataPanel::UpdateTranslationString (_String& newDataString, long index, bool applyChanges, long genCodeRef)
+{
+    // go filter by filter; take each codon filter, apply properties and translate
+
+    _Parameter     *freqVector = (_Parameter*)MemAllocate(sizeof(_Parameter)*64);
+    long    k;
+
+    _String spaces ((unsigned long)(siteAssignments.lLength+2), false);
+
+    for (k=0; k<siteAssignments.lLength+4; k++) {
+        spaces.sData[k] = ' ';
+    }
+
+    newDataString = spaces;
+
+    spaces = "   ";
+
+    if (genCodeRef == -1)
+        for (k=0; k<dataPartitions.lLength; k++) {
+            _DataSetFilter* df = (_DataSetFilter*)dataSetFilterList(dataPartitions.lData[k]);
+            if (df->GetUnitLength() == 3) { // a codon filter; proceed
+                _SimpleList     backup;
+                backup.Duplicate (&df->theExclusions);
+                df->theExclusions.Clear();
+                bool rev;
+                char offset;
+                long genCode;
+                LongToPartData (partData.lData[k],offset,rev,genCode);
+                _SimpleList* gencode = ((_SimpleList*)((*(_List*)geneticCodes(genCode))(2)));
+                if (rev) // reverse direction
+                    for (long m=df->theOriginalOrder.lLength-offset-1; m>=2; m-=3) {
+                        spaces.sData[0] = (*df->GetData())(df->theOriginalOrder.lData[m],index,1);
+                        spaces.sData[1] = (*df->GetData())(df->theOriginalOrder.lData[m-1],index,1);
+                        spaces.sData[2] = (*df->GetData())(df->theOriginalOrder.lData[m-2],index,1);
+                        CodeTo3AA (spaces,df->Translate2Frequencies(spaces,freqVector,false),gencode,freqVector);
+                        newDataString.sData[df->theOriginalOrder.lData[m-2]]=spaces.sData[0];
+                        newDataString.sData[df->theOriginalOrder.lData[m-1]]=spaces.sData[1];
+                        newDataString.sData[df->theOriginalOrder.lData[m]]=spaces.sData[2];
+                    }
+                else
+                    for (long m=offset; m<df->theOriginalOrder.lLength-2; m+=3) {
+                        spaces.sData[0] = (*df->GetData())(df->theOriginalOrder.lData[m],index,1);
+                        spaces.sData[1] = (*df->GetData())(df->theOriginalOrder.lData[m+1],index,1);
+                        spaces.sData[2] = (*df->GetData())(df->theOriginalOrder.lData[m+2],index,1);
+                        CodeTo3AA (spaces,df->Translate2Frequencies(spaces,freqVector,false),gencode,freqVector);
+                        newDataString.sData[df->theOriginalOrder.lData[m]]=spaces.sData[0];
+                        newDataString.sData[df->theOriginalOrder.lData[m+1]]=spaces.sData[1];
+                        newDataString.sData[df->theOriginalOrder.lData[m+2]]=spaces.sData[2];
+                    }
+                df->theExclusions.Duplicate (&backup);
+            }
+        }
+    else {
+        _DataSet * ds = (_DataSet*)dataSetList (dataSetID);
+
+        _DataSetFilter dummy;
+        _SimpleList    e1,
+                       e2;
+
+        e1<<0;
+        e1<<1;
+        e1<<2;
+
+        dummy.SetFilter (ds,3, e1, e2);
+        _SimpleList* gencode = ((_SimpleList*)((*(_List*)geneticCodes(genCodeRef))(2)));
+
+        for (k=0; k<siteAssignments.lLength-2; k+=3) {
+            spaces.sData[0] = (*ds)(k,index,1);
+            spaces.sData[1] = (*ds)(k+1,index,1);
+            spaces.sData[2] = (*ds)(k+2,index,1);
+            CodeTo3AA (spaces,dummy.Translate2Frequencies(spaces,freqVector,false),gencode,freqVector);
+            newDataString.sData[k]=spaces.sData[0];
+            newDataString.sData[k+1]=spaces.sData[1];
+            newDataString.sData[k+2]=spaces.sData[2];
+        }
+
+        for (; k<siteAssignments.lLength; k++) {
+            newDataString.sData[k] = ' ';
+        }
+    }
+
+    free (freqVector);
+
+    if (applyChanges) {
+        if (addedLines&HY_DATAPANEL_TRANSLATION) {
+            long idx = ((_String*)statusData(0))->sLength-1;
+            if (addedLines&HY_DATAPANEL_REFERENCE) {
+                idx--;
+            }
+            _HYSequencePane* sp2 = (_HYSequencePane*)components(4);
+            for (long k=0; k<newDataString.sLength; k++) {
+                ((_String*)statusData(k))->sData[idx] = newDataString[k];
+            }
+            sp2->BuildPane();
+            sp2->_MarkForUpdate();
+        }
+    }
+}
+
+//__________________________________________________________
+
+bool  _HYDataPanel::GetTranslationString (_String& newDataString, long index, char resolve, long filterID, _List * cachedResolutions)
+{
+    // go filter by filter; take each codon filter, apply properties and translate
+
+    _Parameter     *freqVector = (_Parameter*)MemAllocate(sizeof(_Parameter)*64);
+    long    k,
+            index2;
+
+    _String newData (16, true),
+            spaces  (3, false);
+
+    for (k=filterID>=0?filterID:0; k<dataPartitions.lLength; k++) {
+        _DataSetFilter* df = (_DataSetFilter*)dataSetFilterList(dataPartitions.lData[k]);
+        _String         gaps (3,false);
+        gaps.sData[0] = df->GetData()->GetTT()->GetGapChar();
+        gaps.sData[1] = gaps.sData[0];
+        gaps.sData[2] = gaps.sData[0];
+
+        if (df->GetUnitLength() == 3) { // a codon filter; proceed
+            if  (resolve) {
+                index2 = df->theNodeMap.Find (index);
+            }
+
+            _SimpleList     backup;
+            bool rev;
+            char offset;
+            long genCode;
+            LongToPartData (partData.lData[k],offset,rev,genCode);
+
+            _SimpleList*    gencode         = ((_SimpleList*)((*(_List*)geneticCodes(genCode))(2)));
+
+            _List           *thisFilterMap = nil;
+
+            if (resolve > 0) {
+                if (cachedResolutions && cachedResolutions->lLength <= k) {
+                    _List * thisFilterResolution = new _List;
+                    for (long m=offset; m<df->theOriginalOrder.lLength-2; m+=3) {
+                        thisFilterResolution->AppendNewInstance(df->CountAndResolve(df->duplicateMap[df->theOriginalOrder.lData[m]/3],freqVector,resolve-1));
+                    }
+
+                    cachedResolutions->AppendNewInstance (thisFilterResolution);
+                }
+                thisFilterMap = (_List*)(*cachedResolutions)(k);
+            } else {
+                backup.Duplicate (&df->theExclusions);
+                df->theExclusions.Clear();
+            }
+
+            if (rev) // reverse direction
+                //for (long m=2+(df->theOriginalOrder.lLength-offset)%3; m<df->theOriginalOrder.lLength-offset; m+=3)
+                for (long m=df->theOriginalOrder.lLength-offset-1; m>=2; m-=3) {
+                    spaces.sData[0] = (*df->GetData())(df->theOriginalOrder.lData[m],index,1);
+                    spaces.sData[1] = (*df->GetData())(df->theOriginalOrder.lData[m-1],index,1);
+                    spaces.sData[2] = (*df->GetData())(df->theOriginalOrder.lData[m-2],index,1);
+                    if (resolve && thisFilterMap) {
+                        newData << CodeToAA (df->CorrectCode(((_SimpleList*)thisFilterMap->lData[m/3])->lData[index2]),gencode);
+                    } else if (spaces.Equal(&gaps)) {
+                        newData << '-';
+                    } else {
+                        newData << CodeToAA (df->Translate2Frequencies(spaces,freqVector,false),gencode,freqVector);
+                    }
+
+                }
+            else
+                for (long m=offset; m<df->theOriginalOrder.lLength-2; m+=3) {
+                    spaces.sData[0] = (*df->GetData())(df->theOriginalOrder.lData[m],index,1);
+                    spaces.sData[1] = (*df->GetData())(df->theOriginalOrder.lData[m+1],index,1);
+                    spaces.sData[2] = (*df->GetData())(df->theOriginalOrder.lData[m+2],index,1);
+                    if (resolve && thisFilterMap) {
+                        newData << CodeToAA (df->CorrectCode(((_SimpleList*)thisFilterMap->lData[m/3])->lData[index2]),gencode);
+                    } else if (spaces.Equal(&gaps)) {
+                        newData << '-';
+                    } else {
+                        newData << CodeToAA (df->Translate2Frequencies(spaces,freqVector,false),gencode,freqVector);
+                    }
+                }
+            if (resolve == 0) {
+                df->theExclusions.Duplicate (&backup);
+            }
+            if (filterID>=0) {
+                free (freqVector);
+                newData.Finalize();
+                newDataString = newData;
+                return rev;
+            }
+        }
+    }
+
+    free (freqVector);
+    newData.Finalize();
+    newDataString = newData;
+
+    return true;
+}
+
+//__________________________________________________________
+void  _HYDataPanel::CreatePartition (_SimpleList& siteList, char unitLength, bool jump2New, _String* prefix)
+{
+    if (dataSetID>=0) {
+        bool            good = true;
+        if ((partitionColors.lLength==255)&&(siteAssignments.Find(-2)>=0)) {
+            good = false;
+        } else
+            for (long k=0; k<siteList.lLength; k++)
+                if (overlaps.lData[siteList.lData[k]]>0x00FFFFFF) {
+                    good = false;
+                    break;
+                }
+        if (!good) {
+            _String errMsg = _String("Couldn't create new partition. ")&overlapWarning;
+            ProblemReport (errMsg);
+            return;
+        }
+        _DataSetFilter* newDF = new _DataSetFilter();
+        _SimpleList     emptyList;
+        if (dataWrapper) {
+            emptyList.Duplicate (&dataWrapper->theNodeMap);
+        }
+        newDF->SetFilter((_DataSet*)dataSetList(dataSetID),unitLength,emptyList,siteList,false);
+        if (terminateExecution) {
+            terminateExecution = false;
+            return;
+        }
+        _String filterName;
+        if (!prefix) {
+            filterName = (*dataSetName)& "_part";
+        } else {
+            filterName = *prefix;
+        }
+
+        dataPartitions<<AddFilterToList (filterName,newDF);
+        treeVarReferences<<-1;
+        modelReferences<<0;
+        partData<<0;
+        partitionColors<<FindUnusedColor();
+        long nr = AddPartitionRow (&filterName, newDF->GetUnitLength());
+        MarkSites (siteList,partitionColors.lLength-1);
+        if (jump2New) {
+            _HYTable* tl = (_HYTable*)GetObject (5);
+            _SimpleList sl (nr);
+            tl->SetRowSelection(sl);
+            tl->ScrollToRow (nr);
+            UpdatePartitionOperations();
+        }
+        tainted = true;
+        BuildThermometer();
+        BuildMarksPane();
+    }
+}
+
+//__________________________________________________________
+long  _HYDataPanel::AddPartitionRow (_String* partName, long partUnit)
+{
+    _HYTable * pT = (_HYTable*)GetObject (5);
+    long     k = pT->verticalSpaces.lLength;
+
+    bool     hasPadding = (((_String*)pT->GetCellData (0,k-1))->sLength==0);
+
+    if (hasPadding) {
+        k--;
+        long s;
+        if ((s=pT->GetRowSpacing(k))<20) {
+            pT->DeleteRow (k);
+        } else {
+            pT->SetRowSpacing (k,-20,false);
+        }
+    }
+    pT->AddRow      (k,20,HY_TABLE_STATIC_TEXT);
+    pT->SetCellData (partName,k,DF_ID_COLUMN,HY_TABLE_STATIC_TEXT,true);
+    pT->SetCellData (&none,k,DF_TREE_COLUMN,HY_TABLE_STATIC_TEXT|HY_TABLE_PULLDOWN,true);
+    pT->SetCellData (&none,k,DF_MODEL_COLUMN,HY_TABLE_STATIC_TEXT|HY_TABLE_PULLDOWN,true);
+    _String * dataTypeS = &unknownDataType;
+
+    if (dataType&HY_DATAPANEL_NUCDATA)
+        switch (partUnit) {
+        case 1:
+            dataTypeS = &nucDataType;
+            break;
+        case 2:
+            dataTypeS = &dinucDataType;
+            break;
+        case 3:
+            dataTypeS = &codonDataType;
+            break;
+        }
+    else if (dataType&HY_DATAPANEL_PROTDATA) {
+        dataTypeS = &proteinDataType;
+    } else if (dataType&HY_DATAPANEL_BINARYDATA) {
+        if (partUnit == 1) {
+            dataTypeS = &binaryDataType;
+        } else {
+            dataTypeS = &disequonDataType;
+        }
+    } else {
+        dataTypeS = &unknownDataType;
+    }
+
+    pT->SetCellData (dataTypeS,k,DF_TYPE_COLUMN,HY_TABLE_STATIC_TEXT|HY_TABLE_PULLDOWN,true);
+
+    _SimpleList colorRect;
+
+    colorRect << partitionColors.lData[partitionColors.lLength-1];
+    colorRect << 13;
+    colorRect << 13;
+    colorRect << HY_TABLE_COLOR_CIRCLE;
+
+    pT->SetCellData (&colorRect,k,DF_COLOR_COLUMN,HY_TABLE_ICON,true);
+
+    pT->_MarkContentsForUpdate();
+    pT->SetVisibleSize (pT->rel);
+    return k;
+}
+
+
+//__________________________________________________________
+void  _HYDataPanel::DeletePartitionRow (long index)
+{
+    _HYTable * pT = (_HYTable*)GetObject (5);
+
+    pT->DeleteRow(index);
+
+    long        h2 = pT->verticalSpaces.lData[pT->verticalSpaces.lLength-1];
+    bool        hasPadding = (((_String*)pT->GetCellData (0,pT->verticalSpaces.lLength-1))->sLength == 0);
+
+    if (h2<100) {
+        if (hasPadding) {
+            pT->SetRowSpacing (pT->verticalSpaces.lLength-1,100-h2,false);
+        } else {
+            pT->AddRow (-1,100-h2,HY_TABLE_STATIC_TEXT|HY_TABLE_CANTSELECT);
+        }
+    }
+    pT->SetVisibleSize (pT->rel);
+    pT->ScrollToRow(index>0?index-1:0);
+    pT->_MarkForUpdate();
+}
+
+//__________________________________________________________
+void  _HYDataPanel::AddPartition (_DataSetFilter* theDF)
+{
+    if (dataSetID>=0) {
+        bool            good = true;
+        if ((partitionColors.lLength==255)&&(siteAssignments.Find(-2)>=0)) {
+            good = false;
+        } else
+            for (long k=0; k<theDF->theOriginalOrder.lLength; k++)
+                if (overlaps.lData[theDF->theOriginalOrder.lData[k]]>0x00FFFFFF) {
+                    good = false;
+                    break;
+                }
+        if (!good) {
+            _String errMsg = _String("Couldn't add new partition. ")&overlapWarning;
+            ProblemReport (errMsg);
+            return;
+        }
+        long            filterID = dataSetFilterList._SimpleList::Find ((long)theDF);
+        if (filterID>=0) {
+            _String*    filterName = (_String*)dataSetFilterNamesList (filterID);
+            dataPartitions<<filterID;
+            treeVarReferences<<-1;
+            modelReferences<<0;
+            /*filterID = 0;
+            if (theDF->GetUnitLength () == 3) // codon
+            {
+                _String excl;
+                DFExclusionsToString      (theDF,excl);
+                filterID = FindGeneticCodeByExcl (&excl);
+                if (filterID<0)
+                    filterID = 0;
+            }
+            partData<<PartDataToLong (0,0,filterID);*/
+            partData << 0;
+            partitionColors<<FindUnusedColor();
+            AddPartitionRow (filterName, theDF->GetUnitLength());
+            MarkSites (theDF->theOriginalOrder,partitionColors.lLength-1);
+            BuildThermometer();
+            BuildMarksPane();
+        }
+    }
+}
+
+//__________________________________________________________
+
+_String  _HYDataPanel::SavePartition (long index, _String* dsFile, _DataSet* dsXtra)
+{
+    /* stuff to add:
+
+        window-based width?
+        save attached tree
+
+    */
+    if (dfFilterFormats.lLength==0) {
+        _String format ("# sequential");
+        dfFilterFormats && &format;
+        format = "# interleaved";
+        dfFilterFormats && &format;
+        format = "PHYLIP Sequential";
+        dfFilterFormats && &format;
+        format = "PHYLIP Interleaved";
+        dfFilterFormats && &format;
+        format = "NEXUS Sequential[Labels]";
+        dfFilterFormats && &format;
+        format = "NEXUS Interleaved[Labels]";
+        dfFilterFormats && &format;
+        format = "NEXUS Sequential[No Labels]";
+        dfFilterFormats && &format;
+        format = "NEXUS Interleaved[No Labels]";
+        dfFilterFormats && &format;
+        format = "Comma Separated Character Data";
+        dfFilterFormats && &format;
+        format = "FASTA sequential";
+        dfFilterFormats && &format;
+    }
+    if (dataSetID>=0) {
+        bool        cleanUp = false;
+        if (index>=(long)dataPartitions.lLength) {
+            return empty;
+        }
+        long dfID, formatChoice;
+        _DataSetFilter *theDF;
+        _HYSequencePane* sp = (_HYSequencePane*)GetObject(0);
+
+        if (index>=0) {
+            dfID = dataPartitions.lData[index];
+            theDF = (_DataSetFilter*)dataSetFilterList(dfID);
+            _HYButtonBar*       bb = (_HYButtonBar*)GetObject(2);
+            bb->_UnpushButton();
+            if (treeVarReferences.lData[index]>=0) {
+                stashParameter (noInternalLabels,1.0,true);
+                _String* treeString = (_String*)((_TheTree*)LocateVar(treeVarReferences.lData[index]))->toStr();
+                _FString treeFS (*treeString);
+                DeleteObject (treeString);
+                setParameter (dataFileTreeString, &treeFS);
+                setParameter (dataFileTree, 1.0);
+                stashParameter (noInternalLabels,1.0,false);
+            }
+        } else {
+            if (dsXtra) {
+                theDF = new _DataSetFilter;
+                checkPointer (theDF);
+                _SimpleList e1;
+                theDF->SetFilter (dsXtra,1,sp->speciesIndex,e1,false);
+                cleanUp = true;
+            }
+
+            else {
+                if (dataWrapper) {
+                    theDF = dataWrapper;
+                } else {
+                    theDF = new _DataSetFilter;
+                    _DataSet* ds = (_DataSet*)dataSetList(dataSetID);
+                    checkPointer (theDF);
+                    _SimpleList e1;
+                    theDF->SetFilter (ds,1,sp->speciesIndex,e1,false);
+                    cleanUp = true;
+                }
+            }
+        }
+        _String     fileName,prompt ("Save partition as:"),
+                    defFileName (index>=0?(*(_String*)dataSetFilterNamesList(dfID)):
+                                 (*(_String*)dataSetNamesList(dataSetID))),
+                    listLabel("File Format:");
+
+        if ((index>=0)||(!dsFile)) {
+            formatChoice = SaveFileWithPopUp (fileName,prompt,defFileName,listLabel,dfFilterFormats);
+        } else {
+            _Parameter     dsFormat;
+            checkParameter (dataFilePrintFormat, dsFormat,0);
+            formatChoice = dsFormat;
+        }
+
+        if (formatChoice>=0) {
+            FILE*  outFile = doFileOpen ((dsFile?dsFile->sData:fileName.sData),"w");
+            if (!outFile) {
+                fileName = _String("Trying to open ")&(dsFile?*dsFile:fileName)&" for writing failed. Oops!";
+                ProblemReport (fileName,(Ptr)this);
+                return empty;
+            }
+            dfID = LocateVarByName (dataFilePrintFormat);
+            if (dfID<0) {
+                _Variable dummyVar (dataFilePrintFormat);
+                dfID = LocateVarByName (dataFilePrintFormat);
+            }
+            _Variable* settingsVar = FetchVar(dfID);
+            _Constant  dummy (formatChoice);
+            _Parameter saveDefFormat = settingsVar->Value();
+
+            settingsVar->SetValue (&dummy);
+            _SimpleList savedOrder;
+            savedOrder.Duplicate(&theDF->theNodeMap);
+            theDF->SetMap(sp->speciesIndex);
+            theDF->toFileStr(outFile);
+            dummy.SetValue (saveDefFormat);
+            theDF->SetMap(savedOrder);
+            settingsVar->SetValue (&dummy);
+
+            fclose (outFile);
+            if (cleanUp) {
+                DeleteObject (theDF);
+            }
+            return (dsFile?*dsFile:fileName);
+        }
+        if (cleanUp) {
+            DeleteObject (theDF);
+        }
+    }
+    return empty;
+}
+
+//__________________________________________________________
+void  _HYDataPanel::KillPartition (long index)
+{
+    if (dataSetID>=0) {
+        if ((index<0)||(index>=dataPartitions.lLength)) {
+            return;
+        }
+        if (!PurgeLFFilter(index)) {
+            return;
+        }
+        long dfID = dataPartitions.lData[index];
+        _DataSetFilter *theDF = (_DataSetFilter*)dataSetFilterList(dfID);
+        UnmarkSites (theDF->theOriginalOrder,index);
+        dataPartitions.Delete(index);
+        treeVarReferences.Delete(index);
+        modelReferences.Delete(index);
+        partitionColors.Delete(index);
+        partData.Delete (index);
+        DeletePartitionRow (index);
+
+        if (dataPartitions.lLength) {
+            if (index==dataPartitions.lLength) {
+                index--;
+            }
+            _SimpleList newSel;
+            newSel<<index;
+            _HYTable* pT = (_HYTable*)GetObject (5);
+            pT->SetRowSelection (newSel);
+        }
+        CorrectSites (index);
+        KillDataFilterRecord (dfID);
+        UpdatePartitionOperations();
+        BuildThermometer();
+        BuildMarksPane();
+        tainted = true;
+    }
+}
+
+//__________________________________________________________
+void  _HYDataPanel::CombPartition (long index)
+{
+    if (dataSetID>=0) {
+        _SimpleList res;
+        bool        okcancel = false;
+
+        _HYCombDialog* sd = new _HYCombDialog (&res,&okcancel, (Ptr)this);
+        sd->Activate();
+        while (windowObjectRefs.Find ((long)sd)>=0) {
+            handleGUI();
+        }
+
+        if (okcancel)
+            //if (ChooseCombingPattern(res))
+        {
+            if (res.lLength>=2) {
+                _SimpleList     combed, steps;
+                long            k,m,n;
+
+                for (k=0; k<res.lLength; k++)
+                    if (res.lData[k]) {
+                        steps<<k;
+                    }
+                if (index>=0) {
+                    if (!PurgeLFFilter (index)) {
+                        return;
+                    }
+
+                    long dfID = dataPartitions.lData[index];
+                    _DataSetFilter *theDF = (_DataSetFilter*)dataSetFilterList(dfID);
+                    theDF->theOriginalOrder.Sort();
+                    k = 0;
+                    while (k<theDF->theOriginalOrder.lLength) {
+                        m = 0;
+                        n = k+steps.lData[m];
+                        while (n<theDF->theOriginalOrder.lLength) {
+                            combed<<theDF->theOriginalOrder.lData[n];
+                            m++;
+                            if (m==steps.lLength) {
+                                break;
+                            }
+                            n = k+steps.lData[m];
+                        }
+
+                        k+=res.lLength;
+                    }
+                    UnmarkSites (theDF->theOriginalOrder,index);
+                    MarkSites (combed,index);
+                    steps.Clear();
+                    if (dataWrapper) {
+                        steps.Duplicate (&dataWrapper->theNodeMap);
+                    }
+                    theDF->SetFilter((_DataSet*)dataSetList(dataSetID),1,steps,combed,false);
+                } else {
+                    _HYSequencePane* sp = (_HYSequencePane*)GetObject(0);
+                    if (sp->selection.lLength>=3) {
+                        k = 0;
+                        while (k<sp->selection.lLength) {
+                            m = 0;
+                            n = k+steps.lData[m];
+                            while (n<sp->selection.lLength) {
+                                combed<<sp->selection.lData[n];
+                                m++;
+                                if (m==steps.lLength) {
+                                    break;
+                                }
+                                n = k+steps.lData[m];
+                            }
+                            k+=res.lLength;
+                        }
+                        CreatePartition(combed);
+                    }
+
+
+                }
+                BuildThermometer();
+                BuildMarksPane();
+            }
+        }
+        _HYButtonBar*       bb = (_HYButtonBar*)GetObject (2);
+        bb->_UnpushButton();
+    }
+}
+
+//__________________________________________________________
+void  _HYDataPanel::SplitPartition (long index, long split)
+{
+    if (dataSetID>=0) {
+        if ((index<0)||(index>=dataPartitions.lLength)) {
+            return;
+        }
+
+        if ((partitionColors.lLength==255)&&(siteAssignments.Find(-2)>=0)) {
+            _String errMsg = _String("Couldn't perform partition splitting. ")&overlapWarning;
+            ProblemReport (errMsg,(Ptr)this);
+            return;
+        }
+
+        long             k,
+                         m,
+                         geneticCode = 0;
+
+        bool             direction = true;
+        char             readFrame = 0;
+
+        LongToPartData (partData.lData[index],readFrame,direction,geneticCode);
+        if (!PurgeLFFilter(index)) {
+            return;
+        }
+
+        _DataSetFilter *theDF = (_DataSetFilter*)dataSetFilterList(dataPartitions(index));
+        _SimpleList   smallerPartition, secondPartition, emptyList;
+        for (k=0; k<theDF->theOriginalOrder.lLength; k++) {
+            m = theDF->theOriginalOrder.lData[k];
+            if (m<split) {
+                smallerPartition<<m;
+            } else {
+                secondPartition<<m;
+            }
+        }
+        if (secondPartition.lLength%theDF->GetUnitLength()) {
+            _String warnMsg (
+                "Your splitting position isn't valid, because the resulting partitions will NOT contain a whole number\
+of evolutionary units (di-nucs or codons). Move your splitting position or change the datatype to nucleotide.");
+            ProblemReport (warnMsg,(Ptr)this);
+            _HYButtonBar*       bb = (_HYButtonBar*)GetObject (2);
+            bb->_UnpushButton();
+            return;
+        }
+        UnmarkSites (theDF->theOriginalOrder,index);
+        MarkSites (smallerPartition,index);
+        if (dataWrapper) {
+            emptyList.Duplicate (&dataWrapper->theNodeMap);
+        }
+        theDF->SetFilter((_DataSet*)dataSetList(dataSetID),theDF->GetUnitLength(),emptyList,smallerPartition,false);
+        CreatePartition(secondPartition, theDF->GetUnitLength());
+
+        modelReferences.lData[modelReferences.lLength-1] = modelReferences.lData[index];
+        partData.lData[partData.lLength-1] = partData.lData[index];
+
+        if (theDF->GetUnitLength()==3) {
+            _DataSetFilter *DF2 = (_DataSetFilter*)dataSetFilterList (dataPartitions.lData[partData.lLength-1]);
+            SetCodonExclusions (DF2,partData.lLength-1,geneticCode);
+            SetCodonExclusions (theDF,index,geneticCode);
+            theDF->SetDimensions();
+            DF2->SetDimensions();
+        }
+
+        _List mOptions;
+        GenerateModelList (mOptions,partData.lLength-1);
+        RefreshPartRow(mOptions,partData.lLength-1,true);
+    }
+}
+
+//__________________________________________________________
+void  _HYDataPanel::JoinPartitions (long i, long j)
+{
+    if (dataSetID>=0) {
+        long k,m;
+        _DataSetFilter *theDF = (_DataSetFilter*)dataSetFilterList(dataPartitions(i)),
+                        *DF2 = (_DataSetFilter*)dataSetFilterList(dataPartitions(j));
+        bool           updateTransl = false;
+        if (partData.lData[i]!=partData.lData[j]) {
+            _String warnMsg ("The codon paritions that you are about to join have different properties (reading frame and/or directions and/or genetic codes). The resulting partition will inherit the settings of ");
+            warnMsg = warnMsg & *(_String*)dataSetFilterNamesList (i) &'.';
+            if (!ProceedPrompt (warnMsg,(Ptr)this)) {
+                return;
+            }
+            _HYButtonBar*       bb = (_HYButtonBar*)GetObject (2);
+            bb->_UnpushButton();
+            updateTransl = (HY_DATAPANEL_TRANSLATION&addedLines);
+        }
+
+        if (!(PurgeLFFilter(i)&&PurgeLFFilter (j))) {
+            return;
+        }
+
+        long             geneticCode = 0;
+        bool             direction = true;
+        char             readFrame = 0;
+
+        LongToPartData (partData.lData[i],readFrame,direction,geneticCode);
+
+        _SimpleList   jointPartition, emptyList, colorSites;
+        jointPartition.Duplicate (&theDF->theOriginalOrder);
+        for (k=0; k<DF2->theOriginalOrder.lLength; k++) {
+            m = DF2->theOriginalOrder.lData[k];
+            if (siteAssignments.lData[m]>=0) {
+                jointPartition<<m;
+                siteAssignments.lData[m]=i;
+                overlaps.lData[m]=0;
+            } else {
+                if (theDF->theOriginalOrder.Find(m)<0) {
+                    jointPartition<<m;
+                    colorSites<<m;
+                }
+            }
+        }
+        UnmarkSites (DF2->theOriginalOrder, j);
+        MarkSites (colorSites,i);
+        if (dataWrapper) {
+            emptyList.Duplicate (&dataWrapper->theNodeMap);
+        }
+        theDF->SetFilter((_DataSet*)dataSetList(dataSetID),theDF->GetUnitLength(),emptyList,jointPartition,false);
+        treeVarReferences.Delete(j);
+        modelReferences.Delete(j);
+        partitionColors.Delete(j);
+        partData.Delete (j);
+        DeletePartitionRow (j);
+        KillDataFilterRecord (dataPartitions(j));
+        CorrectSites (j);
+        dataPartitions.Delete(j);
+        UpdatePartitionOperations();
+
+        if (theDF->GetUnitLength()==3) {
+            SetCodonExclusions (theDF,i,geneticCode);
+            theDF->SetDimensions();
+        }
+
+        if (updateTransl) {
+            _String dummy;
+            UpdateTranslationString (dummy, translatedSequence,true);
+        }
+        BuildThermometer();
+        BuildMarksPane();
+    }
+}
+
+//__________________________________________________________
+void  _HYDataPanel::InterleavePartitions (long i, long j, bool dir1, bool dir2)
+{
+    if (dataSetID>=0) {
+        long k,m;
+
+        if (!(PurgeLFFilter(i)&&PurgeLFFilter(j))) {
+            return;
+        }
+
+        _DataSetFilter *theDF = (_DataSetFilter*)dataSetFilterList(dataPartitions(i)),
+                        *DF2 = (_DataSetFilter*)dataSetFilterList(dataPartitions(j));
+
+        _SimpleList   jointPartition, emptyList, colorSites;
+        if (dir1&&dir2)
+            // both reverse
+        {
+            m = DF2->theOriginalOrder.lLength-1;
+            for (k=theDF->theOriginalOrder.lLength-1; (k>=0)&&(m>=0) ; k--, m--) {
+                jointPartition << theDF->theOriginalOrder.lData[k];
+                jointPartition << DF2->theOriginalOrder.lData[m];
+            }
+            while (m>0) {
+                jointPartition << DF2->theOriginalOrder.lData[m--];
+            }
+            while (k>0) {
+                jointPartition << theDF->theOriginalOrder.lData[k--];
+            }
+
+        } else if (dir1)
+            // first reverse
+        {
+            m = 0;
+            for (k=theDF->theOriginalOrder.lLength-1; (k>=0)&&(m<DF2->theOriginalOrder.lLength) ; k--, m++) {
+                jointPartition << theDF->theOriginalOrder.lData[k];
+                jointPartition << DF2->theOriginalOrder.lData[m];
+            }
+            while (m<DF2->theOriginalOrder.lLength) {
+                jointPartition << DF2->theOriginalOrder.lData[m++];
+            }
+            while (k>0) {
+                jointPartition << theDF->theOriginalOrder.lData[k--];
+            }
+
+        } else if (dir2) {
+            m = DF2->theOriginalOrder.lLength-1;
+            for (k=0; (k<theDF->theOriginalOrder.lLength)&&(m>=0) ; k++, m--) {
+                jointPartition << theDF->theOriginalOrder.lData[k];
+                jointPartition << DF2->theOriginalOrder.lData[m];
+            }
+            while (m>0) {
+                jointPartition << DF2->theOriginalOrder.lData[m--];
+            }
+            while (k<theDF->theOriginalOrder.lLength) {
+                jointPartition << theDF->theOriginalOrder.lData[k++];
+            }
+
+        } else
+            // both normal
+        {
+            m = 0;
+            for (k=0; (k<theDF->theOriginalOrder.lLength)&&(m<DF2->theOriginalOrder.lLength) ; k++, m++) {
+                jointPartition << theDF->theOriginalOrder.lData[k];
+                jointPartition << DF2->theOriginalOrder.lData[m];
+            }
+            while (m<DF2->theOriginalOrder.lLength) {
+                jointPartition << DF2->theOriginalOrder.lData[m++];
+            }
+            while (k<theDF->theOriginalOrder.lLength) {
+                jointPartition << theDF->theOriginalOrder.lData[k++];
+            }
+        }
+
+        UnmarkSites (DF2->theOriginalOrder, j);
+        MarkSites (DF2->theOriginalOrder,i);
+        if (dataWrapper) {
+            emptyList.Duplicate (&dataWrapper->theNodeMap);
+        }
+        theDF->SetFilter((_DataSet*)dataSetList(dataSetID),theDF->GetUnitLength(),emptyList,jointPartition,false);
+        treeVarReferences.Delete(j);
+        modelReferences.Delete(j);
+        partitionColors.Delete(j);
+        partData.Delete (j);
+        DeletePartitionRow (j);
+        KillDataFilterRecord (dataPartitions(j));
+        CorrectSites (j);
+        dataPartitions.Delete(j);
+        UpdatePartitionOperations();
+        BuildThermometer();
+        BuildMarksPane();
+    }
+}
+
+//__________________________________________________________
+void  _HYDataPanel::SubtractPartitions (long i, long j)
+{
+    if (dataSetID>=0) {
+        long k,m;
+        _DataSetFilter *theDF = (_DataSetFilter*)dataSetFilterList(dataPartitions(i)),
+                        *DF2   = (_DataSetFilter*)dataSetFilterList(dataPartitions(j));
+
+
+        _SimpleList     splitPartition,
+                        emptyList,
+                        uncolorSites;
+
+        for (k=0; k<theDF->theOriginalOrder.lLength; k++) {
+            m = theDF->theOriginalOrder.lData[k];
+            if (siteAssignments.lData[m]<0) {
+                if (DF2->theOriginalOrder.Find(m)<0) {
+                    splitPartition << m;
+                } else {
+                    uncolorSites<<m;
+                }
+            } else {
+                splitPartition << m;
+            }
+        }
+        UnmarkSites (uncolorSites, i);
+
+        if (!PurgeLFFilter(i)) {
+            return;
+        }
+
+        if (splitPartition.lLength) {
+            long             geneticCode = 0;
+            bool             direction = true;
+            char             readFrame = 0;
+            LongToPartData (partData.lData[i],readFrame,direction,geneticCode);
+
+            if (dataWrapper) {
+                emptyList.Duplicate (&dataWrapper->theNodeMap);
+            }
+
+            theDF->SetFilter((_DataSet*)dataSetList(dataSetID),theDF->GetUnitLength(),emptyList,splitPartition,false);
+            if (theDF->GetUnitLength()==3) {
+                SetCodonExclusions (theDF,i,geneticCode);
+                theDF->SetDimensions();
+            }
+        } else {
+            treeVarReferences.Delete(i);
+            modelReferences.Delete(i);
+            partitionColors.Delete(i);
+            partData.Delete (i);
+            DeletePartitionRow (i);
+            KillDataFilterRecord (dataPartitions(i));
+            CorrectSites (i);
+            dataPartitions.Delete(i);
+        }
+        UpdatePartitionOperations();
+        BuildThermometer();
+        BuildMarksPane();
+    }
+}
+//__________________________________________________________
+void _HYDataPanel::UpdatePartitionOperations (void)
+{
+    _HYButtonBar* bb = (_HYButtonBar*)GetObject (2);
+    _HYTable    * pl = (_HYTable*)GetObject (5);
+    _SimpleList   selp,
+                  toggles;
+
+    pl->GetRowSelection (selp);
+
+    bb->EnableButton(0,false);
+    bb->EnableButton(1,false);
+    bb->EnableButton(2,false);
+    bb->EnableButton(4,false);
+    bb->EnableButton(6,false);
+    bb->EnableButton(7,false);
+
+    bb->EnableButton(3,selp.lLength);
+
+    if (selp.lLength == 1) {
+        toggles<<1;
+        bb->EnableButton(5,true);
+        bb->EnableButton(0,CanSplit());
+        bb->EnableButton(4,CanComb(selp.lData[0]));
+        bb->EnableButton(7,true);
+
+    } else {
+        toggles<<0;
+        bb->EnableButton(5,false);
+        if (selp.lLength >= 2) {
+            bool canJoinAll = true;
+            for (long pi=1; pi<selp.lLength; pi++)
+                if (!CanJoin (selp.lData[pi-1],selp.lData[pi])) {
+                    canJoinAll = false;
+                    break;
+                }
+
+            bb->EnableButton (1,canJoinAll);
+
+        }
+        if (selp.lLength == 2) {
+            if (CanSubtract (selp.lData[0],selp.lData[1])) {
+                bb->EnableButton (2,true);
+            }
+            if (CanInterleave (selp.lData[0],selp.lData[1])) {
+                bb->EnableButton (6,true);
+            }
+        } else if (selp.lLength == 0) {
+            UpdateSelDepPartitionOperations();
+        }
+    }
+    _UpdatePartitionOperations(&toggles);
+}
+
+//__________________________________________________________
+void _HYDataPanel::UpdateSelDepPartitionOperations (void)
+{
+    _HYTable*           dl = (_HYTable*)        GetObject (5);
+    _HYButtonBar*       bb = (_HYButtonBar*)    GetObject (2);
+    _HYSequencePane*    sp = (_HYSequencePane*) GetObject (0);
+
+    _SimpleList         selp;
+    dl->GetRowSelection (selp);
+
+    if (selp.lLength!=1) {
+        bb->EnableButton(4,(sp->selection.lLength>=3));
+    }
+
+    if (selp.lLength == 1) {
+        bb->EnableButton(0,CanSplit());
+    } else {
+        bb->EnableButton(0,false);
+    }
+
+    statusBar.Trim (0,statusBar.Find (selectionStatPrefix)+selectionStatPrefix.sLength-1);
+    _String newSB (statusBar);
+
+    if (sp->selection.lLength==0) {
+        if (sp->vselection.lLength) {
+            bb->EnableButton(1,CanJoinSpecies(sp->vselection));
+            bb->EnableButton (3,true);
+        } else {
+            bb->EnableButton (3,false);
+        }
+        newSB = newSB &"empty";
+    } else {
+        long hi = sp->selection.lData[sp->selection.lLength-1]+1,
+             lo = sp->selection.lData[0]+1;
+
+        if (hi-lo+1>sp->selection.lLength) {
+            newSB = newSB & " part of ";
+        }
+
+        newSB = newSB & _String (lo) & '-' & _String (hi);
+    }
+    if (!statusBar.Equal(&newSB)) {
+        SetStatusBar (newSB);
+        if (forceUpdateForScrolling) {
+            _PaintStatusBar();
+            _PaintLFStatus ();
+        }
+    }
+}
+
+//__________________________________________________________
+void _HYDataPanel::JoinSpeciesDisplay (void)
+{
+    _HYSequencePane*    sp = (_HYSequencePane*)GetObject(0);
+    _HYButtonBar*       bb = (_HYButtonBar*)GetObject (2);
+    _SimpleList  newSpIndex;
+    long         k,m=1,p=sp->vselection.lData[0];
+
+    for (k=0; k<=sp->vselection.lData[0]; k++) {
+        newSpIndex<<sp->speciesIndex.lData[k];
+    }
+    for (k=1; k<sp->vselection.lLength; k++) {
+        newSpIndex<<sp->speciesIndex.lData[sp->vselection.lData[k]];
+    }
+    for (k=sp->vselection.lData[0]+1; k<sp->speciesIndex.lLength; k++) {
+        if (k==sp->vselection.lData[m]) {
+            m++;
+            if (m==sp->vselection.lLength) {
+                break;
+            }
+        } else {
+            newSpIndex<<sp->speciesIndex.lData[k];
+        }
+    }
+    for (k++; k<sp->speciesIndex.lLength; k++) {
+        newSpIndex<<sp->speciesIndex.lData[k];
+    }
+    sp->speciesIndex.Clear();
+    sp->speciesIndex.Duplicate (&newSpIndex);
+    m=sp->vselection.lLength;
+    sp->vselection.Clear();
+    for (k=p; k<p+m; k++) {
+        sp->vselection<<k;
+    }
+    sp->BuildPane();
+    sp->_MarkForUpdate();
+    bb->EnableButton (1,false);
+}
+
+//__________________________________________________________
+void _HYDataPanel::OmitSelectedSpecies (void)
+{
+    _HYSequencePane*    sp = (_HYSequencePane*)GetObject(0);
+    _HYButtonBar*       bb = (_HYButtonBar*)GetObject (2);
+    _HYTable    *       pl = (_HYTable*)GetObject (5);
+
+    long                k;
+
+    if (sp->vselection.lLength==0) {
+        return;
+    }
+
+    if (sp->speciesIndex.lLength-sp->vselection.lLength<2) {
+        ProblemReport(cantOmitWarning,(Ptr)this);
+        bb->_UnpushButton ();
+        return;
+    }
+
+    if (!warnOmit) {
+        bool prcd = ProceedPromptWithCheck (seqOmitWarning,donotWarnAgain,warnOmit, (Ptr)this);
+        bb->_UnpushButton ();
+        if (!prcd) {
+            return;
+        }
+    }
+
+    if (!PurgeLF()) {
+        return;
+    }
+
+    // remove tree references from the table
+    bool    update = false;
+    for (k=0; k<treeVarReferences.lLength; k++)
+        if (treeVarReferences.lData[k]>=0) {
+            treeVarReferences.lData[k]=-1;
+            long idx = k*pl->horizontalSpaces.lLength+DF_TREE_COLUMN;
+            pl->SetCellData (&none, k,DF_TREE_COLUMN, pl->cellTypes.lData[idx],true);
+            update = true;
+        }
+
+    if (update) {
+        pl->_MarkColumnForUpdate (2);
+    }
+
+    _SimpleList         omit;
+    for (k=0; k<sp->vselection.lLength; k++) {
+        //omittedSeqs.InsertElement((BaseRef)(sp->speciesIndex.lData[sp->vselection.lData[k]]),-1,false,false);
+        omittedSeqs<<sp->speciesIndex.lData[sp->vselection.lData[k]];
+        omit<<sp->speciesIndex.lData[sp->vselection.lData[k]];
+    }
+    _OmitSelectedSpecies(omit);
+    for (k=sp->vselection.lLength-1; k>=0; k--) {
+        sp->speciesIndex.Delete (sp->vselection.lData[k]);
+    }
+
+    UpdateDataWrapper();
+    sp->vselection.Clear();
+    sp->BuildPane();
+    sp->_MarkForUpdate();
+    bb->EnableButton (3,false);
+    _String newCS;
+    UpdateConsensusSequence (newCS,true);
+    SetWindowRectangle (top,left,bottom,right);
+}
+
+//__________________________________________________________
+void _HYDataPanel::RestoreOmittedSequence (long index)
+{
+    _HYSequencePane*    sp = (_HYSequencePane*)GetObject(0);
+
+    if (!PurgeLF()) {
+        return;
+    }
+
+    _RestoreOmittedSequence(index);
+
+    if (index>=0) {
+        sp->speciesIndex << omittedSeqs.lData[index];
+        omittedSeqs.Delete(index);
+    } else {
+        for (long k=0; k<omittedSeqs.lLength; k++) {
+            sp->speciesIndex << omittedSeqs.lData[k];
+        }
+        omittedSeqs.Clear();
+    }
+
+    UpdateDataWrapper();
+    sp->vselection.Clear();
+    sp->BuildPane();
+    sp->_MarkForUpdate();
+    _String newCS;
+    UpdateConsensusSequence (newCS,true);
+    SetWindowRectangle (top,left,bottom,right);
+}
+//__________________________________________________________
+void _HYDataPanel::UpdateDataWrapper()
+{
+    _DataSet            *ds = (_DataSet*)dataSetList (dataSetID);
+    _HYSequencePane*    sp  = (_HYSequencePane*)GetObject(0);
+    if (!dataWrapper) {
+        dataWrapper = new _DataSetFilter();
+    }
+
+    if (!omittedSeqs.lLength) {
+        DeleteObject (dataWrapper);
+        dataWrapper = nil;
+    } else {
+        _SimpleList dummy;
+        dataWrapper->SetFilter (ds,1,sp->speciesIndex,dummy,false);
+    }
+
+    for (long k=0; k<dataPartitions.lLength; k++) {
+        _SimpleList vp;
+        _DataSetFilter* dsf = (_DataSetFilter*)dataSetFilterList (dataPartitions.lData[k]);
+        // check tree remaps here
+        vp.Duplicate(&dsf->theOriginalOrder);
+        dsf->SetFilter (ds,dsf->GetUnitLength(),sp->speciesIndex,vp,false);
+        if (dsf->GetUnitLength() == 3) {
+            long             geneticCode = 0;
+            bool             direction = true;
+            char             readFrame = 0;
+            LongToPartData  (partData.lData[k],readFrame,direction,geneticCode);
+            SetCodonExclusions (dsf,k,geneticCode);
+            dsf->SetDimensions();
+        }
+    }
+    if (addedLines&HY_DATAPANEL_CONSENSUS) {
+        _String newCS;
+        UpdateConsensusSequence (newCS,true);
+    }
+    GenerateStatusLine();
+}
+
+//__________________________________________________________
+
+bool _HYDataPanel::CanSplit (void)
+{
+    _HYTable*           dl = (_HYTable*)GetObject (5);
+    _HYSequencePane*    sp = (_HYSequencePane*)GetObject(0);
+
+    if (sp->selection.lLength!=1) {
+        return false;
+    }
+
+    _DataSetFilter*   thisFilter = (_DataSetFilter*)dataSetFilterList (dataPartitions(dl->GetFirstRowSelection()));
+
+    long k = sp->selection.lData[0];
+    k = thisFilter->theOriginalOrder.Find(k);
+
+    if (k>0) {
+        return true;
+    }
+
+    return false;
+}
+
+//__________________________________________________________
+
+bool _HYDataPanel::CanJoin (long i, long j)
+{
+    _DataSetFilter* fi = (_DataSetFilter*)dataSetFilterList (dataPartitions(i)),
+                    * fj = (_DataSetFilter*)dataSetFilterList (dataPartitions(j));
+    return fi->GetUnitLength()==fj->GetUnitLength();
+}
+
+//__________________________________________________________
+
+bool _HYDataPanel::CanInterleave (long i, long j)
+{
+    _DataSetFilter* fi = (_DataSetFilter*)dataSetFilterList (dataPartitions(i)),
+                    * fj = (_DataSetFilter*)dataSetFilterList (dataPartitions(j));
+    if ((fi->GetUnitLength()==1)&&(fj->GetUnitLength()==1)) {
+        return (!CanSubtract(i,j));
+    }
+    return false;
+}
+
+//__________________________________________________________
+
+bool _HYDataPanel::CanSubtract (long i, long j)
+{
+    _DataSetFilter* fi = (_DataSetFilter*)dataSetFilterList (dataPartitions(i)),
+                    * fj = (_DataSetFilter*)dataSetFilterList (dataPartitions(j));
+    if (fi->GetUnitLength()==fj->GetUnitLength()) {
+        for (long k=0; k<fi->theOriginalOrder.lLength; k++) {
+            long m = fi->theOriginalOrder.lData[k];
+            if (siteAssignments.lData[m]<0) {
+                long p  = overlaps.lData[m],
+                     p1 = p&0xFF,
+                     p2 = (p&0xFF00)>>8,
+                     p3 = (p&0xFF0000)>>16,
+                     p4 = (p&0xFF000000)>>24;
+                if (p3==0) {
+                    if (((i==p1)||(i==p2))&&((j==p1)||(j==p2))) {
+                        return true;
+                    }
+                    continue;
+                }
+                if (p4==0) {
+                    if (((i==p1)||(i==p2)||(i==p3))&&((j==p1)||(j==p2)||(j==p3))) {
+                        return true;
+                    }
+                    continue;
+                }
+                if (((i==p1)||(i==p2)||(i==p3)||(i==p4))&&((j==p1)||(j==p2)||(j==p3)||(j==p4))) {
+                    return true;
+                }
+            }
+        }
+    }
+    return false;
+}
+
+//__________________________________________________________
+
+bool _HYDataPanel::CanJoinSpecies (_SimpleList& vsel)
+{
+    if (vsel.lLength > 1) {
+        for (long k=1; k<vsel.lLength; k++)
+            if (vsel.lData[k]-vsel.lData[k-1]>1) {
+                return true;
+            }
+    }
+    return false;
+}
+
+//__________________________________________________________
+
+bool _HYDataPanel::CanComb (long i)
+{
+    _DataSetFilter* fi = (_DataSetFilter*)dataSetFilterList (dataPartitions(i));
+    return fi->GetUnitLength()==1;
+}
+
+//__________________________________________________________
+void _HYDataPanel::SelectPartition (void)
+{
+    _HYTable*        dl = (_HYTable*)GetObject (5);
+    _HYSequencePane* sp = (_HYSequencePane*)GetObject(0);
+
+    long filterIndex = dataPartitions(dl->GetFirstRowSelection());
+
+    _DataSetFilter*    dsf = (_DataSetFilter*)dataSetFilterList (filterIndex);
+
+    sp->SelectRange (dsf->theOriginalOrder);
+    sp->ScrollToHSelection();
+    UpdateSelDepPartitionOperations();
+    _UpdateSelectionChoices (true);
+}
+
+//__________________________________________________________
+void _HYDataPanel::InvertSelection(void)
+{
+    _HYSequencePane* sp = (_HYSequencePane*)GetObject(0);
+
+    _SimpleList     newSel,
+                    *selList = nil;
+
+    long            shift = 0,
+                    k = 0,
+                    upTo;
+
+    if (sp->vselection.lLength) {
+        selList = &sp->vselection;
+        upTo    = sp->speciesIndex.lLength;
+    } else {
+        selList = &sp->selection;
+        upTo    = sp->columnStrings.lLength;
+        if (selList->lLength == 0 &&  ((_HYTable*)GetObject (5))->GetFirstRowSelection() >=0) {
+            SelectPartition ();
+            InvertSelection ();
+            return;
+        }
+
+    }
+
+    for (; (k<upTo)&&(shift<selList->lLength); k++) {
+        if (k==selList->lData[shift]) {
+            shift++;
+        } else {
+            newSel<<k;
+        }
+    }
+
+    for (; k<upTo; k++) {
+        newSel<<k;
+    }
+
+    sp->SelectRange (newSel,sp->vselection.lLength);
+    UpdateSelDepPartitionOperations();
+    _UpdateSelectionChoices (true);
+}
+
+//__________________________________________________________
+void _HYDataPanel::PartitionPropsMenu (void)
+{
+    _HYTable*   dl = (_HYTable*)GetObject (5);
+
+    EditPartitionProperties (dl->GetFirstRowSelection());
+}
+//__________________________________________________________
+
+void _HYDataPanel::ProcessContextualPopUpMain (long l, long t)
+{
+    _HYSequencePane*  sp = (_HYSequencePane*)GetObject (0);
+    _List             menuItems;
+
+    _String           buffer;
+
+    if (sp->selection.lLength) {
+        if (dataType&HY_DATAPANEL_NUCDATA) {
+            menuItems&& & contextString1;
+        } else if (dataType&HY_DATAPANEL_PROTDATA) {
+            menuItems&& & contextString2;
+        } else if (dataType&HY_DATAPANEL_BINARYDATA) {
+            menuItems&& & contextString1_5;
+        }
+
+        menuItems&& & contextString13;
+        if (dataType&HY_DATAPANEL_PROTDATA) {
+            menuItems&& & contextString17;
+        }
+
+        menuItems&& & contextString15;
+
+        if (sp->selection.lLength==1) {
+            if (menuItems.lLength) {
+                buffer = menuSeparator;
+                menuItems&& & buffer;
+            }
+            menuItems && & contextString4;
+            menuItems && & contextString14;
+        }
+
+        buffer = HandlePullDown (menuItems,l,t,0);
+
+        if (buffer.Equal (&contextString4)) {
+            // select all sites like this one
+            _SimpleList     matches;
+            if (dataWrapper) {
+                dataWrapper->FindAllSitesLikeThisOne(sp->selection.lData[0],matches);
+            } else {
+                _DataSet* ds = (_DataSet*)dataSetList (dataSetID);
+                ds->FindAllSitesLikeThisOne(sp->selection.lData[0],matches);
+            }
+            _String fres (32L, true);
+            if (matches.lLength>1) {
+                sp->selection.Clear();
+                sp->selection.Duplicate (&matches);
+                sp->BuildPane();
+                sp->_MarkForUpdate();
+                UpdateSelDepPartitionOperations();
+                fres << "Found ";
+                fres << (long)matches.lLength;
+                fres << " sites like the one selected\n";
+            } else {
+                BufferToConsole ("Selected site is unique\n");
+            }
+        } else if (buffer.Equal (&contextString1) || buffer.Equal (&contextString2) || buffer.Equal (&contextString1_5) ) {
+            char      bufferS [512];
+            _DataSet* ds = (_DataSet*)dataSetList (dataSetID);
+            _Matrix*  freqs = ds->HarvestFrequencies(1,1,false,sp->speciesIndex,sp->selection);
+            long      totCount = sp->speciesIndex.lLength*sp->selection.lLength;
+            if (buffer.Equal (&contextString1)) {
+                snprintf (bufferS, sizeof(bufferS),"\nNucleotide counts and frequencies (%luu sites)\nA:\t%g\t%g\nC:\t%g\t%g\nG:\t%g\t%g\nT:\t%g\t%g\n",sp->selection.lLength,
+                         (totCount*(*freqs)[0]),(*freqs)[0],(totCount*(*freqs)[1]),(*freqs)[1],(totCount*(*freqs)[2]),(*freqs)[2],(totCount*(*freqs)[3]),(*freqs)[3]);
+                BufferToConsole (bufferS);
+            } else if (buffer.Equal (&contextString2)) {
+                snprintf (bufferS, sizeof(bufferS),"\nAminoacid counts and frequencies (%lu sites)",sp->selection.lLength);
+                BufferToConsole (bufferS);
+                for (long k=0; k<aminoAcidOneCharCodes.sLength; k++) {
+                    snprintf (bufferS, sizeof(bufferS),"\n%c:\t%g\t%g",aminoAcidOneCharCodes.sData[k],(totCount*(*freqs)[k]),(*freqs)[k]);
+                    BufferToConsole (bufferS);
+                }
+                NLToConsole ();
+            } else {
+                snprintf (bufferS, sizeof(bufferS),"\nBinary counts and frequencies (%lu sites)\n0:\t%g\t%g\n1:\t%g\t%g\n",sp->selection.lLength,
+                         (totCount*(*freqs)[0]),(*freqs)[0],(totCount*(*freqs)[1]),(*freqs)[1]);
+                BufferToConsole (bufferS);
+            }
+            DeleteObject(freqs);
+        } else {
+            if (buffer.Equal (&contextString13) || buffer.Equal (&contextString17)) {
+                _String *toCopy;
+                if (buffer.Equal (&contextString13)) {
+                    toCopy = (_String*)sp->selection.ListToPartitionString();
+                } else {
+                    _SimpleList dup;
+                    dup.RequestSpace (sp->selection.lLength*3);
+                    for (long k=0; k<sp->selection.lLength; k++) {
+                        dup << 3*sp->selection.lData[k];
+                        dup << 3*sp->selection.lData[k]+1;
+                        dup << 3*sp->selection.lData[k]+2;
+                    }
+                    toCopy = (_String*)dup.ListToPartitionString();
+                }
+
+                PlaceStringInClipboard (*toCopy, (Ptr)this);
+                DeleteObject (toCopy);
+            } else {
+                if (buffer.Equal (&contextString14)) {
+                    _DataSet*       ds    = (_DataSet*)dataSetList (dataSetID);
+                    _String         aSite (*(_String*) (ds->_List::operator ()) (ds->GetTheMap().lData[sp->selection.lData[0]]));
+
+                    _SimpleList     remap;
+                    DeleteObject    (aSite.Sort(&remap));
+                    sp->SetSequenceOrder (remap);
+
+                } else if (buffer.Equal (&contextString15)) {
+                    _String  nhc ("Please choose a new highlight color");
+                    _HYColor newC = SelectAColor (sp->highlightColor,nhc);
+                    if (!(newC==sp->highlightColor)) {
+                        sp->SetHighliteColor (newC);
+                    }
+                }
+            }
+        }
+    } else {
+        _SimpleList     treeIDs;
+        for (long l2=0; l2<treeVarReferences.lLength; l2++) {
+            long t = treeVarReferences.lData[l2];
+            if (t>=0) {
+                buffer = _String("Order as in '")&*LocateVar(t)->GetName()&"'";
+                menuItems && & buffer;
+                treeIDs << l2;
+            }
+        }
+
+        if (sp->vselection.lLength==1) {
+            if (addedLines&HY_DATAPANEL_CONSENSUS) {
+                if (menuItems.lLength) {
+                    menuItems && & menuSeparator;
+                }
+                menuItems && & contextString5;
+                menuItems && & contextString10;
+            }
+
+            if ((addedLines&HY_DATAPANEL_REFERENCE)&&(genCodeID<0)) {
+                if (menuItems.lLength) {
+                    menuItems && & menuSeparator;
+                }
+                menuItems && & contextString8;
+            }
+        }
+
+        if (sp->vselection.lLength) {
+            menuItems && & copySeqsToClip;
+            menuItems && & contextString11;
+            menuItems && & contextString12;
+            menuItems && & contextString16;
+        }
+
+        if (menuItems.lLength) {
+            buffer = HandlePullDown (menuItems,l,t,0);
+            if (buffer.sLength)
+                if (buffer.Equal(&contextString5)||buffer.Equal(&contextString8)) {
+                    _SimpleList noMatch;
+                    t = sp->speciesIndex.lData[sp->vselection[0]];
+                    long        sl = 0;
+                    if (buffer.Equal (&contextString8)) {
+                        sl = ((_String*)statusData(l))->sLength-1;
+                    }
+                    for (l=0; l<sp->columnStrings.lLength; l++) {
+                        if (((_String*)sp->columnStrings(l))->sData[t]!=((_String*)statusData(l))->sData[sl]) {
+                            noMatch << l;
+                        }
+                    }
+                    if (noMatch.lLength==0) {
+                        BufferToConsole ("A perfect match!\n");
+                    } else {
+                        sp->vselection.Clear();
+                        sp->selection.Clear();
+                        sp->selection.Duplicate (&noMatch);
+                        sp->BuildPane();
+                        sp->_MarkForUpdate();
+                        UpdateSelDepPartitionOperations();
+                        char buffer [256];
+                        snprintf (buffer, sizeof(buffer),"%lu (%g %%) mismatches found\n",noMatch.lLength,
+                                 noMatch.lLength*100./(_Parameter)sp->columnStrings.lLength);
+                        BufferToConsole (buffer);
+                    }
+                } else {
+                    if (buffer.Equal(&contextString10)) {
+                        _String consString (sp->columnStrings.lLength,true);
+                        for (long kl =0; kl<sp->columnStrings.lLength; kl++) {
+                            consString << ((_String*)statusData(kl))->sData[0];
+                        }
+                        consString.Finalize();
+                        PlaceStringInClipboard (consString, GetOSWindowData());
+                    } else {
+                        if (buffer.Equal (&copySeqsToClip)) {
+                            _String theSeqs (sp->vselection.lLength*sp->columnStrings.lLength,true);
+
+                            for (long sc = 0; sc < sp->vselection.lLength; sc ++) {
+                                long seqIndex = sp->speciesIndex.lData[sp->vselection.lData[sc]];
+
+                                theSeqs << '>';
+                                theSeqs << *(_String*)sp->rowHeaders (seqIndex);
+                                theSeqs << '\n';
+                                for (long kl =0; kl<sp->columnStrings.lLength; kl++) {
+                                    theSeqs << ((_String*)sp->columnStrings(kl))->sData[seqIndex];
+                                }
+
+                                theSeqs << '\n';
+                            }
+                            theSeqs.Finalize();
+
+                            PlaceStringInClipboard (theSeqs, GetOSWindowData());
+                        } else {
+                            if (buffer.Equal (&contextString11)) {
+                                _DataSet* newDS     = new _DataSet (),
+                                * thisDS    = (_DataSet*)dataSetList (dataSetID);
+
+                                checkPointer (newDS);
+                                newDS->SetTranslationTable (thisDS->GetTT());
+                                for (long sc = 0; sc < sp->vselection.lLength; sc ++) {
+                                    long seqIndex = sp->speciesIndex.lData[sp->vselection.lData[sc]];
+
+                                    newDS->AddName (*(_String*)sp->rowHeaders (seqIndex));
+                                    if (sc == 0) {
+                                        for (long kl =0; kl<sp->columnStrings.lLength; kl++) {
+                                            newDS->AddSite (((_String*)sp->columnStrings(kl))->sData[seqIndex]);
+                                        }
+                                    } else
+                                        for (long kl =0; kl<sp->columnStrings.lLength; kl++) {
+                                            newDS->Write2Site (kl,((_String*)sp->columnStrings(kl))->sData[seqIndex]);
+                                        }
+                                }
+                                newDS->Finalize();
+                                newDS->SetNoSpecies (sp->vselection.lLength);
+                                _String newName (GetTitle());
+                                newName.Trim(newName.FirstSpaceIndex (0,-1,-1)+1,-1);
+                                AddDataSetToList (newName,newDS);
+                                _HYDataPanel* myTWindow = new _HYDataPanel(newName,newName);
+                                myTWindow->BringToFront();
+                            } else {
+                                if (buffer.Equal (&contextString12)) {
+                                    _String           res,
+                                                      prompt ("Minimum ambiguity %-age to be selected:");
+
+                                    if (EnterStringDialog (res,prompt,(Ptr)this)) {
+                                        _Parameter    gateValue = res.toNum();
+                                        if (gateValue < 0.0 || gateValue > 100.0) {
+                                            res = _String ("Invalid percentage: ") & res;
+                                            ProblemReport (res,(Ptr)this);
+                                        } else {
+                                            _SimpleList         newVerticalSelection;
+                                            _DataSet* thisDS    = (_DataSet*)dataSetList (dataSetID);
+                                            _TranslationTable* myTT = thisDS->GetTT();
+
+                                            long                charCount = myTT->LengthOfAlphabet(),
+                                                                *charSpool = new long [charCount],
+                                            dsLength  = thisDS->NoOfColumns();
+
+                                            checkPointer        (charSpool);
+
+                                            for (long sc = 0; sc < sp->vselection.lLength; sc ++) {
+                                                long seqIndex   = sp->speciesIndex.lData[sp->vselection.lData[sc]],
+                                                     ambigCount = 0;
+
+                                                for (long cc = 0; cc < dsLength; cc ++) {
+                                                    myTT->TokenCode ((*thisDS)(cc,seqIndex,1),charSpool);
+                                                    char countMe = 0;
+
+                                                    for (long cc2 = 0; cc2 < charCount && countMe < 2; cc2++) {
+                                                        countMe += charSpool[cc2];
+                                                    }
+
+                                                    if (countMe > 1) {
+                                                        ambigCount ++;
+                                                    }
+                                                }
+
+                                                if ((ambigCount*100.0)/dsLength >= gateValue) {
+                                                    newVerticalSelection << sp->vselection.lData[sc];
+                                                }
+                                            }
+
+                                            sp->SelectRange (newVerticalSelection,true);
+                                            delete charSpool;
+
+                                        }
+                                    }
+                                } else if (buffer.Equal (&contextString16)) {
+                                    long choice = SelectOpenWindowObjects (HY_WINDOW_KIND_TREE, "tree panel", treeSelectorPopulator, (Ptr)this);
+                                    if (choice>=0) {
+                                        _HYTreePanel * tp        = ((_HYTreePanel*)windowObjectRefs(choice));
+                                        _List          selectedSequences;
+                                        _String        treeNameString (*tp->LocateMyTreeVariable()->GetName()&'.');
+
+                                        for (long sc = 0; sc < sp->vselection.lLength; sc ++) {
+                                            _String seqName = treeNameString & *(_String*)sp->rowHeaders (sp->speciesIndex.lData[sp->vselection.lData[sc]]);
+                                            selectedSequences && & seqName;
+                                        }
+                                        selectedSequences.Sort();
+                                        tp->SelectRangeAndScroll(selectedSequences, false);
+
+                                    }
+                                } else {
+                                    t = treeIDs.lData[menuItems.Find(&buffer)];
+                                    _DataSetFilter* fi = (_DataSetFilter*)dataSetFilterList (dataPartitions(t));
+                                    if (((_TheTree*)LocateVar(treeVarReferences.lData[t]))->MatchLeavesToDF (treeIDs, fi, true)) {
+                                        sp->SetSequenceOrder (treeIDs);
+                                    }
+                                }
+                            }
+                        }
+                    }
+                }
+        }
+    }
+    _UpdateSelectionChoices(IsSelectionNonEmpty());
+}
+
+//__________________________________________________________
+
+void _HYDataPanel::ProcessContextualPopUpAux (long l, long t)
+{
+    _HYSequencePane*  sp = (_HYSequencePane*)GetObject (4);
+    _List             menuItems;
+
+    _String           buffer;
+
+    if (addedLines&HY_DATAPANEL_RATECLASS) {
+        long         dataCount [37],
+                     i,
+                     accessIndex = 0,
+                     m = 0;
+
+        char         c;
+
+        if (addedLines&HY_DATAPANEL_CONSENSUS) {
+            accessIndex ++;
+        }
+
+        for (i=0; i<37; i++) {
+            dataCount [i] = 0;
+        }
+
+        menuItems && & contextString6;
+        menuItems && & menuSeparator;
+
+        for (i=0; i<siteAssignments.lLength; i++) {
+            c = ((_String*)sp->columnStrings(i))->sData[accessIndex];
+            if (c=='*') {
+                dataCount [36]++;
+            } else if ((c>='0')&&(c<='9')) {
+                dataCount [c-'0']++;
+            } else {
+                dataCount [c-'A'+10]++;
+            }
+        }
+
+
+        for (i=0; i<10; i++) {
+            if (dataCount[i]>0) {
+                buffer = contextString7 & i;
+                menuItems && & buffer;
+                m = i;
+            }
+        }
+
+        for (i=0; i<26; i++) {
+            if (dataCount[i+10]>0) {
+                buffer = contextString7 & (char)('A'+i);
+                menuItems && & buffer;
+                m = i+10;
+            }
+        }
+
+        if (dataCount[36]) {
+            m = 36;
+            buffer = contextString7 & "*";
+            menuItems && & buffer;
+        }
+
+        menuItems && & menuSeparator;
+        buffer = "Auto-partition by rate class";
+        menuItems && & buffer;
+
+        i = m+1;
+
+        buffer = HandlePullDown (menuItems,l,t,0);
+
+        m = menuItems.Find (&buffer);
+
+        if (m==0) {
+            _List       rowTitles;
+            _String     entry ("Count");
+            rowTitles   && & entry;
+            entry = "Proportion";
+            rowTitles   && & entry;
+
+            entry       = _String("Frequency Data for ")&GetTitle();
+            _String     tryMe (entry);
+
+            m = 2;
+            while (FindWindowByName (tryMe)>=0) {
+                tryMe = entry & '[' & m &']';
+                m++;
+            }
+
+            _Matrix     dataPoints (i+1,2,false,true);
+            for (m=0; m<i; m++) {
+                dataPoints.Store (m,0,dataCount[m]);
+                dataPoints.Store (m,1,dataCount[m]/(_Parameter)siteAssignments.lLength);
+            }
+
+            _HYChartWindow* cw = new _HYChartWindow (tryMe,rowTitles, dataPoints, nil);
+            checkPointer (cw);
+            cw->SetChartType ("Bar Chart","Index","Count");
+
+            cw->BringToFront();
+        } else if (m>1) {
+            if (m!=menuItems.lLength-1) {
+                _SimpleList matches;
+                c = ((_String*)menuItems (m))->sData[((_String*)menuItems (m))->sLength-1];
+                for (i=0; i<siteAssignments.lLength; i++) {
+                    if (((_String*)sp->columnStrings(i))->sData[accessIndex] == c) {
+                        matches<<i;
+                    }
+                }
+                if (matches.lLength) {
+                    sp = (_HYSequencePane*)components(0);
+                    sp->selection.Clear();
+                    sp->selection.Duplicate (&matches);
+                    sp->BuildPane();
+                    sp->_MarkForUpdate();
+                    UpdateSelDepPartitionOperations();
+                    char    buffer[128];
+                    snprintf (buffer, sizeof(buffer),"Found %lu sites in rate class %c\n",matches.lLength,c);
+                    BufferToConsole (buffer);
+                }
+            } else {
+                _List  allMatches;
+                for (m=0; m<i; m++) {
+                    allMatches << new _SimpleList;
+                }
+
+                for (i=0; i<siteAssignments.lLength; i++) {
+                    c = ((_String*)sp->columnStrings(i))->sData[accessIndex];
+                    _SimpleList * ss;
+                    if ((c<='9')&&(c>='0')) {
+                        ss = (_SimpleList*)allMatches (c-'0');
+                    } else if ((c>='A')&&(c<='Z')) {
+                        ss = (_SimpleList*)allMatches (10+c-'A');
+                    } else {
+                        ss = (_SimpleList*)allMatches (36);
+                    }
+
+                    (*ss) << i;
+                }
+
+                for (m=0; m<allMatches.lLength; m++) {
+                    _String     pName ("Class_");
+                    if (m<10) {
+                        pName = pName & m;
+                    } else if (m<36) {
+                        pName = pName & (char)(m-10+'A');
+                    } else {
+                        pName = pName & "high";
+                    }
+
+                    _SimpleList *ss1 = (_SimpleList*)allMatches (m);
+                    if (ss1->lLength) {
+                        CreatePartition (*ss1,1,false,&pName);
+                    }
+                }
+            }
+        }
+    }
+    _UpdateSelectionChoices(IsSelectionNonEmpty());
+}
+//__________________________________________________________
+_String  _HYDataPanel::TreeTopologyChange (long filterID, _String* menuChoice)
+{
+    long        newTreeID,
+                oldTreeID;
+
+    _String     res (*menuChoice);
+
+    oldTreeID = treeVarReferences.lData[filterID];
+
+    if (menuChoice->Equal(&makeNewTree)) {
+        res = NewTreeWindow (dataPartitions.lData[filterID]);
+        if (res.sLength)
+#ifndef USE_AVL_NAMES
+            newTreeID = variableReindex.lData[LocateVarByName(res)];
+#else
+            newTreeID = variableNames.GetXtra(LocateVarByName(res));
+#endif
+        else {
+            newTreeID = -2;    // no change
+        }
+    } else if (menuChoice->Equal(&none)) {
+        newTreeID = -1;
+        res = none;
+    } else if (menuChoice->Equal (&readTreeFile)) {
+        newTreeID = -2;
+        _List   before,
+                after;
+
+        GenerateTreeList (before);
+        if (OpenTreeFile()) {
+            GenerateTreeList (after);
+            if (after.lLength>before.lLength) {
+                before.Sort();
+                for (long k = 0; k<after.lLength; k++) {
+                    _String * thisTree = (_String*)after(k);
+                    if (thisTree->Equal (&menuSeparator)) {
+                        continue;
+                    }
+
+                    if (before.BinaryFind (thisTree)<0) {
+#ifndef USE_AVL_NAMES
+                        newTreeID = variableReindex.lData[LocateVarByName(*thisTree)];
+#else
+                        newTreeID = variableNames.GetXtra(LocateVarByName(*thisTree));
+#endif
+                        res = *thisTree;
+                        break;
+                    }
+                }
+            }
+        }
+    } else if (menuChoice->Equal (&inferTreeStr)) {
+        newTreeID = -3;
+    } else
+#ifndef USE_AVL_NAMES
+        newTreeID = variableReindex.lData[LocateVarByName(*menuChoice)];
+#else
+        newTreeID = variableNames.GetXtra(LocateVarByName(*menuChoice));
+#endif
+
+    // handle treeID change
+
+    if (oldTreeID!=newTreeID) {
+        if (newTreeID==-2) {
+            newTreeID = oldTreeID;
+            if (oldTreeID>=0) {
+                res = *LocateVar (oldTreeID)->GetName();
+            } else if (oldTreeID == -3) {
+                res = inferTreeStr;
+            } else {
+                res = none;
+            }
+        } else {
+            if (!PurgeLFFilter(filterID)) {
+                return *(_String*)((_HYTable*)GetObject(5))->GetCellData (DF_TREE_COLUMN,filterID);
+            }
+            treeVarReferences[filterID]=newTreeID;
+        }
+    }
+    return res;
+}
+
+//__________________________________________________________
+void  _HYDataPanel::ModelChange (_String* menuChoice, long filterID, long newModelID)
+{
+    if (!PurgeLFFilter(filterID)) {
+        return;
+    }
+
+    long         oldModelID;
+
+    oldModelID = modelReferences.lData[filterID];
+
+    if (menuChoice->Equal(&none)) {
+        newModelID = 0;
+        modelReferences.lData[filterID] = 0;
+    } else {
+        _List*        theList = FindModelTemplate (menuChoice);
+        _SimpleList*  opt = (_SimpleList*)(*theList)(1);
+
+        if (!(opt->lData[0]&HY_DATAPANEL_MODEL_MODELS)) {
+            modelReferences.lData[filterID] = ModelDataToLong (newModelID,0,0,0);
+        } else {
+            oldModelID = 0;
+            if (opt->lData[0]&HY_DATAPANEL_MODEL_GLOBALG) {
+                oldModelID = 2;
+            } else if (opt->lData[0]&HY_DATAPANEL_MODEL_GLOBAL) {
+                oldModelID = 1;
+            }
+
+            if (oldModelID<2) {
+                modelReferences.lData[filterID] = ModelDataToLong (newModelID,oldModelID,4,0);
+            } else {
+                modelReferences.lData[filterID] = ModelDataToLong (newModelID,2,4,4);
+            }
+        }
+    }
+}
+
+//__________________________________________________________
+void  _HYDataPanel::ModelOptionChange (_String* oType, long filterID)
+{
+    if (!PurgeLFFilter(filterID)) {
+        return;
+    }
+
+    long         newModelID;
+
+    for          (newModelID=0; newModelID<2; newModelID++)
+        if (parameterOption[newModelID].Equal(oType)) {
+            break;
+        }
+
+    int     model,
+            options,
+            freqs,
+            rates;
+
+    LongToModelData (modelReferences.lData[filterID],model,options,freqs,rates);
+
+    if (newModelID==2) {
+        rates = 4;
+    } else {
+        rates = 0;
+    }
+
+    if (options != newModelID) {
+        modelReferences.lData[filterID]=ModelDataToLong (model,newModelID,freqs,rates);
+        //UpdatePartitionOperations();
+    }
+}
+
+//__________________________________________________________
+void  _HYDataPanel::ModelFreqChange (_String* oType, long filterID)
+{
+    if (!PurgeLFFilter(filterID)) {
+        return;
+    }
+
+    long         newModelID;
+
+    for          (newModelID=0; newModelID<4; newModelID++)
+        if (freqOption[newModelID].Equal(oType)) {
+            break;
+        }
+
+    int     model,
+            options,
+            freqs,
+            rates;
+
+    LongToModelData (modelReferences.lData[filterID],model,options,freqs,rates);
+
+    if (freqs != newModelID) {
+        modelReferences.lData[filterID]=ModelDataToLong (model,options,newModelID,rates);
+        //UpdatePartitionOperations();
+    }
+}
+
+//__________________________________________________________
+void  _HYDataPanel::ModelRateClassChange (long filterID, long newModelID)
+{
+    int          model,
+                 options,
+                 freqs,
+                 rates;
+
+    LongToModelData (modelReferences.lData[filterID],model,options,freqs,rates);
+
+    if (rates != newModelID) {
+        modelReferences.lData[filterID]=ModelDataToLong (model,options,freqs,newModelID);
+        if (lfID>=0) {
+            if (lfID != lockedLFID) {
+                _LikelihoodFunction* thisLF = (_LikelihoodFunction*)likeFuncList(lfID);
+                if (thisLF->GetTheFilters().Find (dataPartitions.lData[filterID])<0) {
+                    return;
+                }
+
+                _CategoryVariable*   cv = thisLF->FindCategoryVar (filterID);
+                if (!cv) {
+                    _String warnMsg ("Internal error in ModelRateClassChange. Please rebuild the likelihood function.");
+                    PurgeLF();
+                    ProblemReport   (warnMsg,(Ptr)this);
+                } else {
+                    cv->ChangeNumberOfIntervals (newModelID);
+                    thisLF->SetIthIndependent (0,thisLF->GetIthIndependent(0));
+                }
+            } else {
+                ProblemReport (lfCantKillWarning, (Ptr)this);
+            }
+        }
+    }
+}
+//__________________________________________________________
+bool  _HYDataPanel::PurgeLF(bool all)
+{
+    if (lfID>=0) {
+        if ((cantDeleteLF)||(lockedLFID == lfID)) {
+            ProblemReport (lfCantKillWarning, (Ptr)this);
+            return false;
+        }
+        if ((!warnKillLF)&&all) {
+            bool prcd = ProceedPromptWithCheck (lfKillWarning,donotWarnAgain,warnKillLF, (Ptr)this);
+            if (!prcd) {
+                return false;
+            }
+        }
+
+        postLFKillEvent (GetID(),lfID);
+        KillLFRecord(lfID);
+        if (all) {
+            lfID = -1;
+            if (addedLines&HY_DATAPANEL_RATECLASS) {
+                AdjustStatusLine (1);
+            }
+            _HYButtonBar*       bb = (_HYButtonBar*)GetObject (2);
+            bb->EnableButton (8,false);
+            _UpdateLFMenu();
+        }
+
+        _HYTable* pl = (_HYTable*)GetObject (5);
+
+        _SimpleList changedCells;
+
+        for (long k=DF_ID_COLUMN; k<pl->cellTypes.lLength; k+=pl->horizontalSpaces.lLength) {
+            pl->cellTypes.lData[k] &= (0xffffffff-HY_TABLE_BOLD);
+            changedCells << k;
+        }
+
+        pl->_MarkCellsForUpdate (changedCells);
+
+
+        savedLFNames.Clear();
+        savedLFStates.Clear();
+    }
+    return true;
+}
+
+//__________________________________________________________
+bool  _HYDataPanel::PurgeLFFilter (long fID)
+{
+    /*_HYTable* pl = (_HYTable*)GetObject (5);
+
+    if (pl->cellTypes.lData[fID*pl->horizontalSpaces.lLength]&HY_TABLE_BOLD)
+        return PurgeLF ();*/
+
+    if (lfID>=0) {
+        if (((_LikelihoodFunction*)likeFuncList (lfID))->GetTheFilters().Find (dataPartitions.lData[fID]) >=0) {
+            return PurgeLF();
+        } else if (cantDeleteLF && (treeVarReferences.lData[lfID] == -3)) {
+            return PurgeLF();
+        }
+    }
+
+    return true;
+}
+
+//__________________________________________________________
+void  _HYDataPanel::LongToPartData (long data, char& offset, bool& rev, long& code)
+{
+    offset = data&HY_DATAPANEL_OFFSETMASK;
+    rev = data&HY_DATAPANEL_REVMASK;
+    code = (data&HY_DATAPANEL_CODEMASK)>>16;
+}
+
+//__________________________________________________________
+long _HYDataPanel::PartDataToLong (char offset, bool rev, long code)
+{
+    return (offset+((long)(rev)<<2)+(code<<16));
+}
+
+//__________________________________________________________
+void  _HYDataPanel::LongToModelData (long data, int& model, int& options, int& freqs, int& classes)
+{
+    model = data&HY_DATAPANEL_MODELID;
+    options = (data&HY_DATAPANEL_OPTIONS)>>16;
+    freqs = (data&HY_DATAPANEL_FREQS)>>20;
+    classes = (data&HY_DATAPANEL_RATES)>>24;
+}
+
+//__________________________________________________________
+long _HYDataPanel::ModelDataToLong (int model, int options, int freqs, int classes)
+{
+    return (model+(options<<16)+(freqs<<20)+(classes<<24));
+}
+
+
+//__________________________________________________________
+bool  _HYDataPanel::DataTypeChange (long filterID, long newType)
+{
+    long         oldType;
+
+    _DataSetFilter*
+    theDF = (_DataSetFilter*)dataSetFilterList (dataPartitions.lData[filterID]);
+
+    oldType = theDF->GetUnitLength();
+    newType ++;
+    bool    needToChop = false;
+    long i;
+
+    _SimpleList exH, exV, chopped;
+
+    if ((newType>1)&&(newType!=oldType)) {
+        if (!EditPartitionProperties(filterID,newType)) {
+            return false;
+        }
+
+        bool          direction = true;
+        char          readFrame = 0;
+
+        LongToPartData (partData.lData[filterID],readFrame,direction,i);
+
+        if  (direction)
+            // reverse the order of sites in the partition
+        {
+            exH.Duplicate (&theDF->theOriginalOrder);
+            exH.Flip();
+            exV.Duplicate (&theDF->theNodeMap);
+        }
+        if (readFrame)
+            // handle the reading frame
+        {
+            if (!exH.lLength) {
+                exH.Duplicate (&theDF->theOriginalOrder);
+                exV.Duplicate (&theDF->theNodeMap);
+            }
+
+            for (; readFrame; readFrame--) {
+                exH.Delete(0);
+            }
+
+        }
+
+        if (newType == 2) {
+            UnmarkSites(theDF->theOriginalOrder,filterID);
+        }
+
+        if (exH.lLength) {
+            theDF->SetFilter(theDF->GetData(),newType,exV,exH,false);
+        }
+
+        if (newType == 2) {
+            MarkSites(theDF->theOriginalOrder,filterID);
+            BuildThermometer();
+            BuildMarksPane  ();
+        }
+    }
+    if (oldType!=newType)
+        // need to change unit length
+    {
+        if (!PurgeLFFilter (filterID)) {
+            return false;
+        }
+
+        if (theDF->theOriginalOrder.lLength%newType) {
+            _String warnMessage ("The number of sites in the filter ");
+            warnMessage = warnMessage & *(_String*)dataSetFilterNamesList (dataPartitions.lData[filterID])
+                          & " (" & _String ((long)theDF->theOriginalOrder.lLength) &") is not divisible by "
+                          &_String (newType)&". I must chop off the last "&_String ((long)theDF->theOriginalOrder.lLength%newType)
+                          & " sites to fix this problem.";
+            if (!ProceedPrompt (warnMessage,(Ptr)this)) {
+                return false;
+            } else {
+                needToChop = true;
+            }
+        }
+        exH.Duplicate (&theDF->theOriginalOrder);
+        if (needToChop) {
+            for (long k=(exH.lLength/newType)*newType; k<exH.lLength; k++) {
+                chopped<<exH.lData[k];
+            }
+        }
+        exV.Duplicate (&theDF->theNodeMap);
+
+        theDF->SetFilter(theDF->GetData(),newType,exV,exH,false);
+        if (newType == 3)
+            // codon
+        {
+            SetCodonExclusions (theDF,filterID,i);
+            theDF->SetDimensions();
+            partData.lData[filterID] = PartDataToLong (0,0,i);
+        } else {
+            partData.lData[filterID] = PartDataToLong (0,0,0);
+            if (needToChop) {
+                UnmarkSites(chopped,filterID);
+                BuildMarksPane();
+                BuildThermometer();
+            }
+        }
+
+        modelReferences.lData[filterID] = 0;
+        UpdatePartitionOperations();
+        if (addedLines&HY_DATAPANEL_TRANSLATION) {
+            _String dummy;
+            if (newType==3) { // codon data
+                UpdateTranslationString(dummy,translatedSequence,true);
+            } else if (oldType==3) {
+                for (filterID = 0; filterID<dataPartitions.lLength; filterID++) {
+                    theDF = (_DataSetFilter*)dataSetFilterList (dataPartitions.lData[filterID]);
+                    if (theDF->GetUnitLength()==3) {
+                        break;
+                    }
+                }
+                if (filterID<dataPartitions.lLength) {
+                    UpdateTranslationString(dummy,translatedSequence,true);
+                } else
+                    // no codon partitions left; kill translation display
+                {
+                    AdjustStatusLine (2,true);
+                }
+            }
+        }
+    }
+    return true;
+}
+
+//__________________________________________________________
+void  _HYDataPanel::ActivateInfoLines (bool onOff)
+{
+    if (onOff) {
+        SetTableDimensions (6,2);
+        SetCell (0,0,GetObject (1));
+        SetCell (0,1,GetObject (1));
+        SetCell (1,0,GetObject (3));
+        SetCell (1,1,GetObject (3));
+        SetCell (3,0,GetObject (4));
+        SetCell (3,1,GetObject (4));
+        SetCell (2,0,GetObject (0));
+        SetCell (2,1,GetObject (0));
+        SetCell (4,0,GetObject (2));
+        SetCell (4,1,GetObject (6));
+        SetCell (5,0,GetObject (2));
+        SetCell (5,1,GetObject (5));
+
+    } else {
+        //AddObject (sp);      // 0
+        //AddObject (sc);      // 1
+        //AddObject (b1);      // 2
+        //AddObject (marks);   // 3
+        //AddObject (sp2);     // 4
+        //AddObject (partList);// 5
+        //AddObject (partHead);// 6
+
+        SetTableDimensions (5,2);
+        SetCell (0,0,GetObject (1));
+        SetCell (0,1,GetObject (1));
+        SetCell (1,0,GetObject (3));
+        SetCell (1,1,GetObject (3));
+        SetCell (2,0,GetObject (0));
+        SetCell (2,1,GetObject (0));
+        SetCell (3,0,GetObject (2));
+        SetCell (3,1,GetObject (6));
+        SetCell (4,0,GetObject (2));
+        SetCell (4,1,GetObject (5));
+    }
+}
+
+//__________________________________________________________
+bool  _HYDataPanel::AdjustStatusLine (long onOff, bool force, long preselected)
+{
+    _HYSequencePane*  sp2 = (_HYSequencePane*)components(4),
+                      *  sp = (_HYSequencePane*)components(0);
+
+    /* add consensus line */
+    char    oldAdded = addedLines, oldCount = sp2->speciesIndex.lLength;
+    bool    ret = false;
+    _String newDataString;
+    if (preselected == -1) {
+        tainted = true;
+    }
+
+    switch (onOff) {
+    case 0:
+
+        if (addedLines&HY_DATAPANEL_CONSENSUS) {
+            addedLines &= 0xfe;
+        } else {
+            UpdateConsensusSequence (newDataString);
+            addedLines |= HY_DATAPANEL_CONSENSUS;
+            ret = true;
+        }
+        break;
+
+    case 1:
+
+        if (addedLines&HY_DATAPANEL_RATECLASS) {
+            addedLines-=HY_DATAPANEL_RATECLASS;
+        } else {
+            if (lfID>=0) {
+                if (lfID != lockedLFID) {
+                    _LikelihoodFunction *lf = (_LikelihoodFunction*)likeFuncList (lfID);
+                    _SimpleList         allParts (lf->CountObjects(0),0,1);
+                    _Matrix*            rates = lf->ConstructCategoryMatrix (allParts, _hyphyLFConstructCategoryMatrixClasses);
+                    _String             rateS (32,true);
+                    long                k = 0,
+                                        kk;
+
+                    for (long j=0; j<siteAssignments.lLength; j++) {
+                        if ((kk=siteAssignments.lData[j])>=0) {
+                            kk = ((_DataSetFilter*)dataSetFilterList (kk))->GetUnitLength();
+                            long v = (*rates)(0,k);
+                            char c;
+                            if (v>9)
+                                if (v<36) {
+                                    c = (char)('A'+v-10);
+                                } else {
+                                    c = '*';
+                                }
+                            else {
+                                c = '0'+v;
+                            }
+                            if (kk==1) {
+                                rateS << c;
+                            } else {
+                                for (long p = 0; p<kk; p++) {
+                                    rateS << c;
+                                }
+                                j+=kk-1;
+                            }
+                            k++;
+                        } else {
+                            rateS << ' ';
+                        }
+                    }
+                    rateS<<' ';
+                    rateS<<' ';
+                    rateS<<' ';
+                    rateS<<' ';
+                    rateS.Finalize();
+                    newDataString.Duplicate (&rateS);
+                    addedLines+=HY_DATAPANEL_RATECLASS;
+                    DeleteObject (rates);
+                    ret = true;
+                } else {
+                    ProblemReport (lfCantKillWarning, (Ptr)this);
+                    return false;
+                }
+            }
+        }
+        break;
+
+    case 2: {
+        // check if can translate
+
+        if (force) {
+            addedLines &= 0xfb;
+            break;
+        }
+        long k;
+        _DataSetFilter* df;
+        for (k=0; k<dataPartitions.lLength; k++) {
+            df = (_DataSetFilter*)dataSetFilterList(dataPartitions.lData[k]);
+            if (df->GetUnitLength()==3) {
+                break;
+            }
+        }
+        if (!(dataPartitions.lLength&&(k<dataPartitions.lLength))) {
+            _String warnMsg ("You must define at least one codon partition before obtaining aminoacid translations. To translate an entire sequence, set the reference sequence to it, and choose the genetic code to translate with.");
+            ProblemReport (warnMsg,(Ptr)this);
+            return false;
+        }
+        // can translate, choose which sequence
+        long sel;
+        if (preselected<0) {
+            _List choices, thisPair;
+            _SimpleList dummyChoices, dummySel, validChoices;
+            dummyChoices<<0;
+            dummyChoices<<1;
+            _String desc ("All");
+            thisPair && & desc;
+            desc = "Translate all sequences and display the result in a new window";
+            thisPair && & desc;
+            choices && & thisPair;
+            validChoices<<0;
+            if (addedLines&HY_DATAPANEL_TRANSLATION) {
+                thisPair.Clear();
+                desc = "Turn off aminoacid translation display";
+                validChoices<<1;
+                thisPair && &none;
+                thisPair && & desc;
+                choices && & thisPair;
+            }
+            for (long k=0; k< sp->speciesIndex.lLength; k++) {
+                thisPair.Clear();
+                thisPair << sp->rowHeaders (sp->speciesIndex.lData[k]);
+                desc = _String("Translate ")& *(_String*)thisPair(0);
+                thisPair && & desc;
+                validChoices << choices.lLength;
+                choices && & thisPair;
+            }
+            sel = HandleListSelection (choices, dummyChoices, validChoices, "Choose sequence for translation", dummySel,1);
+            if (sel<0) {
+                return addedLines&HY_DATAPANEL_TRANSLATION;
+            }
+        } else {
+            sel = preselected;
+        }
+
+
+        if (addedLines&HY_DATAPANEL_TRANSLATION) {
+            if (sel==1) {
+                addedLines &= 0xfb;
+                break;
+            }
+        }
+        if (sel) {
+            if (addedLines&HY_DATAPANEL_TRANSLATION) {
+                sel--;
+            }
+            translatedSequence = sp->speciesIndex.lData[sel-1];
+            UpdateTranslationString (newDataString,translatedSequence,false);
+            ret = true;
+            addedLines |= HY_DATAPANEL_TRANSLATION;
+            if (!(oldAdded&HY_DATAPANEL_CONSENSUS)) {
+                onOff--;
+            }
+            if (!(oldAdded&HY_DATAPANEL_RATECLASS)) {
+                onOff--;
+            }
+        } else {
+
+            _List           choices;
+
+            _String mI      ("Map to missing data");
+            choices && & mI;
+            mI = "Any positions with ambiguities will be translated to an fully ambiguous amino-acid";
+            choices && & mI;
+            mI = "Most likely resolution";
+            choices && & mI;
+            mI = "Any ambiguity will be resolved to the most frequent one given other observed states in its alignment column; if an ambiguity can not be resolved to any of the observed states (e.g. a Y in a column of As and Gs), a random resolution will be provides.";
+            choices && & mI;
+            mI = "Random resolution";
+            choices && & mI;
+            mI = "Any ambiguity will be resolved randomly based on probabilities derived from observed states in its alignment column.";
+            choices && & mI;
+
+            char resolve = HandleListSelection (choices, "Ambiguities",(Ptr)this);
+
+            if (resolve < 0) {
+                return 0;
+            }
+
+            _DataSet*       newDS = new _DataSet();
+            _List*          cache = new _List;
+            GetTranslationString (newDataString, sp->speciesIndex.lData[0],resolve,-1,cache);
+            for (k=0; k<newDataString.sLength; k++) {
+                newDS->AddSite (newDataString.sData[k]);
+            }
+            newDS->AddName(*(_String*)sp->rowHeaders(sp->speciesIndex.lData[0]));
+            for (k=1; k<sp->speciesIndex.lLength; k++) {
+                GetTranslationString (newDataString, sp->speciesIndex.lData[k],resolve,-1,cache);
+                newDS->AddName(*(_String*)sp->rowHeaders(sp->speciesIndex.lData[k]));
+                for (long j=0; j<newDataString.sLength; j++) {
+                    newDS->Write2Site (j,newDataString.sData[j]);
+                }
+            }
+            newDS->Finalize();
+            DeleteObject (cache);
+
+            _TranslationTable aaTable (defaultTranslationTable);
+            aaTable.baseLength = 20;
+            newDS->SetTranslationTable (&aaTable);
+            newDS->SetNoSpecies (sp->speciesIndex.lLength);
+            newDataString = (*(_String*)dataSetNamesList(dataSetID))&("_AA");
+            AddDataSetToList (newDataString, newDS);
+            _HYDataPanel* myTWindow = new _HYDataPanel(newDataString,newDataString);
+            myTWindow->BringToFront();
+            return addedLines&HY_DATAPANEL_TRANSLATION;
+        }
+        break;
+    }
+
+    case 3: {
+        long sel,
+             sel2 = -1,
+             k;
+
+        if (preselected<0) {
+            /*_List choices, thisPair;
+            _SimpleList dummyChoices, dummySel, validChoices;
+            dummyChoices<<0;
+            dummyChoices<<1;
+            _String desc ("Turn off reference sequence display");
+            if (addedLines&HY_DATAPANEL_REFERENCE)
+            {
+                validChoices<<0;
+                thisPair && &none;
+                thisPair && & desc;
+                choices && & thisPair;
+            }
+            for (long k=0; k< sp->speciesIndex.lLength; k++)
+            {
+                thisPair.Clear();
+                thisPair << sp->rowHeaders (sp->speciesIndex.lData[k]);
+                desc = _String("Set reference sequence to ")& *(_String*)thisPair(0);
+                thisPair && & desc;
+                validChoices << choices.lLength;
+                choices && & thisPair;
+            }*/
+
+            _List   theList,
+                    seqNames,
+                    gCodes;
+
+            _String*iv;
+
+            if (addedLines&HY_DATAPANEL_REFERENCE) {
+                iv = (_String*)sp->rowHeaders (referenceSequence);
+            } else {
+                iv = (_String*)sp->rowHeaders (0);
+            }
+
+
+            if (addedLines&HY_DATAPANEL_REFERENCE) {
+                seqNames && & none;
+            }
+
+            for (k=0; k< sp->speciesIndex.lLength; k++) {
+                seqNames << sp->rowHeaders (sp->speciesIndex.lData[k]);
+            }
+
+
+            AddItemToPreferences (1|8,-1,"Sequence","Choose the reference sequence.","",nil,theList,false);
+            AddItemToPreferences (0,PREFITEM_POPUP,"Sequence ID","Choose the reference sequence.",*iv,&seqNames,theList,false);
+
+            if (dataType == HY_DATAPANEL_NUCDATA) {
+                gCodes && & none;
+                iv = &none;
+
+                if (genCodeID>=0) {
+                    iv = (_String*)(*((_List*)geneticCodes(genCodeID)))(0);
+                }
+
+                for (k=0; k<geneticCodes.lLength; k++) {
+                    gCodes << (_String*)(*((_List*)geneticCodes(k)))(0);
+                }
+
+                AddItemToPreferences (1|8,-1,"Translation","Aminoacid translation options.","",nil,theList,false);
+                AddItemToPreferences (0,PREFITEM_POPUP,"Genetic Code","Choose genetic code to translate with. Select \"None\" to display the nucleotide sequence.",
+                                      *iv,&gCodes,theList,false);
+            }
+
+            if (HandlePreferences (theList, "Reference Sequence Setup", false)) {
+                sel  = seqNames.Find((*((_List*)theList.lData[4]))(1));
+                if (dataType == HY_DATAPANEL_NUCDATA) {
+                    sel2  = gCodes.Find((*((_List*)theList.lData[4]))(3))-1;
+                }
+            } else {
+                return addedLines&HY_DATAPANEL_REFERENCE;
+            }
+        } else {
+            sel = preselected;
+        }
+        if (addedLines&HY_DATAPANEL_REFERENCE) {
+            if (sel==0) { // turn off ref sequences
+                ret = false;
+                addedLines &= 0xf7;
+                genCodeID = -1;
+            } else {
+                sel = sp->speciesIndex.lData[sel-1];
+                if ((referenceSequence!=sel)||(sel2!=genCodeID)) {
+                    long m = ((_String*)statusData(0))->sLength-1;
+                    if (sel2<0) {
+                        for (long k=0; k<statusData.lLength; k++) {
+                            ((_String*)statusData(k))->sData[m] = ((_String*)sp->columnStrings(k))->sData[sel];
+                        }
+                    } else {
+                        _String dummy;
+                        UpdateTranslationString (dummy, sel, false, sel2);
+                        for (long k=0; k<statusData.lLength; k++) {
+                            ((_String*)statusData(k))->sData[m] = dummy.sData[k];
+                        }
+                    }
+                    referenceSequence = sel;
+                }
+                ret = true;
+            }
+        } else {
+            addedLines|=HY_DATAPANEL_REFERENCE;
+            referenceSequence = sp->speciesIndex.lData[sel];
+            if (sel2<0) {
+                _String newD ((unsigned long)sp->columnStrings.lLength,true);
+                for (long k=0; k<sp->columnStrings.lLength; k++) {
+                    newD << ((_String*)sp->columnStrings(k))->sData[referenceSequence];
+                }
+                newD<<' ';
+                newD<<' ';
+                newD.Finalize();
+                newDataString = newD;
+            } else {
+                UpdateTranslationString (newDataString, referenceSequence, false, sel2);
+            }
+            ret = true;
+        }
+
+        if (ret) {
+            genCodeID = sel2;
+        }
+
+        if (!(oldAdded&HY_DATAPANEL_CONSENSUS)) {
+            onOff--;
+        }
+        if (!(oldAdded&HY_DATAPANEL_RATECLASS)) {
+            onOff--;
+        }
+        if (!(oldAdded&HY_DATAPANEL_TRANSLATION)) {
+            onOff--;
+        }
+        break;
+    }
+    }
+
+    if (ret) {
+        if (oldAdded) {
+            if (oldAdded!=addedLines)
+                for (long k=0; k<newDataString.sLength; k++) {
+                    ((_String*)statusData(k))->Insert (newDataString.sData[k],onOff);
+                }
+            else
+                for (long k=0; k<newDataString.sLength; k++) {
+                    ((_String*)statusData(k))->sData[onOff] = newDataString.sData[k];
+                }
+        } else {
+            _String cs ('0');
+            for (long k=0; k<newDataString.sLength; k++) {
+                cs.sData[0] = newDataString.sData[k];
+                statusData && & cs;
+                sp2->InsertColumn ((_String*)statusData(k),-1);
+            }
+        }
+    } else {
+        if (addedLines) {
+            for (long k=0; k<statusData.lLength; k++) {
+                ((_String*)statusData(k))->Delete(onOff,onOff);
+            }
+        } else {
+            statusData.Clear();
+        }
+    }
+    if (addedLines) {
+        AdjustInfoNames();
+        sp2->SetHeaders (&statusLines,false);
+        sp2->BuildPane();
+        sp2->_MarkForUpdate();
+    }
+    if (addedLines&&(!oldAdded)) {
+        sp2->blockWidth = sp->blockWidth;
+        sp2->SetNameDisplayMode (sp->nameDisplayFlags,false);
+        if (sp->startColumn!=0) {
+            sp2->startColumn = sp->startColumn;
+        }
+        ActivateInfoLines (true);
+    } else if (oldAdded&&(!addedLines)) {
+        sp2->columnStrings.Clear();
+        sp2->rowHeaders.Clear();
+        sp2->speciesIndex.Clear();
+        ActivateInfoLines (false);
+    }
+
+    if (oldCount!=sp2->speciesIndex.lLength) {
+        SetWindowRectangle (top,left,bottom,right);
+    }
+    return ret;
+}
+//__________________________________________________________
+
+void  _HYDataPanel::AdjustInfoNames (void)
+{
+    _HYSequencePane*  sp = (_HYSequencePane*)components(0);
+
+    long            maxSpL = 0,t,k;
+
+    for (long k=0; k<sp->rowHeaders.lLength; k++) {
+        t = ((_String*)sp->rowHeaders(k))->sLength;
+        if (t>maxSpL) {
+            maxSpL = t;
+        }
+    }
+
+    statusLines.Clear();
+    if (addedLines&HY_DATAPANEL_CONSENSUS) {
+        statusLines&& &consensusInfoString;
+    }
+
+    if (addedLines&HY_DATAPANEL_RATECLASS) {
+        statusLines&& &rateClassInfoString;
+    }
+
+    if (addedLines&HY_DATAPANEL_TRANSLATION) {
+        statusLines&& sp->rowHeaders (translatedSequence);
+    }
+
+    if (addedLines&HY_DATAPANEL_REFERENCE) {
+        statusLines&& sp->rowHeaders (referenceSequence);
+    }
+
+    for (k=0; k<statusLines.lLength; k++) {
+        _String *thisString = (_String*)statusLines(k);
+        if (thisString->sLength>maxSpL) {
+            thisString->Trim (0,maxSpL-1);
+        } else if (k==0 && thisString->sLength<maxSpL) {
+            _String paddedString ((unsigned long)maxSpL,true);
+            paddedString<< thisString;
+            for (long l = thisString->sLength; l<maxSpL; l++) {
+                paddedString<<' ';
+            }
+            paddedString.Finalize();
+            *thisString = paddedString;
+        }
+    }
+
+}
+
+//__________________________________________________________
+
+void  _HYDataPanel::CodeTo3AA (_String& rec, long code, _SimpleList* genCode, _Parameter* freqVector)
+{
+    if (code<0) {
+        if (freqVector) {
+            long shift     = 0,
+                 codeB        = -1;
+
+            for (long k=0; k<64; k++)
+                if (genCode->lData[k] == 10) {
+                    shift++;
+                } else if (freqVector[k-shift] > 0.0)
+                    if (code < 0) {
+                        code = genCode->lData[k];
+                    } else {
+                        long code2 = genCode->lData[k];
+                        if (code2 != code) {
+                            if ((code == 13 && code2 == 15)
+                                    || (code == 15 && code2 == 13)
+                                    || (code == 12 && code2 == 16)
+                                    || (code == 16 && code2 == 12)) {
+                                codeB = MIN(code,code2);
+                                continue;
+                            }
+                        }
+                        rec = "???";
+                        return;
+                    }
+            if (codeB >= 0)
+                if (codeB == 13) {
+                    code = 21;
+                } else {
+                    code = 22;
+                }
+
+        } else {
+            rec = "???";
+            return;
+
+        }
+    } else {
+        code = genCode->lData[code];
+    }
+
+    switch (code) {
+    case 0:
+        rec = "Phe";
+        break;
+    case 1:
+        rec = "Leu";
+        break;
+    case 2:
+        rec = "Ile";
+        break;
+    case 3:
+        rec = "Met";
+        break;
+    case 4:
+        rec = "Val";
+        break;
+    case 5:
+        rec = "Ser";
+        break;
+    case 6:
+        rec = "Pro";
+        break;
+    case 7:
+        rec = "Thr";
+        break;
+    case 8:
+        rec = "Ala";
+        break;
+    case 9:
+        rec = "Tyr";
+        break;
+    case 10:
+        rec = "XXX";
+        break;
+    case 11:
+        rec = "His";
+        break;
+    case 12:
+        rec = "Gln";
+        break;
+    case 13:
+        rec = "Asn";
+        break;
+    case 14:
+        rec = "Lys";
+        break;
+    case 15:
+        rec = "Asp";
+        break;
+    case 16:
+        rec = "Glu";
+        break;
+    case 17:
+        rec = "Cys";
+        break;
+    case 18:
+        rec = "Trp";
+        break;
+    case 19:
+        rec = "Arg";
+        break;
+    case 20:
+        rec = "Gly";
+        break;
+    case 21:
+        rec = "Asx";
+        break;
+    case 22:
+        rec = "Glx";
+        break;
+    }
+}
+
+//__________________________________________________________
+
+void  _HYDataPanel::IndexToCodon (long index, char* rec)
+{
+    char mapper[] = "ACGT";
+
+    rec[0] = mapper[index/16];
+    rec[1] = mapper[(index%16)/4];
+    rec[2] = mapper[index%4];
+}
+
+//__________________________________________________________
+
+_String*  _HYDataPanel::GetExclusionsFromCode (long index)
+{
+    _SimpleList* gencode = ((_SimpleList*)((*(_List*)geneticCodes(index))(2)));
+    return       GetExclusionsFromList (gencode);
+}
+
+//__________________________________________________________
+
+_String*  _HYDataPanel::GetExclusionsFromList (_SimpleList* gencode)
+{
+    _String* res = new _String (16,true);
+    checkPointer (res);
+    char     transl[4];
+    transl[3] = 0;
+
+    long index = 0;
+    for (long k=0; k<64; k++)
+        if (gencode->lData[k]==10) {
+            IndexToCodon (k,transl);
+            if (index) {
+                (*res)<<',';
+            }
+            (*res)<< transl;
+            index++;
+        }
+    res->Finalize();
+    return  res;
+}
+
+//__________________________________________________________
+
+_String*  _HYDataPanel::GetExclusionsFromExcList (_SimpleList* excl)
+{
+    _String* res = new _String (16,true);
+    checkPointer (res);
+    char     transl[4];
+    transl[3] = 0;
+
+    for (long k=0; k<excl->lLength; k++) {
+        IndexToCodon (excl->lData[k],transl);
+        if (k) {
+            (*res)<<',';
+        }
+        (*res)<< transl;
+    }
+    res->Finalize();
+    return  res;
+}
+
+//__________________________________________________________
+
+void _HYDataPanel::SetCodonExclusions (_DataSetFilter* theDF, long filterID, long index)
+{
+    _String* exclusions = GetExclusionsFromCode (index);
+    UnmarkSites (theDF->theOriginalOrder,filterID);
+    theDF->SetExclusions(exclusions);
+    MarkSites   (theDF->theOriginalOrder,filterID);
+    BuildMarksPane();
+    BuildThermometer();
+    DeleteObject (exclusions);
+}
+
+//__________________________________________________________
+
+_String*  _HYDataPanel::GetMatrixFromCode (long index)
+{
+    _String* res = new _String (16,true);
+    checkPointer (res);
+
+    _SimpleList* gencode = ((_SimpleList*)((*(_List*)geneticCodes(index))(2)));
+    (*res)<<'{';
+    (*res)<<'{';
+    for (long k=0; k<64; k++) {
+        _String c (gencode->lData[k]);
+        if (k) {
+            (*res)<<',';
+        }
+        (*res)<< &c;
+    }
+    (*res)<<'}';
+    (*res)<<'}';
+    res->Finalize();
+    return  res;
+}
+
+//__________________________________________________________
+
+void  _HYDataPanel::ShowConstantSites (bool deletions, bool relaxed, bool sequences)
+{
+    _HYSequencePane *sp = (_HYSequencePane*)GetObject (0);
+    _HYTable        *pl = (_HYTable*)GetObject (5);
+
+    _DataSetFilter  *df = (_DataSetFilter*)dataSetFilterList(dataPartitions.lData[pl->GetFirstRowSelection()]);
+    _SimpleList     constantSites;
+
+    if (deletions) {
+        if (sequences) {
+            _AVLList      seqswithdels (&constantSites);
+
+            for (long i = 0; i<df->theFrequencies.lLength; i++) {
+                df->HasDeletions(i,&seqswithdels);
+            }
+
+            seqswithdels.ReorderList ();
+
+            if (constantSites.lLength) {
+                _SimpleList  remap,
+                             displayOrder;
+
+                _AVLListX    reordered (&remap);
+
+                for (long k = 0; k<sp->speciesIndex.lLength; k++) {
+                    reordered.Insert ((BaseRef)sp->speciesIndex.lData[k],k);
+                }
+
+                for (long k2 = 0; k2 < constantSites.lLength; k2++) {
+                    long f = reordered.Find (BaseRef(constantSites.lData[k2]));
+                    if (f>=0) {
+                        displayOrder << reordered.GetXtra (f);
+                    }
+                }
+
+                constantSites.Clear();
+                constantSites.Duplicate (&displayOrder);
+                constantSites.Sort();
+            }
+        } else {
+            for (long i = 0; i<df->theFrequencies.lLength; i++) {
+                if (df->HasDeletions(i)) {
+                    df->FindAllSitesLikeThisOne(df->theMap[i*df->GetUnitLength()],constantSites);
+                }
+            }
+
+            if (relaxed) { // constant delete sites
+                _SimpleList sites2, sites1 (constantSites);
+                for (long i = 0; i<df->theFrequencies.lLength; i++) {
+                    if (df->IsConstant(i,false)) {
+                        df->FindAllSitesLikeThisOne(df->theMap[i*df->GetUnitLength()],sites2);
+                    }
+                }
+                sites1.Sort();
+                sites2.Sort();
+                constantSites.Intersect (sites1, sites2);
+            }
+        }
+    } else
+        for (long i = 0; i<df->theFrequencies.lLength; i++) {
+            if (df->IsConstant(i,relaxed)) {
+                df->FindAllSitesLikeThisOne(df->theMap[i*df->GetUnitLength()],constantSites);
+            }
+        }
+
+    _String     outWord;
+    _Parameter  fnd;
+    long        fndc;
+    if (sequences) {
+        sp->selection.Clear();
+        sp->vselection.Clear();
+        sp->vselection.Duplicate(&constantSites);
+        outWord = "sequences";
+        fnd  = ((_Parameter)sp->vselection.lLength)/sp->speciesIndex.lLength*100.;
+        fndc = sp->vselection.lLength;
+    } else {
+        constantSites.Sort();
+        sp->selection.Clear();
+        sp->selection.Duplicate(&constantSites);
+        outWord = "sites";
+        fnd = 100.*((_Parameter)sp->selection.lLength)/df->GetFullLengthSpecies();
+        fndc = sp->selection.lLength/df->GetUnitLength();
+    }
+    UpdateSelDepPartitionOperations ();
+    _UpdateSelectionChoices (sp->selection.lLength);
+    sp->BuildPane();
+    sp->_MarkForUpdate();
+    char    buffer[128];
+    snprintf (buffer, sizeof(buffer),"%ld(%4.4g%%) %s found\n",fndc,fnd,outWord.sData);
+    BufferToConsole (buffer);
+}
+
+//__________________________________________________________
+
+void  _HYDataPanel::ShowDuplicateSequences (bool relaxed)
+{
+    _HYSequencePane *sp = (_HYSequencePane*)GetObject (0);
+    _HYTable        *pl = (_HYTable*)GetObject (5);
+
+    _DataSetFilter  *df = (_DataSetFilter*)dataSetFilterList(dataPartitions.lData[pl->GetFirstRowSelection()]);
+    
+    _SimpleList     indices, map, counts,duplicateSequences,otherInstance;
+
+    df->FindUniqueSequences (indices, map, counts, relaxed?2:0);
+    
+    long totalUnique = 0;
+                                   
+    for (long k = 0; k < map.lLength; k++)
+    {
+        if (map.lData[k] != totalUnique){
+            duplicateSequences << k;
+            otherInstance << map.lData[k];
+        }
+        else
+            totalUnique ++;
+    }
+
+    SortLists (&duplicateSequences, &otherInstance);
+
+    sp->selection.Clear();
+    sp->vselection.Clear();
+    for (long k=0; k<duplicateSequences.lLength; k++) {
+        sp->vselection << sp->speciesIndex.Find(df->theNodeMap.lData[duplicateSequences.lData[k]]);
+    }
+
+    sp->vselection.Sort();
+
+    UpdateSelDepPartitionOperations ();
+    _UpdateSelectionChoices (0);
+
+    sp->BuildPane();
+    sp->_MarkForUpdate();
+
+    char    buffer[256];
+    snprintf (buffer, sizeof(buffer),"%lu(%4.4g%%) duplicate sequences found\n", duplicateSequences.lLength ,((_Parameter)duplicateSequences.lLength)/sp->speciesIndex.lLength*100.);
+    BufferToConsole (buffer);
+    for (long idx = 0; idx < duplicateSequences.lLength; idx++) {
+        BufferToConsole ("\t");
+        StringToConsole (*df->GetSequenceName (duplicateSequences.lData[idx]));
+        BufferToConsole (" matched ");
+        StringToConsole (*df->GetSequenceName (otherInstance.lData[idx]));
+        NLToConsole     ();
+    }
+}
+
+
+//__________________________________________________________
+
+char  _HYDataPanel::CodeToAA (long code, _SimpleList* genCode, _Parameter* freqVector)
+{
+    if (code<0) {
+        if (freqVector) {
+            long shift     = 0,
+                 codeB        = -1;
+
+            for (long k=0; k<64; k++)
+                if (genCode->lData[k] == 10) {
+                    shift++;
+                } else if (freqVector[k-shift] > 0.0)
+                    if (code < 0) {
+                        code = genCode->lData[k];
+                    } else {
+                        long code2 = genCode->lData[k];
+                        if (code2 != code) {
+                            if ((code == 13 && code2 == 15)
+                                    || (code == 15 && code2 == 13)
+                                    || (code == 12 && code2 == 16)
+                                    || (code == 16 && code2 == 12)) {
+                                codeB = MIN(code,code2);
+                                continue;
+                            }
+                        }
+                        return '?';
+                    }
+            if (codeB >= 0)
+                if (codeB == 13) {
+                    code = 21;
+                } else {
+                    code = 22;
+                }
+
+        } else {
+            return '?';
+        }
+    } else {
+        code = genCode->lData[code];
+    }
+
+    switch (code) {
+    case 0:
+        return 'F';
+        break;
+    case 1:
+        return 'L';
+        break;
+    case 2:
+        return 'I';
+        break;
+    case 3:
+        return 'M';
+        break;
+    case 4:
+        return 'V';
+        break;
+    case 5:
+        return 'S';
+        break;
+    case 6:
+        return 'P';
+        break;
+    case 7:
+        return 'T';
+        break;
+    case 8:
+        return 'A';
+        break;
+    case 9:
+        return 'Y';
+        break;
+    case 10:
+        return 'X';
+        break;
+    case 11:
+        return 'H';
+        break;
+    case 12:
+        return 'Q';
+        break;
+    case 13:
+        return 'N';
+        break;
+    case 14:
+        return 'K';
+        break;
+    case 15:
+        return 'D';
+        break;
+    case 16:
+        return 'E';
+        break;
+    case 17:
+        return 'C';
+        break;
+    case 18:
+        return 'W';
+        break;
+    case 19:
+        return 'R';
+        break;
+    case 20:
+        return 'G';
+        break;
+    case 21:
+        return 'B';
+        break;
+    case 22:
+        return 'Z';
+        break;
+
+    }
+
+    return 'X';
+}
+
+//__________________________________________________________
+
+void        _HYDataPanel::DFExclusionsToString    (_DataSetFilter* theDF, _String& res)
+{
+    _String         exclusions (64,true);
+    if ((theDF->GetUnitLength()==3)&&theDF->theExclusions.lLength) {
+        exclusions <<  theDF->ConvertCodeToLetters (theDF->theExclusions.lData[0],3);
+        for (long kk=1; kk<theDF->theExclusions.lLength; kk++) {
+            exclusions << ',';
+            exclusions <<  theDF->ConvertCodeToLetters (theDF->theExclusions.lData[kk],3);
+        }
+    }
+    exclusions.Finalize();
+    res = exclusions;
+}
+
+
+//__________________________________________________________
+
+void  _HYDataPanel::DisplayParameterTable (void)
+{
+    if (lfID>=0) {
+        _String     windowName;
+        windowName = _String ("Likelihood parameters for ") & *dataSetName;
+        long    k = FindWindowByName (windowName);
+        if (k>=0) {
+#ifdef __MAC__
+            _HYPlatformWindow* thisWindow = (_HYPlatformWindow*)windowObjects(k);
+            thisWindow->_Activate();
+#else
+            _HYWindow* thisWindow = (_HYWindow*)windowObjectRefs(k);
+            thisWindow->BringToFront();
+#endif
+        } else {
+            _HYParameterTable* newPT = new _HYParameterTable (windowName,lfID);
+            newPT->_Zoom (true);
+            newPT->BringToFront();
+        }
+    }
+}
+
+//__________________________________________________________
+
+void  _HYDataPanel::OpenGeneralBSWindow (void)
+{
+    if (lfID>=0) {
+#ifndef __HYPHY_GTK__
+        _String     windowName;
+        windowName = _String ("Bootstrap setup ") & *dataSetName;
+        long    k = FindWindowByName (windowName);
+        if (k>=0) {
+            _HYGeneralBootstrapWindow* thisWindow = (_HYGeneralBootstrapWindow*)windowObjectRefs(k);
+            thisWindow->_Activate();
+            thisWindow->SetNullLF (lfID);
+        } else {
+            _HYGeneralBootstrapWindow* newPT = new _HYGeneralBootstrapWindow (windowName,lfID);
+            newPT->BringToFront();
+        }
+#endif
+    }
+}
+
+//__________________________________________________________
+
+_String*  _HYDataPanel::LFSnapshot (void)
+{
+    if (lfID>=0) {
+        stashParameter (likefuncOutput,4,true);
+        _String * result = (_String*)((_LikelihoodFunction*)likeFuncList(lfID))->toStr();
+        stashParameter (likefuncOutput,4,false);
+        tainted  = true;
+        return   result;
+    }
+    return nil;
+}
+
+
+//__________________________________________________________
+
+bool    _HYDataPanel::LFRestore (long index)
+{
+    if (lfID>=0)
+        if (lfID!=lockedLFID) {
+            if (index<savedLFStates.lLength) {
+                _String dupList (*(_String*)savedLFStates(index));
+                _ExecutionList exl (dupList);
+                exl.Execute();
+                ((_LikelihoodFunction*)likeFuncList(lfID))->RescanAllVariables();
+                RefreshCategoryVars();
+                return true;
+            }
+        } else {
+            ProblemReport (lfCantKillWarning);
+        }
+    return false;
+}
+
+//__________________________________________________________
+
+long    _HYDataPanel::GetHypothesis (bool alt)
+{
+    _String suffix;
+    if (alt) {
+        suffix = alterSuffix;
+    } else {
+        suffix = nullSuffix;
+    }
+
+    for (long k=0; k<savedLFNames.lLength; k++)
+        if (((_String*)savedLFNames(k))->endswith (suffix)) {
+            return k;
+        }
+
+    return -1;
+}
+
+//__________________________________________________________
+
+void    _HYDataPanel::SetHypothesis (_String* s, bool alt)
+{
+    _String suffix,
+            nSuffix;
+    if (alt) {
+        suffix   = alterSuffix;
+        nSuffix  = nullSuffix;
+    } else {
+        suffix   = nullSuffix;
+        nSuffix  = alterSuffix;
+    }
+
+    long k = GetHypothesis (alt),
+         f = savedLFNames.Find (s);
+
+    if (k>=0) {
+        ((_String*)savedLFNames(k))->Trim(0,((_String*)savedLFNames(k))->sLength-suffix.sLength-1);
+    }
+
+    if (f>=0) {
+        if (s->endswith (nSuffix)) {
+            s->Trim (0, s->sLength-nSuffix.sLength-1);
+        }
+        *((_String*)savedLFNames(f)) = *s & suffix;
+    }
+
+    tainted = true;
+}
+
+//__________________________________________________________
+
+long    _HYDataPanel::FindLFState (_String s)
+{
+    long f = savedLFNames.Find (&s);
+    if (f<0) {
+        _String s2;
+        s2 = s &  alterSuffix;
+        f = savedLFNames.Find (&s2);
+        if (f<0) {
+            s2 = s & nullSuffix;
+            f = savedLFNames.Find (&s2);
+
+        }
+    }
+    return f;
+}
+
+//__________________________________________________________
+
+_String     _HYDataPanel::GetLFStateName (long k)
+{
+    _String res;
+
+    if ((k>=0)&&(k<savedLFNames.lLength)) {
+        res = *(_String*)savedLFNames (k);
+        if (res.endswith (nullSuffix)) {
+            return res.Cut (0, res.sLength-nullSuffix.sLength-1);
+        }
+
+        if (res.endswith (alterSuffix)) {
+            return res.Cut (0, res.sLength-alterSuffix.sLength-1);
+        }
+    }
+
+    return res;
+}
+
+//__________________________________________________________
+
+_String*    _HYDataPanel::GetLFStateString (long k)
+{
+    if ((k>=0)&&(k<savedLFNames.lLength)) {
+        return (_String*)savedLFStates (k);
+    }
+
+    return nil;
+}
+
+//__________________________________________________________
+
+void    _HYDataPanel::FindFunction (void)
+{
+    _String tPrompt ("Find data:"),
+            cPrompt ("Use regular expressions");
+
+    _List   searchInOptions;
+
+    _String opt ("Search sites");
+    searchInOptions && & opt;
+    opt = "Search sequences, show sequences";
+    searchInOptions && & opt;
+    opt = "Search sequences, show sites";
+    searchInOptions && & opt;
+    opt = "Search sequence names";
+    searchInOptions && & opt;
+
+    _HYSequencePane*sp = (_HYSequencePane*)GetObject(0);
+
+    _DataSetFilter *selectedFilter = nil;
+
+    _HYTable       *pl = (_HYTable*)GetObject (5);
+    _SimpleList    filterSel;
+
+    pl->GetRowSelection (filterSel);
+
+    if (sp->vselection.lLength==1) {
+        opt = "Search in selected sequence";
+        searchInOptions && & opt;
+    }
+
+    if (filterSel.lLength == 1) {
+        selectedFilter = (_DataSetFilter*)dataSetFilterList (dataPartitions.lData[filterSel.lData[0]]);
+        if (selectedFilter->GetUnitLength () == 3) {
+            searchInOptions && & menuSeparator;
+            opt = "Search for amino-acid motifs";
+            searchInOptions && & opt;
+        }
+
+    }
+
+    long    seqSearch;
+
+    if (EnterStringDialogWithPulldown (dataPanelSearchTerm,tPrompt,cPrompt,seqSearch, searchInOptions, nil, regExpSearch,findPanelSelection,(Ptr)this)&&dataPanelSearchTerm.sLength) {
+        _SimpleList     matches;
+        _DataSet*       myData = (_DataSet*)dataSetList (dataSetID);
+        _SimpleList     eligibleSequences;
+
+        findPanelSelection = seqSearch;
+
+        if (seqSearch >= 4) {
+            regExpSearch = true;
+        }
+
+        Ptr             regExpie = nil;
+
+        if (regExpSearch) {
+            int        errCode;
+            regExpie = PrepRegExp(&dataPanelSearchTerm, errCode, false);
+            if (errCode) {
+                _String errMsg = GetRegExpError(errCode);
+                ProblemReport (errMsg, (Ptr)this);
+                return;
+            }
+        }
+
+        if (seqSearch==3) {
+            _List * seqNames = &myData->GetNames();
+
+            for (long idx = 0; idx<sp->speciesIndex.lLength; idx++) {
+                if (regExpie) {
+                    _SimpleList found;
+                    ((_String*)(*seqNames)(sp->speciesIndex.lData[idx]))->RegExpMatch (regExpie, found);
+                    if (found.lLength) {
+                        matches << idx;
+                    }
+                } else if (((_String*)(*seqNames)(sp->speciesIndex.lData[idx]))->FindAnyCase (dataPanelSearchTerm)>=0) {
+                    matches << idx;
+                }
+            }
+        } else {
+
+            if (seqSearch >= 5) { // a.a. motif
+                if (sp->vselection.lLength) {
+                    eligibleSequences.Duplicate (&sp->vselection);
+                } else
+                    for (long k=0; k<sp->speciesIndex.lLength; k++) {
+                        eligibleSequences << k;
+                    }
+
+                _String    stran (selectedFilter->theOriginalOrder.lLength/3,false);
+
+                _AVLList   avl (&matches);
+
+                for (long idx = 0; idx < eligibleSequences.lLength; idx++) {
+                    long                    seqIdx =  sp->speciesIndex.lData[idx];
+                    bool                    doRev  = GetTranslationString (stran,sp->speciesIndex.lData[eligibleSequences.lData[idx]],0,filterSel.lData[0]);
+
+                    _SimpleList             found;
+                    stran.RegExpMatchAll (regExpie, found);
+                    if (doRev)
+                        for (long idx3 = 0; idx3 < found.lLength; idx3+=2)
+                            for (long idx4 = found.lData[idx3]; idx4<=found.lData[idx3+1]; idx4++) {
+                                seqIdx = selectedFilter->theOriginalOrder.lLength-idx4*3;
+
+                                avl.Insert ((BaseRef)selectedFilter->theOriginalOrder.lData[seqIdx-1]);
+                                avl.Insert ((BaseRef)selectedFilter->theOriginalOrder.lData[seqIdx-2]);
+                                avl.Insert ((BaseRef)selectedFilter->theOriginalOrder.lData[seqIdx-3]);
+                            }
+                    else
+                        for (long idx3 = 0; idx3 < found.lLength; idx3+=2)
+                            for (long idx4 = found.lData[idx3]; idx4<=found.lData[idx3+1]; idx4++) {
+                                avl.Insert ((BaseRef)selectedFilter->theOriginalOrder.lData[idx4*3]);
+                                avl.Insert ((BaseRef)selectedFilter->theOriginalOrder.lData[idx4*3+1]);
+                                avl.Insert ((BaseRef)selectedFilter->theOriginalOrder.lData[idx4*3+2]);
+                            }
+
+                }
+
+                avl.ReorderList();
+                seqSearch = 0;
+            } else {
+
+                _SimpleList *theMap = &myData->GetTheMap(),
+                             matchedSites ((unsigned long)myData->NoOfUniqueColumns(),0,0);
+
+                //pl->GetRowSelection (filterSel);
+
+                if (filterSel.lLength) {
+                    for (long d = 0; d<filterSel.lLength; d++) {
+                        _DataSetFilter * aFilter = (_DataSetFilter*)dataSetFilterList (dataPartitions.lData[filterSel.lData[d]]);
+                        for (long dd = 0; dd<aFilter->theMap.lLength; dd++) {
+                            matchedSites.lData [theMap->lData[aFilter->theMap.lData[dd]]] = 1;
+                        }
+                    }
+
+                    for (long k=0; k<matchedSites.lLength; matchedSites.lData[k++]=0)
+                        if (matchedSites.lData[k]) {
+                            eligibleSequences << k;
+                        }
+                } else
+                    for (long k=0; k<myData->NoOfUniqueColumns(); k++) {
+                        eligibleSequences << k;
+                    }
+
+                if (seqSearch) {
+                    _AVLList*     avm = nil;
+                    if (seqSearch == 2) {
+                        avm = new _AVLList (&matches);
+                        checkPointer (avm);
+                    }
+                    for (long idx = (seqSearch==4)?sp->vselection.lData[0]:0; idx<sp->speciesIndex.lLength; idx++) {
+                        _String      seqStringC (eligibleSequences.lLength, false),
+                                     seqString  (theMap->lLength, false);
+
+                        //long       seqIdx =  dataWrapper?dataWrapper->theNodeMap[sp->speciesIndex.lData[idx]]:sp->speciesIndex.lData[idx];
+                        long         seqIdx =  sp->speciesIndex.lData[idx];
+
+                        for (long idx2 = 0; idx2 < eligibleSequences.lLength; idx2++) {
+                            seqStringC.sData[idx2] = ((_Site*)(myData->_List::operator ())(eligibleSequences.lData[idx2]))->sData[seqIdx];
+                        }
+
+                        for (long idx2 = 0; idx2 < theMap->lLength; idx2++) {
+                            seqString.sData[idx2] = seqStringC.sData[theMap->lData[idx2]];
+                        }
+
+                        if (seqSearch == 2) {
+                            if (regExpie) {
+                                _SimpleList found;
+                                seqString.RegExpMatchAll (regExpie, found);
+                                for (long idx3 = 0; idx3 < found.lLength; idx3+=2)
+                                    for (long idx4 = found.lData[idx3]; idx4<=found.lData[idx3+1]; idx4++) {
+                                        avm->Insert ((BaseRef)idx4);
+                                    }
+
+                            } else {
+                                long f = seqString.FindAnyCase (dataPanelSearchTerm);
+                                while (f>=0) {
+                                    for (long k2 = 0; k2 < dataPanelSearchTerm.sLength; k2++,f++) {
+                                        avm->Insert ((BaseRef)f);
+                                    }
+
+                                    f = seqString.FindAnyCase (dataPanelSearchTerm,f,-1);
+                                }
+                            }
+                        }
+
+                        else {
+                            if (regExpie) {
+                                _SimpleList found;
+                                if (seqSearch < 4) {
+                                    seqString.RegExpMatch (regExpie, found);
+                                    if (found.lLength) {
+                                        matches << idx;
+                                    }
+                                } else {
+                                    seqString.RegExpMatchAll (regExpie, found);
+                                    for (long idx3 = 0; idx3 < found.lLength; idx3+=2)
+                                        for (long idx4 = found.lData[idx3]; idx4<=found.lData[idx3+1]; idx4++) {
+                                            matches << idx4;
+                                        }
+
+                                    break;
+                                }
+                            } else if (seqString.FindAnyCase (dataPanelSearchTerm)>=0) {
+                                matches << idx;
+                            }
+                        }
+                    }
+                    if (seqSearch == 2) {
+                        avm->ReorderList();
+                        DeleteObject (avm);
+                    }
+                    if (seqSearch!=1) {
+                        seqSearch = 0;
+                    }
+                } else {
+                    bool           permuteString = false;
+
+                    for (long k=0; k<sp->speciesIndex.lLength; k++)
+                        if (sp->speciesIndex.lData[k]!=k) {
+                            permuteString = true;
+                            break;
+                        }
+
+                    if (permuteString) {
+                        for (long idx = 0; idx<eligibleSequences.lLength; idx++) {
+                            _String * col = ((_Site*)(myData->_List::operator ())(eligibleSequences.lData[idx])),
+                                      pCol (10L, true);
+
+                            for (long idx2 = 0; idx2 < sp->speciesIndex.lLength; idx2++) {
+                                pCol << col->sData[sp->speciesIndex.lData[idx2]];
+                            }
+
+                            pCol.Finalize();
+                            if (regExpie) {
+                                _SimpleList  found;
+                                pCol.RegExpMatch (regExpie, found);
+                                matchedSites.lData[eligibleSequences.lData[idx]] = (found.lLength>0);
+                            } else {
+                                matchedSites.lData[eligibleSequences.lData[idx]] = (pCol.FindAnyCase (dataPanelSearchTerm)>=0);
+                            }
+
+                        }
+                    } else {
+                        for (long idx = 0; idx<eligibleSequences.lLength; idx++) {
+                            if (regExpie) {
+                                _SimpleList  found;
+                                ((_Site*)(myData->_List::operator ())(eligibleSequences.lData[idx]))->RegExpMatch (regExpie, found);
+                                matchedSites.lData[eligibleSequences.lData[idx]] = (found.lLength>0);
+                            } else
+                                matchedSites.lData[eligibleSequences.lData[idx]] =
+                                    (((_Site*)(myData->_List::operator ())(eligibleSequences.lData[idx]))->FindAnyCase (dataPanelSearchTerm)>=0);
+                        }
+                    }
+                }
+                if (seqSearch == 0)
+                    for (long idx = 0; idx < theMap->lLength; idx++)
+                        if (matchedSites.lData[theMap->lData[idx]]) {
+                            matches << idx;
+                        }
+            }
+        }
+        if (regExpie) {
+            FlushRegExp (regExpie);
+        }
+
+        sp->SelectRange (matches,seqSearch);
+        sp->ScrollToHSelection();
+        UpdateSelDepPartitionOperations();
+        _UpdateSelectionChoices (sp->selection.lLength);
+
+    }
+}
+
+
+
+//__________________________________________________________
+
+long     _HYDataPanel::FindGeneticCodeByExcl    (_String* excl)
+{
+    for (long k=0; k<geneticCodes.lLength; k++) {
+        _String*      myExcl = GetExclusionsFromCode (k);
+        if (excl->Equal (myExcl)) {
+            DeleteObject (myExcl);
+            return k;
+        }
+        DeleteObject (myExcl);
+    }
+    return -1;
+}
+
+//__________________________________________________________
+
+void     _HYDataPanel::HandleFontChange     (void)
+{
+    _HYSequencePane* sp = (_HYSequencePane*)components (0);
+
+    _HYFontDialog * fD = new _HYFontDialog (sp->GetFont(),this);
+    fD->Activate();
+}
+
+
+//__________________________________________________________
+
+void     _HYDataPanel::SetFont  (_HYFont& newFont)
+{
+    _HYSequencePane* sp = (_HYSequencePane*)components (0),
+                     * sp2= (_HYSequencePane*)components (4);
+
+    sp->SetFont (newFont);
+    sp2->SetFont (newFont);
+    SetWindowRectangle (top,left,bottom,right);
+}
+
+//__________________________________________________________
+
+void ReadGeneticCodes (void)
+{
+    _List receptacle,
+          addedNames;
+
+    _SimpleList addedIndex,
+                codeIndex;
+
+    _String line1,line2;
+    line1 = "Universal";
+    _List  uncode;
+    _SimpleList untable;
+    uncode && & line1;
+    line2 = "Built-in Universal Genetic Code";
+    uncode && & line2;
+    untable<<14;
+    untable<<13;
+    untable<<14;
+    untable<<13;
+    untable<<7;
+    untable<<7;
+    untable<<7;
+    untable<<7;
+    untable<<19;
+    untable<<5;
+    untable<<19;
+    untable<<5;
+    untable<<2;
+    untable<<2;
+    untable<<3;
+    untable<<2;
+    untable<<12;
+    untable<<11;
+    untable<<12;
+    untable<<11;
+    untable<<6;
+    untable<<6;
+    untable<<6;
+    untable<<6;
+    untable<<19;
+    untable<<19;
+    untable<<19;
+    untable<<19;
+    untable<<1;
+    untable<<1;
+    untable<<1;
+    untable<<1;
+    untable<<16;
+    untable<<15;
+    untable<<16;
+    untable<<15;
+    untable<<8;
+    untable<<8;
+    untable<<8;
+    untable<<8;
+    untable<<20;
+    untable<<20;
+    untable<<20;
+    untable<<20;
+    untable<<4;
+    untable<<4;
+    untable<<4;
+    untable<<4;
+    untable<<10;
+    untable<<9;
+    untable<<10;
+    untable<<9;
+    untable<<5;
+    untable<<5;
+    untable<<5;
+    untable<<5;
+    untable<<10;
+    untable<<17;
+    untable<<18;
+    untable<<17;
+    untable<<1;
+    untable<<0;
+    untable<<1;
+    untable<<0;
+    uncode && & untable;
+    geneticCodes && & uncode;
+    addedNames && & line1;
+    addedIndex << 0;
+    codeIndex << 0;
+
+    _String pathToGeneticCodes;
+    pathToGeneticCodes = libDirectory&"GeneticCodes";
+
+    ScanDirectoryForFileNames (pathToGeneticCodes,receptacle,true);
+
+    for (long k=0; k<receptacle.lLength; k++) {
+        FILE * thisFile = doFileOpen (((_String*)receptacle(k))->sData,"rb");
+        if (thisFile) {
+            _String buffer (thisFile),
+                    line3,
+                    line4;
+
+            long    curCodeIndex;
+
+            fclose (thisFile);
+            line4 = _ElementaryCommand::FindNextCommand(buffer);
+            line1 = _ElementaryCommand::FindNextCommand(buffer);
+            line2 = _ElementaryCommand::FindNextCommand(buffer);
+            line3 = _ElementaryCommand::FindNextCommand(buffer);
+            line1.Trim (0,line1.sLength-2);
+            line2.Trim (0,line2.sLength-2);
+            line3.Trim (0,line3.sLength-2);
+            line4.Trim (0,line4.sLength-2);
+
+            curCodeIndex = line4.toNum();
+
+            if (line1.sLength&&line2.sLength&&line3.sLength&&(curCodeIndex>=0)) {
+                if (line1.IsValidIdentifier()&&(addedNames.Find(&line1)==-1)&&(codeIndex.Find(curCodeIndex)==-1)) {
+                    _List partition;
+                    _SimpleList translations;
+                    _ElementaryCommand::ExtractConditions (line3,0,partition,',');
+                    for (long l=0; l<partition.lLength; l++) {
+                        _String* thisLine = (_String*)partition(l);
+                        long aa = thisLine->FirstNonSpaceIndex();
+                        if (aa>=0) {
+                            thisLine->Trim(aa,-1);
+                            if (thisLine->sLength) {
+                                aa = thisLine->toNum();
+                                if ((aa>=0)&&(aa<=20)) {
+                                    translations << aa;
+                                }
+                            }
+                        }
+                    }
+                    if (translations.lLength == 64) {
+                        _List goodCode;
+                        goodCode && & line1;
+                        goodCode && & line2;
+                        goodCode && & translations;
+                        addedIndex << geneticCodes.lLength;
+                        codeIndex << curCodeIndex;
+                        geneticCodes && & goodCode;
+                        addedNames && & line1;
+                    }
+                }
+            }
+        }
+    }
+    if (geneticCodes.lLength>1) {
+        SortLists (&codeIndex, &addedIndex);
+
+        long      k;
+
+        for (k=1; k<codeIndex.lLength; k++) {
+            if (codeIndex.lData[k] - codeIndex.lData[k-1] != 1) {
+                break;
+            }
+        }
+
+        if ((k<codeIndex.lLength)||(codeIndex.lData[1]!=1)) {
+            _String warnMsg ("There is a genetic code (or two) missing from the '");
+            warnMsg = warnMsg & pathToGeneticCodes & "'. You may experience problems with saved GUI analyses which include codon data with non Universal codes.";
+            StringToConsole (warnMsg);
+        }
+
+        _List   sortedCodes;
+        for (k=0; k<geneticCodes.lLength; k++) {
+            sortedCodes << geneticCodes (codeIndex.lData[k]);
+        }
+
+        geneticCodes.Clear();
+        geneticCodes.Duplicate (&sortedCodes);
+
+        _String status = _String("Loaded ") & (long)geneticCodes.lLength-1 & " genetic code tables from " & pathToGeneticCodes.getStr() & '\n';
+        StringToConsole (status);
+    } else {
+        _String warnMsg ("I couldn't find any valid genetic code tables in '");
+        warnMsg = warnMsg & pathToGeneticCodes & "'. You can still use the Universal code which is built-in.";
+        StringToConsole (warnMsg);
+    }
+}
+
+//__________________________________________________________
+
+void ReadModelTemplates (void)
+{
+    _List receptacle, addedNames;
+
+    _String line1;
+    _String pathToModelTemplates;
+    _SimpleList modelParams;
+
+    pathToModelTemplates = libDirectory&"SubstitutionModels";
+
+    ScanDirectoryForFileNames (pathToModelTemplates,receptacle,true);
+
+    for (long k=0; k<receptacle.lLength; k++) {
+        FILE * thisFile = doFileOpen (((_String*)receptacle(k))->sData,"rb");
+        if (thisFile) {
+            _String buffer (thisFile);
+            fclose (thisFile);
+            long   g = batchLanguageFunctionNames.lLength;
+            _ExecutionList   thisList;
+            terminateExecution = false;
+            thisList.BuildList (buffer);
+            thisList.Execute();
+
+            if (terminateExecution==false) {
+                /* check for variables and functions */
+                long     popFunc = batchLanguageFunctionNames.Find (&modelFunction),
+                         efvFunc = batchLanguageFunctionNames.Find (&efvFunction),
+                         codonFunc = batchLanguageFunctionNames.Find (&buildCodonFrequencies),
+                         tLong;
+                if (popFunc>=0) {
+                    long var1 = LocateVarByName (modelName);
+                    if (var1>=0) {
+                        long var2 = LocateVarByName (modelOptions);
+                        if (var2>=0) {
+                            long var3 = LocateVarByName (modelDimension);
+                            if (var3>=0) {
+                                _Variable* v1 = FetchVar (var1),
+                                           * v2 = FetchVar (var2),
+                                             * v3 = FetchVar (var3);
+                                if ((v1->ObjectClass()==STRING)&&(v2->ObjectClass()==NUMBER)&&(v3->ObjectClass()==NUMBER)) {
+                                    _List thisList;
+
+                                    modelParams.Clear();
+                                    tLong = v2->Value();
+                                    if (efvFunc==-1) {
+                                        if (tLong&HY_DATAPANEL_MODEL_EFVEST) {
+                                            tLong -= HY_DATAPANEL_MODEL_EFVEST;
+                                        }
+                                    }
+                                    modelParams << tLong;
+                                    modelParams << (tLong=(long)v3->Value());
+                                    if (((tLong==64)&&(codonFunc>=0))||(tLong!=64)) {
+
+                                        thisList && ((_FString*)v1->GetValue())->theString;
+                                        thisList && & modelParams;
+                                        thisList << receptacle(k);
+                                        if (addedNames.Find (thisList(0))<0) {
+                                            modelTemplates && & thisList;
+                                            addedNames << thisList (0);
+                                        }
+                                    }
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+            while (g<batchLanguageFunctionNames.lLength) {
+                batchLanguageFunctionNames.Delete (g);
+                batchLanguageFunctionParameters.Delete (g);
+                batchLanguageFunctions.Delete(g);
+                batchLanguageFunctionClassification.Delete(g);
+                batchLanguageFunctionParameterLists.Delete(g);
+            }
+        }
+    }
+    if (modelTemplates.lLength>1) {
+        _String status = _String("Loaded ") & (long)modelTemplates.lLength & " model templates from " & pathToModelTemplates.getStr() & '\n';
+        StringToConsole (status);
+    } else {
+        _String warnMsg ("I couldn't find any valid model templates in '");
+        warnMsg = warnMsg & pathToModelTemplates & "'. Please check your installation of HYPHY for missing files.";
+        StringToConsole (warnMsg);
+    }
+}
+
+//____________________________________________________________________________________________
+
+void  NewGeneticCodeTable (long starting)
+{
+    static _String      line1, line2;
+    static _SimpleList  translationTable;
+
+    if ((starting>=0)&&(starting<geneticCodes.lLength)) {
+        _List * startingTable = (_List*)geneticCodes(starting);
+        line1 = *(_String*)(*startingTable)(0);
+        line2 = *(_String*)(*startingTable)(1);
+        translationTable.Duplicate ((*startingTable)(2));
+    } else if (translationTable.lLength==0) {
+        if (geneticCodes.lLength==0) {
+            ReadGeneticCodes();
+        }
+        NewGeneticCodeTable (0);
+        return;
+    }
+
+    _List   theList,protein;
+    _String as, nucs("ACGT");
+    as = "Phenylalanine";
+    protein && & as;
+    as = "Leucine";
+    protein && & as;
+    as = "Isoleucine";
+    protein && & as;
+    as = "Methionine";
+    protein && & as;
+    as = "Valine";
+    protein && & as;
+    as = "Serine";
+    protein && & as;
+    as = "Proline";
+    protein && & as;
+    as = "Threonine";
+    protein && & as;
+    as = "Alanine";
+    protein && & as;
+    as = "Tyrosine";
+    protein && & as;
+    as = "Stop Codon";
+    protein && & as;
+    as = "Histidine";
+    protein && & as;
+    as = "Glutamine";
+    protein && & as;
+    as = "Asparagine";
+    protein && & as;
+    as = "Lysine";
+    protein && & as;
+    as = "Aspartic Acid";
+    protein && & as;
+    as = "Glutamic Acid";
+    protein && & as;
+    as = "Cysteine";
+    protein && & as;
+    as = "Tryptophan";
+    protein && & as;
+    as = "Arginine";
+    protein && & as;
+    as = "Glycine";
+    protein && & as;
+
+    as = "AAA";
+    AddItemToPreferences (1|8,-1,"Name and Description","Identifier and description for the genetic code.","",nil,theList,false);
+    AddItemToPreferences (0,PREFITEM_TEXTBOX,"Code Identifier","This must be a valid unique HYPHY identifier (begins with a letter or an underscore, contains letters, numbers or underscores).",line1,nil, theList,false);
+    AddItemToPreferences (0,PREFITEM_TEXTBOX,"Description","A brief description of the code table.",line2,nil,theList,false);
+    AddItemToPreferences (1|8,-1,"Codon translations.","Define aminoacids encoded by each codon.","",nil,theList,false);
+
+    for (long f = 0; f<4; f++) {
+        as.sData[0] = nucs[f];
+        for (long s = 0; s<4; s++) {
+            as.sData[1] = nucs[s];
+            for (long t = 0; t<4; t++) {
+                as.sData[2] = nucs[t];
+                AddItemToPreferences (0,PREFITEM_POPUP,as,_String("Target aminoacid for ")& as,
+                                      *(_String*)protein(translationTable.lData[f*16+s*4+t]),&protein,theList,false);
+            }
+        }
+    }
+
+    if (HandlePreferences (theList, "New Translation Code", false)) {
+        _List *codeSettings = (_List*)theList.lData[4];
+
+        line1 = *(_String*)(*codeSettings)(1);
+        long k;
+        for (k=0; k<geneticCodes.lLength; k++) {
+            if (line1.Equal((_String*)(*((_List*)geneticCodes(k)))(0))) {
+                as = line1 & " is already in use. Please select another name for the new genetic code table.";
+                if (ProceedPrompt(as)) {
+                    NewGeneticCodeTable (-1);
+                }
+                return;
+            }
+        }
+
+        line2 = *(_String*)(*codeSettings)(2);
+        for (k = 4; k< 68 ; k++) {
+            translationTable.lData[k-4] = protein.Find((*codeSettings)(k));
+        }
+
+        // add  the code to the table
+        theList.Clear();
+        theList&& &line1;
+        theList&& &line2;
+        theList&& &translationTable;
+        // save the code to a file
+
+#ifdef __MAC__
+        as = baseDirectory & "GeneticCodes:";
+#endif
+#ifdef __WINDOZE__
+        as = baseDirectory & "GeneticCodes\\";
+#endif
+
+        as = as & line1;
+
+        _String fName = as & ".cod";
+
+        FILE* testMe;
+
+        k = 2;
+
+        while ((testMe=doFileOpen(fName.sData,"r"))) {
+            fclose (testMe);
+            fName = as & _String (k++)& ".cod";
+        }
+
+        testMe = doFileOpen (fName.sData,"w");
+        if (testMe) {
+            fprintf(testMe,"%lu;\n%s;\n%s;\n",geneticCodes.lLength,line1.sData,line2.sData);
+            for (k=0; k<63; k++) {
+                fprintf (testMe,"%ld /*%c%c%c*/,\n",translationTable.lData[k],nucs.sData[k/16],nucs.sData[(k%16)/4],nucs.sData[k%4]);
+            }
+            fprintf (testMe,"%ld /*TTT*/;\n",translationTable.lData[63]);
+            fclose (testMe);
+            geneticCodes && & theList;
+        } else {
+            as = "Sorry, but a file error foiled my attempts to save the new code table to disk.";
+            ProblemReport (as);
+        }
+
+    }
+}
+
+//____________________________________________________________________________________________
+
+_List*   FindModelTemplate (_String* modelName)
+{
+    for (long k=0; k<modelTemplates.lLength; k++) {
+        _List* thisList = (_List*)modelTemplates(k);
+        if (modelName->Equal((_String*)(*thisList)(0))) {
+            return thisList;
+        }
+    }
+    return nil;
+}
+//____________________________________________________________________________________________
+
+_List*   FindModelTemplate (long mID, long mSize)
+{
+    long m = 0;
+    for (long k=0; k<modelTemplates.lLength; k++) {
+        _List* thisList = (_List*)modelTemplates(k);
+        if ((mSize==((_SimpleList*)(*thisList)(1))->lData[1])||
+                (((((_SimpleList*)(*thisList)(1))->lData[1])==64)&&(mSize>45))) {
+            if (mID==m) {
+                return thisList;
+            }
+            m++;
+        }
+    }
+    return nil;
+}
+
+//____________________________________________________________________________________________
+
+long     FindModelTemplate (_String* name, long mSize)
+{
+    long m = 0;
+    for (long k=0; k<modelTemplates.lLength; k++) {
+        _List* thisList = (_List*)modelTemplates(k);
+        if ((mSize==((_SimpleList*)(*thisList)(1))->lData[1])||
+                (((((_SimpleList*)(*thisList)(1))->lData[1])==64)&&(mSize>45))) {
+            if (name->Equal((_String*)(*thisList)(0))) {
+                return m;
+            }
+            m++;
+        }
+    }
+    return -1;
+}
+
+//____________________________________________________________________________________________
+
+long     DimensionOfGenCode (long k)
+{
+    if ((k>=0)&&(k<geneticCodes.lLength)) {
+        _SimpleList * gC = (_SimpleList*)(*(_List*)geneticCodes(k))(2);
+        long    dc =0;
+        for (k=0; k<gC->lLength; k++)
+            if (gC->lData[k]==10) {
+                dc++;
+            }
+        return gC->lLength-dc;
+    }
+    return 0;
+}
+
+//____________________________________________________________________________________________
+
+void     SetModelMenus (int options, _HYPullDown * m1, _HYPullDown * m2)
+{
+    m1->EnableItem (1,options&HY_DATAPANEL_MODEL_GLOBAL);
+    m1->EnableItem (2,options&HY_DATAPANEL_MODEL_GLOBALG);
+    m2->EnableItem (3,options&HY_DATAPANEL_MODEL_EFVEST);
+    if (options&HY_DATAPANEL_MODEL_MODELS) {
+        m2->EnableItem (0,false);
+        m2->EnableItem (1,false);
+        m2->EnableItem (2,false);
+        m2->EnableItem (3,false);
+        m2->EnableItem (4,true);
+        m1->EnableItem (0,!((options&HY_DATAPANEL_MODEL_GLOBAL)||(options&HY_DATAPANEL_MODEL_GLOBALG)));
+    } else {
+        m1->EnableItem (0,true);
+        m2->EnableItem (0,true);
+        m2->EnableItem (1,true);
+        m2->EnableItem (2,true);
+        m2->EnableItem (3,true);
+        m2->EnableItem (4,false);
+    }
+}
+
+//____________________________________________________________________________________________
+
+bool     RequestDataSetReplace (long k)
+{
+    for (long index = 0; index < windowObjectRefs.lLength; index++) {
+        if (((_HYWindow*)windowObjectRefs(index))->WindowKind()==HY_WINDOW_KIND_DATAPANEL) {
+            _HYDataPanel* thisPanel = (_HYDataPanel*)windowObjectRefs(index);
+            if (thisPanel->GetDSID()==k) {
+                _String errMsg ("Data Set '");
+                errMsg = errMsg & *(_String*)dataSetNamesList (k) & "' can't be overwritten because it is in use by the window '" &
+                         thisPanel->GetTitle() & "'. Close this window, and try again.";
+                ProblemReport (errMsg);
+                return false;
+            }
+        }
+    }
+    return true;
+}
+
+//____________________________________________________________________________________________
+
+bool     RequestLFDeleteOrAlter (long k)
+{
+    for (long index = 0; index < windowObjectRefs.lLength; index++) {
+        if (((_HYWindow*)windowObjectRefs(index))->WindowKind()==HY_WINDOW_KIND_DATAPANEL) {
+            _HYDataPanel* thisPanel = (_HYDataPanel*)windowObjectRefs(index);
+            if (thisPanel->GetLFID()==k) {
+                _String errMsg ("The operation can't proceed because the likelihood function about to be affected is in use by the window '");
+                errMsg = errMsg & thisPanel->GetTitle() & "'.";
+                ProblemReport (errMsg);
+                return false;
+            }
+        }
+    }
+    return true;
+}
+
+//__________________________________________________________
+
+void ReadDataPanelProcessors (void)
+{
+    _String     pathToModelTemplates;
+    _List       receptacle;
+
+    pathToModelTemplates     = libDirectory&"DatapanelAddIns";
+    ScanDirectoryForFileNames (pathToModelTemplates,receptacle,false);
+
+    for (long k=0; k<receptacle.lLength; k++) {
+        FILE * thisFile = doFileOpen (((_String*)receptacle(k))->sData,"rb");
+        if (thisFile) {
+            _String buffer (thisFile);
+            fclose (thisFile);
+            if (buffer.sLength) {
+                dataPanelProcessors << (_String*)receptacle(k);
+            }
+        }
+    }
+}
+
+
+
+//EOF
diff --git a/src/gui/HYDialogDefs.cpp b/src/gui/HYDialogDefs.cpp
new file mode 100644
index 0000000..591f01b
--- /dev/null
+++ b/src/gui/HYDialogDefs.cpp
@@ -0,0 +1,4932 @@
+/*
+ 
+ HyPhy - Hypothesis Testing Using Phylogenies.
+ 
+ Copyright (C) 1997-now
+ Core Developers:
+ Sergei L Kosakovsky Pond (spond at ucsd.edu)
+ Art FY Poon    (apoon at cfenet.ubc.ca)
+ Steven Weaver (sweaver at ucsd.edu)
+ 
+ Module Developers:
+ Lance Hepler (nlhepler at gmail.com)
+ Martin Smith (martin.audacis at gmail.com)
+ 
+ Significant contributions from:
+ Spencer V Muse (muse at stat.ncsu.edu)
+ Simon DW Frost (sdf22 at cam.ac.uk)
+ 
+ Permission is hereby granted, free of charge, to any person obtaining a
+ copy of this software and associated documentation files (the
+ "Software"), to deal in the Software without restriction, including
+ without limitation the rights to use, copy, modify, merge, publish,
+ distribute, sublicense, and/or sell copies of the Software, and to
+ permit persons to whom the Software is furnished to do so, subject to
+ the following conditions:
+ 
+ The above copyright notice and this permission notice shall be included
+ in all copies or substantial portions of the Software.
+ 
+ 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.
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ 
+ */
+#include "HYDialogs.h"
+#include "HYTableWindow.h"
+#include "HYButton.h"
+#include "HYLabel.h"
+#include "HYCanvas.h"
+#include "HYUtils.h"
+#include "HYEventTypes.h"
+#include "HYTextBox.h"
+#include "HYButtonBar.h"
+#include "HYPullDown.h"
+#include "HYTableComponent.h"
+#include "HYTreePanel.h"
+#include "HYChartWindow.h"
+#include "HYConsoleWindow.h"
+#include "HYDataPanel.h"
+#include "HYModelWindow.h"
+#include "HYDBWindow.h"
+#include "HYSharedMain.h"
+
+#include "batchlan.h"
+#include "string.h"
+#include "likefunc.h"
+#include "ctype.h"
+#include "math.h"
+
+#ifdef    __HYPHYDMALLOC__
+#include "dmalloc.h"
+#endif
+
+_HYRect  hierListTextBoxBounds  = {25,20,145,280,0},
+         hierListTextBoxBounds2 = {15,10,145,165,0};
+
+_List    cachedDialogTitles,
+         cachedDialogSelections;
+
+void     SetDefaultDialogFont   (_HYFont&);
+
+
+extern  _String         none;
+
+long            combSizeMemory = 3;
+_SimpleList     combSelectionMemory;
+_List           wiseCrackButtons;
+
+//__________________________________________________________
+
+void            SetDefaultDialogFont (_HYFont& labelFont)
+{
+#ifdef __MAC__
+    labelFont.face  = "System Font";
+    labelFont.size  = 12;
+#else
+#ifdef __WINDOZE__
+    labelFont.face  = "Arial";
+    labelFont.size  = 14;
+#else
+    labelFont.face  = _HY_SANS_FONT;
+    labelFont.size  = 10;
+#endif
+#endif
+    labelFont.style = HY_FONT_PLAIN;
+}
+
+//__________________________________________________________
+// Begin font dialog
+//__________________________________________________________
+
+_SimpleList     customFontSizes;
+
+// stores custom font sizes between calls
+
+//__________________________________________________________
+
+_HYFontDialog::_HYFontDialog (_HYFont& startWith,_HYWindow* rec):_HYTWindow ("HyPhy Font Selector", false, true, (Ptr)rec)
+{
+
+    _HYRect         canvasSettings = {30,100,30,100,HY_COMPONENT_NO_SCROLL|HY_COMPONENT_TRANSP_BG};
+
+    _HYLabel*       l1      = new _HYLabel (canvasSettings, GetOSWindowData());
+    _HYLabel*       l2      = new _HYLabel (canvasSettings, GetOSWindowData());
+    _HYLabel*       l3      = new _HYLabel (canvasSettings, GetOSWindowData());
+
+
+    canvasSettings.left = canvasSettings.right = 200;
+
+    _HYPullDown*    p1      = new _HYPullDown (canvasSettings, GetOSWindowData());
+    _HYPullDown*    p2      = new _HYPullDown (canvasSettings, GetOSWindowData());
+    _HYPullDown*    p3      = new _HYPullDown (canvasSettings, GetOSWindowData());
+
+    canvasSettings.left = canvasSettings.right = 220;
+    _HYButton*      b1      = new _HYButton (canvasSettings, GetOSWindowData());
+
+    canvasSettings.left = canvasSettings.right = 81;
+    _HYButton*      b2      = new _HYButton (canvasSettings, GetOSWindowData());
+
+    canvasSettings.left = canvasSettings.right = 300;
+    canvasSettings.top = canvasSettings.bottom = 50;
+    canvasSettings.width = HY_COMPONENT_WELL|HY_COMPONENT_TRANSP_BG;
+
+    _HYLabel*       l4      = new _HYLabel (canvasSettings, GetOSWindowData());
+
+    p1->SetMessageRecipient (this);
+    p2->SetMessageRecipient (this);
+    p3->SetMessageRecipient (this);
+    b1->SetMessageRecipient (this);
+    b2->SetMessageRecipient (this);
+
+    AddObject (l1);
+    AddObject (l2);
+    AddObject (l3);
+    AddObject (l4);
+
+    AddObject (p1);
+    AddObject (p2);
+    AddObject (p3);
+
+    AddObject (b1);
+    AddObject (b2);
+
+
+    SetTableDimensions (5,3);
+    SetCell   (0,0,l1);
+    SetCell   (0,1,p1);
+    SetCell   (0,2,p1);
+
+    SetCell   (1,0,l2);
+    SetCell   (1,1,p2);
+    SetCell   (1,2,p2);
+
+    SetCell   (2,0,l3);
+    SetCell   (2,1,p3);
+    SetCell   (2,2,p3);
+
+    SetCell   (3,0,l4);
+    SetCell   (3,1,l4);
+    SetCell   (3,2,l4);
+
+    SetCell   (4,0,b1);
+    SetCell   (4,1,b1);
+    SetCell   (4,2,b2);
+
+
+    _HYFont  labelFont;
+    SetDefaultDialogFont (labelFont);
+
+    l1->SetFont (labelFont);
+    l2->SetFont (labelFont);
+    l3->SetFont (labelFont);
+
+    b1->SetFont (labelFont);
+    b2->SetFont (labelFont);
+
+    myFont = startWith;
+    l4->SetFont (myFont);
+
+    l1->SetAlignFlags (HY_ALIGN_LEFT);
+    l2->SetAlignFlags (HY_ALIGN_LEFT);
+    l3->SetAlignFlags (HY_ALIGN_LEFT);
+
+    b1->SetAlignFlags (HY_ALIGN_RIGHT);
+
+    p1->SetAlignFlags (HY_ALIGN_LEFT);
+    p2->SetAlignFlags (HY_ALIGN_LEFT);
+    p3->SetAlignFlags (HY_ALIGN_LEFT);
+
+    l1->SetText       ("Font:");
+    l2->SetText       ("Size:");
+    l3->SetText       ("Style:");
+
+    l4->SetText       ("The answer is 42.");
+
+    b1->SetText       ("  OK  ");
+    b1->SetButtonKind (HY_BUTTON_OK);
+    b2->SetText       (" Cancel ");
+    b2->SetButtonKind (HY_BUTTON_CANCEL);
+
+    _List fonts;
+
+    GenerateFontList (fonts);
+
+    long k;
+
+    for (k=0; k<fonts.lLength; k++) {
+        p1->AddMenuItem (*(_String*)fonts(k),-1);
+    }
+
+    if (customFontSizes.lLength==0) {
+        customFontSizes << 4;
+        customFontSizes << 7;
+        customFontSizes << 8;
+        customFontSizes << 9;
+        customFontSizes << 10;
+        customFontSizes << 11;
+        customFontSizes << 12;
+        customFontSizes << 14;
+        customFontSizes << 18;
+    }
+
+    k = customFontSizes.Find (myFont.size);
+    if (k<0) {
+        customFontSizes << myFont.size;
+    }
+
+    customFontSizes.Sort();
+
+    for (k=0; k< customFontSizes.lLength; k++) {
+        p2->AddMenuItem (_String(customFontSizes.lData[k]),-1);
+    }
+
+    p2->AddMenuItem   (menuSeparator,-1);
+    p2->AddMenuItem   ("Other...",-1);
+
+    p3->AddMenuItem   ("Plain",-1);
+    p3->AddMenuItem   ("Bold",-1);
+    p3->AddMenuItem   ("Italic",-1);
+    p3->AddMenuItem   ("Bold Italic",-1);
+
+
+    k = p1->FindMenuItem (myFont.face);
+    if (k>=0) {
+        p1->ChangeSelection (p1->FindMenuItem (myFont.face),false);
+    } else {
+        p1->AddMenuItem (myFont.face,0);
+    }
+
+
+    k = customFontSizes.Find (myFont.size);
+    p2->ChangeSelection (k,false);
+
+    p3->ChangeSelection (myFont.style, false);
+
+    DeleteObject (l1);
+    DeleteObject (l2);
+    DeleteObject (l3);
+    DeleteObject (l4);
+    DeleteObject (p1);
+    DeleteObject (p2);
+    DeleteObject (p3);
+    DeleteObject (b1);
+    DeleteObject (b2);
+
+    _HYRect     dim = MinMaxWindowDimensions();
+
+    SetWindowRectangle  (0,0,dim.bottom,dim.right);
+    CenterWindow        (this);
+    firstFont = myFont;
+    mr = rec;
+}
+
+//__________________________________________________________
+
+bool    _HYFontDialog::ProcessEvent (_HYEvent* e)
+{
+    bool        done = false;
+    _String     firstArg;
+    long        i,f,g,k;
+
+    if (e->EventClass()==_hyMenuSelChangeEvent) {
+        firstArg = e->EventCode().Cut (0,(f=e->EventCode().Find(','))-1);
+        k = firstArg.toNum();
+        g = e->EventCode().Cut (f+1,-1).toNum();
+
+        for (i=0; i<components.lLength; i++)
+            if (((_HYGuiObject*)components(i))->MatchID(k)) {
+                break;
+            }
+
+        if (i==4) {
+            myFont.face = *((_HYPullDown*)components(i))->GetMenuItem(g);
+        } else if (i==5) {
+            _HYPullDown * p2 = (_HYPullDown*)components(i);
+            if (g!=p2->MenuItemCount()-1) {
+                myFont.size = p2->GetMenuItem(g)->toNum();
+            } else {
+                _String prompt ("Desired Font Size (2-255):"),
+                        value  ((long)myFont.size);
+                if (EnterStringDialog (value,prompt)) {
+                    g = value.toNum();
+                    if ((g>1)&&(g<255)) {
+                        k=customFontSizes.Find(g);
+                        if (k==-1) {
+                            customFontSizes<<g;
+                            p2->AddMenuItem (_String(g),p2->MenuItemCount()-2);
+                        }
+                        myFont.size = g;
+                    }
+                }
+                p2->ChangeSelection (customFontSizes.Find (myFont.size),false);
+            }
+        } else if (i==6) {
+            myFont.style = g;
+        }
+
+        ((_HYLabel*)components (3))->SetFont (myFont);
+        done = true;
+    } else if (e->EventClass()==_hyButtonPushEvent) {
+        firstArg = e->EventCode().Cut (0,(f=e->EventCode().Find(','))-1);
+        k = firstArg.toNum();
+        for (i=0; i<components.lLength; i++)
+            if (((_HYGuiObject*)components(i))->MatchID(k)) {
+                break;
+            }
+
+        if (i==7) { // OK
+            if ((!myFont.face.Equal(&firstFont.face))||(myFont.size!=firstFont.size)||(myFont.style!=firstFont.style)) {
+                mr->SetFont (myFont);
+            }
+            postWindowCloseEvent (GetID());
+        } else if (i==8) { // Cancel
+            postWindowCloseEvent (GetID());
+        }
+
+        done = true;
+    }
+
+    if (done) {
+        DeleteObject (e);
+        return true;
+    }
+    return _HYTWindow::ProcessEvent(e);
+}
+
+//__________________________________________________________________
+_HYListSelectDialog::_HYListSelectDialog     (_List* d, _SimpleList* c, _SimpleList* vc, _String n, _SimpleList* s, long* r)
+    :_HYTWindow (n,false,true)
+{
+    data            = d;
+    choices         = c;
+    validChoices    = vc;
+    selections      = s;
+
+    result          = r;
+
+    _List           hData,
+                    rData,
+                    iData,
+                    diData;
+
+
+    long            counter;
+
+    keyboardFocusChain << 0;
+
+    for (counter = 0; counter< (*validChoices).lLength; counter++) {
+        _String* tStr = (_String*)(*(_List*)((*data)(validChoices->lData[counter])))(choices->lData[0]);
+        if (tStr->sData[0]=='!') {
+            if (rData.lLength) {
+                rData && & iData;
+                hData && & rData;
+                dData && & diData;
+            }
+            rData.Clear();
+            iData.Clear();
+            diData.Clear();
+            diData << (*(_List*)(*data)((*validChoices)(counter)))((*choices)(1));
+            _String tStr2 (*tStr,1,-1);
+            rData && & tStr2;
+        } else {
+            iData  << tStr;
+            diData << (*(_List*)(*data)((*validChoices)(counter)))((*choices)(1));
+        }
+    }
+
+    rData && & iData;
+    hData && & rData;
+    dData && & diData;
+
+    _HYRect         canvasSettings = {200,300,200,300,HY_COMPONENT_V_SCROLL|HY_COMPONENT_TRANSP_BG};
+
+    _HYHList*       hl      = new _HYHList (canvasSettings, GetOSWindowData(),hData);
+
+    hl->settings.bottom = MAX(200,hl->GetMaxH());
+    hl->selectionType |= HY_TABLE_SINGLE_SELECTION|HY_TABLE_FOCUSABLE;
+
+    canvasSettings.top   = canvasSettings.bottom = 150;
+
+    canvasSettings.width = HY_COMPONENT_NO_SCROLL|HY_COMPONENT_TRANSP_BG;
+    _HYCanvas*      cn      = new _HYCanvas (canvasSettings,GetOSWindowData(),150,300,32);
+
+    canvasSettings.bottom = canvasSettings.top   = 40;
+    canvasSettings.left   = canvasSettings.right = 220;
+
+    _HYButton*      b1      = new _HYButton (canvasSettings, GetOSWindowData());
+    canvasSettings.left   = canvasSettings.right = 80;
+    _HYButton*      b2      = new _HYButton (canvasSettings, GetOSWindowData());
+
+    canvasSettings.left  = canvasSettings.right  = 300;
+    canvasSettings.top   = canvasSettings.bottom = 10;
+    canvasSettings.width = HY_COMPONENT_BORDER_B|HY_COMPONENT_TRANSP_BG;
+
+    _HYLabel*       l1      = new _HYLabel  (canvasSettings, GetOSWindowData());
+
+
+    hl->SetMessageRecipient (this);
+    b1->SetMessageRecipient (this);
+    b2->SetMessageRecipient (this);
+
+    AddObject (hl);
+    AddObject (cn);
+    AddObject (b1);
+    AddObject (b2);
+    AddObject (l1);
+
+    SetTableDimensions (3,2);
+    SetCell   (0,0,l1);
+    SetCell   (0,1,l1);
+
+    SetCell   (0,0,hl);
+    SetCell   (0,1,hl);
+
+    SetCell   (1,0,cn);
+    SetCell   (1,1,cn);
+
+    SetCell   (2,0,b1);
+    SetCell   (2,1,b2);
+
+    //b1->SetBackColor (bgRGB);
+    //b2->SetBackColor (bgRGB);
+    //l1->SetBackColor (bgRGB);
+
+
+    _HYFont         labelFont;
+    SetDefaultDialogFont (labelFont);
+
+    b1->SetFont (labelFont);
+    b2->SetFont (labelFont);
+
+    cn->StartDraw();
+    //cn->SetBColor (bgRGB);
+    cn->SetDialogBG();
+    cn->EraseAll  ();
+    cn->SetColor  ((_HYColor) {
+        0,0,0
+    });
+
+#ifndef __MAC__
+    labelFont.face  = "Verdana";
+    labelFont.size  = 12;
+#else
+    labelFont.face = "Geneva";
+    labelFont.size = 10;
+#endif
+
+    labelFont.style = HY_FONT_BOLD;
+    canvasSettings.width  = 1;
+    canvasSettings.top = canvasSettings.bottom = canvasSettings.left = 0;
+    canvasSettings.right  = 300;
+    cn->DrawLine (canvasSettings);
+    cn->SetFont (labelFont);
+    canvasSettings.left = 5;
+    canvasSettings.top  = 15;
+    canvasSettings.bottom = 148;
+    canvasSettings.right  = 293;
+    cn->DrawInfoBox (canvasSettings,"Item Description");
+    labelFont.style = HY_FONT_PLAIN;
+    cn->SetFont (labelFont);
+    cn->EndDraw();
+
+    b1->SetAlignFlags (HY_ALIGN_RIGHT);
+
+    b1->SetText       ("  OK  ");
+    b1->SetButtonKind (HY_BUTTON_OK);
+    b2->SetText       (" Cancel ");
+    b2->SetButtonKind (HY_BUTTON_CANCEL);
+    b1->EnableButton  (false);
+
+    DeleteObject (b1);
+    DeleteObject (b2);
+    DeleteObject (l1);
+    DeleteObject (hl);
+    DeleteObject (cn);
+
+    _HYRect     dim         = MinMaxWindowDimensions(),
+                screenDim     = GetScreenDimensions   ();
+
+    SetWindowRectangle  (0,0,MIN(screenDim.bottom-200,dim.bottom),dim.right);
+    CenterWindow        (this);
+    *result = -1;
+
+}
+
+
+//__________________________________________________________________
+bool    _HYListSelectDialog::ProcessEvent    (_HYEvent* e)
+{
+    bool        done = false;
+    _String     firstArg;
+    long        i,f,g,k;
+
+    if (e->EventClass()==_hyButtonPushEvent) {
+        firstArg = e->EventCode().Cut (0,(f=e->EventCode().Find(','))-1);
+        k = firstArg.toNum();
+        for (i=0; i<components.lLength; i++)
+            if (((_HYGuiObject*)components(i))->MatchID(k)) {
+                break;
+            }
+
+        if (i==2) { // OK
+            _HYHList * theList = (_HYHList*)components  (0);
+
+            _SimpleList s;
+            theList->GetSelection (s);
+            if (s.lLength == 1) {
+                k = theList->RubrikIndex (s.lData[0]/2);
+                f = k>>16;
+                g = k&0xffff;
+                k = 0;
+                for (f=f-1; f>=0; f--) {
+                    k+=((_List*)dData(f))->lLength;
+                }
+                *result = k+g;
+                StoreDialogSelection (&GetTitle(),(_String*)theList->GetCellData (s.lData[0]%2,s.lData[0]/2));
+            }
+            postWindowCloseEvent (GetID());
+        } else if (i==3) { // Cancel
+            postWindowCloseEvent (GetID());
+        }
+
+        done = true;
+    } else if (e->EventClass()==_hyTableChangeSelEvent) {
+        k = e->EventCode().toNum();
+        for (i=0; i<components.lLength; i++) {
+            if (((_HYGuiObject*)components(i))->MatchID(k)) {
+                break;
+            }
+        }
+        if (i==0) {
+            _HYHList * theList = (_HYHList*)components  (0);
+            _HYCanvas* cn      = (_HYCanvas*)components (1);
+            _HYButton* b1      = (_HYButton*)components (2);
+
+            _SimpleList s;
+            theList->GetSelection (s);
+            cn->StartDraw();
+            if (s.lLength!=1) {
+                cn->EraseRect(hierListTextBoxBounds);
+                b1->EnableButton (false);
+            } else {
+                k = theList->RubrikIndex (s.lData[0]/2);
+                f = k>>16;
+                g = k&0xffff;
+                b1->EnableButton (g);
+                _String * thisString = (_String*)(*(_List*)(dData(f)))(g);
+                //cn->CrossfadeText (lastString,*thisString,hierListTextBoxBounds,6,30,HY_ALIGN_LEFT,2);
+                cn->DisplayText (*thisString,hierListTextBoxBounds,HY_ALIGN_LEFT);
+                lastString = *thisString;
+            }
+            cn->EndDraw();
+            cn->_MarkForUpdate();
+            done = true;
+        }
+    } else if (e->EventClass()==_hyTableDblClickEvent) {
+        k = e->EventCode().toNum();
+        for (i=0; i<components.lLength; i++) {
+            if (((_HYGuiObject*)components(i))->MatchID(k)) {
+                break;
+            }
+        }
+        if (i==0) {
+            _HYHList * theList = (_HYHList*)components  (0);
+
+            _SimpleList s;
+            theList->GetSelection (s);
+            k = theList->RubrikIndex (s.lData[0]/2);
+            f = k>>16;
+            g = k&0xffff;
+            if (g) {
+                k = 0;
+                for (f=f-1; f>=0; f--) {
+                    k+=((_List*)dData(f))->lLength;
+                }
+                *result = k+g;
+                postWindowCloseEvent (GetID());
+            } else {
+                theList->HandleKeyMove (theList->IsRubrikOpen(f)?2:3,false);
+            }
+            done = true;
+        }
+    }
+
+    if (done) {
+        DeleteObject (e);
+        return true;
+    }
+    return _HYTWindow::ProcessEvent(e);
+}
+
+//____________________________________________________________________________________________
+
+void        _HYListSelectDialog::SetInitialSelection (void)
+{
+    long       index = 0;
+    _HYHList * theList = (_HYHList*)components  (0);
+    _String* sel   = RetrieveCachedSelection (&GetTitle());
+
+    if (sel) {
+        index = theList->FindString (sel);
+        if (index<0) {
+            index = 0;
+        } else {
+            long rubrikIndex = (index >> 16);
+            theList->ModifySelection (0,rubrikIndex,false,false,false);
+            index = rubrikIndex + (index&0xffff) + 1;
+        }
+    }
+
+    _SimpleList  ns (2*index+1);
+    theList->ClearSelection      (false);
+    theList->SetSelection        (ns,true);
+    theList->_MarkCellsForUpdate (ns);
+    theList->ScrollToRow         (index);
+    ProcessEvent (generateKeyboardFocusEvent (theList->GetID()));
+}
+
+//__________________________________________________________________
+_HYSimpleListSelectDialog::_HYSimpleListSelectDialog     (_List* d, _SimpleList* c, _SimpleList* vc, _String n, _SimpleList* s, long ns, long* r, Ptr ptr)
+    :_HYTWindow (n,false,true,ptr)
+{
+    choices         = c;
+    validChoices    = vc;
+    selections      = s;
+
+    result          = r;
+    reqSel          = ns;
+
+    long            counter;
+
+    _HYRect         canvasSettings = {150,300,150,300,HY_COMPONENT_V_SCROLL|HY_COMPONENT_TRANSP_BG};
+
+    _HYTable *      hl      = new _HYTable (canvasSettings, GetOSWindowData(),validChoices->lLength,1,301-HY_SCROLLER_WIDTH,20,
+                                            HY_TABLE_STATIC_TEXT);
+
+    for (counter = 0; counter< (*validChoices).lLength; counter++) {
+        hl->SetCellData ((*(_List*)((*d)(validChoices->lData[counter])))(choices->lData[0]),counter,0,HY_TABLE_STATIC_TEXT,true);
+        _String* tStr = (_String*)(*(_List*)((*d)(validChoices->lData[counter])))(choices->lData[1]);
+        dData << tStr;
+    }
+
+    counter = hl->GetMaxH();
+    if (counter<150) {
+        hl->AddRow (-1,150-counter,HY_TABLE_STATIC_TEXT|HY_TABLE_CANTSELECT);
+    }
+
+    hl->selectionType |= HY_TABLE_FOCUSABLE|HY_TABLE_NODRAG_SELECTION;
+
+    if (reqSel==1) {
+        hl->selectionType |= HY_TABLE_SINGLE_SELECTION;
+    }
+
+    /*canvasSettings.top   = canvasSettings.bottom = 150;
+    canvasSettings.left  = canvasSettings.right  = 2;*/
+
+    keyboardFocusChain << 0;
+
+    canvasSettings.width = HY_COMPONENT_NO_SCROLL|HY_COMPONENT_TRANSP_BG;
+    _HYCanvas*      cn      = new _HYCanvas (canvasSettings,GetOSWindowData(),150,300,32);
+
+    canvasSettings.bottom = canvasSettings.top   = 40;
+    canvasSettings.left   = canvasSettings.right = 80;
+
+    _HYButton*      b1      = new _HYButton (canvasSettings, GetOSWindowData());
+    canvasSettings.left   = canvasSettings.right = 80;
+    _HYButton*      b2      = new _HYButton (canvasSettings, GetOSWindowData());
+
+    canvasSettings.left  = canvasSettings.right  = 140;
+
+    _HYLabel*       l1      = new _HYLabel  (canvasSettings, GetOSWindowData());
+
+
+    hl->SetMessageRecipient (this);
+    b1->SetMessageRecipient (this);
+    b2->SetMessageRecipient (this);
+
+    AddObject (hl);
+    AddObject (cn);
+    AddObject (b1);
+    AddObject (b2);
+    AddObject (l1);
+
+    SetTableDimensions (3,3);
+
+    SetCell   (0,0,hl);
+    SetCell   (0,1,hl);
+    SetCell   (0,2,hl);
+
+    SetCell   (1,0,cn);
+    SetCell   (1,1,cn);
+    SetCell   (1,2,cn);
+
+    SetCell   (2,0,l1);
+    SetCell   (2,1,b1);
+    SetCell   (2,2,b2);
+
+    //b1->SetBackColor (bgRGB);
+    //b2->SetBackColor (bgRGB);
+    //l1->SetBackColor (bgRGB);
+    l1->SetForeColor ((_HYColor) {
+        0,0,0
+    });
+
+
+    _HYFont         labelFont;
+    SetDefaultDialogFont (labelFont);
+
+    b1->SetFont (labelFont);
+    b2->SetFont (labelFont);
+
+    cn->StartDraw();
+    cn->SetDialogBG();
+    cn->EraseAll  ();
+    cn->SetColor  ((_HYColor) {
+        0,0,0
+    });
+
+#ifdef __WINDOZE__
+    labelFont.face  = "Verdana";
+    labelFont.size  = 12;
+#else
+#ifdef __MAC__
+    labelFont.face = "Geneva";
+    labelFont.size = 10;
+#else
+    labelFont.face = _HY_SANS_FONT;
+    labelFont.size = 12;
+#endif
+#endif
+
+    labelFont.style = HY_FONT_BOLD;
+    canvasSettings.width  = 1;
+    canvasSettings.top = canvasSettings.bottom = canvasSettings.left = 0;
+    canvasSettings.right  = 300;
+    cn->DrawLine (canvasSettings);
+    cn->SetFont (labelFont);
+    canvasSettings.left = 5;
+    canvasSettings.top  = 15;
+    canvasSettings.bottom = 148;
+    canvasSettings.right  = 293;
+    cn->DrawInfoBox (canvasSettings,"Item Description");
+    labelFont.style = HY_FONT_PLAIN;
+    cn->SetFont (labelFont);
+    cn->EndDraw();
+    l1->SetFont       (labelFont);
+    b1->SetAlignFlags (HY_ALIGN_RIGHT);
+    _String labelText;
+    if (reqSel) {
+        labelText = reqSel;
+    } else {
+        labelText = ">0";
+    }
+    labelText = labelText &" required (0 chosen).";
+
+    l1->SetText (labelText);
+
+    b1->SetText       ("  OK  ");
+    b1->SetButtonKind (HY_BUTTON_OK);
+    b2->SetText       (" Cancel ");
+    b2->SetButtonKind (HY_BUTTON_CANCEL);
+    b1->EnableButton  (false);
+
+    DeleteObject (b1);
+    DeleteObject (b2);
+    DeleteObject (l1);
+    DeleteObject (hl);
+    DeleteObject (cn);
+
+    _HYRect     dim  = MinMaxWindowDimensions(),
+                sDim = GetScreenDimensions();
+
+
+    if (dim.bottom>sDim.bottom-sDim.top-90) {
+        dim.bottom = sDim.bottom-sDim.top-90;
+    }
+
+    if (dim.right>sDim.right-sDim.left-20) {
+        dim.right=sDim.right-sDim.left-20;
+    }
+
+    SetWindowRectangle  (0,0,dim.bottom,dim.right);
+    CenterWindow        (this);
+    *result = -1;
+
+}
+
+
+//__________________________________________________________________
+bool    _HYSimpleListSelectDialog::ProcessEvent  (_HYEvent* e)
+{
+    bool        done = false;
+    _String     firstArg;
+    long        i,f,k;
+
+    if (e->EventClass()==_hyButtonPushEvent) {
+        firstArg = e->EventCode().Cut (0,(f=e->EventCode().Find(','))-1);
+        k = firstArg.toNum();
+        for (i=0; i<components.lLength; i++)
+            if (((_HYGuiObject*)components(i))->MatchID(k)) {
+                break;
+            }
+
+        if (i==2) { // OK
+            _HYHList * theList = (_HYHList*)components  (0);
+
+            selections->Clear();
+            theList->GetSelection (*selections);
+            //for (k=0; k<selections->lLength; k++)
+            //  selections->lData[k] = validChoices->lData[selections->lData[k]];
+
+            if (reqSel == 1) {
+                *result = selections->lData[0];
+                StoreDialogSelection (&GetTitle(),(_String*)theList->GetCellData (0,*result));
+            } else {
+                *result = selections->lLength;
+            }
+
+
+            postWindowCloseEvent (GetID());
+        } else if (i==3) { // Cancel
+            postWindowCloseEvent (GetID());
+        }
+
+        done = true;
+    } else if (e->EventClass()==_hyTableChangeSelEvent) {
+        k = e->EventCode().toNum();
+        for (i=0; i<components.lLength; i++) {
+            if (((_HYGuiObject*)components(i))->MatchID(k)) {
+                break;
+            }
+        }
+        if (i==0) {
+            _HYTable * theList = (_HYHList*)components  (0);
+            _HYCanvas* cn      = (_HYCanvas*)components (1);
+            _HYButton* b1      = (_HYButton*)components (2);
+            _HYLabel * l1      = (_HYLabel*)components (4);
+
+            selections->Clear();
+            theList->GetSelection (*selections);
+
+            _String thisItem = l1->GetText ();
+
+            thisItem = thisItem.Cut (0, thisItem.Find ('(')) & _String ((long)selections->lLength) & " chosen).";
+            l1->SetText (thisItem);
+
+            cn->StartDraw();
+            if (selections->lLength!=1) {
+                if (selections->lLength>1) {
+                    _String multipleItems (128L, true);
+                    for (k=0; (k<selections->lLength)&&(k<8); k++) {
+                        thisItem = *(_String*)dData(selections->lData[k]);
+                        if (thisItem.sLength>45) {
+                            thisItem = thisItem.Cut (0,44) & "...";
+                        }
+                        thisItem = thisItem.Replace ("\r"," ",true);
+                        thisItem = thisItem.Replace ("\n"," ",true);
+                        multipleItems << thisItem;
+#ifdef __MAC__
+                        multipleItems << '\r';
+#else
+#ifdef __WINDOZE__
+                        multipleItems << "\n\r";
+#else
+                        multipleItems << '\n';
+#endif
+#endif
+                    }
+                    if (selections->lLength>8) {
+                        multipleItems << "...";
+                    }
+
+                    multipleItems.Finalize();
+                    if (!multipleItems.Equal(&lastString)) {
+                        cn->EraseRect(hierListTextBoxBounds);
+                        //cn->CrossfadeText (lastString,multipleItems,hierListTextBoxBounds,8,30,HY_ALIGN_LEFT,2);
+                        cn->DisplayText (multipleItems,hierListTextBoxBounds,HY_ALIGN_LEFT);
+                        lastString = multipleItems;
+                    }
+                } else {
+                    cn->EraseRect(hierListTextBoxBounds);
+                    lastString = empty;
+                }
+
+            } else {
+                _String * thisString = (_String*)dData(selections->lData[0]);
+                //cn->CrossfadeText (lastString,*thisString,hierListTextBoxBounds,6,30,HY_ALIGN_LEFT,2);
+                cn->DisplayText (*thisString,hierListTextBoxBounds,HY_ALIGN_LEFT);
+                lastString = *thisString;
+            }
+            if ((selections->lLength == reqSel)||((reqSel==0)&&(selections->lLength))) {
+                b1->EnableButton (true);
+            } else {
+                b1->EnableButton (false);
+            }
+
+            cn->EndDraw();
+            cn->_MarkForUpdate();
+            done = true;
+        }
+    } else if (e->EventClass()==_hyTableDblClickEvent) {
+        k = e->EventCode().toNum();
+        for (i=0; i<components.lLength; i++) {
+            if (((_HYGuiObject*)components(i))->MatchID(k)) {
+                break;
+            }
+        }
+        if (i==0) {
+            _HYButton* b1      = (_HYButton*)components (2);
+            if (b1->isEnabled) {
+                ProcessEvent (generateButtonPushEvent (b1->GetID(),1));
+            }
+            done = true;
+        }
+    }
+
+    if (done) {
+        DeleteObject (e);
+        return true;
+    }
+    return _HYTWindow::ProcessEvent(e);
+}
+
+//____________________________________________________________________________________________
+
+void        _HYSimpleListSelectDialog::SetInitialSelection (void)
+{
+    long     index = 0;
+    _HYTable * theList = (_HYHList*)components  (0);
+    _String* sel   = RetrieveCachedSelection (&GetTitle());
+    if (sel) {
+        index = theList->FindString (sel);
+        if (index<0) {
+            index = 0;
+        }
+    }
+    _SimpleList  ns         (index);
+    theList->ClearSelection (false);
+    theList->SetSelection   (ns,true);
+    theList->_MarkCellsForUpdate (ns);
+    theList->ScrollToRow         (index);
+    ProcessEvent (generateKeyboardFocusEvent (theList->GetID()));
+}
+
+//__________________________________________________________________
+_HYPreferencesDialog::_HYPreferencesDialog   (_List& thePreferences, _String n, bool, bool* r):_HYTWindow (n,false,true)
+{
+    _List               hData,
+                        rData,
+                        iData,
+                        diData;
+
+    _SimpleList*        preferencesCodes;
+
+    _List               *cellNames,
+                        *cellDescriptions,
+                        *cellValues;
+
+    prefList         =  &thePreferences;
+    result           =  r;
+
+
+    preferencesCodes = (_SimpleList*) thePreferences (0);
+    cellNames        = (_List*)       thePreferences (1);
+    cellDescriptions = (_List*)       thePreferences (2);
+    cellValues       = (_List*)       thePreferences (4);
+
+    long            counter;
+
+    for (counter = 0; counter< preferencesCodes->lLength; counter++) {
+        if (preferencesCodes->lData[counter]) {
+            if (rData.lLength) {
+                rData && & iData;
+                hData && & rData;
+                dData && & diData;
+            }
+            rData.Clear();
+            iData.Clear();
+            diData.Clear();
+            diData << (*cellDescriptions) (counter);
+            rData  << (*cellNames) (counter);
+        } else {
+            iData  << (*cellNames) (counter);
+            diData << (*cellDescriptions) (counter);
+        }
+
+        backupValues && (*cellValues) (counter);
+    }
+
+    rData && & iData;
+    hData && & rData;
+    dData && & diData;
+
+    _HYRect         canvasSettings = {250,225,250,225,HY_COMPONENT_V_SCROLL|HY_COMPONENT_TRANSP_BG};
+
+    _HYHList*       hl      = new _HYHList (canvasSettings, GetOSWindowData(),hData);
+
+    hl->selectionType |= HY_TABLE_SINGLE_SELECTION|HY_TABLE_FOCUSABLE;
+
+    canvasSettings.top    = canvasSettings.bottom = 150;
+    canvasSettings.left   = canvasSettings.right = 175;
+
+    canvasSettings.width  = HY_COMPONENT_NO_SCROLL|HY_COMPONENT_TRANSP_BG;
+    _HYCanvas*      cn    = new _HYCanvas (canvasSettings,GetOSWindowData(),150,175,32);
+
+    canvasSettings.bottom = canvasSettings.top   = 40;
+    canvasSettings.left   = canvasSettings.right = 95;
+
+    _HYButton*      b1      = new _HYButton (canvasSettings, GetOSWindowData());
+    canvasSettings.left   = canvasSettings.right = 80;
+    _HYButton*      b2      = new _HYButton (canvasSettings, GetOSWindowData());
+
+    canvasSettings.left   = canvasSettings.right  = 175;
+    canvasSettings.top    = canvasSettings.bottom = 47;
+
+    _HYTextBox*     tb    = new _HYTextBox  (canvasSettings, GetOSWindowData());
+    _HYPullDown*    pd    = new _HYPullDown (canvasSettings, GetOSWindowData());
+    _HYLabel*       l3    = new _HYLabel    (canvasSettings, GetOSWindowData());
+
+    canvasSettings.top    = canvasSettings.bottom = 20;
+
+    _HYLabel*       l6    = new _HYLabel    (canvasSettings, GetOSWindowData());
+
+    canvasSettings.left  = canvasSettings.right  = 225;
+    canvasSettings.top   = canvasSettings.bottom = 10;
+    canvasSettings.width = HY_COMPONENT_BORDER_B|HY_COMPONENT_TRANSP_BG;
+
+    _HYLabel*       l1      = new _HYLabel  (canvasSettings, GetOSWindowData());
+    canvasSettings.width = HY_COMPONENT_BORDER_T|HY_COMPONENT_TRANSP_BG;
+    _HYLabel*       l2      = new _HYLabel  (canvasSettings, GetOSWindowData());
+
+    canvasSettings.left  = canvasSettings.right  = 175;
+    canvasSettings.top   = canvasSettings.bottom = 10;
+    canvasSettings.width = HY_COMPONENT_NO_SCROLL|HY_COMPONENT_TRANSP_BG;
+
+    _HYLabel*       l4      = new _HYLabel  (canvasSettings, GetOSWindowData());
+    _HYLabel*       l5      = new _HYLabel  (canvasSettings, GetOSWindowData());
+
+
+    hl->SetMessageRecipient (this);
+    b1->SetMessageRecipient (this);
+    b2->SetMessageRecipient (this);
+    tb->SetMessageRecipient (this);
+    pd->SetMessageRecipient (this);
+
+    AddObject (hl);// 0
+    AddObject (cn);// 1
+    AddObject (b1);// 2
+    AddObject (b2);// 3
+    AddObject (l1);// 4
+    AddObject (l2);// 5
+    AddObject (l3);// 6
+    AddObject (l4);// 7
+    AddObject (l5);// 8
+    AddObject (l6);// 9
+    AddObject (tb);// 10
+    AddObject (pd);// 11
+
+    SetTableDimensions (6,3);
+    SetCell   (0,0,l1);
+    SetCell   (0,1,l4);
+    SetCell   (0,2,l4);
+
+    SetCell   (1,0,hl);
+    SetCell   (1,1,cn);
+    SetCell   (1,2,cn);
+
+    SetCell   (2,0,hl);
+    SetCell   (2,1,l6);
+    SetCell   (2,2,l6);
+
+    SetCell   (3,0,hl);
+    SetCell   (3,1,l3);
+    SetCell   (3,2,l3);
+
+    SetCell   (4,0,hl);
+    SetCell   (4,1,b1);
+    SetCell   (4,2,b2);
+
+    SetCell   (5,0,l2);
+    SetCell   (5,1,l5);
+    SetCell   (5,2,l5);
+
+    /*b1->SetBackColor (bgRGB);
+    b2->SetBackColor (bgRGB);
+    l1->SetBackColor (bgRGB);
+    l2->SetBackColor (bgRGB);
+    l3->SetBackColor (bgRGB);
+    l4->SetBackColor (bgRGB);
+    l5->SetBackColor (bgRGB);
+    l6->SetBackColor (bgRGB);
+    tb->SetBackColor (bgRGB);
+    pd->SetBackColor (bgRGB);*/
+
+
+    _HYFont         labelFont;
+    SetDefaultDialogFont (labelFont);
+
+    b1->SetFont (labelFont);
+    b2->SetFont (labelFont);
+
+#ifdef __MAC__
+    labelFont.face = "Geneva";
+    labelFont.size = 10;
+#endif
+
+    labelFont.style = HY_FONT_PLAIN;
+    tb->SetFont (labelFont);
+
+    labelFont.style = HY_FONT_BOLD;
+
+    l6->SetFont (labelFont);
+    l6->SetAlignFlags (HY_ALIGN_LEFT);
+    pd->SetAlignFlags (HY_ALIGN_LEFT);
+
+    cn->StartDraw ();
+    //cn->SetBColor (bgRGB);
+    cn->SetDialogBG();
+    cn->EraseAll  ();
+    cn->SetColor  ((_HYColor) {
+        0,0,0
+    });
+
+    canvasSettings.width  = 1;
+    cn->SetFont (labelFont);
+    canvasSettings.left   = 5;
+    canvasSettings.top    = 5;
+    canvasSettings.bottom = 148;
+    canvasSettings.right  = 167;
+    cn->DrawInfoBox (canvasSettings,"Item Description");
+    labelFont.style = HY_FONT_PLAIN;
+    cn->SetFont (labelFont);
+    cn->EndDraw();
+
+    b1->SetAlignFlags (HY_ALIGN_RIGHT);
+
+    b1->SetText       ("  OK  ");
+    b1->SetButtonKind (HY_BUTTON_OK);
+    b2->SetText       (" Cancel ");
+    b2->SetButtonKind (HY_BUTTON_CANCEL);
+
+
+
+    _HYRect     dim = MinMaxWindowDimensions();
+
+    SetWindowRectangle  (0,0,dim.bottom,dim.right);
+    CenterWindow        (this);
+
+    tb->SetVisibleSize (l3->rel);
+    pd->SetVisibleSize (l3->rel);
+    componentL.lData[10] = componentL.lData[6];
+    componentL.lData[11] = componentL.lData[6];
+    componentR.lData[10] = componentR.lData[6];
+    componentR.lData[11] = componentR.lData[6];
+    componentT.lData[10] = componentT.lData[6];
+    componentT.lData[11] = componentT.lData[6];
+    componentB.lData[10] = componentB.lData[6];
+    componentB.lData[11] = componentB.lData[6];
+
+    keyboardFocusChain << 0;
+    ProcessEvent (generateKeyboardFocusEvent (hl->GetID()));
+
+#ifndef __MAC__
+    _HYRect dummy = {30000,30000,30100,30100,0};
+    pd->SetVisibleSize(dummy);
+    tb->SetVisibleSize(dummy);
+    tb->SetText (" ");
+#endif
+
+    DeleteObject (b1);
+    DeleteObject (b2);
+    DeleteObject (l1);
+    DeleteObject (hl);
+    DeleteObject (cn);
+    DeleteObject (l2);
+    DeleteObject (l3);
+    DeleteObject (l4);
+    DeleteObject (l5);
+    DeleteObject (l6);
+    DeleteObject (tb);
+    DeleteObject (pd);
+
+}
+
+//____________________________________________________________________________________________
+
+void        _HYPreferencesDialog::SetInitialSelection (void)
+{
+    long       index = 0;
+    _HYHList * theList = (_HYHList*)components  (0);
+    _String* sel   = RetrieveCachedSelection (&GetTitle());
+
+    if (sel) {
+        index = theList->FindString (sel);
+        if (index<0) {
+            index = 0;
+        } else {
+            long rubrikIndex = (index >> 16);
+            theList->ModifySelection (0,rubrikIndex,false,false,false);
+            index = rubrikIndex + (index&0xffff) + 1;
+        }
+    }
+
+    _SimpleList  ns (2*index+1);
+    theList->ClearSelection      (false);
+    theList->SetSelection        (ns,true);
+    theList->_MarkCellsForUpdate (ns);
+    theList->ScrollToRow         (index);
+    ProcessEvent (generateKeyboardFocusEvent (theList->GetID()));
+}
+
+
+//__________________________________________________________________
+bool    _HYPreferencesDialog::ProcessEvent   (_HYEvent* e)
+{
+    bool        done = false;
+    _String     firstArg;
+    long        i,f,g,k;
+
+    _HYHList * theList = (_HYHList*)components  (0);
+    _HYCanvas* cn      = (_HYCanvas*)components (1);
+
+    _SimpleList s;
+    theList->GetSelection (s);
+
+    _List       *values = (_List*)          (*prefList)(4);
+    _SimpleList *iTypes = (_SimpleList*)    (*prefList)(3);
+    _List       *choices = (_List*)         (*prefList)(5);
+
+    if (e->EventClass()==_hyButtonPushEvent) {
+        firstArg = e->EventCode().Cut (0,(f=e->EventCode().Find(','))-1);
+        k = firstArg.toNum();
+        for (i=0; i<components.lLength; i++)
+            if (((_HYGuiObject*)components(i))->MatchID(k)) {
+                break;
+            }
+
+        _SimpleList s;
+        theList->GetSelection(s);
+        if (s.lLength==1) {
+            StoreDialogSelection (&GetTitle(),(_String*)theList->GetCellData (s.lData[0]%2,s.lData[0]/2));
+        }
+
+        if (i==2) { // OK
+            if (s.lLength == 1) {
+                k = theList->RubrikIndex (s.lData[0]/2);
+                f = k>>16;
+                g = k&0xffff;
+                k = 0;
+                for (f=f-1; f>=0; f--) {
+                    k+=((_List*)dData(f))->lLength;
+                }
+            }
+            *result = true;
+            postWindowCloseEvent (GetID());
+        } else if (i==3) { // Cancel
+            *result = false;
+            for (k=0; k<backupValues.lLength; k++) {
+                values->Duplicate (&backupValues);
+            }
+
+            if (setFont) {
+                SetPreferences();
+            }
+            postWindowCloseEvent (GetID());
+        }
+
+        done = true;
+    } else if (e->EventClass()==_hyTableChangeSelEvent) {
+        k = e->EventCode().toNum();
+        for (i=0; i<components.lLength; i++) {
+            if (((_HYGuiObject*)components(i))->MatchID(k)) {
+                break;
+            }
+        }
+        if (i==0) {
+            cn->StartDraw();
+            if (s.lLength!=1) {
+                _HYLabel *l3 = (_HYLabel*)GetObject(6);
+                cn->EraseRect(hierListTextBoxBounds2);
+                if (GetCellObject (3,2)!=l3) {
+#ifndef __MAC__
+                    _HYRect dummy = {30000,30000,30100,30100,0},
+                            srel  = ((_HYComponent*)GetCellObject (3,2))->rel;
+                    l3->SetVisibleSize(srel);
+                    ((_HYComponent*)GetCellObject (3,2))->SetVisibleSize (dummy);
+#endif
+                    SetCell (3,1,l3);
+                    SetCell (3,2,l3);
+                }
+            } else {
+                k = theList->RubrikIndex (s.lData[0]/2);
+                f = k>>16;
+                g = k&0xffff;
+                _String * thisString = (_String*)(*(_List*)(dData(f)))(g);
+
+                _HYLabel * vlabel = (_HYLabel*)GetObject (9);
+
+                if (g) {
+                    vlabel->SetText ("  Value:");
+                    k = theList->AbsoluteIndex (f,g);
+
+                    if (iTypes->lData[k] == PREFITEM_TEXTBOX) {
+                        _HYTextBox* tb = (_HYTextBox*)GetObject(10);
+                        if (GetCellObject (3,2)!=tb) {
+#ifndef __MAC__
+                            _HYRect dummy = {30000,30000,30100,30100,0},
+                                    srel  = ((_HYComponent*)GetCellObject (3,2))->rel;
+                            tb->SetVisibleSize(srel);
+                            ((_HYComponent*)GetCellObject (3,2))->SetVisibleSize (dummy);
+#endif
+                            SetCell (3,1,tb);
+                            SetCell (3,2,tb);
+                        }
+                        tb->EnableTextEdit(true);
+                        tb->SetText (*(_String*)(*values)(k),true);
+                        tb->SetSelection (0,30000);
+                        tb->Activate();
+                        keyboardFocusChain << 10;
+                    } else {
+                        _HYPullDown* pd = (_HYPullDown*)GetObject(11);
+                        if (GetCellObject (3,2)!=pd) {
+#ifndef __MAC__
+                            _HYRect dummy = {30000,30000,30100,30100,0},
+                                    srel  = ((_HYComponent*)GetCellObject (3,2))->rel;
+                            pd->SetVisibleSize(srel);
+                            ((_HYComponent*)GetCellObject (3,2))->SetVisibleSize (dummy);
+#endif
+                            SetCell (3,1,pd);
+                            SetCell (3,2,pd);
+                        }
+                        pd->DeleteAllItems();
+                        _List * iC = (_List*)(*choices)(k);
+
+                        for (f = 0; f<iC->lLength; f++) {
+                            pd->AddMenuItem (*((_String*)(*iC)(f)),-1);
+                        }
+
+                        _String * cV = (_String*)(*values)(k);
+
+                        f = pd->FindMenuItem (*cV);
+                        pd->SetVisibleSize  (pd->rel);
+                        pd->ChangeSelection (f,false);
+                        pd->Activate();
+                        keyboardFocusChain.Delete (1);
+                    }
+                } else {
+                    vlabel->SetText (empty);
+                    _HYLabel* l3 = (_HYLabel*)GetObject(6);
+                    if (GetCellObject (3,2)!=l3) {
+#ifndef __MAC__
+                        _HYRect dummy = {30000,30000,30100,30100,0},
+                                srel  = ((_HYComponent*)GetCellObject (3,2))->rel;
+                        l3->SetVisibleSize(srel);
+                        ((_HYComponent*)GetCellObject (3,2))->SetVisibleSize (dummy);
+#endif
+                        SetCell (3,1,l3);
+                        SetCell (3,2,l3);
+                        l3->_MarkForUpdate();
+                        keyboardFocusChain.Delete (1);
+                    }
+                }
+
+
+                cn->EraseRect (hierListTextBoxBounds2);
+                cn->DisplayText (*thisString,hierListTextBoxBounds2,HY_ALIGN_LEFT);
+            }
+            cn->EndDraw();
+            cn->_MarkForUpdate();
+            done = true;
+        }
+    } else if (e->EventClass()==_hyTableDblClickEvent) {
+        k = e->EventCode().toNum();
+        for (i=0; i<components.lLength; i++) {
+            if (((_HYGuiObject*)components(i))->MatchID(k)) {
+                break;
+            }
+        }
+        if (i==0) {
+            k = theList->RubrikIndex (s.lData[0]/2);
+            f = k>>16;
+            g = k&0xffff;
+            theList->HandleKeyMove (theList->IsRubrikOpen(f)?2:3,false);
+            done = true;
+        }
+    } else if (e->EventClass()==_hyMenuSelChangeEvent) {
+        f = e->EventCode().Find(',');
+        firstArg = e->EventCode().Cut(0,f-1);
+        i = MatchComponentID (firstArg);
+        if (i==11) {
+            f = e->EventCode().Cut(f+1,-1).toNum();
+            k = theList->RubrikIndex (s.lData[0]/2);
+            g = k&0xffff;
+            i = k>>16;
+            k = theList->AbsoluteIndex (i,g);
+            _List * iChoices = (_List*)(*choices)(k);
+            values->Replace (k, (_String*)(*iChoices)(f),true);
+            if ((i==0)&&setFont) {
+                SetPreferences();
+            }
+        }
+    } else if (e->EventClass()==_hyTextEditChange ) {
+        f = e->EventCode().Find(',');
+        firstArg = e->EventCode().Cut(0,f-1);
+        i = MatchComponentID (firstArg);
+        if (i==10) {
+            k = theList->RubrikIndex (s.lData[0]/2);
+            g = k&0xffff;
+            k = k>>16;
+            k = theList->AbsoluteIndex (k,g);
+            _String * tbs;
+            ((_HYTextBox*)GetObject(10))->StoreText (tbs);
+            values->Replace (k,tbs,false);
+        }
+    }
+
+    if (done) {
+        DeleteObject (e);
+        return true;
+    }
+    return _HYTWindow::ProcessEvent(e);
+}
+
+//____________________________________________________________________________________________
+
+long  HandleHierListSelection (_List& data, _SimpleList& choices, _SimpleList& validChoices, _String titleInfo, _SimpleList& selections, long )
+{
+    long res = 0;
+    _HYListSelectDialog* sd = new _HYListSelectDialog
+    (&data, &choices, &validChoices,titleInfo ,&selections,&res);
+    sd->SetInitialSelection ();
+    sd->BringToFront();
+    while (windowObjectRefs.Find ((long)sd)>=0) {
+        handleGUI();
+    }
+    return res;
+}
+
+
+//____________________________________________________________________________________________
+long  HandleListSelection (_List& data, _SimpleList& choices, _SimpleList& validChoices, _String titleInfo, _SimpleList& selections, long fixedLength, Ptr prt)
+{
+    long res = -1;
+    if (data.lLength < 1 || validChoices.lLength < 1) {
+        _String errMsg ("An empty list of choices was passed to 'HandleListSelection'");
+        ProblemReport (errMsg);
+    } else {
+        _HYSimpleListSelectDialog* sd = new _HYSimpleListSelectDialog
+        (&data, &choices, &validChoices,titleInfo ,&selections,fixedLength,&res, prt);
+        sd->SetInitialSelection ();
+        sd->BringToFront();
+        while (windowObjectRefs.Find ((long)sd)>=0) {
+            handleGUI();
+        }
+    }
+    return res;
+}
+
+//____________________________________________________________________________________________
+long  HandleListSelection (_List& data, _String titleInfo, Ptr prt)
+{
+    _SimpleList validChoices,
+                choices,
+                sels;
+
+    _List       menuData;
+
+    validChoices << 0;
+    validChoices << 1;
+
+    for (long k=0; k<data.lLength; k+=2) {
+        _List aChoice;
+
+        aChoice << data (k);
+        aChoice << data (k+1);
+
+        menuData && & aChoice;
+
+        choices << choices.lLength;
+    }
+
+    return  HandleListSelection (menuData, validChoices, choices, titleInfo, sels, 1, prt);
+}
+
+
+//____________________________________________________________________________________________
+
+bool        EnterStringDialog (_String& res, _String& prompt, Ptr parent, _hyStringValidatorType validator)
+{
+    bool resB = false;
+    _HYTextDialog* sd = new _HYTextDialog (&res,prompt,&resB, parent, validator);
+    sd->BringToFront();
+    while (windowObjectRefs.Find ((long)sd)>=0) {
+        handleGUI();
+    }
+    return resB;
+}
+
+//____________________________________________________________________________________________
+
+bool        EnterString2Dialog (_String& res, _String& res2, _String& prompt, _String& prompt2, Ptr parent)
+{
+    bool resB = false;
+    _HYTextDialog2* sd = new _HYTextDialog2 (&res,&res2,prompt,prompt2,&resB, parent);
+    sd->BringToFront();
+    while (windowObjectRefs.Find ((long)sd)>=0) {
+        handleGUI();
+    }
+    return resB;
+}
+
+//____________________________________________________________________________________________
+
+bool        EnterStringDialogWithCheckbox (_String& res, _String& prompt, _String& cprompt, bool& resC, Ptr parent)
+{
+    bool resB = false;
+    _HYTextDialogWithCheckbox* sd = new _HYTextDialogWithCheckbox (&res,prompt,cprompt,&resB,&resC, parent);
+    sd->BringToFront();
+    while (windowObjectRefs.Find ((long)sd)>=0) {
+        handleGUI();
+    }
+    return resB;
+}
+
+//____________________________________________________________________________________________
+
+bool        EnterStringDialogWithPulldown (_String& res, _String& prompt, _String& cprompt, long& msel, _List& pulldown, _List * actions, bool& resC, long initChoice, Ptr parent)
+{
+    bool resB = false;
+    _HYTextDialogWithPulldown* sd = new _HYTextDialogWithPulldown (&res,prompt,cprompt, pulldown, actions, &resB,&resC,&msel,initChoice,parent);
+    sd->BringToFront();
+    while (windowObjectRefs.Find ((long)sd)>=0) {
+        handleGUI();
+    }
+    return resB;
+}
+
+
+//____________________________________________________________________________________________
+bool  HandlePreferences (_List& data, _String title, bool doFonts)
+{
+    bool res = false;
+    _HYPreferencesDialog* sd = new _HYPreferencesDialog (data, title, doFonts, &res);
+    sd->SetInitialSelection ();
+    sd->BringToFront();
+    while (windowObjectRefs.Find ((long)sd)>=0) {
+        handleGUI();
+    }
+    return res;
+}
+
+//____________________________________________________________________________________________
+bool  ProceedPrompt (_String& pr, Ptr par)
+{
+    bool res = false;
+
+    _String b1 (" OK "),
+            b2 (" Cancel ");
+
+    _HYFont def;
+    SetDefaultDialogFont (def);
+
+    _HYProceedPromptBox * sd = new _HYProceedPromptBox (pr,b1,b2,def,133,&res,par);
+    sd->BringToFront();
+    while (windowObjectRefs.Find ((long)sd)>=0) {
+        handleGUI();
+    }
+    return res;
+}
+
+//____________________________________________________________________________________________
+void  ProblemReport (_String& pr, Ptr par)
+{
+    bool res = false;
+
+    _String b1,
+            b2;
+
+    if (wiseCrackButtons.lLength == 0) {
+        b1 = " Oh Well ";
+        wiseCrackButtons && & b1;
+        b1 = " Too bad ";
+        wiseCrackButtons && & b1;
+        b1 = " C'est la Vie ";
+        wiseCrackButtons && & b1;
+        b1 = " Argh! ";
+        wiseCrackButtons && & b1;
+        b1 = " Begone! ";
+        wiseCrackButtons && & b1;
+        b1 = " As if I had a choice! ";
+        wiseCrackButtons && & b1;
+        b1 = " Really? ";
+        wiseCrackButtons && & b1;
+        b1 = " Not again! ";
+        wiseCrackButtons && & b1;
+        b1 = " Why, oh why? ";
+        wiseCrackButtons && & b1;
+        b1 = " Blast! ";
+        wiseCrackButtons && & b1;
+        b1 = " Rats! ";
+        wiseCrackButtons && & b1;
+        b1 = " Blimey! ";
+        wiseCrackButtons && & b1;
+        b1 = " This is the end... ";
+        wiseCrackButtons && & b1;
+        b1 = " Whatever, dude ";
+        wiseCrackButtons && & b1;
+        b1 = " What have I done to deserve this? ";
+        wiseCrackButtons && & b1;
+        b1 = " Hasta la vista! ";
+        wiseCrackButtons && & b1;
+        b1 = " Famous last words ";
+        wiseCrackButtons && & b1;
+    }
+
+    _Constant       messageListLength (wiseCrackButtons.lLength);
+    _PMathObj       rn = _Constant (0.0).Random (&messageListLength);
+    b1 = *(_String*)wiseCrackButtons (rn->Value());
+    DeleteObject (rn);
+
+    _HYFont def;
+    SetDefaultDialogFont (def);
+
+    _HYProceedPromptBox * sd = new _HYProceedPromptBox (pr,b1,b2,def,130,&res,par);
+    sd->BringToFront();
+    while (windowObjectRefs.Find ((long)sd)>=0) {
+        handleGUI();
+    }
+}
+
+//____________________________________________________________________________________________
+bool  ProceedPromptWithCheck (_String& pr, _String& cpr, bool& cs, Ptr par)
+{
+    bool res = false;
+
+    _String b1 (" OK "),
+            b2 (" Cancel ");
+
+    _HYFont def;
+    SetDefaultDialogFont (def);
+
+    _HYProceedPromptBoxWCheck * sd = new _HYProceedPromptBoxWCheck (pr,b1,b2,cpr,def,133,&res,&cs,par);
+    sd->BringToFront();
+    while (windowObjectRefs.Find ((long)sd)>=0) {
+        handleGUI();
+    }
+    return res;
+}
+
+//__________________________________________________________________
+_String*        RetrieveCachedSelection (_String* title)
+{
+    long        f = cachedDialogTitles.BinaryFind (title);
+
+    if (f>=0) {
+        _String * sel = (_String*)cachedDialogSelections(f);
+        if (sel->sLength) {
+            return sel;
+        }
+    }
+    return nil;
+}
+
+//__________________________________________________________________
+void            StoreDialogSelection    (_String* title,_String* selection)
+{
+    long        f = cachedDialogTitles.BinaryFind (title);
+
+    if (f<0) {
+        f = cachedDialogTitles.BinaryInsert (title);
+        cachedDialogSelections.InsertElement (selection,f,true);
+    } else {
+        cachedDialogSelections.Replace (f,selection,true);
+    }
+}
+
+
+//____________________________________________________________________________________________
+
+_String  NewTreeWindow (long sourceDF)
+{
+    // set up default preferences
+    _List   theList,dsNames;
+    _String optionList ("No dataset"), comma(",");
+    long    k;
+
+    AddItemToPreferences (1|8,-1,"Tree Identifier","Choose an identifier for the new tree variable.","",nil,theList,false);
+    AddItemToPreferences (0,PREFITEM_TEXTBOX,"Identifier","This must be a valid unique HYPHY identifier (begins with a letter or an underscore, containes letters, numbers or underscores).","New_Tree",nil, theList,false);
+    AddItemToPreferences (1|8,-1,"Tips and Labels","Specifies whether the new tree will be created based on the sequences of an existing data set, or simply with a given number of tips. Also selects the style for the new tree.","",nil,theList,false);
+    AddItemToPreferences (0,PREFITEM_TEXTBOX,"Number of Tips","Use this option to create a tree with a desired number of tips, without linking to an existing data file.","10",nil,theList,false);
+    if (sourceDF<0) {
+        dsNames && &optionList;
+        for (k=0; k<dataSetNamesList.lLength; k++) {
+            dsNames<<dataSetNamesList(k);
+        }
+    } else {
+        dsNames<<dataSetFilterNamesList(sourceDF);
+    }
+    AddItemToPreferences (0,PREFITEM_POPUP,"Source Dataset","Select a dataset from the list (you need to open a data set for it to appear in the list).\"No dataset\" indicates that a tree should with a given number of tips will be created.","No dataset",&dsNames,theList,false);
+    AddItemToPreferences (1|8,-1,"Tree Options","Selects starting topology for the new tree, and (optionally) defines assigned branch lengths","",nil,theList,false);
+    optionList = "Star,Ladder Left,Ladder Right,Balanced";
+    AddItemToPreferences (0,PREFITEM_POPUP,"Tree Style","Selects a topology for the new tree. It can be edited later.","Star",optionList.Tokenize (comma),theList,true);
+    AddItemToPreferences (0,PREFITEM_TEXTBOX,"Default Length","Assign default length to all branches (the value -1 is equivalent to no assigned branch lengths).","-1",nil,theList,false);
+    AddItemToPreferences (0,PREFITEM_TEXTBOX,"Newick String","Enter a Newick string here to define tree topology. If anything is entered in this field, all other options will be ignored","",nil,theList,false);
+    if (HandlePreferences (theList, "New Tree Setup", false)) {
+        _List   *treeSettings = (_List*)theList.lData[4],
+                 *settingsValues = (_List*)theList.lData[5];
+
+        _String *treeName = (_String*)treeSettings->lData[1],
+                 *setName = (_String*)treeSettings->lData[4],
+                  *newickString = (_String*)treeSettings->lData[8];
+
+        if (!treeName->IsValidIdentifier()) {
+            optionList = _String('"')& *treeName & "\" appears to be an invalid identifier. Please try again.";
+            ProblemReport (optionList);
+            return empty;
+        }
+        if (LocateVarByName (*treeName)>=0) {
+            optionList = _String('"')& *treeName & "\" already exists. Kill and replace?";
+            if (!ProceedPrompt (optionList)) {
+                return empty;
+            }
+            DeleteVariable (*treeName,true);
+        }
+        long    tipCount = ((_String*)treeSettings->lData[3])->toNum();
+        dsNames.Clear();
+        k = ((_List*)(*settingsValues)(4))->Find(setName);
+        if ((k>=1)||(sourceDF>=0)) { // use data set
+            if (sourceDF<0) {
+                dsNames.Duplicate (&((_DataSet*)dataSetList(k-1))->GetNames());
+            } else {
+                _DataSetFilter* sDF = (_DataSetFilter*)dataSetFilterList(sourceDF);
+                _DataSet*   sDS = sDF->GetData();
+                for (k=0; k<sDF->theNodeMap.lLength; k++) {
+                    dsNames<< (sDS->GetNames())(sDF->theNodeMap.lData[k]);
+                }
+            }
+        } else {
+            if (tipCount<=1) {
+                _String errMsg = _String("Sorry, but I can't create a tree with ")&tipCount&" tips for fairly obvious reasons.";
+                ProblemReport (errMsg);
+                return empty;
+            }
+
+            for (long f=1; f<=tipCount; f++) {
+                _String thisSpec ("Species_");
+                thisSpec = thisSpec & f;
+                dsNames&& &thisSpec;
+            }
+        }
+        tipCount = dsNames.lLength;
+        _String treeString ((unsigned long)32,true);
+        setName = (_String*)treeSettings->lData[6];
+        k = ((_List*)(*settingsValues)(6))->Find(setName);
+        setName = (_String*)treeSettings->lData[7];
+        _Parameter defL = setName->toNum();
+
+        if (newickString->sLength==0) {
+            if (k<=0) {
+                treeString<<'(';
+                for (k=0; k<tipCount; k++) {
+                    if (k) {
+                        treeString << ',';
+                    }
+                    treeString << (_String*)dsNames(k);
+                }
+                treeString<<')';
+            } else if (k==1) { // ladder left
+                treeString<<'(';
+                treeString << (_String*)dsNames(0);
+                treeString<<',';
+                treeString << (_String*)dsNames(1);
+                for (k=2; k<tipCount-1; k++) {
+                    treeString<<',';
+                    treeString<<'(';
+                    treeString << (_String*)dsNames(k);
+                }
+                if (tipCount>2) {
+                    treeString<<',';
+                    treeString << (_String*)dsNames(tipCount-1);
+                    for (k=2; k<tipCount-1; k++) {
+                        treeString<<')';
+                    }
+                }
+                treeString<<')';
+
+            } else if (k==2) { // ladder right
+                treeString<<'(';
+                if (tipCount>2) {
+                    for (k=2; k<tipCount-1; k++) {
+                        treeString<<'(';
+                    }
+                }
+                treeString << (_String*)dsNames(0);
+                treeString<<',';
+                treeString << (_String*)dsNames(1);
+                for (k=2; k<tipCount-1; k++) {
+                    treeString<<')';
+                    treeString<<',';
+                    treeString << (_String*)dsNames(k);
+                }
+                if (tipCount>2) {
+                    treeString<<',';
+                    treeString << (_String*)dsNames(k);
+                }
+                treeString<<')';
+            } else if (k==3) { // balanced
+                BuildBalancedTree (0,dsNames.lLength-1,treeString,dsNames);
+            }
+            treeString.Finalize();
+        } else {
+            treeString.Finalize();
+            treeString = *newickString;
+        }
+        if (treeString.sLength) {
+            _HYTreePanel * newTree = new _HYTreePanel (*treeName,treeString);
+            if (defL>-1.0) {
+                _TheTree* me = newTree->LocateMyTreeVariable();
+                _Constant newVal (defL);
+                if (me) {
+                    _CalcNode* travNode = me->DepthWiseTraversal(TRUE);
+                    while (!me->IsCurrentNodeTheRoot()) {
+                        travNode->SetValue (&newVal);
+                        travNode = me->DepthWiseTraversal();
+                    }
+                    newTree->UpdateScalingVariablesList();
+                }
+            }
+            newTree->BringToFront();
+            newTree->Show();
+        }
+        return *treeName;
+    }
+    return empty;
+}
+
+//____________________________________________________________________________________________
+
+void  BuildBalancedTree (long start, long end, _String& result, _List& tipNames)
+{
+    long rangeCount = end-start+1;
+    if (rangeCount==1) {
+        result<<(_String*)tipNames(start);
+    } else if (rangeCount==2) {
+        result<<'(';
+        result<<(_String*)tipNames(start);
+        result<<',';
+        result<<(_String*)tipNames(end);
+        result<<')';
+    } else {
+        result<<'(';
+        if (rangeCount%2) {
+            BuildBalancedTree (start,start+rangeCount/2,result,tipNames);
+            result<<',';
+            BuildBalancedTree (start+rangeCount/2+1,end,result,tipNames);
+        } else {
+            BuildBalancedTree (start,start+rangeCount/2-1,result,tipNames);
+            result<<',';
+            BuildBalancedTree (start+rangeCount/2,end,result,tipNames);
+        }
+        result<<')';
+    }
+}
+
+
+//__________________________________________________________________
+_HYCombDialog::_HYCombDialog     (_SimpleList* storage, bool* res, Ptr windowRf):_HYTWindow ("Define the comb",false,true, windowRf)
+{
+
+    combResult   = storage;
+    combResult->Clear();
+    result       = res;
+
+    if (combSelectionMemory.lLength==0) {
+        combSelectionMemory << 0;
+        combSelectionMemory << 0;
+        combSelectionMemory << 0;
+    }
+
+    _HYRect         canvasSettings = {30,80,30,80,HY_COMPONENT_TRANSP_BG};
+
+    _HYLabel*       l1 = new _HYLabel (canvasSettings, GetOSWindowData());
+    checkPointer    (l1);
+
+    canvasSettings.left   = canvasSettings.right  = 270;
+    _HYPullDown*    p1    = new _HYPullDown (canvasSettings, GetOSWindowData());
+    checkPointer    (p1);
+
+    long            k;
+
+    _HYCheckbox*    cb[10];
+
+    canvasSettings.left = canvasSettings.right = 35;
+    for (k=0; k<10; k++) {
+        cb[k] = new _HYCheckbox (canvasSettings, GetOSWindowData());
+        cb[k]->SetMessageRecipient (this);
+        checkPointer (cb[k]);
+        AddObject (cb[k]);
+    }
+
+    canvasSettings.bottom = canvasSettings.top   = 40;
+    canvasSettings.left   = canvasSettings.right = 260;
+
+    _HYButton*      b1      = new _HYButton (canvasSettings, GetOSWindowData());
+    canvasSettings.left   = canvasSettings.right = 90;
+    _HYButton*      b2      = new _HYButton (canvasSettings, GetOSWindowData());
+
+    checkPointer (b1);
+    checkPointer (b2);
+
+    p1->SetMessageRecipient (this);
+    b1->SetMessageRecipient (this);
+    b2->SetMessageRecipient (this);
+
+    AddObject (b1);// 10
+    AddObject (b2);// 11
+    AddObject (l1);// 12
+    AddObject (p1);// 13
+
+    SetTableDimensions (3,10);
+
+    for (k=0; k<10; k++) {
+        SetCell (1,k,cb[k]);
+    }
+
+    for (k=0; k<3; k++) {
+        SetCell (0,k,l1);
+    }
+    for (; k<10; k++) {
+        SetCell (0,k,p1);
+    }
+
+    for (k=0; k<8; k++) {
+        SetCell (2,k,b1);
+    }
+    for (; k<10; k++) {
+        SetCell (2,k,b2);
+    }
+
+    _HYFont         labelFont;
+    SetDefaultDialogFont (labelFont);
+
+    b1->SetFont (labelFont);
+    b2->SetFont (labelFont);
+    l1->SetFont (labelFont);
+
+    b1->SetText (" OK ");
+    b2->SetText (" Cancel ");
+
+    b1->SetAlignFlags (HY_ALIGN_RIGHT);
+    l1->SetAlignFlags (HY_ALIGN_LEFT);
+    p1->SetAlignFlags (HY_ALIGN_LEFT);
+    l1->SetText ("Comb Size:");
+
+    for (k=0; k<10; k++) {
+        cb[k]->SetFont (labelFont);
+        cb[k]->SetText (_String (k+1));
+        cb[k]->SetSpacing (1);
+    }
+
+    for (k=2; k<=10; k++) {
+        p1->AddMenuItem (_String (k), -1);
+    }
+
+    combResult->Duplicate (&combSelectionMemory);
+    p1->ChangeSelection (combSizeMemory-2, true);
+
+    for (k=combSelectionMemory.lLength; k<10; k++) {
+        cb[k]->Enable (false);
+    }
+
+    for (k=0; k<combSelectionMemory.lLength; k++) {
+        cb[k]->SetState (combSelectionMemory.lData[k]);
+    }
+
+    _HYRect     dim = MinMaxWindowDimensions();
+
+    b1->SetButtonKind (HY_BUTTON_OK);
+    b2->SetButtonKind (HY_BUTTON_CANCEL);
+    b1->EnableButton ((combResult->Find(0)>=0)&&(combResult->Find(1)>=0));
+
+    SetWindowRectangle  (0,0,dim.bottom,dim.right);
+    CenterWindow        (this);
+
+    DeleteObject (b1);
+    DeleteObject (b2);
+    DeleteObject (l1);
+    DeleteObject (p1);
+
+    for (k=0; k<10; k++) {
+        DeleteObject (cb[k]);
+    }
+
+}
+
+//__________________________________________________________
+
+bool    _HYCombDialog::ProcessEvent (_HYEvent* e)
+{
+    bool        done = false;
+    _String     firstArg;
+    long        i,f,g,k;
+
+    if (e->EventClass()==_hyMenuSelChangeEvent) {
+        firstArg = e->EventCode().Cut (0,(f=e->EventCode().Find(','))-1);
+        k = firstArg.toNum();
+        g = e->EventCode().Cut (f+1,-1).toNum();
+
+        for (i=0; i<components.lLength; i++)
+            if (((_HYGuiObject*)components(i))->MatchID(k)) {
+                break;
+            }
+
+        if (i==13) {
+            _HYPullDown * p1 = (_HYPullDown*)components(i);
+            k = p1->GetSelection()+2;
+            if (k<combResult->lLength) {
+                for (f=combResult->lLength-1; f>=k; f--) {
+                    combResult->Delete (k);
+                    ((_HYCheckbox*)components(f))->Enable (false);
+                }
+            } else if (k>combResult->lLength) {
+                for (f=combResult->lLength; f<k; f++) {
+                    (*combResult)<<0;
+                    ((_HYCheckbox*)components(f))->Enable (true);
+                }
+            }
+        }
+        done = true;
+    } else if (e->EventClass()==_hyButtonPushEvent) {
+        firstArg = e->EventCode().Cut (0,(f=e->EventCode().Find(','))-1);
+        k = firstArg.toNum();
+        for (i=0; i<components.lLength; i++)
+            if (((_HYGuiObject*)components(i))->MatchID(k)) {
+                break;
+            }
+
+        if (i==10) { // OK
+            *result = true;
+            combSelectionMemory.Duplicate (combResult);
+            combSizeMemory = combResult->lLength;
+            postWindowCloseEvent (GetID());
+        } else if (i==11) {
+            *result = false;
+            postWindowCloseEvent (GetID());
+        } else if (i<10) {
+            combResult->lData[i] = !combResult->lData[i];
+            ((_HYButton*)components (10))->EnableButton ((combResult->Find(0)>=0)&&(combResult->Find(1)>=0));
+        }
+
+        done = true;
+    }
+
+    if (done) {
+        DeleteObject (e);
+        return true;
+    }
+    return _HYTWindow::ProcessEvent(e);
+}
+
+
+//__________________________________________________________________
+
+_HYRect partitionDialogDescBox  = {15,5,95,295,0},
+        partitionDialogTextBox  = {25,20,85,285,0},
+        partitionDialogColorBox = {5,5,25,30,1};
+
+
+//__________________________________________________________________
+_HYPartitionDialog::_HYPartitionDialog   (_String& partDesc, _String* pn, _HYColor* pc, bool* dir, char* rf, long* cr, long df, bool* res, char codon, Ptr parentWindow):_HYTWindow ("Partition Properties",false,true, parentWindow)
+{
+
+    partName = pn;
+    color    = pc;
+
+    direction = dir;
+    codeRef   = cr;
+
+    dfID = df;
+
+    readFrame = rf;
+
+    result    = res;
+
+    _HYRect         canvasSettings = {100,300,100,300,HY_COMPONENT_TRANSP_BG};
+
+    _HYCanvas*      cn = new _HYCanvas (canvasSettings, GetOSWindowData(),100,300,32);
+    checkPointer   (cn);
+
+    if (codon) {
+        canvasSettings.left = canvasSettings.right  = 100;
+    } else {
+        canvasSettings.left = canvasSettings.right  = 60;
+    }
+
+    canvasSettings.top  = canvasSettings.bottom = 30;
+
+    _HYLabel*       l1 = new _HYLabel (canvasSettings, GetOSWindowData());
+    checkPointer    (l1);
+    _HYLabel*       l2 = new _HYLabel (canvasSettings, GetOSWindowData());
+    checkPointer    (l2);
+
+    _HYLabel*       l3,
+                    *       l4,
+                    *       l5;
+
+    if (codon) {
+        l3 = new _HYLabel (canvasSettings, GetOSWindowData());
+        checkPointer    (l3);
+        l4 = new _HYLabel (canvasSettings, GetOSWindowData());
+        checkPointer    (l3);
+        if (codon>1) {
+            l5 = new _HYLabel (canvasSettings, GetOSWindowData());
+            checkPointer    (l5);
+        }
+    }
+
+    if (codon) {
+        canvasSettings.left = canvasSettings.right  = 200;
+    } else {
+        canvasSettings.left = canvasSettings.right  = 240;
+    }
+
+    _HYTextBox*     tb    = new _HYTextBox (canvasSettings, GetOSWindowData());
+    checkPointer    (tb);
+    _HYCanvas *     cn2   = new _HYCanvas (canvasSettings, GetOSWindowData(),30,175,32);
+    checkPointer    (cn2);
+
+    _HYPullDown*    p1,
+                    *    p2;
+
+    _HYCheckbox*    cb1,
+                    *    cb2;
+
+    if (codon) {
+        p1 = new _HYPullDown (canvasSettings, GetOSWindowData());
+        checkPointer    (p1);
+        if (codon>1) {
+            p2 = new _HYPullDown (canvasSettings, GetOSWindowData());
+            checkPointer    (p2);
+        }
+        canvasSettings.left   = canvasSettings.right  = canvasSettings.right/2;
+        cb1 = new _HYCheckbox (canvasSettings, GetOSWindowData(),true);
+        checkPointer (cb1);
+        cb2 = new _HYCheckbox (canvasSettings, GetOSWindowData(),true);
+        checkPointer (cb2);
+    }
+
+
+    long            k;
+
+
+    canvasSettings.bottom = canvasSettings.top   = 40;
+    canvasSettings.left   = canvasSettings.right = 215;
+
+    _HYButton*      b1      = new _HYButton (canvasSettings, GetOSWindowData());
+    canvasSettings.left   = canvasSettings.right = 85;
+    _HYButton*      b2      = new _HYButton (canvasSettings, GetOSWindowData());
+
+    checkPointer (b1);
+    checkPointer (b2);
+
+
+
+    tb-> SetMessageRecipient (this);
+    cn2->SetMessageRecipient (this);
+    b1->SetMessageRecipient (this);
+    b2->SetMessageRecipient (this);
+
+
+    AddObject (b1);  // 0
+    AddObject (b2);  // 1
+    AddObject (cn);  // 2
+    AddObject (l1);  // 3
+    AddObject (l2);  // 4
+    AddObject (tb);  // 5
+    AddObject (cn2); // 6
+
+    if (codon) {
+        p1->SetMessageRecipient (this);
+        cb1->SetMessageRecipient (this);
+        cb2->SetMessageRecipient (this);
+        AddObject (l3); // 7
+        AddObject (l4); // 8
+        AddObject (p1); // 9
+        AddObject (cb1);// 10
+        AddObject (cb2);// 11
+        SetTableDimensions (6,3);
+
+        if (codon>1) {
+            AddObject (p2);// 12
+            AddObject (l5);// 13
+            SetTableDimensions (7,3);
+        }
+
+        SetCell (0,0,l1);
+        SetCell (0,1,tb);
+        SetCell (0,2,tb);
+        SetCell (1,0,l2);
+        SetCell (1,1,cn2);
+        SetCell (1,2,cn2);
+        SetCell (2,0,l3);
+        SetCell (2,1,p1);
+        SetCell (2,2,p1);
+        SetCell (3,0,l4);
+        SetCell (3,1,cb1);
+        SetCell (3,2,cb2);
+
+        k = 4;
+
+        if (codon>1) {
+            SetCell (4,0,l5);
+            SetCell (4,1,p2);
+            SetCell (4,2,p2);
+            k = 5;
+        }
+
+        SetCell (k,0,cn);
+        SetCell (k,1,cn);
+        SetCell (k,2,cn);
+        k++;
+        SetCell (k,0,b1);
+        SetCell (k,1,b1);
+        SetCell (k,2,b2);
+
+    } else {
+        SetTableDimensions (4,2);
+        SetCell (0,0,l1);
+        SetCell (0,1,tb);
+        SetCell (1,0,l2);
+        SetCell (1,1,cn2);
+        SetCell (2,0,cn);
+        SetCell (2,1,cn);
+        SetCell (3,0,b1);
+        SetCell (3,1,b2);
+    }
+
+    _HYFont         labelFont;
+    SetDefaultDialogFont(labelFont);
+
+    b1->SetFont (labelFont);
+    b2->SetFont (labelFont);
+    l1->SetFont (labelFont);
+    l2->SetFont (labelFont);
+
+    b1->SetText (" OK ");
+    b2->SetText (" Cancel ");
+
+    b1->SetAlignFlags (HY_ALIGN_RIGHT);
+    l1->SetAlignFlags (HY_ALIGN_LEFT);
+    l2->SetAlignFlags (HY_ALIGN_LEFT);
+    l1->SetText ("Name:");
+    l2->SetText ("Color:");
+
+    if (codon) {
+        l3->SetFont (labelFont);
+        l4->SetFont (labelFont);
+        cb1->SetFont    (labelFont);
+        cb2->SetFont    (labelFont);
+        l3->SetAlignFlags (HY_ALIGN_LEFT);
+        l4->SetAlignFlags (HY_ALIGN_LEFT);
+        cb1->SetAlignFlags (HY_ALIGN_LEFT);
+        cb2->SetAlignFlags (HY_ALIGN_LEFT);
+        p1->SetAlignFlags (HY_ALIGN_LEFT);
+        l3->SetText ("Reading Frame:");
+        l4->SetText ("Orientation:");
+        cb1->SetText ("Normal");
+        cb2->SetText ("Reversed");
+        cb1->SetState(true,false);
+
+        p1->AddMenuItem (_String("No offset"),-1);
+        p1->AddMenuItem (_String("Offset by 1"),-1);
+
+        if (codon>1) {
+            p1->AddMenuItem (_String("Offset by 2"),-1);
+            p2->SetAlignFlags (HY_ALIGN_LEFT);
+            l5->SetFont (labelFont);
+            l5->SetAlignFlags (HY_ALIGN_LEFT);
+            l5->SetText ("Genetic Code:");
+
+            for (k=0; k<geneticCodes.lLength; k++) {
+                p2->AddMenuItem (*(_String*)(*((_List*)geneticCodes(k)))(0),-1);
+            }
+            p2->ChangeSelection (*codeRef,false);
+
+        }
+    }
+
+    b1->SetButtonKind (HY_BUTTON_OK);
+    b2->SetButtonKind (HY_BUTTON_CANCEL);
+
+    labelFont.face  = "Times";
+    cn->StartDraw();
+    cn->SetDialogBG ();
+    cn->EraseAll();
+    labelFont.style = HY_FONT_BOLD;
+    cn->SetFont         (labelFont);
+    cn->DrawInfoBox     (partitionDialogDescBox,"Partition Info");
+    labelFont.style = HY_FONT_PLAIN;
+    cn->SetFont         (labelFont);
+    cn->DisplayText     (partDesc,partitionDialogTextBox,HY_ALIGN_LEFT);
+    cn->EndDraw();
+
+    tb->SetFont (labelFont);
+    tb->SetAlignFlags (HY_ALIGN_LEFT);
+    tb->SetText (*(_String*)dataSetFilterNamesList(dfID));
+
+    labelFont.style = HY_FONT_ITALIC;
+    cn2->StartDraw();
+    cn2->SetDialogBG();
+    cn2->EraseAll();
+    cn2->SetColor (*color);
+    cn2->FillRect (partitionDialogColorBox);
+    cn2->SetColor ((_HYColor) {
+        0,0,0
+    });
+    cn2->DrawRect (partitionDialogColorBox);
+    cn2->SetFont  (labelFont);
+    cn2->DisplayText ("(click to change)",partitionDialogColorBox.bottom, partitionDialogColorBox.right+10,true);
+    cn2->EndDraw();
+    cn2->SetMouseClick (true);
+
+    _HYRect     dim = MinMaxWindowDimensions();
+
+    SetWindowRectangle  (0,0,dim.bottom,dim.right);
+    CenterWindow        (this);
+
+    keyboardFocusChain << 5;
+    ProcessEvent (generateKeyboardFocusEvent (tb->GetID()));
+
+    DeleteObject (b1);
+    DeleteObject (b2);
+    DeleteObject (l1);
+    DeleteObject (l2);
+    DeleteObject (cn);
+    DeleteObject (cn2);
+    DeleteObject (tb);
+
+    if (codon) {
+        DeleteObject (l3);
+        DeleteObject (l4);
+        DeleteObject (p1);
+        DeleteObject (cb1);
+        DeleteObject (cb2);
+        if (codon>1) {
+            DeleteObject (l5);
+            DeleteObject (p2);
+        }
+    }
+
+}
+
+//__________________________________________________________
+
+bool    _HYPartitionDialog::ProcessEvent (_HYEvent* e)
+{
+    bool        done = false;
+    _String     firstArg;
+    long        i,f,g;
+
+    if (e->EventClass()==_hyMenuSelChangeEvent) {
+        firstArg = e->EventCode().Cut (0,(f=e->EventCode().Find(','))-1);
+        g = e->EventCode().Cut (f+1,-1).toNum();
+
+        i = MatchComponentID (firstArg);
+
+        done = true;
+    } else if (e->EventClass()==_hyButtonPushEvent) {
+        firstArg = e->EventCode().Cut (0,(f=e->EventCode().Find(','))-1);
+        i = MatchComponentID (firstArg);
+
+        if (i==0) { // OK
+            *result = true;
+            if (components.lLength>11) {
+                _HYCheckbox * cb = (_HYCheckbox*)components (11);
+                *direction = cb->GetState();
+                *readFrame = ((_HYPullDown*)components(9))->GetSelection();
+                if (components.lLength>13) {
+                    *codeRef = ((_HYPullDown*)components(12))->GetSelection();
+                }
+            }
+            postWindowCloseEvent (GetID());
+        } else if (i==1) {
+            *result = false;
+            postWindowCloseEvent (GetID());
+        } else if ((i==10)||(i==11)) {
+            _HYCheckbox * cb1 = (_HYCheckbox*)components (10),
+                          * cb2 = (_HYCheckbox*)components (11);
+
+            if (i==10) {
+                cb2->SetState(!cb1->GetState(),false);
+            } else {
+                cb1->SetState(!cb2->GetState(),false);
+            }
+        }
+
+
+        done = true;
+    } else if (e->EventClass()==_hyTextEditChange) {
+        firstArg = e->EventCode().Cut (0,(f=e->EventCode().Find(','))-1);
+        i = MatchComponentID (firstArg);
+
+        if (i==5) {
+            *partName = ((_HYTextBox*)components(5))->GetText();
+
+            done = partName->IsValidIdentifier ();
+            if (done) {
+                f = dataSetFilterNamesList.Find (partName);
+                if ((f>=0)&&(f!=dfID)) {
+                    done = false;
+                }
+            }
+
+            ((_HYButton*)components(0))->EnableButton (done);
+        }
+
+        done = true;
+    } else if (e->EventClass()==_hyContextPopUp) {
+        firstArg = e->EventCode().Cut (0,(f=e->EventCode().Find(','))-1);
+        i = MatchComponentID (firstArg);
+
+        if (i==6) {
+            g = e->EventCode().Find(',',f+1,-1);
+            f = e->EventCode().Cut(f+1,g-1).toNum();
+            g = e->EventCode().Cut(g+1,-1).toNum();
+            if (partitionDialogColorBox.Contains(f,g)) {
+                _String  prompt ("New Partition Color");
+                _HYColor newColor = SelectAColor (*color,prompt);
+                if (!(newColor==*color)) {
+                    *color = newColor;
+                    _HYCanvas * cn2 = (_HYCanvas*)components (6);
+                    cn2->StartDraw();
+                    cn2->SetColor (*color);
+                    cn2->FillRect (partitionDialogColorBox);
+                    cn2->SetColor ((_HYColor) {
+                        0,0,0
+                    });
+                    cn2->DrawRect (partitionDialogColorBox);
+                    cn2->EndDraw();
+                    cn2->_MarkForUpdate();
+                }
+            }
+        }
+
+        done = true;
+    }
+
+    if (done) {
+        DeleteObject (e);
+        return true;
+    }
+    return _HYTWindow::ProcessEvent(e);
+}
+
+//__________________________________________________________________
+_HYTextDialog::_HYTextDialog     (_String* res, _String& prompt, bool* resB, Ptr parent, _hyStringValidatorType textValidator):_HYTWindow ("Text Dialog",false,true, parent)
+{
+    result               = resB;
+    textOut              = res;
+    validator            = textValidator;
+    lastValidationState  = textValidator?(*textValidator) (res):true;
+
+    _HYRect         canvasSettings = {30,270,30,270,HY_COMPONENT_TRANSP_BG};
+    _HYLabel*       l1 = (_HYLabel*)checkPointer(new _HYLabel (canvasSettings, GetOSWindowData())); // label
+
+    canvasSettings.top   = canvasSettings.bottom  = 170;
+    _HYTextBox*     tb   = (_HYTextBox*)checkPointer(new _HYTextBox (canvasSettings, GetOSWindowData()));
+    tb->boxFlags |= HY_TB_WRAP;
+
+    canvasSettings.left   = canvasSettings.right  = 15;
+    canvasSettings.top    = 200;
+    canvasSettings.bottom = 10000;
+
+    _HYLabel*       l2 = (_HYLabel*)checkPointer(new _HYLabel (canvasSettings, GetOSWindowData())); // left spacer
+    _HYLabel*       l3 = (_HYLabel*)checkPointer(new _HYLabel (canvasSettings, GetOSWindowData())); // right spacer
+
+    canvasSettings.bottom = canvasSettings.top   = 40;
+    canvasSettings.left   = canvasSettings.right = 210;
+
+    _HYButton*      b1      = (_HYButton*)checkPointer(new _HYButton (canvasSettings, GetOSWindowData()));
+    canvasSettings.left   = canvasSettings.right = 90;
+    _HYButton*      b2      = (_HYButton*)checkPointer(new _HYButton (canvasSettings, GetOSWindowData()));
+
+    tb->SetMessageRecipient (this);
+    b1->SetMessageRecipient (this);
+    b2->SetMessageRecipient (this);
+
+    SetTableDimensions (3,3);
+
+    AddObject (b1, false, 2, 0); // 0
+    AddObject (b2, false, 2, 2); // 1
+    AddObject (l1, false, 0, 1); // 2
+    AddObject (l2, false, 0, 0); // 3
+    AddObject (l3, false, 0, 2); // 4
+    AddObject (tb, false, 1, 1); // 5
+
+
+    SetCell (1,0,l2);
+    SetCell (1,2,l3);
+    SetCell (2,1,b1);
+
+    _HYFont         labelFont;
+    SetDefaultDialogFont(labelFont);
+
+
+    b1->SetFont (labelFont);
+    b2->SetFont (labelFont);
+    l1->SetFont (labelFont);
+    l2->SetFont (labelFont);
+    l3->SetFont (labelFont);
+
+    tb->SetText (*res);
+    tb->SetFont (labelFont);
+
+    b1->SetText (" OK ");
+    b2->SetText (" Cancel ");
+    b1->EnableButton (lastValidationState);
+
+    b1->SetAlignFlags (HY_ALIGN_RIGHT);
+    l1->SetAlignFlags (HY_ALIGN_LEFT);
+    tb->SetAlignFlags (HY_ALIGN_LEFT);
+    l1->SetText (prompt);
+
+    b1->SetButtonKind (HY_BUTTON_OK);
+    b2->SetButtonKind (HY_BUTTON_CANCEL);
+
+    keyboardFocusChain << 5;
+    ProcessEvent(generateKeyboardFocusEvent (tb->GetID()));
+
+    _HYRect     dim = MinMaxWindowDimensions();
+
+    SetWindowRectangle  (0,0,dim.bottom,dim.right);
+    CenterWindow        (this);
+}
+
+//__________________________________________________________
+
+bool    _HYTextDialog::ProcessEvent (_HYEvent* e)
+{
+    bool        done = false;
+    _String     firstArg;
+    long        i,f,k;
+
+    if (e->EventClass()==_hyButtonPushEvent) {
+        firstArg = e->EventCode().Cut (0,(f=e->EventCode().Find(','))-1);
+        k = firstArg.toNum();
+        i = MatchComponentID (firstArg);
+
+        if (i==0) { // OK
+            *result = true;
+            *textOut = ((_HYTextBox*)GetObject (5))->GetText();
+            postWindowCloseEvent (GetID());
+        } else if (i==1) {
+            *result = false;
+            postWindowCloseEvent (GetID());
+        }
+
+        done = true;
+    } else {
+        if (validator) {
+            if (e->EventClass() == _hyTextEditChange) {
+                firstArg = e->EventCode().Cut (0,(f=e->EventCode().Find(','))-1);
+                i = MatchComponentID (firstArg);
+
+                if (i == 5) {
+                    f =  e->EventCode().Cut(f+1,-1).toNum();
+                    _HYTextBox*  myTB = (_HYTextBox*)components(i);
+                    _String tt = myTB->GetText();
+                    bool         good = (*validator) (&tt);
+
+                    if (good != lastValidationState) {
+                        ((_HYButton*)components(0))->EnableButton (good);
+                        myTB->SetForeColor ((_HYColor) {
+                            good?0:127,good?127:0,0
+                        });
+                        lastValidationState = good;
+                    }
+                    done = true;
+                }
+            }
+
+        }
+    }
+
+    if (done) {
+        DeleteObject (e);
+        return true;
+    }
+    return _HYTWindow::ProcessEvent(e);
+}
+
+//__________________________________________________________________
+_HYTextDialog2::_HYTextDialog2   (_String* res, _String* res2, _String& prompt, _String& prompt2, bool* resB, Ptr parent):_HYTextDialog (res,prompt,resB,parent)
+{
+    textOut2     = res2;
+
+    _HYRect         canvasSettings = {30,270,30,270,HY_COMPONENT_TRANSP_BG};
+
+    _HYLabel*       l4 = new _HYLabel (canvasSettings, GetOSWindowData());
+    checkPointer    (l4);
+
+    canvasSettings.top   = canvasSettings.bottom  = 170;
+    _HYTextBox*     tb2 = new _HYTextBox (canvasSettings, GetOSWindowData());
+    checkPointer    (tb2);
+    tb2->boxFlags |= HY_TB_WRAP;
+
+
+    tb2->SetMessageRecipient (this);
+
+    SetTableDimensions (5,3);
+
+    AddObject (l4); // 6
+    AddObject (tb2);// 7
+
+    SetCell (0,0,(_HYGuiObject*)components(3));
+    SetCell (0,1,(_HYGuiObject*)components(2));
+    SetCell (0,2,(_HYGuiObject*)components(4));
+
+    SetCell (1,0,(_HYGuiObject*)components(3));
+    SetCell (1,1,(_HYGuiObject*)components(5));
+    SetCell (1,2,(_HYGuiObject*)components(4));
+
+    SetCell (2,0,(_HYGuiObject*)components(3));
+    SetCell (2,1,(_HYGuiObject*)l4);
+    SetCell (2,2,(_HYGuiObject*)components(4));
+
+    SetCell (3,0,(_HYGuiObject*)components(3));
+    SetCell (3,1,(_HYGuiObject*)tb2);
+    SetCell (3,2,(_HYGuiObject*)components(4));
+
+    SetCell (4,0,(_HYGuiObject*)components(0));
+    SetCell (4,1,(_HYGuiObject*)components(0));
+    SetCell (4,2,(_HYGuiObject*)components(1));
+
+    _HYFont         labelFont;
+    SetDefaultDialogFont(labelFont);
+
+    l4->SetFont (labelFont);
+    l4->SetText (prompt2);
+
+    tb2->SetText    (*res2);
+    tb2->SetFont    (labelFont);
+
+    l4->SetAlignFlags (HY_ALIGN_LEFT);
+    tb2->SetAlignFlags (HY_ALIGN_LEFT);
+
+    keyboardFocusChain << 7;
+
+    _HYRect     dim = MinMaxWindowDimensions();
+
+    SetWindowRectangle  (0,0,dim.bottom,dim.right);
+    CenterWindow        (this);
+
+    DeleteObject (l4);
+    DeleteObject (tb2);
+
+}
+
+//__________________________________________________________
+
+bool    _HYTextDialog2::ProcessEvent (_HYEvent* e)
+{
+    bool        done = false;
+    _String     firstArg;
+    long        i,f,k;
+
+    if (e->EventClass()==_hyButtonPushEvent) {
+        firstArg = e->EventCode().Cut (0,(f=e->EventCode().Find(','))-1);
+        k = firstArg.toNum();
+        i = MatchComponentID (firstArg);
+
+        if (i==0) { // OK
+            *result = true;
+            *textOut  = ((_HYTextBox*)GetObject (5))->GetText();
+            *textOut2 = ((_HYTextBox*)GetObject (7))->GetText();
+            postWindowCloseEvent (GetID());
+        }
+    }
+
+    if (done) {
+        DeleteObject (e);
+        return true;
+    }
+    return _HYTextDialog::ProcessEvent(e);
+}
+
+
+//__________________________________________________________________
+_HYTextDialogWithPulldown::_HYTextDialogWithPulldown (_String* res,_String& prompt, _String& cPrompt, _List& menuOptions, _List* actions, bool *resB, bool* resC, long* resP, long initSel, Ptr parent):
+    _HYTextDialogWithCheckbox    (res, prompt, cPrompt,resB, resC, parent)
+{
+    autoFill        = actions;
+    menuSelection   = resP;
+
+    _HYRect         canvasSettings = {30,270,30,270,HY_COMPONENT_TRANSP_BG};
+
+    _HYPullDown*    pd = new _HYPullDown (canvasSettings, GetOSWindowData ());
+    checkPointer    (pd);
+
+    _HYGuiObject*   cache[7] = {GetObject(0), GetObject(1), GetObject (2),
+                                GetObject(3), GetObject(4), GetObject (5), GetObject (6)
+                               };
+
+    SetTableDimensions (5,3);
+
+    AddObject (pd);// 7
+
+    SetCell (0,0,cache[3]);
+    SetCell (0,1,cache[2]);
+    SetCell (0,2,cache[4]);
+
+    SetCell (1,0,cache[3]);
+    SetCell (1,1,cache[5]);
+    SetCell (1,2,cache[4]);
+
+    SetCell (2,0,cache[3]);
+    SetCell (2,1,pd);
+    SetCell (2,2,cache[4]);
+
+    SetCell (3,0,cache[3]);
+    SetCell (3,1,cache[6]);
+    SetCell (3,2,cache[4]);
+
+    SetCell (4,0,cache[0]);
+    SetCell (4,1,cache[0]);
+    SetCell (4,2,cache[1]);
+
+    ((_HYComponent*)(cache[3]))->settings.top+=30;
+    ((_HYComponent*)(cache[3]))->settings.bottom+=30;
+
+    ((_HYComponent*)(cache[4]))->settings.top+=30;
+    ((_HYComponent*)(cache[4]))->settings.bottom+=30;
+
+    pd->SetMessageRecipient (this);
+
+    _HYFont         labelFont;
+
+    for (long k=0; k<menuOptions.lLength; k++) {
+        pd->AddMenuItem (*(_String*)menuOptions(k), -1);
+    }
+
+    pd->SetAlignFlags (HY_ALIGN_LEFT);
+    pd->ChangeSelection (initSel, false);
+
+
+    _HYRect     dim = MinMaxWindowDimensions();
+
+    SetWindowRectangle  (0,0,dim.bottom,dim.right);
+    CenterWindow        (this);
+
+    DeleteObject (pd);
+}
+
+//__________________________________________________________
+
+bool    _HYTextDialogWithPulldown::ProcessEvent (_HYEvent* e)
+{
+    _String     firstArg;
+    long        i,f,k;
+
+    if (e->EventClass()==_hyButtonPushEvent) {
+        firstArg = e->EventCode().Cut (0,(f=e->EventCode().Find(','))-1);
+        i = MatchComponentID (firstArg);
+
+        if (i==0) { // OK
+            *checkState     = ((_HYCheckbox*)GetObject(6))->GetState();
+            *menuSelection  = ((_HYPullDown*)GetObject(7))->GetSelection();
+        }
+    } else {
+        if (autoFill&&(e->EventClass()==_hyMenuSelChangeEvent)) {
+            firstArg = e->EventCode().Cut (0,(f=e->EventCode().Find(','))-1);
+            i = MatchComponentID (firstArg);
+
+
+            if (i==7) { // OK
+                k = e->EventCode().Cut(f+1,-1).toNum();
+                if (autoFill->lLength>k) {
+                    ((_HYTextBox*)GetObject(5))->InsertText (*(_String*)(*autoFill)(k),true);
+                }
+            }
+        }
+    }
+
+    return _HYTextDialog::ProcessEvent(e);
+}
+
+//__________________________________________________________________
+_HYTextDialogWithCheckbox::_HYTextDialogWithCheckbox     (_String* res, _String& prompt, _String& cPrompt, bool* resB, bool *resC, Ptr parent):
+    _HYTextDialog                (res,prompt,resB, parent)
+{
+    checkState      = resC;
+
+    _HYRect         canvasSettings = {30,270,30,270,HY_COMPONENT_TRANSP_BG};
+
+    _HYCheckbox*    cb = new _HYCheckbox (canvasSettings, GetOSWindowData ());
+    checkPointer    (cb);
+
+    _HYGuiObject*   cache[6] = {GetObject(0), GetObject(1), GetObject (2),
+                                GetObject(3), GetObject(4), GetObject (5)
+                               };
+
+    SetTableDimensions (4,3);
+
+    AddObject (cb);// 6
+
+    SetCell (0,0,cache[3]);
+    SetCell (0,1,cache[2]);
+    SetCell (0,2,cache[4]);
+
+    SetCell (1,0,cache[3]);
+    SetCell (1,1,cache[5]);
+    SetCell (1,2,cache[4]);
+
+    SetCell (2,0,cache[3]);
+    SetCell (2,1,cb);
+    SetCell (2,2,cache[4]);
+
+    SetCell (3,0,cache[0]);
+    SetCell (3,1,cache[0]);
+    SetCell (3,2,cache[1]);
+
+    ((_HYComponent*)(cache[3]))->settings.top+=30;
+    ((_HYComponent*)(cache[3]))->settings.bottom+=30;
+
+    ((_HYComponent*)(cache[4]))->settings.top+=30;
+    ((_HYComponent*)(cache[4]))->settings.bottom+=30;
+
+    cb->SetMessageRecipient (this);
+
+    _HYFont         labelFont;
+    SetDefaultDialogFont(labelFont);
+
+
+    cb->SetFont (labelFont);
+    cb->SetAlignFlags (HY_ALIGN_LEFT);
+    cb->SetText (cPrompt);
+
+
+    _HYRect     dim = MinMaxWindowDimensions();
+
+    SetWindowRectangle  (0,0,dim.bottom,dim.right);
+    CenterWindow        (this);
+
+    cb->SetState (*resC,false);
+
+    DeleteObject (cb);
+
+}
+
+//__________________________________________________________
+
+bool    _HYTextDialogWithCheckbox::ProcessEvent (_HYEvent* e)
+{
+    _String     firstArg;
+    long        i,f,k;
+
+    if (e->EventClass()==_hyButtonPushEvent) {
+        firstArg = e->EventCode().Cut (0,(f=e->EventCode().Find(','))-1);
+        k = firstArg.toNum();
+        i = MatchComponentID (firstArg);
+
+        if (i==0) { // OK
+            *checkState = ((_HYCheckbox*)GetObject(6))->GetState();
+        }
+    }
+
+    return _HYTextDialog::ProcessEvent(e);
+}
+
+//__________________________________________________________________
+
+_HYProceedPromptBox::_HYProceedPromptBox     (_String& prompt, _String& sb1, _String& sb2,_HYFont& tf, long pid, bool* resB, Ptr parent):
+    _HYTWindow ("HYPHY Prompt",false,true, parent)
+{
+    result      = resB;
+
+    _HYRect         canvasSettings = {150,400,150,400,HY_COMPONENT_TRANSP_BG};
+
+    _HYCanvas*      cvs = new _HYCanvas (canvasSettings, GetOSWindowData(),150,400,24);
+    checkPointer    (cvs);
+
+
+    _HYFont         labelFont;
+    labelFont.face  = "SystemFont";
+    labelFont.size  = 14;
+    labelFont.style = HY_FONT_PLAIN;
+
+    canvasSettings.left = GetVisibleStringWidth (sb2, labelFont)+35;
+
+    if (canvasSettings.left>325) {
+        canvasSettings.left = 325;
+    }
+
+    canvasSettings.right  = canvasSettings.left;
+    canvasSettings.bottom = canvasSettings.top   = 40;
+
+    _HYButton*      b2      = nil;
+
+    if (sb2.sLength) {
+        b2 = new _HYButton (canvasSettings, GetOSWindowData());
+        checkPointer (b2);
+        b2->SetMessageRecipient (this);
+    } else {
+        canvasSettings.left = 20;
+    }
+
+    canvasSettings.left     = canvasSettings.right = 400 - canvasSettings.left;
+    _HYButton*      b1      = new _HYButton (canvasSettings, GetOSWindowData());
+
+    checkPointer (b1);
+
+    b1->SetMessageRecipient (this);
+
+    SetTableDimensions (2,2);
+
+    AddObject (cvs);// 0
+    AddObject (b1); // 1
+
+    SetCell (0,0,cvs);
+    SetCell (0,1,cvs);
+
+    SetCell (1,0,b1);
+    if (b2) {
+        AddObject (b2); // 2
+        SetCell (1,1,b2);
+    } else {
+        canvasSettings.left = canvasSettings.right = 20;
+        _HYLabel* l1 = new _HYLabel (canvasSettings, GetOSWindowData());
+        AddObject (l1);
+        SetCell (1,1,l1);
+        DeleteObject (l1);
+    }
+
+
+    cvs->StartDraw   ();
+    cvs->SetDialogBG ();
+    cvs->EraseAll    ();
+
+    canvasSettings.left  = canvasSettings.right  = 10;
+    canvasSettings.top   = canvasSettings.bottom = 10;
+
+    cvs->DrawPicRes  (canvasSettings, pid);
+
+    canvasSettings.left     = canvasSettings.right + 10;
+    canvasSettings.right    = 390;
+    canvasSettings.top      = 15;
+    canvasSettings.bottom   = 145;
+
+    cvs->SetFont     (tf);
+    cvs->DisplayText (prompt, canvasSettings, HY_ALIGN_LEFT);
+
+    cvs->EndDraw     ();
+
+
+    b1->SetFont (labelFont);
+    b1->SetText (sb1);
+    b1->SetAlignFlags (HY_ALIGN_RIGHT);
+    b1->SetButtonKind (HY_BUTTON_OK);
+
+    if (b2) {
+        b2->SetText (sb2);
+        b2->SetFont (labelFont);
+        b2->SetButtonKind (HY_BUTTON_CANCEL);
+        DeleteObject (b2);
+    }
+
+    _HYRect     dim = MinMaxWindowDimensions();
+
+    SetWindowRectangle  (0,0,dim.bottom,dim.right);
+    CenterWindow        (this);
+
+    DeleteObject (b1);
+    DeleteObject (cvs);
+}
+
+//__________________________________________________________
+
+bool    _HYProceedPromptBox::ProcessEvent (_HYEvent* e)
+{
+    bool        done = false;
+    _String     firstArg;
+    long        i,f,k;
+
+    if (e->EventClass()==_hyButtonPushEvent) {
+        firstArg = e->EventCode().Cut (0,(f=e->EventCode().Find(','))-1);
+        k = firstArg.toNum();
+        i = MatchComponentID (firstArg);
+
+        if (i==1) { // OK
+            *result = true;
+            postWindowCloseEvent (GetID());
+        } else if (i==2) {
+            *result = false;
+            postWindowCloseEvent (GetID());
+        }
+
+        done = true;
+    }
+
+    if (done) {
+        DeleteObject (e);
+        return true;
+    }
+    return _HYTWindow::ProcessEvent(e);
+}
+
+//__________________________________________________________________
+
+_HYProceedPromptBoxWCheck::_HYProceedPromptBoxWCheck     (_String& prompt, _String& sb1, _String& sb2, _String& checkPrompt,_HYFont& tf, long pid, bool* resB, bool* checkB, Ptr parent):
+    _HYProceedPromptBox (prompt, sb1, sb2, tf, pid, resB, parent)
+{
+    checkState  = checkB;
+
+    _HYRect         canvasSettings = {tf.size + 5,400,tf.size + 5,400,HY_COMPONENT_TRANSP_BG};
+
+    _HYFont         labelFont;
+    SetDefaultDialogFont(labelFont);
+
+    long            w = GetVisibleStringWidth (checkPrompt, tf) + 30;
+
+    if ((tf.size < 36)&&(w+ 120 + GetVisibleStringWidth (sb1, labelFont) + GetVisibleStringWidth (sb2, labelFont)<=400)) {
+        canvasSettings.left = canvasSettings.right  = w;
+        canvasSettings.top  = canvasSettings.bottom = 40;
+    }
+
+
+    _HYCheckbox*    cb = new _HYCheckbox (canvasSettings, GetOSWindowData());
+    checkPointer    (cb);
+
+
+    AddObject (cb); // 3
+    cb->SetMessageRecipient (this);
+
+    _HYGuiObject * refs[3] = {(_HYGuiObject*)components(0),(_HYGuiObject*)components(1),(_HYGuiObject*)components(2)};
+
+    if (canvasSettings.left==400) {
+        SetTableDimensions (3,2);
+
+        SetCell (0,0,refs[0]);
+        SetCell (0,1,refs[0]);
+
+        SetCell (1,0,cb);
+        SetCell (1,1,cb);
+
+        SetCell (2,0,refs[1]);
+        SetCell (2,1,refs[2]);
+    } else {
+        SetTableDimensions (2,3);
+
+        SetCell (0,0,refs[0]);
+        SetCell (0,1,refs[0]);
+        SetCell (0,2,refs[0]);
+
+        SetCell (1,0,cb);
+        SetCell (1,1,refs[1]);
+        SetCell (1,2,refs[2]);
+
+        _HYButton*      b = (_HYButton*)GetObject (1);
+        b->settings.left = b->settings.right = b->settings.left - canvasSettings.left;
+    }
+
+
+    cb->SetFont       (tf);
+    cb->SetState      (*checkState);
+    cb->SetText       (checkPrompt);
+    cb->SetAlignFlags (HY_ALIGN_LEFT);
+
+    _HYRect     dim = MinMaxWindowDimensions();
+
+    SetWindowRectangle  (0,0,dim.bottom,dim.right);
+    CenterWindow        (this);
+
+    DeleteObject (cb);
+}
+
+//__________________________________________________________
+
+bool    _HYProceedPromptBoxWCheck::ProcessEvent (_HYEvent* e)
+{
+    bool        done = false;
+    _String     firstArg;
+    long        i,f,k;
+
+    if (e->EventClass()==_hyButtonPushEvent) {
+        firstArg = e->EventCode().Cut (0,(f=e->EventCode().Find(','))-1);
+        k = firstArg.toNum();
+        i = MatchComponentID (firstArg);
+
+        if (i==1) { // OK
+            *result     = true;
+            *checkState = ((_HYCheckbox*)GetObject (3))->GetState();
+            postWindowCloseEvent (GetID());
+        } else if (i==2) {
+            *result = false;
+            postWindowCloseEvent (GetID());
+        }
+
+        done = true;
+    }
+
+    if (done) {
+        DeleteObject (e);
+        return true;
+    }
+    return _HYTWindow::ProcessEvent(e);
+}
+
+//__________________________________________________________________
+
+_HYInferenceConstraints::_HYInferenceConstraints
+(_String& prompt ,  _List& l1, _List& l2, _List& l3, _List& l4,
+ _List& L1, _List& L2, _List& L3, _List& L4,
+ _HYFont& , bool* resB, _String* ress, Ptr parent):
+    _HYTextDialog (ress, prompt, resB, parent)
+{
+    _HYRect         canvasSettings = {30,67,30,67,HY_COMPONENT_TRANSP_BG};
+
+    _HYFont         labelFont;
+    SetDefaultDialogFont(labelFont);
+
+    il1 = &L1;
+    il2 = &L2;
+    il3 = &L3;
+    il4 = &L4;
+
+    _HYLabel       *lb1 = new _HYLabel (canvasSettings, GetOSWindowData ());
+    checkPointer   (lb1);
+    _HYLabel       *lb2 = new _HYLabel (canvasSettings, GetOSWindowData ());
+    checkPointer   (lb2);
+    _HYLabel       *lb3 = new _HYLabel (canvasSettings, GetOSWindowData ());
+    checkPointer   (lb3);
+    _HYLabel       *lb4 = new _HYLabel (canvasSettings, GetOSWindowData ());
+    checkPointer   (lb4);
+
+    canvasSettings.left = canvasSettings.right = 178;
+
+    _HYPullDown    *pd1 = new _HYPullDown (canvasSettings, GetOSWindowData  ());
+    checkPointer   (pd1);
+    _HYPullDown    *pd2 = new _HYPullDown (canvasSettings, GetOSWindowData  ());
+    checkPointer   (pd2);
+    _HYPullDown    *pd3 = new _HYPullDown (canvasSettings, GetOSWindowData  ());
+    checkPointer   (pd3);
+    _HYPullDown    *pd4 = new _HYPullDown (canvasSettings, GetOSWindowData  ());
+    checkPointer   (pd4);
+
+    canvasSettings.left = canvasSettings.right = 25;
+
+    _HYButtonBar   *btn1 = new _HYButtonBar (canvasSettings, GetOSWindowData    ());
+    checkPointer   (btn1);
+    _HYButtonBar   *btn2 = new _HYButtonBar (canvasSettings, GetOSWindowData    ());
+    checkPointer   (btn2);
+    _HYButtonBar   *btn3 = new _HYButtonBar (canvasSettings, GetOSWindowData    ());
+    checkPointer   (btn3);
+    _HYButtonBar   *btn4 = new _HYButtonBar (canvasSettings, GetOSWindowData    ());
+    checkPointer   (btn4);
+
+    AddObject      (lb1); // 6
+    AddObject      (lb2); // 7
+    AddObject      (lb3); // 8
+    AddObject      (lb4); // 9
+
+    AddObject      (pd1); // 10
+    AddObject      (pd2); // 11
+    AddObject      (pd3); // 12
+    AddObject      (pd4); // 13
+
+    AddObject      (btn1);// 14
+    AddObject      (btn2);// 15
+    AddObject      (btn3);// 16
+    AddObject      (btn4);// 17
+
+    _HYGuiObject * refs[6] = {(_HYGuiObject*)components(0),(_HYGuiObject*)components(1),(_HYGuiObject*)components(2),
+                              (_HYGuiObject*)components(3),(_HYGuiObject*)components(4),(_HYGuiObject*)components(5)
+                             };
+    SetTableDimensions (7,7);
+
+    SetCell (0,0,refs[3]);
+    SetCell (0,1,refs[2]);
+    SetCell (0,2,refs[2]);
+    SetCell (0,3,refs[2]);
+    SetCell (0,4,refs[2]);
+    SetCell (0,5,refs[2]);
+    SetCell (0,6,refs[4]);
+
+    SetCell (1,0,refs[3]);
+    SetCell (1,1,refs[5]);
+    SetCell (1,2,refs[5]);
+    SetCell (1,3,refs[5]);
+    SetCell (1,4,refs[5]);
+    SetCell (1,5,refs[5]);
+    SetCell (1,6,refs[4]);
+
+    SetCell (2,0,refs[3]);
+    SetCell (2,1,lb1);
+    SetCell (2,2,pd1);
+    SetCell (2,3,pd1);
+    SetCell (2,4,pd1);
+    SetCell (2,5,btn1);
+    SetCell (2,6,refs[4]);
+
+    SetCell (3,0,refs[3]);
+    SetCell (3,1,lb2);
+    SetCell (3,2,pd2);
+    SetCell (3,3,pd2);
+    SetCell (3,4,pd2);
+    SetCell (3,5,btn2);
+    SetCell (3,6,refs[4]);
+
+    SetCell (4,0,refs[3]);
+    SetCell (4,1,lb3);
+    SetCell (4,2,pd3);
+    SetCell (4,3,pd3);
+    SetCell (4,4,pd3);
+    SetCell (4,5,btn3);
+    SetCell (4,6,refs[4]);
+
+    SetCell (5,0,refs[3]);
+    SetCell (5,1,lb4);
+    SetCell (5,2,pd4);
+    SetCell (5,3,pd4);
+    SetCell (5,4,pd4);
+    SetCell (5,5,btn4);
+    SetCell (5,6,refs[4]);
+
+
+
+    SetCell (6,0,refs[3]);
+    SetCell (6,1,refs[0]);
+    SetCell (6,2,refs[0]);
+    SetCell (6,3,refs[1]);
+    SetCell (6,4,refs[1]);
+    SetCell (6,5,refs[1]);
+    SetCell (6,6,refs[4]);
+
+    ((_HYComponent*)refs[0])->settings.left -= 30;
+    ((_HYComponent*)refs[0])->settings.right -= 30;
+
+    pd1->SetAlignFlags (HY_ALIGN_LEFT);
+    pd2->SetAlignFlags (HY_ALIGN_LEFT);
+    pd3->SetAlignFlags (HY_ALIGN_LEFT);
+    pd4->SetAlignFlags (HY_ALIGN_LEFT);
+
+    lb1->SetAlignFlags (HY_ALIGN_LEFT);
+    lb2->SetAlignFlags (HY_ALIGN_LEFT);
+    lb3->SetAlignFlags (HY_ALIGN_LEFT);
+    lb4->SetAlignFlags (HY_ALIGN_LEFT);
+
+    lb1->SetFont       (labelFont);
+    lb2->SetFont       (labelFont);
+    lb3->SetFont       (labelFont);
+    lb4->SetFont       (labelFont);
+
+    lb1->SetText ("Locals");
+    lb2->SetText ("Globals");
+    lb3->SetText ("Trees");
+    lb4->SetText ("Templates");
+
+    _String         btnTT ("Paste to expression");
+
+    btn1->SetMessageRecipient (this);
+    btn2->SetMessageRecipient (this);
+    btn3->SetMessageRecipient (this);
+    btn4->SetMessageRecipient (this);
+
+    btn1->SetButtonDim  (16);
+    btn2->SetButtonDim  (16);
+    btn3->SetButtonDim  (16);
+    btn4->SetButtonDim  (16);
+
+    btn1->AddButton (ProcureIconResource(HY_MODELWINDOW_ICON_BASE+2),&btnTT);
+    btn2->AddButton (ProcureIconResource(HY_MODELWINDOW_ICON_BASE+2),&btnTT);
+    btn3->AddButton (ProcureIconResource(HY_MODELWINDOW_ICON_BASE+2),&btnTT);
+    btn4->AddButton (ProcureIconResource(HY_MODELWINDOW_ICON_BASE+2),&btnTT);
+
+    long k;
+
+    for (k=0; k<l1.lLength; k++) {
+        pd1->AddMenuItem (*(_String*)l1(k),-1);
+    }
+
+    for (k=0; k<l2.lLength; k++) {
+        pd2->AddMenuItem (*(_String*)l2(k),-1);
+    }
+
+    for (k=0; k<l3.lLength; k++) {
+        pd3->AddMenuItem (*(_String*)l3(k),-1);
+    }
+
+    for (k=0; k<l4.lLength; k++) {
+        pd4->AddMenuItem (*(_String*)l4(k),-1);
+    }
+
+    if (l1.lLength == 0) {
+        pd1->AddMenuItem (none,0);
+        pd1->EnableMenu  (false);
+        btn1->EnableButton (0,false);
+    }
+
+    if (l2.lLength == 0) {
+        pd2->AddMenuItem (none,0);
+        pd2->EnableMenu  (false);
+        btn2->EnableButton (0,false);
+    }
+
+    if (l3.lLength == 0) {
+        pd3->AddMenuItem (none,0);
+        pd3->EnableMenu  (false);
+        btn3->EnableButton (0,false);
+    }
+
+    if (l4.lLength == 0) {
+        pd4->AddMenuItem (none,0);
+        pd4->EnableMenu  (false);
+        btn4->EnableButton (0,false);
+    }
+
+    pd1->ChangeSelection (0,false);
+    pd2->ChangeSelection (0,false);
+    pd3->ChangeSelection (0,false);
+    pd4->ChangeSelection (0,false);
+
+    _HYRect     dim = MinMaxWindowDimensions();
+
+    SetWindowRectangle  (0,0,dim.bottom,dim.right);
+    CenterWindow        (this);
+
+    DeleteObject (pd1);
+    DeleteObject (pd2);
+    DeleteObject (pd3);
+    DeleteObject (pd4);
+
+    DeleteObject (btn1);
+    DeleteObject (btn2);
+    DeleteObject (btn3);
+    DeleteObject (btn4);
+
+    DeleteObject (lb1);
+    DeleteObject (lb2);
+    DeleteObject (lb3);
+    DeleteObject (lb4);
+}
+
+//__________________________________________________________
+
+bool    _HYInferenceConstraints::ProcessEvent (_HYEvent* e)
+{
+    bool        done = false;
+    _String     firstArg;
+    long        i,f;
+
+    if (e->EventClass()==_hyButtonPushEvent) {
+        firstArg = e->EventCode().Cut (0,(f=e->EventCode().Find(','))-1);
+        i = MatchComponentID (firstArg);
+
+        if (i==0) { // OK
+            *result = true;
+            *textOut = ((_HYTextBox*)GetObject (5))->GetText();
+            postWindowCloseEvent (GetID());
+        } else if (i==1) {
+            *result = false;
+            postWindowCloseEvent (GetID());
+        } else {
+            _List           * theList = nil;
+            _HYPullDown     * thePD   = nil;
+            _HYTextBox      * tb = (_HYTextBox*)GetObject (5);
+            switch (i) {
+            case 14:
+                theList = il1;
+                thePD   = (_HYPullDown*)GetObject (10);
+                break;
+            case 15:
+                theList = il2;
+                thePD   = (_HYPullDown*)GetObject (11);
+                break;
+            case 16:
+                theList = il3;
+                thePD   = (_HYPullDown*)GetObject (12);
+                break;
+            case 17:
+                theList = il4;
+                thePD   = (_HYPullDown*)GetObject (13);
+                break;
+            }
+
+            if (theList) {
+                tb->InsertText (*(_String*)((*theList)(thePD->GetSelection())));
+            }
+        }
+
+        done = true;
+    }
+
+    if (done) {
+        DeleteObject (e);
+        return true;
+    }
+    return _HYTWindow::ProcessEvent(e);
+}
+//__________________________________________________________
+
+char        ciOption    = 0;
+_Parameter  ciConfLevel = 0.95,
+            ciResampler = 100;
+
+//__________________________________________________________
+
+_HYCIDialog::_HYCIDialog (bool* res, char* opt, _Parameter* val, _Parameter * val2, Ptr parWindow):_HYTWindow ("Confidence Interval Options", false, true, parWindow)
+{
+
+
+    result          = res;
+    option          = opt;
+    sigValue        = val;
+    sigValue2       = val2;
+
+    _HYRect         canvasSettings = {30,150,30,150,HY_COMPONENT_NO_SCROLL|HY_COMPONENT_TRANSP_BG};
+
+    _HYLabel*       l1      = new _HYLabel (canvasSettings, GetOSWindowData());
+    _HYLabel*       l2      = new _HYLabel (canvasSettings, GetOSWindowData());
+    _HYLabel*       l3      = new _HYLabel (canvasSettings, GetOSWindowData());
+
+
+    canvasSettings.left = canvasSettings.right = 211;
+
+    _HYTextBox  *   tb1     = new _HYTextBox  (canvasSettings, GetOSWindowData());
+    _HYTextBox  *   tb2     = new _HYTextBox  (canvasSettings, GetOSWindowData());
+    _HYPullDown *   p1      = new _HYPullDown (canvasSettings, GetOSWindowData());
+    canvasSettings.left = canvasSettings.right = 280;
+    _HYButton*      b1      = new _HYButton (canvasSettings, GetOSWindowData());
+    canvasSettings.left = canvasSettings.right = 81;
+    _HYButton*      b2      = new _HYButton (canvasSettings, GetOSWindowData());
+
+    tb1->SetMessageRecipient (this);
+    tb2->SetMessageRecipient (this);
+    b1 ->SetMessageRecipient (this);
+    b2 ->SetMessageRecipient (this);
+    p1 ->SetMessageRecipient (this);
+
+    AddObject (tb1); // 0
+
+    AddObject (b1);  // 1
+    AddObject (b2);  // 2
+
+    AddObject (l1);  // 3
+    AddObject (l2);  // 4
+
+    AddObject (p1);  // 5
+
+    AddObject (l3);   // 6
+    AddObject (tb2);  // 7
+
+
+    keyboardFocusChain << 0;
+    keyboardFocusChain << 7;
+
+    SetTableDimensions (4,2);
+
+    SetCell   (0,0,l1);
+    SetCell   (0,1,p1);
+
+    SetCell   (1,0,l2);
+    SetCell   (1,1,tb1);
+
+    SetCell   (2,0,l3);
+    SetCell   (2,1,tb2);
+
+    SetCell   (3,0,b1);
+    SetCell   (3,1,b2);
+
+
+    _HYFont  labelFont;
+    SetDefaultDialogFont(labelFont);
+
+    l1->SetFont (labelFont);
+    l2->SetFont (labelFont);
+    l3->SetFont (labelFont);
+
+    b1->SetFont (labelFont);
+    b2->SetFont (labelFont);
+
+    l1->SetText (" Estimation Method");
+
+    tb1->SetText(ciConfLevel);
+    tb1->SetFont (labelFont);
+
+    tb2->SetText(ciResampler);
+    tb2->SetFont (labelFont);
+
+    l1 ->SetAlignFlags (HY_ALIGN_LEFT);
+    l2 ->SetAlignFlags (HY_ALIGN_LEFT);
+    l3 ->SetAlignFlags (HY_ALIGN_LEFT);
+    p1 ->SetAlignFlags (HY_ALIGN_LEFT);
+    tb1->SetAlignFlags (HY_ALIGN_LEFT);
+    tb2->SetAlignFlags (HY_ALIGN_LEFT);
+
+    b1->SetAlignFlags (HY_ALIGN_RIGHT);
+
+    b1->SetText       ("  OK  ");
+    b1->SetButtonKind (HY_BUTTON_OK);
+    b2->SetText       (" Cancel ");
+    b2->SetButtonKind (HY_BUTTON_CANCEL);
+
+    p1->AddMenuItem   ("Asymptotic Normal [crude]",-1);
+    p1->AddMenuItem   ("Asymptotic Normal [finer]",-1);
+    p1->AddMenuItem   (menuSeparator,-1);
+    p1->AddMenuItem   ("Likelihood Profile [chi2]",-1);
+    p1->AddMenuItem   ("Likelihood Profile [custom]",-1);
+    p1->AddMenuItem   (menuSeparator,-1);
+    p1->AddMenuItem   ("SIR Sampler",-1);
+    p1->AddMenuItem   ("Latin Hypercube Sampler",-1);
+
+
+    _HYRect     dim = MinMaxWindowDimensions();
+
+    lastState = 2;
+    *option   = -1;
+
+    tb1->SetText        (ciConfLevel,false);
+    tb2->SetText        (ciResampler,false);
+    p1->ChangeSelection (ciOption,true);
+
+    SetWindowRectangle  (0,0,dim.bottom,dim.right);
+    CenterWindow        (this);
+
+    DeleteObject (l1);
+    DeleteObject (l2);
+    DeleteObject (l3);
+    DeleteObject (tb1);
+    DeleteObject (tb2);
+    DeleteObject (p1);
+    DeleteObject (b1);
+    DeleteObject (b2);
+}
+
+//__________________________________________________________
+
+bool    _HYCIDialog::ProcessEvent (_HYEvent* e)
+{
+    bool        done = false;
+    _String     firstArg;
+    long        i,f;
+
+    if (e->EventClass()==_hyButtonPushEvent) {
+        firstArg = e->EventCode().Cut (0,(f=e->EventCode().Find(','))-1);
+        i = MatchComponentID (firstArg);
+
+        if (i==1) { // OK
+            *option     = ciOption = ((_HYPullDown*)components (5))->GetSelection();
+            *result     = true;
+            ciConfLevel = *sigValue;
+            if (*option > 5) {
+                ciResampler = *sigValue2;
+            }
+            postWindowCloseEvent (GetID());
+        } else if (i==2) { // Cancel
+            *result = false;
+            postWindowCloseEvent (GetID());
+        }
+
+        done = true;
+    } else if (e->EventClass()==_hyTextEditChange) {
+        *sigValue = (((_HYTextBox*)components (0))->GetText()).toNum();
+        *sigValue2 = (((_HYTextBox*)components (7))->GetText()).toNum();
+
+        bool         good = true;
+
+        switch (((_HYPullDown*)components (5))->GetSelection()) {
+        case 3:
+            good = *sigValue>0.0 && *sigValue<1.0;
+            break;
+        case 4:
+            good = *sigValue>0.0;
+            break;
+        case 6:
+            good =  *sigValue>=1 && *sigValue2<=*sigValue;
+            break;
+        }
+
+        if (good!=lastState) {
+            lastState = good;
+            ((_HYButton*)components(1))->EnableButton (good);
+            ((_HYTextBox*)components (0))->SetForeColor ((_HYColor) {
+                good?0:127,good?127:0,0
+            });
+            ((_HYTextBox*)components (7))->SetForeColor ((_HYColor) {
+                good?0:127,good?127:0,0
+            });
+        }
+
+        done = true;
+    } else if (e->EventClass()==_hyMenuSelChangeEvent) {
+        firstArg = e->EventCode().Cut (0,(f=e->EventCode().Find(','))-1);
+        f        = e->EventCode().Cut (f+1,-1).toNum();
+        i        = MatchComponentID (firstArg);
+
+        if (i==5) {
+            if (*option != f) {
+                _HYLabel    *l2     = (_HYLabel*)components(4),
+                             *l3     = (_HYLabel*)components(6);
+
+                _HYTextBox  *tb1    = (_HYTextBox*)components(0),
+                             *tb2    = (_HYTextBox*)components(7);
+
+                if (f>=6) {
+                    if (*option < 6)
+                        l3->SetForeColor((_HYColor) {
+                        0,0,0
+                    });
+
+                    l3->SetText(" Resample M");
+                    tb2->SetText(tb2->GetText(), true);
+                    lastState = -2;
+                } else {
+                    l3->SetText(" Not applicable");
+                    l3->SetForeColor((_HYColor) {
+                        127,127,127
+                    });
+                    l3->_MarkForUpdate();
+                    tb2->SetForeColor   ((_HYColor) {
+                        255,255,255
+                    });
+                }
+
+                if (f<2) {
+                    if ((*option > 2)||(*option < 0)) {
+                        l2->SetText(" Not applicable");
+                        l2->SetForeColor((_HYColor) {
+                            127,127,127
+                        });
+                        l2->_MarkForUpdate();
+                        tb1->SetForeColor   ((_HYColor) {
+                            255,255,255
+                        });
+                        ((_HYButton*)components(1))->EnableButton (true);
+                        lastState = -2;
+                    }
+                } else {
+                    if (*option < 2)
+                        l2->SetForeColor((_HYColor) {
+                        0,0,0
+                    });
+
+                    if (f==3) {
+                        l2->SetText(" Chi^2 significance (0-1)");
+                    } else if (f>=6) {
+                        l2->SetText(" Sample N");
+                    } else {
+                        l2->SetText(" Log(L) difference (>0)");
+                    }
+
+                    l2->_MarkForUpdate();
+                    tb1->SetText(tb1->GetText(), true);
+                }
+
+                *option = f;
+
+                tb1->EnableTextEdit (f>2);
+                tb2->EnableTextEdit (f>5);
+            }
+        }
+        done = true;
+    }
+
+    if (done) {
+        DeleteObject (e);
+        return true;
+    }
+    return _HYTWindow::ProcessEvent(e);
+}
+
+//__________________________________________________________
+
+bool         lProfileNormPlot   = true;
+long         lProfileIntervals  = 16;
+_Parameter   lProfileLB         = 0.;
+_Parameter   lProfileUB         = 1.;
+
+//__________________________________________________________
+
+_HYLProfDialog::_HYLProfDialog (bool*res,_Parameter*lb,_Parameter*ub,long*st,bool*np,_Parameter ml,_Parameter lbv,_Parameter ubv,Ptr parWindow):
+    _HYTWindow ("Likelihood Profile Options", false, true, parWindow)
+{
+    result          = res;
+    left            = lb;
+    right           = ub;
+    mle             = ml;
+    intervals       = st;
+    doNorm          = np;
+    vlb             = lbv;
+    vub             = ubv;
+
+
+    _HYRect         canvasSettings = {30,230,30,230,HY_COMPONENT_NO_SCROLL|HY_COMPONENT_TRANSP_BG};
+
+    _HYLabel*       l1      = new _HYLabel (canvasSettings, GetOSWindowData());
+    _HYLabel*       l2      = new _HYLabel (canvasSettings, GetOSWindowData());
+    _HYLabel*       l3      = new _HYLabel (canvasSettings, GetOSWindowData());
+
+
+    canvasSettings.left = canvasSettings.right = 111;
+
+    _HYTextBox  *   tb1     = new _HYTextBox  (canvasSettings, GetOSWindowData());
+    _HYTextBox  *   tb2     = new _HYTextBox  (canvasSettings, GetOSWindowData());
+    _HYTextBox  *   tb3     = new _HYTextBox  (canvasSettings, GetOSWindowData());
+
+    canvasSettings.left = canvasSettings.right = 260;
+    _HYButton*      b1      = new _HYButton (canvasSettings, GetOSWindowData());
+    canvasSettings.left = canvasSettings.right = 81;
+    _HYButton*      b2      = new _HYButton (canvasSettings, GetOSWindowData());
+
+    canvasSettings.left = canvasSettings.right = 340;
+
+    _HYCheckbox*    cb      = new _HYCheckbox (canvasSettings, GetOSWindowData());
+
+    tb1->SetMessageRecipient (this);
+    tb2->SetMessageRecipient (this);
+    tb3->SetMessageRecipient (this);
+    cb ->SetMessageRecipient (this);
+    b1 ->SetMessageRecipient (this);
+    b2 ->SetMessageRecipient (this);
+
+    AddObject (tb1); // 0
+    AddObject (tb2); // 1
+    AddObject (tb3); // 2
+
+    AddObject (b1);  // 3
+    AddObject (b2);  // 4
+
+    AddObject (l1);  // 5
+    AddObject (l2);  // 6
+    AddObject (l3);  // 7
+
+    AddObject (cb);  // 8
+
+
+    keyboardFocusChain << 0;
+    keyboardFocusChain << 1;
+    keyboardFocusChain << 2;
+
+    SetTableDimensions (5,2);
+
+    SetCell   (0,0,l1);
+    SetCell   (0,1,tb1);
+
+    SetCell   (1,0,l2);
+    SetCell   (1,1,tb2);
+
+    SetCell   (2,0,l3);
+    SetCell   (2,1,tb3);
+
+    SetCell   (3,0,cb);
+    SetCell   (3,1,cb);
+
+    SetCell   (4,0,b1);
+    SetCell   (4,1,b2);
+
+
+    _HYFont  labelFont;
+    SetDefaultDialogFont(labelFont);
+
+    l1->SetFont (labelFont);
+    l2->SetFont (labelFont);
+    l3->SetFont (labelFont);
+    cb->SetFont (labelFont);
+
+    b1->SetFont (labelFont);
+    b2->SetFont (labelFont);
+
+    l1->SetText (_String(" Lower Bound [") & vlb & ',' & mle & ']' );
+    l2->SetText (_String(" Upper Bound [") & mle & ',' & vub & ']' );
+    l3->SetText (" Plot Points");
+    cb->SetText ("Show Quadratic Log-Likelihood Approximation");
+
+    tb1->SetFont (labelFont);
+    tb2->SetFont (labelFont);
+    tb3->SetFont (labelFont);
+
+    l1 ->SetAlignFlags (HY_ALIGN_LEFT);
+    l2 ->SetAlignFlags (HY_ALIGN_LEFT);
+    l3 ->SetAlignFlags (HY_ALIGN_LEFT);
+    cb ->SetAlignFlags (HY_ALIGN_LEFT);
+
+    tb1->SetAlignFlags (HY_ALIGN_LEFT);
+    tb2->SetAlignFlags (HY_ALIGN_LEFT);
+    tb3->SetAlignFlags (HY_ALIGN_LEFT);
+
+    b1->SetAlignFlags (HY_ALIGN_RIGHT);
+    b1->SetText       ("  OK  ");
+    b1->SetButtonKind (HY_BUTTON_OK);
+    b1->EnableButton  (false);
+    b2->SetText       (" Cancel ");
+    b2->SetButtonKind (HY_BUTTON_CANCEL);
+
+    cb->SetState      (lProfileNormPlot,  false);
+    tb3->SetText      (lProfileIntervals, false);
+    tb1->SetText      (lProfileLB, true);
+    tb2->SetText      (lProfileUB, true);
+
+    lastState[0] = -1;
+    lastState[1] = -1;
+    lastState[2] = -1;
+
+    _HYRect             dim = MinMaxWindowDimensions();
+
+    SetWindowRectangle  (0,0,dim.bottom,dim.right);
+    CenterWindow        (this);
+
+    *intervals = lProfileIntervals;
+
+    DeleteObject (l1);
+    DeleteObject (l2);
+    DeleteObject (l3);
+    DeleteObject (tb1);
+    DeleteObject (tb2);
+    DeleteObject (tb3);
+    DeleteObject (cb);
+    DeleteObject (b1);
+    DeleteObject (b2);
+}
+
+//__________________________________________________________
+
+bool    _HYLProfDialog::ProcessEvent (_HYEvent* e)
+{
+    bool        done = false;
+    _String     firstArg;
+    long        i,f;
+
+    if (e->EventClass()==_hyButtonPushEvent) {
+        firstArg = e->EventCode().Cut (0,(f=e->EventCode().Find(','))-1);
+        i = MatchComponentID (firstArg);
+
+        if (i==3) { // OK
+            *result          = true;
+            lProfileNormPlot = *doNorm = ((_HYCheckbox*)components (8))->GetState();
+            lProfileIntervals= *intervals;
+            lProfileLB       = *left;
+            lProfileUB       = *right;
+            postWindowCloseEvent (GetID());
+        } else if (i==4) { // Cancel
+            *result = false;
+            postWindowCloseEvent (GetID());
+        }
+
+        done = true;
+    } else if (e->EventClass()==_hyTextEditChange) {
+        firstArg = e->EventCode().Cut (0,(f=e->EventCode().Find(','))-1);
+        i = MatchComponentID (firstArg);
+        f =  e->EventCode().Cut(f+1,-1).toNum();
+
+        if (f) {
+            bool         good;
+            _HYTextBox*  myTB = (_HYTextBox*)components(i);
+
+            switch (i) {
+            case 0:
+                *left = myTB->GetText().toNum();
+                if (*left>=vlb && *left<=mle && *left<*right) {
+                    good = true;
+                } else {
+                    good = false;
+                }
+                break;
+            case 1:
+                *right = myTB->GetText().toNum();
+                if (*right>=mle && *right<=vub && *left<*right) {
+                    good = true;
+                } else {
+                    good = false;
+                }
+                break;
+            case 2: {
+                _Parameter temp = myTB->GetText().toNum();
+                if (temp>2 && CheckEqual(ceil(temp),temp)) {
+                    *intervals = temp;
+                    good = true;
+                } else {
+                    good = false;
+                }
+                break;
+            }
+            }
+
+            if (good!=lastState[i]) {
+                ((_HYButton*)components(3))->EnableButton (good);
+                myTB->SetForeColor ((_HYColor) {
+                    good?0:127,good?127:0,0
+                });
+                lastState[i] = good;
+            }
+
+            done = true;
+        }
+    }
+
+    if (done) {
+        DeleteObject (e);
+        return true;
+    }
+    return _HYTWindow::ProcessEvent(e);
+}
+
+//__________________________________________________________
+
+long    defNewChartRows     = 4,
+        defNewChartColumns   = 4;
+
+//__________________________________________________________
+
+_HYNewChart::_HYNewChart (long* rows, long* columns, bool* res, _String* chartTitle):_HYTWindow ("New Chart Window Setup", false, true)
+{
+
+    //long          index,
+    //              cellWidth;
+
+    result   = res;
+    resR     = rows;
+    resC     = columns;
+    title    = chartTitle;
+
+    _HYRect         canvasSettings = {30,150,30,150,HY_COMPONENT_NO_SCROLL|HY_COMPONENT_TRANSP_BG};
+
+    _HYLabel*       l1      = new _HYLabel (canvasSettings, GetOSWindowData());
+    _HYLabel*       l2      = new _HYLabel (canvasSettings, GetOSWindowData());
+    _HYLabel*       l3      = new _HYLabel (canvasSettings, GetOSWindowData());
+    _HYLabel*       l4      = new _HYLabel (canvasSettings, GetOSWindowData());
+
+
+    canvasSettings.left = canvasSettings.right = 151;
+
+    _HYTextBox  *   tb1     = new _HYTextBox  (canvasSettings, GetOSWindowData());
+    _HYTextBox  *   tb2     = new _HYTextBox  (canvasSettings, GetOSWindowData());
+    _HYTextBox  *   tb3     = new _HYTextBox  (canvasSettings, GetOSWindowData());
+    _HYPullDown *   p1      = new _HYPullDown (canvasSettings, GetOSWindowData());
+    canvasSettings.left = canvasSettings.right = 220;
+    _HYButton*      b1      = new _HYButton (canvasSettings, GetOSWindowData());
+    canvasSettings.left = canvasSettings.right = 81;
+    _HYButton*      b2      = new _HYButton (canvasSettings, GetOSWindowData());
+
+    tb1->SetMessageRecipient (this);
+    tb2->SetMessageRecipient (this);
+    tb3->SetMessageRecipient (this);
+    b1 ->SetMessageRecipient (this);
+    b2 ->SetMessageRecipient (this);
+    p1 ->SetMessageRecipient (this);
+
+    AddObject (tb1); // 0
+    AddObject (tb2); // 1
+    AddObject (tb3); // 2
+
+    AddObject (b1);  // 3
+    AddObject (b2);  // 4
+
+    AddObject (l1);  // 5
+    AddObject (l2);  // 6
+    AddObject (l3);  // 7
+    AddObject (l4);  // 8
+
+    AddObject (p1);  // 9
+
+
+    keyboardFocusChain << 0;
+    keyboardFocusChain << 1;
+    keyboardFocusChain << 2;
+
+    SetTableDimensions (5,2);
+
+    SetCell   (0,0,l1);
+    SetCell   (0,1,tb1);
+
+    SetCell   (1,0,l2);
+    SetCell   (1,1,tb2);
+
+    SetCell   (2,0,l3);
+    SetCell   (2,1,tb3);
+
+    SetCell   (3,0,l4);
+    SetCell   (3,1,p1);
+
+    SetCell   (4,0,b1);
+    SetCell   (4,1,b2);
+
+
+    _HYFont  labelFont;
+    SetDefaultDialogFont(labelFont);
+
+    l1->SetFont (labelFont);
+    l2->SetFont (labelFont);
+    l3->SetFont (labelFont);
+    l4->SetFont (labelFont);
+
+    b1->SetFont (labelFont);
+    b2->SetFont (labelFont);
+
+    l1->SetText (" Series (Columns)");
+    l2->SetText (" Data Points (Rows)");
+    l3->SetText (" Window Title");
+    l4->SetText (" Spawn from Matrix");
+
+    tb1->SetText(defNewChartColumns);
+    tb2->SetText(defNewChartRows);
+    tb3->SetText(*title);
+
+    tb1->SetFont (labelFont);
+    tb2->SetFont (labelFont);
+    tb3->SetFont (labelFont);
+
+    l1 ->SetAlignFlags (HY_ALIGN_LEFT);
+    l2 ->SetAlignFlags (HY_ALIGN_LEFT);
+    l3 ->SetAlignFlags (HY_ALIGN_LEFT);
+    l4 ->SetAlignFlags (HY_ALIGN_LEFT);
+    p1 ->SetAlignFlags (HY_ALIGN_LEFT);
+    tb1->SetAlignFlags (HY_ALIGN_LEFT);
+    tb2->SetAlignFlags (HY_ALIGN_LEFT);
+    tb3->SetAlignFlags (HY_ALIGN_LEFT);
+
+    b1->SetAlignFlags (HY_ALIGN_RIGHT);
+
+    b1->SetText       ("  OK  ");
+    b1->SetButtonKind (HY_BUTTON_OK);
+    b2->SetText       (" Cancel ");
+    b2->SetButtonKind (HY_BUTTON_CANCEL);
+
+    p1->AddMenuItem   (none,-1);
+
+    _List   mxNames;
+
+#ifndef USE_AVL_NAMES
+    for (long k=0; k<variableNames.lLength; k++)
+#else
+    _SimpleList tcache;
+    long        vi,
+                k = variableNames.Traverser (tcache,vi,variableNames.GetRoot());
+
+    for (; k>=0; k = variableNames.Traverser (tcache,vi))
+#endif
+    {
+        _Variable * thisV = FetchVar (k);
+        if (thisV->ObjectClass () == MATRIX) {
+            mxNames && thisV->GetName();
+        }
+    }
+
+    if (mxNames.lLength) {
+        p1->AddMenuItem (menuSeparator,-1);
+        mxNames.Sort();
+        for (long kk=0; kk<mxNames.lLength; kk++) {
+            p1->AddMenuItem (*(_String*)mxNames(kk),-1);
+        }
+        p1->EnableMenu(true);
+    } else {
+        p1->EnableMenu(false);
+    }
+
+
+    ProcessEvent (generateKeyboardFocusEvent (tb1->GetID()));
+
+    DeleteObject (l1);
+    DeleteObject (l2);
+    DeleteObject (l3);
+    DeleteObject (l4);
+    DeleteObject (tb1);
+    DeleteObject (tb2);
+    DeleteObject (tb3);
+    DeleteObject (b1);
+    DeleteObject (b2);
+    DeleteObject (p1);
+
+    _HYRect     dim = MinMaxWindowDimensions();
+
+    SetWindowRectangle  (0,0,dim.bottom,dim.right);
+    CenterWindow        (this);
+}
+
+//__________________________________________________________
+
+bool    _HYNewChart::ProcessEvent (_HYEvent* e)
+{
+    bool        done = false;
+    _String     firstArg;
+    long        i,f;
+
+    if (e->EventClass()==_hyButtonPushEvent) {
+        firstArg = e->EventCode().Cut (0,(f=e->EventCode().Find(','))-1);
+        i = MatchComponentID (firstArg);
+
+        if (i==3) { // OK
+            f = ((_HYPullDown*)components (9))->GetSelection();
+            if (f) {
+                *resR = -LocateVarByName (*(_String*)(((_HYPullDown*)components (9))->GetMenuItem(f)));
+                if (*resR>0) {
+                    *result = true;
+                    postWindowCloseEvent (GetID());
+                }
+            } else {
+                *resC = defNewChartColumns= ((_HYTextBox*)components (0))->GetText().toNum();
+                *resR = defNewChartRows   = ((_HYTextBox*)components (1))->GetText().toNum();
+            }
+            *title= ((_HYTextBox*)components (2))->GetText();
+            *result = true;
+            postWindowCloseEvent (GetID());
+        } else if (i==4) { // Cancel
+            *result = false;
+            postWindowCloseEvent (GetID());
+        }
+
+        done = true;
+    } else if (e->EventClass()==_hyTextEditChange) {
+        firstArg = e->EventCode().Cut (0,(f=e->EventCode().Find(','))-1);
+        i        = MatchComponentID (firstArg);
+
+        if ((i==0)||(i==1)||(i==2)) {
+            _HYButton* okButton     = (_HYButton*)components  (3);
+            _String    textField    = ((_HYTextBox*)components (i))->GetText();
+            if (i<2) {
+                _Parameter fieldValue   = textField.toNum();
+
+                if ((fieldValue>0.0)&&(fieldValue == (long) (fieldValue))) {
+                    done = true;
+                }
+            } else {
+                done = (textField.FirstNonSpaceIndex (0,-1,1)!=-1);
+            }
+
+            okButton->EnableButton (done);
+        }
+
+        done = true;
+    } else if (e->EventClass()==_hyMenuSelChangeEvent) {
+        firstArg = e->EventCode().Cut (0,(f=e->EventCode().Find(','))-1);
+        f        = e->EventCode().Cut (f+1,-1).toNum();
+        i        = MatchComponentID (firstArg);
+
+        if (i==9) {
+            if (f==0) {
+                ((_HYTextBox*)components (0))->EnableTextEdit (true);
+                ((_HYTextBox*)components (1))->EnableTextEdit (true);
+            } else {
+                firstArg = *(_String*)((_HYPullDown*)components (9))->GetMenuItem(f);
+                ((_HYTextBox*)components (2))->SetText(firstArg,true);
+
+                _Matrix *   nt =  (_Matrix*)FetchVar(LocateVarByName(firstArg))->GetValue();
+
+                firstArg = nt->GetVDim();
+                ((_HYTextBox*)components (0))->EnableTextEdit (false);
+                ((_HYTextBox*)components (0))->SetText        (firstArg,true);
+                firstArg = nt->GetHDim();
+                ((_HYTextBox*)components (1))->EnableTextEdit (false);
+                ((_HYTextBox*)components (1))->SetText        (firstArg,true);
+            }
+        }
+        done = true;
+    }
+
+    if (done) {
+        DeleteObject (e);
+        return true;
+    }
+    return _HYTWindow::ProcessEvent(e);
+}
+
+//__________________________________________________________
+
+long    defTreeHPages       = 1,
+        defTreeVPages       = 1;
+
+//__________________________________________________________
+
+_HYTreePrintPrefs::_HYTreePrintPrefs (long* columns, long* rows, bool* res, Ptr parent):_HYTWindow ("Tree Printing Prefs", false, true, parent)
+{
+    result   = res;
+    resH     = rows;
+    resW     = columns;
+
+    _HYRect         canvasSettings = {30,150,30,150,HY_COMPONENT_NO_SCROLL|HY_COMPONENT_TRANSP_BG};
+
+    _HYLabel*       l1      = new _HYLabel (canvasSettings, GetOSWindowData());
+    _HYLabel*       l2      = new _HYLabel (canvasSettings, GetOSWindowData());
+
+    canvasSettings.left = canvasSettings.right = 151;
+
+    _HYTextBox  *   tb1     = new _HYTextBox  (canvasSettings, GetOSWindowData());
+    _HYTextBox  *   tb2     = new _HYTextBox  (canvasSettings, GetOSWindowData());
+
+    canvasSettings.left = canvasSettings.right = 220;
+    _HYButton*      b1      = new _HYButton (canvasSettings, GetOSWindowData());
+    canvasSettings.left = canvasSettings.right = 81;
+    _HYButton*      b2      = new _HYButton (canvasSettings, GetOSWindowData());
+
+    tb1->SetMessageRecipient (this);
+    tb2->SetMessageRecipient (this);
+    b1 ->SetMessageRecipient (this);
+    b2 ->SetMessageRecipient (this);
+
+    AddObject (tb1); // 0
+    AddObject (tb2); // 1
+
+    AddObject (b1);  // 2
+    AddObject (b2);  // 3
+
+    AddObject (l1);  // 4
+    AddObject (l2);  // 5
+
+
+    keyboardFocusChain << 0;
+    keyboardFocusChain << 1;
+
+    SetTableDimensions (3,2);
+
+    SetCell   (0,0,l1);
+    SetCell   (0,1,tb1);
+
+    SetCell   (1,0,l2);
+    SetCell   (1,1,tb2);
+
+    SetCell   (2,0,b1);
+    SetCell   (2,1,b2);
+
+
+    _HYFont  labelFont;
+    SetDefaultDialogFont(labelFont);
+
+    l1->SetFont (labelFont);
+    l2->SetFont (labelFont);
+
+    b1->SetFont (labelFont);
+    b2->SetFont (labelFont);
+
+    l1->SetText (" Pages Wide (0 = Auto)");
+    l2->SetText (" Pages Height (0 = Auto)");
+
+    tb1->SetText(defTreeHPages);
+    tb2->SetText(defTreeVPages);
+
+    tb1->SetFont (labelFont);
+    tb2->SetFont (labelFont);
+
+    l1 ->SetAlignFlags (HY_ALIGN_LEFT);
+    l2 ->SetAlignFlags (HY_ALIGN_LEFT);
+    tb1->SetAlignFlags (HY_ALIGN_LEFT);
+    tb2->SetAlignFlags (HY_ALIGN_LEFT);
+
+    b1->SetAlignFlags (HY_ALIGN_RIGHT);
+
+    b1->SetText       ("  OK  ");
+    b1->SetButtonKind (HY_BUTTON_OK);
+    b2->SetText       (" Cancel ");
+    b2->SetButtonKind (HY_BUTTON_CANCEL);
+
+    ProcessEvent (generateKeyboardFocusEvent (tb1->GetID()));
+
+    DeleteObject (l1);
+    DeleteObject (l2);
+    DeleteObject (tb1);
+    DeleteObject (tb2);
+    DeleteObject (b1);
+    DeleteObject (b2);
+
+    _HYRect     dim = MinMaxWindowDimensions();
+
+    SetWindowRectangle  (0,0,dim.bottom,dim.right);
+    CenterWindow        (this);
+}
+
+//__________________________________________________________
+
+bool    _HYTreePrintPrefs::ProcessEvent (_HYEvent* e)
+{
+    bool        done = false;
+    _String     firstArg;
+    long        i,f;
+
+    if (e->EventClass()==_hyButtonPushEvent) {
+        firstArg = e->EventCode().Cut (0,(f=e->EventCode().Find(','))-1);
+        i = MatchComponentID (firstArg);
+
+        if (i==2) { // OK
+            *resW = defTreeHPages   = ((_HYTextBox*)components (0))->GetText().toNum();
+            *resH = defTreeVPages   = ((_HYTextBox*)components (1))->GetText().toNum();
+            *result = true;
+            postWindowCloseEvent (GetID());
+        } else if (i==3) { // Cancel
+            *result = false;
+            postWindowCloseEvent (GetID());
+        }
+
+        done = true;
+    } else if (e->EventClass()==_hyTextEditChange) {
+        firstArg = e->EventCode().Cut (0,(f=e->EventCode().Find(','))-1);
+        i        = MatchComponentID (firstArg);
+
+        if ((i==0)||(i==1)) {
+            _HYButton* okButton     = (_HYButton*)components  (3);
+            _String    textField    = ((_HYTextBox*)components (i))->GetText();
+
+            _Parameter fieldValue   = textField.toNum();
+            if ((fieldValue>=0.0)&&(fieldValue == (long) (fieldValue))) {
+                done = true;
+            }
+
+            okButton->EnableButton (done);
+        }
+
+        done = true;
+    }
+
+    if (done) {
+        DeleteObject (e);
+        return true;
+    }
+    return _HYTWindow::ProcessEvent(e);
+}
+
+//_________________________________________________________________________
+bool    OpenTreeFile (void)
+{
+    static  long openTreeCounter = 1;
+    if (!PopUpFileDialog("HY-PHY Open: Choose a tree file")) {
+        return false;
+    }
+
+    SetStatusLine ("Reading Tree");
+    char c;
+
+    FILE *f = doFileOpen (argFileName->getStr(), "r", true);
+    if (!f) {
+        return false;
+    }
+
+    while (!feof(f))
+        // guess what type of file this is
+    {
+        if (!isspace(c = fgetc (f))) {
+            if (c!='(') {
+                if (c=='#') {
+                    char checkNxs [6] = {toupper(fgetc (f)),toupper(fgetc (f)),toupper(fgetc (f)),toupper(fgetc (f)),toupper(fgetc (f)),'\0'},
+                                        nxs[6] = "NEXUS";
+
+                    if (strcmp (nxs,checkNxs) == 0)
+                        // NEXUS
+                    {
+                        c = 3;
+                        rewind (f);
+                    }
+                } else { // HBL
+                    c = 2;
+                }
+            } else { // Newick
+                c = 1;
+            }
+
+            break;
+        }
+    }
+
+    if (feof(f)) {
+        c=0;    // fail
+    }
+
+    long stashLMD = lastMatrixDeclared;
+    lastMatrixDeclared = -1;
+
+    if (c==2) {
+        fclose (f);
+        if (OpenBatchFile (false)) {
+            ExecuteBatchFile();
+        }
+        lastMatrixDeclared = stashLMD;
+        return true;
+    } else if (c==1) {
+        unsigned long cfp = (unsigned long)ftell(f),
+                      ssi = _String::storageIncrement;
+
+        fseek (f,0,SEEK_END);
+        _String::storageIncrement = ftell(f)-cfp+1;
+        _String treeString (16L,true);
+        fseek (f,cfp,SEEK_SET);
+
+
+        treeString<<'(';
+        long levelCounter = 1;
+        while (!feof(f) && levelCounter ) {
+            c = fgetc (f);
+            if (c=='(') {
+                levelCounter++;
+            } else if (c==')') {
+                levelCounter--;
+            }
+            treeString<<c;
+        }
+        treeString.Finalize();
+        _String::storageIncrement = ssi;
+
+        if (levelCounter == 0) {
+            _String treeName = _String("Tree_") & openTreeCounter++ ;
+
+            _HYTreePanel* newTreePanel = new _HYTreePanel (treeName, treeString);
+            newTreePanel->_Zoom (true);
+            newTreePanel->BringToFront();
+        } else {
+            WarnError ("Imbalanced parentheses in the Newick string file");
+        }
+    } else if (c==3) {
+        DeleteObject (ReadDataSetFile (f));
+        if (!terminateExecution) {
+            _String readTrees (1024L, true);
+            readTrees << "UseModel(USE_NO_MODEL);\nfor (i=0; i<Rows(";
+            readTrees << nexusFileTreeMatrix;
+            readTrees << "); i=i+1)\n\t{\n\tdefineTreeString=\"Tree \"+";
+            readTrees << nexusFileTreeMatrix;
+            readTrees << "[i][0] +\" = \" +";
+            readTrees << nexusFileTreeMatrix;
+            readTrees << "[i][1]+\";\";\n\tExecuteCommands (defineTreeString);OpenWindow (TREEWINDOW,{{";
+            readTrees << nexusFileTreeMatrix;
+            readTrees <<"[i][0]}},\"(SCREEN_WIDTH-50)/2;(SCREEN_HEIGHT-50)/2;(20+i*20)%(SCREEN_WIDTH$2);(45+i*20)%(SCREEN_HEIGHT$2)\");\n\t}";
+            readTrees.Finalize();
+            _ExecutionList el (readTrees);
+            el.Execute();
+        }
+        terminateExecution = false;
+    }
+
+    fclose (f);
+    SetStatusLine ("Idle");
+    lastMatrixDeclared = stashLMD;
+    return true;
+}
+
+//_________________________________________________________________________
+bool    OpenTextFile (void)
+{
+    if (!PopUpFileDialog("HY-PHY Open: Choose a text file")) {
+        return false;
+    }
+
+    FILE *f = doFileOpen (argFileName->getStr(), "r");
+    SetStatusLine ("Reading File");
+    if (!f) {
+        _String errMsg ("Could not read the file:");
+        errMsg = errMsg & *argFileName;
+        WarnError (errMsg);
+        return false;
+    }
+    BufferToConsole ("\n\n");
+
+    char  * buffer = MemAllocate (65536);
+    while (!feof(f)) {
+        buffer  [fread(buffer,1,65535,f)] = 0;
+        BufferToConsole (buffer);
+        handleGUI();
+    }
+    free (buffer);
+    BufferToConsole ("\n\n");
+    fclose (f);
+    SetStatusLine ("Idle");
+    return true;
+}
+
+
+//_________________________________________________________________________
+bool    OpenDataFile (_String* defLoc)
+{
+    if (!PopUpFileDialog("HY-PHY Open: Choose a sequence file",defLoc)) {
+        return false;
+    }
+
+    char    c            = GetPlatformDirectoryChar();
+    _String dataFileName = *argFileName,
+            tryName;
+
+    dataFileName.Trim (dataFileName.FindBackwards(c,0,-1)+1,-1);
+    c = '.';
+    dataFileName.Trim (0,dataFileName.FindBackwards(c,0,-1)-1);
+    dataFileName.ConvertToAnIdent();
+
+    if (dataFileName.sLength==0) {
+        dataFileName = "DataSet_";
+    }
+    FindUnusedObjectName (dataFileName,tryName,dataSetNamesList);
+    dataFileName = tryName;
+    _String BLCommand ("DataSet ");
+    BLCommand = BLCommand & dataFileName & " = ReadDataFile (\""& * argFileName
+                &"\");";
+    _ExecutionList      ex (BLCommand);
+    ex.Execute();
+    SetStatusLine ("Idle");
+    long k = dataSetNamesList.Find(&dataFileName);
+    if (k>=0) {
+        _DataSet* theDS = (_DataSet*)dataSetList (k);
+        if (theDS->NoOfSpecies()>0 && theDS->NoOfColumns()>0) {
+            // test the new data panel GUI
+            _String dfHandler (128L, true);
+            dfHandler << "if (Rows(";
+            dfHandler << dataFilePartitionMatrix;
+            dfHandler << ")==2){\n\tfor (counter = 0; counter <Columns(";
+            dfHandler << dataFilePartitionMatrix;
+            dfHandler << "); counter = counter+1){\n\tcommandString = \"DataSetFilter \"+";
+            dfHandler << dataFilePartitionMatrix;
+            dfHandler << "[0][counter] + \" = CreateFilter (";
+            dfHandler << dataFileName;
+            dfHandler << ",1,\\\"\"+";
+            dfHandler << dataFilePartitionMatrix;
+            dfHandler << "[1][counter] + \"\\\")\";\n\tExecuteCommands (commandString);\n}\n}";
+
+            dfHandler.Finalize();
+
+            ExecuteBLString (dfHandler,nil);
+
+            _HYDataPanel* myTWindow = new _HYDataPanel(dataFileName, dataFileName);
+            myTWindow->SetFilePath (*argFileName);
+            myTWindow->BringToFront();
+
+            _FString * v  = (_FString*)FetchObjectFromVariableByType (&dataFileTreeString, STRING);
+            _Matrix  * m  = (_Matrix*)FetchObjectFromVariableByType (&nexusFileTreeMatrix,MATRIX);
+
+            _String  treeBuilder (128L,1);
+
+            if (v) {
+                tryName = dataFileName & "_tree";
+                FindUnusedObjectName (dataFileName,tryName,variableNames);
+                treeBuilder << (_String ("Tree ")&tryName&'='&dataFileTreeString&';');
+            }
+            if (m) {
+                _List treeStrings;
+                m->FillInList (treeStrings);
+                for (long s = 0; s < treeStrings.lLength; s+=2) {
+                    tryName = dataFileName & "_" & *(_String*)treeStrings(s) ;
+                    FindUnusedObjectName (dataFileName,tryName,variableNames);
+                    treeBuilder << (_String ("Tree ")&tryName&'='&*(_String*)treeStrings(s+1) & ';');
+                }
+            }
+            treeBuilder.Finalize();
+            ExecuteBLString (treeBuilder,nil);
+
+            return true;
+            // execute the handler for opening data-set defined partitions
+        }
+        dataSetNamesList.Delete (k);
+        dataSetList.Delete (k);
+    }
+    dataFileName = _String('"')&dataFileName&"\" does not appear to be a valid sequence data file";
+    WarnError (dataFileName);
+    terminateExecution = false;
+    return true;
+}
+
+//____________________________________________________________________________________
+
+void    NewModel (_String* model)
+{
+    long        mDim,
+                gCode,
+                pl1;
+
+    _String     s1;
+    _HYModelWindowDialog* newModel = new _HYModelWindowDialog (&mDim,&gCode,&s1,&pl1);
+    if (model) {
+        newModel->SetModelChoice (model);
+    }
+
+    newModel->BringToFront();
+    while (windowObjectRefs.Find ((long)newModel)>=0) {
+        handleGUI();
+    }
+
+    if (mDim>0) {
+        _HYModelWindow* newMdl = SpawnNewModel (mDim, gCode, s1, pl1);
+        if (newMdl) {
+            newMdl->BringToFront();
+        }
+    }
+}
+
+//____________________________________________________________________________________
+
+bool    TreePrintSetup (long& pW, long& pH, Ptr parent)
+{
+    bool        resB        = false;
+
+    _HYTreePrintPrefs* tps = new _HYTreePrintPrefs (&pW,&pH,&resB,parent);
+
+    tps->BringToFront();
+    while (windowObjectRefs.Find ((long)tps)>=0) {
+        handleGUI();
+    }
+
+    return      resB;
+}
+
+
+//____________________________________________________________________________________
+
+bool    HandleCIDialog (char& opt, _Parameter& sig, _Parameter & sig2, Ptr parent)
+{
+    bool        resB        = false;
+
+    _HYCIDialog* cid = new _HYCIDialog (&resB,&opt,&sig,&sig2,parent);
+
+    cid->BringToFront();
+    while (windowObjectRefs.Find ((long)cid)>=0) {
+        handleGUI();
+    }
+
+    return      resB;
+}
+
+//____________________________________________________________________________________
+
+bool    HandlePLDialog (_Parameter& lb, _Parameter& ub, long& ivals, bool& donorm, _Parameter mle, Ptr parent)
+{
+    bool        resB        = false;
+
+    _HYLProfDialog* lpd = new _HYLProfDialog (&resB,&lb,&ub,&ivals,&donorm,mle,lb,ub,parent);
+
+    lpd->BringToFront();
+    while (windowObjectRefs.Find ((long)lpd)>=0) {
+        handleGUI();
+    }
+
+    return      resB;
+}
+
+//____________________________________________________________________________________
+
+void    NewChartWindow (void)
+{
+    bool        resB        = false;
+    _String     windowTitle ("New Chart");
+    long r,
+         c;
+
+    _HYNewChart* nc = new _HYNewChart (&r,&c,&resB,&windowTitle);
+
+    nc->BringToFront();
+    while (windowObjectRefs.Find ((long)nc)>=0) {
+        handleGUI();
+    }
+
+    if  (resB) {
+        _List            columnHeaders;
+        _HYChartWindow * newChart = nil;
+        _Matrix        * vMx;
+
+        if (r<=0) {
+            _Variable* me = FetchVar (-r);
+            if ((!me) || (me->ObjectClass() != MATRIX)) {
+                return;
+            }
+
+            vMx =  (_Matrix*)me->Compute();
+            c = vMx->GetVDim();
+        }
+
+        for   (long k=1; k<=c; k++) {
+            _String thisCol = _String ("Series ") & k;
+            columnHeaders && & thisCol;
+        }
+
+        if (r<=0) {
+            newChart = new _HYChartWindow (windowTitle, columnHeaders, *vMx, nil);
+        } else {
+            _Matrix data (r,c,false,true);
+            newChart = new _HYChartWindow (windowTitle, columnHeaders, data, nil);
+        }
+        checkPointer (newChart);
+        newChart->BringToFront();
+    }
+}
+
+
+//_________________________________________________________________________
+bool    OpenTable (void)
+{
+    static bool        resC = false;
+    static char        sepC = ',';
+
+    if (!PopUpFileDialog("HY-PHY Open: Choose a table file")) {
+        return false;
+    }
+
+    SetStatusLine  ("Reading Data Table");
+
+    _Matrix        data;
+    _List          names;
+
+    if (!resC) {
+
+        _String        res,
+                       prompt ("Enter field separator"),
+                       cprompt("Don't show this dialog again");
+
+        _List          pulldown,
+                       charmeaning;
+
+        res = "Comma";
+        pulldown && & res;
+        res = "Tab";
+        pulldown && & res;
+        res = ',';
+        charmeaning && & res;
+        res = '\t';
+        charmeaning && & res;
+        res = ',';
+
+        long           msel;
+
+        if (!EnterStringDialogWithPulldown(res,prompt,cprompt,msel,pulldown,&charmeaning,resC,-1,nil)) {
+            SetStatusLine  ("Idle");
+            return false;
+        }
+
+        sepC = res.getChar(0);
+
+        if (ReadDataFromFile (*argFileName, sepC, data, names)) {
+            _HYChartWindow * cw = new _HYChartWindow (argFileName->Cut (argFileName->FindBackwards (":",0,-1)+1,-1), names, data, nil);
+            checkPointer (cw);
+            cw->BringToFront();
+        }
+    }
+
+    SetStatusLine  ("Idle");
+    return true;
+}
+
+//_________________________________________________________________________
+bool    OpenModelFile (_String* defLoc)
+{
+    if (!PopUpFileDialog("HY-PHY Open: Choose a model file",defLoc)) {
+        return false;
+    }
+
+    return OpenModelFromFile (*argFileName);
+}
+
+//_________________________________________________________________________
+bool    OpenDatabaseFile (_String* defLoc)
+{
+    if (!PopUpFileDialog("HY-PHY Open: Choose an SQLite database file",defLoc)) {
+        return false;
+    }
+
+    _HYDBWindow * testDBWindow = new _HYDBWindow (_String("SQLite file: ")&*argFileName,argFileName);
+    testDBWindow->BringToFront();
+    return true;
+}
+
+//_________________________________________________________________________
+bool    NewDatabaseFile (_String* defLoc)
+{
+    _String        str1 ("Save new database file to:"),
+                   str2 (defLoc?*defLoc:empty),
+                   filePath;
+
+    _List          menuOptions;
+    filePath = "SQLite file";
+    menuOptions && & filePath;
+    filePath = empty;
+
+
+    long menuSel = SaveFileWithPopUp (filePath, str1 ,str2 , empty, menuOptions);
+
+    if (menuSel>=0) {
+        FILE*   outFile = doFileOpen (filePath.sData,"w");
+        if (!outFile) {
+            str1 = filePath & " could not be opened for writing.";
+            ProblemReport (str1);
+            return false;
+        }
+        fclose (outFile);
+
+
+        _HYDBWindow * testDBWindow = new _HYDBWindow (_String("SQLite file: ")&filePath,&filePath);
+        testDBWindow->BringToFront();
+        return true;
+    }
+    return false;
+}
+
+//_________________________________________________________________________
+void    ShowMessagesLog (void)
+{
+    if (globalMessageFile) {
+        BufferToConsole ("\n\n_________________________<Log of Messages>______________________________\n\n");
+        _String mF (globalMessageFile);
+        rewind (globalMessageFile);
+        StringToConsole(mF);
+        BufferToConsole ("\n\n_________________________<End of Messages>______________________________\n\n");
+        fseek (globalMessageFile,0,SEEK_END);
+    } else {
+        BufferToConsole ("\nLog file was not open at startup (probably because HYPHY startup volume is read-only\n");
+    }
+}
+
+//_________________________________________________________________________
+
+void    ExecuteSelection (void)
+{
+    _HYTextBox * ob = (_HYTextBox*)hyphyConsoleWindow->GetObject (0);
+    _String    * sel;
+    ob->StoreText (sel,true);
+    if (sel->sLength) {
+        _ExecutionList exl (*sel);
+        exl.Execute();
+        terminateExecution = false;
+    }
+    DeleteObject (sel);
+}
+
+//_________________________________________________________________________
+
+long    FindWindowByName (_String & s)
+{
+    for (long i=0; i<windowObjects.lLength; i++) {
+        _HYWindow* thisWindow = (_HYWindow*)windowObjectRefs(i);
+        if (s.Equal(&thisWindow->_GetTitle())) {
+            return i;
+        }
+    }
+    return -1;
+}
+
+//_________________________________________________________________________
+
+_HYGuiObject*   FindWindowByNameAndOpen (_String & s)
+{
+    long f = FindWindowByName (s);
+    if (f>=0) {
+        _HYPlatformWindow* thisWindow = (_HYPlatformWindow*)windowObjects(f);
+        thisWindow->_Activate();
+        return (_HYGuiObject*)windowObjectRefs(f);
+    }
+    return nil;
+}
+
+//_________________________________________________________________________
+
+_HYGuiObject*   FindWindowByID (long ID)
+{
+    for (long i=0; i<windowObjects.lLength; i++) {
+        _HYWindow* thisWindow = (_HYWindow*)(windowObjectRefs.lData[i]);
+        if (thisWindow->MatchID(ID)) {
+            return thisWindow;
+        }
+    }
+    return nil;
+}
+//____________________________________________________________________________________________
+
+#ifdef __MAC__
+#include "Timer.h"
+
+void    yieldCPUTime(void)
+{
+    handleGUI(true);
+}
+#endif
+
+#ifdef __WINDOZE__
+#include        "Windows.h"
+#include        "preferences.h"
+#include        "HYSharedMain.h"
+#include        "HYPlatformWindow.h"
+
+extern  bool    hyphyExiting;
+
+void            yieldCPUTime     (void)
+{
+    MessageLoop();
+    if (hyphyExiting) {
+        WritePreferences    ();
+        ExitProcess(0);
+    }
+
+    while (isSuspended) {
+        MessageLoop(false,false);
+        if (hyphyExiting) {
+            WritePreferences    ();
+            ExitProcess         (0);
+        }
+    }
+}
+#endif
+
+#ifdef  __HYPHY_GTK__
+
+#include <gtk/gtk.h>
+void    yieldCPUTime (void)
+{
+    while (gtk_events_pending ()) {
+        gtk_main_iteration();
+    }
+}
+
+#endif
+
+
+
+//EOF
\ No newline at end of file
diff --git a/src/gui/HYEventTypes.cpp b/src/gui/HYEventTypes.cpp
new file mode 100644
index 0000000..f243c08
--- /dev/null
+++ b/src/gui/HYEventTypes.cpp
@@ -0,0 +1,362 @@
+/*
+ 
+ HyPhy - Hypothesis Testing Using Phylogenies.
+ 
+ Copyright (C) 1997-now
+ Core Developers:
+ Sergei L Kosakovsky Pond (spond at ucsd.edu)
+ Art FY Poon    (apoon at cfenet.ubc.ca)
+ Steven Weaver (sweaver at ucsd.edu)
+ 
+ Module Developers:
+ Lance Hepler (nlhepler at gmail.com)
+ Martin Smith (martin.audacis at gmail.com)
+ 
+ Significant contributions from:
+ Spencer V Muse (muse at stat.ncsu.edu)
+ Simon DW Frost (sdf22 at cam.ac.uk)
+ 
+ Permission is hereby granted, free of charge, to any person obtaining a
+ copy of this software and associated documentation files (the
+ "Software"), to deal in the Software without restriction, including
+ without limitation the rights to use, copy, modify, merge, publish,
+ distribute, sublicense, and/or sell copies of the Software, and to
+ permit persons to whom the Software is furnished to do so, subject to
+ the following conditions:
+ 
+ The above copyright notice and this permission notice shall be included
+ in all copies or substantial portions of the Software.
+ 
+ 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.
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ 
+ */
+
+#include "HYEventTypes.h"
+
+#ifdef    __HYPHYDMALLOC__
+#include "dmalloc.h"
+#endif
+
+_String  _hyScrollingEvent       ("Scroll");
+_String  _hyMenuSelChangeEvent   ("MenuChange");
+_String  _hyMenuOpenEvent        ("MenuOpen");
+_String  _hyButtonPushEvent      ("ButtonPush");
+_String  _hyRebuildSCanvasEvent  ("CanvasStretch");
+_String  _hyListChangeEvent      ("ListChange");
+_String  _hyListDblClickEvent    ("ListDClick");
+_String  _hyTableDblClickEvent   ("TableDClick");
+_String  _hyKeyboardFocusEvent   ("KeyboardFocus");
+_String  _hyTablePullDownEvent   ("TablePD");
+_String  _hyTableEditCellEvent   ("TableEdit");
+_String  _hyTableChangeSelEvent  ("TableChangeSel");
+_String  _hyTableResizeCEvent    ("TableResize");
+_String  _hyGlobalLFKillEvent    ("KillLF");
+_String  _hyGlobalLFSpawnEvent   ("SpawnLF");
+_String  _hyGlobalDFKillEvent    ("KillDF");
+_String  _hyGlobalDSKillEvent    ("KillDS");
+_String  _hyGlobalTreeKillEvent  ("KillTree");
+_String  _hyGlobalChangeEvent    ("Change");
+_String  _hyContextPopUp         ("CPopUp");
+_String  _hyTextEditChange       ("TEChange");
+_String  _hyGlobalCloseWindow    ("CW");
+_String  _hyGlobalChangeLF       ("CLF");
+_String  _hyGlobalChangeLFParams ("CLFP");
+_String  _hyGlobalSetTreePanelSelection
+("STPS");
+
+//____________________________________________________
+
+_HYEvent*   generateTablePullDownEvent (long objID, long index, long location)
+{
+    _String eventClass (_hyTablePullDownEvent),
+            eventData  (objID);
+    eventData = eventData & ','& _String (index) & ',' & _String (location);
+    return  new _HYEvent (eventClass,eventData);
+}
+
+//____________________________________________________
+
+_HYEvent*   generateTableChangeSelEvent (long objID)
+{
+    _String eventClass (_hyTableChangeSelEvent),
+            eventData  (objID);
+    return  new _HYEvent (eventClass,eventData);
+}
+
+//____________________________________________________
+
+_HYEvent*   generateTableEditCellEvent (long objID, long index)
+{
+    _String eventClass (_hyTableEditCellEvent),
+            eventData  (objID);
+    eventData = eventData & ','& _String (index);
+    return  new _HYEvent (eventClass,eventData);
+}
+
+//____________________________________________________
+
+_HYEvent*   generateTableResizeCEvent (long objID, long index, long shift)
+{
+    _String eventClass (_hyTableResizeCEvent),
+            eventData  (objID);
+    eventData = eventData & ','& _String (index) & ','& _String (shift);
+    return  new _HYEvent (eventClass,eventData);
+}
+
+//____________________________________________________
+
+_HYEvent*   generateScrollEvent (int h,int v,long objID)
+{
+    _String eventClass (_hyScrollingEvent),
+            eventData ((long)h);
+    eventData = eventData & ','& _String ((long)v);
+    if (objID>=0) {
+        eventData = _String (objID)&','&eventData;
+    }
+
+    return  new _HYEvent (eventClass,eventData);
+}
+
+//____________________________________________________
+
+_HYEvent*   generateMenuSelChangeEvent (long objID, long newSel)
+{
+    _String eventClass (_hyMenuSelChangeEvent),
+            eventData (objID);
+    eventData = eventData & ','& _String (newSel);
+    return  new _HYEvent (eventClass,eventData);
+}
+
+//____________________________________________________
+
+_HYEvent*   generateMenuOpenEvent (long objID)
+{
+    _String eventClass (_hyMenuOpenEvent),
+            eventData (objID);
+    return  new _HYEvent (eventClass,eventData);
+}
+
+//____________________________________________________
+
+_HYEvent*   generateListDblClickEvent (long objID, long newSel)
+{
+    _String eventClass (_hyListDblClickEvent),
+            eventData (objID);
+    eventData = eventData & ','& _String (newSel);
+    return  new _HYEvent (eventClass,eventData);
+}
+
+//____________________________________________________
+
+_HYEvent*   generateTableDblClickEvent (long objID)
+{
+    _String eventClass (_hyTableDblClickEvent),
+            eventData (objID);
+    return  new _HYEvent (eventClass,eventData);
+}
+
+//____________________________________________________
+
+_HYEvent*   generateRebuildSCanvas (long objID)
+{
+    _String eventClass (_hyRebuildSCanvasEvent),
+            eventData (objID);
+    return  new _HYEvent (eventClass,eventData);
+}
+
+//____________________________________________________
+
+_HYEvent*   generateButtonPushEvent (long objID, long newSel)
+{
+    _String eventClass (_hyButtonPushEvent),
+            eventData (objID);
+    eventData = eventData & ','& _String (newSel);
+    return  new _HYEvent (eventClass,eventData);
+}
+
+//____________________________________________________
+
+_HYEvent*   generateListChangeEvent (long objID)
+{
+    _String eventClass (_hyListChangeEvent),
+            eventData (objID);
+    return  new _HYEvent (eventClass,eventData);
+}
+
+//____________________________________________________
+
+_HYEvent*   generateKeyboardFocusEvent (long objID)
+{
+    _String eventClass (_hyKeyboardFocusEvent),
+            eventData (objID);
+    return  new _HYEvent (eventClass,eventData);
+}
+
+//____________________________________________________
+
+void    postLFKillEvent (long objID,long lfID)
+{
+    _String eventClass (_hyGlobalLFKillEvent),
+            eventData (objID);
+    eventData = eventData & ','& _String (lfID);
+    _HYEvent*
+    killEvent = new _HYEvent (eventClass,eventData);
+
+    GlobalGUIEventQueue << killEvent;
+}
+
+
+//____________________________________________________
+
+void    postLFSpawnEvent (long objID,long lfID)
+{
+    _String eventClass (_hyGlobalLFSpawnEvent),
+            eventData (objID);
+    eventData = eventData & ','& _String (lfID);
+    _HYEvent*
+    spawnEvent = new _HYEvent (eventClass,eventData);
+
+    GlobalGUIEventQueue << spawnEvent;
+}
+
+//____________________________________________________
+
+void    postDSKillEvent (long objID,long lfID)
+{
+    _String eventClass (_hyGlobalDSKillEvent),
+            eventData (objID);
+    eventData = eventData & ','& _String (lfID);
+    _HYEvent*
+    killEvent = new _HYEvent (eventClass,eventData);
+
+    GlobalGUIEventQueue << killEvent;
+}
+
+//____________________________________________________
+
+void    postTreeKillEvent (long objID,long lfID)
+{
+    _String eventClass (_hyGlobalTreeKillEvent),
+            eventData (objID);
+    eventData = eventData & ','& _String (lfID);
+    _HYEvent*
+    killEvent = new _HYEvent (eventClass,eventData);
+
+    GlobalGUIEventQueue << killEvent;
+}
+
+//____________________________________________________
+
+void    postDFKillEvent (long objID,long lfID)
+{
+    _String eventClass (_hyGlobalDFKillEvent),
+            eventData (objID);
+    eventData = eventData & ','& _String (lfID);
+    _HYEvent*
+    killEvent = new _HYEvent (eventClass,eventData);
+
+    GlobalGUIEventQueue << killEvent;
+}
+
+//____________________________________________________
+
+void    postObjectChangelEvent (long senderID,long objectKind, long objectID)
+{
+    _String eventClass (_hyGlobalChangeEvent),
+            eventData (senderID);
+    eventData = eventData & ','& _String ((objectKind<<28)+objectID);
+    _HYEvent*
+    killEvent = new _HYEvent (eventClass,eventData);
+
+    GlobalGUIEventQueue << killEvent;
+}
+
+//____________________________________________________
+
+_HYEvent*   generateContextPopUpEvent (long objID, long locH, long locV)
+{
+    _String eventClass (_hyContextPopUp),
+            eventData  (objID);
+    eventData = eventData & ','& _String (locH) & ',' & _String (locV);
+    return  new _HYEvent (eventClass,eventData);
+}
+
+//____________________________________________________
+
+_HYEvent*   generateTextEditChangeEvent (long objID, long mouseOrKey)
+{
+    _String eventClass (_hyTextEditChange),
+            eventData  (objID);
+    eventData = eventData & ','& _String (mouseOrKey);
+    return  new _HYEvent (eventClass,eventData);
+}
+
+//____________________________________________________
+
+void    postWindowCloseEvent (long senderID)
+{
+    _String eventClass (_hyGlobalCloseWindow),
+            eventData (senderID);
+    _HYEvent*
+    closeEvent = new _HYEvent (eventClass,eventData);
+
+    GlobalGUIEventQueue << closeEvent;
+}
+
+//____________________________________________________
+
+void    postChangeLFEvent (long senderID, long lfID)
+{
+    _String eventClass (_hyGlobalChangeLF),
+            eventData (senderID);
+
+    eventData = eventData & ',' & lfID;
+    _HYEvent*
+    modEvent = new _HYEvent (eventClass,eventData);
+
+    GlobalGUIEventQueue << modEvent;
+}
+
+//____________________________________________________
+
+void    postChangeLFParamsEvent (long senderID, long lfID)
+{
+    _String eventClass (_hyGlobalChangeLFParams),
+            eventData (senderID);
+
+    eventData = eventData & ',' & lfID;
+    _HYEvent*
+    modEvent = new _HYEvent (eventClass,eventData);
+
+    GlobalGUIEventQueue << modEvent;
+}
+
+//____________________________________________________
+
+void    postSetTreePanelSelection (long treeID, _String* sel)
+{
+    _String eventClass (_hyGlobalSetTreePanelSelection),
+            eventData;
+
+    eventData = _String(treeID) & ',' & *sel;
+    _HYEvent*
+    modEvent = new _HYEvent (eventClass,eventData);
+
+    GlobalGUIEventQueue << modEvent;
+}
+
+//____________________________________________________
+//  Update/Notification structures
+//____________________________________________________
+
+//_List     notificationPairs;
+
+//____________________________________________________
+
+//EOF
\ No newline at end of file
diff --git a/src/gui/HYGraphicPane.cpp b/src/gui/HYGraphicPane.cpp
new file mode 100644
index 0000000..c5ca648
--- /dev/null
+++ b/src/gui/HYGraphicPane.cpp
@@ -0,0 +1,599 @@
+/*
+ 
+ HyPhy - Hypothesis Testing Using Phylogenies.
+ 
+ Copyright (C) 1997-now
+ Core Developers:
+ Sergei L Kosakovsky Pond (spond at ucsd.edu)
+ Art FY Poon    (apoon at cfenet.ubc.ca)
+ Steven Weaver (sweaver at ucsd.edu)
+ 
+ Module Developers:
+ Lance Hepler (nlhepler at gmail.com)
+ Martin Smith (martin.audacis at gmail.com)
+ 
+ Significant contributions from:
+ Spencer V Muse (muse at stat.ncsu.edu)
+ Simon DW Frost (sdf22 at cam.ac.uk)
+ 
+ Permission is hereby granted, free of charge, to any person obtaining a
+ copy of this software and associated documentation files (the
+ "Software"), to deal in the Software without restriction, including
+ without limitation the rights to use, copy, modify, merge, publish,
+ distribute, sublicense, and/or sell copies of the Software, and to
+ permit persons to whom the Software is furnished to do so, subject to
+ the following conditions:
+ 
+ The above copyright notice and this permission notice shall be included
+ in all copies or substantial portions of the Software.
+ 
+ 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.
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ 
+ */
+#include "HYGraphicPane.h"
+#include "HYUtils.h"
+#include "HYComponent.h"
+#include "errorfns.h"
+#include "math.h"
+
+#ifdef    __HYPHYDMALLOC__
+#include "dmalloc.h"
+#endif
+
+_HYColor hyDefaultFrameColor = {100,100,100};
+
+//__________________________________________________________________
+
+_HYGraphicPane::_HYGraphicPane(int ht, int wd, int d):
+    _HYPlatformGraphicPane (ht,wd,d)
+
+{
+    w = wd;
+    h = ht;
+    color.R=color.G=color.B=0;
+    bColor.R=bColor.G=bColor.B=255;
+    StartDraw();
+    SetColor  (color);
+    SetBColor (bColor);
+#ifdef __WINDOZE__
+    font.face = "Verdana";
+#else
+#ifdef __MAC__
+    font.face = "Monaco";
+#else
+    font.face = _HY_SANS_FONT;
+#endif
+#endif
+    font.size = 10;
+    font.style = HY_FONT_PLAIN;
+    SetFont (font);
+    EraseAll();
+    EndDraw();
+    depth = d;
+}
+
+
+//__________________________________________________________________
+
+_HYGraphicPane::~_HYGraphicPane(void)
+{
+}
+
+//__________________________________________________________________
+
+void _HYGraphicPane::SetPaneSize  (int ht,int wd, int d)
+{
+    if ((h==ht)&&(w==wd)&&(d==depth)) {
+        return;
+    }
+    h = ht;
+    w = wd;
+    _SetPaneSize (h,w,d);
+    StartDraw();
+    EraseAll();
+    /*font.face = "Monaco";
+    font.size = 10;
+    font.style = HY_FONT_PLAIN;*/
+    SetColor (color);
+    SetFont (font);
+    EndDraw();
+    depth = d;
+}
+
+
+//__________________________________________________________________
+
+void _HYGraphicPane::DrawLine (_HYRect lineDesc)
+{
+    _DrawLine (lineDesc);
+}
+
+//__________________________________________________________________
+
+void _HYGraphicPane::DrawHatchedLine (_HYRect lineDesc)
+{
+    _DrawHatchedLine (lineDesc);
+}
+
+//__________________________________________________________________
+void _HYGraphicPane::DisplayText     (_String theText,int t, int l, bool dir)
+{
+    _DisplayText (theText,t,l,dir);
+}
+
+//__________________________________________________________________
+void _HYGraphicPane::DisplayText     (_String theText,_HYRect r, char align)
+{
+    _DisplayText (theText,r,align);
+}
+
+//__________________________________________________________________
+void _HYGraphicPane::DisplayChar     (char c,int t, int l)
+{
+    _DisplayChar (c,t,l);
+}
+
+//__________________________________________________________________
+
+void _HYGraphicPane::DrawRect (_HYRect rectDesc)
+{
+    _DrawRect (rectDesc);
+}
+//__________________________________________________________________
+
+void _HYGraphicPane::FillRect (_HYRect rectDesc)
+{
+    _FillRect (rectDesc);
+}
+//__________________________________________________________________
+
+void _HYGraphicPane::InvertRect (_HYRect rectDesc)
+{
+    _InvertRect (rectDesc);
+}
+
+//__________________________________________________________________
+
+void _HYGraphicPane::EraseRect (_HYRect rectDesc)
+{
+    _EraseRect (rectDesc);
+}
+
+//__________________________________________________________________
+
+void _HYGraphicPane::DrawOval (_HYRect rectDesc)
+{
+    _DrawOval (rectDesc);
+}
+//__________________________________________________________________
+
+void _HYGraphicPane::FillOval (_HYRect rectDesc)
+{
+    _FillOval (rectDesc);
+}
+
+//__________________________________________________________________
+
+void _HYGraphicPane::EraseOval (_HYRect rectDesc)
+{
+    _EraseOval (rectDesc);
+}
+
+//__________________________________________________________________
+
+void _HYGraphicPane::DrawPolygon (_SimpleList& r, long width)
+{
+    Ptr p = _DefinePolygon (r);
+    _DrawPolygon (p, width);
+    _KillPolygon (p);
+}
+//__________________________________________________________________
+
+void _HYGraphicPane::FillPolygon (_SimpleList& r)
+{
+    Ptr p = _DefinePolygon (r);
+    _FillPolygon (p);
+    _KillPolygon (p);
+}
+//__________________________________________________________________
+
+void _HYGraphicPane::ErasePolygon (_SimpleList& r)
+{
+    Ptr p = _DefinePolygon (r);
+    _ErasePolygon (p);
+    _KillPolygon (p);
+}
+
+//__________________________________________________________________
+
+void _HYGraphicPane::DrawArc (_HYRect rectDesc, int s, int f)
+{
+    _DrawArc (rectDesc,s,f);
+}
+//__________________________________________________________________
+
+void _HYGraphicPane::FillArc (_HYRect rectDesc, int s, int f)
+{
+    _FillArc (rectDesc,s,f);
+}
+
+//__________________________________________________________________
+
+void _HYGraphicPane::EraseArc (_HYRect rectDesc, int s, int f)
+{
+    _EraseArc (rectDesc,s,f);
+}
+
+//__________________________________________________________________
+
+void _HYGraphicPane::EraseAll (void)
+{
+    _HYRect all = {0,0,h,w,0};
+    EraseRect (all);
+}
+
+//__________________________________________________________________
+
+void _HYGraphicPane::SetColor  (_HYColor c)
+{
+    color = c;
+    _SetColor (c);
+}
+
+//__________________________________________________________________
+
+void _HYGraphicPane::SetBColor  (_HYColor c)
+{
+    bColor = c;
+    _SetBColor (c);
+}
+
+//__________________________________________________________________
+
+void _HYGraphicPane::DrawFrame  (_HYColor c)
+{
+    SetColor(c);
+    _HYRect frame;
+    frame.left=frame.top=0;
+    frame.bottom = h;
+    frame.right = w;
+    frame.width = 2;
+    DrawRect (frame);
+    _HYColor darker;
+    darker.R = c.R/2;
+    darker.G = c.G/2;
+    darker.B = c.B/2;
+    frame.left=frame.top=2;
+    frame.bottom = h-2;
+    frame.right = w-2;
+    frame.width = 1;
+    SetColor(darker);
+    DrawRect (frame);
+}
+
+
+//__________________________________________________________________
+
+void _HYGraphicPane::SetFont (_HYFont f)
+{
+    font = f;
+    _SetFont (f);
+}
+
+//__________________________________________________________________
+
+void _HYGraphicPane::SetFontSize (long s)
+{
+    font.size = s;
+    _SetFontSize (s);
+}
+
+//__________________________________________________________________
+
+void _HYGraphicPane::StartDraw   (void)
+{
+    _StartDraw();
+}
+
+//__________________________________________________________________
+
+void _HYGraphicPane::EndDraw     (void)
+{
+    _EndDraw();
+}
+
+//__________________________________________________________________
+
+void _HYGraphicPane::DrawTable   (_List& theStrings, _List& p, char align, _HYRect margins, _HYRect m)
+{
+    long i1, i2;
+    for (i1=0; i1<theStrings.lLength; i1++) {
+        _List       *thisRow = (_List*)theStrings(i1);
+        _SimpleList *rw      = (_SimpleList*)p(i1);
+
+        for (i2=0; i2<thisRow->lLength; i2++) {
+            long w = rw->lData[3*i2+1];
+            switch (align) {
+            case HY_ALIGN_LEFT:
+                break;
+            case HY_ALIGN_RIGHT:
+                w += rw->lData[3*i2+2];
+                break;
+            default:
+                w += rw->lData[3*i2+2]/2;
+                break;
+            }
+            DisplayText (*(_String*)(*thisRow)(i2),m.top+rw->lData[3*i2],m.left+w,true);
+            if (margins.width&&(i1==0)) {
+                _HYRect betweenColumns = {m.top, m.left+rw->lData[3*i2+1]-margins.left,
+                                          m.top+m.bottom, m.left+rw->lData[3*i2+1]-margins.left, margins.width
+                                         };
+                DrawLine (betweenColumns);
+            }
+        }
+        if (margins.width) {
+            if (i1==0) {
+                _HYRect betweenColumns = {m.top, m.left+m.right,
+                                          m.top+m.bottom, m.left+m.right, margins.width
+                                         };
+                DrawLine (betweenColumns);
+            }
+            _HYRect betweenRows = {rw->lData[0]+margins.bottom+m.top,m.left,
+                                   rw->lData[0]+margins.bottom+m.top, m.right+m.left,
+                                   margins.width
+                                  };
+            DrawLine (betweenRows);
+        }
+    }
+    if (margins.width) {
+        _HYRect betweenRows = {m.top,m.left,
+                               m.top, m.right+m.left,
+                               margins.width
+                              };
+        DrawLine (betweenRows);
+    }
+}
+
+//__________________________________________________________________
+
+void _HYGraphicPane::DrawHashes  (_HYRect b, _SimpleList& off, _List& labels, int hl, int hw)
+{
+    long    k;
+    if (b.right-b.left > b.bottom-b.top) {
+        for (k=0; k<labels.lLength; k++) {
+            DisplayText (*(_String*)labels(k),b.bottom+b.width+font.size,b.left+off.lData[2*k]-off.lData[2*k+1],true);
+            if (hl&&hw) {
+                _HYRect     tick = {b.top,b.left+off.lData[2*k]-hw/2,b.top+hl,b.left+off.lData[2*k]-hw/2,hw};
+                DrawLine    (tick);
+            }
+        }
+    } else {
+        for (k=0; k<labels.lLength; k++) {
+            DisplayText (*(_String*)labels(k),b.bottom-off.lData[2*k],b.left-off.lData[2*k+1]-b.width,true);
+            if (hl&hw) {
+                _HYRect     tick = {b.bottom-off.lData[2*k]-hw/2,b.left-hw,b.bottom-off.lData[2*k]-hw/2,b.left,hw};
+                DrawLine    (tick);
+            }
+        }
+    }
+}
+
+//__________________________________________________________________
+void RotateRect90 (_HYRect& theRect)
+{
+    int t = theRect.bottom;
+    theRect.bottom = theRect.right;
+    theRect.right =  t;
+    t = theRect.left;
+    theRect.left = theRect.top;
+    theRect.top = t;
+}
+
+//__________________________________________________________________
+double DistanceBetweenPoints (double x1, double y1, double x2, double y2)
+{
+    double d1 = x1-x2,
+           d2 = y1-y2;
+
+    return sqrt (d1*d1+d2*d2);
+}
+
+//__________________________________________________________________
+long AngleBetweenPoints (double x1, double y1, double x2, double y2)
+{
+    double xspan = x2-x1,
+           yspan = y1-y2;
+
+    if (xspan)
+        return round(180.0*(0.5-atan(yspan/xspan)/pi_const)
+                     + ((xspan< 0.)?180.:0.0));
+
+    return yspan>0?0:180;
+}
+
+//__________________________________________________________________
+long     ComputeTableCellPlacement (_List& theStrings, _List& thePlacements, _HYRect margins, _HYFont& f)
+{
+    _SimpleList     columnWidths;
+    _List           stringWidths;
+    long            i1,i2,w;
+
+    for (i1=0; i1<theStrings.lLength; i1++) {
+        _List       *thisRow = (_List*)theStrings(i1);
+        _SimpleList *rowWidths = new _SimpleList;
+
+        checkPointer (rowWidths);
+
+        for (i2=0; i2<thisRow->lLength; i2++) {
+            w = GetVisibleStringWidth (*(_String*)((*thisRow)(i2)),f);
+
+            if (columnWidths.lLength<=i2) {
+                columnWidths << w;
+            } else if (columnWidths.lData[i2]<w) {
+                columnWidths.lData[i2] = w;
+            }
+
+            (*rowWidths) << w;
+        }
+        stringWidths << rowWidths;
+        DeleteObject (rowWidths);
+    }
+
+    thePlacements.Clear();
+
+    w = f.size+margins.top;
+
+    for (i1=0; i1<theStrings.lLength; i1++) {
+        _SimpleList *thisRow       = (_SimpleList*)stringWidths(i1),
+                     *rowPlacements = new _SimpleList;
+
+        checkPointer (rowPlacements);
+
+        long         cumW = margins.left;
+
+        for (i2=0; i2<thisRow->lLength; i2++) {
+            (*rowPlacements) << w;
+            (*rowPlacements) << cumW;
+            (*rowPlacements) << columnWidths.lData[i2]-thisRow->lData[i2];
+            cumW += columnWidths.lData[i2]+margins.right+margins.left;
+        }
+
+        thePlacements << rowPlacements;
+        w += f.size+margins.top+margins.bottom;
+        DeleteObject (rowPlacements);
+    }
+
+    w = 0;
+    for (i1=0; i1<columnWidths.lLength; i1++) {
+        w += columnWidths.lData[i1];
+        w += margins.left;
+        w += margins.right;
+    }
+
+    return w;
+}
+
+//__________________________________________________________________
+long        ComputeHashMarkPlacement  (_HYRect line, _Parameter min, _Parameter max, _Parameter& tickStep,
+                                       _Parameter&minLabel, _SimpleList& offsets, _List& labels,
+                                       int count, _HYFont& f)
+{
+    if (max>min) {
+        offsets.Clear();
+        labels.Clear();
+
+        long            w = line.right-line.left,
+                        h = line.bottom-line.top,
+                        t = 0;
+        _Parameter      scalingFactor = (w>h)?w/(max-min):h/(max-min);
+
+
+        tickStep        = log(max-min)/log(10.);
+        tickStep        = pow (10.,floor (tickStep))*2.;
+        minLabel        = min;
+
+        t = count-1;
+        while (t<count) {
+            tickStep/=2.;
+            if (tickStep>1.) {
+                tickStep = floor (tickStep);
+            }
+            if (min) {
+                minLabel = ceil(min/tickStep)*tickStep;
+            }
+            t = ceil((max-minLabel)/tickStep);
+            if (min) {
+                minLabel = ceil(min/tickStep)*tickStep;
+            }
+        }
+
+        if (h>w) {
+            _Parameter tracer = minLabel;
+            long res  = 0,
+                 last = -100000,
+                 k,
+                 sw;
+
+            w = h;
+
+            for (h=0; h<=t; h++,tracer+=tickStep) {
+                _String buffer (tracer);
+                sw = GetVisibleStringWidth (buffer,f);
+                k  = (tracer-min)*scalingFactor;
+                if (k>w) {
+                    break;
+                }
+                if (k-last>f.size) {
+                    offsets << k;
+                    offsets << sw;
+                    labels  && & buffer;
+                    last = k;
+                }
+                if (sw>res) {
+                    res = sw;
+                }
+            }
+            return res;
+        } else {
+            _Parameter tracer = minLabel;
+            long last = -100000,
+                 k,
+                 sw;
+
+            for (h=0; h<=t; h++,tracer+=tickStep) {
+                _String buffer (tracer);
+                sw = GetVisibleStringWidth (buffer,f);
+                k  = (tracer-min)*scalingFactor;
+                if (k>w) {
+                    break;
+                }
+                if (k-last>sw) {
+                    offsets << k;
+                    offsets << sw;
+                    labels  && & buffer;
+                    last = k;
+                }
+            }
+        }
+
+        return f.size;
+
+    }
+    return 0;
+
+}
+
+//__________________________________________________________________
+void        _HYGraphicPane::DrawInfoBox (_HYRect theBox, _String boxName)
+{
+    long   stringWidth,
+           avWidth = theBox.right-theBox.left-20;
+
+    theBox.width = 1;
+
+    DrawRect (theBox);
+    if (boxName.sLength) {
+        stringWidth = GetVisibleStringWidth (boxName, font);
+        while (stringWidth>avWidth && boxName.sLength) {
+            boxName.Trim (0, boxName.sLength-2);
+            stringWidth = GetVisibleStringWidth (boxName, font);
+        }
+        // measure string length
+        _HYRect     textRect = theBox;
+        textRect.left += 8;
+        textRect.right = textRect.left+stringWidth+4;
+        textRect.top-=6;
+        textRect.bottom = textRect.top+9;
+        EraseRect   (textRect);
+        DisplayText (boxName, textRect.bottom, textRect.left+2, true);
+    }
+}
+
+
+//EOF
\ No newline at end of file
diff --git a/src/gui/HYModelWindow.cpp b/src/gui/HYModelWindow.cpp
new file mode 100644
index 0000000..bfef5f1
--- /dev/null
+++ b/src/gui/HYModelWindow.cpp
@@ -0,0 +1,4109 @@
+/*
+ 
+ HyPhy - Hypothesis Testing Using Phylogenies.
+ 
+ Copyright (C) 1997-now
+ Core Developers:
+ Sergei L Kosakovsky Pond (spond at ucsd.edu)
+ Art FY Poon    (apoon at cfenet.ubc.ca)
+ Steven Weaver (sweaver at ucsd.edu)
+ 
+ Module Developers:
+ Lance Hepler (nlhepler at gmail.com)
+ Martin Smith (martin.audacis at gmail.com)
+ 
+ Significant contributions from:
+ Spencer V Muse (muse at stat.ncsu.edu)
+ Simon DW Frost (sdf22 at cam.ac.uk)
+ 
+ Permission is hereby granted, free of charge, to any person obtaining a
+ copy of this software and associated documentation files (the
+ "Software"), to deal in the Software without restriction, including
+ without limitation the rights to use, copy, modify, merge, publish,
+ distribute, sublicense, and/or sell copies of the Software, and to
+ permit persons to whom the Software is furnished to do so, subject to
+ the following conditions:
+ 
+ The above copyright notice and this permission notice shall be included
+ in all copies or substantial portions of the Software.
+ 
+ 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.
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ 
+ */
+
+
+#include "HYModelWindow.h"
+#include "HYButtonBar.h"
+#include "HYLabel.h"
+#include "HYTableComponent.h"
+#include "HYGraphicPane.h"
+#include "HYUtils.h"
+#include "HYEventTypes.h"
+#include "HYDataPanel.h"
+#include "HYButton.h"
+#include "HYDialogs.h"
+#include "HYTextBox.h"
+
+#include "parser.h"
+#include "likefunc.h"
+#include "batchlan.h"
+
+#ifdef    __HYPHYDMALLOC__
+#include "dmalloc.h"
+#endif
+
+extern  _SimpleList windowObjects;
+extern  _HYColor    tableDefaultBk2,
+        labelBColor,
+        labelFColor;
+
+extern  _String     blReplicate,
+        donotWarnAgain,
+        modelName,
+        modelOptions,
+        modelDimension,
+        modelFunction,
+        globalPrefix,
+        categoryPrefix,
+        nucDataType,
+        dinucDataType,
+        codonDataType,
+        proteinDataType,
+        none,
+        parameterOption[3],
+        modelEFVVector,
+        multiplyByFrequencies;
+
+
+_String             noneDefined        ("None Defined"),
+                    defineNewParameter ("New Parameter"),
+                    editParameter       ("Edit Parameter"),
+                    deleteParameter     ("Delete Parameter"),
+                    updateParemeterList("Remove Unused Parameters"),
+                    moveToExpression   ("Set Expression To Parameter"),
+                    addToExpression     ("Append Parameter To Expression"),
+                    spawnParameters    ("The formula contains parameters not defined previously. Should I add them to the list (as locals) and proceed?"),
+                    glStart         ("(__Global__"),
+                    catStart            ("(__Category__"),
+                    emptySelection      ("Empty selection"),
+                    noneApplicable      ("None Applicable"),
+                    modelGenCode    ("ModelGeneticCode"),
+                    buildTemps          ("CreateTemplates"),
+                    buildClasses    ("CreateSubClasses"),
+                    nameMatrixT         ("TemplateNames"),
+                    nameMatrixS         ("SubClassNames"),
+                    resultName          ("MatrixTemplate"),
+                    embeddedInModel    ("User Defined Vector"),
+                    gammaVariation      ("Unit Mean Gamma"),
+                    modelMatrixName    ("ModelMatrixName"),
+                    EFVModifier         ("EFVModifierMatrix"),
+                    EFVCodeMarker       ("/** MATRIX MODIFICATION CODE **/"),
+                    ModelMatrixDimension
+                    ("ModelMatrixDimension"),
+                    titlePrefix         ("Model "),
+                    untitled        ("untitled"),
+                    ModelEFVType    ("Model_EFV_Type"),
+                    modelDataType       ("Model_Data_Type"),
+                    rateClassCount     ("rateClassCount"),
+                    invalidEFV          ("Can't add up to 1"),
+                    exprNotValidated   ("Your expression was not validated."),
+                    deleteParameters   ("Deleting this parameter will erase all matrix elements which depend on it.");
+
+_HYColor midGrey        = {220,220,220},
+         darkGrey      = {160,160,160},
+         editBoxBad      = {128,0,0},
+         editBoxGood = {0,128,0};
+
+bool     warnNewParameters = false;
+
+long     modelSpawnerCount = 1;
+
+_String  directorySep (
+#ifdef __MAC__
+    ':'
+#else
+#ifdef __WINDOZE__
+    '\\'
+#else
+    '/'
+#endif
+#endif
+);
+
+//__________________________________________________________
+_HYModelWindow::_HYModelWindow (_String name, _List* labels, char t):_HYTWindow (titlePrefix&name, true)
+{
+
+    long            index,
+                    cellWidth;
+
+    stateLabels.Duplicate (labels);
+
+    _HYRect         canvasSettings = {26,82,26,82,HY_COMPONENT_NO_SCROLL};
+
+    _HYLabel*       l1    = new _HYLabel (canvasSettings, GetOSWindowData());
+
+
+    canvasSettings.right  = 40;
+    canvasSettings.left   = 40;
+    _HYLabel*       l5    = new _HYLabel (canvasSettings, GetOSWindowData());
+
+    canvasSettings.width  = HY_COMPONENT_BORDER_T;
+    _HYLabel*       l3    = new _HYLabel (canvasSettings, GetOSWindowData()),
+    *       l4    = new _HYLabel (canvasSettings, GetOSWindowData());
+
+    canvasSettings.right  = 130;
+    canvasSettings.left   = 130;
+    _HYPullDown*    p2    = new _HYPullDown (canvasSettings, GetOSWindowData());
+
+    canvasSettings.right  = 10000;
+    _HYPullDown*    p3    = new _HYPullDown (canvasSettings, GetOSWindowData());
+
+    canvasSettings.width  = HY_COMPONENT_NO_SCROLL;
+
+    _HYPullDown*    p4    = new _HYPullDown (canvasSettings, GetOSWindowData());
+    canvasSettings.left   = 92;
+
+    _HYPullDown*    p1    = new _HYPullDown (canvasSettings, GetOSWindowData());
+
+    canvasSettings.left   = canvasSettings.right  = 170;
+    canvasSettings.top    = canvasSettings.bottom = 26;
+    canvasSettings.width  = HY_COMPONENT_BORDER_T;
+
+    _HYButtonBar*   bb    = new _HYButtonBar (canvasSettings, GetOSWindowData());
+
+    canvasSettings.left   = 120;
+    canvasSettings.right  = 120;
+    _HYButtonBar*   bb2   = new _HYButtonBar (canvasSettings, GetOSWindowData());
+
+    canvasSettings.left   = 100;
+    canvasSettings.right  = 10000;
+    _HYTextBox*   tl      = new _HYTextBox (canvasSettings, GetOSWindowData());
+
+    canvasSettings.left   = canvasSettings.right  = 26;
+    _HYButtonBar*   bb3   = new _HYButtonBar (canvasSettings, GetOSWindowData());
+
+
+    canvasSettings.right  = 10000;
+    canvasSettings.left   = 60;
+    canvasSettings.top    = 20;
+    canvasSettings.bottom = 20;
+
+    canvasSettings.width  = HY_COMPONENT_BORDER_B|HY_COMPONENT_BORDER_T;
+
+    _HYTable*   columnHeaders   = new _HYTable (canvasSettings,GetOSWindowData(),1,labels->lLength+1,25,20,HY_TABLE_STATIC_TEXT);
+
+    for (index=0; index < labels->lLength; index++) {
+        columnHeaders->SetCellData (stateLabels(index),0,index,HY_TABLE_STATIC_TEXT|HY_TABLE_BEVELED|HY_TABLE_BOLD,false);
+        stateLabels(index)->nInstances++;
+    }
+
+    columnHeaders->SetCellData (&empty,0,index,HY_TABLE_STATIC_TEXT|HY_TABLE_BEVELED|HY_TABLE_BOLD|HY_TABLE_CANTSELECT,true);
+
+    canvasSettings.left   = canvasSettings.right = 20;
+    canvasSettings.top    = 50;
+    canvasSettings.bottom = 10000;
+
+    canvasSettings.width = HY_COMPONENT_BORDER_R;
+
+    _HYTable*   rowHeaders  = new _HYTable (canvasSettings,GetOSWindowData(),labels->lLength+1,1,25,20,HY_TABLE_STATIC_TEXT);
+    //rowHeaders->selectionType = HY_TABLE_DONT_SIZE;
+
+    for (index=0; index < labels->lLength; index++) {
+        rowHeaders->SetCellData (stateLabels(index),0,index,HY_TABLE_STATIC_TEXT|HY_TABLE_BEVELED|HY_TABLE_BOLD,false);
+        stateLabels(index)->nInstances++;
+    }
+
+    rowHeaders->SetCellData (&empty,0,index,HY_TABLE_STATIC_TEXT|HY_TABLE_BEVELED|HY_TABLE_BOLD|HY_TABLE_CANTSELECT,true);
+    rowHeaders->SetRowSpacing (index,HY_SCROLLER_WIDTH-20,false);
+    rowHeaders->AutoFitColumn(0,false,true);
+
+    rowHeaders->settings.left = rowHeaders->settings.right = canvasSettings.left = canvasSettings.right =
+                                    rowHeaders->GetColumnSpacing (0);
+
+    columnHeaders->SetColumnSpacing (index,HY_SCROLLER_WIDTH-25,false);
+
+    cellWidth               = 400/labels->lLength+1;
+    canvasSettings.top      = canvasSettings.bottom     = 20;
+    canvasSettings.width    = HY_COMPONENT_BORDER_T|HY_COMPONENT_BORDER_B|HY_COMPONENT_BORDER_R;
+
+    _HYLabel*       l2      = new _HYLabel (canvasSettings, GetOSWindowData());
+
+    canvasSettings.top      = canvasSettings.left   = 50;
+    canvasSettings.bottom   = canvasSettings.right  = 10000;
+
+    canvasSettings.width    = HY_COMPONENT_V_SCROLL|HY_COMPONENT_H_SCROLL;
+
+    _HYTable*   table       = new _HYTable (canvasSettings,GetOSWindowData(),labels->lLength,labels->lLength,cellWidth,20,HY_TABLE_EDIT_TEXT);
+
+    canvasSettings.right    = canvasSettings.left = 169-rowHeaders->GetRowSpacing(0);
+    canvasSettings.width    = HY_COMPONENT_NO_SCROLL|HY_COMPONENT_BORDER_R;
+    canvasSettings.top      = 50;
+    canvasSettings.bottom   = 10000;
+    _HYTable*   EFVColumn   = new _HYTable (canvasSettings,GetOSWindowData(),labels->lLength+1,1,169-rowHeaders->GetRowSpacing(0),20,HY_TABLE_EDIT_TEXT);
+    EFVColumn->SetCellData (&empty,labels->lLength-1,0,HY_TABLE_STATIC_TEXT|HY_TABLE_CANTSELECT,true);
+    EFVColumn->SetCellData (&empty,labels->lLength,0,HY_TABLE_STATIC_TEXT|HY_TABLE_BEVELED|HY_TABLE_BOLD|HY_TABLE_CANTSELECT,true);
+
+    canvasSettings.top      = canvasSettings.bottom = 20;
+    canvasSettings.width    = HY_COMPONENT_NO_SCROLL|(HY_COMPONENT_BORDER-HY_COMPONENT_BORDER_L);
+    _HYLabel*   EFVLabel    = new _HYLabel (canvasSettings,GetOSWindowData());
+
+    EFVColumn->SetRowSpacing (labels->lLength,HY_SCROLLER_WIDTH-20,false);
+    EFVColumn->selectionType = HY_TABLE_DONT_SIZE;
+    EFVColumn->SetMessageRecipient (this);
+
+    _String s (" * ");
+    table->SetCellData (&s,0,0,HY_TABLE_STATIC_TEXT|HY_TABLE_CANTSELECT|HY_TABLE_BOLD,true);
+    for (index=1; index < labels->lLength; index++) {
+        table->SetCellData (table->GetCellData(0,0),index,index,HY_TABLE_STATIC_TEXT|HY_TABLE_CANTSELECT|HY_TABLE_BOLD,true);
+    }
+
+    table->AutoFitWidth(*columnHeaders);
+    table->EnforceWidth(400,stateLabels.lLength-1);
+    columnHeaders->EnforceWidth(401,stateLabels.lLength-1);
+
+    table->selectionType      = HY_TABLE_DONT_SIZE;
+    rowHeaders->selectionType = HY_TABLE_DONT_SIZE;
+
+    columnHeaders->SetColumnSpacing (index,HY_SCROLLER_WIDTH-columnHeaders->GetColumnSpacing(index),false);
+
+    table->SetMessageRecipient (this);
+    table->SetBackColor (midGrey);
+    EFVColumn->SetBackColor (midGrey);
+    rowHeaders->SetMessageRecipient (this);
+    columnHeaders->SetMessageRecipient (this);
+    bb->SetMessageRecipient (this);
+    bb2->SetMessageRecipient (this);
+    bb3->SetMessageRecipient (this);
+    p1->SetMessageRecipient (this);
+    p2->SetMessageRecipient (this);
+    p4->SetMessageRecipient (this);
+    tl->SetMessageRecipient (this);
+
+    AddObject (table);                          // 0
+    AddObject (rowHeaders);                     // 1
+    AddObject (columnHeaders);                  // 2
+    AddObject (bb);                             // 3
+    AddObject (p1);                             // 4
+    AddObject (p2);                             // 5
+    AddObject (p3);                             // 6
+    AddObject (bb2);                            // 7
+    AddObject (l1);                             // 8
+    AddObject (l2);                             // 9
+    AddObject (l3);                             // 10
+    AddObject (l4);                             // 11
+    AddObject (EFVColumn);                      // 12
+    AddObject (EFVLabel);                       // 13
+    AddObject (l5);                             // 14
+    AddObject (p4);                             // 15
+    AddObject (tl);                             // 16
+    AddObject (bb3);                            // 17
+
+
+    SetTableDimensions (5,7);
+    SetCell   (MODEL_PARAMETER_ROW,0,l1);
+    SetCell   (MODEL_PARAMETER_ROW,1,l1);
+    SetCell   (MODEL_PARAMETER_ROW,2,l1); // width 82
+    SetCell   (MODEL_PARAMETER_ROW,3,p1);
+    SetCell   (MODEL_PARAMETER_ROW,4,l5);
+    SetCell   (MODEL_PARAMETER_ROW,5,p4);
+    SetCell   (MODEL_PARAMETER_ROW,6,p4);
+
+    SetCell   (MODEL_CLASS_ROW,0,l3); // 40
+    SetCell   (MODEL_CLASS_ROW,1,l3); // 40
+    SetCell   (MODEL_CLASS_ROW,2,p2); // 130
+    SetCell   (MODEL_CLASS_ROW,3,p2);
+    SetCell   (MODEL_CLASS_ROW,4,l4); // 40
+    SetCell   (MODEL_CLASS_ROW,5,p3);
+    SetCell   (MODEL_CLASS_ROW,6,p3);
+
+    SetCell   (MODEL_BUTTON_ROW,0,bb); // width 170
+    SetCell   (MODEL_BUTTON_ROW,1,bb);
+    SetCell   (MODEL_BUTTON_ROW,2,bb);
+    SetCell   (MODEL_BUTTON_ROW,3,bb);
+    SetCell   (MODEL_BUTTON_ROW,4,bb2);
+    SetCell   (MODEL_BUTTON_ROW,5,tl);
+    SetCell   (MODEL_BUTTON_ROW,6,bb3);
+
+    SetCell   (MODEL_MATRIX_HEADER_ROW,0,l2);
+    SetCell   (MODEL_MATRIX_HEADER_ROW,1,EFVLabel);
+    SetCell   (MODEL_MATRIX_HEADER_ROW,2,EFVLabel);
+    SetCell   (MODEL_MATRIX_HEADER_ROW,3,EFVLabel);
+    SetCell   (MODEL_MATRIX_HEADER_ROW,4,columnHeaders);
+    SetCell   (MODEL_MATRIX_HEADER_ROW,5,columnHeaders);
+    SetCell   (MODEL_MATRIX_HEADER_ROW,6,columnHeaders);
+
+    SetCell   (MODEL_MATRIX_ROW,0,rowHeaders);
+    SetCell   (MODEL_MATRIX_ROW,1,EFVColumn);
+    SetCell   (MODEL_MATRIX_ROW,2,EFVColumn);
+    SetCell   (MODEL_MATRIX_ROW,3,EFVColumn);
+    SetCell   (MODEL_MATRIX_ROW,4,table);
+    SetCell   (MODEL_MATRIX_ROW,5,table);
+    SetCell   (MODEL_MATRIX_ROW,6,table);
+
+    _HYFont  labelFont;
+    bb->SetBackColor (labelBColor);
+    bb2->SetBackColor(labelBColor);
+    bb3->SetBackColor(labelBColor);
+    tl->SetBackColor (labelBColor);
+    l1->SetBackColor (labelBColor);
+    l1->SetForeColor (labelFColor);
+    l5->SetBackColor (labelBColor);
+    l5->SetForeColor (labelFColor);
+    l2->SetBackColor (darkGrey);
+    l2->SetForeColor (labelFColor);
+    p1->SetBackColor (labelBColor);
+    p4->SetBackColor (labelBColor);
+    l3->SetBackColor (darkGrey);
+    l4->SetBackColor (darkGrey);
+    EFVLabel->SetBackColor (tableDefaultBk2);
+//  l3->SetForeColor (labelBColor);
+//  l4->SetForeColor (labelBColor);
+    p2->SetBackColor (darkGrey);
+    p3->SetBackColor (darkGrey);
+
+#ifdef __MAC__
+    labelFont.face = "Geneva";
+    labelFont.size = 10;
+#endif
+#ifdef __WINDOZE__
+    labelFont.face = "MS Sans Serif";
+    labelFont.size = 12;
+#endif
+#ifdef __HYPHY_GTK__
+    labelFont.face = _HY_SANS_FONT;
+    labelFont.size = 10;
+#endif
+
+    labelFont.style = HY_FONT_PLAIN;
+
+    table->SetFont(labelFont);
+    rowHeaders->SetFont(labelFont);
+    columnHeaders->SetFont(labelFont);
+    labelFont.style = HY_FONT_BOLD;
+    EFVLabel->SetFont (labelFont);
+
+    labelFont.style = HY_FONT_PLAIN;
+#ifdef __MAC__
+    labelFont.size = 12;
+#endif
+#ifdef __WINDOZE__
+    labelFont.size = 14;
+#endif
+#ifdef __HYPHY_GTK__
+    labelFont.size = 11;
+#endif
+    l1->SetFont (labelFont);
+    l3->SetFont (labelFont);
+    l4->SetFont (labelFont);
+    l5->SetFont (labelFont);
+    EFVLabel->SetAlignFlags (HY_ALIGN_LEFT);
+
+    l1->SetText (_String("Parameters:"));
+    l1->SetShadow(true);
+    l1->SetAlignFlags (HY_ALIGN_LEFT);
+
+    l5->SetText (_String("Eq.Fr:"));
+    l5->SetShadow(true);
+    l5->SetAlignFlags (HY_ALIGN_LEFT);
+
+    l3->SetText (_String("Class"));
+    l4->SetText (_String("To "));
+    l3->SetAlignFlags (HY_ALIGN_LEFT);
+    l4->SetAlignFlags (HY_ALIGN_RIGHT);
+
+    EFVLabel->SetText ("Equilibruim Freqs.");
+
+    bb->SetAlignFlags (HY_ALIGN_LEFT);
+    bb->SetButtonDim(16);
+    bb2->SetAlignFlags (HY_ALIGN_LEFT);
+    bb2->SetButtonDim(16);
+    bb3->SetAlignFlags (HY_ALIGN_LEFT);
+    bb3->SetButtonDim(16);
+
+    p1->AddMenuItem(noneDefined,-1);
+    p1->AddMenuItem(menuSeparator,-1);
+    p1->AddMenuItem(_String(defineNewParameter),-1);
+    p1->EnableItem (0,false);
+    p1->SetAlignFlags (HY_ALIGN_LEFT);
+
+    p2->AddMenuItem(noneDefined,-1);
+    p2->EnableItem (0,false);
+    p2->SetAlignFlags (HY_ALIGN_LEFT);
+    p3->AddMenuItem(noneApplicable,-1);
+    p3->EnableItem (0,false);
+    p3->SetAlignFlags (HY_ALIGN_LEFT);
+    p4->SetAlignFlags (HY_ALIGN_LEFT);
+
+    s = "Autofit column widths";
+    bb->AddButton (ProcureIconResource(HY_MODELWINDOW_ICON_BASE),&s);
+    s = "Copy Cell to Clipboard";
+    bb->AddButton (ProcureIconResource(HY_MODELWINDOW_ICON_BASE+1),&s);
+    s = "Paste Clipboard to Selection";
+    bb->AddButton (ProcureIconResource(HY_MODELWINDOW_ICON_BASE+2),&s);
+    s = "Clear Cells in Selection";
+    bb->AddButton (ProcureIconResource(HY_MODELWINDOW_ICON_BASE+3),&s);
+    s = "Select Cells";
+    bb->AddButton (ProcureIconResource(HY_MODELWINDOW_ICON_BASE+4),&s);
+    s = "Add Multiplicative Factor to Selection";
+    bb->AddButton (ProcureIconResource(HY_MODELWINDOW_ICON_BASE+5),&s);
+    bb->EnableButton (1,false);
+    bb->EnableButton (2,false);
+    bb->EnableButton (3,false);
+    bb->EnableButton (5,false);
+    bb->MarkAsPullDown (4,true);
+    bb->MarkAsPullDown (5,true);
+
+    s = "Replace Current Selection";
+    bb2->AddButton (ProcureIconResource(HY_MODELWINDOW_ICON_BASE+10),&s);
+    s = "Union w/ Current Selection";
+    bb2->AddButton (ProcureIconResource(HY_MODELWINDOW_ICON_BASE+11),&s);
+    s = "Intersection w/ Current Selection";
+    bb2->AddButton (ProcureIconResource(HY_MODELWINDOW_ICON_BASE+12),&s);
+    s = "XOR w/ Current Selection";
+    bb2->AddButton (ProcureIconResource(HY_MODELWINDOW_ICON_BASE+13),&s);
+    s = "Subtract from  Current Selection";
+    bb2->AddButton (ProcureIconResource(HY_MODELWINDOW_ICON_BASE+14),&s);
+    bb2->EnableButton (0,false);
+    bb2->EnableButton (1,false);
+    bb2->EnableButton (2,false);
+    bb2->EnableButton (3,false);
+    bb2->EnableButton (4,false);
+
+    s = "Validate Expression";
+    bb3->AddButton (ProcureIconResource(HY_MODELWINDOW_ICON_BASE+20),&s);
+
+    tl->SetText       ("Type Expression Here");
+    tl->SetForeColor  (editBoxBad);
+
+    // set up the table
+
+    lastParameterChoice = -1;
+
+    SetStatusBar (emptySelection);
+
+
+    EFVOptions && & embeddedInModel;
+    EFVChoice = 0;
+
+    rateOptions && & gammaVariation;
+    rateChoice = 0;
+
+    type = t;
+
+    GrabEFVs      (type);
+    GrabRateVariation ();
+
+    _String      efs (1./stateLabels.lLength);
+
+    for (index = 0; index < stateLabels.lLength-1; index++) {
+        EFVColumn->SetCellData (&efs, index, 0, HY_TABLE_EDIT_TEXT, true);
+    }
+
+    EFVColumn->SetCellData (&efs,labels->lLength-1,0,HY_TABLE_STATIC_TEXT|HY_TABLE_CANTSELECT,true);
+
+
+    _HYRect  screenRect = GetScreenDimensions();
+    SetWindowRectangle (0,0,screenRect.bottom-50,screenRect.right-20);
+    DoFitColumns ();
+    //SetPosition (5,40);
+    CenterWindow(this);
+
+    screenRect = MinMaxWindowDimensions();
+
+    DeleteObject (l1);
+    DeleteObject (l2);
+    DeleteObject (l3);
+    DeleteObject (l4);
+    DeleteObject (l5);
+    DeleteObject (p1);
+    DeleteObject (p2);
+    DeleteObject (p3);
+    DeleteObject (p4);
+    DeleteObject (bb);
+    DeleteObject (bb2);
+    DeleteObject (bb3);
+    DeleteObject (table);
+    DeleteObject (rowHeaders);
+    DeleteObject (columnHeaders);
+    DeleteObject (EFVLabel);
+    DeleteObject (EFVColumn);
+    DeleteObject (tl);
+
+}
+
+//__________________________________________________________
+
+bool    _HYModelWindow::ProcessEvent (_HYEvent* e)
+{
+    bool    done = false;
+    _String firstArg;
+    long    i,f,g,k;
+    if (e->EventClass()==_hyScrollingEvent) {
+        firstArg = e->EventCode().Cut (0,(f=e->EventCode().Find(','))-1);
+        g = e->EventCode().Find(',',f+1);
+        if (g>=0) {
+            k = firstArg.toNum();
+            for (i=0; i<components.lLength; i++) {
+                if (((_HYGuiObject*)components(i))->MatchID(k)) {
+                    break;
+                }
+            }
+            _HYTable*      theTable  = (_HYTable*)GetCellObject (MODEL_MATRIX_ROW,4);
+            _HYTable*      EFVColumn = (_HYTable*)GetCellObject (MODEL_MATRIX_ROW,1);
+
+            if (i==0) {
+                firstArg = e->EventCode().Cut (f+1,g-1);
+                k = firstArg.toNum();
+                if (k) {
+                    theTable = (_HYTable*)  GetCellObject (MODEL_MATRIX_HEADER_ROW,4);
+                    theTable->SetMessageRecipient (nil);
+                    theTable->ProcessEvent (generateScrollEvent (k,0));
+                } else {
+                    firstArg = e->EventCode().Cut (g+1,-1);
+                    k = firstArg.toNum();
+                    if (k) {
+                        theTable = (_HYTable*)  GetCellObject (MODEL_MATRIX_ROW,0);
+                        theTable->SetMessageRecipient (nil);
+                        theTable->ProcessEvent (generateScrollEvent (0,k));
+                        if (EFVChoice==0) {
+                            EFVColumn->ProcessEvent (generateScrollEvent (0,k));
+                        }
+                    }
+                }
+            } else {
+                theTable->SetMessageRecipient (nil);
+                if (i==1) { // row headers
+                    firstArg = e->EventCode().Cut (g+1,-1);
+                    k = firstArg.toNum();
+                    theTable->ProcessEvent (generateScrollEvent (0,k));
+                    if (EFVChoice==0) {
+                        EFVColumn->ProcessEvent (generateScrollEvent (0,k));
+                    }
+                } else if (i==2) {
+                    firstArg = e->EventCode().Cut (f+1,g-1);
+                    k = firstArg.toNum();
+                    theTable->ProcessEvent (generateScrollEvent (k,0));
+                }
+            }
+            theTable->SetMessageRecipient (this);
+            done = true;
+        }
+    } else if (e->EventClass()==_hyMenuOpenEvent) {
+        k = e->EventCode().toNum();
+        for (i=0; i<components.lLength; i++)
+            if (((_HYGuiObject*)components(i))->MatchID(k)) {
+                break;
+            }
+
+        if (i==4) {
+            PrepareParameterMenu();
+            done = true;
+        }
+    } else if (e->EventClass()==_hyMenuSelChangeEvent) {
+        firstArg = e->EventCode().Cut (0,(f=e->EventCode().Find(','))-1);
+        k = firstArg.toNum();
+        for (i=0; i<components.lLength; i++)
+            if (((_HYGuiObject*)components(i))->MatchID(k)) {
+                break;
+            }
+        if (i==4) {
+            k = e->EventCode().Cut (f+1,-1).toNum();
+            _HYPullDown * p1 = (_HYPullDown*) GetCellObject (MODEL_PARAMETER_ROW,3);
+            f = p1->MenuItemCount ();
+            if (k == f-7) {
+                lastParameterChoice = ParameterEditBox (-1);
+            } else if (k==f-6) {
+                lastParameterChoice = ParameterEditBox (lastParameterChoice);
+            } else if (k==f-5) {
+                if (DeleteVarID (lastParameterChoice,true)) {
+                    lastParameterChoice = -1;
+                }
+            } else {
+                if (k==f-1) {
+                    lastParameterChoice = -1;
+                    CheckDependencies();
+                } else if ((k==f-2)||(k==f-3)) {
+                    _HYTextBox * tl = (_HYTextBox*) GetCellObject (MODEL_BUTTON_ROW,5);
+                    _String    curValue = tl->GetText(),
+                               pName = RetrieveVarID(lastParameterChoice);
+                    if (k==f-2) {
+                        curValue = curValue&pName;
+                    } else {
+                        curValue = pName;
+                    }
+
+                    tl->SetText (curValue);
+                }
+            }
+
+            if (k>=f-7) {
+                PrepareParameterMenu  ();
+                SetParameterMenuState (lastParameterChoice);
+                if ((k==f-5)||(k==f-1)) {
+                    PrepareParameterMenu();
+                }
+            } else {
+                lastParameterChoice = MenuChoiceToID (k);
+            }
+
+            done = true;
+        } else if (i==5) {
+            ProcessClassMenu();
+            done = true;
+        } else if (i==15) {
+            _HYPullDown * p4 = (_HYPullDown*) GetCellObject (MODEL_PARAMETER_ROW,5);
+            if (p4->GetSelection() != EFVChoice) {
+                SetEFVChoice (p4->GetSelection());
+            }
+            done = true;
+        }
+    } else if (e->EventClass()==_hyTableEditCellEvent) {
+        firstArg = e->EventCode().Cut (0,(f=e->EventCode().Find(','))-1);
+        k = firstArg.toNum();
+        for (i=0; i<components.lLength; i++) {
+            if (((_HYGuiObject*)components(i))->MatchID(k)) {
+                break;
+            }
+        }
+        firstArg        = e->EventCode().Cut (f+1,-1);
+        if (i==0) {
+            HandleCellEditEvent (firstArg.toNum());
+        } else if (i==12) {
+            HandleEFVEditEvent (firstArg.toNum());
+        }
+
+        done = true;
+    } else if (e->EventClass()==_hyTableResizeCEvent) {
+        firstArg = e->EventCode().Cut (0,(f=e->EventCode().Find(','))-1);
+        k = firstArg.toNum();
+        for (i=0; i<components.lLength; i++) {
+            if (((_HYGuiObject*)components(i))->MatchID(k)) {
+                break;
+            }
+        }
+        if ((i==0)||(i==2)) {
+            firstArg = e->EventCode().Cut (f+1,-1);
+            f = firstArg.Find(',');
+            k = firstArg.Cut(f+1,-1).toNum(); // shift
+            f = firstArg.Cut(0,f-1).toNum();  // column
+            _HYTable*      table;
+            if (i==0) {
+                table = (_HYTable*)     GetCellObject (MODEL_MATRIX_HEADER_ROW,4);
+            } else {
+                table = (_HYTable*)     GetCellObject (MODEL_MATRIX_ROW,4);
+            }
+            table->SetColumnSpacing (f,k,true);
+            dim = MinMaxWindowDimensions();
+            done = true;
+        }
+    } else if (e->EventClass()==_hyTableChangeSelEvent) {
+        k = e->EventCode().toNum();
+        for (i=0; i<components.lLength; i++) {
+            if (((_HYGuiObject*)components(i))->MatchID(k)) {
+                break;
+            }
+        }
+
+        done = true;
+
+        _HYTable* t1 = (_HYTable*)GetCellObject (MODEL_MATRIX_ROW,4),
+                  * t2 = (_HYTable*)GetCellObject (MODEL_MATRIX_ROW,0),
+                    * t3 = (_HYTable*)GetCellObject (MODEL_MATRIX_HEADER_ROW,4),
+                      * t4 = (_HYTable*)GetCellObject (MODEL_MATRIX_ROW,1);
+
+        if (i&&(i<3)) {
+            _SimpleList tSel, tSel2;
+            t2->GetSelection (tSel);
+            t3->GetSelection (tSel2);
+            if (tSel.lLength||tSel2.lLength) {
+                if (i==1) {
+                    t3->ClearSelection();
+                    t2->SetMessageRecipient (nil);
+                    t1->SetRowSelection(tSel);
+                    t2->SetMessageRecipient (this);
+                    UpdateButtonState();
+                } else {
+                    t2->ClearSelection();
+                    t2->SetMessageRecipient (nil);
+                    t1->SetColumnSelection(tSel2);
+                    t2->SetMessageRecipient (this);
+                    UpdateButtonState();
+                }
+            }
+        } else {
+            if (i==0) {
+                if (t2->messageRecipient) {
+                    t2->ClearSelection();
+                    t3->ClearSelection();
+                }
+                _SimpleList newSelection;
+                t1->GetSelection (newSelection);
+                UpdateButtonState();
+
+                if (newSelection.lLength==0) {
+                    SetStatusBar (emptySelection);
+                } else {
+                    _String sb;
+                    k = newSelection.lData[0]/stateLabels.lLength;
+                    f = newSelection.lData[0]%stateLabels.lLength;
+
+                    sb = (_String)('(') & k
+                         & ','
+                         & f
+                         & "): "
+                         & *(_String*)stateLabels(k)
+                         & ">>"
+                         & *(_String*)stateLabels(f);
+
+                    if (newSelection.lLength>1) {
+                        long k2 = newSelection.lData[newSelection.lLength-1]/stateLabels.lLength,
+                             f2 = newSelection.lData[newSelection.lLength-1]%stateLabels.lLength;
+
+                        sb = sb& "...(" & k2
+                             & ','
+                             & f2
+                             & "): "
+                             & *(_String*)stateLabels(k2)
+                             & ">>"
+                             & *(_String*)stateLabels(f2);
+
+
+                        if (newSelection.lLength != (f2-f+1)*(k2-k+1)) {
+                            sb = _String ("Part of ") & sb;
+                        }
+                    }
+                    sb = sb & " -- " & _String((long)newSelection.lLength) & " cells (" &
+                         100.*(_Parameter)newSelection.lLength/(_Parameter)(stateLabels.lLength*stateLabels.lLength)
+                         & "%)";
+
+                    SetStatusBar (sb);
+                }
+            }
+        }
+
+        if (EFVChoice==0) {
+            if (i<3) {
+                t4->SetMessageRecipient (nil);
+                t4->ClearSelection ();
+                t4->SetMessageRecipient (this);
+            } else {
+                if (i==12) {
+                    t1->SetMessageRecipient (nil);
+                    t1->ClearSelection ();
+                    t1->SetMessageRecipient (this);
+                    t2->SetMessageRecipient (nil);
+                    t2->ClearSelection ();
+                    t2->SetMessageRecipient (this);
+                    t3->SetMessageRecipient (nil);
+                    t3->ClearSelection ();
+                    t3->SetMessageRecipient (this);
+                    UpdateButtonState();
+                }
+            }
+        }
+    } else if (e->EventClass()==_hyButtonPushEvent) {
+        firstArg = e->EventCode().Cut (0,(f=e->EventCode().Find(','))-1);
+        k = firstArg.toNum();
+        for (i=0; i<components.lLength; i++) {
+            if (((_HYGuiObject*)components(i))->MatchID(k)) {
+                break;
+            }
+        }
+        if (i==3) {
+            firstArg        = e->EventCode().Cut (f+1,-1);
+            k               = firstArg.toNum();
+            switch  (k) {
+            case 0:
+                DoFitColumns();
+                break;
+
+            case 1: // copy
+                DoCopyCell  ();
+                break;
+
+            case 2: // paste
+                DoPasteToCells ();
+                break;
+
+            case 3: // clear
+                DoClearCells ();
+                break;
+
+            case 4:
+                DoSelectCells ();
+                break;
+
+            case 5:
+                DoMultiplyCells ();
+                break;
+
+            }
+            ((_HYButtonBar*)GetCellObject (MODEL_BUTTON_ROW,0))->_UnpushButton();
+            done = true;
+        } else if (i==7) {
+            firstArg        = e->EventCode().Cut (f+1,-1);
+            k               = firstArg.toNum();
+            ProcessTemplateSelection (k);
+            done = true;
+        } else if (i==17) {
+            _HYTextBox*    tl = (_HYTextBox*)  GetCellObject (MODEL_BUTTON_ROW,5);
+            _HYButtonBar* bb3 = (_HYButtonBar*)GetCellObject (MODEL_BUTTON_ROW,6);
+
+            _String cText (tl->GetText());
+            _Formula f (cText,nil,false);
+            if (f.GetList().lLength) {
+                clipboardString = cText;
+                SyncEditBox ();
+                UpdateButtonState();
+            } else {
+                ProblemReport (exprNotValidated,(Ptr)this);
+            }
+            bb3->_UnpushButton ();
+            done = true;
+        }
+    } else if (e->EventClass()==_hyTextEditChange) {
+        firstArg = e->EventCode().Cut (0,(f=e->EventCode().Find(','))-1);
+        k = firstArg.toNum();
+        for (i=0; i<components.lLength; i++) {
+            if (((_HYGuiObject*)components(i))->MatchID(k)) {
+                break;
+            }
+        }
+        if (i==16) {
+            firstArg        = e->EventCode().Cut (f+1,-1);
+            k               = firstArg.toNum();
+            if (k==1) {
+                if (clipboardString.sLength) {
+                    clipboardString = empty;
+                    _HYTextBox*    tl = (_HYTextBox*)  GetCellObject (MODEL_BUTTON_ROW,5);
+                    _HYButtonBar*  bb3 = (_HYButtonBar*)GetCellObject (MODEL_BUTTON_ROW,6);
+                    tl->SetForeColor (editBoxBad);
+                    bb3->EnableButton (0,true);
+                    UpdateButtonState();
+                }
+            } else if (k==2) {
+                _HYTextBox*    tl = (_HYTextBox*)  GetCellObject (MODEL_BUTTON_ROW,5);
+                if (clipboardString.sLength==0) {
+                    _HYButtonBar*  bb3 = (_HYButtonBar*)GetCellObject (MODEL_BUTTON_ROW,6);
+                    ProcessEvent   (generateButtonPushEvent (bb3->GetID(),0));
+                } else {
+                    tl->UnfocusComponent ();
+                    keyboardFocus = -1;
+                }
+            }
+            done = true;
+        }
+    }
+
+    if (done) {
+        DeleteObject (e);
+        return true;
+    }
+    return _HYTWindow::ProcessEvent(e);
+}
+
+//__________________________________________________________
+
+void    _HYModelWindow::PrepareParameterMenu (void)
+{
+    _HYPullDown * p1 = (_HYPullDown*) GetCellObject (MODEL_PARAMETER_ROW,3);
+    p1->DeleteAllItems();
+    if (globalVariables.lLength+localVariables.lLength+categoryVariables.lLength) {
+        long k;
+        for (k=0; k<localVariables.lLength; k++) {
+            p1->AddMenuItem (*(_String*)localVariables(k),-1);
+        }
+        if (globalVariables.lLength+categoryVariables.lLength) {
+            p1->AddMenuItem (glStart,-1);
+        }
+        for (k=0; k<globalVariables.lLength; k++) {
+            p1->AddMenuItem (*(_String*)globalVariables(k),-1);
+        }
+        if (categoryVariables.lLength) {
+            p1->AddMenuItem (catStart,-1);
+        }
+        for (k=0; k<categoryVariables.lLength; k++) {
+            p1->AddMenuItem (*(_String*)categoryVariables(k),-1);
+        }
+    } else {
+        p1->AddMenuItem (noneDefined,-1);
+    }
+
+    p1->AddMenuItem (menuSeparator,-1);
+    p1->AddMenuItem (defineNewParameter,-1);
+    p1->AddMenuItem (editParameter,-1);
+    p1->AddMenuItem (deleteParameter,-1);
+    p1->AddMenuItem (menuSeparator,-1);
+    p1->AddMenuItem (moveToExpression,-1);
+    p1->AddMenuItem (addToExpression,-1);
+    p1->AddMenuItem (updateParemeterList,-1);
+    if (lastParameterChoice<0) {
+        p1->EnableItem (p1->MenuItemCount()-5,false);
+        p1->EnableItem (p1->MenuItemCount()-6,false);
+        p1->EnableItem (p1->MenuItemCount()-2,false);
+        p1->EnableItem (p1->MenuItemCount()-3,false);
+    }
+
+    if (globalVariables.lLength+localVariables.lLength+categoryVariables.lLength==0) {
+        p1->EnableItem (p1->MenuItemCount()-1,false);
+    }
+}
+
+//__________________________________________________________
+
+long    _HYModelWindow::FindVarID (_String& s)
+{
+    long f = localVariables.Find(&s);
+
+    if (f>=0) {
+        return f;
+    }
+
+    f = globalVariables.Find (&s);
+    if (f>=0) {
+        return f+localVariables.lLength;
+    }
+
+
+    f = categoryVariables.Find (&s);
+    if (f>=0) {
+        return f+localVariables.lLength+globalVariables.lLength;
+    }
+
+    return -1;
+}
+
+//__________________________________________________________
+
+_String&    _HYModelWindow::RetrieveVarID (long ID)
+{
+    if (ID<localVariables.lLength) {
+        return *(_String*)localVariables(ID);
+    }
+
+    if (ID<localVariables.lLength+globalVariables.lLength) {
+        return *(_String*)globalVariables(ID-localVariables.lLength);
+    }
+
+    return *(_String*)categoryVariables(ID-localVariables.lLength-globalVariables.lLength);
+
+}
+
+//__________________________________________________________
+
+char    _HYModelWindow::VarKind (long ID)
+{
+    if (ID<localVariables.lLength) {
+        return 0;
+    }
+
+    if (ID<localVariables.lLength+globalVariables.lLength) {
+        return 1;
+    }
+
+    return 2;
+
+}
+
+//__________________________________________________________
+
+long    _HYModelWindow::MenuChoiceToID (long mc)
+{
+    if (mc<localVariables.lLength) {
+        return mc;
+    }
+
+    if (mc<localVariables.lLength+globalVariables.lLength+1) {
+        return mc-1;
+    }
+
+    return mc-2;
+
+}
+
+//__________________________________________________________
+
+void    _HYModelWindow::InsertVarID (_String& vID, char type)
+{
+    _Variable v (vID);
+    _List* toIns = nil;
+
+    switch (type) {
+    case 0:
+        toIns = &localVariables;
+        break;
+    case 1:
+        toIns = &globalVariables;
+        break;
+    case 2:
+        toIns = &categoryVariables;
+        break;
+    }
+
+    if (toIns) {
+        toIns->BinaryInsert (&vID);
+    }
+}
+
+//__________________________________________________________
+
+void    _HYModelWindow::RenameVarID (_String& vID, long ID, char type)
+{
+    _Variable v (vID);
+#ifndef USE_AVL_NAMES
+    UpdateParameterName (variableReindex.lData[LocateVarByName (vID)],
+                         variableReindex.lData[LocateVarByName (RetrieveVarID (ID))]);
+#else
+    UpdateParameterName (variableNames.GetXtra(LocateVarByName (vID)),
+                         variableNames.GetXtra(LocateVarByName (RetrieveVarID (ID))));
+#endif
+    DeleteVarID (ID);
+    InsertVarID (vID,type);
+}
+
+//__________________________________________________________
+
+bool    _HYModelWindow::DeleteVarID (long ID, bool clean)
+{
+    char type = VarKind (ID);
+
+    if (clean)
+#ifndef USE_AVL_NAMES
+        if (!RemoveParameterName (variableReindex.lData[LocateVarByName (RetrieveVarID (ID))]))
+#else
+        if (!RemoveParameterName (variableNames.GetXtra(LocateVarByName (RetrieveVarID (ID)))))
+#endif
+            return false;
+
+    switch (type) {
+    case 0:
+        localVariables.Delete (ID);
+        break;
+    case 1:
+        globalVariables.Delete (ID-localVariables.lLength);
+        break;
+    case 2:
+        categoryVariables.Delete (ID-localVariables.lLength-globalVariables.lLength);
+        break;
+    }
+    return true;
+}
+
+//__________________________________________________________
+
+void    _HYModelWindow::SetParameterMenuState (long ID)
+{
+    _HYPullDown * p1 = (_HYPullDown*) GetCellObject (MODEL_PARAMETER_ROW,3);
+
+    if (ID>=0) {
+        p1->ChangeSelection (ID+VarKind(ID),false);
+    } else {
+        if (localVariables.lLength+globalVariables.lLength+categoryVariables.lLength) {
+            lastParameterChoice = 0;
+        } else {
+            lastParameterChoice = -1;
+        }
+        p1->ChangeSelection (0,false);
+    }
+}
+
+//__________________________________________________________
+
+void    _HYModelWindow::SetEFVVector (_String& name)
+{
+    long f = EFVOptions.Find (&name);
+    if (f>=0) {
+        _HYPullDown* efv = (_HYPullDown*)GetCellObject (MODEL_PARAMETER_ROW,5);
+        efv->ChangeSelection (f,true);
+        //SetEFVChoice(f);
+    }
+}
+
+//__________________________________________________________
+
+void    _HYModelWindow::CopyEFVMatrix (_Matrix* m)
+{
+    _HYTable * EFVs = (_HYTable*)components(12);
+    bool    good = false;
+    long    k;
+
+    if ((m->GetHDim()*m->GetVDim()==stateLabels.lLength)&&(!m->IsVariable())) {
+        _Parameter partSum = 0.0, v;
+        for (k=0; k<stateLabels.lLength-1; k++) {
+            v = m->theData[k];
+            partSum+=v;
+            if ((v<0.0)||(partSum>1.0)) {
+                break;
+            }
+            _String converter (v);
+            EFVs->SetCellData (&converter,k,0,HY_TABLE_EDIT_TEXT,true);
+        }
+        if (k==stateLabels.lLength-1) {
+            good = true;
+        }
+    }
+
+    if (good) {
+        UpdateEFVLastEntry ();
+        EFVs->_MarkForUpdate();
+    } else {
+        _Matrix dummy (1,stateLabels.lLength,false,true);
+        for (k=0; k<stateLabels.lLength; k++) {
+            dummy.theData[k] = 1./stateLabels.lLength;
+        }
+
+        CopyEFVMatrix (&dummy);
+    }
+}
+
+//__________________________________________________________
+
+void    _HYModelWindow::HandleCellEditEvent (long index)
+{
+
+    _HYTable*       table = (_HYTable*)GetCellObject (MODEL_MATRIX_ROW,4);
+
+    long v = index%table->horizontalSpaces.lLength,
+         h = index/table->horizontalSpaces.lLength;
+
+    bool u1 = false,
+         u2 = true;
+
+    _String* cellEntry = (_String*)table->GetCellData (v,h);
+
+    if (cellEntry->sLength) {
+        _Formula f (*cellEntry);
+        if (f.IsEmpty()) {
+            cellEntry = (_String*)table->GetCellData(h,v);
+            table->SetCellData (cellEntry,h,v,HY_TABLE_EDIT_TEXT,false);
+            u1 = true;
+            u2 = false;
+        } else {
+            if (!AddFormulaParametersToList(f)) {
+                cellEntry = (_String*)table->GetCellData(h,v);
+                table->SetCellData (table->GetCellData(h,v),h,v,HY_TABLE_EDIT_TEXT,false);
+                u1 = true;
+                u2 = false;
+            }
+
+            if (u2) {
+                cellEntry = (_String*)f.toStr();
+                table->SetCellData (cellEntry,h,v,HY_TABLE_EDIT_TEXT,false);
+                table->SetCellData (cellEntry,v,h,HY_TABLE_EDIT_TEXT,false);
+                u1 = true;
+            }
+        }
+    } else {
+        table->SetCellData (cellEntry,v,h,HY_TABLE_EDIT_TEXT,true);
+    }
+
+    cellEntry->nInstances++;
+    if (u1) {
+        table->_MarkCellForUpdate (index);
+    }
+    if (u2) {
+        table->_MarkCellForUpdate (v*table->horizontalSpaces.lLength+h);
+    }
+
+    taint = u1|u2;
+
+}
+
+//__________________________________________________________
+
+void    _HYModelWindow::HandleEFVEditEvent (long index)
+{
+
+    _HYTable*       table     = (_HYTable*)GetCellObject (MODEL_MATRIX_ROW,1);
+    _String*        cellEntry = (_String*)table->GetCellData (index,0);
+    _String         newValue  (0.0),
+                    errMsg ("Frequency entry failed to evaluate to a number in [0,1].");
+
+    if (cellEntry->sLength) {
+        _Formula f (*cellEntry);
+        if (!f.IsEmpty()) {
+            _PMathObj fv = f.Compute();
+            if (fv&&(fv->ObjectClass()==NUMBER)) {
+                _Parameter freq = fv->Value();
+                if ((freq>=0.0)&&(freq<=1.0)) {
+                    newValue = freq;
+                    errMsg = empty;
+                }
+            }
+        }
+    }
+
+    if (errMsg.sLength) {
+        ProblemReport (errMsg,(Ptr)this);
+    }
+
+    table->SetCellData (&newValue,0,index,HY_TABLE_EDIT_TEXT,true);
+    UpdateEFVLastEntry ();
+}
+
+//__________________________________________________________
+
+void    _HYModelWindow::UpdateEFVLastEntry (void)
+{
+
+    _HYTable*       table     = (_HYTable*)components (12);
+    _String*        cellEntry;
+    _Parameter      sum = 0.0;
+
+    for (long   k=0; k<stateLabels.lLength-1; k++) {
+        cellEntry = (_String*)table->GetCellData (k,0);
+        sum += cellEntry->toNum();
+    }
+
+    if (sum<=1.0) {
+        _String lastCell (1.-sum);
+        table->SetCellData (&lastCell,0,stateLabels.lLength-1,HY_TABLE_STATIC_TEXT|HY_TABLE_CANTSELECT,true);
+    } else {
+        table->SetCellData (&invalidEFV,0,stateLabels.lLength-1,HY_TABLE_STATIC_TEXT|HY_TABLE_CANTSELECT,true);
+    }
+
+    table->_MarkCellForUpdate (stateLabels.lLength-1);
+    taint = true;
+}
+
+//__________________________________________________________
+
+void    _HYModelWindow::SetEFVChoice (long c)
+{
+    if (c!=EFVChoice) {
+        bool update = false;
+        if (c==0) {
+            _HYGuiObject  *EFVLabel  = (_HYGuiObject*)components(13),
+                           *EFVColumn = (_HYGuiObject*)components(12);
+
+            SetCell   (MODEL_MATRIX_HEADER_ROW,1,EFVLabel);
+            SetCell   (MODEL_MATRIX_HEADER_ROW,2,EFVLabel);
+            SetCell   (MODEL_MATRIX_HEADER_ROW,3,EFVLabel);
+            SetCell   (MODEL_MATRIX_ROW,1,EFVColumn);
+            SetCell   (MODEL_MATRIX_ROW,2,EFVColumn);
+            SetCell   (MODEL_MATRIX_ROW,3,EFVColumn);
+
+            update = true;
+        } else {
+            if (EFVChoice == 0) {
+                _HYGuiObject  *EFVLabel  = (_HYGuiObject*)components(2),
+                               *EFVColumn = (_HYGuiObject*)components(0);
+
+                _HYTable      *col = (_HYTable*)components(12);
+
+                SetCell   (MODEL_MATRIX_HEADER_ROW,1,EFVLabel);
+                SetCell   (MODEL_MATRIX_HEADER_ROW,2,EFVLabel);
+                SetCell   (MODEL_MATRIX_HEADER_ROW,3,EFVLabel);
+                SetCell   (MODEL_MATRIX_ROW,1,EFVColumn);
+                SetCell   (MODEL_MATRIX_ROW,2,EFVColumn);
+                SetCell   (MODEL_MATRIX_ROW,3,EFVColumn);
+
+
+                col->SetMessageRecipient (nil);
+                col->ClearSelection();
+                col->SetMessageRecipient (this);
+
+                update = true;
+            }
+        }
+        if (update) {
+            SetWindowRectangle (top,left,bottom,right);
+        }
+
+        EFVChoice = c;
+    }
+}
+
+//__________________________________________________________
+
+void    _HYModelWindow::UpdateButtonState ()
+{
+    _HYButtonBar * bb = (_HYButtonBar*) GetCellObject (MODEL_BUTTON_ROW,0);
+    _HYTable     * t  = (_HYTable*)     GetCellObject (MODEL_MATRIX_ROW,4);
+
+    _SimpleList  s;
+
+    bool         b1 = false,
+                 b2 = false,
+                 b3;
+
+    t->GetSelection (s);
+    b3 = s.lLength;
+
+    if (clipboardString.sLength)
+        if (s.lLength) {
+            b2 = true;
+        }
+
+    if (s.lLength==1) {
+        _String* sv = (_String*)t->GetCellData(s.lData[0]%t->horizontalSpaces.lLength,
+                                               s.lData[0]/t->horizontalSpaces.lLength);
+
+        if (sv->sLength) {
+            b1 = true;
+        }
+    }
+
+    bb->EnableButton (1,b1);
+    bb->EnableButton (2,b2);
+    bb->EnableButton (3,b3);
+    bb->EnableButton (5,b3);
+    _UpdateEditMenu  (b1,b2);
+}
+
+//__________________________________________________________
+
+void    _HYModelWindow::DoCopyCell ()
+{
+    _HYTable     * t  = (_HYTable*)     GetCellObject (MODEL_MATRIX_ROW,4);
+
+    _SimpleList  s;
+    t->GetSelection (s);
+    clipboardString = *(_String*)t->GetCellData(s.lData[0]%t->horizontalSpaces.lLength,
+                      s.lData[0]/t->horizontalSpaces.lLength);
+    SyncEditBox     ();
+}
+
+//__________________________________________________________
+
+bool    _HYModelWindow::DoEditModelName ()
+{
+    _String curName (GetTitle()),
+            prompt ("Enter a new model name:"),
+            curTitle;
+
+    curName.Trim (titlePrefix.sLength,-1);
+    curTitle = curName;
+
+    if (EnterStringDialog (curName,prompt, (Ptr)this)) {
+        if (!curName.Equal (&curTitle)) {
+            if (!curName.IsValidIdentifier()) {
+                curName = _String ('"') & curName & "\" is not a valid identifier.";
+                ProblemReport (curName,(Ptr)this);
+                return false;
+            }
+            if (FindModelTemplate (&curName)) {
+                curName = _String ('"') & curName & "\" is already being used.";
+                ProblemReport (curName,(Ptr)this);
+                return false;
+            }
+            SetTitle (titlePrefix&curName);
+        }
+        return true;
+    }
+    return false;
+}
+
+//__________________________________________________________
+
+void    _HYModelWindow::DoPasteToCells ()
+{
+    _Formula f (clipboardString);
+    _HYTable*t = (_HYTable*)GetCellObject (MODEL_MATRIX_ROW,4);
+
+    if (AddFormulaParametersToList(f)) {
+        _SimpleList sel, sel2;
+        t->GetSelection (sel);
+
+        SymmetrizeSelection (sel);
+
+        _String * cStr = new _String (clipboardString);
+        checkPointer (cStr);
+
+        for (long k=0; k< sel.lLength; k++) {
+            long h = sel.lData[k]/stateLabels.lLength,
+                 v = sel.lData[k]%stateLabels.lLength;
+
+            t->SetCellData(cStr,h,v,HY_TABLE_EDIT_TEXT|HY_TABLE_SELECTED,false);
+            t->SetCellData(cStr,v,h,HY_TABLE_EDIT_TEXT|HY_TABLE_SELECTED,false);
+
+            sel2 << v*stateLabels.lLength + h;
+        }
+        cStr->nInstances += 2*sel.lLength;
+        DeleteObject (cStr);
+        t->_MarkCellsForUpdate (sel);
+        t->_MarkCellsForUpdate (sel2);
+        taint = sel.lLength;
+    }
+
+}
+
+//__________________________________________________________
+
+void    _HYModelWindow::UpdateParameterName (long newID, long oldID)
+{
+    _HYTable*t = (_HYTable*)GetCellObject (MODEL_MATRIX_ROW,4);
+
+    _List        processedStrings,
+                 newStrings;
+
+    _String*     e = new _String (empty);
+
+    _SimpleList  flagged;
+
+    for (long k = 0; k<stateLabels.lLength; k++)
+        for (long j=k+1; j<stateLabels.lLength; j++) {
+            _String * cStr = (_String*)t->GetCellData (j,k),
+                      * pStr;
+            if (cStr->sLength) {
+                long    f = processedStrings.BinaryFind (cStr);
+                if (f>=0) {
+                    pStr = (_String*)newStrings(f);
+                    if (pStr->sLength) {
+                        flagged << k*stateLabels.lLength+j;
+                        flagged << j*stateLabels.lLength+k;
+                        t->SetCellData (pStr,k,j,t->cellTypes.lData[k*stateLabels.lLength+j],false);
+                        t->SetCellData (pStr,j,k,t->cellTypes.lData[j*stateLabels.lLength+k],false);
+                        pStr->nInstances+=2;
+                    }
+                } else {
+                    bool t = false;
+                    _Formula fla (*cStr);
+                    _String  *newS;
+                    for (f = 0; f<fla.GetList().lLength; f++) {
+                        _Operation* o = (_Operation*)fla.GetList()(f);
+                        if (o->GetAVariable()==oldID) {
+                            o->SetAVariable (newID);
+                            t = true;
+                        }
+                    }
+                    if (t) {
+                        newS = (_String*)fla.toStr();
+                        newS -> nInstances = 0;
+                        j--;
+                    } else {
+                        newS = e;
+                    }
+                    newStrings.InsertElement(newS,processedStrings.BinaryInsert (cStr),false);
+                }
+            }
+        }
+    t->_MarkCellsForUpdate (flagged);
+    taint = flagged.lLength;
+}
+
+//__________________________________________________________
+
+bool    warnDeleteParameter = false;
+
+//__________________________________________________________
+
+bool    _HYModelWindow::RemoveParameterName (long oldID)
+{
+    _HYTable*t = (_HYTable*)GetCellObject (MODEL_MATRIX_ROW,4);
+
+    _List        processedStrings,
+                 newStrings;
+
+    _SimpleList  flagged;
+
+    for (long k = 0; k<stateLabels.lLength; k++)
+        for (long j=k+1; j<stateLabels.lLength; j++) {
+            _String * cStr = (_String*)t->GetCellData (j,k),
+                      * pStr;
+            if (cStr->sLength) {
+                long    f = processedStrings.BinaryFind (cStr);
+                if (f>=0) {
+                    pStr = (_String*)newStrings(f);
+                    if (!pStr->Equal((_String*)processedStrings(f))) {
+                        if ((flagged.lLength==0)&&(!warnDeleteParameter))
+                            if (!ProceedPromptWithCheck (deleteParameters, donotWarnAgain,warnDeleteParameter, (Ptr)this)) {
+                                return false;
+                            }
+
+                        flagged << k*stateLabels.lLength+j;
+                        flagged << j*stateLabels.lLength+k;
+                        t->SetCellData (pStr,k,j,t->cellTypes.lData[k*stateLabels.lLength+j],false);
+                        t->SetCellData (pStr,j,k,t->cellTypes.lData[j*stateLabels.lLength+k],false);
+                        pStr->nInstances+=2;
+                    }
+                } else {
+                    _Formula fla (*cStr);
+                    _String  newS;
+                    for (f = 0; f<fla.GetList().lLength; f++) {
+                        _Operation* o = (_Operation*)fla.GetList()(f);
+                        if (o->GetAVariable()==oldID) {
+                            break;
+                        }
+                    }
+                    if (f<fla.GetList().lLength) {
+                        newS = empty;
+                        j--;
+                    } else {
+                        newS = *cStr;
+                    }
+                    newStrings.InsertElement(&newS,processedStrings.BinaryInsert (cStr),true);
+                }
+            }
+        }
+    t->_MarkCellsForUpdate (flagged);
+    taint = flagged.lLength;
+    return true;
+}
+
+//__________________________________________________________
+
+void    _HYModelWindow::DoMultiplyCells ()
+{
+    _HYTable*       t = (_HYTable*)GetCellObject (MODEL_MATRIX_ROW,4);
+    _HYButtonBar*  bb = (_HYButtonBar*)GetCellObject (MODEL_BUTTON_ROW,0);
+
+    _List           menuChoices;
+
+    long k = 0;
+
+    _String         s ("User expression");
+    menuChoices && & s;
+    if (localVariables.lLength+globalVariables.lLength+categoryVariables.lLength) {
+        menuChoices && & menuSeparator;
+    }
+
+    for (k=0; k<localVariables.lLength; k++) {
+        menuChoices << localVariables(k);
+    }
+    if (localVariables.lLength&&(globalVariables.lLength+categoryVariables.lLength)) {
+        menuChoices && & menuSeparator;
+    }
+    for (k=0; k<globalVariables.lLength; k++) {
+        menuChoices << globalVariables(k);
+    }
+    if (categoryVariables.lLength&&(globalVariables.lLength+localVariables.lLength)) {
+        menuChoices && & menuSeparator;
+    }
+    for (k=0; k<categoryVariables.lLength; k++) {
+        menuChoices << categoryVariables(k);
+    }
+
+    int h,v;
+
+    bb->GetButtonLoc  (4,h,v,true);
+    bb->_UnpushButton ();
+
+    s = HandlePullDown (menuChoices,h,v,0);
+    h = menuChoices.Find (&s);
+
+    if (h>=0) {
+        _String * t1 = (_String*)menuChoices (h);
+        if (h==0) {
+            _String prompt ("Your expression:");
+            s = "1";
+            if (!EnterStringDialog(s,prompt, (Ptr)this)) {
+                return;
+            }
+            _Formula fl (s);
+            if (fl.IsEmpty()) {
+                s = "You entered an invalid formula";
+                WarnError (s);
+                return;
+            }
+            _PMathObj  val = fl.Compute();
+            if (!val || (val->ObjectClass()!=NUMBER)) {
+                s = "Your expression did not evaluate to a number";
+                WarnError (s);
+                return;
+            }
+            fl.SimplifyConstants();
+            if (!AddFormulaParametersToList (fl)) {
+                return;
+            }
+            t1 = (_String*)fl.toStr();
+
+            if (fl.GetList().lLength > 1) {
+                *t1 = _String ('(') & *t1 & ')';
+            }
+        }
+
+        _SimpleList sel,
+                    sel2;
+
+        t->GetSelection (sel);
+
+        SymmetrizeSelection (sel);
+
+        _List       doneStrings,
+                    doneStrings2;
+
+        for (long k=0; k< sel.lLength; k++) {
+            long h = sel.lData[k]/stateLabels.lLength,
+                 v = sel.lData[k]%stateLabels.lLength;
+
+            _String* cStr = (_String*)t->GetCellData(v,h)->makeDynamic();
+
+            if (cStr->sLength) {
+                long ff = doneStrings.BinaryFind (cStr);
+                if (ff>=0) {
+                    DeleteObject (cStr);
+                    cStr = (_String*)doneStrings2 (ff);
+                    cStr->nInstances++;
+                } else {
+                    _Formula fla (*cStr);
+                    _String  *cStr2 = (_String*)fla.toStr();
+
+                    *cStr2 = _String ('(') & *cStr2 & ")*" & *t1;
+                    _Formula fla2(*cStr2);
+                    fla2.SimplifyConstants ();
+                    DeleteObject (cStr2);
+
+                    cStr2 = (_String*)fla2.toStr();
+                    doneStrings.BinaryInsert (cStr);
+                    ff = doneStrings.BinaryFind (cStr);
+                    doneStrings2.InsertElement (cStr2,ff,false);
+                    cStr = cStr2;
+                    cStr->nInstances++;
+                }
+            } else {
+                *cStr = *t1;
+                cStr->Trim (1,cStr->sLength-2);
+            }
+
+            t->SetCellData(cStr,h,v,HY_TABLE_EDIT_TEXT|HY_TABLE_SELECTED,false);
+            t->SetCellData(cStr,v,h,HY_TABLE_EDIT_TEXT|HY_TABLE_SELECTED,false);
+
+            sel2 << v*stateLabels.lLength + h;
+            cStr->nInstances++;
+        }
+
+        if (h==0) {
+            DeleteObject (t1);
+        }
+
+        t->_MarkCellsForUpdate (sel);
+        t->_MarkCellsForUpdate (sel2);
+        taint = sel.lLength;
+    }
+}
+
+//__________________________________________________________
+
+void    _HYModelWindow::DoClearCells ()
+{
+    _HYTable*t = (_HYTable*)GetCellObject (MODEL_MATRIX_ROW,4);
+
+    _SimpleList sel, sel2;
+    t->GetSelection (sel);
+
+    for (long k=0; k< sel.lLength; k++) {
+        long h = sel.lData[k]/stateLabels.lLength,
+             v = sel.lData[k]%stateLabels.lLength;
+
+        t->SetCellData(&empty,h,v,HY_TABLE_EDIT_TEXT|HY_TABLE_SELECTED,true);
+        t->SetCellData(&empty,v,h,HY_TABLE_EDIT_TEXT|HY_TABLE_SELECTED,true);
+
+        sel2 << v*stateLabels.lLength + h;
+    }
+
+    t->_MarkCellsForUpdate (sel);
+    t->_MarkCellsForUpdate (sel2);
+    taint = sel.lLength;
+}
+
+//__________________________________________________________
+
+bool    _HYModelWindow::CopyMatrix (_String& modelMatrix)
+{
+    long       k = LocateVarByName (modelMatrix);
+    if (k>=0) {
+        _Variable* theMx = FetchVar(k);
+        if (theMx->ObjectClass()==MATRIX) {
+            _Matrix * mx = (_Matrix*)theMx->GetValue();
+            return CopySimpleMatrix (mx);
+        }
+    }
+    return false;
+}
+
+//__________________________________________________________
+
+bool    _HYModelWindow::CopySimpleMatrix (_Matrix* mx)
+{
+    long       k;
+    if ((mx->GetHDim()==stateLabels.lLength)&&
+            (mx->GetVDim()==stateLabels.lLength)) {
+        _HYTable* t = (_HYTable*)GetCellObject (MODEL_MATRIX_ROW,4);
+        if (mx->MatrixType()==2) {
+            _List   alreadyDone;
+            bool    warnNewParametersSave = warnNewParameters;
+
+            warnNewParameters = true;
+
+            for (k=0; k<stateLabels.lLength; k++)
+                for (long j=k+1; j<stateLabels.lLength; j++) {
+                    _Formula* ff = mx->GetFormula (k,j);
+                    if (ff) {
+                        ff->SimplifyConstants();
+                        _String* fs = (_String*)ff->toStr();
+                        long f = alreadyDone.BinaryFind (fs);
+                        if (f<0) {
+                            AddFormulaParametersToList (*ff,true);
+                            alreadyDone.BinaryInsert (fs);
+                            f = alreadyDone.BinaryFind (fs);
+                        }
+                        DeleteObject (fs);
+                        fs = (_String*)alreadyDone(f);
+                        t->SetCellData(fs,k,j,HY_TABLE_EDIT_TEXT,false);
+                        t->SetCellData(fs,j,k,HY_TABLE_EDIT_TEXT,false);
+                        fs->nInstances+=2;
+                    } else {
+                        t->SetCellData(&empty,k,j,HY_TABLE_EDIT_TEXT,true);
+                        t->SetCellData(&empty,j,k,HY_TABLE_EDIT_TEXT,true);
+                    }
+                }
+
+            warnNewParameters = warnNewParametersSave;
+            DoFitColumns();
+            return true;
+        } else {
+            if (mx->MatrixType()==1) {
+                for (k=0; k<stateLabels.lLength; k++)
+                    for (long j=0; j<stateLabels.lLength; j++) {
+                        if (j==k) {
+                            continue;
+                        }
+
+                        _Parameter cellValue  = (*mx)(k,j);
+                        _String    cellString (cellValue);
+
+                        t->SetCellData(&cellString,k,j,HY_TABLE_EDIT_TEXT,true);
+                    }
+                DoFitColumns();
+                return true;
+            }
+        }
+    }
+    return false;
+}
+
+//__________________________________________________________
+
+void    _HYModelWindow::DoFitColumns ()
+{
+
+    _HYTable     * table  = (_HYTable*) GetCellObject (MODEL_MATRIX_ROW,4),
+                   * columnHeaders = (_HYTable*) GetCellObject (MODEL_MATRIX_HEADER_ROW,4);
+
+    table->AutoFitWidth(*columnHeaders);
+    table->EnforceWidth         (table->rel.right-table->rel.left-HY_SCROLLER_WIDTH+1,stateLabels.lLength-1);
+    columnHeaders->EnforceWidth (table->rel.right-table->rel.left-HY_SCROLLER_WIDTH+1,stateLabels.lLength-1);
+    columnHeaders->SetColumnSpacing (stateLabels.lLength,HY_SCROLLER_WIDTH-columnHeaders->GetColumnSpacing (stateLabels.lLength),false);
+    table->SetVisibleSize(table->rel);
+    table->_MarkForUpdate();
+    columnHeaders->_MarkForUpdate();
+    dim = MinMaxWindowDimensions();
+}
+
+//__________________________________________________________
+
+bool    _HYModelWindow::AddFormulaParametersToList (_Formula& f, bool respectClass)
+{
+    _SimpleList  newVars, classes;
+    _List        undefs;
+
+    {
+        _AVLList na (&newVars);
+        f.ScanFForVariables (na,true,false,false);
+        na.ReorderList();
+    }
+
+    for (long k=0; k<newVars.lLength; k++) {
+        _Variable * thisV = LocateVar (newVars.lData[k]);
+        _String* vName = thisV->GetName();
+        if (FindVarID (*vName) == -1) {
+            undefs << vName;
+            if (thisV->IsCategory()) {
+                classes<<2;
+            } else if (thisV->IsGlobal()) {
+                classes<<1;
+            } else {
+                classes<<0;
+            }
+        }
+    }
+
+    if (undefs.lLength) {
+        if (!warnNewParameters)
+            if (!ProceedPromptWithCheck (spawnParameters, donotWarnAgain, warnNewParameters, (Ptr)this)) {
+                return false;
+            }
+
+        if (respectClass)
+            for (long k=0; k<undefs.lLength; k++) {
+                InsertVarID (*(_String*)undefs(k),classes.lData[k]);
+            }
+        else
+            for (long k=0; k<undefs.lLength; k++) {
+                InsertVarID (*(_String*)undefs(k),0);
+            }
+
+        PrepareParameterMenu ();
+        SetParameterMenuState (lastParameterChoice);
+    }
+    return true;
+}
+
+//__________________________________________________________
+
+void    _HYModelWindow::DoSelectCells ()
+{
+    _HYTable*       t = (_HYTable*)GetCellObject (MODEL_MATRIX_ROW,4);
+    _HYButtonBar*  bb = (_HYButtonBar*)GetCellObject (MODEL_BUTTON_ROW,0);
+
+    _SimpleList     sel;
+    _List           menuChoices;
+    _String         s ("All Cells"),
+                    *match;
+
+    t->GetSelection (sel);
+
+    menuChoices && & s;
+    s = "All Empty Cells";
+    menuChoices && & s;
+    s = "Invert Selection";
+    menuChoices && & s;
+    s = "Scroll To Selection";
+    menuChoices && & s;
+
+    if (sel.lLength==1) {
+        match = (_String*)t->GetCellData (sel.lData[0]%stateLabels.lLength,sel.lData[0]/stateLabels.lLength);
+        if (match->sLength) {
+            s = _String("Cells equal to \"") & *match & '"';
+            menuChoices && &s;
+        }
+    }
+
+    if (sel.lLength) {
+        s = _String("Symmetrize Selection");
+        menuChoices && &s;
+    }
+
+    int h,v;
+
+    bb->GetButtonLoc  (3,h,v,true);
+    bb->_UnpushButton ();
+    s = HandlePullDown (menuChoices,h,v,0);
+
+    h = menuChoices.Find (&s);
+
+    switch (h) {
+    case 0:
+        DoSelectAll();
+        break;
+    case 1:
+        DoSelectAllEmpty();
+        break;
+    case 2:
+        t->InvertSelection();
+        t->_MarkForUpdate();
+        break;
+    case 3:
+        DoScrollToSelection(sel);
+        break;
+    default: {
+        if (h>=0) {
+            _String s2 ("Symmetrize Selection");
+            if (s.Equal (&s2)) {
+                SymmetrizeSelection (sel,true);
+                t->SetSelection     (sel,true);
+                t->_MarkForUpdate   ();
+            } else {
+                DoMatchCells(match);
+            }
+        }
+    }
+    }
+}
+//__________________________________________________________
+
+void    _HYModelWindow::DoScrollToSelection (_SimpleList& sel)
+{
+    if (sel.lLength) {
+        _HYTable*       t = (_HYTable*)GetCellObject (MODEL_MATRIX_ROW,4);
+        t->ScrollToRow    (sel.lData[0]/t->horizontalSpaces.lLength);
+        t->ScrollToColumn (sel.lData[0]%t->horizontalSpaces.lLength);
+        t->_MarkForUpdate();
+    }
+}
+//__________________________________________________________
+
+void    _HYModelWindow::DoSelectAll ()
+{
+    _HYTable*       t = (_HYTable*)GetCellObject (MODEL_MATRIX_ROW,4);
+
+    _SimpleList     sel (stateLabels.lLength*stateLabels.lLength);
+
+    for (long k=0; k<stateLabels.lLength*stateLabels.lLength; k++) {
+        sel << k;
+    }
+
+    t->ClearSelection (false);
+    t->SetSelection (sel,true);
+    t->_MarkForUpdate();
+}
+
+//__________________________________________________________
+
+void    _HYModelWindow::DoSave (char mode)
+{
+    _String pathToModelTemplates,
+            ending,
+            *varName,
+            EFVBit,
+            rateBit;
+
+    long    modelType;
+
+    if (GetTitle().Cut(titlePrefix.sLength,-1).beginswith(untitled))
+        if (!DoEditModelName ()) {
+            return;
+        }
+
+    FILE    * F;
+    _Matrix * mods = nil;
+
+    _HYTable* t = (_HYTable*)GetCellObject (MODEL_MATRIX_ROW,4);
+
+    long    k,j,m;
+
+
+    if (EFVChoice != 0) {
+
+        pathToModelTemplates = libDirectory&"SubstitutionClasses"&directorySep;
+
+        switch (type) {
+        case 0:
+            ending = "NucEFV";
+            break;
+        case 1:
+            ending = "AAEFV";
+            break;
+        case 2:
+            ending = "DinucEFV";
+            break;
+        case 3:
+            ending = "CodonEFV";
+            break;
+        }
+        pathToModelTemplates = pathToModelTemplates & ending & directorySep & *(_String*)EFVOptions(EFVChoice);
+
+        F = doFileOpen (pathToModelTemplates.sData,"rb");
+
+        if (!F) {
+            ending = _String ("Can't open the batch code for \"") & *(_String*)EFVOptions(EFVChoice) & "\". That file was recently moved or deleted. Bad idea.";
+            EFVOptions.Delete (EFVChoice);
+            EFVChoice = 0;
+            WarnError (ending);
+            return;
+        } else {
+            _String buffer (F);
+            fclose (F);
+            buffer = buffer.Replace (ModelMatrixDimension,_String ((long)stateLabels.lLength),true);
+            long f = buffer.Find (EFVCodeMarker);
+            if (f>=0) {
+                EFVBit = buffer.Cut (0,f-1);
+                buffer.Trim (f+EFVCodeMarker.sLength,-1);
+                f = batchLanguageFunctionNames.lLength;
+                if (type == HY_MODEL_TYPE_CODON) {
+                    _String * gcs = DefStringForGCode (&genCode);
+                    _ExecutionList ex1 (*gcs);
+                    ex1.Execute();
+                    DeleteObject (gcs);
+                }
+
+                _ExecutionList   thisList;
+                terminateExecution = false;
+                thisList.BuildList (buffer);
+                thisList.Execute();
+                if (terminateExecution==false) {
+                    k = LocateVarByName (EFVModifier);
+                    if (k>=0) {
+                        _Variable* thisVar = FetchVar (k);
+                        if (thisVar->ObjectClass() == MATRIX) {
+                            mods = (_Matrix*)thisVar->GetValue();
+                            if (mods->MatrixType()!=2) {
+                                mods = nil;
+                            }
+                        }
+                    }
+                } else {
+                    terminateExecution = false;
+                }
+
+                while (f<batchLanguageFunctionNames.lLength) {
+                    batchLanguageFunctionNames.Delete (f);
+                    batchLanguageFunctionParameters.Delete (f);
+                    batchLanguageFunctions.Delete(f);
+                    batchLanguageFunctionParameterLists.Delete(f);
+                    batchLanguageFunctionClassification.Delete(f);
+
+                }
+            } else {
+                EFVBit = buffer;
+            }
+        }
+    } else {
+        _HYTable* EFV = (_HYTable*)GetCellObject (MODEL_MATRIX_ROW,1);
+        _String *cellValue = (_String*)EFV->GetCellData (0,stateLabels.lLength-1);
+        if (cellValue->Equal(&invalidEFV)) {
+            ending = "This model can't be saved because user equilibrium frequencies don't add up to 1.";
+            ProblemReport (ending,(Ptr)this);
+            return;
+        }
+        _String uEFV (256L, true);
+        uEFV << &modelEFVVector;
+        uEFV << "={{";
+        for (k=0; k<stateLabels.lLength; k++) {
+            cellValue = (_String*)EFV->GetCellData (0,k);
+            uEFV << cellValue;
+            if (k<stateLabels.lLength-1) {
+                uEFV << ',';
+            }
+        }
+        uEFV << "}};\n";
+        uEFV << &multiplyByFrequencies;
+        uEFV << "=1;\n";
+        uEFV.Finalize();
+        EFVBit = uEFV;
+    }
+
+    CheckDependencies ();
+
+    if (localVariables.lLength+globalVariables.lLength+categoryVariables.lLength==0) {
+        ending = "A model without estimable parameters isn't very interesting. Please define some parameters before saving.";
+        ProblemReport (ending,(Ptr)this);
+        return;
+    }
+
+    if (categoryVariables.lLength) {
+        if (rateChoice) {
+            pathToModelTemplates = libDirectory&"SubstitutionClasses"&directorySep&"Heterogeneity"&directorySep& *(_String*)rateOptions(rateChoice);
+
+            F = doFileOpen (pathToModelTemplates.sData,"rb");
+
+            if (!F) {
+                ending = _String ("Can't open the batch code for \"") & *(_String*)rateOptions(rateChoice) & "\". That file was recently moved or deleted. Bad idea.";
+                rateOptions.Delete (rateChoice);
+                rateChoice = 0;
+                WarnError (ending);
+                return;
+            } else {
+                _String buffer (F);
+                fclose (F);
+                rateBit = buffer;
+            }
+        } else {
+            rateBit = "global shapeParameter = .5;\nshapeParameter:>0.01;shapeParameter:<100;\ncategory     categoryPlaceholder = (rateClassCount, EQUAL, MEAN, GammaDist(_x_,shapeParameter,shapeParameter), CGammaDist(_x_,shapeParameter,shapeParameter), 0 ,1e25,CGammaDist(_x_,shapeParameter+1,shapeParameter));";
+        }
+    }
+
+
+    _String modelOut (1024L, true),
+            modelID  (GetTitle().Cut(titlePrefix.sLength,-1));
+
+    modelOut << &modelName;
+    modelOut << '=';
+    modelOut << '"';
+    modelOut << &modelID;
+    modelOut << '"';
+    modelOut << ';';
+    modelOut << '\n';
+
+    modelOut << &modelDimension;
+    modelOut << '=';
+    modelOut << _String ((long)stateLabels.lLength);
+    modelOut << ';';
+    modelOut << '\n';
+
+    modelOut << &modelOptions;
+    modelOut << '=';
+    if (categoryVariables.lLength) {
+        modelType = HY_DATAPANEL_MODEL_MODELS+HY_DATAPANEL_MODEL_GLOBALG ;
+    } else if (globalVariables.lLength) {
+        modelType = HY_DATAPANEL_MODEL_MODELS+HY_DATAPANEL_MODEL_GLOBAL;
+    } else {
+        modelType = HY_DATAPANEL_MODEL_MODELS;
+    }
+
+    modelOut.AppendNewInstance(new _String (modelType)) ;
+    modelOut << ";\n";
+
+    modelOut << &ModelEFVType;
+    modelOut << "=\"";
+    modelOut << (_String*)EFVOptions (EFVChoice);
+    modelOut << "\";\n";
+
+    modelOut << &modelDataType;
+    modelOut << '=';
+    modelOut.AppendNewInstance(new _String ((long)type));
+    modelOut << ";\n";
+
+    if (type == HY_MODEL_TYPE_CODON) {
+        varName = DefStringForGCode (&genCode);
+        modelOut << varName;
+        DeleteObject (varName);
+    }
+
+    modelOut << "\n\n\n";
+    modelOut << "function ";
+    modelOut << modelFunction;
+    modelOut << "(";
+    modelOut << &modelMatrixName;
+    modelOut << "&,EFV)\n{\n\n\t";
+
+    modelOut << & modelMatrixName;
+    modelOut << "={";
+    ending = (long)stateLabels.lLength;
+    modelOut << &ending;
+    modelOut << ',';
+    modelOut << &ending;
+    modelOut << "};\n";
+
+    _List     vnames,
+              pvnames,
+              binames;
+
+    for (k=0; k<globalVariables.lLength; k++) {
+        modelOut << "\tglobal ";
+        varName = (_String*)globalVariables(k);
+        if (!varName->beginswith (globalPrefix)) {
+            _String vn;
+            vn = globalPrefix & '_' & *varName;
+            vnames << varName;
+            pvnames && & vn;
+            modelOut << &vn;
+        } else {
+            modelOut << varName;
+        }
+        modelOut << ";\n";
+    }
+
+    for (k=0; k<categoryVariables.lLength; k++) {
+        varName = (_String*)categoryVariables(k);
+        if (!varName->beginswith (categoryPrefix)) {
+            _String vn;
+            vn = categoryPrefix & '_' & *varName;
+            vnames << varName;
+            pvnames && & vn;
+            ending = vn;
+        } else {
+            ending = *varName;
+        }
+        _String cDef (rateBit.Replace ("categoryPlaceholder",ending,true));
+        if (k) {
+            cDef = cDef.Replace ("shapeParameter",_String("shapeParameter")&_String(k),true);
+        }
+        modelOut << &cDef;
+    }
+
+    binames && & vnames;
+    binames && & pvnames;
+
+    vnames.Clear();
+    pvnames.Clear();
+
+    if (mods)
+        for (k=0; k<stateLabels.lLength; k++) {
+            _Constant r (k);
+            for (j=0; j<stateLabels.lLength; j++) {
+                if (j==k) {
+                    continue;
+                }
+                varName = (_String*)t->GetCellData (j,k);
+                if (varName->sLength) {
+                    _Constant c (j);
+                    _PMathObj mod = mods->MAccess (&r,&c);
+
+                    m = vnames.BinaryFind (varName);
+                    if (m<0) {
+                        _Formula fl (*varName);
+                        _String  *ss = (_String*) fl.toStr (&binames);
+                        vnames.BinaryInsert (varName);
+                        m = vnames.BinaryFind (varName);
+                        pvnames.InsertElement (ss,m,false);
+                    }
+                    varName = (_String*)pvnames (m);
+
+                    _String index (k),
+                            index2(j);
+
+                    modelOut << '\t';
+                    modelOut << &modelMatrixName;
+                    modelOut << '[';
+                    modelOut << & index;
+                    modelOut << "][";
+                    modelOut << & index2;
+                    modelOut << "]:=";
+                    modelOut << varName;
+                    if (mod->ObjectClass ()==STRING) {
+                        ending = _String( "*(") & *((_FString*)mod)->theString & ')';
+                        modelOut << &ending;
+                    }
+                    modelOut << ";\n";
+                    DeleteObject (mod);
+                }
+            }
+        }
+    else
+        for (k=0; k<stateLabels.lLength; k++)
+            for (j=k+1; j<stateLabels.lLength; j++) {
+                varName = (_String*)t->GetCellData (j,k);
+                if (varName->sLength) {
+                    m = vnames.BinaryFind (varName);
+                    if (m<0) {
+                        _Formula fl (*varName);
+                        _String  *ss = (_String*) fl.toStr (&binames);
+                        vnames.BinaryInsert (varName);
+                        m = vnames.BinaryFind (varName);
+                        pvnames.InsertElement (ss,m,false);
+                    }
+                    varName = (_String*)pvnames (m);
+                    _String index (k),
+                            index2(j);
+
+                    modelOut << '\t';
+                    modelOut << &modelMatrixName;
+                    modelOut << '[';
+                    modelOut << & index;
+                    modelOut << "][";
+                    modelOut << & index2;
+                    modelOut << "]:=";
+                    modelOut << varName;
+                    modelOut << ";\n\t";
+                    modelOut << &modelMatrixName;
+                    modelOut << '[';
+                    modelOut << & index2;
+                    modelOut << "][";
+                    modelOut << & index;
+                    modelOut << "]:=";
+                    modelOut << varName;
+                    modelOut << ";\n";
+                }
+            }
+
+    ending = "\n\treturn 0;\n}\n\n";
+    modelOut << &ending;
+
+    modelOut << &EFVBit;
+
+    modelOut.Finalize();
+
+    if (mode==-1) {
+        pathToModelTemplates = libDirectory&"SubstitutionModels"&directorySep&"User"&directorySep;
+
+        switch (type) {
+        case 0:
+            ending = "Nucleotide";
+            break;
+        case 1:
+            ending = "AA";
+            break;
+        case 2:
+            ending = "Dinucleotide";
+            break;
+        case 3:
+            ending = "Codon";
+            break;
+        }
+        pathToModelTemplates = pathToModelTemplates & ending & directorySep & modelID;
+    } else {
+        pathToModelTemplates = WriteFileDialogInput ();
+    }
+
+    if (pathToModelTemplates.sLength) {
+        F = doFileOpen (pathToModelTemplates.sData,"w");
+
+        if (!F) {
+            pathToModelTemplates = _String("Can't open \"") & pathToModelTemplates & "\" for writing. Models must be saved in \"Substituion Models/User/\" to be accessible to HyPhy GUI.";
+            WarnError (pathToModelTemplates);
+            return;
+        } else {
+            fwrite (modelOut.sData,modelOut.sLength,1,F);
+        }
+
+        _List*  modelList = FindModelTemplate (&modelID);
+
+        if (modelList) {
+            modelList->Replace (2,&pathToModelTemplates,true);
+            _SimpleList * parms = (_SimpleList*)(*modelList)(1);
+            parms->lData[1] = stateLabels.lLength;
+            parms->lData[0] = modelType;
+        } else {
+            _List newModel;
+            newModel && & modelID;
+            _SimpleList parms;
+            parms << modelType;
+            parms << stateLabels.lLength;
+            newModel && & parms;
+            newModel && & pathToModelTemplates;
+            modelTemplates && & newModel;
+        }
+
+        taint = false;
+        fclose (F);
+    }
+
+    if (mods) {
+        DeleteVariable (EFVModifier);
+    }
+}
+
+//__________________________________________________________
+
+void    _HYModelWindow::DoSelectAllEmpty ()
+{
+    _HYTable*       t = (_HYTable*)GetCellObject (MODEL_MATRIX_ROW,4);
+
+    _SimpleList     sel (stateLabels.lLength*stateLabels.lLength);
+
+    for (long k=0; k<stateLabels.lLength-1; k++)
+        for (long n=k+1; n<stateLabels.lLength; n++) {
+            _String * v = (_String*)t->GetCellData(n,k);
+            if (v->sLength==0) {
+                sel << k*stateLabels.lLength+n;
+                sel << n*stateLabels.lLength+k;
+            }
+        }
+
+    t->ClearSelection (false);
+    t->SetSelection (sel,true);
+    t->_MarkForUpdate();
+}
+
+//__________________________________________________________
+
+void    _HYModelWindow::DoMatchCells (_String* m)
+{
+    _HYTable*       t = (_HYTable*)GetCellObject (MODEL_MATRIX_ROW,4);
+
+    _SimpleList     sel (stateLabels.lLength*stateLabels.lLength);
+
+    for (long k=0; k<stateLabels.lLength-1; k++)
+        for (long n=k+1; n<stateLabels.lLength; n++) {
+            _String * v = (_String*)t->GetCellData(n,k);
+            if (v->Equal (m)) {
+                sel << k*stateLabels.lLength+n;
+                sel << n*stateLabels.lLength+k;
+            }
+        }
+
+    t->ClearSelection (false);
+    t->SetSelection   (sel,true);
+    t->_MarkForUpdate ();
+}
+
+//__________________________________________________________
+
+void    _HYModelWindow::Activate (void)
+{
+    //_UpdateEditMenu   ();
+    _HYTWindow::Activate ();
+    _CheckClipboard();
+    UpdateButtonState ();
+}
+
+//__________________________________________________________
+
+void    _HYModelWindow::Deactivate (void)
+{
+    _HYTWindow::Deactivate ();
+    _SetClipboard();
+}
+
+//__________________________________________________________
+
+void    _HYModelWindow::SyncEditBox (void)
+{
+    _HYTextBox   *tl = (_HYTextBox*)GetCellObject (MODEL_BUTTON_ROW,5);
+    _HYButtonBar *bb3= (_HYButtonBar*)GetCellObject (MODEL_BUTTON_ROW,6);
+    tl->SetForeColor    (editBoxGood);
+    tl->SetText         (clipboardString);
+    tl->UnfocusComponent();
+    bb3->EnableButton   (0,false);
+}
+
+//__________________________________________________________
+
+void    _HYModelWindow::SymmetrizeSelection (_SimpleList& sel, bool pad)
+{
+    if (sel.lLength) {
+        _SimpleList symSel;
+        long k,h,v;
+        for (k=0; k< sel.lLength; k++) {
+            h = sel.lData[k]/stateLabels.lLength;
+            v = sel.lData[k]%stateLabels.lLength;
+
+            if (h<v) {
+                symSel << sel.lData[k];
+            } else {
+                symSel << v*stateLabels.lLength+h;
+            }
+        }
+
+        symSel.Sort();
+
+        sel.Clear();
+
+        sel << symSel.lData[0];
+
+        if (pad) {
+            h = symSel.lData[0]/stateLabels.lLength;
+            v = symSel.lData[0]%stateLabels.lLength;
+            sel<<v*stateLabels.lLength+h;
+            for (k=1; k<symSel.lLength; k++) {
+                if (symSel.lData[k]>symSel.lData[k-1]) {
+                    h = symSel.lData[k]/stateLabels.lLength;
+                    v = symSel.lData[k]%stateLabels.lLength;
+                    sel<<symSel.lData[k];
+                    sel<<v*stateLabels.lLength+h;
+                }
+            }
+        } else
+            for (k=1; k<symSel.lLength; k++) {
+                if (symSel.lData[k]>symSel.lData[k-1]) {
+                    sel<<symSel.lData[k];
+                }
+            }
+    }
+}
+
+
+
+//__________________________________________________________
+
+void    _HYModelWindow::UpdateClassMenus (void)
+{
+    _HYPullDown * p1 = (_HYPullDown*)GetCellObject (MODEL_CLASS_ROW,2);
+
+    p1->DeleteAllItems();
+
+    long k = 0, p;
+
+    for (; k<subClasses.lLength; k++) {
+        _List * sC = (_List*)subClasses(k);
+        p1->AddMenuItem (*(_String*)(*sC)(0),-1);
+    }
+
+    if (k&&matrixTemplates.lLength) {
+        p1->AddMenuItem (menuSeparator,-1);
+    }
+
+    p = p1->MenuItemCount();
+
+    for (k=0; k<matrixTemplates.lLength; k++) {
+        _List * sC = (_List*)matrixTemplates(k);
+        p1->AddMenuItem (*(_String*)(*sC)(0),-1);
+        p1->_SetMenuItemTextStyle (k+p, HY_FONT_ITALIC);
+    }
+
+    p+=k;
+
+    if (!p) {
+        p1->AddMenuItem (noneDefined,-1);
+        //p1->EnableMenu (false);
+    }
+
+    p1->ChangeSelection (0,true);
+}
+
+//__________________________________________________________
+
+void    _HYModelWindow::ProcessClassMenu (void)
+{
+    bool          f = false;
+
+    _HYPullDown * p1 = (_HYPullDown*)GetCellObject (MODEL_CLASS_ROW,2),
+                  * p2 = (_HYPullDown*)GetCellObject (MODEL_CLASS_ROW,5);
+
+    _HYButtonBar* bb2 = (_HYButtonBar*)GetCellObject (MODEL_BUTTON_ROW,4);
+
+    p2->DeleteAllItems ();
+
+    if (subClasses.lLength + matrixTemplates.lLength) {
+        if (p1->GetSelection() < subClasses.lLength)
+            for (long k = 0; k<subClasses.lLength; k++) {
+                _List * sC = (_List*)subClasses(k);
+                p2->AddMenuItem (*(_String*)(*sC)(0),-1);
+            }
+        else {
+            p2->AddMenuItem (noneApplicable,-1);
+            p2->EnableItem  (0,false);
+        }
+
+        p2->ChangeSelection (0,true);
+        f = true;
+    } else {
+        p2->AddMenuItem (noneApplicable,-1);
+        p2->EnableItem  (0,false);
+    }
+
+    p2->ChangeSelection (0,false);
+
+    bb2->EnableButton (0,f);
+    bb2->EnableButton (1,f);
+    bb2->EnableButton (2,f);
+    bb2->EnableButton (3,f);
+    bb2->EnableButton (4,f);
+}
+
+//__________________________________________________________
+
+void    _HYModelWindow::ProcessTemplateSelection (long k)
+{
+
+    _HYPullDown * p1 = (_HYPullDown*)GetCellObject (MODEL_CLASS_ROW,2),
+                  * p2 = (_HYPullDown*)GetCellObject (MODEL_CLASS_ROW,5);
+
+    _HYTable    * table = (_HYTable*)GetCellObject (MODEL_MATRIX_ROW,4);
+
+    long        s1 = p1->GetSelection(),
+                s2 = p2->GetSelection();
+
+    _SimpleList gSel;
+    if (s1<subClasses.lLength) {
+        _SimpleList *tSel1 =  (_SimpleList*) (*(_List*)subClasses(s1))(1),
+                     *tSel2 =  (_SimpleList*) (*(_List*)subClasses(s2))(1);
+
+        s1 = table->horizontalSpaces.lLength;
+
+        for (long i=0; i<tSel1->lLength; i++) {
+            s2 = tSel1->lData[i];
+            for (long j=0; j<tSel2->lLength; j++) {
+                gSel << s1*s2+tSel2->lData[j];
+            }
+        }
+    } else {
+        if (subClasses.lLength) {
+            s1 -= subClasses.lLength+1;
+        }
+
+        _SimpleList* tSel = (_SimpleList*) (*(_List*)matrixTemplates(s1))(1);
+        gSel.Duplicate (tSel);
+    }
+
+
+    if (k==0) {
+        table->ClearSelection();
+        table->SetSelection (gSel,true);
+    } else {
+        _SimpleList sel, fSel;
+        table->GetSelection (sel);
+        switch (k) {
+        case 1:
+            fSel.Union (sel,gSel);
+            break;
+        case 2:
+            fSel.Intersect (sel,gSel);
+            break;
+        case 3:
+            fSel.XOR (sel,gSel);
+            break;
+        case 4:
+            fSel.Subtract (sel,gSel);
+            break;
+        }
+        table->ClearSelection();
+        table->SetSelection (fSel,true);
+
+    }
+
+    table->_MarkForUpdate();
+}
+
+//__________________________________________________________
+
+void    _HYModelWindow::BuildTemplates (_SimpleList* geneticCode, char type)
+{
+    _List   receptacle;
+    _String pathToModelTemplates;
+    long    k;
+
+    pathToModelTemplates = libDirectory&"SubstitutionClasses";
+
+    _String ending;
+
+    switch (type) {
+    case HY_MODEL_TYPE_NUC:
+        ending = "nuc.bf";
+        break;
+    case HY_MODEL_TYPE_AA:
+        ending = "aa.bf";
+        break;
+    case HY_MODEL_TYPE_DINUC:
+        ending = "dinuc.bf";
+        break;
+    case HY_MODEL_TYPE_CODON:
+        ending = "codon.bf";
+        break;
+    }
+
+    ending = directorySep & ending;
+
+    ScanDirectoryForFileNames (pathToModelTemplates,receptacle,false);
+    for (k=0; k<receptacle.lLength; k++)
+        if (((_String*)receptacle(k))->endswith (ending)) {
+            break;
+        }
+
+    if (k<receptacle.lLength) {
+        FILE * thisFile = doFileOpen (((_String*)receptacle(k))->sData,"rb");
+        if (thisFile) {
+            _String buffer (thisFile);
+            fclose (thisFile);
+            long   g = batchLanguageFunctionNames.lLength;
+            _ExecutionList   thisList;
+            terminateExecution = false;
+            thisList.BuildList (buffer);
+            thisList.Execute();
+            if (!terminateExecution) {
+                long     tempFunc  = batchLanguageFunctionNames.Find (&buildTemps),
+                         classFunc = batchLanguageFunctionNames.Find (&buildClasses),
+                         tempNames = LocateVarByName (nameMatrixT),
+                         classNames= LocateVarByName (nameMatrixS);
+
+                if (((classNames>=0)||(tempNames>=0))&&(((classNames>=0)&&(classFunc>=0))||
+                                                        ((tempNames>=0)&&(tempFunc>=0)))) {
+                    if (geneticCode) {
+                        genCode.Duplicate (geneticCode);
+                        _String buffer2 (256,true);
+                        if (type == HY_MODEL_TYPE_CODON) {
+                            _String * gcs = DefStringForGCode (geneticCode);
+                            _ExecutionList ex1 (*gcs);
+                            ex1.Execute();
+                            DeleteObject (gcs);
+                        }
+                    }
+
+                    _Variable * v1,
+                              * res;
+
+                    _Matrix   * setNames,
+                              * setDescription;
+
+                    if ((tempNames>=0)&&(tempFunc>=0)) {
+                        v1 = FetchVar (tempNames);
+                        if (v1->ObjectClass() == MATRIX) {
+                            setNames = (_Matrix*) v1->GetValue();
+                            for (k=0; k<setNames->GetHDim()*setNames->GetVDim(); k++) {
+                                buffer  = _String ("out=")&buildTemps&'('&k&");";
+                                _ExecutionList  spawn (buffer);
+                                spawn.Execute();
+                                long  p = LocateVarByName (resultName);
+                                if (p>=0) {
+                                    res = FetchVar (p);
+                                    if (res->ObjectClass() == MATRIX) {
+                                        _SimpleList indices;
+                                        setDescription = (_Matrix*)res->GetValue();
+
+                                        for (p=0; p<setDescription->GetHDim()*setDescription->GetVDim(); p++) {
+                                            long ii = setDescription->theData[p];
+                                            if ((p>0)&&(ii==0)) {
+                                                break;
+                                            }
+                                            indices << ii;
+                                        }
+
+                                        _List tPair;
+
+                                        indices.Sort();
+                                        tPair << ((_FString*)(((_Formula**)setNames->theData)[k])->Compute())->theString;
+                                        tPair && & indices;
+
+                                        matrixTemplates && & tPair;
+                                    }
+                                }
+                            }
+                        }
+                    }
+                    if ((classNames>=0)&&(classFunc>=0)) {
+                        v1 = FetchVar (LocateVarByName (nameMatrixS));
+                        if (v1->ObjectClass() == MATRIX) {
+                            setNames = (_Matrix*) v1->GetValue();
+                            for (k=0; k<setNames->GetHDim()*setNames->GetVDim(); k++) {
+                                buffer  = _String ("out=")&buildClasses&'('&k&");";
+                                _ExecutionList  spawn (buffer);
+                                spawn.Execute();
+                                long  p = LocateVarByName (resultName);
+                                if (p>=0) {
+                                    res = FetchVar (p);
+                                    if (res->ObjectClass() == MATRIX) {
+                                        _SimpleList indices;
+                                        setDescription = (_Matrix*)res->GetValue();
+
+                                        for (p=0; p<setDescription->GetHDim()*setDescription->GetVDim(); p++) {
+                                            long ii = setDescription->theData[p];
+                                            if ((p>0)&&(ii==0)) {
+                                                break;
+                                            }
+                                            indices << ii;
+                                        }
+
+                                        _List tPair;
+
+                                        indices.Sort();
+                                        tPair << ((_FString*)(((_Formula**)setNames->theData)[k])->Compute())->theString;
+                                        tPair && & indices;
+
+                                        subClasses && & tPair;
+                                    }
+                                }
+                            }
+                        }
+                    }
+                }
+                while (g<batchLanguageFunctionNames.lLength) {
+                    batchLanguageFunctionNames.Delete (g);
+                    batchLanguageFunctionParameters.Delete (g);
+                    batchLanguageFunctions.Delete(g);
+                    batchLanguageFunctionParameterLists.Delete(g);
+                    batchLanguageFunctionClassification.Delete(g);
+                }
+
+            }
+        }
+    }
+
+    terminateExecution = false;
+    DeleteVariable (nameMatrixT);
+    DeleteVariable (nameMatrixS);
+    DeleteVariable (modelGenCode);
+
+    UpdateClassMenus();
+}
+
+//__________________________________________________________
+
+void    _HYModelWindow::GrabEFVs (char type)
+{
+    _List   receptacle;
+    _String pathToModelTemplates = libDirectory&"SubstitutionClasses"&directorySep;
+    long    k;
+
+    _String ending;
+
+    switch (type) {
+    case 0:
+        ending = "NucEFV";
+        break;
+    case 1:
+        ending = "AAEFV";
+        break;
+    case 2:
+        ending = "DinucEFV";
+        break;
+    case 3:
+        ending = "CodonEFV";
+        break;
+    }
+
+    pathToModelTemplates =  pathToModelTemplates & ending;
+    ScanDirectoryForFileNames (pathToModelTemplates,receptacle,true);
+
+    for (k=0; k<receptacle.lLength; k++) {
+        pathToModelTemplates = *(_String*) receptacle (k);
+        pathToModelTemplates.Trim (pathToModelTemplates.FindBackwards (directorySep,0,-1)+1,-1);
+
+        EFVOptions && & pathToModelTemplates;
+    }
+
+    _HYPullDown * efp = (_HYPullDown*)GetCellObject (MODEL_PARAMETER_ROW,5);
+    efp->DeleteAllItems();
+    for (k=0; k<EFVOptions.lLength; k++) {
+        efp->AddMenuItem (*(_String*)EFVOptions(k),-1);
+    }
+
+    efp->_MarkForUpdate();
+}
+
+
+//__________________________________________________________
+
+void    _HYModelWindow::GrabRateVariation (void)
+{
+    _List   receptacle;
+    _String pathToModelTemplates;
+    long    k;
+
+    pathToModelTemplates =   libDirectory&"SubstitutionClasses" & directorySep & "Heterogeneity";
+    ScanDirectoryForFileNames (pathToModelTemplates,receptacle,true);
+
+    for (k=0; k<receptacle.lLength; k++) {
+        pathToModelTemplates = *(_String*) receptacle (k);
+        pathToModelTemplates.Trim (pathToModelTemplates.FindBackwards (directorySep,0,-1)+1,-1);
+        rateOptions && & pathToModelTemplates;
+    }
+}
+
+//__________________________________________________________
+
+long    _HYModelWindow::ParameterEditBox(long inID)
+{
+    long res = lastParameterChoice;
+    _HYModelParameterDialog* sd = new _HYModelParameterDialog (this, inID, &res);
+    sd->Activate();
+    while (windowObjectRefs.Find ((long)sd)>=0) {
+        handleGUI();
+    }
+    return res;
+}
+
+//__________________________________________________________
+
+void    _HYModelWindow::CheckDependencies (void)
+{
+    _SimpleList declared;
+    _List       alreadyDone;
+    _HYTable*   tt = (_HYTable*)GetCellObject (MODEL_MATRIX_ROW,4);
+
+    long        k;
+
+
+    {
+        _AVLList    da (&declared);
+
+        for (k=0; k<stateLabels.lLength; k++)
+            for (long j=k+1; j<stateLabels.lLength; j++) {
+                _String * thisCell = (_String*)tt->GetCellData (k,j);
+                long    f = alreadyDone.BinaryFind (thisCell);
+                if (f<0) {
+                    _Formula ff (*thisCell);
+                    ff.ScanFForVariables (da, true, false,false);
+                    alreadyDone.BinaryInsert (thisCell);
+                }
+            }
+
+        da.ReorderList();
+    }
+
+    for (k=localVariables.lLength-1; k>=0; k--) {
+        long t = LocateVarByName (*(_String*)localVariables (k));
+        if (t>=0) {
+#ifndef USE_AVL_NAMES
+            t = variableReindex.lData[t];
+#else
+            t = variableNames.GetXtra(t);
+#endif
+            if (declared.BinaryFind(t)<0) {
+                localVariables.Delete (k);
+            }
+        }
+    }
+    for (k=globalVariables.lLength-1; k>=0; k--) {
+        long t = LocateVarByName (*(_String*)globalVariables (k));
+        if (t>=0) {
+#ifndef USE_AVL_NAMES
+            t = variableReindex.lData[t];
+#else
+            t = variableNames.GetXtra(t);
+#endif
+            if (declared.BinaryFind(t)<0) {
+                globalVariables.Delete (k);
+            }
+        }
+    }
+    for (k=categoryVariables.lLength-1; k>=0; k--) {
+        long t = LocateVarByName (*(_String*)categoryVariables (k));
+        if (t>=0) {
+#ifndef USE_AVL_NAMES
+            t = variableReindex.lData[t];
+#else
+            t = variableNames.GetXtra(t);
+#endif
+            if (declared.BinaryFind(t)<0) {
+                categoryVariables.Delete (k);
+            }
+        }
+    }
+
+}
+
+//__________________________________________________________
+
+_HYModelWindowDialog::_HYModelWindowDialog (long* ln1, long* ln2, _String* str1, long* ln3):_HYTWindow ("New Model Window", false, true)
+{
+
+    //long          index,
+    //              cellWidth;
+
+    mDim  = ln1;
+    gCode = ln2;
+    pl3   = ln3;
+    sp1   = str1;
+
+
+    _HYRect         canvasSettings = {30,100,30,100,HY_COMPONENT_NO_SCROLL|HY_COMPONENT_TRANSP_BG};
+
+    _HYLabel*       l1      = new _HYLabel (canvasSettings, GetOSWindowData());
+    _HYLabel*       l2      = new _HYLabel (canvasSettings, GetOSWindowData());
+    _HYLabel*       l3      = new _HYLabel (canvasSettings, GetOSWindowData());
+    _HYLabel*       l4      = new _HYLabel (canvasSettings, GetOSWindowData());
+    _HYLabel*       l5      = new _HYLabel (canvasSettings, GetOSWindowData());
+
+    canvasSettings.left = canvasSettings.right = 200;
+
+    _HYPullDown*    p1      = new _HYPullDown (canvasSettings, GetOSWindowData());
+    _HYPullDown*    p2      = new _HYPullDown (canvasSettings, GetOSWindowData());
+    _HYPullDown*    p3      = new _HYPullDown (canvasSettings, GetOSWindowData());
+    _HYPullDown*    p4      = new _HYPullDown (canvasSettings, GetOSWindowData());
+
+    canvasSettings.left = canvasSettings.right = 120;
+    _HYButton*      b1      = new _HYButton (canvasSettings, GetOSWindowData());
+
+    canvasSettings.left = canvasSettings.right = 81;
+    _HYButton*      b2      = new _HYButton (canvasSettings, GetOSWindowData());
+
+    _HYColor        bgc     = GetDialogBackgroundColor();
+
+    p1->SetMessageRecipient (this);
+    p2->SetMessageRecipient (this);
+    p3->SetMessageRecipient (this);
+    p4->SetMessageRecipient (this);
+    b1->SetMessageRecipient (this);
+    b2->SetMessageRecipient (this);
+
+    AddObject (l1);
+    AddObject (l2);
+    AddObject (l3);
+    AddObject (l4);
+    AddObject (l5);
+
+    AddObject (p1);
+    AddObject (p2);
+    AddObject (p3);
+    AddObject (p4);
+
+    AddObject (b1);
+    AddObject (b2);
+
+
+    SetTableDimensions (5,3);
+    SetCell   (0,0,l1);
+    SetCell   (1,0,l2);
+    SetCell   (2,0,l3);
+    SetCell   (3,0,l4);
+    SetCell   (4,0,l5);
+
+    SetCell   (0,1,p1);
+    SetCell   (0,2,p1);
+    SetCell   (1,1,p2);
+    SetCell   (1,2,p2);
+    SetCell   (2,1,p3);
+    SetCell   (2,2,p3);
+    SetCell   (3,1,p4);
+    SetCell   (3,2,p4);
+
+    SetCell   (4,1,b1);
+    SetCell   (4,2,b2);
+
+
+    _HYFont  labelFont;
+    l1->SetBackColor (bgc);
+    l2->SetBackColor (bgc);
+    l3->SetBackColor (bgc);
+    l4->SetBackColor (bgc);
+    l5->SetBackColor (bgc);
+
+    p1->SetBackColor (bgc);
+    p2->SetBackColor (bgc);
+    p3->SetBackColor (bgc);
+    p4->SetBackColor (bgc);
+
+    b1->SetBackColor (bgc);
+    b2->SetBackColor (bgc);
+
+#ifdef __MAC__
+    labelFont.face  = "System Font";
+    labelFont.size  = 12;
+#endif
+#ifdef __WINDOZE__
+    labelFont.face = "MS Sans Serif";
+    labelFont.size = 12;
+#endif
+#ifdef __HYPHY_GTK__
+    labelFont.face = _HY_SANS_FONT;
+    labelFont.size = 10;
+#endif
+
+    labelFont.style = HY_FONT_PLAIN;
+
+    l1->SetFont (labelFont);
+    l2->SetFont (labelFont);
+    l3->SetFont (labelFont);
+    l4->SetFont (labelFont);
+
+    b1->SetFont (labelFont);
+    b2->SetFont (labelFont);
+
+    l1->SetAlignFlags (HY_ALIGN_LEFT);
+    l2->SetAlignFlags (HY_ALIGN_LEFT);
+    l3->SetAlignFlags (HY_ALIGN_LEFT);
+    l4->SetAlignFlags (HY_ALIGN_LEFT);
+
+    b1->SetAlignFlags (HY_ALIGN_RIGHT);
+
+    p1->SetAlignFlags (HY_ALIGN_LEFT);
+    p2->SetAlignFlags (HY_ALIGN_LEFT);
+    p3->SetAlignFlags (HY_ALIGN_LEFT);
+    p4->SetAlignFlags (HY_ALIGN_LEFT);
+
+    l1->SetText       ("Data type:");
+    l2->SetText       ("Genetic Code:");
+    l3->SetText       ("Copy from:");
+    l4->SetText       ("Using mode:");
+
+    b1->SetText       ("  OK  ");
+    b1->SetButtonKind (HY_BUTTON_OK);
+    b2->SetText       (" Cancel ");
+    b2->SetButtonKind (HY_BUTTON_CANCEL);
+
+    p1->AddMenuItem   (nucDataType,-1);
+    p1->AddMenuItem   (dinucDataType,-1);
+    p1->AddMenuItem   (proteinDataType,-1);
+    p1->AddMenuItem   (codonDataType,-1);
+
+    for (long k=0; k<geneticCodes.lLength; k++) {
+        _List * thisCode = (_List*)geneticCodes(k);
+        p2->AddMenuItem (*(_String*)(*thisCode)(0), -1);
+    }
+
+    p3->AddMenuItem   ("A rather long one",-1);
+
+    p4->AddMenuItem   (parameterOption[0],-1);
+    p4->AddMenuItem   (parameterOption[1],-1);
+    p4->AddMenuItem   (parameterOption[2],-1);
+
+    p2->EnableMenu    (false);
+    p4->EnableMenu    (false);
+
+    DeleteObject (l1);
+    DeleteObject (l2);
+    DeleteObject (l3);
+    DeleteObject (l4);
+    DeleteObject (l5);
+    DeleteObject (p1);
+    DeleteObject (p2);
+    DeleteObject (p3);
+    DeleteObject (p4);
+    DeleteObject (b1);
+    DeleteObject (b2);
+
+    _HYRect     dim = MinMaxWindowDimensions();
+
+    *gCode = -1;
+    *mDim   = 4;
+
+    SetWindowRectangle (0,0,dim.bottom,dim.right);
+    CenterWindow       (this);
+    SwitchModelOptions   (0);
+    SwitchModelSelection (0);
+}
+
+//__________________________________________________________
+
+bool    _HYModelWindowDialog::ProcessEvent (_HYEvent* e)
+{
+    bool        done = false;
+    _String     firstArg;
+    _HYPullDown*pd;
+    long        i,f,g,k;
+
+    if (e->EventClass()==_hyMenuSelChangeEvent) {
+        firstArg = e->EventCode().Cut (0,(f=e->EventCode().Find(','))-1);
+        k = firstArg.toNum();
+        g = e->EventCode().Cut (f+1,-1).toNum();
+
+        for (i=0; i<components.lLength; i++)
+            if (((_HYGuiObject*)components(i))->MatchID(k)) {
+                break;
+            }
+
+        if (i==5) {
+            pd = (_HYPullDown*)GetCellObject (1,1);
+            pd->EnableMenu(g==3);
+            if (SwitchModelOptions   (g)) {
+                pd = (_HYPullDown*)GetCellObject (2,1);
+                pd->ChangeSelection (0);
+                pd->_MarkForUpdate();
+            }
+        } else if (i==6) {
+            SwitchModelOptions (3);
+        } else if (i==7) {
+            SwitchModelSelection (g);
+        }
+
+        done = true;
+    } else if (e->EventClass()==_hyButtonPushEvent) {
+        firstArg = e->EventCode().Cut (0,(f=e->EventCode().Find(','))-1);
+        k = firstArg.toNum();
+        for (i=0; i<components.lLength; i++)
+            if (((_HYGuiObject*)components(i))->MatchID(k)) {
+                break;
+            }
+
+        if (i==9) { // OK
+            _HYPullDown*     pd = (_HYPullDown*)GetCellObject (2,1);
+            *sp1 =* pd->GetMenuItem (pd->GetSelection());
+            pd = (_HYPullDown*)GetCellObject (3,1);
+            *pl3 = pd->GetSelection();
+            postWindowCloseEvent (GetID());
+            //_HYModelWindow* newModel = SpawnNewModel();
+            //newModel->BringToFront();
+        } else if (i==10) { // Cancel
+            *mDim = -1;
+            postWindowCloseEvent (GetID());
+        }
+
+        done = true;
+    }
+
+    if (done) {
+        DeleteObject (e);
+        return true;
+    }
+    return _HYTWindow::ProcessEvent(e);
+}
+
+//__________________________________________________________
+
+bool    _HYModelWindowDialog::SwitchModelOptions (char type)
+{
+    long modelDim1 = 0;
+    _HYPullDown * pd;
+    switch (type) {
+    case 0:
+        *mDim  = 4;
+        break;
+    case 1:
+        *mDim = 16;
+        break;
+    case 2:
+        *mDim = 20;
+        break;
+    case 3: {
+        pd = (_HYPullDown*) GetCellObject (1,1);
+        *gCode = pd->GetSelection();
+        modelDim1 = 64;
+        *mDim = 0;
+        _SimpleList * code = (_SimpleList*)(*(_List*)geneticCodes (*gCode))(2);
+        for (long k=0; k<code->lLength; k++)
+            if (code->lData[k]!=10) {
+                (*mDim)++;
+            }
+    }
+    }
+
+    pd = (_HYPullDown*) GetCellObject (2,1);
+    pd->DeleteAllItems ();
+    pd->AddMenuItem    (none,-1);
+
+    for (long k=0; k<modelTemplates.lLength; k++) {
+        _List * thisModel = (_List*)modelTemplates (k);
+        _SimpleList * modO= (_SimpleList*) (*thisModel) (1);
+        if ((modO->lData[1]==*mDim)||(modO->lData[1]==modelDim1)) {
+            pd->AddMenuItem (*(_String*)(*thisModel)(0),-1);
+        }
+    }
+
+    modelDim1 = pd->MenuItemCount();
+    //pd = (_HYPullDown*) GetCellObject (MODEL_CLASS_ROW,2);
+    //pd->EnableMenu (modelDim1>1);
+    return  modelDim1;
+}
+
+//__________________________________________________________
+
+void    _HYModelWindowDialog::SwitchModelSelection (long index)
+{
+    _HYPullDown * pd    = (_HYPullDown*) GetCellObject (2,1);
+
+    _List * thisModel   = FindModelTemplate (pd->GetMenuItem(index));
+
+    pd = (_HYPullDown*)GetCellObject (3,1);
+
+    if (thisModel) {
+        _SimpleList * modO  = (_SimpleList*) (*thisModel)   (1);
+        long        options = modO->lData[0];
+
+        pd->EnableMenu (true);
+        pd->EnableItem (1,options&HY_DATAPANEL_MODEL_GLOBAL);
+        pd->EnableItem (2,options&HY_DATAPANEL_MODEL_GLOBALG);
+
+        pd->ChangeSelection (0,false);
+    } else {
+        pd->EnableMenu (false);
+    }
+}
+
+//__________________________________________________________
+
+void    _HYModelWindowDialog::SetModelChoice (_String* model)
+{
+    _List*  modelT = FindModelTemplate (model);
+    if (modelT) {
+        _HYPullDown* pd = (_HYPullDown*)GetCellObject (0,1);
+        _SimpleList * mo = (_SimpleList*)(*modelT)(1);
+        long        k = 3;
+        switch (mo->lData[1]) {
+        case 4:
+            k=0;
+            break;
+        case 16:
+            k=1;
+            break;
+        case 20:
+            k=2;
+            break;
+        }
+        pd->ChangeSelection (k,true);
+        pd = (_HYPullDown*)GetCellObject (2,1);
+        k = pd->FindMenuItem(*(_String*)(*modelT)(0));
+        if (k>=0) {
+            pd->ChangeSelection (k,true);
+        }
+    }
+}
+
+
+//__________________________________________________________
+
+/*_HYModelWindow*   _HYModelWindowDialog::SpawnNewModel (void)
+{
+    _HYPullDown*     pd = (_HYPullDown*)GetCellObject (2,1);
+    _String          pds = *pd->GetMenuItem (pd->GetSelection());
+    pd = (_HYPullDown*)GetCellObject (3,1);
+    return ::SpawnNewModel (mDim, gCode,pds,pd->GetSelection());
+}*/
+
+//__________________________________________________________
+bool    _HYModelWindow::ConfirmClose (void)
+{
+    if (taint) {
+        _String warnMessage ("Would you like to save '");
+        warnMessage = warnMessage & GetTitle() & "' before it is closed?";
+        char    res = YesNoCancelPrompt(warnMessage);
+        if (res!=2) {
+            if (res==1) {
+                DoSave(-1);
+                return taint;
+            }
+        } else {
+            return false;
+        }
+    }
+
+    return true;
+}
+
+//__________________________________________________________
+
+_String*                DefStringForGCode (_SimpleList* geneticCode)
+{
+    _String * res = new _String (256L, true),
+    buffer;
+
+    checkPointer (res);
+
+    (*res) << &modelGenCode;
+    (*res) << '=';
+    (*res) << '{';
+    (*res) << '{';
+    for (long k=0; k<geneticCode->lLength-1; k++) {
+        buffer = (*geneticCode)(k);
+        (*res) << &buffer;
+        (*res) << ',';
+    }
+    buffer = (*geneticCode)(geneticCode->lLength-1);
+    (*res) << &buffer;
+    (*res) << '}';
+    (*res) << '}';
+    (*res) << ';';
+    (*res).Finalize();
+    return res;
+}
+
+//__________________________________________________________
+
+bool                OpenModelFromFile (_String& fileName)
+{
+    FILE    * F    = doFileOpen (fileName.sData,"rb");
+    bool    result = false;
+    _String errMsg;
+    if (!F) {
+        errMsg  = _String ("Can't open file \"") & fileName & "\" for reading.";
+    } else {
+        _String fileData (F);
+        fclose (F);
+
+        long        g = LocateVarByName (rateClassCount);
+
+        if (g<0) {
+            _String   four ("4");
+            _Variable rcv (rateClassCount,four,false);
+        }
+
+        g = batchLanguageFunctionNames.lLength;
+        _String * modelDef = new _String (fileData);
+
+        DeleteVariable (modelDataType);
+        DeleteVariable (modelFunction);
+        DeleteVariable (modelName);
+        DeleteVariable (ModelEFVType);
+        DeleteVariable (modelEFVVector);
+        DeleteVariable (modelDataType);
+        DeleteVariable (modelGenCode);
+
+        _ExecutionList    exList (*modelDef);
+        exList.Execute();
+        DeleteObject (modelDef);
+        if (terminateExecution) {
+            terminateExecution = false;
+        } else {
+
+            long        i1 = LocateVarByName (modelDataType),
+                        i2 = batchLanguageFunctionNames.Find (&modelFunction),
+                        k;
+
+            if (i2>=0) {
+                if (i1>=0) {
+                    _Variable * modelSL = FetchVar (i1);
+                    if (modelSL->ObjectClass ()==NUMBER) {
+                        i1 = modelSL->Compute()->Value();
+                        if ((i1==HY_MODEL_TYPE_NUC)||(i1==HY_MODEL_TYPE_DINUC)||(i1==HY_MODEL_TYPE_AA)||(i1==HY_MODEL_TYPE_CODON)) {
+                            _String     varID ("DummyEFV"),
+                                        EFV,
+                                        varID2 ("ModelMatrixTemplate");
+
+                            _SimpleList * fileGenCode = nil;
+
+                            FindUnusedObjectName (EFV,varID,variableNames,true);
+                            FindUnusedObjectName (EFV,varID2,variableNames,true);
+
+                            if (i1 == HY_MODEL_TYPE_CODON) {
+                                i2 = LocateVarByName (modelGenCode);
+                                if (i2<0) {
+                                    errMsg = "Codon model definitions must also include their genetic code (by defining \"ModelGeneticCode\").";
+                                } else {
+                                    modelSL = FetchVar (i2);
+                                    if (modelSL->ObjectClass() == MATRIX) {
+                                        _Matrix * codeMatrix = (_Matrix*)modelSL->GetValue();
+                                        if ((codeMatrix->GetHDim()!=1)||(codeMatrix->GetVDim()!=64)) {
+                                            errMsg = "Codon model definitions must also include their genetic code (64 component vector).";
+                                        } else {
+                                            fileGenCode = new _SimpleList;
+                                            checkPointer (fileGenCode);
+                                            _Matrix * evalMatrix = (_Matrix*)codeMatrix->ComputeNumeric();
+                                            for (i2 = 0; i2 < 64; i2++) {
+                                                k = evalMatrix->theData[i2];
+                                                if ((k<0)||(k>20)) {
+                                                    break;
+                                                }
+                                                (*fileGenCode) << k;
+                                            }
+                                            if (i2<64) {
+                                                errMsg = "Genetic Code definition vector entries must be integers between 0 and 20.";
+                                            }
+
+                                        }
+                                    }
+                                }
+                            }
+
+                            if (errMsg.sLength==0) {
+                                EFV = varID & "={";
+
+                                for (long k2=0; k2<64; k2++) {
+                                    EFV = EFV & "{1,1,1}\n";
+                                }
+
+                                EFV = EFV & "};\n dummy=" & modelFunction & "(\"" & varID2 & "\"," & varID & ");";
+
+                                _ExecutionList xl (EFV);
+                                xl.Execute();
+                                if (terminateExecution) {
+                                    terminateExecution = false;
+                                } else {
+                                    errMsg = untitled;
+                                    k = LocateVarByName (modelName);
+                                    if (k>=0) {
+                                        modelSL = FetchVar (k);
+                                        if (modelSL->ObjectClass ()==STRING) {
+                                            errMsg = *((_FString*)modelSL->GetValue())->theString;
+                                            if (!errMsg.IsValidIdentifier()) {
+                                                errMsg = untitled;
+                                            }
+                                        }
+                                    }
+
+                                    if (errMsg.Equal (&untitled)) {
+                                        if (modelSpawnerCount>1) {
+                                            errMsg = untitled & modelSpawnerCount;
+                                        }
+                                        modelSpawnerCount++;
+                                    }
+
+                                    _List            stateLabels;
+
+                                    SpawnStandardLabels (i1,stateLabels);
+
+                                    if (fileGenCode)
+                                        for (i2=63; i2>=0; i2--)
+                                            if (fileGenCode->lData[i2]==10) {
+                                                stateLabels.Delete (i2);
+                                            }
+
+                                    _HYModelWindow * res = new _HYModelWindow (errMsg,&stateLabels,i1);
+                                    res->BuildTemplates (fileGenCode,i1);
+
+                                    if (!res->CopyMatrix (varID2)) {
+                                        errMsg = "The file doesn't seem to contain a valid model definition function.";
+                                        res->SetTaint (false);
+                                        postWindowCloseEvent (res->GetID());
+                                    } else {
+                                        k = LocateVarByName (ModelEFVType);
+                                        if (k>=0) {
+                                            _Variable* thisVar = FetchVar(k);
+                                            if (thisVar->ObjectClass()==STRING) {
+                                                modelDef = ((_FString*)thisVar->Compute())->theString;
+                                                res->SetEFVVector (*modelDef);
+                                            }
+                                        }
+                                        k = LocateVarByName (modelEFVVector);
+                                        if (k>=0) {
+                                            _Variable* thisVar = FetchVar(k);
+                                            if (thisVar->ObjectClass()==MATRIX) {
+                                                _Matrix * mx = (_Matrix*)thisVar->GetValue();
+                                                res->CopyEFVMatrix ((_Matrix*)mx->ComputeNumeric());
+                                            }
+                                        }
+                                        errMsg = empty;
+                                        res->BringToFront();
+                                    }
+                                }
+                            }
+                            DeleteVariable (varID);
+                            DeleteVariable (varID2);
+                            DeleteVariable (ModelEFVType);
+                            DeleteObject (fileGenCode);
+                        }
+                    } else {
+                        errMsg = modelDataType & " is not one of recognized (0,1,2,3) values.";
+                    }
+
+                } else {
+                    errMsg = modelDataType & " constant must be defined in the model file.";
+                }
+            } else {
+                errMsg = modelFunction & " function must be defined in the model file.";
+            }
+
+            DeleteVariable (modelDataType);
+            DeleteVariable (modelGenCode);
+
+            if (errMsg.sLength) {
+                ProblemReport (errMsg);
+            } else {
+                result = true;
+            }
+
+        }
+        while (g<batchLanguageFunctionNames.countitems()) {
+            batchLanguageFunctionNames.Delete (g);
+            batchLanguageFunctionParameters.Delete (g);
+            batchLanguageFunctions.Delete(g);
+            batchLanguageFunctionParameterLists.Delete(g);
+            batchLanguageFunctionClassification.Delete(g);
+        }
+    }
+    return result;
+}
+
+//__________________________________________________________
+
+void                SpawnStandardLabels (char type, _List& labels)
+{
+    labels.Clear();
+    _String stateLabels,
+            nucs (dnaOneCharCodes);
+
+    long   k,j,l;
+
+    switch (type) {
+    case HY_MODEL_TYPE_NUC:
+        labels.AppendNewInstance(new _String('A'));
+        labels.AppendNewInstance(new _String('C'));
+        labels.AppendNewInstance(new _String('G'));
+        labels.AppendNewInstance(new _String('T'));
+        break;
+    case HY_MODEL_TYPE_DINUC: {
+        for (k=0; k<4; k++)
+            for (j=0; j<4; j++) {
+                stateLabels = _String(nucs.sData[k])&nucs.sData[j];
+                labels && & stateLabels;
+            }
+        break;
+    }
+    case HY_MODEL_TYPE_AA: {
+        for (k=0; k<20; k++) {
+            labels.AppendNewInstance (new _String (aminoAcidOneCharCodes.sData[k]));
+        }
+        break;
+    }
+    case HY_MODEL_TYPE_CODON: {
+        _String stateLabels;
+
+        for (k=0; k<4; k++)
+            for (j=0; j<4; j++)
+                for (l=0; l<4; l++) {
+                    stateLabels = _String(nucs.sData[k])&nucs.sData[j]&nucs.sData[l];
+                    labels && & stateLabels;
+                }
+        break;
+    }
+    }
+}
+
+//__________________________________________________________
+bool                OpenModelFromMatrix (_String& matrixName, bool setMx)
+{
+    long f = modelNames.Find(&matrixName),
+         i1,
+         i2,
+         k;
+
+    if (f>=0) {
+        _Matrix * modelMatrix = (_Matrix*)LocateVar (modelMatrixIndices.lData[f])->GetValue();
+
+        switch (modelMatrix->GetHDim()) {
+        case 4:
+            i1= HY_MODEL_TYPE_NUC;
+            break;
+        case 16:
+            i1= HY_MODEL_TYPE_DINUC;
+            break;
+        case 20:
+            i1= HY_MODEL_TYPE_AA;
+            break;
+        default:
+            i1= HY_MODEL_TYPE_CODON;
+
+        }
+
+        _List            stateLabels;
+        _String          errMsg;
+
+        SpawnStandardLabels (i1,stateLabels);
+        _SimpleList * code = nil;
+
+        if (i1==HY_MODEL_TYPE_CODON) {
+            _SimpleList matchedTables;
+            for (k=0; k<geneticCodes.lLength; k++)
+                if (DimensionOfGenCode(k) == modelMatrix->GetHDim()) {
+                    matchedTables << k;
+                }
+            if (matchedTables.lLength) {
+                if (matchedTables.lLength>1) {
+                    _SimpleList picks,
+                                sel;
+                    picks << 0;
+                    picks << 1;
+                    i2 = HandleListSelection (geneticCodes,picks,matchedTables,"Pick a genetic code for model display",sel,1);
+                    if (i2<0) {
+                        return false;
+                    } else {
+                        i2 = sel.lData[0];
+                    }
+                } else {
+                    i2 = matchedTables.lData[0];
+                }
+            } else {
+                errMsg = _String ("Can't display codon model \"") & matrixName & "\", b/c its dimensions don't match any genetic code known to HyPhy.";
+                ProblemReport (errMsg);
+                return false;
+            }
+            code = ((_SimpleList*)(*(_List*)(geneticCodes(i2)))(2));
+
+            for (i2=63; i2>=0; i2--)
+                if (code->lData[i2]==10) {
+                    stateLabels.Delete (i2);
+                }
+
+        }
+
+
+        if (modelSpawnerCount>1) {
+            errMsg = untitled & modelSpawnerCount;
+        } else {
+            errMsg = untitled;
+        }
+        modelSpawnerCount++;
+
+        _HYModelWindow * res = new _HYModelWindow (errMsg,&stateLabels,i1);
+        res->BuildTemplates (code,i1);
+
+        if (setMx)
+            if (!res->CopySimpleMatrix (modelMatrix)) {
+                errMsg = "Failed to copy model matrix. Oops.";
+                res->SetTaint (false);
+                postWindowCloseEvent (res->GetID());
+                ProblemReport (errMsg);
+                return false;
+            } else {
+                i2 = modelFrequenciesIndices.lData[f];
+                if (i2<0) {
+                    i2 = -i2-1;
+                }
+                res->CopyEFVMatrix ((_Matrix*)((_Matrix*)LocateVar(i2)->GetValue())->ComputeNumeric());
+                res->BringToFront();
+            }
+        return true;
+    }
+
+    return false;
+}
+
+//__________________________________________________________
+bool                OpenModelFromCalcNode (_String& nodeName, bool expMx = false)
+{
+    long f = LocateVarByName (nodeName),
+         i1,
+         i2;
+
+    if (f>=0) {
+        _Variable* thisNode = FetchVar(f);
+        if (thisNode&&(thisNode->ObjectClass()==TREE_NODE)) {
+            _CalcNode* thisCNode = (_CalcNode*)thisNode;
+
+            i1 = thisCNode->GetModelIndex();
+            if (i1 != HY_NO_MODEL) {
+                if (OpenModelFromMatrix(*(_String*)modelNames(i1),false)) {
+                    _String errMsg;
+
+                    if (modelSpawnerCount>2) {
+                        errMsg = untitled & (modelSpawnerCount-1);
+                    } else {
+                        errMsg = untitled;
+                    }
+
+                    errMsg = titlePrefix & errMsg;
+
+                    _HYModelWindow* res = (_HYModelWindow*)windowObjectRefs(FindWindowByName (errMsg));
+
+                    _Matrix       * modelMatrix = (_Matrix*)thisCNode->ComputeModelMatrix (false)->MultByFreqs (i1);
+                    if (expMx) {
+                        modelMatrix = (_Matrix*) modelMatrix->Exponentiate();
+                    }
+
+                    if (res->CopySimpleMatrix (modelMatrix)) {
+                        i2 = modelFrequenciesIndices.lData[i1];
+                        if (i2<0) {
+                            i2 = -i2-1;
+                        }
+                        res->CopyEFVMatrix ((_Matrix*)((_Matrix*)LocateVar(i2)->GetValue())->ComputeNumeric());
+                        res->BringToFront();
+                        res->SetTaint (false);
+                        _String tryMe;
+                        if (expMx) {
+                            tryMe = "Transition_Matrix_For_";
+                        } else {
+                            tryMe = "Rate_Matrix_For_";
+                        }
+
+                        tryMe = tryMe & nodeName;
+                        errMsg = tryMe;
+                        i2 = 1;
+                        while (FindWindowByName(errMsg)>=0) {
+                            i2 ++;
+                            errMsg = tryMe & i2;
+                        }
+                        res->SetTitle (errMsg);
+                        if (expMx) {
+                            DeleteObject (modelMatrix);
+                        }
+                        return true;
+                    }
+                    if (expMx) {
+                        DeleteObject (modelMatrix);
+                    }
+                }
+            }
+        }
+    }
+
+    return false;
+}
+
+//__________________________________________________________________
+_HYModelParameterDialog::_HYModelParameterDialog     (_HYModelWindow* tp, long in, long* r):_HYTWindow ("Parameter Properties",false,true, (Ptr)tp)
+{
+
+    result      = r;
+    inID        = in;
+    parentModel = tp;
+
+    _HYRect         canvasSettings = {30,100,30,100,HY_COMPONENT_TRANSP_BG};
+
+    _HYLabel*       l1 = new _HYLabel (canvasSettings, GetOSWindowData());
+    checkPointer    (l1);
+
+    _HYLabel*       l2 = new _HYLabel (canvasSettings, GetOSWindowData());
+    checkPointer    (l2);
+
+    canvasSettings.top = canvasSettings.bottom = 60;
+
+    _HYLabel*       l3 = new _HYLabel (canvasSettings, GetOSWindowData());
+    checkPointer    (l3);
+
+    canvasSettings.left = canvasSettings.right = 200;
+    canvasSettings.top = canvasSettings.bottom = 30;
+
+    _HYTextBox*     tb = new _HYTextBox (canvasSettings, GetOSWindowData());
+    checkPointer    (tb);
+
+    _HYCheckbox*    rb1 = new _HYCheckbox (canvasSettings, GetOSWindowData(),true);
+    checkPointer    (rb1);
+    _HYCheckbox*    rb2 = new _HYCheckbox (canvasSettings, GetOSWindowData(),true);
+    checkPointer    (rb2);
+    _HYCheckbox*    rb3 = new _HYCheckbox (canvasSettings, GetOSWindowData(),true);
+    checkPointer    (rb3);
+
+
+    canvasSettings.bottom = canvasSettings.top   = 36;
+    canvasSettings.left   = canvasSettings.right = 210;
+
+    _HYButton*      b1      = new _HYButton (canvasSettings, GetOSWindowData());
+    canvasSettings.left   = canvasSettings.right = 90;
+    _HYButton*      b2      = new _HYButton (canvasSettings, GetOSWindowData());
+
+    checkPointer (b1);
+    checkPointer (b2);
+
+    tb->SetMessageRecipient (this);
+    rb1->SetMessageRecipient (this);
+    rb2->SetMessageRecipient (this);
+    rb3->SetMessageRecipient (this);
+    b1->SetMessageRecipient (this);
+    b2->SetMessageRecipient (this);
+
+    AddObject (l1);// 0
+    AddObject (l2);// 1
+    AddObject (rb1);// 2
+    AddObject (rb2);// 3
+    AddObject (rb3);// 4
+    AddObject (tb);// 5
+    AddObject (b1);// 6
+    AddObject (b2);// 7
+    AddObject (l3);// 7
+
+    SetTableDimensions (5,2);
+
+    SetCell (0,0,l1);
+    SetCell (0,1,tb);
+    SetCell (1,0,l2);
+    SetCell (1,1,rb1);
+    SetCell (2,0,l3);
+    SetCell (2,1,rb2);
+    SetCell (3,0,l3);
+    SetCell (3,1,rb3);
+    SetCell (4,0,b1);
+    SetCell (4,1,b2);
+
+    _HYFont         labelFont;
+#ifdef __MAC__
+    labelFont.face = "System Font";
+    labelFont.size = 12;
+#endif
+#ifdef __WINDOZE__
+    labelFont.face = "MS Sans Serif";
+    labelFont.size = 12;
+#endif
+#ifdef __HYPHY_GTK__
+    labelFont.face = _HY_SANS_FONT;
+    labelFont.size = 10;
+#endif
+
+    labelFont.style = HY_FONT_PLAIN;
+
+    b1->SetFont (labelFont);
+    b2->SetFont (labelFont);
+    l1->SetFont (labelFont);
+    l2->SetFont (labelFont);
+    rb1->SetFont (labelFont);
+    rb2->SetFont (labelFont);
+    rb3->SetFont (labelFont);
+    tb->SetText (" ");
+    tb->SetFont (labelFont);
+    tb->SetText (empty);
+
+    b1->SetText (" OK ");
+    b2->SetText (" Cancel ");
+
+    b1->SetAlignFlags (HY_ALIGN_RIGHT);
+    l1->SetAlignFlags (HY_ALIGN_LEFT);
+    l2->SetAlignFlags (HY_ALIGN_LEFT);
+    rb1->SetAlignFlags (HY_ALIGN_LEFT);
+    rb2->SetAlignFlags (HY_ALIGN_LEFT);
+    rb3->SetAlignFlags (HY_ALIGN_LEFT);
+
+    l1->SetText ("Parameter ID:");
+    l2->SetText ("Parameter Class:");
+    rb1->SetText ("Local");
+    rb2->SetText ("Global");
+    rb3->SetText ("Category");
+
+    keyboardFocusChain << 5;
+    ProcessEvent (generateKeyboardFocusEvent (tb->GetID()));
+
+    orb = 2;
+
+    if (inID>=0) {
+        _String newSID = parentModel->RetrieveVarID (inID);
+        tb->SetText  (newSID);
+        tb->SetForeColor (editBoxGood);
+        orb = 2+parentModel->VarKind (inID);
+        b1->EnableButton (true);
+    } else {
+        b1->EnableButton (false);
+    }
+
+
+    ((_HYCheckbox*)components (orb))->SetState (true,false);
+    rb = orb;
+
+    b1->SetButtonKind (HY_BUTTON_OK);
+    b2->SetButtonKind (HY_BUTTON_CANCEL);
+
+    _HYRect             dim = MinMaxWindowDimensions();
+    SetWindowRectangle  (0,0,dim.bottom,dim.right);
+    CenterWindow        (this);
+
+    DeleteObject (b1);
+    DeleteObject (b2);
+    DeleteObject (l1);
+    DeleteObject (l2);
+    DeleteObject (l3);
+    DeleteObject (rb1);
+    DeleteObject (rb2);
+    DeleteObject (rb3);
+    DeleteObject (tb);
+}
+
+//__________________________________________________________
+
+bool    _HYModelParameterDialog::ProcessEvent (_HYEvent* e)
+{
+    bool        done = false;
+    _String     firstArg;
+    long        i,f;
+
+    if (e->EventClass()==_hyTextEditChange) {
+        firstArg = e->EventCode().Cut (0,(f=e->EventCode().Find(','))-1);
+        i = MatchComponentID (firstArg);
+
+        if (i==5) {
+            _HYTextBox * tb = (_HYTextBox*)components (i);
+            bool    isGood = false;
+
+            _String newSID = tb->GetText();
+
+            if (newSID.IsValidIdentifier()) {
+                f = parentModel->FindVarID (newSID);
+                if (f>=0) {
+                    if (inID == f) {
+                        isGood = true;
+                    }
+                } else {
+                    isGood = true;
+                }
+            }
+
+            tb->SetForeColor (isGood?editBoxGood:editBoxBad);
+
+            ((_HYButton*)components(6))->EnableButton (isGood);
+
+        }
+        done = true;
+    } else if (e->EventClass()==_hyButtonPushEvent) {
+        firstArg = e->EventCode().Cut (0,(f=e->EventCode().Find(','))-1);
+        i = MatchComponentID (firstArg);
+
+        if (i==6) { // OK
+            _HYTextBox * tb = (_HYTextBox*)components (5);
+            _String newSID = tb->GetText();
+            *result = parentModel->lastParameterChoice;
+            if (newSID.sLength) {
+                if (inID!=-1) {
+                    if ((newSID.Equal(&parentModel->RetrieveVarID (inID)))&&(orb==rb)) {
+                        *result = inID;
+                    } else {
+                        parentModel->RenameVarID (newSID,inID,rb-2);
+                    }
+                } else {
+                    parentModel->InsertVarID (newSID, rb-2);
+                    *result = parentModel->FindVarID (newSID);
+                }
+            }
+            //*result = 0;
+            postWindowCloseEvent (GetID());
+        } else if (i==7) {
+            *result = parentModel->lastParameterChoice;
+            postWindowCloseEvent (GetID());
+        } else if ((i>=2)&&(i<5)) {
+            if (i!=rb) {
+                ((_HYCheckbox*)components (rb))->SetState (false,false);
+                rb = i;
+            }
+        }
+
+        done = true;
+    }
+
+    if (done) {
+        DeleteObject (e);
+        return true;
+    }
+    return _HYTWindow::ProcessEvent(e);
+}
+
+//__________________________________________________________
+
+_HYModelWindow* SpawnNewModel (long mDim, long gCode, _String& s1, long s2)
+{
+    _List   labels;
+
+    _String stateLabels,
+            nucs (dnaOneCharCodes);
+
+    _SimpleList
+    *genC = nil;
+
+    char    type;
+    long    k,j,l;
+
+    switch (mDim) {
+    case 4:
+        labels.AppendNewInstance (new _String('A'));
+        labels.AppendNewInstance (new _String('C'));
+        labels.AppendNewInstance (new _String('G'));
+        labels.AppendNewInstance (new _String('T'));
+        type = HY_MODEL_TYPE_NUC;
+        break;
+    case 16: {
+        for (k=0; k<4; k++)
+            for (j=0; j<4; j++) {
+                stateLabels = _String(nucs.sData[k])&nucs.sData[j];
+                labels && & stateLabels;
+            }
+        type = HY_MODEL_TYPE_DINUC;
+        break;
+    }
+    case 20: {
+        for (k=0; k<20; k++) {
+            labels.AppendNewInstance (new _String (aminoAcidOneCharCodes.sData[k]));
+        }
+        type = HY_MODEL_TYPE_AA;
+        break;
+    }
+    default: {
+        genC = (_SimpleList*)(*(_List*)geneticCodes(gCode))(2);
+        for (k=0; k<4; k++)
+            for (j=0; j<4; j++)
+                for (l=0; l<4; l++) {
+                    if (genC->lData[k*16+j*4+l]!=10) {
+                        stateLabels = _String(nucs.sData[k])&nucs.sData[j]&nucs.sData[l];
+                        labels && & stateLabels;
+                    }
+                }
+        type = HY_MODEL_TYPE_CODON;
+
+    }
+    }
+
+    //_HYPullDown*       pd = (_HYPullDown*)GetCellObject (2,1);
+
+
+    _HYModelWindow * res = new _HYModelWindow (untitled&(modelSpawnerCount==1?empty:modelSpawnerCount), &labels, type);
+    modelSpawnerCount++;
+    res->BuildTemplates (genC, type);
+    if (!s1.Equal (&none)) {
+        _List* theModel = FindModelTemplate(&s1);
+        if (theModel) {
+            FILE * thisModel = doFileOpen (((_String*)(*theModel)(2))->getStr(),"rb");
+            if (thisModel) {
+                long   g = batchLanguageFunctionNames.lLength;
+                _String * modelDef = new _String (thisModel);
+                fclose (thisModel);
+                //pd = (_HYPullDown*)GetCellObject (3,1);
+                *modelDef = _String ("modelType=")&_String (s2)&";\nrateClassCount=4;\n"&*modelDef;
+                if (type==HY_MODEL_TYPE_CODON) {
+                    _String * gcs = DefStringForGCode (genC);
+                    *modelDef = *gcs&*modelDef;
+                    DeleteObject (gcs);
+                }
+                _String varID ("DummyEFV"),
+                        EFV,
+                        varID2 ("ModelMatrixTemplate");
+
+                FindUnusedObjectName (EFV,varID,variableNames,true);
+                FindUnusedObjectName (EFV,varID2,variableNames,true);
+
+                EFV = varID & "={";
+
+                for (long k2=0; k2<64; k2++) {
+                    EFV = EFV & "{1,1,1}\n";
+                }
+
+                EFV = EFV & "};\n dummy=" & modelFunction & "(\"" &
+                      varID2 & "\"," & varID & ");";
+
+                *modelDef = *modelDef & '\n' & EFV;
+
+                DeleteVariable (ModelEFVType);
+                DeleteVariable (modelEFVVector);
+
+                _ExecutionList ex (*modelDef);
+                ex.Execute();
+                DeleteObject   (modelDef);
+
+                res->CopyMatrix (varID2);
+
+                k = LocateVarByName (ModelEFVType);
+                if (k>=0) {
+                    _Variable* thisVar = FetchVar(k);
+                    if (thisVar->ObjectClass()==STRING) {
+                        modelDef = ((_FString*)thisVar->Compute())->theString;
+                        res->SetEFVVector (*modelDef);
+                    }
+                }
+
+                k = LocateVarByName (modelEFVVector);
+                if (k>=0) {
+                    _Variable* thisVar = FetchVar(k);
+                    if (thisVar->ObjectClass()==MATRIX) {
+                        _Matrix * mx = (_Matrix*)thisVar->GetValue();
+                        res->CopyEFVMatrix ((_Matrix*)mx->ComputeNumeric());
+                    }
+                }
+
+
+                DeleteVariable (varID);
+                DeleteVariable (varID2);
+                DeleteVariable (ModelEFVType);
+
+                while (g<batchLanguageFunctionNames.lLength) {
+                    batchLanguageFunctionNames.Delete (g);
+                    batchLanguageFunctionParameters.Delete (g);
+                    batchLanguageFunctions.Delete(g);
+                    batchLanguageFunctionParameterLists.Delete(g);
+                    batchLanguageFunctionClassification.Delete(g);
+                }
+            }
+        }
+    }
+    return res;
+}
+
+// EOF
\ No newline at end of file
diff --git a/src/gui/HYObjectInspector.cpp b/src/gui/HYObjectInspector.cpp
new file mode 100644
index 0000000..4ee870b
--- /dev/null
+++ b/src/gui/HYObjectInspector.cpp
@@ -0,0 +1,971 @@
+/*
+ 
+ HyPhy - Hypothesis Testing Using Phylogenies.
+ 
+ Copyright (C) 1997-now
+ Core Developers:
+ Sergei L Kosakovsky Pond (spond at ucsd.edu)
+ Art FY Poon    (apoon at cfenet.ubc.ca)
+ Steven Weaver (sweaver at ucsd.edu)
+ 
+ Module Developers:
+ Lance Hepler (nlhepler at gmail.com)
+ Martin Smith (martin.audacis at gmail.com)
+ 
+ Significant contributions from:
+ Spencer V Muse (muse at stat.ncsu.edu)
+ Simon DW Frost (sdf22 at cam.ac.uk)
+ 
+ Permission is hereby granted, free of charge, to any person obtaining a
+ copy of this software and associated documentation files (the
+ "Software"), to deal in the Software without restriction, including
+ without limitation the rights to use, copy, modify, merge, publish,
+ distribute, sublicense, and/or sell copies of the Software, and to
+ permit persons to whom the Software is furnished to do so, subject to
+ the following conditions:
+ 
+ The above copyright notice and this permission notice shall be included
+ in all copies or substantial portions of the Software.
+ 
+ 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.
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ 
+ */
+
+
+#include "HYDataPanel.h"
+#include "HYTreePanel.h"
+#include "HYModelWindow.h"
+#include "HYObjectInspector.h"
+#include "HYLabel.h"
+#include "HYTableComponent.h"
+#include "HYButtonBar.h"
+#include "HYUtils.h"
+#include "HYEventTypes.h"
+#include "HYParameterTable.h"
+#include "likefunc.h"
+
+#ifdef    __HYPHYDMALLOC__
+#include "dmalloc.h"
+#endif
+
+_HYColor    boxFColor = {254,242,208},
+            boxBColor = {102,90,88};
+
+
+_String     objectInspectorTitle      ("Object Inspector"),
+            objectInspectorKillPrompt (" is a part of one or more likelihood functions. Deleting it will cause those functions to be purged.");
+
+extern      _List   dataSetNamesList,
+            dataSetList,
+            likeFuncNamesList,
+            likeFuncList,
+            modelTemplates;
+
+extern      _SimpleList
+windowObjects;
+
+extern      _String
+donotWarnAgain;
+
+bool        warnTree      = false,
+            warnDS      = false,
+            warnModelOpen = false;
+
+void        NewModel    (_String*);
+
+_HYRect     objectInspectorRect     = {0,0,0,0,-1};
+long        objectInspectorObjClass = 0;
+
+
+//__________________________________________________________
+
+void    TreeDependencies (_SimpleList& lfs, long treeID)
+{
+    _Variable* thisTree = LocateVar (treeID);
+
+    for (long k=0; k< likeFuncNamesList.lLength; k++)
+        if (((_String*)likeFuncNamesList(k))->sLength)
+            if (((_LikelihoodFunction*)likeFuncList(k))->DependOnTree (*thisTree->GetName())>=0) {
+                lfs << k;
+            }
+}
+
+//__________________________________________________________
+
+void    ModelDependencies (_SimpleList& lfs, long modelID)
+{
+    for (long k=0; k< likeFuncNamesList.lLength; k++)
+        if (((_String*)likeFuncNamesList(k))->sLength)
+            if (((_LikelihoodFunction*)likeFuncList(k))->DependOnModel (*(_String*)modelNames(modelID))>=0) {
+                lfs << k;
+            }
+}
+
+//__________________________________________________________
+
+void    DSDependencies (_SimpleList& lfs, long dsID)
+{
+
+    for (long k=0; k< likeFuncNamesList.lLength; k++)
+        if (((_String*)likeFuncNamesList(k))->sLength)
+            if (((_LikelihoodFunction*)likeFuncList(k))->DependOnDS (dsID)>=0) {
+                lfs << k;
+            }
+}
+
+//__________________________________________________________
+_HYObjectInspector::_HYObjectInspector(void):_HYTWindow (objectInspectorTitle, false)
+{
+    _HYRect         canvasSettings = {30,50,30,50,HY_COMPONENT_NO_SCROLL};
+    _HYLabel*       l1 = new _HYLabel (canvasSettings,GetOSWindowData());
+    canvasSettings.left  = 110;
+    canvasSettings.right = 10000;
+    _HYPullDown*    p1 = new _HYPullDown (canvasSettings,GetOSWindowData());
+    p1->EnableMenu(true);
+    canvasSettings.left = canvasSettings.right = 90;
+    _HYButtonBar*   b1 = new _HYButtonBar(canvasSettings,GetOSWindowData());
+
+    canvasSettings.top = 20;
+    canvasSettings.left = 250;
+    canvasSettings.bottom = 10000;
+    canvasSettings.width = HY_COMPONENT_V_SCROLL;
+    _HYTable*   ot  = new _HYTable (canvasSettings,GetOSWindowData(),1,2,125,100,HY_TABLE_STATIC_TEXT);
+    canvasSettings.width = HY_COMPONENT_NO_SCROLL|HY_COMPONENT_BORDER_B|HY_COMPONENT_BORDER_T;
+    _HYTable*   ot2 = new _HYTable (canvasSettings,GetOSWindowData(),1,2,125,20,HY_TABLE_STATIC_TEXT);
+
+
+    ot->SetMessageRecipient (this);
+    ot2->SetMessageRecipient (this);
+    b1->SetMessageRecipient (this);
+    p1->SetMessageRecipient (this);
+
+    _String toolTipText ("Open window with the object");
+    b1->AddButton (ProcureIconResource(HY_DATAPANEL_ICON_ID+7),&toolTipText);
+    toolTipText = "Delete selected object";
+    b1->AddButton (ProcureIconResource(HY_DATAPANEL_ICON_ID+3),&toolTipText);
+    toolTipText = "Read object from file";
+    b1->AddButton (ProcureIconResource(HY_DATAPANEL_ICON_ID+8),&toolTipText);
+    toolTipText = "Create new object";
+    b1->AddButton (ProcureIconResource(HY_DATAPANEL_ICON_ID+9),&toolTipText);
+
+    b1->EnableButton(0,false);
+    b1->EnableButton(1,false);
+    b1->EnableButton(2,false);
+    b1->EnableButton(3,false);
+    b1->SetButtonDim(16);
+
+    AddObject (l1);
+    AddObject (ot);
+    AddObject (ot2);
+    AddObject (p1);
+    AddObject (b1);
+    SetTableDimensions (3,3);
+    SetCell (0,0,b1);
+    SetCell (0,1,p1);
+    SetCell (0,2,p1);
+    SetCell (1,0,ot2);
+    SetCell (1,1,ot2);
+    SetCell (1,2,ot2);
+    SetCell (2,0,ot);
+    SetCell (2,1,ot);
+    SetCell (2,2,ot);
+
+    _HYFont  labelFont;
+#ifdef __WINDOZE__
+    labelFont.face = "MS Sans Serif";
+    labelFont.size = 10;
+#else
+#ifdef __HYPHY_GTK__
+    labelFont.face = _HY_SANS_FONT;
+    labelFont.size = 12;
+#else
+    labelFont.face = "Geneva";
+    labelFont.size = 14;
+#endif
+#endif
+    labelFont.style = HY_FONT_PLAIN;
+    l1->SetFont (labelFont);
+#ifdef __MAC__
+    labelFont.face = "Times";
+    labelFont.size = 12;
+#endif
+    ot->SetFont (labelFont);
+    ot2->SetFont (labelFont);
+    l1->SetBackColor (boxBColor);
+    p1->SetBackColor (boxBColor);
+    b1->SetBackColor (boxBColor);
+    l1->SetForeColor (boxFColor);
+    l1->SetAlignFlags (HY_ALIGN_LEFT);
+    l1->SetShadow(true);
+    p1->SetAlignFlags (HY_ALIGN_LEFT);
+    b1->SetAlignFlags (HY_ALIGN_LEFT);
+    ot->selectionType = HY_TABLE_SEL_ROWS|HY_TABLE_DONT_SIZE|HY_TABLE_FOCUSABLE ;
+    ot2->selectionType = HY_TABLE_SEL_ROWS|HY_TABLE_DONT_SIZE;
+
+    _String cellValue ("Object ID");
+    ot2->SetCellData (&cellValue,0,0,HY_TABLE_BOLD|HY_TABLE_STATIC_TEXT|HY_TABLE_BEVELED|HY_TABLE_CANTSELECT|HY_TABLE_PULLDOWN,true);
+    cellValue = "Object Info";
+    ot2->SetCellData (&cellValue,0,1,HY_TABLE_STATIC_TEXT|HY_TABLE_BEVELED|HY_TABLE_CANTSELECT|HY_TABLE_BOLD,true);
+
+    l1->SetText (_String(" Class"));
+    p1->AddMenuItem ("Trees",-1);
+    p1->AddMenuItem ("Data Sets",-1);
+    p1->AddMenuItem ("Models",-1);
+    p1->AddMenuItem ("Likelihood Functions",-1);
+    p1->ChangeSelection (objectInspectorObjClass,false);
+
+    if (objectInspectorRect.width<0) {
+        _HYRect  screenRect = GetScreenDimensions();
+        SetWindowRectangle (0,0,screenRect.bottom-50,screenRect.right-20);
+        SetPosition (screenRect.right-260,60);
+        objectInspectorRect = GetWindowRect ();
+    }
+
+    firstTime = true;
+
+    //p1->EnableItem  (2,false);
+
+    DeleteObject (l1);
+    DeleteObject (p1);
+    DeleteObject (ot);
+    DeleteObject (b1);
+
+    lastKillID = 0;
+}
+
+//__________________________________________________________
+_HYObjectInspector::~_HYObjectInspector()
+{
+    objectInspectorObjClass = ((_HYPullDown*)GetCellObject (0,2))->GetSelection();
+}
+
+//__________________________________________________________
+bool    _HYObjectInspector::ConfirmClose()
+{
+    objectInspectorRect = GetWindowRect ();
+    return true;
+}
+
+//__________________________________________________________
+
+bool    _HYObjectInspector::ProcessEvent (_HYEvent* e)
+{
+    _String firstArg;
+    long    k,i,f;
+    bool    done = false;
+    if (e->EventClass()==_hyMenuSelChangeEvent) {
+        firstArg = e->EventCode().Cut (0,(f=e->EventCode().Find(','))-1);
+        k = firstArg.toNum();
+        for (i=0; i<components.lLength; i++) {
+            if (((_HYGuiObject*)components(i))->MatchID(k)) {
+                break;
+            }
+        }
+        firstArg = e->EventCode().Cut (f+1,-1);
+        k = firstArg.toNum();
+        BuildListOfObjects (k);
+        done = true;
+
+    } else {
+        if (e->EventClass()==_hyTableChangeSelEvent) {
+            k = e->EventCode().toNum();
+            for (i=0; i<components.lLength; i++)
+                if (((_HYGuiObject*)components(i))->MatchID(k)) {
+                    break;
+                }
+            if (i==1) {
+                UpdateButtonsAndInfo ();
+            }
+            done = true;
+        } else {
+            if (e->EventClass()==_hyButtonPushEvent) {
+                firstArg = e->EventCode().Cut (0,(f=e->EventCode().Find(','))-1);
+                k = firstArg.toNum();
+                for (i=0; i<components.lLength; i++)
+                    if (((_HYGuiObject*)components(i))->MatchID(k)) {
+                        break;
+                    }
+
+                firstArg = e->EventCode().Cut (f+1,-1);
+                k = firstArg.toNum();
+                if (i==4) { // button bar
+                    _HYButtonBar* bb = (_HYButtonBar*)GetCellObject (0,0);
+                    switch (k) {
+                    case 0:
+                        OpenObjectWindow();
+                        break;
+                    case 1:
+                        KillObject ();
+                        break;
+                    case 2:
+                        OpenObject ();
+                        break;
+                    case 3:
+                        NewObject ();
+                        break;
+                    }
+                    bb->_UnpushButton();
+                    UpdateButtonsAndInfo();
+                }
+
+                done = true;
+            } else {
+                if (e->EventClass()==_hyTableDblClickEvent) {
+                    k = e->EventCode().toNum();
+                    for (i=0; i<components.lLength; i++)
+                        if (((_HYGuiObject*)components(i))->MatchID(k)) {
+                            break;
+                        }
+                    if (i==1) {
+                        OpenObjectWindow();
+                    }
+                    done = true;
+                } else if (e->EventClass()==_hyTablePullDownEvent) {
+                    firstArg = e->EventCode().Cut (0,(f=e->EventCode().Find(','))-1);
+                    k = firstArg.toNum();
+                    for (i=0; i<components.lLength; i++) {
+                        if (((_HYGuiObject*)components(i))->MatchID(k)) {
+                            break;
+                        }
+                    }
+                    k               = e->EventCode().Find(',',f+1,-1);
+                    firstArg        = e->EventCode().Cut (k+1,-1);
+                    if (i==2) {
+                        SortObjectsByName (firstArg.toNum());
+                    }
+
+                    done = true;
+                }
+
+            }
+        }
+    }
+    if (done) {
+        DeleteObject (e);
+        return true;
+    }
+    return _HYTWindow::ProcessEvent(e);
+}
+
+//__________________________________________________________
+
+bool    _HYObjectInspector::ProcessGEvent (_HYEvent* e)
+{
+    _String firstArg;
+    long    k,f;
+    bool    done = false;
+
+    lastKillID++;
+
+    _HYPullDown*    p1 = (_HYPullDown*)GetCellObject (0,2);
+
+    if (e->EventClass()==_hyGlobalTreeKillEvent) {
+        firstArg = e->EventCode().Cut (0,(f=e->EventCode().Find(','))-1);
+        k = firstArg.toNum();
+        if (MatchID(k)) {
+            k = e->EventCode().Cut (f+1,-1).toNum();
+            _Variable* theV = LocateVar(k);
+            if (theV->ObjectClass()==TREE) {
+                _SimpleList lfIDs;
+                TreeDependencies (lfIDs, theV->GetAVariable());
+                for (k=0; k<lfIDs.lLength; k++) {
+                    postLFKillEvent (GetID(), lfIDs.lData[k]);
+                }
+                if (lfIDs.lLength == 0) {
+                    DeleteVariable (*theV->GetName(),true);
+                } else if (lastKillID<=2) {
+                    postTreeKillEvent (GetID(), theV->GetAVariable());
+                }
+                BuildListOfObjects (p1->GetSelection());
+            }
+        }
+        done = true;
+    } else if (e->EventClass()==_hyGlobalLFKillEvent) {
+        firstArg = e->EventCode().Cut (0,(f=e->EventCode().Find(','))-1);
+        k = firstArg.toNum();
+        if (MatchID(k)) {
+            k = e->EventCode().Cut (f+1,-1).toNum();
+            KillLFRecord (k);
+        }
+        done = true;
+    } else if (e->EventClass()==_hyGlobalDSKillEvent) {
+        firstArg = e->EventCode().Cut (0,(f=e->EventCode().Find(','))-1);
+        k = firstArg.toNum();
+        if (MatchID(k)) {
+            k = e->EventCode().Cut (f+1,-1).toNum();
+            _SimpleList lfIDs;
+            DSDependencies (lfIDs, k);
+            for (f=0; f<lfIDs.lLength; f++) {
+                postLFKillEvent (GetID(), lfIDs.lData[f]);
+            }
+            if (lfIDs.lLength == 0) {
+                KillDataSetRecord (k);
+            } else if (lastKillID<=2) {
+                postDSKillEvent (GetID(), k);
+            }
+            BuildListOfObjects (p1->GetSelection());
+            done = true;
+        }
+    }
+
+    lastKillID --;
+    if (!done) {
+        return _HYWindow::ProcessGEvent (e);
+    }
+    return true;
+}
+
+//__________________________________________________________
+
+void    _HYObjectInspector::Update (Ptr p)
+{
+    _HYTWindow::Update(p);
+}
+
+//__________________________________________________________
+
+void    _HYObjectInspector::Paint (Ptr p)
+{
+    _HYTWindow::Paint(p);
+}
+
+//__________________________________________________________
+
+void    _HYObjectInspector::Activate ()
+{
+    _HYPullDown * p1 = (_HYPullDown*)GetCellObject (0,2);
+    _HYTable*   oList = (_HYTable*)GetCellObject (HY_OBJECT_INSPECTOR_TABLE_ROW,0);
+    _SimpleList saveSelection;
+    oList->GetSelection (saveSelection);
+    if ((objectInspectorRect.width>=0)&&firstTime) {
+        Hide();
+#ifdef __HYPHY_GTK__
+        UpdateComponentInfo ();
+#else
+        dim = MinMaxWindowDimensions();
+#endif
+        SetWindowRectangle (0,0,dim.bottom,dim.right);
+
+    }
+    BuildListOfObjects (p1->GetSelection());
+    oList->SetSelection (saveSelection);
+    if ((objectInspectorRect.width>=0)&&firstTime) {
+#ifdef __HYPHY_GTK__
+        UpdateComponentInfo ();
+#else
+        dim = MinMaxWindowDimensions();
+#endif
+        SetWindowRectangle (0,0,objectInspectorRect.bottom-objectInspectorRect.top,objectInspectorRect.right-objectInspectorRect.left);
+        SetPosition (objectInspectorRect.left,objectInspectorRect.top);
+        objectInspectorRect = GetWindowRect ();
+        Show();
+    }
+    _HYTWindow::Activate ();
+    firstTime = false;
+}
+
+//__________________________________________________________
+
+void    _HYObjectInspector::BuildListOfObjects (long index)
+{
+    _HYTable*       oList = (_HYTable*)GetCellObject (HY_OBJECT_INSPECTOR_TABLE_ROW,0);
+    _HYTable*       oHead = (_HYTable*)GetCellObject (HY_OBJECT_INSPECTOR_TABLE_ROW-1,0);
+    _HYButtonBar*   b1    = (_HYButtonBar*)GetCellObject (0,0);
+    _HYPullDown*    p1    = (_HYPullDown*)GetCellObject (0,2);
+
+    long            k,
+                    rowCount = 0;
+
+    oList->ClearTable();
+
+    _String newStat;
+
+    switch (index) {
+    case 0: { // trees
+        for (k=0; k<variablePtrs.lLength; k++) {
+            _Variable * thisVar = LocateVar(k);
+            if (thisVar&&(thisVar->ObjectClass()==TREE)) {
+                oList->AddRow (-1,20,HY_TABLE_STATIC_TEXT);
+                _SimpleList deps;
+                TreeDependencies    (deps,thisVar->GetAVariable());
+                if (deps.lLength) {
+                    oList->SetCellData (thisVar->GetName(),rowCount,0,HY_TABLE_STATIC_TEXT|HY_TABLE_ITALIC|HY_TABLE_BOLD,true);
+                } else {
+                    oList->SetCellData (thisVar->GetName(),rowCount,0,HY_TABLE_STATIC_TEXT|HY_TABLE_ITALIC,true);
+                }
+                _TheTree * thisTree = (_TheTree*)thisVar;
+                _PMathObj tc = thisTree->TipCount();
+                newStat = _String ((long)tc->Value()) & " leaves ";
+                DeleteObject (tc);
+                tc = thisTree->BranchCount();
+                newStat = newStat& ", " & _String ((long)tc->Value()+1) & " internal nodes.";
+                DeleteObject (tc);
+                oList->SetCellData (&newStat,rowCount,1,HY_TABLE_STATIC_TEXT,true);
+                rowCount++;
+            }
+        }
+        b1->EnableButton (2,true);
+        b1->EnableButton (3,true);
+        break;
+    }
+    case 1: { // data sets
+        for (k=0; k<dataSetNamesList.lLength; k++) {
+            _String* thisDS = (_String*)dataSetNamesList(k);
+            if (thisDS->sLength) {
+                oList->AddRow (-1,20,HY_TABLE_STATIC_TEXT);
+                _SimpleList deps;
+                DSDependencies  (deps,k);
+                if (deps.lLength) {
+                    oList->SetCellData (thisDS,rowCount,0,HY_TABLE_STATIC_TEXT|HY_TABLE_ITALIC|HY_TABLE_BOLD,true);
+                } else {
+                    oList->SetCellData (thisDS,rowCount,0,HY_TABLE_STATIC_TEXT|HY_TABLE_ITALIC,true);
+                }
+                _DataSet*  theDS = (_DataSet*)dataSetList(dataSetNamesList.Find(thisDS));
+                if (theDS->GetTT()->IsStandardNucleotide()) {
+                    newStat = "Nucleotide data";
+                } else if (theDS->GetTT()->IsStandardAA()) {
+                    newStat = "Aminoacid data";
+                } else if (theDS->GetTT()->IsStandardBinary()) {
+                    newStat = "Binary data";
+                } else {
+                    newStat = "Custom data";
+                }
+
+                newStat = newStat & ". "& _String (theDS->NoOfColumns()) &" sites ("&_String (theDS->NoOfUniqueColumns())&" distinct patterns), "&_String(theDS->NoOfSpecies())& " species.";
+                oList->SetCellData (&newStat,rowCount,1,HY_TABLE_STATIC_TEXT,true);
+                rowCount++;
+            }
+        }
+        b1->EnableButton (2,true);
+        b1->EnableButton (3,false);
+        break;
+    }
+    case 2: { // Models
+        for (k=0; k<modelTemplates.lLength; k++) {
+            _List       * thisModel       = (_List*) modelTemplates(k);
+            _SimpleList * modelParameters = (_SimpleList*) (*thisModel)(1);
+
+            oList->AddRow (-1,20,HY_TABLE_STATIC_TEXT);
+
+            if (modelParameters->lData[0] & HY_DATAPANEL_MODEL_MODELS) {
+                oList->SetCellData ((*thisModel)(0),rowCount,0,HY_TABLE_STATIC_TEXT,true);
+            } else {
+                oList->SetCellData ((*thisModel)(0),rowCount,0,HY_TABLE_STATIC_TEXT|HY_TABLE_ITALIC,true);
+            }
+
+            if (modelParameters->lData[1]==4) {
+                newStat = "Nucleotide model";
+            } else if (modelParameters->lData[1]==16) {
+                newStat = "Dinucleotide Model";
+            } else if (modelParameters->lData[1]==20) {
+                newStat = "Aminoacid Model";
+            } else {
+                newStat = "Codon Model";
+            }
+
+            newStat = newStat & ".";
+            oList->SetCellData (&newStat,rowCount,1,HY_TABLE_STATIC_TEXT,true);
+            rowCount++;
+        }
+
+        for (k=0; k<modelNames.lLength; k++) {
+            _String * modelID = (_String*)modelNames(k);
+            if (modelID->sLength) {
+                oList->AddRow (-1,20,HY_TABLE_STATIC_TEXT);
+
+                _SimpleList deps;
+                ModelDependencies   (deps,k);
+
+                if (deps.lLength) {
+                    oList->SetCellData (modelID,rowCount,0,HY_TABLE_STATIC_TEXT|HY_TABLE_BOLD,true);
+                } else {
+                    oList->SetCellData (modelID,rowCount,0,HY_TABLE_STATIC_TEXT,true);
+                }
+
+                _Matrix * modelMatrix = (_Matrix*)LocateVar (modelMatrixIndices.lData[k])->GetValue();
+
+                long    mDim = modelMatrix->GetHDim();
+
+                if (mDim==4) {
+                    newStat = "Nucleotide model";
+                } else if (mDim==16) {
+                    newStat = "Dinucleotide Model";
+                } else if (mDim==20) {
+                    newStat = "Aminoacid Model";
+                } else {
+                    newStat = "Codon Model";
+                }
+
+                newStat = newStat & ".";
+                oList->SetCellData (&newStat,rowCount,1,HY_TABLE_STATIC_TEXT,true);
+                rowCount++;
+            }
+        }
+
+        b1->EnableButton (2,true);
+        b1->EnableButton (3,true);
+        break;
+    }
+    case 3: { // likelihood functions
+        for (k=0; k<likeFuncNamesList.lLength; k++) {
+            _String *lfName = (_String*)likeFuncNamesList (k);
+
+            if (lfName->sLength) {
+                oList->AddRow (-1,20,HY_TABLE_STATIC_TEXT);
+                oList->SetCellData (lfName,rowCount,0,HY_TABLE_STATIC_TEXT|HY_TABLE_BOLD,true);
+                _LikelihoodFunction *lf = (_LikelihoodFunction*)likeFuncList (k);
+                newStat = _String ("Likelihood Function on ") & (long)lf->GetTheTrees().lLength & " partitions/trees.";
+
+                oList->SetCellData (&newStat,rowCount,1,HY_TABLE_STATIC_TEXT,true);
+                rowCount++;
+            }
+        }
+        b1->EnableButton (2,true);
+        b1->EnableButton (3,false);
+        break;
+    }
+    }
+    if (rowCount==0) {
+        newStat = _String("No ")& *p1->GetMenuItem(index) &" found.";
+        oList->AddRow (-1,20,HY_TABLE_STATIC_TEXT);
+        oList->SetCellData (&newStat,rowCount,0,HY_TABLE_STATIC_TEXT|HY_TABLE_ITALIC|HY_TABLE_CANTSELECT,true);
+        oList->SetCellData (&empty,rowCount,1,HY_TABLE_STATIC_TEXT|HY_TABLE_ITALIC|HY_TABLE_CANTSELECT,true);
+        rowCount ++;
+    } else if (rowCount>1) {
+        newStat = _String (rowCount) & ' ' & *p1->GetMenuItem(index) &" found.";
+    } else {
+        newStat = _String("One ") & p1->GetMenuItem(index)->Cut(0,p1->GetMenuItem(index)->sLength-2) & " found.";
+    }
+
+    if (rowCount<5) {
+        oList->AddRow (-1,(5-rowCount)*20,HY_TABLE_STATIC_TEXT|HY_TABLE_CANTSELECT);
+    }
+
+    SetStatusBar (newStat);
+    oList -> AutoFitWidth (*oHead);
+    rowCount = oHead->GetMaxW();
+    if (rowCount<oHead->rel.right-oHead->rel.left) {
+        oList->SetColumnSpacing (1,-rowCount+oHead->rel.right-oHead->rel.left+1,false);
+        oHead->SetColumnSpacing (1,-rowCount+oHead->rel.right-oHead->rel.left+1,false);
+    }
+    rowCount = oList->GetMaxH();
+    if (rowCount<=oList->rel.bottom-oList->rel.top) {
+        oList->SetRowSpacing (oList->verticalSpaces.lLength-1,oList->rel.bottom-oList->rel.top+1-rowCount,false);
+    }
+
+    oList->SetVisibleSize(oList->rel);
+    oHead->SetVisibleSize(oHead->rel);
+    oList->_MarkForUpdate ();
+    oHead->_MarkForUpdate ();
+#ifdef __HYPHY_GTK__
+    UpdateComponentInfo ();
+#else
+    dim = MinMaxWindowDimensions();
+#endif
+}
+
+//__________________________________________________________
+
+void    _HYObjectInspector::UpdateButtonsAndInfo (void)
+{
+    _HYTable*       dl = (_HYTable*)GetCellObject (HY_OBJECT_INSPECTOR_TABLE_ROW,0);
+    _HYButtonBar*   b1 = (_HYButtonBar*)GetCellObject (0,0);
+
+    _SimpleList     sel;
+    dl->GetSelection (sel);
+    if (sel.lLength) {
+        b1->EnableButton (0,true);
+        b1->EnableButton (1,true);
+    } else {
+        b1->EnableButton (0,false);
+        b1->EnableButton (1,false);
+    }
+}
+
+//__________________________________________________________
+
+void    _HYObjectInspector::OpenObjectWindow (void)
+{
+    _HYTable*       dl = (_HYTable*)GetCellObject (HY_OBJECT_INSPECTOR_TABLE_ROW,0);
+    _HYButtonBar*   b1 = (_HYButtonBar*)GetCellObject (0,0);
+    _HYPullDown*    p1 = (_HYPullDown*)GetCellObject (0,2);
+
+    _SimpleList     sel;
+    dl->GetSelection (sel);
+    if (sel.lLength) {
+        b1->EnableButton (0,true);
+        for (long k = 0; k<sel.lLength; k+=2) {
+            _String          windowTitle (*(_String*)dl->GetCellData (0,sel.lData[k]/2));
+            long f;
+            switch (p1->GetSelection()) {
+            case 0: {
+                _String winTitle (windowTitle);
+                windowTitle = _String ("Tree ")&windowTitle;
+                f = FindWindowByName (windowTitle);
+                if (f<0) {
+                    _HYTreePanel* newTreePanel = new _HYTreePanel (winTitle,winTitle);
+                    newTreePanel->_Zoom(true);
+                    newTreePanel->BringToFront();
+                    //newTreePanel->Show();
+                } else {
+                    _HYPlatformWindow* thisWindow = (_HYPlatformWindow*)windowObjects(f);
+                    thisWindow->_Activate();
+                }
+                break;
+            }
+            case 1: {
+                _String winTitle (windowTitle);
+                windowTitle = _String ("DataSet ")&windowTitle;
+                f = FindWindowByName (windowTitle);
+                if (f<0) {
+                    _HYDataPanel* newDataPanel = new _HYDataPanel (winTitle,winTitle);
+                    newDataPanel->BringToFront();
+                } else {
+                    _HYPlatformWindow* thisWindow = (_HYPlatformWindow*)windowObjects(f);
+                    thisWindow->_Activate();
+                }
+                break;
+            }
+            case 2: {
+                _String winTitle (windowTitle);
+                windowTitle = _String ("Model ")&windowTitle;
+                f = FindWindowByName (windowTitle);
+                if (f<0) {
+                    if (dl->cellTypes.lData[sel.lData[k]] & HY_TABLE_ITALIC) {
+                        if (!warnModelOpen) {
+                            windowTitle = _String ("Model \"") & winTitle & "\" is a template model, and it can't be opened. You can open a new model based on it, though.";
+                            if (!warnModelOpen) {
+                                if (!ProceedPromptWithCheck (windowTitle, donotWarnAgain, warnModelOpen)) {
+                                    break;
+                                }
+                            }
+                            NewObject ();
+                            break;
+
+                        }
+                    } else {
+                        if (sel.lData[k]/2<modelTemplates.lLength) {
+                            _List* modelSpec = FindModelTemplate (&winTitle);
+                            if (modelSpec) {
+                                OpenModelFromFile(*(_String*)(*modelSpec)(2));
+                            }
+                        } else {
+                            OpenModelFromMatrix (winTitle);
+                        }
+                    }
+                } else {
+                    _HYWindow* thisWindow = (_HYWindow*)windowObjectRefs(f);
+                    thisWindow->BringToFront();
+                }
+                break;
+            }
+            case 3: {
+                _String winTitle (windowTitle);
+                windowTitle = _String ("Likelihood Function ")&windowTitle;
+                f = FindWindowByName (windowTitle);
+                if (f<0) {
+                    f = likeFuncNamesList.Find(&winTitle);
+                    if (f>=0) {
+                        _HYParameterTable* newParameterTable = new _HYParameterTable (windowTitle,f);
+                        newParameterTable->_Zoom(true);
+                        newParameterTable->BringToFront();
+                    }
+                } else {
+                    _HYPlatformWindow* thisWindow = (_HYPlatformWindow*)windowObjects(f);
+                    thisWindow->_Activate();
+                }
+                break;
+            }
+            }
+        }
+    }
+}
+
+//__________________________________________________________
+
+void    _HYObjectInspector::KillObject (void)
+{
+    _HYTable*       dl = (_HYTable*)GetCellObject (HY_OBJECT_INSPECTOR_TABLE_ROW,0);
+    _HYButtonBar*   b1 = (_HYButtonBar*)GetCellObject (0,0);
+    _HYPullDown*    p1 = (_HYPullDown*)GetCellObject (0,2);
+
+    _SimpleList     sel;
+    dl->GetSelection (sel);
+    if (sel.lLength) {
+        b1->EnableButton (0,true);
+        long f;
+        switch (p1->GetSelection()) {
+        case 0: {
+            for (f = 0; f<sel.lLength; f+=2) {
+                long treeID = LocateVarByName (*(_String*)dl->GetCellData (0,sel.lData[f]/2));
+                if (treeID>=0)
+#ifndef USE_AVL_NAMES
+                    treeID = variableReindex.lData[treeID];
+#else
+                    treeID = variableNames.GetXtra(treeID);
+#endif
+                if (dl->cellTypes.lData[sel.lData[f]] & HY_TABLE_BOLD) {
+                    _String prompt ("Tree ");
+                    prompt = prompt & *LocateVar (treeID)->GetName() & objectInspectorKillPrompt;
+                    if (warnTree||(!ProceedPromptWithCheck (prompt,donotWarnAgain,warnTree))) {
+                        continue;
+                    }
+                }
+                postTreeKillEvent (GetID(), treeID);
+            }
+            break;
+        }
+        case 1: {
+            for (f = 0; f<sel.lLength; f+=2) {
+                long dsID = dataSetNamesList.Find ((_String*)dl->GetCellData (0,sel.lData[f]/2));
+                if (dsID>=0) {
+                    if (dl->cellTypes.lData[sel.lData[f]] & HY_TABLE_BOLD) {
+                        _String prompt ("Dataset ");
+                        prompt = prompt & *(_String*)dataSetNamesList(dsID) & objectInspectorKillPrompt;
+                        if (!((!warnTree)&&ProceedPromptWithCheck (prompt,donotWarnAgain,warnDS))) {
+                            continue;
+                        }
+                    }
+                    postDSKillEvent (GetID(), dsID);
+                }
+            }
+            break;
+        }
+        case 2: {
+            for (f = 0; f<sel.lLength; f+=2) {
+                if (sel.lData[f]/2<modelTemplates.lLength) {
+                    _List* modelT = FindModelTemplate((_String*)dl->GetCellData (0,sel.lData[f]/2));
+                    if (modelT) { // template model
+                        _String*fileLocation = (_String*)(*modelT)(2),
+                                errMsg (*(_String*)dl->GetCellData (0,sel.lData[f]/2));
+
+                        if (dl->cellTypes.lData[sel.lData[f]] & HY_TABLE_ITALIC) {
+                            errMsg = errMsg & " is a template model. If you wish to delete it, please do so by removing the appropriate file from the \"Substitution Models\" directory.";
+                            ProblemReport (errMsg);
+                        } else {
+                            errMsg = errMsg & " is about to be deleted. This action is NOT undoable.";
+                            if (ProceedPrompt (errMsg,(Ptr)this)) {
+                                if (remove (fileLocation->sData)) {
+                                    errMsg = "File delete operation failed.";
+                                    ProblemReport (errMsg);
+                                } else {
+                                    errMsg = *(_String*)dl->GetCellData (0,sel.lData[f]/2);
+                                    for (long k=0; k<modelTemplates.lLength; k++) {
+                                        _List* thisList = (_List*)modelTemplates(k);
+                                        if (errMsg.Equal((_String*)(*thisList)(0))) {
+                                            modelTemplates.Delete (k);
+                                        }
+                                    }
+                                    BuildListOfObjects (2);
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+            break;
+        }
+        }
+    }
+}
+
+//__________________________________________________________
+
+void    _HYObjectInspector::OpenObject (void)
+{
+    _HYPullDown*    p1 = (_HYPullDown*)GetCellObject (0,2);
+    switch (p1->GetSelection()) {
+    case 0: {
+        OpenTreeFile();
+        break;
+    }
+    case 1: {
+        OpenDataFile();
+        break;
+    }
+    case 2: {
+        OpenModelFile();
+        break;
+    }
+    default:
+        return;
+    }
+    BuildListOfObjects (p1->GetSelection());
+}
+
+//__________________________________________________________
+
+void    _HYObjectInspector::NewObject (void)
+{
+    _HYPullDown*    p1 = (_HYPullDown*)GetCellObject (0,2);
+    _HYTable*       dl = (_HYTable*)GetCellObject (HY_OBJECT_INSPECTOR_TABLE_ROW,0);
+    switch (p1->GetSelection()) {
+    case 0: {
+        NewTreeWindow (-1);
+        break;
+    }
+    case 2: {
+        _SimpleList sel;
+        dl->GetSelection (sel);
+        _String*    md = nil;
+        if (sel.lLength==2) {
+            md = (_String*)dl->GetCellData(0,sel.lData[0]/2);
+        }
+
+        NewModel(md);
+        break;
+    }
+    default:
+        return;
+    }
+    BuildListOfObjects (p1->GetSelection());
+}
+
+//__________________________________________________________
+
+void    _HYObjectInspector::SortObjectsByName (long location)
+{
+
+    _HYTable*       table = (_HYTable*)GetCellObject (HY_OBJECT_INSPECTOR_TABLE_ROW,0);
+
+    _List              menuItems;
+
+    menuItems.AppendNewInstance(new _String ("Ascending"));
+    menuItems.AppendNewInstance(new _String ("Descending"));
+
+    long    h = table->_HandlePullDown  (menuItems,(location&0xffff0000)>>16,location&0x0000ffff,0),
+            k;
+
+    if (h>=0) {
+        menuItems.Clear();
+        _SimpleList index;
+        for (k=0; k<table->verticalSpaces.lLength; k++) {
+            index<<k;
+            menuItems << table->GetCellData (0,k);
+        }
+        bool    hasPadding = ((_String*)menuItems(menuItems.lLength-1))->sLength==0;
+
+        if (hasPadding) {
+            menuItems.Delete (menuItems.lLength-1);
+            index.Delete (index.lLength-1);
+        }
+        SortLists (&menuItems, &index);
+        if (h==1) {
+            index.Flip();
+        }
+        if (hasPadding) {
+            index<<index.lLength;
+        }
+
+        table->SetRowOrder (index);
+    }
+}
+
+
+//EOF
\ No newline at end of file
diff --git a/src/gui/HYParameterTable.cpp b/src/gui/HYParameterTable.cpp
new file mode 100644
index 0000000..d13d197
--- /dev/null
+++ b/src/gui/HYParameterTable.cpp
@@ -0,0 +1,4990 @@
+/*
+ 
+ HyPhy - Hypothesis Testing Using Phylogenies.
+ 
+ Copyright (C) 1997-now
+ Core Developers:
+ Sergei L Kosakovsky Pond (spond at ucsd.edu)
+ Art FY Poon    (apoon at cfenet.ubc.ca)
+ Steven Weaver (sweaver at ucsd.edu)
+ 
+ Module Developers:
+ Lance Hepler (nlhepler at gmail.com)
+ Martin Smith (martin.audacis at gmail.com)
+ 
+ Significant contributions from:
+ Spencer V Muse (muse at stat.ncsu.edu)
+ Simon DW Frost (sdf22 at cam.ac.uk)
+ 
+ Permission is hereby granted, free of charge, to any person obtaining a
+ copy of this software and associated documentation files (the
+ "Software"), to deal in the Software without restriction, including
+ without limitation the rights to use, copy, modify, merge, publish,
+ distribute, sublicense, and/or sell copies of the Software, and to
+ permit persons to whom the Software is furnished to do so, subject to
+ the following conditions:
+ 
+ The above copyright notice and this permission notice shall be included
+ in all copies or substantial portions of the Software.
+ 
+ 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.
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ 
+ */
+
+#include "HYDataPanel.h"
+#include "HYTreePanel.h"
+#include "HYParameterTable.h"
+#include "HYTableComponent.h"
+#include "HYLabel.h"
+#include "HYButtonBar.h"
+#include "HYUtils.h"
+#include "HYEventTypes.h"
+#include "parser.h"
+#include "HYSharedMain.h"
+#include "HYGWindow.h"
+#include "HYChartWindow.h"
+
+#include "math.h"
+
+#ifdef    __HYPHYDMALLOC__
+#include "dmalloc.h"
+#endif
+
+#ifdef  __MAC__
+#define HY_PARAMETER_TABLE_ROW_HEIGHT 18
+#else
+#define HY_PARAMETER_TABLE_ROW_HEIGHT 20
+#endif
+
+extern  _SimpleList windowObjects;
+extern  _HYColor    tableDefaultBk2,
+        labelBColor,
+        labelFColor;
+
+extern  _String     blReplicate,
+        donotWarnAgain,
+        optimizationPrecision,
+        useLastResults,
+        none;
+
+_SimpleList         categoryTableIcon,
+                    globalTableIcon,
+                    ghostGlobalTableIcon,
+                    localTableIcon,
+                    constrainedTableIcon,
+                    constrainedGlobalTableIcon,
+                    typeTableIcon,
+                    treeTableIcon;
+
+bool                autoUpdateTableLF = true,
+                    doUndo            = true,
+                    doTableUpdate   = true;
+
+bool                warnAboutNonOptimized     = false,
+                    warnAboutBootstrapReplace = false;
+
+_String             allVariablesOption  ("All Parameters"),
+                    undoEditValue       ("Undo Edit Value"),
+                    undoSetConstraint   ("Undo Set Constarint"),
+                    undoKillConstraint  ("Undo Kill Constraint"),
+                    undoClearConstraints("Undo Clear Constraints"),
+                    undoEqualConstraints("Undo Equal Constraint"),
+                    undoMolecularClock  ("Undo Molecular Clock"),
+                    undoProportionalSubtrees
+                    ("Undo Proportional Constraint"),
+                    undoCustomConstraints
+                    ("Undo Custom Constraints"),
+                    saveIteratesPrompt  ("Save Bootstrap Iterates to"),
+                    bsSavePrompt        ("Save simulated data and MLEs to files"),
+                    histChartBins       ("10");
+
+extern              _String             covariancePrecision,
+                    covarianceParameterList;
+
+//__________________________________________________________
+_HYParameterTable::_HYParameterTable (_String name, long lfIDRef):_HYTWindow (name, true)
+{
+    _HYRect         canvasSettings =
+    {25,145,25,145,HY_COMPONENT_NO_SCROLL|HY_COMPONENT_BORDER_B|HY_COMPONENT_BORDER_REL};
+    _HYButtonBar*   bb      = new _HYButtonBar (canvasSettings, GetOSWindowData());
+
+    canvasSettings.left     = 70;
+    canvasSettings.right    = 10000;
+
+    _HYPullDown*    p1      = new _HYPullDown (canvasSettings,GetOSWindowData());
+
+    canvasSettings.right    = 10000;
+    canvasSettings.top      = 50;
+    canvasSettings.left     = 50;
+    canvasSettings.bottom   = 10000;
+    canvasSettings.width    = HY_COMPONENT_H_SCROLL|HY_COMPONENT_V_SCROLL;
+
+    _HYTable*   table       = new _HYTable (canvasSettings,GetOSWindowData(),0,4,100,HY_PARAMETER_TABLE_ROW_HEIGHT,HY_TABLE_STATIC_TEXT);
+
+    canvasSettings.top      = canvasSettings.bottom     = HY_PARAMETER_TABLE_ROW_HEIGHT;
+    canvasSettings.width    = HY_COMPONENT_NO_SCROLL | HY_COMPONENT_BORDER_B;
+
+    _HYTable*   tableHead   = new _HYTable (canvasSettings,GetOSWindowData(),1,4,100,HY_PARAMETER_TABLE_ROW_HEIGHT,HY_TABLE_STATIC_TEXT);
+
+
+    table->SetMessageRecipient (this);
+    tableHead->SetMessageRecipient (this);
+    bb->SetMessageRecipient (this);
+    p1->SetMessageRecipient (this);
+
+    AddObject (table);
+    AddObject (bb);
+    AddObject (tableHead);
+    AddObject (p1);
+    SetTableDimensions (3,2);
+    SetCell   (HY_PARAMETER_TABLE_TABLE_ROW,0,table);
+    SetCell   (HY_PARAMETER_TABLE_TABLE_ROW,1,table);
+    SetCell   (HY_PARAMETER_TABLE_TABLE_ROW-1,0,tableHead);
+    SetCell   (HY_PARAMETER_TABLE_TABLE_ROW-1,1,tableHead);
+    SetCell   (HY_PARAMETER_TABLE_BUTTON_ROW,0,bb);
+    SetCell   (HY_PARAMETER_TABLE_BUTTON_ROW,1,p1);
+
+    _HYFont  labelFont;
+    bb->SetBackColor (labelBColor);
+    p1->SetBackColor (labelBColor);
+
+#ifdef __MAC__
+    labelFont.face  = "Geneva";
+    labelFont.size  = 10;
+#endif
+
+#ifdef __WINDOZE__
+    labelFont.face  = "MS Sans Serif";
+    labelFont.size  = 12;
+#endif
+
+#ifdef __HYPHY_GTK__
+    labelFont.face  = _HY_SANS_FONT;
+    labelFont.size  = 12;
+#endif
+
+
+    labelFont.style = HY_FONT_PLAIN;
+
+    table->SetFont(labelFont);
+    tableHead->SetFont(labelFont);
+
+
+    _String toolTipText ("Locate selected parameters in tree");
+    bb->AddButton (ProcureIconResource(HY_PARAMETER_TABLE_BUTTON_ICON_BASE),&toolTipText);
+    toolTipText = "Constrain selected parameters to be equal";
+    bb->AddButton (ProcureIconResource(HY_PARAMETER_TABLE_BUTTON_ICON_BASE+1),&toolTipText);
+    toolTipText = "Constrain 2 parameters to be proportional";
+    bb->AddButton (ProcureIconResource(HY_PARAMETER_TABLE_BUTTON_ICON_BASE+2),&toolTipText);
+    toolTipText = "Set bounds on parameter values";
+    bb->AddButton (ProcureIconResource(HY_PARAMETER_TABLE_BUTTON_ICON_BASE+3),&toolTipText);
+    toolTipText = "Impose molecular clock starting at the selected node";
+    bb->AddButton (ProcureIconResource(HY_PARAMETER_TABLE_BUTTON_ICON_BASE+4),&toolTipText);
+    toolTipText = "Relative ratio constraint";
+    bb->AddButton (ProcureIconResource(HY_PARAMETER_TABLE_BUTTON_ICON_BASE+5),&toolTipText);
+    toolTipText = "Clear constraints on selected variables";
+    bb->AddButton (ProcureIconResource(HY_PARAMETER_TABLE_BUTTON_ICON_BASE+6),&toolTipText);
+
+    bb->EnableButton(0,false);
+    bb->EnableButton(1,false);
+    bb->MarkAsPullDown (1,true);
+    bb->EnableButton(2,false);
+    bb->MarkAsPullDown (2,true);
+    bb->EnableButton(3,false);
+    bb->MarkAsPullDown (3,true);
+    bb->EnableButton(4,false);
+    bb->MarkAsPullDown (4,true);
+    bb->EnableButton(5,false);
+    bb->MarkAsPullDown (5,true);
+    bb->EnableButton(6,false);
+    bb->SetAlignFlags (HY_ALIGN_LEFT);
+
+    bb->SetButtonDim(16);
+
+    // set up the table
+
+    lfID =lfIDRef;
+
+    avViewOptions = viewOptions = GetViewOptions();
+    table->selectionType = HY_TABLE_SEL_ROWS|HY_TABLE_FOCUSABLE;
+
+    p1->SetAlignFlags (HY_ALIGN_LEFT);
+    p1->AddMenuItem ("Current LF",-1);
+    p1->AddMenuItem (menuSeparator,-1);
+    p1->AddMenuItem ("Save LF state",-1);
+    p1->AddMenuItem ("Delete LF state",-1);
+    p1->AddMenuItem ("Select as null",-1);
+    p1->AddMenuItem ("Select as alternative",-1);
+    p1->AddMenuItem (menuSeparator,-1);
+    p1->AddMenuItem ("LRT",-1);
+    p1->AddMenuItem ("Parametric Bootstrap",-1);
+    p1->AddMenuItem ("Nonparametric Bootstrap",-1);
+
+    PrepareLFMenu   ();
+
+    _String cellValue ("Parameter ID");
+    tableHead->SetCellData (&cellValue,0,1,HY_TABLE_BOLD|HY_TABLE_STATIC_TEXT|HY_TABLE_BEVELED|HY_TABLE_CANTSELECT|HY_TABLE_PULLDOWN,true);
+    cellValue = "";
+    tableHead->SetCellData (&cellValue,0,0,HY_TABLE_STATIC_TEXT|HY_TABLE_BEVELED|HY_TABLE_CANTSELECT|HY_TABLE_BOLD|HY_TABLE_PULLDOWN,true);
+    cellValue = "Value";
+    tableHead->SetCellData (&cellValue,0,2,HY_TABLE_BOLD|HY_TABLE_STATIC_TEXT|HY_TABLE_BEVELED|HY_TABLE_CANTSELECT,true);
+    cellValue = "Constraint";
+    tableHead->SetCellData (&cellValue,0,3,HY_TABLE_BOLD|HY_TABLE_STATIC_TEXT|HY_TABLE_BEVELED|HY_TABLE_CANTSELECT,true);
+
+    ConstructTheTable ();
+
+    _HYRect  screenRect = GetScreenDimensions();
+    SetWindowRectangle (0,0,screenRect.bottom-80,screenRect.right-80);
+    SetPosition (70,70);
+    lastParameterCount = -1;
+
+    lastLFState = "Current LF";
+
+    SetWindowRectangle (0,0,screenRect.bottom-200,screenRect.right-20);
+    SetPosition (5,40);
+    DeleteObject (table);
+    DeleteObject (bb);
+    DeleteObject (tableHead);
+    DeleteObject (p1);
+
+}
+
+//__________________________________________________________
+_HYParameterTable::~_HYParameterTable()
+{
+}
+
+//__________________________________________________________
+
+bool    _HYParameterTable::ProcessGEvent (_HYEvent* e)
+{
+    _String firstArg,
+            secondArg;
+    long    k,f;
+
+    bool    done = false;
+
+    if (e->EventClass()==_hyGlobalLFKillEvent) {
+        firstArg = e->EventCode().Cut (0,(f=e->EventCode().Find(','))-1);
+        k = firstArg.toNum();
+        if (k!=GetID()) {
+            firstArg        = e->EventCode().Cut (f+1,-1);
+            if (lfID==firstArg.toNum()) {
+                postWindowCloseEvent (GetID());
+                done = true;
+            }
+        }
+    } else if ((e->EventClass()==_hyGlobalChangeLF)||(e->EventClass()==_hyGlobalChangeLFParams)) {
+        firstArg = e->EventCode().Cut (0,(f=e->EventCode().Find(','))-1);
+        k = firstArg.toNum();
+        if (k!=GetID()) {
+            firstArg        = e->EventCode().Cut (f+1,-1);
+            if (lfID==firstArg.toNum()) {
+                //_HYTable*    theTable  = (_HYTable*)  GetCellObject    (HY_PARAMETER_TABLE_TABLE_ROW,0);
+
+                if (e->EventClass()==_hyGlobalChangeLF) {
+                    RefreshParameterValues();
+                } else {
+                    avViewOptions = viewOptions = GetViewOptions();
+                    ConstructTheTable();
+                    SetWindowRectangle (0,0,bottom,right);
+                }
+
+                done = true;
+            }
+        }
+    }
+
+
+    if (!done) {
+        return _HYWindow::ProcessGEvent (e);
+    }
+    return true;
+}
+
+//__________________________________________________________
+
+bool    _HYParameterTable::ProcessEvent (_HYEvent* e)
+{
+    _String firstArg,
+            secondArg,
+            thirdArg;
+    long    k,i,f;
+
+    bool    done = false;
+
+    if (e->EventClass()==_hyTablePullDownEvent) {
+        firstArg = e->EventCode().Cut (0,(f=e->EventCode().Find(','))-1);
+        k = firstArg.toNum();
+        for (i=0; i<components.lLength; i++) {
+            if (((_HYGuiObject*)components(i))->MatchID(k)) {
+                break;
+            }
+        }
+        k               = e->EventCode().Find(',',f+1,-1);
+        firstArg        = e->EventCode().Cut (f+1,k-1);
+        secondArg       = e->EventCode().Cut (k+1,-1);
+        if (i==0) {
+            HandleCellPullDown (firstArg.toNum(),secondArg.toNum());
+            done = true;
+        } else if (i==2) {
+            HandleHeaderPullDown (firstArg.toNum(),secondArg.toNum());
+            done = true;
+        }
+    } else if (e->EventClass()==_hyTableEditCellEvent) {
+        firstArg = e->EventCode().Cut (0,(f=e->EventCode().Find(','))-1);
+        k = firstArg.toNum();
+        for (i=0; i<components.lLength; i++) {
+            if (((_HYGuiObject*)components(i))->MatchID(k)) {
+                break;
+            }
+        }
+        if (i==0) {
+            firstArg        = e->EventCode().Cut (f+1,-1);
+            TakeLFSnapshot();
+            HandleCellEditEvent (firstArg.toNum());
+            DoneLFSnapshot();
+            done = true;
+        }
+    } else if (e->EventClass()==_hyTableChangeSelEvent) {
+        k = e->EventCode().toNum();
+        for (i=0; i<components.lLength; i++) {
+            if (((_HYGuiObject*)components(i))->MatchID(k)) {
+                break;
+            }
+        }
+        if (i==0) {
+            UpdateSelectionDependentButtons();
+        }
+    } else if (e->EventClass()==_hyButtonPushEvent) {
+        firstArg = e->EventCode().Cut (0,(f=e->EventCode().Find(','))-1);
+        k = firstArg.toNum();
+        for (i=0; i<components.lLength; i++) {
+            if (((_HYGuiObject*)components(i))->MatchID(k)) {
+                break;
+            }
+        }
+        if (i==1) {
+            firstArg        = e->EventCode().Cut (f+1,-1);
+            k               = firstArg.toNum();
+            switch  (k) {
+            case 0:
+                DoOpenTreeWindow();
+                break;
+
+            case 1: // set equal
+                TakeLFSnapshot();
+                DoEqualConstraint ();
+                DoneLFSnapshot();
+                break;
+
+            case 2: // set proportional
+                TakeLFSnapshot();
+                DoProportionalConstraint ();
+                DoneLFSnapshot();
+                break;
+
+            case 3: // bounds
+                TakeLFSnapshot();
+                DoBoundsChange ();
+                DoneLFSnapshot();
+                break;
+
+            case 4: // do mol clock
+                TakeLFSnapshot();
+                DoMolecularClock ();
+                DoneLFSnapshot();
+                break;
+
+            case 5: // do clear constraints
+                TakeLFSnapshot();
+                DoProportionalSubtrees ();
+                DoneLFSnapshot();
+                break;
+
+            case 6: // do clear constraints
+                TakeLFSnapshot();
+                DoClearConstraints ();
+                DoneLFSnapshot();
+                break;
+            }
+            done = true;
+        }
+    } else if (e->EventClass()==_hyTableDblClickEvent) {
+        k = e->EventCode().toNum();
+        for (i=0; i<components.lLength; i++) {
+            if (((_HYGuiObject*)components(i))->MatchID(k)) {
+                break;
+            }
+        }
+        if (i==0) {
+            DoOpenTreeWindow();
+            done = true;
+        }
+    } else if (e->EventClass()==_hyScrollingEvent) {
+        firstArg = e->EventCode().Cut (0,(f=e->EventCode().Find(','))-1);
+        long g = e->EventCode().Find(',',f+1);
+        if (g>=0) {
+            k = firstArg.toNum();
+            for (i=0; i<components.lLength; i++) {
+                if (((_HYGuiObject*)components(i))->MatchID(k)) {
+                    break;
+                }
+            }
+            if (i==0) {
+                firstArg = e->EventCode().Cut (f+1,g-1);
+                k = firstArg.toNum();
+                if (k) {
+                    _HYTable*      theTable = (_HYTable*)     GetCellObject  (HY_PARAMETER_TABLE_TABLE_ROW-1,0);
+                    theTable->ProcessEvent (generateScrollEvent (k,0));
+                }
+                done = true;
+            }
+        }
+    } else if (e->EventClass()==_hyTableResizeCEvent) {
+        firstArg = e->EventCode().Cut (0,(f=e->EventCode().Find(','))-1);
+        k = firstArg.toNum();
+        for (i=0; i<components.lLength; i++) {
+            if (((_HYGuiObject*)components(i))->MatchID(k)) {
+                break;
+            }
+        }
+        if ((i==0)||(i==2)) {
+            firstArg = e->EventCode().Cut (f+1,-1);
+            f = firstArg.Find(',');
+            k = firstArg.Cut(f+1,-1).toNum(); // shift
+            f = firstArg.Cut(0,f-1).toNum();  // column
+            _HYTable*      table;
+            if (i==0) {
+                table = (_HYTable*)     GetCellObject    (HY_PARAMETER_TABLE_TABLE_ROW-1,0);
+            } else {
+                table = (_HYTable*)     GetCellObject    (HY_PARAMETER_TABLE_TABLE_ROW,0);
+            }
+            table->SetColumnSpacing (f,k,true);
+#ifdef __HYPHY_GTK__
+            UpdateComponentInfo ();
+#else
+            dim = MinMaxWindowDimensions();
+#endif
+            done = true;
+        }
+    } else if (e->EventClass()==_hyMenuOpenEvent) {
+        k = e->EventCode().toNum();
+        for (i=0; i<components.lLength; i++) {
+            if (((_HYGuiObject*)components(i))->MatchID(k)) {
+                break;
+            }
+        }
+        if (i==3) {
+            PrepareLFMenu();
+            done = true;
+        }
+    } else if (e->EventClass()==_hyMenuSelChangeEvent) {
+        firstArg = e->EventCode().Cut (0,(f=e->EventCode().Find(','))-1);
+        k = firstArg.toNum();
+        for (i=0; i<components.lLength; i++) {
+            if (((_HYGuiObject*)components(i))->MatchID(k)) {
+                break;
+            }
+        }
+        if (i==3) {
+            k = e->EventCode().Cut (f+1,-1).toNum();
+
+            _HYPullDown * p1 = (_HYPullDown*) GetCellObject (0,1);
+
+            f = p1->MenuItemCount ();
+
+            if (k == f-8) {
+                HandleSaveLF();
+            } else if (k&&(k<f-9)) {
+                HandleRestoreLF (p1->GetMenuItem (k));
+            } else if ((k == f-6)||(k==f-5)) {
+                HandleSetHypothesis (&lastLFState, k==f-5);
+            } else if (k == f-7) {
+                HandleDeleteLF(&lastLFState);
+            } else if (k == f-3) {
+                HandleLRT ();
+            } else if (k >= f-2) {
+                HandleBootstrap (k-f+2);
+            }
+
+            lastLFState = *p1->GetMenuItem(p1->GetSelection());
+        }
+    }
+    if (done) {
+        DeleteObject (e);
+        return true;
+    }
+    return _HYTWindow::ProcessEvent(e);
+}
+
+//__________________________________________________________
+
+void    _HYParameterTable::SetSelectedRows (_List& theNames)
+{
+    _HYTable*      theTable = (_HYTable*)     GetCellObject  (HY_PARAMETER_TABLE_TABLE_ROW,0);
+    long           k,f;
+    _SimpleList    rowsToSelect,
+                   patternIndex;
+    _List          patterns;
+
+    for (k=1; k<theTable->verticalSpaces.lLength; k++) {
+        _String currentRow = *(_String*)theTable->GetCellData(1,k);
+        f = currentRow.FindBackwards ('.',0,-1);
+        if (f>=0) {
+            currentRow.Trim (0,f);
+            patterns && & currentRow;
+            patternIndex << k;
+        }
+    }
+    for (k=0; k<patterns.lLength; k++) {
+        if (theNames.BinaryFind(patterns(k))>=0) {
+            rowsToSelect << patternIndex.lData[k];
+        }
+    }
+    theTable->SetRowSelection (rowsToSelect);
+    if (rowsToSelect.lLength) {
+        theTable->_ScrollRowIntoView(rowsToSelect.lData[0]);
+    }
+}
+
+//__________________________________________________________
+
+void    _HYParameterTable::SelectAll (void)
+{
+    _HYTable*      theTable = (_HYTable*)     GetCellObject  (HY_PARAMETER_TABLE_TABLE_ROW,0);
+    long           k;
+    _SimpleList    rowsToSelect;
+
+    for (k=1; k<theTable->verticalSpaces.lLength; k++) {
+        rowsToSelect << k;
+    }
+    theTable->SetRowSelection (rowsToSelect);
+}
+//__________________________________________________________
+
+long    _HYParameterTable::GatherListOfGlobals (_List& glList)
+{
+    _HYTable*      theTable = (_HYTable*)     GetCellObject  (HY_PARAMETER_TABLE_TABLE_ROW,0);
+    long           k,
+                   res = -1;
+
+    for (k=0; k<theTable->verticalSpaces.lLength; k++) {
+        _Variable* theV = (_Variable*)RetrieveIthRowVar (k);
+        if (theV&&(!theV->IsCategory())&&(theV->ObjectClass()!=TREE)) {
+            if (theV->IsGlobal()) {
+                if (theV->IsIndependent()) {
+                    res = k;
+                }
+
+                glList << theV->GetName();
+            }
+        }
+    }
+
+    return res+1;
+}
+
+//__________________________________________________________
+
+void    _HYParameterTable::SetRowValues (long rowCount, _Variable* tv, _HYTable* theTable)
+{
+    if (tv->ObjectClass()==TREE) {
+        theTable->SetCellData (&treeTableIcon,rowCount,0,HY_TABLE_ICON,true);
+        theTable->SetCellData (tv->GetName(),rowCount,1,HY_TABLE_STATIC_TEXT,true);
+        theTable->SetCellData (&empty,rowCount,2,HY_TABLE_STATIC_TEXT,true);
+        theTable->SetCellData (&empty,rowCount,3,HY_TABLE_STATIC_TEXT,true);
+    } else {
+        if (tv->IsCategory()) {
+            theTable->SetCellData (&categoryTableIcon,rowCount,0,HY_TABLE_ICON,true);
+            theTable->SetCellData (tv->GetName(),rowCount,1,HY_TABLE_STATIC_TEXT,true);
+            _String   cellValue = _String("1(")&_String (((_CategoryVariable*)tv)->GetNumberOfIntervals())&')';
+            theTable->SetCellData (&cellValue,rowCount,2,HY_TABLE_STATIC_TEXT,true);
+            ((_CategoryVariable*)tv)->Refresh();
+            cellValue = _String (((_CategoryVariable*)tv)->GetIntervalValue(0));
+            theTable->SetCellData (&cellValue,rowCount,3,HY_TABLE_STATIC_TEXT|HY_TABLE_PULLDOWN,true);
+        } else if (tv->IsIndependent()) {
+            if (tv->IsGlobal()) {
+                theTable->SetCellData (&globalTableIcon,rowCount,0,HY_TABLE_ICON,true);
+            } else {
+                theTable->SetCellData (&localTableIcon,rowCount,0,HY_TABLE_ICON,true);
+            }
+            theTable->SetCellData (tv->GetName(),rowCount,1,HY_TABLE_STATIC_TEXT,true);
+            _String cellValue (tv->Value());
+            theTable->SetCellData (&cellValue,rowCount,2,HY_TABLE_EDIT_TEXT,true);
+            theTable->SetCellData (&empty,rowCount,3,HY_TABLE_EDIT_TEXT,true);
+        } else {
+            if (tv->IsGlobal()) {
+                theTable->SetCellData (&constrainedGlobalTableIcon,rowCount,0,HY_TABLE_ICON,true);
+            } else {
+                theTable->SetCellData (&constrainedTableIcon,rowCount,0,HY_TABLE_ICON,true);
+            }
+            theTable->SetCellData (tv->GetName(),rowCount,1,HY_TABLE_STATIC_TEXT,true);
+            _String cellValue (tv->Compute()->Value());
+            theTable->SetCellData (&cellValue,rowCount,2,HY_TABLE_STATIC_TEXT,true);
+            _String*  theF = tv->GetFormulaString();
+            theTable->SetCellData (theF,rowCount,3,HY_TABLE_EDIT_TEXT,false);
+        }
+    }
+}
+
+//__________________________________________________________
+
+void    _HYParameterTable::ConstructTheTable (void)
+{
+    _HYTable*      theTable  = (_HYTable*)  GetCellObject    (HY_PARAMETER_TABLE_TABLE_ROW,0),
+                   *       hTable    = (_HYTable*)  GetCellObject    (HY_PARAMETER_TABLE_TABLE_ROW-1,0);
+
+    long           k,
+                   rowCount = 0;
+
+    if (globalTableIcon.lLength==0) {
+        globalTableIcon<<(long)ProcureIconResource (HY_PARAMETER_TABLE_ICON_BASE);
+        globalTableIcon<<16;
+        globalTableIcon<<16;
+        localTableIcon<<(long)ProcureIconResource (HY_PARAMETER_TABLE_ICON_BASE+1);
+        localTableIcon<<16;
+        localTableIcon<<16;
+        constrainedTableIcon<<(long)ProcureIconResource (HY_PARAMETER_TABLE_ICON_BASE+2);
+        constrainedTableIcon<<16;
+        constrainedTableIcon<<16;
+        categoryTableIcon<<(long)ProcureIconResource (HY_PARAMETER_TABLE_ICON_BASE+3);
+        categoryTableIcon<<16;
+        categoryTableIcon<<16;
+        treeTableIcon<<(long)ProcureIconResource (HY_PARAMETER_TABLE_ICON_BASE+4);
+        treeTableIcon<<16;
+        treeTableIcon<<16;
+        ghostGlobalTableIcon<<(long)ProcureIconResource (HY_PARAMETER_TABLE_ICON_BASE+5);
+        ghostGlobalTableIcon<<16;
+        ghostGlobalTableIcon<<16;
+        constrainedGlobalTableIcon<<(long)ProcureIconResource (HY_PARAMETER_TABLE_ICON_BASE+6);
+        constrainedGlobalTableIcon<<16;
+        constrainedGlobalTableIcon<<16;
+    }
+
+    theTable->ClearTable();
+
+    //theTable->_SetVScrollerPos (0);
+    //theTable->_SetHScrollerPos (0);
+
+    if (lfID>=0) {
+        _LikelihoodFunction* lf = (_LikelihoodFunction*)likeFuncList (lfID);
+        _Variable*           tv;
+
+        if (viewOptions&HY_PARAMETER_TABLE_VIEW_TREES) {
+            k = lf->GetTheTrees().lLength;
+            for (long j=0; j<k; j++) {
+                tv = LocateVar (lf->GetTheTrees().lData[j]);
+                theTable->AddRow (-1,HY_PARAMETER_TABLE_ROW_HEIGHT,HY_TABLE_STATIC_TEXT);
+                SetRowValues (rowCount, tv, theTable);
+                rowCount++;
+            }
+        }
+
+        _List       varList1, varList2;
+
+        for (k=0; k<lf->GetIndependentVars().lLength; k++) {
+            tv = LocateVar (lf->GetIndependentVars().lData[k]);
+            if (tv->IsGlobal()) {
+                if (viewOptions&HY_PARAMETER_TABLE_VIEW_GLOBAL) {
+                    varList1.BinaryInsert (tv->GetName());
+                } else {
+                    continue;
+                }
+            } else {
+                if (viewOptions&HY_PARAMETER_TABLE_VIEW_LOCAL) {
+                    varList2.BinaryInsert (tv->GetName());
+                } else {
+                    continue;
+                }
+            }
+        }
+
+        for (k=0; k<varList1.lLength; k++) {
+            theTable->AddRow (-1,HY_PARAMETER_TABLE_ROW_HEIGHT,HY_TABLE_STATIC_TEXT);
+            tv = FetchVar (LocateVarByName (*(_String*)varList1(k)));
+            SetRowValues (rowCount, tv, theTable);
+            rowCount++;
+        }
+
+        for (k=0; k<varList2.lLength; k++) {
+            theTable->AddRow (-1,HY_PARAMETER_TABLE_ROW_HEIGHT,HY_TABLE_STATIC_TEXT);
+            tv = FetchVar (LocateVarByName (*(_String*)varList2(k)));
+            SetRowValues (rowCount, tv, theTable);
+            rowCount++;
+        }
+
+        varList1.Clear();
+
+        if (viewOptions&HY_PARAMETER_TABLE_VIEW_CONSTRAINED) {
+            for (k=0 ; k<lf->GetDependentVars().lLength; k++) {
+                tv = LocateVar (lf->GetDependentVars().lData[k]);
+                varList1.BinaryInsert (tv->GetName());
+            }
+            for (k=0; k<varList1.lLength; k++) {
+                theTable->AddRow (-1,HY_PARAMETER_TABLE_ROW_HEIGHT,HY_TABLE_STATIC_TEXT);
+                tv = FetchVar (LocateVarByName (*(_String*)varList1(k)));
+                SetRowValues (rowCount, tv, theTable);
+                rowCount++;
+            }
+            varList1.Clear();
+        }
+        if (viewOptions&HY_PARAMETER_TABLE_VIEW_CATEGORY) {
+            for (k=0 ; k<lf->GetCategoryVars().lLength; k++) {
+                tv = LocateVar (lf->GetCategoryVars().lData[k]);
+                varList1.BinaryInsert (tv->GetName());
+            }
+            for (k=0; k<varList1.lLength; k++) {
+                theTable->AddRow (-1,HY_PARAMETER_TABLE_ROW_HEIGHT,HY_TABLE_STATIC_TEXT);
+                tv = FetchVar (LocateVarByName (*(_String*)varList1(k)));
+                SetRowValues (rowCount, tv, theTable);
+                rowCount++;
+            }
+        }
+        theTable->AutoFitWidth(*hTable);
+        UpdateLogLikelihood ();
+    }
+}
+
+
+//__________________________________________________________
+
+void    _HYParameterTable::RefreshTheTable (void)
+{
+    if (lfID>=0) {
+        _HYTable*      table    = (_HYTable*) GetCellObject  (HY_PARAMETER_TABLE_TABLE_ROW,0);
+        long idx = 0;
+        bool update;
+
+        for (long k=0; k<table->verticalSpaces.lLength; k++,idx+=table->horizontalSpaces.lLength) {
+            _Variable* thisV = (_Variable*)RetrieveIthRowVar(k);
+            update = false;
+            if (thisV->ObjectClass()!=TREE) {
+                if (!thisV->IsCategory()) {
+                    if (thisV->IsIndependent()) {
+                        if (thisV->IsGlobal()) {
+                            if ((globalTableIcon.lData[0]!=(long)((_SimpleList*)table->GetCellData(0,k))->lData[0])
+                                    &&(ghostGlobalTableIcon.lData[0]!=(long)((_SimpleList*)table->GetCellData(0,k))->lData[0])) {
+                                table->SetCellData(&globalTableIcon,k,0,table->cellTypes[idx],true);
+                                table->SetCellData (&empty,k,3,table->cellTypes[idx+3],true);
+                            }
+                        } else {
+                            if (localTableIcon.lData[0]!=(long)((_SimpleList*)table->GetCellData(0,k))->lData[0]) {
+                                table->SetCellData(&localTableIcon,k,0,table->cellTypes[idx],true);
+                                table->SetCellData (&empty,k,3,table->cellTypes[idx+3],true);
+                            }
+                        }
+                    } else {
+                        _SimpleList * targetIcon;
+
+                        if (thisV->IsGlobal()) {
+                            targetIcon = &constrainedGlobalTableIcon;
+                        } else {
+                            targetIcon = &constrainedTableIcon;
+                        }
+
+                        //if ((targetIcon->lData[0]!=(long)((_SimpleList*)table->GetCellData(0,k))->lData[0])
+                        //&&(ghostGlobalTableIcon.lData[0]!=(long)((_SimpleList*)table->GetCellData(0,k))->lData[0]))
+                        {
+                            table->SetCellData(targetIcon,k,0,table->cellTypes[idx],true);
+                            _String* fla = thisV->GetFormulaString();
+                            table->SetCellData(fla,k,3,table->cellTypes[idx+3],false);
+                            if (thisV->varFormula && thisV->varFormula->IsAConstant ()) {
+                                update = true;
+                            }
+                        }
+                    }
+                    if (update||(thisV->HasChanged())) {
+                        _String newVal (thisV->Compute()->Value());
+                        table->SetCellData(&newVal,k,2,table->cellTypes[idx+2],true);
+                    }
+                } else {
+                    UpdateKthRow (k,false);
+                }
+            }
+        }
+        UpdateLogLikelihood ();
+    }
+}
+
+//__________________________________________________________
+
+void    _HYParameterTable::RefreshParameterValues (void)
+{
+    if (lfID>=0) {
+        _HYTable*      table    = (_HYTable*) GetCellObject  (HY_PARAMETER_TABLE_TABLE_ROW,0);
+        for (long k=0, idx = 0; k<table->verticalSpaces.lLength; k++,idx+=table->horizontalSpaces.lLength) {
+            _Variable* thisV = (_Variable*)RetrieveIthRowVar(k);
+            if (thisV->ObjectClass()!=TREE) {
+                if (!thisV->IsCategory()) {
+                    _String newVal (thisV->Compute()->Value());
+                    table->SetCellData(&newVal,k,2,table->cellTypes[idx+2],true);
+                }
+            }
+        }
+        table->_MarkColumnForUpdate (2);
+        UpdateLogLikelihood ();
+    }
+}
+
+//__________________________________________________________
+
+void    _HYParameterTable::VerifyGlobalVariables (void)
+{
+    if (lfID>=0) {
+        _HYTable*      table    = (_HYTable*) GetCellObject  (HY_PARAMETER_TABLE_TABLE_ROW,0);
+        long idx = 0,
+             lastGlobal = table->verticalSpaces.lLength;
+
+        bool update;
+
+        _LikelihoodFunction* lf = (_LikelihoodFunction*)likeFuncList (lfID);
+
+        lf->RescanAllVariables ();
+
+        _SimpleList gv,
+                    tc,
+                    found;
+
+        lf->GetGlobalVars(gv);
+        gv.Sort();
+
+        for (long k=0; k<table->verticalSpaces.lLength; k++,idx+=table->horizontalSpaces.lLength) {
+            _Variable* thisV = (_Variable*)RetrieveIthRowVar(k);
+            update = false;
+            long     selected = table->cellTypes[idx]&HY_TABLE_SELECTED;
+
+            if ((thisV->ObjectClass()!=TREE)&&(!thisV->IsCategory())&&(thisV->IsGlobal())) {
+                long f = gv.BinaryFind (thisV->GetAVariable());
+                if (f<0) {
+                    if (ghostGlobalTableIcon.lData[0]!=(long)((_SimpleList*)table->GetCellData(0,k))->lData[0]) {
+                        table->SetCellData (&ghostGlobalTableIcon,k,0,table->cellTypes[idx],true);
+                        table->SetCellData (&empty,k,2,HY_TABLE_STATIC_TEXT|HY_TABLE_ITALIC|selected,true);
+                        table->SetCellData (&empty,k,3,HY_TABLE_STATIC_TEXT|selected,true);
+                        table->cellTypes[idx+1] = HY_TABLE_STATIC_TEXT|HY_TABLE_ITALIC|selected;
+                        tc << idx;
+                        tc << idx+1;
+                        tc << idx+2;
+                        tc << idx+3;
+                        UpdateKthRow (k);
+                    }
+                } else {
+                    found << gv.lData[f];
+                    if (thisV->IsIndependent())
+                        if (globalTableIcon.lData[0]!=(long)((_SimpleList*)table->GetCellData(0,k))->lData[0]) {
+                            table->SetCellData (&globalTableIcon,k,0,table->cellTypes[idx],true);
+                            table->SetCellData (&empty,k,2,HY_TABLE_EDIT_TEXT|selected,true);
+                            table->SetCellData (&empty,k,3,HY_TABLE_EDIT_TEXT|selected,true);
+                            table->cellTypes[idx+1] = HY_TABLE_STATIC_TEXT|selected;
+                            tc << idx;
+                            tc << idx+1;
+                            tc << idx+2;
+                            tc << idx+3;
+                            UpdateKthRow (k);
+                        }
+                    table->cellTypes[idx+3] = HY_TABLE_EDIT_TEXT|selected;
+                    lastGlobal = k;
+                }
+            } else {
+                if (thisV->ObjectClass()==TREE) {
+                    lastGlobal = k;
+                }
+            }
+        }
+        if (found.lLength<gv.lLength) {
+            found.Sort();
+            _SimpleList diff;
+            diff.Subtract (gv,found);
+            for (idx=0; idx<diff.lLength; idx++,lastGlobal++) {
+                table->AddRow (lastGlobal,HY_PARAMETER_TABLE_ROW_HEIGHT,HY_TABLE_STATIC_TEXT);
+                SetRowValues  (lastGlobal,LocateVar (diff.lData[idx]),table);
+            }
+            table->_MarkForUpdate();
+            tc.Clear();
+        }
+
+        if (tc.lLength) {
+            table->_MarkCellsForUpdate (tc);
+        }
+    }
+}
+
+//__________________________________________________________
+
+void    _HYParameterTable::UpdateLogLikelihood (bool postEvent)
+{
+    if (lfID>=0) {
+        _String newStatLine;
+        if (lfID == lockedLFID) {
+            newStatLine = _String ("This likelihood function is currently being optimized...");
+            SetStatusBar (newStatLine);
+            return;
+        }
+
+        _LikelihoodFunction* lf = (_LikelihoodFunction*)likeFuncList (lfID);
+        lf->PrepareToCompute ();
+        _Parameter lfval    = lf->Compute();
+        long       parCount = lf->GetIndependentVars().lLength;
+        lf->DoneComputing ();
+
+        newStatLine = _String ("Log Likelihood = ")&_String (lfval) &", parameter count = "&
+                      _String(parCount) & ", AIC = " & _String(2.*(parCount-lfval)) & '.' ;
+
+        SetStatusBar (newStatLine);
+        if (postEvent) {
+            postChangeLFEvent (GetID(),lfID);
+        }
+
+        _HYPullDown* p1 = (_HYPullDown*)GetCellObject (HY_PARAMETER_TABLE_BUTTON_ROW,1);
+
+        if (p1->GetSelection()) {
+            p1->EnableItem (0,true);
+            p1->ChangeSelection (0, false);
+        }
+    }
+}
+
+//__________________________________________________________
+
+void    _HYParameterTable::TaintTheLF ()
+{
+    if (lfID>=0) {
+        _LikelihoodFunction* lf = (_LikelihoodFunction*)likeFuncList (lfID);
+        for (long k=lf->GetIndependentVars().lLength-1; k>=0; k--) {
+            lf->SetIthIndependent (k,lf->GetIthIndependent(k));
+        }
+    }
+}
+
+//__________________________________________________________
+
+void    _HYParameterTable::TakeLFSnapshot ()
+{
+    /*if (lfID>=0)
+    {
+        if (!(viewOptions & HY_PARAMETER_TABLE_SNAPSHOT))
+        {
+            _LikelihoodFunction* lf = (_LikelihoodFunction*)likeFuncList (lfID);
+            lastParameterCount = lf->GetIndependentVars().lLength;
+            lastLFValue        = lf->Compute();
+            viewOptions       |= HY_PARAMETER_TABLE_SNAPSHOT;
+        }
+    }*/
+}
+
+//__________________________________________________________
+
+void    _HYParameterTable::PrepareLFMenu (void)
+{
+    _HYPullDown* p1 = (_HYPullDown*)GetCellObject (0,1);
+    for (; !menuSeparator.Equal (p1->GetMenuItem(1));) {
+        p1->DeleteMenuItem (1);
+    }
+
+    long k = 0;
+
+    _HYDataPanel*parent = (_HYDataPanel*)RetrieveParentDataPanel ();
+    long n = -1,
+         a = -1,
+         s = p1->GetSelection ();
+    if (parent) {
+        for (k=0; k<parent->savedLFStates.lLength; k++) {
+            p1->AddMenuItem (*(_String*)parent->savedLFNames (k),k+1);
+        }
+        n = parent->GetHypothesis (false)+1;
+        a = parent->GetHypothesis (true)+1;
+        s = p1->GetSelection ();
+
+    }
+
+    k = p1->MenuItemCount();
+
+    bool flag = false;
+
+    if ((n>=1)&&(a>=1)) {
+        flag = true;
+    }
+
+    p1->EnableItem (k-1,flag);
+    p1->EnableItem (k-2,flag);
+    p1->EnableItem (k-3,flag);
+
+    flag = (s>0) && (n!=s);
+    p1->EnableItem (k-6,flag);
+
+    flag = (s>0) && (a!=s);
+    p1->EnableItem (k-5,flag);
+
+    p1->EnableItem (k-7,s>0);
+}
+
+//__________________________________________________________
+
+void    _HYParameterTable::HandleSaveLF (void)
+{
+    _HYDataPanel*parent = (_HYDataPanel*)RetrieveParentDataPanel ();
+    _HYPullDown* p1 = (_HYPullDown*)GetCellObject (0,1);
+    if (parent) {
+        _LikelihoodFunction* lf = (_LikelihoodFunction*)likeFuncList (lfID);
+        bool    opt = lf->HasBeenOptimized();
+        if (!(opt||warnAboutNonOptimized)) {
+            _String warnNO ("The parameters values you are about to save are NOT maximum likelihood estimates. LRT and bootstraps may be meaningless.");
+            if (!ProceedPromptWithCheck (warnNO,donotWarnAgain,warnAboutNonOptimized, (Ptr)this)) {
+                p1->ChangeSelection (p1->FindMenuItem (lastLFState),false);
+                return;
+            }
+        }
+        _String newLF ("New LF Snapshot"),
+                prompt("Type in a name for the saved LF state:");
+        if (EnterStringDialog (newLF, prompt, (Ptr)this)) {
+            if (!opt) {
+                newLF = _String("[-]")&newLF;
+            }
+            _HYPullDown* p1 = (_HYPullDown*) GetCellObject (0,1);
+            long k = parent->FindLFState (newLF);
+
+            while (k>=0) {
+                prompt = "A likelihood function state with that name already exists. Would you like to replace it?";
+                if (!ProceedPrompt (prompt,(Ptr)this)) {
+                    p1->ChangeSelection (p1->FindMenuItem (lastLFState),false);
+                    return;
+                }
+                /*prompt = "Type in a name for the saved LF state:";
+                if (!EnterStringDialog (newLF, prompt, (Ptr)this))
+                {
+                    p1->ChangeSelection (p1->FindMenuItem (lastLFState),false);
+                    return;
+                }*/
+                if (!opt) {
+                    newLF = _String("[-]")&newLF;
+                }
+            }
+            _String * snapshot = parent->LFSnapshot();
+            if (snapshot) {
+                if (k<0) {
+                    parent->savedLFNames.InsertElement (&newLF,k,true);
+                    parent->savedLFStates.InsertElement (snapshot,k,false);
+                    k = parent->savedLFNames.lLength;
+                } else {
+                    parent->savedLFStates.Replace (k,snapshot,false);
+                    k++;
+                }
+                PrepareLFMenu ();
+                p1->EnableItem (0,false);
+                p1->ChangeSelection (k,false);
+            } else {
+                p1->ChangeSelection (p1->FindMenuItem (lastLFState),false);
+            }
+
+        } else {
+            p1->ChangeSelection (p1->FindMenuItem (lastLFState),false);
+        }
+
+    } else {
+        p1->ChangeSelection(0,false);
+        _String warnNODS ("Sorry, but you may only save likelihood function states if the likelihood function was created using the data panel interface.");
+        ProblemReport (warnNODS);
+    }
+}
+
+//__________________________________________________________
+
+void    _HYParameterTable::HandleLRT (void)
+{
+    _HYPullDown*    p1  = (_HYPullDown*) GetCellObject   (HY_PARAMETER_TABLE_BUTTON_ROW,1);
+    //p1->EnableItem  (0,false);
+    p1->ChangeSelection (p1->FindMenuItem (lastLFState),false);
+
+    _HYDataPanel*parent = (_HYDataPanel*)RetrieveParentDataPanel ();
+    if (parent) {
+        _String * currentSnapshot = parent->LFSnapshot();
+
+        _Parameter  H_0,
+                    H_A,
+                    P = 1.0;
+
+        long        DF_0,
+                    DF_A;
+
+        _LikelihoodFunction* lf = (_LikelihoodFunction*)likeFuncList (lfID);
+        if (!parent->LFRestore(parent->GetHypothesis(false))) {
+            return;
+        }
+
+        lf->RescanAllVariables();
+
+        lf->PrepareToCompute ();
+        H_0 = lf->Compute();
+        DF_0= lf->GetIndependentVars().lLength;
+        lf->DoneComputing ();
+
+        if (!parent->LFRestore(parent->GetHypothesis(true))) {
+            return;
+        }
+
+        lf->RescanAllVariables();
+
+        lf->PrepareToCompute ();
+        H_A = lf->Compute();
+        DF_A= lf->GetIndependentVars().lLength;
+        lf->DoneComputing ();
+
+        _ExecutionList exl (*currentSnapshot);
+        exl.Execute();
+
+        if (DF_A < DF_0) {
+            _String errMsg ("The null model should contain fewer parameters than the alternative model. Unable to obtain the asymptotic P-Value.");
+            ProblemReport (errMsg,(Ptr)this);
+            P = -1.;
+        } else if (H_A < H_0) {
+            _String errMsg ("The null hypothesis should have worse likelihood than that of the alternative hypothesis. Unable to obtain the asymptotic P-Value.");
+            ProblemReport (errMsg,(Ptr)this);
+            P = -1.;
+        }
+
+
+        char            cb[128];
+        snprintf (cb, sizeof(cb),"\nLikelihood Ratio Test\n\n\t 2*LR = %g\n\t DF = %ld\n\t P-Value = ",2.*(H_A-H_0),DF_A-DF_0);
+        if (P>0.0) {
+            _Constant       c1 (2.*(H_A-H_0)),
+                            c2 (DF_A-DF_0), *c3 = (_Constant*)c1.CChi2(&c2);
+
+            BufferToConsole (cb);
+            snprintf (cb, sizeof(cb),"%g \n ",1.-c3->Value());
+            BufferToConsole (cb);
+            DeleteObject    (c3);
+        } else {
+            BufferToConsole     ("Unable to compute \n ");
+        }
+
+
+        DeleteObject (currentSnapshot);
+    }
+}
+
+//__________________________________________________________
+
+void    _HYParameterTable::HandleBootstrap (bool np)
+{
+    _HYPullDown*    p1  = (_HYPullDown*) GetCellObject   (HY_PARAMETER_TABLE_BUTTON_ROW,1);
+    p1->ChangeSelection (p1->FindMenuItem (lastLFState),false);
+
+    long            iters = -1;
+    bool            saveIterates = true;
+
+    _HYDataPanel*parent = (_HYDataPanel*)RetrieveParentDataPanel ();
+    if (parent) {
+        _String  bsWindow   ("Bootstrap Window for "),
+                 folderSave;
+
+        bsWindow = bsWindow & *(_String*)likeFuncNamesList (lfID);
+
+        _HYBootstrapWindow * bsw = nil;
+
+        long              windID = FindWindowByName (bsWindow);
+
+        if (windID>=0) {
+            bsw = (_HYBootstrapWindow*)windowObjectRefs (windID);
+
+            _String warnMessage;
+            warnMessage = _String ("The Window '") & bsWindow & "' is already open. Should I append more iterates to the existing window? (Click 'No' to start a fresh bootstrap).";
+            char res = YesNoCancelPrompt (warnMessage);
+
+            if (res==2) {
+                return;
+            }
+
+            if (res==3) {
+                bsw->Close(nil);
+                bsw = nil;
+            }
+        }
+
+        _String  promptString ("Enter the number of iterations:"),
+                 valueString ("100");
+        while (1) {
+            if (!EnterStringDialogWithCheckbox (valueString, promptString, bsSavePrompt, saveIterates, (Ptr)this)) {
+                return;
+            }
+            iters = valueString.toNum();
+            if (iters>0) {
+                break;
+            } else {
+                valueString = "100";
+            }
+        }
+
+        if (saveIterates) {
+            folderSave = ChooseAFolder (saveIteratesPrompt);
+            if (folderSave.sLength==0) {
+                return;
+            }
+        }
+
+        parent->SetLockState (true);
+        _String  * currentSnapshot = parent->LFSnapshot();
+        checkPointer (currentSnapshot);
+
+        // compute LRT
+        _Parameter  nullLRT;
+        //long      simP = 0;
+
+        _LikelihoodFunction* lf = (_LikelihoodFunction*)likeFuncList (lfID);
+        parent->LFRestore(parent->GetHypothesis(false));
+        lf->RescanAllVariables();
+        lf->PrepareToCompute ();
+        nullLRT = -lf->Compute();
+        lf->DoneComputing ();
+        parent->LFRestore(parent->GetHypothesis(true));
+        lf->RescanAllVariables();
+        lf->PrepareToCompute ();
+        nullLRT += lf->Compute();
+        nullLRT *= 2;
+        lf->DoneComputing ();
+
+        _DataSet*originalData = (_DataSet*)dataSetList (parent->dataSetID);
+        _String *originalName = (_String*)dataSetNamesList (parent->dataSetID);
+
+        _String  dataSetName (*originalName);
+
+        dataSetName = dataSetName & "_sim";
+        FindUnusedObjectName (empty,dataSetName,dataSetNamesList);
+
+        _DataSet *ds = nil;
+        long     sID = -1;
+        if (!np) {
+            ds = new _DataSet();
+            sID = AddDataSetToList (dataSetName,ds);
+        }
+        StartBarTimer ();
+
+        //(_HYBootstrapWindow*)FindWindowByNameAndOpen (bsWindow);
+
+
+        if (!bsw) {
+            bsw = new _HYBootstrapWindow (bsWindow,nullLRT);
+            checkPointer (bsw);
+            bsw->BringToFront();
+        } else {
+            bsw->SetStopped (false);
+        }
+
+        for (long k = 0; k < iters; k++) {
+            _String    dataFileName = folderSave& "simulatedData" & (k+1) & ".seq";
+
+            _Parameter simLRT;
+
+            _List       dummy;
+            _SimpleList dummy2;
+
+            parent->LFRestore(parent->GetHypothesis(false));
+            lf->RescanAllVariables();
+            if (np) {
+                parent->SpawnLikelihoodFunctionNP (dummy);
+            } else {
+                ds->Clear();
+                lf->Simulate (*ds,dummy);
+                parent->SpawnLikelihoodFunction (ds,&dataSetName, dummy, dummy2);
+            }
+
+
+            valueString = _String("Obtaining MLEs for the null hypothesis. Iterate #")& k;
+            SetStatusLine (valueString);
+
+            _Matrix* res = lf->Optimize();
+            simLRT = -(*res)(1,0);
+            DeleteObject (res);
+
+            if (saveIterates) {
+                _String     saveFile     = folderSave & "nullMLEs" & (k+1) & ".bf";
+                if (np) {
+                    _DataSet* dsNP = parent->GenerateOrderedDataSet ();
+                    parent->SaveDataPanel (false, &saveFile, &dataFileName, false, dsNP, true);
+                    DeleteObject (dsNP);
+                } else {
+                    parent->SaveDataPanel (false, &saveFile, &dataFileName, false, ds);
+                }
+
+            }
+
+            parent->LFRestore(parent->GetHypothesis(true));
+            lf->RescanAllVariables();
+
+            valueString = _String("Obtaining MLEs for the alternative hypothesis. Iterate #")& k;
+            SetStatusLine (valueString);
+            res = lf->Optimize();
+            simLRT += (*res)(1,0);
+            DeleteObject (res);
+
+            if (saveIterates) {
+                _String     saveFile     = folderSave & "altMLEs" & (k+1) & ".bf";
+                parent->SaveDataPanel (false, &saveFile, &dataFileName, false, nil, np);
+            }
+
+            simLRT *= 2.;
+
+            if (np) {
+                parent->SpawnLikelihoodFunctionNP (dummy);
+            } else {
+                parent->SpawnLikelihoodFunction (originalData,originalName, dummy, dummy2);
+            }
+
+            bsw->AddIterate (simLRT);
+
+            if (bsw->requestQuit) {
+                break;
+            }
+        }
+
+
+        if (!np) {
+            KillDataSetRecord (sID);
+            //DeleteObject (ds);
+        }
+
+        _ExecutionList exl (*currentSnapshot);
+        exl.Execute();
+        DeleteObject (currentSnapshot);
+        parent->SetLockState (false);
+        bsw->SetStopped (true);
+        StopBarTimer();
+        bsw->requestQuit = false;
+    }
+}
+
+//__________________________________________________________
+
+void    _HYParameterTable::HandleRestoreLF (_String* lfName)
+{
+    _HYDataPanel*parent = (_HYDataPanel*)RetrieveParentDataPanel ();
+    if (parent) {
+        long k = parent->savedLFNames.Find (lfName);
+        if (k>=0) {
+            if (!parent->LFRestore (k)) {
+                return;
+            }
+
+            VerifyGlobalVariables();
+            RefreshTheTable ();
+
+
+            _HYTable*    table = (_HYTable*) GetCellObject (HY_PARAMETER_TABLE_TABLE_ROW,0);
+            StretchColumnToFit (2);
+            StretchColumnToFit (3);
+            table->_MarkColumnForUpdate (0);
+
+            undoCommands.Clear();
+            undoDescriptions.Clear();
+            _UpdateUndoMenu (nil,nil);
+
+            PrepareLFMenu ();
+            _HYPullDown*    p1  = (_HYPullDown*) GetCellObject   (HY_PARAMETER_TABLE_BUTTON_ROW,1);
+            p1->EnableItem  (0,false);
+            p1->ChangeSelection (k+1,false);
+
+        }
+    }
+}
+
+//__________________________________________________________
+
+void    _HYParameterTable::HandleDeleteLF (_String* lfName)
+{
+    _HYDataPanel*parent = (_HYDataPanel*)RetrieveParentDataPanel ();
+    if (parent) {
+        long k = parent->savedLFNames.Find (lfName);
+        if (k>=0) {
+            parent->savedLFNames.Delete (k);
+            parent->savedLFStates.Delete (k);
+            parent->tainted = true;
+
+            VerifyGlobalVariables();
+            RefreshTheTable ();
+
+            PrepareLFMenu ();
+
+            _HYPullDown*    p1  = (_HYPullDown*) GetCellObject   (HY_PARAMETER_TABLE_BUTTON_ROW,1);
+            p1->EnableItem  (0,true);
+            p1->ChangeSelection (0,false);
+        }
+    }
+}
+
+//__________________________________________________________
+
+void    _HYParameterTable::HandleSetHypothesis (_String* sel, bool alt)
+{
+    _HYDataPanel*parent = (_HYDataPanel*)RetrieveParentDataPanel ();
+    if (parent) {
+        parent->SetHypothesis (sel,alt);
+        PrepareLFMenu ();
+        _HYPullDown*    p1  = (_HYPullDown*) GetCellObject   (HY_PARAMETER_TABLE_BUTTON_ROW,1);
+        p1->ChangeSelection (parent->GetHypothesis (alt)+1);
+    }
+}
+
+
+//__________________________________________________________
+
+char    _HYParameterTable::GetViewOptions (void)
+{
+    char res  = 0;
+    if (lfID>=0) {
+        _LikelihoodFunction* lf = (_LikelihoodFunction*)likeFuncList (lfID);
+        res = HY_PARAMETER_TABLE_VIEW_LOCAL|HY_PARAMETER_TABLE_VIEW_TREES;
+        if (lf->CountObjects (1)) {
+            res |= HY_PARAMETER_TABLE_VIEW_GLOBAL;
+        }
+        if (lf->CountObjects (3)) {
+            res |= HY_PARAMETER_TABLE_VIEW_CONSTRAINED;
+        }
+        if (lf->GetCategoryVars().lLength) {
+            res |= HY_PARAMETER_TABLE_VIEW_CATEGORY;
+        }
+    }
+    return res;
+}
+
+//__________________________________________________________
+
+BaseRef _HYParameterTable::RetrieveIthRowVar (long index)
+{
+    BaseRef     result = nil;
+    _HYTable*   table  = (_HYTable*)GetCellObject (HY_PARAMETER_TABLE_TABLE_ROW,0);
+    if (index<table->verticalSpaces.lLength) {
+        _String* varName = (_String*) table->GetCellData(1,index);
+        result  = FetchVar (LocateVarByName (*varName));
+    }
+
+    return      result;
+}
+
+//__________________________________________________________
+
+_CalcNode* _HYParameterTable::GrabRowsCalcNode (_String* varName)
+{
+    long k = varName->FindBackwards('.',0,-1);
+    if (k>=0) {
+        _String    nodeName = varName->Cut(0,k-1);
+        return     (_CalcNode*)FetchVar(LocateVarByName (nodeName));
+    }
+    return      nil;
+}
+
+//__________________________________________________________
+
+void    _HYParameterTable::UpdateKthRow (long index, bool mark)
+{
+    _Variable* thisV = (_Variable*)RetrieveIthRowVar (index);
+    if (thisV) {
+        long       idx = -1;
+        _HYTable*   table  = (_HYTable*)GetCellObject (HY_PARAMETER_TABLE_TABLE_ROW,0);
+        if (!(thisV->IsCategory()||(thisV->ObjectClass()==TREE))) {
+            _String     newV (thisV->Compute()->Value());
+            idx = index*table->horizontalSpaces.lLength+2;
+            table->SetCellData (&newV,index,2,table->cellTypes.lData[idx],true);
+        } else if (thisV->IsCategory()) {
+            long      catIdx = 0;
+            _String   *cellValue = (_String*)table->GetCellData (2,index);
+            catIdx = cellValue->Cut (0,cellValue->Find ('(')-1).toNum();
+            idx = index*table->horizontalSpaces.lLength+3;
+            ((_CategoryVariable*)thisV)->Refresh();
+            _String   cv = _String (((_CategoryVariable*)thisV)->GetIntervalValue(catIdx-1));
+            table->SetCellData (&cv,index,3,HY_TABLE_STATIC_TEXT|HY_TABLE_PULLDOWN,true);
+        } else {
+            return;
+        }
+
+        if (mark&&(idx>=0)) {
+            table->_MarkCellForUpdate (idx);
+        }
+    }
+}
+
+//__________________________________________________________
+
+void    _HYParameterTable::HandleCellEditEvent (long index)
+{
+
+    _HYTable*       table = (_HYTable*)GetCellObject (HY_PARAMETER_TABLE_TABLE_ROW,0);
+
+    long h = index%table->horizontalSpaces.lLength,
+         v = index/table->horizontalSpaces.lLength,
+         k;
+
+    _Variable * thisV = (_Variable*) RetrieveIthRowVar (v);
+    _String   * currentValue,
+              warningString;
+    _SimpleList taintCells;
+
+    _Parameter  p1, p2, b1, b2;
+
+    bool        runUpdate = false,
+                ind = thisV->IsIndependent();
+
+    currentValue = (_String*)table->GetCellData (h,v);
+
+    switch (h) {
+    case 2: { // parameter value column
+        if (thisV->IsIndependent()) {
+            _Formula f (*currentValue);
+            p1 = thisV->Compute()->Value();
+            _PMathObj  fv = nil;
+
+            if (!f.IsEmpty()) {
+                fv = f.Compute();
+                if (fv) {
+                    p2 = fv->Value();
+                    b1 = thisV->GetLowerBound();
+                    b2 = thisV->GetUpperBound();
+                }
+            }
+
+            if (!fv) {
+                warningString = _String("Failed to evaluate the formula as entered. The value will be reset to ")& p1 &'.';
+            } else {
+                if ((p2>=b1)&&(p2<=b2)) {
+                    _Constant   c (p2);
+                    warningString = *thisV->GetName() & '=' & _String(thisV->Compute()->Value()) & ';';
+                    if (doUndo) {
+                        _UpdateUndoMenu (&warningString, &undoEditValue);
+                    } else {
+                        *(_String*)(undoCommands (undoCommands.lLength-1)) << warningString;
+                    }
+
+                    thisV->SetValue(&c);
+                    warningString = p2;
+                    table->SetCellData(&warningString,v,2,table->cellTypes.lData[index],true);
+                    taintCells << index;
+                    warningString = empty;
+                    runUpdate = true;
+                } else {
+                    warningString = _String ("The value ")& *currentValue & " is out of bounds ["
+                                    & b1 & ',' & b2 &"] for the variable "& *thisV->GetName() &
+                                    ". The value will be reset to "& p1 &'.';
+                }
+            }
+            if (warningString.sLength) {
+                _String         rv (p1);
+                table->SetCellData(&rv,v,2,table->cellTypes.lData[index],true);
+                taintCells << index;
+                ProblemReport (warningString,(Ptr)this);
+            }
+        }
+        break;
+    }
+
+    case 3: { // constraint column
+        if (ind||((!ind)&&(currentValue->sLength)))
+            // indep=>dep or dep=>dep
+        {
+            _Formula newF (*currentValue,nil);
+            if (!newF.IsEmpty()) {
+                if (newF.CheckFForDependence (thisV->GetAVariable(),true)) {
+                    warningString = _String ("The constraint '")& *thisV->GetName() &":="& *currentValue & "' contains self-referencing and is thus disallowed.";
+                    if (ind) {
+                        table->SetCellData(&empty,v,3,table->cellTypes.lData[index],true);
+                    } else {
+                        table->SetCellData(thisV->GetFormulaString(),v,3,table->cellTypes.lData[index],false);
+                    }
+                    taintCells << index;
+                    ProblemReport (warningString,(Ptr)this);
+                    break;
+                }
+
+                warningString = *thisV->GetName() & '=' & _String(thisV->Compute()->Value()) & ';';
+                if (doUndo) {
+                    _UpdateUndoMenu (&warningString, &undoSetConstraint);
+                } else {
+                    (*(_String*)undoCommands (undoCommands.lLength-1)) <<  warningString;
+                }
+
+                thisV->SetFormula (newF);
+                if (ind) {
+                    if (thisV->IsGlobal()) {
+                        table->SetCellData(&constrainedGlobalTableIcon,v,0,table->cellTypes.lData[index-3],true);
+                    } else {
+                        table->SetCellData(&constrainedTableIcon,v,0,table->cellTypes.lData[index-3],true);
+                    }
+                    taintCells << index-3;
+                    if (table->cellTypes.lData[index-1]&HY_TABLE_EDIT_TEXT) {
+                        table->cellTypes.lData[index-1] += HY_TABLE_STATIC_TEXT;
+                        table->cellTypes.lData[index-1] -= HY_TABLE_EDIT_TEXT;
+                    }
+                }
+                warningString = thisV->Compute()->Value();
+                table->SetCellData(&warningString,v,2,table->cellTypes.lData[index-1],true);
+                taintCells << index-1;
+                runUpdate = true;
+                if (doTableUpdate) {
+                    StretchColumnToFit (3);
+                    ToggleConstrainedView();
+                }
+
+            } else {
+                table->SetCellData(&empty,v,3,table->cellTypes.lData[index],true);
+                taintCells << index;
+            }
+        } else
+            // dep=>ind
+        {
+            if ((!ind)&&(currentValue->sLength==0)) {
+                _Constant cv (thisV->Compute()->Value());
+                currentValue = (_String*)thisV->GetFormulaString();
+                warningString = *thisV->GetName() & ":=" & *currentValue & ';';
+                DeleteObject (currentValue);
+                if (doUndo) {
+                    _UpdateUndoMenu (&warningString, &undoKillConstraint);
+                } else {
+                    (*(_String*)undoCommands (undoCommands.lLength-1)) << warningString;
+                }
+                thisV->SetValue (&cv);
+                table->SetCellData(thisV->IsGlobal()?&globalTableIcon:&localTableIcon,
+                                   v,0,table->cellTypes.lData[index-3],true);
+                taintCells << index-3;
+                if (table->cellTypes.lData[index-1]&HY_TABLE_STATIC_TEXT) {
+                    table->cellTypes.lData[index-1] -= HY_TABLE_STATIC_TEXT;
+                    table->cellTypes.lData[index-1] += HY_TABLE_EDIT_TEXT;
+                }
+                taintCells << index-1;
+                runUpdate = true;
+                if (avViewOptions&HY_PARAMETER_TABLE_VIEW_CONSTRAINED) {
+                    avViewOptions = GetViewOptions();
+                    if (!(avViewOptions&HY_PARAMETER_TABLE_VIEW_CONSTRAINED))
+                        if (viewOptions&HY_PARAMETER_TABLE_VIEW_CONSTRAINED) {
+                            viewOptions -= HY_PARAMETER_TABLE_VIEW_CONSTRAINED;
+                        }
+
+                    _UpdateViewMenu();
+                }
+            }
+
+        }
+        if (doTableUpdate) {
+            VerifyGlobalVariables();
+        }
+        break;
+    }
+    }
+
+    if (runUpdate) {
+        if (!thisV->IsIndependent()) {
+            _SimpleList indVars;
+            {
+                _AVLList ia (&indVars);
+                if (thisV->varFormula) {
+                    thisV->varFormula->ScanFForVariables(ia,false,true);
+                }
+                ia.ReorderList ();
+            }
+            h = -1;
+            for (k=0; k<indVars.lLength; k++) {
+                thisV = LocateVar (indVars.lData[k]);
+                if (thisV->IsIndependent()) {
+                    h = k;
+                    if (!thisV->IsGlobal()) {
+                        break;
+                    }
+                }
+            }
+            if (h>=0) {
+                thisV = LocateVar (indVars.lData[h]);
+                _Constant c (thisV->Compute()->Value());
+                thisV->SetValue (&c);
+            } else {
+                _LikelihoodFunction* lf = (_LikelihoodFunction*)likeFuncList (lfID);
+                if (lf->CountObjects (1)+lf->CountObjects (2)) {
+                    lf->SetIthIndependent (0,lf->GetIthIndependent (0));
+                }
+            }
+
+        }
+        for (k = 1; k<table->verticalSpaces.lLength; k++) {
+            _Variable * vr = (_Variable*) RetrieveIthRowVar (k);
+            if ((!vr->IsIndependent())&&vr->HasChanged()) {
+                p1 = vr->Compute()->Value();
+                warningString = p1;
+                index = k*table->horizontalSpaces.lLength+2;
+                table->SetCellData (&warningString,k,2,table->cellTypes.lData[index],true);
+                taintCells << index;
+            } else {
+                if (vr->IsCategory())
+                    if (vr->HasChanged()) {
+                        ((_CategoryVariable*)vr)->Refresh (true);
+                        UpdateKthRow (k,true);
+                    }
+                /*else
+                {
+                    _SimpleList vars;
+                    vr->ScanForVariables (vars,true);
+                    if (vars.Find (thisV->GetAVariable())>=0)
+                    {
+                        ((_CategoryVariable*)vr)->Refresh (true);
+                        UpdateKthRow (k,true);
+                    }
+                }*/
+            }
+        }
+
+        if (autoUpdateTableLF) {
+            UpdateLogLikelihood();
+        }
+    }
+
+    if (taintCells.lLength) {
+        table->_MarkCellsForUpdate(taintCells);
+    }
+}
+
+//__________________________________________________________
+
+void    _HYParameterTable::HandleCellPullDown (long index, long location)
+{
+
+    _HYTable*       table = (_HYTable*)GetCellObject (HY_PARAMETER_TABLE_TABLE_ROW,0);
+
+    long h = index%table->horizontalSpaces.lLength,
+         v = index/table->horizontalSpaces.lLength,
+         k;
+
+    _Variable * thisV = (_Variable*) RetrieveIthRowVar (v);
+    if (thisV&&thisV->IsCategory()) {
+        _CategoryVariable* thisCV = (_CategoryVariable*) thisV;
+        _List              menuItems;
+        _String            kthOption,
+                           *cellValue;
+
+        for (k = 1; k <= thisCV->GetNumberOfIntervals(); k++) {
+            kthOption = _String ("Rate Class ") & k;
+            menuItems && & kthOption;
+        }
+        if (!thisCV->GetDensity().IsEmpty()) {
+            menuItems && & menuSeparator;
+            kthOption = "Density Plot";
+            menuItems && & kthOption;
+        }
+
+        cellValue = (_String*) table->GetCellData (2,v);
+
+        k = (cellValue->Cut(0,cellValue->Find ('(')-1)).toNum();
+
+        h = table->_HandlePullDown  (menuItems,(location&0xffff0000)>>16,location&0x0000ffff,k);
+
+        if ((h!=-1)&&(h!=(k-1))) {
+            if (h<thisCV->GetNumberOfIntervals()) {
+                kthOption = _String ((long)(h+1))&'('&thisCV->GetNumberOfIntervals()&')';
+                table->SetCellData (&kthOption,v,2,HY_TABLE_STATIC_TEXT,true);
+                kthOption = thisCV->GetIntervalValue(h);
+                table->SetCellData (&kthOption,v,3,HY_TABLE_STATIC_TEXT|HY_TABLE_PULLDOWN,true);
+                _SimpleList cells;
+                cells << v*table->horizontalSpaces.lLength+2;
+                cells << v*table->horizontalSpaces.lLength+3;
+                table->_MarkCellsForUpdate(cells);
+                StretchColumnToFit (3);
+            } else if (h==thisCV->GetNumberOfIntervals()+1) { // produce a plot
+                OpenCategoryPlotWindow(thisCV);
+            }
+        }
+    }
+}
+
+//__________________________________________________________
+
+void    _HYParameterTable::HandleHeaderPullDown (long index, long location)
+{
+
+    _HYTable*       table = (_HYTable*)GetCellObject (HY_PARAMETER_TABLE_TABLE_ROW-1,0);
+    _HYTable*       table2 = (_HYTable*)GetCellObject (HY_PARAMETER_TABLE_TABLE_ROW,0);
+
+    long h = index%table->horizontalSpaces.lLength,
+         v = index/table->horizontalSpaces.lLength;
+
+    //_Variable * thisV = (_Variable*) RetrieveIthRowVar (v);
+    if ((v==0)&&(h==1)) {
+        _List              menuItems;
+        _String            kthOption ("Sort in Ascending Order");
+        menuItems && & kthOption;
+        kthOption = "Sort in Descending Order";
+        menuItems && & kthOption;
+
+        h = table->_HandlePullDown  (menuItems,(location&0xffff0000)>>16,location&0x0000ffff,0);
+
+        if (h>=0) {
+            menuItems.Clear();
+            _SimpleList  indices;
+            for (v=0; v<table2->verticalSpaces.lLength; v++) {
+                menuItems << table2->GetCellData(1,v);
+                indices << v;
+            }
+            SortLists (&menuItems,&indices);
+            if (h) {
+                indices.Flip();
+            }
+            table2->SetRowOrder (indices);
+        }
+    } else if ((v==0)&&(h==0)) {
+        _List              menuItems;
+        _String            kthOption ("Sort by type");
+        menuItems && & kthOption;
+
+        h = table->_HandlePullDown  (menuItems,(location&0xffff0000)>>16,location&0x0000ffff,0);
+
+        if (h>=0) {
+            _SimpleList  indices,
+                         types;
+
+            for (v=0; v<table2->verticalSpaces.lLength; v++) {
+                _Variable * theV = (_Variable*)RetrieveIthRowVar(v);
+                if (theV->ObjectClass()==TREE) {
+                    types << 0;
+                } else {
+                    if (theV->IsGlobal()) {
+                        if (theV->IsIndependent()) {
+                            types<<1;
+                        } else {
+                            types<<2;
+                        }
+                    } else if (theV->IsIndependent()) {
+                        types<<3;
+                    } else {
+                        types<<4;
+                    }
+                }
+                indices << v;
+            }
+            SortLists (&types,&indices);
+            table2->SetRowOrder (indices);
+        }
+    }
+
+}
+
+//__________________________________________________________
+
+void    _HYParameterTable::UpdateSelectionDependentButtons (void)
+{
+
+    _HYTable*       table = (_HYTable*)GetCellObject (HY_PARAMETER_TABLE_TABLE_ROW,0);
+    _HYButtonBar*   bb    = (_HYButtonBar*)GetCellObject (HY_PARAMETER_TABLE_BUTTON_ROW,0);
+
+    bool            b1 = false,
+                    b2 = false,
+                    b3 = false,
+                    b4 = false,
+                    b5 = false,
+                    b6 = false,
+                    b7 = false;
+
+    _SimpleList     rows;
+    _Variable*      thisV,
+                    *      thisV2 = nil;
+    long            counterL,
+                    counterV,
+                    counterC,
+                    counterT,
+                    k;
+
+    table->GetRowSelection (rows);
+
+    if (rows.lLength>=1) {
+        thisV = (_Variable*)RetrieveIthRowVar (rows.lData[0]);
+
+        if ((thisV->ObjectClass()==TREE)&&(rows.lLength == 1)) {
+            b5 = true;
+        } else if (thisV->IsIndependent()) {
+            b4 = true;
+            _CalcNode* cNode = GrabRowsCalcNode (thisV->GetName());
+            if (cNode) {
+                node<long>*nodeD    = cNode->LocateMeInTree();
+                if (nodeD&&nodeD->get_num_nodes()) {
+                    b5 = true;
+                }
+            }
+
+            if (b5)
+                for (long k=1; k<rows.lLength; k++) {
+                    thisV = (_Variable*)RetrieveIthRowVar (rows.lData[k]);
+                    _CalcNode* cNode2 = GrabRowsCalcNode (thisV->GetName());
+                    if (cNode2 != cNode) {
+                        b5 = false;
+                        break;
+                    }
+                }
+        }
+    }
+
+    if (rows.lLength) {
+        counterL = 0;
+        counterV = 0;
+        counterC = 0;
+        counterT = 0;
+        for (k=0; k<rows.lLength; k++) {
+            thisV = (_Variable*)RetrieveIthRowVar (rows.lData[k]);
+            if (thisV->ObjectClass()==TREE) {
+                counterT++;
+            } else if (!thisV->IsCategory()) {
+                counterV++;
+                if (!thisV->IsGlobal()) {
+                    counterL++;
+                }
+                if (!thisV->IsIndependent()) {
+                    counterC++;
+                }
+            }
+        }
+        if (counterV >= 1) {
+            b2 = true;
+        }
+
+        if (counterV == 2) {
+            b3 = true;
+        }
+
+        if (counterL) {
+            b1 = true;
+        }
+
+        if (counterC) {
+            b7 = true;
+        }
+
+        if (rows.lLength==2) {
+            if (counterT==0) {
+                thisV =  (_Variable*)GrabRowsCalcNode ((_String*)table->GetCellData(1,rows.lData[0]));
+                thisV2 = (_Variable*)GrabRowsCalcNode ((_String*)table->GetCellData(1,rows.lData[1]));
+                if (!(thisV&&thisV2)) {
+                    thisV2 = nil;
+                } else if (!((_CalcNode*)thisV)->MatchSubtree ((_CalcNode*)thisV2)) {
+                    thisV2 = nil;
+                }
+            } else if (counterT==2) {
+                thisV = (_Variable*)RetrieveIthRowVar (rows.lData[0]);
+                thisV2 = (_Variable*)RetrieveIthRowVar (rows.lData[1]);
+            }
+            if (thisV2) {
+                b6 = true;
+            }
+        }
+    }
+
+    bb->EnableButton (0,b1);
+    bb->EnableButton (1,b2);
+    bb->EnableButton (2,b3);
+    bb->EnableButton (3,b4);
+    bb->EnableButton (4,b5);
+    bb->EnableButton (5,b6);
+    bb->EnableButton (6,b7);
+
+}
+
+//__________________________________________________________
+
+void    _HYParameterTable::DoEqualConstraint (void)
+{
+
+    _HYTable*       table = (_HYTable*)GetCellObject (HY_PARAMETER_TABLE_TABLE_ROW,0);
+    _HYButtonBar*   bb    = (_HYButtonBar*)GetCellObject (HY_PARAMETER_TABLE_BUTTON_ROW,0);
+
+    int  h,v;
+    long k;
+
+    _List           menuOptions;
+    _SimpleList     rows, tainted;
+    _String         menuChoice;
+
+    table->GetRowSelection (rows);
+
+    if (rows.lLength>1) {
+        for (h=0; h<rows.lLength; h++) {
+            menuChoice = _String (":=") & *(_String*)table->GetCellData(1,rows.lData[h]);
+            menuOptions && & menuChoice;
+        }
+        menuOptions && & menuSeparator;
+    }
+
+    menuChoice = "Equal to own value";
+    menuOptions && & menuChoice;
+    menuChoice = "Equal to expression";
+    menuOptions && & menuChoice;
+
+
+    bb->GetButtonLoc(1,h,v,true);
+    menuChoice = HandlePullDown (menuOptions,h,v,0);
+    bb->_UnpushButton();
+
+    v = menuOptions.Find (&menuChoice);
+    if (v<0) {
+        return;
+    }
+
+    doUndo            = false;
+    autoUpdateTableLF = false;
+    doTableUpdate     = false;
+
+    undoDescriptions && & undoEqualConstraints;
+    undoCommands << new _String (128L, true);
+
+    if ((v<rows.lLength)&&(rows.lLength>1)) {
+        menuChoice = *(_String*)table->GetCellData(1,rows.lData[v]);
+        for (h=0; h<rows.lLength; h++) {
+            if (v==h) {
+                continue;
+            }
+            k = table->horizontalSpaces.lLength*rows.lData[h] + 3;
+            table->SetCellData (&menuChoice,rows.lData[h],3,table->cellTypes[k],true);
+            ProcessEvent (generateTableEditCellEvent(table->GetID(),k));
+            tainted << k;
+        }
+    } else {
+        if (v == menuOptions.lLength-1) {
+            _String prompt = "Expression for the constraint";
+            if (!EnterStringDialog (menuChoice, prompt, (Ptr)this)) {
+                ((_String*)undoCommands(undoCommands.lLength-1))->Finalize();
+                autoUpdateTableLF = true;
+                doUndo            = true;
+                doTableUpdate     = true;
+                undoDescriptions.Delete (undoDescriptions.lLength-1);
+                undoCommands.Delete (undoCommands.lLength-1);
+                return;
+            }
+
+            for (h=0; h<rows.lLength; h++) {
+                k = table->horizontalSpaces.lLength*rows.lData[h] + 3;
+                table->SetCellData (&menuChoice,rows.lData[h],3,table->cellTypes[k],true);
+                ProcessEvent (generateTableEditCellEvent(table->GetID(),k));
+                tainted << k;
+            }
+        } else
+            for (h=0; h<rows.lLength; h++) {
+                k = table->horizontalSpaces.lLength*rows.lData[h] + 3;
+                menuChoice = *(_String*)table->GetCellData(2,rows.lData[h]);
+                table->SetCellData (&menuChoice,rows.lData[h],3,table->cellTypes[k],true);
+                ProcessEvent (generateTableEditCellEvent(table->GetID(),k));
+                tainted << k;
+            }
+    }
+
+    ((_String*)undoCommands(undoCommands.lLength-1))->Finalize();
+    autoUpdateTableLF = true;
+    doUndo            = true;
+    doTableUpdate     = true;
+
+    StretchColumnToFit   (3);
+    ToggleConstrainedView( );
+    VerifyGlobalVariables( );
+
+    table->_MarkCellsForUpdate (tainted);
+    _UpdateUndoMenu (nil,nil);
+    UpdateLogLikelihood();
+    UpdateSelectionDependentButtons();
+}
+
+//__________________________________________________________
+
+void    _HYParameterTable::DoClearConstraints (void)
+{
+
+    _HYTable*       table = (_HYTable*)GetCellObject (HY_PARAMETER_TABLE_TABLE_ROW,0);
+    _SimpleList     rows,
+                    tCells;
+    long            i,j;
+    _Variable*      thisV;
+
+    table->GetRowSelection (rows);
+
+    doUndo            = false;
+    autoUpdateTableLF = false;
+    doTableUpdate     = false;
+    undoDescriptions && & undoClearConstraints;
+    undoCommands << new _String (128L, true);
+    for (i=0; i<rows.lLength; i++) {
+        thisV = (_Variable*)RetrieveIthRowVar(rows.lData[i]);
+        if (thisV->ObjectClass()==TREE) {
+            continue;
+        }
+        if (!thisV->IsIndependent()) {
+            j = rows.lData[i]*table->horizontalSpaces.lLength + 3;
+            table->SetCellData(&empty,rows.lData[i],3,table->cellTypes[j],true);
+            ProcessEvent(generateTableEditCellEvent(table->GetID(),j));
+            tCells<<j;
+        }
+    }
+    autoUpdateTableLF = true;
+    doUndo            = true;
+    doTableUpdate     = true;
+
+
+
+    ((_String*)undoCommands(undoCommands.lLength-1))->Finalize();
+    _UpdateUndoMenu (nil,nil);
+    table->_MarkCellsForUpdate(tCells);
+
+    StretchColumnToFit   (3);
+    ToggleConstrainedView( );
+    VerifyGlobalVariables( );
+
+    UpdateSelectionDependentButtons();
+    UpdateLogLikelihood ();
+}
+
+//__________________________________________________________
+
+void    _HYParameterTable::DoProportionalConstraint (void)
+{
+
+    _HYTable*       table = (_HYTable*)    GetCellObject (HY_PARAMETER_TABLE_TABLE_ROW,0);
+    _HYButtonBar*   bb    = (_HYButtonBar*)GetCellObject (HY_PARAMETER_TABLE_BUTTON_ROW,0);
+
+    int  h,v;
+    long k;
+
+    _List           menuOptions,
+                    globalVars;
+    _SimpleList     rows;
+    _String         menuChoice,
+                    *var1,
+                    *var2;
+
+    table->GetRowSelection (rows);
+
+    if ((lfID>=0)&&(rows.lLength==2)) {
+
+        long    insertAt = GatherListOfGlobals (globalVars);
+
+        var1 = (_String*)table->GetCellData(1,rows.lData[0]);
+        var2 = (_String*)table->GetCellData(1,rows.lData[1]);
+
+        for (h=0; h<globalVars.lLength; h++) {
+            menuChoice = *var1 & ":=" & *(_String*)globalVars(h) & '*' & *var2;
+            menuOptions && & menuChoice;
+            menuChoice = *var2 & ":=" & *(_String*)globalVars(h) & '*' & *var1;
+            menuOptions && & menuChoice;
+        }
+
+        if (globalVars.lLength) {
+            menuOptions && & menuSeparator;
+        }
+
+        menuChoice = *var1 & ":= {New Ratio} *" & *var2;
+        menuOptions && & menuChoice;
+        menuChoice = *var2 & ":= {New Ratio} *" & *var1;
+        menuOptions && & menuChoice;
+
+        menuOptions && & menuSeparator;
+
+        menuChoice = *var1 & ":= {Constant} *" & *var2;
+        menuOptions && & menuChoice;
+        menuChoice = *var2 & ":= {Constant} *" & *var1;
+        menuOptions && & menuChoice;
+
+        bb->GetButtonLoc(2,h,v,true);
+        menuChoice = HandlePullDown (menuOptions,h,v,0);
+        bb->_UnpushButton();
+
+        v = menuOptions.Find (&menuChoice);
+
+        if (v<0) {
+            return;
+        }
+
+        if (v>=2*globalVars.lLength+(globalVars.lLength!=0)) {
+            _String          newID,
+                             prStr;
+            if (v<=2*globalVars.lLength+1+(globalVars.lLength!=0)) {
+                prStr = "Identifier of the new ratio variable:";
+                if (!EnterStringDialog (newID,prStr, (Ptr)this, hyIDValidator)) {
+                    return;
+                } else {
+                    if ((h=globalVars.Find (&newID))>=0) {
+                        menuChoice = menuChoice.Replace ("{New Ratio}", newID, true);
+                    } else {
+                        if (!newID.IsValidIdentifier()) {
+                            return;
+                        }
+                        _Variable newVar (newID,true);
+                        LocateVar(newVar.GetAVariable())->SetNumericValue(1.);
+                        menuChoice = menuChoice.Replace ("{New Ratio}", *newVar.GetName(), true);
+                        table->AddRow (insertAt,HY_PARAMETER_TABLE_ROW_HEIGHT,HY_TABLE_STATIC_TEXT);
+                        for (long kk=0; kk<rows.lLength; kk++)
+                            if (rows.lData[kk]>=insertAt) {
+                                rows.lData[kk]++;
+                            }
+
+                        SetRowValues (insertAt,LocateVar(newVar.GetAVariable()),table);
+                        table->_MarkForUpdate();
+                    }
+                }
+            } else {
+                prStr = "Specify the constant of proportionality:";
+                if (!EnterStringDialog (newID,prStr, (Ptr)this)) {
+                    return;
+                } else {
+                    newID = _String(newID.toNum());
+                    menuChoice = menuChoice.Replace ("{Constant}", newID, true);
+                }
+            }
+        }
+
+        h = menuChoice.beginswith (*var1)?0:1;
+        menuChoice = menuChoice.Cut (menuChoice.Find ('=')+1,-1);
+        k = table->horizontalSpaces.lLength*rows.lData[h] + 3;
+        table->SetCellData (&menuChoice,rows.lData[h],3,table->cellTypes[k],true);
+        ProcessEvent (generateTableEditCellEvent(table->GetID(),k));
+        ToggleConstrainedView ();
+        ToggleConstrainedView (HY_PARAMETER_TABLE_VIEW_GLOBAL);
+        table->_MarkCellForUpdate (k);
+        UpdateSelectionDependentButtons();
+    }
+}
+
+//__________________________________________________________
+
+void    _HYParameterTable::DoCleanUp (void)
+{
+    if (lfID>=0) {
+
+        _LikelihoodFunction*  theLF =
+            (_LikelihoodFunction*)likeFuncList (lfID);
+
+        theLF->RescanAllVariables();
+        _SimpleList     allUsedVars (theLF->GetIndependentVars()),
+                        rowsToDelete;
+
+        allUsedVars << theLF->GetDependentVars();
+
+        allUsedVars.Sort();
+
+        _HYTable*       table = (_HYTable*)    GetCellObject (HY_PARAMETER_TABLE_TABLE_ROW,0);
+
+        long            k;
+
+        for (k=0; k<table->verticalSpaces.lLength; k++) {
+            _Variable* thisV = (_Variable*)RetrieveIthRowVar(k);
+            if (thisV->ObjectClass()!=TREE)
+                if (!thisV->IsCategory ())
+                    if (allUsedVars.BinaryFind (thisV->GetAVariable())<0) {
+                        rowsToDelete << k;
+                    }
+        }
+
+        if (rowsToDelete.lLength) {
+
+            undoCommands.Clear();
+            undoDescriptions.Clear();
+            _UpdateUndoMenu (nil,nil);
+
+            for (k=rowsToDelete.lLength-1; k>=0; k--) {
+                table->DeleteRow (rowsToDelete.lData[k]);
+            }
+
+            UpdateComponentInfo();
+            table->SetVisibleSize (table->rel);
+            table->_MarkForUpdate();
+
+
+            UpdateSelectionDependentButtons();
+        }
+        UpdateLogLikelihood ();
+    }
+}
+
+//__________________________________________________________
+
+void    _HYParameterTable::DoProportionalSubtrees (void)
+{
+
+    _HYTable*       table = (_HYTable*)    GetCellObject (HY_PARAMETER_TABLE_TABLE_ROW,0);
+    _HYButtonBar*   bb    = (_HYButtonBar*)GetCellObject (HY_PARAMETER_TABLE_BUTTON_ROW,0);
+
+    int             h,v;
+    long            k;
+
+    _CalcNode       *thisCN,
+                    *thisCN2;
+
+    _List           menuOptions,
+                    menuOptions2,
+                    undoValues;
+
+    _SimpleList     rows;
+
+    _String         menuChoice;
+
+    _Variable       *thisTree,
+                    *thisTree2;
+
+    table->GetRowSelection (rows);
+
+    if ((lfID>=0)&&(rows.lLength==2)) {
+        bb->_UnpushButton();
+        thisCN = GrabRowsCalcNode(((_Variable*)RetrieveIthRowVar (rows.lData[0]))->GetName());
+        if (thisCN) {
+            h = thisCN->GetName()->Find ('.');
+            if (h<0) {
+                return;
+            }
+            menuChoice = thisCN->GetName()->Cut (0,h-1);
+            thisTree = FetchVar (LocateVarByName (menuChoice));
+            thisCN2 = GrabRowsCalcNode(((_Variable*)RetrieveIthRowVar (rows.lData[1]))->GetName());
+            h = thisCN2->GetName()->Find ('.');
+            if (h<0) {
+                return;
+            }
+            menuChoice = thisCN2->GetName()->Cut (0,h-1);
+            thisTree2 = FetchVar (LocateVarByName (menuChoice));
+        } else {
+            menuChoice = *(_String*)table->GetCellData (1,rows.lData[0]);
+            thisTree = FetchVar (LocateVarByName (menuChoice));
+            menuChoice = *(_String*)table->GetCellData (1,rows.lData[1]);
+            thisTree2 = FetchVar (LocateVarByName (menuChoice));
+            thisCN2 = nil;
+        }
+
+        if (!(thisTree&&(thisTree->ObjectClass()==TREE)&&
+                thisTree2&&(thisTree2->ObjectClass()==TREE))) {
+            return;
+        }
+
+        ((_TheTree*)thisTree) ->ScanSubtreeVars (menuOptions, 1,thisCN);
+        ((_TheTree*)thisTree2)->ScanSubtreeVars (menuOptions2,1,thisCN2);
+
+        for (k=menuOptions.lLength-1; k>=0; k--)
+            if (menuOptions2.Find (menuOptions(k))<0) {
+                menuOptions.Delete (k);
+            }
+
+        if (menuOptions.lLength>1) {
+            menuOptions && & menuSeparator;
+            menuOptions && & allVariablesOption;
+        } else if (menuOptions.lLength==0) {
+            menuChoice = "There are no parameters eligible for the relative ratio constraint in the selected subtrees.";
+            ProblemReport (menuChoice,(Ptr)this);
+            return;
+        }
+
+
+        bb->GetButtonLoc(5,h,v,true);
+        menuChoice = HandlePullDown (menuOptions,h,v,0);
+        bb->_UnpushButton();
+
+        v = menuOptions.Find (&menuChoice);
+
+        if (v<0) {
+            return;
+        }
+
+        _String prStr = "Identifier of the ratio variable:",
+                newID;
+
+        if (!EnterStringDialog (newID,prStr, (Ptr)this)) {
+            return;
+        } else {
+            if (!newID.IsValidIdentifier()) {
+                return;
+            }
+
+            _List globalVars;
+            long insertAt = GatherListOfGlobals (globalVars);
+            if (globalVars.Find(&newID)<0) {
+                _Variable newVar (newID,true);
+                LocateVar(newVar.GetAVariable())->SetNumericValue(1.);
+                table->AddRow (insertAt,HY_PARAMETER_TABLE_ROW_HEIGHT,HY_TABLE_STATIC_TEXT);
+                SetRowValues (insertAt,LocateVar(newVar.GetAVariable()),table);
+            }
+        }
+
+        _LikelihoodFunction *lf = (_LikelihoodFunction*)likeFuncList (lfID);
+        rows.Clear();
+        rows.Duplicate (&lf->GetIndependentVars());
+        for (v=0; v<rows.lLength; v++) {
+            _Variable* thisV = LocateVar (rows.lData[v]);
+            prStr = thisV->Compute()->Value();
+            undoValues && & prStr;
+        }
+        if (thisCN) {
+            if (menuChoice.Equal (&allVariablesOption)) {
+                menuChoice = blReplicate&"\"this1.?:="&newID&"*this2.?\","&*thisCN->GetName()&','&*thisCN2->GetName()&");";
+            } else {
+                menuChoice = blReplicate&"\"this1.?."&menuChoice&":="&newID&"*this2.?."&menuChoice&"\","&*thisCN->GetName()&','&*thisCN2->GetName()&");";
+            }
+        } else {
+            if (menuChoice.Equal (&allVariablesOption)) {
+                menuChoice = blReplicate&"\"this1.?:="&newID&"*this2.?\","&*thisTree->GetName()&','&*thisTree2->GetName()&");";
+            } else {
+                menuChoice = blReplicate&"\"this1.?."&menuChoice&":="&newID&"*this2.?."&menuChoice&"\","&*thisTree->GetName()&','&*thisTree2->GetName()&");";
+            }
+        }
+        _ExecutionList ex (menuChoice);
+        ex.Execute();
+        _String     undoS (16,true);
+        for (v=0; v<rows.lLength; v++) {
+            _Variable* thisV = LocateVar (rows.lData[v]);
+            if (!thisV->IsIndependent()) {
+                undoS << thisV->GetName();
+                undoS << '=';
+                undoS << (_String*)undoValues (v);
+                undoS << ';';
+                undoS << '\n';
+            }
+        }
+        undoS.Finalize ();
+        _UpdateUndoMenu (&undoS,&undoProportionalSubtrees);
+        TaintTheLF();
+        RefreshTheTable();
+        VerifyGlobalVariables();
+        StretchColumnToFit(3);
+        table->_MarkForUpdate();
+        UpdateSelectionDependentButtons();
+    }
+}
+
+//__________________________________________________________
+
+void    _HYParameterTable::DoBoundsChange (void)
+{
+
+    _HYTable*       table = (_HYTable*)    GetCellObject (HY_PARAMETER_TABLE_TABLE_ROW,0);
+    _HYButtonBar*   bb    = (_HYButtonBar*)GetCellObject (HY_PARAMETER_TABLE_BUTTON_ROW,0);
+
+    int  h,v;
+
+    _List           menuOptions;
+    _SimpleList     rows;
+    _String         menuChoice,
+                    prStr,
+                    newID;
+    _Variable       *thisV;
+    _Parameter      newB;
+
+    table->GetRowSelection (rows);
+
+    if ((lfID>=0)&&(rows.lLength==1)) {
+        thisV = (_Variable*)RetrieveIthRowVar (rows.lData[0]);
+        menuChoice = _String("Lower Bound [")& thisV->GetLowerBound()&']';
+        menuOptions && & menuChoice;
+        menuChoice = _String("Upper Bound [")& thisV->GetUpperBound()&']';
+        menuOptions && & menuChoice;
+
+        bb->GetButtonLoc(3,h,v,true);
+        menuChoice = HandlePullDown (menuOptions,h,v,0);
+        bb->_UnpushButton();
+
+        v = menuOptions.Find (&menuChoice);
+
+        if (v<0) {
+            return;
+        }
+
+        if (v==0) {
+            prStr = "Specify the new lower bound:";
+            newID = thisV->GetLowerBound();
+        } else {
+            prStr = "Specify the new upper bound:";
+            newID = thisV->GetUpperBound();
+        }
+
+        if (!EnterStringDialog (newID,prStr, (Ptr)this)) {
+            return;
+        }
+
+        newB = newID.toNum();
+        h = 0;
+
+        if (v==0) {
+            if (newB>thisV->GetUpperBound()) {
+                prStr = "The lower bound cannot exceed the upper bound!";
+                ProblemReport(prStr,(Ptr)this);
+                return;
+            }
+            if (newB>thisV->Compute()->Value()) {
+                h = 1;
+            }
+            thisV->SetBounds (newB,thisV->GetUpperBound());
+        } else {
+            if (newB<thisV->GetLowerBound()) {
+                prStr = "The upper bound cannot be less than the lower bound!";
+                ProblemReport(prStr,(Ptr)this);
+                return;
+            }
+            if (newB<thisV->Compute()->Value()) {
+                h = 1;
+            }
+            thisV->SetBounds (thisV->GetLowerBound(),newB);
+        }
+
+        if (h) {
+            newID (newB);
+            h = rows.lData[0]*table->horizontalSpaces.lLength+2;
+            table->SetCellData (&newID,rows.lData[0],2,table->cellTypes.lData[h],true);
+            ProcessEvent (generateTableEditCellEvent(table->GetID(),h));
+        }
+
+    }
+}
+
+//__________________________________________________________
+
+void    _HYParameterTable::DoMolecularClock (void)
+{
+
+    _HYTable*       table = (_HYTable*)    GetCellObject (HY_PARAMETER_TABLE_TABLE_ROW,0);
+    _HYButtonBar*   bb    = (_HYButtonBar*)GetCellObject (HY_PARAMETER_TABLE_BUTTON_ROW,0);
+
+    int  h,v;
+
+    _List           menuOptions,
+                    undoValues;
+    _SimpleList     rows;
+    _String         menuChoice,
+                    prStr,
+                    newID;
+    _CalcNode       *thisCN;
+    _Variable       *thisTree;
+
+    table->GetRowSelection (rows);
+
+    if ((lfID>=0)&&(rows.lLength>=1)) {
+        bb->_UnpushButton();
+        thisCN = GrabRowsCalcNode(((_Variable*)RetrieveIthRowVar (rows.lData[0]))->GetName());
+        if (thisCN) {
+            h = thisCN->GetName()->Find ('.');
+            if (h<0) {
+                return;
+            }
+            menuChoice = thisCN->GetName()->Cut (0,h-1);
+            thisTree = FetchVar (LocateVarByName (menuChoice));
+        } else {
+            menuChoice = *(_String*)table->GetCellData (1,rows.lData[0]);
+            thisTree = FetchVar (LocateVarByName (menuChoice));
+        }
+
+        if (!(thisTree&&(thisTree->ObjectClass()==TREE))) {
+            return;
+        }
+        ((_TheTree*)thisTree)->ScanSubtreeVars (menuOptions,1,thisCN);
+
+        if (menuOptions.lLength>1) {
+            menuOptions && & menuSeparator;
+            menuOptions && & allVariablesOption;
+        } else if (menuOptions.lLength==0) {
+            menuChoice = "There are no parameters eligible for the molecular clock constraint in the selected subtree.";
+            ProblemReport (menuChoice,(Ptr)this);
+            return;
+        }
+
+        bb->GetButtonLoc(4,h,v,true);
+        menuChoice = HandlePullDown (menuOptions,h,v,0);
+
+        v = menuOptions.Find (&menuChoice);
+        if (v<0) {
+            return;
+        }
+
+        if (v<menuOptions.lLength-2) {
+            menuChoice = *(_String*)menuOptions(v);
+            menuOptions.Clear();
+            menuOptions && & menuChoice;
+        } else {
+            if (menuOptions.lLength>1) {
+                menuOptions.Delete (menuOptions.lLength-1);
+                menuOptions.Delete (menuOptions.lLength-1);
+            }
+        }
+
+        menuOptions.InsertElement(&empty,0,true);
+        if (thisCN) {
+            menuChoice = *thisCN->GetName();
+            menuChoice.Trim (menuChoice.Find('.')+1,-1);
+        } else {
+            menuChoice = empty;
+        }
+
+        _LikelihoodFunction *lf = (_LikelihoodFunction*)likeFuncList (lfID);
+        rows.Clear();
+        rows.Duplicate (&lf->GetIndependentVars());
+        for (v=0; v<rows.lLength; v++) {
+            _Variable* thisV = LocateVar (rows.lData[v]);
+            prStr = thisV->Compute()->Value();
+            undoValues && & prStr;
+        }
+
+        ((_TheTree*)thisTree)->MolecularClock(menuChoice,menuOptions);
+
+        _String     undoS (16,true);
+        for (v=0; v<rows.lLength; v++) {
+            _Variable* thisV = LocateVar (rows.lData[v]);
+            if (!thisV->IsIndependent()) {
+                undoS << thisV->GetName();
+                undoS << '=';
+                undoS << (_String*)undoValues (v);
+                undoS << ';';
+                undoS << '\n';
+            }
+        }
+        undoS.Finalize ();
+
+        _UpdateUndoMenu (&undoS,&undoMolecularClock);
+
+        ToggleConstrainedView();
+        TaintTheLF           ();
+        RefreshTheTable();
+        UpdateSelectionDependentButtons();
+        StretchColumnToFit(3);
+        table->_MarkContentsForUpdate();
+    }
+}
+
+//__________________________________________________________
+
+void    _HYParameterTable::ToggleConstrainedView (char flag)
+{
+    if (!(avViewOptions&flag)) {
+        avViewOptions = GetViewOptions();
+        if (avViewOptions&flag) {
+            viewOptions |= flag;
+        }
+        _UpdateViewMenu();
+    }
+}
+
+
+//__________________________________________________________
+
+void    _HYParameterTable::DoEnterConstraint (void)
+{
+    _String prStr = "Enter a constraint/command",
+            newCons (stashCustomCommand);
+
+    if (!EnterStringDialog (newCons,prStr, (Ptr)this)) {
+        return;
+    }
+
+    stashCustomCommand = newCons;
+
+    _HYDataPanel*parent = (_HYDataPanel*)RetrieveParentDataPanel ();
+
+    _String * undoSnapshot = nil;
+
+    if (parent) {
+        undoSnapshot = parent->LFSnapshot();
+    }
+
+    _ExecutionList  ex      (newCons);
+    ex.Execute              ();
+    _HYTable*               table = (_HYTable*)    GetCellObject (HY_PARAMETER_TABLE_TABLE_ROW,0);
+    ToggleConstrainedView(HY_PARAMETER_TABLE_VIEW_CONSTRAINED);
+
+    if (lfID>=0) {
+        //_LikelihoodFunction* lf = (_LikelihoodFunction*)likeFuncList (lfID);
+        //lf->RescanAllVariables();
+        VerifyGlobalVariables();
+    }
+
+    avViewOptions = GetViewOptions();
+
+    if (avViewOptions&HY_PARAMETER_TABLE_VIEW_GLOBAL) {
+        viewOptions |= HY_PARAMETER_TABLE_VIEW_GLOBAL;
+    }
+    if (avViewOptions&HY_PARAMETER_TABLE_VIEW_CATEGORY) {
+        viewOptions |= HY_PARAMETER_TABLE_VIEW_CATEGORY;
+    }
+
+    _UpdateViewMenu();
+
+
+
+    ConstructTheTable ();
+    StretchColumnToFit (3);
+    table->_MarkForUpdate   ();
+    if (undoSnapshot) {
+        _UpdateUndoMenu (undoSnapshot, &undoCustomConstraints);
+        DeleteObject (undoSnapshot);
+    } else {
+        undoCommands.Clear();
+        undoDescriptions.Clear();
+        _UpdateUndoMenu (nil,nil);
+    }
+}
+
+
+//__________________________________________________________
+
+void    _HYParameterTable::DoSave (void)
+{
+
+    _HYTable*       table = (_HYTable*)    GetCellObject (HY_PARAMETER_TABLE_TABLE_ROW,0),
+                    *       head  = (_HYTable*)    GetCellObject (HY_PARAMETER_TABLE_TABLE_ROW-1,0);
+
+    _SimpleList columns,
+                sel,
+                rows;
+    columns << 1;
+    columns << 2;
+    columns << 3;
+    table->GetSelection (sel);
+
+    char    resp = 3;
+    if (sel.lLength) {
+        _String pr ("Would you like to save only the selected cells? (Click \"No\" to save the entire table).");
+        resp = YesNoCancelPrompt (pr);
+    }
+
+    if (resp == 1)
+        for (long k = 0; k < sel.lLength; k+=4) {
+            rows << sel.lData[k]/4;
+        }
+    else if (resp == 3)
+        for (long k = 0; k < table->verticalSpaces.lLength; k++) {
+            rows << k;
+        }
+    else {
+        return;
+    }
+
+    _List           menuOptions;
+    _String         menuChoice,
+                    filePath,
+                    str1 ("Save table as"),
+                    str2;
+
+    _HYTable::GetTableFormats(menuOptions);
+
+    str2 = *(_String*)likeFuncNamesList (lfID) & " Parameter Table";
+
+    long menuSel = SaveFileWithPopUp (filePath, str1 ,str2 , empty, menuOptions);
+
+    if (menuSel>=0) {
+        FILE*   outFile = doFileOpen (filePath.sData,"w");
+        if (!outFile) {
+            menuChoice = filePath & " could not be opened for writing.";
+            ProblemReport (menuChoice,(Ptr)this);
+            return;
+        }
+        table->SaveTable (head,nil, menuSel,outFile,GetTitle(),columns, rows);
+        fclose (outFile);
+    }
+}
+//__________________________________________________________
+void    _HYParameterTable::HandleCategories(void)
+{
+    if (lfID>=0) {
+        _LikelihoodFunction* lf = (_LikelihoodFunction*)likeFuncList  (lfID);
+        _SimpleList* cv         = &lf->GetCategoryVars ();
+        _SimpleList allParts (lf->CountObjects(0),0,1);
+        _Matrix*    marginals   = lf->ConstructCategoryMatrix (allParts, _hyphyLFConstructCategoryMatrixConditionals, true);
+        if (cv->lLength) {
+            _String     windowTitle = _String ("Category Display for ") & *(_String*)likeFuncNamesList (lfID),
+                        tryMe (windowTitle);
+
+            long  k = 2;
+            while (FindWindowByName (tryMe)>=0) {
+                tryMe = windowTitle & '_' & k++;
+            }
+
+            _List       colHeaders;
+            for (k=1; k<=marginals->GetHDim(); k++) {
+                windowTitle = _String ("Class ") & k;
+                colHeaders && & windowTitle;
+            }
+            _List       varInfo;
+
+            for (long vv = 0; vv < cv->lLength; vv++) {
+                _List   anEntry;
+                _CategoryVariable * cvar = (_CategoryVariable*) LocateVar (cv->lData[vv]);
+                anEntry << cvar->GetName   ();
+                anEntry << cvar->GetWeights();
+                anEntry << cvar->GetValues ();
+                varInfo && & anEntry;
+            }
+
+            marginals->Transpose();
+            _HYDistributionChartWindow* dcw = new _HYDistributionChartWindow (tryMe,colHeaders,*marginals,varInfo,nil);
+            checkPointer (dcw);
+            dcw->BringToFront();
+        } else {
+            //_String status = _String ("Likelihood Function ") & *(_String*)likeFuncNamesList (lfID) & " does not include any category variables. Opening a list of site-by-site log-likelihoods.";
+            //ProblemReport (status, (Ptr)this);
+
+            _String     windowTitle = _String ("Site-by-site likelihoods for ") & *(_String*)likeFuncNamesList (lfID),
+                        tryMe (windowTitle);
+
+            long  k = 2;
+            while (FindWindowByName (tryMe)>=0) {
+                tryMe = windowTitle & '_' & k++;
+            }
+
+            _SimpleList allParts (lf->CountObjects(0),0,1);
+            _Matrix*    marginals           = lf->ConstructCategoryMatrix (allParts, _hyphyLFConstructCategoryMatrixSiteProbabilities, true);
+            _List       colHeaders;
+            colHeaders.AppendNewInstance (new _String ("Log-likelihood"));
+
+            marginals->Transpose();
+            _HYChartWindow* ncw = (_HYChartWindow*)checkPointer(new _HYChartWindow (tryMe,colHeaders,*marginals));
+            ncw->BringToFront();
+        }
+        DeleteObject (marginals);
+    }
+}
+//__________________________________________________________
+void    _HYParameterTable::HandleProfilePlot (void)
+{
+    if (lfID>=0) {
+        _LikelihoodFunction* lf = (_LikelihoodFunction*)likeFuncList  (lfID);
+        _HYTable*       table   = (_HYTable*)           GetCellObject (HY_PARAMETER_TABLE_TABLE_ROW,0);
+
+        // first build the list of independent parameters from the
+        // likelihood function and sort it
+
+        _SimpleList     rows;
+
+        table->GetRowSelection (rows);
+
+        if (rows.lLength == 1) {
+            long  f = LocateVarByName (*(_String*)table->GetCellData(1,rows.lData[0]));
+
+            if (f>=0) {
+#ifndef USE_AVL_NAMES
+                f = variableReindex.lData[f];
+#else
+                f = variableNames.GetXtra (f);
+#endif
+
+                _Variable* varObj  = LocateVar (f);
+                _String*   varName = varObj->GetName();
+
+                f = lf->GetIndependentVars().Find(f);
+
+                if (f>=0) {
+                    long       stepCount  = 10;
+                    bool       computeNormalApproximation = true;
+
+                    _Parameter MLE        = lf->GetIthIndependent (f),
+                               leftBound  = varObj->GetLowerBound(),
+                               rightBound = varObj->GetUpperBound(),
+                               h          = (1.e-7)*MLE,
+                               step,
+                               MLEVal,
+                               sigma     = 1.;
+
+                    if (!HandlePLDialog (leftBound,rightBound,stepCount,computeNormalApproximation,MLE,(Ptr)this)) {
+                        return;
+                    }
+
+
+                    if (h<1e-7) {
+                        h = 1e-7;
+                    }
+
+                    step      = (rightBound-leftBound)/(stepCount-1);
+                    lf->PrepareToCompute();
+                    MLEVal    = lf->Compute();
+
+                    if (computeNormalApproximation) {
+                        lf->SetIthIndependent (f,MLE+h);
+                        sigma = lf->Compute () - (MLEVal + MLEVal);
+                        lf->SetIthIndependent (f,MLE-h);
+                        sigma = (sigma+lf->Compute())/(h*h);
+                    }
+
+                    h = leftBound;
+
+                    _Matrix      profilePlot (stepCount+1,2, false, true);
+
+                    profilePlot.Store (0,0,h);
+                    lf->SetIthIndependent (f,h);
+                    profilePlot.Store (0,1,lf->Compute()-MLEVal);
+
+                    for (long k = 1; k <= stepCount; k++) {
+                        h += step;
+                        if ((h>MLE)&&(h-step<MLE)) {
+                            profilePlot.Store (k,0,MLE);
+                            profilePlot.Store (k++,1,0);
+
+                        }
+                        lf->SetIthIndependent (f,h);
+                        profilePlot.Store (k,0,h);
+                        profilePlot.Store (k,1,lf->Compute()-MLEVal);
+                    }
+
+                    _List        labels;
+                    _String reportName = *varName;
+                    labels && & reportName;
+                    reportName = "Log[L]";
+                    labels && & reportName;
+
+                    reportName = _String ("Likelihood Profile Plot for ") &
+                                 *varName &" in " & *(_String*)likeFuncNamesList (lfID);
+
+                    _HYChartWindow *reportChart = (_HYChartWindow*) FindWindowByNameAndOpen (reportName);
+                    if (reportChart) {
+                        reportChart->SetTable(labels, profilePlot);
+                    } else {
+                        reportChart = new _HYChartWindow (reportName, labels, profilePlot, nil);
+                    }
+
+                    reportChart->SetChartType("Line Plot",*varName,"Log[L]", false);
+                    if (computeNormalApproximation) {
+                        reportName = _String("0.5*(")&sigma&")*(_x_-"&MLE&")^2";
+                    } else {
+                        reportName = empty;
+                    }
+
+                    reportChart->SetLabels   (*varName,empty,"L_Max-L",HY_CHART_LEGEND_NONE,reportName,-1,-1,-1);
+
+                    lf->SetIthIndependent (f,MLE);
+                    lf->DoneComputing();
+
+                    reportChart->BringToFront();
+                    return;
+                }
+            }
+        }
+
+        _String             errStr   ("Profile Plot needs exactly one selected independent parameter.");
+        ProblemReport       (errStr, (Ptr)this);
+
+    }
+}
+
+long        _hypt_lastSelectParamChoice   = 0;
+bool        _hypt_lastSelectParamChoiceCS = false;
+_String     _hypt_lastSelectParamChoicePT;
+
+//__________________________________________________________
+void    _HYParameterTable::HandleSelectParameters (void)
+{
+
+    _String prompt  ("Select Parameters Matching RegExp:"),
+            cprompt ("Case Sensitive"),
+            lEntry;
+
+    _List   choices;
+
+    lEntry = "Parameter Name";
+    choices && & lEntry;
+    lEntry = "Parameter Value";
+    choices && & lEntry;
+    lEntry = "Parameter Constraint";
+    choices && & lEntry;
+
+    long    msel;
+
+    if (!EnterStringDialogWithPulldown (_hypt_lastSelectParamChoicePT,prompt,cprompt,msel,choices,nil,_hypt_lastSelectParamChoiceCS,_hypt_lastSelectParamChoice,(Ptr)this)) {
+        return;
+    }
+
+    _HYTable*       table   = (_HYTable*)           GetCellObject (HY_PARAMETER_TABLE_TABLE_ROW,0);
+    _SimpleList     newRowSelection;
+    _List           stringsToMatch;
+
+    msel++; // row here
+
+    for (long k=0; k<table->verticalSpaces.lLength; k++) {
+        stringsToMatch << table->GetCellData (msel,k);
+    }
+
+    int errCode;
+    Ptr rxp = PrepRegExp (&_hypt_lastSelectParamChoicePT, errCode,_hypt_lastSelectParamChoiceCS);
+    if (!rxp) {
+        lEntry = GetRegExpError (errCode);
+        ProblemReport (lEntry);
+        return;
+    }
+
+    for (long k=0; k<stringsToMatch.lLength; k++) {
+        _SimpleList matchedPairs;
+        ((_String*)stringsToMatch(k))->RegExpMatch (rxp,matchedPairs);
+        if (matchedPairs.lLength) {
+            newRowSelection << k;
+        }
+    }
+    table->SetRowSelection (newRowSelection);
+    FlushRegExp (rxp);
+
+}
+
+//__________________________________________________________
+void    _HYParameterTable::HandleOpenInChart (void)
+{
+    _String      aString ("Value");
+
+    _HYTable*       table = (_HYTable*)  GetCellObject (HY_PARAMETER_TABLE_TABLE_ROW,0);
+    _SimpleList     rowSel;
+    table->GetRowSelection (rowSel);
+
+    if (rowSel.lLength == 0) {
+        aString = "No parameters have been selected";
+        ProblemReport (aString,(Ptr)this);
+        return;
+    }
+
+    _List        colHeaders;
+    _Matrix      res (rowSel.lLength, 1, false, true);
+    _String      parmNames (128L,true);
+    parmNames << "Name";
+
+    colHeaders && & aString;
+    for (long k=0; k<rowSel.lLength; k++) {
+        res.theData[k] = ((_String*)table->GetCellData (2,rowSel.lData[k]))->toNum();
+        parmNames << ';';
+        parmNames << (_String*)table->GetCellData (1,rowSel.lData[k]);
+    }
+
+    parmNames.Finalize();
+    colHeaders && & parmNames;
+
+    aString = _String("Selected Parameter Values for ") &
+              *(_String*) (likeFuncNamesList.lData[lfID]);
+
+    long f = FindWindowByName (aString);
+    _HYChartWindow * nc;
+    if (f>=0) {
+        nc = (_HYChartWindow*)windowObjectRefs (f);
+        nc->SetTable (colHeaders,res);
+    } else {
+        nc = new _HYChartWindow (aString, colHeaders, res, nil);
+        checkPointer (nc);
+    }
+    nc->SetChartType ("Bar Chart","Index","Value", true);
+    nc->BringToFront();
+}
+
+//__________________________________________________________
+void    _HYParameterTable::HandleVarianceEstimates (void)
+{
+    if (lfID>=0) {
+        char        options;
+        _Parameter  cLevel,
+                    cLevelR;
+
+        _LikelihoodFunction* lf = (_LikelihoodFunction*)likeFuncList(lfID);
+        _HYTable*       table = (_HYTable*)  GetCellObject (HY_PARAMETER_TABLE_TABLE_ROW,0);
+
+        // first build the list of independent parameters from the
+        // likelihood function and sort it
+
+        _List           independents;
+        _SimpleList     indIndices,
+                        * lfVars = &lf->GetIndependentVars(),
+                          filteredList,
+                          rows;
+
+        _String         errStr ("Please select some independent variables to work with.");
+
+        table->GetRowSelection (rows);
+
+        if (rows.lLength == 0) {
+            ProblemReport (errStr,(Ptr)this);
+            return;
+        }
+
+        for (long k=0; k<lfVars->lLength; k++) {
+            independents << LocateVar(lfVars->lData[k])->GetName();
+            indIndices   << k;
+        }
+
+        SortLists (&independents, &indIndices);
+
+        for (long k2=0; k2<rows.lLength; k2++) {
+            long    f = independents.BinaryFind (table->GetCellData(1,rows.lData[k2]));
+            if (f>=0) {
+                filteredList << indIndices.lData[f];
+            }
+        }
+
+        if (filteredList.lLength == 0) {
+            ProblemReport (errStr, (Ptr)this);
+            return;
+        }
+
+        if (HandleCIDialog (options, cLevel, cLevelR, (Ptr)this)) {
+            if (options < 6) {
+                _Matrix   * ci    = nil,
+                            * covMx = nil;
+
+                _String reportName,
+                        rowLabels (128L, true);
+
+                if (options<2) {
+                    stashParameter (covariancePrecision, 1.+options,true);
+                } else if (options == 3) {
+                    stashParameter (covariancePrecision, cLevel,true);
+                } else {
+                    stashParameter (covariancePrecision, -cLevel,true);
+                }
+
+
+                covMx = (_Matrix*)lf->CovarianceMatrix (&filteredList);
+
+                independents.Clear();
+
+                for (long k2=0; k2<filteredList.lLength; k2++) {
+                    independents << LocateVar(lfVars->lData[filteredList.lData[k2]])->GetName();
+                }
+
+
+                rowLabels << "Parameter";
+
+                for (long k=0; k<independents.lLength; k++) {
+                    rowLabels << ';';
+                    rowLabels << (_String*)independents(k);
+                }
+
+                rowLabels.Finalize();
+                independents && & rowLabels;
+
+                if (options < 2) {
+                    reportName = _String ("Covariance Matrix For ") & *(_String*)likeFuncNamesList(lfID);
+
+                    _HYChartWindow * reportChart = (_HYChartWindow*) FindWindowByNameAndOpen (reportName);
+                    if (reportChart) {
+                        reportChart->SetTable(independents, *covMx);
+                    } else {
+                        reportChart = new _HYChartWindow (reportName, independents, *covMx, nil);
+                    }
+
+                    reportChart->BringToFront();
+                }
+
+                independents.Clear();
+                reportName = "Left Bound";
+                independents && & reportName;
+                reportName = "MLE";
+                independents && & reportName;
+                reportName = "Right Bound";
+                independents && & reportName;
+                independents && & rowLabels;
+
+
+                if (options<2) {
+                    reportName = _String ("Asymptotic Normal 95% CI For ") & *(_String*)likeFuncNamesList(lfID);
+                    ci = new _Matrix (covMx->GetHDim(),3,false,true);
+                    checkPointer (ci);
+
+                    for (long k=0; k<filteredList.lLength; k++) {
+                        _Variable* aParam = LocateVar(lfVars->lData[filteredList.lData[k]]);
+                        _Parameter val = aParam->Value(),
+                                   lb  = aParam->GetLowerBound(),
+                                   ub  = aParam->GetUpperBound(),
+                                   size= 1.96*sqrt ((*covMx)(k,k));
+
+                        ci->Store (k,0,val-lb>size?val-size:lb);
+                        ci->Store (k,1,val);
+                        ci->Store (k,2,ub-val>size?val+size:ub);
+                    }
+                } else {
+                    if (options == 3) {
+                        reportName = _String ("Likelihood Profile CI For ") & *(_String*)likeFuncNamesList(lfID) & " [chi2 level " & cLevel & ']';
+                    } else {
+                        reportName = _String ("Likelihood Profile CI For ") & *(_String*)likeFuncNamesList(lfID) & " [support  " & cLevel & ']';
+                    }
+
+                    ci = covMx;
+                }
+
+                _HYChartWindow *reportChart = (_HYChartWindow*) FindWindowByNameAndOpen (reportName);
+                if (reportChart) {
+                    reportChart->SetTable(independents, *ci);
+                } else {
+                    reportChart = new _HYChartWindow (reportName, independents, *ci, nil);
+                }
+
+                reportChart->SetChartType("Line Plot","Index","Left Bound;MLE;Right Bound", false);
+                reportChart->SetLabels   ("Parameter Index",empty,"Values",HY_CHART_LEGEND_TOP_RIGHT,empty,-1,-1,-1);
+                reportChart->BringToFront();
+
+                stashParameter (covariancePrecision, 0,false);
+                if (ci!=covMx) {
+                    DeleteObject (ci);
+                }
+
+                if (covMx) {
+                    DeleteObject (covMx);
+                }
+            } else {
+                /* try to read the plug-in - should be in ChartAddIns/SIR/sampler.bf */
+                errStr = libDirectory & "ChartAddIns" & GetPlatformDirectoryChar() &"Samplers" & GetPlatformDirectoryChar() & (options==6?"sir.bf":"lhc.bf");
+
+                FILE *    procFile = doFileOpen (errStr.sData,"rb");
+                if (!procFile) {
+                    errStr = "Your distribution is missing the $HYPHY/ChartAddIns/SIR/sampler.bf file needed for this function";
+                    ProblemReport (errStr, (Ptr)this);
+                } else {
+                    _String   procCode (procFile),
+                              prefix   (128L, true);
+
+                    fclose (procFile);
+
+                    prefix << "SAMPLE_N = ";
+                    prefix << _String(cLevel);
+                    prefix << ";\nSAMPLE_M = ";
+                    prefix << _String(cLevelR);
+                    prefix << ";\nLF_NAME = \"";
+                    prefix << (_String*)likeFuncNamesList (lfID);
+                    prefix << "\";\n";
+                    prefix << covarianceParameterList;
+                    prefix << " = {};\n";
+
+                    for (long k2=0; k2<filteredList.lLength; k2++) {
+                        prefix << covarianceParameterList;
+                        prefix << "[\"";
+                        prefix << LocateVar(lfVars->lData[filteredList.lData[k2]])->GetName();
+                        prefix << "\"]=1;\n";
+                    }
+
+                    prefix.Finalize();
+                    procCode = prefix & procCode;
+
+                    PushFilePath (errStr);
+                    _ExecutionList sir (procCode);
+                    PopFilePath ();
+                    sir.Execute();
+                }
+            }
+
+
+        }
+    }
+}
+
+//__________________________________________________________
+
+void    _HYParameterTable::DoOpenTreeWindow (void)
+{
+    _HYTable*       table = (_HYTable*)    GetCellObject (HY_PARAMETER_TABLE_TABLE_ROW,0);
+    _HYButtonBar*   bb    = (_HYButtonBar*)GetCellObject (HY_PARAMETER_TABLE_BUTTON_ROW,0);
+    _SimpleList     rows;
+    _String         nodeName,
+                    *cellName;
+    _List           selectNodes;
+    long            k,
+                    f;
+    long            treeVar = 0;
+
+    table->GetRowSelection (rows);
+
+    bb->_UnpushButton();
+    for (k=0; k<rows.lLength; k++) {
+        cellName = (_String*)table->GetCellData (1,rows.lData[k]);
+        f = cellName->FindBackwards ('.',0,-1);
+        if (f>=0) {
+            nodeName = cellName->Cut (0,f-1);
+            f = selectNodes.BinaryInsert (&nodeName);
+        } else if (((_Variable*)RetrieveIthRowVar(rows.lData[k]))->ObjectClass()==TREE) {
+            treeVar = k+1;
+        }
+    }
+
+    _String treeTitle;
+    if (selectNodes.lLength||treeVar) {
+        if (selectNodes.lLength) {
+            cellName = (_String*)selectNodes(0);
+            f = cellName->Find ('.');
+            if (f>=0) {
+                nodeName = cellName->Cut (0,f-1);
+            }
+        } else {
+            if (!treeVar) {
+                return;
+            }
+            nodeName = *((_Variable*)RetrieveIthRowVar(rows.lData[treeVar-1]))->GetName();
+        }
+        treeTitle = _String ("Tree ") & nodeName;
+    } else {
+        return;
+    }
+
+    _HYTreePanel* thisPanel = (_HYTreePanel*)FindWindowByNameAndOpen (treeTitle);
+    if (!thisPanel) {
+        thisPanel = new _HYTreePanel (nodeName,nodeName);
+        checkPointer (thisPanel);
+        thisPanel->_Zoom (true);
+        thisPanel->BringToFront();
+    } else {
+        if (selectNodes.lLength == 0) {
+            _String prompt ("A window for this tree has already been opened. Spawn another instance of this tree plot?");
+            if (ProceedPrompt (prompt,(Ptr)thisPanel)) {
+                thisPanel = new _HYTreePanel (nodeName,nodeName);
+                checkPointer (thisPanel);
+                thisPanel->_Zoom (true);
+                thisPanel->BringToFront();
+            } else {
+                return;
+            }
+        }
+    }
+    thisPanel->SelectRangeAndScroll (selectNodes);
+}
+
+//__________________________________________________________
+
+void    _HYParameterTable::OpenCategoryPlotWindow (_CategoryVariable* thisCV)
+{
+    _String windowTitle;
+    windowTitle = _String ("Density Plot for ")&*thisCV->GetName();
+    if (!FindWindowByNameAndOpen (windowTitle)) {
+        long            width  = 500,
+                        height = 400,
+                        i = thisCV->GetNumberOfIntervals(),
+                        leftMargin = 10;
+
+        _Matrix*        intervalEnds = thisCV->GetIntervalEnds();
+        _HYColor        boxColor = {255,255,255};
+        _HYRect         set;
+
+        _Parameter      xMin = thisCV->GetMinX(),
+                        xMax = thisCV->GetMaxX(),
+                        xTick,
+                        step,
+                        vstep;
+
+        char            buffer[255];
+
+        if (xMax>1e10) {
+            xMax = thisCV->GetIntervalValue(i-1)*1.5;
+        }
+        if (xMin<1e-25) {
+            xMin = 0;
+        }
+
+        step = (xMax-xMin)/(width-20);
+
+        _Parameter      *valueArray = new _Parameter [width-20],
+        max = 0.0,
+        tracer = xMin+step,
+        x,
+        y = 0,
+        z = 0;
+        long            counter,
+                        tW = 0,
+                        tH = 0;
+
+        checkPointer    (valueArray);
+
+        for (counter = 1; counter < width-20; counter++) {
+            _Constant c (tracer);
+            _x_->SetValue (&c);
+            valueArray[counter] = thisCV->GetDensity().Compute()->Value();
+            if (valueArray[counter]>max) {
+                max = valueArray[counter];
+            }
+            tracer+=step;
+        }
+
+        vstep = (height-20)/max;
+
+        _HYFont         labelFont;
+        labelFont.face  = "Times";
+        labelFont.size  = 10;
+        labelFont.style = HY_FONT_PLAIN;
+
+        _List           classLabels,
+                        cellPlacement;
+
+        set.top         = 0;
+        cellPlacement.AppendNewInstance (new _String ("Class"));
+        cellPlacement.AppendNewInstance (new _String ("Rate"));
+        classLabels     && & cellPlacement;
+
+        cellPlacement.Clear();
+
+        for (counter = 0; counter < i; counter++) {
+            _List       *thisRow = new _List;
+            checkPointer (thisRow);
+
+            x = thisCV->GetIntervalValue(counter);
+            snprintf (buffer, sizeof(buffer),"%.6g",x);
+
+            thisRow->AppendNewInstance(new _String (counter));
+            thisRow->AppendNewInstance(new _String (buffer));
+
+            tracer = thisCV->GetIntervalWeight(counter);
+            y += x*tracer;
+            z += x*x*tracer;
+
+            classLabels << thisRow;
+        }
+
+        _HYRect     margins = {3,3,3,3,1};
+
+        tW = ComputeTableCellPlacement (classLabels, cellPlacement, margins, labelFont);
+
+        /*snprintf (buffer, sizeof(buffer),"E[X] = %8g",y);
+        set.left = GetVisibleStringWidth (*((_String*)classLabels (counter)),labelFont);
+        if (set.left > set.top)
+            set.top = set.left;
+        classLabels.InsertElement (new _String (buffer),0,false);
+        snprintf (buffer, sizeof(buffer),"Var[X] = %8g",z-y*y);
+        set.left = GetVisibleStringWidth (*((_String*)classLabels (counter)),labelFont);
+        if (set.left > set.top)
+            set.top = set.left;
+        classLabels.InsertElement (new _String (buffer),1,false);*/
+
+        tH = (i+3)*(labelFont.size+6)+10;
+
+        for (counter = width-21; counter>=1; counter--)
+            if (height-15-valueArray[counter]*vstep<tH) {
+                break;
+            }
+
+        counter = width-20-counter;
+        if (counter>tW) {
+            counter = tW;
+        }
+
+
+        set.right  = set.left = leftMargin;
+        set.top    = 10;
+        set.bottom = height - 15;
+        set.width = 2;
+
+        _SimpleList     tickInfo;
+        _List           labelInfo;
+
+        set.width = ComputeHashMarkPlacement (set,max/1e50,max,xTick,tracer,tickInfo,labelInfo,0,labelFont);
+        if (set.width+2>10) {
+            leftMargin = set.width+2;
+        }
+
+        _HYPWindow*     graph = new _HYPWindow(windowTitle,height,width+tW-counter+leftMargin-10,32,false);
+
+        graph->StartDraw();
+        graph->_HYGraphicPane::SetFont  (labelFont);
+        set.left = 0;
+        set.top = 0;
+        set.bottom = height;
+        set.right = width;
+        graph->SetColor (boxColor);
+        graph->FillRect (set);
+
+        set.bottom = height-17;
+        set.width  = 1;
+        graph->SetColor ((_HYColor) {
+            0,0,0
+        });
+
+        for (counter = 0; counter < i-1; counter++) {
+            set.left = set.right = leftMargin+2+(intervalEnds->theData[counter]-xMin)/step;
+            set.top = height-15-valueArray[set.left-leftMargin-1]*vstep;
+            graph->DrawHatchedLine (set);
+        }
+
+        set.top = height - 17;
+        set.bottom = height - 13;
+        boxColor.R = boxColor.B = 0;
+        boxColor.G = 100;
+        graph->SetColor (boxColor);
+        set.width  = 2;
+
+        for (counter = 0; counter < i; counter++) {
+            set.left = set.right = leftMargin+2+(thisCV->GetIntervalValue(counter)-xMin)/step;
+            set.top = height-15-valueArray[set.left-leftMargin-1]*vstep;
+            graph->DrawLine (set);
+        }
+
+        set.left = leftMargin+2;
+        set.top = height-15-valueArray[1]*vstep;
+        set.width = 2;
+
+        boxColor.B = 50;
+        boxColor.G = 50;
+        boxColor.R = 255;
+        graph->SetColor (boxColor);
+
+        set.right = leftMargin+2;
+
+        for (counter = 2; counter < width-21; counter++) {
+            set.right++;
+            set.bottom = height-15-valueArray[counter]*vstep;
+            //if ((abs(set.top-set.bottom)>4)||(counter==width-22))
+            {
+                graph->DrawLine (set);
+                set.left = set.right;
+                set.top = set.bottom;
+            }
+        }
+        set.right++;
+        set.bottom = height-15-valueArray[counter]*vstep;
+        graph->DrawLine (set);
+
+        delete       valueArray;
+
+        /*set.top = 20;
+        set.left = graph->w-5-lW;
+
+
+        for (counter = 0; counter < i; counter++)
+        {
+            graph->DisplayText (*(_String*)classLabels(counter),set.top, set.left,true);
+            set.top += labelFont.size*1.3;
+        }*/
+        set.right  = tW;
+        set.bottom = tH-10-2*(labelFont.size+6);
+        set.left   = graph->w-5-tW;
+        set.top    = 5;
+
+        graph->SetColor ((_HYColor) {
+            0,0,0
+        });
+        graph->DrawTable (classLabels,cellPlacement,HY_ALIGN_LEFT, margins,set);
+        snprintf (buffer, sizeof(buffer),"E[X]   = %8.3g", y);
+        set.top += set.bottom+3+labelFont.size;
+        graph->DisplayText (buffer,set.top,set.left+margins.left, true);
+        snprintf (buffer, sizeof(buffer),"Var[X] = %8.3g", z-y*y);
+        graph->DisplayText (buffer,set.top+6+labelFont.size,set.left+margins.left, true);
+        set.right  = set.left = leftMargin;
+        set.top    = 10;
+        set.bottom = height - 15;
+        set.width  = 2;
+
+        graph->DrawHashes (set, tickInfo, labelInfo, 5, 1);
+        graph->DrawLine   (set);
+
+        set.right = width - 10;
+        set.top = set.bottom;
+
+        ComputeHashMarkPlacement (set,xMin,xMax,xTick,tracer,tickInfo,labelInfo,2,labelFont);
+        graph->DrawHashes        (set, tickInfo, labelInfo, 5, 1);
+        graph->DrawLine (set);
+        graph->EndDraw();
+        graph->SetWindowRectangle (0,0,height,graph->w);
+        graph->BringToFront();
+    }
+}
+
+//__________________________________________________________
+
+void    _HYParameterTable::OptimizeLikelihoodFunction (void)
+{
+    if ((lfID>=0)&&(!isInOptimize)) {
+        terminateExecution = false;
+        _LikelihoodFunction *lf = (_LikelihoodFunction*)likeFuncList (lfID);
+        _Matrix * res;
+        if (lf->GetIndependentVars().lLength<10) {
+            _Parameter prec,
+                       usePrev;
+            checkParameter (optimizationPrecision,prec,0.001);
+            if (prec>0.001) {
+                stashParameter (optimizationPrecision,0.001,true);
+            }
+
+            checkParameter (useLastResults,usePrev,0.0);
+            if (CheckEqual(usePrev,0.0)) {
+                setParameter (useLastResults, 1.0);
+            }
+
+            ToggleAnalysisMenu (true);
+            StartBarTimer ();
+            res = lf->Optimize();
+            StopBarTimer  ();
+            ToggleAnalysisMenu (false);
+            terminateExecution = false;
+            if (prec>0.001) {
+                stashParameter (optimizationPrecision,0.001,false);
+            }
+
+            setParameter (useLastResults, usePrev);
+        } else {
+            ToggleAnalysisMenu (true);
+            StartBarTimer ();
+            res = lf->Optimize();
+            StopBarTimer  ();
+            ToggleAnalysisMenu (false);
+            terminateExecution = false;
+        }
+
+        DeleteObject (res);
+        _HYTable*table = (_HYTable*)GetCellObject(HY_PARAMETER_TABLE_TABLE_ROW,0);
+        for (long k=1; k<table->verticalSpaces.lLength; k++) {
+            UpdateKthRow (k,false);
+        }
+        UpdateLogLikelihood ();
+        StretchColumnToFit (2);
+
+        ReportAnalysisAsFinished (empty);
+    }
+}
+
+//__________________________________________________________
+
+void    _HYParameterTable::StretchColumnToFit (long index)
+{
+    _HYTable*table = (_HYTable*)GetCellObject(HY_PARAMETER_TABLE_TABLE_ROW,0);
+    _HYTable*table2= (_HYTable*)GetCellObject(HY_PARAMETER_TABLE_TABLE_ROW-1,0);
+    table->AutoFitColumn (index,true,true);
+    if (index<3) {
+        table2->SetColumnSpacing(index,table->GetColumnSpacing(index)-table2->GetColumnSpacing(index),true);
+    } else {
+        table2->SetColumnSpacing(index,table->GetColumnSpacing(index)+HY_SCROLLER_WIDTH-table2->GetColumnSpacing(index),true);
+    }
+    for (; index<4; index++) {
+        table->_MarkColumnForUpdate (index);
+        table2->_MarkColumnForUpdate (index);
+    }
+    table->SetVisibleSize(table->rel);
+#ifdef __HYPHY_GTK__
+    UpdateComponentInfo ();
+#else
+    dim = MinMaxWindowDimensions();
+#endif
+}
+
+//__________________________________________________________
+
+void    _HYParameterTable::UndoCommand (void)
+{
+    long k;
+    if ((k = undoCommands.lLength)) {
+        k--;
+        TakeLFSnapshot();
+        _ExecutionList ex (*(_String*)undoCommands(k));
+        ex.Execute();
+        terminateExecution = false;
+        undoCommands.Delete(k);
+        undoDescriptions.Delete (k);
+        _HYTable*table = (_HYTable*)GetCellObject(HY_PARAMETER_TABLE_TABLE_ROW,0);
+        VerifyGlobalVariables();
+        RefreshTheTable();
+        table->_MarkContentsForUpdate();
+        ToggleConstrainedView ();
+        ToggleConstrainedView (HY_PARAMETER_TABLE_VIEW_GLOBAL);
+        StretchColumnToFit (3);
+        UpdateSelectionDependentButtons ();
+        DoneLFSnapshot();
+    }
+}
+
+//__________________________________________________________
+
+_HYGuiObject*   _HYParameterTable::RetrieveParentDataPanel (void)
+{
+
+    for (long i=0; i<windowObjects.lLength; i++) {
+        _HYWindow* thisWindow = (_HYWindow*)windowObjectRefs(i);
+        if (thisWindow->WindowKind () == HY_WINDOW_KIND_DATAPANEL)
+            if (((_HYDataPanel*)thisWindow)->GetLFID() == lfID) {
+                return (_HYGuiObject*)windowObjectRefs.lData[i];
+            }
+    }
+    return nil;
+}
+
+//__________________________________________________________
+// HYBootstrapWindow
+//__________________________________________________________
+
+
+_String     gbGoTooltip     ("Start Bootstrapping"),
+            gbStopTooltip    ("Stop  Bootstrapping");
+
+_HYBootstrapWindow::_HYBootstrapWindow (_String name, _Parameter nLRT):_HYTWindow (name, true)
+{
+
+    done            = false;
+    requestQuit     = false;
+
+    nullLRT         = nLRT;
+    iterateCount    = 0;
+    iterateCountP   = 0;
+
+    _HYRect         canvasSettings = {25,50,25,50,HY_COMPONENT_BORDER_T};
+
+    _HYButtonBar*   bb      = new _HYButtonBar (canvasSettings, GetOSWindowData());
+
+    canvasSettings.left = canvasSettings.right = 250;
+
+    _HYLabel*       l3      = new _HYLabel (canvasSettings, GetOSWindowData());
+
+    canvasSettings.left = canvasSettings.right = 300;
+    canvasSettings.top  = canvasSettings.bottom = 21;
+    canvasSettings.width = HY_COMPONENT_BORDER_B;
+
+    _HYTable*   table2      = new _HYTable (canvasSettings,GetOSWindowData(),1,2,100,20,HY_TABLE_STATIC_TEXT);
+
+    canvasSettings.top      = 60;
+    canvasSettings.bottom   = 100000;
+    canvasSettings.width    = HY_COMPONENT_V_SCROLL;
+
+    _HYTable*   table       = new _HYTable (canvasSettings,GetOSWindowData(),5,2,100,18,HY_TABLE_STATIC_TEXT);
+
+    table->selectionType = HY_TABLE_SEL_ROWS|HY_TABLE_DONT_SIZE;
+    table->SetColumnSpacing (0,-60,false);
+    table->SetColumnSpacing (1,160,false);
+    table2->selectionType = HY_TABLE_SEL_ROWS|HY_TABLE_DONT_SIZE;
+    table2->SetColumnSpacing (0,-60,false);
+    table2->SetColumnSpacing (1,160,false);
+    _String cellValue ("#");
+    table2->SetCellData (&cellValue,0,0,HY_TABLE_BOLD|HY_TABLE_STATIC_TEXT|HY_TABLE_BEVELED|HY_TABLE_CANTSELECT,true);
+    cellValue = "Simulated LR";
+    table2->SetCellData (&cellValue,0,1,HY_TABLE_STATIC_TEXT|HY_TABLE_BEVELED|HY_TABLE_CANTSELECT|HY_TABLE_BOLD,true);
+
+
+    table->SetMessageRecipient (this);
+    bb->SetMessageRecipient (this);
+
+    AddObject (l3);     // 0
+    AddObject (table);  // 1
+    AddObject (table2); // 2
+    AddObject (bb);     // 3
+
+    SetTableDimensions (3,2);
+    SetCell   (1,0,table2);
+    SetCell   (1,1,table2);
+    SetCell   (2,0,table);
+    SetCell   (2,1,table);
+    SetCell   (0,0,bb);
+    SetCell   (0,1,l3);
+
+    _HYFont  labelFont;
+    bb->SetBackColor (labelBColor);
+    l3->SetBackColor (labelBColor);
+    l3->SetForeColor (labelFColor);
+
+#ifdef __MAC__
+    labelFont.face  = "Geneva";
+    labelFont.size  = 10;
+#endif
+
+#ifdef __WINDOZE__
+    labelFont.face  = "MS Sans Serif";
+    labelFont.size  = 12;
+#endif
+
+#ifdef __HYPHY_GTK__
+    labelFont.face  = _HY_SANS_FONT;
+    labelFont.size  = 12;
+#endif
+
+    labelFont.style = HY_FONT_PLAIN;
+    table->SetFont(labelFont);
+    table2->SetFont(labelFont);
+
+#ifdef __MAC__
+    labelFont.size  = 12;
+#endif
+
+#ifdef __WINDOZE__
+    labelFont.size  = 14;
+#endif
+
+#ifdef __HYPHY_GTK__
+    labelFont.size  = 12;
+#endif
+
+
+    l3->SetFont (labelFont);
+
+    l3->SetText (_String("P-Value: 0"));
+    l3->SetShadow(true);
+    l3->SetAlignFlags (HY_ALIGN_LEFT);
+    bb->SetAlignFlags (HY_ALIGN_LEFT);
+
+    bb->AddButton (ProcureIconResource(HY_PARAMETER_BOOTSTRAP_BUTTON_ICON_BASE),&gbStopTooltip );
+    cellValue = "Show LRT Histogram";
+    bb->AddButton (ProcureIconResource(HY_PARAMETER_BOOTSTRAP_BUTTON_ICON_BASE+1),&cellValue );
+
+    bb->EnableButton(0,true);
+    bb->EnableButton(1,false);
+    bb->MarkAsPullDown (1,true);
+    bb->SetButtonDim(16);
+
+    // set up the table
+
+    _HYRect  screenRect = GetScreenDimensions();
+    SetWindowRectangle (0,0,screenRect.bottom-10,screenRect.right-20);
+    SetPosition (5,40);
+
+    DeleteObject (l3);
+    DeleteObject (bb);
+    DeleteObject (table);
+    DeleteObject (table2);
+
+}
+
+//__________________________________________________________
+
+bool    _HYBootstrapWindow::ProcessEvent (_HYEvent* e)
+{
+    bool eDone = false;
+    _String firstArg;
+    long    i,k,f;
+    if (e->EventClass()==_hyButtonPushEvent) {
+        firstArg = e->EventCode().Cut (0,(f=e->EventCode().Find(','))-1);
+        k = firstArg.toNum();
+        for (i=0; i<components.lLength; i++) {
+            if (((_HYGuiObject*)components(i))->MatchID(k)) {
+                break;
+            }
+        }
+        if (i==3) {
+            firstArg        = e->EventCode().Cut (f+1,-1);
+            k               = firstArg.toNum();
+            _HYButtonBar*   bb = (_HYButtonBar*)GetObject (3);
+            switch  (k) {
+            case 0:
+                requestQuit = true;
+                break;
+
+            case 1: { // set equal
+                int h,v;
+                _List menuOptions;
+
+                firstArg = "Histogram [Default]";
+                menuOptions && & firstArg;
+                firstArg = "Histogram [Custom]";
+                menuOptions && & firstArg;
+                firstArg = "Sample CDF [Default]";
+                menuOptions && & firstArg;
+                firstArg = "Sample CDF [Custom]";
+                menuOptions && & firstArg;
+
+                bb->GetButtonLoc(1,h,v,true);
+                firstArg = HandlePullDown (menuOptions,h,v,0);
+                bb->_UnpushButton();
+
+                v = menuOptions.Find (&firstArg);
+
+                if (v>=0) {
+                    if (v%2 == 0) {
+                        OpenHistogramWindow (v>1,-1);
+                    } else {
+                        firstArg = "Number of bins:";
+                        if (EnterStringDialog (histChartBins, firstArg, (Ptr)this)) {
+                            OpenHistogramWindow (v>1,histChartBins.toNum());
+                        }
+                    }
+                }
+
+                break;
+            }
+
+            }
+            bb->_UnpushButton();
+            eDone = true;
+        }
+    }
+    if (eDone) {
+        DeleteObject (e);
+        return true;
+    }
+    return _HYTWindow::ProcessEvent(e);
+}
+
+
+//__________________________________________________________
+
+void    _HYBootstrapWindow::SetStopped(bool d)
+{
+    if (done!=d) {
+        _HYButtonBar * bb = (_HYButtonBar*)GetObject (3);
+        bb->EnableButton (0,!d);
+        bb->EnableButton (1,d);
+        done = d;
+    }
+}
+
+//__________________________________________________________
+
+bool    _HYBootstrapWindow::ConfirmClose (void)
+{
+    if (!done || requestQuit) {
+        _String m ("This window contains an active bootstrap simulation. Please stop it before closing the window.");
+        ProblemReport (m,(Ptr)this);
+        return false;
+    }
+    return true;
+}
+
+//__________________________________________________________
+
+void    _HYBootstrapWindow::AddIterate (_Parameter lrt)
+{
+    //if (!done)
+    {
+        _HYTable* table  = (_HYTable*)GetObject (1);
+        _HYTable* tableh = (_HYTable*)GetObject (2);
+        _HYLabel* l      = (_HYLabel*)GetObject (0);
+        long      type;
+        if (lrt>nullLRT) {
+            type = HY_TABLE_STATIC_TEXT|HY_TABLE_BOLD;
+            iterateCountP++;
+        } else {
+            type = HY_TABLE_STATIC_TEXT;
+        }
+
+        if (iterateCount == 0) {
+            _String hValue = _String("Simlated LR (test:") & nullLRT & ')';
+            tableh->SetCellData (&hValue,0,1,HY_TABLE_STATIC_TEXT|HY_TABLE_BEVELED|HY_TABLE_CANTSELECT|HY_TABLE_BOLD, true);
+            tableh->_MarkCellForUpdate (1);
+        }
+
+        if (iterateCount>=table->verticalSpaces.lLength) {
+            table->AddRow     (-1,18,type);
+        }
+
+        _String cellValue (iterateCount+1);
+        table->SetCellData(&cellValue,iterateCount,0,type,true);
+        cellValue = lrt;
+        table->SetCellData(&cellValue,iterateCount,1,type,true);
+        table->_MarkCellForUpdate (iterateCount*2);
+        table->_MarkCellForUpdate (iterateCount*2+1);
+        table->ScrollToRow        (iterateCount);
+        iterateCount++;
+        cellValue = _String("P-Value: ")&(iterateCountP/(_Parameter)iterateCount);
+        l->SetText (cellValue);
+        table->SetVisibleSize(table->rel);
+#ifdef __HYPHY_GTK__
+        UpdateComponentInfo ();
+#else
+        dim = MinMaxWindowDimensions();
+#endif
+        handleGUI(true);
+    }
+}
+
+//__________________________________________________________
+
+void    _HYBootstrapWindow::OpenHistogramWindow (bool cdf, long binCount)
+{
+    _String windowTitle;
+    if (cdf) {
+        windowTitle = _String ("CDF: ")& GetTitle();
+    } else {
+        windowTitle = _String ("Histogram: ")& GetTitle();
+    }
+    if (!FindWindowByNameAndOpen (windowTitle)) {
+        _HYTable* table = (_HYTable*)GetObject (1);
+        long    width  = 550,
+                height = 450,
+                k,
+                maxBin = 0;
+
+        _Parameter minValue = nullLRT,
+                   maxValue = nullLRT,
+                   step,
+                   vstep,
+                   sum = 0.,
+                   sum2 = 0.;
+
+        if (binCount < 0) {
+            binCount = iterateCount/5;
+            if (binCount < 5) {
+                binCount = 5;
+            }
+        }
+
+        if (binCount>iterateCount) {
+            binCount = iterateCount;
+        }
+
+        _Matrix values (1,iterateCount,false,true);
+        _Matrix bins   (1,binCount,false,true);
+
+        for (k=0; k<iterateCount; k++) {
+            _Parameter tt = values.theData[k] = ((_String*)table->GetCellData (1,k))->toNum();
+            if (tt < minValue) {
+                minValue = tt;
+            } else if (tt>maxValue) {
+                maxValue = tt;
+            }
+            sum += tt;
+            sum2 += tt*tt;
+        }
+        step = (maxValue-minValue)/binCount;
+        for (k=0; k<iterateCount; k++) {
+            _Parameter tt = values.theData[k];
+            maxBin = (tt-minValue)/step;
+            if (maxBin==binCount) {
+                maxBin--;
+            }
+            bins.theData[maxBin]+=1.;
+        }
+
+        if (cdf) {
+            for (k=1; k< binCount; k++) {
+                bins.theData[k] += bins.theData[k-1];
+            }
+            maxBin = iterateCount;
+        } else {
+            maxBin = 0;
+            for (k=0; k<binCount; k++)
+                if(bins.theData[k]>maxBin) {
+                    maxBin = bins.theData[k];
+                }
+        }
+
+        _HYColor boxColor = {200,200,200},
+                 barColor = {200,50,50},
+                 barColor2= {50,200,50};
+
+        _HYRect  box =  GetScreenDimensions();
+
+        width  = box.right-100;
+        height = box.bottom-100;
+
+        /*if (width>550)
+            width = 550;
+        height = box.bottom-3*HY_SCROLLER_WIDTH;
+        if (height>450)
+            height = 450;*/
+
+        _HYPWindow*    graph = new _HYPWindow(windowTitle,height,width,32,false);
+        _HYFont        graphFont;
+
+        graphFont.face = "Times";
+        graphFont.size = 12;
+        graphFont.style = HY_FONT_PLAIN;
+
+
+        graph->StartDraw();
+        graph->_HYGraphicPane::SetFont  (graphFont);
+
+        box.left = 0;
+        box.top = 0;
+        box.bottom = height;
+        box.right = width;
+        graph->SetColor (boxColor);
+        graph->FillRect (box);
+        box.left = 10;
+        box.right = width - 10;
+        box.top = box.bottom = height - 15;
+        box.width = 2;
+        boxColor.R = boxColor.G = boxColor.B = 0;
+        graph->SetColor (boxColor);
+        graph->DrawLine (box);
+        box.right = box.left;
+        box.top = 15;
+        graph->DrawLine (box);
+
+        //box.width = 1;
+
+        step = (width-20.)/binCount;
+        vstep = (height-30.)/maxBin;
+
+        long mult = 1,
+             nValue = 11 + (nullLRT-minValue)/(maxValue-minValue)* (width-20);
+
+        graph->SetColor (boxColor);
+        graph->DrawRect (box);
+
+        if (maxBin>20) {
+            mult = 10;
+        }
+        if (maxBin>200) {
+            mult = 100;
+        }
+        if (maxBin>2000) {
+            mult = 1000;
+        }
+
+        k = mult;
+        boxColor.R = boxColor.G = boxColor.B = 255;
+        box.left = 11;
+        box.right = width-10;
+
+        graph->SetColor (boxColor);
+        while (k<=maxBin) {
+            box.bottom = height-14-vstep*k;
+            box.top = box.bottom - 1;
+            graph->DrawRect (box);
+            k += mult;
+        }
+
+        boxColor.R = boxColor.G = boxColor.B = 0;
+        box.bottom = height-13;
+        for (k=0; k<binCount; k++) {
+            box.left  = 11+step*k;
+            box.right = box.left+step+2;
+            box.top = box.bottom - vstep*bins.theData[k];
+            if (box.bottom>box.top) {
+                if (box.right < nValue) {
+                    graph->SetColor (barColor2);
+                    graph->FillRect (box);
+                } else {
+                    if (box.left > nValue) {
+                        graph->SetColor (barColor);
+                        graph->FillRect (box);
+                    } else {
+                        box.right = nValue;
+                        graph->SetColor (barColor2);
+                        graph->FillRect (box);
+                        box.left = nValue;
+                        box.right = 13+step*(k+1);
+                        graph->SetColor (barColor);
+                        graph->FillRect (box);
+                        box.left  = 11+step*k;
+                    }
+                }
+                graph->SetColor (boxColor);
+                graph->DrawRect (box);
+            }
+        }
+
+        /*windowTitle = minValue;
+        graph->DisplayText (windowTitle,height-2, 10, true);
+
+        windowTitle = maxValue;
+        graph->DisplayText (windowTitle,height-2, width-GetVisibleStringWidth(windowTitle)-10,true);*/
+
+        _HYRect    lr;
+        lr.top   = lr.bottom = height-15;
+        lr.right = width-10;
+        lr.left  = 10;
+
+        boxColor.R = boxColor.G = boxColor.B = 0;
+        graph->SetColor (boxColor);
+
+        _List       labels;
+        _SimpleList labelInfo;
+
+        ComputeHashMarkPlacement (lr,minValue,maxValue,step,vstep,labelInfo, labels,5,graphFont);
+
+        lr.width = 2;
+
+        graph->DrawHashes (lr,labelInfo,labels,5,1);
+
+        windowTitle = _String (maxBin) & "    P-Value: " & (_Parameter)iterateCountP/iterateCount;
+
+        graph->DisplayText (windowTitle,13,5,true);
+
+        windowTitle = _String ("Mean: ")& sum/iterateCount & (", Variance: ") & (sum2-sum*sum/iterateCount)/(iterateCount-1);
+#ifdef __MAC__
+        graph->DisplayText (windowTitle,13, width-GetVisibleStringWidth(windowTitle)-10,true);
+#else
+        graph->DisplayText (windowTitle,13, width-GetVisibleStringWidth(windowTitle, graphFont)-10,true);
+#endif
+
+        box.left = nValue-1;
+        box.right = nValue+1;
+        box.bottom = height-5;
+        box.top = box.bottom+10;
+        graph->SetColor (barColor2);
+        graph->FillRect (box);
+
+        graph->EndDraw();
+        graph->SetWindowRectangle (0,0,height,width);
+        CenterWindow(graph);
+        graph->BringToFront();
+    }
+}
+
+//__________________________________________________________
+
+void    _HYBootstrapWindow::DoSave (void)
+{
+
+    _HYTable*       table = (_HYTable*)    GetObject (1),
+                    *       head  = (_HYTable*)    GetObject (2);
+
+    _List           menuOptions;
+    _String         menuChoice,
+                    filePath,
+                    str1 ("Save bootstrap results as:"),
+                    str2;
+
+    _HYTable::GetTableFormats(menuOptions);
+
+    str2 = GetTitle();
+
+    long menuSel = SaveFileWithPopUp (filePath, str1 ,str2 , empty, menuOptions);
+
+    if (menuSel>=0) {
+        FILE*   outFile = doFileOpen (filePath.sData,"w");
+        if (!outFile) {
+            menuChoice = filePath & " could not be opened for writing.";
+            ProblemReport (menuChoice,(Ptr)this);
+            return;
+        }
+        table->SaveTable (head,nil, menuSel,outFile,GetTitle());
+        fclose (outFile);
+    }
+}
+
+//__________________________________________________________
+// HYGeneralBootstrapWindow
+//__________________________________________________________
+
+
+_HYGeneralBootstrapWindow::_HYGeneralBootstrapWindow (_String name, long lID):_HYBootstrapWindow (name, 0.0)
+{
+
+    lfNullID        = -1;
+    lfAltID         = -1;
+    hasGoIcon       = false;
+
+    _HYRect         canvasSettings = {25,50,25,50,HY_COMPONENT_BORDER_T};
+    _HYLabel*       l1      = new _HYLabel (canvasSettings, GetOSWindowData());
+    checkPointer    (l1);
+    canvasSettings.width = HY_COMPONENT_NO_SCROLL;
+    _HYLabel*       l2      = new _HYLabel (canvasSettings, GetOSWindowData());
+    checkPointer    (l2);
+
+    canvasSettings.left = canvasSettings.right = 250;
+    canvasSettings.width = HY_COMPONENT_BORDER_T;
+
+    _HYPullDown *   p1      = new _HYPullDown (canvasSettings, GetOSWindowData());
+    checkPointer   (p1);
+    canvasSettings.width = HY_COMPONENT_NO_SCROLL;
+    _HYPullDown *   p2      = new _HYPullDown (canvasSettings, GetOSWindowData());
+    checkPointer   (p2);
+
+
+    p1->SetMessageRecipient (this);
+    p2->SetMessageRecipient (this);
+
+    AddObject (p1);     // 4
+    AddObject (p2);     // 5
+    AddObject (l1);     // 6
+    AddObject (l2);     // 7
+
+    _HYGuiObject* bsComp [4] = {GetObject(0),GetObject(1),GetObject(2),GetObject(3)};
+
+    SetTableDimensions (5,2);
+
+    SetCell   (0,0,bsComp[3]);
+    SetCell   (0,1,bsComp[0]);
+
+    SetCell   (3,0,l1);
+    SetCell   (3,1,p1);
+
+    SetCell   (4,0,l2);
+    SetCell   (4,1,p2);
+
+    SetCell   (1,0,bsComp[2]);
+    SetCell   (1,1,bsComp[2]);
+    SetCell   (2,0,bsComp[1]);
+    SetCell   (2,1,bsComp[1]);
+
+    _HYFont  labelFont;
+    p1->SetBackColor (labelBColor);
+    p2->SetBackColor (labelBColor);
+    l1->SetBackColor (labelBColor);
+    l2->SetBackColor (labelBColor);
+    l1->SetForeColor (labelFColor);
+    l2->SetForeColor (labelFColor);
+
+    labelFont.face = "Geneva";
+    labelFont.size = 12;
+    labelFont.style = HY_FONT_PLAIN;
+
+    l1->SetFont (labelFont);
+    l2->SetFont (labelFont);
+
+    l1->SetText (_String("Null"));
+    l2->SetText (_String("Alt."));
+    l1->SetAlignFlags (HY_ALIGN_LEFT);
+    l2->SetAlignFlags (HY_ALIGN_LEFT);
+    p1->SetAlignFlags (HY_ALIGN_LEFT);
+    p2->SetAlignFlags (HY_ALIGN_LEFT);
+
+    p1->AddMenuItem (none, -1);
+    p2->AddMenuItem (none, -1);
+
+    done = true;
+
+    SetNullLF         (lID,true);
+    BuildCompatibleLF ();
+    UpdateBSButtons();
+
+    _HYRect  screenRect = GetScreenDimensions();
+    SetWindowRectangle (0,0,screenRect.bottom-10,screenRect.right-20);
+    SetPosition (5,40);
+
+
+    DeleteObject (l1);
+    DeleteObject (l2);
+    DeleteObject (p1);
+    DeleteObject (p2);
+
+}
+
+//__________________________________________________________
+
+void    _HYGeneralBootstrapWindow::UpdateBSButtons      (void)
+{
+    _HYButtonBar *bb =  (_HYButtonBar*) GetObject (3);
+
+    if (done) {
+        if (!hasGoIcon) {
+            bb->ReplaceButton (0, ProcureIconResource(HY_PARAMETER_BOOTSTRAP_BUTTON_ICON_BASE+2), &gbGoTooltip);
+            bb->MarkAsPullDown (0,true);
+            hasGoIcon = true;
+        }
+        bb->EnableButton (0,(lfNullID>=0)&&(lfAltID>=0));
+    } else {
+        if (hasGoIcon) {
+            bb->ReplaceButton  (0,ProcureIconResource(HY_PARAMETER_BOOTSTRAP_BUTTON_ICON_BASE), &gbStopTooltip);
+            bb->MarkAsPullDown (0,false);
+            hasGoIcon = false;
+        }
+    }
+}
+
+//__________________________________________________________
+
+void    _HYGeneralBootstrapWindow::UpdateLRValue        (void)
+{
+    /*_HYTable *th =  (_HYTable*) GetObject (2);
+
+    _String  cellValue ("Simulated LR");
+
+    if ((lfNullID>=0)&&(lfAltID>=0))
+    {
+    }*/
+
+    //TBA?
+
+}
+
+//__________________________________________________________
+
+void    _HYGeneralBootstrapWindow::SetNullLF        (long lID, bool checkFlag)
+{
+    _HYPullDown *p1 =  (_HYPullDown*) GetObject (4),
+                 *p2    =  (_HYPullDown*) GetObject (5);
+
+    long        f;
+
+    if (checkFlag) {
+        BuildAvailableLF();
+        f = lfID0.Find (lID);
+        p1->ChangeSelection (f,false);
+    }
+
+    if ((lID>=0)&&(lfNullID!=lID)) {
+        lfNullID = lID;
+
+        BuildCompatibleLF ();
+
+        f = lfIDA.Find (lfAltID);
+        if (f>=0) {
+            p2->ChangeSelection (f,false);
+        } else {
+            lfAltID = -1;
+            p2->ChangeSelection (0,false);
+        }
+        p2->EnableMenu (lfNullID>=0);
+        UpdateBSButtons ();
+        return;
+    } else if (lID < 0) {
+        lfNullID = -1;
+        p1->ChangeSelection (0,false);
+        p2->EnableMenu (false);
+    }
+
+    p2->ChangeSelection (0,false);
+    UpdateBSButtons();
+}
+
+//__________________________________________________________
+
+bool    _HYGeneralBootstrapWindow::ConfirmClose     (void)
+{
+    return _HYBootstrapWindow::ConfirmClose();
+}
+
+//__________________________________________________________
+
+void    _HYGeneralBootstrapWindow::BuildCompatibleLF (bool)
+{
+    _HYPullDown * p1 = (_HYPullDown*) GetObject (5);
+    while (p1->MenuItemCount()>1) {
+        p1->DeleteMenuItem (1);
+    }
+
+    lfIDA.Clear();
+    lfIDA << -1;
+    dpIDA.Clear();
+    dpIDA << -1;
+
+    if (lfNullID>=0) {
+        _LikelihoodFunction * nLF = (_LikelihoodFunction*) likeFuncList (lfNullID);
+
+        long                nullSeqs  = nLF->SequenceCount (0),
+                            nullSites = nLF->SiteCount     (),
+                            k;
+
+        _HYDataPanel*       nullData = nil;
+
+        for (k=0; k<windowObjectRefs.lLength; k++) {
+            _HYWindow * kthWindow = (_HYWindow*) windowObjectRefs (k);
+
+            if (kthWindow->WindowKind () == HY_WINDOW_KIND_DATAPANEL) {
+                nullData = (_HYDataPanel*) kthWindow;
+                if (nullData->GetLFID()==lfNullID) {
+                    break;
+                }
+            }
+        }
+
+        if (nullData&&((nullData->dataType==HY_DATAPANEL_NUCDATA)||(nullData->dataType==HY_DATAPANEL_PROTDATA)))
+            for (k=0; k<windowObjectRefs.lLength; k++) {
+                _HYWindow * kthWindow = (_HYWindow*) windowObjectRefs (k);
+
+                if (kthWindow->WindowKind () == HY_WINDOW_KIND_DATAPANEL) {
+                    _HYDataPanel * aDP = (_HYDataPanel*) kthWindow;
+                    if (aDP->dataType == nullData->dataType) {
+                        long         lID = aDP->GetLFID();
+                        if ((lID>=0)&&(lID!=lfNullID)) {
+                            _LikelihoodFunction * aLF = (_LikelihoodFunction*) likeFuncList (lID);
+
+                            if ((aLF->SequenceCount(0) == nullSeqs) && (aLF->SiteCount() == nullSites)) {
+                                _String dsName = *aDP->dataSetName;
+                                p1->AddMenuItem (dsName,-1);
+                                lfIDA << lID;
+                                dpIDA << k;
+                                for (long j=0; j<aDP->savedLFNames.lLength; j++) {
+                                    _String dsSName = dsName & '[' & aDP->GetLFStateName (j) & ']';
+                                    p1->AddMenuItem (dsSName, -1);
+                                    lfIDA << lID;
+                                    dpIDA << k;
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+    }
+
+    p1->SetVisibleSize (p1->rel);
+
+}
+
+//__________________________________________________________
+
+void    _HYGeneralBootstrapWindow::BuildAvailableLF  (void)
+{
+    _HYPullDown * p1 = (_HYPullDown*) GetObject (4);
+    while (p1->MenuItemCount()>1) {
+        p1->DeleteMenuItem (1);
+    }
+
+    lfID0.Clear();
+    lfID0 << -1;
+    dpID0.Clear();
+    dpID0 << -1;
+
+    for (long k=0; k<windowObjectRefs.lLength; k++) {
+        _HYWindow * kthWindow = (_HYWindow*) windowObjectRefs (k);
+
+        if (kthWindow->WindowKind () == HY_WINDOW_KIND_DATAPANEL) {
+            _HYDataPanel * aDP = (_HYDataPanel*) kthWindow;
+            if (aDP->GetLFID()>=0) {
+                _String dsName = *aDP->dataSetName;
+                p1->AddMenuItem (dsName,-1);
+                lfID0 << aDP->GetLFID();
+                dpID0 << k;
+                for (long j=0; j<aDP->savedLFNames.lLength; j++) {
+                    _String dsSName = dsName & '[' & aDP->GetLFStateName (j) & ']';
+                    p1->AddMenuItem (dsSName, -1);
+                    lfID0 << aDP->GetLFID();
+                    dpID0 << k;
+                }
+            }
+        }
+    }
+
+    p1->SetVisibleSize (p1->rel);
+
+}
+
+//__________________________________________________________
+
+void    _HYGeneralBootstrapWindow::ResetResults (void)
+{
+    iterateCount  = 0;
+    iterateCountP = 0;
+
+    _HYTable* table = (_HYTable*)GetObject (1);
+    _HYLabel* l     = (_HYLabel*)GetObject (0);
+
+    for (long k=0; k<table->verticalSpaces.lLength; k++) {
+        table->SetCellData(&empty,k,0,HY_TABLE_STATIC_TEXT,true);
+        table->SetCellData(&empty,k,1,HY_TABLE_STATIC_TEXT,true);
+    }
+
+    _String cellValue ("P-Value: N/A");
+    l->SetText (cellValue);
+    table->SetVisibleSize(table->rel);
+    table->_MarkForUpdate();
+    handleGUI(true);
+}
+
+//__________________________________________________________
+
+void    _HYGeneralBootstrapWindow::GetNullStateString (_String& s, long idx)
+{
+    long sidx = idx;
+    while (sidx && (dpID0.lData[sidx-1] == dpID0.lData[sidx])) {
+        sidx --;
+    }
+
+    sidx = idx - sidx;
+
+    _HYDataPanel   *dp = (_HYDataPanel*)windowObjectRefs (dpID0.lData[idx]);
+
+    if (sidx) {
+        s = *dp->GetLFStateString (sidx-1);
+    } else {
+        _String  * cs = dp->LFSnapshot();
+        s = *cs;
+        DeleteObject (cs);
+    }
+}
+
+//__________________________________________________________
+
+void    _HYGeneralBootstrapWindow::GetAltStateString (_String& s, long idx)
+{
+    long sidx = idx;
+    while (sidx && (dpIDA.lData[sidx-1] == dpIDA.lData[sidx])) {
+        sidx --;
+    }
+
+    sidx = idx - sidx;
+
+    _HYDataPanel   *dp = (_HYDataPanel*)windowObjectRefs (dpIDA.lData[idx]);
+
+    if (sidx) {
+        s = *dp->GetLFStateString (sidx-1);
+    } else {
+        _String  * cs = dp->LFSnapshot();
+        s = *cs;
+        DeleteObject (cs);
+    }
+}
+
+//__________________________________________________________
+
+void    _HYGeneralBootstrapWindow::HandleBootstrap (char np)
+{
+    _HYPullDown * p1  = (_HYPullDown*) GetObject (4),
+                  * p2  = (_HYPullDown*) GetObject (5);
+
+    long        iters = -1,
+                sel1  = p1->GetSelection(),
+                sel2  = p2->GetSelection(),
+                k;
+
+    bool        saveIterates = false;
+
+    // prepare the remap
+
+    _LikelihoodFunction* lfN = (_LikelihoodFunction*)likeFuncList (lfID0.lData[sel1]),
+                         * lfA = (_LikelihoodFunction*)likeFuncList (lfIDA.lData[sel2]);
+
+
+    _List                 seqsN,
+                          seqsA;
+
+    _SimpleList           smapN,
+                          smapA,
+                          remap1,
+                          remap2,
+                          remap4,
+                          *nullFilters = &lfN->GetTheFilters ();
+
+    for (k=0; k < nullFilters->lLength; k++) {
+        _DataSetFilter* thisDF = (_DataSetFilter*)dataSetFilterList (nullFilters->lData[k]);
+        if (k==0) {
+            for (long k2 = 0; k2 < thisDF->theNodeMap.lLength; k2++) {
+                seqsN << thisDF->GetSequenceName(k2);
+                if (np) {
+                    smapN << thisDF->theNodeMap.lData[k2];
+                } else {
+                    smapN << k2;
+                }
+            }
+        }
+        for (long j=0; j<thisDF->theOriginalOrder.lLength; j++) {
+            remap1 << thisDF->theOriginalOrder.lData[j];
+            remap2 << remap2.lLength;
+        }
+    }
+
+    SortLists (&remap1, &remap2);
+
+    nullFilters = &lfA->GetTheFilters ();
+
+    unsigned long         maxOO = 0;
+
+
+    for (k=0; k < nullFilters->lLength; k++) {
+        _DataSetFilter* thisDF = (_DataSetFilter*)dataSetFilterList (nullFilters->lData[k]);
+        if (k==0) {
+            for (long k2 = 0; k2 < thisDF->theNodeMap.lLength; k2++) {
+                seqsA << thisDF->GetSequenceName(k2);
+                smapA << k2;
+            }
+        }
+        for (long j=0; j<thisDF->theOriginalOrder.lLength; j++) {
+            long locVal = thisDF->theOriginalOrder.lData[j];
+            remap4 << locVal;
+            if (maxOO <= locVal) {
+                maxOO = locVal+1;
+            }
+        }
+    }
+
+    remap4.Sort();
+
+    if (!remap1.Equal (remap4)) {
+        _String incompatiblePartitions ("The likelihood functions you have selected do not span the same collection of sites. Bootstrap can't proceed.");
+        ProblemReport (incompatiblePartitions, (Ptr)this);
+        return;
+    }
+
+    SortLists (&seqsN, &smapN);
+    SortLists (&seqsA, &smapA);
+
+    if (!seqsN.Equal (seqsA)) {
+        _String incompatiblePartitionS ("The likelihood functions you have selected do not span the same set of sequences. Bootstrap can't proceed.");
+        ProblemReport (incompatiblePartitionS, (Ptr)this);
+        return;
+    }
+
+    _SimpleList remap (maxOO),
+                sremap (smapN.lLength);
+    //*lmap = &((_DataSetFilter*)dataSetFilterList (nullFilters->lData[0]))->theNodeMap;
+
+    for (k=0; k<remap4.lLength; k++) {
+        remap.lData[remap4.lData[k]] = remap2.lData[k];
+    }
+
+    remap.lLength  = maxOO;
+
+    sremap.lLength = smapN.lLength;
+
+    for (k=0; k<smapN.lLength; k++) {
+        sremap.lData[smapA.lData[k]] = smapN.lData[k];
+    }
+
+    _HYDataPanel   *nullPanel = (_HYDataPanel*)windowObjectRefs (dpID0.lData[sel1]),
+                    *altPanel  = (_HYDataPanel*)windowObjectRefs (dpIDA.lData[sel2]);
+
+    if (iterateCount>0) {
+        _String warnMessage;
+        warnMessage = _String ("Existing bootstrap results are about to be purged.");
+        if (!ProceedPromptWithCheck (warnMessage, donotWarnAgain, warnAboutBootstrapReplace, (Ptr)this)) {
+            return;
+        }
+        ResetResults();
+    }
+
+    _String  promptString ("Enter the number of iterations:"),
+             valueString ("100"),
+             folderSave;
+    while (1) {
+        if (!EnterStringDialogWithCheckbox (valueString, promptString, bsSavePrompt, saveIterates, (Ptr)this)) {
+            return;
+        }
+        iters = valueString.toNum();
+        if (iters>0) {
+            break;
+        } else {
+            valueString = "100";
+        }
+    }
+
+    if (saveIterates) {
+        folderSave = ChooseAFolder (saveIteratesPrompt);
+        if (folderSave.sLength==0) {
+            return;
+        }
+    }
+
+    nullPanel->SetLockState (true);
+    altPanel->SetLockState (true);
+
+    done = false;
+    UpdateBSButtons();
+    p1->EnableMenu (false);
+    p2->EnableMenu (false);
+
+    _String  * currentSnapshotN = nullPanel->LFSnapshot(),
+               * currentSnapshotA = altPanel->LFSnapshot(),
+                 nullState,
+                 altState;
+
+
+    GetAltStateString  (altState, sel2);
+    GetNullStateString (nullState, sel1);
+
+    _ExecutionList
+    nullCommands (nullState),
+                 altCommands  (altState);
+
+    checkPointer (currentSnapshotN);
+    checkPointer (currentSnapshotA);
+
+    // compute LRT
+
+    StartBarTimer ();
+
+
+    nullCommands.Execute ();
+
+    lfN->RescanAllVariables();
+    lfN->PrepareToCompute ();
+
+    nullLRT = -lfN->Compute();
+
+    _Parameter saveNLL = nullLRT;
+
+    lfN->DoneComputing ();
+
+    altCommands.Execute();
+
+    lfA->RescanAllVariables();
+    lfA->PrepareToCompute ();
+    nullLRT += lfA->Compute();
+    nullLRT *= 2;
+    lfA->DoneComputing ();
+
+    _DataSet*originalData = (_DataSet*)dataSetList (nullPanel->dataSetID);
+    _String *originalName = (_String*)dataSetNamesList (nullPanel->dataSetID);
+
+    _String  dataSetName (*originalName);
+
+    dataSetName = dataSetName & "_sim";
+    FindUnusedObjectName (empty,dataSetName,dataSetNamesList);
+
+    _DataSet *ds = nil;
+    long     sID = -1;
+
+    if (!np) {
+        ds = new _DataSet();
+        sID = AddDataSetToList (dataSetName,ds);
+    }
+
+
+    SetTitle  (GetTitle () & " (Running...)");
+
+    for (long k = 0; k < iters; k++) {
+        _String dataFileName = folderSave& "simulatedData" & (k+1) & ".seq";
+
+        _Parameter  simLRT;
+
+        _List       dummyN,
+                    dummyA;
+
+        _SimpleList dummy2N,
+                    dummy2A;
+
+        _DataSet*   npDS = nil;
+
+        nullCommands.Execute ();
+        lfN->RescanAllVariables();
+
+
+        if (np) {
+            nullPanel->SpawnLikelihoodFunctionNP (dummyN, np>1);
+            npDS = nullPanel->GenerateOrderedDataSet ();
+            sID  = AddDataSetToList (dataSetName,npDS);
+            altPanel->SpawnLikelihoodFunction (npDS,&dataSetName, dummyA, dummy2A, &remap, &sremap);
+        } else {
+            ds->Clear();
+            lfN->Simulate (*ds,dummyN);
+            nullPanel->SpawnLikelihoodFunction (ds,&dataSetName, dummyN, dummy2N);
+            altPanel->SpawnLikelihoodFunction (ds,&dataSetName, dummyA, dummy2A, &remap, &sremap);
+        }
+
+
+        if (np!=2) {
+            valueString = _String("Obtaining MLEs for the null hypothesis. Iterate #")& k;
+            SetStatusLine (valueString);
+            _Matrix* res = lfN->Optimize();
+            simLRT = -(*res)(1,0);
+            DeleteObject (res);
+
+            if (saveIterates) {
+                _String     saveFile     = folderSave & "nullMLEs" & (k+1) & ".bf";
+                if (np) {
+                    nullPanel->SaveDataPanel (false, &saveFile, &dataFileName, false, npDS, true);
+                } else {
+                    nullPanel->SaveDataPanel (false, &saveFile, &dataFileName, false, ds);
+                }
+            }
+        } else {
+            simLRT = saveNLL;
+        }
+
+        altCommands.Execute ();
+        lfA->RescanAllVariables();
+
+
+        valueString = _String("Obtaining MLEs for the alternative hypothesis. Iterate #")& k;
+        SetStatusLine (valueString);
+        _Matrix * res = lfA->Optimize();
+        simLRT += (*res)(1,0);
+        DeleteObject (res);
+
+        if (saveIterates) {
+            _String     saveFile     = folderSave & "altMLEs" & (k+1) & ".bf";
+            if (np) {
+                altPanel->SaveDataPanel (false, &saveFile, &dataFileName, false, nil);
+            } else {
+                altPanel->SaveDataPanel (false, &saveFile, &dataFileName, false, nil);
+            }
+        }
+
+        simLRT *= 2.;
+
+        if (np) {
+            nullPanel->SpawnLikelihoodFunctionNP (dummyN);
+            altPanel->SpawnLikelihoodFunction (originalData,originalName, dummyA, dummy2A);
+            KillDataSetRecord (sID);
+            //DeleteObject (npDS);
+        } else {
+            nullPanel->SpawnLikelihoodFunction (originalData,originalName, dummyN, dummy2N);
+            altPanel->SpawnLikelihoodFunction (originalData,originalName, dummyA, dummy2A);
+        }
+
+        AddIterate (simLRT);
+
+        if (requestQuit) {
+            break;
+        }
+    }
+
+    StopBarTimer ();
+
+    if (!np) {
+        KillDataSetRecord (sID);
+        //DeleteObject (ds);
+    }
+
+    _ExecutionList exl  (*currentSnapshotN),
+                   exl2 (*currentSnapshotA);
+    exl.Execute();
+    exl2.Execute();
+    DeleteObject (currentSnapshotN);
+    DeleteObject (currentSnapshotA);
+    nullPanel->SetLockState (false);
+    altPanel->SetLockState (false);
+    SetStopped (true);
+    p1->EnableMenu (true);
+    p2->EnableMenu (true);
+    UpdateBSButtons();
+    SetTitle  (GetTitle ().Cut (0, GetTitle ().sLength - 14));
+    ReportAnalysisAsFinished("Bootstrap finished");
+    requestQuit = false;
+}
+
+//__________________________________________________________
+
+bool    _HYGeneralBootstrapWindow::ProcessEvent (_HYEvent* e)
+{
+    bool eDone = false;
+    _String firstArg;
+    long    i,f;
+
+    if (e->EventClass()==_hyMenuOpenEvent) {
+        i = MatchComponentID (e->EventCode());
+
+        if (i==4) {
+            BuildAvailableLF ();
+            eDone = true;
+        } else if (i==5) {
+            BuildCompatibleLF();
+            eDone = true;
+        }
+    } else if (e->EventClass()==_hyMenuSelChangeEvent) {
+        firstArg = e->EventCode().Cut (0,(f=e->EventCode().Find(','))-1);
+        i = MatchComponentID (firstArg);
+
+        if (i==4) {
+            SetNullLF (lfID0 (e->EventCode().Cut(f+1,-1).toNum()));
+            eDone = true;
+        } else if (i==5) {
+            lfAltID = lfIDA (e->EventCode().Cut(f+1,-1).toNum());
+            UpdateBSButtons ();
+            eDone = true;
+        }
+    } else if (e->EventClass() == _hyButtonPushEvent) {
+        firstArg = e->EventCode().Cut (0,(f=e->EventCode().Find(','))-1);
+        i = MatchComponentID (firstArg);
+
+        if (i==3) {
+            i =  e->EventCode().Cut (f+1,-1).toNum();
+            if ((i==0)&&(HasStopped())) {
+                int  h,v;
+                _HYButtonBar* bb = (_HYButtonBar*)GetObject (3);
+                _List        menuOptions;
+                _String      menuChoice ("Parametric Bootstrap");
+
+                menuOptions && & menuChoice;
+                menuChoice = "Nonparametric Bootstrap";
+                menuOptions && & menuChoice;
+                menuChoice = "Permutation Test";
+                menuOptions && & menuChoice;
+                menuChoice = "Full Permutation Test";
+                menuOptions && & menuChoice;
+                bb->GetButtonLoc(0,h,v,true);
+                menuChoice = HandlePullDown (menuOptions,h,v,0);
+                bb->_UnpushButton();
+                i = menuOptions.Find (&menuChoice);
+                if (i>=0) {
+                    HandleBootstrap (i);
+                }
+
+                eDone = true;
+            }
+        }
+    }
+
+    if (eDone) {
+        DeleteObject (e);
+        return true;
+    }
+    return _HYBootstrapWindow::ProcessEvent(e);
+}
+
+//__________________________________________________________
+
+bool    _HYGeneralBootstrapWindow::ProcessGEvent (_HYEvent* e)
+{
+    _String firstArg,
+            secondArg;
+    long    k,f;
+
+    bool    eDone = false;
+
+    if (e->EventClass()==_hyGlobalLFKillEvent) {
+        firstArg = e->EventCode().Cut (0,(f=e->EventCode().Find(','))-1);
+        k = firstArg.toNum();
+        if (k!=GetID()) {
+            f   = e->EventCode().Cut (f+1,-1).toNum();
+
+            if ((lfNullID==f)||(lfAltID==f)) {
+                _HYPullDown * p1 = (_HYPullDown*)GetObject (4),
+                              * p2 = (_HYPullDown*)GetObject (5);
+
+                if (done) {
+                    if (lfAltID == f) {
+                        p2->ChangeSelection (0,true);
+                    } else {
+                        p1->ChangeSelection (0,true);
+                    }
+                } else {
+                    firstArg = "Internal Error: deleted active LF function!! Sorry about that.";
+                    FlagError (firstArg);
+                }
+                eDone = true;
+            }
+        }
+    }
+
+    if (!eDone) {
+        return _HYWindow::ProcessGEvent (e);
+    }
+    return true;
+}
+
+// EOF
diff --git a/src/gui/HYSharedMain.cpp b/src/gui/HYSharedMain.cpp
new file mode 100644
index 0000000..0b6e161
--- /dev/null
+++ b/src/gui/HYSharedMain.cpp
@@ -0,0 +1,486 @@
+/*
+
+HyPhy - Hypothesis Testing Using Phylogenies.
+
+This file implements shared function used by
+'mains'
+
+Written by SL Kosakovsky Pond
+June 11, 2007
+
+Copyright (C) 1997-now
+Core Developers:
+  Sergei L Kosakovsky Pond (spond at ucsd.edu)
+  Art FY Poon    (apoon at cfenet.ubc.ca)
+  Steven Weaver (sweaver at ucsd.edu)
+  
+Module Developers:
+	Lance Hepler (nlhepler at gmail.com)
+	Martin Smith (martin.audacis at gmail.com)
+
+Significant contributions from:
+  Spencer V Muse (muse at stat.ncsu.edu)
+  Simon DW Frost (sdf22 at cam.ac.uk)
+
+Permission is hereby granted, free of charge, to any person obtaining a
+copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be included
+in all copies or substantial portions of the Software.
+
+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.
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+*/
+
+#include "HYSharedMain.h"
+
+#ifndef __HYPHYQT__
+    #include "HYUtils.h"
+    #include "HYConsoleWindow.h"
+    #include "HYDialogs.h"
+    #define _HY_MAIN_CONSOLE_REFERENCE
+#else
+    #include "hyphymain.h"
+    #include "hyphy_qt_helpers.h"
+    _String   menuSeparator       ("SEPARATOR");
+    #define _HY_MAIN_CONSOLE_REFERENCE _hyPrimaryConsoleWindow->
+#endif
+
+bool             isSuspended        = false,
+                 hasTemplates      = false,
+                 highLevelQuit        = false,
+                 isRerunAvailable     = false,
+                 updateTimer        = false,
+                 addToRecent      = true,
+                 echoPaused        = false,
+                 calculatorMode     = false;
+
+_ExecutionList   ex;
+
+_List            availableTemplateFiles,
+                 availablePostProcessors;
+
+_SimpleList      windowPtrs,
+                 windowObjects,
+                 treeIDReferences,
+                 windowObjectRefs;
+
+_String*         argFileName = nil;
+
+
+//_________________________________________________________________________
+
+void    PrepareToExecuteBatchFile  (void)
+{
+#ifdef __MAC__
+    DisableMenuItem (GetMenuHandle(129),0);
+    EnableMenuItem  (GetMenuHandle(131),0);
+    EnableMenuItem  (GetMenuHandle(131),1);
+    EnableMenuItem  (GetMenuHandle(131),2);
+    DisableMenuItem (GetMenuHandle(131),4);
+    DisableMenuItem (GetMenuHandle(131),6);
+    DisableMenuItem (GetMenuHandle(131),7);
+    DisableMenuItem (GetMenuHandle(131),8);
+    InvalMenuBar();
+#endif
+
+#ifdef __WINDOZE__
+    HMENU       hMenu = GetMenu ((HWND)hyphyConsoleWindow->GetOSWindowData()),
+                sMenu;
+    if (hMenu) {
+        EnableMenuItem(hMenu, 0 ,MF_GRAYED|MF_BYPOSITION);
+    }
+    sMenu = GetSubMenu (hMenu,2);
+    if (sMenu) {
+        EnableMenuItem(sMenu, 0 ,MF_ENABLED|MF_BYPOSITION);
+        EnableMenuItem(sMenu, 1 ,MF_ENABLED|MF_BYPOSITION);
+        EnableMenuItem(sMenu, 3 ,MF_GRAYED|MF_BYPOSITION);
+        EnableMenuItem(sMenu, 5 ,MF_GRAYED|MF_BYPOSITION);
+        EnableMenuItem(sMenu, 6 ,MF_GRAYED|MF_BYPOSITION);
+        EnableMenuItem(sMenu, 7 ,MF_GRAYED|MF_BYPOSITION);
+    }
+
+#endif
+
+#ifdef __HYPHY_GTK__
+    ToggleAnalysisMenu (true);
+#endif
+}
+
+//_________________________________________________________________________
+
+void    DoneWithExecutionOfBatchFile (bool doPost)
+{
+#ifdef __MAC__
+    if (doPost) {
+        EnableMenuItem (GetMenuHandle(131),7);
+        EnableMenuItem (GetMenuHandle(201),0);
+        for (long i=0; i<availablePostProcessors.lLength; i++) {
+            _String* condition = (_String*)(*(_List*)availablePostProcessors(i))(2);
+            EnableMenuItem (GetMenuHandle (201),i+1);
+            if (condition->sLength) {
+                _Formula condCheck (*condition,nil);
+                _PMathObj condCheckRes = condCheck.Compute();
+                if ((!condCheckRes)||(condCheckRes->Value()<.5)) {
+                    DisableMenuItem (GetMenuHandle (201),i+1);
+                }
+            }
+        }
+    }
+
+    EnableMenuItem (GetMenuHandle(129),0);
+    EnableMenuItem (GetMenuHandle(150),5);
+    EnableMenuItem (GetMenuHandle(131),0);
+    DisableMenuItem (GetMenuHandle(131),1);
+    DisableMenuItem (GetMenuHandle(131),2);
+    EnableMenuItem (GetMenuHandle(131),4);
+    if (hasTemplates) {
+        EnableMenuItem (GetMenuHandle(131),6);
+    }
+    EnableMenuItem (GetMenuHandle(131),8);
+    InvalMenuBar();
+#endif
+
+#ifdef __WINDOZE__
+    HMENU       hMenu = GetMenu ((HWND)hyphyConsoleWindow->GetOSWindowData()),
+                sMenu;
+
+    if (hMenu) {
+        EnableMenuItem(hMenu, 0, MF_ENABLED|MF_BYPOSITION);
+    }
+
+    sMenu = GetSubMenu (hMenu,2);
+    if (sMenu) {
+        EnableMenuItem(sMenu, 0 ,MF_GRAYED|MF_BYPOSITION);
+        EnableMenuItem(sMenu, 1 ,MF_GRAYED|MF_BYPOSITION);
+        EnableMenuItem(sMenu, 3 ,MF_ENABLED|MF_BYPOSITION);
+        EnableMenuItem(sMenu, 5 ,MF_ENABLED|MF_BYPOSITION);
+        EnableMenuItem(sMenu, 6 ,MF_ENABLED|MF_BYPOSITION);
+        EnableMenuItem(sMenu, 7 ,MF_ENABLED|MF_BYPOSITION);
+    }
+    if (doPost) {
+        HMENU       sMenu = GetSubMenu(GetSubMenu (GetMenu((HWND)hyphyConsoleWindow->GetOSWindowData()),2),6);
+        for (long i=0; i<availablePostProcessors.lLength; i++) {
+            EnableMenuItem(sMenu, i ,MF_ENABLED|MF_BYPOSITION);
+            _String* condition = (_String*)(*(_List*)availablePostProcessors(i))(2);
+            if (condition->sLength) {
+                _Formula condCheck (*condition,nil);
+                _PMathObj condCheckRes = condCheck.Compute();
+                if ((!condCheckRes)||(condCheckRes->Value()<.5)) {
+                    EnableMenuItem(sMenu, i ,MF_GRAYED|MF_BYPOSITION);
+                }
+            }
+        }
+    }
+    DrawMenuBar((HWND)hyphyConsoleWindow->GetOSWindowData());
+    SendMessage ((HWND)hyphyConsoleWindow->GetOSWindowData(), WM_PAINT, NULL, NULL);
+
+#endif
+
+#ifdef __HYPHY_GTK__
+    ToggleAnalysisMenu (false);
+#endif
+
+#ifdef __HYPHYQT__
+    ClearStatusLine();
+    _HY_MAIN_CONSOLE_REFERENCE DisplayPrompt();
+#endif
+
+}
+
+//_________________________________________________________________________
+
+bool    ExecuteBatchFile (void)
+{
+    PrepareToExecuteBatchFile ();
+    terminateExecution      = false;
+    skipWarningMessages     = false;
+
+    _String justTheName     (*argFileName,argFileName->FindBackwards (GetPlatformDirectoryChar(),0,-1)+1,-1);
+
+    _HY_MAIN_CONSOLE_REFERENCE AddStringToRecentMenu   (justTheName, *argFileName);
+    _HY_MAIN_CONSOLE_REFERENCE SetStatusLine           (justTheName,"Loading","00:00:00", -1);
+    _HY_MAIN_CONSOLE_REFERENCE StartBarTimer           ();
+    
+    _String info = _String("Running '") & *argFileName & "'\n";
+    StringToConsole(info);
+
+    
+    #ifndef __HYPHYQT__
+    ApplyPreferences        ();
+    #endif 
+    
+    ex.Clear                ();
+    ReadBatchFile           (*argFileName,ex);
+    ex.Execute();
+
+    _HY_MAIN_CONSOLE_REFERENCE StopBarTimer            ();
+    
+    setParameter            (VerbosityLevelString, 0.0, nil);
+    BufferToConsole         ("\n");
+
+    ReportAnalysisAsFinished (empty);
+
+    isRerunAvailable        = true;
+    terminateExecution      = false;
+
+    ex.ResetFormulae();
+    DoneWithExecutionOfBatchFile ();
+    return true;
+}
+
+//_________________________________________________________________________
+void    RunTemplate (long idx)
+{
+    PurgeAll        (windowPtrs.lLength==0);
+    _String         pathName = libDirectory&"TemplateBatchFiles"&GetPlatformDirectoryChar();
+    pathNames&&     &pathName;
+    pathName    = pathName&*(_String*)(*(_List*)availableTemplateFiles(idx))(2);
+
+    if (!argFileName) {
+        argFileName = new _String(pathName);
+    } else {
+        *argFileName = pathName;
+    }
+
+    ExecuteBatchFile();
+}
+
+//_________________________________________________________________________
+bool    OpenBatchFile (bool openOrNot, _String* dL)
+{
+    PurgeAll            (windowPtrs.lLength==1);
+    
+    #if !defined __HYPHYQT__
+    
+    if (openOrNot)
+        if (!PopUpFileDialog(" Please select a batch file to run:",dL)) {
+            return false;
+        }
+    
+    #else
+        if (!argFileName) {
+            argFileName = new _String (_hyQTFileDialog("Select an HBL file to run",empty,false));
+        } else {
+            *argFileName = _hyQTFileDialog("Select an HBL file to run",empty,false);
+        }            
+    #endif 
+
+    if (!argFileName || argFileName->sLength == 0) {
+        return false;
+    }
+
+    _String       pathName (*argFileName);
+    PushFilePath  (pathName);
+    return true;
+}
+
+//_________________________________________________________________________
+void    ExecuteAPostProcessor (_String justTheName)
+{
+    PrepareToExecuteBatchFile ();
+    _ExecutionList postEx;
+
+    _String        postFile    = libDirectory & "TemplateBatchFiles" & GetPlatformDirectoryChar() & justTheName,
+                   pathName (postFile);
+
+#ifdef __MAC__
+    volumeName  = baseDirectory.Cut (0, baseDirectory.Find(':'));
+#endif
+
+    _HY_MAIN_CONSOLE_REFERENCE SetStatusLine ( justTheName, "Loading", "00:00:00", -1);
+
+    PushFilePath      (pathName);
+    ReadBatchFile     (postFile, postEx);
+    _HY_MAIN_CONSOLE_REFERENCE StartBarTimer     ();
+    terminateExecution = false;
+    postEx.Execute    ();
+    _HY_MAIN_CONSOLE_REFERENCE SetStatusLine     (justTheName, "Finished", empty, -1, HY_SL_FILE|HY_SL_TASK);
+    PopFilePath       ();
+    terminateExecution = false;
+    _HY_MAIN_CONSOLE_REFERENCE StopBarTimer      ();
+    DoneWithExecutionOfBatchFile ();
+}
+
+//_________________________________________________________________________
+void    updateTimerF (_String& rec, long time_diff)
+{
+    rec.FormatTimeString (time_diff);
+}
+
+//__________________________________________________________________________________
+void    ReadInTemplateFiles(void)
+{
+    _String     fileIndex = libDirectory&"TemplateBatchFiles"&GetPlatformDirectoryChar()&"files.lst";
+    FILE      * modelList = doFileOpen (fileIndex.getStr(), "r");
+
+    if (!modelList) {
+        return;
+    }
+    
+
+    _String theData (modelList);
+    fclose (modelList);
+
+    if (theData.sLength) {
+        _ElementaryCommand::ExtractConditions(theData,0,availableTemplateFiles);
+
+        for (long i = 0; i<availableTemplateFiles.countitems(); i++) {
+            _String* thisString = (_String*)availableTemplateFiles(i);
+            _List   thisFile;
+            _ElementaryCommand::ExtractConditions(*thisString,thisString->FirstNonSpaceIndex(),thisFile,',');
+            if (thisFile.lLength!=3) {
+                availableTemplateFiles.Delete(i);
+                i--;
+                continue;
+            }
+            for (long j = 0; j<3; j++) {
+                ((_String*)thisFile(j))->StripQuotes();
+            }
+
+            availableTemplateFiles.Replace(i,&thisFile,true);
+        }
+
+    }
+
+
+    // try reading post processing files
+
+    fileIndex = libDirectory&"TemplateBatchFiles"&GetPlatformDirectoryChar()&"postprocessors.lst";
+    if (! (modelList = doFileOpen (fileIndex.getStr(),"r"))) {
+        return;
+    }
+
+    _String postData (modelList);
+    fclose  (modelList);
+
+    if (postData.sLength) {
+        _ElementaryCommand::ExtractConditions(postData,0,availablePostProcessors);
+        for (long i = 0; i<availablePostProcessors.countitems(); i++) {
+            _String* thisString = (_String*)availablePostProcessors(i);
+            _List   thisFile;
+            _ElementaryCommand::ExtractConditions(*thisString,thisString->FirstNonSpaceIndex(),thisFile,',');
+            if (thisFile.lLength!=3) {
+                availablePostProcessors.Delete(i);
+                i--;
+                continue;
+            }
+            for (long j = 0; j<3; j++) {
+                ((_String*)thisFile(j))->StripQuotes();
+            }
+
+            availablePostProcessors.Replace(i,&thisFile,true);
+        }
+
+        for (long counter=0; counter<availablePostProcessors.countitems(); counter++) {
+            _String * postItem = (_String*)(*(_List*)availablePostProcessors(counter))(0);
+            if (postItem->Equal(&menuSeparator)) {
+                continue;
+            }
+            postItem = (_String*)(*(_List*)availablePostProcessors(counter))(1);
+            _String tryFileName = libDirectory & "TemplateBatchFiles"& GetPlatformDirectoryChar() & (*postItem);
+            FILE    * tryFile = doFileOpen (tryFileName.getStr(), "r");
+            if (tryFile) {
+                fclose(tryFile);
+            } else {
+                availablePostProcessors.Delete(counter);
+                counter--;
+            }
+        }
+    }
+}
+
+//____________________________________________________________________________________________
+long  SelectATemplate (void)
+{
+    _SimpleList std,
+                vc (availableTemplateFiles.lLength,0,1),
+                selection;
+
+    std<<2;
+    std<<1;
+
+#ifdef __HYPHYQT__
+    return -1;
+#else
+    return HandleHierListSelection (availableTemplateFiles, std, vc, "Select a standard analysis to run",selection,1);
+#endif
+}
+
+//____________________________________________________________________________________________
+_String     MatrixExpCounter             (void)
+{
+    _Matrix B(61,61,true,true);
+    long i;
+    for (i=0; i<740; i++) {
+        B[((_Parameter)genrand_int32()/RAND_MAX_32)*(61*61-1)] = ((_Parameter)genrand_int32())/RAND_MAX_32;
+    }
+
+    clock_t startTime = clock(),
+            otherTime;
+
+    for (i=0; i<100000; i++) {
+        B.Exponentiate();
+        //C *= B;
+        otherTime = clock()-startTime;
+        if (otherTime>CLOCKS_PER_SEC && i>=5) {
+            break;
+        }
+    }
+    if (B.GetHDim()) {
+        _Parameter result = otherTime/(double)CLOCKS_PER_SEC;
+        result = i*1.2/result;
+        return _String("61x61 Random Sparse Matrix Exps/sec : ")&_String(result);
+    }
+    return empty;
+}
+
+//____________________________________________________________________________________________
+void SpoolFile (void)
+{
+    FILE *f = doFileOpen (argFileName->getStr(), "r");
+    if (f) {
+        _String lateralus (f);
+        fclose (f);
+        _String fS = _String ("\n-------------------File ") & *argFileName & " ------------------------\n";
+        StringToConsole (fS);
+        StringToConsole (lateralus);
+    }
+}
+
+//________________________________________________________
+
+void        RunStandardAnalyses (void)
+{
+    long menuChoice=SelectATemplate();
+    if (menuChoice >= 0) {
+        RunTemplate(menuChoice);
+    }
+}
+
+//_________________________________________________________________________
+
+void    ReportAnalysisAsFinished  (_String text, bool fgTheConsole)
+{
+#if defined __MAC__ || defined __WINDOZE__ || defined __HYPHY_GTK__
+    SetStatusLine (empty,text.sLength?text:_String("Finished"),empty,-HY_SL_DONE,HY_SL_PERCENT|HY_SL_TASK|HY_SL_PERCENT|HY_SL_FORCE|HY_SL_DONE);
+    if (fgTheConsole) {
+        hyphyConsoleWindow->BringToFront();
+    }
+#endif
+}
+
+
+
+//EOF
diff --git a/src/gui/HYTreePanel.cpp b/src/gui/HYTreePanel.cpp
new file mode 100644
index 0000000..46fa9db
--- /dev/null
+++ b/src/gui/HYTreePanel.cpp
@@ -0,0 +1,7787 @@
+/*
+ 
+ HyPhy - Hypothesis Testing Using Phylogenies.
+ 
+ Copyright (C) 1997-now
+ Core Developers:
+ Sergei L Kosakovsky Pond (spond at ucsd.edu)
+ Art FY Poon    (apoon at cfenet.ubc.ca)
+ Steven Weaver (sweaver at ucsd.edu)
+ 
+ Module Developers:
+ Lance Hepler (nlhepler at gmail.com)
+ Martin Smith (martin.audacis at gmail.com)
+ 
+ Significant contributions from:
+ Spencer V Muse (muse at stat.ncsu.edu)
+ Simon DW Frost (sdf22 at cam.ac.uk)
+ 
+ Permission is hereby granted, free of charge, to any person obtaining a
+ copy of this software and associated documentation files (the
+ "Software"), to deal in the Software without restriction, including
+ without limitation the rights to use, copy, modify, merge, publish,
+ distribute, sublicense, and/or sell copies of the Software, and to
+ permit persons to whom the Software is furnished to do so, subject to
+ the following conditions:
+ 
+ The above copyright notice and this permission notice shall be included
+ in all copies or substantial portions of the Software.
+ 
+ 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.
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ 
+ */
+
+#include "HYTreePanel.h"
+#include "HYCanvas.h"
+#include "HYPullDown.h"
+#include "HYEventTypes.h"
+#include "calcnode.h"
+#include "batchlan.h"
+#include "likefunc.h"
+#include "HYLabel.h"
+#include "HYButtonBar.h"
+#include "math.h"
+#include "HYUtils.h"
+
+#include "HYTextBox.h"
+#include "HYButton.h"
+#include "HYChartWindow.h"
+
+#include "HYDataPanel.h"
+#include "HYParameterTable.h"
+#include "HYModelWindow.h"
+
+#ifdef    __HYPHYDMALLOC__
+#include "dmalloc.h"
+#endif
+
+#define     TREE_PANEL_PIXEL_DEPTH  32
+
+_HYColor    navFill   = {212,212,212},
+            navSelect = {255,0,255},
+            black = {0,0,0};
+
+bool        promptDefModel     = false,
+            promptShrinkFilter = false,
+            promptKillLF       = false,
+            makeUndoTree     = false,
+            displayNotUndoable = false,
+            brLengthIntOnly    = false,
+            updateInDataPanel  = false;
+
+node<long>* treePanelClipboardRoot = nil;
+char        treePanelClipboardMode = HY_CLIPBOARD_CUT;
+
+_HYTreePanel* feedbackTreePanel = nil;
+
+extern      _SimpleList       windowObjects;
+extern      _String           none;
+
+_String     eSubsScale          ("E[Substitutions]"),
+            assValScale           ("Assigned Values"),
+            notUndoableWarning    ("The change of branch model will result in loss of all current parameter values and expressions and the likelihood function."),
+            donotWarnAgain        ("Do not warn me again"),
+            treeStringExport  ("_TREE_STRING_FOR_PROCESSING_"),
+            treeStringSelect    ("_TREE_PANEL_SELECTION_"),
+            selectByNameSave,
+            selectByBLSave,
+            sandrString1,
+            sandrString2;
+
+_List       treeProcessors;
+
+
+//__________________________________________________________
+_HYTreePanel::_HYTreePanel(_String& title,_String& argument):_HYTWindow (_String ("Tree ")&title)
+{
+    if (treeProcessors.lLength==0) {
+        ReadTreeProcessors ();
+    }
+
+    coordTree = nil;
+    likeFuncID = -1;
+    undoCode = -1;
+    branchWidth = 2;
+
+    flags |= HY_WINDOW_STATUS_BAR_LIGHT_LEFT;
+    _HYRect         canvasSettings = {50,50,HY_TREEPANEL_DEFSIZE,HY_TREEPANEL_DEFSIZE,HY_COMPONENT_NO_SCROLL};
+    _HYCanvas*      c = new _HYCanvas (canvasSettings,GetOSWindowData(),HY_TREEPANEL_DEFSIZE,HY_TREEPANEL_DEFSIZE,TREE_PANEL_PIXEL_DEPTH);
+    canvasSettings.top = canvasSettings.bottom = HY_TREEPANEL_RULER_EXPANDED;
+    _HYCanvas*      r = new _HYCanvas (canvasSettings,GetOSWindowData(),HY_TREEPANEL_RULER_EXPANDED,HY_TREEPANEL_DEFSIZE,TREE_PANEL_PIXEL_DEPTH);
+    canvasSettings.right=canvasSettings.bottom=canvasSettings.left=canvasSettings.top=HY_TREEPANEL_NAVSIZE;
+    _HYCanvas*      c1 = new _HYCanvas (canvasSettings,GetOSWindowData(),HY_TREEPANEL_NAVSIZE,HY_TREEPANEL_NAVSIZE,32);
+    canvasSettings.left     = 30;
+    canvasSettings.top      = 30;
+    canvasSettings.bottom   = 30;
+    canvasSettings.right    = HY_TREEPANEL_MAXSIZE;
+    _HYLabel*       l1      = new _HYLabel    (canvasSettings,GetOSWindowData());
+    _HYLabel*       l2      = new _HYLabel    (canvasSettings,GetOSWindowData());
+    canvasSettings.left     = 50;
+    _HYPullDown*    p1      = new _HYPullDown (canvasSettings,GetOSWindowData());
+    _HYPullDown*    p2      = new _HYPullDown (canvasSettings,GetOSWindowData());
+    p1->SetMessageRecipient (this);
+    p1->SetAlignFlags (HY_ALIGN_LEFT);
+    p2->SetMessageRecipient (this);
+    p2->SetAlignFlags (HY_ALIGN_LEFT);
+    canvasSettings.bottom   = 50;
+    canvasSettings.top      = 50;
+    _HYLabel*       l3      = new _HYLabel (canvasSettings,GetOSWindowData());
+    _HYButtonBar*   bb      = new _HYButtonBar (canvasSettings, GetOSWindowData());
+    bb->SetMessageRecipient (this);
+    _String tt ("Expand Tree Horizontally");
+    bb->AddButton (ProcureIconResource(HY_TREEPANEL_ICON_ID),&tt);
+    tt = "Expand Tree Vertically";
+    bb->AddButton (ProcureIconResource(HY_TREEPANEL_ICON_ID+1),&tt);
+    tt = "Contract Tree Horizontally";
+    bb->AddButton (ProcureIconResource(HY_TREEPANEL_ICON_ID+2),&tt);
+    tt = "Contract Tree Vertically";
+    bb->AddButton (ProcureIconResource(HY_TREEPANEL_ICON_ID+3),&tt);
+    tt = "Toggle Horizontal/Vertical View";
+    bb->AddButton (ProcureIconResource(HY_TREEPANEL_ICON_ID+4),&tt);
+    tt = "Scale to Fit Window";
+    bb->AddButton (ProcureIconResource(HY_TREEPANEL_ICON_ID+6),&tt);
+    tt = "Fisheye View";
+    bb->AddButton (ProcureIconResource(HY_TREEPANEL_ICON_ID+7),&tt);
+    bb->MarkAsPullDown (6,true);
+    bb->SetAlignFlags (HY_ALIGN_LEFT);
+    l3->SetAlignFlags (HY_ALIGN_LEFT);
+    l1->SetAlignFlags (HY_ALIGN_LEFT);
+    l2->SetAlignFlags (HY_ALIGN_LEFT);
+    canvasSettings.top = canvasSettings.bottom = HY_TREEPANEL_NAVSIZE-107;
+    canvasSettings.width = HY_COMPONENT_BORDER_B;
+    _HYLabel*       l4 = new _HYLabel (canvasSettings,GetOSWindowData());
+    bb->SetButtonDim (20);
+    bb->SetButtonLayoutW (4);
+    AddObject (c,false);
+    AddObject (c1,false);
+    AddObject (r,false);
+    AddObject (p1,false);
+    AddObject (l1,false);
+    AddObject (p2,false);
+    AddObject (l2,false);
+    AddObject (bb,false);
+    AddObject (l3,false);
+    AddObject (l4,false);
+    SetTableDimensions (6,3);
+    SetCell (0,0,c1);
+    SetCell (0,1,l1);
+    SetCell (0,2,p1);
+    SetCell (1,0,c1);
+    SetCell (1,1,l2);
+    SetCell (1,2,p2);
+    SetCell (2,0,c1);
+    SetCell (2,1,l3);
+    SetCell (2,2,bb);
+    SetCell (3,0,c1);
+    SetCell (3,1,l4);
+    SetCell (3,2,l4);
+    SetCell (4,0,r);
+    SetCell (4,1,r);
+    SetCell (4,2,r);
+    SetCell (5,0,c);
+    SetCell (5,1,c);
+    SetCell (5,2,c);
+
+    p1->AddMenuItem(_String("Rectangular"),-1);
+    /*p1->AddMenuItem(_String("Straight"),-1);
+    p1->AddMenuItem(_String("Smooth Edges"),-1);
+    p1->AddMenuItem(_String("Radial"),-1);*/
+    p2->AddMenuItem(_String("Unscaled"),-1);
+
+    p2->AddMenuItem(eSubsScale,-1);
+    p2->AddMenuItem(assValScale,-1);
+    l1->SetText (_String("Tree Style"));
+    l2->SetText (_String("Branch Scaling"));
+    l3->SetText (_String("Zoom/Rotate"));
+    l1->SetShadow(true);
+    l2->SetShadow(true);
+    l3->SetShadow(true);
+    canvasSettings.top = 0;
+    canvasSettings.left = 0;
+    canvasSettings.bottom = HY_TREEPANEL_NAVSIZE;
+    canvasSettings.right = 500;
+    canvasSettings.width = HY_COMPONENT_NO_SCROLL;
+    //p1->SetDimensions(canvasSettings,canvasSettings);
+    c1->StartDraw();
+    _HYColor col = navFill;
+    c1->SetColor (col);
+    canvasSettings.right = HY_TREEPANEL_NAVSIZE-1;
+    canvasSettings.width = 1;
+    c1->FillRect (canvasSettings);
+    col.R = col.B = col.G = 0;
+    c1->SetColor (col);
+    c1->DrawRect (canvasSettings);
+    c1->EndDraw();
+    col.R = 102;
+    col.G = 90;
+    col.B = 88;
+    canvasSettings.top = canvasSettings.left = 0;
+    canvasSettings.bottom = canvasSettings.right = HY_TREEPANEL_MAXSIZE;
+    canvasSettings.width = 1;
+    p1->SetBackColor (col);
+    p2->SetBackColor (col);
+    _HYFont  labelFont;
+
+#ifdef __WINDOZE__
+    labelFont.size = 10;
+    labelFont.face      = "MS Sans Serif";
+    treeLabelFont.face  = labelFont.face;
+    branchLabel1.face   = labelFont.face;
+    branchLabel2.face   = labelFont.face;
+#endif
+
+#ifdef __MAC__
+    labelFont.size      = 12;
+    labelFont.face      = "Geneva";
+    treeLabelFont.face  = labelFont.face;
+    branchLabel1.face   = "Times";
+    branchLabel2.face   = branchLabel1.face;
+#endif
+
+#ifdef __HYPHY_GTK__
+    labelFont.size      = 10;
+    labelFont.face      = _HY_SANS_FONT;
+    treeLabelFont.face  = labelFont.face;
+    branchLabel1.face   = _HY_SERF_FONT;
+    branchLabel2.face   = branchLabel1.face;
+#endif
+
+    treeLabelFont.size = 9;
+    treeLabelFont.style = HY_FONT_PLAIN;
+    branchLabel1.size = 9;
+    branchLabel1.style = HY_FONT_PLAIN;
+    branchLabel2.size = 9;
+    branchLabel2.style = HY_FONT_BOLD;
+
+    topAlign    = 0;
+    bottomAlign = 0;
+
+    branchVar1 = empty;
+    branchVar2 = empty;
+
+    labelDigits1 = 6;
+    labelDigits2 = 6;
+
+    windowTextMarginH = HY_TREEPANEL_MARGIN;
+    windowTextMarginV = HY_TREEPANEL_MARGIN;
+
+    labelFont.style = HY_FONT_PLAIN;
+    l1->SetFont (labelFont);
+    l1->SetBackColor (col);
+    l2->SetFont (labelFont);
+    l2->SetBackColor (col);
+    l3->SetFont (labelFont);
+    l3->SetBackColor (col);
+    l4->SetBackColor (col);
+    bb->SetBackColor (col);
+    canvasSettings = l2->_SuggestDimensions();
+    canvasSettings.width = HY_COMPONENT_NO_SCROLL;
+    canvasSettings.top = canvasSettings.bottom = 30;
+    canvasSettings.right+=10;
+    canvasSettings.left+=10;
+    col.R = 254;
+    col.G = 242;
+    col.B = 208;
+    l1->SetForeColor  (col);
+    l2->SetForeColor  (col);
+    l3->SetForeColor  (col);
+    l1->SetDimensions (canvasSettings,canvasSettings);
+    l2->SetDimensions (canvasSettings,canvasSettings);
+    canvasSettings.top = canvasSettings.bottom = 50;
+    l3->SetDimensions (canvasSettings,canvasSettings);
+    SetWindowRectangle (0,0,HY_TREEPANEL_DEFSIZE,HY_TREEPANEL_DEFSIZE);
+
+    treeName = title;
+    hSpace = HY_TREEPANEL_HSPACE;
+    vSpace = HY_TREEPANEL_VSPACE;
+    textSpace = HY_TREEPANEL_LABELSPACING;
+    treeFlags = HY_TREEPANEL_SCALED|HY_TREEPANEL_SQUARE|HY_TREEPANEL_TIP_LABELS;
+    if (argument.sLength) {
+        if (argument.sData[0]=='(') {
+            SetTreeString (argument);
+        } else {
+            SetVariableReference (argument);
+        }
+    }
+    distortion         = 1.5;
+    arcStart           = 0;
+    arcEnd             = 6.284;
+    saveMouseH         = 0;
+    saveMouseV         = 0;
+    toolTipBounds.left = 0;
+    lastSave           = 0;
+
+}
+
+//__________________________________________________________
+void _HYTreePanel::dumpCoordTree (void)
+{
+    if (coordTree) {
+        coordTree->delete_tree();
+        delete coordTree;
+        coordTree = nil;
+    }
+}
+
+//__________________________________________________________
+_HYTreePanel::~_HYTreePanel()
+{
+    dumpCoordTree();
+    FlushUndoData();
+}
+
+//__________________________________________________________
+
+bool    _HYTreePanel::ProcessGEvent (_HYEvent* e)
+{
+    _String firstArg;
+    long    k,f;
+
+    bool    done = false;
+
+    if (e->EventClass()==_hyGlobalLFKillEvent) {
+        firstArg = e->EventCode().Cut (0,(f=e->EventCode().Find(','))-1);
+        k = firstArg.toNum();
+        if (k!=GetID()) {
+            firstArg        = e->EventCode().Cut (f+1,-1);
+            if (likeFuncID==firstArg.toNum()) {
+                likeFuncID = -1;
+                firstArg = statusBar.Cut(0,statusBar.FindBackwards (". Ln-likelihood",0,-1)-1);
+                SetStatusBar (firstArg);
+                _PaintLFStatus();
+                if (scaleVariable.sLength&&(!scaleVariable.Equal(&assValScale))) {
+                    scaleVariable = assValScale;
+                    UpdateScalingVariablesList ();
+                    BuildTree (true);
+                    RenderTree(true);
+                }
+                done = true;
+            }
+        }
+    } else if (e->EventClass()==_hyGlobalTreeKillEvent) {
+        firstArg = e->EventCode().Cut (0,(f=e->EventCode().Find(','))-1);
+        k = firstArg.toNum();
+        if (k!=GetID()) {
+            firstArg = e->EventCode().Cut (f+1,-1);
+            k = LocateVarByName(treeName);
+            if (k>=0)
+#ifndef USE_AVL_NAMES
+                if (variableReindex.lData[k] == firstArg.toNum())
+#else
+                if (variableNames.GetXtra (k) == firstArg.toNum())
+#endif
+                {
+                    postWindowCloseEvent (GetID());
+                    done = true;
+                }
+        }
+    } else if (e->EventClass()==_hyGlobalChangeLF) {
+        firstArg = e->EventCode().Cut (0,(f=e->EventCode().Find(','))-1);
+        k = firstArg.toNum();
+        if (k!=GetID()) {
+            firstArg        = e->EventCode().Cut (f+1,-1);
+            if (likeFuncID==firstArg.toNum()) {
+                if (scaleVariable.sLength&&(!scaleVariable.Equal(&assValScale))) {
+                    UpdateScalingVariablesList ();
+                    BuildTree (true);
+                    RenderTree(true);
+                }
+                done = true;
+            }
+        }
+    } else if (e->EventClass()==_hyGlobalLFSpawnEvent) {
+        firstArg = e->EventCode().Cut (0,(f=e->EventCode().Find(','))-1);
+        k = firstArg.toNum();
+        if (k!=GetID()) {
+            if (likeFuncID == -1) {
+                k       = e->EventCode().Cut (f+1,-1).toNum();
+
+                _LikelihoodFunction *lf = (_LikelihoodFunction*)likeFuncList (k);
+                if (lf->DependOnTree (treeName)>=0) {
+                    likeFuncID = k;
+                    UpdateScalingVariablesList ();
+                    scaleVariable = expectedNumberOfSubs;
+                    BuildTree (true);
+                    RenderTree(true);
+                }
+            }
+        }
+    } else if (e->EventClass()==_hyGlobalSetTreePanelSelection) {
+        _TheTree * me = LocateMyTreeVariable ();
+        if (me) {
+            firstArg = e->EventCode().Cut (0,(f=e->EventCode().Find(','))-1);
+            k = firstArg.toNum();
+            if (k==me->GetAVariable()) {
+                _List * nodeNames = e->EventCode().Tokenize(",");
+                if (nodeNames->lLength>1) {
+                    nodeNames->Delete(0);
+                    SelectRangeAndScroll(*nodeNames);
+                    done = true;
+                }
+                DeleteObject (nodeNames);
+            }
+        }
+    }
+
+    if (!done) {
+        return _HYWindow::ProcessGEvent (e);
+    }
+    return true;
+}
+
+//__________________________________________________________
+
+void  _HYTreePanel::HandleContextPopup (long h, long v)
+{
+    _List       menuOptions;
+    _String     menuChoice ("Copy as Picture");
+
+    menuOptions && & menuChoice;
+
+    menuChoice = "Copy as Newick string";
+    menuOptions && & menuChoice;
+
+    if (currentSelection.lLength) {
+        menuChoice = "Count Nodes in Selection";
+        menuOptions && & menuChoice;
+        menuChoice = "Copy Names in Selection";
+        menuOptions && & menuChoice;
+    }
+
+    menuChoice = HandlePullDown (menuOptions, h,v ,-1);
+
+    switch (menuOptions.Find(&menuChoice)) {
+    case 0: {
+        _HYCanvas* theCanvas = (_HYCanvas*)GetObject (0);
+        theCanvas->_CopyToClipboard ();
+        break;
+    }
+    case 1: {
+        menuChoice = GetTreeString();
+        PlaceStringInClipboard (menuChoice, GetOSWindowData());
+        break;
+    }
+    case 2: {
+        long             lCount = 0;
+        long             iCount = 0;
+        for (long k=0; k<currentSelection.lLength; k++) {
+            node<nodeCoord>* nn = (node<nodeCoord>*)currentSelection (k);
+            if (nn->get_num_nodes()) {
+                iCount++;
+            } else {
+                lCount++;
+            }
+        }
+#ifdef __MAC__
+        _String newLine ("\r");
+#else
+        _String newLine ("\n\r");
+#endif
+        _String msg = _String("Current selection includes") & newLine &_String(lCount) & " leaves and" & newLine& _String(iCount) & " internal nodes.";
+        ProblemReport (msg, (Ptr)this);
+        break;
+    }
+    case 3: {
+        _String   res (currentSelection.lLength*16,true);
+
+        if (treeFlags&HY_TREEPANEL_TIP_LABELS)
+            for (long k=0; k<currentSelection.lLength; k++) {
+                node<nodeCoord>* nn = (node<nodeCoord>*)currentSelection (k);
+                if (!nn->get_num_nodes()) {
+                    res << nn->in_object.branchName;
+                    res << '\n';
+                }
+            }
+
+        if (treeFlags&HY_TREEPANEL_INT_LABELS)
+            for (long k=0; k<currentSelection.lLength; k++) {
+                node<nodeCoord>* nn = (node<nodeCoord>*)currentSelection (k);
+                if (nn->get_num_nodes()) {
+                    res << nn->in_object.branchName;
+                    res << '\n';
+                }
+            }
+        res.Finalize();
+        PlaceStringInClipboard (res, GetOSWindowData());
+        break;
+    }
+    }
+}
+
+//__________________________________________________________
+
+void  _HYTreePanel::DisplayParameterTable (void)
+{
+    if (likeFuncID>=0) {
+        _String     windowName (*(_String*)likeFuncNamesList (likeFuncID));
+        if (windowName.endswith ("_LF")) {
+            windowName.Trim (0,windowName.sLength-4);
+        }
+        windowName = _String ("Likelihood parameters for ") & windowName;
+        long    k = FindWindowByName (windowName);
+        _HYParameterTable*    thePT;
+        if (k>=0) {
+            _HYPlatformWindow* thisWindow = (_HYPlatformWindow*)windowObjects(k);
+            thisWindow->_Activate();
+            thePT = (_HYParameterTable*)windowObjectRefs(k);
+        } else {
+            thePT = new _HYParameterTable (windowName,likeFuncID);
+            thePT->BringToFront();
+        }
+        if (currentSelection.lLength) {
+            _List   nodeNames;
+            for (k=0; k<currentSelection.lLength; k++) {
+                node<nodeCoord>* node1 = (node<nodeCoord>*)currentSelection(k);
+                _String          nodeName = treeName&'.'&node1->in_object.branchName&'.';
+                nodeNames.BinaryInsert(&nodeName);
+            }
+            thePT->SetSelectedRows (nodeNames);
+        }
+    }
+}
+
+//__________________________________________________________
+
+void  _HYTreePanel::HandleSelection (char menuChoice)
+{
+    switch (menuChoice) {
+    case 0: { // Select subtree
+        SelectEntireSubtree();
+        break;
+    }
+
+    case 1: { // Show incomplete
+        SelectIncompleteBranches();
+        break;
+    }
+
+    case 2: { // Show w/o models
+        SelectBranchesWithoutModel();
+        break;
+    }
+
+    case 3: { // branches by name
+        SelectBranchesByName();
+        break;
+    }
+
+    case 4: { // branches by name
+        SelectBranchesByLength();
+        break;
+    }
+
+    case 5: { // invert selection
+        InvertSelection();
+        break;
+    }
+
+    case 6: { // grow selection
+        GrowSelection();
+        break;
+    }
+
+    case 7: { // find selection in data panel
+        HighlightSelectionInDataPanel();
+        break;
+    }
+
+    case 8: { // find selection in data panel
+        ShowSelectionInAnotherTree ();
+        break;
+    }
+    }
+}
+
+//__________________________________________________________
+
+void  _HYTreePanel::HandleSearchAndReplace (bool selectionOnly)
+{
+    _TheTree* meTree = LocateMyTreeVariable();
+
+    if (meTree) {
+        _String p1 ("Search for:"),
+                p2 ("Replace with:");
+
+        if (EnterString2Dialog (sandrString1, sandrString2, p1, p2, (Ptr)this)) {
+            _List   oldNames,
+                    newNames;
+
+            long    cutAt = meTree->GetName()->sLength+1;
+
+            node<nodeCoord>* currentNd = NodeTraverser(coordTree);
+            while (currentNd->parent) {
+                if (currentNd->in_object.branchName.sLength) {
+                    if ((selectionOnly && (currentNd->in_object.flags|=HY_BRANCH_SELECT)) || (!selectionOnly)) {
+                        _String nodeName  = LocateVar(currentNd->in_object.varRef)->GetName()->Cut(cutAt,-1),
+                                repString = nodeName.Replace (sandrString1, sandrString2, true);
+
+                        if ((!repString.Equal (&nodeName)) && repString.IsValidIdentifier()) {
+                            oldNames && & nodeName;
+                            newNames && & repString;
+                        }
+                    }
+                }
+                currentNd = NodeTraverser((node<nodeCoord>*)nil)    ;
+            }
+
+
+            if (oldNames.lLength) {
+                _HYDataPanel* thisDP = nil;
+
+                for (long dpID=0; dpID<windowObjects.lLength; dpID++) {
+                    _HYWindow * thisWindow = (_HYWindow*)windowObjectRefs(dpID);
+
+                    if (thisWindow->WindowKind() == HY_WINDOW_KIND_DATAPANEL && ((_HYDataPanel*)thisWindow)->DependOnTree (meTree->GetAVariable())) {
+                        thisDP = (_HYDataPanel*) thisWindow;
+                        break;
+                    }
+                }
+
+                if (thisDP) {
+                    if (updateInDataPanel == false) {
+                        _String rid = _String("This tree is attached to data panel ") & thisDP->GetTitle() & ". Would you like to change sequence names in that window as well?";
+                        if (!ProceedPromptWithCheck (rid,donotWarnAgain,updateInDataPanel,(Ptr)this)) {
+                            thisDP = nil;
+                        }
+                    }
+                }
+
+                if (thisDP) {
+                    ((_HYSequencePane*)thisDP->GetObject (0))->BatchRenameSequences (oldNames,newNames);
+                }
+
+                BufferToConsole ("\n");
+                _String prefix = *meTree->GetName() & '.';
+
+                for (long k=0; k<oldNames.lLength; k++) {
+                    p1 =   *(_String*)oldNames(k);
+                    p2 =   *(_String*)newNames(k);
+
+                    StringToConsole (p1);
+                    BufferToConsole (" => ");
+                    StringToConsole (p2);
+                    BufferToConsole ("\n");
+
+                    p1 = prefix & p1;
+                    p2 = prefix & p2;
+
+                    RenameVariable (&p1,&p2);
+                }
+
+                PrepareUndoData (-1);
+                _SimpleList     saveSel;
+                PreserveSelection (saveSel);
+                BuildTree(true);
+                RestoreSelection (saveSel);
+                if (likeFuncID>=0) {
+                    postChangeLFEvent(GetID(),likeFuncID);
+                }
+                RenderTree ();
+            }
+        }
+    }
+}
+
+//__________________________________________________________
+
+void  _HYTreePanel::HandleComparison (char menuChoice)
+{
+    _TheTree* meTree = LocateMyTreeVariable(),
+              * me = nil;
+
+    if (meTree) {
+        _List           choices;
+
+        _SimpleList     all,
+                        selectors;
+
+        selectors << 0;
+        selectors << 1;
+
+#ifndef USE_AVL_NAMES
+        for (long vi = 0; vi < variableNames.lLength; vi++)
+#else
+        _SimpleList tcache;
+        long        ti,
+                    vi = variableNames.Traverser (tcache, ti, variableNames.GetRoot());
+
+        for (; vi >=0 ; vi = variableNames.Traverser (tcache, ti))
+#endif
+        {
+            _Variable* vv = (_Variable*)FetchVar(vi);
+            if ((vv->ObjectClass () == TREE) && (vv!=meTree)) {
+                _List   aChoice;
+                aChoice << vv->GetName();
+                aChoice << vv->GetName();
+                choices && & aChoice;
+                all << all.lLength;
+            }
+        }
+
+        if (choices.lLength) {
+            long choice = HandleListSelection (choices,selectors, all, "Target for comparison", all,1);
+            if (choice>=0) {
+                me = (_TheTree*)FetchVar(LocateVarByName(*(_String*)(*(_List*)choices(choice))(0)));
+            }
+        } else {
+            _String treeError ("No other tree variables are presently resident in memory. Nothing to compare to!");
+            ProblemReport (treeError);
+        }
+        if (me) {
+            switch (menuChoice) {
+            case 0: { // compare equal
+                _String res = meTree->CompareTrees (me);
+                ProblemReport (res, (Ptr)this);
+                break;
+            }
+
+            case 1: { // find subtree
+                node <long>* n1 = nil;
+                _CalcNode* travNode = meTree->DepthWiseTraversal (true);
+                while (travNode) {
+                    if (travNode->theIndex==selectionTop->in_object.varRef) {
+                        n1 = &meTree->GetCurrentNode();
+                        break;
+                    }
+                    travNode = meTree->DepthWiseTraversal();
+                }
+                if (n1) {
+                    _String res = me->CompareSubTrees (meTree,n1);
+                    if (!res.beginswith("No")) {
+                        _String cres (res,res.FirstSpaceIndex(0,-1,-1)+1,res.sLength-2);
+                        postSetTreePanelSelection (me->GetAVariable(), &cres);
+                    }
+                    ProblemReport (res, (Ptr)this);
+                }
+                break;
+            }
+
+            case 2: { // Show max common subtree
+                long    sizeVar = 0;
+                _String res = meTree->FindMaxCommonSubTree (me, sizeVar, nil);
+
+                if (!res.sLength) {
+                    res = "No common subtrees";
+                    ProblemReport (res, (Ptr)this);
+                } else {
+                    _List sel;
+                    sel && & res;
+                    SelectRangeAndScroll (sel);
+                    SelectEntireSubtree  ();
+                    res = _String ("Maximal subtree found and selected. The subtree contains ") & sizeVar & " leaves.";
+                    ProblemReport (res, (Ptr)this);
+                }
+
+                break;
+            }
+
+            case 3: { // max forest
+                long        sizeVar = 0;
+                _List       forest;
+
+                _String res = meTree->FindMaxCommonSubTree (me, sizeVar, &forest);
+
+                if (forest.lLength==0) {
+                    res = "No common subtrees";
+                    ProblemReport (res, (Ptr)this);
+                } else {
+                    forest.Sort();
+                    SelectRangeAndScroll (forest);
+                    res = _String ("Maximal forest found and selected. The forest contains ") & sizeVar & " leaves.";
+                    GrowSelection();
+                    ProblemReport (res, (Ptr)this);
+                }
+
+                break;
+            }
+            case 4: { // match to pattern
+                _String res = me->MatchTreePattern (meTree);
+                ProblemReport (res, (Ptr)this);
+                break;
+            }
+            }
+        }
+    }
+}
+
+//__________________________________________________________
+
+void  _HYTreePanel::SelectBranchesByName   (void)
+{
+    _String             res,
+                        bName  ("_branch_name"),
+                        prompt ("Template(in terms of _branch_name):");
+
+    if (EnterStringDialog   (selectByNameSave,prompt,(Ptr)this)) {
+        res = selectByNameSave;
+        _Variable*       bv = CheckReceptacle (&bName, empty, false);
+
+        node<nodeCoord>* currentNd = NodeTraverser(coordTree),
+                         * parent = nil;
+
+        _FString         bn (empty);
+        bv->SetValue    (&bn);
+        _Formula        tempF (res);
+
+        if (terminateExecution) {
+            terminateExecution = false;
+            return;
+        }
+
+        _PMathObj       fv = tempF.Compute();
+
+        if (terminateExecution||!fv||!(fv->ObjectClass()==NUMBER)) {
+            terminateExecution = false;
+            return;
+        }
+
+        currentSelection.Clear();
+
+        _Parameter  ch = 0,
+                    cv = 0;
+
+        while (currentNd) {
+            parent = currentNd->parent;
+            if (!parent) {
+                break;
+            }
+
+            currentNd->in_object.flags&=HY_BRANCH_DESELECT;
+
+            if (currentNd->in_object.varRef >= 0) {
+                _String*   thisName = LocateVar(currentNd->in_object.varRef)->GetName();
+                bName = thisName->Cut (thisName->FindBackwards (".",0,-1)+1,-1);
+
+                bn.theString->Duplicate(&bName);
+                bv->SetValue (&bn);
+                fv = tempF.Compute();
+                if (fv&&(fv->Value()>0.0)) {
+                    currentNd->in_object.flags|=HY_BRANCH_SELECT;
+                    currentSelection<<(long)currentNd;
+                    ch += currentNd->in_object.h;
+                    cv += currentNd->in_object.v;
+                }
+            }
+            currentNd = NodeTraverser((node <nodeCoord>*)nil)   ;
+        }
+
+        RenderTree();
+        ScrollToSelection (ch, cv);
+    }
+}
+
+//__________________________________________________________
+
+_String  dsSelectorPopulator (_HYWindow *thisWindow)
+{
+    _DataSet *ds = (_DataSet*)dataSetList (((_HYDataPanel*)thisWindow)->GetDSID());
+    return (_String ("Data Set with ") & ds->NoOfSpecies() & " and " & ds->NoOfColumns() & " alignment columns.");
+}
+
+//__________________________________________________________
+
+_String  treeSelectorPopulator (_HYWindow *thisWindow)
+{
+    _TheTree * meTree = ((_HYTreePanel*)thisWindow)->LocateMyTreeVariable();
+
+    _String res;
+    if (meTree) {
+        _PMathObj tc = meTree->TipCount(),
+                  bc = meTree->BranchCount ();
+        res = (_String ("A tree with ") & tc->Value() & " tips and" & bc->Value() & " internal branches.");
+        DeleteObject (tc);
+        DeleteObject (bc);
+    }
+    return res;
+}
+
+
+//__________________________________________________________
+
+long SelectOpenWindowObjects (long objectKind, _String objectDesc, listDescPopulator* popFunction, Ptr caller)
+{
+    _SimpleList  allowedChoices;
+
+    _List           choices;
+
+    _SimpleList     all,
+                    selectors;
+
+    selectors << 0;
+    selectors << 1;
+
+    for (long k=0; k<windowObjects.lLength; k++) {
+        _HYWindow* thisWindow = (_HYWindow*)windowObjectRefs(k);
+        if (caller == (Ptr)thisWindow) {
+            continue;
+        }
+
+        if (thisWindow->WindowKind() == objectKind) {
+            _String  *dsName = &thisWindow->GetTitle();
+            if (dsName->sLength) {
+                _List   aChoice;
+                _String tt = (*popFunction)(thisWindow);
+                if (tt.sLength) {
+                    aChoice << dsName;
+                    aChoice && & tt;
+                    choices && & aChoice;
+                    allowedChoices << k;
+                    all << all.lLength;
+                }
+            }
+        }
+    }
+
+    if (allowedChoices.lLength == 0) {
+        _String       errMsg ("No open ");
+        errMsg = errMsg & objectDesc & "s were found.";
+        ProblemReport (errMsg, caller);
+        return -1;
+    }
+
+    long choice = HandleListSelection (choices,selectors, all, _String("Choose a ") & objectDesc, all,1);
+    if (choice >= 0) {
+        choice = allowedChoices.lData[choice];
+    }
+
+    return choice;
+
+}
+
+//__________________________________________________________
+
+void  _HYTreePanel::HighlightSelectionInDataPanel   (void)
+{
+    long choice = SelectOpenWindowObjects (HY_WINDOW_KIND_DATAPANEL, "data panel", dsSelectorPopulator, (Ptr)this);
+
+    if (choice>=0) {
+        _HYDataPanel * theDP = (_HYDataPanel*)windowObjectRefs(choice);
+
+        _List          selectedNodes;
+
+        for (long k=0; k<currentSelection.lLength; k++) {
+            node<nodeCoord>* nn = (node<nodeCoord>*)currentSelection (k);
+            if (nn->in_object.varRef) {
+                _String upn = nn->in_object.branchName;
+                upn.UpCase();
+                selectedNodes && & upn;
+            }
+        }
+
+        selectedNodes.Sort();
+
+        ((_HYSequencePane*)theDP->GetObject (0))->SelectSequenceNames(selectedNodes);
+    }
+}
+
+//__________________________________________________________
+
+void  _HYTreePanel::ShowSelectionInAnotherTree   (void)
+{
+    long choice = SelectOpenWindowObjects (HY_WINDOW_KIND_TREE, "tree panel", treeSelectorPopulator, (Ptr)this);
+
+    if (choice>=0) {
+        _HYTreePanel * tp        = ((_HYTreePanel*)windowObjectRefs(choice));
+        _TheTree     * otherTree = tp->LocateMyTreeVariable();
+
+        _String        prefix = *otherTree->GetName() & '.';
+        _List          selectedNodes;
+        for (long k=0; k<currentSelection.lLength; k++) {
+            node<nodeCoord>* nn = (node<nodeCoord>*)currentSelection (k);
+            if (nn->in_object.varRef && nn->get_num_nodes() == 0) {
+                _String upn = prefix&nn->in_object.branchName;
+                upn.UpCase();
+                selectedNodes && & upn;
+
+            }
+        }
+
+        selectedNodes.Sort();
+        tp->SelectRangeAndScroll (selectedNodes, true);
+
+        _String errMsg = _String("Selected ") & (long)tp->currentSelection.lLength & '/' & (long)selectedNodes.lLength & " tips";
+        ProblemReport (errMsg, (Ptr)this);
+    }
+}
+
+
+//__________________________________________________________
+
+void  _HYTreePanel::MatchToDataSet (void)
+{
+    _TheTree* meTree = LocateMyTreeVariable();
+
+    if (meTree) {
+        _Constant* tc = (_Constant*) meTree->TipCount ();
+        long       countLeaves = tc->Value();
+        DeleteObject (tc);
+
+        _SimpleList  allowedChoices;
+
+        _List           choices;
+
+        _SimpleList     all,
+                        selectors;
+
+        selectors << 0;
+        selectors << 1;
+
+        for (long k=0; k<dataSetNamesList.lLength; k++) {
+            _String* dsName = (_String*)dataSetNamesList(k);
+            if (dsName->sLength) {
+                _DataSet* ds = (_DataSet*)dataSetList (k);
+                if (ds->NoOfSpecies() >= countLeaves) {
+                    _List   aChoice;
+                    aChoice << dsName;
+                    _String tt = (_String ("Data Set with ") & ds->NoOfSpecies() & " and " & ds->NoOfColumns() & " alignment columns.");
+                    aChoice && & tt;
+                    choices && & aChoice;
+                    allowedChoices << k;
+                    all << all.lLength;
+                }
+            }
+        }
+
+        if (allowedChoices.lLength == 0) {
+            _String       errMsg ("No sufficiently large data sets were found in memory.");
+            ProblemReport (errMsg, (Ptr)this);
+            return;
+        }
+
+        long choice = HandleListSelection (choices,selectors, all, "Target for comparison", all,1);
+        if (choice>=0) {
+            _DataSet* ds = (_DataSet*)dataSetList (allowedChoices.lData[choice]);
+
+            _SimpleList     tipMatches;
+            _CalcNode*      travNode = meTree->StepWiseTraversal(true);
+            _List           tips;
+            long            j,k;
+
+            while (travNode) {
+                if (meTree->IsCurrentNodeATip()) {
+                    _String tipName (*travNode->GetName(),travNode->GetName()->FindBackwards('.',0,-1)+1,-1);
+                    tips&& &tipName;
+                }
+                travNode = meTree->StepWiseTraversal(false);
+            }
+
+            _List  * sortedDSNames = (_List*)ds->GetNames().makeDynamic();
+            sortedDSNames->Sort();
+
+            for (j=0; j<tips.lLength; j++)
+                if ((k = sortedDSNames->BinaryFind((_String*)tips(j))) < 0) {
+                    break;
+                } else {
+                    tipMatches<<k;
+                }
+
+            DeleteObject (sortedDSNames);
+
+            if (j<tips.lLength) {
+                long sj = j;
+                for (j=0; j<tips.lLength; j++) {
+                    _String *thisName = (_String*)tips(j);
+                    k = atoi (thisName->sData);
+                    _String tryAgain (k);
+                    if (tryAgain.Equal(thisName) && k<=tips.lLength) {
+                        tipMatches<<k;
+                    } else {
+                        break;
+                    }
+                }
+
+                if (j==tips.lLength) {
+                    if (tipMatches.Find(0)==-1)
+                        for (j=0; j<tips.lLength; j++) {
+                            tipMatches.lData[j]--;
+                        }
+                } else {
+                    j=sj;
+                }
+
+
+                if (j != tips.lLength) {
+                    _String  errMsg ("Match failed. First offending leaf is labeled '");
+                    errMsg = errMsg & *(_String*)tips (j) & "'.";
+                    ProblemReport (errMsg, (Ptr)this);
+
+                    _List    unmatchedNode;
+                    errMsg = *meTree->GetName () & '.' & *(_String*)tips (j);
+                    unmatchedNode && & errMsg;
+                    SelectRangeAndScroll (unmatchedNode);
+                } else {
+                    _String  errMsg ("Matched by index. Would you like to relabel the tree with names from the data? Be careful with this option if the tree is currently a part of a likelihood function, because some batch language instructions may fail then.");
+                    if (ProceedPrompt (errMsg, (Ptr)this)) {
+                        _CalcNode*      travNode = meTree->StepWiseTraversal(true);
+                        j = 0;
+                        while (travNode) {
+                            if (meTree->IsCurrentNodeATip()) {
+                                _String newName = *meTree->GetName() & '.' & *(_String*)(ds->GetNames())(tipMatches.lData[j++]);
+                                RenameVariable (travNode->GetName(), &newName);
+
+                            }
+                            travNode = meTree->StepWiseTraversal(false);
+                        }
+
+                        BuildTree (true);
+                        RenderTree();
+                    }
+
+                }
+            } else {
+                _String       errMsg ("Successfully matched.");
+                ProblemReport (errMsg, (Ptr)this);
+            }
+        }
+    }
+}
+
+//__________________________________________________________
+
+void  _HYTreePanel::SelectBranchesByLength (void)
+{
+    _String             res,
+                        bName  ("_branch_length"),
+                        prompt ("Template(in terms of _branch_length):"),
+                        cprt   ("Restrict to internal branches");
+
+
+    if (EnterStringDialogWithCheckbox   (selectByBLSave,prompt,cprt,brLengthIntOnly,(Ptr)this)) {
+        res = selectByBLSave;
+        _Variable*       bv = CheckReceptacle (&bName, empty, false);
+
+        node<nodeCoord>* currentNd = NodeTraverser(coordTree),
+                         * parent = nil;
+
+        _Constant        bn (0.0);
+        bv->SetValue    (&bn);
+        _Formula        tempF (res);
+
+        if (terminateExecution) {
+            terminateExecution = false;
+            return;
+        }
+
+        _PMathObj       fv = tempF.Compute();
+
+        if (terminateExecution||!fv||!(fv->ObjectClass()==NUMBER)) {
+            terminateExecution = false;
+            return;
+        }
+
+        currentSelection.Clear();
+
+        _Parameter  ch = 0,
+                    cv = 0;
+
+        while (currentNd) {
+            parent = currentNd->parent;
+            if (!parent) {
+                break;
+            }
+
+            currentNd->in_object.flags&=HY_BRANCH_DESELECT;
+
+            if (currentNd->in_object.varRef >= 0) {
+                if (!brLengthIntOnly || currentNd->get_num_nodes()) {
+                    bn.SetValue(currentNd->in_object.bL);
+                    bv->SetValue (&bn);
+                    fv = tempF.Compute();
+                    if (fv&&(fv->Value()>0.0)) {
+                        currentNd->in_object.flags|=HY_BRANCH_SELECT;
+                        currentSelection<<(long)currentNd;
+                        ch += currentNd->in_object.h;
+                        cv += currentNd->in_object.v;
+
+                        StringToConsole(currentNd->in_object.branchName);
+                        BufferToConsole("\n");
+                    }
+                }
+            }
+            currentNd = NodeTraverser((node <nodeCoord>*)nil)   ;
+        }
+
+        RenderTree();
+        ScrollToSelection (ch, cv);
+    }
+
+}
+
+
+//__________________________________________________________
+
+bool    _HYTreePanel::ProcessEvent (_HYEvent* e)
+{
+    long    f,
+            i,
+            k;
+
+    _String firstArg;
+    if (e->EventClass()==_hyMenuSelChangeEvent)
+        // menu change event here
+    {
+        firstArg = e->EventCode().Cut (0,(f=e->EventCode().Find(','))-1);
+        i = MatchComponentID (firstArg);
+        k = (e->EventCode().Cut (f+1,-1)).toNum();
+        if (i==3) { //layout mode
+            unsigned int nflags = treeFlags&HY_TREEPANEL_LAYOUT_MASK;
+            switch (k) {
+            case 0:
+                nflags|=HY_TREEPANEL_SQUARE;
+                break;
+            case 1:
+                nflags|=HY_TREEPANEL_STRAIGHT;
+                break;
+            case 2:
+                nflags|=HY_TREEPANEL_ARCS;
+                break;
+            case 3:
+                nflags|=HY_TREEPANEL_CIRCULAR;
+                break;
+            }
+            SetFlags (nflags);
+        } else if (i==5) { // scaling var
+            _HYPullDown*  selVar = (_HYPullDown*)GetObject(5);
+            // k == 0 -> unscaled
+            // k > 0 -> scaled
+            treeFlags    = treeFlags&HY_TREEPANEL_SCALING_MASK;
+            treeFlags   |= (k?HY_TREEPANEL_SCALED:HY_TREEPANEL_ALIGNED);
+            switch (k) {
+            case 0:
+                scaleVariable = empty;
+                break;
+            case 1:
+                scaleVariable = expectedNumberOfSubs;
+                break;
+            case 2:
+                scaleVariable = stringSuppliedLengths;
+                break;
+            default:
+                scaleVariable = *selVar->GetMenuItem(k);
+            }
+            if (BuildTree(true)) {
+                RenderTree((treeFlags&HY_TREEPANEL_PROJECTION)==0);
+            }
+        }
+        DeleteObject (e);
+        return true;
+    } else {
+        if (e->EventClass()==_hyButtonPushEvent) {
+            firstArg = e->EventCode().Cut (0,(f=e->EventCode().Find(','))-1);
+            i = MatchComponentID (firstArg);
+            k = (e->EventCode().Cut (f+1,-1)).toNum();
+            if (i==7) { // zoom button bar
+                _HYButtonBar* zoom = (_HYButtonBar*)GetObject (7);
+                if (k==5) { // fit to window
+                    FitToWindow();
+                } else if (k==6) { // fisheye
+                    HandleFisheyeButton ();
+                } else if (k==4) { // change orientation
+                    zoom->ReplaceButton(4,ProcureIconResource(HY_TREEPANEL_ICON_ID+5-IsVertical()));
+                    SetVertical (!IsVertical());
+                } else // expand or contract
+                    if (IsVertical())
+                        switch (k) {
+                        case 0: // expand horizontally
+                            f = vSpace+HY_TREEPANEL_SPACE_STEP;
+                            zoom->EnableButton (0,f<HY_TREEPANEL_MAX_VSPACE);
+                            zoom->EnableButton (2,vSpace<=HY_TREEPANEL_MIN_VSPACE);
+                            SetVSpace(f);
+                            break;
+                        case 1: // expand vertically
+                            f = hSpace+HY_TREEPANEL_SPACE_STEP;
+                            if (f>=HY_TREEPANEL_MAX_HSPACE) {
+                                zoom->EnableButton (1,false);
+                            }
+                            if (hSpace<=HY_TREEPANEL_MIN_HSPACE) {
+                                zoom->EnableButton (3,true);
+                            }
+                            SetHSpace(f);
+                            break;
+                        case 2: // contract horizontally
+                            f = vSpace-HY_TREEPANEL_SPACE_STEP;
+                            if (f<=HY_TREEPANEL_MIN_VSPACE) {
+                                zoom->EnableButton (2,false);
+                            }
+                            if (vSpace>=HY_TREEPANEL_MAX_VSPACE) {
+                                zoom->EnableButton (0,true);
+                            }
+                            SetVSpace(f);
+                            break;
+                        case 3: // contract vertically
+                            f = hSpace-HY_TREEPANEL_SPACE_STEP;
+                            if (f<=HY_TREEPANEL_MIN_HSPACE) {
+                                zoom->EnableButton (3,false);
+                            }
+                            if (hSpace>=HY_TREEPANEL_MAX_HSPACE) {
+                                zoom->EnableButton (1,true);
+                            }
+                            SetHSpace(f);
+                            break;
+                        }
+                    else
+                        switch (k) {
+                        case 0: // expand horizontally
+                            f = hSpace+HY_TREEPANEL_SPACE_STEP;
+                            if (f>=HY_TREEPANEL_MAX_HSPACE) {
+                                zoom->EnableButton (0,false);
+                            }
+                            if (hSpace<=HY_TREEPANEL_MIN_HSPACE) {
+                                zoom->EnableButton (2,true);
+                            }
+                            SetHSpace(f);
+                            break;
+                        case 1: // expand vertically
+                            f = vSpace+HY_TREEPANEL_SPACE_STEP;
+                            if (f>=HY_TREEPANEL_MAX_VSPACE) {
+                                zoom->EnableButton (1,false);
+                            }
+                            if (vSpace<=HY_TREEPANEL_MIN_VSPACE) {
+                                zoom->EnableButton (3,true);
+                            }
+                            SetVSpace(f);
+                            break;
+                        case 2: // contract horizontally
+                            f = hSpace-HY_TREEPANEL_SPACE_STEP;
+                            if (f<=HY_TREEPANEL_MIN_HSPACE) {
+                                zoom->EnableButton (2,false);
+                            }
+                            if (hSpace>=HY_TREEPANEL_MAX_HSPACE) {
+                                zoom->EnableButton (0,true);
+                            }
+                            SetHSpace(f);
+                            break;
+                        case 3: // contract vertically
+                            f = vSpace-HY_TREEPANEL_SPACE_STEP;
+                            if (f<=HY_TREEPANEL_MIN_VSPACE) {
+                                zoom->EnableButton (3,false);
+                            }
+                            if (vSpace>=HY_TREEPANEL_MAX_VSPACE) {
+                                zoom->EnableButton (1,true);
+                            }
+                            SetVSpace(f);
+                            break;
+                        }
+            }
+        } else if (e->EventClass()==_hyRebuildSCanvasEvent) {
+            k = e->EventCode().toNum();
+            for (i=0; i<components.lLength; i++)
+                if (((_HYGuiObject*)components(i))->MatchID(k)) {
+                    break;
+                }
+            if (i==2) {
+                FitToWindow(true);
+            }
+        }
+
+    }
+    DeleteObject (e);
+    return false;
+}
+
+//__________________________________________________________
+
+void    _HYTreePanel::SetTreeString (_String& theString)
+{
+    // need to make the tree variable, eh
+    _String treeStringPrep = _String ("Tree ") & treeName & " = " & theString;
+    ExecuteBLString (treeStringPrep, nil);
+    UpdateScalingVariablesList ();
+}
+
+//__________________________________________________________
+
+void    _HYTreePanel::ClearClipboardContents (void)
+{
+    if (treePanelClipboardRoot) {
+        KillNodesInClipboard (treePanelClipboardRoot);
+        treePanelClipboardRoot = nil;
+    }
+}
+
+//__________________________________________________________
+
+void    _HYTreePanel::SetVariableReference (_String& varName)
+{
+    _TheTree * myTree = (_TheTree *)FetchObjectFromVariableByType (&varName, TREE);
+
+    _HYPullDown* scalingVars = (_HYPullDown*)GetObject (5);
+    long f = scalingVars->MenuItemCount();
+
+    if (myTree) {
+        treeName = varName;
+        for (long k=3; k<f; k++) {
+            scalingVars->DeleteMenuItem(3);
+        }
+
+        _SimpleList newScalingVariables;
+        (myTree)->FindScalingVariables(newScalingVariables);
+        scaleVariable = empty;
+        likeFuncID = -1;
+
+        for (long f=0; f<likeFuncList.lLength; f++) {
+            if (((_String*)likeFuncNamesList(f))->sLength) {
+                _LikelihoodFunction* theLF = (_LikelihoodFunction*)likeFuncList (f);
+                if (theLF->DependOnTree (varName)>=0) {
+                    if (likeFuncID>=0) {
+                        likeFuncID=-1;
+                        break;
+                    } else {
+                        likeFuncID = f;
+                    }
+                }
+            }
+        }
+        UpdateScalingVariablesList ();
+    } else
+        for (long k=3; k<f; k++) {
+            scalingVars->DeleteMenuItem(k);
+        }
+}
+
+//__________________________________________________________
+
+void    _HYTreePanel::UpdateScalingVariablesList (void)
+{
+    _TheTree *t = LocateMyTreeVariable ();
+    if (t) {
+        long k,f, oldSel;
+
+        _List           uE;
+        _SimpleList     nodeList, modelSCV;
+        bool            esubs, blen;
+
+        _HYPullDown* scalingVars = (_HYPullDown*)GetObject (5);
+
+        f = scalingVars->MenuItemCount();
+
+        oldSel = scalingVars->GetSelection();
+
+        for (k=3; k<f; k++) {
+            scalingVars->DeleteMenuItem(3);
+        }
+
+        esubs = t->FindScalingVariables(modelSCV);
+        blen = t->HaveStringBranchLengths();
+        scalingVars->EnableItem(1,esubs);
+        scalingVars->EnableItem(2,blen);
+        if (!esubs) {
+            likeFuncID = -1;
+        }
+
+        _CalcNode       *travNode = t->StepWiseTraversal (true);
+
+        travNode = t->StepWiseTraversal (false);
+        while (travNode) {
+            nodeList<<travNode->GetAVariable();
+            travNode = t->StepWiseTraversal (false);
+        }
+        CompileListOfUserExpressions (nodeList,uE,true);
+
+        for (k=0; k<uE.lLength; k++) {
+            _String *userVar = (_String*)uE(k);
+            if (userVar->sData[0] == '!') {
+                userVar->Trim (1,-1);
+            }
+        }
+
+        uE.Sort();
+
+        for (k=1; k<uE.countitems(); k++) {
+            if (((_String*)uE(k-1))->Equal((_String*)uE(k))) {
+                uE.Delete(k);
+                k--;
+            }
+        }
+
+        for (k=0; k<modelSCV.lLength; k++) {
+            _String modelVar = *LocateVar (modelSCV.lData[k])->GetName();
+            if (uE.Find(&modelVar)<0) {
+                uE.InsertElement (&modelVar,k,true);
+            }
+        }
+
+        for (k=0; k<uE.lLength; k++) {
+            scalingVars->AddMenuItem (*(_String*)uE(k),-1);
+        }
+
+        if (oldSel&&(oldSel<scalingVars->MenuItemCount())) {
+            if (oldSel>2) {
+                scalingVars->ChangeSelection (oldSel);
+                return;
+            }
+            if (oldSel==2) {
+                esubs = false;
+            }
+        }
+        if (esubs) {
+            scalingVars->ChangeSelection (1);
+        } else if (blen) {
+            scalingVars->ChangeSelection (2);
+        } else {
+            scalingVars->ChangeSelection (0);
+        }
+
+    }
+}
+
+//__________________________________________________________
+
+bool    _HYTreePanel::SetHSpace (int newSpace, bool force)
+{
+    if ((newSpace!=hSpace)||force) {
+        _HYCanvas* theCanvas = (_HYCanvas*)GetObject (0),
+                   * theRuler  = (_HYCanvas*)GetObject (2);
+        _HYRect    myDims = theCanvas->GetCanvasSize();
+
+        _Parameter t;
+
+
+        t = ((_Parameter)newSpace)/hSpace;
+        hScale *= t;
+        if (treeFlags&HY_TREEPANEL_CIRCULAR) {
+            ShiftScreenCoordinates (-windowTextMarginH-((treeFlags&HY_TREEPANEL_TIP_LABELS)?textSpace:0),
+                                    -windowTextMarginV,coordTree);
+            Convert2ScreenCoordinates (t,1,0,coordTree);
+            if (treeFlags&HY_TREEPANEL_TIP_LABELS) {
+                ShiftScreenCoordinates (textSpace,0,coordTree);
+            }
+        } else {
+            ShiftScreenCoordinates (-windowTextMarginH,-windowTextMarginV,coordTree);
+            Convert2ScreenCoordinates (t,1,0,coordTree);
+            //ShiftScreenCoordinates (0,-HY_TREEPANEL_MARGIN,coordTree);
+        }
+        hSpace = newSpace;
+
+        bool       isv = IsVertical();
+        t =        coordTree->tree_depth()-1.;
+        int        visTreeWidth = t*hSpace+t,
+                   visWidth = isv?theCanvas->hOrigin+componentB.lData[0]-componentT.lData[0]:
+                              theCanvas->hOrigin+componentR.lData[0]-componentL.lData[0],tmp;
+
+        visTreeWidth += 2*windowTextMarginH
+                        +((treeFlags&HY_TREEPANEL_TIP_LABELS)?textSpace:0);
+
+        if (visTreeWidth > HY_TREEPANEL_MAXSIZE) {
+            visTreeWidth = HY_TREEPANEL_MAXSIZE;
+        }
+        bool change = false;
+
+        tmp = isv?myDims.bottom:myDims.right;
+
+        if (visTreeWidth>tmp) {
+            change = true;
+        } else {
+            if (visWidth<tmp) {
+                change = true;
+                if (visTreeWidth<visWidth) {
+                    visTreeWidth = visWidth;
+                }
+            }
+        }
+        if (change) {
+            if (isv) {
+                theCanvas->SetCanvasSize (visTreeWidth,myDims.right,TREE_PANEL_PIXEL_DEPTH);
+            } else {
+                theCanvas->SetCanvasSize (myDims.bottom,visTreeWidth,TREE_PANEL_PIXEL_DEPTH);
+            }
+            myDims.left = componentL.lData[0];
+            myDims.top = componentT.lData[0];
+            myDims.right = componentR.lData[0];
+            myDims.bottom = componentB.lData[0];
+            theCanvas->SetVisibleSize (myDims);
+
+            if (!isv) {
+                theRuler->SetCanvasSize(HY_TREEPANEL_RULER_EXPANDED,visTreeWidth,TREE_PANEL_PIXEL_DEPTH);
+
+                myDims.left = componentL.lData[2];
+                myDims.top = componentT.lData[2];
+                myDims.right = componentR.lData[2];
+                myDims.bottom = componentB.lData[2];
+                theRuler->SetVisibleSize (myDims);
+            }
+
+#ifdef __HYPHY_GTK__
+            UpdateComponentInfo ();
+#else
+            dim = MinMaxWindowDimensions();
+#endif
+        }
+        RenderTree();
+        //RenderRuler();
+        return true;
+    }
+    return false;
+}
+
+//__________________________________________________________
+
+bool    _HYTreePanel::SetVSpace (int newSpace, bool force, bool render)
+{
+    if ((newSpace!=vSpace)||force) {
+        _Parameter t = ((_Parameter)newSpace)/vSpace;
+        vScale *= t;
+        ShiftScreenCoordinates (0,-windowTextMarginV,coordTree);
+        Convert2ScreenCoordinates (1,t,0,coordTree);
+        ShiftScreenCoordinates (-windowTextMarginH,0,coordTree);
+        vSpace = newSpace;
+        _HYCanvas* theCanvas = (_HYCanvas*)GetObject (0),
+                   * theRuler  = (_HYCanvas*)GetObject (2);
+        _HYRect    myDims = theCanvas->GetCanvasSize();
+        bool       isv = IsVertical();
+        int visTreeWidth = tips*vSpace+2*windowTextMarginV,tmp,
+            visWidth = isv?componentR.lData[0]+theCanvas->vOrigin-componentL.lData[0]:componentB.lData[0]+theCanvas->vOrigin-componentT.lData[0];
+        if (visTreeWidth > HY_TREEPANEL_MAXSIZE) {
+            visTreeWidth = HY_TREEPANEL_MAXSIZE;
+        }
+        bool change = false;
+        tmp = isv?myDims.right:myDims.bottom;
+        if (visTreeWidth>tmp) {
+            change = true;
+        } else {
+            if (visWidth<tmp) {
+                change = true;
+                if (visTreeWidth<visWidth) {
+                    visTreeWidth = visWidth;
+                }
+            }
+        }
+        if (change) {
+            if (isv) {
+                theCanvas->SetCanvasSize (myDims.bottom,visTreeWidth,TREE_PANEL_PIXEL_DEPTH);
+                theRuler->SetCanvasSize (HY_TREEPANEL_RULER_EXPANDED,visTreeWidth,TREE_PANEL_PIXEL_DEPTH);
+                myDims.left = componentL.lData[2];
+                myDims.top = componentT.lData[2];
+                myDims.right = componentR.lData[2];
+                myDims.bottom = componentB.lData[2];
+                theRuler->SetVisibleSize (myDims);
+            } else {
+                theCanvas->SetCanvasSize (visTreeWidth,myDims.right,TREE_PANEL_PIXEL_DEPTH);
+            }
+            myDims.left = componentL.lData[0];
+            myDims.top = componentT.lData[0];
+            myDims.right = componentR.lData[0];
+            myDims.bottom = componentB.lData[0];
+            theCanvas->SetVisibleSize (myDims);
+
+#ifdef __HYPHY_GTK__
+            UpdateComponentInfo ();
+#else
+            dim = MinMaxWindowDimensions();
+#endif
+        }
+        if (render) {
+            RenderTree();
+            return true;
+        }
+    }
+    return false;
+}
+//__________________________________________________________
+
+long    _HYTreePanel::GetUniversalSaveOptions (_List&l)
+{
+    _String option ("Newick String");
+    l&& & option;
+    option = "NEXUS";
+    l&& & option;
+    option = "NEXUS Numeric";
+    l&& & option;
+    option = "PostScript file [cladogram]";
+    l&& & option;
+    option = "PostScript file [radial]";
+    l&& & option;
+    return 5;
+}
+
+//__________________________________________________________
+
+void    _HYTreePanel::FitToWindow (bool force)
+{
+    _TheTree* me = LocateMyTreeVariable();
+    if (me) {
+        _PMathObj   leafCount = me->TipCount();
+        long newHSpace,
+             newVSpace;
+
+        if (treeFlags&HY_TREEPANEL_CIRCULAR) {
+            _Parameter maxHCoord = 0,
+                       maxVCoord = 0;
+
+            node<nodeCoord>* currentNd = NodeTraverser(coordTree);
+            while (currentNd) {
+                if (currentNd->in_object.h>maxHCoord) {
+                    maxHCoord = currentNd->in_object.h;
+                }
+
+                if (currentNd->in_object.v>maxVCoord) {
+                    maxVCoord = currentNd->in_object.v;
+                }
+
+                currentNd = NodeTraverser((node<nodeCoord>*)NULL);
+            }
+            /*if (IsVertical())
+            {
+                newHSpace = maxVCoord;
+                maxVCoord = maxHCoord;
+                maxHCoord = newHSpace;
+            }*/
+
+            if (IsVertical()) {
+                newHSpace = (componentB.lData[0]-componentT.lData[0]-(2*windowTextMarginV
+                             +((treeFlags&HY_TREEPANEL_TIP_LABELS)?textSpace:0)))/maxHCoord*hSpace;
+                newVSpace = (componentR.lData[0]-componentL.lData[0]-2*windowTextMarginH)/maxVCoord*vSpace;
+            } else {
+                newHSpace = (componentR.lData[0]-componentL.lData[0]-(2*windowTextMarginH
+                             +((treeFlags&HY_TREEPANEL_TIP_LABELS)?textSpace:0)))/maxHCoord*hSpace;
+                newVSpace = (componentB.lData[0]-componentT.lData[0]-2*windowTextMarginV)
+                            /maxVCoord*vSpace;
+            }
+        } else {
+            if (IsVertical()) {
+                newHSpace = (componentB.lData[0]-componentT.lData[0]-(2*windowTextMarginV
+                             +((treeFlags&HY_TREEPANEL_TIP_LABELS)?textSpace:0)))/coordTree->tree_depth();
+                newVSpace = (componentR.lData[0]-componentL.lData[0]-2*windowTextMarginH)/
+                            leafCount->Value();
+            } else {
+                newHSpace = (componentR.lData[0]-componentL.lData[0]-(2*windowTextMarginH
+                             +((treeFlags&HY_TREEPANEL_TIP_LABELS)?textSpace:0)))/coordTree->tree_depth();
+                newVSpace = (componentB.lData[0]-componentT.lData[0]-2*windowTextMarginV)/
+                            leafCount->Value();
+            }
+        }
+        DeleteObject (leafCount);
+
+
+        if (force || (newHSpace!=hSpace) || (newVSpace!=vSpace)) {
+            ((_HYCanvas*)GetObject (0))->hOrigin = 0;
+            ((_HYCanvas*)GetObject (0))->vOrigin = 0;
+            if (treeFlags & HY_TREEPANEL_SCALE_TO_WINDOW) {
+                ((_HYStretchCanvas*)GetObject (2))->SetMessageRecipient (nil);
+            }
+            SetVSpace (newVSpace>0?newVSpace:1,false,!force);
+            SetHSpace (newHSpace>0?newHSpace:1,force);
+            if (treeFlags & HY_TREEPANEL_SCALE_TO_WINDOW) {
+                ((_HYStretchCanvas*)GetObject (2))->SetMessageRecipient (this);
+            }
+        }
+    }
+}
+
+//__________________________________________________________
+
+void    _HYTreePanel::SetFlags (unsigned int f)
+{
+    if (treeFlags!=f) {
+        if ((treeFlags & HY_TREEPANEL_SCALED) != (f & HY_TREEPANEL_SCALED)) {
+            treeFlags = f;
+            if (!BuildTree(false)) {
+                return;
+            }
+        } else {
+            if ((treeFlags&HY_TREEPANEL_CIRCULAR)&&(!(f&HY_TREEPANEL_CIRCULAR))) {
+                _TheTree* me = LocateMyTreeVariable();
+                long      tipCount;
+                node<nodeCoord>* newTree;
+                if (!scaleVariable.sLength) {
+                    newTree = me->AlignedTipsMapping(true);
+                } else {
+                    char     mapMode;
+                    _String  scalerString = me->DetermineBranchLengthMappingMode(&scaleVariable, mapMode);
+                    newTree = me->ScaledBranchMapping(nil,&scalerString,0,tipCount,mapMode);
+                }
+                CopyNodeParameters (newTree,coordTree);
+                coordTree->delete_tree();
+                delete  (coordTree);
+                coordTree = newTree;
+                Convert2ScreenCoordinates (hScale,vScale,-coordTree->in_object.h,coordTree);
+            } else {
+                if ((f&HY_TREEPANEL_CIRCULAR)&&(!(treeFlags&HY_TREEPANEL_CIRCULAR))) {
+                    _HYCanvas* theCanvas = (_HYCanvas*)GetObject (0);
+                    CircularLayoutPass1 (coordTree);
+                    CircularLayoutPass2 (coordTree,theCanvas->_HYComponent::GetMaxW()/2,
+                                         theCanvas->_HYComponent::GetMaxH()/2,arcStart,arcEnd,0,nil);
+                }
+            }
+            treeFlags = f;
+        }
+        RenderTree();
+    }
+}
+
+//__________________________________________________________
+
+void    _HYTreePanel::SetScaleVariable (_String& varName)
+{
+    _HYPullDown *sm = (_HYPullDown*)GetObject (5);
+    if (sm->FindMenuItem (varName)<0) {
+        return;
+    }
+
+    if (varName!=scaleVariable) {
+        scaleVariable = varName;
+        if (treeFlags&HY_TREEPANEL_SCALED && BuildTree(true)) {
+            RenderTree();
+        }
+    }
+}
+
+//__________________________________________________________
+
+void    _HYTreePanel::RenderTree2 (void)
+{
+    _HYCanvas* theCanvas = (_HYCanvas*)GetObject (0);
+    if (treeFlags&HY_TREEPANEL_ARCS) {
+        PaintArcs(theCanvas, coordTree);
+    } else if (treeFlags&HY_TREEPANEL_STRAIGHT) {
+        PaintStraight(theCanvas, coordTree);
+    } else if (treeFlags&HY_TREEPANEL_CIRCULAR) {
+        PaintRadial (theCanvas, coordTree);
+    } else {
+        if (IsVertical()) {
+            PaintVSquare(theCanvas, coordTree);
+        } else {
+            PaintSquare(theCanvas, coordTree);
+            if (treeFlags&HY_TREEPANEL_LABEL1) {
+                theCanvas->SetFont(branchLabel1);
+                PaintSquareBranchLabels (theCanvas,coordTree,true);
+            }
+            if (treeFlags&HY_TREEPANEL_LABEL2) {
+                theCanvas->SetFont(branchLabel2);
+                PaintSquareBranchLabels (theCanvas,coordTree,false);
+            }
+        }
+    }
+}
+
+//__________________________________________________________
+
+void    _HYTreePanel::RenderTree (bool map, bool printing)
+{
+    _HYCanvas* theCanvas = (_HYCanvas*)GetObject (0);
+
+    if (map) {
+        if (treeFlags&HY_TREEPANEL_PROJECTION) {
+            treeFlags -= HY_TREEPANEL_PROJECTION;
+            node<nodeCoord>* thisNode = NodeTraverser(coordTree);
+            while (thisNode) {
+                thisNode->in_object.h = thisNode->in_object.auxL;
+                thisNode->in_object.v = thisNode->in_object.auxD;
+                thisNode = NodeTraverser((node<nodeCoord>*)NULL);
+            }
+        }
+        if (treeFlags&HY_TREEPANEL_STRAIGHT) {
+            PreStraightenEdges (coordTree);
+            StraightenEdges(coordTree,0,windowTextMarginV,-1);
+        } else {
+            if (!(treeFlags&HY_TREEPANEL_CIRCULAR)) {
+                _Parameter offset = windowTextMarginV;
+                SpaceNodes (coordTree,offset);
+            }
+        }
+    }
+    if (!printing) {
+        theCanvas->StartDraw();
+    }
+
+    theCanvas->SetFont(treeLabelFont);
+    theCanvas->EraseAll();
+
+    RenderTree2();
+
+    if (!printing) {
+        theCanvas->EndDraw();
+        theCanvas->_MarkForUpdate();
+        RenderNavTree ();
+    }
+    RenderRuler(1.0,printing);
+}
+
+//__________________________________________________________
+
+void    _HYTreePanel::RenderRuler (_Parameter hsc, bool printing, int hshift, int vshift)
+{
+    _HYCanvas* theRuler = (_HYCanvas*)GetObject (2);
+    if (!printing) {
+        theRuler->StartDraw();
+        theRuler->EraseAll();
+    }
+    if ((scaleVariable.sLength)&&(!IsVertical())) {
+        long       rulerWidth = treeLength*hScale*hsc, scaleStep, hashScale,k,leftOver,oldRulerW;
+        _Parameter tickScale, flScale;
+
+        _HYRect  r = {HY_TREEPANEL_RULER_EXPANDED-4+vshift,windowTextMarginH+hshift,
+                      HY_TREEPANEL_RULER_EXPANDED-4+vshift,windowTextMarginV+rulerWidth+hshift,1
+                     };
+
+        hashScale = floor(log10(treeLength));
+        tickScale = exp(log(10.0)*hashScale);
+        hashScale = floor(treeLength/tickScale);
+        if (hashScale<2) {
+            tickScale/=10.0;
+            hashScale = floor(treeLength/tickScale);
+        }
+
+        _HYFont  rulerFont;
+#ifdef __WINDOZE__
+        rulerFont.face = "LucidaConsole";
+        rulerFont.size = 10;
+#else
+#ifdef __HYPHY_GTK__
+        rulerFont.face = _HY_SANS_FONT;
+        rulerFont.size = 9;
+#else
+        rulerFont.face = "Helvetica";
+        rulerFont.size = 9;
+#endif
+#endif
+
+        rulerFont.style = HY_FONT_PLAIN;
+        theRuler->SetFont (rulerFont);
+
+        theRuler->DrawLine(r);
+        r.right = r.left;
+        r.top   -=  8;
+        theRuler->DrawLine(r);
+        r.right +=  rulerWidth;
+        r.left+=rulerWidth;
+        theRuler->DrawLine(r);
+
+        r.left  = windowTextMarginH+hshift;
+        r.right = windowTextMarginH+hshift;
+        char    buff[255];
+        snprintf (buff, sizeof(buff),"%.4g",treeLength);
+        theRuler->DisplayText (_String (buff), HY_TREEPANEL_RULER_EXPANDED-5+vshift,windowTextMarginH+rulerWidth+3+hshift,true);
+        oldRulerW = rulerWidth;
+        _Parameter t = hashScale*tickScale/treeLength;
+        rulerWidth*=t;
+        scaleStep = rulerWidth/hashScale;
+        leftOver = rulerWidth-scaleStep*hashScale;
+        flScale = tickScale;
+        tickScale = ((_Parameter)leftOver)/hashScale;
+        t = 0.0;
+        for (k=1; k<=hashScale; k++) {
+            r.left+=scaleStep;
+            r.right+=scaleStep;
+            t+=tickScale;
+            if (t>=1.0) {
+                r.left++;
+                r.right++;
+                t-=1.0;
+            }
+            theRuler->DrawLine(r);
+            _String l (flScale*k);
+            if (GetVisibleStringWidth(l,rulerFont)<MIN(scaleStep-8,windowTextMarginH+oldRulerW+hshift-r.right-8)) {
+                theRuler->DisplayText (l, r.bottom-2,r.left+4,true);
+            }
+        }
+    }
+    if (!printing) {
+        theRuler->EndDraw();
+        theRuler->_MarkForUpdate();
+    }
+}
+
+
+//__________________________________________________________
+
+void    _HYTreePanel::RenderNavTree (void)
+{
+    _HYCanvas* theCanvas = (_HYCanvas*)GetObject (1),
+               * bigCanvas = (_HYCanvas*)GetObject (0);
+    _Parameter hScale, vScale;
+    hScale = (HY_TREEPANEL_NAVSIZE-4)/(_Parameter)(bigCanvas->GetCanvasSize().right);
+    vScale = (HY_TREEPANEL_NAVSIZE-4)/(_Parameter)(bigCanvas->GetCanvasSize().bottom);
+    theCanvas->StartDraw();
+    theCanvas->EraseAll();
+    _HYRect r;
+    r.top = 0;
+    r.left = 0;
+    r.bottom = HY_TREEPANEL_NAVSIZE-1;
+    r.right = HY_TREEPANEL_NAVSIZE-1;
+    r.width = 1;
+    theCanvas->SetColor (navFill);
+    theCanvas->FillRect (r);
+    theCanvas->SetColor (black);
+    theCanvas->DrawRect (r);
+    //theCanvas->DrawFrame (hyDefaultFrameColor);
+    if (treeFlags&HY_TREEPANEL_ARCS) {
+        IsVertical()?PaintNArcs(theCanvas, coordTree, vScale, hScale):PaintNArcs(theCanvas, coordTree, hScale, vScale);
+    } else if (treeFlags&(HY_TREEPANEL_STRAIGHT|HY_TREEPANEL_CIRCULAR)) {
+        IsVertical()?PaintNStraight(theCanvas, coordTree, vScale, hScale):PaintNStraight(theCanvas, coordTree, hScale, vScale);
+    } else {
+        IsVertical()?PaintNVSquare(theCanvas, coordTree, vScale, hScale):PaintNSquare(theCanvas, coordTree, hScale, vScale);
+    }
+    theCanvas->EndDraw();
+#ifndef __MAC__
+    theCanvas->_MarkForUpdate();
+#endif
+}
+
+//__________________________________________________________
+
+void    _HYTreePanel::Update (Ptr p)
+{
+    _HYTWindow::Update(p);
+    if ((treeFlags&HY_TREEPANEL_SCALE_TO_WINDOW) == 0) {
+#ifdef __MAC__
+        _HYCanvas* theCanvas = (_HYCanvas*)GetObject (1);
+        forceUpdateForScrolling=true;
+        theCanvas->_MarkForUpdate();
+        forceUpdateForScrolling=false;
+#endif
+        _PaintNavRect();
+    } else {
+        _PaintLFStatus();
+    }
+}
+
+//__________________________________________________________
+
+void    _HYTreePanel::Paint (Ptr p)
+{
+    _HYTWindow::Paint(p);
+    if ((treeFlags&HY_TREEPANEL_SCALE_TO_WINDOW) == 0) {
+#ifdef __MAC__
+        _HYCanvas* theCanvas = (_HYCanvas*)GetObject (1);
+        forceUpdateForScrolling=true;
+        theCanvas->_MarkForUpdate();
+        forceUpdateForScrolling=false;
+#endif
+        _PaintNavRect();
+    } else {
+        _PaintLFStatus();
+    }
+}
+
+//__________________________________________________________
+
+void    _HYTreePanel::SetVertical (bool toggle)
+{
+    _HYCanvas* theCanvas = (_HYCanvas*)GetObject (0);
+    int        treeHeight = 2*windowTextMarginV+tips*vSpace,
+               treeWidth = 2*windowTextMarginH+textSpace+coordTree->tree_depth()*hSpace;
+    if (toggle) {
+        if (!(treeFlags&HY_TREEPANEL_VERTICAL)) {
+            treeFlags|=HY_TREEPANEL_VERTICAL;
+            theCanvas->SetOrigin(0,0);
+            ResizeTreeCanvas (treeWidth-textSpace+windowTextMarginH,treeHeight+textSpace);
+            RenderTree();
+            RenderRuler();
+        }
+    } else if (treeFlags&HY_TREEPANEL_VERTICAL) {
+        treeFlags-=HY_TREEPANEL_VERTICAL;
+        theCanvas->SetOrigin(0,0);
+        ResizeTreeCanvas (treeHeight,treeWidth);
+        RenderTree();
+        RenderRuler();
+    }
+}
+
+//__________________________________________________________
+void    _HYTreePanel::ResizeTreeCanvas (int newH, int newW)
+{
+
+    _HYCanvas* theCanvas = (_HYCanvas*)GetObject (0);
+    _HYRect    myDims = theCanvas->GetCanvasSize();
+    if (newH > HY_TREEPANEL_MAXSIZE) {
+        newH = HY_TREEPANEL_MAXSIZE;
+    }
+    if (newW > HY_TREEPANEL_MAXSIZE) {
+        newW = HY_TREEPANEL_MAXSIZE;
+    }
+    int visH = componentB.lData[0]+theCanvas->vOrigin-componentT.lData[0],
+        visW = theCanvas->hOrigin+componentR.lData[0]-componentL.lData[0];
+
+    bool change = false;
+    if (newH>myDims.bottom) {
+        change = true;
+    } else {
+        if (newH<myDims.bottom) {
+            change = true;
+            if (newH<visH) {
+                newH = visH;
+            }
+        }
+    }
+    if (newW>myDims.right) {
+        change = true;
+    } else {
+        if (newW<myDims.right) {
+            change = true;
+            if (newW<visW) {
+                newW = visW;
+            }
+        }
+    }
+    if (change) {
+        theCanvas->SetCanvasSize (newH,newW,TREE_PANEL_PIXEL_DEPTH);
+        myDims.left = componentL.lData[0];
+        myDims.top = componentT.lData[0];
+        myDims.right = componentR.lData[0];
+        myDims.bottom = componentB.lData[0];
+        theCanvas->SetVisibleSize (myDims);
+
+        dim = MinMaxWindowDimensions();
+    }
+}
+
+//__________________________________________________________
+
+bool    _HYTreePanel::BuildTree (bool saveOrigin)
+{
+    _TheTree* me = LocateMyTreeVariable();
+    if      (!me) {
+        return false;
+    }
+
+    dumpCoordTree         ();
+    currentSelection.Clear();
+    hScale = vScale = 1.0;
+
+    long            f,
+                    tipCount;
+
+    _Parameter      treeWidth,
+                    treeHeight,
+                    visTreeWidth,
+                    visTreeHeight;
+
+    _String         newStatusString;
+    bool            scaling = false;
+
+
+    if ((treeFlags&HY_TREEPANEL_SCALED) && scaleVariable.sLength) {
+        scaling = true;
+    }
+
+    if (!scaling) {
+        coordTree = me->AlignedTipsMapping(true);
+    } else {
+        char     mapMode;
+        _String  scalerString = me->DetermineBranchLengthMappingMode(&scaleVariable, mapMode);
+        coordTree = me->ScaledBranchMapping(nil,&scalerString,0,tipCount,mapMode);
+    }
+
+    treeWidth       = -coordTree->in_object.h;
+    tipCount        = coordTree->tree_depth();
+    newStatusString = newStatusString&"Depth = "&tipCount;
+
+    _HYCanvas* theCanvas = (_HYCanvas*)GetObject (0),
+               * theRuler  = (_HYCanvas*)GetObject (2);
+    textSpace = 0;
+    node<nodeCoord>* currentNd = NodeTraverser(coordTree);
+    while (currentNd) {
+        if (currentNd->in_object.varRef>=0) {
+            _String* intLabel = LocateVar(currentNd->in_object.varRef)->GetName();
+            currentNd->in_object.branchName = intLabel->Cut(intLabel->FindBackwards('.',0,-1)+1,-1);
+            f = GetVisibleStringWidth (currentNd->in_object.branchName,treeLabelFont);
+            currentNd->in_object.textWidth = f;
+            if ((currentNd->get_num_nodes()==0)&&(f>textSpace)) {
+                textSpace = f;
+            }
+        } else {
+            currentNd->in_object.textWidth = 0;
+            currentNd->in_object.branchName = empty;
+        }
+        currentNd->in_object.flags = 0;
+        currentNd = NodeTraverser((node<nodeCoord>*)NULL);
+    }
+
+    visTreeWidth = (tipCount-1)*hSpace;
+    hScale = visTreeWidth/treeWidth;
+    visTreeWidth += 2*windowTextMarginH
+                    +((treeFlags&HY_TREEPANEL_TIP_LABELS)?textSpace:0);
+    if (visTreeWidth>HY_TREEPANEL_MAXSIZE) {
+        visTreeWidth=HY_TREEPANEL_MAXSIZE;
+        hScale = (visTreeWidth-2*windowTextMarginH
+                  -((treeFlags&HY_TREEPANEL_TIP_LABELS)?textSpace:0))/treeWidth;
+    }
+
+    currentNd = coordTree;
+
+    tipCount = currentNd->get_num_nodes();
+
+    while (tipCount) {
+        currentNd = currentNd->go_down(1);
+        tipCount = currentNd->get_num_nodes();
+    }
+
+    treeHeight = currentNd->in_object.v;
+    currentNd = coordTree;
+    tipCount = currentNd->get_num_nodes();
+
+    while (tipCount) {
+        currentNd = currentNd->go_down(tipCount);
+        tipCount = currentNd->get_num_nodes();
+    }
+
+    treeHeight = currentNd->in_object.v - treeHeight;
+    _PMathObj   leafCount = me->TipCount();
+    newStatusString = newStatusString&". Leaf Count = "&_String((long)leafCount->Value());
+    tips = leafCount->Value();
+    if (likeFuncID>=0) {
+        _LikelihoodFunction* theLF = (_LikelihoodFunction*)likeFuncList(likeFuncID);
+        theLF->PrepareToCompute();
+        newStatusString = newStatusString&". Ln-likelihood = "&_String(theLF->Compute());
+        if (!isInOptimize) {
+            theLF->DoneComputing();
+        }
+    }
+    if (scaling) {
+        treeLength = treeWidth;
+    } else {
+        treeLength = 0;
+    }
+    visTreeHeight = (tips-1)*vSpace;
+    vScale = visTreeHeight/treeHeight;
+    visTreeHeight+=2*windowTextMarginV;
+    if (visTreeHeight>HY_TREEPANEL_MAXSIZE) {
+        visTreeHeight=HY_TREEPANEL_MAXSIZE;
+        vScale = (visTreeHeight-2*windowTextMarginV)/treeHeight;
+    }
+    Convert2ScreenCoordinates (hScale,vScale,-coordTree->in_object.h,coordTree);
+    _HYRect    myDims = theCanvas->GetCanvasSize();
+    scaling = false;
+    if (visTreeHeight!=myDims.bottom) {
+        scaling = true;
+        myDims.bottom = visTreeHeight;
+        if (myDims.bottom<HY_TREEPANEL_NAVSIZE) {
+            myDims.bottom = HY_TREEPANEL_NAVSIZE;
+        }
+    }
+    if (visTreeWidth!=myDims.right) {
+        scaling = true;
+        myDims.right = visTreeWidth;
+        if (myDims.right<HY_TREEPANEL_DEFSIZE) {
+            myDims.right = HY_TREEPANEL_DEFSIZE;
+        }
+    }
+    long  saveH = theCanvas->hOrigin,
+          saveV = theCanvas->vOrigin;
+    Relabel (me);
+    if (scaling) {
+        if (IsVertical()) {
+            theCanvas->SetCanvasSize (myDims.right,MAX(myDims.bottom,HY_TREEPANEL_DEFSIZE),TREE_PANEL_PIXEL_DEPTH);
+            theRuler->SetCanvasSize(HY_TREEPANEL_RULER_EXPANDED,MAX(myDims.bottom,HY_TREEPANEL_DEFSIZE),TREE_PANEL_PIXEL_DEPTH);
+        } else {
+            theCanvas->SetCanvasSize (myDims.bottom,myDims.right,TREE_PANEL_PIXEL_DEPTH);
+            theRuler->SetCanvasSize(HY_TREEPANEL_RULER_EXPANDED,myDims.right,TREE_PANEL_PIXEL_DEPTH);
+        }
+        UpdateComponentInfo();
+        if (saveOrigin) {
+            theCanvas->SetOrigin (saveV,saveH);
+            if (!IsVertical()) {
+                theRuler->SetOrigin (0,saveH);
+            }
+        }
+    }
+
+    if (treeFlags&HY_TREEPANEL_SCALE_TO_WINDOW) {
+        FitToWindow();
+    }
+
+    if (treeFlags&HY_TREEPANEL_CIRCULAR) {
+        CircularLayoutPass1 (coordTree);
+        CircularLayoutPass2 (coordTree,theCanvas->_HYComponent::GetMaxW()/2,
+                             theCanvas->_HYComponent::GetMaxH()/2,arcStart,arcEnd,0,nil);
+    }
+
+
+    DeleteObject (leafCount);
+    SetStatusBar (newStatusString);
+    return true;
+}
+
+//__________________________________________________________
+
+void  _HYTreePanel::Convert2ScreenCoordinates (_Parameter hScale, _Parameter vScale, _Parameter offset, node<nodeCoord>* cNode)
+{
+    cNode->in_object.h = (cNode->in_object.h+offset)*hScale+windowTextMarginH;
+    cNode->in_object.v = cNode->in_object.v*vScale+windowTextMarginV;
+    for (int i=cNode->get_num_nodes(); i; i--) {
+        Convert2ScreenCoordinates (hScale,vScale,offset,cNode->go_down(i));
+    }
+}
+
+//__________________________________________________________
+
+void  _HYTreePanel::ShiftScreenCoordinates (_Parameter hShift, _Parameter vShift,node<nodeCoord>* cNode)
+{
+    cNode->in_object.h += hShift;
+    cNode->in_object.v += vShift;
+    for (int i=cNode->get_num_nodes(); i; i--) {
+        ShiftScreenCoordinates (hShift,vShift,cNode->go_down(i));
+    }
+}
+
+//__________________________________________________________
+
+void  _HYTreePanel::StraightenEdges (node<nodeCoord>* cNode,_Parameter slope, _Parameter offset, int m)
+{
+    node<nodeCoord>* theParent = cNode->get_parent(), *c;
+    int n = cNode->get_num_nodes(),j,k=0;
+    _Parameter t;
+    for (j=1; j<=n/2; j++) {
+        k+=cNode->go_down(j)->in_object.auxL;
+    }
+
+    if (!theParent) {
+        cNode->in_object.v = k*vSpace+offset;
+    }
+
+    k = 0;
+    for (j=1; j<=n/2; j++) {
+        c = cNode->go_down(j);
+        k+=c->in_object.auxL;
+        if (j!=m) {
+            t = -(cNode->in_object.v-offset)/(c->in_object.auxD-cNode->in_object.h);
+        } else {
+            t = slope;
+        }
+        c->in_object.v = cNode->in_object.v+t*(c->in_object.h-cNode->in_object.h);
+        StraightenEdges (c,t,offset,j);
+        offset+=c->in_object.auxL*vSpace;
+    }
+    k=0;
+    for (j=n/2+1; j<=n; j++) {
+        c = cNode->go_down(j);
+        k+=c->in_object.auxL;
+        if (j!=m) {
+            t = ((k-1)*vSpace+offset-cNode->in_object.v)/(c->in_object.auxD-cNode->in_object.h);
+        } else {
+            t = slope;
+        }
+        c->in_object.v = cNode->in_object.v+t*(c->in_object.h-cNode->in_object.h);
+        StraightenEdges (c,t,offset,j);
+        offset+=c->in_object.auxL*vSpace;
+    }
+}
+
+//__________________________________________________________
+
+long  _HYTreePanel::CircularLayoutPass1 (node<nodeCoord>* cNode)
+/* this function will populate the auxL member of nodeCoord
+   with the total number of leaves at or below this node
+*/
+{
+    int n = cNode->get_num_nodes();
+    if (n) {
+        cNode->in_object.auxL = 0;
+        for (; n; n--) {
+            cNode->in_object.auxL += CircularLayoutPass1 (cNode->go_down(n));
+        }
+    } else {
+        cNode->in_object.auxL = 1;
+    }
+    return cNode->in_object.auxL;
+}
+
+//__________________________________________________________
+
+void  _HYTreePanel::CircularLayoutPass2 (node<nodeCoord>* cNode, _Parameter cH, _Parameter cV, _Parameter arc1, _Parameter arc2, _Parameter d, long* minMax)
+{
+    long n  =   cNode->get_num_nodes(),
+         k ;
+    if (n) { // an internal node
+        _Parameter step     = (arc2-arc1)/cNode->in_object.auxL; // angle per child
+        node<nodeCoord>*      tNode;
+        if (cNode->parent) {
+            _Parameter dn = d-cNode->parent->in_object.h+cNode->in_object.h;
+            for (k=1; k<=n; k++) {
+                tNode = cNode->go_down(k);
+                arc2 = arc1 + step*tNode->in_object.auxL;
+                CircularLayoutPass2 (tNode,cH,cV,arc1,arc2,dn,minMax);
+                arc1 = arc2;
+            }
+        } else {
+            minMax = new long[4];
+            minMax[0] = cH-2;
+            minMax[1] = cH+2;
+            minMax[2] = cV-2;
+            minMax[3] = cV+2;
+            for (k=1; k<=n; k++) {
+                tNode = cNode->go_down(k);
+                arc2 = arc1 + step*tNode->in_object.auxL;
+                CircularLayoutPass2 (tNode,cH,cV,arc1,arc2,0,minMax);
+                arc1 = arc2;
+            }
+        }
+        arc1 = arc2 - step*cNode->in_object.auxL;
+    }
+    if (cNode->parent) {
+        arc1 = (arc1+arc2)*0.5;
+        d += cNode->in_object.h - cNode->parent->in_object.h;
+        d *= .25;
+        cNode->in_object.h = cH+d*cos (arc1);
+        cNode->in_object.v = cV-d*sin (arc1);
+        minMax[0] = MIN(minMax[0],cNode->in_object.h);
+        minMax[1] = MAX(minMax[1],cNode->in_object.h);
+        minMax[2] = MIN(minMax[2],cNode->in_object.v);
+        minMax[3] = MAX(minMax[3],cNode->in_object.v);
+        cNode->in_object.h -= cH;
+        cNode->in_object.v -= cV;
+    } else { // this is the root node
+        if (treeFlags&HY_TREEPANEL_TIP_LABELS) {
+            arc1 = (_Parameter)(cH*2-windowTextMarginH-2*textSpace)/(minMax[1]-minMax[0]);
+        } else {
+            arc1 = (_Parameter)(cH*2-windowTextMarginH)/(minMax[1]-minMax[0]);
+        }
+        arc2 = (_Parameter)(cV*2-2*windowTextMarginV-treeLabelFont.size)/(minMax[3]-minMax[2]);
+        cH = 2.*cH*(cH-minMax[0])/(minMax[1]-minMax[0]);
+        cV = 2.*cV*(cV-minMax[2])/(minMax[3]-minMax[2]);
+        cNode->in_object.h = 0;
+        cNode->in_object.v = 0;
+        CircularLayoutPass3 (cNode,cH,cV,arc1,arc2);
+        delete minMax;
+    }
+    cNode->in_object.auxL = 0;
+}
+
+//__________________________________________________________
+
+void  _HYTreePanel::CircularLayoutPass3 (node<nodeCoord>* cNode, _Parameter cH, _Parameter cV, _Parameter hs, _Parameter vs)
+{
+    int n = cNode->get_num_nodes();
+    if (n) {
+        for (; n; n--) {
+            CircularLayoutPass3 (cNode->go_down(n),cH,cV,hs,vs);
+        }
+    }
+    cNode->in_object.h = cH+(cNode->in_object.h)*hs;
+    cNode->in_object.v = cV+(cNode->in_object.v)*vs;
+}
+//__________________________________________________________
+
+long  _HYTreePanel::FindSelection (long h, long v, char flag)
+{
+    long res = 0, addWidth;
+    bool shiftDown   = (flag&0x01)>0,
+         optionDown  = (flag&0x02)>0,
+         commandDown = ((flag&0x04)>0)&&selectionTop;
+    if (commandDown)
+        if (!selectionTop->parent->parent) {
+            commandDown = false;
+        }
+    node<nodeCoord>* currentNd = NodeTraverser(coordTree), *parent = nil;
+
+    if (!(shiftDown||commandDown)) {
+        currentSelection.Clear();
+    }
+    while (currentNd) {
+        addWidth = 0;
+        parent = currentNd->parent;
+        if (!parent) {
+            break;
+        }
+        if (treeFlags&HY_TREEPANEL_TIP_LABELS) {
+            if (currentNd->get_num_nodes()==0) {
+                addWidth = currentNd->in_object.textWidth+(treeLabelFont.size/2);
+            }
+        }
+        if (treeFlags&HY_TREEPANEL_INT_LABELS) {
+            if (currentNd->get_num_nodes()!=0) {
+                addWidth = currentNd->in_object.textWidth+(treeLabelFont.size/2);
+            }
+        }
+
+        if (treeFlags&HY_TREEPANEL_CIRCULAR) {
+            if (((h<currentNd->in_object.h)&&(h>parent->in_object.h))||
+                    ((h>currentNd->in_object.h)&&(h<parent->in_object.h))) {
+                _Parameter lineSlope = ((_Parameter)currentNd->in_object.v-parent->in_object.v)/
+                                       ((_Parameter)currentNd->in_object.h-parent->in_object.h);
+                if (abs((long)(v-parent->in_object.v-lineSlope*(h-parent->in_object.h)))<=3) {
+                    break;
+                }
+            }
+
+        } else if ((h<currentNd->in_object.h+addWidth)&&(h>parent->in_object.h)) {
+            if (treeFlags&HY_TREEPANEL_STRAIGHT) {
+                _Parameter lineSlope = ((_Parameter)currentNd->in_object.v-parent->in_object.v)/
+                                       ((_Parameter)currentNd->in_object.h-parent->in_object.h);
+                if (abs((long)(v-parent->in_object.v-lineSlope*(h-parent->in_object.h)))<=5) {
+                    break;
+                }
+            } else if (treeFlags&HY_TREEPANEL_ARCS) ;
+            else {
+                if (abs((long)(v-currentNd->in_object.v))<=5) {
+                    break;
+                }
+            }
+        }
+        if (!shiftDown) {
+            if (currentNd->in_object.flags&HY_BRANCH_SELECT) {
+                currentNd->in_object.flags&=HY_BRANCH_DESELECT;
+                res = 1;
+            }
+        }
+        currentNd = NodeTraverser((node <nodeCoord>*)nil);
+    }
+    if (currentNd&&parent&&currentNd->in_object.branchName.sLength) {
+        if (commandDown) {
+            if (currentNd->in_object.flags&HY_BRANCH_SELECT) {
+                _String errMsg ("Can't move a subtree to its own branch! Try again.");
+                ProblemReport (errMsg,(Ptr)this);
+                return 0;
+            } else {
+                currentSelection<<(long)currentNd;
+                MoveSubTree();
+                return 1;
+            }
+        }
+        if (optionDown) {
+            node<nodeCoord>* saveNode = currentNd;
+            if (!shiftDown) {
+                currentNd = NodeTraverser((node <nodeCoord>*)nil);
+                while (currentNd) {
+                    currentNd->in_object.flags&=HY_BRANCH_DESELECT;
+                    currentNd = NodeTraverser((node <nodeCoord>*)nil);
+                }
+            }
+            SelectSubTree (saveNode,shiftDown);
+            res = 1;
+        } else {
+            if (currentNd->in_object.flags&HY_BRANCH_SELECT) {
+                if (shiftDown) {
+                    currentNd->in_object.flags&=HY_BRANCH_DESELECT;
+                    currentSelection.Delete (currentSelection.Find((long)currentNd));
+                } else {
+                    currentSelection<<(long)currentNd;
+                }
+            } else {
+                currentNd->in_object.flags|=HY_BRANCH_SELECT;
+                currentSelection<<(long)currentNd;
+            }
+            res = 1;
+            if (!shiftDown) {
+                currentNd = NodeTraverser((node <nodeCoord>*)nil);
+                while (currentNd) {
+                    currentNd->in_object.flags&=HY_BRANCH_DESELECT;
+                    currentNd = NodeTraverser((node <nodeCoord>*)nil);
+                }
+            }
+        }
+    }
+    return res;
+}
+
+//__________________________________________________________
+
+long  _HYTreePanel::FindSelectedBranch (long h, long v)
+{
+    if (coordTree) {
+        long            addWidth;
+
+        node<nodeCoord>* currentNd = NodeTraverser(coordTree),
+                         * parent = nil;
+
+        while (currentNd) {
+            addWidth = 0;
+            parent = currentNd->parent;
+            if (!parent) {
+                break;
+            }
+            if (treeFlags&HY_TREEPANEL_TIP_LABELS) {
+                if (currentNd->get_num_nodes()==0) {
+                    addWidth = currentNd->in_object.textWidth+(treeLabelFont.size/2);
+                }
+            }
+            if (treeFlags&HY_TREEPANEL_INT_LABELS) {
+                if (currentNd->get_num_nodes()!=0) {
+                    addWidth = currentNd->in_object.textWidth+(treeLabelFont.size/2);
+                }
+            }
+
+            if (treeFlags&HY_TREEPANEL_CIRCULAR) {
+                if (((h<currentNd->in_object.h)&&(h>parent->in_object.h))||
+                        ((h>currentNd->in_object.h)&&(h<parent->in_object.h))) {
+                    _Parameter lineSlope = ((_Parameter)currentNd->in_object.v-parent->in_object.v)/
+                                           ((_Parameter)currentNd->in_object.h-parent->in_object.h);
+                    if (abs((long)(v-parent->in_object.v-lineSlope*(h-parent->in_object.h)))<=3) {
+                        break;
+                    }
+                }
+
+            } else if ((h<currentNd->in_object.h+addWidth)&&(h>parent->in_object.h)) {
+                if (treeFlags&HY_TREEPANEL_STRAIGHT) {
+                    _Parameter lineSlope = ((_Parameter)currentNd->in_object.v-parent->in_object.v)/
+                                           ((_Parameter)currentNd->in_object.h-parent->in_object.h);
+                    if (abs((long)(v-parent->in_object.v-lineSlope*(h-parent->in_object.h)))<=5) {
+                        break;
+                    }
+                } else if (treeFlags&HY_TREEPANEL_ARCS) ;
+                else {
+                    if (abs((long)(v-currentNd->in_object.v))<=5) {
+                        break;
+                    }
+                }
+            }
+            currentNd = NodeTraverser((node <nodeCoord>*)nil);
+        }
+        if (parent) {
+            return (long)currentNd;
+        }
+    }
+    return 0;
+}
+
+//__________________________________________________________
+
+void  _HYTreePanel::SelectSubTree (node<nodeCoord>*thisNode, bool shiftDown)
+{
+    if (!thisNode->in_object.flags&HY_BRANCH_SELECT) {
+        thisNode->in_object.flags|=HY_BRANCH_SELECT;
+        currentSelection<<(long)thisNode;
+    } else if (shiftDown) {
+        thisNode->in_object.flags&=HY_BRANCH_DESELECT;
+        currentSelection.Delete (currentSelection.Find((long)thisNode));
+    }
+    for (long k=0; k<thisNode->nodes.length; k++) {
+        SelectSubTree (thisNode->nodes.data[k],shiftDown);
+    }
+}
+
+//__________________________________________________________
+
+void  _HYTreePanel::SelectRangeAndScroll (_List& nodeNames, bool upcaseMe)
+{
+    if (nodeNames.lLength) {
+        currentSelection.Clear();
+
+        node<nodeCoord>* currentNd = NodeTraverser(coordTree);
+        _Parameter  ch = 0,
+                    cv = 0;
+        while (currentNd) {
+            currentNd->in_object.flags &= HY_BRANCH_DESELECT;
+            if (currentNd->in_object.varRef>=0) {
+                bool addMe = false;
+                _String* nodeName = LocateVar(currentNd->in_object.varRef)->GetName();
+                if (upcaseMe) {
+                    _String upcased (*nodeName);
+                    upcased.UpCase();
+                    addMe = nodeNames.BinaryFind (&upcased)>=0;
+                } else {
+                    addMe = nodeNames.BinaryFind (nodeName)>=0;
+                }
+
+                if (addMe) {
+                    ch += currentNd->in_object.h;
+                    cv += currentNd->in_object.v;
+                    currentNd->in_object.flags |= HY_BRANCH_SELECT;
+                    currentSelection << (long)currentNd;
+                }
+            }
+            currentNd = NodeTraverser((node<nodeCoord>*)NULL);
+        }
+
+        _UpdateOperationsMenu();
+        RenderTree();
+        ScrollToSelection (ch, cv);
+    }
+}
+
+//__________________________________________________________
+
+
+void  _HYTreePanel::ScrollToSelection (_Parameter ch, _Parameter cv)
+{
+    if (currentSelection.lLength&&((treeFlags&HY_TREEPANEL_SCALE_TO_WINDOW)==0)) {
+        _HYCanvas * bigCanvas = (_HYCanvas*)GetObject (0);
+        ch /= currentSelection.lLength;
+        cv /= currentSelection.lLength;
+        ch /= bigCanvas->GetMaxW();
+        cv /= bigCanvas->GetMaxH();
+        SetNavRectCenter (ch*HY_TREEPANEL_NAVSIZE,cv*HY_TREEPANEL_NAVSIZE);
+    }
+}
+
+//__________________________________________________________
+
+void  _HYTreePanel::SpaceNodes (node<nodeCoord>* cNode,_Parameter& offset)
+{
+    int n = cNode->get_num_nodes(),j;
+    if (n) {
+        _Parameter t = 0.0;
+        for (j=1; j<=n; j++) {
+            SpaceNodes (cNode->go_down(j),offset);
+            t+=cNode->go_down(j)->in_object.v;
+        }
+        cNode->in_object.v = t/n;
+    } else {
+        cNode->in_object.v = offset;
+        offset+=vSpace;
+    }
+
+}
+
+//__________________________________________________________
+
+_Parameter  _HYTreePanel::PreStraightenEdges (node<nodeCoord>* cNode)
+{
+    int i = cNode->get_num_nodes();
+    if (i) {
+        _Parameter t = 0.0;
+        cNode->in_object.auxL = 0;
+        cNode->in_object.auxD = 0.0;
+        for (int j=1; j<=i; j++) {
+            t = PreStraightenEdges (cNode->go_down(j));
+            if (cNode->in_object.auxD<t) {
+                cNode->in_object.auxD = t;
+            }
+            cNode->in_object.auxL+=cNode->go_down(j)->in_object.auxL;
+        }
+        return cNode->in_object.auxD;
+    } else {
+        cNode->in_object.auxL = 1;
+        return cNode->in_object.auxD = cNode->in_object.h;
+    }
+}
+
+//__________________________________________________________
+
+long                lastLeafValue;
+node  <nodeCoord>*  lastLeafPointer;
+
+//__________________________________________________________
+
+long  _HYTreePanel::PaintSquare (_HYCanvas* theCanvas, node<nodeCoord>* thisNode)
+{
+    _HYRect nodeCircle;
+    node<nodeCoord>* parent = thisNode->get_parent();
+    int     mh, mv;
+    mh = thisNode->in_object.h;
+    mv = thisNode->in_object.v;
+    nodeCircle.width = branchWidth;
+    if (parent) {
+        nodeCircle.top   = nodeCircle.bottom = mv;
+        nodeCircle.right = mh;
+        nodeCircle.left = parent->in_object.h;
+        DrawStraightEdge (theCanvas,nodeCircle,thisNode);
+    } else {
+        lastLeafValue = -1;
+        lastLeafPointer = nil;
+    }
+
+    int n,t,b;
+    if ((n=thisNode->get_num_nodes())) {
+        b = PaintSquare (theCanvas,thisNode->go_down(n));
+        t = b;
+        n--;
+        for (; n>1; n--) {
+            PaintSquare (theCanvas,thisNode->go_down(n));
+        }
+        if (n) {
+            t = PaintSquare (theCanvas,thisNode->go_down(1));
+        }
+        if (t!=b) {
+            nodeCircle.left = nodeCircle.right = mh;
+            nodeCircle.top = t;
+            nodeCircle.bottom = mv;
+            theCanvas->DrawLine (nodeCircle);
+            nodeCircle.top = mv;
+            nodeCircle.bottom = b;
+            theCanvas->DrawLine (nodeCircle);
+        }
+        if (parent&&(treeFlags&HY_TREEPANEL_INT_LABELS)) {
+            if (thisNode->in_object.branchName.sLength>0) {
+                n = b-t;
+                if (n>treeLabelFont.size+1) {
+                    theCanvas->DisplayText (thisNode->in_object.branchName, mv+(treeLabelFont.size/2),mh+(treeLabelFont.size/2),true);
+                } else {
+                    if (n>6) {
+                        theCanvas->SetFontSize(n-1);
+                        theCanvas->DisplayText (thisNode->in_object.branchName, mv+(treeLabelFont.size/2),mh+(treeLabelFont.size/2),true);
+                        theCanvas->SetFontSize(treeLabelFont.size);
+                    }
+                }
+            }
+        }
+    } else {
+        if (treeFlags&HY_TREEPANEL_TIP_LABELS) {
+            if (thisNode->in_object.branchName.sLength>0) {
+                if (lastLeafValue < 0) {
+                    lastLeafPointer = thisNode;
+                } else {
+                    n = lastLeafValue-mv;
+                    if (n>treeLabelFont.size+1) {
+                        theCanvas->DisplayText (thisNode->in_object.branchName, mv+(treeLabelFont.size/2),mh+(treeLabelFont.size/2),true);
+                        if (lastLeafPointer)
+                            theCanvas->DisplayText (lastLeafPointer->in_object.branchName,
+                                                    lastLeafPointer->in_object.v+(treeLabelFont.size/2),
+                                                    lastLeafPointer->in_object.h+(treeLabelFont.size/2),true);
+                    } else {
+                        if (n>6) {
+                            theCanvas->SetFontSize(n-1);
+                            theCanvas->DisplayText (thisNode->in_object.branchName, mv+(treeLabelFont.size/2),mh+(treeLabelFont.size/2),true);
+                            if (lastLeafPointer)
+                                theCanvas->DisplayText (lastLeafPointer->in_object.branchName,
+                                                        lastLeafPointer->in_object.v+(treeLabelFont.size/2),
+                                                        lastLeafPointer->in_object.h+(treeLabelFont.size/2),true);
+                            theCanvas->SetFontSize(treeLabelFont.size);
+                        }
+                    }
+                    lastLeafPointer = nil;
+                }
+            }
+            lastLeafValue = mv;
+        }
+    }
+    return mv;
+}
+
+//__________________________________________________________
+
+void  _HYTreePanel::PaintSquareBranchLabels (_HYCanvas* theCanvas, node<nodeCoord>* thisNode, bool above)
+{
+    _HYRect nodeCircle;
+    node<nodeCoord>* parent = thisNode->get_parent();
+    int     mh, mv;
+    mh = thisNode->in_object.h;
+    mv = thisNode->in_object.v;
+    nodeCircle.width = branchWidth;
+    if (parent) {
+        _Parameter value = above?thisNode->in_object.label1:thisNode->in_object.label2;
+
+        char conv [255],
+             conf [32];
+
+        //if (value>1.0)
+        snprintf (conf, sizeof(conf),"%%.%dg",above?labelDigits1:labelDigits2);
+        //else
+        //  snprintf (conf, sizeof(conf),"%%.%dg",(above?labelDigits1:labelDigits2)+1);
+
+        snprintf (conv, sizeof(conv),conf,value);
+        _String label (conv);
+
+        nodeCircle.top = nodeCircle.bottom = mv;
+        nodeCircle.right = mh;
+        nodeCircle.left = parent->in_object.h;
+
+#ifdef __MAC__
+        long lw = GetVisibleStringWidth (label);
+#else
+        long lw = GetVisibleStringWidth (label,treeLabelFont);
+#endif
+
+        int firstDig = 0,
+            cDig = label.sLength-1;
+        while ((label.sData[firstDig]=='0')||(label.sData[firstDig]=='.')) {
+            firstDig++;
+        }
+
+        if (value==0.0) {
+            firstDig = 1;
+            cDig = 1;
+        }
+
+        while ((lw>nodeCircle.right-nodeCircle.left-2*(branchWidth+1))&&(cDig>=firstDig)) {
+            if (value>1.0) {
+                snprintf (conf, sizeof(conf),"%%.%dg",cDig-firstDig);
+            } else {
+                snprintf (conf, sizeof(conf),"%%.%dg",cDig-firstDig+1);
+            }
+            snprintf (conv, sizeof(conv),conf,value);
+            label = conv;
+            label.Trim(0,cDig);
+#ifdef __MAC__
+            lw = GetVisibleStringWidth (label);
+#else
+            lw = GetVisibleStringWidth (label,treeLabelFont);
+#endif
+            cDig--;
+        }
+        char al = above?topAlign:bottomAlign;
+        if (al==HY_ALIGN_LEFT) {
+            mh = nodeCircle.left+branchWidth+1;
+        } else if (al==HY_ALIGN_RIGHT) {
+            mh = nodeCircle.right-lw-branchWidth-1;
+        } else {
+            mh = nodeCircle.left+(nodeCircle.right-nodeCircle.left-lw)/2;
+        }
+
+        if ((lw<=nodeCircle.right-nodeCircle.left-2*(branchWidth+1))&&(cDig>=firstDig))
+            if (above) {
+                theCanvas->DisplayText (label,mv-2,mh,true);
+            } else {
+                theCanvas->DisplayText (label,mv+branchLabel2.size+2,mh,true);
+            }
+    }
+
+    int n;
+    if ((n=thisNode->get_num_nodes())) {
+        for (; n>=1; n--) {
+            PaintSquareBranchLabels (theCanvas,thisNode->go_down(n),above);
+        }
+    }
+}
+
+//__________________________________________________________
+
+long  _HYTreePanel::PaintVSquare (_HYCanvas* theCanvas, node<nodeCoord>* thisNode)
+{
+    _HYRect nodeCircle;
+    node<nodeCoord>* parent = thisNode->get_parent();
+    int     mh, mv;
+    mh = thisNode->in_object.h;
+    mv = thisNode->in_object.v;
+    nodeCircle.width = branchWidth;
+    if (parent) {
+        nodeCircle.left = nodeCircle.right = mv;
+        nodeCircle.bottom = mh;
+        nodeCircle.top = parent->in_object.h;
+        DrawStraightEdge (theCanvas,nodeCircle,thisNode);
+    }
+    int n,t,b;
+    if ((n=thisNode->get_num_nodes())) {
+        if (parent&&(treeFlags&HY_TREEPANEL_INT_LABELS)) {
+            if (thisNode->in_object.branchName.sLength>0) {
+                theCanvas->DisplayText (thisNode->in_object.branchName, mh-3,mv+3,false);
+            }
+        }
+        b = PaintVSquare (theCanvas,thisNode->go_down(n));
+        t = b;
+        n--;
+        for (; n>1; n--) {
+            PaintVSquare (theCanvas,thisNode->go_down(n));
+        }
+        if (n) {
+            t = PaintVSquare (theCanvas,thisNode->go_down(1));
+        }
+        if (t!=b) {
+            nodeCircle.top = nodeCircle.bottom = mh;
+            nodeCircle.left = t;
+            nodeCircle.right = mv;
+            theCanvas->DrawLine (nodeCircle);
+            nodeCircle.left = mv;
+            nodeCircle.right = b;
+            theCanvas->DrawLine (nodeCircle);
+        }
+    } else {
+        if (treeFlags&HY_TREEPANEL_TIP_LABELS) {
+            if (thisNode->in_object.branchName.sLength>0) {
+                theCanvas->DisplayText (thisNode->in_object.branchName, mh+3*(treeLabelFont.size/2),mv,false);
+            }
+        }
+    }
+    return mv;
+}
+//__________________________________________________________
+
+long  _HYTreePanel::PaintNSquare (_HYCanvas* theCanvas, node<nodeCoord>* thisNode, _Parameter hScale, _Parameter vScale)
+{
+    _HYRect nodeCircle;
+    node<nodeCoord>* parent = thisNode->get_parent();
+    nodeCircle.width = 1;
+    if (parent) {
+        nodeCircle.top = nodeCircle.bottom = thisNode->in_object.v*vScale+HY_TREEPANEL_NAVSPACING;
+        nodeCircle.right = thisNode->in_object.h*hScale+HY_TREEPANEL_NAVSPACING;
+        nodeCircle.left = parent->in_object.h*hScale+HY_TREEPANEL_NAVSPACING;
+        theCanvas->DrawLine (nodeCircle);
+    }
+    int n,t,b;
+    if ((n=thisNode->get_num_nodes())) {
+        b = PaintNSquare (theCanvas,thisNode->go_down(n),hScale,vScale);
+        t = b;
+        n--;
+        for (; n>1; n--) {
+            PaintNSquare (theCanvas,thisNode->go_down(n),hScale,vScale);
+        }
+        if (n) {
+            t = PaintNSquare (theCanvas,thisNode->go_down(1),hScale,vScale);
+        }
+        if (t!=b) {
+            nodeCircle.left = nodeCircle.right = thisNode->in_object.h*hScale+HY_TREEPANEL_NAVSPACING;
+            nodeCircle.top = t;
+            nodeCircle.bottom = thisNode->in_object.v*vScale+HY_TREEPANEL_NAVSPACING;
+            theCanvas->DrawLine (nodeCircle);
+            nodeCircle.top = thisNode->in_object.v*vScale+HY_TREEPANEL_NAVSPACING;
+            nodeCircle.bottom = b;
+            theCanvas->DrawLine (nodeCircle);
+        }
+    }
+    return thisNode->in_object.v*vScale+HY_TREEPANEL_NAVSPACING;
+}
+
+//__________________________________________________________
+
+long  _HYTreePanel::PaintNVSquare (_HYCanvas* theCanvas, node<nodeCoord>* thisNode, _Parameter hScale, _Parameter vScale)
+{
+    _HYRect nodeCircle;
+    node<nodeCoord>* parent = thisNode->get_parent();
+    nodeCircle.width = 1;
+    if (parent) {
+        nodeCircle.left = nodeCircle.right = thisNode->in_object.v*vScale+HY_TREEPANEL_NAVSPACING;
+        nodeCircle.bottom = thisNode->in_object.h*hScale+HY_TREEPANEL_NAVSPACING;
+        nodeCircle.top = parent->in_object.h*hScale+HY_TREEPANEL_NAVSPACING;
+        theCanvas->DrawLine (nodeCircle);
+    }
+    int n,t,b;
+    if ((n=thisNode->get_num_nodes())) {
+        b = PaintNVSquare (theCanvas,thisNode->go_down(n),hScale,vScale);
+        t = b;
+        n--;
+        for (; n>1; n--) {
+            PaintNVSquare (theCanvas,thisNode->go_down(n),hScale,vScale);
+        }
+        if (n) {
+            t = PaintNVSquare (theCanvas,thisNode->go_down(1),hScale,vScale);
+        }
+        if (t!=b) {
+            nodeCircle.top = nodeCircle.bottom = thisNode->in_object.h*hScale+HY_TREEPANEL_NAVSPACING;
+            nodeCircle.left = t;
+            nodeCircle.right = thisNode->in_object.v*vScale+HY_TREEPANEL_NAVSPACING;
+            theCanvas->DrawLine (nodeCircle);
+            nodeCircle.left = thisNode->in_object.v*vScale+HY_TREEPANEL_NAVSPACING;
+            nodeCircle.right = b;
+            theCanvas->DrawLine (nodeCircle);
+        }
+    }
+    return thisNode->in_object.v*vScale+HY_TREEPANEL_NAVSPACING;
+}
+
+//__________________________________________________________
+
+void  _HYTreePanel::PaintStraight (_HYCanvas* theCanvas, node<nodeCoord>* thisNode)
+{
+    _HYRect nodeCircle;
+    node<nodeCoord>* parent = thisNode->get_parent();
+    nodeCircle.width = branchWidth;
+    bool    isv = IsVertical();
+    long    n;
+    if (parent) {
+        nodeCircle.bottom = thisNode->in_object.v;
+        nodeCircle.right = thisNode->in_object.h;
+        nodeCircle.left = parent->in_object.h;
+        nodeCircle.top = parent->in_object.v;
+        if (isv) {
+            RotateRect90(nodeCircle);
+        }
+        DrawStraightEdge(theCanvas,nodeCircle,thisNode);
+    }
+    if ((n=thisNode->get_num_nodes())) {
+        if (parent&&(treeFlags&HY_TREEPANEL_INT_LABELS)) {
+            if (thisNode->in_object.branchName.sLength>0) {
+
+                if (isv) {
+                    long nn = thisNode->in_object.v-thisNode->in_object.textWidth-(treeLabelFont.size/2);
+                    if (nn<0) {
+                        nn = 0;
+                    }
+                    theCanvas->DisplayText (thisNode->in_object.branchName, thisNode->in_object.h,nn,true);
+                } else {
+                    theCanvas->DisplayText (thisNode->in_object.branchName, thisNode->in_object.v-(treeLabelFont.size/2),thisNode->in_object.h-(treeLabelFont.size/2)-thisNode->in_object.textWidth,true);
+                }
+            }
+        }
+        for (; n; n--) {
+            PaintStraight (theCanvas,thisNode->go_down(n));
+        }
+    } else {
+        if (treeFlags&HY_TREEPANEL_TIP_LABELS) {
+            if (thisNode->in_object.branchName.sLength>0) {
+                if (isv) {
+                    _Parameter branchSlope = (thisNode->in_object.h-thisNode->parent->in_object.h)
+                                             /(_Parameter)(thisNode->parent->in_object.v-thisNode->in_object.v+1);
+                    //n = -1+2*(thisNode->in_object.h>thisNode->parent->in_object.h);
+                    if ((branchSlope < 1.)&&(branchSlope > -1.))
+                        if (thisNode->parent->in_object.v>thisNode->in_object.v)
+                            theCanvas->DisplayText (thisNode->in_object.branchName,
+                                                    thisNode->in_object.h+(treeLabelFont.size/2),
+                                                    thisNode->in_object.v+(treeLabelFont.size/2),
+                                                    true);
+                        else
+                            theCanvas->DisplayText (thisNode->in_object.branchName,
+                                                    thisNode->in_object.h+(treeLabelFont.size/2),
+                                                    thisNode->in_object.v-(treeLabelFont.size/2)-thisNode->in_object.textWidth,
+                                                    true);
+                    else if (thisNode->parent->in_object.h>thisNode->in_object.h)
+                        theCanvas->DisplayText (thisNode->in_object.branchName,
+                                                thisNode->in_object.h-(treeLabelFont.size/2),
+                                                thisNode->in_object.v-thisNode->in_object.textWidth/2,
+                                                true);
+                    else
+                        theCanvas->DisplayText (thisNode->in_object.branchName,
+                                                thisNode->in_object.h+3*(treeLabelFont.size/2),
+                                                thisNode->in_object.v-thisNode->in_object.textWidth/2,
+                                                true);
+                } else {
+                    _Parameter branchSlope = (thisNode->in_object.v-thisNode->parent->in_object.v)
+                                             /(_Parameter)(thisNode->in_object.h-thisNode->parent->in_object.h+1);
+                    //n = -1+2*(thisNode->in_object.h>thisNode->parent->in_object.h);
+                    if ((branchSlope < 1.)&&(branchSlope > -1.))
+                        if (thisNode->parent->in_object.h<=thisNode->in_object.h)
+                            theCanvas->DisplayText (thisNode->in_object.branchName,
+                                                    thisNode->in_object.v+(treeLabelFont.size/2),
+                                                    thisNode->in_object.h+(treeLabelFont.size/2),
+                                                    true);
+                        else
+                            theCanvas->DisplayText (thisNode->in_object.branchName,
+                                                    thisNode->in_object.v+(treeLabelFont.size/2),
+                                                    thisNode->in_object.h-(treeLabelFont.size/2)-thisNode->in_object.textWidth,
+                                                    true);
+                    else if (thisNode->parent->in_object.v>thisNode->in_object.v)
+                        theCanvas->DisplayText (thisNode->in_object.branchName,
+                                                thisNode->in_object.v-(treeLabelFont.size/2),
+                                                thisNode->in_object.h-thisNode->in_object.textWidth/2,
+                                                true);
+                    else
+                        theCanvas->DisplayText (thisNode->in_object.branchName,
+                                                thisNode->in_object.v+3*(treeLabelFont.size/2),
+                                                thisNode->in_object.h-thisNode->in_object.textWidth/2,
+                                                true);
+                }
+            }
+        }
+    }
+}
+
+//__________________________________________________________
+
+void  _HYTreePanel::DrawStraightEdge (_HYCanvas* theCanvas, _HYRect& nodeCircle, node<nodeCoord>* thisNode)
+{
+    if (thisNode->in_object.flags&HY_BRANCH_SELECT) {
+        nodeCircle.width ++;
+        theCanvas->DrawHatchedLine (nodeCircle);
+        nodeCircle.width --;
+    } else {
+        theCanvas->DrawLine (nodeCircle);
+    }
+}
+
+
+//__________________________________________________________
+
+void  _HYTreePanel::PaintRadial (_HYCanvas* theCanvas, node<nodeCoord>* thisNode)
+/* the idea is as follows:
+    for every node draw a radial segment (back to the root of the tree) proportional to the length of the branch
+    for descendants of the root, simply connect back to the root
+    for every internal node, except root; draw an arc from the left-most to the right-most child
+*/
+{
+    _HYRect                   nodeCircle;
+    node<nodeCoord>* parent = thisNode->get_parent();
+    nodeCircle.width        = branchWidth;
+    long                      n = thisNode->get_num_nodes();
+
+    double                    myR, // radial distance from the root
+                              rootH = coordTree->in_object.h,
+                              rootV = coordTree->in_object.v;
+    if (parent) {
+        // compute radial distance from this node to the root
+
+        myR         = DistanceBetweenPoints (rootH,rootV,thisNode->in_object.h,thisNode->in_object.v);
+        double  pR  = DistanceBetweenPoints (rootH,rootV,parent->in_object.h,parent->in_object.v);
+
+
+        if (myR-pR >= branchWidth) { // draw a connector
+            double  myAngle = (90.-AngleBetweenPoints (rootH,rootV,thisNode->in_object.h,thisNode->in_object.v))*pi_const/180.,
+                    cosMA   = cos(myAngle);
+
+            myAngle = sin(myAngle);
+
+            nodeCircle.left   = rootH+cosMA*pR;
+            nodeCircle.right  = rootH+cosMA*myR;
+
+            nodeCircle.top    = rootV-myAngle*pR;
+            nodeCircle.bottom = rootV-myAngle*myR;
+            DrawStraightEdge (theCanvas,nodeCircle,thisNode);
+        }
+
+        //theCanvas->DisplayText (thisNode->in_object.branchName,thisNode->in_object.v,thisNode->in_object.h,true);
+
+        if (n>1) // has > 1 children
+            // draw the arc; angles measured in degrees clockwise from standard 90 degrees (12 o'clock)
+        {
+            parent             = thisNode->go_down (1);
+            long               angle1 = AngleBetweenPoints (rootH,rootV,parent->in_object.h,parent->in_object.v);
+            parent             = thisNode->go_down (n);
+            long               angle2 = AngleBetweenPoints (rootH,rootV,parent->in_object.h,parent->in_object.v);
+
+            nodeCircle.left    = rootH - myR;
+            nodeCircle.right   = rootH + myR;
+            nodeCircle.top     = rootV - myR;
+            nodeCircle.bottom  = rootV + myR;
+            angle1             = (angle1-angle2>0)?(angle1-angle2):(angle1-angle2+360);
+
+            if (angle1 <= 10) { // draw a straight line
+
+            } else { // draw arc
+                theCanvas->DrawArc (nodeCircle,angle2,angle1);
+            }
+            //theCanvas->SetColor (black);
+        }
+
+    }
+    // do nothing for the root node
+
+    // paint children
+    for (; n; n--) {
+        PaintRadial (theCanvas,thisNode->go_down(n));
+    }
+}
+
+//__________________________________________________________
+
+void  _HYTreePanel::PaintNRadial (_HYCanvas* theCanvas, node<nodeCoord>* thisNode, _Parameter hScale, _Parameter vScale)
+{
+    PaintNStraight (theCanvas, thisNode, hScale, vScale);
+}
+
+
+//__________________________________________________________
+
+void  _HYTreePanel::PaintNStraight (_HYCanvas* theCanvas, node<nodeCoord>* thisNode, _Parameter hScale, _Parameter vScale)
+{
+    _HYRect nodeCircle;
+    node<nodeCoord>* parent = thisNode->get_parent();
+    _String nameString;
+    nodeCircle.width = 1;
+    if (parent) {
+        nodeCircle.bottom = thisNode->in_object.v*vScale+HY_TREEPANEL_NAVSPACING;
+        nodeCircle.right = thisNode->in_object.h*hScale+HY_TREEPANEL_NAVSPACING;
+        nodeCircle.left = parent->in_object.h*hScale+HY_TREEPANEL_NAVSPACING;
+        nodeCircle.top = parent->in_object.v*vScale+HY_TREEPANEL_NAVSPACING;
+        if (treeFlags&HY_TREEPANEL_VERTICAL) {
+            RotateRect90(nodeCircle);
+        }
+        theCanvas->DrawLine (nodeCircle);
+    }
+    int n;
+    if ((n=thisNode->get_num_nodes()))
+        for (; n; n--) {
+            PaintNStraight (theCanvas,thisNode->go_down(n),hScale,vScale);
+        }
+}
+
+//__________________________________________________________
+
+void  _HYTreePanel::PaintArcs (_HYCanvas* theCanvas, node<nodeCoord>* thisNode)
+{
+    _HYRect nodeCircle, circleRect;
+    node<nodeCoord>* parent = thisNode->get_parent();
+    int     h,w,s,f;
+    bool    isv = IsVertical();
+    nodeCircle.width = branchWidth;
+    if (parent) {
+        nodeCircle.right = thisNode->in_object.h;
+        nodeCircle.left = parent->in_object.h;
+        nodeCircle.top = parent->in_object.v;
+        nodeCircle.bottom = thisNode->in_object.v;
+        w = nodeCircle.right-nodeCircle.left;
+        nodeCircle.right += w;
+        if (nodeCircle.top<nodeCircle.bottom) {
+            h=nodeCircle.bottom-nodeCircle.top;
+            nodeCircle.top-=h;
+            s=f=-90;
+            if (isv) {
+                s=90;
+            }
+        } else {
+            nodeCircle.bottom=nodeCircle.top;
+            nodeCircle.top=thisNode->in_object.v;
+            h=nodeCircle.bottom-nodeCircle.top;
+            nodeCircle.bottom+=h;
+            s=270;
+            f=90;
+        }
+        if (h<w) {
+            circleRect = nodeCircle;
+            circleRect.right = circleRect.left+2*h;
+            if (isv) {
+                RotateRect90(circleRect);
+            }
+            theCanvas->DrawArc(circleRect,s,f);
+            if (isv) {
+                RotateRect90(circleRect);
+            }
+            circleRect.bottom = circleRect.top = thisNode->in_object.v-1;
+            circleRect.right = circleRect.left+w;
+            circleRect.left += h;
+            if (isv) {
+                RotateRect90(circleRect);
+            }
+            theCanvas->DrawLine(circleRect);
+        } else {
+            if (isv) {
+                RotateRect90(nodeCircle);
+            }
+            theCanvas->DrawArc(nodeCircle,s,f);
+        }
+
+    }
+    if ((w=thisNode->get_num_nodes())) {
+        if (parent&&(treeFlags&HY_TREEPANEL_INT_LABELS)) {
+            if (thisNode->in_object.branchName.sLength) {
+                if (isv) {
+                    theCanvas->DisplayText (thisNode->in_object.branchName, thisNode->in_object.h+(treeLabelFont.size/2),thisNode->in_object.h+(treeLabelFont.size/2),true);
+                } else {
+                    theCanvas->DisplayText (thisNode->in_object.branchName, thisNode->in_object.v+(treeLabelFont.size/2),thisNode->in_object.h+(treeLabelFont.size/2),true);
+                }
+            }
+        }
+        for (; w; w--) {
+            PaintArcs (theCanvas,thisNode->go_down(w));
+        }
+    } else {
+        if (treeFlags&HY_TREEPANEL_TIP_LABELS) {
+            if (thisNode->in_object.branchName.sLength) {
+                if (isv) {
+                    w = thisNode->in_object.v-thisNode->in_object.textWidth/2;
+                    if (w<0) {
+                        w = 0;
+                    }
+                    theCanvas->DisplayText (thisNode->in_object.branchName, thisNode->in_object.h+3*(treeLabelFont.size/2),w,true);
+                } else {
+                    theCanvas->DisplayText (thisNode->in_object.branchName, thisNode->in_object.v+(treeLabelFont.size/2),thisNode->in_object.h+(treeLabelFont.size/2),true);
+                }
+            }
+        }
+    }
+}
+
+//__________________________________________________________
+
+void _HYTreePanel::PaintNArcs (_HYCanvas* theCanvas, node<nodeCoord>* thisNode, _Parameter hScale, _Parameter vScale)
+{
+    _HYRect nodeCircle, circleRect;
+    node<nodeCoord>* parent = thisNode->get_parent();
+    _String nameString;
+    nodeCircle.width = 1;
+    int     h,w,s,f;
+    bool    isv = IsVertical();
+    if (parent) {
+        nodeCircle.right = thisNode->in_object.h*hScale+HY_TREEPANEL_NAVSPACING;
+        nodeCircle.left = parent->in_object.h*hScale+HY_TREEPANEL_NAVSPACING;
+        w = nodeCircle.right-nodeCircle.left;
+        nodeCircle.right += w;
+        nodeCircle.top = parent->in_object.v*vScale+HY_TREEPANEL_NAVSPACING;
+        nodeCircle.bottom = thisNode->in_object.v*vScale+HY_TREEPANEL_NAVSPACING;
+        if (nodeCircle.top<nodeCircle.bottom) {
+            h=nodeCircle.bottom-nodeCircle.top;
+            nodeCircle.top-=h;
+            s=f=-90;
+            if (isv) {
+                s = 90;
+            }
+        } else {
+            nodeCircle.bottom=nodeCircle.top;
+            nodeCircle.top=thisNode->in_object.v*vScale+HY_TREEPANEL_NAVSPACING;
+            h=nodeCircle.bottom-nodeCircle.top;
+            nodeCircle.bottom+=h;
+            s=270;
+            f=90;
+        }
+        if (h<w) {
+            circleRect = nodeCircle;
+            circleRect.right = circleRect.left+2*h;
+            if (isv) {
+                RotateRect90(circleRect);
+            }
+            theCanvas->DrawArc(circleRect,s,f);
+            if (isv) {
+                RotateRect90(circleRect);
+            }
+            circleRect.bottom = circleRect.top = thisNode->in_object.v*vScale+HY_TREEPANEL_NAVSPACING;
+            circleRect.right = circleRect.left+w;
+            circleRect.left += h;
+            if (isv) {
+                RotateRect90(circleRect);
+            }
+            theCanvas->DrawLine(circleRect);
+        } else {
+            if (isv) {
+                RotateRect90(nodeCircle);
+            }
+            theCanvas->DrawArc(nodeCircle,s,f);
+        }
+    }
+    if ((w=thisNode->get_num_nodes())) {
+        for (; w; w--) {
+            PaintNArcs (theCanvas,thisNode->go_down(w),hScale,vScale);
+        }
+    }
+
+}
+
+//__________________________________________________________
+
+_HYRect  _HYTreePanel::ComputeNavRect (void)
+{
+    _HYRect res;
+    _HYCanvas* bigCanvas = (_HYCanvas*)GetObject (0);
+    res.width = 1;
+    int     nS = HY_TREEPANEL_NAVSIZE-HY_TREEPANEL_NAVSPACING;
+
+    _Parameter visProp = bigCanvas->GetHSize()/(_Parameter)bigCanvas->_HYComponent::GetMaxW();
+    res.left = bigCanvas->hOrigin*nS/(_Parameter)bigCanvas->_HYComponent::GetMaxW();
+    res.right = res.left+visProp*nS;
+    visProp = bigCanvas->GetVSize()/(_Parameter)bigCanvas->_HYComponent::GetMaxH();
+    res.top = bigCanvas->vOrigin*nS/(_Parameter)bigCanvas->_HYComponent::GetMaxH();
+    res.bottom = res.top+visProp*nS;
+    return res;
+}
+
+//__________________________________________________________
+
+void  _HYTreePanel::SetNavRectCenter (int h, int v)
+{
+    _HYCanvas * bigCanvas = (_HYCanvas*)GetObject (0);
+    _HYCanvas * theRuler = (_HYCanvas*)GetObject (2);
+    _HYCanvas * theNP = (_HYCanvas*)GetObject (1);
+
+    int     nS = HY_TREEPANEL_NAVSIZE-HY_TREEPANEL_NAVSPACING-1,t;
+    t = navRect.right-navRect.left;
+    h-=t/2;
+    if (h<0) {
+        h=0;
+    }
+    if (h+t>nS) {
+        h=nS-t;
+    }
+    t = navRect.bottom-navRect.top;
+    v-=t/2;
+    if (v<0) {
+        v=0;
+    }
+    if (v+t>nS) {
+        v=nS-t;
+    }
+    h = (h*bigCanvas->GetMaxW())/nS;
+    v = (v*bigCanvas->GetMaxH())/nS;
+    if (v<0) {
+        v = 0;
+    }
+    if (h<0) {
+        h = 0;
+    }
+    if ((h!=bigCanvas->hOrigin)||(v!=bigCanvas->vOrigin)) {
+        bigCanvas->SetOrigin (v,h);
+        theRuler->SetOrigin (0,h);
+        theNP->_MarkForUpdate();
+        Update(nil);
+    }
+}
+
+//__________________________________________________________
+
+void  _HYTreePanel::SetFont (_HYFont& newFont)
+{
+    treeLabelFont = newFont;
+    if ((treeFlags&HY_TREEPANEL_TIP_LABELS)||(treeFlags&HY_TREEPANEL_INT_LABELS)||(treeFlags&HY_TREEPANEL_LABEL1)||(treeFlags&HY_TREEPANEL_LABEL2)) {
+        node<nodeCoord>* currentNd = NodeTraverser(coordTree);
+        textSpace = 0;
+        while (currentNd) {
+            if (currentNd->in_object.branchName.sLength) {
+                currentNd->in_object.textWidth = GetVisibleStringWidth (currentNd->in_object.branchName,treeLabelFont);
+            }
+
+            if (currentNd->in_object.varRef>=0) {
+                long f = GetVisibleStringWidth (currentNd->in_object.branchName,treeLabelFont);
+                currentNd->in_object.textWidth = f;
+                if ((currentNd->get_num_nodes()==0)&&(f>textSpace)) {
+                    textSpace = f;
+                }
+            } else {
+                currentNd->in_object.textWidth = 0;
+                currentNd->in_object.branchName = empty;
+            }
+            currentNd = NodeTraverser((node<nodeCoord>*)NULL);
+        }
+
+        if (treeFlags & HY_TREEPANEL_TIP_LABELS) {
+            SetHSpace (hSpace,true);
+        }
+
+        if (treeLabelFont.size/2+5>windowTextMarginV) {
+            windowTextMarginV = treeLabelFont.size/2+5;
+            SetVSpace (vSpace,true);
+            return;
+        } else {
+            if (treeLabelFont.size/2+5<windowTextMarginV) {
+                int newVSpace = treeLabelFont.size/2+5;
+                if (((newVSpace>=branchLabel1.size+3)||(!(treeFlags&HY_TREEPANEL_LABEL1)))&&
+                        ((newVSpace>=branchLabel2.size+3)||(!(treeFlags&HY_TREEPANEL_LABEL2)))) {
+                    windowTextMarginV = newVSpace;
+                    SetVSpace (vSpace,true);
+                    return;
+                }
+            }
+        }
+        RenderTree();
+    }
+}
+
+//__________________________________________________________
+
+_String     _HYTreePanel::GetTreeString (_AVLListXL * remap)
+{
+    _Variable* theTree = FetchVar(LocateVarByName (treeName));
+    if (theTree&&theTree->ObjectClass()==TREE) {
+        _TheTree * myTree = (_TheTree*)theTree;
+        myTree->StepWiseTraversal (true);
+        _String  res ((unsigned long)16,true);
+        long flag = -1;
+        if (scaleVariable.sLength) {
+            if (scaleVariable == expectedNumberOfSubs) {
+                flag = -3;
+            } else if (scaleVariable == stringSuppliedLengths) {
+                flag = -2;
+            } else
+#ifndef USE_AVL_NAMES
+                flag = variableReindex.lData[LocateVarByName(scaleVariable)];
+#else
+            {
+                _Variable* scaleVar = CheckReceptacle  (&scaleVariable,empty,false);
+                //flag = variableNames.GetXtra (LocateVarByName(scaleVariable));
+                flag = scaleVar->GetAVariable();
+            }
+#endif
+        }
+        if (myTree->rooted == UNROOTED || myTree->theRoot->get_num_nodes() != 3) {
+            myTree->SubTreeString (res,treeFlags&HY_TREEPANEL_INT_LABELS,flag, remap);
+        } else {
+            if (myTree->rooted == ROOTED_LEFT) {
+                res << "((";
+                myTree->currentNode = myTree->theRoot->go_down(1);
+                myTree->SubTreeString (res,treeFlags&HY_TREEPANEL_INT_LABELS,flag, remap);
+                res << ",";
+                myTree->currentNode = myTree->theRoot->go_down(2);
+                myTree->SubTreeString (res,treeFlags&HY_TREEPANEL_INT_LABELS,flag, remap);
+                res << "),";
+                myTree->currentNode = myTree->theRoot->go_down(3);
+                myTree->SubTreeString (res,treeFlags&HY_TREEPANEL_INT_LABELS,flag, remap);
+                res << ")";
+            } else {
+                res << "(";
+                myTree->currentNode = myTree->theRoot->go_down(1);
+                myTree->SubTreeString (res,treeFlags&HY_TREEPANEL_INT_LABELS,flag, remap);
+                res << ",(";
+                myTree->currentNode = myTree->theRoot->go_down(2);
+                myTree->SubTreeString (res,treeFlags&HY_TREEPANEL_INT_LABELS,flag, remap);
+                res << ",";
+                myTree->currentNode = myTree->theRoot->go_down(3);
+                myTree->SubTreeString (res,treeFlags&HY_TREEPANEL_INT_LABELS,flag, remap);
+                res << "))";
+            }
+        }
+        res.Finalize();
+        return res;
+    }
+    return empty;
+}
+
+//__________________________________________________________
+
+void    _HYTreePanel::ShowModelMatrix (bool expMx)
+{
+    node<nodeCoord>* node1 = (node<nodeCoord>*)currentSelection(0);
+    if (node1->in_object.varRef>=0) {
+        _CalcNode * thisCNode = (_CalcNode*)LocateVar (node1->in_object.varRef);
+        OpenModelFromCalcNode (*thisCNode->GetName(),expMx);
+    }
+}
+//__________________________________________________________
+
+void    _HYTreePanel::SwapSelectedSubTrees (void)
+{
+    _String errMsg ("Internal Tree Error in SwapSelectedSubTrees");
+    _TheTree *me = LocateMyTreeVariable();
+    if (!me) {
+        return;
+    }
+    node<nodeCoord>* node1 = (node<nodeCoord>*)currentSelection(0),
+                     * node2 = (node<nodeCoord>*)currentSelection(1),
+                       *t1 = node1->parent, *t2 = node2->parent;
+    long i,j;
+
+    for (i=0; i<t1->nodes.length; i++) {
+        if (t1->nodes.data[i] == node1) {
+            break;
+        }
+    }
+    for (j=0; j<t2->nodes.length; j++) {
+        if (t2->nodes.data[j] == node2) {
+            break;
+        }
+    }
+    if ((i==t1->nodes.length)||(j==t2->nodes.length)) {
+        WarnError (errMsg);
+        return;
+    }
+    node1->parent->nodes.data[i] = node2;
+    node2->parent->nodes.data[j] = node1;
+    node1->parent = t2;
+    node2->parent = t1;
+    node<long> *n1 = nil,*n2 = nil,*p1 =nil,*p2 = nil;
+
+    _CalcNode* travNode = me->DepthWiseTraversal (true);
+    while ((travNode)&&(!(n1&&n2))) {
+        if (travNode->theIndex==node1->in_object.varRef) {
+            n1 = &me->GetCurrentNode();
+        } else if (travNode->theIndex==node2->in_object.varRef) {
+            n2 = &me->GetCurrentNode();
+        }
+        travNode = me->DepthWiseTraversal();
+    }
+    p1 = n1->parent;
+    p2 = n2->parent;
+    if (!(n1&&n2&&p1&&p2)) {
+        WarnError (errMsg);
+        return;
+    }
+    for (i=0; i<p1->nodes.length; i++) {
+        if (p1->nodes.data[i] == n1) {
+            break;
+        }
+    }
+    for (j=0; j<p2->nodes.length; j++) {
+        if (p2->nodes.data[j] == n2) {
+            break;
+        }
+    }
+    if ((i==p1->nodes.length)||(j==p2->nodes.length)) {
+        WarnError (errMsg);
+        return;
+    }
+    n1->parent->nodes.data[i] = n2;
+    n2->parent->nodes.data[j] = n1;
+    n1->parent = p2;
+    n2->parent = p1;
+    if (t1!=t2) {
+        BuildTree(true);
+        node1 = NodeTraverser (coordTree);
+        while (node1) {
+            if ((node1->in_object.varRef==n1->in_object)||
+                    (node1->in_object.varRef==n2->in_object)) {
+                currentSelection << (long)(node1);
+                node1->in_object.flags|=HY_BRANCH_SELECT;
+            }
+            node1 = NodeTraverser((node <nodeCoord>*)nil);
+        }
+    }
+    PrepareUndoData (1);
+
+    if (likeFuncID>=0) {
+        _LikelihoodFunction* theLF = (_LikelihoodFunction*)likeFuncList(likeFuncID);
+        theLF->MapTreeTipsToData (theLF->DependOnTree(*me->GetName()),true);
+        theLF->VoidOldResults();
+        me->SetUp();
+        DisplayLikelihoodValue();
+    }
+    RenderTree((treeFlags&HY_TREEPANEL_PROJECTION)==0);
+}
+
+//__________________________________________________________
+
+void    _HYTreePanel::FlipSelectedBranches (void)
+{
+    _String errMsg ("Internal Tree Error in FlipSelectedBranches");
+    _TheTree *me = LocateMyTreeVariable();
+    if (!me) {
+        return;
+    }
+    node<nodeCoord>* node1 = (node<nodeCoord>*)currentSelection(0);
+    long i,k;
+    _CalcNode* travNode = me->DepthWiseTraversal (true);
+    PrepareUndoData (2);
+
+    node<long>*      n1 = nil;
+
+    while (travNode) {
+        if (travNode->theIndex==node1->in_object.varRef) {
+            n1 = &me->GetCurrentNode();
+            break;
+        }
+        travNode = me->DepthWiseTraversal();
+    }
+
+    if (!n1) {
+        WarnError (errMsg);
+        return;
+    }
+
+    i = 0;
+
+    k = node1->nodes.length-1;
+
+    while (i<k) {
+        node<long>*     swapL = n1->nodes.data[i];
+        n1->nodes.data[i] = n1->nodes.data[k];
+        n1->nodes.data[k] = swapL;
+
+        node<nodeCoord>*    swapNC = node1->nodes.data[i];
+        node1->nodes.data[i] = node1->nodes.data[k];
+        node1->nodes.data[k] = swapNC;
+        i++;
+        k--;
+    }
+
+    if (likeFuncID>=0) {
+        _LikelihoodFunction* theLF = (_LikelihoodFunction*)likeFuncList(likeFuncID);
+        theLF->MapTreeTipsToData (theLF->DependOnTree(*me->GetName()),true);
+        theLF->VoidOldResults();
+        me->SetUp();
+        DisplayLikelihoodValue();
+    }
+    RenderTree((treeFlags&HY_TREEPANEL_PROJECTION)==0);
+}
+
+//__________________________________________________________
+
+void    _HYTreePanel::JoinSelectedBranches (void)
+{
+    _String errMsg ("Internal Tree Error in CollapseSelectedBranch");
+    _TheTree *me = LocateMyTreeVariable();
+    if (!me) {
+        return;
+    }
+    if (!CheckIfNeedUnscaled()) {
+        return;
+    }
+    node<nodeCoord>* node1=(node<nodeCoord>*)currentSelection(0);
+    node<long> *n1 = nil,*p1 =nil,*newp;
+    PrepareUndoData (5);
+    long k;
+    _CalcNode* travNode = me->DepthWiseTraversal (true);
+    while (travNode) {
+        if (travNode->theIndex==node1->in_object.varRef) {
+            n1 = &me->GetCurrentNode();
+            break;
+        }
+        travNode = me->DepthWiseTraversal();
+    }
+    if (n1) {
+        p1 = n1->parent;
+    }
+    if (!(n1&&p1)) {
+        WarnError (errMsg);
+        return;
+    }
+    newp = new node<long>;
+    checkPointer ((Ptr)newp);
+    for (k=0; k<currentSelection.lLength; k++) {
+        node1 = (node<nodeCoord>*)currentSelection.lData[k];
+        for (long j = 0; j<p1->nodes.length; j++) {
+            if (p1->nodes.data[j]) {
+                if (p1->nodes.data[j]->in_object==node1->in_object.varRef) {
+                    newp->add_node(*p1->nodes.data[j]);
+                    p1->nodes.data[j] = nil;
+                    break;
+                }
+            }
+        }
+    }
+    long shift = 0, l = p1->nodes.length;
+    newp->set_parent (*p1);
+    for (k=0; k<l; k++) {
+        if (shift) {
+            if (p1->nodes.data[k]) {
+                p1->nodes.data[k-shift+1]=p1->nodes.data[k];
+            } else {
+                shift++;
+            }
+        } else {
+            if (!p1->nodes.data[k]) {
+                p1->nodes.data[k]=newp;
+                shift = 1;
+            }
+        }
+    }
+    p1->nodes.length-=shift-1;
+    shift = travNode->GetModelIndex();
+    _String nodeName (empty);
+    _String dummy ("1.0"), dummy2 ("");
+    if (shift != HY_NO_MODEL) {
+        nodeName = *(_String*)modelNames(shift);
+        me->FinalizeNode(newp,FindUnusedSuffix ("Node"),dummy2,nodeName,dummy);
+        _CalcNode* targetNode = (_CalcNode*)LocateVar (newp->in_object);
+        targetNode->SetCodeBase (me->GetCodeBase());
+        targetNode->CopyMatrixParameters(travNode);
+        dubiousNodes<<targetNode->GetAVariable();
+        UpdateLnLikelihood();
+    } else {
+        me->FinalizeNode(newp,FindUnusedSuffix ("Node"),nodeName,dummy2,dummy);
+    }
+    if (likeFuncID>=0) {
+        _LikelihoodFunction* theLF = (_LikelihoodFunction*)likeFuncList(likeFuncID);
+        theLF->MapTreeTipsToData (theLF->DependOnTree(*me->GetName()),true);
+    }
+    BuildTree(true);
+
+    RenderTree();
+}
+
+//__________________________________________________________
+
+void    _HYTreePanel::GraftATip (void)
+{
+    _String errMsg ("Internal Tree Error in GraftATip");
+    _TheTree *me = LocateMyTreeVariable();
+    if (!me) {
+        return;
+    }
+    if (!CheckIfNeedUnscaled()) {
+        return;
+    }
+    if (!KillLikeFunc(7)) {
+        return;
+    }
+
+    node<long> *n1 = nil,*p1 =nil,*newt,*newp;
+    _SimpleList matchingIDs,matchingNodes;
+    long k,f;
+    for (k=0; k<currentSelection.lLength; k++) {
+        matchingIDs<<((node<nodeCoord>*)currentSelection(k))->in_object.varRef;
+    }
+    _CalcNode* travNode = me->DepthWiseTraversal (true);
+    while (travNode) {
+        f = matchingIDs.Find(travNode->theIndex);
+        if (f>=0) {
+            matchingNodes<<(long)&me->GetCurrentNode();
+            matchingIDs.Delete(f);
+        }
+        travNode = me->DepthWiseTraversal();
+    }
+    for (k=0; k<matchingNodes.lLength; k++) {
+        n1 = (node<long>*)matchingNodes.lData[k];
+        p1 = n1->parent;
+        if (!p1) {
+            warnError (errMsg);
+            return;
+        }
+        newp = new node<long>;
+        newt = new node<long>;
+        checkPointer ((Ptr)newp);
+        checkPointer ((Ptr)newt);
+        newp->set_parent(*p1);
+        newp->add_node(*newt);
+        newp->add_node(*n1);
+        for (long j = 0; j<p1->nodes.length; j++) {
+            if (p1->nodes.data[j]->in_object==n1->in_object) {
+                p1->nodes.data[j] = newp;
+                break;
+            }
+        }
+        travNode = (_CalcNode*)LocateVar (n1->in_object);
+        _String dummy ("1.0"), dummy2, dummy3;
+        me->FinalizeNode(newp,FindUnusedSuffix ("Node"),dummy2,dummy3,dummy);
+        _String nodeName ("Species");
+        nodeName = nodeName&_String (FindUnusedSuffix(nodeName));
+        dummy2 = empty;
+        me->FinalizeNode(newt,0,nodeName,dummy2,dummy);
+        ((_VariableContainer*)LocateVar(newp->in_object))->CopyMatrixParameters (travNode);
+        ((_VariableContainer*)LocateVar(newt->in_object))->CopyMatrixParameters (travNode);
+        travNode = (_CalcNode*)LocateVar (newp->in_object);
+        travNode->SetCodeBase (me->GetCodeBase());
+        travNode = (_CalcNode*)LocateVar (newt->in_object);
+        travNode->SetCodeBase (me->GetCodeBase());
+    }
+
+    BuildTree(true);
+
+    RenderTree();
+}
+
+//__________________________________________________________
+
+void    _HYTreePanel::RecalculateLikelihood (void)
+{
+    if (likeFuncID>=0) {
+        _LikelihoodFunction* lf = (_LikelihoodFunction*)likeFuncList (likeFuncID);
+        feedbackTreePanel = this;
+        ToggleAnalysisMenu (true);
+        StartBarTimer();
+        _Matrix* res = lf->Optimize();
+        StopBarTimer();
+        ToggleAnalysisMenu (false);
+        terminateExecution = false;
+        feedbackTreePanel = nil;
+        DeleteObject (res);
+        dubiousNodes.Clear();
+        FlushUndoData();
+        BuildTree(true);
+        RenderTree();
+        postChangeLFEvent (GetID(),likeFuncID);
+    }
+}
+//__________________________________________________________
+
+void    _HYTreePanel::RerootTree (void)
+{
+    _String errMsg ("Internal Tree Error in RerootTree.");
+    _TheTree *me = LocateMyTreeVariable();
+    if (!me) {
+        return;
+    }
+    if (currentSelection.lLength) {
+        node<nodeCoord>* node1;
+        node<long> *n1 = nil,*p1 =nil,*t1, *t2, *t3;
+        node1 = (node<nodeCoord>*)currentSelection(0);
+        long        i,j;
+        _CalcNode* travNode = me->DepthWiseTraversal (true);
+        FlushUndoData();
+        unsigned char newRFlag;
+        while (travNode) {
+            if (travNode->theIndex==node1->in_object.varRef) {
+                n1 = &me->GetCurrentNode();
+                break;
+            }
+            travNode = me->DepthWiseTraversal();
+        }
+        if (n1) {
+            p1 = n1->parent;
+        }
+        if (!(n1&&p1)) {
+            WarnError (errMsg);
+            return;
+        }
+
+        for (i=0; i<p1->nodes.length; i++) {
+            if (p1->nodes.data[i]==n1) {
+                break;
+            }
+        }
+        t1 = p1;
+        t2 = t1->parent;
+        if (t2) {
+            newRFlag = ROOTED_RIGHT;
+            node <long>* newRoot = new node<long>;
+            checkPointer ((Ptr)newRoot);
+            newRoot->add_node (*n1);
+            for (j=0; j<p1->nodes.length; j++) {
+                if (i==j) {
+                    continue;
+                }
+                newRoot->add_node(*(p1->nodes.data[j]));
+            }
+
+            newRoot->add_node(*p1);
+            while(t2) {
+                t1->nodes.length = 0;
+                t3 = t2->parent;
+                for (i=0; i<t2->nodes.length; i++) {
+                    if (t2->nodes.data[i]==t1) {
+                        if (t3) {
+                            t1->add_node(*t2);
+                        }
+                    } else {
+                        t1->add_node(*(t2->nodes.data[i]));
+                    }
+                }
+                t1 = t2;
+                t2 = t3;
+            }
+            t3 = &me->GetRoot();
+            newRoot->in_object = t3->in_object;
+            delete (t3);
+            me->SetRoot (newRoot);
+        } else {
+            newRFlag = (i>=1)?ROOTED_LEFT:ROOTED_RIGHT;
+        }
+
+        me->RootedFlag() = newRFlag;
+
+        currentSelection.Clear();
+        if (likeFuncID>=0) {
+            _LikelihoodFunction* theLF = (_LikelihoodFunction*)likeFuncList(likeFuncID);
+            theLF->MapTreeTipsToData (theLF->DependOnTree(*me->GetName()),true);
+        }
+    } else {
+        if (me->RootedFlag()!=UNROOTED) {
+            me->RootedFlag() = UNROOTED;
+        } else {
+            long       leafCount = 0;
+            _Parameter ratioAB   = 1.e300,
+                       t;
+
+            node       <nodeCoord>*   newRoot = nil,
+                                      *   trav    = NodeTraverser (coordTree);
+
+            while (trav) {
+                if (trav->nodes.length==0) {
+                    trav->in_object.auxL = 1;
+                    leafCount ++;
+                } else {
+                    trav->in_object.auxL = 0;
+                    for (long k=0; k<trav->nodes.length; k++) {
+                        trav->in_object.auxL += trav->nodes.data[k]->in_object.auxL;
+                    }
+                }
+                trav = NodeTraverser((node <nodeCoord>*)nil);
+            }
+
+            trav    = NodeTraverser (coordTree);
+            while (trav) {
+                t = fabs(leafCount/(_Parameter)trav->in_object.auxL-2);
+                if (t<ratioAB) {
+                    ratioAB = t;
+                    newRoot = trav;
+                }
+                trav = NodeTraverser((node <nodeCoord>*)nil);
+            }
+            if (newRoot->parent) {
+                currentSelection << (long)newRoot;
+                RerootTree();
+            }
+            return;
+        }
+    }
+    //UpdateLnLikelihood ();
+    me->SetUp();
+    BuildTree(true);
+    RenderTree();
+}
+
+//__________________________________________________________
+
+void    _HYTreePanel::CollapseSelectedBranch (void)
+{
+    _String errMsg ("Internal Tree Error in CollapseSelectedBranch");
+    _TheTree *me = LocateMyTreeVariable();
+    if (!me) {
+        return;
+    }
+    node<nodeCoord>* node1;
+    long i,j;
+    PrepareUndoData (3);
+    for (long k=0; k<currentSelection.lLength; k++) {
+        node1 = (node<nodeCoord>*)currentSelection(k);
+        if (node1->get_num_nodes()==0) {
+            continue;
+        }
+
+        node<long> *n1 = nil,*p1 =nil;
+
+        _CalcNode* travNode = me->DepthWiseTraversal (true);
+        while (travNode) {
+            if (travNode->theIndex==node1->in_object.varRef) {
+                n1 = &me->GetCurrentNode();
+                break;
+            }
+
+            travNode = me->DepthWiseTraversal();
+        }
+        if (n1) {
+            p1 = n1->parent;
+        }
+        if (!(n1&&p1)) {
+            WarnError (errMsg);
+            return;
+        }
+        for (i=0; i<p1->nodes.length; i++) {
+            if (p1->nodes.data[i] == n1) {
+                break;
+            }
+        }
+        for (j=i+1; j<p1->nodes.length; j++) {
+            p1->nodes.data[j-1]=p1->nodes.data[j];
+        }
+        p1->nodes.length--;
+        if (i==0) {
+            for (i=n1->nodes.length; i; i--) {
+                p1->prepend_node (*n1->go_down(i));
+            }
+        } else {
+            for (i=1; i<=n1->nodes.length; i++) {
+                p1->add_node (*n1->go_down(i));
+            }
+        }
+        delete (n1);
+        DeleteVariable (*travNode->GetName(),true);
+    }
+
+    me->SetUp();
+    UpdateLnLikelihood ();
+    BuildTree(true);
+
+    RenderTree();
+}
+//__________________________________________________________
+
+void    _HYTreePanel::UpdateLnLikelihood (void)
+{
+    if (likeFuncID>=0) {
+        _LikelihoodFunction* theLF = (_LikelihoodFunction*)likeFuncList (likeFuncID);
+        theLF->RescanAllVariables();
+        theLF->HasBeenOptimized () = false;
+        postChangeLFParamsEvent(GetID(),likeFuncID);
+    }
+}
+
+//__________________________________________________________
+
+void    _HYTreePanel::Relabel (_TheTree* mt)
+{
+    if ((treeFlags & HY_TREEPANEL_LABEL1)&&(branchVar1.sLength)) {
+        mt->AssignLabelsToBranches (coordTree,&branchVar1,false);
+    }
+    if ((treeFlags & HY_TREEPANEL_LABEL2)&&(branchVar2.sLength)) {
+        mt->AssignLabelsToBranches (coordTree,&branchVar2,true);
+    }
+}
+
+//__________________________________________________________
+
+void    _HYTreePanel::DisplayLikelihoodValue (void)
+{
+    if (likeFuncID>=0) {
+        _LikelihoodFunction* theLF = (_LikelihoodFunction*)likeFuncList(likeFuncID);
+        statusBar.Trim(0,statusBar.FindBackwards(". Ln-likelihood",0,-1)-1);
+        theLF->PrepareToCompute();
+        _String newStatusBar = statusBar&". Ln-likelihood = "&_String(theLF->Compute());
+        theLF->DoneComputing();
+        SetStatusBar(newStatusBar);
+    }
+}
+
+//__________________________________________________________
+
+void    _HYTreePanel::DeleteCurrentSelection (void)
+{
+    _String errMsg ("Internal Tree Error in DeleteCurrentSelection");
+    _String* lastName;
+    _TheTree *me = LocateMyTreeVariable();
+    if (!me) {
+        return;
+    }
+    if (!ShrinkDataFilter()) {
+        return;
+    }
+    node<nodeCoord>* node1;
+    node<long>* n1, *p1, *p2;
+    PrepareUndoData (4);
+    long i,j,k;
+    _SimpleList      selectionID;
+    for (k=0; k<currentSelection.lLength; k++) {
+        node1 = (node<nodeCoord>*) currentSelection(k);
+        selectionID<<node1->in_object.varRef;
+    }
+    _CalcNode* travNode = me->DepthWiseTraversal (true);
+    while (travNode) {
+        k = selectionID.Find (travNode->theIndex);
+        if (k>=0) {
+            n1 = &me->GetCurrentNode();
+            selectionID.Delete(k);
+            p1 = n1->parent;
+            if (!(p1&&n1)) {
+                warnError (errMsg);
+                return;
+            }
+            if (n1->nodes.length==0) { // removing a tip
+                if (p1->nodes.length>2) {
+                    lastName = travNode->GetName();
+                    travNode = me->DepthWiseTraversal();
+                    for (i=0; i<p1->nodes.length; i++) {
+                        if (p1->nodes.data[i]==n1) {
+                            break;
+                        }
+                    }
+                    for (j=i+1; j<p1->nodes.length; j++) {
+                        p1->nodes.data[j-1]=p1->nodes.data[j];
+                    }
+                    p1->nodes.length--;
+                    DeleteVariable(*lastName,true);
+                    delete (n1);
+                    continue;
+                } else {
+                    p2 = p1->parent;
+                    if (p2) {
+                        for (i=0; i<p2->nodes.length; i++) {
+                            if (p2->nodes.data[i]==p1) {
+                                break;
+                            }
+                        }
+                        lastName = travNode->GetName();
+                        travNode = me->DepthWiseTraversal();
+                        DeleteVariable(*lastName,true);
+                        if (p1->nodes.data[0]==n1) {
+                            p2->nodes.data[i]=p1->nodes.data[1];
+                            p1->nodes.data[1]->parent = p2;
+                        } else {
+                            lastName = travNode->GetName();
+                            travNode = me->DepthWiseTraversal();
+                            DeleteVariable(*lastName,true);
+                            p2->nodes.data[i]=p1->nodes.data[0];
+                            p1->nodes.data[0]->parent = p2;
+                        }
+                        delete (n1);
+                        delete (p1);
+                        continue;
+                    }
+                }
+            }
+        }
+        travNode = me->DepthWiseTraversal ();
+    }
+
+    currentSelection.Clear();
+    //likeFuncID = -1;
+    ShrinkDataFilter (true);
+    if (likeFuncID>=0) {
+        UpdateLnLikelihood();
+        me->SetUp();
+    }
+    BuildTree(true);
+
+    RenderTree();
+}
+
+//__________________________________________________________
+
+void    _HYTreePanel::CutSelectionToClipboard (bool cut)
+{
+    _String errMsg ("Internal Tree Error in CutSelectionToClipboard");
+    _TheTree *me = LocateMyTreeVariable();
+    long     i,k;
+    node<long>* ct = nil;
+    if (!me) {
+        return;
+    }
+    if (cut)
+        if (!ShrinkDataFilter()) {
+            return;
+        }
+    PrepareUndoData (6);
+    if (selectionTop) {
+        _CalcNode* travNode = me->DepthWiseTraversal (true), *killedNode;
+        while (travNode) {
+            if (travNode->GetAVariable()==selectionTop->in_object.varRef) {
+                ct = &me->GetCurrentNode();
+                break;
+            }
+            travNode = me->DepthWiseTraversal();
+        }
+
+        if (ct) {
+            node<long> *p1, *p2;
+
+            p1 = ct->parent;
+            if (p1) {
+                if (cut) {
+                    for (i=0; i<p1->nodes.length; i++) {
+                        if (p1->nodes.data[i]==ct) {
+                            break;
+                        }
+                    }
+                    if (p1->nodes.length>2) {
+                        for (k=i+1; k<p1->nodes.length; k++) {
+                            p1->nodes.data[k-1]=p1->nodes.data[k];
+                        }
+                        p1->nodes.length--;
+                    } else {
+                        p2 = p1->parent;
+                        if (!p2) {
+                            WarnError (errMsg);
+                            return;
+                        }
+                        for (k=0; k<p2->nodes.length; k++) {
+                            if (p2->nodes.data[k]==p1) {
+                                break;
+                            }
+                        }
+                        i = !i;
+                        p2->nodes.data[k] = p1->go_down(i+1);
+                        p2->nodes.data[k]->parent = p2;
+                        killedNode = (_CalcNode*)LocateVar(p1->in_object);
+                        travNode = (_CalcNode*)LocateVar(p2->nodes.data[k]->in_object);
+
+                        if (killedNode->GetModelIndex()==travNode->GetModelIndex()) {
+                            _SimpleList l1, l2;
+                            {
+                                _AVLList la1 (&l1),
+                                         la2 (&l2);
+
+                                travNode->ScanForVariables (la1,la1);
+                                killedNode->ScanForVariables (la2,la2);
+                                la1.ReorderList();
+                                la2.ReorderList();
+                            }
+
+                            for (k=0; k<l1.lLength; k++) {
+                                if (k==l2.lLength) {
+                                    break;
+                                }
+                                _Variable *thisVar = LocateVar(l1.lData[k]);
+                                _Constant nv (thisVar->Compute()->Value()+
+                                              LocateVar(l2.lData[k])->Compute()->Value());
+                                thisVar->SetValue (&nv);
+                            }
+
+                        }
+                        DeleteVariable (*killedNode->GetName(),true);
+                        delete(p1);
+                    }
+                }
+                ClearClipboardContents();
+                bool    hasModel = true;
+                if (cut) {
+                    treeFlags &= 0xFF7F;
+                    treePanelClipboardRoot = ct;
+                    RenameNodesInClipboard (treePanelClipboardRoot);
+                    currentSelection.Clear();
+                    selectionTop = nil;
+                    ShrinkDataFilter(true);
+                    if (likeFuncID>=0) {
+                        UpdateLnLikelihood();
+                        me->SetUp();
+                    }
+                    BuildTree(true);
+                    RenderTree();
+                } else {
+                    treePanelClipboardRoot = CopyNodesToClipboard (ct,me,hasModel);
+                }
+                return;
+            }
+        }
+    }
+    WarnError (errMsg);
+}
+
+//__________________________________________________________
+
+void    RenameNodesInClipboard  (node<long>* thisNode)
+{
+    for (long i=0; i<thisNode->nodes.length; i++) {
+        RenameNodesInClipboard (thisNode->nodes.data[i]);
+    }
+    _String oldName (*LocateVar(thisNode->in_object)->GetName()), newName (oldName);
+    newName.Trim (newName.Find('.')+1,-1);
+    newName = _String("_CLIPBOARDTREENODES_.")&newName;
+    RenameVariable(&oldName,&newName);
+}
+
+//__________________________________________________________
+
+void    RenameUndoNodes (node<long>* thisNode,_String& newTreeName)
+{
+    for (long i=0; i<thisNode->nodes.length; i++) {
+        RenameUndoNodes (thisNode->nodes.data[i], newTreeName);
+    }
+    _String oldName (*LocateVar(thisNode->in_object)->GetName()), newName (oldName);
+    newName.Trim (newName.Find('.'),-1);
+    newName = newTreeName&newName;
+    RenameVariable(&oldName,&newName);
+}
+
+//__________________________________________________________
+
+void    KillNodesInClipboard (node<long>* thisNode)
+{
+    for (long i=0; i<thisNode->nodes.length; i++) {
+        KillNodesInClipboard (thisNode->nodes.data[i]);
+    }
+    _String oldName (*LocateVar(thisNode->in_object)->GetName());
+    DeleteVariable (oldName,true);
+    delete (thisNode);
+}
+
+//__________________________________________________________
+
+node<long>* PatchNodesFromClipboard (node<long>* thisNode, _TheTree* me, bool& hasModel)
+{
+    node<long>* newNode = new node<long>;
+    checkPointer (newNode);
+
+    for (long i=0; i<thisNode->nodes.length; i++) {
+        newNode->add_node(*PatchNodesFromClipboard (thisNode->nodes.data[i],me,hasModel));
+    }
+
+
+    _CalcNode *sourceNode = (_CalcNode*)LocateVar(thisNode->in_object);
+
+    long      modelID = sourceNode->GetModelIndex(),
+              k=2;
+
+    _String   nodeName (*sourceNode->GetName()),
+              tryName;
+
+    nodeName.Trim(nodeName.Find('.')+1,-1);
+    nodeName = *me->GetName()&'.'&nodeName;
+    tryName  = nodeName;
+
+    while   (LocateVarByName(tryName)>=0) {
+        tryName = nodeName&'_'&k;
+        k++;
+    }
+    if (modelID != HY_NO_MODEL) {
+        nodeName = *(_String*)modelNames(modelID);
+    } else {
+        nodeName = empty;
+        hasModel = false;
+    }
+
+    modelID = lastMatrixDeclared;
+    lastMatrixDeclared = -1;
+
+    _String dummy ("1.0");
+    me->FinalizeNode(newNode,0,tryName,nodeName,dummy);
+
+    lastMatrixDeclared = modelID;
+
+    _CalcNode* thisCNode = (_CalcNode*)LocateVar (newNode->in_object);
+    thisCNode->CopyMatrixParameters (sourceNode);
+    thisCNode->SetCodeBase (me->GetCodeBase());
+    return newNode;
+}
+
+//__________________________________________________________
+
+node<long>* CopyNodesToClipboard (node<long>* thisNode, _TheTree* me, bool& hasModel)
+{
+    node<long>* newNode = new node<long>;
+    checkPointer (newNode);
+    for (long i=0; i<thisNode->nodes.length; i++) {
+        newNode->add_node(*CopyNodesToClipboard (thisNode->nodes.data[i],me,hasModel));
+    }
+
+    _CalcNode *sourceNode = (_CalcNode*)LocateVar(thisNode->in_object);
+    long      modelID = sourceNode->GetModelIndex();
+    _String   nodeName (*sourceNode->GetName()), tryName;
+    nodeName.Trim(me->GetName()->sLength+1,-1);
+    if (makeUndoTree) {
+        nodeName = _String("_UNDOTREENODES_4_")&*me->GetName()&'.'&nodeName;
+    } else {
+        nodeName = _String("_CLIPBOARDTREENODES_")&nodeName;
+    }
+    tryName = nodeName;
+    if (modelID>=0) {
+        nodeName = *(_String*)modelNames(modelID);
+    } else {
+        nodeName = empty;
+        hasModel = false;
+    }
+    modelID = lastMatrixDeclared;
+    lastMatrixDeclared = -1;
+    _String dummy ("1.0");
+    me->FinalizeNode(newNode,0,tryName,nodeName,dummy);
+    lastMatrixDeclared = modelID;
+    _CalcNode* thisCNode = (_CalcNode*)LocateVar (newNode->in_object);
+    thisCNode->CopyMatrixParameters (sourceNode);
+    thisCNode->SetCodeBase (me->GetCodeBase());
+    return newNode;
+}
+
+//__________________________________________________________
+
+void    CopyNodeParameters (node<nodeCoord>* destination, node<nodeCoord>* source)
+{
+    int n = source->get_num_nodes();
+    if (n!=destination->get_num_nodes()) {
+        return;
+    }
+    for (; n; n--) {
+        CopyNodeParameters (destination->go_down(n),source->go_down(n));
+    }
+    destination->in_object.label1 = source->in_object.label1;
+    destination->in_object.label2 = source->in_object.label2;
+    destination->in_object.branchName = source->in_object.branchName;
+    destination->in_object.textWidth = source->in_object.textWidth;
+    destination->in_object.flags = source->in_object.flags;
+
+}
+
+//__________________________________________________________
+
+void    _HYTreePanel::PasteClipboardTree (void)
+{
+    _String errMsg ("Internal Tree Error in PasteClipboardTree");
+    _TheTree *me = LocateMyTreeVariable();
+    long     i,k;
+    if (!me) {
+        return;
+    }
+    if (!CheckIfNeedUnscaled()) {
+        return;
+    }
+    if (!KillLikeFunc(8)) {
+        return;
+    }
+
+    node<long> *p1, *ct, *newp;
+
+    _CalcNode* travNode = me->DepthWiseTraversal (true);
+
+    node<nodeCoord>*  node1 = (node<nodeCoord>*)currentSelection(0);
+
+    while (travNode) {
+        if (travNode->GetAVariable()==node1->in_object.varRef) {
+            ct = &me->GetCurrentNode();
+            break;
+        }
+        travNode = me->DepthWiseTraversal();
+    }
+
+    if (!ct) {
+        WarnError (errMsg);
+        return;
+    }
+    p1 = ct->parent;
+    for (i=0; i<p1->nodes.length; i++) {
+        if (p1->nodes.data[i]==ct) {
+            break;
+        }
+    }
+    newp = new node<long>;
+    checkPointer ((Ptr)newp);
+    p1->nodes.data[i] = newp;
+    newp->parent = p1;
+    bool    hasModel = true;
+    node<long>* cliptop = PatchNodesFromClipboard (treePanelClipboardRoot,me,hasModel);
+    newp->add_node(* cliptop);
+    newp->add_node(*ct);
+
+    k = travNode->GetModelIndex();
+    _String nodeName (empty);
+    if (k>=0) {
+        nodeName = *(_String*)modelNames(k);
+        _String dummy ("1.0"),dummy2;
+        me->FinalizeNode(newp,FindUnusedSuffix ("Node"),dummy2,nodeName,dummy);
+        _CalcNode* targetNode = (_CalcNode*)LocateVar (newp->in_object);
+        targetNode->SetCodeBase (me->GetCodeBase());
+        targetNode->CopyMatrixParameters(travNode);
+
+        _SimpleList varList;
+        {
+            _AVLList vla (&varList);
+            targetNode->ScanForVariables(vla,vla);
+            travNode->ScanForVariables(vla,vla);
+        }
+        for (k=0; k<varList.lLength; k++) {
+            _Constant myValue(LocateVar(varList.lData[k])->Compute()->Value()/2.0);
+            LocateVar(varList.lData[k])->SetValue (&myValue);
+        }
+        dubiousNodes<<targetNode->GetAVariable();
+        UpdateLnLikelihood();
+    } else {
+        _String dummy ("1.0"), dummy2;
+        me->FinalizeNode(newp,FindUnusedSuffix ("Node"),dummy2,nodeName,dummy);
+    }
+
+    if (likeFuncID>=0) {
+        _LikelihoodFunction* theLF = (_LikelihoodFunction*)likeFuncList(likeFuncID);
+        theLF->MapTreeTipsToData (theLF->DependOnTree(*me->GetName()),true);
+    }
+    BuildTree(true);
+
+    RenderTree();
+    return;
+}
+
+//__________________________________________________________
+
+void    _HYTreePanel::MoveSubTree (void)
+{
+    _String errMsg ("Internal Tree Error in MoveSubTree");
+    bool    done = true,
+            savePDM = promptDefModel;
+    long     i,k;
+
+    _TheTree *me = LocateMyTreeVariable();
+
+    if (!me) {
+        return;
+    }
+
+    promptDefModel = true;
+    if (!CheckIfNeedUnscaled()) {
+        return;
+    }
+    promptDefModel = savePDM;
+
+    if (selectionTop) {
+        PrepareUndoData (9);
+        _CalcNode* travNode = me->DepthWiseTraversal (true), *killedNode;
+        node<long>* ct;
+
+        while (travNode) {
+            if (travNode->GetAVariable()==selectionTop->in_object.varRef) {
+                ct = &me->GetCurrentNode();
+                break;
+            }
+            travNode = me->DepthWiseTraversal();
+        }
+
+        if (ct) {
+            node<long> *p1, *p2, *ct2;
+
+            p1 = ct->parent;
+            if (p1) {
+                for (i=0; i<p1->nodes.length; i++) {
+                    if (p1->nodes.data[i]==ct) {
+                        break;
+                    }
+                }
+                if (p1->nodes.length>2) {
+                    for (k=i+1; k<p1->nodes.length; k++) {
+                        p1->nodes.data[k-1]=p1->nodes.data[k];
+                    }
+                    p1->nodes.length--;
+                } else {
+                    p2 = p1->parent;
+                    if (!p2) {
+                        WarnError (errMsg);
+                        return;
+                    }
+                    for (k=0; k<p2->nodes.length; k++) {
+                        if (p2->nodes.data[k]==p1) {
+                            break;
+                        }
+                    }
+                    i = !i;
+                    p2->nodes.data[k] = p1->go_down(i+1);
+                    p2->nodes.data[k]->parent = p2;
+                    killedNode = (_CalcNode*)LocateVar(p1->in_object);
+                    travNode = (_CalcNode*)LocateVar(p2->nodes.data[k]->in_object);
+
+                    if (killedNode->GetModelIndex()==travNode->GetModelIndex()) {
+                        _SimpleList l1, l2;
+                        {
+                            _AVLList la1 (&l1),
+                                     la2 (&l2);
+
+                            travNode->ScanForVariables (la1,la1);
+                            killedNode->ScanForVariables (la2,la2);
+                            la1.ReorderList();
+                            la2.ReorderList();
+                        }
+                        for (k=0; k<l1.lLength; k++) {
+                            if (k==l2.lLength) {
+                                break;
+                            }
+                            _Variable *thisVar = LocateVar(l1.lData[k]);
+                            _Constant nv (thisVar->Compute()->Value()+
+                                          LocateVar(l2.lData[k])->Compute()->Value());
+                            thisVar->SetValue (&nv);
+                        }
+
+                    }
+                    DeleteVariable (*killedNode->GetName(),true);
+                    delete(p1);
+
+                    // begin paste
+                    travNode = me->DepthWiseTraversal (true);
+
+                    node<nodeCoord>*node1 = (node<nodeCoord>*)currentSelection(currentSelection.lLength-1);
+
+                    while (travNode) {
+                        if (travNode->GetAVariable()==node1->in_object.varRef) {
+                            ct2 = &me->GetCurrentNode();
+                            break;
+                        }
+                        travNode = me->DepthWiseTraversal();
+                    }
+
+                    if (!ct2) {
+                        WarnError (errMsg);
+                        return;
+                    }
+                    p1 = ct2->parent;
+                    for (i=0; i<p1->nodes.length; i++) {
+                        if (p1->nodes.data[i]==ct2) {
+                            break;
+                        }
+                    }
+                    node <long>* newp = new node<long>;
+                    checkPointer ((Ptr)newp);
+                    p1->nodes.data[i] = newp;
+                    newp->parent = p1;
+                    newp->add_node(*ct);
+                    newp->add_node(*ct2);
+
+                    k = travNode->GetModelIndex();
+                    _String nodeName (empty);
+                    if (k != HY_NO_MODEL) {
+                        nodeName = *(_String*)modelNames(k);
+                        _String dummy ("1.0"), dummy2;
+                        me->FinalizeNode(newp,FindUnusedSuffix ("Node"),dummy2,nodeName,dummy);
+                        _CalcNode* targetNode = (_CalcNode*)LocateVar (newp->in_object);
+                        targetNode->SetCodeBase (me->GetCodeBase());
+                        targetNode->CopyMatrixParameters(travNode);
+                        _SimpleList varList;
+                        {
+                            _AVLList vla (&varList);
+                            targetNode->ScanForVariables(vla,vla);
+                            travNode->ScanForVariables(vla,vla);
+                        }
+                        //targetNode->ScanForVariables(varList,varList);
+                        //travNode->ScanForVariables(varList,varList);
+                        for (k=0; k<varList.lLength; k++) {
+                            _Constant myValue(LocateVar(varList.lData[k])->Compute()->Value()/2.0);
+                            LocateVar(varList.lData[k])->SetValue (&myValue);
+                        }
+                        dubiousNodes<<targetNode->GetAVariable();
+                    } else {
+                        _String dummy ("1.0"), dummy2;
+                        me->FinalizeNode(newp,FindUnusedSuffix ("Node"),dummy2,nodeName,dummy);
+                        _CalcNode* targetNode = (_CalcNode*)LocateVar (newp->in_object);
+                        targetNode->CopyMatrixParameters(travNode);
+                    }
+                }
+            } else {
+                done = false;
+            }
+        } else {
+            done = false;
+        }
+    } else {
+        done = false;
+    }
+
+    if (!done) {
+        WarnError (errMsg);
+    }
+
+    if (likeFuncID>=0) {
+        _LikelihoodFunction* theLF = (_LikelihoodFunction*)likeFuncList(likeFuncID);
+        theLF->MapTreeTipsToData (theLF->DependOnTree(*me->GetName()),true);
+        theLF->VoidOldResults();
+        me->SetUp();
+        UpdateLnLikelihood();
+    }
+
+    BuildTree(true);
+
+    RenderTree();
+    return;
+}
+//__________________________________________________________
+
+bool    _HYTreePanel::CheckIfNeedUnscaled (void)
+{
+    _HYPullDown *varMenu = (_HYPullDown*)GetObject (5);
+    if (scaleVariable.sLength) {
+        if (!promptDefModel) {
+            _String msg ("Newly created branches will inherit models/parameter values from the selected node(s)."),
+                    msg2("Do not warn again");
+            if (!ProceedPromptWithCheck (msg,msg2,promptDefModel, (Ptr)this)) {
+                return false;
+            }
+        }
+    } else {
+        if (varMenu->MenuItemCount()>3) {
+            for (long k=varMenu->MenuItemCount(); k>=3; k--) {
+                varMenu->DeleteMenuItem(3);
+            }
+            varMenu->EnableItem (1,false);
+            varMenu->EnableItem (2,false);
+        }
+    }
+    return true;
+}
+
+//__________________________________________________________
+
+bool    _HYTreePanel::ShrinkDataFilter (bool doit)
+{
+    if (likeFuncID>=0) {
+        if (!RequestLFDeleteOrAlter (likeFuncID)) {
+            return false;
+        }
+
+        if (!doit) {
+            if (!promptShrinkFilter) {
+                _String msg ("I will reduce the number of sequences in the datafilter attached to the tree to compensate for deletion of tips."),
+                        msg2("Do not warn again");
+                if (!ProceedPromptWithCheck (msg,msg2,promptShrinkFilter)) {
+                    return false;
+                }
+            }
+        } else {
+            _LikelihoodFunction* theLF = (_LikelihoodFunction*)likeFuncList (likeFuncID);
+            if (!theLF->UpdateFilterSize(theLF->DependOnTree(treeName))) {
+                _String msg3 ("Could not update data partition. Should I detach this tree from the data?");
+                if (ProceedPrompt(msg3,(Ptr)this)) {
+                    likeFuncID = -1;
+                    return true;
+                }
+                return false;
+            }
+        }
+    }
+    return true;
+}
+
+//__________________________________________________________
+
+bool    _HYTreePanel::KillLikeFunc (char code)
+{
+    if (likeFuncID>=0) {
+        if (!RequestLFDeleteOrAlter (likeFuncID)) {
+            return false;
+        }
+
+        if (!promptKillLF) {
+            _String msg ("This operation will destroy the likelihood function currently associated with the tree."),
+                    msg2("Do not warn again");
+            if (!ProceedPromptWithCheck (msg,msg2,promptKillLF)) {
+                return false;
+            }
+        }
+        PrepareUndoData (code);
+        postLFKillEvent (GetID(),likeFuncID);
+        KillLFRecord (likeFuncID,false);
+        likeFuncID = -1;
+        //DeleteObject (theLF);
+    } else {
+        PrepareUndoData (code);
+    }
+    return true;
+}
+//__________________________________________________________
+_TheTree*  _HYTreePanel::LocateMyTreeVariable()
+{
+
+    long f = LocateVarByName (treeName);
+    _TheTree* me = nil;
+    if (f>=0) {
+        _Variable* v = FetchVar(f);
+        if (v->ObjectClass()==TREE) {
+            me = (_TheTree*)v;
+        } else {
+            f = -1;
+        }
+    }
+    if (f<0) {
+        _String errMsg ("The tree variable ");
+        errMsg = errMsg & treeName & " is no longer valid. This tree can still be printed or saved, but can't be rescaled";
+        _HYPullDown*  theMenu = (_HYPullDown*)GetObject(3);
+        for (f = 0; f<theMenu->MenuItemCount(); f++) {
+            theMenu->EnableItem(f,false);
+        }
+        theMenu = (_HYPullDown*)GetObject(5);
+        for (f = 0; f<theMenu->MenuItemCount(); f++) {
+            theMenu->EnableItem(f,false);
+        }
+        WarnError (errMsg);
+        return nil;
+    }
+    return me;
+}
+
+//__________________________________________________________
+long  _HYTreePanel::FindUnusedSuffix(_String suffix)
+{
+    _String prefix (treeName), testName;
+    prefix = treeName&'.'&suffix;
+    long    p = 1;
+    while(1) {
+        testName = prefix&_String (p);
+        if (LocateVarByName(testName)<0) {
+            break;
+        }
+        p++;
+    }
+    return p;
+}
+
+//__________________________________________________________
+void _HYTreePanel::SelectAllBranches(void)
+{
+    node<nodeCoord>* currentNd = NodeTraverser(coordTree), *parent = nil;
+    currentSelection.Clear();
+    while (currentNd) {
+        parent = currentNd->parent;
+        if (!parent) {
+            break;
+        }
+        if (currentNd->in_object.branchName.sLength) {
+            currentNd->in_object.flags|=HY_BRANCH_SELECT;
+            currentSelection<<(long)currentNd;
+        }
+        currentNd = NodeTraverser((node <nodeCoord>*)nil)   ;
+    }
+    _UpdateOperationsMenu();
+    RenderTree();
+}
+
+//__________________________________________________________
+void _HYTreePanel::SelectEntireSubtree(void)
+{
+    node<nodeCoord>* rtNode=(node<nodeCoord>*)currentSelection.lData[0], *currentNd = NodeTraverser(rtNode);
+    //currentSelection.Clear();
+    while ((currentNd)&&(currentNd!=rtNode)) {
+        if (currentNd->in_object.branchName.sLength) {
+            currentNd->in_object.flags|=HY_BRANCH_SELECT;
+            currentSelection<<(long)currentNd;
+        }
+        currentNd = NodeTraverser((node <nodeCoord>*)nil)   ;
+    }
+    _UpdateOperationsMenu();
+    RenderTree();
+}
+
+//__________________________________________________________
+void _HYTreePanel::InvertSelection()
+{
+    node<nodeCoord> *currentNd = NodeTraverser(coordTree);
+
+    currentSelection.Clear();
+
+    while (currentNd) {
+        if (currentNd->in_object.branchName.sLength)
+            if (currentNd->in_object.flags&HY_BRANCH_SELECT) {
+                currentNd->in_object.flags-=HY_BRANCH_SELECT;
+            } else {
+                currentNd->in_object.flags|=HY_BRANCH_SELECT;
+                currentSelection<<(long)currentNd;
+            }
+        currentNd = NodeTraverser((node <nodeCoord>*)nil)   ;
+    }
+    _UpdateOperationsMenu();
+    RenderTree();
+}
+
+//__________________________________________________________
+void _HYTreePanel::GrowSelection(node<nodeCoord>* currentRoot, bool force)
+{
+    node<nodeCoord>* startAt = currentRoot;
+    if (currentRoot == nil) {
+        currentSelection.Clear();
+        startAt = coordTree;
+    }
+
+    if (startAt->in_object.flags&HY_BRANCH_SELECT) {
+        force = true;
+    }
+
+    if (force) {
+        startAt->in_object.flags|=HY_BRANCH_SELECT;
+        currentSelection << (long)startAt;
+    }
+
+    for (long kk=startAt->get_num_nodes(); kk>=1; kk--) {
+        GrowSelection (startAt->go_down (kk), force);
+    }
+
+    if (currentRoot == nil) {
+        _UpdateOperationsMenu();
+        RenderTree();
+    }
+}
+
+//__________________________________________________________
+void _HYTreePanel::SelectIncompleteBranches(void)
+{
+    node<nodeCoord>* currentNd = NodeTraverser(coordTree), *parent = nil;
+    currentSelection.Clear();
+    dubiousNodes.Sort();
+    while (currentNd) {
+        parent = currentNd->parent;
+        if (!parent) {
+            break;
+        }
+        currentNd->in_object.flags&=HY_BRANCH_DESELECT;
+        if (dubiousNodes.BinaryFind(currentNd->in_object.varRef)>=0) {
+            currentNd->in_object.flags|=HY_BRANCH_SELECT;
+            currentSelection<<(long)currentNd;
+        }
+        currentNd = NodeTraverser((node <nodeCoord>*)nil)   ;
+    }
+    _UpdateOperationsMenu();
+    if (currentSelection.lLength==0) {
+        _String msg ("I couldn't find any branches marked as incomplete (That's good!).");
+        ProblemReport (msg,(Ptr)this);
+    }
+    RenderTree();
+}
+
+//__________________________________________________________
+void _HYTreePanel::SelectBranchesWithoutModel(void)
+{
+    node<nodeCoord>* currentNd = NodeTraverser(coordTree), *parent = nil;
+    currentSelection.Clear();
+    while (currentNd) {
+        parent = currentNd->parent;
+        if (!parent) {
+            break;
+        }
+        if (currentNd->in_object.varRef>=0) {
+            currentNd->in_object.flags&=HY_BRANCH_DESELECT;
+            if (((_VariableContainer*)LocateVar(currentNd->in_object.varRef))->GetModelIndex()== HY_NO_MODEL) {
+                currentNd->in_object.flags|=HY_BRANCH_SELECT;
+                currentSelection<<(long)currentNd;
+            }
+        }
+        currentNd = NodeTraverser((node <nodeCoord>*)nil)   ;
+    }
+    _UpdateOperationsMenu();
+    if (currentSelection.lLength==0) {
+        _String msg ("All  branches have models attached to them.");
+        ProblemReport (msg,(Ptr)this);
+    }
+    RenderTree();
+}
+//__________________________________________________________
+void _HYTreePanel::PreserveSelection (_SimpleList& s)
+{
+    for (long k=0; k<currentSelection.lLength; k++) {
+        s<<((node<nodeCoord>*)currentSelection(k))->in_object.varRef;
+    }
+    s.Sort();
+}
+
+//__________________________________________________________
+void _HYTreePanel::RestoreSelection (_SimpleList& s)
+{
+    if (s.lLength) {
+        node<nodeCoord>* thisNode = NodeTraverser (coordTree);
+        while (thisNode) {
+            if (s.BinaryFind(thisNode->in_object.varRef)>=0) {
+                thisNode->in_object.flags |= HY_BRANCH_SELECT;
+                currentSelection<<(long)thisNode;
+            }
+            thisNode = NodeTraverser((node <nodeCoord>*)nil);
+        }
+    }
+}
+//__________________________________________________________
+void _HYTreePanel::InvokeNodeEditor (void)
+{
+    node<nodeCoord>* thisNode = (node<nodeCoord>*) currentSelection.lData[0];
+
+    _TheTree* me = LocateMyTreeVariable();
+    long      f;
+    if (!me) {
+        return;
+    }
+
+    _String     nodeName (treeName);
+    nodeName =  nodeName&'.'&thisNode->in_object.branchName;
+
+    _CalcNode*  thisCNode = (_CalcNode*)LocateVar (thisNode->in_object.varRef);
+
+    _String     startingName (*thisCNode->GetName());
+
+    long        nodeModel = thisCNode->GetTheModelID();
+
+    bool        doSCV = false,
+                incFlag;
+
+    if (currentSelection.lLength==1) {
+        f = dubiousNodes.Find(thisNode->in_object.varRef);
+    }
+    incFlag = (f>=0);
+
+    bool    doBuild;
+    _HYNodeInfoDialog * ndd = new _HYNodeInfoDialog (nodeName, &nodeModel, currentSelection.lLength==1,LocateMyTreeVariable(),&currentSelection,&doSCV,&incFlag,&doBuild,this);
+    ndd->Activate();
+    while (windowObjectRefs.Find ((long)ndd)>=0) {
+        handleGUI();
+    }
+
+    bool    doDraw = false,
+            doLFR  = false;
+    if (currentSelection.lLength==1) {
+        thisCNode = (_CalcNode*)FetchVar(LocateVarByName(startingName));
+        if (!thisCNode) {
+            nodeName = "Internal Tree Edit Error.";
+            FlagError (nodeName);
+        }
+        if (nodeName.Find('.')<0) {
+            startingName.Trim (startingName.Find('.')+1,-1);
+        }
+        if (!nodeName.Equal (&startingName))
+            // node renamed
+        {
+            doDraw = (treeFlags&HY_TREEPANEL_TIP_LABELS)||(treeFlags&HY_TREEPANEL_INT_LABELS);
+            _String*  nn = thisCNode->GetName();
+            thisNode->in_object.branchName = nodeName;
+            nodeName = nn->Cut(0,nn->Find('.'))&nodeName;
+            RenameVariable (thisCNode->GetName(),&nodeName);
+            doLFR = true;
+            postChangeLFParamsEvent(GetID(),likeFuncID);
+        }
+        if (thisCNode->GetAVariable()!=thisNode->in_object.varRef) {
+            node<long>* cNode = DepthWiseStepTraverser(&me->GetRoot());
+            while (cNode) {
+                if (cNode->in_object==thisNode->in_object.varRef) {
+                    cNode->in_object = thisCNode->GetAVariable();
+                    break;
+                }
+                cNode = DepthWiseStepTraverser ((node<long>*)nil);
+            }
+            thisNode->in_object.varRef = thisCNode->GetAVariable();
+        }
+    }
+
+    if ((doSCV)&&(!doLFR)) {
+        doLFR = true;
+        if (likeFuncID>=0) {
+            ((_LikelihoodFunction*)likeFuncList(likeFuncID))->RescanAllVariables();
+            postChangeLFParamsEvent(GetID(),likeFuncID);
+        }
+    }
+
+    if (incFlag) {
+        if (currentSelection.lLength==1) {
+            if (f<0) {
+                dubiousNodes<<thisCNode->GetAVariable();
+            }
+        }
+    } else {
+        if ((f>=0)&&(currentSelection.lLength==1)) {
+            dubiousNodes.Delete (f);
+        }
+    }
+
+    if (!doBuild) {
+        doBuild = me->HasChanged();
+        if (doBuild&&(likeFuncID==-1)) {
+            me->MarkDone();
+        }
+
+    } else {
+        SetVariableReference (treeName);
+        if (!doLFR) {
+            postChangeLFEvent(GetID(),likeFuncID);
+        }
+        return;
+    }
+
+    if (doBuild) {
+        PrepareUndoData (-1);
+        _SimpleList     saveSel;
+        PreserveSelection (saveSel);
+        BuildTree(true);
+        RestoreSelection (saveSel);
+        if (!doLFR) {
+            postChangeLFEvent(GetID(),likeFuncID);
+        }
+        doDraw = true;
+    } else if (doSCV) {
+        UpdateScalingVariablesList();
+    }
+    if (doDraw) {
+        RenderTree ();
+    }
+
+}
+
+//__________________________________________________________
+
+void    _HYTreePanel::FlushUndoData (void)
+{
+    if (undoCode>0) {
+        undoNodeList.Clear();
+        if ((undoCode>2)&&(undoTree)) {
+            KillNodesInClipboard (undoTree);
+            undoTree = nil;
+        }
+        if ((undoCode>6)&&(undoCode!=9)) {
+            if (undoLFPointer) {
+                DeleteObject ((BaseRef)undoLFPointer);
+                undoLFPointer = nil;
+            }
+        }
+    }
+    undoCode = -1;
+}
+
+//__________________________________________________________
+
+void    _HYTreePanel::PrepareUndoData (char code)
+// codes:
+// 1 - swap
+// 2 - flip
+// 3 - collapse
+// 4 - Delete Tips
+// 5 - Cut
+// 6 - Graft
+// 7 - Paste
+{
+    FlushUndoData();
+    if ((code==1)||(code==2)) {
+        undoCode = code;
+        undoNodeList.Duplicate (&currentSelection);
+    } else if (code>2) {
+        undoCode = code;
+        makeUndoTree = true;
+        _TheTree* me = LocateMyTreeVariable();
+        bool      dummy;
+        undoTree = CopyNodesToClipboard(&me->GetRoot(),me,dummy);
+        makeUndoTree = false;
+        if ((code>6)&&(code!=9)) {
+            undoLFPointer = nil;
+            if (likeFuncID>=0) {
+                undoLFName = *(_String*)likeFuncNamesList (likeFuncID);
+                undoLFPointer = (Ptr)likeFuncList (likeFuncID);
+                ((BaseRef)undoLFPointer)->nInstances++;
+            }
+        }
+    }
+}
+
+//__________________________________________________________
+
+void    _HYTreePanel::UndoLastOperation (void)
+{
+    switch (undoCode) {
+    case 1: {
+        currentSelection.Clear();
+        currentSelection.Duplicate(&undoNodeList);
+        SwapSelectedSubTrees();
+        break;
+    }
+    case 2: {
+        currentSelection.Clear();
+        currentSelection.Duplicate(&undoNodeList);
+        FlipSelectedBranches();
+        break;
+    }
+    case 3:
+    case 4:
+    case 5:
+    case 6:
+    case 7:
+    case 8:
+    case 9: {
+        _TheTree* me = LocateMyTreeVariable();
+        KillNodesInClipboard (&me->GetRoot());
+        me->SetRoot (undoTree);
+        RenameUndoNodes (undoTree,*me->GetName());
+        undoTree = nil;
+        if ((undoCode>6)&&(undoCode!=9)) {
+            if (undoLFPointer) {
+                likeFuncID = likeFuncList.lLength;
+                likeFuncNamesList && & undoLFName;
+                likeFuncList << (_LikelihoodFunction*) undoLFPointer;
+                undoLFPointer = nil;
+            }
+        } else if ((undoCode == 9)&&(likeFuncID>=0)) {
+            _LikelihoodFunction* theLF = (_LikelihoodFunction*)likeFuncList(likeFuncID);
+            theLF->MapTreeTipsToData (theLF->DependOnTree(*me->GetName()),true);
+        }
+        UpdateLnLikelihood();
+        if ((undoCode%2==0)&&(likeFuncID>=0)) {
+            ShrinkDataFilter (true);
+        }
+
+        BuildTree(true);
+        RenderTree();
+    }
+    }
+    FlushUndoData();
+    _UpdateOperationsMenu();
+}
+
+//__________________________________________________________
+
+void  _HYTreePanel::FishEyeProjection (long fx, long fy, long hSize, long vSize, node<nodeCoord>* thisNode)
+{
+    if (treeFlags&HY_TREEPANEL_PROJECTION) {
+        thisNode->in_object.h = thisNode->in_object.auxL;
+        thisNode->in_object.v = thisNode->in_object.auxD;
+    } else {
+        thisNode->in_object.auxL = thisNode->in_object.h;
+        thisNode->in_object.auxD = thisNode->in_object.v;
+    }
+
+    bool       side = thisNode->in_object.h<fx;
+
+    _Parameter dMax = side?fx:hSize-fx,
+               gArg = fabs(thisNode->in_object.h-fx)/dMax;
+
+    gArg = ((distortion+1.)*gArg/(distortion*gArg+1.));
+
+    if (side) {
+        thisNode->in_object.h = fx-gArg*dMax;
+    } else {
+        thisNode->in_object.h = fx+gArg*dMax;
+    }
+
+    thisNode->in_object.v =  vSize-thisNode->in_object.v;
+    side = thisNode->in_object.v<fy;
+    dMax = side?fy:vSize-fy;
+    gArg = fabs(thisNode->in_object.v-fy)/dMax;
+    gArg     = (distortion+1.)*gArg/(distortion*gArg+1.);
+
+    if (side) {
+        thisNode->in_object.v = vSize-(fy-gArg*dMax);
+    } else {
+        thisNode->in_object.v = vSize-(gArg*dMax+fy);
+    }
+
+    for (long k = thisNode->get_num_nodes(); k; k--) {
+        FishEyeProjection (fx,fy,hSize, vSize,thisNode->go_down(k));
+    }
+
+    /*if ((treeFlags&HY_TREEPANEL_STRAIGHT)&&(thisNode->parent == nil))
+    {
+        PreStraightenEdges (coordTree);
+        StraightenEdges(coordTree,0,HY_TREEPANEL_MARGIN,-1);
+    }*/
+}
+
+//__________________________________________________________
+
+void  _HYTreePanel::HandleFisheyeButton (void)
+{
+    _HYButtonBar * bb = (_HYButtonBar*)GetObject (7);
+    int          h,v;
+
+    bb->GetButtonLoc(5,h,v,true);
+
+    _String menuChoice ("Set Distortion Parameter"),
+            prStr      ("Select Distortion Parameter (>=0):");
+
+    _List   menuAll;
+
+    menuAll && & menuChoice;
+
+    if (HY_TREEPANEL_PROJECTION&treeFlags) {
+        menuChoice = "Restore Normal View";
+        menuAll && & menuChoice;
+    }
+
+    menuChoice = HandlePullDown (menuAll,h,v,0);
+    bb->_UnpushButton();
+
+    if (menuChoice.sLength) {
+        h = menuAll.Find (&menuChoice);
+        if (h==0) {
+            menuChoice = distortion;
+            if (EnterStringDialog (menuChoice, prStr, (Ptr)this)) {
+                distortion = menuChoice.toNum();
+            }
+        } else {
+            RenderTree ();
+        }
+    }
+}
+
+//__________________________________________________________
+
+void  _HYTreePanel::HandleViewOptions (void)
+{
+    _HYTreeViewDialog * fD = new _HYTreeViewDialog (this,treeFlags&HY_TREEPANEL_CIRCULAR);
+    fD->Activate();
+}
+
+//__________________________________________________________
+
+void  _HYTreePanel::HandleLabels (bool below)
+{
+    _List options;
+
+    options && & none;
+
+    _HYPullDown * p1 = (_HYPullDown*) GetObject (5);
+
+    _TheTree *t = LocateMyTreeVariable ();
+    if (t) {
+        long            mI = p1->MenuItemCount();
+
+        if (mI>3) {
+            options && & eSubsScale;
+        }
+
+        if (t->HaveStringBranchLengths()) {
+            options && & assValScale;
+        }
+
+        for (long k=3; k<mI; k++) {
+            options << p1->GetMenuItem (k);
+        }
+
+        _HYLabelDialog * ld = new _HYLabelDialog (this, options, below);
+        ld->Activate();
+    }
+}
+
+
+//__________________________________________________________
+
+void  _HYTreePanel::ToggleScaleOption (void)
+{
+    bool onOff = treeFlags & HY_TREEPANEL_SCALE_TO_WINDOW;
+    _HYButtonBar* zoom = (_HYButtonBar*)GetObject (7);
+    for (long k = 0; k<6; k++) {
+        zoom->EnableButton (k,onOff);
+    }
+
+    _HYCanvas* theCanvas = (_HYCanvas*)GetObject (0),
+               * theRuler  = (_HYCanvas*)GetObject (2);
+
+    _HYCanvas* newCanvas,
+               * newRuler;
+
+    _HYRect         canvasSettings =  {50,50,theCanvas->rel.bottom-theCanvas->rel.top,
+                                       theCanvas->rel.right-theCanvas->rel.left,
+                                       HY_COMPONENT_NO_SCROLL
+                                      },
+
+                    rulerSettings = canvasSettings;
+
+    rulerSettings.top = rulerSettings.bottom = HY_TREEPANEL_RULER_EXPANDED;
+    if (onOff) {
+        newCanvas = new _HYCanvas (canvasSettings, GetOSWindowData(), canvasSettings.bottom, canvasSettings.right, theCanvas->depth);
+        newRuler  = new _HYCanvas (rulerSettings, GetOSWindowData(), rulerSettings.bottom, rulerSettings.right, theRuler->depth);
+        treeFlags -= HY_TREEPANEL_SCALE_TO_WINDOW;
+        zoom->settings.top = zoom->settings.bottom = 50;
+        zoom->SetButtonLayoutW(4);
+        SetTableDimensions (6,3);
+        SetCell (0,0,GetObject (1));
+        SetCell (0,1,GetObject (4));
+        SetCell (0,2,GetObject (3));
+        SetCell (1,0,GetObject (1));
+        SetCell (1,1,GetObject (6));
+        SetCell (1,2,GetObject (5));
+        SetCell (2,0,GetObject (1));
+        SetCell (2,1,GetObject (8));
+        SetCell (2,2,GetObject (7));
+        SetCell (3,0,GetObject (1));
+        SetCell (3,1,GetObject (9));
+        SetCell (3,2,GetObject (9));
+        SetCell (4,0,GetObject (2));
+        SetCell (4,1,GetObject (2));
+        SetCell (4,2,GetObject (2));
+        SetCell (5,0,GetObject (0));
+        SetCell (5,1,GetObject (0));
+        SetCell (5,2,GetObject (0));
+    } else {
+        newCanvas = new _HYStretchCanvas (canvasSettings, GetOSWindowData(),canvasSettings.bottom, canvasSettings.right, theCanvas->depth, HY_SCANVAS_HORIZONTAL|HY_SCANVAS_VERTICAL);
+        newRuler  = new _HYStretchCanvas (rulerSettings, GetOSWindowData(), rulerSettings.bottom, rulerSettings.right , theRuler->depth,HY_SCANVAS_HORIZONTAL);
+        treeFlags += HY_TREEPANEL_SCALE_TO_WINDOW;
+        zoom->settings.top = zoom->settings.bottom = 30;
+        zoom->SetButtonLayoutW(8);
+        SetTableDimensions (3,3);
+        SetCell (0,0,GetObject (3));
+        SetCell (0,1,GetObject (5));
+        SetCell (0,2,GetObject (7));
+        SetCell (1,0,GetObject (2));
+        SetCell (1,1,GetObject (2));
+        SetCell (1,2,GetObject (2));
+        SetCell (2,0,GetObject (0));
+        SetCell (2,1,GetObject (0));
+        SetCell (2,2,GetObject (0));
+    }
+    newCanvas->SetDimensions (canvasSettings,theCanvas->rel);
+    newRuler->SetDimensions (rulerSettings,theRuler->rel);
+
+    checkPointer    (newCanvas);
+    checkPointer    (newRuler);
+
+    if (!onOff) {
+        ((_HYStretchCanvas*)newRuler)->SetMessageRecipient (this);
+    }
+
+    components.Replace (0,newCanvas,false);
+    components.Replace (2,newRuler,false);
+
+    FitToWindow(true);
+    dim = MinMaxWindowDimensions ();
+    UpdateComponentInfo ();
+    /*RenderTree ();
+    RenderRuler();*/
+}
+
+//__________________________________________________________
+// _HYLabelDialog
+//__________________________________________________________
+
+_HYLabelDialog::_HYLabelDialog (_HYTreePanel* rec, _List& options,bool below):_HYFontDialog (below?rec->branchLabel2:rec->branchLabel1,rec)
+{
+
+    //long          index,
+    //              cellWidth;
+
+    _HYColor        bgc     = GetDialogBackgroundColor();
+
+    _HYRect         canvasSettings = {30,100,30,100,HY_COMPONENT_NO_SCROLL|HY_COMPONENT_TRANSP_BG};
+
+    _HYLabel*       l1      = new _HYLabel (canvasSettings, GetOSWindowData());
+    _HYLabel*       l2      = new _HYLabel (canvasSettings, GetOSWindowData());
+    _HYLabel*       l3      = new _HYLabel (canvasSettings, GetOSWindowData());
+
+
+    canvasSettings.left = canvasSettings.right = 200;
+
+    _HYPullDown*    p1      = new _HYPullDown (canvasSettings, GetOSWindowData());
+    _HYPullDown*    p2      = new _HYPullDown (canvasSettings, GetOSWindowData());
+    _HYPullDown*    p3      = new _HYPullDown (canvasSettings, GetOSWindowData());
+
+    p1->SetMessageRecipient (this);
+    p2->SetMessageRecipient (this);
+    p3->SetMessageRecipient (this);
+
+    AddObject (l1);
+    AddObject (l2);
+    AddObject (l3);
+
+    AddObject (p1);
+    AddObject (p2);
+    AddObject (p3);
+
+    _SimpleList saveCells (cells);
+
+    long k;
+
+    SetTableDimensions (8,3);
+
+    SetCell   (0,0,l1);
+    SetCell   (0,1,p1);
+    SetCell   (0,2,p1);
+
+    SetCell   (1,0,l2);
+    SetCell   (1,1,p2);
+    SetCell   (1,2,p2);
+
+    SetCell   (2,0,l3);
+    SetCell   (2,1,p3);
+    SetCell   (2,2,p3);
+
+    for (k=0; k<15; k++) {
+        cells.lData[k+9] = saveCells.lData[k];
+    }
+
+    _HYFont  labelFont;
+    l1->SetBackColor (bgc);
+    l2->SetBackColor (bgc);
+    l3->SetBackColor (bgc);
+
+    p1->SetBackColor (bgc);
+    p2->SetBackColor (bgc);
+    p3->SetBackColor (bgc);
+
+#ifdef __WINDOZE__
+    labelFont.face  = "Arial";
+    labelFont.size  = 14;
+#else
+    labelFont.face  = "System Font";
+    labelFont.size  = 12;
+#endif
+    labelFont.style = HY_FONT_PLAIN;
+
+    l1->SetFont (labelFont);
+    l2->SetFont (labelFont);
+    l3->SetFont (labelFont);
+
+    l1->SetAlignFlags (HY_ALIGN_LEFT);
+    l2->SetAlignFlags (HY_ALIGN_LEFT);
+    l3->SetAlignFlags (HY_ALIGN_LEFT);
+
+    p1->SetAlignFlags (HY_ALIGN_LEFT);
+    p2->SetAlignFlags (HY_ALIGN_LEFT);
+    p3->SetAlignFlags (HY_ALIGN_LEFT);
+
+    l1->SetText       ("Label with:");
+    l2->SetText       ("Aligh at:");
+    l3->SetText       ("Max. Digits:");
+
+    p2->AddMenuItem   ("Left",-1);
+    p2->AddMenuItem   ("Center",-1);
+    p2->AddMenuItem   ("Right",-1);
+
+    char flag = below?rec->bottomAlign:rec->topAlign;
+    if (flag&HY_ALIGN_LEFT) {
+        p2->ChangeSelection (0,false);
+    } else if (flag&HY_ALIGN_RIGHT) {
+        p2->ChangeSelection (2,false);
+    } else {
+        p2->ChangeSelection (1,false);
+    }
+
+
+    for (k=0; k<options.lLength; k++) {
+        p1->AddMenuItem (*(_String*)options(k),-1);
+    }
+
+    _String * scv = &(below?rec->branchVar2:rec->branchVar1);
+
+    k = options.Find (scv);
+
+    if (k==-1) {
+        long f;
+        k=0;
+        if (scv->Equal (&expectedNumberOfSubs) && ((f=options.Find (&eSubsScale))>=0)) {
+            k = f;
+        } else if (scv->Equal (&stringSuppliedLengths) && ((f=options.Find (&assValScale))>=0)) {
+            k = f;
+        }
+    }
+
+    p1->ChangeSelection (k,false);
+
+    for (k=1; k<16; k++) {
+        p3->AddMenuItem (_String (k),-1);
+    }
+
+    p3->ChangeSelection ((below?rec->labelDigits2:rec->labelDigits1)-1,false);
+
+    DeleteObject (l1);
+    DeleteObject (l2);
+    DeleteObject (l3);
+    DeleteObject (p1);
+    DeleteObject (p2);
+    DeleteObject (p3);
+
+    if (below) {
+        SetTitle ("Below Branch Labels");
+    } else {
+        SetTitle ("Above Branch Labels");
+    }
+
+    which = below;
+
+    _HYRect     dim = MinMaxWindowDimensions();
+
+    SetWindowRectangle (0,0,dim.bottom,dim.right);
+    CenterWindow       (this);
+}
+
+//__________________________________________________________
+
+bool    _HYLabelDialog::ProcessEvent (_HYEvent* e)
+{
+    bool        done = false;
+    _String     firstArg;
+    long        i,f;
+
+    if (e->EventClass()==_hyButtonPushEvent) {
+        firstArg = e->EventCode().Cut (0,(f=e->EventCode().Find(','))-1);
+        i = MatchComponentID (firstArg);
+
+        if (i==7) { // OK
+            _HYTreePanel* tp = (_HYTreePanel*) mr;
+            bool          needRedraw = false,
+                          labelsOn = which?tp->treeFlags&HY_TREEPANEL_LABEL2:tp->treeFlags&HY_TREEPANEL_LABEL1,
+                          needResize = false;
+
+            _HYFont      *oldFont = &(which?tp->branchLabel2:tp->branchLabel1);
+
+            if ((!myFont.face.Equal(&oldFont->face))||(myFont.size!=oldFont->size)||(myFont.style!=oldFont->style)) {
+                *oldFont = myFont;
+                if (labelsOn)
+                    if (myFont.size-3!=tp->windowTextMarginV)
+                        if (myFont.size>=(which?tp->branchLabel1.size:tp->branchLabel2.size))
+                            if (myFont.size+3>=tp->treeLabelFont.size/2+5) {
+                                tp->windowTextMarginV = myFont.size+3;
+                                needResize = true;
+                            }
+
+                needRedraw = true;
+            }
+
+            _HYPullDown * p1 = (_HYPullDown*)components (12),
+                          * p2 = (_HYPullDown*)components (13),
+                            * p3 = (_HYPullDown*)components (14);
+
+            _String      newScaleVar,
+                         *oldScaleVar;
+
+            oldScaleVar = (_String*)p1->GetMenuItem (p1->GetSelection());
+            if (oldScaleVar->Equal(&eSubsScale)) {
+                newScaleVar = expectedNumberOfSubs;
+            } else if (oldScaleVar->Equal(&assValScale)) {
+                newScaleVar = stringSuppliedLengths;
+            } else if (!oldScaleVar->Equal(&none)) {
+                newScaleVar = *oldScaleVar;
+            }
+
+            oldScaleVar = &(which?tp->branchVar2:tp->branchVar1);
+
+            if (!newScaleVar.Equal(oldScaleVar)) {
+                needRedraw = true;
+                if (newScaleVar.sLength==0) {
+                    tp->treeFlags -= (which ? HY_TREEPANEL_LABEL2 : HY_TREEPANEL_LABEL1);
+                } else {
+                    if (oldScaleVar->sLength == 0) {
+                        tp->treeFlags += (which ? HY_TREEPANEL_LABEL2 : HY_TREEPANEL_LABEL1);
+                        labelsOn = true;
+                        if (myFont.size-3!=tp->windowTextMarginV)
+                            if (myFont.size>=(which?tp->branchLabel1.size:tp->branchLabel2.size))
+                                if (myFont.size+3>=tp->treeLabelFont.size/2+5) {
+                                    tp->windowTextMarginV = myFont.size+3;
+                                    needResize = true;
+                                }
+                    }
+                    _TheTree * mt = tp->LocateMyTreeVariable();
+                    if (mt) {
+                        mt->AssignLabelsToBranches (tp->coordTree,&newScaleVar,which);
+                    }
+                }
+                *oldScaleVar = newScaleVar;
+            }
+
+            i = p3->GetSelection ();
+            char   * oldDigits = &(which?tp->labelDigits2:tp->labelDigits1);
+
+            if (i+1!=*oldDigits) {
+                needRedraw = true;
+                *oldDigits = i+1;
+            }
+
+            i = p2->GetSelection ();
+            oldDigits = &(which?tp->bottomAlign:tp->topAlign);
+
+            if (i==0) {
+                i = HY_ALIGN_LEFT;
+            } else if (i==1) {
+                i = 0;
+            } else {
+                i = HY_ALIGN_RIGHT;
+            }
+            if (i!=*oldDigits) {
+                needRedraw = true;
+                *oldDigits = i;
+            }
+
+            if (needRedraw&&labelsOn&&(!tp->IsVertical())&&(!((tp->treeFlags&HY_TREEPANEL_STRAIGHT)||(tp->treeFlags&HY_TREEPANEL_ARCS)||(tp->treeFlags&HY_TREEPANEL_CIRCULAR)))) {
+                if (needResize) {
+                    tp->SetVSpace (tp->vSpace,true);
+                } else {
+                    tp->RenderTree();
+                }
+            }
+            postWindowCloseEvent (GetID());
+            done = true;
+        }
+    }
+
+    if (done) {
+        DeleteObject (e);
+        return true;
+    }
+    return _HYFontDialog::ProcessEvent(e);
+}
+
+
+//__________________________________________________________
+// _HYTreeViewDialog
+//__________________________________________________________
+
+_HYTreeViewDialog::_HYTreeViewDialog (_HYTreePanel* rec, bool radial):_HYFontDialog (rec->treeLabelFont,rec)
+{
+
+    //long          index,
+    //              cellWidth;
+
+    _HYColor        bgc     = GetDialogBackgroundColor();
+    _HYRect         canvasSettings = {30,300,30,300,HY_COMPONENT_NO_SCROLL|HY_COMPONENT_TRANSP_BG};
+
+    _HYCheckbox*    c1      = new _HYCheckbox (canvasSettings, GetOSWindowData());
+
+    canvasSettings.left = canvasSettings.right = 200;
+    _HYTextBox*     t1      = new _HYTextBox (canvasSettings, GetOSWindowData());
+    canvasSettings.left = canvasSettings.right = 120;
+    _HYTextBox*     t2      = new _HYTextBox (canvasSettings, GetOSWindowData());
+    _HYTextBox*     t3      = new _HYTextBox (canvasSettings, GetOSWindowData());
+
+    canvasSettings.left = canvasSettings.right = 100;
+    _HYLabel*       l1      = new _HYLabel (canvasSettings, GetOSWindowData());
+    _HYLabel*       l2      = new _HYLabel (canvasSettings, GetOSWindowData());
+    _HYLabel*       l3      = new _HYLabel (canvasSettings, GetOSWindowData());
+
+    canvasSettings.left = canvasSettings.right = 81;
+    canvasSettings.top = canvasSettings.bottom = 59;
+
+    _HYCanvas*      cc      = new _HYCanvas(canvasSettings, GetOSWindowData(), 59, 81, 32);
+
+    cc->StartDraw();
+    cc->SetDialogBG();
+    cc->EndDraw();
+
+    c1->SetMessageRecipient (this);
+    t1->SetMessageRecipient (this);
+    t2->SetMessageRecipient (this);
+    t3->SetMessageRecipient (this);
+
+    AddObject (c1); // 9
+    AddObject (l1); // 10
+    AddObject (t1); // 11
+    AddObject (t2); // 12
+    AddObject (t3); // 13
+    AddObject (cc); // 14
+    AddObject (l2); // 15
+    AddObject (l3); // 16
+
+    AddKeyboardChainObject (t1);
+    AddKeyboardChainObject (t2);
+    AddKeyboardChainObject (t3);
+
+    _SimpleList saveCells (cells);
+
+    long k;
+
+    SetTableDimensions (9,3);
+
+    for (k=0; k<12; k++) {
+        cells.lData[k] = saveCells.lData[k];
+    }
+
+    SetCell (4,0,l1);
+    SetCell (4,1,t1);
+    SetCell (4,2,t1);
+
+    SetCell (5,0,l2);
+    SetCell (5,1,t2);
+    SetCell (5,2,cc);
+
+    SetCell (6,0,l3);
+    SetCell (6,1,t3);
+    SetCell (6,2,cc);
+
+    SetCell (7,0,c1);
+    SetCell (7,1,c1);
+    SetCell (7,2,c1);
+
+    for (k=24; k<27; k++) {
+        cells.lData[k] = saveCells.lData[k-12];
+    }
+
+
+    _HYFont  labelFont;
+    c1->SetBackColor (bgc);
+    t1->SetBackColor (bgc);
+    t2->SetBackColor (bgc);
+    t3->SetBackColor (bgc);
+    l1->SetBackColor (bgc);
+    l2->SetBackColor (bgc);
+    l3->SetBackColor (bgc);
+
+#ifdef __WINDOZE__
+    labelFont.face  = "Arial";
+    labelFont.size  = 14;
+#else
+    labelFont.face  = "System Font";
+    labelFont.size  = 12;
+#endif
+    labelFont.style = HY_FONT_PLAIN;
+
+    c1->SetFont (labelFont);
+    c1->SetAlignFlags (HY_ALIGN_LEFT);
+    c1->SetState (rec->treeFlags & HY_TREEPANEL_SCALE_TO_WINDOW);
+
+    t1->SetFont (labelFont);
+    t1->SetAlignFlags (HY_ALIGN_LEFT);
+    lw    = ((_HYTreePanel*)rec)->branchWidth;
+    t1->SetText (_String ((long)lw));
+
+
+    t2->SetFont (labelFont);
+    t2->SetAlignFlags (HY_ALIGN_LEFT);
+    sAng      = ((_HYTreePanel*)rec)->arcStart;
+    t2->SetText (_String (sAng));
+
+    t3->SetFont (labelFont);
+    t3->SetAlignFlags (HY_ALIGN_LEFT);
+    fAng      = ((_HYTreePanel*)rec)->arcEnd;
+    t3->SetText (_String (fAng));
+
+    l1->SetFont (labelFont);
+    l1->SetAlignFlags (HY_ALIGN_LEFT);
+    l1->SetText ("Line width:");
+
+    l2->SetFont (labelFont);
+    l2->SetAlignFlags (HY_ALIGN_LEFT);
+    l2->SetText ("Start Angle:");
+
+    l3->SetFont (labelFont);
+    l3->SetAlignFlags (HY_ALIGN_LEFT);
+    l3->SetText ("End Angle:");
+
+    c1->SetText       ("Scale tree by resizing the window");
+
+    DeleteObject (c1);
+    DeleteObject (t1);
+    DeleteObject (l1);
+    DeleteObject (t2);
+    DeleteObject (l2);
+    DeleteObject (t3);
+    DeleteObject (l3);
+    DeleteObject (cc);
+
+
+    tb1 = false;
+    tb2 = false;
+    tb3 = false;
+
+    DrawArcPreview ();
+
+    SetTitle ("Tree Display Options");
+
+    which = radial;
+
+    _HYRect     dim = MinMaxWindowDimensions();
+
+    SetWindowRectangle (0,0,dim.bottom,dim.right);
+    CenterWindow       (this);
+}
+
+//__________________________________________________________
+
+bool    _HYTreeViewDialog::ProcessEvent (_HYEvent* e)
+{
+    bool        done = false;
+    _String     firstArg;
+    long        i,f;
+
+    if (e->EventClass()==_hyButtonPushEvent) {
+        firstArg = e->EventCode().Cut (0,(f=e->EventCode().Find(','))-1);
+        i = MatchComponentID (firstArg);
+        if (i==7) { // OK
+            done = false;
+            bool   rd = false;
+            if (lw != ((_HYTreePanel*)mr)->branchWidth) {
+                ((_HYTreePanel*)mr)->branchWidth = lw;
+                done = true;
+            }
+
+            if ((sAng!=((_HYTreePanel*)mr)->arcStart)||(fAng!=((_HYTreePanel*)mr)->arcEnd)) {
+                ((_HYTreePanel*)mr)->arcStart = sAng;
+                ((_HYTreePanel*)mr)->arcEnd   = fAng;
+                done = which;
+                if (done) {
+                    ((_HYTreePanel*)mr)->BuildTree (true);
+                }
+            }
+
+            if ((!myFont.face.Equal(&firstFont.face))||(myFont.size!=firstFont.size)||(myFont.style!=firstFont.style)) {
+                mr->SetFont (myFont);
+                rd = true;
+            }
+
+            if (((_HYCheckbox*)GetCellObject (7,0))->GetState() != ((bool)((((_HYTreePanel*)mr)->treeFlags & HY_TREEPANEL_SCALE_TO_WINDOW)))) {
+                ((_HYTreePanel*)mr)->ToggleScaleOption ();
+                rd = true;
+            }
+
+            if (done && (!rd)) {
+                ((_HYTreePanel*)mr)->RenderTree();
+            }
+
+            postWindowCloseEvent (GetID());
+            done = true;
+        }
+    } else if (e->EventClass()==_hyTextEditChange) {
+        firstArg = e->EventCode().Cut (0,(f=e->EventCode().Find(','))-1);
+        i = MatchComponentID (firstArg);
+        _HYTextBox* tb = nil,
+                    * tbb;
+        _HYButton*  kb = (_HYButton*)components (7);
+        _Parameter  t;
+        bool        disable = false;
+        tb = (_HYTextBox*)components (i);
+        if (i==11) {
+            f = tb->GetText().toNum();
+            if ((f<=0)||(f>=127)) {
+                disable = true;
+                tb1 = true;
+            } else {
+                if (tb1) {
+                    tb1 = false;
+                    tb->SetForeColor ((_HYColor) {
+                        0,0,0
+                    });
+                }
+                lw = f;
+            }
+        }
+        if ((i==12)||(i==13)) {
+            t = tb->GetText().toNum();
+            if (i==12) {
+                if ((t<0.0)||(t>6.284)||(t>=fAng)) {
+                    disable = true;
+                    tb2 = true;
+                } else {
+                    if (tb2) {
+                        tb2 = false;
+                        tb->SetForeColor ((_HYColor) {
+                            0,0,0
+                        });
+                    }
+                    sAng = t;
+                    if (tb3) {
+                        tbb = (_HYTextBox*)components (13);
+                        t = tbb->GetText().toNum();
+                        if ((t>sAng)&&(t<=6.284)) {
+                            tb3 = false;
+                            tbb->SetForeColor ((_HYColor) {
+                                0,0,0
+                            });
+                            fAng = t;
+                        }
+                    }
+                }
+            } else {
+                if ((t<0.0)||(t>6.284)||(t<=sAng)) {
+                    disable = true;
+                    tb3 = true;
+                } else {
+                    if (tb3) {
+                        tb3 = false;
+                        tb->SetForeColor ((_HYColor) {
+                            0,0,0
+                        });
+                    }
+                    fAng = t;
+                    if (tb2) {
+                        tbb = (_HYTextBox*)components (12);
+                        t = tbb->GetText().toNum();
+                        if ((t<fAng)&&(t>=0)) {
+                            tb2 = false;
+                            tbb->SetForeColor ((_HYColor) {
+                                0,0,0
+                            });
+                            sAng = t;
+                        }
+                    }
+                }
+
+            }
+            DrawArcPreview();
+        }
+
+
+        if (disable ) {
+            kb->EnableButton (false);
+            tb->SetForeColor ((_HYColor) {
+                255,0,0
+            });
+        } else {
+            if (!(tb1||tb2||tb3)) {
+                kb->EnableButton(true);
+            }
+        }
+    }
+
+    if (done) {
+        DeleteObject (e);
+        return true;
+    }
+    return _HYFontDialog::ProcessEvent(e);
+}
+
+//__________________________________________________________
+
+void    _HYTreeViewDialog::DrawArcPreview (void)
+{
+    _HYCanvas * cc = (_HYCanvas*) components (14);
+    cc->StartDraw();
+    //cc->SetColor (GetDialogBackgroundColor());
+    _HYRect      drawer = {0,0,cc->h, cc->w,1};
+    //cc->FillRect (drawer);
+    cc->EraseAll();
+    if (!(tb2||tb3)) {
+        drawer.left  = 15;
+        drawer.right = 65;
+        drawer.top   = 5;
+        drawer.bottom = 55;
+
+        cc->SetColor ((_HYColor) {
+            120,120,120
+        });
+        cc->FillArc  (drawer,sAng*180./3.1415926-90,(fAng-sAng)*180./3.1415926);
+        drawer.width = 2;
+        cc->SetColor ((_HYColor) {
+            0,0,0
+        });
+        cc->DrawArc  (drawer,sAng*180./3.1415926-90,(fAng-sAng)*180./3.1415926);
+    }
+    cc->EndDraw();
+    cc->_MarkForUpdate();
+}
+
+//__________________________________________________________
+
+void    _HYTreePanel::HandleTreeSave (long c, _String filePath)
+{
+    FILE*       theFile = doFileOpen (filePath.sData,"w");
+    if (theFile) {
+        switch (c) {
+        case 1: {
+            _String res = GetTreeString();
+            fprintf (theFile,"#NEXUS\nBEGIN TREES;\n\tTree %s = %s;\nEND;",GetTitle().Cut(5,-1).getStr(),res.getStr());
+        }
+        break;
+        case 2:
+        case 3:
+        case 4:
+            if (_TheTree    * me    = LocateMyTreeVariable()) {
+                if (c==2) {
+                    _List       nodeNames;
+                    _AVLListXL  nodeRemap (&nodeNames);
+                    _CalcNode*  cNode  = me->LeafWiseTraversal(true);
+                    long        nodeCounter = 1;
+                    fprintf (theFile,"#NEXUS\nBEGIN TREES;\n\tTRANSLATE");
+
+                    while (cNode) {
+                        if (nodeCounter > 1) {
+                            fprintf (theFile,",");
+                        }
+                        _String * rmp = new _String (nodeCounter++),
+                        *nname = new _String;
+                        checkPointer (nname);
+                        checkPointer (rmp);
+                        me->GetNodeName (&me->GetCurrentNode(),*nname,false);
+                        nodeRemap.Insert (nname,(long)rmp);
+                        fprintf (theFile,"\n\t\t%s %s",rmp->sData,nname->sData);
+                        DeleteObject (rmp);
+                        cNode  = me->LeafWiseTraversal(false);
+                    }
+                    _String res = GetTreeString(&nodeRemap);
+                    fprintf (theFile,";\n\tTree %s = %s;\nEND;",GetTitle().Cut(5,-1).getStr(),res.getStr());
+                } else {
+                    _Matrix   plot_dim (1,2,false,true);
+                    _HYCanvas* theCanvas = (_HYCanvas*)GetObject (0);
+                    plot_dim.theData[0] = theCanvas->w;
+                    plot_dim.theData[1] = theCanvas->h;
+                    _FString  plot_sc  (new _String(((treeFlags&HY_TREEPANEL_SCALED)&&scaleVariable.sLength)?scaleVariable:empty));
+
+                    _AssociativeList*   viewOptions = new _AssociativeList ();
+                    viewOptions->MStore (treeOutputLayout,new _Constant(c==4), false);
+                    setParameter (treeOutputAVL,viewOptions,false);
+
+                    _FString   *res = (_FString*)me->PlainTreeString (&plot_sc,&plot_dim);
+                    fwrite (res->theString->sData,1,res->theString->sLength,theFile);
+                    DeleteObject (res);
+                }
+            }
+            break;
+        default: {
+            _String res = GetTreeString();
+            fwrite (res.sData,1,res.sLength,theFile);
+        }
+        }
+
+        fclose (theFile);
+    } else {
+        filePath = _String ("Couldn't open file '") & filePath & "' for writing.";
+        ProblemReport (filePath,(Ptr)this);
+    }
+}
+
+//__________________________________________________________
+
+void    _HYTreePanel::GenerateDistanceTable (char opt)
+{
+    _TheTree* me = LocateMyTreeVariable();
+    if (me) {
+        long         treeNameLength = me->GetName()->sLength+1;
+
+        _String      reportName;
+        _List        vNames;
+        _Matrix*     dataMatrix;
+
+        if (opt==1)
+            // branch length distribution
+        {
+            _List        iBranchNames,
+                         leafNames,
+                         iBranchLengths,
+                         leafLengths;
+
+            _SimpleList  sortingOrder,
+                         sortingOrder2;
+
+            if (currentSelection.lLength == 0) {
+                node<nodeCoord>* meNode = NodeTraverser(coordTree);
+                while (meNode->parent) {
+                    if (meNode->in_object.varRef>=0)
+                        if (meNode->get_num_nodes()) {
+                            sortingOrder    << (long)meNode;
+                            iBranchLengths.AppendNewInstance(new _Constant(meNode->in_object.bL));
+                        } else {
+                            sortingOrder2   << (long)meNode;
+                            leafLengths.AppendNewInstance(new _Constant (meNode->in_object.bL));
+                        }
+
+                    meNode = NodeTraverser((node<nodeCoord>*)NULL);
+                }
+            } else {
+                for (long k=0; k<currentSelection.lLength; k++) {
+                    node <nodeCoord> * meNode = (node <nodeCoord>*)currentSelection(k);
+                    if (meNode->get_num_nodes()) {
+                        sortingOrder    << (long)meNode;
+                        iBranchLengths.AppendNewInstance(new  _Constant (meNode->in_object.bL));
+                    } else {
+                        sortingOrder2   << (long)meNode;
+                        leafLengths.AppendNewInstance(new _Constant (meNode->in_object.bL));
+                    }
+                }
+            }
+
+            for (long k=0; k<sortingOrder.lLength; k++) {
+                node <nodeCoord> * meNode = (node <nodeCoord>*)sortingOrder(k);
+                reportName = LocateVar(meNode->in_object.varRef)->GetName()->Cut(treeNameLength,-1);
+                iBranchNames && & reportName;
+                sortingOrder.lData[k] = k;
+            }
+
+            for (long k=0; k<sortingOrder2.lLength; k++) {
+                node <nodeCoord> * meNode = (node <nodeCoord>*)sortingOrder2(k);
+                reportName = LocateVar(meNode->in_object.varRef)->GetName()->Cut(treeNameLength,-1);
+                leafNames && & reportName;
+                sortingOrder2.lData[k] = k;
+            }
+
+            SortLists (&leafNames,   &sortingOrder2);
+            SortLists (&iBranchNames,&sortingOrder);
+
+            reportName = _String ("Branch Length Distribution for ") & *me->GetName();
+            //vNames    << leafNames;
+            //vNames    << iBranchNames;
+
+            dataMatrix = new _Matrix (leafNames.lLength+iBranchNames.lLength, 1, false, true);
+            checkPointer (dataMatrix);
+
+            _String       rowLabels (128L, true);
+
+            rowLabels << "Branch";
+
+            for (long k=0; k<sortingOrder2.lLength; k++) {
+                dataMatrix->theData[k] = ((_Constant*)leafLengths(sortingOrder2.lData[k]))->Value();
+                rowLabels << ';';
+                rowLabels << (_String*)leafNames(k);
+            }
+
+            for (long k=0; k<sortingOrder.lLength; k++) {
+                dataMatrix->theData[k+sortingOrder2.lLength] = ((_Constant*)iBranchLengths(sortingOrder.lData[k]))->Value();
+                rowLabels << ';';
+                rowLabels << (_String*)iBranchNames(k);
+            }
+
+            rowLabels.Finalize();
+
+            vNames.AppendNewInstance(new _String ("Length"));
+            vNames && & rowLabels;
+        } else { // pairwise distances
+            node<nodeCoord>* traversalTop;
+
+            if (currentSelection.lLength) {
+                if (selectionTop&&(currentSelection.lLength>1)) {
+                    traversalTop = selectionTop;
+                } else {
+                    reportName = "HyPhy can only compute pairwise distances on a complete subtree (or the entire tree)";
+                    ProblemReport (reportName);
+                    return;
+                }
+            } else {
+                traversalTop = coordTree;
+            }
+
+            _SimpleList      indexer,
+                             indexer2;
+
+            _List            leafNames;
+
+            long             leafCounter  = 0,
+                             leafCounter2 = 0;
+
+            node<nodeCoord>* meNode = NodeTraverser(traversalTop);
+
+            while (meNode) {
+                if (meNode->get_num_nodes() == 0) {
+                    _String   tstr (*LocateVar(meNode->in_object.varRef)->GetName(),treeNameLength,-1);
+                    leafNames && & tstr;
+                    indexer<< leafCounter++;
+                }
+                meNode->in_object.auxL = 0;
+                meNode = NodeTraverser((node<nodeCoord>*)NULL);
+            }
+
+            _Matrix * unsortedDM = nil;
+            checkPointer (unsortedDM = new _Matrix (leafCounter, leafCounter, false, true));
+
+            meNode = NodeTraverser(traversalTop);
+            while (meNode != traversalTop) {
+                node<nodeCoord>* parNode = meNode->parent;
+                _SimpleList    * pInfo   = (_SimpleList*)parNode->in_object.auxL;
+                if (!pInfo) {
+                    checkPointer (pInfo = (_SimpleList*)(parNode->in_object.auxL = (long)new _SimpleList (leafCounter,0,0)));
+                }
+
+
+                if (meNode->get_num_nodes() == 0) {
+                    pInfo->lData[leafCounter2] = 1;
+                    for (long nid = 0; nid < leafCounter; nid++)
+                        if (nid!=leafCounter2) {
+                            unsortedDM->theData[nid*leafCounter + leafCounter2] += meNode->in_object.bL;
+                            unsortedDM->theData[leafCounter2*leafCounter + nid] += meNode->in_object.bL;
+                            /*char buffer [255];
+                            snprintf (buffer, sizeof(buffer), "Adding %g %d:%d:%d (%g,%g) to %s %s path from leaf %s\n", meNode->in_object.bL,nid,leafCounter2,leafCounter,unsortedDM->theData[nid*leafCounter + leafCounter2],unsortedDM->theData[leafCounter2*leafCounter + nid],
+                                                                                             ((_String*)leafNames(nid))->sData,((_String*)leafNames(leafCounter2))->sData,((_String*)leafNames(leafCounter2))->sData);
+                            BufferToConsole (buffer);*/
+                        }
+
+                    leafCounter2 ++;
+                } else {
+                    _SimpleList inL,
+                                outL,
+                                *myL = (_SimpleList*)meNode->in_object.auxL;
+
+
+                    for (long nid = 0; nid < leafCounter; nid++)
+                        if (myL->lData[nid]) {
+                            inL << nid;
+                            pInfo->lData[nid] = 1;
+                        } else {
+                            outL << nid;
+                        }
+
+
+                    DeleteObject (myL);
+                    meNode->in_object.auxL = 0;
+
+                    if (meNode->in_object.bL>=0.0) {
+                        for (long nid = 0; nid < inL.lLength; nid++) {
+                            long idx1 = inL.lData[nid];
+                            for (long nid2 = 0; nid2 < outL.lLength; nid2++) {
+                                long idx2 = outL.lData[nid2];
+                                unsortedDM->theData[idx1*leafCounter + idx2] += meNode->in_object.bL;
+                                unsortedDM->theData[idx2*leafCounter + idx1] += meNode->in_object.bL;
+                                /*char buffer [255];
+                                snprintf (buffer, sizeof(buffer), "Adding %g %d:%d:%d  (%g,%g) to %s %s path from leaf %s\n", meNode->in_object.bL,idx1,idx2,leafCounter,
+                                                                                                  unsortedDM->theData[idx1*leafCounter + idx2],
+                                                                                                  unsortedDM->theData[idx2*leafCounter + idx1],
+                                                                                                  ((_String*)leafNames(idx1))->sData,((_String*)leafNames(idx2))->sData,meNode->in_object.branchName.sData);
+                                BufferToConsole (buffer);*/
+                            }
+                        }
+                    }
+                }
+                meNode = NodeTraverser((node<nodeCoord>*)NULL);
+            }
+            DeleteObject ((BaseRef)meNode->in_object.auxL);
+            meNode->in_object.auxL = 0;
+
+            /*_List          pairwiseDistances;
+                             // list of of lists
+                             // each list has 3 constants
+                             // 1: 1st leaf ID in leafID
+                             // 2: 2nd leaf ID in leafID
+                             // 3: the length of the path between leaves from entries 1 and 2
+
+            while (meNode)
+            {
+                if (meNode->get_num_nodes())
+                {
+                    _List * descInfo = new _List;
+                    checkPointer (descInfo);
+
+                    for (long k=1; k<=meNode->get_num_nodes(); k++)
+                    {
+                        node<nodeCoord>* meChild = meNode->go_down(k);
+                        if (meChild->get_num_nodes())
+                        {
+                            _List * childInfo = (_List*)meChild->in_object.auxL;
+
+                            for (long jj = 0; jj < childInfo->lLength; jj++)
+                            {
+                                _List    * ccInfo      = (_List*)(*childInfo)(jj);
+                                _Constant* pathToChild = (_Constant*)(*ccInfo)(1),
+                                         * thisLeafID  = (_Constant*)(*ccInfo)(0);
+
+                                _Parameter pathToMe = pathToChild->Value();
+
+                                for (long ii = 0; ii < descInfo->lLength; ii++)
+                                {
+                                    _List distanceEntry,
+                                         *previousEntry = (_List*)(*descInfo)(ii);
+
+                                    distanceEntry << thisLeafID;
+                                    distanceEntry << (*previousEntry) (0);
+                                    distanceEntry && & _Constant (((_Constant*)(*previousEntry)(1))->Value()+pathToMe);
+
+                                    pairwiseDistances && & distanceEntry;
+                                }
+                                pathToChild->SetValue(pathToMe+meChild->in_object.bL);
+                            }
+
+                            (*descInfo) << *childInfo;
+                            DeleteObject  (childInfo);
+                        }
+                        else
+                        {
+                            for (long jj = 0; jj < descInfo->lLength; jj++)
+                            {
+                                _List distanceEntry,
+                                     *previousEntry = (_List*)(*descInfo)(jj);
+
+                                distanceEntry << (*previousEntry)(0);
+                                distanceEntry && & _Constant (leafCounter);
+                                distanceEntry && & _Constant (((_Constant*)(*previousEntry)(1))->Value()+meChild->in_object.bL);
+
+                                pairwiseDistances && & distanceEntry;
+                            }
+
+                            _List * childInfo = new _List;
+                            checkPointer (childInfo);
+                            (*childInfo) && & _Constant (leafCounter);
+                            (*childInfo) && & _Constant (meChild->in_object.bL);
+                            (*descInfo) << childInfo;
+                            DeleteObject (childInfo);
+                            _String   tstr (*LocateVar(meChild->in_object.varRef)->GetName(),treeNameLength,-1);
+                            leafNames && & tstr;
+                            indexer<< leafCounter++;
+                        }
+                    }
+                    meNode->in_object.auxL = (long)descInfo;
+
+                }
+
+                if (meNode == traversalTop)
+                    break;
+
+                meNode = NodeTraverser((node<nodeCoord>*)NULL);
+            }
+
+            DeleteObject ((_List*)meNode->in_object.auxL);*/
+
+            indexer2.Duplicate (&indexer);
+            SortLists    (&leafNames, &indexer2);
+            SortLists    (&indexer2, &indexer);
+
+            dataMatrix      = new _Matrix (leafNames.lLength, leafNames.lLength, false, true);
+            checkPointer    (dataMatrix);
+
+            /*for (long idx = 0; idx < pairwiseDistances.lLength; idx++)
+            {
+                _List * distanceEntry = (_List*) pairwiseDistances (idx);
+                long    rIdx = indexer.lData[(long) ((_Constant*)(*distanceEntry)(0))->Value()],
+                        cIdx = indexer.lData[(long) ((_Constant*)(*distanceEntry)(1))->Value()];
+
+                _Parameter value = ((_Constant*)(*distanceEntry)(2))->Value();
+
+                dataMatrix->theData[rIdx*leafNames.lLength+cIdx] = value;
+                dataMatrix->theData[cIdx*leafNames.lLength+rIdx] = value;
+            }*/
+
+            for (long idx = 0; idx < leafCounter; idx ++) {
+                long midx = indexer.lData[idx];
+                for (long idx2 = idx + 1; idx2 < leafCounter; idx2++) {
+                    long midx2 = indexer.lData[idx2];
+                    dataMatrix->theData [midx2*leafCounter+midx] =
+                        dataMatrix->theData [midx*leafCounter+midx2] =
+                            unsortedDM->theData [idx*leafCounter+idx2];
+                }
+            }
+
+            DeleteObject (unsortedDM);
+
+            _String       rowLabels (128L, true);
+
+            rowLabels << "Leaf";
+
+            for (long k=0; k<leafNames.lLength; k++) {
+                rowLabels << ';';
+                rowLabels << (_String*)leafNames(k);
+                vNames    << (_String*)leafNames(k);
+            }
+
+            rowLabels.Finalize();
+            vNames && & rowLabels;
+            reportName = _String ("Pairwise distances for ") & *me->GetName();
+
+        }
+        _HYChartWindow * reportChart = (_HYChartWindow*) FindWindowByNameAndOpen (reportName);
+        if (reportChart) {
+            reportChart->SetTable(vNames, *dataMatrix);
+        } else {
+            reportChart = new _HYChartWindow (reportName, vNames, *dataMatrix, nil);
+        }
+        reportChart->BringToFront();
+        DeleteObject (dataMatrix);
+    }
+}
+
+//__________________________________________________________________
+
+_String         parameterLocal          ("Local"),
+                parameterGlobal           ("Global"),
+                parameterUE               ("Expression"),
+                parameterConstrained  ("Constrained"),
+                parameterMV               ("Multiple Values"),
+                parameterAV               ("Assigned Value"),
+                parameterBL               ("Branch Length"),
+                parameterP                ("Parameter"),
+                parameterUND          ("To be defined");
+
+//__________________________________________________________________
+_HYNodeInfoDialog::_HYNodeInfoDialog     (_String& n, long* ms, bool is, _TheTree* tr, _SimpleList* ts, bool* us, bool* ifl, bool* res,_HYTreePanel* pref)
+    :_HYTWindow (n,false,true,(Ptr)pref)
+{
+    modelSelection = ms;
+    isSingle       = is;
+    treeRef        = tr;
+    updateSCV      = us;
+    incFlag        = ifl;
+    tSel           = ts;
+    result         = res;
+    iNodeName      = &n;
+    parentRef      = pref;
+
+    _HYColor       bgRGB = GetDialogBackgroundColor ();
+
+    _HYRect        canvasSettings = {30,100,30,100,HY_COMPONENT_NO_SCROLL|HY_COMPONENT_TRANSP_BG};
+
+    _HYLabel*      l1 = new _HYLabel   (canvasSettings, GetOSWindowData());
+    checkPointer   (l1);
+
+    canvasSettings.width = HY_COMPONENT_BORDER_T|HY_COMPONENT_TRANSP_BG;
+    _HYLabel*      l3 = new _HYLabel   (canvasSettings, GetOSWindowData());
+    checkPointer   (l3);
+    canvasSettings.width = HY_COMPONENT_NO_SCROLL|HY_COMPONENT_TRANSP_BG;
+
+    if (!isSingle) {
+        canvasSettings.width = HY_COMPONENT_BORDER_B|HY_COMPONENT_TRANSP_BG;
+        nodeName = "Selected Branches";
+    } else {
+        nodeName = n.Cut(n.FindBackwards(".",0,-1)+1,-1);
+    }
+
+    _HYLabel*       l2 = new _HYLabel   (canvasSettings, GetOSWindowData());
+    checkPointer   (l2);
+
+    canvasSettings.left = canvasSettings.right = 200;
+    _HYPullDown*    p1 = new _HYPullDown(canvasSettings, GetOSWindowData());
+    checkPointer   (p1);
+
+
+    canvasSettings.width = HY_COMPONENT_BORDER_T|HY_COMPONENT_TRANSP_BG;
+    _HYTextBox*     tb2 = new _HYTextBox (canvasSettings, GetOSWindowData());
+    checkPointer    (tb2);
+    _HYLabel*       l5  = new _HYLabel (canvasSettings, GetOSWindowData());
+    checkPointer    (l5);
+
+    canvasSettings.width = HY_COMPONENT_NO_SCROLL|HY_COMPONENT_TRANSP_BG;
+
+    canvasSettings.left = canvasSettings.right = 180;
+
+    _HYTextBox*     tb = new _HYTextBox (canvasSettings, GetOSWindowData());
+    checkPointer   (tb);
+
+    canvasSettings.left = canvasSettings.right  = 20;
+    canvasSettings.top  = canvasSettings.bottom = 30;
+
+    _HYButtonBar*   bb = new _HYButtonBar (canvasSettings, GetOSWindowData());
+    checkPointer   (bb);
+
+    canvasSettings.top  = canvasSettings.bottom = 35;
+    _HYLabel*       l4 = new _HYLabel (canvasSettings, GetOSWindowData());
+    checkPointer   (l4);
+
+    canvasSettings.left  = canvasSettings.right  = 300;
+    canvasSettings.top   = canvasSettings.bottom = 180;
+    canvasSettings.width = HY_COMPONENT_V_SCROLL|HY_COMPONENT_TRANSP_BG;
+
+    _HYTable*       pl = new _HYTable    (canvasSettings, GetOSWindowData(), 1,3, 100, 180, HY_TABLE_STATIC_TEXT|HY_TABLE_CANTSELECT);
+    checkPointer   (pl);
+
+    pl->selectionType = HY_TABLE_SEL_ROWS|HY_TABLE_FOCUSABLE|HY_TABLE_DONT_SIZE|HY_TABLE_NODRAG_SELECTION|HY_TABLE_SINGLE_SELECTION;
+    pl->SetColumnSpacing (0,15,false);
+    pl->SetColumnSpacing (1,-15,false);
+
+    canvasSettings.top   = canvasSettings.bottom = 20;
+    canvasSettings.width = HY_COMPONENT_NO_SCROLL|HY_COMPONENT_TRANSP_BG;
+    _HYTable*       ph   = new _HYTable    (canvasSettings, GetOSWindowData(), 1,3, 100, 20,
+                                            HY_TABLE_BEVELED|HY_TABLE_STATIC_TEXT);
+    checkPointer   (ph);
+    ph->SetColumnSpacing (0,15,false);
+    ph->SetColumnSpacing (1,-15,false);
+
+    canvasSettings.width = HY_COMPONENT_BORDER_B|HY_COMPONENT_TRANSP_BG;
+    canvasSettings.top   = canvasSettings.bottom = 25;
+    _HYCheckbox*    cb   = new _HYCheckbox (canvasSettings, GetOSWindowData());
+    checkPointer   (cb);
+
+    canvasSettings.top    = canvasSettings.bottom = 35;
+    canvasSettings.left   = canvasSettings.right  = 100;
+
+    canvasSettings.width = HY_COMPONENT_NO_SCROLL|HY_COMPONENT_TRANSP_BG;
+
+    _HYButtonBar*   bb2  = new _HYButtonBar (canvasSettings, GetOSWindowData());
+    checkPointer   (bb2);
+
+    canvasSettings.left   = canvasSettings.right  = 100;
+    _HYButton*      obtn   = new _HYButton  (canvasSettings, GetOSWindowData());
+    checkPointer    (obtn);
+
+    canvasSettings.left   = canvasSettings.right  = 80;
+    _HYButton*      cbtn   = new _HYButton  (canvasSettings, GetOSWindowData());
+    checkPointer    (cbtn);
+
+
+    bb->SetMessageRecipient (this);
+    bb2->SetMessageRecipient (this);
+    pl->SetMessageRecipient (this);
+    //p1->SetMessageRecipient (this);
+    ph->SetMessageRecipient (this);
+    cb->SetMessageRecipient (this);
+    cbtn->SetMessageRecipient (this);
+    obtn->SetMessageRecipient (this);
+    tb->SetMessageRecipient (this);
+    tb2->SetMessageRecipient (this);
+
+    SetTitle (_String("Branch Info for \"")&nodeName&"\"");
+
+    AddObject   (pl);  //0
+    AddObject   (ph);  //1
+    AddObject   (bb);  //2
+    AddObject   (bb2); //3
+    AddObject   (l1);  //4
+    AddObject   (cb);  //5
+    AddObject   (obtn);//6
+    AddObject   (cbtn);//7
+    AddObject   (tb);  //8
+    AddObject   (l2);  //9
+    AddObject   (p1);  //10
+    AddObject   (l4);  //11
+    AddObject   (l3);  //12
+    AddObject   (l5);  //13
+    AddObject   (tb2); //14
+
+    if (isSingle) {
+        SetTableDimensions (6,4);
+        SetCell        (0,0,l1);
+        SetCell        (0,1,tb);
+        SetCell        (0,2,tb);
+        SetCell        (0,3,bb);
+        SetCell        (1,0,cb);
+        SetCell        (1,1,cb);
+        SetCell        (1,2,cb);
+        SetCell        (1,3,cb);
+        SetCell        (2,0,ph);
+        SetCell        (2,1,ph);
+        SetCell        (2,2,ph);
+        SetCell        (2,3,ph);
+        SetCell        (3,0,pl);
+        SetCell        (3,1,pl);
+        SetCell        (3,2,pl);
+        SetCell        (3,3,pl);
+        SetCell        (4,0,l3);
+        SetCell        (4,1,l5);
+        SetCell        (4,2,l5);
+        SetCell        (4,3,l5);
+        SetCell        (5,0,bb2);
+        SetCell        (5,1,obtn);
+        SetCell        (5,2,cbtn);
+        SetCell        (5,3,l4);
+    } else {
+        SetTableDimensions (4,4);
+        SetCell        (0,0,ph);
+        SetCell        (0,1,ph);
+        SetCell        (0,2,ph);
+        SetCell        (0,3,ph);
+        SetCell        (1,0,pl);
+        SetCell        (1,1,pl);
+        SetCell        (1,2,pl);
+        SetCell        (1,3,pl);
+        SetCell        (2,0,l3);
+        SetCell        (2,1,l5);
+        SetCell        (2,2,l5);
+        SetCell        (2,3,l5);
+        SetCell        (3,0,bb2);
+        SetCell        (3,1,obtn);
+        SetCell        (3,2,cbtn);
+        SetCell        (3,3,l4);
+#ifdef __HYPHY_GTK__
+        tb->Deactivate();
+#endif
+    }
+
+    /*  _HYTable *      hl      = new _HYTable (canvasSettings, GetOSWindowData(),validChoices->lLength,1,300,20,
+                                                                HY_TABLE_STATIC_TEXT);*/
+    l1->SetBackColor (bgRGB);
+    l2->SetBackColor (bgRGB);
+    l3->SetBackColor (bgRGB);
+    l4->SetBackColor (bgRGB);
+    l5->SetBackColor (bgRGB);
+    p1->SetBackColor (bgRGB);
+    tb->SetBackColor (bgRGB);
+    tb2->SetBackColor (bgRGB);
+    bb->SetBackColor (bgRGB);
+    bb2->SetBackColor (bgRGB);
+    cb->SetBackColor (bgRGB);
+    obtn->SetBackColor (bgRGB);
+    cbtn->SetBackColor (bgRGB);
+
+
+    _HYFont         labelFont;
+#ifdef __WINDOZE__
+    labelFont.face  = "Arial";
+    labelFont.size  = 14;
+#else
+    labelFont.face  = "System Font";
+    labelFont.size  = 12;
+#endif
+    labelFont.style = HY_FONT_PLAIN;
+
+    obtn->SetFont (labelFont);
+    cbtn->SetFont (labelFont);
+    l1->SetFont   (labelFont);
+    l1->SetAlignFlags (HY_ALIGN_LEFT);
+    l1->SetText   ("Branch ID:");
+    l2->SetFont   (labelFont);
+    l2->SetAlignFlags (HY_ALIGN_LEFT);
+    l2->SetText   ("Model:");
+    l3->SetFont   (labelFont);
+    l3->SetAlignFlags (HY_ALIGN_LEFT);
+    cb->SetFont   (labelFont);
+    cb->SetAlignFlags (HY_ALIGN_LEFT);
+    cb->SetText   (_String("Mark \"")&nodeName&"\" as incomplete");
+    tb->EnableTextEdit (true);
+    tb->SetText        (nodeName);
+    p1->AddMenuItem     ("None",-1);
+    p1->SetAlignFlags   (HY_ALIGN_LEFT);
+    bb2->SetAlignFlags  (HY_ALIGN_LEFT);
+
+    long counter;
+
+#ifdef __HYPHY_GTK__
+    gtk_widget_hide(p1->theMenu);
+#endif
+
+    /*for (counter = 0; counter < modelNames.lLength; counter++)
+        p1->AddMenuItem (*(_String*)modelNames(counter),-1);*/
+
+    if (*modelSelection<0) {
+        *modelSelection = 0;
+    } else {
+        (*modelSelection)++;
+    }
+
+    //p1->ChangeSelection(*modelSelection,false);
+
+    obtn->SetAlignFlags (HY_ALIGN_RIGHT);
+
+    if (isSingle) {
+        _String tryName,
+                namePrefix = *treeRef->GetName() & '.';
+
+        for (counter = 0; counter < dataSetList.lLength; counter++) {
+            if (counter&&(allowableDataNames.lLength)) {
+                allowableDataNames<< &menuSeparator;
+            }
+
+            _DataSet* thisSet = (_DataSet*)dataSetList (counter);
+            _String*  spName;
+            _List     thisList;
+
+            for (long whatW = 0; whatW < thisSet->NoOfSpecies(); whatW++) {
+                spName = (_String*)(thisSet->GetNames()(whatW));
+                tryName = namePrefix&*spName;
+                if (LocateVarByName(tryName)<0) {
+                    long iType = thisList.BinaryFind (spName);
+                    if (iType<0) {
+                        if (thisList.lLength) {
+                            iType = -iType-2;
+                            if (*spName>*(_String*)thisList(iType)) {
+                                iType++;
+                            }
+                            thisList.InsertElement (spName,iType,false);
+                        } else {
+                            thisList<<spName;
+                        }
+                    }
+                }
+            }
+            allowableDataNames<<thisList;
+        }
+    }
+
+
+#ifdef __WINDOZE__
+    labelFont.face = "MS Sans Serif";
+    labelFont.size = 12;
+#else
+    labelFont.face = "Geneva";
+    labelFont.size = 10;
+#endif
+    tb->SetFont (labelFont);
+    tb2->SetFont (labelFont);
+
+    obtn->SetText         ("  OK  ");
+    obtn->SetButtonKind   (HY_BUTTON_OK);
+    cbtn->SetText         (" Cancel ");
+    cbtn->SetButtonKind   (HY_BUTTON_CANCEL);
+
+#ifdef __WINDOZE__
+    labelFont.face = "Arial";
+    labelFont.size = 14;
+#else
+#ifdef __MAC__
+    labelFont.face = "Times";
+    labelFont.size = 12;
+#else
+    labelFont.face = _HY_SANS_FONT;
+    labelFont.size = 12;
+#endif
+#endif
+
+    pl->SetFont (labelFont);
+    ph->SetFont (labelFont);
+
+    _String     str ("Parameter ID");
+
+    ph->SetCellData (&str,0,0,HY_TABLE_STATIC_TEXT|HY_TABLE_BOLD|HY_TABLE_BEVELED|HY_TABLE_CANTSELECT,true);
+    str = "Type";
+    ph->SetCellData (&str,0,1,HY_TABLE_STATIC_TEXT|HY_TABLE_BOLD|HY_TABLE_BEVELED|HY_TABLE_CANTSELECT,true);
+    str = "Value";
+    ph->SetCellData (&str,0,2,HY_TABLE_STATIC_TEXT|HY_TABLE_BOLD|HY_TABLE_BEVELED|HY_TABLE_CANTSELECT,true);
+
+    str = "Available sequence names from the data filter";
+    bb->AddButton (ProcureIconResource(4011),&str);
+    bb->MarkAsPullDown (0,true);
+
+    str = "Add User Expression";
+    bb2->AddButton (ProcureIconResource(6001),&str);
+    str = "Kill User Expression";
+    bb2->AddButton (ProcureIconResource(6003),&str);
+    str = "Check and Set Formula";
+    bb2->AddButton (ProcureIconResource(7020),&str);
+
+    bb->SetButtonDim  (13);
+    bb2->SetButtonDim (16);
+    bb2->EnableButton (1,false);
+    bb2->EnableButton (2,false);
+    bb->EnableButton  (0, allowableDataNames.lLength);
+    cb->SetState      (*ifl);
+
+    _HYRect     dim = MinMaxWindowDimensions();
+
+    SetWindowRectangle  (0,0,dim.bottom,dim.right);
+    CenterWindow        (this);
+    BuildModelParameters();
+
+    validTE          =  true;
+    formulaBox       =  false;
+
+    tb2->SetVisibleSize (l5->rel);
+    tb2->Deactivate();
+    componentL.lData[14] = componentL.lData[13];
+    componentR.lData[14] = componentR.lData[13];
+    componentT.lData[14] = componentT.lData[13];
+    componentB.lData[14] = componentB.lData[13];
+
+    if (isSingle) {
+        keyboardFocusChain << 8;
+    }
+
+    keyboardFocusChain << 0;
+    taintFla   = false;
+
+    DeleteObject    (pl);  //0
+    DeleteObject    (ph);  //1
+    DeleteObject    (bb);  //2
+    DeleteObject    (bb2); //3
+    DeleteObject    (l1);  //4
+    DeleteObject    (cb);  //5
+    DeleteObject    (obtn);//6
+    DeleteObject    (cbtn);//7
+    DeleteObject    (tb);  //8
+    DeleteObject    (l2);  //9
+    DeleteObject    (p1);  //10
+    DeleteObject    (l4);  //11
+    DeleteObject    (l3);  //12
+    DeleteObject    (l5);  //13
+    DeleteObject    (tb2); //14
+}
+
+//__________________________________________________________________
+
+void    _HYNodeInfoDialog::ToggleFormulaBox     (bool onOff, _String value)
+{
+    _HYLabel  *  l3  = (_HYLabel*)GetObject (12),
+                 *  l5  = (_HYLabel*)GetObject (13);
+
+    _HYTextBox*  tb2 = (_HYTextBox*)GetObject(14);
+
+    long         row = isSingle?4:2;
+
+    if (onOff) {
+        if (!formulaBox) {
+            SetCell (row,1,tb2);
+            SetCell (row,2,tb2);
+            SetCell (row,3,tb2);
+            l3->SetText ("Formula:");
+            tb2->SetText (value,false);
+            tb2->SetSelection (0,30000);
+            tb2->Activate();
+            tb2->EnableTextEdit(true);
+            keyboardFocusChain << 14;
+        } else {
+            tb2->SetText (value,true);
+            tb2->SetSelection (0,30000);
+        }
+    } else {
+        if (formulaBox) {
+            SetCell (row,1,l5);
+            SetCell (row,2,l5);
+            SetCell (row,3,l5);
+            tb2->Deactivate();
+            l5->_MarkForUpdate();
+            l3->SetText (empty);
+            keyboardFocusChain.Delete (keyboardFocusChain.lLength-1);
+        }
+    }
+    formulaBox = onOff;
+    taintFla   = false;
+}
+//__________________________________________________________________
+
+void    _HYNodeInfoDialog::BuildModelParameters (void)
+{
+    _CalcNode       *thisCNode  = (_CalcNode*)FetchVar (LocateVarByName(*iNodeName));
+
+    if (!thisCNode) {
+        return ;
+    }
+
+    _HYTable        *pl         = (_HYTable*)GetObject (0);
+    _HYButtonBar    *bb2        = (_HYButtonBar*)GetObject (3);
+    long            counter;
+
+    if (isSingle) {
+        _SimpleList       indVars,
+                          depVars,
+                          globalVars;
+
+        _Variable*        thisVar;
+        _String           theMessage;
+
+        while (((_String*)pl->GetCellData(0,0))->sLength) {
+            DeleteParameterRow (0);
+        }
+
+        {
+            _AVLList ia (&indVars),
+                     da (&depVars),
+                     ga (&globalVars);
+
+            thisCNode->ScanForVariables (ia,da);
+            thisCNode->ScanForDVariables (da,ia);
+            thisCNode->ScanForGVariables (ga,da);
+
+            ia.ReorderList();
+            da.ReorderList();
+            ga.ReorderList();
+        }
+        parameterFlags.Clear();
+        parameterVRefs.Clear();
+
+        long choice = indVars.lLength + depVars.lLength + globalVars.lLength;
+        if (choice) {
+            parameterValues.Clear();
+            parameterVRefs.Clear();
+            CreateMatrix (&parameterValues,choice,1,false,true,false);
+
+            for (counter = 0; counter < globalVars.lLength; counter++) {
+                thisVar    = LocateVar(globalVars.lData[counter]);
+                theMessage = *thisVar->GetName();
+                AddParameterRow (theMessage,parameterGlobal,empty,-1);
+                parameterFlags<<1;
+                parameterVRefs<<thisVar->theIndex;
+            }
+            for (counter = 0; counter < indVars.lLength; counter++) {
+                thisVar = LocateVar(indVars.lData[counter]);
+                theMessage = thisVar->GetName()->ShortenVarID (*thisCNode->GetName());
+                AddParameterRow (theMessage,parameterLocal,empty,-1);
+                parameterFlags<<0;
+                parameterVRefs<<thisVar->theIndex;
+            }
+            for (counter = 0; counter < depVars.lLength; counter++) {
+                thisVar = LocateVar(depVars.lData[counter]);
+                if (thisVar->IsGlobal()) {
+                    theMessage = *thisVar->GetName();
+                    AddParameterRow (theMessage,parameterGlobal,empty,-1);
+                    parameterFlags<<1;
+                    parameterVRefs<<thisVar->theIndex;
+                } else {
+                    theMessage = thisVar->GetName()->ShortenVarID (*thisCNode->GetName());
+
+                    if (thisCNode->IsModelVar(counter)) {
+                        AddParameterRow (theMessage,parameterConstrained,empty,-1);
+                        parameterFlags<<2;
+                    } else {
+                        AddParameterRow (theMessage,parameterUE,empty,-1);
+                        parameterFlags<<3;
+                    }
+                    parameterVRefs<<thisVar->theIndex;
+                }
+            }
+            UpdateParameterValues (true);
+            bb2->EnableButton (0,true);
+        } else {
+            bb2->EnableButton (0,true);
+            CreateMatrix (&parameterValues,1,1,false,true,false);
+            AddParameterRow (parameterBL, parameterAV, empty,-1);
+            parameterFlags<<1;
+            parameterVRefs<<thisCNode->theIndex;
+            UpdateParameterValues (true);
+        }
+    } else {
+        for (counter = 0; counter < tSel->lLength; counter++) {
+            nodeVRefs << ((node<nodeCoord>*)tSel->lData[counter])->in_object.varRef;
+        }
+
+        CompileListOfUserExpressions (nodeVRefs,sharedUEs,true);
+
+        for (counter = 0; counter < sharedUEs.lLength; counter++) {
+            _String theMessage = *(_String*)sharedUEs(counter);
+            if (theMessage.sData[0]=='!') {
+                ((_String*)sharedUEs(counter))->Trim(1,-1);
+                AddParameterRow (*(_String*)sharedUEs(counter),parameterUE, parameterMV,-1);
+
+                for (long iType = 0; iType<tSel->lLength; iType++) {
+                    _String tBuffer = *LocateVar(nodeVRefs.lData[iType])->GetName()&'.'&*(_String*)sharedUEs(counter);
+                    parameterFlags<<3;
+#ifndef USE_AVL_NAMES
+                    parameterVRefs<<variableReindex.lData[LocateVarByName(tBuffer)];
+#else
+                    parameterVRefs<<variableNames.GetXtra(LocateVarByName(tBuffer));
+#endif
+                }
+            } else {
+                AddParameterRow (*(_String*)sharedUEs(counter),parameterP, parameterMV,-1);
+
+                for (long iType = 0; iType<tSel->lLength; iType++) {
+                    _String tBuffer = *LocateVar(nodeVRefs.lData[iType])->GetName()&'.'&*(_String*)sharedUEs(counter);
+                    parameterFlags<<2;
+#ifndef USE_AVL_NAMES
+                    parameterVRefs<<variableReindex.lData[LocateVarByName(tBuffer)];
+#else
+                    parameterVRefs<<variableNames.GetXtra(LocateVarByName(tBuffer));
+#endif
+                }
+            }
+        }
+    }
+}
+
+//________________________________________________________
+
+void    _HYNodeInfoDialog::UpdateParameterValues (bool force)
+{
+    _HYTable        *pl         = (_HYTable*)GetObject (0);
+    bool redraw = force;
+    for (long i=0; i<parameterVRefs.lLength; i++) {
+        _Variable* thisVar = LocateVar (parameterVRefs.lData[i]);
+        if (force||(thisVar->HasChanged())) {
+            redraw = true;
+            _PMathObj  varVal = thisVar->Compute();
+            _String varValue (varVal->Value());
+
+            pl->SetCellData (&varValue,i,2,pl->cellTypes[3*i+2],true);
+
+            if (force&&(parameterFlags.lData[i]<3)) {
+                parameterValues.theData[i] = varVal->Value();
+            }
+        }
+    }
+    if (redraw) {
+        pl->_MarkColumnForUpdate(2);
+    }
+}
+
+//__________________________________________________________________
+
+void    _HYNodeInfoDialog::FitToHeight (long height)
+{
+    _HYTable       *pl      = (_HYTable*)GetObject (0);
+    bool           hasPadding = (pl->cellTypes.lData[pl->cellTypes.lLength-1] & HY_TABLE_CANTSELECT);
+    long           h = pl->verticalSpaces.lData[pl->verticalSpaces.lLength-(hasPadding?2:1)];
+
+    if (hasPadding) {
+        if (h<height) {
+            pl->SetRowSpacing (pl->verticalSpaces.lLength-1,height-h-pl->GetRowSpacing (pl->verticalSpaces.lLength-1),false);
+        } else {
+            pl->DeleteRow (pl->verticalSpaces.lLength-1);
+        }
+    } else if (h<height) {
+        pl->AddRow (-1,height-h,HY_TABLE_STATIC_TEXT|HY_TABLE_CANTSELECT);
+    }
+
+    pl->SetVisibleSize (pl->rel);
+}
+
+//__________________________________________________________________
+
+void    _HYNodeInfoDialog::DeleteParameterRow (long index)
+{
+    _HYTable       *pl      = (_HYTable*)GetObject (0);
+    pl->DeleteRow (index);
+    FitToHeight (pl->rel.bottom-pl->rel.top+1);
+}
+
+//__________________________________________________________________
+
+bool    _HYNodeInfoDialog::SetNewParameterValue (long index, _String* val)
+{
+    _String      newValStr (*val);
+    _Parameter   newVal = 0.0;
+    newVal=ProcessNumericArgument(&newValStr,nil);
+    bool         good   = false;
+    if (numericalParameterSuccessFlag) {
+        _Variable* thisVar = LocateVar (parameterVRefs.lData[index]);
+        if (thisVar) {
+            if ((newVal>=thisVar->GetLowerBound())&&(newVal<=thisVar->GetUpperBound())) {
+                _Constant newV (newVal);
+                thisVar->SetValue (&newV);
+                good = true;
+            } else {
+                _String errMsg ("Valid values for this parameter must be in the interval [");
+                errMsg = errMsg & thisVar->GetLowerBound() &','& thisVar->GetUpperBound() &"].";
+                ProblemReport (errMsg,(Ptr)this);
+            }
+        }
+    }
+    return good;
+}
+
+//__________________________________________________________________
+
+long    _HYNodeInfoDialog::AddParameterRow (_String& pname, _String& ptype, _String& pvalue, long where)
+{
+    _HYTable       *pl      = (_HYTable*)GetObject (0);
+    bool           hasPadding = (pl->cellTypes.lData[pl->cellTypes.lLength-1] & HY_TABLE_CANTSELECT);
+    if (where<0) {
+        where = pl->verticalSpaces.lLength;
+        if (hasPadding) {
+            where--;
+        }
+    }
+
+    long      ct1 = HY_TABLE_STATIC_TEXT,
+              ct2 = HY_TABLE_STATIC_TEXT,
+              ct3 = HY_TABLE_EDIT_TEXT;
+
+    if (ptype.Equal (&parameterGlobal)) {
+        ct1 |= HY_TABLE_BOLD;
+        ct2 |= HY_TABLE_BOLD;
+        ct3 |= HY_TABLE_BOLD;
+    } else if (ptype.Equal (&parameterConstrained)||ptype.Equal (&parameterUE)) {
+        if (ptype.Equal(&parameterUE)) {
+            ct1 = HY_TABLE_EDIT_TEXT;
+        }
+
+        ct1 |= HY_TABLE_ITALIC;
+        ct2 |= HY_TABLE_ITALIC;
+        ct3 = HY_TABLE_ITALIC|HY_TABLE_STATIC_TEXT;
+    } else if (pvalue.Equal (&parameterMV)) {
+        ct3 = HY_TABLE_ITALIC|HY_TABLE_STATIC_TEXT;
+    }
+
+
+    pl->AddRow (where,20,HY_TABLE_STATIC_TEXT);
+    pl->SetCellData (&pname,where,0,ct1,true);
+    pl->SetCellData (&ptype,where,1,ct2,true);
+    pl->SetCellData (&pvalue,where,2,ct3,true);
+    FitToHeight (pl->rel.bottom-pl->rel.top+1);
+    return where;
+}
+
+//________________________________________________________
+
+bool    _HYNodeInfoDialog::SetNodeModel (_CalcNode* thisCNode, long modelID, bool isFirst)
+{
+    if (isFirst)
+        if (!displayNotUndoable)
+            if (ProceedPromptWithCheck (notUndoableWarning,donotWarnAgain,displayNotUndoable)) {
+                _SimpleList depVars;
+                for (long iType=0; iType<tSel->lLength; iType++) {
+                    LocateVar (((node<nodeCoord>*)tSel->lData[iType])->in_object.varRef)->CompileListOfDependents(depVars);
+                }
+
+                if (depVars.lLength) {
+                    _String depVarList ("The following variables depend on the parameters you are about to delete: ");
+                    for (long i=0; i<depVars.lLength; i++) {
+                        if (i) {
+                            depVarList = depVarList & ", " ;
+                        }
+                        depVarList = depVarList & *LocateVar(depVars.lData[i])->GetName();
+                    }
+                    depVarList = depVarList & ((char)13)&"You are about to remove those dependencies.";
+                    if (!ProceedPrompt (depVarList,(Ptr)this)) {
+                        return false;
+                    }
+                }
+                *modelSelection = modelID+1;
+            } else {
+                return false;
+            }
+
+    _String treeName (*thisCNode->GetName());
+    treeName.Trim (0,treeName.Find('.')-1);
+
+    if (modelID<0) {
+        if (isFirst&&(!parentRef->KillLikeFunc (-1))) {
+            return false;
+        }
+
+        DeleteVariable (*thisCNode->GetName(),false);
+    } else {
+        _String theName (*thisCNode->GetName()),
+                modelName (*(_String*)modelNames(modelID)),
+                dummy;
+
+        theName.Trim (theName.Find('.')+1,-1);
+
+        _CalcNode* travNode = treeRef->DepthWiseTraversal (true);
+
+        while (travNode!=thisCNode) {
+            travNode = treeRef->DepthWiseTraversal ();
+        }
+
+        DeleteVariable (*thisCNode->GetName(),true);
+        treeRef->FinalizeNode (&treeRef->GetCurrentNode(),0,theName,modelName,dummy);
+        thisCNode = (_CalcNode*)LocateVar (treeRef->GetCurrentNode().in_object);
+        _SimpleList newVars;
+        {
+            _AVLList  nal (&newVars);
+            thisCNode->ScanForVariables (nal,nal);
+            nal.ReorderList();
+        }
+        thisCNode->SetCodeBase(thisCNode->GetModelDimension());
+        _Constant   newVal (.25);
+        for (long i=0; i<newVars.lLength; i++) {
+            LocateVar(newVars.lData[i])->SetValue (&newVal);
+        }
+
+        for (long i = 0; i<likeFuncList.lLength; i++) {
+            if (((_String*)likeFuncNamesList(i))->sLength) {
+                _LikelihoodFunction * thisLF = (_LikelihoodFunction*)likeFuncList(i);
+                if (thisLF->DependOnTree(treeName)>=0) {
+                    thisLF->RescanAllVariables();
+                }
+            }
+        }
+    }
+
+    return true;
+}
+
+//__________________________________________________________________
+bool    _HYNodeInfoDialog::ProcessEvent  (_HYEvent* e)
+{
+    bool            done = false;
+    _String         firstArg;
+
+    long            i,
+                    f,
+                    g,
+                    k;
+
+    _HYButtonBar    * bb  = (_HYButtonBar*)GetObject (2),
+                      * bb2 = (_HYButtonBar*)GetObject (3);
+
+    _HYTextBox      * tb  = (_HYTextBox*)  GetObject (8);
+    _HYButton       * bok = (_HYButton*)   GetObject (6);
+    _HYTable        * pl  = (_HYTable*)    GetObject (0);
+    _HYCheckbox     * chb = (_HYCheckbox*) GetObject (5);
+
+    if (e->EventClass()==_hyButtonPushEvent) {
+        firstArg = e->EventCode().Cut (0,(f=e->EventCode().Find(','))-1);
+        k = firstArg.toNum();
+        g =  e->EventCode().Cut(f+1,-1).toNum();
+        for (i=0; i<components.lLength; i++)
+            if (((_HYGuiObject*)components(i))->MatchID(k)) {
+                break;
+            }
+
+        if (i==6) { // OK
+            *result = true;
+            pl->Deactivate();
+            if (taintFla) {
+                SetNewUserFormula();
+            }
+
+            if (isSingle) {
+                *iNodeName = tb->GetText();
+            }
+
+            *incFlag = chb->GetState ();
+
+            postWindowCloseEvent (GetID());
+        } else if (i==7) { // Cancel
+            *result = false;
+            if (isSingle) {
+                for (long counter = 0; counter < parameterVRefs.lLength; counter++) {
+                    _Variable *thisVar = LocateVar (parameterVRefs.lData[counter]);
+                    if (thisVar->IsIndependent()||thisVar->IsContainer()) {
+                        if (!CheckEqual(thisVar->Value(),parameterValues.theData[counter])) {
+                            _Constant newVal (parameterValues.theData[counter]);
+                            thisVar->SetValue (&newVal);
+                        }
+                    }
+                }
+            }
+            postWindowCloseEvent (GetID());
+        } else if ((i==2)&&(g==0)) {
+            int h,v;
+            bb->GetButtonLoc (0,h,v,true);
+            _String*tbs;
+            tb->StoreText (tbs);
+            firstArg = HandlePullDown (allowableDataNames,h,v,allowableDataNames.Find(tbs));
+            DeleteObject (tbs);
+            if (firstArg.sLength) {
+                tb->SetText (firstArg);
+                ProcessEvent(generateKeyboardFocusEvent  (tb->GetID()));
+                ProcessEvent(generateTextEditChangeEvent (tb->GetID(),1));
+            }
+        }
+
+        done = true;
+    } else if (e->EventClass()==_hyTableChangeSelEvent) {
+        k = e->EventCode().toNum();
+        for (i=0; i<components.lLength; i++) {
+            if (((_HYGuiObject*)components(i))->MatchID(k)) {
+                break;
+            }
+        }
+
+        if (i==0) {
+            _SimpleList rs;
+            pl->GetRowSelection (rs);
+            if (rs.lLength<=1) {
+                if (rs.lLength) {
+                    done = parameterUE.Equal((_String*)pl->GetCellData(1,rs.lData[0]));
+                } else {
+                    done = false;
+                }
+                bb2->EnableButton (1,done);
+                bb2->EnableButton (2,done);
+                if (done) {
+                    _Variable* thisVar = LocateVar (parameterVRefs.lData[rs.lData[0]*tSel->lLength]);
+                    _String* flaString = thisVar->GetFormulaString(),
+                             infoBoxString,
+                             theMessage;
+
+                    _CalcNode* thisCNode;
+
+                    if (flaString->sLength==0) {
+                        if (parameterFlags.lData[rs.lData[0]*tSel->lLength]>2) {
+                            infoBoxString = "Enter your expression";
+                        } else {
+                            infoBoxString = empty;
+                        }
+                    } else {
+                        if (isSingle) {
+                            thisCNode  = (_CalcNode*)FetchVar (LocateVarByName(*iNodeName));
+                        } else {
+                            thisCNode=(_CalcNode*)LocateVar (nodeVRefs.lData[0]);
+                        }
+
+                        theMessage = *thisCNode->GetName()&'.';
+                        if (parameterFlags.lData[rs.lData[0]*tSel->lLength]>2) {
+                            infoBoxString = *flaString;
+                        } else {
+                            infoBoxString = *thisVar->GetName()&_String(":=")&*flaString;
+                        }
+                        infoBoxString = infoBoxString.Replace(theMessage,"",true);
+                        theMessage = theMessage.Cut (0,theMessage.Find('.'));
+                        infoBoxString = infoBoxString.Replace(theMessage,"",true);
+                    }
+                    ToggleFormulaBox (true, infoBoxString);
+
+                } else {
+                    ToggleFormulaBox (false, empty);
+                }
+            }
+        }
+        done = true;
+    } else if (e->EventClass()==_hyTextEditChange) {
+        firstArg = e->EventCode().Cut (0,(f=e->EventCode().Find(','))-1);
+        k = firstArg.toNum();
+        g =  e->EventCode().Cut(f+1,-1).toNum();
+        for (i=0; i<components.lLength; i++)
+            if (((_HYGuiObject*)components(i))->MatchID(k)) {
+                break;
+            }
+
+        if (g) {
+            if (i==8) {
+                _String     curVal (tb->GetText()),
+                            temp = *treeRef->GetName() & '.' & curVal;
+
+                bool isGood = curVal.sLength&&temp.IsValidIdentifier ();
+                if (isGood) {
+                    if (!temp.Equal(iNodeName)) {
+                        isGood = (LocateVarByName (temp)<0);
+                    }
+                }
+
+                if (isGood&&(!validTE)) {
+                    tb->SetForeColor ((_HYColor) {
+                        0,0,0
+                    });
+                    bok->EnableButton (true);
+                } else if (!isGood&&(validTE)) {
+                    tb->SetForeColor ((_HYColor) {
+                        255,0,0
+                    });
+                    bok->EnableButton (false);
+                }
+
+                if (isGood) {
+                    nodeName = curVal;
+                }
+
+                validTE = isGood;
+            } else if (i==14) {
+                taintFla = true;
+            }
+        }
+
+        done = true;
+    } else if (e->EventClass()==_hyTableResizeCEvent ) {
+        f = e->EventCode().Find(',',0,-1);
+        k = e->EventCode().Find(',',f+1,-1);
+        long g = e->EventCode().Cut (0,f-1).toNum();
+        f = e->EventCode().Cut (f+1,k-1).toNum();
+        k = e->EventCode().Cut (k+1,-1).toNum();
+
+        for (i=0; i<components.lLength; i++)
+            if (((_HYGuiObject*)components(i))->MatchID(g)) {
+                break;
+            }
+
+        if (i==1) {
+            pl->SetColumnSpacing (f,k,true);
+        }
+
+        done = true;
+    } else if (e->EventClass()==_hyTableEditCellEvent ) {
+        f = e->EventCode().Find(',',0,-1);
+        k = e->EventCode().Cut (0,f-1).toNum();
+        f = e->EventCode().Cut (f+1,-1).toNum();
+
+        for (i=0; i<components.lLength; i++)
+            if (((_HYGuiObject*)components(i))->MatchID(k)) {
+                break;
+            }
+
+        if (i==0) {
+            g = f/pl->horizontalSpaces.lLength;
+            f%=pl->horizontalSpaces.lLength;
+            if (f==2) {
+                UpdateParameterValues (!SetNewParameterValue (g,(_String*)pl->GetCellData (2,g)));
+            } else if (f==0) {
+                SetNewParameterName (*(_String*)pl->GetCellData (0,g),g);
+            }
+
+        }
+
+        done = true;
+    } else if (e->EventClass()==_hyMenuSelChangeEvent) {
+        firstArg = e->EventCode().Cut (0,(f=e->EventCode().Find(','))-1);
+        k =  firstArg.toNum();
+        g =  e->EventCode().Cut(f+1,-1).toNum();
+        for (i=0; i<components.lLength; i++)
+            if (((_HYGuiObject*)components(i))->MatchID(k)) {
+                break;
+            }
+
+        if ((i==10)&&(g!=*modelSelection))
+            for (i=0; i<tSel->lLength; i++) {
+                _CalcNode* tempNode = (_CalcNode*)LocateVar
+                                      (((node<nodeCoord>*)tSel->lData[i])->in_object.varRef);
+                if (!SetNodeModel (tempNode,g-1,i==0)) {
+                    ((_HYPullDown*)GetObject(10))->ChangeSelection (*modelSelection,false);
+                    break;
+                }
+            }
+        done = true;
+    }
+    if (e->EventClass()==_hyButtonPushEvent) {
+        firstArg = e->EventCode().Cut (0,(f=e->EventCode().Find(','))-1);
+        k =  firstArg.toNum();
+        g =  e->EventCode().Cut(f+1,-1).toNum();
+        for (i=0; i<components.lLength; i++)
+            if (((_HYGuiObject*)components(i))->MatchID(k)) {
+                break;
+            }
+
+        if (i==3) {
+            *updateSCV = true;
+
+            _CalcNode* thisCNode;
+
+            if (g==0) { // add user expression
+                _String theMessage ("user_param"),
+                        tBuffer;
+
+                f = 0;
+
+                if (isSingle) {
+                    thisCNode  = (_CalcNode*)FetchVar (LocateVarByName(*iNodeName));
+                    f = thisCNode->CheckAndAddUserExpression (theMessage);
+                    parameterVRefs << f;
+                    parameterFlags << 3;
+                } else {
+                    for (g = 0; g<tSel->lLength; g++) {
+                        k = ((_CalcNode*)LocateVar (((node<nodeCoord>*)tSel->lData[g])->in_object.varRef))->CheckAndAddUserExpression(theMessage,-1);
+                        if (k>f) {
+                            f=k;
+                        }
+                    }
+
+                    for (g = 0; g<tSel->lLength; g++) {
+                        thisCNode=(_CalcNode*)LocateVar (((node<nodeCoord>*)tSel->lData[g])->in_object.varRef);
+                        tBuffer = theMessage;
+                        k = thisCNode->CheckAndAddUserExpression(tBuffer,f);
+                        parameterVRefs << k;
+                        parameterFlags << 3;
+                    }
+
+                    if (tSel->lLength>1) {
+                        sharedUEs && &tBuffer;
+                    }
+
+                    theMessage = tBuffer;
+                }
+
+                k = AddParameterRow (theMessage,parameterUE,parameterUND,-1);
+                pl->_MarkForUpdate();
+                _SimpleList nS;
+                nS << k;
+                pl->SetRowSelection (nS);
+            } else {
+                if (g==1) {
+                    _SimpleList rs2;
+                    pl->GetRowSelection (rs2);
+
+                    f = rs2.lData[0] * tSel->lLength;
+
+                    if (isSingle) {
+                        thisCNode  = (_CalcNode*)FetchVar (LocateVarByName(*iNodeName));
+                        thisCNode->KillUserExpression (parameterVRefs.lData[rs2.lData[0]]);
+                    } else {
+                        for (k = 0; k<tSel->lLength; k++) {
+                            thisCNode=(_CalcNode*)LocateVar (nodeVRefs.lData[k]);
+                            thisCNode->KillUserExpression (parameterVRefs.lData[f+k]);
+                        }
+                        sharedUEs.Delete (rs2.lData[0]);
+                    }
+
+                    for (k=0; k<tSel->lLength; k++) {
+                        parameterVRefs.Delete (f);
+                        parameterFlags.Delete (f);
+                    }
+
+                    DeleteParameterRow (rs2.lData[0]);
+                    _SimpleList         nRS;
+                    if (rs2.lData[0]>0) {
+                        nRS << rs2.lData[0]-1;
+                    } else {
+                        nRS << 0;
+                    }
+                    pl->SetRowSelection (nRS);
+                    pl->_MarkForUpdate();
+                } else {
+                    SetNewUserFormula();
+                }
+
+            }
+        }
+        done = true;
+    }
+
+    if (done) {
+        DeleteObject (e);
+        return true;
+    }
+    return _HYTWindow::ProcessEvent(e);
+}
+
+//________________________________________________________
+
+void    _HYNodeInfoDialog::SetNewUserFormula (void)
+{
+    _HYTextBox  * flaBox = (_HYTextBox*) GetObject (14);
+    _HYTable    * pl     = (_HYTable*)   GetObject (0);
+
+    _String     newFla   = flaBox->GetText(),
+                newValStr ;
+    _SimpleList rSel;
+
+    pl->GetRowSelection (rSel);
+    if (rSel.lLength!=1) {
+        return;
+    }
+
+    long        k = rSel.lData[0],
+                j;
+
+    _CalcNode*  thisCNode;
+
+    if (nodeVRefs.lLength) {
+        _Variable* thisVar;
+        for (j=0; j<nodeVRefs.lLength; j++) {
+            thisCNode = (_CalcNode*)LocateVar(nodeVRefs.lData[j]);
+            _Formula   newUF (newFla,thisCNode);
+
+            if (!newUF.IsEmpty()) {
+                thisVar = LocateVar (parameterVRefs.lData[k*tSel->lLength+j]);
+                if (thisVar) {
+                    thisVar->SetFormula(newUF);
+                }
+            }
+        }
+        newValStr = parameterMV;
+    } else {
+        thisCNode  = (_CalcNode*)FetchVar (LocateVarByName(*iNodeName));
+
+        _Formula   newUF (newFla,thisCNode);
+        if (newUF.IsEmpty()) {
+            return;
+        }
+
+        _Variable* thisVar = LocateVar (parameterVRefs.lData[k]);
+        if (thisVar) {
+            thisVar->SetFormula(newUF);
+            newValStr = _String (thisVar->Compute()->Value());
+
+            _String*  newFlaString = thisVar->GetFormulaString();
+            flaBox->SetText (*newFlaString,false);
+            DeleteObject (newFlaString);
+        }
+    }
+
+    j = k*pl->horizontalSpaces.lLength + 2;
+    pl->SetCellData (&newValStr,k,2,pl->cellTypes.lData[j],true);
+    pl->_MarkCellForUpdate (j);
+}
+
+//________________________________________________________
+
+void    _HYNodeInfoDialog ::SetNewParameterName (_String newValStr, long row)
+{
+    _HYTable*       pl = (_HYTable*)GetObject (0);
+    _CalcNode*      thisCNode;
+    long            k = row*tSel->lLength;
+    _String         oldName;
+    _Variable*      thisVar;
+
+    bool       restore = true;
+
+    if (isSingle) {
+        thisCNode  = (_CalcNode*)FetchVar (LocateVarByName(*iNodeName));
+    } else {
+        thisCNode = (_CalcNode*)LocateVar(nodeVRefs.lData[0]);
+    }
+
+    thisVar = LocateVar (parameterVRefs.lData[k]);
+    oldName = *(thisVar->GetName());
+
+    if (newValStr.IsValidIdentifier()) {
+        if (isSingle) {
+            if (thisVar) {
+                newValStr = *thisCNode->GetName()&'.'&newValStr;
+                if (!thisVar->GetName()->Equal(&newValStr)) {
+                    oldName = *thisVar->GetName();
+                    if (LocateVarByName(newValStr)>=0) {
+                        newValStr = newValStr & " is already in use. Select another name.";
+                        ProblemReport (newValStr,(Ptr)this);
+                    } else {
+                        RenameVariable (thisVar->GetName(),&newValStr);
+                        restore = false;
+                    }
+                } else {
+                    restore = false;
+                }
+            }
+        } else {
+            long j = 0;
+            for (j=0; j<nodeVRefs.lLength; j++) {
+                thisVar = LocateVar (parameterVRefs.lData[k+j]);
+                if (thisVar) {
+                    _String newValStr2 = *LocateVar(nodeVRefs.lData[j])->GetName()&'.'&newValStr;
+                    if (!thisVar->GetName()->Equal(&newValStr2)) {
+                        if (LocateVarByName(newValStr2)>=0) {
+                            newValStr2 = newValStr2 & " is already in use. Select another name.";
+                            ProblemReport (newValStr2,(Ptr)this);
+                            break;
+                        }
+                    } else {
+                        restore = false;
+                        break;
+                    }
+                }
+            }
+            if (j==nodeVRefs.lLength) {
+                for (j=0; j<nodeVRefs.lLength; j++) {
+                    _Variable* thisVar = LocateVar (parameterVRefs.lData[k+j]);
+                    if (thisVar) {
+                        newValStr = *LocateVar(nodeVRefs.lData[j])->GetName()&'.'&newValStr;
+                        RenameVariable (thisVar->GetName(),&newValStr);
+                        newValStr.Trim (newValStr.FindBackwards('.',0,-1)+1,-1);
+                    }
+                }
+                restore = false;
+            }
+        }
+    } else {
+        newValStr = newValStr & " is an invalid identifier. Can't change parameter name to that!";
+        ProblemReport (newValStr,(Ptr)this);
+    }
+
+    if (restore) {
+        oldName.Trim (oldName.FindBackwards('.',0,-1)+1,-1);
+        pl->SetCellData (&oldName,k,0,pl->cellTypes[row*pl->horizontalSpaces.lLength],true);
+        pl->_MarkCellForUpdate (k);
+    } else {
+        *updateSCV = true;
+    }
+}
+
+//__________________________________________________________
+
+void    _HYTreePanel::ExecuteProcessor (long cID)
+{
+    if (cID<treeProcessors.lLength) {
+        _FString treeStringV;
+        *treeStringV.theString = GetTreeString();
+
+        setParameter (treeStringExport, &treeStringV);
+
+        FILE * thisFile = doFileOpen (((_String*)treeProcessors(cID))->sData,"rb");
+        if (thisFile) {
+            _String buffer (thisFile);
+            fclose (thisFile);
+
+            long   g = batchLanguageFunctionNames.lLength;
+
+            _String tpp = *((_String*)treeProcessors(cID));
+            PushFilePath (tpp);
+            _ExecutionList   thisList;
+            terminateExecution = false;
+            thisList.BuildList (buffer);
+            thisList.ExecuteAndClean(g);
+            terminateExecution = false;
+
+            PopFilePath ();
+        }
+    }
+}
+
+//__________________________________________________________
+
+void ReadTreeProcessors (void)
+{
+    _String     pathToModelTemplates;
+    _List       receptacle;
+
+    pathToModelTemplates = libDirectory&"TreeAddIns";
+
+    ScanDirectoryForFileNames (pathToModelTemplates,receptacle,false);
+
+    for (long k=0; k<receptacle.lLength; k++) {
+        FILE * thisFile = doFileOpen (((_String*)receptacle(k))->sData,"rb");
+        if (thisFile) {
+            _String buffer (thisFile);
+            fclose (thisFile);
+            if (buffer.sLength) {
+                treeProcessors << receptacle(k);
+            }
+        }
+    }
+}
+
+//EOF
diff --git a/src/gui/HYWindow.cpp b/src/gui/HYWindow.cpp
new file mode 100644
index 0000000..b1a2993
--- /dev/null
+++ b/src/gui/HYWindow.cpp
@@ -0,0 +1,863 @@
+/*
+ 
+ HyPhy - Hypothesis Testing Using Phylogenies.
+ 
+ Copyright (C) 1997-now
+ Core Developers:
+ Sergei L Kosakovsky Pond (spond at ucsd.edu)
+ Art FY Poon    (apoon at cfenet.ubc.ca)
+ Steven Weaver (sweaver at ucsd.edu)
+ 
+ Module Developers:
+ Lance Hepler (nlhepler at gmail.com)
+ Martin Smith (martin.audacis at gmail.com)
+ 
+ Significant contributions from:
+ Spencer V Muse (muse at stat.ncsu.edu)
+ Simon DW Frost (sdf22 at cam.ac.uk)
+ 
+ Permission is hereby granted, free of charge, to any person obtaining a
+ copy of this software and associated documentation files (the
+ "Software"), to deal in the Software without restriction, including
+ without limitation the rights to use, copy, modify, merge, publish,
+ distribute, sublicense, and/or sell copies of the Software, and to
+ permit persons to whom the Software is furnished to do so, subject to
+ the following conditions:
+ 
+ The above copyright notice and this permission notice shall be included
+ in all copies or substantial portions of the Software.
+ 
+ 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.
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ 
+ */
+
+#include "HYWindow.h"
+#include "HYGWindow.h"
+#include "HYTableWindow.h"
+#include "HYEventTypes.h"
+
+#ifdef    __HYPHYDMALLOC__
+#include "dmalloc.h"
+#endif
+
+//__________________________________________________________________
+
+_HYWindow::_HYWindow(unsigned char windowFlag,_String wTitle,bool windowVisibility, Ptr p):
+    _HYPlatformWindow (windowFlag,wTitle,windowVisibility, p)
+{
+    top = left = 0;
+    right = 300;
+    bottom = 250;
+    if (windowFlag&HY_WINDOW_SCROLL) {
+        contentWidth = 300;
+        contentHeight = 250;
+    }
+    windowTitle = wTitle;
+#ifdef __HYPHY_FLTK__
+    _SetTitle (windowTitle);
+#endif
+    if (windowVisibility) {
+        Activate();
+        Paint(nil);
+    }
+    windowObjectRefs << (long)this;
+}
+
+//__________________________________________________________________
+
+_HYWindow::~_HYWindow(void)
+{
+}
+
+//__________________________________________________________________
+
+void _HYWindow::SetTitle(_String windowT)
+{
+    windowTitle = windowT;
+    _SetTitle (windowTitle);
+}
+
+//__________________________________________________________________
+
+void _HYWindow::Show(void)
+{
+    _Show ();
+    Update(nil);
+}
+
+//__________________________________________________________________
+
+void _HYWindow::Hide(void)
+{
+    _Hide ();
+}
+
+//__________________________________________________________
+
+bool    _HYWindow::ProcessGEvent (_HYEvent* e)
+{
+    long k;
+    if (e->EventClass()==_hyGlobalCloseWindow) {
+        k = e->EventCode().toNum();
+        if (MatchID (k)) {
+            Close (nil);
+            return true;
+        }
+    }
+    return false;
+}
+//__________________________________________________________________
+
+void _HYWindow::Grow(Ptr theData)
+{
+    unsigned long newSize = _Grow (theData);
+    if (newSize) {
+        right = left+(newSize&0x0000ffff);
+        bottom = top+(((newSize&0xffff0000)>>16)&0xffff);
+        SetWindowRectangle (top,left,bottom,right);
+        Update(nil);
+    }
+}
+
+//__________________________________________________________________
+
+void _HYWindow::Move(Ptr theData)
+{
+    _Move (theData);
+    _Update (nil);
+}
+
+//__________________________________________________________________
+
+void _HYWindow::SetPosition(int left, int top)
+{
+    _SetPosition (left,top);
+}
+
+//__________________________________________________________________
+
+void _HYWindow::SelectThisWindow(void)
+{
+    _SelectWindow ();
+}
+
+//__________________________________________________________________
+
+void _HYWindow::SetFont(_HYFont&)
+{
+}
+
+//__________________________________________________________________
+
+bool _HYWindow::Close(Ptr theData)
+{
+    if (!_Close(theData)) {
+        return false;
+    }
+
+    //Ptr p = GetOSWindowData();
+    DeleteObject (this);
+    //_Close2 (p);
+    return true;
+}
+
+//__________________________________________________________________
+
+void _HYWindow::Activate(void)
+{
+    _Activate ();
+    Update(nil);
+}
+
+//__________________________________________________________________
+
+void _HYWindow::Deactivate(void)
+{
+    _Deactivate ();
+}
+
+//__________________________________________________________________
+
+void _HYWindow::SetWindowRectangle(int t, int l, int b, int r, bool ss)
+{
+    _SetWindowRectangle (t,l,b,r,ss);
+    top = t;
+    left = l;
+    right = r;
+    bottom = b;
+}
+
+//__________________________________________________________________
+
+void _HYWindow::SetContentSize(int w, int h)
+{
+    contentWidth = w;
+    contentHeight = h;
+    _SetContentSize (w,h);
+}
+
+//__________________________________________________________________
+
+_HYGWindow::_HYGWindow(_String windowTitle,int ih, int iw, int id, bool vis,bool scale):
+    _HYWindow         (scale?(HY_WINDOW_CLOSE|HY_WINDOW_SIZE|HY_WINDOW_FLUSHED):(HY_WINDOW_CLOSE|HY_WINDOW_SIZE|HY_WINDOW_SCROLL),windowTitle,vis),
+    _HYGraphicPane    (ih,iw,id)
+{
+    SetContentSize (iw,ih);
+}
+
+//__________________________________________________________________
+
+bool    _HYGWindow::ProcessEvent (_HYEvent* e)
+{
+    if (e->EventClass() == _hyScrollingEvent) {
+        Update (nil);
+        DeleteObject (e);
+        return true;
+    }
+    return      _HYWindow::ProcessEvent (e);
+}
+
+
+//__________________________________________________________________
+
+_HYTWindow::_HYTWindow (_String title, char list, bool dlog, Ptr sheetParent):
+    _HYWindow ((list==2)?HY_WINDOW_SIZE:(list?(HY_WINDOW_CLOSE|HY_WINDOW_SIZE|HY_WINDOW_ZOOM):(dlog?(sheetParent?HY_WINDOW_SHEET:HY_WINDOW_DLOG):(HY_WINDOW_CLOSE|HY_WINDOW_SIZE|HY_WINDOW_NOLIST|HY_WINDOW_ZOOM))),title,false, sheetParent),
+    _HYPlatformTWindow ((Ptr)this)
+{
+    rows = columns = 0;
+    keyboardFocus = -1;
+    lastMouseComponent = -1;
+}
+
+//__________________________________________________________________
+
+void    _HYTWindow::SetTableDimensions (int r, int c)
+{
+    if (!cells.lLength) {
+        rows = r;
+        columns = c;
+        for (long i=0; i<r; i++)
+            for (long j=0; j<c; j++) {
+                cells<<0;
+            }
+    } else {
+        if ((rows!=r)||(columns!=c)) {
+            cells.Clear();
+            SetTableDimensions(r,c);
+        }
+    }
+}
+
+//__________________________________________________________________
+
+void    _HYTWindow::SetCell (int r, int c, _HYGuiObject* d)
+{
+    long f = components._SimpleList::Find ((long)d);
+    if (f>=0) {
+        cells.lData[r*columns+c] = f;
+    }
+}
+
+//__________________________________________________________________
+
+void    _HYTWindow::AddObject (_HYGuiObject* d, bool dup, long r, long c)
+{
+    if (r >= 0 && c >= 0) {
+        cells.lData[r*columns+c] = components.lLength;
+    }
+
+    if (dup) {
+        components << d;
+    } else {
+        components.AppendNewInstance(d);
+    }
+
+    componentL<<0;
+    componentR<<0;
+    componentT<<0;
+    componentB<<0;
+
+}
+
+//__________________________________________________________________
+
+void    _HYTWindow::AddKeyboardChainObject (_HYGuiObject* d)
+{
+    long f = components._SimpleList::Find ((long)d);
+    if (f>=0) {
+        keyboardFocusChain << f;
+    }
+}
+
+//__________________________________________________________
+
+bool    _HYTWindow::ProcessEvent (_HYEvent* e)
+{
+    long i;
+    if (e->EventClass()==_hyKeyboardFocusEvent) {
+        i = MatchComponentID (e->EventCode());
+
+        if (keyboardFocus>=0) {
+            ((_HYComponent*)components(keyboardFocus))->UnfocusComponent();
+        }
+
+        if (i<components.lLength) {
+            keyboardFocus=i;
+            ((_HYComponent*)components(keyboardFocus))->FocusComponent();
+        } else {
+            keyboardFocus=-1;
+        }
+    }
+    DeleteObject (e);
+    return false;
+}
+
+
+//__________________________________________________________________
+
+_HYGuiObject*   _HYTWindow::GetCellObject (int r, int c)
+{
+    return (_HYGuiObject*)components(cells[r*columns+c]);
+}
+
+//__________________________________________________________________
+
+_HYGuiObject*   _HYTWindow::GetObject (int index)
+{
+    return (_HYGuiObject*)components(index);
+}
+
+//__________________________________________________________________
+
+_HYRect         _HYTWindow::MinMaxWindowDimensions (void)
+{
+    _HYRect     res = {0,0,30000,30000,0};
+
+    long    i,
+            j,
+            t1,
+            t2,
+            f,
+            g,
+            minCont = rows;
+
+    for (i=0; i<rows; i++) {
+        t1 = t2 = 0;
+        for (j=0; j<columns;) {
+            g = cells(i*columns+j);
+            do {
+                f = g;
+                j++;
+                if (j==columns) {
+                    break;
+                }
+                g = cells(i*columns+j);
+            } while (f==g);
+            _HYComponent* thisCell = (_HYComponent*)components(f);
+            t1 += thisCell->GetMaxLW();
+            t2 += thisCell->GetMinW();
+        }
+        if (t1<res.right) {
+            res.right = t1;
+        }
+        if (t2>res.left) {
+            res.left = t2;
+        }
+    }
+
+    for (j=0; j<columns; j++) {
+        t1 = t2 = 0;
+        long thisCont = rows;
+        for (i=0; i<rows;) {
+            g = cells(i*columns+j);
+            do {
+                f = g;
+                i++;
+                if (i==rows) {
+                    break;
+                }
+                g = cells(i*columns+j);
+                if (f==g) {
+                    thisCont --;
+                } else {
+                    break;
+                }
+            } while (1);
+
+            _HYComponent* thisCell = (_HYComponent*)components(f);
+            t1 += thisCell->GetMaxLH();
+            t2 += thisCell->GetMinH();
+
+
+        }
+        if (t1<res.bottom) {
+            res.bottom = t1;
+        }
+        if (t2>res.top) {
+            res.top = t2;
+        }
+
+        if (thisCont<minCont) {
+            minCont = thisCont;
+        }
+    }
+
+    if (res.left) {
+        res.left--;
+    }
+
+    res.right--;
+
+    if (res.top) {
+        res.top--;
+    }
+
+    res.bottom--;
+
+    if (minCont>3) {
+        res.bottom-=minCont-3;
+    }
+
+    if (!(flags&HY_WINDOW_DLOG)) {
+        res.bottom += HY_SCROLLER_WIDTH-1;
+        res.top    += HY_SCROLLER_WIDTH-1;
+    }
+
+    contentHeight = res.bottom;
+    contentWidth  = res.right;
+    return res;
+}
+
+//__________________________________________________________________
+
+void    _HYTWindow::RecomputeCellRects (void)
+{
+    int t,l,b,r,i,j,f,g,c,j2,p,p2,mw;
+    bool scroller;
+    _HYComponent* thisCell;
+    VisibleContents (t,l,b,r);
+    //r-=l+HY_SCROLLER_WIDTH;
+    r-=l;
+    b-=t;
+
+    _Parameter lf=(r-dim.left)/columns; // "extra" width per cell
+    _Parameter tf=(b-dim.top)/rows;     // "extra" height per cell
+
+    if (!(flags&HY_WINDOW_DLOG)) {
+        b-=HY_SCROLLER_WIDTH;
+    }
+
+
+    _SimpleList     alreadyDone;
+    for (i=0; i<rows; i++) {
+        c = 0;
+        p = -1;
+        for (j=0; j<columns;) {
+            j2 = j;
+            f = cells.lData[i*columns+j];
+            thisCell = (_HYComponent*)components.lData[f];
+            if (alreadyDone.Find(f)>=0) {
+                c = componentR.lData[f];
+                j++;
+                scroller = false;
+                continue;
+            }
+            do {
+                g = f;
+
+                j++;
+                if (j==columns) {
+                    break;
+                }
+                f = cells.lData[i*columns+j];
+            } while (f==g);
+            _HYComponent* thisCell;
+            thisCell = (_HYComponent*)components.lData[g];
+            componentL.lData[g] = c;
+            f = lf*(j-j2)+thisCell->GetMinW()-1;
+            mw = thisCell->GetMaxLW()-1;
+            if (f>=mw) {
+                f=mw;
+            } else {
+                p=g;
+                p2=j-1;
+            }
+            c+=f;
+            componentR.lData[g] = c;
+            scroller = true;
+        }
+        if ((c<r)&&(p>=0)) {
+            int diff = r-c;
+            componentR.lData[p]+=diff;
+            _SimpleList localDone;
+            for (j=p2+1; j<columns; j++) {
+                f = cells.lData[i*columns+j];
+                if (localDone.Find(f)>=0) {
+                    continue;
+                } else {
+                    localDone<<f;
+                }
+                componentL.lData[f]+=diff;
+                componentR.lData[f]+=diff;
+            }
+        }
+    }
+    alreadyDone.Clear();
+    for (j=0; j<columns; j++) {
+        c = 0;
+        p=-1;
+        _SimpleList stretch, stretchI,stretchW;
+        p2 = alreadyDone.lLength;
+        for (i=0; i<rows;) {
+            j2 = i;
+            f = cells.lData[i*columns+j];
+            thisCell = (_HYComponent*)components.lData[f];
+            if (alreadyDone.Find(f)>=0) {
+                c += componentB.lData[f]-componentT.lData[f];
+                i++;
+                scroller = false;
+                continue;
+            }
+            do {
+                g = f;
+                i++;
+                if (i==rows) {
+                    break;
+                }
+                f = cells.lData[i*columns+j];
+            } while (f==g);
+            _HYComponent* thisCell = (_HYComponent*)components.lData[g];
+            componentT.lData[g] = c;
+            f = tf*(i-j2)+thisCell->GetMinH();
+            mw = thisCell->GetMaxLH()-1;
+            if (f>mw) {
+                f=mw;
+            } else {
+                stretch<<g;
+                stretchI<<i-1;
+                stretchW<<mw-f;
+                //p=g;
+                //p2=i-1;
+            }
+            c+=f;
+            componentB.lData[g] = c;
+            scroller = true;
+            alreadyDone<<g;
+            //c++;
+        }
+        while ((c<b)&&(stretch.lLength)) {
+            int diff = b-c;
+            if (diff>stretchW.lData[stretch.lLength-1]) {
+                diff = stretchW.lData[stretch.lLength-1];
+            }
+
+            componentB.lData[stretch.lData[stretch.lLength-1]]+=diff;
+            _SimpleList localDone;
+            for (i=stretchI.lData[stretch.lLength-1]+1; i<rows; i++) {
+                f = cells.lData[i*columns+j];
+                p = alreadyDone.Find(f);
+                if ((localDone.Find(f)>=0)||(j&&(p>=0)&&(p<p2)))
+                    //if (localDone.Find(f)>=0)
+                {
+                    continue;
+                } else {
+                    localDone<<f;
+                }
+                componentT.lData[f]+=diff;
+                componentB.lData[f]+=diff;
+            }
+
+            c+=diff;
+            stretchI.Delete(stretch.lLength-1);
+            stretchW.Delete(stretch.lLength-1);
+            stretch.Delete(stretch.lLength-1);
+        }
+    }
+}
+
+//__________________________________________________________________
+
+int     _HYTWindow::FindClickedCell (int h, int v)
+{
+    for (int i=0; i<components.lLength; i++) {
+        if (cells.Find (i)>=0)
+            if ((h>=componentL.lData[i])&&(h<=componentR.lData[i])
+                    &&(v>=componentT.lData[i])&&(v<=componentB.lData[i])) {
+                return i;
+            }
+    }
+    return -1;
+}
+
+//__________________________________________________________________
+
+void        _HYTWindow::DoMouseWheel (long c, long delta)
+{
+    if (c>=0) {
+        _HYComponent * thisC = (_HYComponent*) components (c);
+
+        if (thisC->HasVScroll()) {
+            long    invisPixels     = thisC->GetMaxH()-(thisC->GetVSize()),
+                    smallScrollStep = (double)10.*MAX_CONTROL_VALUE/invisPixels,
+                    cv               = thisC->_GetVScrollerPos (),
+                    cv2;
+
+            if (!smallScrollStep) {
+                smallScrollStep = 1;
+            }
+
+            cv2 = cv - delta*smallScrollStep;
+
+            if (cv2<0) {
+                cv2 = 0;
+            } else if (cv2>MAX_CONTROL_VALUE) {
+                cv2 = MAX_CONTROL_VALUE;
+            }
+
+            thisC->_SetVScrollerPos (cv2);
+
+            thisC->ProcessEvent (generateScrollEvent(0,cv2-cv));
+        }
+    }
+}
+
+
+//__________________________________________________________________
+void        _HYTWindow::Paint (Ptr p)
+{
+    _Paint(p);
+}
+
+//__________________________________________________________________
+void        _HYTWindow::Update (Ptr p)
+{
+    _Update(p);
+}
+
+//__________________________________________________________________
+void        _HYTWindow::UpdateComponentInfo (void)
+{
+    SetWindowRectangle(top,left,bottom,right);
+}
+
+//__________________________________________________________________
+void        _HYTWindow::Activate(void)
+{
+    _HYWindow::Activate();
+}
+
+//__________________________________________________________________
+void        _HYTWindow::SetStatusBar(_String& text)
+{
+    statusBar = text;
+    _SetStatusBar (text);
+}
+
+//__________________________________________________________________
+long        _HYTWindow::MatchComponentID (_String& text)
+{
+    long k = text.toNum(),
+         i;
+    for (i=0; i<components.lLength; i++)
+        if (((_HYGuiObject*)components(i))->MatchID(k)) {
+            return i;
+        }
+    return -1;
+}
+
+//__________________________________________________________________
+void        _HYTWindow::HandleCopyPaste (bool paste)
+{
+    int         componentID = keyboardFocus;
+
+    if          (paste) {
+        BaseRef      pastingReference = nil;
+        _String*     clipData = _GetPasteString();
+
+        if (clipData->sLength)
+            if (componentID < 0) {
+                for (componentID=0; componentID<components.lLength; componentID++)
+                    if (cells.Find(componentID)>=0)
+                        if ((pastingReference =     ((_HYComponent*)components(componentID))->CanPaste (*clipData))) {
+                            break;
+                        }
+
+            } else {
+                pastingReference =  ((_HYComponent*)components(componentID))->CanPaste (*clipData);
+            }
+
+        DeleteObject (clipData);
+        if (pastingReference) {
+            ((_HYComponent*)components(componentID))->HandlePaste (pastingReference);
+            DeleteObject (pastingReference);
+        }
+    } else {
+        _String*     clipData = nil;
+
+        if (componentID < 0) {
+            for (componentID=0; componentID<components.lLength; componentID++)
+                if (cells.Find(componentID)>=0)
+                    if (((_HYComponent*)components(componentID))->CanCopy()) {
+                        break;
+                    }
+
+        } else if (!((_HYComponent*)components(componentID))->CanCopy()) {
+            componentID = components.lLength;
+        }
+
+        if (componentID < components.lLength) {
+            clipData = ((_HYComponent*)components(componentID))->HandleCopy ();
+            if (clipData) {
+                _SetCopyString (clipData);
+                DeleteObject   (clipData);
+            }
+        }
+
+    }
+
+}
+
+//__________________________________________________________________
+
+void        _HYTWindow::SetWindowRectangle(int t, int l, int b, int r, bool ss)
+{
+    dim = MinMaxWindowDimensions();
+    if (b-t>=dim.bottom) {
+        b=t+dim.bottom-1;
+    }
+
+    if (b-t<=dim.top) {
+        b=t+dim.top-1;
+    }
+
+    if (r-l>=dim.right) {
+        r=l+dim.right-1;
+    }
+
+    if (r-l<=dim.left) {
+        r=l+dim.left-1;
+    }
+
+    _HYWindow::SetWindowRectangle (t,l,b,r,ss);
+    _HYPlatformTWindow::_SetWindowRectangle (t,l,b,r,ss);
+    RecomputeCellRects();
+    _HYRect  relRect;
+    for (int i=0; i<components.lLength; i++) {
+        if (cells.Find(i)>=0) {
+            relRect.left = componentL.lData[i];
+            relRect.right = componentR.lData[i];
+            relRect.top = componentT.lData[i];
+            relRect.bottom = componentB.lData[i];
+            ((_HYComponent*)components(i))->SetVisibleSize(relRect);
+        }
+    }
+}
+
+
+//__________________________________________________________________
+// _HYPWindow
+//__________________________________________________________________
+
+_HYPWindow::_HYPWindow(_String windowTitle,int ih, int iw, int id, bool vis):_HYGWindow (windowTitle, ih,iw,id,vis,true)
+{
+    resizing = false;
+    oh       = ih;
+    ow       = iw;
+}
+
+//__________________________________________________________________
+
+void    _HYPWindow::StartDraw(void)
+{
+    _HYGraphicPane::StartDraw();
+    if (!resizing) {
+        _StartPicture();
+    }
+}
+
+//__________________________________________________________________
+
+void    _HYPWindow::EndDraw(void)
+{
+    if (!resizing) {
+        _EndPicture();
+    }
+
+    _HYGraphicPane::EndDraw();
+}
+
+//__________________________________________________________________
+
+void    _HYPWindow::SetPaneSize (int h, int w, int d)
+{
+    resizing = true;
+    _HYGraphicPane::SetPaneSize (h,w,d);
+    _HYRect        drRect = {0,0,h,w,d};
+    _HYGraphicPane::StartDraw();
+    _DrawPicture  (drRect);
+    _HYGraphicPane::EndDraw();
+    resizing = false;
+}
+
+//__________________________________________________________________
+
+void    _HYPWindow::Zoom (_Parameter factor)
+{
+    long newW = contentWidth  * factor,
+         newH = contentHeight * factor;
+
+    SetWindowRectangle (0,0,newH, newW);
+    SetContentSize     (newW,newH);
+}
+
+//__________________________________________________________________
+
+void    _HYPWindow::OriginalSize (void)
+{
+    SetWindowRectangle (0,0,oh,ow);
+    SetContentSize     (ow,oh);
+}
+
+//__________________________________________________________________________________
+
+void    HandleGlobalQueueEvent (void)
+{
+    long mSel,
+         menuChoice;
+
+    static  bool handling = false;
+
+    _String evCode (((_HYEvent*)GlobalGUIEventQueue.lData[0])->EventCode());
+
+    mSel = evCode.Find(',')-1;
+    if (mSel<-1) {
+        mSel = -1;
+    }
+
+    mSel = evCode.Cut (0,mSel).toNum();
+    menuChoice = -1;
+    if (!handling) {
+        handling = true;
+        for (long f=0; f<windowObjectRefs.countitems(); f++)
+            if (((_HYGuiObject*)windowObjectRefs.lData[f])->MatchID(mSel)) {
+                menuChoice = f;
+            } else {
+                ((_HYGuiObject*)windowObjectRefs.lData[f])->ProcessGEvent((_HYEvent*)GlobalGUIEventQueue.lData[0]);
+            }
+
+        if (menuChoice>=0) {
+            ((_HYGuiObject*)windowObjectRefs.lData[menuChoice])->ProcessGEvent((_HYEvent*)GlobalGUIEventQueue.lData[0]);
+        }
+
+        GlobalGUIEventQueue.Delete(0);
+        handling = false;
+    }
+}
+
+//EOF
\ No newline at end of file
diff --git a/src/gui/gtk/Components/HYPlatformButton.cpp b/src/gui/gtk/Components/HYPlatformButton.cpp
new file mode 100644
index 0000000..ea10295
--- /dev/null
+++ b/src/gui/gtk/Components/HYPlatformButton.cpp
@@ -0,0 +1,257 @@
+/*
+    Button component for GTK.
+
+    Sergei L. Kosakovsky Pond, November 2004
+*/
+
+#include "errorfns.h"
+#include "HYButton.h"
+#include "HYUtils.h"
+#include "HYEventTypes.h"
+#include "HYWindow.h"
+#include "HYGraphicPane.h"
+#include <gdk/gdkkeysyms.h>
+
+#ifdef    __HYPHYDMALLOC__
+#include "dmalloc.h"
+#endif
+
+//__________________________________________________________________
+
+void        hy_clicked_button_callback      (GtkButton *button, gpointer user_data)
+{
+    _HYButton * theb = (_HYButton*)user_data;
+    if (theb->messageRecipient) {
+        theb->messageRecipient->ProcessEvent (generateButtonPushEvent (theb->GetID(),0));
+    }
+}
+
+//__________________________________________________________________
+
+_HYPlatformButton::_HYPlatformButton    (void)
+{
+    _HYButton *     parent = (_HYButton*)this;
+    buttonControl          = nil;
+    buttonRect             = (GdkRectangle) {
+        0,0,100,100
+    };
+    buttonFontDesc         = pango_font_description_new ();
+}
+
+//__________________________________________________________________
+
+_HYPlatformButton::~_HYPlatformButton   (void)
+{
+    pango_font_description_free (buttonFontDesc);
+}
+
+//__________________________________________________________________
+
+void    _HYPlatformButton::_SetBackColor (_HYColor& c)
+{
+    bgColor = HYColorToGDKColor(c);
+}
+
+
+//__________________________________________________________________
+
+void        _HYPlatformButton::_SetFont (_HYFont& f)
+{
+    //_HYFont f2 = f;
+    //f2.size = f.size*fontConversionFactor;
+    HYFont2PangoFontDesc(f,buttonFontDesc);
+    if (buttonControl) {
+        _ApplyFont ();
+    }
+}
+
+
+//__________________________________________________________________
+
+void        _HYPlatformButton::_ApplyFont(void)
+{
+    gtk_widget_modify_font (gtk_bin_get_child(GTK_BIN(buttonControl)), buttonFontDesc);
+}
+
+//__________________________________________________________________
+void        _HYPlatformButton::_Update (Ptr p)
+{
+    _Paint (p);
+}
+
+//__________________________________________________________________
+void        _HYPlatformButton::_SetDimensions (_HYRect r, _HYRect rel)
+{
+    _HYButton* theParent = (_HYButton *) this;
+    theParent->_HYPlatformComponent::_SetDimensions (r,rel);
+    _SetVisibleSize (rel);
+}
+
+//__________________________________________________________________
+void        _HYPlatformButton::_EnableButton (bool e)
+{
+    if (buttonControl) {
+        gtk_widget_set_sensitive(buttonControl,e);
+    }
+}
+
+
+//__________________________________________________________________
+void        _HYPlatformButton::_SetButtonKind (unsigned char k)
+{
+    if (buttonControl)
+        if (k==HY_BUTTON_OK) {
+            GTK_WIDGET_SET_FLAGS (buttonControl,  GTK_CAN_DEFAULT|GTK_HAS_DEFAULT);
+        } else {
+            GTK_WIDGET_UNSET_FLAGS (buttonControl,  GTK_CAN_DEFAULT|GTK_HAS_DEFAULT);
+        }
+}
+
+
+//__________________________________________________________________
+void        _HYPlatformButton::_SetVisibleSize (_HYRect rel)
+{
+    _HYButton * theParent = (_HYButton*) this;
+
+    buttonRect.x    =   rel.left;
+    buttonRect.y    =   rel.top;
+
+    _HYRect s = theParent->_SuggestDimensions();
+
+    buttonRect.width =  s.right;
+    buttonRect.height = s.bottom;
+
+    AlignRectangle (rel, buttonRect, theParent->GetAlignFlags());
+
+    if (buttonControl) {
+        gtk_fixed_move (GTK_FIXED(theParent->parentWindow), buttonControl, buttonRect.x, buttonRect.y);
+        gtk_widget_set_size_request(buttonControl,buttonRect.width,buttonRect.height);
+        //SizeControl (buttonControl,buttonRect.right-buttonRect.left+1,buttonRect.bottom-buttonRect.top+1);
+        //MoveControl (buttonControl,buttonRect.left,buttonRect.top);
+    }
+}
+
+
+//__________________________________________________________________
+void        _HYPlatformButton::_Paint (Ptr p)
+{
+    _HYButton * theParent = (_HYButton*)this;
+
+    GdkRectangle        cRect = HYRect2GDKRect(*(_HYRect*)p);
+
+    if (!(theParent->settings.width&HY_COMPONENT_TRANSP_BG)) {
+        if (theParent->parentWindow->window) {
+            GdkGC *buttonGC              = gdk_gc_new (theParent->parentWindow->window);
+            gdk_gc_set_foreground(buttonGC,&bgColor);
+            GdkRegion * r1 = gdk_region_rectangle(&cRect),
+                        * r2 = gdk_region_rectangle (&buttonRect);
+
+            gdk_region_subtract    (r1,r2);
+            gdk_region_offset      (r1,theParent->parentWindow->allocation.x,theParent->parentWindow->allocation.y);
+            gdk_gc_set_clip_region (buttonGC,r1);
+            gdk_draw_rectangle(theParent->parentWindow->window,buttonGC,true,cRect.x+theParent->parentWindow->allocation.x,
+                               cRect.y+theParent->parentWindow->allocation.y, cRect.width, cRect.height);
+            gdk_region_destroy(r1);
+            gdk_region_destroy(r2);
+            g_object_unref (buttonGC);
+        }
+    }
+
+    (*theParent)._HYPlatformComponent::_Paint(p);
+}
+
+
+//__________________________________________________________________
+void        _HYPlatformButton::_PaintMe (void)
+{
+}
+
+
+//__________________________________________________________________
+
+_HYRect _HYButton::_SuggestDimensions (void)
+{
+    _HYRect res = {10,100,10,100,HY_COMPONENT_NO_SCROLL};
+
+    if (buttonControl) {
+        PangoLayout *buttonLayout            = pango_layout_new           (screenPContext);
+        pango_layout_set_width (buttonLayout, -1);
+        pango_layout_set_font_description(buttonLayout,buttonFontDesc);
+        pango_layout_set_text(buttonLayout,buttonText.sData,buttonText.sLength);
+        PangoRectangle extents,
+                       logical_ext;
+
+        pango_layout_get_pixel_extents (buttonLayout,&extents,&logical_ext);
+        //pango_layout_get_extents     (buttonLayout,&logical_ext,NULL);
+
+        res.right   = (res.left = logical_ext.width  + 20);
+        res.bottom  = (res.top  = logical_ext.height + 9);
+        g_object_unref              (buttonLayout);
+    }
+
+    return res;
+}
+
+
+//__________________________________________________________________
+
+void        _HYButton::_Activate (void)
+{
+}
+
+//__________________________________________________________________
+
+void        _HYButton::_Deactivate (void)
+{
+}
+
+//__________________________________________________________________
+
+void        _HYPlatformButton::_SetText (void)
+{
+    _HYButton *parent = (_HYButton*)this;
+
+    if (buttonControl) {
+        gtk_button_set_label (GTK_BUTTON(buttonControl),parent->GetText().sData);
+    } else {
+        buttonControl = gtk_button_new_with_label (parent->GetText().sData);
+        gtk_container_add(GTK_CONTAINER(parent->parentWindow),buttonControl);
+        gtk_widget_set_app_paintable(buttonControl,true);
+        gtk_widget_show (buttonControl);
+        g_signal_connect (G_OBJECT (buttonControl), "clicked", G_CALLBACK (hy_clicked_button_callback), parent);
+        _ApplyFont ();
+    }
+}
+
+
+//__________________________________________________________________
+
+bool _HYButton::_ProcessOSEvent (Ptr vEvent)
+{
+    _HY_GTK_UI_Message *theMessage = (_HY_GTK_UI_Message*)vEvent;
+
+    if(buttonControl&&isEnabled) {
+        switch (theMessage->theEvent->type) {
+        case GDK_KEY_PRESS: {
+            GdkEventKey * kpe = (GdkEventKey*)theMessage->theEvent;
+
+            gint    keyCode = kpe->keyval;
+
+            bool    good    = false;
+
+            if (buttonKind == HY_BUTTON_OK) {
+                good = (keyCode==GDK_Return || keyCode==GDK_KP_Enter);
+            } else if (buttonKind == HY_BUTTON_CANCEL) {
+                good = keyCode==GDK_Escape;
+            }
+
+            if (good) {
+                gtk_button_clicked (GTK_BUTTON(buttonControl));
+                return true;
+            }
+        }
+        }
+    }
+
+    return _HYPlatformComponent::_ProcessOSEvent (vEvent);
+}
diff --git a/src/gui/gtk/Components/HYPlatformButtonBar.cpp b/src/gui/gtk/Components/HYPlatformButtonBar.cpp
new file mode 100644
index 0000000..aec475e
--- /dev/null
+++ b/src/gui/gtk/Components/HYPlatformButtonBar.cpp
@@ -0,0 +1,504 @@
+/*
+    Toolbar component glue for GTK+
+
+    Sergei L. Kosakovsky Pond, November 2004
+*/
+
+#include "HYPlatformGraphicPane.h"
+
+#include "errorfns.h"
+#include "HYButtonBar.h"
+#include "HYUtils.h"
+#include "HYEventTypes.h"
+
+#include "HYWindow.h"
+#include "HYGraphicPane.h"
+
+#include "string.h"
+
+#ifdef    __HYPHYDMALLOC__
+#include "dmalloc.h"
+#endif
+//__________________________________________________________________
+
+GdkColor    buttonBorder1 = HYColorToGDKColor((_HYColor)
+{
+    0,0,0
+}),
+                            buttonBorder2 = HYColorToGDKColor((_HYColor)
+{
+    0x3f,0x3f,0x3f
+});
+
+_HYFont     _hyttDisplayFont = {_HY_SANS_FONT,9,HY_FONT_PLAIN};
+
+//__________________________________________________________________
+
+gboolean TooltipPopupTimer (Ptr* userData)
+{
+    // TBI
+
+    _HYButtonBar * myBB = (_HYButtonBar*)userData;
+
+    gint            x,y;
+    GdkModifierType gmt;
+    GdkWindow       *pw = gtk_widget_get_parent_window(myBB->parentWindow);
+    if (pw) {
+        gdk_window_get_pointer (pw, &x, &y, &gmt);
+
+        if ( x==myBB->saveMousePosH && y==myBB->saveMousePosV && myBB->toolTipBounds.x == 0) {
+            myBB->_DisplayToolTip();
+        }
+
+        myBB->saveMousePosH = x;
+        myBB->saveMousePosV = y;
+    }
+    return true;
+}
+
+//__________________________________________________________________
+
+_HYPlatformButtonBar::_HYPlatformButtonBar(void)
+{
+    backFill           = HYColorToGDKColor ((_HYColor) {
+        255,255,255
+    });
+    pushed             = -1;
+    saveMousePosH      = -1;
+    saveMousePosV      = -1;
+    lastMouseDown      = -1;
+    toolTipBounds.x    = 0;
+    theTimer           = 0;
+    bbGC               = nil;
+}
+
+//__________________________________________________________________
+
+_HYPlatformButtonBar::~_HYPlatformButtonBar(void)
+{
+    if (theTimer) {
+        g_source_remove (theTimer);
+        theTimer = 0;
+    }
+    if (bbGC) {
+        g_object_unref (bbGC);
+    }
+}
+
+//__________________________________________________________________
+
+void    _HYPlatformButtonBar::_DisposeButtons(void)
+{
+}
+
+//__________________________________________________________________
+
+void    _HYPlatformButtonBar::_DisposeButton(long k)
+{
+}
+
+
+//__________________________________________________________________
+
+void        _HYPlatformButtonBar::_SetBackColor (_HYColor& c)
+{
+    backFill = HYColorToGDKColor(c);
+}
+
+//__________________________________________________________________
+void        _HYPlatformButtonBar::_SetVisibleSize (_HYRect rel)
+{
+    _HYButtonBar* theParent = (_HYButtonBar*) this;
+
+    buttonRect.x = rel.left;
+    buttonRect.y = rel.top;
+
+    _HYRect s = theParent->_SuggestDimensions();
+
+    buttonRect.width  = s.right;
+    buttonRect.height = s.bottom;
+
+    AlignRectangle (rel, buttonRect, theParent->GetAlignFlags());
+}
+
+
+//__________________________________________________________________
+
+void        _HYButtonBar::_Activate (void)
+{
+    if (!activationFlag)
+        for (long k=0; k<enabledButtons.lLength; k++) {
+            _MarkButtonForUpdate (enabledButtons.lData[k]);
+        }
+
+    if (!theTimer) {
+        theTimer = g_timeout_add  (1000,(GSourceFunc)TooltipPopupTimer,(gpointer)this);
+    }
+
+    _HYPlatformComponent::_Activate();
+}
+
+//__________________________________________________________________
+void        _HYPlatformButtonBar::_SmiteTooltip (void)
+{
+    _HYButtonBar * p = (_HYButtonBar*)this;
+    if (toolTipBounds.x) {
+        if (p->parentWindow->window) {
+            toolTipBounds.width++;
+            toolTipBounds.height++;
+            gdk_window_invalidate_rect (p->parentWindow->window, &toolTipBounds, false);
+        }
+        toolTipBounds.x = 0;
+    }
+}
+
+//__________________________________________________________________
+
+void        _HYButtonBar::_Deactivate (void)
+{
+    if (activationFlag) {
+        for (long k=0; k<enabledButtons.lLength; k++) {
+            _MarkButtonForUpdate (enabledButtons.lData[k]);
+        }
+        _SmiteTooltip();
+    }
+
+    if (theTimer) {
+        g_source_remove (theTimer);
+        theTimer = 0;
+    }
+
+    _HYPlatformComponent::_Deactivate();
+}
+
+
+//__________________________________________________________________
+
+void        _HYButtonBar::_ComponentMouseExit (void)
+{
+    _UnpushButton();
+    _SmiteTooltip();
+
+    /*if (theTimer)
+    {
+        g_source_remove (theTimer);
+        theTimer = 0;
+    }*/
+}
+
+//__________________________________________________________________
+void        _HYPlatformButtonBar::_MarkButtonForUpdate (int i)
+{
+    _HYButtonBar* theParent = (_HYButtonBar*)this;
+
+    if ( i>=0 && i<theParent->ButtonCount()) {
+        int hR = i%theParent->BarWidth(),
+            vR = i/theParent->BarWidth(),
+            step = 2*HY_BUTTONBAR_BORDER+theParent->GetButtonDim();
+
+        GdkRectangle          invRect;
+        invRect.x           = buttonRect.x + hR*step + theParent->parentWindow->allocation.x;
+        invRect.y           = buttonRect.y + vR*step + theParent->parentWindow->allocation.y;
+        invRect.width       = invRect.height = step;
+
+        if (theParent->parentWindow->window) {
+            gdk_window_invalidate_rect (theParent->parentWindow->window, &invRect, false);
+        }
+    }
+}
+
+
+//__________________________________________________________________
+void        _HYPlatformButtonBar::_Paint (Ptr p)
+{
+    _HYButtonBar * theParent = (_HYButtonBar*)this;
+
+    if (theParent->parentWindow->window) {
+        GdkRectangle    cRect    = HYRect2GDKRect(*(_HYRect*)p),
+                        iRect;
+
+        if (!bbGC) {
+            bbGC                 = gdk_gc_new (theParent->parentWindow->window);
+            gdk_gc_set_line_attributes (bbGC, 1, GDK_LINE_SOLID, GDK_CAP_NOT_LAST, GDK_JOIN_MITER);
+        }
+
+        cRect.x += theParent->parentWindow->allocation.x;
+        cRect.y += theParent->parentWindow->allocation.y;
+
+        if (!(theParent->settings.width&HY_COMPONENT_TRANSP_BG)) {
+            gdk_gc_set_foreground(bbGC,&backFill);
+            gdk_draw_rectangle(theParent->parentWindow->window,bbGC,true,cRect.x, cRect.y, cRect.width, cRect.height);
+        }
+
+
+        gdk_gc_set_clip_rectangle(bbGC,&cRect);
+
+        cRect.x  = buttonRect.x;
+        cRect.y  = buttonRect.y;
+
+        int   step   = theParent->GetButtonDim()+2*HY_BUTTONBAR_BORDER;
+
+        cRect.width  = cRect.height = step;
+
+        gdk_gc_set_foreground(bbGC,&buttonBorder1);
+        for (long i=0; i<theParent->ButtonCount(); i++) {
+            if (i&& i%theParent->BarWidth()==0) {
+                cRect.x  =  buttonRect.x;
+                cRect.y  += step;
+            }
+
+            iRect    = cRect;
+            iRect.x += theParent->parentWindow->allocation.x + HY_BUTTONBAR_BORDER;
+            iRect.y += theParent->parentWindow->allocation.y + HY_BUTTONBAR_BORDER;
+
+            iRect.width  -= 2*HY_BUTTONBAR_BORDER;
+            iRect.height -= 2*HY_BUTTONBAR_BORDER;
+
+            GdkPixbuf * buttonToPlot = nil;
+
+            if (theParent->activationFlag) {
+                if (i==pushed) {
+                    buttonToPlot = gdk_pixbuf_composite_color_simple ((GdkPixbuf*)theParent->buttons.lData[i], iRect.width, iRect.height,GDK_INTERP_BILINEAR,128,1024,0x00000000,0x00000000);
+                } else {
+                    if (theParent->enabledButtons.Find(i)>=0) {
+                        buttonToPlot = gdk_pixbuf_composite_color_simple ((GdkPixbuf*)theParent->buttons.lData[i], iRect.width, iRect.height,GDK_INTERP_BILINEAR,255,1024,0,0);
+                    } else {
+                        buttonToPlot = gdk_pixbuf_composite_color_simple ((GdkPixbuf*)theParent->buttons.lData[i], iRect.width, iRect.height,GDK_INTERP_BILINEAR,128,1,0x00ffffff,0x00888888);
+                    }
+                }
+            } else {
+                buttonToPlot = gdk_pixbuf_composite_color_simple ((GdkPixbuf*)theParent->buttons.lData[i], iRect.width, iRect.height,GDK_INTERP_BILINEAR,128,1,0x00ffffff,0x00888888);
+            }
+            gdk_draw_pixbuf (theParent->parentWindow->window,bbGC, buttonToPlot, 0,0, iRect.x, iRect.y, iRect.width, iRect.height, GDK_RGB_DITHER_NORMAL, 0, 0);
+            g_object_unref (buttonToPlot);
+            iRect.x --;
+            iRect.y --;
+            iRect.width += 2;
+            iRect.height += 2;
+
+            gdk_draw_rectangle(theParent->parentWindow->window,bbGC,false,iRect.x, iRect.y, iRect.width, iRect.height);
+            cRect.x +=step;
+        }
+        gdk_gc_set_clip_rectangle(bbGC,nil);
+
+    }
+
+    (*theParent)._HYPlatformComponent::_Paint(p);
+}
+
+
+//__________________________________________________________________
+_HYRect _HYPlatformButtonBar::_GetButtonRect (bool conv)
+{
+    _HYRect         res = GdkRect2HYRect (buttonRect);
+    _HYButtonBar* theParent = (_HYButtonBar*) this;
+
+    if (conv) {
+        res.left   += theParent->parentWindow->parent->allocation.x;
+        res.right  += theParent->parentWindow->parent->allocation.x;
+        res.top    += theParent->parentWindow->parent->allocation.y;
+        res.bottom += theParent->parentWindow->parent->allocation.y;
+    }
+    return res;
+}
+
+
+//__________________________________________________________________
+void        _HYPlatformButtonBar::_Update (Ptr p)
+{
+    _Paint (p);
+}
+
+//__________________________________________________________________
+void        _HYPlatformButtonBar::_UnpushButton (void)
+{
+    if (pushed>=0) {
+        _MarkButtonForUpdate(pushed);
+        pushed = -1;
+        lastMouseDown = -1;
+    }
+}
+
+//__________________________________________________________________
+void        _HYPlatformButtonBar::_SetDimensions (_HYRect r, _HYRect rel)
+{
+    _HYButtonBar* theParent = (_HYButtonBar*) this;
+    theParent->_HYPlatformComponent::_SetDimensions (r,rel);
+    _SetVisibleSize (rel);
+}
+
+//__________________________________________________________________
+int         _HYPlatformButtonBar::_FindClickedButton (int v, int h)
+{
+    _HYButtonBar * parent = (_HYButtonBar*)this;
+
+    v -= parent->parentWindow->allocation.y;
+    h -= parent->parentWindow->allocation.x;
+
+    if ( h>=buttonRect.x && h<buttonRect.x + buttonRect.width && v>=buttonRect.y && v<buttonRect.y + buttonRect.height ) {
+        v -= buttonRect.y;
+        h -= buttonRect.x;
+
+        int step = 2*HY_BUTTONBAR_BORDER+parent->buttonDim,
+            hR = h/step,
+            vR = v/step;
+
+        v  -= vR*step;
+        h  -= hR*step;
+
+        if (v>HY_BUTTONBAR_BORDER && v<step-HY_BUTTONBAR_BORDER && h>HY_BUTTONBAR_BORDER && h<step-HY_BUTTONBAR_BORDER) {
+            return hR+vR*parent->barW;
+        }
+    }
+    return -1;
+
+}
+
+//__________________________________________________________________
+
+bool _HYButtonBar::_ProcessOSEvent (Ptr vEvent)
+{
+    if (buttons.lLength) {
+        _HY_GTK_UI_Message *theMessage = (_HY_GTK_UI_Message*)vEvent;
+
+        gdouble   xc,
+                  yc;
+
+        if (gdk_event_get_coords (theMessage->theEvent,&xc,&yc)) {
+            switch (theMessage->theEvent->type) {
+            case GDK_BUTTON_PRESS: {
+                if (((GdkEventButton*)theMessage->theEvent)->button != 1) {
+                    return false;
+                }
+                _SmiteTooltip();
+                int h = _FindClickedButton (yc,xc);
+                if ( h>=0 && enabledButtons.Find(h) >=0 ) {
+                    if (pullDownButtons.Find (h)>=0) {
+                        lastMouseDown = -1;
+                        SendButtonPush(h);
+                    } else {
+                        pushed  = lastMouseDown = h;
+                        _MarkButtonForUpdate (h);
+                    }
+                }
+                return true;
+            }
+
+            case GDK_BUTTON_RELEASE: {
+                if (lastMouseDown>=0 || pushed >= 0) {
+                    int h = _FindClickedButton (yc,xc);
+                    if (h==pushed && pushed >= 0) {
+                        SendButtonPush (h);
+                    }
+                    _MarkButtonForUpdate (pushed);
+                    _MarkButtonForUpdate (lastMouseDown);
+                    pushed        = -1;
+                    lastMouseDown = -1;
+                }
+                return true;
+            }
+
+            case GDK_MOTION_NOTIFY : {
+                _SmiteTooltip();
+                if (lastMouseDown>=0) {
+                    int h = _FindClickedButton (yc,xc);
+                    if (h!=lastMouseDown) {
+                        if (pushed>=0) {
+                            pushed = -1;
+                            _MarkButtonForUpdate (lastMouseDown);
+                        }
+                    } else {
+                        if (pushed==-1) {
+                            pushed = lastMouseDown;
+                            _MarkButtonForUpdate (lastMouseDown);
+                        }
+                    }
+                }
+                return true;
+            }
+            }
+        }
+    }
+    return _HYPlatformComponent::_ProcessOSEvent (vEvent);
+}
+
+
+//__________________________________________________________________
+void        _HYButtonBar::_DisplayToolTip      (void)
+{
+    // TBI
+
+    int h = _FindClickedButton (saveMousePosV,saveMousePosH);
+
+    if ( h>=0 && h<toolTips.lLength) {
+        _String* toolTip = (_String*)toolTips(h);
+        if (toolTip->sLength) {
+            GdkColor      toolTipColor = HYColorToGDKColor((_HYColor) {
+                0xFF,0xCC,0x66
+            });
+
+            int        bL,
+                       bT;
+
+            GetButtonLoc (h,bL,bT,false);
+
+            PangoLayout          * ttText = pango_layout_new (screenPContext);
+            PangoFontDescription * ttFont = pango_font_description_new();
+            HYFont2PangoFontDesc(_hyttDisplayFont,ttFont);
+
+            pango_layout_set_font_description (ttText, ttFont);
+            pango_layout_set_width(ttText, -1);
+            pango_layout_set_text (ttText, toolTip->sData, toolTip->sLength);
+
+            PangoRectangle extents;
+            pango_layout_get_pixel_extents (ttText,&extents,nil);
+
+            toolTipBounds.y      = bT - 16;
+            toolTipBounds.height = 16;
+
+            if (toolTipBounds.y<0) {
+                toolTipBounds.y = bT+buttonDim+1;
+            }
+
+            h = extents.width + 4;
+
+            toolTipBounds.x = bL+(buttonDim-h-1)/2;
+
+            if (toolTipBounds.x<=0) {
+                toolTipBounds.x = 1;
+            }
+
+            toolTipBounds.width = h+2;
+
+            h = toolTipBounds.x+toolTipBounds.width-parentWindow->allocation.width;
+
+            if (h>0) {
+                if (h>=toolTipBounds.x) {
+                    h = toolTipBounds.x-1;
+                }
+                toolTipBounds.x -= h;
+            }
+
+            toolTipBounds.x += parentWindow->allocation.x;
+            toolTipBounds.y += parentWindow->allocation.y;
+
+            gdk_gc_set_foreground(bbGC,&toolTipColor);
+            gdk_draw_rectangle(parentWindow->window,bbGC,true,toolTipBounds.x, toolTipBounds.y, toolTipBounds.width, toolTipBounds.height);
+
+            toolTipColor = HYColorToGDKColor((_HYColor) {
+                0,0,0
+            });
+            gdk_gc_set_foreground(bbGC,&toolTipColor);
+            gdk_draw_rectangle(parentWindow->window,bbGC,false,toolTipBounds.x, toolTipBounds.y, toolTipBounds.width, toolTipBounds.height);
+
+            gdk_gc_set_clip_rectangle  (bbGC, &toolTipBounds);
+            gdk_draw_layout (parentWindow->window, bbGC, toolTipBounds.x+3, toolTipBounds.y+3, ttText);
+            gdk_gc_set_clip_rectangle  (bbGC, nil);
+
+            pango_font_description_free (ttFont);
+            g_object_unref (ttText);
+
+        }
+    }
+}
+//EOF
\ No newline at end of file
diff --git a/src/gui/gtk/Components/HYPlatformCheckBox.cpp b/src/gui/gtk/Components/HYPlatformCheckBox.cpp
new file mode 100644
index 0000000..c5b6a94
--- /dev/null
+++ b/src/gui/gtk/Components/HYPlatformCheckBox.cpp
@@ -0,0 +1,199 @@
+/*
+    Check box glue for GTK.
+
+    Sergei L. Kosakovsky Pond, November 2004
+*/
+
+#include "HYLabel.h"
+#include "HYWindow.h"
+#include "HYGraphicPane.h"
+
+#ifdef    __HYPHYDMALLOC__
+#include "dmalloc.h"
+#endif
+//__________________________________________________________________
+
+void        hy_toggled_button_callback      (GtkToggleButton *togglebutton, gpointer user_data)
+{
+    _HYCheckbox * thecb = (_HYCheckbox*)user_data;
+    if (thecb->isEnabled && gtk_toggle_button_get_active(togglebutton) != thecb->GetState())
+        if (!(thecb->isRadio&&thecb->checkState)) {
+            thecb->SetState (!thecb->checkState, true);
+        }
+}
+
+//__________________________________________________________________
+
+void        _HYCheckbox::_Activate (void)
+{
+    if ((!activationFlag) && (isEnabled&&checkboxControl)) {
+        gtk_widget_set_sensitive(checkboxControl,true);
+    }
+
+    _HYPlatformComponent::_Activate();
+}
+
+//__________________________________________________________________
+
+void        _HYCheckbox::_Deactivate (void)
+{
+    if (activationFlag&&isEnabled&&checkboxControl) {
+        gtk_widget_set_sensitive(checkboxControl,false);
+    }
+
+    _HYPlatformComponent::_Deactivate();
+}
+
+//__________________________________________________________________
+
+bool _HYCheckbox::_ProcessOSEvent (Ptr vEvent)
+{
+    return _HYPlatformComponent::_ProcessOSEvent (vEvent);
+}
+
+//__________________________________________________________________
+
+_HYRect     _HYCheckbox::_SuggestDimensions (void)
+{
+    _HYRect res  = _HYLabel::_SuggestDimensions();
+    res.left    += checkSpacing*2 + _GetBoxDimension();
+    res.right    = res.left;
+    return         res;
+}
+
+//__________________________________________________________________
+void        _HYPlatformCheckbox::_SetVisibleSize (_HYRect rel)
+{
+    _HYCheckbox * theParent = (_HYCheckbox*) this;
+
+    theParent->labelRect.x= rel.left;
+    theParent->labelRect.y = rel.top;
+
+    _HYRect s = theParent->_SuggestDimensions();
+
+    theParent->labelRect.width =  s.right;
+    theParent->labelRect.height = s.bottom;
+
+    AlignRectangle (rel, theParent->labelRect, theParent->GetAlignFlags());
+
+    checkboxRect.left   = theParent->labelRect.x + theParent->checkSpacing;
+    checkboxRect.bottom = theParent->labelRect.y + theParent->labelRect.height;
+
+    long             boxD = _GetBoxDimension();
+
+    checkboxRect.right = checkboxRect.left  + boxD;
+    checkboxRect.top   = checkboxRect.bottom >= boxD?checkboxRect.bottom - boxD:0;
+
+    theParent->labelRect.x += boxD+2*theParent->checkSpacing;
+
+    if (!checkboxControl) {
+        if (isRadio) {
+            checkboxControl = gtk_radio_button_new(nil);
+            dummyControl    = gtk_radio_button_new (gtk_radio_button_get_group(GTK_RADIO_BUTTON(checkboxControl)));
+        } else {
+            checkboxControl = gtk_check_button_new();
+        }
+
+        g_signal_connect (G_OBJECT (checkboxControl), "toggled", G_CALLBACK (hy_toggled_button_callback), theParent);
+
+        if (theParent->GetState() != gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(checkboxControl))) {
+            theParent->_SetState (theParent->GetState());
+        }
+
+        gtk_container_add(GTK_CONTAINER(theParent->parentWindow),checkboxControl);
+        gtk_widget_set_app_paintable(checkboxControl,true);
+        gtk_widget_show (checkboxControl);
+        g_signal_connect (G_OBJECT (checkboxControl), "event", G_CALLBACK (hyphy_event_component_callback), theParent);
+    }
+
+    gtk_fixed_move (GTK_FIXED(theParent->parentWindow), checkboxControl, checkboxRect.left,checkboxRect.top);
+    boxD = MIN(checkboxControl->allocation.x,checkboxControl->allocation.y);
+    long bh = MIN(checkboxRect.bottom-checkboxRect.top+1,boxD),
+         bw = MIN(checkboxRect.right-checkboxRect.left+1,boxD);
+
+    if (bh<boxD||bw<boxD) {
+        gtk_widget_set_size_request(checkboxControl, bw, bh);
+    }
+}
+
+//__________________________________________________________________
+
+void        _HYPlatformCheckbox::_Enable (bool e)
+{
+    if (checkboxControl) {
+        gtk_widget_set_sensitive(checkboxControl,e);
+    }
+}
+
+//__________________________________________________________________
+
+long        _HYPlatformCheckbox::_GetBoxDimension (void)
+{
+    if (checkboxControl) {
+        GtkRequisition sizeReq;
+        gtk_widget_size_request (checkboxControl, &sizeReq);
+        return MAX(sizeReq.width, sizeReq.height);
+    }
+    return HY_DEFAULT_CHECK_SPACE;
+}
+
+//__________________________________________________________________
+void        _HYPlatformCheckbox::_Update (Ptr p)
+{
+    _Paint (p);
+}
+
+//__________________________________________________________________
+void        _HYPlatformCheckbox::_Paint (Ptr p)
+{
+    _HYCheckbox *theParent = (_HYCheckbox*) this;
+    theParent->_HYPlatformLabel::_Paint(p);
+}
+
+//__________________________________________________________________
+void        _HYPlatformCheckbox::_PaintMe (void)
+{
+    _HYCheckbox * theParent = (_HYCheckbox*)this;
+    /*bool      drawBk = !(theParent->settings.width&HY_COMPONENT_TRANSP_BG);
+    if (theParent->labelGC && drawBk)
+    {
+
+        GdkColor saveColor = HYColorToGDKColor(theParent->GetForeColor()),
+                 newColor  = HYColorToGDKColor(theParent->GetBackColor());
+
+        gdk_gc_set_foreground(theParent->labelGC, &newColor);
+        gdk_draw_rectangle(theParent->parentWindow->window,theParent->labelGC,true,checkboxRect.left,checkboxRect.top,_GetBoxDimension(),_GetBoxDimension());
+        gdk_gc_set_foreground(theParent->labelGC, &saveColor);
+    }*/
+    GdkRectangle    cbr = HYRect2GDKRect(checkboxRect);
+    gtk_widget_draw (checkboxControl,&cbr);
+}
+
+//__________________________________________________________________
+_HYPlatformCheckbox::_HYPlatformCheckbox (bool isR)
+{
+    checkboxControl = nil;
+    dummyControl    = nil;
+    isRadio = isR;
+    checkboxRect = (_HYRect) {
+        0,0,100,100,0
+    };
+}
+
+//__________________________________________________________________
+_HYPlatformCheckbox::~_HYPlatformCheckbox (void)
+{
+}
+
+//__________________________________________________________________
+void    _HYPlatformCheckbox::_SetState (bool v)
+{
+    if (checkboxControl)
+        if (isRadio) {
+            gtk_toggle_button_set_active (v?GTK_TOGGLE_BUTTON(checkboxControl):GTK_TOGGLE_BUTTON(dummyControl),true);
+        } else {
+            gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(checkboxControl),v);
+        }
+}
+
+//EOF
\ No newline at end of file
diff --git a/src/gui/gtk/Components/HYPlatformLabel.cpp b/src/gui/gtk/Components/HYPlatformLabel.cpp
new file mode 100644
index 0000000..0ddf9d4
--- /dev/null
+++ b/src/gui/gtk/Components/HYPlatformLabel.cpp
@@ -0,0 +1,186 @@
+/*
+    Label component glue for GTK
+
+    Sergei L. Kosakovsky Pond, November 2, 2004
+*/
+
+#include "HYLabel.h"
+#include "HYUtils.h"
+#include "HYGraphicPane.h"
+#include "HYWindow.h"
+
+//__________________________________________________________________
+
+_HYPlatformLabel::_HYPlatformLabel(void)
+{
+    labelLayout          = pango_layout_new           (screenPContext);
+    labelFontDesc        = pango_font_description_new ();
+    if (((_HYLabel*)this)->parentWindow->window) {
+        labelGC              = gdk_gc_new                 (((_HYLabel*)this)->parentWindow->window);
+    } else {
+        labelGC              = nil;
+    }
+
+    pango_layout_set_width (labelLayout, -1);
+    pango_layout_set_alignment(labelLayout,PANGO_ALIGN_CENTER);
+}
+
+//__________________________________________________________________
+
+_HYPlatformLabel::~_HYPlatformLabel(void)
+{
+    g_object_unref              (labelLayout);
+    pango_font_description_free (labelFontDesc);
+    if (labelGC) {
+        g_object_unref (labelGC);
+    }
+}
+
+//__________________________________________________________________
+
+void        _HYPlatformLabel::_SetBackColor (_HYColor& c)
+{
+    if (labelGC) {
+        GdkColor    newBG = HYColorToGDKColor(c);
+        gdk_gc_set_background(labelGC,&newBG);
+    }
+}
+
+//__________________________________________________________________
+
+void        _HYPlatformLabel::_SetForeColor (_HYColor& c)
+{
+    if (labelGC) {
+        GdkColor    newFG = HYColorToGDKColor(c);
+        gdk_gc_set_foreground(labelGC,&newFG);
+    }
+}
+
+//__________________________________________________________________
+
+void        _HYPlatformLabel::_SetFont (_HYFont& f)
+{
+    HYFont2PangoFontDesc(f,labelFontDesc);
+    pango_layout_set_font_description (labelLayout, labelFontDesc ); // ref ?
+}
+
+//__________________________________________________________________
+void        _HYPlatformLabel::_Update (Ptr p)
+{
+    _Paint (p);
+}
+
+//__________________________________________________________________
+void        _HYPlatformLabel::_SetDimensions (_HYRect r, _HYRect rel)
+{
+    _HYLabel* theParent = (_HYLabel*) this;
+    theParent->_HYPlatformComponent::_SetDimensions (r,rel);
+    _SetVisibleSize (rel);
+}
+
+
+//__________________________________________________________________
+void        _HYPlatformLabel::_SetVisibleSize (_HYRect rel)
+{
+    _HYLabel* theParent = (_HYLabel*) this;
+    _HYRect s = theParent->_SuggestDimensions();
+
+    labelRect.x         =   rel.left;
+    labelRect.y         =   rel.top;
+    labelRect.width     =   s.right<rel.right-rel.left?s.right:rel.right-rel.left+1;
+    labelRect.height    =   s.bottom<rel.bottom-rel.top?s.bottom:rel.bottom-rel.top+1;
+
+    AlignRectangle (rel, labelRect, theParent->GetAlignFlags());
+
+    //printf ("Label layout %d %d %d %d\n", labelRect.x, labelRect.y, labelRect.width, labelRect.height);
+    //pango_layout_set_width(labelLayout,labelRect.width);
+}
+
+//__________________________________________________________________
+_HYRect _HYLabel::_SuggestDimensions (void)
+{
+    _HYRect res = {10,100,10,100,HY_COMPONENT_NO_SCROLL};
+    PangoRectangle extents;
+    pango_layout_get_pixel_extents (labelLayout,nil,&extents);
+    res.top = res.bottom = extents.height+4;
+    res.left = res.right = extents.width + 5;
+    return res;
+}
+
+//__________________________________________________________________
+void    _HYPlatformLabel::_SetText (void)
+{
+    _HYLabel *      theParent = (_HYLabel*)this;
+    pango_layout_set_text(labelLayout,theParent->GetText().sData,theParent->GetText().sLength);
+}
+
+
+//__________________________________________________________________
+void        _HYPlatformLabel::_Paint (Ptr p)
+{
+    _HYLabel *      theParent = (_HYLabel*)this;
+    if (!labelGC) {
+        _SetBackColor       (theParent->GetBackColor());
+        _SetForeColor       (theParent->GetForeColor());
+        labelGC              = gdk_gc_new                 (((_HYLabel*)this)->parentWindow->window);
+    }
+
+
+    GdkRectangle    cRect   = HYRect2GDKRect(*(_HYRect*)p);
+    GdkColor        forC    = HYColorToGDKColor(theParent->GetForeColor()),
+                    aColor;
+    cRect.x += theParent->parentWindow->allocation.x;
+    cRect.y += theParent->parentWindow->allocation.y;
+
+    if (!(theParent->settings.width&HY_COMPONENT_TRANSP_BG)) {
+        aColor = HYColorToGDKColor(theParent->GetBackColor());
+        gdk_gc_set_foreground(labelGC,&aColor);
+        gdk_draw_rectangle(theParent->parentWindow->window,labelGC,true,cRect.x, cRect.y, cRect.width, cRect.height);
+        gdk_gc_set_foreground(labelGC,&forC);
+    }
+
+    if (theParent->settings.width&HY_COMPONENT_WELL) {
+        cRect.x++;
+        cRect.y++;
+        cRect.width  -= 2;
+        cRect.height -= 2;
+    }
+
+    gdk_gc_set_clip_rectangle(labelGC,&cRect);
+
+    if (theParent->HasShadow()) {
+        _HYColor  tempColor = theParent->GetForeColor();
+
+        tempColor.R /= 4;
+        tempColor.G /= 4;
+        tempColor.B /= 4;
+
+        GdkColor  tc = HYColorToGDKColor(tempColor);
+
+        gdk_gc_set_foreground(labelGC,&tc);
+        gdk_draw_layout(theParent->parentWindow->window,labelGC,theParent->parentWindow->allocation.x+labelRect.x+1,
+                        theParent->parentWindow->allocation.y+labelRect.y-1,
+                        labelLayout);
+        tempColor = theParent->GetForeColor();
+        tempColor.R /= 2;
+        tempColor.G /= 2;
+        tempColor.B /= 2;
+
+        tc = HYColorToGDKColor(tempColor);
+        gdk_gc_set_foreground(labelGC,&tc);
+
+        gdk_draw_layout(theParent->parentWindow->window,labelGC,theParent->parentWindow->allocation.x+labelRect.x-1,
+                        theParent->parentWindow->allocation.y+labelRect.y+1,
+                        labelLayout);
+        gdk_gc_set_foreground(labelGC,&forC);
+    }
+
+    gdk_draw_layout(theParent->parentWindow->window,labelGC,theParent->parentWindow->allocation.x+labelRect.x,
+                    theParent->parentWindow->allocation.y+labelRect.y,
+                    labelLayout);
+    gdk_gc_set_clip_rectangle(labelGC,nil);
+
+    (*theParent)._HYPlatformComponent::_Paint(p);
+}
+
+// EOF
\ No newline at end of file
diff --git a/src/gui/gtk/Components/HYPlatformPullDown.cpp b/src/gui/gtk/Components/HYPlatformPullDown.cpp
new file mode 100644
index 0000000..7b9a1a7
--- /dev/null
+++ b/src/gui/gtk/Components/HYPlatformPullDown.cpp
@@ -0,0 +1,424 @@
+/*
+    Pulldown component glue for GTK+.
+
+    Sergei L. Kosakovsky Pond, November 2004.
+*/
+
+#include "errorfns.h"
+#include "HYPullDown.h"
+#include "HYUtils.h"
+#include "HYEventTypes.h"
+#include "HYWindow.h"
+#include "HYGraphicPane.h"
+
+
+_HYColor                    _hyGTKMenuBackground    = {255,255,255};
+_HYFont                     defaultPullDownFont     =  {_HY_SANS_FONT,10,HY_FONT_PLAIN};
+PangoFontDescription        *defaultPullDownFontPD   = NULL;
+
+
+//__________________________________________________________________
+
+void        hy_pulldown_selection_callback      (GtkEditable *button, gpointer user_data)
+{
+    /*_HYPullDown * thePD = (_HYPullDown*)user_data;
+    char * val = gtk_editable_get_chars (GTK_EDITABLE(button),0,-1);
+    _String  valS = (val);
+    long aSel  = thePD->FindMenuItem(valS);
+    g_free (val);
+    if (aSel>=0 && thePD->selection!=aSel)
+    {
+        thePD->selection = aSel;
+        if (thePD->messageRecipient)
+            thePD->messageRecipient->ProcessEvent (generateMenuSelChangeEvent (thePD->GetID(),thePD->selection));
+    }*/
+}
+
+//__________________________________________________________________
+
+gboolean hy_pulldown_selection_start_callback_event (GtkWidget *widget, GdkEvent* theEvent, gpointer   data )
+{
+    if (theEvent->type == GDK_BUTTON_PRESS && ((GdkEventButton*)theEvent)->button == 1) {
+        _HYPullDown * thePD = (_HYPullDown*)data;
+        if (thePD->messageRecipient) {
+            thePD->messageRecipient->ProcessEvent (generateMenuOpenEvent(thePD->GetID()));
+        }
+    }
+    return false;
+}
+
+//__________________________________________________________________
+
+gboolean hy_pulldown_unmap_event (GtkWidget *widget,gpointer   user_data )
+{
+    /*if (theEvent->type == GDK_BUTTON_PRESS && ((GdkEventButton*)theEvent)->button == 1)
+    {
+        _HYPullDown * thePD = (_HYPullDown*)data;
+        if (thePD->messageRecipient)
+            thePD->messageRecipient->ProcessEvent (generateMenuOpenEvent(thePD->GetID()));
+    }*/
+    _HYPullDown * thePD = (_HYPullDown*)user_data;
+    char * val = gtk_editable_get_chars (GTK_EDITABLE(GTK_COMBO(thePD->theMenu)->entry),0,-1);
+    _String  valS = (val);
+    long aSel  = thePD->FindMenuItem(valS);
+    g_free (val);
+    if (aSel>=0 /*&& thePD->selection!=aSel*/) {
+        thePD->selection = aSel;
+        if (thePD->messageRecipient) {
+            thePD->messageRecipient->ProcessEvent (generateMenuSelChangeEvent (thePD->GetID(),thePD->selection));
+        }
+    }
+    return false;
+}
+
+//__________________________________________________________________
+
+_HYPlatformPullDown::_HYPlatformPullDown(void)
+{
+    _HYPullDown * parent = (_HYPullDown*)this;
+    theMenu              = gtk_combo_new ();
+    backFill             = HYColorToGDKColor((_HYColor) {
+        255,255,255
+    });
+    gtk_combo_set_value_in_list (GTK_COMBO(theMenu),true,false);
+    gtk_container_add(GTK_CONTAINER(parent->parentWindow),theMenu);
+    gtk_entry_set_editable(GTK_ENTRY(GTK_COMBO(theMenu)->entry),false);
+    GList* children = gtk_container_get_children(GTK_CONTAINER(theMenu));
+    g_signal_connect (GTK_WIDGET(children->next->data),"event",(GCallback)hy_pulldown_selection_start_callback_event,(_HYPullDown*)this);
+    g_signal_connect (GTK_COMBO(theMenu)->entry,"changed",(GCallback)hy_pulldown_selection_callback,(_HYPullDown*)this);
+    g_signal_connect (GTK_COMBO(theMenu)->popwin,"hide",(GCallback)hy_pulldown_unmap_event,(_HYPullDown*)this);
+    g_list_free (children);
+    //gtk_container_set_resize_mode(GTK_CONTAINER(theMenu), GTK_RESIZE_IMMEDIATE);
+    selection      = 0;
+    cbSelection    = -1;
+    if (!defaultPullDownFontPD) {
+        defaultPullDownFontPD = pango_font_description_new();
+        defaultPullDownFont.size = defaultPullDownFont.size*fontConversionFactor;
+        HYFont2PangoFontDesc (defaultPullDownFont,defaultPullDownFontPD);
+    }
+    gtk_widget_modify_font (theMenu, defaultPullDownFontPD);
+    gtk_widget_modify_font (GTK_COMBO(theMenu)->entry, defaultPullDownFontPD);
+    gtk_widget_show (theMenu);
+    //g_signal_connect (GTK_COMBO(theMenu)->entry,"changed",hy_pulldown_selection_callback,(_HYPullDown*)this);
+
+}
+
+//__________________________________________________________________
+
+_HYPlatformPullDown::~_HYPlatformPullDown(void)
+{
+}
+
+//__________________________________________________________________
+void        _HYPlatformPullDown::_RefreshComboBox  ()
+{
+    _HYPullDown * theParent = (_HYPullDown*)this;
+
+    if (theMenu && ( cbSelection!=selection || !theParent->IsEnabled())) {
+        long mic = theParent->MenuItemCount();
+        if (mic) {
+            if (selection >= mic) {
+                selection = mic-1;
+            }
+
+            _String * mItem = theParent->GetMenuItem (selection);
+
+            if (mItem->Equal(&menuSeparator)) {
+                mItem = ∅
+            }
+
+            gtk_entry_set_text (GTK_ENTRY(GTK_COMBO(theMenu)->entry), mItem->sData);
+            cbSelection = selection;
+        }
+    }
+}
+
+//__________________________________________________________________
+void        _HYPlatformPullDown::_AddMenuItem   (_String& newItem, long index)
+{
+    if (theMenu) {
+        GList * singleItem   = g_list_alloc();
+        singleItem->prev = singleItem->next = nil;
+        if (newItem.Equal(&menuSeparator)) {
+            GtkWidget * itemContents = gtk_separator_menu_item_new ();
+            gtk_widget_show (itemContents);
+            singleItem->data = gtk_list_item_new();
+            gtk_container_add((GtkContainer*)singleItem->data,itemContents);
+            gtk_combo_set_item_string (GTK_COMBO (theMenu), GTK_ITEM (singleItem->data), "");
+            gtk_widget_set_sensitive((GtkWidget*)singleItem->data,false);
+            widgetList.InsertElement ((BaseRef)itemContents,2*index,false,false);
+        } else {
+            _String inItem = newItem;
+            if (newItem.beginswith ("(")) {
+                inItem.Trim (1,-1);
+            }
+
+            GtkWidget * itemContents = gtk_menu_item_new_with_label (inItem.sData);
+            gtk_widget_show (itemContents);
+            singleItem->data = gtk_list_item_new();
+            gtk_container_add((GtkContainer*)singleItem->data,itemContents);
+            gtk_combo_set_item_string (GTK_COMBO (theMenu), GTK_ITEM (singleItem->data), inItem.sData);
+            gtk_widget_set_sensitive((GtkWidget*)singleItem->data,inItem.sLength == newItem.sLength);
+            widgetList.InsertElement ((BaseRef)itemContents,2*index,false,false);
+        }
+        widgetList.InsertElement ((BaseRef)singleItem->data,2*index,false,false);
+        GdkColor convColor = HYColorToGDKColor(_hyGTKMenuBackground);
+        gtk_widget_modify_bg ((GtkWidget*)singleItem->data, GTK_STATE_INSENSITIVE, 
+        	&convColor);
+        gtk_widget_show ((GtkWidget*)singleItem->data);
+        if (index<0) {
+            gtk_list_append_items (GTK_LIST (GTK_COMBO (theMenu)->list), singleItem);
+        } else {
+            gtk_list_insert_items (GTK_LIST (GTK_COMBO (theMenu)->list), singleItem, index);
+        }
+
+        /*printf ("\nAdding menu item %s at %d\n", newItem.sData, index);
+        for (long k = 0; k<widgetList.lLength; k++)
+            printf ("%d %s\n", k, GTK_OBJECT_TYPE_NAME (GTK_WIDGET (widgetList(k))));*/
+    }
+
+    if (((_HYPullDown*)this)->MenuItemCount()==1||selection==index) {
+        cbSelection = -1;
+        _RefreshComboBox();
+    }
+}
+
+
+//__________________________________________________________________
+void        _HYPlatformPullDown::_SetMenuItem   (_String& newItem, long index)
+{
+    _DeleteMenuItem (index);
+    _AddMenuItem (newItem,index);
+    if (index==selection) {
+        cbSelection = -1;
+        _RefreshComboBox();
+    }
+}
+
+
+//__________________________________________________________________
+void        _HYPlatformPullDown::_MarkItem      (long index, char mark)
+{
+    if (theMenu && index*2 < widgetList.lLength) {
+        GtkWidget * theImage = nil;
+        switch (mark) {
+        case HY_PULLDOWN_CHECK_MARK:
+            theImage = gtk_image_new_from_stock (GTK_STOCK_APPLY,GTK_ICON_SIZE_MENU);
+            break;
+
+        case HY_PULLDOWN_BULLET_MARK:
+            theImage = gtk_image_new_from_stock (GTK_STOCK_YES,GTK_ICON_SIZE_MENU);
+            break;
+
+        case HY_PULLDOWN_DIAMOND_MARK:
+            theImage = gtk_image_new_from_stock (GTK_STOCK_ADD,GTK_ICON_SIZE_MENU);
+            break;
+        }
+
+        GtkWidget * menuLabel = gtk_bin_get_child (GTK_BIN(widgetList(2*index+1)));
+        if (theImage) {
+            gtk_widget_show (theImage);
+        }
+
+        if (GTK_IS_LABEL(menuLabel)) {
+            if (theImage) {
+                GtkContainer * cW = GTK_CONTAINER (widgetList(2*index+1));
+                GtkWidget * hBox = gtk_hbox_new (FALSE,5);
+                gtk_widget_show (hBox);
+                g_object_ref(menuLabel);
+                gtk_container_remove (cW, menuLabel);
+                gtk_box_pack_start(GTK_BOX(hBox), theImage, FALSE, FALSE, 0);
+                gtk_box_pack_start(GTK_BOX(hBox), menuLabel, FALSE, FALSE, 0);
+                g_object_unref(menuLabel);
+                gtk_container_add (cW, hBox);
+            }
+        } else {
+            GList     * children      = gtk_container_get_children (GTK_CONTAINER(menuLabel));
+            GtkWidget * restoreWidget = GTK_WIDGET(children->next->data);
+            g_object_ref (restoreWidget);
+            if (theImage) {
+                GtkWidget * replaceWidget = GTK_WIDGET(children->data);
+                gtk_container_remove(GTK_CONTAINER(menuLabel),replaceWidget);
+                gtk_container_remove(GTK_CONTAINER(menuLabel),restoreWidget);
+                gtk_box_pack_start(GTK_BOX(menuLabel), theImage, FALSE, FALSE, 0);
+                gtk_box_pack_start(GTK_BOX(menuLabel), restoreWidget, FALSE, FALSE, 0);
+            } else {
+                GtkWidget * parentWidget =  menuLabel->parent;
+                gtk_container_remove(GTK_CONTAINER(parentWidget),menuLabel);
+                gtk_container_add (GTK_CONTAINER(parentWidget), restoreWidget);
+            }
+            gtk_widget_show (restoreWidget);
+            g_object_unref (restoreWidget);
+            g_list_free (children);
+        }
+    }
+}
+
+
+//__________________________________________________________________
+char        _HYPlatformPullDown::_ItemMark      (long index)
+{
+    // TBI
+}
+
+//__________________________________________________________________
+void        _HYPlatformPullDown::_DeleteMenuItem  (long index)
+{
+    if (theMenu) {
+        /*printf ("\nDeleting menu item at %d\n", index);
+        for (long k = 0; k<widgetList.lLength; k+=2)
+            printf ("%d %s\n", k, GTK_OBJECT_TYPE_NAME (GTK_WIDGET (widgetList(k))));*/
+        widgetList.Delete (2*index);
+        widgetList.Delete (2*index);
+        gtk_list_clear_items(GTK_LIST (GTK_COMBO (theMenu)->list),index,index+1);
+        if (selection == index) {
+            cbSelection = -1;
+            //if (selection)
+            //  selection--;
+            _RefreshComboBox ();
+        }
+    }
+}
+
+//__________________________________________________________________
+
+void        _HYPlatformPullDown::_SetBackColor (_HYColor& c)
+{
+    backFill = HYColorToGDKColor(c);
+}
+
+//__________________________________________________________________
+long        _HYPlatformPullDown::_GetSelection (void)
+{
+    return selection;
+}
+
+
+//__________________________________________________________________
+void        _HYPlatformPullDown::_Duplicate (Ptr p)
+{
+    _HYPullDown * theSource = (_HYPullDown*) p;
+    theMenu                 = theSource->theMenu;
+    selection               = theSource->selection;
+    backFill                = theSource->backFill;
+    theSource->theMenu      = nil;
+}
+
+//__________________________________________________________________
+void        _HYPlatformPullDown::_Update (Ptr p)
+{
+    _Paint (p);
+}
+
+//__________________________________________________________________
+void        _HYPlatformPullDown::_SetDimensions (_HYRect r, _HYRect rel)
+{
+    _HYPullDown* theParent = (_HYPullDown*) this;
+    theParent->_HYPlatformComponent::_SetDimensions (r,rel);
+    _SetVisibleSize (rel);
+}
+
+//__________________________________________________________________
+void        _HYPlatformPullDown::_SetVisibleSize (_HYRect rel)
+{
+    _HYPullDown* theParent = (_HYPullDown*) this;
+
+    menuRect = HYRect2GDKRect(rel);
+    menuRect.x     += 3;
+    menuRect.width -= 6;
+
+    if (theMenu) {
+        if (menuRect.height>20) {
+            menuRect.height = 20;
+        }
+
+        long            naturalWidth = theParent->_SuggestDimensions ().right;
+
+        if (menuRect.width > naturalWidth + 25) {
+            menuRect.width = naturalWidth + 25;
+        }
+    }
+
+    AlignRectangle (rel, menuRect, theParent->GetAlignFlags());
+    gtk_fixed_move (GTK_FIXED(theParent->parentWindow), theMenu, rel.left, rel.top);
+    gtk_widget_set_size_request(theMenu,menuRect.width,menuRect.height);
+}
+
+
+//__________________________________________________________________
+void        _HYPlatformPullDown::_EnableItem (long theItem, bool toggle)
+{
+    gtk_widget_set_sensitive(GTK_WIDGET(widgetList(2*theItem)), toggle);
+}
+
+
+//__________________________________________________________________
+void        _HYPlatformPullDown::_Paint (Ptr p)
+{
+    _HYPullDown * theParent = (_HYPullDown*)this;
+
+    GdkRectangle        cRect = HYRect2GDKRect(*(_HYRect*)p);
+    _RefreshComboBox();
+    if (!(theParent->settings.width&HY_COMPONENT_TRANSP_BG)) {
+        if (theParent->parentWindow->window) {
+            GdkGC *buttonGC              = gdk_gc_new (theParent->parentWindow->window);
+            gdk_gc_set_foreground(buttonGC,&backFill);
+            gdk_draw_rectangle(theParent->parentWindow->window,buttonGC,true,cRect.x+theParent->parentWindow->allocation.x,
+                               cRect.y+theParent->parentWindow->allocation.y, cRect.width, cRect.height);
+            g_object_unref (buttonGC);
+        }
+    }
+
+
+    (*theParent)._HYPlatformComponent::_Paint(p);
+}
+
+//__________________________________________________________________
+_HYRect _HYPullDown::_SuggestDimensions (void)
+{
+    _HYRect res = {25,100,25,100,HY_COMPONENT_NO_SCROLL};
+
+    if (theMenu) {
+        long            naturalWidth = 0;
+        PangoLayout *   fontMeasurer = nil;
+        for (long k=0; k<widgetList.lLength; k+=2) {
+            GtkWidget * dropWidget = GTK_WIDGET (widgetList(k));
+            if (!fontMeasurer) {
+                fontMeasurer = pango_layout_new (gtk_widget_get_pango_context (dropWidget));
+            }
+
+            pango_layout_set_text(fontMeasurer,GetMenuItem(k/2)->sData ,GetMenuItem(k/2)->sLength);
+            PangoRectangle extents,
+                           log_ext;
+            pango_layout_get_pixel_extents (fontMeasurer,&extents,nil);
+            if (extents.width > naturalWidth) {
+                naturalWidth = extents.width;
+            }
+        }
+        if (fontMeasurer) {
+            g_object_unref (fontMeasurer);
+        }
+
+        res.right = res.left = naturalWidth+25;
+    }
+
+    return res;
+}
+
+//__________________________________________________________________
+
+void    _HYPullDown::_SetMenuItemTextStyle (long ID, char style)
+{
+    // TBI
+}
+
+//__________________________________________________________________
+
+bool _HYPullDown::_ProcessOSEvent (Ptr vEvent)
+{
+    // TBI
+    return _HYPlatformComponent::_ProcessOSEvent (vEvent);
+}
+
+
+//EOF
\ No newline at end of file
diff --git a/src/gui/gtk/Components/HYPlatformSequencePane.cpp b/src/gui/gtk/Components/HYPlatformSequencePane.cpp
new file mode 100644
index 0000000..7a5432a
--- /dev/null
+++ b/src/gui/gtk/Components/HYPlatformSequencePane.cpp
@@ -0,0 +1,307 @@
+/*
+    Sequence Panel for Win32 API
+
+    Sergei L. Kosakovsky Pond, May 2000-January 2003
+*/
+
+#include "errorfns.h"
+#include "HYSequencePanel.h"
+#include "HYUtils.h"
+#include "HYEventTypes.h"
+#include "HYPlatformWindow.h"
+#include "HYTableWindow.h"
+#include <gdk/gdkx.h>
+
+
+//__________________________________________________________________
+
+void    _HYSequencePane::_Paint (Ptr p)
+{
+    _HYRect*    destR = (_HYRect*)p;
+
+    _HYRect     srcRect,
+                destRect = *destR;
+
+    //printf ("Sequence Paint Called %d %d %d %d\n", destR->left, destR->top, destR->right, destR->bottom);
+
+    if (HasHScroll()) {
+        destRect.bottom-= HY_SCROLLER_WIDTH;
+    }
+
+    if (HasVScroll()) {
+        destRect.right -= HY_SCROLLER_WIDTH;
+    }
+
+    //destRect.left         = destR->left;
+    //destRect.top      = destR->top;
+    _HYRect srcR        = _VisibleContents (p);
+
+    gdk_draw_drawable (GDK_DRAWABLE(parentWindow->window), theContext, thePane, 0, 0,
+                       parentWindow->allocation.x+destRect.left, parentWindow->allocation.y+destRect.top, destRect.Width(), destRect.Height());
+
+    long        saveBorder = settings.width & HY_COMPONENT_BORDER;
+    settings.width -= saveBorder;
+    _HYPlatformComponent::_Paint(p);
+    settings.width += saveBorder;
+}
+
+//__________________________________________________________________
+
+bool _HYSequencePane::_ProcessOSEvent (Ptr vEvent)
+{
+    static          bool    amScrolling = false,
+                            vertical;
+
+    static          long   localPt_x,
+                    localPt_y,
+                    originalStart,
+                    originalSpan,
+                    lastClick,
+                    firstClick;
+
+
+    if (_HYPlatformComponent::_ProcessOSEvent (vEvent)) {
+        return true;
+    }
+
+    _HY_GTK_UI_Message *theMessage = (_HY_GTK_UI_Message*)vEvent;
+    if (active) {
+        gdouble   xc,
+                  yc;
+
+        if (gdk_event_get_coords (theMessage->theEvent,&xc,&yc)) {
+            switch (theMessage->theEvent->type) {
+            case GDK_BUTTON_PRESS:
+            case GDK_2BUTTON_PRESS: {
+                GdkEventButton * bevent = (GdkEventButton*)theMessage->theEvent;
+
+                long  globalPt_x = xc,
+                      globalPt_y = yc;
+
+                localPt_x = globalPt_x-rel.left-parentWindow->allocation.x;
+                localPt_y = globalPt_y-rel.top-parentWindow->allocation.y;
+
+                vertical = (localPt_x<headerWidth)&&(localPt_y>=(GetSlotHeight()+1));
+
+                if (((GdkEventButton*)bevent)->button == 1) {
+                    if (vertical) {
+                        ProcessVSelectionChange (localPt_x,localPt_y,bevent->state & GDK_SHIFT_MASK,bevent->state & GDK_CONTROL_MASK, false, bevent->type == GDK_2BUTTON_PRESS);
+                    } else {
+                        ProcessSelectionChange  (localPt_x,localPt_y,bevent->state & GDK_SHIFT_MASK,bevent->state & GDK_CONTROL_MASK);
+                    }
+                } else {
+                    if ((((GdkEventButton*)bevent)->button == 2 || ((GdkEventButton*)bevent)->button == 3 )&& (vertical&&vselection.lLength || !vertical &&selection.lLength)) {
+                        ProcessContextualPopUp (globalPt_x, globalPt_y);
+                        return true;
+                    }
+                }
+            }
+            break;
+            case GDK_BUTTON_RELEASE:
+            case GDK_LEAVE_NOTIFY: {
+                if (amScrolling) {
+                    if (messageRecipient) {
+                        ((_HYTWindow*)messageRecipient)->trackMouseComponent = (Ptr)nil;
+                    }
+
+                    /*gdk_pointer_ungrab (((GdkEventButton*)theMessage->theEvent)->time);*/
+
+                    if  (vertical) {
+                        _HYRect invalRectH = {parentWindow->allocation.x+rel.left,
+                                              parentWindow->allocation.y+rel.top+(GetSlotHeight()+1)+1,rel.left+headerWidth,rel.bottom-HY_SCROLLER_WIDTH
+                                             };
+                        GdkRectangle irect = HYRect2GDKRect(invalRectH);
+                        irect.x+=parentWindow->allocation.x;
+                        irect.y+=parentWindow->allocation.y;
+                        gdk_window_invalidate_rect (parentWindow->window, &irect, false);
+                        if ( localPt_x<headerWidth && localPt_x>0 && lastClick>-2) {
+                            MoveSpecies (firstClick+originalStart,lastClick+startRow);
+                        }
+                    }
+                    amScrolling = false;
+                }
+                break;
+            }
+
+            case GDK_MOTION_NOTIFY: {
+                GdkEventMotion * motEvent = (GdkEventMotion*)theMessage->theEvent;
+                if (motEvent->state & GDK_BUTTON1_MASK) {
+                    if (amScrolling) {
+                        gint mousePt_x = motEvent->x - rel.left - parentWindow->allocation.x,
+                             mousePt_y = motEvent->y - rel.top  - parentWindow->allocation.y;
+
+                        if (vertical) { // vertical scrolling
+                            long  wHeight = rel.bottom-rel.top-HY_SCROLLER_WIDTH,
+                                  slotHeight = GetSlotHeight();
+
+                            if ( mousePt_y <  GetSlotHeight()+1 || localPt_y != mousePt_y || mousePt_y>wHeight ) {
+                                localPt_x = mousePt_x;
+                                localPt_y = mousePt_y;
+
+                                if (mousePt_y>wHeight) {
+                                    // scroll down
+                                    if ((endRow<=speciesIndex.lLength)&&(vselection.lData[0]!=speciesIndex.lLength-1)) {
+                                        if (endRow-startRow<originalSpan) {
+                                            break;
+                                        }
+                                        startRow++;
+                                        endRow++;
+                                        _SetVScrollerPos(((double)MAX_CONTROL_VALUE*startRow)/
+                                                         (speciesIndex.lLength-endRow+startRow+1));
+                                        BuildPane();
+                                        forceUpdateForScrolling = true;
+                                        _MarkForUpdate();
+                                        forceUpdateForScrolling = false;
+                                        lastClick = -2;
+                                    }
+                                    break;
+                                } else {
+                                    mousePt_y-=(GetSlotHeight()+1);
+                                    if (mousePt_y<=slotHeight) {
+                                        if (mousePt_y>=0) {
+                                            if (mousePt_y<slotHeight/2) {
+                                                mousePt_y = -1;
+                                            } else {
+                                                mousePt_y = 0;
+                                            }
+                                        } else {
+                                            // scroll up
+                                            if (startRow>0) {
+                                                startRow--;
+                                                endRow--;
+                                                _SetVScrollerPos(((double)MAX_CONTROL_VALUE*startRow)/(speciesIndex.lLength-endRow+startRow+1));
+                                                BuildPane();
+                                                forceUpdateForScrolling = true;
+                                                _MarkForUpdate();
+                                                forceUpdateForScrolling = false;
+                                                lastClick = -2;
+                                            }
+                                            break;
+                                        }
+                                    } else {
+                                        mousePt_y=(mousePt_y-(GetSlotHeight()+1))/slotHeight;
+                                    }
+                                }
+
+                                if ( mousePt_y<-1 || mousePt_y>= endRow-startRow ) {
+                                    break;
+                                }
+
+                                if (mousePt_y!=lastClick) {
+                                    GdkDrawable * tempDr = GDK_DRAWABLE(parentWindow->window);
+                                    GdkGC * tempGC = gdk_gc_new (tempDr);
+
+                                    GdkColor black = HYColorToGDKColor((_HYColor) {
+                                        0,0,0
+                                    });
+                                    gdk_gc_set_foreground (theContext, &black);
+
+                                    gdk_gc_set_function (tempGC, GDK_INVERT);
+                                    gdk_gc_set_line_attributes (tempGC, 2, GDK_LINE_SOLID, GDK_CAP_BUTT, GDK_JOIN_MITER);
+                                    if (lastClick>=-1) {
+                                        lastClick = (GetSlotHeight()+1)+slotHeight*(lastClick+1)+rel.top+1;
+                                        gdk_draw_line  (tempDr,tempGC,parentWindow->allocation.x+rel.left+1,parentWindow->allocation.y+lastClick,
+                                                        parentWindow->allocation.x+rel.left+headerWidth-1,parentWindow->allocation.y+lastClick);
+
+                                    }
+
+                                    lastClick = mousePt_y;
+
+                                    if (lastClick+startRow != firstClick+originalStart) {
+                                        mousePt_y = (GetSlotHeight()+1)+slotHeight*(lastClick+1)+rel.top+1;
+                                        gdk_draw_line  (tempDr,tempGC,parentWindow->allocation.x+rel.left+1,parentWindow->allocation.y+mousePt_y,
+                                                        parentWindow->allocation.x+rel.left+headerWidth-1,parentWindow->allocation.y+mousePt_y);
+                                    }
+                                    g_object_unref (tempGC);
+                                }
+                            }
+                            return true;
+                        } else { // horizontal scrolling
+                            long    rightWindowBound = _HYCanvas::GetMaxW()-HY_SCROLLER_WIDTH;
+                            guint32 serverTime = gdk_x11_get_server_time (parentWindow->window);
+                            if ( mousePt_x<headerWidth && startColumn>0 || localPt_x!=mousePt_x || mousePt_x> rightWindowBound) {
+                                forceUpdateForScrolling = true;
+                                if (mousePt_x<headerWidth && startColumn>0) {
+                                    gint      wx, wy;
+                                    gdk_window_get_origin (parentWindow->window,&wx,&wy);
+                                    wx += parentWindow->allocation.x+rel.left;
+                                    wy += parentWindow->allocation.y+rel.top;
+                                    do {
+                                        guint32 serverTime2 = gdk_x11_get_server_time (parentWindow->window);
+                                        if (serverTime2-serverTime < 100) {
+                                            ProcessSelectionChange (mousePt_x,mousePt_y,true,true,true);
+                                        }
+                                        GdkModifierType keyDown;
+                                        gdk_display_get_pointer (gdk_display_get_default(),NULL,&mousePt_x,&mousePt_y,&keyDown);
+                                        mousePt_x -= wx;
+                                        mousePt_y -= wy;
+                                        serverTime = serverTime2;
+                                        if ((keyDown & GDK_BUTTON1_MASK)==0) {
+                                            break;
+                                        }
+
+                                        gtk_main_iteration_do(true);
+                                    } while (mousePt_x<headerWidth && startColumn>0);
+                                } else {
+                                    if (mousePt_x> rightWindowBound) {
+                                        gint      wx, wy;
+                                        gdk_window_get_origin (parentWindow->window,&wx,&wy);
+                                        wx += parentWindow->allocation.x;
+                                        wy += parentWindow->allocation.y;
+                                        do {
+                                            guint32 serverTime2 = gdk_x11_get_server_time (parentWindow->window);
+                                            if (serverTime2-serverTime < 100) {
+                                                ProcessSelectionChange (mousePt_x+HY_SCROLLER_WIDTH,mousePt_y,true,true,true);
+                                            }
+                                            GdkModifierType keyDown;
+                                            gdk_display_get_pointer (gdk_display_get_default(),NULL,&mousePt_x,&mousePt_y,&keyDown);
+                                            mousePt_x -= wx;
+                                            mousePt_y -= wy;
+                                            serverTime = serverTime2;
+                                            if ((keyDown & GDK_BUTTON1_MASK)==0) {
+                                                break;
+                                            }
+
+                                            gtk_main_iteration_do(true);
+                                        } while (mousePt_x> rightWindowBound && endColumn < columnStrings.lLength);
+                                    } else if (serverTime-gdk_event_get_time(theMessage->theEvent) < 100) {
+                                        ProcessSelectionChange (mousePt_x,mousePt_y,true,true,true);
+                                    }
+                                }
+
+                                forceUpdateForScrolling = false;
+                                localPt_x = mousePt_x;
+                                localPt_y = mousePt_y;
+                            }
+                            return true;
+                        }
+                    } else {
+
+                        /*gdk_pointer_grab (parentWindow->window,false,
+                                  GDK_POINTER_MOTION_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK,
+                                  NULL, NULL, (((GdkEventMotion*)theMessage->theEvent))->time);*/
+
+                        if (messageRecipient) {
+                            ((_HYTWindow*)messageRecipient)->trackMouseComponent = (Ptr)((_HYComponent*)this);
+                        }
+
+                        amScrolling = true;
+                        originalStart = startRow,
+                        originalSpan  = endRow-startRow;
+                        lastClick = -2;
+                        firstClick = (localPt_y-(GetSlotHeight()+1))/GetSlotHeight();
+                        return true;
+                    }
+                }
+                break;
+            }
+            }
+        }
+    }
+
+
+    return false;
+}
+
+
+//EOF
\ No newline at end of file
diff --git a/src/gui/gtk/Components/HYPlatformTable.cpp b/src/gui/gtk/Components/HYPlatformTable.cpp
new file mode 100644
index 0000000..d20e5ec
--- /dev/null
+++ b/src/gui/gtk/Components/HYPlatformTable.cpp
@@ -0,0 +1,1605 @@
+/*
+    Table component for GTK API
+
+    Sergei L. Kosakovsky Pond, March 2005
+*/
+
+#include "errorfns.h"
+#include "HYTableComponent.h"
+#include "HYUtils.h"
+#include "HYEventTypes.h"
+#include "HYWindow.h"
+#include "HYGraphicPane.h"
+#include "HYTextBox.h"
+#include "HYTableWindow.h"
+#include "HYDialogs.h"
+
+#include <gdk-pixbuf/gdk-pixbuf.h>
+#include <gdk/gdkkeysyms.h>
+
+//__________________________________________________________________
+
+extern  GdkCursor               *hSizeCursor,
+        *pickUpCursor,
+        *dropOffCursor;
+
+GdkColor    menuLine1           = HYColorToGDKColor ((_HYColor)
+{
+    0xA0,0xA0,0xA0
+}),
+                                  menuLine2         = HYColorToGDKColor ((_HYColor)
+{
+    0x04,0x04,0x04
+});
+
+GdkColor  _BLACKBRUSH_          = HYColorToGDKColor ((_HYColor)
+{
+    0,0,0
+});
+
+extern     GdkPixbuf*           tablePDMenuIcon;
+
+#define    HY_TABLE_PREEDIT_CURSOR  0x08
+
+//__________________________________________________________________
+
+gboolean   hy_table_key_interceptor (GtkWidget *te, GdkEventKey *kp, gpointer tbxp)
+{
+    _HYTable * theParent = (_HYTable*)tbxp;
+
+    if (kp->keyval==GDK_KP_Enter || kp->keyval==GDK_Return) {
+        theParent->EditBoxHandler (-1,theParent->rel);
+        return true;
+    }
+
+    return FALSE;
+}
+
+
+//__________________________________________________________________
+
+_HYPlatformTable::_HYPlatformTable(void)
+{
+    backPattern  = _BLACKBRUSH_;
+    backPattern2 = _BLACKBRUSH_;
+    cursorState  = false;
+    editBox      = nil;
+    tableFont    = nil;
+    tableFontB   = nil;
+    tableFontI   = nil;
+    tableFontBI  = nil;
+    activeColumn = -1;
+    activeColumn2= -1;
+    theContext   = nil;
+}
+
+//__________________________________________________________________
+
+_HYPlatformTable::~_HYPlatformTable(void)
+{
+    if (tableFont) {
+        pango_font_description_free (tableFont);
+    }
+    if (tableFontB) {
+        pango_font_description_free (tableFontB);
+    }
+    if (tableFontI) {
+        pango_font_description_free (tableFontI);
+    }
+    if (tableFontBI) {
+        pango_font_description_free (tableFontBI);
+    }
+    if (theContext) {
+        g_object_unref (theContext);
+    }
+}
+
+//__________________________________________________________________
+
+void        _HYPlatformTable::_SetFont (void)
+{
+    _HYTable* parent = (_HYTable*)this;
+
+    if (tableFont) {
+        pango_font_description_free (tableFont);
+    }
+    if (tableFontB) {
+        pango_font_description_free (tableFontB);
+    }
+    if (tableFontI) {
+        pango_font_description_free (tableFontI);
+    }
+    if (tableFontBI) {
+        pango_font_description_free (tableFontBI);
+    }
+
+    _HYFont       tf = parent->textFont;
+    tf.style = HY_FONT_PLAIN;
+    tableFont   = pango_font_description_new();
+    HYFont2PangoFontDesc(tf,tableFont);
+    tf.style = HY_FONT_BOLD;
+    tableFontB  = pango_font_description_new();
+    HYFont2PangoFontDesc(tf,tableFontB);
+    tf.style = HY_FONT_ITALIC;
+    tableFontI  = pango_font_description_new();
+    HYFont2PangoFontDesc(tf,tableFontI);
+    tf.style = HY_FONT_ITALIC | HY_FONT_BOLD;
+    tableFontBI = pango_font_description_new();
+    HYFont2PangoFontDesc(tf,tableFontBI);
+}
+
+//__________________________________________________________________
+
+bool        _HYPlatformTable::_CheckGC (void)
+{
+    if (!theContext) {
+        _HYTable* theParent = (_HYTable*) this;
+
+        if (theParent->parentWindow->window) {
+            theContext           = gdk_gc_new (theParent->parentWindow->window);
+        }
+
+        return theContext != nil;
+
+    }
+    return true;
+}
+
+//__________________________________________________________________
+void        _HYTable::_HScrollTable (long h)
+{
+    if (h && _CheckGC()) {
+        _HYTable*       theParent = (_HYTable*) this;
+        long            vsShift = ((settings.width&HY_COMPONENT_H_SCROLL)?HY_SCROLLER_WIDTH:0),
+                        hsShift = ((settings.width&HY_COMPONENT_V_SCROLL)?HY_SCROLLER_WIDTH:0);
+
+        EditBoxHandler  (-1,rel);
+
+        _HYRect         paintRect = rel;
+
+        //if (abs(h) > (rel.right-rel.left)/2)
+        _Paint((Ptr)&paintRect);
+        /*else
+        {
+            _HYRect       scrollRect;
+            scrollRect.top      = rel.top;
+            scrollRect.bottom   = rel.bottom-vsShift;
+            scrollRect.right    = rel.right-hsShift;
+            scrollRect.left     = rel.left;
+            paintRect.top       = scrollRect.top;
+            paintRect.bottom    = rel.bottom;
+
+            GdkRectangle clip_rect  = HYRect2GDKRect (scrollRect);
+            clip_rect.x += theParent->parentWindow->allocation.x;
+            clip_rect.y += theParent->parentWindow->allocation.y;
+
+            gdk_gc_set_clip_rectangle  (theContext, &clip_rect);
+            GdkPixbuf* theImage = gdk_pixbuf_get_from_drawable (NULL, theParent->parentWindow->window, NULL,
+                                                                clip_rect.x,
+                                                                clip_rect.y,
+                                                                0, 0, clip_rect.width-1, clip_rect.height-1);
+
+            if (h>0)
+            {
+                gdk_draw_pixbuf (theParent->parentWindow->window, theContext, theImage, 0,0,
+                                clip_rect.x-h,
+                                clip_rect.y,
+                                -1,-1, GDK_RGB_DITHER_NONE, 0, 0);
+
+                paintRect.right =   scrollRect.right+hsShift;
+                paintRect.left  =   scrollRect.right-h;
+
+                hOrigin         +=  paintRect.left-rel.left;
+                Paint((Ptr)&paintRect);
+                hOrigin         -=  paintRect.left-rel.left;
+
+            }
+            else
+            {
+                gdk_draw_pixbuf (theParent->parentWindow->window, theContext, theImage, 0,0,
+                                clip_rect.x-h,
+                                clip_rect.y,
+                                -1,-1, GDK_RGB_DITHER_NONE, 0, 0);
+
+                paintRect.left  = scrollRect.left;
+                paintRect.right = paintRect.left-h+hsShift;
+                Paint   ((Ptr)&paintRect);
+            }
+
+            g_object_unref (theImage);
+            gdk_gc_set_clip_rectangle  (theContext, NULL);
+        }*/
+    }
+}
+
+
+//__________________________________________________________________
+void        _HYTable::_VScrollTable (long v)
+{
+    if (v && _CheckGC()) {
+        long        vsShift = ((settings.width&HY_COMPONENT_H_SCROLL)?HY_SCROLLER_WIDTH:0),
+                    hsShift = ((settings.width&HY_COMPONENT_V_SCROLL)?HY_SCROLLER_WIDTH:0);
+
+        EditBoxHandler  (-1,rel);
+
+        _HYTable*       theParent = (_HYTable*) this;
+        _HYRect         paintRect = rel;
+
+        //if (abs(v)>(rel.bottom-rel.top)/2)
+        _Paint((Ptr)&paintRect);
+        /*else
+        {
+            _HYRect                   scrollRect;
+
+            scrollRect.left         = rel.left;
+            scrollRect.right        = rel.right-hsShift;
+            scrollRect.top          = rel.top;
+            scrollRect.bottom       = rel.bottom-vsShift;
+            paintRect.left          = scrollRect.left;
+            paintRect.right         = rel.right;
+
+            if (v<0)
+                scrollRect.top--;
+            GdkRectangle clip_rect  = HYRect2GDKRect (scrollRect);
+            clip_rect.x += theParent->parentWindow->allocation.x;
+            clip_rect.y += theParent->parentWindow->allocation.y;
+
+            gdk_gc_set_clip_rectangle  (theContext, &clip_rect);
+            GdkPixbuf* theImage = gdk_pixbuf_get_from_drawable (NULL, theParent->parentWindow->window, NULL,
+                                                                clip_rect.x,
+                                                                clip_rect.y,
+                                                                0, 0, clip_rect.width - 1, clip_rect.height - 1);
+
+            if (v>0)
+            {
+                gdk_draw_pixbuf (theParent->parentWindow->window, theContext, theImage, 0,0,
+                                clip_rect.x,
+                                clip_rect.y-v,
+                                -1,-1, GDK_RGB_DITHER_NONE, 0, 0);
+                paintRect.top = rel.bottom-vsShift-v-1;
+                paintRect.bottom = rel.bottom-1;
+                vOrigin+=paintRect.top-rel.top;
+                Paint((Ptr)&paintRect);
+                vOrigin-=paintRect.top-rel.top;
+            }
+            else
+            {
+                gdk_draw_pixbuf (theParent->parentWindow->window, theContext, theImage, 0,0,
+                                clip_rect.x,
+                                clip_rect.y-v,
+                                -1,-1, GDK_RGB_DITHER_NONE, 0, 0);
+                paintRect.top = rel.top;
+                paintRect.bottom = rel.top-v+vsShift+2;
+                paintRect.bottom = rel.bottom;
+                Paint((Ptr)&paintRect);
+            }
+
+            g_object_unref (theImage);
+            gdk_gc_set_clip_rectangle  (theContext, NULL);
+        }*/
+    }
+}
+
+//__________________________________________________________________
+
+void        _HYTable::_ComponentMouseExit (void)
+{
+    if (cursorState) {
+        if ((cursorState == HY_TABLE_DRAG_CURSOR)&&(activeColumn>=0)&&(activeColumn2>=0)) {
+            _HiliteRowForDrag (activeColumn2,activeColumn);
+        }
+
+        _ResetCursorState ();
+    }
+}
+
+//__________________________________________________________________
+
+void        _HYPlatformTable::_SetBackColor (_HYColor& c)
+{
+    backPattern = HYColorToGDKColor(c);
+}
+
+//__________________________________________________________________
+
+void        _HYPlatformTable::_SetBackColor2 (_HYColor& c)
+{
+    backPattern2 = HYColorToGDKColor(c);
+}
+
+
+//__________________________________________________________________
+
+void        _HYPlatformTable::_KillTextBox (void)
+{
+    if (editBox) {
+        gtk_widget_destroy(editBox);
+        editBox = nil;
+        _ResetCursorState ();
+    }
+}
+
+//__________________________________________________________________
+
+_String     _HYPlatformTable::_RetrieveTextValue (void)
+{
+    if (editBox) {
+        return _String((char*)gtk_entry_get_text(GTK_ENTRY(editBox)));
+    }
+
+    return empty;
+}
+
+//__________________________________________________________________
+
+void        _HYPlatformTable::_CreateTextBox (_HYRect& tBox,_String& textIn)
+{
+    textBoxRect = HYRect2GDKRect(tBox);
+
+    _HYTable * theParent = (_HYTable*)this;
+
+    editBox = gtk_entry_new ();
+    checkPointer   (editBox);
+
+    gtk_container_add(GTK_CONTAINER(theParent->parentWindow),editBox);
+
+    g_signal_connect (G_OBJECT (editBox), "key-press-event", G_CALLBACK (hy_table_key_interceptor), theParent);
+
+    if (tableFont) {
+        gtk_widget_modify_font (editBox, tableFont);
+    }
+
+    gtk_fixed_move (GTK_FIXED(theParent->parentWindow), editBox, textBoxRect.x, textBoxRect.y);
+    gtk_widget_set_size_request(editBox,textBoxRect.width,textBoxRect.height);
+    gtk_entry_set_has_frame (GTK_ENTRY(editBox),true);
+    gtk_entry_set_text(GTK_ENTRY(editBox), textIn.sData);
+    gtk_widget_show(editBox);
+    gtk_widget_activate(editBox);
+    gtk_widget_grab_focus (editBox);
+}
+
+
+
+//__________________________________________________________________
+
+GdkRectangle    _HYPlatformTable::_GetVisibleRowRect (long h)
+{
+    _HYTable*   parent = (_HYTable*)this;
+    _HYRect res;
+
+    long        w = (parent->settings.width&HY_COMPONENT_H_SCROLL)?HY_SCROLLER_WIDTH:0;
+    res.left   = parent->rel.left;
+    res.right  = (parent->settings.width&HY_COMPONENT_H_SCROLL)?parent->rel.right-HY_SCROLLER_WIDTH:parent->rel.right;
+
+    res.bottom = parent->verticalSpaces.lData[h]-parent->vOrigin+parent->rel.top;
+    if (res.bottom>parent->rel.bottom-w) {
+        res.bottom=parent->rel.bottom-w;
+    }
+
+    if (h) {
+        res.top = parent->verticalSpaces.lData[h-1]-parent->vOrigin+parent->rel.top;
+    } else {
+        res.top = parent->rel.top-parent->vOrigin;
+    }
+
+    return HYRect2GDKRect(res);
+}
+
+
+//__________________________________________________________________
+
+void        _HYPlatformTable::_HiliteRowForDrag (long row, long old)
+{
+    if (_CheckGC()) {
+        _HYTable * theParent = (_HYTable*)this;
+        GdkRectangle        cellRect = _GetVisibleRowRect (row);
+
+        if (row>=old) {
+            cellRect.y = cellRect.y+cellRect.height-2;
+        }
+
+        cellRect.height = 2;
+
+        GdkPixbuf* theImage = gdk_pixbuf_get_from_drawable (NULL, theParent->parentWindow->window, NULL, cellRect.x+theParent->parentWindow->allocation.x,
+                              cellRect.y+theParent->parentWindow->allocation.y, 0, 0,
+                              cellRect.width, cellRect.height);
+        gdk_gc_set_function (theContext,GDK_INVERT);
+        gdk_draw_pixbuf (theParent->parentWindow->window, theContext, theImage, 0,0,
+                         cellRect.x+theParent->parentWindow->allocation.x,
+                         cellRect.y+theParent->parentWindow->allocation.y,
+                         cellRect.width, cellRect.height, GDK_RGB_DITHER_NORMAL, 0, 0);
+
+        gdk_gc_set_function (theContext,GDK_COPY);
+        g_object_unref (theImage);
+    }
+}
+
+//__________________________________________________________________
+
+void        _HYTable::_MarkCellsForUpdate (_SimpleList& cells)
+{
+    if (_CheckGC()) {
+        long hs,hf,vs,vf,t,t2,k;
+        GetDisplayRange (&rel, hs, hf, vs, vf);
+
+        GdkRectangle  clipRect;
+
+        clipRect.x     = rel.left;
+        clipRect.width = rel.right - rel.left + 1;
+        if (settings.width&HY_COMPONENT_V_SCROLL) {
+            clipRect.width -= HY_SCROLLER_WIDTH;
+        }
+
+        clipRect.y      = rel.top;
+        clipRect.height = rel.bottom - rel.top + 1;
+
+        if (settings.width&HY_COMPONENT_H_SCROLL) {
+            clipRect.height -= HY_SCROLLER_WIDTH;
+        }
+
+        for (k=0; k<cells.lLength; k++) {
+            t2 = cells.lData[k]/horizontalSpaces.lLength;
+            t  = cells.lData[k]%horizontalSpaces.lLength;
+
+            if (t>=hs && t<=hf && t2<=vf && t2>=vs) {
+                GdkRectangle invalRect;
+
+                if (t) {
+                    invalRect.x = horizontalSpaces.lData[t-1];
+                } else {
+                    invalRect.x = 0;
+                }
+
+                invalRect.width = horizontalSpaces.lData[t] - invalRect.x + 1;
+
+                if (t2) {
+                    invalRect.y = verticalSpaces.lData[t2-1];
+                } else {
+                    invalRect.y = 0;
+                }
+
+                invalRect.height = verticalSpaces.lData[t2] - invalRect.y + 1;
+                invalRect.x += rel.left-hOrigin;
+                invalRect.y += rel.top -vOrigin;
+
+                GdkRectangle           tempRect;
+                if (gdk_rectangle_intersect (&clipRect, &invalRect,&tempRect)) {
+                    _HYTable * theParent = (_HYTable*) this;
+                    tempRect.x += theParent->parentWindow->allocation.x;
+                    tempRect.y += theParent->parentWindow->allocation.y;
+                    gdk_window_invalidate_rect (theParent->parentWindow->window, &tempRect, false);
+                }
+            }
+        }
+    }
+}
+
+//__________________________________________________________________
+
+void        _HYTable::_MarkColumnForUpdate (long index)
+{
+    if (_CheckGC()) {
+        long hs,hf,vs,vf;
+        GetDisplayRange (&rel, hs, hf, vs, vf);
+
+        if (index>=hs && index<=hf) {
+            GdkRectangle    clipRect;
+
+            clipRect.x     = rel.left;
+            clipRect.width = rel.right - rel.left + 1;
+            if (settings.width&HY_COMPONENT_V_SCROLL) {
+                clipRect.width -= HY_SCROLLER_WIDTH;
+            }
+
+            clipRect.y      = rel.top;
+            clipRect.height = rel.bottom - rel.top + 1;
+
+            if (settings.width&HY_COMPONENT_H_SCROLL) {
+                clipRect.height -= HY_SCROLLER_WIDTH;
+            }
+
+            GdkRectangle    invalRect;
+
+            invalRect.height = clipRect.height;
+            invalRect.y      = clipRect.y;
+            invalRect.x      = index?horizontalSpaces.lData[index-1]:0;
+            invalRect.width  = horizontalSpaces.lData[index] - invalRect.x + 1;
+
+            invalRect.x     += rel.left-hOrigin;
+
+            GdkRectangle           tempRect;
+            if (gdk_rectangle_intersect (&clipRect, &invalRect,&tempRect)) {
+                _HYTable * theParent = (_HYTable*) this;
+                tempRect.x += theParent->parentWindow->allocation.x;
+                tempRect.y += theParent->parentWindow->allocation.y;
+                gdk_window_invalidate_rect (theParent->parentWindow->window, &tempRect, false);
+            }
+        }
+    }
+}
+
+//__________________________________________________________________
+
+void        _HYTable::_MarkRowForUpdate (long index)
+{
+    if (_CheckGC()) {
+        long hs,hf,vs,vf;
+        GetDisplayRange (&rel, hs, hf, vs, vf);
+
+        if ((index>=vs)&&(index<=vf)) {
+            GdkRectangle  clipRect;
+
+            clipRect.x      = rel.left;
+            clipRect.width  = rel.right - rel.left + 1;
+            if (settings.width&HY_COMPONENT_V_SCROLL) {
+                clipRect.width -= HY_SCROLLER_WIDTH;
+            }
+
+            clipRect.y      = rel.top;
+            clipRect.height = rel.bottom - rel.top + 1;
+            if (settings.width&HY_COMPONENT_H_SCROLL) {
+                clipRect.height -= HY_SCROLLER_WIDTH;
+            }
+
+            GdkRectangle      invalRect;
+            invalRect.width     = clipRect.width;
+            invalRect.x         = clipRect.x;
+            invalRect.y         = index?verticalSpaces.lData[index-1]:0;
+            invalRect.height    = verticalSpaces.lData[index]-invalRect.y+1;
+
+            invalRect.y += rel.top-vOrigin;
+
+            GdkRectangle           tempRect;
+            if (gdk_rectangle_intersect (&clipRect, &invalRect,&tempRect)) {
+                _HYTable * theParent = (_HYTable*) this;
+                tempRect.x += theParent->parentWindow->allocation.x;
+                tempRect.y += theParent->parentWindow->allocation.y;
+                gdk_window_invalidate_rect (theParent->parentWindow->window, &tempRect, false);
+            }
+        }
+    }
+}
+
+
+//__________________________________________________________________
+
+void        _HYTable::_MarkCellForUpdate (long index)
+{
+    _SimpleList     dummy (index);
+    _MarkCellsForUpdate (dummy);
+}
+
+//__________________________________________________________________
+
+void        _HYTable::_IdleHandler (void)
+{
+}
+
+
+//__________________________________________________________________
+
+void        _HYTable::_FocusComponent (void)
+{
+    if (!GTK_WIDGET_HAS_FOCUS (parentWindow)) {
+        gtk_widget_grab_focus (parentWindow);
+    }
+}
+
+
+//__________________________________________________________________
+long        _HYTable::_HandlePullDown (_List& data, long h, long v, long currentS)
+{
+    if (data.lLength) {
+        return HandlePullDownWithFont (data,h,v,currentS,textFont.face,textFont.size);
+    }
+
+    return -1;
+}
+
+
+//__________________________________________________________________
+
+void        _HYTable::_ScrollVPixels (long offset)
+{
+    long     voff = ((settings.width&HY_COMPONENT_H_SCROLL)?HY_SCROLLER_WIDTH:0);
+    offset = offset/(_Parameter)(GetMaxH()- rel.bottom+rel.top+1-voff)*MAX_CONTROL_VALUE;
+    ProcessEvent (generateScrollEvent(0,offset));
+    _SetVScrollerPos((double)MAX_CONTROL_VALUE*vOrigin/(verticalSpaces.lData[verticalSpaces.lLength-1]-vSize+voff));
+}
+
+//__________________________________________________________________
+
+void        _HYTable::_ScrollHPixels (long offset)
+{
+    long     hoff = ((settings.width&HY_COMPONENT_V_SCROLL)?HY_SCROLLER_WIDTH:0);
+    offset = offset/(_Parameter)(GetMaxW()- rel.right+rel.bottom+1-hoff)*MAX_CONTROL_VALUE;
+    ProcessEvent (generateScrollEvent(offset,0));
+    _SetHScrollerPos((double)MAX_CONTROL_VALUE*hOrigin/(horizontalSpaces.lData[horizontalSpaces.lLength-1]-hSize+hoff));
+}
+
+
+//__________________________________________________________________
+
+void        _HYTable::_ScrollRowIntoView (long index)
+{
+    if ((index>=0)&&(index<verticalSpaces.lLength)) {
+        long hs, hf, vs, vf;
+        GetDisplayRange (&rel,hs,hf,vs,vf);
+        if ((index>vf)||(index<vs)) {
+            _ScrollVPixels ((index?verticalSpaces.lData[index-1]:0)-vOrigin);
+        }
+    }
+}
+
+//__________________________________________________________________
+
+void        _HYPlatformTable::_ResetCursorState (void)
+{
+    if (_CheckGC()) {
+        gdk_window_set_cursor (((_HYTable*)this)->parentWindow->window, NULL);
+    }
+    cursorState = 0;
+}
+
+
+//__________________________________________________________________
+
+void        _HYPlatformTable::_FrameRect        (GdkRectangle& theRect)
+{
+    if (_CheckGC()) {
+        GdkGCValues saveGCValues;
+        gdk_gc_get_values (theContext, &saveGCValues);
+
+        gdk_gc_set_line_attributes (theContext, 2, GDK_LINE_ON_OFF_DASH,GDK_CAP_NOT_LAST, GDK_JOIN_MITER);
+        gdk_gc_set_function        (theContext,GDK_INVERT);
+        gdk_gc_set_foreground      (theContext, &_BLACKBRUSH_);
+        gdk_gc_set_clip_rectangle  (theContext, NULL);
+
+        gdk_draw_rectangle (((_HYTable*)this)->parentWindow->window,theContext,false,
+                            theRect.x+((_HYTable*)this)->parentWindow->allocation.x,
+                            theRect.y+((_HYTable*)this)->parentWindow->allocation.y,
+                            theRect.width, theRect.height);
+
+        gdk_gc_set_values (theContext, &saveGCValues,
+                           (GdkGCValuesMask)(GDK_GC_FOREGROUND|GDK_GC_FUNCTION|GDK_GC_LINE_WIDTH|GDK_GC_LINE_STYLE|GDK_GC_CAP_STYLE|GDK_GC_JOIN_STYLE));
+    }
+}
+
+
+//__________________________________________________________________
+void        _HYTable::_Paint (Ptr p)
+{
+    if (!_CheckGC()) {
+        return;
+    }
+
+    _HYRect         *relRect    = (_HYRect*)p;
+
+    bool            isPrinting = relRect->right<0;
+
+    if (isPrinting) {
+        relRect->right = -relRect->right;
+    }
+
+    GdkColor        whiteC          = HYColorToGDKColor ((_HYColor) {
+        0xff,0xff,0xff
+    }),
+    fillColor       = HYColorToGDKColor ((_HYColor) {
+        102,204,255
+    }),
+                                              fillTColor        = HYColorToGDKColor (textColor),
+                                              tableBkColor    = HYColorToGDKColor (backColor),
+                                              tableBkColor2   = HYColorToGDKColor (backColor2),
+                                              textColorGDK   = HYColorToGDKColor (textColor);
+
+    GdkGCValues     savedDCValues;
+    GdkDrawable*    window2Paint = GDK_DRAWABLE      (parentWindow->window);
+    gdk_gc_get_values (theContext, &savedDCValues);
+
+    PangoLayout     *textLayout   = pango_layout_new (screenPContext);
+    pango_layout_set_width (textLayout, -1);
+
+    //HBRUSH            themeFill   = CreateSolidBrush (fillColor);
+    //checkPointer  (themeFill);
+
+    //HRGN          saveRgn     = CreateRectRgn    (0,0,1,1);
+    //checkPointer  (saveRgn);
+
+    long            hs, // starting column
+                    hf, // ending column
+                    vs, // starting row
+                    vf, // ending row
+                    k,  // loop index
+                    t,  // aux variable
+                    t2,
+                    st; // a few more auxs
+
+    bool            chop,
+                    chopv;
+
+
+    GetDisplayRange (relRect, hs, hf, vs, vf);
+
+    long            vsShift = ((settings.width&HY_COMPONENT_H_SCROLL)?HY_SCROLLER_WIDTH:0),
+                    hsShift = ((settings.width&HY_COMPONENT_V_SCROLL)?HY_SCROLLER_WIDTH:0);
+
+
+    _HYRect         saveRel;
+    GdkRectangle    bRect;
+
+    GdkGC*          offScreenPtr = nil,
+                    *           dc           = theContext;
+
+    GdkPixmap*      offBitmap    = nil;
+
+    long            alX = parentWindow->allocation.x,
+                    alY = parentWindow->allocation.y;
+
+    //bRect = HYRect2GDKRect(*relRect);
+    //gdk_gc_set_foreground(dc,&fillColor);
+    //gdk_draw_rectangle(window2Paint,dc,true,bRect.x+alX,bRect.y+alY,bRect.width,bRect.width);
+    //return;
+
+    if ((vf-vs>2)&&(!isPrinting)) {
+        offScreenPtr = gdk_gc_new (window2Paint);
+        if (offScreenPtr) {
+            bRect.x          = bRect.y = 0;
+            bRect.width      = relRect->right-relRect->left-hsShift + 1;
+            bRect.height     = relRect->bottom-relRect->top-vsShift + 1;
+            offBitmap        = gdk_pixmap_new (window2Paint, bRect.width, bRect.height,-1);
+
+            if (!offBitmap) {
+                g_object_unref (offScreenPtr);
+                offScreenPtr = nil;
+            } else {
+                dc = offScreenPtr;
+                window2Paint = GDK_DRAWABLE (offBitmap);
+                saveRel = *relRect;
+                relRect->bottom -= relRect->top;
+                relRect->top = 0;
+                relRect->right  -= relRect->left;
+                relRect->left = 0;
+                alX = 0;
+                alY = 0;
+            }
+        }
+    }
+    //printf ("Paint row %d-%d; parent offset %d %d\n",vs,vf, alX, alY);
+
+
+    //SetTextAlign   (dc, TA_BASELINE);
+    //SetBkMode    (dc, TRANSPARENT);
+
+    GdkRectangle    clipRect = {
+        relRect->left,relRect->top,
+        relRect->right-hsShift - relRect->left + 1,
+        relRect->bottom-vsShift - relRect->top + 1
+    },
+    anotherRect,
+    clipRect2,
+    clipRect3;
+
+    //POINT       mapPts[2];
+    //mapPts[0] = (POINT){clipRect.left,clipRect.top};
+    //mapPts[1] = (POINT){clipRect.right+1,clipRect.bottom+1};
+    //LPtoDP (dc, mapPts,2);
+
+    anotherRect  = clipRect;
+
+    anotherRect.x += alX;
+    anotherRect.y += alY;
+    //anotherRect.width  ++;
+    //anotherRect.height ++;
+
+    GdkRegion     *tempRgn = gdk_region_rectangle (&anotherRect);
+
+    gdk_gc_set_clip_region(dc, tempRgn);
+
+    //::SetTextColor (dc, RGB(textColor.R, textColor.G, textColor.B));
+
+    anotherRect = clipRect;
+    t = relRect->top-vOrigin;
+
+    //saveDCPen = (HPEN)SelectObject (dc, whitePen);
+    gdk_gc_set_line_attributes(dc,1,GDK_LINE_SOLID,GDK_CAP_NOT_LAST,GDK_JOIN_MITER);
+
+    for (k=vs; k<=vf; k++) {
+        anotherRect.y       = k?verticalSpaces.lData[k-1]+t:relRect->top;
+        anotherRect.height  = verticalSpaces.lData[k]+t-anotherRect.y + 1;
+
+        if (cellTypes.lData[k*horizontalSpaces.lLength]&HY_TABLE_BEVELED) {
+            gdk_gc_set_foreground(dc,&backPattern2);
+            gdk_draw_rectangle   (window2Paint,dc,true,anotherRect.x+alX,anotherRect.y+alY,anotherRect.width
+                                  ,anotherRect.height);
+            if ( k==vs || k<vf ) {
+                gdk_gc_set_foreground(dc,&menuLine2);
+                //MoveToEx (dc,anotherRect.left,anotherRect.bottom-1,nil);
+                //LineTo (dc,anotherRect.right,anotherRect.bottom-1);
+                /*gdk_draw_line (window2Paint,dc,anotherRect.x+alX,
+                                               anotherRect.y+alY+anotherRect.height-2,
+                                               anotherRect.x+alX+anotherRect.width-1,
+                                               anotherRect.y+alY+anotherRect.height-2);*/
+                gdk_gc_set_foreground(dc,&menuLine1);
+                //MoveToEx (dc,anotherRect.left,anotherRect.bottom-2,nil);
+                //LineTo (dc,anotherRect.right,anotherRect.bottom-2);
+                gdk_draw_line (window2Paint,dc,anotherRect.x+alX,
+                               anotherRect.y+alY+anotherRect.height-3,
+                               anotherRect.x+alX+anotherRect.width-1,
+                               anotherRect.y+alY+anotherRect.height-3);
+                //gdk_gc_set_foreground(dc,&whiteC);
+            }
+        } else {
+            gdk_gc_set_foreground(dc,&backPattern);
+            gdk_draw_rectangle   (window2Paint,dc,true,anotherRect.x+alX,anotherRect.y+alY,anotherRect.width
+                                  ,anotherRect.height);
+            if ( k==vs || k<vf ) {
+                gdk_gc_set_foreground(dc,&whiteC);
+                //MoveToEx (dc,anotherRect.left,anotherRect.bottom-1,nil);
+                //LineTo (dc,anotherRect.right,anotherRect.bottom-1);
+                gdk_draw_line (window2Paint,dc,anotherRect.x+alX,
+                               anotherRect.y+alY+anotherRect.height-2,
+                               anotherRect.x+alX+anotherRect.width-1,
+                               anotherRect.y+alY+anotherRect.height-2);
+            }
+        }
+    }
+
+
+    st = 0;
+    if (hf<horizontalSpaces.lLength-1) {
+        st = hf;
+    } else {
+        st = hf-1;
+    }
+    t = relRect->left-hOrigin-2;
+
+    if ((selectionType & HY_TABLE_NO_COLS_LINES) == 0) {
+        gdk_gc_set_foreground(dc,&menuLine1);
+        for (k=hs; k<=st; k++) {
+            t2 = t+horizontalSpaces.lData[k];
+            gdk_draw_line (window2Paint,dc,t2+alX,
+                           relRect->top+alY,
+                           t2+alX,
+                           relRect->bottom+alY+1);
+            //MoveToEx (dc,t2,relRect->top,nil);
+            //LineTo (dc,t2,relRect->bottom);
+        }
+        gdk_gc_set_foreground(dc,&menuLine2);
+        t++;
+        for (k=hs; k<=st; k++) {
+            t2 = t+horizontalSpaces.lData[k];
+            //MoveToEx (dc,t2,relRect->top,nil);
+            //LineTo (dc,t2,relRect->bottom);
+            gdk_draw_line (window2Paint,dc,t2+alX,
+                           relRect->top+alY,
+                           t2+alX,
+                           relRect->bottom+alY+1);
+        }
+    }
+
+    st = -1;
+    bool  highlightColorOn = false;
+
+    for (k=vs; k<=vf; k++) {
+        anotherRect.y       = relRect->top-vOrigin+1;
+        anotherRect.height  = verticalSpaces.lData[k];
+
+        if (k) {
+            anotherRect.y      += verticalSpaces.lData[k-1];
+            anotherRect.height -= verticalSpaces.lData[k-1];
+        }
+
+        long    t3,
+                st2,
+                w = anotherRect.height-1,
+                w2,
+                shift = (w-textFont.size)/2-1;
+
+        if (anotherRect.y+anotherRect.height -1 > relRect->bottom-vsShift) {
+            anotherRect.height = relRect->bottom-vsShift - anotherRect.y + 1;
+            chopv = false;
+        } else {
+            chopv = true;
+        }
+
+        for (t2=hs; t2<=hf; t2++) {
+            t3 = k*horizontalSpaces.lLength+t2;
+            if (t3 == editCellID) {
+                continue;
+            }
+
+            anotherRect.x     = relRect->left-hOrigin+1;
+            anotherRect.width = horizontalSpaces.lData[t2];
+
+            if (t2) {
+                anotherRect.x     += horizontalSpaces.lData[t2-1];
+                anotherRect.width -= horizontalSpaces.lData[t2-1];
+            }
+
+            clipRect2 = anotherRect;
+            w2        = anotherRect.width-1;
+
+            chop = true;
+
+            if (anotherRect.x + anotherRect.width - 1 > relRect->right-hsShift) {
+                anotherRect.width = relRect->right-hsShift - anotherRect.x + 1;
+                chop = false;
+            } else {
+                chop = true;
+            }
+
+            gdk_region_destroy (tempRgn);
+
+            if ((t2==hs)||(k==vs)) {
+                gdk_rectangle_intersect(&anotherRect,&clipRect,&clipRect3);
+            } else {
+                clipRect3 = anotherRect;
+            }
+
+            clipRect3.height ++;
+            clipRect3.width ++;
+            clipRect3.x += alX;
+            clipRect3.y += alY;
+            tempRgn = gdk_region_rectangle(&clipRect3);
+            gdk_gc_set_clip_region (dc, tempRgn);
+
+
+            if (cellTypes.lData[t3]&HY_TABLE_SELECTED) {
+                gdk_gc_set_foreground(dc,&fillColor);
+                gdk_draw_rectangle(window2Paint,dc,true,    anotherRect.x+alX,
+                                   anotherRect.y+alY,
+                                   anotherRect.width-(chop?2:0),
+                                   anotherRect.height-chopv);
+            }
+
+            if (cellTypes.lData[t3]&HY_TABLE_ICON) {
+                if (!isPrinting) {
+                    _SimpleList     * cellList = (_SimpleList*)cellData.lData[t3];
+
+                    if (w2-4>cellList->lData[1]) {
+                        clipRect2.x += (w2-cellList->lData[1])/2;
+                    }
+
+                    clipRect2.width = cellList->lData[1]+1;
+
+                    if (w-2>cellList->lData[2]) {
+                        clipRect2.y += (w-cellList->lData[2])/2;
+                    }
+
+                    clipRect2.height = cellList->lData[2]+1;
+
+                    if (cellList->lLength==3) {
+                        GdkPixbuf* aPic = (GdkPixbuf*)cellList->lData[0];
+                        if (aPic) {
+
+                            if (clipRect2.height != gdk_pixbuf_get_height (aPic) || clipRect2.width != gdk_pixbuf_get_width (aPic)) {
+                                GdkPixbuf*  scaledImage = gdk_pixbuf_scale_simple  (aPic, clipRect2.width, clipRect2.height, GDK_INTERP_BILINEAR);
+                                checkPointer (scaledImage);
+                                gdk_draw_pixbuf (window2Paint, dc, scaledImage, 0,0, clipRect2.x+alX, clipRect2.y+alY, clipRect2.width, clipRect2.height, GDK_RGB_DITHER_NORMAL, 0, 0);
+                                g_object_unref (scaledImage);
+                            } else {
+                                gdk_draw_pixbuf (window2Paint, dc, aPic, 0,0, clipRect2.x+alX, clipRect2.y+alY, clipRect2.width, clipRect2.height, GDK_RGB_DITHER_NORMAL, 0, 0);
+                            }
+                        }
+                    } else {
+                        if ((cellList->lData[3]==HY_TABLE_COLOR_BOX)||(cellList->lData[3]==HY_TABLE_COLOR_CIRCLE)) {
+                            _HYColor    c   = LongToHYColor    (cellList->lData[0]);
+
+                            if (cellList->lData[3]==HY_TABLE_COLOR_BOX) {
+                                GdkColor  clr = HYColorToGDKColor(c);
+                                gdk_gc_set_foreground(dc,&clr);
+                                gdk_draw_rectangle(window2Paint,dc,true,clipRect2.x+alX,clipRect2.y+alY,clipRect2.width,clipRect.height);
+                            } else {
+                                gdk_gc_set_line_attributes (dc, 1, GDK_LINE_SOLID, GDK_CAP_NOT_LAST, GDK_JOIN_MITER);
+
+
+
+                                GdkColor                circColor = _BLACKBRUSH_;
+                                gdk_gc_set_foreground   (dc,&circColor);
+                                gdk_draw_arc   (window2Paint, dc, true, clipRect2.x-2+alX,
+                                                clipRect2.y-2+alY,
+                                                clipRect2.width+1,
+                                                clipRect2.height+1,
+                                                0, 64*360);
+
+
+                                circColor = HYColorToGDKColor((_HYColor) {
+                                    c.R/2,c.G/2,c.B/2
+                                });
+
+                                gdk_gc_set_foreground   (dc,&circColor);
+                                gdk_draw_arc   (window2Paint, dc, true, clipRect2.x-1+alX,
+                                                clipRect2.y-1+alY,
+                                                clipRect2.width,
+                                                clipRect2.height,
+                                                0, 64*360);
+
+                                circColor = HYColorToGDKColor((_HYColor) {
+                                    c.R/1.25,c.G/1.25,c.B/1.25
+                                });
+
+                                gdk_gc_set_foreground   (dc,&circColor);
+                                gdk_draw_arc   (window2Paint, dc, true, clipRect2.x+alX,
+                                                clipRect2.y+alY,
+                                                clipRect2.width-2,
+                                                clipRect2.height-2,
+                                                0, 64*360);
+
+                                circColor = HYColorToGDKColor(c);
+
+                                gdk_gc_set_foreground   (dc,&circColor);
+                                gdk_draw_arc   (window2Paint, dc, true, clipRect2.x+1+alX,
+                                                clipRect2.y+1+alY,
+                                                clipRect2.width-4,
+                                                clipRect2.height-4,
+                                                0, 64*360);
+                            }
+                        }
+                    }
+                }
+            } else { // text
+                st2 = cellTypes.lData[t3]&HY_TABLE_STYLEMASK;
+                if (st!=st2) {
+                    PangoFontDescription*   setFont = tableFont;
+                    st = st2;
+                    if (st&HY_TABLE_BOLD) {
+                        if (st&HY_TABLE_ITALIC) {
+                            setFont = tableFontBI;
+                        } else {
+                            setFont = tableFontB;
+                        }
+                    } else if (st&HY_TABLE_ITALIC) {
+                        setFont = tableFontI;
+                    }
+
+                    pango_layout_set_font_description(textLayout,setFont);
+                }
+
+
+                _String  *thisCell = (_String*)cellData.lData[t3];
+
+                if (cellTypes.lData[t3]&HY_TABLE_SELECTED) {
+                    gdk_gc_set_foreground(dc,&fillTColor);
+                } else {
+                    gdk_gc_set_foreground(dc,&textColorGDK);
+                }
+
+                pango_layout_set_text(textLayout,thisCell->sData,thisCell->sLength);
+                gdk_draw_layout(window2Paint,dc,anotherRect.x+textFont.size/3+alX,anotherRect.y+shift+alY,textLayout);
+                //TextOut (dc,, anotherRect.top+shift+textFont.size, );
+                if (cellTypes.lData[t3]&HY_TABLE_PULLDOWN) {
+                    if (!isPrinting) {
+                        clipRect2.x     = clipRect2.x + clipRect2.width - 4 - tPDMw;
+                        clipRect2.width = tPDMw;
+
+                        if (w-2>tPDMh) {
+                            t3 = (w-tPDMh)/2;
+                            clipRect2.y += t3;
+                        }
+                        clipRect2.height = tPDMh;
+                        gdk_draw_pixbuf (window2Paint, dc, tablePDMenuIcon, 0,0, clipRect2.x+alX, clipRect2.y+alY, clipRect2.width, clipRect2.height, GDK_RGB_DITHER_NORMAL, 0, 0);
+                    }
+                }
+            }
+        }
+    }
+
+
+    gdk_gc_set_clip_region  (dc, NULL);
+
+    if (offScreenPtr) {
+        *relRect    = saveRel;
+        clipRect.x += relRect->left + parentWindow->allocation.x;
+        clipRect.y += relRect->top  + parentWindow->allocation.y;
+
+        gdk_draw_drawable (GDK_DRAWABLE(parentWindow->window), theContext, offBitmap, 0, 0, clipRect.x, clipRect.y, -1, -1);
+        g_object_unref   (offScreenPtr);
+        g_object_unref    (offBitmap);
+    }
+
+    //gdk_gc_set_values (theContext, &savedDCValues, 0xff);
+    gdk_region_destroy(tempRgn);
+    g_object_unref (textLayout);
+    if (editBox) {
+        gtk_widget_queue_draw(editBox);
+    }
+
+    _HYPlatformComponent::_Paint(p);
+}
+
+
+//__________________________________________________________________
+
+bool        _HYTable::_ProcessOSEvent (Ptr vEvent)
+{
+    static  int     lastH = 0,
+                    lastV = 0;
+
+    long            k,
+                    h,
+                    v,
+                    vsShift = ((settings.width&HY_COMPONENT_H_SCROLL)?HY_SCROLLER_WIDTH:0),
+                    hsShift = ((settings.width&HY_COMPONENT_V_SCROLL)?HY_SCROLLER_WIDTH:0);
+
+    _HY_GTK_UI_Message *theMessage = (_HY_GTK_UI_Message*)vEvent;
+
+    gdouble   xc,
+              yc;
+
+    gdk_event_get_coords (theMessage->theEvent,&xc,&yc);
+
+    switch (theMessage->theEvent->type) {
+    case GDK_BUTTON_PRESS:
+    case GDK_2BUTTON_PRESS: {
+        GdkEventButton * bevent = (GdkEventButton*)theMessage->theEvent;
+
+        lastH = xc-parentWindow->allocation.x;
+        lastV = yc-parentWindow->allocation.y;
+
+
+        if ((selectionType&HY_TABLE_FOCUSABLE)&&messageRecipient&&((selectionType&HY_TABLE_IS_FOCUSED)==0)) {
+            messageRecipient->ProcessEvent(generateKeyboardFocusEvent (GetID()));
+        }
+
+        if ( cursorState == HY_TABLE_SIZE_CURSOR && theMessage->theEvent->type != GDK_2BUTTON_PRESS ) {
+            // do drag here
+            EditBoxHandler (-1,rel);
+
+            //SetCapture      (parentWindow);
+            gdk_pointer_grab (parentWindow->window,false,
+                              (GdkEventMask)(GDK_POINTER_MOTION_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK),
+                              parentWindow->window, NULL, bevent->time);
+
+            limits.x      = lastH;
+            limits.y      = rel.top;
+            limits.height = rel.bottom-vsShift-limits.y + 1;
+            limits.width  = rel.right -hsShift;
+
+            lastH += hOrigin;
+
+            for (activeColumn = 0; activeColumn<horizontalSpaces.lLength-1; activeColumn++)
+                if (horizontalSpaces.lData[activeColumn]>lastH-2-rel.left) {
+                    break;
+                }
+
+            if (activeColumn) {
+                limits.x = rel.left+horizontalSpaces.lData[activeColumn-1]+3-hOrigin;
+            } else {
+                limits.x = rel.left+3;
+            }
+
+            long dragRes = horizontalSpaces.lData[horizontalSpaces.lLength-1]-
+                           rel.right+rel.left-hOrigin+hsShift;
+
+            if (dragRes<lastH-limits.x) {
+                limits.x = lastH-dragRes;
+            }
+
+            lastH        -= hOrigin;
+            limits.width += 1-limits.x;
+
+            return true;
+
+        } else {
+            if (((k=FindClickedTableCell (lastH-rel.left,lastV-rel.top,h,v))>-1)&&(lastV<rel.bottom-vsShift)&&(lastH<rel.right-hsShift)) {
+                if (theMessage->theEvent->type == GDK_2BUTTON_PRESS) {
+                    if (cursorState == HY_TABLE_SIZE_CURSOR) {
+                        _ResetCursorState ();
+                        gdk_pointer_ungrab (((GdkEventButton*)theMessage->theEvent)->time);
+                    } else if ((cursorState == HY_TABLE_DRAG_CURSOR || HY_TABLE_PREEDIT_CURSOR == cursorState)&& messageRecipient) {
+                        gdk_pointer_ungrab (((GdkEventButton*)theMessage->theEvent)->time);
+                        ((_HYTWindow*)messageRecipient)->trackMouseComponent = nil;
+                    }
+
+                    if (cellTypes.lData[k]&HY_TABLE_EDIT_TEXT) {
+                        EditBoxHandler (k,rel);
+                    } else if (messageRecipient) {
+                        messageRecipient->ProcessEvent (generateTableDblClickEvent(GetID()));
+                    }
+                    break;
+                }
+                ModifySelection (h,v,bevent->state & GDK_SHIFT_MASK, bevent->state & GDK_CONTROL_MASK, true);
+            }
+
+            if (k==-2)
+                // process pull-down
+            {
+                if (messageRecipient)
+                    messageRecipient->ProcessEvent (generateTablePullDownEvent(GetID(),v*horizontalSpaces.lLength+h,
+                                                    (((long)xc)<<16)+(long)yc));
+                break;
+            }
+
+
+            if (cursorState == HY_TABLE_DRAG_CURSOR && theMessage->theEvent->type != GDK_2BUTTON_PRESS) {
+                gdk_window_set_cursor (parentWindow->window, dropOffCursor);
+                FindClickedTableCell(lastH-rel.left,lastV-rel.top,k,activeColumn);
+                activeColumn2 = -1;
+                if (messageRecipient) {
+                    gdk_pointer_grab (parentWindow->window,false,
+                                      (GdkEventMask)(GDK_POINTER_MOTION_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK),
+                                      NULL, NULL, bevent->time);
+                    ((_HYTWindow*)messageRecipient)->trackMouseComponent = (Ptr)this;
+                }
+                return true;
+            }
+
+
+            /*  handle row drag here */
+            if ((selectionType&HY_TABLE_SINGLE_SELECTION)==0 &&
+                    (selectionType&HY_TABLE_NODRAG_SELECTION)==0 &&
+                    lastH<rel.right-hsShift &&
+                    lastV<rel.bottom-vsShift ) {
+                cursorState = HY_TABLE_PREEDIT_CURSOR;
+                limits.x     = lastH;
+                limits.width = 0;
+                limits.y     = lastV;
+                limits.height = 0;
+
+                textBoxRect.x      = -1;
+                textBoxRect.width  = lastH;
+                textBoxRect.height = lastV;
+
+                if (messageRecipient) {
+                    gdk_pointer_grab (parentWindow->window,false,
+                                      (GdkEventMask)(GDK_POINTER_MOTION_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK),
+                                      NULL, NULL, bevent->time);
+
+                    ((_HYTWindow*)messageRecipient)->trackMouseComponent = (Ptr)this;
+                }
+
+                return true;
+            }
+        }
+    }
+    break;
+
+    case GDK_MOTION_NOTIFY: {
+        GdkEventMotion * mevent = (GdkEventMotion*)theMessage->theEvent;
+
+        GdkPoint        downWhere = (GdkPoint) {
+            xc-parentWindow->allocation.x,yc-parentWindow->allocation.y
+        };
+
+        if (mevent->state & GDK_BUTTON1_MASK) { // left button down
+            if (cursorState == HY_TABLE_SIZE_CURSOR) {
+                GdkPoint   currentPoint = (GdkPoint) {
+                    xc-parentWindow->allocation.x,yc-parentWindow->allocation.y
+                };
+
+                if (currentPoint.x >= limits.x && currentPoint.x < limits.x + limits.width &&
+                        currentPoint.y >= limits.y && currentPoint.y < limits.y + limits.height ) {
+                    if (currentPoint.x-lastH) {
+                        SetColumnSpacing (activeColumn,currentPoint.x-lastH,true);
+                        if (messageRecipient)
+                            messageRecipient->ProcessEvent (generateTableResizeCEvent(GetID(),
+                                                            activeColumn,currentPoint.x-lastH));
+                        lastH = currentPoint.x;
+                    }
+                }
+            } else if (cursorState == HY_TABLE_DRAG_CURSOR && activeColumn>=0) {
+                long h,v,k;
+
+                if ((downWhere.y>rel.bottom-vsShift)||(downWhere.y<rel.top)) {
+                    if (activeColumn2>=0) {
+                        _HiliteRowForDrag (activeColumn2,activeColumn);
+                        activeColumn2 = -1;
+                    }
+                    h = verticalSpaces.lData[verticalSpaces.lLength-1]/verticalSpaces.lLength;
+                    _ScrollVPixels ((downWhere.y<rel.top)?-h:h);
+                    break;
+                }
+
+                if (downWhere.x>rel.right-hsShift) {
+                    downWhere.x=rel.right-hsShift;
+                }
+
+                if ( (lastH!=downWhere.x)|| (lastV!=downWhere.y)) {
+                    k = FindClickedTableCell(downWhere.x-rel.left,downWhere.y-rel.top,h,v);
+                    if ((v!=activeColumn2)&&(k>-1)) {
+                        if (activeColumn2>=0) {
+                            _HiliteRowForDrag (activeColumn2,activeColumn);
+                        }
+                        if ((v!=activeColumn)&&(!(cellTypes.lData[k]&HY_TABLE_CANTSELECT))) {
+                            _HiliteRowForDrag (v,activeColumn);
+                            activeColumn2 = v;
+                        } else {
+                            activeColumn2 = -1;
+                        }
+                    }
+                    lastH = downWhere.x;
+                    lastV = downWhere.y;
+                }
+            } else if (cursorState == HY_TABLE_EDIT_CURSOR || cursorState == HY_TABLE_PREEDIT_CURSOR) {
+                cursorState = HY_TABLE_EDIT_CURSOR;
+
+                GdkRectangle      clippingRect = HYRect2GDKRect(rel),
+                                  paintRect;
+
+                while (1) {
+                    if (downWhere.y>rel.bottom-vsShift) {
+                        if (rel.bottom-rel.top-vsShift+vOrigin <  verticalSpaces.lData[verticalSpaces.lLength-1]-1) {
+                            long h = verticalSpaces.lData[verticalSpaces.lLength-1]/verticalSpaces.lLength;
+
+                            gdk_rectangle_intersect(&limits,&clippingRect,&paintRect);
+                            _FrameRect (paintRect);
+                            _ScrollVPixels (h);
+
+                            limits.y     -= h;
+                            limits.height += h;
+
+                            gdk_rectangle_intersect(&limits,&clippingRect,&paintRect);
+                            _FrameRect    (paintRect);
+
+                            lastV               -= h;
+                            textBoxRect.height  -= h;
+                            break;
+                        }
+                        downWhere.y=rel.bottom-vsShift;
+                    }
+                    if (downWhere.x>rel.right-hsShift) {
+                        if (rel.right-rel.left-hsShift+hOrigin <  horizontalSpaces.lData[horizontalSpaces.lLength-1]-1) {
+                            long h = horizontalSpaces.lData[horizontalSpaces.lLength-1]/horizontalSpaces.lLength;
+
+                            gdk_rectangle_intersect(&limits,&clippingRect,&paintRect);
+                            _FrameRect    (paintRect);
+
+                            _ScrollHPixels (h);
+
+                            limits.x     -= h;
+                            limits.width += h;
+
+                            gdk_rectangle_intersect(&limits,&clippingRect,&paintRect);
+                            _FrameRect    (paintRect);
+
+                            lastH             -= h;
+                            textBoxRect.width -= h;
+                            break;
+                        }
+                        downWhere.x=rel.right-hsShift;
+                    }
+                    if (downWhere.y<rel.top) {
+                        if (vOrigin>0) {
+                            long h = verticalSpaces.lData[verticalSpaces.lLength-1]/verticalSpaces.lLength;
+
+                            gdk_rectangle_intersect(&limits,&clippingRect,&paintRect);
+                            _FrameRect    (paintRect);
+
+                            _ScrollVPixels (-h);
+
+                            limits.y      += h;
+                            limits.height -= h;
+
+                            gdk_rectangle_intersect(&limits,&clippingRect,&paintRect);
+                            _FrameRect    (paintRect);
+
+                            lastV              += h;
+                            textBoxRect.height += h;
+                            break;
+                        }
+                        downWhere.y=rel.top;
+                    }
+                    if (downWhere.x<rel.left) {
+                        if (hOrigin>0) {
+                            long h = horizontalSpaces.lData[horizontalSpaces.lLength-1]/horizontalSpaces.lLength;
+
+                            gdk_rectangle_intersect(&limits,&clippingRect,&paintRect);
+                            _FrameRect    (paintRect);
+                            _ScrollHPixels (-h);
+
+                            limits.x     += h;
+                            limits.width -= h;
+
+                            gdk_rectangle_intersect(&limits,&clippingRect,&paintRect);
+                            _FrameRect    (paintRect);
+
+                            lastH             += h;
+                            textBoxRect.width += h;
+                            break;
+                        }
+                        downWhere.x=rel.left;
+                    }
+
+                    if ( lastH!=downWhere.x || lastV!=downWhere.y) {
+                        if (textBoxRect.x>=0) {
+                            gdk_rectangle_intersect(&limits,&clippingRect,&paintRect);
+                            _FrameRect    (paintRect);
+                        }
+
+                        if (downWhere.x > textBoxRect.width) {
+                            limits.width = downWhere.x - limits.x + 1;
+                        } else {
+                            limits.x = downWhere.x;
+                            limits.width =  textBoxRect.width - limits.x + 1;
+                        }
+                        if (downWhere.y >  textBoxRect.height) {
+                            limits.height = downWhere.y - limits.y + 1;
+                        } else {
+                            limits.y = downWhere.y;
+                            limits.height = textBoxRect.height - limits.y + 1;
+                        }
+
+                        gdk_rectangle_intersect(&limits,&clippingRect,&paintRect);
+                        _FrameRect    (paintRect);
+
+                        lastH = downWhere.x;
+                        lastV = downWhere.y;
+
+                        textBoxRect.x = 1;
+                    }
+                    break;
+                }
+                return true;
+            }
+
+        } else { // treat as plain move
+            bool  ch = (!(selectionType&HY_TABLE_DONT_SIZE))&&(CheckForHSizeLocation(downWhere.x-rel.left))&&(downWhere.y<rel.bottom-vsShift);
+
+            if (ch&&(cursorState!=HY_TABLE_SIZE_CURSOR)) {
+                cursorState = HY_TABLE_SIZE_CURSOR;
+                gdk_window_set_cursor(parentWindow->window,hSizeCursor);
+            } else if ((!ch)&&(cursorState==HY_TABLE_SIZE_CURSOR)) {
+                gdk_window_set_cursor(parentWindow->window,NULL);
+                cursorState = 0;
+            }
+
+            if (selectionType & HY_TABLE_SEL_ROWS) {
+                if (!ch) {
+                    k = FindClickedTableCell(downWhere.x-rel.left,downWhere.y-rel.top,h,v);
+                    if (k>=0) {
+                        if ((cursorState != HY_TABLE_DRAG_CURSOR)&&
+                                ((selectionType&HY_TABLE_NODRAG_SELECTION)==0)) {
+                            if (cellTypes.lData[k]&HY_TABLE_SELECTED) {
+                                if (IsRowSelectionSimple()) {
+                                    gdk_window_set_cursor(parentWindow->window,pickUpCursor);
+                                    cursorState = HY_TABLE_DRAG_CURSOR;
+                                    activeColumn = -1;
+                                }
+                            }
+                        } else {
+                            if (((selectionType&HY_TABLE_NODRAG_SELECTION)==0)&&(!(cellTypes.lData[k]&HY_TABLE_SELECTED))) {
+                                gdk_window_set_cursor(parentWindow->window,NULL);
+                                cursorState = 0;
+                            }
+                        }
+                    }
+                }
+            }
+        }
+        return true;
+    }
+    break;
+
+    case GDK_KEY_PRESS: {
+        GdkEventKey * kp = (GdkEventKey*)theMessage->theEvent;
+        bool          ctlDown =  kp->state & GDK_CONTROL_MASK;
+
+        switch (kp->keyval) {
+        case GDK_Up:
+        case GDK_KP_Up:
+            HandleKeyMove (0,ctlDown);
+            return true;
+        case GDK_Down:
+        case GDK_KP_Down:
+            HandleKeyMove (1,ctlDown);
+            return true;
+        case GDK_Left:
+        case GDK_KP_Left:
+            HandleKeyMove (2,ctlDown);
+            return true;
+        case GDK_Right:
+        case GDK_KP_Right:
+            HandleKeyMove (3,ctlDown);
+            return true;
+
+        }
+        break;
+    }
+    case GDK_BUTTON_RELEASE: {
+        lastH = xc - parentWindow->allocation.x;
+        lastV = yc - parentWindow->allocation.y;
+
+        GdkEventButton * be = (GdkEventButton*)theMessage->theEvent;
+
+        bool    isInComponent = lastH>=rel.left && lastV>=rel.top && lastH<rel.right && lastV<rel.bottom;
+
+        if (cursorState == HY_TABLE_SIZE_CURSOR) {
+            _ResetCursorState ();
+            gdk_pointer_ungrab (be->time);
+        } else if (cursorState == HY_TABLE_DRAG_CURSOR) {
+            if (activeColumn >= 0) {
+                if (messageRecipient) {
+                    gdk_pointer_ungrab (be->time);
+                    ((_HYTWindow*)messageRecipient)->trackMouseComponent = nil;
+                }
+                if (activeColumn2>=0) {
+                    _HiliteRowForDrag (activeColumn2,activeColumn);
+                }
+
+                if (activeColumn!=activeColumn2) {
+                    EditBoxHandler (-1,rel);
+                    if (isInComponent) {
+                        DragRow (activeColumn,activeColumn2);
+                    }
+                }
+
+                activeColumn = -1;
+            }
+            _ResetCursorState ();
+        } else if (cursorState == HY_TABLE_EDIT_CURSOR || cursorState == HY_TABLE_PREEDIT_CURSOR) {
+            if (messageRecipient) {
+                gdk_pointer_ungrab (be->time);
+                ((_HYTWindow*)messageRecipient)->trackMouseComponent = nil;
+            }
+
+            if (cursorState == HY_TABLE_EDIT_CURSOR) {
+                GdkRectangle      clippingRect = HYRect2GDKRect (rel),
+                                  paintRect;
+
+                gdk_rectangle_intersect(&limits,&clippingRect,&paintRect);
+                _FrameRect    (paintRect);
+
+                _HYRect     outlineHRect;
+                outlineHRect.left   = limits.x;
+                outlineHRect.right  = limits.x+limits.width-1+hsShift;
+                outlineHRect.top    = limits.y;
+                outlineHRect.bottom = limits.y+limits.height-1+vsShift;
+
+                long    hs,hf,vs,vf;
+
+                hOrigin += limits.x-rel.left;
+                vOrigin += limits.y-rel.top;
+                GetDisplayRange (&outlineHRect,hs,hf,vs,vf);
+                hOrigin -= limits.x-rel.left;
+                vOrigin -= limits.y-rel.top;
+                ExpungeSelection();
+                if ((hf>=hs)||(vs>=vf)) {
+                    _SimpleList sel;
+                    if (selectionType&HY_TABLE_SEL_ROWS) {
+                        sel.RequestSpace (vf-vs+1);
+                        for (h=vs; h<=vf; h++) {
+                            sel<<h;
+                        }
+                        SetRowSelection (sel);
+                    } else if (selectionType&HY_TABLE_SEL_COLS) {
+                        sel.RequestSpace (hf-hs+1);
+                        for (v=hs; v<=hf; h++) {
+                            sel<<v;
+                        }
+                        SetColumnSelection(sel);
+
+                    } else {
+                        sel.RequestSpace ((vf-vs+1)*(hf-hs+1));
+                        for (h=hs; h<=hf; h++)
+                            for (v=vs; v<=vf; v++) {
+                                sel << v*horizontalSpaces.lLength + h;
+                            }
+                        SetSelection (sel,true);
+                        _MarkCellsForUpdate (sel);
+                    }
+                }
+            }
+            _ResetCursorState ();
+        }
+
+        break;
+    }
+    }
+
+
+    return _HYPlatformComponent::_ProcessOSEvent (vEvent);
+}
+
+
+
+
+//__________________________________________________________________
+
+void        _HYTable::_PrintTable (_SimpleList& columns, _SimpleList& rows, _HYTable* ch)
+{
+    _String TBD ("This feature has not yet been implemented in the GTK+ port of HyPhy.");
+    ProblemReport (TBD);
+}
+
+
+//EOF
\ No newline at end of file
diff --git a/src/gui/gtk/Components/HYPlatformTextBox.cpp b/src/gui/gtk/Components/HYPlatformTextBox.cpp
new file mode 100644
index 0000000..712eca8
--- /dev/null
+++ b/src/gui/gtk/Components/HYPlatformTextBox.cpp
@@ -0,0 +1,585 @@
+/*
+    Text input box for GTK+ Glue
+
+    Sergei L. Kosakovsky Pond, November 2004
+*/
+
+#include "errorfns.h"
+#include "HYTextBox.h"
+#include "HYUtils.h"
+#include "HYEventTypes.h"
+#include "HYGraphicPane.h"
+#include "HYPlatformWindow.h"
+#include <gdk/gdkkeysyms.h>
+
+void       ApplyTagToAll                (GtkTextBuffer*, GtkTextTag*);
+gboolean   hy_textbox_key_interceptor   (GtkWidget *, GdkEventKey*, gpointer);
+
+_HYFont                     defaultTBFont       =  {_HY_SANS_FONT,10,HY_FONT_PLAIN};
+
+//__________________________________________________________________
+
+gboolean   hy_textbox_change_notifier (GtkTextBuffer *te,gpointer tbxp)
+{
+    _HYTextBox * tbx = (_HYTextBox*)tbxp;
+
+    if (tbx->messageRecipient) {
+        tbx->messageRecipient->ProcessEvent (generateTextEditChangeEvent (tbx->GetID(),1));
+    }
+
+    return false;
+}
+
+
+//__________________________________________________________________
+
+gboolean   hy_textbox_selchange_notifier (GtkTextBuffer *tbuf,GtkTextIter *arg1,GtkTextMark *arg2,gpointer tbxp)
+{
+    _HYTextBox * tbx = (_HYTextBox*)tbxp;
+
+    if (tbx->messageRecipient) {
+        char * markName = (char*)gtk_text_mark_get_name(arg2);
+        if (markName) {
+            _String markname (markName);
+            if (markname == _String("selection_bound")) { //TBI - will miss many changes
+                //printf ("Changed Selection \n");
+                tbx->messageRecipient->ProcessEvent (generateTextEditChangeEvent (tbx->GetID(),0));
+            }
+        }
+    }
+
+    return false;
+}
+
+//__________________________________________________________________
+
+gboolean   hy_textbox_key_interceptor (GtkWidget *te, GdkEventKey *kp, gpointer tbxp)
+{
+    _HYTextBox * tbx = (_HYTextBox*)tbxp;
+
+    if (tbx->messageRecipient && (tbx->boxFlags & HY_TB_ARROWS)) {
+        if (kp->keyval==GDK_Down || kp->keyval == GDK_KP_Down) {
+            tbx->messageRecipient->ProcessEvent (generateTextEditChangeEvent (tbx->GetID(),3));
+            return true;
+        } else if (kp->keyval==GDK_Up || kp->keyval == GDK_KP_Up) {
+            tbx->messageRecipient->ProcessEvent (generateTextEditChangeEvent (tbx->GetID(),4));
+            return true;
+        }
+    }
+
+    if ((tbx->boxFlags & HY_TB_BIGBOX) == 0) {
+        if (kp->keyval==GDK_KP_Enter || kp->keyval==GDK_Return || kp->keyval==GDK_Escape) {
+            if (tbx->messageRecipient) {
+                tbx->messageRecipient->ProcessEvent (generateTextEditChangeEvent (tbx->GetID(),2));
+            }
+
+            return true;
+        } else if (kp->keyval==GDK_Tab) {
+            return true;
+        }
+    }
+
+    return FALSE;
+}
+
+//__________________________________________________________________
+
+void ApplyTagToAll (GtkTextBuffer* tbuf, GtkTextTag* tt)
+{
+    GtkTextIter               startIT,
+                              endIT;
+
+    gtk_text_buffer_get_iter_at_offset (tbuf, &startIT, 0);
+    gtk_text_buffer_get_iter_at_offset (tbuf, &endIT, gtk_text_buffer_get_char_count(tbuf));
+    gtk_text_buffer_apply_tag (tbuf,tt,&startIT,&endIT);
+}
+
+//__________________________________________________________________
+
+_HYPlatformTextBox::_HYPlatformTextBox  (void)
+{
+    backFill   = backFill = HYColorToGDKColor((_HYColor) {
+        255,255,255
+    });
+    pLabelFont = pango_font_description_new();
+
+    textBoxRect.x       = textBoxRect.y     = 0;
+    textBoxRect.width   = textBoxRect.height = 100;
+    textColor           = HYColorToGDKColor((_HYColor) {
+        0,0,0
+    });
+    te                  = nil;
+
+    _HYTextBox * theParent = (_HYTextBox*)this;
+    isSingleLine        = true;
+
+    te                  = gtk_text_view_new  ();
+    gtk_text_view_set_wrap_mode (GTK_TEXT_VIEW (te), GTK_WRAP_NONE);
+    scrollWindow        = gtk_scrolled_window_new (NULL,NULL);
+    gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW(scrollWindow),GTK_POLICY_NEVER,GTK_POLICY_NEVER);
+
+    gtk_container_add(GTK_CONTAINER(scrollWindow),te);
+    gtk_container_add (GTK_CONTAINER(theParent->parentWindow), scrollWindow);
+    gtk_widget_set_app_paintable(te,true);
+    gtk_widget_show   (te);
+    gtk_widget_show   (scrollWindow);
+    isSingleLine = true;
+    g_signal_connect (G_OBJECT (te), "key-press-event", G_CALLBACK (hy_textbox_key_interceptor), theParent);
+    g_signal_connect (G_OBJECT (gtk_text_view_get_buffer(GTK_TEXT_VIEW(te))), "changed", G_CALLBACK (hy_textbox_change_notifier), theParent);
+    g_signal_connect (G_OBJECT (gtk_text_view_get_buffer(GTK_TEXT_VIEW(te))), "mark-set", G_CALLBACK (hy_textbox_selchange_notifier), theParent);
+}
+
+//__________________________________________________________________
+
+_HYPlatformTextBox::~_HYPlatformTextBox (void)
+{
+    pango_font_description_free(pLabelFont);
+}
+
+//__________________________________________________________________
+
+void    _HYPlatformTextBox::_SetBackColor (_HYColor& c)
+{
+    backFill = HYColorToGDKColor(c);
+}
+
+//__________________________________________________________________
+
+void    _HYPlatformTextBox::_SetBackTColor (_HYColor& c)
+{
+    backTFill = HYColorToGDKColor(c);
+    GtkTextBuffer * tbuf = gtk_text_view_get_buffer(GTK_TEXT_VIEW(te));
+    gboolean        trueVal = TRUE;
+    GtkTextTag * ct = gtk_text_tag_table_lookup(gtk_text_buffer_get_tag_table(tbuf),"hyphy_texbox_bgtag");
+    if (!ct) {
+        ct = gtk_text_buffer_create_tag (tbuf,"hyphy_texbox_bgtag","background-gdk",&backTFill,"background-set",&trueVal,NULL);
+        ApplyTagToAll (tbuf,ct);
+    } else {
+        g_object_set (ct, "background-gdk",&backTFill,"background-set",&trueVal,NULL);
+    }
+}
+
+
+//__________________________________________________________________
+
+void    _HYPlatformTextBox::_SetForeColor (_HYColor& c)
+{
+    textColor = HYColorToGDKColor(c);
+    GtkTextBuffer * tbuf = gtk_text_view_get_buffer(GTK_TEXT_VIEW(te));
+    gboolean        trueVal = TRUE;
+    GtkTextTag * ct = gtk_text_tag_table_lookup(gtk_text_buffer_get_tag_table(tbuf),"hyphy_texbox_fgtag");
+    if (!ct) {
+        ct = gtk_text_buffer_create_tag (tbuf,"hyphy_texbox_fgtag","foreground-gdk",&textColor,"foreground-set",&trueVal,NULL);
+        ApplyTagToAll (tbuf,ct);
+    } else {
+        g_object_set (ct, "foreground-gdk",&textColor,"foreground-set",&trueVal,NULL);
+    }
+}
+
+
+//__________________________________________________________________
+
+void    _HYPlatformTextBox::_SetFont (_HYFont& f)
+{
+    HYFont2PangoFontDesc(f,pLabelFont);
+    gtk_widget_modify_font (te, pLabelFont);
+}
+
+//__________________________________________________________________
+void        _HYPlatformTextBox::_Update (Ptr p)
+{
+    _Paint (p);
+}
+
+
+//__________________________________________________________________
+void        _HYPlatformTextBox::_SetDimensions (_HYRect r, _HYRect rel)
+{
+    _HYTextBox* theParent = (_HYTextBox *) this;
+    theParent->_HYPlatformComponent::_SetDimensions (r,rel);
+    _SetVisibleSize (rel);
+}
+
+
+//__________________________________________________________________
+void        _HYPlatformTextBox::_SetVisibleSize (_HYRect rel)
+{
+    _HYTextBox *theParent = (_HYTextBox*) this;
+
+    textBoxRect.y       = rel.top   + theParent->margins.top;
+    textBoxRect.x       = rel.left  + theParent->margins.left;
+    textBoxRect.height  = rel.bottom- theParent->margins.bottom - textBoxRect.y + 1;
+    textBoxRect.width   = rel.right - theParent->margins.right  - textBoxRect.x + 1;
+
+    if (te) {
+        bool          newSL = !_NeedMultiLines ();
+        if (newSL!=isSingleLine) {
+            if (((_HYTextBox*)this)->boxFlags & HY_TB_BIGBOX) {
+                if (!newSL) {
+                    gtk_text_view_set_wrap_mode (GTK_TEXT_VIEW (te),GTK_WRAP_CHAR);
+                    gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW(scrollWindow),GTK_POLICY_NEVER,GTK_POLICY_ALWAYS);
+                }
+            } else {
+                gtk_text_view_set_wrap_mode (GTK_TEXT_VIEW (te), newSL?GTK_WRAP_NONE:GTK_WRAP_CHAR);
+            }
+            isSingleLine = newSL;
+        }
+        gtk_fixed_move (GTK_FIXED(theParent->parentWindow), scrollWindow, textBoxRect.x, textBoxRect.y);
+        gtk_widget_set_size_request(scrollWindow,textBoxRect.width,textBoxRect.height);
+    }
+}
+
+
+//__________________________________________________________________
+void        _HYPlatformTextBox::_SetAlignFlags (unsigned char f)
+{
+    if (te) {
+        gtk_text_view_set_justification (GTK_TEXT_VIEW(te), f==HY_ALIGN_LEFT?GTK_JUSTIFY_LEFT:(f==HY_ALIGN_RIGHT?GTK_JUSTIFY_RIGHT:GTK_JUSTIFY_CENTER));
+    }
+}
+
+
+//__________________________________________________________________
+_String     _HYPlatformTextBox::_GetText (void)
+{
+    GtkTextIter               startIT,
+                              endIT;
+
+    GtkTextBuffer             *tbuf = gtk_text_view_get_buffer(GTK_TEXT_VIEW(te));
+    gtk_text_buffer_get_iter_at_offset (tbuf, &startIT, 0);
+    gtk_text_buffer_get_iter_at_offset (tbuf, &endIT, gtk_text_buffer_get_char_count(tbuf));
+    gsize                     br, bw;
+    gchar                     *bufText  = gtk_text_buffer_get_text (tbuf,&startIT,&endIT,true),
+                               *asciiText = g_locale_from_utf8 (bufText, -1, &br, &bw, NULL);
+
+    _String                  *res = new _String ((char*)asciiText);
+    g_free                   (asciiText);
+    g_free                   (bufText);
+    return res;
+}
+
+
+//__________________________________________________________________
+void    _HYPlatformTextBox::_StoreText (_String*& rec, bool selOnly)
+{
+    GtkTextIter               startIT,
+                              endIT;
+
+    GtkTextBuffer             *tbuf = gtk_text_view_get_buffer(GTK_TEXT_VIEW(te));
+    if (selOnly) {
+        if (!gtk_text_buffer_get_selection_bounds (tbuf, &startIT, &endIT)) {
+            rec = new _String;
+            return;
+        }
+    } else {
+        gtk_text_buffer_get_iter_at_offset (tbuf, &startIT, 0);
+        gtk_text_buffer_get_iter_at_offset (tbuf, &endIT, gtk_text_buffer_get_char_count(tbuf));
+    }
+    gsize                     br, bw;
+    gchar                     *bufText  = gtk_text_buffer_get_text (tbuf,&startIT,&endIT,true),
+                               *asciiText = g_locale_from_utf8 (bufText, -1, &br, &bw, NULL);
+
+    rec                      = new _String ((char*)asciiText);
+    g_free                   (asciiText);
+    g_free                   (bufText);
+}
+
+
+//__________________________________________________________________
+bool        _HYPlatformTextBox::_NeedMultiLines (void)
+{
+    if (((_HYTextBox*)this)->boxFlags & HY_TB_BIGBOX) {
+        return 1;
+    } else {
+        return (textBoxRect.height>((_HYTextBox*)this)->editBoxFont.size * 2.5);
+    }
+}
+
+
+//__________________________________________________________________
+void        _HYPlatformTextBox::_SetText (const _String& editBoxText)
+{
+    _HYTextBox * theParent = (_HYTextBox*)this;
+
+    _HYGuiObject* stashRec = theParent->messageRecipient;
+    theParent->SetMessageRecipient (nil);
+    if (editBoxText.sData) {
+        gtk_text_buffer_set_text (gtk_text_view_get_buffer(GTK_TEXT_VIEW(te)),editBoxText.sData,editBoxText.sLength);
+    } else {
+        gtk_text_buffer_set_text (gtk_text_view_get_buffer(GTK_TEXT_VIEW(te)),empty.sData,editBoxText.sLength);
+    }
+
+    theParent->SetMessageRecipient (stashRec);
+}
+
+
+//__________________________________________________________________
+void        _HYPlatformTextBox::_InsertText (const _String& editBoxText, bool append)
+{
+    if (!te) {
+        _SetText (editBoxText);
+    } else {
+        GtkTextIter               startIT,
+                                  endIT;
+        GtkTextBuffer             *tbuf = gtk_text_view_get_buffer(GTK_TEXT_VIEW(te));
+
+        if (append) {
+            gtk_text_buffer_get_selection_bounds (tbuf,&startIT,&endIT);
+            gtk_text_iter_set_offset (&endIT,gtk_text_buffer_get_char_count(tbuf));
+        } else {
+            if (gtk_text_buffer_get_selection_bounds (tbuf,&startIT,&endIT)) {
+                gtk_text_buffer_delete (tbuf, &startIT, &endIT);
+            } else {
+                gtk_text_buffer_insert_at_cursor (tbuf, editBoxText.sData, editBoxText.sLength);
+                return;
+            }
+        }
+        gtk_text_buffer_insert (tbuf, &endIT, editBoxText.sData, editBoxText.sLength);
+        if (append) {
+            gtk_text_iter_set_offset (&endIT,gtk_text_buffer_get_char_count(tbuf));
+            GtkTextMark * endMark = gtk_text_buffer_create_mark(tbuf,NULL,&endIT,false);
+            gtk_text_view_scroll_mark_onscreen (GTK_TEXT_VIEW(te), endMark);
+            gtk_text_buffer_delete_mark (tbuf, endMark);
+        }
+    }
+}
+
+//__________________________________________________________________
+
+void        _HYPlatformTextBox::_EnableTextBox (bool e)
+{
+    if (te) {
+        gtk_widget_set_sensitive(te,e);
+    }
+}
+
+//__________________________________________________________________
+
+void        _HYPlatformTextBox::_FocusComponent (void)
+{
+    if (te) {
+        gtk_widget_grab_focus (te);
+    }
+}
+
+//__________________________________________________________________
+
+void        _HYPlatformTextBox::_UnfocusComponent (void)
+{
+}
+
+//__________________________________________________________________
+
+void        _HYTextBox::_Activate (void)
+{
+    _HYPlatformComponent::_Activate();
+    gtk_widget_show(te);
+    //TBI
+}
+
+//__________________________________________________________________
+
+void        _HYTextBox::_IdleHandler (void)
+{
+}
+
+//__________________________________________________________________
+
+void        _HYTextBox::_Deactivate (void)
+{
+    if (te) {
+        gtk_widget_hide(te);
+    }
+}
+
+//__________________________________________________________________
+
+void    _HYTextBox::_SetSelection (long s, long e)
+{
+    if (te && s>=0 && e>=s) {
+        GtkTextIter               startIT;
+        GtkTextBuffer             *tbuf = gtk_text_view_get_buffer(GTK_TEXT_VIEW(te));
+
+        gtk_text_buffer_get_iter_at_offset (tbuf, &startIT, s);
+        gtk_text_buffer_move_mark_by_name (tbuf, "selection_bound" ,&startIT);
+        long        cCount = gtk_text_buffer_get_char_count (tbuf);
+        if (e<cCount) {
+            e=e+1;
+        } else {
+            e = cCount;
+        }
+        gtk_text_buffer_get_iter_at_offset (tbuf, &startIT, e);
+        gtk_text_buffer_move_mark_by_name (tbuf, "insert" ,&startIT);
+    }
+}
+
+
+
+//__________________________________________________________________
+
+void    _HYTextBox::_MarkForUpdate (void)
+{
+    if (te) {
+        gtk_widget_queue_draw_area (te,0,0,textBoxRect.width,textBoxRect.height);
+    }
+
+    _HYPlatformComponent::_MarkForUpdate();
+}
+
+
+//__________________________________________________________________
+
+bool    _HYTextBox::_IsEmpty (void)
+{
+    if (te) {
+        return !gtk_text_buffer_get_char_count(gtk_text_view_get_buffer(GTK_TEXT_VIEW(te)));
+    }
+    return true;
+}
+
+
+//__________________________________________________________________
+
+void _HYTextBox::_DoCut (bool m)
+{
+    if (te) {
+        gtk_text_buffer_cut_clipboard (gtk_text_view_get_buffer(GTK_TEXT_VIEW(te)), gtk_clipboard_get(GDK_SELECTION_CLIPBOARD), true);
+        if (m&&messageRecipient) {
+            messageRecipient->ProcessEvent (generateTextEditChangeEvent (GetID(),1));
+        }
+    }
+}
+
+//__________________________________________________________________
+
+void _HYTextBox::_DoCopy (bool)
+{
+    if (te) {
+        gtk_text_buffer_copy_clipboard (gtk_text_view_get_buffer(GTK_TEXT_VIEW(te)), gtk_clipboard_get(GDK_SELECTION_CLIPBOARD));
+    }
+}
+
+//__________________________________________________________________
+
+void _HYTextBox::_DoPaste (bool m)
+{
+    if (te) {
+        gtk_text_buffer_paste_clipboard (gtk_text_view_get_buffer(GTK_TEXT_VIEW(te)), gtk_clipboard_get(GDK_SELECTION_CLIPBOARD),NULL,true);
+        if (m&&messageRecipient) {
+            messageRecipient->ProcessEvent (generateTextEditChangeEvent (GetID(),1));
+        }
+    }
+}
+
+
+
+//__________________________________________________________________
+
+void _HYTextBox::_DoUndo (bool m)
+{
+    //TBI
+    //if (m&&messageRecipient)
+    //  messageRecipient->ProcessEvent (generateTextEditChangeEvent (GetID(),1));
+}
+
+//__________________________________________________________________
+
+void _HYTextBox::_DoRedo (bool m)
+{
+    // TBI
+    //if (m&&messageRecipient)
+    //  messageRecipient->ProcessEvent (generateTextEditChangeEvent (GetID(),1));
+}
+
+//__________________________________________________________________
+
+void _HYTextBox::_DoSelectAll (bool m)
+{
+    ((_HYTextBox*)this)->SetSelection (0,0x7fffffff);
+    if (m&&messageRecipient) {
+        messageRecipient->ProcessEvent (generateTextEditChangeEvent (GetID(),0));
+    }
+}
+
+
+//__________________________________________________________________
+
+void _HYTextBox::_DoClear (bool doAll, bool m)
+{
+    if (doAll) {
+        _DoSelectAll (false);
+    }
+    _InsertText (empty, false);
+    if (m&&messageRecipient) {
+        messageRecipient->ProcessEvent (generateTextEditChangeEvent (GetID(),0));
+    }
+}
+
+
+//__________________________________________________________________
+
+void _HYTextBox::_DoFind (_String & st)
+{
+}
+
+
+//__________________________________________________________________
+void        _HYPlatformTextBox::_Paint (Ptr p)
+{
+    _HYTextBox * theParent = (_HYTextBox*)this;
+
+    GdkRectangle        cRect = HYRect2GDKRect(*(_HYRect*)p);
+
+    if (!(theParent->settings.width&HY_COMPONENT_TRANSP_BG) || (theParent->boxFlags & HY_TB_BIGBOX) == 0) {
+        if (theParent->parentWindow->window) {
+            GdkGC *textGC                = gdk_gc_new (theParent->parentWindow->window);
+            GdkRegion * r1 = gdk_region_rectangle(&cRect),
+                        * r2 = gdk_region_rectangle (&textBoxRect);
+
+            gdk_region_subtract    (r1,r2);
+            gdk_region_offset      (r1,theParent->parentWindow->allocation.x,theParent->parentWindow->allocation.y);
+            gdk_gc_set_clip_region (textGC,r1);
+            if ((theParent->settings.width&HY_COMPONENT_TRANSP_BG) == 0) {
+                gdk_gc_set_foreground(textGC,&backFill);
+                gdk_draw_rectangle(theParent->parentWindow->window,textGC,true,cRect.x+theParent->parentWindow->allocation.x,
+                                   cRect.y+theParent->parentWindow->allocation.y, cRect.width, cRect.height);
+            }
+            if ((theParent->boxFlags & HY_TB_BIGBOX) == 0) {
+                gtk_draw_shadow (gtk_widget_get_style (te), theParent->parentWindow->window, GTK_STATE_NORMAL,
+                                 GTK_SHADOW_ETCHED_IN,textBoxRect.x-1+theParent->parentWindow->allocation.x,
+                                 textBoxRect.y-1+theParent->parentWindow->allocation.y, textBoxRect.width+2, textBoxRect.height+2);
+
+            }
+            gdk_region_destroy(r1);
+            gdk_region_destroy(r2);
+            g_object_unref (textGC);
+        }
+    }
+
+    (*theParent)._HYPlatformComponent::_Paint(p);
+}
+
+//__________________________________________________________________
+
+bool _HYTextBox::_ProcessOSEvent (Ptr vEvent)
+{
+    return _HYPlatformComponent::_ProcessOSEvent (vEvent);
+}
+
+//__________________________________________________________________
+void        _HYPlatformTextBox::_CreateTE (void)
+{
+    te                  = nil;
+
+    if (((_HYTextBox*)this)->boxFlags & HY_TB_BIGBOX) {
+        te                  = gtk_text_view_new  ();
+        gtk_text_view_set_wrap_mode (GTK_TEXT_VIEW (te), GTK_WRAP_CHAR);
+        _HYTextBox * theParent = (_HYTextBox*)this;
+        if (te) {
+            gtk_widget_set_app_paintable(te,true);
+            gtk_widget_show   (te);
+            gtk_container_add (GTK_CONTAINER(theParent->parentWindow), te);
+        }
+    }
+}
+//EOF
\ No newline at end of file
diff --git a/src/gui/gtk/HYPlatformComponent.cpp b/src/gui/gtk/HYPlatformComponent.cpp
new file mode 100644
index 0000000..8936524
--- /dev/null
+++ b/src/gui/gtk/HYPlatformComponent.cpp
@@ -0,0 +1,562 @@
+/*
+    A general composite window component object, GTK+ glue
+
+    Sergei L. Kosakovsky Pond, October 2004.
+*/
+
+#include "HYComponent.h"
+#include "HYPlatformComponent.h"
+#include "HYWindow.h"
+#include "HYEventTypes.h"
+#include "HYTableWindow.h"
+#include "HYCanvas.h"
+#include "HYUtils.h"
+
+//__________________________________________________________________________________
+
+
+//extern    RGBColor    menuLine1,
+//                      menuLine2; -- have to fix thouse
+
+// GTK Callbacks
+
+bool        forceUpdateForScrolling = false;
+
+//__________________________________________________________________
+
+gboolean hyphy_event_component_callback(GtkWidget *widget, GdkEvent* theEvent, gpointer   data)
+{
+    _HYComponent* pC = (_HYComponent*) data;
+    if (pC->messageRecipient) {
+        _HY_GTK_UI_Message theMessage = {FALSE,theEvent};
+        ((_HYTWindow*)pC->messageRecipient)->_ProcessOSEvent((Ptr)&theMessage);
+        return theMessage.processingResult;
+    }
+    return FALSE;
+}
+
+//__________________________________________________________________________________
+
+void            AlignRectangle (_HYRect& rel , GdkRectangle& target , unsigned char alFlags)
+{
+    if (alFlags&HY_ALIGN_RIGHT) {
+        target.x  = rel.right + 1 - target.width;
+    } else if (!(alFlags&HY_ALIGN_LEFT)) {
+        target.x = rel.left + (rel.right-rel.left + 1 - target.width)/2;
+    }
+
+    if (alFlags&HY_ALIGN_BOTTOM) {
+        target.y = rel.bottom - target.height + 1;
+    } else if (!(alFlags&HY_ALIGN_TOP)) {
+        target.y = rel.top + (rel.bottom-rel.top + 1 - target.height)/2;
+    }
+}
+
+//__________________________________________________________________
+
+void h_scroll_bar_callback_component (GtkRange *widget, gpointer data)
+{
+    GtkAdjustment* ta = gtk_range_get_adjustment (widget);
+    double newV  = ta->value*(ta->upper/(ta->upper-ta->page_size));
+    _HYComponent * parent_obj = (_HYComponent*)data;
+    long diff = newV-parent_obj->lastHScroll;
+    if (diff) {
+        parent_obj->lastHScroll = newV;
+        parent_obj->ProcessEvent (generateScrollEvent(diff,0));
+    }
+}
+
+//__________________________________________________________________
+
+void v_scroll_bar_callback_component (GtkRange *widget, gpointer data)
+{
+    GtkAdjustment* ta = gtk_range_get_adjustment (widget);
+    double newV  = ta->value*(ta->upper/(ta->upper-ta->page_size));
+    _HYComponent * parent_obj = (_HYComponent*)data;
+    long diff = (newV-parent_obj->lastVScroll);
+    if (diff) {
+        parent_obj->lastVScroll = newV;
+        parent_obj->ProcessEvent (generateScrollEvent(0,diff));
+    }
+}
+
+//__________________________________________________________________
+
+_HYPlatformComponent::_HYPlatformComponent(void)
+{
+    vScroll = hScroll = parentWindow = nil;
+    activationFlag = false;
+}
+
+//__________________________________________________________________
+
+_HYPlatformComponent::_HYPlatformComponent(_HYRect s,Ptr w)
+{
+    activationFlag = false;
+    bool        memError = false;
+    vScroll     = hScroll = nil;
+    parentWindow = (GtkWidget*)w;
+    if (s.width&HY_COMPONENT_V_SCROLL) {
+        GtkObject
+        *v_adj = gtk_adjustment_new(0,0,MAX_CONTROL_VALUE,MAX_CONTROL_VALUE/100.0,MAX_CONTROL_VALUE/10.0,MAX_CONTROL_VALUE/5.0);
+
+        vScroll = gtk_vscrollbar_new  ((GtkAdjustment*)v_adj),
+        gtk_container_add (GTK_CONTAINER (parentWindow), vScroll);
+        gtk_widget_show(vScroll);
+
+        g_signal_connect (G_OBJECT (vScroll), "value-changed",G_CALLBACK (v_scroll_bar_callback_component), (gpointer)((_HYComponent*)this));
+    }
+    if (s.width&HY_COMPONENT_H_SCROLL) {
+        GtkObject
+        *h_adj = gtk_adjustment_new(0,0,MAX_CONTROL_VALUE,MAX_CONTROL_VALUE/100.0,MAX_CONTROL_VALUE/10.0,MAX_CONTROL_VALUE/5.0);
+
+        hScroll = gtk_hscrollbar_new  ((GtkAdjustment*)h_adj),
+        gtk_container_add (GTK_CONTAINER (parentWindow), hScroll);
+        gtk_widget_show(hScroll);
+
+        g_signal_connect (G_OBJECT (hScroll), "value-changed",G_CALLBACK (h_scroll_bar_callback_component), (gpointer)((_HYComponent*)this));
+    }
+    lastHScroll = 0;
+    lastVScroll = 0;
+}
+
+
+//__________________________________________________________________
+
+void _HYPlatformComponent::_CleanUp(void)
+{
+    if (hScroll) {
+        //gtk_widget_destroy(hScroll);
+        hScroll = nil;
+    }
+    if (vScroll) {
+        //gtk_widget_destroy(vScroll);
+        vScroll = nil;
+    }
+}
+
+//__________________________________________________________________
+long        _HYPlatformComponent::_GetScrollerPos (GtkWidget *theSB)
+{
+    if (theSB) {
+        GtkAdjustment* old = gtk_range_get_adjustment (GTK_RANGE(theSB));
+        return old->upper-old->page_size?old->value*(old->upper/(old->upper-old->page_size)):0.0;
+    } else {
+        return 0;
+    }
+}
+
+
+//__________________________________________________________________
+long        _HYPlatformComponent::_GetHScrollerPos (void)
+{
+    return _GetScrollerPos(hScroll);
+}
+//__________________________________________________________________
+long        _HYPlatformComponent::_GetVScrollerPos (void)
+{
+    return _GetScrollerPos(vScroll);
+}
+
+//__________________________________________________________________
+void        _HYPlatformComponent::_SetScrollerPos (GtkWidget *theSB, long nv)
+{
+    if (theSB) {
+        if (nv<0) {
+            nv = 0;
+        } else if (nv>MAX_CONTROL_VALUE) {
+            nv = MAX_CONTROL_VALUE;
+        }
+
+        GtkAdjustment* old = gtk_range_get_adjustment (GTK_RANGE(theSB));
+        //printf ("Setting adjustment value at %d (%d)\n",nv,lastVScroll);
+        //gtk_range_set_value (GTK_RANGE(theSB),old->upper-old->page_size?nv*((old->upper-old->page_size)/old->upper):0.0);
+        gtk_adjustment_set_value (old, old->upper-old->page_size?nv*((old->upper-old->page_size)/old->upper):0.0);
+    } 
+}
+
+//__________________________________________________________________
+void        _HYPlatformComponent::_SetHScrollerPos (long nv)
+{
+    lastHScroll = nv;
+    _SetScrollerPos (hScroll, nv);
+}
+
+//__________________________________________________________________
+void        _HYPlatformComponent::_SetVScrollerPos (long nv)
+{
+    lastVScroll = nv;
+    _SetScrollerPos (vScroll, nv);
+}
+
+
+//__________________________________________________________________
+void _HYPlatformComponent::Duplicate (BaseRef s)
+{
+    // TBI - depending on what calls use it - for now should barf
+
+    _String errMsg ("_HYPlatformComponent::Duplicate is not yet implemented");
+    FlagError (errMsg);
+
+    //_HYComponent* theS = (_HYComponent*)s;
+    //_CleanUp();
+    //hScroll = theS->hScroll;
+    //vScroll = theS->vScroll;
+}
+
+
+//__________________________________________________________________
+void _HYPlatformComponent::_SetDimensions (_HYRect,_HYRect r)
+{
+    _SetVisibleSize (r);
+}
+
+//__________________________________________________________________
+void _HYPlatformComponent::_MarkForUpdate (void)
+{
+    GdkWindow * pW = gtk_widget_get_parent_window (parentWindow);
+    if (pW) {
+        GdkRectangle inv = {parentWindow->allocation.x+rel.left, parentWindow->allocation.y+rel.top,
+                            rel.right-rel.left+1, rel.bottom-rel.top+1
+                           }; // ? offset by 1
+        gdk_window_invalidate_rect (pW, &inv, false);
+        if (forceUpdateForScrolling) {
+            gdk_window_process_updates (pW, false);
+        }
+    }
+}
+//__________________________________________________________________
+void _HYPlatformComponent::_MarkContentsForUpdate (void)
+{
+    GdkWindow * pW = gtk_widget_get_parent_window (parentWindow);
+    if (pW) {
+        GdkRectangle inv = {parentWindow->allocation.x+rel.left, parentWindow->allocation.y+rel.top,
+                            rel.right-rel.left+1, rel.bottom-rel.top+1
+                           }; // ? offset by 1
+        if (hScroll) {
+            inv.height -= hScroll->allocation.height;
+        }
+        if (vScroll) {
+            inv.width  -= vScroll->allocation.height;
+        }
+        gdk_window_invalidate_rect (pW, &inv, false);
+    }
+}
+
+//__________________________________________________________________
+
+void        _HYPlatformComponent::_SetVisibleSize (_HYRect r)
+{
+    _HYComponent * theParent = (_HYComponent*)this;
+
+    long           t,
+                   v,
+                   tt;
+
+    _Parameter  newSize;
+
+    GtkFixed *  wPane = GTK_FIXED(parentWindow);
+
+    if (hScroll&&!vScroll) { // only horizontal scroll bar
+        tt = hScroll->allocation.height;
+        if (tt <= 1) {
+            tt = HY_SCROLLER_WIDTH;
+        }
+
+        gtk_fixed_move (wPane, hScroll, r.left, r.bottom - tt);
+        gtk_widget_set_size_request(hScroll,r.right-r.left+1,tt);
+        t = theParent->GetMaxW();
+        v = r.right-r.left+1;
+
+        if (t>v) {
+            AdjustScroller (hScroll, v, t);
+        } else {
+            AdjustScroller (hScroll, t, t);
+        }
+
+        gtk_widget_set_sensitive(hScroll,t>v);
+    }
+    if (vScroll&&!hScroll) { // only vertical scroll bar
+        tt = vScroll->allocation.width;
+        if (tt <= 1) {
+            tt = HY_SCROLLER_WIDTH;
+        }
+
+        gtk_fixed_move (wPane, vScroll, r.right-tt, r.top);
+        gtk_widget_set_size_request(vScroll,tt,r.bottom-r.top+1);
+        t = theParent->GetMaxH();
+        v = r.bottom-r.top+1;
+        //printf ("Vertical Scroll size %d %d\n", t, v);
+        if (t>v) {
+            AdjustScroller (vScroll, v, t);
+        } else {
+            AdjustScroller (vScroll, t, t);
+        }
+        gtk_widget_set_sensitive(vScroll,t>v);
+    }
+
+    if (vScroll&&hScroll) {
+        tt = hScroll->allocation.height;
+        if (tt <= 1) {
+            tt = HY_SCROLLER_WIDTH;
+        }
+
+        long ttv = vScroll->allocation.width;
+        if (ttv <= 1) {
+            ttv = HY_SCROLLER_WIDTH;
+        }
+
+        gtk_fixed_move                  (wPane, hScroll, r.left, r.bottom - tt + 1);
+        gtk_widget_set_size_request     (hScroll,r.right-r.left-tt+2,tt);
+
+        t = theParent->GetMaxW();
+        v = r.right-r.left+1+ttv;
+
+        if (t>v) {
+            AdjustScroller (hScroll, v, t);
+        } else {
+            AdjustScroller (hScroll, t, t);
+        }
+
+        gtk_widget_set_sensitive(hScroll,t>v);
+        gtk_fixed_move              (wPane, vScroll, r.right-ttv+1, r.top);
+        gtk_widget_set_size_request (vScroll,ttv,r.bottom-r.top+2);
+
+        t = theParent->GetMaxH();
+        v = r.bottom-r.top+1+tt;
+        if (t>v) {
+            AdjustScroller (vScroll, v, t);
+        } else {
+            AdjustScroller (vScroll, t, t);
+        }
+
+        gtk_widget_set_sensitive(vScroll,t>v);
+    }
+    rel = r;
+}
+
+//__________________________________________________________________
+
+void        _HYPlatformComponent::_Paint (Ptr)
+{
+    _HYComponent* parent = (_HYComponent*)this;
+    if (parent->settings.width&(HY_COMPONENT_BORDER|HY_COMPONENT_WELL)) {
+        GdkWindow* pWindow     = gtk_widget_get_parent_window (parentWindow);
+        GdkGC    * tempGC      = gdk_gc_new (pWindow);
+
+        GdkColor lineColor = HYColorToGDKColor ((_HYColor) {
+            0x40,0x40,0x40
+        });
+        gdk_gc_set_line_attributes (tempGC, 1, GDK_LINE_SOLID, GDK_CAP_NOT_LAST, GDK_JOIN_MITER);
+
+        long    hplus = parent->parentWindow->allocation.x,
+                vplus = parent->parentWindow->allocation.y;
+
+        if (parent->settings.width&HY_COMPONENT_BORDER) {
+            gdk_gc_set_foreground      (tempGC, &lineColor);
+
+            if (parent->settings.width&HY_COMPONENT_BORDER_T) {
+                gdk_draw_line (pWindow, tempGC, rel.left+hplus,rel.top+vplus, rel.right-1+hplus,rel.top+vplus);
+            }
+
+            if (parent->settings.width&HY_COMPONENT_BORDER_R) {
+                gdk_draw_line (pWindow, tempGC, rel.right-1+hplus,rel.top+vplus, rel.right-1+hplus,rel.bottom-1+vplus);
+            }
+
+            if (parent->settings.width&HY_COMPONENT_BORDER_B) {
+                gdk_draw_line (pWindow, tempGC, rel.right-1+hplus,rel.bottom-1+vplus, rel.left+hplus,rel.bottom-1+vplus);
+            }
+
+            if (parent->settings.width&HY_COMPONENT_BORDER_L) {
+                gdk_draw_line (pWindow, tempGC, rel.left+hplus,rel.bottom-1+vplus, rel.left+hplus,rel.top+vplus);
+            }
+        }
+
+        if (parent->settings.width&HY_COMPONENT_WELL) {
+            // TBI (the actual sunken thing)
+            gdk_draw_rectangle(pWindow,tempGC,false,rel.left+2+hplus,rel.top+2+vplus,rel.right-rel.left-4+hplus,rel.bottom-rel.top-4+vplus);
+        }
+        g_object_unref (tempGC);
+    }
+}
+
+//__________________________________________________________________
+
+void      _HYPlatformComponent::_Update (Ptr p)
+{
+    _Paint (p);
+}
+
+
+//__________________________________________________________________
+
+void        _HYPlatformComponent::_Activate (void)
+{
+    activationFlag = true;
+}
+
+//__________________________________________________________________
+
+void        _HYPlatformComponent::_Deactivate (void)
+{
+    //printf ("De-act comp\n");
+    activationFlag = false;
+}
+
+
+//__________________________________________________________________
+
+bool _HYPlatformComponent::_ProcessOSEvent (Ptr vEvent)
+{
+    // TBI?
+    return false;
+}
+
+
+//__________________________________________________________________
+
+
+_HYRect _HYPlatformComponent::_VisibleContents (Ptr p)
+{
+    _HYComponent* theParent = (_HYComponent*)this;
+
+    _HYRect     * r = (_HYRect*)p,
+                  res;
+
+    _Parameter    v;
+
+    short windowW   =   r->right-r->left,
+          windowH =   r->bottom-r->top;
+
+    if ((!hScroll)&&(!vScroll)) {
+        res.left    = theParent->hOrigin;
+        res.right   = res.left+windowW;
+        res.top     = theParent->vOrigin;
+        res.bottom  = res.top+windowH;
+        return res;
+    }
+
+    if (hScroll) {
+        windowH-=hScroll->allocation.height>1?hScroll->allocation.height:HY_SCROLLER_WIDTH;
+    }
+    if (vScroll) {
+        windowW-=vScroll->allocation.width>1?vScroll->allocation.width:HY_SCROLLER_WIDTH;
+    }
+
+    if (hScroll) {
+        if (windowW>theParent->GetMaxW()) {
+            res.left = 0;
+            res.right = theParent->GetMaxW();
+        } else {
+            v = _GetHScrollerPos();
+            res.left = (theParent->GetMaxW()-windowW)*v/(double)MAX_CONTROL_VALUE;
+            res.right = res.left+windowW;
+        }
+    } else {
+        res.left = 0;
+        res.right = windowW;
+    }
+    if (vScroll) {
+        if (windowH>theParent->GetMaxH()) {
+            res.top = 0;
+            res.bottom = theParent->GetMaxH();
+        } else {
+            v = _GetVScrollerPos ();
+            res.top = (theParent->GetMaxH()-windowH)*v/(double)MAX_CONTROL_VALUE;
+            res.bottom = res.top+windowH;
+        }
+    } else {
+        res.top = 0;
+        res.bottom = windowH;
+    }
+    return res;
+}
+
+//__________________________________________________________________
+
+void    _HYCanvas::_Paint (Ptr p)
+{
+    _HYRect * destR = (_HYRect*)p;
+
+    GdkRectangle       destRect,
+                       srcRect;
+
+    destRect.width  = destR->right;
+    destRect.height = destR->bottom;
+
+    if (HasHScroll()) {
+        destRect.height-=hScroll->allocation.height;
+    }
+    if (HasVScroll()) {
+        destRect.width-=vScroll->allocation.width;
+    }
+
+    destRect.width  -= destR->left-1;
+    destRect.height -= destR->top-1;
+    destRect.x  = destR->left+parentWindow->allocation.x;
+    destRect.y  = destR->top+parentWindow->allocation.y;
+
+    srcRect = HYRect2GDKRect(_VisibleContents (p));
+
+//  printf ("Canvas paint %d %d %d %d\n", w, h, destRect.width, destRect.height);
+
+    gdk_draw_drawable (GDK_DRAWABLE(parentWindow->window), theContext, thePane, srcRect.x, srcRect.y,
+                       destRect.x, destRect.y, destRect.width, destRect.height);
+
+    _HYPlatformComponent::_Paint(p);
+}
+
+//__________________________________________________________________
+
+void    _HYCanvas::_Update (Ptr p)
+{
+    _Paint(p);
+}
+
+
+//__________________________________________________________________
+
+bool _HYCanvas::_ProcessOSEvent (Ptr vEvent)
+{
+    _HY_GTK_UI_Message *theMessage = (_HY_GTK_UI_Message*)vEvent;
+
+    gdouble   xc,
+              yc;
+
+    gdk_event_get_coords (theMessage->theEvent,&xc,&yc);
+
+    switch (theMessage->theEvent->type) {
+    case GDK_BUTTON_PRESS: {
+        GdkEventButton * be = (GdkEventButton*)theMessage->theEvent;
+
+        if (be->button > 1) {
+            if (exportFormats.lLength==0) {
+                findGraphicsExporterComponents (exportFormats);
+            }
+
+            _String s1 ("Save as a picture"),
+                    s2 ("Save canvas as:"),
+                    filePath;
+            _List   menuOptions;
+            menuOptions && & s1;
+            long    menuChoice;
+            s1 = HandlePullDown (menuOptions,xc,yc,0);
+            menuChoice  = menuOptions.Find (&s1);
+            if (menuChoice==0) {
+                _SavePicture (s2);
+            }
+
+            return true;
+        } else {
+            if (messageRecipient && doMouseClicks) {
+                messageRecipient->ProcessEvent(generateContextPopUpEvent (GetID(),
+                                               xc-parentWindow->allocation.x-rel.left,
+                                               yc-parentWindow->allocation.y-rel.top));
+                return true;
+            }
+        }
+    }
+    }
+    return false;
+}
+
diff --git a/src/gui/gtk/HYPlatformGraphicPane.cpp b/src/gui/gtk/HYPlatformGraphicPane.cpp
new file mode 100644
index 0000000..ba76575
--- /dev/null
+++ b/src/gui/gtk/HYPlatformGraphicPane.cpp
@@ -0,0 +1,548 @@
+/*
+    A painting canvas with double buffer glue for GTK+
+
+    Sergei L. Kosakovsky Pond, October 2004.
+*/
+
+#include "HYGraphicPane.h"
+
+#include "HYUtils.h"
+#include "HYPlatformWindow.h"
+#include "HYComponent.h"
+
+#include <gdk/gdk.h>
+#include <gdk-pixbuf/gdk-pixbuf-io.h>
+
+_String     savePicPrompt               ("Save Picture As:"),
+            savePicAs                  ("File Format:");
+
+_List       exportFormats;
+
+//__________________________________________________________________
+
+void add_if_writable (GdkPixbufFormat *data, _List *list)
+{
+    if (gdk_pixbuf_format_is_writable (data)) {
+        _String tStr (data->name);
+        (*list) && & tStr ;
+    }
+}
+
+//__________________________________________________________________
+
+void        findGraphicsExporterComponents (_List& storeIn)
+{
+    GSList *formats = gdk_pixbuf_get_formats ();
+    g_slist_foreach (formats, (GFunc)add_if_writable, &storeIn);
+    g_slist_free (formats);
+}
+
+//__________________________________________________________________
+
+GdkRectangle HYRect2GDKRect (const _HYRect& hr)
+{
+    return (GdkRectangle) {
+        hr.left, hr.top, hr.right-hr.left+1, hr.bottom-hr.top+1
+    };
+}
+
+//__________________________________________________________________
+
+_HYRect GdkRect2HYRect (const GdkRectangle& hr)
+{
+    return (_HYRect) {
+        hr.y, hr.x, hr.y+hr.height-1, hr.x+hr.width-1,0
+    };
+}
+
+//__________________________________________________________________
+
+void HYFont2PangoFontDesc (const _HYFont& f, PangoFontDescription* theFont)
+{
+    pango_font_description_set_family (theFont, f.face.sData);
+    pango_font_description_set_style  (theFont, (f.style & HY_FONT_ITALIC) ? PANGO_STYLE_ITALIC : PANGO_STYLE_NORMAL);
+    pango_font_description_set_weight (theFont, (f.style & HY_FONT_BOLD) ? PANGO_WEIGHT_BOLD : PANGO_WEIGHT_NORMAL);
+    pango_font_description_set_size   (theFont, f.size*PANGO_SCALE);
+    //pango_font_description_set_absolute_size (theFont, f.size*PANGO_SCALE);
+}
+
+//__________________________________________________________________
+
+_HYPlatformGraphicPane::_HYPlatformGraphicPane(int h, int w, int d)
+{
+    fillColor = (GdkColor) {
+        0,0,0,0
+    };
+    //printf ("Allocating pixmap\n");
+    thePane = gdk_pixmap_new (NULL, w, h, 24/*d<24?d:24*/);
+    //printf ("Allocating context\n");
+    theContext   = gdk_gc_new (thePane);
+    //printf ("Allocating context\n");
+    textLayout   = pango_layout_new (screenPContext);
+    theFont      = pango_font_description_new ();
+    //printf ("Setting colormaps\n");
+    gdk_drawable_set_colormap (thePane, gdk_colormap_get_system ()); // ?
+    gdk_gc_set_colormap (theContext, gdk_colormap_get_system ()); // ?
+
+    charCachePangoItems   = NULL;
+    for (long k=0; k<=60; k=k+1) {
+        cachedCharacterGlyphs[k] = NULL;
+    }
+}
+
+//__________________________________________________________________
+
+_HYPlatformGraphicPane::~_HYPlatformGraphicPane(void)
+{
+    g_object_unref (thePane);
+    g_object_unref (theContext);
+    g_object_unref (textLayout);
+    pango_font_description_free (theFont);
+    _ResetCharGlyphs ();
+}
+
+//__________________________________________________________________
+
+void _HYPlatformGraphicPane::_ResetCharGlyphs(void)
+{
+    if (charCachePangoItems) {
+        g_list_free (charCachePangoItems);
+        charCachePangoItems = NULL;
+    }
+    for (long k=0; k<=60; k=k+1)
+        if (cachedCharacterGlyphs[k]) {
+            pango_glyph_string_free ((PangoGlyphString* )cachedCharacterGlyphs[k]);
+            cachedCharacterGlyphs[k] = NULL;
+        }
+}
+
+//__________________________________________________________________
+
+void _HYPlatformGraphicPane::_BuildCharGlyphs(void)
+{
+    char c[] = "ACGT";
+    PangoAttrList*  natl = pango_attr_list_new          ();
+    PangoAttribute* pafd = pango_attr_font_desc_new    (theFont);
+    pango_attr_list_insert (natl, pafd);
+    charCachePangoItems = pango_itemize (screenPContext, c, 0, 4, natl,NULL);
+    pango_attr_list_unref (natl);
+}
+
+//__________________________________________________________________
+
+void _HYPlatformGraphicPane::_SetPaneSize  (int h,int w, int d)
+{
+    g_object_unref (thePane);
+    g_object_unref (theContext);
+    thePane = gdk_pixmap_new (NULL, w, h, 24/*d<24?d:24*/);
+    theContext   = gdk_gc_new (thePane);
+    gdk_drawable_set_colormap (thePane, gdk_colormap_get_system ()); // ?
+    gdk_gc_set_colormap (theContext, gdk_colormap_get_system ()); // ?
+}
+
+
+//__________________________________________________________________
+
+void _HYPlatformGraphicPane::_DrawLine (_HYRect lineDesc)
+{
+    gdk_gc_set_line_attributes (theContext, lineDesc.width, GDK_LINE_SOLID, GDK_CAP_PROJECTING, GDK_JOIN_MITER);
+    //if (lineDesc.top == lineDesc.bottom)
+    //  gdk_draw_line (thePane, theContext, lineDesc.left, lineDesc.top, lineDesc.right+1, lineDesc.bottom);
+    //else
+    //  if (lineDesc.left == lineDesc.right)
+    //      gdk_draw_line (thePane, theContext, lineDesc.left-1, lineDesc.top, lineDesc.right-1, lineDesc.bottom);
+    //else
+    gdk_draw_line (thePane, theContext, lineDesc.left, lineDesc.top, lineDesc.right, lineDesc.bottom);
+}
+
+
+
+//__________________________________________________________________
+
+void _HYPlatformGraphicPane::_DrawHatchedLine (_HYRect lineDesc)
+{
+    gdk_gc_set_line_attributes (theContext, lineDesc.width, GDK_LINE_ON_OFF_DASH, GDK_CAP_NOT_LAST, GDK_JOIN_MITER);
+    gdk_draw_line (thePane, theContext, lineDesc.left, lineDesc.top, lineDesc.right, lineDesc.bottom);
+}
+
+
+//__________________________________________________________________
+void _HYPlatformGraphicPane::_DisplayText    (_String theText,int t, int l, bool dir)
+{
+    _HYGraphicPane* theParent = (_HYGraphicPane*)this;
+    pango_layout_set_width(textLayout, -1);
+    pango_layout_set_text (textLayout, theText.sData, theText.sLength);
+    PangoLayoutLine* aLine = pango_layout_get_line      (textLayout,0);
+    //gdk_draw_layout (thePane, theContext, l+1, t-theParent->font.size, textLayout);
+    gdk_draw_layout_line (thePane, theContext, l+1,t, aLine);
+}
+
+
+
+//__________________________________________________________________
+void _HYPlatformGraphicPane::_DisplayText    (_String& theText,_HYRect& r, char align)
+{
+    _HYGraphicPane* theParent = (_HYGraphicPane*)this;
+    _EraseRect (r);
+    pango_layout_set_width(textLayout, PANGO_SCALE*(r.right-r.left+1));
+    pango_layout_set_text (textLayout, theText.sData, theText.sLength);
+    GdkRectangle clip_rect = HYRect2GDKRect (r);
+    gdk_gc_set_clip_rectangle  (theContext, &clip_rect);
+    pango_layout_set_alignment (textLayout, align==HY_ALIGN_LEFT?PANGO_ALIGN_LEFT:(align==HY_ALIGN_RIGHT?PANGO_ALIGN_RIGHT:PANGO_ALIGN_CENTER));
+    gdk_draw_layout (thePane, theContext, r.left, r.top, textLayout);
+    gdk_gc_set_clip_rectangle  (theContext, NULL);
+}
+
+//__________________________________________________________________
+void _HYPlatformGraphicPane::_DisplayChar  (char c,int t, int l)
+{
+    if (c>=40 && c<=100) {
+        if (charCachePangoItems == NULL) {
+            _BuildCharGlyphs();
+        }
+        PangoItem * pitem = (PangoItem*) g_list_first (charCachePangoItems)->data;
+        if (!cachedCharacterGlyphs[c-40]) {
+            PangoGlyphString * newString = pango_glyph_string_new ();
+            pango_shape (&c, 1, &pitem->analysis, newString);
+            cachedCharacterGlyphs[c-40] = newString;
+        }
+        gdk_draw_glyphs (thePane, theContext, pitem->analysis.font,l,t,(PangoGlyphString* )cachedCharacterGlyphs[c-40]);
+    } else {
+        _DisplayText (c, t, l, false);
+    }
+}
+
+//__________________________________________________________________
+void _HYPlatformGraphicPane::_SlidePane  (int dv, int dh)
+{
+    _HYGraphicPane* theParent = (_HYGraphicPane*)this;
+    GdkPixbuf* theImage = gdk_pixbuf_get_from_drawable (NULL, thePane, NULL, 0, 0, 0, 0, -1, -1);
+    gdk_draw_pixbuf (thePane, NULL, theImage, 0,0, dh, dv, -1, -1, GDK_RGB_DITHER_NONE, 0, 0);
+    g_object_unref (theImage);
+}
+
+
+//__________________________________________________________________
+void _HYPlatformGraphicPane::_SlideRect (_HYRect& rct, int dv, int dh)
+{
+    _HYGraphicPane* theParent = (_HYGraphicPane*)this;
+
+    GdkRectangle clipped_rect   = HYRect2GDKRect (rct),
+                 full_rect        = {0,0,theParent->w, theParent->h},
+                 clip_rect;
+
+    if (gdk_rectangle_intersect(&clipped_rect, &full_rect, &clip_rect)) {
+        gdk_gc_set_clip_rectangle  (theContext, &clip_rect);
+        GdkPixbuf* theImage = gdk_pixbuf_get_from_drawable (NULL, thePane, NULL, rct.left, rct.top, 0, 0, clip_rect.width, clip_rect.height);
+        gdk_draw_pixbuf (thePane, theContext, theImage, 0,0, clip_rect.x+dh, clip_rect.y+dv, -1,-1, GDK_RGB_DITHER_NONE, 0, 0);
+        g_object_unref (theImage);
+        gdk_gc_set_clip_rectangle  (theContext, NULL);
+    }
+}
+
+//__________________________________________________________________
+void _HYPlatformGraphicPane::_InvertRect (_HYRect& rct)
+{
+    GdkRectangle clip_rect = HYRect2GDKRect (rct);
+    GdkPixbuf* theImage = gdk_pixbuf_get_from_drawable (NULL, thePane, NULL, rct.left, rct.top, 0, 0, clip_rect.width, clip_rect.height);
+    gdk_gc_set_function (theContext,GDK_INVERT);
+    gdk_draw_pixbuf (thePane, theContext, theImage, 0,0, clip_rect.x, clip_rect.y, clip_rect.width, clip_rect.height, GDK_RGB_DITHER_NORMAL, 0, 0);
+    gdk_gc_set_function (theContext,GDK_COPY);
+    g_object_unref (theImage);
+}
+
+
+//__________________________________________________________________
+
+void _HYPlatformGraphicPane::_DrawRect (_HYRect rectDesc)
+{
+    gdk_gc_set_line_attributes (theContext, rectDesc.width, GDK_LINE_SOLID, GDK_CAP_NOT_LAST, GDK_JOIN_MITER);
+    gdk_draw_rectangle         (thePane, theContext, false, rectDesc.left, rectDesc.top,
+                                rectDesc.right-rectDesc.left,rectDesc.bottom-rectDesc.top);
+}
+
+
+//__________________________________________________________________
+
+void _HYPlatformGraphicPane::_FillRect (_HYRect rectDesc)
+{
+    gdk_gc_set_line_attributes (theContext, rectDesc.width, GDK_LINE_SOLID, GDK_CAP_NOT_LAST, GDK_JOIN_MITER);
+    gdk_draw_rectangle         (thePane, theContext, true, rectDesc.left, rectDesc.top,
+                                rectDesc.right-rectDesc.left+1,rectDesc.bottom-rectDesc.top+1);
+}
+
+//__________________________________________________________________
+
+void _HYPlatformGraphicPane::_EraseRect (_HYRect rectDesc)
+{
+    gdk_gc_set_foreground (theContext,&saveBG);
+    _FillRect (rectDesc);
+    gdk_gc_set_foreground (theContext,&saveFG);
+}
+
+
+//__________________________________________________________________
+
+void _HYPlatformGraphicPane::_DrawOval (_HYRect rectDesc)
+{
+    gdk_gc_set_line_attributes (theContext, rectDesc.width, GDK_LINE_SOLID, GDK_CAP_NOT_LAST, GDK_JOIN_MITER);
+    gdk_draw_arc   (thePane, theContext, false, rectDesc.left, rectDesc.top, rectDesc.right-rectDesc.left+1,
+                    rectDesc.bottom-rectDesc.top+1, 0, 64*360);
+}
+
+
+//__________________________________________________________________
+
+void _HYPlatformGraphicPane::_FillOval (_HYRect rectDesc)
+{
+    gdk_gc_set_line_attributes (theContext, rectDesc.width, GDK_LINE_SOLID, GDK_CAP_NOT_LAST, GDK_JOIN_MITER);
+    gdk_draw_arc   (thePane, theContext, true, rectDesc.left, rectDesc.top, rectDesc.right-rectDesc.left+1,
+                    rectDesc.bottom-rectDesc.top+1, 0, 64*360);
+}
+
+//__________________________________________________________________
+
+void _HYPlatformGraphicPane::_EraseOval (_HYRect rectDesc)
+{
+    gdk_gc_set_foreground (theContext,&saveBG);
+    _FillOval (rectDesc);
+    gdk_gc_set_foreground (theContext,&saveFG);
+}
+
+
+//__________________________________________________________________
+
+void _HYPlatformGraphicPane::_DrawArc (_HYRect rectDesc, int s, int f)
+{
+    gdk_gc_set_line_attributes (theContext, rectDesc.width, GDK_LINE_SOLID, GDK_CAP_NOT_LAST, GDK_JOIN_MITER);
+    gdk_draw_arc   (thePane, theContext, false, rectDesc.left, rectDesc.top, rectDesc.right-rectDesc.left+1,
+                    rectDesc.bottom-rectDesc.top+1, (90-s)*64, -64*f);
+}
+//__________________________________________________________________
+
+void _HYPlatformGraphicPane::_FillArc (_HYRect rectDesc, int s, int f)
+{
+    gdk_gc_set_line_attributes (theContext, rectDesc.width, GDK_LINE_SOLID, GDK_CAP_NOT_LAST, GDK_JOIN_MITER);
+    gdk_draw_arc   (thePane, theContext, true, rectDesc.left, rectDesc.top, rectDesc.right-rectDesc.left+1,
+                    rectDesc.bottom-rectDesc.top+1, (90-s)*64, -64*f);
+}
+
+//__________________________________________________________________
+
+void _HYPlatformGraphicPane::_EraseArc (_HYRect rectDesc, int s, int f)
+{
+    gdk_gc_set_foreground (theContext,&saveBG);
+    _FillArc (rectDesc,s,f);
+    gdk_gc_set_foreground (theContext,&saveFG);
+}
+
+
+//__________________________________________________________________
+
+void _HYPlatformGraphicPane::_SetColor  (_HYColor c)
+{
+    saveFG = HYColorToGDKColor(c);
+    gdk_gc_set_foreground (theContext, &saveFG);
+}
+
+//__________________________________________________________________
+
+void _HYPlatformGraphicPane::_SetBColor  (_HYColor c)
+{
+    saveBG = HYColorToGDKColor(c);
+    gdk_gc_set_background (theContext, &saveBG);
+}
+
+
+//__________________________________________________________________
+
+void _HYPlatformGraphicPane::_SetFont (_HYFont f)
+{
+    HYFont2PangoFontDesc(f,theFont);
+    pango_layout_set_font_description (textLayout, theFont ); // ref ?
+    _ResetCharGlyphs ();
+}
+
+//__________________________________________________________________
+
+void _HYPlatformGraphicPane::_SetFontSize (long s)
+{
+    pango_font_description_set_size   (theFont, s*PANGO_SCALE);
+    pango_layout_set_font_description (textLayout, theFont ); // ref ?
+    _ResetCharGlyphs ();
+}
+
+
+
+//__________________________________________________________________
+
+
+void _HYPlatformGraphicPane::_DrawPicRes (_HYRect& r, long id)
+{
+
+    GdkPixbuf* theImage = (GdkPixbuf*)ProcureIconResource(id);
+    if (theImage) {
+
+        if (r.right-r.left<=0) {
+            r.right = r.left + gdk_pixbuf_get_width (theImage);
+        }
+        if (r.bottom-r.top<=0) {
+            r.bottom = r.top + gdk_pixbuf_get_height (theImage);
+        }
+
+        GdkRectangle clip_rect = HYRect2GDKRect (r);
+        if (clip_rect.height != gdk_pixbuf_get_height (theImage) || clip_rect.width != gdk_pixbuf_get_width (theImage)) {
+            GdkPixbuf*  scaledImage = gdk_pixbuf_scale_simple  (theImage, clip_rect.width, clip_rect.height, GDK_INTERP_BILINEAR);
+            checkPointer (scaledImage);
+            gdk_draw_pixbuf (thePane, NULL, scaledImage, 0,0, clip_rect.x, clip_rect.y, clip_rect.width, clip_rect.height, GDK_RGB_DITHER_NORMAL, 0, 0);
+            g_object_unref (scaledImage);
+        } else {
+            //theImage = gdk_pixbuf_add_alpha(theImage,true,255,255,255);
+            // add white transparency
+
+            /*GdkPixbuf * copy = gdk_pixbuf_composite_color_simple (theImage, clip_rect.width, clip_rect.height,GDK_INTERP_BILINEAR,
+                                                                            128,1,0x00ffffff,0x00888888);
+
+            gdk_draw_pixbuf (thePane, NULL, copy, 0,0, clip_rect.x, clip_rect.y, clip_rect.width, clip_rect.height, GDK_RGB_DITHER_NORMAL, 0, 0);
+            g_object_unref (copy);*/
+            // inactive button
+
+            /*GdkPixbuf * copy = gdk_pixbuf_copy(theImage);
+            gdk_pixbuf_fill (copy, 0x000000ff);
+            gdk_pixbuf_composite (theImage, copy, 0, 0, clip_rect.width, clip_rect.height, 0., 0., 1., 1.,GDK_INTERP_BILINEAR, 100);
+            gdk_draw_pixbuf (thePane, NULL, copy, 0,0, clip_rect.x, clip_rect.y, clip_rect.width, clip_rect.height, GDK_RGB_DITHER_NORMAL, 0, 0);
+            g_object_unref (copy);*/
+            // pressed-in
+            gdk_draw_pixbuf (thePane, NULL, theImage, 0,0, clip_rect.x, clip_rect.y, clip_rect.width, clip_rect.height, GDK_RGB_DITHER_NORMAL, 0, 0);
+        }
+    }
+}
+
+
+//__________________________________________________________________
+
+void _HYPlatformGraphicPane::_SetDialogBG (void)
+{
+    ((_HYGraphicPane*)this)->SetBColor(GetDialogBackgroundColor());
+}
+
+//__________________________________________________________________
+
+void _HYPlatformGraphicPane::_StartDraw  (void)
+{
+}
+
+//__________________________________________________________________
+
+void _HYPlatformGraphicPane::_EndDraw    (void)
+{
+}
+
+
+//__________________________________________________________________
+
+void _HYPlatformGraphicPane::_SetPort    (Ptr)
+{
+}
+
+
+
+//__________________________________________________________________
+
+void _HYPlatformGraphicPane::_CopyToClipboard   (void)
+{
+    // TBI
+}
+
+//__________________________________________________________________
+
+void _HYPlatformGraphicPane::_SavePicture   (_String prompt)
+{
+    if (exportFormats.lLength==0) {
+        findGraphicsExporterComponents (exportFormats);
+    }
+    _String s1 ("snapshot"),
+            s2 ("File Format"),
+            filePath;
+
+    long menuChoice = SaveFileWithPopUp (filePath, prompt,s1, s2,exportFormats);
+
+    if (menuChoice >= 0) {
+        GdkPixbuf* theImage = gdk_pixbuf_get_from_drawable (NULL, thePane, NULL, 0, 0, 0, 0, -1, -1);
+        gdk_pixbuf_save (theImage, filePath.sData,((_String*)exportFormats (menuChoice))->sData,NULL,NULL);
+        g_object_unref (theImage);
+    }
+}
+
+//__________________________________________________________________
+
+struct  _HYGDK_Polygon {
+
+    GdkPoint * thePoints;
+    gint       pointCount;
+
+};
+
+//__________________________________________________________________
+
+Ptr _HYPlatformGraphicPane::_DefinePolygon  (_SimpleList& points)
+{
+    if ((points.lLength>=6)&&(points.lLength%2==0)) {
+        _HYGDK_Polygon * thePoly = new _HYGDK_Polygon;
+        thePoly->pointCount =   points.lLength/2;
+        thePoly->thePoints = new GdkPoint [thePoly->pointCount];
+        for (long k=0; k<points.lLength; k+=2) {
+            thePoly->thePoints[k/2].x = points.lData[k];
+            thePoly->thePoints[k/2].y = points.lData[k+1];
+        }
+        return (Ptr)thePoly;
+    }
+    return nil;
+}
+
+//__________________________________________________________________
+
+void _HYPlatformGraphicPane::_KillPolygon   (Ptr rgn)
+{
+    if (rgn) {
+        _HYGDK_Polygon * thePoly = (_HYGDK_Polygon *)rgn;
+        delete thePoly->thePoints;
+        delete thePoly;
+    }
+}
+
+//__________________________________________________________________
+
+void _HYPlatformGraphicPane::_DrawPolygon (Ptr rgn, long width)
+{
+    if (rgn) {
+        gdk_gc_set_line_attributes (theContext, width, GDK_LINE_SOLID, GDK_CAP_NOT_LAST, GDK_JOIN_MITER);
+        _HYGDK_Polygon * thePoly = (_HYGDK_Polygon *)rgn;
+        gdk_draw_polygon (thePane, theContext, false, thePoly->thePoints, thePoly->pointCount);
+    }
+}
+
+//__________________________________________________________________
+
+void _HYPlatformGraphicPane::_FillPolygon (Ptr rgn)
+{
+    if (rgn) {
+        _HYGDK_Polygon * thePoly = (_HYGDK_Polygon *)rgn;
+        gdk_draw_polygon (thePane, theContext, true, thePoly->thePoints, thePoly->pointCount);
+    }
+}
+
+//__________________________________________________________________
+
+void _HYPlatformGraphicPane::_ErasePolygon (Ptr rgn)
+{
+    if (rgn) {
+        gdk_gc_set_foreground (theContext,&saveBG);
+        _FillPolygon (rgn);
+        gdk_gc_set_foreground (theContext,&saveFG);
+    }
+}
+
+
+
+//EOF
\ No newline at end of file
diff --git a/src/gui/gtk/HYPlatformUtils.cpp b/src/gui/gtk/HYPlatformUtils.cpp
new file mode 100644
index 0000000..fa741c1
--- /dev/null
+++ b/src/gui/gtk/HYPlatformUtils.cpp
@@ -0,0 +1,665 @@
+#include "HYUtils.h"
+#include "HYWindow.h"
+#include "hy_strings.h"
+#include "batchlan.h"
+#include <HYGraphicPane.h>
+#include "HYConsoleWindow.h"
+#include <dirent.h>
+#include <sys/stat.h>
+#include <time.h>
+#include <gdk/gdk.h>
+#include <gtk/gtk.h>
+#include <gdk-pixbuf/gdk-pixbuf.h>
+
+
+long                lastPopupMenuSelection      = -1;
+_List               lastPopupMenuItemStrings;
+GtkItemFactoryEntry *lastPopupFactory = nil;
+
+_SimpleList         loadXPM_Index;
+_AVLListX           loadedXPMs (&loadXPM_Index);
+
+extern              PangoContext*               screenPContext;
+
+extern              bool                        updateTimer;
+
+extern              clock_t                     timerStart,
+                    lastTimer;
+
+//________________________________________________________
+_HYRect     GetScreenDimensions (void)
+{
+    GdkScreen * theScreen = gdk_screen_get_default ();
+    return  (_HYRect) {
+        0,0,gdk_screen_get_height (theScreen),gdk_screen_get_width (theScreen),0
+    };
+}
+
+//________________________________________________________
+static void hyphy_popup_menu_callback(gpointer  data, guint menuItem, GtkWidget *widget)
+{
+    lastPopupMenuSelection = menuItem;
+    gtk_main_quit();
+}
+
+//________________________________________________________
+static void hyphy_popup_menu_close(GtkWidget *widget, gpointer userData)
+{
+    //lastPopupMenuSelection = menuItem;
+    //printf ("Close popup\n");
+    if (lastPopupMenuSelection < 0) {
+        //gtk_widget_destroy (widget);
+        gtk_main_quit();
+    }
+}
+
+//__________________________________________________________________________________
+
+void    ListToPopUpMenu (_List& menuOptions)
+{
+    lastPopupFactory = new GtkItemFactoryEntry [menuOptions.lLength];
+    checkPointer (lastPopupFactory);
+
+    long         sepCounter = 0;
+
+    for (long counter=0; counter<menuOptions.lLength; counter++) {
+        _String *postItem = (_String*)(menuOptions(counter)),
+                 * pathID   = new _String("/Popup/"),
+        * itemType = new _String;
+
+        lastPopupFactory[counter].accelerator    = NULL;
+        lastPopupFactory[counter].callback_action = counter;
+        lastPopupFactory[counter].callback       = G_CALLBACK(hyphy_popup_menu_callback);
+        if (*postItem==_String("SEPARATOR")) {
+            *pathID = *pathID & "sep" & (sepCounter++);
+            *itemType = "<Separator>";
+        } else {
+            *pathID = *pathID & *postItem;
+            *itemType = "<Item>";
+        }
+        lastPopupFactory[counter].path = pathID->sData;
+        lastPopupFactory[counter].item_type = itemType->sData;
+        lastPopupMenuItemStrings << pathID;
+        lastPopupMenuItemStrings << itemType;
+
+        DeleteObject (pathID);
+        DeleteObject (itemType);
+    }
+}
+
+//__________________________________________________________________________________
+
+_String HandlePullDown (_List& menuOptions, long l, long t,long startPos)
+{
+    lastPopupMenuSelection = -1;
+    lastPopupMenuItemStrings.Clear();
+    if (lastPopupFactory) {
+        delete lastPopupFactory;
+    }
+
+    if (menuOptions.lLength) {
+        ListToPopUpMenu (menuOptions);
+        GtkWidget *menu;
+
+        int button                  = 0;
+        guint32     event_time      = gtk_get_current_event_time ();
+
+        GtkItemFactory * menu_items = gtk_item_factory_new (GTK_TYPE_MENU_BAR, "<HY_POPUP>", NULL);
+        gtk_item_factory_create_items (menu_items,  menuOptions.lLength, lastPopupFactory, menu);
+
+        menu = gtk_item_factory_get_widget (menu_items, "<HY_POPUP>/Popup");
+        g_signal_connect (menu, "selection-done", (GCallback)hyphy_popup_menu_close, menu_items);
+
+        lastPopupMenuSelection = -1;
+
+        gtk_menu_popup (GTK_MENU (menu), NULL, NULL, NULL, NULL,  button, event_time);
+        gtk_main ();
+        gtk_widget_destroy (menu);
+        g_object_unref(menu_items);
+        if (lastPopupMenuSelection>=0) {
+            return *(_String*)menuOptions (lastPopupMenuSelection);
+        }
+
+    }
+
+    return empty;
+}
+
+//________________________________________________________
+
+long HandlePullDownWithFont (_List& menuOptions, long l, long t,long startPos,_String fName,long fSize)
+{
+    _String selRes = HandlePullDown (menuOptions, l, t, startPos);
+    return menuOptions.Find (&selRes);
+}
+
+//________________________________________________________
+void        CenterWindow (_HYGuiObject* g)
+{
+    _HYWindow* w = (_HYWindow*)g;
+
+    _HYRect   screen = GetScreenDimensions();
+
+    long      cleft = 0, ctop = 0;
+
+    if (screen.right>w->right) {
+        cleft = (screen.right-w->right)/2;
+    }
+    if (screen.bottom>w->bottom) {
+        ctop = (screen.bottom-w->bottom)/2;
+    }
+
+    w->_SetPosition (cleft,ctop);
+}
+
+//_________________________________________________________________________
+
+void    MoveConsoleWindow (_HYRect& newLoc)
+{
+    if (hyphyConsoleWindow) {
+        hyphyConsoleWindow->SetPosition (newLoc.left, newLoc.top);
+        hyphyConsoleWindow->SetWindowRectangle (newLoc.top, newLoc.left,newLoc.bottom,newLoc.right,true);
+    }
+}
+
+//________________________________________________________
+
+void    StartBarTimer(void)
+{
+    timerStart = clock();
+    lastTimer = timerStart;
+    updateTimer = true;
+}
+
+//________________________________________________________
+
+void    StopBarTimer(void)
+{
+    updateTimer = false;
+}
+
+
+//________________________________________________________
+void    ToggleAnalysisMenu (bool running)
+{
+    if (hyphyConsoleWindow)
+        //if (running)
+    {
+        gtk_widget_set_sensitive(gtk_item_factory_get_item_by_action(hyphyConsoleWindow->menu_items, 21), running);
+        gtk_widget_set_sensitive(gtk_item_factory_get_item_by_action(hyphyConsoleWindow->menu_items, 22), running);
+        //gtk_widget_set_sensitive(gtk_item_factory_get_item_by_action(hyphyConsoleWindow->menu_items, 23), false);
+        gtk_widget_set_sensitive(gtk_item_factory_get_item_by_action(hyphyConsoleWindow->menu_items, 24), !running);
+        gtk_widget_set_sensitive(gtk_item_factory_get_item(hyphyConsoleWindow->menu_items, "<HY_WINDOW>/Analysis/Results"), !running);
+        gtk_widget_set_sensitive(gtk_item_factory_get_item_by_action(hyphyConsoleWindow->menu_items, 30), !running);
+    }
+    /*else
+    {
+        gtk_widget_set_sensitive(gtk_item_factory_get_item_by_action(hyphyConsoleWindow->menu_items, 21), false);
+        gtk_widget_set_sensitive(gtk_item_factory_get_item_by_action(hyphyConsoleWindow->menu_items, 22), false);
+        //gtk_widget_set_sensitive(gtk_item_factory_get_item_by_action(hyphyConsoleWindow->menu_items, 23), true);
+        gtk_widget_set_sensitive(gtk_item_factory_get_item_by_action(hyphyConsoleWindow->menu_items, 24), true);
+        gtk_widget_set_sensitive(gtk_item_factory_get_item(hyphyConsoleWindow->menu_items, "<HY_WINDOW>/Analysis/Results"), true);
+        gtk_widget_set_sensitive(gtk_item_factory_get_item_by_action(hyphyConsoleWindow->menu_items, 30), true);
+        //SetStatusBarValue (-1,1,0);
+        //SetStatusLine ("Idle");
+    }*/
+}
+
+//________________________________________________________
+Ptr     ProcureIconResource (long id)
+{
+    long cid = loadedXPMs.Find ((BaseRef)id);
+    if (cid < 0) {
+        _String picFileName = libDirectory & _String("GTKResources/") & id & ".png";
+        GError * pixBufError = nil;
+        GdkPixbuf*  thePixMap = gdk_pixbuf_new_from_file  (picFileName.sData, &pixBufError);
+        if (!thePixMap) {
+            picFileName = _String("Failed to load a pixbuf from file. GTK Error ") & pixBufError -> message;
+            WarnError (picFileName);
+            g_error_free (pixBufError);
+            return nil;
+        }
+        cid = loadedXPMs.Insert ((BaseRef)id, (long)thePixMap);
+    }
+
+    return (Ptr)loadedXPMs.GetXtra(cid);
+}
+
+//________________________________________________________
+long    GetMaxCharWidth (_HYFont& f)
+{
+    _String dumb ('W');
+    return GetVisibleStringWidth (dumb,f);
+    // TBI
+}
+
+//________________________________________________________
+long    GetVisibleStringWidth (_String& s, _HYFont& f)
+{
+    static PangoLayout* textLayout       = pango_layout_new (screenPContext);
+    static PangoFontDescription * fd     = pango_font_description_new ();
+    static _HYFont                         stashedFont;
+
+    if (s.sLength) {
+        if (stashedFont.size!=f.size || stashedFont.style != f.style || stashedFont.face != f.face) {
+            HYFont2PangoFontDesc(f,fd);
+            pango_layout_set_width (textLayout,-1);
+            pango_layout_set_font_description(textLayout,fd);
+            stashedFont = f;
+        }
+        pango_layout_set_text (textLayout, s.sData,s.sLength);
+        //PangoRectangle charPos;
+        //pango_layout_index_to_pos (textLayout,s.sLength-1,&charPos);
+        //return PANGO_PIXELS(charPos.x+charPos.width);
+        PangoRectangle extents,
+                       logical_ext;
+
+        pango_layout_get_pixel_extents (textLayout,&extents,&logical_ext);
+        return logical_ext.width;
+    } else {
+        return 0;
+    }
+
+}
+
+//________________________________________________________
+
+bool handleGUI (bool yield)
+{
+    return gtk_main_iteration_do (!yield);
+}
+
+//_________________________________________________________________________
+_HYColor    GetDialogBackgroundColor (void)
+{
+    if (hyphyConsoleWindow) {
+        GtkStyle* wstyle = gtk_widget_get_style (hyphyConsoleWindow->theWindow);
+        if (wstyle) {
+            GdkColor  bgc = wstyle->bg[0];
+            return (_HYColor) {
+                bgc.red/256, bgc.green/256, bgc.blue/256
+            };
+        }
+    }
+
+    return (_HYColor) {
+        255,255,255
+    };
+}
+
+//_________________________________________________________________________
+
+void    GenerateFontList (_List& fonts)
+{
+    fonts.Clear();
+    PangoFontFamily **families;
+    PangoFontFamily *match_family = NULL;
+    gint n_families, i;
+    pango_context_list_families ((screenPContext),&families, &n_families);
+
+    for (i=0; i<n_families; i++) {
+        fonts.AppendNewInstance(new _String(pango_font_family_get_name (families[i])));
+    }
+    fonts.Sort();
+    g_free (families);
+}
+
+//__________________________________________________________________________________
+char    ScanDirectoryForFileNames (_String& source, _List& rec, bool recurse)
+{
+    DIR * dirPntr = opendir (source.sData);
+    if (dirPntr)
+        /* source directory exists */
+    {
+        struct dirent * curEntry = nil;
+
+        while (curEntry = readdir (dirPntr))
+            // index thru the items
+        {
+            _String childDir (curEntry->d_name);
+            if (childDir.sData[0] != '.') { // invisible file
+                childDir = source & '/' & childDir;
+                struct stat fileInfo;
+                if (stat(childDir.sData, &fileInfo) == 0)
+                    //if (curEntry->d_type == DT_DIR)
+                {
+                    if (S_ISDIR(fileInfo.st_mode))
+                        // a directory
+                    {
+                        if (recurse) {
+                            ScanDirectoryForFileNames (childDir,rec,true);
+                        }
+                    } else
+                        //if (curEntry->d_type == DT_REG)
+                        if (S_ISREG(fileInfo.st_mode)) {
+                            rec && & childDir;
+                        }
+                }
+            }
+        }
+        closedir (dirPntr);
+    }
+    return '/';
+}
+
+//_________________________________________________________________________
+
+bool hyPromptForADirectory = false;
+
+//
+
+void hyphy_store_filename (GtkWidget *widget, gpointer user_data)
+{
+    GtkWidget *file_selector = GTK_WIDGET (user_data);
+    const gchar *selected_filename;
+    selected_filename = gtk_file_selection_get_filename (GTK_FILE_SELECTION (file_selector));
+    *argFileName = selected_filename;
+    DIR * dirPntr = opendir (argFileName->sData);
+    if (dirPntr) {
+        closedir (dirPntr);
+        if (hyPromptForADirectory) {
+            gtk_widget_destroy (file_selector);
+            gtk_main_quit();
+        } else {
+            *argFileName = empty;
+        }
+    } else {
+        if (hyPromptForADirectory) {
+            *argFileName = empty;
+        } else {
+            gtk_widget_destroy (file_selector);
+            gtk_main_quit();
+        }
+    }
+}
+
+
+
+//_________________________________________________________________________
+
+void hyphy_kill_dialog_and_exit (GtkWidget *widget, gpointer user_data)
+{
+    GtkWidget *file_selector = GTK_WIDGET (user_data);
+    gtk_widget_destroy (file_selector);
+    gtk_main_quit();
+}
+
+//_________________________________________________________________________
+
+void hyphy_grab_option (GtkWidget *widget, gpointer user_data)
+{
+    GtkOptionMenu *file_selector = GTK_OPTION_MENU (widget);
+    *((long*)user_data) = gtk_option_menu_get_history(file_selector);
+}
+
+//_________________________________________________________________________
+
+void hyphy_exit_loop (GtkWidget *widget, gpointer user_data)
+{
+    gtk_main_quit();
+}
+
+//_________________________________________________________________________
+bool    PopUpFileDialog(_String ps, _String* defaultLocation)
+{
+    static _String   lastOpenFilePath;
+
+    if (!argFileName) {
+        argFileName = new _String;
+    } else {
+        *argFileName = empty;
+    }
+
+    GtkWidget * fileSelector = gtk_file_selection_new (ps.sData);
+    if (defaultLocation) {
+        gtk_file_selection_set_filename (GTK_FILE_SELECTION (fileSelector), defaultLocation->sData);
+    } else if (lastOpenFilePath.sLength) {
+        gtk_file_selection_set_filename (GTK_FILE_SELECTION (fileSelector), lastOpenFilePath.sData);
+    }
+
+    if (defFileNameValue.sLength) {
+        gtk_entry_set_text(GTK_ENTRY(GTK_FILE_SELECTION (fileSelector)->selection_entry), defFileNameValue.sData);
+    }
+
+    gtk_file_selection_hide_fileop_buttons(GTK_FILE_SELECTION (fileSelector));
+    gtk_file_selection_set_select_multiple (GTK_FILE_SELECTION (fileSelector),false);
+
+    g_signal_connect (GTK_FILE_SELECTION (fileSelector)->ok_button,
+                      "clicked",
+                      G_CALLBACK (hyphy_store_filename),
+                      fileSelector);
+
+
+    g_signal_connect (GTK_FILE_SELECTION (fileSelector)->cancel_button,
+                      "clicked",
+                      G_CALLBACK (hyphy_kill_dialog_and_exit),
+                      fileSelector);
+
+    g_signal_connect_swapped (fileSelector,
+                              "close",
+                              G_CALLBACK (hyphy_exit_loop),
+                              fileSelector);
+
+    gtk_widget_show (fileSelector);
+    gtk_window_set_modal (GTK_WINDOW(fileSelector),true);
+    gtk_main ();
+    printf ("\nPopUpFileDialog:%s\n", argFileName->sData);
+    if (argFileName->sLength) {
+        lastOpenFilePath = argFileName->Cut(0,argFileName->FindBackwards('/',0,-1));
+    }
+
+    return argFileName->sLength;
+}
+
+//________________________________________________________
+
+long    SaveFileWithPopUp (_String& fileName, _String& prompt, _String& defFileName, _String& listLabel, _List& menuOptions)
+{
+    static _String   lastOpenFilePath;
+    long      optionChoice = 0;
+
+    if (!argFileName) {
+        argFileName = new _String;
+    } else {
+        *argFileName = empty;
+    }
+
+    GtkWidget * fileSelector = gtk_file_selection_new (prompt.sData);
+    _String fName = lastOpenFilePath & defFileName;
+    gtk_file_selection_set_filename (GTK_FILE_SELECTION (fileSelector), fName.sData);
+
+    gtk_file_selection_set_select_multiple (GTK_FILE_SELECTION (fileSelector),false);
+
+    GtkWidget * fileFormatOptions = gtk_menu_new ();
+    for (long k = 0; k<menuOptions.lLength; k++) {
+        GtkWidget * optionWidget      = gtk_menu_item_new_with_label (((_String*)menuOptions(k))->sData);
+        gtk_menu_shell_append (GTK_MENU_SHELL (fileFormatOptions), optionWidget);
+        gtk_widget_show (optionWidget);
+    }
+    GtkWidget * fpd = gtk_option_menu_new ();
+    gtk_option_menu_set_menu (GTK_OPTION_MENU (fpd), fileFormatOptions);
+    gtk_option_menu_set_history(GTK_OPTION_MENU (fpd), 0);
+    gtk_widget_show (fpd);
+    GtkWidget* secLabel = gtk_label_new (listLabel.sData);
+    GtkWidget* newBox   = gtk_hbox_new (true,0);
+    gtk_box_pack_start(GTK_BOX(newBox),secLabel,false,false,0);
+    gtk_box_pack_start(GTK_BOX(newBox),fpd,true,false,0);
+    gtk_widget_show (secLabel);
+    gtk_widget_show (newBox);
+
+    gtk_box_pack_end(GTK_BOX(GTK_DIALOG(fileSelector)->vbox),newBox,true,true,0);
+    //gtk_button_box_set_child_secondary (GTK_BUTTON_BOX(GTK_DIALOG(fileSelector)->action_area),newBox,true);
+
+    g_signal_connect (GTK_FILE_SELECTION (fileSelector)->ok_button,
+                      "clicked",
+                      G_CALLBACK (hyphy_store_filename),
+                      fileSelector);
+
+    g_signal_connect (fpd,
+                      "changed",
+                      G_CALLBACK (hyphy_grab_option),
+                      &optionChoice);
+
+
+    g_signal_connect (GTK_FILE_SELECTION (fileSelector)->cancel_button,
+                      "clicked",
+                      G_CALLBACK (hyphy_kill_dialog_and_exit),
+                      fileSelector);
+
+    g_signal_connect_swapped (fileSelector,
+                              "close",
+                              G_CALLBACK (hyphy_exit_loop),
+                              fileSelector);
+
+    gtk_widget_show (fileSelector);
+    gtk_window_set_modal (GTK_WINDOW(fileSelector),true);
+    gtk_main ();
+    fileName = *argFileName;
+    if (argFileName->sLength) {
+        lastOpenFilePath = argFileName->Cut(0,argFileName->FindBackwards('/',0,-1));
+    }
+
+    if (argFileName->sLength) {
+        return optionChoice;
+    }
+    return -1;
+}
+
+//_________________________________________________________________________
+
+void hyphy_store_color (GtkWidget *widget, gpointer user_data)
+{
+    _HYColor *color_ref = (_HYColor*)user_data;
+    GdkColor newColor;
+    gtk_color_selection_get_current_color (GTK_COLOR_SELECTION(widget),&newColor);
+    *color_ref = (_HYColor) {
+        newColor.red/256,newColor.green/256,newColor.blue/256
+    };
+}
+
+//________________________________________________________
+
+_HYColor        SelectAColor (_HYColor& currentColor, _String& prompt)
+{
+    _HYColor newColor = currentColor;
+
+    GtkWidget * fileSelector = gtk_color_selection_dialog_new(prompt.sData);
+    GdkColor    startColor = HYColorToGDKColor(currentColor);
+
+    gtk_color_selection_set_current_color (GTK_COLOR_SELECTION(GTK_COLOR_SELECTION_DIALOG(fileSelector)->colorsel),
+                                           &startColor);
+
+    g_signal_connect (GTK_COLOR_SELECTION_DIALOG (fileSelector)->ok_button,
+                      "clicked",
+                      G_CALLBACK (hyphy_kill_dialog_and_exit),
+                      fileSelector);
+
+
+    g_signal_connect (GTK_COLOR_SELECTION_DIALOG (fileSelector)->colorsel,
+                      "color_changed",
+                      G_CALLBACK (hyphy_store_color),
+                      &newColor);
+
+    g_signal_connect (GTK_COLOR_SELECTION_DIALOG (fileSelector)->cancel_button,
+                      "clicked",
+                      G_CALLBACK (hyphy_kill_dialog_and_exit),
+                      fileSelector);
+
+    g_signal_connect_swapped (GTK_COLOR_SELECTION_DIALOG(fileSelector),
+                              "close",
+                              G_CALLBACK (hyphy_exit_loop),
+                              fileSelector);
+
+    gtk_widget_show (fileSelector);
+    gtk_window_set_modal (GTK_WINDOW(fileSelector),true);
+    gtk_main ();
+    return newColor;
+}
+
+//________________________________________________________
+char        YesNoCancelPrompt (_String& prompt)
+{
+    GtkWidget * theDialog = gtk_message_dialog_new (NULL, GTK_DIALOG_MODAL, GTK_MESSAGE_QUESTION, GTK_BUTTONS_NONE,
+                            "%s",prompt.sData);
+    gtk_dialog_add_buttons (GTK_DIALOG(theDialog), "Cancel", 2, "Yes", 1, "No", 0, NULL);
+    char res =  gtk_dialog_run (GTK_DIALOG(theDialog));
+    gtk_widget_destroy (theDialog);
+    return res;
+}
+
+//_________________________________________________________________________
+void    DelayNMs (long ms)
+{
+    g_usleep(ms*1000);
+}
+
+//_________________________________________________________________________
+void    PositionWindow          (_HYGuiObject* twp, _String* args)
+{
+    _List * argL = args->Tokenize (",");
+    _HYWindow*   tw = (_HYWindow*)twp;
+    if (argL->lLength>=4) {
+        long R[5],
+             k;
+
+        for (k=0; k<4; k++) {
+            R[k] = ((_String*)(*argL)(k))->toNum();
+        }
+        if (argL->lLength>4) {
+            R[4] = ((_String*)(*argL)(4))->toNum();
+        } else {
+            R[4] = 0;
+        }
+
+        _HYRect   wR = GetScreenDimensions  (),
+                  wiR;
+        long      W[4] = {wR.left,wR.top, wR.right, wR.bottom};
+        for (k=0; k<4; k++)
+            if (R[k]<0) {
+                R[k] = W[k] + ((k<2)?-1:1)*R[k];
+            }
+
+        wiR.left    = R[0];
+        wiR.right   = R[2];
+        wiR.top     = R[1];
+        wiR.bottom  = R[3];
+
+        if (wiR.left>=wiR.right) {
+            wiR.right = 1+wiR.left;
+        }
+        if (wiR.top>=wiR.bottom) {
+            wiR.bottom = 1+wiR.top;
+        }
+
+        tw->SetPosition        (wiR.left,wiR.top);
+        tw->SetWindowRectangle (0,0,wiR.bottom-wiR.top,wiR.right-wiR.left);
+
+        if (R[4]>0) {
+            wiR.top         = wiR.bottom+2;
+            wiR.bottom      = wR.bottom - 2;
+            wiR.left        = 5;
+            wiR.right       = wR.right - 2;
+            MoveConsoleWindow (wiR);
+        }
+
+    }
+
+    DeleteObject (argL);
+}
+
+//__________________________________________________________________________________
+void    PlaceStringInClipboard (_String& res,Ptr )
+{
+    gtk_clipboard_set_text (gtk_clipboard_get(GDK_SELECTION_CLIPBOARD),res.sData,res.sLength);
+}
+
+//_________________________________________________________________________
+
+_String ChooseAFolder       (_String& prompt)
+{
+    hyPromptForADirectory = true;
+    PopUpFileDialog (prompt, NULL);
+    hyPromptForADirectory = false;
+    return *argFileName & '/';
+    //return empty;
+}
diff --git a/src/gui/gtk/HYPlatformWindow.cpp b/src/gui/gtk/HYPlatformWindow.cpp
new file mode 100644
index 0000000..57b9b4c
--- /dev/null
+++ b/src/gui/gtk/HYPlatformWindow.cpp
@@ -0,0 +1,724 @@
+/*
+    A  window object - GTK glue.
+
+    Sergei L. Kosakovsky Pond, Fall 2004.
+*/
+
+#include "HYWindow.h"
+#include "HYEventTypes.h"
+#include "HYUtils.h"
+#include "HYPlatformGraphicPane.h"
+#include "HYConsoleWindow.h"
+#include <gtk/gtk.h>
+#include <gdk-pixbuf/gdk-pixbuf.h>
+
+
+//__________________________________________________________________
+extern      _SimpleList windowPtrs,
+            windowObjects;
+
+extern      _String     objectInspectorTitle;
+
+// GTK callbacks
+
+//__________________________________________________________________
+
+void hyphy_menu_item_callback(gpointer  data, guint menuItem, GtkWidget *widget)
+{
+    _HYWindow * parentWindow = (_HYWindow*)(data);
+    parentWindow->_ProcessMenuSelection (menuItem);
+}
+
+//__________________________________________________________________
+
+static gboolean window_event_callback( GtkWidget *widget, GdkEvent* theEvent, gpointer   data )
+{
+    if (theEvent) {
+        _HY_GTK_UI_Message theMessage = {FALSE,theEvent};
+        ((_HYWindow*)data)->_ProcessOSEvent((Ptr)&theMessage);
+        return theMessage.processingResult;
+    }
+    return false;
+}
+
+//__________________________________________________________________
+
+static gboolean window_expose_callback( GtkWidget *widget,  GdkEventExpose* theEvent, gpointer   data )
+{
+    ((_HYWindow*)data)->_PaintHook ((Ptr)theEvent);
+    return FALSE;
+}
+
+//__________________________________________________________________
+
+static gboolean window_noexpose_callback( GtkWidget *widget,  GdkEventNoExpose* theEvent, gpointer   data )
+{
+    ((_HYWindow*)data)->_Paint ((Ptr)theEvent);
+    return TRUE;
+}
+
+
+
+//__________________________________________________________________
+
+static gboolean window_expose_callback_null ( GtkWidget *,  GdkEventExpose*, gpointer  )
+{
+    return TRUE;
+}
+
+//__________________________________________________________________
+
+static void activate_window_callback( GtkWidget *widget, gpointer   data )
+{
+    _HYWindow * parentWindow = (_HYWindow*)(data);
+    parentWindow->Activate();
+}
+
+//__________________________________________________________________
+
+void h_scroll_bar_callback_window (GtkRange *widget, gpointer data)
+{
+    GtkAdjustment* ta = gtk_range_get_adjustment (widget);
+    double newV  = ta->value*(ta->upper/(ta->upper-ta->page_size));
+    _HYWindow * parent_obj = (_HYWindow*)data;
+    parent_obj->ProcessEvent (generateScrollEvent(newV-parent_obj->last_H_Position,0));
+    parent_obj->last_H_Position = newV;
+}
+
+//__________________________________________________________________
+
+void v_scroll_bar_callback_window (GtkRange *widget, gpointer data)
+{
+    GtkAdjustment* ta = gtk_range_get_adjustment (widget);
+    double newV  = ta->value*(ta->upper/(ta->upper-ta->page_size));
+    _HYWindow * parent_obj = (_HYWindow*)data;
+    parent_obj->ProcessEvent (generateScrollEvent(0,newV-parent_obj->last_V_Position));
+    parent_obj->last_V_Position = newV;
+}
+
+//__________________________________________________________________
+
+static void window_resize_callback (GtkWidget *window, GtkAllocation* allocation, gpointer data)
+{
+    _HYWindow * parent_obj = (_HYWindow*)data;
+    //parent_obj->printf ("Size-allocate: %x %d %d %d %d\n",window, allocation->width, allocation->height,parent_obj->windowContent->allocation.width,parent_obj->windowContent->allocation.height);
+    if (parent_obj->last_V_Position<0.) {
+        parent_obj->last_V_Position = 0.0;
+        parent_obj->SetContentSize (parent_obj->contentWidth, parent_obj->contentHeight);
+    }
+    if (allocation->width != parent_obj->lastWW || allocation->height != parent_obj->lastWH) {
+        parent_obj->lastWW = allocation->width;
+        parent_obj->lastWH = allocation->height;
+        parent_obj->SetWindowRectangle (0,0,allocation->height, allocation->width,false);
+    }
+}
+
+//__________________________________________________________________
+
+void AdjustScroller (GtkWidget* scrollbar, long viewport, long size)
+{
+    GtkAdjustment* old = gtk_range_get_adjustment (GTK_RANGE(scrollbar));
+
+    double         newPageSize    = viewport*MAX_CONTROL_VALUE/size,
+                   scaledValue =  old->upper-old->page_size?old->value*(old->upper/(old->upper-old->page_size)):0.0;
+
+    scaledValue *= (old->upper-newPageSize)/old->upper;
+    GtkObject* newAdj = gtk_adjustment_new (scaledValue,0,MAX_CONTROL_VALUE,MAX_CONTROL_VALUE/100.0,MAX_CONTROL_VALUE/10.0,newPageSize);
+    gtk_range_set_adjustment (GTK_RANGE(scrollbar),GTK_ADJUSTMENT(newAdj));
+}
+
+//__________________________________________________________________
+GdkColor    HYColorToGDKColor   (_HYColor hc)
+{
+    GdkColor gc;
+
+    if (hc.R+hc.B+(long)hc.G==765) {
+        gc.pixel = 0x00ffffff;
+        gc.red   =
+            gc.green =
+                gc.blue  = 0xffff;
+    } else {
+        gc.pixel = hc.R*65536L+hc.G*256L+hc.B;
+        gc.red   = hc.R*256;
+        gc.green = hc.G*256;
+        gc.blue  = hc.B*256;
+    }
+
+    return gc;
+}
+
+
+//__________________________________________________________________
+void        _PaintTheCircle (GdkPixbuf * theIcon, GtkWidget * theWindow)
+{
+    if (GTK_WIDGET_MAPPED (theWindow) && GDK_IS_PIXBUF (theIcon))
+        gdk_draw_pixbuf (theWindow->window, nil, theIcon, 0,0,
+                         theWindow->allocation.x + 3,
+                         theWindow->allocation.y+theWindow->allocation.height - 13,
+                         -1,-1, GDK_RGB_DITHER_NONE, 0, 0);
+}
+
+
+//__________________________________________________________________
+
+_HYPlatformWindow::_HYPlatformWindow(unsigned char windowFlag,_String windowTitle,bool windowVisibility, Ptr theParent)
+{
+    lastWW = lastWH = 0;
+    last_H_Position = 0.0;
+    last_V_Position = -1.0;
+
+    if (windowFlag & HY_WINDOW_SHEET) {
+        windowFlag |= HY_WINDOW_DLOG;
+    }
+
+    theWindow = gtk_window_new (GTK_WINDOW_TOPLEVEL);
+
+    // debug color set here
+    /*_HYColor red = {255,0,0};
+    GdkColor redGDK = HYColorToGDKColor(red);
+    gtk_widget_modify_bg (theWindow, GTK_STATE_NORMAL, &redGDK);*/
+
+    gtk_window_set_title (GTK_WINDOW (theWindow), windowTitle.sData);
+    gtk_container_set_border_width (GTK_CONTAINER (theWindow), 0);
+
+    gtk_window_set_default_size (GTK_WINDOW(theWindow),300,250);
+    gtk_window_set_resizable    (GTK_WINDOW(theWindow),windowFlag & HY_WINDOW_SIZE);
+    gtk_widget_set_events       (theWindow,GDK_ALL_EVENTS_MASK-GDK_POINTER_MOTION_HINT_MASK);
+    //gtk_widget_set_events     (theWindow,GDK_POINTER_MOTION_MASK);
+
+    g_signal_connect (G_OBJECT (theWindow), "event",            G_CALLBACK (window_event_callback),     (_HYWindow*)this);
+    g_signal_connect (G_OBJECT (theWindow), "activate-default", G_CALLBACK (activate_window_callback),  (_HYWindow*)this);
+    //g_signal_connect (G_OBJECT (theWindow), "expose-event",       G_CALLBACK (window_expose_callback),    (_HYWindow*)this);
+    // a(and other menu user UI events)
+
+    if (theParent) {
+        gtk_window_set_transient_for (GTK_WINDOW(theWindow), GTK_WINDOW((GtkWidget*)((_HYWindow*)theParent)->theWindow));
+        gtk_window_set_destroy_with_parent (GTK_WINDOW(theWindow),true);
+    }
+
+    windowContent = gtk_fixed_new ();
+    g_signal_connect (G_OBJECT (windowContent), "expose-event", G_CALLBACK (window_expose_callback),    (_HYWindow*)this);
+    //g_signal_connect (G_OBJECT (windowContent), "window-state-event", G_CALLBACK (null_window_state), nil);
+    gtk_widget_set_app_paintable(windowContent,TRUE);
+    gtk_container_set_resize_mode (GTK_CONTAINER(windowContent),GTK_RESIZE_IMMEDIATE);
+
+    menu_items = nil;
+
+    if (windowFlag & HY_WINDOW_DLOG) {
+        windowMB = nil;
+    } else {
+        windowMB = theWindow;
+        ((_HYWindow*)this)->_SetMenuBar  ();
+    }
+
+    gtk_widget_show (windowContent);
+
+    if ((windowFlag&HY_WINDOW_SCROLL)&&(windowFlag&HY_WINDOW_SIZE)) {
+        vbox = gtk_vbox_new (FALSE, 0);
+        hbox = gtk_hbox_new (FALSE, 0);
+
+        GtkObject
+        *v_adj = gtk_adjustment_new(0,0,MAX_CONTROL_VALUE,MAX_CONTROL_VALUE/100.0,MAX_CONTROL_VALUE/10.0,MAX_CONTROL_VALUE/5.0),
+         *h_adj = gtk_adjustment_new(0,0,MAX_CONTROL_VALUE,MAX_CONTROL_VALUE/100.0,MAX_CONTROL_VALUE/10.0,MAX_CONTROL_VALUE/5.0);
+
+        vScroll = gtk_vscrollbar_new  ((GtkAdjustment*)v_adj),
+        hScroll = gtk_hscrollbar_new  ((GtkAdjustment*)h_adj);
+
+        /*GtkWidget * tScroll = gtk_vscrollbar_new ((GtkAdjustment*)t_adj);
+        gtk_widget_set_size_request(tScroll,20,100);
+
+        gtk_fixed_put (GTK_FIXED(windowContent), tScroll, 30,40);
+        gtk_widget_show (tScroll);*/
+
+        gtk_widget_show (hScroll);
+        gtk_widget_show (vScroll);
+        gtk_widget_show (hbox);
+        gtk_widget_show (vbox);
+
+        g_signal_connect (G_OBJECT (vScroll), "value-changed",G_CALLBACK (v_scroll_bar_callback_window), (gpointer)((_HYWindow*)this));
+        g_signal_connect (G_OBJECT (hScroll), "value-changed",G_CALLBACK (h_scroll_bar_callback_window), (gpointer)((_HYWindow*)this));
+
+        gtk_box_pack_start (GTK_BOX (hbox), windowContent, TRUE, TRUE, 0);
+        gtk_box_pack_end   (GTK_BOX (hbox), vScroll, FALSE, FALSE, 0);
+
+        if (windowMB) {
+            gtk_box_pack_start (GTK_BOX (vbox), windowMB, FALSE, FALSE, 0);
+        }
+        gtk_box_pack_start (GTK_BOX (vbox), hbox, TRUE, TRUE, 0);
+        gtk_box_pack_end (GTK_BOX (vbox), hScroll, FALSE, FALSE, 0);
+        gtk_container_add (GTK_CONTAINER (theWindow), vbox);
+    } else {
+        if (windowMB) {
+            hScroll = vScroll = hbox = nil;
+            vbox = gtk_vbox_new (FALSE, 0);
+            gtk_box_pack_start   (GTK_BOX (vbox), windowMB, FALSE, FALSE, 0);
+            gtk_box_pack_end (GTK_BOX (vbox), windowContent, TRUE, TRUE, 0);
+            gtk_widget_show (vbox);
+            gtk_container_add (GTK_CONTAINER (theWindow), vbox);
+        } else {
+            hScroll = vScroll = hbox = vbox = nil;
+            windowFlag &= 123;
+            gtk_container_add (GTK_CONTAINER (theWindow), windowContent);
+        }
+    }
+
+    windowPtrs   << (long)theWindow;
+    windowObjects<< (long)this;
+
+    gtk_window_set_type_hint (GTK_WINDOW(theWindow),windowFlag & HY_WINDOW_DLOG ? GDK_WINDOW_TYPE_HINT_DIALOG : GDK_WINDOW_TYPE_HINT_NORMAL);
+    gtk_window_set_modal        (GTK_WINDOW(theWindow),windowFlag & HY_WINDOW_DLOG);
+    if (windowVisibility) {
+        gtk_widget_show(theWindow);
+    }
+
+    flags = windowFlag;
+
+    g_signal_connect (G_OBJECT (theWindow), "size-allocate",    G_CALLBACK (window_resize_callback),    (_HYWindow*)this);
+}
+
+//__________________________________________________________________
+
+_HYPlatformWindow::~_HYPlatformWindow(void)
+{
+    if (menu_items) {
+        gtk_object_sink (GTK_OBJECT(menu_items));
+    }
+}
+
+//__________________________________________________________________
+
+void _HYPlatformWindow::_SetTitle(const _String & windowTitle)
+{
+    gtk_window_set_title (GTK_WINDOW (theWindow), windowTitle.sData);
+}
+
+//__________________________________________________________________
+
+void _HYPlatformWindow::_Show(void)
+{
+    bool firstShow = !GTK_WIDGET_MAPPED (theWindow);
+    gtk_window_present(GTK_WINDOW (theWindow));
+    if (firstShow) {
+        _HYWindow *pw = ((_HYWindow*)this);
+        pw->SetWindowRectangle (pw->top,pw->left,pw->bottom,pw->right,true);
+    }
+}
+
+//__________________________________________________________________
+
+_HYRect _HYPlatformWindow::_GetWindowRect(void)
+{
+    _HYRect res ;
+
+    gint    x,y;
+    gtk_window_get_position(GTK_WINDOW (theWindow),&x,&y);
+    res.left = x;
+    res.top  = y;
+    gtk_window_get_size(GTK_WINDOW (theWindow),&x,&y);
+    res.right = x+res.left-1;
+    res.bottom = y+res.top-1;
+
+    return res;
+}
+
+
+//__________________________________________________________________
+
+void _HYPlatformWindow::_Hide(void)
+{
+    gtk_widget_hide (GTK_WIDGET(theWindow));
+}
+
+//__________________________________________________________________
+
+_String& _HYPlatformWindow::_GetTitle(void)
+{
+    return      ((_HYWindow*)this)->GetTitle();
+}
+
+//__________________________________________________________________
+
+void _HYPlatformWindow::_SetPosition(int l,int t)
+{
+    gtk_window_move(GTK_WINDOW (theWindow),l,t);
+
+    long deltah = savedLoc.left-l,
+         deltav = savedLoc.top-t;
+    savedLoc.left = l;
+    savedLoc.right -= deltah;
+    savedLoc.top = t;
+    savedLoc.bottom -= deltav;
+}
+
+//__________________________________________________________________
+
+bool _HYPlatformWindow::_Close(Ptr theData)
+{
+    _HYWindow* theParent = (_HYWindow*)this;
+    bool       doit = theParent->ConfirmClose();
+
+    if (doit) {
+        long f = windowObjects.Find((long)this);
+        if (f>=0) {
+            windowObjects.Delete(f);
+            windowPtrs.Delete(f);
+            windowObjectRefs.Delete(f);
+        }
+        if (!theData) {
+            gtk_object_destroy (GTK_OBJECT(theWindow));
+        }
+
+        if (windowPtrs.lLength == 0) {
+            gtk_main_quit();
+        }
+    }
+
+    return doit;
+}
+
+
+//__________________________________________________________________
+
+void _HYPlatformWindow::_Activate(void)
+{
+    if (!GTK_WIDGET_REALIZED (theWindow)) {
+        _Show();
+    }
+
+    _SetMenuBar ();
+}
+
+//__________________________________________________________________
+
+void _HYPlatformWindow::_BringWindowToFront(void)
+{
+    _Show();
+}
+
+//__________________________________________________________________
+
+void _HYPlatformWindow::_Deactivate(void)
+{
+    _UnsetMenuBar();
+}
+
+static GtkItemFactoryEntry hyphy_window_menu_file[] = {
+    { "/_File",         NULL,         NULL,           0, "<Branch>" },
+    { "/File/_Save",     "<control>S", (GtkItemFactoryCallback)hyphy_menu_item_callback,    HY_WINDOW_MENU_ID_FILE+1, "<StockItem>", GTK_STOCK_SAVE },
+    { "/File/_Print",    "<control>P", (GtkItemFactoryCallback)hyphy_menu_item_callback,    HY_WINDOW_MENU_ID_FILE+2, "<StockItem>", GTK_STOCK_OPEN },
+    { "/File/_Close",    "<control>W", (GtkItemFactoryCallback)hyphy_menu_item_callback,    HY_WINDOW_MENU_ID_FILE, "<StockItem>", GTK_STOCK_CLOSE },
+    { "/File/sep1",     NULL,         NULL,           0,                    "<Separator>" },
+    { "/File/S_witch to console", "<control>0",         (GtkItemFactoryCallback)hyphy_menu_item_callback, HY_WINDOW_MENU_ID_FILE-1, "<Item>" },
+    { "/File/Object _inspector", "<control>I",         (GtkItemFactoryCallback)hyphy_menu_item_callback,  HY_WINDOW_MENU_ID_FILE-2, "<Item>" }
+};
+static GtkItemFactoryEntry hyphy_window_menu_edit[] = {
+    { "/_Edit",         NULL,         NULL,           0, "<Branch>" },
+    { "/Edit/_Undo",     "<control>Z", (GtkItemFactoryCallback)hyphy_menu_item_callback,    HY_WINDOW_MENU_ID_EDIT, "<StockItem>", GTK_STOCK_UNDO },
+    { "/Edit/sep1",     NULL,         NULL,           0,                    "<Separator>" },
+    { "/Edit/_Copy",    "<control>C", (GtkItemFactoryCallback)hyphy_menu_item_callback,    HY_WINDOW_MENU_ID_EDIT+1, "<StockItem>", GTK_STOCK_COPY },
+    { "/Edit/_Cut",    "<control>X", (GtkItemFactoryCallback)hyphy_menu_item_callback,    HY_WINDOW_MENU_ID_EDIT+2, "<StockItem>", GTK_STOCK_CUT },
+    { "/Edit/_Paste", "<control>V",         (GtkItemFactoryCallback)hyphy_menu_item_callback, HY_WINDOW_MENU_ID_EDIT+3, "<StockItem>",GTK_STOCK_PASTE },
+    { "/Edit/_Clear", NULL ,         (GtkItemFactoryCallback)hyphy_menu_item_callback, HY_WINDOW_MENU_ID_EDIT+4, "<StockItem>",GTK_STOCK_CLEAR },
+    { "/Edit/Select _All", "<control>A",         (GtkItemFactoryCallback)hyphy_menu_item_callback, HY_WINDOW_MENU_ID_EDIT+5, "<Item>" },
+};
+
+//__________________________________________________________________
+
+bool _HYPlatformWindow::_CleanDefaultMenu (void)
+{
+    if (windowMB && menu_items) {
+        GtkWidget * oiw = gtk_item_factory_get_widget(menu_items,"<HY_WINDOW>/File/Object Inspector");
+        if (oiw) {
+            gtk_item_factory_delete_entries (menu_items, sizeof (hyphy_window_menu_file) / sizeof (hyphy_window_menu_file[0]), hyphy_window_menu_file);
+            gtk_item_factory_delete_entries (menu_items, sizeof (hyphy_window_menu_edit) / sizeof (hyphy_window_menu_edit[0]), hyphy_window_menu_edit);
+            return true;
+        }
+
+    }
+    return false;
+}
+
+
+//__________________________________________________________________
+
+void _HYPlatformWindow::_SetMenuBar(void)
+{
+    _HYWindow* theParent = (_HYWindow*)this;
+    if (windowMB && menu_items == nil) {
+
+        GtkAccelGroup * accel_group = gtk_accel_group_new();
+        menu_items = gtk_item_factory_new (GTK_TYPE_MENU_BAR, "<HY_WINDOW>",accel_group);
+        gtk_item_factory_create_items (menu_items,  sizeof (hyphy_window_menu_file) / sizeof (hyphy_window_menu_file[0]), hyphy_window_menu_file, theParent);
+        gtk_item_factory_create_items (menu_items,  sizeof (hyphy_window_menu_edit) / sizeof (hyphy_window_menu_edit[0]), hyphy_window_menu_edit, theParent);
+        gtk_window_add_accel_group (GTK_WINDOW (theWindow), accel_group);
+        windowMB   = gtk_item_factory_get_widget (menu_items, "<HY_WINDOW>");
+        gtk_widget_show (windowMB);
+        gtk_widget_set_sensitive(gtk_item_factory_get_widget (menu_items,"<HY_WINDOW>/Edit/Undo"),  FALSE);
+        gtk_widget_set_sensitive(gtk_item_factory_get_widget (menu_items,"<HY_WINDOW>/Edit/Copy"),  FALSE);
+        gtk_widget_set_sensitive(gtk_item_factory_get_widget (menu_items,"<HY_WINDOW>/Edit/Cut"),  FALSE);
+        gtk_widget_set_sensitive(gtk_item_factory_get_widget (menu_items,"<HY_WINDOW>/Edit/Paste"),  FALSE);
+        gtk_widget_set_sensitive(gtk_item_factory_get_widget (menu_items,"<HY_WINDOW>/Edit/Clear"),  FALSE);
+        gtk_widget_set_sensitive(gtk_item_factory_get_widget (menu_items,"<HY_WINDOW>/Edit/Select All"),  FALSE);
+
+    } else if (menu_items) {
+        gtk_widget_set_sensitive(gtk_item_factory_get_widget (menu_items,"<HY_WINDOW>/File/Save"),  theParent->IsSaveEnabled());
+        gtk_widget_set_sensitive(gtk_item_factory_get_widget (menu_items,"<HY_WINDOW>/File/Print"), theParent->IsPrintEnabled());
+    }
+}
+
+//__________________________________________________________________
+
+void _HYPlatformWindow::_UnsetMenuBar(void)
+{
+
+}
+
+//__________________________________________________________________
+
+void _HYPlatformWindow::_Paint(Ptr)
+{
+
+}
+
+//__________________________________________________________________
+
+void _HYPlatformWindow::_PaintHook (Ptr p)
+{
+    ((_HYWindow*)this)->Paint(p);
+}
+
+
+//__________________________________________________________________
+
+void _HYPlatformWindow::_Update(Ptr)
+{
+
+}
+
+//__________________________________________________________________
+
+void _HYPlatformWindow::_SetWindowRectangle(int top, int left, int bottom, int right, bool ss)
+{
+    if (ss) {
+        _HYWindow *pW = (_HYWindow*)this;
+        long    menuHeight = 0;
+        if (pW->windowMB) {
+            menuHeight = pW->windowMB->allocation.x;
+            if (menuHeight <= 0) {
+                GtkRequisition sizeReq;
+                gtk_widget_size_request (pW->windowMB,&sizeReq);
+                menuHeight = sizeReq.height;
+            }
+        }
+        gtk_window_resize (GTK_WINDOW(theWindow), right-left+1,bottom-top+1+menuHeight);
+        //if (left || top)
+        //  gtk_window_move(GTK_WINDOW(theWindow),left,top);
+    } else {
+        long      newSize;
+        if (hScroll && vScroll) {
+            _HYWindow* theParent = (_HYWindow*)this;
+            int windowWidth  = windowContent->allocation.width,
+                windowHeight = windowContent->allocation.height;
+
+            gtk_widget_set_sensitive(hScroll,windowWidth < theParent->contentWidth);
+            AdjustScroller (hScroll, windowWidth, theParent->contentWidth);
+
+            gtk_widget_set_sensitive(vScroll,windowHeight < theParent->contentHeight);
+            AdjustScroller (vScroll, windowHeight, theParent->contentHeight);
+        }
+        savedLoc.bottom=savedLoc.top+bottom-top;
+        savedLoc.right=savedLoc.left+right-left;
+    }
+}
+
+//__________________________________________________________________
+
+bool _HYPlatformWindow::_ProcessOSEvent (Ptr vEvent)
+{
+    if (vEvent) {
+        _HYWindow          *theParent = (_HYWindow*)this;
+        _HY_GTK_UI_Message *theMessage = (_HY_GTK_UI_Message*)vEvent;
+
+        switch (theMessage->theEvent->type) {
+        case GDK_DELETE:
+            theMessage->processingResult = (theParent->Close(nil)==false);
+            return true;
+
+        case GDK_FOCUS_CHANGE:
+            if (((GdkEventFocus*)(theMessage->theEvent))->in) {
+                theParent->Activate();
+            }
+            return true;
+
+        case GDK_BUTTON_PRESS:
+            switch (((GdkEventButton*)(theMessage->theEvent))->button) {
+            case 1:
+                //printf ("Left button\n");
+                break;
+            case 2:
+                //printf ("Middle button\n");
+                break;
+            case 3:
+                //printf ("Right button\n");
+                /*{
+                    _List       testMenu;
+                    _String     item ("George");
+                    testMenu && & item;
+                    item = "Bush";
+                    testMenu && & item;
+                    item = "SEPARATOR";
+                    testMenu && & item;
+                    item = "Sucks Ass";
+                    testMenu && & item;
+                    printf ("Menu Selection %s\n", HandlePullDown(testMenu,100,100,0).sData);
+                }*/
+
+                break;
+            }
+            return false;
+
+            //case GDK_CONFIGURE:
+            //{
+            //  GdkEventConfigure * ci = (GdkEventConfigure*)theMessage->theEvent;
+            //  gtk_container_resize_children (GTK_CONTAINER(theWindow));
+            //  _SetWindowRectangle (0,0,ci->height, ci->width,false);
+            //  return true;
+            //}
+        }
+    }
+    return false;
+}
+//__________________________________________________________________
+
+void    _HYPlatformWindow::_SetContentSize (int w, int h)
+{
+    if (hScroll == nil) {
+        return;
+    }
+
+    _HYWindow* theParent = (_HYWindow*)this;
+
+    int     windowW =  windowContent->allocation.width,
+            windowH =  windowContent->allocation.height;
+
+    GdkGeometry windowG;
+    windowG.max_width  = w+vScroll->allocation.width;
+    windowG.max_height = h+hScroll->allocation.height+(windowMB?windowMB->allocation.height:0);
+    gtk_window_set_geometry_hints (GTK_WINDOW(theWindow), NULL, &windowG, (GdkWindowHints)(GDK_HINT_MAX_SIZE));
+
+    //printf ("Window Size Allocation %d %d %d\n", windowG.max_width, windowG.max_height, windowMB->allocation.height);
+
+
+    gtk_widget_set_sensitive(hScroll,w>windowW);
+    AdjustScroller (hScroll, windowW, w);
+
+    gtk_widget_set_sensitive(vScroll,h>windowH);
+    AdjustScroller (vScroll, windowH, h);
+
+}
+
+//__________________________________________________________________
+
+
+void    _HYPlatformWindow::_VisibleContents (int& t,int& l,int& b,int& r)
+{
+    _HYWindow*   theParent = (_HYWindow*)this;
+
+    if (GTK_WIDGET_MAPPED (windowContent)) {
+        if (hScroll) {
+            _Parameter v;
+
+            long  windowH   = windowContent->allocation.height,
+                  windowW   = windowContent->allocation.width;
+
+            if (windowW>theParent->contentWidth) {
+                l = theParent->left;
+                r = theParent->right;
+            } else {
+                GtkAdjustment* old = gtk_range_get_adjustment (GTK_RANGE(hScroll));
+                //printf ("GtkAdjustment %g %g %g\n", old->upper, old->page_size, old->value);
+                if (old->upper-old->page_size) {
+                    v = old->value*(old->upper/(old->upper-old->page_size));
+                    l = theParent->left+(theParent->contentWidth-windowW)*v/(double)MAX_CONTROL_VALUE;
+                } else {
+                    l = theParent->left;
+                }
+                r = l+windowW;
+            }
+            if (windowH>theParent->contentHeight) {
+                t = theParent->top;
+                b = theParent->bottom;
+            } else {
+                GtkAdjustment* old = gtk_range_get_adjustment (GTK_RANGE(vScroll));
+                if (old->upper-old->page_size) {
+                    v = old->value*(old->upper/(old->upper-old->page_size));
+                    t = theParent->top+(theParent->contentHeight-windowH)*v/(double)MAX_CONTROL_VALUE;
+                } else {
+                    t = theParent->top;
+                }
+                b = t+windowH;
+            }
+            //printf ("Visible area %d %d %d %d %d %d\n", windowW, windowH, l, r, t, b);
+        } else {
+            t = theParent->top;
+            l = theParent->left;
+            b = windowContent->allocation.height+t;
+            r = windowContent->allocation.width+l;
+        }
+    } else {
+        t = theParent->top;
+        l = theParent->left;
+        b = theParent->bottom;
+        r = theParent->right;
+    }
+}
+
+
+//__________________________________________________________________
+
+void    _HYPlatformWindow::_SetWindowBackColor (_HYColor newColor)
+{
+    /*Fl_Color new_color = fl_rgb_color (newColor.R, newColor.G, newColor.B);
+    color (new_color);
+    redraw();*/
+}
+
+//__________________________________________________________________
+
+bool    _HYPlatformWindow::_IsHScroll (GtkWidget* ch)
+{
+    return ch == hScroll;
+}
+
+
+//__________________________________________________________________
+
+bool        _HYWindow::_ProcessMenuSelection (long msel)
+{
+    switch (msel) {
+    case HY_WINDOW_MENU_ID_FILE-2: { // show object inspector
+        ShowObjectInspector();
+        return true;
+    }
+    case HY_WINDOW_MENU_ID_FILE-1: { // switch to console
+        if (hyphyConsoleWindow) {
+            hyphyConsoleWindow->BringToFront();
+        }
+        return true;
+    }
+    case HY_WINDOW_MENU_ID_FILE: { // close window
+        Close (nil);
+        return true;
+    }
+    }
+    return false;
+}
+
+//__________________________________________________________________
+
+void _HYPlatformWindow::_SelectWindow (void)
+{
+    _Show();
+}
+
+//EOF
\ No newline at end of file
diff --git a/src/gui/gtk/WindowClasses/HYPlatformBootsrapWindow.cpp b/src/gui/gtk/WindowClasses/HYPlatformBootsrapWindow.cpp
new file mode 100644
index 0000000..cfe8973
--- /dev/null
+++ b/src/gui/gtk/WindowClasses/HYPlatformBootsrapWindow.cpp
@@ -0,0 +1,41 @@
+/*
+    GTK+ portions of the bootstrap window class
+
+    Sergei L. Kosakovsky Pond, Spring 2005.
+*/
+
+#include "HYParameterTable.h"
+
+#ifdef    __HYPHYDMALLOC__
+#include "dmalloc.h"
+#endif
+
+//__________________________________________________________________
+
+
+bool        _HYBootstrapWindow::_ProcessMenuSelection (long msel)
+{
+    switch (msel) {
+    case HY_WINDOW_MENU_ID_FILE+1 : { // file menu
+        DoSave ();
+        return true;
+    }
+
+    case HY_WINDOW_MENU_ID_FILE+2 : { // print menu
+        _HYTable* t =  (_HYTable*)GetCellObject (2,0);
+        t->_PrintTable((_HYTable*)GetCellObject (1,0));
+        return true;
+    }
+    }
+
+    if (_HYTWindow::_ProcessMenuSelection(msel)) {
+        return true;
+    }
+
+    return false;
+}
+
+
+
+
+//EOF
\ No newline at end of file
diff --git a/src/gui/gtk/WindowClasses/HYPlatformChartWindow.cpp b/src/gui/gtk/WindowClasses/HYPlatformChartWindow.cpp
new file mode 100644
index 0000000..56fc33b
--- /dev/null
+++ b/src/gui/gtk/WindowClasses/HYPlatformChartWindow.cpp
@@ -0,0 +1,338 @@
+/*
+    GTK+ Portions of the chart window class
+
+    Sergei L. Kosakovsky Pond, March 2005.
+*/
+
+#include "HYChartWindow.h"
+#include "HYCanvas.h"
+#include "HYUtils.h"
+#include "HYPullDown.h"
+#include "HYDialogs.h"
+
+#include "math.h"
+
+#ifdef    __HYPHYDMALLOC__
+#include "dmalloc.h"
+#endif
+
+extern   _Parameter                pi_const;
+
+#define  HY_CHART_WIN32_MENU_BASE   6000
+#define  HY_CHARTD_WIN32_MENU_BASE  27000
+
+static GtkItemFactoryEntry hyphy_char_window_menu[] = {
+    { "/File/Save _Graphic", "<control><alt>S", (GtkItemFactoryCallback)hyphy_menu_item_callback, HY_WINDOW_MENU_ID_FILE+3, "<Item>"},
+    { "/File/Save _Table", "<control><shift>S", (GtkItemFactoryCallback)hyphy_menu_item_callback, HY_WINDOW_MENU_ID_FILE+4, "<Item>"},
+    { "/File/Pri_nt Table", "<control><shift>S", (GtkItemFactoryCallback)hyphy_menu_item_callback, HY_WINDOW_MENU_ID_FILE+5, "<Item>"},
+    { "/_Chart",            NULL,         NULL,           0,                    "<Branch>" },
+    { "/Chart/Chart _Name", NULL, (GtkItemFactoryCallback)hyphy_menu_item_callback, HY_CHART_WIN32_MENU_BASE+4, "<Item>"},
+    { "/Chart/Chart _Options", NULL, (GtkItemFactoryCallback)hyphy_menu_item_callback, HY_CHART_WIN32_MENU_BASE, "<Item>"},
+    { "/Chart/_Fonts", NULL,         NULL,           0,                 "<Branch>" },
+    { "/Chart/Fonts/_Tickmark Font", NULL, (GtkItemFactoryCallback)hyphy_menu_item_callback, HY_CHART_WIN32_MENU_BASE+1, "<Item>"},
+    { "/Chart/Fonts/_Legend Font", NULL, (GtkItemFactoryCallback)hyphy_menu_item_callback, HY_CHART_WIN32_MENU_BASE+2, "<Item>"},
+    { "/Chart/Fonts/_Axis Label Font", NULL, (GtkItemFactoryCallback)hyphy_menu_item_callback, HY_CHART_WIN32_MENU_BASE+3, "<Item>"},
+    { "/Chart/sep1",            NULL,         NULL,           0,        "<Separator>" },
+    { "/Chart/_Data Processing",            NULL,         NULL,           0,                    "<Branch>" }
+};
+
+static GtkItemFactoryEntry hyphy_distro_window_menu[] = {
+    { "/Cate_gories", NULL, NULL, 0, "<Branch>"},
+    { "/Categories/Define new _variable", NULL, (GtkItemFactoryCallback)hyphy_menu_item_callback, HY_CHARTD_WIN32_MENU_BASE, "<Item>"},
+    { "/Categories/_Delete variable", NULL, (GtkItemFactoryCallback)hyphy_menu_item_callback, HY_CHARTD_WIN32_MENU_BASE+1, "<Item>"},
+    { "/Categories/_Conditional Distribution", NULL, (GtkItemFactoryCallback)hyphy_menu_item_callback, HY_CHARTD_WIN32_MENU_BASE+2, "<Item>"},
+    { "/Categories/sep1",           NULL,         NULL,           0,        "<Separator>" }
+};
+
+//__________________________________________________________________
+
+void _HYChartWindow::_SetMenuBar(void)
+{
+    if (menu_items && !gtk_item_factory_get_widget(menu_items,"<HY_WINDOW>/Chart")) {
+        gtk_item_factory_create_items (menu_items,  sizeof (hyphy_char_window_menu) / sizeof (hyphy_char_window_menu[0]), hyphy_char_window_menu, this);
+
+        GtkMenu *fileMenu = GTK_MENU(gtk_item_factory_get_widget(menu_items,"<HY_WINDOW>/File"));
+        gtk_menu_reorder_child(fileMenu,gtk_item_factory_get_widget_by_action(menu_items,HY_WINDOW_MENU_ID_FILE+3),1);
+        gtk_menu_reorder_child(fileMenu,gtk_item_factory_get_widget_by_action(menu_items,HY_WINDOW_MENU_ID_FILE+4),2);
+        gtk_menu_reorder_child(fileMenu,gtk_item_factory_get_widget_by_action(menu_items,HY_WINDOW_MENU_ID_FILE+5),4);
+        gtk_widget_set_sensitive(gtk_item_factory_get_widget_by_action(menu_items,HY_WINDOW_MENU_ID_EDIT+1),true);
+        gtk_widget_set_sensitive(gtk_item_factory_get_widget_by_action(menu_items,HY_WINDOW_MENU_ID_EDIT+3),true);
+        gtk_widget_set_sensitive(gtk_item_factory_get_widget_by_action(menu_items,HY_WINDOW_MENU_ID_EDIT+5),true);
+
+        /*InsertMenu    (saveMenu,  0xFFFFFFFF, MF_BYPOSITION|MF_STRING, HY_WINDOW_MENU_ID_FILE+1, "Save &Chart\tCtrl-S");
+        InsertMenu      (saveMenu,  0xFFFFFFFF, MF_BYPOSITION|MF_STRING, HY_WINDOW_MENU_ID_FILE+3, "Save &Graphic");
+        InsertMenu      (saveMenu,  0xFFFFFFFF, MF_BYPOSITION|MF_STRING, HY_WINDOW_MENU_ID_FILE+4, "Save &Table");
+
+        InsertMenu      (printMenu, 0xFFFFFFFF, MF_BYPOSITION|MF_STRING, HY_WINDOW_MENU_ID_FILE+2, "Print &Graphic\tCtrl-P");
+        InsertMenu      (printMenu, 0xFFFFFFFF, MF_BYPOSITION|MF_STRING, HY_WINDOW_MENU_ID_FILE+5, "Print &Data");*/
+
+
+
+        for (long k=0; k<chartProcessors.lLength; k++) {
+            _String *thisItem = (_String*)chartProcessors (k),
+                     chopped = thisItem->Cut (thisItem->FindBackwards ('/',0,-1)+1,-1),
+                     type = "<Item>";
+
+            GtkItemFactoryEntry aProcEntry = {NULL,NULL,(GtkItemFactoryCallback)hyphy_menu_item_callback,HY_CHART_WIN32_MENU_BASE+5+k,type.sData};
+            chopped = _String("/Chart/Data Processing/")&chopped;
+            aProcEntry.path = chopped.sData;
+
+            gtk_item_factory_create_items (menu_items,  1, &aProcEntry, this);
+        }
+
+        //ModifyMenu     (chartMenu, 0, MF_BYPOSITION|MF_POPUP, (UINT) saveMenu , "&Save");
+        //ModifyMenu     (chartMenu, 1, MF_BYPOSITION|MF_POPUP, (UINT) printMenu , "&Print");
+
+    }
+}
+
+//__________________________________________________________________
+
+void _HYChartWindow::_UnsetMenuBar(void)
+{
+
+}
+
+//__________________________________________________________________
+
+void        _HYChartWindow::_PrintChart(void)
+{
+    _String printTBI ("Chart printing has not yet been implemented\n");
+    ReportWarning (printTBI);
+}
+
+
+//__________________________________________________________________
+
+
+bool        _HYChartWindow::_ProcessMenuSelection (long msel)
+{
+    switch (msel) {
+    case HY_CHART_WIN32_MENU_BASE: { // chart menu
+        HandleChartOptions ();
+        return true;
+    }
+    case HY_WINDOW_MENU_ID_FILE+1: // save menu
+    case HY_WINDOW_MENU_ID_FILE+3: // save menu
+    case HY_WINDOW_MENU_ID_FILE+4: { // save menu
+        DoSave ((msel==HY_WINDOW_MENU_ID_FILE-1)?0:msel-HY_WINDOW_MENU_ID_FILE-2);
+        return true;
+    }
+    case HY_WINDOW_MENU_ID_FILE+2: // print menu
+    case HY_WINDOW_MENU_ID_FILE+5: { // print menu
+        DoPrint ((msel==HY_WINDOW_MENU_ID_FILE+2)?0:-1);
+        return true;
+    }
+    case HY_CHART_WIN32_MENU_BASE+1: // font menu
+    case HY_CHART_WIN32_MENU_BASE+2: // font menu
+    case HY_CHART_WIN32_MENU_BASE+3: { // font menu
+        DoChangeFont (msel-HY_CHART_WIN32_MENU_BASE-1);
+        return true;
+    }
+    case HY_CHART_WIN32_MENU_BASE+4: { // chart name
+        RenameChartWindow ();
+        return true;
+    }
+    default: { // proc menu
+        if (msel>=HY_CHART_WIN32_MENU_BASE+5) {
+            ExecuteProcessor (msel-HY_CHART_WIN32_MENU_BASE-5);
+            return true;
+        }
+    }
+    }
+
+    return _HYTWindow::_ProcessMenuSelection(msel);
+}
+
+//__________________________________________________________________
+
+bool _HYChartWindow::_ProcessOSEvent (Ptr vEvent)
+{
+    static long   lastH = -1,
+                  lastV = -1;
+
+    if (!_HYTWindow::_ProcessOSEvent (vEvent)) {
+        if (components.lLength == 0) {
+            return false;
+        }
+
+        _HYPullDown *p1 = (_HYPullDown*)GetObject (4);
+
+        if (p1&&(p1->GetSelection()>=8)&&(ySeries.lLength)) {
+
+            _HY_GTK_UI_Message *theMessage = (_HY_GTK_UI_Message*)vEvent;
+
+            gdouble   xc,
+                      yc;
+
+            gdk_event_get_coords (theMessage->theEvent,&xc,&yc);
+            switch (theMessage->theEvent->type) {
+            case GDK_BUTTON_PRESS: {
+                if (((GdkEventButton*)theMessage->theEvent)->button != 1) {
+                    return false;
+                }
+
+                lastH = xc-theWindow->allocation.x-windowContent->allocation.x;
+                lastV = yc-theWindow->allocation.y-windowContent->allocation.y;
+
+                if (FindClickedCell(lastH, lastV)!=0) { // the chart
+                    lastH = -1;
+                    lastV = -1;
+                } else {
+                    gdk_pointer_grab (theWindow->window,false,
+                                      (GdkEventMask)(GDK_POINTER_MOTION_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK),
+                                      theWindow->window, NULL, ((GdkEventButton*)theMessage->theEvent)->time);
+                    return      true;
+                }
+                break;
+            }
+
+            case GDK_BUTTON_RELEASE: {
+                if (lastH>=0) {
+                    gdk_pointer_ungrab (((GdkEventButton*)theMessage->theEvent)->time);
+                    lastH = -1;
+                    lastV = -1;
+                    return  true;
+                }
+                break;
+            }
+
+            case GDK_MOTION_NOTIFY: {
+                if (lastH>=0) {
+                    long        newH = xc-theWindow->allocation.x-windowContent->allocation.x,
+                                newV = yc-theWindow->allocation.y-windowContent->allocation.y;
+
+                    bool        redraw = false;
+
+                    _Parameter  stepper = pi_const/180.;
+
+                    if (abs(newH-lastH)>abs(newV-lastV)) {
+                        stepper *= 1+log (fabs(newH-lastH))/log(2.0);
+                        if (newH-lastH<0) {
+                            if (xyAngle>0.0) {
+                                xyAngle -= stepper;
+                                if (xyAngle<0) {
+                                    xyAngle = 0;
+                                }
+                                redraw = true;
+                            }
+                        } else if (xyAngle<pi_const/2) {
+                            xyAngle += stepper;
+                            if (xyAngle>pi_const/2) {
+                                xyAngle = pi_const/2;
+                            }
+                            redraw = true;
+                        }
+                    } else {
+                        if (newV==lastV) {
+                            return false;
+                        }
+                        stepper *= 1+log (fabs(newV-lastV))/log(2.0);
+                        if (newV-lastV>0) {
+                            if (zAngle<pi_const/2) {
+                                zAngle += stepper;
+                                if (zAngle>pi_const/2) {
+                                    zAngle = pi_const/2;
+                                }
+                                redraw = true;
+                            }
+                        } else if (zAngle>0.0) {
+                            zAngle -= stepper;
+                            if (zAngle<0) {
+                                zAngle = 0;
+                            }
+                            redraw = true;
+                        }
+
+                    }
+
+                    if (redraw) {
+                        ComputeProjectionSettings();
+                        projectionMatrix = ComputeProjectionMatrix   ();
+                        forceUpdateForScrolling = true;
+                        DrawChart();
+                        forceUpdateForScrolling = false;
+                    }
+
+                    lastH = newH;
+                    lastV = newV;
+                }
+                break;
+            }
+            }
+        }
+        return false;
+    }
+    return true;
+}
+
+//__________________________________________________________________
+
+void _HYChartWindow::_CopyChart (void)
+{
+    //_HYStretchCanvas    *sc = (_HYStretchCanvas*)GetObject (0);
+    //PlaceBitmapInClipboard (sc->paneBitMap, theWindow);
+}
+
+//__________________________________________________________________
+
+void _HYDistributionChartWindow::_SetMenuBar(void)
+{
+    if (menu_items && !gtk_item_factory_get_widget(menu_items,"<HY_WINDOW>/Categories")) {
+        _HYChartWindow::_SetMenuBar();
+        gtk_item_factory_create_items (menu_items,  sizeof (hyphy_distro_window_menu) / sizeof (hyphy_distro_window_menu[0]), hyphy_distro_window_menu, this);
+
+        if (distribProcessors.lLength > 0) {
+            for (long k=0; k<distribProcessors.lLength; k++) {
+                _String *thisItem = (_String*)distribProcessors (k),
+                         chopped = thisItem->Cut (thisItem->FindBackwards ('/',0,-1)+1,-1),
+                         type = "<Item>";
+
+                GtkItemFactoryEntry aProcEntry = {NULL,NULL,(GtkItemFactoryCallback)hyphy_menu_item_callback,HY_CHARTD_WIN32_MENU_BASE+3+k,type.sData};
+                chopped = _String("/Categories/")&chopped;
+                aProcEntry.path = chopped.sData;
+
+                gtk_item_factory_create_items (menu_items,  1, &aProcEntry, this);
+            }
+        }
+    }
+}
+
+//__________________________________________________________________
+
+void _HYDistributionChartWindow::_UnsetMenuBar(void)
+{
+    _HYChartWindow::_UnsetMenuBar();
+}
+
+//__________________________________________________________________
+
+bool _HYDistributionChartWindow::_ProcessMenuSelection (long msel)
+{
+    switch (msel) {
+    case HY_CHARTD_WIN32_MENU_BASE: {
+        AddVariable ();
+        return true;
+    }
+    case HY_CHARTD_WIN32_MENU_BASE+1: {
+        RemoveVariable ();
+        return true;
+    }
+    case HY_CHARTD_WIN32_MENU_BASE+2: {
+        ShowMarginals ();
+        return true;
+    }
+    default: {
+        if (msel>=HY_CHARTD_WIN32_MENU_BASE+3) {
+            HandleCatPostProcessor (msel-HY_CHARTD_WIN32_MENU_BASE-3);
+            return true;
+        }
+    }
+    }
+
+    return _HYChartWindow::_ProcessMenuSelection(msel);
+}
+
+
+
+//EOF
\ No newline at end of file
diff --git a/src/gui/gtk/WindowClasses/HYPlatformConsoleWindow.cpp b/src/gui/gtk/WindowClasses/HYPlatformConsoleWindow.cpp
new file mode 100644
index 0000000..7ecb6d8
--- /dev/null
+++ b/src/gui/gtk/WindowClasses/HYPlatformConsoleWindow.cpp
@@ -0,0 +1,563 @@
+/*
+    GTK Portions of the console window class
+
+    Sergei L. Kosakovsky Pond, Spring 2005.
+*/
+
+#include "HYConsoleWindow.h"
+#include "HYTextBox.h"
+#include "HYDialogs.h"
+#include "HYUtils.h"
+#include "HYEventTypes.h"
+#include "time.h"
+#include "batchlan.h"
+
+#include "HYGraphicPane.h"
+#include "HYDataPanel.h"
+#include "HYSharedMain.h"
+
+GdkColor        _DARKGREYBRUSH_    = HYColorToGDKColor((_HYColor)
+{
+    100,100,100
+});
+GdkColor        _WHITEBRUSH_       = HYColorToGDKColor((_HYColor)
+{
+    255,255,255
+});
+
+GdkGC*          _hyConsoleWindowGC = nil;
+PangoLayout*    _hyConsoleLayout   = nil;
+
+PangoFontDescription    *statusBarBold,
+                        *statusBarNormal;
+
+clock_t                 lastMeasure = 0;
+
+#define                 RECENT_FILE_ITEMS 10
+
+
+//__________________________________________________________________
+
+
+extern  clock_t  timerStart,
+        lastTimer;
+
+void             displayAbout        (bool);
+void             getUserFont         (void);
+
+//__________________________________________________________________
+
+static GtkItemFactoryEntry hyphy_console_window_menu_file[] = {
+    { "/File/_New",             NULL,         NULL,         0, "<Branch>" },
+    { "/File/New/New _Tree",      "<control>N",       (GtkItemFactoryCallback)hyphy_menu_item_callback,         70, "<Item>" },
+    { "/File/New/New _Model",     "<control><mod>N",      (GtkItemFactoryCallback)hyphy_menu_item_callback,         71, "<Item>" },
+    { "/File/New/New _Chart",     "<control><shift>N",  (GtkItemFactoryCallback)hyphy_menu_item_callback,           72, "<Item>" },
+    {
+        "/File/New/New _Genetic Code",
+        NULL,         (GtkItemFactoryCallback)hyphy_menu_item_callback,         73, "<Item>"
+    },
+    {
+        "/File/New/New S_QLite Database",
+        NULL,         (GtkItemFactoryCallback)hyphy_menu_item_callback,         74, "<Item>"
+    },
+
+    { "/File/_Open",                NULL,         NULL,         0, "<Branch>" },
+    { "/File/Open/Open _Batch File",      "<control>O",       (GtkItemFactoryCallback)hyphy_menu_item_callback,         80, "<Item>" },
+    { "/File/Open/Open _Data File",     "<control><alt>O",    (GtkItemFactoryCallback)hyphy_menu_item_callback,         81, "<Item>" },
+    { "/File/Open/Open _Tree File",     "<control><shift>O",    (GtkItemFactoryCallback)hyphy_menu_item_callback,           82, "<Item>" },
+    { "/File/Open/sep1",            NULL,         NULL,           0,                    "<Separator>" },
+    { "/File/Open/Open _Recent",            NULL,         NULL,           0,                    "<Branch>" },
+    { "/File/Open/Open Recent/_Clear menu",      NULL,        (GtkItemFactoryCallback)hyphy_menu_item_callback,         1999, "<Item>" },
+    { "/File/Open/Open Recent/sep1",            NULL,         NULL,           0,                    "<Separator>" },
+    { "/File/Open/sep2",            NULL,         NULL,           0,                    "<Separator>" },
+    { "/File/Open/Open Te_xt File",     NULL,    (GtkItemFactoryCallback)hyphy_menu_item_callback,          83, "<Item>" },
+    { "/File/Open/Open Ta_ble",     NULL,    (GtkItemFactoryCallback)hyphy_menu_item_callback,              84, "<Item>" },
+    { "/File/Open/Open S_QLite Database",     NULL,    (GtkItemFactoryCallback)hyphy_menu_item_callback,                85, "<Item>" },
+    { "/File/sep1",         NULL,         NULL,           0,                    "<Separator>" },
+    { "/File/_Quit",     "<control>Q",    (GtkItemFactoryCallback)hyphy_menu_item_callback,             15, "<StockItem>",GTK_STOCK_QUIT },
+    { "/Edit/sep_pref",     NULL,    NULL,              0, "<Separator>" },
+    { "/Edit/Pre_ferences",     NULL,    (GtkItemFactoryCallback)hyphy_menu_item_callback,              27, "<Item>" },
+    { "/_Analysis",         NULL,         NULL,           0,                    "<Branch>" } ,
+    { "/Analysis/_Cancel execution",     "<control>.",    (GtkItemFactoryCallback)hyphy_menu_item_callback,             21, "<Item>"},
+    { "/Analysis/_Suspend execution",     "<control>;",    (GtkItemFactoryCallback)hyphy_menu_item_callback,                22, "<Item>"},
+    { "/Analysis/sep1",         NULL,         NULL,           0,                    "<Separator>" },
+    { "/Analysis/_View messages.log",     NULL,    (GtkItemFactoryCallback)hyphy_menu_item_callback,                23, "<Item>"},
+    { "/Analysis/sep2",         NULL,         NULL,           0,                    "<Separator>" },
+    { "/Analysis/_Standard analyses...",     "<control>E",    (GtkItemFactoryCallback)hyphy_menu_item_callback,             24, "<Item>"},
+    { "/Analysis/Results",          NULL,         NULL,           0,                    "<Branch>" } ,
+    { "/Analysis/_Rerun last analysis",     "<control>R",    (GtkItemFactoryCallback)hyphy_menu_item_callback,              30, "<Item>"},
+    { "/Analysis/sep3",         NULL,         NULL,           0,                    "<Separator>" },
+    { "/Analysis/Co_mpute expression",     "<control>K",    (GtkItemFactoryCallback)hyphy_menu_item_callback,               60, "<Item>"},
+    { "/Analysis/_Execute selection",     NULL,    (GtkItemFactoryCallback)hyphy_menu_item_callback,                61, "<Item>"}
+};
+
+//__________________________________________________________________
+
+void _HYConsoleWindow::_SetMenuBar(void)
+{
+    if (menu_items && !gtk_item_factory_get_item(menu_items,"<HY_WINDOW>/Analysis")) {
+        gtk_item_factory_delete_item (menu_items, "<HY_WINDOW>/File/Open");
+        gtk_item_factory_delete_item (menu_items, "<HY_WINDOW>/File/Close");
+        gtk_item_factory_delete_item (menu_items, "<HY_WINDOW>/File/Switch to console");
+        gtk_item_factory_create_items (menu_items,  sizeof (hyphy_console_window_menu_file) / sizeof (hyphy_console_window_menu_file[0]), hyphy_console_window_menu_file, this);
+
+        GtkMenu * fileMenu = GTK_MENU (gtk_item_factory_get_widget (menu_items, "<HY_WINDOW>/File"));
+        gtk_menu_reorder_child (fileMenu, gtk_item_factory_get_item (menu_items, "<HY_WINDOW>/File/New"), 0);
+        gtk_menu_reorder_child (fileMenu, gtk_item_factory_get_item (menu_items, "<HY_WINDOW>/File/Open"), 1);
+        gtk_menu_reorder_child (fileMenu, gtk_item_factory_get_item (menu_items, "<HY_WINDOW>/File/sep1"), 2);
+
+        gtk_widget_set_sensitive(gtk_item_factory_get_widget (menu_items,"<HY_WINDOW>/Edit/Clear"),  true);
+        gtk_widget_set_sensitive(gtk_item_factory_get_widget (menu_items,"<HY_WINDOW>/Edit/Select All"),  true);
+        gtk_widget_set_sensitive(gtk_item_factory_get_widget_by_action(menu_items,21),  false);
+        gtk_widget_set_sensitive(gtk_item_factory_get_widget_by_action(menu_items,22),  false);
+        gtk_widget_set_sensitive(gtk_item_factory_get_item (menu_items,"<HY_WINDOW>/Analysis/Results"),  false);
+        gtk_widget_set_sensitive(gtk_item_factory_get_widget_by_action(menu_items,30),  false);
+
+        for (long counter=0; counter<availablePostProcessors.countitems(); counter++) {
+            _String * postItem = (_String*)(*(_List*)availablePostProcessors(counter))(0);
+            if (!postItem->Equal (&menuSeparator)) {
+                postItem = (_String*)(*(_List*)availablePostProcessors(counter))(1);
+                _String tryFileName (*postItem);
+                FILE    * tryFile   = doFileOpen (tryFileName.getStr(), "r");
+                if (tryFile) {
+                    fclose(tryFile);
+                } else {
+                    availablePostProcessors.Delete(counter);
+                    counter--;
+                }
+            }
+        }
+        if (availablePostProcessors.lLength) {
+            long sepCount = 0;
+            for (long counter=0; counter<availablePostProcessors.countitems(); counter++) {
+                _String * postItem = (_String*)(*(_List*)availablePostProcessors(counter))(0),
+                          chopped  = _String("/Analysis/Results/")&*postItem;
+
+                if (postItem->Equal (&menuSeparator)) {
+                    GtkItemFactoryEntry aProcEntry = {NULL,NULL,NULL,0,"<Separator>"};
+                    chopped = chopped & sepCount++;
+                    aProcEntry.path = chopped.sData;
+                    gtk_item_factory_create_items (menu_items,  1, &aProcEntry, this);
+                } else {
+                    GtkItemFactoryEntry aProcEntry = {NULL,NULL,(GtkItemFactoryCallback)hyphy_menu_item_callback,1000+counter,"<Item>"};
+                    aProcEntry.path = chopped.sData;
+                    gtk_item_factory_create_items (menu_items,  1, &aProcEntry, this);
+                }
+            }
+
+        }
+    }
+}
+
+
+//__________________________________________________________________
+
+void _HYConsoleWindow::_UpdateEditMenu (void)
+{
+    /*
+    _HYTextBox* txb = (_HYTextBox*)GetObject (0);
+
+    HWND        te = txb->te;
+
+    CHARRANGE   cr;
+
+    SendMessage (te,EM_EXGETSEL,0,(LPARAM)&cr);
+
+    bool        haveSelection = cr.cpMax-cr.cpMin,
+                canPaste      = SendMessage (te,EM_CANPASTE,CF_TEXT,0),
+                canUndo       = SendMessage (te,EM_GETUNDONAME,0,0),
+                canRedo       = SendMessage (te,EM_CANREDO,0,0);
+
+    if ((((bool)editOptions&HY_CONSOLE_CAN_COPY)!=haveSelection)||
+        (((bool)editOptions&HY_CONSOLE_CAN_PASTE)!=canPaste)||
+        (((bool)editOptions&HY_CONSOLE_CAN_UNDO)!=canUndo)||
+        (((bool)editOptions&HY_CONSOLE_CAN_UNDO)!=canRedo))
+    {
+        HMENU            windowMenu = GetMenu (theWindow),
+                         editMenu   = GetSubMenu(windowMenu,1);
+
+        editOptions = 0;
+
+        if (haveSelection)
+            editOptions |= HY_CONSOLE_CAN_COPY;
+
+        EnableMenuItem (editMenu,3,MF_BYPOSITION|(haveSelection?MF_ENABLED:MF_GRAYED));
+        EnableMenuItem (editMenu,4,MF_BYPOSITION|(haveSelection?MF_ENABLED:MF_GRAYED));
+
+        if (canPaste)
+            editOptions |= HY_CONSOLE_CAN_PASTE;
+
+        EnableMenuItem (editMenu,5,MF_BYPOSITION|(canPaste?MF_ENABLED:MF_GRAYED));
+
+        if (canUndo)
+            editOptions |= HY_CONSOLE_CAN_UNDO;
+
+        EnableMenuItem (editMenu,0,MF_BYPOSITION|(canUndo?MF_ENABLED:MF_GRAYED));
+
+        if (canRedo)
+            editOptions |= HY_CONSOLE_CAN_REDO;
+
+        EnableMenuItem (editMenu,1,MF_BYPOSITION|(canRedo?MF_ENABLED:MF_GRAYED));
+    }*/
+}
+
+//__________________________________________________________________
+
+void _HYConsoleWindow::_UnsetMenuBar(void)
+{
+    _HYWindow::_UnsetMenuBar();
+}
+
+//__________________________________________________________________
+
+bool        _HYConsoleWindow::_ProcessMenuSelection (long msel)
+{
+    switch (msel) {
+    case HY_WINDOW_MENU_ID_FILE+1:
+        SaveConsole ();
+        return true;
+
+    case 14:
+        _DoPrint ();
+        return true;
+
+    case 16:
+        ((_HYTextBox*)GetObject(0))->_DoUndo(true);
+        return true;
+
+    case 17:
+        ((_HYTextBox*)GetObject(0))->_DoCut(true);
+        return true;
+
+    case 18:
+        ((_HYTextBox*)GetObject(0))->_DoCopy(true);
+        return true;
+
+    case HY_WINDOW_MENU_ID_EDIT+5:
+        ((_HYTextBox*)GetObject(0))->_DoSelectAll(true);
+        return true;
+
+    case 21:
+        SetStatusLine ("Canceling");
+        terminateExecution = true;
+        return true;
+
+    case 22: {
+        GtkWidget * suspendItem = gtk_item_factory_get_widget_by_action(menu_items,22);
+        if (!isSuspended) {
+            isSuspended = true;
+            SetStatusLine (empty,empty,empty,-1,HY_SL_SUSPEND);
+            gtk_label_set_text (GTK_LABEL (gtk_bin_get_child(GTK_BIN(suspendItem))), "Resume");
+            updateTimer = false;
+            while (isSuspended) {
+                gtk_main_iteration_do(true);
+            }
+        } else {
+            isSuspended = false;
+            SetStatusLine (empty,empty,empty,-1,HY_SL_RESUME);
+            gtk_label_set_text (GTK_LABEL (gtk_bin_get_child(GTK_BIN(suspendItem))), "Suspend execution");
+            timerStart += clock()-lastTimer;
+            updateTimer = true;
+        }
+        return true;
+    }
+    case 23:
+        ShowMessagesLog();
+        return true;
+
+    case 24:
+        RunStandardAnalyses();
+        return true;
+
+    case 25:
+        displayAbout(false);
+        return true;
+
+    case HY_WINDOW_MENU_ID_EDIT+4:
+        ((_HYTextBox*)GetObject(0))->_DoClear (true,true);
+        return true;
+
+    case 27:
+        HandlePreferences (globalPreferencesList,"HYPHY Preferences");
+        return true;
+
+    case 29:
+        //WinExec ("hh HYPHY HELP.chm",SW_SHOWNORMAL);
+        return true;
+
+    case 30:
+        if (OpenBatchFile (false)) {
+            ExecuteBatchFile();
+            PopFilePath();
+        }
+        return true;
+
+    case 31:
+        ((_HYTextBox*)GetObject(0))->_DoRedo(true);
+        return true;
+
+    case 15:
+        postWindowCloseEvent (GetID());
+        gtk_main_quit ();
+        return true;
+
+    case 60: // expression calculator
+        if (calculatorMode) {
+            _HYTextBox         *ib = (_HYTextBox*)hyphyConsoleWindow->GetObject(1);
+            ib->SetText ("exit");
+            hyphyConsoleWindow->ProcessEvent (generateTextEditChangeEvent(ib->GetID(),2));
+            calculatorMode         = false;
+            //ib->SetText (empty);
+        } else {
+            calculatorMode = true;
+            while(calculatorMode&&ExpressionCalculator()) {}
+            calculatorMode = false;
+        }
+        return true;
+
+    case 61: { // execute selection
+        ExecuteSelection();
+        return true;
+    }
+
+    case 70: // New Tree
+        NewTreeWindow(-1);
+        return true;
+
+    case 71: // New Model
+        NewModel(nil);
+        return true;
+
+    case 72: // New Chart
+        NewChartWindow();
+        return true;
+
+    case 73: // New Genetic Code
+        NewGeneticCodeTable(0);
+        return true;
+
+    case 74: // New Database
+        NewDatabaseFile(0);
+        return true;
+
+    case 80: // Open Batch File
+        if (OpenBatchFile()) {
+            ExecuteBatchFile ();
+        }
+        return true;
+
+    case 81: // Open Data File
+        OpenDataFile();
+        return true;
+
+    case 82: // Open Tree
+        OpenTreeFile();
+        return true;
+
+    case 83: // Open Text
+        OpenTextFile();
+        return true;
+
+    case 84: // Open Table
+        OpenTable ();
+        return true;
+
+    case 85: // Open SQLite database
+        OpenDatabaseFile (nil);
+        return true;
+
+    case HY_WINDOW_MENU_ID_FILE-2:
+        ShowObjectInspector ();
+        return true;
+
+    default: {
+        msel -= 1000;
+        if (msel<availablePostProcessors.lLength) {
+            ExecuteAPostProcessor (*(_String*)(*(_List*)availablePostProcessors(msel))(1));
+            return 0;
+        }
+
+        msel-=1000;
+        if (msel<(long)recentPaths.lLength) {
+            if (msel == -1) {
+                for (long mi=0; mi<recentFiles.lLength; mi++) {
+                    GtkWidget * recFile = gtk_item_factory_get_widget_by_action(hyphyConsoleWindow->menu_items,2000+mi);
+                    if (recFile) {
+                        gtk_item_factory_delete_item(hyphyConsoleWindow->menu_items,gtk_item_factory_path_from_widget(recFile));
+                    }
+                }
+                recentPaths.Clear();
+                recentFiles.Clear();
+            } else {
+                if (argFileName) {
+                    *argFileName = *(_String*)recentPaths(msel);
+                } else {
+                    argFileName = new _String (*(_String*)recentPaths(msel));
+                }
+                if (OpenBatchFile(false)) {
+                    ExecuteBatchFile ();
+                }
+            }
+            return true;
+        }
+        return true;
+    }
+    }
+
+    return _HYTWindow::_ProcessMenuSelection(msel);
+}
+
+
+//__________________________________________________________________
+
+bool _HYConsoleWindow::_ProcessOSEvent (Ptr vEvent)
+{
+    /*_HYWindowsUIMessage*  theEvent = (_HYWindowsUIMessage*)vEvent;
+    if (theEvent->iMsg == WM_SYSCOMMAND)
+    {
+        if (theEvent->wParam == SC_CLOSE)
+        {
+            hyphyExiting = true;
+            return true;
+        }
+    }
+    else
+    {
+        if (theEvent->iMsg == UPDATE_TIMER)
+        {
+            UpdateTimer ();
+            return true;
+        }
+    }*/
+    return _HYTWindow::_ProcessOSEvent (vEvent);
+}
+
+//__________________________________________________________________
+
+bool _HYConsoleWindow::_Close (Ptr )
+{
+    _String closingNow ("Please confirm that you want to close HyPhy, terminating all unfinished tasks.");
+    if (ProceedPrompt (closingNow, (Ptr)this)) {
+        gtk_main_quit();
+    }
+    return false;
+}
+
+//__________________________________________________________________
+void    _HYConsoleWindow::_DoPrint          (void)
+{
+    _String NIY ("Printing has not yet been implemented\n");
+    ProblemReport (NIY);
+}
+
+//__________________________________________________________________
+
+void _HYConsoleWindow::_PaintStatusBar(Ptr,bool force)
+{
+    if (GTK_WIDGET_MAPPED (theWindow)) {
+        _Parameter      vL;
+        checkParameter (VerbosityLevelString, vL, 0.0);
+
+        if (vL<-0.5 && !force) {
+            clock_t curMeasure = clock();
+            _Parameter diff = 1.0/CLOCKS_PER_SEC*(curMeasure-lastMeasure);
+            if (diff < -vL) {
+                return;
+            }
+            lastMeasure = curMeasure;
+        }
+
+        if (!stripedFillGC) {
+            SetUpStatusBarStuff (theWindow);
+        }
+
+        GdkRectangle wRC  = {0,0,theWindow->allocation.width,HY_SCROLLER_WIDTH},
+                     w2RC;
+
+        if (!_hyConsoleWindowGC) {
+            _hyConsoleWindowGC   = gdk_gc_new     (theWindow->window);
+            gdk_gc_set_tile (_hyConsoleWindowGC, stripedFill);
+            gdk_gc_set_line_attributes(_hyConsoleWindowGC,1,GDK_LINE_SOLID,GDK_CAP_NOT_LAST,GDK_JOIN_MITER);
+            _hyConsoleLayout = pango_layout_new (screenPContext);
+            pango_layout_set_width (_hyConsoleLayout, -1);
+            statusBarBold = pango_font_description_new ();
+            statusBarNormal = pango_font_description_new ();
+            _HYFont         consoleFont = {_HY_MONO_FONT,9,HY_FONT_PLAIN};
+            HYFont2PangoFontDesc (consoleFont,statusBarNormal);
+            consoleFont.style = HY_FONT_BOLD;
+            HYFont2PangoFontDesc (consoleFont,statusBarBold);
+        }
+
+        GdkPixmap * offBitmap        = gdk_pixmap_new (theWindow->window, wRC.width, wRC.height,-1);
+
+        if (offBitmap) {
+            gdk_gc_set_fill         (_hyConsoleWindowGC,GDK_TILED);
+            gdk_draw_rectangle      (offBitmap,_hyConsoleWindowGC,true,-1,-1,wRC.width+2,wRC.height+2);
+            gdk_gc_set_fill         (_hyConsoleWindowGC,GDK_SOLID);
+            gdk_gc_set_foreground   (_hyConsoleWindowGC,&_BLACKBRUSH_);
+            gdk_draw_line(offBitmap,_hyConsoleWindowGC,0,0,wRC.width,0);
+
+            pango_layout_set_font_description(_hyConsoleLayout,statusBarNormal);
+            pango_layout_set_text(_hyConsoleLayout,fileName.getStr(),fileName.sLength);
+            gdk_draw_layout(offBitmap,_hyConsoleWindowGC,33,wRC.height-13,_hyConsoleLayout);
+
+            if (inputStatus == 1) {
+                pango_layout_set_text(_hyConsoleLayout,cInput.getStr(),cInput.sLength);
+            } else {
+                pango_layout_set_text(_hyConsoleLayout,action.getStr(),action.sLength);
+            }
+
+            gdk_draw_layout(offBitmap,_hyConsoleWindowGC,193,wRC.height-13,_hyConsoleLayout);
+
+            gdk_gc_set_foreground   (_hyConsoleWindowGC,&_DARKGREYBRUSH_);
+
+            gdk_draw_rectangle      (offBitmap,_hyConsoleWindowGC,true,0,1,30,wRC.height-1);
+            gdk_draw_rectangle      (offBitmap,_hyConsoleWindowGC,true,150,1,40,wRC.height-1);
+            gdk_draw_rectangle      (offBitmap,_hyConsoleWindowGC,true,wRC.width-55,1,55,wRC.height-1);
+
+            gdk_gc_set_foreground   (_hyConsoleWindowGC,&_WHITEBRUSH_);
+            pango_layout_set_font_description(_hyConsoleLayout,statusBarBold);
+
+            pango_layout_set_text(_hyConsoleLayout,cState.getStr(),cState.sLength);
+            gdk_draw_layout(offBitmap,_hyConsoleWindowGC,3,wRC.height-13,_hyConsoleLayout);
+            pango_layout_set_text(_hyConsoleLayout,cTask.getStr(),cTask.sLength);
+            gdk_draw_layout(offBitmap,_hyConsoleWindowGC,151,wRC.height-13,_hyConsoleLayout);
+
+            pango_layout_set_font_description(_hyConsoleLayout,statusBarNormal);
+
+            pango_layout_set_text(_hyConsoleLayout,timer.getStr(),timer.sLength);
+            gdk_draw_layout(offBitmap,_hyConsoleWindowGC,wRC.width-53,wRC.height-13,_hyConsoleLayout);
+
+            if (percentDone>0 || percentDone == -HY_SL_DONE) {
+                GdkColor blackBrush = HYColorToGDKColor((_HYColor) {
+                    80,80,80
+                }),
+                orangeBrush = HYColorToGDKColor((_HYColor) {
+                    255,153,102
+                });
+
+                gdk_gc_set_foreground   (_hyConsoleWindowGC,&orangeBrush);
+                gdk_draw_rectangle      (offBitmap,_hyConsoleWindowGC,true,wRC.width-135,wRC.height-14,(percentDone>=0?percentDone:100.)*0.75,12);
+
+                gdk_gc_set_foreground   (_hyConsoleWindowGC,&blackBrush);
+                gdk_draw_rectangle      (offBitmap,_hyConsoleWindowGC,false,wRC.width-135,wRC.height-14,75,12);
+
+                //gdk_gc_set_foreground (_hyConsoleWindowGC,&_WHITEBRUSH_);
+                _String pLine;
+                if (percentDone>=0) {
+                    pLine = _String(percentDone)&"%";
+                } else {
+                    pLine = "DONE";
+                }
+
+                pango_layout_set_text(_hyConsoleLayout,pLine.getStr(),pLine.sLength);
+                gdk_draw_layout(offBitmap,_hyConsoleWindowGC,wRC.width-107,wRC.height-13,_hyConsoleLayout);
+            }
+        }
+
+        gdk_draw_drawable (theWindow->window, _hyConsoleWindowGC, offBitmap, 0, 0, theWindow->allocation.x, theWindow->allocation.y+theWindow->allocation.height-wRC.height, -1, -1);
+        g_object_unref (offBitmap);
+    }
+    yieldCPUTime();
+}
+
diff --git a/src/gui/gtk/WindowClasses/HYPlatformDBWindow.cpp b/src/gui/gtk/WindowClasses/HYPlatformDBWindow.cpp
new file mode 100644
index 0000000..4278975
--- /dev/null
+++ b/src/gui/gtk/WindowClasses/HYPlatformDBWindow.cpp
@@ -0,0 +1 @@
+/*
    GTK Portions of the DB Window class

    Sergei L. Kosakovsky Pond, Fall 2005.
*/

#include "HYDBWindow.h"

//__________________________________________________________________


bool        _HYDBWindow::_ProcessMenuSelection (long msel)
{
    // TBI
    return _HYTWindow::_ProcessMenuSelection(msel);
}

//EOF
\ No newline at end of file
diff --git a/src/gui/gtk/WindowClasses/HYPlatformDataPanel.cpp b/src/gui/gtk/WindowClasses/HYPlatformDataPanel.cpp
new file mode 100644
index 0000000..10d94ba
--- /dev/null
+++ b/src/gui/gtk/WindowClasses/HYPlatformDataPanel.cpp
@@ -0,0 +1,752 @@
+/*
+    GTK Portions of the data panel class
+
+    Sergei L. Kosakovsky Pond, Spring 2005.
+*/
+
+#include "HYTreePanel.h"
+#include "HYDataPanel.h"
+#include "HYUtils.h"
+
+#include "likefunc.h"
+#include <gdk/gdkkeysyms.h>
+#include <gdk/gdkx.h>
+
+#define     HY_DATA_WIN32_MENU_BASE    8000
+#define     HY_DATALF_WIN32_MENU_BASE  8500
+
+//__________________________________________________________________
+
+static GtkItemFactoryEntry hyphy_data_window_menu[] = {
+    { "/File/Save _as",     "<control>F",    (GtkItemFactoryCallback)hyphy_menu_item_callback,              HY_WINDOW_MENU_ID_FILE+3, "<Item>" },
+    { "/Edit/_Find",     "<control>F",    (GtkItemFactoryCallback)hyphy_menu_item_callback,             HY_WINDOW_MENU_ID_EDIT+6, "<Item>" },
+    { "/Edit/_Search and Replace",     NULL,    (GtkItemFactoryCallback)hyphy_menu_item_callback,               HY_WINDOW_MENU_ID_EDIT+7, "<Item>" },
+    { "/_Data",         NULL,         NULL,           0,                    "<Branch>" },
+    { "/Data/_Partition->Selection", "<control>1", (GtkItemFactoryCallback)hyphy_menu_item_callback, HY_DATA_WIN32_MENU_BASE, "<Item>"},
+    { "/Data/_Selection->Partition", "<control>2", (GtkItemFactoryCallback)hyphy_menu_item_callback, HY_DATA_WIN32_MENU_BASE+1, "<Item>"},
+    { "/Data/_Invert selection", "<control>3", (GtkItemFactoryCallback)hyphy_menu_item_callback, HY_DATA_WIN32_MENU_BASE+2, "<Item>"},
+    { "/Data/sep1",         NULL,         NULL,           0,        "<Separator>" },
+    { "/Data/_Block width",         NULL,         NULL,           0,        "<Branch>" },
+    { "/Data/Block width/_9", NULL, (GtkItemFactoryCallback)hyphy_menu_item_callback, HY_DATA_WIN32_MENU_BASE+50, "<CheckItem>"},
+    { "/Data/Block width/_10", NULL, (GtkItemFactoryCallback)hyphy_menu_item_callback, HY_DATA_WIN32_MENU_BASE+51, "<CheckItem>"},
+    { "/Data/_Repeat characters",           NULL,         NULL,           0,        "<Branch>" },
+    { "/Data/Repeat characters/Display _actual character", NULL, (GtkItemFactoryCallback)hyphy_menu_item_callback, HY_DATA_WIN32_MENU_BASE+60, "<CheckItem>"},
+    { "/Data/Repeat characters/_Display '.'", NULL, (GtkItemFactoryCallback)hyphy_menu_item_callback, HY_DATA_WIN32_MENU_BASE+61, "<CheckItem>"},
+    { "/Data/_Name Display",            NULL,         NULL,           0,        "<Branch>" },
+    { "/Data/Name Display/_None", NULL, (GtkItemFactoryCallback)hyphy_menu_item_callback, HY_DATA_WIN32_MENU_BASE+70, "<CheckItem>"},
+    { "/Data/Name Display/_First 10 characters", NULL, (GtkItemFactoryCallback)hyphy_menu_item_callback, HY_DATA_WIN32_MENU_BASE+71, "<CheckItem>"},
+    { "/Data/Name Display/F_ull names", NULL, (GtkItemFactoryCallback)hyphy_menu_item_callback, HY_DATA_WIN32_MENU_BASE+72, "<CheckItem>"},
+    { "/Data/Name Display/sep1",            NULL,         NULL,           0,        "<Separator>" },
+    { "/Data/Name Display/_Alphabetize names", NULL, (GtkItemFactoryCallback)hyphy_menu_item_callback, HY_DATA_WIN32_MENU_BASE+73, "<Item>"},
+    { "/Data/Name Display/_Revert to file order", NULL, (GtkItemFactoryCallback)hyphy_menu_item_callback, HY_DATA_WIN32_MENU_BASE+74, "<Item>"},
+    { "/Data/Name Display/_Clean up sequence names", NULL, (GtkItemFactoryCallback)hyphy_menu_item_callback, HY_DATA_WIN32_MENU_BASE+75, "<Item>"},
+    { "/Data/_Omitted sequences",           NULL,         NULL,           0,        "<Branch>" },
+    { "/Data/Omitted sequences/_Restore all", NULL, (GtkItemFactoryCallback)hyphy_menu_item_callback, HY_DATA_WIN32_MENU_BASE+10000, "<Item>"},
+    { "/Data/_Omitted sequences/sep1",          NULL,         NULL,           0,        "<Separator>" },
+    { "/Data/_Additional information",          NULL,         NULL,           0,        "<Branch>" },
+    { "/Data/Additional information/_Consensus sequence", NULL, (GtkItemFactoryCallback)hyphy_menu_item_callback, HY_DATA_WIN32_MENU_BASE+80, "<CheckItem>"},
+    { "/Data/Additional information/_Rate class", NULL, (GtkItemFactoryCallback)hyphy_menu_item_callback, HY_DATA_WIN32_MENU_BASE+81, "<CheckItem>"},
+    { "/Data/Additional information/_Aminoacid translation", NULL, (GtkItemFactoryCallback)hyphy_menu_item_callback, HY_DATA_WIN32_MENU_BASE+82, "<CheckItem>"},
+    { "/Data/Additional information/Re_ference sequence", NULL, (GtkItemFactoryCallback)hyphy_menu_item_callback, HY_DATA_WIN32_MENU_BASE+83, "<CheckItem>"},
+    { "/Data/sep2",         NULL,         NULL,           0,        "<Separator>" },
+    { "/Data/Part_ition properties", NULL, (GtkItemFactoryCallback)hyphy_menu_item_callback, HY_DATA_WIN32_MENU_BASE+3, "<Item>"},
+    { "/Data/Inp_ut partition", NULL, (GtkItemFactoryCallback)hyphy_menu_item_callback, HY_DATA_WIN32_MENU_BASE+4, "<Item>"},
+    { "/Data/sep3",         NULL,         NULL,           0,        "<Separator>" },
+    { "/Data/_Simulation",          NULL,         NULL,           0,        "<Branch>" },
+    { "/Data/Simulation/_Simulate 1",NULL, (GtkItemFactoryCallback)hyphy_menu_item_callback, HY_DATA_WIN32_MENU_BASE+90, "<Item>"},
+    { "/Data/Simulation/Simulate 1 to _file",NULL, (GtkItemFactoryCallback)hyphy_menu_item_callback, HY_DATA_WIN32_MENU_BASE+91, "<Item>"},
+    { "/Data/Simulation/Simulate _many",NULL, (GtkItemFactoryCallback)hyphy_menu_item_callback, HY_DATA_WIN32_MENU_BASE+92, "<Item>"},
+    { "/Data/An_cestors", NULL, (GtkItemFactoryCallback)hyphy_menu_item_callback, HY_DATA_WIN32_MENU_BASE+5, "<Item>"},
+    { "/Data/sep4",         NULL,         NULL,           0,        "<Separator>" },
+    { "/Data/_Font options", NULL, (GtkItemFactoryCallback)hyphy_menu_item_callback, HY_DATA_WIN32_MENU_BASE+6, "<Item>"},
+    { "/Data/sep5",         NULL,         NULL,           0,        "<Separator>" },
+    { "/Data/_Data Processing",         NULL,         NULL,           0,                    "<Branch>" },
+    { "/_Likelihood",           NULL,         NULL,           0,                    "<Branch>" },
+    { "/Likelihood/Build", "<control>L", (GtkItemFactoryCallback)hyphy_menu_item_callback, HY_DATALF_WIN32_MENU_BASE, "<Item>"},
+    { "/Likelihood/_Display",           NULL,         NULL,           0,                    "<Branch>" },
+    { "/Likelihood/Display/Log-Lkhd _only", NULL, (GtkItemFactoryCallback)hyphy_menu_item_callback, HY_DATALF_WIN32_MENU_BASE+50, "<CheckItem>"},
+    { "/Likelihood/Display/Log-Lkhd with &parameter values", NULL, (GtkItemFactoryCallback)hyphy_menu_item_callback, HY_DATALF_WIN32_MENU_BASE+51, "<CheckItem>"},
+    { "/Likelihood/Display/Log-Lkhd with &concise trees", NULL, (GtkItemFactoryCallback)hyphy_menu_item_callback, HY_DATALF_WIN32_MENU_BASE+52, "<CheckItem>"},
+    { "/Likelihood/Display/_Parameter Listing", NULL, (GtkItemFactoryCallback)hyphy_menu_item_callback, HY_DATALF_WIN32_MENU_BASE+53, "<CheckItem>"},
+    { "/Likelihood/Display/Log-Lkhd with complete &trees", NULL, (GtkItemFactoryCallback)hyphy_menu_item_callback, HY_DATALF_WIN32_MENU_BASE+54, "<CheckItem>"},
+    { "/Likelihood/_Optimize", "<control>T", (GtkItemFactoryCallback)hyphy_menu_item_callback, HY_DATALF_WIN32_MENU_BASE+1, "<Item>"},
+    { "/Likelihood/sep4",           NULL,         NULL,           0,        "<Separator>" },
+    { "/Likelihood/_Show parameters", "<control>H", (GtkItemFactoryCallback)hyphy_menu_item_callback, HY_DATALF_WIN32_MENU_BASE+2, "<Item>"},
+    { "/Likelihood/_General bootstrap", "<control>B", (GtkItemFactoryCallback)hyphy_menu_item_callback, HY_DATALF_WIN32_MENU_BASE+3, "<Item>"}
+};
+
+static GtkItemFactoryEntry hyphy_data_window_menu2[] = {
+    { "/Likelihood/_Inference",         NULL,         NULL,           0,                    "<Branch>" },
+    { "/Likelihood/Inference/_Infer topology", "<control>L", (GtkItemFactoryCallback)hyphy_menu_item_callback, HY_DATALF_WIN32_MENU_BASE+20, "<Item>"},
+    { "/Likelihood/Inference/Infer topology with _constraints", NULL, (GtkItemFactoryCallback)hyphy_menu_item_callback, HY_DATALF_WIN32_MENU_BASE+21, "<Item>"}
+};
+
+//__________________________________________________________________
+
+void _HYDataPanel::_SetMenuBar(void)
+{
+    _HYWindow::_SetMenuBar();
+
+    if (menu_items && !gtk_item_factory_get_widget(menu_items,"<HY_WINDOW>/Data")) {
+        _HYSequencePane* sp = (_HYSequencePane*)GetObject (0);
+
+        gtk_item_factory_create_items (menu_items,  sizeof (hyphy_data_window_menu) / sizeof (hyphy_data_window_menu[0]), hyphy_data_window_menu, this);
+        gtk_widget_set_sensitive(gtk_item_factory_get_item_by_action(menu_items,HY_DATA_WIN32_MENU_BASE),false);
+        gtk_widget_set_sensitive(gtk_item_factory_get_item_by_action(menu_items,HY_DATA_WIN32_MENU_BASE+1),false);
+        gtk_widget_set_sensitive(gtk_item_factory_get_item(menu_items,"<HY_WINDOW>/Data/Omitted sequences"),false);
+
+        gtk_widget_set_sensitive(gtk_item_factory_get_item_by_action(menu_items,HY_DATA_WIN32_MENU_BASE+5),false);
+        gtk_widget_set_sensitive(gtk_item_factory_get_item_by_action(menu_items,HY_DATA_WIN32_MENU_BASE+81),false);
+        gtk_widget_set_sensitive(gtk_item_factory_get_item_by_action(menu_items,HY_DATA_WIN32_MENU_BASE+82),false);
+
+        gtk_widget_set_sensitive(gtk_item_factory_get_item_by_action(menu_items,HY_DATALF_WIN32_MENU_BASE+1),false);
+        gtk_widget_set_sensitive(gtk_item_factory_get_item_by_action(menu_items,HY_DATALF_WIN32_MENU_BASE+2),false);
+        gtk_widget_set_sensitive(gtk_item_factory_get_item_by_action(menu_items,HY_DATALF_WIN32_MENU_BASE+3),false);
+
+        gtk_widget_set_sensitive(gtk_item_factory_get_item_by_action(menu_items,HY_WINDOW_MENU_ID_EDIT+1),true);
+        gtk_widget_set_sensitive(gtk_item_factory_get_item_by_action(menu_items,HY_WINDOW_MENU_ID_EDIT+5),true);
+
+        gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(gtk_item_factory_get_item_by_action(menu_items,HY_DATA_WIN32_MENU_BASE+50+(sp->blockWidth==10))),true);
+        gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(gtk_item_factory_get_item_by_action(menu_items,HY_DATA_WIN32_MENU_BASE+60+sp->showDots)),true);
+
+        if (omittedSeqs.lLength) {
+            _OmitSelectedSpecies(omittedSeqs);
+        }
+
+        gtk_widget_set_sensitive(gtk_item_factory_get_item_by_action(menu_items,HY_DATA_WIN32_MENU_BASE+82),dataType&HY_DATAPANEL_NUCDATA);
+
+        if (sp->nameDisplayFlags&HY_SEQUENCE_PANE_NAMES_ALL) {
+            gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(gtk_item_factory_get_item_by_action(menu_items,HY_DATA_WIN32_MENU_BASE+72)),true);
+        } else if (sp->nameDisplayFlags&HY_SEQUENCE_PANE_NAMES_SHORT) {
+            gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(gtk_item_factory_get_item_by_action(menu_items,HY_DATA_WIN32_MENU_BASE+71)),true);
+        } else {
+            gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(gtk_item_factory_get_item_by_action(menu_items,HY_DATA_WIN32_MENU_BASE+70)),true);
+        }
+
+        GtkMenu *fileMenu = GTK_MENU(gtk_item_factory_get_widget(menu_items,"<HY_WINDOW>/File"));
+        gtk_menu_reorder_child(fileMenu,gtk_item_factory_get_widget_by_action(menu_items,HY_WINDOW_MENU_ID_FILE+3),2);
+
+        for (long k=0; k<dataPanelProcessors.lLength; k++) {
+            _String *thisItem = (_String*)dataPanelProcessors (k),
+                     chopped = thisItem->Cut (thisItem->FindBackwards ('/',0,-1)+1,-1),
+                     type = "<Item>";
+
+            GtkItemFactoryEntry aProcEntry = {NULL,NULL,(GtkItemFactoryCallback)hyphy_menu_item_callback,HY_DATA_WIN32_MENU_BASE+100+k,type.sData};
+            chopped = _String("/Data/Data Processing/")&chopped;
+            aProcEntry.path = chopped.sData;
+
+            gtk_item_factory_create_items (menu_items,  1, &aProcEntry, this);
+        }
+
+        _UpdateLFMenu();
+        _VerifyInferMenu    ();
+    }
+}
+//__________________________________________________________________
+
+
+bool        _HYDataPanel::_ProcessMenuSelection (long msel)
+{
+    if (_HYWindow::_ProcessMenuSelection(msel)) {
+        return true;
+    }
+
+    _HYSequencePane* sp = (_HYSequencePane*)GetObject (0);
+    _HYSequencePane* sp2 =(_HYSequencePane*)GetObject (4);
+    _String     prompt;
+    bool        done = false;
+
+    switch (msel) {
+    case HY_WINDOW_MENU_ID_FILE+2: {
+        _PrintData();
+        done = true;
+        break;
+    }
+
+    case HY_WINDOW_MENU_ID_EDIT+1: { // Copy
+        _CopySelectionToClipboard   ();
+        done = true;
+        break;
+    }
+
+    case HY_WINDOW_MENU_ID_EDIT+5: { // Select All
+        sp->SelectAll(true);
+        done = true;
+        break;
+    }
+
+    case HY_WINDOW_MENU_ID_EDIT+6: { // Find Function
+        FindFunction();
+        done = true;
+        break;
+    }
+
+    case HY_WINDOW_MENU_ID_EDIT+7: { // Find Function
+        HandleSearchAndReplace();
+        done = true;
+        break;
+    }
+
+    case HY_DATA_WIN32_MENU_BASE: { // Partition->Selection
+        SelectPartition();
+        done = true;
+        break;
+    }
+
+    case HY_DATA_WIN32_MENU_BASE+1: { // Selection->Partition
+        if (sp->selection.lLength) {
+            CreatePartition (sp->selection,1,true);
+        }
+        done = true;
+        break;
+    }
+
+    case HY_DATA_WIN32_MENU_BASE+2: { // Invert Selection
+        InvertSelection();
+        done = true;
+        break;
+    }
+
+    case HY_DATA_WIN32_MENU_BASE+3: { // Parition props
+        PartitionPropsMenu ();
+        done = true;
+        break;
+    }
+
+    case HY_DATA_WIN32_MENU_BASE+4: { // Input part
+        InputPartitionString ();
+        done = true;
+        break;
+    }
+
+    case HY_DATA_WIN32_MENU_BASE+5: { // Ancestors
+        SimulateDataSet (0,true);
+        done = true;
+        break;
+    }
+
+    case HY_DATA_WIN32_MENU_BASE+6: { // Ancestors
+        HandleFontChange();
+        done = true;
+        break;
+    }
+
+    case HY_DATALF_WIN32_MENU_BASE: { // Build LF
+        if (gtk_item_factory_get_item (menu_items,"<HY_WINDOW>/Likelihood/Inference")) {
+            InferTopologies ();
+        } else {
+            BuildLikelihoodFunction();
+        }
+        done = true;
+        break;
+    }
+
+    case HY_DATALF_WIN32_MENU_BASE+1: { // Optimize LF
+        OptimizeLikelihoodFunction();
+        done = true;
+        break;
+    }
+
+    case HY_DATALF_WIN32_MENU_BASE+2: { // Show Parameters
+        DisplayParameterTable ();
+        done = true;
+        break;
+    }
+
+    case HY_DATALF_WIN32_MENU_BASE+3: { // General bootstrap
+        //Uncomment when rdy
+        OpenGeneralBSWindow ();
+        done = true;
+        break;
+    }
+
+    case HY_DATA_WIN32_MENU_BASE+50: // Block size
+    case HY_DATA_WIN32_MENU_BASE+51: {
+        GtkCheckMenuItem *checkItem = GTK_CHECK_MENU_ITEM(gtk_item_factory_get_item_by_action(menu_items,msel));
+
+        if (gtk_check_menu_item_get_active(checkItem)) {
+            long             newBlockSize;
+            bool             is9 = (msel==HY_DATA_WIN32_MENU_BASE+50);
+
+            if (is9) {
+                newBlockSize = 9;
+            } else {
+                newBlockSize = 10;
+            }
+
+            if (sp->blockWidth!=newBlockSize) {
+                sp->blockWidth = newBlockSize;
+                sp2->blockWidth = newBlockSize;
+                sp->BuildPane();
+                sp->_MarkForUpdate();
+                sp2->BuildPane();
+                sp2->_MarkForUpdate();
+                gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(gtk_item_factory_get_item_by_action(menu_items,is9?msel+1:msel-1)),false);
+            }
+        }
+        done = true;
+        break;
+    }
+
+    case HY_DATA_WIN32_MENU_BASE+60: // Repeating character
+    case HY_DATA_WIN32_MENU_BASE+61: {
+        GtkCheckMenuItem *checkItem = GTK_CHECK_MENU_ITEM(gtk_item_factory_get_item_by_action(menu_items,msel));
+
+        if (gtk_check_menu_item_get_active(checkItem)) {
+            bool       newDisplay;
+            if (msel==HY_DATA_WIN32_MENU_BASE+60) {
+                newDisplay = false;
+            } else {
+                newDisplay = true;
+            }
+
+            if (sp->showDots!=newDisplay) {
+                sp->showDots = newDisplay;
+                sp->BuildPane();
+                sp->_MarkForUpdate();
+                gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(gtk_item_factory_get_item_by_action(menu_items,newDisplay?msel-1:msel+1)),false);
+            }
+        }
+        done = true;
+        break;
+    }
+
+    case HY_DATA_WIN32_MENU_BASE+70: // Sequence names
+    case HY_DATA_WIN32_MENU_BASE+71:
+    case HY_DATA_WIN32_MENU_BASE+72:
+    case HY_DATA_WIN32_MENU_BASE+73:
+    case HY_DATA_WIN32_MENU_BASE+74:
+    case HY_DATA_WIN32_MENU_BASE+75: {
+        if (msel<=HY_DATA_WIN32_MENU_BASE+72) {
+            GtkCheckMenuItem *checkItem = GTK_CHECK_MENU_ITEM(gtk_item_factory_get_item_by_action(menu_items,msel));
+            if (gtk_check_menu_item_get_active(checkItem)) {
+                unsigned char newDisplay;
+                switch (msel) {
+                case HY_DATA_WIN32_MENU_BASE+70:
+                    newDisplay = HY_SEQUENCE_PANE_NAMES_NONE;
+                    break;
+                case HY_DATA_WIN32_MENU_BASE+71:
+                    newDisplay = HY_SEQUENCE_PANE_NAMES_SHORT;
+                    break;
+                case HY_DATA_WIN32_MENU_BASE+72:
+                    newDisplay = HY_SEQUENCE_PANE_NAMES_ALL;
+
+                }
+
+                if ((sp->nameDisplayFlags&HY_SEQUENCE_PANE_NAMES_MASK)!=newDisplay) {
+                    sp->SetNameDisplayMode(newDisplay,true);
+                    sp2->SetNameDisplayMode(newDisplay,true);
+                    BuildThermometer();
+                    BuildMarksPane();
+                    for (long k = HY_DATA_WIN32_MENU_BASE+70; k<HY_DATA_WIN32_MENU_BASE+73; k++)
+                        if (k!=msel) {
+                            gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(gtk_item_factory_get_item_by_action(menu_items,k)),false);
+                        }
+
+                }
+            }
+        } else {
+            if (msel==HY_DATA_WIN32_MENU_BASE+73) {
+                sp->AlphabetizeSpecies();
+            } else if (msel==HY_DATA_WIN32_MENU_BASE+74) {
+                sp->RevertFileOrder();
+            } else {
+                sp->CleanUpSequenceNames();
+            }
+        }
+        done = true;
+        break;
+    }
+
+    case HY_DATA_WIN32_MENU_BASE+80: // status lines
+    case HY_DATA_WIN32_MENU_BASE+81: // status lines
+    case HY_DATA_WIN32_MENU_BASE+82: // status lines
+    case HY_DATA_WIN32_MENU_BASE+83: { // status lines
+        AdjustStatusLine (msel-HY_DATA_WIN32_MENU_BASE-80);
+        done = true;
+        break;
+    }
+
+    case HY_DATALF_WIN32_MENU_BASE+50: // likelihood display
+    case HY_DATALF_WIN32_MENU_BASE+51: // likelihood display
+    case HY_DATALF_WIN32_MENU_BASE+52: // likelihood display
+    case HY_DATALF_WIN32_MENU_BASE+53: // likelihood display
+    case HY_DATALF_WIN32_MENU_BASE+54: { // likelihood display
+        ComputeLikelihoodFunction (msel-HY_DATALF_WIN32_MENU_BASE-50);
+        done = true;
+        break;
+    }
+
+    case HY_DATA_WIN32_MENU_BASE+90: // simulate data set
+    case HY_DATA_WIN32_MENU_BASE+91: // simulate data set
+    case HY_DATA_WIN32_MENU_BASE+92: { // simulate data set
+        SimulateDataSet (msel-HY_DATA_WIN32_MENU_BASE-90);
+        done = true;
+        break;
+    }
+
+    case HY_WINDOW_MENU_ID_FILE+1: // save/save as
+    case HY_WINDOW_MENU_ID_FILE+3: { // save/save as
+        SaveDataPanel (msel==HY_WINDOW_MENU_ID_FILE+1);
+        done = true;
+        break;
+    }
+
+    case HY_DATALF_WIN32_MENU_BASE+20: // infer
+    case HY_DATALF_WIN32_MENU_BASE+21: { // infer
+        InferTopologies (msel==HY_DATALF_WIN32_MENU_BASE+21);
+        _VerifyInferMenu ();
+        done = true;
+        break;
+    }
+
+    default: {
+        if (msel>=HY_DATA_WIN32_MENU_BASE+10000) {
+            RestoreOmittedSequence(msel-HY_DATA_WIN32_MENU_BASE-10003);
+            done = true;
+            break;
+        } else if (msel>=HY_DATA_WIN32_MENU_BASE+100) {
+            ExecuteProcessor(msel-HY_DATA_WIN32_MENU_BASE-100);
+            done = true;
+            break;
+        }
+    }
+    }
+    return done;
+}
+
+//__________________________________________________________________
+
+void        _HYDataPanel::_PaintThermRect(bool update)
+{
+    navRect = ComputeNavRect();
+    _HYCanvas* theCanvas = (_HYCanvas*)GetObject (1);
+    GdkRectangle       r;
+
+    r.x      = navRect.left+theCanvas->rel.left+thermRect.left+1+windowContent->allocation.x+1;
+    r.width  = navRect.right-navRect.left-3;
+    r.y      = navRect.top+theCanvas->rel.top+thermRect.top+1+windowContent->allocation.y+1;
+    r.height = navRect.bottom-navRect.top-3;
+
+    GdkColor   newBr  = HYColorToGDKColor((_HYColor) {
+        255,151,51
+    });
+    GdkGC      *gc    = gdk_gc_new (theWindow->window);
+
+    gdk_gc_set_foreground(gc,&newBr);
+    gdk_gc_set_line_attributes(gc,2,GDK_LINE_SOLID,GDK_CAP_NOT_LAST,GDK_JOIN_MITER);
+    gdk_draw_rectangle(theWindow->window,gc,false,r.x,r.y,r.width,r.height);
+
+    if (update) {
+        _HYRect rect = {componentT.lData[1],componentL.lData[1],componentB.lData[1],componentR.lData[1],0};
+
+        r.x--;
+        r.y--;
+        r.height+=2;
+        r.width +=2;
+
+        GdkRegion * rg1 = gdk_region_rectangle(&r),
+                    * rg2 = gdk_region_rectangle(&r);
+
+        gdk_region_shrink(rg1,0,0);
+        gdk_region_shrink(rg2,2,2);
+
+        gdk_region_subtract(rg1,rg2);
+        r = HYRect2GDKRect(rect);
+        r.x += windowContent->allocation.x;
+        r.y += windowContent->allocation.y;
+        gdk_region_destroy (rg2);
+        rg2 = gdk_region_rectangle(&r);
+        gdk_region_subtract (rg2,rg1);
+
+        gdk_gc_set_clip_region(theCanvas->theContext,rg2);
+
+        theCanvas->_Paint((char*)&rect);
+        gdk_gc_set_clip_region(theCanvas->theContext,NULL);
+        gdk_region_destroy (rg1);
+        gdk_region_destroy (rg2);
+    }
+
+    g_object_unref (gc);
+    _PaintLFStatus ();
+}
+
+//__________________________________________________________________
+
+void        _HYDataPanel::_PaintLFStatus(void)
+{
+    if (lfID<0) {
+        _SimpleList goodP;
+        bool    paintOrange = GenerateGoodPartitions (goodP);
+
+        if (goodP.lLength) {
+            _PaintTheCircle (paintOrange?orangeButtonIcon:yellowButtonIcon,theWindow);
+        } else {
+            _PaintTheCircle (redButtonIcon,theWindow);
+        }
+    } else {
+        _PaintTheCircle (greenButtonIcon,theWindow);
+    }
+
+}
+
+//__________________________________________________________________
+
+void        _HYDataPanel::_PrintData(void)
+{
+    _String ptbi ("DataPanel printing has not yet been implemented");
+    ReportWarning (ptbi);
+}
+
+//__________________________________________________________________
+
+void _HYDataPanel::_VerifyInferMenu(void)
+{
+    _SimpleList    gp;
+
+    GtkWidget      *inferSubMenu = gtk_item_factory_get_widget (menu_items, "<HY_WINDOW>/Likelihood/Inference");
+
+    if (GenerateGoodPartitions(gp)) {
+        if (!inferSubMenu) {
+            gtk_item_factory_delete_item (menu_items, "<HY_WINDOW>/Likelihood/Build");
+            gtk_item_factory_create_items (menu_items,  sizeof (hyphy_data_window_menu2) / sizeof (hyphy_data_window_menu2[0]), hyphy_data_window_menu2, this);
+            inferSubMenu = gtk_item_factory_get_item(menu_items,"<HY_WINDOW>/Likelihood/Inference");
+            gtk_menu_reorder_child(GTK_MENU(gtk_item_factory_get_widget(menu_items, "<HY_WINDOW>/Likelihood")),
+                                   inferSubMenu,0);
+        }
+    } else {
+        if (inferSubMenu) {
+            gtk_item_factory_delete_item (menu_items, "<HY_WINDOW>/Likelihood/Inference");
+            gtk_item_factory_create_items (menu_items,  1, &hyphy_data_window_menu[41], this);
+            gtk_menu_reorder_child(GTK_MENU(gtk_item_factory_get_widget(menu_items, "<HY_WINDOW>/Likelihood")),
+                                   gtk_item_factory_get_item(menu_items, "<HY_WINDOW>/Likelihood/Build"),0);
+        }
+    }
+}
+
+//__________________________________________________________________
+
+void _HYDataPanel::_UpdateLFMenu (void)
+{
+    bool onOff = lfID>=0;
+    if (gtk_item_factory_get_item(menu_items,"<HY_WINDOW>/Likelihood")) {
+        gtk_widget_set_sensitive(gtk_item_factory_get_item (menu_items,"<HY_WINDOW>/Likelihood/Display"), onOff);
+        gtk_widget_set_sensitive(gtk_item_factory_get_item_by_action(menu_items,HY_DATALF_WIN32_MENU_BASE+1),onOff);
+        gtk_widget_set_sensitive(gtk_item_factory_get_item_by_action(menu_items,HY_DATALF_WIN32_MENU_BASE+2),onOff);
+        gtk_widget_set_sensitive(gtk_item_factory_get_item_by_action(menu_items,HY_DATALF_WIN32_MENU_BASE+3),onOff);
+        gtk_widget_set_sensitive(gtk_item_factory_get_item (menu_items,"<HY_WINDOW>/Data/Simulation"), onOff);
+        gtk_widget_set_sensitive(gtk_item_factory_get_item_by_action(menu_items,HY_DATA_WIN32_MENU_BASE+5),onOff);
+        gtk_widget_set_sensitive(gtk_item_factory_get_item_by_action(menu_items,HY_DATA_WIN32_MENU_BASE+81),
+                                 lfID>=0 && ((_LikelihoodFunction*)likeFuncList (lfID))->GetCategoryVars().lLength);
+    }
+}
+
+//__________________________________________________________________
+
+void _HYDataPanel::_UpdateSelectionChoices (bool toggle)
+{
+    gtk_widget_set_sensitive(gtk_item_factory_get_item_by_action(menu_items,HY_DATA_WIN32_MENU_BASE+1),toggle);
+}
+
+//__________________________________________________________________
+
+void _HYDataPanel::_CopySelectionToClipboard (void)
+{
+    _HYSequencePane*    sp = (_HYSequencePane*)GetObject(0);
+    _String             cbStr (128L,true);
+
+    if (sp->selection.lLength) {
+        for (long m=0; m<sp->speciesIndex.lLength; m++) {
+            long idx = sp->speciesIndex.lData[m];
+            for (long k=0; k<sp->selection.lLength; k++) {
+                cbStr << ((_String*)(sp->columnStrings(sp->selection.lData[k])))->sData[idx];
+                if (k&&((k+1)%sp->blockWidth==0)) {
+                    cbStr << ' ';
+                }
+            }
+            cbStr << '\r';
+            cbStr << '\n';
+        }
+    } else if (sp->vselection.lLength)
+        for (long m=0; m<sp->vselection.lLength; m++) {
+            cbStr << (_String*)(sp->rowHeaders(sp->speciesIndex(sp->vselection.lData[m])));
+            cbStr << '\r';
+            cbStr << '\n';
+        }
+
+    cbStr.Finalize();
+
+
+}
+
+//__________________________________________________________________
+
+void _HYDataPanel::_OmitSelectedSpecies (_SimpleList& idx)
+{
+    GtkMenu * omittedSpecies = GTK_MENU(gtk_item_factory_get_widget(menu_items,"<HY_WINDOW>/Data/Omitted sequences"));
+    if (omittedSpecies) {
+        _HYSequencePane*    sp = (_HYSequencePane*)GetObject(0);
+        long                idxShift = 10001+g_list_length (GTK_MENU_SHELL(omittedSpecies)->children);
+
+        for (long k=0; k<idx.lLength; k++) {
+            _String*        thisSpec = (_String*)sp->rowHeaders(idx.lData[k]),
+                            entryPath = _String("/Data/Omitted sequences/") & *thisSpec;
+
+            GtkItemFactoryEntry anItem = {entryPath.sData, NULL, (GtkItemFactoryCallback)hyphy_menu_item_callback,  HY_DATA_WIN32_MENU_BASE+idxShift+k, "<Item>"};
+            gtk_item_factory_create_item(menu_items,&anItem,this,1);
+        }
+        gtk_widget_set_sensitive (gtk_item_factory_get_item(menu_items,"<HY_WINDOW>/Data/Omitted sequences"),true);
+    }
+}
+
+//__________________________________________________________________
+
+void _HYDataPanel::_RestoreOmittedSequence (long index)
+{
+    if (index>=0) {
+        GtkMenu * omittedSpecies = GTK_MENU(gtk_item_factory_get_widget(menu_items,"<HY_WINDOW>/Data/Omitted sequences"));
+
+        long        mic = g_list_length (GTK_MENU_SHELL(omittedSpecies)->children);
+
+        _List       savedPaths;
+        for (long k=10003+index+1; k<10001+mic; k++) {
+            _String aPath (gtk_item_factory_path_from_widget (gtk_item_factory_get_item_by_action (menu_items, HY_DATA_WIN32_MENU_BASE+k)));
+            gtk_item_factory_delete_item (menu_items, aPath.sData);
+            aPath.Trim (aPath.Find ('/'),-1);
+            savedPaths && & aPath;
+        }
+
+        gtk_item_factory_delete_item (menu_items,
+                                      gtk_item_factory_path_from_widget (gtk_item_factory_get_item_by_action (menu_items, HY_DATA_WIN32_MENU_BASE+10003+index)));
+
+        for (long k2 = 0; k2 < savedPaths.lLength; k2++) {
+            GtkItemFactoryEntry anItem = {((_String*)savedPaths(k2))->sData,
+                                          NULL, (GtkItemFactoryCallback)hyphy_menu_item_callback,  HY_DATA_WIN32_MENU_BASE+10003+index+k2, "<Item>"
+                                         };
+            gtk_item_factory_create_item(menu_items,&anItem,this,1);
+        }
+
+        if (mic==3) {
+            gtk_widget_set_sensitive (gtk_item_factory_get_item(menu_items,"<HY_WINDOW>/Data/Omitted sequences"),false);
+        }
+    } else {
+        for (long k=0; k< omittedSeqs.lLength; k++)
+            gtk_item_factory_delete_item (menu_items,
+                                          gtk_item_factory_path_from_widget (gtk_item_factory_get_item_by_action (menu_items, HY_DATA_WIN32_MENU_BASE+10003+k)));
+
+        gtk_widget_set_sensitive (gtk_item_factory_get_item(menu_items,"<HY_WINDOW>/Data/Omitted sequences"),false);
+    }
+}
+
+//__________________________________________________________________
+
+void _HYDataPanel::_UpdatePartitionOperations (_SimpleList* sl)
+{
+    bool enFlag = sl->lData[0];
+    gtk_widget_set_sensitive (gtk_item_factory_get_item_by_action (menu_items, HY_DATA_WIN32_MENU_BASE), enFlag);
+    gtk_widget_set_sensitive (gtk_item_factory_get_item_by_action (menu_items, HY_DATA_WIN32_MENU_BASE+3), enFlag);
+}
+
+//__________________________________________________________________
+
+void _HYDataPanel::_UnsetMenuBar(void)
+{
+}
+
+//__________________________________________________________________
+bool _HYDataPanel::_ProcessOSEvent (Ptr vEvent)
+{
+    static  long        clickH   = 0;
+    static  bool        isNavBar = false;
+
+    if (!_HYTWindow::_ProcessOSEvent (vEvent)) {
+        _HY_GTK_UI_Message *theMessage = (_HY_GTK_UI_Message*)vEvent;
+
+        if (theMessage->theEvent->type==GDK_BUTTON_PRESS || theMessage->theEvent->type==GDK_MOTION_NOTIFY
+                || theMessage->theEvent->type==GDK_2BUTTON_PRESS || theMessage->theEvent->type==GDK_BUTTON_RELEASE) {
+            double xc,
+                   yc;
+            gdk_event_get_coords(theMessage->theEvent,&xc,&yc);
+
+            long ch = xc - windowContent->allocation.x,
+                 cv = yc - windowContent->allocation.y;
+
+            long  c  = FindClickedCell(ch, cv);
+
+            if (c<0) {
+                return false;
+            }
+
+            _HYComponent* thisComponent = (_HYComponent*)components(c);
+
+            if (c==1 || trackMouseComponent == (Ptr)components(1)) { // navBar
+                if (theMessage->theEvent->type==GDK_BUTTON_PRESS) {
+                    trackMouseComponent = (Ptr)thisComponent;
+                }
+
+                ch = ch-componentL.lData[1]-thermRect.left;
+                cv = cv-componentT.lData[1]-thermRect.top;
+
+                if (theMessage->theEvent->type==GDK_2BUTTON_PRESS) {
+                    NavBarDblClick (ch);
+                    return true;
+                }
+                if (navRect.Contains(ch,cv)||isNavBar) {
+                    if (theMessage->theEvent->type==GDK_MOTION_NOTIFY && (((GdkEventMotion*)theMessage->theEvent)->state&GDK_BUTTON1_MASK)) {
+                        // skip events more that 0.1 seconds old
+                        /*GdkModifierType keyDown;
+                        double td1, td2;
+                        gdk_display_get_pointer (gdk_display_get_default(),NULL,&td1,&td2,&keyDown);
+                        if (keyDown & GDK_BUTTON1_MASK) && */
+                        isNavBar = true;
+                        guint32 serverTime = gdk_x11_get_server_time (theWindow->window);
+                        if (serverTime-gdk_event_get_time(theMessage->theEvent) < 100) {
+                            forceUpdateForScrolling = true;
+                            SetNavRectCenter (xc-windowContent->allocation.x-componentL.lData[1]-thermRect.left+clickH,0);
+                            //printf ("Nav scroll %g, %g, %g\n", xc, yc,0.001*(serverTime-gdk_event_get_time(theMessage->theEvent)));
+                            forceUpdateForScrolling = false;
+                        }
+                    } else {
+                        if (theMessage->theEvent->type==GDK_BUTTON_PRESS && (((GdkEventButton*)theMessage->theEvent)->button == 1)) {
+                            clickH = (navRect.right+navRect.left)/2-ch;
+                        }
+                        isNavBar = false;
+                    }
+                } else {
+                    if (theMessage->theEvent->type==GDK_BUTTON_PRESS) {
+                        SetNavRectCenter (ch,cv);
+                    }
+                }
+
+                return true;
+            } else if (theMessage->theEvent->type==GDK_BUTTON_PRESS && (((GdkEventButton*)theMessage->theEvent)->button > 0) && c==4) {
+                _HYSequencePane* sp2 = (_HYSequencePane*)components (4);
+                sp2->ProcessContextualPopUp (ch,cv);
+                return true;
+            }
+        } else if (theMessage->theEvent->type==GDK_KEY_PRESS) {
+            GdkEventKey * kp = (GdkEventKey*)theMessage->theEvent;
+            if ( kp->keyval==GDK_Left || kp->keyval==GDK_Right ) { // left/right arrow
+                _HYSequencePane* sp = (_HYSequencePane*) GetObject (0);
+                if (kp->keyval==GDK_Left && sp->startColumn) {
+                    sp->HScrollPane (-1);
+                } else if (kp->keyval==GDK_Right && sp->endColumn<sp->columnStrings.lLength) {
+                    sp->HScrollPane (1);
+                }
+                return true;
+            }
+        } else if (theMessage->theEvent->type==GDK_BUTTON_RELEASE) {
+            trackMouseComponent = nil;
+            isNavBar = false;
+            return   true;
+        }
+    } else {
+        return true;
+    }
+
+    return false;
+}
+
+
+
+//EOF
\ No newline at end of file
diff --git a/src/gui/gtk/WindowClasses/HYPlatformGWindow.cpp b/src/gui/gtk/WindowClasses/HYPlatformGWindow.cpp
new file mode 100644
index 0000000..01229f1
--- /dev/null
+++ b/src/gui/gtk/WindowClasses/HYPlatformGWindow.cpp
@@ -0,0 +1,69 @@
+/*
+    Graphics Window Object  glue for GTK+
+
+    Sergei L. Kosakovsky Pond, October 2004
+*/
+
+#include "HYGWindow.h"
+#include "HYEventTypes.h"
+#include <gtk/gtk.h>
+#include <gdk/gdk.h>
+//#include "HYUtils.h"
+
+//__________________________________________________________________
+
+void    _HYGWindow::_Paint (Ptr)
+{
+    int t,l,b,r;
+    _VisibleContents (t,l,b,r);
+    //printf ("GPaint on %d %d %d %d\n", t, l, b, r);
+    gdk_draw_drawable (GDK_DRAWABLE(windowContent->window), theContext, thePane, l, t,
+                       windowContent->allocation.x, windowContent->allocation.y, r-l+1, b-t+1);
+}
+
+//__________________________________________________________________
+
+void    _HYGWindow::_Update (Ptr)
+{
+    _Paint (nil);
+}
+
+//__________________________________________________________________
+
+
+bool        _HYGWindow::_ProcessMenuSelection (long msel)
+{
+    bool        done = false;
+    switch (msel) {
+    case HY_WINDOW_MENU_ID_EDIT+1: {
+        _CopyToClipboard ();
+        done = true;
+    }
+    break;
+
+    case HY_WINDOW_MENU_ID_FILE+1: {
+        _SavePicture (GetTitle());
+        done = true;
+    }
+    break;
+    }
+
+    return _HYWindow::_ProcessMenuSelection(msel);
+}
+
+//__________________________________________________________________
+
+void _HYGWindow::_SetMenuBar(void)
+{
+    _HYWindow::_SetMenuBar();
+    gtk_widget_set_sensitive(gtk_item_factory_get_widget (menu_items,"<HY_WINDOW>/Edit/Copy"),  TRUE);
+}
+
+//__________________________________________________________________
+
+void _HYGWindow::_UnsetMenuBar(void)
+{
+}
+
+
+//EOF
\ No newline at end of file
diff --git a/src/gui/gtk/WindowClasses/HYPlatformModelWindow.cpp b/src/gui/gtk/WindowClasses/HYPlatformModelWindow.cpp
new file mode 100644
index 0000000..da16d45
--- /dev/null
+++ b/src/gui/gtk/WindowClasses/HYPlatformModelWindow.cpp
@@ -0,0 +1,156 @@
+/*
+    GTK+ Portions of the model window
+
+    Sergei L. Kosakovsky Pond, Spring 2005.
+*/
+
+#include "HYModelWindow.h"
+#include "HYUtils.h"
+
+#define     HY_MDL_WIN32_MENU_BASE  9200
+
+static GtkItemFactoryEntry hyphy_parameter_model_window_menu[] = {
+    { "/_Model",                        NULL,         NULL,           0,    "<Branch>" },
+    { "/Model/_Model name",             NULL,         (GtkItemFactoryCallback)hyphy_menu_item_callback,           HY_MDL_WIN32_MENU_BASE,   "<Item>" },
+    { "/Model/_Rate variation",         NULL,         NULL,           0, "<Branch>" },
+    { "/File/_Save",                    NULL,         NULL,           0, "<Branch>" },
+    { "/File/Save/Save",                "<control>S",         (GtkItemFactoryCallback)hyphy_menu_item_callback,           HY_WINDOW_MENU_ID_FILE+1, "<Item>" },
+    { "/File/Save/Save as...",          NULL,         (GtkItemFactoryCallback)hyphy_menu_item_callback,           HY_WINDOW_MENU_ID_FILE+3, "<Item>" }
+};
+
+//__________________________________________________________________
+
+void _HYModelWindow::_SetMenuBar(void)
+{
+    if (menu_items && !gtk_item_factory_get_item(menu_items,"<HY_WINDOW>/Model")) {
+        gtk_item_factory_delete_item (menu_items, "<HY_WINDOW>/File/Save");
+        gtk_item_factory_create_items (menu_items,  sizeof (hyphy_parameter_model_window_menu) / sizeof (hyphy_parameter_model_window_menu[0]),
+                                       hyphy_parameter_model_window_menu, this);
+
+        GtkMenu * fileMenu = GTK_MENU (gtk_item_factory_get_widget (menu_items, "<HY_WINDOW>/File"));
+        gtk_menu_reorder_child (fileMenu, gtk_item_factory_get_item (menu_items, "<HY_WINDOW>/File/Save"), 0);
+
+        for (long k=0; k<rateOptions.lLength; k++) {
+            _String *thisItem = (_String*)rateOptions (k),
+                     chopped,
+                     type = "<CheckItem>";
+
+            GtkItemFactoryEntry aProcEntry = {NULL,NULL,(GtkItemFactoryCallback)hyphy_menu_item_callback,HY_MDL_WIN32_MENU_BASE+100+k,type.sData};
+            chopped = _String("/Model/Rate variation/")&*thisItem;
+            aProcEntry.path = chopped.sData;
+
+            gtk_item_factory_create_items (menu_items,  1, &aProcEntry, this);
+        }
+        gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(gtk_item_factory_get_widget_by_action(menu_items,HY_MDL_WIN32_MENU_BASE+100+rateChoice)),
+                                       true);
+
+        gtk_widget_set_sensitive(gtk_item_factory_get_widget (menu_items,"<HY_WINDOW>/Edit/Copy"),  true);
+        gtk_widget_set_sensitive(gtk_item_factory_get_widget (menu_items,"<HY_WINDOW>/Edit/Select All"),  true);
+    }
+}
+
+
+//__________________________________________________________________
+
+void _HYModelWindow::_UnsetMenuBar(void)
+{
+}
+
+//__________________________________________________________________
+
+
+bool        _HYModelWindow::_ProcessMenuSelection (long msel)
+{
+    if (_HYTWindow::_ProcessMenuSelection(msel)) {
+        return true;
+    }
+
+    switch (msel) {
+    case HY_WINDOW_MENU_ID_FILE+1: // save menu
+    case HY_WINDOW_MENU_ID_FILE+3: { // save as menu
+        DoSave (msel-HY_WINDOW_MENU_ID_FILE-2);
+        return true;
+    }
+
+    case HY_WINDOW_MENU_ID_FILE+2: { // print
+        _HYTable* t = (_HYTable*)GetCellObject (MODEL_MATRIX_ROW,4);
+        t->_PrintTable((_HYTable*)GetCellObject (MODEL_MATRIX_ROW-1,4));
+        return true;
+    }
+
+    case HY_WINDOW_MENU_ID_EDIT+1: { // copy
+        DoCopyCell ();
+        return true;
+    }
+
+    case HY_WINDOW_MENU_ID_EDIT+3: { // paste
+        DoPasteToCells();
+        return true;
+    }
+
+    case HY_WINDOW_MENU_ID_EDIT+5: { // select all
+        DoSelectAll();
+        return true;
+    }
+
+    case HY_MDL_WIN32_MENU_BASE: { // model menu
+        DoEditModelName ();
+        return true;
+    }
+
+    default: { // rate menu
+        msel -= HY_MDL_WIN32_MENU_BASE+100;
+        if (msel >=0 && gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(gtk_item_factory_get_widget_by_action(menu_items,HY_MDL_WIN32_MENU_BASE+100+msel))))
+            if (msel!=rateChoice) {
+                gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(gtk_item_factory_get_widget_by_action(menu_items,HY_MDL_WIN32_MENU_BASE+100+rateChoice)),false);
+                rateChoice = msel;
+                taint = true;
+            }
+        return true;
+    }
+    }
+
+
+    return false;
+}
+
+//__________________________________________________________________
+
+void _HYModelWindow::_UpdateEditMenu (bool c, bool p)
+{
+    gtk_widget_set_sensitive(gtk_item_factory_get_widget (menu_items,"<HY_WINDOW>/Edit/Copy"),  c);
+    gtk_widget_set_sensitive(gtk_item_factory_get_widget (menu_items,"<HY_WINDOW>/Edit/Paste"),  p);
+}
+
+//__________________________________________________________________
+
+bool _HYModelWindow::_CheckClipboard (void)
+{
+    /*clipboardString = empty;
+    HANDLE  scrapHandle = GetClipboardData (CF_TEXT);
+
+    if (scrapHandle)
+    {
+        _String cText ((char*)scrapHandle);
+        skipWarningMessages = true;
+        _Formula f (cText,nil,false);
+        skipWarningMessages = false;
+        if (f.GetList().lLength)
+        {
+            clipboardString = cText;
+            SyncEditBox ();
+        }
+    }
+    return clipboardString.sLength;*/
+    return false;
+}
+
+//__________________________________________________________________
+
+void _HYModelWindow::_SetClipboard (void)
+{
+    //if (clipboardString.sLength)
+    //  PlaceStringInClipboard (clipboardString, (Ptr)theWindow);
+}
+
+//EOF
\ No newline at end of file
diff --git a/src/gui/gtk/WindowClasses/HYPlatformPWindow.cpp b/src/gui/gtk/WindowClasses/HYPlatformPWindow.cpp
new file mode 100644
index 0000000..35855ef
--- /dev/null
+++ b/src/gui/gtk/WindowClasses/HYPlatformPWindow.cpp
@@ -0,0 +1,225 @@
+/*
+    TBI parts of HYPWindow for GTK
+*/
+
+#include "HYGWindow.h"
+#include "HYCanvas.h"
+#include "errorfns.h"
+#include "HYDialogs.h"
+
+#define  HY_PWINDOW_WIN32_MENU_BASE  9000
+
+
+//__________________________________________________________________
+// _HYPlatformPWindow
+//__________________________________________________________________
+
+_HYPlatformPWindow::_HYPlatformPWindow          (void)
+{
+    // TBI
+}
+
+//__________________________________________________________________
+
+_HYPlatformPWindow::~_HYPlatformPWindow         (void)
+{
+    // TBI
+}
+
+//__________________________________________________________________
+
+void    _HYPlatformPWindow::_StartPicture   (void)
+{
+    // TBI
+}
+
+//__________________________________________________________________
+
+void    _HYPlatformPWindow::_EndPicture     (void)
+{
+    // TBI
+}
+
+//__________________________________________________________________
+
+void    _HYPlatformPWindow::_DrawPicture    (_HYRect r)
+{
+    //TBI
+}
+
+//__________________________________________________________________
+// _HYPWindow
+//__________________________________________________________________
+
+void        _HYPWindow::_PrintPWindow(void)
+{
+    // TBI
+}
+
+//__________________________________________________________________
+
+void _HYPWindow::_SetWindowRectangle(int top, int left, int bottom, int right, bool ss)
+{
+    if (theWindow && ss && GTK_WIDGET_MAPPED (theWindow)) {
+        long    menuHeight = 0;
+        if (windowMB) {
+            menuHeight = windowMB->allocation.x;
+            if (menuHeight <= 0) {
+                GtkRequisition sizeReq;
+                gtk_widget_size_request (windowMB,&sizeReq);
+                menuHeight = sizeReq.height;
+            }
+        }
+
+        GdkGeometry windowG;
+        windowG.min_width = windowG.max_width  = right-left;
+        windowG.max_height = bottom-top+menuHeight;
+        gtk_window_set_geometry_hints (GTK_WINDOW(theWindow), NULL, &windowG, (GdkWindowHints)(GDK_HINT_MAX_SIZE));
+
+        //SetContentSize    (right-left,bottom-top);
+        _HYPlatformWindow::_SetWindowRectangle (top,left,bottom,right, ss);
+    }
+}
+
+//__________________________________________________________________
+
+void    _HYPWindow::_Paint (Ptr p)
+{
+    // TBI
+    _HYGWindow::_Paint (p);
+}
+
+//__________________________________________________________________
+
+void    _HYPWindow::_Update (Ptr p)
+{
+    _Paint (p);
+}
+
+//__________________________________________________________________
+
+long _HYPWindow::_Grow(Ptr theData)
+{
+    /*_HYPlatformWindow::_Grow (theData);
+    RECT myDims;
+    GetClientRect (theWindow,&myDims);
+
+    SetWindowRectangle (0,0,myDims.bottom,myDims.right,false);
+
+    GetClientRect  (theWindow,&myDims);
+    InvalidateRect (theWindow,&myDims,false);*/
+    return 0;
+}
+
+//__________________________________________________________________
+
+bool        _HYPWindow::_ProcessMenuSelection (long msel)
+{
+    return _HYWindow::_ProcessMenuSelection(msel);
+
+    /*bool      done = false;
+
+    switch (msel)
+    {
+        case HY_WINDOW_MENU_ID_FILE+2:
+            _PrintPWindow();
+            done = true;
+            break;
+
+        case HY_PWINDOW_WIN32_MENU_BASE:
+            Zoom (1.1);
+            done = true;
+            break;
+
+        case HY_PWINDOW_WIN32_MENU_BASE+1:
+            Zoom (.9);
+            done = true;
+            break;
+
+        case HY_PWINDOW_WIN32_MENU_BASE+2:
+            OriginalSize();
+            done = true;
+            break;
+    }
+
+    if (!done)
+        return _HYGWindow::_ProcessMenuSelection (msel);
+
+    return done;*/
+}
+
+//__________________________________________________________________
+
+void _HYPWindow::_SetMenuBar(void)
+{
+    /*
+        _HYGWindow::_SetMenuBar();
+
+        HMENU            windowMenu = GetMenu (theWindow),
+                         chartMenu =  GetSubMenu(windowMenu,2);
+
+        if (!chartMenu)
+        {
+            chartMenu   = CreateMenu();
+
+            InsertMenu   (chartMenu,  0xFFFFFFFF, MF_BYPOSITION|MF_STRING, HY_PWINDOW_WIN32_MENU_BASE  , "&Enlarge\tCtrl-1");
+            InsertMenu   (chartMenu,  0xFFFFFFFF, MF_BYPOSITION|MF_STRING, HY_PWINDOW_WIN32_MENU_BASE+1, "&Shrink\tCtrl-2");
+            InsertMenu   (chartMenu,  0xFFFFFFFF, MF_BYPOSITION|MF_STRING, HY_PWINDOW_WIN32_MENU_BASE+2, "&Original Size\tCtrl-3");
+
+            InsertMenu   (windowMenu, 2, MF_BYPOSITION|MF_POPUP, (UINT) chartMenu , "&Image");
+
+
+            accels       << (FCONTROL|FVIRTKEY);
+            accels       << '1';
+            accels       << HY_PWINDOW_WIN32_MENU_BASE;
+
+            accels       << (FCONTROL|FVIRTKEY);
+            accels       << '2';
+            accels       << HY_PWINDOW_WIN32_MENU_BASE+1;
+
+            accels       << (FCONTROL|FVIRTKEY);
+            accels       << '3';
+            accels       << HY_PWINDOW_WIN32_MENU_BASE+2;
+
+            _AddStandardAccels();
+            _BuildAccelTable  (true);
+            accels.Clear();
+        }
+
+        DrawMenuBar(theWindow);*/
+
+}
+
+//__________________________________________________________________
+
+void _HYPWindow::_UnsetMenuBar(void)
+{
+
+}
+
+//__________________________________________________________________
+
+bool _HYPWindow::_ProcessOSEvent (Ptr vEvent)
+{
+    /*_HYWindowsUIMessage * theEvent = (_HYWindowsUIMessage *)vEvent;
+
+    switch (theEvent->iMsg)
+    {
+        case WM_GETMINMAXINFO:
+
+            MINMAXINFO* windowInfo = (MINMAXINFO*)theEvent->lParam;
+
+            windowInfo->ptMinTrackSize.x = 10;
+            windowInfo->ptMinTrackSize.y = 10;
+            windowInfo->ptMaxSize.x=windowInfo->ptMaxTrackSize.x = 0x7777;
+            windowInfo->ptMaxSize.y=windowInfo->ptMaxTrackSize.y = 0x7777;
+
+            return false;
+        break;
+    }*/
+
+    return _HYPlatformWindow::_ProcessOSEvent (vEvent);
+}
+
+//__________________________________________________________________
+//EOF
\ No newline at end of file
diff --git a/src/gui/gtk/WindowClasses/HYPlatformParameterTable.cpp b/src/gui/gtk/WindowClasses/HYPlatformParameterTable.cpp
new file mode 100644
index 0000000..d4cca5d
--- /dev/null
+++ b/src/gui/gtk/WindowClasses/HYPlatformParameterTable.cpp
@@ -0,0 +1,251 @@
+/*
+    GTK+ Portions of the parameter table class
+
+    Sergei L. Kosakovsky Pond, Spring 2005.
+*/
+
+#include "HYParameterTable.h"
+#include "HYUtils.h"
+
+#define     HY_PT_WIN32_MENU_BASE  9000
+
+static GtkItemFactoryEntry hyphy_parameter_table_window_menu[] = {
+    { "/_Likelihood",                       NULL,         NULL,           0,    "<Branch>" },
+    { "/Likelihood/_View Options",          NULL,         NULL,           0,    "<Branch>" },
+    { "/Likelihood/View Options/_Local parameters",           NULL,    (GtkItemFactoryCallback)hyphy_menu_item_callback,                HY_PT_WIN32_MENU_BASE+10, "<CheckItem>" },
+    { "/Likelihood/View Options/_Global parameters",          NULL,    (GtkItemFactoryCallback)hyphy_menu_item_callback,                HY_PT_WIN32_MENU_BASE+11, "<CheckItem>" },
+    { "/Likelihood/View Options/_Constrained parameters",     NULL,    (GtkItemFactoryCallback)hyphy_menu_item_callback,                HY_PT_WIN32_MENU_BASE+12, "<CheckItem>" },
+    { "/Likelihood/View Options/_Rate classes",     NULL,    (GtkItemFactoryCallback)hyphy_menu_item_callback,              HY_PT_WIN32_MENU_BASE+13, "<CheckItem>" },
+    { "/Likelihood/View Options/_Trees",     NULL,    (GtkItemFactoryCallback)hyphy_menu_item_callback,             HY_PT_WIN32_MENU_BASE+14, "<CheckItem>" },
+    { "/Likelihood/sep1",                                     NULL,    NULL,           0,   "<Separator>" },
+    { "/Likelihood/_Recalculate LF",     "<control>U",    (GtkItemFactoryCallback)hyphy_menu_item_callback,             HY_PT_WIN32_MENU_BASE, "<Item>" },
+    { "/Likelihood/_Optimize LF",     "<control>T",    (GtkItemFactoryCallback)hyphy_menu_item_callback,                HY_PT_WIN32_MENU_BASE+1, "<Item>" },
+    { "/Likelihood/sep2",                                     NULL,    NULL,           0,   "<Separator>" },
+    { "/Likelihood/_Enter command",     NULL,       (GtkItemFactoryCallback)hyphy_menu_item_callback,               HY_PT_WIN32_MENU_BASE+2, "<Item>" },
+    { "/Likelihood/Remove _unused parameters",     NULL,        (GtkItemFactoryCallback)hyphy_menu_item_callback,               HY_PT_WIN32_MENU_BASE+3, "<Item>" },
+    { "/Likelihood/sep3",                                     NULL,    NULL,           0,   "<Separator>" },
+    { "/Likelihood/Covariance, sampler and C_I",     NULL,      (GtkItemFactoryCallback)hyphy_menu_item_callback,               HY_PT_WIN32_MENU_BASE+4, "<Item>" },
+    { "/Likelihood/Likelihood pro_file plot",     NULL,     (GtkItemFactoryCallback)hyphy_menu_item_callback,               HY_PT_WIN32_MENU_BASE+5, "<Item>" },
+    { "/Likelihood/sep4",                                     NULL,    NULL,           0,   "<Separator>" },
+    { "/Likelihood/Cate_gories Processor",     NULL,        (GtkItemFactoryCallback)hyphy_menu_item_callback,               HY_PT_WIN32_MENU_BASE+6, "<Item>" },
+    { "/Likelihood/sep5",                                     NULL,    NULL,           0,   "<Separator>" },
+    { "/Likelihood/Sele_ct parameters",     NULL,       (GtkItemFactoryCallback)hyphy_menu_item_callback,               HY_PT_WIN32_MENU_BASE+7, "<Item>" },
+    { "/Likelihood/_Open selection in table",     NULL,     (GtkItemFactoryCallback)hyphy_menu_item_callback,               HY_PT_WIN32_MENU_BASE+8, "<Item>" }
+};
+
+//__________________________________________________________________
+
+void _HYParameterTable::_SetMenuBar(void)
+{
+    if (menu_items && !gtk_item_factory_get_widget(menu_items,"<HY_WINDOW>/Likelihood")) {
+        gtk_item_factory_create_items (menu_items,  sizeof (hyphy_parameter_table_window_menu) / sizeof (hyphy_parameter_table_window_menu[0]),
+                                       hyphy_parameter_table_window_menu, this);
+        _UpdateViewMenu();
+        gtk_widget_set_sensitive (gtk_item_factory_get_widget_by_action(menu_items,HY_WINDOW_MENU_ID_EDIT),undoCommands.lLength);
+    }
+}
+
+//__________________________________________________________________
+
+
+bool        _HYParameterTable::_ProcessMenuSelection (long msel)
+{
+
+    _HYTable*   table = (_HYTable*)GetCellObject(HY_PARAMETER_TABLE_TABLE_ROW,0);
+    bool        res = false;
+
+    switch (msel) {
+    case HY_WINDOW_MENU_ID_FILE+1: { // save
+        DoSave ();
+        res = true;
+        break;
+    }
+    case HY_WINDOW_MENU_ID_FILE+2: { // print
+        _SimpleList columns,
+                    sel;
+        columns << 0;
+        columns << 1;
+        columns << 2;
+        columns << 3;
+        table->GetSelection (sel);
+        char    resp = 3;
+        if (sel.lLength) {
+            _String pr ("Would you like to print only the selected cells? (Click \"No\" to print the entire table).");
+            resp = YesNoCancelPrompt (pr);
+        }
+        if (resp == 3) {
+            table->_PrintTable(columns,(_HYTable*)GetCellObject(HY_PARAMETER_TABLE_TABLE_ROW-1,0));
+        } else if (resp == 1) {
+            _SimpleList rows;
+            for (long k = 0; k < sel.lLength; k+=4) {
+                rows << sel.lData[k]/4;
+            }
+            table->_PrintTable(columns,rows,(_HYTable*)GetCellObject(HY_PARAMETER_TABLE_TABLE_ROW-1,0));
+        }
+        res = true;
+        break;
+    }
+
+    case HY_WINDOW_MENU_ID_EDIT: { // undo
+        UndoCommand();
+        _UpdateUndoMenu (nil,nil);
+        res = true;
+        break;
+    }
+
+    case HY_WINDOW_MENU_ID_EDIT+5: { // undo
+        SelectAll();
+        res = true;
+        break;
+    }
+
+    case HY_PT_WIN32_MENU_BASE+10:
+    case HY_PT_WIN32_MENU_BASE+11:
+    case HY_PT_WIN32_MENU_BASE+12:
+    case HY_PT_WIN32_MENU_BASE+13: {
+        res = true;
+        char   toggleFlag;
+        GtkWidget * checkMI = gtk_item_factory_get_widget_by_action(menu_items,msel);
+        msel -= HY_PT_WIN32_MENU_BASE+10;
+        switch (msel) {
+        case 0:
+            toggleFlag = HY_PARAMETER_TABLE_VIEW_LOCAL;
+            break;
+        case 1:
+            toggleFlag = HY_PARAMETER_TABLE_VIEW_GLOBAL;
+            break;
+        case 2:
+            toggleFlag = HY_PARAMETER_TABLE_VIEW_CONSTRAINED;
+            break;
+        case 3:
+            toggleFlag = HY_PARAMETER_TABLE_VIEW_CATEGORY;
+            break;
+
+        }
+        if (gtk_check_menu_item_get_active (GTK_CHECK_MENU_ITEM(checkMI)) != (bool)viewOptions&toggleFlag) {
+            if (viewOptions&toggleFlag) {
+                if (viewOptions-toggleFlag) {
+                    viewOptions-=toggleFlag;
+                } else {
+                    break;
+                }
+            } else {
+                viewOptions+=toggleFlag;
+            }
+
+            gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM(checkMI), viewOptions&toggleFlag);
+            ConstructTheTable();
+            SetWindowRectangle (top,left,bottom,right);
+        }
+        break;
+    }
+
+    case HY_PT_WIN32_MENU_BASE+1:
+        OptimizeLikelihoodFunction();
+        res = true;
+        break;
+
+    case HY_PT_WIN32_MENU_BASE+2:
+        DoEnterConstraint ();
+        res = true;
+        break;
+
+    case HY_PT_WIN32_MENU_BASE+3:
+        DoCleanUp   ();
+        res = true;
+        break;
+
+    case HY_PT_WIN32_MENU_BASE+4:
+        HandleVarianceEstimates ();
+        res = true;
+        break;
+
+    case HY_PT_WIN32_MENU_BASE+5:
+        HandleProfilePlot   ();
+        res = true;
+        break;
+
+    case HY_PT_WIN32_MENU_BASE+6:
+        HandleCategories    ();
+        res = true;
+        break;
+
+    case HY_PT_WIN32_MENU_BASE+7:
+        HandleSelectParameters  ();
+        res = true;
+        break;
+
+    case HY_PT_WIN32_MENU_BASE+8:
+        HandleOpenInChart   ();
+        res = true;
+        break;
+    }
+
+    if (!res) {
+        res = _HYTWindow::_ProcessMenuSelection(msel);
+    }
+    return res;
+}
+
+//__________________________________________________________________
+
+void _HYParameterTable::_UpdateViewMenu(void)
+{
+    GtkWidget * vlocal  = gtk_item_factory_get_widget_by_action(menu_items,HY_PT_WIN32_MENU_BASE+10),
+                * vglobal = gtk_item_factory_get_widget_by_action(menu_items,HY_PT_WIN32_MENU_BASE+11),
+                  * vconstr = gtk_item_factory_get_widget_by_action(menu_items,HY_PT_WIN32_MENU_BASE+12),
+                    * vcateg  = gtk_item_factory_get_widget_by_action(menu_items,HY_PT_WIN32_MENU_BASE+13),
+                      * vtree   = gtk_item_factory_get_widget_by_action(menu_items,HY_PT_WIN32_MENU_BASE+14);
+
+    gtk_widget_set_sensitive (vglobal,avViewOptions&HY_PARAMETER_TABLE_VIEW_GLOBAL);
+    gtk_widget_set_sensitive (vconstr,avViewOptions&HY_PARAMETER_TABLE_VIEW_CONSTRAINED);
+    gtk_widget_set_sensitive (vcateg,avViewOptions&HY_PARAMETER_TABLE_VIEW_CATEGORY);
+    gtk_widget_set_sensitive (vtree,avViewOptions&HY_PARAMETER_TABLE_VIEW_TREES);
+
+    if (gtk_check_menu_item_get_active (GTK_CHECK_MENU_ITEM (vlocal)) != (viewOptions&HY_PARAMETER_TABLE_VIEW_LOCAL)) {
+        gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (vlocal), viewOptions&HY_PARAMETER_TABLE_VIEW_LOCAL);
+    }
+    if (gtk_check_menu_item_get_active (GTK_CHECK_MENU_ITEM (vglobal)) != (viewOptions&HY_PARAMETER_TABLE_VIEW_GLOBAL)) {
+        gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (vglobal), viewOptions&HY_PARAMETER_TABLE_VIEW_GLOBAL);
+    }
+    if (gtk_check_menu_item_get_active (GTK_CHECK_MENU_ITEM (vconstr)) != (viewOptions&HY_PARAMETER_TABLE_VIEW_CONSTRAINED)) {
+        gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (vconstr), viewOptions&HY_PARAMETER_TABLE_VIEW_CONSTRAINED);
+    }
+    if (gtk_check_menu_item_get_active (GTK_CHECK_MENU_ITEM (vcateg)) != (viewOptions&HY_PARAMETER_TABLE_VIEW_CATEGORY)) {
+        gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (vcateg), viewOptions&HY_PARAMETER_TABLE_VIEW_CATEGORY);
+    }
+    if (gtk_check_menu_item_get_active (GTK_CHECK_MENU_ITEM (vtree)) != (viewOptions&HY_PARAMETER_TABLE_VIEW_TREES)) {
+        gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (vtree), viewOptions&HY_PARAMETER_TABLE_VIEW_TREES);
+    }
+}
+
+
+//__________________________________________________________________
+
+void _HYParameterTable::_UnsetMenuBar(void)
+{
+}
+
+//__________________________________________________________________
+
+void _HYParameterTable::_UpdateUndoMenu(_String* command, _String* desc)
+{
+    GtkWidget * undoItem = gtk_item_factory_get_widget_by_action(menu_items,HY_WINDOW_MENU_ID_EDIT);
+    if (command&&desc) {
+        undoCommands        &&  command;
+        undoDescriptions    &&  desc;
+        gtk_widget_set_sensitive (undoItem,true);
+        gtk_label_set_text (GTK_LABEL (gtk_bin_get_child(GTK_BIN(undoItem))), desc->sData);
+    } else {
+        if (undoDescriptions.lLength==0) {
+            gtk_widget_set_sensitive (undoItem,false);
+            gtk_label_set_text (GTK_LABEL (gtk_bin_get_child(GTK_BIN(undoItem))), "Can't _undo");
+        } else {
+            _String       temp =  *(_String*)undoDescriptions(undoDescriptions.lLength-1);
+            gtk_widget_set_sensitive (undoItem,true);
+            gtk_label_set_text (GTK_LABEL (gtk_bin_get_child(GTK_BIN(undoItem))), temp.sData);
+        }
+    }
+}
+
+//EOF
\ No newline at end of file
diff --git a/src/gui/gtk/WindowClasses/HYPlatformTWindow.cpp b/src/gui/gtk/WindowClasses/HYPlatformTWindow.cpp
new file mode 100644
index 0000000..6969233
--- /dev/null
+++ b/src/gui/gtk/WindowClasses/HYPlatformTWindow.cpp
@@ -0,0 +1,545 @@
+/*
+    GTK+ glue for the container window
+
+    Sergei L. Kosakovsky Pond, October-November 2004
+*/
+
+#include "HYTableWindow.h"
+#include "HYEventTypes.h"
+#include "HYUtils.h"
+#include "errorfns.h"
+#include "HYGraphicPane.h"
+#include <gdk/gdkkeysyms.h>
+
+
+//__________________________________________________________________
+extern      _SimpleList     windowPtrs,
+            windowObjects;
+
+GdkColor    _BLACK_ = {0,0,0,0};
+GdkPixmap   *stripedFill        = nil;
+GdkGC       *stripedFillGC      = nil;
+PangoLayout *statusBarLayout    = nil;
+PangoFontDescription
+*statusBarFontDesc  = nil;
+
+extern      _String             baseDirectory;
+
+_HYFont     statusBarFont       = {_HY_SANS_FONT,10, HY_FONT_PLAIN};
+//__________________________________________________________________
+
+gboolean IdleWindowTimer (Ptr* userData)
+{
+    _HYTWindow * myTW = (_HYTWindow*)userData;
+    for (long k=0; k<myTW->components.lLength; k++)
+        if (myTW->cells.Find(k)>=0) {
+            _HYComponent* tC = (_HYComponent*)myTW->components(k);
+            tC->IdleHandler();
+        }
+    myTW->_HandleIdleEvent ();
+    return true;
+}
+
+
+
+//__________________________________________________________________
+
+/*  pascal OSStatus scrollWheelHandler (EventHandlerCallRef , EventRef theEvent, void* userData)
+    {
+        EventParamType                  actType;
+        EventMouseWheelAxis             axis;
+        GetEventParameter (theEvent,  kEventParamMouseWheelAxis, typeMouseWheelAxis, &actType,sizeof(EventMouseWheelAxis),nil,&axis);
+
+        if (axis == kEventMouseWheelAxisY)
+        {
+            Point              mouseLocation;
+            GetEventParameter (theEvent, kEventParamMouseLocation, typeQDPoint, &actType,sizeof(Point),nil,&mouseLocation);
+
+            long               mouseWheelDelta;
+            GetEventParameter (theEvent, kEventParamMouseWheelDelta, typeLongInteger, &actType,sizeof(Point),nil,&mouseWheelDelta);
+
+            UInt32 modifiers;
+            GetEventParameter (theEvent, kEventParamKeyModifiers, typeUInt32, NULL, sizeof(modifiers), NULL, &modifiers);
+
+            if (modifiers & optionKey)
+                 mouseWheelDelta *= 10;
+
+            _HYTWindow* thisWindow = (_HYTWindow*)windowObjectRefs(windowPtrs.Find((long)userData));
+            GrafPtr savedPort;
+            GetPort(&savedPort);
+            #ifdef OPAQUE_TOOLBOX_STRUCTS
+                SetPort(GetWindowPort(thisWindow->theWindow));
+            #else
+                SetPort(thisWindow->theWindow);
+            #endif
+            GlobalToLocal (&mouseLocation);
+            int c = thisWindow->FindClickedCell(mouseLocation.h,mouseLocation.v);
+            thisWindow->DoMouseWheel (c, mouseWheelDelta);
+            return noErr;
+        }
+
+        return eventNotHandledErr;
+    }*/
+
+//__________________________________________________________________
+
+
+bool        _HYTWindow::_ProcessMenuSelection (long msel)
+{
+    // TBI
+    /*long          menuChoice = msel&0x0000ffff;
+    bool        done = false;
+
+    switch (msel/0xffff)
+    {
+        case 129:
+            if (menuChoice == 7) // print setup
+            {
+                OSStatus theStatus;
+                Boolean isAccepted;
+
+                theStatus = PMBegin();
+                if (theStatus != noErr)
+                    return false;
+
+                if (InitPrint())
+                    theStatus = PMPageSetupDialog(gPageFormat, &isAccepted);
+
+                if (theStatus == noErr)
+                {
+                    if (gFlattenedFormat != NULL)
+                    {
+                        DisposeHandle(gFlattenedFormat);
+                        gFlattenedFormat = NULL;
+                    }
+
+                    theStatus = PMFlattenPageFormat(gPageFormat, &gFlattenedFormat);
+                }
+
+                if (gPageFormat != kPMNoPageFormat)
+                {
+                    theStatus = PMDisposePageFormat(gPageFormat);
+                    gPageFormat = kPMNoPageFormat;
+                }
+
+                theStatus = PMEnd();
+                return true;
+            }
+
+        case 130:
+        {
+            if ((menuChoice == 4)||(menuChoice==5))
+            {
+                done = true;
+                HandleCopyPaste(menuChoice-4);
+                break;
+            }
+        }
+    }
+
+    HiliteMenu(0);
+    InvalMenuBar();*/
+
+    return _HYWindow::_ProcessMenuSelection(msel);
+}
+
+//__________________________________________________________________
+
+long _HYTWindow::_Grow(Ptr theData)
+{
+    return  0;
+}
+
+//__________________________________________________________________
+
+void _HYTWindow::_PaintStatusBar(Ptr,bool)
+{
+    if (GTK_WIDGET_MAPPED (theWindow)) {
+        if (!stripedFillGC) {
+            SetUpStatusBarStuff (windowContent);
+        }
+
+        GdkRectangle    statusBarR = {windowContent->allocation.x,
+                                      windowContent->allocation.y+windowContent->allocation.height-HY_SCROLLER_WIDTH,
+                                      windowContent->allocation.width,
+                                      HY_SCROLLER_WIDTH
+                                     };
+
+        gdk_gc_set_fill (stripedFillGC,GDK_TILED);
+        gdk_draw_rectangle (GDK_DRAWABLE (theWindow->window), stripedFillGC, true, statusBarR.x, statusBarR.y,
+                            statusBarR.width, statusBarR.height);
+
+        gdk_gc_set_fill (stripedFillGC,GDK_SOLID);
+        gdk_draw_line(GDK_DRAWABLE (theWindow->window), stripedFillGC,statusBarR.x,statusBarR.y,statusBarR.x+statusBarR.width,statusBarR.y);
+        if (statusBar.sLength && statusBarR.width > statusBarFont.size) {
+            statusBarR.width  -= statusBarFont.size;
+            //statusBarR.height  = statusBarFont.size;
+            statusBarR.x += statusBarFont.size/2 + (flags&HY_WINDOW_STATUS_BAR_LIGHT_LEFT)?20:0;
+            statusBarR.y += HY_SCROLLER_WIDTH-4*statusBarFont.size/3;
+
+            pango_layout_set_text (statusBarLayout, statusBar.sData, statusBar.sLength);
+
+            gdk_gc_set_clip_rectangle  (stripedFillGC, &statusBarR);
+            gdk_draw_layout (GDK_DRAWABLE (theWindow->window), stripedFillGC, statusBarR.x, statusBarR.y, statusBarLayout);
+            gdk_gc_set_clip_rectangle  (stripedFillGC, nil);
+        }
+
+    }
+
+    // TBI
+    /*Rect clearRect = newHRect();
+    FillCRect (&clearRect, statusBarFill);
+    if (hScroll)
+    {
+        clearRect = newVRect();
+        EraseRect (&clearRect);
+    }
+    else
+    {
+        RGBColor saveColor;
+        GetForeColor (&saveColor);
+        RGBForeColor (&_BLACK_);
+        MoveTo (clearRect.left,clearRect.top);
+        LineTo (clearRect.right,clearRect.top);
+        RGBForeColor (&saveColor);
+        if (statusBar.sLength)
+        {
+            #ifdef OPAQUE_TOOLBOX_STRUCTS
+                Rect    destRect;
+                GetWindowBounds (theWindow,kWindowGlobalPortRgn,&destRect);
+                OffsetRect (&destRect,-destRect.left,-destRect.top);
+                if (flags&HY_WINDOW_STATUS_BAR_LIGHT_LEFT)
+                    MoveTo (20,destRect.bottom-4);
+                else
+                    MoveTo (5,destRect.bottom-4);
+            #else
+                if (flags&HY_WINDOW_STATUS_BAR_LIGHT_LEFT)
+                    MoveTo (20,theWindow->portRect.bottom-4);
+                else
+                    MoveTo (5,theWindow->portRect.bottom-4);
+            #endif
+            TextFont(0);
+            TextFace(0);
+            TextSize(9);
+            DrawText(statusBar.sData,0,statusBar.sLength);
+        }
+    }*/
+}
+
+//__________________________________________________________________
+
+void _HYTWindow::_Paint(Ptr p)
+{
+    _HYRect         relRect;
+    _SimpleList     alreadyDone (cells.lLength);
+
+    GdkEventExpose * expEvent = (GdkEventExpose*)p;
+
+    for (int k=0; k<cells.lLength; k++) {
+        long i = cells.lData[k];
+
+        if (alreadyDone.lData[i] == 0) {
+            relRect.left = componentL.lData[i];
+            relRect.right = componentR.lData[i];
+            relRect.top = componentT.lData[i];
+            relRect.bottom = componentB.lData[i];
+
+            if (expEvent) {
+                GdkRectangle paintRect = HYRect2GDKRect(relRect);
+
+                paintRect.x += windowContent->allocation.x;
+                paintRect.y += windowContent->allocation.y;
+
+                GdkOverlapType otv = gdk_region_rect_in(expEvent->region,&paintRect);
+
+                if (otv != GDK_OVERLAP_RECTANGLE_OUT) {
+                    ((_HYComponent*)components(i))->Update((Ptr)&relRect);
+                }
+            } else {
+                ((_HYComponent*)components(i))->Update((Ptr)&relRect);
+            }
+
+            alreadyDone.lData[i] = 1;
+        }
+    }
+
+    if (!hScroll && (flags&HY_WINDOW_SIZE)) {
+        _PaintStatusBar();
+    }
+}
+
+//__________________________________________________________________
+
+void _HYTWindow::_Update(Ptr p)
+{
+    //_Paint(p);
+}
+
+//__________________________________________________________________
+
+void _HYTWindow::_Activate(void)
+{
+    for (int i=0; i<components.lLength; i++)
+        if (cells.Find(i)>=0) {
+            ((_HYComponent*)components(i))->Activate();
+        }
+
+
+    if (!theTimer) {
+        theTimer = g_timeout_add  (500,(GSourceFunc)IdleWindowTimer,(gpointer)this);
+    }
+
+    _HYPlatformWindow::_Activate();
+
+}
+
+//__________________________________________________________________
+
+void _HYTWindow::_Activate2(void)
+{
+}
+
+//__________________________________________________________________
+
+void _HYTWindow::_Deactivate2(void)
+{
+}
+
+//__________________________________________________________________
+
+void _HYTWindow::_Zoom(bool inOut)
+{
+    if ((((savedLoc.right-savedLoc.left!=right-left)||(savedLoc.bottom-savedLoc.top!=bottom-left)))&&(!inOut)) {
+        SetPosition (savedLoc.left,savedLoc.top);
+        SetWindowRectangle (0,0,savedLoc.bottom-savedLoc.top, savedLoc.right-savedLoc.left);
+    } else {
+        _HYRect sd = GetScreenDimensions();
+        SetPosition (2,2);
+        SetWindowRectangle (0,0, sd.bottom-5, sd.right-5);
+    }
+}
+
+//__________________________________________________________________
+
+void _HYTWindow::_Deactivate(void)
+{
+    for (int i=0; i<components.lLength; i++)
+        if (cells.Find(i)>=0) {
+            ((_HYComponent*)components(i))->Deactivate();
+        }
+
+    if (theTimer) {
+        g_source_remove (theTimer);
+        theTimer = 0;
+    }
+    _HYPlatformWindow::_Deactivate();
+}
+
+//__________________________________________________________________
+void        _HYTWindow::_SetStatusBar(_String& text)
+{
+    statusBar = text;
+    GdkRectangle    titleBarRect = {theWindow->allocation.x, theWindow->allocation.y+theWindow->allocation.height - HY_SCROLLER_WIDTH,
+                                    theWindow->allocation.width, HY_SCROLLER_WIDTH
+                                   };
+
+    if (theWindow->window) {
+        gdk_window_invalidate_rect (theWindow->window, &titleBarRect, false);
+    }
+}
+
+//__________________________________________________________________
+
+bool _HYTWindow::_ProcessOSEvent (Ptr vEvent)
+{
+    _HYWindow* theParent = (_HYWindow*)this;
+
+    _HY_GTK_UI_Message * theMessage = (_HY_GTK_UI_Message*)vEvent;
+
+
+    gdouble   xc,
+              yc;
+
+    if (theMessage->theEvent->type == GDK_KEY_PRESS) {
+        GdkEventKey * kpe = (GdkEventKey*)theMessage->theEvent;
+
+        if (keyboardFocusChain.lLength) {
+            int keyCode = kpe->keyval;
+            if (keyCode == GDK_Tab) { // tab
+                bool    backwards = kpe->state & GDK_SHIFT_MASK;
+
+                if (keyboardFocus==-1) {
+                    keyCode = keyboardFocusChain.lData[backwards?keyboardFocusChain.lLength-1:0];
+                } else if (keyboardFocusChain.lLength>1) {
+                    keyCode = keyboardFocusChain.Find (keyboardFocus);
+                    keyCode += backwards?(-1):1;
+                    if (keyCode<0) {
+                        keyCode = keyboardFocusChain.lLength-1;
+                    } else if (keyCode >= keyboardFocusChain.lLength) {
+                        keyCode = 0;
+                    }
+                    keyCode = keyboardFocusChain.lData[keyCode];
+                } else {
+                    keyCode = -1;
+                }
+
+                if (keyCode>=0) {
+                    ProcessEvent (generateKeyboardFocusEvent (((_HYComponent*)components(keyCode))->GetID()));
+                }
+                return true;
+            }
+        }
+
+        for (long k=0; k<components.lLength; k++)
+            if (cells.Find(k)>=0) {
+                _HYComponent* tC = (_HYComponent*)components(k);
+                if (tC->UnfocusedKeyboardInput())
+                    if (tC->_ProcessOSEvent (vEvent)) {
+                        return true;
+                    }
+            }
+
+        if ((keyboardFocus>=0)&&(keyboardFocus<components.lLength)) {
+            if (((_HYComponent*)components(keyboardFocus))->_ProcessOSEvent (vEvent)) {
+                return true;
+            }
+        }
+
+        return false;
+    }
+
+
+    if (gdk_event_get_coords (theMessage->theEvent,&xc,&yc)) {
+        if (trackMouseComponent) {
+            return ((_HYComponent*)trackMouseComponent)->_ProcessOSEvent (vEvent);
+        }
+
+        xc-=windowContent->allocation.x;
+        yc-=windowContent->allocation.y;
+
+        int c = FindClickedCell(xc,yc);
+
+        if (theMessage->theEvent->type == GDK_MOTION_NOTIFY || GDK_LEAVE_NOTIFY == theMessage->theEvent->type) {
+            if (c<0) {
+                if (lastMouseComponent>=0) {
+                    ((_HYComponent*)components(lastMouseComponent))->_ComponentMouseExit();
+                }
+
+                lastMouseComponent = -1;
+                return false;
+            } else {
+                if (lastMouseComponent>=0 && c!=lastMouseComponent) {
+                    ((_HYComponent*)components(lastMouseComponent))->_ComponentMouseExit();
+                }
+
+                //else
+                //  SetCursor (LoadCursor (nil, IDC_ARROW));
+
+                lastMouseComponent = c;
+                return ((_HYComponent*)components(c))->_ProcessOSEvent (vEvent);
+            }
+        } else {
+            if (c>=0 && (theMessage->processingResult = ((_HYComponent*)components(c))->_ProcessOSEvent (vEvent))) {
+                return true;
+            }
+        }
+    }
+
+    return _HYPlatformWindow::_ProcessOSEvent (vEvent);
+}
+
+//__________________________________________________________________
+
+void _HYPlatformTWindow::_SetWindowRectangle(int top, int left, int bottom, int right, bool ss)
+{
+    _HYTWindow* pW = ((_HYTWindow*)this);
+    if (ss) {
+        _HYRect dr = pW->MinMaxWindowDimensions ();
+        GdkGeometry windowG;
+        windowG.max_width  = dr.right;
+        long    menuHeight = 0;
+        if (pW->windowMB) {
+            menuHeight = pW->windowMB->allocation.x;
+            if (menuHeight <= 0) {
+                GtkRequisition sizeReq;
+                gtk_widget_size_request (pW->windowMB,&sizeReq);
+                menuHeight = sizeReq.height;
+            }
+        }
+        windowG.max_height = dr.bottom+menuHeight;
+        windowG.min_width  = dr.left;
+        windowG.min_height = dr.top+menuHeight;
+
+        if (windowG.min_height > windowG.max_height) {
+            windowG.min_height = windowG.max_height;
+        }
+        if (windowG.min_width > windowG.max_width) {
+            windowG.min_width = windowG.max_width;
+        }
+        gtk_window_set_geometry_hints (GTK_WINDOW(pW->theWindow), NULL, &windowG, (GdkWindowHints)(GDK_HINT_MAX_SIZE|GDK_HINT_MIN_SIZE));
+    }
+    //pW->_HYPlatformWindow::_SetWindowRectangle (top,left,bottom,right,ss);
+}
+
+//__________________________________________________________________
+
+void        _HYTWindow::_SetCopyString (_String* str)
+{
+    // TBI
+    //ZeroScrap();
+    //PutScrap (str->sLength,'TEXT',str->sData);
+}
+
+//__________________________________________________________________
+
+_String*        _HYTWindow::_GetPasteString (void)
+{
+    _String *res = nil;
+    // TBI
+    /*Handle    scrapHandle = NewHandle (0);
+    long    rc;
+
+    #ifdef TARGET_API_MAC_CARBON
+        ScrapRef theScrapRef;
+        GetCurrentScrap(&theScrapRef);
+        GetScrapFlavorSize(theScrapRef, 'TEXT', &rc);
+    #else
+        long    scrapOffset;
+        rc = GetScrap( scrapHandle, 'TEXT', &scrapOffset );
+    #endif
+    if ( rc >= 0 )
+    {
+        SetHandleSize( scrapHandle, rc+1 );
+        HLock  (scrapHandle);
+        #ifdef TARGET_API_MAC_CARBON
+            GetScrapFlavorData(theScrapRef, 'TEXT', &rc, *scrapHandle);
+        #endif
+        (*scrapHandle)[rc] = 0;
+        HUnlock (scrapHandle);
+        res = new _String (*scrapHandle);
+    }
+    else
+        res = new _String;
+
+    DisposeHandle (scrapHandle);*/
+    return res;
+}
+
+//__________________________________________________________________
+
+_HYPlatformTWindow::_HYPlatformTWindow(Ptr)
+{
+    theTimer            = 0;
+    trackMouseComponent = nil;
+}
+
+//__________________________________________________________________
+
+_HYPlatformTWindow::~_HYPlatformTWindow(void)
+{
+    if (theTimer) {
+        g_source_remove (theTimer);
+        theTimer = 0;
+    }
+}
+//EOF
\ No newline at end of file
diff --git a/src/gui/gtk/WindowClasses/HYPlatformTreePanel.cpp b/src/gui/gtk/WindowClasses/HYPlatformTreePanel.cpp
new file mode 100644
index 0000000..b9cb3bb
--- /dev/null
+++ b/src/gui/gtk/WindowClasses/HYPlatformTreePanel.cpp
@@ -0,0 +1,853 @@
+/*
+    Tree  Panel Object  for GTK
+
+    Sergei L. Kosakovsky Pond, March 2005
+*/
+
+#include "HYTreePanel.h"
+#include "HYUtils.h"
+#include <gdk/gdkkeysyms.h>
+
+_String     saveForTreesPrompt ("Save Tree As:");
+
+GdkColor    navPen = HYColorToGDKColor((_HYColor)
+{
+    255,151,51
+});
+
+#define     HY_TREE_GTK_MENU_BASE  7000
+
+
+//__________________________________________________________________
+
+static GtkItemFactoryEntry hyphy_tree_window_menu[] = {
+    { "/Edit/sep2",         NULL,         NULL,           0,    "<Separator>" },
+    { "/Edit/Search and Repla_ce",     "<control>F",    (GtkItemFactoryCallback)hyphy_menu_item_callback,               HY_WINDOW_MENU_ID_EDIT+6, "<Item>" },
+    { "/Edit/Search and Re_place in Selection",     NULL,    (GtkItemFactoryCallback)hyphy_menu_item_callback,          HY_WINDOW_MENU_ID_EDIT+7, "<Item>" },
+    { "/_Tree",         NULL,         NULL,           0,                    "<Branch>" },
+    { "/Tree/Tip _Labels", NULL, (GtkItemFactoryCallback)hyphy_menu_item_callback, HY_TREE_GTK_MENU_BASE, "<CheckItem>"},
+    { "/Tree/I_nternal Labels", NULL, (GtkItemFactoryCallback)hyphy_menu_item_callback, HY_TREE_GTK_MENU_BASE+1, "<CheckItem>"},
+    { "/Tree/sep2",         NULL,         NULL,           0,        "<Separator>" },
+    { "/Tree/S_wap Subtrees",     "<control>1",    (GtkItemFactoryCallback)hyphy_menu_item_callback,                HY_TREE_GTK_MENU_BASE+2, "<Item>" },
+    { "/Tree/_Collapse Branch",     "<control>2",    (GtkItemFactoryCallback)hyphy_menu_item_callback,              HY_TREE_GTK_MENU_BASE+3, "<Item>" },
+    { "/Tree/_Join",     "<control>3",    (GtkItemFactoryCallback)hyphy_menu_item_callback,             HY_TREE_GTK_MENU_BASE+4, "<Item>" },
+    { "/Tree/_Graft A Tip",     "<control>4",    (GtkItemFactoryCallback)hyphy_menu_item_callback,              HY_TREE_GTK_MENU_BASE+5, "<Item>" },
+    { "/Tree/_Reroot",     "<control>5",    (GtkItemFactoryCallback)hyphy_menu_item_callback,               HY_TREE_GTK_MENU_BASE+6, "<Item>" },
+    { "/Tree/_Flip Tip Ordering",     "<control>6",    (GtkItemFactoryCallback)hyphy_menu_item_callback,                HY_TREE_GTK_MENU_BASE+7, "<Item>" },
+    { "/Tree/sep3",         NULL,         NULL,           0,        "<Separator>" },
+    { "/Tree/Select Branches",          NULL,         NULL,           0,                    "<Branch>" },
+    { "/Tree/Select Branches/Select _Entire Subtree",     NULL,    (GtkItemFactoryCallback)hyphy_menu_item_callback,                HY_TREE_GTK_MENU_BASE+8, "<Item>" },
+    { "/Tree/Select Branches/Select _Incomplete Branchhes",     "<control>I",    (GtkItemFactoryCallback)hyphy_menu_item_callback,              HY_TREE_GTK_MENU_BASE+9, "<Item>" },
+    { "/Tree/Select Branches/Select Bran_ches Without Models",     NULL,    (GtkItemFactoryCallback)hyphy_menu_item_callback,               HY_TREE_GTK_MENU_BASE+10, "<Item>" },
+    { "/Tree/Select Branches/Select Branches By _Name",     NULL,    (GtkItemFactoryCallback)hyphy_menu_item_callback,              HY_TREE_GTK_MENU_BASE+17, "<Item>" },
+    { "/Tree/Select Branches/Select Branches By _Length",     NULL,    (GtkItemFactoryCallback)hyphy_menu_item_callback,                HY_TREE_GTK_MENU_BASE+18, "<Item>" },
+    { "/Tree/Select Branches/_Invert Selection",     NULL,    (GtkItemFactoryCallback)hyphy_menu_item_callback,             HY_TREE_GTK_MENU_BASE+30, "<Item>" },
+    { "/Tree/Select Branches/_Grow Selection",     NULL,    (GtkItemFactoryCallback)hyphy_menu_item_callback,               HY_TREE_GTK_MENU_BASE+31, "<Item>" },
+    { "/Tree/Select Branches/_Map Selection to Datapanel",     NULL,    (GtkItemFactoryCallback)hyphy_menu_item_callback,               HY_TREE_GTK_MENU_BASE+32, "<Item>" },
+    { "/Tree/Select Branches/_Find selection in another tree",     NULL,    (GtkItemFactoryCallback)hyphy_menu_item_callback,               HY_TREE_GTK_MENU_BASE+33, "<Item>" },
+    { "/Tree/Edit Prope_rties",     NULL,    (GtkItemFactoryCallback)hyphy_menu_item_callback,              HY_TREE_GTK_MENU_BASE+11, "<Item>" },
+    { "/Tree/sep4",         NULL,         NULL,           0,        "<Separator>" },
+    { "/Tree/Optimi_ze Again",     "<control>T",    (GtkItemFactoryCallback)hyphy_menu_item_callback,               HY_TREE_GTK_MENU_BASE+12, "<Item>" },
+    { "/Tree/Sh_ow Parameters in Table",     "<control>H",    (GtkItemFactoryCallback)hyphy_menu_item_callback,             HY_TREE_GTK_MENU_BASE+13, "<Item>" },
+    { "/Tree/sep5",         NULL,         NULL,           0,        "<Separator>" },
+    { "/Tree/Tr_ee Display Options...",     NULL,    (GtkItemFactoryCallback)hyphy_menu_item_callback,              HY_TREE_GTK_MENU_BASE+14, "<Item>" },
+    { "/Tree/Branch Labels",            NULL,         NULL,           0,                    "<Branch>" },
+    { "/Tree/Branch Labels/_Above Branches",     "<control>8",    (GtkItemFactoryCallback)hyphy_menu_item_callback,             HY_TREE_GTK_MENU_BASE+24, "<Item>" },
+    { "/Tree/Branch Labels/_Below Branches",     "<control>9",    (GtkItemFactoryCallback)hyphy_menu_item_callback,             HY_TREE_GTK_MENU_BASE+25, "<Item>" },
+    { "/Tree/sep6",         NULL,         NULL,           0,        "<Separator>" },
+    { "/Tree/Show Rate Matri_x",            NULL,         (GtkItemFactoryCallback)hyphy_menu_item_callback,           HY_TREE_GTK_MENU_BASE+15,                 "<Item>" },
+    { "/Tree/S_how Transition Matrix",          NULL,         (GtkItemFactoryCallback)hyphy_menu_item_callback,           HY_TREE_GTK_MENU_BASE+16,                 "<Item>" },
+    { "/Tree/sep7",         NULL,         NULL,           0,        "<Separator>" },
+    { "/Tree/Pairwise Distan_ces",          NULL,         (GtkItemFactoryCallback)hyphy_menu_item_callback,           HY_TREE_GTK_MENU_BASE+19,                 "<Item>" },
+    { "/Tree/Branch Length Distributi_on",          NULL,         (GtkItemFactoryCallback)hyphy_menu_item_callback,           HY_TREE_GTK_MENU_BASE+20,                 "<Item>" },
+    { "/Tree/sep8",         NULL,         NULL,           0,        "<Separator>" },
+    { "/Tree/Tree Compar_ison",         NULL,         NULL,           0,                    "<Branch>" },
+    { "/Tree/Tree Comparison/Test For _Equality",           NULL,         (GtkItemFactoryCallback)hyphy_menu_item_callback,           HY_TREE_GTK_MENU_BASE+35,                 "<Item>" },
+    { "/Tree/Tree Comparison/Find _Subtree In Another Tree",            NULL,         (GtkItemFactoryCallback)hyphy_menu_item_callback,           HY_TREE_GTK_MENU_BASE+36,                 "<Item>" },
+    { "/Tree/Tree Comparison/Find _Maximal Common Subtree",         NULL,         (GtkItemFactoryCallback)hyphy_menu_item_callback,           HY_TREE_GTK_MENU_BASE+37,                 "<Item>" },
+    { "/Tree/Tree Comparison/Find Maximal Common _Forest",          NULL,         (GtkItemFactoryCallback)hyphy_menu_item_callback,           HY_TREE_GTK_MENU_BASE+38,                 "<Item>" },
+    { "/Tree/Tree Comparison/_Match Tree To Pattern",           NULL,         (GtkItemFactoryCallback)hyphy_menu_item_callback,           HY_TREE_GTK_MENU_BASE+39,                 "<Item>" },
+    { "/Tree/Match Leaves To Se_quence Data",           NULL,         (GtkItemFactoryCallback)hyphy_menu_item_callback,           HY_TREE_GTK_MENU_BASE+40,                 "<Item>" },
+    { "/Tree/sep9",         NULL,         NULL,           0,        "<Separator>" },
+    { "/Tree/_Additional Tools",            NULL,         NULL,           0,                    "<Branch>" }
+};
+
+
+//__________________________________________________________________
+
+bool _HYTreePanel::_ProcessOSEvent (Ptr vEvent)
+{
+    static  char draggin = 0;
+
+    _HY_GTK_UI_Message *theMessage = (_HY_GTK_UI_Message*)vEvent;
+
+    if (theMessage->theEvent->type == GDK_BUTTON_PRESS) {
+        GdkEventButton * be = (GdkEventButton*)theMessage->theEvent;
+        if (be->button > 1) {
+            if (FindClickedCell(be->x-windowContent->allocation.x,be->y-windowContent->allocation.y) == 0) {
+                HandleContextPopup(be->x-windowContent->allocation.x,be->y-windowContent->allocation.y);
+                return true;
+            }
+        }
+    }
+
+    if(!_HYTWindow::_ProcessOSEvent (vEvent)) {
+        if (theMessage->theEvent->type == GDK_BUTTON_PRESS || theMessage->theEvent->type == GDK_2BUTTON_PRESS) {
+            GdkEventButton * be = (GdkEventButton*)theMessage->theEvent;
+
+            int ch = be->x-windowContent->allocation.x,
+                cv = be->y-windowContent->allocation.y,
+                c;
+
+            c = FindClickedCell(ch,cv);
+            if (c<0) {
+                return false;
+            }
+
+            _HYComponent* thisComponent = (_HYComponent*)components(c);
+
+            if (c==1) { // navBar
+                ch -= componentL.lData[1];
+                cv -= componentT.lData[1];
+                if (navRect.Contains(ch,cv)) {
+                    draggin = 1;
+                } else {
+                    SetNavRectCenter (ch,cv);
+                }
+
+                return true;
+            } else if (c==0) {
+                ch -= componentL.lData[0];
+                cv -= componentT.lData[0];
+                char shiftFlag = 0;
+
+                if (be->state & GDK_SHIFT_MASK) {
+                    shiftFlag |= 0x01;
+                }
+                if (be->state & GDK_CONTROL_MASK) {
+                    shiftFlag |= 0x02;
+                }
+
+                if (shiftFlag > 2) {
+                    draggin = 2;
+                    //theEvent->iMsg = WM_MOUSEMOVE;
+                } else {
+                    if (IsVertical()) {
+                        c = ch;
+                        ch = cv+thisComponent->vOrigin;
+                        cv = c+thisComponent->hOrigin;
+                    } else {
+                        ch+=thisComponent->hOrigin;
+                        cv+=thisComponent->vOrigin;
+                    }
+
+                    if (theMessage->theEvent->type == GDK_2BUTTON_PRESS && currentSelection.lLength) {
+                        InvokeNodeEditor();
+                        return true;
+                    }
+
+                    if(FindSelection (ch,cv,shiftFlag)) {
+                        _UpdateOperationsMenu();
+                        RenderTree();
+                    }
+                }
+            }
+        }
+
+        if (theMessage->theEvent->type == GDK_BUTTON_RELEASE) {
+            draggin = 0;
+            return true;
+        }
+
+        if (theMessage->theEvent->type == GDK_MOTION_NOTIFY) {
+            GdkEventMotion * me = (GdkEventMotion*)theMessage->theEvent;
+
+            if (draggin == 1) {
+                int ch = me->x-componentL.lData[1]-windowContent->allocation.x,
+                    cv = me->y-componentT.lData[1]-windowContent->allocation.y;
+
+                SetNavRectCenter (ch,cv);
+            } else {
+                if (draggin == 2) {
+                    _HYCanvas   *theTree    = (_HYCanvas*)GetObject (0);
+
+                    int ch = me->x-windowContent->allocation.x,
+                        cv = me->y-windowContent->allocation.y;
+
+                    if (IsVertical()) {
+                        cv = cv-componentL.lData[0]+theTree->hOrigin;
+                        ch = ch-componentT.lData[0]+theTree->vOrigin;
+                    } else {
+                        ch = ch-componentL.lData[0]+theTree->hOrigin;
+                        cv = cv-componentT.lData[0]+theTree->vOrigin;
+                    }
+                    if ((ch<theTree->_HYComponent::GetMaxW())&&(cv<theTree->_HYComponent::GetMaxH())) {
+                        FishEyeProjection (ch,theTree->_HYComponent::GetMaxH()-cv,theTree->_HYComponent::GetMaxW(),
+                                           theTree->_HYComponent::GetMaxH(),coordTree);
+                        treeFlags |= HY_TREEPANEL_PROJECTION;
+                        RenderTree(false);
+                    }
+                }
+            }
+            return true;
+        } else {
+            if (theMessage->theEvent->type == GDK_KEY_PRESS) {
+                GdkEventKey * kp = (GdkEventKey*)theMessage->theEvent;
+
+                if (kp->keyval == GDK_Delete || kp->keyval == GDK_BackSpace) {
+                    DeleteCurrentSelection();
+                    _UpdateOperationsMenu();
+                    return true;
+                } else if (kp->keyval == GDK_Return || kp->keyval == GDK_KP_Enter) {
+                    InvokeNodeEditor ();
+                    _UpdateOperationsMenu();
+                    return true;
+                }
+            }
+        }
+        return false;
+    }
+    return true;
+}
+//__________________________________________________________________
+
+
+bool        _HYTreePanel::_ProcessMenuSelection (long msel)
+{
+    if (_HYWindow::_ProcessMenuSelection(msel)) {
+        return true;
+    }
+
+    switch (msel) {
+
+    case HY_WINDOW_MENU_ID_FILE+1: { // Save tree
+        _String           filePath,
+                          dtreeName = treeName,
+                          ext,
+                          fileFormat ("File Format:");
+
+        bool              good = false;
+
+        _List             treeFormats;
+
+        long pidOptions = GetUniversalSaveOptions (treeFormats);
+        if (exportFormats.lLength == 0) {
+            findGraphicsExporterComponents(exportFormats);
+        }
+        treeFormats << exportFormats;
+
+        long              menuChoice = SaveFileWithPopUp (filePath, saveForTreesPrompt,dtreeName,
+                                       fileFormat,
+                                       treeFormats);
+        if (menuChoice>=0) {
+            if (menuChoice >= pidOptions) {
+                _HYCanvas   *theTree = (_HYCanvas*)GetObject (0);
+
+                bool    ruler = (!IsVertical())&&(scaleVariable.sLength);
+
+                GdkPixbuf* theImage = gdk_pixbuf_get_from_drawable (NULL, theTree->thePane, NULL, 0, 0, 0, 0, -1, -1);
+                if (ruler) {
+                    _HYCanvas   *theRuler = (_HYCanvas*)GetObject (2);
+                    GdkPixbuf* theImage2 = gdk_pixbuf_get_from_drawable (NULL, theRuler->thePane, NULL, 0, 0, 0, 0, -1, -1);
+                    long        w  = gdk_pixbuf_get_width(theImage),
+                                h1 = gdk_pixbuf_get_height (theImage),
+                                h2 = gdk_pixbuf_get_height(theImage2);
+                    GdkPixbuf* composite = gdk_pixbuf_new (GDK_COLORSPACE_RGB,false,gdk_pixbuf_get_bits_per_sample(theImage),w,h1+h2);
+                    gdk_pixbuf_copy_area (theImage,0,0,w,h1,composite,0,h2);
+                    g_object_unref (theImage);
+                    gdk_pixbuf_copy_area (theImage2,0,0,w,h2,composite,0,0);
+                    g_object_unref (theImage2);
+                    theImage = composite;
+                }
+                gdk_pixbuf_save (theImage, filePath.sData,((_String*)treeFormats (menuChoice))->sData,NULL,NULL);
+                g_object_unref (theImage);
+            } else {
+                HandleTreeSave (menuChoice, filePath);
+            }
+        }
+        return true;
+    }
+    break;
+    case HY_WINDOW_MENU_ID_FILE+2: {
+        _PrintTree();
+        break;
+    }
+
+    case HY_WINDOW_MENU_ID_EDIT:   // Undo
+        UndoLastOperation();
+        break;
+
+    case HY_WINDOW_MENU_ID_EDIT+1: { // COPY
+        if (treeFlags&HY_TREEPANEL_CLIPBOARD_READY) {
+            CutSelectionToClipboard (false);
+        } else {
+            /*_HYCanvas   *theTree = (_HYCanvas*)GetObject (0);
+            bool ruler = (!IsVertical())&&(scaleVariable.sLength);
+            if (ruler)
+            {
+                _HYCanvas   *theRuler = (_HYCanvas*)GetObject (2);
+
+            }
+            else
+            {
+                PlaceBitmapInClipboard ((HBITMAP)GetCurrentObject (theTree->thePane,OBJ_BITMAP),theWindow);
+            }*/
+        }
+        break;
+    }
+
+    case HY_WINDOW_MENU_ID_EDIT+2:   // Cut
+        CutSelectionToClipboard ();
+        break;
+
+    case HY_WINDOW_MENU_ID_EDIT+3:   // Paste
+        PasteClipboardTree();
+        break;
+
+    case HY_WINDOW_MENU_ID_EDIT+4:   // Delete
+        DeleteCurrentSelection();
+        break;
+
+    case HY_WINDOW_MENU_ID_EDIT+5:   // Select All
+        SelectAllBranches();
+        break;
+
+    case HY_WINDOW_MENU_ID_EDIT+6:   // S & R
+        HandleSearchAndReplace(false);
+        break;
+
+    case HY_WINDOW_MENU_ID_EDIT+7:   // S & R
+        HandleSearchAndReplace(true);
+        break;
+
+    case HY_TREE_GTK_MENU_BASE: {
+        GtkCheckMenuItem * menuItem = GTK_CHECK_MENU_ITEM(gtk_item_factory_get_item_by_action(menu_items,HY_TREE_GTK_MENU_BASE));
+        if ( ((bool)(treeFlags&HY_TREEPANEL_TIP_LABELS)) != gtk_check_menu_item_get_active (menuItem)) {
+            unsigned short newF;
+            if (treeFlags&HY_TREEPANEL_TIP_LABELS) {
+                newF = treeFlags - HY_TREEPANEL_TIP_LABELS;
+            } else {
+                newF = treeFlags + HY_TREEPANEL_TIP_LABELS;
+            }
+            SetFlags (newF);
+        }
+        break;
+    }
+
+    case HY_TREE_GTK_MENU_BASE+1: {
+        GtkCheckMenuItem * menuItem = GTK_CHECK_MENU_ITEM(gtk_item_factory_get_item_by_action(menu_items,HY_TREE_GTK_MENU_BASE+1));
+        if ( ((bool)(treeFlags&HY_TREEPANEL_INT_LABELS)) != gtk_check_menu_item_get_active (menuItem)) {
+            unsigned short newF;
+            if (treeFlags&HY_TREEPANEL_INT_LABELS) {
+                newF = treeFlags - HY_TREEPANEL_INT_LABELS;
+            } else {
+                newF = treeFlags + HY_TREEPANEL_INT_LABELS;
+            }
+            SetFlags (newF);
+        }
+        break;
+    }
+
+    case HY_TREE_GTK_MENU_BASE+2: {
+        SwapSelectedSubTrees ();
+        break;
+    }
+
+    case HY_TREE_GTK_MENU_BASE+3: {
+        CollapseSelectedBranch ();
+        break;
+    }
+
+    case HY_TREE_GTK_MENU_BASE+4: {
+        JoinSelectedBranches ();
+        break;
+    }
+
+    case HY_TREE_GTK_MENU_BASE+5: {
+        GraftATip ();
+        break;
+    }
+
+    case HY_TREE_GTK_MENU_BASE+6: {
+        RerootTree ();
+        break;
+    }
+
+    case HY_TREE_GTK_MENU_BASE+7: {
+        FlipSelectedBranches ();
+        break;
+    }
+
+    case HY_TREE_GTK_MENU_BASE+8:
+    case HY_TREE_GTK_MENU_BASE+9:
+    case HY_TREE_GTK_MENU_BASE+10: {
+        HandleSelection (msel-HY_TREE_GTK_MENU_BASE-8);
+        break;
+    }
+
+    case HY_TREE_GTK_MENU_BASE+17:
+    case HY_TREE_GTK_MENU_BASE+18: {
+        HandleSelection (msel-HY_TREE_GTK_MENU_BASE-14);
+        break;
+    }
+
+    case HY_TREE_GTK_MENU_BASE+30:
+    case HY_TREE_GTK_MENU_BASE+31:
+    case HY_TREE_GTK_MENU_BASE+32:
+    case HY_TREE_GTK_MENU_BASE+33: {
+        HandleSelection (msel-HY_TREE_GTK_MENU_BASE-25);
+        break;
+    }
+
+    case HY_TREE_GTK_MENU_BASE+11: {
+        InvokeNodeEditor ();
+        break;
+    }
+
+    case HY_TREE_GTK_MENU_BASE+12: {
+        RecalculateLikelihood ();
+        break;
+    }
+
+    case HY_TREE_GTK_MENU_BASE+13: {
+        DisplayParameterTable();
+        break;
+    }
+
+    case HY_TREE_GTK_MENU_BASE+14: {
+        HandleViewOptions ();
+        break;
+    }
+
+    case HY_TREE_GTK_MENU_BASE+15:
+    case HY_TREE_GTK_MENU_BASE+16: {
+        ShowModelMatrix (msel-HY_TREE_GTK_MENU_BASE-15);
+        break;
+    }
+
+    case HY_TREE_GTK_MENU_BASE+19:
+    case HY_TREE_GTK_MENU_BASE+20: {
+        GenerateDistanceTable (msel-HY_TREE_GTK_MENU_BASE-19);
+        break;
+    }
+
+    case HY_TREE_GTK_MENU_BASE+24:
+    case HY_TREE_GTK_MENU_BASE+25: {
+        HandleLabels(msel-HY_TREE_GTK_MENU_BASE-24);
+        break;
+    }
+
+    case HY_TREE_GTK_MENU_BASE+35:
+    case HY_TREE_GTK_MENU_BASE+36:
+    case HY_TREE_GTK_MENU_BASE+37:
+    case HY_TREE_GTK_MENU_BASE+38:
+    case HY_TREE_GTK_MENU_BASE+39: {
+        HandleComparison (msel-HY_TREE_GTK_MENU_BASE-35);
+        _UpdateOperationsMenu();
+        break;
+    }
+
+    case HY_TREE_GTK_MENU_BASE+40: {
+        MatchToDataSet();
+        break;
+    }
+
+    default: { // proc menu
+        if (msel>=HY_TREE_GTK_MENU_BASE+1000) {
+            ExecuteProcessor (msel-HY_TREE_GTK_MENU_BASE-1000);
+            _UpdateOperationsMenu();
+            return true;
+        }
+    }
+    }
+
+    if (((msel>=HY_TREE_GTK_MENU_BASE)&&(msel<HY_TREE_GTK_MENU_BASE+12))||
+            ((msel>=HY_WINDOW_MENU_ID_EDIT)&&(msel<HY_WINDOW_MENU_ID_EDIT+6))) {
+        _UpdateOperationsMenu();
+    }
+
+    return true;
+}
+
+
+
+//__________________________________________________________________
+
+void        _HYTreePanel::_PaintNavRect(void)
+{
+    if (GTK_WIDGET_MAPPED (theWindow)) {
+        navRect = ComputeNavRect();
+        GdkGC* navDC = gdk_gc_new (theWindow->window);
+        gdk_gc_set_line_attributes(navDC,2,GDK_LINE_SOLID,GDK_CAP_NOT_LAST,GDK_JOIN_MITER);
+        gdk_gc_set_foreground(navDC,&navPen);
+
+        _HYCanvas* theCanvas = (_HYCanvas*)GetCellObject (0,0);
+
+        _HYRect r;
+
+        r.left   = navRect.left+theCanvas->rel.left+HY_TREEPANEL_NAVSPACING;
+        r.right  = navRect.right+theCanvas->rel.left;
+        r.top    = navRect.top+theCanvas->rel.top+HY_TREEPANEL_NAVSPACING;
+        r.bottom = navRect.bottom+theCanvas->rel.top;
+
+        gdk_draw_rectangle(theWindow->window,navDC,false,
+                           r.left + windowContent->allocation.x,
+                           r.top  + windowContent->allocation.y,
+                           r.right  - r.left + 1,
+                           r.bottom - r.top + 1);
+
+        _PaintLFStatus (nil);
+        g_object_unref (navDC);
+    }
+}
+
+//__________________________________________________________________
+
+void        _HYTreePanel::_PrintTree(long hPages, long vPages)
+{
+    _String TBI ("Tree Printing Has Not Yet Been Implemented\n");
+    ReportWarning (TBI);
+}
+
+//__________________________________________________________________
+
+void _HYTreePanel::_SetMenuBar(void)
+{
+    if (menu_items && !gtk_item_factory_get_widget(menu_items,"<HY_WINDOW>/Edit/Search and Replace")) {
+        gtk_item_factory_create_items (menu_items,  sizeof (hyphy_tree_window_menu) / sizeof (hyphy_tree_window_menu[0]), hyphy_tree_window_menu, this);
+        gtk_widget_set_sensitive(gtk_item_factory_get_widget(menu_items,"<HY_WINDOW>/Tree/Tree Comparison/Find Subtree In Another Tree"),false);
+
+        gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(gtk_item_factory_get_widget(menu_items,"<HY_WINDOW>/Tree/Tip Labels")),
+                                       treeFlags&HY_TREEPANEL_TIP_LABELS);
+        gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(gtk_item_factory_get_widget(menu_items,"<HY_WINDOW>/Tree/Internal Labels")),
+                                       treeFlags&HY_TREEPANEL_INT_LABELS);
+
+        gtk_widget_set_sensitive(gtk_item_factory_get_widget(menu_items,"<HY_WINDOW>/Tree/Swap Subtrees"),false);
+        gtk_widget_set_sensitive(gtk_item_factory_get_widget(menu_items,"<HY_WINDOW>/Tree/Collapse Branch"),false);
+        gtk_widget_set_sensitive(gtk_item_factory_get_widget(menu_items,"<HY_WINDOW>/Tree/Join"),false);
+        gtk_widget_set_sensitive(gtk_item_factory_get_widget(menu_items,"<HY_WINDOW>/Tree/Graft A Tip"),false);
+        gtk_widget_set_sensitive(gtk_item_factory_get_widget(menu_items,"<HY_WINDOW>/Tree/Reroot"),false);
+        gtk_widget_set_sensitive(gtk_item_factory_get_widget(menu_items,"<HY_WINDOW>/Tree/Flip Tip Ordering"),false);
+        gtk_widget_set_sensitive(gtk_item_factory_get_widget(menu_items,"<HY_WINDOW>/Tree/Select Branches/Select Entire Subtree"),false);
+        gtk_widget_set_sensitive(gtk_item_factory_get_widget(menu_items,"<HY_WINDOW>/Tree/Select Branches/Grow Selection"),false);
+        gtk_widget_set_sensitive(gtk_item_factory_get_widget(menu_items,"<HY_WINDOW>/Tree/Edit Properties"),false);
+
+        gtk_widget_set_sensitive(gtk_item_factory_get_widget(menu_items,"<HY_WINDOW>/Edit/Select All"),true);
+
+        if (likeFuncID < 0) {
+            gtk_widget_set_sensitive(gtk_item_factory_get_widget(menu_items,"<HY_WINDOW>/Tree/Optimize Again"),false);
+            gtk_widget_set_sensitive(gtk_item_factory_get_widget(menu_items,"<HY_WINDOW>/Tree/Show Parameters in Table"),false);
+        }
+
+        gtk_widget_set_sensitive(gtk_item_factory_get_widget(menu_items,"<HY_WINDOW>/Tree/Show Rate Matrix"),false);
+        gtk_widget_set_sensitive(gtk_item_factory_get_widget(menu_items,"<HY_WINDOW>/Tree/Show Transition Matrix"),false);
+
+        if (treeProcessors.lLength == 0) {
+            gtk_widget_set_sensitive(gtk_item_factory_get_widget(menu_items,"<HY_WINDOW>/Tree/Additional Tools"),false);
+        } else {
+            for (long k=0; k<treeProcessors.lLength; k++) {
+                _String *thisItem = (_String*)treeProcessors (k),
+                         chopped = thisItem->Cut (thisItem->FindBackwards ('/',0,-1)+1,-1),
+                         type = "<Item>";
+
+                GtkItemFactoryEntry aProcEntry = {NULL,NULL,(GtkItemFactoryCallback)hyphy_menu_item_callback,HY_TREE_GTK_MENU_BASE+1000+k,type.sData};
+                chopped = _String("/Tree/Additional Tools/")&chopped;
+                aProcEntry.path = chopped.sData;
+
+                gtk_item_factory_create_items (menu_items,  1, &aProcEntry, this);
+                //InsertMenu        (procMenu, 0xFFFFFFFF, MF_BYPOSITION|MF_STRING, HY_TREE_GTK_MENU_BASE+1000+k, chopped.sData);
+            }
+        }
+    }
+}
+
+//__________________________________________________________________
+
+void _HYTreePanel::_UnsetMenuBar(void)
+{
+
+}
+
+//__________________________________________________________________
+
+void _HYTreePanel::_UpdateOperationsMenu (void)
+{
+    node<nodeCoord>* node1, *node2, *t;
+
+    gtk_widget_set_sensitive (gtk_item_factory_get_widget_by_action(menu_items,HY_TREE_GTK_MENU_BASE+2),false);
+    //EnableMenuItem(treeMenu, 3 ,MF_GRAYED|MF_BYPOSITION);
+    gtk_widget_set_sensitive (gtk_item_factory_get_widget_by_action(menu_items,HY_TREE_GTK_MENU_BASE+3),false);
+    //EnableMenuItem(treeMenu, 4 ,MF_GRAYED|MF_BYPOSITION);
+    gtk_widget_set_sensitive (gtk_item_factory_get_widget_by_action(menu_items,HY_TREE_GTK_MENU_BASE+4),false);
+    //EnableMenuItem(treeMenu, 5 ,MF_GRAYED|MF_BYPOSITION);
+    gtk_widget_set_sensitive (gtk_item_factory_get_widget_by_action(menu_items,HY_TREE_GTK_MENU_BASE+5),false);
+    //EnableMenuItem(treeMenu, 6 ,MF_GRAYED|MF_BYPOSITION);
+    gtk_widget_set_sensitive (gtk_item_factory_get_widget_by_action(menu_items,HY_TREE_GTK_MENU_BASE+6),false);
+    //EnableMenuItem(treeMenu, 7 ,MF_GRAYED|MF_BYPOSITION);
+    gtk_widget_set_sensitive (gtk_item_factory_get_widget_by_action(menu_items,HY_TREE_GTK_MENU_BASE+7),false);
+    //EnableMenuItem(treeMenu, 8 ,MF_GRAYED|MF_BYPOSITION);
+    gtk_widget_set_sensitive (gtk_item_factory_get_widget_by_action(menu_items,HY_TREE_GTK_MENU_BASE+8),false);
+    //EnableMenuItem(selectMenu,0 ,MF_GRAYED|MF_BYPOSITION);
+    gtk_widget_set_sensitive (gtk_item_factory_get_widget_by_action(menu_items,HY_TREE_GTK_MENU_BASE+30),false);
+    gtk_widget_set_sensitive (gtk_item_factory_get_widget_by_action(menu_items,HY_TREE_GTK_MENU_BASE+32),false);
+    gtk_widget_set_sensitive (gtk_item_factory_get_widget_by_action(menu_items,HY_TREE_GTK_MENU_BASE+33),true);
+    //EnableMenuItem(selectMenu,5 ,MF_GRAYED|MF_BYPOSITION);
+    gtk_widget_set_sensitive (gtk_item_factory_get_widget_by_action(menu_items,HY_TREE_GTK_MENU_BASE+11),false);
+    //EnableMenuItem(treeMenu,11 ,MF_GRAYED|MF_BYPOSITION);
+    gtk_widget_set_sensitive (gtk_item_factory_get_widget_by_action(menu_items,HY_TREE_GTK_MENU_BASE+15),false);
+    //EnableMenuItem(treeMenu,19 ,MF_GRAYED|MF_BYPOSITION);
+    gtk_widget_set_sensitive (gtk_item_factory_get_widget_by_action(menu_items,HY_TREE_GTK_MENU_BASE+16),false);
+    //EnableMenuItem(treeMenu,20 ,MF_GRAYED|MF_BYPOSITION);
+
+    gtk_widget_set_sensitive (gtk_item_factory_get_widget_by_action(menu_items,HY_WINDOW_MENU_ID_EDIT+4),false);
+    //EnableMenuItem(editMenu, 8 ,MF_GRAYED|MF_BYPOSITION);
+    gtk_widget_set_sensitive (gtk_item_factory_get_widget_by_action(menu_items,HY_WINDOW_MENU_ID_EDIT+7),false);
+    //EnableMenuItem(editMenu, 11,MF_GRAYED|MF_BYPOSITION);
+    gtk_widget_set_sensitive (gtk_item_factory_get_widget_by_action(menu_items,HY_TREE_GTK_MENU_BASE+36),false);
+    //EnableMenuItem(compMenu, 1 ,MF_GRAYED|MF_BYPOSITION);
+
+    bool  good = true;
+    long  k,j;
+    if (currentSelection.lLength==2) {
+        node1 = (node<nodeCoord>*)currentSelection(0);
+        node2 = (node<nodeCoord>*)currentSelection(1);
+        t = node1->parent;
+        while (t) {
+            if (t==node2) {
+                good = false;
+                break;
+            }
+            t = t->parent;
+        }
+        if (good) {
+            t = node2->parent;
+            while (t) {
+                if (t==node1) {
+                    good = false;
+                    break;
+                }
+                t = t->parent;
+            }
+        }
+        if (good) {
+            gtk_widget_set_sensitive (gtk_item_factory_get_widget_by_action(menu_items,HY_TREE_GTK_MENU_BASE+2),true);
+        }
+    }
+    if (currentSelection.lLength) {
+        gtk_widget_set_sensitive (gtk_item_factory_get_widget_by_action(menu_items,HY_TREE_GTK_MENU_BASE+5),true);
+        //EnableMenuItem(treeMenu, 6 ,MF_ENABLED|MF_BYPOSITION);
+        gtk_widget_set_sensitive (gtk_item_factory_get_widget_by_action(menu_items,HY_TREE_GTK_MENU_BASE+11),true);
+        //EnableMenuItem(treeMenu, 11 ,MF_ENABLED|MF_BYPOSITION);
+        gtk_widget_set_sensitive (gtk_item_factory_get_widget_by_action(menu_items,HY_TREE_GTK_MENU_BASE+30),true);
+        gtk_widget_set_sensitive (gtk_item_factory_get_widget_by_action(menu_items,HY_TREE_GTK_MENU_BASE+31),true);
+        gtk_widget_set_sensitive (gtk_item_factory_get_widget_by_action(menu_items,HY_TREE_GTK_MENU_BASE+32),true);
+        gtk_widget_set_sensitive (gtk_item_factory_get_widget_by_action(menu_items,HY_TREE_GTK_MENU_BASE+33),true);
+        //EnableMenuItem(selectMenu,5 ,MF_ENABLED|MF_BYPOSITION);
+        gtk_widget_set_sensitive (gtk_item_factory_get_widget_by_action(menu_items,HY_WINDOW_MENU_ID_EDIT+7),true);
+        //EnableMenuItem(editMenu, 11,MF_ENABLED|MF_BYPOSITION);
+        for (k=0; k<currentSelection.lLength; k++) {
+            node1 = (node<nodeCoord>*)currentSelection(k);
+            if (node1->get_num_nodes()) {
+                gtk_widget_set_sensitive (gtk_item_factory_get_widget_by_action(menu_items,HY_TREE_GTK_MENU_BASE+3),true);
+                //EnableMenuItem(treeMenu, 4 ,MF_ENABLED|MF_BYPOSITION);
+                break;
+            }
+        }
+        for (k=0; k<currentSelection.lLength; k++) {
+            node1 = (node<nodeCoord>*)currentSelection(k);
+            if (!node1->get_num_nodes()) {
+                gtk_widget_set_sensitive (gtk_item_factory_get_widget_by_action(menu_items,HY_TREE_GTK_MENU_BASE+4),true);
+                //EnableMenuItem(treeMenu, 5 ,MF_ENABLED|MF_BYPOSITION);
+                break;
+            }
+        }
+        if (currentSelection.lLength>=2) {
+            node1 = (node<nodeCoord>*)currentSelection(0);
+            t = node1->parent;
+            if (t&&(t->get_num_nodes()>currentSelection.lLength)) {
+                for (k=1; k<currentSelection.lLength; k++) {
+                    node1 = (node<nodeCoord>*)currentSelection(k);
+                    if (node1->parent!=t) {
+                        break;
+                    }
+                }
+                if (k==currentSelection.lLength) {
+                    gtk_widget_set_sensitive (gtk_item_factory_get_widget_by_action(menu_items,HY_TREE_GTK_MENU_BASE+4),true);
+                    //EnableMenuItem(treeMenu, 5 ,MF_ENABLED|MF_BYPOSITION);
+                }
+            }
+        } else {
+            node1 = (node<nodeCoord>*)currentSelection(0);
+            if (node1->parent) {
+                GtkWidget * rerootItem = gtk_item_factory_get_widget_by_action(menu_items,HY_TREE_GTK_MENU_BASE+6);
+                gtk_widget_set_sensitive (rerootItem,true);
+                gtk_label_set_text (GTK_LABEL (gtk_bin_get_child(GTK_BIN(rerootItem))), "Reroot");
+                //EnableMenuItem(treeMenu, 7 ,MF_ENABLED|MF_BYPOSITION);
+                //ModifyMenu    (treeMenu, 7, MF_BYPOSITION, HY_TREE_GTK_MENU_BASE+6, "Reroot");
+            }
+            if (node1->get_num_nodes()>0) {
+                gtk_widget_set_sensitive (gtk_item_factory_get_widget_by_action(menu_items,HY_TREE_GTK_MENU_BASE+7),true);
+                //EnableMenuItem(treeMenu, 8 ,MF_ENABLED|MF_BYPOSITION);
+                gtk_widget_set_sensitive (gtk_item_factory_get_widget_by_action(menu_items,HY_TREE_GTK_MENU_BASE+8),true);
+                //EnableMenuItem(selectMenu,0 ,MF_ENABLED|MF_BYPOSITION);
+            }
+            if (node1->in_object.varRef>=0) {
+                _CalcNode* thisCNode = (_CalcNode*)LocateVar(node1->in_object.varRef);
+
+                if (thisCNode&&(thisCNode->GetModelIndex()>=0)) {
+                    gtk_widget_set_sensitive (gtk_item_factory_get_widget_by_action(menu_items,HY_TREE_GTK_MENU_BASE+15),true);
+                    //EnableMenuItem(treeMenu,19 ,MF_ENABLED|MF_BYPOSITION);
+                    gtk_widget_set_sensitive (gtk_item_factory_get_widget_by_action(menu_items,HY_TREE_GTK_MENU_BASE+16),true);
+                    //EnableMenuItem(treeMenu,20 ,MF_ENABLED|MF_BYPOSITION);
+                }
+            }
+        }
+    } else {
+        _TheTree *me = LocateMyTreeVariable();
+        if (me) {
+            GtkWidget * rerootItem = gtk_item_factory_get_widget_by_action(menu_items,HY_TREE_GTK_MENU_BASE+6);
+            gtk_widget_set_sensitive (rerootItem,true);
+            if (me->RootedFlag()==UNROOTED) {
+                gtk_label_set_text (GTK_LABEL (gtk_bin_get_child(GTK_BIN(rerootItem))), "Balance");
+            } else {
+                gtk_label_set_text (GTK_LABEL (gtk_bin_get_child(GTK_BIN(rerootItem))), "Unroot");
+            }
+        }
+    }
+
+    gtk_widget_set_sensitive (gtk_item_factory_get_widget_by_action(menu_items,HY_TREE_GTK_MENU_BASE+12),likeFuncID>=0);
+    gtk_widget_set_sensitive (gtk_item_factory_get_widget_by_action(menu_items,HY_TREE_GTK_MENU_BASE+13),likeFuncID>=0);
+
+
+    gtk_widget_set_sensitive (gtk_item_factory_get_widget_by_action(menu_items,HY_WINDOW_MENU_ID_EDIT+3),treePanelClipboardRoot&&(currentSelection.lLength==1));
+    gtk_widget_set_sensitive (gtk_item_factory_get_widget_by_action(menu_items,HY_WINDOW_MENU_ID_EDIT+2),false);
+
+    // check if can cut/paste
+    t = nil;
+
+    for (k=0; k<currentSelection.lLength; k++) {
+        node1 = (node<nodeCoord>*)currentSelection.lData[k];
+        if (node1->parent) {
+            if (currentSelection.Find((long)node1->parent)<0) {
+                if (t) {
+                    break;
+                } else {
+                    t = node1;
+                }
+            }
+            for (j=0; j<node1->nodes.length; j++)
+                if (currentSelection.Find((long)node1->nodes.data[j])<0) {
+                    break;
+                }
+
+            if (j<node1->nodes.length) {
+                break;
+            }
+        } else {
+            if (t) {
+                break;
+            } else {
+                t = node1;
+            }
+        }
+    }
+    selectionTop = nil;
+    treeFlags &= 0xFF7F;
+    if (t&&(t->parent!=coordTree)&&(t->parent)) {
+        if (k==currentSelection.lLength) {
+            gtk_widget_set_sensitive (gtk_item_factory_get_widget_by_action(menu_items,HY_WINDOW_MENU_ID_EDIT+2),true);
+            //EnableMenuItem(editMenu, 3 ,MF_ENABLED|MF_BYPOSITION);
+            gtk_widget_set_sensitive (gtk_item_factory_get_widget_by_action(menu_items,HY_TREE_GTK_MENU_BASE+36),true);
+            //EnableMenuItem(compMenu, 1 ,MF_ENABLED|MF_BYPOSITION);
+            selectionTop = t;
+            treeFlags |= HY_TREEPANEL_CLIPBOARD_READY;
+        }
+    }
+    _String undoMessage;
+    GtkWidget * undoItem = gtk_item_factory_get_widget_by_action(menu_items,HY_WINDOW_MENU_ID_EDIT);
+    //gtk_widget_set_sensitive (rerootItem,true);
+    //EnableMenuItem(editMenu, 0 ,MF_ENABLED|MF_BYPOSITION);
+    switch (undoCode) {
+    case 1:
+        undoMessage = "Undo Swap";
+        break;
+    case 2:
+        undoMessage = "Undo Flip";
+        break;
+    case 3:
+        undoMessage = "Undo Collapse";
+        break;
+    case 4:
+        undoMessage = "Undo Delete";
+        break;
+    case 5:
+        undoMessage = "Undo Join";
+        break;
+    case 6:
+        undoMessage = "Undo Cut";
+        break;
+    case 7:
+        undoMessage = "Undo Graft";
+        break;
+    case 8:
+        undoMessage = "Undo Paste";
+        break;
+    case 9:
+        undoMessage = "Undo Subtree Move";
+        break;
+    default:
+        undoMessage = "Can't Undo";
+    }
+    gtk_widget_set_sensitive (undoItem,!(undoMessage==_String("Can't Undo")));
+    gtk_label_set_text (GTK_LABEL (gtk_bin_get_child(GTK_BIN(undoItem))), undoMessage.sData);
+}
+//__________________________________________________________________
+
+void _HYTreePanel::_HandleIdleEvent (void)
+{
+    /*#ifdef TARGET_API_MAC_CARBON
+    Point    curMouse;
+    GetGlobalMouse (&curMouse);
+
+    unsigned long t;
+    GetDateTime(&t);
+
+
+    if ((abs(curMouse.h-saveMouseH)<=3)
+      &&(abs(curMouse.v-saveMouseV)<=3)
+      &&(t-lastSave>.5))
+
+    {
+        if (!HasToolTip())
+        {
+            GrafPtr curPort;
+            GetPort (&curPort);
+            SetPort (GetWindowPort (theWindow));
+            _DisplayBranchFloater();
+            SetPort (curPort);
+        }
+
+        lastSave   = t;
+    }
+
+    saveMouseH = curMouse.h;
+    saveMouseV = curMouse.v;
+    #endif*/
+}
+
+//__________________________________________________________________
+
+void        _HYTreePanel::_PaintLFStatus(Ptr p)
+{
+    if (likeFuncID<0) {
+        _PaintTheCircle (redButtonIcon,theWindow);
+    } else {
+        if (dubiousNodes.lLength) {
+            _PaintTheCircle (yellowButtonIcon,theWindow);
+        } else {
+            _PaintTheCircle (greenButtonIcon,theWindow);
+        }
+    }
+}
+
+//EOF
\ No newline at end of file
diff --git a/src/gui/gtk/include/Components/HYPlatformButton.h b/src/gui/gtk/include/Components/HYPlatformButton.h
new file mode 100644
index 0000000..de953c6
--- /dev/null
+++ b/src/gui/gtk/include/Components/HYPlatformButton.h
@@ -0,0 +1,43 @@
+/*
+    A button object glue for GTK.
+
+    Sergei L. Kosakovsky Pond, November 2004.
+*/
+
+#ifndef _HYPBUTTON_
+#define _HYPBUTTON_
+
+#include "HYPlatformComponent.h"
+
+//__________________________________________________________________
+
+class _HYPlatformButton
+{
+
+public:
+
+    _HYPlatformButton(void);
+
+    virtual ~_HYPlatformButton(void);
+
+    virtual void            _SetBackColor    (_HYColor&);
+    virtual void            _SetDimensions   (_HYRect,_HYRect);
+    virtual void            _SetVisibleSize  (_HYRect);
+    virtual void            _SetFont         (_HYFont&);
+    void            _SetText         (void);
+    void            _SetButtonKind   (unsigned char);
+    void            _EnableButton    (bool);
+    void            _ApplyFont       (void);
+    void            _PaintMe         (void);
+
+    virtual void            _Paint (Ptr p);
+    virtual void            _Update(Ptr p);
+
+    GdkRectangle            buttonRect;
+    GdkColor                bgColor;
+    GtkWidget*              buttonControl;
+    PangoFontDescription*   buttonFontDesc;
+    _HYRect                 lastButtonDimension;
+};
+
+#endif
\ No newline at end of file
diff --git a/src/gui/gtk/include/Components/HYPlatformButtonBar.h b/src/gui/gtk/include/Components/HYPlatformButtonBar.h
new file mode 100644
index 0000000..54b61e9
--- /dev/null
+++ b/src/gui/gtk/include/Components/HYPlatformButtonBar.h
@@ -0,0 +1,60 @@
+/*
+    At toolbar menu object glue for GTK+
+
+    Sergei L. Kosakovsky Pond, November 2004.
+*/
+
+#ifndef _HYPBUTTONBAR_
+#define _HYPBUTTONBAR_
+
+#include "HYPlatformComponent.h"
+
+//__________________________________________________________________
+
+class _HYPlatformButtonBar
+{
+
+public:
+
+    _HYPlatformButtonBar(void);
+
+    virtual ~_HYPlatformButtonBar(void);
+
+    virtual void        _SetBackColor    (_HYColor&);
+    virtual void        _SetDimensions   (_HYRect,_HYRect);
+    virtual void        _SetVisibleSize  (_HYRect);
+    virtual void        _SmiteTooltip    (void);
+    _HYRect     _GetButtonRect   (bool conv = false);
+
+    virtual void        _Paint (Ptr p);
+    virtual void        _Update(Ptr p);
+    void        _DisposeButtons (void);
+    void        _DisposeButton  (long);
+    void        _MarkButtonForUpdate(int);
+    void        _UnpushButton   (void);
+    int         _FindClickedButton (int,int);
+
+
+    GdkColor        backFill;
+    GdkRectangle    buttonRect,
+                    toolTipBounds;
+
+    GdkGC           *bbGC;
+
+    int             pushed,
+                    saveMousePosH,
+                    saveMousePosV,
+                    lastMouseDown;
+
+    guint           theTimer;
+
+
+    //unsigned long lastSave;
+
+};
+
+//__________________________________________________________________
+
+
+
+#endif
\ No newline at end of file
diff --git a/src/gui/gtk/include/Components/HYPlatformCheckbox.h b/src/gui/gtk/include/Components/HYPlatformCheckbox.h
new file mode 100644
index 0000000..579790d
--- /dev/null
+++ b/src/gui/gtk/include/Components/HYPlatformCheckbox.h
@@ -0,0 +1,39 @@
+/*
+    A checkbox with optional static label object for GTK glue.
+
+    Sergei L. Kosakovsky Pond, November 3rd (this is the end...) 2004
+*/
+
+#ifndef _HYPLCHECKBOX_
+#define _HYPLCHECKBOX_
+
+#define HY_DEFAULT_CHECK_SPACE 16
+
+#include "HYPlatformComponent.h"
+
+//__________________________________________________________________
+
+class _HYPlatformCheckbox
+{
+
+public:
+
+    _HYPlatformCheckbox(bool);
+    virtual ~_HYPlatformCheckbox(void);
+
+    virtual void            _SetVisibleSize     (_HYRect);
+    virtual void            _SetState           (bool);
+
+    virtual void            _Paint (Ptr p);
+    virtual void            _Update(Ptr p);
+    virtual void            _Enable(bool);
+    virtual long            _GetBoxDimension (void);
+
+    void            _PaintMe            (void);
+    GtkWidget       *checkboxControl,
+                    *dummyControl;
+    _HYRect         checkboxRect;
+    bool            isRadio;
+};
+
+#endif
\ No newline at end of file
diff --git a/src/gui/gtk/include/Components/HYPlatformLabel.h b/src/gui/gtk/include/Components/HYPlatformLabel.h
new file mode 100644
index 0000000..b923f4e
--- /dev/null
+++ b/src/gui/gtk/include/Components/HYPlatformLabel.h
@@ -0,0 +1,41 @@
+/*
+    A static label object glue for GTK.
+
+    Sergei L. Kosakovsky Pond, November 2nd, 2004.
+*/
+
+#ifndef _HYPLABEL_
+#define _HYPLABEL_
+
+#include "HYPlatformComponent.h"
+
+//__________________________________________________________________
+
+class _HYPlatformLabel
+{
+
+public:
+
+    _HYPlatformLabel(void);
+    // flags, title, visibility
+
+    virtual ~_HYPlatformLabel(void);
+
+    virtual void        _SetBackColor    (_HYColor&);
+    virtual void        _SetForeColor    (_HYColor&);
+    virtual void        _SetDimensions   (_HYRect,_HYRect);
+    virtual void        _SetVisibleSize  (_HYRect);
+    virtual void        _SetFont         (_HYFont&);
+    virtual void        _SetText         (void);
+
+    virtual void        _Paint (Ptr p);
+    virtual void        _Update(Ptr p);
+
+    GdkGC                   *labelGC;
+    PangoLayout             *labelLayout;
+    PangoFontDescription    *labelFontDesc;
+
+    GdkRectangle            labelRect;
+};
+
+#endif
\ No newline at end of file
diff --git a/src/gui/gtk/include/Components/HYPlatformPullDown.h b/src/gui/gtk/include/Components/HYPlatformPullDown.h
new file mode 100644
index 0000000..7a18ba0
--- /dev/null
+++ b/src/gui/gtk/include/Components/HYPlatformPullDown.h
@@ -0,0 +1,61 @@
+/*
+    A pull down menu object glue for GTK+.
+
+    Sergei L. Kosakovsky Pond, November 2004.
+*/
+
+#ifndef _HYPPULLDOWNMENU_
+#define _HYPPULLDOWNMENU_
+
+#include "HYPlatformComponent.h"
+
+//__________________________________________________________________
+
+extern   _String    menuSeparator;
+
+//__________________________________________________________________
+
+class _HYPlatformPullDown
+{
+
+public:
+
+    _HYPlatformPullDown(void);
+    // flags, title, visibility
+
+    virtual ~_HYPlatformPullDown(void);
+
+    virtual void        _AddMenuItem     (_String&, long);
+    virtual void        _SetMenuItem     (_String&, long);
+    virtual void        _SetBackColor    (_HYColor&);
+    virtual void        _Duplicate       (Ptr);
+    virtual void        _DeleteMenuItem  (long);
+    virtual long        _GetSelection    (void);
+    virtual void        _SetDimensions   (_HYRect,_HYRect);
+    virtual void        _SetVisibleSize  (_HYRect);
+    virtual void        _EnableItem      (long, bool);
+    virtual void        _MarkItem        (long, char);
+    virtual char        _ItemMark        (long);
+    virtual void        _EnableMenu      (bool) {}
+
+
+    virtual void        _Paint (Ptr p);
+    virtual void        _Update(Ptr p);
+    virtual void        _RefreshComboBox  (void);
+
+    GtkWidget*      theMenu;
+
+    GdkColor        backFill;
+    long            selection,
+                    cbSelection;
+    GdkRectangle    menuRect;
+    _SimpleList     widgetList;
+};
+
+//__________________________________________________________________
+
+extern  GdkColor    buttonBorder1,
+        buttonBorder2;
+
+
+#endif
\ No newline at end of file
diff --git a/src/gui/gtk/include/Components/HYPlatformTable.h b/src/gui/gtk/include/Components/HYPlatformTable.h
new file mode 100644
index 0000000..a970abf
--- /dev/null
+++ b/src/gui/gtk/include/Components/HYPlatformTable.h
@@ -0,0 +1,70 @@
+/*
+    A table object glue for GTK+
+
+    Sergei L. Kosakovsky Pond, March 2005.
+*/
+
+#ifndef _HYPLTABLE_
+#define _HYPLTABLE_
+
+
+//__________________________________________________________________
+
+#include "HYPlatformComponent.h"
+
+#define     HY_TABLE_SIZE_CURSOR   0x01
+#define     HY_TABLE_DRAG_CURSOR   0x02
+#define     HY_TABLE_EDIT_CURSOR   0x04
+
+//__________________________________________________________________
+
+class _HYPlatformTable
+{
+
+public:
+
+    _HYPlatformTable        (void);
+    virtual             ~_HYPlatformTable       (void);
+
+    void            _SetFont                (void);
+    void            _SetBackColor           (_HYColor&);
+    void            _SetBackColor2          (_HYColor&);
+
+    void            _CreateTextBox          (_HYRect&,_String&);
+    _String         _RetrieveTextValue      (void);
+    void            _KillTextBox            (void);
+    bool            _HasTextBox             (void) {
+        return      editBox;
+    }
+
+    GdkRectangle    _GetVisibleRowRect      (long);
+
+    void            _HiliteRowForDrag       (long,long);
+    void            _ResetCursorState       (void);
+
+    void            _FrameRect              (GdkRectangle&);
+    bool            _CheckGC                (void);
+
+    GdkColor        backPattern,
+                    backPattern2;
+
+    PangoFontDescription
+    *tableFont,
+    *tableFontB,
+    *tableFontI,
+    *tableFontBI;
+
+    char            cursorState;
+
+    GtkWidget*      editBox;
+    GdkRectangle    textBoxRect,
+                    limits;
+
+    long            activeColumn,
+                    activeColumn2;
+
+    GdkGC*          theContext;
+
+};
+
+#endif
\ No newline at end of file
diff --git a/src/gui/gtk/include/Components/HYPlatformTextbox.h b/src/gui/gtk/include/Components/HYPlatformTextbox.h
new file mode 100644
index 0000000..b8e27bc
--- /dev/null
+++ b/src/gui/gtk/include/Components/HYPlatformTextbox.h
@@ -0,0 +1,64 @@
+/*
+    A text input box object glue for GTK+
+
+    Sergei L. Kosakovsky Pond, November 2004
+*/
+
+#ifndef _HYPLTEXTBOX_
+#define _HYPLTEXTBOX_
+
+#include "HYPlatformComponent.h"
+
+//__________________________________________________________________
+
+class _HYPlatformTextBox
+{
+
+public:
+
+    _HYPlatformTextBox (void);
+
+    virtual ~_HYPlatformTextBox(void);
+
+    virtual void            _SetBackColor    (_HYColor&);
+    virtual void            _SetBackTColor   (_HYColor&);
+    virtual void            _SetForeColor    (_HYColor&);
+    virtual void            _SetDimensions   (_HYRect,_HYRect);
+    virtual void            _SetVisibleSize  (_HYRect);
+    virtual void            _SetFont         (_HYFont&);
+    void            _SetText         (const _String&);
+    void            _InsertText      (const _String&, bool);
+    _String         _GetText         (void);
+    void            _StoreText       (_String*&, bool);
+    void            _CreateTE        (void);
+    void            _EnableTextBox   (bool);
+    void            _SetMargins      (_HYRect&);
+    void            _SetAlignFlags   (unsigned char);
+
+    virtual void            _Paint (Ptr p);
+    virtual void            _Update(Ptr p);
+
+    virtual void            _FocusComponent  (void);
+    virtual void            _UnfocusComponent(void);
+    virtual bool            _NeedMultiLines  (void);
+
+    GdkColor        backFill,
+                    backTFill,
+                    textColor;
+
+    GtkWidget       *te,
+                    *scrollWindow;
+
+    GdkRectangle    textBoxRect;
+    PangoFontDescription
+    *pLabelFont;
+
+    bool            isSingleLine;
+};
+
+//__________________________________________________________________
+
+//_String                   retrieveEditControlText (HWND);
+//void                  retrieveEditControlText (HWND, _String*&);
+
+#endif
\ No newline at end of file
diff --git a/src/gui/gtk/include/HYPlatformComponent.h b/src/gui/gtk/include/HYPlatformComponent.h
new file mode 100644
index 0000000..8f9e588
--- /dev/null
+++ b/src/gui/gtk/include/HYPlatformComponent.h
@@ -0,0 +1,78 @@
+/*
+    A general composite window component object, FLTK glue
+
+    Sergei L. Kosakovsky Pond, October 2004.
+*/
+
+#ifndef _HYPCOMPONENT_
+#define _HYPCOMPONENT_
+//#pragma once
+#include "HYBaseGUI.h"
+
+#include <gtk/gtk.h>
+#define  _HY_SANS_FONT  "HYPHY_Sans"
+#define  _HY_MONO_FONT  "HYPHY_Mono"
+#define  _HY_SERF_FONT  "HYPHY_Serif"
+
+//__________________________________________________________________
+
+class _HYPlatformComponent
+{
+
+public:
+
+    _HYPlatformComponent(void);
+    _HYPlatformComponent(_HYRect,Ptr);
+    // settings
+
+    virtual ~_HYPlatformComponent() {};
+
+    virtual void        Duplicate (BaseRef);
+
+    virtual void        _CleanUp   (void);
+
+    virtual void        _SetDimensions (_HYRect,_HYRect);
+    virtual void        _SetVisibleSize(_HYRect);
+
+    virtual void        _Paint (Ptr);
+    virtual void        _Update (Ptr);
+    virtual bool        _ProcessOSEvent (Ptr);
+    virtual _HYRect     _VisibleContents(Ptr);
+    virtual void        _MarkForUpdate (void);
+    virtual void        _MarkContentsForUpdate (void);
+    virtual long        _GetScrollerPos  (GtkWidget*);
+    virtual long        _GetHScrollerPos (void);
+    virtual long        _GetVScrollerPos (void);
+    virtual void        _SetScrollerPos  (GtkWidget*,long);
+    virtual void        _SetHScrollerPos (long);
+    virtual void        _SetVScrollerPos (long);
+    virtual void        _Activate (void);
+    virtual void        _Deactivate(void);
+    virtual void        _ComponentMouseExit (void) {}
+
+
+
+    GtkWidget     *parentWindow,
+                  *vScroll,
+                  *hScroll;
+
+    _HYRect       rel;
+
+    bool          activationFlag;
+
+    long          lastHScroll,
+                  lastVScroll;
+};
+
+void            AlignRectangle                          (_HYRect&, GdkRectangle&, unsigned char);
+gboolean        hyphy_event_component_callback          (GtkWidget *, GdkEvent*, gpointer);
+
+
+extern          bool    forceUpdateForScrolling;
+extern          double  fontConversionFactor;
+
+//__________________________________________________________________
+
+#endif
+
+//EOF
\ No newline at end of file
diff --git a/src/gui/gtk/include/HYPlatformGraphicPane.h b/src/gui/gtk/include/HYPlatformGraphicPane.h
new file mode 100644
index 0000000..f39b702
--- /dev/null
+++ b/src/gui/gtk/include/HYPlatformGraphicPane.h
@@ -0,0 +1,97 @@
+/*
+    A painting canvas glue for GTK
+
+    Sergei L. Kosakovsky Pond, October 2004.
+*/
+
+#ifndef _HYPGRAPHICPANE_
+#define _HYPGRAPHICPANE_
+//#pragma once
+
+#include "HYBaseGUI.h"
+#include <gtk/gtk.h>
+
+//__________________________________________________________________
+
+class  _HYPlatformGraphicPane
+{
+
+public:
+
+    _HYPlatformGraphicPane(int, int,int);
+    // initial size
+
+    virtual ~_HYPlatformGraphicPane();
+
+    virtual void        _SetPaneSize  (int,int,int);
+    virtual void        _DrawLine     (_HYRect);
+    virtual void        _DrawHatchedLine(_HYRect);
+    // from, to , width
+    virtual void        _DisplayText  (_String,int,int,bool);
+    // text, where, left-right or top-bottom
+    virtual void        _DisplayText  (_String&,_HYRect&, char);
+
+    virtual void        _DisplayChar  (char,int,int);
+    // text, where
+    virtual void        _DrawRect    (_HYRect);
+    virtual void        _FillRect    (_HYRect);
+    virtual void        _EraseRect   (_HYRect);
+    virtual void        _DrawOval    (_HYRect);
+    virtual void        _FillOval    (_HYRect);
+    virtual void        _EraseOval   (_HYRect);
+    virtual void        _DrawArc     (_HYRect,int,int);
+    virtual void        _FillArc     (_HYRect,int,int);
+    virtual void        _EraseArc    (_HYRect,int,int);
+    virtual void        _SetColor    (_HYColor);
+    virtual void        _SetBColor   (_HYColor);
+    virtual void        _SetFont     (_HYFont);
+    virtual void        _SetFontSize (long);
+    virtual void        _StartDraw   (void);
+    virtual void        _EndDraw     (void);
+    virtual void        _SetPort     (Ptr);
+    virtual void        _SlidePane   (int dv, int dh);
+    virtual void        _SlideRect   (_HYRect&r ,int dv, int dh);
+    virtual void        _InvertRect  (_HYRect&);
+    virtual void        _CopyToClipboard
+    (void);
+
+    virtual void        _DrawPicRes  (_HYRect&, long);
+    virtual void        _SavePicture (_String);
+
+    virtual Ptr         _DefinePolygon
+    (_SimpleList&);
+    virtual void        _KillPolygon (Ptr);
+    virtual void        _DrawPolygon (Ptr,long = 1);
+    virtual void        _FillPolygon (Ptr);
+    virtual void        _ErasePolygon(Ptr);
+    virtual void        _SetDialogBG (void);
+    virtual void        _BuildCharGlyphs (void);
+    virtual void        _ResetCharGlyphs (void);
+
+    GdkPixmap    *thePane;
+
+    GdkGC*                      theContext;
+    PangoLayout                 *textLayout;
+    PangoFontDescription        *theFont;
+
+    GdkColor                    saveFG,
+                                saveBG,
+                                fillColor;
+
+    GList*                      charCachePangoItems;
+    void                        *cachedCharacterGlyphs [61];
+};
+
+GdkRectangle    HYRect2GDKRect              (const _HYRect&);
+_HYRect         GdkRect2HYRect              (const GdkRectangle& hr);
+void            HYFont2PangoFontDesc        (const _HYFont&, PangoFontDescription*);
+
+extern          _List       exportFormats;
+
+void            findGraphicsExporterComponents (_List&);
+
+
+extern                      PangoContext* screenPContext;
+#endif
+
+//EOF
\ No newline at end of file
diff --git a/src/gui/gtk/include/HYPlatformWindow.h b/src/gui/gtk/include/HYPlatformWindow.h
new file mode 100644
index 0000000..f14faba
--- /dev/null
+++ b/src/gui/gtk/include/HYPlatformWindow.h
@@ -0,0 +1,175 @@
+/*
+    GTK window object glue - a window/title/size-box/scroll-bars handler.
+
+    Sergei L. Kosakovsky Pond, October 2004.
+*/
+
+#ifndef _HYPWINDOW_
+#define _HYPWINDOW_
+
+#include <gtk/gtk.h>
+
+#define  MAX_CONTROL_VALUE 100000000.
+#define  HY_WINDOW_MENU_ID_FILE 5000
+#define  HY_WINDOW_MENU_ID_EDIT 5050
+#define  HY_SCROLLER_WIDTH      16
+
+#include "hy_strings.h"
+#include "HYBaseGUI.h"
+
+//__________________________________________________________________
+
+class _HYPlatformWindow
+{
+
+public:
+
+    _HYPlatformWindow   (unsigned char,_String,bool,Ptr = nil);
+    // flags, title, visibility
+
+    virtual ~_HYPlatformWindow  (void);
+
+    void        _SetTitle               (const _String&);
+    void        _Show                   (void);
+    void        _Hide                   (void);
+    virtual bool        _Close                  (Ptr);
+    virtual void        _SetPosition            (int,int);
+    void        _SelectWindow           (void);
+    virtual void        _SetWindowRectangle     (int,int,int,int,bool=true);
+    virtual void        _SetContentSize         (int,int);
+    virtual void        _Paint                  (Ptr);
+    virtual void        _PaintHook              (Ptr);
+    virtual void        _Update                 (Ptr);
+    virtual void        _Activate               (void);
+    virtual void        _BringWindowToFront     (void);
+    virtual void        _Deactivate             (void);
+    virtual bool        _ProcessOSEvent         (Ptr);
+    virtual long        _Grow                   (Ptr) {
+        return 0;
+    }
+    virtual void        _Move                   (Ptr) {}
+    virtual void        _VisibleContents        (int&,int&,int&,int&);
+    virtual _HYRect     _GetWindowRect          (void);
+    bool        _IsHScroll              (GtkWidget*);
+    virtual bool        _ProcessMenuSelection   (long) {
+        return false;
+    }
+    virtual void        _SetMenuBar             (void);
+    virtual void        _UnsetMenuBar           (void);
+    virtual _String&    _GetTitle               (void);
+    void        _SetWindowBackColor     (_HYColor);
+    bool        _CleanDefaultMenu       (void);
+
+    virtual Ptr         _GetOSWindowData (void) {
+        return (Ptr)(windowContent);
+    }
+
+
+
+    GtkWidget                           *vScroll,
+                                        *hScroll,
+                                        *windowMB,
+                                        *theWindow,
+                                        *windowContent,
+                                        *hbox,
+                                        *vbox;
+
+    GtkItemFactory                      *menu_items;
+
+    double                              last_H_Position,
+                                        last_V_Position;
+
+    _HYRect                             savedLoc;
+    Ptr                                 containerRef;
+    unsigned char                       flags;
+    long                                lastWW,
+                                        lastWH;
+};
+
+//__________________________________________________________________
+
+class _HYPlatformTWindow
+{
+
+public:
+
+    _HYPlatformTWindow  (Ptr);
+    // flags, title, visibility
+
+    virtual ~_HYPlatformTWindow (void);
+    virtual void        _SetWindowRectangle     (int,int,int,int,bool=true);
+
+    guint           theTimer;
+    Ptr             trackMouseComponent;
+
+
+};
+
+//__________________________________________________________________
+
+class _HYPlatformPWindow
+{
+
+public:
+
+    _HYPlatformPWindow          (void);
+
+    virtual ~_HYPlatformPWindow         (void);
+
+    virtual void _StartPicture          (void);
+    virtual void _EndPicture            (void);
+    virtual void _DrawPicture           (_HYRect);
+
+private:
+
+    //PicHandle              savedPic;
+    //RgnHandle          savedClip;
+
+};
+
+//__________________________________________________________________
+
+struct _HY_GTK_UI_Message {
+    gboolean   processingResult;
+    GdkEvent * theEvent;
+};
+
+//__________________________________________________________________
+
+void     AdjustScroller     (GtkWidget*, long, long);
+
+extern   bool               forceUpdateForScrolling;
+extern   bool               InitPrint (void);
+
+extern   GdkPixmap          *stripedFill;
+
+extern   GdkPixbuf          *redButtonIcon,
+         *yellowButtonIcon,
+         *greenButtonIcon,
+         *orangeButtonIcon;
+
+extern   GdkColor           _BLACKBRUSH_,
+         _DARKGREYBRUSH_,
+         _WHITEBRUSH_;
+
+extern   GdkGC              *stripedFillGC;
+extern   PangoLayout        *statusBarLayout;
+extern   PangoFontDescription
+*statusBarFontDesc;
+
+extern   _HYFont            statusBarFont;
+
+void                        _PaintTheCircle                 (GdkPixbuf*,GtkWidget*);
+
+void                        h_scroll_bar_callback_window    (GtkRange*, gpointer);
+void                        v_scroll_bar_callback_window    (GtkRange*, gpointer);
+void                        hyphy_menu_item_callback         (gpointer, guint, GtkWidget *);
+
+GdkColor                    HYColorToGDKColor               (_HYColor);
+
+void                        SetUpStatusBarStuff             (GtkWidget *);
+
+
+#endif
+
+//EOF
\ No newline at end of file
diff --git a/src/gui/include/Components/HYButton.h b/src/gui/include/Components/HYButton.h
new file mode 100644
index 0000000..740558a
--- /dev/null
+++ b/src/gui/include/Components/HYButton.h
@@ -0,0 +1,79 @@
+/*
+    A general label object.
+
+    Sergei L. Kosakovsky Pond, October 2001.
+*/
+
+#ifndef _HYBUTTON_
+#define _HYBUTTON_
+
+#define  HY_BUTTON_OK     1
+#define  HY_BUTTON_CANCEL 2
+
+#include "HYComponent.h"
+#include "HYPlatformButton.h"
+
+//__________________________________________________________________
+
+class _HYButton: public _HYComponent, public _HYPlatformButton
+{
+
+public:
+
+    _HYButton(_HYRect,Ptr);
+
+    virtual ~_HYButton (void);
+
+    virtual void        SetBackColor        (_HYColor);
+    virtual _HYColor&   GetBackColor        (void);
+    virtual _String&    GetText             (void);
+    virtual void        SetFont             (_HYFont&);
+    virtual _HYFont&    GetFont             (void);
+    virtual void        SetText             (_String);
+    virtual void        Paint               (Ptr p) {
+        _HYPlatformButton::_Paint(p);
+    }
+    virtual void        Update              (Ptr p) {
+        _HYPlatformButton::_Update(p);
+    }
+    virtual void        SetDimensions       (_HYRect r, _HYRect rel) {
+        _HYComponent::SetDimensions(r,rel);
+        _HYPlatformButton::_SetDimensions(r,rel);
+    }
+
+    virtual void        EnableButton        (bool);
+    virtual void        SetButtonKind       (unsigned char);
+    virtual void        SetVisibleSize      (_HYRect);
+    virtual void        SetAlignFlags       (unsigned char f) {
+        alignFlags = f;
+    }
+    virtual unsigned char
+    GetAlignFlags       (void) {
+        return alignFlags;
+    }
+
+    virtual bool        UnfocusedKeyboardInput
+    (void) {
+        return isEnabled&&buttonKind;
+    }
+
+    virtual _HYRect     _SuggestDimensions  (void);
+    virtual bool        _ProcessOSEvent     (Ptr);
+    virtual void        _Activate           (void);
+    virtual void        _Deactivate         (void);
+
+
+
+    _String         buttonText;
+    _HYColor        backColor;
+    _HYFont         buttonFont;
+    unsigned char   alignFlags,
+             buttonKind;
+    bool            isEnabled;
+};
+
+//__________________________________________________________________
+
+#endif
+
+//EOF
diff --git a/src/gui/include/Components/HYButtonBar.h b/src/gui/include/Components/HYButtonBar.h
new file mode 100644
index 0000000..d752638
--- /dev/null
+++ b/src/gui/include/Components/HYButtonBar.h
@@ -0,0 +1,98 @@
+/*
+    A general button bar object
+
+    Sergei L. Kosakovsky Pond, June 2000.
+*/
+
+#ifndef _HYBUTTONBAR_
+#define _HYBUTTONBAR_
+//#pragma once
+
+#include "HYComponent.h"
+#include "HYPlatformButtonBar.h"
+
+#define  HY_BUTTONBAR_BORDER 2
+
+//__________________________________________________________________
+
+class _HYButtonBar: public _HYComponent, public _HYPlatformButtonBar
+{
+
+public:
+
+    _HYButtonBar(_HYRect,Ptr);
+
+    virtual ~_HYButtonBar(void);
+
+    virtual void        SetBackColor (_HYColor);
+    virtual _HYColor&   GetBackColor (void);
+    virtual void        AddButton    (Ptr,_String* toolTip);
+
+    virtual void        ReplaceButton(long,Ptr,_String* = nil);
+    virtual Ptr         GetButtonIcon(long);
+    virtual void        DeleteButton (long);
+    virtual void        EnableButton (long,bool);
+
+    virtual void        SendButtonPush      (int);
+    virtual bool        ProcessEvent (_HYEvent* e);
+    virtual void        Paint (Ptr p) {
+        _HYPlatformButtonBar::_Paint(p);
+    }
+    virtual void        Update(Ptr p) {
+        _HYPlatformButtonBar::_Update(p);
+    }
+    virtual void        SetDimensions(_HYRect r, _HYRect rel) {
+        _HYComponent::SetDimensions(r,rel);
+        _HYPlatformButtonBar::_SetDimensions(r,rel);
+    }
+    virtual void        SetVisibleSize(_HYRect);
+    virtual bool        _ProcessOSEvent (Ptr p);
+    virtual _HYRect     _SuggestDimensions (void);
+    virtual void        SetAlignFlags (unsigned char f) {
+        alignFlags = f;
+    }
+    virtual unsigned char
+    GetAlignFlags (void) {
+        return alignFlags;
+    }
+    virtual long        ButtonCount   (void) {
+        return buttons.lLength;
+    }
+    virtual void        SetButtonLayoutW(int w) {
+        barW = w;
+    }
+    virtual int         BarWidth (void) {
+        return barW;
+    }
+    virtual void        SetButtonDim  (int d) {
+        buttonDim = d;
+    }
+    virtual int         GetButtonDim  (void) {
+        return buttonDim;
+    }
+    virtual void        GetButtonLoc  (int, int&, int&, bool);
+    virtual void        SetToolTip    (long,_String*);
+    void        MarkAsPullDown(long,bool);
+
+    virtual void        _Activate           (void);
+    virtual void        _Deactivate         (void);
+    virtual void        _ComponentMouseExit (void);
+    void        _DisplayToolTip     (void);
+
+    friend  class       _HYPlatformButtonBar;
+
+protected:
+
+    _HYColor        backColor;
+    _SimpleList     buttons, enabledButtons, pullDownButtons;
+    _List           toolTips;
+    unsigned char   alignFlags;
+    int             barW,
+                    buttonDim;
+};
+
+//__________________________________________________________________
+
+#endif
+
+//EOF
diff --git a/src/gui/include/Components/HYCanvas.h b/src/gui/include/Components/HYCanvas.h
new file mode 100644
index 0000000..2cf4568
--- /dev/null
+++ b/src/gui/include/Components/HYCanvas.h
@@ -0,0 +1,73 @@
+/*
+    A canvas component.
+    Added stretchable canvas
+
+    Sergei L. Kosakovsky Pond, May-August 2000.
+*/
+
+#ifndef _HYCANVAS_
+#define _HYCANVAS_
+//#pragma once
+#include "HYComponent.h"
+#include "HYGraphicPane.h"
+
+#define  HY_SCANVAS_HORIZONTAL  1
+#define  HY_SCANVAS_VERTICAL    2
+
+//__________________________________________________________________
+
+class _HYCanvas: public _HYGraphicPane, public _HYComponent
+{
+
+public:
+
+    _HYCanvas(_HYRect,Ptr,int,int,int);
+
+    virtual ~_HYCanvas() {};
+
+    virtual bool        ProcessEvent        (_HYEvent*);
+    virtual void        _Paint              (Ptr);
+    virtual void        _Update             (Ptr);
+    virtual bool        _ProcessOSEvent     (Ptr);
+    virtual void        SetCanvasSize       (int,int,int);
+    virtual _HYRect     GetCanvasSize       (void);
+    virtual void        CrossfadeText       (_String& t1, _String& t2, _HYRect&, long d, long n, char, char);
+    virtual void        SetMouseClick       (bool mc) {
+        doMouseClicks = mc;
+    }
+    // text currently displayed is morphed into
+    // new text, in n steps with d ms per step
+    // + alignment
+
+
+    bool        doMouseClicks;
+
+};
+
+//__________________________________________________________________
+
+class _HYStretchCanvas: public _HYCanvas
+{
+
+public:
+
+    _HYStretchCanvas(_HYRect,Ptr,int,int,int,char flags);
+
+    virtual         ~_HYStretchCanvas() {};
+
+
+    virtual _HYRect GetCanvasSize (void);
+    virtual void    SetVisibleSize (_HYRect);
+    virtual int     GetMaxH (void);
+    virtual int     GetMaxW (void);
+
+
+    char        canvasFlags,
+                canvasDepth;
+};
+
+//__________________________________________________________________
+
+#endif
+
+//EOF
diff --git a/src/gui/include/Components/HYComponent.h b/src/gui/include/Components/HYComponent.h
new file mode 100644
index 0000000..5288def
--- /dev/null
+++ b/src/gui/include/Components/HYComponent.h
@@ -0,0 +1,133 @@
+/*
+    A general composite window component object
+
+    Sergei L. Kosakovsky Pond, May 2000.
+*/
+
+#ifndef _HYCOMPONENT_
+#define _HYCOMPONENT_
+//#pragma once
+#include "HYBaseGUI.h"
+#include "HYPlatformComponent.h"
+
+#define  HY_COMPONENT_NO_SCROLL  0
+#define  HY_COMPONENT_H_SCROLL   1
+#define  HY_COMPONENT_V_SCROLL   2
+#define  HY_COMPONENT_BORDER_L   4
+#define  HY_COMPONENT_BORDER_R   8
+#define  HY_COMPONENT_BORDER_T   16
+#define  HY_COMPONENT_BORDER_B   32
+#define  HY_COMPONENT_BORDER     60
+#define  HY_COMPONENT_BORDER_REL 64
+#define  HY_COMPONENT_WELL       128
+#define  HY_COMPONENT_DRAW_FOCUS 256
+#define  HY_COMPONENT_TRANSP_BG  512
+
+#define  HY_ALIGN_LEFT   1
+#define  HY_ALIGN_RIGHT  2
+#define  HY_ALIGN_TOP    4
+#define  HY_ALIGN_BOTTOM 8
+
+//__________________________________________________________________
+
+class _HYComponent: public _HYGuiObject, public _HYPlatformComponent
+{
+
+public:
+
+    _HYComponent(void);
+    _HYComponent(_HYRect,Ptr);
+    // settings, window data
+
+    virtual ~_HYComponent();
+
+    virtual BaseRef     makeDynamic();
+    virtual void        Duplicate (BaseRef);
+
+    virtual bool        ProcessEvent (_HYEvent*);
+    // by default do nothing
+
+    // a few tool functions
+
+    virtual int         GetMinH (void);
+    virtual int         GetMaxH (void);
+    virtual int         GetMaxW (void);
+    virtual int         GetMinW (void);
+    virtual int         GetMaxLH(void);
+    virtual int         GetMaxLW(void);
+    virtual int         GetHSize(void);
+    virtual int         GetVSize(void);
+    virtual bool        IsHElastic (void);
+    virtual bool        IsVElastic (void);
+    virtual void        SetDimensions (_HYRect,_HYRect);
+    virtual void        SetOrigin (int,int);
+    virtual void        SetVisibleSize (_HYRect);
+    virtual _HYRect     VisibleContents(Ptr);
+    virtual int         Settings (void) {
+        return settings.width;
+    }
+    virtual bool        HasHScroll (void) {
+        return settings.width&HY_COMPONENT_H_SCROLL;
+    }
+    virtual bool        HasVScroll (void) {
+        return settings.width&HY_COMPONENT_V_SCROLL;
+    }
+    virtual bool        UnfocusedKeyboardInput
+    (void) {
+        return false;
+    }
+    virtual void        ComponentMouseExit (void) {
+        _ComponentMouseExit ();
+    }
+    virtual void        FocusComponent  (void) {}
+    virtual void        UnfocusComponent(void) {}
+    virtual bool        CanCopy         (void) {
+        return false;
+    }
+    virtual BaseRef     CanPaste        (_String&) {
+        return nil;
+    }
+
+    virtual _String*    HandleCopy      (void) {
+        return new _String;
+    }
+    virtual void        HandlePaste     (BaseRef)
+    {}
+
+
+    // paint functions
+
+    virtual void        Paint           (Ptr);
+    virtual void        Update          (Ptr);
+    virtual void        Activate        (void) {
+        _Activate();
+    }
+    virtual void        Deactivate      (void) {
+        UnfocusComponent();
+        _Deactivate();
+    }
+    virtual void        IdleHandler     (void)
+    {}
+
+
+    virtual void        SetMessageRecipient (_HYGuiObject* o) {
+        messageRecipient = o;
+    }
+
+    _HYRect     settings;
+    // left,top - minimum dimensions
+    // right, bottom - maximum dimensions
+    // width - scrollable flags
+    int         hOrigin, vOrigin, hSize, vSize;
+    // display origin for non-self maintaining scrollers
+    bool        needUpdate;
+    // have I been changed?
+    _HYGuiObject*
+    messageRecipient;
+};
+
+//__________________________________________________________________
+
+#endif
+
+//EOF
diff --git a/src/gui/include/Components/HYLabel.h b/src/gui/include/Components/HYLabel.h
new file mode 100644
index 0000000..83f6d77
--- /dev/null
+++ b/src/gui/include/Components/HYLabel.h
@@ -0,0 +1,229 @@
+/*
+
+    A general label object.
+
+
+
+    Sergei L. Kosakovsky Pond, May 2000.
+
+
+
+    December 2001, added _HYCheckbox
+
+*/
+
+
+
+#ifndef _HYLABEL_
+
+#define _HYLABEL_
+
+//#pragma once
+
+#define  HY_LABEL_SHADOW 1
+
+
+
+#include "HYComponent.h"
+
+#include "HYPlatformLabel.h"
+
+#include "HYPlatformCheckbox.h"
+
+
+
+//__________________________________________________________________
+
+
+
+class _HYLabel: public _HYComponent, public _HYPlatformLabel
+
+{
+
+
+
+public:
+
+
+
+    _HYLabel(_HYRect,Ptr);
+
+
+
+    virtual ~_HYLabel(void);
+
+
+
+    virtual void        SetBackColor (_HYColor);
+
+    virtual _HYColor&   GetBackColor (void);
+
+    virtual void        SetForeColor (_HYColor);
+
+    virtual _HYColor&   GetForeColor (void);
+
+    virtual _String&    GetText (void);
+
+    virtual void        SetFont (_HYFont&);
+
+    virtual _HYFont&    GetFont (void);
+
+    virtual void        SetText (_String);
+
+    virtual void        Paint (Ptr p) {
+
+        _HYPlatformLabel::_Paint(p);
+
+    }
+
+    virtual void        Update(Ptr p) {
+
+        _HYPlatformLabel::_Update(p);
+
+    }
+
+    virtual void        SetDimensions(_HYRect r, _HYRect rel) {
+
+        _HYComponent::SetDimensions(r,rel);
+
+        _HYPlatformLabel::_SetDimensions(r,rel);
+
+    }
+
+    virtual void        SetVisibleSize(_HYRect);
+
+    virtual _HYRect     _SuggestDimensions (void);
+
+    virtual void        SetAlignFlags (unsigned char f) {
+
+        alignFlags = f;
+
+    }
+
+    virtual unsigned char
+
+    GetAlignFlags (void) {
+
+        return alignFlags;
+
+    }
+
+    void        SetShadow(bool);
+
+    bool        HasShadow(void) {
+
+        return visFlags&HY_LABEL_SHADOW;
+
+    }
+
+private:
+
+
+
+    _String         labelText;
+
+    _HYColor        backColor, foreColor;
+
+    _HYFont         labelFont;
+
+    unsigned char   alignFlags, visFlags;
+
+};
+
+
+
+//__________________________________________________________________
+
+
+
+class _HYCheckbox: public _HYLabel, public _HYPlatformCheckbox
+
+{
+
+
+
+public:
+
+
+
+    _HYCheckbox(_HYRect,Ptr,bool = false);
+
+
+
+    virtual ~_HYCheckbox(void);
+
+
+
+    virtual bool        GetState   (void)                   {
+
+        return checkState;
+
+    }
+
+    virtual long        GetSpacing (void)                   {
+
+        return checkSpacing;
+
+    }
+
+    virtual void        SetState   (bool, bool = false);
+
+    virtual void        SetSpacing (long);
+
+
+
+    virtual void        Enable     (bool);
+
+
+
+    virtual void        Paint (Ptr p) {
+
+        _HYPlatformLabel::_Paint(p);
+
+        _HYPlatformCheckbox::_Paint(p);
+
+    }
+
+
+
+    virtual void        Update(Ptr p)   {
+
+        _HYPlatformLabel::_Update(p);
+
+        _HYPlatformCheckbox::_Update(p);
+
+    }
+
+
+
+    virtual void        SetVisibleSize     (_HYRect);
+
+
+
+    virtual _HYRect     _SuggestDimensions (void);
+
+    virtual bool        _ProcessOSEvent     (Ptr);
+
+    virtual void        _Activate           (void);
+
+    virtual void        _Deactivate         (void);
+
+
+
+
+
+    bool            checkState,
+
+                    isEnabled;
+
+    long            checkSpacing;
+
+};
+
+
+
+#endif
+
+
+
+//EOF
diff --git a/src/gui/include/Components/HYList.h b/src/gui/include/Components/HYList.h
new file mode 100644
index 0000000..9c7e6dc
--- /dev/null
+++ b/src/gui/include/Components/HYList.h
@@ -0,0 +1,80 @@
+/*
+    A general list object
+
+    Sergei L. Kosakovsky Pond, August 2000.
+*/
+
+#ifndef _HYLIST_
+#define _HYLIST_
+//#pragma once
+#include "HYComponent.h"
+#include "HYPlatformList.h"
+
+//__________________________________________________________________
+
+class _HYList: public _HYComponent, public _HYPlatformList
+{
+
+public:
+
+    _HYList(_HYRect,Ptr);
+
+    virtual ~_HYList(void);
+
+    virtual void        InsertItem   (_String&, long);
+    virtual _String*    GetItem      (long);
+    virtual void        SetItem      (_String&, long);
+    virtual void        DeleteItem   (long);
+    virtual long        ItemCount    (void) {
+        return items.lLength;
+    }
+
+
+    virtual void        ToggleMultSelection (bool);
+    virtual bool        HaveMultSelection   (void) {
+        return multipleSelections;
+    }
+    virtual _SimpleList&GetSelection        (void) {
+        return selection;
+    }
+    virtual void        SendSelectionChange ();
+    virtual void        SendDblClickEvent   (long);
+    virtual void        KillSelection       (void);
+    virtual bool        ProcessEvent (_HYEvent* e);
+    virtual void        Paint (Ptr p) {
+        _HYPlatformList::_Paint(p);
+        _HYPlatformComponent::_Paint(p);
+    }
+    virtual void        Update(Ptr p) {
+        _HYPlatformList::_Update(p);
+        _HYPlatformComponent::_Update(p);
+    }
+    virtual void        SetSelection  (_SimpleList&);
+    virtual void        SetDimensions(_HYRect r, _HYRect rel) {
+        _HYComponent::SetDimensions(r,rel);
+        _HYPlatformList::_SetDimensions(r,rel);
+    }
+    virtual void        SetVisibleSize(_HYRect);
+    virtual bool        _ProcessOSEvent (Ptr p);
+    virtual void        _EraseRect(_HYRect);
+    virtual void        SetFont (_HYFont&);
+    virtual _HYFont&    GetFont (void) {
+        return listFont;
+    }
+    virtual void        _ToggleDrawing (bool);
+    virtual void        _Activate       (void);
+    virtual void        _Deactivate     (void);
+
+protected:
+
+    _List       items;
+    _SimpleList selection;
+    bool        multipleSelections;
+    _HYFont     listFont;
+};
+
+//__________________________________________________________________
+
+#endif
+
+//EOF
diff --git a/src/gui/include/Components/HYPullDown.h b/src/gui/include/Components/HYPullDown.h
new file mode 100644
index 0000000..da19d4c
--- /dev/null
+++ b/src/gui/include/Components/HYPullDown.h
@@ -0,0 +1,98 @@
+/*
+    A general pull down menu object.
+
+    Sergei L. Kosakovsky Pond, May 2000.
+*/
+
+#ifndef _HYPULLDOWNMENU_
+#define _HYPULLDOWNMENU_
+//#pragma once
+
+
+#define  HY_PULLDOWN_NO_MARK      0
+#define  HY_PULLDOWN_BULLET_MARK  1
+#define  HY_PULLDOWN_CHECK_MARK   2
+#define  HY_PULLDOWN_DIAMOND_MARK 4
+
+#include "HYPlatformPullDown.h"
+#include "HYComponent.h"
+
+//__________________________________________________________________
+
+class _HYPullDown: public _HYComponent, public _HYPlatformPullDown
+{
+
+public:
+
+    _HYPullDown(_HYRect,Ptr);
+    // flags, title, visibility
+
+    virtual ~_HYPullDown(void);
+
+    virtual BaseRef     makeDynamic();
+
+    virtual void        Activate     (void);
+    virtual void        Deactivate   (void);
+
+    virtual void        SetBackColor (_HYColor);
+    virtual _HYColor&   GetBackColor (void);
+    virtual void        AddMenuItem  (_String, long);
+    virtual void        SetMenuItem  (_String, long);
+    virtual void        DeleteMenuItem  (long);
+    virtual void        DeleteAllItems  (void);
+    virtual _String*    GetMenuItem  (long);
+    virtual long        GetSelection (void);
+    virtual void        SendSelectionChange (void);
+    virtual void        EnableMenu   (bool);
+    virtual void        EnableItem   (long, bool);
+    virtual bool        IsEnabled    (void);
+    virtual void        MarkItem     (long item, char kind) {
+        _MarkItem (item,kind);
+    }
+    virtual char        ItemMark     (long item)            {
+        return _ItemMark (item);
+    }
+    virtual bool        ProcessEvent (_HYEvent* e);
+    virtual void        Paint (Ptr p) {
+        _HYPlatformPullDown::_Paint(p);
+    }
+    virtual void        Update(Ptr p) {
+        _HYPlatformPullDown::_Update(p);
+    }
+    virtual void        SetDimensions(_HYRect r, _HYRect rel) {
+        _HYComponent::SetDimensions(r,rel);
+        _HYPlatformPullDown::_SetDimensions(r,rel);
+    }
+    virtual void        SetVisibleSize(_HYRect);
+    virtual void        SetAlignFlags (unsigned char f) {
+        alignFlags = f;
+    }
+    virtual long        FindMenuItem  (_String& s) {
+        return menuSelections.Find(&s);
+    }
+    virtual unsigned char
+    GetAlignFlags (void) {
+        return alignFlags;
+    }
+    virtual void        ChangeSelection (long, bool eventSend = true);
+    virtual long        MenuItemCount (void) {
+        return menuSelections.lLength;
+    }
+
+    virtual bool        _ProcessOSEvent             (Ptr p);
+    virtual _HYRect     _SuggestDimensions          (void);
+    void        _SetMenuItemTextStyle       (long, char);
+
+private:
+
+    _HYColor        backColor;
+    _List           menuSelections;
+    bool            enabledFlag;
+    unsigned char   alignFlags;
+};
+
+//__________________________________________________________________
+
+#endif
+
+//EOF
diff --git a/src/gui/include/Components/HYSequencePanel.h b/src/gui/include/Components/HYSequencePanel.h
new file mode 100644
index 0000000..c0d26b2
--- /dev/null
+++ b/src/gui/include/Components/HYSequencePanel.h
@@ -0,0 +1,123 @@
+/*
+    A sequence display component.
+
+    Sergei L. Kosakovsky Pond, August 2000.
+*/
+
+#ifndef _HYSEQPANEL_
+#define _HYSEQPANEL_
+//#pragma once
+#include "HYCanvas.h"
+
+#define  HY_SEQUENCE_PANE_CHAR_SPACING 4
+#define  HY_SEQUENCE_PANE_TOP_MARGIN   15
+#define  HY_SEQUENCE_PANE_NAMES_NONE   0
+#define  HY_SEQUENCE_PANE_NAMES_SHORT  1
+#define  HY_SEQUENCE_PANE_NAMES_ALL    2
+#define  HY_SEQUENCE_PANE_NAMES_MASK   0x03
+#define  HY_SEQUENCE_PANE_SHORT_WIDTH  10
+
+//__________________________________________________________________
+
+class _HYSequencePane: public _HYCanvas
+{
+
+public:
+
+    _HYSequencePane(_HYRect,Ptr,int,int);
+
+    virtual ~_HYSequencePane() {};
+
+    virtual void        _Paint  (Ptr);
+    virtual void        BuildPane   (bool setport = true);
+    virtual void        BuildHeaders(void);
+
+    virtual bool        ProcessEvent (_HYEvent* e);
+
+    virtual void        InsertColumn (_String*, long, bool update = false);
+    virtual void        RemoveColumn (long, bool update = false);
+    virtual void        SetCharColor (unsigned char, _HYColor, bool update = false);
+    virtual int         GetMaxW (void);
+    virtual int         GetMaxH (void);
+    virtual int         GetMinH (void);
+    virtual void        SetFont                 (_HYFont);
+    virtual void        SetBackColor            (_HYColor);
+    virtual void        SetHeaderColor          (_HYColor);
+    virtual void        SetHighliteColor        (_HYColor);
+    virtual void        SetVisibleSize          (_HYRect);
+
+    virtual void        HScrollPane             (long dx);
+    virtual long        RowCount                (void);
+    virtual void        SetHeaders              (_List*,bool);
+    virtual void        SetBlockWidth           (long,bool);
+    virtual void        AddColumnToSelection    (long);
+    virtual void        AddSpeciesToSelection   (long);
+    virtual void        SelectAll               (bool);
+    virtual void        SelectRange             (_SimpleList&, bool = false);
+    virtual void        ProcessSelectionChange  (long, long, bool, bool, bool drag = false);
+    virtual void        ProcessVSelectionChange (long, long, bool, bool, bool drag = false, bool editName = false);
+    virtual void        SendSelectionChange     (bool vert = false);
+    virtual void        ChangeHeaders           (void);
+    virtual void        MoveSpecies             (long, long);
+    virtual void        AlphabetizeSpecies      (void);
+    virtual void        RevertFileOrder         (void);
+    virtual void        ProcessContextualPopUp  (long,long);
+    virtual void        SetSequenceOrder        (_SimpleList&);
+    virtual void        SelectSequenceNames     (_List&, bool = true);
+
+
+    virtual bool        _ProcessOSEvent         (Ptr);
+    virtual void        SetNameDisplayMode      (unsigned char, bool update = false);
+    virtual long        GetSlotHeight           ();
+    virtual void        SetActiveOrPassive      (bool ap) {
+        active = ap;
+    }
+    virtual void        SetNumberDisplay        (bool nd) {
+        numbers = nd;
+    }
+    virtual void        ScrollToHSelection      (void);
+    virtual void        CleanUpSequenceNames    (void);
+    virtual void        EditSequenceName        (long);
+    virtual void        BatchRenameSequences    (_List&,_List&);
+
+    // data members
+
+    _List           columnStrings,
+                    rowHeaders;
+
+    _SimpleList     hiliteColumns,
+                    characterColors,
+                    selection,
+                    vselection,
+                    speciesIndex;
+
+    long            startColumn,
+                    endColumn,
+                    startRow,
+                    endRow,
+                    headerWidth,
+                    charWidth,
+                    blockWidth,
+                    recentClick,
+                    shortHeaderWidth,
+                    fullHeaderWidth,
+                    dragScrollCounter;
+
+    _HYColor        backColor,
+                    headerColor,
+                    highlightColor;
+
+    unsigned char   colorMap[256], nameDisplayFlags;
+
+    bool            showDots,
+                    active,
+                    numbers,
+                    invertColors;
+
+};
+
+//__________________________________________________________________
+
+#endif
+
+//EOF
diff --git a/src/gui/include/Components/HYTableComponent.h b/src/gui/include/Components/HYTableComponent.h
new file mode 100644
index 0000000..84cf471
--- /dev/null
+++ b/src/gui/include/Components/HYTableComponent.h
@@ -0,0 +1,237 @@
+/*
+    A table display component.
+
+    Sergei L. Kosakovsky Pond, January 2001.
+*/
+
+#ifndef _HYTABLE_
+#define _HYTABLE_
+//#pragma once
+
+#include "HYComponent.h"
+#include "HYPlatformTable.h"
+#include "batchlan.h"
+
+#define  HY_TABLE_STATIC_TEXT       0x0001
+#define  HY_TABLE_EDIT_TEXT         0x0002
+#define  HY_TABLE_ICON              0x0004
+#define  HY_TABLE_BEVELED           0x0008
+#define  HY_TABLE_SELECTED          0x0010
+#define  HY_TABLE_BOLD              0x0020
+#define  HY_TABLE_ITALIC            0x0040
+#define  HY_TABLE_PULLDOWN          0x0080
+#define  HY_TABLE_CANTSELECT        0x0100
+
+#define  HY_TABLE_STYLEMASK         0x60
+#define  HY_TABLE_DESELECT          0xFFEF
+
+#define  HY_TABLE_SEL_ROWS          0x01
+#define  HY_TABLE_SEL_COLS          0x02
+#define  HY_TABLE_DONT_SIZE         0x04
+#define  HY_TABLE_DONT_GROW_VERT    0x08
+#define  HY_TABLE_DONT_GROW_HORIZ   0x10
+#define  HY_TABLE_NO_COLS_LINES     0x20
+#define  HY_TABLE_SINGLE_SELECTION  0x40
+#define  HY_TABLE_FOCUSABLE         0x80
+#define  HY_TABLE_IS_FOCUSED        0x100
+#define  HY_TABLE_NODRAG_SELECTION  0x200
+#define  HY_TABLE_HORZ_STRETCH      0x400
+#define  HY_TABLE_VERT_STRETCH      0x800
+
+#define  HY_TABLE_COLOR_BOX         0x01
+#define  HY_TABLE_COLOR_CIRCLE      0x02
+
+//__________________________________________________________________
+
+class _HYTable: public _HYComponent, public _HYPlatformTable
+{
+
+public:
+    _HYTable        (_HYRect,Ptr, long,long,long,long,long);
+    // rel rect, window data, rows, columns, h step, v step, default cell type
+    virtual             ~_HYTable       ();
+
+    virtual void        _Paint          (Ptr);
+    virtual bool        _ProcessOSEvent (Ptr);
+    void        _HScrollTable   (long);
+    void        _VScrollTable   (long);
+    void        _MarkCellsForUpdate
+    (_SimpleList&);
+    void        _MarkCellForUpdate
+    (long);
+    void        _MarkColumnForUpdate
+    (long);
+    void        _MarkRowForUpdate
+    (long);
+    long        _HandlePullDown (_List&,long,long,long);
+    void        _ComponentMouseExit (void);
+
+    virtual bool        ProcessEvent    (_HYEvent*);
+    virtual int         GetMaxW         (void);
+    virtual int         GetMaxH         (void);
+    virtual int         GetMaxLW        (void);
+    virtual int         GetMaxLH        (void);
+    virtual void        SetVisibleSize  (_HYRect);
+    virtual void        SetTableFromMx  (_Matrix*, long, long, long);
+
+    virtual void        SetFont         (_HYFont&);
+    virtual void        SetBackColor    (_HYColor);
+    virtual void        SetBackColor2   (_HYColor);
+    virtual void        SetTextColor    (_HYColor);
+    virtual void        SetRowSelection (const _SimpleList&);
+    virtual void        SetColumnSelection (const _SimpleList&);
+    virtual void        _ScrollRowIntoView
+    (long);
+    virtual void        ClearSelection  (bool  standAlone = true);
+
+    virtual BaseRef     GetCellData     (long,long);
+    virtual void        SetCellData     (BaseRef,long,long,long,bool);
+    virtual void        SetTableSize    (long,long,long,long,long);
+    virtual void        AddRow          (long,long,long);
+    virtual  void       RequestSpace    (long,long);
+    virtual void        DeleteRow       (long);
+    virtual void        AddColumn       (long,long,long);
+    virtual void        DeleteColumn    (long);
+    virtual void        ClearTable      (bool all = false);
+    virtual void        GetDisplayRange (_HYRect*,long&,long&,long&,long&);
+
+    void        EnforceWidth    (long,long,bool = false);
+    void        EnforceHeight   (long,long,bool = false);
+    void        GetSelection    (_SimpleList&);
+    void        SetSelection    (_SimpleList&, bool update = false);
+    void        GetRowSelection (_SimpleList&, long = 0);
+    void        ScanRowSelection(_SimpleList&);
+    void        ScanColumnSelection
+    (_SimpleList&);
+    long        GetFirstRowSelection
+    (void);
+    bool        IsRowSelectionSimple
+    (void);
+    void        GetColumnSelection
+    (_SimpleList&);
+    void        SetRowOrder     (_SimpleList&);
+
+    void        SetRowSpacing   (long,long,bool);
+    void        SetColumnSpacing(long,long,bool);
+    void        AutoFitColumn   (long,bool,bool increaseOnly = false);
+    void        AutoFitWidth    (void);
+    void        AutoFitWidth    (_HYTable&, long = 0);
+
+    bool        ScrollToRow     (long);
+    bool        ScrollToColumn  (long);
+
+    void        InvertSelection (void);
+
+    long        GetRowSpacing   (long);
+    long        GetColumnSpacing(long);
+
+    bool        CheckForHSizeLocation
+    (long);
+    long        FindClickedTableCell
+    (long,long,long&,long&);
+
+    void        DragRow         (long, long);
+
+    virtual void        ModifySelection (long,long,bool,bool,bool message);
+    void        ExpungeSelection(void);
+
+    void        SaveTable       (_HYTable*, _HYTable*, long, FILE*,_String&,_SimpleList&,_SimpleList&);
+    void        SaveTable       (_HYTable*, _HYTable*, long, FILE*,_String&);
+    void        ExportCell      (FILE*,long,long,long);
+    long        GetCellWidth    (long,long);
+
+    static  void        GetTableFormats (_List&);
+    long        FindString      (_String*, long startat = 0);
+
+    void        EditBoxHandler  (long,_HYRect&);
+    virtual void        UnfocusComponent(void);
+    virtual void        FocusComponent  (void);
+    virtual void        _FocusComponent (void);
+    virtual void        IdleHandler     (void) {
+        _IdleHandler();
+    }
+
+    virtual void        _IdleHandler    (void);
+    long        _HandlePullDown (_List&,long,long);
+
+    void        _ScrollVPixels  (long);
+    void        _ScrollHPixels  (long);
+
+    void        _PrintTable     (_SimpleList&, _SimpleList&,_HYTable* cHeaders = nil);
+    void        _PrintTable     (_HYTable* cHeaders = nil);
+    void        _PrintTable     (_SimpleList&,_HYTable* cHeaders = nil);
+
+    virtual void        HandleKeyMove   (char, bool);
+
+    virtual bool        CanCopy         (void);
+    virtual BaseRef     CanPaste        (_String&);
+
+    virtual _String*    HandleCopy      (void);
+    virtual void        HandlePaste     (BaseRef);
+
+//virtual void      _Activate           (void);
+//virtual void      _Deactivate         (void);
+
+    // data components
+
+    _List           cellData;
+    _SimpleList     cellTypes,
+                    horizontalSpaces,
+                    verticalSpaces;
+    _HYColor        backColor,
+                    backColor2,
+                    textColor;
+
+    _HYFont         textFont;
+    short           editCellID,
+                    selectionType;
+    _String*        undoString;
+
+    long            undoIndex,
+                    undoIndex2,
+                    stretchWidth,
+                    stretchHeight;
+};
+
+//__________________________________________________________________
+
+class _HYHList: public _HYTable
+{
+
+public:
+    _HYHList        (_HYRect, Ptr, _List&, bool = true);
+    // rel rect, window data, list data, single or multiple
+    virtual             ~_HYHList       () {}
+    virtual void        ModifySelection (long,long,bool,bool,bool);
+    virtual long        IsARubrik       (long);
+    virtual bool        IsRubrikOpen    (long);
+    virtual long        RubrikIndex     (long);
+    virtual long        AbsoluteIndex   (long,long);
+    virtual void        FitToHeight     (long);
+    virtual bool        HasPadding      (void);
+    virtual void        HandleKeyMove   (char, bool);
+    virtual long        FindString      (_String*, long startat = 0);
+    virtual void        AddRubrik       (_String&, _List&, long);
+    virtual void        DeleteRubrik    (long);
+    virtual long        IsSingleRubrik  (_SimpleList&);
+
+    _List           listData;
+    _SimpleList     rubrikIndex;
+    bool            single;
+};
+
+//__________________________________________________________________
+
+#define   tPDMh         12
+#define   tPDMw         13
+
+extern    _HYColor      tableDefaultBk,
+          tableDefaultBk2;
+
+extern    _SimpleList*  openArrow,
+          *    closedArrow;
+
+
+#endif
+
+//EOF
diff --git a/src/gui/include/Components/HYTextBox.h b/src/gui/include/Components/HYTextBox.h
new file mode 100644
index 0000000..f448226
--- /dev/null
+++ b/src/gui/include/Components/HYTextBox.h
@@ -0,0 +1,117 @@
+/*
+    A text edit box object.
+
+    Sergei L. Kosakovsky Pond, November 2001.
+*/
+
+#ifndef _HYTEXTBOX_
+#define _HYTEXTBOX_
+
+#include "HYComponent.h"
+#include "HYPlatformTextbox.h"
+
+#define  HY_TB_ENABLED 0x01
+#define  HY_TB_FOCUSED 0x02
+#define  HY_TB_WRAP    0x04
+#define  HY_TB_BIGBOX  0x08
+#define  HY_TB_ARROWS  0x10
+
+//__________________________________________________________________
+
+class _HYTextBox: public _HYComponent, public _HYPlatformTextBox
+{
+
+public:
+
+    _HYTextBox          (_HYRect,Ptr, bool = false);
+
+    virtual                 ~_HYTextBox         (void);
+
+    virtual void            SetBackColor        (_HYColor);
+    virtual void            SetForeColor        (_HYColor);
+    virtual void            SetBackTColor       (_HYColor);
+    virtual _HYColor&       GetBackColor        (void);
+    virtual _HYColor&       GetBackTColor       (void);
+    virtual _HYColor&       GetForeColor        (void);
+    virtual _String         GetText             (void);
+    virtual void            StoreText           (_String*&, bool = false);
+    virtual void            SetFont             (_HYFont&);
+    virtual _HYFont&        GetFont             (void);
+    virtual void            SetText             (const _String&, bool update = false);
+    virtual void            InsertText          (const _String&, bool update = false, bool append = false);
+    virtual void            SetSelection        (long s,long e) {
+        _SetSelection(s,e);
+    }
+
+    virtual void            Paint               (Ptr p) {
+        _HYPlatformTextBox::_Paint(p);
+    }
+    virtual void            Update              (Ptr p) {
+        _HYPlatformTextBox::_Update(p);
+    }
+
+    virtual void            SetDimensions       (_HYRect r, _HYRect rel) {
+        _HYComponent::SetDimensions(r,rel);
+        _HYPlatformTextBox::_SetDimensions(r,rel);
+    }
+
+    virtual void            EnableTextEdit      (bool);
+    virtual void            SetMargins          (_HYRect newMargins);
+
+    virtual void            SetVisibleSize      (_HYRect);
+    virtual void            SetAlignFlags       (unsigned char f) {
+        alignFlags = f;
+        _SetAlignFlags (f);
+    }
+    virtual unsigned char
+    GetAlignFlags       (void) {
+        return alignFlags;
+    }
+
+    virtual void            FocusComponent      (void);
+    virtual void            UnfocusComponent    (void);
+    virtual void            IdleHandler         (void) {
+        _IdleHandler();
+    }
+
+    virtual bool            _ProcessOSEvent     (Ptr);
+    virtual void            _Activate           (void);
+    virtual void            _Deactivate         (void);
+    virtual void            _SetSelection       (long,long);
+    virtual void            _IdleHandler        (void);
+    virtual void            _MarkForUpdate      (void);
+    virtual bool            _IsEmpty            (void);
+
+    virtual void            _DoUndo             (bool = false);
+    virtual void            _DoRedo             (bool = false);
+    virtual void            _DoCopy             (bool = false);
+    virtual void            _DoCut              (bool = false);
+    virtual void            _DoPaste            (bool = false);
+    virtual void            _DoSelectAll        (bool = false);
+    virtual void            _DoClear            (bool,bool = false);
+    virtual void            _DoFind             (_String&);
+
+
+    _HYFont         editBoxFont;
+    _HYColor        backColor,
+                    foreColor,
+                    backTextColor;
+
+    _HYRect         margins;
+
+    unsigned char   alignFlags;
+
+    int             boxFlags;
+
+    /*bool          isEnabled,
+                    isFocused,
+                    wrapToView,
+                    boxType;*/
+};
+
+
+//__________________________________________________________________
+
+#endif
+
+//EOF
diff --git a/src/gui/include/HYBaseGUI.h b/src/gui/include/HYBaseGUI.h
new file mode 100644
index 0000000..1db46d7
--- /dev/null
+++ b/src/gui/include/HYBaseGUI.h
@@ -0,0 +1,126 @@
+/*
+    Some general GUI object definitions.
+    Basic GUI object,
+    Basic Event.
+
+    Global event queue, and object ID counter.
+
+    Sergei L. Kosakovsky Pond, May 2000.
+*/
+
+#ifndef _HYBASEGUI_
+#define _HYBASEGUI_
+//#pragma once
+#include "hy_strings.h"
+#include "list.h"
+
+//__________________________________________________________________
+
+class _HYEvent: public BaseObj
+{
+
+public:
+
+    _HYEvent();
+
+    _HYEvent(_HYEvent&);
+
+    _HYEvent(_String, _String);
+
+    virtual ~_HYEvent(void);
+
+    virtual BaseRef  toStr (void);
+
+    virtual BaseRef  makeDynamic (void);
+
+    virtual void     Duplicate (BaseObj* ref);
+
+    _String& EventClass (void);
+
+    _String& EventCode  (void);
+
+private:
+
+    _String  eventClass, eventCode;
+};
+
+//__________________________________________________________________
+
+class _HYGuiObject:public BaseObj
+{
+
+public:
+
+    _HYGuiObject (void);
+
+    virtual ~_HYGuiObject (void);
+
+    unsigned long GetID (void);
+
+    bool     MatchID (unsigned long);
+
+    virtual bool     ProcessEvent (_HYEvent* e)     {
+        DeleteObject(e);
+        return false;
+    }
+    virtual bool     ProcessGEvent (_HYEvent*)      {
+        return false;
+    }
+
+    virtual void     ProcessContextualPopUp (long, long) {}
+
+private:
+
+    unsigned long ID;
+};
+
+
+
+//__________________________________________________________________
+
+typedef struct _HYRect {
+    long        top,
+                left,
+                bottom,
+                right,
+                width;
+
+    bool        Contains (int, int);
+    long        Width    ();
+    long        Height   ();
+
+} _HYRect;
+
+//__________________________________________________________________
+
+typedef struct _HYColor {
+    unsigned char R,G,B;
+
+    _String  HTMLColor (void);
+    bool     operator == (_HYColor&);
+} _HYColor;
+
+//__________________________________________________________________
+
+typedef struct  _HYFont {
+    _String face;
+    int     size;
+    unsigned char style;
+} _HYFont;
+
+//__________________________________________________________________
+
+
+long     HYColorToLong      (_HYColor);
+_HYColor LongToHYColor      (long);
+
+_HYRect  makeHYRect         (int,int,int,int,int);
+
+extern  _List               GlobalGUIEventQueue;
+extern  _SimpleList         windowObjectRefs;
+extern  _String             ReportThisError;
+extern  unsigned long       GUIObjectGlobalCounter;
+
+#endif
+
+//EOF
diff --git a/src/gui/include/HYDialogs.h b/src/gui/include/HYDialogs.h
new file mode 100644
index 0000000..b5a981e
--- /dev/null
+++ b/src/gui/include/HYDialogs.h
@@ -0,0 +1,406 @@
+/*
+    A collection of orphan dialogs
+
+    Sergei L. Kosakovsky Pond, October 2001-May 2002.
+*/
+
+#ifndef _HYDIALOGS_
+#define _HYDIALOGS_
+
+#include "HYComponent.h"
+#include "HYWindow.h"
+#include "HYTableWindow.h"
+#include "preferences.h"
+
+//__________________________________________________________________
+
+class _HYFontDialog: public _HYTWindow
+{
+
+public:
+
+    _HYFontDialog    (_HYFont&,_HYWindow*);
+    virtual     ~_HYFontDialog   (void) {}
+
+    virtual bool ProcessEvent    (_HYEvent*);
+
+
+    _HYFont     myFont,
+                firstFont;
+
+    _HYWindow*  mr;
+
+};
+
+//__________________________________________________________________
+
+class _HYListSelectDialog: public _HYTWindow
+{
+
+public:
+
+    _HYListSelectDialog  (_List*, _SimpleList*, _SimpleList*, _String, _SimpleList*, long*);
+    virtual     ~_HYListSelectDialog     (void) {}
+
+    virtual bool ProcessEvent            (_HYEvent*);
+    virtual void SetInitialSelection     (void);
+
+
+    _List       * data,
+                dData;
+    _SimpleList * choices,
+                * validChoices,
+                * selections;
+
+    long        * result;
+    _String     lastString;
+
+};
+
+//__________________________________________________________________
+
+class _HYSimpleListSelectDialog: public _HYTWindow
+{
+
+public:
+
+    _HYSimpleListSelectDialog    (_List*, _SimpleList*, _SimpleList*, _String, _SimpleList*, long, long*,Ptr = nil);
+    virtual     ~_HYSimpleListSelectDialog   (void) {}
+
+    virtual bool ProcessEvent                (_HYEvent*);
+    virtual void SetInitialSelection         (void);
+
+
+    _List       dData;
+    _SimpleList * choices,
+                * validChoices,
+                * selections;
+
+    long        * result,
+                reqSel;
+
+    _String     lastString;
+
+};
+
+//__________________________________________________________________
+
+class _HYPreferencesDialog: public _HYTWindow
+{
+
+public:
+
+    _HYPreferencesDialog         (_List&, _String, bool, bool*);
+    virtual     ~_HYPreferencesDialog        (void)
+    {}
+
+    virtual bool ProcessEvent                (_HYEvent*);
+    virtual void SetInitialSelection         (void);
+
+
+    _List    dData,
+             *prefList,
+             backupValues;
+
+    bool     setFont,
+             *result;
+};
+
+//__________________________________________________________________
+
+class _HYCombDialog: public _HYTWindow
+{
+
+public:
+
+    _HYCombDialog        (_SimpleList*, bool*, Ptr = nil);
+    virtual     ~_HYCombDialog       (void)
+    {}
+
+    virtual bool ProcessEvent                (_HYEvent*);
+
+
+    _SimpleList*
+    combResult;
+
+    bool    *result;
+};
+
+
+//__________________________________________________________________
+
+class _HYPartitionDialog: public _HYTWindow
+{
+
+public:
+
+    _HYPartitionDialog       (_String&, _String*, _HYColor*, bool*, char*, long*, long,  bool*, char, Ptr);
+    virtual     ~_HYPartitionDialog      (void)
+    {}
+
+    virtual bool ProcessEvent            (_HYEvent*);
+
+
+    _String*  partName;
+    _HYColor* color;
+
+    bool*     direction,
+              *   result;
+
+    long*     codeRef,
+              dfID;
+
+    char*     readFrame;
+};
+
+
+//__________________________________________________________________
+
+class _HYTextDialog: public _HYTWindow
+{
+
+public:
+
+    _HYTextDialog        (_String*,_String&, bool*, Ptr = nil, _hyStringValidatorType = nil);
+    virtual     ~_HYTextDialog       (void)  {}
+
+    virtual bool ProcessEvent                (_HYEvent*);
+
+    //**********************************************//
+
+    bool    * result,
+            lastValidationState;
+
+    _hyStringValidatorType  validator;
+    _String * textOut;
+};
+
+//__________________________________________________________________
+
+class _HYTextDialog2: public _HYTextDialog
+{
+
+public:
+
+    _HYTextDialog2       (_String*,_String*,_String&,_String&, bool*, Ptr = nil);
+    virtual     ~_HYTextDialog2      (void)  {}
+
+    virtual bool ProcessEvent                (_HYEvent*);
+
+    _String * textOut2;
+};
+
+//__________________________________________________________________
+
+class _HYTextDialogWithCheckbox: public _HYTextDialog
+{
+
+public:
+
+    _HYTextDialogWithCheckbox        (_String*,_String&, _String& ,bool*, bool*, Ptr = nil);
+    virtual     ~_HYTextDialogWithCheckbox       (void)
+    {}
+
+    virtual bool ProcessEvent                    (_HYEvent*);
+
+    bool    * checkState;
+};
+
+//__________________________________________________________________
+
+class _HYTextDialogWithPulldown: public _HYTextDialogWithCheckbox
+{
+
+public:
+
+    _HYTextDialogWithPulldown        (_String*,_String&, _String& , _List&, _List*, bool*, bool*, long*, long, Ptr = nil);
+    virtual     ~_HYTextDialogWithPulldown       (void)
+    {}
+
+    virtual bool ProcessEvent                    (_HYEvent*);
+
+    long      * menuSelection;
+    _List     * autoFill;
+};
+
+//__________________________________________________________________
+
+class _HYProceedPromptBox: public _HYTWindow
+{
+
+public:
+
+    _HYProceedPromptBox          (_String&,_String&, _String&,  _HYFont&, long, bool*, Ptr);
+    virtual     ~_HYProceedPromptBox             (void)
+    {}
+
+    virtual bool ProcessEvent                    (_HYEvent*);
+
+    bool    * result;
+};
+
+//__________________________________________________________________
+
+class _HYProceedPromptBoxWCheck: public _HYProceedPromptBox
+{
+
+public:
+
+    _HYProceedPromptBoxWCheck            (_String&, _String&, _String&, _String&, _HYFont&, long, bool*, bool*, Ptr);
+    virtual     ~_HYProceedPromptBoxWCheck           (void) {}
+
+    virtual bool ProcessEvent                    (_HYEvent*);
+
+    bool    * checkState;
+};
+
+//__________________________________________________________________
+
+class _HYInferenceConstraints: public _HYTextDialog
+{
+
+public:
+
+    _HYInferenceConstraints          (_String&, _List&, _List&, _List&, _List&,
+                                      _List&, _List&, _List&, _List&,
+                                      _HYFont&, bool*, _String*, Ptr);
+    virtual     ~_HYInferenceConstraints             (void)
+    {}
+
+    virtual bool ProcessEvent                        (_HYEvent*);
+
+    bool    * checkState;
+    _String * topC;
+
+    _List   * il1,
+            * il2,
+            * il3,
+            * il4;
+};
+
+
+//__________________________________________________________________
+
+class _HYCIDialog: public _HYTWindow
+{
+
+public:
+
+    _HYCIDialog          (bool*, char*, _Parameter*,_Parameter*, Ptr);
+    virtual     ~_HYCIDialog         (void) {}
+
+    virtual bool ProcessEvent        (_HYEvent*);
+
+
+    bool        *result;
+
+    char        *option,
+                lastState;
+
+    _Parameter  *sigValue,
+                *sigValue2;
+};
+
+//__________________________________________________________________
+
+class _HYLProfDialog: public _HYTWindow
+{
+
+public:
+
+    _HYLProfDialog           (bool*,_Parameter*,_Parameter*,long*,bool*,_Parameter,_Parameter,_Parameter,Ptr);
+    virtual     ~_HYLProfDialog          (void) {}
+
+    virtual bool ProcessEvent            (_HYEvent*);
+
+
+    bool        *result,
+                *doNorm;
+
+    char        lastState[3];
+
+    _Parameter  *left,
+                *right,
+                mle,
+                vlb,
+                vub;
+
+    long*       intervals;
+
+};
+
+//__________________________________________________________________
+
+class _HYNewChart: public _HYTWindow
+{
+
+public:
+
+    _HYNewChart  (long*,long*,bool*,_String*);
+    virtual     ~_HYNewChart     (void)
+    {}
+
+    virtual bool ProcessEvent    (_HYEvent*);
+
+    bool    * result;
+    long    * resR,
+            * resC;
+
+    _String * title;
+};
+
+//__________________________________________________________________
+
+class _HYTreePrintPrefs: public _HYTWindow
+{
+
+public:
+
+    _HYTreePrintPrefs    (long*,long*,bool*,Ptr);
+    virtual     ~_HYTreePrintPrefs   (void) {}
+
+    virtual bool ProcessEvent    (_HYEvent*);
+
+    bool    * result;
+    long    * resW,
+            * resH;
+};
+
+
+//__________________________________________________________________
+
+long     HandleHierListSelection (_List&, _SimpleList&, _SimpleList&, _String, _SimpleList&, long);
+long     HandleListSelection     (_List&, _SimpleList&, _SimpleList&, _String, _SimpleList&, long, Ptr = nil);
+long     HandleListSelection     (_List&, _String, Ptr = nil);
+bool     HandlePreferences       (_List&, _String , bool = true);
+
+_String  NewTreeWindow           (long);
+void     BuildBalancedTree       (long, long , _String& , _List&);
+
+extern  _List                   cachedDialogTitles,
+        cachedDialogSelections;
+
+_String*RetrieveCachedSelection (_String*);
+void    StoreDialogSelection    (_String*,_String*);
+bool    EnterStringDialog       (_String& res, _String& prompt, Ptr = nil, _hyStringValidatorType = nil);
+bool    EnterString2Dialog      (_String& , _String&, _String&, _String& , Ptr = nil);
+bool    EnterStringDialogWithCheckbox
+(_String&, _String&, _String&, bool&, Ptr = nil);
+bool    EnterStringDialogWithPulldown
+(_String&, _String&, _String&, long&, _List&, _List *, bool&, long,  Ptr);
+
+bool    ProceedPrompt           (_String&, Ptr = nil);
+bool    ProceedPromptWithCheck  (_String&, _String&, bool&, Ptr = nil);
+void    ProblemReport           (_String&, Ptr = nil);
+bool    TreePrintSetup          (long&, long&, Ptr);
+bool    HandleCIDialog          (char&, _Parameter&, _Parameter&, Ptr);
+bool    HandlePLDialog          (_Parameter&, _Parameter&, long&, bool&, _Parameter, Ptr);
+void    ShowMessagesLog         (void);
+void    ExecuteSelection        (void);
+bool    OpenDatabaseFile        (_String*);
+bool    NewDatabaseFile         (_String*);
+
+
+#endif
+
+//EOF
diff --git a/src/gui/include/HYEventTypes.h b/src/gui/include/HYEventTypes.h
new file mode 100644
index 0000000..5c82ac0
--- /dev/null
+++ b/src/gui/include/HYEventTypes.h
@@ -0,0 +1,87 @@
+/*
+    Event Types and Generators
+
+    Sergei L. Kosakovsky Pond, May 2000.
+*/
+
+#ifndef _HYEVENTTYPES_
+#define _HYEVENTTYPES_
+
+//#pragma once
+#include "HYBaseGUI.h"
+
+
+_HYEvent*   generateScrollEvent         (int,int,long objID = -1);
+_HYEvent*   generateMenuSelChangeEvent  (long,long);
+_HYEvent*   generateMenuOpenEvent       (long);
+_HYEvent*   generateButtonPushEvent     (long,long);
+_HYEvent*   generateRebuildSCanvas      (long);
+_HYEvent*   generateListChangeEvent     (long);
+_HYEvent*   generateListDblClickEvent   (long,long);
+_HYEvent*   generateTableDblClickEvent  (long);
+_HYEvent*   generateKeyboardFocusEvent  (long);
+_HYEvent*   generateTablePullDownEvent  (long,long,long);
+_HYEvent*   generateTableEditCellEvent  (long,long);
+_HYEvent*   generateTableResizeCEvent   (long,long,long);
+_HYEvent*   generateTableChangeSelEvent (long);
+_HYEvent*   generateContextPopUpEvent   (long,long,long);
+_HYEvent*   generateTextEditChangeEvent (long,long);
+
+extern _String _hyScrollingEvent,
+       _hyMenuSelChangeEvent,
+       _hyMenuOpenEvent,
+       _hyButtonPushEvent,
+       _hyRebuildSCanvasEvent,
+       _hyListChangeEvent,
+       _hyTableDblClickEvent,
+       _hyKeyboardFocusEvent,
+       _hyListDblClickEvent,
+       _hyTablePullDownEvent,
+       _hyTableEditCellEvent,
+       _hyTableChangeSelEvent,
+       _hyTableResizeCEvent,
+       _hyContextPopUp,
+       _hyTextEditChange,
+       _hyGlobalLFKillEvent,
+       _hyGlobalLFSpawnEvent,
+       _hyGlobalDFKillEvent,
+       _hyGlobalTreeKillEvent,
+       _hyGlobalDSKillEvent,
+       _hyGlobalDFAlterEvent,
+       _hyGlobalCloseWindow,
+       _hyGlobalChangeLF,
+       _hyGlobalChangeLFParams,
+       _hyGlobalSetTreePanelSelection;
+
+
+void    postLFKillEvent             (long,long);
+void    postLFSpawnEvent            (long,long);
+void    postDFKillEvent             (long,long);
+void    postDSKillEvent             (long,long);
+void    postTreeKillEvent           (long,long);
+void    postObjectChangelEvent      (long,long,long);
+void    postWindowCloseEvent        (long);
+void    postChangeLFEvent           (long,long);
+void    postChangeLFParamsEvent     (long,long);
+void    postSetTreePanelSelection   (long,_String*);
+
+
+void    HandleGlobalQueueEvent      (void);
+
+
+/*extern _String _hyNotifyNewTree,
+               _hyNotifyChangeTree
+
+
+void        RegisterForNotification   (_HYGuiObject*,_String&,_String&);
+// request that the object be notified of events of a certain type
+void        UnregisterFromNotification(_HYGuiObject*);
+// remove  the object from notification queues
+void        PostNotification          (_HYGuiObject*,_String&,_String&);
+
+
+void
+*/
+#endif
+
+//EOF
diff --git a/src/gui/include/HYGraphicPane.h b/src/gui/include/HYGraphicPane.h
new file mode 100644
index 0000000..ddaad69
--- /dev/null
+++ b/src/gui/include/HYGraphicPane.h
@@ -0,0 +1,120 @@
+/*
+    A painting canvas with double buffer.
+
+    Sergei L. Kosakovsky Pond, May 2000.
+*/
+
+#ifndef _HYGRAPHICPANE_
+#define _HYGRAPHICPANE_
+//#pragma once
+#include "HYBaseGUI.h"
+#include "HYPlatformGraphicPane.h"
+
+#define  HY_FONT_PLAIN  0
+#define  HY_FONT_BOLD   1
+#define  HY_FONT_ITALIC 2
+
+//__________________________________________________________________
+
+class _HYGraphicPane: public _HYPlatformGraphicPane
+{
+
+public:
+
+    _HYGraphicPane(int, int, int);
+    // initial size, pixel depth
+
+    virtual ~_HYGraphicPane();
+
+
+    virtual void        SetPaneSize  (int,int,int);
+    virtual void        EraseAll     (void);
+    virtual void        DrawLine     (_HYRect);
+    virtual void        DrawHatchedLine(_HYRect);
+    // from, to , width
+    virtual void        DisplayText  (_String,int,int,bool);
+    // text, where, left-right or top-bottom
+    virtual void        DisplayText  (_String, _HYRect, char);
+    // text wrapped in a rect
+    // with alignment
+
+    virtual void        DisplayChar  (char,int,int);
+    // text, where
+    virtual void        DrawRect     (_HYRect);
+    virtual void        DrawPicRes   (_HYRect& r,long i) {
+        _DrawPicRes (r,i);
+    }
+
+    virtual void        FillRect     (_HYRect);
+    virtual void        InvertRect   (_HYRect);
+    virtual void        EraseRect    (_HYRect);
+    virtual void        DrawOval     (_HYRect);
+    virtual void        FillOval     (_HYRect);
+    virtual void        EraseOval    (_HYRect);
+    virtual void        DrawPolygon  (_SimpleList&, long = 1);
+    virtual void        FillPolygon  (_SimpleList&);
+    virtual void        ErasePolygon (_SimpleList&);
+    virtual void        DrawArc      (_HYRect,int,int);
+    virtual void        FillArc      (_HYRect,int,int);
+    virtual void        EraseArc     (_HYRect,int,int);
+    virtual void        SetColor     (_HYColor);
+    virtual void        SetBColor    (_HYColor);
+    virtual void        SetFont      (_HYFont);
+    virtual void        SetFontSize  (long);
+    virtual void        SetDialogBG  (void) {
+        _SetDialogBG();
+    }
+    virtual void        DrawFrame    (_HYColor c);
+    virtual _HYColor&   GetColor     (void) {
+        return color;
+    }
+    virtual _HYColor&   GetBColor    (void) {
+        return bColor;
+    }
+    virtual _HYFont&    GetFont      (void) {
+        return font;
+    }
+    virtual void        StartDraw    (void);
+    virtual void        EndDraw      (void);
+    virtual void        DrawInfoBox  (_HYRect, _String);
+    virtual void        DrawTable    (_List&, _List&, char, _HYRect, _HYRect);
+    // strings,
+    // placements obtained by ComputeTableCellPlacements,
+    // alignment flags
+    // _HYRect has the margins with width specifying the width of table lines
+    // top - vOffset, left - hOffset, right - table with, bottom - table height
+    virtual void        DrawHashes   (_HYRect, _SimpleList&, _List&, int, int);
+    // HYRect has
+    // left and right or top and bottom : the line to hash
+    // width has the offset (to the left or to the bottom) of labels vs the axis
+    // int is the length of the hashes
+    // 2nd int is the width of the hashes
+
+
+    int         w,h,depth;
+    _HYColor    color,
+                bColor;
+    _HYFont     font;
+};
+
+extern  _HYColor hyDefaultFrameColor;
+void    RotateRect90 (_HYRect&);
+double  DistanceBetweenPoints     (double,double,double,double);
+long    AngleBetweenPoints        (double,double,double,double);
+long    ComputeTableCellPlacement (_List&, _List&, _HYRect, _HYFont&);
+//      _HYRect contains the margins for each cell (left, right, etc)
+//      the 2nd _List will contain _SimpleLists per row with 3 entries per cell:
+//      top, left, horizontal extra space (used for alignment)
+//      returns table width
+
+long    ComputeHashMarkPlacement  (_HYRect, _Parameter, _Parameter, _Parameter&, _Parameter&, _SimpleList&, _List&, int, _HYFont&);
+//      _HYRect contains the endpoints of the axis (if left or right != 0, then horizontal)
+//      otherwise - vertical. _SimpleList will contain hashmark offsets
+//      _Parameter& will contain the step;
+//      _Parameter& #2 will contain the first (smallest hash)
+//      _List& contains the labels
+//      int is used to specify the minimal number of hashes
+//      returns the width/height of the labels
+#endif
+
+//EOF
diff --git a/src/gui/include/HYObjectInspector.h b/src/gui/include/HYObjectInspector.h
new file mode 100644
index 0000000..809631a
--- /dev/null
+++ b/src/gui/include/HYObjectInspector.h
@@ -0,0 +1,50 @@
+/*
+    Object Inspector Panel
+
+    Sergei L. Kosakovsky Pond, December 2000.
+*/
+
+#ifndef _HYOBJECTINSPECTOR_
+#define _HYOBJECTINSPECTOR_
+//#pragma once
+#include "HYTableWindow.h"
+#define  HY_OBJECT_INSPECTOR_TABLE_ROW 2
+
+//__________________________________________________________________
+
+class _HYObjectInspector: public _HYTWindow
+{
+
+public:
+
+    _HYObjectInspector(void);
+
+    virtual             ~_HYObjectInspector();
+
+    virtual bool        ProcessEvent            (_HYEvent*);
+    virtual bool        ProcessGEvent           (_HYEvent*);
+    virtual void        Update                  (Ptr);
+    virtual void        Paint                   (Ptr);
+    virtual void        Activate                (void);
+    void                SortObjectsByName       (long);
+    virtual bool        ConfirmClose            (void);
+//virtual bool      _ProcessOSEvent         (Ptr);
+
+private:
+
+    void                BuildListOfObjects      (long);
+    void                UpdateButtonsAndInfo    (void);
+    void                OpenObjectWindow        (void);
+    void                KillObject              (void);
+    void                OpenObject              (void);
+    void                NewObject               (void);
+
+    long                lastKillID;
+    bool                firstTime;
+
+};
+
+extern  _String     objectInspectorTitle;
+#endif
+
+//EOF
diff --git a/src/gui/include/HYSharedMain.h b/src/gui/include/HYSharedMain.h
new file mode 100644
index 0000000..87ed869
--- /dev/null
+++ b/src/gui/include/HYSharedMain.h
@@ -0,0 +1,211 @@
+/*
+
+
+
+HyPhy - Hypothesis Testing Using Phylogenies.
+
+
+
+This file defined shared function used by 'mains' in the GUI
+
+
+
+Written by SL Kosakovsky Pond
+
+June 11, 2007
+
+
+
+Copyright (C) 1997-2007
+
+Primary Development:
+
+  Sergei L Kosakovsky Pond (sergeilkp at mac.com)
+
+Significant contributions from:
+
+  Spencer V Muse (muse at stat.ncsu.edu)
+
+  Simon DW Frost (sdfrost at ucsd.edu)
+
+  Art FY Poon    (apoon at biomail.ucsd.edu)
+
+
+
+This program is free software; you can redistribute it and/or
+
+modify it under the terms of the GNU General Public License
+
+as published by the Free Software Foundation; either version 2
+
+of the License, or (at your option) any later version.
+
+
+
+This program is distributed in the hope that it will be useful,
+
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+
+GNU General Public License for more details.
+
+
+
+You should have received a copy of the GNU General Public License
+
+along with this program; if not, write to the Free Software
+
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+
+
+
+*/
+
+
+
+#ifndef _HY_SHARED_MAINS_
+#define _HY_SHARED_MAINS_
+
+
+
+#include    "likefunc.h"
+#include    "preferences.h"
+#include    <time.h>
+
+
+
+void        PrepareToExecuteBatchFile    (void);
+
+// set up menus and such prior to executing a batch file
+
+bool        ExecuteBatchFile             (void);
+
+// execute the file with the path name stored in argFileName
+
+void        DoneWithExecutionOfBatchFile (bool = true);
+
+// set up menus and such following the execution of a batch file
+
+
+
+void        updateTimerF                 (_String&, time_t);
+
+// converts a long seconds field into hrs:mins:secs format
+
+
+
+bool        OpenBatchFile                (bool = true, _String* = nil);
+
+// propmt for a file (if flag = true), read it and set paths
+
+
+
+void        ReadInTemplateFiles          (void);
+
+// scan and read in TemplateBatchFiles and result processors
+
+
+
+long        SelectATemplate              (void);
+
+// choose a standard analysis to run
+
+
+
+void        RunStandardAnalyses          (void);
+
+// Choose and run a standard analysis
+
+
+
+_String     MatrixExpCounter             (void);
+
+// run a very simple benchmark (shown in the About Box)
+
+
+
+void        SpoolFile                    (void);
+
+// display a text file (path in argFileName) in the console window
+
+
+
+void        RunTemplate                  (long);
+
+
+
+void        ExecuteAPostProcessor        (_String);
+
+
+
+// execute a post-processing module
+
+
+
+void        ReportAnalysisAsFinished     (_String, bool = false);
+
+// reflect the fact that an analysis has finished
+
+// if appropriate for the platform
+
+
+
+/* GLOBALS */
+
+
+
+extern      _String*                     
+                        argFileName,
+                        errorFileName,
+                        messageFileName,
+                        menuSeparator;
+
+
+
+extern      bool                         isSuspended,
+                                         hasTemplates,
+                                         highLevelQuit,
+                                         isRerunAvailable,
+                                         updateTimer,
+
+            addToRecent,
+
+            echoPaused,
+
+            calculatorMode;
+
+
+
+extern      _ExecutionList               ex;
+
+
+
+extern      _SimpleList                  windowPtrs,
+
+            windowObjects,
+
+            treeIDReferences,
+
+            windowObjectRefs;
+
+
+
+extern      _List                        availableTemplateFiles,
+
+            availablePostProcessors;
+
+
+
+#ifdef      __WINDOZE__
+
+#define          UPDATE_TIMER         WM_USER + 4
+
+#endif
+
+#endif
+
+
+
+//EOF
+
diff --git a/src/gui/include/HYTableWindow.h b/src/gui/include/HYTableWindow.h
new file mode 100644
index 0000000..596acf0
--- /dev/null
+++ b/src/gui/include/HYTableWindow.h
@@ -0,0 +1,100 @@
+/*
+    A general composite window object
+
+    Sergei L. Kosakovsky Pond, May 2000.
+*/
+
+#ifndef _HYTWINDOW_
+#define _HYTWINDOW_
+//#pragma once
+#include "HYComponent.h"
+#include "HYWindow.h"
+
+#define  HY_WINDOW_STATUS_BAR_LIGHT_LEFT 64
+
+//__________________________________________________________________
+
+class _HYTWindow: public _HYWindow, public _HYPlatformTWindow
+{
+
+public:
+
+    _HYTWindow(_String, char list = 1, bool dlog = false, Ptr sheetParent = nil);
+
+    virtual ~_HYTWindow() {};
+
+    virtual bool         ProcessEvent (_HYEvent*);
+
+    virtual void         SetTableDimensions     (int, int);
+    virtual void         Activate               (void);
+    int          Rows                   (void) {
+        return rows;
+    }
+    int          Columns                (void) {
+        return columns;
+    }
+    virtual void         SetCell                (int,int,_HYGuiObject*);
+    virtual void         AddObject              (_HYGuiObject*, bool = true,long = -1, long = -1);
+    virtual void         AddKeyboardChainObject (_HYGuiObject*);
+    virtual void         Paint                  (Ptr);
+    virtual void         Update                 (Ptr);
+    virtual void         SetWindowRectangle     (int,int,int,int,bool=true);
+    virtual _HYRect      MinMaxWindowDimensions (void);
+    virtual _HYGuiObject*GetCellObject          (int,int);
+    virtual _HYGuiObject*GetObject              (int);
+    virtual int          FindClickedCell        (int,int);
+    virtual void         UpdateComponentInfo    (void);
+    virtual void         SetStatusBar           (_String&);
+    virtual void         DoMouseWheel           (long, long);
+
+    virtual void         _Zoom                  (bool);
+    virtual void         _SetStatusBar          (_String&);
+    virtual long         MatchComponentID       (_String&);
+    virtual void         HandleCopyPaste        (bool);
+    virtual void         _SetCopyString         (_String*);
+    virtual _String*     _GetPasteString        (void);
+
+    virtual long         _Grow                  (Ptr);
+    virtual void         _Paint                 (Ptr);
+    virtual void         _PaintStatusBar        (Ptr = nil,bool=false);
+    virtual void         _Update (Ptr);
+
+    virtual void         _Activate              (void);
+    virtual void         _Deactivate            (void);
+
+    virtual void         _Activate2             (void);
+    virtual void         _Deactivate2           (void);
+
+    virtual void         _HandleIdleEvent       (void)
+    {}
+
+
+    virtual bool         _ProcessOSEvent        (Ptr);
+    virtual bool         _ProcessMenuSelection  (long);
+    void         RecomputeCellRects     (void);
+
+
+    _List       components;
+    _SimpleList cells,
+                componentT,
+                componentL,
+                componentB,
+                componentR,
+                keyboardFocusChain;
+
+    int         rows,
+                columns,
+                keyboardFocus,
+                lastMouseComponent;
+
+    _HYRect     dim;
+
+    _String     statusBar;
+
+};
+
+//__________________________________________________________________
+
+#endif
+
+//EOF
diff --git a/src/gui/include/HYUtils.h b/src/gui/include/HYUtils.h
new file mode 100644
index 0000000..5d805a4
--- /dev/null
+++ b/src/gui/include/HYUtils.h
@@ -0,0 +1,205 @@
+/*
+
+    Handy OS utils
+
+
+
+    Sergei L. Kosakovsky Pond, June 2000-November 2004.
+
+*/
+
+
+
+#ifndef _HYOSUTILS_
+
+#define _HYOSUTILS_
+
+//#pragma once
+
+#include "hy_strings.h"
+
+#include "HYBaseGUI.h"
+
+#include "calcnode.h"
+
+
+Ptr     ProcureIconResource     (long);
+
+long    GetVisibleStringWidth   (_String&, _HYFont&);
+
+long    GetVisibleStringWidth   (_String&);
+
+long    GetMaxCharWidth         (_HYFont&);
+
+_HYRect GetScreenDimensions     (void);
+
+void    CenterWindow            (_HYGuiObject*);
+
+void    DelayNMs                (long);
+
+void    PositionWindow          (_HYGuiObject*,_String*);
+
+void    ToggleAnalysisMenu      (bool);
+
+long    SaveFileWithPopUp       (_String&, _String&, _String&, _String&, _List&);
+
+bool    OpenTreeFile            (void);
+
+bool    OpenTextFile            (void);
+
+bool    OpenTable               (void);
+
+bool    OpenDataFile            (_String* defLoc = nil);
+
+bool    OpenModelFile           (_String* defLoc = nil);
+
+bool    ExecuteBatchFile        (void);
+
+bool    PopUpFileDialog         (_String, _String *defLoc = nil);
+
+void    NewChartWindow          (void);
+
+void    NewModel                (_String*);
+
+bool    OpenTable               (void);
+
+bool    OpenModelFile           (_String*);
+
+void    ShowObjectInspector     (void);
+
+void    PlaceStringInClipboard  (_String&,Ptr);
+
+
+
+
+
+#ifdef __MAC__
+
+#include <Menus.h>
+
+_String MacSimpleFileSave       (void);
+_String MacSimpleFileOpen       (void);
+_String ChooseAFolder (_String& promptString);
+
+
+void    StringToStr255      (_String&, Str255&);
+
+void    Str255ToStr         (_String&, Str255&);
+
+void    DrawMenuPlaceHolder (Rect&, _String&, bool enabled = true);
+
+void    DrawEmbossedBox     (Rect&);
+
+void    DrawInfoBox         (Rect&, _String&, _String&);
+
+void    SetWindowFont       (short,short,Style, bool);
+
+void    TreeDependencies    (_SimpleList&, long);
+
+void    DSDependencies      (_SimpleList&, long);
+
+void    ModelDependencies   (_SimpleList&, long);
+
+void    ListToPopUpMenu     (_List&, MenuHandle);
+
+void    UpdateStatusLine    (Ptr theWindow);
+
+long    HandleListSelection (_List&, _SimpleList&, _SimpleList&, Str63, _SimpleList&, long);
+
+_String NewTreeWindow       (long sourceDF = -1);
+
+void    ConvertMovieFile    (bool);
+
+
+
+#ifdef  __HYPHYXCODE__
+
+_String DoMacToPOSIX        (const _String&);
+
+#endif
+
+#endif
+
+
+
+#ifdef __WINDOZE__
+
+
+
+#include    <Windows.h>
+
+long        SaveFileFunction                (_String&, _String&, _String&, char*, Ptr);
+
+HMENU       ListToPopUpMenu                 (_List&,long base = 0);
+
+char        *ReturnFileDialogSelectionWin   (bool write, _String* initDir = nil);
+
+void        PlaceBitmapInClipboard          (HBITMAP,HWND);
+
+
+
+#endif
+
+
+
+_String     ChooseAFolder                   (_String&);
+
+char        YesNoCancelPrompt               (_String&);
+
+
+
+long        FindWindowByName                (_String&);
+
+_HYGuiObject*
+
+FindWindowByNameAndOpen         (_String&);
+
+_HYGuiObject*
+
+FindWindowByID                  (long);
+
+
+
+_HYColor    SelectAColor                    (_HYColor&,_String&);
+
+
+
+#endif
+
+
+
+void        MoveConsoleWindow               (_HYRect&);
+
+_String     HandlePullDown                  (_List&,long,long,long);
+
+long        HandlePullDownWithFont          (_List&,long,long,long,_String,long);
+
+
+
+char        ScanDirectoryForFileNames       (_String&, _List&, bool);
+
+// directory to scan, list to receive full path names for each file,
+
+// scan recursively or not.
+
+_HYColor    GetDialogBackgroundColor        (void);
+
+
+
+void        StartBarTimer                   (void);
+
+void        StopBarTimer                    (void);
+
+
+
+void        GenerateFontList                (_List&);
+
+
+
+extern      _String                         menuSeparator,
+
+            *argFileName;
+
+
+
+//EOF
diff --git a/src/gui/include/HYWindow.h b/src/gui/include/HYWindow.h
new file mode 100644
index 0000000..37eed1d
--- /dev/null
+++ b/src/gui/include/HYWindow.h
@@ -0,0 +1,119 @@
+/*
+    A general window object - a window/title/size-box/scroll-bars handler.
+
+    Sergei L. Kosakovsky Pond, May 2000.
+*/
+
+#ifndef _HYWINDOW_
+#define _HYWINDOW_
+//#pragma once
+#include "HYPlatformWindow.h"
+#include "HYBaseGUI.h"
+
+#define  HY_WINDOW_SIZE     1
+#define  HY_WINDOW_CLOSE    2
+#define  HY_WINDOW_SCROLL   4
+#define  HY_WINDOW_NOLIST   8
+#define  HY_WINDOW_ZOOM     16
+#define  HY_WINDOW_DLOG     32
+#define  HY_WINDOW_FLUSHED  64
+#define  HY_WINDOW_SHEET    128
+
+#define  HY_WINDOW_KIND_BASE 0
+
+//__________________________________________________________________
+
+class _HYWindow: public _HYGuiObject, public _HYPlatformWindow
+{
+
+private:
+
+    _String     windowTitle;
+
+public:
+
+    _HYWindow(unsigned char,_String,bool,Ptr = nil);
+    // flags, title, visibility
+
+    virtual ~_HYWindow();
+
+//      BaseRef     makeDynamic();
+//      void        Duplicate (BaseRef);
+
+    virtual void        SetTitle            (_String);
+    virtual _String&    GetTitle            (void) {
+        return windowTitle;
+    }
+
+    virtual bool        ProcessEvent        (_HYEvent* e) {
+        delete e;
+        return false;
+    }
+    virtual bool        ProcessGEvent       (_HYEvent* e);
+
+    void        Show                (void);
+    void        Hide                (void);
+    virtual void        Grow                (Ptr);
+    virtual void        SetWindowRectangle  (int,int,int,int,bool=true);
+    virtual bool        Close               (Ptr);
+    virtual void        _Zoom               (bool)
+    {}
+    virtual bool        _ProcessMenuSelection (long);
+    virtual bool        ConfirmClose        (void) {
+        return true;
+    }
+    virtual void        Move                (Ptr);
+    virtual void        SetPosition         (int, int);
+    virtual void        Paint               (Ptr p) {
+        _Paint(p);
+    }
+    virtual void        Update              (Ptr p) {
+        _Update(p);
+    }
+    virtual void        Activate            (void);
+    virtual void        BringToFront        (void) {
+        _BringWindowToFront();
+    }
+    virtual void        Deactivate          (void);
+    void        SelectThisWindow    (void);
+    virtual void        SetContentSize      (int,int);
+    virtual void        SetFont             (_HYFont&);
+
+    virtual _HYRect     GetWindowRect       (void) {
+        return _GetWindowRect();
+    }
+
+    virtual void        VisibleContents     (int&t,int&l,int&b,int&r) {
+        _VisibleContents    (t,l,b,r);
+    }
+
+    virtual bool        IsSaveEnabled       (void) {
+        return false;
+    }
+    virtual bool        IsPrintEnabled      (void) {
+        return false;
+    }
+
+    virtual Ptr         GetOSWindowData (void) {
+        return _GetOSWindowData();
+    }
+    virtual char        WindowKind      (void) {
+        return HY_WINDOW_KIND_BASE;
+    }
+
+    int         top,
+                left,
+                bottom,
+                right,
+                contentHeight,
+                contentWidth;
+};
+
+//__________________________________________________________________
+
+extern  unsigned long GUIObjectGlobalCounter;
+extern  _List    GlobalGUIEventQueue;
+
+#endif
+
+//EOF
diff --git a/src/gui/include/WindowClasses/HYChartWindow.h b/src/gui/include/WindowClasses/HYChartWindow.h
new file mode 100644
index 0000000..1a6aa05
--- /dev/null
+++ b/src/gui/include/WindowClasses/HYChartWindow.h
@@ -0,0 +1,238 @@
+/*
+    Chart Table
+
+    Sergei L. Kosakovsky Pond, December 2001.
+*/
+
+#ifndef _HYCHARTWINDOW_
+#define _HYCHARTWINDOW_
+//#pragma once
+#include "HYTableWindow.h"
+#include "HYTableComponent.h"
+#include "category.h"
+
+#define  HY_CHART_ICON_BASE                         6300
+#define  HY_CHART_WINDOW_MENU_ID                    8115
+#define  HY_CHART_WINDOW_HMENU_ID                   155
+
+#define  HY_CHART_MENU_ROW                          0
+#define  HY_CHART_CHART_ROW                         1
+#define  HY_CHART_HEADER_ROW                        2
+#define  HY_CHART_TABLE_ROW                         3
+
+#define  HY_CHART_TABLE_HEIGHT                      150
+
+#define  HY_CHART_PC_TILTED                         0x01
+#define  HY_CHART_PC_LABEL_TOP                      0x02
+#define  HY_CHART_PC_LABEL_BOTTOM                   0x04
+#define  HY_CHART_PC_TITLE_STRING                   0x08
+
+#define  HY_CHART_COLOR_COUNT                       10
+
+#define  HY_CHART_BC_LOG_X                          0x01
+#define  HY_CHART_BC_LOG_Y                          0x02
+#define  HY_CHART_BC_TITLE_STRING                   0x04
+
+#define  HY_CHART_LEGEND_NONE                       0
+#define  HY_CHART_LEGEND_TOP_LEFT                   1
+#define  HY_CHART_LEGEND_TOP_MID                    2
+#define  HY_CHART_LEGEND_TOP_RIGHT                  3
+#define  HY_CHART_LEGEND_BOT_LEFT                   4
+#define  HY_CHART_LEGEND_BOT_MID                    5
+#define  HY_CHART_LEGEND_BOT_RIGHT                  6
+#define  HY_CHART_LEGEND_MID_LEFT                   7
+#define  HY_CHART_LEGEND_MID_RIGHT                  8
+
+//__________________________________________________________________
+
+class _HYChartWindow: public _HYTWindow
+{
+
+public:
+
+    _HYChartWindow          (_String,_List&,_Matrix&,_HYWindow* pw = nil);
+    virtual             ~_HYChartWindow         ();
+
+    virtual bool        ProcessEvent            (_HYEvent*);
+
+    virtual void        _SetMenuBar             (void);
+    virtual void        _UnsetMenuBar           (void);
+    virtual bool        _ProcessMenuSelection   (long);
+    virtual bool        IsSaveEnabled           (void) {
+        return true;
+    }
+    virtual bool        IsPrintEnabled          (void) {
+        return true;
+    }
+    virtual void        SetChartType            (_String,_String,_String,bool = true);
+    void                SetTable                (_List&,_Matrix&);
+    void                SetLabels               (_String,_String,_String,long,_String, long, long, long, _Parameter = 0., _Parameter = 0.);
+    virtual bool        _ProcessOSEvent         (Ptr);
+    virtual void        SetFont                 (_HYFont&);
+    virtual void        HandleCopyPaste         (bool);
+    void                ExecuteProcessor        (long);
+    long                Get3DScaling            (bool);
+
+    void                SetProjection           (_Parameter, _Parameter, _Parameter);
+    void                SetFonts                (_List*);
+    void                SetColors               (_List*);
+    void                ToggleSuspend           (bool);
+
+    void                DrawChart               (_HYRect* printRect = nil);
+    _SimpleList&        GetColors               (void) {
+        return theColors;
+    }
+    void                _CopyChart              (void);
+    void                SetRowHeaders           (_List&);
+    void                RenameChartWindow       (void);
+    bool                SetUserBounds           (_Parameter = 0.0, _Parameter = 0.0, bool = false);
+protected:
+    virtual void        DoSave                  (long, _String* distrib = nil);
+private:
+
+    void                DoPrint                 (long);
+    void                DoChangeFont            (long);
+    void                HandleCellEditEvent     (long);
+    void                HandleChartOptions      (void);
+    bool                NeedToRedrawChart       (long);
+    void                SetYPullDown            (void);
+    void                GenerateBarChart        (_SimpleList&, _HYRect plotRect, char options = 0);
+    void                Generate3DChart         (_SimpleList&, _HYRect plotRect, char options = 0);
+//  void                GenerateStackedBarChart (_SimpleList&, _HYRect plotRect);
+    void                GeneratePieChart        (long,_HYRect);
+    void                SetDataMatrix           (_Matrix&);
+    void                SetColumnHeaders        (_List&);
+    void                SetPullDowns            (_List&);
+    void                HandleChartTypeChange   (long);
+    void                _PrintChart             (void);
+    _Matrix*            ComputeProjectionMatrix (void);
+    void                DrawAParallelogram      (_Matrix&,char,_Parameter,_HYRect&);
+    void                DrawAPlane              (_Matrix&,char,_Parameter,_HYRect&);
+    void                DrawALine               (_Matrix&,char,_Parameter,_HYRect&, long, _String* = nil, long = 0, long = 0);
+    void                PaintAFace              (_Matrix&,long,long,long,long,_HYRect&,_Parameter = 1.0, char = 0);
+    _Matrix*            ComputeProjection       (_Matrix&);
+    void                ComputeProjectionSettings
+    (void);
+    void                DrawLegend              (_HYRect&,long,bool=false);
+
+
+    _HYWindow*          parentWindow;
+
+    _HYFont             labelFont1,
+                        labelFont2,
+                        labelFont3,
+                        headerFont;
+
+    _HYColor            backColor1,
+                        backColor2;
+
+    _SimpleList         ySeries,
+                        theColors;
+
+    _Parameter          projectionSettings[7],
+                        oR,
+                        xyAngle,
+                        zAngle,
+                        xShift,
+                        yShift,
+                        xScale,
+                        yScale,
+                        userMin,
+                        userMax;
+
+    _String             xLabel,
+                        yLabel,
+                        zLabel;
+
+    _Formula            overlayPlot;
+
+    char                showLegend,
+                        whichFont;
+    bool                suspendDraw;
+
+    long                xAxis3DScale,
+                        yAxis3DScale,
+                        surfaceDivs;
+
+    _Matrix*            projectionMatrix;
+
+};
+
+//__________________________________________________________________
+
+class _HYDistributionChartWindow: public _HYChartWindow
+{
+
+public:
+    _HYDistributionChartWindow          (_String,_List&,_Matrix&,_List&_,_HYWindow* pw = nil);
+    virtual             ~_HYDistributionChartWindow         (void) {};
+
+    virtual bool        ProcessEvent            (_HYEvent*);
+
+    virtual void        _SetMenuBar             (void);
+    virtual void        _UnsetMenuBar           (void);
+    virtual bool        _ProcessMenuSelection   (long);
+    virtual void        AddVariable             (_String* = nil);
+    virtual void        SetAtoms                (_Matrix&,_List&);
+
+private:
+
+    _List*              BuildAtoms              (_Matrix&,_List&);
+    virtual void        DoSave                  (long, _String* distrib = nil);
+    virtual void        RemoveVariable          (void);
+    virtual void        HandleCatPostProcessor  (long);
+    void                ShowMarginals           (void);
+
+    virtual void        ProduceDistribution     (_SimpleList&, _SimpleList&, _List&, _Formula&, long, _Parameter);
+    virtual _Matrix*    ComputeConditionals     (_SimpleList&, _SimpleList*);
+    virtual _Matrix*    ComputeConditionals     (long);
+    virtual _Matrix*    MakeCDF                 (long);
+
+    _List               atoms,
+                        atomNames,
+
+                        derived,
+                        derivedDependencies,
+                        derivedNames,
+                        derivedRemaps;
+
+    _String             savedExpression;
+
+    _Matrix             marginals;
+
+    _SimpleList         atomSizes,
+                        atomMultiples;
+
+};
+
+//__________________________________________________________________
+
+class       _HYChartOptionDialog: public _HYTWindow
+{
+
+public:
+
+    _HYChartOptionDialog     (_List*,long*,bool*, _SimpleList*,_HYChartWindow*);
+    virtual         ~_HYChartOptionDialog    (void) {}
+
+    virtual bool    ProcessEvent             (_HYEvent*);
+    void    DrawColorCanvas          (void);
+
+    _List*          args;
+    long *          msel;
+    bool *          res;
+    _HYChartWindow* parWin;
+    _SimpleList*    colorsPicked;
+
+};
+
+bool                    ReadDataFromFile        (_String,char,_Matrix&, _List&);
+
+extern      _List       chartProcessors,
+            distribProcessors;
+
+extern      void        ReadChartProcessors     (bool = false);
+
+#endif
+
+//EOF
diff --git a/src/gui/include/WindowClasses/HYConsoleWindow.h b/src/gui/include/WindowClasses/HYConsoleWindow.h
new file mode 100644
index 0000000..d2b4bde
--- /dev/null
+++ b/src/gui/include/WindowClasses/HYConsoleWindow.h
@@ -0,0 +1,102 @@
+/*
+    Console Window
+
+    Sergei L. Kosakovsky Pond, December 2003.
+*/
+
+#ifndef _HYCONSOLEWINDOW_
+#define _HYCONSOLEWINDOW_
+//#pragma once
+#include "HYTableWindow.h"
+
+#define  HY_CONSOLE_CAN_COPY    0x01
+#define  HY_CONSOLE_CAN_PASTE   0x02
+#define  HY_CONSOLE_CAN_UNDO    0x04
+#define  HY_CONSOLE_CAN_REDO    0x08
+
+#define  HY_SL_FILE             0x01
+#define  HY_SL_TASK             0x02
+#define  HY_SL_TIMER            0x04
+#define  HY_SL_PERCENT          0x08
+#define  HY_SL_SUSPEND          0x10
+#define  HY_SL_RESUME           0x20
+#define  HY_SL_FORCE            0x40
+#define  HY_SL_DONE             0x80
+
+//__________________________________________________________________
+
+class _HYConsoleWindow: public _HYTWindow
+{
+
+public:
+
+    _HYConsoleWindow        (_String);
+    virtual             ~_HYConsoleWindow       ();
+
+    virtual bool        ProcessEvent            (_HYEvent*);
+    virtual bool        ConfirmClose            (void);
+
+    virtual void        _SetMenuBar             (void);
+    virtual void        _UnsetMenuBar           (void);
+    virtual bool        _ProcessMenuSelection   (long);
+    virtual bool        _ProcessOSEvent         (Ptr);
+    virtual void         _PaintStatusBar        (Ptr = nil, bool = false);
+    void                _UpdateEditMenu         (void);
+
+    virtual bool        IsSaveEnabled           (void) {
+        return true;
+    }
+    virtual bool        IsPrintEnabled          (void) {
+        return true;
+    }
+    void                PrintString             (_String&);
+    _String*            ReadString              (void);
+    void                SetFont                 (_HYFont);
+    void                DoFind                  (bool);
+
+    virtual void        DoSave                  (void);
+
+
+    void                _DoFind                 (_String&);
+    void                _DoSave                 (void);
+    void                _DoPrint                (void);
+    void                _DoPageSetup            (void);
+
+    void                DoEcho                  (void);
+    virtual bool        _Close                  (Ptr);
+
+    FILE*               echoFileRef;
+    char                echoStatus;
+
+    _List               recentInputs,
+                        recentSearches;
+
+    _String             fileName,
+                        action,
+                        timer,
+                        searchTerm;
+
+    long                percentDone,
+                        inputLocation;
+
+    int                 editOptions;
+
+    char                inputStatus;
+
+};
+
+extern  _String         cState,
+        cTask,
+        cInput;
+
+extern  _HYConsoleWindow* hyphyConsoleWindow;
+
+void    SetStatusLine               (_String);
+void    SetStatusLine               (_String, _String, _String, long l);
+void    SetStatusLine               (_String, _String, _String);
+void    SetStatusLine               (_String, _String, _String, long, char);
+void    SetStatusBarValue           (long, _Parameter, _Parameter);
+void    SaveConsole                 (void);
+#endif
+
+//EOF
diff --git a/src/gui/include/WindowClasses/HYDBWindow.h b/src/gui/include/WindowClasses/HYDBWindow.h
new file mode 100644
index 0000000..3eb245d
--- /dev/null
+++ b/src/gui/include/WindowClasses/HYDBWindow.h
@@ -0,0 +1,77 @@
+/*
+    SQLite DB Viewer/Editor Widget
+
+    Sergei L. Kosakovsky Pond, October 2005.
+*/
+
+#ifndef _HYDBWINDOW_
+#define _HYDBWINDOW_
+//#pragma once
+
+#include "HYTableWindow.h"
+#include "HYTableComponent.h"
+#include "sqlite3.h"
+
+
+//__________________________________________________________________
+
+class _HYDBWindow: public _HYTWindow
+{
+
+public:
+
+    _HYDBWindow             (_String,_String* = nil);
+    virtual             ~_HYDBWindow            (void);
+
+    virtual bool        ProcessEvent            (_HYEvent*);
+
+    /*virtual void      _SetMenuBar             (void);
+    virtual void        _UnsetMenuBar           (void);
+    virtual bool        _ProcessMenuSelection   (long);*/
+
+    virtual bool        IsSaveEnabled           (void) {
+        return false;
+    }
+    virtual bool        IsPrintEnabled          (void) {
+        return true;
+    }
+
+    void                SetDB                   (_String);
+    void                ScanTables              (bool = false);
+    void                CloseCurrentDB          (void);
+    void                UpdateStatusBar         (void);
+    _List*              ExecuteSQLBlurb         (_String&);
+    bool                LoadTable               (long,_String* = nil);
+    void                EditLongEntry           (void);
+    _List*              RetrieveRecord          (long, _String&, bool, _String* = nil);
+    void                RunSQLQuery             (void);
+    virtual bool        _ProcessMenuSelection   (long);
+
+    long                dbID,
+                        currentTable,
+                        lengthLimit,
+                        recordLimit;
+
+    _HYColor            backColor1,
+                        backColor2;
+
+    _HYFont             labelFont1,
+                        labelFont2,
+                        labelFont3,
+                        headerFont;
+
+    _List               tableList,
+                        sqlHistory;
+};
+
+//__________________________________________________________________
+
+void        ReadSQLPlugins                      (void);
+bool        ExecuteSomeCodeAndCheck             (_String&);
+int         _HYDBWCallBack                      (void*,int, char**, char**);
+int         _HYDBWTablePopulatorCallBack        (void*,int, char**, char**);
+int         _HYDBWTableCellCounter              (void*,int, char**, char**);
+
+#endif
+
+//EOF
diff --git a/src/gui/include/WindowClasses/HYDataPanel.h b/src/gui/include/WindowClasses/HYDataPanel.h
new file mode 100644
index 0000000..40346f2
--- /dev/null
+++ b/src/gui/include/WindowClasses/HYDataPanel.h
@@ -0,0 +1,629 @@
+/*
+
+    Data panel data structures
+
+
+
+    Sergei L. Kosakovsky Pond, August 2000.
+
+*/
+
+
+
+#ifndef _HYDATAPANEL_
+
+#define _HYDATAPANEL_
+
+//#pragma once
+
+#include "HYTableWindow.h"
+
+#include "HYSequencePanel.h"
+
+#include "HYCanvas.h"
+
+#include "HYPullDown.h"
+
+#include "site.h"
+
+#include "preferences.h"
+
+
+
+#define  HY_DATAPANEL_NUCDATA       1
+
+#define  HY_DATAPANEL_PROTDATA      2
+
+#define  HY_DATAPANEL_BINARYDATA    4
+
+#define  HY_DATAPANEL_MENU_ID       8001
+
+#define  HY_DATAPANEL_HMENU_ID      210
+
+#define  HY_DATAPANEL_ICON_ID       6000
+
+#define  HY_DATAPANEL_DEF_COLORS    10
+
+#define  HY_DATAPANEL_THERM_HSPACE  8
+
+#define  HY_DATAPANEL_THERM_VSPACE  4
+
+#define  HY_DATAPANEL_THERMWIDTH    19
+
+#define  HY_DATAPANEL_CONSENSUS     1
+
+#define  HY_DATAPANEL_RATECLASS     2
+
+#define  HY_DATAPANEL_TRANSLATION   4
+
+#define  HY_DATAPANEL_REFERENCE     8
+
+#define  HY_DATAPANEL_CODEMASK      0xFFFF0000
+
+#define  HY_DATAPANEL_OFFSETMASK    0x03
+
+#define  HY_DATAPANEL_REVMASK       0x04
+
+#define  HY_DATAPANEL_MODELID       0x0000FFFF
+
+#define  HY_DATAPANEL_OPTIONS       0x000F0000
+
+#define  HY_DATAPANEL_FREQS         0x00F00000
+
+#define  HY_DATAPANEL_RATES         0xFF000000
+
+#define  HY_DATAPANEL_MODEL_GLOBAL  0x01
+
+#define  HY_DATAPANEL_MODEL_GLOBALG 0x02
+
+#define  HY_DATAPANEL_MODEL_EFVEST  0x04
+
+#define  HY_DATAPANEL_MODEL_MODELS  0x08
+
+#define  HY_DATAPANEL_MODEL_NOLOCAL 0x10
+
+#define  HY_DATAPANEL_MAX_CLASSES   32
+
+
+
+#define  HY_WINDOW_KIND_DATAPANEL   3
+
+
+
+
+
+//__________________________________________________________________
+
+
+
+class _HYDataPanel: public _HYTWindow
+
+{
+
+
+
+public:
+
+
+
+    _HYDataPanel(_String&,_String&);
+
+    // data set name, tree string (or tree ident)
+
+
+
+    virtual ~_HYDataPanel();
+
+
+
+    virtual bool        ProcessEvent            (_HYEvent*);
+
+    virtual bool        ProcessGEvent           (_HYEvent*);
+
+    bool        BuildDataPanel          (void);
+
+    void        BuildThermometer        (_HYRect* = nil);
+
+    void        BuildMarksPane          (void);
+
+    void        SetDataSetReference     (_String&, _SimpleList* speciesFilter = nil);
+
+    _HYRect     ComputeNavRect          (void);
+
+    void        SetNavRectCenter        (long,long);
+
+    virtual void        Activate                (void);
+
+    virtual void        Update                  (Ptr);
+
+    virtual void        Paint                   (Ptr);
+
+    virtual bool        ConfirmClose            (void);
+
+    virtual bool        _ProcessMenuSelection   (long);
+
+    virtual void        _SetMenuBar             (void);
+
+    virtual void        _UnsetMenuBar           (void);
+
+    virtual void        SetFilePath             (_String& s) {
+
+        filePath=s;
+
+    }
+
+    virtual void        SetSavePath             (_String& s) {
+
+        savePath=s;
+
+    }
+
+    virtual void        CreatePartition         (_SimpleList&,char unitLength = 1, bool jump2New = false, _String* prefix = nil);
+
+    virtual void        KillPartition           (long);
+
+    virtual _String     SavePartition           (long, _String* = nil, _DataSet* = nil);
+
+    virtual void        SplitPartition          (long,long);
+
+    virtual void        JoinPartitions          (long,long);
+
+    virtual void        SubtractPartitions      (long,long);
+
+    virtual void        CombPartition           (long);
+
+    virtual void        InterleavePartitions    (long,long,bool,bool);
+
+    virtual void        JoinSpeciesDisplay      (void);
+
+    virtual void        OmitSelectedSpecies     (void);
+
+    virtual void        RestoreOmittedSequence  (long);
+
+    void        ProcessContextualPopUpMain
+
+    (long,long);
+
+    void        ProcessContextualPopUpAux
+
+    (long,long);
+
+
+
+    virtual char        WindowKind      (void)  {
+
+        return HY_WINDOW_KIND_DATAPANEL;
+
+    }
+
+    bool        EditPartitionProperties (long, char changeType = 0);
+
+    void        NavBarDblClick          (long);
+
+    bool        SaveDataPanel           (bool saveAs = false, _String* = nil, _String* = nil, bool = true, _DataSet* = nil, bool = false);
+
+    void        InputPartitionString    (void);
+
+    void        RestorePartInfo         (_String*);
+
+    void        RestorePanelSettings    (_String*);
+
+    void        BuildLikelihoodFunction (_String* lName = nil, _SimpleList* = nil, long = -1);
+
+    long        SpawnLikelihoodFunction (_DataSet*,_String*,_List&, _SimpleList&, _SimpleList* = nil, _SimpleList* = nil);
+
+    long        SpawnLikelihoodFunctionNP
+
+    (_List&, bool = false);
+
+    void        RestoreSavedLFs         (void);
+
+    void        ComputeLikelihoodFunction (long);
+
+    void        SimulateDataSet         (long, bool=false);
+
+    void        OptimizeLikelihoodFunction
+
+    (void);
+
+
+
+    bool        IsSelectionNonEmpty     (void);
+
+
+
+    virtual bool        _ProcessOSEvent         (Ptr);
+
+    void        _PrintData              (void);
+
+
+
+    long        GetLFID                 (void) {
+
+        return lfID;
+
+    }
+
+    long        GetDSID                 (void) {
+
+        return dataSetID;
+
+    }
+
+    _String*        LFSnapshot              (void);
+
+    bool        LFRestore               (long);
+
+
+
+    void        SetHypothesis           (_String*,bool);
+
+    long        GetHypothesis           (bool);
+
+    long        FindLFState             (_String);
+
+    _String     GetLFStateName          (long);
+
+    _String*        GetLFStateString        (long);
+
+
+
+    virtual bool        IsSaveEnabled           (void) {
+
+        return true;
+
+    }
+
+    virtual bool        IsPrintEnabled          (void) {
+
+        return true;
+
+    }
+
+    virtual void        SetFont                 (_HYFont&);
+
+    void        HandleFontChange        (void);
+
+
+
+    void        SetLockState            (bool r) {
+
+        cantDeleteLF = r;
+
+    }
+
+    _DataSet*   GenerateOrderedDataSet  (void);
+
+    void        RefreshCategoryVars     (void);
+
+    void        FindFunction            (void);
+
+    bool        DependOnTree              (long tid) {
+
+        return treeVarReferences.Find (tid) >=0;
+
+    }
+
+
+
+
+
+
+
+private:
+
+    void        GetMutantCount            (long,_SimpleList&,_String* = nil);
+
+    void        ShowMutantCount           (long);
+
+    void        CleanupSingletons         (long);
+
+    void        InferTopologies           (bool = false);
+
+    bool        GenerateGoodPartitions    (_SimpleList&);
+
+    bool        CanSplit                  (void);
+
+    bool        CanJoin                   (long,long);
+
+    bool        CanJoinSpecies            (_SimpleList&);
+
+    bool        CanSubtract               (long,long);
+
+    bool        CanComb                   (long);
+
+    bool        CanInterleave             (long, long);
+
+    void        SelectPartition           (void);
+
+    void        InvertSelection           (void);
+
+    void        PartitionPropsMenu        (void);
+
+    void        _UpdateSelectionChoices   (bool);
+
+    void        _UpdatePartitionOperations(_SimpleList*);
+
+    virtual void        _OmitSelectedSpecies      (_SimpleList&);
+
+    virtual void        _RestoreOmittedSequence   (long);
+
+    void        _CopySelectionToClipboard (void);
+
+    void        UpdatePartitionOperations (void);
+
+    void        UpdateSelDepPartitionOperations
+
+    (void);
+
+    void        _PaintThermRect           (bool update = false);
+
+    void        _UpdateLFMenu             (void);
+
+    void        _VerifyInferMenu          (void);
+
+    void        BuildDataPartitions       (void);
+
+    void        AddPartition              (_DataSetFilter*);
+
+    long        FindUnusedColor           (void);
+
+    void        MarkSites                 (_SimpleList&,long);
+
+    void        UnmarkSites               (_SimpleList&,long);
+
+    void        CorrectSites              (long);
+
+    void        UpdateDataWrapper         (void);
+
+    void        GenerateStatusLine        (void);
+
+    void        GenerateTreeList          (_List&);
+
+    void        GenerateModelList         (_List&, long);
+
+    _String     TreeTopologyChange        (long, _String*);
+
+    bool        DataTypeChange            (long, long);
+
+    void        ModelChange               (_String*, long, long);
+
+    void        ModelOptionChange         (_String*, long);
+
+    void        ModelFreqChange           (_String*, long);
+
+    void        ModelRateClassChange      (long,long);
+
+    void        ShowConstantSites         (bool, bool relaxed = false, bool sequences = false);
+
+    void        ShowDuplicateSequences    (bool);
+
+    void        ShowCodonUsage            (long);
+
+    void        ShowCharacterUsage        (long, bool);
+
+    void        ShowAssociation           (long, char);
+
+    bool        AdjustStatusLine          (long, bool force = false, long preselected = -1);
+
+    void        ActivateInfoLines         (bool);
+
+    void        AdjustInfoNames           (void);
+
+    void        ExecuteProcessor          (long);
+
+    void        UpdateConsensusSequence   (_String&, bool apply = false);
+
+    void        UpdateTranslationString   (_String&, long,bool apply = false, long genCode = -1);
+
+    bool        GetTranslationString      (_String&, long, char = 0,long = -1, _List * = nil);
+
+    static void LongToPartData            (long,char&,bool&,long&);
+
+    static long PartDataToLong            (char,bool,long);
+
+    static void LongToModelData           (long,int&,int&,int&,int&);
+
+    static long ModelDataToLong           (int,int,int,int);
+
+    static void CodeTo3AA                 (_String&, long, _SimpleList*,_Parameter * = nil);
+
+    static char CodeToAA                  (long, _SimpleList*,_Parameter * = nil);
+
+    void        _PaintLFStatus            (void);
+
+    bool        PurgeLF                   (bool all = true);
+
+    bool        PurgeLFFilter             (long);
+
+    void        DisplayParameterTable     (void);
+
+    void        OpenGeneralBSWindow       (void);
+
+    _String*    GetExclusionsFromCode     (long);
+
+    _String*    GetExclusionsFromList     (_SimpleList*);
+
+    _String*    GetExclusionsFromExcList  (_SimpleList*);
+
+    _String*    GetMatrixFromCode         (long);
+
+    void        IndexToCodon              (long,char*);
+
+    void        SetCodonExclusions        (_DataSetFilter*, long, long);
+
+    long        FindGeneticCodeByExcl     (_String*);
+
+    void        DFExclusionsToString      (_DataSetFilter*, _String&);
+
+    long        AddPartitionRow           (_String*,long);
+
+    void        DeletePartitionRow        (long);
+
+    void        ConstructDataTypeOptions  (_List&);
+
+    void        RefreshPartRow            (_List&, long, bool = false, bool = true);
+
+    void        GenerateModelFOptionList  (_List&, long);
+
+    void        GenerateModelPOptionList  (_List&, long);
+
+    void        HandleSearchAndReplace    (void);
+
+
+
+    long        dataSetID,
+
+                referenceSequence,
+
+                translatedSequence,
+
+                genCodeID,
+
+                lfID;
+
+
+
+    _SimpleList dataPartitions,
+
+                partData,
+
+                siteAssignments,
+
+                treeVarReferences,
+
+                modelReferences,
+
+                partitionColors,
+
+                overlaps,
+
+                omittedSeqs,
+
+                inferCacheDF;
+
+
+
+    _List       statusLines,
+
+                statusData,
+
+                savedLFNames,
+
+                inferCache,
+
+                savedLFStates;
+
+
+
+    _String*    dataSetName,
+
+                filePath,
+
+                savePath,
+
+                topConstr;
+
+
+
+    _HYRect     navRect,
+
+                thermRect;
+
+
+
+    _DataSetFilter*
+
+    dataWrapper;
+
+
+
+    char        dataType,
+
+                addedLines;
+
+
+
+    bool        tainted,
+
+                cantDeleteLF;
+
+    friend      class   _HYParameterTable;
+
+    friend      class   _HYGeneralBootstrapWindow;
+
+};
+
+
+
+
+
+void        ReadGeneticCodes       (void);
+
+void        NewGeneticCodeTable    (long);
+
+void        ReadModelTemplates     (void);
+
+void        KillLFRecordFull       (long);
+
+long        DimensionOfGenCode     (long);
+
+
+
+_List*      FindModelTemplate      (_String*);
+
+long        FindModelTemplate      (_String*,long);
+
+_List*      FindModelTemplate      (long, long);
+
+void        SetModelMenus          (int,_HYPullDown*, _HYPullDown*);
+
+bool        RequestDataSetReplace  (long);
+
+bool        RequestLFDeleteOrAlter (long);
+
+void        ReadDataPanelProcessors(void);
+
+
+
+extern      _List   geneticCodes,
+
+            dataPanelProcessors;
+
+
+
+
+
+/* each item in the list is also a list of 3 items:
+
+   table     name
+
+   table     description
+
+   table     definition (as a simple list of length 64)
+
+*/
+
+
+
+extern      _List   modelTemplates;
+
+
+
+/* each item in the list is also a list of 3 items:
+
+    model   name
+
+    model   options (SimpleList: model flags, model dimension)
+
+    model   location - path to model file
+
+*/
+
+
+
+#endif
+
+
+
+//EOF
diff --git a/src/gui/include/WindowClasses/HYGWindow.h b/src/gui/include/WindowClasses/HYGWindow.h
new file mode 100644
index 0000000..bdbef8c
--- /dev/null
+++ b/src/gui/include/WindowClasses/HYGWindow.h
@@ -0,0 +1,87 @@
+/*
+    A window with a picture.
+
+    Sergei L. Kosakovsky Pond, May 2000.
+
+    Revised: August   2001
+             November 2001 - added "picture" window.
+*/
+
+#ifndef _HYGWINDOW_
+#define _HYGWINDOW_
+//#pragma once
+#include "HYWindow.h"
+#include "HYGraphicPane.h"
+
+//__________________________________________________________________
+
+class _HYGWindow: public _HYWindow, public _HYGraphicPane
+{
+
+public:
+
+    _HYGWindow(_String,int,int,int,bool,bool scale = false);
+    // title, pic h, pic w, pic d, visible
+
+    virtual ~_HYGWindow() {};
+
+    virtual bool        ProcessEvent            (_HYEvent* e);
+    virtual bool        _ProcessMenuSelection   (long);
+
+    virtual void        _SetMenuBar             (void);
+    virtual void        _UnsetMenuBar           (void);
+
+// overload  platform specific _paint and _update
+
+    virtual void        _Paint(Ptr);
+    virtual void        _Update(Ptr);
+    void        _SaveGWindow (void);
+    void        _PrintGWindow(void);
+
+    virtual bool        IsSaveEnabled     (void) {
+        return true;
+    }
+    virtual bool        IsPrintEnabled    (void) {
+        return true;
+    }
+
+};
+
+//__________________________________________________________________
+
+class _HYPWindow: public _HYGWindow, public _HYPlatformPWindow
+{
+
+public:
+
+    _HYPWindow(_String,int,int,int,bool);
+    // title, pic h, pic w, pic d, visible
+
+    virtual ~_HYPWindow() {};
+
+    virtual void        SetPaneSize             (int,int,int);
+    virtual void        StartDraw               (void);
+    virtual void        EndDraw                 (void);
+    virtual void        Zoom                    (_Parameter);
+    virtual void        OriginalSize            (void);
+
+
+    virtual bool        _ProcessMenuSelection   (long);
+    virtual bool        _ProcessOSEvent         (Ptr);
+    virtual void        _SetWindowRectangle     (int,int,int,int,bool=true);
+    virtual void        _Paint(Ptr);
+    virtual void        _Update(Ptr);
+    virtual long        _Grow (Ptr);
+    void        _PrintPWindow           (void);
+
+    virtual void        _SetMenuBar             (void);
+    virtual void        _UnsetMenuBar           (void);
+
+    bool        resizing;
+    long        oh,
+                ow;
+
+};
+#endif
+
+//EOF
diff --git a/src/gui/include/WindowClasses/HYModelWindow.h b/src/gui/include/WindowClasses/HYModelWindow.h
new file mode 100644
index 0000000..8355e53
--- /dev/null
+++ b/src/gui/include/WindowClasses/HYModelWindow.h
@@ -0,0 +1,200 @@
+/*
+    Model Display/Edit Window
+
+    Sergei L. Kosakovsky Pond,
+        August-September 2001.
+
+*/
+
+#ifndef _HYMODELWINDOW_
+#define _HYMODELWINDOW_
+
+#include "HYTableWindow.h"
+#include "HYTableComponent.h"
+#include "parser.h"
+
+#define  HY_MODELWINDOW_ICON_BASE        7000
+#define  HY_MODEL_WINDOW_MENU_ID         8111
+
+#define  HY_MODEL_TYPE_NUC               0
+#define  HY_MODEL_TYPE_AA                1
+#define  HY_MODEL_TYPE_DINUC             2
+#define  HY_MODEL_TYPE_CODON             3
+
+#define  MODEL_PARAMETER_ROW     0
+#define  MODEL_MATRIX_HEADER_ROW 1
+#define  MODEL_MATRIX_ROW        2
+#define  MODEL_CLASS_ROW         3
+#define  MODEL_BUTTON_ROW        4
+
+//class     _HYModelParameterDialog;
+
+//__________________________________________________________________
+
+class _HYModelWindow: public _HYTWindow
+{
+
+public:
+
+    _HYModelWindow          (_String,_List*,char );
+    virtual             ~_HYModelWindow         (void)
+    {}
+
+    virtual bool        ProcessEvent            (_HYEvent*);
+    virtual void        Activate                (void);
+    virtual void        Deactivate              (void);
+
+    virtual bool        ConfirmClose            (void);
+
+    long                FindVarID               (_String&);
+    _String&            RetrieveVarID           (long);
+    char                VarKind                 (long);
+    void                InsertVarID             (_String&, char);
+    bool                DeleteVarID             (long, bool clean = false);
+    void                RenameVarID             (_String&, long, char);
+    long                MenuChoiceToID          (long);
+    void                DoFitColumns            (void);
+    void                DoCopyCell              (void);
+    void                DoPasteToCells          (void);
+    void                DoClearCells            (void);
+    void                DoSelectCells           (void);
+    void                DoMultiplyCells         (void);
+    void                DoSelectAll             (void);
+    void                DoSelectAllEmpty        (void);
+    void                DoMatchCells            (_String*);
+    void                DoSave                  (char);
+    bool                DoEditModelName         (void);
+    void                SymmetrizeSelection     (_SimpleList&, bool pad = false);
+    void                UpdateClassMenus        (void);
+    void                ProcessClassMenu        (void);
+    void                BuildTemplates          (_SimpleList*,char);
+    void                GrabEFVs                (char);
+    void                GrabRateVariation       (void);
+    bool                CopyMatrix              (_String&);
+    bool                CopySimpleMatrix        (_Matrix*);
+    void                SetEFVVector            (_String&);
+    void                HandleEFVEditEvent      (long);
+    void                UpdateEFVLastEntry      (void);
+    void                SetEFVChoice            (long);
+    void                SyncEditBox             (void);
+
+    bool                AddFormulaParametersToList
+    (_Formula&,bool=false);
+
+    void                ProcessTemplateSelection(long);
+    void                DoScrollToSelection     (_SimpleList&);
+    long                ParameterEditBox        (long);
+    virtual void        _SetMenuBar             (void);
+    virtual void        _UnsetMenuBar           (void);
+    virtual bool        _ProcessMenuSelection   (long);
+    bool                _CheckClipboard         (void);
+    void                _SetClipboard           (void);
+    void                SetTaint                (bool t) {
+        taint = t;
+    }
+
+    void                CopyEFVMatrix           (_Matrix*);
+    virtual bool        IsSaveEnabled     (void) {
+        return true;
+    }
+    virtual bool        IsPrintEnabled    (void) {
+        return true;
+    }
+
+    friend              class _HYModelParameterDialog;
+
+private:
+
+    void                UpdateParameterName     (long, long);
+    bool                RemoveParameterName     (long);
+    void                HandleCellEditEvent     (long);
+    void                SetParameterMenuState   (long);
+    void                PrepareParameterMenu    (void);
+    void                UpdateButtonState       (void);
+    void                _UpdateEditMenu         (bool,bool);
+    void                CheckDependencies       (void);
+
+    _List               globalVariables,
+                        localVariables,
+                        categoryVariables,
+                        stateLabels,
+                        subClasses,
+                        matrixTemplates,
+                        EFVOptions,
+                        rateOptions;
+
+    _SimpleList         genCode;
+
+    _String             clipboardString;
+
+    long                lastParameterChoice,
+                        EFVChoice,
+                        rateChoice;
+
+    bool                taint;
+    char                type;
+};
+
+
+//__________________________________________________________________
+
+class _HYModelWindowDialog: public _HYTWindow
+{
+
+public:
+
+    _HYModelWindowDialog     (long*,long*,_String*,long*);
+    virtual     ~_HYModelWindowDialog    (void) {}
+
+    virtual bool ProcessEvent            (_HYEvent*);
+
+    void SetModelChoice          (_String*);
+private:
+
+    void FindModelsOfType        (char);
+    void SetModelOptions         (_String*);
+    void GetGeneticCodes         (void);
+    bool SwitchModelOptions      (char);
+    void SwitchModelSelection    (long);
+
+    long        *mDim,
+                *gCode,
+                *pl3;
+
+    _String     *sp1;
+};
+
+//__________________________________________________________________
+
+class _HYModelParameterDialog: public _HYTWindow
+{
+
+public:
+
+    _HYModelParameterDialog      (_HYModelWindow*, long, long*);
+    virtual     ~_HYModelParameterDialog     (void)
+    {}
+
+    virtual bool ProcessEvent                    (_HYEvent*);
+
+    long*                            result,
+                                     inID,
+                                     orb,
+                                     rb;
+
+    _HYModelWindow*                  parentModel;
+};
+
+//__________________________________________________________________
+
+
+_String*                DefStringForGCode       (_SimpleList*);
+bool                    OpenModelFromFile       (_String&);
+bool                    OpenModelFromMatrix     (_String&,bool = true);
+bool                    OpenModelFromCalcNode   (_String&,bool);
+void                    SpawnStandardLabels     (char,_List&);
+_HYModelWindow          *SpawnNewModel          (long, long, _String&, long);
+
+#endif
+
+//EOF
diff --git a/src/gui/include/WindowClasses/HYParameterTable.h b/src/gui/include/WindowClasses/HYParameterTable.h
new file mode 100644
index 0000000..96d61e4
--- /dev/null
+++ b/src/gui/include/WindowClasses/HYParameterTable.h
@@ -0,0 +1,224 @@
+/*
+    Parameter Display Table
+
+    Sergei L. Kosakovsky Pond, January-July 2001.
+*/
+
+#ifndef _HYPARAMETERTABLE_
+#define _HYPARAMETERTABLE_
+//#pragma once
+#include "HYTableWindow.h"
+#include "HYTableComponent.h"
+#include "calcnode.h"
+#include "category.h"
+
+#define  HY_PARAMETER_TABLE_ICON_BASE               6016
+#define  HY_PARAMETER_TABLE_BUTTON_ICON_BASE        6030
+#define  HY_PARAMETER_BOOTSTRAP_BUTTON_ICON_BASE    6040
+#define  HY_PARAMETER_TABLE_VIEW_LOCAL              0x01
+#define  HY_PARAMETER_TABLE_VIEW_GLOBAL             0x02
+#define  HY_PARAMETER_TABLE_VIEW_CONSTRAINED        0x04
+#define  HY_PARAMETER_TABLE_VIEW_CATEGORY           0x08
+#define  HY_PARAMETER_TABLE_VIEW_ALPHABETICAL       0x10
+#define  HY_PARAMETER_TABLE_VIEW_TREES              0x20
+#define  HY_PARAMETER_TABLE_SNAPSHOT                0x80
+#define  HY_PARAMETER_TABLE_VIEW_ALL                0xFF
+
+#define  HY_PARAMETER_TABLE_MENU_ID                 7995
+#define  HY_PARAMETER_TABLE_HMENU_ID                172
+
+#define  HY_PARAMETER_TABLE_TABLE_ROW               2
+#define  HY_PARAMETER_TABLE_BUTTON_ROW              0
+
+#define  HY_WINDOW_KIND_PARAMETERTABLE              2
+
+
+//__________________________________________________________________
+
+class _HYParameterTable: public _HYTWindow
+{
+
+public:
+
+    _HYParameterTable       (_String,long);
+    virtual             ~_HYParameterTable      ();
+
+    virtual bool        ProcessEvent            (_HYEvent*);
+    virtual bool        ProcessGEvent           (_HYEvent*);
+
+    virtual void        _SetMenuBar             (void);
+    virtual void        _UnsetMenuBar           (void);
+    //virtual bool      _ProcessOSEvent         (Ptr);
+    virtual bool        _ProcessMenuSelection   (long);
+    void        _UpdateViewMenu         (void);
+
+    BaseRef             RetrieveIthRowVar       (long);
+    void                OpenCategoryPlotWindow  (_CategoryVariable*);
+    void                SetRowValues            (long, _Variable*,_HYTable*);
+    void                OptimizeLikelihoodFunction
+    (void);
+    void                RefreshTheTable         (void);
+    void                ToggleConstrainedView   (char flag = HY_PARAMETER_TABLE_VIEW_CONSTRAINED);
+    void                TaintTheLF              (void);
+    void                SetSelectedRows         (_List&);
+    void                SelectAll               (void);
+    void                UndoCommand             (void);
+    virtual bool        IsSaveEnabled     (void) {
+        return true;
+    }
+    virtual bool        IsPrintEnabled    (void) {
+        return true;
+    }
+    virtual char        WindowKind        (void) {
+        return HY_WINDOW_KIND_PARAMETERTABLE;
+    }
+
+private:
+
+    void                UpdateLogLikelihood     (bool postEvent = true);
+    void                ConstructTheTable       (void);
+    char                GetViewOptions          (void);
+    void                HandleCellPullDown      (long,long);
+    void                HandleHeaderPullDown    (long,long);
+    void                HandleCellEditEvent     (long);
+    void                HandleSaveLF            (void);
+    void                HandleRestoreLF         (_String*);
+    void                HandleSetHypothesis     (_String*,bool);
+    void                HandleDeleteLF          (_String*);
+    void                HandleLRT               (void);
+    void                HandleSelectParameters  (void);
+    void                HandleOpenInChart       (void);
+    void                HandleBootstrap         (bool);
+    void                PrepareLFMenu           (void);
+    void                UpdateSelectionDependentButtons
+    (void);
+    void                RefreshParameterValues  (void);
+    void                DoEqualConstraint       (void);
+    void                DoProportionalConstraint(void);
+    void                DoProportionalSubtrees  (void);
+    void                DoBoundsChange          (void);
+    void                DoMolecularClock        (void);
+    void                DoSave                  (void);
+    void                DoOpenTreeWindow        (void);
+    void                DoClearConstraints      (void);
+    void                DoEnterConstraint       (void);
+    void                DoCleanUp               (void);
+    void                UpdateKthRow            (long, bool mark = true);
+    void                StretchColumnToFit      (long);
+    _CalcNode*          GrabRowsCalcNode        (_String*);
+    void                _UpdateUndoMenu         (_String*, _String*);
+    void                TakeLFSnapshot          (void);
+    void                DoneLFSnapshot          (void) {
+        /*viewOptions -= HY_PARAMETER_TABLE_SNAPSHOT;*/
+    }
+    void                VerifyGlobalVariables   (void);
+    long                GatherListOfGlobals     (_List&);
+    void                HandleVarianceEstimates (void);
+    void                HandleProfilePlot       (void);
+    void                HandleCategories        (void);
+
+    _HYGuiObject*       RetrieveParentDataPanel (void);
+
+    // data members
+    long                lfID,
+                        lastParameterCount;
+
+    _Parameter          lastLFValue;
+
+    char                viewOptions,
+                        avViewOptions;
+
+    _List               undoCommands,
+                        undoDescriptions;
+
+    _String             lastLFState,
+                        stashCustomCommand;
+
+};
+
+//__________________________________________________________________
+
+class _HYBootstrapWindow: public _HYTWindow
+{
+
+public:
+
+    _HYBootstrapWindow      (_String,_Parameter);
+    virtual             ~_HYBootstrapWindow     (void) {}
+    virtual  bool       ProcessEvent            (_HYEvent*);
+
+    virtual  bool       ConfirmClose            (void);
+    void                AddIterate              (_Parameter);
+    bool                HasStopped              (void) {
+        return done;
+    }
+    void                SetStopped              (bool);
+    void                OpenHistogramWindow     (bool, long);
+    void                DoSave                  (void);
+    virtual bool        IsSaveEnabled           (void) {
+        return true;
+    }
+    virtual bool        IsPrintEnabled          (void) {
+        return true;
+    }
+    virtual bool        _ProcessMenuSelection   (long);
+
+    bool                requestQuit;
+
+
+protected:
+
+    long                iterateCount,
+                        iterateCountP;
+
+    bool                done;
+
+    _Parameter          nullLRT;
+};
+
+//__________________________________________________________________
+
+class _HYGeneralBootstrapWindow: public _HYBootstrapWindow
+{
+
+public:
+
+    _HYGeneralBootstrapWindow       (_String,long = -1);
+    virtual             ~_HYGeneralBootstrapWindow      (void)
+    {}
+
+    virtual  bool       ProcessEvent                    (_HYEvent*);
+    void                SetNullLF                       (long, bool = false);
+    void                HandleBootstrap                 (char);
+
+    virtual  bool       ProcessGEvent                   (_HYEvent*);
+    virtual  bool       ConfirmClose                    (void);
+
+    //virtual bool      _ProcessMenuSelection           (long);
+    //virtual void      _SetMenuBar                     (long);
+    //virtual void      _UnsetMenuBar                   (long);
+
+private:
+
+    void                GetNullStateString              (_String&, long);
+    void                GetAltStateString               (_String&, long);
+    void                ResetResults                    (void);
+    void                BuildCompatibleLF               (bool set = false);
+    void                BuildAvailableLF                (void);
+    void                UpdateBSButtons                 (void);
+    void                UpdateLRValue                   (void);
+    long                lfNullID,
+                        lfAltID;
+
+    _SimpleList         lfID0,
+                        dpID0,
+                        lfIDA,
+                        dpIDA;
+
+    bool                hasGoIcon;
+
+};
+
+#endif
+
+//EOF
diff --git a/src/gui/include/WindowClasses/HYTreePanel.h b/src/gui/include/WindowClasses/HYTreePanel.h
new file mode 100644
index 0000000..92004aa
--- /dev/null
+++ b/src/gui/include/WindowClasses/HYTreePanel.h
@@ -0,0 +1,394 @@
+/*
+    A tree window - tree canvas, scrolling pane and a button bar
+
+    Sergei L. Kosakovsky Pond, May 2000.
+*/
+
+#ifndef _HYTREEPANEL_
+#define _HYTREEPANEL_
+//#pragma once
+#include "HYTableWindow.h"
+#include "HYCanvas.h"
+#include "HYDialogs.h"
+#include "calcnode.h"
+#include "classes.h"
+
+#define  HY_TREEPANEL_ALIGNED               0
+#define  HY_TREEPANEL_SCALED                1
+#define  HY_TREEPANEL_SQUARE                2
+#define  HY_TREEPANEL_STRAIGHT              4
+#define  HY_TREEPANEL_ARCS                  8
+#define  HY_TREEPANEL_CIRCULAR              1024
+#define  HY_TREEPANEL_LABEL1                2048
+#define  HY_TREEPANEL_LABEL2                4096
+#define  HY_TREEPANEL_LAYOUT_MASK           0xfbf1
+#define  HY_TREEPANEL_SCALING_MASK          0xfffd
+#define  HY_TREEPANEL_TIP_LABELS            16
+#define  HY_TREEPANEL_INT_LABELS            32
+#define  HY_TREEPANEL_VERTICAL              64
+#define  HY_TREEPANEL_CLIPBOARD_READY       128
+#define  HY_TREEPANEL_PROJECTION            256
+#define  HY_TREEPANEL_FISHEYECURSOR         512
+#define  HY_TREEPANEL_SCALE_TO_WINDOW       8192
+#define  HY_TREEPANEL_MAXSIZE               4096
+#define  HY_TREEPANEL_NAVSIZE               115
+#define  HY_TREEPANEL_DEFSIZE               350
+#define  HY_TREEPANEL_MIN_VSPACE            10
+#define  HY_TREEPANEL_MAX_VSPACE            500
+#define  HY_TREEPANEL_MIN_HSPACE            10
+#define  HY_TREEPANEL_SPACE_STEP            5
+#define  HY_TREEPANEL_MAX_HSPACE            500
+#define  HY_TREEPANEL_VSPACE                30
+#define  HY_TREEPANEL_HSPACE                60
+#define  HY_TREEPANEL_MARGIN                10
+#define  HY_TREEPANEL_LABELSPACING          75
+#define  HY_TREEPANEL_NAVSPACING            2
+#define  HY_TREEPANEL_TEXTHALFSIZE          4
+#define  HY_TREEPANEL_TEXTSIZE              9
+#define  HY_TREEPANEL_RULER_COLLAPSED       5
+#define  HY_TREEPANEL_RULER_EXPANDED        15
+#define  HY_TREEPANEL_ICON_ID               5000
+#define  HY_TREEPANEL_MENU_ID               7990
+#define  HY_TREEPANEL_HMENU_ID              190
+#define  HY_CLIPBOARD_CUT                   1
+#define  HY_CLIPBOARD_COPY                  2
+
+#define  HY_WINDOW_KIND_TREE                1
+
+
+
+//__________________________________________________________________
+
+class _HYTreePanel: public _HYTWindow
+{
+
+    friend class _HYLabelDialog;
+    friend class _HYTreeViewDialog;
+
+public:
+
+    _HYTreePanel(_String&,_String&);
+    // tree name, tree string (or tree ident)
+
+    virtual ~_HYTreePanel();
+
+    virtual bool        ProcessEvent                    (_HYEvent*);
+    virtual bool        ProcessGEvent                   (_HYEvent*);
+    bool        BuildTree                       (bool);
+    void        RenderTree                      (bool map = true, bool printing = false);
+    void        RenderRuler                     (_Parameter hsc = 1.0, bool printing = false, int hshift = 0, int vshift = 0);
+    void        RenderNavTree                   (void);
+    void        SetTreeString                   (_String&);
+    void        SetVariableReference            (_String&);
+    void        SetFlags                        (unsigned int);
+    unsigned int        GetFlags                        (void) {
+        return treeFlags;
+    }
+    void        SetScaleVariable                (_String&);
+    void        SetNavRectCenter                (int,int);
+    virtual void        Update                          (Ptr);
+    virtual void        Paint                           (Ptr);
+    long        FindSelection                   (long,long,char);
+    long        FindSelectedBranch              (long,long);
+    _String     GetTreeString                   (_AVLListXL* = nil);
+    void        SwapSelectedSubTrees            (void);
+    void        CollapseSelectedBranch          (void);
+    void        JoinSelectedBranches            (void);
+    void        GraftATip                       (void);
+    void        MoveSubTree                     (void);
+    void        RerootTree                      (void);
+    void        DeleteCurrentSelection          (void);
+    virtual bool        _ProcessMenuSelection           (long);
+    virtual void        _SetMenuBar                     (void);
+    virtual void        _UnsetMenuBar                   (void);
+    _TheTree*   LocateMyTreeVariable            (void);
+    void        SelectAllBranches               (void);
+    void        SelectIncompleteBranches        (void);
+    void        SelectBranchesWithoutModel      (void);
+    void        SelectBranchesByName            (void);
+    void        SelectBranchesByLength          (void);
+    void        DisplayLikelihoodValue          (void);
+    void        CutSelectionToClipboard         (bool cut = true);
+    void        PasteClipboardTree              (void);
+    void        FlipSelectedBranches            (void);
+    void        SelectEntireSubtree             (void);
+    void        UpdateScalingVariablesList      (void);
+    void        UndoLastOperation               (void);
+    void        SelectRangeAndScroll            (_List&, bool = false);
+    void        ScrollToSelection               (_Parameter, _Parameter);
+    void        DisplayParameterTable           (void);
+    void        SetFont                         (_HYFont&);
+    virtual bool        IsSaveEnabled                   (void) {
+        return true;
+    }
+    virtual bool        IsPrintEnabled                  (void) {
+        return true;
+    }
+    void        ToggleScaleOption               (void);
+    void        ShowModelMatrix                 (bool);
+    void        RenderTree2                     (void);
+    virtual char        WindowKind                      (void) {
+        return HY_WINDOW_KIND_TREE;
+    }
+    void        _DisplayBranchFloater           (void);
+    bool        HasToolTip                      (void) {
+        return toolTipBounds.left>0;
+    }
+    virtual void        _HandleIdleEvent                (void);
+    void        HandleSelection                 (char);
+    void        HandleComparison                (char);
+    void        GenerateDistanceTable           (char);
+    void        InvertSelection                 (void);
+    void        MatchToDataSet                  (void);
+    void        GrowSelection                   (node<nodeCoord>* = nil, bool = false);
+    void        HandleContextPopup              (long, long);
+
+private:
+
+    friend      class _HYNodeInfoDialog;
+
+    void        ExecuteProcessor                (long);
+    void        HandleTreeSave                  (long,_String);
+    void        HandleSearchAndReplace          (bool);
+    void        SelectSubTree                   (node<nodeCoord>*, bool);
+    void        Relabel                         (_TheTree*);
+    void        InvokeNodeEditor                (void);
+    void        PaintSquareBranchLabels         (_HYCanvas*,node<nodeCoord>*,bool);
+    long        PaintSquare                     (_HYCanvas*,node<nodeCoord>*);
+    long        PaintVSquare                    (_HYCanvas*,node<nodeCoord>*);
+    void        PaintStraight                   (_HYCanvas*,node<nodeCoord>*);
+    void        PaintRadial                     (_HYCanvas*,node<nodeCoord>*);
+    void        PaintArcs                       (_HYCanvas*,node<nodeCoord>*);
+    long        PaintNSquare                    (_HYCanvas*,node<nodeCoord>*,_Parameter, _Parameter);
+    long        PaintNVSquare                   (_HYCanvas*,node<nodeCoord>*,_Parameter, _Parameter);
+    void        PaintNStraight                  (_HYCanvas*,node<nodeCoord>* ,_Parameter, _Parameter);
+    void        PaintNRadial                    (_HYCanvas*,node<nodeCoord>* ,_Parameter, _Parameter);
+    void        PaintNArcs                      (_HYCanvas*,node<nodeCoord>*,_Parameter, _Parameter);
+    void        Convert2ScreenCoordinates       (_Parameter,_Parameter,_Parameter,node<nodeCoord>*);
+    void        ShiftScreenCoordinates          (_Parameter,_Parameter,node<nodeCoord>*);
+    void        StraightenEdges                 (node<nodeCoord>*,_Parameter,_Parameter,int);
+    _Parameter  PreStraightenEdges              (node<nodeCoord>*);
+    void        SpaceNodes                      (node<nodeCoord>*,_Parameter&);
+    _HYRect     ComputeNavRect                  (void);
+    bool        SetHSpace                       (int,bool force = false);
+    bool        SetVSpace                       (int,bool force = false, bool render = true);
+    bool        IsVertical                      (void) {
+        return treeFlags&HY_TREEPANEL_VERTICAL;
+    }
+    void        SetVertical                     (bool);
+    void        ResizeTreeCanvas                (int, int);
+    bool        CheckIfNeedUnscaled             (void);
+    bool        KillLikeFunc                    (char);
+    void        PreserveSelection               (_SimpleList&);
+    void        RestoreSelection                (_SimpleList&);
+    void        FishEyeProjection               (long,long,long,long,node<nodeCoord>*);
+    long        CircularLayoutPass1             (node<nodeCoord>*);
+    void        CircularLayoutPass2             (node<nodeCoord>*,_Parameter,_Parameter,_Parameter,_Parameter,_Parameter,long*);
+    void        CircularLayoutPass3             (node<nodeCoord>*,_Parameter,_Parameter,_Parameter,_Parameter);
+    void        HandleViewOptions               (void);
+    void        HandleLabels                    (bool);
+    void        HighlightSelectionInDataPanel   (void);
+    void        ShowSelectionInAnotherTree      (void);
+
+    void        _PaintNavRect                   (void);
+    void        _PaintLFStatus                  (Ptr = nil);
+    virtual bool        _ProcessOSEvent                 (Ptr);
+    void        _PrintTree                      (long = -1, long = -1);
+    void        _UpdateOperationsMenu           (void);
+    long        FindUnusedSuffix                (_String);
+    void        UpdateLnLikelihood              (void);
+    void        RecalculateLikelihood           (void);
+    void        ClearClipboardContents          (void);
+    bool        ShrinkDataFilter                (bool doit = false);
+    void        PrepareUndoData                 (char);
+    void        FlushUndoData                   (void);
+    void        HandleFisheyeButton             (void);
+    void        FitToWindow                     (bool force = false);
+    long        GetUniversalSaveOptions         (_List&);
+    void        dumpCoordTree                   (void);
+    void        DrawStraightEdge                (_HYCanvas*, _HYRect&, node<nodeCoord>*);
+
+    node<nodeCoord>* coordTree,
+         * selectionTop;
+
+    node<long>     * undoTree;
+
+    _String          treeName,
+                     scaleVariable,
+                     undoLFName,
+                     branchVar1,
+                     branchVar2;
+
+    char             undoCode,
+                     topAlign,
+                     bottomAlign,
+                     labelDigits1,
+                     labelDigits2,
+                     branchWidth;
+
+    int              vSpace,
+                     hSpace,
+                     tips,
+                     textSpace,
+                     saveMouseH,
+                     saveMouseV,
+                     windowTextMarginH,
+                     windowTextMarginV;
+
+    long             likeFuncID;
+
+    unsigned long    lastSave;
+
+    unsigned int     treeFlags;
+
+    _HYRect          navRect,
+                     toolTipBounds;
+
+    _Parameter       treeLength,
+                     hScale,
+                     vScale,
+                     distortion,
+                     arcStart,
+                     arcEnd;
+
+    _SimpleList      currentSelection,
+                     dubiousNodes,
+                     undoNodeList;
+
+    _HYFont          treeLabelFont,
+                     branchLabel1,
+                     branchLabel2;
+
+    Ptr              undoLFPointer;
+};
+
+
+//__________________________________________________________________
+
+class _HYLabelDialog: public _HYFontDialog
+{
+
+public:
+
+    _HYLabelDialog          (_HYTreePanel*,_List&,bool);
+    virtual     ~_HYLabelDialog         (void)
+    {}
+
+    virtual bool ProcessEvent            (_HYEvent*);
+
+private:
+
+    bool which;
+
+};
+
+//__________________________________________________________________
+
+class _HYTreeViewDialog: public _HYFontDialog
+{
+
+public:
+
+    _HYTreeViewDialog           (_HYTreePanel*,bool);
+    virtual     ~_HYTreeViewDialog              (void)
+    {}
+
+    virtual bool ProcessEvent               (_HYEvent*);
+
+private:
+
+    void            DrawArcPreview              (void);
+
+    bool            which,
+                    tb1,
+                    tb2,
+                    tb3;
+
+    _Parameter      sAng,
+                    fAng;
+
+    char            lw;
+
+};
+
+//__________________________________________________________________
+
+class _HYNodeInfoDialog: public _HYTWindow
+{
+
+public:
+
+    _HYNodeInfoDialog   (_String&, long*, bool, _TheTree*, _SimpleList*, bool*, bool*, bool*,_HYTreePanel*);
+    virtual     ~_HYNodeInfoDialog  (void)
+    {}
+
+
+    virtual bool ProcessEvent       (_HYEvent*);
+
+private:
+
+    long        AddParameterRow         (_String&,_String&,_String&,long);
+    void        DeleteParameterRow      (long);
+    void        BuildModelParameters    (void);
+    void        UpdateParameterValues   (bool);
+    bool        SetNewParameterValue    (long, _String*);
+    void        FitToHeight             (long);
+    bool        SetNodeModel            (_CalcNode*,long,bool = true);
+    void        ToggleFormulaBox        (bool,_String);
+    void        SetNewUserFormula       (void);
+    void        SetNewParameterName     (_String, long);
+
+    long            *modelSelection;
+    bool            isSingle,
+                    *updateSCV,
+                    *incFlag,
+                    *result,
+                    validTE,
+                    formulaBox,
+                    taintFla;
+
+    _TheTree*       treeRef;
+    _SimpleList*    tSel;
+    _String         nodeName,
+                    *iNodeName;
+
+    _List           allowableDataNames,
+                    sharedUEs;
+
+    _Matrix         parameterValues;
+    _SimpleList     parameterFlags,
+                    parameterVRefs,
+                    nodeVRefs;
+
+    _HYTreePanel*   parentRef;
+};
+
+//__________________________________________________________________
+
+extern  node<long>* treePanelClipboardRoot;
+extern  char        treePanelClipboardMode;
+extern  _List       treeProcessors;
+
+void    RenameNodesInClipboard  (node<long>*);
+void    RenameUndoNodes         (node<long>*,_String&);
+void    ReadTreeProcessors      (void);
+
+void    KillNodesInClipboard (node<long>*);
+node<long>*
+PatchNodesFromClipboard (node<long>*, _TheTree*, bool&);
+node<long>*
+CopyNodesToClipboard (node<long>*, _TheTree*, bool&);
+
+void    CopyNodeParameters          (node<nodeCoord>*, node<nodeCoord>*);
+
+typedef _String (listDescPopulator) (_HYWindow*);
+
+long     SelectOpenWindowObjects    (long, _String, listDescPopulator*,Ptr);
+_String  treeSelectorPopulator      (_HYWindow *);
+_String  dsSelectorPopulator        (_HYWindow *);
+
+
+
+#endif
+
+//EOF
diff --git a/src/gui/include/preferences.h b/src/gui/include/preferences.h
new file mode 100644
index 0000000..415cba5
--- /dev/null
+++ b/src/gui/include/preferences.h
@@ -0,0 +1,111 @@
+/*
+HyPhy - Hypothesis Testing Using Phylogenies.
+This file implements shared and platform specific
+(via ifdefs) functions for reading/writing and
+setting preferences.
+
+Written by SL Kosakovsky Pond
+June 8, 2007
+Copyright (C) 1997-2006
+
+Primary Development:
+  Sergei L Kosakovsky Pond (sergeilkp at mac.com)
+Significant contributions from:
+  Spencer V Muse (muse at stat.ncsu.edu)
+  Simon DW Frost (sdfrost at ucsd.edu)
+  Art FY Poon    (apoon at biomail.ucsd.edu)
+
+Permission is hereby granted, free of charge, to any person obtaining a
+copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be included
+in all copies or substantial portions of the Software.
+
+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.
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+*/
+
+
+
+#ifndef __HYPHY_PREFERENCES__
+
+#define  PREFITEM_TEXTBOX 0
+#define  PREFITEM_POPUP   1
+#define  RECENT_FILE_ITEMS 10
+
+#include    "list.h"
+#include    "hy_strings.h"
+#ifndef     __HEADLESS__
+#include    "HYBaseGUI.h"
+#endif
+
+/* read HyPhy preferences from a platform - dependent location */
+void      ReadPreferences       (void);
+
+/* write HyPhy preferences to a platform - dependent location */
+void      WritePreferences      (void);
+
+/* apply relevant settings before executing a batch file */
+void      ApplyPreferences      (void);
+
+/* immediately apply those preferences which can be set
+ interactively; e.g. console font */
+void      SetPreferences        (void);
+
+extern    bool showDialogAtStartup,
+          doAutoConsoleMove ;
+
+extern    _List                globalPreferencesList,
+          recentPaths,
+          recentFiles;
+
+
+
+#ifndef     __HEADLESS__
+
+extern    _HYRect              consolePositionRectangle;
+
+#endif
+
+
+
+extern    _String              recentFilesList;
+
+
+
+void      AddStringToRecentMenu (_String&, _String&);
+
+/* add a string/path to the recent analyses menu */
+
+
+
+void      AddItemToPreferences   (long,long,_String,_String,_String,_List*,_List&,bool);
+
+/* a function used to append items to a preferences list */
+
+
+
+char      AutoOpenTreeWindow     (void);
+
+void      SetShowDialogAtStartup (bool);
+
+
+
+#endif
+
+
+
+
+
+//EOF
+
diff --git a/src/gui/include/shared_main.h b/src/gui/include/shared_main.h
new file mode 100644
index 0000000..e69de29
diff --git a/src/gui/mac/Components/HYPlatformButton.cpp b/src/gui/mac/Components/HYPlatformButton.cpp
new file mode 100644
index 0000000..17ce146
--- /dev/null
+++ b/src/gui/mac/Components/HYPlatformButton.cpp
@@ -0,0 +1 @@
+/*
    Button component for Mac OS.

    Sergei L. Kosakovsky Pond, May 2000 - December 2002
*/

#include "errorfns.h"
#include "HYButton.h"
#include "HYUtils.h"
#include "HYEventTypes.h"

#include <ControlDefinitions.h>

//__________________________________________________________________

_HYPlatformButton::_HYPlatformButton    (void)
{
    backFill = NewPixPat();

    if (!backFill) {
        warnError (-108);
    }

    RGBColor    wht = {0xffff,0xffff,0xffff};
    fontID          = 0;
    buttonControl   = nil;
    buttonRect      = (Rect) {
        0,0,100,100
    };

    MakeRGBPat (backFill,&wht);
}

//__________________________________________________________________

_HYPlatformButton::~_HYPlatformButton   (void)
{
    if (backFill) {
        DisposePixPat (backFill);
    }

    if (buttonControl) {
        DisposeControl(buttonControl);
    }
}

//__________________________________________________________________

void    _HYPlatformButton::_SetBackColor (_HYColor& c)
{
    RGBColor newBG;
    newBG.red = c.R*256;
    newBG.blue = c.B*256;
    newBG.green = c.G*256;
    MakeRGBPat (backFill,&newBG);
}

//__________________________________________________________________

void        _HYPlatformButton::_SetFont (_HYFont& f)
{
    Str255 fName;
    StringToStr255 (f.face,fName);
    short fNum=0;
    GetFNum (fName,&fNum);
    fontID = fNum;
    if (buttonControl) {
        _ApplyFont ();
    }
}

//__________________________________________________________________

void        _HYPlatformButton::_ApplyFont(void)
{
#ifdef TARGET_API_MAC_CARBON
    ControlFontStyleRec fontData;
    fontData.flags = kControlUseFontMask|kControlUseFaceMask|kControlUseSizeMask;
    fontData.font  = fontID;
    fontData.style  = ((_HYButton*)this)->buttonFont.style;
    fontData.size   = ((_HYButton*)this)->buttonFont.size;
    SetControlFontStyle (buttonControl, &fontData);
#endif
}
//__________________________________________________________________
void        _HYPlatformButton::_Update (Ptr p)
{
    _Paint (p);
}

//__________________________________________________________________
void        _HYPlatformButton::_SetDimensions (_HYRect r, _HYRect rel)
{
    _HYButton* theParent = (_HYButton *) this;
    theParent->_HYPlatformComponent::_SetDimensions (r,rel);
    _SetVisibleSize (rel);
}

//__________________________________________________________________
void        _HYPlatformButton::_EnableButton (bool e)
{
    if (buttonControl) {
        HiliteControl (buttonControl,e?kControlNoPart:kControlInactivePart);
    }
}

//__________________________________________________________________
void        _HYPlatformButton::_SetButtonKind (unsigned char k)
{
    if (buttonControl) {
        //_HYButton * theParent = (_HYButton*) this;
        Boolean     onOff = (k==HY_BUTTON_OK);

        SetControlData (buttonControl,
                        kControlNoPart,
                        kControlPushButtonDefaultTag,
                        sizeof(Boolean),
                        (Ptr)&onOff);

    }
}

//__________________________________________________________________
void        _HYPlatformButton::_SetVisibleSize (_HYRect rel)
{
    _HYButton * theParent = (_HYButton*) this;

    buttonRect.left=rel.left;
    buttonRect.top = rel.top;

    _HYRect s = theParent->_SuggestDimensions();

    buttonRect.right =  buttonRect.left+s.right;
    buttonRect.bottom = buttonRect.top+s.bottom;

    AlignRectangle (rel, buttonRect, theParent->GetAlignFlags());

    if (buttonControl) {
        SizeControl (buttonControl,buttonRect.right-buttonRect.left+1,buttonRect.bottom-buttonRect.top+1);
        MoveControl (buttonControl,buttonRect.left,buttonRect.top);
    }
}


//__________________________________________________________________
void        _HYPlatformButton::_Paint (Ptr p)
{
    _HYButton * theParent = (_HYButton*)this;
    _HYRect   * relRect   = (_HYRect*)p;
    Rect        cRect;

    cRect.left   = relRect->left;
    cRect.right  = relRect->right;
    cRect.top    = relRect->top;
    cRect.bottom = relRect->bottom;

    bool         drawBk = (!(theParent->settings.width&HY_COMPONENT_TRANSP_BG));

    if (drawBk) {
        FillCRect (&cRect,backFill);
    } else {
        EraseRect (&cRect);
    }

    if (buttonControl) {
        _PaintMe();
    }

    (*theParent)._HYPlatformComponent::_Paint(p);
}

//__________________________________________________________________
void        _HYPlatformButton::_PaintMe (void)
{
    _HYButton * theParent = (_HYButton*)this;
    bool        drawBk = (!(theParent->settings.width&HY_COMPONENT_TRANSP_BG));

    GrafPtr     thisPort;
    GetPort     (&thisPort);

#ifdef OPAQUE_TOOLBOX_STRUCTS
    SetPort   (GetWindowPort(theParent->parentWindow));
#else
    SetPort   (theParent->parentWindow);
#endif

    RGBColor newBG,
             saveColor;

    if (drawBk) {
        GetBackColor (&saveColor);
        newBG.red = theParent->backColor.R*256;
        newBG.blue = theParent->backColor.B*256;
        newBG.green = theParent->backColor.G*256;
        RGBBackColor (&newBG);
    }

    Draw1Control (buttonControl);
    if (drawBk) {
        RGBBackColor (&saveColor);
    }

    SetPort     (thisPort);
}
//__________________________________________________________________

_HYRect _HYButton::_SuggestDimensions (void)
{
    _HYRect res = {10,100,10,100,HY_COMPONENT_NO_SCROLL};
    GrafPtr thisPort;
    GetPort (&thisPort);

#ifdef OPAQUE_TOOLBOX_STRUCTS
    short   savedFace = GetPortTextFont (thisPort),
            savedSize = GetPortTextSize (thisPort);

    Style   savedStyle = GetPortTextFace (thisPort);
#else
    short   savedFace = thisPort->txFont,
            savedSize = thisPort->txSize;

    Style   savedStyle = thisPort->txFace;
#endif


    TextFont (fontID);
    TextSize (buttonFont.size);
    TextFace (buttonFont.style);

    res.top = res.bottom = buttonFont.size+8;
    res.left= res.right  = TextWidth (buttonText.sData,0,buttonText.sLength) + 15;

    TextFont (savedFace);
    TextSize (savedSize);
    TextFace (savedStyle);

    return res;
}

//__________________________________________________________________

void        _HYButton::_Activate (void)
{
    if (!activationFlag)
        if (buttonControl&&isEnabled) {
            HiliteControl (buttonControl,0);
            _PaintMe();
            //Draw1Control (buttonControl);
        }

    _HYPlatformComponent::_Activate();
}

//__________________________________________________________________

void        _HYButton::_Deactivate (void)
{
    if (activationFlag)
        if (buttonControl&&isEnabled) {
            HiliteControl (buttonControl, kControlInactivePart);
            _PaintMe();
            //Draw1Control (buttonControl);
        }

    _HYPlatformComponent::_Deactivate();
}

//__________________________________________________________________

void        _HYPlatformButton::_SetText (void)
{
    _HYButton *parent = (_HYButton*)this;

    Str255 buffer;
    StringToStr255 (parent->buttonText, buffer);
    if (buttonControl) {
        SetControlTitle (buttonControl,buffer);
    } else {
        GrafPtr      savePort;
        GetPort (&savePort);
#ifdef OPAQUE_TOOLBOX_STRUCTS
        SetPort (GetWindowPort(parent->parentWindow));
#else
        SetPort (parent->parentWindow);
#endif

        buttonControl = NewControl (parent->parentWindow,&buttonRect,buffer,true,0,0,0,
                                    kControlPushButtonProc /*+(1<<3)*/ ,0);

        checkPointer ((Ptr)buttonControl);
        _ApplyFont ();
        SetPort (savePort);
    }
}

//__________________________________________________________________

bool _HYButton::_ProcessOSEvent (Ptr vEvent)
{
    EventRecord*    theEvent = (EventRecord*)vEvent;
    WindowPtr       dummy;
    if(buttonControl&&isEnabled)
        switch (theEvent->what) {
        case mouseDown: {
            long evtType = FindWindow (theEvent->where,&dummy);
            if (evtType == inContent) {
                Point localClick = theEvent->where;
                GlobalToLocal (&localClick);
                if (buttonControl&&PtInRect (localClick,&buttonRect))
                    if (TrackControl (buttonControl,localClick,nil))
                        if (messageRecipient) {
                            messageRecipient->ProcessEvent (generateButtonPushEvent (GetID(),0));
                        }
            }
            return true;
        }
        case keyDown:
        case autoKey: {
            int     keyCode = (theEvent->message&keyCodeMask)>>8;
            bool    good    = false;

            if (buttonKind == HY_BUTTON_OK) {
                good = ((keyCode==0x24) || (keyCode==0x4C));
            } else if (buttonKind == HY_BUTTON_CANCEL) {
                good = ((keyCode==0x35) || ((keyCode==0x2F)&&(theEvent->modifiers&cmdKey)));
            }

            if (good) {
                HiliteControl (buttonControl, kControlButtonPart);
                _PaintMe();
                //Draw1Control (buttonControl);
                if (messageRecipient) {
                    messageRecipient->ProcessEvent (generateButtonPushEvent (GetID(),0));
                }
                _PaintMe();
                //Draw1Control (buttonControl);
            }
            if (good) {
                return true;
            }
        }
        }

    return _HYPlatformComponent::_ProcessOSEvent (vEvent);
}
// EOF
\ No newline at end of file
diff --git a/src/gui/mac/Components/HYPlatformButtonBar.cpp b/src/gui/mac/Components/HYPlatformButtonBar.cpp
new file mode 100644
index 0000000..514f9b0
--- /dev/null
+++ b/src/gui/mac/Components/HYPlatformButtonBar.cpp
@@ -0,0 +1 @@
+/*
    Toolbar component for Mac OS API

    Sergei L. Kosakovsky Pond, May 2000-December 2002
*/

#include "HYPlatformGraphicPane.h"

#include "errorfns.h"
#include "HYButtonBar.h"
#include "HYUtils.h"
#include "HYEventTypes.h"

#include "ToolUtils.h"
#include "Appearance.h"
#include "string.h"


//__________________________________________________________________

RGBColor
buttonBorder1 = {0,0,0},
buttonBorder2 = {0x3fff,0x3fff,0x3fff};

//__________________________________________________________________

_HYPlatformButtonBar::_HYPlatformButtonBar(void)
{
    backFill = NewPixPat();
    if (!backFill) {
        warnError (-108);
    }
    RGBColor  wht = {0xffff,0xffff,0xffff};
    MakeRGBPat (backFill,&wht);
    pushed = -1;
    saveMousePosH = -1;
    saveMousePosV = -1;
    lastSave = 0;
    toolTipBounds.left = 0;
#ifdef TARGET_API_MAC_CARBON
    //EventLoopRef    mainLoop;
    //mainLoop = GetMainEventLoop();
    timerUPP = NewEventLoopTimerUPP(ButtonBarTimer);
    //InstallEventLoopTimer (mainLoop,0,1.5*kEventDurationSecond,timerUPP,this,&theTimer);
    theTimer = nil;
#endif
}

//__________________________________________________________________

_HYPlatformButtonBar::~_HYPlatformButtonBar(void)
{
    if (backFill) {
        DisposePixPat (backFill);
    }
#ifdef TARGET_API_MAC_CARBON
    if (theTimer) {
        RemoveEventLoopTimer (theTimer);
    }
    DisposeEventLoopTimerUPP (timerUPP);
#endif
}

//__________________________________________________________________

void    _HYPlatformButtonBar::_DisposeButtons(void)
{
    _HYButtonBar* theParent = (_HYButtonBar*)this;
    for (long i=0; i<theParent->ButtonCount(); i++) {
        CIconHandle thisIcon = (CIconHandle)theParent->buttons.lData[i];
        DisposeCIcon (thisIcon);
    }
}

//__________________________________________________________________

void    _HYPlatformButtonBar::_DisposeButton(long k)
{
    _HYButtonBar* theParent = (_HYButtonBar*)this;
    if ((k<theParent->ButtonCount())&&(k>=0)) {
        CIconHandle thisIcon = (CIconHandle)theParent->buttons.lData[k];
        DisposeCIcon (thisIcon);
    }
}




//__________________________________________________________________

void        _HYPlatformButtonBar::_SetBackColor (_HYColor& c)
{
    RGBColor newBG;
    newBG.red = c.R*256;
    newBG.blue = c.B*256;
    newBG.green = c.G*256;
    MakeRGBPat (backFill,&newBG);

}

//__________________________________________________________________
void        _HYPlatformButtonBar::_SetVisibleSize (_HYRect rel)
{
    _HYButtonBar* theParent = (_HYButtonBar*) this;
    buttonRect.left=rel.left;
    buttonRect.top = rel.top;
    _HYRect s = theParent->_SuggestDimensions();
    buttonRect.right = buttonRect.left+s.right;
    buttonRect.bottom = buttonRect.top+s.bottom;
    AlignRectangle (rel, buttonRect, theParent->GetAlignFlags());
}

//__________________________________________________________________

void        _HYButtonBar::_Activate (void)
{
    if (!activationFlag)
        for (long k=0; k<enabledButtons.lLength; k++) {
            _MarkButtonForUpdate (enabledButtons.lData[k]);
        }
    if (!theTimer) {
        EventLoopRef      mainLoop;
        mainLoop = GetMainEventLoop();
        InstallEventLoopTimer (mainLoop,0,.5*kEventDurationSecond,timerUPP,this,&theTimer);
    }
    _HYPlatformComponent::_Activate();
}

//__________________________________________________________________

void        _HYButtonBar::_Deactivate (void)
{
    if (activationFlag) {
        for (long k=0; k<enabledButtons.lLength; k++) {
            _MarkButtonForUpdate (enabledButtons.lData[k]);
        }
        if (toolTipBounds.left) {
#ifdef TARGET_API_MAC_CARBON
            InvalWindowRect (parentWindow,&toolTipBounds);
            //HMHideTag ();
#else
            InvalRect (&toolTipBounds);
#endif
            toolTipBounds.left = 0;

        }
    }

#ifdef TARGET_API_MAC_CARBON
    if (theTimer) {
        RemoveEventLoopTimer(theTimer);
        theTimer = nil;
    }
#endif
    _HYPlatformComponent::_Deactivate();
}

//__________________________________________________________________

void        _HYButtonBar::_ComponentMouseExit (void)
{
    if (toolTipBounds.left) {
#ifdef TARGET_API_MAC_CARBON
        InvalWindowRect (parentWindow,&toolTipBounds);
        //HMHideTag ();
#else
        InvalRect (&toolTipBounds);
#endif
        toolTipBounds.left = 0;
    }
#ifdef TARGET_API_MAC_CARBON
    if (theTimer) {
        RemoveEventLoopTimer(theTimer);
        theTimer = nil;
    }
#endif
}


//__________________________________________________________________
void        _HYPlatformButtonBar::_Paint (Ptr p)
{

    _HYButtonBar * theParent = (_HYButtonBar*)this;
    _HYRect * relRect = (_HYRect*)p;
    Rect    cRect,iRect;
    cRect.left = relRect->left;
    cRect.right = relRect->right;
    cRect.top = relRect->top;
    cRect.bottom = relRect->bottom;
    if (!(theParent->settings.width&HY_COMPONENT_TRANSP_BG)) {
        FillCRect (&cRect,backFill);
    } else {
        EraseRect (&cRect);
    }
    RgnHandle saveRgn = NewRgn();

    if (!saveRgn) {
        warnError(-108);
    }

    GetClip (saveRgn);
    ClipRect (&cRect);
    cRect.left = buttonRect.left;
    cRect.top = buttonRect.top;
    int   step = theParent->GetButtonDim()+2*HY_BUTTONBAR_BORDER;
    cRect.right = cRect.left+step;
    cRect.bottom = cRect.top+step;
    RGBColor saveColor;
    GetForeColor (&saveColor);
    RGBForeColor (&buttonBorder1);
    PenSize (1,1);
    for (long i=0; i<theParent->ButtonCount(); i++) {
        if (i&&(i%theParent->BarWidth()==0)) {
            cRect.left = buttonRect.left;
            cRect.top +=step;
            cRect.bottom +=step;
            cRect.right = cRect.left+step;
        }
        iRect = cRect;
        //ThemeButtonDrawInfo binfo = {theParent->activationFlag?kThemeStateActive:kThemeStateInactive,kThemeButtonOff,kThemeAdornmentNone};
        //DrawThemeButton (&iRect,kThemeBevelButton,&binfo,nil,nil,nil,0);
        InsetRect (&iRect,HY_BUTTONBAR_BORDER,HY_BUTTONBAR_BORDER);
        if (theParent->activationFlag)
            if (i==pushed) {
                PlotCIconHandle (&iRect,atNone,ttSelected,(CIconHandle)theParent->buttons.lData[i]);
            } else {
                if (theParent->enabledButtons.Find(i)>=0) {
                    PlotCIcon (&iRect,(CIconHandle)theParent->buttons.lData[i]);
                } else {
                    PlotCIconHandle (&iRect,atNone,ttDisabled,(CIconHandle)theParent->buttons.lData[i]);
                }
            }
        else {
            PlotCIconHandle (&iRect,atNone,ttDisabled,(CIconHandle)theParent->buttons.lData[i]);
        }

        MoveTo (iRect.left-1,iRect.top-1);
        LineTo (iRect.right+1,iRect.top-1);
        LineTo (iRect.right+1,iRect.bottom+1);
        LineTo (iRect.left-1,iRect.bottom+1);
        LineTo (iRect.left-1,iRect.top-1);

        cRect.left +=step;
        cRect.right +=step;
    }

    RGBForeColor (&saveColor);

    SetClip    (saveRgn);
    DisposeRgn (saveRgn);

    (*theParent)._HYPlatformComponent::_Paint(p);
}
//__________________________________________________________________
_HYRect _HYPlatformButtonBar::_GetButtonRect (bool conv)
{
    _HYRect res;
    res.left   = buttonRect.left;
    res.right  = buttonRect.right;
    res.top    = buttonRect.top;
    res.bottom = buttonRect.bottom;
    if (conv) {
        GrafPtr thisPort;
        GetPort (&thisPort);
#ifdef OPAQUE_TOOLBOX_STRUCTS
        SetPort (GetWindowPort(((_HYButtonBar*)this)->parentWindow));
#else
        SetPort (((_HYButtonBar*)this)->parentWindow);
#endif
        Point   c;
        c.v = res.top;
        c.h = res.left;
        LocalToGlobal(&c);
        res.top = c.v;
        res.left = c.h;
        c.v = res.bottom;
        c.h = res.right;
        LocalToGlobal(&c);
        res.bottom = c.v;
        res.right = c.h;
        SetPort (thisPort);
    }
    return res;
}


//__________________________________________________________________
void        _HYPlatformButtonBar::_Update (Ptr p)
{
    _Paint (p);
}

//__________________________________________________________________
void        _HYPlatformButtonBar::_MarkButtonForUpdate (int i)
{
    _HYButtonBar* theParent = (_HYButtonBar*)this;
    if ((i>=0)&&(i<theParent->ButtonCount())) {
        int hR = i%theParent->BarWidth(),
            vR = i/theParent->BarWidth(),
            step = 2*HY_BUTTONBAR_BORDER+theParent->GetButtonDim();

        Rect invRect;
        invRect.left  = buttonRect.left+hR*step;
        invRect.right = invRect.left+step;
        invRect.top   = buttonRect.top+vR*step;
        invRect.bottom= invRect.top+step;
        GrafPtr savePort;
        GetPort (&savePort);
#ifdef OPAQUE_TOOLBOX_STRUCTS
        SetPort (GetWindowPort(theParent->parentWindow));
#else
        SetPort (theParent->parentWindow);
#endif
#ifdef TARGET_API_MAC_CARBON
        InvalWindowRect (theParent->parentWindow,&invRect);
#else
        InvalRect (&invRect);
#endif

        if (forceUpdateForScrolling) {
            Rect    rel = HYRect2Rect (theParent->rel);
            SectRect (&rel,&invRect,&invRect);
            _HYRect br = {invRect.top,invRect.left,invRect.bottom,invRect.right,0};
            theParent->Paint((Ptr)&br);
        }
        SetPort (savePort);
    }
}

//__________________________________________________________________
void        _HYPlatformButtonBar::_UnpushButton (void)
{
    if (pushed>=0) {
        _MarkButtonForUpdate(pushed);
        pushed = -1;
    }
}


//__________________________________________________________________
void        _HYPlatformButtonBar::_SetDimensions (_HYRect r, _HYRect rel)
{
    _HYButtonBar* theParent = (_HYButtonBar*) this;
    theParent->_HYPlatformComponent::_SetDimensions (r,rel);
    _SetVisibleSize (rel);
}

//__________________________________________________________________
int         _HYPlatformButtonBar::_FindClickedButton (int h, int v)
{
    Point localClick = {v,h};
    _HYButtonBar * parent = (_HYButtonBar*)this;
    if (PtInRect (localClick,&buttonRect)) {
        int v = localClick.v-buttonRect.top,
            h = localClick.h-buttonRect.left,
            step = 2*HY_BUTTONBAR_BORDER+parent->buttonDim,
            hR = h/step,
            vR = v/step;

        v-=vR*step;
        h-=hR*step;
        if ((v>HY_BUTTONBAR_BORDER)&&(v<step-HY_BUTTONBAR_BORDER)&&
                (h>HY_BUTTONBAR_BORDER)&&(h<step-HY_BUTTONBAR_BORDER)) {
            return hR+vR*parent->barW;
        }
    }
    return -1;

}

//__________________________________________________________________

#ifdef TARGET_API_MAC_CARBON
pascal void ButtonBarTimer (EventLoopTimerRef ,void* userData)
{
    Point    curMouse;
    GetGlobalMouse (&curMouse);
    //LocalToGlobal (&curMouse);
    _HYButtonBar * myBB = (_HYButtonBar*)userData;
    unsigned long t;
    GetDateTime(&t);

    if ((curMouse.h==myBB->saveMousePosH)
            &&(curMouse.v==myBB->saveMousePosV)) {
        if (!myBB->toolTipBounds.left) {
            GrafPtr curPort;
            GetPort (&curPort);
            SetPort (GetWindowPort (myBB->parentWindow));
            myBB->_DisplayToolTip();
            SetPort (curPort);
        }
    }

    myBB->saveMousePosH = curMouse.h;
    myBB->saveMousePosV = curMouse.v;
    myBB->lastSave      = t;
}

#endif

//__________________________________________________________________
void        _HYButtonBar::_DisplayToolTip      (void)
{
    Point p = {saveMousePosV,saveMousePosH};
    GlobalToLocal (&p);
    int h = _FindClickedButton (p.h,p.v);

    /*#ifdef TARGET_API_MAC_CARBON
    if (h>-1)
    {
        _String* toolTip = (_String*)toolTips(h);
        if (toolTip->sLength)
        {
            int x,
                y;

            GetButtonLoc (h,x,y,true);
            HMHelpContentRec hmr;

            hmr.absHotRect.left  = x;
            hmr.absHotRect.top   = y;
            hmr.absHotRect.right = x+GetButtonDim();
            hmr.absHotRect.bottom= y+GetButtonDim();

            hmr.version = kMacHelpVersion;
            hmr.tagSide = kHMDefaultSide;

            hmr.content[0].contentType = kHMPascalStrContent;
            hmr.content[1].contentType = kHMPascalStrContent;
            StringToStr255 (*toolTip,hmr.content[0].u.tagString);
            StringToStr255 (*toolTip,hmr.content[1].u.tagString);

            HMDisplayTag (&hmr);
            toolTipBounds.left = 1;
        }
    }
    #else*/
    if ((h>-1)&&(h<toolTips.lLength)) {
        _String* toolTip = (_String*)toolTips(h);
        if (toolTip->sLength) {
            //RGBColor      toolTipColor = {0x0000,0x3A00,0x8A00};
            RGBColor      toolTipColor = {0xFFFF,0xCCFF,0x6600};
            PixPatHandle  toolTipPixPat = NewPixPat();
            MakeRGBPat (toolTipPixPat,&toolTipColor);
            int        bL,bT;
            GetButtonLoc (h,bL,bT,false);
            GrafPtr thisPort;
            GetPort (&thisPort);
#ifdef OPAQUE_TOOLBOX_STRUCTS
            short   savedFace = GetPortTextFont (thisPort),
                    savedSize = GetPortTextSize (thisPort);

            Style   savedStyle = GetPortTextFace (thisPort);
#else
            short   savedFace = thisPort->txFont,
                    savedSize = thisPort->txSize;

            Style   savedStyle = thisPort->txFace;
#endif
            TextFont (kFontIDHelvetica);
            TextSize (12);
            TextFace (0);
            toolTipBounds.bottom = bT-1;
            toolTipBounds.top = toolTipBounds.bottom - 15;
            if (toolTipBounds.top<0) {
                toolTipBounds.top = bT+buttonDim+1;
                toolTipBounds.bottom = toolTipBounds.top+15;
            }
            h = GetVisibleStringWidth (*toolTip)+4;
            toolTipBounds.left = bL+(buttonDim-h-1)/2;
            if (toolTipBounds.left<=0) {
                toolTipBounds.left = 1;
            }
            toolTipBounds.right = toolTipBounds.left+h+2;
#ifdef OPAQUE_TOOLBOX_STRUCTS
            Rect portRect;
            GetPortBounds (thisPort,&portRect);
            h = toolTipBounds.right-portRect.right+portRect.left;
#else
            h = toolTipBounds.right-thisPort->portRect.right+thisPort->portRect.left;
#endif
            if (h>0) {
                if (h>=toolTipBounds.left) {
                    h = toolTipBounds.left-1;
                }
                toolTipBounds.left -= h;
                toolTipBounds.right-= h;
            }
            RGBColor oldColor;
            GetForeColor (&oldColor);
            toolTipColor.red = toolTipColor.blue = toolTipColor.green = 0x0000;
            RGBForeColor (&toolTipColor);
            FillCRect  (&toolTipBounds,toolTipPixPat);
            FrameRect  (&toolTipBounds);
            MoveTo (toolTipBounds.left+3,toolTipBounds.bottom-3);
            DrawText (toolTip->sData,0,toolTip->sLength);
            RGBForeColor (&oldColor);
            TextFont (savedFace);
            TextSize (savedSize);
            TextFace (savedStyle);
            DisposePixPat (toolTipPixPat);
        }
    }
    //#endif
}


//__________________________________________________________________

bool _HYButtonBar::_ProcessOSEvent (Ptr vEvent)
{
    EventRecord*    theEvent = (EventRecord*)vEvent;
    WindowPtr       dummy;
#ifdef          TARGET_API_MAC_CARBON
    if (!theTimer) {
        EventLoopRef      mainLoop;
        mainLoop = GetMainEventLoop();
        InstallEventLoopTimer (mainLoop,0,.5*kEventDurationSecond,timerUPP,this,&theTimer);
    }
#endif
    if (buttons.lLength)
        switch (theEvent->what) {
        case mouseDown: {
            if (toolTipBounds.left) {
#ifdef TARGET_API_MAC_CARBON
                InvalWindowRect (parentWindow,&toolTipBounds);
                //HMHideTag ();
#else
                InvalRect (&toolTipBounds);
#endif
                toolTipBounds.left = 0;
                GetDateTime (&lastSave);
            }
            long evtType = FindWindow (theEvent->where,&dummy);
            switch (evtType) {
            case inContent: {
                Point localClick = theEvent->where;
                GlobalToLocal (&localClick);
                int h = _FindClickedButton (localClick.h,localClick.v);
                if ((h>=0)&&(enabledButtons.Find(h)>=0)) {
                    if (pullDownButtons.Find(h)<0) {
                        long lastFound = h,
                             cf;
                        forceUpdateForScrolling = true;
                        pushed = h;
                        _MarkButtonForUpdate (h);
#ifdef TARGET_API_MAC_CARBON
                        MouseTrackingResult  trackingResult = kMouseTrackingMousePressed;
                        GetMouse (&localClick);
                        while (trackingResult != kMouseTrackingMouseReleased) {
                            TrackMouseLocation (NULL, &localClick, &trackingResult);
                            cf = _FindClickedButton(localClick.h,localClick.v);
                            if (cf!=lastFound) {
                                if (lastFound==h) {
                                    pushed = -1;
                                    _MarkButtonForUpdate (h);
                                } else if (cf==h) {
                                    pushed = h;
                                    _MarkButtonForUpdate (h);
                                }

                                lastFound = cf;
                            }
                        }
#else
                        while (WaitMouseUp()) {
                            GetMouse (&localClick);
                            cf = _FindClickedButton(localClick.h,localClick.v);
                            if (cf!=lastFound) {
                                if (lastFound==h) {
                                    pushed = -1;
                                    _MarkButtonForUpdate (h);
                                } else if (cf==h) {
                                    pushed = h;
                                    _MarkButtonForUpdate (h);
                                }

                                lastFound = cf;
                            }
                        }
#endif
                        pushed = -1;
                        forceUpdateForScrolling = false;
                    }
                    if (_FindClickedButton(localClick.h,localClick.v)==h) {
                        //pushed = h;
                        pushed = -1;
                        forceUpdateForScrolling = true;
                        _MarkButtonForUpdate (h);
                        forceUpdateForScrolling = false;
                        SendButtonPush(h);
                    }
                }
                return true;
            }
            }
            break;
        }
        default: {
            if (!StillDown()) {
                if (pushed>=0) {
                    _MarkButtonForUpdate (pushed);
                    pushed = -1;
                    return true;
                }
                if (theEvent->what == osEvt) {
                    unsigned long t;
                    GetDateTime(&t);
                    if ((theEvent->where.h==saveMousePosH)
                            &&(theEvent->where.v==saveMousePosV)) {
                        if ((t-lastSave>1)&&(!toolTipBounds.left)) {
                            _DisplayToolTip();
                            lastSave = t;
                        }
                    } else {
                        if (toolTipBounds.left) {
#ifdef TARGET_API_MAC_CARBON
                            InvalWindowRect (parentWindow,&toolTipBounds);
                            //HMHideTag ();
#else
                            InvalRect (&toolTipBounds);
#endif
                            toolTipBounds.left = 0;
                        }
                        saveMousePosH = theEvent->where.h;
                        saveMousePosV = theEvent->where.v;
                        lastSave = t;
                    }
                    return true;
                }
            }
        }
        }
    return _HYPlatformComponent::_ProcessOSEvent (vEvent);
}

//EOF
\ No newline at end of file
diff --git a/src/gui/mac/Components/HYPlatformCheckBox.cpp b/src/gui/mac/Components/HYPlatformCheckBox.cpp
new file mode 100644
index 0000000..041eddc
--- /dev/null
+++ b/src/gui/mac/Components/HYPlatformCheckBox.cpp
@@ -0,0 +1 @@
+/*
    Check box for Mac OS.

    Sergei L. Kosakovsky Pond, May 2000-December 2002
*/

#include "HYLabel.h"
#include <ControlDefinitions.h>


//__________________________________________________________________

void        _HYCheckbox::_Activate (void)
{
    if (!activationFlag)
        if (isEnabled&&checkboxControl) {
            HiliteControl (checkboxControl,0);
            //Draw1Control  (checkboxControl);
            _PaintMe();
        }

    _HYPlatformComponent::_Activate();
}

//__________________________________________________________________

void        _HYCheckbox::_Deactivate (void)
{
    if (activationFlag)
        if (isEnabled&&checkboxControl) {
            HiliteControl (checkboxControl, kControlInactivePart);
            //Draw1Control  (checkboxControl);
            _PaintMe();
        }

    _HYPlatformComponent::_Deactivate();
}

//__________________________________________________________________

bool _HYCheckbox::_ProcessOSEvent (Ptr vEvent)
{
    EventRecord*    theEvent = (EventRecord*)vEvent;
    WindowPtr       dummy;
    if (checkboxControl)
        switch (theEvent->what) {
        case mouseDown: {
            long evtType = FindWindow (theEvent->where,&dummy);
            if ((evtType == inContent)&&(isEnabled)) {
                Point localClick = theEvent->where;
                GlobalToLocal (&localClick);
                if (checkboxControl&&(PtInRect (localClick,&checkboxRect)))
                    if (!(isRadio&&checkState))
                        if (TrackControl (checkboxControl,localClick,nil)) {
                            SetState (!checkState, true);
                        }
            }
            return true;
        }
        }

    return _HYPlatformComponent::_ProcessOSEvent (vEvent);
}

//__________________________________________________________________

_HYRect     _HYCheckbox::_SuggestDimensions (void)
{
    _HYRect res = _HYLabel::_SuggestDimensions();
    if (aquaInterfaceOn) {
        res.left += checkSpacing*2 + 16;
    } else {
        res.left += checkSpacing*2 + 15;
    }

    res.right = res.left;
    return res;
}

//__________________________________________________________________
void        _HYPlatformCheckbox::_SetVisibleSize (_HYRect rel)
{
    _HYCheckbox * theParent = (_HYCheckbox*) this;

    theParent->labelRect.left= rel.left;
    theParent->labelRect.top = rel.top;

    _HYRect s = theParent->_SuggestDimensions();

    theParent->labelRect.right =  theParent->labelRect.left+s.right;
    theParent->labelRect.bottom = theParent->labelRect.top+s.bottom;

    AlignRectangle (rel, theParent->labelRect, theParent->GetAlignFlags());

    checkboxRect.left = theParent->labelRect.left + theParent->checkSpacing;
    checkboxRect.bottom = theParent->labelRect.bottom;
    if (aquaInterfaceOn) {
        checkboxRect.right = checkboxRect.left+16;
        checkboxRect.top = checkboxRect.bottom-15;

    } else {
        checkboxRect.right = checkboxRect.left+15;
        checkboxRect.top = checkboxRect.bottom-15;
    }

    if (aquaInterfaceOn) {
        theParent->labelRect.left += 16+2*theParent->checkSpacing;
    } else {
        theParent->labelRect.left += 15+2*theParent->checkSpacing;
    }

    if (checkboxControl) {
        MoveControl (checkboxControl,checkboxRect.left,checkboxRect.top);
    } else {
        GrafPtr      savePort;
        GetPort (&savePort);
#ifdef OPAQUE_TOOLBOX_STRUCTS
        SetPort (GetWindowPort(theParent->parentWindow));
#else
        SetPort (theParent->parentWindow);
#endif
        checkboxControl = NewControl (theParent->parentWindow,&checkboxRect,"\p",true,theParent->checkState,0,1,
                                      isRadio?kControlRadioButtonProc:kControlCheckBoxProc,0);
        SetPort (savePort);
    }
}

//__________________________________________________________________

void        _HYPlatformCheckbox::_Enable (bool e)
{
    if (checkboxControl) {
        if (e) {
            HiliteControl (checkboxControl,0);
        } else {
            HiliteControl (checkboxControl,kControlInactivePart);
        }

        _HYCheckbox * theParent = (_HYCheckbox*) this;
        if (e&&theParent->activationFlag)
            //Draw1Control  (checkboxControl);
        {
            _PaintMe();
        }
    }
}

//__________________________________________________________________
void        _HYPlatformCheckbox::_Update (Ptr p)
{
    _Paint (p);
}

//__________________________________________________________________
void        _HYPlatformCheckbox::_Paint (Ptr p)
{
    _HYCheckbox *theParent = (_HYCheckbox*) this;
    theParent->_HYPlatformLabel::_Paint(p);
    if (checkboxControl) {
        _PaintMe();
    }
}

//__________________________________________________________________
void        _HYPlatformCheckbox::_PaintMe (void)
{
    _HYCheckbox * theParent = (_HYCheckbox*)this;
    bool        drawBk = (!(theParent->settings.width&HY_COMPONENT_TRANSP_BG));

    GrafPtr     thisPort;
    GetPort     (&thisPort);

#ifdef OPAQUE_TOOLBOX_STRUCTS
    SetPort   (GetWindowPort(theParent->parentWindow));
#else
    SetPort   (theParent->parentWindow);
#endif

    RGBColor newBG,
             saveColor;

    if (drawBk) {
        GetBackColor (&saveColor);
        newBG.red = theParent->GetBackColor().R*256;
        newBG.blue = theParent->GetBackColor().B*256;
        newBG.green = theParent->GetBackColor().G*256;
        RGBBackColor (&newBG);
    }

    Draw1Control (checkboxControl);
    if (drawBk) {
        RGBBackColor (&saveColor);
    }

    SetPort     (thisPort);
}

//__________________________________________________________________
_HYPlatformCheckbox::_HYPlatformCheckbox (bool isR)
{
    checkboxControl = nil;
    isRadio = isR;
    checkboxRect = (Rect) {
        0,0,100,100
    };
}

//__________________________________________________________________
_HYPlatformCheckbox::~_HYPlatformCheckbox (void)
{
    if (checkboxControl) {
        DisposeControl (checkboxControl);
        checkboxControl = nil;
    }
}

//__________________________________________________________________
void    _HYPlatformCheckbox::_SetState (bool v)
{
    if (checkboxControl) {
        SetControlValue (checkboxControl, v);
    }
}


//EOF
\ No newline at end of file
diff --git a/src/gui/mac/Components/HYPlatformLabel.cpp b/src/gui/mac/Components/HYPlatformLabel.cpp
new file mode 100644
index 0000000..38a33e7
--- /dev/null
+++ b/src/gui/mac/Components/HYPlatformLabel.cpp
@@ -0,0 +1 @@
+/*
    Button component for Mac OS.

    Sergei L. Kosakovsky Pond, May 2000 - December 2002
*/

#include "HYLabel.h"
#include "HYUtils.h"

//__________________________________________________________________

_HYPlatformLabel::_HYPlatformLabel(void)
{
    backFill = NewPixPat();
    if (!backFill) {
        warnError (-108);
    }
    RGBColor  wht = {0xffff,0xffff,0xffff};
    MakeRGBPat (backFill,&wht);
    fontID = 0;
    fc.red = fc.blue = fc.green = 0;
}

//__________________________________________________________________

_HYPlatformLabel::~_HYPlatformLabel(void)
{
    if (backFill) {
        DisposePixPat (backFill);
    }

}

//__________________________________________________________________

void        _HYPlatformLabel::_SetBackColor (_HYColor& c)
{
    RGBColor newBG;
    newBG.red = c.R*256;
    newBG.blue = c.B*256;
    newBG.green = c.G*256;
    MakeRGBPat (backFill,&newBG);

}

//__________________________________________________________________

void        _HYPlatformLabel::_SetFont (_HYFont& f)
{
    Str255 fName;
    StringToStr255 (f.face,fName);
    short fNum=0;
    GetFNum (fName,&fNum);
    fontID = fNum;
}
//__________________________________________________________________

void        _HYPlatformLabel::_SetForeColor (_HYColor& c)
{
    fc.red = c.R*256;
    fc.green = c.G*256;
    fc.blue = c.B*256;
}

//__________________________________________________________________
void        _HYPlatformLabel::_Update (Ptr p)
{
    _Paint (p);
}

//__________________________________________________________________
void        _HYPlatformLabel::_SetDimensions (_HYRect r, _HYRect rel)
{
    _HYLabel* theParent = (_HYLabel*) this;
    theParent->_HYPlatformComponent::_SetDimensions (r,rel);
    _SetVisibleSize (rel);
}

//__________________________________________________________________
void        _HYPlatformLabel::_SetVisibleSize (_HYRect rel)
{
    _HYLabel* theParent = (_HYLabel*) this;
    labelRect.left=rel.left;
    labelRect.top = rel.top;
    _HYRect s = theParent->_SuggestDimensions();
    labelRect.right = labelRect.left+s.right;
    labelRect.bottom = labelRect.top+s.bottom;

    AlignRectangle (rel, labelRect, theParent->GetAlignFlags());
}


//__________________________________________________________________
void        _HYPlatformLabel::_Paint (Ptr p)
{

    _HYLabel * theParent = (_HYLabel*)this;

    _HYRect * relRect = (_HYRect*)p;
    Rect    cRect;
    cRect.left = relRect->left;
    cRect.right = relRect->right;
    cRect.top = relRect->top;
    cRect.bottom = relRect->bottom;

    if (!(theParent->settings.width&HY_COMPONENT_TRANSP_BG)) {
        FillCRect (&cRect,backFill);
    } else {
        EraseRect (&cRect);
    }

    if (!(theParent->settings.width&HY_COMPONENT_WELL)) {
        InsetRect (&cRect,2,2);
    }

    GrafPtr thisPort;
    GetPort (&thisPort);

#ifdef OPAQUE_TOOLBOX_STRUCTS
    short   savedFace = GetPortTextFont (thisPort),
            savedSize = GetPortTextSize (thisPort);

    Style   savedStyle = GetPortTextFace (thisPort);
#else
    short   savedFace = thisPort->txFont,
            savedSize = thisPort->txSize;

    Style   savedStyle = thisPort->txFace;
#endif


    TextFont (fontID);
    TextSize (theParent->GetFont().size);
    TextFace (theParent->GetFont().style);
    RgnHandle saveRgn = NewRgn();
    GetClip (saveRgn);
    ClipRect (&cRect);
    RGBColor oldColor;
    GetForeColor (&oldColor);
    if (theParent->HasShadow()) {
        MoveTo (labelRect.left+3,labelRect.bottom-3);
        RGBColor sc = fc;
        sc.red = fc.red/4;
        sc.blue  = fc.blue/4;
        sc.green = fc.green/4;
        RGBForeColor (&sc);
        DrawText (theParent->GetText().sData,0,theParent->GetText().sLength);
        MoveTo (labelRect.left+1,labelRect.bottom-1);
        sc.red = fc.red/2;
        sc.blue  = fc.blue/2;
        sc.green = fc.green/2;
        RGBForeColor (&sc);
        DrawText (theParent->GetText().sData,0,theParent->GetText().sLength);/*
        MoveTo (labelRect.left+1,labelRect.bottom-3);
        RGBColor sc = fc;
        sc.red = fc.red>127?255:fc.red*2;
        sc.blue  = fc.blue>127?255:fc.blue*2;
        sc.green = fc.green>127?255:fc.green*2;
        RGBForeColor (&sc);
        DrawText (theParent->GetText().sData,0,theParent->GetText().sLength);
        MoveTo (labelRect.left+3,labelRect.bottom-1);
        sc.red = fc.red/2;
        sc.blue  = fc.blue/2;
        sc.green = fc.green/2;
        RGBForeColor (&sc);
        DrawText (theParent->GetText().sData,0,theParent->GetText().sLength);*/

    }
    RGBForeColor (&fc);
    MoveTo (labelRect.left+2,labelRect.bottom-2);
    DrawText (theParent->GetText().sData,0,theParent->GetText().sLength);

    RGBForeColor (&oldColor);
    SetClip (saveRgn);
    DisposeRgn (saveRgn);
    TextFont (savedFace);
    TextSize (savedSize);
    TextFace (savedStyle);

    (*theParent)._HYPlatformComponent::_Paint(p);
}

//__________________________________________________________________
_HYRect _HYLabel::_SuggestDimensions (void)
{
    _HYRect res = {10,100,10,100,HY_COMPONENT_NO_SCROLL};
    GrafPtr thisPort;
    GetPort (&thisPort);
#ifdef OPAQUE_TOOLBOX_STRUCTS
    short   savedFace = GetPortTextFont (thisPort),
            savedSize = GetPortTextSize (thisPort);

    Style   savedStyle = GetPortTextFace (thisPort);
#else
    short   savedFace = thisPort->txFont,
            savedSize = thisPort->txSize;

    Style   savedStyle = thisPort->txFace;
#endif
    TextFont (fontID);
    TextSize (labelFont.size);
    TextFace (labelFont.style);
    res.top = res.bottom = labelFont.size+4;
    res.left = res.right = TextWidth (labelText.sData,0,labelText.sLength) + 5;
    TextFont (savedFace);
    TextSize (savedSize);
    TextFace (savedStyle);
    return res;
}

// EOF
\ No newline at end of file
diff --git a/src/gui/mac/Components/HYPlatformList.cpp b/src/gui/mac/Components/HYPlatformList.cpp
new file mode 100644
index 0000000..d16d76c
--- /dev/null
+++ b/src/gui/mac/Components/HYPlatformList.cpp
@@ -0,0 +1 @@
+/*
    List component for Mac OS API

    Sergei L. Kosakovsky Pond, May 2000-December 2002
*/

#include "errorfns.h"
#include "HYList.h"
#include "HYUtils.h"
#include "HYEventTypes.h"

#include "ToolUtils.h"
#include "Appearance.h"



_HYPlatformList::_HYPlatformList(void)
{
    listData = nil;
}

//__________________________________________________________________

_HYPlatformList::~_HYPlatformList(void)
{
    if (listData) {
        LDispose (listData);
    }
}

//__________________________________________________________________

void    _HYList::_Activate(void)
{
    if (listData) {
        LActivate (true, listData);
    }
    _HYPlatformComponent::_Activate();
}

//__________________________________________________________________

void    _HYList::_Deactivate(void)
{
    if (listData) {
        LActivate (false, listData);
    }
    _HYPlatformComponent::_Deactivate();
}

//__________________________________________________________________
void        _HYPlatformList::_SetVisibleSize (_HYRect rel)
{
    _HYList* theParent = (_HYList*) this;
    if (listData) {
        LDispose(listData);
    }

    SetWindowFont (fontID, theParent->GetFont().size, theParent->GetFont().style, true);
    Rect     listBox = {rel.top+1,rel.left,rel.bottom,rel.right-HY_SCROLLER_WIDTH},
             listDim = {0,0,theParent->ItemCount(),1};
    Point    cellSize = {0,0};
    listData = LNew(&listBox,&listDim,cellSize,0,(WindowPtr)theParent->parentWindow,true,false,false,true);
    checkPointer ((Ptr)listData);
    (*listData)->selFlags = lNoNilHilite|lUseSense;
    for (long k=0; k<theParent->ItemCount(); k++) {
        _SetItem (*theParent->GetItem(k),k);
    }

    SetWindowFont (0,0,0,false);
}

//__________________________________________________________________
void        _HYPlatformList::_Paint (Ptr p)
{
    _HYRect * relRec = (_HYRect*)p;
    Rect r;
    r.left = relRec->left;
    r.right = relRec->right;
    r.top = relRec->top;
    r.bottom = relRec->bottom;
    EraseRect (&r);
    if (listData) {
        _HYList* theParent = (_HYList*)this;
        SetWindowFont (fontID, theParent->GetFont().size, theParent->GetFont().style, true);
        LActivate (true,listData);
        LUpdate (GetGrayRgn(),listData);
        SetWindowFont (0,0,0,false);
    }
}

//__________________________________________________________________
void        _HYList::_EraseRect (_HYRect relRec)
{
    Rect r;
    r.left = relRec.left;
    r.right = relRec.right;
    r.top = relRec.top;
    r.bottom = relRec.bottom;
    EraseRect (&r);
}

//__________________________________________________________________
void        _HYPlatformList::_Update (Ptr p)
{
    _Paint (p);
}

//__________________________________________________________________
void        _HYPlatformList::_SetDimensions (_HYRect r, _HYRect rel)
{
    _HYList* theParent = (_HYList*) this;
    theParent->_HYPlatformComponent::_SetDimensions (r,rel);
    _SetVisibleSize (rel);
}

//__________________________________________________________________
void        _HYPlatformList::_SetFont (void)
{
    _HYList* theParent = (_HYList*)this;
    Str255 fName;
    StringToStr255 (theParent->GetFont().face,fName);
    GetFNum (fName,&fontID);
}

//__________________________________________________________________

bool _HYList::_ProcessOSEvent (Ptr vEvent)
{
    EventRecord*    theEvent = (EventRecord*)vEvent;

    if (listData) {
        if(theEvent->what==mouseDown) {
            Point localClick = theEvent->where;
            GlobalToLocal (&localClick);
            if (LClick (localClick,theEvent->modifiers,listData)) {
                _CheckSelection();
                if (selection.lLength==1) {
                    SendDblClickEvent(selection.lData[0]);
                    return true;
                }
            } else {
                _CheckSelection();
            }
            if (messageRecipient) {
                messageRecipient->ProcessEvent(generateKeyboardFocusEvent(GetID()));
            }
            return true;
        } else if((theEvent->what==keyDown)||(theEvent->what==autoKey)) {
            unsigned char keyCode = (theEvent->message&keyCodeMask)>>8;
            Cell     thisCell= {0,0};
            if (selection.lLength==1) {
                if (keyCode==0x7E) { // up arrow
                    if (selection.lData[0]) {
                        thisCell.v = selection.lData[0];
                        LSetSelect (false,thisCell,listData);
                        selection.lData[0]--;
                        thisCell.v--;
                        LSetSelect (true,thisCell,listData);
                        LAutoScroll(listData);
                        _MarkForUpdate();
                        SendSelectionChange();
                        return true;
                    }
                } else if (keyCode==0x7D) { // down arrow
                    if (selection.lData[0]<items.lLength-1) {
                        thisCell.v = selection.lData[0];
                        LSetSelect (false,thisCell,listData);
                        selection.lData[0]++;
                        thisCell.v++;
                        LSetSelect (true,thisCell,listData);
                        LAutoScroll(listData);
                        _MarkForUpdate();
                        SendSelectionChange();
                        return true;
                    }
                }

            }
        }
    }
    return _HYPlatformComponent::_ProcessOSEvent (vEvent);
}

//__________________________________________________________________

void _HYPlatformList::_ToggleMultSelection (bool flag)
{
    if (listData) {
        if (flag) {
            (*listData)->selFlags&=0x7F;
        } else {
            (*listData)->selFlags|=0x80;
        }
    }
}

//__________________________________________________________________

void _HYPlatformList::_CheckSelection (void)
{
    if (listData) {
        _HYList * theParent = (_HYList*)this;
        _SimpleList newSelection;
        Cell        scrollCell = {0,0};
        while (LGetSelect (true,&scrollCell,listData)) {
            newSelection<<scrollCell.v;
            scrollCell.v++;
        }
        if (!theParent->GetSelection().Equal(newSelection)) {
            theParent->GetSelection().Clear();
            theParent->GetSelection().Duplicate (&newSelection);
            theParent->SendSelectionChange();
        }
    }
}

//__________________________________________________________________

void _HYPlatformList::_SetSelection (_SimpleList& nSel)
{
    if (listData) {
        _KillSelection();
        if (nSel.lLength) {
            Cell scrollCell = {0,0};
            for (long k=0; k<nSel.lLength; k++) {
                scrollCell.v = nSel.lData[k];
                LSetSelect (true,scrollCell,listData);
            }
            LAutoScroll (listData);
        }
    }
}

//__________________________________________________________________

void _HYPlatformList::_KillSelection (void)
{
    if (listData) {
        Cell        scrollCell = {0,0};
        while (LGetSelect (true,&scrollCell,listData)) {
            LSetSelect (false,scrollCell,listData);
            scrollCell.v++;
        }
    }
}

//__________________________________________________________________

void _HYPlatformList::_InsertItem (_String& item, long index)
{
    if (listData) {
        if (index<0) {
            index = 10000;
        }
        index = LAddRow(1,index,listData);
        Cell    thisCell = {index,0};
        LSetCell(item.sData,item.sLength,thisCell,listData);
    }
}

//__________________________________________________________________

void _HYPlatformList::_SetItem (_String& item, long index)
{
    if (listData) {
        Cell    thisCell = {index,0};
        LSetCell(item.sData,item.sLength,thisCell,listData);
    }
}

//__________________________________________________________________

void _HYList::_ToggleDrawing (bool onOff)
{
    if (listData) {
        LSetDrawingMode (onOff,listData);
    }
}

//__________________________________________________________________

void _HYPlatformList::_DeleteItem (long index)
{
    if (listData) {
        LDelRow(1,index,listData);
    }
    //_CheckSelection();
}


//EOF
\ No newline at end of file
diff --git a/src/gui/mac/Components/HYPlatformPullDown.cpp b/src/gui/mac/Components/HYPlatformPullDown.cpp
new file mode 100644
index 0000000..9d157e3
--- /dev/null
+++ b/src/gui/mac/Components/HYPlatformPullDown.cpp
@@ -0,0 +1 @@
+/*
    Button component for Mac OS.

    Sergei L. Kosakovsky Pond, May 2000.
*/

#include "errorfns.h"
#include "HYPullDown.h"
#include "HYUtils.h"
#include "HYEventTypes.h"

#include "ToolUtils.h"


long    menuIDCounter = 20000;


//__________________________________________________________________

_HYPlatformPullDown::_HYPlatformPullDown(void)
{
    myID = menuIDCounter++;
    myMenu = NewMenu(myID,"\p");
    backFill = NewPixPat();
    if ((!backFill)||(!myMenu)) {
        warnError (-108);
    }
    InsertMenu (myMenu,hierMenu);
    RGBColor  wht = {0xffff,0xffff,0xffff};
#ifdef TARGET_API_MAC_CARBON
    EnableMenuItem (myMenu,0);
#else
    EnableItem (myMenu,0);
#endif
    MakeRGBPat (backFill,&wht);
    selection = 0;

}

//__________________________________________________________________

_HYPlatformPullDown::~_HYPlatformPullDown(void)
{
    if (myMenu) {
        DeleteMenu (myID);
        DisposeMenu (myMenu);
    }
    if (backFill) {
        DisposePixPat (backFill);
    }
}

//__________________________________________________________________
void        _HYPlatformPullDown::_AddMenuItem   (_String& newItem, long index)
{
    if (!myMenu) {
        return;
    }

    if (index<=0) {
        index = 10000;
    }

    if (!newItem.Equal(&menuSeparator)) {
        Str255          menuText;
        bool            disableMe = false;
        if (newItem.sLength && newItem.sData[0] == '(') {
            _String         skipString (newItem,1,-1);
            StringToStr255  (skipString,menuText);
            disableMe = true;
        } else {
            StringToStr255 (newItem,menuText);
        }

        InsertMenuItem (myMenu,"\pa",index);

        long            mc = ((_HYPullDown*)this)->MenuItemCount();

        if (index<mc-1) {
            index++;
        } else {
            index = mc;
        }

        if (menuText[0]>250) {
            menuText[0] = 250;
        }

        SetMenuItemText (myMenu, index, menuText);
        if (disableMe) {
            DisableMenuItem (myMenu, index);
        }
    } else {
        InsertMenuItem (myMenu,"\p(-",index);
    }
}

//__________________________________________________________________
void        _HYPlatformPullDown::_SetMenuItem   (_String& newItem, long index)
{
    if (!myMenu) {
        return;
    }
    index++;
    if (!newItem.Equal(&menuSeparator)) {
        Str255 menuText;
        StringToStr255 (newItem,menuText);
        SetMenuItemText (myMenu,index,menuText);
    } else {
        SetMenuItemText (myMenu,index,"\p(-");
    }
}

//__________________________________________________________________
void        _HYPlatformPullDown::_MarkItem      (long index, char mark)
{
    if (!myMenu) {
        return;
    }

    switch (mark) {
    case HY_PULLDOWN_CHECK_MARK:
        mark = checkMark;
        break;

    case HY_PULLDOWN_DIAMOND_MARK:
        mark = diamondMark;
        break;

    case HY_PULLDOWN_BULLET_MARK:
        mark = 0xA5;
        break;

    default:
        mark = noMark;
    }
    SetItemMark (myMenu,index+1,mark);
}

//__________________________________________________________________
char        _HYPlatformPullDown::_ItemMark      (long index)
{
    if (!myMenu) {
        return 0;
    }

    short   mark;
    GetItemMark (myMenu, index+1,&mark);

    switch (mark) {
    case checkMark:
        return HY_PULLDOWN_CHECK_MARK;

    case diamondMark:
        return HY_PULLDOWN_DIAMOND_MARK;

    case 0xA5:
        return HY_PULLDOWN_BULLET_MARK;

    }
    return HY_PULLDOWN_NO_MARK;
}

//__________________________________________________________________
void        _HYPlatformPullDown::_DeleteMenuItem  (long index)
{
    if (!myMenu) {
        return;
    }
    DeleteMenuItem (myMenu,index+1);
}

//__________________________________________________________________

void        _HYPlatformPullDown::_SetBackColor (_HYColor& c)
{
    RGBColor newBG;
    newBG.red = c.R*256;
    newBG.blue = c.B*256;
    newBG.green = c.G*256;
    MakeRGBPat (backFill,&newBG);

}

//__________________________________________________________________
long        _HYPlatformPullDown::_GetSelection (void)
{
    return selection;
}

//__________________________________________________________________
void        _HYPlatformPullDown::_Duplicate (Ptr p)
{
    _HYPullDown * theSource = (_HYPullDown*) p;
    myMenu                  = theSource->myMenu;
    myID                    = theSource->myID;
    selection               = theSource->selection;
    backFill                = theSource->backFill;
    theSource->backFill     = nil;
    theSource->myMenu       = nil;
}

//__________________________________________________________________
void        _HYPlatformPullDown::_Update (Ptr p)
{
    _Paint (p);
}

//__________________________________________________________________
void        _HYPlatformPullDown::_SetDimensions (_HYRect r, _HYRect rel)
{
    _HYPullDown* theParent = (_HYPullDown*) this;
    theParent->_HYPlatformComponent::_SetDimensions (r,rel);
    _SetVisibleSize (rel);
}

//__________________________________________________________________
void        _HYPlatformPullDown::_SetVisibleSize (_HYRect rel)
{
    _HYPullDown* theParent = (_HYPullDown*) this;
    menuRect.left   = rel.left+3;
    menuRect.bottom = rel.bottom;
    menuRect.right  = rel.right-3;
    menuRect.top    = rel.top;
    if (myMenu) {
        CalcMenuSize (myMenu);
        if (menuRect.bottom-menuRect.top>20) {
            menuRect.bottom = menuRect.top+20;
        }
#ifdef OPAQUE_TOOLBOX_STRUCTS
        if (menuRect.right-menuRect.left>GetMenuWidth (myMenu)+22) {
            menuRect.right = menuRect.left+GetMenuWidth (myMenu) +22;
        }
#else
        if (menuRect.right-menuRect.left>(*myMenu)->menuWidth+22) {
            menuRect.right = menuRect.left+(*myMenu)->menuWidth+22;
        }
#endif
    }

    AlignRectangle (rel, menuRect, theParent->GetAlignFlags());
}
//__________________________________________________________________
void        _HYPlatformPullDown::_EnableItem (long theItem, bool toggle)
{
    if (myMenu)
        if (toggle)
#ifdef TARGET_API_MAC_CARBON
            EnableMenuItem (myMenu,theItem+1);
#else
            EnableItem (myMenu,theItem+1);
#endif
        else
#ifdef TARGET_API_MAC_CARBON
            DisableMenuItem (myMenu,theItem+1);
#else
            DisableItem (myMenu,theItem+1);
#endif
}

//__________________________________________________________________
void        _HYPlatformPullDown::_Paint (Ptr p)
{
    _HYPullDown * theParent = (_HYPullDown*)this;

    _HYRect * relRect = (_HYRect*)p;
    Rect    cRect;
    cRect.left = relRect->left;
    cRect.right = relRect->right;
    cRect.top = relRect->top;
    cRect.bottom = relRect->bottom;
    if (!(theParent->settings.width&HY_COMPONENT_TRANSP_BG)) {
        FillCRect (&cRect,backFill);
    } else {
        EraseRect (&cRect);
    }

    if (theParent->MenuItemCount()) {
        DrawMenuPlaceHolder (menuRect,*theParent->GetMenuItem(selection),theParent->IsEnabled()&&theParent->activationFlag);
    }

    (*theParent)._HYPlatformComponent::_Paint(p);
}

//__________________________________________________________________
_HYRect _HYPullDown::_SuggestDimensions (void)
{
    _HYRect res = {25,100,25,100,HY_COMPONENT_NO_SCROLL};
#ifdef OPAQUE_TOOLBOX_STRUCTS
    if (myMenu) {
        res.right = GetMenuWidth (myMenu)+22;
    }
#else
    if (myMenu) {
        res.right = (*myMenu)->menuWidth+22;
    }
#endif
    return res;
}

//__________________________________________________________________

void    _HYPullDown::_SetMenuItemTextStyle (long ID, char style)
{
    if (myMenu) {
        SetItemStyle (myMenu,ID+1,style);
    }
}

//__________________________________________________________________

bool _HYPullDown::_ProcessOSEvent (Ptr vEvent)
{
    EventRecord*    theEvent = (EventRecord*)vEvent;
    if (myMenu)
        switch (theEvent->what) {
        case mouseDown: {
            if (enabledFlag) {
                Point localClick = theEvent->where;
                GlobalToLocal (&localClick);
                if (PtInRect(localClick,&menuRect)) {
                    if (messageRecipient) {
                        messageRecipient->ProcessEvent (generateMenuOpenEvent (GetID()));
                    }

                    localClick.v = menuRect.top;
                    localClick.h = menuRect.left;
                    LocalToGlobal(&localClick);
                    SetItemMark (myMenu,selection+1,checkMark);
                    unsigned long res = PopUpMenuSelect (myMenu,localClick.v, localClick.h, selection+1);
                    SetItemMark (myMenu,selection+1,noMark);
                    if (HiWord(res)!=0) {
                        selection = LoWord(res)-1;
                        SendSelectionChange();
                        _MarkForUpdate();
                    }
                }
            }
            return true;
        }
        }
    return _HYPlatformComponent::_ProcessOSEvent (vEvent);
}

//EOF
\ No newline at end of file
diff --git a/src/gui/mac/Components/HYPlatformSequencePane.cpp b/src/gui/mac/Components/HYPlatformSequencePane.cpp
new file mode 100644
index 0000000..a89b945
--- /dev/null
+++ b/src/gui/mac/Components/HYPlatformSequencePane.cpp
@@ -0,0 +1 @@
+/*
    Sequence Panel for Mac OS API

    Sergei L. Kosakovsky Pond, May 2000-December 2002
*/

#include "errorfns.h"
#include "HYSequencePanel.h"
#include "HYUtils.h"
#include "HYEventTypes.h"
#include "HYPlatformWindow.h"

#include "ToolUtils.h"
#include "Appearance.h"


//__________________________________________________________________

void    _HYSequencePane::_Paint (Ptr p)
{
    long        saveBorder = settings.width & HY_COMPONENT_BORDER;
    settings.width -= saveBorder;
    _HYPlatformComponent::_Paint(p);
    settings.width += saveBorder;
    _HYRect*    destR = (_HYRect*)p;

    Rect        srcRect,
                destRect;

    destRect.right      = destR->right;
    destRect.bottom     = destR->bottom;
    if (HasHScroll()) {
        destRect.bottom-= HY_SCROLLER_WIDTH;
    }

    if (HasVScroll()) {
        destRect.right -= HY_SCROLLER_WIDTH;
    }

    destRect.left       = destR->left;
    destRect.top        = destR->top;
    _HYRect srcR        = _VisibleContents (p);
    srcRect.right       = srcR.right-srcR.left;
    srcRect.left        = 0;
    srcRect.bottom      = srcR.bottom-srcR.top;
    srcRect.top         = 0;

    RGBColor         white = {0xffff,0xffff,0xffff};
    RGBBackColor (&white);
    white.red = white.green = white.blue = 0;
    RGBForeColor (&white);
    LockPixels (GetGWorldPixMap(thePane));
#ifdef OPAQUE_TOOLBOX_STRUCTS
    CopyBits (GetPortBitMapForCopyBits(thePane),GetPortBitMapForCopyBits(GetWindowPort(parentWindow)),&srcRect,&destRect,srcCopy,(RgnHandle)nil);
#else
    CopyBits (&(GrafPtr(thePane)->portBits),&(parentWindow->portBits),&srcRect,&destRect,srcCopy,(RgnHandle)nil);
#endif
    UnlockPixels (GetGWorldPixMap(thePane));
}

//__________________________________________________________________

bool _HYSequencePane::_ProcessOSEvent (Ptr vEvent)
{
    if (_HYPlatformComponent::_ProcessOSEvent (vEvent)) {
        return true;
    }
    EventRecord*    theEvent = (EventRecord*)vEvent;

    if (!active) {
        return false;
    }

    static  UInt32  lastClick = 0;

    static  int     lastH = 0,
                    lastV = 0;

    switch (theEvent->what) {
    case mouseDown: {
        Point p = theEvent->where;
        GlobalToLocal (&p);
        bool    dblClick = (theEvent->when-lastClick<GetDblTime())&&
                           (abs(p.h-lastH)<5)&&
                           (abs(p.v-lastV)<5);
        lastClick = theEvent->when;
        lastH = p.h;
        lastV = p.v;


        Point localClick = theEvent->where;
        bool  vertical;
        GlobalToLocal (&localClick);
        if ((!(theEvent->modifiers&shiftKey)||(theEvent->modifiers&cmdKey))) {
            forceUpdateForScrolling = true;
        }
        localClick.h -= rel.left;
        localClick.v -= rel.top;
        vertical = (localClick.h<headerWidth)&&(localClick.v>=(GetSlotHeight()+1));
        if (theEvent->modifiers&controlKey) {
            if ((vertical&&vselection.lLength)||((!vertical)&&selection.lLength)) {
                ProcessContextualPopUp (theEvent->where.h, theEvent->where.v);
                return true;
            }
        }
        if (vertical) {
            ProcessVSelectionChange (localClick.h,localClick.v,theEvent->modifiers&shiftKey,theEvent->modifiers&cmdKey, false, dblClick);
        } else {
            ProcessSelectionChange (localClick.h,localClick.v,theEvent->modifiers&shiftKey,theEvent->modifiers&cmdKey);
        }

        if (((vertical&&(vselection.lLength==1))||((!vertical)&&(selection.lLength==1)))&&StillDown()) {
            Point localClick = theEvent->where;
            GlobalToLocal (&localClick);
            localClick.h -= rel.left;
            localClick.v -= rel.top;
            long  lastClick = -2, slotHeight = GetSlotHeight(),
                  firstClick = (localClick.v-(GetSlotHeight()+1))/slotHeight,
                  wHeight = rel.bottom-rel.top-HY_SCROLLER_WIDTH,
                  originalStart = startRow,
                  originalSpan  = endRow-startRow;

            if (vertical) {
                PenMode (patXor);
            }
            forceUpdateForScrolling = true;

            while (WaitMouseUp()) {
                Point mousePos;
                GetMouse (&mousePos);
                mousePos.h -= rel.left;
                mousePos.v -= rel.top;
                if (vertical) {
                    if ((mousePos.v<(GetSlotHeight()+1))||(localClick.v!=mousePos.v)||(mousePos.v>wHeight)) {
                        localClick = mousePos;
                        if (mousePos.v>wHeight) {
                            // scroll down
                            if ((endRow<=speciesIndex.lLength)&&(vselection.lData[0]!=speciesIndex.lLength-1)) {
                                if (endRow-startRow<originalSpan) {
                                    continue;
                                }
                                startRow++;
                                endRow++;
                                _SetVScrollerPos(((double)MAX_CONTROL_VALUE*startRow)/
                                                 (speciesIndex.lLength-endRow+startRow+1));
                                BuildPane();
                                _MarkForUpdate();
                                lastClick = -2;
                            }
                            continue;
                        } else {
                            mousePos.v-=(GetSlotHeight()+1);
                            if (mousePos.v<=slotHeight) {
                                if (mousePos.v>=0) {
                                    if (mousePos.v<slotHeight/2) {
                                        mousePos.v = -1;
                                    } else {
                                        mousePos.v = 0;
                                    }
                                } else {
                                    // scroll up
                                    if (startRow>0) {
                                        startRow--;
                                        endRow--;
                                        _SetVScrollerPos(((double)MAX_CONTROL_VALUE*startRow)/(speciesIndex.lLength-endRow+startRow+1));
                                        BuildPane();
                                        _MarkForUpdate();
                                        lastClick = -2;
                                    }
                                    continue;
                                }
                            } else {
                                mousePos.v=(mousePos.v-(GetSlotHeight()+1))/slotHeight;
                            }
                        }

                        if ((mousePos.v<-1)||(mousePos.v>=(endRow-startRow))) {
                            continue;
                        }
                        if (mousePos.v!=lastClick) {
                            if (lastClick>=-1) {
                                lastClick = (GetSlotHeight()+1)+slotHeight*(lastClick+1)+rel.top+1;
                                MoveTo(rel.left+1,lastClick);
                                LineTo(rel.left+headerWidth-1,lastClick);
                            }
                            lastClick = mousePos.v;
                            if (lastClick+startRow!=firstClick+originalStart) {
                                mousePos.v = (GetSlotHeight()+1)+slotHeight*(lastClick+1)+rel.top+1;
                                MoveTo(rel.left+1,mousePos.v);
                                LineTo(rel.left+headerWidth-1,mousePos.v);
                            }
                        }
                    }
                } else {
                    if ((mousePos.h<headerWidth)||(localClick.h!=mousePos.h)||(mousePos.h>_HYCanvas::GetMaxW()-5)) {
                        ProcessSelectionChange (mousePos.h,mousePos.v,true,true,true);
                        localClick = mousePos;
                    }
                }
            }
            if  (vertical) {
                Rect invalRect = {rel.top+(GetSlotHeight()+1)+1,rel.left,rel.bottom-HY_SCROLLER_WIDTH,rel.left+headerWidth};
#ifdef TARGET_API_MAC_CARBON
                InvalWindowRect (parentWindow,&invalRect);
#else
                InvalRect (&invalRect);
#endif
                if ((localClick.h<headerWidth)&&(localClick.h>0)&&(lastClick>-2)) {
                    MoveSpecies (firstClick+originalStart,lastClick+startRow);
                }
                PenMode (patCopy);
            }
        }
        forceUpdateForScrolling = false;
        return true;
    }
    }
    return false;
}


//EOF
\ No newline at end of file
diff --git a/src/gui/mac/Components/HYPlatformTable.cpp b/src/gui/mac/Components/HYPlatformTable.cpp
new file mode 100644
index 0000000..8f66c9c
--- /dev/null
+++ b/src/gui/mac/Components/HYPlatformTable.cpp
@@ -0,0 +1 @@
+/*
    Table component for Mac OS API

    Sergei L. Kosakovsky Pond, May 2000-December 2002
*/

#include "errorfns.h"
#include "HYTableComponent.h"
#include "HYUtils.h"
#include "HYEventTypes.h"
#include "HYPlatformWindow.h"
#include "HYPlatformGraphicPane.h"

#include "ToolUtils.h"
#include "Appearance.h"

//__________________________________________________________________

#if TARGET_API_MAC_CARBON
#include <PMApplication.h>
extern PMPageFormat     gPageFormat;
extern PMPrintSettings  gPrintSettings;
extern Handle           gFlattenedFormat;
extern Handle           gFlattenedSettings;
#else
#include <Printing.h>
extern THPrint prRecHdl;
#endif


//__________________________________________________________________

extern      Cursor      hSizeCursor,
            editStateCursor;

extern      CCrsrHandle pickUpCursor,
            dropOffCursor;

extern      Pattern     penHatchPattern,
            vertPenHatchPattern;

extern      RGBColor    menuLine1,
            menuLine2;

extern      CIconHandle tablePDMenuIcon;


//__________________________________________________________________

_HYPlatformTable::_HYPlatformTable(void)
{
    fontID = 0;
    backPattern  = NewPixPat();
    backPattern2 = NewPixPat();
    cursorState  = false;
    editBox      = nil;
}

//__________________________________________________________________

_HYPlatformTable::~_HYPlatformTable(void)
{
    DisposePixPat (backPattern);
    DisposePixPat (backPattern2);
}

//__________________________________________________________________

void        _HYPlatformTable::_SetFont (void)
{
    _HYTable* parent = (_HYTable*)this;
    Str255 fName;
    StringToStr255 (parent->textFont.face,fName);
    short fNum=0;
    GetFNum (fName,&fNum);
    fontID = fNum;
}

//__________________________________________________________________
void        _HYTable::_HScrollTable (long h)
{
    if (h) {
        GrafPtr   savePort;
        GetPort   (&savePort);
#ifdef OPAQUE_TOOLBOX_STRUCTS
        SetPort   (GetWindowPort(parentWindow));
#else
        SetPort   (parentWindow);
#endif
        long        vsShift = ((settings.width&HY_COMPONENT_H_SCROLL)?HY_SCROLLER_WIDTH:0),
                    hsShift = ((settings.width&HY_COMPONENT_V_SCROLL)?HY_SCROLLER_WIDTH:0);
        EditBoxHandler  (-1,rel);
        if (abs(h)>(rel.right-rel.left)/2) {
            _Paint((Ptr)&rel);
        } else {
            RgnHandle updateRgn = NewRgn();
            checkPointer (updateRgn);
            Rect      scrollRect;
            _HYRect   paintRect;
            scrollRect.top = rel.top;
            scrollRect.bottom = rel.bottom-vsShift;
            scrollRect.right = rel.right-hsShift-1;
            scrollRect.left  = rel.left;
            paintRect.top = scrollRect.top;
            paintRect.bottom = rel.bottom;
            if (h>0) {
                ScrollRect (&scrollRect,-h,0,updateRgn);
                paintRect.right = scrollRect.right+hsShift;
                paintRect.left = scrollRect.right-h;
                hOrigin+=paintRect.left-rel.left;
                Paint((Ptr)&paintRect);
                hOrigin-=paintRect.left-rel.left;
            } else {
                ScrollRect (&scrollRect,-h,0,updateRgn);
                paintRect.left = scrollRect.left;
                paintRect.right = paintRect.left-h+hsShift;
                Paint((Ptr)&paintRect);
            }
            DisposeRgn (updateRgn);
        }
        SetPort (savePort);
    }
}

//__________________________________________________________________
void        _HYTable::_VScrollTable (long v)
{
    if (v) {
        GrafPtr   savePort;
        GetPort   (&savePort);
#ifdef OPAQUE_TOOLBOX_STRUCTS
        SetPort   (GetWindowPort(parentWindow));
#else
        SetPort   (parentWindow);
#endif
        long        vsShift = ((settings.width&HY_COMPONENT_H_SCROLL)?HY_SCROLLER_WIDTH:0),
                    hsShift = ((settings.width&HY_COMPONENT_V_SCROLL)?HY_SCROLLER_WIDTH:0);
        EditBoxHandler  (-1,rel);
        if (abs(v)>(rel.bottom-rel.top)/2) {
            _Paint((Ptr)&rel);
        } else {
            RgnHandle updateRgn = NewRgn();
            checkPointer (updateRgn);
            Rect      scrollRect;
            _HYRect   paintRect;
            scrollRect.left = rel.left;
            scrollRect.right = rel.right-hsShift;
            paintRect.left = scrollRect.left;
            paintRect.right = rel.right;
            scrollRect.top = rel.top;
            scrollRect.bottom  = rel.bottom-vsShift;
            if (v>0) {
                ScrollRect (&scrollRect,0,-v,updateRgn);
                paintRect.top = rel.bottom-vsShift-v-1;
                paintRect.bottom = rel.bottom;
                vOrigin+=paintRect.top-rel.top;
                Paint((Ptr)&paintRect);
                vOrigin-=paintRect.top-rel.top;
            } else {
                ScrollRect (&scrollRect,0,-v,updateRgn);
                paintRect.top = rel.top;
                paintRect.bottom = rel.top-v+vsShift+2;
                Paint((Ptr)&paintRect);
            }
            DisposeRgn (updateRgn);
        }
        SetPort (savePort);
    }
}


//__________________________________________________________________

void        _HYTable::_ComponentMouseExit (void)
{
    if (cursorState) {
        cursorState = 0;
#ifdef TARGET_API_MAC_CARBON
        Cursor arrow;
        SetCursor(GetQDGlobalsArrow(&arrow));
#else
        SetCursor (&qd.arrow);
#endif
    }
}
//__________________________________________________________________

bool        _HYTable::_ProcessOSEvent (Ptr vEvent)
{
    EventRecord*    theEvent = (EventRecord*)vEvent;
    WindowPtr       dummy;

    static  UInt32  lastClick = 0;
    static  int     lastH = 0, lastV = 0;

    long            k,h,v,
                    vsShift = ((settings.width&HY_COMPONENT_H_SCROLL)?HY_SCROLLER_WIDTH:0),
                    hsShift = ((settings.width&HY_COMPONENT_V_SCROLL)?HY_SCROLLER_WIDTH:0);

    switch (theEvent->what) {
    case mouseDown: {
        Point p = theEvent->where;
        GlobalToLocal (&p);
        bool    dblClick = (theEvent->when-lastClick<GetDblTime())&&
                           (abs(p.h-lastH)<5)&&
                           (abs(p.v-lastV)<5);
        lastClick = theEvent->when;
        lastH = p.h;
        lastV = p.v;

        if ((selectionType&HY_TABLE_FOCUSABLE)&&messageRecipient&&((selectionType&HY_TABLE_IS_FOCUSED)==0)) {
            messageRecipient->ProcessEvent(generateKeyboardFocusEvent (GetID()));
            //return true;
        }

        long evtType = FindWindow (theEvent->where,&dummy);
        switch (evtType) {
        case inContent: {
            if (cursorState == HY_TABLE_SIZE_CURSOR) {
                EditBoxHandler (-1,rel);
                RgnHandle       dragRgn = NewRgn();
                checkPointer    (dragRgn);
                Rect  limits;
                limits.left = p.h;
                limits.right = limits.left+1;
                limits.top = rel.top;
                limits.bottom = rel.bottom-vsShift;
                RectRgn       (dragRgn, &limits);
                limits.right = rel.right-hsShift;

                p.h+=hOrigin;
                for (evtType = 0; evtType<horizontalSpaces.lLength-1; evtType++)
                    if (horizontalSpaces.lData[evtType]>p.h-2-rel.left) {
                        break;
                    }
                if (evtType) {
                    limits.left = rel.left+horizontalSpaces.lData[evtType-1]+3-hOrigin;
                } else {
                    limits.left = rel.left+3;
                }

                long dragRes = horizontalSpaces.lData[horizontalSpaces.lLength-1]-
                               rel.right+rel.left-hOrigin+hsShift;

                if (dragRes<p.h-limits.left) {
                    limits.left = p.h-dragRes;
                }
                p.h-=hOrigin;
                dragRes = DragGrayRgn(dragRgn,p,&limits,&limits,hAxisOnly,nil);
                DisposeRgn (dragRgn);
                cursorState = false;
#ifdef TARGET_API_MAC_CARBON
                Cursor arrow;
                SetCursor(GetQDGlobalsArrow(&arrow));
#else
                SetCursor (&qd.arrow);
#endif
                if (dragRes!=kMouseUpOutOfSlop) {
                    SetColumnSpacing (evtType,(short)(dragRes&0x0000ffff),true);
                    if (messageRecipient)
                        messageRecipient->ProcessEvent (generateTableResizeCEvent(GetID(),
                                                        evtType,(short)(dragRes&0x0000ffff)));
                }
            } else {
                if (editBox&&PtInRect (p,&textBoxRect)) {
                    TEClick (p,theEvent->modifiers&shiftKey, editBox);
                } else {
                    if (((k=FindClickedTableCell (p.h-rel.left,p.v-rel.top,h,v))>-1)&&
                            (p.v<rel.bottom-vsShift)&&(p.h<rel.right-hsShift)) {
                        if (dblClick) {
                            if (cellTypes.lData[k]&HY_TABLE_EDIT_TEXT) {
                                EditBoxHandler (k,rel);
                            } else if (messageRecipient) {
                                messageRecipient->ProcessEvent (generateTableDblClickEvent(GetID()));
                            }
                            break;
                        }
                        ModifySelection (h,v,theEvent->modifiers&shiftKey,theEvent->modifiers&controlKey, true);
                    }

                    if (k==-2)
                        // process pull-down
                    {
                        if (messageRecipient) {
                            messageRecipient->ProcessEvent (generateTablePullDownEvent(GetID(),v*horizontalSpaces.lLength+h,
                                                            (((long)theEvent->where.h)<<16)+theEvent->where.v));
                        }
                        //_HandlePullDown (sampleMenu,theEvent->where.h,theEvent->where.v,2);
                        break;
                    }

                    if ((p.h<rel.right-hsShift)&&(p.v<rel.bottom-vsShift))
                        if (StillDown()) {
                            PenState    savePen;
                            GetPenState (&savePen);
                            bool    first = true;
                            Point   newPt, oldPt = p;
                            long    t,t2 = -1;
                            FindClickedTableCell(p.h-rel.left,p.v-rel.top,h,t);

                            if (cursorState == HY_TABLE_DRAG_CURSOR) {
                                SetCCursor (dropOffCursor);
                                //PenMode      (patXor);
                                PenSize    (1,1);
                                while ( WaitMouseUp() ) {
                                    GetMouse(&newPt);
                                    if ((newPt.v>rel.bottom-vsShift)||(newPt.v<rel.top)) {
                                        if (t2>=0) {
                                            _HiliteRowForDrag (t2,t);
                                            t2 = -1;
                                        }
                                        h = verticalSpaces.lData[verticalSpaces.lLength-1]/verticalSpaces.lLength;
                                        _ScrollVPixels ((newPt.v<rel.top)?-h:h);
                                        continue;
                                    }
                                    if (newPt.h>rel.right-hsShift) {
                                        newPt.h=rel.right-hsShift;
                                    }
                                    if ( DeltaPoint(oldPt, newPt) ) {
                                        k = FindClickedTableCell(newPt.h-rel.left,newPt.v-rel.top,h,v);
                                        if ((v!=t2)&&(k>-1)) {
                                            if (t2>=0) {
                                                _HiliteRowForDrag (t2,t);
                                            }
                                            if ((v!=t)&&(!(cellTypes.lData[k]&HY_TABLE_CANTSELECT))) {
                                                _HiliteRowForDrag (v,t);
                                                t2 = v;
                                            } else {
                                                t2 = -1;
                                            }
                                        }
                                        oldPt = newPt;
                                    }
                                }
                                if (t2>=0) {
                                    _HiliteRowForDrag (t2,t);
                                }

                                SetCCursor (pickUpCursor);
                                if (t!=t2) {
                                    EditBoxHandler (-1,rel);
                                    DragRow (t,t2);
                                }
                            } else {
                                if (((selectionType&HY_TABLE_SINGLE_SELECTION)==0)
                                        &&((selectionType&HY_TABLE_NODRAG_SELECTION)==0)) {
                                    PenSize (3,3);
                                    PenMode (patXor);
                                    Pattern pPat;
                                    GetIndPattern (&pPat,0,4);
                                    PenPat  (&pPat);

                                    Rect    outlineRect,
                                            paintRect,
                                            clippingRect;

                                    clippingRect = HYRect2Rect (rel);

                                    outlineRect.right  = outlineRect.left = p.h;
                                    outlineRect.bottom = outlineRect.top  = p.v;

                                    while ( WaitMouseUp() ) {
                                        GetMouse(&newPt);
                                        if (newPt.v>rel.bottom-vsShift) {
                                            if (rel.bottom-rel.top-vsShift+vOrigin <  verticalSpaces.lData[verticalSpaces.lLength-1]-1) {
                                                long h = verticalSpaces.lData[verticalSpaces.lLength-1]/verticalSpaces.lLength;
                                                SectRect (&outlineRect,&clippingRect,&paintRect);
                                                FrameRect (&paintRect);
                                                PenMode (patCopy);
                                                SetPenState (&savePen);
                                                _ScrollVPixels (h);
                                                PenSize (3,3);
                                                PenMode (patXor);
                                                PenPat  (&pPat);
                                                outlineRect.top -= h;
                                                SectRect (&outlineRect,&clippingRect,&paintRect);
                                                FrameRect (&paintRect);
                                                p.v -= h;
                                                oldPt.v -= h;
                                                continue;
                                            }
                                            newPt.v=rel.bottom-vsShift;
                                        }
                                        if (newPt.h>rel.right-hsShift) {
                                            if (rel.right-rel.left-hsShift+hOrigin <  horizontalSpaces.lData[horizontalSpaces.lLength-1]-1) {
                                                long h = horizontalSpaces.lData[horizontalSpaces.lLength-1]/horizontalSpaces.lLength;
                                                SectRect (&outlineRect,&clippingRect,&paintRect);
                                                FrameRect (&paintRect);
                                                PenMode (patCopy);
                                                SetPenState (&savePen);
                                                _ScrollHPixels (h);
                                                PenSize (3,3);
                                                PenMode (patXor);
                                                PenPat  (&pPat);
                                                outlineRect.left -= h;
                                                SectRect (&outlineRect,&clippingRect,&paintRect);
                                                FrameRect (&paintRect);
                                                p.h -= h;
                                                oldPt.h -= h;
                                                continue;
                                            }
                                            newPt.h=rel.right-hsShift;
                                        }
                                        if (newPt.v<rel.top) {
                                            if (vOrigin>0) {
                                                long h = verticalSpaces.lData[verticalSpaces.lLength-1]/verticalSpaces.lLength;
                                                SectRect (&outlineRect,&clippingRect,&paintRect);
                                                FrameRect (&paintRect);
                                                PenMode (patCopy);
                                                SetPenState (&savePen);
                                                _ScrollVPixels (-h);
                                                PenSize (3,3);
                                                PenMode (patXor);
                                                PenPat  (&pPat);
                                                outlineRect.top += h;
                                                SectRect (&outlineRect,&clippingRect,&paintRect);
                                                FrameRect (&paintRect);
                                                p.v += h;
                                                oldPt.v += h;
                                                continue;
                                            }
                                            newPt.v=rel.top;
                                        }
                                        if (newPt.h<rel.left) {
                                            if (hOrigin>0) {
                                                long h = horizontalSpaces.lData[horizontalSpaces.lLength-1]/horizontalSpaces.lLength;
                                                SectRect (&outlineRect,&clippingRect,&paintRect);
                                                FrameRect (&paintRect);
                                                PenMode (patCopy);
                                                SetPenState (&savePen);
                                                _ScrollHPixels (-h);
                                                PenSize (3,3);
                                                PenMode (patXor);
                                                PenPat  (&pPat);
                                                outlineRect.left += h;
                                                SectRect (&outlineRect,&clippingRect,&paintRect);
                                                FrameRect (&paintRect);
                                                p.h += h;
                                                oldPt.h += h;
                                                continue;
                                            }
                                            newPt.h=rel.left;
                                        }

                                        if ( DeltaPoint(oldPt, newPt) ) {
                                            if (!first) {
                                                SectRect (&outlineRect,&clippingRect,&paintRect);
                                                FrameRect (&paintRect);
                                            }

                                            if (newPt.h > p.h) {
                                                outlineRect.right = newPt.h;
                                            } else {
                                                outlineRect.right = p.h;
                                                outlineRect.left = newPt.h;
                                            }
                                            if (newPt.v > p.v) {
                                                outlineRect.bottom = newPt.v;
                                            } else {
                                                outlineRect.bottom = p.v;
                                                outlineRect.top = newPt.v;
                                            }
                                            SectRect (&outlineRect,&clippingRect,&paintRect);
                                            FrameRect (&paintRect);
                                            first = false;
                                            oldPt = newPt;
                                        }
                                    }

                                    if (!first) {
                                        SectRect (&outlineRect,&clippingRect,&paintRect);
                                        FrameRect (&paintRect);
                                        _HYRect     outlineHRect;
                                        outlineHRect.left   = outlineRect.left;
                                        outlineHRect.right  = outlineRect.right+hsShift;
                                        outlineHRect.top    = outlineRect.top;
                                        outlineHRect.bottom = outlineRect.bottom+vsShift;
                                        long    hs,hf,vs,vf;
                                        hOrigin += outlineRect.left-rel.left;
                                        vOrigin += outlineRect.top-rel.top;
                                        GetDisplayRange (&outlineHRect,hs,hf,vs,vf);
                                        hOrigin -= outlineRect.left-rel.left;
                                        vOrigin -= outlineRect.top-rel.top;
                                        ExpungeSelection();
                                        if ((hf>=hs)||(vs>=vf)) {
                                            _SimpleList sel;
                                            if (selectionType&HY_TABLE_SEL_ROWS) {
                                                sel.RequestSpace (vf-vs+1);
                                                for (h=vs; h<=vf; h++) {
                                                    sel<<h;
                                                }
                                                SetRowSelection (sel);
                                            } else if (selectionType&HY_TABLE_SEL_COLS) {
                                                sel.RequestSpace (hf-hs+1);
                                                for (v=hs; v<=hf; h++) {
                                                    sel<<v;
                                                }
                                                SetColumnSelection(sel);

                                            } else {
                                                sel.RequestSpace ((vf-vs+1)*(hf-hs+1));
                                                for (h=hs; h<=hf; h++)
                                                    for (v=vs; v<=vf; v++) {
                                                        sel << v*horizontalSpaces.lLength + h;
                                                    }
                                                SetSelection (sel,true);
                                                _MarkCellsForUpdate (sel);
                                            }
                                        }
                                    }
                                }
                                SetPenState (&savePen);
                            }
                        }
                }
            }
        }
        }
        break;
    }
    case keyDown:
    case autoKey: {
        char    c = theEvent->message&charCodeMask,
                k = (theEvent->message&keyCodeMask)>>8;

        if (editBox) {
            if (theEvent->modifiers&cmdKey) {
                if ((c=='c')||(c=='C')) {
                    TECopy (editBox);
                } else if ((c=='x')||(c=='X')) {
                    TECut (editBox);
                } else if ((c=='v')||(c=='V')) {
                    TEPaste (editBox);
                }
            } else {
                if ((k==0x24)||(k==0x4C)) {
                    EditBoxHandler (-1,rel);
                } else {
                    TEKey (c,editBox);
                }
            }
            return true;
        } else
            switch (k) {
            case 0x7E: // up
                HandleKeyMove (0,theEvent->modifiers & cmdKey);
                break;
            case 0x7D: // down
                HandleKeyMove (1,theEvent->modifiers & cmdKey);
                break;
            case 0x7B: // left
                HandleKeyMove (2,theEvent->modifiers & cmdKey);
                break;
            case 0x7C: // right
                HandleKeyMove (3,theEvent->modifiers & cmdKey);
                break;
            }

        break;
    }
    default: {
        Point p = theEvent->where;
        GlobalToLocal (&p);
        if (cursorState == HY_TABLE_EDIT_CURSOR) {
            if (!(PtInRect (p,&textBoxRect)&&editBox)) {
#ifdef TARGET_API_MAC_CARBON
                Cursor arrow;
                SetCursor(GetQDGlobalsArrow(&arrow));
#else
                SetCursor (&qd.arrow);
#endif
                cursorState = 0;
            }
        } else {
            if (editBox&&PtInRect (p,&textBoxRect)) {
                SetCursor (&editStateCursor);
                cursorState = HY_TABLE_EDIT_CURSOR;
                break;
            }
        }
        bool  ch = (!(selectionType&HY_TABLE_DONT_SIZE))&&(CheckForHSizeLocation(p.h-rel.left))&&(p.v<rel.bottom-vsShift);
        if (ch&&(cursorState!=HY_TABLE_SIZE_CURSOR)) {
            cursorState = HY_TABLE_SIZE_CURSOR;
            SetCursor (&hSizeCursor);
        } else if ((!ch)&&(cursorState==HY_TABLE_SIZE_CURSOR)) {
            cursorState = 0;
#ifdef TARGET_API_MAC_CARBON
            Cursor arrow;
            SetCursor(GetQDGlobalsArrow(&arrow));
#else
            SetCursor (&qd.arrow);
#endif
        }
        if (selectionType & HY_TABLE_SEL_ROWS) {
            if (!ch) {
                k = FindClickedTableCell(p.h-rel.left,p.v-rel.top,h,v);
                if (k>=0) {
                    if ((cursorState != HY_TABLE_DRAG_CURSOR)&&(cursorState != HY_TABLE_EDIT_CURSOR)&&
                            ((selectionType&HY_TABLE_NODRAG_SELECTION)==0)) {
                        if (cellTypes.lData[k]&HY_TABLE_SELECTED) {
                            if (IsRowSelectionSimple()) {
                                SetCCursor (pickUpCursor);
                                cursorState = HY_TABLE_DRAG_CURSOR;
                            }
                        }
                    } else {
                        if (((selectionType&HY_TABLE_NODRAG_SELECTION)==0)&&(!(cellTypes.lData[k]&HY_TABLE_SELECTED))) {
#ifdef TARGET_API_MAC_CARBON
                            Cursor arrow;
                            SetCursor(GetQDGlobalsArrow(&arrow));
#else
                            SetCursor (&qd.arrow);
#endif
                            cursorState = 0;
                        }
                    }
                }
            }
        }
        //if (editBox)
        //TEIdle (editBox);
        return true;
    }
    }
    return _HYPlatformComponent::_ProcessOSEvent (vEvent);
}



//__________________________________________________________________
void        _HYTable::_Paint (Ptr p)
{
    _HYRect         *relRect    = (_HYRect*)p;
    GrafPtr         thisPort;
    RGBColor        oldColor,
                    oldBColor,
                    whiteC = {0xffff,0xffff,0xffff},
                    fillColor = {0x8fff,0x8fff,0x8fff};

    PixPatHandle    themeFill   = nil;
    RgnHandle       saveRgn     = NewRgn();

    checkPointer    (saveRgn);
    GetPort         (&thisPort);
    GetForeColor    (&oldColor);
    GetBackColor    (&oldBColor);
    GetClip         (saveRgn);

#ifdef OPAQUE_TOOLBOX_STRUCTS
    short   savedFace = GetPortTextFont (thisPort),
            savedSize = GetPortTextSize (thisPort);

    Style   savedStyle = GetPortTextFace (thisPort);
#else
    short   savedFace = thisPort->txFont,
            savedSize = thisPort->txSize;

    Style   savedStyle = thisPort->txFace;
#endif


    long    hs, // starting column
            hf, // ending column
            vs, // starting row
            vf, // ending row
            k,  // loop index
            t,  // aux variable
            t2,
            st; // a few more auxs

    bool    chop,
            chopv;

    GetDisplayRange (relRect, hs, hf, vs, vf);

    long            vsShift = ((settings.width&HY_COMPONENT_H_SCROLL)?HY_SCROLLER_WIDTH:0),
                    hsShift = ((settings.width&HY_COMPONENT_V_SCROLL)?HY_SCROLLER_WIDTH:0);


    _HYRect         saveRel;
    Rect            bRect;

    GWorldPtr       offScreenPtr = nil;
    CGrafPtr        savedCPtr;
    GDHandle        savedDevice;

    if ((vf-vs>2)&&(aquaInterfaceOn==false)) {
        bRect.left    = bRect.top = 0;
        bRect.right   = relRect->right-relRect->left-hsShift;
        bRect.bottom  = relRect->bottom-relRect->top-vsShift;
        short errCode = NewGWorld (&offScreenPtr,0,&bRect,0,GetMainDevice(),noNewDevice);
        if (errCode != noErr) {
            offScreenPtr = nil;
        } else {
            if (!LockPixels (GetGWorldPixMap(offScreenPtr))) {
                ReportWarning ("Failed to lock pixels in _HYTable::_Paint");
                DisposeGWorld (offScreenPtr);
                offScreenPtr = nil;
            } else {
                GetGWorld (&savedCPtr,&savedDevice);
                SetGWorld (offScreenPtr,nil);
                //SetPort    ((GrafPtr)offScreenPtr);
                //SetOrigin (clipRect.left,clipRect.top);
                saveRel = *relRect;
                relRect->bottom -= relRect->top;
                relRect->top = 0;
                relRect->right  -= relRect->left;
                relRect->left = 0;
            }
        }
    }

    Rect clipRect = {relRect->top,relRect->left,
                     relRect->bottom-vsShift,
                     relRect->right-hsShift
                    },
         anotherRect,
         clipRect2,
         clipRect3;

    /*if (settings.width & HY_COMPONENT_BORDER_L)
        clipRect.left ++;
    if (settings.width & HY_COMPONENT_BORDER_T)
        clipRect.top ++;
    if (settings.width & HY_COMPONENT_BORDER_B)
        if (!(settings.width&HY_COMPONENT_H_SCROLL))
            clipRect.bottom--;
    if (settings.width & HY_COMPONENT_BORDER_R)
        if (!(settings.width&HY_COMPONENT_V_SCROLL))
            clipRect.right--;*/

    ClipRect (&clipRect);

    anotherRect = clipRect;
    t = relRect->top-vOrigin;

    RGBForeColor (&whiteC);

    if (verticalSpaces.lLength)
        for (k=vs; k<=vf; k++) {
            anotherRect.top = k?verticalSpaces.lData[k-1]+t:relRect->top;
            anotherRect.bottom = verticalSpaces.lData[k]+t;
            if (cellTypes.lData[k*horizontalSpaces.lLength]&HY_TABLE_BEVELED) {
                FillCRect (&anotherRect,backPattern2);
                if ((k==vs)||(k<vf)) {
                    RGBForeColor (&menuLine2);
                    MoveTo (anotherRect.left,anotherRect.bottom-1);
                    LineTo (anotherRect.right,anotherRect.bottom-1);
                    RGBForeColor (&menuLine1);
                    MoveTo (anotherRect.left,anotherRect.bottom-2);
                    LineTo (anotherRect.right,anotherRect.bottom-2);
                    RGBForeColor (&whiteC);
                }
            } else {
                FillCRect (&anotherRect,backPattern);
                if ((k==vs)||(k<vf)) {
                    MoveTo (anotherRect.left,anotherRect.bottom-1);
                    LineTo (anotherRect.right,anotherRect.bottom-1);
                }
            }
        }


    if (hf<horizontalSpaces.lLength-1) {
        st = hf;
    } else {
        st = hf-1;
    }

    t = relRect->left-hOrigin-2;
    if ((selectionType & HY_TABLE_NO_COLS_LINES) == 0) {
        RGBForeColor (&menuLine1);
        for (k=hs; k<=st; k++) {
            t2 = t+horizontalSpaces.lData[k];
            MoveTo (t2,relRect->top);
            LineTo (t2,relRect->bottom);
        }
        RGBForeColor (&menuLine2);
        t++;
        for (k=hs; k<=st; k++) {
            t2 = t+horizontalSpaces.lData[k];
            MoveTo (t2,relRect->top);
            LineTo (t2,relRect->bottom);
        }
    }


    RGBColor     textRGB = {((long)textColor.R) * 256, ((long)textColor.G) * 256, ((long)textColor.B) * 256};
    RGBForeColor (&textRGB);

    TextFont (fontID);
    TextFace (textFont.style);
    TextSize (textFont.size);
    st = 0;
    if (verticalSpaces.lLength)
        for (k=vs; k<=vf; k++) {
            anotherRect.top = relRect->top-vOrigin+1;
            anotherRect.bottom = anotherRect.top+verticalSpaces.lData[k]-1;
            if (k) {
                anotherRect.top+=verticalSpaces.lData[k-1];
            }
            long    t3,st2,
                    w = anotherRect.bottom-anotherRect.top,
                    w2,
                    shift = (w-textFont.size)/2-1;

            if (anotherRect.bottom>relRect->bottom-vsShift) {
                anotherRect.bottom = relRect->bottom-vsShift;
                chopv = false;
            } else {
                chopv = true;
            }

            for (t2=hs; t2<=hf; t2++) {
                t3 = k*horizontalSpaces.lLength+t2;
                if (t3 == editCellID) {
                    continue;
                }
                anotherRect.left = relRect->left-hOrigin+1;
                anotherRect.right = anotherRect.left+horizontalSpaces.lData[t2]-1;
                if (t2) {
                    anotherRect.left+=horizontalSpaces.lData[t2-1];
                }
                clipRect2 = anotherRect;
                w2= anotherRect.right-anotherRect.left;
                chop = true;
                if (anotherRect.right>relRect->right-hsShift) {
                    anotherRect.right=relRect->right-hsShift;
                    chop = false;
                } else {
                    chop = true;
                }
                if ((t2==hs)||(k==vs)) {
                    SectRect (&anotherRect,&clipRect,&clipRect3);
                    ClipRect (&clipRect3);
                } else {
                    ClipRect (&anotherRect);
                }
                if (cellTypes.lData[t3]&HY_TABLE_SELECTED) {
                    if (!themeFill) {
                        themeFill = NewPixPat ();
                        checkPointer (themeFill);
                        Collection clcn = NewCollection();
                        GetTheme (clcn);
                        SInt32   itemSize = sizeof (RGBColor);
                        GetTaggedCollectionItem (clcn,kThemeHighlightColorTag,1,&itemSize,(void*)&fillColor);
                        //GetThemeBrushAsColor (kThemeBrushFocusHighlight,32,true,&fillColor);
                        MakeRGBPat (themeFill,&fillColor);
                        DisposeCollection (clcn);
                    }
                    if (chopv) {
                        anotherRect.bottom--;
                    }
                    if (chop) {
                        anotherRect.right-=2;
                        FillCRect (&anotherRect,themeFill);
                        anotherRect.right+=2;
                    } else {
                        FillCRect (&anotherRect,themeFill);
                    }
                    if (chopv) {
                        anotherRect.bottom++;
                    }
                }
                if (cellTypes.lData[t3]&HY_TABLE_ICON) {
                    _SimpleList     * cellList = (_SimpleList*)cellData.lData[t3];

                    if (w2-4>cellList->lData[1]) {
                        t3 = (w2-cellList->lData[1])/2;
                        clipRect2.left+=t3;
                    }
                    clipRect2.right = clipRect2.left+cellList->lData[1];
                    if (w-2>cellList->lData[2]) {
                        t3 = (w-cellList->lData[2])/2;
                        clipRect2.top+=t3;
                    }
                    clipRect2.bottom=clipRect2.top+cellList->lData[2];

                    if (cellList->lLength==3) {
                        PlotCIconHandle (&clipRect2, kAlignNone,kTransformNone, (CIconHandle)cellList->lData[0]);
                    } else {
                        if ((cellList->lData[3]==HY_TABLE_COLOR_BOX)||(cellList->lData[3]==HY_TABLE_COLOR_CIRCLE)) {
                            PixPatHandle clr = NewPixPat ();
                            checkPointer (clr);
                            _HYColor      c = LongToHYColor (cellList->lData[0]);
                            RGBColor      sysColor;
                            sysColor.red   = c.R*256;
                            sysColor.green = c.G*256;
                            sysColor.blue  = c.B*256;
                            MakeRGBPat (clr, &sysColor);
                            if (cellList->lData[3]==HY_TABLE_COLOR_BOX) {
                                FillCRect  (&clipRect2,clr);
                            } else {
                                RGBColor        trColor = {0,0,0},
                                                saveFGColor;

                                ::GetForeColor (&saveFGColor);


                                Rect           circRect = clipRect2;

                                RGBForeColor   (&trColor);
                                FrameArc       (&circRect,0,360);


                                InsetRect    (&circRect,1,1);
                                trColor.red = sysColor.red/2;
                                trColor.blue = sysColor.blue/2;
                                trColor.green = sysColor.green/2;
                                RGBForeColor   (&trColor);
                                FrameArc       (&circRect,0,360);

                                InsetRect    (&circRect,1,1);
                                trColor.red = sysColor.red/1.5;
                                trColor.blue = sysColor.blue/1.5;
                                trColor.green = sysColor.green/1.5;
                                RGBForeColor   (&trColor);
                                FrameArc       (&circRect,0,360);

                                InsetRect    (&circRect,1,1);
                                FillCArc     (&circRect,0,360,clr);
                                RGBForeColor   (&saveFGColor);
                            }
                            DisposePixPat (clr);
                        }
                    }

                    //PlotCIcon (&clipRect2, (CIconHandle)cellList->lData[0]);
                } else { // text
                    st2 = cellTypes.lData[t3]&HY_TABLE_STYLEMASK;
                    if (st!=st2) {
                        st = st2;
                        st2 = normal;
                        if (st&HY_TABLE_BOLD) {
                            st2 = bold;
                        }
                        if (st&HY_TABLE_ITALIC) {
                            st2 |= italic;
                        }
                        TextFace (st2);
                    }


                    _String  *thisCell = (_String*)cellData.lData[t3];
                    MoveTo   (anotherRect.left+textFont.size/3, anotherRect.top+shift+textFont.size);
                    DrawText (thisCell->sData,0,thisCell->sLength);

                    if (cellTypes.lData[t3]&HY_TABLE_PULLDOWN) {
                        clipRect2.right-=4;
                        clipRect2.left=clipRect2.right-tPDMw;
                        if (w-2>tPDMh) {
                            t3 = (w-tPDMh)/2;
                            clipRect2.top+=t3;
                        }
                        clipRect2.bottom=clipRect2.top+tPDMh;
                        PlotCIconHandle (&clipRect2, kAlignNone,kTransformNone, tablePDMenuIcon);
                        //PlotCIcon (&clipRect2, tablePDMenuIcon);
                    }
                }
            }
        }
    if (themeFill) {
        DisposePixPat (themeFill);
    }


    if (offScreenPtr) {
        //SetPort     (thisPort);
        SetGWorld (savedCPtr,savedDevice);
        whiteC.red = whiteC.green = whiteC.blue = 0xffff;
        RGBBackColor (&whiteC);
        whiteC.red = whiteC.green = whiteC.blue = 0;
        RGBForeColor (&whiteC);
        *relRect = saveRel;
        OffsetRect   (&clipRect,relRect->left, relRect->top);
#ifdef OPAQUE_TOOLBOX_STRUCTS
        CopyBits (GetPortBitMapForCopyBits(offScreenPtr),GetPortBitMapForCopyBits(GetWindowPort(parentWindow)) ,&bRect,&clipRect,srcCopy,(RgnHandle)nil);
#else
        CopyBits (&(GrafPtr(offScreenPtr)->portBits),&(parentWindow->portBits),&bRect,&clipRect,srcCopy,(RgnHandle)nil);
#endif
        UnlockPixels (GetGWorldPixMap(offScreenPtr));
        DisposeGWorld (offScreenPtr);
    }
    RGBBackColor (&oldBColor);
    RGBForeColor (&oldColor);
    if (editBox) {
        Rect    temp;
        SectRect(&textBoxRect,&clipRect,&temp);
        if (!EmptyRect(&temp)) {
            ClipRect (&clipRect);
            if (settings.width&HY_COMPONENT_TRANSP_BG) {
                SetThemeWindowBackground (parentWindow,kThemeBrushWhite,false);
                TEUpdate (&textBoxRect,editBox);
                SetThemeWindowBackground (parentWindow,kThemeBrushDialogBackgroundActive,false);
            } else {
                TEUpdate (&textBoxRect,editBox);
            }
            InsetRect(&textBoxRect,1,1);
            DrawThemeFocusRect (&textBoxRect,true);
            InsetRect(&textBoxRect,-1,-1);
        }
    }
    SetClip (saveRgn);
    TextFont (savedFace);
    TextSize (savedSize);
    TextFace (savedStyle);
    DisposeRgn (saveRgn);

    _HYPlatformComponent::_Paint(p);
}

//__________________________________________________________________

void        _HYPlatformTable::_SetBackColor (_HYColor& c)
{
    RGBColor newBG;
    newBG.red = c.R*0x00ff;
    newBG.blue = c.B*0x00ff;
    newBG.green = c.G*0x00ff;
    MakeRGBPat (backPattern,&newBG);
}

//__________________________________________________________________

void        _HYPlatformTable::_SetBackColor2 (_HYColor& c)
{
    RGBColor newBG;
    newBG.red = c.R*0x00ff;
    newBG.blue = c.B*0x00ff;
    newBG.green = c.G*0x00ff;
    MakeRGBPat (backPattern2,&newBG);
}



//__________________________________________________________________

void        _HYPlatformTable::_CreateTextBox (_HYRect& tBox,_String& textIn)
{
    Rect      destRect;
    _HYTable* parent = (_HYTable*)this;

    textBoxRect.left    = tBox.left;
    textBoxRect.right   = tBox.right;
    textBoxRect.top     = tBox.top;
    textBoxRect.bottom  = tBox.bottom;
    destRect            = textBoxRect;
    destRect.right      += 10000;
    editBox             = TEStyleNew(&destRect,&textBoxRect);
    checkPointer        ((Ptr)editBox);
    TESetText           (textIn.sData,textIn.sLength,editBox);
    TESetSelect         (0,30000,editBox);
    TextStyle           tStyle;
    tStyle.tsFont       = fontID;
    tStyle.tsFace       = parent->textFont.style;
    tStyle.tsSize       = parent->textFont.size;
    tStyle.tsColor.red  = parent->textColor.R*0x00FF;
    tStyle.tsColor.green= parent->textColor.G*0x00FF;
    tStyle.tsColor.blue = parent->textColor.B*0x00FF;

    TESetStyle          (doAll,&tStyle,false,editBox);
    TEAutoView          (true,editBox);
    TECalText           (editBox);
    TEActivate          (editBox);
    //TEUpdate          (&textBoxRect, editBox);

}

//__________________________________________________________________

_String     _HYPlatformTable::_RetrieveTextValue (void)
{
    if (editBox) {
        long            textLen = (*editBox)->teLength;
        if (textLen) {
            CharsHandle     theText = TEGetText (editBox);
            _String         result  (textLen,false);
            BlockMove       (*theText,result.sData,textLen);
            return          result;
        }
    }
    return      empty;
}

//__________________________________________________________________

void        _HYPlatformTable::_KillTextBox (void)
{
    if (editBox) {
        TEDispose (editBox);
        editBox = nil;
    }
}

//__________________________________________________________________

Rect        _HYPlatformTable::_GetVisibleRowRect (long h)
{
    _HYTable*   parent = (_HYTable*)this;
    Rect        res;

    long        w = (parent->settings.width&HY_COMPONENT_H_SCROLL)?HY_SCROLLER_WIDTH:0;
    res.left   = parent->rel.left;
    res.right  = (parent->settings.width&HY_COMPONENT_H_SCROLL)?parent->rel.right-HY_SCROLLER_WIDTH:parent->rel.right;

    res.bottom = parent->verticalSpaces.lData[h]-parent->vOrigin+parent->rel.top;
    if (res.bottom>parent->rel.bottom-w) {
        res.bottom=parent->rel.bottom-w;
    }

    if (h) {
        res.top = parent->verticalSpaces.lData[h-1]-parent->vOrigin+parent->rel.top;
    } else {
        res.top = parent->rel.top-parent->vOrigin;
    }

    return res;
}

//__________________________________________________________________

void        _HYPlatformTable::_HiliteRowForDrag (long row, long old)
{
    Rect        cellRect = _GetVisibleRowRect (row);
    if (row<old) {
        cellRect.bottom = cellRect.top+2;
    } else {
        cellRect.top = cellRect.bottom-2;
    }
    InvertRect  (&cellRect);
}

//__________________________________________________________________

void        _HYTable::_MarkCellsForUpdate (_SimpleList& cells)
{
    GrafPtr   savePort;
    GetPort   (&savePort);
#ifdef OPAQUE_TOOLBOX_STRUCTS
    SetPort   (GetWindowPort(parentWindow));
#else
    SetPort   (parentWindow);
#endif
    long hs,hf,vs,vf,t,t2,k;
    GetDisplayRange (&rel, hs, hf, vs, vf);
    Rect  clipRect;

    clipRect.left = rel.left;
    clipRect.right = rel.right;
    if (settings.width&HY_COMPONENT_V_SCROLL) {
        clipRect.right -= HY_SCROLLER_WIDTH;
    }
    clipRect.top = rel.top;
    clipRect.bottom = rel.bottom;
    if (settings.width&HY_COMPONENT_H_SCROLL) {
        clipRect.bottom -= HY_SCROLLER_WIDTH;
    }

    for (k=0; k<cells.lLength; k++) {
        t2 = cells.lData[k]/horizontalSpaces.lLength;
        t = cells.lData[k]%horizontalSpaces.lLength;

        if ((t>=hs)&&(t<=hf)&&(t2<=vf)&&(t2>=vs)) {
            Rect invalRect;
            if (t) {
                invalRect.left = horizontalSpaces.lData[t-1];
            } else {
                invalRect.left = 0;
            }
            invalRect.right = horizontalSpaces.lData[t];
            if (t2) {
                invalRect.top = verticalSpaces.lData[t2-1];
            } else {
                invalRect.top = 0;
            }
            invalRect.bottom = verticalSpaces.lData[t2];
            OffsetRect (&invalRect, rel.left-hOrigin, rel.top-vOrigin);
            SectRect (&invalRect, &clipRect, &invalRect);
            if (!EmptyRect (&invalRect))
#ifdef TARGET_API_MAC_CARBON
                InvalWindowRect (parentWindow,&invalRect);
#else
                InvalRect (&invalRect);
#endif
        }
    }
    SetPort   (savePort);
}

//__________________________________________________________________

void        _HYTable::_MarkColumnForUpdate (long index)
{
    long hs,hf,vs,vf;
    GetDisplayRange (&rel, hs, hf, vs, vf);

    if ((index>=hs)&&(index<=hf)) {
        GrafPtr   savePort;
        GetPort   (&savePort);
#ifdef OPAQUE_TOOLBOX_STRUCTS
        SetPort   (GetWindowPort(parentWindow));
#else
        SetPort   (parentWindow);
#endif
        Rect  clipRect;

        clipRect.left = rel.left;
        clipRect.right = rel.right;
        if (settings.width&HY_COMPONENT_V_SCROLL) {
            clipRect.right -= HY_SCROLLER_WIDTH;
        }
        clipRect.top = rel.top;
        clipRect.bottom = rel.bottom;
        if (settings.width&HY_COMPONENT_H_SCROLL) {
            clipRect.bottom -= HY_SCROLLER_WIDTH;
        }

        Rect  invalRect;
        invalRect.bottom = clipRect.bottom;
        invalRect.top = clipRect.top;
        invalRect.left = index?horizontalSpaces.lData[index-1]:0;
        invalRect.right = horizontalSpaces.lData[index];
        OffsetRect (&invalRect, rel.left-hOrigin,0);
        SectRect (&invalRect, &clipRect, &invalRect);
        if (!EmptyRect (&invalRect))
#ifdef TARGET_API_MAC_CARBON
            InvalWindowRect (parentWindow,&invalRect);
#else
            InvalRect (&invalRect);
#endif
        SetPort   (savePort);
    }
}

//__________________________________________________________________

void        _HYTable::_MarkRowForUpdate (long index)
{
    long hs,hf,vs,vf;
    GetDisplayRange (&rel, hs, hf, vs, vf);

    if ((index>=vs)&&(index<=vf)) {
        GrafPtr   savePort;
        GetPort   (&savePort);
#ifdef OPAQUE_TOOLBOX_STRUCTS
        SetPort   (GetWindowPort(parentWindow));
#else
        SetPort   (parentWindow);
#endif
        Rect  clipRect;

        clipRect.left = rel.left;
        clipRect.right = rel.right;
        if (settings.width&HY_COMPONENT_V_SCROLL) {
            clipRect.right -= HY_SCROLLER_WIDTH;
        }
        clipRect.top = rel.top;
        clipRect.bottom = rel.bottom;
        if (settings.width&HY_COMPONENT_H_SCROLL) {
            clipRect.bottom -= HY_SCROLLER_WIDTH;
        }

        Rect  invalRect;
        invalRect.right = clipRect.right;
        invalRect.left = clipRect.left;
        invalRect.top = index?verticalSpaces.lData[index-1]:0;
        invalRect.bottom = verticalSpaces.lData[index];
        OffsetRect (&invalRect, 0, rel.top-vOrigin);
        SectRect (&invalRect, &clipRect, &invalRect);
#ifdef TARGET_API_MAC_CARBON
        InvalWindowRect (parentWindow,&invalRect);
#else
        InvalRect (&invalRect);
#endif
        SetPort   (savePort);
    }
}

//__________________________________________________________________

void        _HYTable::_MarkCellForUpdate (long index)
{
    _SimpleList     dummy (index);
    _MarkCellsForUpdate (dummy);
}

//__________________________________________________________________

void        _HYTable::_IdleHandler (void)
{
    if (editBox) {
        TEIdle (editBox);
    }
}

//__________________________________________________________________

void        _HYTable::_FocusComponent (void)
{
}

//__________________________________________________________________
long        _HYTable::_HandlePullDown (_List& data, long h, long v, long currentS)
{
    if (data.lLength) {
        return HandlePullDownWithFont (data,h,v,currentS,textFont.face,textFont.size);
    }
    return -1;
}

//__________________________________________________________________

void        _HYTable::_ScrollVPixels (long offset)
{
    long     voff = ((settings.width&HY_COMPONENT_H_SCROLL)?HY_SCROLLER_WIDTH:0);
    offset = offset/(_Parameter)(GetMaxH()- rel.bottom+rel.top+1-voff)*MAX_CONTROL_VALUE;
    ProcessEvent (generateScrollEvent(0,offset));
    _SetVScrollerPos((double)MAX_CONTROL_VALUE*vOrigin/(verticalSpaces.lData[verticalSpaces.lLength-1]-vSize+voff));
}

//__________________________________________________________________

void        _HYTable::_ScrollHPixels (long offset)
{
    long     hoff = ((settings.width&HY_COMPONENT_V_SCROLL)?HY_SCROLLER_WIDTH:0);
    offset = offset/(_Parameter)(GetMaxW()- rel.right+rel.bottom+1-hoff)*MAX_CONTROL_VALUE;
    ProcessEvent (generateScrollEvent(offset,0));
    _SetHScrollerPos((double)MAX_CONTROL_VALUE*hOrigin/(horizontalSpaces.lData[horizontalSpaces.lLength-1]-hSize+hoff));
}

//__________________________________________________________________

void        _HYTable::_ScrollRowIntoView (long index)
{
    if ((index>=0)&&(index<verticalSpaces.lLength)) {
        long hs, hf, vs, vf;
        GetDisplayRange (&rel,hs,hf,vs,vf);
        if ((index>vf)||(index<vs)) {
            _ScrollVPixels ((index?verticalSpaces.lData[index-1]:0)-vOrigin);
        }
    }
}

//__________________________________________________________________

void        _HYTable::_PrintTable (_SimpleList& columns, _SimpleList& rows, _HYTable* ch)
{

    if ((columns.lLength == 0)||(rows.lLength == 0)) {
        return;
    }

    GrafPtr     savePort;
#ifdef      TARGET_API_MAC_CARBON
    PMRect prRect;
#else
    TPrStatus   prStatus;
    TPPrPort    printPort;
    OSErr       err;
#endif

#ifdef TARGET_API_MAC_CARBON
    OSStatus theStatus;
    Boolean isAccepted;

    PMPrintSession hyPS;
    theStatus = PMCreateSession(&hyPS);
    if (theStatus != noErr) {
        return;
    }
#endif

    if (!InitPrint(hyPS)) {
        _String errMsg ("Could not initialize printing variables.");
        WarnError (errMsg);
        terminateExecution = false;
        return;
    }

    GetPort(&savePort);

#ifdef TARGET_API_MAC_CARBON
    if (gPrintSettings != kPMNoPrintSettings) {
        theStatus = PMSessionValidatePrintSettings(hyPS,gPrintSettings, kPMDontWantBoolean);
    } else {
        theStatus = PMCreatePrintSettings(&gPrintSettings);

        if ((theStatus == noErr) && (gPrintSettings != kPMNoPrintSettings)) {
            theStatus = PMSessionDefaultPrintSettings(hyPS,gPrintSettings);
        }
    }

    if (theStatus == noErr) {
        theStatus = PMSessionPrintDialog(hyPS,gPrintSettings, gPageFormat, &isAccepted);

        if (isAccepted) {
            theStatus = PMGetAdjustedPageRect(gPageFormat, &prRect);
            if (theStatus != noErr) {
                return;
            }

            theStatus = PMSessionBeginDocument(hyPS,gPrintSettings, gPageFormat);
            if (theStatus != noErr) {
                return;
            }

            long     printW    = prRect.right-prRect.left-2,
                     printH    = prRect.bottom-prRect.top-2;

            UInt32   startPage,
                     endPage;

            PMGetFirstPage (gPrintSettings,&startPage);
            PMGetLastPage  (gPrintSettings,&endPage);
#else
    PrOpen();
    if (err=PrError()) {
        _String errMsg ("Could not print the table. Error Code:");
        errMsg = errMsg & (long)err;
        WarnError (errMsg);
        terminateExecution = false;
        return;
    }

    if (PrJobDialog(prRecHdl)) {
        printPort = PrOpenDoc(prRecHdl, nil, nil);
        SetPort((GrafPtr)printPort);
        long     printW = (*prRecHdl)->prInfo.rPage.right-2,
                 printH = (*prRecHdl)->prInfo.rPage.bottom-2,
                 startPage = (*prRecHdl)->prJob.iFstPage,
                 endPage = (*prRecHdl)->prJob.iLstPage;
#endif
            long
            tW = 0,
            cC = 0,
            cE = 0,
            cP = 1,
            t,
            i,
            pH = ch?ch->GetRowSpacing (0):0;


            if (ch) {
                printH -= pH;
                if (printH <= 0) {
                    _String errMsg ("Table header is too tall to fit on the page.");
                    WarnError (errMsg);
                    terminateExecution = false;
                    return;
                }
            }

            _HYRect  relDim = {0,0,0,0,HY_COMPONENT_NO_SCROLL};

            if (ch)
                for (i=0; i<columns.lLength; i++) {
                    tW += ch->GetColumnSpacing (columns.lData[i]);
                }
            else
                for (i=0; i<columns.lLength; i++) {
                    tW += GetColumnSpacing (columns.lData[i]);
                }

            relDim.left    = relDim.right   = tW > printW ? printW : tW;

            while (cP < startPage) {
#ifdef TARGET_API_MAC_CARBON
                theStatus = PMSessionBeginPage(hyPS,gPageFormat, NULL);
                if (theStatus != noErr) {
                    break;
                }
#else
                PrOpenPage      (printPort, nil);
#endif

                t = 0;
                while (cC < rows.lLength) {
                    i = GetRowSpacing (rows.lData[cC]);
                    if ( t+i > printH) {
                        cP ++;
                        if (i > printH) {
                            cC++;
                        }
                        break;
                    } else {
                        t += i;
                        cC ++;
                    }
                }
#if TARGET_API_MAC_CARBON
                theStatus = PMSessionEndPage(hyPS);
#else
                PrClosePage(printPort);
#endif
            }

            cE = cC;

            for (long pageCount = startPage; pageCount<=endPage && (cC < rows.lLength); pageCount++) {
                t = 0;
                while (cE < rows.lLength) {
                    i = GetRowSpacing (rows.lData[cE]);
                    if ( t+i > printH) {
                        if (i > printH) {
                            t = printH;
                            cE++;
                        }
                        break;
                    } else {
                        t += i;
                        cE ++;
                    }
                }

                relDim.top = relDim.bottom = t+pH;

#ifndef TARGET_API_MAC_CARBON
                _HYTable        *thisPage = new _HYTable (relDim,(Ptr)printPort, cE-cC+(ch?1:0),columns.lLength,20,20,HY_TABLE_STATIC_TEXT);
#else
                GrafPtr         prPortPtr;
                PMSessionGetGraphicsContext (hyPS,NULL,(void**)&prPortPtr);
                _HYTable        *thisPage = new _HYTable (relDim,(Ptr)prPortPtr, cE-cC+(ch?1:0),columns.lLength,20,20,HY_TABLE_STATIC_TEXT);
#endif
                checkPointer    (thisPage);
#ifdef TARGET_API_MAC_CARBON
                theStatus = PMSessionBeginPage(hyPS,gPageFormat, NULL);
                if (theStatus != noErr) {
                    break;
                }
#else
                PrOpenPage      (printPort, nil);
#endif

                thisPage->SetFont       (textFont);
                thisPage->SetBackColor  (backColor);
                thisPage->SetBackColor2 (backColor2);
                thisPage->SetTextColor  (textColor);

                if (ch)
                    for (i=0; i<columns.lLength; i++) {
                        thisPage->SetColumnSpacing (i,ch->GetColumnSpacing (columns.lData[i])-20, false);
                    }
                else
                    for (i=0; i<columns.lLength; i++) {
                        thisPage->SetColumnSpacing (i,GetColumnSpacing (columns.lData[i])-20, false);
                    }

                t = 0;
                if (ch) {
                    thisPage->SetRowSpacing (0,pH-20,false);
                    for (i=0; i<columns.lLength; i++) {
                        BaseRef cellData = ch->GetCellData(columns.lData[i],0);
                        cellData->nInstances++;
                        thisPage->SetCellData(cellData,0,i,ch->cellTypes.lData[columns.lData[i]]&HY_TABLE_DESELECT,false);
                    }
                    t = 1;
                }

                for (cP = cC; cP < cE; cP++,t++) {
                    long     rI = rows.lData[cP];
                    thisPage->SetRowSpacing (t,GetRowSpacing(rI)-20,false);
                    for (i=0; i<columns.lLength; i++) {
                        BaseRef cellData = GetCellData(columns.lData[i],rI);
                        cellData->nInstances++;
                        thisPage->SetCellData(cellData,t,i,cellTypes.lData[rI*horizontalSpaces.lLength+columns.lData[i]]&HY_TABLE_DESELECT,false);
                    }
                }
                _HYRect relDim2 = relDim;
                relDim2.left = relDim2.top = 1;
                relDim2.right ++;
                relDim2.bottom ++;
                thisPage->_Paint ((Ptr)&relDim2);
                PenSize (1,1);
                RGBColor blk = {0,0,0};
                RGBForeColor (&blk);
                Rect         relDim22 = HYRect2Rect (relDim2);
                FrameRect (&relDim22);
#if TARGET_API_MAC_CARBON
                theStatus = PMSessionEndPage(hyPS);
#else
                PrClosePage(printPort);
#endif
                DeleteObject (thisPage);
                cC = cE;
            }
#ifdef TARGET_API_MAC_CARBON
            theStatus = PMSessionEndDocument(hyPS);
            SetPort(savePort);
            if (theStatus == noErr) {
                if (gFlattenedFormat != NULL) {
                    DisposeHandle(gFlattenedFormat);
                    gFlattenedFormat = NULL;
                }

                theStatus = PMFlattenPageFormat(gPageFormat, &gFlattenedFormat);
            }

            if (theStatus == noErr) {
                if (gFlattenedSettings != NULL) {
                    DisposeHandle(gFlattenedSettings);
                    gFlattenedSettings = NULL;
                }

                theStatus = PMFlattenPrintSettings(gPrintSettings, &gFlattenedSettings);
            }

            if (gPageFormat != kPMNoPageFormat) {
                theStatus = PMRelease(gPageFormat);
                gPageFormat = kPMNoPageFormat;
            }

            if (gPrintSettings != kPMNoPrintSettings) {
                theStatus = PMRelease(gPrintSettings);
                gPrintSettings = kPMNoPrintSettings;
            }

            theStatus = PMRelease(hyPS);

#else
            PrCloseDoc(printPort);
            if (((*prRecHdl)->prJob.bJDocLoop = bSpoolLoop) && (!PrError() ) ) {
                PrPicFile(prRecHdl, nil, nil, nil, &prStatus);
            }
#endif
        }
#ifdef TARGET_API_MAC_CARBON
        else {
            theStatus = PMRelease(hyPS);
        }
#endif

#ifdef TARGET_API_MAC_CARBON
    }
#else
        PrClose();
        SetPort(savePort);
#endif

}

//EOF
\ No newline at end of file
diff --git a/src/gui/mac/Components/HYPlatformTextBox.cpp b/src/gui/mac/Components/HYPlatformTextBox.cpp
new file mode 100644
index 0000000..2952703
--- /dev/null
+++ b/src/gui/mac/Components/HYPlatformTextBox.cpp
@@ -0,0 +1,1241 @@
+/*
+    Text input box for Mac OS API
+
+    Sergei L. Kosakovsky Pond, May 2000-December 2002
+
+    Revised in December 2003 to use MLTE
+*/
+
+#include "errorfns.h"
+#include "HYTextbox.h"
+#include "HYUtils.h"
+#include "HYEventTypes.h"
+#include "HYGraphicPane.h"
+
+#include "ToolUtils.h"
+#include "Appearance.h"
+#include "string.h"
+
+#include "HYDialogs.h"
+
+//#include "MacTextEditor.h"
+
+
+//__________________________________________________________________
+
+_HYPlatformTextBox::_HYPlatformTextBox  (void)
+{
+    backFill  = NewPixPat();
+    backTFill = NewPixPat();
+
+    if (!(backFill&&backTFill)) {
+        warnError (-108);
+    }
+
+#ifdef          _HY_USE_MLTE_
+    txn     = nil;
+#else
+    te      = nil;
+#endif
+
+    RGBColor    wht = {0xffff,0xffff,0xffff};
+    MakeRGBPat (backFill,&wht);
+    MakeRGBPat (backTFill,&wht);
+
+    textBoxRect.left    = textBoxRect.top   = 0;
+    textBoxRect.bottom  = textBoxRect.right = 100;
+
+}
+
+//__________________________________________________________________
+
+_HYPlatformTextBox::~_HYPlatformTextBox (void)
+{
+    if (backFill) {
+        DisposePixPat (backFill);
+    }
+
+    if (backTFill) {
+        DisposePixPat (backTFill);
+    }
+
+#ifdef          _HY_USE_MLTE_
+    if (txn) {
+        TXNDeleteObject (txn);
+    }
+#else
+    if (te) {
+        TEDispose(te);
+    }
+#endif
+}
+
+//__________________________________________________________________
+
+void    _HYPlatformTextBox::_SetBackColor (_HYColor& c)
+{
+    RGBColor newBG;
+    newBG.red   = c.R*256;
+    newBG.blue  = c.B*256;
+    newBG.green = c.G*256;
+    MakeRGBPat (backFill,&newBG);
+}
+
+//__________________________________________________________________
+
+void    _HYPlatformTextBox::_SetBackTColor (_HYColor& c)
+{
+    RGBColor newBG;
+    newBG.red   = c.R*256;
+    newBG.blue  = c.B*256;
+    newBG.green = c.G*256;
+    MakeRGBPat (backTFill,&newBG);
+}
+
+//__________________________________________________________________
+
+long    _HYPlatformTextBox::_GetCharacterCount (void)
+{
+#ifdef          _HY_USE_MLTE_
+    if (txn) {
+        return TXNDataSize (txn);
+    }
+#endif
+    return 0;
+}
+
+
+//__________________________________________________________________
+
+void    _HYPlatformTextBox::_SetForeColor (_HYColor& c)
+{
+#ifdef          _HY_USE_MLTE_
+    if (txn) {
+        RGBColor newC = {c.R*256,c.B*256,c.G*256};
+
+        TXNTypeAttributes  attr[1];
+
+        attr[0].tag  = kTXNQDFontColorAttribute;
+        attr[0].size = kTXNQDFontColorAttributeSize;
+        attr[0].data.dataPtr = &newC;
+        TXNSetTypeAttributes (txn,1,attr,kTXNStartOffset,kTXNEndOffset);
+
+
+    }
+#else
+    if (te) {
+        _HYTextBox *  parent = (_HYTextBox*)this;
+
+        TextStyle   newStyle;
+        newStyle.tsColor.red   = c.R*256;
+        newStyle.tsColor.blue  = c.B*256;
+        newStyle.tsColor.green = c.G*256;
+
+        if ((*te)->teLength) {
+            short       ss = (*te)->selStart,
+                        se = (*te)->selEnd;
+
+
+            TESetSelect (0,30000,te);
+            TESetStyle  (doColor,&newStyle,true,te);
+            TESetSelect (ss,se,te);
+        } else {
+            TESetStyle  (doColor,&newStyle,true,te);
+        }
+
+    }
+#endif
+}
+
+//__________________________________________________________________
+
+void    _HYPlatformTextBox::_SetFont (_HYFont& f)
+{
+#ifdef          _HY_USE_MLTE_
+    if (txn) {
+        Str255          fName;
+        StringToStr255 (f.face,fName);
+        //short             fNum=0;
+        //GetFNum      (fName,&fNum);
+
+        TXNTypeAttributes  attr[3];
+
+        attr[0].tag  = kTXNQDFontNameAttribute;
+        attr[0].size = kTXNQDFontNameAttributeSize;
+        attr[0].data.dataPtr = (Ptr)fName;
+
+        attr[1].tag  = kTXNQDFontStyleAttribute;
+        attr[1].size = kTXNQDFontStyleAttributeSize;
+        attr[1].data.dataValue = normal;
+        if (f.style & HY_FONT_BOLD) {
+            attr[1].data.dataValue |= bold;
+        }
+        if (f.style & HY_FONT_ITALIC) {
+            attr[1].data.dataValue |= italic;
+        }
+
+
+        attr[2].tag  = kTXNQDFontSizeAttribute;
+        attr[2].size = kTXNFontSizeAttributeSize;
+        attr[2].data.dataValue = f.size<<16;
+
+        TXNSetTypeAttributes (txn,3,attr,kTXNStartOffset,kTXNEndOffset);
+    }
+#else
+    if (te) {
+        Str255 fName;
+        StringToStr255 (f.face,fName);
+        short  fNum=0;
+        GetFNum (fName,&fNum);
+
+        TextStyle   newStyle;
+        newStyle.tsFont = fNum;
+        newStyle.tsFace = f.style;
+        newStyle.tsSize = f.size;
+
+        if ((*te)->teLength) {
+            short       ss = (*te)->selStart,
+                        se = (*te)->selEnd;
+
+            TESetSelect (0,30000,te);
+            TESetStyle  (doFont|doFace|doSize,&newStyle,false,te);
+            TESetSelect (ss,se,te);
+        } else {
+            TESetStyle  (doFont|doFace|doSize,&newStyle,false,te);
+        }
+    }
+#endif
+}
+
+//__________________________________________________________________
+void        _HYPlatformTextBox::_Update (Ptr p)
+{
+    _Paint (p);
+}
+
+//__________________________________________________________________
+void        _HYPlatformTextBox::_SetDimensions (_HYRect r, _HYRect rel)
+{
+    _HYTextBox* theParent = (_HYTextBox *) this;
+    theParent->_HYPlatformComponent::_SetDimensions (r,rel);
+    _SetVisibleSize (rel);
+}
+
+
+//__________________________________________________________________
+void        _HYPlatformTextBox::_SetVisibleSize (_HYRect rel)
+{
+    _HYTextBox *theParent = (_HYTextBox*) this;
+
+    textBoxRect.top     = rel.top   + theParent->margins.top;
+    textBoxRect.left    = rel.left  + theParent->margins.left;
+    textBoxRect.bottom  = rel.bottom- theParent->margins.bottom;
+    textBoxRect.right   = rel.right - theParent->margins.right;
+
+
+#ifdef          _HY_USE_MLTE_
+    if (txn) {
+        Rect        textBoxRect2 = textBoxRect;
+
+        if (!(theParent->boxFlags & (HY_TB_BIGBOX))) {
+            InsetRect   (&textBoxRect2,1,1);
+        }
+
+        TXNLongRect newLongRect = {textBoxRect2.top, textBoxRect2.left, textBoxRect2.bottom, textBoxRect2.right};
+
+        if (theParent->boxFlags & (HY_TB_BIGBOX|HY_TB_WRAP)) {
+            newLongRect.bottom += 0x0fffffff;
+            newLongRect.right -= HY_SCROLLER_WIDTH;
+        }
+
+        TXNSetRectBounds (txn, &textBoxRect2, &newLongRect, true);
+
+        if (theParent->boxFlags & (HY_TB_BIGBOX|HY_TB_WRAP)) {
+            TXNForceUpdate (txn);
+        }
+    }
+#else
+    if ((textBoxRect.bottom-textBoxRect.top<theParent->editBoxFont.size+4)||
+            (textBoxRect.right-textBoxRect.left<theParent->editBoxFont.size+4)) {
+        if (te) {
+            TEDispose (te);
+            te = nil;
+        }
+        return;
+    }
+
+    if (te) {
+        CharsHandle th  = TEGetText  (te);
+        Rect        textBoxRect2 = textBoxRect;
+        InsetRect   (&textBoxRect2,2,2);
+        Rect        textBoxRect3 = textBoxRect2;
+        if (!theParent->wrapToView) {
+            textBoxRect3.right += 10000;
+        }
+        GrafPtr thisPort;
+        GetPort (&thisPort);
+#ifdef OPAQUE_TOOLBOX_STRUCTS
+        SetPort (GetWindowPort(theParent->parentWindow));
+#else
+        SetPort (theParent->parentWindow);
+#endif
+
+        TEHandle nte = TEStyleNew (&textBoxRect3, &textBoxRect2);
+        checkPointer(nte);
+        SetPort (thisPort);
+        HLock ((Handle)te);
+        HLock (th);
+        short       ss = (*te)->selStart,
+                    se = (*te)->selEnd;
+        TESetText   (*th,(*te)->teLength,nte);
+        TESetSelect (ss,se,nte);
+        HUnlock     (th);
+        HUnlock     ((Handle)te);
+        TEDispose   (te);
+        te = nte;
+        _CreateTE();
+    }
+#endif
+}
+
+//__________________________________________________________________
+void        _HYPlatformTextBox::_SetAlignFlags (unsigned char f)
+{
+#ifdef          _HY_USE_MLTE_
+    if (txn) {
+        TXNControlTag  tags[1];
+        TXNControlData td  [1];
+
+        tags[0]  = kTXNJustificationTag;
+
+        if (f&HY_ALIGN_LEFT) {
+            td[0].uValue  = kTXNFlushLeft;
+        } else if (f&HY_ALIGN_RIGHT) {
+            td[0].uValue  = kTXNFlushRight;
+        } else {
+            td[0].uValue  = kTXNCenter;
+        }
+
+        TXNSetTXNObjectControls (txn,false,1,tags,td);
+
+    }
+#else
+    if (te) {
+        if (f&HY_ALIGN_LEFT) {
+            TESetAlignment (teFlushLeft,te);
+        } else if (f&HY_ALIGN_RIGHT) {
+            TESetAlignment (teFlushRight,te);
+        } else {
+            TESetAlignment (teCenter,te);
+        }
+    }
+#endif
+}
+
+//__________________________________________________________________
+_String     _HYPlatformTextBox::_GetText (void)
+{
+#ifdef          _HY_USE_MLTE_
+    if (txn) {
+        if (_GetCharacterCount()) {
+            Handle      th;
+            TXNGetDataEncoded
+            (txn,kTXNStartOffset,kTXNEndOffset,&th,kTXNTextData);
+
+            HLock       (th);
+            _String     result (GetHandleSize(th),false);
+            memcpy      (result.sData, *th, result.sLength);
+            HUnlock     (th);
+            DisposeHandle (th);
+            //printf        ("%s\n", result.sData);
+            return      result;
+        }
+    }
+#else
+    if (te&&(*te)->teLength) {
+        _String     result ((unsigned long)(*te)->teLength,false);
+        CharsHandle th = TEGetText (te);
+        HLock       (th);
+        memcpy      (result.sData, *th, result.sLength);
+        HUnlock     (th);
+        return      result;
+    }
+#endif
+    return empty;
+}
+
+//__________________________________________________________________
+void        _HYPlatformTextBox::_StoreText (_String*& res, bool selOnly)
+{
+#ifdef          _HY_USE_MLTE_
+    if (txn) {
+        TXNOffset       s,e;
+        if (selOnly) {
+            TXNGetSelection (txn, &s, &e);
+            if (e<s) {
+                res = new _String;
+                return;
+            }
+        } else if (!_GetCharacterCount()) {
+            res = new _String;
+            return;
+        } else {
+            s = kTXNStartOffset;
+            e = kTXNEndOffset;
+        }
+
+        Handle      th;
+        TXNGetDataEncoded  (txn,s,e,&th,kTXNTextData);
+
+        HLock       (th);
+        res         = new _String (GetHandleSize(th),false);
+        memcpy      (res->sData, *th,res->sLength);
+        res->sData[res->sLength] = 0;
+        HUnlock     (th);
+        DisposeHandle (th);
+    }
+#endif
+}
+//__________________________________________________________________
+void        _HYPlatformTextBox::_CreateTE (void)
+{
+#ifdef          _HY_USE_MLTE_
+    if (txn) {
+        _HYTextBox * theParent = (_HYTextBox*)this;
+
+        _SetFont        (theParent->editBoxFont);
+        _SetForeColor   (theParent->foreColor);
+        //TEAutoView    (true, te);
+        // check this
+        _SetAlignFlags  (theParent->alignFlags);
+        TXNRecalcTextLayout (txn);
+
+        if ((theParent->boxFlags & HY_TB_ENABLED)&&theParent->activationFlag) {
+            TXNActivate (txn,txnFrame,true);
+        }
+
+        TXNDraw   (txn, nil);
+    }
+#else
+    if (te) {
+        _HYTextBox * theParent = (_HYTextBox*)this;
+
+        _SetFont        (theParent->editBoxFont);
+        _SetForeColor   (theParent->foreColor);
+        TEAutoView      (true, te);
+        TECalText       (te);
+        _SetAlignFlags  (theParent->alignFlags);
+        if (theParent->isEnabled&&theParent->activationFlag) {
+            TEActivate (te);
+        }
+        Rect            textBoxRect2 = textBoxRect;
+        InsetRect       (&textBoxRect2,2,2);
+        TEUpdate        (&textBoxRect2,te);
+    }
+#endif
+}
+
+//__________________________________________________________________
+void        _HYPlatformTextBox::_SetText (const _String& editBoxText)
+{
+#ifdef          _HY_USE_MLTE_
+    if (!txn) {
+        _HYTextBox * parent = ((_HYTextBox*)this);
+
+        Rect        textBoxRect2 = textBoxRect;
+        if (parent->boxFlags & (HY_TB_BIGBOX|HY_TB_WRAP)) {
+            textBoxRect.right -= HY_SCROLLER_WIDTH;
+        } else {
+            InsetRect   (&textBoxRect2,1,1);
+        }
+
+        Rect        textBoxRect3 = textBoxRect2;
+
+
+        if (!(parent->boxFlags & (HY_TB_BIGBOX|HY_TB_WRAP))) {
+            textBoxRect3.right += 0x0fffffff;
+        }
+
+        OSStatus err;
+
+        if (parent->boxFlags & HY_TB_BIGBOX)
+            err =  TXNNewObject (nil, ((_HYTextBox*)this)->parentWindow, &textBoxRect3,
+                                 kTXNDontDrawCaretWhenInactiveMask|kTXNDontDrawSelectionWhenInactiveMask|kTXNWantVScrollBarMask|kTXNAlwaysWrapAtViewEdgeMask,
+                                 kTXNTextEditStyleFrameType,
+                                 kTXNTextFile,
+                                 kTXNUnicodeEncoding,
+                                 &txn,
+                                 &txnFrame,
+                                 0);
+        else
+            err =  TXNNewObject (nil, ((_HYTextBox*)this)->parentWindow, &textBoxRect3,
+                                 kTXNDontDrawCaretWhenInactiveMask|kTXNDontDrawSelectionWhenInactiveMask|((parent->boxFlags&HY_TB_WRAP)?(kTXNWantVScrollBarMask|kTXNAlwaysWrapAtViewEdgeMask):0),
+                                 kTXNTextEditStyleFrameType,
+                                 kTXNTextFile,
+                                 kTXNUnicodeEncoding,
+                                 &txn,
+                                 &txnFrame,
+                                 0);
+
+
+        if (err!=noErr) {
+            _String errMsg = _String ("System error ") & (long)err & " while trying to create MLTE object";
+            WarnError (errMsg);
+            txn = nil;
+            return;
+        }
+
+
+        TXNCarbonEventInfo      carbonEventInfo;
+        TXNControlTag           iControlTags[] = { kTXNUseCarbonEvents };
+        TXNControlData          iControlData[1];
+        iControlData[0].uValue = (UInt32) &carbonEventInfo;
+
+        carbonEventInfo.useCarbonEvents = false;
+        carbonEventInfo.filler = 0;
+        carbonEventInfo.flags = 0;
+        carbonEventInfo.fDictionary = NULL;
+        iControlData[0].uValue = (UInt32) &carbonEventInfo;
+        TXNSetTXNObjectControls(txn,
+                                false,
+                                1,
+                                iControlTags,
+                                iControlData
+                               );
+
+        TXNBackground    tbg;
+
+        tbg.bgType   = kTXNBackgroundTypeRGB;
+        tbg.bg.color = (RGBColor) {
+            0xffff,0xffff,0xffff
+        };
+
+        err = TXNSetBackground (txn,&tbg);
+
+        TXNSetViewRect (txn, & textBoxRect2);
+    }
+
+    TXNSetData (txn,kTXNTextData,editBoxText.sData,editBoxText.sLength,kTXNStartOffset,kTXNEndOffset);
+
+#else
+    if (!te) {
+        _HYTextBox * theParent = (_HYTextBox*)this;
+        Rect        textBoxRect2 = textBoxRect;
+        InsetRect   (&textBoxRect2,2,2);
+        Rect        textBoxRect3 = textBoxRect2;
+        if (!theParent->wrapToView) {
+            textBoxRect3.right += 10000;
+        }
+        GrafPtr thisPort;
+        GetPort (&thisPort);
+#ifdef OPAQUE_TOOLBOX_STRUCTS
+        SetPort (GetWindowPort(((_HYTextBox*)this)->parentWindow));
+#else
+        SetPort (((_HYTextBox*)this)->parentWindow);
+#endif
+        te = TEStyleNew (&textBoxRect3, &textBoxRect2);
+        checkPointer(te);
+        SetPort (thisPort);
+    }
+    TESetText   (editBoxText.sData,editBoxText.sLength,te);
+#endif
+    _CreateTE();
+}
+
+//__________________________________________________________________
+void        _HYPlatformTextBox::_InsertText (const _String& editBoxText, bool append)
+{
+#ifdef          _HY_USE_MLTE_
+    if (!txn) {
+        _SetText (editBoxText);
+    } else {
+        //printf ("Insert text\n");
+        TXNSetData (txn,kTXNTextData,editBoxText.sData,editBoxText.sLength,append?kTXNEndOffset:kTXNUseCurrentSelection,append?kTXNEndOffset:kTXNUseCurrentSelection);
+    }
+#else
+    if (!te) {
+        _SetText (editBoxText);
+    } else {
+        TEInsert    (editBoxText.sData,editBoxText.sLength,te);
+    }
+#endif
+}
+
+//__________________________________________________________________
+void        _HYPlatformTextBox::_Paint (Ptr p)
+{
+    _HYTextBox * theParent = (_HYTextBox*)this;
+    _HYRect    * relRect   = (_HYRect*)p;
+    Rect         cRect;
+
+    cRect.left   = relRect->left;
+    cRect.right  = relRect->right;
+    cRect.top    = relRect->top;
+    if (theParent->margins.top) {
+        cRect.bottom = relRect->top+theParent->margins.top;
+        if (!(theParent->settings.width&HY_COMPONENT_TRANSP_BG)) {
+            FillCRect (&cRect,backFill);
+        } else {
+            EraseRect (&cRect);
+        }
+    }
+    cRect.bottom = relRect->bottom;
+    cRect.top = relRect->bottom-theParent->margins.bottom;
+    if (theParent->margins.bottom) {
+        if (!(theParent->settings.width&HY_COMPONENT_TRANSP_BG)) {
+            FillCRect (&cRect,backFill);
+        } else {
+            EraseRect (&cRect);
+        }
+    }
+    cRect.top    = relRect->top;
+    cRect.bottom = relRect->bottom;
+
+    if (theParent->margins.left) {
+        cRect.right  = relRect->left+theParent->margins.left;
+        if (!(theParent->settings.width&HY_COMPONENT_TRANSP_BG)) {
+            FillCRect (&cRect,backFill);
+        } else {
+            EraseRect (&cRect);
+        }
+    }
+
+    if (theParent->margins.right) {
+        cRect.left  = relRect->right-theParent->margins.right;
+        cRect.right  = relRect->right;
+        if (!(theParent->settings.width&HY_COMPONENT_TRANSP_BG)) {
+            FillCRect (&cRect,backFill);
+        } else {
+            EraseRect (&cRect);
+        }
+    }
+
+#ifdef          _HY_USE_MLTE_
+    if (txn) {
+        if (theParent->boxFlags & HY_TB_BIGBOX) {
+            //printf ("Text box update\n");
+            TXNDrawObject   (txn, nil, kTXNDrawItemAllMask);
+        } else {
+            Rect        textBoxRect2 = textBoxRect;
+
+            InsetRect   (&textBoxRect2,1,1);
+
+            DrawThemeEditTextFrame (&textBoxRect2,theParent->activationFlag?kThemeStateActive:kThemeStateInactive);
+
+            TXNDraw   (txn, nil);
+
+            if (theParent->activationFlag&&(theParent->boxFlags & HY_TB_FOCUSED)) {
+                //InsetRect          (&textBoxRect2,1,1);
+                DrawThemeFocusRect (&textBoxRect2,true);
+            }
+        }
+    }
+#else
+    if (te) {
+        FillCRect(&textBoxRect,backTFill);
+        Rect        textBoxRect2 = textBoxRect;
+        InsetRect   (&textBoxRect2,1,1);
+        DrawThemeEditTextFrame (&textBoxRect2,theParent->activationFlag?kThemeStateActive:kThemeStateInactive);
+        InsetRect   (&textBoxRect2,1,1);
+        if (theParent->settings.width&HY_COMPONENT_TRANSP_BG) {
+            SetThemeWindowBackground (theParent->parentWindow,kThemeBrushWhite,false);
+            TEUpdate    (&textBoxRect2,te);
+            SetThemeWindowBackground (theParent->parentWindow,kThemeBrushDialogBackgroundActive,false);
+        } else {
+            TEUpdate    (&textBoxRect2,te);
+        }
+
+        if (theParent->activationFlag&&theParent->isFocused) {
+            InsetRect   (&textBoxRect2,1,1);
+            DrawThemeFocusRect (&textBoxRect2,true);
+        }
+    }
+#endif
+
+
+    (*theParent)._HYPlatformComponent::_Paint(p);
+}
+
+
+//__________________________________________________________________
+
+void        _HYPlatformTextBox::_EnableTextBox (bool e)
+{
+#ifdef          _HY_USE_MLTE_
+    if (txn) {
+        TXNActivate (txn,txnFrame,e);
+    }
+
+#else
+    if (te)
+        if (e) {
+            TEActivate (te);
+        } else {
+            TEDeactivate (te);
+        }
+#endif
+}
+
+//__________________________________________________________________
+
+void        _HYPlatformTextBox::_FocusComponent (void)
+{
+#ifdef          _HY_USE_MLTE_
+    if (txn) {
+        //_String ac = _String ("Focused ") & (long)((_HYTextBox*)this)->GetID() & '\n';
+        //StringToConsole (ac);
+        TXNFocus    (txn,true);
+        TXNActivate (txn,txnFrame,true);
+    }
+#else
+    if (te) {
+        TEActivate (te);
+    }
+#endif
+}
+
+//__________________________________________________________________
+
+void        _HYPlatformTextBox::_UnfocusComponent (void)
+{
+#ifdef          _HY_USE_MLTE_
+    if (txn) {
+        //_String ac = _String ("Unfocused ") & (long)((_HYTextBox*)this)->GetID() & '\n';
+        //StringToConsole (ac);
+        TXNFocus    (txn,false);
+        TXNActivate (txn,txnFrame,false);
+    }
+#else
+    if (te) {
+        TEDeactivate (te);
+    }
+#endif
+}
+
+//__________________________________________________________________
+
+void        _HYTextBox::_Activate (void)
+{
+    if (!activationFlag)
+#ifdef          _HY_USE_MLTE_
+        if (txn&&(boxFlags & HY_TB_ENABLED)) {
+            //_String ac = _String ("Activated ") & (long)GetID() & '\n';
+            //StringToConsole (ac);
+            TXNActivate (txn,txnFrame,true);
+        }
+#else
+        if (te&&isEnabled) {
+            TEActivate (te);
+        }
+#endif
+
+    _HYPlatformComponent::_Activate();
+}
+
+//__________________________________________________________________
+
+void        _HYTextBox::_IdleHandler (void)
+{
+#ifdef          _HY_USE_MLTE_
+    if (txn&&(boxFlags & HY_TB_FOCUSED)) {
+        TXNIdle (txn);
+    }
+#else
+    if (te&&isFocused) {
+        TEIdle (te);
+    }
+#endif
+}
+
+//__________________________________________________________________
+
+void        _HYTextBox::_Deactivate (void)
+{
+    if (activationFlag)
+#ifdef          _HY_USE_MLTE_
+        if (txn&&(boxFlags & HY_TB_ENABLED)) {
+            //_String ac = _String ("Deactivated ") & (long)GetID() & '\n';
+            //StringToConsole (ac);
+            TXNActivate (txn,txnFrame,false);
+        }
+#else
+        if (te&&isEnabled) {
+            TEDeactivate (te);
+        }
+#endif
+
+    _HYPlatformComponent::_Deactivate();
+}
+
+//__________________________________________________________________
+
+_String mlteCommandString (TXNObject& txn, bool undoOrRedo)
+{
+    TXNActionKey tak;
+
+    if (undoOrRedo) {
+        if (!TXNCanUndo (txn,&tak)) {
+            return empty;
+        }
+    } else if (!TXNCanRedo (txn,&tak)) {
+        return empty;
+    }
+
+    switch (tak) {
+    case kTXNTypingAction:
+        return "Typing";
+
+    case kTXNCutAction:
+        return "Cut";
+
+    case kTXNPasteAction:
+        return "Paste";
+
+    case kTXNClearAction:
+        return "Clear";
+
+    case kTXNDropAction:
+        return "Drop";
+    }
+
+    return empty;
+}
+
+
+//__________________________________________________________________
+
+void _HYPlatformTextBox::_HandleContextMenu (Point& where)
+{
+    _HYTextBox* parent = (_HYTextBox*)this;
+    _List       menuOptions;
+    _String     command;
+
+    command = mlteCommandString (txn, true);
+    if (command.sLength) {
+        command = _String ("Undo ") & command;
+    } else {
+        command = "(Can't Undo";
+    }
+
+    menuOptions && & command;
+
+    command = mlteCommandString (txn, false);
+    if (command.sLength) {
+        command = _String ("Redo ") & command;
+    } else {
+        command = "(Can't Redo";
+    }
+
+    menuOptions && & command;
+    menuOptions && & menuSeparator;
+
+    if (!TXNIsSelectionEmpty(txn)) {
+        command = "Cut";
+        menuOptions && & command;
+        command = "Copy";
+    } else {
+        command = "(Cut";
+        menuOptions && & command;
+        command = "(Copy";
+    }
+
+    menuOptions && & command;
+
+    if (TXNIsScrapPastable()) {
+        command = "Paste";
+    } else {
+        command = "(Paste";
+    }
+
+    menuOptions && & command;
+
+    if (_GetCharacterCount()) {
+        command = "Select All";
+    } else {
+        command = "(Select All";
+    }
+    menuOptions && & command;
+
+    command = HandlePullDown (menuOptions, where.h, where.v, -1);
+
+    bool      sendMessage = true;
+
+    long      f = menuOptions.Find (&command);
+
+    if (f>=0) {
+        switch (f) {
+        case 0:
+            parent->_DoUndo();
+            break;
+        case 1:
+            parent->_DoRedo();
+            break;
+        case 3:
+            parent->_DoCut();
+            break;
+        case 4:
+            parent->_DoCopy();
+            //sendMessage = false;
+            break;
+        case 5:
+            parent->_DoPaste();
+            break;
+        case 6:
+            parent->_DoSelectAll ();
+            //sendMessage = false;
+            break;
+        default:
+            return;
+
+        }
+
+        if (((_HYTextBox*)this)->messageRecipient&&sendMessage) {
+            ((_HYTextBox*)this)->messageRecipient->ProcessEvent (generateTextEditChangeEvent (((_HYTextBox*)this)->GetID(),1));
+        }
+    }
+}
+
+//__________________________________________________________________
+
+void _HYTextBox::_DoUndo (bool m)
+{
+#ifdef          _HY_USE_MLTE_
+    TXNUndo (txn);
+    if (m&&messageRecipient) {
+        messageRecipient->ProcessEvent (generateTextEditChangeEvent (GetID(),1));
+    }
+#endif
+}
+
+//__________________________________________________________________
+
+void _HYTextBox::_DoRedo (bool m)
+{
+#ifdef          _HY_USE_MLTE_
+    TXNRedo (txn);
+    if (m&&messageRecipient) {
+        messageRecipient->ProcessEvent (generateTextEditChangeEvent (GetID(),1));
+    }
+#endif
+}
+
+//__________________________________________________________________
+
+void _HYTextBox::_DoCut (bool m)
+{
+#ifdef          _HY_USE_MLTE_
+    TXNCut(txn);
+    if (m&&messageRecipient) {
+        messageRecipient->ProcessEvent (generateTextEditChangeEvent (GetID(),1));
+    }
+#endif
+}
+
+//__________________________________________________________________
+
+void _HYTextBox::_DoCopy (bool )
+{
+#ifdef          _HY_USE_MLTE_
+    TXNCopy(txn);
+#endif
+}
+
+//__________________________________________________________________
+
+void _HYTextBox::_DoPaste (bool m)
+{
+#ifdef          _HY_USE_MLTE_
+    TXNPaste(txn);
+    if (m&&messageRecipient) {
+        messageRecipient->ProcessEvent (generateTextEditChangeEvent (GetID(),1));
+    }
+#endif
+}
+
+//__________________________________________________________________
+
+void _HYTextBox::_DoSelectAll (bool m)
+{
+    ((_HYTextBox*)this)->SetSelection (0,0x7fffffff);
+    if (m&&messageRecipient) {
+        messageRecipient->ProcessEvent (generateTextEditChangeEvent (GetID(),0));
+    }
+}
+
+//__________________________________________________________________
+
+void _HYTextBox::_DoClear (bool doAll, bool m)
+{
+#ifdef          _HY_USE_MLTE_
+    if (doAll) {
+        _DoSelectAll();
+    }
+    TXNClear(txn);
+    if (doAll) {
+        _SetFont (editBoxFont);
+    }
+    if (m&&messageRecipient) {
+        messageRecipient->ProcessEvent (generateTextEditChangeEvent (GetID(),1));
+    }
+
+#endif
+}
+
+//__________________________________________________________________
+
+void _HYTextBox::_DoFind (_String & st)
+{
+#ifdef          _HY_USE_MLTE_
+    if (txn && (boxFlags & HY_TB_BIGBOX)) {
+        TXNMatchTextRecord tmr;
+        tmr.iTextPtr            = st.sData;
+        tmr.iTextToMatchLength  = st.sLength;
+        tmr.iTextEncoding       = CreateTextEncoding (kTextEncodingMacRoman,
+                                  kTextEncodingDefaultVariant,
+                                  kTextEncodingDefaultFormat);
+
+        TXNOffset start = 0,
+                  end;
+
+        TXNGetSelection (txn, &start, &end);
+        end   = kTXNEndOffset;
+
+        TXNFind (txn,
+                 &tmr,
+                 kTXNTextData|kTXNUnicodeTextData,
+                 0,
+                 start,
+                 end,
+                 nil,
+                 0,
+                 &start,
+                 &end);
+
+        if ((start == end)&&(start == kTXNUseCurrentSelection)) {
+            _String eMsg = _String ("Could not find '") & st & "'.";
+            ProblemReport (eMsg, (Ptr)this);
+        } else {
+            TXNSetSelection (txn, start, end);
+            TXNShowSelection (txn, false);
+        }
+
+    }
+#endif
+}
+
+
+//__________________________________________________________________
+
+bool _HYTextBox::_ProcessOSEvent (Ptr vEvent)
+{
+    EventRecord*    theEvent = (EventRecord*)vEvent;
+    WindowPtr       dummy;
+#ifdef          _HY_USE_MLTE_
+    //printf ("%d\n",theEvent->what);
+    if (txn) {
+        switch (theEvent->what) {
+        case mouseDown: {
+            long evtType = FindWindow (theEvent->where,&dummy);
+            if (evtType == inContent) {
+                if (boxFlags & HY_TB_FOCUSED) {
+                    Point localClick = theEvent->where;
+                    if (theEvent->modifiers&controlKey) {
+                        _HandleContextMenu (localClick);
+                    } else {
+                        GlobalToLocal (&localClick);
+                        if (PtInRect (localClick,&textBoxRect)) {
+                            TXNClick (txn, theEvent);
+                            if (messageRecipient) {
+                                messageRecipient->ProcessEvent (generateTextEditChangeEvent (GetID(),0));
+                            }
+                        }
+                    }
+                } else if (messageRecipient) {
+                    messageRecipient->ProcessEvent(generateKeyboardFocusEvent(GetID()));
+                }
+            }
+            return true;
+        }
+        case keyDown:
+        case autoKey: {
+            if (boxFlags & HY_TB_FOCUSED) {
+
+                char c = theEvent->message&charCodeMask,
+                     k = (theEvent->message&keyCodeMask)>>8;
+
+                bool sendMessage = true;
+
+                if ((((_HYTextBox*)this)->boxFlags&HY_TB_ARROWS) && messageRecipient) {
+                    if (k==125) {
+                        messageRecipient->ProcessEvent (generateTextEditChangeEvent (GetID(),3));
+                        return true;
+                    } else if (k==126) {
+                        messageRecipient->ProcessEvent (generateTextEditChangeEvent (GetID(),4));
+                        return true;
+                    }
+                }
+
+                if (!(((_HYTextBox*)this)->boxFlags&HY_TB_BIGBOX)) {
+                    if (theEvent->modifiers&cmdKey) {
+                        bool done = true;
+                        if ((c=='c')||(c=='C')) {
+                            TXNCopy (txn);
+                            sendMessage = false;
+                        } else if ((c=='x')||(c=='X')) {
+                            TXNCut (txn);
+                        } else if ((c=='v')||(c=='V')) {
+                            if (TXNIsScrapPastable()) {
+                                TXNPaste (txn);
+                            }
+                        } else if ((c=='a')||(c=='A')) {
+                            SetSelection (0,0x7fffffff);
+                            sendMessage = false;
+                        } else if ((c=='z')||(c=='Z')) {
+                            if (mlteCommandString (txn,true).sLength) {
+                                TXNUndo (txn);
+                            }
+                        } else if ((c=='y')||(c=='Y')) {
+                            if (mlteCommandString (txn,false).sLength) {
+                                TXNRedo (txn);
+                            }
+                        } else {
+                            done = false;
+                        }
+                    } else {
+                        if ((k==0x24)||(k==0x4C)) {
+                            if (messageRecipient) {
+                                messageRecipient->ProcessEvent (generateTextEditChangeEvent (GetID(),2));
+                            }
+                            return true;
+                        } else {
+                            TXNKeyDown (txn,theEvent);
+                        }
+                    }
+                } else {
+                    if (theEvent->modifiers&cmdKey) {
+                        return false;
+                    }
+
+                    TXNKeyDown (txn,theEvent);
+                }
+                if (messageRecipient&&sendMessage) {
+                    messageRecipient->ProcessEvent (generateTextEditChangeEvent (GetID(),1));
+                }
+                return true;
+            }
+        }
+        }
+    }
+#else
+    if (te) {
+        switch (theEvent->what) {
+        case mouseDown: {
+            long evtType = FindWindow (theEvent->where,&dummy);
+            if (evtType == inContent) {
+                if (isFocused) {
+                    Point localClick = theEvent->where;
+                    GlobalToLocal (&localClick);
+                    if (PtInRect (localClick,&textBoxRect)) {
+                        if (settings.width&HY_COMPONENT_TRANSP_BG) {
+                            SetThemeWindowBackground (parentWindow,kThemeBrushWhite,false);
+                        }
+                        TEClick (localClick, theEvent->modifiers&shiftKey, te);
+                        if (settings.width&HY_COMPONENT_TRANSP_BG) {
+                            SetThemeWindowBackground (parentWindow,kThemeBrushDialogBackgroundActive,false);
+                        }
+                        if (messageRecipient) {
+                            messageRecipient->ProcessEvent (generateTextEditChangeEvent (GetID(),0));
+                        }
+                    }
+                } else if (messageRecipient) {
+                    messageRecipient->ProcessEvent(generateKeyboardFocusEvent(GetID()));
+                }
+            }
+            return true;
+        }
+        case keyDown:
+        case autoKey: {
+            if (isFocused) {
+                if (settings.width&HY_COMPONENT_TRANSP_BG) {
+                    SetThemeWindowBackground (parentWindow,kThemeBrushWhite,false);
+                }
+
+                char c = theEvent->message&charCodeMask,
+                     k = (theEvent->message&keyCodeMask)>>8;
+
+                bool sendMessage = true;
+                if (theEvent->modifiers&cmdKey) {
+                    if ((c=='c')||(c=='C')) {
+                        TECopy (te);
+                        sendMessage = false;
+                    } else if ((c=='x')||(c=='X')) {
+                        TECut (te);
+                    } else if ((c=='v')||(c=='V')) {
+                        TEPaste (te);
+                    } else if ((c=='a')||(c=='A')) {
+                        SetSelection (0,30000);
+                        sendMessage = false;
+                    }
+                } else {
+                    if ((k==0x24)||(k==0x4C)) {
+                        if (messageRecipient) {
+                            messageRecipient->ProcessEvent (generateTextEditChangeEvent (GetID(),2));
+                        }
+                        return true;
+                    } else {
+                        TEKey (c,te);
+                    }
+                }
+                if (settings.width&HY_COMPONENT_TRANSP_BG) {
+                    SetThemeWindowBackground (parentWindow,kThemeBrushDialogBackgroundActive,false);
+                }
+                if (messageRecipient&&sendMessage) {
+                    messageRecipient->ProcessEvent (generateTextEditChangeEvent (GetID(),1));
+                }
+                return true;
+            }
+        }
+        }
+    }
+#endif
+    return _HYPlatformComponent::_ProcessOSEvent (vEvent);
+}
+
+//__________________________________________________________________
+
+void    _HYTextBox::_SetSelection (long s, long e)
+{
+#ifdef          _HY_USE_MLTE_
+    if (txn&&(s>=0)&&(e>=s)) {
+        TXNSetSelection (txn,s,e);
+    }
+#else
+    if (te&&(s>=0)&&(e>=s)) {
+        TESetSelect (s,e,te);
+    }
+#endif
+}
+
+//__________________________________________________________________
+
+bool    _HYTextBox::_IsEmpty (void)
+{
+#ifdef          _HY_USE_MLTE_
+    return _GetCharacterCount() == 0;
+#else
+    return !_GetText().sLength;
+#endif
+}
+
+//__________________________________________________________________
+
+void    _HYTextBox::_MarkForUpdate(void)
+{
+    _HYPlatformComponent::_MarkForUpdate();
+}
+
+
+
+
+
+//EOF
\ No newline at end of file
diff --git a/src/gui/mac/Docs.icns b/src/gui/mac/Docs.icns
new file mode 100644
index 0000000..c4e583b
Binary files /dev/null and b/src/gui/mac/Docs.icns differ
diff --git a/src/gui/mac/HYPHY.icns b/src/gui/mac/HYPHY.icns
new file mode 100644
index 0000000..c4e583b
Binary files /dev/null and b/src/gui/mac/HYPHY.icns differ
diff --git a/src/gui/mac/HYPHYMP.icns b/src/gui/mac/HYPHYMP.icns
new file mode 100644
index 0000000..c4e583b
Binary files /dev/null and b/src/gui/mac/HYPHYMP.icns differ
diff --git a/src/gui/mac/HYPlatformComponent.cpp b/src/gui/mac/HYPlatformComponent.cpp
new file mode 100644
index 0000000..dc18972
--- /dev/null
+++ b/src/gui/mac/HYPlatformComponent.cpp
@@ -0,0 +1 @@
+/*
    A general composite window component object, MacOS specifics

    Sergei L. Kosakovsky Pond, May 2000.
*/

#include "HYComponent.h"
#include "HYPlatformComponent.h"

#ifndef  TARGET_API_MAC_CARBON
#include "Windows.h"
#endif

#include "HYWindow.h"
#include "Controls.h"
#include "ControlDefinitions.h"
#include "Palettes.h"
#include "HYEventTypes.h"
#include "HYCanvas.h"
#include "HYUtils.h"

#include "QDoffscreen.h"
#include "Quicktime.h"


//__________________________________________________________________________________

extern  long        smallScrollStep,
        scrollStepCounter,
        lastScrollControlValue;

extern  _HYGuiObject *
scrollingWindow;

extern  bool        hScrollingAction;
extern  Point       lastScrollPoint;

bool    forceUpdateForScrolling = false;

extern  RGBColor    menuLine1,
        menuLine2;

//__________________________________________________________________________________

void            AlignRectangle (_HYRect& rel , Rect& target , unsigned char alFlags)
{
    long     temp;
    if (alFlags&HY_ALIGN_RIGHT) {
        temp = target.right-target.left;
        target.right = rel.right;
        target.left = target.right - temp;
    } else if (!(alFlags&HY_ALIGN_LEFT)) {
        temp = (rel.right-rel.left-target.right+target.left)/2;
        target.left+=temp;
        target.right+=temp;
    }

    if (alFlags&HY_ALIGN_BOTTOM) {
        temp = target.bottom-target.top;
        target.bottom = rel.bottom;
        target.top = target.bottom - temp;
    } else if (!(alFlags&HY_ALIGN_TOP)) {
        temp = (rel.bottom-rel.top-target.bottom+target.top)/2;
        target.top+=temp;
        target.bottom+=temp;
    }
}

//__________________________________________________________________

pascal void scrollAction (ControlHandle,ControlPartCode);

/*//__________________________________________________________________

pascal void  controlScrollAction (ControlHandle theControl,ControlPartCode ctlPart)
{
    long   cv  = GetControl32BitValue (theControl),
           cv2 = cv;

    long    smStep,
            invisPixels;

    _HYPlatformComponent*    thisC      = (_HYPlatformComponent*)GetControlReference (theControl);
    _HYComponent*            theParent  = (_HYComponent*)thisC;
    bool                     hScrAction = (thisC->hScroll==theControl);

    if (hScrAction)
        invisPixels = theParent->GetMaxW()-(theParent->GetHSize());
    else
        invisPixels = theParent->GetMaxH()-(theParent->GetVSize());

    smStep = (double)MAX_CONTROL_VALUE/invisPixels;
    if (!smStep)
        smStep = 1;


    switch (ctlPart)
    {
        case kControlDownButtonPart:
            HiliteControl (theControl,kControlDownButtonPart);
            cv2 = cv+smStep;
            if (cv2>MAX_CONTROL_VALUE)
                cv2 = MAX_CONTROL_VALUE;
            break;
        case kControlUpButtonPart:
            HiliteControl (theControl,kControlUpButtonPart);
            cv2 = cv-smStep;
            if (cv2<0)
                cv2 = 0;
            break;
        case kControlPageUpPart:
            HiliteControl (theControl,kControlPageUpPart);
            cv2 = cv-100*smStep;
            if (cv2<0)
                cv2 = 0;
            break;
        case kControlPageDownPart:
            HiliteControl (theControl,kControlPageDownPart);
            cv2 = cv+100*smStep;
            if (cv2>MAX_CONTROL_VALUE)
                cv2 = MAX_CONTROL_VALUE;
            break;
        case kControlIndicatorPart:
            cv2 = cv;
            cv  = hScrAction?thisC->lastHScroll:thisC->lastVScroll;
            printf ("%d %d\n", cv, cv2);
            break;
    }

    if (cv!=cv2)
    {
        SetControl32BitValue (theControl,cv2);
        forceUpdateForScrolling = true;
        if (hScrAction)
        {
            ((_HYComponent*)thisC)->ProcessEvent (generateScrollEvent (cv2-cv,0));
            thisC->lastHScroll = cv2;
        }
        else
        {
            ((_HYComponent*)thisC)->ProcessEvent (generateScrollEvent (0,cv2-cv));
            thisC->lastVScroll = cv2;
        }
        forceUpdateForScrolling = false;
    }
}

//__________________________________________________________________

ControlActionUPP      ctlActionUPP = NewControlActionUPP (controlScrollAction);*/
//__________________________________________________________________

_HYPlatformComponent::_HYPlatformComponent(void)
{
    vScroll = hScroll = nil;
}

//__________________________________________________________________

_HYPlatformComponent::_HYPlatformComponent(_HYRect s,Ptr w)
{
    bool    memError = false;
    vScroll = hScroll = nil;
    WindowPtr theWindow = (WindowPtr)w;
    Rect    cSize;
    if (s.width&HY_COMPONENT_H_SCROLL) {
        cSize.left = cSize.top = 0;
        cSize.right = 100;
        cSize.bottom = 15;
        hScroll = NewControl (theWindow,&cSize,"\p",false,0,0,MAX_CONTROL_VALUE,kControlScrollBarLiveProc,(SInt32)this);
        if (!hScroll) {
            memError = true;
        } else {
            SetControl32BitMinimum (hScroll,0);
            SetControl32BitMaximum (hScroll,MAX_CONTROL_VALUE);
            //SetControlAction     (hScroll, ctlActionUPP);
        }
    }
    if (s.width&HY_COMPONENT_V_SCROLL) {
        cSize.left = cSize.top = 0;
        cSize.bottom = 100;
        cSize.right = 15;
        vScroll = NewControl (theWindow,&cSize,"\p",false,0,0,MAX_CONTROL_VALUE,kControlScrollBarLiveProc,(SInt32)this);
        if (!vScroll) {
            memError = true;
        } else {
            SetControl32BitMinimum (vScroll,0);
            SetControl32BitMaximum (vScroll,MAX_CONTROL_VALUE);
            //SetControlAction     (vScroll, ctlActionUPP);
        }
    }
    if (memError) {
        _String errMsg = "Could not allocate memory for a window component structure.";
        FlagError (errMsg);
    }
    parentWindow = theWindow;
    lastHScroll = 0;
    lastVScroll = 0;
}

//__________________________________________________________________

void _HYPlatformComponent::_CleanUp(void)
{
    if (hScroll) {
        DisposeControl (hScroll);
        hScroll = nil;
    }
    if (vScroll) {
        DisposeControl (vScroll);
        vScroll = nil;
    }
}

//__________________________________________________________________
long        _HYPlatformComponent::_GetHScrollerPos (void)
{
    if (hScroll) {
        return GetControl32BitValue (hScroll);
    } else {
        return 0;
    }
}
//__________________________________________________________________
long        _HYPlatformComponent::_GetVScrollerPos (void)
{
    if (vScroll) {
        return GetControl32BitValue (vScroll);
    } else {
        return 0;
    }
}

//__________________________________________________________________
void        _HYPlatformComponent::_SetHScrollerPos (long nv)
{
    if (hScroll) {
        if (nv<0) {
            nv = 0;
        } else if (nv>MAX_CONTROL_VALUE) {
            nv = MAX_CONTROL_VALUE;
        }
        SetControl32BitValue (hScroll,nv);
    }
}

//__________________________________________________________________
void        _HYPlatformComponent::_SetVScrollerPos (long nv)
{
    if (vScroll) {
        if (nv<0) {
            nv = 0;
        } else if (nv>MAX_CONTROL_VALUE) {
            nv = MAX_CONTROL_VALUE;
        }
        SetControl32BitValue (vScroll,nv);
    }
}


//__________________________________________________________________
void _HYPlatformComponent::Duplicate (BaseRef s)
{
    _HYComponent* theS = (_HYComponent*)s;
    _CleanUp();
    hScroll = theS->hScroll;
    vScroll = theS->vScroll;
}

//__________________________________________________________________
void _HYPlatformComponent::_SetDimensions (_HYRect,_HYRect r)
{
    _SetVisibleSize (r);
}

//__________________________________________________________________
void _HYPlatformComponent::_MarkForUpdate (void)
{
    Rect inv;
    inv.left = rel.left;
    inv.right = rel.right;
    inv.bottom = rel.bottom;
    inv.top = rel.top;
    GrafPtr   savePort;
    GetPort   (&savePort);
#ifdef OPAQUE_TOOLBOX_STRUCTS
    SetPort (GetWindowPort(parentWindow));
#else
    SetPort (parentWindow);
#endif

    if (forceUpdateForScrolling) {
        //BeginUpdate(parentWindow);
        _Paint((Ptr)&rel);
        //EndUpdate(parentWindow);
    } else
#ifdef TARGET_API_MAC_CARBON
        InvalWindowRect (parentWindow,&inv);
#else
        InvalRect (&inv);
#endif

    SetPort   (savePort);
}

//__________________________________________________________________
void _HYPlatformComponent::_MarkContentsForUpdate (void)
{
    Rect inv;
    inv.left = rel.left;
    inv.right = rel.right;
    inv.bottom = rel.bottom;
    inv.top = rel.top;
    if (hScroll) {
        inv.bottom -= HY_SCROLLER_WIDTH;
    }
    if (vScroll) {
        inv.right -= HY_SCROLLER_WIDTH;
    }
    GrafPtr   savePort;
    GetPort   (&savePort);
#ifdef OPAQUE_TOOLBOX_STRUCTS
    SetPort (GetWindowPort(parentWindow));
#else
    SetPort (parentWindow);
#endif
    if (forceUpdateForScrolling) {
        _Paint((Ptr)&rel);
    } else
#ifdef TARGET_API_MAC_CARBON
        InvalWindowRect (parentWindow,&inv);
#else
        InvalRect (&inv);
#endif

    SetPort   (savePort);
}

//__________________________________________________________________

void        _HYPlatformComponent::_SetVisibleSize (_HYRect r)
{
    _HYComponent * theParent = (_HYComponent*)this;
    long        t, v;

    _Parameter  newSize;

    if (hScroll&&!vScroll) { // only horizontal scroll bar
        MoveControl (hScroll,r.left-1,r.bottom-16);
        SizeControl (hScroll,r.right-r.left+1,16);
        t = theParent->GetMaxW();
        v = r.right-r.left+1;
        //char buf[256];
        //sprintf (buf,"%d %d\n",t,v);
        //BufferToConsole (buf);
        if (t>v) {
            if (GetControl32BitMaximum (hScroll)!=MAX_CONTROL_VALUE) {
                lastHScroll = 0;
                SetControl32BitMaximum (hScroll,MAX_CONTROL_VALUE);
            }

            HiliteControl (hScroll,0);
            newSize = MAX_CONTROL_VALUE*(_Parameter)v/(t-v);
            if (newSize>0x6fffffff) {
                newSize = 0x6fffffff;
            }
            SetControlViewSize (hScroll,(long)newSize);
        } else {
            SetControl32BitMaximum (hScroll,0);
            SetControl32BitValue   (hScroll,0);
            HiliteControl (hScroll, kControlInactivePart);
        }
    }
    if (vScroll&&!hScroll) { // only vertical scroll bar
        MoveControl (vScroll,r.right-16,r.top-1);
        SizeControl (vScroll,16,r.bottom-r.top+1);
        t = theParent->GetMaxH();
        v = r.bottom-r.top+1;
        if (t>v) {
            if (GetControl32BitMaximum (vScroll)!=MAX_CONTROL_VALUE) {
                lastVScroll = 0;
                SetControl32BitMaximum (vScroll,MAX_CONTROL_VALUE);
            }

            HiliteControl (vScroll,0);
            newSize = MAX_CONTROL_VALUE*(_Parameter)v/(t-v);
            if (newSize>0x6fffffff) {
                newSize = 0x6fffffff;
            }
            SetControlViewSize (vScroll,(long)newSize);
        } else {
            SetControl32BitMaximum (vScroll,0);
            SetControl32BitValue   (vScroll,0);
            HiliteControl (vScroll, kControlInactivePart);
        }
    }
    if (vScroll&&hScroll) {
        MoveControl (hScroll,r.left-1,r.bottom-16);
        SizeControl (hScroll,r.right-r.left-13,16);
        t = theParent->GetMaxW();
        v = r.right-r.left+1+HY_SCROLLER_WIDTH;
        if (t>v) {
            if (GetControl32BitMaximum (hScroll)!=MAX_CONTROL_VALUE) {
                lastHScroll = 0;
                SetControl32BitMaximum (hScroll,MAX_CONTROL_VALUE);
            }
            HiliteControl (hScroll,0);
            newSize = MAX_CONTROL_VALUE*(_Parameter)v/(t-v);
            if (newSize>0x6fffffff) {
                newSize = 0x6fffffff;
            }
            SetControlViewSize (hScroll,(long)newSize);
        } else {
            SetControl32BitMaximum (hScroll,0);
            SetControl32BitValue   (hScroll,0);
            HiliteControl (hScroll, kControlInactivePart);
        }
        MoveControl (vScroll,r.right-16,r.top-1);
        SizeControl (vScroll,16,r.bottom-r.top+2);
        t = theParent->GetMaxH();
        v = r.bottom-r.top+1+HY_SCROLLER_WIDTH;
        if (t>v) {
            if (GetControl32BitMaximum (vScroll)!=MAX_CONTROL_VALUE) {
                lastVScroll = 0;
                SetControl32BitMaximum (vScroll,MAX_CONTROL_VALUE);
            }
            HiliteControl (vScroll,0);
            newSize = MAX_CONTROL_VALUE*(_Parameter)v/(t-v);
            if (newSize>0x6fffffff) {
                newSize = 0x6fffffff;
            }
            SetControlViewSize (vScroll,(long)newSize);
        } else {
            SetControl32BitMaximum (vScroll,0);
            SetControl32BitValue   (vScroll,0);
            HiliteControl (vScroll, kControlInactivePart);
        }
    }
    rel = r;
}
//__________________________________________________________________

void        _HYPlatformComponent::_Paint (Ptr)
{
    _HYComponent* parent = (_HYComponent*)this;
    if (parent->settings.width&HY_COMPONENT_BORDER) {
        RGBColor saveColor;
        PenState sp;
        GetPenState (&sp);
        GetForeColor (&saveColor);
        RGBForeColor (&menuLine2);
        PenSize (1,1);
        MoveTo (rel.left,rel.top);
        if (parent->settings.width&HY_COMPONENT_BORDER_T) {
            LineTo (rel.right-1,rel.top);
        } else {
            MoveTo (rel.right-1,rel.top);
        }
        if (parent->settings.width&HY_COMPONENT_BORDER_R) {
            LineTo (rel.right-1,rel.bottom-1);
        } else {
            MoveTo (rel.right-1,rel.bottom-1);
        }
        if (parent->settings.width&HY_COMPONENT_BORDER_B) {
            LineTo (rel.left,rel.bottom-1);
        } else {
            MoveTo (rel.left,rel.bottom-1);
        }
        if (parent->settings.width&HY_COMPONENT_BORDER_L) {
            LineTo (rel.left,rel.top);
        }
        SetPenState (&sp);
        RGBForeColor (&saveColor);
    }
    if (parent->settings.width&HY_COMPONENT_WELL) {
        Rect rr = HYRect2Rect (rel);
        InsetRect (&rr,2,2);
        DrawThemeGenericWell (&rr,activationFlag?kThemeStateActive:kThemeStateInactive,false);
    }
    if (hScroll) {
        Draw1Control (hScroll);
    }
    if (vScroll) {
        Draw1Control (vScroll);
    }
}

//__________________________________________________________________

void      _HYPlatformComponent::_Update (Ptr p)
{
    _Paint (p);
}

//__________________________________________________________________

void        _HYPlatformComponent::_Activate (void)
{
    _HYComponent*   theParent = (_HYComponent*)this;
    if (hScroll) {
        ShowControl (hScroll);
        if (theParent->GetMaxW()>theParent->rel.right-theParent->rel.left+1+HY_SCROLLER_WIDTH) {
            HiliteControl (hScroll,kControlNoPart);
        }
    }
    if (vScroll) {
        ShowControl (vScroll);
        if (theParent->GetMaxH()>theParent->rel.bottom-theParent->rel.top+1+HY_SCROLLER_WIDTH) {
            HiliteControl (vScroll, kControlNoPart );
        }
    }
    activationFlag = true;
}

//__________________________________________________________________

void        _HYPlatformComponent::_Deactivate (void)
{
    if (hScroll) {
        HiliteControl (hScroll, kControlInactivePart);
    }
    if (vScroll) {
        HiliteControl (vScroll, kControlInactivePart);
    }

    activationFlag = false;
}

//__________________________________________________________________

bool _HYPlatformComponent::_ProcessOSEvent (Ptr vEvent)
{
    EventRecord*    theEvent = (EventRecord*)vEvent;
    WindowPtr       dummy;
    _HYComponent*   theParent = (_HYComponent*)this;
    switch (theEvent->what) {
    case mouseDown: {
        long evtType = FindWindow (theEvent->where,&dummy);
        switch (evtType) {
        case inContent: {
            Point localClick = theEvent->where;
            GlobalToLocal (&localClick);
            ControlHandle whichC;
            short f = FindControl (localClick,dummy,&whichC);
            scrollingWindow = theParent;
            if (f) {
                // set scroll step
                long    invisPixels;
                if (whichC==hScroll) {
                    invisPixels = theParent->GetMaxW()-(theParent->GetHSize());
                    hScrollingAction = true;
                } else {
                    if (whichC==vScroll) {
                        invisPixels = theParent->GetMaxH()-(theParent->GetVSize());
                        hScrollingAction = false;
                    } else {
                        return false;
                    }
                }
                scrollStepCounter = 0;
                smallScrollStep = (double)MAX_CONTROL_VALUE/invisPixels;
                if (!smallScrollStep) {
                    smallScrollStep = 1;
                }
#ifdef TARGET_API_MAC_CARBON
                ControlActionUPP myActionProc;
                myActionProc =   NewControlActionUPP(scrollAction);
#else
                UniversalProcPtr myActionProc;
                myActionProc = NewRoutineDescriptor((ProcPtr)scrollAction,
                                                    uppControlActionProcInfo,
                                                    GetCurrentISA());
#endif

                lastScrollControlValue = GetControl32BitValue (whichC);

                switch (f) {
                    /*case kControlIndicatorPart:
                    {
                        long    cv = GetControl32BitValue(whichC),cv2;
                        TrackControl (whichC,localClick,nil);
                        cv2 = GetControl32BitValue(whichC);
                        if (cv!=cv2)
                            if (hScrollingAction)
                                scrollingWindow->ProcessEvent (generateScrollEvent (cv2-cv,0));
                            else
                                scrollingWindow->ProcessEvent (generateScrollEvent (0,cv2-cv));

                        break;
                    }*/
                default: {
                    forceUpdateForScrolling = true;
#ifndef __OLDMAC__
                    TrackControl (whichC,localClick,myActionProc);
#else
#ifdef TARGET_API_MAC_CARBON
                    HandleControlClick (whichC,localClick,theEvent->modifiers,scrollAction);
#else
                    TrackControl (whichC,localClick,scrollAction);
#endif
#endif
                    forceUpdateForScrolling = false;
                }
#ifdef TARGET_API_MAC_CARBON
                DisposeControlActionUPP(myActionProc);
#endif

                }
                return true;
            }
        }
        }
    }
    }
    return false;
}

//__________________________________________________________________


_HYRect _HYPlatformComponent::_VisibleContents (Ptr p)
{
    _HYComponent* theParent = (_HYComponent*)this;
    _HYRect     * r = (_HYRect*)p,
                  res;

    short v;
    short windowW=r->right-r->left,
          windowH=r->bottom-r->top;
    if ((!hScroll)&&(!vScroll)) {
        res.left = theParent->hOrigin;
        res.right = res.left+windowW;
        res.top = theParent->vOrigin;
        res.bottom = res.top+windowH;
        return res;
    }
    if (hScroll) {
        windowH-=HY_SCROLLER_WIDTH;
    }
    if (vScroll) {
        windowW-=HY_SCROLLER_WIDTH;
    }
    if (hScroll) {
        if (windowW>theParent->GetMaxW()) {
            res.left = 0;
            res.right = theParent->GetMaxW();
        } else {
            v = GetControl32BitValue (hScroll);
            res.left = (theParent->GetMaxW()-windowW)*v/(double)MAX_CONTROL_VALUE;
            res.right = res.left+windowW;
        }
    } else {
        res.left = 0;
        res.right = windowW;
    }
    if (vScroll) {
        if (windowH>theParent->GetMaxH()) {
            res.top = 0;
            res.bottom = theParent->GetMaxH();
        } else {
            v = GetControl32BitValue (vScroll);
            res.top = (theParent->GetMaxH()-windowH)*v/(double)MAX_CONTROL_VALUE;
            res.bottom = res.top+windowH;
        }
    } else {
        res.top = 0;
        res.bottom = windowH;
    }
    return res;
}

//__________________________________________________________________

void    _HYCanvas::_Paint (Ptr p)
{
    _HYRect * destR = (_HYRect*)p;
    Rect srcRect,destRect;
    destRect.right = destR->right;
    destRect.bottom = destR->bottom;
    if (HasHScroll()) {
        destRect.bottom-=HY_SCROLLER_WIDTH;
    }
    if (HasVScroll()) {
        destRect.right-=HY_SCROLLER_WIDTH;
    }
//  if (RectInRgn (&destRect,((WindowPeek)parentWindow)->updateRgn))
    {
        _HYPlatformComponent::_Paint(p);
        destRect.left = destR->left;
        destRect.top = destR->top;
        _HYRect srcR = _VisibleContents (p);
        srcRect.right = srcR.right;
        srcRect.left = srcR.left;
        srcRect.top = srcR.top;
        srcRect.bottom = srcR.bottom;
        RGBColor         foreC,
                         backC;
        GetForeColor     (&foreC);
        GetBackColor     (&backC);
        RGBColor         white = {0xffff,0xffff,0xffff};
        RGBBackColor (&white);
        white.red = white.green = white.blue = 0;
        RGBForeColor (&white);
        LockPixels (GetGWorldPixMap(thePane));
#ifdef OPAQUE_TOOLBOX_STRUCTS
        CopyBits (GetPortBitMapForCopyBits(thePane),GetPortBitMapForCopyBits(GetWindowPort(parentWindow)),&srcRect,&destRect,srcCopy,(RgnHandle)nil);
#else
        CopyBits (&(GrafPtr(thePane)->portBits),&(parentWindow->portBits),&srcRect,&destRect,srcCopy,(RgnHandle)nil);
#endif
        UnlockPixels (GetGWorldPixMap(thePane));
        RGBForeColor     (&foreC);
        RGBBackColor     (&backC);
    }
}

//__________________________________________________________________

void    _HYCanvas::_Update (Ptr p)
{
    _Paint(p);
}

//__________________________________________________________________

_List       exportFormats;
_SimpleList exportOptions;

void        findGraphicsExporterComponents (_List&, _SimpleList&);

//__________________________________________________________________

bool _HYCanvas::_ProcessOSEvent (Ptr vEvent)
{
    if (_HYPlatformComponent::_ProcessOSEvent (vEvent)) {
        return true;
    }

    EventRecord*    theEvent = (EventRecord*)vEvent;
    WindowPtr       dummy;
    _HYComponent*   theParent = (_HYComponent*)this;
    switch (theEvent->what) {
    case mouseDown: {
        long evtType = FindWindow (theEvent->where,&dummy);
        switch (evtType) {
        case inContent: {
            if (theEvent->modifiers&controlKey) {
                if (exportFormats.lLength==0) {
                    findGraphicsExporterComponents (exportFormats,exportOptions);
                }
                _String s1 ("Save as a picture"),
                        s2 ("Save canvas as:"),
                        filePath;
                _List   menuOptions;
                menuOptions && & s1;
                long    menuChoice;
                s1 = HandlePullDown (menuOptions,theEvent->where.h,theEvent->where.v,0);
                menuChoice  = menuOptions.Find (&s1);
                if (menuChoice==0) {
                    s1 = "snapshot";
                    menuChoice = SaveFileWithPopUp (filePath, s2,s1, empty,exportFormats);
                    if (menuChoice>=0) {
                        Str255 buff;
                        ComponentInstance grexc = OpenComponent ((Component)exportOptions(menuChoice));
                        GraphicsExportSetInputGWorld (grexc,thePane);
                        FSSpec  fs;
                        StringToStr255 (filePath,buff);
                        FSMakeFSSpec(0,0,buff,&fs);
                        GraphicsExportSetOutputFile (grexc,&fs);
                        GraphicsExportRequestSettings (grexc,nil,nil);
                        unsigned long dummy;
                        OSType t,c;
                        GraphicsExportGetDefaultFileTypeAndCreator (grexc,&t,&c);
                        GraphicsExportSetOutputFileTypeAndCreator (grexc,t,c);
                        GraphicsExportDoExport (grexc,&dummy);
                        CloseComponent (grexc);
                    }

                }
                return true;
            } else {
                if ((messageRecipient)&&(doMouseClicks)) {
                    GrafPtr curPort;
                    GetPort (&curPort);
#ifdef TARGET_API_MAC_CARBON
                    SetPort (GetWindowPort (theParent->parentWindow));
#else
                    SetPort (theParent->parentWindow);
#endif
                    Point localClick = theEvent->where;
                    GlobalToLocal (&localClick);
                    SetPort (curPort);
                    messageRecipient->ProcessEvent(generateContextPopUpEvent (GetID(),localClick.h-rel.left,localClick.v-rel.top));
                    return true;
                }
            }
        }
        }
    }
    }
    return false;
}



//EOF
\ No newline at end of file
diff --git a/src/gui/mac/HYPlatformGraphicPane.cpp b/src/gui/mac/HYPlatformGraphicPane.cpp
new file mode 100644
index 0000000..b390530
--- /dev/null
+++ b/src/gui/mac/HYPlatformGraphicPane.cpp
@@ -0,0 +1,607 @@
+/*
+    A painting canvas with double buffer. MacOS.
+
+    Sergei L. Kosakovsky Pond, May 2000.
+*/
+
+#include "HYGraphicPane.h"
+#include "QDOffscreen.h"
+#include "Quickdraw.h"
+//#include "Textedit.h"
+#include "Fonts.h"
+#include "stdlib.h"
+#include "errorfns.h"
+#include "scrap.h"
+#include "QuickTimeComponents.h"
+#include "ImageCompression.h"
+#include "HYUtils.h"
+#include "HYPulldown.h"
+#include "HYPlatformWindow.h"
+#include "Appearance.h"
+#include "Resources.h"
+#include "MacTextEditor.h"
+
+extern      void StringToStr255 (_String&, Str255&);
+
+extern      Pattern penHatchPattern,vertPenHatchPattern;
+
+void        findGraphicsExporterComponents (_List&, _SimpleList&);
+
+_List       graphicsFormats;
+
+_SimpleList qtGrexComponents;
+
+_String     savePicPrompt               ("Save Picture As:"),
+            savePicAs                  ("File Format:");
+
+//__________________________________________________________________
+
+Rect    HYRect2Rect (_HYRect& hr)
+{
+    Rect r;
+    r.left = hr.left;
+    r.right = hr.right;
+    r.top = hr.top;
+    r.bottom = hr.bottom;
+    return r;
+}
+
+//__________________________________________________________________
+
+void findGraphicsExporterComponents(_List& compList, _SimpleList& compIndex)
+{
+    ComponentDescription cd, cd2;
+    Component c = 0;
+
+    cd.componentType            = GraphicsExporterComponentType;
+    cd.componentSubType         = 0;
+    cd.componentManufacturer    = 0;
+    cd.componentFlags           = 0;
+    cd.componentFlagsMask       = graphicsExporterIsBaseExporter;
+
+    _String fileFormat;
+
+    while( ( c = FindNextComponent( c, &cd ) ) != 0 ) {
+        Handle     cInfo = NewHandle(256);
+        GetComponentInfo (c,&cd2,cInfo,nil,nil);
+        (*cInfo)[**cInfo+1] = 0;
+        fileFormat = (char*)(*cInfo+1);
+        if (fileFormat.sLength) {
+            compList&& &fileFormat;
+            compIndex << (long)c;
+        }
+        DisposeHandle(cInfo);
+    }
+}
+
+//__________________________________________________________________
+
+void InitializeQTExporters(void)
+{
+    if (!graphicsFormats.lLength) {
+        qtGrexComponents.Clear();
+        findGraphicsExporterComponents (graphicsFormats, qtGrexComponents);
+    }
+}
+
+//__________________________________________________________________
+
+_HYPlatformGraphicPane::_HYPlatformGraphicPane(int h, int w, int d)
+{
+    Rect  bRect;
+    bRect.left = bRect.top = 0;
+    bRect.right = w;
+    bRect.bottom = h;
+
+    short errCode;
+
+    if (d>1) {
+        errCode = NewGWorld (&thePane,d,&bRect,0,GetMainDevice(),noNewDevice);
+
+        if (errCode == -108) { // no memory
+            errCode = NewGWorld (&thePane,d,&bRect,0,GetMainDevice(),noNewDevice|useTempMem);
+        }
+    } else {
+        errCode = NewGWorld (&thePane,d,&bRect,0,nil,0);
+
+        if (errCode == -108) { // no memory
+            errCode = NewGWorld (&thePane,d,&bRect,0,nil,useTempMem);
+        }
+    }
+
+    fillColor = NewPixPat();
+    //backColor = NewPixPat();
+    if (errCode||(!fillColor)) {
+        _String errMsg ("MacOS Error ");
+        errMsg = errMsg & (long)errCode &" while trying to allocate memory for GraphicPane";
+        FlagError (errMsg);
+    }
+    savedPort = nil;
+}
+
+//__________________________________________________________________
+
+_HYPlatformGraphicPane::~_HYPlatformGraphicPane(void)
+{
+    DisposeGWorld (thePane);
+    DisposePixPat (fillColor);
+    //DisposePixPat (backColor);
+}
+
+//__________________________________________________________________
+
+void _HYPlatformGraphicPane::_SetPaneSize  (int h,int w, int d)
+{
+    DisposeGWorld (thePane);
+    Rect  bRect;
+    bRect.left = bRect.top = 0;
+    bRect.right = w;
+    bRect.bottom = h;
+    short errCode;
+    if (d>1) {
+        errCode = NewGWorld (&thePane,d,&bRect,0,GetMainDevice(),noNewDevice);
+
+        if (errCode == -108) { // no memory
+            errCode = NewGWorld (&thePane,d,&bRect,0,GetMainDevice(),noNewDevice|useTempMem);
+        }
+    } else {
+        errCode = NewGWorld (&thePane,d,&bRect,0,nil,0);
+
+        if (errCode == -108) { // no memory
+            errCode = NewGWorld (&thePane,d,&bRect,0,nil,useTempMem);
+        }
+    }
+
+    if (errCode) {
+        _String errMsg ("MacOS Error ");
+        errMsg = errMsg & (long)errCode &" while trying to allocate memory for GraphicPane";
+        FlagError (errMsg);
+    }
+}
+
+
+//__________________________________________________________________
+
+void _HYPlatformGraphicPane::_DrawLine (_HYRect lineDesc)
+{
+    PenSize (lineDesc.width, lineDesc.width);
+    MoveTo  (lineDesc.left, lineDesc.top);
+    LineTo  (lineDesc.right,lineDesc.bottom);
+}
+
+//__________________________________________________________________
+
+void _HYPlatformGraphicPane::_DrawHatchedLine (_HYRect lineDesc)
+{
+    PenState savePen;
+    GetPenState (&savePen);
+    if (abs(lineDesc.left-lineDesc.right)>5) {
+        PenPat (&penHatchPattern);
+    } else {
+        PenPat (&vertPenHatchPattern);
+    }
+    PenSize (lineDesc.width, lineDesc.width);
+    MoveTo  (lineDesc.left, lineDesc.top);
+    LineTo  (lineDesc.right,lineDesc.bottom);
+    SetPenState (&savePen);
+}
+
+
+//__________________________________________________________________
+void _HYPlatformGraphicPane::_DisplayText    (_String theText,int t, int l, bool dir)
+{
+    MoveTo (l,t);
+    if (!dir) {
+        _HYGraphicPane* theParent = (_HYGraphicPane*)this;
+        long            fontSize = theParent->font.size+1;
+
+        t+=fontSize;
+        for (long k = 0; k < theText.sLength; k++, t += fontSize) {
+            DrawChar (theText.sData[k]);
+            MoveTo (l, t);
+        }
+    } else {
+        DrawText (theText.sData,0,theText.sLength);
+    }
+}
+
+//__________________________________________________________________
+void _HYPlatformGraphicPane::_DisplayText    (_String& theText,_HYRect& r, char align)
+{
+    _EraseRect (r);
+    Rect    tb = HYRect2Rect (r);
+    CFStringRef cTextRef = CFStringCreateWithCString (nil, theText.sData, kCFStringEncodingMacRoman);
+    TXNTextBoxOptionsData opts;
+    opts.optionTags = kTXNSetFlushnessMask;
+    opts.flushness  = (align==HY_ALIGN_LEFT)?kATSUStartAlignment:(align==HY_ALIGN_RIGHT?kATSUEndAlignment:kATSUCenterAlignment);
+    TXNDrawCFStringTextBox (cTextRef, &tb, nil, &opts);
+    CFRelease (cTextRef);
+    //short saveTextMode = thePane->txMode;
+    //TextMode (srcOr);
+    //TETextBox(theText.sData, theText.sLength, &tb, (align==HY_ALIGN_LEFT)?0:(align==HY_ALIGN_RIGHT?-1:1));
+    //TextMode (saveTextMode);
+}
+
+//__________________________________________________________________
+void _HYPlatformGraphicPane::_DisplayChar  (char c,int t, int l)
+{
+    MoveTo (l,t);
+    DrawChar (c);
+}
+
+//__________________________________________________________________
+void _HYPlatformGraphicPane::_SlidePane  (int dv, int dh)
+{
+    _HYGraphicPane* theParent = (_HYGraphicPane*)this;
+    Rect r = {0,0,theParent->h,theParent->w};
+    RgnHandle dummy = NewRgn();
+    checkPointer (dummy);
+    ScrollRect(&r,dh,dv,dummy);
+    DisposeRgn (dummy);
+}
+
+//__________________________________________________________________
+void _HYPlatformGraphicPane::_SlideRect (_HYRect& rct, int dv, int dh)
+{
+    Rect r;
+    r.left = rct.left;
+    r.top = rct.top;
+    r.bottom = rct.bottom;
+    r.right = rct.right;
+    RgnHandle dummy = NewRgn();
+    checkPointer (dummy);
+    ScrollRect(&r,dh,dv,dummy);
+    DisposeRgn (dummy);
+}
+
+//__________________________________________________________________
+void _HYPlatformGraphicPane::_InvertRect (_HYRect& rct)
+{
+    Rect r = HYRect2Rect (rct);
+    InvertRect (&r);
+}
+
+//__________________________________________________________________
+
+void _HYPlatformGraphicPane::_DrawRect (_HYRect rectDesc)
+{
+    PenSize (rectDesc.width, rectDesc.width);
+    Rect    r= HYRect2Rect (rectDesc);
+    FrameRect (&r);
+
+}
+//__________________________________________________________________
+
+void _HYPlatformGraphicPane::_FillRect (_HYRect rectDesc)
+{
+    Rect    r= HYRect2Rect (rectDesc);
+    FillCRect (&r,fillColor);
+}
+
+//__________________________________________________________________
+
+void _HYPlatformGraphicPane::_EraseRect (_HYRect rectDesc)
+{
+    Rect    r= HYRect2Rect (rectDesc);
+    EraseRect (&r);
+}
+
+//__________________________________________________________________
+
+void _HYPlatformGraphicPane::_DrawOval (_HYRect rectDesc)
+{
+    PenSize (rectDesc.width, rectDesc.width);
+    Rect    r= HYRect2Rect (rectDesc);
+    FrameOval (&r);
+
+}
+//__________________________________________________________________
+
+void _HYPlatformGraphicPane::_FillOval (_HYRect rectDesc)
+{
+    Rect    r= HYRect2Rect (rectDesc);
+    FillCOval (&r,fillColor);
+}
+
+//__________________________________________________________________
+
+void _HYPlatformGraphicPane::_EraseOval (_HYRect rectDesc)
+{
+    Rect    r= HYRect2Rect (rectDesc);
+    EraseOval (&r);
+}
+
+//__________________________________________________________________
+
+void _HYPlatformGraphicPane::_DrawArc (_HYRect rectDesc, int s, int f)
+{
+    PenSize (rectDesc.width, rectDesc.width);
+    Rect    r= HYRect2Rect (rectDesc);
+    FrameArc (&r,s,f);
+
+}
+//__________________________________________________________________
+
+void _HYPlatformGraphicPane::_FillArc (_HYRect rectDesc, int s, int f)
+{
+    Rect    r= HYRect2Rect (rectDesc);
+    FillCArc (&r,s,f,fillColor);
+}
+
+//__________________________________________________________________
+
+void _HYPlatformGraphicPane::_EraseArc (_HYRect rectDesc, int s, int f)
+{
+    Rect    r= HYRect2Rect (rectDesc);
+    EraseArc (&r,s,f);
+}
+
+//__________________________________________________________________
+
+void _HYPlatformGraphicPane::_SetColor  (_HYColor c)
+{
+    RGBColor      sysColor;
+    sysColor.red   = c.R*256;
+    sysColor.green = c.G*256;
+    sysColor.blue  = c.B*256;
+    MakeRGBPat (fillColor,&sysColor);
+    RGBForeColor (&sysColor);
+}
+
+//__________________________________________________________________
+
+void _HYPlatformGraphicPane::_SetBColor  (_HYColor c)
+{
+    RGBColor         sysColor;
+    sysColor.red   = c.R*256;
+    sysColor.green = c.G*256;
+    sysColor.blue  = c.B*256;
+
+    if (c.R+c.B+(long)c.G==765)
+        sysColor = (RGBColor) {
+        0xffff,0xffff,0xffff
+    };
+
+    RGBBackColor (&sysColor);
+    //MakeRGBPat (backColor,&sysColor);
+    //BackPat      (backColor);
+}
+
+
+//__________________________________________________________________
+
+void _HYPlatformGraphicPane::_SetFont (_HYFont f)
+{
+    Str255  fontFace;
+    StringToStr255 (f.face,fontFace);
+    short fNum;
+    GetFNum (fontFace,&fNum);
+    TextFont (fNum);
+    TextSize (f.size);
+    TextFace (f.style);
+}
+
+//__________________________________________________________________
+
+void _HYPlatformGraphicPane::_DrawPicRes (_HYRect& r, long id)
+{
+    PicHandle  aPic = GetPicture (id);
+    if (aPic) {
+        Rect        aRect = HYRect2Rect (r);
+        PictInfo    pInfo;
+        GetPictInfo (aPic,&pInfo,0,0,0,0);
+
+        if (aRect.right-aRect.left<=0) {
+            r.right = aRect.right = aRect.left + pInfo.sourceRect.right - pInfo.sourceRect.left;
+        }
+
+        if (aRect.bottom-aRect.top<=0) {
+            r.bottom = aRect.bottom = aRect.top + pInfo.sourceRect.bottom - pInfo.sourceRect.top;
+        }
+
+        DrawPicture (aPic, &aRect);
+
+        ReleaseResource ((Handle)aPic);
+    } else {
+        _String errMsg = _String ("No picture resource with ID ") & id;
+        ReportWarning (errMsg);
+    }
+}
+
+//__________________________________________________________________
+
+void _HYPlatformGraphicPane::_SetFontSize (long s)
+{
+    TextSize (s);
+}
+
+//__________________________________________________________________
+
+void _HYPlatformGraphicPane::_SetDialogBG (void)
+{
+    if (aquaInterfaceOn) {
+        SetThemeBackground (kThemeBrushDialogBackgroundActive, 32, true);
+    } else {
+        ((_HYGraphicPane*)this)->SetBColor         (GetDialogBackgroundColor());
+    }
+}
+
+//__________________________________________________________________
+
+void _HYPlatformGraphicPane::_StartDraw  (void)
+{
+    _HYGraphicPane * parent = (_HYGraphicPane*)this;
+    GetGWorld (&savedPort,&savedDevice);
+    ::GetForeColor (&saveFG);
+    ::GetBackColor (&saveBG);
+    SetGWorld (thePane,nil);
+    LockPixels (GetGWorldPixMap(thePane));
+    RGBColor c  = {256*parent->bColor.R,256*parent->bColor.G,256*parent->bColor.B};
+    if (parent->bColor.R+parent->bColor.B+(long)parent->bColor.G==765)
+        c = (RGBColor) {
+        0xffff,0xffff,0xffff
+    };
+    RGBBackColor (&c);
+    c = (RGBColor) {
+        256*parent->color.R,256*parent->color.G,256*parent->color.B
+    };
+    RGBForeColor (&c);
+    //if (parent->depth>1)
+    TextMode     (srcOr);
+    //else
+    //TextMode   (srcCopy);
+}
+
+//__________________________________________________________________
+
+void _HYPlatformGraphicPane::_EndDraw    (void)
+{
+    UnlockPixels (GetGWorldPixMap(thePane));
+    SetGWorld    (savedPort,savedDevice);
+    RGBForeColor (&saveFG);
+    RGBBackColor (&saveBG);
+}
+
+//__________________________________________________________________
+
+void _HYPlatformGraphicPane::_SetPort    (Ptr nP)
+{
+    thePane = (GWorldPtr)nP;
+}
+
+//__________________________________________________________________
+
+void _HYPlatformGraphicPane::_CopyToClipboard   (void)
+{
+    _HYGraphicPane* parent = (_HYGraphicPane*)this;
+#ifdef TARGET_API_MAC_CARBON
+    ClearCurrentScrap();
+#else
+    ZeroScrap();
+#endif
+    Rect  bRect;
+
+    bRect.left          = bRect.top = 0;
+    bRect.right         = parent->w;
+    bRect.bottom        = parent->h;
+
+    PicHandle    pic    = OpenPicture (&bRect);
+
+    GrafPtr      topPort;
+    GetPort      (&topPort);
+
+    LockPixels (GetGWorldPixMap(thePane));
+#ifdef OPAQUE_TOOLBOX_STRUCTS
+    CopyBits (GetPortBitMapForCopyBits(thePane),GetPortBitMapForCopyBits(topPort),
+              &bRect,&bRect,srcCopy,(RgnHandle)nil);
+#else
+    CopyBits ((BitMap*)*GetGWorldPixMap(thePane),
+              (BitMap*)&(topPort->portBits),&bRect,&bRect,
+              srcCopy,(RgnHandle)nil);
+#endif
+    UnlockPixels (GetGWorldPixMap(thePane));
+
+    ClosePicture ();
+    HLock   ((Handle)pic);
+
+#ifdef TARGET_API_MAC_CARBON
+    ScrapRef         theScrapRef;
+    GetCurrentScrap(&theScrapRef);
+    PutScrapFlavor(theScrapRef, 'PICT', kScrapFlavorMaskNone,GetHandleSize((Handle)pic),*pic);
+#else
+    PutScrap (GetHandleSize((Handle)pic),'PICT',*pic);
+#endif
+    KillPicture (pic);
+}
+
+//__________________________________________________________________
+
+void _HYPlatformGraphicPane::_SavePicture   (_String prompt)
+{
+    InitializeQTExporters  ();
+    if (graphicsFormats.lLength) {
+        _String filePath;
+        long    menuChoice = SaveFileWithPopUp (filePath,
+                                                savePicPrompt,prompt,savePicAs,graphicsFormats);
+
+        if (menuChoice>=0) {
+            ComponentInstance grexc = OpenComponent ((Component)qtGrexComponents(menuChoice));
+            GraphicsExportSetInputGWorld (grexc,thePane);
+            FSSpec  fs;
+            Str255  buff;
+            StringToStr255 (filePath,buff);
+            FSMakeFSSpec(0,0,buff,&fs);
+            GraphicsExportSetOutputFile (grexc,&fs);
+            GraphicsExportRequestSettings (grexc,nil,nil);
+            unsigned long dummy;
+            OSType t,c;
+            GraphicsExportGetDefaultFileTypeAndCreator (grexc,&t,&c);
+            GraphicsExportSetOutputFileTypeAndCreator (grexc,t,c);
+            GraphicsExportDoExport (grexc,&dummy);
+            CloseComponent (grexc);
+        }
+    }
+}
+
+//__________________________________________________________________
+
+Ptr _HYPlatformGraphicPane::_DefinePolygon  (_SimpleList& points)
+{
+    if ((points.lLength>=6)&&(points.lLength%2==0)) {
+        PolyHandle   rgn = OpenPoly  ();
+        checkPointer (rgn);
+
+        MoveTo       (points.lData[0], points.lData[1]);
+
+        for (long k=2; k<points.lLength; k+=2) {
+            LineTo (points.lData[k], points.lData[k+1]);
+        }
+
+        LineTo       (points.lData[0], points.lData[1]);
+        ClosePoly    ();
+        return       (Ptr)rgn;
+
+    }
+    return nil;
+}
+
+//__________________________________________________________________
+
+void _HYPlatformGraphicPane::_KillPolygon   (Ptr rgn)
+{
+    if (rgn) {
+        KillPoly ((PolyHandle)rgn);
+    }
+}
+
+//__________________________________________________________________
+
+void _HYPlatformGraphicPane::_DrawPolygon (Ptr rgn, long width)
+{
+    if (rgn) {
+        PenSize (width, width);
+        FramePoly ((PolyHandle)rgn);
+    }
+}
+
+//__________________________________________________________________
+
+void _HYPlatformGraphicPane::_FillPolygon (Ptr rgn)
+{
+    if (rgn) {
+        FillCPoly ((PolyHandle)rgn,fillColor);
+    }
+}
+
+//__________________________________________________________________
+
+void _HYPlatformGraphicPane::_ErasePolygon (Ptr rgn)
+{
+    if (rgn) {
+        ErasePoly ((PolyHandle)rgn);
+    }
+}
+
+
+
+//EOF
\ No newline at end of file
diff --git a/src/gui/mac/HYPlatformUtils.cpp b/src/gui/mac/HYPlatformUtils.cpp
new file mode 100644
index 0000000..4f61e02
--- /dev/null
+++ b/src/gui/mac/HYPlatformUtils.cpp
@@ -0,0 +1 @@
+#include "HYUtils.h"
#include "Quickdraw.h"
#include "hy_strings.h"
#include "Icons.h"
#include "Fonts.h"
#include "Dialogs.h"
#include "ColorPicker.h"
#include "HYWindow.h"
#include "errorfns.h"
#include "calcnode.h"
#include "ToolUtils.h"
#include "Navigation.h"
#include "batchlan.h"
#include "Lists.h"
#include "math.h"
#include "string.h"
#include "likefunc.h"
#include "Appearance.h"
#include "HYDialogs.h"
#include "time.h"
#include <URLAccess.h>
#include <Scrap.h>
#include "HYConsoleWindow.h"

#ifndef  TARGET_API_MAC_CARBON
#include "StandardFile.h"
#endif


void    GetFullPathName (FSSpec& theReply, _String& feedback);
void    ListToPopUpMenu (_List& menuOptions, MenuHandle listMenu);
void    SetStatusBarValue (long, _Parameter, _Parameter);

#define LIST_PUTFILE_BOX  200
#define LIST_PUTFILE_MENU 1112
#define GENERIC_POPUP_ID  1123

long    putFileMenuChoice;

extern  bool                updateTimer;

extern  time_t              timerStart,
        lastTimer;


extern  PixPatHandle        whiteFill;

extern  CIconHandle         pullDownArrowsIcon;

RGBColor
blackMenuText = {0,0,0},
grayMenuText  = {0x7fff,0x7fff,0x7fff},
menuLine1     = {0xA000,0xA000,0xA000},
menuLine2   = {0x0400,0x0400,0x0400};


extern _SimpleList windowObjects, windowPtrs;

pascal void     HYSavePopEventProc      (NavEventCallbackMessage ,NavCBRecPtr ,void * );
pascal Boolean  customModalProc         (DialogPtr , EventRecord *, short* );
void            StringToStr63           (_String& , Str63& );
pascal void     PopUpThemeDrawProc      (const Rect *,ThemeButtonKind ,const ThemeButtonDrawInfo *,UInt32 ,SInt16 ,Boolean );
MenuHandle      BuildMenuFromList       (_List& , long , bool );
OSStatus        DownloadPB              (void * , EventRecord * );

extern  _String   VerbosityLevelString;

//________________________________________________________
pascal Boolean  customModalProc (DialogPtr theDialog, EventRecord *theEvent, short* itemHit)
{
    if ((theEvent->what == activateEvt)||(theEvent->what == updateEvt)) {
        if (theEvent->message != (long)theDialog) {
            long k = windowPtrs.Find((long)theEvent->message);
            if (k>=0) {
                _HYPlatformWindow* clickedWindow = (_HYPlatformWindow*)windowObjects (k);
                clickedWindow->_ProcessOSEvent ((Ptr)theEvent);
            }
        }
    } else if ((theEvent->what == keyDown)||(theEvent->what == autoKey)) {
        unsigned char keyCode = (theEvent->message&keyCodeMask)>>8;
        if ((keyCode == 0x4C)||(keyCode == 0x24)) { // return
            *itemHit = kStdOkItemIndex;
            return true;
        }
        if ((keyCode==0x35)||((theEvent->modifiers & cmdKey)&&(keyCode==0x2F))) { // cancel
            *itemHit = kStdCancelItemIndex;
            return true;
        }
        if ((keyCode==0x2D)&&(theEvent->modifiers & cmdKey)) {
            *itemHit = 3;
            return true;
        }
    }
    return FALSE;
}

//________________________________________________________

#ifdef TARGET_API_MAC_CARBON
ModalFilterUPP   myFilterProc = NewModalFilterUPP((ModalFilterProcPtr)customModalProc);
#else
UniversalProcPtr myFilterProc = NewModalFilterUPP((ModalFilterProcPtr)customModalProc);
#endif

//________________________________________________________
void    ToggleAnalysisMenu (bool running)
{
    MenuHandle anMenu = GetMenuHandle (131);
    if (running) {
        EnableMenuItem (anMenu,1);
        EnableMenuItem (anMenu,2);
        DisableMenuItem (anMenu,6);
    } else {
        DisableMenuItem (anMenu,1);
        DisableMenuItem (anMenu,2);
        EnableMenuItem (anMenu,6);
        SetStatusBarValue (-1,1,0);
        SetStatusLine ("Idle");
    }
}

//________________________________________________________
Ptr     ProcureIconResource (long iconID)
{
    return (Ptr)GetCIcon (iconID);
}

//________________________________________________________
long    GetVisibleStringWidth (_String& s, _HYFont& f)
{
    static _String lastFont;
    static short   fontID = -1;
    if (f.face!=lastFont) {
        Str255 fName;
        StringToStr255 (f.face,fName);
        GetFNum (fName,&fontID);
        lastFont = f.face;
    }

    GrafPtr thisPort;
    GetPort (&thisPort);
#ifdef OPAQUE_TOOLBOX_STRUCTS
    short   savedFace = GetPortTextFont (thisPort),
            savedSize = GetPortTextSize (thisPort);

    Style   savedStyle = GetPortTextFace (thisPort);
#else
    short   savedFace = thisPort->txFont,
            savedSize = thisPort->txSize;

    Style   savedStyle = thisPort->txFace;
#endif
    TextFont (fontID);
    TextSize (f.size);
    TextFace (f.style);
    long res = TextWidth (s.sData,0,s.sLength);
    TextFont (savedFace);
    TextSize (savedSize);
    TextFace (savedStyle);
    return res;
}

//________________________________________________________
long    GetVisibleStringWidth (_String& s)
{
    long res = TextWidth (s.sData,0,s.sLength);
    return res;
}

//________________________________________________________
long    GetMaxCharWidth (_HYFont& f)
{
    static _String lastFont;
    static short   fontID = -1;
    if (f.face!=lastFont) {
        Str255 fName;
        StringToStr255 (f.face,fName);
        GetFNum (fName,&fontID);
        lastFont = f.face;
    }
    GrafPtr thisPort;
    GetPort (&thisPort);
#ifdef OPAQUE_TOOLBOX_STRUCTS
    short   savedFace = GetPortTextFont (thisPort),
            savedSize = GetPortTextSize (thisPort);

    Style   savedStyle = GetPortTextFace (thisPort);
#else
    short   savedFace = thisPort->txFont,
            savedSize = thisPort->txSize;

    Style   savedStyle = thisPort->txFace;
#endif
    TextFont (fontID);
    TextSize (f.size);
    TextFace (f.style);
    //FontInfo fi;
    //GetFontInfo (&fi);
    //long res = fi.widMax;
    long res = CharWidth ('W');
    //printf ("\n%d\n",CharWidth('W'));
    TextFont (savedFace);
    TextSize (savedSize);
    TextFace (savedStyle);
    return res;
}

//________________________________________________________
/*pascal short  saveDialogProc (short item, DialogPtr theDialog, void* theData)
{
    static Rect putFilePullDownMenu;
    _List*  menuItems = (_List*)theData;
    if (item!=sfHookFirstCall)
    {
        if (putFileMenuChoice<0)
        {
            putFileMenuChoice = 0;
            DrawMenuPlaceHolder (putFilePullDownMenu,*(_String*)(*menuItems)(putFileMenuChoice));
        }
    }
    else
    {
        short   dummy;
        Handle  dummy2;
        GetDialogItem (theDialog,14,&dummy,&dummy2,&putFilePullDownMenu);
    }
    switch (item)
    {
        case 14:
        {
            Point theCoord;
            theCoord.v = putFilePullDownMenu.top;
            theCoord.h = putFilePullDownMenu.left;
            LocalToGlobal (&theCoord);
            long newSel = PopUpMenuSelect (GetMenuHandle(LIST_PUTFILE_MENU),
                                           theCoord.v,
                                           theCoord.h,
                                           putFileMenuChoice+1);
            if (newSel&0xffff0000)
            {
                putFileMenuChoice = (newSel&0x0000ffff)-1;
                DrawMenuPlaceHolder (putFilePullDownMenu,*(_String*)(*menuItems)(putFileMenuChoice));
            }
        }

    }
    return item;
}*/

//________________________________________________________

pascal void HYSavePopEventProc (NavEventCallbackMessage callBackSelector,
                                NavCBRecPtr callBackParms,
                                void *callBackUD )
{
    if (callBackSelector==kNavCBPopupMenuSelect) {
        NavMenuItemSpec* menuItem = (NavMenuItemSpec*)callBackParms->eventData.eventDataParms.param;
        *((long*)callBackUD) = menuItem->menuType;
    } else if (callBackSelector==kNavCBEvent) {
        EventRecord* theEvent = callBackParms->eventData.eventDataParms.event;
        if ((theEvent->what == activateEvt)||(theEvent->what == updateEvt)) {
            if (theEvent->message != (long)callBackParms->window) {
                long k = windowPtrs.Find((long)theEvent->message);
                if (k>=0) {
                    _HYPlatformWindow* clickedWindow = (_HYPlatformWindow*)windowObjects (k);
                    clickedWindow->_ProcessOSEvent ((Ptr)theEvent);
                }
                //else
                //  SIOUXHandleOneEvent (theEvent);
            }
        }
    }
}

extern      Str255   hpName;
extern      _String  menuSeparator;

//________________________________________________________

long    SaveFileWithPopUp (_String& fileName, _String& prompt, _String& defFileName,
                           _String& listLabel, _List& menuOptions)
{
    OSErr               navErr;
    NavReplyRecord      navRR;
    NavDialogOptions    navDO;
#ifdef TARGET_API_MAC_CARBON
    NavEventUPP         navEF = NewNavEventUPP  (HYSavePopEventProc);
#else
    NavEventUPP         navEF = NewNavEventProc (HYSavePopEventProc);
#endif
    Handle              extensionListH = NewHandle (sizeof(NavMenuItemSpec)*menuOptions.lLength);
    checkPointer        (extensionListH);
    long                result;

    HLock (extensionListH);

    NavMenuItemSpec* extensionList = (NavMenuItemSpec*)*extensionListH;

    for (result = 0; result<menuOptions.lLength; result++) {
        extensionList[result].version = kNavMenuItemSpecVersion;
        extensionList[result].menuType = result+20;
        extensionList[result].menuCreator = 'MuSe';
        if (((_String*)menuOptions(result))->Equal(&menuSeparator)) {
            extensionList[result].menuItemName[0]=2;
            extensionList[result].menuItemName[1]='-';
            extensionList[result].menuItemName[2]='-';
        } else {
            StringToStr255 (*(_String*)menuOptions(result),extensionList[result].menuItemName);
        }
    }
    HUnlock (extensionListH);

    navDO.version       =   kNavDialogOptionsVersion;
    navDO.location      =   (Point) {
        -1,-1
    };
    navDO.dialogOptionFlags
        =   kNavDontAddTranslateItems;
    StringToStr255      (prompt,navDO.windowTitle);
    StringToStr255      (defFileName,navDO.savedFileName);
    memcpy (navDO.clientName,hpName,hpName[0]+1);
    navDO.actionButtonLabel[0]
        =   0;
    navDO.cancelButtonLabel[0]
        =   0;
    navDO.preferenceKey =   0;
    navDO.message[0]    =   0;

    if (menuOptions.lLength) {
        navDO.popupExtension=(NavMenuItemSpecHandle)extensionListH;
    } else {
        navDO.popupExtension=nil;
    }

    result              = 0;

    navErr              = NavPutFile (nil,
                                      &navRR,
                                      &navDO,
                                      navEF,
                                      nil,
                                      kNavGenericSignature,
                                      &result);


    if (navErr == noErr) {
        if (navRR.validRecord) {
            long countAED;
            if (noErr==AECountItems(&navRR.selection,&countAED)) {
                if (countAED==1) {
                    char    fileRec [2048];
                    Size    actualSize;
                    AEKeyword   keywd;
                    DescType    returnedType;
                    FSSpec*     fSR;
                    navErr= AEGetNthPtr(&navRR.selection, 1, typeFSS, &keywd,
                                        &returnedType, fileRec,
                                        sizeof(FSSpec), &actualSize);
                    if (navErr==noErr) {
                        fSR = (FSSpec*)fileRec;
                        GetFullPathName (*fSR, fileName);
                        NavDisposeReply (&navRR);
                        DisposeHandle (extensionListH);
#ifdef TARGET_API_MAC_CARBON
                        DisposeNavEventUPP (navEF);
#endif
                        return  result-20;
                    }
                }
            }
        }
        NavDisposeReply (&navRR);
    } else {
        if (navErr !=  userCanceledErr) {

            if (menuOptions.lLength) {
                _SimpleList         all,
                                    std,
                                    r;
                _List               ms;

                std << 0;
                std << 0;

                for (result = 0; result < menuOptions.lLength; result++) {
                    _String* option = (_String*)menuOptions (result);
                    _List    d (option);
                    ms && & d;
                    if (!option->Equal (&menuSeparator)) {
                        all << result;
                    }
                }

                DisposeHandle (extensionListH);
                result = HandleListSelection (ms,std,all,"Choose a file format",r,1);
                if (result>=0) {
                    result = all.lData[result];
                    _List dummy;
                    SaveFileWithPopUp (fileName,prompt,defFileName, listLabel, dummy);
                }
#ifdef TARGET_API_MAC_CARBON
                DisposeNavEventUPP (navEF);
#endif
                return result;
            } else {
                _String      errMsg ("System Error ");
                errMsg = errMsg & (long)navErr & " occured in SaveFileWithPopUp.";
                ProblemReport(errMsg);
            }
        }
    }
    DisposeHandle (extensionListH);
#ifdef TARGET_API_MAC_CARBON
    DisposeNavEventUPP (navEF);
#endif
    return -1;
}

//________________________________________________________
_HYColor        SelectAColor (_HYColor& currentColor, _String& prompt)
{
    RGBColor start, end;
    Point    center = {-1,-1};
    Str255   buffer;
    StringToStr255 (prompt,buffer);
    start.red   = currentColor.R*256;
    start.blue  = currentColor.B*256;
    start.green = currentColor.G*256;
    if (GetColor (center,buffer,&start,&end)) {
        _HYColor res;
        res.R = end.red/256;
        res.G = end.green/256;
        res.B = end.blue/256;
        return res;
    }
    return currentColor;
}


//________________________________________________________
char        YesNoCancelPrompt (_String& prompt)
{
    Str255 buffer;
    StringToStr255(prompt,buffer);
    ParamText(buffer,nil,nil,nil);
    return (Alert (132,myFilterProc));
}


//________________________________________________________
_HYRect     GetScreenDimensions (void)
{

    _HYRect   res = {0,0,0,0,0};

    /*RgnHandle dskRgn = GetGrayRgn();
    #ifdef OPAQUE_TOOLBOX_STRUCTS
        Rect      dskRect;
        GetRegionBounds(dskRgn,&dskRect);
    #else
        Rect      dskRect = (*dskRgn)->rgnBBox;
    #endif*/

    Rect      dskRect;
    GetAvailableWindowPositioningBounds(GetMainDevice(),&dskRect);

    res.right  = dskRect.right-dskRect.left;
    res.bottom = dskRect.bottom-dskRect.top;

    return res;
}

//________________________________________________________
void        CenterWindow (_HYGuiObject* g)
{
    _HYWindow* w = (_HYWindow*)g;

    if (!(w->flags & HY_WINDOW_SHEET)) {
        _HYRect   screen = GetScreenDimensions();

        long      cleft = 0, ctop = 0;

        if (screen.right>w->right) {
            cleft = (screen.right-w->right)/2;
        }
        if (screen.bottom>w->bottom) {
            ctop = (screen.bottom-w->bottom)/2;
        }

        w->_SetPosition (cleft,ctop);
    }
}

//__________________________________________________________________________________
void    StringToStr255 (_String& str, Str255& str255)
{
    long cpData = str.sLength>255?255:str.sLength;
    str255[0] = cpData;
    str255[cpData]=0;
    memcpy(str255+1, str.sData, cpData);

}

//__________________________________________________________________________________
void    StringToStr63 (_String& str, Str63& str63)
{
    long cpData = str.sLength>63?63:str.sLength;
    str63[0] = cpData;
    str63[63]=0;
    memcpy(str63+1, str.sData, cpData);

}

//__________________________________________________________________________________
void    Str255ToStr (_String& str, Str255& str255)
{
    if (str255[0] == 255) {
        str255[0]=254;
    }
    str255[str255[0]+1]=0;
    str = (char*)(str255+1);
}

//__________________________________________________________________________________

void    DrawEmbossedBox (Rect& theBox)
{
    DrawThemeListBoxFrame (&theBox,kThemeStateActive);
}

//__________________________________________________________________________________

pascal void PopUpThemeDrawProc (const Rect *bounds,ThemeButtonKind ,const ThemeButtonDrawInfo *,UInt32 userData,SInt16 ,Boolean )
{
    MoveTo (bounds->left+5, (bounds->top+bounds->bottom)/2+5);
    DrawString ((unsigned char*)userData);
}

ThemeButtonDrawUPP drawPT = NewThemeButtonDrawUPP (PopUpThemeDrawProc);

//__________________________________________________________________________________

void    DrawMenuPlaceHolder (Rect& theBox, _String& menuChoice, bool enabled)
{
    GrafPtr savedPtr;
    Style  savedFF, savedFNT, savedFS, savedMode;
    RGBColor
    savedColor;


    long   stringWidth, avWidth = theBox.right-theBox.left-24;

    GetPort (&savedPtr);
    GetForeColor (&savedColor);
#ifdef OPAQUE_TOOLBOX_STRUCTS
    savedFNT = GetPortTextFont (savedPtr),
    savedFS  = GetPortTextSize  (savedPtr);
    savedFF  = GetPortTextFace (savedPtr);
    savedMode = GetPortTextMode (savedPtr);
#else
    savedFF = savedPtr->txFace;
    savedFNT = savedPtr->txFont;
    savedFS = savedPtr->txSize;
    savedMode = savedPtr->txMode;
#endif

    TextSize (12);
    TextFace (normal);
    TextFont (0);
    TextMode (srcOr);
    Str255          boxTitle;

    RGBColor blackC = {0,0,0};
    RGBForeColor (&blackC);

    boxTitle[0] = menuChoice.sLength>255?255:menuChoice.sLength;
    BlockMove(menuChoice.sData, boxTitle+1,boxTitle[0]);
    stringWidth = StringWidth (boxTitle);
    while (stringWidth>avWidth) {
        boxTitle[0]--;
        stringWidth = StringWidth (boxTitle);
    }

    theBox.right++;
    theBox.bottom++;
    ThemeButtonDrawInfo binfo = {enabled?kThemeStateActive:kThemeStateInactive,kThemeButtonOff,kThemeAdornmentNone};
    DrawThemeButton (&theBox,kThemePopupButton,&binfo,nil,nil,drawPT,(UInt32)boxTitle);
    //FrameRoundRect (&theBox,6,6);
    theBox.right--;
    theBox.bottom--;
    TextFace (savedFF);
    TextFont (savedFNT);
    TextSize (savedFS);
    TextMode (savedMode);
    RGBForeColor(&savedColor);

}

//__________________________________________________________________________________

void    ListToPopUpMenu (_List& menuOptions, MenuHandle listMenu)
{
    Str255 buffer;
    for (long counter=0; counter<menuOptions.lLength; counter++) {
        _String *postItem = (_String*)(menuOptions(counter));
        if (*postItem==_String("SEPARATOR")) {
            AppendMenu (listMenu,"\p(-");
        } else {
            StringToStr255 (*postItem,buffer);
            AppendMenu (listMenu,buffer);
        }
    }
}

//__________________________________________________________________________________

_String HandlePullDown (_List& menuOptions, long l, long t,long startPos)
{
    if (menuOptions.lLength) {
        MenuHandle listMenu = NewMenu (GENERIC_POPUP_ID,"\p");
        ListToPopUpMenu (menuOptions, listMenu);
        InsertMenu(listMenu,hierMenu);

        long    res = PopUpMenuSelect (listMenu,t,l,startPos);
        DeleteMenu (GENERIC_POPUP_ID);
        DisposeMenu(listMenu);

        if (HiWord(res)) {
            return *(_String*)menuOptions (LoWord(res)-1);
        }
    }

    return empty;
}

//__________________________________________________________________________________

long HandlePullDownWithFont (_List& menuOptions, long l, long t,long startPos,_String fName,long fSize)
{
    MenuHandle listMenu = NewMenu (GENERIC_POPUP_ID,"\p");
    ListToPopUpMenu (menuOptions, listMenu);
    short  fontID;
    Str255 fName255;
    StringToStr255 (fName,fName255);
    GetFNum (fName255,&fontID);
    SetMenuFont     (listMenu,fontID,fSize);
    InsertMenu(listMenu,hierMenu);

    if ((startPos<1)||(startPos>menuOptions.lLength)) {
        startPos = 1;
    } else {
        SetItemMark (listMenu,startPos,0xA5);
    }
    long    res = PopUpMenuSelect (listMenu,t,l,startPos);
    DeleteMenu (GENERIC_POPUP_ID);
    DisposeMenu(listMenu);

    if (HiWord(res)) {
        return LoWord(res)-1;
    }
    return -1;

}
//__________________________________________________________________________________
char    ScanDirectoryForFileNames (_String& source, _List& rec, bool recurse)
{
    CInfoPBRec  fileRec;
    Str255 buffer;
    StringToStr255 (source,buffer);
    DirInfo*    dInfo = (DirInfo*)&fileRec;
    HFileInfo*  fInfo = (HFileInfo*)&fileRec;

    dInfo->ioNamePtr = buffer;
    dInfo->ioVRefNum = 0;
    dInfo->ioFDirIndex = 0;
    dInfo->ioDrDirID = 0;
    long  errCode;
    if ((errCode=PBGetCatInfo (&fileRec,false))==noErr)
        /* source directory exists */
    {
        long   counter = 1;
        dInfo->ioFDirIndex = 1;
        long   saveDirID = dInfo->ioDrDirID;
        while ((errCode=PBGetCatInfo (&fileRec,false))==noErr)
            /* index thru the items */
        {
            _String childDir ((unsigned long)dInfo->ioNamePtr[0],true);
            for (long k=1; k<=dInfo->ioNamePtr[0]; k++) {
                childDir << dInfo->ioNamePtr[k];
            }
            childDir.Finalize();
            if (childDir.sData[0] != '.') { // invisible file
                childDir = source & ':' & childDir;
                if (dInfo->ioFlAttrib&0x10)
                    // a directory
                {
                    if (recurse&&(!(dInfo->ioDrUsrWds.frFlags&fInvisible))) {
                        ScanDirectoryForFileNames (childDir,rec,true);
                    }
                } else if (!(fInfo->ioFlFndrInfo.fdFlags&fInvisible)) {
                    rec && & childDir;
                }
            }
            dInfo->ioDrDirID = saveDirID;
            dInfo->ioFDirIndex = ++counter;
        }
    }
    return ':';
}


//_________________________________________________________________________

void    SetWindowFont (short fID, short fSize, Style fStyle, bool onOff)
{
    static short sID, sSize;
    static short sStyle;

    if (onOff) {
        GrafPtr thisPort;
        GetPort (&thisPort);
#ifdef OPAQUE_TOOLBOX_STRUCTS
        sID = GetPortTextFont (thisPort),
        sSize  = GetPortTextSize    (thisPort);
        sStyle = GetPortTextFace (thisPort);
#else
        sID = thisPort->txFont;
        sSize = thisPort->txSize;
        sStyle = thisPort->txFace;
#endif
        TextFont (fID);
        TextSize (fSize);
        TextFace (fStyle);
    } else {
        TextFont (sID);
        TextSize (sSize);
        TextFace (sStyle);
    }

}

//_________________________________________________________________________

void    GenerateFontList (_List& fonts)
{
    fonts.Clear();
    MenuHandle fts = NewMenu (11111,"\p");
    AppendResMenu (fts,'FONT');
    {
        long icount = CountMenuItems(fts);
        for (long k=0; k<icount; k++) {
            Str255 mItem;
            GetMenuItemText (fts,k+1,mItem);
            _String fontName;
            Str255ToStr (fontName,mItem);
            fonts && & fontName;
        }
    }
    DisposeMenu (fts);
}

//_________________________________________________________________________
_HYColor    GetDialogBackgroundColor (void)
{
    RGBColor    bgc = {0xffff,0xffff,0xffff};
    GetThemeBrushAsColor (kThemeBrushDialogBackgroundActive,24,true,&bgc);

    _HYColor    res = {bgc.red/256,bgc.green/256,bgc.blue/256};
    return      res;
}

//_________________________________________________________________________
void    DelayNMs (long ms)
{
    unsigned long ticks,
             ftick;

    ticks = ms/16.66666667;
    Delay (ticks, &ftick);
}

//_________________________________________________________________________
void    PositionWindow          (_HYGuiObject* twp, _String* args)
{
    _List * argL = args->Tokenize (",");
    _HYWindow*   tw = (_HYWindow*)twp;
    if (argL->lLength>=4) {
        long R[5],
             k;

        for (k=0; k<4; k++) {
            R[k] = ((_String*)(*argL)(k))->toNum();
        }
        if (argL->lLength>4) {
            R[4] = ((_String*)(*argL)(4))->toNum();
        } else {
            R[4] = 0;
        }

        _HYRect   wR = GetScreenDimensions  (),
                  wiR;
        long      W[4] = {wR.left,wR.top, wR.right, wR.bottom};
        for (k=0; k<4; k++)
            if (R[k]<0) {
                R[k] = W[k] + ((k<2)?-1:1)*R[k];
            }

        wiR.left    = R[0];
        wiR.right   = R[2];
        wiR.top     = R[1];
        wiR.bottom  = R[3];

        if (wiR.left>=wiR.right) {
            wiR.right = 1+wiR.left;
        }
        if (wiR.top>=wiR.bottom) {
            wiR.bottom = 1+wiR.top;
        }

        tw->SetPosition        (wiR.left,wiR.top);
        tw->SetWindowRectangle (0,0,wiR.bottom-wiR.top,wiR.right-wiR.left);

        if (R[4]>0) {
            wiR.top         = wiR.bottom+2;
            wiR.bottom      = wR.bottom - 2;
            wiR.left        = 5;
            wiR.right       = wR.right - 2;
            MoveConsoleWindow (wiR);
        }

    }

    DeleteObject (argL);
}

//________________________________________________________

MenuHandle      BuildMenuFromList (_List& menuItems, long menuID, bool )
{
    MenuHandle itemPopUpMenu = NewMenu (menuID, "\p");
    checkPointer ((Ptr)itemPopUpMenu);
    Str255          menuBuffer;
    for (long counter = 0; counter < menuItems.lLength; counter++) {
        if (menuSeparator.Equal((_String*)menuItems.lData[counter])) {
            InsertMenuItem (itemPopUpMenu,"\p(-;",0x6FFF);
        } else {
            StringToStr255 (*((_String*)menuItems.lData[counter]), menuBuffer);
            InsertMenuItem (itemPopUpMenu,menuBuffer,0x6FFF);
        }
    }
    InsertMenu (itemPopUpMenu,hierMenu);
    return itemPopUpMenu;
}

//________________________________________________________

void    UpdateStatusLine(Ptr pW)
{
    WindowPtr  theWindow = (WindowPtr)pW;
    _Parameter verbLevel;
    checkParameter (VerbosityLevelString, verbLevel, 0.0);
    if (verbLevel>=-0.5) {
#ifdef TARGET_API_MAC_CARBON
        if (aquaInterfaceOn) {
            Rect wr,
                 box;
            GetWindowBounds (theWindow, kWindowGlobalPortRgn, &wr);
            OffsetRect (&wr,-wr.left,-wr.top);
            SetRect(&box,0,wr.bottom-15,wr.right - 15,wr.bottom);
            RgnHandle   dirtyRgn = NewRgn ();
            checkPointer (dirtyRgn);
            RectRgn (dirtyRgn, &box);
            QDFlushPortBuffer (GetWindowPort (theWindow), nil);
            DisposeRgn (dirtyRgn);
        }
#endif
    }
}

//________________________________________________________

OSStatus DownloadPB (void * , EventRecord * )
{
    // place holder
    return noErr;
}

//________________________________________________________

bool    Get_a_URL   (_String& urls, _String* fileName)
{
    URLReference    url;
    OSStatus        errCode;


    if ((errCode=URLNewReference (urls.sData, &url)) == noErr) {
        //URLSystemEventUPP gMySystemEventUPP = NewURLSystemEventUPP((URLSystemEventProcPtr)DownloadPB);
        if (fileName == nil) {
            Handle   h = NewHandle (0);

            errCode = URLDownload (url, nil, h,  kURLDisplayProgressFlag | kURLDisplayAuthFlag, nil, nil);

            if (errCode == noErr) {
                long    downloadSize = GetHandleSize(h);
                SetHandleSize(h, (downloadSize+1));
                HLock (h);
                (*h)[downloadSize] = 0;
                urls = (char*)(*h);
                URLDisposeReference (url);
                DisposeHandle (h);
                HUnlock (h);
                //DisposeURLSystemEventUPP(gMySystemEventUPP);
                return true;
            }
        } else {
            long    f = fileName->FindBackwards (":",0,-1);

            _String dirName  = fileName->Cut(0,f-1),
                    fName    = fileName->Cut(f+1,-1);


            if ((f<0 && dirName.sLength==0) || fName.sLength==0) {
                urls = "Invalid file specification";
                //DisposeURLSystemEventUPP(gMySystemEventUPP);
                return false;
            }

            Str255          buffer;
            StringToStr255 (dirName,buffer);
            CInfoPBRec      hfp;

            hfp.dirInfo.ioNamePtr       = buffer;
            hfp.dirInfo.ioVRefNum       = 0;
            hfp.dirInfo.ioFDirIndex     = 0;
            hfp.dirInfo.ioDrDirID       = 0;
            
            union {
                char bytes[4];
                OSType theType;
                
            } ostypeconvertor;
            
            ostypeconvertor.bytes[0] = '?';
            ostypeconvertor.bytes[1] = '?';
            ostypeconvertor.bytes[2] = '?';
            ostypeconvertor.bytes[3] = '?';

            if ((errCode=PBGetCatInfo (&hfp,false))==noErr) {
                FSSpec      fspec;
                StringToStr63 (fName,fspec.name);
                fspec.vRefNum = hfp.dirInfo.ioVRefNum;
                fspec.parID   = hfp.dirInfo.ioDrDirID;

                if (errCode == noErr) {
                    errCode = URLDownload (url, &fspec, nil, kURLReplaceExistingFlag |kURLDisplayProgressFlag | kURLDisplayAuthFlag, nil, nil);
                    if (errCode == noErr) {
                        hfp.hFileInfo.ioFlFndrInfo.fdCreator = ostypeconvertor.theType;
                        hfp.hFileInfo.ioFlFndrInfo.fdType    = ostypeconvertor.theType;
                        errCode = PBSetCatInfo (&hfp,false);
                        if (errCode == noErr)
                            //DisposeURLSystemEventUPP(gMySystemEventUPP);
                        {
                            return true;
                        }
                    }
                }
            }
        }
        //DisposeURLSystemEventUPP(gMySystemEventUPP);
    }
    switch (errCode) {
    case kETIMEDOUTErr:
        urls = "Connection timed out";
        break;
    case kECONNREFUSEDErr:
        urls = "Connection refused";
        break;
    case kEHOSTDOWNErr:
        urls = "Host down";
        break;
    case kEHOSTUNREACHErr:
        urls = "No route to host";
        break;
    case kURLInvalidURLError:
        urls = "The format of the URL is invalid";
        break;
    case kURLUnsupportedSchemeError:
        urls = "The transfer protocol is not supported";
        break;
    case kURLServerBusyError :
        urls = "Failed data transfer operation";
        break;
    default:
        urls = _String ("System error:") & (long)errCode;
    }

    return false;
}

//________________________________________________________

void    StartBarTimer(void)
{
    lastTimer   = time (&timerStart);
    updateTimer = true;
}

//________________________________________________________

void    StopBarTimer(void)
{
    updateTimer = false;
}

//_________________________________________________________________________

void    MoveConsoleWindow (_HYRect& newLoc)
{
    if (newLoc.right&&newLoc.bottom) {
        hyphyConsoleWindow->SetPosition         (newLoc.left, newLoc.top);
        hyphyConsoleWindow->SetWindowRectangle  (newLoc.top,newLoc.left,newLoc.bottom,newLoc.right,true);
    }
}


//__________________________________________________________________________________
void    PlaceStringInClipboard (_String& res,Ptr )
{
#ifdef TARGET_API_MAC_CARBON
    ClearCurrentScrap();
    ScrapRef         theScrapRef;
    GetCurrentScrap(&theScrapRef);
    PutScrapFlavor(theScrapRef, 'TEXT', kScrapFlavorMaskNone,res.sLength,res.sData);
#else
    ZeroScrap();
    PutScrap (res.sLength,'TEXT',res.sData);
#endif
}
\ No newline at end of file
diff --git a/src/gui/mac/HYPlatformWindow.cpp b/src/gui/mac/HYPlatformWindow.cpp
new file mode 100644
index 0000000..b19cfb2
--- /dev/null
+++ b/src/gui/mac/HYPlatformWindow.cpp
@@ -0,0 +1,1118 @@
+/*
+    A Mac OS window object - a window/title/size-box/scroll-bars handler.
+
+    Sergei L. Kosakovsky Pond, Spring 2000 - Fall 2001.
+*/
+
+#include "HYWindow.h"
+#include "HYGWindow.h"
+#include "HYEventTypes.h"
+#include "HYConsoleWindow.h"
+#include "Controls.h"
+#include "ControlDefinitions.h"
+#include "HYTableWindow.h"
+#include "HYUtils.h"
+#include "Scrap.h"
+
+//__________________________________________________________________
+extern      _SimpleList windowPtrs,
+            windowObjects;
+
+extern      _String     objectInspectorTitle;
+
+long                    smallScrollStep = 5,
+                        scrollStepCounter = 0,
+                        lastScrollControlValue = 0;
+
+_HYGuiObject*           scrollingWindow;
+bool                    hScrollingAction = false;
+
+
+pascal      void        scrollAction                    (ControlHandle,ControlPartCode);
+
+
+#ifdef TARGET_API_MAC_CARBON
+extern  ModalFilterUPP   myFilterProc;
+#else
+extern  UniversalProcPtr myFilterProc;
+#endif
+
+Point                    lastScrollPoint;
+
+
+
+//__________________________________________________________________
+pascal void  scrollAction (ControlHandle theControl,ControlPartCode ctlPart)
+{
+    long   cv  = GetControl32BitValue (theControl),
+           cv2 = cv;
+
+    scrollStepCounter++;
+
+    switch (ctlPart) {
+    case kControlDownButtonPart:
+        HiliteControl (theControl,kControlDownButtonPart);
+        cv2 = cv+smallScrollStep;
+        if (scrollStepCounter>100) {
+            cv2 += 99*smallScrollStep;
+        } else if (scrollStepCounter>10) {
+            cv2 += 9*smallScrollStep;
+        }
+        if (cv2>MAX_CONTROL_VALUE) {
+            cv2 = MAX_CONTROL_VALUE;
+        }
+        break;
+    case kControlUpButtonPart:
+        HiliteControl (theControl,kControlUpButtonPart);
+        cv2 = cv-smallScrollStep;
+        if (scrollStepCounter>100) {
+            cv2 -= 99*smallScrollStep;
+        } else if (scrollStepCounter>10) {
+            cv2 -= 9*smallScrollStep;
+        }
+        if (cv2<0) {
+            cv2 = 0;
+        }
+        break;
+    case kControlPageUpPart:
+        HiliteControl (theControl,kControlPageUpPart);
+        cv2 = cv-100*smallScrollStep;
+        if (cv2<0) {
+            cv2 = 0;
+        }
+        break;
+    case kControlPageDownPart:
+        HiliteControl (theControl,kControlPageDownPart);
+        cv2 = cv+100*smallScrollStep;
+        if (cv2>MAX_CONTROL_VALUE) {
+            cv2 = MAX_CONTROL_VALUE;
+        }
+        break;
+    default:
+        cv2 = cv;
+        cv  = lastScrollControlValue;
+        break;
+    }
+
+    if (cv!=cv2) {
+        SetControl32BitValue (theControl,cv2);
+        if (hScrollingAction) {
+            scrollingWindow->ProcessEvent (generateScrollEvent (cv2-cv,0));
+        } else {
+            scrollingWindow->ProcessEvent (generateScrollEvent (0,cv2-cv));
+        }
+    }
+
+    lastScrollControlValue = GetControl32BitValue (theControl);
+}
+
+#ifdef TARGET_API_MAC_CARBON
+
+
+//__________________________________________________________________
+
+pascal OSStatus wSizeHandler (EventHandlerCallRef, EventRef theEvent, void* userData)
+{
+
+    EventParamType  actType;
+    UInt32          attr = 0;
+    GetEventParameter (theEvent, kEventParamAttributes, typeUInt32, &actType,sizeof(UInt32),nil,&attr);
+
+    if (attr&kWindowBoundsChangeSizeChanged) {
+        Rect       newSize;
+        GetEventParameter (theEvent, kEventParamCurrentBounds, typeQDRectangle, &actType,sizeof(Rect),nil,&newSize);
+
+        _HYWindow* thisWindow = (_HYWindow*)windowObjectRefs(windowPtrs.Find((long)userData));
+        forceUpdateForScrolling = true;
+        //printf ("%d %d %d %d\n", newSize.top,newSize.left,newSize.bottom+1,newSize.right+1);
+        thisWindow->SetWindowRectangle (newSize.top,newSize.left,newSize.bottom+1,newSize.right+1,false);
+        thisWindow->Update(nil);
+        forceUpdateForScrolling = false;
+        return noErr;
+    }
+
+    return eventNotHandledErr;
+}
+
+
+#endif
+
+
+
+//__________________________________________________________________
+void        _PaintTheCircle (CIconHandle c, WindowPtr theWindow)
+{
+#ifdef OPAQUE_TOOLBOX_STRUCTS
+    Rect r;
+    GetWindowBounds (theWindow,kWindowGlobalPortRgn,&r);
+    OffsetRect (&r,-r.left,-r.top);
+#else
+    Rect r = theWindow->portRect;
+#endif
+    r.right = r.left+15;
+    r.left  += 3;
+    r.bottom --;
+    r.top = r.bottom-12;
+    PlotCIcon (&r,c);
+}
+
+//__________________________________________________________________
+
+_HYPlatformWindow::_HYPlatformWindow(unsigned char windowFlag,_String windowTitle,bool windowVisibility, Ptr cRef)
+{
+    Rect defRect = {(50+25*windowObjects.lLength)%500,(50+25*windowObjects.lLength)%400,300,350};
+    Str255 theTitle;
+    StringToStr255 (windowTitle,theTitle);
+    long   proc;
+    sheet1st = true;
+    if (cRef) {
+        if (aquaInterfaceOn) {
+            if (IsWindowVisible(((_HYWindow*)cRef)->theWindow)) {
+                containerRef = cRef;
+            } else {
+                containerRef = nil;
+            }
+        } else {
+            windowFlag -= HY_WINDOW_SHEET;
+            windowFlag += HY_WINDOW_DLOG;
+            containerRef = nil;
+        }
+    } else {
+        containerRef = nil;
+    }
+
+#ifdef TARGET_API_MAC_CARBON
+    if (windowFlag&HY_WINDOW_SHEET) {
+        proc = kWindowSheetProc;
+    } else
+#endif
+        if (windowFlag&HY_WINDOW_SIZE) {
+            if (windowFlag&HY_WINDOW_ZOOM) {
+                proc = zoomDocProc;
+            } else if (windowFlag & HY_WINDOW_FLUSHED)
+#ifdef TARGET_API_MAC_CARBON
+                if (aquaInterfaceOn) {
+                    proc =  zoomDocProc;
+                } else {
+                    proc =  kWindowFloatGrowProc;
+                }
+#else
+                proc =  kWindowFloatGrowProc;
+#endif
+            else {
+                proc = documentProc;
+            }
+        } else {
+            if (windowFlag & HY_WINDOW_DLOG) {
+                proc =  kWindowMovableModalDialogProc;
+            } else {
+                proc = noGrowDocProc;
+            }
+        }
+
+    savedLoc = defRect;
+
+    flags = windowFlag;
+
+    if (windowFlag & HY_WINDOW_DLOG) {
+#ifdef OPAQUE_TOOLBOX_STRUCTS
+        DialogPtr temp = NewColorDialog (nil,&defRect,theTitle,windowVisibility,
+                                         proc,(WindowPtr)-1,
+                                         windowFlag&HY_WINDOW_CLOSE ,0, nil);
+        if (temp) {
+            theWindow = GetDialogWindow (temp);
+        } else {
+            theWindow = nil;
+        }
+#else
+        theWindow = NewColorDialog (nil,&defRect,theTitle,windowVisibility,
+                                    proc,(WindowPtr)-1,
+                                    windowFlag&HY_WINDOW_CLOSE ,0, nil);
+#endif
+        if (theWindow) {
+            GrafPtr savePort;
+            GetPort (&savePort);
+#ifdef OPAQUE_TOOLBOX_STRUCTS
+            SetPort (GetWindowPort(theWindow));
+#else
+            SetPort (theWindow);
+#endif
+            SetThemeWindowBackground (theWindow,kThemeBrushDialogBackgroundActive,false);
+            SetPort (savePort);
+        }
+    } else {
+#ifdef TARGET_API_MAC_CARBON
+        if (cRef) {
+            CreateNewWindow (kSheetWindowClass, kWindowNoAttributes,
+                             &defRect, &theWindow);
+            //if (theWindow)
+            //theWindow = GetDialogWindow (theWindow);
+            if (theWindow) {
+                GrafPtr savePort;
+                GetPort (&savePort);
+#ifdef OPAQUE_TOOLBOX_STRUCTS
+                SetPort (GetWindowPort(theWindow));
+#else
+                SetPort (theWindow);
+#endif
+                SetThemeWindowBackground (theWindow,kThemeBrushDialogBackgroundActive,false);
+                SetPort (savePort);
+            }
+        } else
+#endif
+            theWindow = NewCWindow (nil,&defRect,theTitle,windowVisibility,
+                                    proc,(WindowPtr)-1,
+                                    windowFlag&HY_WINDOW_CLOSE ,0);
+    }
+
+    if (theWindow) {
+        if ((windowFlag&HY_WINDOW_SCROLL)&&(windowFlag&HY_WINDOW_SIZE)) {
+            Rect cSize = newHRect();
+            hScroll = NewControl (theWindow,&cSize,"\p",true,0,0,MAX_CONTROL_VALUE,kControlScrollBarLiveProc,0);
+            cSize = newVRect();
+            vScroll = NewControl (theWindow,&cSize,"\p",true,0,0,MAX_CONTROL_VALUE,kControlScrollBarLiveProc,0);
+            if (!(hScroll&&vScroll)) {
+                theWindow = nil;
+            } else {
+                SetControl32BitMinimum (hScroll,0);
+                SetControl32BitMaximum (hScroll,MAX_CONTROL_VALUE);
+                SetControl32BitMinimum (vScroll,0);
+                SetControl32BitMaximum (vScroll,MAX_CONTROL_VALUE);
+            }
+        } else {
+            hScroll = vScroll = nil;
+            windowFlag &= 123;
+        }
+    }
+    if (!theWindow) {
+        _String errMsg = "Could not allocate memory for a window structure";
+        FlagError (errMsg);
+    }
+    windowPtrs<<(long)theWindow;
+    windowObjects<<(long)this;
+
+    if (((flags&HY_WINDOW_NOLIST)||(flags&HY_WINDOW_DLOG)||(flags&HY_WINDOW_SHEET))==0) {
+        MenuHandle wMenu = GetMenuHandle(132);
+        AppendMenu (wMenu,"\pa");
+        if (theTitle[0]>250) {
+            theTitle[0] = 250;
+        }
+
+        SetMenuItemText (wMenu, CountMenuItems(wMenu), theTitle);
+    }
+
+#ifdef TARGET_API_MAC_CARBON
+    if (windowFlag&HY_WINDOW_SIZE) {
+        ChangeWindowAttributes (theWindow,kWindowLiveResizeAttribute, kWindowNoAttributes);
+        sizeHandler = NewEventHandlerUPP ((EventHandlerProcPtr)wSizeHandler);
+        checkPointer  ((Ptr)sizeHandler);
+        EventTypeSpec windowSizeEvent;
+        windowSizeEvent.eventClass= kEventClassWindow;
+        windowSizeEvent.eventKind = kEventWindowBoundsChanged;
+        InstallWindowEventHandler (theWindow,sizeHandler,1,&windowSizeEvent,(Ptr)theWindow,NULL);
+    } else {
+        sizeHandler = nil;
+    }
+#endif
+}
+
+//__________________________________________________________________
+
+_HYPlatformWindow::~_HYPlatformWindow(void)
+{
+    if (hScroll) {
+        DisposeControl (hScroll);
+    }
+    if (vScroll) {
+        DisposeControl (vScroll);
+    }
+    if (theWindow) {
+#ifdef TARGET_API_MAC_CARBON
+        if (containerRef) {
+            HideSheetWindow (theWindow);
+        }
+#endif
+        if (flags&HY_WINDOW_DLOG)
+#ifdef OPAQUE_TOOLBOX_STRUCTS
+            DisposeDialog (GetDialogFromWindow(theWindow));
+#else
+            DisposeDialog (theWindow);
+#endif
+        else {
+            DisposeWindow (theWindow);
+        }
+    }
+
+#ifdef TARGET_API_MAC_CARBON
+    if (sizeHandler) {
+        DisposeEventHandlerUPP (sizeHandler);
+    }
+#endif
+}
+
+//__________________________________________________________________
+
+void _HYPlatformWindow::_SetTitle(_String windowTitle)
+{
+    Str255 theTitle;
+    StringToStr255 (windowTitle,theTitle);
+    SetWTitle (theWindow,theTitle);
+    long f = windowPtrs.Find((long)theWindow);
+    if (f>=0) {
+        long f2 = FindWindowByName (objectInspectorTitle);
+        if((f2>=0)&&(f>=f2)) {
+            f--;
+        }
+        SetMenuItemText (GetMenuHandle(132),f+6,theTitle);
+    }
+}
+
+//__________________________________________________________________
+
+void _HYPlatformWindow::_Show(void)
+{
+#ifdef TARGET_API_MAC_CARBON
+    if (containerRef&&sheet1st) {
+        ShowSheetWindow (theWindow, ((_HYWindow*)containerRef)->theWindow);
+        sheet1st = false;
+    } else
+#endif
+
+        ShowHide (theWindow,true);
+}
+
+//__________________________________________________________________
+
+_HYRect _HYPlatformWindow::_GetWindowRect(void)
+{
+    _HYRect res;
+
+#ifdef OPAQUE_TOOLBOX_STRUCTS
+    Rect    wr;
+    GetWindowBounds (theWindow,kWindowGlobalPortRgn,&wr);
+#else
+    Rect    wr = (*((WindowPeek)theWindow)->contRgn)->rgnBBox;
+#endif
+
+    res.left    = wr.left;
+    res.top     = wr.top;
+
+    res.right     = wr.right;
+    res.bottom    = wr.bottom;
+
+    res.width     = 0;
+
+    return res;
+}
+
+
+//__________________________________________________________________
+
+void _HYPlatformWindow::_Hide(void)
+{
+    ShowHide (theWindow,false);
+}
+
+//__________________________________________________________________
+
+long _HYPlatformWindow::_Grow(Ptr theData)
+{
+    EventRecord* theEvent = (EventRecord*)theData;
+    Rect         sizeRect;
+    sizeRect.top = 50;
+    sizeRect.left = 50;
+    _HYWindow* theParent = (_HYWindow*)this;
+    sizeRect.bottom = theParent->contentHeight+15;
+    sizeRect.right  = theParent->contentWidth+15;
+
+    return       GrowWindow  (theWindow,theEvent->where,&sizeRect);
+
+}
+
+//__________________________________________________________________
+
+_String& _HYPlatformWindow::_GetTitle(void)
+{
+    return      ((_HYWindow*)this)->GetTitle();
+}
+
+//__________________________________________________________________
+
+void _HYPlatformWindow::_Move(Ptr theData)
+{
+    EventRecord* theEvent = (EventRecord*)theData;
+    Rect         allOfIt = {0,0,0x7fff,0x7fff};
+    DragWindow  (theWindow,theEvent->where,&allOfIt);
+}
+
+//__________________________________________________________________
+
+void _HYPlatformWindow::_SetPosition(int l,int t)
+{
+    MoveWindow (theWindow,l,t,false);
+    long deltah = savedLoc.left-l,
+         deltav = savedLoc.top-t;
+    savedLoc.left = l;
+    savedLoc.right -= deltah;
+    savedLoc.top = t;
+    savedLoc.bottom -= deltav;
+}
+
+//__________________________________________________________________
+
+bool _HYPlatformWindow::_Close(Ptr theData)
+{
+    _HYWindow* theParent = (_HYWindow*)this;
+    bool        doit = true;
+
+    if (theData) {
+        EventRecord* theEvent = (EventRecord*)theData;
+        doit = theData?TrackGoAway  (theWindow,theEvent->where):true;
+    }
+    if (doit) {
+        if (theParent->ConfirmClose()) {
+            long f = windowObjects.Find((long)this);
+            if (f>=0) {
+                windowObjects.Delete(f);
+                windowPtrs.Delete(f);
+                windowObjectRefs.Delete(f);
+                if ((flags&HY_WINDOW_NOLIST)==0) {
+                    MenuHandle  windowM = GetMenuHandle(132);
+                    long k = CountMenuItems(windowM);
+                    for (; k>=6; k--) {
+                        Str255 buffer;
+                        _String conv;
+                        GetMenuItemText (windowM,k,buffer);
+                        Str255ToStr (conv,buffer);
+
+                        _String * myTitle = &theParent->GetTitle();
+                        if (conv.Equal (myTitle)) {
+                            DeleteMenuItem (windowM,k);
+                            break;
+                        }
+                    }
+                }
+            }
+            //theWindow = nil;
+            if (FrontWindow() == theWindow) {
+                _UnsetMenuBar ();
+            }
+        } else {
+            doit = false;
+        }
+    }
+    return doit;
+}
+
+//__________________________________________________________________
+
+void _Close2(Ptr p)
+{
+    WindowPtr theWindow = (WindowPtr)p;
+#ifdef TARGET_API_MAC_CARBON
+    DisposeWindow (theWindow);
+#else
+    CloseWindow (theWindow);
+#endif
+}
+//__________________________________________________________________
+void _HYPlatformWindow::drawGrowIcon (void)
+{
+    GrafPtr savedPort;
+    GetPort(&savedPort);
+#ifdef OPAQUE_TOOLBOX_STRUCTS
+    SetPort(GetWindowPort(theWindow));
+#else
+    SetPort(theWindow);
+#endif
+    RgnHandle   oldClip;
+    oldClip = NewRgn();
+    Rect r = newSRect();
+    GetClip (oldClip);
+    ClipRect (&r);
+    DrawGrowIcon (theWindow);
+    SetClip (oldClip);
+    DisposeRgn (oldClip);
+    SetPort(savedPort);
+}
+//__________________________________________________________________
+
+void _HYPlatformWindow::_Activate(void)
+{
+    //_String    deAC = _String("Activate ") & (long)((_HYWindow*)this)->GetID() & '\n';
+    //StringToConsole (deAC);
+#ifdef TARGET_API_MAC_CARBON
+    if (containerRef&&sheet1st) {
+        sheet1st = false;
+        ShowSheetWindow (theWindow, ((_HYWindow*)containerRef)->theWindow);
+    }
+
+    else
+#endif
+    {
+        ShowWindow   (theWindow);
+        SelectWindow (theWindow);
+        _SetMenuBar();
+    }
+
+    if (flags&HY_WINDOW_SIZE) {
+        drawGrowIcon();
+    }
+    if (hScroll) {
+        ShowControl (hScroll);
+        ShowControl (vScroll);
+        _HYWindow* theParent = (_HYWindow*)this;
+        int     windowW = theParent->right-theParent->left-13,
+                windowH =  theParent->bottom-theParent->top-13;
+        if (theParent->contentWidth>windowW) {
+            HiliteControl (hScroll,0);
+        }
+        if (theParent->contentHeight>windowH) {
+            HiliteControl (vScroll,0);
+        }
+        DrawControls(theWindow);
+    }
+}
+
+//__________________________________________________________________
+
+void _HYPlatformWindow::_BringWindowToFront(void)
+{
+#ifdef TARGET_API_MAC_CARBON
+    if (containerRef&&sheet1st) {
+        ShowSheetWindow (theWindow, ((_HYWindow*)containerRef)->theWindow);
+        sheet1st = false;
+    }
+
+    else
+#endif
+    {
+        ShowWindow   (theWindow);
+        SelectWindow (theWindow);
+    }
+}
+
+//__________________________________________________________________
+
+void _HYPlatformWindow::_Deactivate(void)
+{
+    if (!(flags&HY_WINDOW_SHEET)) {
+
+        //_String    deAC = _String("Deactivate ") & (long)((_HYWindow*)this)->GetID() & '\n';
+        //StringToConsole (deAC);
+        if (flags&HY_WINDOW_SIZE) {
+            drawGrowIcon ();
+        }
+        if (hScroll) {
+            HiliteControl (hScroll, kControlInactivePart);
+            HiliteControl (vScroll, kControlInactivePart);
+            DrawControls(theWindow);
+        }
+        _UnsetMenuBar();
+#ifdef TARGET_API_MAC_CARBON
+        Cursor arrow;
+        SetCursor(GetQDGlobalsArrow(&arrow));
+#else
+        SetCursor (&qd.arrow);
+#endif
+    }
+}
+
+
+
+//__________________________________________________________________
+
+void _HYPlatformWindow::_SetMenuBar(void)
+{
+    //_String mOut = _String("_SetMenuBar in ") & (long)((_HYWindow*)this)->GetID() & "\n";
+    //StringToConsole (mOut);
+    if (flags& HY_WINDOW_DLOG) {
+        for (long j = 129; j<133; j++) {
+            MenuHandle mh = GetMenuHandle (j);
+            DisableMenuItem (mh,0);
+        }
+    } else {
+        MenuHandle  t = GetMenuHandle (130);
+        DisableMenuItem (t,1);
+        DisableMenuItem (t,3);
+        DisableMenuItem (t,4);
+        DisableMenuItem (t,5);
+        DisableMenuItem (t,6);
+        DisableMenuItem (t,8);
+        DisableMenuItem (t,9);
+
+        EnableMenuItem  (GetMenuHandle (129),5);
+        _HYWindow* theParent = (_HYWindow*)this;
+        if (!theParent->IsSaveEnabled()) {
+            DisableMenuItem (GetMenuHandle (129),4);
+        }
+        if (!theParent->IsPrintEnabled()) {
+            DisableMenuItem (GetMenuHandle (129),8);
+        }
+    }
+
+    InvalMenuBar();
+}
+
+//__________________________________________________________________
+
+void _HYPlatformWindow::_UnsetMenuBar(void)
+{
+    //_String mOut = _String("_UnsetMenuBar in ") & (long)((_HYWindow*)this)->GetID() & "\n";
+    //StringToConsole (mOut);
+    if (flags& HY_WINDOW_DLOG) {
+        for (long j = 129; j<133; j++) {
+            MenuHandle mh = GetMenuHandle (j);
+            EnableMenuItem (mh,0);
+        }
+    } else {
+        MenuHandle  t = GetMenuHandle (129);
+        EnableMenuItem (t,1);
+        EnableMenuItem (t,2);
+        EnableMenuItem (t,4);
+        EnableMenuItem (t,8);
+        DisableMenuItem(t,5);
+        t = GetMenuHandle (130);
+        EnableMenuItem (t,8);
+        EnableMenuItem (t,9);
+    }
+    InvalMenuBar();
+}
+
+//__________________________________________________________________
+
+void _HYPlatformWindow::_Paint(Ptr)
+{
+    if (flags&HY_WINDOW_SIZE) {
+        DrawGrowIcon (theWindow);
+    }
+    if (hScroll) {
+        ShowControl (hScroll);
+        ShowControl (vScroll);
+        DrawControls(theWindow);
+    }
+}
+
+//__________________________________________________________________
+
+void _HYPlatformWindow::_Update(Ptr)
+{
+    GrafPtr savedPort;
+    GetPort(&savedPort);
+#ifdef OPAQUE_TOOLBOX_STRUCTS
+    SetPort(GetWindowPort(theWindow));
+    Rect    portRect;
+    GetWindowBounds (theWindow,kWindowGlobalPortRgn,&portRect);
+    OffsetRect (&portRect,-portRect.left,-portRect.top);
+    EraseRect (&portRect);
+#else
+    SetPort(theWindow);
+    EraseRect (&theWindow->portRect);
+#endif
+    BeginUpdate(theWindow);
+    EndUpdate(theWindow);
+    if (flags&HY_WINDOW_SIZE) {
+        DrawGrowIcon (theWindow);
+    }
+    if (hScroll) {
+        DrawControls (theWindow);
+    }
+    SetPort(savedPort);
+}
+
+//__________________________________________________________________
+
+void _HYPlatformWindow::_SetWindowRectangle(int top, int left, int bottom, int right, bool ss)
+{
+    if (ss) {
+        SizeWindow (theWindow, right-left, bottom-top, false);
+    }
+    GrafPtr   savePort;
+    GetPort   (&savePort);
+#ifdef OPAQUE_TOOLBOX_STRUCTS
+    SetPort(GetWindowPort(theWindow));
+    Rect    portRect;
+    GetWindowBounds (theWindow,kWindowGlobalPortRgn,&portRect);
+    OffsetRect (&portRect,-portRect.left,-portRect.top);
+    InvalWindowRect (theWindow,&portRect);
+#else
+    SetPort(theWindow);
+    InvalRect (&theWindow->portRect);
+#endif
+    SetPort   (savePort);
+    long      newSize;
+    if (hScroll) {
+        int windowWidth = right-left-13,
+            windowHeight = bottom-top-13;
+
+        _HYWindow* theParent = (_HYWindow*)this;
+
+        if (windowWidth > theParent->contentWidth) {
+            HiliteControl (hScroll,255);
+        } else {
+            HiliteControl (hScroll,0);
+            newSize = MAX_CONTROL_VALUE*(_Parameter)windowWidth/(theParent->contentWidth-windowWidth);
+            if (newSize>0x6fffffff) {
+                newSize = 0x6fffffff;
+            }
+            SetControlViewSize (hScroll,(long)newSize);
+        }
+
+        if (windowHeight > theParent->contentHeight) {
+            HiliteControl (vScroll,255);
+        } else {
+            HiliteControl (vScroll,0);
+            newSize = MAX_CONTROL_VALUE*(_Parameter)windowHeight/(theParent->contentHeight-windowHeight);
+            if (newSize>0x6fffffff) {
+                newSize = 0x6fffffff;
+            }
+            SetControlViewSize (vScroll,(long)newSize);
+        }
+
+        Rect newRect = newVRect();
+        MoveControl (vScroll,newRect.left,newRect.top);
+        SizeControl (vScroll,newRect.right-newRect.left,newRect.bottom-newRect.top);
+        newRect     = newHRect();
+        MoveControl (hScroll,newRect.left,newRect.top);
+        SizeControl (hScroll,newRect.right-newRect.left,newRect.bottom-newRect.top);
+    }
+    savedLoc.bottom=savedLoc.top+bottom-top;
+    savedLoc.right=savedLoc.left+right-left;
+}
+
+//__________________________________________________________________
+
+bool _HYPlatformWindow::_ProcessOSEvent (Ptr vEvent)
+{
+    EventRecord*    theEvent = (EventRecord*)vEvent;
+    WindowPtr       dummy;
+    _HYWindow*      theParent = (_HYWindow*)this;
+    switch (theEvent->what) {
+    case updateEvt:
+        if ((WindowPtr)theEvent->message==theWindow) {
+            theParent->Update(nil);
+            return true;
+        }
+        return false;
+    case activateEvt: {
+        if ((WindowPtr)theEvent->message==theWindow) {
+            if (theEvent->modifiers&activeFlag) {
+                theParent->Activate();
+            } else {
+                theParent->Deactivate();
+            }
+        }
+        return true;
+    }
+    case mouseDown: {
+        long evtType = FindWindow (theEvent->where,&dummy);
+        switch (evtType) {
+        case inDrag:
+            theParent->Move(vEvent);
+            return true;
+        case inGrow:
+            theParent->Grow(vEvent);
+            return true;
+        case inGoAway:
+            theParent->Close(vEvent);
+            return true;
+        case inZoomIn:
+        case inZoomOut:
+            if (TrackBox(theWindow,theEvent->where,evtType)) {
+                theParent->_Zoom(evtType==inZoomIn);
+            }
+            return true;
+
+        case inContent:
+            if (FrontWindow()!=theWindow) {
+                SelectWindow (theParent->theWindow);
+                //theParent->Activate();
+                return true;
+            } else {
+                GrafPtr savedPort;
+                GetPort(&savedPort);
+#ifdef OPAQUE_TOOLBOX_STRUCTS
+                SetPort(GetWindowPort(theWindow));
+#else
+                SetPort(theWindow);
+#endif
+                Point localClick = theEvent->where;
+                GlobalToLocal (&localClick);
+                ControlHandle whichC;
+                short f = FindControl (localClick,theWindow,&whichC);
+                scrollingWindow = theParent;
+                if (f) {
+                    // set scroll step
+                    short   invisPixels;
+                    if ((whichC!=hScroll)&&(whichC!=vScroll)) {
+                        return false;
+                    }
+                    if (whichC==hScroll) {
+                        invisPixels = theParent->contentWidth-(theParent->right-theParent->left-13);
+                        hScrollingAction = true;
+                    } else {
+                        invisPixels = theParent->contentHeight-(theParent->bottom-theParent->top-13);
+                        hScrollingAction = false;
+                    }
+                    scrollStepCounter = 0;
+                    smallScrollStep = (double)MAX_CONTROL_VALUE/invisPixels;
+                    if (!smallScrollStep) {
+                        smallScrollStep = 1;
+                    }
+#ifdef TARGET_API_MAC_CARBON
+                    ControlActionUPP myActionProc;
+                    myActionProc =   NewControlActionUPP(scrollAction);
+#else
+                    UniversalProcPtr myActionProc;
+                    myActionProc = NewRoutineDescriptor((ProcPtr)scrollAction,
+                                                        uppControlActionProcInfo,
+                                                        GetCurrentISA());
+#endif
+
+                    lastScrollControlValue = GetControl32BitValue (whichC);
+
+                    switch (f) {
+                    case kControlIndicatorPart: {
+                        long    cv = GetControl32BitValue(whichC),cv2;
+                        TrackControl (whichC,localClick,nil);
+                        cv2 = GetControl32BitValue(whichC);
+                        if (cv!=cv2)
+                            if (whichC==hScroll) {
+                                scrollingWindow->ProcessEvent (generateScrollEvent (cv2-cv,0));
+                            } else {
+                                scrollingWindow->ProcessEvent (generateScrollEvent (0,cv2-cv));
+                            }
+
+                        break;
+                    }
+                    default:
+                        forceUpdateForScrolling = true;
+#ifndef __OLDMAC__
+                        TrackControl (whichC,localClick,myActionProc);
+#endif
+#ifdef __OLDMAC__
+                        TrackControl (whichC,localClick,scrollAction);
+#endif
+                        forceUpdateForScrolling = false;
+
+                    }
+#ifdef TARGET_API_MAC_CARBON
+                    DisposeControlActionUPP(myActionProc);
+#endif
+                    return true;
+                }
+                SetPort(savedPort);
+            }
+
+        default:
+            return false;
+        }
+    }
+    }
+    return false;
+}
+//__________________________________________________________________
+
+void    _HYPlatformWindow::_SetContentSize (int w, int h)
+{
+    if (!hScroll) {
+        return;
+    }
+    _HYWindow* theParent = (_HYWindow*)this;
+    int     windowW = theParent->right-theParent->left-15,
+            windowH =  theParent->bottom-theParent->top-15;
+    if (w<=windowW) {
+        HiliteControl (hScroll,255);
+    } else {
+        SetControl32BitValue (hScroll, 0);
+        HiliteControl (hScroll,0);
+    }
+    if (h<=windowH) {
+        HiliteControl (vScroll,255);
+    } else {
+        SetControl32BitValue (vScroll, 0);
+        HiliteControl (hScroll,0);
+    }
+
+    DrawControls (theWindow);
+}
+
+//__________________________________________________________________
+
+
+void    _HYPlatformWindow::_VisibleContents (int& t,int& l,int& b,int& r)
+{
+    _HYWindow*
+    theParent = (_HYWindow*)this;
+
+    long  windowH   = theParent->bottom - theParent->top  - HY_SCROLLER_WIDTH,
+          windowW   = theParent->right  - theParent->left - HY_SCROLLER_WIDTH;
+
+    _Parameter v;
+
+    if (hScroll) {
+        if (windowW>theParent->contentWidth) {
+            l = theParent->left;
+            r = theParent->right;
+        } else {
+            v = GetControl32BitValue (hScroll);
+            l = theParent->left+(theParent->contentWidth-windowW)*v/(double)MAX_CONTROL_VALUE;
+            r = l+windowW;
+        }
+        if (windowH>theParent->contentHeight) {
+            t = theParent->top;
+            b = theParent->bottom;
+        } else {
+            v = GetControl32BitValue (vScroll);
+            t = theParent->top+(theParent->contentHeight-windowH)*v/(double)MAX_CONTROL_VALUE;
+            b = t+windowH;
+        }
+    } else {
+        t = theParent->top;
+        l = theParent->left;
+        b = theParent->bottom;
+        r = theParent->right;
+    }
+}
+
+//__________________________________________________________________
+
+void    _HYPlatformWindow::_SetWindowBackColor (_HYColor newColor)
+{
+    GrafPtr         savePort;
+    GetPort         (&savePort);
+#ifdef OPAQUE_TOOLBOX_STRUCTS
+    SetPort(GetWindowPort(theWindow));
+#else
+    SetPort(theWindow);
+#endif
+    RGBColor        c;
+
+    c.red           = newColor.R*256;
+    c.blue          = newColor.B*256;
+    c.green         = newColor.G*256;
+
+    RGBBackColor    (&c);
+    SetPort         (savePort);
+}
+
+//__________________________________________________________________
+
+bool    _HYPlatformWindow::_IsHScroll (ControlHandle ch)
+{
+    return ch == hScroll;
+}
+
+//__________________________________________________________________
+
+Rect    _HYPlatformWindow::newVRect (void)
+{
+#ifdef OPAQUE_TOOLBOX_STRUCTS
+    Rect all;
+    GetWindowBounds (theWindow,kWindowGlobalPortRgn,&all);
+    OffsetRect (&all,-all.left,-all.top);
+#else
+    Rect all = theWindow->portRect;
+#endif
+    all.left = all.right-HY_SCROLLER_WIDTH;
+    all.top--;
+    all.right++;
+    all.bottom-=(HY_SCROLLER_WIDTH-1);
+    return all;
+}
+
+//__________________________________________________________________
+
+Rect    _HYPlatformWindow::newHRect (void)
+{
+#ifdef OPAQUE_TOOLBOX_STRUCTS
+    Rect all;
+    GetWindowBounds (theWindow,kWindowGlobalPortRgn,&all);
+    OffsetRect (&all,-all.left,-all.top);
+#else
+    Rect all = theWindow->portRect;
+#endif
+    all.right -= (HY_SCROLLER_WIDTH-1);
+    all.left--;
+    all.top = all.bottom-HY_SCROLLER_WIDTH;
+    all.bottom++;
+    return all;
+}
+
+//__________________________________________________________________
+
+Rect    _HYPlatformWindow::newSRect (void)
+{
+#ifdef OPAQUE_TOOLBOX_STRUCTS
+    Rect all;
+    GetWindowBounds (theWindow,kWindowGlobalPortRgn,&all);
+    OffsetRect (&all,-all.left,-all.top);
+#else
+    Rect all = theWindow->portRect;
+#endif
+    all.left = all.right-HY_SCROLLER_WIDTH;
+    all.top = all.bottom-HY_SCROLLER_WIDTH;
+    return all;
+}
+
+//__________________________________________________________________
+
+bool        _HYWindow::_ProcessMenuSelection (long msel)
+{
+    long        menuChoice = msel&0x0000ffff;
+
+    switch (msel/0xffff) {
+    case 129: { // file menu
+        if (menuChoice==5) { // close
+            Close(nil);
+            HiliteMenu(0);
+            InvalMenuBar();
+            return true;
+        }
+        if (menuChoice==7)
+            // page setup
+        {
+            OSStatus theStatus;
+            Boolean isAccepted;
+
+            PMPrintSession     hyPrintSession;
+
+            //theStatus = PMBegin();
+            theStatus = PMCreateSession (&hyPrintSession);
+            if (theStatus != noErr) {
+                return true;
+            }
+
+            if (InitPrint(hyPrintSession)) {
+                theStatus = PMSessionPageSetupDialog(hyPrintSession, gPageFormat, &isAccepted);
+            }
+
+            if (theStatus == noErr) {
+                if (gFlattenedFormat != NULL) {
+                    DisposeHandle(gFlattenedFormat);
+                    gFlattenedFormat = NULL;
+                }
+
+                theStatus = PMFlattenPageFormat(gPageFormat, &gFlattenedFormat);
+            }
+
+            if (gPageFormat != kPMNoPageFormat) {
+                theStatus = PMRelease (gPageFormat);
+                gPageFormat = kPMNoPageFormat;
+            }
+
+            theStatus = PMRelease(hyPrintSession);
+        }
+    }
+    }
+    return false;
+}
+
+//__________________________________________________________________
+
+void _HYPlatformWindow::_SelectWindow (void)
+{
+    SelectWindow (theWindow);
+}
+
+//EOF
\ No newline at end of file
diff --git a/src/gui/mac/HyPhy.rsrc b/src/gui/mac/HyPhy.rsrc
new file mode 100644
index 0000000..1b76e12
Binary files /dev/null and b/src/gui/mac/HyPhy.rsrc differ
diff --git a/src/gui/mac/Info.plist b/src/gui/mac/Info.plist
new file mode 100644
index 0000000..a0d60e6
--- /dev/null
+++ b/src/gui/mac/Info.plist
@@ -0,0 +1,58 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+	<key>CFBundleDocumentTypes</key>
+	<array>
+		<dict>
+			<key>CFBundleTypeExtensions</key>
+			<array>
+				<string>*</string>
+			</array>
+			<key>CFBundleTypeName</key>
+			<string>All documents</string>
+			<key>CFBundleTypeRole</key>
+			<string>Editor</string>
+			<key>LSTypeIsPackage</key>
+			<false/>
+			<key>NSPersistentStoreTypeKey</key>
+			<string>XML</string>
+		</dict>
+		<dict>
+			<key>CFBundleTypeExtensions</key>
+			<array>
+				<string>txt</string>
+				<string>text</string>
+			</array>
+			<key>CFBundleTypeIconFile</key>
+			<string>Docs</string>
+			<key>CFBundleTypeName</key>
+			<string>Text document</string>
+			<key>CFBundleTypeOSTypes</key>
+			<array>
+				<string>TEXT</string>
+			</array>
+			<key>CFBundleTypeRole</key>
+			<string>Viewer</string>
+		</dict>
+	</array>
+	<key>CFBundleIconFile</key>
+	<string>HYPHYMP</string>
+	<key>CFBundleIdentifier</key>
+	<string>org.hyphy</string>
+	<key>CFBundleLongVersionString</key>
+	<string>1.4, Copyright 1997-2014 by Sergei L Kosakovsky Pond, Art FY Poon, N. Lance Hepler, Steven Weaver, Martin Smith, and Spencer V Muse</string>
+	<key>CFBundleShortVersionString</key>
+	<string>2.10beta</string>
+	<key>CFBundleURLTypes</key>
+	<array/>
+	<key>CFBundleVersion</key>
+	<string>2.2.3</string>
+	<key>NSServices</key>
+	<array/>
+	<key>UTExportedTypeDeclarations</key>
+	<array/>
+	<key>UTImportedTypeDeclarations</key>
+	<array/>
+</dict>
+</plist>
diff --git a/src/gui/mac/WindowClasses/HYPlatformBootsrapWindow.cpp b/src/gui/mac/WindowClasses/HYPlatformBootsrapWindow.cpp
new file mode 100644
index 0000000..0984711
--- /dev/null
+++ b/src/gui/mac/WindowClasses/HYPlatformBootsrapWindow.cpp
@@ -0,0 +1 @@
+/*
    Mac OS Portions of the bootstrap window class

    Sergei L. Kosakovsky Pond, Spring 2000 - December 2002.
*/

#include "HYParameterTable.h"


//__________________________________________________________________


bool        _HYBootstrapWindow::_ProcessMenuSelection (long msel)
{
    long        menuChoice = msel&0x0000ffff;

    HiliteMenu(0);
    InvalMenuBar();

    switch (msel/0xffff) {
    case 129: { // file menu
        if (menuChoice==4) { // print
            DoSave ();
            return true;
        } else if (menuChoice==8) { // print
            _HYTable* t =  (_HYTable*)GetCellObject (2,0);
            t->_PrintTable((_HYTable*)GetCellObject (1,0));
            return true;
        }

        break;
    }
    }

    if (_HYTWindow::_ProcessMenuSelection(msel)) {
        return true;
    }

    return false;
}




//EOF
\ No newline at end of file
diff --git a/src/gui/mac/WindowClasses/HYPlatformChartWindow.cpp b/src/gui/mac/WindowClasses/HYPlatformChartWindow.cpp
new file mode 100644
index 0000000..26bcebe
--- /dev/null
+++ b/src/gui/mac/WindowClasses/HYPlatformChartWindow.cpp
@@ -0,0 +1 @@
+/*
    Mac OS Portions of the chart window class

    Sergei L. Kosakovsky Pond, Spring 2000 - December 2002.
*/

#include "HYChartWindow.h"
#include "HYCanvas.h"
#include "HYUtils.h"
#include "HYPulldown.h"

#include "math.h"
#include "scrap.h"

extern   _Parameter     pi_const;


//__________________________________________________________________

void _HYChartWindow::_SetMenuBar(void)
{
    _HYWindow::_SetMenuBar();
    MenuHandle  t = GetMenuHandle (130);
    EnableMenuItem (t,4);
    EnableMenuItem (t,5);
    EnableMenuItem (t,8);
    MenuHandle chartMenu = GetMenuHandle (HY_CHART_WINDOW_MENU_ID);
    if (!chartMenu) {
        chartMenu = NewMenu(HY_CHART_WINDOW_MENU_ID,"\pChart");
        if (!chartMenu) {
            warnError (-108);
        }

        MenuHandle saveMenu  =  NewMenu(HY_CHART_WINDOW_HMENU_ID,"\pSave"),
                   printMenu =  NewMenu(HY_CHART_WINDOW_HMENU_ID+1,"\pPrint"),
                   fontMenu  =  NewMenu(HY_CHART_WINDOW_HMENU_ID+2,"\pFonts"),
                   procMenu  =  NewMenu(HY_CHART_WINDOW_HMENU_ID+3,"\pData Processing");

        InsertMenuItem  (saveMenu, "\pSave Chart.../S",10000);
        InsertMenuItem  (saveMenu, "\pSave Graphic...",10000);
        InsertMenuItem  (saveMenu, "\pSave Table...",10000);
        InsertMenuItem  (printMenu,"\pPrint Chart.../P",10000);
        InsertMenuItem  (printMenu,"\pPrint Table...",10000);
        InsertMenuItem  (fontMenu, "\pTickmark  Font...",10000);
        InsertMenuItem  (fontMenu, "\pLegend Font...",10000);
        InsertMenuItem  (fontMenu, "\pAxis Label  Font...",10000);

        InsertMenuItem  (chartMenu,"\pChart Name...",10000);
        InsertMenuItem  (chartMenu,"\pChart Options...",10000);
        InsertMenuItem  (chartMenu, "\pFonts",10000);
        InsertMenuItem  (chartMenu, "\p(-",10000);
        InsertMenuItem  (chartMenu, "\pData Processing",10000);
        InsertMenu      (saveMenu,hierMenu);
        InsertMenu      (printMenu,hierMenu);
        InsertMenu      (fontMenu,hierMenu);
        InsertMenu      (procMenu,hierMenu);
        InsertMenu      (chartMenu,132);

        SetItemCmd (chartMenu,3,hMenuCmd);
        SetItemMark(chartMenu,3,HY_CHART_WINDOW_HMENU_ID+2);
        SetItemCmd (chartMenu,5,hMenuCmd);
        SetItemMark(chartMenu,5,HY_CHART_WINDOW_HMENU_ID+3);
        if (chartProcessors.lLength == 0) {
            DisableMenuItem (chartMenu,5);
        } else {
            Str255    buffer;
            for (long k=0; k<chartProcessors.lLength; k++) {
                _String *thisItem = (_String*)chartProcessors (k),
                         chopped = thisItem->Cut (thisItem->FindBackwards (':',0,-1)+1,-1);
                StringToStr255  (chopped,buffer);
                InsertMenuItem  (procMenu, buffer,10000);
            }
        }

        t = GetMenuHandle (129);
        SetItemCmd (t,4,hMenuCmd);
        SetItemMark(t,4,HY_CHART_WINDOW_HMENU_ID);
        SetItemCmd (t,8,hMenuCmd);
        SetItemMark(t,8,HY_CHART_WINDOW_HMENU_ID+1);
    }
    InvalMenuBar();
}


//__________________________________________________________________

void _HYChartWindow::_UnsetMenuBar(void)
{
    MenuHandle chartMenu    = GetMenuHandle (HY_CHART_WINDOW_MENU_ID),
               saveMenu   = GetMenuHandle (HY_CHART_WINDOW_HMENU_ID),
               printMenu    = GetMenuHandle (HY_CHART_WINDOW_HMENU_ID+1),
               fontMenu        = GetMenuHandle (HY_CHART_WINDOW_HMENU_ID+2),
               procMenu      = GetMenuHandle (HY_CHART_WINDOW_HMENU_ID+3),
               fMenu       = GetMenuHandle (129);

    DeleteMenu (HY_CHART_WINDOW_MENU_ID);
    DeleteMenu (HY_CHART_WINDOW_HMENU_ID);
    DeleteMenu (HY_CHART_WINDOW_HMENU_ID+1);
    DeleteMenu (HY_CHART_WINDOW_HMENU_ID+2);
    DeleteMenu (HY_CHART_WINDOW_HMENU_ID+3);
    DisposeMenu (chartMenu);
    DisposeMenu (printMenu);
    DisposeMenu (saveMenu);
    DisposeMenu (fontMenu);
    DisposeMenu (procMenu);
    SetItemCmd (fMenu,4,'S');
    SetItemCmd (fMenu,8,'P');
    SetItemMark(fMenu,4,noMark);
    SetItemMark(fMenu,8,noMark);
    _HYWindow::_UnsetMenuBar();
}


//__________________________________________________________________

void        _HYChartWindow::_PrintChart(void)
{
    GrafPtr     savePort;
#ifdef      TARGET_API_MAC_CARBON
    PMRect prRect;
#else
    TPrStatus   prStatus;
    TPPrPort    printPort;
    OSErr       err;
#endif

#ifdef TARGET_API_MAC_CARBON
    OSStatus theStatus;
    Boolean isAccepted;

    PMPrintSession hyPC;
    theStatus = PMCreateSession(&hyPC);
    if (theStatus != noErr) {
        return;
    }
#endif

    if (!InitPrint(hyPC)) {
        _String errMsg ("Could not initialize printing variables.");
        WarnError (errMsg);
        terminateExecution = false;
        return;
    }

    GetPort(&savePort);

#ifdef TARGET_API_MAC_CARBON
    if (gPrintSettings != kPMNoPrintSettings) {
        theStatus = PMSessionValidatePrintSettings(hyPC,gPrintSettings, kPMDontWantBoolean);
    } else {
        theStatus = PMCreatePrintSettings(&gPrintSettings);

        if ((theStatus == noErr) && (gPrintSettings != kPMNoPrintSettings)) {
            theStatus = PMSessionDefaultPrintSettings(hyPC,gPrintSettings);
        }
    }

    if (theStatus == noErr) {
        theStatus = PMSessionPrintDialog(hyPC,gPrintSettings, gPageFormat, &isAccepted);

        if (isAccepted) {
            theStatus = PMGetAdjustedPageRect(gPageFormat, &prRect);
            if (theStatus != noErr) {
                return;
            }

            theStatus = PMSessionBeginDocument(hyPC,gPrintSettings, gPageFormat);
            if (theStatus != noErr) {
                return;
            }

            long     printW    = prRect.right-prRect.left-2,
                     printH    = prRect.bottom-prRect.top-2;

            UInt32   startPage,
                     endPage;

            PMGetFirstPage (gPrintSettings,&startPage);
            PMGetLastPage  (gPrintSettings,&endPage);
#else
    PrOpen();
    if (err=PrError()) {
        _String errMsg ("Could not print the chart. Error Code:");
        errMsg = errMsg & (long)err;
        WarnError (errMsg);
        terminateExecution = false;
        return;
    }

    if (PrJobDialog(prRecHdl)) {
        printPort = PrOpenDoc(prRecHdl, nil, nil);
        SetPort((GrafPtr)printPort);
        long     printW = (*prRecHdl)->prInfo.rPage.right-2,
                 printH = (*prRecHdl)->prInfo.rPage.bottom-2,
                 startPage = (*prRecHdl)->prJob.iFstPage,
                 endPage = (*prRecHdl)->prJob.iLstPage;
#endif
#ifdef TARGET_API_MAC_CARBON
            theStatus = PMSessionBeginPage(hyPC, gPageFormat, NULL);
            if (theStatus != noErr) {
                return;
            }
            GrafPtr ppPort;
            PMSessionGetGraphicsContext (hyPC, NULL, (void**)&ppPort);
            SetPort (ppPort);
#else
            PrOpenPage      (printPort, nil);
#endif

            _HYRect     viewRect  = ((_HYStretchCanvas*)GetObject (0))->GetCanvasSize();
            _Parameter  aspectRatio = viewRect.right/(_Parameter)viewRect.bottom;
            _HYRect     printRect = {0,0,printH, printH*aspectRatio,0};

            if (printRect.right > printW) {
                aspectRatio = printW/(_Parameter)printRect.right;
                printRect.right = printW;
                printRect.bottom *= aspectRatio;
            }

            DrawChart   (&printRect);

#ifdef TARGET_API_MAC_CARBON
            theStatus = PMSessionEndPage(hyPC);
            if (theStatus != noErr) {
                return;
            }
#else
            PrClosePage     (printPort);
#endif


#ifdef TARGET_API_MAC_CARBON
            theStatus = PMSessionEndDocument(hyPC);
            SetPort(savePort);
            if (theStatus == noErr) {
                if (gFlattenedFormat != NULL) {
                    DisposeHandle(gFlattenedFormat);
                    gFlattenedFormat = NULL;
                }

                theStatus = PMFlattenPageFormat(gPageFormat, &gFlattenedFormat);
            }

            if (theStatus == noErr) {
                if (gFlattenedSettings != NULL) {
                    DisposeHandle(gFlattenedSettings);
                    gFlattenedSettings = NULL;
                }

                theStatus = PMFlattenPrintSettings(gPrintSettings, &gFlattenedSettings);
            }

            if (gPageFormat != kPMNoPageFormat) {
                theStatus = PMRelease(gPageFormat);
                gPageFormat = kPMNoPageFormat;
            }

            if (gPrintSettings != kPMNoPrintSettings) {
                theStatus = PMRelease(gPrintSettings);
                gPrintSettings = kPMNoPrintSettings;
            }

            theStatus = PMRelease(hyPC);

#else
            PrCloseDoc(printPort);
            if (((*prRecHdl)->prJob.bJDocLoop = bSpoolLoop) && (!PrError() ) ) {
                PrPicFile(prRecHdl, nil, nil, nil, &prStatus);
            }
#endif
        }
#ifdef TARGET_API_MAC_CARBON
        else {
            theStatus = PMRelease(hyPC);
        }
#endif

#ifdef TARGET_API_MAC_CARBON
    }
#else
        PrClose();
        SetPort(savePort);
#endif


}

//__________________________________________________________________


bool        _HYChartWindow::_ProcessMenuSelection (long msel)
{
    long        menuChoice = msel&0x0000ffff;

    HiliteMenu(0);
    InvalMenuBar();

    switch (msel/0xffff) {
    case HY_CHART_WINDOW_MENU_ID: { // chart menu
        if (menuChoice==1) {
            RenameChartWindow ();
            return true;
        } else if (menuChoice==2) {
            HandleChartOptions ();
            return true;
        }
    }
    case HY_CHART_WINDOW_HMENU_ID: { // save menu
        DoSave (menuChoice-1);
        return true;
    }
    case HY_CHART_WINDOW_HMENU_ID+1: { // print menu
        DoPrint (menuChoice-1);
        return true;
    }
    case HY_CHART_WINDOW_HMENU_ID+2: { // font menu
        DoChangeFont (menuChoice-1);
        return true;
    }
    case HY_CHART_WINDOW_HMENU_ID+3: { // proc menu
        ExecuteProcessor (menuChoice-1);
        return true;
    }
    }

    return _HYTWindow::_ProcessMenuSelection(msel);
}

//__________________________________________________________________

bool _HYChartWindow::_ProcessOSEvent (Ptr vEvent)
{
    EventRecord*    theEvent = (EventRecord*)vEvent;

    if (!_HYTWindow::_ProcessOSEvent (vEvent)) {
        _HYPullDown *p1 = (_HYPullDown*)GetObject (4);

        if ((theEvent->what==mouseDown)&&(p1->GetSelection()>=8)&&(ySeries.lLength)) {
            Point localClick = theEvent->where;
            GrafPtr savedPort;
            GetPort(&savedPort);
#ifdef OPAQUE_TOOLBOX_STRUCTS
            SetPort(GetWindowPort(theWindow));
#else
            SetPort(theWindow);
#endif
            GlobalToLocal (&localClick);
            int   c = FindClickedCell(localClick.h,localClick.v),ch,cv;
            if (c<0) {
                return false;
            }
            if (c==0) { // the chart
                ch = localClick.h-componentL.lData[0];
                cv = localClick.v-componentT.lData[0];

                Point oldPt = {-1,-1};

                if (StillDown()) {
                    while (WaitMouseUp()) {
                        GetMouse(&localClick);
                        if (oldPt.h==-1) {
                            oldPt = localClick;
                        }
                        if (DeltaPoint (oldPt,localClick)) {
                            bool        redraw = false;

                            _Parameter  stepper = pi_const/180.;

                            if (abs(localClick.h-oldPt.h)>abs(localClick.v-oldPt.v)) {
                                stepper *= 1+log (fabs(localClick.h-oldPt.h))/log(2.0);
                                if (localClick.h-oldPt.h<0) {
                                    if (xyAngle>0.0) {
                                        xyAngle -= stepper;
                                        if (xyAngle<0) {
                                            xyAngle = 0;
                                        }
                                        redraw = true;
                                    }
                                } else if (xyAngle<pi_const/2) {
                                    xyAngle += stepper;
                                    if (xyAngle>pi_const/2) {
                                        xyAngle = pi_const/2;
                                    }
                                    redraw = true;
                                }
                            } else {
                                stepper *= 1+log (fabs(localClick.v-oldPt.v))/log(2.0);
                                if (localClick.v-oldPt.v>0) {
                                    if (zAngle<pi_const/2) {
                                        zAngle += stepper;
                                        if (zAngle>pi_const/2) {
                                            zAngle = pi_const/2;
                                        }
                                        redraw = true;
                                    }
                                } else if (zAngle>0.0) {
                                    zAngle -= stepper;
                                    if (zAngle<0) {
                                        zAngle = 0;
                                    }
                                    redraw = true;
                                }

                            }

                            if (redraw) {
                                ComputeProjectionSettings();
                                projectionMatrix = ComputeProjectionMatrix   ();
                                forceUpdateForScrolling = true;
                                DrawChart();
                                forceUpdateForScrolling = false;
                            }
                        }
                        oldPt = localClick;
                    }
                }
                return true;
            }
        }
        return false;
    }
    return true;
}

//__________________________________________________________________

void _HYChartWindow::_CopyChart (void)
{
#ifdef TARGET_API_MAC_CARBON
    ClearCurrentScrap();
#else
    ZeroScrap();
#endif

    _HYStretchCanvas    *sc = (_HYStretchCanvas*)GetObject (0);
    Rect                bRect;
    _HYRect             bounds;

    bounds.left         = bounds.top =
                              bRect.left            = bRect.top = 0;

    bounds.right        =   bRect.right         = sc->_HYComponent::GetMaxW();
    bounds.bottom       =   bRect.bottom        = sc->_HYComponent::GetMaxH();

    PicHandle    pic    = OpenPicture (&bRect);

    if (pic) {
        PixPatHandle         white = NewPixPat ();
        checkPointer         (white);
        RGBColor             wc = (RGBColor) {
            0xffff,0xffff,0xffff
        };
        MakeRGBPat           (white,&wc);
        FillCRect            (&bRect,white);
        DrawChart            (&bounds);
        DisposePixPat        (white);

        ClosePicture ();
        HLock   ((Handle)pic);
#ifdef TARGET_API_MAC_CARBON
        ClearCurrentScrap();
        ScrapRef         theScrapRef;
        GetCurrentScrap(&theScrapRef);
        PutScrapFlavor(theScrapRef, 'PICT', kScrapFlavorMaskNone,GetHandleSize((Handle)pic),*pic);
#else
        PutScrap (GetHandleSize((Handle)pic),'PICT',*pic);
#endif
        KillPicture (pic);
    } else {
        _String wMsg ("Failed to open a picture in _CopyChart - probably low on memory\n");
        WarnError (wMsg);
        terminateExecution = false;
    }
}

//__________________________________________________________________

void _HYDistributionChartWindow::_SetMenuBar(void)
{
    _HYChartWindow::_SetMenuBar();
    MenuHandle dMenu = GetMenuHandle (HY_CHART_WINDOW_MENU_ID+1);
    if (!dMenu) {
        dMenu = NewMenu(HY_CHART_WINDOW_MENU_ID+1,"\pCategories");
        if (!dMenu) {
            warnError (-108);
        }


        InsertMenuItem  (dMenu, "\pDefine New Variable",10000);
        InsertMenuItem  (dMenu, "\pDelete Variable",  10000);
        InsertMenuItem  (dMenu, "\pConditional Distribution",  10000);

        if (distribProcessors.lLength > 0) {
            InsertMenuItem  (dMenu, "\p(-",10000);
            Str255    buffer;
            for (long k=0; k<distribProcessors.lLength; k++) {
                _String *thisItem = (_String*)distribProcessors (k),
                         chopped = thisItem->Cut (thisItem->FindBackwards (':',0,-1)+1,-1);
                StringToStr255  (chopped,buffer);
                InsertMenuItem  (dMenu, buffer,10000);
            }
        }

        InsertMenu      (dMenu,132);
    }
    InvalMenuBar();
}

//__________________________________________________________________

void _HYDistributionChartWindow::_UnsetMenuBar(void)
{
    MenuHandle dMenu = GetMenuHandle (HY_CHART_WINDOW_MENU_ID+1);

    DeleteMenu (HY_CHART_WINDOW_MENU_ID+1);
    DisposeMenu (dMenu);

    _HYChartWindow::_UnsetMenuBar();
}

//__________________________________________________________________

bool _HYDistributionChartWindow::_ProcessMenuSelection (long msel)
{
    long        menuChoice = msel&0x0000ffff;

    HiliteMenu(0);
    InvalMenuBar();

    switch (msel/0xffff) {
    case HY_CHART_WINDOW_MENU_ID+1: { // chart menu
        if (menuChoice==1) {
            AddVariable ();
            return true;
        } else if (menuChoice==2) {
            RemoveVariable ();
            return true;
        } else if (menuChoice==3) {
            ShowMarginals ();
            return true;
        } else {
            HandleCatPostProcessor (menuChoice-5);
            return true;
        }

        break;
    }
    }

    return _HYChartWindow::_ProcessMenuSelection(msel);
}

//EOF
\ No newline at end of file
diff --git a/src/gui/mac/WindowClasses/HYPlatformConsoleWindow.cpp b/src/gui/mac/WindowClasses/HYPlatformConsoleWindow.cpp
new file mode 100644
index 0000000..e545a52
--- /dev/null
+++ b/src/gui/mac/WindowClasses/HYPlatformConsoleWindow.cpp
@@ -0,0 +1,394 @@
+/*
+    Mac OS Portions of the console window class
+
+    Sergei L. Kosakovsky Pond, December 2003.
+*/
+
+#include "HYConsoleWindow.h"
+#include "HYTextBox.h"
+#include <ControlDefinitions.h>
+#include <MacTextEditor.h>
+#include "HYPlatformGraphicPane.h"
+#include "parser.h"
+#include <Timer.h>
+
+extern   PixPatHandle   whiteFill,
+         blueFill,
+         statusBarFill;
+
+extern   RGBColor       _BLACK_;
+
+extern   CIconHandle    redButtonIcon,
+         orangeButtonIcon,
+         yellowButtonIcon;
+
+extern  _String         VerbosityLevelString;
+
+UnsignedWide            lastMeasure = {0,0};
+
+//__________________________________________________________________
+
+void _HYConsoleWindow::_SetMenuBar(void)
+{
+    //BufferToConsole ("_HYConsoleWindow::_SetMenuBar\n");
+    _HYWindow::_SetMenuBar();
+
+    MenuHandle  editMenuH  = GetMenuHandle (130);
+
+    if (CountMenuItems (editMenuH) < 13) {
+        InsertMenuItem (editMenuH,"\p(-", 6);
+        InsertMenuItem (editMenuH,"\pFind.../F", 7);
+        InsertMenuItem (editMenuH,"\p(Find Again/G", 8);
+
+        InsertMenuItem (editMenuH,"\p(Redo/Y", 1);
+
+        EnableMenuItem (editMenuH,12);
+        EnableMenuItem (editMenuH,13);
+
+        _UpdateEditMenu();
+    }
+    InvalMenuBar();
+}
+
+//__________________________________________________________________
+
+void _HYConsoleWindow::_UnsetMenuBar(void)
+{
+    //BufferToConsole ("_HYConsoleWindow::_UnsetMenuBar\n");
+    MenuHandle      editMenuH  = GetMenuHandle (130);
+    if (CountMenuItems (editMenuH) >= 13) {
+        DeleteMenuItem (editMenuH,8);
+        DeleteMenuItem (editMenuH,8);
+        DeleteMenuItem (editMenuH,8);
+        DeleteMenuItem (editMenuH,2);
+        _HYWindow::_UnsetMenuBar();
+    }
+}
+
+//__________________________________________________________________
+
+void _HYConsoleWindow::_UpdateEditMenu (void)
+{
+
+    _HYTextBox* txb = (_HYTextBox*)GetObject (0);
+
+    bool        haveSelection = !TXNIsSelectionEmpty(txb->txn),
+                canPaste      = TXNIsScrapPastable();
+
+    _String     undoAction (mlteCommandString(txb->txn,true)),
+                redoAction (mlteCommandString(txb->txn,false));
+
+    if ((((bool)editOptions&HY_CONSOLE_CAN_COPY)!=haveSelection)||
+            (((bool)editOptions&HY_CONSOLE_CAN_PASTE)!=canPaste)||
+            (((bool)editOptions&HY_CONSOLE_CAN_UNDO)!=(bool)undoAction.sLength)||
+            (((bool)editOptions&HY_CONSOLE_CAN_REDO)!=(bool)redoAction.sLength)) {
+        MenuHandle  t   = GetMenuHandle (130);
+
+        editOptions = 0;
+        if (haveSelection) {
+            editOptions |= HY_CONSOLE_CAN_COPY;
+            EnableMenuItem (t,4);
+            EnableMenuItem (t,5);
+            EnableMenuItem (t,7);
+        } else {
+            DisableMenuItem (t,4);
+            DisableMenuItem (t,5);
+            DisableMenuItem (t,7);
+        }
+
+        if (canPaste) {
+            EnableMenuItem (t,6);
+            editOptions |= HY_CONSOLE_CAN_PASTE;
+        } else {
+            DisableMenuItem (t,6);
+        }
+
+        if (undoAction.sLength) {
+            editOptions |= HY_CONSOLE_CAN_UNDO;
+            EnableMenuItem (t,1);
+        } else {
+            DisableMenuItem (t,1);
+        }
+
+        if (redoAction.sLength) {
+            editOptions |= HY_CONSOLE_CAN_REDO;
+            EnableMenuItem (t,2);
+        } else {
+            DisableMenuItem (t,2);
+        }
+    }
+}
+
+//__________________________________________________________________
+
+bool _HYConsoleWindow::_Close (Ptr data)
+{
+    return _HYPlatformWindow::_Close(data);
+}
+
+//__________________________________________________________________
+
+bool        _HYConsoleWindow::_ProcessMenuSelection (long msel)
+{
+    long        menuChoice = msel&0x0000ffff;
+
+    HiliteMenu(0);
+    InvalMenuBar();
+
+    switch (msel/0xffff) {
+    case 129: { // undo
+        switch (menuChoice) {
+        case 4:
+            SaveConsole();
+            return true;
+
+        case 7:
+            _DoPageSetup();
+            return true;
+
+        case 8:
+            _DoPrint();
+            return true;
+        }
+        break;
+    }
+    case 130: { //
+        if (menuChoice<14) { //
+            _HYTextBox * ob = (_HYTextBox*) components (0);
+            switch (menuChoice) {
+            case 1:
+                ob->_DoUndo(true);
+                break;
+            case 2:
+                ob->_DoRedo(true);
+                break;
+            case 4:
+                ob->_DoCut(true);
+                break;
+            case 5:
+                ob->_DoCopy(true);
+                break;
+            case 6:
+                ob->_DoPaste(true);
+                break;
+            case 7:
+                ob->_DoClear(false,true);
+                break;
+            case 9:
+                DoFind (true);
+                break;
+            case 10:
+                DoFind (false);
+                break;
+            case 12:
+                ob->_DoSelectAll(true);
+                break;
+            case 13:
+                ob->_DoClear(true,true);
+                break;
+            }
+            return true;
+        }
+    }
+    }
+
+    return _HYTWindow::_ProcessMenuSelection(msel);
+}
+
+//__________________________________________________________________
+
+bool _HYConsoleWindow::_ProcessOSEvent (Ptr vEvent)
+{
+    //EventRecord*  theEvent = (EventRecord*)vEvent;
+
+    return _HYTWindow::_ProcessOSEvent (vEvent);
+}
+
+//__________________________________________________________________
+void    _HYConsoleWindow::_DoPageSetup          (void)
+{
+    TXNPageSetup (((_HYTextBox*)components(0))->txn);
+}
+
+//__________________________________________________________________
+void    _HYConsoleWindow::_DoPrint          (void)
+{
+    Deactivate();
+    TXNPrint (((_HYTextBox*)components(0))->txn);
+}
+
+
+//__________________________________________________________________
+
+void _HYConsoleWindow::_PaintStatusBar(Ptr, bool force)
+{
+    _Parameter      vL;
+    checkParameter (VerbosityLevelString, vL, 0.0);
+    if (vL<-0.5 && !force) {
+        UnsignedWide curMeasure;
+        Microseconds (&curMeasure);
+        _Parameter diff = 0.000001*((curMeasure.hi-lastMeasure.hi)*4294967296.0+(curMeasure.lo-lastMeasure.lo));
+        if (diff < -vL) {
+            return;
+        }
+         lastMeasure = curMeasure;
+    }
+
+    GrafPtr saveport;
+
+    Rect    box,
+            box2,
+            box3;
+
+    static  PixPatHandle    blueFill  = GetPixPat(132),
+                            whiteFill = GetPixPat(128);
+
+
+    GWorldPtr   offScreenMap = nil;
+
+    GetPort(&saveport);
+
+    Rect wr;
+#ifdef OPAQUE_TOOLBOX_STRUCTS
+    GetWindowBounds (theWindow, kWindowGlobalPortRgn, &wr);
+    OffsetRect (&wr,-wr.left,-wr.top);
+#else
+    wr = theWindow->portRect;
+#endif
+
+    SetRect(&box,0,wr.bottom-15,wr.right - 15,wr.bottom);
+
+    if (NewGWorld(&offScreenMap,0,&box,0,GetMainDevice(),noNewDevice)!=noErr) {
+        return;
+    }
+
+    LockPixels (GetGWorldPixMap(offScreenMap));
+    box3 = box;
+
+#ifdef OPAQUE_TOOLBOX_STRUCTS
+    SetPort (offScreenMap);
+#else
+    SetPort ((GrafPort*)offScreenMap);
+#endif
+
+    box.top = 0;
+    box.bottom = 15;
+    box2 = box;
+    InsetRect(&box, -1, -1);
+    InsetRect(&box, 1, 1);
+    box.right = 30;
+    FillCRect (&box, blueFill);
+    box.left = 30;
+    box.right = box2.right;
+    FillCRect  (&box,statusBarFill);
+
+    TextMode (srcBic);
+    TextFont(kFontIDGeneva );
+    TextSize(9);
+    TextFace(bold);
+
+    MoveTo(4, box.bottom - 3);
+    DrawText(cState.sData,0,cState.sLength);
+
+    MoveTo(32,  box.bottom - 3);
+    TextMode    (srcOr);
+    TextFace    (normal);
+    DrawText    (fileName.getStr(),0,fileName.sLength);
+    box.left  = 150;
+    box.right = 190;
+    FillCRect   (&box, blueFill);
+    TextMode    (srcBic);
+    TextFace    (bold);
+
+    MoveTo(152, box.bottom-3);
+    DrawText(cTask.sData,0,cTask.sLength);
+    box.left = 190;
+    TextMode (srcOr);
+    TextFace(normal);
+    MoveTo(192, box.bottom-3);
+
+    if (inputStatus == 1) {
+        DrawText(cInput.getStr(),0,cInput.sLength);
+    } else {
+        DrawText(action.getStr(),0,action.sLength);
+    }
+
+    box.right = box2.right - 20;
+    box.left  = box.right  - 50;
+    FillCRect (&box, blueFill);
+    TextMode (srcBic);
+    MoveTo(box.left+2, box.bottom-3);
+    DrawText(timer.getStr(),0,timer.sLength);
+
+    if (percentDone >= 0 || percentDone == -HY_SL_DONE) {
+        TextMode (srcOr);
+        box.right = box.left-5;
+        box.left-=75;
+        box.top+=1;
+        box.bottom-=2;
+        FillCRect (&box,whiteFill);
+
+        ThemeTrackDrawInfo  pB;
+        pB.kind     = kThemeProgressBar;
+        pB.bounds   = box;
+        pB.min = 0;
+        pB.max = 100;
+        pB.value                    =  percentDone>=0?percentDone:100;
+        pB.attributes               = kThemeTrackHorizontal;
+        pB.enableState              = kThemeTrackActive;
+        pB.trackInfo.progress.phase = 0;
+        DrawThemeTrack (&pB,nil,nil,0);
+        TextFont(kFontIDTimes);
+        MoveTo(box.left+28, box.bottom-2);
+
+        _String pLine;
+        if (percentDone >= 0) {
+            pLine = _String(percentDone) & "%";
+        } else {
+            pLine = "DONE";
+        }
+        DrawText(pLine.getStr(),0,pLine.sLength);
+    }
+
+    box = box2;
+    box.right -= 3;
+    box.left  = box.right - 12;
+    box.top +=2;
+    box.bottom --;
+
+    CIconHandle cIcon;
+
+    if (echoFileRef) {
+        if (echoStatus == 1) {
+            cIcon = redButtonIcon;
+        } else {
+            cIcon = orangeButtonIcon;
+        }
+    } else {
+        cIcon = yellowButtonIcon;
+    }
+
+    PlotCIcon (&box,cIcon);
+
+
+    MoveTo(0, 0);
+    Line(wr.right - 15, 0);
+
+    SetPortWindowPort(theWindow);
+#ifdef OPAQUE_TOOLBOX_STRUCTS
+    CopyBits (GetPortBitMapForCopyBits(offScreenMap),GetPortBitMapForCopyBits(GetWindowPort(theWindow)), &box2, &box3, srcCopy,nil);
+    RgnHandle   dirtyRgn = NewRgn ();
+    RectRgn (dirtyRgn, &box3);
+    QDFlushPortBuffer (GetWindowPort (theWindow), nil);
+    DisposeRgn (dirtyRgn);
+#else
+    CopyBits (&(GrafPtr(offScreenMap)->portBits),&(theWindow->portBits), &box2, &box3, srcCopy,nil);
+#endif
+
+    DisposeGWorld (offScreenMap);
+
+    SetPort(saveport);
+    yieldCPUTime();
+}
+
+//EOF
\ No newline at end of file
diff --git a/src/gui/mac/WindowClasses/HYPlatformDBWindow.cpp b/src/gui/mac/WindowClasses/HYPlatformDBWindow.cpp
new file mode 100644
index 0000000..1fee9d8
--- /dev/null
+++ b/src/gui/mac/WindowClasses/HYPlatformDBWindow.cpp
@@ -0,0 +1 @@
+/*
    MacOS Portions of the DB Window class

    Sergei L. Kosakovsky Pond, Fall 2005.
*/

#include "HYDBWindow.h"

//__________________________________________________________________


bool        _HYDBWindow::_ProcessMenuSelection (long msel)
{
    long        menuChoice = msel&0x0000ffff;
    _HYTable*   table = (_HYTable*)GetObject(0);

    HiliteMenu(0);
    InvalMenuBar();

    switch (msel/0xffff) {
    case 129: { // file menu
        if (menuChoice==8) { // print
            _SimpleList columns (table->horizontalSpaces.lLength,0,1);
            table->_PrintTable(columns,(_HYTable*)GetObject(1));
            return true;
        }
    }
    }
    return _HYTWindow::_ProcessMenuSelection(msel);
}

//EOF
\ No newline at end of file
diff --git a/src/gui/mac/WindowClasses/HYPlatformDataPanel.cpp b/src/gui/mac/WindowClasses/HYPlatformDataPanel.cpp
new file mode 100644
index 0000000..a686194
--- /dev/null
+++ b/src/gui/mac/WindowClasses/HYPlatformDataPanel.cpp
@@ -0,0 +1,1100 @@
+/*
+    Mac OS Portions of the data panel class
+
+    Sergei L. Kosakovsky Pond, Spring 2000 - December 2002.
+*/
+
+#include "HYTreePanel.h"
+#include "HYDataPanel.h"
+#include "HYUtils.h"
+
+#include "likefunc.h"
+
+//__________________________________________________________________
+
+
+bool        _HYDataPanel::_ProcessMenuSelection (long msel)
+{
+    if (_HYWindow::_ProcessMenuSelection(msel)) {
+        return true;
+    }
+
+    long        menuChoice = msel&0x0000ffff;
+    MenuHandle  treeMenu;
+    _HYSequencePane* sp = (_HYSequencePane*)GetObject (0);
+    _HYSequencePane* sp2 =(_HYSequencePane*)GetObject (4);
+    _String     prompt;
+    bool        done = false;
+
+    switch (msel/0xffff) {
+    case 129: { // file menu
+        if (menuChoice==4) { // save
+            SaveDataPanel (savePath.sLength);
+            done = true;
+        } else if (menuChoice==8) { // print
+            _PrintData();
+            done = true;
+        }
+        HiliteMenu(0);
+        if (done) {
+            return true;
+        }
+        break;
+    }
+    case 130: { // edit
+        HiliteMenu(0);
+        if (menuChoice==4) { // copy
+            _CopySelectionToClipboard   ();
+        } else if (menuChoice==6) { // delete selection
+            //DeleteCurrentSelection();
+            return true;
+        } else if (menuChoice==3) { // cut selection
+            //CutSelectionToClipboard ();
+            return true;
+        } else if (menuChoice==5) { // paste selection
+            //PasteClipboardTree();
+            return true;
+        } else if (menuChoice==8) { // select all
+            sp->SelectAll(true);
+            return true;
+        } else if (menuChoice==11) { // Find
+            FindFunction();
+            return true;
+        } else if (menuChoice==12) { // Find
+            HandleSearchAndReplace();
+            return true;
+        }
+        return false;
+    }
+    case HY_DATAPANEL_MENU_ID: {
+        switch (menuChoice) {
+        case 1:
+            SelectPartition();
+            break;
+        case 2:
+            if (sp->selection.lLength) {
+                CreatePartition (sp->selection,1,true);
+            }
+            break;
+        case 3:
+            InvertSelection();
+            break;
+        case 11:
+            PartitionPropsMenu ();
+            break;
+        case 12:
+            InputPartitionString ();
+            break;
+        case 15:
+            SimulateDataSet (0,true);
+            break;
+        case 17:
+            HandleFontChange    ();
+            break;
+        }
+        HiliteMenu(0);
+        return true;
+    }
+    case HY_DATAPANEL_MENU_ID+1: {
+        switch (menuChoice) {
+        case 1:
+            BuildLikelihoodFunction();
+            break;
+        case 3:
+            OptimizeLikelihoodFunction();
+            break;
+        case 5:
+            DisplayParameterTable ();
+            break;
+        case 7:
+            OpenGeneralBSWindow ();
+            break;
+        }
+        HiliteMenu(0);
+        return true;
+    }
+    case HY_DATAPANEL_HMENU_ID: {
+        treeMenu = GetMenuHandle (HY_DATAPANEL_HMENU_ID);
+        long             newBlockSize;
+        if (menuChoice==1) {
+            newBlockSize = 9;
+        } else {
+            newBlockSize = 10;
+        }
+
+        if (sp->blockWidth!=newBlockSize) {
+            sp->blockWidth = newBlockSize;
+            sp2->blockWidth = newBlockSize;
+            sp->BuildPane();
+            sp->_MarkForUpdate();
+            sp2->BuildPane();
+            sp2->_MarkForUpdate();
+            SetItemMark(treeMenu,menuChoice==1?2:1,noMark);
+            SetItemMark(treeMenu,menuChoice,checkMark);
+            InvalMenuBar();
+        }
+        HiliteMenu(0);
+        return true;
+    }
+
+    case HY_DATAPANEL_HMENU_ID+1: {
+        treeMenu = GetMenuHandle (HY_DATAPANEL_HMENU_ID+1);
+        bool       newDisplay;
+        if (menuChoice==1) {
+            newDisplay = false;
+        } else {
+            newDisplay = true;
+        }
+
+        if (sp->showDots!=newDisplay) {
+            sp->showDots = newDisplay;
+            sp->BuildPane();
+            sp->_MarkForUpdate();
+            SetItemMark(treeMenu,menuChoice==1?2:1,noMark);
+            SetItemMark(treeMenu,menuChoice,checkMark);
+            InvalMenuBar();
+        }
+        HiliteMenu(0);
+        return true;
+    }
+
+    case HY_DATAPANEL_HMENU_ID+2: {
+        treeMenu = GetMenuHandle (HY_DATAPANEL_HMENU_ID+2);
+        if (menuChoice<=3) {
+            unsigned char newDisplay;
+            switch (menuChoice) {
+            case 1:
+                newDisplay = HY_SEQUENCE_PANE_NAMES_NONE;
+                break;
+            case 2:
+                newDisplay = HY_SEQUENCE_PANE_NAMES_SHORT;
+                break;
+            case 3:
+                newDisplay = HY_SEQUENCE_PANE_NAMES_ALL;
+
+            }
+
+            if ((sp->nameDisplayFlags&HY_SEQUENCE_PANE_NAMES_MASK)!=newDisplay) {
+                SetItemMark(treeMenu,(sp->nameDisplayFlags&HY_SEQUENCE_PANE_NAMES_MASK)+1,noMark);
+                sp->SetNameDisplayMode(newDisplay,true);
+                sp2->SetNameDisplayMode(newDisplay,true);
+                BuildThermometer();
+                BuildMarksPane();
+                SetItemMark(treeMenu,menuChoice,checkMark);
+                InvalMenuBar();
+            }
+        } else {
+            if (menuChoice==5) { // alphabetize
+                sp->AlphabetizeSpecies();
+            } else if (menuChoice==6) {
+                sp->RevertFileOrder();
+            } else if (menuChoice==7) {
+                sp->CleanUpSequenceNames();
+            }
+        }
+        HiliteMenu(0);
+        return true;
+    }
+    case HY_DATAPANEL_HMENU_ID+3: { // omitted sequences
+        RestoreOmittedSequence(menuChoice-3);
+        HiliteMenu(0);
+        return true;
+    }
+
+    case HY_DATAPANEL_HMENU_ID+4: { // status lines
+        if (AdjustStatusLine (menuChoice-1)) {
+            CheckMenuItem(GetMenuHandle (HY_DATAPANEL_HMENU_ID+4),menuChoice,true);
+        } else {
+            CheckMenuItem(GetMenuHandle (HY_DATAPANEL_HMENU_ID+4),menuChoice,false);
+        }
+        HiliteMenu(0);
+        return true;
+    }
+
+    case HY_DATAPANEL_HMENU_ID+5: { // likelihood display
+        ComputeLikelihoodFunction (menuChoice-1);
+        HiliteMenu(0);
+        return true;
+    }
+
+    case HY_DATAPANEL_HMENU_ID+6: { // simulate data set
+        SimulateDataSet (menuChoice-1);
+        HiliteMenu(0);
+        return true;
+    }
+
+    case HY_DATAPANEL_HMENU_ID+7: { // save/save as
+        SaveDataPanel (menuChoice==2);
+        HiliteMenu(0);
+        return true;
+    }
+
+    case HY_DATAPANEL_HMENU_ID+8: { // infer
+        InferTopologies (menuChoice==2);
+        _VerifyInferMenu ();
+        HiliteMenu(0);
+        return true;
+    }
+    case HY_DATAPANEL_HMENU_ID+9: { // dataProcs
+        ExecuteProcessor (menuChoice-1);
+        return true;
+    }
+
+    HiliteMenu(0);
+    InvalMenuBar();
+    }
+
+    return false;
+}
+
+//__________________________________________________________________
+
+void        _HYDataPanel::_PaintThermRect(bool update)
+{
+    navRect = ComputeNavRect();
+    _HYCanvas* theCanvas = (_HYCanvas*)GetObject (1);
+    GrafPtr savedPort;
+    GetPort(&savedPort);
+#ifdef OPAQUE_TOOLBOX_STRUCTS
+    SetPort(GetWindowPort(theWindow));
+#else
+    SetPort(theWindow);
+#endif
+    Rect r;
+    r.left      = navRect.left+theCanvas->rel.left+thermRect.left+1;
+    r.right     = navRect.right+theCanvas->rel.left+thermRect.left-1;
+    r.top       = navRect.top+theCanvas->rel.top+thermRect.top+1;
+    r.bottom    = navRect.bottom+theCanvas->rel.top+thermRect.top-1;
+
+    RGBColor    saveColor,
+                newColor = {255*256,151*256,51*256};
+    PenState ps;
+    GetPenState (&ps);
+    GetForeColor (&saveColor);
+    RGBForeColor (&newColor);
+    PenSize (2,2);
+    FrameRect (&r);
+    RGBForeColor (&saveColor);
+
+    if (update) {
+        RgnHandle   oldClip, newClip;
+        oldClip = NewRgn();
+        newClip = NewRgn();
+        RectRgn (oldClip,&r);
+        InsetRect (&r,2,2);
+        RectRgn (newClip,&r);
+        DiffRgn (oldClip,newClip,newClip);
+        GetClip (oldClip);
+        DiffRgn (oldClip,newClip,newClip);
+        SetClip (newClip);
+        _HYRect rect;
+        rect.left = componentL.lData[1];
+        rect.right = componentR.lData[1];
+        rect.top = componentT.lData[1];
+        rect.bottom = componentB.lData[1];
+        theCanvas->_Paint((char*)&rect);
+        SetClip (oldClip);
+        DisposeRgn (oldClip);
+        DisposeRgn (newClip);
+    }
+    SetPenState (&ps);
+    _PaintLFStatus ();
+    SetPort(savedPort);
+}
+
+//__________________________________________________________________
+
+void        _HYDataPanel::_PaintLFStatus(void)
+{
+    GrafPtr savedPort;
+    GetPort(&savedPort);
+#ifdef OPAQUE_TOOLBOX_STRUCTS
+    SetPort(GetWindowPort(theWindow));
+#else
+    SetPort(theWindow);
+#endif
+    if (lfID<0) {
+        _SimpleList goodP;
+
+
+        bool    paintOrange = GenerateGoodPartitions (goodP);
+
+
+        if (goodP.lLength) {
+            _PaintTheCircle (paintOrange?orangeButtonIcon:yellowButtonIcon,theWindow);
+        } else {
+            _PaintTheCircle (redButtonIcon,theWindow);
+        }
+    } else {
+        _PaintTheCircle (greenButtonIcon,theWindow);
+    }
+    SetPort(savedPort);
+}
+
+//__________________________________________________________________
+
+void        _HYDataPanel::_PrintData(void)
+{
+    _HYSequencePane* sp = (_HYSequencePane*)GetObject (0);
+
+    GrafPtr     savePort;
+#ifdef      TARGET_API_MAC_CARBON
+    PMRect prRect;
+#else
+    TPrStatus   prStatus;
+    TPPrPort    printPort;
+    OSErr       err;
+#endif
+
+#ifdef TARGET_API_MAC_CARBON
+    OSStatus theStatus;
+    Boolean isAccepted;
+
+    PMPrintSession hyPC;
+    theStatus = PMCreateSession(&hyPC);
+    if (theStatus != noErr) {
+        return;
+    }
+#endif
+
+    if (!InitPrint(hyPC)) {
+        _String errMsg ("Could not initialize printing variables.");
+        WarnError (errMsg);
+        terminateExecution = false;
+        return;
+    }
+
+    GetPort(&savePort);
+
+#ifdef TARGET_API_MAC_CARBON
+    if (gPrintSettings != kPMNoPrintSettings) {
+        theStatus = PMSessionValidatePrintSettings(hyPC,gPrintSettings, kPMDontWantBoolean);
+    } else {
+        theStatus = PMCreatePrintSettings(&gPrintSettings);
+
+        if ((theStatus == noErr) && (gPrintSettings != kPMNoPrintSettings)) {
+            theStatus = PMSessionDefaultPrintSettings(hyPC,gPrintSettings);
+        }
+    }
+
+    if (theStatus == noErr) {
+        theStatus = PMSessionPrintDialog(hyPC,gPrintSettings, gPageFormat, &isAccepted);
+
+        if (isAccepted) {
+            theStatus = PMGetAdjustedPageRect(gPageFormat, &prRect);
+            if (theStatus != noErr) {
+                return;
+            }
+
+            theStatus = PMSessionBeginDocument(hyPC,gPrintSettings, gPageFormat);
+            if (theStatus != noErr) {
+                return;
+            }
+
+            long     printW    = prRect.right-prRect.left-2,
+                     printH    = prRect.bottom-prRect.top-2;
+
+            UInt32   startPage,
+                     endPage;
+
+            PMGetFirstPage (gPrintSettings,&startPage);
+            PMGetLastPage  (gPrintSettings,&endPage);
+#else
+    PrOpen();
+    if (err=PrError()) {
+        _String errMsg ("Could not print the data set. Error Code:");
+        errMsg = errMsg & (long)err;
+        WarnError (errMsg);
+        terminateExecution = false;
+        return;
+    }
+
+    if (PrJobDialog(prRecHdl)) {
+        printPort = PrOpenDoc(prRecHdl, nil, nil);
+        SetPort((GrafPtr)printPort);
+        long     printW = (*prRecHdl)->prInfo.rPage.right-2,
+                 printH = (*prRecHdl)->prInfo.rPage.bottom-2,
+                 startPage = (*prRecHdl)->prJob.iFstPage,
+                 endPage = (*prRecHdl)->prJob.iLstPage;
+#endif
+            long
+            vOffset = sp->GetSlotHeight()*sp->speciesIndex.lLength+sp->GetSlotHeight()*3/2+1+20*(dataPartitions.lLength>0),
+            cOffset = (printW-sp->headerWidth)/sp->charWidth,
+            pageShift = printH/vOffset,
+            sC = sp->startColumn,
+            lC = sp->endColumn,
+            sR = sp->startRow,
+            lR = sp->endRow,
+            sH = sp->settings.bottom,
+            pageCount;
+
+            _HYColor c1 = sp->backColor,
+                     c2 = sp->headerColor,
+                     bc = {0,0,0};
+
+
+            sp->backColor   = (_HYColor) {
+                255,255,255
+            };
+            sp->headerColor = (_HYColor) {
+                255,255,255
+            };
+            cOffset     -= ((cOffset/sp->blockWidth)*2)/sp->charWidth;
+            cOffset     = (cOffset/sp->blockWidth)*sp->blockWidth;
+
+            pageShift   *= cOffset;
+
+            if (sp->columnStrings.lLength%pageShift==0) {
+                pageShift = sp->columnStrings.lLength / pageShift;
+            } else {
+                pageShift = sp->columnStrings.lLength / pageShift + 1;
+            }
+
+            if (endPage > pageShift) {
+                endPage = pageShift;
+            }
+
+            sp->startColumn = 0;
+            sp->endColumn = cOffset;
+            sp->startRow = 0;
+            sp->endRow = sp->speciesIndex.lLength;
+            sp->settings.bottom = vOffset+5+HY_SCROLLER_WIDTH;
+
+            for (pageCount = 1; pageCount<startPage; pageCount++) {
+#ifdef TARGET_API_MAC_CARBON
+                theStatus = PMSessionBeginPage(hyPC,gPageFormat,NULL);
+                if (theStatus != noErr) {
+                    break;
+                }
+                theStatus = PMSessionEndPage(hyPC);
+                if (theStatus != noErr) {
+                    break;
+                }
+#else
+                PrOpenPage      (printPort, nil);
+                PrClosePage     (printPort);
+#endif
+                sp->endColumn       +=  printH/vOffset * cOffset;
+                sp->startColumn     +=  printH/vOffset * cOffset;
+            }
+
+            Rect         hangover = {0,
+                                     sp->headerWidth + cOffset * sp->charWidth + (cOffset * 2)/sp->blockWidth + 1,
+                                     vOffset,
+                                     printW
+                                    },
+
+                         frame = {0,0,vOffset+1,hangover.left};
+
+            if (sp->startColumn< sp->columnStrings.lLength)
+                for (pageCount = startPage; pageCount<=endPage; pageCount++) {
+                    pageShift       = vOffset;
+#ifdef TARGET_API_MAC_CARBON
+                    theStatus = PMSessionBeginPage(hyPC,gPageFormat, NULL);
+                    if (theStatus != noErr) {
+                        break;
+                    }
+                    GrafPtr ppPort;
+                    PMSessionGetGraphicsContext (hyPC, NULL, (void**)&ppPort);
+                    SetPort (ppPort);
+#else
+                    PrOpenPage      (printPort, nil);
+#endif
+                    SetOrigin       (0,0);
+                    sp->_HYGraphicPane::SetFont     (sp->GetFont());
+                    sp->SetColor    (sp->GetColor());
+                    while (pageShift < printH) {
+                        sp->BuildPane   (false);
+                        sp->SetColor (bc);
+                        PenSize (1,1);
+                        //EraseRect (&hangover);
+                        if (dataPartitions.lLength) {
+                            _HYRect          daFrame;
+                            daFrame.top    = frame.bottom;
+                            daFrame.bottom = frame.bottom + 20;
+                            daFrame.left   = frame.left   + HY_SEQUENCE_PANE_CHAR_SPACING/2 + sp->headerWidth;
+                            daFrame.right  = daFrame.left + cOffset*sp->charWidth + 2*(cOffset/sp->blockWidth) - HY_SCROLLER_WIDTH;
+                            BuildThermometer (&daFrame);
+                        }
+                        //FrameRect (&frame);
+                        sp->startColumn  =  sp->endColumn;
+                        sp->endColumn   +=  cOffset;
+                        SetOrigin           (0,-pageShift);
+                        pageShift       +=  vOffset;
+
+                        if (sp->startColumn>=sp->columnStrings.lLength) {
+                            break;
+                        }
+                    }
+#ifdef TARGET_API_MAC_CARBON
+                    theStatus = PMSessionEndPage(hyPC);
+                    if (theStatus != noErr) {
+                        break;
+                    }
+#else
+                    PrClosePage     (printPort);
+#endif
+                }
+
+            sp->startColumn = sC;
+            sp->endColumn   = lC;
+            sp->startRow    = sR;
+            sp->endRow      = lR;
+            sp->backColor   = c1;
+            sp->headerColor = c2;
+            sp->settings.bottom = sH;
+
+
+#ifdef TARGET_API_MAC_CARBON
+            theStatus = PMSessionEndDocument(hyPC);
+            SetPort(savePort);
+            if (theStatus == noErr) {
+                if (gFlattenedFormat != NULL) {
+                    DisposeHandle(gFlattenedFormat);
+                    gFlattenedFormat = NULL;
+                }
+
+                theStatus = PMFlattenPageFormat(gPageFormat, &gFlattenedFormat);
+            }
+
+            if (theStatus == noErr) {
+                if (gFlattenedSettings != NULL) {
+                    DisposeHandle(gFlattenedSettings);
+                    gFlattenedSettings = NULL;
+                }
+
+                theStatus = PMFlattenPrintSettings(gPrintSettings, &gFlattenedSettings);
+            }
+
+            if (gPageFormat != kPMNoPageFormat) {
+                theStatus = PMRelease(gPageFormat);
+                gPageFormat = kPMNoPageFormat;
+            }
+
+            if (gPrintSettings != kPMNoPrintSettings) {
+                theStatus = PMRelease(gPrintSettings);
+                gPrintSettings = kPMNoPrintSettings;
+            }
+
+            theStatus = PMRelease(hyPC);
+
+#else
+            PrCloseDoc(printPort);
+            if (((*prRecHdl)->prJob.bJDocLoop = bSpoolLoop) && (!PrError() ) ) {
+                PrPicFile(prRecHdl, nil, nil, nil, &prStatus);
+            }
+#endif
+        }
+#ifdef TARGET_API_MAC_CARBON
+        else {
+            theStatus = PMRelease(hyPC);
+        }
+#endif
+
+#ifdef TARGET_API_MAC_CARBON
+    }
+#else
+        PrClose();
+        SetPort(savePort);
+#endif
+}
+
+//__________________________________________________________________
+
+void _HYDataPanel::_VerifyInferMenu(void)
+{
+    MenuHandle  lfMenu          = GetMenuHandle (HY_DATAPANEL_MENU_ID+1),
+                inferSubMenu = GetMenuHandle (HY_DATAPANEL_HMENU_ID+8);
+
+    _SimpleList    gp;
+
+    if (GenerateGoodPartitions(gp)) {
+        if (!inferSubMenu) {
+            inferSubMenu        = NewMenu(HY_DATAPANEL_HMENU_ID+8,"\p");
+            InsertMenu (inferSubMenu,hierMenu);
+            SetItemCmd (lfMenu,1,hMenuCmd);
+            SetItemMark(lfMenu,1,HY_DATAPANEL_HMENU_ID+8);
+            InsertMenuItem (inferSubMenu,"\pInfer Topology/L",10000);
+            InsertMenuItem (inferSubMenu,"\pInfer Topology with Constraints",10000);
+            SetMenuItemText (lfMenu,1,"\pInference...");
+        }
+    } else {
+        if (inferSubMenu) {
+            SetItemMark (lfMenu,1,noMark);
+            DeleteMenu  (HY_DATAPANEL_HMENU_ID+8);
+            DisposeMenu (inferSubMenu);
+            SetMenuItemText (lfMenu,1,"\pBuild Function");
+            SetItemCmd (lfMenu,1,'L');
+        }
+    }
+}
+//__________________________________________________________________
+
+void _HYDataPanel::_SetMenuBar(void)
+{
+    //BufferToConsole ("_HYDataPanel::_SetMenuBar\n");
+    _HYWindow::_SetMenuBar();
+
+    MenuHandle  t  = GetMenuHandle (130),
+                dM = GetMenuHandle (HY_DATAPANEL_MENU_ID);
+    _HYWindow::_SetMenuBar();
+    EnableMenuItem (t,4);
+    EnableMenuItem (t,8);
+
+    if (!dM) {
+        MenuHandle dataMenu         = NewMenu(HY_DATAPANEL_MENU_ID,"\pData"),
+                   lfMenu             = NewMenu (HY_DATAPANEL_MENU_ID+1,"\pLikelihood"),
+                   blockMenu       = NewMenu(HY_DATAPANEL_HMENU_ID,"\p"),
+                   repeatCharMenu   = NewMenu(HY_DATAPANEL_HMENU_ID+1,"\p"),
+                   nameDisplayMenu  = NewMenu(HY_DATAPANEL_HMENU_ID+2,"\p"),
+                   omittedSpecies  = NewMenu(HY_DATAPANEL_HMENU_ID+3,"\p"),
+                   additionalInfo  = NewMenu(HY_DATAPANEL_HMENU_ID+4,"\p"),
+                   lfDisplayMode   = NewMenu(HY_DATAPANEL_HMENU_ID+5,"\p"),
+                   simulateData  = NewMenu(HY_DATAPANEL_HMENU_ID+6,"\p"),
+                   saveSubMenu     = NewMenu(HY_DATAPANEL_HMENU_ID+7,"\p"),
+                   dataProcMenu     = NewMenu(HY_DATAPANEL_HMENU_ID+9,"\p");
+
+        if (!(dataMenu&&blockMenu&&repeatCharMenu&&nameDisplayMenu&&omittedSpecies&&additionalInfo)) {
+            warnError (-108);
+        }
+        InsertMenuItem (dataMenu,"\p(Partition->Selection/1",10000); // 1
+        InsertMenuItem (dataMenu,"\p(Selection->Partition/2",10000); // 2
+        InsertMenuItem (dataMenu,"\pInvert Selection/3",10000);      // 3
+        InsertMenuItem (dataMenu,"\p(-",10000);                      // 4
+        InsertMenuItem (dataMenu,"\pBlock Width",10000);             // 5
+        InsertMenuItem (dataMenu,"\pRepeating Characters",10000);    // 6
+        InsertMenuItem (dataMenu,"\pName Display",10000);            // 7
+        InsertMenuItem (dataMenu,"\pOmitted Sequences",10000);       // 8
+        InsertMenuItem (dataMenu,"\pAdditional Info",10000);         // 9
+        InsertMenuItem (dataMenu,"\p(-",10000);                      // 10
+        InsertMenuItem (dataMenu,"\p(Paritition Properties",10000);  // 11
+        InsertMenuItem (dataMenu,"\pInput Partition",10000);         // 12
+        InsertMenuItem (dataMenu,"\p(-",10000);                      // 13
+        InsertMenuItem (dataMenu,"\p(Simulation",10000);             // 14
+        InsertMenuItem (dataMenu,"\p(Ancestors",10000);              // 15
+        InsertMenuItem (dataMenu,"\p(-",10000);                      // 16
+        InsertMenuItem (dataMenu,"\pFont Options",10000);            // 17
+        InsertMenuItem (dataMenu,"\p(-",10000);                      // 18
+        InsertMenuItem (dataMenu,"\pData Processing",10000);         // 19
+
+        InsertMenuItem (blockMenu,"\p9",10000);
+        InsertMenuItem (blockMenu,"\p10",10000);
+
+
+        InsertMenuItem (lfMenu,"\pBuild Function/L",10000);
+
+        InsertMenuItem (lfMenu,"\p(Display",10000);
+        InsertMenuItem (lfMenu,"\p(Optimize/T",10000);
+        InsertMenuItem (lfMenu,"\p(-",10000);
+        InsertMenuItem (lfMenu,"\p(Show Parameters/H",10000);
+        InsertMenuItem (lfMenu,"\p(-",10000);
+        InsertMenuItem (lfMenu,"\p(General Bootstrap/B",10000);
+        InsertMenuItem (lfMenu,"\p(-",10000);
+        InsertMenuItem (lfDisplayMode,"\pLog-Lkhd Only",10000);
+        InsertMenuItem (lfDisplayMode,"\pLog-Lkhd & Parameter Values",10000);
+        InsertMenuItem (lfDisplayMode,"\pLog-Lkhd & Concise Trees",10000);
+        InsertMenuItem (lfDisplayMode,"\pParameter Listing",10000);
+        InsertMenuItem (lfDisplayMode,"\pLog-Lkhd & Complete Trees",10000);
+        InsertMenuItem (simulateData,"\pSimulate 1",10000);
+        InsertMenuItem (simulateData,"\pSimulate 1 To File",10000);
+        InsertMenuItem (simulateData,"\pSimulate Many",10000);
+        //SetItemMark    (blockMenu,2,checkMark);
+        InsertMenuItem (repeatCharMenu,"\pDisplay Actual Character",10000);
+        InsertMenuItem (repeatCharMenu,"\pDisplay '.'",10000);
+        //SetItemMark    (repeatCharMenu,1,checkMark);
+        InsertMenuItem (nameDisplayMenu,"\pNone",10000);
+        InsertMenuItem (nameDisplayMenu,"\pFirst 10 characters",10000);
+        _HYSequencePane *sp = (_HYSequencePane*)GetCellObject(2,0);
+        if (sp->shortHeaderWidth==sp->fullHeaderWidth) {
+            DisableMenuItem (nameDisplayMenu,2);
+        }
+        InsertMenuItem (nameDisplayMenu,"\pFull Names",10000);
+        InsertMenuItem (nameDisplayMenu,"\p(-",10000);
+        InsertMenuItem (nameDisplayMenu,"\pAlphabetize names",10000);
+        InsertMenuItem (nameDisplayMenu,"\pRevert to file order",10000);
+        InsertMenuItem (nameDisplayMenu,"\pClean up sequence names",10000);
+        //SetItemMark    (nameDisplayMenu,3,checkMark);
+        InsertMenuItem (omittedSpecies,"\pRestore All",10000);
+        InsertMenuItem (omittedSpecies,"\p(-",10000);
+        InsertMenuItem (additionalInfo,"\pConsensus Sequence",10000);
+        InsertMenuItem (additionalInfo,"\p(Rate Class",10000);
+        InsertMenuItem (additionalInfo,"\p(Aminoacid Translation",10000);
+        InsertMenuItem (additionalInfo,"\pReference Sequence",10000);
+        InsertMenuItem (saveSubMenu,"\pSave.../S",10000);
+        InsertMenuItem (saveSubMenu,"\pSave As...",10000);
+
+        InsertMenu (dataMenu,132);
+        InsertMenu (lfMenu,132);
+        InsertMenu (blockMenu,hierMenu);
+        InsertMenu (repeatCharMenu,hierMenu);
+        InsertMenu (nameDisplayMenu,hierMenu);
+        InsertMenu (omittedSpecies,hierMenu);
+        InsertMenu (additionalInfo,hierMenu);
+        InsertMenu (lfDisplayMode,hierMenu);
+        InsertMenu (simulateData,hierMenu);
+        InsertMenu (saveSubMenu,hierMenu);
+        InsertMenu (dataProcMenu,hierMenu);
+        SetItemCmd (lfMenu,2,hMenuCmd);
+        SetItemMark(lfMenu,2,HY_DATAPANEL_HMENU_ID+5);
+        SetItemCmd (dataMenu,5,hMenuCmd);
+        SetItemMark(dataMenu,5,HY_DATAPANEL_HMENU_ID);
+        SetItemCmd (dataMenu,6,hMenuCmd);
+        SetItemMark(dataMenu,6,HY_DATAPANEL_HMENU_ID+1);
+        SetItemCmd (dataMenu,7,hMenuCmd);
+        SetItemMark(dataMenu,7,HY_DATAPANEL_HMENU_ID+2);
+        SetItemCmd (dataMenu,8,hMenuCmd);
+        SetItemMark(dataMenu,8,HY_DATAPANEL_HMENU_ID+3);
+        SetItemCmd (dataMenu,9,hMenuCmd);
+        SetItemMark(dataMenu,9,HY_DATAPANEL_HMENU_ID+4);
+        SetItemCmd (dataMenu,14,hMenuCmd);
+        SetItemMark(dataMenu,14,HY_DATAPANEL_HMENU_ID+6);
+        SetItemCmd (dataMenu,19,hMenuCmd);
+        SetItemMark(dataMenu,19,HY_DATAPANEL_HMENU_ID+9);
+        if (omittedSeqs.lLength==0) {
+            DisableMenuItem (dataMenu,8);
+        } else {
+            _OmitSelectedSpecies(omittedSeqs);
+        }
+
+        if (dataPanelProcessors.lLength == 0) {
+            DisableMenuItem (dataMenu,19);
+        } else {
+            Str255    buffer;
+            for (long k=0; k<dataPanelProcessors.lLength; k++) {
+                _String *thisItem = (_String*)dataPanelProcessors (k),
+                         chopped = thisItem->Cut (thisItem->FindBackwards (':',0,-1)+1,-1);
+                StringToStr255  (chopped,buffer);
+                InsertMenuItem  (dataProcMenu, buffer,10000);
+            }
+        }
+
+        CheckMenuItem (additionalInfo,1,addedLines&HY_DATAPANEL_CONSENSUS);
+        CheckMenuItem (additionalInfo,2,addedLines&HY_DATAPANEL_RATECLASS);
+        CheckMenuItem (additionalInfo,3,addedLines&HY_DATAPANEL_TRANSLATION);
+        CheckMenuItem (additionalInfo,4,addedLines&HY_DATAPANEL_REFERENCE);
+        CheckMenuItem (blockMenu,(sp->blockWidth==10)?2:1,true);
+
+        if (sp->nameDisplayFlags&HY_SEQUENCE_PANE_NAMES_ALL) {
+            CheckMenuItem (nameDisplayMenu,3,true);
+        } else if (sp->nameDisplayFlags&HY_SEQUENCE_PANE_NAMES_SHORT) {
+            CheckMenuItem (nameDisplayMenu,2,true);
+        } else {
+            CheckMenuItem (nameDisplayMenu,1,true);
+        }
+        if (sp->showDots) {
+            CheckMenuItem (repeatCharMenu,2,true);
+        } else {
+            CheckMenuItem (repeatCharMenu,1,true);
+        }
+        if (dataType&HY_DATAPANEL_NUCDATA) {
+            EnableMenuItem (additionalInfo,3);
+        }
+
+        _UpdateLFMenu();
+
+        if (aquaInterfaceOn) {
+            InsertMenuItem (t,"\p(-", 9);
+            InsertMenuItem (t,"\pFind.../F", 10);
+            InsertMenuItem (t,"\pSearch and Replace...", 11);
+        } else {
+            InsertMenuItem (t,"\pFind.../F", 10);
+            InsertMenuItem (t,"\pSearch and Replace...", 11);
+            InsertMenuItem (t,"\p(-", 12);
+        }
+    }
+    t = GetMenuHandle (129);
+    SetItemCmd (t,4,hMenuCmd);
+    SetItemMark(t,4,HY_DATAPANEL_HMENU_ID+7);
+    _VerifyInferMenu    ();
+    InvalMenuBar();
+}
+
+//__________________________________________________________________
+
+void _HYDataPanel::_UpdateLFMenu (void)
+{
+    MenuHandle lfMenu = GetMenuHandle (HY_DATAPANEL_MENU_ID+1),
+               dataMenu = GetMenuHandle (HY_DATAPANEL_MENU_ID),
+               addMenu= GetMenuHandle (HY_DATAPANEL_HMENU_ID+4);
+    if (lfMenu && dataMenu && addMenu) {
+        if (lfID>=0) {
+            EnableMenuItem (lfMenu,2);
+            EnableMenuItem (lfMenu,3);
+            EnableMenuItem (lfMenu,5);
+            EnableMenuItem (lfMenu,7);
+            EnableMenuItem (dataMenu,14);
+            EnableMenuItem (dataMenu,15);
+
+            if (((_LikelihoodFunction*)likeFuncList (lfID))->GetCategoryVars().lLength) {
+                EnableMenuItem (addMenu,2);
+                return;
+            }
+        } else {
+            DisableMenuItem (lfMenu,3);
+            DisableMenuItem (lfMenu,2);
+            DisableMenuItem (lfMenu,5);
+            DisableMenuItem (lfMenu,7);
+            DisableMenuItem (dataMenu,14);
+            DisableMenuItem (dataMenu,15);
+        }
+        DisableMenuItem (addMenu,2);
+    }
+}
+
+//__________________________________________________________________
+
+void _HYDataPanel::_UpdateSelectionChoices (bool toggle)
+{
+    MenuHandle dataMenu  = GetMenuHandle (HY_DATAPANEL_MENU_ID);
+
+    if (toggle) {
+        EnableMenuItem(dataMenu,2);
+        //EnableMenuItem(dataMenu,3);
+    } else {
+        DisableMenuItem(dataMenu,2);
+        //DisableMenuItem(dataMenu,3);
+    }
+    InvalMenuBar();
+
+}
+
+//__________________________________________________________________
+
+void _HYDataPanel::_CopySelectionToClipboard (void)
+{
+    _HYSequencePane*    sp = (_HYSequencePane*)GetObject(0);
+    _String             cbStr (128L,true);
+
+    if (sp->selection.lLength) {
+        for (long m=0; m<sp->speciesIndex.lLength; m++) {
+            long idx = sp->speciesIndex.lData[m];
+            for (long k=0; k<sp->selection.lLength; k++) {
+                cbStr << ((_String*)(sp->columnStrings(sp->selection.lData[k])))->sData[idx];
+                if (k&&((k+1)%sp->blockWidth==0)) {
+                    cbStr << ' ';
+                }
+            }
+            cbStr << '\r';
+        }
+    } else if (sp->vselection.lLength)
+        for (long m=0; m<sp->vselection.lLength; m++) {
+            cbStr << (_String*)(sp->rowHeaders(sp->speciesIndex(sp->vselection.lData[m])));
+            cbStr << '\r';
+        }
+
+    cbStr.Finalize();
+
+    if (cbStr.sLength) {
+        PlaceStringInClipboard (cbStr,nil);
+    }
+}
+
+//__________________________________________________________________
+
+void _HYDataPanel::_OmitSelectedSpecies (_SimpleList& idx)
+{
+    MenuHandle dataMenu = GetMenuHandle (HY_DATAPANEL_MENU_ID),
+               omittedSpecies = GetMenuHandle (HY_DATAPANEL_HMENU_ID+3);
+    if (omittedSpecies) {
+        _HYSequencePane*    sp = (_HYSequencePane*)GetObject(0);
+
+        for (long k=0; k<idx.lLength; k++) {
+            Str255   buffer;
+            _String* thisSpec = (_String*)sp->rowHeaders(idx.lData[k]);
+            StringToStr255 (*thisSpec, buffer);
+            InsertMenuItem (omittedSpecies,buffer,10000);
+        }
+
+        EnableMenuItem (dataMenu,8);
+    }
+}
+
+//__________________________________________________________________
+
+void _HYDataPanel::_RestoreOmittedSequence (long index)
+{
+    MenuHandle dataMenu = GetMenuHandle (HY_DATAPANEL_MENU_ID),
+               omittedSpecies = GetMenuHandle (HY_DATAPANEL_HMENU_ID+3);
+
+    if (index>=0) {
+        DeleteMenuItem (omittedSpecies,index+3);
+        if (CountMenuItems(omittedSpecies)==2) {
+            DisableMenuItem (dataMenu,8);
+        }
+    } else {
+        for (long k=0; k< omittedSeqs.lLength; k++) {
+            DeleteMenuItem (omittedSpecies,3);
+        }
+        DisableMenuItem (dataMenu,8);
+    }
+}
+
+//__________________________________________________________________
+
+void _HYDataPanel::_UpdatePartitionOperations (_SimpleList* sl)
+{
+    MenuHandle dataMenu = GetMenuHandle (HY_DATAPANEL_MENU_ID);
+
+    if (sl->lData[0]) {
+        EnableMenuItem (dataMenu,1);
+        EnableMenuItem (dataMenu,11);
+    } else {
+        DisableMenuItem(dataMenu,1);
+        DisableMenuItem(dataMenu,11);
+    }
+
+    InvalMenuBar();
+}
+
+//__________________________________________________________________
+
+void _HYDataPanel::_UnsetMenuBar(void)
+{
+    //BufferToConsole ("_HYDataPanel::_UnsetMenuBar\n");
+
+    MenuHandle treeMenu         = GetMenuHandle (HY_DATAPANEL_MENU_ID),
+               lfMenu             = GetMenuHandle (HY_DATAPANEL_MENU_ID+1),
+               blockMenu        = GetMenuHandle (HY_DATAPANEL_HMENU_ID),
+               repeatCharMenu   = GetMenuHandle (HY_DATAPANEL_HMENU_ID+1),
+               nameDisplayMenu  = GetMenuHandle (HY_DATAPANEL_HMENU_ID+2),
+               omittedSequences = GetMenuHandle (HY_DATAPANEL_HMENU_ID+3),
+               additionalInfo    = GetMenuHandle (HY_DATAPANEL_HMENU_ID+4),
+               lfDisplayOptions = GetMenuHandle (HY_DATAPANEL_HMENU_ID+5),
+               simulateData  = GetMenuHandle (HY_DATAPANEL_HMENU_ID+6),
+               saveSubMenu     = GetMenuHandle (HY_DATAPANEL_HMENU_ID+7),
+               inferSubMenu      = GetMenuHandle (HY_DATAPANEL_HMENU_ID+8),
+               dataPanelProc    = GetMenuHandle (HY_DATAPANEL_HMENU_ID+9),
+               fMenu            = GetMenuHandle (129);
+
+    DeleteMenu (HY_DATAPANEL_MENU_ID);
+    DeleteMenu (HY_DATAPANEL_MENU_ID+1);
+    DeleteMenu (HY_DATAPANEL_HMENU_ID);
+    DeleteMenu (HY_DATAPANEL_HMENU_ID+1);
+    DeleteMenu (HY_DATAPANEL_HMENU_ID+2);
+    DeleteMenu (HY_DATAPANEL_HMENU_ID+3);
+    DeleteMenu (HY_DATAPANEL_HMENU_ID+4);
+    DeleteMenu (HY_DATAPANEL_HMENU_ID+5);
+    DeleteMenu (HY_DATAPANEL_HMENU_ID+6);
+    DeleteMenu (HY_DATAPANEL_HMENU_ID+7);
+    DeleteMenu (HY_DATAPANEL_HMENU_ID+9);
+    DisposeMenu (treeMenu);
+    DisposeMenu (lfMenu);
+    DisposeMenu (blockMenu);
+    DisposeMenu (repeatCharMenu);
+    DisposeMenu (nameDisplayMenu);
+    DisposeMenu (omittedSequences);
+    DisposeMenu (additionalInfo);
+    DisposeMenu (lfDisplayOptions);
+    DisposeMenu (simulateData);
+    DisposeMenu (saveSubMenu);
+    DisposeMenu (dataPanelProc);
+    if (inferSubMenu) {
+        DeleteMenu (HY_DATAPANEL_HMENU_ID+8);
+        DisposeMenu (inferSubMenu);
+    }
+
+    SetItemCmd (fMenu,4,'S');
+    SetItemMark(fMenu,4,noMark);
+
+    fMenu = GetMenuHandle (130);
+
+    if (!aquaInterfaceOn) {
+        DeleteMenuItem (fMenu,13);
+    }
+
+    DeleteMenuItem (fMenu,12);
+    DeleteMenuItem (fMenu,11);
+
+    if (aquaInterfaceOn) {
+        DeleteMenuItem (fMenu,10);
+    }
+
+
+    _HYWindow::_UnsetMenuBar();
+}
+
+//__________________________________________________________________
+bool _HYDataPanel::_ProcessOSEvent (Ptr vEvent)
+{
+    EventRecord* theEvent = (EventRecord*)vEvent;
+    static  UInt32  lastClick = 0;
+    static  int     lastH = 0, lastV = 0;
+    if (!_HYTWindow::_ProcessOSEvent (vEvent)) {
+        if (theEvent->what==mouseDown) {
+            Point localClick = theEvent->where;
+            GrafPtr savedPort;
+            GetPort(&savedPort);
+#ifdef OPAQUE_TOOLBOX_STRUCTS
+            SetPort(GetWindowPort(theWindow));
+#else
+            SetPort(theWindow);
+#endif
+            GlobalToLocal (&localClick);
+            bool    dblClick = (theEvent->when-lastClick<GetDblTime())&&(abs(localClick.h-lastH)<5)&&(abs(localClick.v-lastV)<5);
+
+            lastClick = theEvent->when;
+            lastH = localClick.h;
+            lastV = localClick.v;
+            int   c = FindClickedCell(localClick.h,localClick.v),ch,cv;
+            if (c<0) {
+                return false;
+            }
+
+            if (c==1) { // navBar
+                ch = localClick.h-componentL.lData[1]-thermRect.left;
+                cv = localClick.v-componentT.lData[1]-thermRect.top;
+                if (dblClick) {
+                    NavBarDblClick (ch);
+                    return true;
+                }
+                if (navRect.Contains(ch,cv)) {
+                    Point   oldPt, newPt,deltaPt;
+                    deltaPt.h = (navRect.right+navRect.left)/2-ch;
+                    deltaPt.v = (navRect.top+navRect.bottom)/2-cv;
+                    oldPt=localClick;
+                    if (StillDown()) {
+                        while (WaitMouseUp()) {
+                            GetMouse( &newPt);
+                            //if ( DeltaPoint(oldPt, newPt) )
+                            if ( oldPt.h!=newPt.h ) {
+                                oldPt=newPt;
+                                ch = newPt.h-componentL.lData[1]+deltaPt.h;
+                                cv = newPt.v-componentT.lData[1]+deltaPt.v;
+                                ch-=thermRect.left;
+                                cv-=thermRect.top;
+                                forceUpdateForScrolling = true;
+                                SetNavRectCenter (ch,cv);
+                                forceUpdateForScrolling = false;
+                            }
+                        }
+                    }
+                } else {
+                    SetNavRectCenter (ch,cv);
+                }
+                return true;
+            } else if ((c==4)&&(theEvent->modifiers&controlKey)) {
+                _HYSequencePane* sp2 = (_HYSequencePane*)components (4);
+                sp2->ProcessContextualPopUp (localClick.h,localClick.v);
+                return true;
+            }
+        } else if ((theEvent->what==keyDown) || (theEvent->what==autoKey)) {
+            unsigned char keyCode = (theEvent->message&keyCodeMask)>>8;
+            if ((keyCode==0x7B)||(keyCode==0x7C)) { // left/right arrow
+                _HYSequencePane* sp = (_HYSequencePane*) GetObject (0);
+                if ((keyCode==0x7B)&&(sp->startColumn)) {
+                    sp->HScrollPane (-1);
+                } else if ((keyCode==0x7C)&&(sp->endColumn<sp->columnStrings.lLength)) {
+                    sp->HScrollPane (1);
+                }
+                return true;
+            }
+        }
+    } else {
+        return true;
+    }
+    return false;
+}
+
+
+
+//EOF
\ No newline at end of file
diff --git a/src/gui/mac/WindowClasses/HYPlatformGWindow.cpp b/src/gui/mac/WindowClasses/HYPlatformGWindow.cpp
new file mode 100644
index 0000000..1521f06
--- /dev/null
+++ b/src/gui/mac/WindowClasses/HYPlatformGWindow.cpp
@@ -0,0 +1 @@
+/*
    Mac OS Portions of the graphics window class

    Sergei L. Kosakovsky Pond, Spring 2000 - December 2002.
*/

#include "HYGWindow.h"

#include "QuickTimeComponents.h"
#include "ImageCompression.h"
#include "Scrap.h"

#include "errorfns.h"


//__________________________________________________________________

void    _HYGWindow::_Paint (Ptr )
{
    GrafPtr savedPort;
    GetPort(&savedPort);
#ifdef OPAQUE_TOOLBOX_STRUCTS
    SetPort(GetWindowPort(theWindow));
#else
    SetPort(theWindow);
#endif
    Rect srcRect,
#ifdef OPAQUE_TOOLBOX_STRUCTS
         destRect;
    GetWindowBounds (theWindow,kWindowGlobalPortRgn,&destRect);
    OffsetRect (&destRect,-destRect.left,-destRect.top);
#else
         destRect = theWindow->portRect;
#endif
    destRect.right-=15;
    destRect.bottom-=15;
    int a,b,c,d;
    _VisibleContents (a,b,c,d);
    srcRect.top=a;
    srcRect.left=b;
    srcRect.bottom=c;
    srcRect.right=d;
    LockPixels (GetGWorldPixMap(thePane));
#ifdef OPAQUE_TOOLBOX_STRUCTS
    CopyBits (GetPortBitMapForCopyBits(thePane),GetPortBitMapForCopyBits(GetWindowPort(theWindow)),&srcRect,&destRect,srcCopy,(RgnHandle)nil);
#else
    CopyBits ((BitMap*)*GetGWorldPixMap(thePane),&theWindow->portBits,&srcRect,&destRect,srcCopy,(RgnHandle)nil);
#endif
    UnlockPixels (GetGWorldPixMap(thePane));
    DrawGrowIcon (theWindow);
    ShowControl (hScroll);
    ShowControl (vScroll);
    DrawControls(theWindow);
    SetPort (savedPort);
}

//__________________________________________________________________

void    _HYGWindow::_Update (Ptr )
{
    Rect srcRect,
#ifdef OPAQUE_TOOLBOX_STRUCTS
         destRect;
    GetWindowBounds (theWindow,kWindowGlobalPortRgn,&destRect);
    OffsetRect (&destRect,-destRect.left,-destRect.top);
#else
         destRect = theWindow->portRect;
#endif
    destRect.right-=15;
    destRect.bottom-=15;
    GrafPtr savedPort;
    GetPort(&savedPort);
#ifdef OPAQUE_TOOLBOX_STRUCTS
    SetPort(GetWindowPort(theWindow));
    InvalWindowRect(theWindow,&destRect);
#else
    SetPort(theWindow);
    InvalRect(&theWindow->portRect);
#endif
    BeginUpdate(theWindow);
    int     li, ri, ti, bi;
    _VisibleContents (ti,li,bi,ri);
    srcRect.right = ri;
    srcRect.left = li;
    srcRect.top = ti;
    srcRect.bottom = bi;
    LockPixels (GetGWorldPixMap(thePane));
#ifdef OPAQUE_TOOLBOX_STRUCTS
    CopyBits (GetPortBitMapForCopyBits(thePane),GetPortBitMapForCopyBits(GetWindowPort(theWindow)),&srcRect,&destRect,srcCopy,(RgnHandle)nil);
#else
    CopyBits (&(GrafPtr(thePane)->portBits),&(theWindow->portBits),&srcRect,&destRect,srcCopy,(RgnHandle)nil);
#endif
    UnlockPixels (GetGWorldPixMap(thePane));
    DrawGrowIcon (theWindow);
    DrawControls(theWindow);
    EndUpdate(theWindow);
    SetPort (savedPort);
}


//__________________________________________________________________


bool        _HYGWindow::_ProcessMenuSelection (long msel)
{
    if (_HYWindow::_ProcessMenuSelection(msel)) {
        return true;
    }

    long        menuChoice = msel&0x0000ffff;
    bool        done = false;

    switch (msel/0xffff) {
    case 129: { // file menu
        if (menuChoice==4) { // save
            _SaveGWindow ();
            done = true;
        } else if (menuChoice==8) { // print
            _PrintGWindow();
            done = true;
        }
        break;
    }
    case 130: {
        if (menuChoice == 4) {
            done = true;
            _CopyToClipboard();
            break;
        }
    }
    }

    HiliteMenu(0);
    InvalMenuBar();

    return done;
}


//__________________________________________________________________

void        _HYGWindow::_SaveGWindow (void)
{
    _SavePicture(GetTitle());
}

//__________________________________________________________________

void        _HYGWindow::_PrintGWindow (void)
{
    GrafPtr     savePort;
#ifdef      TARGET_API_MAC_CARBON
    PMRect prRect;
#else
    TPrStatus   prStatus;
    TPPrPort    printPort;
    OSErr       err;
#endif

#ifdef TARGET_API_MAC_CARBON
    OSStatus theStatus;
    Boolean isAccepted;

    PMPrintSession hyPC;
    theStatus = PMCreateSession(&hyPC);
    if (theStatus != noErr) {
        return;
    }
#endif

    if (!InitPrint(hyPC)) {
        _String errMsg ("Could not initialize printing variables.");
        WarnError (errMsg);
        terminateExecution = false;
        return;
    }

    GetPort(&savePort);

#ifdef TARGET_API_MAC_CARBON
    if (gPrintSettings != kPMNoPrintSettings) {
        theStatus = PMSessionValidatePrintSettings(hyPC,gPrintSettings, kPMDontWantBoolean);
    } else {
        theStatus = PMCreatePrintSettings(&gPrintSettings);

        if ((theStatus == noErr) && (gPrintSettings != kPMNoPrintSettings)) {
            theStatus = PMSessionDefaultPrintSettings(hyPC,gPrintSettings);
        }
    }

    if (theStatus == noErr) {
        theStatus = PMSessionPrintDialog(hyPC,gPrintSettings, gPageFormat, &isAccepted);

        if (isAccepted) {
            theStatus = PMGetAdjustedPageRect(gPageFormat, &prRect);
            if (theStatus != noErr) {
                return;
            }

            theStatus = PMSessionBeginDocument(hyPC,gPrintSettings, gPageFormat);
            if (theStatus != noErr) {
                return;
            }

            long     printW    = prRect.right-prRect.left-2,
                     printH    = prRect.bottom-prRect.top-2;

            UInt32   startPage,
                     endPage;

            PMGetFirstPage (gPrintSettings,&startPage);
            PMGetLastPage  (gPrintSettings,&endPage);
#else
    PrOpen();
    if (err=PrError()) {
        _String errMsg ("Could not print the picture. Error Code:");
        errMsg = errMsg & (long)err;
        WarnError (errMsg);
        terminateExecution = false;
        return;
    }

    if (PrJobDialog(prRecHdl)) {
        printPort = PrOpenDoc(prRecHdl, nil, nil);
        SetPort((GrafPtr)printPort);
        long     printW = (*prRecHdl)->prInfo.rPage.right-2,
                 printH = (*prRecHdl)->prInfo.rPage.bottom-2,
                 startPage = (*prRecHdl)->prJob.iFstPage,
                 endPage = (*prRecHdl)->prJob.iLstPage;
#endif
#ifdef TARGET_API_MAC_CARBON
            theStatus = PMSessionBeginPage(hyPC,gPageFormat, NULL);
            if (theStatus != noErr) {
                return;
            }
#else
            PrOpenPage      (printPort, nil);
#endif

            Rect    dest,
                    src = {0,0,h,w};

            if (w<printW) {
                dest.left = (printW-w)/2;
                dest.right = dest.left+w;
            } else {
                dest.left = 0;
                dest.right = printW;
            }
            if (h<printH) {
                dest.top = (printH-h)/2;
                dest.bottom = dest.left+h;
            } else {
                dest.top = 0;
                dest.bottom = printH;
            }

            LockPixels (GetGWorldPixMap(thePane));
#ifdef OPAQUE_TOOLBOX_STRUCTS
            GrafPtr         prPortPtr;
            PMSessionGetGraphicsContext (hyPC, NULL, (void**)&prPortPtr);
            CopyBits (GetPortBitMapForCopyBits(thePane),GetPortBitMapForCopyBits(prPortPtr),&src,&dest,srcCopy,(RgnHandle)nil);
#else
            CopyBits (&(GrafPtr(thePane)->portBits),&(printPort->gPort.portBits),&src,&dest,srcCopy,(RgnHandle)nil);
#endif
            UnlockPixels (GetGWorldPixMap(thePane));

#ifdef TARGET_API_MAC_CARBON
            theStatus = PMSessionEndPage(hyPC);
            if (theStatus != noErr) {
                return;
            }
#else
            PrClosePage     (printPort);
#endif


#ifdef TARGET_API_MAC_CARBON
            theStatus = PMSessionEndDocument(hyPC);
            SetPort(savePort);
            if (theStatus == noErr) {
                if (gFlattenedFormat != NULL) {
                    DisposeHandle(gFlattenedFormat);
                    gFlattenedFormat = NULL;
                }

                theStatus = PMFlattenPageFormat(gPageFormat, &gFlattenedFormat);
            }

            if (theStatus == noErr) {
                if (gFlattenedSettings != NULL) {
                    DisposeHandle(gFlattenedSettings);
                    gFlattenedSettings = NULL;
                }

                theStatus = PMFlattenPrintSettings(gPrintSettings, &gFlattenedSettings);
            }

            if (gPageFormat != kPMNoPageFormat) {
                theStatus = PMRelease(gPageFormat);
                gPageFormat = kPMNoPageFormat;
            }

            if (gPrintSettings != kPMNoPrintSettings) {
                theStatus = PMRelease(gPrintSettings);
                gPrintSettings = kPMNoPrintSettings;
            }

            theStatus = PMRelease(hyPC);

#else
            PrCloseDoc(printPort);
            if (((*prRecHdl)->prJob.bJDocLoop = bSpoolLoop) && (!PrError() ) ) {
                PrPicFile(prRecHdl, nil, nil, nil, &prStatus);
            }
#endif
        }
#ifdef TARGET_API_MAC_CARBON
        else {
            theStatus = PMRelease(hyPC);
        }
#endif

#ifdef TARGET_API_MAC_CARBON
    }
#else
        PrClose();
        SetPort(savePort);
#endif
}

//__________________________________________________________________

void _HYGWindow::_SetMenuBar(void)
{
    _HYWindow::_SetMenuBar();
    MenuHandle  t = GetMenuHandle (130);
    EnableMenuItem (t,4);
    InvalMenuBar();
}

//__________________________________________________________________

void _HYGWindow::_UnsetMenuBar(void)
{
    MenuHandle  t = GetMenuHandle (130);
    DisableMenuItem (t,4);
    _HYWindow::_UnsetMenuBar();
}
//EOF
\ No newline at end of file
diff --git a/src/gui/mac/WindowClasses/HYPlatformModelWindow.cpp b/src/gui/mac/WindowClasses/HYPlatformModelWindow.cpp
new file mode 100644
index 0000000..1c511e2
--- /dev/null
+++ b/src/gui/mac/WindowClasses/HYPlatformModelWindow.cpp
@@ -0,0 +1 @@
+/*
    Mac OS Portions of the model window class

    Sergei L. Kosakovsky Pond, Spring 2000 - December 2002.
*/

#include "HYModelWindow.h"
#include "HYParameterTable.h"
#include "HYUtils.h"

#include "Scrap.h"


//__________________________________________________________________

void _HYModelWindow::_UnsetMenuBar(void)
{
    MenuHandle lfMenu   = GetMenuHandle (HY_MODEL_WINDOW_MENU_ID),
               saveMenu = GetMenuHandle (HY_PARAMETER_TABLE_HMENU_ID+1),
               rateMenu = GetMenuHandle (HY_PARAMETER_TABLE_HMENU_ID+2),
               fMenu   = GetMenuHandle (129);

    DeleteMenu (HY_MODEL_WINDOW_MENU_ID);
    DeleteMenu (HY_PARAMETER_TABLE_HMENU_ID+1);
    DeleteMenu (HY_PARAMETER_TABLE_HMENU_ID+2);
    DisposeMenu (lfMenu);
    DisposeMenu (saveMenu);
    DisposeMenu (rateMenu);
    SetItemCmd (fMenu,4,'S');
    _HYWindow::_UnsetMenuBar();
}

//__________________________________________________________________


bool        _HYModelWindow::_ProcessMenuSelection (long msel)
{
    long        menuChoice = msel&0x0000ffff;
    MenuHandle  tableMenu;

    HiliteMenu(0);
    InvalMenuBar();

    switch (msel/0xffff) {
    case 129: { // file menu
        if (menuChoice==8) { // print
            _HYTable* t = (_HYTable*)GetCellObject (MODEL_MATRIX_ROW,4);
            t->_PrintTable((_HYTable*)GetCellObject (MODEL_MATRIX_ROW-1,4));
            return true;
        }
        break;
    }
    case 130: { // edit
        if (menuChoice==4) { // copy
            DoCopyCell ();
            return true;
        }
        if (menuChoice==5) { // paste
            DoPasteToCells();
            return true;
        }
        if (menuChoice==8) { // select all
            DoSelectAll();
            return true;
        }
        break;
    }
    case HY_MODEL_WINDOW_MENU_ID: { // model menu
        if (menuChoice==1) { // edit name
            DoEditModelName ();
            return true;
        }
        break;
    }
    case HY_PARAMETER_TABLE_HMENU_ID+1: { // save menu
        DoSave (menuChoice-2);
        return true;
    }
    case HY_PARAMETER_TABLE_HMENU_ID+2: { // rate menu
        if (menuChoice-1!=rateChoice) {
            tableMenu = GetMenuHandle (HY_PARAMETER_TABLE_HMENU_ID+2);
            SetItemMark     (tableMenu,rateChoice+1,noMark);
            rateChoice = menuChoice-1;
            SetItemMark     (tableMenu,rateChoice+1,checkMark);
            taint = true;
        }
        return true;
    }
    }

    if (_HYTWindow::_ProcessMenuSelection(msel)) {
        return true;
    }

    return false;
}

//__________________________________________________________________

void _HYModelWindow::_UpdateEditMenu (bool c, bool p)
{
    MenuHandle  t = GetMenuHandle (130);
    if (c) {
        EnableMenuItem (t,4);
    } else {
        DisableMenuItem (t,4);
    }
    if (p) {
        EnableMenuItem (t,5);
    } else {
        DisableMenuItem (t,5);
    }
    InvalMenuBar();
}

//__________________________________________________________________

bool _HYModelWindow::_CheckClipboard (void)
{
    Handle scrapHandle = NewHandle (0);
    clipboardString = empty;
    long   rc;

#ifdef TARGET_API_MAC_CARBON
    ScrapRef theScrapRef;
    if (GetCurrentScrap(&theScrapRef) != noErr) {
        return false;
    }
    if (GetScrapFlavorSize(theScrapRef, 'TEXT', &rc) != noErr) {
        return false;
    }
#else
    long    scrapOffset;
    rc = GetScrap( scrapHandle, 'TEXT', &scrapOffset );
#endif
    if ( rc >= 0 ) {
        SetHandleSize( scrapHandle, rc+1 );
        HLock  (scrapHandle);
#ifdef TARGET_API_MAC_CARBON
        long err = GetScrapFlavorData(theScrapRef, 'TEXT', &rc, *scrapHandle);
#endif
        (*scrapHandle)[rc] = 0;
        if (err == noErr) {
            _String cText ((char*)*scrapHandle);
            skipWarningMessages = true;
            _Formula f (cText,nil,false);
            skipWarningMessages = false;
            if (f.GetList().lLength) {
                clipboardString = cText;
                SyncEditBox ();
            }
        }
        HUnlock (scrapHandle);
    }

    DisposeHandle (scrapHandle);
    return clipboardString.sLength;
}

//__________________________________________________________________

void _HYModelWindow::_SetClipboard (void)
{
    if (clipboardString.sLength) {
#ifdef TARGET_API_MAC_CARBON
        ClearCurrentScrap();
        ScrapRef         theScrapRef;
        GetCurrentScrap(&theScrapRef);
        PutScrapFlavor(theScrapRef, 'TEXT', kScrapFlavorMaskNone,clipboardString.sLength+1,clipboardString.sData);
#else
        ZeroScrap();
        PutScrap (clipboardString.sLength+1,'TEXT',clipboardString.sData);
#endif
    }
}

//__________________________________________________________________

void _HYModelWindow::_SetMenuBar(void)
{
    _HYWindow::_SetMenuBar();
    MenuHandle  t = GetMenuHandle (130);
    EnableMenuItem (t,4);
    EnableMenuItem (t,8);
    MenuHandle lfMenu = GetMenuHandle (HY_MODEL_WINDOW_MENU_ID);
    if (!lfMenu) {
        lfMenu = NewMenu(HY_MODEL_WINDOW_MENU_ID,"\pModel");
        if (!lfMenu) {
            warnError (-108);
        }

        MenuHandle saveMenu = NewMenu(HY_PARAMETER_TABLE_HMENU_ID+1,"\pSave"),
                   rateMenu = NewMenu(HY_PARAMETER_TABLE_HMENU_ID+2,"\pRate Variation");

        InsertMenu      (rateMenu,hierMenu);
        InsertMenuItem  (lfMenu,"\pModel Name",10000);
        InsertMenuItem  (lfMenu,"\pRate Variation",10000);
        InsertMenuItem  (saveMenu,"\pSave/S",10000);
        InsertMenuItem  (saveMenu,"\pSave As..",10000);
        InsertMenu      (saveMenu,hierMenu);
        SetItemCmd      (lfMenu,2,hMenuCmd);
        SetItemMark     (lfMenu,2,HY_PARAMETER_TABLE_HMENU_ID+2);

        ListToPopUpMenu (rateOptions, rateMenu);

        SetItemMark (rateMenu,rateChoice+1,checkMark);
        InsertMenu (lfMenu,132);

        t = GetMenuHandle (129);
        SetItemCmd (t,4,hMenuCmd);
        SetItemMark(t,4,HY_PARAMETER_TABLE_HMENU_ID+1);
    }
    InvalMenuBar();
}


//EOF
\ No newline at end of file
diff --git a/src/gui/mac/WindowClasses/HYPlatformPWindow.cpp b/src/gui/mac/WindowClasses/HYPlatformPWindow.cpp
new file mode 100644
index 0000000..425fd56
--- /dev/null
+++ b/src/gui/mac/WindowClasses/HYPlatformPWindow.cpp
@@ -0,0 +1 @@
+/*
    Mac OS Portions of the picture window class

    Sergei L. Kosakovsky Pond, Spring 2000 - December 2002.
*/

#include "HYGWindow.h"

#include "QuickTimeComponents.h"
#include "ImageCompression.h"
#include "Scrap.h"

#include "errorfns.h"

#define  HY_PWINDOW_MENU_ID 7333
//__________________________________________________________________
// _HYPlatformPWindow
//__________________________________________________________________

_HYPlatformPWindow::_HYPlatformPWindow          (void)
{
    savedPic = nil;
    savedClip = nil;
}

//__________________________________________________________________

_HYPlatformPWindow::~_HYPlatformPWindow         (void)
{
    if (savedPic) {
        KillPicture (savedPic);
    }
    if (savedClip) {
        DisposeRgn (savedClip);
    }
}

//__________________________________________________________________

void    _HYPlatformPWindow::_StartPicture   (void)
{
    _HYPWindow*     theParent = (_HYPWindow*)    this;
    Rect            picDim = {0,0,0,0};
    picDim.right  = theParent->w;
    picDim.bottom = theParent->h;

    if (savedPic) {
        KillPicture (savedPic);
    }

    if (savedClip) {
        DisposeRgn (savedClip);
    }

    savedClip = NewRgn ();
    GetClip      (savedClip);
    ClipRect     (&picDim);
    OpenCPicParams pp;
    pp.srcRect = picDim;
    pp.hRes = pp.vRes = 75;
    pp.version = -2;
    checkPointer (savedPic = OpenPicture (&picDim));
}

//__________________________________________________________________

void    _HYPlatformPWindow::_EndPicture     (void)
{
    if (savedPic) {
        ClosePicture ();
        _HYPWindow*     theParent = (_HYPWindow*)    this;
        Rect            picDim = {0,0,0,0};
        picDim.right  = theParent->w;
        picDim.bottom = theParent->h;
        DrawPicture  (savedPic,&picDim);
    }
    if (savedClip) {
        SetClip (savedClip);
        DisposeRgn (savedClip);
        savedClip = nil;
    }
}

//__________________________________________________________________

void    _HYPlatformPWindow::_DrawPicture    (_HYRect r)
{
    Rect R = HYRect2Rect (r);
    if (savedPic) {
        DrawPicture (savedPic,&R);
    }
}

//__________________________________________________________________
// _HYPWindow
//__________________________________________________________________

void        _HYPWindow::_PrintPWindow(void)
{
    GrafPtr     savePort;
#ifdef      TARGET_API_MAC_CARBON
    PMRect prRect;
#else
    TPrStatus   prStatus;
    TPPrPort    printPort;
    OSErr       err;
#endif

#ifdef TARGET_API_MAC_CARBON
    OSStatus theStatus;
    Boolean isAccepted;

    PMPrintSession hyPC;
    theStatus = PMCreateSession(&hyPC);
    if (theStatus != noErr) {
        return;
    }
#endif

    if (!InitPrint(hyPC)) {
        _String errMsg ("Could not initialize printing variables.");
        WarnError (errMsg);
        terminateExecution = false;
        return;
    }

    GetPort(&savePort);

#ifdef TARGET_API_MAC_CARBON
    if (gPrintSettings != kPMNoPrintSettings) {
        theStatus = PMSessionValidatePrintSettings(hyPC,gPrintSettings, kPMDontWantBoolean);
    } else {
        theStatus = PMCreatePrintSettings(&gPrintSettings);

        if ((theStatus == noErr) && (gPrintSettings != kPMNoPrintSettings)) {
            theStatus = PMSessionDefaultPrintSettings(hyPC,gPrintSettings);
        }
    }

    if (theStatus == noErr) {
        theStatus = PMSessionPrintDialog(hyPC,gPrintSettings, gPageFormat, &isAccepted);

        if (isAccepted) {
            theStatus = PMGetAdjustedPageRect(gPageFormat, &prRect);
            if (theStatus != noErr) {
                return;
            }

            theStatus = PMSessionBeginDocument(hyPC,gPrintSettings, gPageFormat);
            if (theStatus != noErr) {
                return;
            }

            long     printW    = prRect.right-prRect.left-2,
                     printH    = prRect.bottom-prRect.top-2;

            UInt32   startPage,
                     endPage;

            PMGetFirstPage (gPrintSettings,&startPage);
            PMGetLastPage  (gPrintSettings,&endPage);
#else
    PrOpen();
    if (err=PrError()) {
        _String errMsg ("Could not print the picture. Error Code:");
        errMsg = errMsg & (long)err;
        WarnError (errMsg);
        terminateExecution = false;
        return;
    }

    if (PrJobDialog(prRecHdl)) {
        printPort = PrOpenDoc(prRecHdl, nil, nil);
        SetPort((GrafPtr)printPort);
        long     printW = (*prRecHdl)->prInfo.rPage.right-2,
                 printH = (*prRecHdl)->prInfo.rPage.bottom-2,
                 startPage = (*prRecHdl)->prJob.iFstPage,
                 endPage = (*prRecHdl)->prJob.iLstPage;
#endif
#ifdef TARGET_API_MAC_CARBON
            theStatus = PMSessionBeginPage(hyPC,gPageFormat, NULL);
            if (theStatus != noErr) {
                return;
            }
            GrafPtr ppPort;
            PMSessionGetGraphicsContext (hyPC, NULL, (void**)&ppPort);
            SetPort (ppPort);
#else
            PrOpenPage      (printPort, nil);
#endif

            _Parameter sx = 1., sy = 1.;

            if (printW<w) {
                sx = (_Parameter)printW/w;
            }
            if (printH<h) {
                sy = (_Parameter)printH/h;
            }

            if (sx>sy) {
                sx = sy;
            } else {
                sy = sx;
            }

            _HYRect         drect = {0,0,h*sy,w*sx,0};
            drect.left   = (printW-drect.right)/2;
            drect.right += drect.left;
            drect.top    = (printH-drect.bottom)/2;
            drect.bottom+= drect.top;

            _DrawPicture    (drect);

#ifdef TARGET_API_MAC_CARBON
            theStatus = PMSessionEndPage(hyPC);
            if (theStatus != noErr) {
                return;
            }
#else
            PrClosePage     (printPort);
#endif


#ifdef TARGET_API_MAC_CARBON
            theStatus = PMSessionEndDocument(hyPC);
            SetPort(savePort);
            if (theStatus == noErr) {
                if (gFlattenedFormat != NULL) {
                    DisposeHandle(gFlattenedFormat);
                    gFlattenedFormat = NULL;
                }

                theStatus = PMFlattenPageFormat(gPageFormat, &gFlattenedFormat);
            }

            if (theStatus == noErr) {
                if (gFlattenedSettings != NULL) {
                    DisposeHandle(gFlattenedSettings);
                    gFlattenedSettings = NULL;
                }

                theStatus = PMFlattenPrintSettings(gPrintSettings, &gFlattenedSettings);
            }

            if (gPageFormat != kPMNoPageFormat) {
                theStatus = PMRelease(gPageFormat);
                gPageFormat = kPMNoPageFormat;
            }

            if (gPrintSettings != kPMNoPrintSettings) {
                theStatus = PMRelease(gPrintSettings);
                gPrintSettings = kPMNoPrintSettings;
            }

            theStatus = PMRelease(hyPC);

#else
            PrCloseDoc(printPort);
            if (((*prRecHdl)->prJob.bJDocLoop = bSpoolLoop) && (!PrError() ) ) {
                PrPicFile(prRecHdl, nil, nil, nil, &prStatus);
            }
#endif
        }
#ifdef TARGET_API_MAC_CARBON
        else {
            theStatus = PMRelease(hyPC);
        }
#endif

#ifdef TARGET_API_MAC_CARBON
    }
#else
        PrClose();
        SetPort(savePort);
#endif
}

//__________________________________________________________________

void _HYPWindow::_SetWindowRectangle(int top, int left, int bottom, int right, bool ss)
{
    _HYPlatformWindow::_SetWindowRectangle (top,left,bottom,right, ss);
    SetPaneSize     (bottom-top,right-left,depth);
    SetContentSize  (right-left,bottom-top);
}

//__________________________________________________________________

void    _HYPWindow::_Paint (Ptr )
{
    GrafPtr savedPort;
    GetPort(&savedPort);
#ifdef OPAQUE_TOOLBOX_STRUCTS
    SetPort(GetWindowPort(theWindow));
#else
    SetPort(theWindow);
#endif
    Rect srcRect  = {0,0,h,w},
         destRect = srcRect;

    LockPixels (GetGWorldPixMap(thePane));
#ifdef OPAQUE_TOOLBOX_STRUCTS
    CopyBits (GetPortBitMapForCopyBits(thePane),GetPortBitMapForCopyBits(GetWindowPort(theWindow)),&srcRect,&destRect,srcCopy,(RgnHandle)nil);
#else
    CopyBits ((BitMap*)*GetGWorldPixMap(thePane),&theWindow->portBits,&srcRect,&destRect,srcCopy,(RgnHandle)nil);
#endif
    UnlockPixels (GetGWorldPixMap(thePane));
    DrawGrowIcon (theWindow);
    SetPort (savedPort);
}

//__________________________________________________________________

void    _HYPWindow::_Update (Ptr )
{
    GrafPtr savedPort;
    GetPort(&savedPort);
#ifdef OPAQUE_TOOLBOX_STRUCTS
    SetPort(GetWindowPort(theWindow));
#else
    SetPort(theWindow);
#endif
    BeginUpdate(theWindow);

    Rect srcRect  = {0,0,h,w},
         destRect = srcRect;

    LockPixels (GetGWorldPixMap(thePane));
#ifdef OPAQUE_TOOLBOX_STRUCTS
    CopyBits (GetPortBitMapForCopyBits(thePane),GetPortBitMapForCopyBits(GetWindowPort(theWindow)),&srcRect,&destRect,srcCopy,(RgnHandle)nil);
#else
    CopyBits ((BitMap*)*GetGWorldPixMap(thePane),&theWindow->portBits,&srcRect,&destRect,srcCopy,(RgnHandle)nil);
#endif
    UnlockPixels (GetGWorldPixMap(thePane));
    DrawGrowIcon (theWindow);

    EndUpdate(theWindow);
    SetPort (savedPort);
}

//__________________________________________________________________

long _HYPWindow::_Grow(Ptr theData)
{
    EventRecord* theEvent = (EventRecord*)theData;
    Rect         sizeRect;
    sizeRect.top    = 10;
    sizeRect.left   = 10;
    sizeRect.bottom = 0x7fff;
    sizeRect.right  = 0x7fff;

    return       GrowWindow  (theWindow,theEvent->where,&sizeRect);
}

//__________________________________________________________________

bool        _HYPWindow::_ProcessMenuSelection (long msel)
{
    if (_HYWindow::_ProcessMenuSelection(msel)) {
        return true;
    }

    long        menuChoice = msel&0x0000ffff;
    bool        done = false;

    switch (msel/0xffff) {
    case 129: { // file menu
        if (menuChoice==8) { // print
            _PrintPWindow();
            done = true;
        }
        break;
    }

    case HY_PWINDOW_MENU_ID: {
        done = true;
        if (menuChoice == 1) {
            Zoom (1.1);
        } else if (menuChoice == 2) {
            Zoom (.9);
        } else if (menuChoice == 3) {
            OriginalSize();
        }
        break;
    }
    }

    if (!done) {
        return _HYGWindow::_ProcessMenuSelection (msel);
    }

    HiliteMenu(0);
    InvalMenuBar();

    return done;
}

//__________________________________________________________________

void _HYPWindow::_SetMenuBar(void)
{
    _HYGWindow::_SetMenuBar();
    MenuHandle pMenu = GetMenuHandle (HY_PWINDOW_MENU_ID);
    if (!pMenu) {
        pMenu = NewMenu(HY_PWINDOW_MENU_ID,"\pImage");
        if (!pMenu) {
            warnError (-108);
        }

        InsertMenuItem (pMenu,"\pEnlarge/1",0);
        InsertMenuItem (pMenu,"\pShrink/2",10000);
        InsertMenuItem (pMenu,"\pOriginal Size/3",10000);
        InsertMenu (pMenu,132);
    }
    InvalMenuBar();
}

//__________________________________________________________________

void _HYPWindow::_UnsetMenuBar(void)
{
    MenuHandle t = GetMenuHandle (HY_PWINDOW_MENU_ID);

    DeleteMenu  (HY_PWINDOW_MENU_ID);
    DisposeMenu (t);

    _HYGWindow::_UnsetMenuBar();
}

//__________________________________________________________________
bool _HYPWindow::_ProcessOSEvent (Ptr vEvent)
{
    return _HYPlatformWindow::_ProcessOSEvent (vEvent);
}

//EOF
\ No newline at end of file
diff --git a/src/gui/mac/WindowClasses/HYPlatformParameterTable.cpp b/src/gui/mac/WindowClasses/HYPlatformParameterTable.cpp
new file mode 100644
index 0000000..9ca8486
--- /dev/null
+++ b/src/gui/mac/WindowClasses/HYPlatformParameterTable.cpp
@@ -0,0 +1 @@
+/*
    Mac OS Portions of the parameter table class

    Sergei L. Kosakovsky Pond, Spring 2000 - December 2002.
*/

#include "HYParameterTable.h"
#include "HYUtils.h"

//__________________________________________________________________


bool        _HYParameterTable::_ProcessMenuSelection (long msel)
{
    long        menuChoice = msel&0x0000ffff;
    MenuHandle  tableMenu;
    _HYTable*   table = (_HYTable*)GetCellObject(HY_PARAMETER_TABLE_TABLE_ROW,0);

    HiliteMenu(0);
    InvalMenuBar();

    switch (msel/0xffff) {
    case 129: { // file menu
        if (menuChoice==4) { // save
            DoSave ();
            return true;
        }
        if (menuChoice==8) { // print
            _SimpleList columns,
                        sel;
            columns << 0;
            columns << 1;
            columns << 2;
            columns << 3;
            table->GetSelection (sel);
            char    resp = 3;
            if (sel.lLength) {
                _String pr ("Would you like to print only the selected cells? (Click \"No\" to print the entire table).");
                resp = YesNoCancelPrompt (pr);
            }
            if (resp == 3) {
                table->_PrintTable(columns,(_HYTable*)GetCellObject(HY_PARAMETER_TABLE_TABLE_ROW-1,0));
            } else if (resp == 1) {
                _SimpleList rows;
                for (long k = 0; k < sel.lLength; k+=4) {
                    rows << sel.lData[k]/4;
                }
                table->_PrintTable(columns,rows,(_HYTable*)GetCellObject(HY_PARAMETER_TABLE_TABLE_ROW-1,0));
            }
            return true;
        }
        break;
    }
    case 130: { // edit
        if (menuChoice==1) { // undo
            UndoCommand();
            _UpdateUndoMenu (nil,nil);
            return true;
        }
        if (menuChoice==4) { // copy
            return true;
        }
        if (menuChoice==8) { // select all
            SelectAll();
            return true;
        }
        break;
    }
    case HY_PARAMETER_TABLE_HMENU_ID: {
        tableMenu = GetMenuHandle (HY_PARAMETER_TABLE_HMENU_ID);
        char   toggleFlag;
        switch (menuChoice) {
        case 1:
            toggleFlag = HY_PARAMETER_TABLE_VIEW_LOCAL;
            break;
        case 2:
            toggleFlag = HY_PARAMETER_TABLE_VIEW_GLOBAL;
            break;
        case 3:
            toggleFlag = HY_PARAMETER_TABLE_VIEW_CONSTRAINED;
            break;
        case 4:
            toggleFlag = HY_PARAMETER_TABLE_VIEW_CATEGORY;
            break;

        }
        if (viewOptions&toggleFlag) {
            if (viewOptions-toggleFlag) {
                viewOptions-=toggleFlag;
            } else {
                break;
            }
        } else {
            viewOptions+=toggleFlag;
        }

        SetItemMark (tableMenu,menuChoice,(viewOptions&toggleFlag)?checkMark:noMark);
        ConstructTheTable();
        SetWindowRectangle (top,left,bottom,right);
        return true;
    }
    case HY_PARAMETER_TABLE_MENU_ID: {
        switch (menuChoice) {
        case 4:
            OptimizeLikelihoodFunction();
            break;

        case 6:
            DoEnterConstraint ();
            break;

        case 7:
            DoCleanUp   ();
            break;

        case 9:
            HandleVarianceEstimates ();
            break;

        case 10:
            HandleProfilePlot();
            break;

        case 12:
            HandleCategories();
            break;

        case 14:
            HandleSelectParameters();
            break;

        case 15:
            HandleOpenInChart     ();
            break;
        }
        return true;
    }
    }

    return _HYTWindow::_ProcessMenuSelection(msel);
}

//__________________________________________________________________

void _HYParameterTable::_UpdateViewMenu(void)
{
    MenuHandle viewMenu = GetMenuHandle (HY_PARAMETER_TABLE_HMENU_ID);

    if (!(avViewOptions&HY_PARAMETER_TABLE_VIEW_GLOBAL)) {
        DisableMenuItem (viewMenu,2);
    } else {
        EnableMenuItem (viewMenu,2);
    }


    if (!(avViewOptions&HY_PARAMETER_TABLE_VIEW_CONSTRAINED)) {
        DisableMenuItem (viewMenu,3);
    } else {
        EnableMenuItem (viewMenu,3);
    }

    if (!(avViewOptions&HY_PARAMETER_TABLE_VIEW_CATEGORY)) {
        DisableMenuItem (viewMenu,4);
    } else {
        EnableMenuItem (viewMenu,4);
    }

    if (!(avViewOptions&HY_PARAMETER_TABLE_VIEW_TREES)) {
        DisableMenuItem (viewMenu,5);
    } else {
        EnableMenuItem (viewMenu,5);
    }

    CheckMenuItem (viewMenu,1,viewOptions&HY_PARAMETER_TABLE_VIEW_LOCAL);
    CheckMenuItem (viewMenu,2,viewOptions&HY_PARAMETER_TABLE_VIEW_GLOBAL);
    CheckMenuItem (viewMenu,3,viewOptions&HY_PARAMETER_TABLE_VIEW_CONSTRAINED);
    CheckMenuItem (viewMenu,4,viewOptions&HY_PARAMETER_TABLE_VIEW_CATEGORY);
    CheckMenuItem (viewMenu,5,viewOptions&HY_PARAMETER_TABLE_VIEW_TREES);
    //CheckMenuItem (viewMenu,(viewOptions&HY_PARAMETER_TABLE_VIEW_ALPHABETICAL)?7:6,true);

}

//__________________________________________________________________

void _HYParameterTable::_SetMenuBar(void)
{
    _HYWindow::_SetMenuBar();

    MenuHandle  t  = GetMenuHandle (130);

    EnableMenuItem (GetMenuHandle (129),1);
    EnableMenuItem (t,8);
    if (undoCommands.lLength) {
        EnableMenuItem (GetMenuHandle (130),1);
    }

    MenuHandle lfMenu = GetMenuHandle (HY_PARAMETER_TABLE_MENU_ID);
    if (!lfMenu) {
        lfMenu = NewMenu(HY_PARAMETER_TABLE_MENU_ID,"\pLikelihood");
        if (!lfMenu) {
            warnError (-108);
        }

        MenuHandle viewMenu = NewMenu(HY_PARAMETER_TABLE_HMENU_ID,"\pView Options");

        InsertMenuItem (viewMenu,"\pLocal Parameters",0);
        InsertMenuItem (viewMenu,"\pGlobal Parameters",10000);
        InsertMenuItem (viewMenu,"\pConstrained Parameters",10000);
        InsertMenuItem (viewMenu,"\pRate Classes",10000);
        InsertMenuItem (viewMenu,"\pTrees",10000);
        InsertMenu (viewMenu,hierMenu);
        InsertMenuItem (lfMenu,"\pView Options",10000);
        SetItemCmd (lfMenu,1,hMenuCmd);
        SetItemMark(lfMenu,1,HY_PARAMETER_TABLE_HMENU_ID);

        InsertMenuItem (lfMenu,"\p(-",10000);
        InsertMenuItem (lfMenu,"\pRecalculate LF/U",10000);
        InsertMenuItem (lfMenu,"\pOptimize LF/T",10000);
        InsertMenuItem (lfMenu,"\p(-",10000);
        InsertMenuItem (lfMenu,"\pEnter Command",10000);
        InsertMenuItem (lfMenu,"\pRemove Unused Parameters",10000);
        InsertMenuItem (lfMenu,"\p(-",10000);
        InsertMenuItem (lfMenu,"\pCovariance, Sampler and CI",10000);
        InsertMenuItem (lfMenu,"\pLikelihood Profile Plot",10000);
        InsertMenuItem (lfMenu,"\p(-",10000);
        InsertMenuItem (lfMenu,"\pCategories Processor",10000);
        InsertMenuItem (lfMenu,"\p(-",10000);
        InsertMenuItem (lfMenu,"\pSelect Parameters",10000);
        InsertMenuItem (lfMenu,"\pOpen Selection in Table",10000);

        InsertMenu (lfMenu,132);
        _UpdateViewMenu();
    }
    InvalMenuBar();
}

//__________________________________________________________________

void _HYParameterTable::_UnsetMenuBar(void)
{
    MenuHandle lfMenu = GetMenuHandle (HY_PARAMETER_TABLE_MENU_ID),
               viewMenu = GetMenuHandle (HY_PARAMETER_TABLE_HMENU_ID);


    DeleteMenu (HY_PARAMETER_TABLE_MENU_ID);
    DeleteMenu (HY_PARAMETER_TABLE_HMENU_ID);
    DisposeMenu (viewMenu);
    DisposeMenu (lfMenu);
    _HYWindow::_UnsetMenuBar();
}

//__________________________________________________________________

void _HYParameterTable::_UpdateUndoMenu(_String* command, _String* desc)
{
    if (command&&desc) {
        EnableMenuItem (GetMenuHandle (130),1);
        undoCommands        &&  command;
        undoDescriptions    &&  desc;
        Str255 s255;
        StringToStr255 (*desc, s255);
        SetMenuItemText (GetMenuHandle (130),1,s255);
    } else {
        if (undoDescriptions.lLength==0) {
            Str255 s255 = "\pCan't Undo";
            SetMenuItemText (GetMenuHandle (130),1,s255);
            DisableMenuItem (GetMenuHandle (130),1);
        } else {
            Str255 s255;
            StringToStr255 (*(_String*)undoDescriptions(undoDescriptions.lLength-1), s255);
            EnableMenuItem (GetMenuHandle (130),1);
            SetMenuItemText (GetMenuHandle (130),1,s255);
        }
    }
    InvalMenuBar();
}

//EOF
\ No newline at end of file
diff --git a/src/gui/mac/WindowClasses/HYPlatformTWindow.cpp b/src/gui/mac/WindowClasses/HYPlatformTWindow.cpp
new file mode 100644
index 0000000..49e559a
--- /dev/null
+++ b/src/gui/mac/WindowClasses/HYPlatformTWindow.cpp
@@ -0,0 +1 @@
+/*
    Mac OS Portions of the container window

    Sergei L. Kosakovsky Pond, Spring 2000 - December 2002.
*/

#include "HYTableWindow.h"
#include "Scrap.h"
#include "HYEventTypes.h"
#include "HYUtils.h"
#include "errorfns.h"


//__________________________________________________________________
extern      _SimpleList windowPtrs,
            windowObjects;

RGBColor    _BLACK_ = {0,0,0};

extern      PixPatHandle
statusBarFill;

//__________________________________________________________________


#ifdef TARGET_API_MAC_CARBON
extern  PMPageFormat     gPageFormat;
extern  Handle           gFlattenedFormat;
pascal OSStatus scrollWheelHandler (EventHandlerCallRef , EventRef, void*);
pascal void IdleWindowTimer        (EventLoopTimerRef ,void*);


pascal void IdleWindowTimer (EventLoopTimerRef ,void* userData)
{
    _HYTWindow * myTW = (_HYTWindow*)userData;
    for (long k=0; k<myTW->components.lLength; k++)
        if (myTW->cells.Find(k)>=0) {
            _HYComponent* tC = (_HYComponent*)myTW->components(k);
            tC->IdleHandler();
        }
    myTW->_HandleIdleEvent ();
}

//__________________________________________________________________

pascal OSStatus scrollWheelHandler (EventHandlerCallRef , EventRef theEvent, void* userData)
{
    EventParamType                  actType;
    EventMouseWheelAxis             axis;
    GetEventParameter (theEvent,  kEventParamMouseWheelAxis, typeMouseWheelAxis, &actType,sizeof(EventMouseWheelAxis),nil,&axis);

    if (axis == kEventMouseWheelAxisY) {
        Point              mouseLocation;
        GetEventParameter (theEvent, kEventParamMouseLocation, typeQDPoint, &actType,sizeof(Point),nil,&mouseLocation);

        long               mouseWheelDelta;
        GetEventParameter (theEvent, kEventParamMouseWheelDelta, typeLongInteger, &actType,sizeof(Point),nil,&mouseWheelDelta);

        UInt32 modifiers;
        GetEventParameter (theEvent, kEventParamKeyModifiers, typeUInt32, NULL, sizeof(modifiers), NULL, &modifiers);

        if (modifiers & optionKey) {
            mouseWheelDelta *= 10;
        }

        /*_HYWindow* thisWindow = (_HYWindow*)windowObjectRefs(windowPtrs.Find((long)userData));
        forceUpdateForScrolling = true;
        thisWindow->SetWindowRectangle (newSize.top,newSize.left,newSize.bottom+1,newSize.right+1,false);
        thisWindow->Update(nil);
        forceUpdateForScrolling = false;*/

        _HYTWindow* thisWindow = (_HYTWindow*)windowObjectRefs(windowPtrs.Find((long)userData));
        GrafPtr savedPort;
        GetPort(&savedPort);
#ifdef OPAQUE_TOOLBOX_STRUCTS
        SetPort(GetWindowPort(thisWindow->theWindow));
#else
        SetPort(thisWindow->theWindow);
#endif
        GlobalToLocal (&mouseLocation);
        int c = thisWindow->FindClickedCell(mouseLocation.h,mouseLocation.v);
        thisWindow->DoMouseWheel (c, mouseWheelDelta);
        return noErr;
    }

    return eventNotHandledErr;
}

#endif

//__________________________________________________________________


bool        _HYTWindow::_ProcessMenuSelection (long msel)
{
    if (_HYWindow::_ProcessMenuSelection(msel)) {
        return true;
    }

    long        menuChoice = msel&0x0000ffff;
    bool        done = false;

    switch (msel/0xffff) {
    case 129:
        if (menuChoice == 7) { // print setup
            OSStatus theStatus;
            Boolean isAccepted;

            PMPrintSession hyPC;

            theStatus = PMCreateSession (&hyPC);
            if (theStatus != noErr) {
                return false;
            }

            if (InitPrint(hyPC)) {
                theStatus = PMSessionPageSetupDialog(hyPC,gPageFormat, &isAccepted);
            }

            if (theStatus == noErr) {
                if (gFlattenedFormat != NULL) {
                    DisposeHandle(gFlattenedFormat);
                    gFlattenedFormat = NULL;
                }

                theStatus = PMFlattenPageFormat(gPageFormat, &gFlattenedFormat);
            }

            if (gPageFormat != kPMNoPageFormat) {
                theStatus = PMRelease(gPageFormat);
                gPageFormat = kPMNoPageFormat;
            }

            theStatus = PMRelease(hyPC);
            return true;
        }

    case 130: {
        if ((menuChoice == 4)||(menuChoice==5)) {
            done = true;
            HandleCopyPaste(menuChoice-4);
            break;
        }
    }
    }

    HiliteMenu(0);
    InvalMenuBar();

    return done;
}

//__________________________________________________________________

long _HYTWindow::_Grow(Ptr theData)
{
    EventRecord* theEvent = (EventRecord*)theData;
    //_HYRect        dynDim = MinMaxWindowDimensions();
    Rect         sizeRect;
    sizeRect.top    = dim.top;
    sizeRect.left   = dim.left;
    sizeRect.bottom = dim.bottom-1;
    sizeRect.right  = dim.right-1;

    return GrowWindow  (theWindow,theEvent->where,&sizeRect);
}

//__________________________________________________________________

void _HYTWindow::_PaintStatusBar(Ptr,bool)
{
    Rect clearRect = newHRect();
    //EraseRect (&clearRect);
    FillCRect (&clearRect, statusBarFill);
    if (hScroll) {
        clearRect = newVRect();
        EraseRect (&clearRect);
    } else {
        RGBColor saveColor;
        GetForeColor (&saveColor);
        RGBForeColor (&_BLACK_);
        MoveTo (clearRect.left,clearRect.top);
        LineTo (clearRect.right,clearRect.top);
        RGBForeColor (&saveColor);
        if (statusBar.sLength) {
#ifdef OPAQUE_TOOLBOX_STRUCTS
            Rect    destRect;
            GetWindowBounds (theWindow,kWindowGlobalPortRgn,&destRect);
            OffsetRect (&destRect,-destRect.left,-destRect.top);
            if (flags&HY_WINDOW_STATUS_BAR_LIGHT_LEFT) {
                MoveTo (20,destRect.bottom-4);
            } else {
                MoveTo (5,destRect.bottom-4);
            }
#else
            if (flags&HY_WINDOW_STATUS_BAR_LIGHT_LEFT) {
                MoveTo (20,theWindow->portRect.bottom-4);
            } else {
                MoveTo (5,theWindow->portRect.bottom-4);
            }
#endif
            TextFont(0);
            TextFace(0);
            TextSize(9);
            DrawText(statusBar.sData,0,statusBar.sLength);
        }
    }
}

//__________________________________________________________________

void _HYTWindow::_Paint(Ptr)
{
    /*if (flags&HY_WINDOW_SIZE)
        DrawGrowIcon (theWindow);*/
    _HYRect  relRect;

    _SimpleList alreadyDone (cells.lLength);

    for (int k=0; k<cells.lLength; k++) {
        long i = cells.lData[k];

        if (alreadyDone.lData[i] == 0) {
            relRect.left = componentL.lData[i];
            relRect.right = componentR.lData[i];
            relRect.top = componentT.lData[i];
            relRect.bottom = componentB.lData[i];
            ((_HYComponent*)components(i))->Update((Ptr)&relRect);
            alreadyDone.lData[i] = 1;
        }
    }
    if (hScroll) {
        ShowControl (hScroll);
        ShowControl (vScroll);
    } else {
        if(flags&HY_WINDOW_SIZE) {
            _PaintStatusBar();
        }
    }

#ifdef TARGET_API_MAC_CARBON
    if (!aquaInterfaceOn) {
        DrawControls(theWindow);
    }
#else
    DrawControls(theWindow);
#endif
}

//__________________________________________________________________

void _HYTWindow::_Update(Ptr)
{
    GrafPtr savedPort;
    GetPort(&savedPort);
#ifdef OPAQUE_TOOLBOX_STRUCTS
    SetPort(GetWindowPort(theWindow));
#else
    SetPort(theWindow);
#endif
    BeginUpdate(theWindow);
//  PixMapHandle osW,saveMap;
//  SetPort(theWindow);
//  GDHandle     junk;
//  if (NewScreenBuffer (&theWindow->portRect,false,&junk,&osW) != noErr)
//  {
    _Paint(nil);
    /*  }
        else
        {
            HLock ((Handle)osW);
            HLock ((Handle)((CGrafPtr)theWindow)->portPixMap);
            CopyBits ((BitMap*)*(((CGrafPtr)theWindow)->portPixMap),(BitMap*)*osW,&theWindow->portRect,&theWindow->portRect,srcCopy,nil);
            saveMap = ((CGrafPtr)theWindow)->portPixMap;
            SetPortPix (osW);
            _Paint(nil);
            SetPortPix (saveMap);
            CopyBits ((BitMap*)*osW,(BitMap*)*(((CGrafPtr)theWindow)->portPixMap),&theWindow->portRect,&theWindow->portRect,srcCopy,nil);
            HUnlock ((Handle)((CGrafPtr)theWindow)->portPixMap);
            DisposePixMap (osW);
        }*/
    EndUpdate(theWindow);
    SetPort(savedPort);
}

//__________________________________________________________________

void _HYTWindow::_Activate(void)
{
    for (int i=0; i<components.lLength; i++)
        if (cells.Find(i)>=0) {
            ((_HYComponent*)components(i))->Activate();
        }


#ifdef TARGET_API_MAC_CARBON
    if (!theTimer) {
        EventLoopRef      mainLoop;
        mainLoop = GetMainEventLoop();
        InstallEventLoopTimer (mainLoop,0,.5*kEventDurationSecond,timerUPP,this,&theTimer);
    }
#endif

    _HYPlatformWindow::_Activate();

}

//__________________________________________________________________

void _HYTWindow::_Activate2(void)
{
}

//__________________________________________________________________

void _HYTWindow::_Deactivate2(void)
{
}

//__________________________________________________________________

void _HYTWindow::_Zoom(bool inOut)
{
    if ((((savedLoc.right-savedLoc.left!=right-left)||(savedLoc.bottom-savedLoc.top!=bottom-left)))&&(!inOut)) {
        SetPosition (savedLoc.left,savedLoc.top);
        SetWindowRectangle (0,0,savedLoc.bottom-savedLoc.top, savedLoc.right-savedLoc.left);
    } else {
        Rect    sl = savedLoc;
        _HYRect sd = GetScreenDimensions();
        SetPosition (5,42);
        SetWindowRectangle (0,0, sd.bottom-25, sd.right-5);
        savedLoc = sl;
    }
}

//__________________________________________________________________

void _HYTWindow::_Deactivate(void)
{
    for (int i=0; i<components.lLength; i++)
        if (cells.Find(i)>=0) {
            ((_HYComponent*)components(i))->Deactivate();
        }

#ifdef TARGET_API_MAC_CARBON
    if (theTimer) {
        RemoveEventLoopTimer (theTimer);
        theTimer = nil;
    }
#endif
    _HYPlatformWindow::_Deactivate();
}

//__________________________________________________________________
void        _HYTWindow::_SetStatusBar(_String& text)
{
    statusBar = text;
    Rect statusRect = newHRect();
    GrafPtr savePort;
    GetPort (&savePort);
#ifdef OPAQUE_TOOLBOX_STRUCTS
    SetPort(GetWindowPort(theWindow));
    InvalWindowRect (theWindow,&statusRect);
#else
    SetPort(theWindow);
    InvalRect (&statusRect);
#endif
    SetPort (savePort);
}


//__________________________________________________________________
void        _HYPlatformTWindow::_SetWindowRectangle     (int,int,int,int,bool)
{

}


//__________________________________________________________________

bool _HYTWindow::_ProcessOSEvent (Ptr vEvent)
{
    EventRecord* theEvent = (EventRecord*)vEvent;
    if (!_HYPlatformWindow::_ProcessOSEvent (vEvent)) {
        if ((theEvent->what==keyDown)||(theEvent->what==autoKey)) {
            if (keyboardFocusChain.lLength) {
                int keyCode = (theEvent->message&keyCodeMask)>>8;
                if (keyCode == 0x30) { // tab
                    bool    backwards = theEvent->modifiers & shiftKey;

                    if (keyboardFocus==-1) {
                        keyCode = keyboardFocusChain.lData[backwards?keyboardFocusChain.lLength-1:0];
                    } else if (keyboardFocusChain.lLength>1) {
                        keyCode = keyboardFocusChain.Find (keyboardFocus);
                        keyCode += backwards?(-1):1;
                        if (keyCode<0) {
                            keyCode = keyboardFocusChain.lLength-1;
                        } else if (keyCode >= keyboardFocusChain.lLength) {
                            keyCode = 0;
                        }
                        keyCode = keyboardFocusChain.lData[keyCode];
                    } else {
                        keyCode = -1;
                    }

                    if (keyCode>=0) {
                        ProcessEvent (generateKeyboardFocusEvent (((_HYComponent*)components(keyCode))->GetID()));
                    }
                    return true;
                }
            }

            for (long k=0; k<components.lLength; k++)
                if (cells.Find(k)>=0) {
                    _HYComponent* tC = (_HYComponent*)components(k);
                    if (tC->UnfocusedKeyboardInput())
                        if (tC->_ProcessOSEvent (vEvent)) {
                            return true;
                        }
                }

            if ((keyboardFocus>=0)&&(keyboardFocus<components.lLength))
                if (((_HYComponent*)components(keyboardFocus))->_ProcessOSEvent (vEvent)) {
                    return true;
                }

            return false;
        }
        GrafPtr savedPort;
        GetPort(&savedPort);
#ifdef OPAQUE_TOOLBOX_STRUCTS
        SetPort(GetWindowPort(theWindow));
#else
        SetPort(theWindow);
#endif
        Point localClick = theEvent->where;
        GlobalToLocal (&localClick);
        int c = FindClickedCell(localClick.h,localClick.v);
        if (c<0) {
            if (lastMouseComponent>=0) {
                ((_HYComponent*)components(lastMouseComponent))->_ComponentMouseExit();
            }
            lastMouseComponent = -1;
            return false;
        } else {
            if ((lastMouseComponent>=0)&&(c!=lastMouseComponent)) {
                ((_HYComponent*)components(lastMouseComponent))->_ComponentMouseExit();
            }
            lastMouseComponent = c;
        }
        bool res = ((_HYComponent*)components(c))->_ProcessOSEvent (vEvent);
        if ((theEvent->what == osEvt)||(theEvent->what == nullEvent))
            for (long k=0; k<components.lLength; k++)
                if (cells.Find(k)>=0) {
                    _HYComponent* tC = (_HYComponent*)components(k);
                    tC->IdleHandler();
                }
        SetPort(savedPort);
        return res;
    } else {
        return true;
    }
    return false;
}

//__________________________________________________________________

void        _HYTWindow::_SetCopyString (_String* str)
{
#ifdef TARGET_API_MAC_CARBON
    ClearCurrentScrap();
    ScrapRef         theScrapRef;
    GetCurrentScrap(&theScrapRef);
    PutScrapFlavor(theScrapRef, 'TEXT', kScrapFlavorMaskNone,str->sLength,str->sData);
#else
    ZeroScrap();
    PutScrap (str->sLength,'TEXT',str->sData);
#endif
}

//__________________________________________________________________

_String*        _HYTWindow::_GetPasteString (void)
{
    Handle  scrapHandle = NewHandle (0);
    long    rc;
    _String *res = nil;

#ifdef TARGET_API_MAC_CARBON
    ScrapRef theScrapRef;
    if (GetCurrentScrap(&theScrapRef) != noErr) {
        return new _String;
    }

    if (GetScrapFlavorSize(theScrapRef, 'TEXT', &rc) != noErr) {
        return new _String;
    }
#else
    long    scrapOffset;
    rc = GetScrap( scrapHandle, 'TEXT', &scrapOffset );
#endif
    if ( rc >= 0 ) {
        SetHandleSize( scrapHandle, rc+1 );
        HLock  (scrapHandle);
#ifdef TARGET_API_MAC_CARBON
        long err = GetScrapFlavorData(theScrapRef, 'TEXT', &rc, *scrapHandle);
#endif
        (*scrapHandle)[rc] = 0;
        HUnlock (scrapHandle);
        if (err == noErr) {
            res = new _String (*scrapHandle);
        } else {
            res = new _String;
        }
    } else {
        res = new _String;
    }

    DisposeHandle (scrapHandle);
    return res;
}

//__________________________________________________________________

_HYPlatformTWindow::_HYPlatformTWindow(Ptr)
{
#ifdef TARGET_API_MAC_CARBON
    theTimer = nil;
    timerUPP = NewEventLoopTimerUPP(IdleWindowTimer);

    scrollWheelH    = NewEventHandlerUPP (scrollWheelHandler);
    checkPointer  ((Ptr)scrollWheelH);
    EventTypeSpec sw;
    sw.eventClass  = kEventClassMouse;
    sw.eventKind   = kEventMouseWheelMoved;
    InstallWindowEventHandler (((_HYTWindow*)this)->theWindow,scrollWheelH,1,&sw,(Ptr)(((_HYTWindow*)this)->theWindow),NULL);
#endif
}

//__________________________________________________________________

_HYPlatformTWindow::~_HYPlatformTWindow(void)
{
#ifdef TARGET_API_MAC_CARBON
    if (theTimer) {
        RemoveEventLoopTimer (theTimer);
    }
    DisposeEventLoopTimerUPP (timerUPP);
    if (scrollWheelH) {
        DisposeEventHandlerUPP (scrollWheelH);
    }
#endif
}




//EOF
\ No newline at end of file
diff --git a/src/gui/mac/WindowClasses/HYPlatformTreePanel.cpp b/src/gui/mac/WindowClasses/HYPlatformTreePanel.cpp
new file mode 100644
index 0000000..a76e1df
--- /dev/null
+++ b/src/gui/mac/WindowClasses/HYPlatformTreePanel.cpp
@@ -0,0 +1 @@
+/*
    Mac OS Portions of the tree panel class

    Sergei L. Kosakovsky Pond, Spring 2000 - December 2002.
*/

#include "HYTreePanel.h"
#include "HYDataPanel.h"
#include "HYUtils.h"

#include "QuickTimeComponents.h"
#include "ImageCompression.h"
#include "Scrap.h"


//__________________________________________________________________

_String                 saveForTreesPrompt          ("Save Tree As:"),
                        saveFormatsForTreesPrompt   ("File Type:");

//__________________________________________________________________

void _HYTreePanel::_DisplayBranchFloater (void)
{
    long h,v;

#ifdef  TARGET_API_MAC_CARBON
    GrafPtr thisPort = GetWindowPort(theWindow),
            savePort;
#else
    GrafPtr thisPort = (GrafPtr)theWindow,
            savePort;
#endif

    GetPort (&savePort);
    SetPort (thisPort);
    Point p = {saveMouseV,saveMouseH};

    _HYCanvas   *theTree    = (_HYCanvas*)GetObject (0);
    GlobalToLocal (&p);
    if (IsVertical()) {
        v = p.h-componentL.lData[0]+theTree->hOrigin;
        h = p.v-componentT.lData[0]+theTree->vOrigin;
    } else {
        h = p.h-componentL.lData[0]+theTree->hOrigin;
        v = p.v-componentT.lData[0]+theTree->vOrigin;
    }
    _SimpleList   saveSelection;
    saveSelection.Duplicate (&currentSelection);
    v = FindSelectedBranch (h,v);
    if (v) {
        node <nodeCoord>* thisNode = (node <nodeCoord>*) v;
        _String toolTip (thisNode->in_object.branchName);
        if (toolTip.sLength) {
            if (scaleVariable.sLength) {
                toolTip = toolTip & " (" & thisNode->in_object.bL & ')';
            }
            if (toolTip.sLength) {
                RGBColor      toolTipColor = {0xFFFF,0xBFFF,0x4000};
                PixPatHandle  toolTipPixPat = NewPixPat();
                MakeRGBPat (toolTipPixPat,&toolTipColor);
#ifdef OPAQUE_TOOLBOX_STRUCTS
                short   savedFace = GetPortTextFont (thisPort),
                        savedSize = GetPortTextSize (thisPort);

                Style   savedStyle = GetPortTextFace (thisPort);
#else
                short   savedFace = thisPort->txFont,
                        savedSize = thisPort->txSize;

                Style   savedStyle = thisPort->txFace;
#endif
                TextFont (kFontIDHelvetica);
                TextSize (9);
                TextFace (0);
                toolTipBounds.bottom = p.v;
                toolTipBounds.top = toolTipBounds.bottom - 12;
                if (toolTipBounds.top<0) {
                    toolTipBounds.top = p.v;
                    toolTipBounds.bottom = toolTipBounds.top+12;
                }
                h = GetVisibleStringWidth (toolTip);
                toolTipBounds.left = p.h;
                if (toolTipBounds.left<=0) {
                    toolTipBounds.left = 1;
                }
                toolTipBounds.right = toolTipBounds.left+h+2;
#ifdef OPAQUE_TOOLBOX_STRUCTS
                Rect portRect;
                GetPortBounds (thisPort,&portRect);
                h = toolTipBounds.right-portRect.right+portRect.left;
#else
                h = toolTipBounds.right-thisPort->portRect.right+thisPort->portRect.left;
#endif
                if (h>0) {
                    if (h>=toolTipBounds.left) {
                        h = toolTipBounds.left-1;
                    }
                    toolTipBounds.left -= h;
                    toolTipBounds.right-= h;
                }
                toolTipBounds.right += 2;
                Rect tRect = HYRect2Rect (toolTipBounds);
                RGBColor oldColor;
                GetForeColor (&oldColor);
                //toolTipColor.red = toolTipColor.blue = toolTipColor.green = 0;
                //RGBForeColor (&toolTipColor);
                //FrameRect  (&tRect);
                MoveTo (toolTipBounds.left+2,toolTipBounds.bottom-3);
                toolTipColor.red = toolTipColor.blue = toolTipColor.green = 0;
                FillCRect  (&tRect,toolTipPixPat);
                RGBForeColor (&toolTipColor);
                FrameRect (&tRect);
                DrawText (toolTip.sData,0,toolTip.sLength);
                RGBForeColor (&oldColor);
                TextFont (savedFace);
                TextSize (savedSize);
                TextFace (savedStyle);
                DisposePixPat (toolTipPixPat);
                SetPort (savePort);
            }
        }
        SetPort (savePort);
    }
}

//__________________________________________________________________

void _HYTreePanel::_HandleIdleEvent (void)
{
#ifdef TARGET_API_MAC_CARBON
    Point    curMouse;
    GetGlobalMouse (&curMouse);

    unsigned long t;
    GetDateTime(&t);


    if ((abs(curMouse.h-saveMouseH)<=3)
            &&(abs(curMouse.v-saveMouseV)<=3)
            &&(t-lastSave>.5))

    {
        if (!HasToolTip()) {
            GrafPtr curPort;
            GetPort (&curPort);
            SetPort (GetWindowPort (theWindow));
            _DisplayBranchFloater();
            SetPort (curPort);
        }

        lastSave   = t;
    }

    saveMouseH = curMouse.h;
    saveMouseV = curMouse.v;
#endif
}

//__________________________________________________________________

bool _HYTreePanel::_ProcessOSEvent (Ptr vEvent)
{
    EventRecord* theEvent = (EventRecord*)vEvent;
    static  UInt32  lastClick = 0;
    static  int     lastH = 0, lastV = 0;
//  static  long    lastSelection = -1;

    if ((theEvent->what==mouseDown)&&(theEvent->modifiers&controlKey)) {
        Point localClick = theEvent->where;
        GrafPtr savedPort;
        GetPort(&savedPort);
#ifdef OPAQUE_TOOLBOX_STRUCTS
        SetPort(GetWindowPort(theWindow));
#else
        SetPort(theWindow);
#endif
        GlobalToLocal (&localClick);
        SetPort(savedPort);
        if (FindClickedCell(localClick.h,localClick.v) == 0) {
            HandleContextPopup (theEvent->where.h, theEvent->where.v);
            return true;
        }
    }


    if(!_HYTWindow::_ProcessOSEvent (vEvent)) {
        if (theEvent->what==mouseDown) {
            Point localClick = theEvent->where;
            GrafPtr savedPort;
            GetPort(&savedPort);
#ifdef OPAQUE_TOOLBOX_STRUCTS
            SetPort(GetWindowPort(theWindow));
#else
            SetPort(theWindow);
#endif
            GlobalToLocal (&localClick);
            int   c = FindClickedCell(localClick.h,localClick.v),ch,cv;
            if (c<0) {
                return false;
            }
            _HYComponent* thisComponent = (_HYComponent*)components(c);
            if (c==1) { // navBar
                ch = localClick.h-componentL.lData[1];
                cv = localClick.v-componentT.lData[1];
                if (navRect.Contains(ch,cv)) {
                    Point   oldPt, newPt;
                    oldPt=localClick;
                    GlobalToLocal(&oldPt);
                    if (StillDown()) {
                        while (WaitMouseUp()) {
                            GetMouse( &newPt);
                            if ( DeltaPoint(oldPt, newPt) ) {
                                oldPt=newPt;
                                ch = newPt.h-componentL.lData[1];
                                cv = newPt.v-componentT.lData[1];
                                SetNavRectCenter (ch,cv);
                            }
                        }
                    }
                } else {
                    SetNavRectCenter (ch,cv);
                }
                SetPort(savedPort);
                return true;
            } else if (c==0) { // tree panel
                ch = localClick.h-componentL.lData[0];
                cv = localClick.v-componentT.lData[0];

                if ((theEvent->modifiers&cmdKey)&&(theEvent->modifiers&optionKey)) {
                    _HYCanvas   *theTree    = (_HYCanvas*)GetObject (0);
                    _HYCanvas   *viewFinder = (_HYCanvas*)GetObject (1);
                    Point oldPt = {-1,-1};

                    if (StillDown()) {
                        while (WaitMouseUp()) {
                            GetMouse(&localClick);
                            GlobalToLocal (&localClick);
                            if (DeltaPoint (oldPt,localClick)) {
                                if (IsVertical()) {
                                    cv = localClick.h-componentL.lData[0]+theTree->hOrigin;
                                    ch = localClick.v-componentT.lData[0]+theTree->vOrigin;
                                } else {
                                    ch = localClick.h-componentL.lData[0]+theTree->hOrigin;
                                    cv = localClick.v-componentT.lData[0]+theTree->vOrigin;
                                }
                                if ((ch<theTree->_HYComponent::GetMaxW())&&(cv<theTree->_HYComponent::GetMaxH())) {
                                    FishEyeProjection (ch,theTree->_HYComponent::GetMaxH()-cv,theTree->_HYComponent::GetMaxW(),
                                                       theTree->_HYComponent::GetMaxH(),coordTree);
                                    treeFlags |= HY_TREEPANEL_PROJECTION;
                                    forceUpdateForScrolling = true;
                                    RenderTree(false);
                                    forceUpdateForScrolling = false;
                                }
                            }
                            oldPt = localClick;
                        }
                        RenderNavTree();
                        viewFinder->_MarkForUpdate();
                    }
                    SetPort(savedPort);
                    return true;
                }

                char shiftFlag = ((0x0200&theEvent->modifiers)>0);
                if ((0x0800&theEvent->modifiers)>0) {
                    shiftFlag|=0x02;
                }
                if ((cmdKey&theEvent->modifiers)>0) {
                    shiftFlag|=0x04;
                }
                if (IsVertical()) {
                    c = ch;
                    ch = cv+thisComponent->vOrigin;
                    cv = c+thisComponent->hOrigin;
                } else {
                    ch+=thisComponent->hOrigin;
                    cv+=thisComponent->vOrigin;
                }
                if (theEvent->when-lastClick<GetDblTime()) {
                    if ((abs(ch-lastH)<5)&&(abs(cv-lastV)<5)&&(currentSelection.lLength))
                        if (theEvent->modifiers&cmdKey) {
                            DisplayParameterTable();
                        } else {
                            InvokeNodeEditor();
                        }
                    SetPort(savedPort);
                    return true;
                }
                lastH = ch;
                lastV = cv;
                if(FindSelection (ch,cv,shiftFlag)) {
                    _UpdateOperationsMenu();
                    RenderTree();
                }

                lastClick = theEvent->when;
            }
            SetPort(savedPort);
        } else {
            if (theEvent->what == keyDown) {
                unsigned char keyCode = (theEvent->message&keyCodeMask)>>8;

                if (currentSelection.lLength) {
                    if ((keyCode == 0x33)||(keyCode == 0x75)) { // delete
                        DeleteCurrentSelection();
                        _UpdateOperationsMenu();
                        return true;
                    } else if ((keyCode == 0x4C)||(keyCode == 0x24)) { // return
                        InvokeNodeEditor ();
                        _UpdateOperationsMenu();
                        return true;
                    }
                }
            } else if (theEvent->what == osEvt) {
                unsigned long t;
                GetDateTime(&t);
#ifndef TARGET_API_MAC_CARBON
                if ((abs(theEvent->where.h-saveMouseH)<=3)
                        &&(abs(theEvent->where.v-saveMouseV)<=3)) {
                    if ((t-lastSave>=1)&&(!toolTipBounds.left)) {
                        lastSave = t;
                        _DisplayBranchFloater ();
                        return true;

                    }
                    lastSave = t;
                } else
#endif
                {
                    if (toolTipBounds.left) {
                        Rect     tRect;
                        tRect = HYRect2Rect (toolTipBounds);
#ifdef OPAQUE_TOOLBOX_STRUCTS
                        InvalWindowRect (theWindow,&tRect);
#else
                        InvalRect (&tRect);
#endif
                        toolTipBounds.left = 0;
                    }
                    saveMouseH = theEvent->where.h;
                    saveMouseV = theEvent->where.v;
                    lastSave = t;
                }
                return true;
            }
        }
        return false;
    }
    return true;
}


//__________________________________________________________________

bool        _HYTreePanel::_ProcessMenuSelection (long msel)
{
    if (_HYWindow::_ProcessMenuSelection(msel)) {
        return true;
    }

    long        menuChoice = msel&0x0000ffff;
    MenuHandle  treeMenu;
    _String     prompt;

    switch (msel/0xffff) {
    case 129: { // file menu
        if (menuChoice==4) { // save
            _String           filePath;
            _List             saveFormatsForTrees;

            long pidOptions = GetUniversalSaveOptions (saveFormatsForTrees)+1;

            InitializeQTExporters ();
            saveFormatsForTrees&& & menuSeparator;
            saveFormatsForTrees << graphicsFormats;

            menuChoice = SaveFileWithPopUp (filePath, saveForTreesPrompt,treeName,
                                            saveFormatsForTreesPrompt,saveFormatsForTrees);
            if (menuChoice>=0) {
                _HYCanvas   *theTree = (_HYCanvas*)GetObject (0);
                Str255 buff;
                {
                    if (menuChoice <  pidOptions) {
                        HandleTreeSave (menuChoice, filePath);
                    } else {
                        menuChoice -= pidOptions;
                        ComponentInstance grexc = OpenComponent ((Component)qtGrexComponents(menuChoice));
                        GWorldPtr         comboGW = nil;
                        if (scaleVariable.sLength&&(!IsVertical())) {
                            Rect  bRect, sRect;
                            bRect.left = bRect.top = 0;
                            bRect.right = theTree->_HYComponent::GetMaxW();
                            bRect.bottom = theTree->_HYComponent::GetMaxH()+HY_TREEPANEL_RULER_EXPANDED;
                            short errCode = NewGWorld (&comboGW,2,&bRect,0,nil,0);
                            if (errCode!=noErr) {
                                _String errMsg ("MacOS Error ");
                                errMsg = errMsg & (long)errCode &" while trying to allocate memory for GraphicPane";
                                WarnError (errMsg);
                                return true;
                            }
                            sRect = bRect;
                            sRect.bottom -= HY_TREEPANEL_RULER_EXPANDED;
                            bRect.top = HY_TREEPANEL_RULER_EXPANDED;
                            LockPixels (GetGWorldPixMap(theTree->thePane));
                            CopyBits ((BitMap*)*GetGWorldPixMap(theTree->thePane),(BitMap*)*GetGWorldPixMap(comboGW),&sRect,&bRect,srcCopy,(RgnHandle)nil);
                            UnlockPixels (GetGWorldPixMap(theTree->thePane));
                            bRect.bottom = bRect.top;
                            bRect.top = 0;
                            sRect.bottom = HY_TREEPANEL_RULER_EXPANDED-1;
                            _HYCanvas   *theRuler = (_HYCanvas*)GetObject (2);
                            LockPixels (GetGWorldPixMap(theRuler->thePane));
                            CopyBits ((BitMap*)*GetGWorldPixMap(theRuler->thePane),(BitMap*)*GetGWorldPixMap(comboGW),&sRect,&bRect,srcCopy,(RgnHandle)nil);
                            UnlockPixels (GetGWorldPixMap(theRuler->thePane));
                            GraphicsExportSetInputGWorld (grexc,comboGW);

                        } else {
                            GraphicsExportSetInputGWorld (grexc,theTree->thePane);
                        }
                        FSSpec  fs;
                        StringToStr255 (filePath,buff);
                        FSMakeFSSpec(0,0,buff,&fs);
                        GraphicsExportSetOutputFile (grexc,&fs);
                        GraphicsExportRequestSettings (grexc,nil,nil);
                        unsigned long dummy;
                        OSType t,c;
                        GraphicsExportGetDefaultFileTypeAndCreator (grexc,&t,&c);
                        GraphicsExportSetOutputFileTypeAndCreator (grexc,t,c);
                        GraphicsExportDoExport (grexc,&dummy);
                        CloseComponent (grexc);
                        if (comboGW) {
                            DisposeGWorld (comboGW);
                        }
                    }
                }
            }
            return true;
        }
        if (menuChoice==8) { // print
            _PrintTree();
            return true;
        }
        break;
    }
    case 130: { // edit
        HiliteMenu(0);
        if (menuChoice==4) { // copy
            if (treeFlags&HY_TREEPANEL_CLIPBOARD_READY) {
                CutSelectionToClipboard (false);
            } else {
#ifdef TARGET_API_MAC_CARBON
                ClearCurrentScrap();
#else
                ZeroScrap();
#endif
                //_String res = GetTreeString();
                //PutScrap (res.sLength,'TEXT',res.sData);
                _HYCanvas   *theTree = (_HYCanvas*)GetObject (0);
                Rect  bRect;
                if (scaleVariable.sLength&&(!IsVertical())) { // have ruler
                    _HYCanvas   *theRuler = (_HYCanvas*)GetObject (2);
                    Rect        bRect2;
                    bRect.left          = bRect.top = 0;
                    bRect.right         = theTree->_HYComponent::GetMaxW();
                    bRect.bottom        = theTree->_HYComponent::GetMaxH();
                    bRect2              = bRect;
                    bRect2.bottom       += theRuler->_HYComponent::GetMaxH();
                    PicHandle    pic    = OpenPicture (&bRect2);

                    /*bRect2.top            = theRuler->_HYComponent::GetMaxH();
                    GrafPtr      topPort;
                    GetPort      (&topPort);

                    LockPixels (GetGWorldPixMap(theTree->thePane));
                    CopyBits ((BitMap*)*GetGWorldPixMap(theTree->thePane),
                              (BitMap*)&(topPort->portBits),&bRect,&bRect2,
                                   srcCopy,(RgnHandle)nil);

                    UnlockPixels (GetGWorldPixMap(theTree->thePane));
                    bRect.bottom = bRect2.top;
                    bRect2.top = 0;
                    bRect2.bottom = bRect.bottom;

                    LockPixels (GetGWorldPixMap(theRuler->thePane));
                    CopyBits ((BitMap*)*GetGWorldPixMap(theRuler->thePane),
                              (BitMap*)&(topPort->portBits),&bRect,&bRect2,
                                   srcCopy,(RgnHandle)nil);
                    UnlockPixels (GetGWorldPixMap(theRuler->thePane));*/

                    ShiftScreenCoordinates (0,theRuler->_HYComponent::GetMaxH(),coordTree);
                    RenderTree (false,true);
                    ShiftScreenCoordinates (0,-theRuler->_HYComponent::GetMaxH(),coordTree);

                    ClosePicture ();
                    HLock   ((Handle)pic);
#ifdef TARGET_API_MAC_CARBON
                    ClearCurrentScrap();
                    ScrapRef         theScrapRef;
                    GetCurrentScrap(&theScrapRef);
                    PutScrapFlavor(theScrapRef, 'PICT', kScrapFlavorMaskNone,GetHandleSize((Handle)pic),*pic);
#else
                    PutScrap (GetHandleSize((Handle)pic),'PICT',*pic);
#endif
                    KillPicture (pic);

                } else {
                    bRect.left = bRect.top = 0;
                    bRect.right = theTree->_HYComponent::GetMaxW();
                    bRect.bottom = theTree->_HYComponent::GetMaxH();
                    PicHandle    pic = OpenPicture (&bRect);
                    GrafPtr      topPort;
                    GetPort      (&topPort);

                    RenderTree  (true,true);
                    /*LockPixels (GetGWorldPixMap(theTree->thePane));
                    CopyBits ((BitMap*)*GetGWorldPixMap(theTree->thePane),
                              (BitMap*)&(topPort->portBits),&bRect,&bRect,
                                   srcCopy,(RgnHandle)nil);
                    UnlockPixels (GetGWorldPixMap(theTree->thePane));*/
                    ClosePicture ();
                    HLock   ((Handle)pic);
#ifdef TARGET_API_MAC_CARBON
                    ClearCurrentScrap();
                    ScrapRef         theScrapRef;
                    GetCurrentScrap(&theScrapRef);
                    PutScrapFlavor(theScrapRef, 'PICT', kScrapFlavorMaskNone,GetHandleSize((Handle)pic),*pic);
#else
                    PutScrap (GetHandleSize((Handle)pic),'PICT',*pic);
#endif
                    KillPicture (pic);
                }
            }
            return true;
        } else if (menuChoice==6) { // delete selection
            DeleteCurrentSelection();
            _UpdateOperationsMenu();
            return true;
        } else if (menuChoice==3) { // cut selection
            CutSelectionToClipboard ();
            _UpdateOperationsMenu();
            return true;
        } else if (menuChoice==5) { // paste selection
            PasteClipboardTree();
            _UpdateOperationsMenu();
            return true;
        } else if (menuChoice==8) { // select all
            SelectAllBranches();
            return true;
        }
        if (menuChoice==1) { // undo
            UndoLastOperation();
            _UpdateOperationsMenu();
            return true;
        } else if (menuChoice==11) { // s&r
            HandleSearchAndReplace(false);
            return true;
        } else if (menuChoice==12) { // s&r in selection
            HandleSearchAndReplace(true);
            return true;
        }
        return false;
    }
    case HY_TREEPANEL_MENU_ID: {
        treeMenu = GetMenuHandle (HY_TREEPANEL_MENU_ID);
        switch (menuChoice) {
            unsigned short newF;
        case 1:
            if (treeFlags&HY_TREEPANEL_TIP_LABELS) {
                newF = treeFlags - HY_TREEPANEL_TIP_LABELS;
                SetFlags (newF);
            } else {
                newF = treeFlags + HY_TREEPANEL_TIP_LABELS;
                SetFlags (newF);
            }
            CheckMenuItem (treeMenu,1,(treeFlags&HY_TREEPANEL_TIP_LABELS));
            break;

        case 2:
            if (treeFlags&HY_TREEPANEL_INT_LABELS) {
                newF = treeFlags - HY_TREEPANEL_INT_LABELS;
                SetFlags (newF);
            } else {
                newF = treeFlags + HY_TREEPANEL_INT_LABELS;
                SetFlags (newF);
            }
            CheckMenuItem (treeMenu,2,(treeFlags&HY_TREEPANEL_INT_LABELS));
            break;

        case 4: { // SWAP SUBTREES
            SwapSelectedSubTrees();
            break;
        }

        case 5: { // COLLAPSE BRANCH
            CollapseSelectedBranch ();
            break;
        }

        case 6: { // COLLAPSE BRANCH
            JoinSelectedBranches();
            break;
        }

        case 7: { // Graft A Tip
            GraftATip();
            break;
        }

        case 8: { // Reroot Tree
            RerootTree();
            break;
        }

        case 9: { // Flip tree
            FlipSelectedBranches();
            break;
        }

        case 13: { // Invoke node editor
            InvokeNodeEditor();
            break;
        }

        case 15: { // Optimize again
            RecalculateLikelihood();
            break;
        }

        case 16: { // Display Parameter Table
            DisplayParameterTable();
            break;
        }

        case 18: {
            HandleViewOptions ();
            break;
        }

        case 21:
        case 22: {
            ShowModelMatrix (menuChoice-21);
            break;
        }

        case 24:
        case 25: {
            GenerateDistanceTable (menuChoice-24);
            break;
        }

        case 28: {
            MatchToDataSet ();
            break;
        }

        }
        if ((menuChoice>2)&&(menuChoice<15)) {
            _UpdateOperationsMenu();
        }
        break;
    }
    case HY_TREEPANEL_HMENU_ID: { // edit
        HandleLabels(menuChoice-1);
        break;
    }
    case HY_TREEPANEL_HMENU_ID+1: { // select
        HandleSelection (menuChoice-1);
        _UpdateOperationsMenu();
        break;
    }
    case HY_TREEPANEL_HMENU_ID+2: { // compare
        HandleComparison (menuChoice-1);
        _UpdateOperationsMenu();
        break;
    }
    case HY_TREEPANEL_HMENU_ID+3: { // compare
        ExecuteProcessor (menuChoice-1);
        _UpdateOperationsMenu();
        break;
    }

    }

    HiliteMenu(0);
    InvalMenuBar();
    return false;
}

//__________________________________________________________________

void        _HYTreePanel::_PaintNavRect(void)
{
    navRect = ComputeNavRect();
    _HYCanvas* theCanvas = (_HYCanvas*)GetObject (1);
    GrafPtr savedPort;
    GetPort(&savedPort);
#ifdef OPAQUE_TOOLBOX_STRUCTS
    SetPort(GetWindowPort(theWindow));
#else
    SetPort(theWindow);
#endif
    Rect r;
    r.left = navRect.left+theCanvas->rel.left+HY_TREEPANEL_NAVSPACING;
    r.right = navRect.right+theCanvas->rel.left;
    r.top = navRect.top+theCanvas->rel.top+HY_TREEPANEL_NAVSPACING;
    r.bottom = navRect.bottom+theCanvas->rel.top;
    RGBColor saveColor, newColor = {255*256,151*256,51*256};
    PenState ps;
    GetPenState (&ps);
    PenSize (2,2);
    GetForeColor (&saveColor);
    RGBForeColor (&newColor);
    FrameRect (&r);
    _PaintLFStatus ();
    RGBForeColor (&saveColor);
    SetPenState (&ps);
    SetPort(savedPort);
}

//__________________________________________________________________

void        _HYTreePanel::_PaintLFStatus(Ptr)
{
    GrafPtr savedPort;
    GetPort(&savedPort);
#ifdef OPAQUE_TOOLBOX_STRUCTS
    SetPort(GetWindowPort(theWindow));
#else
    SetPort(theWindow);
#endif
    if (likeFuncID<0) {
        _PaintTheCircle (redButtonIcon,theWindow);
    } else {
        if (dubiousNodes.lLength) {
            _PaintTheCircle (yellowButtonIcon,theWindow);
        } else {
            _PaintTheCircle (greenButtonIcon,theWindow);
        }
    }
    SetPort(savedPort);
}

//__________________________________________________________________

void        _HYTreePanel::_PrintTree(long hPages, long vPages)
{
    if ((hPages<0)||(vPages<0)) {
        if (!TreePrintSetup (hPages, vPages, (Ptr)this)) {
            return;
        }
    }

    _HYCanvas* theCanvas = (_HYCanvas*)GetObject (0);

    GrafPtr     savePort;
    GetPort(&savePort);
#ifdef      TARGET_API_MAC_CARBON
    PMRect prRect;
#else
    TPrStatus   prStatus;
    TPPrPort    printPort;
    OSErr       err;
#endif

#ifdef TARGET_API_MAC_CARBON
    OSStatus theStatus;
    Boolean isAccepted;

    PMPrintSession hyPC;
    theStatus = PMCreateSession(&hyPC);
    if (theStatus != noErr) {
        return;
    }

#endif

    if (!InitPrint(hyPC)) {
        _String errMsg ("Could not initialize printing variables.");
        WarnError (errMsg);
        terminateExecution = false;
        return;
    }

    //GetPort(&savePort);

#ifdef TARGET_API_MAC_CARBON
    if (gPrintSettings != kPMNoPrintSettings) {
        theStatus = PMSessionValidatePrintSettings(hyPC,gPrintSettings, kPMDontWantBoolean);
    } else {
        theStatus = PMCreatePrintSettings(&gPrintSettings);

        if ((theStatus == noErr) && (gPrintSettings != kPMNoPrintSettings)) {
            theStatus = PMSessionDefaultPrintSettings(hyPC,gPrintSettings);
        }
    }

    if (theStatus == noErr) {
        theStatus = PMSessionPrintDialog(hyPC,gPrintSettings, gPageFormat, &isAccepted);

        if (isAccepted) {
            theStatus = PMGetAdjustedPageRect(gPageFormat, &prRect);
            if (theStatus != noErr) {
                PMRelease(hyPC);
                return;
            }

            theStatus = PMSessionBeginDocument(hyPC,gPrintSettings, gPageFormat);
            if (theStatus != noErr) {
                PMRelease(hyPC);
                return;
            }

            //GrafPtr  prPortGPTR;
            //PMGetGrafPtr (thePrintingPort,&prPortGPTR);

            long     pageW    = prRect.right-prRect.left-2,
                     pageH    = prRect.bottom-prRect.top-2;

            UInt32   startPage,
                     endPage;

            //SetPort (prPortGPTR);

            PMGetFirstPage (gPrintSettings,&startPage);
            PMGetLastPage  (gPrintSettings,&endPage);
#else
    PrOpen();
    if (err=PrError()) {
        _String errMsg ("Could not print the tree. Error Code:");
        errMsg = errMsg & (long)err;
        WarnError (errMsg);
        terminateExecution = false;
        {
            PrClose();
            return;
        }
    }

    if (PrJobDialog(prRecHdl)) {
        printPort = PrOpenDoc(prRecHdl, nil, nil);
        SetPort((GrafPtr)printPort);
        long    startPage = (*prRecHdl)->prJob.iFstPage,
                endPage = (*prRecHdl)->prJob.iLstPage,
                pageW = (*prRecHdl)->prInfo.rPage.right-2;
        pageH = (*prRecHdl)->prInfo.rPage.bottom-2;
#endif

            long    visW    = theCanvas->_HYComponent::GetMaxW(),
                    visH  = theCanvas->_HYComponent::GetMaxH(),
                    printW  = pageW * hPages,
                    printH  = pageH * vPages;

            if (hPages <= 0) {
                hPages = visW/pageW;
                if (visW%pageW == 0) {
                    hPages ++;
                }

                printW= pageW * hPages;
            }

            if (vPages <= 0) {
                vPages = visH/pageH;
                if (visH%pageH == 0) {
                    vPages ++;
                }

                printH = pageH * vPages;
            }

            bool    hasRuler = (scaleVariable.sLength)&&(!IsVertical());

            _HYFont oldFont  = treeLabelFont,
                    bf1      = branchLabel1,
                    bf2       = branchLabel2;

            _Parameter hsc   = 1.0,
                       vsc   = 1.0;

            if (visW>printW) {
                hsc = (_Parameter)printW/visW;
            }
            if (hasRuler) {
                printH -= HY_TREEPANEL_RULER_EXPANDED;
            }
            if (visH>printH) {
                vsc = (_Parameter)printH/visH;
            }

            if ((hsc<1.0)||(vsc<1.0)) {
                treeLabelFont.size = ((_Parameter)treeLabelFont.size)*MIN(hsc,vsc);
                if (treeLabelFont.size<4) {
                    treeLabelFont.size = 4;
                }

                bf1.size = ((_Parameter)bf1.size)*MIN(hsc,vsc);
                bf2.size = ((_Parameter)bf2.size)*MIN(hsc,vsc);
                ShiftScreenCoordinates  (-windowTextMarginH,-windowTextMarginV,coordTree);
                Convert2ScreenCoordinates (hsc,vsc,0,coordTree);
            }
            if (visW<printW) {
                visW = (printW-visW)/2;
            } else {
                visW = 0;
            }

            if (visH<printH) {
                visH = (printH-visH)/2;
            } else {
                visH = 0;
            }

            if (IsVertical()) {
                long t = visH;
                visH = visW;
                visW = t;
            }

            //theCanvas->SetFont (treeLabelFont);

            for (long hCount = 0; hCount < hPages; hCount ++)
                for (long vCount = 0; vCount < vPages; vCount ++) {
#ifdef TARGET_API_MAC_CARBON
                    theStatus = PMSessionBeginPage(hyPC,gPageFormat,NULL);
                    if (theStatus != noErr) {
                        PMRelease(hyPC);
                        return;
                    }
                    GrafPtr ppPort;
                    PMSessionGetGraphicsContext (hyPC, NULL, (void**)&ppPort);
                    SetPort (ppPort);
#else
                    PrOpenPage      (printPort, nil);
#endif


                    if (visH||visW) {
                        ShiftScreenCoordinates  (visW,hasRuler?visH+HY_TREEPANEL_RULER_EXPANDED-5:visH,coordTree);
                    } else if (hasRuler&&(vCount==0)) {
                        ShiftScreenCoordinates  (0,HY_TREEPANEL_RULER_EXPANDED-5,coordTree);
                    }

                    if (hCount||vCount) {
                        ShiftScreenCoordinates  (-pageW*hCount,-pageH*vCount, coordTree);
                    }


                    if (hasRuler && (vCount == 0)) {
                        RenderRuler (hsc,true,visW,visH);
                    }

                    theCanvas->SetFont (treeLabelFont);

                    if (treeFlags&HY_TREEPANEL_ARCS) {
                        PaintArcs(theCanvas, coordTree);
                    } else if (treeFlags&(HY_TREEPANEL_STRAIGHT|HY_TREEPANEL_CIRCULAR)) {
                        PaintStraight(theCanvas, coordTree);
                    } else {
                        if (IsVertical()) {
                            PaintVSquare(theCanvas, coordTree);
                        } else {
                            PaintSquare(theCanvas, coordTree);
                            if (treeFlags&HY_TREEPANEL_LABEL1) {
                                theCanvas->SetFont(bf1);
                                PaintSquareBranchLabels (theCanvas,coordTree,true);
                            }
                            if (treeFlags&HY_TREEPANEL_LABEL2) {
                                theCanvas->SetFont(bf2);
                                PaintSquareBranchLabels (theCanvas,coordTree,false);
                            }
                        }
                    }

                    if (visH||visW) {
                        ShiftScreenCoordinates  (-visW,hasRuler?-visH-HY_TREEPANEL_RULER_EXPANDED+5:-visH,coordTree);
                    } else if (hasRuler&&(vCount==0)) {
                        ShiftScreenCoordinates  (0,-HY_TREEPANEL_RULER_EXPANDED+5,coordTree);
                    }

                    if (hCount||vCount) {
                        ShiftScreenCoordinates  (pageW*hCount, pageH*vCount,coordTree);
                    }

#ifdef TARGET_API_MAC_CARBON
                    PMSessionEndPage(hyPC);
#else
                    PrClosePage(printPort);
#endif

                }

            if ((hsc<1.0)||(vsc<1.0)) {
                ShiftScreenCoordinates  (-windowTextMarginH,-windowTextMarginV,coordTree);
                Convert2ScreenCoordinates (1.0/hsc,1.0/vsc,0,coordTree);
            }

            treeLabelFont = oldFont;
            theCanvas->SetFont (treeLabelFont);


#ifdef TARGET_API_MAC_CARBON
            theStatus = PMSessionEndDocument(hyPC);
            SetPort(savePort);
            if (theStatus == noErr) {
                if (gFlattenedFormat != NULL) {
                    DisposeHandle(gFlattenedFormat);
                    gFlattenedFormat = NULL;
                }

                theStatus = PMFlattenPageFormat(gPageFormat, &gFlattenedFormat);
            }

            if (theStatus == noErr) {
                if (gFlattenedSettings != NULL) {
                    DisposeHandle(gFlattenedSettings);
                    gFlattenedSettings = NULL;
                }

                theStatus = PMFlattenPrintSettings(gPrintSettings, &gFlattenedSettings);
            }

            if (gPageFormat != kPMNoPageFormat) {
                theStatus = PMRelease(gPageFormat);
                gPageFormat = kPMNoPageFormat;
            }

            if (gPrintSettings != kPMNoPrintSettings) {
                theStatus = PMRelease(gPrintSettings);
                gPrintSettings = kPMNoPrintSettings;
            }

            theStatus = PMRelease(hyPC);

#else
            PrCloseDoc(printPort);
            if (((*prRecHdl)->prJob.bJDocLoop = bSpoolLoop) && (!PrError() ) ) {
                PrPicFile(prRecHdl, nil, nil, nil, &prStatus);
            }
#endif
        }
#ifdef TARGET_API_MAC_CARBON
        else {
            theStatus = PMRelease(hyPC);
        }
#endif

#ifdef TARGET_API_MAC_CARBON
    }
#else
        PrClose();
        SetPort(savePort);
#endif
}

//__________________________________________________________________

void _HYTreePanel::_SetMenuBar(void)
{
    _HYWindow::_SetMenuBar();
    MenuHandle  t = GetMenuHandle (130);
    EnableMenuItem (t,4);
    EnableMenuItem (t,8);


    MenuHandle treeMenu = GetMenuHandle (HY_TREEPANEL_MENU_ID);
    if (!treeMenu) {
        MenuHandle labelMenu  = NewMenu(HY_TREEPANEL_HMENU_ID,"\pLabels");
        MenuHandle selectMenu = NewMenu(HY_TREEPANEL_HMENU_ID+1,"\pSelect Branches");
        MenuHandle compMenu   = NewMenu(HY_TREEPANEL_HMENU_ID+2,"\pTree comparison");
        MenuHandle procMenu   = NewMenu(HY_TREEPANEL_HMENU_ID+3,"\pAdditional Tools");

        treeMenu = NewMenu(HY_TREEPANEL_MENU_ID,"\pTree");

        if (!(treeMenu&&selectMenu&&labelMenu&&compMenu)) {
            warnError (-108);
        }

        InsertMenuItem (treeMenu,"\pInternal Labels",0);        // 1
        InsertMenuItem (treeMenu,"\pTip Labels",0);             // 2
        CheckMenuItem (treeMenu,1,treeFlags&HY_TREEPANEL_TIP_LABELS);
        CheckMenuItem (treeMenu,2,treeFlags&HY_TREEPANEL_INT_LABELS);
        InsertMenuItem (treeMenu,"\p(-",1000);                  // 3
        InsertMenuItem (treeMenu,"\p(Swap Subtrees/1",1000);    // 4
        InsertMenuItem (treeMenu,"\p(Collapse Branch/2",1000);  // 5
        InsertMenuItem (treeMenu,"\p(Join/3",1000);             // 6
        InsertMenuItem (treeMenu,"\p(Graft A Tip/4",1000);      // 7
        InsertMenuItem (treeMenu,"\p(Reroot/5",1000);           // 8
        InsertMenuItem (treeMenu,"\p(Flip tip ordering/6",1000);// 9
        InsertMenuItem (treeMenu,"\p(-",1000);                  // 10
        InsertMenuItem (treeMenu,"\pSelect Branches",1000);     // 11
        InsertMenuItem (treeMenu,"\p(-",1000);                  // 12
        InsertMenuItem (treeMenu,"\pEdit Properties",1000);     // 13
        InsertMenuItem (treeMenu,"\p(-",1000);                  // 14
        InsertMenuItem (treeMenu,"\p(Optimize Again/T",1000);   // 15
        InsertMenuItem (treeMenu,"\p(Show Parameters in Table/H",1000); // 16
        InsertMenuItem (treeMenu,"\p(-",1000);                         // 17
        InsertMenuItem (treeMenu,"\pTree Display Options...",1000);    // 18
        InsertMenuItem (treeMenu,"\pBranch Labels",1000);              // 19
        InsertMenuItem (treeMenu,"\p(-",1000);                         // 20
        InsertMenuItem (treeMenu,"\p(Show Rate Matrix",1000);          // 21
        InsertMenuItem (treeMenu,"\p(Show Transition Matrix",1000);    // 22
        InsertMenuItem (treeMenu,"\p(-",1000);                         // 23
        InsertMenuItem (treeMenu,"\pPairwise Distances",1000);         // 24
        InsertMenuItem (treeMenu,"\pBranch Length Distribution",1000); // 25

        InsertMenuItem (treeMenu,"\p(-",1000);                         // 26
        InsertMenuItem (treeMenu,"\pTree Comparison",1000);            // 27
        InsertMenuItem (treeMenu,"\pMatch Leaves To Sequence Data",1000); // 28

        InsertMenuItem (treeMenu,"\p(-",1000); // 29
        InsertMenuItem (treeMenu,"\pAdditional Tools",1000); // 30

        InsertMenu      (procMenu,hierMenu);


        InsertMenuItem (labelMenu,"\pAbove Branches.../8",1000);
        InsertMenuItem (labelMenu,"\pBelow Branches.../9",1000);

        InsertMenuItem (selectMenu,"\p(Select Entire Subtree",1000);
        InsertMenuItem (selectMenu,"\pSelect Incomplete Branches/I",1000);
        InsertMenuItem (selectMenu,"\pSelect Branches Without Models",1000);
        InsertMenuItem (selectMenu,"\pSelect Branches By Name",1000);
        InsertMenuItem (selectMenu,"\pSelect Branches By Branch Length",1000);
        InsertMenuItem (selectMenu,"\pInvert Selection",1000);
        InsertMenuItem (selectMenu,"\pExtend Selection",1000);
        InsertMenuItem (selectMenu,"\pMap Selection to Data Panel",1000);
        InsertMenuItem (selectMenu,"\pMap Selection to Another Tree",1000);

        InsertMenuItem (compMenu,"\pTest For Equality",1000);
        InsertMenuItem (compMenu,"\pFind Subtree In Another Tree",1000);
        InsertMenuItem (compMenu,"\pFind Maximal Common Subtree",1000);
        InsertMenuItem (compMenu,"\pFind Maximal Common Forest",1000);
        InsertMenuItem (compMenu,"\pMatch To Tree Pattern",1000);

        InsertMenu (selectMenu,hierMenu);
        InsertMenu (labelMenu, hierMenu);
        InsertMenu (compMenu, hierMenu);

        SetItemCmd (treeMenu,19,hMenuCmd);
        SetItemMark(treeMenu,19,HY_TREEPANEL_HMENU_ID);

        SetItemCmd (treeMenu,11,hMenuCmd);
        SetItemMark(treeMenu,11,HY_TREEPANEL_HMENU_ID+1);

        SetItemCmd (treeMenu,27,hMenuCmd);
        SetItemMark(treeMenu,27,HY_TREEPANEL_HMENU_ID+2);

        SetItemCmd (treeMenu,30,hMenuCmd);
        SetItemMark(treeMenu,30,HY_TREEPANEL_HMENU_ID+3);

        InsertMenu (treeMenu,132);
        t = GetMenuHandle (129);
        EnableMenuItem (t,1);

        t = GetMenuHandle (130);
        InsertMenuItem (t,"\p(-",1000);                              // 10
        InsertMenuItem (t,"\pSearch and Replace/F",1000);            // 11
        InsertMenuItem (t,"\pSearch and Replace in Selection",1000); // 12

        if (treeProcessors.lLength == 0) {
            DisableMenuItem (treeMenu,30);
        } else {
            Str255    buffer;
            for (long k=0; k<treeProcessors.lLength; k++) {
                _String *thisItem = (_String*)treeProcessors (k),
                         chopped = thisItem->Cut (thisItem->FindBackwards (':',0,-1)+1,-1);
                StringToStr255  (chopped,buffer);
                InsertMenuItem  (procMenu, buffer,10000);
            }
        }

    }
    _UpdateOperationsMenu();
    InvalMenuBar();
}

//__________________________________________________________________

void _HYTreePanel::_UpdateOperationsMenu (void)
{
    node<nodeCoord>* node1, *node2, *t;

    MenuHandle      treeMenu   = GetMenuHandle (HY_TREEPANEL_MENU_ID),
                    selectMenu = GetMenuHandle (HY_TREEPANEL_HMENU_ID+1),
                    compMenu   = GetMenuHandle (HY_TREEPANEL_HMENU_ID+2),
                    editMenu   = GetMenuHandle (130);

    DisableMenuItem (treeMenu,4);
    DisableMenuItem (treeMenu,5);
    DisableMenuItem (treeMenu,6);
    DisableMenuItem (treeMenu,7);
    DisableMenuItem (treeMenu,8);
    DisableMenuItem (treeMenu,9);
    //DisableMenuItem (treeMenu,12);
    DisableMenuItem (treeMenu,13);
    DisableMenuItem (treeMenu,21);
    DisableMenuItem (treeMenu,22);
    DisableMenuItem (editMenu,6);
    DisableMenuItem (editMenu,12);


    DisableMenuItem (selectMenu,1);
    DisableMenuItem (selectMenu,7);
    DisableMenuItem (selectMenu,8);
    DisableMenuItem (selectMenu,9);

    DisableMenuItem (compMenu,2);

    bool  good = true;
    long  k,j;
    if (currentSelection.lLength==2) {
        node1 = (node<nodeCoord>*)currentSelection(0);
        node2 = (node<nodeCoord>*)currentSelection(1);
        t = node1->parent;
        while (t) {
            if (t==node2) {
                good = false;
                break;
            }
            t = t->parent;
        }
        if (good) {
            t = node2->parent;
            while (t) {
                if (t==node1) {
                    good = false;
                    break;
                }
                t = t->parent;
            }
        }
        if (good) {
            EnableMenuItem (treeMenu,4);
        }
    }
    if (currentSelection.lLength) {
        EnableMenuItem (treeMenu,7);
        EnableMenuItem (treeMenu,13);
        EnableMenuItem (selectMenu,7);
        EnableMenuItem (selectMenu,8);
        EnableMenuItem (selectMenu,9);
        EnableMenuItem (editMenu,12);
        for (k=0; k<currentSelection.lLength; k++) {
            node1 = (node<nodeCoord>*)currentSelection(k);
            if (node1->get_num_nodes()) {
                EnableMenuItem (treeMenu,5);
                break;
            }
        }
        for (k=0; k<currentSelection.lLength; k++) {
            node1 = (node<nodeCoord>*)currentSelection(k);
            if (!node1->get_num_nodes()) {
                EnableMenuItem (editMenu,6);
                break;
            }
        }
        if (currentSelection.lLength>=2) {
            node1 = (node<nodeCoord>*)currentSelection(0);
            t = node1->parent;
            if (t&&(t->get_num_nodes()>currentSelection.lLength)) {
                for (k=1; k<currentSelection.lLength; k++) {
                    node1 = (node<nodeCoord>*)currentSelection(k);
                    if (node1->parent!=t) {
                        break;
                    }
                }
                if (k==currentSelection.lLength) {
                    EnableMenuItem (treeMenu,6);
                }
            }
        } else {
            node1 = (node<nodeCoord>*)currentSelection(0);
            if (node1->parent) {
                EnableMenuItem(treeMenu,8);
                SetMenuItemText (treeMenu,8,"\pReroot");
            }
            if (node1->get_num_nodes()>0) {
                EnableMenuItem(treeMenu,9);
                EnableMenuItem(selectMenu,1);
            }
            if (node1->in_object.varRef>=0) {
                _CalcNode* thisCNode = (_CalcNode*)LocateVar(node1->in_object.varRef);

                if (thisCNode&&(thisCNode->GetModelIndex() != HY_NO_MODEL)) {
                    EnableMenuItem (treeMenu,21);
                    EnableMenuItem (treeMenu,22);
                }
            }
        }
    } else {
        _TheTree *me = LocateMyTreeVariable();
        if (me) {
            if (me->RootedFlag()==UNROOTED) {
                EnableMenuItem(treeMenu,8);
                SetMenuItemText (treeMenu,8,"\pBalance");
            } else {
                EnableMenuItem(treeMenu,8);
                SetMenuItemText (treeMenu,8,"\pUnroot");
            }
        }
    }
    if (likeFuncID!=-1) {
        EnableMenuItem (treeMenu,15);
        EnableMenuItem (treeMenu,16);
    } else {
        DisableMenuItem (treeMenu,15);
        DisableMenuItem (treeMenu,16);
    }

    treeMenu = GetMenuHandle(130);
    if ((treePanelClipboardRoot)&&(currentSelection.lLength==1)) {
        EnableMenuItem (treeMenu,5);
    } else {
        DisableMenuItem(treeMenu,5);
    }

    DisableMenuItem(treeMenu,3);
    // check if can cut/paste
    t = nil;

    for (k=0; k<currentSelection.lLength; k++) {
        node1 = (node<nodeCoord>*)currentSelection.lData[k];
        if (node1->parent) {
            if (currentSelection.Find((long)node1->parent)<0) {
                if (t) {
                    break;
                } else {
                    t = node1;
                }
            }
            for (j=0; j<node1->nodes.length; j++) {
                if (currentSelection.Find((long)node1->nodes.data[j])<0) {
                    break;
                }
            }
            if (j<node1->nodes.length) {
                break;
            }
        } else {
            if (t) {
                break;
            } else {
                t = node1;
            }
        }
    }
    selectionTop = nil;
    treeFlags &= 0xFF7F;
    if (t&&(t->parent!=coordTree)&&(t->parent)) {
        if (k==currentSelection.lLength) {
            EnableMenuItem(treeMenu,3);
            EnableMenuItem(compMenu,2);

            selectionTop = t;
            treeFlags |= HY_TREEPANEL_CLIPBOARD_READY;
        }
    }
    _String undoMessage;
    EnableMenuItem (treeMenu,1);
    switch (undoCode) {
    case 1:
        undoMessage = "Undo Swap";
        break;
    case 2:
        undoMessage = "Undo Flip";
        break;
    case 3:
        undoMessage = "Undo Collapse";
        break;
    case 4:
        undoMessage = "Undo Delete";
        break;
    case 5:
        undoMessage = "Undo Join";
        break;
    case 6:
        undoMessage = "Undo Cut";
        break;
    case 7:
        undoMessage = "Undo Graft";
        break;
    case 8:
        undoMessage = "Undo Paste";
        break;
    case 9:
        undoMessage = "Undo Subtree Move";
        break;
    default:
        undoMessage = "Can't Undo";
        DisableMenuItem (treeMenu,1);
    }
    Str255 s255;
    StringToStr255 (undoMessage, s255);
    SetMenuItemText (treeMenu,1,s255);
}

//__________________________________________________________________

void _HYTreePanel::_UnsetMenuBar(void)
{
    MenuHandle treeMenu     = GetMenuHandle (HY_TREEPANEL_MENU_ID),
               labelMenu     = GetMenuHandle (HY_TREEPANEL_HMENU_ID),
               selectMenu   = GetMenuHandle (HY_TREEPANEL_HMENU_ID+1),
               compMenu        = GetMenuHandle (HY_TREEPANEL_HMENU_ID+2);


    DeleteMenu (HY_TREEPANEL_MENU_ID);
    DeleteMenu (HY_TREEPANEL_HMENU_ID);
    DeleteMenu (HY_TREEPANEL_HMENU_ID+1);
    DeleteMenu (HY_TREEPANEL_HMENU_ID+2);
    DisposeMenu (treeMenu);
    DisposeMenu (labelMenu);
    DisposeMenu (selectMenu);
    DisposeMenu (compMenu);

    compMenu        = GetMenuHandle (130);
    DeleteMenuItem (compMenu,10);
    DeleteMenuItem (compMenu,10);
    DeleteMenuItem (compMenu,10);

    _HYWindow::_UnsetMenuBar();
}

//EOF
\ No newline at end of file
diff --git a/src/gui/mac/hydialogs.cpp b/src/gui/mac/hydialogs.cpp
new file mode 100644
index 0000000..7533c40
--- /dev/null
+++ b/src/gui/mac/hydialogs.cpp
@@ -0,0 +1,774 @@
+
+#include "stdio.h"
+#include "ctype.h"
+#include "string.h"
+#include "batchlan.h"
+#include "HYTreePanel.h"
+#include "HYDataPanel.h"
+#include "HYObjectInspector.h"
+#include "HYUtils.h"
+#ifndef  TARGET_API_MAC_CARBON
+#include <StandardFile.h>
+#endif
+#include "Navigation.h"
+#include "TextEdit.h"
+#include "HYModelWindow.h"
+#include "HYChartWindow.h"
+
+#include "Movies.h"
+#include <QuickTimeComponents.h>
+#include <ImageCompression.h>
+#include "Script.h"
+
+
+extern  _String*  argFileName,
+        dialogPrompt;
+
+extern  _SimpleList
+windowPtrs,
+windowObjects;
+
+extern  bool      echoPaused;
+extern  long      lastMatrixDeclared;
+
+extern  _String   objectInspectorTitle ;
+
+
+_String MacSimpleFileOpen       (void);
+_String MacSimpleFileSave       (void);
+void    GetFullPathName         (FSSpec&, _String&);
+
+
+_List               movieFormats;
+_SimpleList         qtMovieGrexComponents;
+
+
+NavPreviewUPP             previewFunctionHook = nil;
+
+pascal void HYOpenEventProc (NavEventCallbackMessage,NavCBRecPtr,void * );
+pascal Boolean HYOpenTextPreview (NavCBRecPtr , void *);
+void  findMovieExporterComponents(_List& , _SimpleList& );
+
+
+//_________________________________________________________________________
+Str255      hpName = "\pHY-PHY";
+
+pascal void HYOpenEventProc (NavEventCallbackMessage callBackSelector,
+                             NavCBRecPtr callBackParms,
+                             void * )
+{
+    if (callBackSelector==kNavCBEvent) {
+        EventRecord* theEvent = callBackParms->eventData.eventDataParms.event;
+        if ((theEvent->what == activateEvt)||(theEvent->what == updateEvt)) {
+            if (theEvent->message != (long)callBackParms->window) {
+                long k = windowPtrs.Find((long)theEvent->message);
+                if (k>=0) {
+                    _HYPlatformWindow* clickedWindow = (_HYPlatformWindow*)windowObjects (k);
+                    clickedWindow->_ProcessOSEvent ((Ptr)theEvent);
+                }
+            }
+        }
+    }
+}
+
+//_________________________________________________________________________
+
+pascal Boolean HYOpenTextPreview (NavCBRecPtr callBackParms, void *)
+{
+    AEDescList * fdesc = (AEDesc*)callBackParms->eventData.eventDataParms.param,
+                 fspec;
+    OSErr  navErr;
+
+    _String    preview ("No preview available");
+    if ((navErr=AECoerceDesc(fdesc,typeFSS,&fspec))==noErr) {
+        FSSpec*     fSR = (FSSpec*)*(fdesc->dataHandle);
+        _String feedback;
+        GetFullPathName (*fSR, feedback);
+        terminateExecution = false;
+        //printf ("%s\n",feedback.getStr());
+        FILE * F = doFileOpen (feedback.sData,"r");
+        if (F) {
+            char buffer [1024];
+            buffer[fread (buffer,1,1023,F)]=0;
+            fclose (F);
+            preview = buffer;
+            preview = preview.Replace("\n","\r",true);
+        }
+    }
+    AEDisposeDesc (&fspec);
+#ifdef OPAQUE_TOOLBOX_STRUCTS
+    GrafPtr thisPort = GetWindowPort(callBackParms->window),
+            savePort;
+#else
+    GrafPtr thisPort = (GrafPtr)callBackParms->window,
+            savePort;
+#endif
+    GetPort (&savePort);
+    SetPort (thisPort);
+#ifdef OPAQUE_TOOLBOX_STRUCTS
+    short   savedFace = GetPortTextFont (thisPort),
+            savedSize = GetPortTextSize (thisPort);
+
+    Style   savedStyle = GetPortTextFace (thisPort);
+#else
+    short   savedFace = thisPort->txFont,
+            savedSize = thisPort->txSize;
+
+    Style   savedStyle = thisPort->txFace;
+#endif
+    RGBColor saveColor,
+             black = {0,0,0};
+    GetForeColor (&saveColor);
+    RGBForeColor (&black);
+    TextFont (kFontIDHelvetica);
+    TextSize (9);
+    TextFace (0);
+    TETextBox (preview.sData,preview.sLength,&callBackParms->previewRect,teFlushLeft);
+    TextFont (savedFace);
+    TextSize (savedSize);
+    TextFace (savedStyle);
+    RGBForeColor (&saveColor);
+    SetPort (savePort);
+    return   true;
+}
+
+//_________________________________________________________________________
+
+_String MacSimpleFileOpen (void)
+{
+    if (previewFunctionHook == nil) {
+        previewFunctionHook = NewNavPreviewUPP(HYOpenTextPreview);
+    }
+
+    _String             feedback;
+    OSErr               navErr;
+    NavReplyRecord      navRR;
+    NavDialogOptions    navDO;
+    NavEventUPP         navEF = NewNavEventUPP (HYOpenEventProc);
+    NavPreviewUPP       navPF = previewFunctionHook;
+
+    terminateExecution       = true;
+
+    NavTypeListHandle   navLH =  (NavTypeListHandle)NewHandle(sizeof(NavTypeList) + (3 * sizeof(OSType)));
+
+    (*navLH)->componentSignature = 'MuSe';
+    (*navLH)->osTypeCount = 2;
+    (*navLH)->osType[0] = '****';
+    (*navLH)->osType[1] = 'TEXT';
+
+    navDO.version       =   kNavDialogOptionsVersion;
+    navDO.location      =   (Point) {
+        -1,-1
+    };
+    navDO.dialogOptionFlags
+        =   kNavAllFilesInPopup|kNavSelectAllReadableItem|kNavAllowPreviews|kNavDontAutoTranslate;
+    StringToStr255      (dialogPrompt,navDO.windowTitle);
+    memcpy (navDO.clientName,hpName,hpName[0]+1);
+    navDO.actionButtonLabel[0]
+        =   0;
+    navDO.cancelButtonLabel[0]
+        =   0;
+    navDO.message[0]    =   0;
+    navDO.preferenceKey =   0;
+    navDO.popupExtension=   nil;
+
+    navErr = NavGetFile (nil,
+                         &navRR,
+                         &navDO,
+                         navEF,
+                         navPF,
+                         nil,
+                         navLH,
+                         nil);
+
+    if (navErr == noErr) {
+        if (navRR.validRecord) {
+            long countAED;
+            if (noErr==AECountItems(&navRR.selection,&countAED)) {
+                if (countAED==1) {
+                    char    fileRec [2048];
+                    Size    actualSize;
+                    AEKeyword   keywd;
+                    DescType    returnedType;
+                    FSSpec*     fSR;
+                    navErr= AEGetNthPtr(&navRR.selection, 1, typeFSS, &keywd,
+                                        &returnedType, fileRec,
+                                        sizeof(FSSpec), &actualSize);
+                    if (navErr==noErr) {
+                        fSR = (FSSpec*)fileRec;
+                        GetFullPathName (*fSR, feedback);
+                        terminateExecution = false;
+                    }
+                }
+            }
+        }
+        NavDisposeReply (&navRR);
+    }
+#ifdef TARGET_API_MAC_CARBON
+    DisposeNavEventUPP (navEF);
+#endif
+    DisposeHandle ((Handle)navLH);
+    return      feedback;
+}
+
+//_________________________________________________________________________
+
+_String ChooseAFolder (_String& promptString)
+{
+    _String             feedback;
+    OSErr               navErr;
+    NavReplyRecord      navRR;
+    NavDialogOptions    navDO;
+#ifdef TARGET_API_MAC_CARBON
+    NavEventUPP         navEF = NewNavEventUPP (HYOpenEventProc);
+#else
+    NavEventUPP         navEF = NewNavEventProc (HYOpenEventProc);
+#endif
+
+    terminateExecution       = true;
+
+    navDO.version       =   kNavDialogOptionsVersion;
+    navDO.location      =   (Point) {
+        -1,-1
+    };
+    navDO.dialogOptionFlags
+        =   kNavAllFilesInPopup|kNavSelectAllReadableItem|kNavAllowPreviews;
+    StringToStr255      (promptString,navDO.windowTitle);
+    memcpy (navDO.clientName,hpName,hpName[0]+1);
+
+    navDO.actionButtonLabel[0]
+        =   0;
+    navDO.cancelButtonLabel[0]
+        =   0;
+    navDO.message[0]    =   0;
+    navDO.preferenceKey =   0;
+    navDO.popupExtension=   nil;
+
+    navErr = NavChooseFolder (nil,
+                              &navRR,
+                              &navDO,
+                              navEF,
+                              nil,
+                              nil);
+
+    if (navErr == noErr) {
+        if (navRR.validRecord) {
+            long countAED;
+            if (noErr==AECountItems(&navRR.selection,&countAED)) {
+                if (countAED==1) {
+                    char    fileRec [2048];
+                    Size    actualSize;
+                    AEKeyword   keywd;
+                    DescType    returnedType;
+                    FSSpec*     fSR;
+                    navErr= AEGetNthPtr(&navRR.selection, 1, typeFSS, &keywd,
+                                        &returnedType, fileRec,
+                                        sizeof(FSSpec), &actualSize);
+                    if (navErr==noErr) {
+                        fSR = (FSSpec*)fileRec;
+                        GetFullPathName (*fSR, feedback);
+                        terminateExecution = false;
+                    }
+                }
+            }
+        }
+        NavDisposeReply (&navRR);
+    }
+#ifdef TARGET_API_MAC_CARBON
+    DisposeNavEventUPP (navEF);
+#endif
+    return      feedback;
+}
+
+//_________________________________________________________________________
+
+_String MacSimpleFileSave (void)
+{
+    _String             feedback;
+    OSErr               navErr;
+    NavReplyRecord      navRR;
+    NavDialogOptions    navDO;
+#ifdef TARGET_API_MAC_CARBON
+    NavEventUPP         navEF = NewNavEventUPP (HYOpenEventProc);
+#else
+    NavEventUPP         navEF = NewNavEventProc (HYOpenEventProc);
+#endif
+
+    terminateExecution       = true;
+
+    navDO.version       =   kNavDialogOptionsVersion;
+    navDO.location      =   (Point) {
+        -1,-1
+    };
+    navDO.dialogOptionFlags
+        =   kNavAllFilesInPopup|kNavSelectAllReadableItem|kNavNoTypePopup;
+
+    if (defFileNameValue.sLength) {
+        StringToStr255 (defFileNameValue, navDO.savedFileName);
+    } else {
+        navDO.savedFileName[0]= 0;
+    }
+
+    StringToStr255      (dialogPrompt,navDO.windowTitle);
+    memcpy (navDO.clientName,hpName,hpName[0]+1);
+    navDO.actionButtonLabel[0]
+        =   0;
+    navDO.cancelButtonLabel[0]
+        =   0;
+    navDO.message[0]    =   0;
+    navDO.preferenceKey =   0;
+    navDO.popupExtension=   nil;
+
+    navErr = NavPutFile (nil,
+                         &navRR,
+                         &navDO,
+                         navEF,
+                         'TEXT',
+                         'MuSe',
+                         nil);
+
+    if (navErr == noErr) {
+        if (navRR.validRecord) {
+            long countAED;
+            if (noErr==AECountItems(&navRR.selection,&countAED)) {
+                if (countAED==1) {
+                    char    fileRec [2048];
+                    Size    actualSize;
+                    AEKeyword   keywd;
+                    DescType    returnedType;
+                    FSSpec*     fSR;
+                    navErr= AEGetNthPtr(&navRR.selection, 1, typeFSS, &keywd,
+                                        &returnedType, fileRec,
+                                        sizeof(FSSpec), &actualSize);
+                    if (navErr==noErr) {
+                        fSR = (FSSpec*)fileRec;
+                        GetFullPathName (*fSR, feedback);
+                        terminateExecution = false;
+                    }
+                }
+            }
+        }
+        NavDisposeReply (&navRR);
+    }
+#ifdef TARGET_API_MAC_CARBON
+    DisposeNavEventUPP (navEF);
+#endif
+    return      feedback;
+}
+
+//_________________________________________________________________________
+bool    PopUpFileDialog(_String ps, _String* defaultLocation)
+{
+    Str255 promptS;
+
+    StringToStr255 (ps, promptS);
+
+    previewFunctionHook = NewNavPreviewUPP(HYOpenTextPreview);
+    OSErr               navErr;
+    NavReplyRecord      navRR;
+    NavDialogOptions    navDO;
+    NavEventUPP         navEF = NewNavEventUPP (HYOpenEventProc);
+    NavPreviewUPP       navPF = previewFunctionHook;
+
+    NavTypeListHandle   navLH =  (NavTypeListHandle)NewHandle(sizeof(NavTypeList) + (3 * sizeof(OSType)));
+
+    (*navLH)->componentSignature = kNavGenericSignature;
+    (*navLH)->osTypeCount        = 3;
+    (*navLH)->osType[0]          = kNavGenericSignature;
+    (*navLH)->osType[1]          = 'TEXT';
+    (*navLH)->osType[2]          = 'text';
+
+    navDO.version       =   kNavDialogOptionsVersion;
+    navDO.location      =   (Point) {
+        -1,-1
+    };
+    navDO.dialogOptionFlags
+        =   kNavAllFilesInPopup|kNavAllowPreviews|kNavSelectAllReadableItem|kNavDontAutoTranslate;
+    memcpy (navDO.windowTitle,promptS,promptS[0]+1);
+    memcpy (navDO.clientName,hpName,hpName[0]+1);
+    navDO.actionButtonLabel[0]
+        =   0;
+    navDO.cancelButtonLabel[0]
+        =   0;
+    navDO.message[0]    =   0;
+    navDO.preferenceKey =   0;
+    navDO.popupExtension=   nil;
+
+    FSSpec              defLocFSS;
+
+    if (defaultLocation) {
+        Str255 buffer;
+        StringToStr255 (*defaultLocation, buffer);
+        FSMakeFSSpec (0,0,buffer,&defLocFSS);
+        AEDesc defDesc;
+        AECreateDesc (typeFSS,&defLocFSS,sizeof (FSSpec),&defDesc);
+        navErr = NavGetFile (&defDesc,
+                             &navRR,
+                             &navDO,
+                             navEF,
+                             navPF,
+                             nil,
+                             navLH,
+                             nil);
+        AEDisposeDesc (&defDesc);
+    } else {
+        /*  NavDialogRef           daBox;
+            navErr = NavCreateGetFileDialog (
+                                    &navDO,
+                                    &navRR,
+                                    navLH,
+                                    navEF,
+                                    navPF,
+                                    NULL,
+                                    NULL,
+                                    &daBox
+                                   );*/
+
+        navErr = NavGetFile (nil,
+                             &navRR,
+                             &navDO,
+                             navEF,
+                             navPF,
+                             nil,
+                             navLH,
+                             nil);
+    }
+
+    if (navErr == noErr) {
+        if (navRR.validRecord) {
+            long countAED;
+            if (noErr==AECountItems(&navRR.selection,&countAED)) {
+                if (countAED==1) {
+                    char        fileRec [2048];
+                    Size        actualSize;
+                    AEKeyword   keywd;
+                    DescType    returnedType;
+                    FSSpec*     fSR;
+                    // get the direct parameter--a descriptor list--and put
+                    // it into docList
+                    navErr= AEGetNthPtr(&navRR.selection, 1, typeFSS, &keywd,
+                                        &returnedType, fileRec,
+                                        sizeof(FSSpec), &actualSize);
+                    if (navErr==noErr) {
+                        fSR = (FSSpec*)fileRec;
+                        fSR->name [fSR->name[0]+1]=0;
+                        if (!argFileName) {
+                            argFileName = new _String ((char*)(fSR->name+1));
+                        } else {
+                            *argFileName = _String ((char*)(fSR->name+1));
+                        }
+
+                        long       parentDirID = fSR->parID;
+                        CInfoPBRec infoRec;
+                        HFileInfo* accessInfo = (HFileInfo*)&infoRec;
+                        Str63      fName;
+                        accessInfo->ioVRefNum = fSR->vRefNum;
+                        accessInfo->ioNamePtr = fName;
+                        accessInfo->ioFDirIndex = -1;
+
+
+                        /*FSRefParam             fileBlock;
+                        FSCatalogInfo        catInfo;
+                        fileBlock.ref        = fSR;
+                        fileBlock.whichInfo  =  kFSCatInfoFinderInfo |  kFSCatInfoFinderXInfo;
+                        fileBlock.spec       = nil;
+                        fileBlock.catInfo    = &catInfo;
+
+                        PBGetCatalogInfoSync (&fileBlock);*/
+
+                        while (parentDirID!=fsRtParID) {
+                            accessInfo->ioDirID = parentDirID;
+                            if (PBGetCatInfo (&infoRec,false)) {
+                                NavDisposeReply (&navRR);
+#ifdef TARGET_API_MAC_CARBON
+                                DisposeNavEventUPP (navEF);
+#endif
+                                DisposeHandle ((Handle)navLH);
+                                return false;
+                            }
+                            parentDirID = accessInfo->ioFlParID;
+                            accessInfo->ioNamePtr [accessInfo->ioNamePtr[0]+1]=0;
+                            *argFileName = _String(((char*)(accessInfo->ioNamePtr+1)))&_String(":")&(*argFileName);
+                        }
+                        volumeName =  _String(((char*)(accessInfo->ioNamePtr+1))) & ':';
+                        NavDisposeReply (&navRR);
+#ifdef TARGET_API_MAC_CARBON
+                        DisposeNavEventUPP (navEF);
+#endif
+                        return true;
+                    }
+                }
+            }
+        }
+    }
+    NavDisposeReply (&navRR);
+#ifdef TARGET_API_MAC_CARBON
+    DisposeNavEventUPP (navEF);
+#endif
+    DisposeHandle ((Handle)navLH);
+    return false;
+}
+
+//____________________________________________________________________________________
+
+void    GetFullPathName (FSSpec& theReply, _String& feedback)
+{
+    theReply.name [theReply.name[0]+1]=0;
+    feedback= _String(((char*)(theReply.name+1)));
+    // get full path name
+    long parentDirID = theReply.parID;
+    CInfoPBRec infoRec;
+    HFileInfo* accessInfo = (HFileInfo*)&infoRec;
+    Str63 fName;
+    accessInfo->ioVRefNum = theReply.vRefNum;
+    accessInfo->ioNamePtr = fName;
+    accessInfo->ioFDirIndex = -1;
+    while (parentDirID!=fsRtParID) {
+        accessInfo->ioDirID = parentDirID;
+        if (PBGetCatInfo (&infoRec,false)!=noErr) {
+            //_String warnMsg("Error in file prompt dialog.");
+            //acknError (warnMsg);
+            //return      feedback;
+            feedback = empty;
+            return;
+        }
+        parentDirID = accessInfo->ioFlParID;
+        accessInfo->ioNamePtr [accessInfo->ioNamePtr[0]+1]=0;
+        feedback = _String(((char*)(accessInfo->ioNamePtr+1)))&_String(":")&(feedback);
+    }
+    volumeName =  _String(((char*)(accessInfo->ioNamePtr+1))) & ':';
+}
+
+
+
+//_________________________________________________________________________
+void findMovieExporterComponents(_List& compList, _SimpleList& compIndex)
+{
+    ComponentDescription cd, cd2;
+    Component c = 0;
+
+    cd.componentType            = MovieExportType;
+    cd.componentSubType         = 0;
+    cd.componentManufacturer    = 0;
+    cd.componentFlags           = 0;
+    cd.componentFlagsMask       = 0;
+
+    _String fileFormat;
+
+    while( ( c = FindNextComponent( c, &cd ) ) != 0 ) {
+        Handle     cInfo = NewHandle(256);
+        GetComponentInfo (c,&cd2,cInfo,nil,nil);
+        (*cInfo)[**cInfo+1] = 0;
+        fileFormat = (char*)(*cInfo+1);
+        if (fileFormat.sLength) {
+            compList&& &fileFormat;
+            compIndex << (long)c;
+        }
+        DisposeHandle(cInfo);
+    }
+}
+
+//_________________________________________________________________________
+void    ConvertMovieFile (bool truncate)
+{
+    EnterMovies();
+    OSErr nErr;
+
+    Movie       movie = nil;
+    short       nFileRefNum;
+    char        fileRec [2048];
+    FSSpec*     fSR = nil;
+    Str255      promptS = "\pChoose a movie file to convert";
+
+    OSErr               navErr;
+    NavReplyRecord      navRR;
+    NavDialogOptions    navDO;
+#ifdef TARGET_API_MAC_CARBON
+    NavEventUPP         navEF = NewNavEventUPP (HYOpenEventProc);
+#else
+    NavEventUPP         navEF = NewNavEventProc (HYOpenEventProc);
+#endif
+
+    NavPreviewUPP       navPF = nil;
+    NavTypeList         navTL;
+    NavTypeListPtr      navTP = &navTL;
+    NavTypeListHandle   navLH = &navTP;
+
+    navTL.componentSignature = 'MuSe';
+    navTL.osTypeCount        = 1;
+    navTL.osType[0]          = MovieFileType;
+
+    navDO.version       =   kNavDialogOptionsVersion;
+    navDO.location      =   (Point) {
+        -1,-1
+    };
+    navDO.dialogOptionFlags
+        =   kNavAllFilesInPopup|kNavSelectAllReadableItem|kNavAllowPreviews|kNavDontAutoTranslate;
+
+    memcpy (navDO.windowTitle,promptS,promptS[0]+1);
+    memcpy (navDO.clientName,hpName,hpName[0]+1);
+    navDO.actionButtonLabel[0]
+        =   0;
+    navDO.cancelButtonLabel[0]
+        =   0;
+    navDO.message[0]    =   0;
+    navDO.preferenceKey =   0;
+    navDO.popupExtension=   nil;
+
+    navErr = NavGetFile (nil,
+                         &navRR,
+                         &navDO,
+                         navEF,
+                         navPF,
+                         nil,
+                         navLH,
+                         nil);
+
+    if (navErr == noErr) {
+        if (navRR.validRecord) {
+            long countAED;
+            if (noErr==AECountItems(&navRR.selection,&countAED)) {
+                if (countAED==1) {
+                    Size    actualSize;
+                    AEKeyword   keywd;
+                    DescType    returnedType;
+                    // get the direct parameter--a descriptor list--and put
+                    // it into docList
+                    navErr= AEGetNthPtr(&navRR.selection, 1, typeFSS, &keywd,
+                                        &returnedType, fileRec,
+                                        sizeof(FSSpec), &actualSize);
+                    if (navErr==noErr) {
+                        fSR = (FSSpec*)fileRec;
+                    } else {
+                        WarnError (_String("Error ")& (long)navErr & " in AEGetNthPtr.");
+                    }
+                }
+            } else {
+                WarnError (_String("Error ")& (long)navErr & " in AECountItems.");
+            }
+        }
+    } else {
+        WarnError (_String("Error ")& (long)navErr & " in NavGetFile.");
+    }
+
+
+    if (fSR) {
+        nErr = OpenMovieFile(fSR, &nFileRefNum, fsRdPerm);
+        if (nErr == noErr) {
+            short nResID = 0;
+            Str255 strName;
+            Boolean bWasChanged;
+            nErr = NewMovieFromFile(&movie, nFileRefNum, &nResID, strName,newMovieActive, &bWasChanged);
+            SetMovieProgressProc(movie, (MovieProgressUPP)-1L, 0);
+
+            if (qtMovieGrexComponents.lLength==0) {
+                findMovieExporterComponents (movieFormats,qtMovieGrexComponents);
+            }
+
+            if (qtMovieGrexComponents.lLength==0) {
+                WarnError (_String("Failed to find movie export components."));
+            } else {
+                _String fName,
+                        filePr   = "Export Movie To:",
+                        formatPr = "Target Format:",
+                        movieName(10L,true);
+
+                for (long k = 1; k<=fSR->name[0]; k++) {
+                    movieName << fSR->name[k];
+                }
+
+                movieName.Finalize();
+
+                long    menuChoice = SaveFileWithPopUp (fName, filePr,movieName,formatPr,movieFormats);
+
+                if (menuChoice>=0) {
+                    FSSpec  fs;
+                    Str255  buff;
+                    StringToStr255 (fName,buff);
+                    FSMakeFSSpec(0,0,buff,&fs);
+
+
+                    ComponentInstance grexc = OpenComponent ((Component)qtMovieGrexComponents(menuChoice));
+
+                    Boolean canceled;
+
+                    if (truncate) {
+                        TimeValue maxDuration = GetMovieDuration(movie);
+                        _String chopString,
+                                chopPrompt = _String ("From-to, max value = ") & (long)maxDuration;
+
+                        canceled = 1;
+                        if (EnterStringDialog (chopString, chopPrompt, nil)) {
+                            _List * times = chopString.Tokenize("-");
+                            if (times->lLength==2) {
+                                TimeValue fromMark = ((_String*)(*times)(0))->toNum(),
+                                          toMark = ((_String*)(*times)(1))->toNum();
+
+                                if ((fromMark>=0)&&(toMark>fromMark)&&(toMark<=maxDuration)) {
+                                    MovieExportDoUserDialog (grexc, movie, nil, fromMark,toMark-fromMark, & canceled);
+                                    canceled = 0;
+                                }
+                                if (canceled) {
+                                    WarnError (_String((long)fromMark)&"-"&_String((long)toMark) & " is not a valid segment specification.");
+                                }
+                            }
+                        }
+                    } else {
+                        MovieExportDoUserDialog (grexc, movie, nil, 0, GetMovieDuration(movie), & canceled);
+                    }
+
+                    if (!canceled) {
+                        nErr =  ConvertMovieToFile (movie,0,&fs,'    ','MuSe',smSystemScript,nil,0,grexc);
+                        if ((nErr != noErr)&&(nErr != progressProcAborted)) {
+                            WarnError (_String("Error ")& (long)nErr & " converting movie to file.");
+                        }
+                    }
+                    CloseComponent (grexc);
+                }
+            }
+            CloseMovieFile(nFileRefNum);
+
+        } else {
+            WarnError (_String("Error ")& (long)nErr & " opening movie file.");
+        }
+    }
+    NavDisposeReply (&navRR);
+    ExitMovies();
+}
+
+//_________________________________________________________________________
+
+void    ShowObjectInspector (void)
+{
+    long f = FindWindowByName (objectInspectorTitle);
+    if (f>=0) {
+        ShowWindow ((WindowPtr)windowPtrs (f));
+        SelectWindow ((WindowPtr)windowPtrs (f));
+    } else {
+        _HYObjectInspector* newOI = new _HYObjectInspector ();
+        //newOI->BuildListOfObjects (0);
+        //newOI->_Zoom(true);
+        newOI->Activate       ( );
+        //newOI->Show();
+    }
+}
+
+//_________________________________________________________________________
+
+_String     DoMacToPOSIX (const _String& in)
+{
+    CFStringRef posixPath    = CFStringCreateWithCString (NULL,in.sData,kCFStringEncodingASCII);
+    CFURLRef    convertorURL = CFURLCreateWithFileSystemPath (NULL,posixPath,kCFURLHFSPathStyle,false);
+    CFRelease (posixPath);
+    posixPath = CFURLCopyFileSystemPath (convertorURL, kCFURLPOSIXPathStyle);
+    CFRelease (convertorURL);
+    _String  newFNAME  (CFStringGetLength(posixPath),false);
+    CFStringGetCString (posixPath, newFNAME.sData, newFNAME.sLength+1, kCFStringEncodingASCII);
+    CFRelease (posixPath);
+    return newFNAME;
+}
+
+
+
+
+
diff --git a/src/gui/mac/iHyPhyDebug.rsrc b/src/gui/mac/iHyPhyDebug.rsrc
new file mode 100644
index 0000000..1b76e12
Binary files /dev/null and b/src/gui/mac/iHyPhyDebug.rsrc differ
diff --git a/src/gui/mac/include/Components/HYPlatformButton.h b/src/gui/mac/include/Components/HYPlatformButton.h
new file mode 100644
index 0000000..c8b3056
--- /dev/null
+++ b/src/gui/mac/include/Components/HYPlatformButton.h
@@ -0,0 +1,92 @@
+/*
+
+    A button object for MacOS.
+
+
+
+    Sergei L. Kosakovsky Pond, May 2000.
+
+*/
+
+
+
+#ifndef _HYPBUTTON_
+
+#define _HYPBUTTON_
+
+
+
+#ifdef   TARGET_API_MAC_CARBON
+
+#include "CarbonEvents.h"
+
+#endif
+
+
+
+#include "HYPlatformComponent.h"
+
+
+
+//__________________________________________________________________
+
+
+
+class _HYPlatformButton
+
+{
+
+
+
+public:
+
+
+
+    _HYPlatformButton(void);
+
+
+
+    virtual ~_HYPlatformButton(void);
+
+
+
+    virtual void            _SetBackColor    (_HYColor&);
+
+    virtual void            _SetDimensions   (_HYRect,_HYRect);
+
+    virtual void            _SetVisibleSize  (_HYRect);
+
+    virtual void            _SetFont         (_HYFont&);
+
+    void            _SetText         (void);
+
+    void            _SetButtonKind   (unsigned char);
+
+    void            _EnableButton    (bool);
+
+    void            _ApplyFont       (void);
+
+    void            _PaintMe         (void);
+
+
+
+    virtual void            _Paint (Ptr p);
+
+    virtual void            _Update(Ptr p);
+
+
+
+    PixPatHandle    backFill;
+
+    ControlHandle   buttonControl;
+
+    Rect            buttonRect;
+
+    short           fontID;
+
+};
+
+
+
+#endif
+
diff --git a/src/gui/mac/include/Components/HYPlatformButtonBar.h b/src/gui/mac/include/Components/HYPlatformButtonBar.h
new file mode 100644
index 0000000..3647226
--- /dev/null
+++ b/src/gui/mac/include/Components/HYPlatformButtonBar.h
@@ -0,0 +1,118 @@
+/*
+
+    At toolbar menu object for MacOS.
+
+
+
+    Sergei L. Kosakovsky Pond, May 2000.
+
+*/
+
+
+
+#ifndef _HYPBUTTONBAR_
+
+#define _HYPBUTTONBAR_
+
+
+
+#include "HYPlatformComponent.h"
+
+
+
+#ifdef TARGET_API_MAC_CARBON
+
+#include "CarbonEvents.h"
+
+pascal void ButtonBarTimer (EventLoopTimerRef theTimer,void* userData);
+
+#endif
+
+
+
+//__________________________________________________________________
+
+
+
+class _HYPlatformButtonBar
+
+{
+
+
+
+public:
+
+
+
+    _HYPlatformButtonBar(void);
+
+
+
+    virtual ~_HYPlatformButtonBar(void);
+
+
+
+    virtual void        _SetBackColor    (_HYColor&);
+
+    virtual void        _SetDimensions   (_HYRect,_HYRect);
+
+    virtual void        _SetVisibleSize  (_HYRect);
+
+    _HYRect     _GetButtonRect   (bool conv = false);
+
+
+
+    virtual void        _Paint (Ptr p);
+
+    virtual void        _Update(Ptr p);
+
+    void        _DisposeButtons (void);
+
+    void        _DisposeButton  (long);
+
+    void        _MarkButtonForUpdate(int);
+
+    void        _UnpushButton   (void);
+
+    int         _FindClickedButton (int,int);
+
+
+
+
+
+    PixPatHandle backFill;
+
+    Rect         buttonRect,
+
+                 toolTipBounds;
+
+    int          pushed;
+
+    int          saveMousePosH, saveMousePosV;
+
+    unsigned long
+
+    lastSave;
+
+#ifdef      TARGET_API_MAC_CARBON
+
+    EventLoopTimerUPP timerUPP;
+
+    EventLoopTimerRef theTimer;
+
+#endif
+
+};
+
+
+
+//__________________________________________________________________
+
+
+
+
+
+
+
+#endif
+
diff --git a/src/gui/mac/include/Components/HYPlatformCheckbox.h b/src/gui/mac/include/Components/HYPlatformCheckbox.h
new file mode 100644
index 0000000..172ecb2
--- /dev/null
+++ b/src/gui/mac/include/Components/HYPlatformCheckbox.h
@@ -0,0 +1,78 @@
+/*
+
+    A checkbox with optional static label object for MacOS.
+
+
+
+    Sergei L. Kosakovsky Pond, May 2000-December 2002.
+
+*/
+
+
+
+#ifndef _HYPLCHECKBOX_
+
+#define _HYPLCHECKBOX_
+
+
+
+#ifdef   TARGET_API_MAC_CARBON
+
+#include "CarbonEvents.h"
+
+#endif
+
+
+
+#include "HYPlatformComponent.h"
+
+
+
+//__________________________________________________________________
+
+
+
+class _HYPlatformCheckbox
+
+{
+
+
+
+public:
+
+
+
+    _HYPlatformCheckbox(bool);
+
+    virtual ~_HYPlatformCheckbox(void);
+
+
+
+    virtual void        _SetVisibleSize     (_HYRect);
+
+    virtual void        _SetState           (bool);
+
+
+
+    virtual void        _Paint (Ptr p);
+
+    virtual void        _Update(Ptr p);
+
+    virtual void        _Enable(bool);
+
+
+
+    void        _PaintMe            (void);
+
+    ControlHandle   checkboxControl;
+
+    Rect            checkboxRect;
+
+    bool            isRadio;
+
+};
+
+
+
+#endif
+
diff --git a/src/gui/mac/include/Components/HYPlatformLabel.h b/src/gui/mac/include/Components/HYPlatformLabel.h
new file mode 100644
index 0000000..3833aee
--- /dev/null
+++ b/src/gui/mac/include/Components/HYPlatformLabel.h
@@ -0,0 +1,88 @@
+/*
+
+    A static label object for MacOS.
+
+
+
+    Sergei L. Kosakovsky Pond, May 2000-December 2002.
+
+*/
+
+
+
+#ifndef _HYPLABEL_
+
+#define _HYPLABEL_
+
+
+
+#ifdef   TARGET_API_MAC_CARBON
+
+#include "CarbonEvents.h"
+
+#endif
+
+
+
+#include "HYPlatformComponent.h"
+
+
+
+//__________________________________________________________________
+
+
+
+class _HYPlatformLabel
+
+{
+
+
+
+public:
+
+
+
+    _HYPlatformLabel(void);
+
+    // flags, title, visibility
+
+
+
+    virtual ~_HYPlatformLabel(void);
+
+
+
+    virtual void        _SetBackColor    (_HYColor&);
+
+    virtual void        _SetForeColor    (_HYColor&);
+
+    virtual void        _SetDimensions   (_HYRect,_HYRect);
+
+    virtual void        _SetVisibleSize  (_HYRect);
+
+    virtual void        _SetFont         (_HYFont&);
+
+    virtual void        _SetText         (void) {}
+
+
+
+    virtual void        _Paint (Ptr p);
+
+    virtual void        _Update(Ptr p);
+
+
+
+    PixPatHandle backFill;
+
+    RGBColor     fc;
+
+    long         fontID;
+
+    Rect         labelRect;
+
+};
+
+
+
+#endif
+
diff --git a/src/gui/mac/include/Components/HYPlatformList.h b/src/gui/mac/include/Components/HYPlatformList.h
new file mode 100644
index 0000000..b20c01d
--- /dev/null
+++ b/src/gui/mac/include/Components/HYPlatformList.h
@@ -0,0 +1,94 @@
+/*
+
+    A text input box object for MacOS.
+
+
+
+    Sergei L. Kosakovsky Pond, May 2000-December 2002.
+
+*/
+
+
+
+#ifndef _HYPLLIST_
+
+#define _HYPLLIST_
+
+
+
+#ifdef   TARGET_API_MAC_CARBON
+
+#include "CarbonEvents.h"
+
+#endif
+
+
+
+#include "HYPlatformComponent.h"
+
+#include "Lists.h"
+
+
+
+//__________________________________________________________________
+
+
+
+class _HYPlatformList
+
+{
+
+
+
+public:
+
+
+
+    _HYPlatformList(void);
+
+
+
+    virtual ~_HYPlatformList(void);
+
+
+
+    virtual void        _SetDimensions   (_HYRect,_HYRect);
+
+    virtual void        _SetVisibleSize  (_HYRect);
+
+
+
+    virtual void        _Paint (Ptr p);
+
+    virtual void        _Update(Ptr p);
+
+
+
+    virtual void        _InsertItem         (_String&, long);
+
+    virtual void        _SetItem            (_String&, long);
+
+    virtual void        _DeleteItem         (long);
+
+    virtual void        _CheckSelection     (void);
+
+    virtual void        _ToggleMultSelection(bool);
+
+    void        _KillSelection  (void);
+
+    void        _SetSelection   (_SimpleList&);
+
+    void        _SetFont        (void);
+
+
+
+    ListHandle      listData;
+
+    short           fontID;
+
+};
+
+
+
+#endif
+
diff --git a/src/gui/mac/include/Components/HYPlatformPullDown.h b/src/gui/mac/include/Components/HYPlatformPullDown.h
new file mode 100644
index 0000000..c0f9925
--- /dev/null
+++ b/src/gui/mac/include/Components/HYPlatformPullDown.h
@@ -0,0 +1,120 @@
+/*
+
+    A pull down menu object for MacOS.
+
+
+
+    Sergei L. Kosakovsky Pond, May 2000.
+
+*/
+
+
+
+#ifndef _HYPPULLDOWNMENU_
+
+#define _HYPPULLDOWNMENU_
+
+#ifdef   TARGET_API_MAC_CARBON
+
+#include "CarbonEvents.h"
+
+#endif
+
+
+
+#include "HYPlatformComponent.h"
+
+
+
+//__________________________________________________________________
+
+
+
+extern   _String    menuSeparator;
+
+
+
+//__________________________________________________________________
+
+
+
+class _HYPlatformPullDown
+
+{
+
+
+
+public:
+
+
+
+    _HYPlatformPullDown(void);
+
+    // flags, title, visibility
+
+
+
+    virtual ~_HYPlatformPullDown(void);
+
+
+
+    virtual void        _AddMenuItem     (_String&, long);
+
+    virtual void        _SetMenuItem     (_String&, long);
+
+    virtual void        _SetBackColor    (_HYColor&);
+
+    virtual void        _Duplicate       (Ptr);
+
+    virtual void        _DeleteMenuItem  (long);
+
+    virtual long        _GetSelection    (void);
+
+    virtual void        _SetDimensions   (_HYRect,_HYRect);
+
+    virtual void        _SetVisibleSize  (_HYRect);
+
+    virtual void        _EnableItem      (long, bool);
+
+    virtual void        _MarkItem        (long, char);
+
+    virtual char        _ItemMark        (long);
+
+    virtual void        _EnableMenu      (bool) {}
+
+
+
+
+
+    virtual void        _Paint (Ptr p);
+
+    virtual void        _Update(Ptr p);
+
+
+
+    MenuHandle    myMenu;
+
+    PixPatHandle  backFill;
+
+    long          myID, selection;
+
+    Rect          menuRect;
+
+};
+
+
+
+//__________________________________________________________________
+
+
+
+extern  RGBColor    buttonBorder1,
+
+        buttonBorder2;
+
+
+
+
+
+#endif
+
diff --git a/src/gui/mac/include/Components/HYPlatformTable.h b/src/gui/mac/include/Components/HYPlatformTable.h
new file mode 100644
index 0000000..b7ea0d8
--- /dev/null
+++ b/src/gui/mac/include/Components/HYPlatformTable.h
@@ -0,0 +1,112 @@
+/*
+
+    A text input box object for MacOS.
+
+
+
+    Sergei L. Kosakovsky Pond, May 2000-December 2002.
+
+*/
+
+
+
+#ifndef _HYPLTABLE_
+
+#define _HYPLTABLE_
+
+
+
+#ifdef   TARGET_API_MAC_CARBON
+
+#include "CarbonEvents.h"
+
+#endif
+
+
+
+//__________________________________________________________________
+
+
+
+#include "HYPlatformComponent.h"
+
+
+
+#define     HY_TABLE_SIZE_CURSOR  0x01
+
+#define     HY_TABLE_DRAG_CURSOR  0x02
+
+#define     HY_TABLE_EDIT_CURSOR  0x04
+
+
+
+//__________________________________________________________________
+
+
+
+class _HYPlatformTable
+
+{
+
+
+
+public:
+
+
+
+    _HYPlatformTable        (void);
+
+    virtual             ~_HYPlatformTable       (void);
+
+
+
+    void            _SetFont                (void);
+
+    void            _SetBackColor           (_HYColor&);
+
+    void            _SetBackColor2          (_HYColor&);
+
+
+
+    void            _CreateTextBox          (_HYRect&,_String&);
+
+    _String         _RetrieveTextValue      (void);
+
+    void            _KillTextBox            (void);
+
+    bool            _HasTextBox             (void) {
+
+        return      editBox;
+
+    }
+
+
+
+    Rect            _GetVisibleRowRect      (long);
+
+
+
+    void            _HiliteRowForDrag       (long,long);
+
+
+
+    short           fontID;
+
+    PixPatHandle    backPattern,
+
+                    backPattern2;
+
+    char            cursorState;
+
+
+
+    TEHandle        editBox;
+
+    Rect            textBoxRect;
+
+};
+
+
+
+#endif
+
diff --git a/src/gui/mac/include/Components/HYPlatformTextbox.h b/src/gui/mac/include/Components/HYPlatformTextbox.h
new file mode 100644
index 0000000..f7a86ab
--- /dev/null
+++ b/src/gui/mac/include/Components/HYPlatformTextbox.h
@@ -0,0 +1,152 @@
+/*
+
+    A text input box object for MacOS.
+
+
+
+    Sergei L. Kosakovsky Pond, May 2000-December 2002.
+
+*/
+
+
+
+#ifndef _HYPLTEXTBOX_
+
+#define _HYPLTEXTBOX_
+
+
+
+#ifdef   TARGET_API_MAC_CARBON
+
+#include "CarbonEvents.h"
+
+#endif
+
+
+
+#include "HYPlatformComponent.h"
+
+#include <MacTextEditor.h>
+
+
+
+#define  _HY_USE_MLTE_
+
+
+
+//__________________________________________________________________
+
+
+
+class _HYPlatformTextBox
+
+{
+
+
+
+public:
+
+
+
+    _HYPlatformTextBox (void);
+
+
+
+    virtual ~_HYPlatformTextBox(void);
+
+
+
+    virtual void            _SetBackColor    (_HYColor&);
+
+    virtual void            _SetBackTColor   (_HYColor&);
+
+    virtual void            _SetForeColor    (_HYColor&);
+
+    virtual void            _SetDimensions   (_HYRect,_HYRect);
+
+    virtual void            _SetVisibleSize  (_HYRect);
+
+    virtual void            _SetFont         (_HYFont&);
+
+    void            _SetText         (const _String&);
+
+    void            _InsertText      (const _String&, bool);
+
+    _String         _GetText         (void);
+
+    void            _StoreText       (_String*&, bool);
+
+    void            _CreateTE        (void);
+
+    void            _EnableTextBox   (bool);
+
+    void            _SetMargins      (_HYRect&);
+
+    void            _SetAlignFlags   (unsigned char);
+
+    long            _GetCharacterCount
+
+    (void);
+
+
+
+    virtual void            _Paint (Ptr p);
+
+    virtual void            _Update(Ptr p);
+
+
+
+    virtual void            _FocusComponent   (void);
+
+    virtual void            _UnfocusComponent (void);
+
+
+
+    PixPatHandle    backFill,
+
+                    backTFill;
+
+
+
+
+
+    Rect            textBoxRect;
+
+#ifdef          _HY_USE_MLTE_
+
+
+
+    virtual void            _HandleContextMenu (Point&);
+
+
+
+    TXNObject       txn;
+
+    TXNFrameID      txnFrame;
+
+#else
+
+    TEHandle        te;
+
+#endif
+
+
+
+};
+
+
+
+#ifdef   _HY_USE_MLTE_
+
+
+
+_String  mlteCommandString (TXNObject&, bool);
+
+
+
+#endif
+
+
+
+#endif
+
diff --git a/src/gui/mac/include/HYPlatformButtonMenu.h b/src/gui/mac/include/HYPlatformButtonMenu.h
new file mode 100644
index 0000000..5cb2365
--- /dev/null
+++ b/src/gui/mac/include/HYPlatformButtonMenu.h
@@ -0,0 +1,196 @@
+/*
+    A pull down menu object for MacOS.
+
+    Sergei L. Kosakovsky Pond, May 2000.
+*/
+
+#ifndef _HYPPULLDOWNMENU_
+#define _HYPPULLDOWNMENU_
+//#pragma once
+#include "HYBaseGUI.h"
+#include "Menus.h"
+#include "Lists.h"
+#include "TextEdit.h"
+#include "strings.h"
+#ifdef   TARGET_API_MAC_CARBON
+#include "CarbonEvents.h"
+#endif
+
+
+
+//__________________________________________________________________
+
+class _HYPlatformCheckbox
+{
+
+public:
+
+    _HYPlatformCheckbox(bool);
+    virtual ~_HYPlatformCheckbox(void);
+
+    virtual void        _SetVisibleSize     (_HYRect);
+    virtual void        _SetState           (bool);
+
+    virtual void        _Paint (Ptr p);
+    virtual void        _Update(Ptr p);
+    virtual void        _Enable(bool);
+
+    ControlHandle   checkboxControl;
+    Rect            checkboxRect;
+    bool            isRadio;
+};
+
+//__________________________________________________________________
+
+class _HYPlatformButtonBar
+{
+
+public:
+
+    _HYPlatformButtonBar(void);
+
+    virtual ~_HYPlatformButtonBar(void);
+
+    virtual void        _SetBackColor    (_HYColor&);
+    virtual void        _SetDimensions   (_HYRect,_HYRect);
+    virtual void        _SetVisibleSize  (_HYRect);
+    _HYRect     _GetButtonRect   (bool conv = false);
+
+    virtual void        _Paint (Ptr p);
+    virtual void        _Update(Ptr p);
+    void        _DisposeButtons (void);
+    void        _DisposeButton  (long);
+    void        _MarkButtonForUpdate(int);
+    void        _UnpushButton   (void);
+    int         _FindClickedButton (int,int);
+
+
+    PixPatHandle backFill;
+    Rect         buttonRect,
+                 toolTipBounds;
+    int          pushed;
+    int          saveMousePosH, saveMousePosV;
+    unsigned long
+    lastSave;
+#ifdef      TARGET_API_MAC_CARBON
+    EventLoopTimerUPP timerUPP;
+    EventLoopTimerRef theTimer;
+#endif
+};
+
+//__________________________________________________________________
+
+class _HYPlatformList
+{
+
+public:
+
+    _HYPlatformList(void);
+
+    virtual ~_HYPlatformList(void);
+
+    virtual void        _SetDimensions   (_HYRect,_HYRect);
+    virtual void        _SetVisibleSize  (_HYRect);
+
+    virtual void        _Paint (Ptr p);
+    virtual void        _Update(Ptr p);
+
+    virtual void        _InsertItem         (_String&, long);
+    virtual void        _SetItem            (_String&, long);
+    virtual void        _DeleteItem         (long);
+    virtual void        _CheckSelection     (void);
+    virtual void        _ToggleMultSelection(bool);
+    void        _KillSelection  (void);
+    void        _SetSelection   (_SimpleList&);
+    void        _SetFont        (void);
+
+    ListHandle      listData;
+    short           fontID;
+};
+
+//__________________________________________________________________
+
+#define     HY_TABLE_SIZE_CURSOR  0x01
+#define     HY_TABLE_DRAG_CURSOR  0x02
+#define     HY_TABLE_EDIT_CURSOR  0x04
+
+//__________________________________________________________________
+
+class _HYPlatformTable
+{
+
+public:
+
+    _HYPlatformTable        (void);
+    virtual             ~_HYPlatformTable       (void);
+
+    void            _SetFont                (void);
+    void            _SetBackColor           (_HYColor&);
+    void            _SetBackColor2          (_HYColor&);
+
+    void            _CreateTextBox          (_HYRect&,_String&);
+    _String         _RetrieveTextValue      (void);
+    void            _KillTextBox            (void);
+    bool            _HasTextBox             (void) {
+        return      editBox;
+    }
+
+    Rect            _GetVisibleRowRect      (long);
+
+    void            _HiliteRowForDrag       (long,long);
+
+    short           fontID;
+    PixPatHandle    backPattern,
+                    backPattern2;
+    char            cursorState;
+
+    TEHandle        editBox;
+    Rect            textBoxRect;
+};
+
+
+
+//__________________________________________________________________
+
+class _HYPlatformTextBox
+{
+
+public:
+
+    _HYPlatformTextBox (void);
+
+    virtual ~_HYPlatformTextBox(void);
+
+    virtual void            _SetBackColor    (_HYColor&);
+    virtual void            _SetBackTColor   (_HYColor&);
+    virtual void            _SetForeColor    (_HYColor&);
+    virtual void            _SetDimensions   (_HYRect,_HYRect);
+    virtual void            _SetVisibleSize  (_HYRect);
+    virtual void            _SetFont         (_HYFont&);
+    void            _SetText         (_String&);
+    void            _InsertText      (_String&);
+    _String         _GetText         (void);
+    void            _CreateTE        (void);
+    void            _EnableTextBox   (bool);
+    void            _SetMargins      (_HYRect&);
+    void            _SetAlignFlags   (unsigned char);
+
+    virtual void            _Paint (Ptr p);
+    virtual void            _Update(Ptr p);
+
+    virtual void            _FocusComponent  (void);
+    virtual void            _UnfocusComponent(void);
+
+    PixPatHandle    backFill,
+                    backTFill;
+    TEHandle        te;
+    Rect            textBoxRect;
+};
+#endif
+
+#ifdef TARGET_API_MAC_CARBON
+pascal void ButtonBarTimer (EventLoopTimerRef theTimer,void* userData);
+#endif
+
+
+//EOF
diff --git a/src/gui/mac/include/HYPlatformComponent.h b/src/gui/mac/include/HYPlatformComponent.h
new file mode 100644
index 0000000..5efda6e
--- /dev/null
+++ b/src/gui/mac/include/HYPlatformComponent.h
@@ -0,0 +1,77 @@
+/*
+    A general composite window component object, MacOS specifics
+
+    Sergei L. Kosakovsky Pond, May 2000.
+*/
+
+#ifndef _HYPCOMPONENT_
+#define _HYPCOMPONENT_
+//#pragma once
+#include "HYBaseGUI.h"
+#include "Controls.h"
+//#include <Windows.h>
+
+#define  HY_SCROLLER_WIDTH 15
+
+//__________________________________________________________________
+
+class _HYPlatformComponent
+{
+
+public:
+
+    _HYPlatformComponent(void);
+    _HYPlatformComponent(_HYRect,Ptr);
+    // settings
+
+    virtual ~_HYPlatformComponent() {};
+
+    virtual void        Duplicate (BaseRef);
+
+    virtual void        _CleanUp   (void);
+
+    virtual void        _SetDimensions (_HYRect,_HYRect);
+    virtual void        _SetVisibleSize(_HYRect);
+
+    virtual void        _Paint (Ptr);
+    virtual void        _Update (Ptr);
+    virtual bool        _ProcessOSEvent (Ptr);
+    virtual _HYRect     _VisibleContents(Ptr);
+    virtual void        _MarkForUpdate (void);
+    virtual void        _MarkContentsForUpdate (void);
+    virtual long        _GetHScrollerPos (void);
+    virtual long        _GetVScrollerPos (void);
+    virtual void        _SetHScrollerPos (long);
+    virtual void        _SetVScrollerPos (long);
+    virtual void        _Activate (void);
+    virtual void        _Deactivate(void);
+    virtual void        _ComponentMouseExit (void) {}
+
+
+
+    WindowPtr     parentWindow;
+
+    _HYRect       rel;
+    ControlHandle vScroll, hScroll;
+
+    bool          activationFlag;
+    long          lastHScroll,
+                  lastVScroll;
+};
+
+extern  bool    forceUpdateForScrolling;
+
+void            AlignRectangle (_HYRect& rel , Rect& target , unsigned char alFlags);
+
+
+#ifdef TARGET_API_MAC_CARBON
+
+extern bool aquaInterfaceOn;
+
+#endif
+
+//__________________________________________________________________
+
+#endif
+
+//EOF
diff --git a/src/gui/mac/include/HYPlatformGraphicPane.h b/src/gui/mac/include/HYPlatformGraphicPane.h
new file mode 100644
index 0000000..53be1e4
--- /dev/null
+++ b/src/gui/mac/include/HYPlatformGraphicPane.h
@@ -0,0 +1,90 @@
+/*
+    A painting canvas with double buffer. MacOS.
+
+    Sergei L. Kosakovsky Pond, May 2000-May 2002.
+*/
+
+#ifndef _HYPGRAPHICPANE_
+#define _HYPGRAPHICPANE_
+//#pragma once
+
+#include "HYBaseGUI.h"
+#include "QDOffscreen.h"
+#include "QuickDraw.h"
+
+//__________________________________________________________________
+
+class  _HYPlatformGraphicPane
+{
+
+public:
+
+    _HYPlatformGraphicPane(int, int,int);
+    // initial size
+
+    virtual ~_HYPlatformGraphicPane();
+
+    virtual void        _SetPaneSize  (int,int,int);
+    virtual void        _DrawLine     (_HYRect);
+    virtual void        _DrawHatchedLine(_HYRect);
+    // from, to , width
+    virtual void        _DisplayText  (_String,int,int,bool);
+    // text, where, left-right or top-bottom
+    virtual void        _DisplayText  (_String&,_HYRect&, char);
+
+    virtual void        _DisplayChar  (char,int,int);
+    // text, where
+    virtual void        _DrawRect    (_HYRect);
+    virtual void        _FillRect    (_HYRect);
+    virtual void        _EraseRect   (_HYRect);
+    virtual void        _DrawOval    (_HYRect);
+    virtual void        _FillOval    (_HYRect);
+    virtual void        _EraseOval   (_HYRect);
+    virtual void        _DrawArc     (_HYRect,int,int);
+    virtual void        _FillArc     (_HYRect,int,int);
+    virtual void        _EraseArc    (_HYRect,int,int);
+    virtual void        _SetColor    (_HYColor);
+    virtual void        _SetBColor   (_HYColor);
+    virtual void        _SetFont     (_HYFont);
+    virtual void        _SetFontSize (long);
+    virtual void        _StartDraw   (void);
+    virtual void        _EndDraw     (void);
+    virtual void        _SetPort     (Ptr);
+    virtual void        _SlidePane   (int dv, int dh);
+    virtual void        _SlideRect   (_HYRect&r ,int dv, int dh);
+    virtual void        _InvertRect  (_HYRect&);
+    virtual void        _CopyToClipboard
+    (void);
+
+    virtual void        _DrawPicRes  (_HYRect&, long);
+    virtual void        _SavePicture (_String);
+
+    virtual Ptr         _DefinePolygon
+    (_SimpleList&);
+    virtual void        _KillPolygon (Ptr);
+    virtual void        _DrawPolygon (Ptr,long = 1);
+    virtual void        _FillPolygon (Ptr);
+    virtual void        _ErasePolygon(Ptr);
+    virtual void        _SetDialogBG (void);
+
+    GWorldPtr    thePane;
+
+protected:
+
+    CGrafPtr     savedPort;
+    GDHandle     savedDevice;
+    PixPatHandle fillColor;
+    RGBColor     saveFG,
+                 saveBG;
+};
+
+Rect    HYRect2Rect (_HYRect&);
+
+extern  _List       graphicsFormats;
+extern  _SimpleList qtGrexComponents;
+
+void        InitializeQTExporters          (void);
+
+#endif
+
+//EOF
diff --git a/src/gui/mac/include/HYPlatformWindow.h b/src/gui/mac/include/HYPlatformWindow.h
new file mode 100644
index 0000000..83be2dd
--- /dev/null
+++ b/src/gui/mac/include/HYPlatformWindow.h
@@ -0,0 +1,160 @@
+/*
+    A Mac OS window object - a window/title/size-box/scroll-bars handler.
+
+    Sergei L. Kosakovsky Pond, May 2000.
+*/
+
+#ifndef _HYPWINDOW_
+#define _HYPWINDOW_
+
+#define  MAX_CONTROL_VALUE 100000000
+#include "hy_strings.h"
+
+#include "Quickdraw.h"
+#include "Controls.h"
+#include "HYBaseGUI.h"
+
+#ifdef   TARGET_API_MAC_CARBON
+#include "CarbonEvents.h"
+#endif
+
+#include "Carbon.h"
+
+//__________________________________________________________________
+
+class _HYPlatformWindow
+{
+
+public:
+
+    _HYPlatformWindow   (unsigned char,_String,bool,Ptr = nil);
+    // flags, title, visibility
+
+    virtual ~_HYPlatformWindow  (void);
+
+    void        _SetTitle               (_String);
+    void        _Show                   (void);
+    void        _Hide                   (void);
+    virtual long        _Grow                   (Ptr);
+    virtual bool        _Close                  (Ptr);
+    virtual void        _Move                   (Ptr);
+    virtual void        _SetPosition            (int,int);
+    void        _SelectWindow           (void);
+    virtual void        _SetWindowRectangle     (int,int,int,int,bool=true);
+    virtual void        _SetContentSize         (int,int);
+    virtual void        _Paint                  (Ptr);
+    virtual void        _Update                 (Ptr);
+    virtual void        _Activate               (void);
+    virtual void        _BringWindowToFront     (void);
+    virtual void        _Deactivate             (void);
+    virtual bool        _ProcessOSEvent         (Ptr);
+    virtual void        _VisibleContents        (int&,int&,int&,int&);
+    virtual _HYRect     _GetWindowRect          (void);
+    bool        _IsHScroll              (ControlHandle);
+    virtual bool        _ProcessMenuSelection   (long) {
+        return false;
+    }
+    virtual void        _SetMenuBar             (void);
+    virtual void        _UnsetMenuBar           (void);
+    virtual _String&    _GetTitle               (void);
+    void        _SetWindowBackColor     (_HYColor);
+
+    Rect        newVRect                (void);
+    Rect        newHRect                (void);
+    Rect        newSRect                (void);
+    void        drawGrowIcon            (void);
+    virtual Ptr         _GetOSWindowData (void) {
+        return (Ptr)theWindow;
+    }
+
+
+    WindowPtr                           theWindow;
+    unsigned char                       flags;
+    ControlHandle                       vScroll,
+                                        hScroll;
+#ifdef  TARGET_API_MAC_CARBON
+    EventHandlerUPP                 sizeHandler;
+#endif
+    Rect                                savedLoc;
+    Ptr                                 containerRef;
+    bool                                sheet1st;
+};
+
+//__________________________________________________________________
+
+class _HYPlatformTWindow
+{
+
+public:
+
+    _HYPlatformTWindow  (Ptr);
+    // flags, title, visibility
+
+    virtual ~_HYPlatformTWindow (void);
+
+    virtual void        _SetWindowRectangle     (int,int,int,int,bool=true);
+
+#ifdef      TARGET_API_MAC_CARBON
+    EventLoopTimerUPP timerUPP;
+    EventLoopTimerRef theTimer;
+    EventHandlerUPP   scrollWheelH;
+#endif
+};
+
+//__________________________________________________________________
+
+class _HYPlatformPWindow
+{
+
+public:
+
+    _HYPlatformPWindow          (void);
+
+    virtual ~_HYPlatformPWindow         (void);
+
+    virtual void _StartPicture          (void);
+    virtual void _EndPicture            (void);
+    virtual void _DrawPicture           (_HYRect);
+
+private:
+
+    PicHandle            savedPic;
+    RgnHandle            savedClip;
+
+};
+
+//__________________________________________________________________
+
+extern   bool   forceUpdateForScrolling,
+         aquaInterfaceOn;
+
+void            _Close2 (Ptr);
+
+extern  Boolean             InitPrint (PMPrintSession);
+
+extern  CIconHandle         redButtonIcon,
+        yellowButtonIcon,
+        greenButtonIcon,
+        orangeButtonIcon;
+
+#ifdef TARGET_API_MAC_CARBON
+#ifndef PM_USE_SESSION_APIS
+#define PM_USE_SESSION_APIS 0
+#endif
+
+#include <PMApplication.h>
+extern PMPageFormat     gPageFormat;
+extern PMPrintSettings  gPrintSettings;
+extern Handle           gFlattenedFormat;
+extern Handle           gFlattenedSettings;
+pascal OSStatus         wSizeHandler (EventHandlerCallRef, EventRef, void*);
+#else
+#include <Printing.h>
+extern THPrint prRecHdl;
+#endif
+
+void                        _PaintTheCircle                 (CIconHandle,WindowPtr);
+
+#endif
+
+//EOF
diff --git a/src/gui/mac/plist.r b/src/gui/mac/plist.r
new file mode 100644
index 0000000..606a4d7
--- /dev/null
+++ b/src/gui/mac/plist.r
@@ -0,0 +1,3 @@
+read 'icns' (128) "HYPHY.icns";
+read 'icns' (129) "Docs.icns";
+read 'plst' (0) "plist.xml";
\ No newline at end of file
diff --git a/src/gui/mac/plist.xml b/src/gui/mac/plist.xml
new file mode 100644
index 0000000..6ed2a74
--- /dev/null
+++ b/src/gui/mac/plist.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+	<key>CFBundleDocumentTypes</key>
+	<array>
+		<dict>
+			<key>CFBundleTypeExtensions</key>
+			<array>
+				<string>txt</string>
+				<string>text</string>
+			</array>
+			<key>CFBundleTypeIconFile</key>
+			<string>129</string>
+			<key>CFBundleTypeName</key>
+			<string>Text document</string>
+			<key>CFBundleTypeOSTypes</key>
+			<array>
+				<string>TEXT</string>
+			</array>
+			<key>CFBundleTypeRole</key>
+			<string>Viewer</string>
+		</dict>
+	</array>
+	<key>CFBundleIconFile</key>
+	<string>128</string>
+	<key>CFBundleIdentifier</key>
+	<string>org.hyphy</string>
+	<key>CFBundleLongVersionString</key>
+	<string>1.4, Copyright 1997-2006 Sergei L Kosakovsky Pond, Simon DW Frost and Spencer V Muse</string>
+	<key>CFBundleShortVersionString</key>
+	<string>1.00beta</string>
+	<key>CFBundleVersion</key>
+	<string>1.00beta</string>
+</dict>
+</plist>
diff --git a/src/gui/mac/plistmp.r b/src/gui/mac/plistmp.r
new file mode 100644
index 0000000..713af85
--- /dev/null
+++ b/src/gui/mac/plistmp.r
@@ -0,0 +1 @@
+read 'icns' (128) "HYPHYMP.icns";
read 'icns' (129) "Docs.icns";
read 'plst' (0) "plist.xml";
\ No newline at end of file
diff --git a/src/gui/preferences.cpp b/src/gui/preferences.cpp
new file mode 100644
index 0000000..ca85921
--- /dev/null
+++ b/src/gui/preferences.cpp
@@ -0,0 +1,766 @@
+/*
+
+HyPhy - Hypothesis Testing Using Phylogenies.
+
+This file implements shared and platform specific
+(via ifdefs) functions for reading/writing and
+setting preferences.
+
+Written by SL Kosakovsky Pond
+June 8, 2007
+
+Copyright (C) 1997-2009
+  Sergei L Kosakovsky Pond (spond at ucsd.edu)
+  Art FY Poon              (apoon at cfenet.ubc.ca)
+
+Permission is hereby granted, free of charge, to any person obtaining a
+copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be included
+in all copies or substantial portions of the Software.
+
+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.
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+*/
+
+#include "likefunc.h"
+#include "preferences.h"
+#include "list.h"
+#include "avllistx.h"
+#include "simplelist.h"
+#include "preferences.h"
+
+#ifndef  __HEADLESS__
+#include "HYUtils.h"
+#include "HYConsoleWindow.h"
+#include "HYTextBox.h"
+#include "HYCanvas.h"
+#endif
+
+// preferences -> index mapping
+
+
+#ifdef __MAC__
+short           prefFileRefNumber   = 0;
+#include        <Folders.h>
+#include        <Script.h>
+
+#ifndef __HYPHYXCODE__
+extern  long    _fcreator,
+        _ftype;
+#endif
+
+extern      MenuHandle recentFilesMenu;
+#endif
+
+#ifdef __WINDOZE__
+FILE*           prefFileHandle      = nil;
+_String         hyWindowsConsoleFont ("CONSOLE_FONT_INFO"),
+                prefFileTitle        ("HYPHYSettings.ini");
+#ifndef __HEADLESS__
+extern          HMENU                 recentFilesMenu;
+#endif
+#endif
+
+#ifdef __HYPHY_GTK__
+#endif
+
+_List               _hyPreferencesKeysAux;
+_AVLListX           _hyPreferencesKeys (&_hyPreferencesKeysAux);
+
+_String             _hyPreferencesFontFace      ("Font Face"),
+                    _hyPreferencesFontSize       ("Font Size"),
+                    _hyPreferencesFontStyle      ("Font Style"),
+                    _hyPreferencesPrecision      ("Precision"),
+                    _hyPreferencesPersistence    ("Persistence"),
+                    _hyPreferencesInitGuess      ("Initial Guess"),
+                    _hyPreferencesStartValue ("Starting Value"),
+                    _hyPreferencesDeletions      ("Deletions"),
+                    _hyPreferencesFormat     ("Output format"),
+                    _hyPreferencesLineWidth      ("Line width"),
+                    _hyPreferencesGapWidth       ("Gap width"),
+                    _hyPreferencesHetSimulation ("Heterogeneity Simulation"),
+                    _hyPreferencesRandomSeed ("Random seed"),
+                    _hyPreferencesLikelihoodDisp("Likelihood Display"),
+                    _hyPreferencesNumberFormat  ("Number Format"),
+                    _hyPreferencesTreeDisplay    ("Tree Display"),
+                    _hyPreferencesOptProgress    ("Optimization Progress"),
+                    _hyPreferencesStartupDialog  ("Startup Dialog"),
+                    _hyPreferencesGapFreqs       ("Include Gaps in Frequency Counts"),
+                    _hyPreferencesAutomoveC      ("Automove console"),
+                    _hyPreferencesMP         ("CPUs to Load");
+//____________________________________________________________________________________________
+
+bool                showDialogAtStartup         = true,
+                    doAutoConsoleMove             = true;
+
+
+#ifndef             __HEADLESS__
+_HYRect             consolePositionRectangle = {50,50,700,500,0};
+#endif
+
+_String             initialDialogPop            ("SHOW_DIALOG_AT_STARTUP"),
+                    windowPositionStr           ("CONSOLE_WINDOW_COORDS"),
+                    autoMoveConsole             ("AUTOMATICALLY_RESIZE_CONSOLE"),
+                    recentFilesList             ("RECENT_FILES_LIST"),
+                    treeDisplayOptions          ("TREE_DISPLAY_OPTIONS");
+
+_List               recentFiles,
+                    recentPaths,
+                    globalPreferencesList;
+
+//____________________________________________________________________________________________
+
+void  ReadPreferences (void)
+{
+    _String optionList,
+            menuKey,
+            comma(",");
+
+    // populate the list of preferences
+
+#if !defined __WINDOZE__ && !defined __HEADLESS__
+    _List                fonts;
+    AddItemToPreferences (1|8,-1,"Console Font Settings","Choose font face, size and style used for displaying text in the console.","",nil,globalPreferencesList,false);
+    GenerateFontList     (fonts);
+
+    _hyPreferencesKeys.Insert(_hyPreferencesFontFace.makeDynamic(),((_List*)globalPreferencesList.lData[4])->lLength);
+    AddItemToPreferences (0,PREFITEM_POPUP,_hyPreferencesFontFace,"Select the font used to display text in the console window.","Monaco",&fonts,globalPreferencesList,false);
+    optionList = "8,9,10,12,14,18";
+    _hyPreferencesKeys.Insert(_hyPreferencesFontSize.makeDynamic(),((_List*)globalPreferencesList.lData[4])->lLength);
+    AddItemToPreferences (0,PREFITEM_POPUP,_hyPreferencesFontSize,"Select font size used to display text in the console window.","9",optionList.Tokenize (comma), globalPreferencesList,true);
+    optionList = "Plain,Bold,Italic";
+    _hyPreferencesKeys.Insert(_hyPreferencesFontStyle.makeDynamic(),((_List*)globalPreferencesList.lData[4])->lLength);
+    AddItemToPreferences (0,PREFITEM_POPUP,_hyPreferencesFontStyle,"Select font style used to display text in the console window.","Plain",optionList.Tokenize (comma), globalPreferencesList,true);
+#endif
+
+    AddItemToPreferences (1|8,-1,"Optimization Settings","Options affecting the optimization algorithm.","",nil,globalPreferencesList,false);
+    _hyPreferencesKeys.Insert(_hyPreferencesPrecision.makeDynamic(),((_List*)globalPreferencesList.lData[4])->lLength);
+    AddItemToPreferences (0,PREFITEM_TEXTBOX,_hyPreferencesPrecision,"Desired precision(absolute error) in ln-likelihood value. Settings between 0.1 and 0.000000001 are recommended.",
+                          "0.001",nil,globalPreferencesList,false);
+    optionList = "Low,Normal,High,Very High";
+    _hyPreferencesKeys.Insert(_hyPreferencesPersistence.makeDynamic(),((_List*)globalPreferencesList.lData[4])->lLength);
+    AddItemToPreferences (0,PREFITEM_POPUP,_hyPreferencesPersistence,"Controls the number iterations the optimization algorithm will perform before it terminates if the desired precision is not met.",
+                          "Normal",optionList.Tokenize (comma), globalPreferencesList,true);
+    optionList = "Do not use distances,Use distances";
+    _hyPreferencesKeys.Insert(_hyPreferencesInitGuess.makeDynamic(),((_List*)globalPreferencesList.lData[4])->lLength);
+    AddItemToPreferences (0,PREFITEM_POPUP,_hyPreferencesInitGuess,"Determines whether distance methods are to be used to obtain intial parameter value guesses. Applies only to nuceleotide models.",
+                          "Use distances",optionList.Tokenize (comma), globalPreferencesList,true);
+    _hyPreferencesKeys.Insert(_hyPreferencesStartValue.makeDynamic(),((_List*)globalPreferencesList.lData[4])->lLength);
+    AddItemToPreferences (0,PREFITEM_TEXTBOX,_hyPreferencesStartValue,"Sets starting values for parameters for optimization routines. If starting values are obtained by distance methods, this option is ignored.",
+                          "0.1",nil,globalPreferencesList,false);
+    AddItemToPreferences (1|8,-1,"Data Read/Write Settings","Options affecting sequence data files reading and writing.","",nil,globalPreferencesList,false);
+    optionList = "Skip Deletions,Keep Deletions";
+    _hyPreferencesKeys.Insert(_hyPreferencesDeletions.makeDynamic(),((_List*)globalPreferencesList.lData[4])->lLength);
+    AddItemToPreferences (0,PREFITEM_POPUP,_hyPreferencesDeletions,"Choose \"Keep Deletions\" to retain deletions (as ambiguities) for analyses. \"Skip Deletions\" filters deletions out as the data is read.","Keep Deletions",
+                          optionList.Tokenize (comma), globalPreferencesList,true);
+    optionList = "# sequential,# interleaved,PHYLIP Sequential,PHYLIP Interleaved,NEXUS sequential with labels,NEXUS interleaved with labels,NEXUS sequential without labels,NEXUS interleaved without labels,Comma separated characters,FASTA sequential,FASTA interleaved";
+    _hyPreferencesKeys.Insert(_hyPreferencesFormat.makeDynamic(),((_List*)globalPreferencesList.lData[4])->lLength);
+    AddItemToPreferences (0,PREFITEM_POPUP,_hyPreferencesFormat,"Choose the default file format for data filters output to files via fprintf.","NEXUS sequential without labels",
+                          optionList.Tokenize (comma), globalPreferencesList,true);
+
+    _hyPreferencesKeys.Insert(_hyPreferencesLineWidth.makeDynamic(),((_List*)globalPreferencesList.lData[4])->lLength);
+    AddItemToPreferences (0,PREFITEM_TEXTBOX,_hyPreferencesLineWidth,"This options sets how many characters will be printed per line for data filters output to files via fprintf. Only affects interleaved formats.",
+                          "50",nil,globalPreferencesList,false);
+    _hyPreferencesKeys.Insert(_hyPreferencesGapWidth.makeDynamic(),((_List*)globalPreferencesList.lData[4])->lLength);
+    AddItemToPreferences (0,PREFITEM_TEXTBOX,_hyPreferencesGapWidth,"This options sets how many characters will be printed per cluster (clusters are separated by spaces) for data filters output to files via fprintf. Only affects interleaved non-NEXUS formats.",
+                          "10",nil,globalPreferencesList,false);
+
+    optionList = "Yes,No";
+    _hyPreferencesKeys.Insert(_hyPreferencesGapFreqs.makeDynamic(),((_List*)globalPreferencesList.lData[4])->lLength);
+    AddItemToPreferences (0,PREFITEM_POPUP,_hyPreferencesGapFreqs,"Include gaps (as fully unresolved characters) in frequency counts","Yes",
+                          optionList.Tokenize (comma), globalPreferencesList,true);
+
+    AddItemToPreferences (1|8,-1,"Simulation Options","Options affecting bootstrapping algorithms.","",nil,globalPreferencesList,false);
+    optionList = "Discrete Distribution,Continuous Distribution";
+    _hyPreferencesKeys.Insert(_hyPreferencesHetSimulation.makeDynamic(),((_List*)globalPreferencesList.lData[4])->lLength);
+    AddItemToPreferences (0,PREFITEM_POPUP,_hyPreferencesHetSimulation,"When bootstrapping models with heterogeneous rates, determines whether rate classes are drawn from the continuous (e.g. gamma) distribution or it's discrete approximation.",
+                          "Continuous Distribution", optionList.Tokenize (comma), globalPreferencesList,true);
+
+    _hyPreferencesKeys.Insert(_hyPreferencesRandomSeed.makeDynamic(),((_List*)globalPreferencesList.lData[4])->lLength);
+    AddItemToPreferences (0,PREFITEM_TEXTBOX,_hyPreferencesRandomSeed,"Set this parameter to -1 to have HYPHY seed random generator anew every time the program is run. A positive value defines the seed to be used instead. Changes will take effect when HYPHY is restarted.",
+                          "-1",nil,globalPreferencesList,false);
+
+    AddItemToPreferences (1|8,-1,"Miscellaneous Options","Variuos, primarily formatting, options.","",nil,globalPreferencesList,false);
+    optionList = "Function value only,Complete report as list,Tree with branch lengths,Parameters and Constraints,Batch Language Statement,Batch Language Statement with Trees";
+    _hyPreferencesKeys.Insert(_hyPreferencesLikelihoodDisp.makeDynamic(),((_List*)globalPreferencesList.lData[4])->lLength);
+    AddItemToPreferences (0,PREFITEM_POPUP,_hyPreferencesLikelihoodDisp,"Various ways to display likelihood function and parameters","Tree with branch lengths",
+                          optionList.Tokenize (comma), globalPreferencesList,true);
+
+    optionList = "Short,Normal,Long,Maximally Long";
+    _hyPreferencesKeys.Insert(_hyPreferencesNumberFormat.makeDynamic(),((_List*)globalPreferencesList.lData[4])->lLength);
+    AddItemToPreferences (0,PREFITEM_POPUP,_hyPreferencesNumberFormat,"Determines how many significant digits are displayed when printing numbers via fprintf.","Normal",
+                          optionList.Tokenize (comma), globalPreferencesList,true);
+
+    optionList = "No auto display,Auto display single tree,Auto display all trees";
+
+    _hyPreferencesKeys.Insert(_hyPreferencesTreeDisplay.makeDynamic(),((_List*)globalPreferencesList.lData[4])->lLength);
+    AddItemToPreferences (0,PREFITEM_POPUP,_hyPreferencesTreeDisplay,"Should HY-PHY automatically open graphical tree windows upon completion of an analysis.","Auto display single tree",
+                          optionList.Tokenize (comma), globalPreferencesList,true);
+
+    optionList = "Silent,Verbose";
+    _hyPreferencesKeys.Insert(_hyPreferencesOptProgress.makeDynamic(),((_List*)globalPreferencesList.lData[4])->lLength);
+    AddItemToPreferences (0,PREFITEM_POPUP,_hyPreferencesOptProgress,"Triggers the optimization functions to print out progress lines while obtaining MLEs","Silent",
+                          optionList.Tokenize (comma), globalPreferencesList,true);
+    optionList = "Yes,No";
+    _hyPreferencesKeys.Insert(_hyPreferencesStartupDialog.makeDynamic(),((_List*)globalPreferencesList.lData[4])->lLength);
+    AddItemToPreferences (0,PREFITEM_POPUP,_hyPreferencesStartupDialog,"Display an action dialog when HyPhy starts up","Yes",
+                          optionList.Tokenize (comma), globalPreferencesList,true);
+    optionList = "Yes,No";
+    _hyPreferencesKeys.Insert(_hyPreferencesAutomoveC.makeDynamic(),((_List*)globalPreferencesList.lData[4])->lLength);
+    AddItemToPreferences (0,PREFITEM_POPUP,_hyPreferencesAutomoveC,"Automatically move and resize console window when a data panel is opened","Yes",
+                          optionList.Tokenize (comma), globalPreferencesList,true);
+
+#ifdef       __MP__
+    AddItemToPreferences (1|8,-1,"Multiple Processors","Multiple Processor Settings","",nil,globalPreferencesList,false);
+    _List options;
+    for (long cpCount = 1; cpCount <= systemCPUCount; cpCount++) {
+        _String cc (cpCount);
+        options && & cc;
+    }
+    _hyPreferencesKeys.Insert(_hyPreferencesMP.makeDynamic(),((_List*)globalPreferencesList.lData[4])->lLength);
+    AddItemToPreferences (0,PREFITEM_POPUP,_hyPreferencesMP,"How many CPUs should HYPHY try to load.",_String(systemCPUCount),&options,globalPreferencesList,false);
+#endif
+
+    _String * fileContents = nil;
+
+#ifdef __HEADLESS__
+    optionList       = baseDirectory & ".init";
+    FILE * hpp       = doFileOpen (optionList.getStr(),"rb");
+    if (hpp) {
+        fileContents = new _String (hpp);
+        fclose (hpp);
+    }
+#else
+#ifdef __MAC__
+    Str255      buffer="\pHYPHYKernel Preferences";
+    short       prefVolID,
+                osErr;
+
+    long        prefFolderID = 0;
+
+    FindFolder (kOnSystemDisk,kPreferencesFolderType,kCreateFolder,&prefVolID,&prefFolderID);
+    FSSpec fileSpec;
+    FSMakeFSSpec(prefVolID,prefFolderID,buffer,&fileSpec);
+    if ((osErr=FSpOpenDF (&fileSpec,fsRdWrPerm,&prefFileRefNumber))!=noErr) {
+#ifndef __HYPHYXCODE__
+        if ((osErr=FSpCreate(&fileSpec,_fcreator,'pref',GetScriptManagerVariable(smSysScript)))!=noErr)
+#else
+        if ((osErr=FSpCreate(&fileSpec,'MuSe','pref',GetScriptManagerVariable(smSysScript)))!=noErr)
+#endif
+            prefFileRefNumber = -1;
+        else if ((osErr=FSpOpenDF (&fileSpec,fsRdWrPerm,&prefFileRefNumber))!=noErr) {
+            prefFileRefNumber = -1;
+        }
+    }
+    if (prefFileRefNumber!=-1) {
+        GetEOF(prefFileRefNumber,&prefFolderID);
+        if (prefFolderID>0) {
+            fileContents = new _String ((unsigned long)prefFolderID);
+            FSRead (prefFileRefNumber,&prefFolderID,fileContents->sData);
+            fileContents->sData[prefFolderID] = 0;
+        }
+    }
+#endif
+
+#ifdef __WINDOZE__
+    _String  prefFileName = baseDirectory&prefFileTitle;
+
+    if ((prefFileHandle = fopen (prefFileName.getStr(),"r+"))) {
+        fileContents = new _String (prefFileHandle);
+        fclose (prefFileHandle);
+    }
+
+#endif
+
+#ifdef __HYPHY_GTK__
+    optionList       = baseDirectory & ".hyphyprefs";
+    FILE * prefsFile = fopen (optionList.sData,"rb");
+
+    if (prefsFile) {
+        fileContents = new _String (prefsFile);
+        fclose (prefsFile);
+    }
+#endif
+#endif
+
+
+    _List terms,
+          * availNames = (_List*)globalPreferencesList(1),
+            * availValues = (_List*)globalPreferencesList(4);
+
+    if (fileContents) {
+        _ElementaryCommand::ExtractConditions(*fileContents,0,terms);
+        for (long k=0; k<terms.lLength; k++) {
+            _List    theTerms;
+            _ElementaryCommand::ExtractConditions(*((_String*)terms(k)),0,theTerms,'=');
+            if (theTerms.lLength == 2) {
+                _String * prefID = (_String*)theTerms.lData[0];
+                long    j = availNames->Find (prefID);
+
+                if (j>=0) {
+                    *((_String*)availValues->lData[j]) = *(_String*)theTerms.lData[1];
+                } else {
+                    if (prefID->Equal (&windowPositionStr)) {
+#ifndef __HEADLESS__
+                        _List*  rectSizes = ((_String*)theTerms.lData[1])->Tokenize (",");
+                        if (rectSizes->lLength==4) {
+                            consolePositionRectangle.left   = MAX(((_String*)(*rectSizes)(0))->toNum(),0);
+                            consolePositionRectangle.right  = MAX(((_String*)(*rectSizes)(2))->toNum(),consolePositionRectangle.left+50);
+
+                            consolePositionRectangle.top    = MAX(((_String*)(*rectSizes)(1))->toNum(),0);
+                            consolePositionRectangle.bottom = MAX(((_String*)(*rectSizes)(3))->toNum(),consolePositionRectangle.top+50);
+                        }
+                        DeleteObject (rectSizes);
+#endif
+                    } else if (prefID->Equal (&recentFilesList)) {
+                        _List* filePaths = ((_String*)theTerms.lData[1])->Tokenize (",");
+                        for (long idx = 0; idx<filePaths->lLength; idx+=2) {
+                            _String * sn = (_String*)(*filePaths)(idx),
+                                      * sp = (_String*)(*filePaths)(idx+1);
+
+                            sn->StripQuotes();
+                            sp->StripQuotes();
+                            AddStringToRecentMenu(*sn,*sp);
+                        }
+                        DeleteObject (filePaths);
+                    }
+#if defined __WINDOZE__ && !defined __HEADLESS__
+                    else if (prefID->Equal (&hyWindowsConsoleFont)) {
+                        _List fontList;
+                        _ElementaryCommand::ExtractConditions(*(_String*)theTerms.lData[1],0,fontList,',');
+                        if (fontList.lLength>=2) {
+                            _HYFont cF;
+                            cF.face     = *(_String*)fontList.lData[0];
+                            cF.size     = ((_String*)fontList.lData[1])->toNum();
+                            if (fontList.lLength > 2) {
+                                cF.style    = ((_String*)fontList.lData[2])->toNum();
+                            } else {
+                                cF.style    = HY_FONT_PLAIN;
+                            }
+
+                            ((_HYTextBox*)hyphyConsoleWindow->GetObject(0))->SetFont(cF);
+                            ((_HYTextBox*)hyphyConsoleWindow->GetObject(1))->SetFont(cF);
+                        }
+                    }
+#endif
+                }
+            }
+        }
+    }
+
+    long    aS = ((_String*)(availValues->lData[_hyPreferencesKeys.GetXtra(_hyPreferencesKeys.Find(&_hyPreferencesRandomSeed))]))->toNum();
+    if (aS>=0) {
+        init_genrand (aS);
+    }
+
+    showDialogAtStartup = *(((_String*)(availValues->lData[_hyPreferencesKeys.GetXtra(_hyPreferencesKeys.Find(&_hyPreferencesStartupDialog))])))==_String("Yes");
+    doAutoConsoleMove   = *(((_String*)(availValues->lData[_hyPreferencesKeys.GetXtra(_hyPreferencesKeys.Find(&_hyPreferencesAutomoveC))])))==_String("Yes");
+
+    DeleteObject        (fileContents);
+}
+
+//____________________________________________________________________________________________
+
+void  SetPreferences (void)
+{
+#ifndef __HEADLESS__
+#if defined __MAC__ or defined __HYPHY_GTK__
+    if (!hyphyConsoleWindow) {
+        return;
+    }
+
+    _String*        prefValue,
+                    prefKey;
+
+    _HYFont         newFont;
+    _List*          prefValues = (_List*)globalPreferencesList(4);
+
+    newFont.face = *(_String*)prefValues->lData[_hyPreferencesKeys.GetXtra(_hyPreferencesKeys.Find(&_hyPreferencesFontFace))];
+    // font face
+
+    newFont.size = ((_String*)prefValues->lData[_hyPreferencesKeys.GetXtra(_hyPreferencesKeys.Find(&_hyPreferencesFontSize))])->toNum();
+    // font size
+
+    if (newFont.size<4 || newFont.size>100) {
+        newFont.size = ((_HYTextBox*)hyphyConsoleWindow->GetObject (0))->GetFont().size;    // use existing font size
+    }
+
+    prefValue   = (_String*)prefValues->lData[_hyPreferencesKeys.GetXtra(_hyPreferencesKeys.Find(&_hyPreferencesFontStyle))];
+    // font style
+
+    if (*prefValue == _String ("Bold")) {
+        newFont.style = HY_FONT_BOLD;
+    } else if (*prefValue == _String ("Italic")) {
+        newFont.style = HY_FONT_ITALIC;
+    } else {
+        newFont.style = HY_FONT_PLAIN;
+    }
+
+    ((_HYTextBox*)hyphyConsoleWindow->GetObject (0))->SetFont (newFont); // main panel
+    ((_HYTextBox*)hyphyConsoleWindow->GetObject (1))->SetFont (newFont); // user input panel
+#endif
+#endif
+}
+
+
+//____________________________________________________________________________________________
+
+void  WritePreferences (void)
+{
+#ifdef __MAC__
+    if (prefFileRefNumber!=-1)
+#endif
+
+#ifdef __WINDOZE__
+        _String  prefFileName = baseDirectory&prefFileTitle;
+        prefFileHandle = fopen (prefFileName.sData,"w+");
+    if (prefFileHandle)
+#endif
+
+#ifdef __HYPHY_GTK__
+        _String  prefFileName = baseDirectory & ".hyphyprefs";
+    FILE * prefFile = fopen (prefFileName.sData, "wb");
+    if (prefFile)
+#endif
+
+    {
+        _String      spoolResult((unsigned long)256, true);
+        _SimpleList* pCodes = (_SimpleList*)globalPreferencesList(0);
+
+        _List *pNames = (_List*)globalPreferencesList(1),
+               *pValues = (_List*)globalPreferencesList(4);
+        for (long i = 0; i<pCodes->lLength; i++)
+            if (pCodes->lData[i]<8) { // not a rubrik header
+                spoolResult<<(_String*)pNames->lData[i];
+                spoolResult<<'=';
+                spoolResult<<(_String*)pValues->lData[i];
+                spoolResult<<';';
+            }
+
+#ifndef __HEADLESS__
+        // convert the coordinate info to a comma separated string
+        _HYRect    wr = hyphyConsoleWindow->GetWindowRect();
+
+        spoolResult<<windowPositionStr;
+        spoolResult<<'=';
+        spoolResult<<_String ((long)wr.left);
+        spoolResult<<',';
+        spoolResult<<_String ((long)wr.top);
+        spoolResult<<',';
+        spoolResult<<_String ((long)wr.right);
+        spoolResult<<',';
+        spoolResult<<_String ((long)wr.bottom);
+        spoolResult<<';';
+
+        if (recentFiles.lLength) {
+            spoolResult << recentFilesList;
+            spoolResult << '=';
+            for (long k=0; k<recentFiles.lLength; k++) {
+                if (k) {
+                    spoolResult << ',';
+                }
+                spoolResult << '"';
+                spoolResult << (_String*)recentFiles(k);
+                spoolResult << "\",\"";
+                spoolResult << (_String*)recentPaths(k);
+                spoolResult << '"';
+            }
+            spoolResult << ';';
+        }
+#endif
+
+#if defined __WINDOZE__ && ! defined __HEADLESS__
+        _HYFont cF  = ((_HYTextBox*)hyphyConsoleWindow->GetObject(0))->GetFont();
+        spoolResult<< hyWindowsConsoleFont;
+        spoolResult<< '=';
+        spoolResult<< &cF.face;
+        spoolResult<< ',';
+        spoolResult<< _String((long)cF.size);
+        spoolResult<< ',';
+        spoolResult<< _String((long)cF.style);
+        spoolResult<< ';';
+#endif
+
+        spoolResult.Finalize();
+        StringToConsole (spoolResult);
+
+
+#ifdef __MAC__
+        SetEOF (prefFileRefNumber,0);
+        FSWrite(prefFileRefNumber,(long*)&spoolResult.sLength,spoolResult.sData);
+        FSClose(prefFileRefNumber);
+#endif
+
+#ifdef __WINDOZE__
+        fwrite (spoolResult.sData,1,spoolResult.sLength,prefFileHandle);
+        fflush (prefFileHandle);
+        fclose (prefFileHandle);
+#endif
+
+#ifdef __HYPHY_GTK__
+        fwrite (spoolResult.sData, spoolResult.sLength, 1, prefFile);
+        fclose (prefFile);
+#endif
+
+    }
+}
+
+//____________________________________________________________________________________________
+
+void  ApplyPreferences (void)
+{
+    _List           *pfValues = (_List*)globalPreferencesList.lData[4],
+                     *t;
+
+    long            keyIndex = _hyPreferencesKeys.GetXtra(_hyPreferencesKeys.Find(&_hyPreferencesPersistence));
+
+    setParameter    (optimizationPrecision, ((_String*)pfValues->lData[_hyPreferencesKeys.GetXtra(_hyPreferencesKeys.Find(&_hyPreferencesPrecision))])->toNum());
+
+    t               = (_List*)((_List*)globalPreferencesList.lData[5])->lData[keyIndex];
+    long    f       = t->Find (((_String*)pfValues->lData[keyIndex]));
+
+    switch (f) {
+    case 0:
+        f = 200;
+        break;
+    case 1:
+        f = -1;
+        break;
+    case 2:
+        f = 2000;
+        break;
+    case 3:
+        f = 50000;
+    }
+
+    if (f>0) {
+        setParameter (maximumIterationsPerVariable, (_Parameter)f);
+    }
+
+    setParameter (globalStartingPoint, ((_String*)pfValues->lData[_hyPreferencesKeys.GetXtra(_hyPreferencesKeys.Find(&_hyPreferencesStartValue))])->toNum());
+    setParameter (useInitialDistanceGuess, (_Parameter)(*((_String*)pfValues->lData[_hyPreferencesKeys.GetXtra(_hyPreferencesKeys.Find(&_hyPreferencesInitGuess))])==_String("Use distances")));
+
+    setParameter (skipOmissions, (_Parameter)(*((_String*)pfValues->lData[_hyPreferencesKeys.GetXtra(_hyPreferencesKeys.Find(&_hyPreferencesDeletions))])==_String("Skip Deletions")));
+
+    keyIndex = _hyPreferencesKeys.GetXtra(_hyPreferencesKeys.Find(&_hyPreferencesFormat));
+    t = (_List*)((_List*)globalPreferencesList.lData[5])->lData[keyIndex];
+    f = t->Find (((_String*)pfValues->lData[keyIndex]));
+    if (f<0) {
+        f = 6;
+    }
+    setParameter (dataFilePrintFormat, (_Parameter)f);
+    setParameter (dataFileDefaultWidth , (long)(((_String*)pfValues->lData[_hyPreferencesKeys.GetXtra(_hyPreferencesKeys.Find(&_hyPreferencesLineWidth))])->toNum()));
+    setParameter (dataFileGapWidth ,     (long)(((_String*)pfValues->lData[_hyPreferencesKeys.GetXtra(_hyPreferencesKeys.Find(&_hyPreferencesGapWidth))])->toNum()));
+
+    setParameter (categorySimulationMethod, (_Parameter)((*((_String*)pfValues->lData[_hyPreferencesKeys.GetXtra(_hyPreferencesKeys.Find(&_hyPreferencesHetSimulation))])
+                  !=_String("Discrete Distribution")))+1.0);
+
+    setParameter (hfCountGap, (_Parameter)((*((_String*)pfValues->lData[_hyPreferencesKeys.GetXtra(_hyPreferencesKeys.Find(&_hyPreferencesGapFreqs))])
+                                            !=_String("No"))));
+
+    f = ((_String*)pfValues->lData[_hyPreferencesKeys.GetXtra(_hyPreferencesKeys.Find(&_hyPreferencesRandomSeed))])->toNum();
+    if (f>=0) {
+        setParameter (randomSeed, f);
+    }
+
+    keyIndex = _hyPreferencesKeys.GetXtra(_hyPreferencesKeys.Find(&_hyPreferencesLikelihoodDisp));
+    t = (_List*)((_List*)globalPreferencesList.lData[5])->lData[keyIndex];
+    f = t->Find (((_String*)pfValues->lData[keyIndex]));
+    if (f<0) {
+        f = 0;
+    }
+    setParameter (likefuncOutput, (_Parameter)f);
+
+    keyIndex = _hyPreferencesKeys.GetXtra(_hyPreferencesKeys.Find(&_hyPreferencesNumberFormat));
+    t = (_List*)((_List*)globalPreferencesList.lData[5])->lData[keyIndex];
+    f = t->Find (((_String*)pfValues->lData[keyIndex]));
+    if (f<0) {
+        f = 1;
+    }
+    switch (f) {
+    case 0:
+        printDigits = 5;
+        break;
+    case 2:
+        printDigits = 12;
+        break;
+    case 3:
+        printDigits = 15;
+    }
+    setParameter (printDigitsSpec,printDigits);
+
+    keyIndex = _hyPreferencesKeys.GetXtra(_hyPreferencesKeys.Find(&_hyPreferencesTreeDisplay));
+    t = (_List*)((_List*)globalPreferencesList.lData[5])->lData[keyIndex];
+    f = t->Find (((_String*)pfValues->lData[keyIndex]));
+    setParameter (treeDisplayOptions, f);
+
+    keyIndex = _hyPreferencesKeys.GetXtra(_hyPreferencesKeys.Find(&_hyPreferencesOptProgress));
+    t = (_List*)((_List*)globalPreferencesList.lData[5])->lData[keyIndex];
+    verbosityLevel      = t->Find (((_String*)pfValues->lData[keyIndex]))?5:(-1);
+    setParameter        (VerbosityLevelString,verbosityLevel);
+
+    doAutoConsoleMove   = *(((_String*)((_List*)globalPreferencesList.lData[4])->lData[_hyPreferencesKeys.GetXtra(_hyPreferencesKeys.Find(&_hyPreferencesAutomoveC))]))==_String("Yes");
+#ifdef       __MP__
+    systemCPUCount= ((_String*)pfValues->lData[_hyPreferencesKeys.GetXtra(_hyPreferencesKeys.Find(&_hyPreferencesMP))])->toNum();
+    if (systemCPUCount<1) {
+        systemCPUCount = 1;
+    }
+#endif
+
+}
+
+//__________________________________________________________________________________
+void    AddItemToPreferences (long itemCode, long itemKind, _String itemTitle, _String itemDescription,
+                              _String itemValue, _List* itemOptions, _List& theTarget, bool deleteItem)
+{
+    if (theTarget.lLength!=6) {
+        theTarget.Clear();
+        _SimpleList dummySList;
+        _List       dummyList;
+        theTarget&& &dummySList;
+        theTarget&& &dummyList;
+        theTarget&& &dummyList;
+        theTarget&& &dummySList;
+        theTarget&& &dummyList;
+        theTarget&& &dummyList;
+    }
+
+    long f = ((_List*)theTarget(1))->Find (&itemTitle);
+
+    if (f<0) {
+        (*((_SimpleList*)theTarget(0)))<<itemCode;
+        (*((_SimpleList*)theTarget(3)))<<itemKind;
+        (*((_List*)theTarget(1)))&& &itemTitle;
+        (*((_List*)theTarget(2)))&& &itemDescription;
+        (*((_List*)theTarget(4)))&& &itemValue;
+        if (itemOptions) {
+            (*((_List*)theTarget(5)))&& itemOptions;
+        } else {
+            _List dummyList;
+            (*((_List*)theTarget(5)))&& & dummyList;
+        }
+    } else {
+        (*((_SimpleList*)theTarget(0))).lData[f]=itemCode;
+        (*((_SimpleList*)theTarget(3))).lData[f]=itemKind;
+        (*((_List*)theTarget(1))).Replace (f,&itemTitle, true);
+        (*((_List*)theTarget(2))).Replace (f,&itemDescription, true);
+        (*((_List*)theTarget(4))).Replace (f,&itemValue, true);
+        if (itemOptions) {
+            (*((_List*)theTarget(5))).Replace (f,itemOptions, true);
+        } else {
+            _List dummyList;
+            (*((_List*)theTarget(5))).Replace (f,&dummyList, true);
+        }
+    }
+
+    if (deleteItem) {
+        DeleteObject (itemOptions);
+    }
+}
+
+//__________________________________________________________________________________
+void    AddStringToRecentMenu (_String& fName, _String& pName)
+{
+    if (recentPaths.Find (&pName)>=0) {
+        return;    // already in the menu - nothing to do!
+    }
+
+#if defined __HYPHY_GTK__ && ! defined __HEADLESS__
+    if (!hyphyConsoleWindow) {
+        return;
+    }
+
+    static    GtkItemFactoryEntry *itemFactoryHolder = nil;
+    static    _List               itemFactoryStrings;
+    for (long mi=0; mi<recentFiles.lLength; mi++) {
+        GtkWidget * recFile = gtk_item_factory_get_widget_by_action(hyphyConsoleWindow->menu_items,2000+mi);
+        if (recFile) {
+            gtk_item_factory_delete_item(hyphyConsoleWindow->menu_items,gtk_item_factory_path_from_widget(recFile));
+        }
+    }
+    if (itemFactoryHolder) {
+        delete itemFactoryHolder;
+    }
+    itemFactoryStrings.Clear();
+
+#endif
+
+    if (recentFiles.lLength==RECENT_FILE_ITEMS) {
+#ifdef __MAC__
+        DeleteMenuItem (recentFilesMenu, RECENT_FILE_ITEMS);
+#endif
+        recentFiles.Delete(RECENT_FILE_ITEMS-1);
+        recentPaths.Delete(RECENT_FILE_ITEMS-1);
+    }
+#if defined __WINDOZE__ && ! defined __HEADLESS__
+    else if (recentFilesMenu) {
+        InsertMenu (recentFilesMenu,-1,MF_BYPOSITION,1999+recentFiles.lLength,(LPSTR)fName.getStr());
+    }
+#endif
+
+    recentFiles.InsertElement(&fName,0,true);
+    recentPaths.InsertElement(&pName,0,true);
+
+#if defined __MAC__ && ! defined __HEADLESS__
+    if (recentFilesMenu) {
+        Str255          buffer;
+        StringToStr255 (fName, buffer);
+        InsertMenuItem (recentFilesMenu,buffer,0);
+    }
+#endif
+
+#if defined __WINDOZE__ && ! defined __HEADLESS__
+    if (recentFilesMenu) {
+        for (long mi=0; mi<recentFiles.lLength; mi++) {
+            ModifyMenu (recentFilesMenu,mi+2,MF_BYPOSITION,2000+mi,((_String*)recentFiles(mi))->getStr());
+        }
+
+        DrawMenuBar ((HWND)hyphyConsoleWindow->GetOSWindowData());
+    }
+#endif
+
+#if defined __HYPHY_GTK__ && ! defined __HEADLESS__
+    if (recentFiles.lLength) {
+        itemFactoryHolder = new GtkItemFactoryEntry[recentFiles.lLength];
+    }
+    for (long mi=0; mi<recentFiles.lLength; mi++) {
+        itemFactoryStrings.AppendNewInstance(new _String(_String("/File/Open/Open Recent/") & *((_String*)recentFiles(mi))));
+        itemFactoryHolder[mi] = (GtkItemFactoryEntry) {
+            ((_String*)(itemFactoryStrings(mi)))->sData,NULL,(GtkItemFactoryCallback)hyphy_menu_item_callback,2000+mi,"<Item>"
+        };
+        gtk_item_factory_create_items (hyphyConsoleWindow->menu_items,  1, &(itemFactoryHolder[mi]), hyphyConsoleWindow);
+    }
+#endif
+
+}
+
+//__________________________________________________________________________________
+char        AutoOpenTreeWindow (void)
+{
+    _Parameter ad;
+    checkParameter (treeDisplayOptions, ad, 0.0);
+    return     ad;
+}
+
+//__________________________________________________________________________________
+void        SetShowDialogAtStartup (bool flag)
+{
+    if (flag) {
+        *(((_String*)((_List*)globalPreferencesList.lData[4])->lData[_hyPreferencesKeys.GetXtra(_hyPreferencesKeys.Find(&_hyPreferencesStartupDialog))])) = "Yes";
+    } else {
+        *(((_String*)((_List*)globalPreferencesList.lData[4])->lData[_hyPreferencesKeys.GetXtra(_hyPreferencesKeys.Find(&_hyPreferencesStartupDialog))])) = "No";
+    }
+}
+//EOF
diff --git a/src/gui/qt/helpers.cpp b/src/gui/qt/helpers.cpp
new file mode 100644
index 0000000..98f820d
--- /dev/null
+++ b/src/gui/qt/helpers.cpp
@@ -0,0 +1,242 @@
+/*
+
+HyPhy - Hypothesis Testing Using Phylogenies.
+
+Copyright (C) 1997-now
+Core Developers:
+  Sergei L Kosakovsky Pond (spond at ucsd.edu)
+  Art FY Poon    (apoon at cfenet.ubc.ca)
+  Steven Weaver (sweaver at ucsd.edu)
+  
+Module Developers:
+	Lance Hepler (nlhepler at gmail.com)
+	Martin Smith (martin.audacis at gmail.com)
+
+Significant contributions from:
+  Spencer V Muse (muse at stat.ncsu.edu)
+  Simon DW Frost (sdf22 at cam.ac.uk)
+
+Permission is hereby granted, free of charge, to any person obtaining a
+copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be included
+in all copies or substantial portions of the Software.
+
+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.
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+*/
+
+#include <QApplication>
+#include <QWidget>
+#include <QEvent>
+#include <QMouseEvent>
+#include <QFile>
+#include <QUrl>
+#include <QDebug>
+
+#include "hy_strings.h"
+#include "hyphymain.h"
+#include "hyphyevents.h"
+#include "hyphyhierarchicalselector.h"
+#include "hyphy_qt_helpers.h"
+#include "simplerequest.h"
+
+bool needExtraNL = true; 
+bool dropIntoDebugMode=false;
+
+void StringToConsole(_String& str, _SimpleList* color)
+{
+   BufferToConsole(str.sData, color);
+}
+
+void BufferToConsole(const char* buffer, _SimpleList* color)
+{
+    QBufferToConsoleEvent event((QString)buffer, color);
+    QApplication::sendEvent(_hyPrimaryConsoleWindow, &event);
+}
+
+_String* StringFromConsole (bool echo)
+{
+    if (_hyPrimaryConsoleWindow) {
+        _hyPrimaryConsoleWindow->setWaitingOnStringFromConsole(true);
+        QEventLoop loop;
+        QObject::connect(_hyPrimaryConsoleWindow, SIGNAL(handled_user_input()), &loop, SLOT(quit()));
+         
+        // Execute the event loop here, now we will wait here until readyRead() signal is emitted
+        // which in turn will trigger event loop quit.
+        loop.exec();
+         
+        return new _String(_hyPrimaryConsoleWindow->getUserData());
+    }
+    return nil;
+}
+
+void SetStatusLineUser(_String s)
+{
+
+}
+
+void SetStatusLine(_String statusUpdate)
+{
+    _hyPrimaryConsoleWindow->SetStatusLine(statusUpdate);
+}
+
+void SetStatusLine(_String fn, _String updatedStatus, _String timer)
+{
+    _hyPrimaryConsoleWindow->SetStatusLine(fn, updatedStatus, timer);
+}
+
+void SetStatusLine(_String fn, _String updatedStatus, _String timer, long percentDone)
+{
+    _hyPrimaryConsoleWindow->SetStatusLine(fn, updatedStatus, timer, percentDone);
+}
+
+void SetStatusLine (_String arg, _String arg2, _String arg3, long l, char c) {
+    _hyPrimaryConsoleWindow->SetStatusLine(arg,arg2,arg3,l,c);
+}
+
+void ClearStatusLine () {
+    _hyPrimaryConsoleWindow->ClearStatusLine();
+}
+
+void SetStatusBarValue (long l, _Parameter max, _Parameter rate)
+{
+    _hyPrimaryConsoleWindow->SetStatusBarValue(l,max,rate);
+}
+
+bool Get_a_URL (_String& urls, _String* fileName)
+{
+    SimpleRequest* getter = new SimpleRequest;
+
+    QNetworkReply* reply = getter->requestUrl((QString)urls.sData);
+
+    //Let's make this synchronous for now
+    QEventLoop loop;
+    QObject::connect(getter, SIGNAL(networkError(const QString)), &loop, SLOT(quit()));
+    QObject::connect(reply, SIGNAL(readyRead()), &loop, SLOT(quit()));
+    loop.exec();
+
+    //Check for an error
+    if(reply->error()) {
+        //TODO:Return something more meaningful. SW20121127
+        return false;
+    }
+
+    QByteArray rawData = reply->readAll();
+
+    //Either rewrite urls, or save to a file based on "fileName"
+    if(fileName) {
+        QFile file((QString)fileName->sData);
+
+        if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) {
+            //TODO: Return something more meaningful. SW20121127
+            return false;
+        }
+
+        file.write(rawData);
+        file.close();
+    }
+
+    else {
+        //Set urls since that's what the parser uses for the data
+        urls = (_String)rawData.data();
+    }
+
+    return true;
+}
+
+//____________________________________________________________________________________________
+
+void NLToConsole()
+{
+
+}
+
+//____________________________________________________________________________________________
+
+long  HandleListSelection (_List& data, _SimpleList& choices, _SimpleList& validChoices, _String titleInfo, _SimpleList& selections, long fixedLength, Ptr prt)
+
+{
+    long res = -1;
+    if (data.lLength < 1 || validChoices.lLength < 1) {
+        WarnError ("An empty list of choices was passed to 'HandleListSelection'");
+    } else {
+        selections.Clear();
+        _HY_HierarchicalSelector *hs = new _HY_HierarchicalSelector((QWidget*)prt, data, choices, validChoices, titleInfo, &selections, fixedLength, true);
+        hs->setWindowModality(Qt::WindowModal);
+        hs->exec();
+        res = selections.lLength;
+        if (res == 0) {
+            return -1;
+        }
+        if (res == 1) {
+            return selections.lData[0];
+        }
+        
+    }
+    return res;
+}
+
+//____________________________________________________________________________________________
+
+long  HandleListSelection (_List& data, _String titleInfo, Ptr prt)
+{
+    _SimpleList validChoices,
+    choices,
+    sels;
+    
+    _List       menuData;
+    
+    validChoices << 0;
+    validChoices << 1;
+    
+    for (unsigned long k=0; k<data.lLength; k+=2) {
+        _List aChoice;
+        
+        aChoice << data (k);
+        aChoice << data (k+1);
+        
+        menuData && & aChoice;
+        
+        choices << choices.lLength;
+    }
+    
+    if (HandleListSelection (menuData, validChoices, choices, titleInfo, sels, 1, prt) > 0) {
+        return sels.lData[0];
+    }
+    return -1;
+}
+
+//____________________________________________________________________________________________
+
+void yieldCPUTime (void) {
+    handleGUI();
+}
+
+//____________________________________________________________________________________________
+
+bool handleGUI (bool checkForEvents) {
+    if (!checkForEvents || QCoreApplication::hasPendingEvents()) {
+        QCoreApplication::processEvents ();
+    }
+    return QCoreApplication::closingDown();
+}
+
+//____________________________________________________________________________________________
+
+void DoApplicationSettings (void) {
+    QCoreApplication::setOrganizationName("Viral Evolution Group");
+    QCoreApplication::setOrganizationDomain("www.hyphy.org");
+    QCoreApplication::setApplicationName("HyPhy");
+}
diff --git a/src/gui/qt/hyphy_qt_utility.cpp b/src/gui/qt/hyphy_qt_utility.cpp
new file mode 100644
index 0000000..13a70e7
--- /dev/null
+++ b/src/gui/qt/hyphy_qt_utility.cpp
@@ -0,0 +1,54 @@
+/*
+
+HyPhy - Hypothesis Testing Using Phylogenies.
+
+Copyright (C) 1997-now
+Core Developers:
+  Sergei L Kosakovsky Pond (spond at ucsd.edu)
+  Art FY Poon    (apoon at cfenet.ubc.ca)
+  Steven Weaver (sweaver at ucsd.edu)
+  
+Module Developers:
+	Lance Hepler (nlhepler at gmail.com)
+	Martin Smith (martin.audacis at gmail.com)
+
+Significant contributions from:
+  Spencer V Muse (muse at stat.ncsu.edu)
+  Simon DW Frost (sdf22 at cam.ac.uk)
+
+Permission is hereby granted, free of charge, to any person obtaining a
+copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be included
+in all copies or substantial portions of the Software.
+
+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.
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+*/
+
+#include "hyphymain.h"
+#include "hy_strings.h"
+
+_String _hyQTFileDialog (_String caption, _String defaultFileName, bool isWrite){
+    QString fileName;
+    if (isWrite) {
+        fileName = QFileDialog::getSaveFileName(NULL, caption.getStr(), defaultFileName.getStr(),
+                                                "All Files (*.*);;Text Files (*.txt)");        
+    } else {
+        fileName = QFileDialog::getOpenFileName(NULL, caption.getStr(), "",
+                                                        "All Files (*.*);;Text Files (*.txt)");
+    }
+     
+    return _String (fileName.toAscii().data()) ;
+}
diff --git a/src/gui/qt/hyphyevents.cpp b/src/gui/qt/hyphyevents.cpp
new file mode 100644
index 0000000..51e24b2
--- /dev/null
+++ b/src/gui/qt/hyphyevents.cpp
@@ -0,0 +1,49 @@
+
+/*
+
+HyPhy - Hypothesis Testing Using Phylogenies.
+
+Copyright (C) 1997-now
+Core Developers:
+  Sergei L Kosakovsky Pond (spond at ucsd.edu)
+  Art FY Poon    (apoon at cfenet.ubc.ca)
+  Steven Weaver (sweaver at ucsd.edu)
+  
+Module Developers:
+	Lance Hepler (nlhepler at gmail.com)
+	Martin Smith (martin.audacis at gmail.com)
+
+Significant contributions from:
+  Spencer V Muse (muse at stat.ncsu.edu)
+  Simon DW Frost (sdf22 at cam.ac.uk)
+
+Permission is hereby granted, free of charge, to any person obtaining a
+copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be included
+in all copies or substantial portions of the Software.
+
+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.
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+*/
+
+#include "hyphyevents.h"
+#include <QDebug> 
+
+QBufferToConsoleEvent::QBufferToConsoleEvent(QString bufferStr, _SimpleList* color) : QEvent(BufferToStringType) {
+    this->bufferStr = bufferStr;
+    if (color) {
+        textColor.Duplicate (color);
+    }
+}
diff --git a/src/gui/qt/hyphyhierarchicalselector.cpp b/src/gui/qt/hyphyhierarchicalselector.cpp
new file mode 100644
index 0000000..9d0c9d6
--- /dev/null
+++ b/src/gui/qt/hyphyhierarchicalselector.cpp
@@ -0,0 +1,248 @@
+/*
+
+HyPhy - Hypothesis Testing Using Phylogenies.
+
+Copyright (C) 1997-now
+Core Developers:
+  Sergei L Kosakovsky Pond (spond at ucsd.edu)
+  Art FY Poon    (apoon at cfenet.ubc.ca)
+  Steven Weaver (sweaver at ucsd.edu)
+  
+Module Developers:
+	Lance Hepler (nlhepler at gmail.com)
+	Martin Smith (martin.audacis at gmail.com)
+
+Significant contributions from:
+  Spencer V Muse (muse at stat.ncsu.edu)
+  Simon DW Frost (sdf22 at cam.ac.uk)
+
+Permission is hereby granted, free of charge, to any person obtaining a
+copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be included
+in all copies or substantial portions of the Software.
+
+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.
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+*/
+
+#include <QList>
+#include <QFile>
+#include <QTextStream>
+#include <QMessageBox>
+#include <QRegExp>
+#include <QDebug>
+#include <QPushButton>
+#include <QKeyEvent>
+
+
+//HyPhy specific
+#include "batchlan.h"
+#include "avllistxl.h"
+#include "hyphyhierarchicalselector.h"
+
+_List      _HY_HierarchicalSelectorPreviousSelections_Aux;
+_AVLListXL _HY_HierarchicalSelectorPreviousSelections(&_HY_HierarchicalSelectorPreviousSelections_Aux);
+
+_HY_HierarchicalSelector::_HY_HierarchicalSelector(QWidget *parent, _List& definition, _SimpleList& c, _SimpleList& vc, _String n, _SimpleList* s, long r, bool is_modal) : QDialog(parent) {
+        setupUi(this);
+
+        //Tree Widget setup
+        setWindowTitle(QString(n.sData));
+        
+        if (r >= 1) {
+            n = n & " (select " & r &")";
+        } else {
+            n = n & " (select 1 or more)";
+        }
+        
+        itemList->setHeaderLabels(QStringList(n.sData));
+        if (r != 1) {
+            itemList->setSelectionMode (QAbstractItemView::ExtendedSelection);
+    }
+    //this->loadTree();
+    if (is_modal) {
+        if (parent) {
+            setWindowFlags (Qt::Sheet);
+        } else {
+            this->setModal (true);
+        }
+    } else {
+        this->setModal (false);
+    }
+    
+    validChoices.Duplicate(&vc);
+
+    unsigned long  counter;
+    
+    QTreeWidgetItem       *  current_item = NULL;
+    
+    for (counter = 0; counter< validChoices.lLength; counter++) {
+        _String* tStr = (_String*)(*(_List*)(definition(validChoices.lData[counter])))(c.lData[0]);
+        bool is_a_header = tStr->sData[0] == '!';
+        if (is_a_header) {
+            iData.AppendNewInstance (new _String(*tStr,1,-1));
+            offsets << counter;
+        } else {
+            iData  << tStr;
+        }
+        dData << (*(_List*)(definition(validChoices.lData[counter])))(c.lData[1]);
+        QTreeWidgetItem * this_item = new QTreeWidgetItem((QTreeWidget*)NULL, QStringList(((_String*)iData(iData.lLength-1))->sData));
+        if (is_a_header) {
+            current_item = this_item;
+            //this_item->setFlags (Qt::ItemIsEnabled);
+        }  else {
+            if (current_item) {
+                current_item -> addChild (this_item);
+                continue;
+            }
+        }
+        if (!is_a_header)
+            offsets << counter;
+        itemList->addTopLevelItem(this_item);
+    }
+    
+    selections = s;
+    result     = r;
+    validSelection = false;
+    toggleAcceptStatus (0);
+    
+    buttonBox->installEventFilter(this);
+    itemList->installEventFilter(this);
+    explanationLabel->installEventFilter (this);
+    
+
+
+   //Connect buttons
+    connect(buttonBox, SIGNAL(accepted()), this, SLOT(ok()));
+    connect(buttonBox, SIGNAL(rejected()), this, SLOT(cancel()));
+    connect(itemList, SIGNAL(itemSelectionChanged()), this, SLOT(handle_selection_change()));
+    connect(itemList, SIGNAL(itemDoubleClicked ( QTreeWidgetItem*, int ) ), this, SLOT(handle_double_click()));
+    SetInitialSelection ();
+}
+
+//______________________________________________________________
+
+
+void _HY_HierarchicalSelector::ok() {
+    //Get currently selected treewidget item
+    QList <QTreeWidgetItem*> selection = itemList->selectedItems();
+    if (selection.count()) {
+        _String * selectedValue = new _String(selection.at(0)->text(0).toAscii().data()),
+                wTitle (windowTitle().toAscii().data());
+        
+         _HY_HierarchicalSelectorPreviousSelections.UpdateValue(&wTitle, selectedValue, false, true);
+    }
+    this->accept();
+}
+
+//______________________________________________________________
+
+void _HY_HierarchicalSelector::SetInitialSelection () {
+    _String wTitle (windowTitle().toAscii().data()),
+            *value = (_String*)_HY_HierarchicalSelectorPreviousSelections.GetDataByKey(&wTitle);
+    QTreeWidgetItem * theItem;        
+    if (value) {
+        QString theValue (value->sData);
+        QList<QTreeWidgetItem *> matches = itemList->findItems(theValue, Qt::MatchStartsWith);
+        if (matches.count() > 0) {
+            theItem = matches.at(0);
+        }
+    } else {
+        theItem = itemList->topLevelItem(0);
+    }
+    itemList->setCurrentItem(theItem);
+}
+
+
+//______________________________________________________________
+
+void _HY_HierarchicalSelector::cancel() {
+    selections->Clear();
+    this->reject();
+}
+
+//______________________________________________________________
+
+void _HY_HierarchicalSelector::toggleAcceptStatus (long selected) {
+    validSelection = (result>0 && selected == result) || (selected > 0);
+    QPushButton* OK = buttonBox->button(QDialogButtonBox::Ok);
+    if (OK) {
+        OK->setEnabled(validSelection);
+    }   
+}
+
+//______________________________________________________________
+
+void _HY_HierarchicalSelector::handle_double_click() {
+    if (validSelection) {
+        accept();
+    }
+}
+
+//______________________________________________________________
+
+void _HY_HierarchicalSelector::handle_selection_change() {
+    QList <QTreeWidgetItem*> selection = itemList->selectedItems();
+    
+    _String aboutText (128L, true);
+    long    rawSelected = selection.count();
+            
+    selections->Clear();
+    
+    for (long k = 0; k < rawSelected; k ++ )    {
+        QTreeWidgetItem* theSelection = selection.at(k),
+                       * parent = theSelection->parent();
+        long           item_offset = 0;
+        if (parent) {
+            item_offset = offsets.lData[itemList->indexOfTopLevelItem(parent)] + parent->indexOfChild(theSelection)+1;
+        } else {
+            item_offset = offsets.lData[itemList->indexOfTopLevelItem(theSelection)];   
+        }
+        if (theSelection->childCount() == 0) {
+            (*selections) << item_offset;
+        }
+        aboutText << *(_String*)dData(item_offset);
+        if (k) {
+            aboutText << '\n';
+        }
+    }
+    aboutText.Finalize();    
+    
+    explanationLabel->document()->setPlainText (QString(aboutText.sData));
+    toggleAcceptStatus (selections->lLength);
+}
+
+//______________________________________________________________
+
+void _HY_HierarchicalSelector::closeEvent(QCloseEvent *event) {
+    if (!validSelection) {
+        selections->Clear();
+    }
+    QDialog::closeEvent (event);
+}
+
+//______________________________________________________________
+ 
+bool _HY_HierarchicalSelector::eventFilter ( QObject * watched, QEvent * event ) {
+    if (event->type () == QEvent::KeyPress) {
+        QKeyEvent *keyEvent = (QKeyEvent*)(event);
+        if (keyEvent->key () == Qt::Key_Escape) {
+            selections->Clear();
+            return false;
+        }
+     }
+    return QDialog::eventFilter(watched, event);
+}
+
diff --git a/src/gui/qt/hyphymain.cpp b/src/gui/qt/hyphymain.cpp
new file mode 100644
index 0000000..313e243
--- /dev/null
+++ b/src/gui/qt/hyphymain.cpp
@@ -0,0 +1,470 @@
+/*
+
+HyPhy - Hypothesis Testing Using Phylogenies.
+
+Copyright (C) 1997-now
+Core Developers:
+  Sergei L Kosakovsky Pond (spond at ucsd.edu)
+  Art FY Poon    (apoon at cfenet.ubc.ca)
+  Steven Weaver (sweaver at ucsd.edu)
+  
+Module Developers:
+	Lance Hepler (nlhepler at gmail.com)
+	Martin Smith (martin.audacis at gmail.com)
+
+Significant contributions from:
+  Spencer V Muse (muse at stat.ncsu.edu)
+  Simon DW Frost (sdf22 at cam.ac.uk)
+
+Permission is hereby granted, free of charge, to any person obtaining a
+copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be included
+in all copies or substantial portions of the Software.
+
+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.
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+*/
+
+#include <QDebug>
+
+#include <QtGui>
+#include <QDir>
+#include <QStatusBar>
+#include <QSpacerItem>
+#include "hyphymain.h"
+
+//For OSX number of cpus
+#include <sys/sysctl.h>
+
+#include "hy_strings.h"
+#include "HYUtils.h"
+
+#include "qterminal.h"
+#include "hyphyhierarchicalselector.h"
+#include "hyphymessageoutput.h"
+#include "hyphyevents.h"
+#include "hyphy_qt_helpers.h"
+
+#include "HYSharedMain.h"
+
+//QString messageFileName = "messages.log";
+extern _String messageFileName;
+
+//#define  STATUS_BAR_LABEL_WIDTH 100 
+HyphyMain::HyphyMain(QMainWindow *parent) : QMainWindow(parent) {
+    setupUi(this);
+    waitingOnStringFromConsole = false;
+    initialText();
+    initializeMenuBar();
+    initializeStatusBar();
+    installEventFilter(this);
+}
+
+void HyphyMain::initialText() {
+    //Options
+    console->setLineWrapMode(QTextEdit::FixedColumnWidth);
+    console->setWordWrapMode(QTextOption::WordWrap);
+    console->setLineWrapColumnOrWidth(80);
+    console->setLineWrapMode(QTextEdit::WidgetWidth);
+
+    //HyPhy version
+    _String version = GetVersionString();
+    console->insertHtml((QString)version + ". ");
+ 
+#ifdef _OPENMP
+    systemCPUCount = omp_get_max_threads();
+#else
+    systemCPUCount = 1;
+#endif
+    console->insertHtml("Up to " + QString::number(systemCPUCount) + " threads can be used for analyses.<p>");
+
+    //The HyPhy Citation request
+    QString qtHyphyCiteString = "\
+            <p> If you use HyPhy in a publication, please cite \
+            <b>SL Kosakovsky Pond, SDW Frost and SV Muse. (2005)</b> \
+            HyPhy: hypothesis testing using phylogenies. \
+            <i>Bioinformatics 21: 676-679</i> \
+            </p> \
+            <p> If you are a new HyPhy user, the tutorial located at \
+            <a href='http://www.hyphy.org/docs/HyphyDocs.pdf'>\
+            http://www.hyphy.org/docs/HyphyDocs.pdf</a> \
+            may be a good starting point. </p> \
+            <br><br>\
+            ";
+    console->insertHtml(qtHyphyCiteString);
+
+    //Begin prompting for user input
+    console->prompt();
+}
+
+void HyphyMain::initializeMenuBar() {
+
+    //Create File Menu Options
+    _hyConsoleOpenAction = new QAction(tr("&Open Batch File"), this);
+    _hyConsoleOpenAction->setShortcuts(QKeySequence::Open);
+    _hyConsoleOpenAction->setStatusTip(tr("Open a HyPhy Batch Language File"));
+    _hyConsoleSaveAction = new QAction(tr("&Save Console"), this);
+    _hyConsoleSaveAction->setShortcuts(QKeySequence::Save);
+    _hyConsoleSaveAction->setStatusTip(tr("Save HyPhy console content"));
+    _hyConsoleExitAction = new QAction(tr("&Quit"), this);
+
+    //Connect File Menu Events to appropriate slots
+    connect(_hyConsoleOpenAction, SIGNAL(triggered()), this, SLOT(hy_open()));
+    connect(_hyConsoleSaveAction, SIGNAL(triggered()), this, SLOT(hy_save()));
+    connect(_hyConsoleExitAction, SIGNAL(triggered()), this, SLOT(close()));
+
+    //Add the File Menu to the Menu Bar
+    _hyConsoleMenu = menuBar()->addMenu(tr("&File"));
+    _hyConsoleMenu->addAction(_hyConsoleOpenAction);
+    _hyConsoleMenu->addAction(_hyConsoleSaveAction);
+    _hyConsoleMenu->addSeparator();
+    _hyConsoleMenu->addAction(_hyConsoleExitAction);
+
+    //Create Edit Menu Options
+    _hyConsoleUndoAction = new QAction(tr("&Undo"),this);
+    _hyConsoleUndoAction->setShortcuts(QKeySequence::Undo);
+    _hyConsoleRedoAction = new QAction(tr("&Redo"),this);
+    _hyConsoleRedoAction->setShortcuts(QKeySequence::Redo);
+
+    //No Cutting allowed for right now
+    _hyConsoleCopyAction = new QAction(tr("&Copy"),this);
+    _hyConsoleCopyAction->setShortcuts(QKeySequence::Copy);
+    _hyConsolePasteAction = new QAction(tr("&Paste"),this);
+    _hyConsolePasteAction->setShortcuts(QKeySequence::Paste);
+    _hyConsoleFindAction = new QAction(tr("&Find"),this);
+    _hyConsoleFindAction->setShortcuts(QKeySequence::Find);
+    _hyConsoleSelectAllAction = new QAction(tr("&Select All"),this);
+    _hyConsoleSelectAllAction->setShortcuts(QKeySequence::SelectAll);
+    _hyConsoleClearWindowAction = new QAction(tr("&Clear Window"),this);
+    _hyConsoleClearWindowAction->setStatusTip("Clears the Console Window");
+
+    //Connect Edit Menu Events to appropriate slots
+    connect(_hyConsoleUndoAction, SIGNAL(triggered()), console, SLOT(undo()));
+    connect(_hyConsoleRedoAction, SIGNAL(triggered()), console, SLOT(redo()));
+    //connect(_hyConsoleCutAction, SIGNAL(triggered()), console, SLOT(cut()));
+    connect(_hyConsoleCopyAction, SIGNAL(triggered()), console, SLOT(copy()));
+    connect(_hyConsolePasteAction, SIGNAL(triggered()), console, SLOT(paste()));
+    //connect(_hyConsoleFindAction, SIGNAL(triggered()), console, SLOT(find()));
+    connect(_hyConsoleSelectAllAction, SIGNAL(triggered()), console, SLOT(selectAll()));
+    //connect(_hyConsoleClearWindowAction, SIGNAL(triggered()), console, SLOT(clearwindow()));
+
+    connect(console, SIGNAL(userEnteredString(const QString)), this, SLOT(handle_user_input(const QString)));
+
+    //Add the Edit Menu to the Menu Bar
+    _hyConsoleMenu = menuBar()->addMenu(tr("&Edit"));
+    _hyConsoleMenu->addAction(_hyConsoleUndoAction);
+    _hyConsoleMenu->addAction(_hyConsoleRedoAction);
+    _hyConsoleMenu->addSeparator();
+    //_hyConsoleMenu->addAction(_hyConsoleCutAction);
+    _hyConsoleMenu->addAction(_hyConsoleCopyAction);
+    _hyConsoleMenu->addAction(_hyConsolePasteAction);
+    _hyConsoleMenu->addSeparator();
+    _hyConsoleMenu->addAction(_hyConsoleFindAction);
+    _hyConsoleMenu->addSeparator();
+    _hyConsoleMenu->addAction(_hyConsoleSelectAllAction);
+    _hyConsoleMenu->addAction(_hyConsoleClearWindowAction);
+
+    //Create Analysis Menu Options
+    _hyConsoleCancelExecutionAction = new QAction(tr("&Cancel Execution"),this);
+    _hyConsoleCancelExecutionAction->setStatusTip("Cancels Execution of Analysis Currently Running");
+    _hyConsoleSuspendExecutionAction = new QAction(tr("&Suspend Execution"),this);
+    _hyConsoleViewLogAction = new QAction(tr("&View Log"),this);
+    _hyConsoleStandardAnalysisAction = new QAction(tr("&Standard Analysis"),this);
+    QList <QKeySequence>keyList;
+    keyList << QKeySequence ("Ctrl+E");
+    _hyConsoleStandardAnalysisAction->setShortcuts(keyList);
+    _hyConsoleStandardAnalysisAction->setStatusTip("Standard Analysis");
+    _hyConsoleResultsAction = new QAction(tr("&Results"),this);
+    _hyConsoleResultsAction->setEnabled(false);
+    _hyConsoleRerunLastAnalysisAction = new QAction(tr("&Rerun Last Analysis"),this);
+    _hyConsoleRerunLastAnalysisAction->setEnabled(false);
+
+    //Connect Analysis Menu Events to appropriate slots
+    connect(_hyConsoleCancelExecutionAction, SIGNAL(triggered()), this, SLOT(hy_cancelexecution()));
+    connect(_hyConsoleSuspendExecutionAction, SIGNAL(triggered()), this, SLOT(hy_suspendexecution()));
+    connect(_hyConsoleViewLogAction, SIGNAL(triggered()), this, SLOT(hy_viewlog()));
+    connect(_hyConsoleStandardAnalysisAction, SIGNAL(triggered()), this, SLOT(hy_standardanalysis()));
+    connect(_hyConsoleResultsAction, SIGNAL(triggered()), this, SLOT(hy_results()));
+    connect(_hyConsoleRerunLastAnalysisAction, SIGNAL(triggered()), this, SLOT(hy_rerunlastanalysis()));
+
+    //Add the Analysis Menu to the Menu Bar
+    _hyConsoleMenu = menuBar()->addMenu(tr("&Analysis"));
+    _hyConsoleMenu->addAction(_hyConsoleCancelExecutionAction);
+    _hyConsoleMenu->addAction(_hyConsoleSuspendExecutionAction);
+    _hyConsoleMenu->addSeparator();
+    _hyConsoleMenu->addAction(_hyConsoleViewLogAction);
+    _hyConsoleMenu->addSeparator();
+    _hyConsoleMenu->addAction(_hyConsoleStandardAnalysisAction);
+    _hyConsoleMenu->addAction(_hyConsoleResultsAction);
+    _hyConsoleMenu->addAction(_hyConsoleRerunLastAnalysisAction);
+
+    //Create Windows Menu Options
+    _hyConsoleMinimizeAction = new QAction(tr("&Minimize"),this);
+    _hyConsoleConsoleWindowAction = new QAction(tr("&Console Window"),this);
+    _hyConsoleObjectInspectorAction = new QAction(tr("&Object Inspector"),this);
+    _hyConsoleCycleThroughWindowsAction = new QAction(tr("&Cycle Through Windows"),this);
+
+    //Connect Windows Menu Events to appropriate slots
+    connect(_hyConsoleMinimizeAction, SIGNAL(triggered()), this, SLOT(hy_minimize()));
+    connect(_hyConsoleConsoleWindowAction, SIGNAL(triggered()), this, SLOT(hy_consolewindow()));
+    connect(_hyConsoleObjectInspectorAction, SIGNAL(triggered()), this, SLOT(hy_objectinspector()));
+    connect(_hyConsoleCycleThroughWindowsAction, SIGNAL(triggered()), this, SLOT(hy_cyclethroughwindows()));
+
+    //Add the Windows Menu to the Menu Bar
+    _hyConsoleMenu = menuBar()->addMenu(tr("&Window"));
+    _hyConsoleMenu->addAction(_hyConsoleMinimizeAction);
+    _hyConsoleUndoAction->setShortcuts(QKeySequence::Undo);
+    _hyConsoleMenu->addAction(_hyConsoleConsoleWindowAction);
+    _hyConsoleMenu->addAction(_hyConsoleObjectInspectorAction);
+    _hyConsoleMenu->addSeparator();
+    _hyConsoleMenu->addAction(_hyConsoleCycleThroughWindowsAction);
+}
+
+void HyphyMain::initializeStatusBar() {
+
+    this->filename_status = new QLabel(this);
+    this->updated_status = new QLabel(this);
+
+    this->progress_bar = new QProgressBar(this);
+    this->progress_bar->hide();
+
+    this->status = statusBar();
+    this->status->insertWidget(0,updated_status, 1);
+    this->status->insertWidget(1,progress_bar, 0);
+    this->status->addPermanentWidget(filename_status, 0);
+    status->show();
+
+}
+
+//File Menu Options
+void HyphyMain::hy_open() {
+    if (OpenBatchFile (true)) {
+         lastAnalysisFilePath = (char*)argFileName->sData;
+         ExecuteBatchFile();
+    }
+}
+
+void HyphyMain::hy_save() {
+    console->insertPlainText((QString)_hyQTFileDialog ("Save console contents to", "HyPhy Console.txt", true));
+}
+
+void HyphyMain::quit() {
+}
+
+//Analysis Menu
+void HyphyMain::hy_cancelexecution(){}
+void HyphyMain::hy_suspendexecution(){}
+
+void HyphyMain::hy_viewlog(){
+    messageFileName = "messages.log";
+    QString path = QDir::currentPath() + '/' + messageFileName.getStr();
+    _HY_MessageOutput *mo = new _HY_MessageOutput(path,0,0);
+    mo->show();
+}
+
+void HyphyMain::hy_standardanalysis() {
+
+    _SimpleList std,
+                vc (availableTemplateFiles.lLength,0,1),
+                selections;
+                
+    std<<2;
+    std<<1;
+
+    _HY_HierarchicalSelector *hs = new _HY_HierarchicalSelector(this, availableTemplateFiles, std, vc, "Standard Analyses", &selections, 1, true);
+    hs->setWindowModality(Qt::WindowModal);
+    hs->exec(); 
+    if (selections.lLength == 1) {
+        RunTemplate (selections.lData[0]);
+        lastAnalysisFilePath = (char*)argFileName->sData;
+    }
+}
+
+void HyphyMain::hy_results(){}
+void HyphyMain::hy_rerunlastanalysis(){}
+
+//Window Menu
+void HyphyMain::hy_minimize(){}
+void HyphyMain::hy_consolewindow(){}
+void HyphyMain::hy_objectinspector(){}
+void HyphyMain::hy_cyclethroughwindows(){}
+
+void HyphyMain::AppendTextToEnd(const QString& text, bool isHTML, _SimpleList* color) {
+    console->moveCursor(QTextCursor::End);
+    if (isHTML) 
+        console->insertHtml(text);
+    else {
+        QColor currentColor = console->textColor();
+        if (color && color->lLength >= 3) {
+            console->setTextColor (QColor (color->lData[0], color->lData[1], color->lData[2]));
+        } else {
+            console->setTextColor (QColor (0,0,212));            
+        }
+        console->insertPlainText(text);
+        console->setTextColor (currentColor);
+    }
+}
+
+void HyphyMain::DisplayPrompt     (void) {
+    console->moveCursor(QTextCursor::End);
+    console->prompt();
+}
+
+bool HyphyMain::eventFilter(QObject *obj, QEvent *event) {
+    if (event->type() == BufferToStringType) {
+        AppendTextToEnd (((QBufferToConsoleEvent*)event)->buffer(), false, &((QBufferToConsoleEvent*)event)->color());
+        return true;
+    }
+
+    return QMainWindow::eventFilter(obj,event);
+}
+
+//Status line specific
+void HyphyMain::StartBarTimer() {
+      //this->_timer->start(1000);
+      //this->_elapsed_timer->start();
+}
+
+void HyphyMain:: StopBarTimer() {
+      //this->_timer->stop();
+}
+
+void HyphyMain::update_timer_display() {
+
+    //Need to format the elapsed time :/
+    //const int elapsed = (int)(_elapsed_timer->elapsed()/1000);
+    //const int mins = elapsed / 60;
+    //const int secs = elapsed % 60;
+
+    //QString minStr = (mins >= 10) ? QString::number(mins) : QString::fromLatin1("0") + QString::number(mins);
+    //QString secStr = (secs >= 10) ? QString::number(secs) : QString::fromLatin1("0") + QString::number(secs);
+
+    //this->timerDisplay->display(minStr + QString::fromLatin1(":") + secStr);
+
+}
+
+void HyphyMain::SetStatusLine(_String updatedStatus){
+    this->updated_status->setText(updatedStatus.getStr());
+    this->status->show();
+}
+
+void HyphyMain::SetStatusLine (_String fn, _String updatedStatus, _String timer){
+    this->SetStatusLine(updatedStatus.getStr());
+
+    _String label_text = _String("Running ")&fn;
+    this->filename_status->setText(label_text.getStr());
+
+    //TODO: Timer
+    //this->timerDisplay->setText(updatedStatus.getStr());
+}
+
+void HyphyMain::SetStatusLine (_String fn, _String updatedStatus, _String timer, long percentDone){
+
+    this->SetStatusLine(fn,updatedStatus,timer);
+
+    if (percentDone < 100 || percentDone > 0) {
+        this->status->insertWidget(1,progress_bar, 0);
+    }
+
+    else {
+        this->status->removeWidget(progress_bar);
+    }
+
+    this->progress_bar->setValue(percentDone);
+}
+
+void HyphyMain::SetStatusLine (_String fn, _String updatedStatus, _String timer, long percentDone, char c){
+    this->SetStatusLine(fn,updatedStatus,timer,percentDone);
+    //handle c
+}
+
+void HyphyMain::ClearStatusLine (){
+    this->updated_status->setText("");
+    this->filename_status->setText("");
+}
+
+void HyphyMain::SetStatusBarValue (long percentDone, _Parameter max, _Parameter rate) {
+    //this->progressBar->setValue(percentDone);
+}
+
+void HyphyMain::AddStringToRecentMenu (const _String, const _String) {
+
+}
+
+void HyphyMain::closeEvent(QCloseEvent *event) {
+    WriteSettings();
+    QMainWindow::closeEvent (event);
+}
+
+void HyphyMain::setWaitingOnStringFromConsole (bool value) {
+    if (value) {
+        console->newline(true);
+        console->prompt(true);
+    }
+    waitingOnStringFromConsole = value;
+}
+
+void HyphyMain::handle_user_input(const QString data) {
+    if (waitingOnStringFromConsole) {
+        setWaitingOnStringFromConsole (false);
+        userData = (_String)(char *)data.toAscii().data();
+        emit handled_user_input();
+    } else {
+        if (data == "?") {
+            //printf ("Expression calculator %s\n", data.toAscii().data());
+            this->printHelp();
+        } else if (data.length()) {
+            //printf ("Expression calculator %s\n", data.toAscii().data());
+            ExpressionCalculator((_String)(char *)data.toAscii().data());
+        }
+
+        console->newline(true);
+        console->prompt();
+    }
+}
+
+void HyphyMain::ReadSettings (void) {
+    QSettings settings;
+    settings.beginGroup("ConsoleWindow");
+    restoreGeometry (settings.value("geometry").toByteArray());
+    restoreState (settings.value("windowState").toByteArray());
+    settings.endGroup();    
+}
+
+void HyphyMain::WriteSettings (void) {
+    QSettings settings;
+    settings.beginGroup("ConsoleWindow");
+    settings.setValue("geometry", saveGeometry());
+    settings.setValue("windowState", saveState());
+    settings.endGroup();    
+    
+}
+
+void HyphyMain::printHelp(void) {
+
+    QString help_string = 
+    "<p> Here are a couple of resources to help you get started. \ 
+    <ul>\
+        <li><a href='http://hyphy.org/w/index.php/Category:HBL_Built-in_function'>Built-in Language Commands</a></li>\
+        <li><a href='http://hyphy.org/'>Wiki Main Page</a></li>\
+    </ul>\
+    </p>\
+    <p>If you are a new HyPhy user, you may want to read the tutorial located at \
+    <a href='http://www.hyphy.org/docs/HyphyDocs.pdf'>http://www.hyphy.org/docs/HyphyDocs.pdf</a>\
+    </p> \
+    <br><br>";
+
+    console->insertHtml(help_string);
+}
diff --git a/src/gui/qt/hyphymessageoutput.cpp b/src/gui/qt/hyphymessageoutput.cpp
new file mode 100644
index 0000000..56d68d6
--- /dev/null
+++ b/src/gui/qt/hyphymessageoutput.cpp
@@ -0,0 +1,70 @@
+/*
+
+HyPhy - Hypothesis Testing Using Phylogenies.
+
+Copyright (C) 1997-now
+Core Developers:
+  Sergei L Kosakovsky Pond (spond at ucsd.edu)
+  Art FY Poon    (apoon at cfenet.ubc.ca)
+  Steven Weaver (sweaver at ucsd.edu)
+  
+Module Developers:
+	Lance Hepler (nlhepler at gmail.com)
+	Martin Smith (martin.audacis at gmail.com)
+
+Significant contributions from:
+  Spencer V Muse (muse at stat.ncsu.edu)
+  Simon DW Frost (sdf22 at cam.ac.uk)
+
+Permission is hereby granted, free of charge, to any person obtaining a
+copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be included
+in all copies or substantial portions of the Software.
+
+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.
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+*/
+
+#include <QList>
+#include <QFile>
+#include <QTextStream>
+#include <QMessageBox>
+#include <QRegExp>
+#include <QPushButton>
+#include <QKeyEvent>
+#include <QDebug>
+
+#include "hyphymessageoutput.h"
+
+_HY_MessageOutput::_HY_MessageOutput(QString fn, QWidget * parent, Qt::WindowFlags f) : QWidget(parent) {
+    setupUi(this);
+
+    //Readout file to display
+    QFile file(fn);
+
+    if (!file.open(QIODevice::ReadOnly)) {
+     QMessageBox::warning(this, tr("Error Opening File"),
+                          tr("Could not open '%1'").arg(fn));
+    }
+
+    QByteArray data = file.readAll();
+    qDebug() << fn; 
+    qDebug() << file.readAll(); 
+    this->textBrowser->setText(file.readAll());
+
+    //Make read only
+    this->textBrowser->setReadOnly(true);
+
+}
diff --git a/src/gui/qt/include/hyphy_qt_helpers.h b/src/gui/qt/include/hyphy_qt_helpers.h
new file mode 100644
index 0000000..2e885dd
--- /dev/null
+++ b/src/gui/qt/include/hyphy_qt_helpers.h
@@ -0,0 +1,75 @@
+/*
+
+HyPhy - Hypothesis Testing Using Phylogenies.
+
+Copyright (C) 1997-now
+Core Developers:
+  Sergei L Kosakovsky Pond (spond at ucsd.edu)
+  Art FY Poon    (apoon at cfenet.ubc.ca)
+  Steven Weaver (sweaver at ucsd.edu)
+  
+Module Developers:
+	Lance Hepler (nlhepler at gmail.com)
+	Martin Smith (martin.audacis at gmail.com)
+
+Significant contributions from:
+  Spencer V Muse (muse at stat.ncsu.edu)
+  Simon DW Frost (sdf22 at cam.ac.uk)
+
+Permission is hereby granted, free of charge, to any person obtaining a
+copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be included
+in all copies or substantial portions of the Software.
+
+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.
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+*/
+
+#pragma once
+
+#include <QtCore>
+#include <QtGui>
+#include "defines.h"
+#include "batchlan.h"
+#include "ui_hyphymain.h"
+#include "hyphymain.h"
+#include "hy_strings.h"
+
+extern HyphyMain* _hyPrimaryConsoleWindow;
+
+_String _hyQTFileDialog (_String caption, _String defaultFileName, bool isWrite);
+
+/**
+ * Display a platform appropriate file selection dialog
+ * @param caption: dialog caption string
+ * @param defaultFileName (for write dialogs): the default file name to display
+ * @param isWrite: whether or not to display a read/write dialog
+ * @return full path to the selected file name; empty if canceled.
+ */
+
+
+long  HandleListSelection (_List& data, _SimpleList& choices, _SimpleList& validChoices, _String titleInfo, _SimpleList& selections, long fixedLength, Ptr prt);
+long  HandleListSelection (_List& data, _String titleInfo, Ptr prt);
+
+
+
+
+void    SetStatusLineUser(_String s);
+void    SetStatusBarValue (long l, _Parameter max, _Parameter rate);
+bool    Get_a_URL (_String& urls, _String* fileName);
+
+void ClearStatusLine();
+
+void    DoApplicationSettings (void);
diff --git a/src/gui/qt/include/hyphyevents.h b/src/gui/qt/include/hyphyevents.h
new file mode 100644
index 0000000..990631c
--- /dev/null
+++ b/src/gui/qt/include/hyphyevents.h
@@ -0,0 +1,59 @@
+
+/*
+
+HyPhy - Hypothesis Testing Using Phylogenies.
+
+Copyright (C) 1997-now
+Core Developers:
+  Sergei L Kosakovsky Pond (spond at ucsd.edu)
+  Art FY Poon    (apoon at cfenet.ubc.ca)
+  Steven Weaver (sweaver at ucsd.edu)
+  
+Module Developers:
+	Lance Hepler (nlhepler at gmail.com)
+	Martin Smith (martin.audacis at gmail.com)
+
+Significant contributions from:
+  Spencer V Muse (muse at stat.ncsu.edu)
+  Simon DW Frost (sdf22 at cam.ac.uk)
+
+Permission is hereby granted, free of charge, to any person obtaining a
+copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be included
+in all copies or substantial portions of the Software.
+
+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.
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+*/
+
+#pragma once
+
+#include <QEvent>
+#include <QString>
+#include "simplelist.h"
+
+const QEvent::Type BufferToStringType = QEvent::Type(QEvent::User+1);
+
+class Q_GUI_EXPORT QBufferToConsoleEvent : public QEvent
+{
+public:
+    QBufferToConsoleEvent(QString bufferStr, _SimpleList* color = nil);
+    //~QBufferToConsoleEvent();
+    inline QString buffer() const { return bufferStr; }
+    inline _SimpleList& color () { return textColor;}
+protected:
+    QString bufferStr;
+    _SimpleList textColor;
+};
diff --git a/src/gui/qt/include/hyphyhierarchicalselector.h b/src/gui/qt/include/hyphyhierarchicalselector.h
new file mode 100644
index 0000000..92a3716
--- /dev/null
+++ b/src/gui/qt/include/hyphyhierarchicalselector.h
@@ -0,0 +1,83 @@
+
+/*
+
+HyPhy - Hypothesis Testing Using Phylogenies.
+
+Copyright (C) 1997-now
+Core Developers:
+  Sergei L Kosakovsky Pond (spond at ucsd.edu)
+  Art FY Poon    (apoon at cfenet.ubc.ca)
+  Steven Weaver (sweaver at ucsd.edu)
+  
+Module Developers:
+	Lance Hepler (nlhepler at gmail.com)
+	Martin Smith (martin.audacis at gmail.com)
+
+Significant contributions from:
+  Spencer V Muse (muse at stat.ncsu.edu)
+  Simon DW Frost (sdf22 at cam.ac.uk)
+
+Permission is hereby granted, free of charge, to any person obtaining a
+copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be included
+in all copies or substantial portions of the Software.
+
+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.
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+*/
+
+#pragma once
+#include <QDialog>
+#include "ui_hyphyhierarchicalselector.h"
+#include "list.h"
+#include "hy_strings.h"
+
+
+class _HY_HierarchicalSelector : public QDialog, private Ui::Dialog
+{
+    Q_OBJECT
+
+public:
+    _HY_HierarchicalSelector(QWidget *parent, _List& definition, _SimpleList& c, _SimpleList& vc, _String n, _SimpleList* s, long r, bool is_modal = true);
+virtual
+    ~_HY_HierarchicalSelector () {};
+    void SetInitialSelection ();
+    
+protected:
+
+    bool eventFilter ( QObject * watched, QEvent * event );
+
+private:   
+    void  toggleAcceptStatus(long);
+    void  closeEvent(QCloseEvent *event);
+
+    _List data,
+          iData,
+          dData;
+          
+    _SimpleList validChoices,
+                *selections,
+                offsets;
+                
+    long          result;
+    _String       lastString;
+    bool          validSelection;
+
+private slots:
+    void ok();
+    void cancel();
+    void handle_selection_change ();
+    void handle_double_click ();
+};
diff --git a/src/gui/qt/include/hyphymain.h b/src/gui/qt/include/hyphymain.h
new file mode 100644
index 0000000..0c315ee
--- /dev/null
+++ b/src/gui/qt/include/hyphymain.h
@@ -0,0 +1,176 @@
+/*
+
+HyPhy - Hypothesis Testing Using Phylogenies.
+
+Copyright (C) 1997-now
+Core Developers:
+  Sergei L Kosakovsky Pond (spond at ucsd.edu)
+  Art FY Poon    (apoon at cfenet.ubc.ca)
+  Steven Weaver (sweaver at ucsd.edu)
+  
+Module Developers:
+	Lance Hepler (nlhepler at gmail.com)
+	Martin Smith (martin.audacis at gmail.com)
+
+Significant contributions from:
+  Spencer V Muse (muse at stat.ncsu.edu)
+  Simon DW Frost (sdf22 at cam.ac.uk)
+
+Permission is hereby granted, free of charge, to any person obtaining a
+copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be included
+in all copies or substantial portions of the Software.
+
+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.
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+*/
+
+#pragma once
+
+#include <QtGui>
+#include <QProgressBar>
+#include <QtNetwork>
+#include <QElapsedTimer>
+
+#include "ui_hyphymain.h"
+#include "qterminal.h"
+#include "hy_strings.h"
+
+#define  HY_CONSOLE_CAN_COPY    0x01
+#define  HY_CONSOLE_CAN_PASTE   0x02
+#define  HY_CONSOLE_CAN_UNDO    0x04
+#define  HY_CONSOLE_CAN_REDO    0x08
+
+#define  HY_SL_FILE             0x01
+#define  HY_SL_TASK             0x02
+#define  HY_SL_TIMER            0x04
+#define  HY_SL_PERCENT          0x08
+#define  HY_SL_SUSPEND          0x10
+#define  HY_SL_RESUME           0x20
+#define  HY_SL_FORCE            0x40
+#define  HY_SL_DONE             0x80
+
+class HyphyMain : public QMainWindow, private Ui::MainWindow
+{
+
+    Q_OBJECT
+
+public:
+    HyphyMain(QMainWindow *parent = NULL);
+    void initialText();
+    void StartBarTimer();
+    void StopBarTimer();
+    void SetStatusLine     (_String);
+    void SetStatusLine     (_String, _String, _String, long l);
+    void SetStatusLine     (_String, _String, _String);
+    void SetStatusLine     (_String, _String, _String, long, char);
+    void SetStatusBarValue (long, _Parameter, _Parameter);
+    void ClearStatusLine     ();
+    void AddStringToRecentMenu (const _String, const _String);
+    void AppendTextToEnd   (const QString&, bool isHTML = false, _SimpleList* color = nil);
+    void DisplayPrompt     (void);
+    void setWaitingOnStringFromConsole (bool);
+    const _String & getUserData (void) { return userData;}
+
+protected:
+    bool eventFilter(QObject *obj, QEvent *ev);
+    virtual void closeEvent(QCloseEvent *);
+
+signals:
+    void handled_user_input ();
+    
+private slots:
+    //File Menu
+    void hy_open();
+    void hy_save();
+    void quit();
+    void handle_user_input (const QString);
+
+    //Analysis Menu
+    void hy_cancelexecution();
+    void hy_suspendexecution();
+    void hy_viewlog();
+    void hy_standardanalysis();
+    void hy_results();
+    void hy_rerunlastanalysis();
+
+    //Window Menu
+    void hy_minimize();
+    void hy_consolewindow();
+    void hy_objectinspector();
+    void hy_cyclethroughwindows();
+
+    //Status Timer
+    void    update_timer_display();
+
+private:
+    QTimer *_timer;
+    QElapsedTimer  *_elapsed_timer;
+
+    //File Actions
+    QAction *_hyConsoleOpenAction;
+    QAction *_hyConsoleSaveAction;
+    QAction *_hyConsoleExitAction;
+
+    //Edit Actions
+    QAction *_hyConsoleUndoAction;
+    QAction *_hyConsoleRedoAction;
+    QAction *_hyConsoleCutAction;
+    QAction *_hyConsoleCopyAction;
+    QAction *_hyConsolePasteAction;
+    QAction *_hyConsoleFindAction;
+    QAction *_hyConsoleSelectAllAction;
+    QAction *_hyConsoleClearWindowAction;
+
+    //View Actions
+    QAction *_hyConsoleHideStatusBarAction;
+
+    //Analysis Actions
+    QAction *_hyConsoleCancelExecutionAction;
+    QAction *_hyConsoleSuspendExecutionAction;
+    QAction *_hyConsoleViewLogAction;
+    QAction *_hyConsoleStandardAnalysisAction;
+    QAction *_hyConsoleResultsAction;
+    QAction *_hyConsoleRerunLastAnalysisAction;
+
+
+    //Window Actions
+    QAction *_hyConsoleMinimizeAction;
+    QAction *_hyConsoleConsoleWindowAction;
+    QAction *_hyConsoleObjectInspectorAction;
+    QAction *_hyConsoleCycleThroughWindowsAction;
+
+    QMenu   *_hyConsoleMenu;
+    void    initializeMenuBar();
+    void    initializeStatusBar();
+    QString  lastAnalysisFilePath;
+    
+    // preferences options
+    void     ReadSettings  (void);
+    void     WriteSettings (void);
+    
+    bool     waitingOnStringFromConsole;
+    _String  userData;
+
+    //Status Bar
+    QStatusBar *status;
+    QLabel *filename_status;
+    QLabel *updated_status;
+    QProgressBar *progress_bar;
+
+    void printHelp();
+    };
+
+extern HyphyMain* _hyPrimaryConsoleWindow;
diff --git a/src/gui/qt/include/hyphymessageoutput.h b/src/gui/qt/include/hyphymessageoutput.h
new file mode 100644
index 0000000..da36df8
--- /dev/null
+++ b/src/gui/qt/include/hyphymessageoutput.h
@@ -0,0 +1,51 @@
+
+/*
+
+HyPhy - Hypothesis Testing Using Phylogenies.
+
+Copyright (C) 1997-now
+Core Developers:
+  Sergei L Kosakovsky Pond (spond at ucsd.edu)
+  Art FY Poon    (apoon at cfenet.ubc.ca)
+  Steven Weaver (sweaver at ucsd.edu)
+  
+Module Developers:
+	Lance Hepler (nlhepler at gmail.com)
+	Martin Smith (martin.audacis at gmail.com)
+
+Significant contributions from:
+  Spencer V Muse (muse at stat.ncsu.edu)
+  Simon DW Frost (sdf22 at cam.ac.uk)
+
+Permission is hereby granted, free of charge, to any person obtaining a
+copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be included
+in all copies or substantial portions of the Software.
+
+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.
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+*/
+
+#pragma once
+#include "ui_hyphymessageoutput.h"
+
+
+class _HY_MessageOutput: public QWidget, private Ui::Form
+{
+    Q_OBJECT
+
+public:
+    _HY_MessageOutput(QString fn, QWidget * parent = 0, Qt::WindowFlags f = 0);
+};
diff --git a/src/gui/qt/include/qterminal.h b/src/gui/qt/include/qterminal.h
new file mode 100644
index 0000000..754ca87
--- /dev/null
+++ b/src/gui/qt/include/qterminal.h
@@ -0,0 +1,45 @@
+#pragma once
+
+#include <QTextBrowser>
+#include <QStringList>
+
+class QTerminal : public QTextBrowser {
+    Q_OBJECT
+
+public:
+    QTerminal(QWidget * parent = 0, Qt::WindowFlags f = 0);
+    ~QTerminal();
+    
+    void keyPressEvent          (QKeyEvent * event);
+    void contextMenuEvent       (QContextMenuEvent* event);
+    void insertFromMimeData     (const QMimeData * source);
+    void changeDir              (const QString & dir);
+        // SLKP 20121205: seems unused
+    
+    void prompt                 (bool = false);
+    void newline                (bool = false);
+    
+signals:
+    void userEnteredString (const QString);
+
+private slots:
+    
+    void handleCursorMove  ();
+    //void find();
+
+private:
+    QStringList command_history;
+    
+    int         command_history_location,
+                length_of_input_buffer;
+ 
+    QTextCursor location_of_last_propmpt,
+                location_of_insertion_point;
+    
+    QString     current_command,
+                stash_current_command;
+    
+    void        handleUserLineEntry     (void);
+    void        beepAndIgnoreEvent      (QEvent* event, bool do_ignore = true);
+    void        replaceCurrentCommand   (const QString* replace_with, bool stash_current);
+};
diff --git a/src/gui/qt/include/simplerequest.h b/src/gui/qt/include/simplerequest.h
new file mode 100644
index 0000000..a18c556
--- /dev/null
+++ b/src/gui/qt/include/simplerequest.h
@@ -0,0 +1,25 @@
+#pragma once
+
+#include <QObject>
+#include <QNetworkReply>
+
+class QNetworkAccessManager;
+class SimpleRequest:public QObject
+{
+Q_OBJECT
+public:
+    SimpleRequest();
+    ~SimpleRequest(){};
+    QNetworkReply* requestUrl(const QString url);
+private:
+    QNetworkAccessManager* manager;
+signals:
+    void networkError(const QString);
+    void requestFinished();
+
+protected slots:
+    void finishReply();
+    void errorReply(QNetworkReply::NetworkError);
+    void replyFinished(QNetworkReply*);
+    const QString parseError(QNetworkReply::NetworkError error);
+};
diff --git a/src/gui/qt/main.cpp b/src/gui/qt/main.cpp
new file mode 100644
index 0000000..bdf2a40
--- /dev/null
+++ b/src/gui/qt/main.cpp
@@ -0,0 +1,62 @@
+#include <QApplication>
+#include <QEvent>
+#include <unistd.h>
+#include "baseobj.h"
+#include "hyphymain.h"
+#include "hyphyevents.h"
+#include "hyphy_qt_helpers.h"
+
+#include "HYSharedMain.h"
+
+_String baseArgDir,
+        libArgDir;
+        
+HyphyMain * _hyPrimaryConsoleWindow;
+
+int main(int argc, char *argv[])
+{
+    GlobalStartup();
+    DoApplicationSettings ();
+    
+    char    curWd[4096],
+            dirSlash = GetPlatformDirectoryChar ();
+    getcwd (curWd,4096);
+
+    _String baseDir (curWd);
+
+    if (baseDir.getChar (baseDir.sLength-1) != dirSlash) {
+        baseDir=baseDir & dirSlash;
+    }
+
+    _String libDir (_HYPHY_LIBDIRECTORY_);
+
+    if (libDir.getChar (libDir.sLength-1) != dirSlash) {
+        libDir=libDir & dirSlash;
+    }
+
+    pathNames&& &libDir;
+
+    libDirectory  = libDir;
+    libArgDir     = libDirectory;
+    baseDirectory = baseDir;
+    baseArgDir    = baseDirectory;
+
+
+    QApplication app(argc, argv);
+    HyphyMain mainWindow;
+    ReadInTemplateFiles     ();
+
+    _hyPrimaryConsoleWindow = & mainWindow;
+ 
+    /*mainWindow.setGeometry(
+    QStyle::alignedRect(
+        Qt::LeftToRight,
+        Qt::AlignCenter,
+        mainWindow.size(),
+        qApp->desktop()->availableGeometry()
+    ));*/
+    
+    mainWindow.show();
+    mainWindow.raise();
+    return app.exec();
+}
diff --git a/src/gui/qt/qterminal.cpp b/src/gui/qt/qterminal.cpp
new file mode 100644
index 0000000..9b10ef5
--- /dev/null
+++ b/src/gui/qt/qterminal.cpp
@@ -0,0 +1,273 @@
+//TODO: Add better command line editing
+
+#include <QtGui>
+#include <QFont>
+#include "qterminal.h"
+#include "hy_strings.h"
+#include "batchlan.h"
+
+//#define __QTERMINAL_DEBBUGGING
+
+QTerminal::QTerminal(QWidget *parent, Qt::WindowFlags f) : QTextBrowser(parent) {
+    setWindowFlags(f);
+    
+    current_command                   = "";
+    location_of_last_propmpt          = textCursor();
+    location_of_insertion_point       = textCursor();
+    connect(this, SIGNAL(cursorPositionChanged()), this, SLOT(handleCursorMove()));
+    
+    length_of_input_buffer            = 0;
+
+    command_history_location           = -1;
+ 
+    //Font Settings
+    QFont font("Monaco Helvetica");
+    //setTextColor(Qt::darkCyan);
+    setCurrentFont(font);
+
+    //Make links clickable
+    setTextInteractionFlags(Qt::TextEditorInteraction|Qt::LinksAccessibleByMouse);
+
+    //Allow links to open browser
+    setOpenExternalLinks(true);
+}
+
+QTerminal::~QTerminal() {
+
+}
+
+void QTerminal::changeDir(const QString & dir) {
+    // SLKP 20121205: seems unused
+    QString theDir = QString(dir);
+    theDir = theDir.replace(QChar('/'), "\\");
+}
+
+
+void QTerminal::handleCursorMove (void) {
+    int position = textCursor().position();
+    if (location_of_insertion_point.position() != position && position > location_of_last_propmpt.position()) {
+        location_of_insertion_point = textCursor();
+    }
+}
+
+void QTerminal::handleUserLineEntry (void) {
+    
+    command_history.push_back(current_command);
+    command_history_location = -1;
+    
+#ifdef __QTERMINAL_DEBBUGGING
+    printf ("handleUserLineEntry: %s\n", current_command.toAscii().data());
+#endif
+    
+    emit userEnteredString(current_command);
+    
+    current_command         = "";
+    stash_current_command   = "";
+    length_of_input_buffer  = 0;
+
+}
+
+void        QTerminal::beepAndIgnoreEvent (QEvent* event, bool do_ignore) {
+    QApplication::beep();
+    if (do_ignore)
+        event->ignore();
+}
+
+void        QTerminal::replaceCurrentCommand   (const QString* replace_with, bool stash_current){
+    if (stash_current) {
+        stash_current_command = current_command;
+    }
+    current_command = *replace_with;
+    for (int i = 0; i < length_of_input_buffer; ++i) {
+        QTextEdit::keyPressEvent(new QKeyEvent(QEvent::KeyPress, Qt::Key_Backspace, Qt::NoModifier));
+    }
+    insertPlainText(*replace_with);
+    length_of_input_buffer      = replace_with->length();
+    moveCursor(QTextCursor::End);
+    location_of_insertion_point = textCursor();
+}
+
+
+void QTerminal::keyPressEvent(QKeyEvent * event) {
+    
+    int     key        = event->key();
+ 
+    /*if(event->modifiers()) {
+        QTextEdit::keyPressEvent(event);
+        return;
+    }*/
+    
+    switch (key) {
+        case Qt::Key_Up: { // fetch an older command from history
+            if (command_history.size()) {
+                if (command_history_location == -1) {
+                    replaceCurrentCommand (&command_history.at(command_history_location = command_history.size()-1),true);
+                    event->ignore();
+                    return;
+                } else {
+                    if (command_history_location > 0) {
+                       replaceCurrentCommand (&command_history.at(--command_history_location),false);
+                       event->ignore();
+                       return;
+                    }
+                }
+            }
+            beepAndIgnoreEvent(event);
+            return;
+        }
+        case Qt::Key_Down: { // fetch a newer command from history
+            if (command_history_location >= 0) {
+                if (command_history_location == command_history.size()-1) {
+                    replaceCurrentCommand (&stash_current_command,false);
+                    command_history_location = -1;
+                } else {
+                    replaceCurrentCommand (&command_history.at(++command_history_location),false);
+                }
+                event->ignore();
+            } else {
+                beepAndIgnoreEvent(event);
+            }
+            return;
+        }
+        case Qt::Key_Left: { // move left in the command string
+            setTextCursor(location_of_insertion_point);
+            if (location_of_insertion_point.position() > location_of_last_propmpt.position() + 1) {
+                location_of_insertion_point.movePosition (QTextCursor::Left);
+                setTextCursor (location_of_insertion_point);
+            } else {
+                beepAndIgnoreEvent(event);
+            }
+            return;
+        }
+        case Qt::Key_Right: { // move right in the command string
+            setTextCursor(location_of_insertion_point);
+            if (location_of_insertion_point.movePosition (QTextCursor::Right)) {
+                 setTextCursor (location_of_insertion_point);
+            } else {
+                beepAndIgnoreEvent(event);
+            }
+            return;
+        }
+        /*
+        case Qt::Key_Tab: {
+            // auto-complete later
+            break;
+        }
+        */
+        case Qt::Key_Return:
+        case Qt::Key_Enter: {
+            moveCursor(QTextCursor::End);
+            QTextEdit::keyPressEvent(event);
+            location_of_insertion_point = textCursor();
+            handleUserLineEntry();
+#ifdef __QTERMINAL_DEBBUGGING
+            printf ("new line start = %d insert = %d current = %d\n", location_of_last_propmpt.position(), location_of_insertion_point.position(),textCursor().position());
+#endif
+            return;
+        }
+            
+        case Qt::Key_Backspace: {
+            
+            setTextCursor(location_of_insertion_point);
+        
+            long diff = location_of_insertion_point.position() - location_of_last_propmpt.position();
+            if (diff>1) {
+               current_command.remove(diff-2, 1);
+               QTextEdit::keyPressEvent(event);
+               location_of_insertion_point = textCursor();
+               length_of_input_buffer --;
+            }
+            else {
+                beepAndIgnoreEvent(event);
+            }
+            return;
+        }
+            
+        default:{
+             QString text = event->text();
+            int  diff = location_of_insertion_point.position() - location_of_last_propmpt.position(),
+                 inserted = 0;
+            
+            for (int i = 0; i < text.length(); ++i) {
+                if (text.at(i).isPrint()) {
+                    current_command.insert(diff + inserted++ - 1, text.at(i));
+                }
+            }
+#ifdef __QTERMINAL_DEBBUGGING
+            printf ("keyPressEvent enter text: start = %d insert = %d printable %d buffer %s\n", location_of_last_propmpt.position(), location_of_insertion_point.position(), inserted, current_command.toAscii().data());
+#endif
+            if (inserted) {
+                setTextCursor(location_of_insertion_point);
+                length_of_input_buffer+=inserted;
+            }
+            QTextEdit::keyPressEvent(event);
+        }
+    }
+}
+
+void QTerminal::newline(bool onlyIfLineNonEmpty) {
+    moveCursor(QTextCursor::End);
+    if (onlyIfLineNonEmpty) {
+        if (textCursor().columnNumber() == 0) {
+            return;
+        }
+    }
+    insertPlainText ("\n");
+}
+
+void QTerminal::prompt(bool hbl) {
+    moveCursor(QTextCursor::End);
+    if (hbl) {
+        _String tag = currentExecutionList?currentExecutionList->GetFileName():empty;
+        if (tag.sLength == 0)
+                tag = "Analysis waiting for input";
+        insertHtml("<font color='#A60000'>["+QString(tag.sData)+"]></font> ");
+    } else {
+        insertHtml("<font color='#A60000'>></font> ");
+    }
+    moveCursor(QTextCursor::End);
+    location_of_last_propmpt = textCursor();
+    location_of_last_propmpt.movePosition(QTextCursor::Left);
+}
+
+void QTerminal::insertFromMimeData(const QMimeData * source) {
+    //setTextCursor(curCursorLoc);
+    moveCursor(QTextCursor::End);
+
+    QString     pastedText = source->text();
+    bool        endsWithNL = pastedText.endsWith ('\n');
+    QStringList commands = pastedText.split('\n',QString::SkipEmptyParts);
+
+    for (long item = 0; item < commands.count(); item ++) {
+        QString str = commands.at (item);
+        insertPlainText(str);
+        current_command += str;
+        if (endsWithNL || item < commands.count()-1) {
+            newline (true);
+            handleUserLineEntry();
+            current_command = "";
+        } else {
+            length_of_input_buffer = str.length();
+        }
+    }
+
+    moveCursor(QTextCursor::End);
+    location_of_insertion_point = textCursor();
+}
+
+void QTerminal::contextMenuEvent(QContextMenuEvent *event) {
+    QMenu *menu = new QMenu();
+    menu->addAction(tr("Undo"),this,SLOT(undo()),QKeySequence::Undo);
+    menu->addAction(tr("Redo"),this,SLOT(redo()),QKeySequence::Redo);
+    menu->addAction(tr("Copy"),this,SLOT(copy()),QKeySequence::Copy);
+    menu->addAction(tr("Paste"),this,SLOT(paste()),QKeySequence::Paste);
+    menu->addAction(tr("Find"),this,SLOT(find()),QKeySequence::Find);
+    menu->addAction(tr("Select All"),this,SLOT(selectAll()),QKeySequence::SelectAll);
+    //menu->addAction(tr("Clear Window"),this,SLOT(clearwindow),QKeySequence::SelectAll);
+    menu->exec(event->globalPos());
+    delete menu;
+}
+
+//Edit Menu Options
+//void QTerminal::find(){}
+//void QTerminal::clearwindow(){}
diff --git a/src/gui/qt/simplerequest.cpp b/src/gui/qt/simplerequest.cpp
new file mode 100644
index 0000000..de9caab
--- /dev/null
+++ b/src/gui/qt/simplerequest.cpp
@@ -0,0 +1,77 @@
+#include <QNetworkAccessManager>
+#include <QDebug>
+#include <QFile>
+#include <QBuffer>
+#include "simplerequest.h"
+
+SimpleRequest::SimpleRequest()
+{
+        manager = new QNetworkAccessManager;
+}
+
+QNetworkReply* SimpleRequest::requestUrl(const QString url)
+{
+    QNetworkReply* reply = manager->get(QNetworkRequest(QUrl(url)));
+    connect(reply, SIGNAL(finished()), this, SLOT(finishReply()));
+    return reply;
+}
+
+void SimpleRequest::replyFinished(QNetworkReply* reply)
+{
+    qDebug() << "Request Finished!" << reply;
+}
+
+void SimpleRequest::finishReply()
+{
+    QObject* obj = sender();
+    QNetworkReply* reply = qobject_cast<QNetworkReply*>(obj);
+
+    if(reply->error())
+    {
+       qDebug() << "eror?"; 
+        emit networkError(parseError(reply->error()));
+        return;
+    }
+
+    //emit requestFinished();
+}
+
+void SimpleRequest::errorReply(QNetworkReply::NetworkError error)
+{
+    QString errstr = parseError(error);
+    qDebug() << "Error!" << error;
+    emit networkError(errstr);
+}
+
+const QString SimpleRequest::parseError(QNetworkReply::NetworkError error)
+{
+    QString errstr = tr("No Error!");
+    switch(error)
+    {
+        case QNetworkReply::ConnectionRefusedError:
+        errstr = tr("Connection refused!");
+        break;
+        case QNetworkReply::HostNotFoundError:
+        errstr = tr("Host not found!");
+        break;
+        case QNetworkReply::RemoteHostClosedError:
+        errstr = tr("Remote host closed!");
+        break;
+        case QNetworkReply::TimeoutError:
+        errstr = tr("Timeout!");
+        break;
+        case QNetworkReply::ContentAccessDenied:
+        errstr = tr("Content access denied!");
+        break;
+        case QNetworkReply::ProtocolFailure:
+        errstr = tr("Protocol failure!");
+        break;
+        case QNetworkReply::ContentNotFoundError:
+        errstr = tr("Content not found!");
+        break;
+        default:
+        break;
+    }
+    //qDebug() << "error" << errstr;
+    return errstr;
+}
diff --git a/src/gui/qt/ui/hyphyhierarchicalselector.ui b/src/gui/qt/ui/hyphyhierarchicalselector.ui
new file mode 100644
index 0000000..f57bc8c
--- /dev/null
+++ b/src/gui/qt/ui/hyphyhierarchicalselector.ui
@@ -0,0 +1,71 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>Dialog</class>
+ <widget class="QDialog" name="Dialog">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>388</width>
+    <height>518</height>
+   </rect>
+  </property>
+  <property name="font">
+   <font>
+    <family>Lucida Sans</family>
+    <pointsize>12</pointsize>
+   </font>
+  </property>
+  <property name="windowTitle">
+   <string>DialogSelector</string>
+  </property>
+  <property name="windowOpacity">
+   <double>1.000000000000000</double>
+  </property>
+  <layout class="QVBoxLayout" name="verticalLayout" stretch="5,2,1">
+   <item>
+    <widget class="QTreeWidget" name="itemList">
+     <property name="horizontalScrollBarPolicy">
+      <enum>Qt::ScrollBarAsNeeded</enum>
+     </property>
+     <property name="alternatingRowColors">
+      <bool>true</bool>
+     </property>
+     <property name="uniformRowHeights">
+      <bool>true</bool>
+     </property>
+     <property name="animated">
+      <bool>true</bool>
+     </property>
+     <column>
+      <property name="text">
+       <string notr="true">1</string>
+      </property>
+     </column>
+    </widget>
+   </item>
+   <item>
+    <widget class="QTextBrowser" name="explanationLabel">
+     <property name="acceptDrops">
+      <bool>false</bool>
+     </property>
+     <property name="horizontalScrollBarPolicy">
+      <enum>Qt::ScrollBarAlwaysOff</enum>
+     </property>
+    </widget>
+   </item>
+   <item>
+    <widget class="QDialogButtonBox" name="buttonBox">
+     <property name="orientation">
+      <enum>Qt::Horizontal</enum>
+     </property>
+     <property name="standardButtons">
+      <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
+     </property>
+    </widget>
+   </item>
+  </layout>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/src/gui/qt/ui/hyphymain.ui b/src/gui/qt/ui/hyphymain.ui
new file mode 100644
index 0000000..03700d4
--- /dev/null
+++ b/src/gui/qt/ui/hyphymain.ui
@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>MainWindow</class>
+ <widget class="QMainWindow" name="MainWindow">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>635</width>
+    <height>600</height>
+   </rect>
+  </property>
+  <property name="windowTitle">
+   <string>HYPHY Console</string>
+  </property>
+  <widget class="QWidget" name="centralwidget">
+   <property name="sizePolicy">
+    <sizepolicy hsizetype="Expanding" vsizetype="Expanding">
+     <horstretch>0</horstretch>
+     <verstretch>0</verstretch>
+    </sizepolicy>
+   </property>
+   <layout class="QVBoxLayout" name="verticalLayout">
+    <property name="margin">
+     <number>0</number>
+    </property>
+    <item>
+     <widget class="QTerminal" name="console" native="true">
+      <property name="font">
+       <font>
+        <family>Courier New</family>
+        <pointsize>12</pointsize>
+       </font>
+      </property>
+     </widget>
+    </item>
+   </layout>
+  </widget>
+ </widget>
+ <customwidgets>
+  <customwidget>
+   <class>QTerminal</class>
+   <extends>QWidget</extends>
+   <header>qterminal.h</header>
+  </customwidget>
+ </customwidgets>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/src/gui/qt/ui/hyphymessageoutput.ui b/src/gui/qt/ui/hyphymessageoutput.ui
new file mode 100644
index 0000000..a1f7678
--- /dev/null
+++ b/src/gui/qt/ui/hyphymessageoutput.ui
@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>Form</class>
+ <widget class="QWidget" name="Form">
+  <property name="enabled">
+   <bool>true</bool>
+  </property>
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>369</width>
+    <height>325</height>
+   </rect>
+  </property>
+  <property name="sizePolicy">
+   <sizepolicy hsizetype="Expanding" vsizetype="Expanding">
+    <horstretch>0</horstretch>
+    <verstretch>0</verstretch>
+   </sizepolicy>
+  </property>
+  <property name="windowTitle">
+   <string>Form</string>
+  </property>
+  <layout class="QHBoxLayout" name="horizontalLayout">
+   <property name="margin">
+    <number>0</number>
+   </property>
+   <item>
+    <widget class="QTextBrowser" name="textBrowser">
+     <property name="sizePolicy">
+      <sizepolicy hsizetype="Expanding" vsizetype="Expanding">
+       <horstretch>0</horstretch>
+       <verstretch>0</verstretch>
+      </sizepolicy>
+     </property>
+     <property name="maximumSize">
+      <size>
+       <width>16777215</width>
+       <height>16777215</height>
+      </size>
+     </property>
+    </widget>
+   </item>
+  </layout>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/src/gui/res/GTKResources/130.png b/src/gui/res/GTKResources/130.png
new file mode 100644
index 0000000..faea026
Binary files /dev/null and b/src/gui/res/GTKResources/130.png differ
diff --git a/src/gui/res/GTKResources/131.png b/src/gui/res/GTKResources/131.png
new file mode 100644
index 0000000..2cd5a80
Binary files /dev/null and b/src/gui/res/GTKResources/131.png differ
diff --git a/src/gui/res/GTKResources/132.png b/src/gui/res/GTKResources/132.png
new file mode 100644
index 0000000..56e1678
Binary files /dev/null and b/src/gui/res/GTKResources/132.png differ
diff --git a/src/gui/res/GTKResources/133.png b/src/gui/res/GTKResources/133.png
new file mode 100644
index 0000000..7b456c5
Binary files /dev/null and b/src/gui/res/GTKResources/133.png differ
diff --git a/src/gui/res/GTKResources/4000.png b/src/gui/res/GTKResources/4000.png
new file mode 100644
index 0000000..8eab906
Binary files /dev/null and b/src/gui/res/GTKResources/4000.png differ
diff --git a/src/gui/res/GTKResources/4000.xpm b/src/gui/res/GTKResources/4000.xpm
new file mode 100644
index 0000000..5cde899
--- /dev/null
+++ b/src/gui/res/GTKResources/4000.xpm
@@ -0,0 +1,26 @@
+/* XPM */
+static char *4000[] =
+{
+/* width height ncolors chars_per_pixel */
+"12 12 6 1",
+/* colors */
+"A c #FFFFFFFFFFFF",
+"B c #BBBB00000000",
+"C c #777700000000",
+"D c #EEEE00000000",
+"E c #444400000000",
+"F c #000000000000",
+/* pixels */
+"AAAFEEEEFAAA",
+"AAEECCCCEEAA",
+"AECCBBBBCCEA",
+"FECBDDDDBCEF",
+"ECBDDDDDDBCE",
+"ECBDDDDDDBCE",
+"ECBDDDDDDBCE",
+"ECBDDDDDDBCE",
+"FECBDDDDBCEA",
+"AECCBBBBCCEA",
+"AAEECCCCEEAA",
+"AAAFEEEEFAAA",
+};
diff --git a/src/gui/res/GTKResources/4001.png b/src/gui/res/GTKResources/4001.png
new file mode 100644
index 0000000..a6d836d
Binary files /dev/null and b/src/gui/res/GTKResources/4001.png differ
diff --git a/src/gui/res/GTKResources/4001.xpm b/src/gui/res/GTKResources/4001.xpm
new file mode 100644
index 0000000..1b5e391
--- /dev/null
+++ b/src/gui/res/GTKResources/4001.xpm
@@ -0,0 +1,26 @@
+/* XPM */
+static char *4001[] =
+{
+/* width height ncolors chars_per_pixel */
+"12 12 6 1",
+/* colors */
+"A c #FFFFFFFFFFFF",
+"B c #FFFFFFFF0000",
+"C c #FFFF99990000",
+"D c #FFFFCCCC0000",
+"E c #FFFFFFFF9999",
+"F c #999966660000",
+/* pixels */
+"AAAFFFFFFAAA",
+"AAFFCCCCFFAA",
+"AFCCDDDDCCFA",
+"FFCDBBBBDCFF",
+"FCDBBBBBBDCF",
+"FCDBBBEBBDCF",
+"FCDBBBEEBDCF",
+"FCDBBBBBBDCF",
+"FFCDBBBBDCFF",
+"AFCCDDDDCCFA",
+"AAFFCCCCFFAA",
+"AAAFFFFFFAAA",
+};
diff --git a/src/gui/res/GTKResources/4002.png b/src/gui/res/GTKResources/4002.png
new file mode 100644
index 0000000..8179489
Binary files /dev/null and b/src/gui/res/GTKResources/4002.png differ
diff --git a/src/gui/res/GTKResources/4002.xpm b/src/gui/res/GTKResources/4002.xpm
new file mode 100644
index 0000000..d541c3e
--- /dev/null
+++ b/src/gui/res/GTKResources/4002.xpm
@@ -0,0 +1,25 @@
+/* XPM */
+static char *4002-01-01[] =
+{
+/* width height ncolors chars_per_pixel */
+"12 12 5 1",
+/* colors */
+"A c #FFFFFFFFFFFF",
+"B c #0000DDDD0000",
+"C c #000022220000",
+"D c #000077770000",
+"E c #0000BBBB0000",
+/* pixels */
+"AAACCCCCCAAA",
+"AACCDDDDCCAA",
+"ACDDEEEEDDCA",
+"CCDEBBBBEDCC",
+"CDEBBBBBBEDC",
+"CDEBBBBBBEDC",
+"CDEBBBBBBEDC",
+"CDEBBBBBBEDC",
+"CCDEBBBBEDCC",
+"ACDDEEEEDDCA",
+"AACCDDDDCCAA",
+"AAACCCCCCAAA",
+};
diff --git a/src/gui/res/GTKResources/4003.png b/src/gui/res/GTKResources/4003.png
new file mode 100644
index 0000000..c30c259
Binary files /dev/null and b/src/gui/res/GTKResources/4003.png differ
diff --git a/src/gui/res/GTKResources/4003.xpm b/src/gui/res/GTKResources/4003.xpm
new file mode 100644
index 0000000..755cd8c
--- /dev/null
+++ b/src/gui/res/GTKResources/4003.xpm
@@ -0,0 +1,25 @@
+/* XPM */
+static char *4003-01-01[] =
+{
+/* width height ncolors chars_per_pixel */
+"12 12 5 1",
+/* colors */
+"A c #FFFFFFFFFFFF",
+"B c #000022220000",
+"C c #CCCC33330000",
+"D c #CCCC66660000",
+"E c #FFFF66663333",
+/* pixels */
+"AAABBBBBBAAA",
+"AABBCCCCBBAA",
+"ABCCDDDDCCBA",
+"BBCDEEEEDCBB",
+"BCDEEEEEEDCB",
+"BCDEEEEEEDCB",
+"BCDEEEEEEDCB",
+"BCDEEEEEEDCB",
+"BBCDEEEEDCBB",
+"ABCCDDDDCCBA",
+"AABBCCCCBBAA",
+"AAABBBBBBAAA",
+};
diff --git a/src/gui/res/GTKResources/4011.png b/src/gui/res/GTKResources/4011.png
new file mode 100644
index 0000000..f69cf87
Binary files /dev/null and b/src/gui/res/GTKResources/4011.png differ
diff --git a/src/gui/res/GTKResources/4020.png b/src/gui/res/GTKResources/4020.png
new file mode 100644
index 0000000..0a281be
Binary files /dev/null and b/src/gui/res/GTKResources/4020.png differ
diff --git a/src/gui/res/GTKResources/5000.png b/src/gui/res/GTKResources/5000.png
new file mode 100644
index 0000000..6761dbf
Binary files /dev/null and b/src/gui/res/GTKResources/5000.png differ
diff --git a/src/gui/res/GTKResources/5001.png b/src/gui/res/GTKResources/5001.png
new file mode 100644
index 0000000..3f293df
Binary files /dev/null and b/src/gui/res/GTKResources/5001.png differ
diff --git a/src/gui/res/GTKResources/5002.png b/src/gui/res/GTKResources/5002.png
new file mode 100644
index 0000000..94b693a
Binary files /dev/null and b/src/gui/res/GTKResources/5002.png differ
diff --git a/src/gui/res/GTKResources/5003.png b/src/gui/res/GTKResources/5003.png
new file mode 100644
index 0000000..fb0f838
Binary files /dev/null and b/src/gui/res/GTKResources/5003.png differ
diff --git a/src/gui/res/GTKResources/5004.png b/src/gui/res/GTKResources/5004.png
new file mode 100644
index 0000000..4204f5c
Binary files /dev/null and b/src/gui/res/GTKResources/5004.png differ
diff --git a/src/gui/res/GTKResources/5005.png b/src/gui/res/GTKResources/5005.png
new file mode 100644
index 0000000..cd88e38
Binary files /dev/null and b/src/gui/res/GTKResources/5005.png differ
diff --git a/src/gui/res/GTKResources/5006.png b/src/gui/res/GTKResources/5006.png
new file mode 100644
index 0000000..e2a4964
Binary files /dev/null and b/src/gui/res/GTKResources/5006.png differ
diff --git a/src/gui/res/GTKResources/5007.png b/src/gui/res/GTKResources/5007.png
new file mode 100644
index 0000000..226ac47
Binary files /dev/null and b/src/gui/res/GTKResources/5007.png differ
diff --git a/src/gui/res/GTKResources/5020.png b/src/gui/res/GTKResources/5020.png
new file mode 100644
index 0000000..0a281be
Binary files /dev/null and b/src/gui/res/GTKResources/5020.png differ
diff --git a/src/gui/res/GTKResources/6000.png b/src/gui/res/GTKResources/6000.png
new file mode 100644
index 0000000..799e0ab
Binary files /dev/null and b/src/gui/res/GTKResources/6000.png differ
diff --git a/src/gui/res/GTKResources/6001.png b/src/gui/res/GTKResources/6001.png
new file mode 100644
index 0000000..e0cf7b1
Binary files /dev/null and b/src/gui/res/GTKResources/6001.png differ
diff --git a/src/gui/res/GTKResources/6002.png b/src/gui/res/GTKResources/6002.png
new file mode 100644
index 0000000..f93eda7
Binary files /dev/null and b/src/gui/res/GTKResources/6002.png differ
diff --git a/src/gui/res/GTKResources/6003.png b/src/gui/res/GTKResources/6003.png
new file mode 100644
index 0000000..497460f
Binary files /dev/null and b/src/gui/res/GTKResources/6003.png differ
diff --git a/src/gui/res/GTKResources/6004.png b/src/gui/res/GTKResources/6004.png
new file mode 100644
index 0000000..bbb14ce
Binary files /dev/null and b/src/gui/res/GTKResources/6004.png differ
diff --git a/src/gui/res/GTKResources/6005.png b/src/gui/res/GTKResources/6005.png
new file mode 100644
index 0000000..9059442
Binary files /dev/null and b/src/gui/res/GTKResources/6005.png differ
diff --git a/src/gui/res/GTKResources/6006.png b/src/gui/res/GTKResources/6006.png
new file mode 100644
index 0000000..3888abd
Binary files /dev/null and b/src/gui/res/GTKResources/6006.png differ
diff --git a/src/gui/res/GTKResources/6007.png b/src/gui/res/GTKResources/6007.png
new file mode 100644
index 0000000..6c3e5b8
Binary files /dev/null and b/src/gui/res/GTKResources/6007.png differ
diff --git a/src/gui/res/GTKResources/6008.png b/src/gui/res/GTKResources/6008.png
new file mode 100644
index 0000000..a3372bf
Binary files /dev/null and b/src/gui/res/GTKResources/6008.png differ
diff --git a/src/gui/res/GTKResources/6009.png b/src/gui/res/GTKResources/6009.png
new file mode 100644
index 0000000..228fe86
Binary files /dev/null and b/src/gui/res/GTKResources/6009.png differ
diff --git a/src/gui/res/GTKResources/6010.png b/src/gui/res/GTKResources/6010.png
new file mode 100644
index 0000000..c39e01d
Binary files /dev/null and b/src/gui/res/GTKResources/6010.png differ
diff --git a/src/gui/res/GTKResources/6011.png b/src/gui/res/GTKResources/6011.png
new file mode 100644
index 0000000..e37d43f
Binary files /dev/null and b/src/gui/res/GTKResources/6011.png differ
diff --git a/src/gui/res/GTKResources/6012.png b/src/gui/res/GTKResources/6012.png
new file mode 100644
index 0000000..cd5a8d3
Binary files /dev/null and b/src/gui/res/GTKResources/6012.png differ
diff --git a/src/gui/res/GTKResources/6013.png b/src/gui/res/GTKResources/6013.png
new file mode 100644
index 0000000..dede949
Binary files /dev/null and b/src/gui/res/GTKResources/6013.png differ
diff --git a/src/gui/res/GTKResources/6014.png b/src/gui/res/GTKResources/6014.png
new file mode 100644
index 0000000..ac90e9c
Binary files /dev/null and b/src/gui/res/GTKResources/6014.png differ
diff --git a/src/gui/res/GTKResources/6016.png b/src/gui/res/GTKResources/6016.png
new file mode 100644
index 0000000..39d71bf
Binary files /dev/null and b/src/gui/res/GTKResources/6016.png differ
diff --git a/src/gui/res/GTKResources/6017.png b/src/gui/res/GTKResources/6017.png
new file mode 100644
index 0000000..7ee78c3
Binary files /dev/null and b/src/gui/res/GTKResources/6017.png differ
diff --git a/src/gui/res/GTKResources/6018.png b/src/gui/res/GTKResources/6018.png
new file mode 100644
index 0000000..3216ee7
Binary files /dev/null and b/src/gui/res/GTKResources/6018.png differ
diff --git a/src/gui/res/GTKResources/6019.png b/src/gui/res/GTKResources/6019.png
new file mode 100644
index 0000000..e0b7461
Binary files /dev/null and b/src/gui/res/GTKResources/6019.png differ
diff --git a/src/gui/res/GTKResources/6020.png b/src/gui/res/GTKResources/6020.png
new file mode 100644
index 0000000..0f77e60
Binary files /dev/null and b/src/gui/res/GTKResources/6020.png differ
diff --git a/src/gui/res/GTKResources/6021.png b/src/gui/res/GTKResources/6021.png
new file mode 100644
index 0000000..0967087
Binary files /dev/null and b/src/gui/res/GTKResources/6021.png differ
diff --git a/src/gui/res/GTKResources/6022.png b/src/gui/res/GTKResources/6022.png
new file mode 100644
index 0000000..d7ff958
Binary files /dev/null and b/src/gui/res/GTKResources/6022.png differ
diff --git a/src/gui/res/GTKResources/6030.png b/src/gui/res/GTKResources/6030.png
new file mode 100644
index 0000000..bb53cc3
Binary files /dev/null and b/src/gui/res/GTKResources/6030.png differ
diff --git a/src/gui/res/GTKResources/6031.png b/src/gui/res/GTKResources/6031.png
new file mode 100644
index 0000000..4934c3f
Binary files /dev/null and b/src/gui/res/GTKResources/6031.png differ
diff --git a/src/gui/res/GTKResources/6032.png b/src/gui/res/GTKResources/6032.png
new file mode 100644
index 0000000..f641aa8
Binary files /dev/null and b/src/gui/res/GTKResources/6032.png differ
diff --git a/src/gui/res/GTKResources/6033.png b/src/gui/res/GTKResources/6033.png
new file mode 100644
index 0000000..94d1951
Binary files /dev/null and b/src/gui/res/GTKResources/6033.png differ
diff --git a/src/gui/res/GTKResources/6034.png b/src/gui/res/GTKResources/6034.png
new file mode 100644
index 0000000..7b540b7
Binary files /dev/null and b/src/gui/res/GTKResources/6034.png differ
diff --git a/src/gui/res/GTKResources/6035.png b/src/gui/res/GTKResources/6035.png
new file mode 100644
index 0000000..a735de5
Binary files /dev/null and b/src/gui/res/GTKResources/6035.png differ
diff --git a/src/gui/res/GTKResources/6036.png b/src/gui/res/GTKResources/6036.png
new file mode 100644
index 0000000..013cba5
Binary files /dev/null and b/src/gui/res/GTKResources/6036.png differ
diff --git a/src/gui/res/GTKResources/6040.png b/src/gui/res/GTKResources/6040.png
new file mode 100644
index 0000000..9ee3a01
Binary files /dev/null and b/src/gui/res/GTKResources/6040.png differ
diff --git a/src/gui/res/GTKResources/6041.png b/src/gui/res/GTKResources/6041.png
new file mode 100644
index 0000000..7265f2a
Binary files /dev/null and b/src/gui/res/GTKResources/6041.png differ
diff --git a/src/gui/res/GTKResources/6042.png b/src/gui/res/GTKResources/6042.png
new file mode 100644
index 0000000..6e311c0
Binary files /dev/null and b/src/gui/res/GTKResources/6042.png differ
diff --git a/src/gui/res/GTKResources/7000.png b/src/gui/res/GTKResources/7000.png
new file mode 100644
index 0000000..01e5b14
Binary files /dev/null and b/src/gui/res/GTKResources/7000.png differ
diff --git a/src/gui/res/GTKResources/7001.png b/src/gui/res/GTKResources/7001.png
new file mode 100644
index 0000000..f0b77b5
Binary files /dev/null and b/src/gui/res/GTKResources/7001.png differ
diff --git a/src/gui/res/GTKResources/7002.png b/src/gui/res/GTKResources/7002.png
new file mode 100644
index 0000000..17330f4
Binary files /dev/null and b/src/gui/res/GTKResources/7002.png differ
diff --git a/src/gui/res/GTKResources/7003.png b/src/gui/res/GTKResources/7003.png
new file mode 100644
index 0000000..c90cb6e
Binary files /dev/null and b/src/gui/res/GTKResources/7003.png differ
diff --git a/src/gui/res/GTKResources/7004.png b/src/gui/res/GTKResources/7004.png
new file mode 100644
index 0000000..62ae24e
Binary files /dev/null and b/src/gui/res/GTKResources/7004.png differ
diff --git a/src/gui/res/GTKResources/7005.png b/src/gui/res/GTKResources/7005.png
new file mode 100644
index 0000000..162009d
Binary files /dev/null and b/src/gui/res/GTKResources/7005.png differ
diff --git a/src/gui/res/GTKResources/7010.png b/src/gui/res/GTKResources/7010.png
new file mode 100644
index 0000000..f8cc9aa
Binary files /dev/null and b/src/gui/res/GTKResources/7010.png differ
diff --git a/src/gui/res/GTKResources/7011.png b/src/gui/res/GTKResources/7011.png
new file mode 100644
index 0000000..4a180f8
Binary files /dev/null and b/src/gui/res/GTKResources/7011.png differ
diff --git a/src/gui/res/GTKResources/7012.png b/src/gui/res/GTKResources/7012.png
new file mode 100644
index 0000000..a995fdd
Binary files /dev/null and b/src/gui/res/GTKResources/7012.png differ
diff --git a/src/gui/res/GTKResources/7013.png b/src/gui/res/GTKResources/7013.png
new file mode 100644
index 0000000..6d10110
Binary files /dev/null and b/src/gui/res/GTKResources/7013.png differ
diff --git a/src/gui/res/GTKResources/7014.png b/src/gui/res/GTKResources/7014.png
new file mode 100644
index 0000000..f9b803a
Binary files /dev/null and b/src/gui/res/GTKResources/7014.png differ
diff --git a/src/gui/res/GTKResources/7020.png b/src/gui/res/GTKResources/7020.png
new file mode 100644
index 0000000..4dd13cc
Binary files /dev/null and b/src/gui/res/GTKResources/7020.png differ
diff --git a/src/gui/res/GTKResources/7050.png b/src/gui/res/GTKResources/7050.png
new file mode 100644
index 0000000..e0fdd6e
Binary files /dev/null and b/src/gui/res/GTKResources/7050.png differ
diff --git a/src/gui/res/GTKResources/striped.xpm b/src/gui/res/GTKResources/striped.xpm
new file mode 100644
index 0000000..4977be1
--- /dev/null
+++ b/src/gui/res/GTKResources/striped.xpm
@@ -0,0 +1,18 @@
+/* XPM */
+static char *striped-01-01[] =
+{
+/* width height ncolors chars_per_pixel */
+"8 8 2 1",
+/* colors */
+"A c #EEEEEEEEEEEE",
+"B c #DDDDDDDDDDDD",
+/* pixels */
+"AAAAAAAA",
+"BBBBBBBB",
+"BBBBBBBB",
+"AAAAAAAA",
+"AAAAAAAA",
+"BBBBBBBB",
+"BBBBBBBB",
+"AAAAAAAA",
+};
diff --git a/src/gui/res/GTKResources/theme/arrow_down1.png b/src/gui/res/GTKResources/theme/arrow_down1.png
new file mode 100644
index 0000000..da092c9
Binary files /dev/null and b/src/gui/res/GTKResources/theme/arrow_down1.png differ
diff --git a/src/gui/res/GTKResources/theme/arrow_down2.png b/src/gui/res/GTKResources/theme/arrow_down2.png
new file mode 100644
index 0000000..3573c51
Binary files /dev/null and b/src/gui/res/GTKResources/theme/arrow_down2.png differ
diff --git a/src/gui/res/GTKResources/theme/arrow_down3.png b/src/gui/res/GTKResources/theme/arrow_down3.png
new file mode 100644
index 0000000..b93a721
Binary files /dev/null and b/src/gui/res/GTKResources/theme/arrow_down3.png differ
diff --git a/src/gui/res/GTKResources/theme/arrow_left1.png b/src/gui/res/GTKResources/theme/arrow_left1.png
new file mode 100644
index 0000000..c6ce5e4
Binary files /dev/null and b/src/gui/res/GTKResources/theme/arrow_left1.png differ
diff --git a/src/gui/res/GTKResources/theme/arrow_left2.png b/src/gui/res/GTKResources/theme/arrow_left2.png
new file mode 100644
index 0000000..178384c
Binary files /dev/null and b/src/gui/res/GTKResources/theme/arrow_left2.png differ
diff --git a/src/gui/res/GTKResources/theme/arrow_left3.png b/src/gui/res/GTKResources/theme/arrow_left3.png
new file mode 100644
index 0000000..f447f98
Binary files /dev/null and b/src/gui/res/GTKResources/theme/arrow_left3.png differ
diff --git a/src/gui/res/GTKResources/theme/arrow_right1.png b/src/gui/res/GTKResources/theme/arrow_right1.png
new file mode 100644
index 0000000..a30db62
Binary files /dev/null and b/src/gui/res/GTKResources/theme/arrow_right1.png differ
diff --git a/src/gui/res/GTKResources/theme/arrow_right2.png b/src/gui/res/GTKResources/theme/arrow_right2.png
new file mode 100644
index 0000000..49adcee
Binary files /dev/null and b/src/gui/res/GTKResources/theme/arrow_right2.png differ
diff --git a/src/gui/res/GTKResources/theme/arrow_right3.png b/src/gui/res/GTKResources/theme/arrow_right3.png
new file mode 100644
index 0000000..5326dce
Binary files /dev/null and b/src/gui/res/GTKResources/theme/arrow_right3.png differ
diff --git a/src/gui/res/GTKResources/theme/arrow_up1.png b/src/gui/res/GTKResources/theme/arrow_up1.png
new file mode 100644
index 0000000..3eb777b
Binary files /dev/null and b/src/gui/res/GTKResources/theme/arrow_up1.png differ
diff --git a/src/gui/res/GTKResources/theme/arrow_up2.png b/src/gui/res/GTKResources/theme/arrow_up2.png
new file mode 100644
index 0000000..486beb9
Binary files /dev/null and b/src/gui/res/GTKResources/theme/arrow_up2.png differ
diff --git a/src/gui/res/GTKResources/theme/arrow_up3.png b/src/gui/res/GTKResources/theme/arrow_up3.png
new file mode 100644
index 0000000..b861870
Binary files /dev/null and b/src/gui/res/GTKResources/theme/arrow_up3.png differ
diff --git a/src/gui/res/GTKResources/theme/background.png b/src/gui/res/GTKResources/theme/background.png
new file mode 100644
index 0000000..f91777b
Binary files /dev/null and b/src/gui/res/GTKResources/theme/background.png differ
diff --git a/src/gui/res/GTKResources/theme/blank.png b/src/gui/res/GTKResources/theme/blank.png
new file mode 100644
index 0000000..5e347a2
Binary files /dev/null and b/src/gui/res/GTKResources/theme/blank.png differ
diff --git a/src/gui/res/GTKResources/theme/button0.png b/src/gui/res/GTKResources/theme/button0.png
new file mode 100644
index 0000000..bee82ec
Binary files /dev/null and b/src/gui/res/GTKResources/theme/button0.png differ
diff --git a/src/gui/res/GTKResources/theme/button1.png b/src/gui/res/GTKResources/theme/button1.png
new file mode 100644
index 0000000..78aecc4
Binary files /dev/null and b/src/gui/res/GTKResources/theme/button1.png differ
diff --git a/src/gui/res/GTKResources/theme/button11.png b/src/gui/res/GTKResources/theme/button11.png
new file mode 100644
index 0000000..a2794bd
Binary files /dev/null and b/src/gui/res/GTKResources/theme/button11.png differ
diff --git a/src/gui/res/GTKResources/theme/button11alpha.png b/src/gui/res/GTKResources/theme/button11alpha.png
new file mode 100644
index 0000000..27e120e
Binary files /dev/null and b/src/gui/res/GTKResources/theme/button11alpha.png differ
diff --git a/src/gui/res/GTKResources/theme/button12.png b/src/gui/res/GTKResources/theme/button12.png
new file mode 100644
index 0000000..5e3a773
Binary files /dev/null and b/src/gui/res/GTKResources/theme/button12.png differ
diff --git a/src/gui/res/GTKResources/theme/button12alpha.png b/src/gui/res/GTKResources/theme/button12alpha.png
new file mode 100644
index 0000000..74501a8
Binary files /dev/null and b/src/gui/res/GTKResources/theme/button12alpha.png differ
diff --git a/src/gui/res/GTKResources/theme/button13.png b/src/gui/res/GTKResources/theme/button13.png
new file mode 100644
index 0000000..08b4c25
Binary files /dev/null and b/src/gui/res/GTKResources/theme/button13.png differ
diff --git a/src/gui/res/GTKResources/theme/button13alpha.png b/src/gui/res/GTKResources/theme/button13alpha.png
new file mode 100644
index 0000000..08b4c25
Binary files /dev/null and b/src/gui/res/GTKResources/theme/button13alpha.png differ
diff --git a/src/gui/res/GTKResources/theme/button2.png b/src/gui/res/GTKResources/theme/button2.png
new file mode 100644
index 0000000..945fc9c
Binary files /dev/null and b/src/gui/res/GTKResources/theme/button2.png differ
diff --git a/src/gui/res/GTKResources/theme/button3.png b/src/gui/res/GTKResources/theme/button3.png
new file mode 100644
index 0000000..d253786
Binary files /dev/null and b/src/gui/res/GTKResources/theme/button3.png differ
diff --git a/src/gui/res/GTKResources/theme/button4.png b/src/gui/res/GTKResources/theme/button4.png
new file mode 100644
index 0000000..1baa1d2
Binary files /dev/null and b/src/gui/res/GTKResources/theme/button4.png differ
diff --git a/src/gui/res/GTKResources/theme/button5.png b/src/gui/res/GTKResources/theme/button5.png
new file mode 100644
index 0000000..a422325
Binary files /dev/null and b/src/gui/res/GTKResources/theme/button5.png differ
diff --git a/src/gui/res/GTKResources/theme/button6.png b/src/gui/res/GTKResources/theme/button6.png
new file mode 100644
index 0000000..38bbb12
Binary files /dev/null and b/src/gui/res/GTKResources/theme/button6.png differ
diff --git a/src/gui/res/GTKResources/theme/button7.png b/src/gui/res/GTKResources/theme/button7.png
new file mode 100644
index 0000000..1baa1d2
Binary files /dev/null and b/src/gui/res/GTKResources/theme/button7.png differ
diff --git a/src/gui/res/GTKResources/theme/button8.png b/src/gui/res/GTKResources/theme/button8.png
new file mode 100644
index 0000000..1baa1d2
Binary files /dev/null and b/src/gui/res/GTKResources/theme/button8.png differ
diff --git a/src/gui/res/GTKResources/theme/button9.png b/src/gui/res/GTKResources/theme/button9.png
new file mode 100644
index 0000000..bee82ec
Binary files /dev/null and b/src/gui/res/GTKResources/theme/button9.png differ
diff --git a/src/gui/res/GTKResources/theme/check1.png b/src/gui/res/GTKResources/theme/check1.png
new file mode 100644
index 0000000..c6fcdd7
Binary files /dev/null and b/src/gui/res/GTKResources/theme/check1.png differ
diff --git a/src/gui/res/GTKResources/theme/check2.png b/src/gui/res/GTKResources/theme/check2.png
new file mode 100644
index 0000000..3641af2
Binary files /dev/null and b/src/gui/res/GTKResources/theme/check2.png differ
diff --git a/src/gui/res/GTKResources/theme/empty.png b/src/gui/res/GTKResources/theme/empty.png
new file mode 100644
index 0000000..44135d8
Binary files /dev/null and b/src/gui/res/GTKResources/theme/empty.png differ
diff --git a/src/gui/res/GTKResources/theme/entry1.png b/src/gui/res/GTKResources/theme/entry1.png
new file mode 100644
index 0000000..f91777b
Binary files /dev/null and b/src/gui/res/GTKResources/theme/entry1.png differ
diff --git a/src/gui/res/GTKResources/theme/entry2.png b/src/gui/res/GTKResources/theme/entry2.png
new file mode 100644
index 0000000..f91777b
Binary files /dev/null and b/src/gui/res/GTKResources/theme/entry2.png differ
diff --git a/src/gui/res/GTKResources/theme/focus.png b/src/gui/res/GTKResources/theme/focus.png
new file mode 100644
index 0000000..154c839
Binary files /dev/null and b/src/gui/res/GTKResources/theme/focus.png differ
diff --git a/src/gui/res/GTKResources/theme/frame1.png b/src/gui/res/GTKResources/theme/frame1.png
new file mode 100644
index 0000000..f5861ff
Binary files /dev/null and b/src/gui/res/GTKResources/theme/frame1.png differ
diff --git a/src/gui/res/GTKResources/theme/frame2.png b/src/gui/res/GTKResources/theme/frame2.png
new file mode 100644
index 0000000..f5861ff
Binary files /dev/null and b/src/gui/res/GTKResources/theme/frame2.png differ
diff --git a/src/gui/res/GTKResources/theme/frame_gap.png b/src/gui/res/GTKResources/theme/frame_gap.png
new file mode 100644
index 0000000..f5861ff
Binary files /dev/null and b/src/gui/res/GTKResources/theme/frame_gap.png differ
diff --git a/src/gui/res/GTKResources/theme/frame_gap_top_end.png b/src/gui/res/GTKResources/theme/frame_gap_top_end.png
new file mode 100644
index 0000000..e064d86
Binary files /dev/null and b/src/gui/res/GTKResources/theme/frame_gap_top_end.png differ
diff --git a/src/gui/res/GTKResources/theme/frame_gap_top_start.png b/src/gui/res/GTKResources/theme/frame_gap_top_start.png
new file mode 100644
index 0000000..1a08eaf
Binary files /dev/null and b/src/gui/res/GTKResources/theme/frame_gap_top_start.png differ
diff --git a/src/gui/res/GTKResources/theme/gap_bottom.png b/src/gui/res/GTKResources/theme/gap_bottom.png
new file mode 100644
index 0000000..f91777b
Binary files /dev/null and b/src/gui/res/GTKResources/theme/gap_bottom.png differ
diff --git a/src/gui/res/GTKResources/theme/gap_bottom_end.png b/src/gui/res/GTKResources/theme/gap_bottom_end.png
new file mode 100644
index 0000000..f91777b
Binary files /dev/null and b/src/gui/res/GTKResources/theme/gap_bottom_end.png differ
diff --git a/src/gui/res/GTKResources/theme/gap_bottom_start.png b/src/gui/res/GTKResources/theme/gap_bottom_start.png
new file mode 100644
index 0000000..f91777b
Binary files /dev/null and b/src/gui/res/GTKResources/theme/gap_bottom_start.png differ
diff --git a/src/gui/res/GTKResources/theme/gap_left.png b/src/gui/res/GTKResources/theme/gap_left.png
new file mode 100644
index 0000000..f91777b
Binary files /dev/null and b/src/gui/res/GTKResources/theme/gap_left.png differ
diff --git a/src/gui/res/GTKResources/theme/gap_left_end.png b/src/gui/res/GTKResources/theme/gap_left_end.png
new file mode 100644
index 0000000..f91777b
Binary files /dev/null and b/src/gui/res/GTKResources/theme/gap_left_end.png differ
diff --git a/src/gui/res/GTKResources/theme/gap_left_start.png b/src/gui/res/GTKResources/theme/gap_left_start.png
new file mode 100644
index 0000000..f91777b
Binary files /dev/null and b/src/gui/res/GTKResources/theme/gap_left_start.png differ
diff --git a/src/gui/res/GTKResources/theme/gap_right.png b/src/gui/res/GTKResources/theme/gap_right.png
new file mode 100644
index 0000000..f91777b
Binary files /dev/null and b/src/gui/res/GTKResources/theme/gap_right.png differ
diff --git a/src/gui/res/GTKResources/theme/gap_right_end.png b/src/gui/res/GTKResources/theme/gap_right_end.png
new file mode 100644
index 0000000..f91777b
Binary files /dev/null and b/src/gui/res/GTKResources/theme/gap_right_end.png differ
diff --git a/src/gui/res/GTKResources/theme/gap_right_start.png b/src/gui/res/GTKResources/theme/gap_right_start.png
new file mode 100644
index 0000000..f91777b
Binary files /dev/null and b/src/gui/res/GTKResources/theme/gap_right_start.png differ
diff --git a/src/gui/res/GTKResources/theme/gap_top.png b/src/gui/res/GTKResources/theme/gap_top.png
new file mode 100644
index 0000000..f91777b
Binary files /dev/null and b/src/gui/res/GTKResources/theme/gap_top.png differ
diff --git a/src/gui/res/GTKResources/theme/gap_top_end.png b/src/gui/res/GTKResources/theme/gap_top_end.png
new file mode 100644
index 0000000..f91777b
Binary files /dev/null and b/src/gui/res/GTKResources/theme/gap_top_end.png differ
diff --git a/src/gui/res/GTKResources/theme/gap_top_start.png b/src/gui/res/GTKResources/theme/gap_top_start.png
new file mode 100644
index 0000000..f91777b
Binary files /dev/null and b/src/gui/res/GTKResources/theme/gap_top_start.png differ
diff --git a/src/gui/res/GTKResources/theme/handle_vert_thumb.png b/src/gui/res/GTKResources/theme/handle_vert_thumb.png
new file mode 100644
index 0000000..01e6046
Binary files /dev/null and b/src/gui/res/GTKResources/theme/handle_vert_thumb.png differ
diff --git a/src/gui/res/GTKResources/theme/hline.png b/src/gui/res/GTKResources/theme/hline.png
new file mode 100644
index 0000000..904b75e
Binary files /dev/null and b/src/gui/res/GTKResources/theme/hline.png differ
diff --git a/src/gui/res/GTKResources/theme/htrough.png b/src/gui/res/GTKResources/theme/htrough.png
new file mode 100644
index 0000000..92f7e85
Binary files /dev/null and b/src/gui/res/GTKResources/theme/htrough.png differ
diff --git a/src/gui/res/GTKResources/theme/menu_selected.png b/src/gui/res/GTKResources/theme/menu_selected.png
new file mode 100644
index 0000000..b5b0bdd
Binary files /dev/null and b/src/gui/res/GTKResources/theme/menu_selected.png differ
diff --git a/src/gui/res/GTKResources/theme/menu_shadow.png b/src/gui/res/GTKResources/theme/menu_shadow.png
new file mode 100644
index 0000000..2b81419
Binary files /dev/null and b/src/gui/res/GTKResources/theme/menu_shadow.png differ
diff --git a/src/gui/res/GTKResources/theme/menubar.png b/src/gui/res/GTKResources/theme/menubar.png
new file mode 100644
index 0000000..f91777b
Binary files /dev/null and b/src/gui/res/GTKResources/theme/menubar.png differ
diff --git a/src/gui/res/GTKResources/theme/notebook1.png b/src/gui/res/GTKResources/theme/notebook1.png
new file mode 100644
index 0000000..f91777b
Binary files /dev/null and b/src/gui/res/GTKResources/theme/notebook1.png differ
diff --git a/src/gui/res/GTKResources/theme/notebook2.png b/src/gui/res/GTKResources/theme/notebook2.png
new file mode 100644
index 0000000..29d650f
Binary files /dev/null and b/src/gui/res/GTKResources/theme/notebook2.png differ
diff --git a/src/gui/res/GTKResources/theme/notebook3.png b/src/gui/res/GTKResources/theme/notebook3.png
new file mode 100644
index 0000000..12a6782
Binary files /dev/null and b/src/gui/res/GTKResources/theme/notebook3.png differ
diff --git a/src/gui/res/GTKResources/theme/notebook4.png b/src/gui/res/GTKResources/theme/notebook4.png
new file mode 100644
index 0000000..5c8456f
Binary files /dev/null and b/src/gui/res/GTKResources/theme/notebook4.png differ
diff --git a/src/gui/res/GTKResources/theme/notebook5.png b/src/gui/res/GTKResources/theme/notebook5.png
new file mode 100644
index 0000000..9f2b1a7
Binary files /dev/null and b/src/gui/res/GTKResources/theme/notebook5.png differ
diff --git a/src/gui/res/GTKResources/theme/notebook_border.png b/src/gui/res/GTKResources/theme/notebook_border.png
new file mode 100644
index 0000000..1edbd8e
Binary files /dev/null and b/src/gui/res/GTKResources/theme/notebook_border.png differ
diff --git a/src/gui/res/GTKResources/theme/option1.png b/src/gui/res/GTKResources/theme/option1.png
new file mode 100644
index 0000000..144a878
Binary files /dev/null and b/src/gui/res/GTKResources/theme/option1.png differ
diff --git a/src/gui/res/GTKResources/theme/option2.png b/src/gui/res/GTKResources/theme/option2.png
new file mode 100644
index 0000000..8051821
Binary files /dev/null and b/src/gui/res/GTKResources/theme/option2.png differ
diff --git a/src/gui/res/GTKResources/theme/option_menu.png b/src/gui/res/GTKResources/theme/option_menu.png
new file mode 100644
index 0000000..a94bce6
Binary files /dev/null and b/src/gui/res/GTKResources/theme/option_menu.png differ
diff --git a/src/gui/res/GTKResources/theme/scrollbar_horiz1.png b/src/gui/res/GTKResources/theme/scrollbar_horiz1.png
new file mode 100644
index 0000000..4dbfa1f
Binary files /dev/null and b/src/gui/res/GTKResources/theme/scrollbar_horiz1.png differ
diff --git a/src/gui/res/GTKResources/theme/scrollbar_horiz2.png b/src/gui/res/GTKResources/theme/scrollbar_horiz2.png
new file mode 100644
index 0000000..0d9949f
Binary files /dev/null and b/src/gui/res/GTKResources/theme/scrollbar_horiz2.png differ
diff --git a/src/gui/res/GTKResources/theme/scrollbar_vert1.png b/src/gui/res/GTKResources/theme/scrollbar_vert1.png
new file mode 100644
index 0000000..07bb5d6
Binary files /dev/null and b/src/gui/res/GTKResources/theme/scrollbar_vert1.png differ
diff --git a/src/gui/res/GTKResources/theme/shadow1.png b/src/gui/res/GTKResources/theme/shadow1.png
new file mode 100644
index 0000000..5d14234
Binary files /dev/null and b/src/gui/res/GTKResources/theme/shadow1.png differ
diff --git a/src/gui/res/GTKResources/theme/shadow2.png b/src/gui/res/GTKResources/theme/shadow2.png
new file mode 100644
index 0000000..45e1175
Binary files /dev/null and b/src/gui/res/GTKResources/theme/shadow2.png differ
diff --git a/src/gui/res/GTKResources/theme/slider_horiz1.png b/src/gui/res/GTKResources/theme/slider_horiz1.png
new file mode 100644
index 0000000..859e8cb
Binary files /dev/null and b/src/gui/res/GTKResources/theme/slider_horiz1.png differ
diff --git a/src/gui/res/GTKResources/theme/slider_hth1.png b/src/gui/res/GTKResources/theme/slider_hth1.png
new file mode 100644
index 0000000..ee46f3c
Binary files /dev/null and b/src/gui/res/GTKResources/theme/slider_hth1.png differ
diff --git a/src/gui/res/GTKResources/theme/slider_hth2.png b/src/gui/res/GTKResources/theme/slider_hth2.png
new file mode 100644
index 0000000..ef3bf5d
Binary files /dev/null and b/src/gui/res/GTKResources/theme/slider_hth2.png differ
diff --git a/src/gui/res/GTKResources/theme/slider_vert1.png b/src/gui/res/GTKResources/theme/slider_vert1.png
new file mode 100644
index 0000000..2295780
Binary files /dev/null and b/src/gui/res/GTKResources/theme/slider_vert1.png differ
diff --git a/src/gui/res/GTKResources/theme/slider_vth1.png b/src/gui/res/GTKResources/theme/slider_vth1.png
new file mode 100644
index 0000000..7f2a0f4
Binary files /dev/null and b/src/gui/res/GTKResources/theme/slider_vth1.png differ
diff --git a/src/gui/res/GTKResources/theme/slider_vth2.png b/src/gui/res/GTKResources/theme/slider_vth2.png
new file mode 100644
index 0000000..7a34978
Binary files /dev/null and b/src/gui/res/GTKResources/theme/slider_vth2.png differ
diff --git a/src/gui/res/GTKResources/theme/theme.rc b/src/gui/res/GTKResources/theme/theme.rc
new file mode 100644
index 0000000..b4643d0
--- /dev/null
+++ b/src/gui/res/GTKResources/theme/theme.rc
@@ -0,0 +1,944 @@
+style "default"
+{
+  fg[NORMAL]      = { 0.00, 0.00, 0.00 }
+  fg[PRELIGHT]    = { 0.00, 0.00, 0.00 }
+  fg[ACTIVE]      = { 0.00, 0.00, 0.00 }
+  fg[SELECTED]    = { 0.00, 0.00, 0.00 }
+  fg[INSENSITIVE] = { 0.70, 0.70, 0.70 }
+  bg[NORMAL]      = "#e7e7e7"
+  bg[PRELIGHT]    = "#e7e7e7"
+  bg[ACTIVE]      = "#e7e7e7"
+  bg[INSENSITIVE] = "#e7e7e7"
+  bg[SELECTED]    = "#c7c7c7"
+  bg_pixmap[NORMAL]    = "background.png"
+  base[NORMAL]    = "#fcfcfc"
+  engine "pixmap"
+  {
+    image
+      {
+        function        = BOX
+	recolorable     = TRUE
+	detail          = "slider"
+	state           = PRELIGHT
+	file            = "scrollbar_horiz1.png"
+	border          = { 15, 15, 2, 2 }
+	stretch         = TRUE
+	orientation     = HORIZONTAL
+      }
+    image
+      {
+        function        = BOX
+	recolorable     = TRUE
+	detail          = "slider"
+	file            = "scrollbar_horiz1.png"
+	border          = { 13, 12, 2, 2 }
+	stretch         = TRUE
+	orientation     = HORIZONTAL
+      }
+    image
+      {
+        function        = BOX
+	recolorable     = TRUE
+	detail          = "slider"
+	state           = PRELIGHT
+	file            = "scrollbar_vert1.png"
+	border          = { 2, 2, 15, 15 }
+	stretch         = TRUE
+	orientation     = VERTICAL
+      }
+    image
+      {
+        function        = BOX
+	recolorable     = TRUE
+	detail          = "slider"
+	file            = "scrollbar_vert1.png"
+	border          = { 2, 2, 15, 15 }
+	stretch         = TRUE
+	orientation     = VERTICAL
+      }
+#
+# Any trough....
+#
+    image
+      {
+        function        = BOX
+	recolorable     = TRUE
+	detail          = "trough"
+	file            = "vtrough.png"
+	border          = { 3, 3, 23, 23 }
+	stretch         = TRUE
+	orientation     = VERTICAL
+      }
+    image
+      {
+        function        = BOX
+	recolorable     = TRUE
+	detail          = "trough"
+#        file            = "button5.png"
+#        border          = { 10, 10, 10, 10 }
+	file            = "htrough.png"
+	border          = { 23, 23, 3, 3 }
+	stretch         = TRUE
+	orientation     = HORIZONTAL
+      }
+    image
+      {
+        function        = BOX
+	recolorable     = TRUE
+	detail          = "bar"
+	file            = "scrollbar_horiz1.png"
+	border          = { 13, 12, 2, 2 }
+	stretch         = TRUE
+      }
+#
+# Handlebox
+#
+    image
+      {
+        function        = BOX
+	recolorable     = TRUE
+	detail          = "handlebox_bin"
+	file            = "button1.png"
+	border          = { 10, 10, 10, 10 }
+	stretch         = TRUE
+      }
+#
+# Paned widget
+#
+    image
+      {
+        function        = BOX
+	recolorable     = TRUE
+	detail          = "paned"
+	file            = "button5.png"
+	border          = { 10, 5, 5, 10 }
+	stretch         = TRUE
+      }
+#
+# Tooltips
+#
+    image
+      {
+        function        = FLAT_BOX
+	recolorable     = TRUE
+	detail          = "tooltip"
+	file            = "button5.png"
+	border          = { 10, 5, 5, 10 }
+	stretch         = TRUE
+      }
+#
+# Selected text in entries, text widget, lists and trees
+#
+    image
+      {
+        function        = FLAT_BOX
+	recolorable     = TRUE
+	state           = INSENSITIVE
+	detail          = "selected"
+	file            = "button5.png"
+	border          = { 10, 5, 5, 10 }
+	stretch         = TRUE
+      }
+    image
+      {
+        function        = FLAT_BOX
+	recolorable     = TRUE
+	detail          = "selected"
+	file            = "button2.png"
+	border          = { 3, 3, 3, 3 }
+	stretch         = TRUE
+      }
+    image
+      {
+        function        = FLAT_BOX
+	recolorable     = TRUE
+	state           = INSENSITIVE
+	detail          = "text"
+	file            = "button5.png"
+	border          = { 10, 5, 5, 10 }
+	stretch         = TRUE
+      }
+    image
+      {
+        function        = FLAT_BOX
+	recolorable     = TRUE
+	detail          = "text"
+	file            = "button6.png"
+	border          = { 4, 4, 3, 3 }
+	stretch         = TRUE
+      }
+    image
+      {
+        function        = FLAT_BOX
+	recolorable     = TRUE
+	detail          = "viewportbin"
+	file            = "background.png"
+	stretch         = FALSE
+      }
+#
+# Hline and Vline widgets
+#
+    image
+      {
+        function        = HLINE
+	recolorable     = TRUE
+	file            = "hline.png"
+	border          = { 0, 0, 1, 1 }
+	stretch         = TRUE
+      }
+    image
+      {
+        function        = VLINE
+	recolorable     = TRUE
+	file            = "vline.png"
+	border          = { 1, 1, 0, 0 }
+	stretch         = TRUE
+      }
+#
+# Check marks
+#
+    image
+      {
+        function        = CHECK
+	recolorable     = TRUE
+	shadow          = OUT
+	overlay_file    = "check1.png"
+	overlay_stretch = FALSE
+      }
+    image
+      {
+        function        = CHECK
+	recolorable     = TRUE
+	shadow          = IN
+	overlay_file    = "check2.png"
+	overlay_stretch = FALSE
+      }
+#
+# Option marks
+#
+    image
+      {
+        function        = OPTION
+	recolorable     = TRUE
+	shadow          = OUT
+	overlay_file    = "option1.png"
+	overlay_border  = { 0, 0, 0, 0 }
+	overlay_stretch = FALSE
+      }
+    image
+      {
+        function        = OPTION
+	recolorable     = TRUE
+	shadow          = IN
+	overlay_file    = "option2.png"
+	overlay_border  = { 0, 0, 0, 0 }
+	overlay_stretch = FALSE
+      }
+#
+# The "tab" on the OptionMenu
+#
+#    image
+#      {
+#        function        = TAB
+#	recolorable     = TRUE
+#	overlay_file    = "notebook2.png"
+#	overlay_stretch = FALSE
+#      }
+#
+# Fun with Scrollbars
+#
+    image
+      {
+        function        = SLIDER
+	recolorable     = TRUE
+	file            = "scrollbar_horiz1.png"
+	border          = { 5, 5, 2, 2 }
+	stretch         = TRUE
+	orientation     = HORIZONTAL
+      }
+    image
+      {
+        function        = SLIDER
+	recolorable     = TRUE
+	file            = "scrollbar_vert1.png"
+	border          = { 2, 2, 5, 5 }
+	stretch         = TRUE
+	orientation     = VERTICAL
+      }
+#
+# The handle on Handleboxes
+#
+    image
+      {
+        function        = HANDLE
+	recolorable     = TRUE
+	file            = "button5.png"
+	border          = { 5, 5, 5, 5 }
+	stretch         = TRUE
+	overlay_file    = "handle_vert_thumb.png"
+	overlay_border  = { 0, 0, 0, 0 }
+	overlay_stretch = FALSE
+	orientation     = VERTICAL
+      }
+#
+# The background for entry widgets
+#
+    image
+      {
+	function        = FLAT_BOX
+	recolorable     = TRUE
+	state           = INSENSITIVE
+        detail          = "entry_bg"
+	file            = "entry2.png"
+	border          = { 3, 3, 3, 3 }
+	stretch         = TRUE
+      }
+    image
+      {
+	function        = FLAT_BOX
+	recolorable     = TRUE
+        detail          = "entry_bg"
+	file            = "entry1.png"
+	border          = { 3, 3, 3, 3 }
+	stretch         = TRUE
+      }
+#
+# How to draw the focus around a widget
+#
+    image
+      {
+        function        = FOCUS
+	recolorable     = TRUE
+	overlay_file    = "focus.png"
+	overlay_border  = { 4, 4, 4, 4 }
+	overlay_stretch = TRUE
+      }
+#
+# Some defaults as to how to draw boxes if they haven't already been covered
+#
+    image
+      {
+        function        = BOX
+	recolorable     = TRUE
+	detail          = "hruler"
+	file            = "button12alpha.png"
+	border          = { 9, 9, 9, 9 }
+	stretch         = TRUE
+      }
+    image
+      {
+        function        = BOX
+	recolorable     = TRUE
+	detail          = "vruler"
+	file            = "button5.png"
+	border          = { 10, 10, 10, 10 }
+	stretch         = TRUE
+      }
+    image
+      {
+        function        = BOX
+	recolorable     = TRUE
+	shadow          = IN
+	file            = "button6.png"
+	border          = { 5, 5, 5, 5 }
+	stretch         = TRUE
+      }
+    image
+      {
+        function        = BOX
+	recolorable     = TRUE
+	file            = "button5.png"
+	border          = { 10, 10, 10, 10 }
+	stretch         = TRUE
+      }
+   }
+}
+
+# common default
+class "GtkWidget" style "default"
+
+
+style "eventbox" {
+  bg_pixmap[NORMAL] = "<parent>"
+  bg_pixmap[INSENSITIVE] = "<parent>"
+  bg_pixmap[PRELIGHT] = "<parent>"
+  bg_pixmap[SELECTED] = "<parent>"
+  bg_pixmap[ACTIVE] = "<parent>"
+}
+
+class "GtkEventBox" style "eventbox"
+
+#
+# Buttons
+#
+
+style "checkradiobutton" {
+  engine "pixmap" {
+    image
+      {
+        function        = FLAT_BOX
+	recolorable     = TRUE
+	file            = "button5.png"
+	border          = { 10,5,5,10 }
+	stretch         = TRUE
+      }
+  }
+}
+
+class "GtkRadioButton" style "checkradiobutton"
+class "GtkCheckButton" style "checkradiobutton"
+
+style "togglebutton"
+{
+   engine "pixmap" {
+    image
+      {
+        function        = BOX
+	recolorable     = TRUE
+	shadow          = IN
+	file            = "button11alpha.png"
+	border          = { 9,9,9,9 }
+	stretch         = TRUE
+      }
+    image
+      {
+        function        = BOX
+	recolorable     = TRUE
+	shadow          = OUT
+	file            = "button12alpha.png"
+	border          = { 9,9,9,9 }
+	stretch         = TRUE
+      }
+  }
+}
+
+class "GtkToggleButton" style "togglebutton"
+
+style "button"
+{
+  bg[NORMAL] = "#e7e7e7"
+
+  engine "pixmap"
+    {
+    image
+      {
+        function        = BOX
+	recolorable     = TRUE
+	state           = NORMAL
+	shadow          = OUT
+	file            = "button12alpha.png"
+	border          = { 9,9,9,9 }
+	stretch         = TRUE
+      }
+    image
+      {
+        function        = BOX
+	recolorable     = TRUE
+	state           = PRELIGHT
+	shadow          = OUT
+	file            = "button11alpha.png"
+	border          = { 9,9,9,9 }
+	stretch         = TRUE
+      }
+    image
+      {
+        function        = BOX
+	recolorable     = TRUE
+	state           = NORMAL
+	shadow          = IN
+	file            = "focus.png"
+	border          = { 9,9,9,9 }
+	stretch         = TRUE
+      }
+    image
+      {
+        function        = BOX
+	recolorable     = TRUE
+	state           = INSENSITIVE
+	shadow          = IN
+	file            = "button13alpha.png"
+	border          = { 9,9,9,9 }
+	stretch         = TRUE
+      }
+    image
+      {
+        function        = BOX
+	recolorable     = TRUE
+	state           = INSENSITIVE
+	shadow          = OUT
+	file            = "button13alpha.png"
+	border          = { 9,9,9,9 }
+	stretch         = TRUE
+      }
+    image
+      {
+        function        = BOX
+	recolorable     = TRUE
+	state           = SELECTED
+	shadow          = IN
+	file            = "button1.png"
+	border          = { 10,10,5,5 }
+	stretch         = TRUE
+      }
+    image
+      {
+        function        = BOX
+	recolorable     = TRUE
+	state           = ACTIVE
+	shadow          = IN
+	file            = "button11alpha.png"
+	border          = { 9,9,9,9 }
+	stretch         = TRUE
+      }
+   }
+}
+
+class "GtkButton" style "button"
+
+style "clist"
+{
+  bg[PRELIGHT] = "#e7e7e7"
+  fg[PRELIGHT] = "#000000"
+  base[NORMAL] = "#e7e7e7"
+}
+
+class "GtkCList" style "clist"
+
+style "notebook"
+{
+  engine "pixmap"
+    {
+    image
+      {
+        function        = EXTENSION
+	recolorable     = TRUE
+	state           = ACTIVE
+	file            = "notebook3.png"
+	border          = { 10, 10, 10, 10 }
+	stretch         = TRUE
+	gap_side	= BOTTOM
+      }
+    image
+      {
+        function        = EXTENSION
+	recolorable     = TRUE
+	state           = ACTIVE
+	file            = "notebook5.png"
+	border          = { 10, 10, 10, 10 }
+	stretch         = TRUE
+	gap_side	= TOP
+      }
+    image
+      {
+        function        = EXTENSION
+	recolorable     = TRUE
+	state           = ACTIVE
+	file            = "button5.png"
+	border          = { 10, 10, 10, 10 }
+	stretch         = TRUE
+	gap_side	= RIGHT
+      }
+    image
+      {
+        function        = EXTENSION
+	recolorable     = TRUE
+	state           = ACTIVE
+	file            = "button5.png"
+	border          = { 10, 10, 10, 10 }
+	stretch         = TRUE
+	gap_side	= LEFT
+      }
+    image
+      {
+        function        = EXTENSION
+	recolorable     = TRUE
+	file            = "notebook2.png"
+	border          = { 10, 10, 10, 10 }
+	stretch         = TRUE
+	gap_side        = BOTTOM
+      }
+    image
+      {
+        function        = EXTENSION
+	recolorable     = TRUE
+	file            = "notebook4.png"
+	border          = { 10, 10, 10, 10 }
+	stretch         = TRUE
+	gap_side        = TOP
+      }
+    image
+      {
+        function        = EXTENSION
+	recolorable     = TRUE
+	file            = "button6.png"
+	border          = { 10, 10, 10, 10 }
+	stretch         = TRUE
+	gap_side        = RIGHT
+      }
+    image
+      {
+        function        = EXTENSION
+	recolorable     = TRUE
+	file            = "button6.png"
+	border          = { 10, 10, 10, 10 }
+	stretch         = TRUE
+	gap_side        = LEFT
+     }
+#
+# How to draw boxes with a gap on one side (ie the page of a notebook)
+#
+    image
+      {
+        function        = BOX_GAP
+	recolorable     = TRUE
+	file            = "button5.png"
+	border          = { 10, 10, 10, 10 }
+	stretch         = TRUE
+        gap_file        = "gap_top.png"
+        gap_border      = { 0, 0, 0, 0 }
+        gap_start_file  = "gap_top_start.png"
+        gap_start_border= { 2, 0, 0, 0 }
+        gap_end_file    = "gap_top_end.png"
+        gap_end_border  = { 0, 2, 0, 0 }
+	gap_side        = TOP
+      }
+    image
+      {
+        function        = BOX_GAP
+	recolorable     = TRUE
+	file            = "button5.png"
+	border          = { 10, 10, 10, 10 }
+	stretch         = TRUE
+        gap_file        = "gap_bottom.png"
+        gap_border      = { 0, 0, 0, 0 }
+        gap_start_file  = "gap_bottom_start.png"
+        gap_start_border= { 2, 0, 0, 0 }
+        gap_end_file    = "gap_bottom_end.png"
+        gap_end_border  = { 0, 2, 0, 0 }
+	gap_side        = BOTTOM
+      }
+    image
+      {
+        function        = BOX_GAP
+	recolorable     = TRUE
+	file            = "button5.png"
+	border          = { 10, 10, 10, 10 }
+	stretch         = TRUE
+        gap_file        = "gap_left.png"
+        gap_border      = { 0, 0, 0, 0 }
+        gap_start_file  = "gap_left_start.png"
+        gap_start_border= { 0, 0, 2, 0 }
+        gap_end_file    = "gap_left_end.png"
+        gap_end_border  = { 0, 0, 0, 2 }
+	gap_side        = LEFT
+      }
+    image
+      {
+        function        = BOX_GAP
+	recolorable     = TRUE
+	file            = "button5.png"
+	border          = { 10, 10, 10, 10 }
+	stretch         = TRUE
+        gap_file        = "gap_right.png"
+        gap_border      = { 0, 0, 0, 0 }
+        gap_start_file  = "gap_right_start.png"
+        gap_start_border= { 0, 0, 2, 0 }
+        gap_end_file    = "gap_right_end.png"
+        gap_end_border  = { 0, 0, 0, 2 }
+	gap_side        = RIGHT
+      }
+#
+# How to draw the box of a notebook when it isnt attached to a tab
+#
+    image
+      {
+        function        = BOX
+	recolorable     = TRUE
+	file            = "button5.png"
+	border          = { 10, 10, 10, 10 }
+	stretch         = TRUE
+	gap_side	= TOP
+      }
+  }
+}
+
+class "GtkNotebook" style "notebook"
+
+style "menu"
+{
+  engine "pixmap" {
+    image
+      {
+        function        = BOX
+	recolorable     = TRUE
+	file            = "background.png"
+	border          = { 3, 3, 3, 3 }
+	stretch         = FALSE
+	overlay_file    = "menu_shadow.png"
+	overlay_border  = { 3, 3, 3, 3 }
+	overlay_stretch = TRUE
+      }
+  }
+}
+
+class "GtkMenu" style "menu"
+
+style "menuitem"
+{
+  engine "pixmap" {
+    image
+      {
+        function        = BOX
+	recolorable     = TRUE
+	file            = "menu_selected.png"
+	border          = { 8, 8, 8, 8 }
+	stretch         = TRUE
+      }
+  }
+}
+
+class "GtkMenuItem" style "menuitem"
+
+style "menubar"
+{
+  engine "pixmap" {
+    image
+      {
+        function        = BOX
+	recolorable     = TRUE
+	file            = "background.png"
+	border          = { 3, 3, 3, 3 }
+	stretch         = FALSE
+      }
+  }
+}
+
+class "GtkMenuBar" style "menubar"
+
+style "optionmenu"
+{
+  engine "pixmap" {
+    image
+      {
+        function        = BOX
+	recolorable     = TRUE
+	file            = "option_menu.png"
+	border          = { 12, 32, 2, 3 }
+	stretch         = TRUE
+      }
+  }
+}
+
+class "GtkOptionMenu" style "optionmenu"
+
+style "progressbar"
+{
+  engine "pixmap"
+    {
+    image
+      {
+        function        = BOX
+	recolorable     = TRUE
+	detail          = "bar"
+	file            = "button6.png"
+	border          = { 5, 5, 5, 5 }
+	stretch         = TRUE
+      }
+    image
+      {
+        function        = BOX
+        recolorable     = TRUE
+        detail          = "trough"
+        file            = "button5.png"
+        border          = { 10, 10, 10, 10 }
+        stretch         = TRUE
+        orientation     = HORIZONTAL
+      }
+    }
+}
+
+class "GtkProgressBar" style "progressbar"
+class "GtkBar" style "progressbar"
+
+style "ruler"
+{
+  engine "pixmap" {
+    image
+      {
+        function        = BOX
+	recolorable     = TRUE
+	detail          = "vruler"
+	file            = "button5.png"
+	border          = { 2, 2, 2, 2 }
+	stretch         = TRUE
+      }
+    image
+      {
+        function        = BOX
+	recolorable     = TRUE
+	detail          = "hruler"
+	file            = "button5.png"
+	border          = { 2, 2, 2, 2 }
+	stretch         = TRUE
+      }
+  }
+}
+
+class "GtkRuler" style "ruler"
+
+style "item"
+{
+  engine "pixmap" {
+    image
+      {
+        function        = FLAT_BOX
+	recolorable     = TRUE
+	state           = INSENSITIVE
+	file            = "button3.png"
+	border          = { 10, 5, 5, 10 }
+	stretch         = TRUE
+      }
+    image
+      {
+        function        = FLAT_BOX
+	recolorable     = TRUE
+	file            = "button6.png"
+	border          = { 10, 5, 5, 10 }
+	stretch         = TRUE
+      }
+  }
+}
+
+class "GtkTreeItem" style "item"
+class "GtkListItem" style "item"
+
+style "window"
+{
+  engine "pixmap" {
+    image
+      {
+	function        = FLAT_BOX
+	recolorable     = TRUE
+	file            = "empty.png"
+	stretch         = FALSE
+      }
+  }
+}
+
+class "GtkWindow" style "window"
+
+style "curve"
+{
+  engine "pixmap" {
+    image
+      {
+        function        = FLAT_BOX
+	recolorable     = TRUE
+	detail          = "curve_bg"
+	file            = "button1.png"
+	border          = { 2, 2, 2, 2 }
+	stretch         = TRUE
+      }
+  }
+}
+
+class "GtkCurve" style "curve"
+
+style "scrollbar"
+{
+  engine "pixmap"
+  {
+    image
+      {
+        function        = BOX
+	recolorable     = TRUE
+	detail          = "slider"
+	state           = PRELIGHT
+	file            = "scrollbar_horiz1.png"
+	border          = { 15, 15, 2, 2 }
+	stretch         = TRUE
+	orientation     = HORIZONTAL
+      }
+    image
+      {
+        function        = BOX
+	recolorable     = TRUE
+	detail          = "slider"
+	file            = "scrollbar_horiz1.png"
+	border          = { 13, 12, 2, 2 }
+	stretch         = TRUE
+	orientation     = HORIZONTAL
+      }
+    image
+      {
+        function        = BOX
+	recolorable     = TRUE
+	detail          = "slider"
+	state           = PRELIGHT
+	file            = "scrollbar_vert1.png"
+	border          = { 2, 2, 15, 15 }
+	stretch         = TRUE
+	orientation     = VERTICAL
+      }
+    image
+      {
+        function        = BOX
+	recolorable     = TRUE
+	detail          = "slider"
+	file            = "scrollbar_vert1.png"
+	border          = { 2, 2, 15, 15 }
+	stretch         = TRUE
+	orientation     = VERTICAL
+      }
+    image
+      {
+        function        = BOX
+	recolorable     = TRUE
+	detail          = "trough"
+	file            = "vtrough.png"
+	border          = { 3, 3, 23, 23 }
+	stretch         = TRUE
+	orientation     = VERTICAL
+      }
+    image
+      {
+        function        = BOX
+	recolorable     = TRUE
+	detail          = "trough"
+	file            = "htrough.png"
+	border          = { 23, 23, 3, 3 }
+	stretch         = TRUE
+	orientation     = HORIZONTAL
+      }
+  }
+}
+
+class "GtkScrollbar" style "scrollbar"
+
+style "range"
+{
+  engine "pixmap" {
+
+    image
+      {
+        function        = BOX
+	recolorable     = TRUE
+	detail          = "trough"
+	file            = "slider_vth1.png"
+	border          = { 5, 2, 2, 2 }
+	stretch         = TRUE
+	orientation     = VERTICAL
+      }
+    image
+      {
+        function        = BOX
+	recolorable     = TRUE
+	detail          = "trough"
+	file            = "slider_hth1.png"
+	border          = { 2, 2, 5, 2 }
+	stretch         = TRUE
+	orientation     = HORIZONTAL
+      }
+  }
+}
+class "GtkRange" style "range"
diff --git a/src/gui/res/GTKResources/theme/vline.png b/src/gui/res/GTKResources/theme/vline.png
new file mode 100644
index 0000000..2771fd3
Binary files /dev/null and b/src/gui/res/GTKResources/theme/vline.png differ
diff --git a/src/gui/res/GTKResources/theme/vtrough.png b/src/gui/res/GTKResources/theme/vtrough.png
new file mode 100644
index 0000000..5be2289
Binary files /dev/null and b/src/gui/res/GTKResources/theme/vtrough.png differ
diff --git a/src/gui/res/GTKResources/theme/white.png b/src/gui/res/GTKResources/theme/white.png
new file mode 100644
index 0000000..ef7dd7a
Binary files /dev/null and b/src/gui/res/GTKResources/theme/white.png differ
diff --git a/src/gui/res/Windows/128.cur b/src/gui/res/Windows/128.cur
new file mode 100644
index 0000000..50916c8
Binary files /dev/null and b/src/gui/res/Windows/128.cur differ
diff --git a/src/gui/res/Windows/129.cur b/src/gui/res/Windows/129.cur
new file mode 100644
index 0000000..6ad8b08
Binary files /dev/null and b/src/gui/res/Windows/129.cur differ
diff --git a/src/gui/res/Windows/130.bmp b/src/gui/res/Windows/130.bmp
new file mode 100644
index 0000000..b6eccac
Binary files /dev/null and b/src/gui/res/Windows/130.bmp differ
diff --git a/src/gui/res/Windows/131.bmp b/src/gui/res/Windows/131.bmp
new file mode 100644
index 0000000..59221ac
Binary files /dev/null and b/src/gui/res/Windows/131.bmp differ
diff --git a/src/gui/res/Windows/132.bmp b/src/gui/res/Windows/132.bmp
new file mode 100644
index 0000000..a76abd6
Binary files /dev/null and b/src/gui/res/Windows/132.bmp differ
diff --git a/src/gui/res/Windows/132.cur b/src/gui/res/Windows/132.cur
new file mode 100644
index 0000000..754f9d5
Binary files /dev/null and b/src/gui/res/Windows/132.cur differ
diff --git a/src/gui/res/Windows/133.bmp b/src/gui/res/Windows/133.bmp
new file mode 100644
index 0000000..bec9723
Binary files /dev/null and b/src/gui/res/Windows/133.bmp differ
diff --git a/src/gui/res/Windows/3000.bmp b/src/gui/res/Windows/3000.bmp
new file mode 100644
index 0000000..f15e5d4
Binary files /dev/null and b/src/gui/res/Windows/3000.bmp differ
diff --git a/src/gui/res/Windows/333.bmp b/src/gui/res/Windows/333.bmp
new file mode 100644
index 0000000..2b106c5
Binary files /dev/null and b/src/gui/res/Windows/333.bmp differ
diff --git a/src/gui/res/Windows/400.bmp b/src/gui/res/Windows/400.bmp
new file mode 100644
index 0000000..e65f928
Binary files /dev/null and b/src/gui/res/Windows/400.bmp differ
diff --git a/src/gui/res/Windows/4000.bmp b/src/gui/res/Windows/4000.bmp
new file mode 100644
index 0000000..a75ad26
Binary files /dev/null and b/src/gui/res/Windows/4000.bmp differ
diff --git a/src/gui/res/Windows/4001.bmp b/src/gui/res/Windows/4001.bmp
new file mode 100644
index 0000000..80e84a4
Binary files /dev/null and b/src/gui/res/Windows/4001.bmp differ
diff --git a/src/gui/res/Windows/4002.bmp b/src/gui/res/Windows/4002.bmp
new file mode 100644
index 0000000..8623e20
Binary files /dev/null and b/src/gui/res/Windows/4002.bmp differ
diff --git a/src/gui/res/Windows/4003.bmp b/src/gui/res/Windows/4003.bmp
new file mode 100644
index 0000000..978be2c
Binary files /dev/null and b/src/gui/res/Windows/4003.bmp differ
diff --git a/src/gui/res/Windows/401.bmp b/src/gui/res/Windows/401.bmp
new file mode 100644
index 0000000..c56c7ad
Binary files /dev/null and b/src/gui/res/Windows/401.bmp differ
diff --git a/src/gui/res/Windows/4011.bmp b/src/gui/res/Windows/4011.bmp
new file mode 100644
index 0000000..896eeb8
Binary files /dev/null and b/src/gui/res/Windows/4011.bmp differ
diff --git a/src/gui/res/Windows/402.bmp b/src/gui/res/Windows/402.bmp
new file mode 100644
index 0000000..aba1bb8
Binary files /dev/null and b/src/gui/res/Windows/402.bmp differ
diff --git a/src/gui/res/Windows/4020.bmp b/src/gui/res/Windows/4020.bmp
new file mode 100644
index 0000000..90bdecb
Binary files /dev/null and b/src/gui/res/Windows/4020.bmp differ
diff --git a/src/gui/res/Windows/5000.bmp b/src/gui/res/Windows/5000.bmp
new file mode 100644
index 0000000..ed562e5
Binary files /dev/null and b/src/gui/res/Windows/5000.bmp differ
diff --git a/src/gui/res/Windows/5001.bmp b/src/gui/res/Windows/5001.bmp
new file mode 100644
index 0000000..1606b1d
Binary files /dev/null and b/src/gui/res/Windows/5001.bmp differ
diff --git a/src/gui/res/Windows/5002.bmp b/src/gui/res/Windows/5002.bmp
new file mode 100644
index 0000000..50b26e3
Binary files /dev/null and b/src/gui/res/Windows/5002.bmp differ
diff --git a/src/gui/res/Windows/5003.bmp b/src/gui/res/Windows/5003.bmp
new file mode 100644
index 0000000..d70ab5a
Binary files /dev/null and b/src/gui/res/Windows/5003.bmp differ
diff --git a/src/gui/res/Windows/5004.bmp b/src/gui/res/Windows/5004.bmp
new file mode 100644
index 0000000..980bed0
Binary files /dev/null and b/src/gui/res/Windows/5004.bmp differ
diff --git a/src/gui/res/Windows/5005.bmp b/src/gui/res/Windows/5005.bmp
new file mode 100644
index 0000000..63ab8b9
Binary files /dev/null and b/src/gui/res/Windows/5005.bmp differ
diff --git a/src/gui/res/Windows/5006.bmp b/src/gui/res/Windows/5006.bmp
new file mode 100644
index 0000000..8d3b949
Binary files /dev/null and b/src/gui/res/Windows/5006.bmp differ
diff --git a/src/gui/res/Windows/5007.bmp b/src/gui/res/Windows/5007.bmp
new file mode 100644
index 0000000..d94e949
Binary files /dev/null and b/src/gui/res/Windows/5007.bmp differ
diff --git a/src/gui/res/Windows/6000.bmp b/src/gui/res/Windows/6000.bmp
new file mode 100644
index 0000000..1e526f4
Binary files /dev/null and b/src/gui/res/Windows/6000.bmp differ
diff --git a/src/gui/res/Windows/6001.bmp b/src/gui/res/Windows/6001.bmp
new file mode 100644
index 0000000..34d20f7
Binary files /dev/null and b/src/gui/res/Windows/6001.bmp differ
diff --git a/src/gui/res/Windows/6002.bmp b/src/gui/res/Windows/6002.bmp
new file mode 100644
index 0000000..939e9c5
Binary files /dev/null and b/src/gui/res/Windows/6002.bmp differ
diff --git a/src/gui/res/Windows/6003.bmp b/src/gui/res/Windows/6003.bmp
new file mode 100644
index 0000000..fa0025c
Binary files /dev/null and b/src/gui/res/Windows/6003.bmp differ
diff --git a/src/gui/res/Windows/6004.bmp b/src/gui/res/Windows/6004.bmp
new file mode 100644
index 0000000..62e4e1a
Binary files /dev/null and b/src/gui/res/Windows/6004.bmp differ
diff --git a/src/gui/res/Windows/6005.bmp b/src/gui/res/Windows/6005.bmp
new file mode 100644
index 0000000..b06a34e
Binary files /dev/null and b/src/gui/res/Windows/6005.bmp differ
diff --git a/src/gui/res/Windows/6006.bmp b/src/gui/res/Windows/6006.bmp
new file mode 100644
index 0000000..95829f8
Binary files /dev/null and b/src/gui/res/Windows/6006.bmp differ
diff --git a/src/gui/res/Windows/6007.bmp b/src/gui/res/Windows/6007.bmp
new file mode 100644
index 0000000..d438889
Binary files /dev/null and b/src/gui/res/Windows/6007.bmp differ
diff --git a/src/gui/res/Windows/6008.bmp b/src/gui/res/Windows/6008.bmp
new file mode 100644
index 0000000..b74c8da
Binary files /dev/null and b/src/gui/res/Windows/6008.bmp differ
diff --git a/src/gui/res/Windows/6009.bmp b/src/gui/res/Windows/6009.bmp
new file mode 100644
index 0000000..2b95d61
Binary files /dev/null and b/src/gui/res/Windows/6009.bmp differ
diff --git a/src/gui/res/Windows/6010.bmp b/src/gui/res/Windows/6010.bmp
new file mode 100644
index 0000000..9fc9048
Binary files /dev/null and b/src/gui/res/Windows/6010.bmp differ
diff --git a/src/gui/res/Windows/6011.bmp b/src/gui/res/Windows/6011.bmp
new file mode 100644
index 0000000..5bfbf96
Binary files /dev/null and b/src/gui/res/Windows/6011.bmp differ
diff --git a/src/gui/res/Windows/6012.bmp b/src/gui/res/Windows/6012.bmp
new file mode 100644
index 0000000..690d702
Binary files /dev/null and b/src/gui/res/Windows/6012.bmp differ
diff --git a/src/gui/res/Windows/6013.bmp b/src/gui/res/Windows/6013.bmp
new file mode 100644
index 0000000..825568d
Binary files /dev/null and b/src/gui/res/Windows/6013.bmp differ
diff --git a/src/gui/res/Windows/6014.bmp b/src/gui/res/Windows/6014.bmp
new file mode 100644
index 0000000..f86c2be
Binary files /dev/null and b/src/gui/res/Windows/6014.bmp differ
diff --git a/src/gui/res/Windows/6016.bmp b/src/gui/res/Windows/6016.bmp
new file mode 100644
index 0000000..557d7cc
Binary files /dev/null and b/src/gui/res/Windows/6016.bmp differ
diff --git a/src/gui/res/Windows/6017.bmp b/src/gui/res/Windows/6017.bmp
new file mode 100644
index 0000000..6f4a120
Binary files /dev/null and b/src/gui/res/Windows/6017.bmp differ
diff --git a/src/gui/res/Windows/6018.bmp b/src/gui/res/Windows/6018.bmp
new file mode 100644
index 0000000..c15ce17
Binary files /dev/null and b/src/gui/res/Windows/6018.bmp differ
diff --git a/src/gui/res/Windows/6019.bmp b/src/gui/res/Windows/6019.bmp
new file mode 100644
index 0000000..f141875
Binary files /dev/null and b/src/gui/res/Windows/6019.bmp differ
diff --git a/src/gui/res/Windows/6020.bmp b/src/gui/res/Windows/6020.bmp
new file mode 100644
index 0000000..4f802db
Binary files /dev/null and b/src/gui/res/Windows/6020.bmp differ
diff --git a/src/gui/res/Windows/6021.bmp b/src/gui/res/Windows/6021.bmp
new file mode 100644
index 0000000..fdd576a
Binary files /dev/null and b/src/gui/res/Windows/6021.bmp differ
diff --git a/src/gui/res/Windows/6022.bmp b/src/gui/res/Windows/6022.bmp
new file mode 100644
index 0000000..7308af5
Binary files /dev/null and b/src/gui/res/Windows/6022.bmp differ
diff --git a/src/gui/res/Windows/6030.bmp b/src/gui/res/Windows/6030.bmp
new file mode 100644
index 0000000..ad60375
Binary files /dev/null and b/src/gui/res/Windows/6030.bmp differ
diff --git a/src/gui/res/Windows/6031.bmp b/src/gui/res/Windows/6031.bmp
new file mode 100644
index 0000000..f1a5c9d
Binary files /dev/null and b/src/gui/res/Windows/6031.bmp differ
diff --git a/src/gui/res/Windows/6032.bmp b/src/gui/res/Windows/6032.bmp
new file mode 100644
index 0000000..705a854
Binary files /dev/null and b/src/gui/res/Windows/6032.bmp differ
diff --git a/src/gui/res/Windows/6033.bmp b/src/gui/res/Windows/6033.bmp
new file mode 100644
index 0000000..4c1b1fd
Binary files /dev/null and b/src/gui/res/Windows/6033.bmp differ
diff --git a/src/gui/res/Windows/6034.bmp b/src/gui/res/Windows/6034.bmp
new file mode 100644
index 0000000..ae125d4
Binary files /dev/null and b/src/gui/res/Windows/6034.bmp differ
diff --git a/src/gui/res/Windows/6035.bmp b/src/gui/res/Windows/6035.bmp
new file mode 100644
index 0000000..fc7f38a
Binary files /dev/null and b/src/gui/res/Windows/6035.bmp differ
diff --git a/src/gui/res/Windows/6036.bmp b/src/gui/res/Windows/6036.bmp
new file mode 100644
index 0000000..0cabbeb
Binary files /dev/null and b/src/gui/res/Windows/6036.bmp differ
diff --git a/src/gui/res/Windows/6040.bmp b/src/gui/res/Windows/6040.bmp
new file mode 100644
index 0000000..b36e96b
Binary files /dev/null and b/src/gui/res/Windows/6040.bmp differ
diff --git a/src/gui/res/Windows/6041.bmp b/src/gui/res/Windows/6041.bmp
new file mode 100644
index 0000000..d7c14ad
Binary files /dev/null and b/src/gui/res/Windows/6041.bmp differ
diff --git a/src/gui/res/Windows/6042.bmp b/src/gui/res/Windows/6042.bmp
new file mode 100644
index 0000000..50114dd
Binary files /dev/null and b/src/gui/res/Windows/6042.bmp differ
diff --git a/src/gui/res/Windows/7000.bmp b/src/gui/res/Windows/7000.bmp
new file mode 100644
index 0000000..0faa2ea
Binary files /dev/null and b/src/gui/res/Windows/7000.bmp differ
diff --git a/src/gui/res/Windows/7001.bmp b/src/gui/res/Windows/7001.bmp
new file mode 100644
index 0000000..b8001bc
Binary files /dev/null and b/src/gui/res/Windows/7001.bmp differ
diff --git a/src/gui/res/Windows/7002.bmp b/src/gui/res/Windows/7002.bmp
new file mode 100644
index 0000000..5273de3
Binary files /dev/null and b/src/gui/res/Windows/7002.bmp differ
diff --git a/src/gui/res/Windows/7003.bmp b/src/gui/res/Windows/7003.bmp
new file mode 100644
index 0000000..3f7185c
Binary files /dev/null and b/src/gui/res/Windows/7003.bmp differ
diff --git a/src/gui/res/Windows/7004.bmp b/src/gui/res/Windows/7004.bmp
new file mode 100644
index 0000000..3ac440f
Binary files /dev/null and b/src/gui/res/Windows/7004.bmp differ
diff --git a/src/gui/res/Windows/7005.bmp b/src/gui/res/Windows/7005.bmp
new file mode 100644
index 0000000..92e5a71
Binary files /dev/null and b/src/gui/res/Windows/7005.bmp differ
diff --git a/src/gui/res/Windows/7010.bmp b/src/gui/res/Windows/7010.bmp
new file mode 100644
index 0000000..6b67bce
Binary files /dev/null and b/src/gui/res/Windows/7010.bmp differ
diff --git a/src/gui/res/Windows/7011.bmp b/src/gui/res/Windows/7011.bmp
new file mode 100644
index 0000000..1492bf5
Binary files /dev/null and b/src/gui/res/Windows/7011.bmp differ
diff --git a/src/gui/res/Windows/7012.bmp b/src/gui/res/Windows/7012.bmp
new file mode 100644
index 0000000..a31b9bd
Binary files /dev/null and b/src/gui/res/Windows/7012.bmp differ
diff --git a/src/gui/res/Windows/7013.bmp b/src/gui/res/Windows/7013.bmp
new file mode 100644
index 0000000..af4c2d4
Binary files /dev/null and b/src/gui/res/Windows/7013.bmp differ
diff --git a/src/gui/res/Windows/7014.bmp b/src/gui/res/Windows/7014.bmp
new file mode 100644
index 0000000..4ac56eb
Binary files /dev/null and b/src/gui/res/Windows/7014.bmp differ
diff --git a/src/gui/res/Windows/7020.bmp b/src/gui/res/Windows/7020.bmp
new file mode 100644
index 0000000..fe61dc8
Binary files /dev/null and b/src/gui/res/Windows/7020.bmp differ
diff --git a/src/gui/res/Windows/7050.bmp b/src/gui/res/Windows/7050.bmp
new file mode 100644
index 0000000..c88e0c8
Binary files /dev/null and b/src/gui/res/Windows/7050.bmp differ
diff --git a/src/gui/res/Windows/Win.rc b/src/gui/res/Windows/Win.rc
new file mode 100644
index 0000000..c75c080
--- /dev/null
+++ b/src/gui/res/Windows/Win.rc
@@ -0,0 +1 @@
+#define IDM_NEW				10
#define IDM_OPEN			80
#define IDM_CLOSE			12
#define IDM_SAVE			13
#define IDM_PRINT			14
#define IDM_EXIT			15
#define IDM_UNDO			16
#define IDM_CUT				17
#define IDM_COPY			18
#define IDM_PASTE			19
#define IDM_ALL				20

#include <afxres.h>

HYPHY MENU
{
	POPUP "&File"
	{
		POPUP "&New"
		{
			MENUITEM "New &Tree\tCtrl+N", 	     	 70
			MENUITEM "New &Model\tCtrl+Shift+N", 	 71
			MENUITEM "New &Chart\tCtrl+Shift+Alt+N", 72
			MENUITEM "New &Genetic Code", 		 	 73
			MENUITEM "New S&QLite Database", 	 	 74
		}

		POPUP "&Open"
		{
			MENUITEM "Open &Batch File\tCtrl+O", 	     80
			MENUITEM "Open &Data File\tCtrl+Alt+O", 	 81
			MENUITEM "Open &Tree File\tCtrl+Shift+O",    82
			MENUITEM SEPARATOR
			MENUITEM "Open &Recent",					 85
			MENUITEM SEPARATOR
			MENUITEM "Open Text &File",    				 83
			MENUITEM "Open Ta&ble",    					 84
			MENUITEM "Open S&QLite Database",    		 85
		}
		
		MENUITEM SEPARATOR
		MENUITEM "&Save\tCtrl+S",				IDM_SAVE
		MENUITEM SEPARATOR
		MENUITEM "&Print\tCtrl+P",				IDM_PRINT
		MENUITEM SEPARATOR
		MENUITEM "E&xit\tAlt+F4",				IDM_EXIT
	}
	
	POPUP "&Edit"
	{
		MENUITEM "&Undo\tCtrl+Z",				IDM_UNDO, GRAYED
		MENUITEM "&Redo\tCtrl+Y",				31, GRAYED
		MENUITEM SEPARATOR	
		MENUITEM "Cu&t\tCtrl+X",				IDM_CUT, GRAYED
		MENUITEM "&Copy\tCtrl+C",				IDM_COPY, GRAYED
		MENUITEM "&Paste\tCtrl+V",				IDM_PASTE, GRAYED
		MENUITEM SEPARATOR
		MENUITEM "Select A&ll\tCtrl+A",			IDM_ALL
		MENUITEM "Clea&r Console",				26
		MENUITEM SEPARATOR
		POPUP	 "&Settings"
		{
			MENUITEM "&HYPHY Settings",			27
			MENUITEM "&Font Settings",			28
		}
	}
	
	POPUP "&Analyses"
	{
		MENUITEM "&Cancel Execution\tCtrl+.", 	 21,GRAYED
		MENUITEM "&Suspend Execution\tCtrl+;",	 22,GRAYED
		MENUITEM SEPARATOR
		MENUITEM "&View messages.log",		  	 23
		MENUITEM SEPARATOR
		MENUITEM "Standard &Analyses\tCtrl+E",	 24
		MENUITEM "&Results",					 40
		MENUITEM "Rerun &Last Analysis\tCtrl+R", 30, GRAYED
		/*MENUITEM SEPARATOR
		MENUITEM "&Trees",					     40, GRAYED*/
		MENUITEM SEPARATOR
		MENUITEM "C&ompute Expression\tCtrl+K",	 60
		MENUITEM "Execute Se&lection",		     61
	}
	
	POPUP "&Windows"
	{
		MENUITEM "&Console Window\tCtrl+0", 	200
		MENUITEM "Object &Inspector\tCtrl+I", 	201
	}

	POPUP "&Help"
	{
		MENUITEM "&About HYPHY", 				25
		MENUITEM "HYPHY &Help", 				29
	}
}

HYPHY	    ACCELERATORS
{
	"^O",	IDM_OPEN
	"^S",	IDM_SAVE
	"^P",	IDM_PRINT
	"^R",	30
	"^Z",	IDM_UNDO
	"N", 	70, VIRTKEY, CONTROL
	"N", 	71, VIRTKEY, CONTROL, SHIFT
	"N", 	72, VIRTKEY, CONTROL, SHIFT, ALT
	"O", 	80, VIRTKEY, CONTROL
	"O", 	81, VIRTKEY, CONTROL, ALT
	"O", 	82, VIRTKEY, CONTROL, SHIFT
	/* Note ther is no accelerator for Ctrl-C Copy because it is   */
	/* is treated specially under WM_CHAR to resolve the ambiguity */
	/* between Ctrl-C meaning Copy and meaning Interrupt. mm 980421*/
	"^X",	IDM_CUT
	"^V",	IDM_PASTE
	"^A",	IDM_ALL
	"^.",	21
	"^;",	22
	"^E",	24
	"^R",	30
	"^0",	200
	"^I",	201
	"^K",	60
}


101 DIALOG FIXED IMPURE 0, 0, 289, 170
STYLE DS_MODALFRAME | DS_3DLOOK  | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU 
CAPTION "Dialog"
FONT 8, "MS Sans Serif"
BEGIN
   DEFPUSHBUTTON   "OK",1,170,140,50,14,WS_DISABLED
   PUSHBUTTON      "Cancel",2,226,140,50,14
   LISTBOX         1000,15,18,144,135,LBS_NOINTEGRALHEIGHT | WS_VSCROLL | 
                   WS_TABSTOP | LBS_HASSTRINGS
   GROUPBOX        "Item Description",-1,169,18,104,115
   LTEXT           "",65534,175,30,94,98
END

102 DIALOG FIXED IMPURE  0, 0, 169, 170
STYLE DS_MODALFRAME | DS_3DLOOK  | WS_POPUP | WS_CAPTION | DS_CENTER |
   WS_SYSMENU
CAPTION "Dialog"
FONT 8, "MS Sans Serif"
BEGIN
   DEFPUSHBUTTON   "OK",1,29,149,50,14,WS_DISABLED
   PUSHBUTTON      "Cancel",2,87,149,50,14
   LISTBOX         1000,11,7,144,135,LBS_HASSTRINGS | LBS_NOINTEGRALHEIGHT | 
                   LBS_EXTENDEDSEL | WS_VSCROLL | WS_TABSTOP
END

200                     BITMAP  DISCARDABLE     "hyphy.bmp"

103 DIALOG FIXED DISCARDABLE  0, 0, 264, 258
STYLE DS_MODALFRAME | DS_3DLOOK | DS_CENTER | WS_POPUP | WS_CAPTION | DS_CENTER |
   WS_SYSMENU
CAPTION "About HYPHY"
LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
FONT 8, "MS Sans Serif"
{
 DEFPUSHBUTTON "OK", 1, 107, 238, 50, 14, BS_CENTER | BS_VCENTER
 CONTROL 200, 200, "STATIC", SS_BITMAP | SS_CENTERIMAGE | SS_REALSIZEIMAGE, 0, 0, 264, 137
 LTEXT "", 129, 5, 143, 254, 88, NOT WS_GROUP | WS_BORDER
}


104 DIALOG FIXED DISCARDABLE  0, 0, 288, 172
STYLE DS_MODALFRAME | DS_3DLOOK  | WS_POPUP | WS_CAPTION | DS_CENTER 
CAPTION "HYPHY  Preferences"
FONT 8, "MS Sans Serif"
BEGIN
   DEFPUSHBUTTON   "Done",1,173,144,50,14
   PUSHBUTTON      "Cancel",2,225,144,50,14
   CONTROL         "Tree1",3,"SysTreeView32",WS_BORDER | TVS_HASBUTTONS | TVS_LINESATROOT | TVS_HASLINES | 
                   WS_TABSTOP,13,14,144,144
   GROUPBOX        "Item Description",6,171,12,103,91
   GROUPBOX        "Value",15,171,107,103,30,NOT WS_VISIBLE
   LTEXT           "",7,177,24,92,74
   EDITTEXT        11,177,119,92,13,ES_AUTOHSCROLL | NOT WS_VISIBLE 
   COMBOBOX        12,177,120,92,200,CBS_DROPDOWNLIST | NOT WS_VISIBLE | 
                   WS_VSCROLL | WS_TABSTOP 
END

105 DIALOG FIXED IMPURE 0, 0, 289, 170
STYLE DS_MODALFRAME | DS_3DLOOK  | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU 
CAPTION "Dialog"
FONT 8, "MS Sans Serif"
BEGIN
   DEFPUSHBUTTON   "OK",1,170,140,50,14,WS_DISABLED
   PUSHBUTTON      "Cancel",2,226,140,50,14
   CONTROL         "Tree1",3,"SysTreeView32",WS_BORDER | TVS_HASBUTTONS | TVS_LINESATROOT | TVS_HASLINES | 
                   WS_TABSTOP,13,14,144,144
   GROUPBOX        "Item Description",-1,169,18,104,115
   LTEXT           "",65534,175,30,94,98
END



107 DIALOG FIXED DISCARDABLE   0, 0, 264, 274
STYLE DS_3DLOOK |  DS_MODALFRAME | DS_3DLOOK | DS_CENTER | WS_POPUP | WS_CAPTION 
CAPTION "Welcome to HyPhy"
LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
FONT 8, "MS Sans Serif"
BEGIN
   DEFPUSHBUTTON   "OK",1,169,257,50,14
   CONTROL         "Do not show again",0,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,53,259,75,10
   CTEXT           "Static",5,51,146,167,11,SS_CENTERIMAGE
   CONTROL         400,2,"Static",SS_BITMAP | SS_NOTIFY ,50,160,172,32
   CONTROL         401,3,"Static",SS_BITMAP | SS_NOTIFY | SS_REALSIZEIMAGE ,50,192,172,32
   CONTROL         402,4,"Static",SS_BITMAP | SS_NOTIFY | SS_REALSIZEIMAGE ,50,224,172,32
   CONTROL         200,6,"Static",SS_BITMAP | SS_NOTIFY | SS_SUNKEN,0,0,274,141
END

110 DIALOG 0, 0, 300, 200 
STYLE DS_MODALFRAME | DS_3DLOOK  | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU 
CAPTION "Dialog"
FONT 8, "MS Sans Serif"
BEGIN
END

1 VERSIONINFO 
BEGIN
	BLOCK "StringFileInfo"
		BEGIN
			BLOCK "0409"
				BEGIN
					VALUE "CompanyName", "Sergei L. Kosakovsky Pond, Spencer V. Muse"
					VALUE "FileDescription", "HYPHY - Hypothesis Testing Using Phylogenies"
					VALUE "FileVesion", "0.99beta"
					VALUE "InternalName", "HYPHY"
					VALUE "OriginalFilename", "HYPHY.EXE"
					VALUE "ProductName", "HYPHY(Win32)"
					VALUE "ProductVesrion", "0.99beta"
				END
		END
END 


STRINGTABLE DISCARDABLE 
BEGIN
   0                       " "
   1                       "_Core Developers:"
   2                       "Sergei L Kosakovsky Pond (spond at ucsd.edu)"
   3                       "Steven Weaver (sweaver at ucsd.edu)"
   4                       "Art FY Poon    (apoon at cfenet.ubc.ca)"
   5                       "_Module Developers:"
   6                       "Lance Hepler (nlhepler at gmail.com)"
   7                       "Martin Smith (martin.audacis at gmail.com)"
   8                       "_Significant contributions from:"
   9                       "Spencer V Muse (muse at stat.ncsu.edu)"
   10                      "Simon DW Frost (sdf22 at cam.ac.uk)"
   11                      " "
   12                       "_Program Resources and Updates:"
   13                       "http://www.hyphy.org/"
   14                      "1998-2013, distributed as freeware."
   15                      "Funded by a mix of NSF/NIH grants."
   16					    " "
   17                      "_Important Note"
   18                      "This program is distributed in the hope  "
   19                      "that it will be useful but WITHOUT ANY WARRANTY;"
   20                      "without even the implied warranty of MERCHANTABILITY"
   21                      "or FITNESS FOR A PARTICULAR PURPOSE."
   22                      "See the website for more details."
END


101	     	 ICON  		"desk.ico"
APPICON  	 ICON  		"desk.ico"

131		 BITMAP  	"131.bmp"
132		     BITMAP  	"132.bmp"

333		     BITMAP  	"333.bmp"

400		     BITMAP  	"400.bmp"
401		     BITMAP  	"401.bmp"
402		     BITMAP  	"402.bmp"

4000		 BITMAP  	"4000.bmp"
4001		 BITMAP  	"4001.bmp"
4002		 BITMAP  	"4002.bmp"
4003		 BITMAP  	"4003.bmp"
4011		 BITMAP  	"4011.bmp"
4020		 BITMAP  	"4020.bmp"

5000     BITMAP  "5000.bmp"
5001     BITMAP  "5001.bmp"
5002     BITMAP  "5002.bmp"
5003     BITMAP  "5003.bmp"
5004     BITMAP  "5004.bmp"
5005     BITMAP  "5005.bmp"
5006     BITMAP  "5006.bmp"
5007     BITMAP  "5007.bmp"

6000     BITMAP  "6000.bmp"
6001     BITMAP  "6001.bmp"
6002     BITMAP  "6002.bmp"
6003     BITMAP  "6003.bmp"
6004     BITMAP  "6004.bmp"
6005     BITMAP  "6005.bmp"
6006     BITMAP  "6006.bmp"
6007     BITMAP  "6007.bmp"
6008     BITMAP  "6008.bmp"
6009     BITMAP  "6009.bmp"

6010     BITMAP  "6010.bmp"
6011     BITMAP  "6011.bmp"
6012     BITMAP  "6012.bmp"
6013     BITMAP  "6013.bmp"
6014     BITMAP  "6014.bmp"

6016     BITMAP  "6016.bmp"
6017     BITMAP  "6017.bmp"
6018     BITMAP  "6018.bmp"
6019     BITMAP  "6019.bmp"
6020     BITMAP  "6020.bmp"
6021     BITMAP  "6021.bmp"
6022     BITMAP  "6022.bmp"

6030     BITMAP  "6030.bmp"
6031     BITMAP  "6031.bmp"
6032     BITMAP  "6032.bmp"
6033     BITMAP  "6033.bmp"
6034     BITMAP  "6034.bmp"
6035     BITMAP  "6035.bmp"
6036     BITMAP  "6036.bmp"

6040     BITMAP  "6040.bmp"
6041     BITMAP  "6041.bmp"
6042     BITMAP  "6042.bmp"

7000     BITMAP  "7000.bmp"
7001     BITMAP  "7001.bmp"
7002     BITMAP  "7002.bmp"
7003     BITMAP  "7003.bmp"
7004     BITMAP  "7004.bmp"
7005     BITMAP  "7005.bmp"

7010     BITMAP  "7010.bmp"
7011     BITMAP  "7011.bmp"
7012     BITMAP  "7012.bmp"
7013     BITMAP  "7013.bmp"
7014     BITMAP  "7014.bmp"
7020     BITMAP  "7020.bmp"

7050     BITMAP  "7050.bmp"

130     BITMAP  "130.bmp"
133     BITMAP  "133.bmp"
3000     BITMAP  "3000.bmp"

\ No newline at end of file
diff --git a/src/gui/res/Windows/desk.ico b/src/gui/res/Windows/desk.ico
new file mode 100644
index 0000000..59efff0
Binary files /dev/null and b/src/gui/res/Windows/desk.ico differ
diff --git a/src/gui/res/Windows/hyphy.bmp b/src/gui/res/Windows/hyphy.bmp
new file mode 100644
index 0000000..c8b3475
Binary files /dev/null and b/src/gui/res/Windows/hyphy.bmp differ
diff --git a/src/gui/res/Windows/pthreadGC2.dll b/src/gui/res/Windows/pthreadGC2.dll
new file mode 100644
index 0000000..8c5dca6
Binary files /dev/null and b/src/gui/res/Windows/pthreadGC2.dll differ
diff --git a/src/gui/res/Windows/pthreadVC2.dll b/src/gui/res/Windows/pthreadVC2.dll
new file mode 100644
index 0000000..0f47a83
Binary files /dev/null and b/src/gui/res/Windows/pthreadVC2.dll differ
diff --git a/src/gui/win/Components/HYPlatformButton.cpp b/src/gui/win/Components/HYPlatformButton.cpp
new file mode 100644
index 0000000..5f561b4
--- /dev/null
+++ b/src/gui/win/Components/HYPlatformButton.cpp
@@ -0,0 +1 @@
+/*
    Button component for Win32.

    Sergei L. Kosakovsky Pond, May 2000 - December 2002
*/

#include "errorfns.h"
#include "HYButton.h"
#include "HYUtils.h"
#include "HYEventTypes.h"
#include "HYGraphicPane.h"
#include "HYPlatformWindow.h"


//__________________________________________________________________

_HYPlatformButton::_HYPlatformButton    (void)
{
    backFill = CreateSolidBrush (RGB (255,255,255));
    checkPointer (backFill);

    buttonWindow    = nil;
    buttonRect      = (RECT) {
        0,0,100,100
    };

    pLabelFont      = nil;
    fc              = 0;
}

//__________________________________________________________________

_HYPlatformButton::~_HYPlatformButton   (void)
{
    DeleteObject (backFill);
    if (pLabelFont) {
        DeleteObject (pLabelFont);
    }
}

//__________________________________________________________________

void    _HYPlatformButton::_SetBackColor (_HYColor& c)
{
    DeleteObject (backFill);
    backFill = CreateSolidBrush (RGB(c.R,c.G,c.B));
    checkPointer (backFill);
}

//__________________________________________________________________

void        _HYPlatformButton::_SetFont (_HYFont& f)
{
    if (pLabelFont) {
        DeleteObject(pLabelFont);
    }

    pLabelFont = CreateFont (f.size,0,0,0,(f.style&HY_FONT_BOLD)?FW_BOLD:FW_NORMAL,f.style&HY_FONT_ITALIC,FALSE,FALSE,ANSI_CHARSET,OUT_DEFAULT_PRECIS,
                             CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH|FF_DONTCARE,f.face.sData);

    if (buttonWindow) {
        SendMessage (buttonWindow, WM_SETFONT, (WPARAM)pLabelFont, 1);
    }
}

//__________________________________________________________________
void        _HYPlatformButton::_Update (Ptr p)
{
    _Paint (p);
}


//__________________________________________________________________
void        _HYPlatformButton::_SetDimensions (_HYRect r, _HYRect rel)
{
    _HYButton* theParent = (_HYButton *) this;
    theParent->_HYPlatformComponent::_SetDimensions (r,rel);
    _SetVisibleSize (rel);
}


//__________________________________________________________________
void        _HYPlatformButton::_EnableButton (bool e)
{
    if (buttonWindow) {
        EnableWindow (buttonWindow, e);
    }
}



//__________________________________________________________________
void        _HYPlatformButton::_SetButtonKind (unsigned char k)
{
    if (buttonWindow) {
        bool         onOff = (k==HY_BUTTON_OK);
        SendMessage (buttonWindow,BM_SETSTYLE, onOff?BS_DEFPUSHBUTTON:BS_PUSHBUTTON, 1);
    }
}


//__________________________________________________________________
void        _HYPlatformButton::_SetVisibleSize (_HYRect rel)
{
    _HYButton * theParent = (_HYButton*) this;

    buttonRect.left=rel.left;
    buttonRect.top = rel.top;

    _HYRect s = theParent->_SuggestDimensions();

    buttonRect.right =  buttonRect.left+s.right;
    buttonRect.bottom = buttonRect.top+s.bottom;

    AlignRectangle (rel, buttonRect, theParent->GetAlignFlags());

    if (buttonWindow) {
        SetWindowPos(buttonWindow,nil, buttonRect.left,buttonRect.top,buttonRect.right-buttonRect.left+1,buttonRect.bottom-buttonRect.top+1,SWP_NOZORDER);
    }
}


//__________________________________________________________________
void        _HYPlatformButton::_Paint (Ptr p)
{
    _HYButton * theParent = (_HYButton*) this;
    RECT        notButton,
                clientArea = HYRect2Rect (theParent->rel);
    SubtractRect (&notButton, &clientArea, & buttonRect);

    if (!(theParent->settings.width&HY_COMPONENT_TRANSP_BG)) {
        FillRect     ((HDC)((_HYRect*)p)->width, &notButton, backFill);
    }

    if (buttonWindow) {
        UpdateWindow (buttonWindow);
    }

    (*theParent)._HYPlatformComponent::_Paint(p);
}

//__________________________________________________________________

_HYRect _HYButton::_SuggestDimensions (void)
{
    _HYRect res = {10,100,10,100,HY_COMPONENT_NO_SCROLL};

    res.top = res.bottom = buttonFont.size+8;
    res.left= res.right  = GetVisibleStringWidth (buttonText,buttonFont) + 15;

    return res;
}

//__________________________________________________________________

void        _HYButton::_Activate (void)
{
    if (!activationFlag)
        if (buttonWindow&&isEnabled) {
            EnableWindow (buttonWindow,true);
        }

    _HYPlatformComponent::_Activate();
}

//__________________________________________________________________

void        _HYButton::_Deactivate (void)
{
    if (activationFlag)
        if (buttonWindow&&isEnabled) {
            EnableWindow (buttonWindow,false);
        }

    _HYPlatformComponent::_Deactivate();
}

//__________________________________________________________________

void        _HYPlatformButton::_SetText (void)
{
    _HYButton *parent = (_HYButton*)this;

    if (buttonWindow) {
        SetWindowText (buttonWindow,parent->buttonText.sData);
    } else {
        buttonWindow = CreateWindow ("BUTTON",parent->buttonText.sData,WS_VISIBLE|WS_CHILD|((parent->buttonKind==HY_BUTTON_OK)?BS_DEFPUSHBUTTON:BS_PUSHBUTTON),
                                     buttonRect.left,buttonRect.right,buttonRect.right-buttonRect.left+1,buttonRect.bottom-buttonRect.top+1
                                     ,((_HYButton*)this)->parentWindow,NULL,GetModuleHandle (NULL), NULL);

        checkPointer   (buttonWindow);

        if (pLabelFont) {
            SendMessage (buttonWindow, WM_SETFONT, (WPARAM)pLabelFont, 1);
        }
    }
}

//__________________________________________________________________

bool _HYButton::_ProcessOSEvent (Ptr vEvent)
{
    _HYWindowsUIMessage * theEvent = (_HYWindowsUIMessage *)vEvent;

    switch (theEvent->iMsg) {
    case WM_COMMAND: {
        WORD       wP = HIWORD(theEvent->wParam);
        if ((wP==BN_CLICKED)||(wP==BN_DOUBLECLICKED)) {
            HWND    cbh = (HWND)theEvent->lParam;
            if ((cbh == buttonWindow)&&isEnabled) {
                if (messageRecipient) {
                    messageRecipient->ProcessEvent (generateButtonPushEvent (GetID(),0));
                }
                return true;
            }
        }
        break;
    }
    case WM_CTLCOLORBTN: {
        if ((HWND)theEvent->lParam == buttonWindow) {
            theEvent->res = (LRESULT)backFill;
            return true;
        }
        break;
    }
    case WM_CHAR: {
        bool    good    = false;
        int     keyCode = theEvent->wParam;

        if (buttonKind == HY_BUTTON_OK) {
            good = (keyCode==VK_RETURN);
        } else if (buttonKind == HY_BUTTON_CANCEL) {
            good = (keyCode== VK_ESCAPE);
        }

        if (good) {
            SendMessage (buttonWindow, BM_SETSTATE, true, 0);
            if (messageRecipient) {
                messageRecipient->ProcessEvent (generateButtonPushEvent (GetID(),0));
            }
        }
        if (good) {
            return true;
        }
        break;
    }
    }
    return _HYPlatformComponent::_ProcessOSEvent (vEvent);
}
// EOF
\ No newline at end of file
diff --git a/src/gui/win/Components/HYPlatformButtonBar.cpp b/src/gui/win/Components/HYPlatformButtonBar.cpp
new file mode 100644
index 0000000..ac5fdeb
--- /dev/null
+++ b/src/gui/win/Components/HYPlatformButtonBar.cpp
@@ -0,0 +1 @@
+/*
    Toolbar component for Mac OS API

    Sergei L. Kosakovsky Pond, May 2000-December 2002
*/

#include "HYButtonBar.h"
#include "HYPullDown.h"
#include "errorfns.h"
#include "HYPlatformWindow.h"
#include "commctrl.h"
#include "HYGraphicPane.h"


extern bool forceUpdateForScrolling;

//__________________________________________________________________

HBRUSH      blackIconFill = CreateSolidBrush (RGB(0,0,0)),
            dimIconFill   = CreatePatternBrush (LoadBitmap (GetModuleHandle(NULL),MAKEINTRESOURCE(333)));

HPEN        buttonBorder1 = CreatePen        (PS_SOLID, 1, RGB(0,0,0));


//__________________________________________________________________

_HYPlatformButtonBar::_HYPlatformButtonBar(void)
{
    backFill = CreateSolidBrush(RGB(0xff,0xff,0xff));
    if (!backFill) {
        warnError (-108);
    }
    pushed = -1;
    lastMouseDown = -1;
    ttCtl = nil;

}

//__________________________________________________________________

_HYPlatformButtonBar::~_HYPlatformButtonBar(void)
{
    if (backFill) {
        DeleteObject (backFill);
    }
    DestroyWindow (ttCtl);
}


//__________________________________________________________________

void    _HYPlatformButtonBar::_DisposeButtons(void)
{
    _HYButtonBar* theParent = (_HYButtonBar*)this;
    for (long i=0; i<theParent->ButtonCount(); i++) {
        DeleteObject ((HBITMAP)theParent->buttons.lData[i]);
    }
}

//__________________________________________________________________

void    _HYPlatformButtonBar::_DisposeButton(long k)
{
    _HYButtonBar* theParent = (_HYButtonBar*)this;
    if ((k<theParent->ButtonCount())&&(k>=0)) {
        DeleteObject ((HBITMAP)theParent->buttons.lData[k]);
    }
}

//__________________________________________________________________

void        _HYPlatformButtonBar::_SetBackColor (_HYColor& c)
{
    if (backFill)   {
        DeleteObject(backFill);
    }
    backFill = CreateSolidBrush(RGB(c.R,c.G,c.B));
}


//__________________________________________________________________
void        _HYPlatformButtonBar::_SetVisibleSize (_HYRect rel)
{
    _HYButtonBar* theParent = (_HYButtonBar*) this;
    buttonRect.left=rel.left;
    buttonRect.top = rel.top;
    _HYRect s = theParent->_SuggestDimensions();
    buttonRect.right = buttonRect.left+s.right;
    buttonRect.bottom = buttonRect.top+s.bottom;
    AlignRectangle (rel, buttonRect, theParent->GetAlignFlags());
    if (ttCtl) {
        TOOLINFO ti;
        ti.cbSize = sizeof (TOOLINFO);
        ti.uFlags = TTF_SUBCLASS;
        ti.hwnd   = theParent->parentWindow;
        ti.hinst  = ProgramInstance;
        for (long k=0; k<theParent->buttons.lLength; k++) {
            _String * tt = (_String*)theParent->toolTips(k);
            if (tt->sLength) {
                ti.uId = k;
                int    h, v;
                theParent->GetButtonLoc (k,h,v,false);
                ti.rect.left   = h;
                ti.rect.top    = v;
                ti.rect.right  = h+theParent->GetButtonDim();
                ti.rect.bottom = v+theParent->GetButtonDim();
                //printf ("Added: %s %d %d %d %d\n", tt->sData, ti.rect.left, ti.rect.top, ti.rect.right, ti.rect.bottom);
                SendMessage(ttCtl, TTM_NEWTOOLRECT, 0, (LPARAM) (LPTOOLINFO) &ti);
            }
        }
    }
}

//__________________________________________________________________

void        _HYButtonBar::_Activate (void)
{
    if (!activationFlag)
        for (long k=0; k<enabledButtons.lLength; k++) {
            _MarkButtonForUpdate (enabledButtons.lData[k]);
        }

    //SendMessage (ttCtl, TTM_ACTIVATE, 1, 0);
    if (ttCtl) {
        DestroyWindow (ttCtl);
    }

    ttCtl = CreateWindowEx (WS_EX_TOPMOST, TOOLTIPS_CLASS, NULL, WS_POPUP|TTS_NOPREFIX|TTS_ALWAYSTIP,
                            CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,parentWindow,
                            NULL,ProgramInstance, NULL);

    checkPointer (ttCtl);
    SetWindowPos (ttCtl, HWND_TOPMOST, 0, 0,0,0,SWP_NOMOVE|SWP_NOSIZE|SWP_NOACTIVATE);

//  if (SendMessage (ttCtl, TTM_GETTOOLCOUNT, 0, 0) == 0)
    {

        TOOLINFO ti;
        ti.cbSize = sizeof (TOOLINFO);
        ti.uFlags = TTF_SUBCLASS;
        ti.hwnd   = parentWindow;
        ti.hinst  = ProgramInstance;

        //long k = 0;
        for (long k=0; k<buttons.lLength; k++) {
            _String * tt = (_String*)toolTips(k);
            if (tt->sLength) {
                ti.uId = k;
                int    h, v;
                GetButtonLoc (k,h,v,false);
                ti.rect.left   = h;
                ti.rect.top    = v;
                ti.rect.right  = h+GetButtonDim();
                ti.rect.bottom = v+GetButtonDim();
                ti.lpszText    = tt->sData;
                //printf ("Added: %s %d %d %d %d\n", tt->sData, ti.rect.left, ti.rect.top, ti.rect.right, ti.rect.bottom);
                SendMessage(ttCtl, TTM_ADDTOOL, 0, (LPARAM) (LPTOOLINFO) &ti);
            }
        }
    }
    _HYPlatformComponent::_Activate();
}

//__________________________________________________________________

void        _HYButtonBar::_Deactivate (void)
{
    if (activationFlag) {
        for (long k=0; k<enabledButtons.lLength; k++) {
            _MarkButtonForUpdate (enabledButtons.lData[k]);
        }
    }
    //SendMessage (ttCtl, TTM_ACTIVATE, 0, 0);
    if (ttCtl) {
        DestroyWindow (ttCtl);
    }
    ttCtl = nil;
    _HYPlatformComponent::_Deactivate();
}

//__________________________________________________________________

void        _HYButtonBar::_ComponentMouseExit (void)
{
    _UnpushButton();
}


//__________________________________________________________________
void        _HYPlatformButtonBar::_Paint (Ptr p)
{
    _HYButtonBar * theParent = (_HYButtonBar*)this;
    _HYRect * relRect = (_HYRect*)p;
    HDC     theContext = (HDC)relRect->width;
    RECT    cRect,iRect;
    cRect.left = relRect->left;
    cRect.right = relRect->right;
    cRect.top = relRect->top;
    cRect.bottom = relRect->bottom;

    if (!(theParent->settings.width&HY_COMPONENT_TRANSP_BG)) {
        FillRect (theContext,&cRect,backFill);
    }

    HRGN clipRgn   = CreateRectRgn (cRect.left,cRect.top,cRect.right,cRect.bottom);
    HPEN savePen   = (HPEN)SelectObject (theContext,buttonBorder1);

    if (!clipRgn) {
        warnError (-108);
    }
    SelectClipRgn (theContext,clipRgn);
    cRect.left = buttonRect.left;
    cRect.top = buttonRect.top;
    int   step = theParent->GetButtonDim()+2*HY_BUTTONBAR_BORDER;
    cRect.right = cRect.left+step;
    cRect.bottom = cRect.top+step;

    if (theParent->ButtonCount()) {
        if (otherDC) {
            for (long i=0; i<theParent->ButtonCount(); i++) {
                if (i&&(i%theParent->BarWidth()==0)) {
                    cRect.left = buttonRect.left;
                    cRect.top +=step;
                    cRect.bottom +=step;
                    cRect.right = cRect.left+step;
                }
                iRect = cRect;
                InflateRect (&iRect,-HY_BUTTONBAR_BORDER,-HY_BUTTONBAR_BORDER);
                RECT iRect2 = iRect;
                iRect2.right++;
                iRect2.bottom++;

                bool        paintDimmed = false;

                BITMAP    theBM;
                GetObject ((HBITMAP)theParent->buttons(i), sizeof (BITMAP), &theBM);

                SelectObject (otherDC, (HBITMAP)theParent->buttons(i));

                if (theParent->activationFlag) {
                    if (i==pushed) {
                        FillRect (theContext, &iRect2, blackIconFill);

                        //TransparentBlt     (theContext, iRect.left, iRect.top, iRect.right-iRect.left+1, iRect.bottom-iRect.top+1,
                        // otherDC, 0, 0, theBM.bmWidth, theBM.bmHeight, RGB(255,255,255));
                        DrawTransparentBitmap (theContext,(HBITMAP)theParent->buttons(i),iRect.left, iRect.top, iRect.right-iRect.left+1, iRect.bottom-iRect.top+1,RGB(255,255,255));
                    } else {
                        if (theParent->enabledButtons.Find(i)>=0)
                            StretchBlt   (theContext, iRect.left, iRect.top, iRect.right-iRect.left+1, iRect.bottom-iRect.top+1,
                                          otherDC, 0, 0, theBM.bmWidth, theBM.bmHeight, SRCCOPY);
                        else {
                            paintDimmed = true;
                        }
                    }
                } else {
                    paintDimmed = true;
                }

                if (paintDimmed) {

                    FillRect (theContext, &iRect2, dimIconFill);

                    StretchBlt   (theContext, iRect.left, iRect.top, iRect.right-iRect.left+1, iRect.bottom-iRect.top+1,
                                  otherDC, 0, 0, theBM.bmWidth, theBM.bmHeight, SRCPAINT);
                }

                MoveToEx (theContext,iRect.left-1,iRect.top-1,NULL);
                LineTo (theContext,iRect.right+1,iRect.top-1);
                LineTo (theContext,iRect.right+1,iRect.bottom+1);
                LineTo (theContext,iRect.left-1,iRect.bottom+1);
                LineTo (theContext,iRect.left-1,iRect.top-1);

                cRect.left +=step;
                cRect.right +=step;
            }

            SelectObject (otherDC, oDCBM);
        } else {
            _String errMsg = _String ("Failed to make CompatibleDC in _HYPlatformButtonBar::_Paint");
            ReportWarning (errMsg);
        }
    }
    SelectObject (theContext,savePen);
    SelectClipRgn (theContext,NULL);
    DeleteObject (clipRgn);

    (*theParent)._HYPlatformComponent::_Paint(p);
}
//__________________________________________________________________
_HYRect _HYPlatformButtonBar::_GetButtonRect (bool conv)
{
    _HYButtonBar* theParent = (_HYButtonBar*)this;
    _HYRect res;
    res.left   = buttonRect.left;
    res.right  = buttonRect.right;
    res.top    = buttonRect.top;
    res.bottom = buttonRect.bottom;
    if (conv) {
        POINT loc = {res.left, res.top};
        ClientToScreen (theParent->parentWindow, &loc);
        res.right += loc.x-res.left;
        res.bottom += loc.y-res.top;
        res.left   = loc.x;
        res.top    = loc.y;
    }
    return res;
}



//__________________________________________________________________
void        _HYPlatformButtonBar::_Update (Ptr p)
{
    _Paint (p);
}

//__________________________________________________________________
void        _HYPlatformButtonBar::_MarkButtonForUpdate (int i)
{
    _HYButtonBar* theParent = (_HYButtonBar*)this;
    RECT invRect;
    if ((i>=0)&&(i<theParent->ButtonCount())) {
        int hR = i%theParent->BarWidth(),
            vR = i/theParent->BarWidth(),
            step = 2*HY_BUTTONBAR_BORDER+theParent->GetButtonDim();

        invRect.left = buttonRect.left+hR*step;
        invRect.right = invRect.left+step;
        invRect.top = buttonRect.top+vR*step;
        invRect.bottom = invRect.top+step;
        if (forceUpdateForScrolling) {
            RECT    rel = HYRect2Rect (theParent->rel);
            RECT           tempRect;
            IntersectRect (&tempRect,&rel,&invRect);
            RedrawWindow (theParent->parentWindow, &tempRect, nil, RDW_UPDATENOW|RDW_NOCHILDREN);
        } else {
            InvalidateRect (theParent->parentWindow,&invRect,false);
        }
    }
}

//__________________________________________________________________
void        _HYPlatformButtonBar::_UnpushButton (void)
{
    if (pushed>=0) {
        _MarkButtonForUpdate(pushed);
        pushed = -1;
        lastMouseDown = -1;
    }
}


//__________________________________________________________________
void        _HYPlatformButtonBar::_SetDimensions (_HYRect r, _HYRect rel)
{
    _HYButtonBar* theParent = (_HYButtonBar*) this;
    theParent->_HYPlatformComponent::_SetDimensions (r,rel);
    _SetVisibleSize (rel);
}

//__________________________________________________________________
int         _HYPlatformButtonBar::_FindClickedButton (int h, int v)
{
    POINT localClick = {v,h};
    _HYButtonBar * parent = (_HYButtonBar*)this;
    if (PtInRect (&buttonRect, localClick)) {
        int v = localClick.y-buttonRect.top,
            h = localClick.x-buttonRect.left,
            step = 2*HY_BUTTONBAR_BORDER+parent->buttonDim,
            hR = h/step,
            vR = v/step;

        v-=vR*step;
        h-=hR*step;
        if ((v>HY_BUTTONBAR_BORDER)&&(v<step-HY_BUTTONBAR_BORDER)&&
                (h>HY_BUTTONBAR_BORDER)&&(h<step-HY_BUTTONBAR_BORDER)) {
            return hR+vR*parent->barW;
        }
    }
    return -1;

}

//__________________________________________________________________
void        _HYButtonBar::_DisplayToolTip      (void)
{
    //TBI
}


//__________________________________________________________________

bool _HYButtonBar::_ProcessOSEvent (Ptr vEvent)
{
    _HYWindowsUIMessage * theEvent = (_HYWindowsUIMessage *)vEvent;
    if (buttons.lLength) {
        switch (theEvent->iMsg) {
        case WM_LBUTTONDOWN: {
            POINT localClick;
            localClick.x = LOWORD (theEvent->lParam);
            localClick.y = HIWORD (theEvent->lParam);
            int h = _FindClickedButton (localClick.y,localClick.x);
            if ((h>=0)&&(enabledButtons.Find(h)>=0)) {
                if (pullDownButtons.Find (h)>=0) {
                    lastMouseDown = -1;
                    SendButtonPush(h);
                } else {
                    pushed = h;
                    lastMouseDown = h;
                    _MarkButtonForUpdate (h);
                }
            }
            return true;
        }
        case WM_LBUTTONUP: {
            if (pushed>=0) {
                POINT localClick;
                localClick.x = LOWORD (theEvent->lParam);
                localClick.y = HIWORD (theEvent->lParam);
                int h = _FindClickedButton (localClick.y,localClick.x);
                if (h==pushed) {
                    _MarkButtonForUpdate (h);
                    SendButtonPush (h);
                    pushed = -1;
                    lastMouseDown = -1;
                    _MarkButtonForUpdate (h);
                }
            }
            return true;
        }
        case WM_MOUSEMOVE : {
            if (lastMouseDown>=0) {
                POINT localClick;
                localClick.x = LOWORD (theEvent->lParam);
                localClick.y = HIWORD (theEvent->lParam);
                int h = _FindClickedButton (localClick.y,localClick.x);
                if (h!=lastMouseDown) {
                    if (pushed>=0) {
                        pushed = -1;
                        _MarkButtonForUpdate (lastMouseDown);
                    }
                } else {
                    if (pushed==-1) {
                        pushed = lastMouseDown;
                        _MarkButtonForUpdate (lastMouseDown);
                    }

                }
            }
            return true;
        }
        }
    }

    return _HYPlatformComponent::_ProcessOSEvent (vEvent);
}

//EOF
\ No newline at end of file
diff --git a/src/gui/win/Components/HYPlatformCheckBox.cpp b/src/gui/win/Components/HYPlatformCheckBox.cpp
new file mode 100644
index 0000000..6ea0128
--- /dev/null
+++ b/src/gui/win/Components/HYPlatformCheckBox.cpp
@@ -0,0 +1 @@
+/*
    Check box for Win32.

    Sergei L. Kosakovsky Pond, May 2000-December 2002
*/

#include "HYLabel.h"
#include "errorfns.h"
#include "HYPlatformWindow.h"
#include "commctrl.h"

//__________________________________________________________________

static LRESULT  CALLBACK checkBoxSubclassHandler (HWND WindowHand, UINT iMsg, WPARAM wParam, LPARAM lParam)
{
    _HYCheckbox * theParent = (_HYCheckbox*)GetWindowLongPtr (WindowHand, GWLP_USERDATA);

    /*switch (iMsg)
    {
        case WM_ERASEBKGND:
        {
            return 1;
        }
    }*/

    return CallWindowProc ((WNDPROC)theParent->mainHandler, WindowHand, iMsg, wParam, lParam);
}

//__________________________________________________________________

_HYPlatformCheckbox::_HYPlatformCheckbox (bool isR)
{
    buttonWindow = nil;
    isRadio      = isR;
    checkboxRect = (RECT) {
        0,0,100,100
    };
}

//__________________________________________________________________
_HYPlatformCheckbox::~_HYPlatformCheckbox (void)
{
}


//__________________________________________________________________

void        _HYCheckbox::_Activate (void)
{
    _HYPlatformComponent::_Activate();
}

//__________________________________________________________________

void        _HYCheckbox::_Deactivate (void)
{
    _HYPlatformComponent::_Deactivate();
}

//__________________________________________________________________

bool _HYCheckbox::_ProcessOSEvent (Ptr vEvent)
{
    _HYWindowsUIMessage * theEvent = (_HYWindowsUIMessage *)vEvent;

    switch (theEvent->iMsg) {
    case WM_COMMAND: {
        WORD       wP = HIWORD(theEvent->wParam);
        if ((wP==BN_CLICKED)||(wP==BN_DOUBLECLICKED)) {
            HWND    cbh = (HWND)theEvent->lParam;
            if ((cbh == buttonWindow)&&isEnabled) {
                //printf   ("Button Push\n");
                SetState (!checkState, true);
                return true;
            }
        }
        break;
    }
    case WM_CTLCOLORBTN: {
        if ((HWND)theEvent->lParam == buttonWindow) {
            if (settings.width&HY_COMPONENT_TRANSP_BG) {
                theEvent->res = (LRESULT)defBrush;
            } else {
                theEvent->res = (LRESULT)backFill;
            }
            return true;
        }
        break;
    }
    }
    return _HYPlatformComponent::_ProcessOSEvent (vEvent);
}


//__________________________________________________________________

_HYRect     _HYCheckbox::_SuggestDimensions (void)
{
    _HYRect res = _HYLabel::_SuggestDimensions();

    res.left += checkSpacing*2 + 13;
    res.right = res.left;

    return res;
}

//__________________________________________________________________
void        _HYPlatformCheckbox::_SetVisibleSize (_HYRect rel)
{
    _HYCheckbox * theParent = (_HYCheckbox*) this;

    theParent->labelRect.left= rel.left;
    theParent->labelRect.top = rel.top;

    _HYRect s = theParent->_SuggestDimensions();

    theParent->labelRect.right =  theParent->labelRect.left+s.right;
    theParent->labelRect.bottom = theParent->labelRect.top+s.bottom;

    AlignRectangle (rel, theParent->labelRect, theParent->GetAlignFlags());

    checkboxRect.left = theParent->labelRect.left + theParent->checkSpacing;
    checkboxRect.bottom = theParent->labelRect.bottom;

    checkboxRect.right = checkboxRect.left+13;
    checkboxRect.top = checkboxRect.bottom-13;

    theParent->labelRect.left += 13+2*theParent->checkSpacing;

    if (buttonWindow) {
        SetWindowPos (buttonWindow,nil,checkboxRect.left,checkboxRect.top,0,0,SWP_NOSIZE|SWP_NOZORDER);
    } else {
        buttonWindow = CreateWindow ("BUTTON","",WS_VISIBLE|WS_CHILD|(isRadio?BS_RADIOBUTTON:BS_CHECKBOX),checkboxRect.left,checkboxRect.right,checkboxRect.right-checkboxRect.left+1,checkboxRect.bottom-checkboxRect.top+1
                                     ,((_HYCheckbox*)this)->parentWindow,NULL,GetModuleHandle (NULL), NULL);

        checkPointer   (buttonWindow);

        _SetState (theParent->checkState);

        SetWindowLongPtr (buttonWindow,GWLP_USERDATA, (LONG_PTR)theParent);
        mainHandler = SetWindowLongPtr (buttonWindow,GWLP_WNDPROC,(LONG_PTR)checkBoxSubclassHandler);

        char          buffer[256];

        GetClassName (theParent->parentWindow, buffer, 255);
        WNDCLASS      classInfo;
        GetClassInfo (ProgramInstance, buffer, &classInfo);
        defBrush = classInfo.hbrBackground;

        /*
        SIZE           idealSize;
        Button_GetIdealSize         (buttonWindow, idealSize);
        bool           resize = false;
        long           diff = checkBox.Rect.right-checkBox.left+1-idealSize.x;

        if (diff)
        {
            resize = true;
            checkBoxRect.left  -=diff/2;
            checkBoxRect.right -= (diff-diff/2);
        }

        diff = checkBox.Rect.bottom-checkBox.top+1-idealSize.y;

        if (diff)
        {
            resize = true;
            checkBoxRect.top    -= diff/2;
            checkBoxRect.bottom -= (diff-diff/2);
        }

        if (resize)
            SetWindowPos (buttonWindow,NULL,checkboxRect.left,checkboxRect.right,checkboxRect.right-checkboxRect.left+1,checkboxRect.bottom-checkboxRect.top+1,SWP_NOZORDER|SWP_NOMOVE);
        */
    }
}

//__________________________________________________________________

void        _HYPlatformCheckbox::_Enable (bool e)
{
    if (buttonWindow) {
        EnableWindow (buttonWindow, e);
    }
}

//__________________________________________________________________
void        _HYPlatformCheckbox::_Update (Ptr p)
{
    _Paint (p);
}

//__________________________________________________________________
void        _HYPlatformCheckbox::_Paint (Ptr p)
{
    _HYCheckbox *theParent = (_HYCheckbox*) this;
    if (buttonWindow) {
        UpdateWindow (buttonWindow);
    }
    theParent->_HYPlatformLabel::_Paint(p);
}


//__________________________________________________________________
void    _HYPlatformCheckbox::_SetState (bool v)
{
    if (buttonWindow) {
        SendMessage (buttonWindow, BM_SETCHECK, v?BST_CHECKED:BST_UNCHECKED,0);
    }
}


//EOF
\ No newline at end of file
diff --git a/src/gui/win/Components/HYPlatformLabel.cpp b/src/gui/win/Components/HYPlatformLabel.cpp
new file mode 100644
index 0000000..f1b2634
--- /dev/null
+++ b/src/gui/win/Components/HYPlatformLabel.cpp
@@ -0,0 +1 @@
+/*
    Button component for Win32.

    Sergei L. Kosakovsky Pond, May 2000 - December 2002
*/

#include "HYLabel.h"
#include "HYUtils.h"
#include "HYGraphicPane.h"

//__________________________________________________________________

_HYPlatformLabel::_HYPlatformLabel(void)
{

    backFill = CreateSolidBrush(RGB(0xff,0xff,0xff));
    if (!backFill) {
        warnError (-108);
    }
    fc = 0;
    pLabelFont = nil;
    labelPen = nil;
}

//__________________________________________________________________

_HYPlatformLabel::~_HYPlatformLabel(void)
{
    if (backFill) {
        DeleteObject (backFill);
    }

    if (pLabelFont) {
        DeleteObject (pLabelFont);
    }

    if (labelPen) {
        DeleteObject (labelPen);
    }

}

//__________________________________________________________________

void        _HYPlatformLabel::_SetBackColor (_HYColor& c)
{
    if (backFill) {
        DeleteObject(backFill);
    }

    backFill = CreateSolidBrush(RGB(c.R,c.G,c.B));
}

//__________________________________________________________________

void        _HYPlatformLabel::_SetText (void)
{
}


//__________________________________________________________________

void        _HYPlatformLabel::_SetForeColor (_HYColor& c)
{
    HDC  theDC = GetDC(((_HYLabel*)this)->parentWindow);
    fc = HYColor2ColorRef (c,theDC);
    ReleaseDC (((_HYLabel*)this)->parentWindow, theDC);
    if (labelPen) {
        DeleteObject(labelPen);
    }
    labelPen = (HPEN)CreatePen (PS_SOLID,1,fc);
}

//__________________________________________________________________

void        _HYPlatformLabel::_SetFont (_HYFont& f)
{
    if (pLabelFont) {
        DeleteObject(pLabelFont);
    }
    pLabelFont = CreateFont (f.size,0,0,0,(f.style&HY_FONT_BOLD)?FW_BOLD:FW_NORMAL,f.style&HY_FONT_ITALIC,FALSE,FALSE,ANSI_CHARSET,OUT_DEFAULT_PRECIS,
                             CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH|FF_DONTCARE,f.face.sData);
}

//__________________________________________________________________
void        _HYPlatformLabel::_Update (Ptr p)
{
    _Paint (p);
}

//__________________________________________________________________
void        _HYPlatformLabel::_SetDimensions (_HYRect r, _HYRect rel)
{
    _HYLabel* theParent = (_HYLabel*) this;
    theParent->_HYPlatformComponent::_SetDimensions (r,rel);
    _SetVisibleSize (rel);
}

//__________________________________________________________________
void        _HYPlatformLabel::_SetVisibleSize (_HYRect rel)
{
    _HYLabel* theParent = (_HYLabel*) this;
    labelRect.left=rel.left;
    labelRect.top = rel.top;
    _HYRect s = theParent->_SuggestDimensions();
    labelRect.right = labelRect.left+s.right;
    labelRect.bottom = labelRect.top+s.bottom;
    AlignRectangle (rel, labelRect, theParent->GetAlignFlags());
}



//__________________________________________________________________
void        _HYPlatformLabel::_Paint (Ptr p)
{

    _HYLabel * theParent = (_HYLabel*)this;

    _HYRect * relRect = (_HYRect*)p;
    HDC     theContext = (HDC)relRect->width;
    RECT    cRect;
    cRect.left = relRect->left;
    cRect.right = relRect->right;
    cRect.top = relRect->top;
    cRect.bottom = relRect->bottom;

    if (!(theParent->settings.width&HY_COMPONENT_TRANSP_BG)) {
        FillRect (theContext,&cRect,backFill);
    }

    if (!(theParent->settings.width&HY_COMPONENT_WELL)) {
        InflateRect (&cRect,-2,-2);
    }

    HPEN     savePen = (HPEN)SelectObject (theContext,labelPen);
    HFONT    saveFont = (HFONT)SelectObject (theContext,pLabelFont);
    COLORREF saveColor = GetTextColor (theContext);
    SetBkMode (theContext,TRANSPARENT);
    SetTextAlign (theContext,TA_BASELINE);
    if (theParent->HasShadow()) {
        _HYColor fcc = theParent->GetForeColor(),sc;
        sc.R = fcc.R/4;
        sc.B  = fcc.B/4;
        sc.G = fcc.G/4;
        SetTextColor (theContext,HYColor2ColorRef(sc,theContext));
        ExtTextOut(theContext,labelRect.left+3,labelRect.bottom-3,ETO_CLIPPED,&cRect,theParent->GetText().sData,theParent->GetText().sLength,NULL);
        sc.R = fcc.R/2;
        sc.B  = fcc.B/2;
        sc.G = fcc.G/2;
        SetTextColor (theContext,HYColor2ColorRef(sc,theContext));
        ExtTextOut(theContext,labelRect.left+1,labelRect.bottom-1,ETO_CLIPPED,&cRect,theParent->GetText().sData,theParent->GetText().sLength,NULL);

    }
    SetTextColor (theContext,fc);
    ExtTextOut(theContext,labelRect.left+2,labelRect.bottom-2,ETO_CLIPPED,&cRect,theParent->GetText().sData,theParent->GetText().sLength,NULL);
    SelectObject (theContext,savePen);
    SelectObject (theContext,saveFont);
    SetTextColor (theContext,saveColor);

    (*theParent)._HYPlatformComponent::_Paint(p);
}

//__________________________________________________________________
_HYRect _HYLabel::_SuggestDimensions (void)
{
    _HYRect res = {10,100,10,100,HY_COMPONENT_NO_SCROLL};
    HFONT lF, cF;
    lF = CreateFont (labelFont.size,0,0,0,(labelFont.style&HY_FONT_BOLD)?FW_BOLD:FW_NORMAL,labelFont.style&HY_FONT_ITALIC,FALSE,FALSE,ANSI_CHARSET,OUT_DEFAULT_PRECIS,
                     CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH|FF_DONTCARE,labelFont.face.sData);
    HDC  parentDC = GetDC (parentWindow);
    cF = (HFONT)SelectObject (parentDC,lF);
    SIZE textSize;
    if(GetTextExtentPoint32(parentDC,labelText.sData,labelText.sLength,&textSize)) {
        res.left = res.right = textSize.cx+5;
    }
    if (cF) {
        SelectObject (parentDC,cF);
    }
    DeleteObject(lF);
    ReleaseDC (parentWindow, parentDC);
    return res;
}


// EOF
\ No newline at end of file
diff --git a/src/gui/win/Components/HYPlatformPullDown.cpp b/src/gui/win/Components/HYPlatformPullDown.cpp
new file mode 100644
index 0000000..6f5a3ab
--- /dev/null
+++ b/src/gui/win/Components/HYPlatformPullDown.cpp
@@ -0,0 +1 @@
+/*
    Button component for Win 32.

    Sergei L. Kosakovsky Pond, May 2000-December 2002.
*/

#include "HYLabel.h"
#include "HYPullDown.h"
#include "errorfns.h"
#include "HYPlatformWindow.h"
#include "HYEventTypes.h"


//__________________________________________________________________

static LRESULT  CALLBACK pullDownSubclassHandler (HWND WindowHand, UINT iMsg, WPARAM wParam, LPARAM lParam)
{
    _HYPullDown * theParent = (_HYPullDown*)GetWindowLongPtr (WindowHand, GWLP_USERDATA);

    switch (iMsg) {
    case WM_LBUTTONDOWN:
    case WM_LBUTTONDBLCLK: {
        if (theParent->IsEnabled()) {

            POINT loc = {theParent->menuRect.left, theParent->menuRect.top};
            ClientToScreen (theParent->parentWindow, &loc);

            if (theParent->messageRecipient) {
                theParent->messageRecipient->ProcessEvent (generateMenuOpenEvent (theParent->GetID()));
            }

            SetMenuDefaultItem (theParent->theMenu, theParent->selection, true);

            long tSel = TrackPopupMenu (theParent->theMenu, TPM_LEFTALIGN|TPM_TOPALIGN|TPM_RETURNCMD|TPM_LEFTBUTTON|TPM_NONOTIFY,
                                        loc.x,
                                        loc.y,
                                        0, theParent->parentWindow, NULL);
            if (tSel) {
                theParent->selection = tSel-1;
                theParent->SendSelectionChange();
                theParent->_RefreshComboBox();
            }
        }
        return 0L;
    }
    }

    return CallWindowProc ((WNDPROC)theParent->mainHandler, WindowHand, iMsg, wParam, lParam);
}

//__________________________________________________________________

_HYPlatformPullDown::_HYPlatformPullDown(void)
{
    myMenu   = CreateWindow ("COMBOBOX","",CBS_DROPDOWNLIST|WS_CHILD,0,0,100,25,((_HYPullDown*)this)->parentWindow,NULL,GetModuleHandle (NULL), NULL);
    backFill = CreateSolidBrush(RGB(0xff,0xff,0xff));
    theMenu  = CreatePopupMenu ();

    if ((!backFill)||(!myMenu)||(!theMenu)) {
        warnError (-108);
    }
    selection      = 0;
    cbSelection    = -1;
    menuWidth      = 100;

    SetWindowLongPtr (myMenu,GWLP_USERDATA, (LONG_PTR)((_HYPullDown*)this));

    mainHandler = SetWindowLongPtr (myMenu,GWLP_WNDPROC,(LONG_PTR)pullDownSubclassHandler);
}


//__________________________________________________________________

_HYPlatformPullDown::~_HYPlatformPullDown(void)
{
    if (backFill) {
        DeleteObject (backFill);
    }
    if (theMenu) {
        DestroyMenu (theMenu);
    }
}

//__________________________________________________________________
void        _HYPlatformPullDown::_AdjustItemIDs  (long from, long to, long shift)
{
    MENUITEMINFO     newItem;
    newItem.cbSize = sizeof (MENUITEMINFO);
    newItem.fMask  = MIIM_ID;
    for (long k=from; k<to; k++) {
        GetMenuItemInfo (theMenu, k, true, &newItem);
        newItem.wID += shift;
        SetMenuItemInfo (theMenu, k, true, &newItem);
    }
}

//__________________________________________________________________
void        _HYPlatformPullDown::_RefreshComboBox  ()
{
    _HYPullDown * theParent = (_HYPullDown*)this;

    if (myMenu&&((cbSelection!=selection)||(!theParent->IsEnabled()))) {

        if (SendMessage (myMenu, CB_GETCOUNT, 0, 0)) {
            SendMessage (myMenu, CB_DELETESTRING, 0, 0);
        }

        if (theParent->MenuItemCount()) {
            if (selection<theParent->MenuItemCount()) {
                _String * mItem = theParent->GetMenuItem (selection);

                if (mItem->Equal(&menuSeparator)) {
                    mItem = ∅
                }

                SendMessage (myMenu, CB_ADDSTRING, 0, (LPARAM)theParent->GetMenuItem (selection)->sData);
                SendMessage (myMenu, CB_SETCURSEL, 0, 0);
                cbSelection = selection;
            }
        }
    }
}

//__________________________________________________________________
void        _HYPlatformPullDown::_AddMenuItem   (_String& newItemText, long index)
{
    _String      newString (newItemText);

    if (!myMenu) {
        return;
    }

    MENUITEMINFO     newItem = {sizeof (MENUITEMINFO),0,0,0,0,nil,nil,nil,nil,0,nil};

    _HYPullDown * theParent = (_HYPullDown*)this;

    if (index<0) {
        index = theParent->MenuItemCount()-1;
    }

    if (newString == menuSeparator) {
        newItem.fMask = MIIM_TYPE;
        newItem.fType = MFT_SEPARATOR;
    } else {
        newItem.fMask = MIIM_TYPE;
        newItem.fType = MFT_STRING;

        if (newString.sData[0] == '(') {
            newString.Trim (1,-1);
            newItem.fState = MFS_GRAYED;
        }

        newItem.dwTypeData = newString.sData;


        SIZE textSize;
        HDC  theDC = GetDC(myMenu);
        if(GetTextExtentPoint32(theDC,newString.sData,newString.sLength,&textSize)) {
            if (textSize.cx+25>menuWidth) {
                menuWidth = textSize.cx+25;
            }
        }
        ReleaseDC (myMenu, theDC);
    }

    newItem.fMask |= MIIM_ID|MIIM_STATE|MIIM_CHECKMARKS;
    newItem.wID = index;

    InsertMenuItem (theMenu, index, true, &newItem);
    _AdjustItemIDs (index, theParent->MenuItemCount(),1);

    if ((theParent->MenuItemCount()==1)||(selection==index)) {
        cbSelection = -1;
        _RefreshComboBox();
    }
}

//__________________________________________________________________
void        _HYPlatformPullDown::_SetMenuItem   (_String& newItem, long index)
{
    if (!myMenu) {
        return;
    }

    if (index==selection) {
        cbSelection = -1;
        _RefreshComboBox();
    }

    _DeleteMenuItem (index);
    _AddMenuItem (newItem, index);
}

//__________________________________________________________________
void        _HYPlatformPullDown::_MarkItem      (long index, char mark)
{
    if (!myMenu) {
        return;
    }

    /*MENUITEMINFO     newItem;
    newItem.cbSize = sizeof (MENUITEMINFO);
    newItem.fMask  = MIIM_STATE|MIIM_TYPE;
    GetMenuItemInfo (theMenu, index, true, &newItem);
    bool set = false;
    if (mark)
    {
        if (!(newItem.fState & MFS_CHECKED))
        {
            newItem.fState |= MFS_CHECKED;
            if (mark==HY_PULLDOWN_BULLET_MARK)
                newItem.fType  |= MFT_RADIOCHECK;
            else
                if (newItem.fType & MFT_RADIOCHECK)
                    newItem.fType  -= MFT_RADIOCHECK;
            set = true;
        }
    }
    else
        if (newItem.fState  & MFS_CHECKED)
        {
            newItem.fState -= MFS_CHECKED;
            if (newItem.fType & MFT_RADIOCHECK)
                newItem.fType  -= MFT_RADIOCHECK;
            set = true;
        }

    if (set)
        SetMenuItemInfo (theMenu, index, true, &newItem);*/
    if (mark==HY_PULLDOWN_BULLET_MARK) {
        CheckMenuRadioItem (theMenu, index, index, index, MF_BYPOSITION);
    } else {
        CheckMenuItem (theMenu, index, MF_BYPOSITION|(mark?MF_CHECKED:MF_UNCHECKED));
    }
}

//__________________________________________________________________
char        _HYPlatformPullDown::_ItemMark      (long index)
{
    if (!myMenu) {
        return 0;
    }

    MENUITEMINFO     newItem;
    newItem.cbSize = sizeof (MENUITEMINFO);
    newItem.fMask  = MIIM_STATE|MIIM_TYPE;
    GetMenuItemInfo (theMenu, index, true, &newItem);
    if (newItem.fState & MFS_CHECKED) {
        return (newItem.fType&MFT_RADIOCHECK)?HY_PULLDOWN_BULLET_MARK:HY_PULLDOWN_CHECK_MARK;
    }

    return HY_PULLDOWN_NO_MARK;
}

//__________________________________________________________________
void        _HYPlatformPullDown::_DeleteMenuItem  (long index)
{
    if (!myMenu) {
        return;
    }

    _HYPullDown * theParent = (_HYPullDown*)this;
    DeleteMenu (theMenu, index, MF_BYPOSITION);


    _AdjustItemIDs (index, theParent->MenuItemCount(),-1);
    if (selection == index) {
        cbSelection = -1;
        _RefreshComboBox ();
    }
}

//__________________________________________________________________

void        _HYPlatformPullDown::_SetBackColor (_HYColor& c)
{
    if (backFill) {
        DeleteObject(backFill);
    }

    backFill = CreateSolidBrush(RGB(c.R,c.G,c.B));
}

//__________________________________________________________________
long        _HYPlatformPullDown::_GetSelection (void)
{
    return selection;
}

//__________________________________________________________________
void        _HYPlatformPullDown::_Duplicate (Ptr p)
{
    // unused
}

//__________________________________________________________________
void        _HYPlatformPullDown::_Update (Ptr p)
{
    _Paint (p);
}

//__________________________________________________________________
void        _HYPlatformPullDown::_SetDimensions (_HYRect r, _HYRect rel)
{
    _HYPullDown* theParent = (_HYPullDown*) this;
    theParent->_HYPlatformComponent::_SetDimensions (r,rel);
    _SetVisibleSize (rel);
}

//__________________________________________________________________
void        _HYPlatformPullDown::_SetVisibleSize (_HYRect rel)
{
    _HYPullDown* theParent = (_HYPullDown*) this;
    menuRect.left = rel.left+3;
    menuRect.bottom = rel.bottom;
    menuRect.right= rel.right-3;
    menuRect.top = rel.top;
    if (myMenu) {
        if (menuRect.bottom-menuRect.top>25) {
            menuRect.bottom = menuRect.top+25;
        }

        if (menuRect.right-menuRect.left>menuWidth) {
            menuRect.right = menuRect.left+menuWidth;
        }
    }

    AlignRectangle (rel, menuRect, theParent->GetAlignFlags());
    SetWindowPos (myMenu,NULL,menuRect.left,menuRect.top,menuRect.right-menuRect.left+1,(menuRect.bottom-menuRect.top),SWP_NOZORDER);
    SendMessage (myMenu,CB_SETCURSEL,selection,0L);

    //if (theParent->IsEnabled())
    ShowWindow(myMenu,SW_SHOW);
}
//__________________________________________________________________
void        _HYPlatformPullDown::_EnableItem (long index, bool toggle)
{
    EnableMenuItem (theMenu, index, MF_BYPOSITION|(toggle?MF_ENABLED:(MF_GRAYED|MF_DISABLED)));
}

//__________________________________________________________________
void        _HYPlatformPullDown::_Paint (Ptr p)
{
    _HYPullDown * theParent = (_HYPullDown*)this;
    _HYRect * relRect = (_HYRect*)p;
    _RefreshComboBox();
    if (!(theParent->settings.width&HY_COMPONENT_TRANSP_BG)) {
        RECT    cRect;
        cRect.left = relRect->left;
        cRect.right = relRect->right;
        cRect.top = relRect->top;
        cRect.bottom = relRect->bottom;
        HDC     theContext = (HDC)relRect->width;
        FillRect (theContext,&cRect,backFill);
    }
    UpdateWindow (myMenu);
    theParent->_HYPlatformComponent::_Paint(p);
}

//__________________________________________________________________
void        _HYPlatformPullDown::_EnableMenu     (bool flag)
{
    if (myMenu) {
        EnableWindow (myMenu, flag);
    }
}

//__________________________________________________________________
_HYRect _HYPullDown::_SuggestDimensions (void)
{
    _HYRect res = {25,100,25,100,HY_COMPONENT_NO_SCROLL};
    if (myMenu) {
        res.right = menuWidth;
    }

    return res;
}

//__________________________________________________________________

void    _HYPullDown::_SetMenuItemTextStyle (long ID, char style)
{
    //if (myMenu)
    //SetItemStyle (myMenu,ID+1,style);

    // TBI
}

//__________________________________________________________________

bool _HYPullDown::_ProcessOSEvent (Ptr vEvent)
{
    /*_HYWindowsUIMessage * theEvent = (_HYWindowsUIMessage *)vEvent;

    switch (theEvent->iMsg)
    {
        case WM_CTLCOLORLISTBOX:
        {
            if ((HWND)theEvent->lParam == myMenu)
            {
                SetTextColor ((HDC)theEvent->wParam,GetSysColor (COLOR_GRAYTEXT));
                return true;
            }
            break;
        }
    }*/
    return _HYPlatformComponent::_ProcessOSEvent (vEvent);
}



//EOF
\ No newline at end of file
diff --git a/src/gui/win/Components/HYPlatformSequencePane.cpp b/src/gui/win/Components/HYPlatformSequencePane.cpp
new file mode 100644
index 0000000..6ebad73
--- /dev/null
+++ b/src/gui/win/Components/HYPlatformSequencePane.cpp
@@ -0,0 +1,249 @@
+/*
+    Sequence Panel for Win32 API
+
+    Sergei L. Kosakovsky Pond, May 2000-January 2003
+*/
+
+#include "errorfns.h"
+#include "HYSequencePanel.h"
+#include "HYUtils.h"
+#include "HYEventTypes.h"
+#include "HYPlatformWindow.h"
+#include "HYTableWindow.h"
+
+
+//__________________________________________________________________
+
+void    _HYSequencePane::_Paint (Ptr p)
+{
+    long        saveBorder = settings.width & HY_COMPONENT_BORDER;
+    settings.width -= saveBorder;
+    _HYPlatformComponent::_Paint(p);
+    settings.width += saveBorder;
+    _HYRect*    destR = (_HYRect*)p;
+
+    RECT        srcRect,
+                destRect;
+
+    HDC pDC = (HDC)destR->width;
+
+    destRect.right      = destR->right;
+    destRect.bottom     = destR->bottom;
+    if (HasHScroll()) {
+        destRect.bottom-= HY_SCROLLER_WIDTH;
+    }
+
+    if (HasVScroll()) {
+        destRect.right -= HY_SCROLLER_WIDTH;
+    }
+
+    destRect.left       = destR->left;
+    destRect.top        = destR->top;
+    _HYRect srcR        = _VisibleContents (p);
+    srcRect.right       = srcR.right-srcR.left;
+    srcRect.left        = 0;
+    srcRect.bottom      = srcR.bottom-srcR.top;
+    srcRect.top         = 0;
+
+    BitBlt (pDC,destRect.left,destRect.top,srcRect.right-srcRect.left,srcRect.bottom-srcRect.top,
+            thePane,srcRect.left,srcRect.top,SRCCOPY);
+}
+
+//__________________________________________________________________
+
+bool _HYSequencePane::_ProcessOSEvent (Ptr vEvent)
+{
+    static  bool    amScrolling = false,
+                    vertical;
+
+    static  POINT   localPt;
+
+    static  long    originalStart,
+            originalSpan,
+            lastClick,
+            firstClick;
+
+    if (_HYPlatformComponent::_ProcessOSEvent (vEvent)) {
+        return true;
+    }
+    if (!active) {
+        return false;
+    }
+
+    short lastH, lastV;
+    POINT globalPt;
+
+    _HYWindowsUIMessage*    theEvent = (_HYWindowsUIMessage*)vEvent;
+
+    switch (theEvent->iMsg) {
+    case WM_RBUTTONDOWN:
+    case WM_LBUTTONDOWN:
+    case WM_LBUTTONDBLCLK:
+        {
+
+            lastH = (short)LOWORD (theEvent->lParam),
+            lastV = (short)HIWORD (theEvent->lParam);
+
+            globalPt = (POINT) {
+                lastH, lastV
+            };
+
+            localPt  = (POINT) {
+                lastH - rel.left , lastV - rel.top
+            };
+
+            vertical = (localPt.x<headerWidth)&&(localPt.y>=(GetSlotHeight()+1));
+
+
+            if ((theEvent->iMsg == WM_LBUTTONDOWN)||(theEvent->iMsg == WM_LBUTTONDBLCLK)) {
+                forceUpdateForScrolling = true;
+                if (vertical)
+                    ProcessVSelectionChange (localPt.x,localPt.y,GetAsyncKeyState (VK_SHIFT) & 0x8000,
+                                             GetAsyncKeyState (VK_CONTROL) & 0x8000, false, theEvent->iMsg == WM_LBUTTONDBLCLK);
+                else
+                    ProcessSelectionChange  (localPt.x,localPt.y,GetAsyncKeyState (VK_SHIFT) & 0x8000,
+                                             GetAsyncKeyState (VK_CONTROL) & 0x8000);
+                forceUpdateForScrolling = false;
+
+                ClientToScreen (parentWindow, &globalPt);
+
+                if (DragDetect (parentWindow, globalPt)) {
+                    if (messageRecipient) {
+                        SetCapture (parentWindow);
+                        ((_HYTWindow*)messageRecipient)->trackMouseComponent = this;
+                    }
+                    amScrolling = true;
+                    if (vertical) {
+                        originalStart = startRow,
+                        originalSpan  = endRow-startRow;
+                        lastClick = -2;
+                        firstClick = (localPt.y-(GetSlotHeight()+1))/GetSlotHeight();
+                    }
+                }
+
+                return true;
+            }
+
+            if ((theEvent->iMsg == WM_RBUTTONDOWN)&&(vertical&&vselection.lLength)||((!vertical)&&selection.lLength)) {
+                ClientToScreen (parentWindow, &globalPt);
+                ProcessContextualPopUp (globalPt.x, globalPt.y);
+                return true;
+            }
+        }
+        break;
+
+    case WM_LBUTTONUP:
+        if (amScrolling) {
+            amScrolling = false;
+            if (messageRecipient) {
+                ReleaseCapture ();
+                ((_HYTWindow*)messageRecipient)->trackMouseComponent = nil;
+            }
+            if  (vertical) {
+                RECT invalRect = {rel.left,rel.top+(GetSlotHeight()+1)+1,rel.left+headerWidth,rel.bottom-HY_SCROLLER_WIDTH};
+                InvalidateRect (parentWindow,&invalRect,false);
+                if ((localPt.x<headerWidth)&&(localPt.x>0)&&(lastClick>-2)) {
+                    MoveSpecies (firstClick+originalStart,lastClick+startRow);
+                }
+            }
+        }
+        return true;
+        break;
+
+    case WM_MOUSEMOVE:
+        if ((theEvent->wParam & MK_LBUTTON)&&(amScrolling)) {
+            POINT mousePt = {((short)LOWORD (theEvent->lParam))-rel.left,
+                             ((short)HIWORD (theEvent->lParam))-rel.top
+                            };
+            if (vertical) {
+
+                long  wHeight = rel.bottom-rel.top-HY_SCROLLER_WIDTH,
+                      slotHeight = GetSlotHeight();
+
+
+                forceUpdateForScrolling = true;
+                if ((mousePt.y<(GetSlotHeight()+1))||(localPt.y!=mousePt.y)||(mousePt.y>wHeight)) {
+                    localPt = mousePt;
+                    if (mousePt.y>wHeight) {
+                        // scroll down
+                        if ((endRow<=speciesIndex.lLength)&&(vselection.lData[0]!=speciesIndex.lLength-1)) {
+                            if (endRow-startRow<originalSpan) {
+                                break;
+                            }
+                            startRow++;
+                            endRow++;
+                            _SetVScrollerPos(((double)MAX_CONTROL_VALUE*startRow)/
+                                             (speciesIndex.lLength-endRow+startRow+1));
+                            BuildPane();
+                            _MarkForUpdate();
+                            lastClick = -2;
+                        }
+                        break;
+                    } else {
+                        mousePt.y-=(GetSlotHeight()+1);
+                        if (mousePt.y<=slotHeight) {
+                            if (mousePt.y>=0) {
+                                if (mousePt.y<slotHeight/2) {
+                                    mousePt.y = -1;
+                                } else {
+                                    mousePt.y = 0;
+                                }
+                            } else {
+                                // scroll up
+                                if (startRow>0) {
+                                    startRow--;
+                                    endRow--;
+                                    _SetVScrollerPos(((double)MAX_CONTROL_VALUE*startRow)/(speciesIndex.lLength-endRow+startRow+1));
+                                    BuildPane();
+                                    _MarkForUpdate();
+                                    lastClick = -2;
+                                }
+                                break;
+                            }
+                        } else {
+                            mousePt.y=(mousePt.y-(GetSlotHeight()+1))/slotHeight;
+                        }
+                    }
+
+                    if ((mousePt.y<-1)||(mousePt.y>=(endRow-startRow))) {
+                        break;
+                    }
+                    if (mousePt.y!=lastClick) {
+                        HDC winDC    = GetDC   (parentWindow);
+                        int saveROP2 = GetROP2 (winDC);
+                        SetROP2 (winDC,R2_NOT);
+                        if (lastClick>=-1) {
+                            lastClick = (GetSlotHeight()+1)+slotHeight*(lastClick+1)+rel.top+1;
+                            MoveToEx(winDC,rel.left+1,lastClick,nil);
+                            LineTo  (winDC,rel.left+headerWidth-1,lastClick);
+                        }
+                        lastClick = mousePt.y;
+                        if (lastClick+startRow!=firstClick+originalStart) {
+                            mousePt.y = (GetSlotHeight()+1)+slotHeight*(lastClick+1)+rel.top+1;
+                            MoveToEx (winDC,rel.left+1,mousePt.y,nil);
+                            LineTo   (winDC,rel.left+headerWidth-1,mousePt.y);
+                        }
+                        SetROP2 (winDC,saveROP2);
+                        ReleaseDC (parentWindow,winDC);
+                    }
+                }
+                forceUpdateForScrolling = false;
+                return true;
+            } else {
+                if (((mousePt.x<headerWidth)&&(startColumn>0))||(localPt.x!=mousePt.x)||(mousePt.x>_HYCanvas::GetMaxW()-5)) {
+                    forceUpdateForScrolling = true;
+                    ProcessSelectionChange (mousePt.x,mousePt.y,true,true,true);
+                    forceUpdateForScrolling = false;
+                    localPt = mousePt;
+                }
+                return true;
+            }
+        }
+        break;
+    }
+
+    return false;
+}
+
+
+//EOF
\ No newline at end of file
diff --git a/src/gui/win/Components/HYPlatformTable.cpp b/src/gui/win/Components/HYPlatformTable.cpp
new file mode 100644
index 0000000..a18b175
--- /dev/null
+++ b/src/gui/win/Components/HYPlatformTable.cpp
@@ -0,0 +1,1771 @@
+/*
+    Table component for Mac OS API
+
+    Sergei L. Kosakovsky Pond, May 2000-December 2002
+*/
+
+#include "errorfns.h"
+#include "HYTableComponent.h"
+#include "HYUtils.h"
+#include "HYEventTypes.h"
+#include "HYWindow.h"
+#include "HYGraphicPane.h"
+#include "HYTextBox.h"
+#include "HYTableWindow.h"
+#include "HYDialogs.h"
+
+//__________________________________________________________________
+
+BOOL CALLBACK                   PrintDialogProc(HWND, UINT, WPARAM, LPARAM);
+BOOL CALLBACK                   AbortProc(HDC, int);
+HDC                             GetPrinterDeviceContext(HWND);
+
+extern  BOOL                    UserAbortFlag;
+extern  HWND                    PrintDialogHandle;
+
+
+extern  HCURSOR                 hSizeCursor,
+        pickUpCursor,
+        dropOffCursor;
+
+HPEN    menuLine1               = CreatePen (PS_SOLID,1,RGB(0xA0,0xA0,0xA0)),
+        menuLine2                = CreatePen (PS_SOLID,1,RGB(0x04,0x04,0x04));
+
+HBRUSH  _BLACKBRUSH_            = CreateSolidBrush (RGB(0,0,0));
+
+extern  HBITMAP                 tablePDMenuIcon;
+
+
+//__________________________________________________________________
+
+static LRESULT  CALLBACK tableEditSubclassHandler (HWND WindowHand, UINT iMsg, WPARAM wParam, LPARAM lParam)
+{
+    _HYTable * theParent = (_HYTable*)GetWindowLongPtr (WindowHand, GWLP_USERDATA);
+
+    switch (iMsg) {
+    case WM_CHAR: {
+        int     keyCode = wParam;
+        if (keyCode==VK_RETURN) {
+            theParent->EditBoxHandler (-1,theParent->rel);
+            return true;
+        } else if (keyCode==VK_TAB) {
+            SendMessage (theParent->parentWindow, WM_CHAR, wParam, lParam);
+            return true;
+        }
+
+        break;
+    }
+    }
+
+    return CallWindowProc ((WNDPROC)theParent->defautlTextHandler, WindowHand, iMsg, wParam, lParam);
+}
+
+
+//__________________________________________________________________
+
+_HYPlatformTable::_HYPlatformTable(void)
+{
+    backPattern  = nil;
+    backPattern2 = nil;
+    cursorState  = false;
+    editBox      = nil;
+    tableFont    = nil;
+    activeColumn = -1;
+    activeColumn2= -1;
+}
+
+//__________________________________________________________________
+
+_HYPlatformTable::~_HYPlatformTable(void)
+{
+    if (backPattern) {
+        DeleteObject (backPattern);
+    }
+    if (backPattern2) {
+        DeleteObject (backPattern2);
+    }
+    if (tableFont) {
+        DeleteObject (tableFont);
+    }
+    if (tableFontB) {
+        DeleteObject (tableFontB);
+    }
+    if (tableFontI) {
+        DeleteObject (tableFontI);
+    }
+    if (tableFontBI) {
+        DeleteObject (tableFontBI);
+    }
+}
+
+//__________________________________________________________________
+
+void        _HYPlatformTable::_SetFont (void)
+{
+    _HYTable* parent = (_HYTable*)this;
+
+    if (tableFont) {
+        DeleteObject (tableFont);
+    }
+    if (tableFontB) {
+        DeleteObject (tableFontB);
+    }
+    if (tableFontI) {
+        DeleteObject (tableFontI);
+    }
+    if (tableFontBI) {
+        DeleteObject (tableFontBI);
+    }
+
+    tableFont = CreateFont (parent->textFont.size,0,0,0,FW_NORMAL,FALSE,FALSE,FALSE,ANSI_CHARSET,OUT_DEFAULT_PRECIS,
+                            CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH|FF_DONTCARE,parent->textFont.face.sData);
+
+    checkPointer (tableFont);
+
+    tableFontB = CreateFont (parent->textFont.size,0,0,0,FW_BOLD,FALSE,FALSE,FALSE,ANSI_CHARSET,OUT_DEFAULT_PRECIS,
+                             CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH|FF_DONTCARE,parent->textFont.face.sData);
+
+    checkPointer (tableFontB);
+
+    tableFontI = CreateFont (parent->textFont.size,0,0,0,FW_NORMAL,TRUE,FALSE,FALSE,ANSI_CHARSET,OUT_DEFAULT_PRECIS,
+                             CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH|FF_DONTCARE,parent->textFont.face.sData);
+
+    checkPointer (tableFontI);
+
+    tableFontBI = CreateFont (parent->textFont.size,0,0,0,FW_BOLD,true,FALSE,FALSE,ANSI_CHARSET,OUT_DEFAULT_PRECIS,
+                              CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH|FF_DONTCARE,parent->textFont.face.sData);
+
+    checkPointer (tableFontBI);
+}
+
+//__________________________________________________________________
+void        _HYTable::_HScrollTable (long h)
+{
+    if (h) {
+        long        vsShift = ((settings.width&HY_COMPONENT_H_SCROLL)?HY_SCROLLER_WIDTH:0),
+                    hsShift = ((settings.width&HY_COMPONENT_V_SCROLL)?HY_SCROLLER_WIDTH:0);
+
+        EditBoxHandler  (-1,rel);
+
+        _HYRect         paintRect = rel;
+        paintRect.width = (long)GetDC (parentWindow);
+
+        if (abs(h)>(rel.right-rel.left)/2) {
+            _Paint((Ptr)&paintRect);
+        } else {
+            RECT            scrollRect;
+            scrollRect.top = rel.top;
+            scrollRect.bottom = rel.bottom-vsShift;
+            scrollRect.right = rel.right-hsShift;
+            scrollRect.left  = rel.left;
+            paintRect.top = scrollRect.top;
+            paintRect.bottom = rel.bottom;
+            if (h>0) {
+                ScrollWindowEx (parentWindow, -h, 0, &scrollRect, &scrollRect, nil, nil, 0); //?
+                paintRect.right = scrollRect.right+hsShift;
+                paintRect.left = scrollRect.right-h;
+                hOrigin+=paintRect.left-rel.left;
+                Paint((Ptr)&paintRect);
+                hOrigin-=paintRect.left-rel.left;
+            } else {
+                ScrollWindowEx (parentWindow, -h, 0, &scrollRect, &scrollRect, nil, nil, 0); //?
+                paintRect.left = scrollRect.left;
+                paintRect.right = paintRect.left-h+hsShift;
+                Paint((Ptr)&paintRect);
+            }
+        }
+
+        ReleaseDC (parentWindow, (HDC)paintRect.width);
+    }
+}
+
+//__________________________________________________________________
+void        _HYTable::_VScrollTable (long v)
+{
+    if (v) {
+        long        vsShift = ((settings.width&HY_COMPONENT_H_SCROLL)?HY_SCROLLER_WIDTH:0),
+                    hsShift = ((settings.width&HY_COMPONENT_V_SCROLL)?HY_SCROLLER_WIDTH:0);
+
+        EditBoxHandler  (-1,rel);
+
+        _HYRect         paintRect = rel;
+        paintRect.width = (long)GetDC (parentWindow);
+
+        if (abs(v)>(rel.bottom-rel.top)/2) {
+            _Paint((Ptr)&paintRect);
+        } else {
+            RECT      scrollRect;
+
+            scrollRect.left         = rel.left;
+            scrollRect.right        = rel.right-hsShift;
+            scrollRect.top          = rel.top;
+            scrollRect.bottom       = rel.bottom-vsShift;
+            paintRect.left          = scrollRect.left;
+            paintRect.right         = rel.right;
+            if (v>0) {
+                ScrollWindowEx (parentWindow, 0, -v, &scrollRect, &scrollRect, nil, nil, 0); //?
+                paintRect.top = rel.bottom-vsShift-v-1;
+                paintRect.bottom = rel.bottom-1;
+                vOrigin+=paintRect.top-rel.top;
+                Paint((Ptr)&paintRect);
+                vOrigin-=paintRect.top-rel.top;
+            } else {
+                scrollRect.top --;
+                ScrollWindowEx (parentWindow, 0, -v, &scrollRect, &scrollRect, nil, nil, 0); //?
+                paintRect.top = rel.top;
+                paintRect.bottom = rel.top-v+vsShift+2;
+                paintRect.bottom = rel.bottom;
+                Paint((Ptr)&paintRect);
+            }
+        }
+        ReleaseDC (parentWindow, (HDC)paintRect.width);
+    }
+}
+
+//__________________________________________________________________
+
+void        _HYTable::_ComponentMouseExit (void)
+{
+    if (cursorState) {
+        if ((cursorState == HY_TABLE_DRAG_CURSOR)&&(activeColumn>=0)&&(activeColumn2>=0)) {
+            _HiliteRowForDrag (activeColumn2,activeColumn);
+        }
+
+        _ResetCursorState ();
+    }
+}
+
+//__________________________________________________________________
+
+void        _HYPlatformTable::_SetBackColor (_HYColor& c)
+{
+    DeleteObject (backPattern);
+    backPattern = CreateSolidBrush (RGB(c.R,c.G,c.B));
+    checkPointer (backPattern);
+}
+
+//__________________________________________________________________
+
+void        _HYPlatformTable::_SetBackColor2 (_HYColor& c)
+{
+    DeleteObject (backPattern2);
+    backPattern2 = CreateSolidBrush (RGB(c.R,c.G,c.B));
+    checkPointer (backPattern2);
+}
+
+//__________________________________________________________________
+
+void        _HYPlatformTable::_KillTextBox (void)
+{
+    if (editBox) {
+        DestroyWindow (editBox);
+        editBox = nil;
+        _ResetCursorState ();
+    }
+}
+
+//__________________________________________________________________
+
+_String     _HYPlatformTable::_RetrieveTextValue (void)
+{
+    return retrieveEditControlText(editBox);
+}
+
+
+//__________________________________________________________________
+
+void        _HYPlatformTable::_CreateTextBox (_HYRect& tBox,_String& textIn)
+{
+    textBoxRect = HYRect2Rect(tBox);
+
+    _HYTable * theParent = (_HYTable*)this;
+
+    editBox = CreateWindow ("EDIT",textIn.sData,WS_VISIBLE|WS_CHILD|ES_LEFT| ES_AUTOHSCROLL|WS_BORDER,
+                            textBoxRect.left,textBoxRect.top,textBoxRect.right-textBoxRect.left,textBoxRect.bottom-textBoxRect.top
+                            ,theParent->parentWindow,NULL,ProgramInstance, NULL);
+
+    checkPointer   (editBox);
+
+    SetWindowLongPtr (editBox,GWLP_USERDATA, (LONG_PTR)theParent);
+    defautlTextHandler  = SetWindowLongPtr (editBox,GWLP_WNDPROC,(LONG_PTR)tableEditSubclassHandler);
+
+    if (tableFont) {
+        SendMessage (editBox, WM_SETFONT, (WPARAM)tableFont, 1);
+    }
+
+    SendMessage (editBox, EM_SETMARGINS, EC_LEFTMARGIN, 3);
+    SendMessage (editBox, EM_SETMARGINS, EC_RIGHTMARGIN, 3);
+    SendMessage (editBox, EM_SETSEL, 0, 50000);
+    SetFocus    (editBox);
+
+}
+
+
+//__________________________________________________________________
+
+RECT        _HYPlatformTable::_GetVisibleRowRect (long h)
+{
+    _HYTable*   parent = (_HYTable*)this;
+    RECT        res;
+
+    long        w = (parent->settings.width&HY_COMPONENT_H_SCROLL)?HY_SCROLLER_WIDTH:0;
+    res.left   = parent->rel.left;
+    res.right  = (parent->settings.width&HY_COMPONENT_H_SCROLL)?parent->rel.right-HY_SCROLLER_WIDTH:parent->rel.right;
+
+    res.bottom = parent->verticalSpaces.lData[h]-parent->vOrigin+parent->rel.top;
+    if (res.bottom>parent->rel.bottom-w) {
+        res.bottom=parent->rel.bottom-w;
+    }
+
+    if (h) {
+        res.top = parent->verticalSpaces.lData[h-1]-parent->vOrigin+parent->rel.top;
+    } else {
+        res.top = parent->rel.top-parent->vOrigin;
+    }
+
+    return res;
+}
+
+
+//__________________________________________________________________
+
+void        _HYPlatformTable::_HiliteRowForDrag (long row, long old)
+{
+    RECT        cellRect = _GetVisibleRowRect (row);
+
+    if (row<old) {
+        cellRect.bottom = cellRect.top+2;
+    } else {
+        cellRect.top = cellRect.bottom-2;
+    }
+
+    HDC         winDC = GetDC (((_HYTable*)this)->parentWindow);
+
+    InvertRect  (winDC, &cellRect);
+
+    ReleaseDC   (((_HYTable*)this)->parentWindow,winDC);
+}
+
+//__________________________________________________________________
+
+void        _HYTable::_MarkCellsForUpdate (_SimpleList& cells)
+{
+    long hs,hf,vs,vf,t,t2,k;
+    GetDisplayRange (&rel, hs, hf, vs, vf);
+    RECT  clipRect;
+
+    clipRect.left = rel.left;
+    clipRect.right = rel.right;
+    if (settings.width&HY_COMPONENT_V_SCROLL) {
+        clipRect.right -= HY_SCROLLER_WIDTH;
+    }
+    clipRect.top = rel.top;
+    clipRect.bottom = rel.bottom;
+    if (settings.width&HY_COMPONENT_H_SCROLL) {
+        clipRect.bottom -= HY_SCROLLER_WIDTH;
+    }
+
+    for (k=0; k<cells.lLength; k++) {
+        t2 = cells.lData[k]/horizontalSpaces.lLength;
+        t = cells.lData[k]%horizontalSpaces.lLength;
+
+        if ((t>=hs)&&(t<=hf)&&(t2<=vf)&&(t2>=vs)) {
+            //printf ("%d %d\n",t,t2);
+            RECT invalRect;
+            if (t) {
+                invalRect.left = horizontalSpaces.lData[t-1];
+            } else {
+                invalRect.left = 0;
+            }
+            invalRect.right = horizontalSpaces.lData[t];
+            if (t2) {
+                invalRect.top = verticalSpaces.lData[t2-1];
+            } else {
+                invalRect.top = 0;
+            }
+            invalRect.bottom = verticalSpaces.lData[t2];
+
+            OffsetRect (&invalRect, rel.left-hOrigin, rel.top-vOrigin);
+
+            RECT           tempRect;
+            IntersectRect (&tempRect, &clipRect, &invalRect); //?
+            if (!IsRectEmpty (&tempRect)) {
+                InvalidateRect (parentWindow,&tempRect,false);
+            }
+        }
+    }
+}
+
+//__________________________________________________________________
+
+void        _HYTable::_MarkColumnForUpdate (long index)
+{
+    long hs,hf,vs,vf;
+    GetDisplayRange (&rel, hs, hf, vs, vf);
+
+    if ((index>=hs)&&(index<=hf)) {
+        RECT  clipRect;
+
+        clipRect.left = rel.left;
+        clipRect.right = rel.right;
+
+        if (settings.width&HY_COMPONENT_V_SCROLL) {
+            clipRect.right -= HY_SCROLLER_WIDTH;
+        }
+        clipRect.top = rel.top;
+        clipRect.bottom = rel.bottom;
+        if (settings.width&HY_COMPONENT_H_SCROLL) {
+            clipRect.bottom -= HY_SCROLLER_WIDTH;
+        }
+
+        RECT  invalRect;
+
+        invalRect.bottom = clipRect.bottom;
+        invalRect.top = clipRect.top;
+        invalRect.left = index?horizontalSpaces.lData[index-1]:0;
+        invalRect.right = horizontalSpaces.lData[index];
+
+        OffsetRect (&invalRect, rel.left-hOrigin, 0);
+
+        RECT           tempRect;
+        IntersectRect (&tempRect, &clipRect, &invalRect); //?
+        if (!IsRectEmpty (&tempRect)) {
+            InvalidateRect (parentWindow,&tempRect,false);
+        }
+    }
+}
+
+
+//__________________________________________________________________
+
+void        _HYTable::_MarkRowForUpdate (long index)
+{
+    long hs,hf,vs,vf;
+    GetDisplayRange (&rel, hs, hf, vs, vf);
+
+    if ((index>=vs)&&(index<=vf)) {
+        RECT  clipRect;
+
+        clipRect.left = rel.left;
+        clipRect.right = rel.right;
+        if (settings.width&HY_COMPONENT_V_SCROLL) {
+            clipRect.right -= HY_SCROLLER_WIDTH;
+        }
+        clipRect.top = rel.top;
+        clipRect.bottom = rel.bottom;
+        if (settings.width&HY_COMPONENT_H_SCROLL) {
+            clipRect.bottom -= HY_SCROLLER_WIDTH;
+        }
+
+        RECT  invalRect;
+        invalRect.right = clipRect.right;
+        invalRect.left = clipRect.left;
+        invalRect.top = index?verticalSpaces.lData[index-1]:0;
+        invalRect.bottom = verticalSpaces.lData[index];
+        OffsetRect (&invalRect, 0, rel.top-vOrigin);
+
+        RECT           tempRect;
+        IntersectRect (&tempRect, &clipRect, &invalRect); //?
+        if (!IsRectEmpty (&tempRect)) {
+            InvalidateRect (parentWindow,&tempRect,false);
+        }
+    }
+}
+
+
+//__________________________________________________________________
+
+void        _HYTable::_MarkCellForUpdate (long index)
+{
+    _SimpleList     dummy (index);
+    _MarkCellsForUpdate (dummy);
+}
+
+//__________________________________________________________________
+
+void        _HYTable::_IdleHandler (void)
+{
+}
+
+//__________________________________________________________________
+
+void        _HYTable::_FocusComponent (void)
+{
+    if (GetFocus()!=parentWindow) {
+        //printf ("Table SetFocus\n");
+        SetFocus (parentWindow);
+    }
+}
+
+
+//__________________________________________________________________
+long        _HYTable::_HandlePullDown (_List& data, long h, long v, long currentS)
+{
+    if (data.lLength) {
+        return HandlePullDownWithFont (data,h,v,currentS,textFont.face,textFont.size);
+    }
+    return -1;
+}
+
+
+//__________________________________________________________________
+
+void        _HYTable::_ScrollVPixels (long offset)
+{
+    long     voff = ((settings.width&HY_COMPONENT_H_SCROLL)?HY_SCROLLER_WIDTH:0);
+    offset = offset/(_Parameter)(GetMaxH()- rel.bottom+rel.top+1-voff)*MAX_CONTROL_VALUE;
+    ProcessEvent (generateScrollEvent(0,offset));
+    _SetVScrollerPos((double)MAX_CONTROL_VALUE*vOrigin/(verticalSpaces.lData[verticalSpaces.lLength-1]-vSize+voff));
+}
+
+//__________________________________________________________________
+
+void        _HYTable::_ScrollHPixels (long offset)
+{
+    long     hoff = ((settings.width&HY_COMPONENT_V_SCROLL)?HY_SCROLLER_WIDTH:0);
+    offset = offset/(_Parameter)(GetMaxW()- rel.right+rel.bottom+1-hoff)*MAX_CONTROL_VALUE;
+    ProcessEvent (generateScrollEvent(offset,0));
+    _SetHScrollerPos((double)MAX_CONTROL_VALUE*hOrigin/(horizontalSpaces.lData[horizontalSpaces.lLength-1]-hSize+hoff));
+}
+
+
+//__________________________________________________________________
+
+void        _HYTable::_ScrollRowIntoView (long index)
+{
+    if ((index>=0)&&(index<verticalSpaces.lLength)) {
+        long hs, hf, vs, vf;
+        GetDisplayRange (&rel,hs,hf,vs,vf);
+        if ((index>vf)||(index<vs)) {
+            _ScrollVPixels ((index?verticalSpaces.lData[index-1]:0)-vOrigin);
+        }
+    }
+}
+
+//__________________________________________________________________
+void        _HYTable::_Paint (Ptr p)
+{
+
+    _HYRect         *relRect    = (_HYRect*)p;
+
+    bool            isPrinting = relRect->right<0;
+
+    if (isPrinting) {
+        relRect->right = -relRect->right;
+    }
+
+    HDC             dc = (HDC)relRect->width;
+
+    /*RECT          all = HYRect2Rect (*relRect);
+
+    HBRUSH          redFill   = CreateSolidBrush (RGB(255,0,0)); // checked
+    FillRect        (dc, &all, redFill);
+    DeleteObject    (redFill);
+
+    return;
+    */
+    COLORREF        whiteC          = RGB(0xff,0xff,0xff),
+                    fillColor         = GetSysColor(COLOR_HIGHLIGHT),
+                    fillTColor        = GetSysColor(COLOR_HIGHLIGHTTEXT),
+                    tableBkColor    = RGB(backColor.R, backColor.G, backColor.B),
+                    tableBkColor2   = RGB(backColor2.R, backColor2.G, backColor2.B),
+                    saveTextColor;
+
+    HPEN            saveDCPen,
+                    whitePen = CreatePen (PS_SOLID, 1, whiteC); // checked
+
+
+    HFONT           saveDCFont;
+
+
+    HBRUSH          themeFill   = CreateSolidBrush (fillColor); // checked
+    checkPointer    (themeFill);
+
+    HRGN            saveRgn     = CreateRectRgn    (0,0,1,1);   // checked
+    checkPointer    (saveRgn);
+
+    long            hs, // starting column
+                    hf, // ending column
+                    vs, // starting row
+                    vf, // ending row
+                    k,  // loop index
+                    t,  // aux variable
+                    t2,
+                    st; // a few more auxs
+
+    bool            chop,
+                    chopv;
+
+    //printf            ("%d %d %d \n", GetRValue (fillColor), GetGValue (fillColor), GetBValue (fillColor));
+
+
+    GetDisplayRange (relRect, hs, hf, vs, vf);
+
+    long            vsShift = ((settings.width&HY_COMPONENT_H_SCROLL)?HY_SCROLLER_WIDTH:0),
+                    hsShift = ((settings.width&HY_COMPONENT_V_SCROLL)?HY_SCROLLER_WIDTH:0);
+
+
+    _HYRect         saveRel;
+    RECT            bRect;
+
+    HDC             offScreenPtr = nil;  // checked
+
+    HBITMAP         offBitmap    = nil;
+
+    if ((vf-vs>2)&&(!isPrinting)) {
+        offScreenPtr = CreateCompatibleDC (dc);
+        if (offScreenPtr) {
+            bRect.left           = bRect.top = 0;
+            bRect.right          = relRect->right-relRect->left-hsShift;
+            bRect.bottom         = relRect->bottom-relRect->top-vsShift;
+            offBitmap            = CreateCompatibleBitmap (dc, bRect.right, bRect.bottom);
+
+            if (!offBitmap) {
+                DeleteDC (offScreenPtr);
+                offScreenPtr = nil;
+            } else {
+                DeleteObject (SelectObject (offScreenPtr, offBitmap));
+                dc = offScreenPtr;
+
+                saveRel = *relRect;
+                relRect->bottom -= relRect->top;
+                relRect->top = 0;
+                relRect->right  -= relRect->left;
+                relRect->left = 0;
+            }
+        }
+    }
+
+    st =            GetClipRgn (dc, saveRgn);
+
+    if (st == 0) {
+        DeleteObject (saveRgn);
+        saveRgn = nil;
+    }
+
+    int             saveBackMode  = GetBkMode    (dc);
+    UINT            saveTextAlign = GetTextAlign (dc);
+    COLORREF        saveBkColor   = GetBkColor   (dc);
+
+    SetTextAlign   (dc, TA_BASELINE);
+    SetBkMode      (dc, TRANSPARENT);
+
+    RECT clipRect = {relRect->left,relRect->top,
+                     relRect->right-hsShift,
+                     relRect->bottom-vsShift
+                    },
+
+         anotherRect,
+         clipRect2,
+         clipRect3;
+
+    POINT
+    mapPts[2];
+
+    mapPts[0] = (POINT) {
+        clipRect.left,clipRect.top
+    };
+    mapPts[1] = (POINT) {
+        clipRect.right+1,clipRect.bottom+1
+    };
+
+    LPtoDP (dc, mapPts,2);
+
+    HRGN          tempRgn = CreateRectRgn (mapPts[0].x, mapPts[0].y, mapPts[1].x, mapPts[1].y);
+    checkPointer  (tempRgn);
+
+    SelectClipRgn (dc, tempRgn);
+
+    saveTextColor = GetTextColor (dc);
+
+    ::SetTextColor (dc, RGB(textColor.R, textColor.G, textColor.B));
+
+    anotherRect = clipRect;
+
+    t = relRect->top-vOrigin;
+
+    saveDCPen = (HPEN)SelectObject (dc, whitePen);
+
+    for (k=vs; k<=vf; k++) {
+        anotherRect.top = k?verticalSpaces.lData[k-1]+t:relRect->top;
+        anotherRect.bottom = verticalSpaces.lData[k]+t;
+        if (cellTypes.lData[k*horizontalSpaces.lLength]&HY_TABLE_BEVELED) {
+            FillRect (dc,&anotherRect,backPattern2);
+            if ((k==vs)||(k<vf)) {
+                SelectObject (dc, menuLine2);
+                MoveToEx (dc,anotherRect.left,anotherRect.bottom-1,nil);
+                LineTo (dc,anotherRect.right,anotherRect.bottom-1);
+                SelectObject (dc, menuLine1);
+                MoveToEx (dc,anotherRect.left,anotherRect.bottom-2,nil);
+                LineTo (dc,anotherRect.right,anotherRect.bottom-2);
+                SelectObject (dc, whitePen);
+            }
+        } else {
+            FillRect (dc,&anotherRect,backPattern);
+            if ((k==vs)||(k<vf)) {
+                MoveToEx (dc,anotherRect.left,anotherRect.bottom-1,nil);
+                LineTo (dc,anotherRect.right,anotherRect.bottom-1);
+            }
+        }
+    }
+
+    saveTextColor = GetTextColor (dc);
+    ::SetTextColor (dc, RGB (textColor.R, textColor.G, textColor.B));
+
+    saveDCFont    = (HFONT)SelectObject (dc, tableFont);
+    st = 0;
+
+    if (hf<horizontalSpaces.lLength-1) {
+        st = hf;
+    } else {
+        st = hf-1;
+    }
+    t = relRect->left-hOrigin-2;
+
+    if ((selectionType & HY_TABLE_NO_COLS_LINES) == 0) {
+        SelectObject (dc,menuLine1);
+        for (k=hs; k<=st; k++) {
+            t2 = t+horizontalSpaces.lData[k];
+            MoveToEx (dc,t2,relRect->top,nil);
+            LineTo (dc,t2,relRect->bottom);
+        }
+        SelectObject (dc,menuLine2);
+        t++;
+        for (k=hs; k<=st; k++) {
+            t2 = t+horizontalSpaces.lData[k];
+            MoveToEx (dc,t2,relRect->top,nil);
+            LineTo (dc,t2,relRect->bottom);
+        }
+    }
+
+    bool  highlightColorOn = false;
+
+    for (k=vs; k<=vf; k++) {
+        anotherRect.top = relRect->top-vOrigin+1;
+        anotherRect.bottom = anotherRect.top+verticalSpaces.lData[k]-1;
+        if (k) {
+            anotherRect.top+=verticalSpaces.lData[k-1];
+        }
+
+        long    t3,
+                st2,
+                w = anotherRect.bottom-anotherRect.top,
+                w2,
+                shift = (w-textFont.size)/2-1;
+
+        if (anotherRect.bottom>relRect->bottom-vsShift) {
+            anotherRect.bottom = relRect->bottom-vsShift;
+            chopv = false;
+        } else {
+            chopv = true;
+        }
+
+        for (t2=hs; t2<=hf; t2++) {
+            t3 = k*horizontalSpaces.lLength+t2;
+            if (t3 == editCellID) {
+                continue;
+            }
+            anotherRect.left  = relRect->left-hOrigin+1;
+            anotherRect.right = anotherRect.left+horizontalSpaces.lData[t2]-1;
+
+            if (t2) {
+                anotherRect.left+=horizontalSpaces.lData[t2-1];
+            }
+
+            clipRect2 = anotherRect;
+            w2        = anotherRect.right-anotherRect.left;
+
+            chop = true;
+
+            if (anotherRect.right>relRect->right-hsShift) {
+                anotherRect.right=relRect->right-hsShift;
+                chop = false;
+            } else {
+                chop = true;
+            }
+
+            if ((t2==hs)||(k==vs)) {
+                IntersectRect (&clipRect3,&anotherRect,&clipRect);
+                DeleteObject (tempRgn);
+
+                mapPts[0] = (POINT) {
+                    clipRect3.left,clipRect3.top
+                };
+                mapPts[1] = (POINT) {
+                    clipRect3.right+1,clipRect3.bottom+1
+                };
+
+                LPtoDP (dc, mapPts,2);
+
+                tempRgn = CreateRectRgn (mapPts[0].x, mapPts[0].y, mapPts[1].x, mapPts[1].y);
+                checkPointer  (tempRgn);
+                SelectClipRgn (dc, tempRgn);
+            } else {
+                DeleteObject (tempRgn);
+                mapPts[0] = (POINT) {
+                    anotherRect.left,anotherRect.top
+                };
+                mapPts[1] = (POINT) {
+                    anotherRect.right+1,anotherRect.bottom+1
+                };
+
+                LPtoDP (dc, mapPts,2);
+
+                tempRgn = CreateRectRgn (mapPts[0].x, mapPts[0].y, mapPts[1].x, mapPts[1].y);
+                checkPointer  (tempRgn);
+                SelectClipRgn (dc, tempRgn);
+            }
+
+            if (cellTypes.lData[t3]&HY_TABLE_SELECTED) {
+                if (chopv) {
+                    anotherRect.bottom--;
+                }
+                if (chop) {
+                    anotherRect.right-=2;
+                    FillRect (dc,&anotherRect,themeFill);
+                    anotherRect.right+=2;
+                } else {
+                    FillRect (dc,&anotherRect,themeFill);
+                }
+
+                if (chopv) {
+                    anotherRect.bottom++;
+                }
+            }
+
+
+            if (cellTypes.lData[t3]&HY_TABLE_ICON) {
+                if (!isPrinting) {
+                    _SimpleList     * cellList = (_SimpleList*)cellData.lData[t3];
+
+                    if (w2-4>cellList->lData[1]) {
+                        t3 = (w2-cellList->lData[1])/2;
+                        clipRect2.left+=t3;
+                    }
+                    clipRect2.right = clipRect2.left+cellList->lData[1];
+                    if (w-2>cellList->lData[2]) {
+                        t3 = (w-cellList->lData[2])/2;
+                        clipRect2.top+=t3;
+                    }
+                    clipRect2.bottom=clipRect2.top+cellList->lData[2];
+
+                    if (cellList->lLength==3) {
+
+                        HBITMAP aPic = (HBITMAP)cellList->lData[0];
+                        if (aPic) {
+                            DrawTransparentBitmap (dc, aPic, clipRect2.left, clipRect2.top, clipRect2.right-clipRect2.left+1, clipRect2.bottom-clipRect2.top+1,RGB(255,255,255));
+                        }
+                    } else {
+                        if ((cellList->lData[3]==HY_TABLE_COLOR_BOX)||(cellList->lData[3]==HY_TABLE_COLOR_CIRCLE)) {
+                            _HYColor    c   = LongToHYColor    (cellList->lData[0]);
+                            HBRUSH      clr;
+
+
+                            if (cellList->lData[3]==HY_TABLE_COLOR_BOX) {
+                                clr =  CreateSolidBrush (RGB(c.R,c.G,c.B));
+                                checkPointer (clr);
+                                FillRect  (dc, &clipRect2,clr);
+                                DeleteObject (clr);
+                            } else {
+                                COLORREF        trColor = RGB(0,0,0);
+                                HPEN            trPen   = CreatePen (PS_NULL, 1, trColor),
+                                                saveTPen;
+
+                                checkPointer    (trPen);
+
+                                saveTPen     = (HPEN)SelectObject (dc, trPen);
+                                RECT            circRect = clipRect2;
+                                InflateRect    (&circRect,1,1);
+                                Ellipse        (dc,circRect.left, circRect.top, circRect.right, circRect.bottom);
+
+
+                                clr =  CreateSolidBrush (RGB(c.R/2,c.G/2,c.B/2));
+                                checkPointer (clr);
+
+                                HBRUSH          saveBRUSH = (HBRUSH)SelectObject (dc, clr);
+
+                                InflateRect    (&circRect,-1,-1);
+                                trColor      = RGB(c.R/2,c.G/2,c.B/2);
+                                //trPen      = CreatePen (PS_SOLID, 1, trColor);
+                                //checkPointer   (trPen);
+                                //DeleteObject   (SelectObject   (dc, trPen));
+                                Ellipse        (dc,circRect.left, circRect.top, circRect.right, circRect.bottom);
+
+                                InflateRect    (&circRect,-1,-1);
+                                trColor        = RGB(c.R/1.25,c.G/1.25,c.B/1.25);
+
+                                clr =  CreateSolidBrush (RGB(c.R/1.25,c.G/1.25,c.B/1.25));
+                                checkPointer (clr);
+                                DeleteObject (SelectObject (dc, clr));
+
+                                //trPen = CreatePen (PS_SOLID, 1, trColor);
+                                //checkPointer    (trPen);
+                                //DeleteObject  (SelectObject (dc, trPen));
+
+                                Ellipse        (dc,circRect.left, circRect.top, circRect.right, circRect.bottom);
+
+                                clr =  CreateSolidBrush (RGB(c.R,c.G,c.B));
+                                checkPointer (clr);
+                                DeleteObject (SelectObject (dc, clr));
+
+                                InflateRect    (&circRect,-1,-1);
+                                //trColor      = RGB(c.R,c.G,c.B);
+                                //trPen = CreatePen (PS_SOLID, 1,trColor);
+                                //checkPointer    (trPen);
+
+                                DeleteObject   (SelectObject (dc, trPen));
+                                Ellipse        (dc,circRect.left, circRect.top, circRect.right, circRect.bottom);
+                                DeleteObject   (SelectObject   (dc, saveTPen));
+                                DeleteObject   (SelectObject   (dc, saveBRUSH));
+                            }
+
+                        }
+                    }
+                }
+            } else { // text
+                st2 = cellTypes.lData[t3]&HY_TABLE_STYLEMASK;
+
+                if (st!=st2) {
+                    HFONT      setFont = tableFont;
+                    st = st2;
+                    if (st&HY_TABLE_BOLD) {
+                        if (st&HY_TABLE_ITALIC) {
+                            setFont = tableFontBI;
+                        } else {
+                            setFont = tableFontB;
+                        }
+                    } else if (st&HY_TABLE_ITALIC) {
+                        setFont = tableFontI;
+                    }
+
+                    SelectObject (dc, setFont);
+                }
+
+
+                _String  *thisCell = (_String*)cellData.lData[t3];
+
+                if (cellTypes.lData[t3]&HY_TABLE_SELECTED) {
+                    if (!highlightColorOn) {
+                        ::SetTextColor (dc, fillTColor);
+                        highlightColorOn = true;
+                    }
+                } else {
+                    if (highlightColorOn) {
+                        ::SetTextColor (dc, RGB(textColor.R, textColor.G, textColor.B));
+                        highlightColorOn = false;
+                    }
+                }
+                TextOut (dc,anotherRect.left+textFont.size/3, anotherRect.top+shift+textFont.size, thisCell->sData,thisCell->sLength);
+
+                if (cellTypes.lData[t3]&HY_TABLE_PULLDOWN) {
+                    if (!isPrinting) {
+                        clipRect2.right-=4;
+                        clipRect2.left=clipRect2.right-tPDMw;
+                        if (w-2>tPDMh) {
+                            t3 = (w-tPDMh)/2;
+                            clipRect2.top+=t3;
+                        }
+                        clipRect2.bottom=clipRect2.top+tPDMh;
+
+                        BITMAP theBM;
+                        GetObject (tablePDMenuIcon, sizeof (BITMAP), &theBM);
+
+                        if (otherDC) {
+                            SelectObject         (otherDC, tablePDMenuIcon);
+
+                            StretchBlt           (dc, clipRect2.left, clipRect2.top, clipRect2.right-clipRect2.left+1, clipRect2.bottom-clipRect2.top+1,
+                                                  otherDC, 0, 0, theBM.bmWidth, theBM.bmHeight, SRCCOPY);
+                            SelectObject         (otherDC,oDCBM);
+                        } else {
+                            _String errMsg = _String ("Failed to make CompatibleDC in _HYTable::_Paint");
+                            ReportWarning (errMsg);
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+
+    SetBkMode      (dc, saveBackMode);
+    SetTextAlign   (dc, saveTextAlign);
+    SetBkColor     (dc, saveBkColor);
+
+    SelectClipRgn  (dc, saveRgn);
+
+    if (saveRgn) {
+        DeleteObject (saveRgn);
+    }
+
+    ::SetTextColor (dc, saveTextColor);
+
+    SelectObject   (dc, saveDCPen);
+    SelectObject   (dc, saveDCFont);
+    DeleteObject   (whitePen);
+
+    if (themeFill) {
+        DeleteObject (themeFill);
+    }
+
+    if (tempRgn) {
+        DeleteObject (tempRgn);
+    }
+
+    if (offScreenPtr) {
+        *relRect    = saveRel;
+        OffsetRect   (&clipRect,relRect->left, relRect->top);
+
+        dc = (HDC)relRect->width;
+
+        BitBlt   (dc,clipRect.left,clipRect.top, clipRect.right-clipRect.left+1,clipRect.bottom-clipRect.top+1, offScreenPtr, 0,0, SRCCOPY);
+        DeleteDC     (offScreenPtr);
+        DeleteObject (offBitmap);
+    }
+
+    if (editBox) {
+        UpdateWindow (editBox);
+    }
+
+    _HYPlatformComponent::_Paint(p);
+}
+
+
+//__________________________________________________________________
+
+bool        _HYTable::_ProcessOSEvent (Ptr vEvent)
+{
+    _HYWindowsUIMessage*    theEvent = (_HYWindowsUIMessage*)vEvent;
+
+    static  int     lastH = 0,
+                    lastV = 0;
+
+    long            k,
+                    h,
+                    v,
+                    vsShift = ((settings.width&HY_COMPONENT_H_SCROLL)?HY_SCROLLER_WIDTH:0),
+                    hsShift = ((settings.width&HY_COMPONENT_V_SCROLL)?HY_SCROLLER_WIDTH:0);
+
+    switch (theEvent->iMsg) {
+    case WM_LBUTTONUP: {
+        lastH = (short)LOWORD (theEvent->lParam);
+        lastV = (short)HIWORD (theEvent->lParam);
+
+        bool    isInComponent = ((lastH>=rel.left)&&(lastV>=rel.top)&&(lastH<rel.right)&&(lastV<rel.bottom));
+
+        if (cursorState == HY_TABLE_SIZE_CURSOR) {
+            _ResetCursorState ();
+            //ReleaseCapture      ();
+        } else if (cursorState == HY_TABLE_DRAG_CURSOR) {
+            if (activeColumn >= 0) {
+                if (messageRecipient) {
+                    ReleaseCapture ();
+                    ((_HYTWindow*)messageRecipient)->trackMouseComponent = nil;
+                }
+                if (activeColumn2>=0) {
+                    _HiliteRowForDrag (activeColumn2,activeColumn);
+                }
+
+                if (activeColumn!=activeColumn2) {
+                    EditBoxHandler (-1,rel);
+                    if (isInComponent) {
+                        DragRow (activeColumn,activeColumn2);
+                    }
+                }
+
+                activeColumn = -1;
+            }
+            _ResetCursorState ();
+        } else if (cursorState == HY_TABLE_EDIT_CURSOR) {
+            if (messageRecipient) {
+                ReleaseCapture ();
+                ((_HYTWindow*)messageRecipient)->trackMouseComponent = nil;
+            }
+
+            RECT      clippingRect = HYRect2Rect (rel),
+                      paintRect;
+
+            IntersectRect (&paintRect,&limits,&clippingRect);
+            _FrameRect (paintRect);
+
+            _HYRect     outlineHRect;
+            outlineHRect.left   = limits.left;
+            outlineHRect.right  = limits.right+hsShift;
+            outlineHRect.top    = limits.top;
+            outlineHRect.bottom = limits.bottom+vsShift;
+            long    hs,hf,vs,vf;
+            hOrigin += limits.left-rel.left;
+            vOrigin += limits.top-rel.top;
+            GetDisplayRange (&outlineHRect,hs,hf,vs,vf);
+            hOrigin -= limits.left-rel.left;
+            vOrigin -= limits.top-rel.top;
+            ExpungeSelection();
+            if ((hf>=hs)||(vs>=vf)) {
+                _SimpleList sel;
+                if (selectionType&HY_TABLE_SEL_ROWS) {
+                    sel.RequestSpace (vf-vs+1);
+                    for (h=vs; h<=vf; h++) {
+                        sel<<h;
+                    }
+                    SetRowSelection (sel);
+                } else if (selectionType&HY_TABLE_SEL_COLS) {
+                    sel.RequestSpace (hf-hs+1);
+                    for (v=hs; v<=hf; h++) {
+                        sel<<v;
+                    }
+                    SetColumnSelection(sel);
+
+                } else {
+                    sel.RequestSpace ((vf-vs+1)*(hf-hs+1));
+                    for (h=hs; h<=hf; h++)
+                        for (v=vs; v<=vf; v++) {
+                            sel << v*horizontalSpaces.lLength + h;
+                        }
+                    SetSelection (sel,true);
+                    _MarkCellsForUpdate (sel);
+                }
+            }
+
+            if (messageRecipient) {
+                ReleaseCapture ();
+                ((_HYTWindow*)messageRecipient)->trackMouseComponent = nil;
+            }
+
+            _ResetCursorState ();
+        }
+
+        break;
+    }
+
+    case WM_LBUTTONDOWN:
+    case WM_LBUTTONDBLCLK: {
+        lastH = (short)LOWORD (theEvent->lParam);
+        lastV = (short)HIWORD (theEvent->lParam);
+
+        POINT   downWhere = (POINT) {
+            lastH, lastV
+        };
+
+        ClientToScreen (parentWindow, &downWhere);
+
+        if ((selectionType&HY_TABLE_FOCUSABLE)&&messageRecipient&&((selectionType&HY_TABLE_IS_FOCUSED)==0)) {
+            messageRecipient->ProcessEvent(generateKeyboardFocusEvent (GetID()));
+        }
+
+        if ((cursorState == HY_TABLE_SIZE_CURSOR)&&(theEvent->iMsg!= WM_LBUTTONDBLCLK)) {
+            // do drag here
+            EditBoxHandler (-1,rel);
+            if (!DragDetect (parentWindow, downWhere)) {
+                _ResetCursorState ();
+                return    true;
+            }
+
+            //SetCapture      (parentWindow);
+
+            limits.left   = lastH;
+            limits.top    = rel.top;
+            limits.bottom = rel.bottom-vsShift;
+
+            limits.right = rel.right-hsShift;
+
+            lastH += hOrigin;
+
+            for (activeColumn = 0; activeColumn<horizontalSpaces.lLength-1; activeColumn++)
+                if (horizontalSpaces.lData[activeColumn]>lastH-2-rel.left) {
+                    break;
+                }
+
+            if (activeColumn) {
+                limits.left = rel.left+horizontalSpaces.lData[activeColumn-1]+3-hOrigin;
+            } else {
+                limits.left = rel.left+3;
+            }
+
+            long dragRes = horizontalSpaces.lData[horizontalSpaces.lLength-1]-
+                           rel.right+rel.left-hOrigin+hsShift;
+
+            if (dragRes<lastH-limits.left) {
+                limits.left = lastH-dragRes;
+            }
+
+            lastH-=hOrigin;
+
+            return true;
+
+        } else {
+            if (((k=FindClickedTableCell (lastH-rel.left,lastV-rel.top,h,v))>-1)&&
+                    (lastV<rel.bottom-vsShift)&&(lastH<rel.right-hsShift)) {
+                if (theEvent->iMsg== WM_LBUTTONDBLCLK) {
+                    if (cellTypes.lData[k]&HY_TABLE_EDIT_TEXT) {
+                        EditBoxHandler (k,rel);
+                    } else if (messageRecipient) {
+                        messageRecipient->ProcessEvent (generateTableDblClickEvent(GetID()));
+                    }
+                    break;
+                }
+                ModifySelection (h,v,GetAsyncKeyState (VK_SHIFT) & 0x8000, GetAsyncKeyState (VK_CONTROL) & 0x8000, true);
+            }
+
+            if (k==-2)
+                // process pull-down
+            {
+                if (messageRecipient) {
+                    POINT loc = {lastH, lastV};
+                    ClientToScreen (parentWindow, &loc);
+                    messageRecipient->ProcessEvent (generateTablePullDownEvent(GetID(),v*horizontalSpaces.lLength+h,
+                                                    (((long)loc.x)<<16)+loc.y));
+                }
+                break;
+            }
+
+
+            if ((cursorState == HY_TABLE_DRAG_CURSOR)&&(theEvent->iMsg!= WM_LBUTTONDBLCLK)) {
+                SetCursor (dropOffCursor);
+                FindClickedTableCell(lastH-rel.left,lastV-rel.top,k,activeColumn);
+                activeColumn2 = -1;
+                if (messageRecipient) {
+                    SetCapture (parentWindow);
+                    ((_HYTWindow*)messageRecipient)->trackMouseComponent = this;
+                }
+
+                return true;
+            }
+
+            /*  handle row drag here */
+
+            if (((selectionType&HY_TABLE_SINGLE_SELECTION)==0)&&
+                    ((selectionType&HY_TABLE_NODRAG_SELECTION)==0)&&
+                    (lastH<rel.right-hsShift)&&
+                    (lastV<rel.bottom-vsShift)&&
+                    DragDetect (parentWindow, downWhere)) {
+                cursorState = HY_TABLE_EDIT_CURSOR;
+                limits.left = limits.right  = lastH;
+                limits.top  = limits.bottom = lastV;
+
+                textBoxRect.left   = -1;
+                textBoxRect.right  = lastH;
+                textBoxRect.bottom = lastV;
+
+                if (messageRecipient) {
+                    SetCapture (parentWindow);
+                    ((_HYTWindow*)messageRecipient)->trackMouseComponent = this;
+                }
+
+                return true;
+            }
+
+        }
+
+    }
+    break;
+
+    case WM_KEYDOWN: {
+
+        bool    ctlDown = (GetAsyncKeyState (VK_CONTROL) & 0x8000);
+
+        switch (theEvent->wParam) {
+        case VK_UP: // up
+            HandleKeyMove (0,ctlDown);
+            return true;
+        case VK_DOWN: // down
+            HandleKeyMove (1,ctlDown);
+            return true;
+        case VK_LEFT: // left
+            HandleKeyMove (2,ctlDown);
+            return true;
+        case VK_RIGHT: // right
+            HandleKeyMove (3,ctlDown);
+            return true;
+        }
+
+        break;
+    }
+
+    case WM_MOUSEMOVE: {
+        POINT   downWhere = (POINT) {
+            (short)LOWORD (theEvent->lParam), (short)HIWORD (theEvent->lParam)
+        };
+
+        if (theEvent->wParam & MK_LBUTTON) { // left button down
+            if (cursorState == HY_TABLE_SIZE_CURSOR) {
+                POINT   currentPoint = (POINT) {
+                    LOWORD (theEvent->lParam),HIWORD (theEvent->lParam)
+                };
+                if (PtInRect (&limits, currentPoint)) {
+                    if (currentPoint.x-lastH) {
+                        SetColumnSpacing (activeColumn,currentPoint.x-lastH,true);
+                        if (messageRecipient)
+                            messageRecipient->ProcessEvent (generateTableResizeCEvent(GetID(),
+                                                            activeColumn,currentPoint.x-lastH));
+                        lastH = currentPoint.x;
+                    }
+
+                }
+            } else if ((cursorState == HY_TABLE_DRAG_CURSOR)&&(activeColumn>=0)) {
+                long h,v,k;
+
+                if ((downWhere.y>rel.bottom-vsShift)||(downWhere.y<rel.top)) {
+                    if (activeColumn2>=0) {
+                        _HiliteRowForDrag (activeColumn2,activeColumn);
+                        activeColumn2 = -1;
+                    }
+                    h = verticalSpaces.lData[verticalSpaces.lLength-1]/verticalSpaces.lLength;
+                    _ScrollVPixels ((downWhere.y<rel.top)?-h:h);
+                    break;
+                }
+
+                if (downWhere.x>rel.right-hsShift) {
+                    downWhere.x=rel.right-hsShift;
+                }
+
+                if ( (lastH!=downWhere.x)|| (lastV!=downWhere.y)) {
+                    k = FindClickedTableCell(downWhere.x-rel.left,downWhere.y-rel.top,h,v);
+                    if ((v!=activeColumn2)&&(k>-1)) {
+                        if (activeColumn2>=0) {
+                            _HiliteRowForDrag (activeColumn2,activeColumn);
+                        }
+                        if ((v!=activeColumn)&&(!(cellTypes.lData[k]&HY_TABLE_CANTSELECT))) {
+                            _HiliteRowForDrag (v,activeColumn);
+                            activeColumn2 = v;
+                        } else {
+                            activeColumn2 = -1;
+                        }
+                    }
+                    lastH = downWhere.x;
+                    lastV = downWhere.y;
+                }
+            } else if (cursorState == HY_TABLE_EDIT_CURSOR) {
+                RECT      clippingRect = HYRect2Rect (rel),
+                          paintRect;
+
+                while (1) {
+                    if (downWhere.y>rel.bottom-vsShift) {
+                        if (rel.bottom-rel.top-vsShift+vOrigin <  verticalSpaces.lData[verticalSpaces.lLength-1]-1) {
+                            long h = verticalSpaces.lData[verticalSpaces.lLength-1]/verticalSpaces.lLength;
+
+                            IntersectRect (&paintRect,&limits,&clippingRect);
+                            _FrameRect (paintRect);
+
+                            _ScrollVPixels (h);
+
+                            limits.top -= h;
+                            IntersectRect (&paintRect,&limits,&clippingRect);
+                            _FrameRect    (paintRect);
+
+                            lastV -= h;
+                            textBoxRect.bottom -= h;
+                            break;
+                        }
+                        downWhere.y=rel.bottom-vsShift;
+                    }
+                    if (downWhere.x>rel.right-hsShift) {
+                        if (rel.right-rel.left-hsShift+hOrigin <  horizontalSpaces.lData[horizontalSpaces.lLength-1]-1) {
+                            long h = horizontalSpaces.lData[horizontalSpaces.lLength-1]/horizontalSpaces.lLength;
+
+                            IntersectRect (&paintRect,&limits,&clippingRect);
+                            _FrameRect    (paintRect);
+
+                            _ScrollHPixels (h);
+
+                            limits.left -= h;
+
+                            IntersectRect (&paintRect,&limits,&clippingRect);
+                            _FrameRect    (paintRect);
+
+                            lastH -= h;
+                            textBoxRect.right -= h;
+                            break;
+                        }
+                        downWhere.x=rel.right-hsShift;
+                    }
+                    if (downWhere.y<rel.top) {
+                        if (vOrigin>0) {
+                            long h = verticalSpaces.lData[verticalSpaces.lLength-1]/verticalSpaces.lLength;
+
+                            IntersectRect (&paintRect,&limits,&clippingRect);
+                            _FrameRect    (paintRect);
+
+                            _ScrollVPixels (-h);
+
+                            limits.top += h;
+                            IntersectRect (&paintRect,&limits,&clippingRect);
+                            _FrameRect    (paintRect);
+
+                            lastV += h;
+                            textBoxRect.bottom += h;
+                            break;
+                        }
+                        downWhere.y=rel.top;
+                    }
+                    if (downWhere.x<rel.left) {
+                        if (hOrigin>0) {
+                            long h = horizontalSpaces.lData[horizontalSpaces.lLength-1]/horizontalSpaces.lLength;
+
+                            IntersectRect (&paintRect,&limits,&clippingRect);
+                            _FrameRect    (paintRect);
+
+                            _ScrollHPixels (-h);
+
+                            limits.left += h;
+
+                            IntersectRect (&paintRect,&limits,&clippingRect);
+                            _FrameRect    (paintRect);
+
+                            lastH += h;
+                            textBoxRect.right += h;
+                            break;
+                        }
+                        downWhere.x=rel.left;
+                    }
+
+                    if ( (lastH!=downWhere.x)|| (lastV!=downWhere.y)) {
+                        if (textBoxRect.left>=0) {
+                            IntersectRect (&paintRect,&limits,&clippingRect);
+                            _FrameRect    (paintRect);
+                        }
+
+                        if (downWhere.x > textBoxRect.right) {
+                            limits.right = downWhere.x;
+                        } else {
+                            limits.right =  textBoxRect.right;
+                            limits.left = downWhere.x;
+                        }
+                        if (downWhere.y >  textBoxRect.bottom) {
+                            limits.bottom = downWhere.y;
+                        } else {
+                            limits.bottom = textBoxRect.bottom;
+                            limits.top = downWhere.y;
+                        }
+
+                        IntersectRect (&paintRect,&limits,&clippingRect);
+                        _FrameRect    (paintRect);
+
+                        lastH = downWhere.x;
+                        lastV = downWhere.y;
+
+                        textBoxRect.left = 1;
+                    }
+                    break;
+                }
+                return true;
+            }
+
+        } else { // treat as plain move
+            bool  ch = (!(selectionType&HY_TABLE_DONT_SIZE))&&(CheckForHSizeLocation(downWhere.x-rel.left))&&(downWhere.y<rel.bottom-vsShift);
+
+            if (ch&&(cursorState!=HY_TABLE_SIZE_CURSOR)) {
+                cursorState = HY_TABLE_SIZE_CURSOR;
+                SetCursor(hSizeCursor);
+            } else if ((!ch)&&(cursorState==HY_TABLE_SIZE_CURSOR)) {
+                SetCursor(LoadCursor (nil, IDC_ARROW));
+                cursorState = 0;
+            }
+
+            if (selectionType & HY_TABLE_SEL_ROWS) {
+                if (!ch) {
+                    k = FindClickedTableCell(downWhere.x-rel.left,downWhere.y-rel.top,h,v);
+                    if (k>=0) {
+                        if ((cursorState != HY_TABLE_DRAG_CURSOR)&&
+                                ((selectionType&HY_TABLE_NODRAG_SELECTION)==0)) {
+                            if (cellTypes.lData[k]&HY_TABLE_SELECTED) {
+                                if (IsRowSelectionSimple()) {
+                                    SetCursor (pickUpCursor);
+                                    cursorState = HY_TABLE_DRAG_CURSOR;
+                                    activeColumn = -1;
+                                }
+                            }
+                        } else {
+                            if (((selectionType&HY_TABLE_NODRAG_SELECTION)==0)&&(!(cellTypes.lData[k]&HY_TABLE_SELECTED))) {
+                                SetCursor(LoadCursor (nil, IDC_ARROW));
+                                cursorState = 0;
+                            }
+                        }
+                    }
+                }
+            }
+        }
+        return true;
+    }
+    }
+    return _HYPlatformComponent::_ProcessOSEvent (vEvent);
+}
+
+
+
+
+//__________________________________________________________________
+
+void        _HYTable::_PrintTable (_SimpleList& columns, _SimpleList& rows, _HYTable* ch)
+{
+
+    if ((columns.lLength == 0)||(rows.lLength == 0)) {
+        return;
+    }
+
+    DOCINFO                 di = {sizeof(DOCINFO), "HYPHY.out", NULL };
+    PRINTDLG                pd;
+    BOOL                    SuccessFlag;
+
+    pd.lStructSize         = sizeof(PRINTDLG);
+    pd.hwndOwner           = parentWindow;
+    pd.hDevMode            = NULL;
+    pd.hDevNames           = NULL;
+    pd.hDC                 = NULL;
+    pd.Flags               = PD_COLLATE | PD_RETURNDC | PD_NOSELECTION;
+    pd.nFromPage           = 1;
+    pd.nToPage             = 0xffff;
+    pd.nMinPage            = 1;
+    pd.nMaxPage            = 0xffff;
+    pd.nCopies             = 1;
+    pd.hInstance           = NULL;
+    pd.lCustData           = 0L;
+    pd.lpfnPrintHook       = NULL;
+    pd.lpfnSetupHook       = NULL;
+    pd.lpPrintTemplateName = NULL;
+    pd.lpSetupTemplateName = NULL;
+    pd.hPrintTemplate      = NULL;
+    pd.hSetupTemplate      = NULL;
+
+    if (!PrintDlg(&pd)) {
+        return;
+    }
+
+    if (pd.hDC == NULL) {
+        pd.hDC = GetPrinterDeviceContext(parentWindow);
+    }
+
+
+    EnableWindow(parentWindow, FALSE);
+
+    SuccessFlag   = TRUE;
+    UserAbortFlag = FALSE;
+
+    PrintDialogHandle = CreateDialog(GetModuleHandle(NULL), (LPCTSTR)"PrintDlgBox", parentWindow,
+                                     PrintDialogProc);
+    SetDlgItemText(PrintDialogHandle, IDD_FNAME, "Table Printing...");
+
+    SetAbortProc(pd.hDC, AbortProc);
+
+    if (StartDoc(pd.hDC, &di) > 0) {
+        HDC         windowDC = GetDC (parentWindow);
+
+        long        printW = GetDeviceCaps(pd.hDC, HORZRES),
+                    printH = GetDeviceCaps(pd.hDC, VERTRES),
+
+                    hRes = GetDeviceCaps(pd.hDC, LOGPIXELSX),
+                    vRes = GetDeviceCaps(pd.hDC, LOGPIXELSY),
+
+                    screenHRes = GetDeviceCaps(windowDC, LOGPIXELSX),
+                    screenVRes = GetDeviceCaps(windowDC, LOGPIXELSY),
+
+                    tW = 0,
+                    tH = 0,
+                    cC = 0,
+                    cE = 0,
+                    cP = 1,
+                    t,
+                    i,
+                    pH = ch?ch->GetRowSpacing (0):0,
+                    fromPage = pd.nMinPage,
+                    toPage   = pd.nMaxPage;
+
+
+        if (pd.Flags & PD_PAGENUMS) {
+            fromPage = pd.nFromPage;
+            toPage   = pd.nToPage;
+        }
+        ReleaseDC   (parentWindow, windowDC);
+        hRes = printW*((_Parameter)screenHRes/hRes);
+        vRes = printH*((_Parameter)screenVRes/vRes);
+        screenHRes = printW;
+        screenVRes = printH;
+
+        printW = hRes;
+        printH = vRes;
+        if (ch) {
+            printH -= pH;
+            if (printH <= 0) {
+                _String errMsg ("Table header is too tall to fit on the page.");
+                WarnError (errMsg);
+                terminateExecution = false;
+                EndDoc(pd.hDC);
+                DeleteDC (pd.hDC);
+                return;
+            }
+        }
+
+        _HYRect  relDim = {0,0,0,0,HY_COMPONENT_NO_SCROLL};
+
+        if (ch)
+            for (i=0; i<columns.lLength; i++) {
+                tW += ch->GetColumnSpacing (columns.lData[i]);
+            }
+        else
+            for (i=0; i<columns.lLength; i++) {
+                tW += GetColumnSpacing (columns.lData[i]);
+            }
+
+        relDim.left    = relDim.right   = tW > printW ? printW : tW;
+
+        while ((cP < fromPage)&&SuccessFlag&&(!UserAbortFlag)) {
+            t = 0;
+            while (cC < rows.lLength) {
+                i = GetRowSpacing (rows.lData[cC]);
+                if ( t+i > printH) {
+                    cP ++;
+                    if (i > printH) {
+                        cC++;
+                    }
+                    break;
+                } else {
+                    t += i;
+                    cC ++;
+                }
+            }
+        }
+
+        cE = cC;
+
+        for (long pageCount = fromPage; pageCount<=toPage && (cC < rows.lLength); pageCount++) {
+            t = 0;
+            while (cE < rows.lLength) {
+                i = GetRowSpacing (rows.lData[cE]);
+                if ( t+i > printH) {
+                    if (i > printH) {
+                        t = printH;
+                        cE++;
+                    }
+                    break;
+                } else {
+                    t += i;
+                    cE ++;
+                }
+            }
+
+            relDim.top = relDim.bottom = t+pH;
+
+            _HYTable        *thisPage = new _HYTable (relDim,(Ptr)parentWindow,
+                    cE-cC+(ch?1:0),columns.lLength,20,20,HY_TABLE_STATIC_TEXT);
+
+            checkPointer    (thisPage);
+
+
+            if (StartPage (pd.hDC) <= 0) {
+                SuccessFlag = FALSE;
+                break;
+            }
+
+            SetMapMode  (pd.hDC, MM_ISOTROPIC);
+            SetWindowExtEx (pd.hDC, hRes, vRes,nil);
+            SetViewportExtEx (pd.hDC, screenHRes, screenVRes, nil);
+
+            thisPage->SetFont       (textFont);
+            thisPage->SetBackColor  (backColor);
+            thisPage->SetBackColor2 (backColor2);
+            thisPage->SetTextColor  (textColor);
+
+            if (ch)
+                for (i=0; i<columns.lLength; i++) {
+                    thisPage->SetColumnSpacing (i,ch->GetColumnSpacing (columns.lData[i])-20, false);
+                }
+            else
+                for (i=0; i<columns.lLength; i++) {
+                    thisPage->SetColumnSpacing (i,GetColumnSpacing (columns.lData[i])-20, false);
+                }
+
+            t = 0;
+            if (ch) {
+                thisPage->SetRowSpacing (0,pH-20,false);
+                for (i=0; i<columns.lLength; i++) {
+                    BaseRef cellData = ch->GetCellData(columns.lData[i],0);
+                    cellData->nInstances++;
+                    thisPage->SetCellData(cellData,0,i,ch->cellTypes.lData[columns.lData[i]]&HY_TABLE_DESELECT,false);
+                }
+                t = 1;
+            }
+
+            for (cP = cC; cP < cE; cP++,t++) {
+                long     rI = rows.lData[cP];
+                thisPage->SetRowSpacing (t,GetRowSpacing(rI)-20,false);
+                for (i=0; i<columns.lLength; i++) {
+                    BaseRef cellData = GetCellData(columns.lData[i],rI);
+                    cellData->nInstances++;
+                    thisPage->SetCellData(cellData,t,i,cellTypes.lData[rI*horizontalSpaces.lLength+columns.lData[i]]&HY_TABLE_DESELECT,false);
+                }
+            }
+
+            _HYRect relDim2 = relDim;
+            relDim2.left = relDim2.top = 1;
+            relDim2.right = -relDim2.right-1;
+            relDim2.bottom ++;
+
+            relDim2.width = (long)pd.hDC;
+
+            thisPage->_Paint ((Ptr)&relDim2); // may need to disable double buffering
+
+            RECT wrect = HYRect2Rect (relDim2);
+            
+            FrameRect (pd.hDC, &wrect, _BLACKBRUSH_);
+
+            if (EndPage (pd.hDC) <= 0) {
+                SuccessFlag = FALSE;
+            }
+
+            cC = cE;
+        }
+    } else {
+        SuccessFlag = FALSE;
+    }
+
+    if (SuccessFlag) {
+        SuccessFlag = (EndDoc(pd.hDC)>0);
+    }
+
+    if (!UserAbortFlag) {
+        EnableWindow(parentWindow, TRUE);
+        DestroyWindow(PrintDialogHandle);
+    }
+
+    DeleteDC (pd.hDC);
+
+    if (!SuccessFlag && !UserAbortFlag) {
+        _String errMsg = _String("Failed to print the table. Windows Error:") & (long)GetLastError();
+        ProblemReport (errMsg,nil);
+    }
+}
+
+//__________________________________________________________________
+
+void        _HYPlatformTable::_ResetCursorState (void)
+{
+    SetCursor (LoadCursor (nil, IDC_ARROW));
+    cursorState = 0;
+}
+
+//__________________________________________________________________
+
+void        _HYPlatformTable::_FrameRect        (RECT& theRect)
+{
+    HPEN      aPen = CreatePen (PS_DOT, 1, RGB(0,0,0));
+    HDC       dc   = GetDC (((_HYTable*)this)->parentWindow);
+
+    aPen           = (HPEN)SelectObject (dc, aPen);
+
+    int       saveBkMode = GetBkMode (dc),
+              saveROP2   = GetROP2   (dc);
+
+    SetBkMode (dc, TRANSPARENT);
+    SetROP2   (dc, R2_NOTXORPEN);
+
+
+    Rectangle (dc, theRect.left, theRect.top, theRect.right, theRect.bottom);
+
+    SetBkMode (dc, saveBkMode);
+    SetROP2   (dc, saveROP2);
+
+    DeleteObject (SelectObject (dc, aPen));
+
+    ReleaseDC (((_HYTable*)this)->parentWindow, dc);
+}
+
+
+//EOF
\ No newline at end of file
diff --git a/src/gui/win/Components/HYPlatformTextBox.cpp b/src/gui/win/Components/HYPlatformTextBox.cpp
new file mode 100644
index 0000000..c136e85
--- /dev/null
+++ b/src/gui/win/Components/HYPlatformTextBox.cpp
@@ -0,0 +1,740 @@
+/*
+    Text input box for Win32 API
+
+    Sergei L. Kosakovsky Pond, May 2000-December 2002
+              Revised in December 2003 to use RichEdit
+*/
+
+#include "errorfns.h"
+#include "HYTextbox.h"
+#include "HYUtils.h"
+#include "HYEventTypes.h"
+#include "HYGraphicPane.h"
+#include "HYPlatformWindow.h"
+
+#include "HYDialogs.h"
+//__________________________________________________________________
+
+static LRESULT  CALLBACK editSubclassHandler (HWND WindowHand, UINT iMsg, WPARAM wParam, LPARAM lParam)
+{
+    _HYTextBox * theParent = (_HYTextBox*)GetWindowLongPtr (WindowHand, GWLP_USERDATA);
+
+    if (iMsg == WM_CHAR) {
+        int     keyCode = wParam;
+        if (!(theParent->boxFlags & HY_TB_BIGBOX)) {
+            if ((keyCode==VK_RETURN)||(keyCode==VK_ESCAPE)) {
+                if (theParent->messageRecipient) {
+                    theParent->messageRecipient->ProcessEvent (generateTextEditChangeEvent (theParent->GetID(),2));
+                }
+
+                SendMessage (theParent->parentWindow, WM_CHAR, wParam, lParam);
+                return true;
+            } else if (keyCode==VK_TAB) {
+                SendMessage (theParent->parentWindow, WM_CHAR, wParam, lParam);
+                return true;
+            }
+        }
+    } else if (iMsg == WM_KEYDOWN) {
+        if (theParent->messageRecipient && (theParent->boxFlags & HY_TB_ARROWS)) {
+            if (wParam==VK_DOWN) {
+                theParent->messageRecipient->ProcessEvent (generateTextEditChangeEvent (theParent->GetID(),3));
+                //SendMessage (theParent->parentWindow, WM_CHAR, wParam, lParam);
+                return true;
+            } else if (wParam==VK_UP) {
+                theParent->messageRecipient->ProcessEvent (generateTextEditChangeEvent (theParent->GetID(),4));
+                //SendMessage (theParent->parentWindow, WM_CHAR, wParam, lParam);
+                return true;
+            }
+        }
+    }
+
+    return CallWindowProc ((WNDPROC)theParent->mainHandler, WindowHand, iMsg, wParam, lParam);
+}
+
+//__________________________________________________________________
+
+_HYPlatformTextBox::_HYPlatformTextBox  (void)
+{
+    backFill   = CreateSolidBrush (RGB (255,255,255));
+    checkPointer ((Ptr)backFill);
+    pLabelFont = nil;
+
+
+    textBoxRect.left    = textBoxRect.top   = 0;
+    textBoxRect.bottom  = textBoxRect.right = 100;
+    textColor           = RGB(0,0,0);
+    te                  = nil;
+
+    if (((_HYTextBox*)this)->boxFlags & HY_TB_BIGBOX) {
+        backTFill           = nil;
+        isSingleLine        = false;
+        te = CreateWindowEx (0,RICHEDIT_CLASS,"",ES_MULTILINE|WS_CHILD,30000,30000,100,100,((_HYTextBox*)this)->parentWindow,NULL,ProgramInstance, NULL);
+        if (!te) {
+            long    errCode = GetLastError();
+            LPVOID lpMsgBuf;
+
+            if (FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
+                               NULL,errCode,MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR) &lpMsgBuf,0,NULL )) {
+                FlagError ((LPTSTR) lpMsgBuf);
+            }
+        }
+        SendMessage (te,EM_SETUNDOLIMIT,10,0);
+        SendMessage (te,EM_SETEVENTMASK,0,ENM_CHANGE|ENM_SELCHANGE);
+        SendMessage (te,EM_SETBKGNDCOLOR, 0, (LPARAM)RGB(255,255,255));
+    } else {
+        backTFill  = CreateSolidBrush (RGB (255,255,255));
+        isSingleLine        = true;
+        te = CreateWindow ("EDIT","",/*WS_VISIBLE|*/WS_CHILD,30000,30000,100,100,((_HYTextBox*)this)->parentWindow,NULL,ProgramInstance, NULL);
+    }
+
+    _HYTextBox * theParent = (_HYTextBox*)this;
+    SetWindowLongPtr (te,GWLP_USERDATA, (LONG_PTR)theParent);
+    mainHandler = SetWindowLongPtr (te,GWLP_WNDPROC,(LONG_PTR)editSubclassHandler);
+}
+
+//__________________________________________________________________
+
+_HYPlatformTextBox::~_HYPlatformTextBox (void)
+{
+    DeleteObject (backFill);
+    DeleteObject (backTFill);
+    DeleteObject (pLabelFont);
+}
+
+//__________________________________________________________________
+
+void    _HYPlatformTextBox::_SetBackColor (_HYColor& c)
+{
+    DeleteObject (backFill);
+    backFill = CreateSolidBrush (RGB(c.R,c.G,c.B));
+    checkPointer (backFill);
+}
+
+//__________________________________________________________________
+
+void    _HYPlatformTextBox::_SetBackTColor (_HYColor& c)
+{
+    if (((_HYTextBox*)this)->boxFlags & HY_TB_BIGBOX) {
+        SendMessage (te,EM_SETBKGNDCOLOR,0,(LPARAM)RGB(c.R,c.G,c.B));
+    } else {
+        DeleteObject (backTFill);
+        backTFill = CreateSolidBrush (RGB(c.R,c.G,c.B));
+        checkPointer (backTFill);
+    }
+}
+
+//__________________________________________________________________
+
+void    _HYPlatformTextBox::_SetForeColor (_HYColor& c)
+{
+    textColor = RGB(c.R,c.G,c.B);
+}
+
+//__________________________________________________________________
+
+void    _HYPlatformTextBox::_SetFont (_HYFont& f)
+{
+    if (pLabelFont) {
+        DeleteObject(pLabelFont);
+    }
+
+    pLabelFont = CreateFont (f.size,0,0,0,(f.style&HY_FONT_BOLD)?FW_BOLD:FW_NORMAL,f.style&HY_FONT_ITALIC,FALSE,FALSE,ANSI_CHARSET,OUT_DEFAULT_PRECIS,
+                             CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH|FF_DONTCARE,f.face.sData);
+
+    if (te) {
+        _CreateTE();
+        if (((_HYTextBox *) this)->boxFlags & HY_TB_ENABLED) {
+            ((_HYTextBox *) this)->Activate();
+        }
+    }
+}
+
+//__________________________________________________________________
+void        _HYPlatformTextBox::_Update (Ptr p)
+{
+    _Paint (p);
+}
+
+//__________________________________________________________________
+void        _HYPlatformTextBox::_SetDimensions (_HYRect r, _HYRect rel)
+{
+    _HYTextBox* theParent = (_HYTextBox *) this;
+    theParent->_HYPlatformComponent::_SetDimensions (r,rel);
+    _SetVisibleSize (rel);
+}
+
+
+//__________________________________________________________________
+void        _HYPlatformTextBox::_SetVisibleSize (_HYRect rel)
+{
+    _HYTextBox *theParent = (_HYTextBox*) this;
+
+    textBoxRect.top     = rel.top   + theParent->margins.top;
+    textBoxRect.left    = rel.left  + theParent->margins.left;
+    textBoxRect.bottom  = rel.bottom- theParent->margins.bottom;
+    textBoxRect.right   = rel.right - theParent->margins.right;
+
+    if ((textBoxRect.bottom-textBoxRect.top<theParent->editBoxFont.size+4)||
+            (textBoxRect.right-textBoxRect.left<theParent->editBoxFont.size+4)) {
+        if (te && (! theParent->boxFlags & HY_TB_BIGBOX)) {
+            DestroyWindow (te);
+            te = nil;
+        }
+        return;
+    }
+
+    if (te) {
+        bool          newSL = !_NeedMultiLines ();
+        if (newSL!=isSingleLine) {
+            _CreateTE     ();
+        } else {
+            SetWindowPos(te,nil, textBoxRect.left,textBoxRect.top,textBoxRect.right-textBoxRect.left+1,textBoxRect.bottom-textBoxRect.top+1,SWP_NOZORDER);
+        }
+
+        if (theParent->activationFlag) {
+            ShowWindow(te,SW_SHOWNA);
+        }
+    }
+    //else
+    //_CreateTE ();
+
+}
+
+//__________________________________________________________________
+void        _HYPlatformTextBox::_SetAlignFlags (unsigned char f)
+{
+    if (te)
+        if (((_HYTextBox*)this)->boxFlags & HY_TB_BIGBOX) {
+            PARAFORMAT pf;
+            pf.cbSize = sizeof(PARAFORMAT);
+            pf.dwMask = PFM_ALIGNMENT;
+            switch (f) {
+            case HY_ALIGN_LEFT:
+                pf.wAlignment = PFA_LEFT;
+                break;
+
+            case HY_ALIGN_RIGHT:
+                pf.wAlignment = PFA_RIGHT;
+                break;
+
+            default:
+                pf.wAlignment = PFA_CENTER;
+            }
+            SendMessage (te,EM_SETPARAFORMAT,0,(LPARAM)&pf);
+        } else {
+            _CreateTE     ();
+        }
+}
+//__________________________________________________________________
+
+_String                 retrieveEditControlText (HWND te)
+{
+    if (te) {
+        long stringLength = SendMessage (te,WM_GETTEXTLENGTH,0,0);
+        if (stringLength) {
+            _String     res (stringLength, false);
+            SendMessage (te,WM_GETTEXT, stringLength+1,(LPARAM)res.sData);
+            res.sData[stringLength] = 0;
+            return      res;
+        }
+    }
+    return empty;
+
+}
+
+//__________________________________________________________________
+
+void                    retrieveEditControlText (HWND te, _String*& res)
+{
+    if (te) {
+        long stringLength = SendMessage (te,WM_GETTEXTLENGTH,0,0);
+        if (stringLength) {
+            res = new _String(stringLength, false);
+            SendMessage (te,WM_GETTEXT, stringLength+1,(LPARAM)res->sData);
+        } else {
+            res = new _String;
+        }
+    }
+}
+
+
+//__________________________________________________________________
+_String     _HYPlatformTextBox::_GetText (void)
+{
+    if ((((_HYTextBox*)this)->boxFlags & HY_TB_BIGBOX)) {
+        _String * r;
+        _StoreText (r,false);
+        return _String (r);
+    } else {
+        return retrieveEditControlText(te);
+    }
+}
+
+//__________________________________________________________________
+void    _HYPlatformTextBox::_StoreText (_String*& rec, bool selOnly)
+{
+    if ((((_HYTextBox*)this)->boxFlags & HY_TB_BIGBOX)) {
+        if (selOnly) {
+            long        start,
+                        end;
+            SendMessage (te,EM_GETSEL,(WPARAM)&start,(LPARAM)&end);
+            if (end>=start) {
+                rec = new _String (end-start+1,false);
+                checkPointer (rec);
+                rec->sData[SendMessage (te,EM_GETSELTEXT,0,(LPARAM)rec->sData)] = 0;
+            } else {
+                rec = new _String;
+            }
+        } else {
+            GETTEXTLENGTHEX gtl = {GTL_NUMCHARS,CP_ACP};
+            long l = SendMessage (te,EM_GETTEXTLENGTHEX,(WPARAM)&gtl,0);
+            if (l) {
+                rec = new _String (l,false);
+                checkPointer (rec);
+                TEXTRANGE tr = {{0,l},rec->sData};
+                rec->sData[SendMessage (te,EM_GETTEXTRANGE,0,(LPARAM)&tr)] = 0;
+            } else {
+                rec = new _String;
+            }
+        }
+    } else {
+        retrieveEditControlText(te, rec);
+    }
+}
+
+//__________________________________________________________________
+bool        _HYPlatformTextBox::_NeedMultiLines (void)
+{
+    if (((_HYTextBox*)this)->boxFlags & HY_TB_BIGBOX) {
+        return 1;
+    } else {
+        return (textBoxRect.bottom-textBoxRect.top+1>((_HYTextBox*)this)->editBoxFont.size * 2.5);
+    }
+}
+
+//__________________________________________________________________
+void        _HYPlatformTextBox::_CreateTE (void)
+{
+    _String      currentText;
+
+    if (te) {
+        currentText   = _GetText ();
+        DestroyWindow (te);
+    }
+
+    _HYTextBox * theParent = (_HYTextBox*)this;
+
+    DWORD        windowStyle = 0;
+
+    if (theParent->alignFlags&HY_ALIGN_LEFT) {
+        windowStyle = ES_LEFT;
+    } else if (theParent->alignFlags&HY_ALIGN_RIGHT) {
+        windowStyle = ES_RIGHT;
+    } else {
+        windowStyle = ES_CENTER;
+    }
+
+    if (_NeedMultiLines ()) {
+        isSingleLine = false;
+        windowStyle |= ES_MULTILINE|ES_WANTRETURN|ES_AUTOVSCROLL;
+        if (!(theParent->boxFlags & (HY_TB_WRAP||HY_TB_BIGBOX))) {
+            windowStyle |= ES_AUTOHSCROLL;
+        }
+        if (theParent->boxFlags & HY_TB_BIGBOX) {
+            windowStyle |= WS_VSCROLL;
+        }
+    } else {
+        isSingleLine = true;
+        windowStyle |= ES_AUTOHSCROLL;
+    }
+
+    if ((theParent->boxFlags & HY_TB_ENABLED) == 0) {
+        windowStyle |= ES_READONLY;
+    }
+
+    if (theParent->boxFlags & HY_TB_BIGBOX) {
+        te = CreateWindowEx (0,RICHEDIT_CLASS,currentText.sData,WS_CHILD|windowStyle,
+                             textBoxRect.left,textBoxRect.top,textBoxRect.right-textBoxRect.left+1,textBoxRect.bottom-textBoxRect.top+1
+                             ,theParent->parentWindow,NULL,ProgramInstance, NULL);
+
+        checkPointer   (te);
+        SetWindowLongPtr (te,GWLP_USERDATA, (LONG_PTR)theParent);
+        mainHandler = SetWindowLongPtr (te,GWLP_WNDPROC,(LONG_PTR)editSubclassHandler);
+
+        SendMessage (te,EM_SETUNDOLIMIT,10,0);
+        SendMessage (te,EM_SETEVENTMASK,0,ENM_CHANGE|ENM_SELCHANGE);
+        SendMessage (te,EM_SETBKGNDCOLOR, 0, (LPARAM)RGB(255,255,255));
+
+    } else {
+
+        te = CreateWindow ("EDIT",currentText.sData,/*WS_VISIBLE|*/WS_CHILD|windowStyle,
+                           textBoxRect.left,textBoxRect.top,textBoxRect.right-textBoxRect.left+1,textBoxRect.bottom-textBoxRect.top+1
+                           ,theParent->parentWindow,NULL,ProgramInstance, NULL);
+
+        checkPointer   (te);
+        SetWindowLongPtr (te,GWLP_USERDATA, (LONG_PTR)theParent);
+        mainHandler = SetWindowLongPtr (te,GWLP_WNDPROC,(LONG_PTR)editSubclassHandler);
+
+
+        SendMessage (te, EM_SETMARGINS, EC_LEFTMARGIN, 3);
+        SendMessage (te, EM_SETMARGINS, EC_RIGHTMARGIN, 3);
+    }
+
+
+    if (pLabelFont) {
+        SendMessage (te, WM_SETFONT, (WPARAM)pLabelFont, 1);
+    }
+
+
+}
+
+
+//__________________________________________________________________
+void        _HYPlatformTextBox::_SetText (const _String& editBoxText)
+{
+    _HYTextBox * theParent = (_HYTextBox*)this;
+    if (!te) {
+        _CreateTE();
+    }
+
+    _HYGuiObject* stashRec = theParent->messageRecipient;
+    theParent->SetMessageRecipient (nil);
+    if (theParent->boxFlags & HY_TB_BIGBOX) {
+        SETTEXTEX     stext = {ST_DEFAULT,CP_ACP};
+        SendMessage   (te,EM_SETTEXTEX,(WPARAM)&stext,(LPARAM)editBoxText.sData);
+    } else {
+        SendMessage   (te,WM_SETTEXT,0,(LPARAM)editBoxText.sData);
+    }
+    theParent->SetMessageRecipient (stashRec);
+}
+
+//__________________________________________________________________
+void        _HYPlatformTextBox::_InsertText (const _String& editBoxText, bool append)
+{
+    if (!te) {
+        _SetText (editBoxText);
+    } else {
+        if (append) {
+            SendMessage (te, EM_SETSEL, 0x7fffffff, 0x7ffffff);
+        }
+
+        SendMessage (te, EM_REPLACESEL, 0, (LPARAM)editBoxText.sData);
+
+        if (append) {
+            SendMessage (te, WM_VSCROLL, SB_BOTTOM, 0);
+        }
+
+    }
+}
+
+//__________________________________________________________________
+void        _HYPlatformTextBox::_Paint (Ptr p)
+{
+    _HYTextBox * theParent = (_HYTextBox*)this;
+    _HYRect    * relRect   = (_HYRect*)p;
+
+    RECT         cRect;
+    HDC          hdc       = (HDC)relRect->width;
+
+    if (!(theParent->settings.width&HY_COMPONENT_TRANSP_BG)) {
+        cRect.left   = relRect->left;
+        cRect.right  = relRect->right;
+        cRect.top    = relRect->top;
+        cRect.bottom = relRect->top+theParent->margins.top;
+
+        if (theParent->margins.top) {
+            FillRect (hdc,&cRect,backFill);
+        }
+
+
+        cRect.bottom = relRect->bottom;
+        cRect.top = relRect->bottom-theParent->margins.bottom;
+
+        if (theParent->margins.bottom) {
+            FillRect (hdc,&cRect,backFill);
+        }
+
+        cRect.top    = relRect->top;
+        cRect.bottom = relRect->bottom;
+        cRect.right  = relRect->left+theParent->margins.left;
+
+        if (theParent->margins.left) {
+            FillRect (hdc,&cRect,backFill);
+        }
+
+        cRect.left  = relRect->right-theParent->margins.right;
+        cRect.right  = relRect->right;
+
+        if (theParent->margins.right) {
+            FillRect (hdc,&cRect,backFill);
+        }
+    }
+
+    if (te) {
+        if (theParent->boxFlags & HY_TB_ENABLED) {
+            UpdateWindow (te);
+        }
+    }
+
+    if ((theParent->boxFlags & HY_TB_BIGBOX) == 0) {
+        cRect = textBoxRect;
+        InflateRect (&cRect,2,2);
+        DrawEdge (hdc,&cRect,EDGE_BUMP, BF_RECT);
+    }
+
+    (*theParent)._HYPlatformComponent::_Paint(p);
+}
+
+
+//__________________________________________________________________
+
+void        _HYPlatformTextBox::_EnableTextBox (bool e)
+{
+    if (te)
+        if (e) {
+            SendMessage (te, EM_SETREADONLY, 0, 0);
+        } else {
+            SendMessage (te, EM_SETREADONLY, 1, 0);
+        }
+}
+
+//__________________________________________________________________
+
+void        _HYPlatformTextBox::_FocusComponent (void)
+{
+    if (te) {
+        SetFocus (te);
+    }
+}
+
+//__________________________________________________________________
+
+void        _HYPlatformTextBox::_UnfocusComponent (void)
+{
+}
+
+//__________________________________________________________________
+
+void        _HYTextBox::_Activate (void)
+{
+    _HYPlatformComponent::_Activate();
+    //ReportWarning (_String ("Activated Component ") & (long)GetID());
+    if (te) {
+        //ReportWarning (_String ("Component Alive "));
+        ShowWindow (te, SW_SHOW);
+    }
+}
+
+//__________________________________________________________________
+
+void        _HYTextBox::_IdleHandler (void)
+{
+}
+
+//__________________________________________________________________
+
+void        _HYTextBox::_Deactivate (void)
+{
+}
+
+//__________________________________________________________________
+
+bool _HYTextBox::_ProcessOSEvent (Ptr vEvent)
+{
+    _HYWindowsUIMessage * theEvent = (_HYWindowsUIMessage *)vEvent;
+
+
+    switch (theEvent->iMsg) {
+    case WM_COMMAND: {
+        if ((theEvent->lParam== 0 )&&(boxFlags & HY_TB_FOCUSED)) {
+            switch (LOWORD (theEvent->wParam)) {
+            case HY_WINDOW_MENU_ID_EDIT: { // undo
+                SendMessage (te, EM_UNDO, 0, 0);
+                return true;
+            }
+            case HY_WINDOW_MENU_ID_EDIT+1: { // copy
+                SendMessage (te, WM_COPY, 0, 0);
+                return true;
+            }
+            case HY_WINDOW_MENU_ID_EDIT+2: { // cut
+                SendMessage (te, WM_CUT, 0, 0);
+                return true;
+            }
+            case HY_WINDOW_MENU_ID_EDIT+3: { // cut
+                SendMessage (te, WM_PASTE, 0, 0);
+                return true;
+            }
+            case HY_WINDOW_MENU_ID_EDIT+5: { // select all
+                if (boxFlags & HY_TB_BIGBOX) {
+                    CHARRANGE cr = {0,1};
+                    SendMessage (te, EM_EXSETSEL, 0, (LPARAM)&cr);
+                } else {
+                    SetSelection (0,30000);
+                }
+                return true;
+            }
+            }
+            break;
+        } else {
+            WORD       wP = HIWORD(theEvent->wParam);
+            if ((wP==EN_SETFOCUS)||(wP==EN_CHANGE)) {
+                HWND    cbh = (HWND)theEvent->lParam;
+                if ((cbh == te)&&(boxFlags & HY_TB_ENABLED)) {
+                    if (messageRecipient) {
+                        if (wP==EN_SETFOCUS) {
+                            messageRecipient->ProcessEvent(generateKeyboardFocusEvent(GetID()));
+                        } else {
+                            messageRecipient->ProcessEvent (generateTextEditChangeEvent (GetID(),1));
+                        }
+
+                    }
+                    return true;
+                }
+            }
+        }
+        break;
+    }
+
+    case WM_NOTIFY: {
+        NMHDR * nS = (NMHDR*)theEvent->lParam;
+        if (nS->hwndFrom==te && (boxFlags & HY_TB_ENABLED)) {
+            if (messageRecipient && nS->code == EN_SELCHANGE) {
+                messageRecipient->ProcessEvent (generateTextEditChangeEvent (GetID(),0));
+            }
+        }
+        break;
+    }
+
+    case WM_CTLCOLOREDIT:
+    case WM_CTLCOLORSTATIC: {
+        if (((HWND)theEvent->lParam == te) && (boxFlags & HY_TB_BIGBOX == 0)) {
+            HDC         hdc = (HDC)theEvent->wParam;
+            SetTextColor (hdc,textColor);
+            theEvent->res = (LRESULT)backTFill;
+            return true;
+        }
+        break;
+    }
+
+    }
+    return _HYPlatformComponent::_ProcessOSEvent (vEvent);
+}
+
+//__________________________________________________________________
+
+void    _HYTextBox::_SetSelection (long s, long e)
+{
+    if (te&&(s>=0)&&(e>=s)) {
+        SendMessage (te, EM_SETSEL, s, e);
+        SendMessage (te, EM_SCROLLCARET, 0, 0);
+    }
+
+}
+
+//__________________________________________________________________
+
+void    _HYTextBox::_MarkForUpdate (void)
+{
+    if (te) {
+        RECT tR;
+        GetClientRect (te, &tR);
+        InvalidateRect(te, &tR, true);
+    }
+    _HYPlatformComponent::_MarkForUpdate();
+}
+
+
+//__________________________________________________________________
+
+bool    _HYTextBox::_IsEmpty (void)
+{
+    if (te) {
+        return !SendMessage (te,WM_GETTEXTLENGTH,0,0);
+    }
+    return true;
+}
+
+//__________________________________________________________________
+
+void _HYTextBox::_DoUndo (bool m)
+{
+    SendMessage (te, EM_UNDO, 0, 0);
+    if (m&&messageRecipient) {
+        messageRecipient->ProcessEvent (generateTextEditChangeEvent (GetID(),1));
+    }
+}
+
+//__________________________________________________________________
+
+void _HYTextBox::_DoRedo (bool m)
+{
+    SendMessage (te, EM_REDO, 0, 0);
+    if (m&&messageRecipient) {
+        messageRecipient->ProcessEvent (generateTextEditChangeEvent (GetID(),1));
+    }
+}
+
+//__________________________________________________________________
+
+void _HYTextBox::_DoCut (bool m)
+{
+    SendMessage (te, WM_CUT, 0, 0);
+    if (m&&messageRecipient) {
+        messageRecipient->ProcessEvent (generateTextEditChangeEvent (GetID(),1));
+    }
+}
+
+//__________________________________________________________________
+
+void _HYTextBox::_DoCopy (bool )
+{
+    SendMessage (te, WM_COPY, 0, 0);
+}
+
+//__________________________________________________________________
+
+void _HYTextBox::_DoPaste (bool m)
+{
+    SendMessage (te, WM_PASTE, 0, 0);
+    if (m&&messageRecipient) {
+        messageRecipient->ProcessEvent (generateTextEditChangeEvent (GetID(),1));
+    }
+}
+
+//__________________________________________________________________
+
+void _HYTextBox::_DoSelectAll (bool m)
+{
+    ((_HYTextBox*)this)->SetSelection (0,0x7fffffff);
+    if (m&&messageRecipient) {
+        messageRecipient->ProcessEvent (generateTextEditChangeEvent (GetID(),0));
+    }
+}
+
+//__________________________________________________________________
+
+void _HYTextBox::_DoClear (bool doAll, bool m)
+{
+    if (doAll) {
+        SendMessage (te,WM_SETTEXT,(WPARAM)0,(LPARAM)empty.sData);
+    } else {
+        SendMessage (te,EM_REPLACESEL,(WPARAM)true,(LPARAM)empty.sData);
+    }
+    if (m&&messageRecipient) {
+        messageRecipient->ProcessEvent (generateTextEditChangeEvent (GetID(),1));
+    }
+
+}
+
+//__________________________________________________________________
+
+void _HYTextBox::_DoFind (_String & st)
+{
+    //if (te && (boxFlags & HY_TB_BIGBOX))
+    //{
+
+    //long match = SendMessage (te,
+}
+
+
+//EOF
\ No newline at end of file
diff --git a/src/gui/win/HYPlatformComponent.cpp b/src/gui/win/HYPlatformComponent.cpp
new file mode 100644
index 0000000..e625a61
--- /dev/null
+++ b/src/gui/win/HYPlatformComponent.cpp
@@ -0,0 +1,672 @@
+/*
+    A general composite window component object, Windows specifics
+
+    Sergei L. Kosakovsky Pond, June 2000.
+*/
+
+#include "HYComponent.h"
+#include "HYPlatformComponent.h"
+#include "HYPlatformGraphicPane.h"
+#include "HYWindow.h"
+#include "HYEventTypes.h"
+#include "HYCanvas.h"
+#include "HYUtils.h"
+
+#include "Windows.h"
+
+extern  long           smallScrollStep;
+extern  _HYGuiObject * scrollingWindow;
+extern  bool           hScrollingAction;
+
+bool    forceUpdateForScrolling = false;
+
+
+//__________________________________________________________________________________
+
+void            AlignRectangle (_HYRect& rel , RECT& target , unsigned char alFlags)
+{
+    long     temp;
+    if (alFlags&HY_ALIGN_RIGHT) {
+        temp = target.right-target.left;
+        target.right = rel.right;
+        target.left = target.right - temp;
+    } else if (!(alFlags&HY_ALIGN_LEFT)) {
+        temp = (rel.right-rel.left-target.right+target.left)/2;
+        target.left+=temp;
+        target.right+=temp;
+    }
+
+    if (alFlags&HY_ALIGN_BOTTOM) {
+        temp = target.bottom-target.top;
+        target.bottom = rel.bottom;
+        target.top = target.bottom - temp;
+    } else if (!(alFlags&HY_ALIGN_TOP)) {
+        temp = (rel.bottom-rel.top-target.bottom+target.top)/2;
+        target.top+=temp;
+        target.bottom+=temp;
+    }
+}
+
+//__________________________________________________________________
+
+_HYPlatformComponent::_HYPlatformComponent(void)
+{
+    vScroll = hScroll = nil;
+    scrollState = 0;
+}
+
+//__________________________________________________________________
+
+_HYPlatformComponent::_HYPlatformComponent(_HYRect s,Ptr w)
+{
+    bool    memError = false;
+    vScroll = hScroll = nil;
+    parentWindow = (HWND)w;
+    if (s.width&HY_COMPONENT_H_SCROLL) {
+        hScroll = CreateWindow ("SCROLLBAR","",SBS_HORZ|WS_CHILD|WS_VISIBLE,0,0,100,HY_SCROLLER_WIDTH,parentWindow,NULL,GetModuleHandle (NULL), NULL);
+        if (!hScroll) {
+            memError = true;
+        } else {
+            SetScrollRange (hScroll,SB_CTL,0,MAX_CONTROL_VALUE,FALSE);
+        }
+    }
+    if (s.width&HY_COMPONENT_V_SCROLL) {
+        vScroll = CreateWindow ("SCROLLBAR","",SBS_VERT|WS_CHILD|WS_VISIBLE,0,0,HY_SCROLLER_WIDTH,100,parentWindow,NULL,GetModuleHandle (NULL), NULL);
+        if (!vScroll) {
+            memError = true;
+        } else {
+            SetScrollRange (vScroll,SB_CTL,0,MAX_CONTROL_VALUE,FALSE);
+        }
+    }
+    if (memError) {
+        _String errMsg = "Could not allocate memory for a window component structure.";
+        FlagError (errMsg);
+    }
+}
+
+//__________________________________________________________________
+
+void _HYPlatformComponent::_CleanUp(void)
+{
+}
+
+//__________________________________________________________________
+long        _HYPlatformComponent::_GetHScrollerPos (void)
+{
+    if (hScroll) {
+        SCROLLINFO  sI;
+        sI.cbSize = sizeof (SCROLLINFO);
+        sI.fMask  = SIF_POS|SIF_PAGE;
+
+        GetScrollInfo (hScroll, SB_CTL, &sI);
+
+        return        (sI.nPos*(_Parameter)MAX_CONTROL_VALUE)/((_Parameter)MAX_CONTROL_VALUE-(_Parameter)sI.nPage);
+    } else {
+        return 0;
+    }
+}
+//__________________________________________________________________
+long        _HYPlatformComponent::_GetVScrollerPos (void)
+{
+    if (vScroll) {
+        SCROLLINFO  sI;
+        sI.cbSize = sizeof (SCROLLINFO);
+        sI.fMask  = SIF_POS|SIF_PAGE;
+
+        GetScrollInfo (vScroll, SB_CTL, &sI);
+
+        return (sI.nPos*(_Parameter)MAX_CONTROL_VALUE)/((_Parameter)MAX_CONTROL_VALUE-sI.nPage);
+        //printf ("%d %d %d\n", sI.nPos, sI.nPage, (long)res);
+
+    } else {
+        return 0;
+    }
+}
+
+//__________________________________________________________________
+void        _HYPlatformComponent::_SetHScrollerPos (long nv)
+{
+    if (hScroll&&(scrollState & HY_COMPONENT_ENABLE_H_SCROLL)) {
+        if (nv<0) {
+            nv = 0;
+        } else if (nv>MAX_CONTROL_VALUE) {
+            nv = MAX_CONTROL_VALUE;
+        }
+
+        SCROLLINFO  sI;
+        sI.cbSize = sizeof (SCROLLINFO);
+        sI.fMask  = SIF_POS|SIF_PAGE;
+
+        GetScrollInfo (hScroll, SB_CTL, &sI);
+
+        sI.nPos = (nv*((_Parameter)MAX_CONTROL_VALUE-(_Parameter)sI.nPage))/(_Parameter)MAX_CONTROL_VALUE;
+
+        //printf (">%d %d %d\n", nv, sI.nPos,sI.nPage);
+
+        sI.fMask  = SIF_POS;
+        SetScrollInfo (hScroll, SB_CTL, &sI, true);
+
+    }
+}
+
+//__________________________________________________________________
+void        _HYPlatformComponent::_SetVScrollerPos (long nv)
+{
+    if (vScroll&&(scrollState & HY_COMPONENT_ENABLE_V_SCROLL)) {
+        if (nv<0) {
+            nv = 0;
+        } else if (nv>MAX_CONTROL_VALUE) {
+            nv = MAX_CONTROL_VALUE;
+        }
+
+        SCROLLINFO  sI;
+        sI.cbSize = sizeof (SCROLLINFO);
+        sI.fMask  = SIF_POS|SIF_PAGE;
+
+        GetScrollInfo (vScroll, SB_CTL, &sI);
+
+        sI.nPos = (nv*((_Parameter)MAX_CONTROL_VALUE-(_Parameter)sI.nPage))/(_Parameter)MAX_CONTROL_VALUE;
+
+        sI.fMask  = SIF_POS;
+        SetScrollInfo (vScroll, SB_CTL, &sI, true);
+        //printf ("%d %d\n", nv, sI.nPos);
+
+    }
+}
+
+//__________________________________________________________________
+void _HYPlatformComponent::Duplicate (BaseRef s)
+{
+    _HYComponent* theS = (_HYComponent*)s;
+    _CleanUp();
+    hScroll = theS->hScroll;
+    vScroll = theS->vScroll;
+}
+
+//__________________________________________________________________
+void _HYPlatformComponent::_SetDimensions (_HYRect d,_HYRect r)
+{
+    _SetVisibleSize (r);
+}
+
+//__________________________________________________________________
+void _HYPlatformComponent::_MarkForUpdate (void)
+{
+    RECT inv;
+    inv.left = rel.left;
+    inv.right = rel.right;
+    inv.bottom = rel.bottom;
+    inv.top = rel.top;
+
+    if (forceUpdateForScrolling) {
+        _HYRect invR = {inv.top, inv.left, inv.bottom, inv.right, (long)GetDC (parentWindow)};
+        ((_HYComponent*)this)->Paint ((Ptr)&invR);
+        ReleaseDC (parentWindow, (HDC)invR.width);
+    } else {
+        InvalidateRect (parentWindow,&inv, ((_HYComponent*)this)->settings.width&HY_COMPONENT_TRANSP_BG);
+    }
+}
+
+//__________________________________________________________________
+
+void _HYPlatformComponent::_MarkContentsForUpdate (void)
+{
+    RECT inv;
+    inv.left = rel.left;
+    inv.right = rel.right;
+    inv.bottom = rel.bottom;
+    inv.top = rel.top;
+    if (hScroll) {
+        inv.bottom -= HY_SCROLLER_WIDTH;
+    }
+    if (vScroll) {
+        inv.right -= HY_SCROLLER_WIDTH;
+    }
+    InvalidateRect (parentWindow,&inv, false);
+}
+
+//__________________________________________________________________
+
+void        _HYPlatformComponent::_SetVisibleSize (_HYRect r)
+{
+    _HYComponent * theParent = (_HYComponent*)this;
+    SCROLLINFO     si;
+    long           t,v;
+
+    _Parameter     newSize;
+
+    scrollState = 0;
+
+    si.cbSize = sizeof (SCROLLINFO);
+
+    if (hScroll&&!vScroll) { // only horizontal scroll bar
+        SetWindowPos (hScroll,NULL,r.left,r.bottom-HY_SCROLLER_WIDTH,r.right-r.left+1,HY_SCROLLER_WIDTH,SWP_NOZORDER);
+
+        t = theParent->GetMaxW();
+        v = r.right-r.left+1;
+
+        if (t>v) {
+            si.fMask = SIF_ALL;
+            GetScrollInfo (hScroll, SB_CTL, & si);
+
+            newSize = MAX_CONTROL_VALUE*(_Parameter)v/t;
+            si.nPage = newSize;
+
+            SetScrollInfo  (hScroll,SB_CTL,&si,true);
+            EnableScrollBar(hScroll,SB_CTL,ESB_ENABLE_BOTH);
+            ShowScrollBar  (hScroll,SB_CTL,true);
+            scrollState |= HY_COMPONENT_ENABLE_H_SCROLL;
+
+        } else {
+            EnableScrollBar(hScroll,SB_CTL,ESB_DISABLE_BOTH);
+            ShowScrollBar  (hScroll,SB_CTL,false);
+        }
+
+    }
+    if (vScroll&&!hScroll) { // only vertical scroll bar
+        SetWindowPos (vScroll,NULL,r.right-HY_SCROLLER_WIDTH,r.top,HY_SCROLLER_WIDTH,r.bottom-r.top+1,SWP_NOZORDER);
+
+        t = theParent->GetMaxH();
+        v = r.bottom-r.top+1;
+
+        if (t>v) {
+            si.fMask = SIF_ALL;
+            GetScrollInfo (vScroll, SB_CTL, & si);
+
+            newSize = MAX_CONTROL_VALUE*(_Parameter)v/t;
+            si.nPage = newSize;
+
+            SetScrollInfo  (vScroll,SB_CTL,&si,false);
+            EnableScrollBar(vScroll,SB_CTL,ESB_ENABLE_BOTH);
+            ShowScrollBar  (hScroll,SB_CTL,true);
+            scrollState |= HY_COMPONENT_ENABLE_V_SCROLL;
+        } else {
+            EnableScrollBar(vScroll,SB_CTL,ESB_DISABLE_BOTH);
+            ShowScrollBar  (hScroll,SB_CTL,false);
+        }
+    }
+    if (vScroll&&hScroll) {
+        SetWindowPos (hScroll,NULL,r.left,r.bottom-HY_SCROLLER_WIDTH,r.right-r.left-HY_SCROLLER_WIDTH,HY_SCROLLER_WIDTH,SWP_NOZORDER|SWP_NOACTIVATE);
+
+        t = theParent->GetMaxW();
+        v = r.right-r.left+1+HY_SCROLLER_WIDTH;
+
+        if (t>v) {
+            si.fMask = SIF_ALL;
+            GetScrollInfo (hScroll, SB_CTL, & si);
+
+            newSize = MAX_CONTROL_VALUE*(_Parameter)v/t;
+            si.nPage = newSize;
+
+            SetScrollInfo  (hScroll,SB_CTL,&si,true);
+            EnableScrollBar(hScroll,SB_CTL,ESB_ENABLE_BOTH);
+            ShowScrollBar  (hScroll,SB_CTL,true);
+            scrollState |= HY_COMPONENT_ENABLE_H_SCROLL;
+        } else {
+
+            EnableScrollBar(hScroll,SB_CTL,ESB_DISABLE_BOTH);
+            ShowScrollBar  (hScroll,SB_CTL,false);
+        }
+
+        SetWindowPos (vScroll,NULL,r.right-HY_SCROLLER_WIDTH,r.top,HY_SCROLLER_WIDTH,r.bottom-r.top+1,SWP_NOZORDER);
+
+        t = theParent->GetMaxH();
+        v = r.bottom-r.top+1+HY_SCROLLER_WIDTH;
+
+        if (t>v) {
+            si.fMask = SIF_ALL;
+            GetScrollInfo (vScroll, SB_CTL, & si);
+
+            newSize = MAX_CONTROL_VALUE*(_Parameter)v/t;
+            si.nPage = newSize;
+
+            SetScrollInfo  (vScroll,SB_CTL,&si,false);
+            EnableScrollBar(vScroll,SB_CTL,ESB_ENABLE_BOTH);
+            ShowScrollBar  (hScroll,SB_CTL,true);
+            scrollState |= HY_COMPONENT_ENABLE_V_SCROLL;
+        } else {
+            EnableScrollBar(vScroll,SB_CTL,ESB_DISABLE_BOTH);
+            ShowScrollBar  (vScroll,SB_CTL,false);
+        }
+    }
+    rel = r;
+}
+//__________________________________________________________________
+
+void        _HYPlatformComponent::_Paint (Ptr p)
+{
+    if (hScroll) {
+        ShowScrollBar(hScroll,SB_CTL,TRUE);
+    }
+    if (vScroll) {
+        ShowScrollBar(vScroll,SB_CTL,TRUE);
+    }
+    _HYComponent* parent = (_HYComponent*)this;
+
+    if (parent->settings.width&HY_COMPONENT_BORDER) {
+        HDC      theDC = (HDC)((_HYRect*)p)->width;
+
+        HPEN     blackPen = CreatePen (PS_SOLID, 1, RGB (0,0,0)),
+                 oldPen   = (HPEN)SelectObject (theDC, blackPen);
+
+        MoveToEx (theDC,rel.left,rel.top,nil);
+
+        if (parent->settings.width&HY_COMPONENT_BORDER_T) {
+            LineTo (theDC,rel.right,rel.top);
+        }
+
+        MoveToEx (theDC,rel.right-1,rel.top,nil);
+
+        if (parent->settings.width&HY_COMPONENT_BORDER_R) {
+            LineTo (theDC,rel.right-1,rel.bottom);
+        }
+
+        MoveToEx (theDC,rel.right,rel.bottom-1,nil);
+
+        if (parent->settings.width&HY_COMPONENT_BORDER_B) {
+            LineTo (theDC,rel.left-1,rel.bottom-1);
+        }
+
+        MoveToEx (theDC,rel.left,rel.bottom,nil);
+
+        if (parent->settings.width&HY_COMPONENT_BORDER_L) {
+            LineTo (theDC,rel.left,rel.top-1);
+        }
+
+        SelectObject (theDC, oldPen);
+        DeleteObject (blackPen);
+
+        /*UINT  bFlags = 0;
+
+        if (parent->settings.width&HY_COMPONENT_BORDER_T)
+            bFlags |= BF_TOP;
+
+        if (parent->settings.width&HY_COMPONENT_BORDER_R)
+            bFlags |= BF_RIGHT;
+
+        if (parent->settings.width&HY_COMPONENT_BORDER_B)
+            bFlags |= BF_BOTTOM;
+
+        if (parent->settings.width&HY_COMPONENT_BORDER_L)
+            bFlags |= BF_LEFT;
+
+        RECT     rr    =  HYRect2Rect (rel);
+        DrawEdge (theDC,&rr,EDGE_RAISED, bFlags);*/
+
+    }
+
+    if (parent->settings.width&HY_COMPONENT_WELL) {
+        HDC      theDC = (HDC)((_HYRect*)p)->width;
+
+        RECT     rr    =  HYRect2Rect (rel);
+        InflateRect (&rr,-2,-2);
+        DrawEdge (theDC,&rr,EDGE_SUNKEN, BF_RECT);
+
+    }
+}
+
+//__________________________________________________________________
+
+void      _HYPlatformComponent::_Update (Ptr p)
+{
+    _Paint (p);
+}
+
+//__________________________________________________________________
+
+void        _HYPlatformComponent::_Activate (void)
+{
+    _HYComponent*   theParent = (_HYComponent*)this;
+    if (hScroll) {
+        if (theParent->GetMaxW()>theParent->rel.right-theParent->rel.left+1+HY_SCROLLER_WIDTH) {
+            scrollState |= HY_COMPONENT_ENABLE_H_SCROLL;
+            EnableScrollBar(hScroll,SB_CTL,ESB_ENABLE_BOTH);
+        }
+    }
+    if (vScroll) {
+        if (theParent->GetMaxH()>theParent->rel.bottom-theParent->rel.top+1+HY_SCROLLER_WIDTH) {
+            scrollState |= HY_COMPONENT_ENABLE_V_SCROLL;
+            EnableScrollBar(vScroll,SB_CTL,ESB_ENABLE_BOTH);
+        }
+    }
+    activationFlag = true;
+}
+
+//__________________________________________________________________
+
+void        _HYPlatformComponent::_Deactivate (void)
+{
+    if (hScroll) {
+        EnableScrollBar(hScroll,SB_CTL,ESB_DISABLE_BOTH);
+    }
+    if (vScroll) {
+        EnableScrollBar(vScroll,SB_CTL,ESB_DISABLE_BOTH);
+    }
+
+    scrollState = 0;
+
+    activationFlag = false;
+}
+
+//__________________________________________________________________
+
+bool _HYPlatformComponent::_ProcessOSEvent (Ptr vEvent)
+{
+    _HYWindowsUIMessage * theEvent = (_HYWindowsUIMessage *)vEvent;
+    switch (theEvent->iMsg) {
+    case WM_HSCROLL:
+    case WM_VSCROLL: {
+        if((((HWND)(theEvent->lParam))==hScroll)||(((HWND)(theEvent->lParam))==vScroll)) {
+            _HYComponent* theParent = (_HYComponent*)this;
+
+            long       invisPixels,
+                       currentValue,
+                       oldValue;
+
+            if (theEvent->iMsg == WM_HSCROLL) {
+                invisPixels = theParent->GetMaxW()-(theParent->GetHSize());
+                currentValue = _GetHScrollerPos();
+            } else {
+                invisPixels = theParent->GetMaxH()-(theParent->GetVSize());
+                currentValue = _GetVScrollerPos();
+            }
+
+
+            oldValue = currentValue;
+            invisPixels = (_Parameter)MAX_CONTROL_VALUE/invisPixels;
+            if (!invisPixels) {
+                invisPixels = 1;
+            }
+
+            switch (LOWORD(theEvent->wParam)) {
+            case SB_LINEUP:
+                currentValue-=invisPixels;
+                break;
+            case SB_LINEDOWN:
+                currentValue+=invisPixels;
+                break;
+            case SB_PAGEUP:
+                currentValue-=100*invisPixels;
+                break;
+            case SB_PAGEDOWN:
+                currentValue+=100*invisPixels;
+                break;
+            case SB_THUMBPOSITION:
+            case SB_THUMBTRACK: {
+
+                SCROLLINFO  sI;
+                sI.cbSize = sizeof (SCROLLINFO);
+                sI.fMask  = SIF_PAGE|SIF_TRACKPOS;
+                if (theEvent->iMsg == WM_HSCROLL) {
+                    GetScrollInfo (hScroll, SB_CTL, &sI);
+                } else {
+                    GetScrollInfo (vScroll, SB_CTL, &sI);
+                }
+
+                currentValue =  sI.nTrackPos;
+
+                currentValue = (currentValue*(_Parameter)MAX_CONTROL_VALUE)/(MAX_CONTROL_VALUE-(_Parameter)sI.nPage);
+                break;
+            }
+            case SB_TOP:
+                currentValue = 0;
+                break;
+            case  SB_BOTTOM:
+                currentValue = MAX_CONTROL_VALUE;
+                break;
+            default:
+                return true;
+            }
+
+            if (currentValue<0) {
+                currentValue = 0;
+            }
+            if (currentValue>MAX_CONTROL_VALUE) {
+                currentValue = MAX_CONTROL_VALUE;
+            }
+
+            if (currentValue!=oldValue) {
+                if (theEvent->iMsg == WM_HSCROLL) {
+                    _SetHScrollerPos (currentValue);
+                    theParent->ProcessEvent (generateScrollEvent (currentValue-oldValue,0));
+                } else {
+                    _SetVScrollerPos (currentValue);
+                    theParent->ProcessEvent (generateScrollEvent (0,currentValue-oldValue));
+                }
+            }
+            return true;
+        }
+        break;
+    }
+    }
+    return false;
+}
+
+//__________________________________________________________________
+
+
+_HYRect _HYPlatformComponent::_VisibleContents (Ptr p)
+{
+    _HYComponent* theParent = (_HYComponent*)this;
+    _HYRect     * r = (_HYRect*)p,
+                  res;
+
+    short v;
+    short windowW=r->right-r->left,
+          windowH=r->bottom-r->top;
+    if ((!hScroll)&&(!vScroll)) {
+        res.left = theParent->hOrigin;
+        res.right = res.left+windowW;
+        res.top = theParent->vOrigin;
+        res.bottom = res.top+windowH;
+        return res;
+    }
+    if (hScroll) {
+        windowH-=HY_SCROLLER_WIDTH;
+    }
+    if (vScroll) {
+        windowW-=HY_SCROLLER_WIDTH;
+    }
+    if (hScroll) {
+        if (windowW>theParent->GetMaxW()) {
+            res.left = 0;
+            res.right = theParent->GetMaxW();
+        } else {
+            v = GetScrollPos (hScroll,SB_CTL);
+            res.left = (theParent->GetMaxW()-windowW)*v/(_Parameter)MAX_CONTROL_VALUE;
+            res.right = res.left+windowW;
+        }
+    } else {
+        res.left = 0;
+        res.right = windowW;
+    }
+    if (vScroll) {
+        if (windowH>theParent->GetMaxH()) {
+            res.top = 0;
+            res.bottom = theParent->GetMaxH();
+        } else {
+            v = GetScrollPos (vScroll,SB_CTL);
+            res.top = (theParent->GetMaxH()-windowH)*v/(_Parameter)MAX_CONTROL_VALUE;
+            res.bottom = res.top+windowH;
+        }
+    } else {
+        res.top = 0;
+        res.bottom = windowH;
+    }
+    return res;
+}
+
+//__________________________________________________________________
+
+void    _HYCanvas::_Paint (Ptr p)
+{
+    _HYPlatformComponent::_Paint(p);
+    _HYRect * destR = (_HYRect*)p;
+    HDC pDC = (HDC)destR->width;
+    RECT srcRect,destRect;
+    destRect.right = destR->right;
+    destRect.bottom = destR->bottom;
+    if (HasHScroll()) {
+        destRect.bottom-=HY_SCROLLER_WIDTH;
+    }
+    if (HasVScroll()) {
+        destRect.right-=HY_SCROLLER_WIDTH;
+    }
+    destRect.left = destR->left;
+    destRect.top = destR->top;
+    _HYRect srcR = _VisibleContents (p);
+    srcRect.right = srcR.right;
+    srcRect.left = srcR.left;
+    srcRect.top = srcR.top;
+    srcRect.bottom = srcR.bottom;
+//  printf ("\n%d %d %d %d %d %d %d %d\n",srcRect.top, srcRect.left, srcRect.bottom,srcRect.right,
+//                                        destRect.top, destRect.left, destRect.bottom,destRect.right);
+    BitBlt (pDC,destRect.left,destRect.top,srcRect.right-srcRect.left,srcRect.bottom-srcRect.top,
+            thePane,srcRect.left,srcRect.top,SRCCOPY);
+}
+
+//__________________________________________________________________
+
+void    _HYCanvas::_Update (Ptr p)
+{
+    _Paint(p);
+}
+
+//__________________________________________________________________
+
+bool _HYCanvas::_ProcessOSEvent (Ptr vEvent)
+{
+    _HYWindowsUIMessage*    theEvent = (_HYWindowsUIMessage*)vEvent;
+
+    switch (theEvent->iMsg) {
+    case WM_RBUTTONDOWN: {
+        _String s ("Save as picture");
+        _List   l;
+        l && & s;
+
+        POINT loc = {(short)LOWORD (theEvent->lParam),(short)HIWORD (theEvent->lParam)};
+        ClientToScreen (parentWindow, &loc);
+
+        _String pulldownValue = HandlePullDown (l,loc.x,loc.y,0);
+        switch (l.Find(&pulldownValue)) {
+        case 0:
+            s = "Save picture";
+            _SavePicture (s);
+            return true;
+        }
+        break;
+    }
+    case WM_LBUTTONDOWN: {
+        if ((messageRecipient)&&(doMouseClicks)) {
+            messageRecipient->ProcessEvent(generateContextPopUpEvent (GetID(),LOWORD(theEvent->lParam)-rel.left,
+                                           HIWORD(theEvent->lParam)-rel.top));
+            return true;
+        }
+        break;
+    }
+    }
+    return false;
+}
+
+
+//EOF
\ No newline at end of file
diff --git a/src/gui/win/HYPlatformGraphicPane.cpp b/src/gui/win/HYPlatformGraphicPane.cpp
new file mode 100644
index 0000000..a37bebb
--- /dev/null
+++ b/src/gui/win/HYPlatformGraphicPane.cpp
@@ -0,0 +1 @@
+/*
    A painting canvas with double buffer. Windows.

    Sergei L. Kosakovsky Pond, June 2000-June 2002.
*/

#include "HYGraphicPane.h"
#include "HYComponent.h"
//#include "HYPulldown.h"
#include "HYUtils.h"

#include "math.h"

HBRUSH    bgBrush = CreateSolidBrush (GetSysColor (COLOR_WINDOW));
#define   SQR(A) (A)*(A)

//__________________________________________________________________

RECT    HYRect2Rect (_HYRect& hr)
{
    RECT r;
    r.left = hr.left;
    r.right = hr.right;
    r.top = hr.top;
    r.bottom = hr.bottom;
    return r;
}

//__________________________________________________________________

COLORREF  HYColor2ColorRef (_HYColor&hc, HDC thePane)
{
    return GetNearestColor(thePane,RGB(hc.R,hc.G,hc.B));
}
//__________________________________________________________________

_HYPlatformGraphicPane::_HYPlatformGraphicPane(int h, int w, int d)
{
    thePane = CreateCompatibleDC(0);
    if (thePane) {
        if (d<=1) {
            paneBitMap = CreateCompatibleBitmap(thePane,w,h);
        } else {
            paneBitMap = CreateCompatibleBitmap(GetDC(NULL),w,h);
        }

        if (paneBitMap) {
            oldMap = (HBITMAP)SelectObject (thePane,paneBitMap);
        }
    }
    if ((!thePane)||(!paneBitMap)) {
        _String errMsg = _String("Windows Error ") & (long)GetLastError() & (" while trying to allocate memory for GraphicPane");
        FlagError (errMsg);
    }
    fillColor = NULL;
    backColor = NULL;
    oldFont   = NULL;
    oldBrush  = NULL;
    oldPen    = NULL;

    SetBkMode (thePane, TRANSPARENT);
}

//__________________________________________________________________

_HYPlatformGraphicPane::~_HYPlatformGraphicPane(void)
{
    if (oldMap) {
        DeleteObject (SelectObject (thePane,oldMap));
    }
    if (oldFont) {
        DeleteObject (SelectObject (thePane,oldFont));
    }
    if (oldPen) {
        DeleteObject (SelectObject (thePane,oldPen));
    }
    if (oldBrush) {
        DeleteObject (SelectObject (thePane,oldBrush));
    }
    DeleteDC         (thePane);
    if (fillColor) {
        DeleteObject (fillColor);
    }
    if (fillColor) {
        DeleteObject (backColor);
    }
    //DeleteObject   (paneBitMap);
}

//__________________________________________________________________

void _HYPlatformGraphicPane::_SetPaneSize  (int h,int w, int d)
{
    SelectObject (thePane,oldBrush);
    //DeleteDC (thePane);
    DeleteObject (paneBitMap);
    if (fillColor) {
        DeleteObject (fillColor);
    }

    //thePane = CreateCompatibleDC(NULL);
    if (thePane) {
        if (d<=1) {
            paneBitMap = CreateCompatibleBitmap(thePane,w,h);
        } else {
            paneBitMap = CreateCompatibleBitmap(GetDC(NULL),w,h);
        }

        /*BITMAPINFOHEADER bih;
        bih.biSize   = sizeof (BITMAPINFOHEADER);
        bih.biWidth  = w;
        bih.biHeight = h;
        bih.biPlanes = 1;
        bih.biBitCount = d;
        bih.biCompression = BI_RGB;
        bih.biSizeImage   = 0;
        bih.biXPelsPerMeter = bih.biYPelsPerMeter = 72 * 100/2.54;
        bih.biClrUsed = 0;
        bih.biClrImportant = 0;

        paneBitMap = CreateDIBitmap (thePane, & bih, 0, nil, nil, DIB_RGB_COLORS);*/

        if (paneBitMap) {
            DeleteObject ((HBITMAP)SelectObject (thePane,paneBitMap));
            fillColor = NULL;
        }
    }

    //printf ("Resize bitmap\n");

    if ((!thePane)||(!paneBitMap)) {
        _String errMsg = _String("Windows Error ") & (long)GetLastError() & (" while trying to resize GraphicPane");

        if (!thePane) {
            errMsg = errMsg & ". Failed to create DC.";
        } else {
            errMsg = errMsg & ". Failed to create bitmap.";
        }

        FlagError (errMsg);
    }
}

//__________________________________________________________________

void _HYPlatformGraphicPane::CheckPen (_HYRect& r, bool force)
{
    _HYGraphicPane * theParent = (_HYGraphicPane*)this;
    if (force||(r.width!=lastPenSize)) {
        lastPenSize = r.width;
        HPEN        newPen = (HPEN)CreatePen (PS_SOLID,lastPenSize,HYColor2ColorRef (theParent->color,thePane));
        if (oldPen) {
            DeleteObject ((HPEN)SelectObject(thePane,newPen));
        } else {
            oldPen = (HPEN)SelectObject(thePane,newPen);
        }
    }
}

//__________________________________________________________________

void _HYPlatformGraphicPane::_DrawLine (_HYRect lineDesc)
{
    CheckPen (lineDesc);
    MoveToEx  (thePane, lineDesc.left, lineDesc.top, NULL);
    LineTo  (thePane,lineDesc.right,lineDesc.bottom);
}

//__________________________________________________________________

void _HYPlatformGraphicPane::_DrawHatchedLine (_HYRect lineDesc)
{
    _HYGraphicPane * theParent = (_HYGraphicPane*)this;
    HPEN    newPen = (HPEN)CreatePen (PS_DOT,1,HYColor2ColorRef (theParent->color,thePane));
    HPEN    savePen = ((HPEN)SelectObject(thePane,newPen));
    MoveToEx  (thePane, lineDesc.left, lineDesc.top, NULL);
    LineTo  (thePane,lineDesc.right,lineDesc.bottom);
    DeleteObject (SelectObject (thePane,savePen));
}

//__________________________________________________________________
void _HYPlatformGraphicPane::_DisplayText    (_String theText,int t, int l, bool dir)
{
    SetTextAlign (thePane,TA_BASELINE);
    TextOut(thePane,l,t,theText.sData,theText.sLength);
}

//__________________________________________________________________
void _HYPlatformGraphicPane::_DisplayText    (_String& theText,_HYRect& r, char align)
{
    RECT    tb = HYRect2Rect (r);

    tb.top  += ((_HYGraphicPane*)this)->font.size;
    tb.left += ((_HYGraphicPane*)this)->font.size/3;

    _EraseRect (r);

    DrawText (thePane,
              theText.sData,
              theText.sLength,
              &tb,
              DT_NOCLIP|DT_WORDBREAK|DT_END_ELLIPSIS|
              ((align==HY_ALIGN_LEFT)?DT_LEFT:
               (align==HY_ALIGN_RIGHT?DT_RIGHT:DT_CENTER)));
}

//__________________________________________________________________
void _HYPlatformGraphicPane::_DisplayChar  (char c,int t, int l)
{
    SetTextAlign (thePane,TA_BASELINE);
    TextOut(thePane,l,t,&c,1);
}

//__________________________________________________________________

void _HYPlatformGraphicPane::_DrawRect (_HYRect rectDesc)
{
    CheckPen (rectDesc);

    rectDesc.right-=rectDesc.width;
    rectDesc.bottom-=rectDesc.width;
    MoveToEx (thePane,rectDesc.left,rectDesc.top,NULL);
    LineTo(thePane,rectDesc.right,rectDesc.top);
    LineTo(thePane,rectDesc.right,rectDesc.bottom);
    LineTo(thePane,rectDesc.left,rectDesc.bottom);
    LineTo(thePane,rectDesc.left,rectDesc.top);
}
//__________________________________________________________________

void _HYPlatformGraphicPane::_FillRect (_HYRect rectDesc)
{
    RECT    r= HYRect2Rect (rectDesc);
    FillRect (thePane,&r,fillColor);
}

//__________________________________________________________________

void _HYPlatformGraphicPane::_EraseRect (_HYRect rectDesc)
{
    RECT    r= HYRect2Rect (rectDesc);
    FillRect (thePane,&r,backColor);
}

//__________________________________________________________________

void _HYPlatformGraphicPane::_DrawOval (_HYRect rectDesc)
{
    CheckPen (rectDesc);
    SelectObject (thePane,backColor);
    Ellipse (thePane,rectDesc.left,rectDesc.top,rectDesc.right,rectDesc.bottom);
    SelectObject (thePane,fillColor);
}
//__________________________________________________________________

void _HYPlatformGraphicPane::_FillOval (_HYRect rectDesc)
{
    CheckPen (rectDesc);
    Ellipse (thePane,rectDesc.left,rectDesc.top,rectDesc.right,rectDesc.bottom);
}

//__________________________________________________________________

void _HYPlatformGraphicPane::_EraseOval (_HYRect rectDesc)
{
    // TBI
}

//__________________________________________________________________

void _HYPlatformGraphicPane::_DrawArc (_HYRect rectDesc, int s, int f)
{
    CheckPen (rectDesc);
    _Parameter  startA = s*3.1415926/180, endA = (s+f)*3.1415926/180,
                diag = .5*sqrt(SQR(rectDesc.right-rectDesc.left)+
                               SQR(rectDesc.bottom-rectDesc.top));
    int         sX =   (rectDesc.right+rectDesc.left)/2+diag*sin(startA),
                sY =   (rectDesc.bottom+rectDesc.top)/2-diag*cos(startA),
                fX =   (rectDesc.right+rectDesc.left)/2+diag*sin(endA),
                fY =   (rectDesc.bottom+rectDesc.top)/2-diag*cos(endA);

    if (f<0) {
        SetArcDirection (thePane,AD_COUNTERCLOCKWISE);
        Arc (thePane,rectDesc.left,rectDesc.top,rectDesc.right,rectDesc.bottom,
             sX,sY,fX,fY);
    } else {
        SetArcDirection (thePane,AD_CLOCKWISE);
        Arc (thePane,rectDesc.left,rectDesc.top,rectDesc.right,rectDesc.bottom,
             fX,fY,sX,sY);
    }

}
//__________________________________________________________________

void _HYPlatformGraphicPane::_FillArc (_HYRect rectDesc, int s, int f)
{
    CheckPen (rectDesc);

    _Parameter  startA  = (90-s)*3.1415926/180,
                endA    = (90-s-f)*3.1415926/180,
                diag    = .5*sqrt(SQR(rectDesc.right-rectDesc.left)+
                                  SQR(rectDesc.bottom-rectDesc.top));

    int         sX =   (rectDesc.right+rectDesc.left)/2+diag*sin(startA),
                sY =   (rectDesc.bottom+rectDesc.top)/2+diag*cos(startA),
                fX =   (rectDesc.right+rectDesc.left)/2+diag*sin(endA),
                fY =   (rectDesc.bottom+rectDesc.top)/2+diag*cos(endA);

    Pie (thePane,rectDesc.left,rectDesc.top,rectDesc.right,rectDesc.bottom,
         sX,sY,fX,fY);


}

//__________________________________________________________________

void _HYPlatformGraphicPane::_EraseArc (_HYRect rectDesc, int s, int f)
{
    // TBI
}

//__________________________________________________________________

void _HYPlatformGraphicPane::_SetColor  (_HYColor c)
{
    COLORREF theC = HYColor2ColorRef(c,thePane);
    HBRUSH newBrush = (HBRUSH)CreateSolidBrush (theC);

    if (oldBrush) {
        DeleteObject (SelectObject (thePane,newBrush));
    } else {
        oldBrush = (HBRUSH)SelectObject (thePane,newBrush);
    }

    if (fillColor) {
        DeleteObject (fillColor);
    }
    fillColor = newBrush;
    _HYRect pR = {0,0,0,0,0};
    pR.width = lastPenSize;
    CheckPen (pR,true);
    SetTextColor (thePane,theC);
}

//__________________________________________________________________

void _HYPlatformGraphicPane::_SetBColor  (_HYColor c)
{
    COLORREF theC = HYColor2ColorRef(c,thePane);
    HBRUSH newBrush = (HBRUSH)CreateSolidBrush (theC);
    if (backColor) {
        DeleteObject (fillColor);
    }
    backColor = newBrush;
    SetBkColor (thePane, theC);
}


//__________________________________________________________________

void _HYPlatformGraphicPane::_SetFont (_HYFont f)
{
    HFONT   newFont = CreateFont (f.size,0,0,0,(f.style&HY_FONT_BOLD)?FW_BOLD:FW_NORMAL,f.style&HY_FONT_ITALIC,FALSE,FALSE,ANSI_CHARSET,OUT_DEFAULT_PRECIS,
                                  CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH|FF_DONTCARE,f.face.sData);
    if (oldFont) {
        DeleteObject (SelectObject (thePane,newFont));
    } else {
        oldFont = (HFONT)SelectObject (thePane, newFont);
    }
}

//__________________________________________________________________

void _HYPlatformGraphicPane::_SetFontSize (long s)
{
    _SetFont (((_HYGraphicPane*)this)->font);
}

//__________________________________________________________________

void _HYPlatformGraphicPane::_StartDraw  (void)
{
}

//__________________________________________________________________

void _HYPlatformGraphicPane::_EndDraw    (void)
{
}

//__________________________________________________________________

void _HYPlatformGraphicPane::_SetPort    (Ptr nP)
{
}

//__________________________________________________________________
void _HYPlatformGraphicPane::_SlidePane  (int dv, int dh)
{
    _HYGraphicPane* theParent = (_HYGraphicPane*)this;
    RECT r = {0,0,theParent->h,theParent->w};

    ScrollDC (thePane, dh, dv, &r, &r, NULL, NULL);
}

//__________________________________________________________________
void _HYPlatformGraphicPane::_SlideRect (_HYRect& rct, int dv, int dh)
{
    _HYGraphicPane* theParent = (_HYGraphicPane*)this;

    RECT r = HYRect2Rect (rct);
    ScrollDC (thePane, dh, dv, &r, &r, NULL, NULL);
}

//__________________________________________________________________
void _HYPlatformGraphicPane::_InvertRect (_HYRect& rct)
{
    RECT r = HYRect2Rect (rct);
    InvertRect (thePane,&r);
}


//__________________________________________________________________
void _HYPlatformGraphicPane::_SavePicture   (_String prompt)
{

    _String         initFileName ("untitled.bmp"),
                    bmp          ("Bitmap\0*.bmp\0\0"),
                    fileName;


    if (SaveFileFunction (fileName, prompt, initFileName, bmp.sData, nil) == 0) {

        if (!fileName.endswith (".bmp")) {
            fileName = fileName & ".bmp";
        }

        BITMAP          bmp;
        PBITMAPINFO     pbmi;
        WORD            cClrBits;

        // Retrieve the bitmap color format, width, and height.
        if (GetObject(paneBitMap, sizeof(BITMAP), (LPSTR)&bmp)) {
            cClrBits = (WORD)(bmp.bmPlanes * bmp.bmBitsPixel);
            if (cClrBits == 1) {
                cClrBits = 1;
            } else if (cClrBits <= 4) {
                cClrBits = 4;
            } else if (cClrBits <= 8) {
                cClrBits = 8;
            } else if (cClrBits <= 16) {
                cClrBits = 16;
            } else if (cClrBits <= 24) {
                cClrBits = 24;
            } else {
                cClrBits = 32;
            }

            // Allocate memory for the BITMAPINFO structure. (This structure
            // contains a BITMAPINFOHEADER structure and an array of RGBQUAD
            // data structures.)

            if (cClrBits != 24)
                pbmi = (PBITMAPINFO) LocalAlloc(LPTR,
                                                sizeof(BITMAPINFOHEADER) +
                                                sizeof(RGBQUAD) * (1<< cClrBits));

            // There is no RGBQUAD array for the 24-bit-per-pixel format.

            else
                pbmi = (PBITMAPINFO) LocalAlloc(LPTR,
                                                sizeof(BITMAPINFOHEADER));

            checkPointer (pbmi);

            // Initialize the fields in the BITMAPINFO structure.

            pbmi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
            pbmi->bmiHeader.biWidth = bmp.bmWidth;
            pbmi->bmiHeader.biHeight = bmp.bmHeight;
            pbmi->bmiHeader.biPlanes = bmp.bmPlanes;
            pbmi->bmiHeader.biBitCount = bmp.bmBitsPixel;
            if (cClrBits < 24) {
                pbmi->bmiHeader.biClrUsed = (1<<cClrBits);
            }

            // If the bitmap is not compressed, set the BI_RGB flag.
            pbmi->bmiHeader.biCompression = BI_RGB;

            // Compute the number of bytes in the array of color
            // indices and store the result in biSizeImage.
            // For Windows NT, the width must be DWORD aligned unless
            // the bitmap is RLE compressed. This example shows this.
            // For Windows 95/98/Me, the width must be WORD aligned unless the
            // bitmap is RLE compressed.
            pbmi->bmiHeader.biSizeImage = ((pbmi->bmiHeader.biWidth * cClrBits +31) & ~31) /8
                                          * pbmi->bmiHeader.biHeight;
            // Set biClrImportant to 0, indicating that all of the
            // device colors are important.
            pbmi->bmiHeader.biClrImportant = 0;

            HANDLE            hf;       // file handle
            BITMAPFILEHEADER  hdr;      // bitmap file-header
            PBITMAPINFOHEADER pbih;     // bitmap info-header
            LPBYTE            lpBits;   // memory pointer
            DWORD             dwTotal;  // total count of bytes
            DWORD             cb;       // incremental count of bytes
            BYTE              *hp;      // byte pointer
            DWORD             dwTmp;

            pbih   = (PBITMAPINFOHEADER) pbmi;
            lpBits = (LPBYTE) GlobalAlloc(GMEM_FIXED, pbih->biSizeImage);


            // Retrieve the color table (RGBQUAD array) and the bits
            // (array of palette indices) from the DIB.
            if (!GetDIBits(thePane, paneBitMap, 0, (WORD) pbih->biHeight, lpBits, pbmi,
                           DIB_RGB_COLORS)) {
                LocalFree (pbmi);
                return;
            }

            // Create the .BMP file.
            hf = CreateFile(fileName.sData,
                            GENERIC_READ | GENERIC_WRITE,
                            (DWORD) 0,
                            NULL,
                            CREATE_ALWAYS,
                            FILE_ATTRIBUTE_NORMAL,
                            (HANDLE) NULL);

            if (hf == INVALID_HANDLE_VALUE) {
                LocalFree (pbmi);
                return;
            }

            hdr.bfType = 0x4d42;        // 0x42 = "B" 0x4d = "M"
            // Compute the size of the entire file.
            hdr.bfSize = (DWORD) (sizeof(BITMAPFILEHEADER) +
                                  pbih->biSize + pbih->biClrUsed
                                  * sizeof(RGBQUAD) + pbih->biSizeImage);
            hdr.bfReserved1 = 0;
            hdr.bfReserved2 = 0;

            // Compute the offset to the array of color indices.
            hdr.bfOffBits = (DWORD) sizeof(BITMAPFILEHEADER) +
                            pbih->biSize + pbih->biClrUsed
                            * sizeof (RGBQUAD);

            // Copy the BITMAPFILEHEADER into the .BMP file.
            if (!WriteFile(hf, (LPVOID) &hdr, sizeof(BITMAPFILEHEADER),
                           (LPDWORD) &dwTmp,  NULL)) {
                LocalFree (pbmi);
                return;
            }

            // Copy the BITMAPINFOHEADER and RGBQUAD array into the file.
            if (!WriteFile(hf, (LPVOID) pbih, sizeof(BITMAPINFOHEADER)
                           + pbih->biClrUsed * sizeof (RGBQUAD),
                           (LPDWORD) &dwTmp, ( NULL))) {
                LocalFree (pbmi);
                return;
            }

            // Copy the array of color indices into the .BMP file.
            dwTotal = cb = pbih->biSizeImage;
            hp = lpBits;
            if (!WriteFile(hf, (LPSTR) hp, (int) cb, (LPDWORD) &dwTmp,NULL)) {
                LocalFree (pbmi);
                return;
            }

            // Close the .BMP file.
            if (!CloseHandle(hf)) {
                LocalFree (pbmi);
                return;
            }

            // Free memory.
            GlobalFree((HGLOBAL)lpBits);
            LocalFree (pbmi);
        }
    }
}

//__________________________________________________________________

void _HYPlatformGraphicPane::_DrawPicRes (_HYRect& r, long id)
// id here refers to a bitmap resource
{
    HBITMAP aPic = LoadBitmap (ProgramInstance,MAKEINTRESOURCE(id));
    if (aPic) {
        /*BITMAP theBM;
        GetObject (aPic, sizeof (BITMAP), &theBM);
        if (otherDC)
        {
            if (r.right-r.left<=0)
                r.right = r.right = r.left + theBM.bmWidth;

            if (r.bottom-r.top<=0)
                r.bottom = r.bottom = r.top + theBM.bmHeight;

            SelectObject (otherDC, aPic);

            TransparentBlt   (thePane, r.left, r.top, r.right-r.left+1, r.bottom-r.top+1,
                          otherDC, 0, 0, theBM.bmWidth, theBM.bmHeight, RGB(255,255,255));

            SelectObject (otherDC, oDCBM);
        }
        else
        {
            _String errMsg = _String ("Failed to make CompatibleDC in _DrawPicRes");
            ReportWarning (errMsg);
        }*/

        POINT   bSize = {0,0};

        if (r.right-r.left>0) {
            bSize.x = r.right-r.left+1;
        }

        if (r.bottom-r.top>0) {
            bSize.y = r.bottom-r.top + 1;
        }

        bSize = DrawTransparentBitmap (thePane,aPic,r.left,r.right,bSize.x,bSize.y,RGB(255,255,255));

        if (r.right-r.left<=0) {
            r.right = r.left + bSize.x;
        }

        if (r.bottom-r.top<=0) {
            r.bottom = r.top + bSize.y;
        }

        DeleteObject (aPic);
    } else {
        _String errMsg = _String ("No bitmap resource with ID ") & id;
        ReportWarning (errMsg);
    }
}

//__________________________________________________________________

Ptr _HYPlatformGraphicPane::_DefinePolygon  (_SimpleList& points)
{
    if ((points.lLength>=6)&&(points.lLength%2==0)) {
        POINT* pts = new POINT [points.lLength/2];
        checkPointer (pts);

        for (long k=0; k<points.lLength; k+=2) {
            pts[k/2].x = points.lData[k];
            pts[k/2].y = points.lData[k+1];
        }

        HRGN    rgn = CreatePolygonRgn (pts,points.lLength/2,WINDING);
        checkPointer (rgn);
        delete (pts);
        return (Ptr)rgn;
    }
    return nil;
}

//__________________________________________________________________

void _HYPlatformGraphicPane::_KillPolygon   (Ptr rgn)
{
    if (rgn) {
        DeleteObject (rgn);
    }
}

//__________________________________________________________________

void _HYPlatformGraphicPane::_DrawPolygon (Ptr rgn, long width)
{
    if (rgn) {
        FrameRgn (thePane, (HRGN)rgn, fillColor, width, width);
    }
}

//__________________________________________________________________

void _HYPlatformGraphicPane::_FillPolygon (Ptr rgn)
{
    if (rgn) {
        FillRgn (thePane, (HRGN)rgn, fillColor);
    }
}

//__________________________________________________________________

void _HYPlatformGraphicPane::_ErasePolygon (Ptr rgn)
{
    if (rgn) {
        FillRgn (thePane, (HRGN)rgn, backColor);
    }
}

//__________________________________________________________________

void _HYPlatformGraphicPane::_CopyToClipboard (void)
{
    PlaceBitmapInClipboard (paneBitMap,NULL);
}

//__________________________________________________________________

void _HYPlatformGraphicPane::_SetDialogBG (void)
{
    ((_HYGraphicPane*)this)->SetBColor         (GetDialogBackgroundColor());
}

//___________________________________________________________________

char        isWindows2000orXP = -1;

//__________________________________________________________________
POINT   DrawTransparentBitmap(HDC hdc, HBITMAP hBitmap, short xStart,short yStart,short xSize, short ySize, COLORREF cTransparentColor)
{
    POINT      ptSize;
    if (isWindows2000orXP == -1) {
        OSVERSIONINFO osinfo;
        osinfo.dwOSVersionInfoSize = sizeof (osinfo);
        GetVersionEx (&osinfo);
        isWindows2000orXP = (osinfo.dwMajorVersion > 4);
    }
    if (isWindows2000orXP) {
        BITMAP     bm;;
        GetObject (hBitmap, sizeof (BITMAP), &bm);
        ptSize.x = bm.bmWidth;            // Get width of bitmap
        ptSize.y = bm.bmHeight;           // Get height of bitmap
        HDC        hdcBM   = CreateCompatibleDC(hdc);
        if (hdcBM) {
            if (xSize<=0) {
                xSize = ptSize.x;
            }
            if (ySize<=0) {
                ySize = ptSize.y;
            }

            HBITMAP hdcBMOLD = (HBITMAP)SelectObject (hdcBM, hBitmap);

            TransparentBlt   (hdc, xStart, yStart, xSize, ySize,
                              hdcBM, 0, 0,bm.bmWidth, bm.bmHeight, RGB(255,255,255));

            SelectObject (hdcBM, hdcBMOLD);
            DeleteDC (hdcBM);
        } else {
            _String errMsg = _String ("Failed to make CompatibleDC in _DrawPicRes");
            ReportWarning (errMsg);
        }
    } else {
        BITMAP     bm;
        COLORREF   cColor;
        HBITMAP    bmAndBack, bmAndObject, bmAndMem, bmSave;
        HBITMAP    bmBackOld, bmObjectOld, bmMemOld, bmSaveOld;
        HDC        hdcMem, hdcBack, hdcObject, hdcTemp, hdcSave;

        hdcTemp = CreateCompatibleDC(hdc);
        SelectObject(hdcTemp, hBitmap);   // Select the bitmap

        GetObject(hBitmap, sizeof(BITMAP), (LPSTR)&bm);
        ptSize.x = bm.bmWidth;            // Get width of bitmap
        ptSize.y = bm.bmHeight;           // Get height of bitmap
        DPtoLP(hdcTemp, &ptSize, 1);      // Convert from device

        // to logical points

        if (xSize<=0) {
            xSize = ptSize.x;
        }
        if (ySize<=0) {
            ySize = ptSize.y;
        }


        // Create some DCs to hold temporary data.
        hdcBack   = CreateCompatibleDC(hdc);
        hdcObject = CreateCompatibleDC(hdc);
        hdcMem    = CreateCompatibleDC(hdc);
        hdcSave   = CreateCompatibleDC(hdc);

        // Create a bitmap for each DC. DCs are required for a number of
        // GDI functions.

        // Monochrome DC
        bmAndBack   = CreateBitmap(ptSize.x, ptSize.y, 1, 1, NULL);

        // Monochrome DC
        bmAndObject = CreateBitmap(ptSize.x, ptSize.y, 1, 1, NULL);

        bmAndMem    = CreateCompatibleBitmap(hdc, ptSize.x, ptSize.y);
        bmSave      = CreateCompatibleBitmap(hdc, ptSize.x, ptSize.y);

        // Each DC must select a bitmap object to store pixel data.
        bmBackOld   = (HBITMAP)SelectObject(hdcBack, bmAndBack);
        bmObjectOld = (HBITMAP)SelectObject(hdcObject, bmAndObject);
        bmMemOld    = (HBITMAP)SelectObject(hdcMem, bmAndMem);
        bmSaveOld   = (HBITMAP)SelectObject(hdcSave, bmSave);

        // Set proper mapping mode.
        SetMapMode(hdcTemp, GetMapMode(hdc));

        // Save the bitmap sent here, because it will be overwritten.
        BitBlt(hdcSave, 0, 0, ptSize.x, ptSize.y, hdcTemp, 0, 0, SRCCOPY);

        // Set the background color of the source DC to the color.
        // contained in the parts of the bitmap that should be transparent
        cColor = SetBkColor(hdcTemp, cTransparentColor);

        // Create the object mask for the bitmap by performing a BitBlt
        // from the source bitmap to a monochrome bitmap.
        BitBlt(hdcObject, 0, 0, ptSize.x, ptSize.y, hdcTemp, 0, 0,
               SRCCOPY);

        // Set the background color of the source DC back to the original
        // color.
        SetBkColor(hdcTemp, cColor);

        // Create the inverse of the object mask.
        BitBlt(hdcBack, 0, 0, ptSize.x, ptSize.y, hdcObject, 0, 0,
               NOTSRCCOPY);

        // Copy the background of the main DC to the destination.
        BitBlt(hdcMem, 0, 0, ptSize.x, ptSize.y, hdc, xStart, yStart,
               SRCCOPY);

        // Mask out the places where the bitmap will be placed.
        BitBlt(hdcMem, 0, 0, ptSize.x, ptSize.y, hdcObject, 0, 0, SRCAND);

        // Mask out the transparent colored pixels on the bitmap.
        BitBlt(hdcTemp, 0, 0, ptSize.x, ptSize.y, hdcBack, 0, 0, SRCAND);

        // XOR the bitmap with the background on the destination DC.
        BitBlt(hdcMem, 0, 0, ptSize.x, ptSize.y, hdcTemp, 0, 0, SRCPAINT);

        // Copy the destination to the screen.
        StretchBlt(hdc, xStart, yStart, xSize, ySize, hdcMem, 0, 0, ptSize.x, ptSize.y,
                   SRCCOPY);

        // Place the original bitmap back into the bitmap sent here.
        BitBlt(hdcTemp, 0, 0, ptSize.x, ptSize.y, hdcSave, 0, 0, SRCCOPY);

        // Delete the memory bitmaps.
        DeleteObject(SelectObject(hdcBack, bmBackOld));
        DeleteObject(SelectObject(hdcObject, bmObjectOld));
        DeleteObject(SelectObject(hdcMem, bmMemOld));
        DeleteObject(SelectObject(hdcSave, bmSaveOld));

        // Delete the memory DCs.
        DeleteDC(hdcMem);
        DeleteDC(hdcBack);
        DeleteDC(hdcObject);
        DeleteDC(hdcSave);
        DeleteDC(hdcTemp);
    }
    return ptSize;
}

//EOF
\ No newline at end of file
diff --git a/src/gui/win/HYPlatformWindow.cpp b/src/gui/win/HYPlatformWindow.cpp
new file mode 100644
index 0000000..19158e9
--- /dev/null
+++ b/src/gui/win/HYPlatformWindow.cpp
@@ -0,0 +1,863 @@
+/*
+    A Windows window object - a window/title/size-box/scroll-bars handler.
+
+    Sergei L. Kosakovsky Pond, June 2000.
+*/
+
+#include "HYWindow.h"
+#include "HYGWindow.h"
+#include "HYPlatformComponent.h"
+#include "HYEventTypes.h"
+#include "HYTableWindow.h"
+#include "HYTreePanel.h"
+#include "HYUtils.h"
+#include "HYConsoleWindow.h"
+
+
+extern  _SimpleList             windowPtrs,
+        windowObjects,
+        windowObjectRefs;
+
+extern  _String                 consoleWindowTitle;
+
+/* printing stuff */
+extern                          FILE*       dbgfile;
+
+BOOL CALLBACK                   PrintDialogProc(HWND, UINT, WPARAM, LPARAM);
+BOOL CALLBACK                   AbortProc(HDC, int);
+HDC                             GetPrinterDeviceContext(HWND);
+
+extern  BOOL                    UserAbortFlag;
+extern  HWND                    PrintDialogHandle;
+
+extern                          HFONT           statusBarPlain;
+
+//__________________________________________________________________
+
+LRESULT coreProcessor (HWND WindowHand, UINT iMsg, WPARAM wParam, LPARAM lParam)
+{
+    _HYWindow* me = nil;
+
+    long       f  = windowPtrs.Find((long)WindowHand);
+
+    if (f>=0) {
+        me = (_HYWindow*)(windowObjects.lData[f]);
+    }
+
+    switch (iMsg) {
+    case WM_COMMAND:
+        if (!lParam) {
+            if (me->_ProcessMenuSelection(LOWORD(wParam))) {
+                return true;
+            }
+        }
+
+        _HYWindowsUIMessage thisM;
+        thisM.iMsg = iMsg;
+        thisM.wParam = wParam;
+        thisM.lParam = lParam;
+        if (me) {
+            if (((_HYPlatformWindow*)me)->_ProcessOSEvent ((Ptr)&thisM)) {
+                return true;
+            }
+        }
+        return false;
+
+    case WM_CREATE:
+
+        return true ;
+
+    case WM_SIZE:
+
+        me->Grow(nil);
+        return true;
+
+    case WM_PAINT: {
+        if (me) {
+            me->Update(nil);
+        }
+
+        return true;
+    }
+
+    case WM_CLOSE: {
+        //printf ("WM_CLOSE\n");
+        /*f = windowObjects.Find((long)(me));
+        if (f>=0)
+        {
+            windowObjectRefs.Delete(f);
+            windowObjects.Delete(f);
+            windowPtrs.Delete(f);
+        }           */
+        if (((_HYWindow*)windowObjectRefs(f))->Close(nil)) {
+            DestroyWindow (WindowHand);
+            return -2;
+        }
+        return false;
+    }
+
+    case WM_QUERYENDSESSION :
+        return true;
+
+    case WM_DESTROY: {
+        //printf ("WM_DESTOY\n");
+        //printf ("_Close handler %d\n",f);
+        if (f>=0) {
+            //DestroyWindow ((HWND)windowPtrs(f));
+            windowObjects.Delete(f);
+            windowPtrs.Delete(f);
+            windowObjectRefs.Delete(f);
+        }
+        return true;
+    }
+
+    default: {
+
+        //if ((iMsg == WM_ACTIVATE)&&(LOWORD(wParam) != WA_INACTIVE))
+        //me->_SetMenuBar ();
+
+        _HYWindowsUIMessage thisM;
+        thisM.iMsg = iMsg;
+        thisM.wParam = wParam;
+        thisM.lParam = lParam;
+        thisM.res    = nil;
+        if (me) {
+            if (((_HYPlatformWindow*)me)->_ProcessOSEvent ((Ptr)&thisM))
+                if (thisM.res) {
+                    return thisM.res;
+                } else {
+                    return 1L;
+                }
+        }
+    }
+
+    }
+    return false;
+}
+
+//__________________________________________________________________
+
+LRESULT CALLBACK HYWndProc (HWND WindowHand, UINT iMsg, WPARAM wParam, LPARAM lParam)
+{
+    LRESULT res = coreProcessor (WindowHand, iMsg, wParam, lParam);
+    if (res) {
+        return res==-2?0:res;
+    }
+
+    /*if (iMsg == WM_ACTIVATE)
+        if (LOWORD (wParam) != WA_INACTIVE)
+        {
+            long f = windowPtrs.Find (lParam);
+            if (f>=0)
+            {
+                _HYWindow * deact = (_HYWindow*)windowObjectRefs (f);
+                if (deact->flags & HY_WINDOW_DLOG)
+                {
+                    if ((deact->parentWindowPtr==nil)||(deact->parentWindowPtr==(Ptr)WindowHand))
+                    {
+                        SetActiveWindow ((HWND)windowPtrs(f));
+                        ReportWarning ("SetActiveWindow");
+                        return 0;
+                    }
+                }
+            }
+        }*/
+    return DefWindowProc(WindowHand, iMsg, wParam, lParam);
+}
+
+//__________________________________________________________________
+
+LRESULT CALLBACK HYDlgProc (HWND WindowHand, UINT iMsg, WPARAM wParam, LPARAM lParam)
+{
+
+    if (iMsg == WM_CREATE) {
+        HWND pw = (HWND)((LPCREATESTRUCT)lParam)->lpCreateParams;
+        if (pw) {
+            EnableWindow (pw,false);
+        } else {
+            EnableWindow ((HWND)hyphyConsoleWindow->GetOSWindowData(),false);
+            for (long k = 0; k<windowPtrs.lLength; k++) {
+                EnableWindow ((HWND)windowPtrs(k),false);
+            }
+        }
+    } else {
+        if ((iMsg == WM_CLOSE)||(iMsg == WM_DESTROY)) {
+            long f = windowPtrs.Find ((long)WindowHand);
+            if (f>=0) {
+                _HYWindow * pWindow = (_HYWindow*)windowObjectRefs (f);
+                if (pWindow->parentWindowPtr) {
+                    EnableWindow ((HWND)pWindow->parentWindowPtr,true);
+                } else {
+                    EnableWindow ((HWND)hyphyConsoleWindow->GetOSWindowData(),true);
+                    for (long k = 0; k<windowPtrs.lLength; k++) {
+                        EnableWindow ((HWND)windowPtrs(k),true);
+                    }
+                }
+                SetActiveWindow (pWindow->oldFrontWindow);
+            }
+        }
+    }
+
+    LRESULT res = coreProcessor (WindowHand, iMsg, wParam, lParam);
+
+    if (res!=0) {
+        return res==-2?0L:res;
+    }
+
+    return DefWindowProc(WindowHand, iMsg, wParam, lParam);
+}
+
+//__________________________________________________________________
+
+_HYPlatformWindow::_HYPlatformWindow(unsigned char windowFlag,_String windowTitle,bool windowVisibility,Ptr par)
+{
+    DWORD dwStyle   = WS_CAPTION;
+    DWORD exStyle   = 0;
+    parentWindowPtr = par;
+    oldFrontWindow  = nil;
+
+    bool  isDlg = (windowFlag & HY_WINDOW_DLOG)||par,
+          isConsole = (windowTitle.Equal (&consoleWindowTitle));
+
+    if (isDlg) {
+        windowMenu      = CreateMenu();
+        exStyle         = WS_EX_DLGMODALFRAME;
+        oldFrontWindow  = GetActiveWindow();
+    } else {
+        if (isConsole) {
+            windowMenu = nil;
+            dwStyle |= WS_SYSMENU;
+        } else {
+            windowMenu = CreateMenu();
+            dwStyle |= WS_SYSMENU;
+            HMENU        fileHandle = CreateMenu ();
+            checkPointer (fileHandle);
+            InsertMenu   (windowMenu, 0, MF_BYPOSITION|MF_POPUP, (UINT) fileHandle , "&File");
+        }
+    }
+
+    if (windowFlag&HY_WINDOW_SIZE) {
+        if (windowFlag&HY_WINDOW_ZOOM) {
+            dwStyle = WS_OVERLAPPEDWINDOW;
+        } else {
+            dwStyle |= WS_MINIMIZEBOX|WS_THICKFRAME;
+        }
+
+        if (isConsole) {
+            dwStyle |= WS_MAXIMIZEBOX;
+        }
+
+    } else {
+        if (isDlg)
+            ;
+        else {
+            dwStyle |= WS_MINIMIZEBOX|WS_MAXIMIZEBOX;
+        }
+    }
+
+    menuKeys = NULL;
+
+    HWND        pWnd = NULL;
+
+    if (par) {
+        pWnd = (((_HYWindow*)par)->theWindow);
+        parentWindowPtr = (Ptr)pWnd;
+    }
+
+    theWindow = CreateWindowEx(exStyle,isConsole?"HYPHY":(isDlg?"HPGUIDLG":"HPGUIW"),           /* window class name              */
+                               windowTitle.sData,       /* window caption                 */
+                               dwStyle | (((windowFlag&HY_WINDOW_SCROLL)&&(windowFlag&HY_WINDOW_SIZE))?(WS_HSCROLL|WS_VSCROLL):0)| WS_CLIPCHILDREN ,
+                               CW_USEDEFAULT,          /* initial x position             */
+                               CW_USEDEFAULT,          /* initial y position             */
+                               300,                     /* initial x size                 */
+                               250,                     /* initial y size                 */
+                               pWnd,                   /* parent window handle           */
+                               windowMenu,             /* window menu handle             */
+                               ProgramInstance,         /* program instance handle        */
+                               par?pWnd:nil);                   /* creation parameters            */
+
+
+    if ((!theWindow)||(!(windowMenu)&&(!isConsole))) {
+        _String errMsg ("Could not create a window structure. Windows Error:");
+        errMsg = errMsg&_String ((long)GetLastError());
+        FlagError (errMsg);
+    }
+
+
+    if ((windowFlag&HY_WINDOW_SCROLL)&&(windowFlag&HY_WINDOW_SIZE)) {
+        SetScrollRange (theWindow,SB_HORZ,0,MAX_CONTROL_VALUE,FALSE);
+        SetScrollRange (theWindow,SB_VERT,0,MAX_CONTROL_VALUE,FALSE);
+    }
+
+
+    windowPtrs<<(long)theWindow;
+    windowObjects<<(long)(_HYWindow*)this;
+
+
+
+    flags = windowFlag;
+
+}
+
+//__________________________________________________________________
+
+_HYPlatformWindow::~_HYPlatformWindow(void)
+{
+    if (windowMenu) {
+        DestroyMenu (windowMenu);
+    }
+    if (menuKeys) {
+        DestroyAcceleratorTable (menuKeys);
+    }
+    DestroyWindow (theWindow);
+}
+
+//__________________________________________________________________
+
+void _HYPlatformWindow::_SetTitle(_String windowTitle)
+{
+    SetWindowText (theWindow,windowTitle);
+}
+
+//__________________________________________________________________
+
+void _HYPlatformWindow::_Show(void)
+{
+    ShowWindow (theWindow,SW_SHOWNORMAL);
+}
+
+//__________________________________________________________________
+
+void _HYPlatformWindow::_Hide(void)
+{
+    ShowWindow (theWindow,SW_HIDE);
+}
+
+//__________________________________________________________________
+
+_HYRect _HYPlatformWindow::_GetWindowRect(void)
+{
+    RECT res;
+
+    ::GetWindowRect (theWindow, &res);
+
+    return (_HYRect) {
+        res.top,res.left,res.bottom,res.right,0
+    };
+}
+
+//__________________________________________________________________
+
+long _HYPlatformWindow::_Grow(Ptr theData)
+{
+    RECT myDims;
+    GetClientRect (theWindow,&myDims);
+    _HYWindow* theParent = (_HYWindow*)this;
+    theParent->right = theParent->left+myDims.right-myDims.left;
+    theParent->bottom = theParent->top+myDims.bottom-myDims.top;
+    int windowWidth = theParent->right-theParent->left,
+        windowHeight = theParent->bottom-theParent->top;
+    if (flags&HY_WINDOW_SIZE) {
+        _HYWindow* theParent = (_HYWindow*)this;
+        if (windowWidth >= theParent->contentWidth) {
+            EnableScrollBar (theWindow,SB_HORZ, ESB_DISABLE_BOTH);
+        } else {
+            EnableScrollBar (theWindow,SB_HORZ, ESB_ENABLE_BOTH);
+        }
+        if (windowHeight >= theParent->contentHeight) {
+            EnableScrollBar (theWindow,SB_VERT, ESB_DISABLE_BOTH);
+        } else {
+            EnableScrollBar (theWindow,SB_VERT, ESB_ENABLE_BOTH);
+        }
+    }
+    return 0;
+}
+
+//__________________________________________________________________
+
+_String& _HYPlatformWindow::_GetTitle(void)
+{
+    return      ((_HYWindow*)this)->GetTitle();
+}
+
+//__________________________________________________________________
+
+void    _HYPlatformWindow::_SetWindowBackColor (_HYColor newColor)
+{
+    PAINTSTRUCT      thePS;
+    HDC theContext = BeginPaint (theWindow,&thePS);
+
+    SetBkColor  (theContext, HYColor2ColorRef (newColor, theContext));
+
+    EndPaint (theWindow,&thePS);
+}
+
+//__________________________________________________________________
+
+void _HYPlatformWindow::_Move(Ptr theData)
+{
+}
+
+//__________________________________________________________________
+
+void _HYPlatformWindow::_SetPosition(int l,int t)
+{
+    SetWindowPos (theWindow,NULL,l,t,0,0,SWP_NOZORDER|SWP_NOSIZE);
+}
+
+//__________________________________________________________________
+
+void _HYPlatformWindow::_BringWindowToFront(void)
+{
+    //RedrawWindow (theWindow, NULL, NULL, RDW_ALLCHILDREN);
+    //ShowWindow (theWindow, SW_SHOWNORMAL);
+    _Activate ();
+}
+
+//__________________________________________________________________
+
+bool _HYPlatformWindow::_Close(Ptr theData)
+{
+    _HYWindow* theParent = (_HYWindow*)this;
+    bool        doit = true;
+
+    if (theParent->ConfirmClose()) {
+        //long f = windowObjectRefs.Find((long)theParent);
+        //printf ("_Close handler %d\n",f);
+        /*if (f>=0)
+        {
+            DestroyWindow ((HWND)windowPtrs(f));
+            windowObjects.Delete(f);
+            windowPtrs.Delete(f);
+            windowObjectRefs.Delete(f);
+        }*/
+    } else {
+        doit = false;
+    }
+
+    return doit;
+}
+
+//__________________________________________________________________
+
+void _HYPlatformWindow::_Activate(void)
+{
+    _SetMenuBar();
+    _Show();
+    SetFocus(theWindow);
+}
+
+//__________________________________________________________________
+
+void _HYPlatformWindow::_Deactivate(void)
+{
+    //_Hide();
+}
+
+//__________________________________________________________________
+
+void _HYPlatformWindow::_AddStandardAccels(void)
+{
+    accels       << (FCONTROL|FVIRTKEY);
+    accels       << 'Z';
+    accels       << HY_WINDOW_MENU_ID_EDIT;
+
+    accels       << (FCONTROL|FVIRTKEY);
+    accels       << 'C';
+    accels       << HY_WINDOW_MENU_ID_EDIT+1;
+
+    accels       << (FCONTROL|FVIRTKEY);
+    accels       << 'X';
+    accels       << HY_WINDOW_MENU_ID_EDIT+2;
+
+    accels       << (FCONTROL|FVIRTKEY);
+    accels       << 'V';
+    accels       << HY_WINDOW_MENU_ID_EDIT+3;
+
+    accels       << (FCONTROL|FVIRTKEY);
+    accels       << 'A';
+    accels       << HY_WINDOW_MENU_ID_EDIT+5;
+
+    accels       << (FCONTROL|FVIRTKEY);
+    accels       << 'W';
+    accels       << HY_WINDOW_MENU_ID_FILE;
+
+    accels       << (FCONTROL|FVIRTKEY);
+    accels       << 'S';
+    accels       << HY_WINDOW_MENU_ID_FILE+1;
+
+    accels       << (FCONTROL|FVIRTKEY);
+    accels       << 'P';
+    accels       << HY_WINDOW_MENU_ID_FILE+2;
+
+    accels       << (FCONTROL|FVIRTKEY);
+    accels       << '0';
+    accels       << HY_WINDOW_MENU_ID_FILE-1;
+
+    accels       << (FCONTROL|FVIRTKEY);
+    accels       << 'I';
+    accels       << HY_WINDOW_MENU_ID_FILE-2;
+}
+
+//__________________________________________________________________
+
+void _HYPlatformWindow::_BuildAccelTable (bool force)
+{
+    if (force&&menuKeys) {
+        DestroyAcceleratorTable (menuKeys);
+        menuKeys = nil;
+    }
+
+    if ((menuKeys == NULL)&&(accels.lLength>=3)) {
+        LPACCEL myAccels = (LPACCEL) new ACCEL[accels.lLength/3];
+        checkPointer (myAccels);
+
+        for (long k=0; k<accels.lLength/3; k++) {
+            myAccels[k].fVirt = accels.lData[k*3];
+            myAccels[k].key = accels.lData[k*3+1];
+            myAccels[k].cmd = accels.lData[k*3+2];
+        }
+
+        menuKeys = CreateAcceleratorTable (myAccels, accels.lLength/3);
+        delete (myAccels);
+    }
+}
+
+//__________________________________________________________________
+
+void _HYPlatformWindow::_SetMenuBar(void)
+{
+    HMENU        fileHandle = GetSubMenu(GetMenu (theWindow),0);
+
+    if (windowMenu&&(GetMenuItemCount (fileHandle)==0)) {
+
+        _HYWindow* theParent = (_HYWindow*)this;
+
+        HMENU        editHandle = CreateMenu ();
+
+        checkPointer (fileHandle);
+        checkPointer (editHandle);
+
+        InsertMenu   (fileHandle, 0xFFFFFFFF, MF_BYPOSITION, HY_WINDOW_MENU_ID_FILE+1, "&Save\tCtrl-S");
+        InsertMenu   (fileHandle, 0xFFFFFFFF, MF_BYPOSITION, HY_WINDOW_MENU_ID_FILE+2, "&Print\tCtrl-P");
+        InsertMenu   (fileHandle, 0xFFFFFFFF, MF_BYPOSITION, HY_WINDOW_MENU_ID_FILE,   "&Close\tCtrl-W");
+        InsertMenu   (fileHandle, 0xFFFFFFFF, MF_BYPOSITION, HY_WINDOW_MENU_ID_FILE-1, "S&witch to Console\tCtrl-0");
+        InsertMenu   (fileHandle, 0xFFFFFFFF, MF_BYPOSITION, HY_WINDOW_MENU_ID_FILE-2, "Object &Inspector\tCtrl-I");
+
+        if (!theParent->IsSaveEnabled()) {
+            EnableMenuItem (fileHandle, 0, MF_BYPOSITION|MF_GRAYED);
+        }
+
+        if (!theParent->IsPrintEnabled()) {
+            EnableMenuItem (fileHandle, 1, MF_BYPOSITION|MF_GRAYED);
+        }
+
+        InsertMenu   (editHandle, 0xFFFFFFFF, MF_BYPOSITION|MF_GRAYED, HY_WINDOW_MENU_ID_EDIT, "&Undo\tCtrl-Z");
+
+        InsertMenu   (editHandle, 0xFFFFFFFF, MF_BYPOSITION|MF_SEPARATOR, 0, NULL);
+
+        InsertMenu   (editHandle, 0xFFFFFFFF, MF_BYPOSITION|MF_GRAYED, HY_WINDOW_MENU_ID_EDIT+1, "&Copy\tCtrl-C");
+
+        InsertMenu   (editHandle, 0xFFFFFFFF, MF_BYPOSITION|MF_GRAYED, HY_WINDOW_MENU_ID_EDIT+2, "C&ut\tCtrl-X");
+
+        InsertMenu   (editHandle, 0xFFFFFFFF, MF_BYPOSITION|MF_GRAYED, HY_WINDOW_MENU_ID_EDIT+3, "&Paste\tCtrl-V");
+
+        InsertMenu   (editHandle, 0xFFFFFFFF, MF_BYPOSITION|MF_GRAYED, HY_WINDOW_MENU_ID_EDIT+4, "C&lear");
+
+        InsertMenu   (editHandle, 0xFFFFFFFF, MF_BYPOSITION|MF_GRAYED, HY_WINDOW_MENU_ID_EDIT+5, "Select &All\tCtrl-A");
+
+        //InsertMenu     (windowMenu, 0, MF_BYPOSITION|MF_POPUP, (UINT) fileHandle , "&File");
+        InsertMenu   (windowMenu, 1, MF_BYPOSITION|MF_POPUP, (UINT) editHandle , "&Edit");
+    }
+
+    _AddStandardAccels();
+    _BuildAccelTable  ();
+
+    accels.Clear();
+}
+
+//__________________________________________________________________
+
+void _HYPlatformWindow::_UnsetMenuBar(void)
+{
+}
+
+//__________________________________________________________________
+
+void _HYPlatformWindow::_Paint(Ptr)
+{
+    PAINTSTRUCT      thePS;
+    HDC theContext = BeginPaint (theWindow,&thePS);
+    EndPaint (theWindow,&thePS);
+}
+
+//__________________________________________________________________
+
+void _HYPlatformWindow::_Update(Ptr)
+{
+}
+
+//__________________________________________________________________
+
+void _HYPlatformWindow::_SetWindowRectangle(int top, int left, int bottom, int right, bool ss)
+{
+
+    int windowWidth  = right-left,
+        windowHeight = bottom-top;
+
+    if (flags&HY_WINDOW_SIZE) {
+        _HYWindow* theParent = (_HYWindow*)this;
+
+        if (windowWidth >= theParent->contentWidth) {
+            EnableScrollBar (theWindow,SB_HORZ, ESB_DISABLE_BOTH);
+        } else {
+            EnableScrollBar (theWindow,SB_HORZ, ESB_ENABLE_BOTH);
+        }
+        if (windowHeight >= theParent->contentHeight) {
+            EnableScrollBar (theWindow,SB_VERT, ESB_DISABLE_BOTH);
+        } else {
+            EnableScrollBar (theWindow,SB_VERT, ESB_ENABLE_BOTH);
+        }
+    }
+
+    if (ss) {
+        RECT            smallR,
+                        bigR;
+
+        GetWindowRect   (theWindow,&bigR);
+        GetClientRect   (theWindow,&smallR);
+        SetWindowPos    (theWindow,NULL,0,0,
+                         windowWidth + bigR.right  - bigR.left - smallR.right,
+                         windowHeight+ bigR.bottom - bigR.top  - smallR.bottom,
+                         SWP_NOZORDER|SWP_NOMOVE);
+
+        InvalidateRect  (theWindow, nil, false);
+    }
+}
+
+//__________________________________________________________________
+
+bool _HYPlatformWindow::_ProcessOSEvent (Ptr vEvent)
+{
+    _HYWindowsUIMessage * theEvent = (_HYWindowsUIMessage *)vEvent;
+    _HYWindow* theParent = (_HYWindow*)this;
+    long       invisPixels;
+    long       currentValue, oldValue;
+    switch (theEvent->iMsg) {
+    case WM_HSCROLL:
+    case WM_VSCROLL: {
+        if (theEvent->iMsg == WM_HSCROLL) {
+            invisPixels = theParent->contentWidth-(theParent->right-theParent->left);
+            currentValue = GetScrollPos (theWindow,SB_HORZ);
+        } else {
+            invisPixels = theParent->contentHeight-(theParent->bottom-theParent->top);
+            currentValue = GetScrollPos (theWindow,SB_VERT);
+        }
+        oldValue = currentValue;
+        invisPixels = (_Parameter)MAX_CONTROL_VALUE/invisPixels;
+        if (!invisPixels) {
+            invisPixels = 1;
+        }
+
+        switch (LOWORD(theEvent->wParam)) {
+        case SB_LINEUP:
+            currentValue-=invisPixels;
+            break;
+        case SB_LINEDOWN:
+            currentValue+=invisPixels;
+            break;
+        case SB_PAGEUP:
+            currentValue-=10*invisPixels;
+            break;
+        case SB_PAGEDOWN:
+            currentValue+=10*invisPixels;
+            break;
+        case SB_THUMBPOSITION:
+        case SB_THUMBTRACK:
+            currentValue = HIWORD(theEvent->wParam);
+            break;
+        case SB_TOP:
+            currentValue = 0;
+            break;
+        case  SB_BOTTOM:
+            currentValue = MAX_CONTROL_VALUE;
+            break;
+        default:
+            return true;
+        }
+
+        if (currentValue<0) {
+            currentValue = 0;
+        }
+        if (currentValue>MAX_CONTROL_VALUE) {
+            currentValue = MAX_CONTROL_VALUE;
+        }
+        if (currentValue!=oldValue) {
+            if (theEvent->iMsg == WM_HSCROLL) {
+                SetScrollPos (theWindow,SB_HORZ, currentValue, TRUE);
+                theParent->ProcessEvent (generateScrollEvent (currentValue-oldValue,0));
+            } else {
+                SetScrollPos (theWindow,SB_VERT, currentValue, TRUE);
+                theParent->ProcessEvent (generateScrollEvent (0,currentValue-oldValue));
+            }
+        }
+    }
+    return true;
+    break;
+
+    case WM_GETMINMAXINFO:
+
+        MINMAXINFO* windowInfo = (MINMAXINFO*)theEvent->lParam;
+        RECT   bigR, smallR;
+        GetClientRect (theWindow,&smallR);
+        GetWindowRect (theWindow,&bigR);
+        windowInfo->ptMinTrackSize.x = 50;
+        windowInfo->ptMinTrackSize.y = 50;
+        windowInfo->ptMaxTrackSize.x = theParent->contentWidth+bigR.right-bigR.left-(smallR.right);
+        windowInfo->ptMaxTrackSize.y = theParent->contentHeight+bigR.bottom-bigR.top-smallR.bottom;
+        return true;
+        break;
+    }
+    return false;
+}
+
+//__________________________________________________________________
+
+bool        _HYWindow::_ProcessMenuSelection (long msel)
+{
+    switch (msel) {
+    case HY_WINDOW_MENU_ID_FILE-2: { // close window
+        ShowObjectInspector();
+        return true;
+    }
+    case HY_WINDOW_MENU_ID_FILE-1: { // close window
+        SetForegroundWindow ((HWND)hyphyConsoleWindow->GetOSWindowData());
+        return true;
+    }
+    case HY_WINDOW_MENU_ID_FILE: { // close window
+        Close(nil);
+        return true;
+    }
+    }
+    return false;
+}
+
+//__________________________________________________________________
+
+void    _HYPlatformWindow::_SetContentSize (int w, int h)
+{
+    _HYWindow* theParent = (_HYWindow*)this;
+    int     windowW = theParent->right-theParent->left,
+            windowH =  theParent->bottom-theParent->top;
+    if (w<=windowW) {
+        EnableScrollBar (theWindow,SB_HORZ,ESB_DISABLE_BOTH);
+    } else {
+        EnableScrollBar (theWindow,SB_HORZ,ESB_ENABLE_BOTH);
+        SetScrollPos (theWindow,SB_HORZ,0,TRUE);
+    }
+    if (h<=windowH) {
+        EnableScrollBar (theWindow,SB_VERT,ESB_DISABLE_BOTH);
+    } else {
+        EnableScrollBar (theWindow,SB_VERT,ESB_ENABLE_BOTH);
+        SetScrollPos (theWindow,SB_VERT,0,TRUE);
+    }
+
+}
+
+//__________________________________________________________________
+
+
+void    _HYPlatformWindow::_VisibleContents (int& t,int& l,int& b,int& r)
+{
+    _HYWindow* theParent = (_HYWindow*)this;
+    short v;
+    short windowH=theParent->bottom-theParent->top,
+          windowW=theParent->right-theParent->left;
+    if (flags&HY_WINDOW_SIZE) {
+        if (windowW>theParent->contentWidth) {
+            l = theParent->left;
+            r = theParent->right;
+        } else {
+            v = GetScrollPos (theWindow,SB_HORZ);
+            l = theParent->left+(theParent->contentWidth-windowW)*v/(_Parameter)MAX_CONTROL_VALUE;
+            r = l+windowW;
+        }
+        if (windowH>theParent->contentHeight) {
+            t = theParent->top;
+            b = theParent->bottom;
+        } else {
+            v = GetScrollPos (theWindow,SB_VERT);
+            t = theParent->top+(theParent->contentHeight-windowH)*v/(_Parameter)MAX_CONTROL_VALUE;
+            b = t+windowH;
+        }
+    } else {
+        t = theParent->top;
+        l = theParent->left;
+        b = theParent->bottom;
+        r = theParent->right;
+    }
+
+}
+
+
+//__________________________________________________________________
+
+RECT    _HYPlatformWindow::newVRect (void)
+{
+    return (RECT) {
+        0,0,0,0
+    };
+}
+
+//__________________________________________________________________
+
+RECT    _HYPlatformWindow::newHRect (void)
+{
+    return (RECT) {
+        0,0,0,0
+    };
+}
+
+//__________________________________________________________________
+
+void    _HYPlatformWindow::_SelectWindow (void)
+{
+}
+
+//__________________________________________________________________
+void        _PaintTheCircle (HBITMAP aPic, HWND theWindow, HDC theDC)
+{
+    RECT r;
+    GetClientRect (theWindow, &r);
+
+    r.right = r.left+15;
+    r.left  += 3;
+    r.bottom --;
+    r.top = r.bottom-12;
+
+    DrawTransparentBitmap (theDC, aPic, r.left, r.top, 12, 12, RGB(255,255,255));
+
+    /*BITMAP theBM;
+    theBM.bmBits = nil;
+
+
+
+    GetObject (aPic, sizeof (BITMAP), &theBM);
+    if (otherDC)
+    {
+        if (r.right-r.left<=0)
+            r.right  = r.left + theBM.bmWidth;
+
+        if (r.bottom-r.top<=0)
+            r.bottom  = r.top + theBM.bmHeight;
+
+        SelectObject (otherDC, aPic);
+
+        TransparentBlt   (theDC, r.left, r.top, r.right-r.left+1, r.bottom-r.top+1,
+                            otherDC, 0, 0, theBM.bmWidth, theBM.bmHeight, RGB(255,255,255));
+
+        SelectObject (otherDC, oDCBM);
+    }*/
+}
+
+//EOF
\ No newline at end of file
diff --git a/src/gui/win/HYPlatfromUtils.cpp b/src/gui/win/HYPlatfromUtils.cpp
new file mode 100644
index 0000000..43b50fe
--- /dev/null
+++ b/src/gui/win/HYPlatfromUtils.cpp
@@ -0,0 +1,773 @@
+#include "HYUtils.h"
+#include "HYGraphicPane.h"
+#include "batchlan.h"
+#include "windows.h"
+#include "HYWindow.h"
+#include "time.h"
+#include "shlobj.h"
+#include "HYObjectInspector.h"
+#include "HYConsoleWindow.h"
+#include <Wininet.h>
+
+extern  _String   lastWinPathUsed,
+        dialogPrompt,
+        objectInspectorTitle ;
+
+extern  _List     pathNames;
+
+extern  bool      updateTimer;
+
+extern  clock_t   timerStart,
+        lastTimer;
+
+long    lastFileTypeSelection = 3;
+
+
+//__________________________________________________________________________________
+
+HMENU   ListToPopUpMenu (_List& menuOptions, long base)
+{
+    HMENU        listMenu = CreatePopupMenu ();
+    checkPointer (listMenu);
+
+    for (long counter=0; counter<menuOptions.lLength; counter++) {
+        _String *postItem = (_String*)(menuOptions(counter));
+
+        if (*postItem==_String("SEPARATOR")) {
+            AppendMenu (listMenu, MF_SEPARATOR, 0, nil);
+        } else {
+            AppendMenu (listMenu, MF_STRING, base+counter+1, postItem->sData);
+        }
+    }
+
+    return listMenu;
+}
+
+//__________________________________________________________________________________
+void    PlaceStringInClipboard (_String& res,Ptr powner)
+{
+    HWND    owner = (HWND)powner;
+    HGLOBAL TextHandle = GlobalAlloc(GHND, res.sLength+1);
+    if (TextHandle) {
+        char *TextPtr = (char*)GlobalLock(TextHandle);
+        char *SourcePtr = res.sData;
+        for (; *SourcePtr; SourcePtr++) {
+            *TextPtr++ = *SourcePtr;
+        }
+        *TextPtr = '\0';
+        GlobalUnlock(TextHandle);
+        OpenClipboard(owner);
+        EmptyClipboard();
+        SetClipboardData(CF_TEXT, TextHandle);
+        CloseClipboard();
+    }
+}
+
+//__________________________________________________________________________________
+void    PlaceBitmapInClipboard (HBITMAP res,HWND owner)
+{
+    if (res) {
+        OpenClipboard(owner);
+        EmptyClipboard();
+        SetClipboardData(CF_BITMAP, res);
+        CloseClipboard();
+    }
+}
+
+//__________________________________________________________________________________
+
+_String HandlePullDown (_List& menuOptions, long l, long t,long startPos)
+{
+    if (menuOptions.lLength) {
+        HMENU daMenu = ListToPopUpMenu (menuOptions);
+
+        SetMenuDefaultItem (daMenu, startPos-1, true);
+
+        long tSel = TrackPopupMenu (daMenu, TPM_LEFTALIGN|TPM_TOPALIGN|TPM_RETURNCMD|TPM_LEFTBUTTON|TPM_NONOTIFY,
+                                    l,
+                                    t,
+                                    0, (HWND)hyphyConsoleWindow->GetOSWindowData(), NULL);
+
+        if (tSel) {
+            DestroyMenu (daMenu);
+            return     *((_String*)menuOptions(tSel-1));
+        } else {
+            DestroyMenu (daMenu);
+        }
+    }
+
+    return empty;
+}
+
+//__________________________________________________________________________________
+
+long HandlePullDownWithFont (_List& menuOptions, long l, long t,long startPos,_String,long)
+{
+    _String res = HandlePullDown (menuOptions, l, t, startPos);
+
+    return menuOptions.Find (&res);
+}
+//________________________________________________________
+Ptr     ProcureIconResource (long iconID)
+{
+    //return (Ptr)LoadImage  (GetModuleHandle(NULL),MAKEINTRESOURCE(iconID),IMAGE_BITMAP,
+    //0,0,
+    //LR_DEFAULTSIZE);
+    return (Ptr)LoadBitmap (GetModuleHandle(NULL),MAKEINTRESOURCE(iconID));
+}
+
+
+//________________________________________________________
+long    GetVisibleStringWidth (_String& s, _HYFont& f)
+{
+    /*static HWND DumbWindow =
+                        CreateWindow("STATIC",
+                        "",
+                        SS_SIMPLE ,
+                        CW_USEDEFAULT,
+                        CW_USEDEFAULT,
+                        10,
+                        10,
+                        NULL,
+                        NULL,
+                        GetModuleHandle(NULL),
+                        NULL);        */
+    static _HYFont lastFont;
+    //HDC   defDC = GetDC(DumbWindow);
+    if ((lastFont.size!=f.size)||(lastFont.style!=f.style)||(lastFont.face!=f.face)) {
+        HFONT   newFont = CreateFont (f.size,0,0,0,(f.style&HY_FONT_BOLD)?FW_BOLD:FW_NORMAL,f.style&HY_FONT_ITALIC,FALSE,FALSE,ANSI_CHARSET,OUT_DEFAULT_PRECIS,
+                                      CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH|FF_DONTCARE,f.face.sData);
+        DeleteObject(SelectObject (otherDC,newFont));
+        lastFont.face = f.face;
+        lastFont.size = f.size;
+        lastFont.style = f.style;
+    }
+    SIZE  textSize;
+    GetTextExtentPoint32(otherDC,s.sData,s.sLength,&textSize);
+    //ReleaseDC (DumbWindow, defDC);
+    return textSize.cx;
+}
+
+//________________________________________________________
+
+long    SaveFileFunction (_String& fileName, _String& prompt, _String &startName, char* fileFilters, Ptr WindowHNDL)
+{
+    static char buffer[2049], buffer2[256];
+    OPENFILENAME ofn;
+    ofn.lStructSize = sizeof (OPENFILENAME);
+    ofn.hwndOwner = (HWND)WindowHNDL;
+
+    ofn.lpstrFilter = fileFilters;
+    ofn.lpstrCustomFilter = nil;
+
+    ofn.nFilterIndex = 1;
+
+    buffer[0] = 0;
+    buffer2[0] = 0;
+    ofn.lpstrFile = buffer;
+    ofn.nMaxFile = 2048;
+    ofn.lpstrFileTitle = buffer2;
+    memcpy (buffer,startName.sData,startName.sLength+1);
+    ofn.nMaxFileTitle = 255;
+    ofn.lpstrInitialDir = nil;
+    ofn.lpstrDefExt = nil;
+    if (lastWinPathUsed.sLength) {
+        ofn.lpstrInitialDir = lastWinPathUsed.getStr();
+    } else {
+        ofn.lpstrInitialDir = ((_String*)pathNames(0))->getStr();
+    }
+    ofn.lpstrTitle = prompt.getStr();
+    ofn.Flags           = OFN_HIDEREADONLY|OFN_PATHMUSTEXIST|OFN_OVERWRITEPROMPT|OFN_EXPLORER;
+
+    if (!GetSaveFileName (&ofn)) {
+        return -1;
+    }
+
+    fileName = buffer;
+    lastWinPathUsed = fileName.Cut (0,ofn.nFileOffset-1);
+
+    return     ofn.nFilterIndex-1;
+}
+
+//_________________________________________________________________________
+_HYColor    GetDialogBackgroundColor (void)
+{
+    COLORREF    backColor = GetSysColor (COLOR_MENU);
+    _HYColor    res = {GetRValue (backColor), GetGValue (backColor), GetBValue (backColor)};
+    return res;
+}
+
+//________________________________________________________
+_HYRect     GetScreenDimensions (void)
+{
+    /*RECT          dskRect;
+    GetWindowRect   (GetDesktopWindow(), &dskRect);
+    _HYRect         res = {0,0,0,0,0};
+
+    res.right       = dskRect.right-dskRect.left;
+    res.bottom      = dskRect.bottom-dskRect.top;
+
+    return res;*/
+
+    HMONITOR        defMonitor = MonitorFromPoint ((POINT) {
+        0,0
+    },MONITOR_DEFAULTTOPRIMARY);
+    MONITORINFO     mInfo;
+    mInfo.cbSize = sizeof (MONITORINFO);
+    GetMonitorInfo  (defMonitor,&mInfo);
+
+    _HYRect         res = {0,0,0,0,0};
+
+    res.right       = mInfo.rcWork.right-mInfo.rcWork.left+1;
+    res.bottom      = mInfo.rcWork.bottom-mInfo.rcWork.top-50;
+
+    /*char buffer [1024];
+
+    sprintf (buffer, "%d %d %d %d; %d %d %d %d\n",
+                     mInfo.rcWork.left, mInfo.rcWork.top, mInfo.rcWork.right, mInfo.rcWork.bottom,
+                     mInfo.rcMonitor.left, mInfo.rcMonitor.top, mInfo.rcMonitor.right, mInfo.rcMonitor.bottom );
+    BufferToConsole (buffer);*/
+
+    return res;
+}
+
+//________________________________________________________
+void        CenterWindow (_HYGuiObject* g)
+{
+    _HYWindow* w = (_HYWindow*)g;
+
+    _HYRect   screen = GetScreenDimensions();
+
+    long      cleft = 0, ctop = 0;
+
+    if (screen.right>w->right) {
+        cleft = (screen.right-w->right)/2;
+    }
+    if (screen.bottom>w->bottom) {
+        ctop = (screen.bottom-w->bottom)/2;
+    }
+
+    w->_SetPosition (cleft,ctop);
+}
+
+//_________________________________________________________________________
+void    DelayNMs (long ms)
+{
+    Sleep (ms);
+}
+
+//________________________________________________________
+
+long    SaveFileWithPopUp (_String& fileName, _String& prompt, _String& defFileName,
+                           _String& , _List& menuOptions)
+
+// TBI - add proper dialog window owner
+
+{
+    static char buffer[2049],
+           buffer2[256];
+
+    _String     formatString (128L, true);
+
+    long        k;
+
+    _List       extensions;
+
+    for (k=0; k<menuOptions.lLength; k++) {
+        _String* menuItem = (_String*)menuOptions(k);
+        formatString << menuItem;
+        formatString << '\0';
+        if ((menuItem->sLength>5)&&(menuItem->sData[menuItem->sLength-1]==')')
+                &&(menuItem->sData[menuItem->sLength-6]=='(')) {
+            formatString << '*';
+            formatString << menuItem->Cut (menuItem->sLength-5,menuItem->sLength-2);
+            extensions.AppendNewInstance (new _String(menuItem,menuItem->sLength-5,menuItem->sLength-2));
+        } else {
+            formatString << "*.*";
+            extensions && & empty;
+        }
+        formatString << '\0';
+    }
+    formatString.Finalize();
+
+    long res = SaveFileFunction (fileName, prompt, defFileName, formatString.sData, (Ptr)GetForegroundWindow());
+
+    if (res>=0) {
+        _String * ext = (_String*)extensions (res);
+        if (ext->sLength) {
+            if (fileName.FindAnyCase (*ext, fileName.sLength-ext->sLength, -1)<0) {
+                fileName = fileName & *ext;
+            }
+        }
+    }
+
+    return res;
+
+    /*OPENFILENAME ofn;
+    ofn.lStructSize = sizeof (OPENFILENAME);
+    ofn.hwndOwner   = nil;
+
+    ofn.lpstrFilter = formatString.sData;
+    ofn.lpstrCustomFilter = nil;
+
+    ofn.nFilterIndex = 0;
+
+    buffer[0]           = 0;
+    buffer2[0]          = 0;
+    ofn.lpstrFile       = buffer;
+    ofn.nMaxFile        = 2048;
+    ofn.lpstrFileTitle  = buffer2;
+    memcpy (buffer,defFileName.sData,defFileName.sLength+1);
+
+    ofn.nMaxFileTitle   = 255;
+    ofn.lpstrInitialDir = nil;
+    ofn.lpstrDefExt     = nil;
+    //ofn.lpfnHook      = sfwpHook;
+    ofn.lpfnHook        = nil;
+
+    if (lastWinPathUsed.sLength)
+        ofn.lpstrInitialDir = lastWinPathUsed.getStr();
+    else
+        ofn.lpstrInitialDir = ((_String*)pathNames(0))->getStr();
+
+    ofn.lpstrTitle      = prompt.getStr();
+    ofn.Flags           = OFN_HIDEREADONLY|OFN_PATHMUSTEXIST|OFN_OVERWRITEPROMPT|OFN_EXPLORER;
+
+    if (!GetSaveFileName (&ofn))
+        return -1;
+
+    fileName = buffer;
+    return     ofn.nFilterIndex-1;*/
+
+}
+
+//________________________________________________________
+
+int CALLBACK fontGeneratorProc (ENUMLOGFONT *lf, NEWTEXTMETRIC* , DWORD , LPARAM rec)
+{
+    _List * recList = (_List*)rec;
+    _String fontName (lf->elfLogFont.lfFaceName);
+    recList->BinaryInsert (&fontName);
+    return 1;
+}
+
+//_________________________________________________________________________
+
+void    GenerateFontList (_List& fonts)
+{
+    fonts.Clear();
+    EnumFontFamilies (GetDC(nil), nil, (FONTENUMPROC)fontGeneratorProc, (LPARAM)&fonts);
+}
+
+//__________________________________________________________________________________
+char    ScanDirectoryForFileNames (_String& source, _List& rec, bool recurse)
+{
+    _String searchSpec = source & "\\*";
+
+    WIN32_FIND_DATA      findData;
+
+    HANDLE  searchHandle = FindFirstFile (searchSpec.sData, &findData);
+
+    if (searchHandle!=INVALID_HANDLE_VALUE) {
+        while (1) {
+            if (findData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
+                if (recurse) {
+                    _String subDirSpec =  findData.cFileName;
+                    if (!subDirSpec.beginswith (".")) {
+                        subDirSpec = source & '\\' & subDirSpec;
+                        ScanDirectoryForFileNames (subDirSpec, rec, true);
+                    }
+                }
+            } else {
+                _String fullFileName = findData.cFileName;
+                if (!fullFileName.beginswith (".")) {
+                    fullFileName = source & '\\' & fullFileName;
+                    rec && & fullFileName;
+                }
+            }
+            if (!FindNextFile (searchHandle, &findData)) {
+                break;
+            }
+        }
+        FindClose (searchHandle);
+    }
+    return '\\';
+}
+
+//________________________________________________________
+
+void    StartBarTimer(void)
+{
+    lastTimer   = time(&timerStart);
+    updateTimer = true;
+}
+
+//________________________________________________________
+
+void    StopBarTimer(void)
+{
+    updateTimer = false;
+}
+
+//________________________________________________________
+void    ToggleAnalysisMenu (bool running)
+{
+    HMENU anMenu = GetSubMenu (GetMenu((HWND)hyphyConsoleWindow->GetOSWindowData()), 2);
+    if (running) {
+        EnableMenuItem (anMenu, 0, MF_ENABLED|MF_BYPOSITION);
+        EnableMenuItem (anMenu, 1, MF_ENABLED|MF_BYPOSITION);
+        EnableMenuItem (anMenu, 5, MF_GRAYED|MF_BYPOSITION);
+        EnableMenuItem (anMenu, 6, MF_GRAYED|MF_BYPOSITION);
+        EnableMenuItem (anMenu, 7, MF_GRAYED|MF_BYPOSITION);
+    } else {
+        EnableMenuItem (anMenu, 5, MF_ENABLED|MF_BYPOSITION);
+        EnableMenuItem (anMenu, 6, MF_ENABLED|MF_BYPOSITION);
+        EnableMenuItem (anMenu, 7, MF_ENABLED|MF_BYPOSITION);
+        EnableMenuItem (anMenu, 0, MF_GRAYED|MF_BYPOSITION);
+        EnableMenuItem (anMenu, 1, MF_GRAYED|MF_BYPOSITION);
+        SetStatusBarValue (-1,1,0);
+        SetStatusLine ("Idle");
+    }
+    DrawMenuBar ((HWND)hyphyConsoleWindow->GetOSWindowData());
+}
+
+//________________________________________________________
+_HYColor        SelectAColor (_HYColor& currentColor, _String& )
+{
+    static              COLORREF     customColors[16];
+    CHOOSECOLOR  cc;
+    cc.lStructSize = sizeof (CHOOSECOLOR);
+    cc.hwndOwner = GetFocus ();
+    cc.hInstance = nil;
+    cc.rgbResult = RGB (currentColor.R, currentColor.G, currentColor.B);
+    cc.lpCustColors = customColors;
+    cc.Flags = CC_ANYCOLOR|CC_RGBINIT|CC_FULLOPEN;
+    cc.lCustData = nil;
+    cc.lpfnHook  = nil;
+    cc.lpTemplateName = nil;
+
+    if (ChooseColor (&cc)) {
+        _HYColor res;
+        res.R = GetRValue (cc.rgbResult);
+        res.G = GetGValue (cc.rgbResult);
+        res.B = GetBValue (cc.rgbResult);
+        return res;
+    }
+    return currentColor;
+}
+
+//________________________________________________________
+long    GetMaxCharWidth (_HYFont& f)
+{
+    _String testString ('W');
+    return  GetVisibleStringWidth (testString, f)+2;
+}
+
+//________________________________________________________
+
+char        YesNoCancelPrompt (_String& prompt)
+{
+    int res = MessageBox (GetForegroundWindow(), prompt.sData, "HyPhy Prompt", MB_YESNOCANCEL|MB_ICONQUESTION|
+                          MB_DEFBUTTON1|MB_APPLMODAL);
+    if (res == IDYES) {
+        return 1;
+    }
+    if (res == IDCANCEL) {
+        return 2;
+    }
+
+    return 3;
+}
+
+//________________________________________________________
+
+char    * ReturnFileDialogSelectionWin (bool write, _String* initDir)
+{
+    static char buffer[2049], buffer2[256];
+    OPENFILENAME ofn;
+    ofn.lStructSize = sizeof (OPENFILENAME);
+    ofn.hwndOwner = GetForegroundWindow();
+
+    char  fileFilters[] = "HYPHY Batch Files\0*.bf\0Data File\0*.dat;*.nuc;*.seq;*.phy;*.nex;\0All Files\0*.*\0\0";
+    ofn.lpstrFilter = fileFilters;
+    ofn.lpstrCustomFilter = nil;
+
+    ofn.nFilterIndex = 3;
+
+    buffer2[0] = 0;
+    if (defFileNameValue.sLength) {
+        if (defFileNameValue.sLength > 2048) {
+            _String truncString (defFileNameValue,0,2047);
+            strcpy (buffer, truncString.sData);
+        } else {
+            strcpy (buffer, defFileNameValue.sData);
+        }
+    } else {
+        buffer[0] = 0;
+    }
+
+    ofn.lpstrFile = buffer;
+    ofn.nMaxFile = 2048;
+    ofn.lpstrFileTitle = buffer2;
+    ofn.nMaxFileTitle = 255;
+
+    if (initDir) {
+        ofn.lpstrInitialDir = initDir->sData;
+    } else {
+        if (lastWinPathUsed.sLength) {
+            ofn.lpstrInitialDir = lastWinPathUsed.getStr();
+        } else if (pathNames.lLength) {
+            ofn.lpstrInitialDir = ((_String*)pathNames(0))->getStr();
+        } else {
+            ofn.lpstrInitialDir = baseDirectory.getStr();
+        }
+    }
+
+    ofn.lpstrDefExt = nil;
+    ofn.lpstrTitle = dialogPrompt.getStr();
+    ofn.Flags = 0;
+    ofn.Flags|=OFN_FILEMUSTEXIST;
+    ofn.Flags|=OFN_HIDEREADONLY;
+    ofn.Flags|=OFN_PATHMUSTEXIST;
+    /*char defExt[] = ".bf";*/
+
+
+    bool         res;
+
+    if (write) {
+        res = GetSaveFileName (&ofn);
+    } else {
+        res = GetOpenFileName (&ofn);
+    }
+
+    if (res) {
+        lastFileTypeSelection = ofn.nFilterIndex;
+        lastWinPathUsed = buffer;
+        lastWinPathUsed = lastWinPathUsed.Cut (0,ofn.nFileOffset-1);
+        return            buffer;
+    } else {
+        return            empty.sData;
+    }
+
+}
+
+//________________________________________________________
+
+bool    PopUpFileDialog(_String ps, _String* defaultLocation)
+{
+    _String saveDP = dialogPrompt,
+            res;
+
+    dialogPrompt = ps;
+    res = ReturnFileDialogSelectionWin (false, defaultLocation);
+    if (argFileName) {
+        *argFileName = res;
+    } else {
+        argFileName = new _String (res);
+        checkPointer (argFileName);
+    }
+
+    dialogPrompt = saveDP;
+    return argFileName->sLength;
+}
+
+//_________________________________________________________________________
+
+void    MoveConsoleWindow (_HYRect& newLoc)
+{
+    //SetWindowPos(WindowHandle, nil, newLoc.left, newLoc.top,newLoc.right-newLoc.left,newLoc.bottom-newLoc.top,
+    //SWP_NOZORDER);
+
+    hyphyConsoleWindow->SetPosition         (newLoc.left, newLoc.top);
+    hyphyConsoleWindow->SetWindowRectangle  (newLoc.top,newLoc.left,newLoc.bottom,newLoc.right,true);
+}
+
+//_________________________________________________________________________
+
+_String ChooseAFolder       (_String& prompt)
+{
+    BROWSEINFO BI;
+    ITEMIDLIST *IDL;
+
+    char       cDirName [MAX_PATH+1];
+
+    memset(&BI, 0, sizeof(BI));
+
+    BI.hwndOwner = GetFocus();
+    BI.pszDisplayName = cDirName;
+    BI.lpszTitle = prompt.sData;
+    BI.ulFlags = BIF_RETURNONLYFSDIRS;
+
+    if( IDL = SHBrowseForFolder(&BI) ) {
+        LPMALLOC pMalloc;
+        BOOL bOK;
+        SHGetMalloc(&pMalloc);
+        bOK = SHGetPathFromIDList(IDL, cDirName);
+        pMalloc->Free(pMalloc);
+        pMalloc->Release();
+        return cDirName;
+    }
+    return empty;
+}
+
+//_________________________________________________________________________
+
+void    ShowObjectInspector (void)
+{
+    long f = FindWindowByName (objectInspectorTitle);
+    if (f>=0) {
+        SetForegroundWindow ((HWND)windowPtrs (f));
+    } else {
+        _HYObjectInspector* newOI = new _HYObjectInspector ();
+        newOI->Activate       ( );
+    }
+}
+
+//_________________________________________________________________________
+void    PositionWindow          (_HYGuiObject* twp, _String* args)
+{
+    _List * argL = args->Tokenize (",");
+    _HYWindow*   tw = (_HYWindow*)twp;
+    if (argL->lLength>=4) {
+        long R[5],
+             k;
+
+        for (k=0; k<4; k++) {
+            R[k] = ((_String*)(*argL)(k))->toNum();
+        }
+        if (argL->lLength>4) {
+            R[4] = ((_String*)(*argL)(4))->toNum();
+        } else {
+            R[4] = 0;
+        }
+
+        _HYRect   wR = GetScreenDimensions  (),
+                  wiR;
+        long      W[4] = {wR.left,wR.top, wR.right, wR.bottom};
+        for (k=0; k<4; k++)
+            if (R[k]<0) {
+                R[k] = W[k] + ((k<2)?-1:1)*R[k];
+            }
+
+        wiR.left    = R[0];
+        wiR.right   = R[2];
+        wiR.top     = R[1];
+        wiR.bottom  = R[3];
+
+        if (wiR.left>=wiR.right) {
+            wiR.right = 1+wiR.left;
+        }
+        if (wiR.top>=wiR.bottom) {
+            wiR.bottom = 1+wiR.top;
+        }
+
+        tw->SetPosition        (wiR.left,wiR.top);
+        tw->SetWindowRectangle (0,0,wiR.bottom-wiR.top,wiR.right-wiR.left);
+
+        if (R[4]>0) {
+            wiR.top         = wiR.bottom+2;
+            wiR.bottom      = wR.bottom - 2;
+            wiR.left        = 5;
+            wiR.right       = wR.right - 2;
+            MoveConsoleWindow (wiR);
+        }
+
+    }
+
+    DeleteObject (argL);
+}
+
+//_________________________________________________________________________
+
+bool    Get_a_URL (_String& urls, _String* fileName)
+{
+
+    DWORD dwSize     = 0,
+          dataChunk = 65536,
+          totalRead = 0;
+
+    HINTERNET   hRootHandle = InternetOpen   (GetVersionString().sData,INTERNET_OPEN_TYPE_DIRECT ,nil,nil,0),
+                hUrlDump;
+
+
+    FILE*       f = nil;
+    _String*     storage = nil;
+
+    if (hRootHandle) {
+        if (fileName) {
+            f = fopen (fileName->sData,"wb");
+            if (!f) {
+                urls = "Failed to create/open target file";
+                return false;
+            }
+        } else {
+            checkPointer (storage = new _String (dataChunk,true));
+        }
+
+        hUrlDump = InternetOpenUrl(hRootHandle, urls.sData, NULL, NULL, INTERNET_FLAG_RAW_DATA|INTERNET_FLAG_NO_CACHE_WRITE, 0);
+
+        SetStatusLine (_String("Retrieving ")& urls);
+        do {
+            Ptr buffer = MemAllocate (dataChunk+1);
+            if(!InternetReadFile(hUrlDump,(LPVOID)buffer,dataChunk,&dwSize)) {
+                free (buffer);
+                break;
+            } else {
+                buffer[dwSize]='\0';
+
+                if (dwSize == 0) {
+                    if (f) {
+                        fclose (f);
+                    }
+
+                    if (storage) {
+                        storage->Finalize();
+                        urls = *storage;
+                        DeleteObject (storage);
+                    }
+
+                    free (buffer);
+                    InternetCloseHandle (hRootHandle);
+                    SetStatusLine     ("Idle");
+                    return true;
+                } else {
+                    if (storage) {
+                        (*storage) << buffer;
+                    } else {
+                        fwrite (buffer,1,dwSize,f);
+                    }
+
+                    totalRead+=dwSize;
+
+                    SetStatusLine (_String("Read ") & (long)(totalRead/1024) & "KB from " & urls);
+                }
+            }
+
+        } while (true);
+
+        InternetCloseHandle (hRootHandle);
+    }
+
+
+    SetStatusLine     ("Idle");
+
+    LPVOID lpMsgBuf;
+
+    if (!FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
+                        NULL,GetLastError(),MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR) &lpMsgBuf,0,NULL )) {
+        urls = "Unknown system error";
+    }
+
+    if (f) {
+        fclose (f);
+    }
+
+    if (storage) {
+        DeleteObject (storage);
+    }
+
+    urls = (char*)lpMsgBuf;
+    LocalFree( lpMsgBuf );
+
+    return false;
+}
\ No newline at end of file
diff --git a/src/gui/win/WindowClasses/HYPlatformBootsrapWindow.cpp b/src/gui/win/WindowClasses/HYPlatformBootsrapWindow.cpp
new file mode 100644
index 0000000..bae3a1c
--- /dev/null
+++ b/src/gui/win/WindowClasses/HYPlatformBootsrapWindow.cpp
@@ -0,0 +1 @@
+/*
    Win 32 rtions of the bootstrap window class

    Sergei L. Kosakovsky Pond, Spring 2000 - January 2003.
*/

#include "HYParameterTable.h"


//__________________________________________________________________


bool        _HYBootstrapWindow::_ProcessMenuSelection (long msel)
{
    switch (msel) {
    case HY_WINDOW_MENU_ID_FILE+1 : { // file menu
        DoSave ();
        return true;
    }

    case HY_WINDOW_MENU_ID_FILE+2 : { // print menu
        _HYTable* t =  (_HYTable*)GetCellObject (2,0);
        t->_PrintTable((_HYTable*)GetCellObject (1,0));
        return true;
    }
    }

    if (_HYTWindow::_ProcessMenuSelection(msel)) {
        return true;
    }

    return false;
}




//EOF
\ No newline at end of file
diff --git a/src/gui/win/WindowClasses/HYPlatformChartWindow.cpp b/src/gui/win/WindowClasses/HYPlatformChartWindow.cpp
new file mode 100644
index 0000000..62d0212
--- /dev/null
+++ b/src/gui/win/WindowClasses/HYPlatformChartWindow.cpp
@@ -0,0 +1 @@
+/*
    Win32 Portions of the chart window class

    Sergei L. Kosakovsky Pond, Spring 2000 - December 2002.
*/

#include "HYChartWindow.h"
#include "HYCanvas.h"
#include "HYUtils.h"
#include "HYPulldown.h"
#include "HYDialogs.h"

#include "math.h"

extern   _Parameter                pi_const;

#define  HY_CHART_WIN32_MENU_BASE   6000
#define  HY_CHARTD_WIN32_MENU_BASE  27000


//__________________________________________________________________

void _HYChartWindow::_SetMenuBar(void)
{
    _HYWindow::_SetMenuBar();

    HMENU            windowMenu = GetMenu (theWindow),
                     editMenu   = GetSubMenu(windowMenu,1),
                     chartMenu  = GetSubMenu(windowMenu,2);

    if (!chartMenu) {
        chartMenu = CreateMenu();

        HMENU          saveMenu  =  CreatePopupMenu(),
                       printMenu =  CreatePopupMenu(),
                       fontMenu  =  CreatePopupMenu(),
                       procMenu  =  CreatePopupMenu();

        EnableMenuItem (editMenu,2,MF_BYPOSITION|MF_ENABLED);
        EnableMenuItem (editMenu,4,MF_BYPOSITION|MF_ENABLED);
        EnableMenuItem (editMenu,6,MF_BYPOSITION|MF_ENABLED);

        checkPointer  (saveMenu);
        checkPointer  (chartMenu);
        checkPointer  (fontMenu);
        checkPointer  (printMenu);
        checkPointer  (procMenu);

        InsertMenu      (chartMenu, 0xFFFFFFFF, MF_BYPOSITION|MF_STRING, HY_CHART_WIN32_MENU_BASE+4, "Chart &Name");
        InsertMenu      (chartMenu, 0xFFFFFFFF, MF_BYPOSITION|MF_STRING, HY_CHART_WIN32_MENU_BASE, "Chart &Options");

        InsertMenu      (saveMenu,  0xFFFFFFFF, MF_BYPOSITION|MF_STRING, HY_WINDOW_MENU_ID_FILE+1, "Save &Chart\tCtrl-S");
        InsertMenu      (saveMenu,  0xFFFFFFFF, MF_BYPOSITION|MF_STRING, HY_WINDOW_MENU_ID_FILE+3, "Save &Graphic");
        InsertMenu      (saveMenu,  0xFFFFFFFF, MF_BYPOSITION|MF_STRING, HY_WINDOW_MENU_ID_FILE+4, "Save &Table");

        InsertMenu      (printMenu, 0xFFFFFFFF, MF_BYPOSITION|MF_STRING, HY_WINDOW_MENU_ID_FILE+2, "Print &Graphic\tCtrl-P");
        InsertMenu      (printMenu, 0xFFFFFFFF, MF_BYPOSITION|MF_STRING, HY_WINDOW_MENU_ID_FILE+5, "Print &Data");

        InsertMenu      (fontMenu,  0xFFFFFFFF, MF_BYPOSITION|MF_STRING, HY_CHART_WIN32_MENU_BASE+1, "&Tickmark  Font");
        InsertMenu      (fontMenu,  0xFFFFFFFF, MF_BYPOSITION|MF_STRING, HY_CHART_WIN32_MENU_BASE+2, "&Legend Font");
        InsertMenu      (fontMenu,  0xFFFFFFFF, MF_BYPOSITION|MF_STRING, HY_CHART_WIN32_MENU_BASE+3, "&Axis Label  Font");


        InsertMenu      (chartMenu, 0xFFFFFFFF, MF_BYPOSITION|MF_POPUP, (UINT)fontMenu, "&Fonts");
        InsertMenu      (chartMenu, 0xFFFFFFFF, MF_BYPOSITION|MF_SEPARATOR, 0, nil);

        if (chartProcessors.lLength == 0) {
            InsertMenu      (chartMenu, 0xFFFFFFFF, MF_BYPOSITION|MF_STRING|MF_GRAYED, 0, "&Data Processing");
            DestroyMenu     (procMenu);
        } else {
            for (long k=0; k<chartProcessors.lLength; k++) {
                _String *thisItem = (_String*)chartProcessors (k),
                         chopped = thisItem->Cut (thisItem->FindBackwards ('\\',0,-1)+1,-1);

                InsertMenu      (procMenu, 0xFFFFFFFF, MF_BYPOSITION|MF_STRING, HY_CHART_WIN32_MENU_BASE+5+k, chopped.sData);
            }
            InsertMenu      (chartMenu, 0xFFFFFFFF, MF_BYPOSITION|MF_POPUP, (UINT)procMenu, "&Data Processing");
        }

        InsertMenu   (windowMenu, 2, MF_BYPOSITION|MF_POPUP, (UINT) chartMenu , "&Chart");

        chartMenu =  GetSubMenu(windowMenu,0);

        ModifyMenu   (chartMenu, 0, MF_BYPOSITION|MF_POPUP, (UINT) saveMenu , "&Save");
        ModifyMenu   (chartMenu, 1, MF_BYPOSITION|MF_POPUP, (UINT) printMenu , "&Print");

        _AddStandardAccels();
        _BuildAccelTable  (true);
        accels.Clear();
    }
}

//__________________________________________________________________

void _HYChartWindow::_UnsetMenuBar(void)
{

}

//__________________________________________________________________

void        _HYChartWindow::_PrintChart(void)
{

    DOCINFO                 di = {sizeof(DOCINFO), "HYPHY.out", NULL };
    PRINTDLG                pd;
    BOOL                    SuccessFlag;

    pd.lStructSize         = sizeof(PRINTDLG);
    pd.hwndOwner           = theWindow;
    pd.hDevMode            = NULL;
    pd.hDevNames           = NULL;
    pd.hDC                 = NULL;
    pd.Flags               = PD_COLLATE | PD_RETURNDC | PD_NOSELECTION;
    pd.nFromPage           = 1;
    pd.nToPage             = 0xffff;
    pd.nMinPage            = 1;
    pd.nMaxPage            = 0xffff;
    pd.nCopies             = 1;
    pd.hInstance           = NULL;
    pd.lCustData           = 0L;
    pd.lpfnPrintHook       = NULL;
    pd.lpfnSetupHook       = NULL;
    pd.lpPrintTemplateName = NULL;
    pd.lpSetupTemplateName = NULL;
    pd.hPrintTemplate      = NULL;
    pd.hSetupTemplate      = NULL;

    if (!PrintDlg(&pd)) {
        return;
    }

    if (pd.hDC == NULL) {
        pd.hDC = GetPrinterDeviceContext(theWindow);
    }


    EnableWindow(theWindow, FALSE);

    SuccessFlag   = TRUE;
    UserAbortFlag = FALSE;

    PrintDialogHandle = CreateDialog(GetModuleHandle(NULL), (LPCTSTR)"PrintDlgBox", theWindow,
                                     PrintDialogProc);
    SetDlgItemText(PrintDialogHandle, IDD_FNAME, "Chart Printing...");

    SetAbortProc(pd.hDC, AbortProc);

    if (StartDoc(pd.hDC, &di) > 0) {
        HDC         windowDC = GetDC (theWindow);

        long        printW = GetDeviceCaps(pd.hDC, HORZRES),
                    printH = GetDeviceCaps(pd.hDC, VERTRES),

                    hRes = GetDeviceCaps(pd.hDC, LOGPIXELSX),
                    vRes = GetDeviceCaps(pd.hDC, LOGPIXELSY),

                    screenHRes = GetDeviceCaps(windowDC, LOGPIXELSX),
                    screenVRes = GetDeviceCaps(windowDC, LOGPIXELSY),

                    fromPage = pd.nMinPage,
                    toPage   = pd.nMaxPage;


        if (pd.Flags & PD_PAGENUMS) {
            fromPage = pd.nFromPage;
            toPage   = pd.nToPage;
        }

        ReleaseDC   (theWindow, windowDC);
        hRes = printW*((_Parameter)screenHRes/hRes);
        vRes = printH*((_Parameter)screenVRes/vRes);
        screenHRes = printW;
        screenVRes = printH;

        printW = hRes;
        printH = vRes;

        if (StartPage (pd.hDC) <= 0) {
            SuccessFlag = FALSE;
        } else {
            SetMapMode  (pd.hDC, MM_ISOTROPIC);
            SetWindowExtEx (pd.hDC, hRes, vRes,nil);
            SetViewportExtEx (pd.hDC, screenHRes, screenVRes, nil);

            _HYRect     viewRect  = ((_HYStretchCanvas*)GetObject (0))->GetCanvasSize();

            _Parameter  aspectRatio = viewRect.right/(_Parameter)viewRect.bottom;

            _HYRect     printRect = {0,0,printH, printH*aspectRatio,0};

            if (printRect.right > printW) {
                aspectRatio = printW/(_Parameter)printRect.right;
                printRect.right = printW;
                printRect.bottom *= aspectRatio;
            }

            _HYStretchCanvas    *sc = (_HYStretchCanvas*)GetObject (0);
            HDC         saveDC = sc->thePane;

            sc->thePane = pd.hDC;
            DrawChart   (&printRect);
            sc->thePane = saveDC;

            if (EndPage (pd.hDC) <= 0) {
                SuccessFlag = FALSE;
            }
        }
    } else {
        SuccessFlag = FALSE;
    }

    if (SuccessFlag) {
        SuccessFlag = (EndDoc(pd.hDC)>0);
    }

    if (!UserAbortFlag) {
        EnableWindow(theWindow, TRUE);
        DestroyWindow(PrintDialogHandle);
    }

    DeleteDC (pd.hDC);

    if (!SuccessFlag && !UserAbortFlag) {
        _String errMsg = _String("Failed to print the chart. Windows Error:") & (long)GetLastError();
        ProblemReport (errMsg,nil);
    }
}


//__________________________________________________________________


bool        _HYChartWindow::_ProcessMenuSelection (long msel)
{

    switch (msel) {
    case HY_CHART_WIN32_MENU_BASE: { // chart menu
        HandleChartOptions ();
        return true;
    }
    case HY_WINDOW_MENU_ID_FILE+1: // save menu
    case HY_WINDOW_MENU_ID_FILE+3: // save menu
    case HY_WINDOW_MENU_ID_FILE+4: { // save menu
        DoSave ((msel==HY_WINDOW_MENU_ID_FILE-1)?0:msel-HY_WINDOW_MENU_ID_FILE-2);
        return true;
    }
    case HY_WINDOW_MENU_ID_FILE+2: // print menu
    case HY_WINDOW_MENU_ID_FILE+5: { // print menu
        DoPrint ((msel==HY_WINDOW_MENU_ID_FILE+2)?0:-1);
        return true;
    }
    case HY_CHART_WIN32_MENU_BASE+1: // font menu
    case HY_CHART_WIN32_MENU_BASE+2: // font menu
    case HY_CHART_WIN32_MENU_BASE+3: { // font menu
        DoChangeFont (msel-HY_CHART_WIN32_MENU_BASE-1);
        return true;
    }
    case HY_CHART_WIN32_MENU_BASE+4: { // chart name
        RenameChartWindow ();
        return true;
    }
    default: { // proc menu
        if (msel>=HY_CHART_WIN32_MENU_BASE+5) {
            ExecuteProcessor (msel-HY_CHART_WIN32_MENU_BASE-5);
            return true;
        }
    }
    }

    return _HYTWindow::_ProcessMenuSelection(msel);
}

//__________________________________________________________________

bool _HYChartWindow::_ProcessOSEvent (Ptr vEvent)
{
    static int   lastH = -1,
                 lastV = -1;

    if (!_HYTWindow::_ProcessOSEvent (vEvent)) {
        _HYWindowsUIMessage*    theEvent = (_HYWindowsUIMessage*)vEvent;

        if (components.lLength == 0) {
            return false;
        }

        _HYPullDown *p1 = (_HYPullDown*)GetObject (4);

        if (p1&&(p1->GetSelection()>=8)&&(ySeries.lLength)) {
            switch (theEvent->iMsg) {
            case WM_LBUTTONDOWN: {
                lastH = (short)LOWORD (theEvent->lParam);
                lastV = (short)HIWORD (theEvent->lParam);


                if (FindClickedCell(lastH, lastV)!=0) { // the chart
                    lastH = -1;
                    lastV = -1;
                } else {
                    SetCapture (theWindow);
                    return      true;
                }
                break;
            }

            case WM_LBUTTONUP: {
                if (lastH>=0) {
                    ReleaseCapture ();
                    lastH = -1;
                    lastV = -1;
                    return  true;
                }
                break;
            }

            case WM_MOUSEMOVE: {
                if (lastH>=0) {
                    short       newH = (short)LOWORD (theEvent->lParam),
                                newV = (short)HIWORD (theEvent->lParam);

                    bool        redraw = false;

                    _Parameter  stepper = pi_const/180.;

                    if (abs(newH-lastH)>abs(newV-lastV)) {
                        stepper *= 1+log (fabs(newH-lastH))/log(2.0);
                        if (newH-lastH<0) {
                            if (xyAngle>0.0) {
                                xyAngle -= stepper;
                                if (xyAngle<0) {
                                    xyAngle = 0;
                                }
                                redraw = true;
                            }
                        } else if (xyAngle<pi_const/2) {
                            xyAngle += stepper;
                            if (xyAngle>pi_const/2) {
                                xyAngle = pi_const/2;
                            }
                            redraw = true;
                        }
                    } else {
                        if (newV==lastV) {
                            return false;
                        }
                        stepper *= 1+log (fabs(newV-lastV))/log(2.0);
                        if (newV-lastV>0) {
                            if (zAngle<pi_const/2) {
                                zAngle += stepper;
                                if (zAngle>pi_const/2) {
                                    zAngle = pi_const/2;
                                }
                                redraw = true;
                            }
                        } else if (zAngle>0.0) {
                            zAngle -= stepper;
                            if (zAngle<0) {
                                zAngle = 0;
                            }
                            redraw = true;
                        }

                    }

                    if (redraw) {
                        ComputeProjectionSettings();
                        projectionMatrix = ComputeProjectionMatrix   ();
                        forceUpdateForScrolling = true;
                        DrawChart();
                        forceUpdateForScrolling = false;
                    }

                    lastH = newH;
                    lastV = newV;
                }
                break;
            }
            }
        }
        return false;
    }
    return true;
}

//__________________________________________________________________

void _HYChartWindow::_CopyChart (void)
{
    _HYStretchCanvas    *sc = (_HYStretchCanvas*)GetObject (0);
    PlaceBitmapInClipboard (sc->paneBitMap, theWindow);
}

//__________________________________________________________________

void _HYDistributionChartWindow::_SetMenuBar(void)
{
    HMENU            chartMenu  = GetSubMenu(windowMenu,3);

    if (!chartMenu) {
        chartMenu = CreateMenu();


        InsertMenu      (chartMenu, 0xFFFFFFFF, MF_BYPOSITION|MF_STRING , HY_CHARTD_WIN32_MENU_BASE, "Define New &Variable");
        InsertMenu      (chartMenu, 0xFFFFFFFF, MF_BYPOSITION|MF_STRING , HY_CHARTD_WIN32_MENU_BASE+1, "&Delete Variable");
        InsertMenu      (chartMenu,  0xFFFFFFFF, MF_BYPOSITION|MF_STRING, HY_CHARTD_WIN32_MENU_BASE+2, "&Conditional Distribution");

        if (distribProcessors.lLength > 0) {
            InsertMenu      (chartMenu, 0xFFFFFFFF, MF_BYPOSITION|MF_SEPARATOR, 0, nil);
            for (long k=0; k<distribProcessors.lLength; k++) {
                _String *thisItem = (_String*)distribProcessors (k),
                         chopped = thisItem->Cut (thisItem->FindBackwards ('\\',0,-1)+1,-1);

                InsertMenu      (chartMenu, 0xFFFFFFFF, MF_BYPOSITION|MF_STRING, HY_CHARTD_WIN32_MENU_BASE+3+k, chopped.sData);
            }
        }

        InsertMenu   (windowMenu, 3, MF_BYPOSITION|MF_POPUP, (UINT) chartMenu , "Cate&gories");
    }
}

//__________________________________________________________________

void _HYDistributionChartWindow::_UnsetMenuBar(void)
{
    _HYChartWindow::_UnsetMenuBar();
}

//__________________________________________________________________

bool _HYDistributionChartWindow::_ProcessMenuSelection (long msel)
{
    switch (msel) {
    case HY_CHARTD_WIN32_MENU_BASE: {
        AddVariable ();
        return true;
    }
    case HY_CHARTD_WIN32_MENU_BASE+1: {
        RemoveVariable ();
        return true;
    }
    case HY_CHARTD_WIN32_MENU_BASE+2: {
        ShowMarginals ();
        return true;
    }
    default: {
        if (msel>=HY_CHARTD_WIN32_MENU_BASE+3) {
            HandleCatPostProcessor (msel-HY_CHARTD_WIN32_MENU_BASE-3);
            return true;
        }
    }
    }

    return _HYChartWindow::_ProcessMenuSelection(msel);
}



//EOF
\ No newline at end of file
diff --git a/src/gui/win/WindowClasses/HYPlatformConsoleWindow.cpp b/src/gui/win/WindowClasses/HYPlatformConsoleWindow.cpp
new file mode 100644
index 0000000..a6d8c69
--- /dev/null
+++ b/src/gui/win/WindowClasses/HYPlatformConsoleWindow.cpp
@@ -0,0 +1,584 @@
+/*
+    Win 32 Portions of the console window class
+
+    Sergei L. Kosakovsky Pond, December 2003.
+*/
+
+#include "HYConsoleWindow.h"
+#include "HYTextBox.h"
+#include "HYDialogs.h"
+#include "HYUtils.h"
+#include "HYDataPanel.h"
+#include "HYEventTypes.h"
+#include "HYSharedMain.h"
+#include "preferences.h"
+
+#include "time.h"
+#include "parser.h"
+
+extern   HFONT   statusBarBold,
+         statusBarPlain;
+
+extern   bool    hyphyExiting;
+
+//extern     _String selectedFileName,
+//               savedFileName;
+
+
+extern  time_t   timerStart,
+        lastTimer;
+
+extern  HMENU    recentFilesMenu;
+
+LARGE_INTEGER    lastMeasure = {0,0};
+
+void             RunStandardAnalyses (void);
+void             displayAbout        (bool);
+void             getUserFont         (void);
+void             UpdateTimer         (void);
+
+//__________________________________________________________________
+
+void _HYConsoleWindow::_SetMenuBar(void)
+{
+    if (!menuKeys) {
+        menuKeys = LoadAccelerators (ProgramInstance,"HYPHY");
+    }
+    //_HYWindow::_SetMenuBar();
+}
+
+//__________________________________________________________________
+
+void _HYConsoleWindow::_UpdateEditMenu (void)
+{
+
+    _HYTextBox* txb = (_HYTextBox*)GetObject (0);
+
+    HWND        te = txb->te;
+
+    CHARRANGE   cr;
+
+    SendMessage (te,EM_EXGETSEL,0,(LPARAM)&cr);
+
+    bool        haveSelection = cr.cpMax-cr.cpMin,
+                canPaste      = SendMessage (te,EM_CANPASTE,CF_TEXT,0),
+                canUndo        = SendMessage (te,EM_GETUNDONAME,0,0),
+                canRedo         = SendMessage (te,EM_CANREDO,0,0);
+
+    if ((((bool)editOptions&HY_CONSOLE_CAN_COPY)!=haveSelection)||
+            (((bool)editOptions&HY_CONSOLE_CAN_PASTE)!=canPaste)||
+            (((bool)editOptions&HY_CONSOLE_CAN_UNDO)!=canUndo)||
+            (((bool)editOptions&HY_CONSOLE_CAN_UNDO)!=canRedo)) {
+        HMENU            windowMenu = GetMenu (theWindow),
+                         editMenu   = GetSubMenu(windowMenu,1);
+
+        editOptions = 0;
+
+        if (haveSelection) {
+            editOptions |= HY_CONSOLE_CAN_COPY;
+        }
+
+        EnableMenuItem (editMenu,3,MF_BYPOSITION|(haveSelection?MF_ENABLED:MF_GRAYED));
+        EnableMenuItem (editMenu,4,MF_BYPOSITION|(haveSelection?MF_ENABLED:MF_GRAYED));
+
+        if (canPaste) {
+            editOptions |= HY_CONSOLE_CAN_PASTE;
+        }
+
+        EnableMenuItem (editMenu,5,MF_BYPOSITION|(canPaste?MF_ENABLED:MF_GRAYED));
+
+        if (canUndo) {
+            editOptions |= HY_CONSOLE_CAN_UNDO;
+        }
+
+        EnableMenuItem (editMenu,0,MF_BYPOSITION|(canUndo?MF_ENABLED:MF_GRAYED));
+
+        if (canRedo) {
+            editOptions |= HY_CONSOLE_CAN_REDO;
+        }
+
+        EnableMenuItem (editMenu,1,MF_BYPOSITION|(canRedo?MF_ENABLED:MF_GRAYED));
+    }
+}
+
+//__________________________________________________________________
+
+void _HYConsoleWindow::_UnsetMenuBar(void)
+{
+    _HYWindow::_UnsetMenuBar();
+}
+
+//__________________________________________________________________
+
+bool        _HYConsoleWindow::_ProcessMenuSelection (long msel)
+{
+    switch (msel) {
+    case 13:
+        SaveConsole ();
+        return true;
+
+    case 14:
+        _DoPrint ();
+        return true;
+
+    case 16:
+        ((_HYTextBox*)GetObject(0))->_DoUndo(true);
+        return true;
+
+    case 17:
+        ((_HYTextBox*)GetObject(0))->_DoCut(true);
+        return true;
+
+    case 18:
+        ((_HYTextBox*)GetObject(0))->_DoCopy(true);
+        return true;
+
+    case 20:
+        ((_HYTextBox*)GetObject(0))->_DoSelectAll(true);
+        return true;
+
+    case 21:
+        SetStatusLine ("Canceling");
+        terminateExecution = true;
+        return true;
+
+    case 22:
+        if (!isSuspended) {
+            isSuspended = true;
+            SetStatusLine (empty,empty,empty,-1,HY_SL_SUSPEND);
+            HMENU       sMenu = GetSubMenu (GetMenu((HWND)GetOSWindowData()),2);
+            if (sMenu) {
+                EnableMenuItem(sMenu, 0 ,MF_GRAYED|MF_BYPOSITION);
+            }
+            ModifyMenu (sMenu,1,MF_BYPOSITION,22,"&Resume\tCtrl+;");
+            updateTimer = false;
+        } else {
+            isSuspended = false;
+            SetStatusLine (empty,empty,empty,-1,HY_SL_RESUME);
+            HMENU       sMenu = GetSubMenu (GetMenu((HWND)GetOSWindowData()),2);
+            if (sMenu) {
+                EnableMenuItem(sMenu, 0 ,MF_ENABLED|MF_BYPOSITION);
+            }
+
+            ModifyMenu (sMenu,1,MF_BYPOSITION,22,"&Suspend Execution\tCtrl+;");
+            time_t      tt;
+            timerStart += time(&tt)-lastTimer;
+            updateTimer = true;
+        }
+        return true;
+
+    case 23:
+        ShowMessagesLog();
+        return true;
+
+    case 24:
+        RunStandardAnalyses();
+        return true;
+
+    case 25:
+        displayAbout(false);
+        return true;
+
+    case 26:
+        ((_HYTextBox*)GetObject(0))->_DoClear (true,true);
+        return true;
+
+    case 27:
+        HandlePreferences (globalPreferencesList,"HYPHY Preferences");
+        return true;
+
+    case 28:
+        getUserFont();
+        return true;
+
+    case 29:
+        WinExec ("hh HYPHY HELP.chm",SW_SHOWNORMAL);
+        return true;
+
+    case 30:
+        if (OpenBatchFile (false)) {
+            ExecuteBatchFile();
+        }
+        return true;
+
+    case 31:
+        ((_HYTextBox*)GetObject(0))->_DoRedo(true);
+        return true;
+
+    case 15:
+        postWindowCloseEvent (GetID());
+        return true;
+
+    case 60: // expression calculator
+        if (calculatorMode) {
+            _HYTextBox         *ib = (_HYTextBox*)hyphyConsoleWindow->GetObject(1);
+            ib->SetText ("exit");
+            hyphyConsoleWindow->ProcessEvent (generateTextEditChangeEvent(ib->GetID(),2));
+            calculatorMode         = false;
+            //ib->SetText (empty);
+        } else {
+            calculatorMode = true;
+            while(!hyphyExiting && calculatorMode&&ExpressionCalculator()) {}
+            calculatorMode = false;
+        }
+        return true;
+
+    case 61: { // execute selection
+        ExecuteSelection();
+        return true;
+    }
+
+    case 70: // New Tree
+        NewTreeWindow(-1);
+        return true;
+
+    case 71: // New Model
+        NewModel(nil);
+        return true;
+
+    case 72: // New Chart
+        NewChartWindow();
+        return true;
+
+    case 73: // New Genetic Code
+        NewGeneticCodeTable(0);
+        return true;
+
+    case 74: // New Database
+        NewDatabaseFile (nil);
+        return true;
+
+    case 80: // Open Batch File
+        if (OpenBatchFile()) {
+            ExecuteBatchFile ();
+        }
+        return true;
+
+    case 81: // Open Data File
+        OpenDataFile();
+        return true;
+
+    case 82: // Open Tree
+        OpenTreeFile();
+        return true;
+
+    case 83: // Open Text
+        OpenTextFile();
+        return true;
+
+    case 84: // Open Table
+        OpenTable ();
+        return true;
+
+    case 85: // Open Database
+        OpenDatabaseFile (nil);
+        return true;
+
+    case 200:
+        hyphyConsoleWindow->_BringWindowToFront();
+        return true;
+
+    case 201:
+        ShowObjectInspector ();
+        return true;
+
+    default: {
+        msel -= 1000;
+        if (msel<availablePostProcessors.lLength) {
+            ExecuteAPostProcessor (*(_String*)(*(_List*)availablePostProcessors(msel))(1));
+            return 0;
+        }
+        msel-=1000;
+        if (msel<(long)recentPaths.lLength) {
+            if (msel == -1) {
+                for (long mi = 0; mi < recentPaths.lLength; mi++) {
+                    DeleteMenu (recentFilesMenu,2,MF_BYPOSITION);
+                }
+
+                recentPaths.Clear();
+                recentFiles.Clear();
+                DrawMenuBar ((HWND)GetOSWindowData());
+            } else {
+                if (argFileName) {
+                    *argFileName = *(_String*)recentPaths(msel);
+                } else {
+                    argFileName = new _String (*(_String*)recentPaths(msel));
+                }
+                if (OpenBatchFile(false)) {
+                    ExecuteBatchFile ();
+                }
+            }
+            return true;
+        }
+
+        return true;
+    }
+    }
+
+    return _HYTWindow::_ProcessMenuSelection(msel);
+}
+
+//__________________________________________________________________
+
+bool _HYConsoleWindow::_ProcessOSEvent (Ptr vEvent)
+{
+    _HYWindowsUIMessage*    theEvent = (_HYWindowsUIMessage*)vEvent;
+    if (theEvent->iMsg == WM_SYSCOMMAND) {
+        if (theEvent->wParam == SC_CLOSE) {
+            hyphyExiting = true;
+            return true;
+        }
+    } else {
+        if (theEvent->iMsg == UPDATE_TIMER) {
+            UpdateTimer ();
+            return true;
+        }
+    }
+    return _HYTWindow::_ProcessOSEvent (vEvent);
+}
+
+//__________________________________________________________________
+
+bool _HYConsoleWindow::_Close (Ptr )
+{
+    hyphyExiting = true;
+    return false;
+}
+
+//__________________________________________________________________
+void    _HYConsoleWindow::_DoPrint          (void)
+{
+    _HYTextBox* ob = (_HYTextBox*)components(0);
+
+    DOCINFO                 di = {sizeof(DOCINFO), "HYPHY.out", NULL };
+    PRINTDLG                pd;
+    BOOL                    SuccessFlag;
+
+    pd.lStructSize         = sizeof(PRINTDLG);
+    pd.hwndOwner           = theWindow;
+    pd.hDevMode            = NULL;
+    pd.hDevNames           = NULL;
+    pd.hDC                 = NULL;
+    pd.Flags               = PD_COLLATE | PD_RETURNDC | PD_NOSELECTION;
+    pd.nFromPage           = 1;
+    pd.nToPage             = 0xffff;
+    pd.nMinPage            = 1;
+    pd.nMaxPage            = 0xffff;
+    pd.nCopies             = 1;
+    pd.hInstance           = NULL;
+    pd.lCustData           = 0L;
+    pd.lpfnPrintHook       = NULL;
+    pd.lpfnSetupHook       = NULL;
+    pd.lpPrintTemplateName = NULL;
+    pd.lpSetupTemplateName = NULL;
+    pd.hPrintTemplate      = NULL;
+    pd.hSetupTemplate      = NULL;
+
+    if (!PrintDlg(&pd)) {
+        return;
+    }
+
+    if (pd.hDC == NULL) {
+        pd.hDC = GetPrinterDeviceContext(theWindow);
+    }
+
+    EnableWindow(theWindow, FALSE);
+
+    SuccessFlag   = TRUE;
+    UserAbortFlag = FALSE;
+
+    PrintDialogHandle = CreateDialog(GetModuleHandle(NULL), (LPCTSTR)"PrintDlgBox", theWindow,
+                                     PrintDialogProc);
+    SetDlgItemText(PrintDialogHandle, IDD_FNAME, "Table Printing...");
+
+    SetAbortProc(pd.hDC, AbortProc);
+
+    if (StartDoc(pd.hDC, &di) > 0) {
+
+        long        fromPage = pd.nMinPage,
+                    toPage   = pd.nMaxPage;
+
+        _Parameter  CFW = 1440./GetDeviceCaps(pd.hDC, LOGPIXELSX),
+                    CFH = 1440./GetDeviceCaps(pd.hDC, LOGPIXELSY);
+
+
+
+        FORMATRANGE  fr;
+
+        fr.rc.left  = GetDeviceCaps(pd.hDC, PHYSICALOFFSETX)    * CFW;
+        fr.rc.top   = GetDeviceCaps(pd.hDC, PHYSICALOFFSETY)    * CFH;
+        fr.rc.right  = fr.rc.left + GetDeviceCaps(pd.hDC, HORZRES) * CFW;
+        fr.rc.bottom = fr.rc.top + GetDeviceCaps(pd.hDC, VERTRES) * CFH;
+
+        fr.rcPage.left  = fr.rcPage.top = 0;
+        fr.rcPage.right = GetDeviceCaps(pd.hDC, PHYSICALWIDTH) * CFW;
+        fr.rcPage.bottom = GetDeviceCaps(pd.hDC, PHYSICALHEIGHT) * CFH;
+        fr.chrg.cpMin = 0;
+
+        GETTEXTLENGTHEX gtl = {GTL_NUMCHARS,CP_ACP};
+        fr.chrg.cpMax = SendMessage (ob->te,EM_GETTEXTLENGTHEX,(WPARAM)&gtl,0)-1;
+
+        while (fr.chrg.cpMin < fr.chrg.cpMax) {
+            if (StartPage (pd.hDC) <= 0) {
+                SuccessFlag = FALSE;
+                break;
+            }
+
+            SetMapMode     (pd.hDC, MM_TEXT);
+
+            fr.hdc          = pd.hDC;
+            fr.hdcTarget    = pd.hDC;
+
+            fr.chrg.cpMin = SendMessage(ob->te,EM_FORMATRANGE,1,(LPARAM)&fr);
+            SendMessage(ob->te,EM_DISPLAYBAND,1,(LPARAM)&fr.rcPage);
+            SendMessage(ob->te,EM_FORMATRANGE,0,nil);
+
+            if (EndPage (pd.hDC) <= 0) {
+                SuccessFlag = FALSE;
+            }
+        }
+    } else {
+        SuccessFlag = FALSE;
+    }
+
+
+    if (SuccessFlag) {
+        SuccessFlag = (EndDoc(pd.hDC)>0);
+    }
+
+    if (!UserAbortFlag) {
+        EnableWindow(theWindow, TRUE);
+        DestroyWindow(PrintDialogHandle);
+    }
+
+    DeleteDC (pd.hDC);
+
+    if (!SuccessFlag && !UserAbortFlag) {
+        _String errMsg = _String("Failed to print console. Windows Error:") & (long)GetLastError();
+        ProblemReport (errMsg,nil);
+    }
+}
+
+//__________________________________________________________________
+
+void _HYConsoleWindow::_PaintStatusBar(Ptr hdp, bool force)
+{
+    _Parameter      vL;
+    checkParameter (VerbosityLevelString, vL, 0.0);
+    if (vL<-0.5 && !force) {
+        LARGE_INTEGER curMeasure;
+        QueryPerformanceCounter (&curMeasure);
+
+        _Parameter      timeDiff   = (curMeasure.QuadPart-lastMeasure.QuadPart)/1000000;
+
+        if (timeDiff < -vL) {
+            return;
+        }
+        lastMeasure = curMeasure;
+    }
+
+    HDC  osc = CreateCompatibleDC (NULL),
+         hdc;
+
+    if (hdp) {
+        hdc = (HDC)hdp;
+    } else {
+        hdc = GetDC (theWindow);
+    }
+
+
+    RECT wRC,
+         w2RC;
+
+    GetClientRect (theWindow, &wRC);
+    wRC.top    = 0;
+    wRC.bottom = HY_SCROLLER_WIDTH;
+
+    HBITMAP oBM = CreateCompatibleBitmap (hdc,wRC.right,HY_SCROLLER_WIDTH),
+            oldBM;
+
+    //printf ("%x %x\n", osc, oBM);
+
+    if (oBM) {
+        oldBM = (HBITMAP)SelectObject (osc,oBM);
+        HBRUSH bkBrush = CreateSolidBrush (GetBkColor(hdc));
+
+        FillRect     (osc, &wRC,windowStatusBarBrush);
+        MoveToEx     (osc,0,wRC.bottom-HY_SCROLLER_WIDTH+1,NULL);
+        SelectObject (osc, (HPEN)GetStockObject(BLACK_PEN));
+        LineTo       (osc,wRC.right,wRC.bottom-HY_SCROLLER_WIDTH+1);
+
+        SetBkMode    (osc, TRANSPARENT);
+        SetTextAlign (osc, TA_LEFT|TA_BOTTOM|TA_NOUPDATECP);
+        SetTextColor (osc,RGB(0,0,0));
+        SelectObject (osc,statusBarPlain);
+        TextOut      (osc,33,wRC.bottom-1, fileName.getStr(),fileName.sLength);
+        if (inputStatus == 1) {
+            TextOut      (osc,193,wRC.bottom-1,cInput.getStr(),cInput.sLength);
+        } else {
+            TextOut      (osc,193,wRC.bottom-1,action.getStr(),action.sLength);
+        }
+
+        w2RC = wRC;
+
+        w2RC.right = 30;
+        w2RC.top=w2RC.bottom-HY_SCROLLER_WIDTH+2;
+
+        FillRect(osc, &w2RC, (HBRUSH)GetStockObject (DKGRAY_BRUSH));
+        w2RC.left  = 150;
+        w2RC.right = 190;
+        FillRect(osc, &w2RC, (HBRUSH)GetStockObject (DKGRAY_BRUSH));
+        w2RC.right = wRC.right;
+        w2RC.left = w2RC.right - 50;
+        FillRect(osc, &w2RC, (HBRUSH)GetStockObject (DKGRAY_BRUSH));
+        SelectObject (osc,statusBarBold);
+        SetTextColor (osc,RGB(255,255,255));
+        TextOut (osc,3,wRC.bottom-1,cState.sData,cState.sLength);
+        TextOut (osc,151,wRC.bottom-1,cTask.sData,cTask.sLength);
+        SelectObject (osc,statusBarPlain);
+
+        TextOut (osc,wRC.right-48,wRC.bottom-1,timer.getStr(),timer.sLength);
+
+        if (percentDone>=0 || percentDone == -HY_SL_DONE) {
+            HBRUSH blackBrush = CreateSolidBrush (RGB(80,80,80)), orangeBrush = CreateSolidBrush (RGB(255,153,102));
+            w2RC.right = w2RC.left-5;
+            w2RC.left-=75;
+            w2RC.top++;
+            w2RC.bottom--;
+
+            w2RC.right = w2RC.left+(w2RC.right-w2RC.left)*(percentDone>=0?percentDone:100)/100;
+            FillRect (osc,&w2RC,orangeBrush);
+            w2RC.right = w2RC.left+70;
+            FrameRect (osc,&w2RC,blackBrush);
+            _String pLine;
+            if (percentDone>=0) {
+                pLine = _String(percentDone)&"%";
+            } else {
+                pLine = "DONE";
+            }
+
+            SetTextColor (osc,RGB(0,0,0));
+            TextOut (osc,w2RC.left+28,wRC.bottom-1,pLine.getStr(),pLine.sLength);
+
+            DeleteObject (blackBrush);
+            DeleteObject (orangeBrush);
+        }
+
+        GetClientRect (theWindow,&w2RC);
+
+        BitBlt  (hdc,0,w2RC.bottom-HY_SCROLLER_WIDTH,wRC.right,HY_SCROLLER_WIDTH,osc, 0,0,SRCCOPY);
+        SelectObject (osc,oldBM);
+        DeleteObject (bkBrush);
+        DeleteObject (oBM);
+    }
+    DeleteDC     (osc);
+
+
+    if (!hdp) {
+        ReleaseDC (theWindow,hdc);
+    }
+    
+    yieldCPUTime();
+}
+
+//EOF
\ No newline at end of file
diff --git a/src/gui/win/WindowClasses/HYPlatformDBWindow.cpp b/src/gui/win/WindowClasses/HYPlatformDBWindow.cpp
new file mode 100644
index 0000000..adb0deb
--- /dev/null
+++ b/src/gui/win/WindowClasses/HYPlatformDBWindow.cpp
@@ -0,0 +1 @@
+/*
    Win32 Portions of the DB Window class

    Sergei L. Kosakovsky Pond, Fall 2005.
*/

#include "HYDBWindow.h"

//__________________________________________________________________


bool        _HYDBWindow::_ProcessMenuSelection (long msel)
{
    long        menuChoice = msel&0x0000ffff;
    _HYTable*   table = (_HYTable*)GetObject(0);

    switch (msel) {
    case HY_WINDOW_MENU_ID_FILE+2: { // print menu
        _SimpleList columns (table->horizontalSpaces.lLength,0,1);
        table->_PrintTable(columns,(_HYTable*)GetObject(1));
        return true;
    }
    }
    return _HYTWindow::_ProcessMenuSelection(msel);
}

//EOF
\ No newline at end of file
diff --git a/src/gui/win/WindowClasses/HYPlatformDataPanel.cpp b/src/gui/win/WindowClasses/HYPlatformDataPanel.cpp
new file mode 100644
index 0000000..1007cd9
--- /dev/null
+++ b/src/gui/win/WindowClasses/HYPlatformDataPanel.cpp
@@ -0,0 +1 @@
+/*
    Win 32 Portions of the data panel class

    Sergei L. Kosakovsky Pond, Spring 2000 - January 2003.
*/

#include "HYTreePanel.h"
#include "HYDataPanel.h"
#include "HYUtils.h"

#include "likefunc.h"

#define     HY_DATA_WIN32_MENU_BASE    8000
#define     HY_DATALF_WIN32_MENU_BASE  8500

//__________________________________________________________________

void _HYDataPanel::_SetMenuBar(void)
{
    _HYWindow::_SetMenuBar();

    HMENU            windowMenu = GetMenu (theWindow),
                     dataMenu   = GetSubMenu(windowMenu,2);

    if (!dataMenu) {
        HMENU      dataMenu         = CreateMenu (),
                   lfMenu             = CreateMenu (),
                   blockMenu       = CreatePopupMenu (),
                   repeatCharMenu   = CreatePopupMenu (),
                   nameDisplayMenu  = CreatePopupMenu (),
                   additionalInfo  = CreatePopupMenu (),
                   lfDisplayMode   = CreatePopupMenu (),
                   omittedSpecies   = CreatePopupMenu (),
                   simulateData  = CreatePopupMenu (),
                   saveSubMenu     = CreatePopupMenu (),
                   procMenu         = CreatePopupMenu (),
                   inferSubMenu     = nil;

        _HYSequencePane* sp = (_HYSequencePane*)GetObject (0);

        if (!(dataMenu&&blockMenu&&repeatCharMenu&&nameDisplayMenu&&omittedSpecies&&additionalInfo)) {
            warnError (-108);
        }

        InsertMenu      (dataMenu,  0xFFFFFFFF, MF_BYPOSITION|MF_STRING|MF_GRAYED, HY_DATA_WIN32_MENU_BASE,
                         "&Partition->Selection\tCtrl-1");
        InsertMenu      (dataMenu,  0xFFFFFFFF, MF_BYPOSITION|MF_STRING|MF_GRAYED, HY_DATA_WIN32_MENU_BASE+1,
                         "&Selection->Partition\tCtrl-2");
        InsertMenu      (dataMenu,  0xFFFFFFFF, MF_BYPOSITION|MF_STRING, HY_DATA_WIN32_MENU_BASE+2,
                         "&Invert Selection\tCtrl-3");

        InsertMenu      (dataMenu,  0xFFFFFFFF, MF_BYPOSITION|MF_SEPARATOR, 0, nil);

        InsertMenu      (blockMenu, 0xFFFFFFFF, MF_BYPOSITION|MF_STRING, HY_DATA_WIN32_MENU_BASE+50, "&9");
        InsertMenu      (blockMenu, 0xFFFFFFFF, MF_BYPOSITION|MF_STRING, HY_DATA_WIN32_MENU_BASE+51, "&10");

        InsertMenu      (dataMenu,  0xFFFFFFFF, MF_BYPOSITION|MF_POPUP, (UINT)blockMenu, "&Block Width");

        InsertMenu      (repeatCharMenu, 0xFFFFFFFF, MF_BYPOSITION|MF_STRING, HY_DATA_WIN32_MENU_BASE+60, "Display &Actual Character");
        InsertMenu      (repeatCharMenu, 0xFFFFFFFF, MF_BYPOSITION|MF_STRING, HY_DATA_WIN32_MENU_BASE+61, "&Display '.'");

        InsertMenu      (dataMenu,  0xFFFFFFFF, MF_BYPOSITION|MF_POPUP, (UINT)repeatCharMenu, "&Repeat Characters");

        InsertMenu      (nameDisplayMenu, 0xFFFFFFFF, MF_BYPOSITION|MF_STRING, HY_DATA_WIN32_MENU_BASE+70, "&None");
        InsertMenu      (nameDisplayMenu, 0xFFFFFFFF, MF_BYPOSITION|MF_STRING, HY_DATA_WIN32_MENU_BASE+71, "&First 10 characters");
        InsertMenu      (nameDisplayMenu, 0xFFFFFFFF, MF_BYPOSITION|MF_STRING, HY_DATA_WIN32_MENU_BASE+72, "F&ull names");
        InsertMenu      (nameDisplayMenu, 0xFFFFFFFF, MF_BYPOSITION|MF_SEPARATOR, 0, nil);
        InsertMenu      (nameDisplayMenu, 0xFFFFFFFF, MF_BYPOSITION|MF_STRING, HY_DATA_WIN32_MENU_BASE+73, "&Alphabetize names");
        InsertMenu      (nameDisplayMenu, 0xFFFFFFFF, MF_BYPOSITION|MF_STRING, HY_DATA_WIN32_MENU_BASE+74, "&Revert to file order");
        InsertMenu      (nameDisplayMenu, 0xFFFFFFFF, MF_BYPOSITION|MF_STRING, HY_DATA_WIN32_MENU_BASE+75, "&Clean up sequence names");

        InsertMenu      (dataMenu,  0xFFFFFFFF, MF_BYPOSITION|MF_POPUP, (UINT)nameDisplayMenu, "&Name Display");

        InsertMenu      (omittedSpecies, 0xFFFFFFFF, MF_BYPOSITION|MF_STRING, HY_DATA_WIN32_MENU_BASE+10000, "&Restore All");
        InsertMenu      (omittedSpecies, 0xFFFFFFFF, MF_BYPOSITION|MF_SEPARATOR, 0, nil);
        InsertMenu      (dataMenu,  0xFFFFFFFF, MF_BYPOSITION|MF_POPUP|MF_GRAYED, (UINT)omittedSpecies, "&Omitted Sequences");

        InsertMenu      (additionalInfo, 0xFFFFFFFF, MF_BYPOSITION|MF_STRING, HY_DATA_WIN32_MENU_BASE+80, "&Consensus Sequence");
        InsertMenu      (additionalInfo, 0xFFFFFFFF, MF_BYPOSITION|MF_STRING|MF_GRAYED, HY_DATA_WIN32_MENU_BASE+81,
                         "&Rate Class");
        InsertMenu      (additionalInfo, 0xFFFFFFFF, MF_BYPOSITION|MF_STRING|MF_GRAYED, HY_DATA_WIN32_MENU_BASE+82,
                         "&Aminoacid Translation");
        InsertMenu      (additionalInfo, 0xFFFFFFFF, MF_BYPOSITION|MF_STRING, HY_DATA_WIN32_MENU_BASE+83,  "Re&ference Sequence");

        InsertMenu      (dataMenu,  0xFFFFFFFF, MF_BYPOSITION|MF_POPUP, (UINT)additionalInfo, "&Additonal Info");
        InsertMenu      (dataMenu,  0xFFFFFFFF, MF_BYPOSITION|MF_SEPARATOR, 0, nil);

        InsertMenu      (dataMenu,  0xFFFFFFFF, MF_BYPOSITION|MF_STRING|MF_GRAYED, HY_DATA_WIN32_MENU_BASE+3,"Part&ition Properties");
        InsertMenu      (dataMenu,  0xFFFFFFFF, MF_BYPOSITION|MF_STRING, HY_DATA_WIN32_MENU_BASE+4,"Inp&ut Partition");
        InsertMenu      (dataMenu,  0xFFFFFFFF, MF_BYPOSITION|MF_SEPARATOR, 0, nil);

        InsertMenu      (simulateData, 0xFFFFFFFF, MF_BYPOSITION|MF_STRING, HY_DATA_WIN32_MENU_BASE+90, "&Simulate 1");
        InsertMenu      (simulateData, 0xFFFFFFFF, MF_BYPOSITION|MF_STRING, HY_DATA_WIN32_MENU_BASE+91, "Simulate 1 To &File");
        InsertMenu      (simulateData, 0xFFFFFFFF, MF_BYPOSITION|MF_STRING, HY_DATA_WIN32_MENU_BASE+92, "Simulate &Many");

        InsertMenu      (dataMenu,  0xFFFFFFFF, MF_BYPOSITION|MF_POPUP, (UINT)simulateData, "&Simulation");
        InsertMenu      (dataMenu,  0xFFFFFFFF, MF_BYPOSITION|MF_STRING|MF_GRAYED, HY_DATA_WIN32_MENU_BASE+5,"An&cestors");
        InsertMenu      (dataMenu,  0xFFFFFFFF, MF_BYPOSITION|MF_SEPARATOR, 0, nil);
        InsertMenu      (dataMenu,  0xFFFFFFFF, MF_BYPOSITION|MF_STRING, HY_DATA_WIN32_MENU_BASE+6,"&Font Options");

        if (dataPanelProcessors.lLength == 0) {
            InsertMenu      (dataMenu, 0xFFFFFFFF, MF_BYPOSITION|MF_STRING|MF_GRAYED, 0, "&Data Processing");
            DestroyMenu     (procMenu);
        } else {
            for (long k=0; k<dataPanelProcessors.lLength; k++) {
                _String *thisItem = (_String*)dataPanelProcessors (k),
                         chopped = thisItem->Cut (thisItem->FindBackwards ('\\',0,-1)+1,-1);

                InsertMenu      (procMenu, 0xFFFFFFFF, MF_BYPOSITION|MF_STRING, HY_DATA_WIN32_MENU_BASE+100+k, chopped.sData);
            }
            InsertMenu      (dataMenu, 0xFFFFFFFF, MF_BYPOSITION|MF_POPUP, (UINT)procMenu, "&Data Processing");
        }

        InsertMenu      (lfMenu,  0xFFFFFFFF, MF_BYPOSITION|MF_STRING, HY_DATALF_WIN32_MENU_BASE, "&Build\tCtrl-L");

        InsertMenu      (lfDisplayMode, 0xFFFFFFFF, MF_BYPOSITION|MF_STRING, HY_DATALF_WIN32_MENU_BASE+50, "Log-Lkhd &Only");
        InsertMenu      (lfDisplayMode, 0xFFFFFFFF, MF_BYPOSITION|MF_STRING, HY_DATALF_WIN32_MENU_BASE+51, "Log-Lkhd with &Parameter Values");
        InsertMenu      (lfDisplayMode, 0xFFFFFFFF, MF_BYPOSITION|MF_STRING, HY_DATALF_WIN32_MENU_BASE+52, "Log-Lkhd with &Concise Trees");
        InsertMenu      (lfDisplayMode, 0xFFFFFFFF, MF_BYPOSITION|MF_STRING, HY_DATALF_WIN32_MENU_BASE+53, "&Parameter Listing");
        InsertMenu      (lfDisplayMode, 0xFFFFFFFF, MF_BYPOSITION|MF_STRING, HY_DATALF_WIN32_MENU_BASE+54, "Log-Lkhd with Complete &Trees");

        InsertMenu      (lfMenu,  0xFFFFFFFF, MF_BYPOSITION|MF_POPUP|MF_GRAYED, (UINT)lfDisplayMode, "&Display");
        InsertMenu      (lfMenu,  0xFFFFFFFF, MF_BYPOSITION|MF_STRING|MF_GRAYED, HY_DATALF_WIN32_MENU_BASE+1, "&Optimize\tCtrl-T");
        InsertMenu      (lfMenu,  0xFFFFFFFF, MF_BYPOSITION|MF_SEPARATOR, 0, nil);
        InsertMenu      (lfMenu,  0xFFFFFFFF, MF_BYPOSITION|MF_STRING|MF_GRAYED, HY_DATALF_WIN32_MENU_BASE+2, "&Show Parameters\tCtrl-H");
        InsertMenu      (lfMenu,  0xFFFFFFFF, MF_BYPOSITION|MF_SEPARATOR, 0, nil);
        InsertMenu      (lfMenu,  0xFFFFFFFF, MF_BYPOSITION|MF_STRING|MF_GRAYED, HY_DATALF_WIN32_MENU_BASE+3, "&General Bootstrap\tCtrl-B");

        if (omittedSeqs.lLength) {
            _OmitSelectedSpecies(omittedSeqs);
        }

        CheckMenuItem (blockMenu,(sp->blockWidth==10)?1:0,MF_CHECKED|MF_BYPOSITION);
        if (sp->nameDisplayFlags&HY_SEQUENCE_PANE_NAMES_ALL) {
            CheckMenuItem (nameDisplayMenu,2,MF_CHECKED|MF_BYPOSITION);
        } else if (sp->nameDisplayFlags&HY_SEQUENCE_PANE_NAMES_SHORT) {
            CheckMenuItem (nameDisplayMenu,1,MF_CHECKED|MF_BYPOSITION);
        } else {
            CheckMenuItem (nameDisplayMenu,0,MF_CHECKED|MF_BYPOSITION);
        }
        if (sp->showDots) {
            CheckMenuItem (repeatCharMenu,1,MF_CHECKED|MF_BYPOSITION);
        } else {
            CheckMenuItem (repeatCharMenu,0,MF_CHECKED|MF_BYPOSITION);
        }

        if (dataType&HY_DATAPANEL_NUCDATA) {
            EnableMenuItem (additionalInfo,2, MF_ENABLED|MF_BYPOSITION);
        }

        _UpdateLFMenu();

        InsertMenu   (windowMenu, 2, MF_BYPOSITION|MF_POPUP, (UINT) dataMenu , "&Data");

        InsertMenu      (saveSubMenu, 0xFFFFFFFF, MF_BYPOSITION|MF_STRING, HY_WINDOW_MENU_ID_FILE+1, "&Save\tCtrl-S");
        InsertMenu      (saveSubMenu, 0xFFFFFFFF, MF_BYPOSITION|MF_STRING, HY_WINDOW_MENU_ID_FILE+3, "Save &As");

        dataMenu =  GetSubMenu(windowMenu,0);

        ModifyMenu   (dataMenu, 0, MF_BYPOSITION|MF_POPUP, (UINT) saveSubMenu , "&Save");

        dataMenu =  GetSubMenu(windowMenu,1);
        InsertMenu   (dataMenu, 0xFFFFFFFF, MF_BYPOSITION|MF_STRING, HY_WINDOW_MENU_ID_EDIT+6 ,  "&Find\tCtrl-F");
        InsertMenu   (dataMenu, 0xFFFFFFFF, MF_BYPOSITION|MF_STRING, HY_WINDOW_MENU_ID_EDIT+7 ,  "&Search and &Replace");
        EnableMenuItem (dataMenu,2,MF_BYPOSITION|MF_ENABLED);
        EnableMenuItem (dataMenu,6,MF_BYPOSITION|MF_ENABLED);

        InsertMenu   (windowMenu, 3, MF_BYPOSITION|MF_POPUP, (UINT) lfMenu , "&Likelihood");

        accels       << (FCONTROL|FVIRTKEY);
        accels       << 'F';
        accels       << HY_WINDOW_MENU_ID_EDIT+6;

        accels       << (FCONTROL|FVIRTKEY);
        accels       << 'L';
        accels       << HY_DATALF_WIN32_MENU_BASE;

        accels       << (FCONTROL|FVIRTKEY);
        accels       << 'T';
        accels       << HY_DATALF_WIN32_MENU_BASE+1;

        accels       << (FCONTROL|FVIRTKEY);
        accels       << 'H';
        accels       << HY_DATALF_WIN32_MENU_BASE+2;

        accels       << (FCONTROL|FVIRTKEY);
        accels       << 'B';
        accels       << HY_DATALF_WIN32_MENU_BASE+3;

        accels       << (FCONTROL|FVIRTKEY);
        accels       << '1';
        accels       << HY_DATA_WIN32_MENU_BASE;

        accels       << (FCONTROL|FVIRTKEY);
        accels       << '2';
        accels       << HY_DATA_WIN32_MENU_BASE+1;

        accels       << (FCONTROL|FVIRTKEY);
        accels       << '3';
        accels       << HY_DATA_WIN32_MENU_BASE+2;

        _AddStandardAccels();
        _BuildAccelTable  (true);
        accels.Clear();
    }
    _VerifyInferMenu    ();
}
//__________________________________________________________________


bool        _HYDataPanel::_ProcessMenuSelection (long msel)
{
    if (_HYWindow::_ProcessMenuSelection(msel)) {
        return true;
    }

    _HYSequencePane* sp = (_HYSequencePane*)GetObject (0);
    _HYSequencePane* sp2 =(_HYSequencePane*)GetObject (4);
    _String     prompt;
    bool        done = false;
    HMENU       treeMenu;

    //printf ("Menu selection %d\n", msel);

    switch (msel) {
    case HY_WINDOW_MENU_ID_FILE+2: {
        _PrintData();
        done = true;
        break;
    }

    case HY_WINDOW_MENU_ID_EDIT+1: { // Copy
        _CopySelectionToClipboard   ();
        done = true;
        break;
    }

    case HY_WINDOW_MENU_ID_EDIT+5: { // Select All
        sp->SelectAll(true);
        done = true;
        break;
    }

    case HY_WINDOW_MENU_ID_EDIT+6: { // Find Function
        FindFunction();
        done = true;
        break;
    }

    case HY_WINDOW_MENU_ID_EDIT+7: { // Find Function
        HandleSearchAndReplace();
        done = true;
        break;
    }

    case HY_DATA_WIN32_MENU_BASE: { // Partition->Selection
        SelectPartition();
        done = true;
        break;
    }

    case HY_DATA_WIN32_MENU_BASE+1: { // Selection->Partition
        if (sp->selection.lLength) {
            CreatePartition (sp->selection,1,true);
        }
        done = true;
        break;
    }

    case HY_DATA_WIN32_MENU_BASE+2: { // Invert Selection
        InvertSelection();
        done = true;
        break;
    }

    case HY_DATA_WIN32_MENU_BASE+3: { // Parition props
        PartitionPropsMenu ();
        done = true;
        break;
    }

    case HY_DATA_WIN32_MENU_BASE+4: { // Input part
        InputPartitionString ();
        done = true;
        break;
    }

    case HY_DATA_WIN32_MENU_BASE+5: { // Ancestors
        SimulateDataSet (0,true);
        done = true;
        break;
    }

    case HY_DATA_WIN32_MENU_BASE+6: { // Ancestors
        HandleFontChange();
        done = true;
        break;
    }

    case HY_DATALF_WIN32_MENU_BASE: { // Build LF
        if (GetSubMenu (GetSubMenu (GetMenu (theWindow), 3), 0)) {
            InferTopologies ();
        } else {
            BuildLikelihoodFunction();
        }
        done = true;
        break;
    }

    case HY_DATALF_WIN32_MENU_BASE+1: { // Optimize LF
        OptimizeLikelihoodFunction();
        done = true;
        break;
    }

    case HY_DATALF_WIN32_MENU_BASE+2: { // Show Parameters
        DisplayParameterTable ();
        done = true;
        break;
    }

    case HY_DATALF_WIN32_MENU_BASE+3: { // General bootstrap
        //Uncomment when rdy
        OpenGeneralBSWindow ();
        done = true;
        break;
    }

    case HY_DATA_WIN32_MENU_BASE+50: // Block size
    case HY_DATA_WIN32_MENU_BASE+51: {
        treeMenu       = GetSubMenu (GetSubMenu(GetMenu (theWindow),2), 4);
        long             newBlockSize;
        bool             is9 = (msel==HY_DATA_WIN32_MENU_BASE+50);

        if (is9) {
            newBlockSize = 9;
        } else {
            newBlockSize = 10;
        }

        if (sp->blockWidth!=newBlockSize) {
            sp->blockWidth = newBlockSize;
            sp2->blockWidth = newBlockSize;
            sp->BuildPane();
            sp->_MarkForUpdate();
            sp2->BuildPane();
            sp2->_MarkForUpdate();
            CheckMenuItem (treeMenu, 0, MF_BYPOSITION|(is9?MF_CHECKED:MF_UNCHECKED));
            CheckMenuItem (treeMenu, 1, MF_BYPOSITION|((!is9)?MF_CHECKED:MF_UNCHECKED));
        }
        done = true;
        break;
    }

    case HY_DATA_WIN32_MENU_BASE+60: // Repeating character
    case HY_DATA_WIN32_MENU_BASE+61: {
        treeMenu = GetSubMenu (GetSubMenu(GetMenu (theWindow),2), 5);
        bool       newDisplay;
        if (msel==HY_DATA_WIN32_MENU_BASE+60) {
            newDisplay = false;
        } else {
            newDisplay = true;
        }

        if (sp->showDots!=newDisplay) {
            sp->showDots = newDisplay;
            sp->BuildPane();
            sp->_MarkForUpdate();
            CheckMenuItem (treeMenu, newDisplay, MF_BYPOSITION|MF_CHECKED);
            CheckMenuItem (treeMenu, !newDisplay, MF_BYPOSITION|MF_UNCHECKED);
        }
        done = true;
        break;
    }

    case HY_DATA_WIN32_MENU_BASE+70: // Sequence names
    case HY_DATA_WIN32_MENU_BASE+71:
    case HY_DATA_WIN32_MENU_BASE+72:
    case HY_DATA_WIN32_MENU_BASE+73:
    case HY_DATA_WIN32_MENU_BASE+74:
    case HY_DATA_WIN32_MENU_BASE+75: {
        treeMenu = GetSubMenu (GetSubMenu(GetMenu (theWindow),2), 6);
        if (msel<=HY_DATA_WIN32_MENU_BASE+72) {
            unsigned char newDisplay;
            switch (msel) {
            case HY_DATA_WIN32_MENU_BASE+70:
                newDisplay = HY_SEQUENCE_PANE_NAMES_NONE;
                break;
            case HY_DATA_WIN32_MENU_BASE+71:
                newDisplay = HY_SEQUENCE_PANE_NAMES_SHORT;
                break;
            case HY_DATA_WIN32_MENU_BASE+72:
                newDisplay = HY_SEQUENCE_PANE_NAMES_ALL;

            }

            if ((sp->nameDisplayFlags&HY_SEQUENCE_PANE_NAMES_MASK)!=newDisplay) {
                CheckMenuItem (treeMenu, (sp->nameDisplayFlags&HY_SEQUENCE_PANE_NAMES_MASK), MF_BYPOSITION|MF_UNCHECKED);
                sp->SetNameDisplayMode(newDisplay,true);
                sp2->SetNameDisplayMode(newDisplay,true);
                BuildThermometer();
                BuildMarksPane();
                CheckMenuItem (treeMenu, newDisplay, MF_BYPOSITION|MF_CHECKED);
            }
        } else {
            if (msel==HY_DATA_WIN32_MENU_BASE+73) {
                sp->AlphabetizeSpecies();
            } else if (msel==HY_DATA_WIN32_MENU_BASE+74) {
                sp->RevertFileOrder();
            } else {
                sp->CleanUpSequenceNames();
            }
        }
        done = true;
        break;
    }

    case HY_DATA_WIN32_MENU_BASE+80: // status lines
    case HY_DATA_WIN32_MENU_BASE+81: // status lines
    case HY_DATA_WIN32_MENU_BASE+82: // status lines
    case HY_DATA_WIN32_MENU_BASE+83: { // status lines
        treeMenu = GetSubMenu (GetSubMenu(GetMenu (theWindow),2), 8);
        if (AdjustStatusLine (msel-HY_DATA_WIN32_MENU_BASE-80)) {
            CheckMenuItem(treeMenu,msel-HY_DATA_WIN32_MENU_BASE-80,MF_BYPOSITION|MF_CHECKED);
        } else {
            CheckMenuItem(treeMenu,msel-HY_DATA_WIN32_MENU_BASE-80,MF_BYPOSITION|MF_UNCHECKED);
        }

        done = true;
        break;
    }

    case HY_DATALF_WIN32_MENU_BASE+50: // likelihood display
    case HY_DATALF_WIN32_MENU_BASE+51: // likelihood display
    case HY_DATALF_WIN32_MENU_BASE+52: // likelihood display
    case HY_DATALF_WIN32_MENU_BASE+53: // likelihood display
    case HY_DATALF_WIN32_MENU_BASE+54: { // likelihood display
        ComputeLikelihoodFunction (msel-HY_DATALF_WIN32_MENU_BASE-50);
        done = true;
        break;
    }

    case HY_DATA_WIN32_MENU_BASE+90: // simulate data set
    case HY_DATA_WIN32_MENU_BASE+91: // simulate data set
    case HY_DATA_WIN32_MENU_BASE+92: { // simulate data set
        SimulateDataSet (msel-HY_DATA_WIN32_MENU_BASE-90);
        done = true;
        break;
    }

    case HY_WINDOW_MENU_ID_FILE+1: // save/save as
    case HY_WINDOW_MENU_ID_FILE+3: { // save/save as
        SaveDataPanel (msel==HY_WINDOW_MENU_ID_FILE+1);
        done = true;
        break;
    }

    case HY_DATALF_WIN32_MENU_BASE+20: // infer
    case HY_DATALF_WIN32_MENU_BASE+21: { // infer
        InferTopologies (msel==HY_DATALF_WIN32_MENU_BASE+21);
        _VerifyInferMenu ();
        done = true;
        break;
    }

    default: {
        if (msel>=HY_DATA_WIN32_MENU_BASE+10000) {
            RestoreOmittedSequence(msel-HY_DATA_WIN32_MENU_BASE-10003);
            done = true;
            break;
        } else {
            if (msel >= HY_DATA_WIN32_MENU_BASE + 100) {
                ExecuteProcessor (msel-HY_DATA_WIN32_MENU_BASE-100);
                break;
            }
        }
    }
    }
    DrawMenuBar(theWindow);
    return done;
}

//__________________________________________________________________

void        _HYDataPanel::_PaintThermRect(bool update)
{
    navRect = ComputeNavRect();

    _HYCanvas* theCanvas = (_HYCanvas*)GetObject (1);

    HDC        windowDC = GetDC (theWindow);
    RECT       r;

    r.left   = navRect.left+theCanvas->rel.left+thermRect.left+1;
    r.right  = navRect.right+theCanvas->rel.left+thermRect.left-1;
    r.top    = navRect.top+theCanvas->rel.top+thermRect.top+1;
    r.bottom = navRect.bottom+theCanvas->rel.top+thermRect.top-1;

    HBRUSH     newBr  = CreateSolidBrush (RGB(255,151,51));


    FrameRect (windowDC,&r,newBr);
    InflateRect (&r, -1, -1);
    FrameRect (windowDC,&r,newBr);
    InflateRect (&r, 1, 1);

    DeleteObject (newBr);

    if (update) {
        HRGN        newClip = CreateRectRgn (r.left,r.top,r.right,r.bottom),
                    oldClip = CreateRectRgn (0,0,1,1);

        if (GetClipRgn (windowDC, oldClip) == 0) {
            DeleteObject (oldClip);
            oldClip = nil;
        }

        SelectClipRgn      (windowDC, nil);
        ExtSelectClipRgn   (windowDC, newClip,RGN_XOR);
        DeleteObject       (newClip);
        newClip = CreateRectRgn (r.left+2,r.top+2,r.right-2,r.bottom-2);
        ExtSelectClipRgn   (windowDC, newClip,RGN_OR);

        _HYRect rect;
        rect.left   = componentL.lData[1];
        rect.right  = componentR.lData[1];
        rect.top    = componentT.lData[1];
        rect.bottom = componentB.lData[1];
        rect.width  = (long)windowDC;
        theCanvas->_Paint((char*)&rect);

        SelectClipRgn (windowDC, oldClip);
        if (oldClip) {
            DeleteObject (oldClip);
        }
        DeleteObject (newClip);
    }

    ReleaseDC (theWindow, windowDC);
    _PaintLFStatus ();
}

//__________________________________________________________________

void        _HYDataPanel::_PaintLFStatus(void)
{
    HDC theDC = GetDC (theWindow);
    if (lfID<0) {
        _SimpleList goodP;
        bool    paintOrange = GenerateGoodPartitions (goodP);

        if (goodP.lLength) {
            _PaintTheCircle (paintOrange?orangeButtonIcon:yellowButtonIcon,theWindow, theDC);
        } else {
            _PaintTheCircle (redButtonIcon,theWindow, theDC);
        }
    } else {
        _PaintTheCircle (greenButtonIcon,theWindow, theDC);
    }

    ReleaseDC (theWindow, theDC);
}

//__________________________________________________________________

void        _HYDataPanel::_PrintData(void)
{
    DOCINFO                 di = {sizeof(DOCINFO), "HYPHY.out", NULL };
    PRINTDLG                pd;
    BOOL                    SuccessFlag;

    pd.lStructSize         = sizeof(PRINTDLG);
    pd.hwndOwner           = theWindow;
    pd.hDevMode            = NULL;
    pd.hDevNames           = NULL;
    pd.hDC                 = NULL;
    pd.Flags               = PD_COLLATE | PD_RETURNDC | PD_NOSELECTION;
    pd.nFromPage           = 1;
    pd.nToPage             = 0xffff;
    pd.nMinPage            = 1;
    pd.nMaxPage            = 0xffff;
    pd.nCopies             = 1;
    pd.hInstance           = NULL;
    pd.lCustData           = 0L;
    pd.lpfnPrintHook       = NULL;
    pd.lpfnSetupHook       = NULL;
    pd.lpPrintTemplateName = NULL;
    pd.lpSetupTemplateName = NULL;
    pd.hPrintTemplate      = NULL;
    pd.hSetupTemplate      = NULL;

    if (!PrintDlg(&pd)) {
        return;
    }

    if (pd.hDC == NULL) {
        pd.hDC = GetPrinterDeviceContext(theWindow);
    }


    EnableWindow(theWindow, FALSE);

    SuccessFlag   = TRUE;
    UserAbortFlag = FALSE;

    PrintDialogHandle = CreateDialog(GetModuleHandle(NULL), (LPCTSTR)"PrintDlgBox", theWindow,
                                     PrintDialogProc);
    SetDlgItemText(PrintDialogHandle, IDD_FNAME, "Table Printing...");

    SetAbortProc(pd.hDC, AbortProc);

    if (StartDoc(pd.hDC, &di) > 0) {
        _HYSequencePane* sp = (_HYSequencePane*)GetObject (0);
        HDC         windowDC = GetDC (theWindow);

        long        printW = GetDeviceCaps(pd.hDC, HORZRES),
                    printH = GetDeviceCaps(pd.hDC, VERTRES),

                    hRes = GetDeviceCaps(pd.hDC, LOGPIXELSX),
                    vRes = GetDeviceCaps(pd.hDC, LOGPIXELSY),

                    screenHRes = GetDeviceCaps(windowDC, LOGPIXELSX),
                    screenVRes = GetDeviceCaps(windowDC, LOGPIXELSY),

                    fromPage = pd.nMinPage,
                    toPage   = pd.nMaxPage;


        if (pd.Flags & PD_PAGENUMS) {
            fromPage = pd.nFromPage;
            toPage   = pd.nToPage;
        }

        ReleaseDC   (theWindow, windowDC);
        hRes = printW*((_Parameter)screenHRes/hRes);
        vRes = printH*((_Parameter)screenVRes/vRes);
        screenHRes = printW;
        screenVRes = printH;

        printW = hRes;
        printH = vRes;

        long
        vOffset = vOffset = sp->GetSlotHeight()*sp->speciesIndex.lLength+sp->GetSlotHeight()*3/2+1+20*(dataPartitions.lLength>0),
        cOffset = (printW-sp->headerWidth)/sp->charWidth,
        pageShift = printH/vOffset,
        sC = sp->startColumn,
        lC = sp->endColumn,
        sR = sp->startRow,
        lR = sp->endRow,
        sH = sp->settings.bottom,
        pageCount;

        _HYColor c1 = sp->backColor,
                 c2 = sp->headerColor,
                 bc = {0,0,0};


        sp->backColor   = (_HYColor) {
            255,255,255
        };
        sp->headerColor = (_HYColor) {
            255,255,255
        };
        cOffset     -= ((cOffset/sp->blockWidth)*2)/sp->charWidth;
        cOffset     = (cOffset/sp->blockWidth)*sp->blockWidth;
        pageShift   *= cOffset;
        if (sp->columnStrings.lLength%pageShift==0) {
            pageShift = sp->columnStrings.lLength / pageShift;
        } else {
            pageShift = sp->columnStrings.lLength / pageShift + 1;
        }

        if (toPage > pageShift) {
            toPage = pageShift;
        }


        sp->startColumn = 0;
        sp->endColumn = cOffset;
        sp->startRow = 0;
        sp->endRow = sp->speciesIndex.lLength;
        sp->settings.bottom = vOffset+5+HY_SCROLLER_WIDTH;

        for (pageCount = 1; pageCount<fromPage; pageCount++) {
            sp->endColumn       +=  printH/vOffset * cOffset;
            sp->startColumn     +=  printH/vOffset * cOffset;
        }

        RECT         hangover = {0,sp->headerWidth + cOffset * sp->charWidth + (cOffset * 2)/sp->blockWidth + 1,
                                 vOffset,printW
                                },
                     frame = {0,0,vOffset+1,hangover.left};

        if (sp->startColumn< sp->columnStrings.lLength)
            for (pageCount = fromPage; pageCount<=toPage; pageCount++) {
                pageShift       = vOffset;
                if (StartPage (pd.hDC) <= 0) {
                    SuccessFlag = FALSE;
                    break;
                }

                SetMapMode  (pd.hDC, MM_ISOTROPIC);
                SetWindowExtEx (pd.hDC, hRes, vRes,nil);
                SetViewportExtEx (pd.hDC, screenHRes, screenVRes, nil);
                HDC saveDC = sp->thePane;
                sp->thePane = pd.hDC;
                sp->_HYGraphicPane::SetFont     (sp->GetFont());
                sp->SetColor    (sp->GetColor());
                while (pageShift < printH) {
                    sp->BuildPane   (false);
                    if (dataPartitions.lLength) {
                        _HYRect          daFrame;
                        daFrame.top    = frame.bottom;
                        daFrame.bottom = frame.bottom + 20;
                        daFrame.left   = frame.left   + HY_SEQUENCE_PANE_CHAR_SPACING/2 + sp->headerWidth;
                        daFrame.right  = daFrame.left + cOffset*sp->charWidth + 2*(cOffset/sp->blockWidth) - HY_SCROLLER_WIDTH;
                        BuildThermometer (&daFrame);
                    }
                    sp->startColumn = sp->endColumn;
                    sp->endColumn += cOffset;
                    sp->SetColor (bc);
                    SetWindowOrgEx (pd.hDC,0,-pageShift,nil);
                    pageShift += vOffset;
                    if (sp->startColumn>=sp->columnStrings.lLength) {
                        break;
                    }
                }
                sp->thePane = saveDC;
                if (EndPage (pd.hDC) <= 0) {
                    SuccessFlag = FALSE;
                }
            }

        sp->startColumn = sC;
        sp->endColumn   = lC;
        sp->startRow    = sR;
        sp->endRow      = lR;
        sp->backColor   = c1;
        sp->headerColor = c2;
        sp->settings.bottom = sH;

    } else {
        SuccessFlag = FALSE;
    }

    if (SuccessFlag) {
        SuccessFlag = (EndDoc(pd.hDC)>0);
    }

    if (!UserAbortFlag) {
        EnableWindow(theWindow, TRUE);
        DestroyWindow(PrintDialogHandle);
    }

    DeleteDC (pd.hDC);

    if (!SuccessFlag && !UserAbortFlag) {
        _String errMsg = _String("Failed to print sequence data. Windows Error:") & (long)GetLastError();
        ProblemReport (errMsg,nil);
    }
}

//__________________________________________________________________

void _HYDataPanel::_VerifyInferMenu(void)
{
    HMENU       lfMenu          = GetSubMenu (GetMenu (theWindow), 3),
                inferSubMenu = GetSubMenu (lfMenu, 0);

    _SimpleList    gp;

    if (GenerateGoodPartitions(gp)) {
        if (!inferSubMenu) {
            inferSubMenu    = CreatePopupMenu ();
            checkPointer    (inferSubMenu);

            InsertMenu      (inferSubMenu,  0xFFFFFFFF, MF_BYPOSITION|MF_STRING, HY_DATALF_WIN32_MENU_BASE+20,
                             "&Infer Topology\tCtrl-L");
            InsertMenu      (inferSubMenu,  0xFFFFFFFF, MF_BYPOSITION|MF_STRING, HY_DATALF_WIN32_MENU_BASE+21,
                             "Infer Topology with Constraints");

            ModifyMenu      (lfMenu,0,MF_BYPOSITION|MF_POPUP,(UINT)inferSubMenu,"&Inference");
        }
    } else {
        if (inferSubMenu) {
            MENUITEMINFO    mInfo;
            mInfo.cbSize = sizeof (MENUITEMINFO);
            mInfo.fMask  = MIIM_SUBMENU;
            mInfo.hSubMenu = nil;
            SetMenuItemInfo (lfMenu, 0, true, &mInfo);

            ModifyMenu      (lfMenu,0,MF_BYPOSITION|MF_STRING,HY_DATALF_WIN32_MENU_BASE,"&Build\tCtrl-L");
            //ModifyMenu        (lfMenu,0,MF_BYPOSITION|MF_STRING,HY_DATALF_WIN32_MENU_BASE,"&Build\tCtrl-L");
            //DestroyMenu       (inferSubMenu);
        }
    }
    DrawMenuBar(theWindow);
}

//__________________________________________________________________

void _HYDataPanel::_UpdateLFMenu (void)
{
    HMENU      lfMenu   = GetSubMenu (GetMenu (theWindow), 3),
               dataMenu = GetSubMenu (GetMenu (theWindow), 2),

               addMenu  = GetSubMenu (dataMenu, 8);

    if (lfMenu && dataMenu && addMenu) {
        if (lfID>=0) {
            EnableMenuItem (lfMenu,1,MF_BYPOSITION|MF_ENABLED);
            EnableMenuItem (lfMenu,2,MF_BYPOSITION|MF_ENABLED);
            EnableMenuItem (lfMenu,4,MF_BYPOSITION|MF_ENABLED);
            EnableMenuItem (lfMenu,6,MF_BYPOSITION|MF_ENABLED);

            EnableMenuItem (dataMenu,13,MF_BYPOSITION|MF_ENABLED);
            EnableMenuItem (dataMenu,14,MF_BYPOSITION|MF_ENABLED);

            if (((_LikelihoodFunction*)likeFuncList (lfID))->GetCategoryVars().lLength) {
                EnableMenuItem (addMenu,1,MF_BYPOSITION|MF_ENABLED);
                DrawMenuBar(theWindow);
                return;
            }
        } else {
            EnableMenuItem (lfMenu,1,MF_BYPOSITION|MF_GRAYED);
            EnableMenuItem (lfMenu,2,MF_BYPOSITION|MF_GRAYED);
            EnableMenuItem (lfMenu,4,MF_BYPOSITION|MF_GRAYED);
            EnableMenuItem (lfMenu,6,MF_BYPOSITION|MF_GRAYED);

            EnableMenuItem (dataMenu,13,MF_BYPOSITION|MF_GRAYED);
            EnableMenuItem (dataMenu,14,MF_BYPOSITION|MF_GRAYED);
        }
        EnableMenuItem (addMenu,1,MF_BYPOSITION|MF_GRAYED);
    }
    DrawMenuBar(theWindow);
}

//__________________________________________________________________

void _HYDataPanel::_UpdateSelectionChoices (bool toggle)
{
    HMENU dataMenu  = GetSubMenu (GetMenu (theWindow), 2);

    if (toggle) {
        EnableMenuItem(dataMenu,1,MF_BYPOSITION|MF_ENABLED);
    } else {
        EnableMenuItem(dataMenu,1,MF_BYPOSITION|MF_GRAYED);
    }
    DrawMenuBar(theWindow);
}

//__________________________________________________________________

void _HYDataPanel::_CopySelectionToClipboard (void)
{
    _HYSequencePane*    sp = (_HYSequencePane*)GetObject(0);
    _String             cbStr (128L,true);

    if (sp->selection.lLength) {
        for (long m=0; m<sp->speciesIndex.lLength; m++) {
            long idx = sp->speciesIndex.lData[m];
            for (long k=0; k<sp->selection.lLength; k++) {
                cbStr << ((_String*)(sp->columnStrings(sp->selection.lData[k])))->sData[idx];
                if (k&&((k+1)%sp->blockWidth==0)) {
                    cbStr << ' ';
                }
            }
            cbStr << '\r';
            cbStr << '\n';
        }
    } else if (sp->vselection.lLength)
        for (long m=0; m<sp->vselection.lLength; m++) {
            cbStr << (_String*)(sp->rowHeaders(sp->speciesIndex(sp->vselection.lData[m])));
            cbStr << '\r';
            cbStr << '\n';
        }

    cbStr.Finalize();

    if (cbStr.sLength) {
        HGLOBAL TextHandle = GlobalAlloc(GHND, cbStr.sLength+1);
        if (TextHandle) {
            char *TextPtr = (char*)GlobalLock(TextHandle);
            char *SourcePtr = cbStr.sData;
            for (; *SourcePtr; SourcePtr++) {
                *TextPtr++ = *SourcePtr;
            }
            *TextPtr = '\0';
            GlobalUnlock(TextHandle);
            OpenClipboard(theWindow);
            EmptyClipboard();
            SetClipboardData(CF_TEXT, TextHandle);
            CloseClipboard();
        }
    }
}

//__________________________________________________________________

void _HYDataPanel::_OmitSelectedSpecies (_SimpleList& idx)
{
    HMENU      dataMenu       = GetSubMenu (GetMenu (theWindow), 2),
               omittedSpecies = GetSubMenu (dataMenu, 7);

    if (omittedSpecies) {
        _HYSequencePane*    sp = (_HYSequencePane*)GetObject(0);
        long                idxShift = 10001+GetMenuItemCount (omittedSpecies);

        for (long k=0; k<idx.lLength; k++) {
            _String*        thisSpec = (_String*)sp->rowHeaders(idx.lData[k]);
            InsertMenu      (omittedSpecies,  0xFFFFFFFF, MF_BYPOSITION|MF_STRING, HY_DATA_WIN32_MENU_BASE+idxShift+k, thisSpec->sData);
        }

        EnableMenuItem (dataMenu,7, MF_BYPOSITION|MF_ENABLED);
        DrawMenuBar (theWindow);
    }
}

//__________________________________________________________________

void _HYDataPanel::_RestoreOmittedSequence (long index)
{
    HMENU      dataMenu       = GetSubMenu (GetMenu (theWindow), 2),
               omittedSpecies = GetSubMenu (dataMenu, 7);

    if (index>=0) {
        DeleteMenu  (omittedSpecies,index+2, MF_BYPOSITION);
        long        mic = GetMenuItemCount (omittedSpecies);

        MENUITEMINFO mi;
        mi.cbSize = sizeof (MENUITEMINFO);
        mi.fMask  = MIIM_ID;
        mi.wID    = HY_DATA_WIN32_MENU_BASE+10003+index;

        for (long k=index+2; k<mic; k++, mi.wID++) {
            SetMenuItemInfo (omittedSpecies, k, true, &mi);
        }

        if (mic==2) {
            EnableMenuItem (dataMenu,7, MF_BYPOSITION|MF_GRAYED);
        }
    } else {
        for (long k=0; k< omittedSeqs.lLength; k++) {
            DeleteMenu (omittedSpecies,2,MF_BYPOSITION);
        }

        EnableMenuItem (dataMenu,7, MF_BYPOSITION|MF_GRAYED);
    }
    DrawMenuBar (theWindow);
}

//__________________________________________________________________

void _HYDataPanel::_UpdatePartitionOperations (_SimpleList* sl)
{
    HMENU      dataMenu       = GetSubMenu (GetMenu (theWindow), 2);

    if (sl->lData[0]) {
        EnableMenuItem (dataMenu,0 , MF_BYPOSITION|MF_ENABLED);
        EnableMenuItem (dataMenu,10, MF_BYPOSITION|MF_ENABLED);
    } else {
        EnableMenuItem (dataMenu,0 , MF_BYPOSITION|MF_GRAYED);
        EnableMenuItem (dataMenu,10, MF_BYPOSITION|MF_GRAYED);
    }
    DrawMenuBar (theWindow);
}

//__________________________________________________________________

void _HYDataPanel::_UnsetMenuBar(void)
{
}

//__________________________________________________________________
bool _HYDataPanel::_ProcessOSEvent (Ptr vEvent)
{
    static  long        clickH   = 0;
    static  bool        isNavBar = false;

    if (!_HYTWindow::_ProcessOSEvent (vEvent)) {
        _HYWindowsUIMessage *theEvent = (_HYWindowsUIMessage*)vEvent;

        if ((theEvent->iMsg==WM_LBUTTONDOWN)||(theEvent->iMsg==WM_LBUTTONDBLCLK)
                ||(theEvent->iMsg==WM_RBUTTONDOWN)||(theEvent->iMsg==WM_MOUSEMOVE)) {
            int   ch = LOWORD(theEvent->lParam),
                  cv = HIWORD(theEvent->lParam),
                  c  = FindClickedCell(ch, cv);

            if (c<0) {
                return false;
            }

            _HYComponent* thisComponent = (_HYComponent*)components(c);

            if (c==1) { // navBar
                ch = ch-componentL.lData[1]-thermRect.left;
                cv = cv-componentT.lData[1]-thermRect.top;

                if (theEvent->iMsg==WM_LBUTTONDBLCLK) {
                    NavBarDblClick (ch);
                    return true;
                }
                if (navRect.Contains(ch,cv)||isNavBar) {
                    if ((theEvent->iMsg==WM_MOUSEMOVE)&&(theEvent->wParam & MK_LBUTTON)) {
                        isNavBar = true;
                        SetNavRectCenter (LOWORD(theEvent->lParam)-componentL.lData[1]-thermRect.left+clickH,0);
                    } else {
                        if (theEvent->iMsg==WM_LBUTTONDOWN) {
                            clickH = (navRect.right+navRect.left)/2-ch;
                        }
                        isNavBar = false;
                    }
                } else {
                    if (theEvent->iMsg==WM_LBUTTONDOWN) {
                        SetNavRectCenter (ch,cv);
                    }
                }

                //lastH = LOWORD(theEvent->lParam);
                //lastV = HIWORD(theEvent->lParam);

                return true;
            } else if ((c==4)&&(theEvent->iMsg==WM_RBUTTONDOWN)) {
                _HYSequencePane* sp2 = (_HYSequencePane*)components (4);
                sp2->ProcessContextualPopUp (ch,cv);
                return true;
            }
        } else if (theEvent->iMsg==WM_KEYDOWN) {
            TCHAR keyCode = theEvent->wParam;
            if ((keyCode==VK_LEFT)||(keyCode==VK_RIGHT)) { // left/right arrow
                _HYSequencePane* sp = (_HYSequencePane*) GetObject (0);
                if ((keyCode==VK_LEFT)&&(sp->startColumn)) {
                    sp->HScrollPane (-1);
                } else if ((keyCode==VK_RIGHT)&&(sp->endColumn<sp->columnStrings.lLength)) {
                    sp->HScrollPane (1);
                }
                return true;
            }
        } else if (theEvent->iMsg==WM_LBUTTONUP) {
            isNavBar = false;
            return   true;
        }
    } else {
        return true;
    }

    return false;
}



//EOF
\ No newline at end of file
diff --git a/src/gui/win/WindowClasses/HYPlatformGWindow.cpp b/src/gui/win/WindowClasses/HYPlatformGWindow.cpp
new file mode 100644
index 0000000..253c95c
--- /dev/null
+++ b/src/gui/win/WindowClasses/HYPlatformGWindow.cpp
@@ -0,0 +1 @@
+/*
    Graphics Window Object  for Win32 API

    Sergei L. Kosakovsky Pond, June 2000-December 2002
*/

#include "HYGWindow.h"
#include "HYEventTypes.h"
#include "HYUtils.h"

//__________________________________________________________________

void    _HYGWindow::_Paint (Ptr p)
{
    RECT srcRect,destRect;
    GetClientRect (theWindow,&destRect);
    destRect.right;
    destRect.bottom;
    int t,l,b,r;
    _VisibleContents (t,l,b,r);
    srcRect.top = t;
    srcRect.left = l;
    srcRect.bottom = b;
    srcRect.right = r;
    InvalidateRect (theWindow,&destRect,FALSE);
    PAINTSTRUCT      thePS;
    HDC theContext = BeginPaint (theWindow,&thePS);
    BitBlt (theContext,0,0,srcRect.right-srcRect.left,srcRect.bottom-srcRect.top,
            thePane,srcRect.left,srcRect.top,SRCCOPY);
    EndPaint (theWindow,&thePS);
}

//__________________________________________________________________

void    _HYGWindow::_Update (Ptr p)
{
    _Paint (p);
}

//__________________________________________________________________


bool        _HYGWindow::_ProcessMenuSelection (long msel)
{
    if (_HYWindow::_ProcessMenuSelection(msel)) {
        return true;
    }

    bool        done = false;
    switch (msel) {

    case HY_WINDOW_MENU_ID_EDIT+1: {
        _CopyToClipboard ();
        done = true;
    }
    break;

    case HY_WINDOW_MENU_ID_FILE+1: {
        _SavePicture (GetTitle());
        done = true;
    }
    break;
    }


    return done;
}

//__________________________________________________________________

void _HYGWindow::_SetMenuBar(void)
{
    _HYWindow::_SetMenuBar();
    HMENU        fileHandle = GetSubMenu(GetMenu (theWindow),1);

    EnableMenuItem (fileHandle, 2, MF_BYPOSITION|MF_ENABLED);

    _AddStandardAccels();
    _BuildAccelTable  ();

    accels.Clear();
}

//__________________________________________________________________

void _HYGWindow::_UnsetMenuBar(void)
{
}


//EOF
\ No newline at end of file
diff --git a/src/gui/win/WindowClasses/HYPlatformModelWindow.cpp b/src/gui/win/WindowClasses/HYPlatformModelWindow.cpp
new file mode 100644
index 0000000..c18bd39
--- /dev/null
+++ b/src/gui/win/WindowClasses/HYPlatformModelWindow.cpp
@@ -0,0 +1 @@
+/*
    Win32 Portions of the model window

    Sergei L. Kosakovsky Pond, Spring 2000 - February 2003.
*/

#include "HYModelWindow.h"
#include "HYUtils.h"

#define     HY_MDL_WIN32_MENU_BASE  9200

//__________________________________________________________________

void _HYModelWindow::_SetMenuBar(void)
{
    _HYWindow::_SetMenuBar();

    HMENU     windowMenu = GetMenu (theWindow),
              ptMenu     = GetSubMenu(windowMenu,2);

    if (!ptMenu) {
        ptMenu = CreateMenu();

        HMENU        rateMenu = ListToPopUpMenu (rateOptions, HY_MDL_WIN32_MENU_BASE+99),
                     saveMenu = CreatePopupMenu ();

        checkPointer (ptMenu);
        checkPointer (rateMenu);
        checkPointer (saveMenu);

        CheckMenuItem (rateMenu, rateChoice, MF_BYPOSITION|MF_CHECKED);


        InsertMenu      (ptMenu,  0xFFFFFFFF, MF_BYPOSITION|MF_STRING, HY_MDL_WIN32_MENU_BASE, "&Model Name");
        InsertMenu      (ptMenu,  0xFFFFFFFF, MF_BYPOSITION|MF_POPUP, (UINT)rateMenu, "&View Options");

        InsertMenu      (windowMenu,  0xFFFFFFFF, MF_BYPOSITION|MF_POPUP, (UINT)ptMenu, "&Model");

        InsertMenu      (saveMenu,  0xFFFFFFFF, MF_BYPOSITION|MF_STRING, HY_WINDOW_MENU_ID_FILE+1, "&Save\tCtrl-S");
        InsertMenu      (saveMenu,  0xFFFFFFFF, MF_BYPOSITION|MF_STRING, HY_WINDOW_MENU_ID_FILE+3, "Save &As...");

        ModifyMenu   (GetSubMenu(windowMenu,0), 0, MF_BYPOSITION|MF_POPUP, (UINT) saveMenu , "&Save");

        _AddStandardAccels();
        _BuildAccelTable  (true);
        accels.Clear();

    }

    ptMenu = GetSubMenu (windowMenu,1);
    EnableMenuItem (ptMenu,6,MF_BYPOSITION|MF_ENABLED);
    EnableMenuItem (ptMenu,2,MF_BYPOSITION|MF_ENABLED);

    DrawMenuBar(theWindow);
}


//__________________________________________________________________

void _HYModelWindow::_UnsetMenuBar(void)
{
}

//__________________________________________________________________


bool        _HYModelWindow::_ProcessMenuSelection (long msel)
{
    switch (msel) {
    case HY_WINDOW_MENU_ID_FILE+1: // save menu
    case HY_WINDOW_MENU_ID_FILE+3: { // save as menu
        DoSave (msel-HY_WINDOW_MENU_ID_FILE-2);
        return true;
    }

    case HY_WINDOW_MENU_ID_FILE+2: { // print
        _HYTable* t = (_HYTable*)GetCellObject (MODEL_MATRIX_ROW,4);
        t->_PrintTable((_HYTable*)GetCellObject (MODEL_MATRIX_ROW-1,4));
        return true;
    }

    case HY_WINDOW_MENU_ID_EDIT+1: { // copy
        DoCopyCell ();
        return true;
    }

    case HY_WINDOW_MENU_ID_EDIT+3: { // paste
        DoPasteToCells();
        return true;
    }

    case HY_WINDOW_MENU_ID_EDIT+5: { // select all
        DoSelectAll();
        return true;
    }

    case HY_MDL_WIN32_MENU_BASE: { // model menu
        DoEditModelName ();
        return true;
    }

    default: { // rate menu
        msel -= HY_MDL_WIN32_MENU_BASE+100;
        if (msel>=0) {
            if (msel!=rateChoice) {
                HMENU           rateMenu = GetSubMenu (GetSubMenu (GetMenu (theWindow),2),1);
                CheckMenuItem   (rateMenu,rateChoice,MF_BYPOSITION|MF_UNCHECKED);
                rateChoice = msel;
                CheckMenuItem   (rateMenu,rateChoice,MF_BYPOSITION|MF_CHECKED);
                taint = true;
                DrawMenuBar(theWindow);
            }
        }
        return true;
    }
    }

    if (_HYTWindow::_ProcessMenuSelection(msel)) {
        return true;
    }

    return false;
}

//__________________________________________________________________

void _HYModelWindow::_UpdateEditMenu (bool c, bool p)
{
    HMENU  t = GetSubMenu (GetMenu (theWindow),2);
    if (c) {
        EnableMenuItem (t,2,MF_BYPOSITION|MF_ENABLED);
    } else {
        EnableMenuItem (t,2,MF_BYPOSITION|MF_GRAYED);
    }
    if (p) {
        EnableMenuItem (t,4,MF_BYPOSITION|MF_ENABLED);
    } else {
        EnableMenuItem (t,4,MF_BYPOSITION|MF_GRAYED);
    }

    DrawMenuBar(theWindow);
}

//__________________________________________________________________

bool _HYModelWindow::_CheckClipboard (void)
{
    clipboardString = empty;
    HANDLE  scrapHandle = GetClipboardData (CF_TEXT);

    if (scrapHandle) {
        _String cText ((char*)scrapHandle);
        skipWarningMessages = true;
        _Formula f (cText,nil,false);
        skipWarningMessages = false;
        if (f.GetList().lLength) {
            clipboardString = cText;
            SyncEditBox ();
        }
    }
    return clipboardString.sLength;
}

//__________________________________________________________________

void _HYModelWindow::_SetClipboard (void)
{
    if (clipboardString.sLength) {
        PlaceStringInClipboard (clipboardString, (Ptr)theWindow);
    }
}

//EOF
\ No newline at end of file
diff --git a/src/gui/win/WindowClasses/HYPlatformPWindow.cpp b/src/gui/win/WindowClasses/HYPlatformPWindow.cpp
new file mode 100644
index 0000000..3d00b1b
--- /dev/null
+++ b/src/gui/win/WindowClasses/HYPlatformPWindow.cpp
@@ -0,0 +1 @@
+/*
    Win32 Portions of the picture window class

    Sergei L. Kosakovsky Pond, Spring 2000 - January 2003.
*/

#include "HYGWindow.h"
#include "HYCanvas.h"
#include "errorfns.h"
#include "HYDialogs.h"

#define  HY_PWINDOW_WIN32_MENU_BASE  9000


//__________________________________________________________________
// _HYPlatformPWindow
//__________________________________________________________________

_HYPlatformPWindow::_HYPlatformPWindow          (void)
{
    savedPic  = nil;
    stashedDC = nil;
}

//__________________________________________________________________

_HYPlatformPWindow::~_HYPlatformPWindow         (void)
{
    if (savedPic) {
        DeleteEnhMetaFile (savedPic);
    }
}

//__________________________________________________________________

void    _HYPlatformPWindow::_StartPicture   (void)
{
    _HYPWindow*     theParent = (_HYPWindow*)    this;

    HDC             oldDC = theParent->thePane;

    if (savedPic) {
        DeleteEnhMetaFile (savedPic);
    }

    long    iXMM = GetDeviceCaps (oldDC, HORZSIZE),
            iYMM = GetDeviceCaps (oldDC, VERTSIZE),
            iXPX = GetDeviceCaps (oldDC, HORZRES),
            iYPX = GetDeviceCaps (oldDC, VERTRES);

    RECT    bounds = {0,0, (theParent->w*100*iXMM)/iXPX,
                      (theParent->h*100*iYMM)/iYPX
                     };



    if (!(oldDC = CreateEnhMetaFile (NULL, NULL, &bounds, NULL))) {
        _String errMsg = _String ("Failed to create an enhanced meta file in call to _StartPicture. Windows Error:") & (long)GetLastError() & '.';
        WarnError (errMsg);
        return;
    }

    stashedDC = theParent->thePane;
    theParent->thePane = oldDC;
    SetBkMode (oldDC, TRANSPARENT);
}

//__________________________________________________________________

void    _HYPlatformPWindow::_EndPicture     (void)
{
    if (stashedDC) {
        _HYPWindow*     theParent = (_HYPWindow*)    this;
        savedPic = CloseEnhMetaFile (theParent->thePane);

        RECT    bounds = {0,0, theParent->w,
                          theParent->h
                         };


        theParent->thePane = stashedDC;
        PlayEnhMetaFile (stashedDC, savedPic, &bounds);
        stashedDC = nil;
    }
}

//__________________________________________________________________

void    _HYPlatformPWindow::_DrawPicture    (_HYRect r)
{
    RECT R = HYRect2Rect (r);
    if (savedPic) {
        PlayEnhMetaFile (((_HYPWindow*)this)->thePane, savedPic, &R);
    }
}

//__________________________________________________________________
// _HYPWindow
//__________________________________________________________________

void        _HYPWindow::_PrintPWindow(void)
{
    DOCINFO                 di = {sizeof(DOCINFO), "HYPHY.out", NULL };
    PRINTDLG                pd;
    BOOL                    SuccessFlag;

    pd.lStructSize         = sizeof(PRINTDLG);
    pd.hwndOwner           = theWindow;
    pd.hDevMode            = NULL;
    pd.hDevNames           = NULL;
    pd.hDC                 = NULL;
    pd.Flags               = PD_COLLATE | PD_RETURNDC | PD_NOSELECTION;
    pd.nFromPage           = 1;
    pd.nToPage             = 0xffff;
    pd.nMinPage            = 1;
    pd.nMaxPage            = 0xffff;
    pd.nCopies             = 1;
    pd.hInstance           = NULL;
    pd.lCustData           = 0L;
    pd.lpfnPrintHook       = NULL;
    pd.lpfnSetupHook       = NULL;
    pd.lpPrintTemplateName = NULL;
    pd.lpSetupTemplateName = NULL;
    pd.hPrintTemplate      = NULL;
    pd.hSetupTemplate      = NULL;

    if (!PrintDlg(&pd)) {
        return;
    }

    if (pd.hDC == NULL) {
        pd.hDC = GetPrinterDeviceContext(theWindow);
    }


    EnableWindow(theWindow, FALSE);

    SuccessFlag   = TRUE;
    UserAbortFlag = FALSE;

    PrintDialogHandle = CreateDialog(GetModuleHandle(NULL), (LPCTSTR)"PrintDlgBox", theWindow,
                                     PrintDialogProc);
    SetDlgItemText(PrintDialogHandle, IDD_FNAME, "Chart Printing...");

    SetAbortProc(pd.hDC, AbortProc);

    if (StartDoc(pd.hDC, &di) > 0) {
        HDC         windowDC = GetDC (theWindow);

        long        printW = GetDeviceCaps(pd.hDC, HORZRES),
                    printH = GetDeviceCaps(pd.hDC, VERTRES),

                    hRes = GetDeviceCaps(pd.hDC, LOGPIXELSX),
                    vRes = GetDeviceCaps(pd.hDC, LOGPIXELSY),

                    screenHRes = GetDeviceCaps(windowDC, LOGPIXELSX),
                    screenVRes = GetDeviceCaps(windowDC, LOGPIXELSY),

                    fromPage = pd.nMinPage,
                    toPage   = pd.nMaxPage;


        if (pd.Flags & PD_PAGENUMS) {
            fromPage = pd.nFromPage;
            toPage   = pd.nToPage;
        }

        ReleaseDC   (theWindow, windowDC);
        hRes = printW*((_Parameter)screenHRes/hRes);
        vRes = printH*((_Parameter)screenVRes/vRes);
        screenHRes = printW;
        screenVRes = printH;

        printW = hRes;
        printH = vRes;

        if (StartPage (pd.hDC) <= 0) {
            SuccessFlag = FALSE;
        } else {
            SetMapMode  (pd.hDC, MM_ISOTROPIC);
            SetWindowExtEx (pd.hDC, hRes, vRes,nil);
            SetViewportExtEx (pd.hDC, screenHRes, screenVRes, nil);

            _Parameter sx = 1., sy = 1.;

            if (printW<w) {
                sx = (_Parameter)printW/w;
            }
            if (printH<h) {
                sy = (_Parameter)printH/h;
            }

            if (sx>sy) {
                sx = sy;
            } else {
                sy = sx;
            }

            _HYRect         drect = {0,0,h*sy,w*sx,0};
            drect.left   = (printW-drect.right)/2;
            drect.right += drect.left;
            drect.top    = (printH-drect.bottom)/2;
            drect.bottom+= drect.top;

            HDC         saveDC = thePane;

            thePane = pd.hDC;
            _DrawPicture    (drect);
            thePane = saveDC;

            if (EndPage (pd.hDC) <= 0) {
                SuccessFlag = FALSE;
            }
        }
    } else {
        SuccessFlag = FALSE;
    }

    if (SuccessFlag) {
        SuccessFlag = (EndDoc(pd.hDC)>0);
    }

    if (!UserAbortFlag) {
        EnableWindow(theWindow, TRUE);
        DestroyWindow(PrintDialogHandle);
    }

    DeleteDC (pd.hDC);

    if (!SuccessFlag && !UserAbortFlag) {
        _String errMsg = _String("Failed to print the picture. Windows Error:") & (long)GetLastError();
        ProblemReport (errMsg,nil);
    }
}

//__________________________________________________________________

void _HYPWindow::_SetWindowRectangle(int top, int left, int bottom, int right, bool ss)
{
    _HYPlatformWindow::_SetWindowRectangle (top,left,bottom,right, ss);
    SetPaneSize     (bottom-top,right-left,depth);
    SetContentSize  (right-left,bottom-top);
}

//__________________________________________________________________

void    _HYPWindow::_Paint (Ptr p)
{
    RECT          srcRect  = {0,0,w,h},
                  destRect = srcRect;

    InvalidateRect (theWindow,&destRect,FALSE);
    PAINTSTRUCT      thePS;
    HDC theContext = BeginPaint (theWindow,&thePS);
    BitBlt (theContext,0,0,srcRect.right-srcRect.left,srcRect.bottom-srcRect.top,
            thePane,srcRect.left,srcRect.top,SRCCOPY);
    EndPaint (theWindow,&thePS);


}

//__________________________________________________________________

void    _HYPWindow::_Update (Ptr p)
{
    _Paint (p);
}

//__________________________________________________________________

long _HYPWindow::_Grow(Ptr theData)
{
    _HYPlatformWindow::_Grow (theData);
    RECT myDims;
    GetClientRect (theWindow,&myDims);

    SetWindowRectangle (0,0,myDims.bottom,myDims.right,false);

    GetClientRect  (theWindow,&myDims);
    InvalidateRect (theWindow,&myDims,false);
    return 0;
}

//__________________________________________________________________

bool        _HYPWindow::_ProcessMenuSelection (long msel)
{
    if (_HYWindow::_ProcessMenuSelection(msel)) {
        return true;
    }

    bool        done = false;

    switch (msel) {
    case HY_WINDOW_MENU_ID_FILE+2:
        _PrintPWindow();
        done = true;
        break;

    case HY_PWINDOW_WIN32_MENU_BASE:
        Zoom (1.1);
        done = true;
        break;

    case HY_PWINDOW_WIN32_MENU_BASE+1:
        Zoom (.9);
        done = true;
        break;

    case HY_PWINDOW_WIN32_MENU_BASE+2:
        OriginalSize();
        done = true;
        break;
    }

    if (!done) {
        return _HYGWindow::_ProcessMenuSelection (msel);
    }

    return done;
}

//__________________________________________________________________

void _HYPWindow::_SetMenuBar(void)
{

    _HYGWindow::_SetMenuBar();

    HMENU            windowMenu = GetMenu (theWindow),
                     chartMenu =  GetSubMenu(windowMenu,2);

    if (!chartMenu) {
        chartMenu   = CreateMenu();

        InsertMenu   (chartMenu,  0xFFFFFFFF, MF_BYPOSITION|MF_STRING, HY_PWINDOW_WIN32_MENU_BASE  , "&Enlarge\tCtrl-1");
        InsertMenu   (chartMenu,  0xFFFFFFFF, MF_BYPOSITION|MF_STRING, HY_PWINDOW_WIN32_MENU_BASE+1, "&Shrink\tCtrl-2");
        InsertMenu   (chartMenu,  0xFFFFFFFF, MF_BYPOSITION|MF_STRING, HY_PWINDOW_WIN32_MENU_BASE+2, "&Original Size\tCtrl-3");

        InsertMenu   (windowMenu, 2, MF_BYPOSITION|MF_POPUP, (UINT) chartMenu , "&Image");


        accels       << (FCONTROL|FVIRTKEY);
        accels       << '1';
        accels       << HY_PWINDOW_WIN32_MENU_BASE;

        accels       << (FCONTROL|FVIRTKEY);
        accels       << '2';
        accels       << HY_PWINDOW_WIN32_MENU_BASE+1;

        accels       << (FCONTROL|FVIRTKEY);
        accels       << '3';
        accels       << HY_PWINDOW_WIN32_MENU_BASE+2;

        _AddStandardAccels();
        _BuildAccelTable  (true);
        accels.Clear();
    }

    DrawMenuBar(theWindow);

}

//__________________________________________________________________

void _HYPWindow::_UnsetMenuBar(void)
{

}

//__________________________________________________________________

bool _HYPWindow::_ProcessOSEvent (Ptr vEvent)
{
    _HYWindowsUIMessage * theEvent = (_HYWindowsUIMessage *)vEvent;

    switch (theEvent->iMsg) {
    case WM_GETMINMAXINFO:

        MINMAXINFO* windowInfo = (MINMAXINFO*)theEvent->lParam;

        windowInfo->ptMinTrackSize.x = 10;
        windowInfo->ptMinTrackSize.y = 10;
        windowInfo->ptMaxSize.x=windowInfo->ptMaxTrackSize.x = 0x7777;
        windowInfo->ptMaxSize.y=windowInfo->ptMaxTrackSize.y = 0x7777;

        return false;
        break;
    }

    return _HYPlatformWindow::_ProcessOSEvent (vEvent);
}

//__________________________________________________________________
//EOF
\ No newline at end of file
diff --git a/src/gui/win/WindowClasses/HYPlatformParameterTable.cpp b/src/gui/win/WindowClasses/HYPlatformParameterTable.cpp
new file mode 100644
index 0000000..66a7c8a
--- /dev/null
+++ b/src/gui/win/WindowClasses/HYPlatformParameterTable.cpp
@@ -0,0 +1 @@
+/*
    Win32 Portions of the parameter table class

    Sergei L. Kosakovsky Pond, Spring 2000 - January 2003.
*/

#include "HYParameterTable.h"
#include "HYUtils.h"

#define     HY_PT_WIN32_MENU_BASE  9000

//__________________________________________________________________

void _HYParameterTable::_SetMenuBar(void)
{
    _HYWindow::_SetMenuBar();

    HMENU     windowMenu = GetMenu (theWindow),
              ptMenu     = GetSubMenu(windowMenu,2);

    if (!ptMenu) {
        ptMenu = CreateMenu();
        HMENU viewMenu = CreatePopupMenu ();

        checkPointer (ptMenu);
        checkPointer (viewMenu);

        InsertMenu      (viewMenu,  0xFFFFFFFF, MF_BYPOSITION|MF_STRING, HY_PT_WIN32_MENU_BASE+10, "&Local Parameters");
        InsertMenu      (viewMenu,  0xFFFFFFFF, MF_BYPOSITION|MF_STRING, HY_PT_WIN32_MENU_BASE+11, "&Global Parameters");
        InsertMenu      (viewMenu,  0xFFFFFFFF, MF_BYPOSITION|MF_STRING, HY_PT_WIN32_MENU_BASE+12, "&Constrained Parameters");
        InsertMenu      (viewMenu,  0xFFFFFFFF, MF_BYPOSITION|MF_STRING, HY_PT_WIN32_MENU_BASE+13, "&Rate Classes");
        InsertMenu      (viewMenu,  0xFFFFFFFF, MF_BYPOSITION|MF_STRING, HY_PT_WIN32_MENU_BASE+14, "&Trees");

        InsertMenu      (ptMenu,    0xFFFFFFFF, MF_BYPOSITION|MF_POPUP, (UINT)viewMenu, "&View Options");
        InsertMenu      (ptMenu,    0xFFFFFFFF, MF_SEPARATOR, 0, nil);
        InsertMenu      (ptMenu,    0xFFFFFFFF, MF_BYPOSITION|MF_STRING, HY_PT_WIN32_MENU_BASE  , "&Recalculate LF\tCtrl-U");
        InsertMenu      (ptMenu,    0xFFFFFFFF, MF_BYPOSITION|MF_STRING, HY_PT_WIN32_MENU_BASE+1, "&Optimize LF\tCtrl-T");
        InsertMenu      (ptMenu,    0xFFFFFFFF, MF_SEPARATOR, 0, nil);
        InsertMenu      (ptMenu,    0xFFFFFFFF, MF_BYPOSITION|MF_STRING, HY_PT_WIN32_MENU_BASE+2, "&Enter Command");
        InsertMenu      (ptMenu,    0xFFFFFFFF, MF_BYPOSITION|MF_STRING, HY_PT_WIN32_MENU_BASE+3, "Remove &Unused Parameters");
        InsertMenu      (ptMenu,    0xFFFFFFFF, MF_SEPARATOR, 0, nil);
        InsertMenu      (ptMenu,    0xFFFFFFFF, MF_BYPOSITION|MF_STRING, HY_PT_WIN32_MENU_BASE+4, "Covariance, Sampler and C&I");
        InsertMenu      (ptMenu,    0xFFFFFFFF, MF_BYPOSITION|MF_STRING, HY_PT_WIN32_MENU_BASE+5, "Likelihood Pro&file Plot");
        InsertMenu      (ptMenu,    0xFFFFFFFF, MF_SEPARATOR, 0, nil);
        InsertMenu      (ptMenu,    0xFFFFFFFF, MF_BYPOSITION|MF_STRING, HY_PT_WIN32_MENU_BASE+6, "Cate&gories Processor");
        InsertMenu      (ptMenu,    0xFFFFFFFF, MF_SEPARATOR, 0, nil);
        InsertMenu      (ptMenu,    0xFFFFFFFF, MF_BYPOSITION|MF_STRING, HY_PT_WIN32_MENU_BASE+7, "Sele&ct Parameters");
        InsertMenu      (ptMenu,    0xFFFFFFFF, MF_BYPOSITION|MF_STRING, HY_PT_WIN32_MENU_BASE+8, "Open Selection in &Table");

        _UpdateViewMenu();

        InsertMenu      (windowMenu, 2, MF_BYPOSITION|MF_POPUP, (UINT) ptMenu , "&Likelihood");

        accels       << (FCONTROL|FVIRTKEY);
        accels       << 'U';
        accels       << HY_PT_WIN32_MENU_BASE;

        accels       << (FCONTROL|FVIRTKEY);
        accels       << 'T';
        accels       << HY_PT_WIN32_MENU_BASE+1;


        _AddStandardAccels();
        _BuildAccelTable  (true);
        accels.Clear();

    }

    ptMenu = GetSubMenu (windowMenu,1);
    EnableMenuItem (ptMenu,6,MF_BYPOSITION|MF_ENABLED);
    if (undoCommands.lLength) {
        EnableMenuItem (ptMenu,0,MF_BYPOSITION|MF_ENABLED);
    }

    DrawMenuBar(theWindow);
}

//__________________________________________________________________


bool        _HYParameterTable::_ProcessMenuSelection (long msel)
{

    _HYTable*   table = (_HYTable*)GetCellObject(HY_PARAMETER_TABLE_TABLE_ROW,0);
    bool        res = false;

    switch (msel) {
    case HY_WINDOW_MENU_ID_FILE+1: { // save
        DoSave ();
        res = true;
        break;
    }
    case HY_WINDOW_MENU_ID_FILE+2: { // print
        _SimpleList columns,
                    sel;
        columns << 0;
        columns << 1;
        columns << 2;
        columns << 3;
        table->GetSelection (sel);
        char    resp = 3;
        if (sel.lLength) {
            _String pr ("Would you like to print only the selected cells? (Click \"No\" to print the entire table).");
            resp = YesNoCancelPrompt (pr);
        }
        if (resp == 3) {
            table->_PrintTable(columns,(_HYTable*)GetCellObject(HY_PARAMETER_TABLE_TABLE_ROW-1,0));
        } else if (resp == 1) {
            _SimpleList rows;
            for (long k = 0; k < sel.lLength; k+=4) {
                rows << sel.lData[k]/4;
            }
            table->_PrintTable(columns,rows,(_HYTable*)GetCellObject(HY_PARAMETER_TABLE_TABLE_ROW-1,0));
        }
        res = true;
        break;
    }

    case HY_WINDOW_MENU_ID_EDIT: { // undo
        UndoCommand();
        _UpdateUndoMenu (nil,nil);
        res = true;
        break;
    }

    case HY_WINDOW_MENU_ID_EDIT+5: { // undo
        SelectAll();
        res = true;
        break;
    }

    case HY_PT_WIN32_MENU_BASE+10:
    case HY_PT_WIN32_MENU_BASE+11:
    case HY_PT_WIN32_MENU_BASE+12:
    case HY_PT_WIN32_MENU_BASE+13: {
        res = true;
        char   toggleFlag;
        msel -= HY_PT_WIN32_MENU_BASE+10;
        switch (msel) {
        case 0:
            toggleFlag = HY_PARAMETER_TABLE_VIEW_LOCAL;
            break;
        case 1:
            toggleFlag = HY_PARAMETER_TABLE_VIEW_GLOBAL;
            break;
        case 2:
            toggleFlag = HY_PARAMETER_TABLE_VIEW_CONSTRAINED;
            break;
        case 3:
            toggleFlag = HY_PARAMETER_TABLE_VIEW_CATEGORY;
            break;

        }
        if (viewOptions&toggleFlag) {
            if (viewOptions-toggleFlag) {
                viewOptions-=toggleFlag;
            } else {
                break;
            }
        } else {
            viewOptions+=toggleFlag;
        }

        CheckMenuItem (GetSubMenu(GetSubMenu (GetMenu (theWindow),2),0),msel,MF_BYPOSITION|((viewOptions&toggleFlag)?MF_CHECKED:MF_UNCHECKED));
        ConstructTheTable();
        SetWindowRectangle (top,left,bottom,right);
        break;
    }

    case HY_PT_WIN32_MENU_BASE+1:
        OptimizeLikelihoodFunction();
        res = true;
        break;

    case HY_PT_WIN32_MENU_BASE+2:
        DoEnterConstraint ();
        res = true;
        break;

    case HY_PT_WIN32_MENU_BASE+3:
        DoCleanUp   ();
        res = true;
        break;

    case HY_PT_WIN32_MENU_BASE+4:
        HandleVarianceEstimates ();
        res = true;
        break;

    case HY_PT_WIN32_MENU_BASE+5:
        HandleProfilePlot   ();
        res = true;
        break;

    case HY_PT_WIN32_MENU_BASE+6:
        HandleCategories    ();
        res = true;
        break;

    case HY_PT_WIN32_MENU_BASE+7:
        HandleSelectParameters  ();
        res = true;
        break;

    case HY_PT_WIN32_MENU_BASE+8:
        HandleOpenInChart   ();
        res = true;
        break;
    }

    if (!res) {
        res = _HYTWindow::_ProcessMenuSelection(msel);
    }
    DrawMenuBar (theWindow);
    return res;
}

//__________________________________________________________________

void _HYParameterTable::_UpdateViewMenu(void)
{
    HMENU viewMenu = GetSubMenu(GetSubMenu (GetMenu (theWindow),2),0);

    if (!(avViewOptions&HY_PARAMETER_TABLE_VIEW_GLOBAL)) {
        EnableMenuItem (viewMenu,1,MF_BYPOSITION|MF_GRAYED);
    } else {
        EnableMenuItem (viewMenu,1,MF_BYPOSITION|MF_ENABLED);
    }


    if (!(avViewOptions&HY_PARAMETER_TABLE_VIEW_CONSTRAINED)) {
        EnableMenuItem (viewMenu,2,MF_BYPOSITION|MF_GRAYED);
    } else {
        EnableMenuItem (viewMenu,2,MF_BYPOSITION|MF_ENABLED);
    }

    if (!(avViewOptions&HY_PARAMETER_TABLE_VIEW_CATEGORY)) {
        EnableMenuItem (viewMenu,3,MF_BYPOSITION|MF_GRAYED);
    } else {
        EnableMenuItem (viewMenu,3,MF_BYPOSITION|MF_ENABLED);
    }

    if (!(avViewOptions&HY_PARAMETER_TABLE_VIEW_TREES)) {
        EnableMenuItem (viewMenu,4,MF_BYPOSITION|MF_GRAYED);
    } else {
        EnableMenuItem (viewMenu,4,MF_BYPOSITION|MF_ENABLED);
    }

    CheckMenuItem (viewMenu,0,MF_BYPOSITION|((viewOptions&HY_PARAMETER_TABLE_VIEW_LOCAL)?MF_CHECKED:MF_UNCHECKED));
    CheckMenuItem (viewMenu,1,MF_BYPOSITION|((viewOptions&HY_PARAMETER_TABLE_VIEW_GLOBAL)?MF_CHECKED:MF_UNCHECKED));
    CheckMenuItem (viewMenu,2,MF_BYPOSITION|((viewOptions&HY_PARAMETER_TABLE_VIEW_CONSTRAINED)?MF_CHECKED:MF_UNCHECKED));
    CheckMenuItem (viewMenu,3,MF_BYPOSITION|((viewOptions&HY_PARAMETER_TABLE_VIEW_CATEGORY)?MF_CHECKED:MF_UNCHECKED));
    CheckMenuItem (viewMenu,4,MF_BYPOSITION|((viewOptions&HY_PARAMETER_TABLE_VIEW_TREES)?MF_CHECKED:MF_UNCHECKED));
}


//__________________________________________________________________

void _HYParameterTable::_UnsetMenuBar(void)
{
}

//__________________________________________________________________

void _HYParameterTable::_UpdateUndoMenu(_String* command, _String* desc)
{
    HMENU editMenu = GetSubMenu (GetMenu (theWindow),1);
    if (command&&desc) {
        undoCommands        &&  command;
        undoDescriptions    &&  desc;
        _String       temp = _String('&') & *desc & "\tCtrl-Z";
        ModifyMenu    (editMenu,0,MF_BYPOSITION|MF_STRING|MF_ENABLED, HY_WINDOW_MENU_ID_EDIT, temp.sData);
    } else {
        if (undoDescriptions.lLength==0) {
            ModifyMenu    (editMenu,0,MF_BYPOSITION|MF_STRING|MF_GRAYED, HY_WINDOW_MENU_ID_EDIT, "Can't &Undo\tCtrl-Z");
        } else {
            _String       temp = _String('&') & *(_String*)undoDescriptions(undoDescriptions.lLength-1) & "\tCtrl-Z";
            ModifyMenu    (editMenu,0,MF_BYPOSITION|MF_STRING|MF_ENABLED, HY_WINDOW_MENU_ID_EDIT, temp.sData);
        }
    }
    DrawMenuBar(theWindow);
}

//EOF
\ No newline at end of file
diff --git a/src/gui/win/WindowClasses/HYPlatformTWindow.cpp b/src/gui/win/WindowClasses/HYPlatformTWindow.cpp
new file mode 100644
index 0000000..cc048f5
--- /dev/null
+++ b/src/gui/win/WindowClasses/HYPlatformTWindow.cpp
@@ -0,0 +1 @@
+/*
    Container Window Object  for Win32 API

    Sergei L. Kosakovsky Pond, June 2000-December 2002
*/

#include "HYWindow.h"
#include "HYEventTypes.h"
#include "HYTableWindow.h"
#include "HYUtils.h"


//__________________________________________________________________

HFONT           _HY_StatusBarFont = //CreateFont (12,0,0,0,0,0,FALSE,FALSE,ANSI_CHARSET,OUT_DEFAULT_PRECIS,
    //CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH|FF_DONTCARE,"Times Roman");
    CreateFont (10,0,0,0,400,FALSE,FALSE,FALSE,ANSI_CHARSET,OUT_DEFAULT_PRECIS,
                CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH|FF_SWISS,"MS Sans Serif");


HPEN            _BLACKPEN_        = CreatePen  (PS_SOLID,1,RGB(0,0,0));

//__________________________________________________________________

VOID CALLBACK IdleWindowTimer (HWND hwnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime)
{
    if (idEvent == IDLE_WINDOW_TIMER) {
        _HYTWindow * myTW = (_HYTWindow*)windowObjects(windowPtrs.Find((long)hwnd));
        for (long k=0; k<myTW->components.lLength; k++)
            if (myTW->cells.Find(k)>=0) {
                _HYComponent* tC = (_HYComponent*)myTW->components(k);
                tC->IdleHandler();
            }

        myTW->_HandleIdleEvent ();
    }
}

//__________________________________________________________________

long _HYTWindow::_Grow(Ptr theData)
{
    RECT myDims;
    GetClientRect (theWindow,&myDims);

    SetWindowRectangle (0,0,myDims.bottom,myDims.right,false);

    GetClientRect  (theWindow,&myDims);
    InvalidateRect (theWindow,&myDims,false);

    return 0;
}

//__________________________________________________________________

void _HYTWindow::_PaintStatusBar(Ptr hdc, bool)
{
    if ((flags&HY_WINDOW_SCROLL)==0) {
        RECT clearRect;
        GetClientRect (theWindow, &clearRect);

        clearRect.left--;
        clearRect.top = clearRect.bottom-HY_SCROLLER_WIDTH;
        clearRect.bottom++;

        HDC      windowContext;

        if (hdc) {
            windowContext = (HDC)hdc;
        } else {
            windowContext = GetDC (theWindow);
        }

        FillRect (windowContext, &clearRect, windowStatusBarBrush);

        HPEN     savePen = (HPEN)SelectObject (windowContext, _BLACKPEN_);

        /*MoveToEx (windowContext,clearRect.left,clearRect.top,NULL);
        LineTo (windowContext,clearRect.right,clearRect.top);*/

        DrawEdge (windowContext, &clearRect, EDGE_SUNKEN, BF_TOP);

        SelectObject (windowContext, savePen);

        if (statusBar.sLength) {
            UINT  saveAlign  = GetTextAlign (windowContext);
            int   saveBkMode = GetBkMode (windowContext);

            SetTextAlign (windowContext, TA_BASELINE);
            SetBkMode    (windowContext, TRANSPARENT);
            HFONT saveFont = (HFONT)SelectObject (windowContext, _HY_StatusBarFont);

            TextOut (windowContext, (flags&HY_WINDOW_STATUS_BAR_LIGHT_LEFT)?20:5,
                     clearRect.bottom-4, statusBar.sData, statusBar.sLength);

            SetBkMode    (windowContext, saveBkMode);
            SelectObject (windowContext, saveFont);
            SetTextAlign (windowContext, saveAlign);
        }

        if (!hdc) {
            ReleaseDC (theWindow,windowContext);
        }
    }
}

//__________________________________________________________________

void _HYTWindow::_Paint(Ptr)
{
    if (!GetUpdateRect(theWindow,NULL,FALSE)) {
        return;
    }
    PAINTSTRUCT      thePS;
    HDC theContext = BeginPaint (theWindow,&thePS);
    _HYRect  relRect;
    relRect.width = (long)theContext;

    _SimpleList     alreadyDone (components.lLength);

    for (int k=0; k<cells.lLength; k++) {
        long i = cells.lData[k];

        if (alreadyDone.lData[i] == 0) {
            relRect.left = componentL.lData[i];
            relRect.right = componentR.lData[i];
            relRect.top = componentT.lData[i];
            relRect.bottom = componentB.lData[i];
            ((_HYComponent*)components(i))->Update((Ptr)&relRect);
            alreadyDone.lData[i] = 1;
        }
    }
    if(flags&HY_WINDOW_SIZE) {
        _PaintStatusBar((Ptr)theContext);
    }

    EndPaint (theWindow,&thePS);
}

//__________________________________________________________________

void _HYTWindow::_Update(Ptr)
{
    _Paint(nil);
}


//__________________________________________________________________
void        _HYTWindow::_SetStatusBar(_String& text)
{
    statusBar = text;
    _PaintStatusBar();
}

//__________________________________________________________________

bool _HYTWindow::_ProcessOSEvent (Ptr vEvent)
{
    _HYWindowsUIMessage * theEvent = (_HYWindowsUIMessage *)vEvent;
    long       invisPixels;
    long       currentValue, oldValue;
    POINT      localPoint;
    int        c;
    RECT       bigR, smallR;
    MINMAXINFO* windowInfo;

    switch (theEvent->iMsg) {
    case WM_HSCROLL:
    case WM_VSCROLL: {
        HWND sW = (HWND)theEvent->lParam;
        if (sW) {
            for (int i=0; i<components.lLength; i++) {
                _HYComponent *thisC = (_HYComponent*)components(i);
                if ((thisC->hScroll==sW)||(thisC->vScroll==sW)) {
                    return thisC->_ProcessOSEvent (vEvent);
                }
            }
        }
        return true;
    }

    case WM_LBUTTONDOWN:
    case WM_LBUTTONDBLCLK:
    case WM_RBUTTONDBLCLK:
    case WM_LBUTTONUP:
    case WM_RBUTTONDOWN:
    case WM_RBUTTONUP:
    case 0x020A:
        if (trackMouseComponent) {
            return ((_HYComponent*)trackMouseComponent)->_ProcessOSEvent (vEvent);
        }
        if (theEvent->iMsg == 0x020A) {
            localPoint = (POINT) {
                LOWORD(theEvent->lParam),HIWORD(theEvent->lParam)
            };
            ScreenToClient (theWindow, &localPoint);
            c = FindClickedCell(localPoint.x, localPoint.y);
            if (c<0) {
                return false;
            }
            DoMouseWheel (c, ((signed short)HIWORD(theEvent->wParam))/120);
            return true;
        }
        c = FindClickedCell(LOWORD(theEvent->lParam),HIWORD(theEvent->lParam));
        if (c<0) {
            return false;
        }
        return ((_HYComponent*)components(c))->_ProcessOSEvent (vEvent);
        break;


    case WM_GETMINMAXINFO:

        windowInfo = (MINMAXINFO*)theEvent->lParam;

        if ((hWindowPad==0)&&(vWindowPad==0))
            if (!IsIconic (theWindow)) {
                GetClientRect (theWindow,&smallR);
                ::GetWindowRect (theWindow,&bigR);
                hWindowPad = bigR.right-bigR.left-smallR.right-1;
                vWindowPad = bigR.bottom-bigR.top-smallR.bottom-1;
            }

        windowInfo->ptMinTrackSize.x = dim.left+hWindowPad-1;
        windowInfo->ptMinTrackSize.y = dim.top+vWindowPad-1;
        windowInfo->ptMaxSize.x=windowInfo->ptMaxTrackSize.x = dim.right+hWindowPad;
        windowInfo->ptMaxSize.y=windowInfo->ptMaxTrackSize.y = dim.bottom+vWindowPad;

        return false;
        break;

        /*case WM_DESTROY:
        {
            KillTimer (theWindow,idleTimer);
            break;
        }*/

    case WM_CHAR:
    case WM_KEYDOWN: {
        if (keyboardFocusChain.lLength) {
            int keyCode = theEvent->wParam;
            if (keyCode == VK_TAB) { // tab
                bool    backwards = (GetAsyncKeyState (VK_SHIFT) & 0x8000);

                if (keyboardFocus==-1) {
                    keyCode = keyboardFocusChain.lData[backwards?keyboardFocusChain.lLength-1:0];
                } else if (keyboardFocusChain.lLength>1) {
                    keyCode = keyboardFocusChain.Find (keyboardFocus);
                    keyCode += backwards?(-1):1;
                    if (keyCode<0) {
                        keyCode = keyboardFocusChain.lLength-1;
                    } else if (keyCode >= keyboardFocusChain.lLength) {
                        keyCode = 0;
                    }
                    keyCode = keyboardFocusChain.lData[keyCode];
                } else {
                    keyCode = -1;
                }

                if (keyCode>=0) {
                    ProcessEvent (generateKeyboardFocusEvent (((_HYComponent*)components(keyCode))->GetID()));
                }
                return true;
            }
        }

        for (long k=0; k<components.lLength; k++)
            if (cells.Find(k)>=0) {
                _HYComponent* tC = (_HYComponent*)components(k);
                if (tC->UnfocusedKeyboardInput())
                    if (tC->_ProcessOSEvent (vEvent)) {
                        return true;
                    }
            }

        if ((keyboardFocus>=0)&&(keyboardFocus<components.lLength)) {
            if (((_HYComponent*)components(keyboardFocus))->_ProcessOSEvent (vEvent)) {
                return true;
            }
        }

        return false;
    }


    case WM_MOUSEMOVE: {
        if (trackMouseComponent) {
            return ((_HYComponent*)trackMouseComponent)->_ProcessOSEvent (vEvent);
        }

        int c = FindClickedCell(LOWORD(theEvent->lParam),HIWORD(theEvent->lParam));
        if (c<0) {
            if (lastMouseComponent>=0) {
                ((_HYComponent*)components(lastMouseComponent))->_ComponentMouseExit();
            }
            lastMouseComponent = -1;
            return false;
        } else {
            if (lastMouseComponent>=0) {
                if (c!=lastMouseComponent) {
                    ((_HYComponent*)components(lastMouseComponent))->_ComponentMouseExit();
                }
            } else {
                SetCursor (LoadCursor (nil, IDC_ARROW));
            }

            lastMouseComponent = c;
            return ((_HYComponent*)components(c))->_ProcessOSEvent (vEvent);
        }
        break;
    }

    case WM_NCMOUSEMOVE: {
        if (lastMouseComponent>=0) {
            ((_HYComponent*)components(lastMouseComponent))->_ComponentMouseExit();
        }
        lastMouseComponent = -1;
        return false;
    }

    case WM_ACTIVATE: {
        if (LOWORD(theEvent->wParam)!=WA_INACTIVE) {
            _Activate2();
        } else {
            _Deactivate2();
        }

        return true;
    }

    default: {
        //printf ("%x %x %x\n", theEvent->iMsg, theEvent->wParam, theEvent->lParam);
        for (int i=0; i<components.lLength; i++) {
            _HYComponent *thisC = (_HYComponent*)components(i);
            if (thisC->_ProcessOSEvent (vEvent)) {
                return true;
            }
        }
    }
    }
    return _HYPlatformWindow::_ProcessOSEvent (vEvent);
}

//__________________________________________________________________

void        _HYTWindow::_SetCopyString (_String* str)
{
    EmptyClipboard();

    HGLOBAL          cHandle = GlobalAlloc (GHND, str->sLength+1);
    checkPointer     (cHandle);
    LPVOID           cPtr = GlobalLock (cHandle);
    CopyMemory       (cPtr, str->sData, str->sLength+1);
    GlobalUnlock     (cHandle);

    SetClipboardData (CF_TEXT, cHandle);
    CloseClipboard();
}

//__________________________________________________________________

_String*        _HYTWindow::_GetPasteString (void)
{
    _String *res = nil;

    OpenClipboard  (theWindow);

    if (IsClipboardFormatAvailable (CF_TEXT)) {
        HANDLE           cHandle = GetClipboardData (CF_TEXT);
        LPVOID           cPtr = GlobalLock (cHandle);
        res = new _String((unsigned long)GlobalSize (cHandle)-1, false);
        checkPointer     (res);
        CopyMemory       (res->sData, cPtr, res->sLength+1);
        GlobalUnlock     (cHandle);
    }
    return res;
}

//__________________________________________________________________

void _HYTWindow::_Activate(void)
{
    for (int i=0; i<components.lLength; i++)
        if (cells.Find(i)>=0) {
            ((_HYComponent*)components(i))->Activate();
        }


    idleTimer = SetTimer (theWindow, IDLE_WINDOW_TIMER , 500,(TIMERPROC) IdleWindowTimer);
    _HYPlatformWindow::_Activate();

    if (keyboardFocus>=0) {
        ((_HYComponent*)components(keyboardFocus))->FocusComponent();
    }
}

//__________________________________________________________________

void _HYTWindow::_Activate2(void)
{
    //ReportWarning (_String ("Activated ") & (long)GetID());
    for (int i=0; i<components.lLength; i++)
        if (cells.Find(i)>=0) {
            //ReportWarning (_String ("Activated Component") & (long)i);
            ((_HYComponent*)components(i))->Activate();
        }


    idleTimer = SetTimer (theWindow, IDLE_WINDOW_TIMER , 500,(TIMERPROC) IdleWindowTimer);
    if (keyboardFocus>=0) {
        ((_HYComponent*)components(keyboardFocus))->FocusComponent();
    }
}

//__________________________________________________________________

void _HYTWindow::_Deactivate2(void)
{
    //ReportWarning (_String ("Deactivated ") &  (long)GetID());
    for (int i=0; i<components.lLength; i++)
        if (cells.Find(i)>=0) {
            ((_HYComponent*)components(i))->Deactivate();
        }

    KillTimer (theWindow,idleTimer);
}

//__________________________________________________________________

void _HYTWindow::_Deactivate(void)
{
    _Deactivate2 ();
    _HYPlatformWindow::_Deactivate();
}


//__________________________________________________________________


bool        _HYTWindow::_ProcessMenuSelection (long msel)
{
    bool done = false;

    if (_HYWindow::_ProcessMenuSelection(msel)) {
        return true;
    }

    switch (msel) {
    case HY_WINDOW_MENU_ID_EDIT+1:
        HandleCopyPaste(0);
        done = true;
        break;
    case HY_WINDOW_MENU_ID_EDIT+3:
        HandleCopyPaste(1);
        done = true;
        break;
    }

    return done;
}

//__________________________________________________________________

void _HYTWindow::_Zoom(bool inOut)
{
}


//__________________________________________________________________
void        _HYPlatformTWindow::_SetWindowRectangle     (int,int,int,int,bool)
{

}



//EOF
\ No newline at end of file
diff --git a/src/gui/win/WindowClasses/HYPlatformTreePanel.cpp b/src/gui/win/WindowClasses/HYPlatformTreePanel.cpp
new file mode 100644
index 0000000..e88f538
--- /dev/null
+++ b/src/gui/win/WindowClasses/HYPlatformTreePanel.cpp
@@ -0,0 +1,1328 @@
+/*
+    Tree  Panel Object  for Win32 API
+
+    Sergei L. Kosakovsky Pond, June 2000-January 2003
+*/
+
+#include "HYTreePanel.h"
+#include "HYUtils.h"
+
+_String     saveForTreesPrompt ("Save Tree As:");
+
+HPEN        navPen = CreatePen (PS_SOLID,2,RGB(255,151,51));
+
+#define     HY_TREE_WIN32_MENU_BASE  7000
+
+//__________________________________________________________________
+
+bool _HYTreePanel::_ProcessOSEvent (Ptr vEvent)
+{
+    static  char draggin = 0;
+    _HYWindowsUIMessage *theEvent = (_HYWindowsUIMessage*)vEvent;
+    if (theEvent->iMsg==WM_RBUTTONDOWN) {
+        if (FindClickedCell(LOWORD(theEvent->lParam),HIWORD(theEvent->lParam)) == 0) {
+            HandleContextPopup(LOWORD(theEvent->lParam),HIWORD(theEvent->lParam));
+            return true;
+        }
+    }
+    if(!_HYTWindow::_ProcessOSEvent (vEvent)) {
+        if ((theEvent->iMsg==WM_LBUTTONDOWN)||(theEvent->iMsg==WM_LBUTTONDBLCLK)) {
+            int ch = LOWORD(theEvent->lParam),cv = HIWORD(theEvent->lParam),c;
+            c = FindClickedCell(ch,cv);
+            if (c<0) {
+                return false;
+            }
+            _HYComponent* thisComponent = (_HYComponent*)components(c);
+            if (c==1) { // navBar
+
+                ch -= componentL.lData[1];
+                cv -= componentT.lData[1];
+                if (navRect.Contains(ch,cv)) {
+                    draggin = 1;
+                } else {
+                    SetNavRectCenter (ch,cv);
+                }
+                return true;
+            } else if (c==0) {
+                ch -= componentL.lData[0];
+                cv -= componentT.lData[0];
+                char shiftFlag = 0;
+
+                if (theEvent->wParam&MK_SHIFT) {
+                    shiftFlag |= 0x01;
+                }
+                if (theEvent->wParam&MK_CONTROL) {
+                    shiftFlag |= 0x02;
+                }
+
+                if (shiftFlag > 2) {
+                    draggin = 2;
+                    theEvent->iMsg = WM_MOUSEMOVE;
+                } else {
+                    if (IsVertical()) {
+                        c = ch;
+                        ch = cv+thisComponent->vOrigin;
+                        cv = c+thisComponent->hOrigin;
+                    } else {
+                        ch+=thisComponent->hOrigin;
+                        cv+=thisComponent->vOrigin;
+                    }
+
+                    if ((theEvent->iMsg==WM_LBUTTONDBLCLK)&&(currentSelection.lLength)) {
+                        InvokeNodeEditor();
+                        return true;
+                    }
+
+                    if(FindSelection (ch,cv,shiftFlag)) {
+                        _UpdateOperationsMenu();
+                        RenderTree();
+                    }
+                }
+            }
+        }
+
+        if (theEvent->iMsg==WM_LBUTTONUP) {
+            draggin = 0;
+            return true;
+        } else if (theEvent->iMsg==WM_MOUSEMOVE) {
+            if (draggin == 1) {
+                int ch = LOWORD(theEvent->lParam)-componentL.lData[1],
+                    cv = HIWORD(theEvent->lParam)-componentT.lData[1];
+                SetNavRectCenter (ch,cv);
+            } else {
+                if (draggin == 2) {
+                    _HYCanvas   *theTree    = (_HYCanvas*)GetObject (0);
+
+                    int ch = LOWORD(theEvent->lParam),
+                        cv = HIWORD(theEvent->lParam);
+
+                    if (IsVertical()) {
+                        cv = cv-componentL.lData[0]+theTree->hOrigin;
+                        ch = ch-componentT.lData[0]+theTree->vOrigin;
+                    } else {
+                        ch = ch-componentL.lData[0]+theTree->hOrigin;
+                        cv = cv-componentT.lData[0]+theTree->vOrigin;
+                    }
+                    if ((ch<theTree->_HYComponent::GetMaxW())&&(cv<theTree->_HYComponent::GetMaxH())) {
+                        FishEyeProjection (ch,theTree->_HYComponent::GetMaxH()-cv,theTree->_HYComponent::GetMaxW(),
+                                           theTree->_HYComponent::GetMaxH(),coordTree);
+                        treeFlags |= HY_TREEPANEL_PROJECTION;
+                        RenderTree(false);
+                    }
+                }
+            }
+            return true;
+        } else {
+            if (theEvent->iMsg==WM_CHAR) {
+                TCHAR  theC = (TCHAR)theEvent->wParam;
+                //printf ("%x\n", theC);
+                if (theC == VK_BACK) {
+                    DeleteCurrentSelection();
+                    _UpdateOperationsMenu();
+                    return true;
+                } else if (theC == VK_RETURN) {
+                    InvokeNodeEditor ();
+                    _UpdateOperationsMenu();
+                    return true;
+                }
+            }
+        }
+        return false;
+    }
+}
+//__________________________________________________________________
+
+
+bool        _HYTreePanel::_ProcessMenuSelection (long msel)
+{
+    if (_HYWindow::_ProcessMenuSelection(msel)) {
+        return true;
+    }
+
+    switch (msel) {
+
+    case HY_WINDOW_MENU_ID_FILE+1: { // Save tree
+        _String           filePath,
+                          dtreeName = treeName,
+                          ext;
+
+        bool              good = false;
+
+        _List             treeFormats;
+
+        long pidOptions = GetUniversalSaveOptions (treeFormats);
+
+        ext = "Bitmap (.BMP)";
+        treeFormats && & ext;
+        ext = "Graphical Metafile (.EMF)";
+        treeFormats && & ext;
+
+        long              menuChoice = SaveFileWithPopUp (filePath, saveForTreesPrompt,dtreeName,
+                                       empty,
+                                       treeFormats);
+        if (menuChoice>=0) {
+            _HYCanvas   *theTree = (_HYCanvas*)GetObject (0);
+
+            if (menuChoice == pidOptions+1) {
+                HDC         mfDC = CreateEnhMetaFile (GetDC(NULL),filePath.getStr(),NULL,NULL), saveDC = theTree->thePane;
+                if (!mfDC) {
+                    _String errMsg ("Could not create meta file device context. Windows Error:");
+                    errMsg = errMsg & _String ((long)GetLastError());
+                    WarnError (errMsg);
+                    return true;
+                }
+                theTree->thePane = mfDC;
+                RenderTree (true, true);
+                theTree->thePane = saveDC;
+                DeleteEnhMetaFile(CloseEnhMetaFile (mfDC));
+            } else if (menuChoice == pidOptions) {
+                HBITMAP hBmp = (HBITMAP)GetCurrentObject (theTree->thePane,OBJ_BITMAP);
+                BITMAP bmp;
+                PBITMAPINFO pbmi;
+                long    rowWidth;
+                bool    good = true, ruler = (!IsVertical())&&(scaleVariable.sLength);
+                if (!::GetObject(hBmp, sizeof(BITMAP), (LPSTR)&bmp)) {
+                    good = false;
+                } else {
+
+                    pbmi = (PBITMAPINFO) LocalAlloc(LPTR,sizeof(BITMAPINFOHEADER)+sizeof(RGBQUAD) * 2);
+                    pbmi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
+                    pbmi->bmiHeader.biWidth = bmp.bmWidth;
+                    pbmi->bmiHeader.biHeight = bmp.bmHeight;
+                    pbmi->bmiHeader.biPlanes = 1;
+                    pbmi->bmiHeader.biBitCount = 1;
+                    pbmi->bmiHeader.biClrUsed = 0;
+                    pbmi->bmiHeader.biCompression = BI_RGB;
+                    pbmi->bmiHeader.biSizeImage = (pbmi->bmiHeader.biWidth + 7) /8;
+                    if ( pbmi->bmiHeader.biSizeImage%4) {
+                        pbmi->bmiHeader.biSizeImage = (pbmi->bmiHeader.biSizeImage/4+1)*4;
+                    }
+                    rowWidth = pbmi->bmiHeader.biSizeImage;
+                    pbmi->bmiHeader.biSizeImage*=pbmi->bmiHeader.biHeight;
+                    pbmi->bmiHeader.biClrImportant = 0;
+                    pbmi->bmiHeader.biXPelsPerMeter = 0x0EC4;
+                    pbmi->bmiHeader.biYPelsPerMeter = 0x0EC4;
+                    RGBQUAD     t = {0,0,0,0};
+                    pbmi->bmiColors[0] = t;
+                    t.rgbRed = t.rgbGreen = t.rgbBlue = 255;
+                    pbmi->bmiColors[1] = t;
+
+                    HANDLE hf;                 // file handle
+                    BITMAPFILEHEADER hdr;       // bitmap file-header
+                    PBITMAPINFOHEADER pbih;     // bitmap info-header
+                    LPBYTE lpBits;
+                    // memory pointer
+                    DWORD dwTotal;              // total count of bytes
+                    DWORD cb;                   // incremental count of bytes
+                    BYTE *hp;                   // byte pointer
+                    DWORD dwTmp;
+
+                    pbih = (PBITMAPINFOHEADER) pbmi;
+                    lpBits = (LPBYTE) GlobalAlloc(GMEM_FIXED, pbih->biSizeImage);
+
+                    if (!lpBits) {
+                        good = false;
+                    } else if (!GetDIBits(theTree->thePane, hBmp, 0, (WORD) bmp.bmHeight, lpBits, pbmi,DIB_RGB_COLORS)) {
+                        good = false;
+                        //printf ("\nStage 3 Error:%d\n",GetLastError());
+                    } else {
+                        hf = CreateFile(filePath.getStr(),
+                                        GENERIC_READ | GENERIC_WRITE,
+                                        (DWORD) 0,
+                                        NULL,
+                                        CREATE_ALWAYS,
+                                        FILE_ATTRIBUTE_NORMAL,
+                                        (HANDLE) NULL);
+                        if (hf == INVALID_HANDLE_VALUE) {
+                            good = false;
+                        } else {
+                            hdr.bfType = 0x4d42;
+                            if (ruler)
+                                hdr.bfSize = (DWORD) (sizeof(BITMAPFILEHEADER) + pbih->biSize + 2 * sizeof(RGBQUAD) +
+                                                      (pbih->biSizeImage/pbmi->bmiHeader.biHeight)*(pbmi->bmiHeader.biHeight+HY_TREEPANEL_RULER_EXPANDED));
+                            else {
+                                hdr.bfSize = (DWORD) (sizeof(BITMAPFILEHEADER) + pbih->biSize + 2 * sizeof(RGBQUAD) + pbih->biSizeImage);
+                            }
+                            hdr.bfReserved1 = 0;
+                            hdr.bfReserved2 = 0;
+
+                            hdr.bfOffBits = (DWORD) (sizeof(BITMAPFILEHEADER) +
+                                                     pbih->biSize + 2 * sizeof (RGBQUAD));
+
+                            if (WriteFile(hf, (LPVOID) &hdr, sizeof(BITMAPFILEHEADER),
+                                          (LPDWORD) &dwTmp,  NULL)) {
+                                DWORD oldImSize = pbih->biSizeImage;
+                                if (ruler) {
+                                    pbih->biHeight+=HY_TREEPANEL_RULER_EXPANDED;
+                                    pbih->biSizeImage=(pbih->biSizeImage/pbmi->bmiHeader.biHeight)*(pbmi->bmiHeader.biHeight+HY_TREEPANEL_RULER_EXPANDED);
+                                }
+                                if (WriteFile(hf, (LPVOID) pbih, sizeof(BITMAPINFOHEADER)
+                                              + 2 * sizeof (RGBQUAD),
+                                              (LPDWORD) &dwTmp, ( NULL))) {
+                                    dwTotal = cb = oldImSize;
+                                    hp = lpBits;
+                                    WriteFile(hf, (LPSTR) hp, (int) cb, (LPDWORD) &dwTmp,NULL);
+
+                                }
+                            }
+                        }
+                    }
+                    if (ruler) {
+
+                        _HYCanvas   *theRuler = (_HYCanvas*)GetObject (2);
+                        hBmp = (HBITMAP)GetCurrentObject (theRuler->thePane,OBJ_BITMAP);
+                        if (::GetObject(hBmp, sizeof(BITMAP), (LPSTR)&bmp)) {
+                            pbmi->bmiHeader.biHeight = bmp.bmHeight;
+                            pbmi->bmiHeader.biSizeImage = (pbmi->bmiHeader.biWidth + 7) /8;
+                            if ( pbmi->bmiHeader.biSizeImage%4) {
+                                pbmi->bmiHeader.biSizeImage = (pbmi->bmiHeader.biSizeImage/4+1)*4;
+                            }
+                            pbmi->bmiHeader.biSizeImage *= bmp.bmHeight;
+                            if (!GetDIBits(theRuler->thePane, hBmp, 0, (WORD) bmp.bmHeight, lpBits, pbmi,DIB_RGB_COLORS)) {
+                                good = false;
+                                //printf ("\nStage 3 Error:%d\n",GetLastError());
+                            } else {
+                                dwTotal = cb = pbmi->bmiHeader.biSizeImage;
+                                hp = lpBits;
+                                WriteFile(hf, (LPSTR) hp, (int) cb, (LPDWORD) &dwTmp,NULL);
+                            }
+                        } else {
+                            good = false;
+                        }
+                    }
+                    CloseHandle(hf);
+                    GlobalFree((HGLOBAL)lpBits);
+                    LocalFree (pbmi);
+                }
+                if (!good) {
+                    _String errMsg = "Couldn't create/write .bmp file";
+                    WarnError (errMsg);
+                }
+            } else {
+                HandleTreeSave (menuChoice, filePath);
+
+                /*FILE* theFile = fopen (filePath.sData,"w");
+                if (theFile)
+                {
+                    _String res = GetTreeString();
+                    fwrite (res.sData,1,res.sLength,theFile);
+                    fclose (theFile);
+                }
+                else
+                {
+                    filePath = "Error creating tree file";
+                    WarnError (filePath);
+                }*/
+            }
+        }
+        return true;
+    }
+    break;
+    case HY_WINDOW_MENU_ID_FILE+2: {
+        _PrintTree();
+        break;
+    }
+
+    case HY_WINDOW_MENU_ID_EDIT:   // Undo
+        UndoLastOperation();
+        break;
+
+    case HY_WINDOW_MENU_ID_EDIT+1: { // COPY
+        if (treeFlags&HY_TREEPANEL_CLIPBOARD_READY) {
+            CutSelectionToClipboard (false);
+        } else {
+            _HYCanvas   *theTree = (_HYCanvas*)GetObject (0);
+            bool ruler = (!IsVertical())&&(scaleVariable.sLength);
+            if (ruler) {
+                _HYCanvas   *theRuler = (_HYCanvas*)GetObject (2);
+
+            } else {
+                PlaceBitmapInClipboard ((HBITMAP)GetCurrentObject (theTree->thePane,OBJ_BITMAP),theWindow);
+            }
+        }
+        break;
+    }
+
+    case HY_WINDOW_MENU_ID_EDIT+2:   // Cut
+        CutSelectionToClipboard ();
+        break;
+
+    case HY_WINDOW_MENU_ID_EDIT+3:   // Paste
+        PasteClipboardTree();
+        break;
+
+    case HY_WINDOW_MENU_ID_EDIT+4:   // Delete
+        DeleteCurrentSelection();
+        break;
+
+    case HY_WINDOW_MENU_ID_EDIT+5:   // Select All
+        SelectAllBranches();
+        break;
+
+    case HY_WINDOW_MENU_ID_EDIT+6:   // S & R
+        HandleSearchAndReplace(false);
+        break;
+
+    case HY_WINDOW_MENU_ID_EDIT+7:   // S & R
+        HandleSearchAndReplace(true);
+        break;
+
+    case HY_TREE_WIN32_MENU_BASE: {
+        unsigned short newF;
+        if (treeFlags&HY_TREEPANEL_TIP_LABELS) {
+            newF = treeFlags - HY_TREEPANEL_TIP_LABELS;
+            SetFlags (newF);
+        } else {
+            newF = treeFlags + HY_TREEPANEL_TIP_LABELS;
+            SetFlags (newF);
+        }
+        CheckMenuItem (GetSubMenu(windowMenu,2),0,MF_BYPOSITION|((treeFlags&HY_TREEPANEL_TIP_LABELS)?MF_CHECKED:MF_UNCHECKED));
+        break;
+    }
+
+    case HY_TREE_WIN32_MENU_BASE+1: {
+        unsigned short newF;
+        if (treeFlags&HY_TREEPANEL_INT_LABELS) {
+            newF = treeFlags - HY_TREEPANEL_INT_LABELS;
+            SetFlags (newF);
+        } else {
+            newF = treeFlags + HY_TREEPANEL_INT_LABELS;
+            SetFlags (newF);
+        }
+        CheckMenuItem (GetSubMenu(windowMenu,2),1,MF_BYPOSITION|((treeFlags&HY_TREEPANEL_INT_LABELS)?MF_CHECKED:MF_UNCHECKED));
+        break;
+    }
+
+    case HY_TREE_WIN32_MENU_BASE+2: {
+        SwapSelectedSubTrees ();
+        break;
+    }
+
+    case HY_TREE_WIN32_MENU_BASE+3: {
+        CollapseSelectedBranch ();
+        break;
+    }
+
+    case HY_TREE_WIN32_MENU_BASE+4: {
+        JoinSelectedBranches ();
+        break;
+    }
+
+    case HY_TREE_WIN32_MENU_BASE+5: {
+        GraftATip ();
+        break;
+    }
+
+    case HY_TREE_WIN32_MENU_BASE+6: {
+        RerootTree ();
+        break;
+    }
+
+    case HY_TREE_WIN32_MENU_BASE+7: {
+        FlipSelectedBranches ();
+        break;
+    }
+
+    case HY_TREE_WIN32_MENU_BASE+8:
+    case HY_TREE_WIN32_MENU_BASE+9:
+    case HY_TREE_WIN32_MENU_BASE+10: {
+        HandleSelection (msel-HY_TREE_WIN32_MENU_BASE-8);
+        break;
+    }
+
+    case HY_TREE_WIN32_MENU_BASE+17:
+    case HY_TREE_WIN32_MENU_BASE+18: {
+        HandleSelection (msel-HY_TREE_WIN32_MENU_BASE-14);
+        break;
+    }
+
+    case HY_TREE_WIN32_MENU_BASE+30:
+    case HY_TREE_WIN32_MENU_BASE+31:
+    case HY_TREE_WIN32_MENU_BASE+32: {
+        HandleSelection (msel-HY_TREE_WIN32_MENU_BASE-25);
+        break;
+    }
+
+    case HY_TREE_WIN32_MENU_BASE+11: {
+        InvokeNodeEditor ();
+        break;
+    }
+
+    case HY_TREE_WIN32_MENU_BASE+12: {
+        RecalculateLikelihood ();
+        break;
+    }
+
+    case HY_TREE_WIN32_MENU_BASE+13: {
+        DisplayParameterTable();
+        break;
+    }
+
+    case HY_TREE_WIN32_MENU_BASE+14: {
+        HandleViewOptions ();
+        break;
+    }
+
+    case HY_TREE_WIN32_MENU_BASE+15:
+    case HY_TREE_WIN32_MENU_BASE+16: {
+        ShowModelMatrix (msel-HY_TREE_WIN32_MENU_BASE-15);
+        break;
+    }
+
+    case HY_TREE_WIN32_MENU_BASE+19:
+    case HY_TREE_WIN32_MENU_BASE+20: {
+        GenerateDistanceTable (msel-HY_TREE_WIN32_MENU_BASE-19);
+        break;
+    }
+
+    case HY_TREE_WIN32_MENU_BASE+24:
+    case HY_TREE_WIN32_MENU_BASE+25: {
+        HandleLabels(msel-HY_TREE_WIN32_MENU_BASE-24);
+        break;
+    }
+
+    case HY_TREE_WIN32_MENU_BASE+35:
+    case HY_TREE_WIN32_MENU_BASE+36:
+    case HY_TREE_WIN32_MENU_BASE+37:
+    case HY_TREE_WIN32_MENU_BASE+38:
+    case HY_TREE_WIN32_MENU_BASE+39: {
+        HandleComparison (msel-HY_TREE_WIN32_MENU_BASE-35);
+        _UpdateOperationsMenu();
+        break;
+    }
+
+    case HY_TREE_WIN32_MENU_BASE+40:
+    case HY_TREE_WIN32_MENU_BASE+41: {
+        HandleSelection(msel-HY_TREE_WIN32_MENU_BASE-33);
+        break;
+    }
+
+    default: { // proc menu
+        if (msel>=HY_TREE_WIN32_MENU_BASE+1000) {
+            ExecuteProcessor (msel-HY_TREE_WIN32_MENU_BASE-1000);
+            _UpdateOperationsMenu();
+            return true;
+        }
+    }
+    }
+
+    if (((msel>=HY_TREE_WIN32_MENU_BASE)&&(msel<HY_TREE_WIN32_MENU_BASE+12))||
+            ((msel>=HY_WINDOW_MENU_ID_EDIT)&&(msel<HY_WINDOW_MENU_ID_EDIT+6))) {
+        _UpdateOperationsMenu();
+    }
+
+    DrawMenuBar(theWindow);
+    return true;
+}
+
+
+
+//__________________________________________________________________
+
+void        _HYTreePanel::_PaintNavRect(void)
+{
+    navRect = ComputeNavRect();
+    _HYCanvas* theCanvas = (_HYCanvas*)GetCellObject (0,0);
+    HDC      theContext = GetDC(theWindow);
+    RECT r;
+    HPEN     savePen = (HPEN)SelectObject (theContext,navPen);
+    r.left = navRect.left+theCanvas->rel.left+HY_TREEPANEL_NAVSPACING;
+    r.right = navRect.right+theCanvas->rel.left;
+    r.top = navRect.top+theCanvas->rel.top+HY_TREEPANEL_NAVSPACING;
+    r.bottom = navRect.bottom+theCanvas->rel.top;
+    MoveToEx (theContext,r.left,r.top,NULL);
+    LineTo(theContext,r.right,r.top);
+    LineTo(theContext,r.right,r.bottom);
+    LineTo(theContext,r.left,r.bottom);
+    LineTo(theContext,r.left,r.top);
+    SelectObject (theContext,savePen);
+    _PaintLFStatus ((Ptr)theContext);
+    ReleaseDC (theWindow, theContext);
+    //printf ("\nPaintNavRect");
+}
+
+//__________________________________________________________________
+
+void        _HYTreePanel::_PrintTree(long hPages, long vPages)
+{
+    if ((hPages<0)||(vPages<0)) {
+        if (!TreePrintSetup (hPages, vPages, (Ptr)this)) {
+            return;
+        }
+    }
+
+    _HYCanvas* theCanvas = (_HYCanvas*)GetObject (0);
+    _HYCanvas* theRuler =  (_HYCanvas*)GetObject (2);
+
+    static DOCINFO  di = {sizeof(DOCINFO), "HYPHY.out", NULL };
+    static PRINTDLG pd;
+    BOOL            SuccessFlag;
+
+    pd.lStructSize         = sizeof(PRINTDLG);
+    pd.hwndOwner           = theWindow;
+    pd.hDevMode            = NULL;
+    pd.hDevNames           = NULL;
+    pd.hDC                 = NULL;
+    pd.Flags               = PD_ALLPAGES | PD_COLLATE | PD_RETURNDC | PD_NOSELECTION;
+    pd.nFromPage           = 1;
+    pd.nToPage             = 0xffff;
+    pd.nMinPage            = 1;
+    pd.nMaxPage            = 0xffff;
+    pd.nCopies             = 1;
+    pd.hInstance           = NULL;
+    pd.lCustData           = 0L;
+    pd.lpfnPrintHook       = NULL;
+    pd.lpfnSetupHook       = NULL;
+    pd.lpPrintTemplateName = NULL;
+    pd.lpSetupTemplateName = NULL;
+    pd.hPrintTemplate      = NULL;
+    pd.hSetupTemplate      = NULL;
+
+    if (!PrintDlg(&pd)) {
+        return;
+    }
+
+    if (pd.hDC == NULL) {
+        pd.hDC = GetPrinterDeviceContext(theWindow);
+    }
+
+
+    EnableWindow(theWindow, FALSE);
+
+    SuccessFlag   = TRUE;
+    UserAbortFlag = FALSE;
+
+    PrintDialogHandle = CreateDialog(GetModuleHandle(NULL), (LPCTSTR)"PrintDlgBox", theWindow,
+                                     PrintDialogProc);
+    SetDlgItemText(PrintDialogHandle, IDD_FNAME, treeName.getStr());
+
+    SetAbortProc(pd.hDC, AbortProc);
+
+    if (StartDoc(pd.hDC, &di) > 0) {
+
+        HDC         saveDC1 = theCanvas->thePane,
+                    saveDC2 = theRuler->thePane;
+
+
+        long    pageW = GetDeviceCaps(pd.hDC, HORZRES),
+                pageH = GetDeviceCaps(pd.hDC, VERTRES),
+                hRes = GetDeviceCaps(pd.hDC, LOGPIXELSX),
+                vRes = GetDeviceCaps(pd.hDC, LOGPIXELSY),
+                screenHRes = GetDeviceCaps(saveDC1, LOGPIXELSX),
+                screenVRes = GetDeviceCaps(saveDC1, LOGPIXELSY),
+                visW = theCanvas->_HYComponent::GetMaxW(),
+                visH = theCanvas->_HYComponent::GetMaxH(),
+                printW  = pageW * hPages,
+                printH  = pageH * vPages;
+
+
+        bool    hasRuler = (scaleVariable.sLength)&&(!IsVertical());
+
+        _HYFont oldFont  = treeLabelFont;
+
+        _Parameter  hsc = 1.0,
+                    vsc = 1.0,
+                    xResC = (_Parameter)screenHRes/hRes,
+                    yResC = (_Parameter)screenVRes/vRes;
+
+        if (hPages <= 0) {
+            hPages = visW/(pageW*xResC)+1;
+            printW= pageW * hPages;
+        }
+
+        if (vPages <= 0) {
+            vPages = visH/(pageH*yResC)+1;
+            printH = pageH * vPages;
+        }
+
+        hRes = printW*xResC;
+        vRes = printH*yResC;
+
+        screenHRes = printW;
+        screenVRes = printH;
+
+        printW = hRes;
+        printH = vRes;
+
+
+        if (visW>printW) {
+            hsc = (_Parameter)printW/visW;
+        }
+
+        if (hasRuler) {
+            printH -= HY_TREEPANEL_RULER_EXPANDED;
+        }
+
+        if (visH>printH) {
+            vsc = (_Parameter)printH/visH;
+        }
+
+        _HYFont     bf1 = branchLabel1,
+                    bf2 = branchLabel2;
+
+        if ((hsc<1.0)||(vsc<1.0)) {
+            treeLabelFont.size = ((_Parameter)treeLabelFont.size)*MIN(hsc,vsc);
+            bf1.size = ((_Parameter)bf1.size)*MIN(hsc,vsc);
+            bf2.size = ((_Parameter)bf2.size)*MIN(hsc,vsc);
+            ShiftScreenCoordinates  (-windowTextMarginH,-windowTextMarginV,coordTree);
+            Convert2ScreenCoordinates (hsc,vsc,0,coordTree);
+        }
+
+        theCanvas->thePane = pd.hDC;
+        theRuler->thePane  = pd.hDC;
+
+        theCanvas->lastPenSize = 2;
+
+        if (visW<printW) {
+            visW = (printW-visW)/2;
+        } else {
+            visW = 0;
+        }
+        if (visH<printH) {
+            visH = (printH-visH)/2;
+        } else {
+            visH = 0;
+        }
+
+        if (IsVertical()) {
+            long t = visH;
+            visH = visW;
+            visW = t;
+        }
+
+        for (long hCount = 0; hCount < hPages; hCount ++)
+            for (long vCount = 0; vCount < vPages; vCount ++) {
+                if (StartPage(pd.hDC) < 0) {
+                    SuccessFlag = FALSE;
+                } else {
+                    theCanvas->SetColor(theCanvas->color);
+                    /*if (visH||visW)
+                    {
+                        ShiftScreenCoordinates  (visW,hasRuler?visH+HY_TREEPANEL_RULER_EXPANDED/2:visH,coordTree);
+                    }
+                    else
+                        if (hasRuler)
+                            ShiftScreenCoordinates  (0,HY_TREEPANEL_RULER_EXPANDED/2,coordTree);
+                    if (hasRuler)
+                    {
+                        RenderRuler (hsc,true,visW,visH-HY_TREEPANEL_RULER_EXPANDED/2);
+                    }
+
+                    if (visH||visW)
+                    {
+                        ShiftScreenCoordinates  (-visW,hasRuler?-visH-HY_TREEPANEL_RULER_EXPANDED/2:-visH,coordTree);
+                    }
+                    else
+                        if (hasRuler)
+                            ShiftScreenCoordinates  (0,-HY_TREEPANEL_RULER_EXPANDED/2,coordTree);*/
+
+
+                    SetMapMode  (pd.hDC, MM_ISOTROPIC);
+                    SetWindowExtEx (pd.hDC, hRes, vRes,nil);
+                    SetViewportExtEx (pd.hDC, screenHRes, screenVRes, nil);
+
+                    //printf ("\n%d %d %d %d %d %d\n", hsc, vsc, hRes, vRes, screenHRes, screenVRes);
+
+                    if (visH||visW) {
+                        ShiftScreenCoordinates  (visW,hasRuler?visH+HY_TREEPANEL_RULER_EXPANDED-5:visH,coordTree);
+                    } else if (hasRuler&&(vCount==0)) {
+                        ShiftScreenCoordinates  (0,HY_TREEPANEL_RULER_EXPANDED-5,coordTree);
+                    }
+
+                    if (hCount||vCount) {
+                        ShiftScreenCoordinates  (-pageW*xResC*hCount,-pageH*yResC*vCount, coordTree);
+                    }
+
+
+                    if (hasRuler && (vCount == 0)) {
+                        RenderRuler (hsc,true,visW,visH);
+                    }
+
+                    theCanvas->SetFont (treeLabelFont);
+
+                    if (treeFlags&HY_TREEPANEL_ARCS) {
+                        PaintArcs(theCanvas, coordTree);
+                    } else if (treeFlags&(HY_TREEPANEL_STRAIGHT|HY_TREEPANEL_CIRCULAR)) {
+                        PaintStraight(theCanvas, coordTree);
+                    } else {
+                        if (IsVertical()) {
+                            PaintVSquare(theCanvas, coordTree);
+                        } else {
+                            PaintSquare(theCanvas, coordTree);
+                            if (treeFlags&HY_TREEPANEL_LABEL1) {
+                                theCanvas->SetFont(bf1);
+                                PaintSquareBranchLabels (theCanvas,coordTree,true);
+                            }
+                            if (treeFlags&HY_TREEPANEL_LABEL2) {
+                                theCanvas->SetFont(bf2);
+                                PaintSquareBranchLabels (theCanvas,coordTree,false);
+                            }
+                        }
+                    }
+
+                    if (visH||visW) {
+                        ShiftScreenCoordinates  (-visW,hasRuler?-visH-HY_TREEPANEL_RULER_EXPANDED+5:-visH,coordTree);
+                    } else if (hasRuler&&(vCount==0)) {
+                        ShiftScreenCoordinates  (0,-HY_TREEPANEL_RULER_EXPANDED+5,coordTree);
+                    }
+
+                    if (hCount||vCount) {
+                        ShiftScreenCoordinates  (pageW*hCount*xResC, pageH*vCount*yResC,coordTree);
+                    }
+                    if (EndPage (pd.hDC) < 0) {
+                        SuccessFlag = FALSE;
+                    }
+                }
+            }
+        //if ((hsc<1.0)||(vsc<1.0))
+        {
+            ShiftScreenCoordinates  (-windowTextMarginH,-windowTextMarginV,coordTree);
+            Convert2ScreenCoordinates (1.0/hsc,1.0/vsc,0,coordTree);
+        }
+
+        treeLabelFont = oldFont;
+        theCanvas->SetFont (oldFont);
+
+        theCanvas->thePane = saveDC1;
+        theRuler->thePane = saveDC2;
+    } else {
+        SuccessFlag = FALSE;
+    }
+
+
+    if (SuccessFlag) {
+        EndDoc(pd.hDC);
+    }
+
+    if (!UserAbortFlag) {
+        EnableWindow(theWindow, TRUE);
+        DestroyWindow(PrintDialogHandle);
+    }
+
+    DeleteDC (pd.hDC);
+
+    if (!SuccessFlag && !UserAbortFlag) {
+        MessageBox(theWindow, "Could not print the tree", AppName, MB_OK | MB_ICONEXCLAMATION);
+    }
+}
+
+//__________________________________________________________________
+
+void _HYTreePanel::_SetMenuBar(void)
+{
+    _HYWindow::_SetMenuBar();
+
+    HMENU            windowMenu =  GetMenu (theWindow),
+                     editMenu   =  GetSubMenu(windowMenu,1),
+                     treeMenu   =  GetSubMenu(windowMenu,2);
+
+    if (!treeMenu) {
+        treeMenu = CreateMenu();
+
+        HMENU          labelMenu  =  CreatePopupMenu(),
+                       selectMenu =  CreatePopupMenu(),
+                       compMenu   =  CreatePopupMenu(),
+                       procMenu   =  CreatePopupMenu();
+
+        checkPointer   (treeMenu);
+        checkPointer   (labelMenu);
+        checkPointer   (selectMenu);
+        checkPointer   (compMenu);
+        checkPointer   (procMenu);
+
+        InsertMenu      (labelMenu,  0xFFFFFFFF, MF_BYPOSITION|MF_STRING, HY_TREE_WIN32_MENU_BASE+24,
+                         "&Above Branches\tCtrl-8");
+
+        InsertMenu      (labelMenu,  0xFFFFFFFF, MF_BYPOSITION|MF_STRING, HY_TREE_WIN32_MENU_BASE+25,
+                         "&Below Branches\tCtrl-9");
+
+        InsertMenu      (compMenu,  0xFFFFFFFF, MF_BYPOSITION|MF_STRING, HY_TREE_WIN32_MENU_BASE+35,
+                         "Test For &Equality");
+
+        InsertMenu      (compMenu,  0xFFFFFFFF, MF_BYPOSITION|MF_STRING|MF_GRAYED, HY_TREE_WIN32_MENU_BASE+36,
+                         "Find &Subtree In Another Tree");
+
+        InsertMenu      (compMenu,  0xFFFFFFFF, MF_BYPOSITION|MF_STRING, HY_TREE_WIN32_MENU_BASE+37,
+                         "Find &Maximal Common Subtree");
+
+        InsertMenu      (compMenu,  0xFFFFFFFF, MF_BYPOSITION|MF_STRING, HY_TREE_WIN32_MENU_BASE+38,
+                         "Find Maximal Common &Forest");
+
+
+        InsertMenu      (compMenu,  0xFFFFFFFF, MF_BYPOSITION|MF_STRING, HY_TREE_WIN32_MENU_BASE+39,
+                         "&Match To Tree Pattern");
+
+
+        InsertMenu      (treeMenu,  0xFFFFFFFF, MF_BYPOSITION|MF_STRING|((treeFlags&HY_TREEPANEL_TIP_LABELS)?
+                         MF_CHECKED:0), HY_TREE_WIN32_MENU_BASE, "Tip &Labels");             //0
+
+        InsertMenu      (treeMenu,  0xFFFFFFFF, MF_BYPOSITION|MF_STRING|((treeFlags&HY_TREEPANEL_INT_LABELS)?
+                         MF_CHECKED:0), HY_TREE_WIN32_MENU_BASE+1, "I&nternal Labels"); //1
+
+        InsertMenu      (treeMenu,  0xFFFFFFFF, MF_BYPOSITION|MF_SEPARATOR, 0, nil);                            //2
+
+        InsertMenu      (treeMenu,  0xFFFFFFFF, MF_BYPOSITION|MF_STRING|MF_GRAYED, HY_TREE_WIN32_MENU_BASE+2,   //3
+                         "S&wap Subtrees\tCtrl-1");
+
+        InsertMenu      (treeMenu,  0xFFFFFFFF, MF_BYPOSITION|MF_STRING|MF_GRAYED, HY_TREE_WIN32_MENU_BASE+3,   //4
+                         "&Collapse Branch\tCtrl-2");
+
+        InsertMenu      (treeMenu,  0xFFFFFFFF, MF_BYPOSITION|MF_STRING|MF_GRAYED, HY_TREE_WIN32_MENU_BASE+4,   //5
+                         "&Join\tCtrl-3");
+
+        InsertMenu      (treeMenu,  0xFFFFFFFF, MF_BYPOSITION|MF_STRING|MF_GRAYED, HY_TREE_WIN32_MENU_BASE+5,   //6
+                         "&Graft A Tip\tCtrl-4");
+
+        InsertMenu      (treeMenu,  0xFFFFFFFF, MF_BYPOSITION|MF_STRING|MF_GRAYED, HY_TREE_WIN32_MENU_BASE+6,   //7
+                         "&Reroot\tCtrl-5");
+
+        InsertMenu      (treeMenu,  0xFFFFFFFF, MF_BYPOSITION|MF_STRING|MF_GRAYED, HY_TREE_WIN32_MENU_BASE+7,
+                         "&Flip tip ordering\tCtrl-6"); // 8
+
+        InsertMenu      (treeMenu,  0xFFFFFFFF, MF_BYPOSITION|MF_SEPARATOR, 0, nil); // 9
+
+
+        InsertMenu      (selectMenu,  0xFFFFFFFF, MF_BYPOSITION|MF_STRING|MF_GRAYED, HY_TREE_WIN32_MENU_BASE+8,
+                         "Select &Entire Subtree");
+        InsertMenu      (selectMenu,  0xFFFFFFFF, MF_BYPOSITION|MF_STRING, HY_TREE_WIN32_MENU_BASE+9,
+                         "Select Incom&plete Branches\tCtrl-I");
+        InsertMenu      (selectMenu,  0xFFFFFFFF, MF_BYPOSITION|MF_STRING, HY_TREE_WIN32_MENU_BASE+10,
+                         "Select Bran&ches Without Models");
+        InsertMenu      (selectMenu,  0xFFFFFFFF, MF_BYPOSITION|MF_STRING, HY_TREE_WIN32_MENU_BASE+17,
+                         "Select Branches By &Name");
+
+        InsertMenu      (selectMenu,  0xFFFFFFFF, MF_BYPOSITION|MF_STRING, HY_TREE_WIN32_MENU_BASE+18,
+                         "Select Branches By &Length");
+
+        InsertMenu      (selectMenu,  0xFFFFFFFF, MF_BYPOSITION|MF_STRING, HY_TREE_WIN32_MENU_BASE+30,
+                         "In&vert Selection");
+
+        InsertMenu      (selectMenu,  0xFFFFFFFF, MF_BYPOSITION|MF_STRING|MF_GRAYED, HY_TREE_WIN32_MENU_BASE+31,
+                         "&Grow Selection");
+
+        InsertMenu      (selectMenu,  0xFFFFFFFF, MF_BYPOSITION|MF_STRING|MF_GRAYED, HY_TREE_WIN32_MENU_BASE+32,
+                         "&Map Selection to Datapanel");
+
+        InsertMenu      (treeMenu,  0xFFFFFFFF, MF_BYPOSITION|MF_POPUP, (UINT)selectMenu,
+                         "Select Branches"); // 10
+
+        InsertMenu      (treeMenu,  0xFFFFFFFF, MF_BYPOSITION|MF_STRING|MF_GRAYED, HY_TREE_WIN32_MENU_BASE+11,
+                         "Edit Prope&rties"); // 11
+
+        InsertMenu      (treeMenu,  0xFFFFFFFF, MF_BYPOSITION|MF_SEPARATOR, 0, nil); // 12
+
+        UINT            flags = MF_BYPOSITION|MF_STRING;
+
+        if (likeFuncID < 0) {
+            flags |= MF_GRAYED;
+        }
+
+        InsertMenu      (treeMenu,  0xFFFFFFFF, flags, HY_TREE_WIN32_MENU_BASE+12,
+                         "Optimi&ze Again\tCtrl-T"); // 13
+
+        InsertMenu      (treeMenu,  0xFFFFFFFF, flags, HY_TREE_WIN32_MENU_BASE+13,
+                         "Sh&ow Parameters in Table\tCtrl-H"); //14
+
+        InsertMenu      (treeMenu,  0xFFFFFFFF, MF_BYPOSITION|MF_SEPARATOR, 0, nil); // 15
+
+        InsertMenu      (treeMenu,  0xFFFFFFFF, MF_BYPOSITION|MF_STRING, HY_TREE_WIN32_MENU_BASE+14,
+                         "Tr&ee Display Options..."); // 16
+
+        InsertMenu      (treeMenu,  0xFFFFFFFF, MF_BYPOSITION|MF_POPUP, (UINT)labelMenu,
+                         "Branch Labels"); // 17
+
+        InsertMenu      (treeMenu,  0xFFFFFFFF, MF_BYPOSITION|MF_SEPARATOR, 0, nil); // 18
+
+        InsertMenu      (treeMenu,  0xFFFFFFFF, MF_BYPOSITION|MF_STRING|MF_GRAYED, HY_TREE_WIN32_MENU_BASE+15, // 19
+                         "Show Rate Matri&x");
+        InsertMenu      (treeMenu,  0xFFFFFFFF, MF_BYPOSITION|MF_STRING|MF_GRAYED, HY_TREE_WIN32_MENU_BASE+16,
+                         "S&how Transition Matrix"); // 20
+
+
+        InsertMenu      (treeMenu,  0xFFFFFFFF, MF_BYPOSITION|MF_SEPARATOR, 0, nil); // 21
+
+        InsertMenu      (treeMenu,  0xFFFFFFFF, MF_BYPOSITION|MF_STRING, HY_TREE_WIN32_MENU_BASE+19, // 22
+                         "Pairwise Distan&ces");
+
+        InsertMenu      (treeMenu,  0xFFFFFFFF, MF_BYPOSITION|MF_STRING, HY_TREE_WIN32_MENU_BASE+20, // 23
+                         "Branch Length Distributi&on");
+
+        InsertMenu      (treeMenu,  0xFFFFFFFF, MF_BYPOSITION|MF_SEPARATOR, 0, nil); // 24
+
+        InsertMenu      (treeMenu,  0xFFFFFFFF, MF_BYPOSITION|MF_POPUP, (UINT)compMenu,
+                         "Tree Compar&ison"); // 25
+
+        InsertMenu      (treeMenu,  0xFFFFFFFF, MF_BYPOSITION|MF_STRING, HY_TREE_WIN32_MENU_BASE+40, // 26
+                         "Match Leaves To Se&quence Data");
+
+        InsertMenu      (treeMenu,  0xFFFFFFFF, MF_BYPOSITION|MF_STRING, HY_TREE_WIN32_MENU_BASE+41, // 27
+                         "Find selection in anothe&r Tree");
+
+
+        InsertMenu      (treeMenu,  0xFFFFFFFF, MF_BYPOSITION|MF_SEPARATOR, 0, nil); // 12
+
+        if (treeProcessors.lLength == 0) {
+            InsertMenu      (treeMenu, 0xFFFFFFFF, MF_BYPOSITION|MF_STRING|MF_GRAYED, 0, "&Additional Tools");
+            DestroyMenu     (procMenu);
+        } else {
+            for (long k=0; k<treeProcessors.lLength; k++) {
+                _String *thisItem = (_String*)treeProcessors (k),
+                         chopped = thisItem->Cut (thisItem->FindBackwards ('\\',0,-1)+1,-1);
+
+                InsertMenu      (procMenu, 0xFFFFFFFF, MF_BYPOSITION|MF_STRING, HY_TREE_WIN32_MENU_BASE+1000+k, chopped.sData);
+            }
+            InsertMenu      (treeMenu, 0xFFFFFFFF, MF_BYPOSITION|MF_POPUP, (UINT)procMenu, "&Additional Tools");
+        }
+
+
+        InsertMenu      (editMenu,  0xFFFFFFFF, MF_BYPOSITION|MF_SEPARATOR, 0, nil); // 24
+
+        InsertMenu      (editMenu,  0xFFFFFFFF, MF_BYPOSITION|MF_STRING, HY_WINDOW_MENU_ID_EDIT+6,
+                         "Search and Repla&ce\tCtrl-F"); // 25
+
+        InsertMenu      (editMenu,  0xFFFFFFFF, MF_BYPOSITION|MF_STRING, HY_WINDOW_MENU_ID_EDIT+7, // 23
+                         "Search and Re&place in Selection");
+
+
+        accels       << (FCONTROL|FVIRTKEY);
+        accels       << '1';
+        accels       << HY_TREE_WIN32_MENU_BASE+2;
+
+        accels       << (FCONTROL|FVIRTKEY);
+        accels       << '2';
+        accels       << HY_TREE_WIN32_MENU_BASE+3;
+
+        accels       << (FCONTROL|FVIRTKEY);
+        accels       << '3';
+        accels       << HY_TREE_WIN32_MENU_BASE+4;
+
+        accels       << (FCONTROL|FVIRTKEY);
+        accels       << '4';
+        accels       << HY_TREE_WIN32_MENU_BASE+5;
+
+        accels       << (FCONTROL|FVIRTKEY);
+        accels       << '5';
+        accels       << HY_TREE_WIN32_MENU_BASE+6;
+
+        accels       << (FCONTROL|FVIRTKEY);
+        accels       << '6';
+        accels       << HY_TREE_WIN32_MENU_BASE+7;
+
+        accels       << (FCONTROL|FVIRTKEY);
+        accels       << 'I';
+        accels       << HY_TREE_WIN32_MENU_BASE+9;
+
+        accels       << (FCONTROL|FVIRTKEY);
+        accels       << 'T';
+        accels       << HY_TREE_WIN32_MENU_BASE+12;
+
+        accels       << (FCONTROL|FVIRTKEY);
+        accels       << 'H';
+        accels       << HY_TREE_WIN32_MENU_BASE+13;
+
+        accels       << (FCONTROL|FVIRTKEY);
+        accels       << '8';
+        accels       << HY_TREE_WIN32_MENU_BASE+24;
+
+        accels       << (FCONTROL|FVIRTKEY);
+        accels       << '9';
+        accels       << HY_TREE_WIN32_MENU_BASE+25;
+
+        accels       << (FCONTROL|FVIRTKEY);
+        accels       << 'F';
+        accels       << HY_WINDOW_MENU_ID_EDIT+6;
+
+        InsertMenu   (windowMenu, 2, MF_BYPOSITION|MF_POPUP, (UINT) treeMenu , "&Tree");
+
+        _AddStandardAccels();
+        _BuildAccelTable  (true);
+        accels.Clear();
+
+
+        treeMenu =  GetSubMenu(windowMenu,1);
+        EnableMenuItem (treeMenu, 2, MF_ENABLED|MF_BYPOSITION);
+        EnableMenuItem (treeMenu, 6, MF_ENABLED|MF_BYPOSITION);
+    }
+}
+
+//__________________________________________________________________
+
+void _HYTreePanel::_UnsetMenuBar(void)
+{
+
+}
+
+//__________________________________________________________________
+
+void _HYTreePanel::_UpdateOperationsMenu (void)
+{
+    node<nodeCoord>* node1, *node2, *t;
+    HMENU       treeMenu    = GetSubMenu(GetMenu (theWindow),2),
+                editMenu  = GetSubMenu(GetMenu (theWindow),1),
+                selectMenu  = GetSubMenu(treeMenu, 10),
+                compMenu   = GetSubMenu(treeMenu, 25);
+
+    EnableMenuItem(treeMenu, 3 ,MF_GRAYED|MF_BYPOSITION);
+    EnableMenuItem(treeMenu, 4 ,MF_GRAYED|MF_BYPOSITION);
+    EnableMenuItem(treeMenu, 5 ,MF_GRAYED|MF_BYPOSITION);
+    EnableMenuItem(treeMenu, 6 ,MF_GRAYED|MF_BYPOSITION);
+    EnableMenuItem(treeMenu, 7 ,MF_GRAYED|MF_BYPOSITION);
+    EnableMenuItem(treeMenu, 8 ,MF_GRAYED|MF_BYPOSITION);
+    EnableMenuItem(selectMenu,0 ,MF_GRAYED|MF_BYPOSITION);
+    EnableMenuItem(selectMenu,6 ,MF_GRAYED|MF_BYPOSITION);
+    EnableMenuItem(selectMenu,7 ,MF_GRAYED|MF_BYPOSITION);
+    EnableMenuItem(selectMenu,8 ,MF_GRAYED|MF_BYPOSITION);
+    EnableMenuItem(treeMenu,11 ,MF_GRAYED|MF_BYPOSITION);
+    EnableMenuItem(treeMenu,19 ,MF_GRAYED|MF_BYPOSITION);
+    EnableMenuItem(treeMenu,20 ,MF_GRAYED|MF_BYPOSITION);
+
+    EnableMenuItem(editMenu, 8 ,MF_GRAYED|MF_BYPOSITION);
+    EnableMenuItem(editMenu, 11,MF_GRAYED|MF_BYPOSITION);
+    EnableMenuItem(compMenu, 1 ,MF_GRAYED|MF_BYPOSITION);
+
+    bool  good = true;
+    long  k,j;
+    if (currentSelection.lLength==2) {
+        node1 = (node<nodeCoord>*)currentSelection(0);
+        node2 = (node<nodeCoord>*)currentSelection(1);
+        t = node1->parent;
+        while (t) {
+            if (t==node2) {
+                good = false;
+                break;
+            }
+            t = t->parent;
+        }
+        if (good) {
+            t = node2->parent;
+            while (t) {
+                if (t==node1) {
+                    good = false;
+                    break;
+                }
+                t = t->parent;
+            }
+        }
+        if (good) {
+            EnableMenuItem(treeMenu, 3 ,MF_ENABLED|MF_BYPOSITION);
+        }
+    }
+    if (currentSelection.lLength) {
+        EnableMenuItem(treeMenu, 6 ,MF_ENABLED|MF_BYPOSITION);
+        EnableMenuItem(treeMenu, 11 ,MF_ENABLED|MF_BYPOSITION);
+        EnableMenuItem(selectMenu,6 ,MF_ENABLED|MF_BYPOSITION);
+        EnableMenuItem(selectMenu,7 ,MF_ENABLED|MF_BYPOSITION);
+        EnableMenuItem(selectMenu,8 ,MF_ENABLED|MF_BYPOSITION);
+        EnableMenuItem(editMenu, 11,MF_ENABLED|MF_BYPOSITION);
+        for (k=0; k<currentSelection.lLength; k++) {
+            node1 = (node<nodeCoord>*)currentSelection(k);
+            if (node1->get_num_nodes()) {
+                EnableMenuItem(treeMenu, 4 ,MF_ENABLED|MF_BYPOSITION);
+                break;
+            }
+        }
+        for (k=0; k<currentSelection.lLength; k++) {
+            node1 = (node<nodeCoord>*)currentSelection(k);
+            if (!node1->get_num_nodes()) {
+                EnableMenuItem(treeMenu, 5 ,MF_ENABLED|MF_BYPOSITION);
+                break;
+            }
+        }
+        if (currentSelection.lLength>=2) {
+            node1 = (node<nodeCoord>*)currentSelection(0);
+            t = node1->parent;
+            if (t&&(t->get_num_nodes()>currentSelection.lLength)) {
+                for (k=1; k<currentSelection.lLength; k++) {
+                    node1 = (node<nodeCoord>*)currentSelection(k);
+                    if (node1->parent!=t) {
+                        break;
+                    }
+                }
+                if (k==currentSelection.lLength) {
+                    EnableMenuItem(treeMenu, 5 ,MF_ENABLED|MF_BYPOSITION);
+                }
+            }
+        } else {
+            node1 = (node<nodeCoord>*)currentSelection(0);
+            if (node1->parent) {
+                EnableMenuItem(treeMenu, 7 ,MF_ENABLED|MF_BYPOSITION);
+                ModifyMenu    (treeMenu, 7, MF_BYPOSITION, HY_TREE_WIN32_MENU_BASE+6, "Reroot");
+            }
+            if (node1->get_num_nodes()>0) {
+                EnableMenuItem(treeMenu, 8 ,MF_ENABLED|MF_BYPOSITION);
+                EnableMenuItem(selectMenu,0 ,MF_ENABLED|MF_BYPOSITION);
+            }
+            if (node1->in_object.varRef>=0) {
+                _CalcNode* thisCNode = (_CalcNode*)LocateVar(node1->in_object.varRef);
+
+                if (thisCNode&&(thisCNode->GetModelIndex()>=0)) {
+                    EnableMenuItem(treeMenu,19 ,MF_ENABLED|MF_BYPOSITION);
+                    EnableMenuItem(treeMenu,20 ,MF_ENABLED|MF_BYPOSITION);
+                }
+            }
+        }
+    } else {
+        _TheTree *me = LocateMyTreeVariable();
+        if (me) {
+            if (me->RootedFlag()==UNROOTED) {
+                EnableMenuItem(treeMenu, 7 ,MF_ENABLED|MF_BYPOSITION);
+                ModifyMenu    (treeMenu, 7, MF_BYPOSITION,HY_TREE_WIN32_MENU_BASE+6,"Balance");
+            } else {
+                EnableMenuItem(treeMenu, 7 ,MF_ENABLED|MF_BYPOSITION);
+                ModifyMenu    (treeMenu, 7, MF_BYPOSITION, HY_TREE_WIN32_MENU_BASE+6,"Unroot");
+            }
+        }
+    }
+
+    if (likeFuncID!=-1) {
+        EnableMenuItem(treeMenu, 13 ,MF_ENABLED|MF_BYPOSITION);
+        EnableMenuItem(treeMenu, 14 ,MF_ENABLED|MF_BYPOSITION);
+    } else {
+        EnableMenuItem(treeMenu, 13 ,MF_GRAYED|MF_BYPOSITION);
+        EnableMenuItem(treeMenu, 14 ,MF_GRAYED|MF_BYPOSITION);
+    }
+
+    if (treePanelClipboardRoot&&(currentSelection.lLength==1)) {
+        EnableMenuItem(editMenu, 4 ,MF_ENABLED|MF_BYPOSITION);
+    } else {
+        EnableMenuItem(editMenu, 4 ,MF_GRAYED|MF_BYPOSITION);
+    }
+
+    EnableMenuItem(editMenu, 3 ,MF_GRAYED|MF_BYPOSITION);
+    // check if can cut/paste
+    t = nil;
+
+    for (k=0; k<currentSelection.lLength; k++) {
+        node1 = (node<nodeCoord>*)currentSelection.lData[k];
+        if (node1->parent) {
+            if (currentSelection.Find((long)node1->parent)<0) {
+                if (t) {
+                    break;
+                } else {
+                    t = node1;
+                }
+            }
+            for (j=0; j<node1->nodes.length; j++) {
+                if (currentSelection.Find((long)node1->nodes.data[j])<0) {
+                    break;
+                }
+            }
+            if (j<node1->nodes.length) {
+                break;
+            }
+        } else {
+            if (t) {
+                break;
+            } else {
+                t = node1;
+            }
+        }
+    }
+    selectionTop = nil;
+    treeFlags &= 0xFF7F;
+    if (t&&(t->parent!=coordTree)&&(t->parent)) {
+        if (k==currentSelection.lLength) {
+            EnableMenuItem(editMenu, 3 ,MF_ENABLED|MF_BYPOSITION);
+            EnableMenuItem(compMenu, 1 ,MF_ENABLED|MF_BYPOSITION);
+            selectionTop = t;
+            treeFlags |= HY_TREEPANEL_CLIPBOARD_READY;
+        }
+    }
+    _String undoMessage;
+    EnableMenuItem(editMenu, 0 ,MF_ENABLED|MF_BYPOSITION);
+    UINT   menuFlag = MF_BYPOSITION;
+    switch (undoCode) {
+    case 1:
+        undoMessage = "Undo Swap";
+        break;
+    case 2:
+        undoMessage = "Undo Flip";
+        break;
+    case 3:
+        undoMessage = "Undo Collapse";
+        break;
+    case 4:
+        undoMessage = "Undo Delete";
+        break;
+    case 5:
+        undoMessage = "Undo Join";
+        break;
+    case 6:
+        undoMessage = "Undo Cut";
+        break;
+    case 7:
+        undoMessage = "Undo Graft";
+        break;
+    case 8:
+        undoMessage = "Undo Paste";
+        break;
+    case 9:
+        undoMessage = "Undo Subtree Move";
+        break;
+    default:
+        undoMessage = "Can't Undo";
+        menuFlag |= MF_GRAYED;
+    }
+    undoMessage = undoMessage & "\tCtrl-Z";
+    ModifyMenu (editMenu, 0, menuFlag, HY_WINDOW_MENU_ID_EDIT,undoMessage.sData);
+    //printf ("Undo message = %s\n", undoMessage.sData);
+    DrawMenuBar(theWindow);
+}
+
+//__________________________________________________________________
+
+void _HYTreePanel::_HandleIdleEvent (void)
+{
+    /*#ifdef TARGET_API_MAC_CARBON
+    Point    curMouse;
+    GetGlobalMouse (&curMouse);
+
+    unsigned long t;
+    GetDateTime(&t);
+
+
+    if ((abs(curMouse.h-saveMouseH)<=3)
+      &&(abs(curMouse.v-saveMouseV)<=3)
+      &&(t-lastSave>.5))
+
+    {
+        if (!HasToolTip())
+        {
+            GrafPtr curPort;
+            GetPort (&curPort);
+            SetPort (GetWindowPort (theWindow));
+            _DisplayBranchFloater();
+            SetPort (curPort);
+        }
+
+        lastSave   = t;
+    }
+
+    saveMouseH = curMouse.h;
+    saveMouseV = curMouse.v;
+    #endif*/
+}
+
+//__________________________________________________________________
+
+void        _HYTreePanel::_PaintLFStatus(Ptr p)
+{
+    HDC theDC = (HDC)p;
+
+    if (!theDC) {
+        theDC = GetDC (theWindow);
+    }
+
+    if (likeFuncID<0) {
+        _PaintTheCircle (redButtonIcon,theWindow, theDC);
+    } else {
+        if (dubiousNodes.lLength) {
+            _PaintTheCircle (yellowButtonIcon,theWindow, theDC);
+        } else {
+            _PaintTheCircle (greenButtonIcon,theWindow, theDC);
+        }
+    }
+    ReleaseDC (theWindow, theDC);
+}
+
+//EOF
\ No newline at end of file
diff --git a/src/gui/win/include/Components/HYPlatformButton.h b/src/gui/win/include/Components/HYPlatformButton.h
new file mode 100644
index 0000000..52b186e
--- /dev/null
+++ b/src/gui/win/include/Components/HYPlatformButton.h
@@ -0,0 +1 @@
+/*
    A button object for Win32.

    Sergei L. Kosakovsky Pond, May 2000-December 2002.
*/

#ifndef _HYPBUTTON_
#define _HYPBUTTON_

#include "HYPlatformComponent.h"

//__________________________________________________________________

class _HYPlatformButton
{

public:

    _HYPlatformButton(void);
    virtual ~_HYPlatformButton(void);

    virtual void            _SetBackColor    (_HYColor&);
    virtual void            _SetDimensions   (_HYRect,_HYRect);
    virtual void            _SetVisibleSize  (_HYRect);
    virtual void            _SetFont         (_HYFont&);
    void            _SetText         (void);
    void            _SetButtonKind   (unsigned char);
    void            _EnableButton    (bool);

    virtual void            _Paint (Ptr p);
    virtual void            _Update(Ptr p);

    HBRUSH       backFill;
    COLORREF     fc;
    RECT         buttonRect;
    HFONT        pLabelFont;
    HWND         buttonWindow;
};

#endif
\ No newline at end of file
diff --git a/src/gui/win/include/Components/HYPlatformButtonBar.h b/src/gui/win/include/Components/HYPlatformButtonBar.h
new file mode 100644
index 0000000..792d7e4
--- /dev/null
+++ b/src/gui/win/include/Components/HYPlatformButtonBar.h
@@ -0,0 +1 @@
+/*
    At toolbar menu object for Win 32.

    Sergei L. Kosakovsky Pond, May 2000 - December 2002.
*/

#ifndef _HYPBUTTONBAR_
#define _HYPBUTTONBAR_

#include "HYPlatformComponent.h"

//__________________________________________________________________

class _HYPlatformButtonBar
{

public:

    _HYPlatformButtonBar(void);

    virtual ~_HYPlatformButtonBar(void);

    virtual void        _SetBackColor    (_HYColor&);
    virtual void        _SetDimensions   (_HYRect,_HYRect);
    virtual void        _SetVisibleSize  (_HYRect);
    _HYRect     _GetButtonRect   (bool conv = false);

    virtual void        _Paint (Ptr p);
    virtual void        _Update(Ptr p);
    void        _DisposeButtons (void);
    void        _DisposeButton  (long);
    void        _MarkButtonForUpdate(int);
    void        _UnpushButton   (void);
    int         _FindClickedButton (int,int);


    HWND         ttCtl;
    HBRUSH       backFill;
    RECT         buttonRect;
    int          pushed,
                 lastMouseDown;
};


#endif
\ No newline at end of file
diff --git a/src/gui/win/include/Components/HYPlatformCheckbox.h b/src/gui/win/include/Components/HYPlatformCheckbox.h
new file mode 100644
index 0000000..51391fd
--- /dev/null
+++ b/src/gui/win/include/Components/HYPlatformCheckbox.h
@@ -0,0 +1 @@
+/*
    A checkbox with optional static label object for Win32.

    Sergei L. Kosakovsky Pond, May 2000-December 2002.
*/

#ifndef _HYPLCHECKBOX_
#define _HYPLCHECKBOX_

#include "HYPlatformLabel.h"

//__________________________________________________________________

class _HYPlatformCheckbox
{

public:

    _HYPlatformCheckbox(bool);
    virtual ~_HYPlatformCheckbox(void);

    virtual void        _SetVisibleSize     (_HYRect);
    virtual void        _SetState           (bool);


    virtual void        _Paint (Ptr p);
    virtual void        _Update(Ptr p);
    virtual void        _Enable(bool);

    HWND            buttonWindow;
    RECT            checkboxRect;
    bool            isRadio;

    HBRUSH          defBrush;

    LONG_PTR        mainHandler;
};

#endif
\ No newline at end of file
diff --git a/src/gui/win/include/Components/HYPlatformLabel.h b/src/gui/win/include/Components/HYPlatformLabel.h
new file mode 100644
index 0000000..cfcd1cf
--- /dev/null
+++ b/src/gui/win/include/Components/HYPlatformLabel.h
@@ -0,0 +1 @@
+/*
    A static label object for Win32.

    Sergei L. Kosakovsky Pond, May 2000-December 2002.
*/

#ifndef _HYPLABEL_
#define _HYPLABEL_

#include "HYBaseGUI.h"
#include "Windows.h"
#include "hy_strings.h"

//__________________________________________________________________

class _HYPlatformLabel
{

public:

    _HYPlatformLabel(void);
    // flags, title, visibility

    virtual ~_HYPlatformLabel(void);

    virtual void        _SetBackColor    (_HYColor&);
    virtual void        _SetForeColor    (_HYColor&);
    virtual void        _SetDimensions   (_HYRect,_HYRect);
    virtual void        _SetVisibleSize  (_HYRect);
    virtual void        _SetFont         (_HYFont&);
    virtual void        _SetText         (void);

    virtual void        _Paint (Ptr p);
    virtual void        _Update(Ptr p);

    HBRUSH       backFill;
    COLORREF     fc;
    RECT         labelRect;
    HFONT        pLabelFont;
    HPEN         labelPen;
};

#endif
\ No newline at end of file
diff --git a/src/gui/win/include/Components/HYPlatformPullDown.h b/src/gui/win/include/Components/HYPlatformPullDown.h
new file mode 100644
index 0000000..7afb1fb
--- /dev/null
+++ b/src/gui/win/include/Components/HYPlatformPullDown.h
@@ -0,0 +1 @@
+/*
    A pull down menu object for Win 32

    Sergei L. Kosakovsky Pond, May 2000-December 2002
*/

#ifndef _HYPPULLDOWNMENU_
#define _HYPPULLDOWNMENU_


#include "HYPlatformComponent.h"

//__________________________________________________________________

extern   _String    menuSeparator;

//__________________________________________________________________

class _HYPlatformPullDown
{

public:

    _HYPlatformPullDown(void);
    // flags, title, visibility

    virtual ~_HYPlatformPullDown(void);

    virtual void        _AddMenuItem     (_String&, long);
    virtual void        _SetMenuItem     (_String&, long);
    virtual void        _SetBackColor    (_HYColor&);
    virtual void        _Duplicate       (Ptr);
    virtual void        _DeleteMenuItem  (long);
    virtual long        _GetSelection    (void);
    virtual void        _SetDimensions   (_HYRect,_HYRect);
    virtual void        _SetVisibleSize  (_HYRect);
    virtual void        _EnableItem      (long, bool);
    virtual void        _MarkItem        (long, char);
    virtual char        _ItemMark        (long);
    virtual void        _EnableMenu      (bool);


    virtual void        _Paint           (Ptr);
    virtual void        _Update          (Ptr);
    virtual void        _RefreshComboBox (void);
    virtual void        _AdjustItemIDs   (long, long, long);


    HWND         myMenu;
    HBRUSH       backFill;
    HMENU        theMenu;

    long         selection,
                 cbSelection,
                 menuWidth;

    LONG_PTR     mainHandler;

    RECT         menuRect;
};


#endif
\ No newline at end of file
diff --git a/src/gui/win/include/Components/HYPlatformTable.h b/src/gui/win/include/Components/HYPlatformTable.h
new file mode 100644
index 0000000..b604e7a
--- /dev/null
+++ b/src/gui/win/include/Components/HYPlatformTable.h
@@ -0,0 +1 @@
+/*
    A text input box object for Win 32.

    Sergei L. Kosakovsky Pond, May 2000-December 2002.
*/

#ifndef _HYPLTABLE_
#define _HYPLTABLE_


//__________________________________________________________________

#include "HYPlatformComponent.h"

#define     HY_TABLE_SIZE_CURSOR   0x01
#define     HY_TABLE_DRAG_CURSOR   0x02
#define     HY_TABLE_EDIT_CURSOR   0x04

//__________________________________________________________________

class _HYPlatformTable
{

public:

    _HYPlatformTable        (void);
    virtual             ~_HYPlatformTable       (void);

    void            _SetFont                (void);
    void            _SetBackColor           (_HYColor&);
    void            _SetBackColor2          (_HYColor&);

    void            _CreateTextBox          (_HYRect&,_String&);
    _String         _RetrieveTextValue      (void);
    void            _KillTextBox            (void);
    bool            _HasTextBox             (void) {
        return      editBox;
    }

    RECT            _GetVisibleRowRect      (long);

    void            _HiliteRowForDrag       (long,long);
    void            _ResetCursorState       (void);

    void            _FrameRect              (RECT&);

    HBRUSH          backPattern,
                    backPattern2;

    HFONT           tableFont,
                    tableFontB,
                    tableFontI,
                    tableFontBI;

    char            cursorState;

    HWND            editBox;
    RECT            textBoxRect,
                    limits;

    long            activeColumn,
                    activeColumn2;

    LONG_PTR        defautlTextHandler;


};

#endif
\ No newline at end of file
diff --git a/src/gui/win/include/Components/HYPlatformTextbox.h b/src/gui/win/include/Components/HYPlatformTextbox.h
new file mode 100644
index 0000000..b98ad09
--- /dev/null
+++ b/src/gui/win/include/Components/HYPlatformTextbox.h
@@ -0,0 +1 @@
+/*
    A text input box object for Win32

    Sergei L. Kosakovsky Pond, May 2000-December 2002.
*/

#ifndef _HYPLTEXTBOX_
#define _HYPLTEXTBOX_

#include "HYPlatformComponent.h"
#include <richedit.h>

//__________________________________________________________________

class _HYPlatformTextBox
{

public:

    _HYPlatformTextBox (void);

    virtual ~_HYPlatformTextBox(void);

    virtual void            _SetBackColor    (_HYColor&);
    virtual void            _SetBackTColor   (_HYColor&);
    virtual void            _SetForeColor    (_HYColor&);
    virtual void            _SetDimensions   (_HYRect,_HYRect);
    virtual void            _SetVisibleSize  (_HYRect);
    virtual void            _SetFont         (_HYFont&);
    void            _SetText         (const _String&);
    void            _InsertText      (const _String&, bool);
    _String         _GetText         (void);
    void            _StoreText       (_String*&, bool);
    void            _CreateTE        (void);
    void            _EnableTextBox   (bool);
    void            _SetMargins      (_HYRect&);
    void            _SetAlignFlags   (unsigned char);

    virtual void            _Paint (Ptr p);
    virtual void            _Update(Ptr p);

    virtual void            _FocusComponent  (void);
    virtual void            _UnfocusComponent(void);
    virtual bool            _NeedMultiLines  (void);

    HBRUSH          backFill,
                    backTFill;
    HWND            te;
    RECT            textBoxRect;
    COLORREF        textColor;
    HFONT           pLabelFont;

    LONG_PTR        mainHandler;
    bool            isSingleLine;
};

//__________________________________________________________________

_String                 retrieveEditControlText (HWND);
void                    retrieveEditControlText (HWND, _String*&);

#endif
\ No newline at end of file
diff --git a/src/gui/win/include/HYPlatformButtonMenu.h b/src/gui/win/include/HYPlatformButtonMenu.h
new file mode 100644
index 0000000..37ab3f0
--- /dev/null
+++ b/src/gui/win/include/HYPlatformButtonMenu.h
@@ -0,0 +1 @@
+/*
    A pull down menu object for MacOS.

    Sergei L. Kosakovsky Pond, July 2000-June 2002.
*/

#ifndef _HYPPULLDOWNMENU_
#define _HYPPULLDOWNMENU_
#pragma once

#include "HYBaseGUI.h"
#include "Windows.h"
#include <strings.h>

//__________________________________________________________________

class _HYPlatformPullDown
{

public:

    _HYPlatformPullDown(void);
    // flags, title, visibility

    virtual ~_HYPlatformPullDown(void);

    virtual void        _AddMenuItem     (_String&, long);
    virtual void        _SetBackColor    (_HYColor&);
    virtual void        _Duplicate       (Ptr);
    virtual void        _DeleteMenuItem  (long);
    virtual long        _GetSelection    (void);
    virtual void        _SetDimensions   (_HYRect,_HYRect);
    virtual void        _SetVisibleSize  (_HYRect);
    virtual void        _EnableItem      (long, bool);


    virtual void        _Paint (Ptr p);
    virtual void        _Update(Ptr p);

// new

    virtual void        _MarkItem        (long, char);
    virtual char        _ItemMark        (long);

// end new

    HWND         myMenu;
    HBRUSH       backFill;
    long         selection, menuWidth;
    _List        disabledItems;
    _SimpleList  disabledIndices;
    RECT         menuRect;
};

//__________________________________________________________________

class _HYPlatformLabel
{

public:

    _HYPlatformLabel(void);
    // flags, title, visibility

    virtual ~_HYPlatformLabel(void);

    virtual void        _SetBackColor    (_HYColor&);
    virtual void        _SetForeColor    (_HYColor&);
    virtual void        _SetDimensions   (_HYRect,_HYRect);
    virtual void        _SetVisibleSize  (_HYRect);
    virtual void        _SetFont         (_HYFont&);

    virtual void        _Paint (Ptr p);
    virtual void        _Update(Ptr p);

    HBRUSH       backFill;
    COLORREF     fc;
    RECT         labelRect;
    HFONT        pLabelFont;
    HPEN         labelPen;
};

//__________________________________________________________________

class _HYPlatformButtonBar
{

public:

    _HYPlatformButtonBar(void);

    virtual ~_HYPlatformButtonBar(void);

    virtual void        _SetBackColor    (_HYColor&);
    virtual void        _SetDimensions   (_HYRect,_HYRect);
    virtual void        _SetVisibleSize  (_HYRect);

    virtual void        _Paint (Ptr p);
    virtual void        _Update(Ptr p);
    void        _DisposeButtons (void);
    void        _MarkButtonForUpdate(int);

    HBRUSH       backFill;
    RECT         buttonRect;
    int          pushed;
};

//__________________________________________________________________

#endif

//EOF
\ No newline at end of file
diff --git a/src/gui/win/include/HYPlatformComponent.h b/src/gui/win/include/HYPlatformComponent.h
new file mode 100644
index 0000000..3223bba
--- /dev/null
+++ b/src/gui/win/include/HYPlatformComponent.h
@@ -0,0 +1 @@
+/*
    A general composite window component object, Windows specifics

    Sergei L. Kosakovsky Pond, June 2000-June 2002.
*/

#ifndef _HYPCOMPONENT_
#define _HYPCOMPONENT_
#pragma once

#include "HYBaseGUI.h"
#include "Windows.h"

#define  HY_COMPONENT_ENABLE_H_SCROLL 0x01
#define  HY_COMPONENT_ENABLE_V_SCROLL 0x02

#define  HY_SCROLLER_WIDTH 16

//__________________________________________________________________

class _HYPlatformComponent
{

public:

    _HYPlatformComponent(void);
    _HYPlatformComponent(_HYRect,Ptr);
    // settings

    virtual ~_HYPlatformComponent() {};

    virtual void        Duplicate (BaseRef);

    virtual void        _CleanUp   (void);

    virtual void        _SetDimensions (_HYRect,_HYRect);
    virtual void        _SetVisibleSize(_HYRect);

    virtual void        _Paint (Ptr);
    virtual void        _Update (Ptr);
    virtual bool        _ProcessOSEvent (Ptr);
    virtual _HYRect     _VisibleContents(Ptr);
    virtual void        _MarkForUpdate (void);


// new

    virtual void        _MarkContentsForUpdate (void);
    virtual long        _GetHScrollerPos (void);
    virtual long        _GetVScrollerPos (void);
    virtual void        _SetHScrollerPos (long);
    virtual void        _SetVScrollerPos (long);
    virtual void        _Activate (void);
    virtual void        _Deactivate(void);
    virtual void        _ComponentMouseExit (void) {}



    HWND          parentWindow,
                  vScroll,
                  hScroll;

    bool          activationFlag;

    _HYRect       rel;

    char          scrollState;
};

//__________________________________________________________________

void                AlignRectangle   (_HYRect& rel , RECT& target , unsigned char alFlags);
COLORREF            HYColor2ColorRef (_HYColor&, HDC);
RECT                HYRect2Rect      (_HYRect&);
#endif

//EOF
\ No newline at end of file
diff --git a/src/gui/win/include/HYPlatformGraphicPane.h b/src/gui/win/include/HYPlatformGraphicPane.h
new file mode 100644
index 0000000..7d0ef78
--- /dev/null
+++ b/src/gui/win/include/HYPlatformGraphicPane.h
@@ -0,0 +1 @@
+/*
    A painting canvas with double buffer. Windows.

    Sergei L. Kosakovsky Pond, May 2000-June 2002
*/

#ifndef _HYPGRAPHICPANE_
#define _HYPGRAPHICPANE_
#pragma once

#include <windows.h>
#include "HYBaseGUI.h"

//__________________________________________________________________

class  _HYPlatformGraphicPane
{

public:

    _HYPlatformGraphicPane(int, int,int);
    // initial size

    virtual ~_HYPlatformGraphicPane();

    virtual void        _SetPaneSize  (int,int,int);
    virtual void        _DrawLine    (_HYRect);
    virtual void        _DrawHatchedLine     (_HYRect);
    // from, to , width
    virtual void        _DisplayText (_String,int,int,bool);
    // text, where, left-right or top-bottom
    virtual void        _DrawRect    (_HYRect);
    virtual void        _FillRect    (_HYRect);
    virtual void        _EraseRect   (_HYRect);
    virtual void        _DrawOval    (_HYRect);
    virtual void        _FillOval    (_HYRect);
    virtual void        _EraseOval   (_HYRect);
    virtual void        _DrawArc     (_HYRect,int,int);
    virtual void        _FillArc     (_HYRect,int,int);
    virtual void        _EraseArc    (_HYRect,int,int);
    virtual void        _SetColor    (_HYColor);
    virtual void        _SetFont     (_HYFont);
    virtual void        _StartDraw   (void);
    virtual void        _EndDraw     (void);
    virtual void        _SetPort     (Ptr);
    virtual void        _DrawPicRes  (_HYRect&, long);

// new

    virtual void        _SetBColor   (_HYColor);
    virtual void        _DisplayText  (_String&,_HYRect&, char);
    virtual void        _DisplayChar  (char,int,int);
    virtual void        _SetFontSize (long);
    virtual void        _SlidePane   (int dv, int dh);
    virtual void        _SlideRect   (_HYRect&r ,int dv, int dh);
    virtual void        _InvertRect  (_HYRect&);
    virtual void        _SavePicture (_String);
    virtual Ptr         _DefinePolygon
    (_SimpleList&);
    virtual void        _KillPolygon (Ptr);
    virtual void        _DrawPolygon (Ptr,long = 1);
    virtual void        _FillPolygon (Ptr);
    virtual void        _ErasePolygon(Ptr);
    virtual void        _SetDialogBG (void);
    virtual void        _CopyToClipboard
    (void);

    HDC          thePane;
    int          lastPenSize;

    HBITMAP      paneBitMap,
                 oldMap;

protected:

    void         CheckPen (_HYRect&, bool force = false);
    HBRUSH       fillColor,
                 backColor,
                 oldBrush;


    HPEN         oldPen;
    HFONT        oldFont;

};

extern   HINSTANCE    ProgramInstance;

POINT                 DrawTransparentBitmap(HDC, HBITMAP, short,short,short,short, COLORREF);

extern   HDC          otherDC;
extern   HBITMAP      oDCBM;


#endif

//EOF
\ No newline at end of file
diff --git a/src/gui/win/include/HYPlatformWindow.h b/src/gui/win/include/HYPlatformWindow.h
new file mode 100644
index 0000000..614a350
--- /dev/null
+++ b/src/gui/win/include/HYPlatformWindow.h
@@ -0,0 +1 @@
+/*
    A Windows window object - a window/title/size-box/scroll-bars handler.

    Sergei L. Kosakovsky Pond, June 2000-June 2002.
*/

#ifndef _HYPWINDOW_
#define _HYPWINDOW_
#pragma once

#define  MAX_CONTROL_VALUE      100000000

#define  HY_WINDOW_MENU_ID_FILE 5000
#define  HY_WINDOW_MENU_ID_EDIT 5050

#include "hy_strings.h"
#include <windows.h>
#include <commdlg.h>
#include "HYBaseGUI.h"

struct  _HYWindowsUIMessage {
    UINT    iMsg;
    WPARAM  wParam;
    LPARAM  lParam;
    LRESULT res;
};

//__________________________________________________________________

class _HYPlatformWindow
{

public:

    _HYPlatformWindow(unsigned char,_String,bool,Ptr);
    // flags, title, visibility

    virtual ~_HYPlatformWindow();

    void        _SetTitle               (_String);
    void        _Show                   (void);
    void        _Hide                   (void);
    virtual long        _Grow                   (Ptr);
    virtual bool        _Close                  (Ptr);
    virtual void        _Move                   (Ptr);
    void        _SelectWindow           (void);
    virtual void        _SetWindowRectangle     (int,int,int,int,bool=true);
    virtual void        _SetContentSize         (int,int);
    virtual void        _Paint                  (Ptr);
    virtual void        _Update                 (Ptr);
    virtual void        _Activate               (void);
    virtual void        _Deactivate             (void);
    virtual bool        _ProcessOSEvent         (Ptr);
    virtual void        _VisibleContents        (int&,int&,int&,int&);
    bool        _IsHScroll              (HWND);
    virtual bool        _ProcessMenuSelection   (long) {
        return false;
    }
    virtual void        _SetMenuBar             (void);
    virtual void        _UnsetMenuBar           (void);
    virtual Ptr         _GetOSWindowData        (void) {
        return (Ptr)theWindow;
    }

// new

    virtual void        _SetPosition            (int,int);
    virtual void        _BringWindowToFront     (void);
    virtual _HYRect     _GetWindowRect          (void);
    virtual _String&    _GetTitle               (void);
    void        _SetWindowBackColor     (_HYColor);

    virtual void        _AddStandardAccels      (void);
    virtual void        _BuildAccelTable        (bool force = false);

// end new

    HWND        theWindow,
                oldFrontWindow;
    HMENU       windowMenu;
    RECT        newVRect ();
    RECT        newHRect ();
    HACCEL      menuKeys;

    unsigned char
    flags;

    _SimpleList accels;

    Ptr         parentWindowPtr;
};

//__________________________________________________________________

class _HYPlatformTWindow
{

public:

    _HYPlatformTWindow  (Ptr) {
        idleTimer = 0;
        hWindowPad = 0;
        vWindowPad = 0;
        trackMouseComponent = nil;
    }

    virtual         ~_HYPlatformTWindow (void) {}
    virtual void    _SetWindowRectangle     (int,int,int,int,bool=true);

    UINT_PTR idleTimer;

    long     hWindowPad,
             vWindowPad;


    _HYGuiObject*
    trackMouseComponent;


//virtual void   _Activate          (void);
//virtual void   _Deactivate        (void);

};

//__________________________________________________________________

class _HYPlatformPWindow
{

public:

    _HYPlatformPWindow          (void);

    virtual ~_HYPlatformPWindow         (void);

    virtual void _StartPicture          (void);
    virtual void _EndPicture            (void);
    virtual void _DrawPicture           (_HYRect);

private:

    HENHMETAFILE     savedPic;
    HDC              stashedDC;

};


//__________________________________________________________________

COLORREF  HYColor2ColorRef (_HYColor&, HDC);

extern    bool          forceUpdateForScrolling;
extern    BOOL          UserAbortFlag;
extern    HBRUSH        windowStatusBarBrush;
extern    HFONT         statusBarPlain;
extern    HWND          PrintDialogHandle;
extern    char          WinName[],
          AppName[];

extern    HINSTANCE     ProgramInstance;
extern    HWND          WindowHandle;
extern    HBRUSH        windowStatusBarBrush;
extern    HPEN          _BLACKPEN_;

extern    HBITMAP       redButtonIcon,
          yellowButtonIcon,
          orangeButtonIcon,
          greenButtonIcon;

BOOL      CALLBACK      PrintDialogProc(HWND, UINT, WPARAM, LPARAM);
BOOL      CALLBACK      AbortProc(HDC, int);
HDC                     GetPrinterDeviceContext(HWND);

#define                 IDD_FNAME               10
#define                 IDLE_WINDOW_TIMER       111
#define                 GLOBAL_QUEUE_TIMER      222

extern  _SimpleList     windowPtrs,
        windowObjects,
        windowObjectRefs;

int     MessageLoop     (bool = true, bool = true);

void    _PaintTheCircle (HBITMAP, HWND, HDC);
#endif

//EOF
\ No newline at end of file
diff --git a/src/gui/win/include/pthread.h b/src/gui/win/include/pthread.h
new file mode 100644
index 0000000..689ba4a
--- /dev/null
+++ b/src/gui/win/include/pthread.h
@@ -0,0 +1,1363 @@
+/* This is an implementation of the threads API of POSIX 1003.1-2001.
+ *
+ * --------------------------------------------------------------------------
+ *
+ *      Pthreads-win32 - POSIX Threads Library for Win32
+ *      Copyright(C) 1998 John E. Bossom
+ *      Copyright(C) 1999,2005 Pthreads-win32 contributors
+ *
+ *      Contact Email: rpj at callisto.canberra.edu.au
+ *
+ *      The current list of contributors is contained
+ *      in the file CONTRIBUTORS included with the source
+ *      code distribution. The list can also be seen at the
+ *      following World Wide Web location:
+ *      http://sources.redhat.com/pthreads-win32/contributors.html
+ *
+ *      This library is free software; you can redistribute it and/or
+ *      modify it under the terms of the GNU Lesser General Public
+ *      License as published by the Free Software Foundation; either
+ *      version 2 of the License, or (at your option) any later version.
+ *
+ *      This 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
+ *      Lesser General Public License for more details.
+ *
+ *      You should have received a copy of the GNU Lesser General Public
+ *      License along with this library in the file COPYING.LIB;
+ *      if not, write to the Free Software Foundation, Inc.,
+ *      59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+ */
+
+#if !defined( PTHREAD_H )
+#define PTHREAD_H
+
+/*
+ * See the README file for an explanation of the pthreads-win32 version
+ * numbering scheme and how the DLL is named etc.
+ */
+#define PTW32_VERSION 2,7,0,0
+#define PTW32_VERSION_STRING "2, 7, 0, 0\0"
+
+/* There are three implementations of cancel cleanup.
+ * Note that pthread.h is included in both application
+ * compilation units and also internally for the library.
+ * The code here and within the library aims to work
+ * for all reasonable combinations of environments.
+ *
+ * The three implementations are:
+ *
+ *   WIN32 SEH
+ *   C
+ *   C++
+ *
+ * Please note that exiting a push/pop block via
+ * "return", "exit", "break", or "continue" will
+ * lead to different behaviour amongst applications
+ * depending upon whether the library was built
+ * using SEH, C++, or C. For example, a library built
+ * with SEH will call the cleanup routine, while both
+ * C++ and C built versions will not.
+ */
+
+/*
+ * Define defaults for cleanup code.
+ * Note: Unless the build explicitly defines one of the following, then
+ * we default to standard C style cleanup. This style uses setjmp/longjmp
+ * in the cancelation and thread exit implementations and therefore won't
+ * do stack unwinding if linked to applications that have it (e.g.
+ * C++ apps). This is currently consistent with most/all commercial Unix
+ * POSIX threads implementations.
+ */
+#if !defined( __CLEANUP_SEH ) && !defined( __CLEANUP_CXX ) && !defined( __CLEANUP_C )
+# define __CLEANUP_C
+#endif
+
+#if defined( __CLEANUP_SEH ) && ( !defined( _MSC_VER ) && !defined(PTW32_RC_MSC))
+#error ERROR [__FILE__, line __LINE__]: SEH is not supported for this compiler.
+#endif
+
+/*
+ * Stop here if we are being included by the resource compiler.
+ */
+#ifndef RC_INVOKED
+
+#undef PTW32_LEVEL
+
+#if defined(_POSIX_SOURCE)
+#define PTW32_LEVEL 0
+/* Early POSIX */
+#endif
+
+#if defined(_POSIX_C_SOURCE) && _POSIX_C_SOURCE >= 199309
+#undef PTW32_LEVEL
+#define PTW32_LEVEL 1
+/* Include 1b, 1c and 1d */
+#endif
+
+#if defined(INCLUDE_NP)
+#undef PTW32_LEVEL
+#define PTW32_LEVEL 2
+/* Include Non-Portable extensions */
+#endif
+
+#define PTW32_LEVEL_MAX 3
+
+#if !defined(PTW32_LEVEL)
+#define PTW32_LEVEL PTW32_LEVEL_MAX
+/* Include everything */
+#endif
+
+#ifdef _UWIN
+#   define HAVE_STRUCT_TIMESPEC 1
+#   define HAVE_SIGNAL_H        1
+#   undef HAVE_CONFIG_H
+#   pragma comment(lib, "pthread")
+#endif
+
+/*
+ * -------------------------------------------------------------
+ *
+ *
+ * Module: pthread.h
+ *
+ * Purpose:
+ *      Provides an implementation of PThreads based upon the
+ *      standard:
+ *
+ *              POSIX 1003.1-2001
+ *  and
+ *    The Single Unix Specification version 3
+ *
+ *    (these two are equivalent)
+ *
+ *      in order to enhance code portability between Windows,
+ *  various commercial Unix implementations, and Linux.
+ *
+ *      See the ANNOUNCE file for a full list of conforming
+ *      routines and defined constants, and a list of missing
+ *      routines and constants not defined in this implementation.
+ *
+ * Authors:
+ *      There have been many contributors to this library.
+ *      The initial implementation was contributed by
+ *      John Bossom, and several others have provided major
+ *      sections or revisions of parts of the implementation.
+ *      Often significant effort has been contributed to
+ *      find and fix important bugs and other problems to
+ *      improve the reliability of the library, which sometimes
+ *      is not reflected in the amount of code which changed as
+ *      result.
+ *      As much as possible, the contributors are acknowledged
+ *      in the ChangeLog file in the source code distribution
+ *      where their changes are noted in detail.
+ *
+ *      Contributors are listed in the CONTRIBUTORS file.
+ *
+ *      As usual, all bouquets go to the contributors, and all
+ *      brickbats go to the project maintainer.
+ *
+ * Maintainer:
+ *      The code base for this project is coordinated and
+ *      eventually pre-tested, packaged, and made available by
+ *
+ *              Ross Johnson <rpj at callisto.canberra.edu.au>
+ *
+ * QA Testers:
+ *      Ultimately, the library is tested in the real world by
+ *      a host of competent and demanding scientists and
+ *      engineers who report bugs and/or provide solutions
+ *      which are then fixed or incorporated into subsequent
+ *      versions of the library. Each time a bug is fixed, a
+ *      test case is written to prove the fix and ensure
+ *      that later changes to the code don't reintroduce the
+ *      same error. The number of test cases is slowly growing
+ *      and therefore so is the code reliability.
+ *
+ * Compliance:
+ *      See the file ANNOUNCE for the list of implemented
+ *      and not-implemented routines and defined options.
+ *      Of course, these are all defined is this file as well.
+ *
+ * Web site:
+ *      The source code and other information about this library
+ *      are available from
+ *
+ *              http://sources.redhat.com/pthreads-win32/
+ *
+ * -------------------------------------------------------------
+ */
+
+/* Try to avoid including windows.h */
+#if defined(__MINGW32__) && defined(__cplusplus)
+#define PTW32_INCLUDE_WINDOWS_H
+#endif
+
+#ifdef PTW32_INCLUDE_WINDOWS_H
+#include <windows.h>
+#endif
+
+#if defined(_MSC_VER) && _MSC_VER < 1300 || defined(__DMC__)
+/*
+ * VC++6.0 or early compiler's header has no DWORD_PTR type.
+ */
+typedef unsigned long DWORD_PTR;
+#endif
+/*
+ * -----------------
+ * autoconf switches
+ * -----------------
+ */
+
+#if HAVE_CONFIG_H
+#include "config.h"
+#endif /* HAVE_CONFIG_H */
+
+#ifndef NEED_FTIME
+#include <time.h>
+#else /* NEED_FTIME */
+/* use native WIN32 time API */
+#endif /* NEED_FTIME */
+
+#if HAVE_SIGNAL_H
+#include <signal.h>
+#endif /* HAVE_SIGNAL_H */
+
+#include <setjmp.h>
+#include <limits.h>
+
+/*
+ * Boolean values to make us independent of system includes.
+ */
+enum {
+    PTW32_FALSE = 0,
+    PTW32_TRUE = (! PTW32_FALSE)
+};
+
+/*
+ * This is a duplicate of what is in the autoconf config.h,
+ * which is only used when building the pthread-win32 libraries.
+ */
+
+#ifndef PTW32_CONFIG_H
+#  if defined(WINCE)
+#    define NEED_ERRNO
+#    define NEED_SEM
+#  endif
+#  if defined(_UWIN) || defined(__MINGW32__)
+#    define HAVE_MODE_T
+#  endif
+#endif
+
+/*
+ *
+ */
+
+#if PTW32_LEVEL >= PTW32_LEVEL_MAX
+#ifdef NEED_ERRNO
+#include "need_errno.h"
+#else
+#include <errno.h>
+#endif
+#endif /* PTW32_LEVEL >= PTW32_LEVEL_MAX */
+
+/*
+ * Several systems don't define some error numbers.
+ */
+#ifndef ENOTSUP
+#  define ENOTSUP 48   /* This is the value in Solaris. */
+#endif
+
+#ifndef ETIMEDOUT
+#  define ETIMEDOUT 10060     /* This is the value in winsock.h. */
+#endif
+
+#ifndef ENOSYS
+#  define ENOSYS 140     /* Semi-arbitrary value */
+#endif
+
+#ifndef EDEADLK
+#  ifdef EDEADLOCK
+#    define EDEADLK EDEADLOCK
+#  else
+#    define EDEADLK 36     /* This is the value in MSVC. */
+#  endif
+#endif
+
+#include <sched.h>
+
+/*
+ * To avoid including windows.h we define only those things that we
+ * actually need from it.
+ */
+#ifndef PTW32_INCLUDE_WINDOWS_H
+#ifndef HANDLE
+# define PTW32__HANDLE_DEF
+# define HANDLE void *
+#endif
+#ifndef DWORD
+# define PTW32__DWORD_DEF
+# define DWORD unsigned long
+#endif
+#endif
+
+#ifndef HAVE_STRUCT_TIMESPEC
+#define HAVE_STRUCT_TIMESPEC 1
+struct timespec {
+    long tv_sec;
+    long tv_nsec;
+};
+#endif /* HAVE_STRUCT_TIMESPEC */
+
+#ifndef SIG_BLOCK
+#define SIG_BLOCK 0
+#endif /* SIG_BLOCK */
+
+#ifndef SIG_UNBLOCK
+#define SIG_UNBLOCK 1
+#endif /* SIG_UNBLOCK */
+
+#ifndef SIG_SETMASK
+#define SIG_SETMASK 2
+#endif /* SIG_SETMASK */
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif                          /* __cplusplus */
+
+    /*
+     * -------------------------------------------------------------
+     *
+     * POSIX 1003.1-2001 Options
+     * =========================
+     *
+     * Options are normally set in <unistd.h>, which is not provided
+     * with pthreads-win32.
+     *
+     * For conformance with the Single Unix Specification (version 3), all of the
+     * options below are defined, and have a value of either -1 (not supported)
+     * or 200112L (supported).
+     *
+     * These options can neither be left undefined nor have a value of 0, because
+     * either indicates that sysconf(), which is not implemented, may be used at
+     * runtime to check the status of the option.
+     *
+     * _POSIX_THREADS (== 200112L)
+     *                      If == 200112L, you can use threads
+     *
+     * _POSIX_THREAD_ATTR_STACKSIZE (== 200112L)
+     *                      If == 200112L, you can control the size of a thread's
+     *                      stack
+     *                              pthread_attr_getstacksize
+     *                              pthread_attr_setstacksize
+     *
+     * _POSIX_THREAD_ATTR_STACKADDR (== -1)
+     *                      If == 200112L, you can allocate and control a thread's
+     *                      stack. If not supported, the following functions
+     *                      will return ENOSYS, indicating they are not
+     *                      supported:
+     *                              pthread_attr_getstackaddr
+     *                              pthread_attr_setstackaddr
+     *
+     * _POSIX_THREAD_PRIORITY_SCHEDULING (== -1)
+     *                      If == 200112L, you can use realtime scheduling.
+     *                      This option indicates that the behaviour of some
+     *                      implemented functions conforms to the additional TPS
+     *                      requirements in the standard. E.g. rwlocks favour
+     *                      writers over readers when threads have equal priority.
+     *
+     * _POSIX_THREAD_PRIO_INHERIT (== -1)
+     *                      If == 200112L, you can create priority inheritance
+     *                      mutexes.
+     *                              pthread_mutexattr_getprotocol +
+     *                              pthread_mutexattr_setprotocol +
+     *
+     * _POSIX_THREAD_PRIO_PROTECT (== -1)
+     *                      If == 200112L, you can create priority ceiling mutexes
+     *                      Indicates the availability of:
+     *                              pthread_mutex_getprioceiling
+     *                              pthread_mutex_setprioceiling
+     *                              pthread_mutexattr_getprioceiling
+     *                              pthread_mutexattr_getprotocol     +
+     *                              pthread_mutexattr_setprioceiling
+     *                              pthread_mutexattr_setprotocol     +
+     *
+     * _POSIX_THREAD_PROCESS_SHARED (== -1)
+     *                      If set, you can create mutexes and condition
+     *                      variables that can be shared with another
+     *                      process.If set, indicates the availability
+     *                      of:
+     *                              pthread_mutexattr_getpshared
+     *                              pthread_mutexattr_setpshared
+     *                              pthread_condattr_getpshared
+     *                              pthread_condattr_setpshared
+     *
+     * _POSIX_THREAD_SAFE_FUNCTIONS (== 200112L)
+     *                      If == 200112L you can use the special *_r library
+     *                      functions that provide thread-safe behaviour
+     *
+     * _POSIX_READER_WRITER_LOCKS (== 200112L)
+     *                      If == 200112L, you can use read/write locks
+     *
+     * _POSIX_SPIN_LOCKS (== 200112L)
+     *                      If == 200112L, you can use spin locks
+     *
+     * _POSIX_BARRIERS (== 200112L)
+     *                      If == 200112L, you can use barriers
+     *
+     *      + These functions provide both 'inherit' and/or
+     *        'protect' protocol, based upon these macro
+     *        settings.
+     *
+     * -------------------------------------------------------------
+     */
+
+    /*
+     * POSIX Options
+     */
+#undef _POSIX_THREADS
+#define _POSIX_THREADS 200112L
+
+#undef _POSIX_READER_WRITER_LOCKS
+#define _POSIX_READER_WRITER_LOCKS 200112L
+
+#undef _POSIX_SPIN_LOCKS
+#define _POSIX_SPIN_LOCKS 200112L
+
+#undef _POSIX_BARRIERS
+#define _POSIX_BARRIERS 200112L
+
+#undef _POSIX_THREAD_SAFE_FUNCTIONS
+#define _POSIX_THREAD_SAFE_FUNCTIONS 200112L
+
+#undef _POSIX_THREAD_ATTR_STACKSIZE
+#define _POSIX_THREAD_ATTR_STACKSIZE 200112L
+
+    /*
+     * The following options are not supported
+     */
+#undef _POSIX_THREAD_ATTR_STACKADDR
+#define _POSIX_THREAD_ATTR_STACKADDR -1
+
+#undef _POSIX_THREAD_PRIO_INHERIT
+#define _POSIX_THREAD_PRIO_INHERIT -1
+
+#undef _POSIX_THREAD_PRIO_PROTECT
+#define _POSIX_THREAD_PRIO_PROTECT -1
+
+    /* TPS is not fully supported.  */
+#undef _POSIX_THREAD_PRIORITY_SCHEDULING
+#define _POSIX_THREAD_PRIORITY_SCHEDULING -1
+
+#undef _POSIX_THREAD_PROCESS_SHARED
+#define _POSIX_THREAD_PROCESS_SHARED -1
+
+
+    /*
+     * POSIX 1003.1-2001 Limits
+     * ===========================
+     *
+     * These limits are normally set in <limits.h>, which is not provided with
+     * pthreads-win32.
+     *
+     * PTHREAD_DESTRUCTOR_ITERATIONS
+     *                      Maximum number of attempts to destroy
+     *                      a thread's thread-specific data on
+     *                      termination (must be at least 4)
+     *
+     * PTHREAD_KEYS_MAX
+     *                      Maximum number of thread-specific data keys
+     *                      available per process (must be at least 128)
+     *
+     * PTHREAD_STACK_MIN
+     *                      Minimum supported stack size for a thread
+     *
+     * PTHREAD_THREADS_MAX
+     *                      Maximum number of threads supported per
+     *                      process (must be at least 64).
+     *
+     * SEM_NSEMS_MAX
+     *                      The maximum number of semaphores a process can have.
+     *                      (must be at least 256)
+     *
+     * SEM_VALUE_MAX
+     *                      The maximum value a semaphore can have.
+     *                      (must be at least 32767)
+     *
+     */
+#undef _POSIX_THREAD_DESTRUCTOR_ITERATIONS
+#define _POSIX_THREAD_DESTRUCTOR_ITERATIONS     4
+
+#undef PTHREAD_DESTRUCTOR_ITERATIONS
+#define PTHREAD_DESTRUCTOR_ITERATIONS           _POSIX_THREAD_DESTRUCTOR_ITERATIONS
+
+#undef _POSIX_THREAD_KEYS_MAX
+#define _POSIX_THREAD_KEYS_MAX                  128
+
+#undef PTHREAD_KEYS_MAX
+#define PTHREAD_KEYS_MAX                        _POSIX_THREAD_KEYS_MAX
+
+#undef PTHREAD_STACK_MIN
+#define PTHREAD_STACK_MIN                       0
+
+#undef _POSIX_THREAD_THREADS_MAX
+#define _POSIX_THREAD_THREADS_MAX               64
+
+    /* Arbitrary value */
+#undef PTHREAD_THREADS_MAX
+#define PTHREAD_THREADS_MAX                     2019
+
+#undef _POSIX_SEM_NSEMS_MAX
+#define _POSIX_SEM_NSEMS_MAX                    256
+
+    /* Arbitrary value */
+#undef SEM_NSEMS_MAX
+#define SEM_NSEMS_MAX                           1024
+
+#undef _POSIX_SEM_VALUE_MAX
+#define _POSIX_SEM_VALUE_MAX                    32767
+
+#undef SEM_VALUE_MAX
+#define SEM_VALUE_MAX                           INT_MAX
+
+
+#if __GNUC__ && ! defined (__declspec)
+# error Please upgrade your GNU compiler to one that supports __declspec.
+#endif
+
+    /*
+     * When building the DLL code, you should define PTW32_BUILD so that
+     * the variables/functions are exported correctly. When using the DLL,
+     * do NOT define PTW32_BUILD, and then the variables/functions will
+     * be imported correctly.
+     */
+#ifndef PTW32_STATIC_LIB
+#  ifdef PTW32_BUILD
+#    define PTW32_DLLPORT __declspec (dllexport)
+#  else
+#    define PTW32_DLLPORT __declspec (dllimport)
+#  endif
+#else
+#  define PTW32_DLLPORT
+#endif
+
+    /*
+     * The Open Watcom C/C++ compiler uses a non-standard calling convention
+     * that passes function args in registers unless __cdecl is explicitly specified
+     * in exposed function prototypes.
+     *
+     * We force all calls to cdecl even though this could slow Watcom code down
+     * slightly. If you know that the Watcom compiler will be used to build both
+     * the DLL and application, then you can probably define this as a null string.
+     * Remember that pthread.h (this file) is used for both the DLL and application builds.
+     */
+#define PTW32_CDECL __cdecl
+
+#if defined(_UWIN) && PTW32_LEVEL >= PTW32_LEVEL_MAX
+#   include     <sys/types.h>
+#else
+    /*
+     * Generic handle type - intended to extend uniqueness beyond
+     * that available with a simple pointer. It should scale for either
+     * IA-32 or IA-64.
+     */
+    typedef struct {
+        void * p;                   /* Pointer to actual object */
+        unsigned int x;             /* Extra information - reuse count etc */
+    } ptw32_handle_t;
+
+    typedef ptw32_handle_t pthread_t;
+    typedef struct pthread_attr_t_ * pthread_attr_t;
+    typedef struct pthread_once_t_ pthread_once_t;
+    typedef struct pthread_key_t_ * pthread_key_t;
+    typedef struct pthread_mutex_t_ * pthread_mutex_t;
+    typedef struct pthread_mutexattr_t_ * pthread_mutexattr_t;
+    typedef struct pthread_cond_t_ * pthread_cond_t;
+    typedef struct pthread_condattr_t_ * pthread_condattr_t;
+#endif
+    typedef struct pthread_rwlock_t_ * pthread_rwlock_t;
+    typedef struct pthread_rwlockattr_t_ * pthread_rwlockattr_t;
+    typedef struct pthread_spinlock_t_ * pthread_spinlock_t;
+    typedef struct pthread_barrier_t_ * pthread_barrier_t;
+    typedef struct pthread_barrierattr_t_ * pthread_barrierattr_t;
+
+    /*
+     * ====================
+     * ====================
+     * POSIX Threads
+     * ====================
+     * ====================
+     */
+
+    enum {
+        /*
+         * pthread_attr_{get,set}detachstate
+         */
+        PTHREAD_CREATE_JOINABLE       = 0,  /* Default */
+        PTHREAD_CREATE_DETACHED       = 1,
+
+        /*
+         * pthread_attr_{get,set}inheritsched
+         */
+        PTHREAD_INHERIT_SCHED         = 0,
+        PTHREAD_EXPLICIT_SCHED        = 1,  /* Default */
+
+        /*
+         * pthread_{get,set}scope
+         */
+        PTHREAD_SCOPE_PROCESS         = 0,
+        PTHREAD_SCOPE_SYSTEM          = 1,  /* Default */
+
+        /*
+         * pthread_setcancelstate paramters
+         */
+        PTHREAD_CANCEL_ENABLE         = 0,  /* Default */
+        PTHREAD_CANCEL_DISABLE        = 1,
+
+        /*
+         * pthread_setcanceltype parameters
+         */
+        PTHREAD_CANCEL_ASYNCHRONOUS   = 0,
+        PTHREAD_CANCEL_DEFERRED       = 1,  /* Default */
+
+        /*
+         * pthread_mutexattr_{get,set}pshared
+         * pthread_condattr_{get,set}pshared
+         */
+        PTHREAD_PROCESS_PRIVATE       = 0,
+        PTHREAD_PROCESS_SHARED        = 1,
+
+        /*
+         * pthread_barrier_wait
+         */
+        PTHREAD_BARRIER_SERIAL_THREAD = -1
+    };
+
+    /*
+     * ====================
+     * ====================
+     * Cancelation
+     * ====================
+     * ====================
+     */
+#define PTHREAD_CANCELED       ((void *) -1)
+
+
+    /*
+     * ====================
+     * ====================
+     * Once Key
+     * ====================
+     * ====================
+     */
+#define PTHREAD_ONCE_INIT       { PTW32_FALSE, 0, 0, 0}
+
+    struct pthread_once_t_ {
+        int          done;        /* indicates if user function has been executed */
+        void *       lock;
+        int          reserved1;
+        int          reserved2;
+    };
+
+
+    /*
+     * ====================
+     * ====================
+     * Object initialisers
+     * ====================
+     * ====================
+     */
+#define PTHREAD_MUTEX_INITIALIZER ((pthread_mutex_t) -1)
+#define PTHREAD_RECURSIVE_MUTEX_INITIALIZER ((pthread_mutex_t) -2)
+#define PTHREAD_ERRORCHECK_MUTEX_INITIALIZER ((pthread_mutex_t) -3)
+
+    /*
+     * Compatibility with LinuxThreads
+     */
+#define PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP PTHREAD_RECURSIVE_MUTEX_INITIALIZER
+#define PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP PTHREAD_ERRORCHECK_MUTEX_INITIALIZER
+
+#define PTHREAD_COND_INITIALIZER ((pthread_cond_t) -1)
+
+#define PTHREAD_RWLOCK_INITIALIZER ((pthread_rwlock_t) -1)
+
+#define PTHREAD_SPINLOCK_INITIALIZER ((pthread_spinlock_t) -1)
+
+
+    /*
+     * Mutex types.
+     */
+    enum {
+        /* Compatibility with LinuxThreads */
+        PTHREAD_MUTEX_FAST_NP,
+        PTHREAD_MUTEX_RECURSIVE_NP,
+        PTHREAD_MUTEX_ERRORCHECK_NP,
+        PTHREAD_MUTEX_TIMED_NP = PTHREAD_MUTEX_FAST_NP,
+        PTHREAD_MUTEX_ADAPTIVE_NP = PTHREAD_MUTEX_FAST_NP,
+        /* For compatibility with POSIX */
+        PTHREAD_MUTEX_NORMAL = PTHREAD_MUTEX_FAST_NP,
+        PTHREAD_MUTEX_RECURSIVE = PTHREAD_MUTEX_RECURSIVE_NP,
+        PTHREAD_MUTEX_ERRORCHECK = PTHREAD_MUTEX_ERRORCHECK_NP,
+        PTHREAD_MUTEX_DEFAULT = PTHREAD_MUTEX_NORMAL
+    };
+
+
+    typedef struct ptw32_cleanup_t ptw32_cleanup_t;
+
+#if defined(_MSC_VER)
+    /* Disable MSVC 'anachronism used' warning */
+#pragma warning( disable : 4229 )
+#endif
+
+    typedef void (* PTW32_CDECL ptw32_cleanup_callback_t)(void *);
+
+#if defined(_MSC_VER)
+#pragma warning( default : 4229 )
+#endif
+
+    struct ptw32_cleanup_t {
+        ptw32_cleanup_callback_t routine;
+        void *arg;
+        struct ptw32_cleanup_t *prev;
+    };
+
+#ifdef __CLEANUP_SEH
+    /*
+     * WIN32 SEH version of cancel cleanup.
+     */
+
+#define pthread_cleanup_push( _rout, _arg ) \
+        { \
+            ptw32_cleanup_t     _cleanup; \
+            \
+        _cleanup.routine        = (ptw32_cleanup_callback_t)(_rout); \
+            _cleanup.arg        = (_arg); \
+            __try \
+              { \
+ 
+#define pthread_cleanup_pop( _execute ) \
+              } \
+            __finally \
+                { \
+                    if( _execute || AbnormalTermination()) \
+                      { \
+                          (*(_cleanup.routine))( _cleanup.arg ); \
+                      } \
+                } \
+        }
+
+#else /* __CLEANUP_SEH */
+
+#ifdef __CLEANUP_C
+
+    /*
+     * C implementation of PThreads cancel cleanup
+     */
+
+#define pthread_cleanup_push( _rout, _arg ) \
+        { \
+            ptw32_cleanup_t     _cleanup; \
+            \
+            ptw32_push_cleanup( &_cleanup, (ptw32_cleanup_callback_t) (_rout), (_arg) ); \
+ 
+#define pthread_cleanup_pop( _execute ) \
+            (void) ptw32_pop_cleanup( _execute ); \
+        }
+
+#else /* __CLEANUP_C */
+
+#ifdef __CLEANUP_CXX
+
+    /*
+     * C++ version of cancel cleanup.
+     * - John E. Bossom.
+     */
+
+    class PThreadCleanup
+    {
+        /*
+         * PThreadCleanup
+         *
+         * Purpose
+         *      This class is a C++ helper class that is
+         *      used to implement pthread_cleanup_push/
+         *      pthread_cleanup_pop.
+         *      The destructor of this class automatically
+         *      pops the pushed cleanup routine regardless
+         *      of how the code exits the scope
+         *      (i.e. such as by an exception)
+         */
+        ptw32_cleanup_callback_t cleanUpRout;
+        void    *       obj;
+        int             executeIt;
+
+    public:
+        PThreadCleanup() :
+            cleanUpRout( 0 ),
+            obj( 0 ),
+            executeIt( 0 )
+    /*
+     * No cleanup performed
+     */
+        {
+        }
+
+        PThreadCleanup(
+            ptw32_cleanup_callback_t routine,
+            void    *       arg ) :
+            cleanUpRout( routine ),
+            obj( arg ),
+            executeIt( 1 )
+    /*
+     * Registers a cleanup routine for 'arg'
+     */
+        {
+        }
+
+        ~PThreadCleanup() {
+            if ( executeIt && ((void *) cleanUpRout != (void *) 0) ) {
+                (void) (*cleanUpRout)( obj );
+            }
+        }
+
+        void execute( int exec ) {
+            executeIt = exec;
+        }
+    };
+
+    /*
+     * C++ implementation of PThreads cancel cleanup;
+     * This implementation takes advantage of a helper
+     * class who's destructor automatically calls the
+     * cleanup routine if we exit our scope weirdly
+     */
+#define pthread_cleanup_push( _rout, _arg ) \
+        { \
+            PThreadCleanup  cleanup((ptw32_cleanup_callback_t)(_rout), \
+                                    (void *) (_arg) );
+
+#define pthread_cleanup_pop( _execute ) \
+            cleanup.execute( _execute ); \
+        }
+
+#else
+
+#error ERROR [__FILE__, line __LINE__]: Cleanup type undefined.
+
+#endif /* __CLEANUP_CXX */
+
+#endif /* __CLEANUP_C */
+
+#endif /* __CLEANUP_SEH */
+
+    /*
+     * ===============
+     * ===============
+     * Methods
+     * ===============
+     * ===============
+     */
+
+    /*
+     * PThread Attribute Functions
+     */
+    PTW32_DLLPORT int PTW32_CDECL pthread_attr_init (pthread_attr_t * attr);
+
+    PTW32_DLLPORT int PTW32_CDECL pthread_attr_destroy (pthread_attr_t * attr);
+
+    PTW32_DLLPORT int PTW32_CDECL pthread_attr_getdetachstate (const pthread_attr_t * attr,
+            int *detachstate);
+
+    PTW32_DLLPORT int PTW32_CDECL pthread_attr_getstackaddr (const pthread_attr_t * attr,
+            void **stackaddr);
+
+    PTW32_DLLPORT int PTW32_CDECL pthread_attr_getstacksize (const pthread_attr_t * attr,
+            size_t * stacksize);
+
+    PTW32_DLLPORT int PTW32_CDECL pthread_attr_setdetachstate (pthread_attr_t * attr,
+            int detachstate);
+
+    PTW32_DLLPORT int PTW32_CDECL pthread_attr_setstackaddr (pthread_attr_t * attr,
+            void *stackaddr);
+
+    PTW32_DLLPORT int PTW32_CDECL pthread_attr_setstacksize (pthread_attr_t * attr,
+            size_t stacksize);
+
+    PTW32_DLLPORT int PTW32_CDECL pthread_attr_getschedparam (const pthread_attr_t *attr,
+            struct sched_param *param);
+
+    PTW32_DLLPORT int PTW32_CDECL pthread_attr_setschedparam (pthread_attr_t *attr,
+            const struct sched_param *param);
+
+    PTW32_DLLPORT int PTW32_CDECL pthread_attr_setschedpolicy (pthread_attr_t *,
+            int);
+
+    PTW32_DLLPORT int PTW32_CDECL pthread_attr_getschedpolicy (pthread_attr_t *,
+            int *);
+
+    PTW32_DLLPORT int PTW32_CDECL pthread_attr_setinheritsched(pthread_attr_t * attr,
+            int inheritsched);
+
+    PTW32_DLLPORT int PTW32_CDECL pthread_attr_getinheritsched(pthread_attr_t * attr,
+            int * inheritsched);
+
+    PTW32_DLLPORT int PTW32_CDECL pthread_attr_setscope (pthread_attr_t *,
+            int);
+
+    PTW32_DLLPORT int PTW32_CDECL pthread_attr_getscope (const pthread_attr_t *,
+            int *);
+
+    /*
+     * PThread Functions
+     */
+    PTW32_DLLPORT int PTW32_CDECL pthread_create (pthread_t * tid,
+            const pthread_attr_t * attr,
+            void *(*start) (void *),
+            void *arg);
+
+    PTW32_DLLPORT int PTW32_CDECL pthread_detach (pthread_t tid);
+
+    PTW32_DLLPORT int PTW32_CDECL pthread_equal (pthread_t t1,
+            pthread_t t2);
+
+    PTW32_DLLPORT void PTW32_CDECL pthread_exit (void *value_ptr);
+
+    PTW32_DLLPORT int PTW32_CDECL pthread_join (pthread_t thread,
+            void **value_ptr);
+
+    PTW32_DLLPORT pthread_t PTW32_CDECL pthread_self (void);
+
+    PTW32_DLLPORT int PTW32_CDECL pthread_cancel (pthread_t thread);
+
+    PTW32_DLLPORT int PTW32_CDECL pthread_setcancelstate (int state,
+            int *oldstate);
+
+    PTW32_DLLPORT int PTW32_CDECL pthread_setcanceltype (int type,
+            int *oldtype);
+
+    PTW32_DLLPORT void PTW32_CDECL pthread_testcancel (void);
+
+    PTW32_DLLPORT int PTW32_CDECL pthread_once (pthread_once_t * once_control,
+            void (*init_routine) (void));
+
+#if PTW32_LEVEL >= PTW32_LEVEL_MAX
+    PTW32_DLLPORT ptw32_cleanup_t * PTW32_CDECL ptw32_pop_cleanup (int execute);
+
+    PTW32_DLLPORT void PTW32_CDECL ptw32_push_cleanup (ptw32_cleanup_t * cleanup,
+            void (*routine) (void *),
+            void *arg);
+#endif /* PTW32_LEVEL >= PTW32_LEVEL_MAX */
+
+    /*
+     * Thread Specific Data Functions
+     */
+    PTW32_DLLPORT int PTW32_CDECL pthread_key_create (pthread_key_t * key,
+            void (*destructor) (void *));
+
+    PTW32_DLLPORT int PTW32_CDECL pthread_key_delete (pthread_key_t key);
+
+    PTW32_DLLPORT int PTW32_CDECL pthread_setspecific (pthread_key_t key,
+            const void *value);
+
+    PTW32_DLLPORT void * PTW32_CDECL pthread_getspecific (pthread_key_t key);
+
+
+    /*
+     * Mutex Attribute Functions
+     */
+    PTW32_DLLPORT int PTW32_CDECL pthread_mutexattr_init (pthread_mutexattr_t * attr);
+
+    PTW32_DLLPORT int PTW32_CDECL pthread_mutexattr_destroy (pthread_mutexattr_t * attr);
+
+    PTW32_DLLPORT int PTW32_CDECL pthread_mutexattr_getpshared (const pthread_mutexattr_t
+            * attr,
+            int *pshared);
+
+    PTW32_DLLPORT int PTW32_CDECL pthread_mutexattr_setpshared (pthread_mutexattr_t * attr,
+            int pshared);
+
+    PTW32_DLLPORT int PTW32_CDECL pthread_mutexattr_settype (pthread_mutexattr_t * attr, int kind);
+    PTW32_DLLPORT int PTW32_CDECL pthread_mutexattr_gettype (pthread_mutexattr_t * attr, int *kind);
+
+    /*
+     * Barrier Attribute Functions
+     */
+    PTW32_DLLPORT int PTW32_CDECL pthread_barrierattr_init (pthread_barrierattr_t * attr);
+
+    PTW32_DLLPORT int PTW32_CDECL pthread_barrierattr_destroy (pthread_barrierattr_t * attr);
+
+    PTW32_DLLPORT int PTW32_CDECL pthread_barrierattr_getpshared (const pthread_barrierattr_t
+            * attr,
+            int *pshared);
+
+    PTW32_DLLPORT int PTW32_CDECL pthread_barrierattr_setpshared (pthread_barrierattr_t * attr,
+            int pshared);
+
+    /*
+     * Mutex Functions
+     */
+    PTW32_DLLPORT int PTW32_CDECL pthread_mutex_init (pthread_mutex_t * mutex,
+            const pthread_mutexattr_t * attr);
+
+    PTW32_DLLPORT int PTW32_CDECL pthread_mutex_destroy (pthread_mutex_t * mutex);
+
+    PTW32_DLLPORT int PTW32_CDECL pthread_mutex_lock (pthread_mutex_t * mutex);
+
+    PTW32_DLLPORT int PTW32_CDECL pthread_mutex_timedlock(pthread_mutex_t *mutex,
+            const struct timespec *abstime);
+
+    PTW32_DLLPORT int PTW32_CDECL pthread_mutex_trylock (pthread_mutex_t * mutex);
+
+    PTW32_DLLPORT int PTW32_CDECL pthread_mutex_unlock (pthread_mutex_t * mutex);
+
+    /*
+     * Spinlock Functions
+     */
+    PTW32_DLLPORT int PTW32_CDECL pthread_spin_init (pthread_spinlock_t * lock, int pshared);
+
+    PTW32_DLLPORT int PTW32_CDECL pthread_spin_destroy (pthread_spinlock_t * lock);
+
+    PTW32_DLLPORT int PTW32_CDECL pthread_spin_lock (pthread_spinlock_t * lock);
+
+    PTW32_DLLPORT int PTW32_CDECL pthread_spin_trylock (pthread_spinlock_t * lock);
+
+    PTW32_DLLPORT int PTW32_CDECL pthread_spin_unlock (pthread_spinlock_t * lock);
+
+    /*
+     * Barrier Functions
+     */
+    PTW32_DLLPORT int PTW32_CDECL pthread_barrier_init (pthread_barrier_t * barrier,
+            const pthread_barrierattr_t * attr,
+            unsigned int count);
+
+    PTW32_DLLPORT int PTW32_CDECL pthread_barrier_destroy (pthread_barrier_t * barrier);
+
+    PTW32_DLLPORT int PTW32_CDECL pthread_barrier_wait (pthread_barrier_t * barrier);
+
+    /*
+     * Condition Variable Attribute Functions
+     */
+    PTW32_DLLPORT int PTW32_CDECL pthread_condattr_init (pthread_condattr_t * attr);
+
+    PTW32_DLLPORT int PTW32_CDECL pthread_condattr_destroy (pthread_condattr_t * attr);
+
+    PTW32_DLLPORT int PTW32_CDECL pthread_condattr_getpshared (const pthread_condattr_t * attr,
+            int *pshared);
+
+    PTW32_DLLPORT int PTW32_CDECL pthread_condattr_setpshared (pthread_condattr_t * attr,
+            int pshared);
+
+    /*
+     * Condition Variable Functions
+     */
+    PTW32_DLLPORT int PTW32_CDECL pthread_cond_init (pthread_cond_t * cond,
+            const pthread_condattr_t * attr);
+
+    PTW32_DLLPORT int PTW32_CDECL pthread_cond_destroy (pthread_cond_t * cond);
+
+    PTW32_DLLPORT int PTW32_CDECL pthread_cond_wait (pthread_cond_t * cond,
+            pthread_mutex_t * mutex);
+
+    PTW32_DLLPORT int PTW32_CDECL pthread_cond_timedwait (pthread_cond_t * cond,
+            pthread_mutex_t * mutex,
+            const struct timespec *abstime);
+
+    PTW32_DLLPORT int PTW32_CDECL pthread_cond_signal (pthread_cond_t * cond);
+
+    PTW32_DLLPORT int PTW32_CDECL pthread_cond_broadcast (pthread_cond_t * cond);
+
+    /*
+     * Scheduling
+     */
+    PTW32_DLLPORT int PTW32_CDECL pthread_setschedparam (pthread_t thread,
+            int policy,
+            const struct sched_param *param);
+
+    PTW32_DLLPORT int PTW32_CDECL pthread_getschedparam (pthread_t thread,
+            int *policy,
+            struct sched_param *param);
+
+    PTW32_DLLPORT int PTW32_CDECL pthread_setconcurrency (int);
+
+    PTW32_DLLPORT int PTW32_CDECL pthread_getconcurrency (void);
+
+    /*
+     * Read-Write Lock Functions
+     */
+    PTW32_DLLPORT int PTW32_CDECL pthread_rwlock_init(pthread_rwlock_t *lock,
+            const pthread_rwlockattr_t *attr);
+
+    PTW32_DLLPORT int PTW32_CDECL pthread_rwlock_destroy(pthread_rwlock_t *lock);
+
+    PTW32_DLLPORT int PTW32_CDECL pthread_rwlock_tryrdlock(pthread_rwlock_t *);
+
+    PTW32_DLLPORT int PTW32_CDECL pthread_rwlock_trywrlock(pthread_rwlock_t *);
+
+    PTW32_DLLPORT int PTW32_CDECL pthread_rwlock_rdlock(pthread_rwlock_t *lock);
+
+    PTW32_DLLPORT int PTW32_CDECL pthread_rwlock_timedrdlock(pthread_rwlock_t *lock,
+            const struct timespec *abstime);
+
+    PTW32_DLLPORT int PTW32_CDECL pthread_rwlock_wrlock(pthread_rwlock_t *lock);
+
+    PTW32_DLLPORT int PTW32_CDECL pthread_rwlock_timedwrlock(pthread_rwlock_t *lock,
+            const struct timespec *abstime);
+
+    PTW32_DLLPORT int PTW32_CDECL pthread_rwlock_unlock(pthread_rwlock_t *lock);
+
+    PTW32_DLLPORT int PTW32_CDECL pthread_rwlockattr_init (pthread_rwlockattr_t * attr);
+
+    PTW32_DLLPORT int PTW32_CDECL pthread_rwlockattr_destroy (pthread_rwlockattr_t * attr);
+
+    PTW32_DLLPORT int PTW32_CDECL pthread_rwlockattr_getpshared (const pthread_rwlockattr_t * attr,
+            int *pshared);
+
+    PTW32_DLLPORT int PTW32_CDECL pthread_rwlockattr_setpshared (pthread_rwlockattr_t * attr,
+            int pshared);
+
+#if PTW32_LEVEL >= PTW32_LEVEL_MAX - 1
+
+    /*
+     * Signal Functions. Should be defined in <signal.h> but MSVC and MinGW32
+     * already have signal.h that don't define these.
+     */
+    PTW32_DLLPORT int PTW32_CDECL pthread_kill(pthread_t thread, int sig);
+
+    /*
+     * Non-portable functions
+     */
+
+    /*
+     * Compatibility with Linux.
+     */
+    PTW32_DLLPORT int PTW32_CDECL pthread_mutexattr_setkind_np(pthread_mutexattr_t * attr,
+            int kind);
+    PTW32_DLLPORT int PTW32_CDECL pthread_mutexattr_getkind_np(pthread_mutexattr_t * attr,
+            int *kind);
+
+    /*
+     * Possibly supported by other POSIX threads implementations
+     */
+    PTW32_DLLPORT int PTW32_CDECL pthread_delay_np (struct timespec * interval);
+    PTW32_DLLPORT int PTW32_CDECL pthread_num_processors_np(void);
+
+    /*
+     * Useful if an application wants to statically link
+     * the lib rather than load the DLL at run-time.
+     */
+    PTW32_DLLPORT int PTW32_CDECL pthread_win32_process_attach_np(void);
+    PTW32_DLLPORT int PTW32_CDECL pthread_win32_process_detach_np(void);
+    PTW32_DLLPORT int PTW32_CDECL pthread_win32_thread_attach_np(void);
+    PTW32_DLLPORT int PTW32_CDECL pthread_win32_thread_detach_np(void);
+
+    /*
+     * Features that are auto-detected at load/run time.
+     */
+    PTW32_DLLPORT int PTW32_CDECL pthread_win32_test_features_np(int);
+    enum ptw32_features {
+        PTW32_SYSTEM_INTERLOCKED_COMPARE_EXCHANGE = 0x0001, /* System provides it. */
+        PTW32_ALERTABLE_ASYNC_CANCEL              = 0x0002  /* Can cancel blocked threads. */
+    };
+
+    /*
+     * Register a system time change with the library.
+     * Causes the library to perform various functions
+     * in response to the change. Should be called whenever
+     * the application's top level window receives a
+     * WM_TIMECHANGE message. It can be passed directly to
+     * pthread_create() as a new thread if desired.
+     */
+    PTW32_DLLPORT void * PTW32_CDECL pthread_timechange_handler_np(void *);
+
+#endif /*PTW32_LEVEL >= PTW32_LEVEL_MAX - 1 */
+
+#if PTW32_LEVEL >= PTW32_LEVEL_MAX
+
+    /*
+     * Returns the Win32 HANDLE for the POSIX thread.
+     */
+    PTW32_DLLPORT HANDLE PTW32_CDECL pthread_getw32threadhandle_np(pthread_t thread);
+
+
+    /*
+     * Protected Methods
+     *
+     * This function blocks until the given WIN32 handle
+     * is signaled or pthread_cancel had been called.
+     * This function allows the caller to hook into the
+     * PThreads cancel mechanism. It is implemented using
+     *
+     *              WaitForMultipleObjects
+     *
+     * on 'waitHandle' and a manually reset WIN32 Event
+     * used to implement pthread_cancel. The 'timeout'
+     * argument to TimedWait is simply passed to
+     * WaitForMultipleObjects.
+     */
+    PTW32_DLLPORT int PTW32_CDECL pthreadCancelableWait (HANDLE waitHandle);
+    PTW32_DLLPORT int PTW32_CDECL pthreadCancelableTimedWait (HANDLE waitHandle,
+            DWORD timeout);
+
+#endif /* PTW32_LEVEL >= PTW32_LEVEL_MAX */
+
+    /*
+     * Thread-Safe C Runtime Library Mappings.
+     */
+#ifndef _UWIN
+#  if defined(NEED_ERRNO)
+    PTW32_DLLPORT int * PTW32_CDECL _errno( void );
+#  else
+#    ifndef errno
+#      if (defined(_MT) || defined(_DLL))
+    __declspec(dllimport) extern int * __cdecl _errno(void);
+#        define errno   (*_errno())
+#      endif
+#    endif
+#  endif
+#endif
+
+    /*
+     * WIN32 C runtime library had been made thread-safe
+     * without affecting the user interface. Provide
+     * mappings from the UNIX thread-safe versions to
+     * the standard C runtime library calls.
+     * Only provide function mappings for functions that
+     * actually exist on WIN32.
+     */
+
+#if !defined(__MINGW32__)
+#define strtok_r( _s, _sep, _lasts ) \
+        ( *(_lasts) = strtok( (_s), (_sep) ) )
+#endif /* !__MINGW32__ */
+
+#define asctime_r( _tm, _buf ) \
+        ( strcpy( (_buf), asctime( (_tm) ) ), \
+          (_buf) )
+
+#define ctime_r( _clock, _buf ) \
+        ( strcpy( (_buf), ctime( (_clock) ) ),  \
+          (_buf) )
+
+#define gmtime_r( _clock, _result ) \
+        ( *(_result) = *gmtime( (_clock) ), \
+          (_result) )
+
+#define localtime_r( _clock, _result ) \
+        ( *(_result) = *localtime( (_clock) ), \
+          (_result) )
+
+#define rand_r( _seed ) \
+        ( _seed == _seed? rand() : rand() )
+
+
+    /*
+     * Some compiler environments don't define some things.
+     */
+#if defined(__BORLANDC__)
+#  define _ftime ftime
+#  define _timeb timeb
+#endif
+
+#ifdef __cplusplus
+
+    /*
+     * Internal exceptions
+     */
+    class ptw32_exception {};
+    class ptw32_exception_cancel : public ptw32_exception {};
+    class ptw32_exception_exit   : public ptw32_exception {};
+
+#endif
+
+#if PTW32_LEVEL >= PTW32_LEVEL_MAX
+
+    /* FIXME: This is only required if the library was built using SEH */
+    /*
+     * Get internal SEH tag
+     */
+    PTW32_DLLPORT DWORD PTW32_CDECL ptw32_get_exception_services_code(void);
+
+#endif /* PTW32_LEVEL >= PTW32_LEVEL_MAX */
+
+#ifndef PTW32_BUILD
+
+#ifdef __CLEANUP_SEH
+
+    /*
+     * Redefine the SEH __except keyword to ensure that applications
+     * propagate our internal exceptions up to the library's internal handlers.
+     */
+#define __except( E ) \
+        __except( ( GetExceptionCode() == ptw32_get_exception_services_code() ) \
+                 ? EXCEPTION_CONTINUE_SEARCH : ( E ) )
+
+#endif /* __CLEANUP_SEH */
+
+#ifdef __CLEANUP_CXX
+
+    /*
+     * Redefine the C++ catch keyword to ensure that applications
+     * propagate our internal exceptions up to the library's internal handlers.
+     */
+#ifdef _MSC_VER
+    /*
+     * WARNING: Replace any 'catch( ... )' with 'PtW32CatchAll'
+     * if you want Pthread-Win32 cancelation and pthread_exit to work.
+     */
+
+#ifndef PtW32NoCatchWarn
+
+#pragma message("Specify \"/DPtW32NoCatchWarn\" compiler flag to skip this message.")
+#pragma message("------------------------------------------------------------------")
+#pragma message("When compiling applications with MSVC++ and C++ exception handling:")
+#pragma message("  Replace any 'catch( ... )' in routines called from POSIX threads")
+#pragma message("  with 'PtW32CatchAll' or 'CATCHALL' if you want POSIX thread")
+#pragma message("  cancelation and pthread_exit to work. For example:")
+#pragma message("")
+#pragma message("    #ifdef PtW32CatchAll")
+#pragma message("      PtW32CatchAll")
+#pragma message("    #else")
+#pragma message("      catch(...)")
+#pragma message("    #endif")
+#pragma message("        {")
+#pragma message("          /* Catchall block processing */")
+#pragma message("        }")
+#pragma message("------------------------------------------------------------------")
+
+#endif
+
+#define PtW32CatchAll \
+        catch( ptw32_exception & ) { throw; } \
+        catch( ... )
+
+#else /* _MSC_VER */
+
+#define catch( E ) \
+        catch( ptw32_exception & ) { throw; } \
+        catch( E )
+
+#endif /* _MSC_VER */
+
+#endif /* __CLEANUP_CXX */
+
+#endif /* ! PTW32_BUILD */
+
+#ifdef __cplusplus
+}                               /* End of extern "C" */
+#endif                          /* __cplusplus */
+
+#ifdef PTW32__HANDLE_DEF
+# undef HANDLE
+#endif
+#ifdef PTW32__DWORD_DEF
+# undef DWORD
+#endif
+
+#undef PTW32_LEVEL
+#undef PTW32_LEVEL_MAX
+
+#endif /* ! RC_INVOKED */
+
+#endif /* PTHREAD_H */
diff --git a/src/gui/win/include/sched.h b/src/gui/win/include/sched.h
new file mode 100644
index 0000000..551c9f1
--- /dev/null
+++ b/src/gui/win/include/sched.h
@@ -0,0 +1,178 @@
+/*
+ * Module: sched.h
+ *
+ * Purpose:
+ *      Provides an implementation of POSIX realtime extensions
+ *      as defined in
+ *
+ *              POSIX 1003.1b-1993      (POSIX.1b)
+ *
+ * --------------------------------------------------------------------------
+ *
+ *      Pthreads-win32 - POSIX Threads Library for Win32
+ *      Copyright(C) 1998 John E. Bossom
+ *      Copyright(C) 1999,2005 Pthreads-win32 contributors
+ *
+ *      Contact Email: rpj at callisto.canberra.edu.au
+ *
+ *      The current list of contributors is contained
+ *      in the file CONTRIBUTORS included with the source
+ *      code distribution. The list can also be seen at the
+ *      following World Wide Web location:
+ *      http://sources.redhat.com/pthreads-win32/contributors.html
+ *
+ *      This library is free software; you can redistribute it and/or
+ *      modify it under the terms of the GNU Lesser General Public
+ *      License as published by the Free Software Foundation; either
+ *      version 2 of the License, or (at your option) any later version.
+ *
+ *      This 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
+ *      Lesser General Public License for more details.
+ *
+ *      You should have received a copy of the GNU Lesser General Public
+ *      License along with this library in the file COPYING.LIB;
+ *      if not, write to the Free Software Foundation, Inc.,
+ *      59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+ */
+#ifndef _SCHED_H
+#define _SCHED_H
+
+#undef PTW32_LEVEL
+
+#if defined(_POSIX_SOURCE)
+#define PTW32_LEVEL 0
+/* Early POSIX */
+#endif
+
+#if defined(_POSIX_C_SOURCE) && _POSIX_C_SOURCE >= 199309
+#undef PTW32_LEVEL
+#define PTW32_LEVEL 1
+/* Include 1b, 1c and 1d */
+#endif
+
+#if defined(INCLUDE_NP)
+#undef PTW32_LEVEL
+#define PTW32_LEVEL 2
+/* Include Non-Portable extensions */
+#endif
+
+#define PTW32_LEVEL_MAX 3
+
+#if !defined(PTW32_LEVEL)
+#define PTW32_LEVEL PTW32_LEVEL_MAX
+/* Include everything */
+#endif
+
+
+#if __GNUC__ && ! defined (__declspec)
+# error Please upgrade your GNU compiler to one that supports __declspec.
+#endif
+
+/*
+ * When building the DLL code, you should define PTW32_BUILD so that
+ * the variables/functions are exported correctly. When using the DLL,
+ * do NOT define PTW32_BUILD, and then the variables/functions will
+ * be imported correctly.
+ */
+#ifndef PTW32_STATIC_LIB
+#  ifdef PTW32_BUILD
+#    define PTW32_DLLPORT __declspec (dllexport)
+#  else
+#    define PTW32_DLLPORT __declspec (dllimport)
+#  endif
+#else
+#  define PTW32_DLLPORT
+#endif
+
+/*
+ * This is a duplicate of what is in the autoconf config.h,
+ * which is only used when building the pthread-win32 libraries.
+ */
+
+#ifndef PTW32_CONFIG_H
+#  if defined(WINCE)
+#    define NEED_ERRNO
+#    define NEED_SEM
+#  endif
+#  if defined(_UWIN) || defined(__MINGW32__)
+#    define HAVE_MODE_T
+#  endif
+#endif
+
+/*
+ *
+ */
+
+#if PTW32_LEVEL >= PTW32_LEVEL_MAX
+#ifdef NEED_ERRNO
+#include "need_errno.h"
+#else
+#include <errno.h>
+#endif
+#endif /* PTW32_LEVEL >= PTW32_LEVEL_MAX */
+
+#if defined(__MINGW32__) || defined(_UWIN)
+#if PTW32_LEVEL >= PTW32_LEVEL_MAX
+/* For pid_t */
+#  include <sys/types.h>
+/* Required by Unix 98 */
+#  include <time.h>
+#endif /* PTW32_LEVEL >= PTW32_LEVEL_MAX */
+#else
+typedef int pid_t;
+#endif
+
+/* Thread scheduling policies */
+
+enum {
+    SCHED_OTHER = 0,
+    SCHED_FIFO,
+    SCHED_RR,
+    SCHED_MIN   = SCHED_OTHER,
+    SCHED_MAX   = SCHED_RR
+};
+
+struct sched_param {
+    int sched_priority;
+};
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif                          /* __cplusplus */
+
+    PTW32_DLLPORT int __cdecl sched_yield (void);
+
+    PTW32_DLLPORT int __cdecl sched_get_priority_min (int policy);
+
+    PTW32_DLLPORT int __cdecl sched_get_priority_max (int policy);
+
+    PTW32_DLLPORT int __cdecl sched_setscheduler (pid_t pid, int policy);
+
+    PTW32_DLLPORT int __cdecl sched_getscheduler (pid_t pid);
+
+    /*
+     * Note that this macro returns ENOTSUP rather than
+     * ENOSYS as might be expected. However, returning ENOSYS
+     * should mean that sched_get_priority_{min,max} are
+     * not implemented as well as sched_rr_get_interval.
+     * This is not the case, since we just don't support
+     * round-robin scheduling. Therefore I have chosen to
+     * return the same value as sched_setscheduler when
+     * SCHED_RR is passed to it.
+     */
+#define sched_rr_get_interval(_pid, _interval) \
+  ( errno = ENOTSUP, (int) -1 )
+
+
+#ifdef __cplusplus
+}                               /* End of extern "C" */
+#endif                          /* __cplusplus */
+
+#undef PTW32_LEVEL
+#undef PTW32_LEVEL_MAX
+
+#endif                          /* !_SCHED_H */
+
diff --git a/src/gui/win/include/semaphore.h b/src/gui/win/include/semaphore.h
new file mode 100644
index 0000000..533624f
--- /dev/null
+++ b/src/gui/win/include/semaphore.h
@@ -0,0 +1,166 @@
+/*
+ * Module: semaphore.h
+ *
+ * Purpose:
+ *  Semaphores aren't actually part of the PThreads standard.
+ *  They are defined by the POSIX Standard:
+ *
+ *      POSIX 1003.1b-1993  (POSIX.1b)
+ *
+ * --------------------------------------------------------------------------
+ *
+ *      Pthreads-win32 - POSIX Threads Library for Win32
+ *      Copyright(C) 1998 John E. Bossom
+ *      Copyright(C) 1999,2005 Pthreads-win32 contributors
+ *
+ *      Contact Email: rpj at callisto.canberra.edu.au
+ *
+ *      The current list of contributors is contained
+ *      in the file CONTRIBUTORS included with the source
+ *      code distribution. The list can also be seen at the
+ *      following World Wide Web location:
+ *      http://sources.redhat.com/pthreads-win32/contributors.html
+ *
+ *      This library is free software; you can redistribute it and/or
+ *      modify it under the terms of the GNU Lesser General Public
+ *      License as published by the Free Software Foundation; either
+ *      version 2 of the License, or (at your option) any later version.
+ *
+ *      This 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
+ *      Lesser General Public License for more details.
+ *
+ *      You should have received a copy of the GNU Lesser General Public
+ *      License along with this library in the file COPYING.LIB;
+ *      if not, write to the Free Software Foundation, Inc.,
+ *      59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+ */
+#if !defined( SEMAPHORE_H )
+#define SEMAPHORE_H
+
+#undef PTW32_LEVEL
+
+#if defined(_POSIX_SOURCE)
+#define PTW32_LEVEL 0
+/* Early POSIX */
+#endif
+
+#if defined(_POSIX_C_SOURCE) && _POSIX_C_SOURCE >= 199309
+#undef PTW32_LEVEL
+#define PTW32_LEVEL 1
+/* Include 1b, 1c and 1d */
+#endif
+
+#if defined(INCLUDE_NP)
+#undef PTW32_LEVEL
+#define PTW32_LEVEL 2
+/* Include Non-Portable extensions */
+#endif
+
+#define PTW32_LEVEL_MAX 3
+
+#if !defined(PTW32_LEVEL)
+#define PTW32_LEVEL PTW32_LEVEL_MAX
+/* Include everything */
+#endif
+
+#if __GNUC__ && ! defined (__declspec)
+# error Please upgrade your GNU compiler to one that supports __declspec.
+#endif
+
+/*
+ * When building the DLL code, you should define PTW32_BUILD so that
+ * the variables/functions are exported correctly. When using the DLL,
+ * do NOT define PTW32_BUILD, and then the variables/functions will
+ * be imported correctly.
+ */
+#ifndef PTW32_STATIC_LIB
+#  ifdef PTW32_BUILD
+#    define PTW32_DLLPORT __declspec (dllexport)
+#  else
+#    define PTW32_DLLPORT __declspec (dllimport)
+#  endif
+#else
+#  define PTW32_DLLPORT
+#endif
+
+/*
+ * This is a duplicate of what is in the autoconf config.h,
+ * which is only used when building the pthread-win32 libraries.
+ */
+
+#ifndef PTW32_CONFIG_H
+#  if defined(WINCE)
+#    define NEED_ERRNO
+#    define NEED_SEM
+#  endif
+#  if defined(_UWIN) || defined(__MINGW32__)
+#    define HAVE_MODE_T
+#  endif
+#endif
+
+/*
+ *
+ */
+
+#if PTW32_LEVEL >= PTW32_LEVEL_MAX
+#ifdef NEED_ERRNO
+#include "need_errno.h"
+#else
+#include <errno.h>
+#endif
+#endif /* PTW32_LEVEL >= PTW32_LEVEL_MAX */
+
+#define _POSIX_SEMAPHORES
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif              /* __cplusplus */
+
+#ifndef HAVE_MODE_T
+    typedef unsigned int mode_t;
+#endif
+
+
+    typedef struct sem_t_ * sem_t;
+
+    PTW32_DLLPORT int __cdecl sem_init (sem_t * sem,
+                                        int pshared,
+                                        unsigned int value);
+
+    PTW32_DLLPORT int __cdecl sem_destroy (sem_t * sem);
+
+    PTW32_DLLPORT int __cdecl sem_trywait (sem_t * sem);
+
+    PTW32_DLLPORT int __cdecl sem_wait (sem_t * sem);
+
+    PTW32_DLLPORT int __cdecl sem_timedwait (sem_t * sem,
+            const struct timespec * abstime);
+
+    PTW32_DLLPORT int __cdecl sem_post (sem_t * sem);
+
+    PTW32_DLLPORT int __cdecl sem_post_multiple (sem_t * sem,
+            int count);
+
+    PTW32_DLLPORT int __cdecl sem_open (const char * name,
+                                        int oflag,
+                                        mode_t mode,
+                                        unsigned int value);
+
+    PTW32_DLLPORT int __cdecl sem_close (sem_t * sem);
+
+    PTW32_DLLPORT int __cdecl sem_unlink (const char * name);
+
+    PTW32_DLLPORT int __cdecl sem_getvalue (sem_t * sem,
+                                            int * sval);
+
+#ifdef __cplusplus
+}               /* End of extern "C" */
+#endif              /* __cplusplus */
+
+#undef PTW32_LEVEL
+#undef PTW32_LEVEL_MAX
+
+#endif              /* !SEMAPHORE_H */
diff --git a/src/lib/Examples/HBL/F81.bf b/src/lib/Examples/HBL/F81.bf
new file mode 100644
index 0000000..362c4c6
--- /dev/null
+++ b/src/lib/Examples/HBL/F81.bf
@@ -0,0 +1 @@
+/* This is an example HY-PHY Batch File.



   It reads in a '#' nucleotide dataset data/hiv.nuc and estimates

   maximum ln-likelihood based on the tree contained in the data file,

   using Felsenstein 81 model.

   

   Output is printed out as a Newick Style tree with branch lengths

   representing the number of expected substitutions per branch (which

   is the default setting for nucleotide models w/o rate variation).

   

   

   Sergei L. Kosakovsky Pond and Spencer V. Muse 

   December 1999. 

*/

/* 1. Read in the data and store the result in a DataSet variable.*/

DataSet 		nucleotideSequences = ReadDataFile ("data/hiv.nuc");


/* 2. Filter the data, specifying that all of the data is to be used
	  and that it is to be treated as nucleotides.*/
	 
DataSetFilter	filteredData = CreateFilter (nucleotideSequences,1);

/* 3. Collect observed nucleotide frequencies from the filtered data. observedFreqs will
	  store the vector of frequencies. */

HarvestFrequencies (observedFreqs, filteredData, 1, 1, 1);

/* 4. Define the F81 substitution matrix. '*' is defined to be -(sum of off-diag row elements) */

F81RateMatrix = 
		{{*,mu,mu,mu}
		 {mu,*,mu,mu}
		 {mu,mu,*,mu}
		 {mu,mu,mu,*}};

/*5.  Define the F81 models, by combining the substitution matrix with the vector of observed (equilibrium)
	  frequencies. */
	  

Model 	F81 = (F81RateMatrix, observedFreqs);

/*6.  Now we can define the tree variable, using the tree string read from the data file,
	  and, by default, assigning the last defined model (F81) to all tree branches. */

Tree	givenTree = DATAFILE_TREE;


/*7.  Since all the likelihood function ingredients (data, tree, equilibrium frequencies)
	  have been defined we are ready to construct the likelihood function. */

LikelihoodFunction  theLnLik = (filteredData, givenTree);

/*8.  Maximize the likelihood function, storing parameter values in the matrix paramValues */

Optimize (paramValues, theLnLik);

/*9.  Print the tree with optimal branch lengths to the console. */

fprintf  (stdout, theLnLik);

\ No newline at end of file
diff --git a/src/lib/Examples/HBL/HKY85.bf b/src/lib/Examples/HBL/HKY85.bf
new file mode 100644
index 0000000..745d371
--- /dev/null
+++ b/src/lib/Examples/HBL/HKY85.bf
@@ -0,0 +1 @@
+DataSet 					nucleotideSequences = ReadDataFile ("data/hiv.nuc");
DataSetFilter				filteredData = CreateFilter (nucleotideSequences,1);
HarvestFrequencies 			(observedFreqs, filteredData, 1, 1, 1);

global R = 1;

HKY85RateMatrix = 
		{{*,trvs,R*trvs,trvs}
		 {trvs,*,trvs,R*trvs}
		 {R*trvs,trvs,*,trvs}
		 {trvs,R*trvs,trvs,*}};

Model 	HKY85 = (HKY85RateMatrix, observedFreqs);
Tree	givenTree = DATAFILE_TREE;
LikelihoodFunction  theLnLik = (filteredData, givenTree);

Optimize (paramValues, theLnLik);

function _THyPhyAskFor (key)
{
	if (key == "LogL")
	{
		return paramValues[1][0];
	}
	if (key == "kappa")
	{
		return R;
	}
	if (key == "Tree")
	{
		return Format(givenTree,1,1);
	}
	if (key == "Branch lengths")
	{
		return BranchLength (givenTree,-1);
	}

	return "_THyPhy_NOT_HANDLED_";
}
\ No newline at end of file
diff --git a/src/lib/Examples/HBL/data/hiv.nuc b/src/lib/Examples/HBL/data/hiv.nuc
new file mode 100644
index 0000000..ef9f921
--- /dev/null
+++ b/src/lib/Examples/HBL/data/hiv.nuc
@@ -0,0 +1 @@
+#719
ATAGTAATTAGATCTGAAAACTTCTCGAACAATGCTAAAACCATAATAGTACAGCTAAAT
AAATCTGTAGAAATTAATTGTACAAGACCCAACAACAATACAAGAAGAAGTATACAT
TTCGGACCAGGGAAAGCATTTTATGCAGGAGAAATAATAGGAGATATAAGACAAGCA
TATTGTACTCTTAATGGAGCAGAATGGAATAACACTGTAAAACAGGTAGCTGCAAAATTA
AGAGAAAAATTTAATAAAACAATAATCTTTAATCAATCC
#136
GTAGTAATTAGATCTGAAAACTTCTCGAACAATGCTAAAACCATAATAGTACAGCTAAAT
AAATCTGTAGAAATTAATTGTACAAGACCCAACAACAATACAAGAAGAAGTATACAT
TTTGGACCAGGGAAAGCATTTTATGCAGGAGAAATAATAGGAGATATAAGACAAGCA
TATTGTACCCTTAATGGAACAGAATGGAATAACACTTTAAAACAGGTAGCTGAAAAATTA
AGAGAACAATTTATTAAAACAATAGTTTTTAATCAATCC
#135
GTAGTAATTAGATCTGAAAACTTCACGAACAATGCTAAAACCATAATAGTACAGCTAAAT
AAATCTGTAGAAATTAATTGTGTAAGACCCGGCAACAATACAAGAAGAAGTATACAT
ATAGGACCAGGGAGAGCATATTATACAGGAGAAGTAATAGGAGATATAAGACAAGCA
CATTGTAACCTTAGTAGAACAGACTGGAATAAAACTTTAAAACAGGTAGCTGAAAAATTA
AGAGAACAATTTAATACAACAATAGTCTTTAATCAATCC
#105r
ATAGTAATTAGATCTGAAAACTTCACGAACAATGCTAAAACCATAATAGTACAGCTAAAT
AAATCTGTAGAAATTAAGTGTGAAAGACCCAACAACAATACAAGAAAAAGTGTACAT
ATAGGACCAGGGAAAGCATATTATACAGGAGAAATAATAGGAGATATAAGACAAGCA
CATTGTAACCTTAGTGGAACAGAATGGAGGGAAACTTTAAAACAGGTAGCTGAAAAATTA
AGAGAACAATTTAATAAAACAATAGTCTTTAATCAATCC
#529
ATAGTAATTAGATCTGAAAACTTCACGAACAATGCTAAAACCATAATAGTACATCTAAAT
GAATCTGTAGAAATTATTTGTGAAAGACCCAACAACAATACAAGAAAAAGTGTACAT
ATGGGACCAGGGAGAGCATATTACACAGGAGAAATAATAGGAGATATAAGACAAGCA
CATTGTAACATTAGTAGAACAAATTGGACGGAAACTTTAAAACAGGTAGCTGAAAAATTA
AGAGAACAATTTAATAAAACAATAGTCTTTAATCAATCC
#317
GTAGTAATTAGATCTGAAAACTTCACGAACAATGCTAAGACCATAATAGTACAGCTAAAT
AAACCTGTAAAAATTAATTGTACAAGACCCAACAACAATGCAAAAATAAGAATACAT
ATAGGACCAGGGAGACCATTTTATACAGCAGGAGAAATAGGAAATATAAGACAAGCA
CATTGTAACCTTAGTAGAACAGACTGGAATAACACTTTAAAACTGGTAGCTGAAAAATTA
AGAGAACAATTTAATAAAACAATAGTCTTTAATCAATCC
#6767
GTAGTAATTAGATCTGAAAACTTCACGAACAATGCTAAGACCATAATAGTACAGCTAAAT
AACTCTGTAACAATTAAGTGTGAAAGACCCAACAACAATACAAGAAAAAGTATACCT
ATAGGACCAGGGAGAGCCTTTTATACAACAGGAGACATAGGAGATATAAGACAAGCA
CATTGTAACCTTAGTAGAAAAGACTGGAATGACACTTTAAGACAGGTAGTTGGAAAGTTA
AGAGAACAATTTGGAAGAACAATAATCTTTAATCAATCC
#6760
ATAGTAATTAGATCTGAAAACTTCACGAACAATGCTAAAACCATAATAGTACAGCTAAAG
GAACCTGTAAACATTACTTGTGAAAGACCCAGCAACAATACAAGAAAAAGTATACAT
ATAGGACCAGGAAAAGCATTTTATGCAACAGGAGAAATAGGAGATATAAGACGAGCA
CATTGTAACCTTAATAGAACAGCATGGAATAAAACTTTAAAACAGGTAGTTGAAAAATTA
AGAGAACAATTTAAGAAAACAATAACCTTTAACCAATCC
#9939
ATAGTAATCAGATCTGAAAACTTCTCGGACAATGCTAAAACCATAATAGTACAGCTAAAC
AACACTGTAAACATTACTTGTGAAAGACCCAACAACAATACAAGAAAAAGGATACAT
ATAGGACCAGGGAGAGCAGTTTATACAACAGGACAAATAGGAGATATAAGAAAAGCA
CATTGTAACCTTAGTAGAACAAATTGGACTGAAACTTTAAGACAAGTAGCTGAAAAATTA
AAAGAACAATTTAATAAAACAATAATCTTTAATAATTCC
#113
GTAGTAATTCGATCTGAAAACTTCACGGACAATGCTAAAACCATAATAGTACAGCTAAAC
AAATCTGTAGAAATTACTTGTGTAAGACCCAACAACAATACAAGAAAAAGTATAAAT
ATAAGACCAGGGAGAGCATTTTATACAACAGGAGAAATAGGAGATATAAGACAAGCA
CATTGTAACCTTAGTAGAACAGCATGGAATGAAGCTTTAAGACAAGTAGCTAAAAAATTA
AAAGAACAATTTAATAGAACAATAGTCTTTAATCAATCC
#822
ATAGTAATTAGATCTGAAAACTTCACAGACAATGCTAAAACCATAATAGTACAGCTAAAC
AAATCTGTAGAAATTAATTGTATAAGACCCAACAACAATACAAGAAAAAGTATACAT
ATAGGACCAGGGAGAGCATTTTATACAACAGGAGACATAGGAGATATAAGACAAGCA
TATTGTAACCTTAGTAGAACAGCATGGAATGAAACTTTAAGACAAGTAGCTCAAAAATTA
AAAGAACAATTTAATAGAACAATAGTCTTTAATCAATCC
#159
ATAGTAATTAGATCTGAAAACTTCACAGACAATGCTAAAACCATAATAGTACAGCTAAAT
AAATCTGTAGAAATTAATTGTACAAGACCCAACAACAATACAAGAAAAAGTATACAT
ATAGGACCAGGGAGAGCTTTTTATACAACAGGTGAAATAGGAGATTTAAGACAAGCA
CATTGTAACCTTAGTAGAACAGCATGGAATGAAACTTTAAGACAAGTAGCTAAAAAATTA
AAAGAACAATTTAATAGAACAATAGTTTTTAATCAATCC
#256
ATAGTAATTAGATCTGAAAACTTCACGGACAATGCTAAAACCATAATAGTACAGCTAAAT
AAATCTGTAGAAATTAATTGTACAAGACCCAACAACAATACAAGAAAAAGTATAAAT
ATAGGACCAGGGAGAGCATTTTATACAACAGGTGAAATAGGAAATTTAAGACAAGCA
CATTGTAACCTTAGTAGAACAGCATGGAATGAAACTTTAAGACAAGTAGCTAAAAAACTA
AAAGAACAATTTAATAGAACAATAGTTTTTAATCAATCC

(((317,6767),((135,(529,105r)),(719,136))),6760,((113,9939),(256,(822,159))))
\ No newline at end of file
diff --git a/src/lib/Examples/Python/BasicHyPhy.py b/src/lib/Examples/Python/BasicHyPhy.py
new file mode 100644
index 0000000..3ad1ac3
--- /dev/null
+++ b/src/lib/Examples/Python/BasicHyPhy.py
@@ -0,0 +1,112 @@
+# import the HyPhy library
+# and standard OS utilities
+
+import os, HyPhy
+
+# first, create a HyPhy interface instance (class _THyPhy)
+# the first argument defines the root directory for HyPhy
+# and the second - how many threads the computational core
+# should spawn
+
+hyphyInstance = HyPhy._THyPhy (os.getcwd(),2)
+
+# the basic interface command is 'ExecuteBF' which
+# executes HyPhy batch language commands in HyPhy
+# and returns a string representation of the return value
+# (if any) from HYPHY
+# The returned object is of type _THyPhyString with 
+# sData and sLength fields
+# HyPhy will take care of disposing of the memory needed 
+# to store the result
+
+hyphyResult = hyphyInstance.ExecuteBF ("return 2+2;");
+print "Testing a trivial HyPhy command. 2+2 = ", hyphyResult.sData
+
+# an optional second argument to ExecuteBF
+# can be used to "flush" the current state of the system
+
+# this is the default option for the call of ExecuteBF
+# passing the second argument of False or 0 will preserve
+# the execution state 
+
+print "Consecutive command exection"
+hyphyInstance.ExecuteBF ("z:=x+y;",False);
+hyphyInstance.ExecuteBF ("x=3;",False);
+hyphyInstance.ExecuteBF ("y=5;",False);
+hyphyResult = hyphyInstance.ExecuteBF ("return z;",False);
+print "The value of z is ", hyphyResult.sData
+
+print "Resetting the state of the execution erases the value of 'z'"
+hyphyResult = hyphyInstance.ExecuteBF ("return z;");
+print "The value of z is ", hyphyResult.sData
+
+# the real utility of the interface is to be able 
+# to execute prewritten analyses from HBL files
+
+print "Executing the example F81.bf file"
+hyphyResult = hyphyInstance.ExecuteBF ("ExecuteAFile(\"../HBL/F81.bf\")");
+
+# retrive the standard output, error and runtime warnings
+
+hyphyOut 		= hyphyInstance.GetStdout()
+#errors will be empty UNLESS there was an exection error
+hyphyErrors     = hyphyInstance.GetErrors()
+hyphyWarnings	= hyphyInstance.GetWarnings()
+
+print "Standard out: \n", hyphyOut.sData
+print "Errors: \n", hyphyErrors.sData
+print "Warnings/Log messages: \n", hyphyWarnings.sData
+
+# these variables can be explicitly deleted when they are no longer needed
+# python garbage collection should take care of disposing of disused variables
+
+del hyphyOut
+del hyphyErrors
+del hyphyWarnings
+
+# A tighter intergration can be achieved by defining a retrieval function 
+# with the reserved name _THyPhyAskFor in the HBL file; it retrieves data
+# by key and returns them in a internal format that can be converted 
+# to one of the basic return types: number, string or matrix
+
+def retrieveValueByKey (key, returnType,hyphyInstance):
+	theResult = hyphyInstance.AskFor(key)
+	# see if HyPhy can retrieve a value with the requested key
+	if theResult:
+   		canICast = hyphyInstance.CanCast(theResult,returnType)
+   		# see if HyPhy can cast the value to the requested type
+   		if canICast:
+   			# do the casting
+   			theResult = hyphyInstance.CastResult(theResult,returnType)
+   			# the last step is to convert from the basic return type
+   			# to a derived class that we can use in python directly
+   			if (returnType == HyPhy.THYPHY_TYPE_NUMBER):
+   				return theResult.castToNumber()
+   			if (returnType == HyPhy.THYPHY_TYPE_STRING):
+   				return theResult.castToString()
+   			if (returnType == HyPhy.THYPHY_TYPE_MATRIX):
+   				return theResult.castToMatrix()
+	return null   		
+   		
+
+hyphyResult = hyphyInstance.ExecuteBF ("ExecuteAFile(\"../HBL/HKY85.bf\")");
+
+print "Log-L = ", retrieveValueByKey ("LogL", HyPhy.THYPHY_TYPE_NUMBER, hyphyInstance).nValue;
+print "kappa = ", retrieveValueByKey ("kappa", HyPhy.THYPHY_TYPE_NUMBER, hyphyInstance).nValue;
+print "tree string = ", retrieveValueByKey ("Tree", HyPhy.THYPHY_TYPE_STRING, hyphyInstance).sData;
+bl = retrieveValueByKey ("Branch lengths", HyPhy.THYPHY_TYPE_MATRIX, hyphyInstance);
+print "retrieved ", bl.mCols-1, "branch lengths" 
+for i in range(0,bl.mCols-1):
+	print "Branch ", i+1, " has length ", bl.MatrixCell(0,i)
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/lib/Examples/R/BasicHyPhy.R b/src/lib/Examples/R/BasicHyPhy.R
new file mode 100644
index 0000000..206cf64
--- /dev/null
+++ b/src/lib/Examples/R/BasicHyPhy.R
@@ -0,0 +1,126 @@
+# import the HyPhy library and R glue
+# change the paths according to your distribution
+
+dyn.load ("LibraryModules/R/HyPhy.so")
+source  ("LibraryModules/R/HyPhy.R")
+
+# first, create a HyPhy interface instance (class _THyPhy)
+# the first argument defines the root directory for HyPhy
+# and the second - how many threads the computational core
+# should spawn
+
+hyphyInstance<-`_THyPhy` (paste(getwd(),'/',sep=''),2)
+
+# the basic interface command is 'ExecuteBF' which
+# executes HyPhy batch language commands in HyPhy
+# and returns a string representation of the return value
+# (if any) from HYPHY
+# The returned object is of type _THyPhyString with 
+# sData and sLength fields
+# HyPhy will take care of disposing of the memory needed 
+# to store the result
+
+hyphyResult<-hyphyInstance$ExecuteBF (hyphyInstance,"return 2+2;")
+print(paste("Testing a trivial HyPhy command. 2+2 = ",hyphyResult$sData))
+
+# an optional second argument to ExecuteBF
+# can be used to "flush" the current state of the system
+
+# this is the default option for the call of ExecuteBF
+# passing the second argument of FALSE or 0 will preserve
+# the execution state 
+
+print("Consecutive command exection")
+hyphyInstance$ExecuteBF (hyphyInstance,"z:=x+y;",FALSE)
+hyphyInstance$ExecuteBF (hyphyInstance,"x=3;",FALSE)
+hyphyInstance$ExecuteBF (hyphyInstance,"y=5;",FALSE)
+hyphyResult = hyphyInstance$ExecuteBF (hyphyInstance,"return z;",FALSE)
+print(paste("The value of z is ",hyphyResult$sData))
+
+print("Resetting the state of the execution erases the value of 'z'")
+hyphyResult<-hyphyInstance$ExecuteBF (hyphyInstance,"return z;");
+print(paste("The value of z is ",hyphyResult$sData))
+
+# the real utility of the interface is to be able 
+# to execute prewritten analyses from HBL files
+
+print("Executing the example F81.bf file")
+hyphyResult<-hyphyInstance$ExecuteBF (hyphyInstance,"ExecuteAFile(\"Examples/HBL/F81.bf\")");
+
+# retrive the standard output, error and runtime warnings
+
+hyphyOut 		<- hyphyInstance$GetStdout(hyphyInstance)
+#errors will be empty UNLESS there was an exection error
+hyphyErrors     <- hyphyInstance$GetErrors(hyphyInstance)
+hyphyWarnings	<- hyphyInstance$GetWarnings(hyphyInstance)
+
+print (paste("Standard out: \n", hyphyOut$sData))
+print (paste("Errors: \n", hyphyErrors$sData))
+print (paste("Warnings/Log messages: \n", hyphyWarnings$sData))
+
+# these variables can be explicitly deleted when they are no longer needed
+# R garbage collection should take care of disposing of disused variables
+
+rm('hyphyOut')
+rm('hyphyErrors')
+rm('hyphyWarnings')
+
+# A tighter intergration can be achieved by defining a retrieval function 
+# with the reserved name _THyPhyAskFor in the HBL file; it retrieves data
+# by key and returns them in a internal format that can be converted 
+# to one of the basic return types: number(0), string(1) or matrix(2)
+
+retrieveValueByKey <- function(key, returnType, hyphyInstance){
+	theResult <- hyphyInstance$AskFor(hyphyInstance,key);
+	# see if HyPhy can retrieve a value with the requested key
+	if (!is.null(theResult))
+	{
+  		canICast <- hyphyInstance$CanCast(hyphyInstance,theResult,returnType);
+   		# see if HyPhy can cast the value to the requested type
+   		if(canICast)
+   		{
+   			# do the casting
+   			theResult <- hyphyInstance$CastResult(hyphyInstance,theResult,returnType);
+   			# the last step is to convert from the basic return type
+   			# to a derived class that we can use in python directly
+   			if (returnType == 0)
+   			{
+   				return(theResult$castToNumber(theResult));
+   			}
+   			if (returnType == 1)
+   			{
+   				return(theResult$castToString(theResult));
+   			}
+   			if (returnType == 2)
+   			{
+   				return(theResult$castToMatrix(theResult));
+   			}
+  		}
+  	}
+	return(NULL);
+}
+ 		
+   		
+
+hyphyResult<-hyphyInstance$ExecuteBF (hyphyInstance,"ExecuteAFile(\"Examples/HBL/HKY85.bf\")");
+
+print(paste("Log-L = ", retrieveValueByKey ("LogL", 0, hyphyInstance)$nValue))
+print(paste("kappa = ", retrieveValueByKey ("kappa", 0, hyphyInstance)$nValue))
+print(paste("tree string = ", retrieveValueByKey ("Tree", 1, hyphyInstance)$sData))
+bl<-retrieveValueByKey ("Branch lengths", 2, hyphyInstance)
+print(paste("retrieved ", bl$mCols-1, "branch lengths"))
+for(i in 0:(bl$mCols-2))
+{
+	print (paste("Branch ", i+1, " has length ", bl$MatrixCell(bl,0,i)))
+}
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/lib/LibraryModules/Python/HyPhy/__init__.py b/src/lib/LibraryModules/Python/HyPhy/__init__.py
new file mode 100644
index 0000000..994bdd7
--- /dev/null
+++ b/src/lib/LibraryModules/Python/HyPhy/__init__.py
@@ -0,0 +1,78 @@
+# This file was automatically generated by SWIG (http://www.swig.org).
+# Version 2.0.4
+#
+# Do not make changes to this file unless you know what you are doing--modify
+# the SWIG interface file instead.
+
+
+
+from sys import version_info
+if version_info >= (2,6,0):
+    def swig_import_helper():
+        from os.path import dirname
+        import imp
+        fp = None
+        try:
+            fp, pathname, description = imp.find_module('_HyPhy', [dirname(__file__)])
+        except ImportError:
+            import _HyPhy
+            return _HyPhy
+        if fp is not None:
+            try:
+                _mod = imp.load_module('_HyPhy', fp, pathname, description)
+            finally:
+                fp.close()
+            return _mod
+    _HyPhy = swig_import_helper()
+    del swig_import_helper
+else:
+    import _HyPhy
+del version_info
+from _HyPhy import *
+try:
+    _swig_property = property
+except NameError:
+    pass # Python < 2.2 doesn't have 'property'.
+def _swig_setattr_nondynamic(self,class_type,name,value,static=1):
+    if (name == "thisown"): return self.this.own(value)
+    if (name == "this"):
+        if type(value).__name__ == 'SwigPyObject':
+            self.__dict__[name] = value
+            return
+    method = class_type.__swig_setmethods__.get(name,None)
+    if method: return method(self,value)
+    if (not static):
+        self.__dict__[name] = value
+    else:
+        raise AttributeError("You cannot add attributes to %s" % self)
+
+def _swig_setattr(self,class_type,name,value):
+    return _swig_setattr_nondynamic(self,class_type,name,value,0)
+
+def _swig_getattr(self,class_type,name):
+    if (name == "thisown"): return self.this.own()
+    method = class_type.__swig_getmethods__.get(name,None)
+    if method: return method(self)
+    raise AttributeError(name)
+
+def _swig_repr(self):
+    try: strthis = "proxy of " + self.this.__repr__()
+    except: strthis = ""
+    return "<%s.%s; %s >" % (self.__class__.__module__, self.__class__.__name__, strthis,)
+
+try:
+    _object = object
+    _newclass = 1
+except AttributeError:
+    class _object : pass
+    _newclass = 0
+
+
+
+
+
+
+
+# This file is compatible with both classic and new-style classes.
+
+
diff --git a/src/lib/LibraryModules/R/HyPhy.R b/src/lib/LibraryModules/R/HyPhy.R
new file mode 100644
index 0000000..fb4a08d
--- /dev/null
+++ b/src/lib/LibraryModules/R/HyPhy.R
@@ -0,0 +1,1338 @@
+# This file was automatically generated by SWIG (http://www.swig.org).
+# Version 2.0.4
+#
+# Do not make changes to this file unless you know what you are doing--modify
+# the SWIG interface file instead.
+
+##   Generated via the command line invocation:
+##	 swig -c++ -r THyPhy.h
+
+
+#                         srun.swg                            #
+#
+# This is the basic code that is needed at run time within R to
+# provide and define the relevant classes.  It is included
+# automatically in the generated code by copying the contents of
+# srun.swg into the newly created binding code.
+
+
+# This could be provided as a separate run-time library but this
+# approach allows the code to to be included directly into the
+# generated bindings and so removes the need to have and install an
+# additional library.  We may however end up with multiple copies of
+# this and some confusion at run-time as to which class to use. This
+# is an issue when we use NAMESPACES as we may need to export certain
+# classes.
+
+######################################################################
+
+if(length(getClassDef("RSWIGStruct")) == 0) 
+  setClass("RSWIGStruct", representation("VIRTUAL"))
+
+
+
+if(length(getClassDef("ExternalReference")) == 0) 
+# Should be virtual but this means it loses its slots currently
+#representation("VIRTUAL")
+  setClass("ExternalReference", representation( ref = "externalptr"))
+
+
+
+if(length(getClassDef("NativeRoutinePointer")) == 0) 
+  setClass("NativeRoutinePointer", 
+              representation(parameterTypes = "character",
+                             returnType = "character",
+                             "VIRTUAL"), 
+              contains = "ExternalReference")
+
+if(length(getClassDef("CRoutinePointer")) == 0) 
+  setClass("CRoutinePointer", contains = "NativeRoutinePointer")
+
+
+if(length(getClassDef("EnumerationValue")) == 0) 
+  setClass("EnumerationValue", contains = "integer")
+
+
+if(!isGeneric("copyToR")) 
+ setGeneric("copyToR",
+            function(value, obj = new(gsub("Ref$", "", class(value)))) 
+               standardGeneric("copyToR"
+           ))
+
+setGeneric("delete", function(obj) standardGeneric("delete"))
+
+
+SWIG_createNewRef = 
+function(className, ..., append = TRUE)
+{
+  f = get(paste("new", className, sep = "_"), mode = "function")
+
+  f(...)
+}
+
+if(!isGeneric("copyToC")) 
+ setGeneric("copyToC", 
+             function(value, obj = RSWIG_createNewRef(class(value)))
+              standardGeneric("copyToC"
+            ))
+
+
+# 
+defineEnumeration =
+function(name, .values, where = topenv(parent.frame()), suffix = "Value")
+{
+   # Mirror the class definitions via the E analogous to .__C__
+  defName = paste(".__E__", name, sep = "")
+  assign(defName,  .values,  envir = where)
+
+  if(nchar(suffix))
+    name = paste(name, suffix, sep = "")
+
+  setClass(name, contains = "EnumerationValue", where = where)
+}
+
+enumToInteger <- function(name,type)
+{
+   if (is.character(name)) {
+   ans <- as.integer(get(paste(".__E__", type, sep = ""))[name])
+   if (is.na(ans)) {warning("enum not found ", name, " ", type)}
+   ans
+   } 
+}
+
+enumFromInteger =
+function(i,type)
+{
+  itemlist <- get(paste(".__E__", type, sep=""))
+  names(itemlist)[match(i, itemlist)]
+}
+
+coerceIfNotSubclass =
+function(obj, type) 
+{
+    if(!is(obj, type)) {as(obj, type)} else obj
+}
+
+
+setClass("SWIGArray", representation(dims = "integer"), contains = "ExternalReference")
+
+setMethod("length", "SWIGArray", function(x) x at dims[1])
+
+
+defineEnumeration("SCopyReferences",
+                   .values = c( "FALSE" = 0, "TRUE" = 1, "DEEP" = 2))
+
+assert = 
+function(condition, message = "")
+{
+  if(!condition)
+    stop(message)
+
+  TRUE
+}
+
+
+if(FALSE) {
+print.SWIGFunction =
+function(x, ...)
+ {
+ }
+}
+
+
+#######################################################################
+
+R_SWIG_getCallbackFunctionStack =
+function()
+{
+    # No PACKAGE argument as we don't know what the DLL is.
+  .Call("R_SWIG_debug_getCallbackFunctionData")
+}
+
+R_SWIG_addCallbackFunctionStack =
+function(fun, userData = NULL)
+{
+    # No PACKAGE argument as we don't know what the DLL is.
+  .Call("R_SWIG_R_pushCallbackFunctionData", fun, userData)
+}
+
+
+#######################################################################
+
+
+setClass('C++Reference', contains = 'ExternalReference')
+setClass('_p__THyPhyReturnObject', contains = 'C++Reference')
+setClass('_p__THyPhyString', contains = c('_p__THyPhyReturnObject'))
+setClass('_p__THyPhyNumber', contains = c('_p__THyPhyReturnObject'))
+setClass('_p__THyPhyMatrix', contains = c('_p__THyPhyReturnObject'))
+setClass('_p__THyPhy', contains = 'C++Reference')
+
+
+
+setMethod('[', "ExternalReference",
+function(x,i,j, ..., drop=TRUE) 
+if (!is.null(x$"__getitem__")) 
+sapply(i, function(n) x$"__getitem__"(i=as.integer(n-1))))
+
+setMethod('[<-' , "ExternalReference",
+function(x,i,j, ..., value) 
+if (!is.null(x$"__setitem__")) {
+sapply(1:length(i), function(n) 
+x$"__setitem__"(i=as.integer(i[n]-1), x=value[n]))
+x
+})
+
+setAs('ExternalReference', 'character',
+function(from) {if (!is.null(from$"__str__")) from$"__str__"()})
+
+setMethod('print', 'ExternalReference',
+function(x) {print(as(x, "character"))})
+
+# Start of _THyPhyReturnObject_myType
+
+`_THyPhyReturnObject_myType` = function(self, .copy = FALSE)
+{
+  ;.Call('R_swig__THyPhyReturnObject_myType', self, as.logical(.copy), PACKAGE='HyPhy');
+  
+}
+
+attr(`_THyPhyReturnObject_myType`, 'returnType') = 'integer'
+attr(`_THyPhyReturnObject_myType`, "inputTypes") = c('_p__THyPhyReturnObject')
+class(`_THyPhyReturnObject_myType`) = c("SWIGFunction", class('_THyPhyReturnObject_myType'))
+
+# Start of delete__THyPhyReturnObject
+
+`delete__THyPhyReturnObject` = function(self)
+{
+  ;.Call('R_swig_delete__THyPhyReturnObject', self, PACKAGE='HyPhy');
+  
+}
+
+attr(`delete__THyPhyReturnObject`, 'returnType') = 'void'
+attr(`delete__THyPhyReturnObject`, "inputTypes") = c('_p__THyPhyReturnObject')
+class(`delete__THyPhyReturnObject`) = c("SWIGFunction", class('delete__THyPhyReturnObject'))
+
+# Start of _THyPhyReturnObject_castToString
+
+`_THyPhyReturnObject_castToString` = function(self)
+{
+  ;ans = .Call('R_swig__THyPhyReturnObject_castToString', self, PACKAGE='HyPhy');
+  class(ans) <- "_p__THyPhyString";
+  
+  ans
+  
+}
+
+attr(`_THyPhyReturnObject_castToString`, 'returnType') = '_p__THyPhyString'
+attr(`_THyPhyReturnObject_castToString`, "inputTypes") = c('_p__THyPhyReturnObject')
+class(`_THyPhyReturnObject_castToString`) = c("SWIGFunction", class('_THyPhyReturnObject_castToString'))
+
+# Start of _THyPhyReturnObject_castToNumber
+
+`_THyPhyReturnObject_castToNumber` = function(self)
+{
+  ;ans = .Call('R_swig__THyPhyReturnObject_castToNumber', self, PACKAGE='HyPhy');
+  class(ans) <- "_p__THyPhyNumber";
+  
+  ans
+  
+}
+
+attr(`_THyPhyReturnObject_castToNumber`, 'returnType') = '_p__THyPhyNumber'
+attr(`_THyPhyReturnObject_castToNumber`, "inputTypes") = c('_p__THyPhyReturnObject')
+class(`_THyPhyReturnObject_castToNumber`) = c("SWIGFunction", class('_THyPhyReturnObject_castToNumber'))
+
+# Start of _THyPhyReturnObject_castToMatrix
+
+`_THyPhyReturnObject_castToMatrix` = function(self)
+{
+  ;ans = .Call('R_swig__THyPhyReturnObject_castToMatrix', self, PACKAGE='HyPhy');
+  class(ans) <- "_p__THyPhyMatrix";
+  
+  ans
+  
+}
+
+attr(`_THyPhyReturnObject_castToMatrix`, 'returnType') = '_p__THyPhyMatrix'
+attr(`_THyPhyReturnObject_castToMatrix`, "inputTypes") = c('_p__THyPhyReturnObject')
+class(`_THyPhyReturnObject_castToMatrix`) = c("SWIGFunction", class('_THyPhyReturnObject_castToMatrix'))
+
+# Start of accessor method for _THyPhyReturnObject
+setMethod('$', '_p__THyPhyReturnObject', function(x, name)
+
+{
+  accessorFuns = list('myType' = _THyPhyReturnObject_myType, 'castToString' = _THyPhyReturnObject_castToString, 'castToNumber' = _THyPhyReturnObject_castToNumber, 'castToMatrix' = _THyPhyReturnObject_castToMatrix);
+  ;        idx = pmatch(name, names(accessorFuns));
+  if(is.na(idx)) 
+  return(callNextMethod(x, name));
+  f = accessorFuns[[idx]];
+  formals(f)[[1]] = x;
+  f;
+}
+
+
+);
+# end of accessor method for _THyPhyReturnObject
+setMethod('delete', '_p__THyPhyReturnObject', function(obj) {delete__THyPhyReturnObject(obj)})
+# Start of new__THyPhyString
+
+`_THyPhyString__SWIG_0` = function(s_arg1, s_arg2)
+{
+  s_arg1 = as(s_arg1, "character"); 
+  s_arg2 = as.integer(s_arg2); 
+  
+  if(length(s_arg2) > 1) {
+    warning("using only the first element of s_arg2");
+  };
+  
+  ;ans = .Call('R_swig_new__THyPhyString__SWIG_0', s_arg1, s_arg2, PACKAGE='HyPhy');
+  class(ans) <- "_p__THyPhyString";
+  
+  reg.finalizer(ans, delete__THyPhyString)
+  ans
+  
+}
+
+attr(`_THyPhyString__SWIG_0`, 'returnType') = '_p__THyPhyString'
+attr(`_THyPhyString__SWIG_0`, "inputTypes") = c('character', 'integer')
+class(`_THyPhyString__SWIG_0`) = c("SWIGFunction", class('_THyPhyString__SWIG_0'))
+
+# Start of new__THyPhyString
+
+`_THyPhyString__SWIG_1` = function(s_arg1)
+{
+  s_arg1 = as(s_arg1, "character"); 
+  ;ans = .Call('R_swig_new__THyPhyString__SWIG_1', s_arg1, PACKAGE='HyPhy');
+  class(ans) <- "_p__THyPhyString";
+  
+  reg.finalizer(ans, delete__THyPhyString)
+  ans
+  
+}
+
+attr(`_THyPhyString__SWIG_1`, 'returnType') = '_p__THyPhyString'
+attr(`_THyPhyString__SWIG_1`, "inputTypes") = c('character')
+class(`_THyPhyString__SWIG_1`) = c("SWIGFunction", class('_THyPhyString__SWIG_1'))
+
+# Start of new__THyPhyString
+
+`_THyPhyString__SWIG_2` = function()
+{
+  ;ans = .Call('R_swig_new__THyPhyString__SWIG_2', PACKAGE='HyPhy');
+  class(ans) <- "_p__THyPhyString";
+  
+  reg.finalizer(ans, delete__THyPhyString)
+  ans
+  
+}
+
+attr(`_THyPhyString__SWIG_2`, 'returnType') = '_p__THyPhyString'
+class(`_THyPhyString__SWIG_2`) = c("SWIGFunction", class('_THyPhyString__SWIG_2'))
+
+`_THyPhyString` <- function(...) {
+  argtypes <- mapply(class, list(...));
+  argv <- list(...);
+  argc <- length(argtypes);
+# dispatch functions 3
+  if (argc == 0) {
+    f <- _THyPhyString__SWIG_2; 
+  } else if (argc == 1) {
+    if (is.character(argv[[1]])) {
+      f <- _THyPhyString__SWIG_1; 
+    }
+  } else if (argc == 2) {
+    if (is.character(argv[[1]]) && (is.integer(argv[[2]]) || is.numeric(argv[[2]]))) {
+      f <- _THyPhyString__SWIG_0; 
+    }
+  } else {
+    stop("cannot find overloaded function for _THyPhyString with argtypes (",toString(argtypes),")");
+  };
+  f(...);
+}
+
+# Dispatch function
+# Start of _THyPhyString_myType
+
+`_THyPhyString_myType` = function(self, .copy = FALSE)
+{
+  ;.Call('R_swig__THyPhyString_myType', self, as.logical(.copy), PACKAGE='HyPhy');
+  
+}
+
+attr(`_THyPhyString_myType`, 'returnType') = 'integer'
+attr(`_THyPhyString_myType`, "inputTypes") = c('_p__THyPhyString')
+class(`_THyPhyString_myType`) = c("SWIGFunction", class('_THyPhyString_myType'))
+
+# Start of delete__THyPhyString
+
+`delete__THyPhyString` = function(self)
+{
+  ;.Call('R_swig_delete__THyPhyString', self, PACKAGE='HyPhy');
+  
+}
+
+attr(`delete__THyPhyString`, 'returnType') = 'void'
+attr(`delete__THyPhyString`, "inputTypes") = c('_p__THyPhyString')
+class(`delete__THyPhyString`) = c("SWIGFunction", class('delete__THyPhyString'))
+
+# Start of _THyPhyString_sLength_set
+
+`_THyPhyString_sLength_set` = function(self, s_sLength)
+{
+  s_sLength = as.integer(s_sLength); 
+  
+  if(length(s_sLength) > 1) {
+    warning("using only the first element of s_sLength");
+  };
+  
+  ;.Call('R_swig__THyPhyString_sLength_set', self, s_sLength, PACKAGE='HyPhy');
+  
+}
+
+attr(`_THyPhyString_sLength_set`, 'returnType') = 'void'
+attr(`_THyPhyString_sLength_set`, "inputTypes") = c('_p__THyPhyString', 'integer')
+class(`_THyPhyString_sLength_set`) = c("SWIGFunction", class('_THyPhyString_sLength_set'))
+
+# Start of _THyPhyString_sLength_get
+
+`_THyPhyString_sLength_get` = function(self, .copy = FALSE)
+{
+  ;.Call('R_swig__THyPhyString_sLength_get', self, as.logical(.copy), PACKAGE='HyPhy');
+  
+}
+
+attr(`_THyPhyString_sLength_get`, 'returnType') = 'integer'
+attr(`_THyPhyString_sLength_get`, "inputTypes") = c('_p__THyPhyString')
+class(`_THyPhyString_sLength_get`) = c("SWIGFunction", class('_THyPhyString_sLength_get'))
+
+# Start of _THyPhyString_sData_set
+
+`_THyPhyString_sData_set` = function(self, s_sData)
+{
+  s_sData = as(s_sData, "character"); 
+  ;.Call('R_swig__THyPhyString_sData_set', self, s_sData, PACKAGE='HyPhy');
+  
+}
+
+attr(`_THyPhyString_sData_set`, 'returnType') = 'void'
+attr(`_THyPhyString_sData_set`, "inputTypes") = c('_p__THyPhyString', 'character')
+class(`_THyPhyString_sData_set`) = c("SWIGFunction", class('_THyPhyString_sData_set'))
+
+# Start of _THyPhyString_sData_get
+
+`_THyPhyString_sData_get` = function(self)
+{
+  ;.Call('R_swig__THyPhyString_sData_get', self, PACKAGE='HyPhy');
+  
+}
+
+attr(`_THyPhyString_sData_get`, 'returnType') = 'character'
+attr(`_THyPhyString_sData_get`, "inputTypes") = c('_p__THyPhyString')
+class(`_THyPhyString_sData_get`) = c("SWIGFunction", class('_THyPhyString_sData_get'))
+
+# Start of accessor method for _THyPhyString
+setMethod('$', '_p__THyPhyString', function(x, name)
+
+{
+  accessorFuns = list('myType' = _THyPhyString_myType, 'sLength' = _THyPhyString_sLength_get, 'sData' = _THyPhyString_sData_get);
+  vaccessors = c('sLength', 'sData');
+  ;        idx = pmatch(name, names(accessorFuns));
+  if(is.na(idx)) 
+  return(callNextMethod(x, name));
+  f = accessorFuns[[idx]];
+  formals(f)[[1]] = x;
+  if (is.na(match(name, vaccessors))) f else f(x);
+}
+
+
+);
+# end of accessor method for _THyPhyString
+# Start of accessor method for _THyPhyString
+setMethod('$<-', '_p__THyPhyString', function(x, name, value)
+
+{
+  accessorFuns = list('sLength' = _THyPhyString_sLength_set, 'sData' = _THyPhyString_sData_set);
+  ;        idx = pmatch(name, names(accessorFuns));
+  if(is.na(idx)) 
+  return(callNextMethod(x, name, value));
+  f = accessorFuns[[idx]];
+  f(x, value);
+  x;
+}
+
+
+);
+setMethod('[[<-', c('_p__THyPhyString', 'character'),function(x, i, j, ..., value)
+
+{
+  name = i;
+  accessorFuns = list('sLength' = _THyPhyString_sLength_set, 'sData' = _THyPhyString_sData_set);
+  ;        idx = pmatch(name, names(accessorFuns));
+  if(is.na(idx)) 
+  return(callNextMethod(x, name, value));
+  f = accessorFuns[[idx]];
+  f(x, value);
+  x;
+}
+
+
+);
+# end of accessor method for _THyPhyString
+setMethod('delete', '_p__THyPhyString', function(obj) {delete__THyPhyString(obj)})
+# Start of new__THyPhyNumber
+
+`_THyPhyNumber__SWIG_0` = function(s_arg1)
+{
+  ;ans = .Call('R_swig_new__THyPhyNumber__SWIG_0', s_arg1, PACKAGE='HyPhy');
+  class(ans) <- "_p__THyPhyNumber";
+  
+  reg.finalizer(ans, delete__THyPhyNumber)
+  ans
+  
+}
+
+attr(`_THyPhyNumber__SWIG_0`, 'returnType') = '_p__THyPhyNumber'
+attr(`_THyPhyNumber__SWIG_0`, "inputTypes") = c('numeric')
+class(`_THyPhyNumber__SWIG_0`) = c("SWIGFunction", class('_THyPhyNumber__SWIG_0'))
+
+# Start of new__THyPhyNumber
+
+`_THyPhyNumber__SWIG_1` = function()
+{
+  ;ans = .Call('R_swig_new__THyPhyNumber__SWIG_1', PACKAGE='HyPhy');
+  class(ans) <- "_p__THyPhyNumber";
+  
+  reg.finalizer(ans, delete__THyPhyNumber)
+  ans
+  
+}
+
+attr(`_THyPhyNumber__SWIG_1`, 'returnType') = '_p__THyPhyNumber'
+class(`_THyPhyNumber__SWIG_1`) = c("SWIGFunction", class('_THyPhyNumber__SWIG_1'))
+
+`_THyPhyNumber` <- function(...) {
+  argtypes <- mapply(class, list(...));
+  argv <- list(...);
+  argc <- length(argtypes);
+# dispatch functions 2
+  if (argc == 0) {
+    f <- _THyPhyNumber__SWIG_1; 
+  } else if (argc == 1) {
+    if (is.numeric(argv[[1]])) {
+      f <- _THyPhyNumber__SWIG_0; 
+    }
+  } else {
+    stop("cannot find overloaded function for _THyPhyNumber with argtypes (",toString(argtypes),")");
+  };
+  f(...);
+}
+
+# Dispatch function
+# Start of _THyPhyNumber_myType
+
+`_THyPhyNumber_myType` = function(self, .copy = FALSE)
+{
+  ;.Call('R_swig__THyPhyNumber_myType', self, as.logical(.copy), PACKAGE='HyPhy');
+  
+}
+
+attr(`_THyPhyNumber_myType`, 'returnType') = 'integer'
+attr(`_THyPhyNumber_myType`, "inputTypes") = c('_p__THyPhyNumber')
+class(`_THyPhyNumber_myType`) = c("SWIGFunction", class('_THyPhyNumber_myType'))
+
+# Start of delete__THyPhyNumber
+
+`delete__THyPhyNumber` = function(self)
+{
+  ;.Call('R_swig_delete__THyPhyNumber', self, PACKAGE='HyPhy');
+  
+}
+
+attr(`delete__THyPhyNumber`, 'returnType') = 'void'
+attr(`delete__THyPhyNumber`, "inputTypes") = c('_p__THyPhyNumber')
+class(`delete__THyPhyNumber`) = c("SWIGFunction", class('delete__THyPhyNumber'))
+
+# Start of _THyPhyNumber_nValue_set
+
+`_THyPhyNumber_nValue_set` = function(self, s_nValue)
+{
+  ;.Call('R_swig__THyPhyNumber_nValue_set', self, s_nValue, PACKAGE='HyPhy');
+  
+}
+
+attr(`_THyPhyNumber_nValue_set`, 'returnType') = 'void'
+attr(`_THyPhyNumber_nValue_set`, "inputTypes") = c('_p__THyPhyNumber', 'numeric')
+class(`_THyPhyNumber_nValue_set`) = c("SWIGFunction", class('_THyPhyNumber_nValue_set'))
+
+# Start of _THyPhyNumber_nValue_get
+
+`_THyPhyNumber_nValue_get` = function(self, .copy = FALSE)
+{
+  ;.Call('R_swig__THyPhyNumber_nValue_get', self, as.logical(.copy), PACKAGE='HyPhy');
+  
+}
+
+attr(`_THyPhyNumber_nValue_get`, 'returnType') = 'numeric'
+attr(`_THyPhyNumber_nValue_get`, "inputTypes") = c('_p__THyPhyNumber')
+class(`_THyPhyNumber_nValue_get`) = c("SWIGFunction", class('_THyPhyNumber_nValue_get'))
+
+# Start of accessor method for _THyPhyNumber
+setMethod('$', '_p__THyPhyNumber', function(x, name)
+
+{
+  accessorFuns = list('myType' = _THyPhyNumber_myType, 'nValue' = _THyPhyNumber_nValue_get);
+  vaccessors = c('nValue');
+  ;        idx = pmatch(name, names(accessorFuns));
+  if(is.na(idx)) 
+  return(callNextMethod(x, name));
+  f = accessorFuns[[idx]];
+  formals(f)[[1]] = x;
+  if (is.na(match(name, vaccessors))) f else f(x);
+}
+
+
+);
+# end of accessor method for _THyPhyNumber
+# Start of accessor method for _THyPhyNumber
+setMethod('$<-', '_p__THyPhyNumber', function(x, name, value)
+
+{
+  accessorFuns = list('nValue' = _THyPhyNumber_nValue_set);
+  ;        idx = pmatch(name, names(accessorFuns));
+  if(is.na(idx)) 
+  return(callNextMethod(x, name, value));
+  f = accessorFuns[[idx]];
+  f(x, value);
+  x;
+}
+
+
+);
+setMethod('[[<-', c('_p__THyPhyNumber', 'character'),function(x, i, j, ..., value)
+
+{
+  name = i;
+  accessorFuns = list('nValue' = _THyPhyNumber_nValue_set);
+  ;        idx = pmatch(name, names(accessorFuns));
+  if(is.na(idx)) 
+  return(callNextMethod(x, name, value));
+  f = accessorFuns[[idx]];
+  f(x, value);
+  x;
+}
+
+
+);
+# end of accessor method for _THyPhyNumber
+setMethod('delete', '_p__THyPhyNumber', function(obj) {delete__THyPhyNumber(obj)})
+# Start of new__THyPhyMatrix
+
+`_THyPhyMatrix__SWIG_0` = function()
+{
+  ;ans = .Call('R_swig_new__THyPhyMatrix__SWIG_0', PACKAGE='HyPhy');
+  class(ans) <- "_p__THyPhyMatrix";
+  
+  reg.finalizer(ans, delete__THyPhyMatrix)
+  ans
+  
+}
+
+attr(`_THyPhyMatrix__SWIG_0`, 'returnType') = '_p__THyPhyMatrix'
+class(`_THyPhyMatrix__SWIG_0`) = c("SWIGFunction", class('_THyPhyMatrix__SWIG_0'))
+
+# Start of new__THyPhyMatrix
+
+`_THyPhyMatrix__SWIG_1` = function(s_arg1, s_arg2, s_arg3)
+{
+  s_arg1 = as.integer(s_arg1); 
+  
+  if(length(s_arg1) > 1) {
+    warning("using only the first element of s_arg1");
+  };
+  
+  s_arg2 = as.integer(s_arg2); 
+  
+  if(length(s_arg2) > 1) {
+    warning("using only the first element of s_arg2");
+  };
+  
+  
+  ;ans = .Call('R_swig_new__THyPhyMatrix__SWIG_1', s_arg1, s_arg2, s_arg3, PACKAGE='HyPhy');
+  class(ans) <- "_p__THyPhyMatrix";
+  
+  reg.finalizer(ans, delete__THyPhyMatrix)
+  ans
+  
+}
+
+attr(`_THyPhyMatrix__SWIG_1`, 'returnType') = '_p__THyPhyMatrix'
+attr(`_THyPhyMatrix__SWIG_1`, "inputTypes") = c('integer', 'integer', 'numeric')
+class(`_THyPhyMatrix__SWIG_1`) = c("SWIGFunction", class('_THyPhyMatrix__SWIG_1'))
+
+`_THyPhyMatrix` <- function(...) {
+  argtypes <- mapply(class, list(...));
+  argv <- list(...);
+  argc <- length(argtypes);
+# dispatch functions 2
+  if (argc == 0) {
+    f <- _THyPhyMatrix__SWIG_0; 
+  } else if (argc == 3) {
+    if ((is.integer(argv[[1]]) || is.numeric(argv[[1]])) && (is.integer(argv[[2]]) || is.numeric(argv[[2]])) && is.numeric(argv[[3]])) {
+      f <- _THyPhyMatrix__SWIG_1; 
+    }
+  } else {
+    stop("cannot find overloaded function for _THyPhyMatrix with argtypes (",toString(argtypes),")");
+  };
+  f(...);
+}
+
+# Dispatch function
+# Start of _THyPhyMatrix_myType
+
+`_THyPhyMatrix_myType` = function(self, .copy = FALSE)
+{
+  ;.Call('R_swig__THyPhyMatrix_myType', self, as.logical(.copy), PACKAGE='HyPhy');
+  
+}
+
+attr(`_THyPhyMatrix_myType`, 'returnType') = 'integer'
+attr(`_THyPhyMatrix_myType`, "inputTypes") = c('_p__THyPhyMatrix')
+class(`_THyPhyMatrix_myType`) = c("SWIGFunction", class('_THyPhyMatrix_myType'))
+
+# Start of delete__THyPhyMatrix
+
+`delete__THyPhyMatrix` = function(self)
+{
+  ;.Call('R_swig_delete__THyPhyMatrix', self, PACKAGE='HyPhy');
+  
+}
+
+attr(`delete__THyPhyMatrix`, 'returnType') = 'void'
+attr(`delete__THyPhyMatrix`, "inputTypes") = c('_p__THyPhyMatrix')
+class(`delete__THyPhyMatrix`) = c("SWIGFunction", class('delete__THyPhyMatrix'))
+
+# Start of _THyPhyMatrix_MatrixCell
+
+`_THyPhyMatrix_MatrixCell` = function(self, s_arg2, s_arg3, .copy = FALSE)
+{
+  s_arg2 = as.integer(s_arg2); 
+  
+  if(length(s_arg2) > 1) {
+    warning("using only the first element of s_arg2");
+  };
+  
+  s_arg3 = as.integer(s_arg3); 
+  
+  if(length(s_arg3) > 1) {
+    warning("using only the first element of s_arg3");
+  };
+  
+  ;.Call('R_swig__THyPhyMatrix_MatrixCell', self, s_arg2, s_arg3, as.logical(.copy), PACKAGE='HyPhy');
+  
+}
+
+attr(`_THyPhyMatrix_MatrixCell`, 'returnType') = 'numeric'
+attr(`_THyPhyMatrix_MatrixCell`, "inputTypes") = c('_p__THyPhyMatrix', 'integer', 'integer')
+class(`_THyPhyMatrix_MatrixCell`) = c("SWIGFunction", class('_THyPhyMatrix_MatrixCell'))
+
+# Start of _THyPhyMatrix_mRows_set
+
+`_THyPhyMatrix_mRows_set` = function(self, s_mRows)
+{
+  s_mRows = as.integer(s_mRows); 
+  
+  if(length(s_mRows) > 1) {
+    warning("using only the first element of s_mRows");
+  };
+  
+  ;.Call('R_swig__THyPhyMatrix_mRows_set', self, s_mRows, PACKAGE='HyPhy');
+  
+}
+
+attr(`_THyPhyMatrix_mRows_set`, 'returnType') = 'void'
+attr(`_THyPhyMatrix_mRows_set`, "inputTypes") = c('_p__THyPhyMatrix', 'integer')
+class(`_THyPhyMatrix_mRows_set`) = c("SWIGFunction", class('_THyPhyMatrix_mRows_set'))
+
+# Start of _THyPhyMatrix_mRows_get
+
+`_THyPhyMatrix_mRows_get` = function(self, .copy = FALSE)
+{
+  ;.Call('R_swig__THyPhyMatrix_mRows_get', self, as.logical(.copy), PACKAGE='HyPhy');
+  
+}
+
+attr(`_THyPhyMatrix_mRows_get`, 'returnType') = 'integer'
+attr(`_THyPhyMatrix_mRows_get`, "inputTypes") = c('_p__THyPhyMatrix')
+class(`_THyPhyMatrix_mRows_get`) = c("SWIGFunction", class('_THyPhyMatrix_mRows_get'))
+
+# Start of _THyPhyMatrix_mCols_set
+
+`_THyPhyMatrix_mCols_set` = function(self, s_mCols)
+{
+  s_mCols = as.integer(s_mCols); 
+  
+  if(length(s_mCols) > 1) {
+    warning("using only the first element of s_mCols");
+  };
+  
+  ;.Call('R_swig__THyPhyMatrix_mCols_set', self, s_mCols, PACKAGE='HyPhy');
+  
+}
+
+attr(`_THyPhyMatrix_mCols_set`, 'returnType') = 'void'
+attr(`_THyPhyMatrix_mCols_set`, "inputTypes") = c('_p__THyPhyMatrix', 'integer')
+class(`_THyPhyMatrix_mCols_set`) = c("SWIGFunction", class('_THyPhyMatrix_mCols_set'))
+
+# Start of _THyPhyMatrix_mCols_get
+
+`_THyPhyMatrix_mCols_get` = function(self, .copy = FALSE)
+{
+  ;.Call('R_swig__THyPhyMatrix_mCols_get', self, as.logical(.copy), PACKAGE='HyPhy');
+  
+}
+
+attr(`_THyPhyMatrix_mCols_get`, 'returnType') = 'integer'
+attr(`_THyPhyMatrix_mCols_get`, "inputTypes") = c('_p__THyPhyMatrix')
+class(`_THyPhyMatrix_mCols_get`) = c("SWIGFunction", class('_THyPhyMatrix_mCols_get'))
+
+# Start of _THyPhyMatrix_mData_set
+
+`_THyPhyMatrix_mData_set` = function(self, s_mData)
+{
+  ;.Call('R_swig__THyPhyMatrix_mData_set', self, s_mData, PACKAGE='HyPhy');
+  
+}
+
+attr(`_THyPhyMatrix_mData_set`, 'returnType') = 'void'
+attr(`_THyPhyMatrix_mData_set`, "inputTypes") = c('_p__THyPhyMatrix', 'numeric')
+class(`_THyPhyMatrix_mData_set`) = c("SWIGFunction", class('_THyPhyMatrix_mData_set'))
+
+# Start of _THyPhyMatrix_mData_get
+
+`_THyPhyMatrix_mData_get` = function(self)
+{
+  ;ans = .Call('R_swig__THyPhyMatrix_mData_get', self, PACKAGE='HyPhy');
+  class(ans) <- "_p_double";
+  
+  ans
+  
+}
+
+attr(`_THyPhyMatrix_mData_get`, 'returnType') = 'numeric'
+attr(`_THyPhyMatrix_mData_get`, "inputTypes") = c('_p__THyPhyMatrix')
+class(`_THyPhyMatrix_mData_get`) = c("SWIGFunction", class('_THyPhyMatrix_mData_get'))
+
+# Start of accessor method for _THyPhyMatrix
+setMethod('$', '_p__THyPhyMatrix', function(x, name)
+
+{
+  accessorFuns = list('myType' = _THyPhyMatrix_myType, 'MatrixCell' = _THyPhyMatrix_MatrixCell, 'mRows' = _THyPhyMatrix_mRows_get, 'mCols' = _THyPhyMatrix_mCols_get, 'mData' = _THyPhyMatrix_mData_get);
+  vaccessors = c('mRows', 'mCols', 'mData');
+  ;        idx = pmatch(name, names(accessorFuns));
+  if(is.na(idx)) 
+  return(callNextMethod(x, name));
+  f = accessorFuns[[idx]];
+  formals(f)[[1]] = x;
+  if (is.na(match(name, vaccessors))) f else f(x);
+}
+
+
+);
+# end of accessor method for _THyPhyMatrix
+# Start of accessor method for _THyPhyMatrix
+setMethod('$<-', '_p__THyPhyMatrix', function(x, name, value)
+
+{
+  accessorFuns = list('mRows' = _THyPhyMatrix_mRows_set, 'mCols' = _THyPhyMatrix_mCols_set, 'mData' = _THyPhyMatrix_mData_set);
+  ;        idx = pmatch(name, names(accessorFuns));
+  if(is.na(idx)) 
+  return(callNextMethod(x, name, value));
+  f = accessorFuns[[idx]];
+  f(x, value);
+  x;
+}
+
+
+);
+setMethod('[[<-', c('_p__THyPhyMatrix', 'character'),function(x, i, j, ..., value)
+
+{
+  name = i;
+  accessorFuns = list('mRows' = _THyPhyMatrix_mRows_set, 'mCols' = _THyPhyMatrix_mCols_set, 'mData' = _THyPhyMatrix_mData_set);
+  ;        idx = pmatch(name, names(accessorFuns));
+  if(is.na(idx)) 
+  return(callNextMethod(x, name, value));
+  f = accessorFuns[[idx]];
+  f(x, value);
+  x;
+}
+
+
+);
+# end of accessor method for _THyPhyMatrix
+setMethod('delete', '_p__THyPhyMatrix', function(obj) {delete__THyPhyMatrix(obj)})
+# Start of new__THyPhy
+
+`_THyPhy__SWIG_0` = function(s_arg1, s_arg2, s_arg3)
+{
+  s_arg2 = as(s_arg2, "character"); 
+  s_arg3 = as.integer(s_arg3); 
+  
+  if(length(s_arg3) > 1) {
+    warning("using only the first element of s_arg3");
+  };
+  
+  ;ans = .Call('R_swig_new__THyPhy__SWIG_0', s_arg1, s_arg2, s_arg3, PACKAGE='HyPhy');
+  class(ans) <- "_p__THyPhy";
+  
+  reg.finalizer(ans, delete__THyPhy)
+  ans
+  
+}
+
+attr(`_THyPhy__SWIG_0`, 'returnType') = '_p__THyPhy'
+attr(`_THyPhy__SWIG_0`, "inputTypes") = c('_p_f_p_char_int_double__bool', 'character', 'integer')
+class(`_THyPhy__SWIG_0`) = c("SWIGFunction", class('_THyPhy__SWIG_0'))
+
+# Start of new__THyPhy
+
+`_THyPhy__SWIG_1` = function(s_arg1, s_arg2)
+{
+  s_arg2 = as(s_arg2, "character"); 
+  ;ans = .Call('R_swig_new__THyPhy__SWIG_1', s_arg1, s_arg2, PACKAGE='HyPhy');
+  class(ans) <- "_p__THyPhy";
+  
+  reg.finalizer(ans, delete__THyPhy)
+  ans
+  
+}
+
+attr(`_THyPhy__SWIG_1`, 'returnType') = '_p__THyPhy'
+attr(`_THyPhy__SWIG_1`, "inputTypes") = c('_p_f_p_char_int_double__bool', 'character')
+class(`_THyPhy__SWIG_1`) = c("SWIGFunction", class('_THyPhy__SWIG_1'))
+
+# Start of new__THyPhy
+
+`_THyPhy__SWIG_2` = function(s_arg1, s_arg2)
+{
+  s_arg1 = as(s_arg1, "character"); 
+  s_arg2 = as.integer(s_arg2); 
+  
+  if(length(s_arg2) > 1) {
+    warning("using only the first element of s_arg2");
+  };
+  
+  ;ans = .Call('R_swig_new__THyPhy__SWIG_2', s_arg1, s_arg2, PACKAGE='HyPhy');
+  class(ans) <- "_p__THyPhy";
+  
+  reg.finalizer(ans, delete__THyPhy)
+  ans
+  
+}
+
+attr(`_THyPhy__SWIG_2`, 'returnType') = '_p__THyPhy'
+attr(`_THyPhy__SWIG_2`, "inputTypes") = c('character', 'integer')
+class(`_THyPhy__SWIG_2`) = c("SWIGFunction", class('_THyPhy__SWIG_2'))
+
+# Start of new__THyPhy
+
+`_THyPhy__SWIG_3` = function(s_arg1)
+{
+  s_arg1 = as(s_arg1, "character"); 
+  ;ans = .Call('R_swig_new__THyPhy__SWIG_3', s_arg1, PACKAGE='HyPhy');
+  class(ans) <- "_p__THyPhy";
+  
+  reg.finalizer(ans, delete__THyPhy)
+  ans
+  
+}
+
+attr(`_THyPhy__SWIG_3`, 'returnType') = '_p__THyPhy'
+attr(`_THyPhy__SWIG_3`, "inputTypes") = c('character')
+class(`_THyPhy__SWIG_3`) = c("SWIGFunction", class('_THyPhy__SWIG_3'))
+
+`_THyPhy` <- function(...) {
+  argtypes <- mapply(class, list(...));
+  argv <- list(...);
+  argc <- length(argtypes);
+# dispatch functions 4
+  if (argc == 1) {
+    if (is.character(argv[[1]])) {
+      f <- _THyPhy__SWIG_3; 
+    }
+  } else if (argc == 2) {
+    if (extends(argtypes[1], '_p_f_p_char_int_double__bool') && is.character(argv[[2]])) {
+      f <- _THyPhy__SWIG_1; 
+    }
+    else if (is.character(argv[[1]]) && (is.integer(argv[[2]]) || is.numeric(argv[[2]]))) {
+      f <- _THyPhy__SWIG_2; 
+    }
+  } else if (argc == 3) {
+    if (extends(argtypes[1], '_p_f_p_char_int_double__bool') && is.character(argv[[2]]) && (is.integer(argv[[3]]) || is.numeric(argv[[3]]))) {
+      f <- _THyPhy__SWIG_0; 
+    }
+  } else {
+    stop("cannot find overloaded function for _THyPhy with argtypes (",toString(argtypes),")");
+  };
+  f(...);
+}
+
+# Dispatch function
+# Start of delete__THyPhy
+
+`delete__THyPhy` = function(self)
+{
+  ;.Call('R_swig_delete__THyPhy', self, PACKAGE='HyPhy');
+  
+}
+
+attr(`delete__THyPhy`, 'returnType') = 'void'
+attr(`delete__THyPhy`, "inputTypes") = c('_p__THyPhy')
+class(`delete__THyPhy`) = c("SWIGFunction", class('delete__THyPhy'))
+
+# Start of _THyPhy_ExecuteBF
+
+`_THyPhy_ExecuteBF__SWIG_0` = function(self, s_arg2, s_arg3)
+{
+  s_arg2 = as(s_arg2, "character"); 
+  s_arg3 = as.logical(s_arg3);
+  ;ans = .Call('R_swig__THyPhy_ExecuteBF__SWIG_0', self, s_arg2, s_arg3, PACKAGE='HyPhy');
+  class(ans) <- "_p__THyPhyString";
+  
+  ans
+  
+}
+
+attr(`_THyPhy_ExecuteBF__SWIG_0`, 'returnType') = '_p__THyPhyString'
+attr(`_THyPhy_ExecuteBF__SWIG_0`, "inputTypes") = c('_p__THyPhy', 'character', 'logical')
+class(`_THyPhy_ExecuteBF__SWIG_0`) = c("SWIGFunction", class('_THyPhy_ExecuteBF__SWIG_0'))
+
+# Start of _THyPhy_ExecuteBF
+
+`_THyPhy_ExecuteBF__SWIG_1` = function(self, s_arg2)
+{
+  s_arg2 = as(s_arg2, "character"); 
+  ;ans = .Call('R_swig__THyPhy_ExecuteBF__SWIG_1', self, s_arg2, PACKAGE='HyPhy');
+  class(ans) <- "_p__THyPhyString";
+  
+  ans
+  
+}
+
+attr(`_THyPhy_ExecuteBF__SWIG_1`, 'returnType') = '_p__THyPhyString'
+attr(`_THyPhy_ExecuteBF__SWIG_1`, "inputTypes") = c('_p__THyPhy', 'character')
+class(`_THyPhy_ExecuteBF__SWIG_1`) = c("SWIGFunction", class('_THyPhy_ExecuteBF__SWIG_1'))
+
+`_THyPhy_ExecuteBF` <- function(...) {
+  argtypes <- mapply(class, list(...));
+  argv <- list(...);
+  argc <- length(argtypes);
+# dispatch functions 2
+  if (argc == 2) {
+    if (extends(argtypes[1], '_p__THyPhy') && is.character(argv[[2]])) {
+      f <- _THyPhy_ExecuteBF__SWIG_1; 
+    }
+  } else if (argc == 3) {
+    if (extends(argtypes[1], '_p__THyPhy') && is.character(argv[[2]]) && extends(argtypes[3], 'logical')) {
+      f <- _THyPhy_ExecuteBF__SWIG_0; 
+    }
+  } else {
+    stop("cannot find overloaded function for _THyPhy_ExecuteBF with argtypes (",toString(argtypes),")");
+  };
+  f(...);
+}
+
+# Dispatch function
+# Start of _THyPhy_InitTHyPhy
+
+`_THyPhy_InitTHyPhy` = function(self, s_arg2, s_arg3, s_arg4)
+{
+  s_arg3 = as(s_arg3, "character"); 
+  s_arg4 = as.integer(s_arg4); 
+  
+  if(length(s_arg4) > 1) {
+    warning("using only the first element of s_arg4");
+  };
+  
+  ;.Call('R_swig__THyPhy_InitTHyPhy', self, s_arg2, s_arg3, s_arg4, PACKAGE='HyPhy');
+  
+}
+
+attr(`_THyPhy_InitTHyPhy`, 'returnType') = 'void'
+attr(`_THyPhy_InitTHyPhy`, "inputTypes") = c('_p__THyPhy', '_p_f_p_char_int_double__bool', 'character', 'integer')
+class(`_THyPhy_InitTHyPhy`) = c("SWIGFunction", class('_THyPhy_InitTHyPhy'))
+
+# Start of _THyPhy_ClearAll
+
+`_THyPhy_ClearAll` = function(self)
+{
+  ;.Call('R_swig__THyPhy_ClearAll', self, PACKAGE='HyPhy');
+  
+}
+
+attr(`_THyPhy_ClearAll`, 'returnType') = 'void'
+attr(`_THyPhy_ClearAll`, "inputTypes") = c('_p__THyPhy')
+class(`_THyPhy_ClearAll`) = c("SWIGFunction", class('_THyPhy_ClearAll'))
+
+# Start of _THyPhy_AskFor
+
+`_THyPhy_AskFor` = function(self, s_arg2)
+{
+  s_arg2 = as(s_arg2, "character"); 
+  ;ans = .Call('R_swig__THyPhy_AskFor', self, s_arg2, PACKAGE='HyPhy');
+  class(ans) <- "_p_void";
+  
+  ans
+  
+}
+
+attr(`_THyPhy_AskFor`, 'returnType') = '_p_void'
+attr(`_THyPhy_AskFor`, "inputTypes") = c('_p__THyPhy', 'character')
+class(`_THyPhy_AskFor`) = c("SWIGFunction", class('_THyPhy_AskFor'))
+
+# Start of _THyPhy_DumpResult
+
+`_THyPhy_DumpResult` = function(self, s_arg2)
+{
+  ;.Call('R_swig__THyPhy_DumpResult', self, s_arg2, PACKAGE='HyPhy');
+  
+}
+
+attr(`_THyPhy_DumpResult`, 'returnType') = 'void'
+attr(`_THyPhy_DumpResult`, "inputTypes") = c('_p__THyPhy', '_p_void')
+class(`_THyPhy_DumpResult`) = c("SWIGFunction", class('_THyPhy_DumpResult'))
+
+# Start of _THyPhy_CanCast
+
+`_THyPhy_CanCast` = function(self, s_arg2, s_arg3, .copy = FALSE)
+{
+  s_arg3 = as.integer(s_arg3); 
+  
+  if(length(s_arg3) > 1) {
+    warning("using only the first element of s_arg3");
+  };
+  
+  ;.Call('R_swig__THyPhy_CanCast', self, s_arg2, s_arg3, as.logical(.copy), PACKAGE='HyPhy');
+  
+}
+
+attr(`_THyPhy_CanCast`, 'returnType') = 'logical'
+attr(`_THyPhy_CanCast`, "inputTypes") = c('_p__THyPhy', '_p_void', 'integer')
+class(`_THyPhy_CanCast`) = c("SWIGFunction", class('_THyPhy_CanCast'))
+
+# Start of _THyPhy_CastResult
+
+`_THyPhy_CastResult` = function(self, s_arg2, s_arg3)
+{
+  s_arg3 = as.integer(s_arg3); 
+  
+  if(length(s_arg3) > 1) {
+    warning("using only the first element of s_arg3");
+  };
+  
+  ;ans = .Call('R_swig__THyPhy_CastResult', self, s_arg2, s_arg3, PACKAGE='HyPhy');
+  class(ans) <- "_p__THyPhyReturnObject";
+  
+  ans
+  
+}
+
+attr(`_THyPhy_CastResult`, 'returnType') = '_p__THyPhyReturnObject'
+attr(`_THyPhy_CastResult`, "inputTypes") = c('_p__THyPhy', '_p_void', 'integer')
+class(`_THyPhy_CastResult`) = c("SWIGFunction", class('_THyPhy_CastResult'))
+
+# Start of _THyPhy_SetCallbackHandler
+
+`_THyPhy_SetCallbackHandler` = function(self, s_arg2)
+{
+  ;.Call('R_swig__THyPhy_SetCallbackHandler', self, s_arg2, PACKAGE='HyPhy');
+  
+}
+
+attr(`_THyPhy_SetCallbackHandler`, 'returnType') = 'void'
+attr(`_THyPhy_SetCallbackHandler`, "inputTypes") = c('_p__THyPhy', '_p_f_p_char_int_double__bool')
+class(`_THyPhy_SetCallbackHandler`) = c("SWIGFunction", class('_THyPhy_SetCallbackHandler'))
+
+# Start of _THyPhy_GetCallbackHandler
+
+`_THyPhy_GetCallbackHandler` = function(self)
+{
+  ;ans = .Call('R_swig__THyPhy_GetCallbackHandler', self, PACKAGE='HyPhy');
+  class(ans) <- "_p_f_p_char_int_double__bool";
+  
+  ans
+  
+}
+
+attr(`_THyPhy_GetCallbackHandler`, 'returnType') = '_p_f_p_char_int_double__bool'
+attr(`_THyPhy_GetCallbackHandler`, "inputTypes") = c('_p__THyPhy')
+class(`_THyPhy_GetCallbackHandler`) = c("SWIGFunction", class('_THyPhy_GetCallbackHandler'))
+
+# Start of _THyPhy_GetWarnings
+
+`_THyPhy_GetWarnings` = function(self)
+{
+  ;ans = .Call('R_swig__THyPhy_GetWarnings', self, PACKAGE='HyPhy');
+  class(ans) <- "_p__THyPhyString";
+  
+  ans
+  
+}
+
+attr(`_THyPhy_GetWarnings`, 'returnType') = '_p__THyPhyString'
+attr(`_THyPhy_GetWarnings`, "inputTypes") = c('_p__THyPhy')
+class(`_THyPhy_GetWarnings`) = c("SWIGFunction", class('_THyPhy_GetWarnings'))
+
+# Start of _THyPhy_GetErrors
+
+`_THyPhy_GetErrors` = function(self)
+{
+  ;ans = .Call('R_swig__THyPhy_GetErrors', self, PACKAGE='HyPhy');
+  class(ans) <- "_p__THyPhyString";
+  
+  ans
+  
+}
+
+attr(`_THyPhy_GetErrors`, 'returnType') = '_p__THyPhyString'
+attr(`_THyPhy_GetErrors`, "inputTypes") = c('_p__THyPhy')
+class(`_THyPhy_GetErrors`) = c("SWIGFunction", class('_THyPhy_GetErrors'))
+
+# Start of _THyPhy_GetStdout
+
+`_THyPhy_GetStdout` = function(self)
+{
+  ;ans = .Call('R_swig__THyPhy_GetStdout', self, PACKAGE='HyPhy');
+  class(ans) <- "_p__THyPhyString";
+  
+  ans
+  
+}
+
+attr(`_THyPhy_GetStdout`, 'returnType') = '_p__THyPhyString'
+attr(`_THyPhy_GetStdout`, "inputTypes") = c('_p__THyPhy')
+class(`_THyPhy_GetStdout`) = c("SWIGFunction", class('_THyPhy_GetStdout'))
+
+# Start of _THyPhy_PushWarning
+
+`_THyPhy_PushWarning` = function(self, s_arg2)
+{
+  ;.Call('R_swig__THyPhy_PushWarning', self, s_arg2, PACKAGE='HyPhy');
+  
+}
+
+attr(`_THyPhy_PushWarning`, 'returnType') = 'void'
+attr(`_THyPhy_PushWarning`, "inputTypes") = c('_p__THyPhy', '_p_void')
+class(`_THyPhy_PushWarning`) = c("SWIGFunction", class('_THyPhy_PushWarning'))
+
+# Start of _THyPhy_PushError
+
+`_THyPhy_PushError` = function(self, s_arg2)
+{
+  ;.Call('R_swig__THyPhy_PushError', self, s_arg2, PACKAGE='HyPhy');
+  
+}
+
+attr(`_THyPhy_PushError`, 'returnType') = 'void'
+attr(`_THyPhy_PushError`, "inputTypes") = c('_p__THyPhy', '_p_void')
+class(`_THyPhy_PushError`) = c("SWIGFunction", class('_THyPhy_PushError'))
+
+# Start of _THyPhy_PushOutString
+
+`_THyPhy_PushOutString` = function(self, s_arg2)
+{
+  ;.Call('R_swig__THyPhy_PushOutString', self, s_arg2, PACKAGE='HyPhy');
+  
+}
+
+attr(`_THyPhy_PushOutString`, 'returnType') = 'void'
+attr(`_THyPhy_PushOutString`, "inputTypes") = c('_p__THyPhy', '_p_void')
+class(`_THyPhy_PushOutString`) = c("SWIGFunction", class('_THyPhy_PushOutString'))
+
+# Start of accessor method for _THyPhy
+setMethod('$', '_p__THyPhy', function(x, name)
+
+{
+  accessorFuns = list('ExecuteBF' = _THyPhy_ExecuteBF, 'InitTHyPhy' = _THyPhy_InitTHyPhy, 'ClearAll' = _THyPhy_ClearAll, 'AskFor' = _THyPhy_AskFor, 'DumpResult' = _THyPhy_DumpResult, 'CanCast' = _THyPhy_CanCast, 'CastResult' = _THyPhy_CastResult, 'SetCallbackHandler' = _THyPhy_SetCallbackHandler, 'GetCallbackHandler' = _THyPhy_GetCallbackHandler, 'GetWarnings' = _THyPhy_GetWarnings, 'GetErrors' = _THyPhy_GetErrors, 'GetStdout' = _THyPhy_GetStdout, 'PushWarning' = _THyPhy_PushWarning, 'Pu [...]
+  ;        idx = pmatch(name, names(accessorFuns));
+  if(is.na(idx)) 
+  return(callNextMethod(x, name));
+  f = accessorFuns[[idx]];
+  formals(f)[[1]] = x;
+  f;
+}
+
+
+);
+# end of accessor method for _THyPhy
+setMethod('delete', '_p__THyPhy', function(obj) {delete__THyPhy(obj)})
+# Start of _THyPhyGetLongStatus
+
+`_THyPhyGetLongStatus` = function(.copy = FALSE)
+{
+  ;.Call('R_swig__THyPhyGetLongStatus', as.logical(.copy), PACKAGE='HyPhy');
+  
+}
+
+attr(`_THyPhyGetLongStatus`, 'returnType') = 'integer'
+class(`_THyPhyGetLongStatus`) = c("SWIGFunction", class('_THyPhyGetLongStatus'))
+
+# Start of _THyPhyGetStringStatus
+
+`_THyPhyGetStringStatus` = function()
+{
+  ;.Call('R_swig__THyPhyGetStringStatus', PACKAGE='HyPhy');
+  
+}
+
+attr(`_THyPhyGetStringStatus`, 'returnType') = 'character'
+class(`_THyPhyGetStringStatus`) = c("SWIGFunction", class('_THyPhyGetStringStatus'))
+
+# Start of _THyPhyGetDoubleStatus
+
+`_THyPhyGetDoubleStatus` = function(.copy = FALSE)
+{
+  ;.Call('R_swig__THyPhyGetDoubleStatus', as.logical(.copy), PACKAGE='HyPhy');
+  
+}
+
+attr(`_THyPhyGetDoubleStatus`, 'returnType') = 'numeric'
+class(`_THyPhyGetDoubleStatus`) = c("SWIGFunction", class('_THyPhyGetDoubleStatus'))
+
+# Start of globalInterfaceInstance_set
+
+`globalInterfaceInstance_set` = function(s_globalInterfaceInstance)
+{
+  ;.Call('R_swig_globalInterfaceInstance_set', s_globalInterfaceInstance, PACKAGE='HyPhy');
+  
+}
+
+attr(`globalInterfaceInstance_set`, 'returnType') = 'void'
+attr(`globalInterfaceInstance_set`, "inputTypes") = c('_p__THyPhy')
+class(`globalInterfaceInstance_set`) = c("SWIGFunction", class('globalInterfaceInstance_set'))
+
+# Start of globalInterfaceInstance_get
+
+`globalInterfaceInstance_get` = function()
+{
+  ;ans = .Call('R_swig_globalInterfaceInstance_get', PACKAGE='HyPhy');
+  class(ans) <- "_p__THyPhy";
+  
+  ans
+  
+}
+
+attr(`globalInterfaceInstance_get`, 'returnType') = '_p__THyPhy'
+class(`globalInterfaceInstance_get`) = c("SWIGFunction", class('globalInterfaceInstance_get'))
+
+globalInterfaceInstance = 
+function(value)
+{
+  if(missing(value)) {
+    globalInterfaceInstance_get()
+  } else {
+    globalInterfaceInstance_set(value)
+  }
+}
+
+
diff --git a/src/lib/Link/THyPhy.cpp b/src/lib/Link/THyPhy.cpp
new file mode 100644
index 0000000..73807ca
--- /dev/null
+++ b/src/lib/Link/THyPhy.cpp
@@ -0,0 +1,518 @@
+/*
+
+HyPhy - Hypothesis Testing Using Phylogenies.
+
+This file implements data and interface classes
+used for linking HyPhy with MEGA
+
+Written by SL Kosakovsky Pond; June 2007
+Dedicated to Comet (http://www.hyphy.org/comet.jpg)
+?/?/1999-06/05/2007
+
+Copyright (C) 1997-now
+Core Developers:
+  Sergei L Kosakovsky Pond (spond at ucsd.edu)
+  Art FY Poon    (apoon at cfenet.ubc.ca)
+  Steven Weaver (sweaver at ucsd.edu)
+  
+Module Developers:
+	Lance Hepler (nlhepler at gmail.com)
+	Martin Smith (martin.audacis at gmail.com)
+
+Significant contributions from:
+  Spencer V Muse (muse at stat.ncsu.edu)
+  Simon DW Frost (sdf22 at cam.ac.uk)
+
+Permission is hereby granted, free of charge, to any person obtaining a
+copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be included
+in all copies or substantial portions of the Software.
+
+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.
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+*/
+
+
+#include "THyPhy.h"
+#include "batchlan.h"
+#include "string.h"
+
+
+/* declare some utility functions */
+
+void    ReadPreferences         (void);
+void    ApplyPreferences        (void);
+
+/* global variables */
+
+_String _tHYPHYAskFor           ("_THyPhyAskFor"),
+        _tHYPHYNotHandled       ("_THyPhy_NOT_HANDLED_"),
+        _tHYPHYCurrentStatus;
+
+long    _tHYPHYDone             = 0;
+double  _tHYPHYValue            = 0.0;
+
+extern long systemCPUCount;
+
+_THyPhy * globalInterfaceInstance = nil;
+
+//_________________________________________________________
+// default callback hanlder
+bool _tHyPhyDefaultHandler (char*,int,double)
+{
+    return true;
+}
+
+//_________________________________________________________
+// default callback hanlder
+//void SetGlobalInterfaceInstance (const _THyPhy* hi)
+//{
+//  globalInterfaceInstance = hi;
+//}
+
+
+/* Basic return types supported by the interface object */
+
+//_________________________________________________________
+_THyPhyString* _THyPhyReturnObject::castToString(void)
+{
+    if (myType() == THYPHY_TYPE_STRING) {
+        return (_THyPhyString*)this;
+    }
+    return NULL;
+}
+
+//_________________________________________________________
+_THyPhyNumber* _THyPhyReturnObject::castToNumber(void)
+{
+    if (myType() == THYPHY_TYPE_NUMBER) {
+        return (_THyPhyNumber*)this;
+    }
+    return NULL;
+}
+
+//_________________________________________________________
+_THyPhyMatrix* _THyPhyReturnObject::castToMatrix(void)
+{
+    if (myType() == THYPHY_TYPE_MATRIX) {
+        return (_THyPhyMatrix*)this;
+    }
+    return NULL;
+}
+
+
+//_________________________________________________________
+_THyPhyString::_THyPhyString(const char* characters, long length)
+{
+    if (characters) {
+        if (length == 0) {
+            while (characters[length++]) ;
+            length --;
+        }
+        checkPointer (sData = (char*)MemAllocate (length+1));
+        memcpy       (sData,characters,length+1);
+
+    } else {
+        sData   = nil;
+    }
+    sLength = length;
+}
+
+//_________________________________________________________
+_THyPhyString::~_THyPhyString(void)
+{
+    if (sData) {
+        free (sData);
+    }
+};
+
+//_________________________________________________________
+_THyPhyNumber::_THyPhyNumber(double v)
+{
+    nValue = v;
+}
+
+
+//_________________________________________________________
+_THyPhyMatrix::_THyPhyMatrix(void)
+{
+    mData = nil;
+    mRows = 0;
+    mCols = 0;
+}
+
+//_________________________________________________________
+_THyPhyMatrix::_THyPhyMatrix(const long r, const long c, const double* d)
+{
+    checkPointer (mData = (double*)MemAllocate (r*c*sizeof(double)));
+    mRows = r;
+    mCols = c;
+    for (long i = 0; i < r*c; i++,d++) {
+        mData[i] = *d;
+    }
+
+}
+
+//_________________________________________________________
+_THyPhyMatrix::~_THyPhyMatrix(void)
+{
+    if (mData) {
+        free (mData);
+    }
+};
+
+//_________________________________________________________
+double _THyPhyMatrix::MatrixCell(long r, long c)
+{
+    return mData[mCols*r+c];
+}
+
+//_________________________________________________________
+// Begin _THyPhy definitions
+//_________________________________________________________
+
+_THyPhy::_THyPhy(_ProgressCancelHandler* mHandler, const char* baseDirPath, long cpuCount)
+{
+    InitTHyPhy (mHandler, baseDirPath, cpuCount);
+}
+
+//_________________________________________________________
+
+
+_THyPhy::_THyPhy(const char* baseDirPath, long cpuCount)
+{
+    InitTHyPhy (_tHyPhyDefaultHandler, baseDirPath, cpuCount);
+}
+
+//_________________________________________________________
+
+_THyPhy::~_THyPhy           (void)
+{
+    if (currentResultHolder) {
+        delete (_THyPhyReturnObject*)currentResultHolder;
+    }
+    if (baseDirectoryInstance) {
+        delete (baseDirectoryInstance);
+    }
+    ClearAll();
+    DeleteObject        ((_String*)errors);
+    DeleteObject        ((_String*)warnings);
+    DeleteObject        ((_String*)textout);
+    if (globalInterfaceInstance == this) {
+        globalInterfaceInstance = nil;
+    }
+
+    PurgeAll(true);
+    GlobalShutdown();
+}
+
+//_________________________________________________________
+
+void _THyPhy::InitTHyPhy (_ProgressCancelHandler* mHandler, const char* baseDirPath, long cpuCount)
+{
+    char dirSlash = GetPlatformDirectoryChar ();
+    systemCPUCount = cpuCount;
+    SetCallbackHandler (mHandler);
+    checkPointer (currentResultHolder = new _THyPhyString);
+    askFID = -1;
+    if (baseDirPath)
+        // set base directory
+    {
+        baseDirectory = baseDirPath;
+        if (baseDirectory.getChar(baseDirectory.sLength-1) != dirSlash) {
+            baseDirectory = baseDirectory & dirSlash;
+        }
+        baseDirectoryInstance = new _THyPhyString (baseDirectory.sData);
+        baseDirectory = baseDirectoryInstance->sData;
+        pathNames && &baseDirectory;
+        ReadPreferences ();
+    }
+
+#ifdef _HYPHY_LIBDIRECTORY_    
+    libDirectory = _HYPHY_LIBDIRECTORY_;
+    if (libDirectory.getChar(libDirectory.sLength-1) != dirSlash) {
+        libDirectory = libDirectory & dirSlash;
+    }
+#else
+    if (baseDirectory)
+        libDirectory = baseDirectory;
+#endif
+
+    pathNames && &libDirectory;
+    GlobalStartup();
+    errors   = nil;
+    warnings = nil;
+    textout  = nil;
+    globalInterfaceInstance = this;
+
+}
+
+//_________________________________________________________
+
+_THyPhyString * _THyPhy::ExecuteBF (const char * buffer, bool doPurge)
+{
+    if (doPurge) {
+        PurgeAll            (true);    // cleanup results of previous analysis
+    }
+
+    _String             dd (GetPlatformDirectoryChar());
+
+    _FString            bp  (baseDirectory, false),
+                        lp  (libDirectory, false),
+                        ds  (dd),
+                        cfp (pathNames.lLength?*(_String*)pathNames(pathNames.lLength-1):empty),
+                        * stashed = (_FString*)FetchObjectFromVariableByType (&pathToCurrentBF, STRING);
+
+    setParameter        (platformDirectorySeparator, &ds);
+    setParameter        (hyphyBaseDirectory, &bp);
+    setParameter        (hyphyLibDirectory, &lp);
+
+    if (stashed) {
+        stashed = (_FString*)stashed->makeDynamic();
+    }
+    setParameter        (pathToCurrentBF,&cfp);
+
+    _String             commandString (buffer);
+
+    if (commandString.beginswith ("#NEXUS"),false) {
+        lastNexusDataMatrix = ReadDataSetFile (nil, 2, &commandString);
+        commandString = nexusBFBody;
+    }
+
+    _ExecutionList      compiledCode  (commandString);
+
+    ApplyPreferences    ();
+
+    DeleteObject        ((_String*)errors);
+    DeleteObject        ((_String*)warnings);
+    DeleteObject        ((_String*)textout);
+
+    errors              = new _String (128L,true);
+    warnings            = new _String (128L,true);
+    textout             = new _String (128L,true);
+
+    askFID              = compiledCode.ExecuteAndClean (0x7ffffff,&_tHYPHYAskFor);
+    _PMathObj bfReturn  = compiledCode.GetResult ();
+
+    ((_String*)errors)->Finalize();
+    ((_String*)warnings)->Finalize();
+    ((_String*)textout)->Finalize();
+
+    if (currentResultHolder->sData) {
+        free (currentResultHolder->sData);
+        currentResultHolder->sData = nil;
+    }
+    if (bfReturn) {
+        _String * serializedReturn   = (_String*) bfReturn->toStr();
+        currentResultHolder->sData   = serializedReturn->sData;
+        serializedReturn->sData      = nil;
+        currentResultHolder->sLength = serializedReturn->sLength;
+    }
+    return currentResultHolder;
+}
+
+//_________________________________________________________
+
+void _THyPhy::ClearAll (void)
+{
+    PurgeAll(true);
+}
+
+//_________________________________________________________
+
+void* _THyPhy::AskFor (const char* resultID)
+{
+    if (resultID && askFID >= 0) {
+        _String theCommand (128L,true);
+        theCommand << "return ";
+        theCommand <<  _tHYPHYAskFor;
+        theCommand << "(\"";
+        theCommand.EscapeAndAppend (resultID);
+        theCommand << "\");";
+        theCommand.Finalize();
+        _ExecutionList      compiledCode  (theCommand);
+        compiledCode.ExecuteAndClean (0x7ffffff);
+        _PMathObj retResult = compiledCode.GetResult ();
+        if (retResult && retResult->ObjectClass() == STRING) {
+            _FString * checkHandled = (_FString*)retResult;
+            if (checkHandled->theString->Equal (&_tHYPHYNotHandled)) {
+                return nil;
+            }
+        }
+        return retResult->makeDynamic();
+    }
+    return nil;
+}
+
+//_________________________________________________________
+
+void _THyPhy::DumpResult (void* aResult)
+{
+    if (aResult) {
+        DeleteObject ((BaseRef)aResult);
+    }
+}
+
+//_________________________________________________________
+
+void _THyPhy::SetCallbackHandler (_ProgressCancelHandler* newHandler)
+{
+    theHandler = newHandler;
+}
+
+//_________________________________________________________
+
+_ProgressCancelHandler* _THyPhy::GetCallbackHandler (void)
+{
+    return theHandler;
+}
+
+//_________________________________________________________
+
+void        _THyPhy::PushWarning (void * o)
+{
+    if (warnings) {
+        *((_String*)warnings) << *(_String*)o;
+    }
+}
+
+//_________________________________________________________
+
+void        _THyPhy::PushError (void * o)
+{
+    if (errors) {
+        *((_String*)errors) << *(_String*)o;
+    }
+}
+
+//_________________________________________________________
+
+void        _THyPhy::PushOutString (void * o)
+{
+    if (textout) {
+        *((_String*)textout) << *(_String*)o;
+    }
+}
+
+//_________________________________________________________
+
+_THyPhyString   * _THyPhy::ConvertHyPhyString (void * o)
+{
+    return new _THyPhyString (((_String*)o)->sData,((_String*)o)->sLength);
+}
+
+//_________________________________________________________
+
+bool _THyPhy::CanCast (const void* theObject, const int requestedType)
+{
+    if (theObject) {
+        switch (((_PMathObj)theObject)->ObjectClass()) {
+        case NUMBER:
+            return true;
+            // can cast a number to everything
+        case STRING:
+            return requestedType!=THYPHY_TYPE_MATRIX;
+            // can cast anything to a string
+        case MATRIX:
+            return requestedType!=THYPHY_TYPE_NUMBER;
+            // can not cast matrix to number
+
+        case TREE:
+        case TOPOLOGY:
+            return requestedType==THYPHY_TYPE_STRING;
+
+        }
+    }
+    return false;
+}
+
+//_________________________________________________________
+
+_THyPhyReturnObject* _THyPhy::CastResult (const void* theObject, const int requestedType)
+{
+    _THyPhyReturnObject * convertedObject = nil;
+    if (CanCast(theObject,requestedType)) {
+        int hyphyObjClass = ((_PMathObj)theObject)->ObjectClass();
+        switch (hyphyObjClass) {
+        case NUMBER: {
+            if (hyphyObjClass == NUMBER) {
+                return new _THyPhyNumber (((_PMathObj)theObject)->Compute()->Value());
+            }
+            if (hyphyObjClass == STRING) {
+                _String sV ((_String*)((_FString*)theObject)->toStr());
+                return new _THyPhyNumber (sV.toNum());
+            }
+        }
+        case STRING: {
+            _String sV ((_String*)((_PMathObj)theObject)->toStr());
+            return new _THyPhyString (sV.sData,sV.sLength);
+        }
+        case MATRIX: {
+            if (hyphyObjClass == NUMBER) {
+                double evaluate = ((_PMathObj)theObject)->Compute()->Value();
+                return new _THyPhyMatrix (1,1,&evaluate);
+            }
+
+            if (hyphyObjClass == MATRIX) {
+                _Matrix * evalutedNumeric =  (_Matrix*)((_Matrix*)(((_PMathObj)theObject)->Compute()))
+                                             ->ComputeNumeric();
+
+                return new _THyPhyMatrix (evalutedNumeric->GetHDim(),evalutedNumeric->GetVDim(),evalutedNumeric->theData);
+            }
+        }
+        }
+    }
+
+    return convertedObject;
+}
+
+//_________________________________________________________________________
+
+void    SetStatusLine (_String arg)
+{
+    _tHYPHYCurrentStatus = arg;
+    yieldCPUTime();
+}
+
+//_________________________________________________________________________
+
+void    SetStatusBarValue (long l,_Parameter max, _Parameter rate)
+{
+    _tHYPHYDone = l;
+    _tHYPHYCurrentStatus   = _String ("LF Optimization. Value=") & _String (max) &", "&_String (rate) & " evals/sec.";
+    _tHYPHYValue = max;
+    yieldCPUTime();
+}
+
+//_________________________________________________________________________
+
+long    _THyPhyGetLongStatus        (void)
+{
+    return _tHYPHYDone;
+}
+
+//_________________________________________________________________________
+
+double  _THyPhyGetDoubleStatus      (void)
+{
+    return _tHYPHYValue;
+}
+
+//_________________________________________________________________________
+
+char*   _THyPhyGetStringStatus      (void)
+{
+    return _tHYPHYCurrentStatus.getStr();
+}
diff --git a/src/lib/Link/THyPhy.h b/src/lib/Link/THyPhy.h
new file mode 100644
index 0000000..342be58
--- /dev/null
+++ b/src/lib/Link/THyPhy.h
@@ -0,0 +1,282 @@
+/*
+
+HyPhy - Hypothesis Testing Using Phylogenies.
+
+This file defines data and interface classes
+used in linking HyPhy with MEGA
+
+Written by SL Kosakovsky Pond; June 2007
+Dedicated to Comet (http://www.hyphy.org/comet.jpg)
+?/?/1999-06/05/2007
+
+Copyright (C) 1997-now
+Core Developers:
+  Sergei L Kosakovsky Pond (spond at ucsd.edu)
+  Art FY Poon    (apoon at cfenet.ubc.ca)
+  Steven Weaver (sweaver at ucsd.edu)
+  
+Module Developers:
+	Lance Hepler (nlhepler at gmail.com)
+	Martin Smith (martin.audacis at gmail.com)
+
+Significant contributions from:
+  Spencer V Muse (muse at stat.ncsu.edu)
+  Simon DW Frost (sdf22 at cam.ac.uk)
+
+Permission is hereby granted, free of charge, to any person obtaining a
+copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be included
+in all copies or substantial portions of the Software.
+
+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.
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+*/
+
+#ifdef SWIG
+%module HyPhy
+%{
+#include "THyPhy.h"
+%}
+#endif
+
+#ifndef _THYPHY_
+#define _THYPHY_
+
+// the progress update/cancel handling function prototype
+
+typedef  bool _ProgressCancelHandler (char*,int,double);
+/* if  the function returns false, then HyPhy will attempt to terminate the task and return
+     HyPhy will also populate three agruments
+  -- char * : pointer to an (internally handled by HyPhy) string
+              that describes what task HyPhy is working on at the moment
+  -- int    : integer progress value (as in % done)
+  -- double : floating point value showing current logL score; could be > 0 if
+            : not applicable (e.g. when doing ancestral state reconstruction)
+
+*/
+
+#define     THYPHY_TYPE_COUNT  3 // how many types are there?
+
+#define     THYPHY_TYPE_STRING 0
+#define     THYPHY_TYPE_NUMBER 1
+#define     THYPHY_TYPE_MATRIX 2
+
+/* Basic return types supported by the interface object */
+
+class _THyPhyString;
+class _THyPhyNumber;
+class _THyPhyMatrix;
+
+//_________________________________________________________
+class _THyPhyReturnObject // abstract base class
+{
+public:
+    virtual int myType (void) = 0;
+    virtual ~_THyPhyReturnObject (void) {};
+
+    // the next three functions are for SWIG to
+    // allow the casting of returned base class
+    // to a superclass
+
+    _THyPhyString*      castToString    ();
+    _THyPhyNumber*      castToNumber    ();
+    _THyPhyMatrix*      castToMatrix    ();
+};
+
+//_________________________________________________________
+class _THyPhyString: public _THyPhyReturnObject // basic string class
+{
+public:
+    _THyPhyString           (const char* = 0, long = 0);
+    virtual int myType      (void) {
+        return THYPHY_TYPE_STRING;
+    }
+    virtual ~_THyPhyString  (void);
+
+    long      sLength;      // length of the string
+    char*     sData;        // string characters
+
+};
+
+//_________________________________________________________
+class _THyPhyNumber: public _THyPhyReturnObject // basic number class
+{
+public:
+    _THyPhyNumber           (double = 0.0);
+    virtual int myType      (void) {
+        return THYPHY_TYPE_NUMBER;
+    }
+    virtual ~_THyPhyNumber  (void) {}
+
+    double   nValue;        // the actual number
+};
+
+//_________________________________________________________
+class _THyPhyMatrix: public _THyPhyReturnObject // basic matrix class
+{
+public:
+    _THyPhyMatrix           (void);
+    _THyPhyMatrix           (const long,const long,const double*);
+
+    virtual int myType      (void) {
+        return THYPHY_TYPE_MATRIX;
+    }
+    virtual ~_THyPhyMatrix   (void);
+
+    double  MatrixCell      (long, long);
+    // retrieve the value at a given (0-based!)
+    // matrix index
+
+    long     mRows,
+             mCols; // rows and columns of the matrix
+
+    double*  mData; // the array storing matrix cells
+};
+
+
+
+//_________________________________________________________
+class _THyPhy
+{
+
+public:
+
+    _THyPhy              (_ProgressCancelHandler*, const char*, long = 1);
+    // create an instance with a given progress/cancel handler
+    // the second argument is a path to the directory that
+    // HyPhy will use to find its scripting components
+    // takes care of needed istantiations (if need)
+    // the last argument is relevant for multi-threaded builds
+    // and specifies the number of threads that HyPhy should try to spawn
+
+
+    _THyPhy              (const char*, long = 1);
+    // use a default (return true)
+    // callback
+
+    ~_THyPhy            (void);
+    // destructor
+
+    _THyPhyString
+    *ExecuteBF          (const char*, bool = true);
+    /* take in a string of (null terminated )commands in BF,
+       execute them and return the result (if the BF finished
+       with a return statement)
+       The boolean flag, if true, will clean the previous HyPhy state
+       (suitable for starting a new analysis from scratch)
+       HyPhy will take care of managing the memory needed for the
+       result string
+    */
+
+    void    InitTHyPhy          (_ProgressCancelHandler*, const char*, long);
+
+    void    ClearAll            (void);
+    // reset all internal variables, but keep the handler
+    // and the file path
+
+    void*   AskFor              (const char*);
+    /*
+       After the analysis has finished, this function can be called to
+       retrieve result objects by a string key. Available keys and
+       return mechanisms must be defined via an _THyPhyAskFor function
+       inside the batch commands passed to ExecuteBF.
+
+       NULL is returned if no result matching the key can be returned,
+       otherwise, the result is a pointer to an object in an internal HyPhy
+       format
+
+       Memory used by the return object should be de-allocated
+       using DumpResult (see below)
+
+     */
+
+    void    DumpResult          (void*);
+
+    bool    CanCast             (const void*, const int);
+    /* Can the result from AskFor be typecast to the requested type
+       (second argument) - see above for types */
+
+    _THyPhyReturnObject*
+    CastResult          (const void*, const int);
+    /* Takes a result returned by AskFor, and attempts to represent it
+       in one of the basic return types passed as the 2nd argument
+       (see above).
+
+       If typecasting fails, NULL is returned */
+
+
+    void    SetCallbackHandler  (_ProgressCancelHandler*);
+    // change the callback handler
+
+    _ProgressCancelHandler *
+    GetCallbackHandler (void);
+    // return the pointer to the current callback handler
+
+
+    // for the following 3 functions, the end user is reponsible
+    // for disposing of the return structure
+
+    _THyPhyString *  GetWarnings (void) {
+        return ConvertHyPhyString (warnings);
+    }
+    // retrieve warnings (if any) from the last run
+
+    _THyPhyString *  GetErrors   (void) {
+        return ConvertHyPhyString (errors);
+    }
+    // retrieve errors (if any) from the last run
+
+    _THyPhyString *  GetStdout   (void) {
+        return ConvertHyPhyString (textout);
+    }
+    // retrieve standard out (of any) from the last run
+
+    // these functions are for internal use only...
+
+    void        PushWarning   (void*);
+    void        PushError     (void*);
+    void        PushOutString (void*);
+
+private:
+
+    _THyPhyString             * ConvertHyPhyString (void*);
+
+    _ProgressCancelHandler    * theHandler;
+    _THyPhyString             * currentResultHolder,
+                              * baseDirectoryInstance;
+    // stores the most recent result from ExecuteBF
+    long                        askFID;
+    // internal ID of _THyPhyAskFor function
+    // set by the last call to ExecuteBF
+    // -1 is undefined
+    void                        *errors,
+                                *warnings,
+                                *textout;
+};
+
+//_________________________________________________________
+
+long    _THyPhyGetLongStatus        (void);
+char*   _THyPhyGetStringStatus      (void);
+double  _THyPhyGetDoubleStatus      (void);
+
+//void  SetGlobalInterfaceInstance  (const _THyPhy*);
+
+extern  _THyPhy*                    globalInterfaceInstance;
+// this object MUST be set to a new instance of _THyPhy
+// in order for the rest of the code to intreface with it properly
+
+
+#endif
diff --git a/src/lib/README b/src/lib/README
new file mode 100644
index 0000000..ea2d3ce
--- /dev/null
+++ b/src/lib/README
@@ -0,0 +1,53 @@
+README
+
+This directory contains my first stab at SWIG-wrapped HyPhy libraries for 
+Python and R. 
+
+This has been tested on a Mac OS X.5 with Python 2.5.1 and R 2.6.2, but it 
+should work with slightly older versions and on Linux as well. Both Python 
+and R are expected to be in the PATH variable
+
+Prior to running these scripts, please execute the buildFromSVN.sh script 
+(inside the Scripts directory), then cd to ../../HYPHY/Library directory (relative
+to the Scripts directory).
+
+Python:
+-------
+
+To build, type 
+
+$python setup.py install
+
+To test, cd to Examples/Python and run
+
+$python BasicHyPhy.py
+
+Look at the comments inside BasicHyPhy.py for simple library usage
+example. Also take a look at Examples/HBL/HKY85.bf for how to define
+an object retrieval function.
+
+
+R:
+--
+
+To build, type 
+
+$sh build.sh LIBRARY R
+
+The resulting shared library will be placed inside LibraryModules/R/
+
+To test, type (from the root of the HyPhy library directory)
+
+$R
+
+Once inside R, execute
+
+source ('Examples/R/BasicHyPhy.R')
+
+Look at the comments inside BasicHyPhy.R for simple library usage
+example. Also take a look at Examples/HBL/HKY85.bf for how to define
+an object retrieval function.
+
+
+
+
diff --git a/src/lib/SWIGWrappers/THyPhy_R.cpp b/src/lib/SWIGWrappers/THyPhy_R.cpp
new file mode 100644
index 0000000..7ca6c71
--- /dev/null
+++ b/src/lib/SWIGWrappers/THyPhy_R.cpp
@@ -0,0 +1,3344 @@
+/* ----------------------------------------------------------------------------
+ * This file was automatically generated by SWIG (http://www.swig.org).
+ * Version 2.0.4
+ * 
+ * This file is not intended to be easily readable and contains a number of 
+ * coding conventions designed to improve portability and efficiency. Do not make
+ * changes to this file unless you know what you are doing--modify the SWIG 
+ * interface file instead. 
+ * ----------------------------------------------------------------------------- */
+
+#define SWIGR
+
+
+#ifdef __cplusplus
+/* SwigValueWrapper is described in swig.swg */
+template<typename T> class SwigValueWrapper {
+  struct SwigMovePointer {
+    T *ptr;
+    SwigMovePointer(T *p) : ptr(p) { }
+    ~SwigMovePointer() { delete ptr; }
+    SwigMovePointer& operator=(SwigMovePointer& rhs) { T* oldptr = ptr; ptr = 0; delete oldptr; ptr = rhs.ptr; rhs.ptr = 0; return *this; }
+  } pointer;
+  SwigValueWrapper& operator=(const SwigValueWrapper<T>& rhs);
+  SwigValueWrapper(const SwigValueWrapper<T>& rhs);
+public:
+  SwigValueWrapper() : pointer(0) { }
+  SwigValueWrapper& operator=(const T& t) { SwigMovePointer tmp(new T(t)); pointer = tmp; return *this; }
+  operator T&() const { return *pointer.ptr; }
+  T *operator&() { return pointer.ptr; }
+};
+
+template <typename T> T SwigValueInit() {
+  return T();
+}
+#endif
+
+/* -----------------------------------------------------------------------------
+ *  This section contains generic SWIG labels for method/variable
+ *  declarations/attributes, and other compiler dependent labels.
+ * ----------------------------------------------------------------------------- */
+
+/* template workaround for compilers that cannot correctly implement the C++ standard */
+#ifndef SWIGTEMPLATEDISAMBIGUATOR
+# if defined(__SUNPRO_CC) && (__SUNPRO_CC <= 0x560)
+#  define SWIGTEMPLATEDISAMBIGUATOR template
+# elif defined(__HP_aCC)
+/* Needed even with `aCC -AA' when `aCC -V' reports HP ANSI C++ B3910B A.03.55 */
+/* If we find a maximum version that requires this, the test would be __HP_aCC <= 35500 for A.03.55 */
+#  define SWIGTEMPLATEDISAMBIGUATOR template
+# else
+#  define SWIGTEMPLATEDISAMBIGUATOR
+# endif
+#endif
+
+/* inline attribute */
+#ifndef SWIGINLINE
+# if defined(__cplusplus) || (defined(__GNUC__) && !defined(__STRICT_ANSI__))
+#   define SWIGINLINE inline
+# else
+#   define SWIGINLINE
+# endif
+#endif
+
+/* attribute recognised by some compilers to avoid 'unused' warnings */
+#ifndef SWIGUNUSED
+# if defined(__GNUC__)
+#   if !(defined(__cplusplus)) || (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4))
+#     define SWIGUNUSED __attribute__ ((__unused__)) 
+#   else
+#     define SWIGUNUSED
+#   endif
+# elif defined(__ICC)
+#   define SWIGUNUSED __attribute__ ((__unused__)) 
+# else
+#   define SWIGUNUSED 
+# endif
+#endif
+
+#ifndef SWIG_MSC_UNSUPPRESS_4505
+# if defined(_MSC_VER)
+#   pragma warning(disable : 4505) /* unreferenced local function has been removed */
+# endif 
+#endif
+
+#ifndef SWIGUNUSEDPARM
+# ifdef __cplusplus
+#   define SWIGUNUSEDPARM(p)
+# else
+#   define SWIGUNUSEDPARM(p) p SWIGUNUSED 
+# endif
+#endif
+
+/* internal SWIG method */
+#ifndef SWIGINTERN
+# define SWIGINTERN static SWIGUNUSED
+#endif
+
+/* internal inline SWIG method */
+#ifndef SWIGINTERNINLINE
+# define SWIGINTERNINLINE SWIGINTERN SWIGINLINE
+#endif
+
+/* exporting methods */
+#if (__GNUC__ >= 4) || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)
+#  ifndef GCC_HASCLASSVISIBILITY
+#    define GCC_HASCLASSVISIBILITY
+#  endif
+#endif
+
+#ifndef SWIGEXPORT
+# if defined(_WIN32) || defined(__WIN32__) || defined(__CYGWIN__)
+#   if defined(STATIC_LINKED)
+#     define SWIGEXPORT
+#   else
+#     define SWIGEXPORT __declspec(dllexport)
+#   endif
+# else
+#   if defined(__GNUC__) && defined(GCC_HASCLASSVISIBILITY)
+#     define SWIGEXPORT __attribute__ ((visibility("default")))
+#   else
+#     define SWIGEXPORT
+#   endif
+# endif
+#endif
+
+/* calling conventions for Windows */
+#ifndef SWIGSTDCALL
+# if defined(_WIN32) || defined(__WIN32__) || defined(__CYGWIN__)
+#   define SWIGSTDCALL __stdcall
+# else
+#   define SWIGSTDCALL
+# endif 
+#endif
+
+/* Deal with Microsoft's attempt at deprecating C standard runtime functions */
+#if !defined(SWIG_NO_CRT_SECURE_NO_DEPRECATE) && defined(_MSC_VER) && !defined(_CRT_SECURE_NO_DEPRECATE)
+# define _CRT_SECURE_NO_DEPRECATE
+#endif
+
+/* Deal with Microsoft's attempt at deprecating methods in the standard C++ library */
+#if !defined(SWIG_NO_SCL_SECURE_NO_DEPRECATE) && defined(_MSC_VER) && !defined(_SCL_SECURE_NO_DEPRECATE)
+# define _SCL_SECURE_NO_DEPRECATE
+#endif
+
+
+/* -----------------------------------------------------------------------------
+ * swigrun.swg
+ *
+ * This file contains generic C API SWIG runtime support for pointer
+ * type checking.
+ * ----------------------------------------------------------------------------- */
+
+/* This should only be incremented when either the layout of swig_type_info changes,
+   or for whatever reason, the runtime changes incompatibly */
+#define SWIG_RUNTIME_VERSION "4"
+
+/* define SWIG_TYPE_TABLE_NAME as "SWIG_TYPE_TABLE" */
+#ifdef SWIG_TYPE_TABLE
+# define SWIG_QUOTE_STRING(x) #x
+# define SWIG_EXPAND_AND_QUOTE_STRING(x) SWIG_QUOTE_STRING(x)
+# define SWIG_TYPE_TABLE_NAME SWIG_EXPAND_AND_QUOTE_STRING(SWIG_TYPE_TABLE)
+#else
+# define SWIG_TYPE_TABLE_NAME
+#endif
+
+/*
+  You can use the SWIGRUNTIME and SWIGRUNTIMEINLINE macros for
+  creating a static or dynamic library from the SWIG runtime code.
+  In 99.9% of the cases, SWIG just needs to declare them as 'static'.
+  
+  But only do this if strictly necessary, ie, if you have problems
+  with your compiler or suchlike.
+*/
+
+#ifndef SWIGRUNTIME
+# define SWIGRUNTIME SWIGINTERN
+#endif
+
+#ifndef SWIGRUNTIMEINLINE
+# define SWIGRUNTIMEINLINE SWIGRUNTIME SWIGINLINE
+#endif
+
+/*  Generic buffer size */
+#ifndef SWIG_BUFFER_SIZE
+# define SWIG_BUFFER_SIZE 1024
+#endif
+
+/* Flags for pointer conversions */
+#define SWIG_POINTER_DISOWN        0x1
+#define SWIG_CAST_NEW_MEMORY       0x2
+
+/* Flags for new pointer objects */
+#define SWIG_POINTER_OWN           0x1
+
+
+/* 
+   Flags/methods for returning states.
+   
+   The SWIG conversion methods, as ConvertPtr, return an integer 
+   that tells if the conversion was successful or not. And if not,
+   an error code can be returned (see swigerrors.swg for the codes).
+   
+   Use the following macros/flags to set or process the returning
+   states.
+   
+   In old versions of SWIG, code such as the following was usually written:
+
+     if (SWIG_ConvertPtr(obj,vptr,ty.flags) != -1) {
+       // success code
+     } else {
+       //fail code
+     }
+
+   Now you can be more explicit:
+
+    int res = SWIG_ConvertPtr(obj,vptr,ty.flags);
+    if (SWIG_IsOK(res)) {
+      // success code
+    } else {
+      // fail code
+    }
+
+   which is the same really, but now you can also do
+
+    Type *ptr;
+    int res = SWIG_ConvertPtr(obj,(void **)(&ptr),ty.flags);
+    if (SWIG_IsOK(res)) {
+      // success code
+      if (SWIG_IsNewObj(res) {
+        ...
+	delete *ptr;
+      } else {
+        ...
+      }
+    } else {
+      // fail code
+    }
+    
+   I.e., now SWIG_ConvertPtr can return new objects and you can
+   identify the case and take care of the deallocation. Of course that
+   also requires SWIG_ConvertPtr to return new result values, such as
+
+      int SWIG_ConvertPtr(obj, ptr,...) {         
+        if (<obj is ok>) {			       
+          if (<need new object>) {		       
+            *ptr = <ptr to new allocated object>; 
+            return SWIG_NEWOBJ;		       
+          } else {				       
+            *ptr = <ptr to old object>;	       
+            return SWIG_OLDOBJ;		       
+          } 				       
+        } else {				       
+          return SWIG_BADOBJ;		       
+        }					       
+      }
+
+   Of course, returning the plain '0(success)/-1(fail)' still works, but you can be
+   more explicit by returning SWIG_BADOBJ, SWIG_ERROR or any of the
+   SWIG errors code.
+
+   Finally, if the SWIG_CASTRANK_MODE is enabled, the result code
+   allows to return the 'cast rank', for example, if you have this
+
+       int food(double)
+       int fooi(int);
+
+   and you call
+ 
+      food(1)   // cast rank '1'  (1 -> 1.0)
+      fooi(1)   // cast rank '0'
+
+   just use the SWIG_AddCast()/SWIG_CheckState()
+*/
+
+#define SWIG_OK                    (0) 
+#define SWIG_ERROR                 (-1)
+#define SWIG_IsOK(r)               (r >= 0)
+#define SWIG_ArgError(r)           ((r != SWIG_ERROR) ? r : SWIG_TypeError)  
+
+/* The CastRankLimit says how many bits are used for the cast rank */
+#define SWIG_CASTRANKLIMIT         (1 << 8)
+/* The NewMask denotes the object was created (using new/malloc) */
+#define SWIG_NEWOBJMASK            (SWIG_CASTRANKLIMIT  << 1)
+/* The TmpMask is for in/out typemaps that use temporal objects */
+#define SWIG_TMPOBJMASK            (SWIG_NEWOBJMASK << 1)
+/* Simple returning values */
+#define SWIG_BADOBJ                (SWIG_ERROR)
+#define SWIG_OLDOBJ                (SWIG_OK)
+#define SWIG_NEWOBJ                (SWIG_OK | SWIG_NEWOBJMASK)
+#define SWIG_TMPOBJ                (SWIG_OK | SWIG_TMPOBJMASK)
+/* Check, add and del mask methods */
+#define SWIG_AddNewMask(r)         (SWIG_IsOK(r) ? (r | SWIG_NEWOBJMASK) : r)
+#define SWIG_DelNewMask(r)         (SWIG_IsOK(r) ? (r & ~SWIG_NEWOBJMASK) : r)
+#define SWIG_IsNewObj(r)           (SWIG_IsOK(r) && (r & SWIG_NEWOBJMASK))
+#define SWIG_AddTmpMask(r)         (SWIG_IsOK(r) ? (r | SWIG_TMPOBJMASK) : r)
+#define SWIG_DelTmpMask(r)         (SWIG_IsOK(r) ? (r & ~SWIG_TMPOBJMASK) : r)
+#define SWIG_IsTmpObj(r)           (SWIG_IsOK(r) && (r & SWIG_TMPOBJMASK))
+
+/* Cast-Rank Mode */
+#if defined(SWIG_CASTRANK_MODE)
+#  ifndef SWIG_TypeRank
+#    define SWIG_TypeRank             unsigned long
+#  endif
+#  ifndef SWIG_MAXCASTRANK            /* Default cast allowed */
+#    define SWIG_MAXCASTRANK          (2)
+#  endif
+#  define SWIG_CASTRANKMASK          ((SWIG_CASTRANKLIMIT) -1)
+#  define SWIG_CastRank(r)           (r & SWIG_CASTRANKMASK)
+SWIGINTERNINLINE int SWIG_AddCast(int r) { 
+  return SWIG_IsOK(r) ? ((SWIG_CastRank(r) < SWIG_MAXCASTRANK) ? (r + 1) : SWIG_ERROR) : r;
+}
+SWIGINTERNINLINE int SWIG_CheckState(int r) { 
+  return SWIG_IsOK(r) ? SWIG_CastRank(r) + 1 : 0; 
+}
+#else /* no cast-rank mode */
+#  define SWIG_AddCast
+#  define SWIG_CheckState(r) (SWIG_IsOK(r) ? 1 : 0)
+#endif
+
+
+#include <string.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef void *(*swig_converter_func)(void *, int *);
+typedef struct swig_type_info *(*swig_dycast_func)(void **);
+
+/* Structure to store information on one type */
+typedef struct swig_type_info {
+  const char             *name;			/* mangled name of this type */
+  const char             *str;			/* human readable name of this type */
+  swig_dycast_func        dcast;		/* dynamic cast function down a hierarchy */
+  struct swig_cast_info  *cast;			/* linked list of types that can cast into this type */
+  void                   *clientdata;		/* language specific type data */
+  int                    owndata;		/* flag if the structure owns the clientdata */
+} swig_type_info;
+
+/* Structure to store a type and conversion function used for casting */
+typedef struct swig_cast_info {
+  swig_type_info         *type;			/* pointer to type that is equivalent to this type */
+  swig_converter_func     converter;		/* function to cast the void pointers */
+  struct swig_cast_info  *next;			/* pointer to next cast in linked list */
+  struct swig_cast_info  *prev;			/* pointer to the previous cast */
+} swig_cast_info;
+
+/* Structure used to store module information
+ * Each module generates one structure like this, and the runtime collects
+ * all of these structures and stores them in a circularly linked list.*/
+typedef struct swig_module_info {
+  swig_type_info         **types;		/* Array of pointers to swig_type_info structures that are in this module */
+  size_t                 size;		        /* Number of types in this module */
+  struct swig_module_info *next;		/* Pointer to next element in circularly linked list */
+  swig_type_info         **type_initial;	/* Array of initially generated type structures */
+  swig_cast_info         **cast_initial;	/* Array of initially generated casting structures */
+  void                    *clientdata;		/* Language specific module data */
+} swig_module_info;
+
+/* 
+  Compare two type names skipping the space characters, therefore
+  "char*" == "char *" and "Class<int>" == "Class<int >", etc.
+
+  Return 0 when the two name types are equivalent, as in
+  strncmp, but skipping ' '.
+*/
+SWIGRUNTIME int
+SWIG_TypeNameComp(const char *f1, const char *l1,
+		  const char *f2, const char *l2) {
+  for (;(f1 != l1) && (f2 != l2); ++f1, ++f2) {
+    while ((*f1 == ' ') && (f1 != l1)) ++f1;
+    while ((*f2 == ' ') && (f2 != l2)) ++f2;
+    if (*f1 != *f2) return (*f1 > *f2) ? 1 : -1;
+  }
+  return (int)((l1 - f1) - (l2 - f2));
+}
+
+/*
+  Check type equivalence in a name list like <name1>|<name2>|...
+  Return 0 if not equal, 1 if equal
+*/
+SWIGRUNTIME int
+SWIG_TypeEquiv(const char *nb, const char *tb) {
+  int equiv = 0;
+  const char* te = tb + strlen(tb);
+  const char* ne = nb;
+  while (!equiv && *ne) {
+    for (nb = ne; *ne; ++ne) {
+      if (*ne == '|') break;
+    }
+    equiv = (SWIG_TypeNameComp(nb, ne, tb, te) == 0) ? 1 : 0;
+    if (*ne) ++ne;
+  }
+  return equiv;
+}
+
+/*
+  Check type equivalence in a name list like <name1>|<name2>|...
+  Return 0 if equal, -1 if nb < tb, 1 if nb > tb
+*/
+SWIGRUNTIME int
+SWIG_TypeCompare(const char *nb, const char *tb) {
+  int equiv = 0;
+  const char* te = tb + strlen(tb);
+  const char* ne = nb;
+  while (!equiv && *ne) {
+    for (nb = ne; *ne; ++ne) {
+      if (*ne == '|') break;
+    }
+    equiv = (SWIG_TypeNameComp(nb, ne, tb, te) == 0) ? 1 : 0;
+    if (*ne) ++ne;
+  }
+  return equiv;
+}
+
+
+/*
+  Check the typename
+*/
+SWIGRUNTIME swig_cast_info *
+SWIG_TypeCheck(const char *c, swig_type_info *ty) {
+  if (ty) {
+    swig_cast_info *iter = ty->cast;
+    while (iter) {
+      if (strcmp(iter->type->name, c) == 0) {
+        if (iter == ty->cast)
+          return iter;
+        /* Move iter to the top of the linked list */
+        iter->prev->next = iter->next;
+        if (iter->next)
+          iter->next->prev = iter->prev;
+        iter->next = ty->cast;
+        iter->prev = 0;
+        if (ty->cast) ty->cast->prev = iter;
+        ty->cast = iter;
+        return iter;
+      }
+      iter = iter->next;
+    }
+  }
+  return 0;
+}
+
+/* 
+  Identical to SWIG_TypeCheck, except strcmp is replaced with a pointer comparison
+*/
+SWIGRUNTIME swig_cast_info *
+SWIG_TypeCheckStruct(swig_type_info *from, swig_type_info *ty) {
+  if (ty) {
+    swig_cast_info *iter = ty->cast;
+    while (iter) {
+      if (iter->type == from) {
+        if (iter == ty->cast)
+          return iter;
+        /* Move iter to the top of the linked list */
+        iter->prev->next = iter->next;
+        if (iter->next)
+          iter->next->prev = iter->prev;
+        iter->next = ty->cast;
+        iter->prev = 0;
+        if (ty->cast) ty->cast->prev = iter;
+        ty->cast = iter;
+        return iter;
+      }
+      iter = iter->next;
+    }
+  }
+  return 0;
+}
+
+/*
+  Cast a pointer up an inheritance hierarchy
+*/
+SWIGRUNTIMEINLINE void *
+SWIG_TypeCast(swig_cast_info *ty, void *ptr, int *newmemory) {
+  return ((!ty) || (!ty->converter)) ? ptr : (*ty->converter)(ptr, newmemory);
+}
+
+/* 
+   Dynamic pointer casting. Down an inheritance hierarchy
+*/
+SWIGRUNTIME swig_type_info *
+SWIG_TypeDynamicCast(swig_type_info *ty, void **ptr) {
+  swig_type_info *lastty = ty;
+  if (!ty || !ty->dcast) return ty;
+  while (ty && (ty->dcast)) {
+    ty = (*ty->dcast)(ptr);
+    if (ty) lastty = ty;
+  }
+  return lastty;
+}
+
+/*
+  Return the name associated with this type
+*/
+SWIGRUNTIMEINLINE const char *
+SWIG_TypeName(const swig_type_info *ty) {
+  return ty->name;
+}
+
+/*
+  Return the pretty name associated with this type,
+  that is an unmangled type name in a form presentable to the user.
+*/
+SWIGRUNTIME const char *
+SWIG_TypePrettyName(const swig_type_info *type) {
+  /* The "str" field contains the equivalent pretty names of the
+     type, separated by vertical-bar characters.  We choose
+     to print the last name, as it is often (?) the most
+     specific. */
+  if (!type) return NULL;
+  if (type->str != NULL) {
+    const char *last_name = type->str;
+    const char *s;
+    for (s = type->str; *s; s++)
+      if (*s == '|') last_name = s+1;
+    return last_name;
+  }
+  else
+    return type->name;
+}
+
+/* 
+   Set the clientdata field for a type
+*/
+SWIGRUNTIME void
+SWIG_TypeClientData(swig_type_info *ti, void *clientdata) {
+  swig_cast_info *cast = ti->cast;
+  /* if (ti->clientdata == clientdata) return; */
+  ti->clientdata = clientdata;
+  
+  while (cast) {
+    if (!cast->converter) {
+      swig_type_info *tc = cast->type;
+      if (!tc->clientdata) {
+	SWIG_TypeClientData(tc, clientdata);
+      }
+    }    
+    cast = cast->next;
+  }
+}
+SWIGRUNTIME void
+SWIG_TypeNewClientData(swig_type_info *ti, void *clientdata) {
+  SWIG_TypeClientData(ti, clientdata);
+  ti->owndata = 1;
+}
+  
+/*
+  Search for a swig_type_info structure only by mangled name
+  Search is a O(log #types)
+  
+  We start searching at module start, and finish searching when start == end.  
+  Note: if start == end at the beginning of the function, we go all the way around
+  the circular list.
+*/
+SWIGRUNTIME swig_type_info *
+SWIG_MangledTypeQueryModule(swig_module_info *start, 
+                            swig_module_info *end, 
+		            const char *name) {
+  swig_module_info *iter = start;
+  do {
+    if (iter->size) {
+      register size_t l = 0;
+      register size_t r = iter->size - 1;
+      do {
+	/* since l+r >= 0, we can (>> 1) instead (/ 2) */
+	register size_t i = (l + r) >> 1; 
+	const char *iname = iter->types[i]->name;
+	if (iname) {
+	  register int compare = strcmp(name, iname);
+	  if (compare == 0) {	    
+	    return iter->types[i];
+	  } else if (compare < 0) {
+	    if (i) {
+	      r = i - 1;
+	    } else {
+	      break;
+	    }
+	  } else if (compare > 0) {
+	    l = i + 1;
+	  }
+	} else {
+	  break; /* should never happen */
+	}
+      } while (l <= r);
+    }
+    iter = iter->next;
+  } while (iter != end);
+  return 0;
+}
+
+/*
+  Search for a swig_type_info structure for either a mangled name or a human readable name.
+  It first searches the mangled names of the types, which is a O(log #types)
+  If a type is not found it then searches the human readable names, which is O(#types).
+  
+  We start searching at module start, and finish searching when start == end.  
+  Note: if start == end at the beginning of the function, we go all the way around
+  the circular list.
+*/
+SWIGRUNTIME swig_type_info *
+SWIG_TypeQueryModule(swig_module_info *start, 
+                     swig_module_info *end, 
+		     const char *name) {
+  /* STEP 1: Search the name field using binary search */
+  swig_type_info *ret = SWIG_MangledTypeQueryModule(start, end, name);
+  if (ret) {
+    return ret;
+  } else {
+    /* STEP 2: If the type hasn't been found, do a complete search
+       of the str field (the human readable name) */
+    swig_module_info *iter = start;
+    do {
+      register size_t i = 0;
+      for (; i < iter->size; ++i) {
+	if (iter->types[i]->str && (SWIG_TypeEquiv(iter->types[i]->str, name)))
+	  return iter->types[i];
+      }
+      iter = iter->next;
+    } while (iter != end);
+  }
+  
+  /* neither found a match */
+  return 0;
+}
+
+/* 
+   Pack binary data into a string
+*/
+SWIGRUNTIME char *
+SWIG_PackData(char *c, void *ptr, size_t sz) {
+  static const char hex[17] = "0123456789abcdef";
+  register const unsigned char *u = (unsigned char *) ptr;
+  register const unsigned char *eu =  u + sz;
+  for (; u != eu; ++u) {
+    register unsigned char uu = *u;
+    *(c++) = hex[(uu & 0xf0) >> 4];
+    *(c++) = hex[uu & 0xf];
+  }
+  return c;
+}
+
+/* 
+   Unpack binary data from a string
+*/
+SWIGRUNTIME const char *
+SWIG_UnpackData(const char *c, void *ptr, size_t sz) {
+  register unsigned char *u = (unsigned char *) ptr;
+  register const unsigned char *eu = u + sz;
+  for (; u != eu; ++u) {
+    register char d = *(c++);
+    register unsigned char uu;
+    if ((d >= '0') && (d <= '9'))
+      uu = ((d - '0') << 4);
+    else if ((d >= 'a') && (d <= 'f'))
+      uu = ((d - ('a'-10)) << 4);
+    else 
+      return (char *) 0;
+    d = *(c++);
+    if ((d >= '0') && (d <= '9'))
+      uu |= (d - '0');
+    else if ((d >= 'a') && (d <= 'f'))
+      uu |= (d - ('a'-10));
+    else 
+      return (char *) 0;
+    *u = uu;
+  }
+  return c;
+}
+
+/* 
+   Pack 'void *' into a string buffer.
+*/
+SWIGRUNTIME char *
+SWIG_PackVoidPtr(char *buff, void *ptr, const char *name, size_t bsz) {
+  char *r = buff;
+  if ((2*sizeof(void *) + 2) > bsz) return 0;
+  *(r++) = '_';
+  r = SWIG_PackData(r,&ptr,sizeof(void *));
+  if (strlen(name) + 1 > (bsz - (r - buff))) return 0;
+  strcpy(r,name);
+  return buff;
+}
+
+SWIGRUNTIME const char *
+SWIG_UnpackVoidPtr(const char *c, void **ptr, const char *name) {
+  if (*c != '_') {
+    if (strcmp(c,"NULL") == 0) {
+      *ptr = (void *) 0;
+      return name;
+    } else {
+      return 0;
+    }
+  }
+  return SWIG_UnpackData(++c,ptr,sizeof(void *));
+}
+
+SWIGRUNTIME char *
+SWIG_PackDataName(char *buff, void *ptr, size_t sz, const char *name, size_t bsz) {
+  char *r = buff;
+  size_t lname = (name ? strlen(name) : 0);
+  if ((2*sz + 2 + lname) > bsz) return 0;
+  *(r++) = '_';
+  r = SWIG_PackData(r,ptr,sz);
+  if (lname) {
+    strncpy(r,name,lname+1);
+  } else {
+    *r = 0;
+  }
+  return buff;
+}
+
+SWIGRUNTIME const char *
+SWIG_UnpackDataName(const char *c, void *ptr, size_t sz, const char *name) {
+  if (*c != '_') {
+    if (strcmp(c,"NULL") == 0) {
+      memset(ptr,0,sz);
+      return name;
+    } else {
+      return 0;
+    }
+  }
+  return SWIG_UnpackData(++c,ptr,sz);
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Remove global namespace pollution */
+#if !defined(SWIG_NO_R_NO_REMAP)
+# define R_NO_REMAP
+#endif
+#if !defined(SWIG_NO_STRICT_R_HEADERS)
+# define STRICT_R_HEADERS
+#endif
+
+#include <Rdefines.h>
+#include <Rversion.h>
+#include <stdlib.h>
+#include <assert.h>
+
+#if R_VERSION >= R_Version(2,6,0)
+#define VMAXTYPE void *
+#else
+#define VMAXTYPE char *
+#endif
+
+/*
+  This is mainly a way to avoid having lots of local variables that may 
+  conflict with those in the routine.
+
+   Change name to R_SWIG_Callb....
+*/
+typedef struct RCallbackFunctionData {
+
+  SEXP fun;
+  SEXP userData;
+
+
+  SEXP expr;
+  SEXP retValue;
+  int errorOccurred;
+
+  SEXP el;  /* Temporary pointer used in the construction of the expression to call the R function. */
+
+  struct RCallbackFunctionData *previous;   /* Stack */
+
+} RCallbackFunctionData;
+
+static RCallbackFunctionData  *callbackFunctionDataStack;
+
+
+SWIGRUNTIME SEXP
+R_SWIG_debug_getCallbackFunctionData()
+{
+  int n, i;
+  SEXP ans;
+  RCallbackFunctionData  *p = callbackFunctionDataStack;
+
+  n = 0;
+  while(p) { 
+    n++;
+    p = p->previous;
+  }
+
+  Rf_protect(ans = Rf_allocVector(VECSXP, n));
+  for(p = callbackFunctionDataStack, i = 0; i < n; p = p->previous, i++) 
+      SET_VECTOR_ELT(ans, i, p->fun);
+
+  Rf_unprotect(1);
+
+  return(ans);
+}
+
+
+
+SWIGRUNTIME RCallbackFunctionData *
+R_SWIG_pushCallbackFunctionData(SEXP fun, SEXP userData)
+{
+   RCallbackFunctionData *el;
+   el = (RCallbackFunctionData *) calloc(1, sizeof(RCallbackFunctionData));
+   el->fun = fun;
+   el->userData = userData;
+   el->previous = callbackFunctionDataStack;
+
+   callbackFunctionDataStack = el;
+
+   return(el);
+}
+
+
+SWIGRUNTIME SEXP
+R_SWIG_R_pushCallbackFunctionData(SEXP fun, SEXP userData)
+{
+    R_SWIG_pushCallbackFunctionData(fun, userData);
+    return R_NilValue;
+}
+
+SWIGRUNTIME RCallbackFunctionData *
+R_SWIG_getCallbackFunctionData()
+{
+  if(!callbackFunctionDataStack) {
+    Rf_error("Supposedly impossible error occurred in the SWIG callback mechanism."
+            "  No callback function data set.");
+  }
+  
+  return callbackFunctionDataStack;
+}
+
+SWIGRUNTIME void
+R_SWIG_popCallbackFunctionData(int doFree)
+{
+  RCallbackFunctionData  *el = NULL;
+  if(!callbackFunctionDataStack)
+    return ; /* Error !!! */
+
+  el = callbackFunctionDataStack ;
+  callbackFunctionDataStack = callbackFunctionDataStack->previous;
+
+  if(doFree)
+     free(el);
+}
+
+
+/*
+  Interface to S function
+      is(obj, type)
+  which is to be used to determine if an 
+  external pointer inherits from the right class.
+
+  Ideally, we would like to be able to do this without an explicit call to the is() function.
+  When the S4 class system uses its own SEXP types, then we will hopefully be able to do this
+  in the C code.
+
+  Should we make the expression static and preserve it to avoid the overhead of 
+  allocating each time.
+*/
+SWIGRUNTIME int
+R_SWIG_checkInherits(SEXP obj, SEXP tag, const char *type)
+{
+  SEXP e, val;
+  int check_err = 0;
+
+  Rf_protect(e = Rf_allocVector(LANGSXP, 3));
+  SETCAR(e, Rf_install("extends"));
+
+  SETCAR(CDR(e), Rf_mkString(CHAR(PRINTNAME(tag))));
+  SETCAR(CDR(CDR(e)), Rf_mkString(type));
+
+  val = R_tryEval(e, R_GlobalEnv, &check_err);
+  Rf_unprotect(1);
+  if(check_err) 
+    return(0);
+
+
+  return(LOGICAL(val)[0]);
+}
+
+
+SWIGRUNTIME void *
+R_SWIG_resolveExternalRef(SEXP arg, const char * const type, const char * const argName, Rboolean nullOk)
+{
+  void *ptr;
+  SEXP orig = arg;
+
+  if(TYPEOF(arg) != EXTPTRSXP) 
+    arg = GET_SLOT(arg, Rf_mkString("ref"));
+
+  
+  if(TYPEOF(arg) != EXTPTRSXP) {
+    Rf_error("argument %s must be an external pointer (from an ExternalReference)", argName);
+  }
+
+
+  ptr = R_ExternalPtrAddr(arg);
+
+  if(ptr == NULL && nullOk == (Rboolean) FALSE) {
+    Rf_error("the external pointer (of type %s) for argument %s has value NULL", argName, type);
+  }
+
+  if(type[0] && R_ExternalPtrTag(arg) != Rf_install(type) && strcmp(type, "voidRef")
+      && !R_SWIG_checkInherits(orig,  R_ExternalPtrTag(arg), type)) {
+    Rf_error("the external pointer for argument %s has tag %s, not the expected value %s",
+             argName, CHAR(PRINTNAME(R_ExternalPtrTag(arg))), type);
+  }
+
+
+  return(ptr);
+}
+
+SWIGRUNTIME void
+R_SWIG_ReferenceFinalizer(SEXP el)
+{
+  void *ptr = R_SWIG_resolveExternalRef(el, "", "<finalizer>",  (Rboolean) 1);
+  fprintf(stderr, "In R_SWIG_ReferenceFinalizer for %p\n", ptr);
+  Rf_PrintValue(el);
+
+  if(ptr) {
+     if(TYPEOF(el) != EXTPTRSXP)
+        el = GET_SLOT(el, Rf_mkString("ref"));
+
+     if(TYPEOF(el) == EXTPTRSXP)
+        R_ClearExternalPtr(el);
+
+     free(ptr);
+  }
+
+  return;
+}
+
+typedef enum {R_SWIG_EXTERNAL, R_SWIG_OWNER } R_SWIG_Owner;
+
+SWIGRUNTIME SEXP
+SWIG_MakePtr(void *ptr, const char *typeName, R_SWIG_Owner owner)
+{
+  SEXP external, r_obj;
+  const char *p = typeName;
+
+  if(typeName[0] == '_')
+     p = typeName + 1;
+
+  Rf_protect(external = R_MakeExternalPtr(ptr, Rf_install(typeName), R_NilValue));
+  Rf_protect(r_obj = NEW_OBJECT(MAKE_CLASS((char *) typeName)));
+
+  if(owner)
+    R_RegisterCFinalizer(external, R_SWIG_ReferenceFinalizer);
+
+  r_obj = SET_SLOT(r_obj, Rf_mkString((char *) "ref"), external);
+  SET_S4_OBJECT(r_obj);
+  Rf_unprotect(2);
+
+  return(r_obj);
+}
+
+
+SWIGRUNTIME SEXP
+R_SWIG_create_SWIG_R_Array(const char *typeName, SEXP ref, int len)
+{
+   SEXP arr;
+
+/*XXX remove the char * cast when we can. MAKE_CLASS should be declared appropriately. */
+   Rf_protect(arr = NEW_OBJECT(MAKE_CLASS((char *) typeName)));
+   Rf_protect(arr = R_do_slot_assign(arr, Rf_mkString("ref"), ref));
+   Rf_protect(arr = R_do_slot_assign(arr, Rf_mkString("dims"), Rf_ScalarInteger(len)));
+
+   Rf_unprotect(3); 			   
+   SET_S4_OBJECT(arr);	
+   return arr;
+}
+
+#define ADD_OUTPUT_ARG(result, pos, value, name)  r_ans = AddOutputArgToReturn(pos, value, name, OutputValues);
+
+SWIGRUNTIME SEXP
+AddOutputArgToReturn(int pos, SEXP value, const char *name, SEXP output)
+{
+  SET_VECTOR_ELT(output, pos, value);
+
+  return(output);
+}
+
+/* Create a new pointer object */
+SWIGRUNTIMEINLINE SEXP
+SWIG_R_NewPointerObj(void *ptr, swig_type_info *type, int flags) {
+  SEXP rptr = R_MakeExternalPtr(ptr, 
+  R_MakeExternalPtr(type, R_NilValue, R_NilValue), R_NilValue); 
+  SET_S4_OBJECT(rptr);
+//  rptr = Rf_setAttrib(rptr, R_ClassSymbol, mkChar(SWIG_TypeName(type)));
+  return rptr;
+}
+
+/* Convert a pointer value */
+SWIGRUNTIMEINLINE int
+SWIG_R_ConvertPtr(SEXP obj, void **ptr, swig_type_info *ty, int flags) {
+  void *vptr;
+  if (!obj) return SWIG_ERROR;
+  if (obj == R_NilValue) {
+    if (ptr) *ptr = NULL;
+    return SWIG_OK;
+  }
+
+  vptr = R_ExternalPtrAddr(obj);
+  if (ty) {
+    swig_type_info *to = (swig_type_info*) 
+      R_ExternalPtrAddr(R_ExternalPtrTag(obj));
+    if (to == ty) {
+      if (ptr) *ptr = vptr;
+    } else {
+      swig_cast_info *tc = SWIG_TypeCheck(to->name,ty);
+      int newmemory = 0;
+      if (ptr) *ptr = SWIG_TypeCast(tc,vptr,&newmemory);
+      assert(!newmemory); /* newmemory handling not yet implemented */
+    }
+  } else {
+      if (ptr) *ptr = vptr;
+ }
+  return SWIG_OK;
+}
+
+SWIGRUNTIME swig_module_info *
+SWIG_GetModule(void *v) {
+  static void *type_pointer = (void *)0;
+  return (swig_module_info *) type_pointer;
+}
+
+SWIGRUNTIME void
+SWIG_SetModule(void *v, swig_module_info *swig_module) {
+}
+
+typedef struct {
+  void *pack;
+  swig_type_info *ty;
+  size_t size;
+} RSwigPacked;
+
+/* Create a new packed object */
+
+SWIGRUNTIMEINLINE SEXP RSwigPacked_New(void *ptr, size_t sz,
+		  swig_type_info *ty) {
+  SEXP rptr;
+  RSwigPacked *sobj = 
+  (RSwigPacked*) malloc(sizeof(RSwigPacked));
+  if (sobj) {
+    void *pack = malloc(sz);
+    if (pack) {
+      memcpy(pack, ptr, sz);
+      sobj->pack = pack;
+      sobj->ty   = ty;
+      sobj->size = sz;
+    } else {
+      sobj = 0;
+    }
+  }
+  rptr = R_MakeExternalPtr(sobj, R_NilValue, R_NilValue); 
+  return rptr;
+}
+
+SWIGRUNTIME swig_type_info *
+RSwigPacked_UnpackData(SEXP obj, void *ptr, size_t size)
+{
+    RSwigPacked *sobj = 
+        (RSwigPacked *)R_ExternalPtrAddr(obj);
+    if (sobj->size != size) return 0;
+    memcpy(ptr, sobj->pack, size);
+    return sobj->ty;
+}
+
+SWIGRUNTIMEINLINE SEXP
+SWIG_R_NewPackedObj(void *ptr, size_t sz, swig_type_info *type) {
+  return ptr ? RSwigPacked_New((void *) ptr, sz, type) : R_NilValue;
+}
+
+/* Convert a packed value value */
+
+SWIGRUNTIME int
+SWIG_R_ConvertPacked(SEXP obj, void *ptr, size_t sz, swig_type_info *ty) {
+  swig_type_info *to = RSwigPacked_UnpackData(obj, ptr, sz);
+  if (!to) return SWIG_ERROR;
+  if (ty) {
+    if (to != ty) {
+      /* check type cast? */
+      swig_cast_info *tc = SWIG_TypeCheck(to->name,ty);
+      if (!tc) return SWIG_ERROR;
+    }
+  }
+  return SWIG_OK;
+}  
+
+#ifdef __cplusplus
+}
+#endif
+
+
+
+#define SWIG_exception_fail(code, msg) do { Rf_warning(msg); return Rf_ScalarLogical(NA_LOGICAL); return Rf_ScalarLogical(NA_LOGICAL); } while(0) 
+
+#define SWIG_contract_assert(expr, msg) if (!(expr)) { Rf_warning(msg); return Rf_ScalarLogical(NA_LOGICAL); return Rf_ScalarLogical(NA_LOGICAL); } else 
+
+
+
+/* -------- TYPES TABLE (BEGIN) -------- */
+
+#define SWIGTYPE_p__THyPhy swig_types[0]
+#define SWIGTYPE_p__THyPhyMatrix swig_types[1]
+#define SWIGTYPE_p__THyPhyNumber swig_types[2]
+#define SWIGTYPE_p__THyPhyReturnObject swig_types[3]
+#define SWIGTYPE_p__THyPhyString swig_types[4]
+#define SWIGTYPE_p_char swig_types[5]
+#define SWIGTYPE_p_double swig_types[6]
+#define SWIGTYPE_p_f_p_char_int_double__bool swig_types[7]
+#define SWIGTYPE_p_void swig_types[8]
+static swig_type_info *swig_types[10];
+static swig_module_info swig_module = {swig_types, 9, 0, 0, 0, 0};
+#define SWIG_TypeQuery(name) SWIG_TypeQueryModule(&swig_module, &swig_module, name)
+#define SWIG_MangledTypeQuery(name) SWIG_MangledTypeQueryModule(&swig_module, &swig_module, name)
+
+/* -------- TYPES TABLE (END) -------- */
+
+
+/* -----------------------------------------------------------------------------
+ *  This section contains generic SWIG labels for method/variable
+ *  declarations/attributes, and other compiler dependent labels.
+ * ----------------------------------------------------------------------------- */
+
+/* template workaround for compilers that cannot correctly implement the C++ standard */
+#ifndef SWIGTEMPLATEDISAMBIGUATOR
+# if defined(__SUNPRO_CC) && (__SUNPRO_CC <= 0x560)
+#  define SWIGTEMPLATEDISAMBIGUATOR template
+# elif defined(__HP_aCC)
+/* Needed even with `aCC -AA' when `aCC -V' reports HP ANSI C++ B3910B A.03.55 */
+/* If we find a maximum version that requires this, the test would be __HP_aCC <= 35500 for A.03.55 */
+#  define SWIGTEMPLATEDISAMBIGUATOR template
+# else
+#  define SWIGTEMPLATEDISAMBIGUATOR
+# endif
+#endif
+
+/* inline attribute */
+#ifndef SWIGINLINE
+# if defined(__cplusplus) || (defined(__GNUC__) && !defined(__STRICT_ANSI__))
+#   define SWIGINLINE inline
+# else
+#   define SWIGINLINE
+# endif
+#endif
+
+/* attribute recognised by some compilers to avoid 'unused' warnings */
+#ifndef SWIGUNUSED
+# if defined(__GNUC__)
+#   if !(defined(__cplusplus)) || (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4))
+#     define SWIGUNUSED __attribute__ ((__unused__)) 
+#   else
+#     define SWIGUNUSED
+#   endif
+# elif defined(__ICC)
+#   define SWIGUNUSED __attribute__ ((__unused__)) 
+# else
+#   define SWIGUNUSED 
+# endif
+#endif
+
+#ifndef SWIG_MSC_UNSUPPRESS_4505
+# if defined(_MSC_VER)
+#   pragma warning(disable : 4505) /* unreferenced local function has been removed */
+# endif 
+#endif
+
+#ifndef SWIGUNUSEDPARM
+# ifdef __cplusplus
+#   define SWIGUNUSEDPARM(p)
+# else
+#   define SWIGUNUSEDPARM(p) p SWIGUNUSED 
+# endif
+#endif
+
+/* internal SWIG method */
+#ifndef SWIGINTERN
+# define SWIGINTERN static SWIGUNUSED
+#endif
+
+/* internal inline SWIG method */
+#ifndef SWIGINTERNINLINE
+# define SWIGINTERNINLINE SWIGINTERN SWIGINLINE
+#endif
+
+/* exporting methods */
+#if (__GNUC__ >= 4) || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)
+#  ifndef GCC_HASCLASSVISIBILITY
+#    define GCC_HASCLASSVISIBILITY
+#  endif
+#endif
+
+#ifndef SWIGEXPORT
+# if defined(_WIN32) || defined(__WIN32__) || defined(__CYGWIN__)
+#   if defined(STATIC_LINKED)
+#     define SWIGEXPORT
+#   else
+#     define SWIGEXPORT __declspec(dllexport)
+#   endif
+# else
+#   if defined(__GNUC__) && defined(GCC_HASCLASSVISIBILITY)
+#     define SWIGEXPORT __attribute__ ((visibility("default")))
+#   else
+#     define SWIGEXPORT
+#   endif
+# endif
+#endif
+
+/* calling conventions for Windows */
+#ifndef SWIGSTDCALL
+# if defined(_WIN32) || defined(__WIN32__) || defined(__CYGWIN__)
+#   define SWIGSTDCALL __stdcall
+# else
+#   define SWIGSTDCALL
+# endif 
+#endif
+
+/* Deal with Microsoft's attempt at deprecating C standard runtime functions */
+#if !defined(SWIG_NO_CRT_SECURE_NO_DEPRECATE) && defined(_MSC_VER) && !defined(_CRT_SECURE_NO_DEPRECATE)
+# define _CRT_SECURE_NO_DEPRECATE
+#endif
+
+/* Deal with Microsoft's attempt at deprecating methods in the standard C++ library */
+#if !defined(SWIG_NO_SCL_SECURE_NO_DEPRECATE) && defined(_MSC_VER) && !defined(_SCL_SECURE_NO_DEPRECATE)
+# define _SCL_SECURE_NO_DEPRECATE
+#endif
+
+
+/*  Errors in SWIG */
+#define  SWIG_UnknownError    	   -1 
+#define  SWIG_IOError        	   -2 
+#define  SWIG_RuntimeError   	   -3 
+#define  SWIG_IndexError     	   -4 
+#define  SWIG_TypeError      	   -5 
+#define  SWIG_DivisionByZero 	   -6 
+#define  SWIG_OverflowError  	   -7 
+#define  SWIG_SyntaxError    	   -8 
+#define  SWIG_ValueError     	   -9 
+#define  SWIG_SystemError    	   -10
+#define  SWIG_AttributeError 	   -11
+#define  SWIG_MemoryError    	   -12 
+#define  SWIG_NullReferenceError   -13
+
+
+
+
+#define SWIGVERSION 0x020004 
+#define SWIG_VERSION SWIGVERSION
+
+
+#define SWIG_as_voidptr(a) const_cast< void * >(static_cast< const void * >(a)) 
+#define SWIG_as_voidptrptr(a) ((void)SWIG_as_voidptr(*a),reinterpret_cast< void** >(a)) 
+
+
+#include <stdexcept>
+
+
+#include "THyPhy.h"
+
+
+SWIGINTERN int
+SWIG_AsCharPtrAndSize(SEXP obj, char** cptr, size_t* psize, int *alloc)
+{
+  if (cptr && Rf_isString(obj)) {
+    char *cstr = const_cast< char * >(CHAR(STRING_ELT(obj, 0)));
+    int len = strlen(cstr);
+
+    if (alloc) {
+      if (*alloc == SWIG_NEWOBJ) {
+        *cptr = reinterpret_cast< char* >(memcpy((new char[len + 1]), cstr, sizeof(char)*(len + 1)));
+        *alloc = SWIG_NEWOBJ;
+      } else {
+        *cptr = cstr;
+      }
+    } else {
+      *cptr = reinterpret_cast< char * >(malloc(len + 1));
+      *cptr = strcpy(*cptr, cstr);
+    }
+    if (psize) *psize = len + 1;
+    return SWIG_OK;
+  }
+  return SWIG_TypeError;
+}
+
+
+
+
+
+SWIGINTERNINLINE  int
+SWIG_AsVal_long (SEXP obj, long *val)
+{
+   if (val) *val = Rf_asInteger(obj);
+   return SWIG_OK;
+}
+
+
+SWIGINTERN char *
+SWIG_strdup(const char *str)
+{
+  char *newstr = reinterpret_cast< char * >(malloc(strlen(str) + 1));
+  return strcpy(newstr, str);
+}
+
+
+SWIGINTERNINLINE  int
+SWIG_AsVal_double (SEXP obj, double *val)
+{
+   if (val) *val = Rf_asReal(obj);
+   return SWIG_OK;
+}
+
+
+SWIGINTERNINLINE SEXP
+SWIG_From_double  (double value)
+{
+	return Rf_ScalarReal(value);
+}
+
+
+SWIGINTERN int
+SWIG_AsVal_bool (SEXP obj, bool *val)
+{
+  long v;
+  int res = SWIG_AsVal_long (obj, val ? &v : 0);
+  if (SWIG_IsOK(res)) {    
+    if (val) *val = v ? true : false;
+    return res;
+  }  
+  return SWIG_TypeError;
+}
+
+
+#include <limits.h>
+#if !defined(SWIG_NO_LLONG_MAX)
+# if !defined(LLONG_MAX) && defined(__GNUC__) && defined (__LONG_LONG_MAX__)
+#   define LLONG_MAX __LONG_LONG_MAX__
+#   define LLONG_MIN (-LLONG_MAX - 1LL)
+#   define ULLONG_MAX (LLONG_MAX * 2ULL + 1ULL)
+# endif
+#endif
+
+
+SWIGINTERN int
+SWIG_AsVal_int (SEXP obj, int *val)
+{
+  long v;
+  int res = SWIG_AsVal_long (obj, &v);
+  if (SWIG_IsOK(res)) {
+    if ((v < INT_MIN || v > INT_MAX)) {
+      return SWIG_OverflowError;
+    } else {
+      if (val) *val = static_cast< int >(v);
+    }
+  }  
+  return res;
+}
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+SWIGEXPORT SEXP
+R_swig__THyPhyReturnObject_myType ( SEXP self, SEXP s_swig_copy)
+{
+  int result;
+  _THyPhyReturnObject *arg1 = (_THyPhyReturnObject *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  unsigned int r_nprotect = 0;
+  SEXP r_ans = R_NilValue ;
+  VMAXTYPE r_vmax = vmaxget() ;
+  
+  res1 = SWIG_R_ConvertPtr(self, &argp1, SWIGTYPE_p__THyPhyReturnObject, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "_THyPhyReturnObject_myType" "', argument " "1"" of type '" "_THyPhyReturnObject *""'"); 
+  }
+  arg1 = reinterpret_cast< _THyPhyReturnObject * >(argp1);
+  result = (int)(arg1)->myType();
+  r_ans = Rf_ScalarInteger(result);
+  
+  vmaxset(r_vmax);
+  if(r_nprotect)  Rf_unprotect(r_nprotect);
+  
+  return r_ans;
+}
+
+
+SWIGEXPORT SEXP
+R_swig_delete__THyPhyReturnObject ( SEXP self)
+{
+  _THyPhyReturnObject *arg1 = (_THyPhyReturnObject *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  unsigned int r_nprotect = 0;
+  SEXP r_ans = R_NilValue ;
+  VMAXTYPE r_vmax = vmaxget() ;
+  
+  res1 = SWIG_R_ConvertPtr(self, &argp1, SWIGTYPE_p__THyPhyReturnObject, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete__THyPhyReturnObject" "', argument " "1"" of type '" "_THyPhyReturnObject *""'"); 
+  }
+  arg1 = reinterpret_cast< _THyPhyReturnObject * >(argp1);
+  delete arg1;
+  r_ans = R_NilValue;
+  
+  vmaxset(r_vmax);
+  if(r_nprotect)  Rf_unprotect(r_nprotect);
+  
+  R_ClearExternalPtr(self);
+  return r_ans;
+}
+
+
+SWIGEXPORT SEXP
+R_swig__THyPhyReturnObject_castToString ( SEXP self)
+{
+  _THyPhyString *result = 0 ;
+  _THyPhyReturnObject *arg1 = (_THyPhyReturnObject *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  unsigned int r_nprotect = 0;
+  SEXP r_ans = R_NilValue ;
+  VMAXTYPE r_vmax = vmaxget() ;
+  
+  res1 = SWIG_R_ConvertPtr(self, &argp1, SWIGTYPE_p__THyPhyReturnObject, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "_THyPhyReturnObject_castToString" "', argument " "1"" of type '" "_THyPhyReturnObject *""'"); 
+  }
+  arg1 = reinterpret_cast< _THyPhyReturnObject * >(argp1);
+  result = (_THyPhyString *)(arg1)->castToString();
+  r_ans = SWIG_R_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p__THyPhyString, R_SWIG_EXTERNAL |  0 );
+  
+  vmaxset(r_vmax);
+  if(r_nprotect)  Rf_unprotect(r_nprotect);
+  
+  return r_ans;
+}
+
+
+SWIGEXPORT SEXP
+R_swig__THyPhyReturnObject_castToNumber ( SEXP self)
+{
+  _THyPhyNumber *result = 0 ;
+  _THyPhyReturnObject *arg1 = (_THyPhyReturnObject *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  unsigned int r_nprotect = 0;
+  SEXP r_ans = R_NilValue ;
+  VMAXTYPE r_vmax = vmaxget() ;
+  
+  res1 = SWIG_R_ConvertPtr(self, &argp1, SWIGTYPE_p__THyPhyReturnObject, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "_THyPhyReturnObject_castToNumber" "', argument " "1"" of type '" "_THyPhyReturnObject *""'"); 
+  }
+  arg1 = reinterpret_cast< _THyPhyReturnObject * >(argp1);
+  result = (_THyPhyNumber *)(arg1)->castToNumber();
+  r_ans = SWIG_R_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p__THyPhyNumber, R_SWIG_EXTERNAL |  0 );
+  
+  vmaxset(r_vmax);
+  if(r_nprotect)  Rf_unprotect(r_nprotect);
+  
+  return r_ans;
+}
+
+
+SWIGEXPORT SEXP
+R_swig__THyPhyReturnObject_castToMatrix ( SEXP self)
+{
+  _THyPhyMatrix *result = 0 ;
+  _THyPhyReturnObject *arg1 = (_THyPhyReturnObject *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  unsigned int r_nprotect = 0;
+  SEXP r_ans = R_NilValue ;
+  VMAXTYPE r_vmax = vmaxget() ;
+  
+  res1 = SWIG_R_ConvertPtr(self, &argp1, SWIGTYPE_p__THyPhyReturnObject, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "_THyPhyReturnObject_castToMatrix" "', argument " "1"" of type '" "_THyPhyReturnObject *""'"); 
+  }
+  arg1 = reinterpret_cast< _THyPhyReturnObject * >(argp1);
+  result = (_THyPhyMatrix *)(arg1)->castToMatrix();
+  r_ans = SWIG_R_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p__THyPhyMatrix, R_SWIG_EXTERNAL |  0 );
+  
+  vmaxset(r_vmax);
+  if(r_nprotect)  Rf_unprotect(r_nprotect);
+  
+  return r_ans;
+}
+
+
+SWIGEXPORT SEXP
+R_swig_new__THyPhyString__SWIG_0 ( SEXP s_arg1, SEXP s_arg2)
+{
+  _THyPhyString *result = 0 ;
+  char *arg1 = (char *) 0 ;
+  long arg2 ;
+  int res1 ;
+  char *buf1 = 0 ;
+  int alloc1 = 0 ;
+  unsigned int r_nprotect = 0;
+  SEXP r_ans = R_NilValue ;
+  VMAXTYPE r_vmax = vmaxget() ;
+  
+  res1 = SWIG_AsCharPtrAndSize(s_arg1, &buf1, NULL, &alloc1);
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new__THyPhyString" "', argument " "1"" of type '" "char const *""'");
+  }
+  arg1 = reinterpret_cast< char * >(buf1);
+  arg2 = static_cast< long >(INTEGER(s_arg2)[0]);
+  result = (_THyPhyString *)new _THyPhyString((char const *)arg1,arg2);
+  r_ans = SWIG_R_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p__THyPhyString, R_SWIG_OWNER |  0 );
+  if (alloc1 == SWIG_NEWOBJ) delete[] buf1;
+  
+  vmaxset(r_vmax);
+  if(r_nprotect)  Rf_unprotect(r_nprotect);
+  
+  return r_ans;
+}
+
+
+SWIGEXPORT SEXP
+R_swig_new__THyPhyString__SWIG_1 ( SEXP s_arg1)
+{
+  _THyPhyString *result = 0 ;
+  char *arg1 = (char *) 0 ;
+  int res1 ;
+  char *buf1 = 0 ;
+  int alloc1 = 0 ;
+  unsigned int r_nprotect = 0;
+  SEXP r_ans = R_NilValue ;
+  VMAXTYPE r_vmax = vmaxget() ;
+  
+  res1 = SWIG_AsCharPtrAndSize(s_arg1, &buf1, NULL, &alloc1);
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new__THyPhyString" "', argument " "1"" of type '" "char const *""'");
+  }
+  arg1 = reinterpret_cast< char * >(buf1);
+  result = (_THyPhyString *)new _THyPhyString((char const *)arg1);
+  r_ans = SWIG_R_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p__THyPhyString, R_SWIG_OWNER |  0 );
+  if (alloc1 == SWIG_NEWOBJ) delete[] buf1;
+  vmaxset(r_vmax);
+  if(r_nprotect)  Rf_unprotect(r_nprotect);
+  
+  return r_ans;
+}
+
+
+SWIGEXPORT SEXP
+R_swig_new__THyPhyString__SWIG_2 ( )
+{
+  _THyPhyString *result = 0 ;
+  unsigned int r_nprotect = 0;
+  SEXP r_ans = R_NilValue ;
+  VMAXTYPE r_vmax = vmaxget() ;
+  
+  result = (_THyPhyString *)new _THyPhyString();
+  r_ans = SWIG_R_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p__THyPhyString, R_SWIG_OWNER |  0 );
+  vmaxset(r_vmax);
+  if(r_nprotect)  Rf_unprotect(r_nprotect);
+  
+  return r_ans;
+}
+
+
+SWIGEXPORT SEXP
+R_swig__THyPhyString_myType ( SEXP self, SEXP s_swig_copy)
+{
+  int result;
+  _THyPhyString *arg1 = (_THyPhyString *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  unsigned int r_nprotect = 0;
+  SEXP r_ans = R_NilValue ;
+  VMAXTYPE r_vmax = vmaxget() ;
+  
+  res1 = SWIG_R_ConvertPtr(self, &argp1, SWIGTYPE_p__THyPhyString, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "_THyPhyString_myType" "', argument " "1"" of type '" "_THyPhyString *""'"); 
+  }
+  arg1 = reinterpret_cast< _THyPhyString * >(argp1);
+  result = (int)(arg1)->myType();
+  r_ans = Rf_ScalarInteger(result);
+  
+  vmaxset(r_vmax);
+  if(r_nprotect)  Rf_unprotect(r_nprotect);
+  
+  return r_ans;
+}
+
+
+SWIGEXPORT SEXP
+R_swig_delete__THyPhyString ( SEXP self)
+{
+  _THyPhyString *arg1 = (_THyPhyString *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  unsigned int r_nprotect = 0;
+  SEXP r_ans = R_NilValue ;
+  VMAXTYPE r_vmax = vmaxget() ;
+  
+  res1 = SWIG_R_ConvertPtr(self, &argp1, SWIGTYPE_p__THyPhyString, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete__THyPhyString" "', argument " "1"" of type '" "_THyPhyString *""'"); 
+  }
+  arg1 = reinterpret_cast< _THyPhyString * >(argp1);
+  delete arg1;
+  r_ans = R_NilValue;
+  
+  vmaxset(r_vmax);
+  if(r_nprotect)  Rf_unprotect(r_nprotect);
+  
+  R_ClearExternalPtr(self);
+  return r_ans;
+}
+
+
+SWIGEXPORT SEXP
+R_swig__THyPhyString_sLength_set ( SEXP self, SEXP s_sLength)
+{
+  _THyPhyString *arg1 = (_THyPhyString *) 0 ;
+  long arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  unsigned int r_nprotect = 0;
+  SEXP r_ans = R_NilValue ;
+  VMAXTYPE r_vmax = vmaxget() ;
+  
+  res1 = SWIG_R_ConvertPtr(self, &argp1, SWIGTYPE_p__THyPhyString, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "_THyPhyString_sLength_set" "', argument " "1"" of type '" "_THyPhyString *""'"); 
+  }
+  arg1 = reinterpret_cast< _THyPhyString * >(argp1);
+  arg2 = static_cast< long >(INTEGER(s_sLength)[0]);
+  if (arg1) (arg1)->sLength = arg2;
+  r_ans = R_NilValue;
+  
+  
+  vmaxset(r_vmax);
+  if(r_nprotect)  Rf_unprotect(r_nprotect);
+  
+  return r_ans;
+}
+
+
+SWIGEXPORT SEXP
+R_swig__THyPhyString_sLength_get ( SEXP self, SEXP s_swig_copy)
+{
+  long result;
+  _THyPhyString *arg1 = (_THyPhyString *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  unsigned int r_nprotect = 0;
+  SEXP r_ans = R_NilValue ;
+  VMAXTYPE r_vmax = vmaxget() ;
+  
+  res1 = SWIG_R_ConvertPtr(self, &argp1, SWIGTYPE_p__THyPhyString, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "_THyPhyString_sLength_get" "', argument " "1"" of type '" "_THyPhyString *""'"); 
+  }
+  arg1 = reinterpret_cast< _THyPhyString * >(argp1);
+  result = (long) ((arg1)->sLength);
+  r_ans = Rf_ScalarInteger(result);
+  
+  vmaxset(r_vmax);
+  if(r_nprotect)  Rf_unprotect(r_nprotect);
+  
+  return r_ans;
+}
+
+
+SWIGEXPORT SEXP
+R_swig__THyPhyString_sData_set ( SEXP self, SEXP s_sData)
+{
+  _THyPhyString *arg1 = (_THyPhyString *) 0 ;
+  char *arg2 = (char *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  unsigned int r_nprotect = 0;
+  SEXP r_ans = R_NilValue ;
+  VMAXTYPE r_vmax = vmaxget() ;
+  
+  res1 = SWIG_R_ConvertPtr(self, &argp1, SWIGTYPE_p__THyPhyString, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "_THyPhyString_sData_set" "', argument " "1"" of type '" "_THyPhyString *""'"); 
+  }
+  arg1 = reinterpret_cast< _THyPhyString * >(argp1);
+  arg2 = reinterpret_cast< char * >(SWIG_strdup(CHAR(STRING_ELT(s_sData, 0))));
+  if (arg1->sData) delete[] arg1->sData;
+  if (arg2) {
+    size_t size = strlen(reinterpret_cast< const char * >(arg2)) + 1;
+    arg1->sData = (char *)reinterpret_cast< char* >(memcpy((new char[size]), reinterpret_cast< const char * >(arg2), sizeof(char)*(size)));
+  } else {
+    arg1->sData = 0;
+  }
+  r_ans = R_NilValue;
+  
+  free(arg2);
+  vmaxset(r_vmax);
+  if(r_nprotect)  Rf_unprotect(r_nprotect);
+  
+  return r_ans;
+}
+
+
+SWIGEXPORT SEXP
+R_swig__THyPhyString_sData_get ( SEXP self)
+{
+  char *result = 0 ;
+  _THyPhyString *arg1 = (_THyPhyString *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  unsigned int r_nprotect = 0;
+  SEXP r_ans = R_NilValue ;
+  VMAXTYPE r_vmax = vmaxget() ;
+  
+  res1 = SWIG_R_ConvertPtr(self, &argp1, SWIGTYPE_p__THyPhyString, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "_THyPhyString_sData_get" "', argument " "1"" of type '" "_THyPhyString *""'"); 
+  }
+  arg1 = reinterpret_cast< _THyPhyString * >(argp1);
+  result = (char *) ((arg1)->sData);
+  r_ans = result ? Rf_mkString(reinterpret_cast< char * >(result)) : R_NilValue;
+  
+  vmaxset(r_vmax);
+  if(r_nprotect)  Rf_unprotect(r_nprotect);
+  
+  return r_ans;
+}
+
+
+SWIGEXPORT SEXP
+R_swig_new__THyPhyNumber__SWIG_0 ( SEXP s_arg1)
+{
+  _THyPhyNumber *result = 0 ;
+  double arg1 ;
+  unsigned int r_nprotect = 0;
+  SEXP r_ans = R_NilValue ;
+  VMAXTYPE r_vmax = vmaxget() ;
+  
+  arg1 = static_cast< double >(REAL(s_arg1)[0]);
+  result = (_THyPhyNumber *)new _THyPhyNumber(arg1);
+  r_ans = SWIG_R_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p__THyPhyNumber, R_SWIG_OWNER |  0 );
+  
+  vmaxset(r_vmax);
+  if(r_nprotect)  Rf_unprotect(r_nprotect);
+  
+  return r_ans;
+}
+
+
+SWIGEXPORT SEXP
+R_swig_new__THyPhyNumber__SWIG_1 ( )
+{
+  _THyPhyNumber *result = 0 ;
+  unsigned int r_nprotect = 0;
+  SEXP r_ans = R_NilValue ;
+  VMAXTYPE r_vmax = vmaxget() ;
+  
+  result = (_THyPhyNumber *)new _THyPhyNumber();
+  r_ans = SWIG_R_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p__THyPhyNumber, R_SWIG_OWNER |  0 );
+  vmaxset(r_vmax);
+  if(r_nprotect)  Rf_unprotect(r_nprotect);
+  
+  return r_ans;
+}
+
+
+SWIGEXPORT SEXP
+R_swig__THyPhyNumber_myType ( SEXP self, SEXP s_swig_copy)
+{
+  int result;
+  _THyPhyNumber *arg1 = (_THyPhyNumber *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  unsigned int r_nprotect = 0;
+  SEXP r_ans = R_NilValue ;
+  VMAXTYPE r_vmax = vmaxget() ;
+  
+  res1 = SWIG_R_ConvertPtr(self, &argp1, SWIGTYPE_p__THyPhyNumber, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "_THyPhyNumber_myType" "', argument " "1"" of type '" "_THyPhyNumber *""'"); 
+  }
+  arg1 = reinterpret_cast< _THyPhyNumber * >(argp1);
+  result = (int)(arg1)->myType();
+  r_ans = Rf_ScalarInteger(result);
+  
+  vmaxset(r_vmax);
+  if(r_nprotect)  Rf_unprotect(r_nprotect);
+  
+  return r_ans;
+}
+
+
+SWIGEXPORT SEXP
+R_swig_delete__THyPhyNumber ( SEXP self)
+{
+  _THyPhyNumber *arg1 = (_THyPhyNumber *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  unsigned int r_nprotect = 0;
+  SEXP r_ans = R_NilValue ;
+  VMAXTYPE r_vmax = vmaxget() ;
+  
+  res1 = SWIG_R_ConvertPtr(self, &argp1, SWIGTYPE_p__THyPhyNumber, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete__THyPhyNumber" "', argument " "1"" of type '" "_THyPhyNumber *""'"); 
+  }
+  arg1 = reinterpret_cast< _THyPhyNumber * >(argp1);
+  delete arg1;
+  r_ans = R_NilValue;
+  
+  vmaxset(r_vmax);
+  if(r_nprotect)  Rf_unprotect(r_nprotect);
+  
+  R_ClearExternalPtr(self);
+  return r_ans;
+}
+
+
+SWIGEXPORT SEXP
+R_swig__THyPhyNumber_nValue_set ( SEXP self, SEXP s_nValue)
+{
+  _THyPhyNumber *arg1 = (_THyPhyNumber *) 0 ;
+  double arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  unsigned int r_nprotect = 0;
+  SEXP r_ans = R_NilValue ;
+  VMAXTYPE r_vmax = vmaxget() ;
+  
+  res1 = SWIG_R_ConvertPtr(self, &argp1, SWIGTYPE_p__THyPhyNumber, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "_THyPhyNumber_nValue_set" "', argument " "1"" of type '" "_THyPhyNumber *""'"); 
+  }
+  arg1 = reinterpret_cast< _THyPhyNumber * >(argp1);
+  arg2 = static_cast< double >(REAL(s_nValue)[0]);
+  if (arg1) (arg1)->nValue = arg2;
+  r_ans = R_NilValue;
+  
+  
+  vmaxset(r_vmax);
+  if(r_nprotect)  Rf_unprotect(r_nprotect);
+  
+  return r_ans;
+}
+
+
+SWIGEXPORT SEXP
+R_swig__THyPhyNumber_nValue_get ( SEXP self, SEXP s_swig_copy)
+{
+  double result;
+  _THyPhyNumber *arg1 = (_THyPhyNumber *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  unsigned int r_nprotect = 0;
+  SEXP r_ans = R_NilValue ;
+  VMAXTYPE r_vmax = vmaxget() ;
+  
+  res1 = SWIG_R_ConvertPtr(self, &argp1, SWIGTYPE_p__THyPhyNumber, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "_THyPhyNumber_nValue_get" "', argument " "1"" of type '" "_THyPhyNumber *""'"); 
+  }
+  arg1 = reinterpret_cast< _THyPhyNumber * >(argp1);
+  result = (double) ((arg1)->nValue);
+  r_ans = SWIG_From_double(static_cast< double >(result));
+  
+  vmaxset(r_vmax);
+  if(r_nprotect)  Rf_unprotect(r_nprotect);
+  
+  return r_ans;
+}
+
+
+SWIGEXPORT SEXP
+R_swig_new__THyPhyMatrix__SWIG_0 ( )
+{
+  _THyPhyMatrix *result = 0 ;
+  unsigned int r_nprotect = 0;
+  SEXP r_ans = R_NilValue ;
+  VMAXTYPE r_vmax = vmaxget() ;
+  
+  result = (_THyPhyMatrix *)new _THyPhyMatrix();
+  r_ans = SWIG_R_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p__THyPhyMatrix, R_SWIG_OWNER |  0 );
+  vmaxset(r_vmax);
+  if(r_nprotect)  Rf_unprotect(r_nprotect);
+  
+  return r_ans;
+}
+
+
+SWIGEXPORT SEXP
+R_swig_new__THyPhyMatrix__SWIG_1 ( SEXP s_arg1, SEXP s_arg2, SEXP s_arg3)
+{
+  _THyPhyMatrix *result = 0 ;
+  long arg1 ;
+  long arg2 ;
+  double *arg3 = (double *) 0 ;
+  unsigned int r_nprotect = 0;
+  SEXP r_ans = R_NilValue ;
+  VMAXTYPE r_vmax = vmaxget() ;
+  
+  arg1 = static_cast< long >(INTEGER(s_arg1)[0]);
+  arg2 = static_cast< long >(INTEGER(s_arg2)[0]);
+  {
+    {
+      int _rswigi;
+      int _rswiglen = LENGTH(s_arg3);
+      arg3 = static_cast< double * >(calloc(sizeof(double), _rswiglen));
+      for (_rswigi=0; _rswigi<_rswiglen; _rswigi++) {
+        arg3[_rswigi] = REAL(s_arg3)[_rswigi];
+      }
+    }
+  }
+  result = (_THyPhyMatrix *)new _THyPhyMatrix(arg1,arg2,(double const *)arg3);
+  r_ans = SWIG_R_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p__THyPhyMatrix, R_SWIG_OWNER |  0 );
+  
+  
+  
+  free(arg3);
+  
+  vmaxset(r_vmax);
+  if(r_nprotect)  Rf_unprotect(r_nprotect);
+  
+  return r_ans;
+}
+
+
+SWIGEXPORT SEXP
+R_swig__THyPhyMatrix_myType ( SEXP self, SEXP s_swig_copy)
+{
+  int result;
+  _THyPhyMatrix *arg1 = (_THyPhyMatrix *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  unsigned int r_nprotect = 0;
+  SEXP r_ans = R_NilValue ;
+  VMAXTYPE r_vmax = vmaxget() ;
+  
+  res1 = SWIG_R_ConvertPtr(self, &argp1, SWIGTYPE_p__THyPhyMatrix, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "_THyPhyMatrix_myType" "', argument " "1"" of type '" "_THyPhyMatrix *""'"); 
+  }
+  arg1 = reinterpret_cast< _THyPhyMatrix * >(argp1);
+  result = (int)(arg1)->myType();
+  r_ans = Rf_ScalarInteger(result);
+  
+  vmaxset(r_vmax);
+  if(r_nprotect)  Rf_unprotect(r_nprotect);
+  
+  return r_ans;
+}
+
+
+SWIGEXPORT SEXP
+R_swig_delete__THyPhyMatrix ( SEXP self)
+{
+  _THyPhyMatrix *arg1 = (_THyPhyMatrix *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  unsigned int r_nprotect = 0;
+  SEXP r_ans = R_NilValue ;
+  VMAXTYPE r_vmax = vmaxget() ;
+  
+  res1 = SWIG_R_ConvertPtr(self, &argp1, SWIGTYPE_p__THyPhyMatrix, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete__THyPhyMatrix" "', argument " "1"" of type '" "_THyPhyMatrix *""'"); 
+  }
+  arg1 = reinterpret_cast< _THyPhyMatrix * >(argp1);
+  delete arg1;
+  r_ans = R_NilValue;
+  
+  vmaxset(r_vmax);
+  if(r_nprotect)  Rf_unprotect(r_nprotect);
+  
+  R_ClearExternalPtr(self);
+  return r_ans;
+}
+
+
+SWIGEXPORT SEXP
+R_swig__THyPhyMatrix_MatrixCell ( SEXP self, SEXP s_arg2, SEXP s_arg3, SEXP s_swig_copy)
+{
+  double result;
+  _THyPhyMatrix *arg1 = (_THyPhyMatrix *) 0 ;
+  long arg2 ;
+  long arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  unsigned int r_nprotect = 0;
+  SEXP r_ans = R_NilValue ;
+  VMAXTYPE r_vmax = vmaxget() ;
+  
+  res1 = SWIG_R_ConvertPtr(self, &argp1, SWIGTYPE_p__THyPhyMatrix, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "_THyPhyMatrix_MatrixCell" "', argument " "1"" of type '" "_THyPhyMatrix *""'"); 
+  }
+  arg1 = reinterpret_cast< _THyPhyMatrix * >(argp1);
+  arg2 = static_cast< long >(INTEGER(s_arg2)[0]);
+  arg3 = static_cast< long >(INTEGER(s_arg3)[0]);
+  result = (double)(arg1)->MatrixCell(arg2,arg3);
+  r_ans = SWIG_From_double(static_cast< double >(result));
+  
+  
+  
+  vmaxset(r_vmax);
+  if(r_nprotect)  Rf_unprotect(r_nprotect);
+  
+  return r_ans;
+}
+
+
+SWIGEXPORT SEXP
+R_swig__THyPhyMatrix_mRows_set ( SEXP self, SEXP s_mRows)
+{
+  _THyPhyMatrix *arg1 = (_THyPhyMatrix *) 0 ;
+  long arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  unsigned int r_nprotect = 0;
+  SEXP r_ans = R_NilValue ;
+  VMAXTYPE r_vmax = vmaxget() ;
+  
+  res1 = SWIG_R_ConvertPtr(self, &argp1, SWIGTYPE_p__THyPhyMatrix, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "_THyPhyMatrix_mRows_set" "', argument " "1"" of type '" "_THyPhyMatrix *""'"); 
+  }
+  arg1 = reinterpret_cast< _THyPhyMatrix * >(argp1);
+  arg2 = static_cast< long >(INTEGER(s_mRows)[0]);
+  if (arg1) (arg1)->mRows = arg2;
+  r_ans = R_NilValue;
+  
+  
+  vmaxset(r_vmax);
+  if(r_nprotect)  Rf_unprotect(r_nprotect);
+  
+  return r_ans;
+}
+
+
+SWIGEXPORT SEXP
+R_swig__THyPhyMatrix_mRows_get ( SEXP self, SEXP s_swig_copy)
+{
+  long result;
+  _THyPhyMatrix *arg1 = (_THyPhyMatrix *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  unsigned int r_nprotect = 0;
+  SEXP r_ans = R_NilValue ;
+  VMAXTYPE r_vmax = vmaxget() ;
+  
+  res1 = SWIG_R_ConvertPtr(self, &argp1, SWIGTYPE_p__THyPhyMatrix, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "_THyPhyMatrix_mRows_get" "', argument " "1"" of type '" "_THyPhyMatrix *""'"); 
+  }
+  arg1 = reinterpret_cast< _THyPhyMatrix * >(argp1);
+  result = (long) ((arg1)->mRows);
+  r_ans = Rf_ScalarInteger(result);
+  
+  vmaxset(r_vmax);
+  if(r_nprotect)  Rf_unprotect(r_nprotect);
+  
+  return r_ans;
+}
+
+
+SWIGEXPORT SEXP
+R_swig__THyPhyMatrix_mCols_set ( SEXP self, SEXP s_mCols)
+{
+  _THyPhyMatrix *arg1 = (_THyPhyMatrix *) 0 ;
+  long arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  unsigned int r_nprotect = 0;
+  SEXP r_ans = R_NilValue ;
+  VMAXTYPE r_vmax = vmaxget() ;
+  
+  res1 = SWIG_R_ConvertPtr(self, &argp1, SWIGTYPE_p__THyPhyMatrix, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "_THyPhyMatrix_mCols_set" "', argument " "1"" of type '" "_THyPhyMatrix *""'"); 
+  }
+  arg1 = reinterpret_cast< _THyPhyMatrix * >(argp1);
+  arg2 = static_cast< long >(INTEGER(s_mCols)[0]);
+  if (arg1) (arg1)->mCols = arg2;
+  r_ans = R_NilValue;
+  
+  
+  vmaxset(r_vmax);
+  if(r_nprotect)  Rf_unprotect(r_nprotect);
+  
+  return r_ans;
+}
+
+
+SWIGEXPORT SEXP
+R_swig__THyPhyMatrix_mCols_get ( SEXP self, SEXP s_swig_copy)
+{
+  long result;
+  _THyPhyMatrix *arg1 = (_THyPhyMatrix *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  unsigned int r_nprotect = 0;
+  SEXP r_ans = R_NilValue ;
+  VMAXTYPE r_vmax = vmaxget() ;
+  
+  res1 = SWIG_R_ConvertPtr(self, &argp1, SWIGTYPE_p__THyPhyMatrix, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "_THyPhyMatrix_mCols_get" "', argument " "1"" of type '" "_THyPhyMatrix *""'"); 
+  }
+  arg1 = reinterpret_cast< _THyPhyMatrix * >(argp1);
+  result = (long) ((arg1)->mCols);
+  r_ans = Rf_ScalarInteger(result);
+  
+  vmaxset(r_vmax);
+  if(r_nprotect)  Rf_unprotect(r_nprotect);
+  
+  return r_ans;
+}
+
+
+SWIGEXPORT SEXP
+R_swig__THyPhyMatrix_mData_set ( SEXP self, SEXP s_mData)
+{
+  _THyPhyMatrix *arg1 = (_THyPhyMatrix *) 0 ;
+  double *arg2 = (double *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  unsigned int r_nprotect = 0;
+  SEXP r_ans = R_NilValue ;
+  VMAXTYPE r_vmax = vmaxget() ;
+  
+  res1 = SWIG_R_ConvertPtr(self, &argp1, SWIGTYPE_p__THyPhyMatrix, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "_THyPhyMatrix_mData_set" "', argument " "1"" of type '" "_THyPhyMatrix *""'"); 
+  }
+  arg1 = reinterpret_cast< _THyPhyMatrix * >(argp1);
+  {
+    {
+      int _rswigi;
+      int _rswiglen = LENGTH(s_mData);
+      arg2 = static_cast< double * >(calloc(sizeof(double), _rswiglen));
+      for (_rswigi=0; _rswigi<_rswiglen; _rswigi++) {
+        arg2[_rswigi] = REAL(s_mData)[_rswigi];
+      }
+    }
+  }
+  if (arg1) (arg1)->mData = arg2;
+  r_ans = R_NilValue;
+  
+  
+  free(arg2);
+  
+  vmaxset(r_vmax);
+  if(r_nprotect)  Rf_unprotect(r_nprotect);
+  
+  return r_ans;
+}
+
+
+SWIGEXPORT SEXP
+R_swig__THyPhyMatrix_mData_get ( SEXP self)
+{
+  double *result = 0 ;
+  _THyPhyMatrix *arg1 = (_THyPhyMatrix *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  unsigned int r_nprotect = 0;
+  SEXP r_ans = R_NilValue ;
+  VMAXTYPE r_vmax = vmaxget() ;
+  
+  res1 = SWIG_R_ConvertPtr(self, &argp1, SWIGTYPE_p__THyPhyMatrix, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "_THyPhyMatrix_mData_get" "', argument " "1"" of type '" "_THyPhyMatrix *""'"); 
+  }
+  arg1 = reinterpret_cast< _THyPhyMatrix * >(argp1);
+  result = (double *) ((arg1)->mData);
+  r_ans = SWIG_R_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_double, R_SWIG_EXTERNAL |  0 );
+  
+  vmaxset(r_vmax);
+  if(r_nprotect)  Rf_unprotect(r_nprotect);
+  
+  return r_ans;
+}
+
+
+SWIGEXPORT SEXP
+R_swig_new__THyPhy__SWIG_0 ( SEXP s_arg1, SEXP s_arg2, SEXP s_arg3)
+{
+  _THyPhy *result = 0 ;
+  _ProgressCancelHandler *arg1 = (_ProgressCancelHandler *) 0 ;
+  char *arg2 = (char *) 0 ;
+  long arg3 ;
+  int res2 ;
+  char *buf2 = 0 ;
+  int alloc2 = 0 ;
+  unsigned int r_nprotect = 0;
+  SEXP r_ans = R_NilValue ;
+  VMAXTYPE r_vmax = vmaxget() ;
+  
+  {
+    int res = SWIG_R_ConvertPtr(s_arg1, (void**)(&arg1), SWIGTYPE_p_f_p_char_int_double__bool, 0);
+    if (!SWIG_IsOK(res)) {
+      SWIG_exception_fail(SWIG_ArgError(res), "in method '" "new__THyPhy" "', argument " "1"" of type '" "_ProgressCancelHandler *""'"); 
+    }
+  }
+  res2 = SWIG_AsCharPtrAndSize(s_arg2, &buf2, NULL, &alloc2);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "new__THyPhy" "', argument " "2"" of type '" "char const *""'");
+  }
+  arg2 = reinterpret_cast< char * >(buf2);
+  arg3 = static_cast< long >(INTEGER(s_arg3)[0]);
+  result = (_THyPhy *)new _THyPhy(arg1,(char const *)arg2,arg3);
+  r_ans = SWIG_R_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p__THyPhy, R_SWIG_OWNER |  0 );
+  
+  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
+  
+  vmaxset(r_vmax);
+  if(r_nprotect)  Rf_unprotect(r_nprotect);
+  
+  return r_ans;
+}
+
+
+SWIGEXPORT SEXP
+R_swig_new__THyPhy__SWIG_1 ( SEXP s_arg1, SEXP s_arg2)
+{
+  _THyPhy *result = 0 ;
+  _ProgressCancelHandler *arg1 = (_ProgressCancelHandler *) 0 ;
+  char *arg2 = (char *) 0 ;
+  int res2 ;
+  char *buf2 = 0 ;
+  int alloc2 = 0 ;
+  unsigned int r_nprotect = 0;
+  SEXP r_ans = R_NilValue ;
+  VMAXTYPE r_vmax = vmaxget() ;
+  
+  {
+    int res = SWIG_R_ConvertPtr(s_arg1, (void**)(&arg1), SWIGTYPE_p_f_p_char_int_double__bool, 0);
+    if (!SWIG_IsOK(res)) {
+      SWIG_exception_fail(SWIG_ArgError(res), "in method '" "new__THyPhy" "', argument " "1"" of type '" "_ProgressCancelHandler *""'"); 
+    }
+  }
+  res2 = SWIG_AsCharPtrAndSize(s_arg2, &buf2, NULL, &alloc2);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "new__THyPhy" "', argument " "2"" of type '" "char const *""'");
+  }
+  arg2 = reinterpret_cast< char * >(buf2);
+  result = (_THyPhy *)new _THyPhy(arg1,(char const *)arg2);
+  r_ans = SWIG_R_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p__THyPhy, R_SWIG_OWNER |  0 );
+  
+  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
+  vmaxset(r_vmax);
+  if(r_nprotect)  Rf_unprotect(r_nprotect);
+  
+  return r_ans;
+}
+
+
+SWIGEXPORT SEXP
+R_swig_new__THyPhy__SWIG_2 ( SEXP s_arg1, SEXP s_arg2)
+{
+  _THyPhy *result = 0 ;
+  char *arg1 = (char *) 0 ;
+  long arg2 ;
+  int res1 ;
+  char *buf1 = 0 ;
+  int alloc1 = 0 ;
+  unsigned int r_nprotect = 0;
+  SEXP r_ans = R_NilValue ;
+  VMAXTYPE r_vmax = vmaxget() ;
+  
+  res1 = SWIG_AsCharPtrAndSize(s_arg1, &buf1, NULL, &alloc1);
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new__THyPhy" "', argument " "1"" of type '" "char const *""'");
+  }
+  arg1 = reinterpret_cast< char * >(buf1);
+  arg2 = static_cast< long >(INTEGER(s_arg2)[0]);
+  result = (_THyPhy *)new _THyPhy((char const *)arg1,arg2);
+  r_ans = SWIG_R_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p__THyPhy, R_SWIG_OWNER |  0 );
+  if (alloc1 == SWIG_NEWOBJ) delete[] buf1;
+  
+  vmaxset(r_vmax);
+  if(r_nprotect)  Rf_unprotect(r_nprotect);
+  
+  return r_ans;
+}
+
+
+SWIGEXPORT SEXP
+R_swig_new__THyPhy__SWIG_3 ( SEXP s_arg1)
+{
+  _THyPhy *result = 0 ;
+  char *arg1 = (char *) 0 ;
+  int res1 ;
+  char *buf1 = 0 ;
+  int alloc1 = 0 ;
+  unsigned int r_nprotect = 0;
+  SEXP r_ans = R_NilValue ;
+  VMAXTYPE r_vmax = vmaxget() ;
+  
+  res1 = SWIG_AsCharPtrAndSize(s_arg1, &buf1, NULL, &alloc1);
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new__THyPhy" "', argument " "1"" of type '" "char const *""'");
+  }
+  arg1 = reinterpret_cast< char * >(buf1);
+  result = (_THyPhy *)new _THyPhy((char const *)arg1);
+  r_ans = SWIG_R_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p__THyPhy, R_SWIG_OWNER |  0 );
+  if (alloc1 == SWIG_NEWOBJ) delete[] buf1;
+  vmaxset(r_vmax);
+  if(r_nprotect)  Rf_unprotect(r_nprotect);
+  
+  return r_ans;
+}
+
+
+SWIGEXPORT SEXP
+R_swig_delete__THyPhy ( SEXP self)
+{
+  _THyPhy *arg1 = (_THyPhy *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  unsigned int r_nprotect = 0;
+  SEXP r_ans = R_NilValue ;
+  VMAXTYPE r_vmax = vmaxget() ;
+  
+  res1 = SWIG_R_ConvertPtr(self, &argp1, SWIGTYPE_p__THyPhy, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete__THyPhy" "', argument " "1"" of type '" "_THyPhy *""'"); 
+  }
+  arg1 = reinterpret_cast< _THyPhy * >(argp1);
+  delete arg1;
+  r_ans = R_NilValue;
+  
+  vmaxset(r_vmax);
+  if(r_nprotect)  Rf_unprotect(r_nprotect);
+  
+  R_ClearExternalPtr(self);
+  return r_ans;
+}
+
+
+SWIGEXPORT SEXP
+R_swig__THyPhy_ExecuteBF__SWIG_0 ( SEXP self, SEXP s_arg2, SEXP s_arg3)
+{
+  _THyPhyString *result = 0 ;
+  _THyPhy *arg1 = (_THyPhy *) 0 ;
+  char *arg2 = (char *) 0 ;
+  bool arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int res2 ;
+  char *buf2 = 0 ;
+  int alloc2 = 0 ;
+  unsigned int r_nprotect = 0;
+  SEXP r_ans = R_NilValue ;
+  VMAXTYPE r_vmax = vmaxget() ;
+  
+  res1 = SWIG_R_ConvertPtr(self, &argp1, SWIGTYPE_p__THyPhy, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "_THyPhy_ExecuteBF" "', argument " "1"" of type '" "_THyPhy *""'"); 
+  }
+  arg1 = reinterpret_cast< _THyPhy * >(argp1);
+  res2 = SWIG_AsCharPtrAndSize(s_arg2, &buf2, NULL, &alloc2);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "_THyPhy_ExecuteBF" "', argument " "2"" of type '" "char const *""'");
+  }
+  arg2 = reinterpret_cast< char * >(buf2);
+  arg3 = LOGICAL(s_arg3)[0] ? true : false;
+  result = (_THyPhyString *)(arg1)->ExecuteBF((char const *)arg2,arg3);
+  r_ans = SWIG_R_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p__THyPhyString, R_SWIG_EXTERNAL |  0 );
+  
+  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
+  
+  vmaxset(r_vmax);
+  if(r_nprotect)  Rf_unprotect(r_nprotect);
+  
+  return r_ans;
+}
+
+
+SWIGEXPORT SEXP
+R_swig__THyPhy_ExecuteBF__SWIG_1 ( SEXP self, SEXP s_arg2)
+{
+  _THyPhyString *result = 0 ;
+  _THyPhy *arg1 = (_THyPhy *) 0 ;
+  char *arg2 = (char *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int res2 ;
+  char *buf2 = 0 ;
+  int alloc2 = 0 ;
+  unsigned int r_nprotect = 0;
+  SEXP r_ans = R_NilValue ;
+  VMAXTYPE r_vmax = vmaxget() ;
+  
+  res1 = SWIG_R_ConvertPtr(self, &argp1, SWIGTYPE_p__THyPhy, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "_THyPhy_ExecuteBF" "', argument " "1"" of type '" "_THyPhy *""'"); 
+  }
+  arg1 = reinterpret_cast< _THyPhy * >(argp1);
+  res2 = SWIG_AsCharPtrAndSize(s_arg2, &buf2, NULL, &alloc2);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "_THyPhy_ExecuteBF" "', argument " "2"" of type '" "char const *""'");
+  }
+  arg2 = reinterpret_cast< char * >(buf2);
+  result = (_THyPhyString *)(arg1)->ExecuteBF((char const *)arg2);
+  r_ans = SWIG_R_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p__THyPhyString, R_SWIG_EXTERNAL |  0 );
+  
+  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
+  vmaxset(r_vmax);
+  if(r_nprotect)  Rf_unprotect(r_nprotect);
+  
+  return r_ans;
+}
+
+
+SWIGEXPORT SEXP
+R_swig__THyPhy_InitTHyPhy ( SEXP self, SEXP s_arg2, SEXP s_arg3, SEXP s_arg4)
+{
+  _THyPhy *arg1 = (_THyPhy *) 0 ;
+  _ProgressCancelHandler *arg2 = (_ProgressCancelHandler *) 0 ;
+  char *arg3 = (char *) 0 ;
+  long arg4 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int res3 ;
+  char *buf3 = 0 ;
+  int alloc3 = 0 ;
+  unsigned int r_nprotect = 0;
+  SEXP r_ans = R_NilValue ;
+  VMAXTYPE r_vmax = vmaxget() ;
+  
+  res1 = SWIG_R_ConvertPtr(self, &argp1, SWIGTYPE_p__THyPhy, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "_THyPhy_InitTHyPhy" "', argument " "1"" of type '" "_THyPhy *""'"); 
+  }
+  arg1 = reinterpret_cast< _THyPhy * >(argp1);
+  {
+    int res = SWIG_R_ConvertPtr(s_arg2, (void**)(&arg2), SWIGTYPE_p_f_p_char_int_double__bool, 0);
+    if (!SWIG_IsOK(res)) {
+      SWIG_exception_fail(SWIG_ArgError(res), "in method '" "_THyPhy_InitTHyPhy" "', argument " "2"" of type '" "_ProgressCancelHandler *""'"); 
+    }
+  }
+  res3 = SWIG_AsCharPtrAndSize(s_arg3, &buf3, NULL, &alloc3);
+  if (!SWIG_IsOK(res3)) {
+    SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "_THyPhy_InitTHyPhy" "', argument " "3"" of type '" "char const *""'");
+  }
+  arg3 = reinterpret_cast< char * >(buf3);
+  arg4 = static_cast< long >(INTEGER(s_arg4)[0]);
+  (arg1)->InitTHyPhy(arg2,(char const *)arg3,arg4);
+  r_ans = R_NilValue;
+  
+  
+  if (alloc3 == SWIG_NEWOBJ) delete[] buf3;
+  
+  vmaxset(r_vmax);
+  if(r_nprotect)  Rf_unprotect(r_nprotect);
+  
+  return r_ans;
+}
+
+
+SWIGEXPORT SEXP
+R_swig__THyPhy_ClearAll ( SEXP self)
+{
+  _THyPhy *arg1 = (_THyPhy *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  unsigned int r_nprotect = 0;
+  SEXP r_ans = R_NilValue ;
+  VMAXTYPE r_vmax = vmaxget() ;
+  
+  res1 = SWIG_R_ConvertPtr(self, &argp1, SWIGTYPE_p__THyPhy, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "_THyPhy_ClearAll" "', argument " "1"" of type '" "_THyPhy *""'"); 
+  }
+  arg1 = reinterpret_cast< _THyPhy * >(argp1);
+  (arg1)->ClearAll();
+  r_ans = R_NilValue;
+  
+  vmaxset(r_vmax);
+  if(r_nprotect)  Rf_unprotect(r_nprotect);
+  
+  return r_ans;
+}
+
+
+SWIGEXPORT SEXP
+R_swig__THyPhy_AskFor ( SEXP self, SEXP s_arg2)
+{
+  void *result = 0 ;
+  _THyPhy *arg1 = (_THyPhy *) 0 ;
+  char *arg2 = (char *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int res2 ;
+  char *buf2 = 0 ;
+  int alloc2 = 0 ;
+  unsigned int r_nprotect = 0;
+  SEXP r_ans = R_NilValue ;
+  VMAXTYPE r_vmax = vmaxget() ;
+  
+  res1 = SWIG_R_ConvertPtr(self, &argp1, SWIGTYPE_p__THyPhy, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "_THyPhy_AskFor" "', argument " "1"" of type '" "_THyPhy *""'"); 
+  }
+  arg1 = reinterpret_cast< _THyPhy * >(argp1);
+  res2 = SWIG_AsCharPtrAndSize(s_arg2, &buf2, NULL, &alloc2);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "_THyPhy_AskFor" "', argument " "2"" of type '" "char const *""'");
+  }
+  arg2 = reinterpret_cast< char * >(buf2);
+  result = (void *)(arg1)->AskFor((char const *)arg2);
+  r_ans = SWIG_R_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_void, R_SWIG_EXTERNAL |  0 );
+  
+  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
+  vmaxset(r_vmax);
+  if(r_nprotect)  Rf_unprotect(r_nprotect);
+  
+  return r_ans;
+}
+
+
+SWIGEXPORT SEXP
+R_swig__THyPhy_DumpResult ( SEXP self, SEXP s_arg2)
+{
+  _THyPhy *arg1 = (_THyPhy *) 0 ;
+  void *arg2 = (void *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int res2 ;
+  unsigned int r_nprotect = 0;
+  SEXP r_ans = R_NilValue ;
+  VMAXTYPE r_vmax = vmaxget() ;
+  
+  res1 = SWIG_R_ConvertPtr(self, &argp1, SWIGTYPE_p__THyPhy, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "_THyPhy_DumpResult" "', argument " "1"" of type '" "_THyPhy *""'"); 
+  }
+  arg1 = reinterpret_cast< _THyPhy * >(argp1);
+  res2 = SWIG_R_ConvertPtr(s_arg2, SWIG_as_voidptrptr(&arg2), 0, 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "_THyPhy_DumpResult" "', argument " "2"" of type '" "void *""'"); 
+  }
+  (arg1)->DumpResult(arg2);
+  r_ans = R_NilValue;
+  
+  
+  vmaxset(r_vmax);
+  if(r_nprotect)  Rf_unprotect(r_nprotect);
+  
+  return r_ans;
+}
+
+
+SWIGEXPORT SEXP
+R_swig__THyPhy_CanCast ( SEXP self, SEXP s_arg2, SEXP s_arg3, SEXP s_swig_copy)
+{
+  bool result;
+  _THyPhy *arg1 = (_THyPhy *) 0 ;
+  void *arg2 = (void *) 0 ;
+  int arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int res2 ;
+  unsigned int r_nprotect = 0;
+  SEXP r_ans = R_NilValue ;
+  VMAXTYPE r_vmax = vmaxget() ;
+  
+  res1 = SWIG_R_ConvertPtr(self, &argp1, SWIGTYPE_p__THyPhy, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "_THyPhy_CanCast" "', argument " "1"" of type '" "_THyPhy *""'"); 
+  }
+  arg1 = reinterpret_cast< _THyPhy * >(argp1);
+  res2 = SWIG_R_ConvertPtr(s_arg2, SWIG_as_voidptrptr(&arg2), 0, 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "_THyPhy_CanCast" "', argument " "2"" of type '" "void const *""'"); 
+  }
+  arg3 = static_cast< int >(INTEGER(s_arg3)[0]);
+  result = (bool)(arg1)->CanCast((void const *)arg2,arg3);
+  r_ans = Rf_ScalarLogical(result);
+  
+  
+  
+  vmaxset(r_vmax);
+  if(r_nprotect)  Rf_unprotect(r_nprotect);
+  
+  return r_ans;
+}
+
+
+SWIGEXPORT SEXP
+R_swig__THyPhy_CastResult ( SEXP self, SEXP s_arg2, SEXP s_arg3)
+{
+  _THyPhyReturnObject *result = 0 ;
+  _THyPhy *arg1 = (_THyPhy *) 0 ;
+  void *arg2 = (void *) 0 ;
+  int arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int res2 ;
+  unsigned int r_nprotect = 0;
+  SEXP r_ans = R_NilValue ;
+  VMAXTYPE r_vmax = vmaxget() ;
+  
+  res1 = SWIG_R_ConvertPtr(self, &argp1, SWIGTYPE_p__THyPhy, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "_THyPhy_CastResult" "', argument " "1"" of type '" "_THyPhy *""'"); 
+  }
+  arg1 = reinterpret_cast< _THyPhy * >(argp1);
+  res2 = SWIG_R_ConvertPtr(s_arg2, SWIG_as_voidptrptr(&arg2), 0, 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "_THyPhy_CastResult" "', argument " "2"" of type '" "void const *""'"); 
+  }
+  arg3 = static_cast< int >(INTEGER(s_arg3)[0]);
+  result = (_THyPhyReturnObject *)(arg1)->CastResult((void const *)arg2,arg3);
+  r_ans = SWIG_R_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p__THyPhyReturnObject, R_SWIG_EXTERNAL |  0 );
+  
+  
+  
+  vmaxset(r_vmax);
+  if(r_nprotect)  Rf_unprotect(r_nprotect);
+  
+  return r_ans;
+}
+
+
+SWIGEXPORT SEXP
+R_swig__THyPhy_SetCallbackHandler ( SEXP self, SEXP s_arg2)
+{
+  _THyPhy *arg1 = (_THyPhy *) 0 ;
+  _ProgressCancelHandler *arg2 = (_ProgressCancelHandler *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  unsigned int r_nprotect = 0;
+  SEXP r_ans = R_NilValue ;
+  VMAXTYPE r_vmax = vmaxget() ;
+  
+  res1 = SWIG_R_ConvertPtr(self, &argp1, SWIGTYPE_p__THyPhy, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "_THyPhy_SetCallbackHandler" "', argument " "1"" of type '" "_THyPhy *""'"); 
+  }
+  arg1 = reinterpret_cast< _THyPhy * >(argp1);
+  {
+    int res = SWIG_R_ConvertPtr(s_arg2, (void**)(&arg2), SWIGTYPE_p_f_p_char_int_double__bool, 0);
+    if (!SWIG_IsOK(res)) {
+      SWIG_exception_fail(SWIG_ArgError(res), "in method '" "_THyPhy_SetCallbackHandler" "', argument " "2"" of type '" "_ProgressCancelHandler *""'"); 
+    }
+  }
+  (arg1)->SetCallbackHandler(arg2);
+  r_ans = R_NilValue;
+  
+  
+  vmaxset(r_vmax);
+  if(r_nprotect)  Rf_unprotect(r_nprotect);
+  
+  return r_ans;
+}
+
+
+SWIGEXPORT SEXP
+R_swig__THyPhy_GetCallbackHandler ( SEXP self)
+{
+  _ProgressCancelHandler *result = 0 ;
+  _THyPhy *arg1 = (_THyPhy *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  unsigned int r_nprotect = 0;
+  SEXP r_ans = R_NilValue ;
+  VMAXTYPE r_vmax = vmaxget() ;
+  
+  res1 = SWIG_R_ConvertPtr(self, &argp1, SWIGTYPE_p__THyPhy, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "_THyPhy_GetCallbackHandler" "', argument " "1"" of type '" "_THyPhy *""'"); 
+  }
+  arg1 = reinterpret_cast< _THyPhy * >(argp1);
+  result = (_ProgressCancelHandler *)(arg1)->GetCallbackHandler();
+  r_ans = SWIG_R_NewPointerObj((void *)(result), SWIGTYPE_p_f_p_char_int_double__bool, 0);
+  
+  vmaxset(r_vmax);
+  if(r_nprotect)  Rf_unprotect(r_nprotect);
+  
+  return r_ans;
+}
+
+
+SWIGEXPORT SEXP
+R_swig__THyPhy_GetWarnings ( SEXP self)
+{
+  _THyPhyString *result = 0 ;
+  _THyPhy *arg1 = (_THyPhy *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  unsigned int r_nprotect = 0;
+  SEXP r_ans = R_NilValue ;
+  VMAXTYPE r_vmax = vmaxget() ;
+  
+  res1 = SWIG_R_ConvertPtr(self, &argp1, SWIGTYPE_p__THyPhy, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "_THyPhy_GetWarnings" "', argument " "1"" of type '" "_THyPhy *""'"); 
+  }
+  arg1 = reinterpret_cast< _THyPhy * >(argp1);
+  result = (_THyPhyString *)(arg1)->GetWarnings();
+  r_ans = SWIG_R_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p__THyPhyString, R_SWIG_EXTERNAL |  0 );
+  
+  vmaxset(r_vmax);
+  if(r_nprotect)  Rf_unprotect(r_nprotect);
+  
+  return r_ans;
+}
+
+
+SWIGEXPORT SEXP
+R_swig__THyPhy_GetErrors ( SEXP self)
+{
+  _THyPhyString *result = 0 ;
+  _THyPhy *arg1 = (_THyPhy *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  unsigned int r_nprotect = 0;
+  SEXP r_ans = R_NilValue ;
+  VMAXTYPE r_vmax = vmaxget() ;
+  
+  res1 = SWIG_R_ConvertPtr(self, &argp1, SWIGTYPE_p__THyPhy, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "_THyPhy_GetErrors" "', argument " "1"" of type '" "_THyPhy *""'"); 
+  }
+  arg1 = reinterpret_cast< _THyPhy * >(argp1);
+  result = (_THyPhyString *)(arg1)->GetErrors();
+  r_ans = SWIG_R_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p__THyPhyString, R_SWIG_EXTERNAL |  0 );
+  
+  vmaxset(r_vmax);
+  if(r_nprotect)  Rf_unprotect(r_nprotect);
+  
+  return r_ans;
+}
+
+
+SWIGEXPORT SEXP
+R_swig__THyPhy_GetStdout ( SEXP self)
+{
+  _THyPhyString *result = 0 ;
+  _THyPhy *arg1 = (_THyPhy *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  unsigned int r_nprotect = 0;
+  SEXP r_ans = R_NilValue ;
+  VMAXTYPE r_vmax = vmaxget() ;
+  
+  res1 = SWIG_R_ConvertPtr(self, &argp1, SWIGTYPE_p__THyPhy, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "_THyPhy_GetStdout" "', argument " "1"" of type '" "_THyPhy *""'"); 
+  }
+  arg1 = reinterpret_cast< _THyPhy * >(argp1);
+  result = (_THyPhyString *)(arg1)->GetStdout();
+  r_ans = SWIG_R_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p__THyPhyString, R_SWIG_EXTERNAL |  0 );
+  
+  vmaxset(r_vmax);
+  if(r_nprotect)  Rf_unprotect(r_nprotect);
+  
+  return r_ans;
+}
+
+
+SWIGEXPORT SEXP
+R_swig__THyPhy_PushWarning ( SEXP self, SEXP s_arg2)
+{
+  _THyPhy *arg1 = (_THyPhy *) 0 ;
+  void *arg2 = (void *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int res2 ;
+  unsigned int r_nprotect = 0;
+  SEXP r_ans = R_NilValue ;
+  VMAXTYPE r_vmax = vmaxget() ;
+  
+  res1 = SWIG_R_ConvertPtr(self, &argp1, SWIGTYPE_p__THyPhy, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "_THyPhy_PushWarning" "', argument " "1"" of type '" "_THyPhy *""'"); 
+  }
+  arg1 = reinterpret_cast< _THyPhy * >(argp1);
+  res2 = SWIG_R_ConvertPtr(s_arg2, SWIG_as_voidptrptr(&arg2), 0, 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "_THyPhy_PushWarning" "', argument " "2"" of type '" "void *""'"); 
+  }
+  (arg1)->PushWarning(arg2);
+  r_ans = R_NilValue;
+  
+  
+  vmaxset(r_vmax);
+  if(r_nprotect)  Rf_unprotect(r_nprotect);
+  
+  return r_ans;
+}
+
+
+SWIGEXPORT SEXP
+R_swig__THyPhy_PushError ( SEXP self, SEXP s_arg2)
+{
+  _THyPhy *arg1 = (_THyPhy *) 0 ;
+  void *arg2 = (void *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int res2 ;
+  unsigned int r_nprotect = 0;
+  SEXP r_ans = R_NilValue ;
+  VMAXTYPE r_vmax = vmaxget() ;
+  
+  res1 = SWIG_R_ConvertPtr(self, &argp1, SWIGTYPE_p__THyPhy, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "_THyPhy_PushError" "', argument " "1"" of type '" "_THyPhy *""'"); 
+  }
+  arg1 = reinterpret_cast< _THyPhy * >(argp1);
+  res2 = SWIG_R_ConvertPtr(s_arg2, SWIG_as_voidptrptr(&arg2), 0, 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "_THyPhy_PushError" "', argument " "2"" of type '" "void *""'"); 
+  }
+  (arg1)->PushError(arg2);
+  r_ans = R_NilValue;
+  
+  
+  vmaxset(r_vmax);
+  if(r_nprotect)  Rf_unprotect(r_nprotect);
+  
+  return r_ans;
+}
+
+
+SWIGEXPORT SEXP
+R_swig__THyPhy_PushOutString ( SEXP self, SEXP s_arg2)
+{
+  _THyPhy *arg1 = (_THyPhy *) 0 ;
+  void *arg2 = (void *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int res2 ;
+  unsigned int r_nprotect = 0;
+  SEXP r_ans = R_NilValue ;
+  VMAXTYPE r_vmax = vmaxget() ;
+  
+  res1 = SWIG_R_ConvertPtr(self, &argp1, SWIGTYPE_p__THyPhy, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "_THyPhy_PushOutString" "', argument " "1"" of type '" "_THyPhy *""'"); 
+  }
+  arg1 = reinterpret_cast< _THyPhy * >(argp1);
+  res2 = SWIG_R_ConvertPtr(s_arg2, SWIG_as_voidptrptr(&arg2), 0, 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "_THyPhy_PushOutString" "', argument " "2"" of type '" "void *""'"); 
+  }
+  (arg1)->PushOutString(arg2);
+  r_ans = R_NilValue;
+  
+  
+  vmaxset(r_vmax);
+  if(r_nprotect)  Rf_unprotect(r_nprotect);
+  
+  return r_ans;
+}
+
+
+SWIGEXPORT SEXP
+R_swig__THyPhyGetLongStatus ( SEXP s_swig_copy)
+{
+  long result;
+  unsigned int r_nprotect = 0;
+  SEXP r_ans = R_NilValue ;
+  VMAXTYPE r_vmax = vmaxget() ;
+  
+  result = (long)_THyPhyGetLongStatus();
+  r_ans = Rf_ScalarInteger(result);
+  vmaxset(r_vmax);
+  if(r_nprotect)  Rf_unprotect(r_nprotect);
+  
+  return r_ans;
+}
+
+
+SWIGEXPORT SEXP
+R_swig__THyPhyGetStringStatus ( )
+{
+  char *result = 0 ;
+  unsigned int r_nprotect = 0;
+  SEXP r_ans = R_NilValue ;
+  VMAXTYPE r_vmax = vmaxget() ;
+  
+  result = (char *)_THyPhyGetStringStatus();
+  r_ans = result ? Rf_mkString(reinterpret_cast< char * >(result)) : R_NilValue;
+  vmaxset(r_vmax);
+  if(r_nprotect)  Rf_unprotect(r_nprotect);
+  
+  return r_ans;
+}
+
+
+SWIGEXPORT SEXP
+R_swig__THyPhyGetDoubleStatus ( SEXP s_swig_copy)
+{
+  double result;
+  unsigned int r_nprotect = 0;
+  SEXP r_ans = R_NilValue ;
+  VMAXTYPE r_vmax = vmaxget() ;
+  
+  result = (double)_THyPhyGetDoubleStatus();
+  r_ans = SWIG_From_double(static_cast< double >(result));
+  vmaxset(r_vmax);
+  if(r_nprotect)  Rf_unprotect(r_nprotect);
+  
+  return r_ans;
+}
+
+
+SWIGEXPORT SEXP
+R_swig_globalInterfaceInstance_set ( SEXP s_globalInterfaceInstance)
+{
+  _THyPhy *arg1 = (_THyPhy *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  unsigned int r_nprotect = 0;
+  SEXP r_ans = R_NilValue ;
+  VMAXTYPE r_vmax = vmaxget() ;
+  
+  res1 = SWIG_R_ConvertPtr(s_globalInterfaceInstance, &argp1, SWIGTYPE_p__THyPhy, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "globalInterfaceInstance_set" "', argument " "1"" of type '" "_THyPhy *""'"); 
+  }
+  arg1 = reinterpret_cast< _THyPhy * >(argp1);
+  globalInterfaceInstance = arg1;
+  r_ans = R_NilValue;
+  
+  vmaxset(r_vmax);
+  if(r_nprotect)  Rf_unprotect(r_nprotect);
+  
+  return r_ans;
+}
+
+
+SWIGEXPORT SEXP
+R_swig_globalInterfaceInstance_get ( )
+{
+  _THyPhy *result = 0 ;
+  unsigned int r_nprotect = 0;
+  SEXP r_ans = R_NilValue ;
+  VMAXTYPE r_vmax = vmaxget() ;
+  
+  result = (_THyPhy *)globalInterfaceInstance;
+  r_ans = SWIG_R_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p__THyPhy, R_SWIG_EXTERNAL |  0 );
+  vmaxset(r_vmax);
+  if(r_nprotect)  Rf_unprotect(r_nprotect);
+  
+  return r_ans;
+}
+
+
+#ifdef __cplusplus
+}
+#endif
+
+/* -------- TYPE CONVERSION AND EQUIVALENCE RULES (BEGIN) -------- */
+
+static void *_p__THyPhyNumberTo_p__THyPhyReturnObject(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((_THyPhyReturnObject *)  ((_THyPhyNumber *) x));
+}
+static void *_p__THyPhyMatrixTo_p__THyPhyReturnObject(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((_THyPhyReturnObject *)  ((_THyPhyMatrix *) x));
+}
+static void *_p__THyPhyStringTo_p__THyPhyReturnObject(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((_THyPhyReturnObject *)  ((_THyPhyString *) x));
+}
+static swig_type_info _swigt__p__THyPhy = {"_p__THyPhy", "_THyPhy *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p__THyPhyMatrix = {"_p__THyPhyMatrix", "_THyPhyMatrix *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p__THyPhyNumber = {"_p__THyPhyNumber", "_THyPhyNumber *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p__THyPhyReturnObject = {"_p__THyPhyReturnObject", "_THyPhyReturnObject *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p__THyPhyString = {"_p__THyPhyString", "_THyPhyString *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_char = {"_p_char", "char *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_double = {"_p_double", "double *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_f_p_char_int_double__bool = {"_p_f_p_char_int_double__bool", "_ProgressCancelHandler *|bool (*)(char *,int,double)", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_void = {"_p_void", "void *", 0, 0, (void*)0, 0};
+
+static swig_type_info *swig_type_initial[] = {
+  &_swigt__p__THyPhy,
+  &_swigt__p__THyPhyMatrix,
+  &_swigt__p__THyPhyNumber,
+  &_swigt__p__THyPhyReturnObject,
+  &_swigt__p__THyPhyString,
+  &_swigt__p_char,
+  &_swigt__p_double,
+  &_swigt__p_f_p_char_int_double__bool,
+  &_swigt__p_void,
+};
+
+static swig_cast_info _swigc__p__THyPhy[] = {  {&_swigt__p__THyPhy, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p__THyPhyMatrix[] = {  {&_swigt__p__THyPhyMatrix, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p__THyPhyNumber[] = {  {&_swigt__p__THyPhyNumber, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p__THyPhyReturnObject[] = {  {&_swigt__p__THyPhyReturnObject, 0, 0, 0},  {&_swigt__p__THyPhyNumber, _p__THyPhyNumberTo_p__THyPhyReturnObject, 0, 0},  {&_swigt__p__THyPhyMatrix, _p__THyPhyMatrixTo_p__THyPhyReturnObject, 0, 0},  {&_swigt__p__THyPhyString, _p__THyPhyStringTo_p__THyPhyReturnObject, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p__THyPhyString[] = {  {&_swigt__p__THyPhyString, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_char[] = {  {&_swigt__p_char, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_double[] = {  {&_swigt__p_double, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_f_p_char_int_double__bool[] = {  {&_swigt__p_f_p_char_int_double__bool, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_void[] = {  {&_swigt__p_void, 0, 0, 0},{0, 0, 0, 0}};
+
+static swig_cast_info *swig_cast_initial[] = {
+  _swigc__p__THyPhy,
+  _swigc__p__THyPhyMatrix,
+  _swigc__p__THyPhyNumber,
+  _swigc__p__THyPhyReturnObject,
+  _swigc__p__THyPhyString,
+  _swigc__p_char,
+  _swigc__p_double,
+  _swigc__p_f_p_char_int_double__bool,
+  _swigc__p_void,
+};
+
+
+/* -------- TYPE CONVERSION AND EQUIVALENCE RULES (END) -------- */
+
+
+/* -----------------------------------------------------------------------------
+ * Type initialization:
+ * This problem is tough by the requirement that no dynamic 
+ * memory is used. Also, since swig_type_info structures store pointers to 
+ * swig_cast_info structures and swig_cast_info structures store pointers back
+ * to swig_type_info structures, we need some lookup code at initialization. 
+ * The idea is that swig generates all the structures that are needed. 
+ * The runtime then collects these partially filled structures. 
+ * The SWIG_InitializeModule function takes these initial arrays out of 
+ * swig_module, and does all the lookup, filling in the swig_module.types
+ * array with the correct data and linking the correct swig_cast_info
+ * structures together.
+ *
+ * The generated swig_type_info structures are assigned staticly to an initial 
+ * array. We just loop through that array, and handle each type individually.
+ * First we lookup if this type has been already loaded, and if so, use the
+ * loaded structure instead of the generated one. Then we have to fill in the
+ * cast linked list. The cast data is initially stored in something like a
+ * two-dimensional array. Each row corresponds to a type (there are the same
+ * number of rows as there are in the swig_type_initial array). Each entry in
+ * a column is one of the swig_cast_info structures for that type.
+ * The cast_initial array is actually an array of arrays, because each row has
+ * a variable number of columns. So to actually build the cast linked list,
+ * we find the array of casts associated with the type, and loop through it 
+ * adding the casts to the list. The one last trick we need to do is making
+ * sure the type pointer in the swig_cast_info struct is correct.
+ *
+ * First off, we lookup the cast->type name to see if it is already loaded. 
+ * There are three cases to handle:
+ *  1) If the cast->type has already been loaded AND the type we are adding
+ *     casting info to has not been loaded (it is in this module), THEN we
+ *     replace the cast->type pointer with the type pointer that has already
+ *     been loaded.
+ *  2) If BOTH types (the one we are adding casting info to, and the 
+ *     cast->type) are loaded, THEN the cast info has already been loaded by
+ *     the previous module so we just ignore it.
+ *  3) Finally, if cast->type has not already been loaded, then we add that
+ *     swig_cast_info to the linked list (because the cast->type) pointer will
+ *     be correct.
+ * ----------------------------------------------------------------------------- */
+
+#ifdef __cplusplus
+extern "C" {
+#if 0
+} /* c-mode */
+#endif
+#endif
+
+#if 0
+#define SWIGRUNTIME_DEBUG
+#endif
+
+
+SWIGRUNTIME void
+SWIG_InitializeModule(void *clientdata) {
+  size_t i;
+  swig_module_info *module_head, *iter;
+  int found, init;
+
+  clientdata = clientdata;
+
+  /* check to see if the circular list has been setup, if not, set it up */
+  if (swig_module.next==0) {
+    /* Initialize the swig_module */
+    swig_module.type_initial = swig_type_initial;
+    swig_module.cast_initial = swig_cast_initial;
+    swig_module.next = &swig_module;
+    init = 1;
+  } else {
+    init = 0;
+  }
+
+  /* Try and load any already created modules */
+  module_head = SWIG_GetModule(clientdata);
+  if (!module_head) {
+    /* This is the first module loaded for this interpreter */
+    /* so set the swig module into the interpreter */
+    SWIG_SetModule(clientdata, &swig_module);
+    module_head = &swig_module;
+  } else {
+    /* the interpreter has loaded a SWIG module, but has it loaded this one? */
+    found=0;
+    iter=module_head;
+    do {
+      if (iter==&swig_module) {
+        found=1;
+        break;
+      }
+      iter=iter->next;
+    } while (iter!= module_head);
+
+    /* if the is found in the list, then all is done and we may leave */
+    if (found) return;
+    /* otherwise we must add out module into the list */
+    swig_module.next = module_head->next;
+    module_head->next = &swig_module;
+  }
+
+  /* When multiple interpeters are used, a module could have already been initialized in
+     a different interpreter, but not yet have a pointer in this interpreter.
+     In this case, we do not want to continue adding types... everything should be
+     set up already */
+  if (init == 0) return;
+
+  /* Now work on filling in swig_module.types */
+#ifdef SWIGRUNTIME_DEBUG
+  printf("SWIG_InitializeModule: size %d\n", swig_module.size);
+#endif
+  for (i = 0; i < swig_module.size; ++i) {
+    swig_type_info *type = 0;
+    swig_type_info *ret;
+    swig_cast_info *cast;
+  
+#ifdef SWIGRUNTIME_DEBUG
+    printf("SWIG_InitializeModule: type %d %s\n", i, swig_module.type_initial[i]->name);
+#endif
+
+    /* if there is another module already loaded */
+    if (swig_module.next != &swig_module) {
+      type = SWIG_MangledTypeQueryModule(swig_module.next, &swig_module, swig_module.type_initial[i]->name);
+    }
+    if (type) {
+      /* Overwrite clientdata field */
+#ifdef SWIGRUNTIME_DEBUG
+      printf("SWIG_InitializeModule: found type %s\n", type->name);
+#endif
+      if (swig_module.type_initial[i]->clientdata) {
+	type->clientdata = swig_module.type_initial[i]->clientdata;
+#ifdef SWIGRUNTIME_DEBUG
+      printf("SWIG_InitializeModule: found and overwrite type %s \n", type->name);
+#endif
+      }
+    } else {
+      type = swig_module.type_initial[i];
+    }
+
+    /* Insert casting types */
+    cast = swig_module.cast_initial[i];
+    while (cast->type) {
+    
+      /* Don't need to add information already in the list */
+      ret = 0;
+#ifdef SWIGRUNTIME_DEBUG
+      printf("SWIG_InitializeModule: look cast %s\n", cast->type->name);
+#endif
+      if (swig_module.next != &swig_module) {
+        ret = SWIG_MangledTypeQueryModule(swig_module.next, &swig_module, cast->type->name);
+#ifdef SWIGRUNTIME_DEBUG
+	if (ret) printf("SWIG_InitializeModule: found cast %s\n", ret->name);
+#endif
+      }
+      if (ret) {
+	if (type == swig_module.type_initial[i]) {
+#ifdef SWIGRUNTIME_DEBUG
+	  printf("SWIG_InitializeModule: skip old type %s\n", ret->name);
+#endif
+	  cast->type = ret;
+	  ret = 0;
+	} else {
+	  /* Check for casting already in the list */
+	  swig_cast_info *ocast = SWIG_TypeCheck(ret->name, type);
+#ifdef SWIGRUNTIME_DEBUG
+	  if (ocast) printf("SWIG_InitializeModule: skip old cast %s\n", ret->name);
+#endif
+	  if (!ocast) ret = 0;
+	}
+      }
+
+      if (!ret) {
+#ifdef SWIGRUNTIME_DEBUG
+	printf("SWIG_InitializeModule: adding cast %s\n", cast->type->name);
+#endif
+        if (type->cast) {
+          type->cast->prev = cast;
+          cast->next = type->cast;
+        }
+        type->cast = cast;
+      }
+      cast++;
+    }
+    /* Set entry in modules->types array equal to the type */
+    swig_module.types[i] = type;
+  }
+  swig_module.types[i] = 0;
+
+#ifdef SWIGRUNTIME_DEBUG
+  printf("**** SWIG_InitializeModule: Cast List ******\n");
+  for (i = 0; i < swig_module.size; ++i) {
+    int j = 0;
+    swig_cast_info *cast = swig_module.cast_initial[i];
+    printf("SWIG_InitializeModule: type %d %s\n", i, swig_module.type_initial[i]->name);
+    while (cast->type) {
+      printf("SWIG_InitializeModule: cast type %s\n", cast->type->name);
+      cast++;
+      ++j;
+    }
+  printf("---- Total casts: %d\n",j);
+  }
+  printf("**** SWIG_InitializeModule: Cast List ******\n");
+#endif
+}
+
+/* This function will propagate the clientdata field of type to
+* any new swig_type_info structures that have been added into the list
+* of equivalent types.  It is like calling
+* SWIG_TypeClientData(type, clientdata) a second time.
+*/
+SWIGRUNTIME void
+SWIG_PropagateClientData(void) {
+  size_t i;
+  swig_cast_info *equiv;
+  static int init_run = 0;
+
+  if (init_run) return;
+  init_run = 1;
+
+  for (i = 0; i < swig_module.size; i++) {
+    if (swig_module.types[i]->clientdata) {
+      equiv = swig_module.types[i]->cast;
+      while (equiv) {
+        if (!equiv->converter) {
+          if (equiv->type && !equiv->type->clientdata)
+            SWIG_TypeClientData(equiv->type, swig_module.types[i]->clientdata);
+        }
+        equiv = equiv->next;
+      }
+    }
+  }
+}
+
+#ifdef __cplusplus
+#if 0
+{ /* c-mode */
+#endif
+}
+#endif
+
+
+SWIGEXPORT void SWIG_init(void) {
+
+}
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <R_ext/Rdynload.h>
+
+#ifdef __cplusplus
+}
+#endif
+
+SWIGINTERN R_CallMethodDef CallEntries[] = {
+   {"R_swig_new__THyPhy__SWIG_1", (DL_FUNC) &R_swig_new__THyPhy__SWIG_1, 2},
+   {"R_swig_new__THyPhyMatrix__SWIG_1", (DL_FUNC) &R_swig_new__THyPhyMatrix__SWIG_1, 3},
+   {"R_swig_new__THyPhyNumber__SWIG_1", (DL_FUNC) &R_swig_new__THyPhyNumber__SWIG_1, 0},
+   {"R_swig_new__THyPhyString__SWIG_1", (DL_FUNC) &R_swig_new__THyPhyString__SWIG_1, 1},
+   {"R_swig__THyPhy_ExecuteBF__SWIG_1", (DL_FUNC) &R_swig__THyPhy_ExecuteBF__SWIG_1, 2},
+   {"R_swig__THyPhyGetLongStatus", (DL_FUNC) &R_swig__THyPhyGetLongStatus, 1},
+   {"R_swig__THyPhyGetStringStatus", (DL_FUNC) &R_swig__THyPhyGetStringStatus, 0},
+   {"R_swig__THyPhyGetDoubleStatus", (DL_FUNC) &R_swig__THyPhyGetDoubleStatus, 1},
+   {"R_swig_delete__THyPhyMatrix", (DL_FUNC) &R_swig_delete__THyPhyMatrix, 1},
+   {"R_swig__THyPhyReturnObject_castToMatrix", (DL_FUNC) &R_swig__THyPhyReturnObject_castToMatrix, 1},
+   {"R_swig_new__THyPhy__SWIG_2", (DL_FUNC) &R_swig_new__THyPhy__SWIG_2, 2},
+   {"R_swig_new__THyPhyString__SWIG_2", (DL_FUNC) &R_swig_new__THyPhyString__SWIG_2, 0},
+   {"R_swig_new__THyPhy__SWIG_3", (DL_FUNC) &R_swig_new__THyPhy__SWIG_3, 1},
+   {"R_swig__THyPhyMatrix_mRows_get", (DL_FUNC) &R_swig__THyPhyMatrix_mRows_get, 2},
+   {"R_swig_globalInterfaceInstance_get", (DL_FUNC) &R_swig_globalInterfaceInstance_get, 0},
+   {"R_swig__THyPhyMatrix_mCols_get", (DL_FUNC) &R_swig__THyPhyMatrix_mCols_get, 2},
+   {"R_swig__THyPhy_GetStdout", (DL_FUNC) &R_swig__THyPhy_GetStdout, 1},
+   {"R_swig__THyPhyMatrix_mRows_set", (DL_FUNC) &R_swig__THyPhyMatrix_mRows_set, 2},
+   {"R_swig_globalInterfaceInstance_set", (DL_FUNC) &R_swig_globalInterfaceInstance_set, 1},
+   {"R_swig__THyPhyMatrix_mCols_set", (DL_FUNC) &R_swig__THyPhyMatrix_mCols_set, 2},
+   {"R_swig__THyPhy_AskFor", (DL_FUNC) &R_swig__THyPhy_AskFor, 2},
+   {"R_swig__THyPhyMatrix_MatrixCell", (DL_FUNC) &R_swig__THyPhyMatrix_MatrixCell, 4},
+   {"R_swig_delete__THyPhyReturnObject", (DL_FUNC) &R_swig_delete__THyPhyReturnObject, 1},
+   {"R_swig__THyPhy_CanCast", (DL_FUNC) &R_swig__THyPhy_CanCast, 4},
+   {"R_swig__THyPhyMatrix_mData_get", (DL_FUNC) &R_swig__THyPhyMatrix_mData_get, 1},
+   {"R_swig__THyPhyString_sData_get", (DL_FUNC) &R_swig__THyPhyString_sData_get, 1},
+   {"R_swig__THyPhy_PushWarning", (DL_FUNC) &R_swig__THyPhy_PushWarning, 2},
+   {"R_swig__THyPhy_PushOutString", (DL_FUNC) &R_swig__THyPhy_PushOutString, 2},
+   {"R_swig__THyPhyMatrix_myType", (DL_FUNC) &R_swig__THyPhyMatrix_myType, 2},
+   {"R_swig__THyPhyNumber_myType", (DL_FUNC) &R_swig__THyPhyNumber_myType, 2},
+   {"R_swig__THyPhyReturnObject_myType", (DL_FUNC) &R_swig__THyPhyReturnObject_myType, 2},
+   {"R_swig__THyPhyString_myType", (DL_FUNC) &R_swig__THyPhyString_myType, 2},
+   {"R_swig__THyPhy_InitTHyPhy", (DL_FUNC) &R_swig__THyPhy_InitTHyPhy, 4},
+   {"R_swig__THyPhy_SetCallbackHandler", (DL_FUNC) &R_swig__THyPhy_SetCallbackHandler, 2},
+   {"R_swig__THyPhy_GetCallbackHandler", (DL_FUNC) &R_swig__THyPhy_GetCallbackHandler, 1},
+   {"R_swig__THyPhyMatrix_mData_set", (DL_FUNC) &R_swig__THyPhyMatrix_mData_set, 2},
+   {"R_swig__THyPhyString_sData_set", (DL_FUNC) &R_swig__THyPhyString_sData_set, 2},
+   {"R_swig_delete__THyPhyNumber", (DL_FUNC) &R_swig_delete__THyPhyNumber, 1},
+   {"R_swig__THyPhyReturnObject_castToNumber", (DL_FUNC) &R_swig__THyPhyReturnObject_castToNumber, 1},
+   {"R_swig__THyPhy_ClearAll", (DL_FUNC) &R_swig__THyPhy_ClearAll, 1},
+   {"R_swig__THyPhy_GetWarnings", (DL_FUNC) &R_swig__THyPhy_GetWarnings, 1},
+   {"R_swig__THyPhyString_sLength_get", (DL_FUNC) &R_swig__THyPhyString_sLength_get, 2},
+   {"R_swig__THyPhyReturnObject_castToString", (DL_FUNC) &R_swig__THyPhyReturnObject_castToString, 1},
+   {"R_swig_delete__THyPhyString", (DL_FUNC) &R_swig_delete__THyPhyString, 1},
+   {"R_swig__THyPhyString_sLength_set", (DL_FUNC) &R_swig__THyPhyString_sLength_set, 2},
+   {"R_swig_delete__THyPhy", (DL_FUNC) &R_swig_delete__THyPhy, 1},
+   {"R_swig__THyPhy_PushError", (DL_FUNC) &R_swig__THyPhy_PushError, 2},
+   {"R_swig__THyPhyNumber_nValue_get", (DL_FUNC) &R_swig__THyPhyNumber_nValue_get, 2},
+   {"R_swig__THyPhy_DumpResult", (DL_FUNC) &R_swig__THyPhy_DumpResult, 2},
+   {"R_swig__THyPhy_CastResult", (DL_FUNC) &R_swig__THyPhy_CastResult, 3},
+   {"R_swig__THyPhy_GetErrors", (DL_FUNC) &R_swig__THyPhy_GetErrors, 1},
+   {"R_swig_new__THyPhy__SWIG_0", (DL_FUNC) &R_swig_new__THyPhy__SWIG_0, 3},
+   {"R_swig_new__THyPhyMatrix__SWIG_0", (DL_FUNC) &R_swig_new__THyPhyMatrix__SWIG_0, 0},
+   {"R_swig_new__THyPhyNumber__SWIG_0", (DL_FUNC) &R_swig_new__THyPhyNumber__SWIG_0, 1},
+   {"R_swig_new__THyPhyString__SWIG_0", (DL_FUNC) &R_swig_new__THyPhyString__SWIG_0, 2},
+   {"R_swig__THyPhyNumber_nValue_set", (DL_FUNC) &R_swig__THyPhyNumber_nValue_set, 2},
+   {"R_swig__THyPhy_ExecuteBF__SWIG_0", (DL_FUNC) &R_swig__THyPhy_ExecuteBF__SWIG_0, 3},
+   {NULL, NULL, 0}
+};
+
+extern "C" SWIGEXPORT void R_init_HyPhy(DllInfo *dll) {
+    R_registerRoutines(dll, NULL, CallEntries, NULL, NULL);
+
+
+SWIG_init();
+SWIG_InitializeModule(0);
+
+
+}
+
diff --git a/src/lib/SWIGWrappers/THyPhy_py3.cpp b/src/lib/SWIGWrappers/THyPhy_py3.cpp
new file mode 100644
index 0000000..1d2120a
--- /dev/null
+++ b/src/lib/SWIGWrappers/THyPhy_py3.cpp
@@ -0,0 +1,7440 @@
+/* ----------------------------------------------------------------------------
+ * This file was automatically generated by SWIG (http://www.swig.org).
+ * Version 2.0.4
+ * 
+ * This file is not intended to be easily readable and contains a number of 
+ * coding conventions designed to improve portability and efficiency. Do not make
+ * changes to this file unless you know what you are doing--modify the SWIG 
+ * interface file instead. 
+ * ----------------------------------------------------------------------------- */
+
+#define SWIGPYTHON
+#define SWIG_PYTHON_DIRECTOR_NO_VTABLE
+#define SWIGPYTHON_BUILTIN
+
+
+#ifdef __cplusplus
+/* SwigValueWrapper is described in swig.swg */
+template<typename T> class SwigValueWrapper {
+  struct SwigMovePointer {
+    T *ptr;
+    SwigMovePointer(T *p) : ptr(p) { }
+    ~SwigMovePointer() { delete ptr; }
+    SwigMovePointer& operator=(SwigMovePointer& rhs) { T* oldptr = ptr; ptr = 0; delete oldptr; ptr = rhs.ptr; rhs.ptr = 0; return *this; }
+  } pointer;
+  SwigValueWrapper& operator=(const SwigValueWrapper<T>& rhs);
+  SwigValueWrapper(const SwigValueWrapper<T>& rhs);
+public:
+  SwigValueWrapper() : pointer(0) { }
+  SwigValueWrapper& operator=(const T& t) { SwigMovePointer tmp(new T(t)); pointer = tmp; return *this; }
+  operator T&() const { return *pointer.ptr; }
+  T *operator&() { return pointer.ptr; }
+};
+
+template <typename T> T SwigValueInit() {
+  return T();
+}
+#endif
+
+/* -----------------------------------------------------------------------------
+ *  This section contains generic SWIG labels for method/variable
+ *  declarations/attributes, and other compiler dependent labels.
+ * ----------------------------------------------------------------------------- */
+
+/* template workaround for compilers that cannot correctly implement the C++ standard */
+#ifndef SWIGTEMPLATEDISAMBIGUATOR
+# if defined(__SUNPRO_CC) && (__SUNPRO_CC <= 0x560)
+#  define SWIGTEMPLATEDISAMBIGUATOR template
+# elif defined(__HP_aCC)
+/* Needed even with `aCC -AA' when `aCC -V' reports HP ANSI C++ B3910B A.03.55 */
+/* If we find a maximum version that requires this, the test would be __HP_aCC <= 35500 for A.03.55 */
+#  define SWIGTEMPLATEDISAMBIGUATOR template
+# else
+#  define SWIGTEMPLATEDISAMBIGUATOR
+# endif
+#endif
+
+/* inline attribute */
+#ifndef SWIGINLINE
+# if defined(__cplusplus) || (defined(__GNUC__) && !defined(__STRICT_ANSI__))
+#   define SWIGINLINE inline
+# else
+#   define SWIGINLINE
+# endif
+#endif
+
+/* attribute recognised by some compilers to avoid 'unused' warnings */
+#ifndef SWIGUNUSED
+# if defined(__GNUC__)
+#   if !(defined(__cplusplus)) || (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4))
+#     define SWIGUNUSED __attribute__ ((__unused__)) 
+#   else
+#     define SWIGUNUSED
+#   endif
+# elif defined(__ICC)
+#   define SWIGUNUSED __attribute__ ((__unused__)) 
+# else
+#   define SWIGUNUSED 
+# endif
+#endif
+
+#ifndef SWIG_MSC_UNSUPPRESS_4505
+# if defined(_MSC_VER)
+#   pragma warning(disable : 4505) /* unreferenced local function has been removed */
+# endif 
+#endif
+
+#ifndef SWIGUNUSEDPARM
+# ifdef __cplusplus
+#   define SWIGUNUSEDPARM(p)
+# else
+#   define SWIGUNUSEDPARM(p) p SWIGUNUSED 
+# endif
+#endif
+
+/* internal SWIG method */
+#ifndef SWIGINTERN
+# define SWIGINTERN static SWIGUNUSED
+#endif
+
+/* internal inline SWIG method */
+#ifndef SWIGINTERNINLINE
+# define SWIGINTERNINLINE SWIGINTERN SWIGINLINE
+#endif
+
+/* exporting methods */
+#if (__GNUC__ >= 4) || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)
+#  ifndef GCC_HASCLASSVISIBILITY
+#    define GCC_HASCLASSVISIBILITY
+#  endif
+#endif
+
+#ifndef SWIGEXPORT
+# if defined(_WIN32) || defined(__WIN32__) || defined(__CYGWIN__)
+#   if defined(STATIC_LINKED)
+#     define SWIGEXPORT
+#   else
+#     define SWIGEXPORT __declspec(dllexport)
+#   endif
+# else
+#   if defined(__GNUC__) && defined(GCC_HASCLASSVISIBILITY)
+#     define SWIGEXPORT __attribute__ ((visibility("default")))
+#   else
+#     define SWIGEXPORT
+#   endif
+# endif
+#endif
+
+/* calling conventions for Windows */
+#ifndef SWIGSTDCALL
+# if defined(_WIN32) || defined(__WIN32__) || defined(__CYGWIN__)
+#   define SWIGSTDCALL __stdcall
+# else
+#   define SWIGSTDCALL
+# endif 
+#endif
+
+/* Deal with Microsoft's attempt at deprecating C standard runtime functions */
+#if !defined(SWIG_NO_CRT_SECURE_NO_DEPRECATE) && defined(_MSC_VER) && !defined(_CRT_SECURE_NO_DEPRECATE)
+# define _CRT_SECURE_NO_DEPRECATE
+#endif
+
+/* Deal with Microsoft's attempt at deprecating methods in the standard C++ library */
+#if !defined(SWIG_NO_SCL_SECURE_NO_DEPRECATE) && defined(_MSC_VER) && !defined(_SCL_SECURE_NO_DEPRECATE)
+# define _SCL_SECURE_NO_DEPRECATE
+#endif
+
+
+
+/* Python.h has to appear first */
+#include <Python.h>
+
+/* -----------------------------------------------------------------------------
+ * swigrun.swg
+ *
+ * This file contains generic C API SWIG runtime support for pointer
+ * type checking.
+ * ----------------------------------------------------------------------------- */
+
+/* This should only be incremented when either the layout of swig_type_info changes,
+   or for whatever reason, the runtime changes incompatibly */
+#define SWIG_RUNTIME_VERSION "4"
+
+/* define SWIG_TYPE_TABLE_NAME as "SWIG_TYPE_TABLE" */
+#ifdef SWIG_TYPE_TABLE
+# define SWIG_QUOTE_STRING(x) #x
+# define SWIG_EXPAND_AND_QUOTE_STRING(x) SWIG_QUOTE_STRING(x)
+# define SWIG_TYPE_TABLE_NAME SWIG_EXPAND_AND_QUOTE_STRING(SWIG_TYPE_TABLE)
+#else
+# define SWIG_TYPE_TABLE_NAME
+#endif
+
+/*
+  You can use the SWIGRUNTIME and SWIGRUNTIMEINLINE macros for
+  creating a static or dynamic library from the SWIG runtime code.
+  In 99.9% of the cases, SWIG just needs to declare them as 'static'.
+  
+  But only do this if strictly necessary, ie, if you have problems
+  with your compiler or suchlike.
+*/
+
+#ifndef SWIGRUNTIME
+# define SWIGRUNTIME SWIGINTERN
+#endif
+
+#ifndef SWIGRUNTIMEINLINE
+# define SWIGRUNTIMEINLINE SWIGRUNTIME SWIGINLINE
+#endif
+
+/*  Generic buffer size */
+#ifndef SWIG_BUFFER_SIZE
+# define SWIG_BUFFER_SIZE 1024
+#endif
+
+/* Flags for pointer conversions */
+#define SWIG_POINTER_DISOWN        0x1
+#define SWIG_CAST_NEW_MEMORY       0x2
+
+/* Flags for new pointer objects */
+#define SWIG_POINTER_OWN           0x1
+
+
+/* 
+   Flags/methods for returning states.
+   
+   The SWIG conversion methods, as ConvertPtr, return an integer 
+   that tells if the conversion was successful or not. And if not,
+   an error code can be returned (see swigerrors.swg for the codes).
+   
+   Use the following macros/flags to set or process the returning
+   states.
+   
+   In old versions of SWIG, code such as the following was usually written:
+
+     if (SWIG_ConvertPtr(obj,vptr,ty.flags) != -1) {
+       // success code
+     } else {
+       //fail code
+     }
+
+   Now you can be more explicit:
+
+    int res = SWIG_ConvertPtr(obj,vptr,ty.flags);
+    if (SWIG_IsOK(res)) {
+      // success code
+    } else {
+      // fail code
+    }
+
+   which is the same really, but now you can also do
+
+    Type *ptr;
+    int res = SWIG_ConvertPtr(obj,(void **)(&ptr),ty.flags);
+    if (SWIG_IsOK(res)) {
+      // success code
+      if (SWIG_IsNewObj(res) {
+        ...
+	delete *ptr;
+      } else {
+        ...
+      }
+    } else {
+      // fail code
+    }
+    
+   I.e., now SWIG_ConvertPtr can return new objects and you can
+   identify the case and take care of the deallocation. Of course that
+   also requires SWIG_ConvertPtr to return new result values, such as
+
+      int SWIG_ConvertPtr(obj, ptr,...) {         
+        if (<obj is ok>) {			       
+          if (<need new object>) {		       
+            *ptr = <ptr to new allocated object>; 
+            return SWIG_NEWOBJ;		       
+          } else {				       
+            *ptr = <ptr to old object>;	       
+            return SWIG_OLDOBJ;		       
+          } 				       
+        } else {				       
+          return SWIG_BADOBJ;		       
+        }					       
+      }
+
+   Of course, returning the plain '0(success)/-1(fail)' still works, but you can be
+   more explicit by returning SWIG_BADOBJ, SWIG_ERROR or any of the
+   SWIG errors code.
+
+   Finally, if the SWIG_CASTRANK_MODE is enabled, the result code
+   allows to return the 'cast rank', for example, if you have this
+
+       int food(double)
+       int fooi(int);
+
+   and you call
+ 
+      food(1)   // cast rank '1'  (1 -> 1.0)
+      fooi(1)   // cast rank '0'
+
+   just use the SWIG_AddCast()/SWIG_CheckState()
+*/
+
+#define SWIG_OK                    (0) 
+#define SWIG_ERROR                 (-1)
+#define SWIG_IsOK(r)               (r >= 0)
+#define SWIG_ArgError(r)           ((r != SWIG_ERROR) ? r : SWIG_TypeError)  
+
+/* The CastRankLimit says how many bits are used for the cast rank */
+#define SWIG_CASTRANKLIMIT         (1 << 8)
+/* The NewMask denotes the object was created (using new/malloc) */
+#define SWIG_NEWOBJMASK            (SWIG_CASTRANKLIMIT  << 1)
+/* The TmpMask is for in/out typemaps that use temporal objects */
+#define SWIG_TMPOBJMASK            (SWIG_NEWOBJMASK << 1)
+/* Simple returning values */
+#define SWIG_BADOBJ                (SWIG_ERROR)
+#define SWIG_OLDOBJ                (SWIG_OK)
+#define SWIG_NEWOBJ                (SWIG_OK | SWIG_NEWOBJMASK)
+#define SWIG_TMPOBJ                (SWIG_OK | SWIG_TMPOBJMASK)
+/* Check, add and del mask methods */
+#define SWIG_AddNewMask(r)         (SWIG_IsOK(r) ? (r | SWIG_NEWOBJMASK) : r)
+#define SWIG_DelNewMask(r)         (SWIG_IsOK(r) ? (r & ~SWIG_NEWOBJMASK) : r)
+#define SWIG_IsNewObj(r)           (SWIG_IsOK(r) && (r & SWIG_NEWOBJMASK))
+#define SWIG_AddTmpMask(r)         (SWIG_IsOK(r) ? (r | SWIG_TMPOBJMASK) : r)
+#define SWIG_DelTmpMask(r)         (SWIG_IsOK(r) ? (r & ~SWIG_TMPOBJMASK) : r)
+#define SWIG_IsTmpObj(r)           (SWIG_IsOK(r) && (r & SWIG_TMPOBJMASK))
+
+/* Cast-Rank Mode */
+#if defined(SWIG_CASTRANK_MODE)
+#  ifndef SWIG_TypeRank
+#    define SWIG_TypeRank             unsigned long
+#  endif
+#  ifndef SWIG_MAXCASTRANK            /* Default cast allowed */
+#    define SWIG_MAXCASTRANK          (2)
+#  endif
+#  define SWIG_CASTRANKMASK          ((SWIG_CASTRANKLIMIT) -1)
+#  define SWIG_CastRank(r)           (r & SWIG_CASTRANKMASK)
+SWIGINTERNINLINE int SWIG_AddCast(int r) { 
+  return SWIG_IsOK(r) ? ((SWIG_CastRank(r) < SWIG_MAXCASTRANK) ? (r + 1) : SWIG_ERROR) : r;
+}
+SWIGINTERNINLINE int SWIG_CheckState(int r) { 
+  return SWIG_IsOK(r) ? SWIG_CastRank(r) + 1 : 0; 
+}
+#else /* no cast-rank mode */
+#  define SWIG_AddCast
+#  define SWIG_CheckState(r) (SWIG_IsOK(r) ? 1 : 0)
+#endif
+
+
+#include <string.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef void *(*swig_converter_func)(void *, int *);
+typedef struct swig_type_info *(*swig_dycast_func)(void **);
+
+/* Structure to store information on one type */
+typedef struct swig_type_info {
+  const char             *name;			/* mangled name of this type */
+  const char             *str;			/* human readable name of this type */
+  swig_dycast_func        dcast;		/* dynamic cast function down a hierarchy */
+  struct swig_cast_info  *cast;			/* linked list of types that can cast into this type */
+  void                   *clientdata;		/* language specific type data */
+  int                    owndata;		/* flag if the structure owns the clientdata */
+} swig_type_info;
+
+/* Structure to store a type and conversion function used for casting */
+typedef struct swig_cast_info {
+  swig_type_info         *type;			/* pointer to type that is equivalent to this type */
+  swig_converter_func     converter;		/* function to cast the void pointers */
+  struct swig_cast_info  *next;			/* pointer to next cast in linked list */
+  struct swig_cast_info  *prev;			/* pointer to the previous cast */
+} swig_cast_info;
+
+/* Structure used to store module information
+ * Each module generates one structure like this, and the runtime collects
+ * all of these structures and stores them in a circularly linked list.*/
+typedef struct swig_module_info {
+  swig_type_info         **types;		/* Array of pointers to swig_type_info structures that are in this module */
+  size_t                 size;		        /* Number of types in this module */
+  struct swig_module_info *next;		/* Pointer to next element in circularly linked list */
+  swig_type_info         **type_initial;	/* Array of initially generated type structures */
+  swig_cast_info         **cast_initial;	/* Array of initially generated casting structures */
+  void                    *clientdata;		/* Language specific module data */
+} swig_module_info;
+
+/* 
+  Compare two type names skipping the space characters, therefore
+  "char*" == "char *" and "Class<int>" == "Class<int >", etc.
+
+  Return 0 when the two name types are equivalent, as in
+  strncmp, but skipping ' '.
+*/
+SWIGRUNTIME int
+SWIG_TypeNameComp(const char *f1, const char *l1,
+		  const char *f2, const char *l2) {
+  for (;(f1 != l1) && (f2 != l2); ++f1, ++f2) {
+    while ((*f1 == ' ') && (f1 != l1)) ++f1;
+    while ((*f2 == ' ') && (f2 != l2)) ++f2;
+    if (*f1 != *f2) return (*f1 > *f2) ? 1 : -1;
+  }
+  return (int)((l1 - f1) - (l2 - f2));
+}
+
+/*
+  Check type equivalence in a name list like <name1>|<name2>|...
+  Return 0 if not equal, 1 if equal
+*/
+SWIGRUNTIME int
+SWIG_TypeEquiv(const char *nb, const char *tb) {
+  int equiv = 0;
+  const char* te = tb + strlen(tb);
+  const char* ne = nb;
+  while (!equiv && *ne) {
+    for (nb = ne; *ne; ++ne) {
+      if (*ne == '|') break;
+    }
+    equiv = (SWIG_TypeNameComp(nb, ne, tb, te) == 0) ? 1 : 0;
+    if (*ne) ++ne;
+  }
+  return equiv;
+}
+
+/*
+  Check type equivalence in a name list like <name1>|<name2>|...
+  Return 0 if equal, -1 if nb < tb, 1 if nb > tb
+*/
+SWIGRUNTIME int
+SWIG_TypeCompare(const char *nb, const char *tb) {
+  int equiv = 0;
+  const char* te = tb + strlen(tb);
+  const char* ne = nb;
+  while (!equiv && *ne) {
+    for (nb = ne; *ne; ++ne) {
+      if (*ne == '|') break;
+    }
+    equiv = (SWIG_TypeNameComp(nb, ne, tb, te) == 0) ? 1 : 0;
+    if (*ne) ++ne;
+  }
+  return equiv;
+}
+
+
+/*
+  Check the typename
+*/
+SWIGRUNTIME swig_cast_info *
+SWIG_TypeCheck(const char *c, swig_type_info *ty) {
+  if (ty) {
+    swig_cast_info *iter = ty->cast;
+    while (iter) {
+      if (strcmp(iter->type->name, c) == 0) {
+        if (iter == ty->cast)
+          return iter;
+        /* Move iter to the top of the linked list */
+        iter->prev->next = iter->next;
+        if (iter->next)
+          iter->next->prev = iter->prev;
+        iter->next = ty->cast;
+        iter->prev = 0;
+        if (ty->cast) ty->cast->prev = iter;
+        ty->cast = iter;
+        return iter;
+      }
+      iter = iter->next;
+    }
+  }
+  return 0;
+}
+
+/* 
+  Identical to SWIG_TypeCheck, except strcmp is replaced with a pointer comparison
+*/
+SWIGRUNTIME swig_cast_info *
+SWIG_TypeCheckStruct(swig_type_info *from, swig_type_info *ty) {
+  if (ty) {
+    swig_cast_info *iter = ty->cast;
+    while (iter) {
+      if (iter->type == from) {
+        if (iter == ty->cast)
+          return iter;
+        /* Move iter to the top of the linked list */
+        iter->prev->next = iter->next;
+        if (iter->next)
+          iter->next->prev = iter->prev;
+        iter->next = ty->cast;
+        iter->prev = 0;
+        if (ty->cast) ty->cast->prev = iter;
+        ty->cast = iter;
+        return iter;
+      }
+      iter = iter->next;
+    }
+  }
+  return 0;
+}
+
+/*
+  Cast a pointer up an inheritance hierarchy
+*/
+SWIGRUNTIMEINLINE void *
+SWIG_TypeCast(swig_cast_info *ty, void *ptr, int *newmemory) {
+  return ((!ty) || (!ty->converter)) ? ptr : (*ty->converter)(ptr, newmemory);
+}
+
+/* 
+   Dynamic pointer casting. Down an inheritance hierarchy
+*/
+SWIGRUNTIME swig_type_info *
+SWIG_TypeDynamicCast(swig_type_info *ty, void **ptr) {
+  swig_type_info *lastty = ty;
+  if (!ty || !ty->dcast) return ty;
+  while (ty && (ty->dcast)) {
+    ty = (*ty->dcast)(ptr);
+    if (ty) lastty = ty;
+  }
+  return lastty;
+}
+
+/*
+  Return the name associated with this type
+*/
+SWIGRUNTIMEINLINE const char *
+SWIG_TypeName(const swig_type_info *ty) {
+  return ty->name;
+}
+
+/*
+  Return the pretty name associated with this type,
+  that is an unmangled type name in a form presentable to the user.
+*/
+SWIGRUNTIME const char *
+SWIG_TypePrettyName(const swig_type_info *type) {
+  /* The "str" field contains the equivalent pretty names of the
+     type, separated by vertical-bar characters.  We choose
+     to print the last name, as it is often (?) the most
+     specific. */
+  if (!type) return NULL;
+  if (type->str != NULL) {
+    const char *last_name = type->str;
+    const char *s;
+    for (s = type->str; *s; s++)
+      if (*s == '|') last_name = s+1;
+    return last_name;
+  }
+  else
+    return type->name;
+}
+
+/* 
+   Set the clientdata field for a type
+*/
+SWIGRUNTIME void
+SWIG_TypeClientData(swig_type_info *ti, void *clientdata) {
+  swig_cast_info *cast = ti->cast;
+  /* if (ti->clientdata == clientdata) return; */
+  ti->clientdata = clientdata;
+  
+  while (cast) {
+    if (!cast->converter) {
+      swig_type_info *tc = cast->type;
+      if (!tc->clientdata) {
+	SWIG_TypeClientData(tc, clientdata);
+      }
+    }    
+    cast = cast->next;
+  }
+}
+SWIGRUNTIME void
+SWIG_TypeNewClientData(swig_type_info *ti, void *clientdata) {
+  SWIG_TypeClientData(ti, clientdata);
+  ti->owndata = 1;
+}
+  
+/*
+  Search for a swig_type_info structure only by mangled name
+  Search is a O(log #types)
+  
+  We start searching at module start, and finish searching when start == end.  
+  Note: if start == end at the beginning of the function, we go all the way around
+  the circular list.
+*/
+SWIGRUNTIME swig_type_info *
+SWIG_MangledTypeQueryModule(swig_module_info *start, 
+                            swig_module_info *end, 
+		            const char *name) {
+  swig_module_info *iter = start;
+  do {
+    if (iter->size) {
+      register size_t l = 0;
+      register size_t r = iter->size - 1;
+      do {
+	/* since l+r >= 0, we can (>> 1) instead (/ 2) */
+	register size_t i = (l + r) >> 1; 
+	const char *iname = iter->types[i]->name;
+	if (iname) {
+	  register int compare = strcmp(name, iname);
+	  if (compare == 0) {	    
+	    return iter->types[i];
+	  } else if (compare < 0) {
+	    if (i) {
+	      r = i - 1;
+	    } else {
+	      break;
+	    }
+	  } else if (compare > 0) {
+	    l = i + 1;
+	  }
+	} else {
+	  break; /* should never happen */
+	}
+      } while (l <= r);
+    }
+    iter = iter->next;
+  } while (iter != end);
+  return 0;
+}
+
+/*
+  Search for a swig_type_info structure for either a mangled name or a human readable name.
+  It first searches the mangled names of the types, which is a O(log #types)
+  If a type is not found it then searches the human readable names, which is O(#types).
+  
+  We start searching at module start, and finish searching when start == end.  
+  Note: if start == end at the beginning of the function, we go all the way around
+  the circular list.
+*/
+SWIGRUNTIME swig_type_info *
+SWIG_TypeQueryModule(swig_module_info *start, 
+                     swig_module_info *end, 
+		     const char *name) {
+  /* STEP 1: Search the name field using binary search */
+  swig_type_info *ret = SWIG_MangledTypeQueryModule(start, end, name);
+  if (ret) {
+    return ret;
+  } else {
+    /* STEP 2: If the type hasn't been found, do a complete search
+       of the str field (the human readable name) */
+    swig_module_info *iter = start;
+    do {
+      register size_t i = 0;
+      for (; i < iter->size; ++i) {
+	if (iter->types[i]->str && (SWIG_TypeEquiv(iter->types[i]->str, name)))
+	  return iter->types[i];
+      }
+      iter = iter->next;
+    } while (iter != end);
+  }
+  
+  /* neither found a match */
+  return 0;
+}
+
+/* 
+   Pack binary data into a string
+*/
+SWIGRUNTIME char *
+SWIG_PackData(char *c, void *ptr, size_t sz) {
+  static const char hex[17] = "0123456789abcdef";
+  register const unsigned char *u = (unsigned char *) ptr;
+  register const unsigned char *eu =  u + sz;
+  for (; u != eu; ++u) {
+    register unsigned char uu = *u;
+    *(c++) = hex[(uu & 0xf0) >> 4];
+    *(c++) = hex[uu & 0xf];
+  }
+  return c;
+}
+
+/* 
+   Unpack binary data from a string
+*/
+SWIGRUNTIME const char *
+SWIG_UnpackData(const char *c, void *ptr, size_t sz) {
+  register unsigned char *u = (unsigned char *) ptr;
+  register const unsigned char *eu = u + sz;
+  for (; u != eu; ++u) {
+    register char d = *(c++);
+    register unsigned char uu;
+    if ((d >= '0') && (d <= '9'))
+      uu = ((d - '0') << 4);
+    else if ((d >= 'a') && (d <= 'f'))
+      uu = ((d - ('a'-10)) << 4);
+    else 
+      return (char *) 0;
+    d = *(c++);
+    if ((d >= '0') && (d <= '9'))
+      uu |= (d - '0');
+    else if ((d >= 'a') && (d <= 'f'))
+      uu |= (d - ('a'-10));
+    else 
+      return (char *) 0;
+    *u = uu;
+  }
+  return c;
+}
+
+/* 
+   Pack 'void *' into a string buffer.
+*/
+SWIGRUNTIME char *
+SWIG_PackVoidPtr(char *buff, void *ptr, const char *name, size_t bsz) {
+  char *r = buff;
+  if ((2*sizeof(void *) + 2) > bsz) return 0;
+  *(r++) = '_';
+  r = SWIG_PackData(r,&ptr,sizeof(void *));
+  if (strlen(name) + 1 > (bsz - (r - buff))) return 0;
+  strcpy(r,name);
+  return buff;
+}
+
+SWIGRUNTIME const char *
+SWIG_UnpackVoidPtr(const char *c, void **ptr, const char *name) {
+  if (*c != '_') {
+    if (strcmp(c,"NULL") == 0) {
+      *ptr = (void *) 0;
+      return name;
+    } else {
+      return 0;
+    }
+  }
+  return SWIG_UnpackData(++c,ptr,sizeof(void *));
+}
+
+SWIGRUNTIME char *
+SWIG_PackDataName(char *buff, void *ptr, size_t sz, const char *name, size_t bsz) {
+  char *r = buff;
+  size_t lname = (name ? strlen(name) : 0);
+  if ((2*sz + 2 + lname) > bsz) return 0;
+  *(r++) = '_';
+  r = SWIG_PackData(r,ptr,sz);
+  if (lname) {
+    strncpy(r,name,lname+1);
+  } else {
+    *r = 0;
+  }
+  return buff;
+}
+
+SWIGRUNTIME const char *
+SWIG_UnpackDataName(const char *c, void *ptr, size_t sz, const char *name) {
+  if (*c != '_') {
+    if (strcmp(c,"NULL") == 0) {
+      memset(ptr,0,sz);
+      return name;
+    } else {
+      return 0;
+    }
+  }
+  return SWIG_UnpackData(++c,ptr,sz);
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+/*  Errors in SWIG */
+#define  SWIG_UnknownError    	   -1 
+#define  SWIG_IOError        	   -2 
+#define  SWIG_RuntimeError   	   -3 
+#define  SWIG_IndexError     	   -4 
+#define  SWIG_TypeError      	   -5 
+#define  SWIG_DivisionByZero 	   -6 
+#define  SWIG_OverflowError  	   -7 
+#define  SWIG_SyntaxError    	   -8 
+#define  SWIG_ValueError     	   -9 
+#define  SWIG_SystemError    	   -10
+#define  SWIG_AttributeError 	   -11
+#define  SWIG_MemoryError    	   -12 
+#define  SWIG_NullReferenceError   -13
+
+
+
+/* Compatibility macros for Python 3 */
+#if PY_VERSION_HEX >= 0x03000000
+
+#define PyClass_Check(obj) PyObject_IsInstance(obj, (PyObject *)&PyType_Type)
+#define PyInt_Check(x) PyLong_Check(x)
+#define PyInt_AsLong(x) PyLong_AsLong(x)
+#define PyInt_FromLong(x) PyLong_FromLong(x)
+#define PyString_Check(name) PyBytes_Check(name)
+#define PyString_FromString(x) PyUnicode_FromString(x)
+#define PyString_Format(fmt, args)  PyUnicode_Format(fmt, args)
+#define PyString_AsString(str) PyBytes_AsString(str)
+#define PyString_Size(str) PyBytes_Size(str)	
+#define PyString_InternFromString(key) PyUnicode_InternFromString(key)
+#define Py_TPFLAGS_HAVE_CLASS Py_TPFLAGS_BASETYPE
+#define PyString_AS_STRING(x) PyUnicode_AS_STRING(x)
+#define _PyLong_FromSsize_t(x) PyLong_FromSsize_t(x)
+
+#endif
+
+#ifndef Py_TYPE
+#  define Py_TYPE(op) ((op)->ob_type)
+#endif
+
+/* SWIG APIs for compatibility of both Python 2 & 3 */
+
+#if PY_VERSION_HEX >= 0x03000000
+#  define SWIG_Python_str_FromFormat PyUnicode_FromFormat
+#else
+#  define SWIG_Python_str_FromFormat PyString_FromFormat
+#endif
+
+
+/* Warning: This function will allocate a new string in Python 3,
+ * so please call SWIG_Python_str_DelForPy3(x) to free the space.
+ */
+SWIGINTERN char*
+SWIG_Python_str_AsChar(PyObject *str)
+{
+#if PY_VERSION_HEX >= 0x03000000
+  char *cstr;
+  char *newstr;
+  Py_ssize_t len;
+  str = PyUnicode_AsUTF8String(str);
+  PyBytes_AsStringAndSize(str, &cstr, &len);
+  newstr = (char *) malloc(len+1);
+  memcpy(newstr, cstr, len+1);
+  Py_XDECREF(str);
+  return newstr;
+#else
+  return PyString_AsString(str);
+#endif
+}
+
+#if PY_VERSION_HEX >= 0x03000000
+#  define SWIG_Python_str_DelForPy3(x) free( (void*) (x) )
+#else
+#  define SWIG_Python_str_DelForPy3(x) 
+#endif
+
+
+SWIGINTERN PyObject*
+SWIG_Python_str_FromChar(const char *c)
+{
+#if PY_VERSION_HEX >= 0x03000000
+  return PyUnicode_FromString(c); 
+#else
+  return PyString_FromString(c);
+#endif
+}
+
+/* Add PyOS_snprintf for old Pythons */
+#if PY_VERSION_HEX < 0x02020000
+# if defined(_MSC_VER) || defined(__BORLANDC__) || defined(_WATCOM)
+#  define PyOS_snprintf _snprintf
+# else
+#  define PyOS_snprintf snprintf
+# endif
+#endif
+
+/* A crude PyString_FromFormat implementation for old Pythons */
+#if PY_VERSION_HEX < 0x02020000
+
+#ifndef SWIG_PYBUFFER_SIZE
+# define SWIG_PYBUFFER_SIZE 1024
+#endif
+
+static PyObject *
+PyString_FromFormat(const char *fmt, ...) {
+  va_list ap;
+  char buf[SWIG_PYBUFFER_SIZE * 2];
+  int res;
+  va_start(ap, fmt);
+  res = vsnprintf(buf, sizeof(buf), fmt, ap);
+  va_end(ap);
+  return (res < 0 || res >= (int)sizeof(buf)) ? 0 : PyString_FromString(buf);
+}
+#endif
+
+/* Add PyObject_Del for old Pythons */
+#if PY_VERSION_HEX < 0x01060000
+# define PyObject_Del(op) PyMem_DEL((op))
+#endif
+#ifndef PyObject_DEL
+# define PyObject_DEL PyObject_Del
+#endif
+
+/* A crude PyExc_StopIteration exception for old Pythons */
+#if PY_VERSION_HEX < 0x02020000
+# ifndef PyExc_StopIteration
+#  define PyExc_StopIteration PyExc_RuntimeError
+# endif
+# ifndef PyObject_GenericGetAttr
+#  define PyObject_GenericGetAttr 0
+# endif
+#endif
+
+/* Py_NotImplemented is defined in 2.1 and up. */
+#if PY_VERSION_HEX < 0x02010000
+# ifndef Py_NotImplemented
+#  define Py_NotImplemented PyExc_RuntimeError
+# endif
+#endif
+
+/* A crude PyString_AsStringAndSize implementation for old Pythons */
+#if PY_VERSION_HEX < 0x02010000
+# ifndef PyString_AsStringAndSize
+#  define PyString_AsStringAndSize(obj, s, len) {*s = PyString_AsString(obj); *len = *s ? strlen(*s) : 0;}
+# endif
+#endif
+
+/* PySequence_Size for old Pythons */
+#if PY_VERSION_HEX < 0x02000000
+# ifndef PySequence_Size
+#  define PySequence_Size PySequence_Length
+# endif
+#endif
+
+/* PyBool_FromLong for old Pythons */
+#if PY_VERSION_HEX < 0x02030000
+static
+PyObject *PyBool_FromLong(long ok)
+{
+  PyObject *result = ok ? Py_True : Py_False;
+  Py_INCREF(result);
+  return result;
+}
+#endif
+
+/* Py_ssize_t for old Pythons */
+/* This code is as recommended by: */
+/* http://www.python.org/dev/peps/pep-0353/#conversion-guidelines */
+#if PY_VERSION_HEX < 0x02050000 && !defined(PY_SSIZE_T_MIN)
+typedef int Py_ssize_t;
+# define PY_SSIZE_T_MAX INT_MAX
+# define PY_SSIZE_T_MIN INT_MIN
+typedef inquiry lenfunc;
+typedef intargfunc ssizeargfunc;
+typedef intintargfunc ssizessizeargfunc;
+typedef intobjargproc ssizeobjargproc;
+typedef intintobjargproc ssizessizeobjargproc;
+typedef getreadbufferproc readbufferproc;
+typedef getwritebufferproc writebufferproc;
+typedef getsegcountproc segcountproc;
+typedef getcharbufferproc charbufferproc;
+static long PyNumber_AsSsize_t (PyObject *x, void *SWIGUNUSEDPARM(exc))
+{
+  long result = 0;
+  PyObject *i = PyNumber_Int(x);
+  if (i) {
+    result = PyInt_AsLong(i);
+    Py_DECREF(i);
+  }
+  return result;
+}
+#endif
+
+#if PY_VERSION_HEX < 0x02040000
+#define Py_VISIT(op)				\
+  do { 						\
+    if (op) {					\
+      int vret = visit((op), arg);		\
+      if (vret)					\
+        return vret;				\
+    }						\
+  } while (0)
+#endif
+
+#if PY_VERSION_HEX < 0x02030000
+typedef struct {
+  PyTypeObject type;
+  PyNumberMethods as_number;
+  PyMappingMethods as_mapping;
+  PySequenceMethods as_sequence;
+  PyBufferProcs as_buffer;
+  PyObject *name, *slots;
+} PyHeapTypeObject;
+#endif
+
+#if PY_VERSION_HEX < 0x02030000
+typedef destructor freefunc;
+#endif
+
+#if ((PY_MAJOR_VERSION == 2 && PY_MINOR_VERSION > 6) || \
+     (PY_MAJOR_VERSION == 3 && PY_MINOR_VERSION > 0) || \
+     (PY_MAJOR_VERSION > 3))
+# define SWIGPY_USE_CAPSULE
+# define SWIGPY_CAPSULE_NAME ((char*)"swig_runtime_data" SWIG_RUNTIME_VERSION ".type_pointer_capsule" SWIG_TYPE_TABLE_NAME)
+#endif
+
+#if PY_VERSION_HEX < 0x03020000
+#define PyDescr_TYPE(x) (((PyDescrObject *)(x))->d_type)
+#define PyDescr_NAME(x) (((PyDescrObject *)(x))->d_name)
+#endif
+
+/* -----------------------------------------------------------------------------
+ * error manipulation
+ * ----------------------------------------------------------------------------- */
+
+SWIGRUNTIME PyObject*
+SWIG_Python_ErrorType(int code) {
+  PyObject* type = 0;
+  switch(code) {
+  case SWIG_MemoryError:
+    type = PyExc_MemoryError;
+    break;
+  case SWIG_IOError:
+    type = PyExc_IOError;
+    break;
+  case SWIG_RuntimeError:
+    type = PyExc_RuntimeError;
+    break;
+  case SWIG_IndexError:
+    type = PyExc_IndexError;
+    break;
+  case SWIG_TypeError:
+    type = PyExc_TypeError;
+    break;
+  case SWIG_DivisionByZero:
+    type = PyExc_ZeroDivisionError;
+    break;
+  case SWIG_OverflowError:
+    type = PyExc_OverflowError;
+    break;
+  case SWIG_SyntaxError:
+    type = PyExc_SyntaxError;
+    break;
+  case SWIG_ValueError:
+    type = PyExc_ValueError;
+    break;
+  case SWIG_SystemError:
+    type = PyExc_SystemError;
+    break;
+  case SWIG_AttributeError:
+    type = PyExc_AttributeError;
+    break;
+  default:
+    type = PyExc_RuntimeError;
+  }
+  return type;
+}
+
+
+SWIGRUNTIME void
+SWIG_Python_AddErrorMsg(const char* mesg)
+{
+  PyObject *type = 0;
+  PyObject *value = 0;
+  PyObject *traceback = 0;
+
+  if (PyErr_Occurred()) PyErr_Fetch(&type, &value, &traceback);
+  if (value) {
+    char *tmp;
+    PyObject *old_str = PyObject_Str(value);
+    PyErr_Clear();
+    Py_XINCREF(type);
+
+    PyErr_Format(type, "%s %s", tmp = SWIG_Python_str_AsChar(old_str), mesg);
+    SWIG_Python_str_DelForPy3(tmp);
+    Py_DECREF(old_str);
+    Py_DECREF(value);
+  } else {
+    PyErr_SetString(PyExc_RuntimeError, mesg);
+  }
+}
+
+#if defined(SWIG_PYTHON_NO_THREADS)
+#  if defined(SWIG_PYTHON_THREADS)
+#    undef SWIG_PYTHON_THREADS
+#  endif
+#endif
+#if defined(SWIG_PYTHON_THREADS) /* Threading support is enabled */
+#  if !defined(SWIG_PYTHON_USE_GIL) && !defined(SWIG_PYTHON_NO_USE_GIL)
+#    if (PY_VERSION_HEX >= 0x02030000) /* For 2.3 or later, use the PyGILState calls */
+#      define SWIG_PYTHON_USE_GIL
+#    endif
+#  endif
+#  if defined(SWIG_PYTHON_USE_GIL) /* Use PyGILState threads calls */
+#    ifndef SWIG_PYTHON_INITIALIZE_THREADS
+#     define SWIG_PYTHON_INITIALIZE_THREADS  PyEval_InitThreads() 
+#    endif
+#    ifdef __cplusplus /* C++ code */
+       class SWIG_Python_Thread_Block {
+         bool status;
+         PyGILState_STATE state;
+       public:
+         void end() { if (status) { PyGILState_Release(state); status = false;} }
+         SWIG_Python_Thread_Block() : status(true), state(PyGILState_Ensure()) {}
+         ~SWIG_Python_Thread_Block() { end(); }
+       };
+       class SWIG_Python_Thread_Allow {
+         bool status;
+         PyThreadState *save;
+       public:
+         void end() { if (status) { PyEval_RestoreThread(save); status = false; }}
+         SWIG_Python_Thread_Allow() : status(true), save(PyEval_SaveThread()) {}
+         ~SWIG_Python_Thread_Allow() { end(); }
+       };
+#      define SWIG_PYTHON_THREAD_BEGIN_BLOCK   SWIG_Python_Thread_Block _swig_thread_block
+#      define SWIG_PYTHON_THREAD_END_BLOCK     _swig_thread_block.end()
+#      define SWIG_PYTHON_THREAD_BEGIN_ALLOW   SWIG_Python_Thread_Allow _swig_thread_allow
+#      define SWIG_PYTHON_THREAD_END_ALLOW     _swig_thread_allow.end()
+#    else /* C code */
+#      define SWIG_PYTHON_THREAD_BEGIN_BLOCK   PyGILState_STATE _swig_thread_block = PyGILState_Ensure()
+#      define SWIG_PYTHON_THREAD_END_BLOCK     PyGILState_Release(_swig_thread_block)
+#      define SWIG_PYTHON_THREAD_BEGIN_ALLOW   PyThreadState *_swig_thread_allow = PyEval_SaveThread()
+#      define SWIG_PYTHON_THREAD_END_ALLOW     PyEval_RestoreThread(_swig_thread_allow)
+#    endif
+#  else /* Old thread way, not implemented, user must provide it */
+#    if !defined(SWIG_PYTHON_INITIALIZE_THREADS)
+#      define SWIG_PYTHON_INITIALIZE_THREADS
+#    endif
+#    if !defined(SWIG_PYTHON_THREAD_BEGIN_BLOCK)
+#      define SWIG_PYTHON_THREAD_BEGIN_BLOCK
+#    endif
+#    if !defined(SWIG_PYTHON_THREAD_END_BLOCK)
+#      define SWIG_PYTHON_THREAD_END_BLOCK
+#    endif
+#    if !defined(SWIG_PYTHON_THREAD_BEGIN_ALLOW)
+#      define SWIG_PYTHON_THREAD_BEGIN_ALLOW
+#    endif
+#    if !defined(SWIG_PYTHON_THREAD_END_ALLOW)
+#      define SWIG_PYTHON_THREAD_END_ALLOW
+#    endif
+#  endif
+#else /* No thread support */
+#  define SWIG_PYTHON_INITIALIZE_THREADS
+#  define SWIG_PYTHON_THREAD_BEGIN_BLOCK
+#  define SWIG_PYTHON_THREAD_END_BLOCK
+#  define SWIG_PYTHON_THREAD_BEGIN_ALLOW
+#  define SWIG_PYTHON_THREAD_END_ALLOW
+#endif
+
+/* -----------------------------------------------------------------------------
+ * Python API portion that goes into the runtime
+ * ----------------------------------------------------------------------------- */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* -----------------------------------------------------------------------------
+ * Constant declarations
+ * ----------------------------------------------------------------------------- */
+
+/* Constant Types */
+#define SWIG_PY_POINTER 4
+#define SWIG_PY_BINARY  5
+
+/* Constant information structure */
+typedef struct swig_const_info {
+  int type;
+  char *name;
+  long lvalue;
+  double dvalue;
+  void   *pvalue;
+  swig_type_info **ptype;
+} swig_const_info;
+
+
+/* -----------------------------------------------------------------------------
+ * Wrapper of PyInstanceMethod_New() used in Python 3
+ * It is exported to the generated module, used for -fastproxy
+ * ----------------------------------------------------------------------------- */
+#if PY_VERSION_HEX >= 0x03000000
+SWIGRUNTIME PyObject* SWIG_PyInstanceMethod_New(PyObject *SWIGUNUSEDPARM(self), PyObject *func)
+{
+  return PyInstanceMethod_New(func);
+}
+#else
+SWIGRUNTIME PyObject* SWIG_PyInstanceMethod_New(PyObject *SWIGUNUSEDPARM(self), PyObject *SWIGUNUSEDPARM(func))
+{
+  return NULL;
+}
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+
+/* -----------------------------------------------------------------------------
+ * pyrun.swg
+ *
+ * This file contains the runtime support for Python modules
+ * and includes code for managing global variables and pointer
+ * type checking.
+ *
+ * ----------------------------------------------------------------------------- */
+
+/* Common SWIG API */
+
+/* for raw pointers */
+#define SWIG_Python_ConvertPtr(obj, pptr, type, flags)  SWIG_Python_ConvertPtrAndOwn(obj, pptr, type, flags, 0)
+#define SWIG_ConvertPtr(obj, pptr, type, flags)         SWIG_Python_ConvertPtr(obj, pptr, type, flags)
+#define SWIG_ConvertPtrAndOwn(obj,pptr,type,flags,own)  SWIG_Python_ConvertPtrAndOwn(obj, pptr, type, flags, own)
+
+#ifdef SWIGPYTHON_BUILTIN
+#define SWIG_NewPointerObj(ptr, type, flags)            SWIG_Python_NewPointerObj(self, ptr, type, flags)
+#else
+#define SWIG_NewPointerObj(ptr, type, flags)            SWIG_Python_NewPointerObj(NULL, ptr, type, flags)
+#endif
+
+#define SWIG_InternalNewPointerObj(ptr, type, flags)	SWIG_Python_NewPointerObj(NULL, ptr, type, flags)
+
+#define SWIG_CheckImplicit(ty)                          SWIG_Python_CheckImplicit(ty) 
+#define SWIG_AcquirePtr(ptr, src)                       SWIG_Python_AcquirePtr(ptr, src)
+#define swig_owntype                                    int
+
+/* for raw packed data */
+#define SWIG_ConvertPacked(obj, ptr, sz, ty)            SWIG_Python_ConvertPacked(obj, ptr, sz, ty)
+#define SWIG_NewPackedObj(ptr, sz, type)                SWIG_Python_NewPackedObj(ptr, sz, type)
+
+/* for class or struct pointers */
+#define SWIG_ConvertInstance(obj, pptr, type, flags)    SWIG_ConvertPtr(obj, pptr, type, flags)
+#define SWIG_NewInstanceObj(ptr, type, flags)           SWIG_NewPointerObj(ptr, type, flags)
+
+/* for C or C++ function pointers */
+#define SWIG_ConvertFunctionPtr(obj, pptr, type)        SWIG_Python_ConvertFunctionPtr(obj, pptr, type)
+#define SWIG_NewFunctionPtrObj(ptr, type)               SWIG_Python_NewPointerObj(NULL, ptr, type, 0)
+
+/* for C++ member pointers, ie, member methods */
+#define SWIG_ConvertMember(obj, ptr, sz, ty)            SWIG_Python_ConvertPacked(obj, ptr, sz, ty)
+#define SWIG_NewMemberObj(ptr, sz, type)                SWIG_Python_NewPackedObj(ptr, sz, type)
+
+
+/* Runtime API */
+
+#define SWIG_GetModule(clientdata)                      SWIG_Python_GetModule()
+#define SWIG_SetModule(clientdata, pointer)             SWIG_Python_SetModule(pointer)
+#define SWIG_NewClientData(obj)                         SwigPyClientData_New(obj)
+
+#define SWIG_SetErrorObj                                SWIG_Python_SetErrorObj                            
+#define SWIG_SetErrorMsg                        	SWIG_Python_SetErrorMsg				   
+#define SWIG_ErrorType(code)                    	SWIG_Python_ErrorType(code)                        
+#define SWIG_Error(code, msg)            		SWIG_Python_SetErrorMsg(SWIG_ErrorType(code), msg) 
+#define SWIG_fail                        		goto fail					   
+
+
+/* Runtime API implementation */
+
+/* Error manipulation */
+
+SWIGINTERN void 
+SWIG_Python_SetErrorObj(PyObject *errtype, PyObject *obj) {
+  SWIG_PYTHON_THREAD_BEGIN_BLOCK; 
+  PyErr_SetObject(errtype, obj);
+  Py_DECREF(obj);
+  SWIG_PYTHON_THREAD_END_BLOCK;
+}
+
+SWIGINTERN void 
+SWIG_Python_SetErrorMsg(PyObject *errtype, const char *msg) {
+  SWIG_PYTHON_THREAD_BEGIN_BLOCK;
+  PyErr_SetString(errtype, (char *) msg);
+  SWIG_PYTHON_THREAD_END_BLOCK;
+}
+
+#define SWIG_Python_Raise(obj, type, desc)  SWIG_Python_SetErrorObj(SWIG_Python_ExceptionType(desc), obj)
+
+/* Set a constant value */
+
+#if defined(SWIGPYTHON_BUILTIN)
+
+SWIGINTERN void
+SwigPyBuiltin_AddPublicSymbol(PyObject *seq, const char *key) {
+  PyObject *s = PyString_InternFromString(key);
+  PyList_Append(seq, s);
+  Py_DECREF(s);
+}
+
+SWIGINTERN void
+SWIG_Python_SetConstant(PyObject *d, PyObject *public_interface, const char *name, PyObject *obj) {   
+  PyDict_SetItemString(d, (char *)name, obj);
+  Py_DECREF(obj);
+  if (public_interface)
+    SwigPyBuiltin_AddPublicSymbol(public_interface, name);
+}
+
+#else
+
+SWIGINTERN void
+SWIG_Python_SetConstant(PyObject *d, const char *name, PyObject *obj) {   
+  PyDict_SetItemString(d, (char *)name, obj);
+  Py_DECREF(obj);                            
+}
+
+#endif
+
+/* Append a value to the result obj */
+
+SWIGINTERN PyObject*
+SWIG_Python_AppendOutput(PyObject* result, PyObject* obj) {
+#if !defined(SWIG_PYTHON_OUTPUT_TUPLE)
+  if (!result) {
+    result = obj;
+  } else if (result == Py_None) {
+    Py_DECREF(result);
+    result = obj;
+  } else {
+    if (!PyList_Check(result)) {
+      PyObject *o2 = result;
+      result = PyList_New(1);
+      PyList_SetItem(result, 0, o2);
+    }
+    PyList_Append(result,obj);
+    Py_DECREF(obj);
+  }
+  return result;
+#else
+  PyObject*   o2;
+  PyObject*   o3;
+  if (!result) {
+    result = obj;
+  } else if (result == Py_None) {
+    Py_DECREF(result);
+    result = obj;
+  } else {
+    if (!PyTuple_Check(result)) {
+      o2 = result;
+      result = PyTuple_New(1);
+      PyTuple_SET_ITEM(result, 0, o2);
+    }
+    o3 = PyTuple_New(1);
+    PyTuple_SET_ITEM(o3, 0, obj);
+    o2 = result;
+    result = PySequence_Concat(o2, o3);
+    Py_DECREF(o2);
+    Py_DECREF(o3);
+  }
+  return result;
+#endif
+}
+
+/* Unpack the argument tuple */
+
+SWIGINTERN int
+SWIG_Python_UnpackTuple(PyObject *args, const char *name, Py_ssize_t min, Py_ssize_t max, PyObject **objs)
+{
+  if (!args) {
+    if (!min && !max) {
+      return 1;
+    } else {
+      PyErr_Format(PyExc_TypeError, "%s expected %s%d arguments, got none", 
+		   name, (min == max ? "" : "at least "), (int)min);
+      return 0;
+    }
+  }  
+  if (!PyTuple_Check(args)) {
+    if (min <= 1 && max >= 1) {
+      register int i;
+      objs[0] = args;
+      for (i = 1; i < max; ++i) {
+	objs[i] = 0;
+      }
+      return 2;
+    }
+    PyErr_SetString(PyExc_SystemError, "UnpackTuple() argument list is not a tuple");
+    return 0;
+  } else {
+    register Py_ssize_t l = PyTuple_GET_SIZE(args);
+    if (l < min) {
+      PyErr_Format(PyExc_TypeError, "%s expected %s%d arguments, got %d", 
+		   name, (min == max ? "" : "at least "), (int)min, (int)l);
+      return 0;
+    } else if (l > max) {
+      PyErr_Format(PyExc_TypeError, "%s expected %s%d arguments, got %d", 
+		   name, (min == max ? "" : "at most "), (int)max, (int)l);
+      return 0;
+    } else {
+      register int i;
+      for (i = 0; i < l; ++i) {
+	objs[i] = PyTuple_GET_ITEM(args, i);
+      }
+      for (; l < max; ++l) {
+	objs[l] = 0;
+      }
+      return i + 1;
+    }    
+  }
+}
+
+/* A functor is a function object with one single object argument */
+#if PY_VERSION_HEX >= 0x02020000
+#define SWIG_Python_CallFunctor(functor, obj)	        PyObject_CallFunctionObjArgs(functor, obj, NULL);
+#else
+#define SWIG_Python_CallFunctor(functor, obj)	        PyObject_CallFunction(functor, "O", obj);
+#endif
+
+/*
+  Helper for static pointer initialization for both C and C++ code, for example
+  static PyObject *SWIG_STATIC_POINTER(MyVar) = NewSomething(...);
+*/
+#ifdef __cplusplus
+#define SWIG_STATIC_POINTER(var)  var
+#else
+#define SWIG_STATIC_POINTER(var)  var = 0; if (!var) var
+#endif
+
+/* -----------------------------------------------------------------------------
+ * Pointer declarations
+ * ----------------------------------------------------------------------------- */
+
+/* Flags for new pointer objects */
+#define SWIG_POINTER_NOSHADOW       (SWIG_POINTER_OWN      << 1)
+#define SWIG_POINTER_NEW            (SWIG_POINTER_NOSHADOW | SWIG_POINTER_OWN)
+
+#define SWIG_POINTER_IMPLICIT_CONV  (SWIG_POINTER_DISOWN   << 1)
+
+#define SWIG_BUILTIN_TP_INIT	    (SWIG_POINTER_OWN << 2)
+#define SWIG_BUILTIN_INIT	    (SWIG_BUILTIN_TP_INIT | SWIG_POINTER_OWN)
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*  How to access Py_None */
+#if defined(_WIN32) || defined(__WIN32__) || defined(__CYGWIN__)
+#  ifndef SWIG_PYTHON_NO_BUILD_NONE
+#    ifndef SWIG_PYTHON_BUILD_NONE
+#      define SWIG_PYTHON_BUILD_NONE
+#    endif
+#  endif
+#endif
+
+#ifdef SWIG_PYTHON_BUILD_NONE
+#  ifdef Py_None
+#   undef Py_None
+#   define Py_None SWIG_Py_None()
+#  endif
+SWIGRUNTIMEINLINE PyObject * 
+_SWIG_Py_None(void)
+{
+  PyObject *none = Py_BuildValue((char*)"");
+  Py_DECREF(none);
+  return none;
+}
+SWIGRUNTIME PyObject * 
+SWIG_Py_None(void)
+{
+  static PyObject *SWIG_STATIC_POINTER(none) = _SWIG_Py_None();
+  return none;
+}
+#endif
+
+/* The python void return value */
+
+SWIGRUNTIMEINLINE PyObject * 
+SWIG_Py_Void(void)
+{
+  PyObject *none = Py_None;
+  Py_INCREF(none);
+  return none;
+}
+
+/* SwigPyClientData */
+
+typedef struct {
+  PyObject *klass;
+  PyObject *newraw;
+  PyObject *newargs;
+  PyObject *destroy;
+  int delargs;
+  int implicitconv;
+  PyTypeObject *pytype;
+} SwigPyClientData;
+
+SWIGRUNTIMEINLINE int 
+SWIG_Python_CheckImplicit(swig_type_info *ty)
+{
+  SwigPyClientData *data = (SwigPyClientData *)ty->clientdata;
+  return data ? data->implicitconv : 0;
+}
+
+SWIGRUNTIMEINLINE PyObject *
+SWIG_Python_ExceptionType(swig_type_info *desc) {
+  SwigPyClientData *data = desc ? (SwigPyClientData *) desc->clientdata : 0;
+  PyObject *klass = data ? data->klass : 0;
+  return (klass ? klass : PyExc_RuntimeError);
+}
+
+
+SWIGRUNTIME SwigPyClientData * 
+SwigPyClientData_New(PyObject* obj)
+{
+  if (!obj) {
+    return 0;
+  } else {
+    SwigPyClientData *data = (SwigPyClientData *)malloc(sizeof(SwigPyClientData));
+    /* the klass element */
+    data->klass = obj;
+    Py_INCREF(data->klass);
+    /* the newraw method and newargs arguments used to create a new raw instance */
+    if (PyClass_Check(obj)) {
+      data->newraw = 0;
+      data->newargs = obj;
+      Py_INCREF(obj);
+    } else {
+#if (PY_VERSION_HEX < 0x02020000)
+      data->newraw = 0;
+#else
+      data->newraw = PyObject_GetAttrString(data->klass, (char *)"__new__");
+#endif
+      if (data->newraw) {
+	Py_INCREF(data->newraw);
+	data->newargs = PyTuple_New(1);
+	PyTuple_SetItem(data->newargs, 0, obj);
+      } else {
+	data->newargs = obj;
+      }
+      Py_INCREF(data->newargs);
+    }
+    /* the destroy method, aka as the C++ delete method */
+    data->destroy = PyObject_GetAttrString(data->klass, (char *)"__swig_destroy__");
+    if (PyErr_Occurred()) {
+      PyErr_Clear();
+      data->destroy = 0;
+    }
+    if (data->destroy) {
+      int flags;
+      Py_INCREF(data->destroy);
+      flags = PyCFunction_GET_FLAGS(data->destroy);
+#ifdef METH_O
+      data->delargs = !(flags & (METH_O));
+#else
+      data->delargs = 0;
+#endif
+    } else {
+      data->delargs = 0;
+    }
+    data->implicitconv = 0;
+    data->pytype = 0;
+    return data;
+  }
+}
+
+SWIGRUNTIME void 
+SwigPyClientData_Del(SwigPyClientData *data) {
+  Py_XDECREF(data->newraw);
+  Py_XDECREF(data->newargs);
+  Py_XDECREF(data->destroy);
+}
+
+/* =============== SwigPyObject =====================*/
+
+typedef struct {
+  PyObject_HEAD
+  void *ptr;
+  swig_type_info *ty;
+  int own;
+  PyObject *next;
+#ifdef SWIGPYTHON_BUILTIN
+  PyObject *dict;
+#endif
+} SwigPyObject;
+
+SWIGRUNTIME PyObject *
+SwigPyObject_long(SwigPyObject *v)
+{
+  return PyLong_FromVoidPtr(v->ptr);
+}
+
+SWIGRUNTIME PyObject *
+SwigPyObject_format(const char* fmt, SwigPyObject *v)
+{
+  PyObject *res = NULL;
+  PyObject *args = PyTuple_New(1);
+  if (args) {
+    if (PyTuple_SetItem(args, 0, SwigPyObject_long(v)) == 0) {
+      PyObject *ofmt = SWIG_Python_str_FromChar(fmt);
+      if (ofmt) {
+#if PY_VERSION_HEX >= 0x03000000
+	res = PyUnicode_Format(ofmt,args);
+#else
+	res = PyString_Format(ofmt,args);
+#endif
+	Py_DECREF(ofmt);
+      }
+      Py_DECREF(args);
+    }
+  }
+  return res;
+}
+
+SWIGRUNTIME PyObject *
+SwigPyObject_oct(SwigPyObject *v)
+{
+  return SwigPyObject_format("%o",v);
+}
+
+SWIGRUNTIME PyObject *
+SwigPyObject_hex(SwigPyObject *v)
+{
+  return SwigPyObject_format("%x",v);
+}
+
+SWIGRUNTIME PyObject *
+#ifdef METH_NOARGS
+SwigPyObject_repr(SwigPyObject *v)
+#else
+SwigPyObject_repr(SwigPyObject *v, PyObject *args)
+#endif
+{
+  const char *name = SWIG_TypePrettyName(v->ty);
+  PyObject *repr = SWIG_Python_str_FromFormat("<Swig Object of type '%s' at %p>", name, (void *)v);
+  if (v->next) {
+# ifdef METH_NOARGS
+    PyObject *nrep = SwigPyObject_repr((SwigPyObject *)v->next);
+# else
+    PyObject *nrep = SwigPyObject_repr((SwigPyObject *)v->next, args);
+# endif
+# if PY_VERSION_HEX >= 0x03000000
+    PyObject *joined = PyUnicode_Concat(repr, nrep);
+    Py_DecRef(repr);
+    Py_DecRef(nrep);
+    repr = joined;
+# else
+    PyString_ConcatAndDel(&repr,nrep);
+# endif
+  }
+  return repr;  
+}
+
+SWIGRUNTIME int
+SwigPyObject_print(SwigPyObject *v, FILE *fp, int SWIGUNUSEDPARM(flags))
+{
+  char *str;
+#ifdef METH_NOARGS
+  PyObject *repr = SwigPyObject_repr(v);
+#else
+  PyObject *repr = SwigPyObject_repr(v, NULL);
+#endif
+  if (repr) {
+    str = SWIG_Python_str_AsChar(repr); 
+    fputs(str, fp);
+    SWIG_Python_str_DelForPy3(str);
+    Py_DECREF(repr);
+    return 0; 
+  } else {
+    return 1; 
+  }
+}
+
+SWIGRUNTIME PyObject *
+SwigPyObject_str(SwigPyObject *v)
+{
+  char result[SWIG_BUFFER_SIZE];
+  return SWIG_PackVoidPtr(result, v->ptr, v->ty->name, sizeof(result)) ?
+    SWIG_Python_str_FromChar(result) : 0;
+}
+
+SWIGRUNTIME int
+SwigPyObject_compare(SwigPyObject *v, SwigPyObject *w)
+{
+  void *i = v->ptr;
+  void *j = w->ptr;
+  return (i < j) ? -1 : ((i > j) ? 1 : 0);
+}
+
+/* Added for Python 3.x, would it also be useful for Python 2.x? */
+SWIGRUNTIME PyObject*
+SwigPyObject_richcompare(SwigPyObject *v, SwigPyObject *w, int op)
+{
+  PyObject* res;
+  if( op != Py_EQ && op != Py_NE ) {
+    Py_INCREF(Py_NotImplemented);
+    return Py_NotImplemented;
+  }
+  res = PyBool_FromLong( (SwigPyObject_compare(v, w)==0) == (op == Py_EQ) ? 1 : 0);
+  return res;  
+}
+
+
+SWIGRUNTIME PyTypeObject* SwigPyObject_TypeOnce(void);
+
+#ifdef SWIGPYTHON_BUILTIN
+static swig_type_info *SwigPyObject_stype = 0;
+SWIGRUNTIME PyTypeObject*
+SwigPyObject_type(void) {
+    SwigPyClientData *cd;
+    assert(SwigPyObject_stype);
+    cd = (SwigPyClientData*) SwigPyObject_stype->clientdata;
+    assert(cd);
+    assert(cd->pytype);
+    return cd->pytype;
+}
+#else
+SWIGRUNTIME PyTypeObject*
+SwigPyObject_type(void) {
+  static PyTypeObject *SWIG_STATIC_POINTER(type) = SwigPyObject_TypeOnce();
+  return type;
+}
+#endif
+
+SWIGRUNTIMEINLINE int
+SwigPyObject_Check(PyObject *op) {
+#ifdef SWIGPYTHON_BUILTIN
+  PyTypeObject *target_tp = SwigPyObject_type();
+  if (PyType_IsSubtype(op->ob_type, target_tp))
+    return 1;
+  return (strcmp(op->ob_type->tp_name, "SwigPyObject") == 0);
+#else
+  return (Py_TYPE(op) == SwigPyObject_type())
+    || (strcmp(Py_TYPE(op)->tp_name,"SwigPyObject") == 0);
+#endif
+}
+
+SWIGRUNTIME PyObject *
+SwigPyObject_New(void *ptr, swig_type_info *ty, int own);
+
+SWIGRUNTIME void
+SwigPyObject_dealloc(PyObject *v)
+{
+  SwigPyObject *sobj = (SwigPyObject *) v;
+  PyObject *next = sobj->next;
+  if (sobj->own == SWIG_POINTER_OWN) {
+    swig_type_info *ty = sobj->ty;
+    SwigPyClientData *data = ty ? (SwigPyClientData *) ty->clientdata : 0;
+    PyObject *destroy = data ? data->destroy : 0;
+    if (destroy) {
+      /* destroy is always a VARARGS method */
+      PyObject *res;
+      if (data->delargs) {
+	/* we need to create a temporary object to carry the destroy operation */
+	PyObject *tmp = SwigPyObject_New(sobj->ptr, ty, 0);
+	res = SWIG_Python_CallFunctor(destroy, tmp);
+	Py_DECREF(tmp);
+      } else {
+	PyCFunction meth = PyCFunction_GET_FUNCTION(destroy);
+	PyObject *mself = PyCFunction_GET_SELF(destroy);
+	res = ((*meth)(mself, v));
+      }
+      Py_XDECREF(res);
+    } 
+#if !defined(SWIG_PYTHON_SILENT_MEMLEAK)
+    else {
+      const char *name = SWIG_TypePrettyName(ty);
+      printf("swig/python detected a memory leak of type '%s', no destructor found.\n", (name ? name : "unknown"));
+    }
+#endif
+  } 
+  Py_XDECREF(next);
+  PyObject_DEL(v);
+}
+
+SWIGRUNTIME PyObject* 
+SwigPyObject_append(PyObject* v, PyObject* next)
+{
+  SwigPyObject *sobj = (SwigPyObject *) v;
+#ifndef METH_O
+  PyObject *tmp = 0;
+  if (!PyArg_ParseTuple(next,(char *)"O:append", &tmp)) return NULL;
+  next = tmp;
+#endif
+  if (!SwigPyObject_Check(next)) {
+    return NULL;
+  }
+  sobj->next = next;
+  Py_INCREF(next);
+  return SWIG_Py_Void();
+}
+
+SWIGRUNTIME PyObject* 
+#ifdef METH_NOARGS
+SwigPyObject_next(PyObject* v)
+#else
+SwigPyObject_next(PyObject* v, PyObject *SWIGUNUSEDPARM(args))
+#endif
+{
+  SwigPyObject *sobj = (SwigPyObject *) v;
+  if (sobj->next) {    
+    Py_INCREF(sobj->next);
+    return sobj->next;
+  } else {
+    return SWIG_Py_Void();
+  }
+}
+
+SWIGINTERN PyObject*
+#ifdef METH_NOARGS
+SwigPyObject_disown(PyObject *v)
+#else
+SwigPyObject_disown(PyObject* v, PyObject *SWIGUNUSEDPARM(args))
+#endif
+{
+  SwigPyObject *sobj = (SwigPyObject *)v;
+  sobj->own = 0;
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject*
+#ifdef METH_NOARGS
+SwigPyObject_acquire(PyObject *v)
+#else
+SwigPyObject_acquire(PyObject* v, PyObject *SWIGUNUSEDPARM(args))
+#endif
+{
+  SwigPyObject *sobj = (SwigPyObject *)v;
+  sobj->own = SWIG_POINTER_OWN;
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject*
+SwigPyObject_own(PyObject *v, PyObject *args)
+{
+  PyObject *val = 0;
+#if (PY_VERSION_HEX < 0x02020000)
+  if (!PyArg_ParseTuple(args,(char *)"|O:own",&val))
+#else
+  if (!PyArg_UnpackTuple(args, (char *)"own", 0, 1, &val)) 
+#endif
+    {
+      return NULL;
+    } 
+  else
+    {
+      SwigPyObject *sobj = (SwigPyObject *)v;
+      PyObject *obj = PyBool_FromLong(sobj->own);
+      if (val) {
+#ifdef METH_NOARGS
+	if (PyObject_IsTrue(val)) {
+	  SwigPyObject_acquire(v);
+	} else {
+	  SwigPyObject_disown(v);
+	}
+#else
+	if (PyObject_IsTrue(val)) {
+	  SwigPyObject_acquire(v,args);
+	} else {
+	  SwigPyObject_disown(v,args);
+	}
+#endif
+      } 
+      return obj;
+    }
+}
+
+#ifdef METH_O
+static PyMethodDef
+swigobject_methods[] = {
+  {(char *)"disown",  (PyCFunction)SwigPyObject_disown,  METH_NOARGS,  (char *)"releases ownership of the pointer"},
+  {(char *)"acquire", (PyCFunction)SwigPyObject_acquire, METH_NOARGS,  (char *)"aquires ownership of the pointer"},
+  {(char *)"own",     (PyCFunction)SwigPyObject_own,     METH_VARARGS, (char *)"returns/sets ownership of the pointer"},
+  {(char *)"append",  (PyCFunction)SwigPyObject_append,  METH_O,       (char *)"appends another 'this' object"},
+  {(char *)"next",    (PyCFunction)SwigPyObject_next,    METH_NOARGS,  (char *)"returns the next 'this' object"},
+  {(char *)"__repr__",(PyCFunction)SwigPyObject_repr,    METH_NOARGS,  (char *)"returns object representation"},
+  {0, 0, 0, 0}  
+};
+#else
+static PyMethodDef
+swigobject_methods[] = {
+  {(char *)"disown",  (PyCFunction)SwigPyObject_disown,  METH_VARARGS,  (char *)"releases ownership of the pointer"},
+  {(char *)"acquire", (PyCFunction)SwigPyObject_acquire, METH_VARARGS,  (char *)"aquires ownership of the pointer"},
+  {(char *)"own",     (PyCFunction)SwigPyObject_own,     METH_VARARGS,  (char *)"returns/sets ownership of the pointer"},
+  {(char *)"append",  (PyCFunction)SwigPyObject_append,  METH_VARARGS,  (char *)"appends another 'this' object"},
+  {(char *)"next",    (PyCFunction)SwigPyObject_next,    METH_VARARGS,  (char *)"returns the next 'this' object"},
+  {(char *)"__repr__",(PyCFunction)SwigPyObject_repr,   METH_VARARGS,  (char *)"returns object representation"},
+  {0, 0, 0, 0}  
+};
+#endif
+
+#if PY_VERSION_HEX < 0x02020000
+SWIGINTERN PyObject *
+SwigPyObject_getattr(SwigPyObject *sobj,char *name)
+{
+  return Py_FindMethod(swigobject_methods, (PyObject *)sobj, name);
+}
+#endif
+
+SWIGRUNTIME PyTypeObject*
+SwigPyObject_TypeOnce(void) {
+  static char swigobject_doc[] = "Swig object carries a C/C++ instance pointer";
+
+  static PyNumberMethods SwigPyObject_as_number = {
+    (binaryfunc)0, /*nb_add*/
+    (binaryfunc)0, /*nb_subtract*/
+    (binaryfunc)0, /*nb_multiply*/
+    /* nb_divide removed in Python 3 */
+#if PY_VERSION_HEX < 0x03000000
+    (binaryfunc)0, /*nb_divide*/
+#endif
+    (binaryfunc)0, /*nb_remainder*/
+    (binaryfunc)0, /*nb_divmod*/
+    (ternaryfunc)0,/*nb_power*/
+    (unaryfunc)0,  /*nb_negative*/
+    (unaryfunc)0,  /*nb_positive*/
+    (unaryfunc)0,  /*nb_absolute*/
+    (inquiry)0,    /*nb_nonzero*/
+    0,		   /*nb_invert*/
+    0,		   /*nb_lshift*/
+    0,		   /*nb_rshift*/
+    0,		   /*nb_and*/
+    0,		   /*nb_xor*/
+    0,		   /*nb_or*/
+#if PY_VERSION_HEX < 0x03000000
+    0,   /*nb_coerce*/
+#endif
+    (unaryfunc)SwigPyObject_long, /*nb_int*/
+#if PY_VERSION_HEX < 0x03000000
+    (unaryfunc)SwigPyObject_long, /*nb_long*/
+#else
+    0, /*nb_reserved*/
+#endif
+    (unaryfunc)0,                 /*nb_float*/
+#if PY_VERSION_HEX < 0x03000000
+    (unaryfunc)SwigPyObject_oct,  /*nb_oct*/
+    (unaryfunc)SwigPyObject_hex,  /*nb_hex*/
+#endif
+#if PY_VERSION_HEX >= 0x03000000 /* 3.0 */
+    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 /* nb_inplace_add -> nb_index, nb_inplace_divide removed */
+#elif PY_VERSION_HEX >= 0x02050000 /* 2.5.0 */
+    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 /* nb_inplace_add -> nb_index */
+#elif PY_VERSION_HEX >= 0x02020000 /* 2.2.0 */
+    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 /* nb_inplace_add -> nb_inplace_true_divide */
+#elif PY_VERSION_HEX >= 0x02000000 /* 2.0.0 */
+    0,0,0,0,0,0,0,0,0,0,0 /* nb_inplace_add -> nb_inplace_or */
+#endif
+  };
+
+  static PyTypeObject swigpyobject_type;
+  static int type_init = 0;
+  if (!type_init) {
+    const PyTypeObject tmp = {
+      /* PyObject header changed in Python 3 */
+#if PY_VERSION_HEX >= 0x03000000
+      PyVarObject_HEAD_INIT(NULL, 0)
+#else
+      PyObject_HEAD_INIT(NULL)
+      0,                                    /* ob_size */
+#endif
+      (char *)"SwigPyObject",               /* tp_name */
+      sizeof(SwigPyObject),                 /* tp_basicsize */
+      0,                                    /* tp_itemsize */
+      (destructor)SwigPyObject_dealloc,     /* tp_dealloc */
+      (printfunc)SwigPyObject_print,        /* tp_print */
+#if PY_VERSION_HEX < 0x02020000
+      (getattrfunc)SwigPyObject_getattr,    /* tp_getattr */
+#else
+      (getattrfunc)0,                       /* tp_getattr */
+#endif
+      (setattrfunc)0,                       /* tp_setattr */
+#if PY_VERSION_HEX >= 0x03000000
+    0, /* tp_reserved in 3.0.1, tp_compare in 3.0.0 but not used */
+#else
+      (cmpfunc)SwigPyObject_compare,        /* tp_compare */
+#endif
+      (reprfunc)SwigPyObject_repr,          /* tp_repr */
+      &SwigPyObject_as_number,              /* tp_as_number */
+      0,                                    /* tp_as_sequence */
+      0,                                    /* tp_as_mapping */
+      (hashfunc)0,                          /* tp_hash */
+      (ternaryfunc)0,                       /* tp_call */
+      (reprfunc)SwigPyObject_str,           /* tp_str */
+      PyObject_GenericGetAttr,              /* tp_getattro */
+      0,                                    /* tp_setattro */
+      0,                                    /* tp_as_buffer */
+      Py_TPFLAGS_DEFAULT,                   /* tp_flags */
+      swigobject_doc,                       /* tp_doc */
+      0,                                    /* tp_traverse */
+      0,                                    /* tp_clear */
+      (richcmpfunc)SwigPyObject_richcompare,/* tp_richcompare */
+      0,                                    /* tp_weaklistoffset */
+#if PY_VERSION_HEX >= 0x02020000
+      0,                                    /* tp_iter */
+      0,                                    /* tp_iternext */
+      swigobject_methods,                   /* tp_methods */
+      0,                                    /* tp_members */
+      0,                                    /* tp_getset */
+      0,                                    /* tp_base */
+      0,                                    /* tp_dict */
+      0,                                    /* tp_descr_get */
+      0,                                    /* tp_descr_set */
+      0,                                    /* tp_dictoffset */
+      0,                                    /* tp_init */
+      0,                                    /* tp_alloc */
+      0,                                    /* tp_new */
+      0,                                    /* tp_free */
+      0,                                    /* tp_is_gc */
+      0,                                    /* tp_bases */
+      0,                                    /* tp_mro */
+      0,                                    /* tp_cache */
+      0,                                    /* tp_subclasses */
+      0,                                    /* tp_weaklist */
+#endif
+#if PY_VERSION_HEX >= 0x02030000
+      0,                                    /* tp_del */
+#endif
+#if PY_VERSION_HEX >= 0x02060000
+      0,                                    /* tp_version */
+#endif
+#ifdef COUNT_ALLOCS
+      0,0,0,0                               /* tp_alloc -> tp_next */
+#endif
+    };
+    swigpyobject_type = tmp;
+    type_init = 1;
+#if PY_VERSION_HEX < 0x02020000
+    swigpyobject_type.ob_type = &PyType_Type;
+#else
+    if (PyType_Ready(&swigpyobject_type) < 0)
+      return NULL;
+#endif
+  }
+  return &swigpyobject_type;
+}
+
+SWIGRUNTIME PyObject *
+SwigPyObject_New(void *ptr, swig_type_info *ty, int own)
+{
+  SwigPyObject *sobj = PyObject_NEW(SwigPyObject, SwigPyObject_type());
+  if (sobj) {
+    sobj->ptr  = ptr;
+    sobj->ty   = ty;
+    sobj->own  = own;
+    sobj->next = 0;
+  }
+  return (PyObject *)sobj;
+}
+
+/* -----------------------------------------------------------------------------
+ * Implements a simple Swig Packed type, and use it instead of string
+ * ----------------------------------------------------------------------------- */
+
+typedef struct {
+  PyObject_HEAD
+  void *pack;
+  swig_type_info *ty;
+  size_t size;
+} SwigPyPacked;
+
+SWIGRUNTIME int
+SwigPyPacked_print(SwigPyPacked *v, FILE *fp, int SWIGUNUSEDPARM(flags))
+{
+  char result[SWIG_BUFFER_SIZE];
+  fputs("<Swig Packed ", fp); 
+  if (SWIG_PackDataName(result, v->pack, v->size, 0, sizeof(result))) {
+    fputs("at ", fp); 
+    fputs(result, fp); 
+  }
+  fputs(v->ty->name,fp); 
+  fputs(">", fp);
+  return 0; 
+}
+  
+SWIGRUNTIME PyObject *
+SwigPyPacked_repr(SwigPyPacked *v)
+{
+  char result[SWIG_BUFFER_SIZE];
+  if (SWIG_PackDataName(result, v->pack, v->size, 0, sizeof(result))) {
+    return SWIG_Python_str_FromFormat("<Swig Packed at %s%s>", result, v->ty->name);
+  } else {
+    return SWIG_Python_str_FromFormat("<Swig Packed %s>", v->ty->name);
+  }  
+}
+
+SWIGRUNTIME PyObject *
+SwigPyPacked_str(SwigPyPacked *v)
+{
+  char result[SWIG_BUFFER_SIZE];
+  if (SWIG_PackDataName(result, v->pack, v->size, 0, sizeof(result))){
+    return SWIG_Python_str_FromFormat("%s%s", result, v->ty->name);
+  } else {
+    return SWIG_Python_str_FromChar(v->ty->name);
+  }  
+}
+
+SWIGRUNTIME int
+SwigPyPacked_compare(SwigPyPacked *v, SwigPyPacked *w)
+{
+  size_t i = v->size;
+  size_t j = w->size;
+  int s = (i < j) ? -1 : ((i > j) ? 1 : 0);
+  return s ? s : strncmp((char *)v->pack, (char *)w->pack, 2*v->size);
+}
+
+SWIGRUNTIME PyTypeObject* SwigPyPacked_TypeOnce(void);
+
+SWIGRUNTIME PyTypeObject*
+SwigPyPacked_type(void) {
+  static PyTypeObject *SWIG_STATIC_POINTER(type) = SwigPyPacked_TypeOnce();
+  return type;
+}
+
+SWIGRUNTIMEINLINE int
+SwigPyPacked_Check(PyObject *op) {
+  return ((op)->ob_type == SwigPyPacked_TypeOnce()) 
+    || (strcmp((op)->ob_type->tp_name,"SwigPyPacked") == 0);
+}
+
+SWIGRUNTIME void
+SwigPyPacked_dealloc(PyObject *v)
+{
+  if (SwigPyPacked_Check(v)) {
+    SwigPyPacked *sobj = (SwigPyPacked *) v;
+    free(sobj->pack);
+  }
+  PyObject_DEL(v);
+}
+
+SWIGRUNTIME PyTypeObject*
+SwigPyPacked_TypeOnce(void) {
+  static char swigpacked_doc[] = "Swig object carries a C/C++ instance pointer";
+  static PyTypeObject swigpypacked_type;
+  static int type_init = 0;
+  if (!type_init) {
+    const PyTypeObject tmp = {
+      /* PyObject header changed in Python 3 */
+#if PY_VERSION_HEX>=0x03000000
+      PyVarObject_HEAD_INIT(NULL, 0)
+#else
+      PyObject_HEAD_INIT(NULL)
+      0,                                    /* ob_size */
+#endif
+      (char *)"SwigPyPacked",               /* tp_name */
+      sizeof(SwigPyPacked),                 /* tp_basicsize */
+      0,                                    /* tp_itemsize */
+      (destructor)SwigPyPacked_dealloc,     /* tp_dealloc */
+      (printfunc)SwigPyPacked_print,        /* tp_print */
+      (getattrfunc)0,                       /* tp_getattr */
+      (setattrfunc)0,                       /* tp_setattr */
+#if PY_VERSION_HEX>=0x03000000
+      0, /* tp_reserved in 3.0.1 */
+#else
+      (cmpfunc)SwigPyPacked_compare,        /* tp_compare */
+#endif
+      (reprfunc)SwigPyPacked_repr,          /* tp_repr */
+      0,                                    /* tp_as_number */
+      0,                                    /* tp_as_sequence */
+      0,                                    /* tp_as_mapping */
+      (hashfunc)0,                          /* tp_hash */
+      (ternaryfunc)0,                       /* tp_call */
+      (reprfunc)SwigPyPacked_str,           /* tp_str */
+      PyObject_GenericGetAttr,              /* tp_getattro */
+      0,                                    /* tp_setattro */
+      0,                                    /* tp_as_buffer */
+      Py_TPFLAGS_DEFAULT,                   /* tp_flags */
+      swigpacked_doc,                       /* tp_doc */
+      0,                                    /* tp_traverse */
+      0,                                    /* tp_clear */
+      0,                                    /* tp_richcompare */
+      0,                                    /* tp_weaklistoffset */
+#if PY_VERSION_HEX >= 0x02020000
+      0,                                    /* tp_iter */
+      0,                                    /* tp_iternext */
+      0,                                    /* tp_methods */
+      0,                                    /* tp_members */
+      0,                                    /* tp_getset */
+      0,                                    /* tp_base */
+      0,                                    /* tp_dict */
+      0,                                    /* tp_descr_get */
+      0,                                    /* tp_descr_set */
+      0,                                    /* tp_dictoffset */
+      0,                                    /* tp_init */
+      0,                                    /* tp_alloc */
+      0,                                    /* tp_new */
+      0,                                    /* tp_free */
+      0,                                    /* tp_is_gc */
+      0,                                    /* tp_bases */
+      0,                                    /* tp_mro */
+      0,                                    /* tp_cache */
+      0,                                    /* tp_subclasses */
+      0,                                    /* tp_weaklist */
+#endif
+#if PY_VERSION_HEX >= 0x02030000
+      0,                                    /* tp_del */
+#endif
+#if PY_VERSION_HEX >= 0x02060000
+      0,                                    /* tp_version */
+#endif
+#ifdef COUNT_ALLOCS
+      0,0,0,0                               /* tp_alloc -> tp_next */
+#endif
+    };
+    swigpypacked_type = tmp;
+    type_init = 1;
+#if PY_VERSION_HEX < 0x02020000
+    swigpypacked_type.ob_type = &PyType_Type;
+#else
+    if (PyType_Ready(&swigpypacked_type) < 0)
+      return NULL;
+#endif
+  }
+  return &swigpypacked_type;
+}
+
+SWIGRUNTIME PyObject *
+SwigPyPacked_New(void *ptr, size_t size, swig_type_info *ty)
+{
+  SwigPyPacked *sobj = PyObject_NEW(SwigPyPacked, SwigPyPacked_type());
+  if (sobj) {
+    void *pack = malloc(size);
+    if (pack) {
+      memcpy(pack, ptr, size);
+      sobj->pack = pack;
+      sobj->ty   = ty;
+      sobj->size = size;
+    } else {
+      PyObject_DEL((PyObject *) sobj);
+      sobj = 0;
+    }
+  }
+  return (PyObject *) sobj;
+}
+
+SWIGRUNTIME swig_type_info *
+SwigPyPacked_UnpackData(PyObject *obj, void *ptr, size_t size)
+{
+  if (SwigPyPacked_Check(obj)) {
+    SwigPyPacked *sobj = (SwigPyPacked *)obj;
+    if (sobj->size != size) return 0;
+    memcpy(ptr, sobj->pack, size);
+    return sobj->ty;
+  } else {
+    return 0;
+  }
+}
+
+/* -----------------------------------------------------------------------------
+ * pointers/data manipulation
+ * ----------------------------------------------------------------------------- */
+
+SWIGRUNTIMEINLINE PyObject *
+_SWIG_This(void)
+{
+    return SWIG_Python_str_FromChar("this");
+}
+
+static PyObject *swig_this = NULL;
+
+SWIGRUNTIME PyObject *
+SWIG_This(void)
+{
+  if (swig_this == NULL)
+    swig_this = _SWIG_This();
+  return swig_this;
+}
+
+/* #define SWIG_PYTHON_SLOW_GETSET_THIS */
+
+/* TODO: I don't know how to implement the fast getset in Python 3 right now */
+#if PY_VERSION_HEX>=0x03000000
+#define SWIG_PYTHON_SLOW_GETSET_THIS 
+#endif
+
+SWIGRUNTIME SwigPyObject *
+SWIG_Python_GetSwigThis(PyObject *pyobj) 
+{
+  PyObject *obj;
+
+  if (SwigPyObject_Check(pyobj))
+    return (SwigPyObject *) pyobj;
+
+#ifdef SWIGPYTHON_BUILTIN
+  (void)obj;
+# ifdef PyWeakref_CheckProxy
+  if (PyWeakref_CheckProxy(pyobj)) {
+    pyobj = PyWeakref_GET_OBJECT(pyobj);
+    if (pyobj && SwigPyObject_Check(pyobj))
+      return (SwigPyObject*) pyobj;
+  }
+# endif
+  return NULL;
+#else
+
+  obj = 0;
+
+#if (!defined(SWIG_PYTHON_SLOW_GETSET_THIS) && (PY_VERSION_HEX >= 0x02030000))
+  if (PyInstance_Check(pyobj)) {
+    obj = _PyInstance_Lookup(pyobj, SWIG_This());      
+  } else {
+    PyObject **dictptr = _PyObject_GetDictPtr(pyobj);
+    if (dictptr != NULL) {
+      PyObject *dict = *dictptr;
+      obj = dict ? PyDict_GetItem(dict, SWIG_This()) : 0;
+    } else {
+#ifdef PyWeakref_CheckProxy
+      if (PyWeakref_CheckProxy(pyobj)) {
+	PyObject *wobj = PyWeakref_GET_OBJECT(pyobj);
+	return wobj ? SWIG_Python_GetSwigThis(wobj) : 0;
+      }
+#endif
+      obj = PyObject_GetAttr(pyobj,SWIG_This());
+      if (obj) {
+	Py_DECREF(obj);
+      } else {
+	if (PyErr_Occurred()) PyErr_Clear();
+	return 0;
+      }
+    }
+  }
+#else
+  obj = PyObject_GetAttr(pyobj,SWIG_This());
+  if (obj) {
+    Py_DECREF(obj);
+  } else {
+    if (PyErr_Occurred()) PyErr_Clear();
+    return 0;
+  }
+#endif
+  if (obj && !SwigPyObject_Check(obj)) {
+    /* a PyObject is called 'this', try to get the 'real this'
+       SwigPyObject from it */ 
+    return SWIG_Python_GetSwigThis(obj);
+  }
+  return (SwigPyObject *)obj;
+#endif
+}
+
+/* Acquire a pointer value */
+
+SWIGRUNTIME int
+SWIG_Python_AcquirePtr(PyObject *obj, int own) {
+  if (own == SWIG_POINTER_OWN) {
+    SwigPyObject *sobj = SWIG_Python_GetSwigThis(obj);
+    if (sobj) {
+      int oldown = sobj->own;
+      sobj->own = own;
+      return oldown;
+    }
+  }
+  return 0;
+}
+
+/* Convert a pointer value */
+
+SWIGRUNTIME int
+SWIG_Python_ConvertPtrAndOwn(PyObject *obj, void **ptr, swig_type_info *ty, int flags, int *own) {
+  int res;
+  SwigPyObject *sobj;
+
+  if (!obj)
+    return SWIG_ERROR;
+  if (obj == Py_None) {
+    if (ptr)
+      *ptr = 0;
+    return SWIG_OK;
+  }
+
+  res = SWIG_ERROR;
+
+  sobj = SWIG_Python_GetSwigThis(obj);
+  if (own)
+    *own = 0;
+  while (sobj) {
+    void *vptr = sobj->ptr;
+    if (ty) {
+      swig_type_info *to = sobj->ty;
+      if (to == ty) {
+        /* no type cast needed */
+        if (ptr) *ptr = vptr;
+        break;
+      } else {
+        swig_cast_info *tc = SWIG_TypeCheck(to->name,ty);
+        if (!tc) {
+          sobj = (SwigPyObject *)sobj->next;
+        } else {
+          if (ptr) {
+            int newmemory = 0;
+            *ptr = SWIG_TypeCast(tc,vptr,&newmemory);
+            if (newmemory == SWIG_CAST_NEW_MEMORY) {
+              assert(own); /* badly formed typemap which will lead to a memory leak - it must set and use own to delete *ptr */
+              if (own)
+                *own = *own | SWIG_CAST_NEW_MEMORY;
+            }
+          }
+          break;
+        }
+      }
+    } else {
+      if (ptr) *ptr = vptr;
+      break;
+    }
+  }
+  if (sobj) {
+    if (own)
+      *own = *own | sobj->own;
+    if (flags & SWIG_POINTER_DISOWN) {
+      sobj->own = 0;
+    }
+    res = SWIG_OK;
+  } else {
+    if (flags & SWIG_POINTER_IMPLICIT_CONV) {
+      SwigPyClientData *data = ty ? (SwigPyClientData *) ty->clientdata : 0;
+      if (data && !data->implicitconv) {
+        PyObject *klass = data->klass;
+        if (klass) {
+          PyObject *impconv;
+          data->implicitconv = 1; /* avoid recursion and call 'explicit' constructors*/
+          impconv = SWIG_Python_CallFunctor(klass, obj);
+          data->implicitconv = 0;
+          if (PyErr_Occurred()) {
+            PyErr_Clear();
+            impconv = 0;
+          }
+          if (impconv) {
+            SwigPyObject *iobj = SWIG_Python_GetSwigThis(impconv);
+            if (iobj) {
+              void *vptr;
+              res = SWIG_Python_ConvertPtrAndOwn((PyObject*)iobj, &vptr, ty, 0, 0);
+              if (SWIG_IsOK(res)) {
+                if (ptr) {
+                  *ptr = vptr;
+                  /* transfer the ownership to 'ptr' */
+                  iobj->own = 0;
+                  res = SWIG_AddCast(res);
+                  res = SWIG_AddNewMask(res);
+                } else {
+                  res = SWIG_AddCast(res);		    
+                }
+              }
+            }
+            Py_DECREF(impconv);
+          }
+        }
+      }
+    }
+  }
+  return res;
+}
+
+/* Convert a function ptr value */
+
+SWIGRUNTIME int
+SWIG_Python_ConvertFunctionPtr(PyObject *obj, void **ptr, swig_type_info *ty) {
+  if (!PyCFunction_Check(obj)) {
+    return SWIG_ConvertPtr(obj, ptr, ty, 0);
+  } else {
+    void *vptr = 0;
+    
+    /* here we get the method pointer for callbacks */
+    const char *doc = (((PyCFunctionObject *)obj) -> m_ml -> ml_doc);
+    const char *desc = doc ? strstr(doc, "swig_ptr: ") : 0;
+    if (desc)
+      desc = ty ? SWIG_UnpackVoidPtr(desc + 10, &vptr, ty->name) : 0;
+    if (!desc) 
+      return SWIG_ERROR;
+    if (ty) {
+      swig_cast_info *tc = SWIG_TypeCheck(desc,ty);
+      if (tc) {
+        int newmemory = 0;
+        *ptr = SWIG_TypeCast(tc,vptr,&newmemory);
+        assert(!newmemory); /* newmemory handling not yet implemented */
+      } else {
+        return SWIG_ERROR;
+      }
+    } else {
+      *ptr = vptr;
+    }
+    return SWIG_OK;
+  }
+}
+
+/* Convert a packed value value */
+
+SWIGRUNTIME int
+SWIG_Python_ConvertPacked(PyObject *obj, void *ptr, size_t sz, swig_type_info *ty) {
+  swig_type_info *to = SwigPyPacked_UnpackData(obj, ptr, sz);
+  if (!to) return SWIG_ERROR;
+  if (ty) {
+    if (to != ty) {
+      /* check type cast? */
+      swig_cast_info *tc = SWIG_TypeCheck(to->name,ty);
+      if (!tc) return SWIG_ERROR;
+    }
+  }
+  return SWIG_OK;
+}  
+
+/* -----------------------------------------------------------------------------
+ * Create a new pointer object
+ * ----------------------------------------------------------------------------- */
+
+/*
+  Create a new instance object, without calling __init__, and set the
+  'this' attribute.
+*/
+
+SWIGRUNTIME PyObject* 
+SWIG_Python_NewShadowInstance(SwigPyClientData *data, PyObject *swig_this)
+{
+#if (PY_VERSION_HEX >= 0x02020000)
+  PyObject *inst = 0;
+  PyObject *newraw = data->newraw;
+  if (newraw) {
+    inst = PyObject_Call(newraw, data->newargs, NULL);
+    if (inst) {
+#if !defined(SWIG_PYTHON_SLOW_GETSET_THIS)
+      PyObject **dictptr = _PyObject_GetDictPtr(inst);
+      if (dictptr != NULL) {
+	PyObject *dict = *dictptr;
+	if (dict == NULL) {
+	  dict = PyDict_New();
+	  *dictptr = dict;
+	  PyDict_SetItem(dict, SWIG_This(), swig_this);
+	}
+      }
+#else
+      PyObject *key = SWIG_This();
+      PyObject_SetAttr(inst, key, swig_this);
+#endif
+    }
+  } else {
+#if PY_VERSION_HEX >= 0x03000000
+    inst = PyBaseObject_Type.tp_new((PyTypeObject*) data->newargs, Py_None, Py_None);
+    PyObject_SetAttr(inst, SWIG_This(), swig_this);
+    Py_TYPE(inst)->tp_flags &= ~Py_TPFLAGS_VALID_VERSION_TAG;
+#else
+    PyObject *dict = PyDict_New();
+    PyDict_SetItem(dict, SWIG_This(), swig_this);
+    inst = PyInstance_NewRaw(data->newargs, dict);
+    Py_DECREF(dict);
+#endif
+  }
+  return inst;
+#else
+#if (PY_VERSION_HEX >= 0x02010000)
+  PyObject *inst;
+  PyObject *dict = PyDict_New();
+  PyDict_SetItem(dict, SWIG_This(), swig_this);
+  inst = PyInstance_NewRaw(data->newargs, dict);
+  Py_DECREF(dict);
+  return (PyObject *) inst;
+#else
+  PyInstanceObject *inst = PyObject_NEW(PyInstanceObject, &PyInstance_Type);
+  if (inst == NULL) {
+    return NULL;
+  }
+  inst->in_class = (PyClassObject *)data->newargs;
+  Py_INCREF(inst->in_class);
+  inst->in_dict = PyDict_New();
+  if (inst->in_dict == NULL) {
+    Py_DECREF(inst);
+    return NULL;
+  }
+#ifdef Py_TPFLAGS_HAVE_WEAKREFS
+  inst->in_weakreflist = NULL;
+#endif
+#ifdef Py_TPFLAGS_GC
+  PyObject_GC_Init(inst);
+#endif
+  PyDict_SetItem(inst->in_dict, SWIG_This(), swig_this);
+  return (PyObject *) inst;
+#endif
+#endif
+}
+
+SWIGRUNTIME void
+SWIG_Python_SetSwigThis(PyObject *inst, PyObject *swig_this)
+{
+ PyObject *dict;
+#if (PY_VERSION_HEX >= 0x02020000) && !defined(SWIG_PYTHON_SLOW_GETSET_THIS)
+ PyObject **dictptr = _PyObject_GetDictPtr(inst);
+ if (dictptr != NULL) {
+   dict = *dictptr;
+   if (dict == NULL) {
+     dict = PyDict_New();
+     *dictptr = dict;
+   }
+   PyDict_SetItem(dict, SWIG_This(), swig_this);
+   return;
+ }
+#endif
+ dict = PyObject_GetAttrString(inst, (char*)"__dict__");
+ PyDict_SetItem(dict, SWIG_This(), swig_this);
+ Py_DECREF(dict);
+} 
+
+
+SWIGINTERN PyObject *
+SWIG_Python_InitShadowInstance(PyObject *args) {
+  PyObject *obj[2];
+  if (!SWIG_Python_UnpackTuple(args,(char*)"swiginit", 2, 2, obj)) {
+    return NULL;
+  } else {
+    SwigPyObject *sthis = SWIG_Python_GetSwigThis(obj[0]);
+    if (sthis) {
+      SwigPyObject_append((PyObject*) sthis, obj[1]);
+    } else {
+      SWIG_Python_SetSwigThis(obj[0], obj[1]);
+    }
+    return SWIG_Py_Void();
+  }
+}
+
+/* Create a new pointer object */
+
+SWIGRUNTIME PyObject *
+SWIG_Python_NewPointerObj(PyObject *self, void *ptr, swig_type_info *type, int flags) {
+  SwigPyClientData *clientdata;
+  PyObject * robj;
+  int own;
+
+  if (!ptr)
+    return SWIG_Py_Void();
+
+  clientdata = type ? (SwigPyClientData *)(type->clientdata) : 0;
+  own = (flags & SWIG_POINTER_OWN) ? SWIG_POINTER_OWN : 0;
+  if (clientdata && clientdata->pytype) {
+    SwigPyObject *newobj;
+    if (flags & SWIG_BUILTIN_TP_INIT) {
+      newobj = (SwigPyObject*) self;
+      if (newobj->ptr) {
+        PyObject *next_self = clientdata->pytype->tp_alloc(clientdata->pytype, 0);
+        while (newobj->next)
+	  newobj = (SwigPyObject *) newobj->next;
+        newobj->next = next_self;
+        newobj = (SwigPyObject *)next_self;
+      }
+    } else {
+      newobj = PyObject_New(SwigPyObject, clientdata->pytype);
+    }
+    if (newobj) {
+      newobj->ptr = ptr;
+      newobj->ty = type;
+      newobj->own = own;
+      newobj->next = 0;
+#ifdef SWIGPYTHON_BUILTIN
+      newobj->dict = 0;
+#endif
+      return (PyObject*) newobj;
+    }
+    return SWIG_Py_Void();
+  }
+
+  assert(!(flags & SWIG_BUILTIN_TP_INIT));
+
+  robj = SwigPyObject_New(ptr, type, own);
+  if (clientdata && !(flags & SWIG_POINTER_NOSHADOW)) {
+    PyObject *inst = SWIG_Python_NewShadowInstance(clientdata, robj);
+    if (inst) {
+      Py_DECREF(robj);
+      robj = inst;
+    }
+  }
+  return robj;
+}
+
+/* Create a new packed object */
+
+SWIGRUNTIMEINLINE PyObject *
+SWIG_Python_NewPackedObj(void *ptr, size_t sz, swig_type_info *type) {
+  return ptr ? SwigPyPacked_New((void *) ptr, sz, type) : SWIG_Py_Void();
+}
+
+/* -----------------------------------------------------------------------------*
+ *  Get type list 
+ * -----------------------------------------------------------------------------*/
+
+#ifdef SWIG_LINK_RUNTIME
+void *SWIG_ReturnGlobalTypeList(void *);
+#endif
+
+SWIGRUNTIME swig_module_info *
+SWIG_Python_GetModule(void) {
+  static void *type_pointer = (void *)0;
+  /* first check if module already created */
+  if (!type_pointer) {
+#ifdef SWIG_LINK_RUNTIME
+    type_pointer = SWIG_ReturnGlobalTypeList((void *)0);
+#else
+# ifdef SWIGPY_USE_CAPSULE
+    type_pointer = PyCapsule_Import(SWIGPY_CAPSULE_NAME, 0);
+# else
+    type_pointer = PyCObject_Import((char*)"swig_runtime_data" SWIG_RUNTIME_VERSION,
+				    (char*)"type_pointer" SWIG_TYPE_TABLE_NAME);
+# endif
+    if (PyErr_Occurred()) {
+      PyErr_Clear();
+      type_pointer = (void *)0;
+    }
+#endif
+  }
+  return (swig_module_info *) type_pointer;
+}
+
+#if PY_MAJOR_VERSION < 2
+/* PyModule_AddObject function was introduced in Python 2.0.  The following function
+   is copied out of Python/modsupport.c in python version 2.3.4 */
+SWIGINTERN int
+PyModule_AddObject(PyObject *m, char *name, PyObject *o)
+{
+  PyObject *dict;
+  if (!PyModule_Check(m)) {
+    PyErr_SetString(PyExc_TypeError,
+		    "PyModule_AddObject() needs module as first arg");
+    return SWIG_ERROR;
+  }
+  if (!o) {
+    PyErr_SetString(PyExc_TypeError,
+		    "PyModule_AddObject() needs non-NULL value");
+    return SWIG_ERROR;
+  }
+  
+  dict = PyModule_GetDict(m);
+  if (dict == NULL) {
+    /* Internal error -- modules must have a dict! */
+    PyErr_Format(PyExc_SystemError, "module '%s' has no __dict__",
+		 PyModule_GetName(m));
+    return SWIG_ERROR;
+  }
+  if (PyDict_SetItemString(dict, name, o))
+    return SWIG_ERROR;
+  Py_DECREF(o);
+  return SWIG_OK;
+}
+#endif
+
+SWIGRUNTIME void
+#ifdef SWIGPY_USE_CAPSULE
+SWIG_Python_DestroyModule(PyObject *obj)
+#else
+SWIG_Python_DestroyModule(void *vptr)
+#endif
+{
+#ifdef SWIGPY_USE_CAPSULE
+  swig_module_info *swig_module = (swig_module_info *) PyCapsule_GetPointer(obj, SWIGPY_CAPSULE_NAME);
+#else
+  swig_module_info *swig_module = (swig_module_info *) vptr;
+#endif
+  swig_type_info **types = swig_module->types;
+  size_t i;
+  for (i =0; i < swig_module->size; ++i) {
+    swig_type_info *ty = types[i];
+    if (ty->owndata) {
+      SwigPyClientData *data = (SwigPyClientData *) ty->clientdata;
+      if (data) SwigPyClientData_Del(data);
+    }
+  }
+  Py_DECREF(SWIG_This());
+  swig_this = NULL;
+}
+
+SWIGRUNTIME void
+SWIG_Python_SetModule(swig_module_info *swig_module) {
+#if PY_VERSION_HEX >= 0x03000000
+ /* Add a dummy module object into sys.modules */
+  PyObject *module = PyImport_AddModule((char*)"swig_runtime_data" SWIG_RUNTIME_VERSION);
+#else
+  static PyMethodDef swig_empty_runtime_method_table[] = { {NULL, NULL, 0, NULL} }; /* Sentinel */
+  PyObject *module = Py_InitModule((char*)"swig_runtime_data" SWIG_RUNTIME_VERSION, swig_empty_runtime_method_table);
+#endif
+#ifdef SWIGPY_USE_CAPSULE
+  PyObject *pointer = PyCapsule_New((void *) swig_module, SWIGPY_CAPSULE_NAME, SWIG_Python_DestroyModule);
+  if (pointer && module) {
+    PyModule_AddObject(module, (char*)"type_pointer_capsule" SWIG_TYPE_TABLE_NAME, pointer);
+  } else {
+    Py_XDECREF(pointer);
+  }
+#else
+  PyObject *pointer = PyCObject_FromVoidPtr((void *) swig_module, SWIG_Python_DestroyModule);
+  if (pointer && module) {
+    PyModule_AddObject(module, (char*)"type_pointer" SWIG_TYPE_TABLE_NAME, pointer);
+  } else {
+    Py_XDECREF(pointer);
+  }
+#endif
+}
+
+/* The python cached type query */
+SWIGRUNTIME PyObject *
+SWIG_Python_TypeCache(void) {
+  static PyObject *SWIG_STATIC_POINTER(cache) = PyDict_New();
+  return cache;
+}
+
+SWIGRUNTIME swig_type_info *
+SWIG_Python_TypeQuery(const char *type)
+{
+  PyObject *cache = SWIG_Python_TypeCache();
+  PyObject *key = SWIG_Python_str_FromChar(type); 
+  PyObject *obj = PyDict_GetItem(cache, key);
+  swig_type_info *descriptor;
+  if (obj) {
+#ifdef SWIGPY_USE_CAPSULE
+    descriptor = (swig_type_info *) PyCapsule_GetPointer(obj, NULL);
+#else
+    descriptor = (swig_type_info *) PyCObject_AsVoidPtr(obj);
+#endif
+  } else {
+    swig_module_info *swig_module = SWIG_Python_GetModule();
+    descriptor = SWIG_TypeQueryModule(swig_module, swig_module, type);
+    if (descriptor) {
+#ifdef SWIGPY_USE_CAPSULE
+      obj = PyCapsule_New((void*) descriptor, NULL, NULL);
+#else
+      obj = PyCObject_FromVoidPtr(descriptor, NULL);
+#endif
+      PyDict_SetItem(cache, key, obj);
+      Py_DECREF(obj);
+    }
+  }
+  Py_DECREF(key);
+  return descriptor;
+}
+
+/* 
+   For backward compatibility only
+*/
+#define SWIG_POINTER_EXCEPTION  0
+#define SWIG_arg_fail(arg)      SWIG_Python_ArgFail(arg)
+#define SWIG_MustGetPtr(p, type, argnum, flags)  SWIG_Python_MustGetPtr(p, type, argnum, flags)
+
+SWIGRUNTIME int
+SWIG_Python_AddErrMesg(const char* mesg, int infront)
+{  
+  if (PyErr_Occurred()) {
+    PyObject *type = 0;
+    PyObject *value = 0;
+    PyObject *traceback = 0;
+    PyErr_Fetch(&type, &value, &traceback);
+    if (value) {
+      char *tmp;
+      PyObject *old_str = PyObject_Str(value);
+      Py_XINCREF(type);
+      PyErr_Clear();
+      if (infront) {
+	PyErr_Format(type, "%s %s", mesg, tmp = SWIG_Python_str_AsChar(old_str));
+      } else {
+	PyErr_Format(type, "%s %s", tmp = SWIG_Python_str_AsChar(old_str), mesg);
+      }
+      SWIG_Python_str_DelForPy3(tmp);
+      Py_DECREF(old_str);
+    }
+    return 1;
+  } else {
+    return 0;
+  }
+}
+  
+SWIGRUNTIME int
+SWIG_Python_ArgFail(int argnum)
+{
+  if (PyErr_Occurred()) {
+    /* add information about failing argument */
+    char mesg[256];
+    PyOS_snprintf(mesg, sizeof(mesg), "argument number %d:", argnum);
+    return SWIG_Python_AddErrMesg(mesg, 1);
+  } else {
+    return 0;
+  }
+}
+
+SWIGRUNTIMEINLINE const char *
+SwigPyObject_GetDesc(PyObject *self)
+{
+  SwigPyObject *v = (SwigPyObject *)self;
+  swig_type_info *ty = v ? v->ty : 0;
+  return ty ? ty->str : (char*)"";
+}
+
+SWIGRUNTIME void
+SWIG_Python_TypeError(const char *type, PyObject *obj)
+{
+  if (type) {
+#if defined(SWIG_COBJECT_TYPES)
+    if (obj && SwigPyObject_Check(obj)) {
+      const char *otype = (const char *) SwigPyObject_GetDesc(obj);
+      if (otype) {
+	PyErr_Format(PyExc_TypeError, "a '%s' is expected, 'SwigPyObject(%s)' is received",
+		     type, otype);
+	return;
+      }
+    } else 
+#endif      
+    {
+      const char *otype = (obj ? obj->ob_type->tp_name : 0); 
+      if (otype) {
+	PyObject *str = PyObject_Str(obj);
+	const char *cstr = str ? SWIG_Python_str_AsChar(str) : 0;
+	if (cstr) {
+	  PyErr_Format(PyExc_TypeError, "a '%s' is expected, '%s(%s)' is received",
+		       type, otype, cstr);
+          SWIG_Python_str_DelForPy3(cstr);
+	} else {
+	  PyErr_Format(PyExc_TypeError, "a '%s' is expected, '%s' is received",
+		       type, otype);
+	}
+	Py_XDECREF(str);
+	return;
+      }
+    }   
+    PyErr_Format(PyExc_TypeError, "a '%s' is expected", type);
+  } else {
+    PyErr_Format(PyExc_TypeError, "unexpected type is received");
+  }
+}
+
+
+/* Convert a pointer value, signal an exception on a type mismatch */
+SWIGRUNTIME void *
+SWIG_Python_MustGetPtr(PyObject *obj, swig_type_info *ty, int SWIGUNUSEDPARM(argnum), int flags) {
+  void *result;
+  if (SWIG_Python_ConvertPtr(obj, &result, ty, flags) == -1) {
+    PyErr_Clear();
+#if SWIG_POINTER_EXCEPTION
+    if (flags) {
+      SWIG_Python_TypeError(SWIG_TypePrettyName(ty), obj);
+      SWIG_Python_ArgFail(argnum);
+    }
+#endif
+  }
+  return result;
+}
+
+SWIGRUNTIME int
+SWIG_Python_NonDynamicSetAttr(PyObject *obj, PyObject *name, PyObject *value) {
+  PyTypeObject *tp = obj->ob_type;
+  PyObject *descr;
+  PyObject *encoded_name;
+  descrsetfunc f;
+  int res;
+
+#ifdef Py_USING_UNICODE
+  if (PyString_Check(name)) {
+    name = PyUnicode_Decode(PyString_AsString(name), PyString_Size(name), NULL, NULL);
+    if (!name)
+      return -1;
+  } else if (!PyUnicode_Check(name))
+#else
+  if (!PyString_Check(name))
+#endif
+  {
+    PyErr_Format(PyExc_TypeError, "attribute name must be string, not '%.200s'", name->ob_type->tp_name);
+    return -1;
+  } else {
+    Py_INCREF(name);
+  }
+
+  if (!tp->tp_dict) {
+    if (PyType_Ready(tp) < 0)
+      goto done;
+  }
+
+  res = -1;
+  descr = _PyType_Lookup(tp, name);
+  f = NULL;
+  if (descr != NULL)
+    f = descr->ob_type->tp_descr_set;
+  if (!f) {
+    if (PyString_Check(name)) {
+      encoded_name = name;
+      Py_INCREF(name);
+    } else {
+      encoded_name = PyUnicode_AsUTF8String(name);
+    }
+    PyErr_Format(PyExc_AttributeError, "'%.100s' object has no attribute '%.200s'", tp->tp_name, PyString_AsString(encoded_name));
+    Py_DECREF(encoded_name);
+  } else {
+    res = f(descr, obj, value);
+  }
+  
+  done:
+  Py_DECREF(name);
+  return res;
+}
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#define SWIGPY_UNARYFUNC_CLOSURE(wrapper)	\
+SWIGINTERN PyObject *				\
+wrapper##_closure(PyObject *a) {		\
+  return wrapper(a, NULL);			\
+}
+
+#define SWIGPY_DESTRUCTOR_CLOSURE(wrapper)	\
+SWIGINTERN void					\
+wrapper##_closure(PyObject *a) {		\
+    SwigPyObject *sobj;				\
+    sobj = (SwigPyObject *)a;			\
+    if (sobj->own) {				\
+	PyObject *o = wrapper(a, NULL);		\
+	Py_XDECREF(o);				\
+    }						\
+}
+
+#define SWIGPY_INQUIRY_CLOSURE(wrapper)				\
+SWIGINTERN int							\
+wrapper##_closure(PyObject *a) {				\
+    PyObject *pyresult;						\
+    int result;							\
+    pyresult = wrapper(a, NULL);				\
+    result = pyresult && PyObject_IsTrue(pyresult) ? 1 : 0;	\
+    Py_XDECREF(pyresult);					\
+    return result;						\
+}
+
+#define SWIGPY_BINARYFUNC_CLOSURE(wrapper)	\
+SWIGINTERN PyObject *				\
+wrapper##_closure(PyObject *a, PyObject *b) {	\
+    PyObject *tuple, *result;			\
+    tuple = PyTuple_New(1);			\
+    assert(tuple);				\
+    PyTuple_SET_ITEM(tuple, 0, b);		\
+    Py_XINCREF(b);				\
+    result = wrapper(a, tuple);			\
+    Py_DECREF(tuple);				\
+    return result;				\
+}
+
+#define SWIGPY_TERNARYFUNC_CLOSURE(wrapper)			\
+SWIGINTERN PyObject *						\
+wrapper##_closure(PyObject *a, PyObject *b, PyObject *c) {	\
+    PyObject *tuple, *result;					\
+    tuple = PyTuple_New(2);					\
+    assert(tuple);						\
+    PyTuple_SET_ITEM(tuple, 0, b);				\
+    PyTuple_SET_ITEM(tuple, 1, c);				\
+    Py_XINCREF(b);						\
+    Py_XINCREF(c);						\
+    result = wrapper(a, tuple);					\
+    Py_DECREF(tuple);						\
+    return result;						\
+}
+
+#define SWIGPY_LENFUNC_CLOSURE(wrapper)			\
+SWIGINTERN Py_ssize_t					\
+wrapper##_closure(PyObject *a) {			\
+    PyObject *resultobj;				\
+    Py_ssize_t result;					\
+    resultobj = wrapper(a, NULL);			\
+    result = PyNumber_AsSsize_t(resultobj, NULL);	\
+    Py_DECREF(resultobj);				\
+    return result;					\
+}
+
+#define SWIGPY_SSIZESSIZEARGFUNC_CLOSURE(wrapper)		\
+SWIGINTERN PyObject *						\
+wrapper##_closure(PyObject *a, Py_ssize_t b, Py_ssize_t c) {	\
+    PyObject *tuple, *result;					\
+    tuple = PyTuple_New(2);					\
+    assert(tuple);						\
+    PyTuple_SET_ITEM(tuple, 0, _PyLong_FromSsize_t(b));		\
+    PyTuple_SET_ITEM(tuple, 1, _PyLong_FromSsize_t(c));		\
+    result = wrapper(a, tuple);					\
+    Py_DECREF(tuple);						\
+    return result;						\
+}
+
+#define SWIGPY_SSIZESSIZEOBJARGPROC_CLOSURE(wrapper)			\
+SWIGINTERN int								\
+wrapper##_closure(PyObject *a, Py_ssize_t b, Py_ssize_t c, PyObject *d) { \
+    PyObject *tuple, *resultobj;					\
+    int result;								\
+    tuple = PyTuple_New(d ? 3 : 2);					\
+    assert(tuple);							\
+    PyTuple_SET_ITEM(tuple, 0, _PyLong_FromSsize_t(b));			\
+    PyTuple_SET_ITEM(tuple, 1, _PyLong_FromSsize_t(c));			\
+    if (d) {								\
+        PyTuple_SET_ITEM(tuple, 2, d);					\
+        Py_INCREF(d);							\
+    }									\
+    resultobj = wrapper(a, tuple);					\
+    result = resultobj ? 0 : -1;					\
+    Py_DECREF(tuple);							\
+    Py_XDECREF(resultobj);						\
+    return result;							\
+}
+
+#define SWIGPY_SSIZEARGFUNC_CLOSURE(wrapper)		\
+SWIGINTERN PyObject *					\
+wrapper##_closure(PyObject *a, Py_ssize_t b) {		\
+    PyObject *tuple, *result;				\
+    tuple = PyTuple_New(1);				\
+    assert(tuple);					\
+    PyTuple_SET_ITEM(tuple, 0, _PyLong_FromSsize_t(b));	\
+    result = wrapper(a, tuple);				\
+    Py_DECREF(tuple);					\
+    return result;					\
+}
+
+#define SWIGPY_FUNPACK_SSIZEARGFUNC_CLOSURE(wrapper)		\
+SWIGINTERN PyObject *					\
+wrapper##_closure(PyObject *a, Py_ssize_t b) {		\
+    PyObject *arg, *result;				\
+    arg = _PyLong_FromSsize_t(b);			\
+    result = wrapper(a, arg);				\
+    Py_DECREF(arg);					\
+    return result;					\
+}
+
+#define SWIGPY_SSIZEOBJARGPROC_CLOSURE(wrapper)			\
+SWIGINTERN int							\
+wrapper##_closure(PyObject *a, Py_ssize_t b, PyObject *c) {	\
+    PyObject *tuple, *resultobj;				\
+    int result;							\
+    tuple = PyTuple_New(2);					\
+    assert(tuple);						\
+    PyTuple_SET_ITEM(tuple, 0, _PyLong_FromSsize_t(b));		\
+    PyTuple_SET_ITEM(tuple, 1, c);				\
+    Py_XINCREF(c);						\
+    resultobj = wrapper(a, tuple);				\
+    result = resultobj ? 0 : -1;				\
+    Py_XDECREF(resultobj);					\
+    Py_DECREF(tuple);						\
+    return result;						\
+}
+
+#define SWIGPY_OBJOBJARGPROC_CLOSURE(wrapper)			\
+SWIGINTERN int							\
+wrapper##_closure(PyObject *a, PyObject *b, PyObject *c) {	\
+    PyObject *tuple, *resultobj;				\
+    int result;							\
+    tuple = PyTuple_New(c ? 2 : 1);				\
+    assert(tuple);						\
+    PyTuple_SET_ITEM(tuple, 0, b);				\
+    Py_XINCREF(b);						\
+    if (c) {							\
+        PyTuple_SET_ITEM(tuple, 1, c);				\
+        Py_XINCREF(c);						\
+    }								\
+    resultobj = wrapper(a, tuple);				\
+    result = resultobj ? 0 : -1;				\
+    Py_XDECREF(resultobj);					\
+    Py_DECREF(tuple);						\
+    return result;						\
+}
+
+#define SWIGPY_REPRFUNC_CLOSURE(wrapper)	\
+SWIGINTERN PyObject *				\
+wrapper##_closure(PyObject *a) {		\
+    return wrapper(a, NULL);			\
+}
+
+#define SWIGPY_HASHFUNC_CLOSURE(wrapper)	\
+SWIGINTERN long					\
+wrapper##_closure(PyObject *a) {		\
+    PyObject *pyresult;				\
+    long result;				\
+    pyresult = wrapper(a, NULL);		\
+    if (!pyresult || !PyLong_Check(pyresult))	\
+	return -1;				\
+    result = PyLong_AsLong(pyresult);		\
+    Py_DECREF(pyresult);			\
+    return result;				\
+}
+
+#define SWIGPY_ITERNEXT_CLOSURE(wrapper)	\
+SWIGINTERN PyObject *				\
+wrapper##_closure(PyObject *a) {		\
+    PyObject *result;				\
+    result = wrapper(a, NULL);			\
+    if (result && result == Py_None) {		\
+	Py_DECREF(result);			\
+	result = NULL;				\
+    }						\
+    return result;				\
+}
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+SWIGINTERN int
+SwigPyBuiltin_BadInit(PyObject *self, PyObject *SWIGUNUSEDPARM(args), PyObject *SWIGUNUSEDPARM(kwds)) {
+  PyErr_Format(PyExc_TypeError, "Cannot create new instances of type '%.300s'", self->ob_type->tp_name);
+  return -1;
+}
+
+SWIGINTERN void
+SwigPyBuiltin_BadDealloc(PyObject *pyobj) {
+  SwigPyObject *sobj;
+  sobj = (SwigPyObject *)pyobj;
+  if (sobj->own) {
+    PyErr_Format(PyExc_TypeError, "Swig detected a memory leak in type '%.300s': no callable destructor found.", pyobj->ob_type->tp_name);
+  }
+}
+
+typedef struct {
+  PyCFunction get;
+  PyCFunction set;
+} SwigPyGetSet;
+
+SWIGINTERN PyObject *
+SwigPyBuiltin_GetterClosure (PyObject *obj, void *closure) {
+  SwigPyGetSet *getset;
+  PyObject *tuple, *result;
+  if (!closure)
+    return SWIG_Py_Void();
+  getset = (SwigPyGetSet *)closure;
+  if (!getset->get)
+    return SWIG_Py_Void();
+  tuple = PyTuple_New(0);
+  assert(tuple);
+  result = (*getset->get)(obj, tuple);
+  Py_DECREF(tuple);
+  return result;
+}
+
+SWIGINTERN PyObject *
+SwigPyBuiltin_FunpackGetterClosure (PyObject *obj, void *closure) {
+  SwigPyGetSet *getset;
+  PyObject *result;
+  if (!closure)
+    return SWIG_Py_Void();
+  getset = (SwigPyGetSet *)closure;
+  if (!getset->get)
+    return SWIG_Py_Void();
+  result = (*getset->get)(obj, NULL);
+  return result;
+}
+
+SWIGINTERN int
+SwigPyBuiltin_SetterClosure (PyObject *obj, PyObject *val, void *closure) {
+  SwigPyGetSet *getset;
+  PyObject *tuple, *result;
+  if (!closure) {
+    PyErr_Format(PyExc_TypeError, "Missing getset closure");
+    return -1;
+  }
+  getset = (SwigPyGetSet *)closure;
+  if (!getset->set) {
+    PyErr_Format(PyExc_TypeError, "Illegal member variable assignment in type '%.300s'", obj->ob_type->tp_name);
+    return -1;
+  }
+  tuple = PyTuple_New(1);
+  assert(tuple);
+  PyTuple_SET_ITEM(tuple, 0, val);
+  Py_XINCREF(val);
+  result = (*getset->set)(obj, tuple);
+  Py_DECREF(tuple);
+  Py_XDECREF(result);
+  return result ? 0 : -1;
+}
+
+SWIGINTERN int
+SwigPyBuiltin_FunpackSetterClosure (PyObject *obj, PyObject *val, void *closure) {
+  SwigPyGetSet *getset;
+  PyObject *result;
+  if (!closure) {
+    PyErr_Format(PyExc_TypeError, "Missing getset closure");
+    return -1;
+  }
+  getset = (SwigPyGetSet *)closure;
+  if (!getset->set) {
+    PyErr_Format(PyExc_TypeError, "Illegal member variable assignment in type '%.300s'", obj->ob_type->tp_name);
+    return -1;
+  }
+  result = (*getset->set)(obj, val);
+  Py_XDECREF(result);
+  return result ? 0 : -1;
+}
+
+SWIGINTERN void
+SwigPyStaticVar_dealloc(PyDescrObject *descr) {
+  _PyObject_GC_UNTRACK(descr);
+  Py_XDECREF(PyDescr_TYPE(descr));
+  Py_XDECREF(PyDescr_NAME(descr));
+  PyObject_GC_Del(descr);
+}
+
+SWIGINTERN PyObject *
+SwigPyStaticVar_repr(PyGetSetDescrObject *descr) {
+#if PY_VERSION_HEX >= 0x03000000
+
+  return PyUnicode_FromFormat("<class attribute '%S' of type '%s'>", PyDescr_NAME(descr), PyDescr_TYPE(descr)->tp_name);
+#else
+  return PyString_FromFormat("<class attribute '%s' of type '%s'>", PyString_AsString(PyDescr_NAME(descr)), PyDescr_TYPE(descr)->tp_name);
+#endif
+}
+
+SWIGINTERN int
+SwigPyStaticVar_traverse(PyObject *self, visitproc visit, void *arg) {
+  PyDescrObject *descr;
+  descr = (PyDescrObject *)self;
+  Py_VISIT((PyObject*) PyDescr_TYPE(descr));
+  return 0;
+}
+
+SWIGINTERN PyObject *
+SwigPyStaticVar_get(PyGetSetDescrObject *descr, PyObject *obj, PyObject *SWIGUNUSEDPARM(type)) {
+  if (descr->d_getset->get != NULL)
+    return descr->d_getset->get(obj, descr->d_getset->closure);
+#if PY_VERSION_HEX >= 0x03000000
+  PyErr_Format(PyExc_AttributeError, "attribute '%.300S' of '%.100s' objects is not readable", PyDescr_NAME(descr), PyDescr_TYPE(descr)->tp_name);
+#else
+  PyErr_Format(PyExc_AttributeError, "attribute '%.300s' of '%.100s' objects is not readable", PyString_AsString(PyDescr_NAME(descr)), PyDescr_TYPE(descr)->tp_name);
+#endif
+  return NULL;
+}
+
+SWIGINTERN int
+SwigPyStaticVar_set(PyGetSetDescrObject *descr, PyObject *obj, PyObject *value) {
+  if (descr->d_getset->set != NULL)
+    return descr->d_getset->set(obj, value, descr->d_getset->closure);
+#if PY_VERSION_HEX >= 0x03000000
+  PyErr_Format(PyExc_AttributeError, "attribute '%.300S' of '%.100s' objects is not writable", PyDescr_NAME(descr), PyDescr_TYPE(descr)->tp_name);
+#else
+  PyErr_Format(PyExc_AttributeError, "attribute '%.300s' of '%.100s' objects is not writable", PyString_AsString(PyDescr_NAME(descr)), PyDescr_TYPE(descr)->tp_name);
+#endif
+  return -1;
+}
+
+SWIGINTERN int
+SwigPyObjectType_setattro(PyTypeObject *type, PyObject *name, PyObject *value) {
+  PyObject *attribute;
+  descrsetfunc local_set;
+  attribute = _PyType_Lookup(type, name);
+  if (attribute != NULL) {
+    /* Implement descriptor functionality, if any */
+    local_set = attribute->ob_type->tp_descr_set;
+    if (local_set != NULL)
+      return local_set(attribute, (PyObject *)type, value);
+#if PY_VERSION_HEX >= 0x03000000
+    PyErr_Format(PyExc_AttributeError, "cannot modify read-only attribute '%.50s.%.400S'", type->tp_name, name);
+#else 
+    PyErr_Format(PyExc_AttributeError, "cannot modify read-only attribute '%.50s.%.400s'", type->tp_name, PyString_AS_STRING(name));
+#endif
+  } else {
+#if PY_VERSION_HEX >= 0x03000000
+    PyErr_Format(PyExc_AttributeError, "type '%.50s' has no attribute '%.400S'", type->tp_name, name);
+#else
+    PyErr_Format(PyExc_AttributeError, "type '%.50s' has no attribute '%.400s'", type->tp_name, PyString_AS_STRING(name));
+#endif
+  }
+
+  return -1;
+}
+
+SWIGINTERN PyTypeObject*
+SwigPyStaticVar_Type(void) {
+  static PyTypeObject staticvar_type;
+  static int type_init = 0;
+  if (!type_init) {
+    const PyTypeObject tmp = {
+      /* PyObject header changed in Python 3 */
+#if PY_VERSION_HEX >= 0x03000000
+      PyVarObject_HEAD_INIT(&PyType_Type, 0)
+#else
+      PyObject_HEAD_INIT(&PyType_Type)
+      0,
+#endif
+      "swig_static_var_getset_descriptor",
+      sizeof(PyGetSetDescrObject),
+      0,
+      (destructor)SwigPyStaticVar_dealloc,      /* tp_dealloc */
+      0,                                        /* tp_print */
+      0,                                        /* tp_getattr */
+      0,                                        /* tp_setattr */
+      0,                                        /* tp_compare */
+      (reprfunc)SwigPyStaticVar_repr,           /* tp_repr */
+      0,                                        /* tp_as_number */
+      0,                                        /* tp_as_sequence */
+      0,                                        /* tp_as_mapping */
+      0,                                        /* tp_hash */
+      0,                                        /* tp_call */
+      0,                                        /* tp_str */
+      PyObject_GenericGetAttr,                  /* tp_getattro */
+      0,                                        /* tp_setattro */
+      0,                                        /* tp_as_buffer */
+      Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_GC|Py_TPFLAGS_HAVE_CLASS, /* tp_flags */
+      0,                                        /* tp_doc */
+      SwigPyStaticVar_traverse,                 /* tp_traverse */
+      0,                                        /* tp_clear */
+      0,                                        /* tp_richcompare */
+      0,                                        /* tp_weaklistoffset */
+      0,                                        /* tp_iter */
+      0,                                        /* tp_iternext */
+      0,                                        /* tp_methods */
+      0,                                        /* tp_members */
+      0,                                        /* tp_getset */
+      0,                                        /* tp_base */
+      0,                                        /* tp_dict */
+      (descrgetfunc)SwigPyStaticVar_get,        /* tp_descr_get */
+      (descrsetfunc)SwigPyStaticVar_set,        /* tp_descr_set */
+      0,                                        /* tp_dictoffset */
+      0,                                        /* tp_init */
+      0,                                        /* tp_alloc */
+      0,                                        /* tp_new */
+      0,                                        /* tp_free */
+      0,                                        /* tp_is_gc */
+      0,                                        /* tp_bases */
+      0,                                        /* tp_mro */
+      0,                                        /* tp_cache */
+      0,                                        /* tp_subclasses */
+      0,                                        /* tp_weaklist */
+#if PY_VERSION_HEX >= 0x02030000
+      0,                                        /* tp_del */
+#endif
+#if PY_VERSION_HEX >= 0x02060000
+      0,                                        /* tp_version */
+#endif
+#ifdef COUNT_ALLOCS
+      0,0,0,0                                   /* tp_alloc -> tp_next */
+#endif
+    };
+    staticvar_type = tmp;
+    type_init = 1;
+#if PY_VERSION_HEX < 0x02020000
+    staticvar_type.ob_type = &PyType_Type;
+#else
+    if (PyType_Ready(&staticvar_type) < 0)
+      return NULL;
+#endif
+  }
+  return &staticvar_type;
+}
+
+SWIGINTERN PyGetSetDescrObject *
+SwigPyStaticVar_new_getset(PyTypeObject *type, PyGetSetDef *getset) {
+
+  PyGetSetDescrObject *descr;
+  descr = (PyGetSetDescrObject *)PyType_GenericAlloc(SwigPyStaticVar_Type(), 0);
+  assert(descr);
+  Py_XINCREF(type);
+  PyDescr_TYPE(descr) = type;
+  PyDescr_NAME(descr) = PyString_InternFromString(getset->name);
+  descr->d_getset = getset;
+  if (PyDescr_NAME(descr) == NULL) {
+    Py_DECREF(descr);
+    descr = NULL;
+  }
+  return descr;
+}
+
+SWIGINTERN void
+SwigPyBuiltin_InitBases (PyTypeObject *type, PyTypeObject **bases) {
+  int base_count = 0;
+  PyTypeObject **b;
+  PyObject *tuple;
+  int i;
+
+  if (!bases[0]) {
+    bases[0] = SwigPyObject_type();
+    bases[1] = NULL;
+  }
+  type->tp_base = bases[0];
+  Py_INCREF((PyObject *)bases[0]);
+  for (b = bases; *b != NULL; ++b)
+    ++base_count;
+  tuple = PyTuple_New(base_count);
+  for (i = 0; i < base_count; ++i) {
+    PyTuple_SET_ITEM(tuple, i, (PyObject *)bases[i]);
+    Py_INCREF((PyObject *)bases[i]);
+  }
+  type->tp_bases = tuple;
+}
+
+SWIGINTERN PyObject *
+SwigPyBuiltin_ThisClosure (PyObject *self, void *SWIGUNUSEDPARM(closure)) {
+  PyObject *result;
+  result = (PyObject *)SWIG_Python_GetSwigThis(self);
+  Py_XINCREF(result);
+  return result;
+}
+
+SWIGINTERN void
+SwigPyBuiltin_SetMetaType (PyTypeObject *type, PyTypeObject *metatype)
+{
+#if PY_VERSION_HEX >= 0x03000000
+    type->ob_base.ob_base.ob_type = metatype;
+#else
+    type->ob_type = metatype;
+#endif
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+
+
+#define SWIG_exception_fail(code, msg) do { SWIG_Error(code, msg); SWIG_fail; } while(0) 
+
+#define SWIG_contract_assert(expr, msg) if (!(expr)) { SWIG_Error(SWIG_RuntimeError, msg); SWIG_fail; } else 
+
+
+
+/* -------- TYPES TABLE (BEGIN) -------- */
+
+#define SWIGTYPE_p_SwigPyObject swig_types[0]
+#define SWIGTYPE_p__THyPhy swig_types[1]
+#define SWIGTYPE_p__THyPhyMatrix swig_types[2]
+#define SWIGTYPE_p__THyPhyNumber swig_types[3]
+#define SWIGTYPE_p__THyPhyReturnObject swig_types[4]
+#define SWIGTYPE_p__THyPhyString swig_types[5]
+#define SWIGTYPE_p_char swig_types[6]
+#define SWIGTYPE_p_double swig_types[7]
+#define SWIGTYPE_p_f_p_char_int_double__bool swig_types[8]
+#define SWIGTYPE_p_void swig_types[9]
+static swig_type_info *swig_types[11];
+static swig_module_info swig_module = {swig_types, 10, 0, 0, 0, 0};
+#define SWIG_TypeQuery(name) SWIG_TypeQueryModule(&swig_module, &swig_module, name)
+#define SWIG_MangledTypeQuery(name) SWIG_MangledTypeQueryModule(&swig_module, &swig_module, name)
+
+/* -------- TYPES TABLE (END) -------- */
+
+#if (PY_VERSION_HEX <= 0x02000000)
+# if !defined(SWIG_PYTHON_CLASSIC)
+#  error "This python version requires swig to be run with the '-classic' option"
+# endif
+#endif
+
+/*-----------------------------------------------
+              @(target):= _HyPhy.so
+  ------------------------------------------------*/
+#if PY_VERSION_HEX >= 0x03000000
+#  define SWIG_init    PyInit__HyPhy
+
+#else
+#  define SWIG_init    init_HyPhy
+
+#endif
+#define SWIG_name    "_HyPhy"
+
+#define SWIGVERSION 0x020004 
+#define SWIG_VERSION SWIGVERSION
+
+
+#define SWIG_as_voidptr(a) const_cast< void * >(static_cast< const void * >(a)) 
+#define SWIG_as_voidptrptr(a) ((void)SWIG_as_voidptr(*a),reinterpret_cast< void** >(a)) 
+
+
+#include <stdexcept>
+
+
+namespace swig {
+  class SwigPtr_PyObject {
+  protected:
+    PyObject *_obj;
+
+  public:
+    SwigPtr_PyObject() :_obj(0)
+    {
+    }
+
+    SwigPtr_PyObject(const SwigPtr_PyObject& item) : _obj(item._obj)
+    {
+      Py_XINCREF(_obj);      
+    }
+    
+    SwigPtr_PyObject(PyObject *obj, bool initial_ref = true) :_obj(obj)
+    {
+      if (initial_ref) {
+        Py_XINCREF(_obj);
+      }
+    }
+    
+    SwigPtr_PyObject & operator=(const SwigPtr_PyObject& item) 
+    {
+      Py_XINCREF(item._obj);
+      Py_XDECREF(_obj);
+      _obj = item._obj;
+      return *this;      
+    }
+    
+    ~SwigPtr_PyObject() 
+    {
+      Py_XDECREF(_obj);
+    }
+    
+    operator PyObject *() const
+    {
+      return _obj;
+    }
+
+    PyObject *operator->() const
+    {
+      return _obj;
+    }
+  };
+}
+
+
+namespace swig {
+  struct SwigVar_PyObject : SwigPtr_PyObject {
+    SwigVar_PyObject(PyObject* obj = 0) : SwigPtr_PyObject(obj, false) { }
+    
+    SwigVar_PyObject & operator = (PyObject* obj)
+    {
+      Py_XDECREF(_obj);
+      _obj = obj;
+      return *this;      
+    }
+  };
+}
+
+
+#include "THyPhy.h"
+
+
+  #define SWIG_From_long   PyInt_FromLong 
+
+
+SWIGINTERNINLINE PyObject *
+SWIG_From_int  (int value)
+{    
+  return SWIG_From_long  (value);
+}
+
+
+SWIGINTERN swig_type_info*
+SWIG_pchar_descriptor(void)
+{
+  static int init = 0;
+  static swig_type_info* info = 0;
+  if (!init) {
+    info = SWIG_TypeQuery("_p_char");
+    init = 1;
+  }
+  return info;
+}
+
+
+SWIGINTERN int
+SWIG_AsCharPtrAndSize(PyObject *obj, char** cptr, size_t* psize, int *alloc)
+{
+#if PY_VERSION_HEX>=0x03000000
+  if (PyUnicode_Check(obj))
+#else  
+  if (PyString_Check(obj))
+#endif
+  {
+    char *cstr; Py_ssize_t len;
+#if PY_VERSION_HEX>=0x03000000
+    if (!alloc && cptr) {
+        /* We can't allow converting without allocation, since the internal
+           representation of string in Python 3 is UCS-2/UCS-4 but we require
+           a UTF-8 representation.
+           TODO(bhy) More detailed explanation */
+        return SWIG_RuntimeError;
+    }
+    obj = PyUnicode_AsUTF8String(obj);
+    PyBytes_AsStringAndSize(obj, &cstr, &len);
+    if(alloc) *alloc = SWIG_NEWOBJ;
+#else
+    PyString_AsStringAndSize(obj, &cstr, &len);
+#endif
+    if (cptr) {
+      if (alloc) {
+	/* 
+	   In python the user should not be able to modify the inner
+	   string representation. To warranty that, if you define
+	   SWIG_PYTHON_SAFE_CSTRINGS, a new/copy of the python string
+	   buffer is always returned.
+
+	   The default behavior is just to return the pointer value,
+	   so, be careful.
+	*/ 
+#if defined(SWIG_PYTHON_SAFE_CSTRINGS)
+	if (*alloc != SWIG_OLDOBJ) 
+#else
+	if (*alloc == SWIG_NEWOBJ) 
+#endif
+	  {
+	    *cptr = reinterpret_cast< char* >(memcpy((new char[len + 1]), cstr, sizeof(char)*(len + 1)));
+	    *alloc = SWIG_NEWOBJ;
+	  }
+	else {
+	  *cptr = cstr;
+	  *alloc = SWIG_OLDOBJ;
+	}
+      } else {
+        #if PY_VERSION_HEX>=0x03000000
+        assert(0); /* Should never reach here in Python 3 */
+        #endif
+	*cptr = SWIG_Python_str_AsChar(obj);
+      }
+    }
+    if (psize) *psize = len + 1;
+#if PY_VERSION_HEX>=0x03000000
+    Py_XDECREF(obj);
+#endif
+    return SWIG_OK;
+  } else {
+    swig_type_info* pchar_descriptor = SWIG_pchar_descriptor();
+    if (pchar_descriptor) {
+      void* vptr = 0;
+      if (SWIG_ConvertPtr(obj, &vptr, pchar_descriptor, 0) == SWIG_OK) {
+	if (cptr) *cptr = (char *) vptr;
+	if (psize) *psize = vptr ? (strlen((char *)vptr) + 1) : 0;
+	if (alloc) *alloc = SWIG_OLDOBJ;
+	return SWIG_OK;
+      }
+    }
+  }
+  return SWIG_TypeError;
+}
+
+
+
+
+
+SWIGINTERN int
+SWIG_AsVal_double (PyObject *obj, double *val)
+{
+  int res = SWIG_TypeError;
+  if (PyFloat_Check(obj)) {
+    if (val) *val = PyFloat_AsDouble(obj);
+    return SWIG_OK;
+  } else if (PyInt_Check(obj)) {
+    if (val) *val = PyInt_AsLong(obj);
+    return SWIG_OK;
+  } else if (PyLong_Check(obj)) {
+    double v = PyLong_AsDouble(obj);
+    if (!PyErr_Occurred()) {
+      if (val) *val = v;
+      return SWIG_OK;
+    } else {
+      PyErr_Clear();
+    }
+  }
+#ifdef SWIG_PYTHON_CAST_MODE
+  {
+    int dispatch = 0;
+    double d = PyFloat_AsDouble(obj);
+    if (!PyErr_Occurred()) {
+      if (val) *val = d;
+      return SWIG_AddCast(SWIG_OK);
+    } else {
+      PyErr_Clear();
+    }
+    if (!dispatch) {
+      long v = PyLong_AsLong(obj);
+      if (!PyErr_Occurred()) {
+	if (val) *val = v;
+	return SWIG_AddCast(SWIG_AddCast(SWIG_OK));
+      } else {
+	PyErr_Clear();
+      }
+    }
+  }
+#endif
+  return res;
+}
+
+
+#include <float.h>
+
+
+#include <math.h>
+
+
+SWIGINTERNINLINE int
+SWIG_CanCastAsInteger(double *d, double min, double max) {
+  double x = *d;
+  if ((min <= x && x <= max)) {
+   double fx = floor(x);
+   double cx = ceil(x);
+   double rd =  ((x - fx) < 0.5) ? fx : cx; /* simple rint */
+   if ((errno == EDOM) || (errno == ERANGE)) {
+     errno = 0;
+   } else {
+     double summ, reps, diff;
+     if (rd < x) {
+       diff = x - rd;
+     } else if (rd > x) {
+       diff = rd - x;
+     } else {
+       return 1;
+     }
+     summ = rd + x;
+     reps = diff/summ;
+     if (reps < 8*DBL_EPSILON) {
+       *d = rd;
+       return 1;
+     }
+   }
+  }
+  return 0;
+}
+
+
+SWIGINTERN int
+SWIG_AsVal_long (PyObject *obj, long* val)
+{
+  if (PyInt_Check(obj)) {
+    if (val) *val = PyInt_AsLong(obj);
+    return SWIG_OK;
+  } else if (PyLong_Check(obj)) {
+    long v = PyLong_AsLong(obj);
+    if (!PyErr_Occurred()) {
+      if (val) *val = v;
+      return SWIG_OK;
+    } else {
+      PyErr_Clear();
+    }
+  }
+#ifdef SWIG_PYTHON_CAST_MODE
+  {
+    int dispatch = 0;
+    long v = PyInt_AsLong(obj);
+    if (!PyErr_Occurred()) {
+      if (val) *val = v;
+      return SWIG_AddCast(SWIG_OK);
+    } else {
+      PyErr_Clear();
+    }
+    if (!dispatch) {
+      double d;
+      int res = SWIG_AddCast(SWIG_AsVal_double (obj,&d));
+      if (SWIG_IsOK(res) && SWIG_CanCastAsInteger(&d, LONG_MIN, LONG_MAX)) {
+	if (val) *val = (long)(d);
+	return res;
+      }
+    }
+  }
+#endif
+  return SWIG_TypeError;
+}
+
+
+SWIGINTERNINLINE PyObject *
+SWIG_FromCharPtrAndSize(const char* carray, size_t size)
+{
+  if (carray) {
+    if (size > INT_MAX) {
+      swig_type_info* pchar_descriptor = SWIG_pchar_descriptor();
+      return pchar_descriptor ? 
+	SWIG_InternalNewPointerObj(const_cast< char * >(carray), pchar_descriptor, 0) : SWIG_Py_Void();
+    } else {
+#if PY_VERSION_HEX >= 0x03000000
+      return PyUnicode_FromStringAndSize(carray, static_cast< int >(size));
+#else
+      return PyString_FromStringAndSize(carray, static_cast< int >(size));
+#endif
+    }
+  } else {
+    return SWIG_Py_Void();
+  }
+}
+
+
+SWIGINTERNINLINE PyObject * 
+SWIG_FromCharPtr(const char *cptr)
+{ 
+  return SWIG_FromCharPtrAndSize(cptr, (cptr ? strlen(cptr) : 0));
+}
+
+
+  #define SWIG_From_double   PyFloat_FromDouble 
+
+
+SWIGINTERN int
+SWIG_AsVal_bool (PyObject *obj, bool *val)
+{
+  int r = PyObject_IsTrue(obj);
+  if (r == -1)
+    return SWIG_ERROR;
+  if (val) *val = r ? true : false;
+  return SWIG_OK;
+}
+
+
+#include <limits.h>
+#if !defined(SWIG_NO_LLONG_MAX)
+# if !defined(LLONG_MAX) && defined(__GNUC__) && defined (__LONG_LONG_MAX__)
+#   define LLONG_MAX __LONG_LONG_MAX__
+#   define LLONG_MIN (-LLONG_MAX - 1LL)
+#   define ULLONG_MAX (LLONG_MAX * 2ULL + 1ULL)
+# endif
+#endif
+
+
+SWIGINTERN int
+SWIG_AsVal_int (PyObject * obj, int *val)
+{
+  long v;
+  int res = SWIG_AsVal_long (obj, &v);
+  if (SWIG_IsOK(res)) {
+    if ((v < INT_MIN || v > INT_MAX)) {
+      return SWIG_OverflowError;
+    } else {
+      if (val) *val = static_cast< int >(v);
+    }
+  }  
+  return res;
+}
+
+
+SWIGINTERNINLINE PyObject*
+  SWIG_From_bool  (bool value)
+{
+  return PyBool_FromLong(value ? 1 : 0);
+}
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+SWIGINTERN PyObject *_wrap__THyPhyReturnObject_myType(PyObject *self, PyObject *args) {
+  PyObject *resultobj = 0;
+  _THyPhyReturnObject *arg1 = (_THyPhyReturnObject *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int result;
+  
+  if (args && PyTuple_Check(args) && PyTuple_GET_SIZE(args) > 0) SWIG_fail;
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p__THyPhyReturnObject, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "_THyPhyReturnObject_myType" "', argument " "1"" of type '" "_THyPhyReturnObject *""'"); 
+  }
+  arg1 = reinterpret_cast< _THyPhyReturnObject * >(argp1);
+  result = (int)(arg1)->myType();
+  resultobj = SWIG_From_int(static_cast< int >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete__THyPhyReturnObject(PyObject *self, PyObject *args) {
+  PyObject *resultobj = 0;
+  _THyPhyReturnObject *arg1 = (_THyPhyReturnObject *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  
+  if (args && PyTuple_Check(args) && PyTuple_GET_SIZE(args) > 0) SWIG_fail;
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p__THyPhyReturnObject, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete__THyPhyReturnObject" "', argument " "1"" of type '" "_THyPhyReturnObject *""'"); 
+  }
+  arg1 = reinterpret_cast< _THyPhyReturnObject * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap__THyPhyReturnObject_castToString(PyObject *self, PyObject *args) {
+  PyObject *resultobj = 0;
+  _THyPhyReturnObject *arg1 = (_THyPhyReturnObject *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  _THyPhyString *result = 0 ;
+  
+  if (args && PyTuple_Check(args) && PyTuple_GET_SIZE(args) > 0) SWIG_fail;
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p__THyPhyReturnObject, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "_THyPhyReturnObject_castToString" "', argument " "1"" of type '" "_THyPhyReturnObject *""'"); 
+  }
+  arg1 = reinterpret_cast< _THyPhyReturnObject * >(argp1);
+  result = (_THyPhyString *)(arg1)->castToString();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p__THyPhyString, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap__THyPhyReturnObject_castToNumber(PyObject *self, PyObject *args) {
+  PyObject *resultobj = 0;
+  _THyPhyReturnObject *arg1 = (_THyPhyReturnObject *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  _THyPhyNumber *result = 0 ;
+  
+  if (args && PyTuple_Check(args) && PyTuple_GET_SIZE(args) > 0) SWIG_fail;
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p__THyPhyReturnObject, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "_THyPhyReturnObject_castToNumber" "', argument " "1"" of type '" "_THyPhyReturnObject *""'"); 
+  }
+  arg1 = reinterpret_cast< _THyPhyReturnObject * >(argp1);
+  result = (_THyPhyNumber *)(arg1)->castToNumber();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p__THyPhyNumber, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap__THyPhyReturnObject_castToMatrix(PyObject *self, PyObject *args) {
+  PyObject *resultobj = 0;
+  _THyPhyReturnObject *arg1 = (_THyPhyReturnObject *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  _THyPhyMatrix *result = 0 ;
+  
+  if (args && PyTuple_Check(args) && PyTuple_GET_SIZE(args) > 0) SWIG_fail;
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p__THyPhyReturnObject, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "_THyPhyReturnObject_castToMatrix" "', argument " "1"" of type '" "_THyPhyReturnObject *""'"); 
+  }
+  arg1 = reinterpret_cast< _THyPhyReturnObject * >(argp1);
+  result = (_THyPhyMatrix *)(arg1)->castToMatrix();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p__THyPhyMatrix, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN int _wrap_new__THyPhyString__SWIG_0(PyObject *self, PyObject *args) {
+  PyObject *resultobj = 0;
+  char *arg1 = (char *) 0 ;
+  long arg2 ;
+  int res1 ;
+  char *buf1 = 0 ;
+  int alloc1 = 0 ;
+  long val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  _THyPhyString *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:new__THyPhyString",&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_AsCharPtrAndSize(obj1, &buf1, NULL, &alloc1);
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new__THyPhyString" "', argument " "1"" of type '" "char const *""'");
+  }
+  arg1 = reinterpret_cast< char * >(buf1);
+  ecode2 = SWIG_AsVal_long(obj2, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "new__THyPhyString" "', argument " "2"" of type '" "long""'");
+  } 
+  arg2 = static_cast< long >(val2);
+  result = (_THyPhyString *)new _THyPhyString((char const *)arg1,arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p__THyPhyString, SWIG_BUILTIN_INIT |  0 );
+  if (alloc1 == SWIG_NEWOBJ) delete[] buf1;
+  return resultobj == Py_None ? 1 : 0;
+fail:
+  if (alloc1 == SWIG_NEWOBJ) delete[] buf1;
+  return -1;
+}
+
+
+SWIGINTERN int _wrap_new__THyPhyString__SWIG_1(PyObject *self, PyObject *args) {
+  PyObject *resultobj = 0;
+  char *arg1 = (char *) 0 ;
+  int res1 ;
+  char *buf1 = 0 ;
+  int alloc1 = 0 ;
+  PyObject * obj1 = 0 ;
+  _THyPhyString *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:new__THyPhyString",&obj1)) SWIG_fail;
+  res1 = SWIG_AsCharPtrAndSize(obj1, &buf1, NULL, &alloc1);
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new__THyPhyString" "', argument " "1"" of type '" "char const *""'");
+  }
+  arg1 = reinterpret_cast< char * >(buf1);
+  result = (_THyPhyString *)new _THyPhyString((char const *)arg1);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p__THyPhyString, SWIG_BUILTIN_INIT |  0 );
+  if (alloc1 == SWIG_NEWOBJ) delete[] buf1;
+  return resultobj == Py_None ? 1 : 0;
+fail:
+  if (alloc1 == SWIG_NEWOBJ) delete[] buf1;
+  return -1;
+}
+
+
+SWIGINTERN int _wrap_new__THyPhyString__SWIG_2(PyObject *self, PyObject *args) {
+  PyObject *resultobj = 0;
+  _THyPhyString *result = 0 ;
+  
+  if (args && PyTuple_Check(args) && PyTuple_GET_SIZE(args) > 0) SWIG_fail;
+  result = (_THyPhyString *)new _THyPhyString();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p__THyPhyString, SWIG_BUILTIN_INIT |  0 );
+  return resultobj == Py_None ? 1 : 0;
+fail:
+  return -1;
+}
+
+
+SWIGINTERN int _wrap_new__THyPhyString(PyObject *self, PyObject *args) {
+  int argc;
+  PyObject *argv[3];
+  int ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? (int)PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 2) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 0) {
+    return _wrap_new__THyPhyString__SWIG_2(self, args);
+  }
+  if (argc == 1) {
+    int _v;
+    int res = SWIG_AsCharPtrAndSize(argv[0], 0, NULL, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      return _wrap_new__THyPhyString__SWIG_1(self, args);
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    int res = SWIG_AsCharPtrAndSize(argv[0], 0, NULL, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_long(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_new__THyPhyString__SWIG_0(self, args);
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'new__THyPhyString'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    _THyPhyString::_THyPhyString(char const *,long)\n"
+    "    _THyPhyString::_THyPhyString(char const *)\n"
+    "    _THyPhyString::_THyPhyString()\n");
+  return -1;
+}
+
+
+SWIGINTERN PyObject *_wrap__THyPhyString_myType(PyObject *self, PyObject *args) {
+  PyObject *resultobj = 0;
+  _THyPhyString *arg1 = (_THyPhyString *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int result;
+  
+  if (args && PyTuple_Check(args) && PyTuple_GET_SIZE(args) > 0) SWIG_fail;
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p__THyPhyString, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "_THyPhyString_myType" "', argument " "1"" of type '" "_THyPhyString *""'"); 
+  }
+  arg1 = reinterpret_cast< _THyPhyString * >(argp1);
+  result = (int)(arg1)->myType();
+  resultobj = SWIG_From_int(static_cast< int >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete__THyPhyString(PyObject *self, PyObject *args) {
+  PyObject *resultobj = 0;
+  _THyPhyString *arg1 = (_THyPhyString *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  
+  if (args && PyTuple_Check(args) && PyTuple_GET_SIZE(args) > 0) SWIG_fail;
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p__THyPhyString, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete__THyPhyString" "', argument " "1"" of type '" "_THyPhyString *""'"); 
+  }
+  arg1 = reinterpret_cast< _THyPhyString * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap__THyPhyString_sLength_set(PyObject *self, PyObject *args) {
+  PyObject *resultobj = 0;
+  _THyPhyString *arg1 = (_THyPhyString *) 0 ;
+  long arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  long val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:_THyPhyString_sLength_set",&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p__THyPhyString, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "_THyPhyString_sLength_set" "', argument " "1"" of type '" "_THyPhyString *""'"); 
+  }
+  arg1 = reinterpret_cast< _THyPhyString * >(argp1);
+  ecode2 = SWIG_AsVal_long(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "_THyPhyString_sLength_set" "', argument " "2"" of type '" "long""'");
+  } 
+  arg2 = static_cast< long >(val2);
+  if (arg1) (arg1)->sLength = arg2;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap__THyPhyString_sLength_get(PyObject *self, PyObject *args) {
+  PyObject *resultobj = 0;
+  _THyPhyString *arg1 = (_THyPhyString *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  long result;
+  
+  if (args && PyTuple_Check(args) && PyTuple_GET_SIZE(args) > 0) SWIG_fail;
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p__THyPhyString, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "_THyPhyString_sLength_get" "', argument " "1"" of type '" "_THyPhyString *""'"); 
+  }
+  arg1 = reinterpret_cast< _THyPhyString * >(argp1);
+  result = (long) ((arg1)->sLength);
+  resultobj = SWIG_From_long(static_cast< long >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap__THyPhyString_sData_set(PyObject *self, PyObject *args) {
+  PyObject *resultobj = 0;
+  _THyPhyString *arg1 = (_THyPhyString *) 0 ;
+  char *arg2 = (char *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int res2 ;
+  char *buf2 = 0 ;
+  int alloc2 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:_THyPhyString_sData_set",&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p__THyPhyString, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "_THyPhyString_sData_set" "', argument " "1"" of type '" "_THyPhyString *""'"); 
+  }
+  arg1 = reinterpret_cast< _THyPhyString * >(argp1);
+  res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "_THyPhyString_sData_set" "', argument " "2"" of type '" "char *""'");
+  }
+  arg2 = reinterpret_cast< char * >(buf2);
+  if (arg1->sData) delete[] arg1->sData;
+  if (arg2) {
+    size_t size = strlen(reinterpret_cast< const char * >(arg2)) + 1;
+    arg1->sData = (char *)reinterpret_cast< char* >(memcpy((new char[size]), reinterpret_cast< const char * >(arg2), sizeof(char)*(size)));
+  } else {
+    arg1->sData = 0;
+  }
+  resultobj = SWIG_Py_Void();
+  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
+  return resultobj;
+fail:
+  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap__THyPhyString_sData_get(PyObject *self, PyObject *args) {
+  PyObject *resultobj = 0;
+  _THyPhyString *arg1 = (_THyPhyString *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  char *result = 0 ;
+  
+  if (args && PyTuple_Check(args) && PyTuple_GET_SIZE(args) > 0) SWIG_fail;
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p__THyPhyString, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "_THyPhyString_sData_get" "', argument " "1"" of type '" "_THyPhyString *""'"); 
+  }
+  arg1 = reinterpret_cast< _THyPhyString * >(argp1);
+  result = (char *) ((arg1)->sData);
+  resultobj = SWIG_FromCharPtr((const char *)result);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN int _wrap_new__THyPhyNumber__SWIG_0(PyObject *self, PyObject *args) {
+  PyObject *resultobj = 0;
+  double arg1 ;
+  double val1 ;
+  int ecode1 = 0 ;
+  PyObject * obj1 = 0 ;
+  _THyPhyNumber *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:new__THyPhyNumber",&obj1)) SWIG_fail;
+  ecode1 = SWIG_AsVal_double(obj1, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new__THyPhyNumber" "', argument " "1"" of type '" "double""'");
+  } 
+  arg1 = static_cast< double >(val1);
+  result = (_THyPhyNumber *)new _THyPhyNumber(arg1);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p__THyPhyNumber, SWIG_BUILTIN_INIT |  0 );
+  return resultobj == Py_None ? 1 : 0;
+fail:
+  return -1;
+}
+
+
+SWIGINTERN int _wrap_new__THyPhyNumber__SWIG_1(PyObject *self, PyObject *args) {
+  PyObject *resultobj = 0;
+  _THyPhyNumber *result = 0 ;
+  
+  if (args && PyTuple_Check(args) && PyTuple_GET_SIZE(args) > 0) SWIG_fail;
+  result = (_THyPhyNumber *)new _THyPhyNumber();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p__THyPhyNumber, SWIG_BUILTIN_INIT |  0 );
+  return resultobj == Py_None ? 1 : 0;
+fail:
+  return -1;
+}
+
+
+SWIGINTERN int _wrap_new__THyPhyNumber(PyObject *self, PyObject *args) {
+  int argc;
+  PyObject *argv[2];
+  int ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? (int)PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 1) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 0) {
+    return _wrap_new__THyPhyNumber__SWIG_1(self, args);
+  }
+  if (argc == 1) {
+    int _v;
+    {
+      int res = SWIG_AsVal_double(argv[0], NULL);
+      _v = SWIG_CheckState(res);
+    }
+    if (_v) {
+      return _wrap_new__THyPhyNumber__SWIG_0(self, args);
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'new__THyPhyNumber'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    _THyPhyNumber::_THyPhyNumber(double)\n"
+    "    _THyPhyNumber::_THyPhyNumber()\n");
+  return -1;
+}
+
+
+SWIGINTERN PyObject *_wrap__THyPhyNumber_myType(PyObject *self, PyObject *args) {
+  PyObject *resultobj = 0;
+  _THyPhyNumber *arg1 = (_THyPhyNumber *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int result;
+  
+  if (args && PyTuple_Check(args) && PyTuple_GET_SIZE(args) > 0) SWIG_fail;
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p__THyPhyNumber, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "_THyPhyNumber_myType" "', argument " "1"" of type '" "_THyPhyNumber *""'"); 
+  }
+  arg1 = reinterpret_cast< _THyPhyNumber * >(argp1);
+  result = (int)(arg1)->myType();
+  resultobj = SWIG_From_int(static_cast< int >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete__THyPhyNumber(PyObject *self, PyObject *args) {
+  PyObject *resultobj = 0;
+  _THyPhyNumber *arg1 = (_THyPhyNumber *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  
+  if (args && PyTuple_Check(args) && PyTuple_GET_SIZE(args) > 0) SWIG_fail;
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p__THyPhyNumber, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete__THyPhyNumber" "', argument " "1"" of type '" "_THyPhyNumber *""'"); 
+  }
+  arg1 = reinterpret_cast< _THyPhyNumber * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap__THyPhyNumber_nValue_set(PyObject *self, PyObject *args) {
+  PyObject *resultobj = 0;
+  _THyPhyNumber *arg1 = (_THyPhyNumber *) 0 ;
+  double arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:_THyPhyNumber_nValue_set",&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p__THyPhyNumber, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "_THyPhyNumber_nValue_set" "', argument " "1"" of type '" "_THyPhyNumber *""'"); 
+  }
+  arg1 = reinterpret_cast< _THyPhyNumber * >(argp1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "_THyPhyNumber_nValue_set" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  if (arg1) (arg1)->nValue = arg2;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap__THyPhyNumber_nValue_get(PyObject *self, PyObject *args) {
+  PyObject *resultobj = 0;
+  _THyPhyNumber *arg1 = (_THyPhyNumber *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double result;
+  
+  if (args && PyTuple_Check(args) && PyTuple_GET_SIZE(args) > 0) SWIG_fail;
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p__THyPhyNumber, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "_THyPhyNumber_nValue_get" "', argument " "1"" of type '" "_THyPhyNumber *""'"); 
+  }
+  arg1 = reinterpret_cast< _THyPhyNumber * >(argp1);
+  result = (double) ((arg1)->nValue);
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN int _wrap_new__THyPhyMatrix__SWIG_0(PyObject *self, PyObject *args) {
+  PyObject *resultobj = 0;
+  _THyPhyMatrix *result = 0 ;
+  
+  if (args && PyTuple_Check(args) && PyTuple_GET_SIZE(args) > 0) SWIG_fail;
+  result = (_THyPhyMatrix *)new _THyPhyMatrix();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p__THyPhyMatrix, SWIG_BUILTIN_INIT |  0 );
+  return resultobj == Py_None ? 1 : 0;
+fail:
+  return -1;
+}
+
+
+SWIGINTERN int _wrap_new__THyPhyMatrix__SWIG_1(PyObject *self, PyObject *args) {
+  PyObject *resultobj = 0;
+  long arg1 ;
+  long arg2 ;
+  double *arg3 = (double *) 0 ;
+  long val1 ;
+  int ecode1 = 0 ;
+  long val2 ;
+  int ecode2 = 0 ;
+  void *argp3 = 0 ;
+  int res3 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  PyObject * obj3 = 0 ;
+  _THyPhyMatrix *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:new__THyPhyMatrix",&obj1,&obj2,&obj3)) SWIG_fail;
+  ecode1 = SWIG_AsVal_long(obj1, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new__THyPhyMatrix" "', argument " "1"" of type '" "long""'");
+  } 
+  arg1 = static_cast< long >(val1);
+  ecode2 = SWIG_AsVal_long(obj2, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "new__THyPhyMatrix" "', argument " "2"" of type '" "long""'");
+  } 
+  arg2 = static_cast< long >(val2);
+  res3 = SWIG_ConvertPtr(obj3, &argp3,SWIGTYPE_p_double, 0 |  0 );
+  if (!SWIG_IsOK(res3)) {
+    SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "new__THyPhyMatrix" "', argument " "3"" of type '" "double const *""'"); 
+  }
+  arg3 = reinterpret_cast< double * >(argp3);
+  result = (_THyPhyMatrix *)new _THyPhyMatrix(arg1,arg2,(double const *)arg3);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p__THyPhyMatrix, SWIG_BUILTIN_INIT |  0 );
+  return resultobj == Py_None ? 1 : 0;
+fail:
+  return -1;
+}
+
+
+SWIGINTERN int _wrap_new__THyPhyMatrix(PyObject *self, PyObject *args) {
+  int argc;
+  PyObject *argv[4];
+  int ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? (int)PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 3) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 0) {
+    return _wrap_new__THyPhyMatrix__SWIG_0(self, args);
+  }
+  if (argc == 3) {
+    int _v;
+    {
+      int res = SWIG_AsVal_long(argv[0], NULL);
+      _v = SWIG_CheckState(res);
+    }
+    if (_v) {
+      {
+        int res = SWIG_AsVal_long(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        void *vptr = 0;
+        int res = SWIG_ConvertPtr(argv[2], &vptr, SWIGTYPE_p_double, 0);
+        _v = SWIG_CheckState(res);
+        if (_v) {
+          return _wrap_new__THyPhyMatrix__SWIG_1(self, args);
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'new__THyPhyMatrix'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    _THyPhyMatrix::_THyPhyMatrix()\n"
+    "    _THyPhyMatrix::_THyPhyMatrix(long const,long const,double const *)\n");
+  return -1;
+}
+
+
+SWIGINTERN PyObject *_wrap__THyPhyMatrix_myType(PyObject *self, PyObject *args) {
+  PyObject *resultobj = 0;
+  _THyPhyMatrix *arg1 = (_THyPhyMatrix *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int result;
+  
+  if (args && PyTuple_Check(args) && PyTuple_GET_SIZE(args) > 0) SWIG_fail;
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p__THyPhyMatrix, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "_THyPhyMatrix_myType" "', argument " "1"" of type '" "_THyPhyMatrix *""'"); 
+  }
+  arg1 = reinterpret_cast< _THyPhyMatrix * >(argp1);
+  result = (int)(arg1)->myType();
+  resultobj = SWIG_From_int(static_cast< int >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete__THyPhyMatrix(PyObject *self, PyObject *args) {
+  PyObject *resultobj = 0;
+  _THyPhyMatrix *arg1 = (_THyPhyMatrix *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  
+  if (args && PyTuple_Check(args) && PyTuple_GET_SIZE(args) > 0) SWIG_fail;
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p__THyPhyMatrix, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete__THyPhyMatrix" "', argument " "1"" of type '" "_THyPhyMatrix *""'"); 
+  }
+  arg1 = reinterpret_cast< _THyPhyMatrix * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap__THyPhyMatrix_MatrixCell(PyObject *self, PyObject *args) {
+  PyObject *resultobj = 0;
+  _THyPhyMatrix *arg1 = (_THyPhyMatrix *) 0 ;
+  long arg2 ;
+  long arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  long val2 ;
+  int ecode2 = 0 ;
+  long val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:_THyPhyMatrix_MatrixCell",&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p__THyPhyMatrix, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "_THyPhyMatrix_MatrixCell" "', argument " "1"" of type '" "_THyPhyMatrix *""'"); 
+  }
+  arg1 = reinterpret_cast< _THyPhyMatrix * >(argp1);
+  ecode2 = SWIG_AsVal_long(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "_THyPhyMatrix_MatrixCell" "', argument " "2"" of type '" "long""'");
+  } 
+  arg2 = static_cast< long >(val2);
+  ecode3 = SWIG_AsVal_long(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "_THyPhyMatrix_MatrixCell" "', argument " "3"" of type '" "long""'");
+  } 
+  arg3 = static_cast< long >(val3);
+  result = (double)(arg1)->MatrixCell(arg2,arg3);
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap__THyPhyMatrix_mRows_set(PyObject *self, PyObject *args) {
+  PyObject *resultobj = 0;
+  _THyPhyMatrix *arg1 = (_THyPhyMatrix *) 0 ;
+  long arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  long val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:_THyPhyMatrix_mRows_set",&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p__THyPhyMatrix, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "_THyPhyMatrix_mRows_set" "', argument " "1"" of type '" "_THyPhyMatrix *""'"); 
+  }
+  arg1 = reinterpret_cast< _THyPhyMatrix * >(argp1);
+  ecode2 = SWIG_AsVal_long(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "_THyPhyMatrix_mRows_set" "', argument " "2"" of type '" "long""'");
+  } 
+  arg2 = static_cast< long >(val2);
+  if (arg1) (arg1)->mRows = arg2;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap__THyPhyMatrix_mRows_get(PyObject *self, PyObject *args) {
+  PyObject *resultobj = 0;
+  _THyPhyMatrix *arg1 = (_THyPhyMatrix *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  long result;
+  
+  if (args && PyTuple_Check(args) && PyTuple_GET_SIZE(args) > 0) SWIG_fail;
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p__THyPhyMatrix, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "_THyPhyMatrix_mRows_get" "', argument " "1"" of type '" "_THyPhyMatrix *""'"); 
+  }
+  arg1 = reinterpret_cast< _THyPhyMatrix * >(argp1);
+  result = (long) ((arg1)->mRows);
+  resultobj = SWIG_From_long(static_cast< long >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap__THyPhyMatrix_mCols_set(PyObject *self, PyObject *args) {
+  PyObject *resultobj = 0;
+  _THyPhyMatrix *arg1 = (_THyPhyMatrix *) 0 ;
+  long arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  long val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:_THyPhyMatrix_mCols_set",&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p__THyPhyMatrix, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "_THyPhyMatrix_mCols_set" "', argument " "1"" of type '" "_THyPhyMatrix *""'"); 
+  }
+  arg1 = reinterpret_cast< _THyPhyMatrix * >(argp1);
+  ecode2 = SWIG_AsVal_long(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "_THyPhyMatrix_mCols_set" "', argument " "2"" of type '" "long""'");
+  } 
+  arg2 = static_cast< long >(val2);
+  if (arg1) (arg1)->mCols = arg2;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap__THyPhyMatrix_mCols_get(PyObject *self, PyObject *args) {
+  PyObject *resultobj = 0;
+  _THyPhyMatrix *arg1 = (_THyPhyMatrix *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  long result;
+  
+  if (args && PyTuple_Check(args) && PyTuple_GET_SIZE(args) > 0) SWIG_fail;
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p__THyPhyMatrix, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "_THyPhyMatrix_mCols_get" "', argument " "1"" of type '" "_THyPhyMatrix *""'"); 
+  }
+  arg1 = reinterpret_cast< _THyPhyMatrix * >(argp1);
+  result = (long) ((arg1)->mCols);
+  resultobj = SWIG_From_long(static_cast< long >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap__THyPhyMatrix_mData_set(PyObject *self, PyObject *args) {
+  PyObject *resultobj = 0;
+  _THyPhyMatrix *arg1 = (_THyPhyMatrix *) 0 ;
+  double *arg2 = (double *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:_THyPhyMatrix_mData_set",&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p__THyPhyMatrix, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "_THyPhyMatrix_mData_set" "', argument " "1"" of type '" "_THyPhyMatrix *""'"); 
+  }
+  arg1 = reinterpret_cast< _THyPhyMatrix * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_double, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "_THyPhyMatrix_mData_set" "', argument " "2"" of type '" "double *""'"); 
+  }
+  arg2 = reinterpret_cast< double * >(argp2);
+  if (arg1) (arg1)->mData = arg2;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap__THyPhyMatrix_mData_get(PyObject *self, PyObject *args) {
+  PyObject *resultobj = 0;
+  _THyPhyMatrix *arg1 = (_THyPhyMatrix *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double *result = 0 ;
+  
+  if (args && PyTuple_Check(args) && PyTuple_GET_SIZE(args) > 0) SWIG_fail;
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p__THyPhyMatrix, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "_THyPhyMatrix_mData_get" "', argument " "1"" of type '" "_THyPhyMatrix *""'"); 
+  }
+  arg1 = reinterpret_cast< _THyPhyMatrix * >(argp1);
+  result = (double *) ((arg1)->mData);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_double, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN int _wrap_new__THyPhy__SWIG_0(PyObject *self, PyObject *args) {
+  PyObject *resultobj = 0;
+  _ProgressCancelHandler *arg1 = (_ProgressCancelHandler *) 0 ;
+  char *arg2 = (char *) 0 ;
+  long arg3 ;
+  int res2 ;
+  char *buf2 = 0 ;
+  int alloc2 = 0 ;
+  long val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  PyObject * obj3 = 0 ;
+  _THyPhy *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:new__THyPhy",&obj1,&obj2,&obj3)) SWIG_fail;
+  {
+    int res = SWIG_ConvertFunctionPtr(obj1, (void**)(&arg1), SWIGTYPE_p_f_p_char_int_double__bool);
+    if (!SWIG_IsOK(res)) {
+      SWIG_exception_fail(SWIG_ArgError(res), "in method '" "new__THyPhy" "', argument " "1"" of type '" "_ProgressCancelHandler *""'"); 
+    }
+  }
+  res2 = SWIG_AsCharPtrAndSize(obj2, &buf2, NULL, &alloc2);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "new__THyPhy" "', argument " "2"" of type '" "char const *""'");
+  }
+  arg2 = reinterpret_cast< char * >(buf2);
+  ecode3 = SWIG_AsVal_long(obj3, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "new__THyPhy" "', argument " "3"" of type '" "long""'");
+  } 
+  arg3 = static_cast< long >(val3);
+  result = (_THyPhy *)new _THyPhy(arg1,(char const *)arg2,arg3);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p__THyPhy, SWIG_BUILTIN_INIT |  0 );
+  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
+  return resultobj == Py_None ? 1 : 0;
+fail:
+  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
+  return -1;
+}
+
+
+SWIGINTERN int _wrap_new__THyPhy__SWIG_1(PyObject *self, PyObject *args) {
+  PyObject *resultobj = 0;
+  _ProgressCancelHandler *arg1 = (_ProgressCancelHandler *) 0 ;
+  char *arg2 = (char *) 0 ;
+  int res2 ;
+  char *buf2 = 0 ;
+  int alloc2 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  _THyPhy *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:new__THyPhy",&obj1,&obj2)) SWIG_fail;
+  {
+    int res = SWIG_ConvertFunctionPtr(obj1, (void**)(&arg1), SWIGTYPE_p_f_p_char_int_double__bool);
+    if (!SWIG_IsOK(res)) {
+      SWIG_exception_fail(SWIG_ArgError(res), "in method '" "new__THyPhy" "', argument " "1"" of type '" "_ProgressCancelHandler *""'"); 
+    }
+  }
+  res2 = SWIG_AsCharPtrAndSize(obj2, &buf2, NULL, &alloc2);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "new__THyPhy" "', argument " "2"" of type '" "char const *""'");
+  }
+  arg2 = reinterpret_cast< char * >(buf2);
+  result = (_THyPhy *)new _THyPhy(arg1,(char const *)arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p__THyPhy, SWIG_BUILTIN_INIT |  0 );
+  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
+  return resultobj == Py_None ? 1 : 0;
+fail:
+  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
+  return -1;
+}
+
+
+SWIGINTERN int _wrap_new__THyPhy__SWIG_2(PyObject *self, PyObject *args) {
+  PyObject *resultobj = 0;
+  char *arg1 = (char *) 0 ;
+  long arg2 ;
+  int res1 ;
+  char *buf1 = 0 ;
+  int alloc1 = 0 ;
+  long val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  _THyPhy *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:new__THyPhy",&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_AsCharPtrAndSize(obj1, &buf1, NULL, &alloc1);
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new__THyPhy" "', argument " "1"" of type '" "char const *""'");
+  }
+  arg1 = reinterpret_cast< char * >(buf1);
+  ecode2 = SWIG_AsVal_long(obj2, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "new__THyPhy" "', argument " "2"" of type '" "long""'");
+  } 
+  arg2 = static_cast< long >(val2);
+  result = (_THyPhy *)new _THyPhy((char const *)arg1,arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p__THyPhy, SWIG_BUILTIN_INIT |  0 );
+  if (alloc1 == SWIG_NEWOBJ) delete[] buf1;
+  return resultobj == Py_None ? 1 : 0;
+fail:
+  if (alloc1 == SWIG_NEWOBJ) delete[] buf1;
+  return -1;
+}
+
+
+SWIGINTERN int _wrap_new__THyPhy__SWIG_3(PyObject *self, PyObject *args) {
+  PyObject *resultobj = 0;
+  char *arg1 = (char *) 0 ;
+  int res1 ;
+  char *buf1 = 0 ;
+  int alloc1 = 0 ;
+  PyObject * obj1 = 0 ;
+  _THyPhy *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:new__THyPhy",&obj1)) SWIG_fail;
+  res1 = SWIG_AsCharPtrAndSize(obj1, &buf1, NULL, &alloc1);
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new__THyPhy" "', argument " "1"" of type '" "char const *""'");
+  }
+  arg1 = reinterpret_cast< char * >(buf1);
+  result = (_THyPhy *)new _THyPhy((char const *)arg1);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p__THyPhy, SWIG_BUILTIN_INIT |  0 );
+  if (alloc1 == SWIG_NEWOBJ) delete[] buf1;
+  return resultobj == Py_None ? 1 : 0;
+fail:
+  if (alloc1 == SWIG_NEWOBJ) delete[] buf1;
+  return -1;
+}
+
+
+SWIGINTERN int _wrap_new__THyPhy(PyObject *self, PyObject *args) {
+  int argc;
+  PyObject *argv[4];
+  int ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? (int)PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 3) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 1) {
+    int _v;
+    int res = SWIG_AsCharPtrAndSize(argv[0], 0, NULL, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      return _wrap_new__THyPhy__SWIG_3(self, args);
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    void *ptr = 0;
+    int res = SWIG_ConvertFunctionPtr(argv[0], &ptr, SWIGTYPE_p_f_p_char_int_double__bool);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      int res = SWIG_AsCharPtrAndSize(argv[1], 0, NULL, 0);
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        return _wrap_new__THyPhy__SWIG_1(self, args);
+      }
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    int res = SWIG_AsCharPtrAndSize(argv[0], 0, NULL, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_long(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_new__THyPhy__SWIG_2(self, args);
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    void *ptr = 0;
+    int res = SWIG_ConvertFunctionPtr(argv[0], &ptr, SWIGTYPE_p_f_p_char_int_double__bool);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      int res = SWIG_AsCharPtrAndSize(argv[1], 0, NULL, 0);
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        {
+          int res = SWIG_AsVal_long(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          return _wrap_new__THyPhy__SWIG_0(self, args);
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'new__THyPhy'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    _THyPhy::_THyPhy(_ProgressCancelHandler *,char const *,long)\n"
+    "    _THyPhy::_THyPhy(_ProgressCancelHandler *,char const *)\n"
+    "    _THyPhy::_THyPhy(char const *,long)\n"
+    "    _THyPhy::_THyPhy(char const *)\n");
+  return -1;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete__THyPhy(PyObject *self, PyObject *args) {
+  PyObject *resultobj = 0;
+  _THyPhy *arg1 = (_THyPhy *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  
+  if (args && PyTuple_Check(args) && PyTuple_GET_SIZE(args) > 0) SWIG_fail;
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p__THyPhy, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete__THyPhy" "', argument " "1"" of type '" "_THyPhy *""'"); 
+  }
+  arg1 = reinterpret_cast< _THyPhy * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap__THyPhy_ExecuteBF__SWIG_0(PyObject *self, PyObject *args) {
+  PyObject *resultobj = 0;
+  _THyPhy *arg1 = (_THyPhy *) 0 ;
+  char *arg2 = (char *) 0 ;
+  bool arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int res2 ;
+  char *buf2 = 0 ;
+  int alloc2 = 0 ;
+  bool val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  _THyPhyString *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:_THyPhy_ExecuteBF",&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p__THyPhy, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "_THyPhy_ExecuteBF" "', argument " "1"" of type '" "_THyPhy *""'"); 
+  }
+  arg1 = reinterpret_cast< _THyPhy * >(argp1);
+  res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "_THyPhy_ExecuteBF" "', argument " "2"" of type '" "char const *""'");
+  }
+  arg2 = reinterpret_cast< char * >(buf2);
+  ecode3 = SWIG_AsVal_bool(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "_THyPhy_ExecuteBF" "', argument " "3"" of type '" "bool""'");
+  } 
+  arg3 = static_cast< bool >(val3);
+  result = (_THyPhyString *)(arg1)->ExecuteBF((char const *)arg2,arg3);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p__THyPhyString, 0 |  0 );
+  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
+  return resultobj;
+fail:
+  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap__THyPhy_ExecuteBF__SWIG_1(PyObject *self, PyObject *args) {
+  PyObject *resultobj = 0;
+  _THyPhy *arg1 = (_THyPhy *) 0 ;
+  char *arg2 = (char *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int res2 ;
+  char *buf2 = 0 ;
+  int alloc2 = 0 ;
+  PyObject * obj1 = 0 ;
+  _THyPhyString *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:_THyPhy_ExecuteBF",&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p__THyPhy, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "_THyPhy_ExecuteBF" "', argument " "1"" of type '" "_THyPhy *""'"); 
+  }
+  arg1 = reinterpret_cast< _THyPhy * >(argp1);
+  res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "_THyPhy_ExecuteBF" "', argument " "2"" of type '" "char const *""'");
+  }
+  arg2 = reinterpret_cast< char * >(buf2);
+  result = (_THyPhyString *)(arg1)->ExecuteBF((char const *)arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p__THyPhyString, 0 |  0 );
+  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
+  return resultobj;
+fail:
+  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap__THyPhy_ExecuteBF(PyObject *self, PyObject *args) {
+  int argc;
+  PyObject *argv[4];
+  int ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? (int)PyObject_Length(args) : 0;
+  argv[0] = self;
+  for (ii = 0; (ii < 2) && (ii < argc); ii++) {
+    argv[ii + 1] = PyTuple_GET_ITEM(args,ii);
+  }
+  argc++;
+  if (argc == 2) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p__THyPhy, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      int res = SWIG_AsCharPtrAndSize(argv[1], 0, NULL, 0);
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        return _wrap__THyPhy_ExecuteBF__SWIG_1(self, args);
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p__THyPhy, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      int res = SWIG_AsCharPtrAndSize(argv[1], 0, NULL, 0);
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        {
+          int res = SWIG_AsVal_bool(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          return _wrap__THyPhy_ExecuteBF__SWIG_0(self, args);
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function '_THyPhy_ExecuteBF'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    _THyPhy::ExecuteBF(char const *,bool)\n"
+    "    _THyPhy::ExecuteBF(char const *)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap__THyPhy_InitTHyPhy(PyObject *self, PyObject *args) {
+  PyObject *resultobj = 0;
+  _THyPhy *arg1 = (_THyPhy *) 0 ;
+  _ProgressCancelHandler *arg2 = (_ProgressCancelHandler *) 0 ;
+  char *arg3 = (char *) 0 ;
+  long arg4 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int res3 ;
+  char *buf3 = 0 ;
+  int alloc3 = 0 ;
+  long val4 ;
+  int ecode4 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  PyObject * obj3 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:_THyPhy_InitTHyPhy",&obj1,&obj2,&obj3)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p__THyPhy, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "_THyPhy_InitTHyPhy" "', argument " "1"" of type '" "_THyPhy *""'"); 
+  }
+  arg1 = reinterpret_cast< _THyPhy * >(argp1);
+  {
+    int res = SWIG_ConvertFunctionPtr(obj1, (void**)(&arg2), SWIGTYPE_p_f_p_char_int_double__bool);
+    if (!SWIG_IsOK(res)) {
+      SWIG_exception_fail(SWIG_ArgError(res), "in method '" "_THyPhy_InitTHyPhy" "', argument " "2"" of type '" "_ProgressCancelHandler *""'"); 
+    }
+  }
+  res3 = SWIG_AsCharPtrAndSize(obj2, &buf3, NULL, &alloc3);
+  if (!SWIG_IsOK(res3)) {
+    SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "_THyPhy_InitTHyPhy" "', argument " "3"" of type '" "char const *""'");
+  }
+  arg3 = reinterpret_cast< char * >(buf3);
+  ecode4 = SWIG_AsVal_long(obj3, &val4);
+  if (!SWIG_IsOK(ecode4)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "_THyPhy_InitTHyPhy" "', argument " "4"" of type '" "long""'");
+  } 
+  arg4 = static_cast< long >(val4);
+  (arg1)->InitTHyPhy(arg2,(char const *)arg3,arg4);
+  resultobj = SWIG_Py_Void();
+  if (alloc3 == SWIG_NEWOBJ) delete[] buf3;
+  return resultobj;
+fail:
+  if (alloc3 == SWIG_NEWOBJ) delete[] buf3;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap__THyPhy_ClearAll(PyObject *self, PyObject *args) {
+  PyObject *resultobj = 0;
+  _THyPhy *arg1 = (_THyPhy *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  
+  if (args && PyTuple_Check(args) && PyTuple_GET_SIZE(args) > 0) SWIG_fail;
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p__THyPhy, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "_THyPhy_ClearAll" "', argument " "1"" of type '" "_THyPhy *""'"); 
+  }
+  arg1 = reinterpret_cast< _THyPhy * >(argp1);
+  (arg1)->ClearAll();
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap__THyPhy_AskFor(PyObject *self, PyObject *args) {
+  PyObject *resultobj = 0;
+  _THyPhy *arg1 = (_THyPhy *) 0 ;
+  char *arg2 = (char *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int res2 ;
+  char *buf2 = 0 ;
+  int alloc2 = 0 ;
+  PyObject * obj1 = 0 ;
+  void *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:_THyPhy_AskFor",&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p__THyPhy, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "_THyPhy_AskFor" "', argument " "1"" of type '" "_THyPhy *""'"); 
+  }
+  arg1 = reinterpret_cast< _THyPhy * >(argp1);
+  res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "_THyPhy_AskFor" "', argument " "2"" of type '" "char const *""'");
+  }
+  arg2 = reinterpret_cast< char * >(buf2);
+  result = (void *)(arg1)->AskFor((char const *)arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_void, 0 |  0 );
+  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
+  return resultobj;
+fail:
+  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap__THyPhy_DumpResult(PyObject *self, PyObject *args) {
+  PyObject *resultobj = 0;
+  _THyPhy *arg1 = (_THyPhy *) 0 ;
+  void *arg2 = (void *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int res2 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:_THyPhy_DumpResult",&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p__THyPhy, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "_THyPhy_DumpResult" "', argument " "1"" of type '" "_THyPhy *""'"); 
+  }
+  arg1 = reinterpret_cast< _THyPhy * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1,SWIG_as_voidptrptr(&arg2), 0, 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "_THyPhy_DumpResult" "', argument " "2"" of type '" "void *""'"); 
+  }
+  (arg1)->DumpResult(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap__THyPhy_CanCast(PyObject *self, PyObject *args) {
+  PyObject *resultobj = 0;
+  _THyPhy *arg1 = (_THyPhy *) 0 ;
+  void *arg2 = (void *) 0 ;
+  int arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int res2 ;
+  int val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  bool result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:_THyPhy_CanCast",&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p__THyPhy, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "_THyPhy_CanCast" "', argument " "1"" of type '" "_THyPhy *""'"); 
+  }
+  arg1 = reinterpret_cast< _THyPhy * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1,SWIG_as_voidptrptr(&arg2), 0, 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "_THyPhy_CanCast" "', argument " "2"" of type '" "void const *""'"); 
+  }
+  ecode3 = SWIG_AsVal_int(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "_THyPhy_CanCast" "', argument " "3"" of type '" "int""'");
+  } 
+  arg3 = static_cast< int >(val3);
+  result = (bool)(arg1)->CanCast((void const *)arg2,arg3);
+  resultobj = SWIG_From_bool(static_cast< bool >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap__THyPhy_CastResult(PyObject *self, PyObject *args) {
+  PyObject *resultobj = 0;
+  _THyPhy *arg1 = (_THyPhy *) 0 ;
+  void *arg2 = (void *) 0 ;
+  int arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int res2 ;
+  int val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  _THyPhyReturnObject *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:_THyPhy_CastResult",&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p__THyPhy, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "_THyPhy_CastResult" "', argument " "1"" of type '" "_THyPhy *""'"); 
+  }
+  arg1 = reinterpret_cast< _THyPhy * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1,SWIG_as_voidptrptr(&arg2), 0, 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "_THyPhy_CastResult" "', argument " "2"" of type '" "void const *""'"); 
+  }
+  ecode3 = SWIG_AsVal_int(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "_THyPhy_CastResult" "', argument " "3"" of type '" "int""'");
+  } 
+  arg3 = static_cast< int >(val3);
+  result = (_THyPhyReturnObject *)(arg1)->CastResult((void const *)arg2,arg3);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p__THyPhyReturnObject, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap__THyPhy_SetCallbackHandler(PyObject *self, PyObject *args) {
+  PyObject *resultobj = 0;
+  _THyPhy *arg1 = (_THyPhy *) 0 ;
+  _ProgressCancelHandler *arg2 = (_ProgressCancelHandler *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:_THyPhy_SetCallbackHandler",&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p__THyPhy, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "_THyPhy_SetCallbackHandler" "', argument " "1"" of type '" "_THyPhy *""'"); 
+  }
+  arg1 = reinterpret_cast< _THyPhy * >(argp1);
+  {
+    int res = SWIG_ConvertFunctionPtr(obj1, (void**)(&arg2), SWIGTYPE_p_f_p_char_int_double__bool);
+    if (!SWIG_IsOK(res)) {
+      SWIG_exception_fail(SWIG_ArgError(res), "in method '" "_THyPhy_SetCallbackHandler" "', argument " "2"" of type '" "_ProgressCancelHandler *""'"); 
+    }
+  }
+  (arg1)->SetCallbackHandler(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap__THyPhy_GetCallbackHandler(PyObject *self, PyObject *args) {
+  PyObject *resultobj = 0;
+  _THyPhy *arg1 = (_THyPhy *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  _ProgressCancelHandler *result = 0 ;
+  
+  if (args && PyTuple_Check(args) && PyTuple_GET_SIZE(args) > 0) SWIG_fail;
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p__THyPhy, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "_THyPhy_GetCallbackHandler" "', argument " "1"" of type '" "_THyPhy *""'"); 
+  }
+  arg1 = reinterpret_cast< _THyPhy * >(argp1);
+  result = (_ProgressCancelHandler *)(arg1)->GetCallbackHandler();
+  resultobj = SWIG_NewFunctionPtrObj((void *)(result), SWIGTYPE_p_f_p_char_int_double__bool);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap__THyPhy_GetWarnings(PyObject *self, PyObject *args) {
+  PyObject *resultobj = 0;
+  _THyPhy *arg1 = (_THyPhy *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  _THyPhyString *result = 0 ;
+  
+  if (args && PyTuple_Check(args) && PyTuple_GET_SIZE(args) > 0) SWIG_fail;
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p__THyPhy, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "_THyPhy_GetWarnings" "', argument " "1"" of type '" "_THyPhy *""'"); 
+  }
+  arg1 = reinterpret_cast< _THyPhy * >(argp1);
+  result = (_THyPhyString *)(arg1)->GetWarnings();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p__THyPhyString, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap__THyPhy_GetErrors(PyObject *self, PyObject *args) {
+  PyObject *resultobj = 0;
+  _THyPhy *arg1 = (_THyPhy *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  _THyPhyString *result = 0 ;
+  
+  if (args && PyTuple_Check(args) && PyTuple_GET_SIZE(args) > 0) SWIG_fail;
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p__THyPhy, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "_THyPhy_GetErrors" "', argument " "1"" of type '" "_THyPhy *""'"); 
+  }
+  arg1 = reinterpret_cast< _THyPhy * >(argp1);
+  result = (_THyPhyString *)(arg1)->GetErrors();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p__THyPhyString, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap__THyPhy_GetStdout(PyObject *self, PyObject *args) {
+  PyObject *resultobj = 0;
+  _THyPhy *arg1 = (_THyPhy *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  _THyPhyString *result = 0 ;
+  
+  if (args && PyTuple_Check(args) && PyTuple_GET_SIZE(args) > 0) SWIG_fail;
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p__THyPhy, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "_THyPhy_GetStdout" "', argument " "1"" of type '" "_THyPhy *""'"); 
+  }
+  arg1 = reinterpret_cast< _THyPhy * >(argp1);
+  result = (_THyPhyString *)(arg1)->GetStdout();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p__THyPhyString, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap__THyPhy_PushWarning(PyObject *self, PyObject *args) {
+  PyObject *resultobj = 0;
+  _THyPhy *arg1 = (_THyPhy *) 0 ;
+  void *arg2 = (void *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int res2 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:_THyPhy_PushWarning",&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p__THyPhy, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "_THyPhy_PushWarning" "', argument " "1"" of type '" "_THyPhy *""'"); 
+  }
+  arg1 = reinterpret_cast< _THyPhy * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1,SWIG_as_voidptrptr(&arg2), 0, 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "_THyPhy_PushWarning" "', argument " "2"" of type '" "void *""'"); 
+  }
+  (arg1)->PushWarning(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap__THyPhy_PushError(PyObject *self, PyObject *args) {
+  PyObject *resultobj = 0;
+  _THyPhy *arg1 = (_THyPhy *) 0 ;
+  void *arg2 = (void *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int res2 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:_THyPhy_PushError",&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p__THyPhy, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "_THyPhy_PushError" "', argument " "1"" of type '" "_THyPhy *""'"); 
+  }
+  arg1 = reinterpret_cast< _THyPhy * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1,SWIG_as_voidptrptr(&arg2), 0, 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "_THyPhy_PushError" "', argument " "2"" of type '" "void *""'"); 
+  }
+  (arg1)->PushError(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap__THyPhy_PushOutString(PyObject *self, PyObject *args) {
+  PyObject *resultobj = 0;
+  _THyPhy *arg1 = (_THyPhy *) 0 ;
+  void *arg2 = (void *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int res2 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:_THyPhy_PushOutString",&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p__THyPhy, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "_THyPhy_PushOutString" "', argument " "1"" of type '" "_THyPhy *""'"); 
+  }
+  arg1 = reinterpret_cast< _THyPhy * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1,SWIG_as_voidptrptr(&arg2), 0, 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "_THyPhy_PushOutString" "', argument " "2"" of type '" "void *""'"); 
+  }
+  (arg1)->PushOutString(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap__THyPhyGetLongStatus(PyObject *self, PyObject *args) {
+  PyObject *resultobj = 0;
+  long result;
+  
+  if (!PyArg_ParseTuple(args,(char *)":_THyPhyGetLongStatus")) SWIG_fail;
+  result = (long)_THyPhyGetLongStatus();
+  resultobj = SWIG_From_long(static_cast< long >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap__THyPhyGetStringStatus(PyObject *self, PyObject *args) {
+  PyObject *resultobj = 0;
+  char *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)":_THyPhyGetStringStatus")) SWIG_fail;
+  result = (char *)_THyPhyGetStringStatus();
+  resultobj = SWIG_FromCharPtr((const char *)result);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap__THyPhyGetDoubleStatus(PyObject *self, PyObject *args) {
+  PyObject *resultobj = 0;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)":_THyPhyGetDoubleStatus")) SWIG_fail;
+  result = (double)_THyPhyGetDoubleStatus();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN int Swig_var_globalInterfaceInstance_set(PyObject *_val) {
+  {
+    void *argp = 0;
+    int res = SWIG_ConvertPtr(_val, &argp, SWIGTYPE_p__THyPhy,  0 );  
+    if (!SWIG_IsOK(res)) {
+      SWIG_exception_fail(SWIG_ArgError(res), "in variable '""globalInterfaceInstance""' of type '""_THyPhy *""'");
+    }
+    globalInterfaceInstance = reinterpret_cast< _THyPhy * >(argp);
+  }
+  return 0;
+fail:
+  return 1;
+}
+
+
+SWIGINTERN PyObject *Swig_var_globalInterfaceInstance_get(void) {
+  PyObject *pyobj = 0;
+  PyObject *self = 0;
+  
+  (void)self;
+  pyobj = SWIG_NewPointerObj(SWIG_as_voidptr(globalInterfaceInstance), SWIGTYPE_p__THyPhy,  0 );
+  return pyobj;
+}
+
+
+static PyMethodDef SwigMethods[] = {
+	 { (char *)"SWIG_PyInstanceMethod_New", (PyCFunction)SWIG_PyInstanceMethod_New, METH_O, NULL},
+	 { (char *)"_THyPhyGetLongStatus", _wrap__THyPhyGetLongStatus, METH_VARARGS, NULL},
+	 { (char *)"_THyPhyGetStringStatus", _wrap__THyPhyGetStringStatus, METH_VARARGS, NULL},
+	 { (char *)"_THyPhyGetDoubleStatus", _wrap__THyPhyGetDoubleStatus, METH_VARARGS, NULL},
+	 { NULL, NULL, 0, NULL }
+};
+
+SWIGPY_DESTRUCTOR_CLOSURE(_wrap_delete__THyPhyReturnObject)
+SWIGINTERN PyGetSetDef SwigPyBuiltin___THyPhyReturnObject_getset[] = {
+    {NULL, NULL, NULL, NULL, NULL} /* Sentinel */
+};
+
+SWIGINTERN PyObject *
+SwigPyBuiltin___THyPhyReturnObject_richcompare(PyObject *self, PyObject *other, int op) {
+  PyObject *result = NULL;
+  PyObject *tuple = PyTuple_New(1);
+  assert(tuple);
+  PyTuple_SET_ITEM(tuple, 0, other);
+  Py_XINCREF(other);
+  if (!result) {
+    if (SwigPyObject_Check(self) && SwigPyObject_Check(other)) {
+      result = SwigPyObject_richcompare((SwigPyObject *)self, (SwigPyObject *)other, op);
+    } else {
+      result = Py_NotImplemented;
+      Py_INCREF(result);
+    }
+  }
+  Py_DECREF(tuple);
+  return result;
+}
+
+SWIGINTERN PyMethodDef SwigPyBuiltin___THyPhyReturnObject_methods[] = {
+  { "myType", (PyCFunction) _wrap__THyPhyReturnObject_myType, METH_VARARGS, (char*) "" },
+  { "castToString", (PyCFunction) _wrap__THyPhyReturnObject_castToString, METH_VARARGS, (char*) "" },
+  { "castToNumber", (PyCFunction) _wrap__THyPhyReturnObject_castToNumber, METH_VARARGS, (char*) "" },
+  { "castToMatrix", (PyCFunction) _wrap__THyPhyReturnObject_castToMatrix, METH_VARARGS, (char*) "" },
+  { NULL, NULL, 0, NULL } /* Sentinel */
+};
+
+static PyHeapTypeObject SwigPyBuiltin___THyPhyReturnObject_type = {
+  {
+#if PY_VERSION_HEX >= 0x03000000
+    PyVarObject_HEAD_INIT(NULL, 0)
+#else
+    PyObject_HEAD_INIT(NULL)
+    0,                                        /* ob_size */
+#endif
+    "_THyPhyReturnObject",                    /* tp_name */
+    sizeof(SwigPyObject),                     /* tp_basicsize */
+    0,                                        /* tp_itemsize */
+    (destructor) _wrap_delete__THyPhyReturnObject_closure, /* tp_dealloc */
+    (printfunc) 0,                            /* tp_print */
+    (getattrfunc) 0,                          /* tp_getattr */
+    (setattrfunc) 0,                          /* tp_setattr */
+#if PY_VERSION_HEX >= 0x03000000
+    0,                                        /* tp_compare */
+#else
+    (cmpfunc) 0,                              /* tp_compare */
+#endif
+    (reprfunc) 0,                             /* tp_repr */
+    &SwigPyBuiltin___THyPhyReturnObject_type.as_number,      /* tp_as_number */
+    &SwigPyBuiltin___THyPhyReturnObject_type.as_sequence,    /* tp_as_sequence */
+    &SwigPyBuiltin___THyPhyReturnObject_type.as_mapping,     /* tp_as_mapping */
+    (hashfunc) 0,                             /* tp_hash */
+    (ternaryfunc) 0,                          /* tp_call */
+    (reprfunc) 0,                             /* tp_str */
+    (getattrofunc) 0,                         /* tp_getattro */
+    (setattrofunc) 0,                         /* tp_setattro */
+    &SwigPyBuiltin___THyPhyReturnObject_type.as_buffer,      /* tp_as_buffer */
+#if PY_VERSION_HEX >= 0x03000000
+    Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE,   /* tp_flags */
+#else
+    Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_CHECKTYPES, /* tp_flags */
+#endif
+    "::_THyPhyReturnObject",                  /* tp_doc */
+    (traverseproc) 0,                         /* tp_traverse */
+    (inquiry) 0,                              /* tp_clear */
+    (richcmpfunc) SwigPyBuiltin___THyPhyReturnObject_richcompare, /* feature:python:tp_richcompare */
+    0,                                        /* tp_weaklistoffset */
+    (getiterfunc) 0,                          /* tp_iter */
+    (iternextfunc) 0,                         /* tp_iternext */
+    SwigPyBuiltin___THyPhyReturnObject_methods, /* tp_methods */
+    0,                                        /* tp_members */
+    SwigPyBuiltin___THyPhyReturnObject_getset, /* tp_getset */
+    0,                                        /* tp_base */
+    0,                                        /* tp_dict */
+    (descrgetfunc) 0,                         /* tp_descr_get */
+    (descrsetfunc) 0,                         /* tp_descr_set */
+    (size_t)(((char*)&((SwigPyObject *) 64L)->dict) - (char*) 64L), /* tp_dictoffset */
+    (initproc) SwigPyBuiltin_BadInit,         /* tp_init */
+    (allocfunc) 0,                            /* tp_alloc */
+    (newfunc) 0,                              /* tp_new */
+    (freefunc) 0,                             /* tp_free */
+    (inquiry) 0,                              /* tp_is_gc */
+    (PyObject*) 0,                            /* tp_bases */
+    (PyObject*) 0,                            /* tp_mro */
+    (PyObject*) 0,                            /* tp_cache */
+    (PyObject*) 0,                            /* tp_subclasses */
+    (PyObject*) 0,                            /* tp_weaklist */
+    (destructor) 0,                           /* tp_del */
+#if PY_VERSION_HEX >= 0x02060000
+    (int) 0,                                  /* tp_version_tag */
+#endif
+  },
+  {
+    (binaryfunc) 0,                           /* nb_add */
+    (binaryfunc) 0,                           /* nb_subtract */
+    (binaryfunc) 0,                           /* nb_multiply */
+#if PY_VERSION_HEX < 0x03000000
+    (binaryfunc) 0,                           /* nb_divide */
+#endif
+    (binaryfunc) 0,                           /* nb_remainder */
+    (binaryfunc) 0,                           /* nb_divmod */
+    (ternaryfunc) 0,                          /* nb_power */
+    (unaryfunc) 0,                            /* nb_negative */
+    (unaryfunc) 0,                            /* nb_positive */
+    (unaryfunc) 0,                            /* nb_absolute */
+    (inquiry) 0,                              /* nb_nonzero */
+    (unaryfunc) 0,                            /* nb_invert */
+    (binaryfunc) 0,                           /* nb_lshift */
+    (binaryfunc) 0,                           /* nb_rshift */
+    (binaryfunc) 0,                           /* nb_and */
+    (binaryfunc) 0,                           /* nb_xor */
+    (binaryfunc) 0,                           /* nb_or */
+#if PY_VERSION_HEX < 0x03000000
+    (coercion) 0,                             /* nb_coerce */
+#endif
+    (unaryfunc) 0,                            /* nb_int */
+#if PY_VERSION_HEX >= 0x03000000
+    (void*) 0,                                /* nb_reserved */
+#else
+    (unaryfunc) 0,                            /* nb_long */
+#endif
+    (unaryfunc) 0,                            /* nb_float */
+#if PY_VERSION_HEX < 0x03000000
+    (unaryfunc) 0,                            /* nb_oct */
+    (unaryfunc) 0,                            /* nb_hex */
+#endif
+    (binaryfunc) 0,                           /* nb_inplace_add */
+    (binaryfunc) 0,                           /* nb_inplace_subtract */
+    (binaryfunc) 0,                           /* nb_inplace_multiply */
+#if PY_VERSION_HEX < 0x03000000
+    (binaryfunc) 0,                           /* nb_inplace_divide */
+#endif
+    (binaryfunc) 0,                           /* nb_inplace_remainder */
+    (ternaryfunc) 0,                          /* nb_inplace_power */
+    (binaryfunc) 0,                           /* nb_inplace_lshift */
+    (binaryfunc) 0,                           /* nb_inplace_rshift */
+    (binaryfunc) 0,                           /* nb_inplace_and */
+    (binaryfunc) 0,                           /* nb_inplace_xor */
+    (binaryfunc) 0,                           /* nb_inplace_or */
+    (binaryfunc) 0,                           /* nb_floor_divide */
+    (binaryfunc) 0,                           /* nb_true_divide */
+    (binaryfunc) 0,                           /* nb_inplace_floor_divide */
+    (binaryfunc) 0,                           /* nb_inplace_true_divide */
+#if PY_VERSION_HEX >= 0x02050000
+    (unaryfunc) 0,                            /* nb_index */
+#endif
+  },
+  {
+    (lenfunc) 0,                              /* mp_length */
+    (binaryfunc) 0,                           /* mp_subscript */
+    (objobjargproc) 0,                        /* mp_ass_subscript */
+  },
+  {
+    (lenfunc) 0,                              /* sq_length */
+    (binaryfunc) 0,                           /* sq_concat */
+    (ssizeargfunc) 0,                         /* sq_repeat */
+    (ssizeargfunc) 0,                         /* sq_item */
+#if PY_VERSION_HEX >= 0x03000000
+    (void*) 0,                                /* was_sq_slice */
+#else
+    (ssizessizeargfunc) 0,                    /* sq_slice */
+#endif
+    (ssizeobjargproc) 0,                      /* sq_ass_item */
+#if PY_VERSION_HEX >= 0x03000000
+    (void*) 0,                                /* was_sq_ass_slice */
+#else
+    (ssizessizeobjargproc) 0,                 /* sq_ass_slice */
+#endif
+    (objobjproc) 0,                           /* sq_contains */
+    (binaryfunc) 0,                           /* sq_inplace_concat */
+    (ssizeargfunc) 0,                         /* sq_inplace_repeat */
+  },
+  {
+#if PY_VERSION_HEX < 0x03000000
+    (readbufferproc) 0,                       /* bf_getreadbuffer */
+    (writebufferproc) 0,                      /* bf_getwritebuffer */
+    (segcountproc) 0,                         /* bf_getsegcount */
+    (charbufferproc) 0,                       /* bf_getcharbuffer */
+#endif
+#if PY_VERSION_HEX >= 0x02060000
+    (getbufferproc) 0,                        /* bf_getbuffer */
+    (releasebufferproc) 0,                    /* bf_releasebuffer */
+#endif
+  },
+    (PyObject*) 0,                            /* ht_name */
+    (PyObject*) 0,                            /* ht_slots */
+};
+
+SWIGINTERN SwigPyClientData SwigPyBuiltin___THyPhyReturnObject_clientdata = {0, 0, 0, 0, 0, 0, (PyTypeObject *)&SwigPyBuiltin___THyPhyReturnObject_type};
+
+SWIGPY_DESTRUCTOR_CLOSURE(_wrap_delete__THyPhyString)
+static SwigPyGetSet _THyPhyString_sData_getset = { _wrap__THyPhyString_sData_get, _wrap__THyPhyString_sData_set };
+static SwigPyGetSet _THyPhyString_sLength_getset = { _wrap__THyPhyString_sLength_get, _wrap__THyPhyString_sLength_set };
+SWIGINTERN PyGetSetDef SwigPyBuiltin___THyPhyString_getset[] = {
+    { (char*) "sData", (getter) SwigPyBuiltin_GetterClosure, (setter) SwigPyBuiltin_SetterClosure, (char*)"_THyPhyString.sData", (void*) &_THyPhyString_sData_getset }
+,
+    { (char*) "sLength", (getter) SwigPyBuiltin_GetterClosure, (setter) SwigPyBuiltin_SetterClosure, (char*)"_THyPhyString.sLength", (void*) &_THyPhyString_sLength_getset }
+,
+    {NULL, NULL, NULL, NULL, NULL} /* Sentinel */
+};
+
+SWIGINTERN PyObject *
+SwigPyBuiltin___THyPhyString_richcompare(PyObject *self, PyObject *other, int op) {
+  PyObject *result = NULL;
+  PyObject *tuple = PyTuple_New(1);
+  assert(tuple);
+  PyTuple_SET_ITEM(tuple, 0, other);
+  Py_XINCREF(other);
+  if (!result) {
+    if (SwigPyObject_Check(self) && SwigPyObject_Check(other)) {
+      result = SwigPyObject_richcompare((SwigPyObject *)self, (SwigPyObject *)other, op);
+    } else {
+      result = Py_NotImplemented;
+      Py_INCREF(result);
+    }
+  }
+  Py_DECREF(tuple);
+  return result;
+}
+
+SWIGINTERN PyMethodDef SwigPyBuiltin___THyPhyString_methods[] = {
+  { "myType", (PyCFunction) _wrap__THyPhyString_myType, METH_VARARGS, (char*) "" },
+  { NULL, NULL, 0, NULL } /* Sentinel */
+};
+
+static PyHeapTypeObject SwigPyBuiltin___THyPhyString_type = {
+  {
+#if PY_VERSION_HEX >= 0x03000000
+    PyVarObject_HEAD_INIT(NULL, 0)
+#else
+    PyObject_HEAD_INIT(NULL)
+    0,                                        /* ob_size */
+#endif
+    "_THyPhyString",                          /* tp_name */
+    sizeof(SwigPyObject),                     /* tp_basicsize */
+    0,                                        /* tp_itemsize */
+    (destructor) _wrap_delete__THyPhyString_closure, /* tp_dealloc */
+    (printfunc) 0,                            /* tp_print */
+    (getattrfunc) 0,                          /* tp_getattr */
+    (setattrfunc) 0,                          /* tp_setattr */
+#if PY_VERSION_HEX >= 0x03000000
+    0,                                        /* tp_compare */
+#else
+    (cmpfunc) 0,                              /* tp_compare */
+#endif
+    (reprfunc) 0,                             /* tp_repr */
+    &SwigPyBuiltin___THyPhyString_type.as_number,      /* tp_as_number */
+    &SwigPyBuiltin___THyPhyString_type.as_sequence,    /* tp_as_sequence */
+    &SwigPyBuiltin___THyPhyString_type.as_mapping,     /* tp_as_mapping */
+    (hashfunc) 0,                             /* tp_hash */
+    (ternaryfunc) 0,                          /* tp_call */
+    (reprfunc) 0,                             /* tp_str */
+    (getattrofunc) 0,                         /* tp_getattro */
+    (setattrofunc) 0,                         /* tp_setattro */
+    &SwigPyBuiltin___THyPhyString_type.as_buffer,      /* tp_as_buffer */
+#if PY_VERSION_HEX >= 0x03000000
+    Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE,   /* tp_flags */
+#else
+    Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_CHECKTYPES, /* tp_flags */
+#endif
+    "::_THyPhyString",                        /* tp_doc */
+    (traverseproc) 0,                         /* tp_traverse */
+    (inquiry) 0,                              /* tp_clear */
+    (richcmpfunc) SwigPyBuiltin___THyPhyString_richcompare, /* feature:python:tp_richcompare */
+    0,                                        /* tp_weaklistoffset */
+    (getiterfunc) 0,                          /* tp_iter */
+    (iternextfunc) 0,                         /* tp_iternext */
+    SwigPyBuiltin___THyPhyString_methods,     /* tp_methods */
+    0,                                        /* tp_members */
+    SwigPyBuiltin___THyPhyString_getset,      /* tp_getset */
+    0,                                        /* tp_base */
+    0,                                        /* tp_dict */
+    (descrgetfunc) 0,                         /* tp_descr_get */
+    (descrsetfunc) 0,                         /* tp_descr_set */
+    (size_t)(((char*)&((SwigPyObject *) 64L)->dict) - (char*) 64L), /* tp_dictoffset */
+    (initproc) _wrap_new__THyPhyString,       /* tp_init */
+    (allocfunc) 0,                            /* tp_alloc */
+    (newfunc) 0,                              /* tp_new */
+    (freefunc) 0,                             /* tp_free */
+    (inquiry) 0,                              /* tp_is_gc */
+    (PyObject*) 0,                            /* tp_bases */
+    (PyObject*) 0,                            /* tp_mro */
+    (PyObject*) 0,                            /* tp_cache */
+    (PyObject*) 0,                            /* tp_subclasses */
+    (PyObject*) 0,                            /* tp_weaklist */
+    (destructor) 0,                           /* tp_del */
+#if PY_VERSION_HEX >= 0x02060000
+    (int) 0,                                  /* tp_version_tag */
+#endif
+  },
+  {
+    (binaryfunc) 0,                           /* nb_add */
+    (binaryfunc) 0,                           /* nb_subtract */
+    (binaryfunc) 0,                           /* nb_multiply */
+#if PY_VERSION_HEX < 0x03000000
+    (binaryfunc) 0,                           /* nb_divide */
+#endif
+    (binaryfunc) 0,                           /* nb_remainder */
+    (binaryfunc) 0,                           /* nb_divmod */
+    (ternaryfunc) 0,                          /* nb_power */
+    (unaryfunc) 0,                            /* nb_negative */
+    (unaryfunc) 0,                            /* nb_positive */
+    (unaryfunc) 0,                            /* nb_absolute */
+    (inquiry) 0,                              /* nb_nonzero */
+    (unaryfunc) 0,                            /* nb_invert */
+    (binaryfunc) 0,                           /* nb_lshift */
+    (binaryfunc) 0,                           /* nb_rshift */
+    (binaryfunc) 0,                           /* nb_and */
+    (binaryfunc) 0,                           /* nb_xor */
+    (binaryfunc) 0,                           /* nb_or */
+#if PY_VERSION_HEX < 0x03000000
+    (coercion) 0,                             /* nb_coerce */
+#endif
+    (unaryfunc) 0,                            /* nb_int */
+#if PY_VERSION_HEX >= 0x03000000
+    (void*) 0,                                /* nb_reserved */
+#else
+    (unaryfunc) 0,                            /* nb_long */
+#endif
+    (unaryfunc) 0,                            /* nb_float */
+#if PY_VERSION_HEX < 0x03000000
+    (unaryfunc) 0,                            /* nb_oct */
+    (unaryfunc) 0,                            /* nb_hex */
+#endif
+    (binaryfunc) 0,                           /* nb_inplace_add */
+    (binaryfunc) 0,                           /* nb_inplace_subtract */
+    (binaryfunc) 0,                           /* nb_inplace_multiply */
+#if PY_VERSION_HEX < 0x03000000
+    (binaryfunc) 0,                           /* nb_inplace_divide */
+#endif
+    (binaryfunc) 0,                           /* nb_inplace_remainder */
+    (ternaryfunc) 0,                          /* nb_inplace_power */
+    (binaryfunc) 0,                           /* nb_inplace_lshift */
+    (binaryfunc) 0,                           /* nb_inplace_rshift */
+    (binaryfunc) 0,                           /* nb_inplace_and */
+    (binaryfunc) 0,                           /* nb_inplace_xor */
+    (binaryfunc) 0,                           /* nb_inplace_or */
+    (binaryfunc) 0,                           /* nb_floor_divide */
+    (binaryfunc) 0,                           /* nb_true_divide */
+    (binaryfunc) 0,                           /* nb_inplace_floor_divide */
+    (binaryfunc) 0,                           /* nb_inplace_true_divide */
+#if PY_VERSION_HEX >= 0x02050000
+    (unaryfunc) 0,                            /* nb_index */
+#endif
+  },
+  {
+    (lenfunc) 0,                              /* mp_length */
+    (binaryfunc) 0,                           /* mp_subscript */
+    (objobjargproc) 0,                        /* mp_ass_subscript */
+  },
+  {
+    (lenfunc) 0,                              /* sq_length */
+    (binaryfunc) 0,                           /* sq_concat */
+    (ssizeargfunc) 0,                         /* sq_repeat */
+    (ssizeargfunc) 0,                         /* sq_item */
+#if PY_VERSION_HEX >= 0x03000000
+    (void*) 0,                                /* was_sq_slice */
+#else
+    (ssizessizeargfunc) 0,                    /* sq_slice */
+#endif
+    (ssizeobjargproc) 0,                      /* sq_ass_item */
+#if PY_VERSION_HEX >= 0x03000000
+    (void*) 0,                                /* was_sq_ass_slice */
+#else
+    (ssizessizeobjargproc) 0,                 /* sq_ass_slice */
+#endif
+    (objobjproc) 0,                           /* sq_contains */
+    (binaryfunc) 0,                           /* sq_inplace_concat */
+    (ssizeargfunc) 0,                         /* sq_inplace_repeat */
+  },
+  {
+#if PY_VERSION_HEX < 0x03000000
+    (readbufferproc) 0,                       /* bf_getreadbuffer */
+    (writebufferproc) 0,                      /* bf_getwritebuffer */
+    (segcountproc) 0,                         /* bf_getsegcount */
+    (charbufferproc) 0,                       /* bf_getcharbuffer */
+#endif
+#if PY_VERSION_HEX >= 0x02060000
+    (getbufferproc) 0,                        /* bf_getbuffer */
+    (releasebufferproc) 0,                    /* bf_releasebuffer */
+#endif
+  },
+    (PyObject*) 0,                            /* ht_name */
+    (PyObject*) 0,                            /* ht_slots */
+};
+
+SWIGINTERN SwigPyClientData SwigPyBuiltin___THyPhyString_clientdata = {0, 0, 0, 0, 0, 0, (PyTypeObject *)&SwigPyBuiltin___THyPhyString_type};
+
+SWIGPY_DESTRUCTOR_CLOSURE(_wrap_delete__THyPhyNumber)
+static SwigPyGetSet _THyPhyNumber_nValue_getset = { _wrap__THyPhyNumber_nValue_get, _wrap__THyPhyNumber_nValue_set };
+SWIGINTERN PyGetSetDef SwigPyBuiltin___THyPhyNumber_getset[] = {
+    { (char*) "nValue", (getter) SwigPyBuiltin_GetterClosure, (setter) SwigPyBuiltin_SetterClosure, (char*)"_THyPhyNumber.nValue", (void*) &_THyPhyNumber_nValue_getset }
+,
+    {NULL, NULL, NULL, NULL, NULL} /* Sentinel */
+};
+
+SWIGINTERN PyObject *
+SwigPyBuiltin___THyPhyNumber_richcompare(PyObject *self, PyObject *other, int op) {
+  PyObject *result = NULL;
+  PyObject *tuple = PyTuple_New(1);
+  assert(tuple);
+  PyTuple_SET_ITEM(tuple, 0, other);
+  Py_XINCREF(other);
+  if (!result) {
+    if (SwigPyObject_Check(self) && SwigPyObject_Check(other)) {
+      result = SwigPyObject_richcompare((SwigPyObject *)self, (SwigPyObject *)other, op);
+    } else {
+      result = Py_NotImplemented;
+      Py_INCREF(result);
+    }
+  }
+  Py_DECREF(tuple);
+  return result;
+}
+
+SWIGINTERN PyMethodDef SwigPyBuiltin___THyPhyNumber_methods[] = {
+  { "myType", (PyCFunction) _wrap__THyPhyNumber_myType, METH_VARARGS, (char*) "" },
+  { NULL, NULL, 0, NULL } /* Sentinel */
+};
+
+static PyHeapTypeObject SwigPyBuiltin___THyPhyNumber_type = {
+  {
+#if PY_VERSION_HEX >= 0x03000000
+    PyVarObject_HEAD_INIT(NULL, 0)
+#else
+    PyObject_HEAD_INIT(NULL)
+    0,                                        /* ob_size */
+#endif
+    "_THyPhyNumber",                          /* tp_name */
+    sizeof(SwigPyObject),                     /* tp_basicsize */
+    0,                                        /* tp_itemsize */
+    (destructor) _wrap_delete__THyPhyNumber_closure, /* tp_dealloc */
+    (printfunc) 0,                            /* tp_print */
+    (getattrfunc) 0,                          /* tp_getattr */
+    (setattrfunc) 0,                          /* tp_setattr */
+#if PY_VERSION_HEX >= 0x03000000
+    0,                                        /* tp_compare */
+#else
+    (cmpfunc) 0,                              /* tp_compare */
+#endif
+    (reprfunc) 0,                             /* tp_repr */
+    &SwigPyBuiltin___THyPhyNumber_type.as_number,      /* tp_as_number */
+    &SwigPyBuiltin___THyPhyNumber_type.as_sequence,    /* tp_as_sequence */
+    &SwigPyBuiltin___THyPhyNumber_type.as_mapping,     /* tp_as_mapping */
+    (hashfunc) 0,                             /* tp_hash */
+    (ternaryfunc) 0,                          /* tp_call */
+    (reprfunc) 0,                             /* tp_str */
+    (getattrofunc) 0,                         /* tp_getattro */
+    (setattrofunc) 0,                         /* tp_setattro */
+    &SwigPyBuiltin___THyPhyNumber_type.as_buffer,      /* tp_as_buffer */
+#if PY_VERSION_HEX >= 0x03000000
+    Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE,   /* tp_flags */
+#else
+    Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_CHECKTYPES, /* tp_flags */
+#endif
+    "::_THyPhyNumber",                        /* tp_doc */
+    (traverseproc) 0,                         /* tp_traverse */
+    (inquiry) 0,                              /* tp_clear */
+    (richcmpfunc) SwigPyBuiltin___THyPhyNumber_richcompare, /* feature:python:tp_richcompare */
+    0,                                        /* tp_weaklistoffset */
+    (getiterfunc) 0,                          /* tp_iter */
+    (iternextfunc) 0,                         /* tp_iternext */
+    SwigPyBuiltin___THyPhyNumber_methods,     /* tp_methods */
+    0,                                        /* tp_members */
+    SwigPyBuiltin___THyPhyNumber_getset,      /* tp_getset */
+    0,                                        /* tp_base */
+    0,                                        /* tp_dict */
+    (descrgetfunc) 0,                         /* tp_descr_get */
+    (descrsetfunc) 0,                         /* tp_descr_set */
+    (size_t)(((char*)&((SwigPyObject *) 64L)->dict) - (char*) 64L), /* tp_dictoffset */
+    (initproc) _wrap_new__THyPhyNumber,       /* tp_init */
+    (allocfunc) 0,                            /* tp_alloc */
+    (newfunc) 0,                              /* tp_new */
+    (freefunc) 0,                             /* tp_free */
+    (inquiry) 0,                              /* tp_is_gc */
+    (PyObject*) 0,                            /* tp_bases */
+    (PyObject*) 0,                            /* tp_mro */
+    (PyObject*) 0,                            /* tp_cache */
+    (PyObject*) 0,                            /* tp_subclasses */
+    (PyObject*) 0,                            /* tp_weaklist */
+    (destructor) 0,                           /* tp_del */
+#if PY_VERSION_HEX >= 0x02060000
+    (int) 0,                                  /* tp_version_tag */
+#endif
+  },
+  {
+    (binaryfunc) 0,                           /* nb_add */
+    (binaryfunc) 0,                           /* nb_subtract */
+    (binaryfunc) 0,                           /* nb_multiply */
+#if PY_VERSION_HEX < 0x03000000
+    (binaryfunc) 0,                           /* nb_divide */
+#endif
+    (binaryfunc) 0,                           /* nb_remainder */
+    (binaryfunc) 0,                           /* nb_divmod */
+    (ternaryfunc) 0,                          /* nb_power */
+    (unaryfunc) 0,                            /* nb_negative */
+    (unaryfunc) 0,                            /* nb_positive */
+    (unaryfunc) 0,                            /* nb_absolute */
+    (inquiry) 0,                              /* nb_nonzero */
+    (unaryfunc) 0,                            /* nb_invert */
+    (binaryfunc) 0,                           /* nb_lshift */
+    (binaryfunc) 0,                           /* nb_rshift */
+    (binaryfunc) 0,                           /* nb_and */
+    (binaryfunc) 0,                           /* nb_xor */
+    (binaryfunc) 0,                           /* nb_or */
+#if PY_VERSION_HEX < 0x03000000
+    (coercion) 0,                             /* nb_coerce */
+#endif
+    (unaryfunc) 0,                            /* nb_int */
+#if PY_VERSION_HEX >= 0x03000000
+    (void*) 0,                                /* nb_reserved */
+#else
+    (unaryfunc) 0,                            /* nb_long */
+#endif
+    (unaryfunc) 0,                            /* nb_float */
+#if PY_VERSION_HEX < 0x03000000
+    (unaryfunc) 0,                            /* nb_oct */
+    (unaryfunc) 0,                            /* nb_hex */
+#endif
+    (binaryfunc) 0,                           /* nb_inplace_add */
+    (binaryfunc) 0,                           /* nb_inplace_subtract */
+    (binaryfunc) 0,                           /* nb_inplace_multiply */
+#if PY_VERSION_HEX < 0x03000000
+    (binaryfunc) 0,                           /* nb_inplace_divide */
+#endif
+    (binaryfunc) 0,                           /* nb_inplace_remainder */
+    (ternaryfunc) 0,                          /* nb_inplace_power */
+    (binaryfunc) 0,                           /* nb_inplace_lshift */
+    (binaryfunc) 0,                           /* nb_inplace_rshift */
+    (binaryfunc) 0,                           /* nb_inplace_and */
+    (binaryfunc) 0,                           /* nb_inplace_xor */
+    (binaryfunc) 0,                           /* nb_inplace_or */
+    (binaryfunc) 0,                           /* nb_floor_divide */
+    (binaryfunc) 0,                           /* nb_true_divide */
+    (binaryfunc) 0,                           /* nb_inplace_floor_divide */
+    (binaryfunc) 0,                           /* nb_inplace_true_divide */
+#if PY_VERSION_HEX >= 0x02050000
+    (unaryfunc) 0,                            /* nb_index */
+#endif
+  },
+  {
+    (lenfunc) 0,                              /* mp_length */
+    (binaryfunc) 0,                           /* mp_subscript */
+    (objobjargproc) 0,                        /* mp_ass_subscript */
+  },
+  {
+    (lenfunc) 0,                              /* sq_length */
+    (binaryfunc) 0,                           /* sq_concat */
+    (ssizeargfunc) 0,                         /* sq_repeat */
+    (ssizeargfunc) 0,                         /* sq_item */
+#if PY_VERSION_HEX >= 0x03000000
+    (void*) 0,                                /* was_sq_slice */
+#else
+    (ssizessizeargfunc) 0,                    /* sq_slice */
+#endif
+    (ssizeobjargproc) 0,                      /* sq_ass_item */
+#if PY_VERSION_HEX >= 0x03000000
+    (void*) 0,                                /* was_sq_ass_slice */
+#else
+    (ssizessizeobjargproc) 0,                 /* sq_ass_slice */
+#endif
+    (objobjproc) 0,                           /* sq_contains */
+    (binaryfunc) 0,                           /* sq_inplace_concat */
+    (ssizeargfunc) 0,                         /* sq_inplace_repeat */
+  },
+  {
+#if PY_VERSION_HEX < 0x03000000
+    (readbufferproc) 0,                       /* bf_getreadbuffer */
+    (writebufferproc) 0,                      /* bf_getwritebuffer */
+    (segcountproc) 0,                         /* bf_getsegcount */
+    (charbufferproc) 0,                       /* bf_getcharbuffer */
+#endif
+#if PY_VERSION_HEX >= 0x02060000
+    (getbufferproc) 0,                        /* bf_getbuffer */
+    (releasebufferproc) 0,                    /* bf_releasebuffer */
+#endif
+  },
+    (PyObject*) 0,                            /* ht_name */
+    (PyObject*) 0,                            /* ht_slots */
+};
+
+SWIGINTERN SwigPyClientData SwigPyBuiltin___THyPhyNumber_clientdata = {0, 0, 0, 0, 0, 0, (PyTypeObject *)&SwigPyBuiltin___THyPhyNumber_type};
+
+SWIGPY_DESTRUCTOR_CLOSURE(_wrap_delete__THyPhyMatrix)
+static SwigPyGetSet _THyPhyMatrix_mRows_getset = { _wrap__THyPhyMatrix_mRows_get, _wrap__THyPhyMatrix_mRows_set };
+static SwigPyGetSet _THyPhyMatrix_mCols_getset = { _wrap__THyPhyMatrix_mCols_get, _wrap__THyPhyMatrix_mCols_set };
+static SwigPyGetSet _THyPhyMatrix_mData_getset = { _wrap__THyPhyMatrix_mData_get, _wrap__THyPhyMatrix_mData_set };
+SWIGINTERN PyGetSetDef SwigPyBuiltin___THyPhyMatrix_getset[] = {
+    { (char*) "mRows", (getter) SwigPyBuiltin_GetterClosure, (setter) SwigPyBuiltin_SetterClosure, (char*)"_THyPhyMatrix.mRows", (void*) &_THyPhyMatrix_mRows_getset }
+,
+    { (char*) "mCols", (getter) SwigPyBuiltin_GetterClosure, (setter) SwigPyBuiltin_SetterClosure, (char*)"_THyPhyMatrix.mCols", (void*) &_THyPhyMatrix_mCols_getset }
+,
+    { (char*) "mData", (getter) SwigPyBuiltin_GetterClosure, (setter) SwigPyBuiltin_SetterClosure, (char*)"_THyPhyMatrix.mData", (void*) &_THyPhyMatrix_mData_getset }
+,
+    {NULL, NULL, NULL, NULL, NULL} /* Sentinel */
+};
+
+SWIGINTERN PyObject *
+SwigPyBuiltin___THyPhyMatrix_richcompare(PyObject *self, PyObject *other, int op) {
+  PyObject *result = NULL;
+  PyObject *tuple = PyTuple_New(1);
+  assert(tuple);
+  PyTuple_SET_ITEM(tuple, 0, other);
+  Py_XINCREF(other);
+  if (!result) {
+    if (SwigPyObject_Check(self) && SwigPyObject_Check(other)) {
+      result = SwigPyObject_richcompare((SwigPyObject *)self, (SwigPyObject *)other, op);
+    } else {
+      result = Py_NotImplemented;
+      Py_INCREF(result);
+    }
+  }
+  Py_DECREF(tuple);
+  return result;
+}
+
+SWIGINTERN PyMethodDef SwigPyBuiltin___THyPhyMatrix_methods[] = {
+  { "myType", (PyCFunction) _wrap__THyPhyMatrix_myType, METH_VARARGS, (char*) "" },
+  { "MatrixCell", (PyCFunction) _wrap__THyPhyMatrix_MatrixCell, METH_VARARGS, (char*) "" },
+  { NULL, NULL, 0, NULL } /* Sentinel */
+};
+
+static PyHeapTypeObject SwigPyBuiltin___THyPhyMatrix_type = {
+  {
+#if PY_VERSION_HEX >= 0x03000000
+    PyVarObject_HEAD_INIT(NULL, 0)
+#else
+    PyObject_HEAD_INIT(NULL)
+    0,                                        /* ob_size */
+#endif
+    "_THyPhyMatrix",                          /* tp_name */
+    sizeof(SwigPyObject),                     /* tp_basicsize */
+    0,                                        /* tp_itemsize */
+    (destructor) _wrap_delete__THyPhyMatrix_closure, /* tp_dealloc */
+    (printfunc) 0,                            /* tp_print */
+    (getattrfunc) 0,                          /* tp_getattr */
+    (setattrfunc) 0,                          /* tp_setattr */
+#if PY_VERSION_HEX >= 0x03000000
+    0,                                        /* tp_compare */
+#else
+    (cmpfunc) 0,                              /* tp_compare */
+#endif
+    (reprfunc) 0,                             /* tp_repr */
+    &SwigPyBuiltin___THyPhyMatrix_type.as_number,      /* tp_as_number */
+    &SwigPyBuiltin___THyPhyMatrix_type.as_sequence,    /* tp_as_sequence */
+    &SwigPyBuiltin___THyPhyMatrix_type.as_mapping,     /* tp_as_mapping */
+    (hashfunc) 0,                             /* tp_hash */
+    (ternaryfunc) 0,                          /* tp_call */
+    (reprfunc) 0,                             /* tp_str */
+    (getattrofunc) 0,                         /* tp_getattro */
+    (setattrofunc) 0,                         /* tp_setattro */
+    &SwigPyBuiltin___THyPhyMatrix_type.as_buffer,      /* tp_as_buffer */
+#if PY_VERSION_HEX >= 0x03000000
+    Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE,   /* tp_flags */
+#else
+    Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_CHECKTYPES, /* tp_flags */
+#endif
+    "::_THyPhyMatrix",                        /* tp_doc */
+    (traverseproc) 0,                         /* tp_traverse */
+    (inquiry) 0,                              /* tp_clear */
+    (richcmpfunc) SwigPyBuiltin___THyPhyMatrix_richcompare, /* feature:python:tp_richcompare */
+    0,                                        /* tp_weaklistoffset */
+    (getiterfunc) 0,                          /* tp_iter */
+    (iternextfunc) 0,                         /* tp_iternext */
+    SwigPyBuiltin___THyPhyMatrix_methods,     /* tp_methods */
+    0,                                        /* tp_members */
+    SwigPyBuiltin___THyPhyMatrix_getset,      /* tp_getset */
+    0,                                        /* tp_base */
+    0,                                        /* tp_dict */
+    (descrgetfunc) 0,                         /* tp_descr_get */
+    (descrsetfunc) 0,                         /* tp_descr_set */
+    (size_t)(((char*)&((SwigPyObject *) 64L)->dict) - (char*) 64L), /* tp_dictoffset */
+    (initproc) _wrap_new__THyPhyMatrix,       /* tp_init */
+    (allocfunc) 0,                            /* tp_alloc */
+    (newfunc) 0,                              /* tp_new */
+    (freefunc) 0,                             /* tp_free */
+    (inquiry) 0,                              /* tp_is_gc */
+    (PyObject*) 0,                            /* tp_bases */
+    (PyObject*) 0,                            /* tp_mro */
+    (PyObject*) 0,                            /* tp_cache */
+    (PyObject*) 0,                            /* tp_subclasses */
+    (PyObject*) 0,                            /* tp_weaklist */
+    (destructor) 0,                           /* tp_del */
+#if PY_VERSION_HEX >= 0x02060000
+    (int) 0,                                  /* tp_version_tag */
+#endif
+  },
+  {
+    (binaryfunc) 0,                           /* nb_add */
+    (binaryfunc) 0,                           /* nb_subtract */
+    (binaryfunc) 0,                           /* nb_multiply */
+#if PY_VERSION_HEX < 0x03000000
+    (binaryfunc) 0,                           /* nb_divide */
+#endif
+    (binaryfunc) 0,                           /* nb_remainder */
+    (binaryfunc) 0,                           /* nb_divmod */
+    (ternaryfunc) 0,                          /* nb_power */
+    (unaryfunc) 0,                            /* nb_negative */
+    (unaryfunc) 0,                            /* nb_positive */
+    (unaryfunc) 0,                            /* nb_absolute */
+    (inquiry) 0,                              /* nb_nonzero */
+    (unaryfunc) 0,                            /* nb_invert */
+    (binaryfunc) 0,                           /* nb_lshift */
+    (binaryfunc) 0,                           /* nb_rshift */
+    (binaryfunc) 0,                           /* nb_and */
+    (binaryfunc) 0,                           /* nb_xor */
+    (binaryfunc) 0,                           /* nb_or */
+#if PY_VERSION_HEX < 0x03000000
+    (coercion) 0,                             /* nb_coerce */
+#endif
+    (unaryfunc) 0,                            /* nb_int */
+#if PY_VERSION_HEX >= 0x03000000
+    (void*) 0,                                /* nb_reserved */
+#else
+    (unaryfunc) 0,                            /* nb_long */
+#endif
+    (unaryfunc) 0,                            /* nb_float */
+#if PY_VERSION_HEX < 0x03000000
+    (unaryfunc) 0,                            /* nb_oct */
+    (unaryfunc) 0,                            /* nb_hex */
+#endif
+    (binaryfunc) 0,                           /* nb_inplace_add */
+    (binaryfunc) 0,                           /* nb_inplace_subtract */
+    (binaryfunc) 0,                           /* nb_inplace_multiply */
+#if PY_VERSION_HEX < 0x03000000
+    (binaryfunc) 0,                           /* nb_inplace_divide */
+#endif
+    (binaryfunc) 0,                           /* nb_inplace_remainder */
+    (ternaryfunc) 0,                          /* nb_inplace_power */
+    (binaryfunc) 0,                           /* nb_inplace_lshift */
+    (binaryfunc) 0,                           /* nb_inplace_rshift */
+    (binaryfunc) 0,                           /* nb_inplace_and */
+    (binaryfunc) 0,                           /* nb_inplace_xor */
+    (binaryfunc) 0,                           /* nb_inplace_or */
+    (binaryfunc) 0,                           /* nb_floor_divide */
+    (binaryfunc) 0,                           /* nb_true_divide */
+    (binaryfunc) 0,                           /* nb_inplace_floor_divide */
+    (binaryfunc) 0,                           /* nb_inplace_true_divide */
+#if PY_VERSION_HEX >= 0x02050000
+    (unaryfunc) 0,                            /* nb_index */
+#endif
+  },
+  {
+    (lenfunc) 0,                              /* mp_length */
+    (binaryfunc) 0,                           /* mp_subscript */
+    (objobjargproc) 0,                        /* mp_ass_subscript */
+  },
+  {
+    (lenfunc) 0,                              /* sq_length */
+    (binaryfunc) 0,                           /* sq_concat */
+    (ssizeargfunc) 0,                         /* sq_repeat */
+    (ssizeargfunc) 0,                         /* sq_item */
+#if PY_VERSION_HEX >= 0x03000000
+    (void*) 0,                                /* was_sq_slice */
+#else
+    (ssizessizeargfunc) 0,                    /* sq_slice */
+#endif
+    (ssizeobjargproc) 0,                      /* sq_ass_item */
+#if PY_VERSION_HEX >= 0x03000000
+    (void*) 0,                                /* was_sq_ass_slice */
+#else
+    (ssizessizeobjargproc) 0,                 /* sq_ass_slice */
+#endif
+    (objobjproc) 0,                           /* sq_contains */
+    (binaryfunc) 0,                           /* sq_inplace_concat */
+    (ssizeargfunc) 0,                         /* sq_inplace_repeat */
+  },
+  {
+#if PY_VERSION_HEX < 0x03000000
+    (readbufferproc) 0,                       /* bf_getreadbuffer */
+    (writebufferproc) 0,                      /* bf_getwritebuffer */
+    (segcountproc) 0,                         /* bf_getsegcount */
+    (charbufferproc) 0,                       /* bf_getcharbuffer */
+#endif
+#if PY_VERSION_HEX >= 0x02060000
+    (getbufferproc) 0,                        /* bf_getbuffer */
+    (releasebufferproc) 0,                    /* bf_releasebuffer */
+#endif
+  },
+    (PyObject*) 0,                            /* ht_name */
+    (PyObject*) 0,                            /* ht_slots */
+};
+
+SWIGINTERN SwigPyClientData SwigPyBuiltin___THyPhyMatrix_clientdata = {0, 0, 0, 0, 0, 0, (PyTypeObject *)&SwigPyBuiltin___THyPhyMatrix_type};
+
+SWIGPY_DESTRUCTOR_CLOSURE(_wrap_delete__THyPhy)
+SWIGINTERN PyGetSetDef SwigPyBuiltin___THyPhy_getset[] = {
+    {NULL, NULL, NULL, NULL, NULL} /* Sentinel */
+};
+
+SWIGINTERN PyObject *
+SwigPyBuiltin___THyPhy_richcompare(PyObject *self, PyObject *other, int op) {
+  PyObject *result = NULL;
+  PyObject *tuple = PyTuple_New(1);
+  assert(tuple);
+  PyTuple_SET_ITEM(tuple, 0, other);
+  Py_XINCREF(other);
+  if (!result) {
+    if (SwigPyObject_Check(self) && SwigPyObject_Check(other)) {
+      result = SwigPyObject_richcompare((SwigPyObject *)self, (SwigPyObject *)other, op);
+    } else {
+      result = Py_NotImplemented;
+      Py_INCREF(result);
+    }
+  }
+  Py_DECREF(tuple);
+  return result;
+}
+
+SWIGINTERN PyMethodDef SwigPyBuiltin___THyPhy_methods[] = {
+  { "ExecuteBF", (PyCFunction) _wrap__THyPhy_ExecuteBF, METH_VARARGS, (char*) "" },
+  { "InitTHyPhy", (PyCFunction) _wrap__THyPhy_InitTHyPhy, METH_VARARGS, (char*) "" },
+  { "ClearAll", (PyCFunction) _wrap__THyPhy_ClearAll, METH_VARARGS, (char*) "" },
+  { "AskFor", (PyCFunction) _wrap__THyPhy_AskFor, METH_VARARGS, (char*) "" },
+  { "DumpResult", (PyCFunction) _wrap__THyPhy_DumpResult, METH_VARARGS, (char*) "" },
+  { "CanCast", (PyCFunction) _wrap__THyPhy_CanCast, METH_VARARGS, (char*) "" },
+  { "CastResult", (PyCFunction) _wrap__THyPhy_CastResult, METH_VARARGS, (char*) "" },
+  { "SetCallbackHandler", (PyCFunction) _wrap__THyPhy_SetCallbackHandler, METH_VARARGS, (char*) "" },
+  { "GetCallbackHandler", (PyCFunction) _wrap__THyPhy_GetCallbackHandler, METH_VARARGS, (char*) "" },
+  { "GetWarnings", (PyCFunction) _wrap__THyPhy_GetWarnings, METH_VARARGS, (char*) "" },
+  { "GetErrors", (PyCFunction) _wrap__THyPhy_GetErrors, METH_VARARGS, (char*) "" },
+  { "GetStdout", (PyCFunction) _wrap__THyPhy_GetStdout, METH_VARARGS, (char*) "" },
+  { "PushWarning", (PyCFunction) _wrap__THyPhy_PushWarning, METH_VARARGS, (char*) "" },
+  { "PushError", (PyCFunction) _wrap__THyPhy_PushError, METH_VARARGS, (char*) "" },
+  { "PushOutString", (PyCFunction) _wrap__THyPhy_PushOutString, METH_VARARGS, (char*) "" },
+  { NULL, NULL, 0, NULL } /* Sentinel */
+};
+
+static PyHeapTypeObject SwigPyBuiltin___THyPhy_type = {
+  {
+#if PY_VERSION_HEX >= 0x03000000
+    PyVarObject_HEAD_INIT(NULL, 0)
+#else
+    PyObject_HEAD_INIT(NULL)
+    0,                                        /* ob_size */
+#endif
+    "_THyPhy",                                /* tp_name */
+    sizeof(SwigPyObject),                     /* tp_basicsize */
+    0,                                        /* tp_itemsize */
+    (destructor) _wrap_delete__THyPhy_closure, /* tp_dealloc */
+    (printfunc) 0,                            /* tp_print */
+    (getattrfunc) 0,                          /* tp_getattr */
+    (setattrfunc) 0,                          /* tp_setattr */
+#if PY_VERSION_HEX >= 0x03000000
+    0,                                        /* tp_compare */
+#else
+    (cmpfunc) 0,                              /* tp_compare */
+#endif
+    (reprfunc) 0,                             /* tp_repr */
+    &SwigPyBuiltin___THyPhy_type.as_number,      /* tp_as_number */
+    &SwigPyBuiltin___THyPhy_type.as_sequence,    /* tp_as_sequence */
+    &SwigPyBuiltin___THyPhy_type.as_mapping,     /* tp_as_mapping */
+    (hashfunc) 0,                             /* tp_hash */
+    (ternaryfunc) 0,                          /* tp_call */
+    (reprfunc) 0,                             /* tp_str */
+    (getattrofunc) 0,                         /* tp_getattro */
+    (setattrofunc) 0,                         /* tp_setattro */
+    &SwigPyBuiltin___THyPhy_type.as_buffer,      /* tp_as_buffer */
+#if PY_VERSION_HEX >= 0x03000000
+    Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE,   /* tp_flags */
+#else
+    Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_CHECKTYPES, /* tp_flags */
+#endif
+    "::_THyPhy",                              /* tp_doc */
+    (traverseproc) 0,                         /* tp_traverse */
+    (inquiry) 0,                              /* tp_clear */
+    (richcmpfunc) SwigPyBuiltin___THyPhy_richcompare, /* feature:python:tp_richcompare */
+    0,                                        /* tp_weaklistoffset */
+    (getiterfunc) 0,                          /* tp_iter */
+    (iternextfunc) 0,                         /* tp_iternext */
+    SwigPyBuiltin___THyPhy_methods,           /* tp_methods */
+    0,                                        /* tp_members */
+    SwigPyBuiltin___THyPhy_getset,            /* tp_getset */
+    0,                                        /* tp_base */
+    0,                                        /* tp_dict */
+    (descrgetfunc) 0,                         /* tp_descr_get */
+    (descrsetfunc) 0,                         /* tp_descr_set */
+    (size_t)(((char*)&((SwigPyObject *) 64L)->dict) - (char*) 64L), /* tp_dictoffset */
+    (initproc) _wrap_new__THyPhy,             /* tp_init */
+    (allocfunc) 0,                            /* tp_alloc */
+    (newfunc) 0,                              /* tp_new */
+    (freefunc) 0,                             /* tp_free */
+    (inquiry) 0,                              /* tp_is_gc */
+    (PyObject*) 0,                            /* tp_bases */
+    (PyObject*) 0,                            /* tp_mro */
+    (PyObject*) 0,                            /* tp_cache */
+    (PyObject*) 0,                            /* tp_subclasses */
+    (PyObject*) 0,                            /* tp_weaklist */
+    (destructor) 0,                           /* tp_del */
+#if PY_VERSION_HEX >= 0x02060000
+    (int) 0,                                  /* tp_version_tag */
+#endif
+  },
+  {
+    (binaryfunc) 0,                           /* nb_add */
+    (binaryfunc) 0,                           /* nb_subtract */
+    (binaryfunc) 0,                           /* nb_multiply */
+#if PY_VERSION_HEX < 0x03000000
+    (binaryfunc) 0,                           /* nb_divide */
+#endif
+    (binaryfunc) 0,                           /* nb_remainder */
+    (binaryfunc) 0,                           /* nb_divmod */
+    (ternaryfunc) 0,                          /* nb_power */
+    (unaryfunc) 0,                            /* nb_negative */
+    (unaryfunc) 0,                            /* nb_positive */
+    (unaryfunc) 0,                            /* nb_absolute */
+    (inquiry) 0,                              /* nb_nonzero */
+    (unaryfunc) 0,                            /* nb_invert */
+    (binaryfunc) 0,                           /* nb_lshift */
+    (binaryfunc) 0,                           /* nb_rshift */
+    (binaryfunc) 0,                           /* nb_and */
+    (binaryfunc) 0,                           /* nb_xor */
+    (binaryfunc) 0,                           /* nb_or */
+#if PY_VERSION_HEX < 0x03000000
+    (coercion) 0,                             /* nb_coerce */
+#endif
+    (unaryfunc) 0,                            /* nb_int */
+#if PY_VERSION_HEX >= 0x03000000
+    (void*) 0,                                /* nb_reserved */
+#else
+    (unaryfunc) 0,                            /* nb_long */
+#endif
+    (unaryfunc) 0,                            /* nb_float */
+#if PY_VERSION_HEX < 0x03000000
+    (unaryfunc) 0,                            /* nb_oct */
+    (unaryfunc) 0,                            /* nb_hex */
+#endif
+    (binaryfunc) 0,                           /* nb_inplace_add */
+    (binaryfunc) 0,                           /* nb_inplace_subtract */
+    (binaryfunc) 0,                           /* nb_inplace_multiply */
+#if PY_VERSION_HEX < 0x03000000
+    (binaryfunc) 0,                           /* nb_inplace_divide */
+#endif
+    (binaryfunc) 0,                           /* nb_inplace_remainder */
+    (ternaryfunc) 0,                          /* nb_inplace_power */
+    (binaryfunc) 0,                           /* nb_inplace_lshift */
+    (binaryfunc) 0,                           /* nb_inplace_rshift */
+    (binaryfunc) 0,                           /* nb_inplace_and */
+    (binaryfunc) 0,                           /* nb_inplace_xor */
+    (binaryfunc) 0,                           /* nb_inplace_or */
+    (binaryfunc) 0,                           /* nb_floor_divide */
+    (binaryfunc) 0,                           /* nb_true_divide */
+    (binaryfunc) 0,                           /* nb_inplace_floor_divide */
+    (binaryfunc) 0,                           /* nb_inplace_true_divide */
+#if PY_VERSION_HEX >= 0x02050000
+    (unaryfunc) 0,                            /* nb_index */
+#endif
+  },
+  {
+    (lenfunc) 0,                              /* mp_length */
+    (binaryfunc) 0,                           /* mp_subscript */
+    (objobjargproc) 0,                        /* mp_ass_subscript */
+  },
+  {
+    (lenfunc) 0,                              /* sq_length */
+    (binaryfunc) 0,                           /* sq_concat */
+    (ssizeargfunc) 0,                         /* sq_repeat */
+    (ssizeargfunc) 0,                         /* sq_item */
+#if PY_VERSION_HEX >= 0x03000000
+    (void*) 0,                                /* was_sq_slice */
+#else
+    (ssizessizeargfunc) 0,                    /* sq_slice */
+#endif
+    (ssizeobjargproc) 0,                      /* sq_ass_item */
+#if PY_VERSION_HEX >= 0x03000000
+    (void*) 0,                                /* was_sq_ass_slice */
+#else
+    (ssizessizeobjargproc) 0,                 /* sq_ass_slice */
+#endif
+    (objobjproc) 0,                           /* sq_contains */
+    (binaryfunc) 0,                           /* sq_inplace_concat */
+    (ssizeargfunc) 0,                         /* sq_inplace_repeat */
+  },
+  {
+#if PY_VERSION_HEX < 0x03000000
+    (readbufferproc) 0,                       /* bf_getreadbuffer */
+    (writebufferproc) 0,                      /* bf_getwritebuffer */
+    (segcountproc) 0,                         /* bf_getsegcount */
+    (charbufferproc) 0,                       /* bf_getcharbuffer */
+#endif
+#if PY_VERSION_HEX >= 0x02060000
+    (getbufferproc) 0,                        /* bf_getbuffer */
+    (releasebufferproc) 0,                    /* bf_releasebuffer */
+#endif
+  },
+    (PyObject*) 0,                            /* ht_name */
+    (PyObject*) 0,                            /* ht_slots */
+};
+
+SWIGINTERN SwigPyClientData SwigPyBuiltin___THyPhy_clientdata = {0, 0, 0, 0, 0, 0, (PyTypeObject *)&SwigPyBuiltin___THyPhy_type};
+
+
+/* -------- TYPE CONVERSION AND EQUIVALENCE RULES (BEGIN) -------- */
+
+static void *_p__THyPhyNumberTo_p__THyPhyReturnObject(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((_THyPhyReturnObject *)  ((_THyPhyNumber *) x));
+}
+static void *_p__THyPhyMatrixTo_p__THyPhyReturnObject(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((_THyPhyReturnObject *)  ((_THyPhyMatrix *) x));
+}
+static void *_p__THyPhyStringTo_p__THyPhyReturnObject(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((_THyPhyReturnObject *)  ((_THyPhyString *) x));
+}
+static swig_type_info _swigt__p_SwigPyObject = {"_p_SwigPyObject", "SwigPyObject *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p__THyPhy = {"_p__THyPhy", "_THyPhy *", 0, 0, (void*)&SwigPyBuiltin___THyPhy_clientdata, 0};
+static swig_type_info _swigt__p__THyPhyMatrix = {"_p__THyPhyMatrix", "_THyPhyMatrix *", 0, 0, (void*)&SwigPyBuiltin___THyPhyMatrix_clientdata, 0};
+static swig_type_info _swigt__p__THyPhyNumber = {"_p__THyPhyNumber", "_THyPhyNumber *", 0, 0, (void*)&SwigPyBuiltin___THyPhyNumber_clientdata, 0};
+static swig_type_info _swigt__p__THyPhyReturnObject = {"_p__THyPhyReturnObject", "_THyPhyReturnObject *", 0, 0, (void*)&SwigPyBuiltin___THyPhyReturnObject_clientdata, 0};
+static swig_type_info _swigt__p__THyPhyString = {"_p__THyPhyString", "_THyPhyString *", 0, 0, (void*)&SwigPyBuiltin___THyPhyString_clientdata, 0};
+static swig_type_info _swigt__p_char = {"_p_char", "char *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_double = {"_p_double", "double *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_f_p_char_int_double__bool = {"_p_f_p_char_int_double__bool", "_ProgressCancelHandler *|bool (*)(char *,int,double)", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_void = {"_p_void", "void *", 0, 0, (void*)0, 0};
+
+static swig_type_info *swig_type_initial[] = {
+  &_swigt__p_SwigPyObject,
+  &_swigt__p__THyPhy,
+  &_swigt__p__THyPhyMatrix,
+  &_swigt__p__THyPhyNumber,
+  &_swigt__p__THyPhyReturnObject,
+  &_swigt__p__THyPhyString,
+  &_swigt__p_char,
+  &_swigt__p_double,
+  &_swigt__p_f_p_char_int_double__bool,
+  &_swigt__p_void,
+};
+
+static swig_cast_info _swigc__p_SwigPyObject[] = {  {&_swigt__p_SwigPyObject, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p__THyPhy[] = {  {&_swigt__p__THyPhy, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p__THyPhyMatrix[] = {  {&_swigt__p__THyPhyMatrix, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p__THyPhyNumber[] = {  {&_swigt__p__THyPhyNumber, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p__THyPhyReturnObject[] = {  {&_swigt__p__THyPhyReturnObject, 0, 0, 0},  {&_swigt__p__THyPhyNumber, _p__THyPhyNumberTo_p__THyPhyReturnObject, 0, 0},  {&_swigt__p__THyPhyMatrix, _p__THyPhyMatrixTo_p__THyPhyReturnObject, 0, 0},  {&_swigt__p__THyPhyString, _p__THyPhyStringTo_p__THyPhyReturnObject, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p__THyPhyString[] = {  {&_swigt__p__THyPhyString, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_char[] = {  {&_swigt__p_char, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_double[] = {  {&_swigt__p_double, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_f_p_char_int_double__bool[] = {  {&_swigt__p_f_p_char_int_double__bool, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_void[] = {  {&_swigt__p_void, 0, 0, 0},{0, 0, 0, 0}};
+
+static swig_cast_info *swig_cast_initial[] = {
+  _swigc__p_SwigPyObject,
+  _swigc__p__THyPhy,
+  _swigc__p__THyPhyMatrix,
+  _swigc__p__THyPhyNumber,
+  _swigc__p__THyPhyReturnObject,
+  _swigc__p__THyPhyString,
+  _swigc__p_char,
+  _swigc__p_double,
+  _swigc__p_f_p_char_int_double__bool,
+  _swigc__p_void,
+};
+
+
+/* -------- TYPE CONVERSION AND EQUIVALENCE RULES (END) -------- */
+
+static swig_const_info swig_const_table[] = {
+{0, 0, 0, 0.0, 0, 0}};
+
+#ifdef __cplusplus
+}
+#endif
+static PyTypeObject *builtin_bases[3];
+
+/* -----------------------------------------------------------------------------
+ * Type initialization:
+ * This problem is tough by the requirement that no dynamic 
+ * memory is used. Also, since swig_type_info structures store pointers to 
+ * swig_cast_info structures and swig_cast_info structures store pointers back
+ * to swig_type_info structures, we need some lookup code at initialization. 
+ * The idea is that swig generates all the structures that are needed. 
+ * The runtime then collects these partially filled structures. 
+ * The SWIG_InitializeModule function takes these initial arrays out of 
+ * swig_module, and does all the lookup, filling in the swig_module.types
+ * array with the correct data and linking the correct swig_cast_info
+ * structures together.
+ *
+ * The generated swig_type_info structures are assigned staticly to an initial 
+ * array. We just loop through that array, and handle each type individually.
+ * First we lookup if this type has been already loaded, and if so, use the
+ * loaded structure instead of the generated one. Then we have to fill in the
+ * cast linked list. The cast data is initially stored in something like a
+ * two-dimensional array. Each row corresponds to a type (there are the same
+ * number of rows as there are in the swig_type_initial array). Each entry in
+ * a column is one of the swig_cast_info structures for that type.
+ * The cast_initial array is actually an array of arrays, because each row has
+ * a variable number of columns. So to actually build the cast linked list,
+ * we find the array of casts associated with the type, and loop through it 
+ * adding the casts to the list. The one last trick we need to do is making
+ * sure the type pointer in the swig_cast_info struct is correct.
+ *
+ * First off, we lookup the cast->type name to see if it is already loaded. 
+ * There are three cases to handle:
+ *  1) If the cast->type has already been loaded AND the type we are adding
+ *     casting info to has not been loaded (it is in this module), THEN we
+ *     replace the cast->type pointer with the type pointer that has already
+ *     been loaded.
+ *  2) If BOTH types (the one we are adding casting info to, and the 
+ *     cast->type) are loaded, THEN the cast info has already been loaded by
+ *     the previous module so we just ignore it.
+ *  3) Finally, if cast->type has not already been loaded, then we add that
+ *     swig_cast_info to the linked list (because the cast->type) pointer will
+ *     be correct.
+ * ----------------------------------------------------------------------------- */
+
+#ifdef __cplusplus
+extern "C" {
+#if 0
+} /* c-mode */
+#endif
+#endif
+
+#if 0
+#define SWIGRUNTIME_DEBUG
+#endif
+
+
+SWIGRUNTIME void
+SWIG_InitializeModule(void *clientdata) {
+  size_t i;
+  swig_module_info *module_head, *iter;
+  int found, init;
+  
+  clientdata = clientdata;
+  
+  /* check to see if the circular list has been setup, if not, set it up */
+  if (swig_module.next==0) {
+    /* Initialize the swig_module */
+    swig_module.type_initial = swig_type_initial;
+    swig_module.cast_initial = swig_cast_initial;
+    swig_module.next = &swig_module;
+    init = 1;
+  } else {
+    init = 0;
+  }
+  
+  /* Try and load any already created modules */
+  module_head = SWIG_GetModule(clientdata);
+  if (!module_head) {
+    /* This is the first module loaded for this interpreter */
+    /* so set the swig module into the interpreter */
+    SWIG_SetModule(clientdata, &swig_module);
+    module_head = &swig_module;
+  } else {
+    /* the interpreter has loaded a SWIG module, but has it loaded this one? */
+    found=0;
+    iter=module_head;
+    do {
+      if (iter==&swig_module) {
+        found=1;
+        break;
+      }
+      iter=iter->next;
+    } while (iter!= module_head);
+    
+    /* if the is found in the list, then all is done and we may leave */
+    if (found) return;
+    /* otherwise we must add out module into the list */
+    swig_module.next = module_head->next;
+    module_head->next = &swig_module;
+  }
+  
+  /* When multiple interpeters are used, a module could have already been initialized in
+       a different interpreter, but not yet have a pointer in this interpreter.
+       In this case, we do not want to continue adding types... everything should be
+       set up already */
+  if (init == 0) return;
+  
+  /* Now work on filling in swig_module.types */
+#ifdef SWIGRUNTIME_DEBUG
+  printf("SWIG_InitializeModule: size %d\n", swig_module.size);
+#endif
+  for (i = 0; i < swig_module.size; ++i) {
+    swig_type_info *type = 0;
+    swig_type_info *ret;
+    swig_cast_info *cast;
+    
+#ifdef SWIGRUNTIME_DEBUG
+    printf("SWIG_InitializeModule: type %d %s\n", i, swig_module.type_initial[i]->name);
+#endif
+    
+    /* if there is another module already loaded */
+    if (swig_module.next != &swig_module) {
+      type = SWIG_MangledTypeQueryModule(swig_module.next, &swig_module, swig_module.type_initial[i]->name);
+    }
+    if (type) {
+      /* Overwrite clientdata field */
+#ifdef SWIGRUNTIME_DEBUG
+      printf("SWIG_InitializeModule: found type %s\n", type->name);
+#endif
+      if (swig_module.type_initial[i]->clientdata) {
+        type->clientdata = swig_module.type_initial[i]->clientdata;
+#ifdef SWIGRUNTIME_DEBUG
+        printf("SWIG_InitializeModule: found and overwrite type %s \n", type->name);
+#endif
+      }
+    } else {
+      type = swig_module.type_initial[i];
+    }
+    
+    /* Insert casting types */
+    cast = swig_module.cast_initial[i];
+    while (cast->type) {
+      /* Don't need to add information already in the list */
+      ret = 0;
+#ifdef SWIGRUNTIME_DEBUG
+      printf("SWIG_InitializeModule: look cast %s\n", cast->type->name);
+#endif
+      if (swig_module.next != &swig_module) {
+        ret = SWIG_MangledTypeQueryModule(swig_module.next, &swig_module, cast->type->name);
+#ifdef SWIGRUNTIME_DEBUG
+        if (ret) printf("SWIG_InitializeModule: found cast %s\n", ret->name);
+#endif
+      }
+      if (ret) {
+        if (type == swig_module.type_initial[i]) {
+#ifdef SWIGRUNTIME_DEBUG
+          printf("SWIG_InitializeModule: skip old type %s\n", ret->name);
+#endif
+          cast->type = ret;
+          ret = 0;
+        } else {
+          /* Check for casting already in the list */
+          swig_cast_info *ocast = SWIG_TypeCheck(ret->name, type);
+#ifdef SWIGRUNTIME_DEBUG
+          if (ocast) printf("SWIG_InitializeModule: skip old cast %s\n", ret->name);
+#endif
+          if (!ocast) ret = 0;
+        }
+      }
+      
+      if (!ret) {
+#ifdef SWIGRUNTIME_DEBUG
+        printf("SWIG_InitializeModule: adding cast %s\n", cast->type->name);
+#endif
+        if (type->cast) {
+          type->cast->prev = cast;
+          cast->next = type->cast;
+        }
+        type->cast = cast;
+      }
+      cast++;
+    }
+    /* Set entry in modules->types array equal to the type */
+    swig_module.types[i] = type;
+  }
+  swig_module.types[i] = 0;
+  
+#ifdef SWIGRUNTIME_DEBUG
+  printf("**** SWIG_InitializeModule: Cast List ******\n");
+  for (i = 0; i < swig_module.size; ++i) {
+    int j = 0;
+    swig_cast_info *cast = swig_module.cast_initial[i];
+    printf("SWIG_InitializeModule: type %d %s\n", i, swig_module.type_initial[i]->name);
+    while (cast->type) {
+      printf("SWIG_InitializeModule: cast type %s\n", cast->type->name);
+      cast++;
+      ++j;
+    }
+    printf("---- Total casts: %d\n",j);
+  }
+  printf("**** SWIG_InitializeModule: Cast List ******\n");
+#endif
+}
+
+/* This function will propagate the clientdata field of type to
+* any new swig_type_info structures that have been added into the list
+* of equivalent types.  It is like calling
+* SWIG_TypeClientData(type, clientdata) a second time.
+*/
+SWIGRUNTIME void
+SWIG_PropagateClientData(void) {
+  size_t i;
+  swig_cast_info *equiv;
+  static int init_run = 0;
+  
+  if (init_run) return;
+  init_run = 1;
+  
+  for (i = 0; i < swig_module.size; i++) {
+    if (swig_module.types[i]->clientdata) {
+      equiv = swig_module.types[i]->cast;
+      while (equiv) {
+        if (!equiv->converter) {
+          if (equiv->type && !equiv->type->clientdata)
+          SWIG_TypeClientData(equiv->type, swig_module.types[i]->clientdata);
+        }
+        equiv = equiv->next;
+      }
+    }
+  }
+}
+
+#ifdef __cplusplus
+#if 0
+{
+  /* c-mode */
+#endif
+}
+#endif
+
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+  
+  /* Python-specific SWIG API */
+#define SWIG_newvarlink()                             SWIG_Python_newvarlink()
+#define SWIG_addvarlink(p, name, get_attr, set_attr)  SWIG_Python_addvarlink(p, name, get_attr, set_attr)
+#define SWIG_InstallConstants(d, constants)           SWIG_Python_InstallConstants(d, constants)
+  
+  /* -----------------------------------------------------------------------------
+   * global variable support code.
+   * ----------------------------------------------------------------------------- */
+  
+  typedef struct swig_globalvar {
+    char       *name;                  /* Name of global variable */
+    PyObject *(*get_attr)(void);       /* Return the current value */
+    int       (*set_attr)(PyObject *); /* Set the value */
+    struct swig_globalvar *next;
+  } swig_globalvar;
+  
+  typedef struct swig_varlinkobject {
+    PyObject_HEAD
+    swig_globalvar *vars;
+  } swig_varlinkobject;
+  
+  SWIGINTERN PyObject *
+  swig_varlink_repr(swig_varlinkobject *SWIGUNUSEDPARM(v)) {
+#if PY_VERSION_HEX >= 0x03000000
+    return PyUnicode_InternFromString("<Swig global variables>");
+#else
+    return PyString_FromString("<Swig global variables>");
+#endif
+  }
+  
+  SWIGINTERN PyObject *
+  swig_varlink_str(swig_varlinkobject *v) {
+#if PY_VERSION_HEX >= 0x03000000
+    PyObject *str = PyUnicode_InternFromString("(");
+    PyObject *tail;
+    PyObject *joined;
+    swig_globalvar *var;
+    for (var = v->vars; var; var=var->next) {
+      tail = PyUnicode_FromString(var->name);
+      joined = PyUnicode_Concat(str, tail);
+      Py_DecRef(str);
+      Py_DecRef(tail);
+      str = joined;
+      if (var->next) {
+        tail = PyUnicode_InternFromString(", ");
+        joined = PyUnicode_Concat(str, tail);
+        Py_DecRef(str);
+        Py_DecRef(tail);
+        str = joined;
+      }
+    }
+    tail = PyUnicode_InternFromString(")");
+    joined = PyUnicode_Concat(str, tail);
+    Py_DecRef(str);
+    Py_DecRef(tail);
+    str = joined;
+#else
+    PyObject *str = PyString_FromString("(");
+    swig_globalvar *var;
+    for (var = v->vars; var; var=var->next) {
+      PyString_ConcatAndDel(&str,PyString_FromString(var->name));
+      if (var->next) PyString_ConcatAndDel(&str,PyString_FromString(", "));
+    }
+    PyString_ConcatAndDel(&str,PyString_FromString(")"));
+#endif
+    return str;
+  }
+  
+  SWIGINTERN int
+  swig_varlink_print(swig_varlinkobject *v, FILE *fp, int SWIGUNUSEDPARM(flags)) {
+    char *tmp;
+    PyObject *str = swig_varlink_str(v);
+    fprintf(fp,"Swig global variables ");
+    fprintf(fp,"%s\n", tmp = SWIG_Python_str_AsChar(str));
+    SWIG_Python_str_DelForPy3(tmp);
+    Py_DECREF(str);
+    return 0;
+  }
+  
+  SWIGINTERN void
+  swig_varlink_dealloc(swig_varlinkobject *v) {
+    swig_globalvar *var = v->vars;
+    while (var) {
+      swig_globalvar *n = var->next;
+      free(var->name);
+      free(var);
+      var = n;
+    }
+  }
+  
+  SWIGINTERN PyObject *
+  swig_varlink_getattr(swig_varlinkobject *v, char *n) {
+    PyObject *res = NULL;
+    swig_globalvar *var = v->vars;
+    while (var) {
+      if (strcmp(var->name,n) == 0) {
+        res = (*var->get_attr)();
+        break;
+      }
+      var = var->next;
+    }
+    if (res == NULL && !PyErr_Occurred()) {
+      PyErr_SetString(PyExc_NameError,"Unknown C global variable");
+    }
+    return res;
+  }
+  
+  SWIGINTERN int
+  swig_varlink_setattr(swig_varlinkobject *v, char *n, PyObject *p) {
+    int res = 1;
+    swig_globalvar *var = v->vars;
+    while (var) {
+      if (strcmp(var->name,n) == 0) {
+        res = (*var->set_attr)(p);
+        break;
+      }
+      var = var->next;
+    }
+    if (res == 1 && !PyErr_Occurred()) {
+      PyErr_SetString(PyExc_NameError,"Unknown C global variable");
+    }
+    return res;
+  }
+  
+  SWIGINTERN PyTypeObject*
+  swig_varlink_type(void) {
+    static char varlink__doc__[] = "Swig var link object";
+    static PyTypeObject varlink_type;
+    static int type_init = 0;
+    if (!type_init) {
+      const PyTypeObject tmp = {
+        /* PyObject header changed in Python 3 */
+#if PY_VERSION_HEX >= 0x03000000
+        PyVarObject_HEAD_INIT(NULL, 0)
+#else
+        PyObject_HEAD_INIT(NULL)
+        0,                                  /* ob_size */
+#endif
+        (char *)"swigvarlink",              /* tp_name */
+        sizeof(swig_varlinkobject),         /* tp_basicsize */
+        0,                                  /* tp_itemsize */
+        (destructor) swig_varlink_dealloc,  /* tp_dealloc */
+        (printfunc) swig_varlink_print,     /* tp_print */
+        (getattrfunc) swig_varlink_getattr, /* tp_getattr */
+        (setattrfunc) swig_varlink_setattr, /* tp_setattr */
+        0,                                  /* tp_compare */
+        (reprfunc) swig_varlink_repr,       /* tp_repr */
+        0,                                  /* tp_as_number */
+        0,                                  /* tp_as_sequence */
+        0,                                  /* tp_as_mapping */
+        0,                                  /* tp_hash */
+        0,                                  /* tp_call */
+        (reprfunc) swig_varlink_str,        /* tp_str */
+        0,                                  /* tp_getattro */
+        0,                                  /* tp_setattro */
+        0,                                  /* tp_as_buffer */
+        0,                                  /* tp_flags */
+        varlink__doc__,                     /* tp_doc */
+        0,                                  /* tp_traverse */
+        0,                                  /* tp_clear */
+        0,                                  /* tp_richcompare */
+        0,                                  /* tp_weaklistoffset */
+#if PY_VERSION_HEX >= 0x02020000
+        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* tp_iter -> tp_weaklist */
+#endif
+#if PY_VERSION_HEX >= 0x02030000
+        0,                                  /* tp_del */
+#endif
+#if PY_VERSION_HEX >= 0x02060000
+        0,                                  /* tp_version */
+#endif
+#ifdef COUNT_ALLOCS
+        0,0,0,0                             /* tp_alloc -> tp_next */
+#endif
+      };
+      varlink_type = tmp;
+      type_init = 1;
+#if PY_VERSION_HEX < 0x02020000
+      varlink_type.ob_type = &PyType_Type;
+#else
+      if (PyType_Ready(&varlink_type) < 0)
+      return NULL;
+#endif
+    }
+    return &varlink_type;
+  }
+  
+  /* Create a variable linking object for use later */
+  SWIGINTERN PyObject *
+  SWIG_Python_newvarlink(void) {
+    swig_varlinkobject *result = PyObject_NEW(swig_varlinkobject, swig_varlink_type());
+    if (result) {
+      result->vars = 0;
+    }
+    return ((PyObject*) result);
+  }
+  
+  SWIGINTERN void 
+  SWIG_Python_addvarlink(PyObject *p, char *name, PyObject *(*get_attr)(void), int (*set_attr)(PyObject *p)) {
+    swig_varlinkobject *v = (swig_varlinkobject *) p;
+    swig_globalvar *gv = (swig_globalvar *) malloc(sizeof(swig_globalvar));
+    if (gv) {
+      size_t size = strlen(name)+1;
+      gv->name = (char *)malloc(size);
+      if (gv->name) {
+        strncpy(gv->name,name,size);
+        gv->get_attr = get_attr;
+        gv->set_attr = set_attr;
+        gv->next = v->vars;
+      }
+    }
+    v->vars = gv;
+  }
+  
+  SWIGINTERN PyObject *
+  SWIG_globals(void) {
+    static PyObject *_SWIG_globals = 0; 
+    if (!_SWIG_globals) _SWIG_globals = SWIG_newvarlink();  
+    return _SWIG_globals;
+  }
+  
+  /* -----------------------------------------------------------------------------
+   * constants/methods manipulation
+   * ----------------------------------------------------------------------------- */
+  
+  /* Install Constants */
+  SWIGINTERN void
+  SWIG_Python_InstallConstants(PyObject *d, swig_const_info constants[]) {
+    PyObject *obj = 0;
+    size_t i;
+    for (i = 0; constants[i].type; ++i) {
+      switch(constants[i].type) {
+      case SWIG_PY_POINTER:
+        obj = SWIG_InternalNewPointerObj(constants[i].pvalue, *(constants[i]).ptype,0);
+        break;
+      case SWIG_PY_BINARY:
+        obj = SWIG_NewPackedObj(constants[i].pvalue, constants[i].lvalue, *(constants[i].ptype));
+        break;
+      default:
+        obj = 0;
+        break;
+      }
+      if (obj) {
+        PyDict_SetItemString(d, constants[i].name, obj);
+        Py_DECREF(obj);
+      }
+    }
+  }
+  
+  /* -----------------------------------------------------------------------------*/
+  /* Fix SwigMethods to carry the callback ptrs when needed */
+  /* -----------------------------------------------------------------------------*/
+  
+  SWIGINTERN void
+  SWIG_Python_FixMethods(PyMethodDef *methods,
+    swig_const_info *const_table,
+    swig_type_info **types,
+    swig_type_info **types_initial) {
+    size_t i;
+    for (i = 0; methods[i].ml_name; ++i) {
+      const char *c = methods[i].ml_doc;
+      if (c && (c = strstr(c, "swig_ptr: "))) {
+        int j;
+        swig_const_info *ci = 0;
+        const char *name = c + 10;
+        for (j = 0; const_table[j].type; ++j) {
+          if (strncmp(const_table[j].name, name, 
+              strlen(const_table[j].name)) == 0) {
+            ci = &(const_table[j]);
+            break;
+          }
+        }
+        if (ci) {
+          void *ptr = (ci->type == SWIG_PY_POINTER) ? ci->pvalue : 0;
+          if (ptr) {
+            size_t shift = (ci->ptype) - types;
+            swig_type_info *ty = types_initial[shift];
+            size_t ldoc = (c - methods[i].ml_doc);
+            size_t lptr = strlen(ty->name)+2*sizeof(void*)+2;
+            char *ndoc = (char*)malloc(ldoc + lptr + 10);
+            if (ndoc) {
+              char *buff = ndoc;
+              strncpy(buff, methods[i].ml_doc, ldoc);
+              buff += ldoc;
+              strncpy(buff, "swig_ptr: ", 10);
+              buff += 10;
+              SWIG_PackVoidPtr(buff, ptr, ty->name, lptr);
+              methods[i].ml_doc = ndoc;
+            }
+          }
+        }
+      }
+    }
+  } 
+  
+#ifdef __cplusplus
+}
+#endif
+
+/* -----------------------------------------------------------------------------*
+ *  Partial Init method
+ * -----------------------------------------------------------------------------*/
+
+#ifdef __cplusplus
+extern "C"
+#endif
+
+SWIGEXPORT 
+#if PY_VERSION_HEX >= 0x03000000
+PyObject*
+#else
+void
+#endif
+SWIG_init(void) {
+  PyObject *m, *d, *md;
+#if PY_VERSION_HEX >= 0x03000000
+  static struct PyModuleDef SWIG_module = {
+# if PY_VERSION_HEX >= 0x03020000
+    PyModuleDef_HEAD_INIT,
+# else
+    {
+      PyObject_HEAD_INIT(NULL)
+      NULL, /* m_init */
+      0,    /* m_index */
+      NULL, /* m_copy */
+    },
+# endif
+    (char *) SWIG_name,
+    NULL,
+    -1,
+    SwigMethods,
+    NULL,
+    NULL,
+    NULL,
+    NULL
+  };
+#endif
+  
+#if defined(SWIGPYTHON_BUILTIN)
+  static SwigPyClientData SwigPyObject_clientdata = {
+    0, 0, 0, 0, 0, 0, 0
+  };
+  static PyGetSetDef this_getset_def = {
+    (char *)"this", &SwigPyBuiltin_ThisClosure, NULL, NULL, NULL
+  };
+  static SwigPyGetSet thisown_getset_closure = {
+    (PyCFunction) SwigPyObject_own,
+    (PyCFunction) SwigPyObject_own
+  };
+  static PyGetSetDef thisown_getset_def = {
+    (char *)"thisown", SwigPyBuiltin_GetterClosure, SwigPyBuiltin_SetterClosure, NULL, &thisown_getset_closure
+  };
+  PyObject *metatype_args;
+  PyTypeObject *builtin_pytype;
+  int builtin_base_count;
+  swig_type_info *builtin_basetype;
+  PyObject *tuple;
+  PyGetSetDescrObject *static_getset;
+  PyTypeObject *metatype;
+  SwigPyClientData *cd;
+  PyObject *public_interface, *public_symbol;
+  PyObject *this_descr;
+  PyObject *thisown_descr;
+  int i;
+  
+  (void)builtin_pytype;
+  (void)builtin_base_count;
+  (void)builtin_basetype;
+  (void)tuple;
+  (void)static_getset;
+  
+  /* metatype is used to implement static member variables. */
+  metatype_args = Py_BuildValue("(s(O){})", "SwigPyObjectType", &PyType_Type);
+  assert(metatype_args);
+  metatype = (PyTypeObject *) PyType_Type.tp_call((PyObject *) &PyType_Type, metatype_args, NULL);
+  assert(metatype);
+  Py_DECREF(metatype_args);
+  metatype->tp_setattro = (setattrofunc) &SwigPyObjectType_setattro;
+  assert(PyType_Ready(metatype) >= 0);
+#endif
+  
+  /* Fix SwigMethods to carry the callback ptrs when needed */
+  SWIG_Python_FixMethods(SwigMethods, swig_const_table, swig_types, swig_type_initial);
+  
+#if PY_VERSION_HEX >= 0x03000000
+  m = PyModule_Create(&SWIG_module);
+#else
+  m = Py_InitModule((char *) SWIG_name, SwigMethods);
+#endif
+  md = d = PyModule_GetDict(m);
+  
+  SWIG_InitializeModule(0);
+  
+#ifdef SWIGPYTHON_BUILTIN
+  SwigPyObject_stype = SWIG_MangledTypeQuery("_p_SwigPyObject");
+  assert(SwigPyObject_stype);
+  cd = (SwigPyClientData*) SwigPyObject_stype->clientdata;
+  if (!cd) {
+    SwigPyObject_stype->clientdata = &SwigPyObject_clientdata;
+    SwigPyObject_clientdata.pytype = SwigPyObject_TypeOnce();
+  } else if (SwigPyObject_TypeOnce()->tp_basicsize != cd->pytype->tp_basicsize) {
+    PyErr_SetString(PyExc_RuntimeError, "Import error: attempted to load two incompatible swig-generated modules.");
+# if PY_VERSION_HEX >= 0x03000000
+    return NULL;
+# else
+    return;
+# endif
+  }
+  
+  /* All objects have a 'this' attribute */
+  this_descr = PyDescr_NewGetSet(SwigPyObject_type(), &this_getset_def);
+  (void)this_descr;
+  
+  /* All objects have a 'thisown' attribute */
+  thisown_descr = PyDescr_NewGetSet(SwigPyObject_type(), &thisown_getset_def);
+  (void)thisown_descr;
+  
+  public_interface = PyList_New(0);
+  public_symbol = 0;
+  (void)public_symbol;
+  
+  PyDict_SetItemString(md, "__all__", public_interface);
+  Py_DECREF(public_interface);
+  for (i = 0; SwigMethods[i].ml_name != NULL; ++i)
+  SwigPyBuiltin_AddPublicSymbol(public_interface, SwigMethods[i].ml_name);
+  for (i = 0; swig_const_table[i].name != 0; ++i)
+  SwigPyBuiltin_AddPublicSymbol(public_interface, swig_const_table[i].name);
+#endif
+  
+  SWIG_InstallConstants(d,swig_const_table);
+  
+  SWIG_Python_SetConstant(d, d == md ? public_interface : NULL, "THYPHY_TYPE_COUNT",SWIG_From_int(static_cast< int >(3)));
+  SWIG_Python_SetConstant(d, d == md ? public_interface : NULL, "THYPHY_TYPE_STRING",SWIG_From_int(static_cast< int >(0)));
+  SWIG_Python_SetConstant(d, d == md ? public_interface : NULL, "THYPHY_TYPE_NUMBER",SWIG_From_int(static_cast< int >(1)));
+  SWIG_Python_SetConstant(d, d == md ? public_interface : NULL, "THYPHY_TYPE_MATRIX",SWIG_From_int(static_cast< int >(2)));
+  
+  /* type '::_THyPhyReturnObject' */
+  builtin_pytype = (PyTypeObject *)&SwigPyBuiltin___THyPhyReturnObject_type;
+  builtin_pytype->tp_dict = d = PyDict_New();
+  SwigPyBuiltin_SetMetaType(builtin_pytype, metatype);
+  builtin_pytype->tp_new = PyType_GenericNew;
+  builtin_base_count = 0;
+  builtin_bases[builtin_base_count] = NULL;
+  SwigPyBuiltin_InitBases(builtin_pytype, builtin_bases);
+  PyDict_SetItemString(d, "this", this_descr);
+  PyDict_SetItemString(d, "thisown", thisown_descr);
+  if (PyType_Ready(builtin_pytype) < 0) {
+    PyErr_SetString(PyExc_TypeError, "Could not create type '_THyPhyReturnObject'.");
+#if PY_VERSION_HEX >= 0x03000000
+    return NULL;
+#else
+    return;
+#endif
+  }
+  Py_INCREF(builtin_pytype);
+  PyModule_AddObject(m, "_THyPhyReturnObject", (PyObject*) builtin_pytype);
+  SwigPyBuiltin_AddPublicSymbol(public_interface, "_THyPhyReturnObject");
+  d = md;
+  
+  /* type '::_THyPhyString' */
+  builtin_pytype = (PyTypeObject *)&SwigPyBuiltin___THyPhyString_type;
+  builtin_pytype->tp_dict = d = PyDict_New();
+  SwigPyBuiltin_SetMetaType(builtin_pytype, metatype);
+  builtin_pytype->tp_new = PyType_GenericNew;
+  builtin_base_count = 0;
+  builtin_basetype = SWIG_MangledTypeQuery("_p__THyPhyReturnObject");
+  if (builtin_basetype && builtin_basetype->clientdata && ((SwigPyClientData*) builtin_basetype->clientdata)->pytype) {
+    builtin_bases[builtin_base_count++] = ((SwigPyClientData*) builtin_basetype->clientdata)->pytype;
+  } else {
+    PyErr_SetString(PyExc_TypeError, "Could not create type '_THyPhyString' as base '_THyPhyReturnObject' has not been initialized.\n");
+#if PY_VERSION_HEX >= 0x03000000
+    return NULL;
+#else
+    return;
+#endif
+  }
+  builtin_bases[builtin_base_count] = NULL;
+  SwigPyBuiltin_InitBases(builtin_pytype, builtin_bases);
+  PyDict_SetItemString(d, "this", this_descr);
+  PyDict_SetItemString(d, "thisown", thisown_descr);
+  if (PyType_Ready(builtin_pytype) < 0) {
+    PyErr_SetString(PyExc_TypeError, "Could not create type '_THyPhyString'.");
+#if PY_VERSION_HEX >= 0x03000000
+    return NULL;
+#else
+    return;
+#endif
+  }
+  Py_INCREF(builtin_pytype);
+  PyModule_AddObject(m, "_THyPhyString", (PyObject*) builtin_pytype);
+  SwigPyBuiltin_AddPublicSymbol(public_interface, "_THyPhyString");
+  d = md;
+  
+  /* type '::_THyPhyNumber' */
+  builtin_pytype = (PyTypeObject *)&SwigPyBuiltin___THyPhyNumber_type;
+  builtin_pytype->tp_dict = d = PyDict_New();
+  SwigPyBuiltin_SetMetaType(builtin_pytype, metatype);
+  builtin_pytype->tp_new = PyType_GenericNew;
+  builtin_base_count = 0;
+  builtin_basetype = SWIG_MangledTypeQuery("_p__THyPhyReturnObject");
+  if (builtin_basetype && builtin_basetype->clientdata && ((SwigPyClientData*) builtin_basetype->clientdata)->pytype) {
+    builtin_bases[builtin_base_count++] = ((SwigPyClientData*) builtin_basetype->clientdata)->pytype;
+  } else {
+    PyErr_SetString(PyExc_TypeError, "Could not create type '_THyPhyNumber' as base '_THyPhyReturnObject' has not been initialized.\n");
+#if PY_VERSION_HEX >= 0x03000000
+    return NULL;
+#else
+    return;
+#endif
+  }
+  builtin_bases[builtin_base_count] = NULL;
+  SwigPyBuiltin_InitBases(builtin_pytype, builtin_bases);
+  PyDict_SetItemString(d, "this", this_descr);
+  PyDict_SetItemString(d, "thisown", thisown_descr);
+  if (PyType_Ready(builtin_pytype) < 0) {
+    PyErr_SetString(PyExc_TypeError, "Could not create type '_THyPhyNumber'.");
+#if PY_VERSION_HEX >= 0x03000000
+    return NULL;
+#else
+    return;
+#endif
+  }
+  Py_INCREF(builtin_pytype);
+  PyModule_AddObject(m, "_THyPhyNumber", (PyObject*) builtin_pytype);
+  SwigPyBuiltin_AddPublicSymbol(public_interface, "_THyPhyNumber");
+  d = md;
+  
+  /* type '::_THyPhyMatrix' */
+  builtin_pytype = (PyTypeObject *)&SwigPyBuiltin___THyPhyMatrix_type;
+  builtin_pytype->tp_dict = d = PyDict_New();
+  SwigPyBuiltin_SetMetaType(builtin_pytype, metatype);
+  builtin_pytype->tp_new = PyType_GenericNew;
+  builtin_base_count = 0;
+  builtin_basetype = SWIG_MangledTypeQuery("_p__THyPhyReturnObject");
+  if (builtin_basetype && builtin_basetype->clientdata && ((SwigPyClientData*) builtin_basetype->clientdata)->pytype) {
+    builtin_bases[builtin_base_count++] = ((SwigPyClientData*) builtin_basetype->clientdata)->pytype;
+  } else {
+    PyErr_SetString(PyExc_TypeError, "Could not create type '_THyPhyMatrix' as base '_THyPhyReturnObject' has not been initialized.\n");
+#if PY_VERSION_HEX >= 0x03000000
+    return NULL;
+#else
+    return;
+#endif
+  }
+  builtin_bases[builtin_base_count] = NULL;
+  SwigPyBuiltin_InitBases(builtin_pytype, builtin_bases);
+  PyDict_SetItemString(d, "this", this_descr);
+  PyDict_SetItemString(d, "thisown", thisown_descr);
+  if (PyType_Ready(builtin_pytype) < 0) {
+    PyErr_SetString(PyExc_TypeError, "Could not create type '_THyPhyMatrix'.");
+#if PY_VERSION_HEX >= 0x03000000
+    return NULL;
+#else
+    return;
+#endif
+  }
+  Py_INCREF(builtin_pytype);
+  PyModule_AddObject(m, "_THyPhyMatrix", (PyObject*) builtin_pytype);
+  SwigPyBuiltin_AddPublicSymbol(public_interface, "_THyPhyMatrix");
+  d = md;
+  
+  /* type '::_THyPhy' */
+  builtin_pytype = (PyTypeObject *)&SwigPyBuiltin___THyPhy_type;
+  builtin_pytype->tp_dict = d = PyDict_New();
+  SwigPyBuiltin_SetMetaType(builtin_pytype, metatype);
+  builtin_pytype->tp_new = PyType_GenericNew;
+  builtin_base_count = 0;
+  builtin_bases[builtin_base_count] = NULL;
+  SwigPyBuiltin_InitBases(builtin_pytype, builtin_bases);
+  PyDict_SetItemString(d, "this", this_descr);
+  PyDict_SetItemString(d, "thisown", thisown_descr);
+  if (PyType_Ready(builtin_pytype) < 0) {
+    PyErr_SetString(PyExc_TypeError, "Could not create type '_THyPhy'.");
+#if PY_VERSION_HEX >= 0x03000000
+    return NULL;
+#else
+    return;
+#endif
+  }
+  Py_INCREF(builtin_pytype);
+  PyModule_AddObject(m, "_THyPhy", (PyObject*) builtin_pytype);
+  SwigPyBuiltin_AddPublicSymbol(public_interface, "_THyPhy");
+  d = md;
+  PyDict_SetItemString(md,(char*)"cvar", SWIG_globals());
+  SwigPyBuiltin_AddPublicSymbol(public_interface, "cvar");
+  SWIG_addvarlink(SWIG_globals(),(char*)"globalInterfaceInstance",Swig_var_globalInterfaceInstance_get, Swig_var_globalInterfaceInstance_set);
+#if PY_VERSION_HEX >= 0x03000000
+  return m;
+#else
+  return;
+#endif
+}
+
diff --git a/src/lib/SWIGWrappers/THyPhy_python.cpp b/src/lib/SWIGWrappers/THyPhy_python.cpp
new file mode 100644
index 0000000..1d2120a
--- /dev/null
+++ b/src/lib/SWIGWrappers/THyPhy_python.cpp
@@ -0,0 +1,7440 @@
+/* ----------------------------------------------------------------------------
+ * This file was automatically generated by SWIG (http://www.swig.org).
+ * Version 2.0.4
+ * 
+ * This file is not intended to be easily readable and contains a number of 
+ * coding conventions designed to improve portability and efficiency. Do not make
+ * changes to this file unless you know what you are doing--modify the SWIG 
+ * interface file instead. 
+ * ----------------------------------------------------------------------------- */
+
+#define SWIGPYTHON
+#define SWIG_PYTHON_DIRECTOR_NO_VTABLE
+#define SWIGPYTHON_BUILTIN
+
+
+#ifdef __cplusplus
+/* SwigValueWrapper is described in swig.swg */
+template<typename T> class SwigValueWrapper {
+  struct SwigMovePointer {
+    T *ptr;
+    SwigMovePointer(T *p) : ptr(p) { }
+    ~SwigMovePointer() { delete ptr; }
+    SwigMovePointer& operator=(SwigMovePointer& rhs) { T* oldptr = ptr; ptr = 0; delete oldptr; ptr = rhs.ptr; rhs.ptr = 0; return *this; }
+  } pointer;
+  SwigValueWrapper& operator=(const SwigValueWrapper<T>& rhs);
+  SwigValueWrapper(const SwigValueWrapper<T>& rhs);
+public:
+  SwigValueWrapper() : pointer(0) { }
+  SwigValueWrapper& operator=(const T& t) { SwigMovePointer tmp(new T(t)); pointer = tmp; return *this; }
+  operator T&() const { return *pointer.ptr; }
+  T *operator&() { return pointer.ptr; }
+};
+
+template <typename T> T SwigValueInit() {
+  return T();
+}
+#endif
+
+/* -----------------------------------------------------------------------------
+ *  This section contains generic SWIG labels for method/variable
+ *  declarations/attributes, and other compiler dependent labels.
+ * ----------------------------------------------------------------------------- */
+
+/* template workaround for compilers that cannot correctly implement the C++ standard */
+#ifndef SWIGTEMPLATEDISAMBIGUATOR
+# if defined(__SUNPRO_CC) && (__SUNPRO_CC <= 0x560)
+#  define SWIGTEMPLATEDISAMBIGUATOR template
+# elif defined(__HP_aCC)
+/* Needed even with `aCC -AA' when `aCC -V' reports HP ANSI C++ B3910B A.03.55 */
+/* If we find a maximum version that requires this, the test would be __HP_aCC <= 35500 for A.03.55 */
+#  define SWIGTEMPLATEDISAMBIGUATOR template
+# else
+#  define SWIGTEMPLATEDISAMBIGUATOR
+# endif
+#endif
+
+/* inline attribute */
+#ifndef SWIGINLINE
+# if defined(__cplusplus) || (defined(__GNUC__) && !defined(__STRICT_ANSI__))
+#   define SWIGINLINE inline
+# else
+#   define SWIGINLINE
+# endif
+#endif
+
+/* attribute recognised by some compilers to avoid 'unused' warnings */
+#ifndef SWIGUNUSED
+# if defined(__GNUC__)
+#   if !(defined(__cplusplus)) || (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4))
+#     define SWIGUNUSED __attribute__ ((__unused__)) 
+#   else
+#     define SWIGUNUSED
+#   endif
+# elif defined(__ICC)
+#   define SWIGUNUSED __attribute__ ((__unused__)) 
+# else
+#   define SWIGUNUSED 
+# endif
+#endif
+
+#ifndef SWIG_MSC_UNSUPPRESS_4505
+# if defined(_MSC_VER)
+#   pragma warning(disable : 4505) /* unreferenced local function has been removed */
+# endif 
+#endif
+
+#ifndef SWIGUNUSEDPARM
+# ifdef __cplusplus
+#   define SWIGUNUSEDPARM(p)
+# else
+#   define SWIGUNUSEDPARM(p) p SWIGUNUSED 
+# endif
+#endif
+
+/* internal SWIG method */
+#ifndef SWIGINTERN
+# define SWIGINTERN static SWIGUNUSED
+#endif
+
+/* internal inline SWIG method */
+#ifndef SWIGINTERNINLINE
+# define SWIGINTERNINLINE SWIGINTERN SWIGINLINE
+#endif
+
+/* exporting methods */
+#if (__GNUC__ >= 4) || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)
+#  ifndef GCC_HASCLASSVISIBILITY
+#    define GCC_HASCLASSVISIBILITY
+#  endif
+#endif
+
+#ifndef SWIGEXPORT
+# if defined(_WIN32) || defined(__WIN32__) || defined(__CYGWIN__)
+#   if defined(STATIC_LINKED)
+#     define SWIGEXPORT
+#   else
+#     define SWIGEXPORT __declspec(dllexport)
+#   endif
+# else
+#   if defined(__GNUC__) && defined(GCC_HASCLASSVISIBILITY)
+#     define SWIGEXPORT __attribute__ ((visibility("default")))
+#   else
+#     define SWIGEXPORT
+#   endif
+# endif
+#endif
+
+/* calling conventions for Windows */
+#ifndef SWIGSTDCALL
+# if defined(_WIN32) || defined(__WIN32__) || defined(__CYGWIN__)
+#   define SWIGSTDCALL __stdcall
+# else
+#   define SWIGSTDCALL
+# endif 
+#endif
+
+/* Deal with Microsoft's attempt at deprecating C standard runtime functions */
+#if !defined(SWIG_NO_CRT_SECURE_NO_DEPRECATE) && defined(_MSC_VER) && !defined(_CRT_SECURE_NO_DEPRECATE)
+# define _CRT_SECURE_NO_DEPRECATE
+#endif
+
+/* Deal with Microsoft's attempt at deprecating methods in the standard C++ library */
+#if !defined(SWIG_NO_SCL_SECURE_NO_DEPRECATE) && defined(_MSC_VER) && !defined(_SCL_SECURE_NO_DEPRECATE)
+# define _SCL_SECURE_NO_DEPRECATE
+#endif
+
+
+
+/* Python.h has to appear first */
+#include <Python.h>
+
+/* -----------------------------------------------------------------------------
+ * swigrun.swg
+ *
+ * This file contains generic C API SWIG runtime support for pointer
+ * type checking.
+ * ----------------------------------------------------------------------------- */
+
+/* This should only be incremented when either the layout of swig_type_info changes,
+   or for whatever reason, the runtime changes incompatibly */
+#define SWIG_RUNTIME_VERSION "4"
+
+/* define SWIG_TYPE_TABLE_NAME as "SWIG_TYPE_TABLE" */
+#ifdef SWIG_TYPE_TABLE
+# define SWIG_QUOTE_STRING(x) #x
+# define SWIG_EXPAND_AND_QUOTE_STRING(x) SWIG_QUOTE_STRING(x)
+# define SWIG_TYPE_TABLE_NAME SWIG_EXPAND_AND_QUOTE_STRING(SWIG_TYPE_TABLE)
+#else
+# define SWIG_TYPE_TABLE_NAME
+#endif
+
+/*
+  You can use the SWIGRUNTIME and SWIGRUNTIMEINLINE macros for
+  creating a static or dynamic library from the SWIG runtime code.
+  In 99.9% of the cases, SWIG just needs to declare them as 'static'.
+  
+  But only do this if strictly necessary, ie, if you have problems
+  with your compiler or suchlike.
+*/
+
+#ifndef SWIGRUNTIME
+# define SWIGRUNTIME SWIGINTERN
+#endif
+
+#ifndef SWIGRUNTIMEINLINE
+# define SWIGRUNTIMEINLINE SWIGRUNTIME SWIGINLINE
+#endif
+
+/*  Generic buffer size */
+#ifndef SWIG_BUFFER_SIZE
+# define SWIG_BUFFER_SIZE 1024
+#endif
+
+/* Flags for pointer conversions */
+#define SWIG_POINTER_DISOWN        0x1
+#define SWIG_CAST_NEW_MEMORY       0x2
+
+/* Flags for new pointer objects */
+#define SWIG_POINTER_OWN           0x1
+
+
+/* 
+   Flags/methods for returning states.
+   
+   The SWIG conversion methods, as ConvertPtr, return an integer 
+   that tells if the conversion was successful or not. And if not,
+   an error code can be returned (see swigerrors.swg for the codes).
+   
+   Use the following macros/flags to set or process the returning
+   states.
+   
+   In old versions of SWIG, code such as the following was usually written:
+
+     if (SWIG_ConvertPtr(obj,vptr,ty.flags) != -1) {
+       // success code
+     } else {
+       //fail code
+     }
+
+   Now you can be more explicit:
+
+    int res = SWIG_ConvertPtr(obj,vptr,ty.flags);
+    if (SWIG_IsOK(res)) {
+      // success code
+    } else {
+      // fail code
+    }
+
+   which is the same really, but now you can also do
+
+    Type *ptr;
+    int res = SWIG_ConvertPtr(obj,(void **)(&ptr),ty.flags);
+    if (SWIG_IsOK(res)) {
+      // success code
+      if (SWIG_IsNewObj(res) {
+        ...
+	delete *ptr;
+      } else {
+        ...
+      }
+    } else {
+      // fail code
+    }
+    
+   I.e., now SWIG_ConvertPtr can return new objects and you can
+   identify the case and take care of the deallocation. Of course that
+   also requires SWIG_ConvertPtr to return new result values, such as
+
+      int SWIG_ConvertPtr(obj, ptr,...) {         
+        if (<obj is ok>) {			       
+          if (<need new object>) {		       
+            *ptr = <ptr to new allocated object>; 
+            return SWIG_NEWOBJ;		       
+          } else {				       
+            *ptr = <ptr to old object>;	       
+            return SWIG_OLDOBJ;		       
+          } 				       
+        } else {				       
+          return SWIG_BADOBJ;		       
+        }					       
+      }
+
+   Of course, returning the plain '0(success)/-1(fail)' still works, but you can be
+   more explicit by returning SWIG_BADOBJ, SWIG_ERROR or any of the
+   SWIG errors code.
+
+   Finally, if the SWIG_CASTRANK_MODE is enabled, the result code
+   allows to return the 'cast rank', for example, if you have this
+
+       int food(double)
+       int fooi(int);
+
+   and you call
+ 
+      food(1)   // cast rank '1'  (1 -> 1.0)
+      fooi(1)   // cast rank '0'
+
+   just use the SWIG_AddCast()/SWIG_CheckState()
+*/
+
+#define SWIG_OK                    (0) 
+#define SWIG_ERROR                 (-1)
+#define SWIG_IsOK(r)               (r >= 0)
+#define SWIG_ArgError(r)           ((r != SWIG_ERROR) ? r : SWIG_TypeError)  
+
+/* The CastRankLimit says how many bits are used for the cast rank */
+#define SWIG_CASTRANKLIMIT         (1 << 8)
+/* The NewMask denotes the object was created (using new/malloc) */
+#define SWIG_NEWOBJMASK            (SWIG_CASTRANKLIMIT  << 1)
+/* The TmpMask is for in/out typemaps that use temporal objects */
+#define SWIG_TMPOBJMASK            (SWIG_NEWOBJMASK << 1)
+/* Simple returning values */
+#define SWIG_BADOBJ                (SWIG_ERROR)
+#define SWIG_OLDOBJ                (SWIG_OK)
+#define SWIG_NEWOBJ                (SWIG_OK | SWIG_NEWOBJMASK)
+#define SWIG_TMPOBJ                (SWIG_OK | SWIG_TMPOBJMASK)
+/* Check, add and del mask methods */
+#define SWIG_AddNewMask(r)         (SWIG_IsOK(r) ? (r | SWIG_NEWOBJMASK) : r)
+#define SWIG_DelNewMask(r)         (SWIG_IsOK(r) ? (r & ~SWIG_NEWOBJMASK) : r)
+#define SWIG_IsNewObj(r)           (SWIG_IsOK(r) && (r & SWIG_NEWOBJMASK))
+#define SWIG_AddTmpMask(r)         (SWIG_IsOK(r) ? (r | SWIG_TMPOBJMASK) : r)
+#define SWIG_DelTmpMask(r)         (SWIG_IsOK(r) ? (r & ~SWIG_TMPOBJMASK) : r)
+#define SWIG_IsTmpObj(r)           (SWIG_IsOK(r) && (r & SWIG_TMPOBJMASK))
+
+/* Cast-Rank Mode */
+#if defined(SWIG_CASTRANK_MODE)
+#  ifndef SWIG_TypeRank
+#    define SWIG_TypeRank             unsigned long
+#  endif
+#  ifndef SWIG_MAXCASTRANK            /* Default cast allowed */
+#    define SWIG_MAXCASTRANK          (2)
+#  endif
+#  define SWIG_CASTRANKMASK          ((SWIG_CASTRANKLIMIT) -1)
+#  define SWIG_CastRank(r)           (r & SWIG_CASTRANKMASK)
+SWIGINTERNINLINE int SWIG_AddCast(int r) { 
+  return SWIG_IsOK(r) ? ((SWIG_CastRank(r) < SWIG_MAXCASTRANK) ? (r + 1) : SWIG_ERROR) : r;
+}
+SWIGINTERNINLINE int SWIG_CheckState(int r) { 
+  return SWIG_IsOK(r) ? SWIG_CastRank(r) + 1 : 0; 
+}
+#else /* no cast-rank mode */
+#  define SWIG_AddCast
+#  define SWIG_CheckState(r) (SWIG_IsOK(r) ? 1 : 0)
+#endif
+
+
+#include <string.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef void *(*swig_converter_func)(void *, int *);
+typedef struct swig_type_info *(*swig_dycast_func)(void **);
+
+/* Structure to store information on one type */
+typedef struct swig_type_info {
+  const char             *name;			/* mangled name of this type */
+  const char             *str;			/* human readable name of this type */
+  swig_dycast_func        dcast;		/* dynamic cast function down a hierarchy */
+  struct swig_cast_info  *cast;			/* linked list of types that can cast into this type */
+  void                   *clientdata;		/* language specific type data */
+  int                    owndata;		/* flag if the structure owns the clientdata */
+} swig_type_info;
+
+/* Structure to store a type and conversion function used for casting */
+typedef struct swig_cast_info {
+  swig_type_info         *type;			/* pointer to type that is equivalent to this type */
+  swig_converter_func     converter;		/* function to cast the void pointers */
+  struct swig_cast_info  *next;			/* pointer to next cast in linked list */
+  struct swig_cast_info  *prev;			/* pointer to the previous cast */
+} swig_cast_info;
+
+/* Structure used to store module information
+ * Each module generates one structure like this, and the runtime collects
+ * all of these structures and stores them in a circularly linked list.*/
+typedef struct swig_module_info {
+  swig_type_info         **types;		/* Array of pointers to swig_type_info structures that are in this module */
+  size_t                 size;		        /* Number of types in this module */
+  struct swig_module_info *next;		/* Pointer to next element in circularly linked list */
+  swig_type_info         **type_initial;	/* Array of initially generated type structures */
+  swig_cast_info         **cast_initial;	/* Array of initially generated casting structures */
+  void                    *clientdata;		/* Language specific module data */
+} swig_module_info;
+
+/* 
+  Compare two type names skipping the space characters, therefore
+  "char*" == "char *" and "Class<int>" == "Class<int >", etc.
+
+  Return 0 when the two name types are equivalent, as in
+  strncmp, but skipping ' '.
+*/
+SWIGRUNTIME int
+SWIG_TypeNameComp(const char *f1, const char *l1,
+		  const char *f2, const char *l2) {
+  for (;(f1 != l1) && (f2 != l2); ++f1, ++f2) {
+    while ((*f1 == ' ') && (f1 != l1)) ++f1;
+    while ((*f2 == ' ') && (f2 != l2)) ++f2;
+    if (*f1 != *f2) return (*f1 > *f2) ? 1 : -1;
+  }
+  return (int)((l1 - f1) - (l2 - f2));
+}
+
+/*
+  Check type equivalence in a name list like <name1>|<name2>|...
+  Return 0 if not equal, 1 if equal
+*/
+SWIGRUNTIME int
+SWIG_TypeEquiv(const char *nb, const char *tb) {
+  int equiv = 0;
+  const char* te = tb + strlen(tb);
+  const char* ne = nb;
+  while (!equiv && *ne) {
+    for (nb = ne; *ne; ++ne) {
+      if (*ne == '|') break;
+    }
+    equiv = (SWIG_TypeNameComp(nb, ne, tb, te) == 0) ? 1 : 0;
+    if (*ne) ++ne;
+  }
+  return equiv;
+}
+
+/*
+  Check type equivalence in a name list like <name1>|<name2>|...
+  Return 0 if equal, -1 if nb < tb, 1 if nb > tb
+*/
+SWIGRUNTIME int
+SWIG_TypeCompare(const char *nb, const char *tb) {
+  int equiv = 0;
+  const char* te = tb + strlen(tb);
+  const char* ne = nb;
+  while (!equiv && *ne) {
+    for (nb = ne; *ne; ++ne) {
+      if (*ne == '|') break;
+    }
+    equiv = (SWIG_TypeNameComp(nb, ne, tb, te) == 0) ? 1 : 0;
+    if (*ne) ++ne;
+  }
+  return equiv;
+}
+
+
+/*
+  Check the typename
+*/
+SWIGRUNTIME swig_cast_info *
+SWIG_TypeCheck(const char *c, swig_type_info *ty) {
+  if (ty) {
+    swig_cast_info *iter = ty->cast;
+    while (iter) {
+      if (strcmp(iter->type->name, c) == 0) {
+        if (iter == ty->cast)
+          return iter;
+        /* Move iter to the top of the linked list */
+        iter->prev->next = iter->next;
+        if (iter->next)
+          iter->next->prev = iter->prev;
+        iter->next = ty->cast;
+        iter->prev = 0;
+        if (ty->cast) ty->cast->prev = iter;
+        ty->cast = iter;
+        return iter;
+      }
+      iter = iter->next;
+    }
+  }
+  return 0;
+}
+
+/* 
+  Identical to SWIG_TypeCheck, except strcmp is replaced with a pointer comparison
+*/
+SWIGRUNTIME swig_cast_info *
+SWIG_TypeCheckStruct(swig_type_info *from, swig_type_info *ty) {
+  if (ty) {
+    swig_cast_info *iter = ty->cast;
+    while (iter) {
+      if (iter->type == from) {
+        if (iter == ty->cast)
+          return iter;
+        /* Move iter to the top of the linked list */
+        iter->prev->next = iter->next;
+        if (iter->next)
+          iter->next->prev = iter->prev;
+        iter->next = ty->cast;
+        iter->prev = 0;
+        if (ty->cast) ty->cast->prev = iter;
+        ty->cast = iter;
+        return iter;
+      }
+      iter = iter->next;
+    }
+  }
+  return 0;
+}
+
+/*
+  Cast a pointer up an inheritance hierarchy
+*/
+SWIGRUNTIMEINLINE void *
+SWIG_TypeCast(swig_cast_info *ty, void *ptr, int *newmemory) {
+  return ((!ty) || (!ty->converter)) ? ptr : (*ty->converter)(ptr, newmemory);
+}
+
+/* 
+   Dynamic pointer casting. Down an inheritance hierarchy
+*/
+SWIGRUNTIME swig_type_info *
+SWIG_TypeDynamicCast(swig_type_info *ty, void **ptr) {
+  swig_type_info *lastty = ty;
+  if (!ty || !ty->dcast) return ty;
+  while (ty && (ty->dcast)) {
+    ty = (*ty->dcast)(ptr);
+    if (ty) lastty = ty;
+  }
+  return lastty;
+}
+
+/*
+  Return the name associated with this type
+*/
+SWIGRUNTIMEINLINE const char *
+SWIG_TypeName(const swig_type_info *ty) {
+  return ty->name;
+}
+
+/*
+  Return the pretty name associated with this type,
+  that is an unmangled type name in a form presentable to the user.
+*/
+SWIGRUNTIME const char *
+SWIG_TypePrettyName(const swig_type_info *type) {
+  /* The "str" field contains the equivalent pretty names of the
+     type, separated by vertical-bar characters.  We choose
+     to print the last name, as it is often (?) the most
+     specific. */
+  if (!type) return NULL;
+  if (type->str != NULL) {
+    const char *last_name = type->str;
+    const char *s;
+    for (s = type->str; *s; s++)
+      if (*s == '|') last_name = s+1;
+    return last_name;
+  }
+  else
+    return type->name;
+}
+
+/* 
+   Set the clientdata field for a type
+*/
+SWIGRUNTIME void
+SWIG_TypeClientData(swig_type_info *ti, void *clientdata) {
+  swig_cast_info *cast = ti->cast;
+  /* if (ti->clientdata == clientdata) return; */
+  ti->clientdata = clientdata;
+  
+  while (cast) {
+    if (!cast->converter) {
+      swig_type_info *tc = cast->type;
+      if (!tc->clientdata) {
+	SWIG_TypeClientData(tc, clientdata);
+      }
+    }    
+    cast = cast->next;
+  }
+}
+SWIGRUNTIME void
+SWIG_TypeNewClientData(swig_type_info *ti, void *clientdata) {
+  SWIG_TypeClientData(ti, clientdata);
+  ti->owndata = 1;
+}
+  
+/*
+  Search for a swig_type_info structure only by mangled name
+  Search is a O(log #types)
+  
+  We start searching at module start, and finish searching when start == end.  
+  Note: if start == end at the beginning of the function, we go all the way around
+  the circular list.
+*/
+SWIGRUNTIME swig_type_info *
+SWIG_MangledTypeQueryModule(swig_module_info *start, 
+                            swig_module_info *end, 
+		            const char *name) {
+  swig_module_info *iter = start;
+  do {
+    if (iter->size) {
+      register size_t l = 0;
+      register size_t r = iter->size - 1;
+      do {
+	/* since l+r >= 0, we can (>> 1) instead (/ 2) */
+	register size_t i = (l + r) >> 1; 
+	const char *iname = iter->types[i]->name;
+	if (iname) {
+	  register int compare = strcmp(name, iname);
+	  if (compare == 0) {	    
+	    return iter->types[i];
+	  } else if (compare < 0) {
+	    if (i) {
+	      r = i - 1;
+	    } else {
+	      break;
+	    }
+	  } else if (compare > 0) {
+	    l = i + 1;
+	  }
+	} else {
+	  break; /* should never happen */
+	}
+      } while (l <= r);
+    }
+    iter = iter->next;
+  } while (iter != end);
+  return 0;
+}
+
+/*
+  Search for a swig_type_info structure for either a mangled name or a human readable name.
+  It first searches the mangled names of the types, which is a O(log #types)
+  If a type is not found it then searches the human readable names, which is O(#types).
+  
+  We start searching at module start, and finish searching when start == end.  
+  Note: if start == end at the beginning of the function, we go all the way around
+  the circular list.
+*/
+SWIGRUNTIME swig_type_info *
+SWIG_TypeQueryModule(swig_module_info *start, 
+                     swig_module_info *end, 
+		     const char *name) {
+  /* STEP 1: Search the name field using binary search */
+  swig_type_info *ret = SWIG_MangledTypeQueryModule(start, end, name);
+  if (ret) {
+    return ret;
+  } else {
+    /* STEP 2: If the type hasn't been found, do a complete search
+       of the str field (the human readable name) */
+    swig_module_info *iter = start;
+    do {
+      register size_t i = 0;
+      for (; i < iter->size; ++i) {
+	if (iter->types[i]->str && (SWIG_TypeEquiv(iter->types[i]->str, name)))
+	  return iter->types[i];
+      }
+      iter = iter->next;
+    } while (iter != end);
+  }
+  
+  /* neither found a match */
+  return 0;
+}
+
+/* 
+   Pack binary data into a string
+*/
+SWIGRUNTIME char *
+SWIG_PackData(char *c, void *ptr, size_t sz) {
+  static const char hex[17] = "0123456789abcdef";
+  register const unsigned char *u = (unsigned char *) ptr;
+  register const unsigned char *eu =  u + sz;
+  for (; u != eu; ++u) {
+    register unsigned char uu = *u;
+    *(c++) = hex[(uu & 0xf0) >> 4];
+    *(c++) = hex[uu & 0xf];
+  }
+  return c;
+}
+
+/* 
+   Unpack binary data from a string
+*/
+SWIGRUNTIME const char *
+SWIG_UnpackData(const char *c, void *ptr, size_t sz) {
+  register unsigned char *u = (unsigned char *) ptr;
+  register const unsigned char *eu = u + sz;
+  for (; u != eu; ++u) {
+    register char d = *(c++);
+    register unsigned char uu;
+    if ((d >= '0') && (d <= '9'))
+      uu = ((d - '0') << 4);
+    else if ((d >= 'a') && (d <= 'f'))
+      uu = ((d - ('a'-10)) << 4);
+    else 
+      return (char *) 0;
+    d = *(c++);
+    if ((d >= '0') && (d <= '9'))
+      uu |= (d - '0');
+    else if ((d >= 'a') && (d <= 'f'))
+      uu |= (d - ('a'-10));
+    else 
+      return (char *) 0;
+    *u = uu;
+  }
+  return c;
+}
+
+/* 
+   Pack 'void *' into a string buffer.
+*/
+SWIGRUNTIME char *
+SWIG_PackVoidPtr(char *buff, void *ptr, const char *name, size_t bsz) {
+  char *r = buff;
+  if ((2*sizeof(void *) + 2) > bsz) return 0;
+  *(r++) = '_';
+  r = SWIG_PackData(r,&ptr,sizeof(void *));
+  if (strlen(name) + 1 > (bsz - (r - buff))) return 0;
+  strcpy(r,name);
+  return buff;
+}
+
+SWIGRUNTIME const char *
+SWIG_UnpackVoidPtr(const char *c, void **ptr, const char *name) {
+  if (*c != '_') {
+    if (strcmp(c,"NULL") == 0) {
+      *ptr = (void *) 0;
+      return name;
+    } else {
+      return 0;
+    }
+  }
+  return SWIG_UnpackData(++c,ptr,sizeof(void *));
+}
+
+SWIGRUNTIME char *
+SWIG_PackDataName(char *buff, void *ptr, size_t sz, const char *name, size_t bsz) {
+  char *r = buff;
+  size_t lname = (name ? strlen(name) : 0);
+  if ((2*sz + 2 + lname) > bsz) return 0;
+  *(r++) = '_';
+  r = SWIG_PackData(r,ptr,sz);
+  if (lname) {
+    strncpy(r,name,lname+1);
+  } else {
+    *r = 0;
+  }
+  return buff;
+}
+
+SWIGRUNTIME const char *
+SWIG_UnpackDataName(const char *c, void *ptr, size_t sz, const char *name) {
+  if (*c != '_') {
+    if (strcmp(c,"NULL") == 0) {
+      memset(ptr,0,sz);
+      return name;
+    } else {
+      return 0;
+    }
+  }
+  return SWIG_UnpackData(++c,ptr,sz);
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+/*  Errors in SWIG */
+#define  SWIG_UnknownError    	   -1 
+#define  SWIG_IOError        	   -2 
+#define  SWIG_RuntimeError   	   -3 
+#define  SWIG_IndexError     	   -4 
+#define  SWIG_TypeError      	   -5 
+#define  SWIG_DivisionByZero 	   -6 
+#define  SWIG_OverflowError  	   -7 
+#define  SWIG_SyntaxError    	   -8 
+#define  SWIG_ValueError     	   -9 
+#define  SWIG_SystemError    	   -10
+#define  SWIG_AttributeError 	   -11
+#define  SWIG_MemoryError    	   -12 
+#define  SWIG_NullReferenceError   -13
+
+
+
+/* Compatibility macros for Python 3 */
+#if PY_VERSION_HEX >= 0x03000000
+
+#define PyClass_Check(obj) PyObject_IsInstance(obj, (PyObject *)&PyType_Type)
+#define PyInt_Check(x) PyLong_Check(x)
+#define PyInt_AsLong(x) PyLong_AsLong(x)
+#define PyInt_FromLong(x) PyLong_FromLong(x)
+#define PyString_Check(name) PyBytes_Check(name)
+#define PyString_FromString(x) PyUnicode_FromString(x)
+#define PyString_Format(fmt, args)  PyUnicode_Format(fmt, args)
+#define PyString_AsString(str) PyBytes_AsString(str)
+#define PyString_Size(str) PyBytes_Size(str)	
+#define PyString_InternFromString(key) PyUnicode_InternFromString(key)
+#define Py_TPFLAGS_HAVE_CLASS Py_TPFLAGS_BASETYPE
+#define PyString_AS_STRING(x) PyUnicode_AS_STRING(x)
+#define _PyLong_FromSsize_t(x) PyLong_FromSsize_t(x)
+
+#endif
+
+#ifndef Py_TYPE
+#  define Py_TYPE(op) ((op)->ob_type)
+#endif
+
+/* SWIG APIs for compatibility of both Python 2 & 3 */
+
+#if PY_VERSION_HEX >= 0x03000000
+#  define SWIG_Python_str_FromFormat PyUnicode_FromFormat
+#else
+#  define SWIG_Python_str_FromFormat PyString_FromFormat
+#endif
+
+
+/* Warning: This function will allocate a new string in Python 3,
+ * so please call SWIG_Python_str_DelForPy3(x) to free the space.
+ */
+SWIGINTERN char*
+SWIG_Python_str_AsChar(PyObject *str)
+{
+#if PY_VERSION_HEX >= 0x03000000
+  char *cstr;
+  char *newstr;
+  Py_ssize_t len;
+  str = PyUnicode_AsUTF8String(str);
+  PyBytes_AsStringAndSize(str, &cstr, &len);
+  newstr = (char *) malloc(len+1);
+  memcpy(newstr, cstr, len+1);
+  Py_XDECREF(str);
+  return newstr;
+#else
+  return PyString_AsString(str);
+#endif
+}
+
+#if PY_VERSION_HEX >= 0x03000000
+#  define SWIG_Python_str_DelForPy3(x) free( (void*) (x) )
+#else
+#  define SWIG_Python_str_DelForPy3(x) 
+#endif
+
+
+SWIGINTERN PyObject*
+SWIG_Python_str_FromChar(const char *c)
+{
+#if PY_VERSION_HEX >= 0x03000000
+  return PyUnicode_FromString(c); 
+#else
+  return PyString_FromString(c);
+#endif
+}
+
+/* Add PyOS_snprintf for old Pythons */
+#if PY_VERSION_HEX < 0x02020000
+# if defined(_MSC_VER) || defined(__BORLANDC__) || defined(_WATCOM)
+#  define PyOS_snprintf _snprintf
+# else
+#  define PyOS_snprintf snprintf
+# endif
+#endif
+
+/* A crude PyString_FromFormat implementation for old Pythons */
+#if PY_VERSION_HEX < 0x02020000
+
+#ifndef SWIG_PYBUFFER_SIZE
+# define SWIG_PYBUFFER_SIZE 1024
+#endif
+
+static PyObject *
+PyString_FromFormat(const char *fmt, ...) {
+  va_list ap;
+  char buf[SWIG_PYBUFFER_SIZE * 2];
+  int res;
+  va_start(ap, fmt);
+  res = vsnprintf(buf, sizeof(buf), fmt, ap);
+  va_end(ap);
+  return (res < 0 || res >= (int)sizeof(buf)) ? 0 : PyString_FromString(buf);
+}
+#endif
+
+/* Add PyObject_Del for old Pythons */
+#if PY_VERSION_HEX < 0x01060000
+# define PyObject_Del(op) PyMem_DEL((op))
+#endif
+#ifndef PyObject_DEL
+# define PyObject_DEL PyObject_Del
+#endif
+
+/* A crude PyExc_StopIteration exception for old Pythons */
+#if PY_VERSION_HEX < 0x02020000
+# ifndef PyExc_StopIteration
+#  define PyExc_StopIteration PyExc_RuntimeError
+# endif
+# ifndef PyObject_GenericGetAttr
+#  define PyObject_GenericGetAttr 0
+# endif
+#endif
+
+/* Py_NotImplemented is defined in 2.1 and up. */
+#if PY_VERSION_HEX < 0x02010000
+# ifndef Py_NotImplemented
+#  define Py_NotImplemented PyExc_RuntimeError
+# endif
+#endif
+
+/* A crude PyString_AsStringAndSize implementation for old Pythons */
+#if PY_VERSION_HEX < 0x02010000
+# ifndef PyString_AsStringAndSize
+#  define PyString_AsStringAndSize(obj, s, len) {*s = PyString_AsString(obj); *len = *s ? strlen(*s) : 0;}
+# endif
+#endif
+
+/* PySequence_Size for old Pythons */
+#if PY_VERSION_HEX < 0x02000000
+# ifndef PySequence_Size
+#  define PySequence_Size PySequence_Length
+# endif
+#endif
+
+/* PyBool_FromLong for old Pythons */
+#if PY_VERSION_HEX < 0x02030000
+static
+PyObject *PyBool_FromLong(long ok)
+{
+  PyObject *result = ok ? Py_True : Py_False;
+  Py_INCREF(result);
+  return result;
+}
+#endif
+
+/* Py_ssize_t for old Pythons */
+/* This code is as recommended by: */
+/* http://www.python.org/dev/peps/pep-0353/#conversion-guidelines */
+#if PY_VERSION_HEX < 0x02050000 && !defined(PY_SSIZE_T_MIN)
+typedef int Py_ssize_t;
+# define PY_SSIZE_T_MAX INT_MAX
+# define PY_SSIZE_T_MIN INT_MIN
+typedef inquiry lenfunc;
+typedef intargfunc ssizeargfunc;
+typedef intintargfunc ssizessizeargfunc;
+typedef intobjargproc ssizeobjargproc;
+typedef intintobjargproc ssizessizeobjargproc;
+typedef getreadbufferproc readbufferproc;
+typedef getwritebufferproc writebufferproc;
+typedef getsegcountproc segcountproc;
+typedef getcharbufferproc charbufferproc;
+static long PyNumber_AsSsize_t (PyObject *x, void *SWIGUNUSEDPARM(exc))
+{
+  long result = 0;
+  PyObject *i = PyNumber_Int(x);
+  if (i) {
+    result = PyInt_AsLong(i);
+    Py_DECREF(i);
+  }
+  return result;
+}
+#endif
+
+#if PY_VERSION_HEX < 0x02040000
+#define Py_VISIT(op)				\
+  do { 						\
+    if (op) {					\
+      int vret = visit((op), arg);		\
+      if (vret)					\
+        return vret;				\
+    }						\
+  } while (0)
+#endif
+
+#if PY_VERSION_HEX < 0x02030000
+typedef struct {
+  PyTypeObject type;
+  PyNumberMethods as_number;
+  PyMappingMethods as_mapping;
+  PySequenceMethods as_sequence;
+  PyBufferProcs as_buffer;
+  PyObject *name, *slots;
+} PyHeapTypeObject;
+#endif
+
+#if PY_VERSION_HEX < 0x02030000
+typedef destructor freefunc;
+#endif
+
+#if ((PY_MAJOR_VERSION == 2 && PY_MINOR_VERSION > 6) || \
+     (PY_MAJOR_VERSION == 3 && PY_MINOR_VERSION > 0) || \
+     (PY_MAJOR_VERSION > 3))
+# define SWIGPY_USE_CAPSULE
+# define SWIGPY_CAPSULE_NAME ((char*)"swig_runtime_data" SWIG_RUNTIME_VERSION ".type_pointer_capsule" SWIG_TYPE_TABLE_NAME)
+#endif
+
+#if PY_VERSION_HEX < 0x03020000
+#define PyDescr_TYPE(x) (((PyDescrObject *)(x))->d_type)
+#define PyDescr_NAME(x) (((PyDescrObject *)(x))->d_name)
+#endif
+
+/* -----------------------------------------------------------------------------
+ * error manipulation
+ * ----------------------------------------------------------------------------- */
+
+SWIGRUNTIME PyObject*
+SWIG_Python_ErrorType(int code) {
+  PyObject* type = 0;
+  switch(code) {
+  case SWIG_MemoryError:
+    type = PyExc_MemoryError;
+    break;
+  case SWIG_IOError:
+    type = PyExc_IOError;
+    break;
+  case SWIG_RuntimeError:
+    type = PyExc_RuntimeError;
+    break;
+  case SWIG_IndexError:
+    type = PyExc_IndexError;
+    break;
+  case SWIG_TypeError:
+    type = PyExc_TypeError;
+    break;
+  case SWIG_DivisionByZero:
+    type = PyExc_ZeroDivisionError;
+    break;
+  case SWIG_OverflowError:
+    type = PyExc_OverflowError;
+    break;
+  case SWIG_SyntaxError:
+    type = PyExc_SyntaxError;
+    break;
+  case SWIG_ValueError:
+    type = PyExc_ValueError;
+    break;
+  case SWIG_SystemError:
+    type = PyExc_SystemError;
+    break;
+  case SWIG_AttributeError:
+    type = PyExc_AttributeError;
+    break;
+  default:
+    type = PyExc_RuntimeError;
+  }
+  return type;
+}
+
+
+SWIGRUNTIME void
+SWIG_Python_AddErrorMsg(const char* mesg)
+{
+  PyObject *type = 0;
+  PyObject *value = 0;
+  PyObject *traceback = 0;
+
+  if (PyErr_Occurred()) PyErr_Fetch(&type, &value, &traceback);
+  if (value) {
+    char *tmp;
+    PyObject *old_str = PyObject_Str(value);
+    PyErr_Clear();
+    Py_XINCREF(type);
+
+    PyErr_Format(type, "%s %s", tmp = SWIG_Python_str_AsChar(old_str), mesg);
+    SWIG_Python_str_DelForPy3(tmp);
+    Py_DECREF(old_str);
+    Py_DECREF(value);
+  } else {
+    PyErr_SetString(PyExc_RuntimeError, mesg);
+  }
+}
+
+#if defined(SWIG_PYTHON_NO_THREADS)
+#  if defined(SWIG_PYTHON_THREADS)
+#    undef SWIG_PYTHON_THREADS
+#  endif
+#endif
+#if defined(SWIG_PYTHON_THREADS) /* Threading support is enabled */
+#  if !defined(SWIG_PYTHON_USE_GIL) && !defined(SWIG_PYTHON_NO_USE_GIL)
+#    if (PY_VERSION_HEX >= 0x02030000) /* For 2.3 or later, use the PyGILState calls */
+#      define SWIG_PYTHON_USE_GIL
+#    endif
+#  endif
+#  if defined(SWIG_PYTHON_USE_GIL) /* Use PyGILState threads calls */
+#    ifndef SWIG_PYTHON_INITIALIZE_THREADS
+#     define SWIG_PYTHON_INITIALIZE_THREADS  PyEval_InitThreads() 
+#    endif
+#    ifdef __cplusplus /* C++ code */
+       class SWIG_Python_Thread_Block {
+         bool status;
+         PyGILState_STATE state;
+       public:
+         void end() { if (status) { PyGILState_Release(state); status = false;} }
+         SWIG_Python_Thread_Block() : status(true), state(PyGILState_Ensure()) {}
+         ~SWIG_Python_Thread_Block() { end(); }
+       };
+       class SWIG_Python_Thread_Allow {
+         bool status;
+         PyThreadState *save;
+       public:
+         void end() { if (status) { PyEval_RestoreThread(save); status = false; }}
+         SWIG_Python_Thread_Allow() : status(true), save(PyEval_SaveThread()) {}
+         ~SWIG_Python_Thread_Allow() { end(); }
+       };
+#      define SWIG_PYTHON_THREAD_BEGIN_BLOCK   SWIG_Python_Thread_Block _swig_thread_block
+#      define SWIG_PYTHON_THREAD_END_BLOCK     _swig_thread_block.end()
+#      define SWIG_PYTHON_THREAD_BEGIN_ALLOW   SWIG_Python_Thread_Allow _swig_thread_allow
+#      define SWIG_PYTHON_THREAD_END_ALLOW     _swig_thread_allow.end()
+#    else /* C code */
+#      define SWIG_PYTHON_THREAD_BEGIN_BLOCK   PyGILState_STATE _swig_thread_block = PyGILState_Ensure()
+#      define SWIG_PYTHON_THREAD_END_BLOCK     PyGILState_Release(_swig_thread_block)
+#      define SWIG_PYTHON_THREAD_BEGIN_ALLOW   PyThreadState *_swig_thread_allow = PyEval_SaveThread()
+#      define SWIG_PYTHON_THREAD_END_ALLOW     PyEval_RestoreThread(_swig_thread_allow)
+#    endif
+#  else /* Old thread way, not implemented, user must provide it */
+#    if !defined(SWIG_PYTHON_INITIALIZE_THREADS)
+#      define SWIG_PYTHON_INITIALIZE_THREADS
+#    endif
+#    if !defined(SWIG_PYTHON_THREAD_BEGIN_BLOCK)
+#      define SWIG_PYTHON_THREAD_BEGIN_BLOCK
+#    endif
+#    if !defined(SWIG_PYTHON_THREAD_END_BLOCK)
+#      define SWIG_PYTHON_THREAD_END_BLOCK
+#    endif
+#    if !defined(SWIG_PYTHON_THREAD_BEGIN_ALLOW)
+#      define SWIG_PYTHON_THREAD_BEGIN_ALLOW
+#    endif
+#    if !defined(SWIG_PYTHON_THREAD_END_ALLOW)
+#      define SWIG_PYTHON_THREAD_END_ALLOW
+#    endif
+#  endif
+#else /* No thread support */
+#  define SWIG_PYTHON_INITIALIZE_THREADS
+#  define SWIG_PYTHON_THREAD_BEGIN_BLOCK
+#  define SWIG_PYTHON_THREAD_END_BLOCK
+#  define SWIG_PYTHON_THREAD_BEGIN_ALLOW
+#  define SWIG_PYTHON_THREAD_END_ALLOW
+#endif
+
+/* -----------------------------------------------------------------------------
+ * Python API portion that goes into the runtime
+ * ----------------------------------------------------------------------------- */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* -----------------------------------------------------------------------------
+ * Constant declarations
+ * ----------------------------------------------------------------------------- */
+
+/* Constant Types */
+#define SWIG_PY_POINTER 4
+#define SWIG_PY_BINARY  5
+
+/* Constant information structure */
+typedef struct swig_const_info {
+  int type;
+  char *name;
+  long lvalue;
+  double dvalue;
+  void   *pvalue;
+  swig_type_info **ptype;
+} swig_const_info;
+
+
+/* -----------------------------------------------------------------------------
+ * Wrapper of PyInstanceMethod_New() used in Python 3
+ * It is exported to the generated module, used for -fastproxy
+ * ----------------------------------------------------------------------------- */
+#if PY_VERSION_HEX >= 0x03000000
+SWIGRUNTIME PyObject* SWIG_PyInstanceMethod_New(PyObject *SWIGUNUSEDPARM(self), PyObject *func)
+{
+  return PyInstanceMethod_New(func);
+}
+#else
+SWIGRUNTIME PyObject* SWIG_PyInstanceMethod_New(PyObject *SWIGUNUSEDPARM(self), PyObject *SWIGUNUSEDPARM(func))
+{
+  return NULL;
+}
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+
+/* -----------------------------------------------------------------------------
+ * pyrun.swg
+ *
+ * This file contains the runtime support for Python modules
+ * and includes code for managing global variables and pointer
+ * type checking.
+ *
+ * ----------------------------------------------------------------------------- */
+
+/* Common SWIG API */
+
+/* for raw pointers */
+#define SWIG_Python_ConvertPtr(obj, pptr, type, flags)  SWIG_Python_ConvertPtrAndOwn(obj, pptr, type, flags, 0)
+#define SWIG_ConvertPtr(obj, pptr, type, flags)         SWIG_Python_ConvertPtr(obj, pptr, type, flags)
+#define SWIG_ConvertPtrAndOwn(obj,pptr,type,flags,own)  SWIG_Python_ConvertPtrAndOwn(obj, pptr, type, flags, own)
+
+#ifdef SWIGPYTHON_BUILTIN
+#define SWIG_NewPointerObj(ptr, type, flags)            SWIG_Python_NewPointerObj(self, ptr, type, flags)
+#else
+#define SWIG_NewPointerObj(ptr, type, flags)            SWIG_Python_NewPointerObj(NULL, ptr, type, flags)
+#endif
+
+#define SWIG_InternalNewPointerObj(ptr, type, flags)	SWIG_Python_NewPointerObj(NULL, ptr, type, flags)
+
+#define SWIG_CheckImplicit(ty)                          SWIG_Python_CheckImplicit(ty) 
+#define SWIG_AcquirePtr(ptr, src)                       SWIG_Python_AcquirePtr(ptr, src)
+#define swig_owntype                                    int
+
+/* for raw packed data */
+#define SWIG_ConvertPacked(obj, ptr, sz, ty)            SWIG_Python_ConvertPacked(obj, ptr, sz, ty)
+#define SWIG_NewPackedObj(ptr, sz, type)                SWIG_Python_NewPackedObj(ptr, sz, type)
+
+/* for class or struct pointers */
+#define SWIG_ConvertInstance(obj, pptr, type, flags)    SWIG_ConvertPtr(obj, pptr, type, flags)
+#define SWIG_NewInstanceObj(ptr, type, flags)           SWIG_NewPointerObj(ptr, type, flags)
+
+/* for C or C++ function pointers */
+#define SWIG_ConvertFunctionPtr(obj, pptr, type)        SWIG_Python_ConvertFunctionPtr(obj, pptr, type)
+#define SWIG_NewFunctionPtrObj(ptr, type)               SWIG_Python_NewPointerObj(NULL, ptr, type, 0)
+
+/* for C++ member pointers, ie, member methods */
+#define SWIG_ConvertMember(obj, ptr, sz, ty)            SWIG_Python_ConvertPacked(obj, ptr, sz, ty)
+#define SWIG_NewMemberObj(ptr, sz, type)                SWIG_Python_NewPackedObj(ptr, sz, type)
+
+
+/* Runtime API */
+
+#define SWIG_GetModule(clientdata)                      SWIG_Python_GetModule()
+#define SWIG_SetModule(clientdata, pointer)             SWIG_Python_SetModule(pointer)
+#define SWIG_NewClientData(obj)                         SwigPyClientData_New(obj)
+
+#define SWIG_SetErrorObj                                SWIG_Python_SetErrorObj                            
+#define SWIG_SetErrorMsg                        	SWIG_Python_SetErrorMsg				   
+#define SWIG_ErrorType(code)                    	SWIG_Python_ErrorType(code)                        
+#define SWIG_Error(code, msg)            		SWIG_Python_SetErrorMsg(SWIG_ErrorType(code), msg) 
+#define SWIG_fail                        		goto fail					   
+
+
+/* Runtime API implementation */
+
+/* Error manipulation */
+
+SWIGINTERN void 
+SWIG_Python_SetErrorObj(PyObject *errtype, PyObject *obj) {
+  SWIG_PYTHON_THREAD_BEGIN_BLOCK; 
+  PyErr_SetObject(errtype, obj);
+  Py_DECREF(obj);
+  SWIG_PYTHON_THREAD_END_BLOCK;
+}
+
+SWIGINTERN void 
+SWIG_Python_SetErrorMsg(PyObject *errtype, const char *msg) {
+  SWIG_PYTHON_THREAD_BEGIN_BLOCK;
+  PyErr_SetString(errtype, (char *) msg);
+  SWIG_PYTHON_THREAD_END_BLOCK;
+}
+
+#define SWIG_Python_Raise(obj, type, desc)  SWIG_Python_SetErrorObj(SWIG_Python_ExceptionType(desc), obj)
+
+/* Set a constant value */
+
+#if defined(SWIGPYTHON_BUILTIN)
+
+SWIGINTERN void
+SwigPyBuiltin_AddPublicSymbol(PyObject *seq, const char *key) {
+  PyObject *s = PyString_InternFromString(key);
+  PyList_Append(seq, s);
+  Py_DECREF(s);
+}
+
+SWIGINTERN void
+SWIG_Python_SetConstant(PyObject *d, PyObject *public_interface, const char *name, PyObject *obj) {   
+  PyDict_SetItemString(d, (char *)name, obj);
+  Py_DECREF(obj);
+  if (public_interface)
+    SwigPyBuiltin_AddPublicSymbol(public_interface, name);
+}
+
+#else
+
+SWIGINTERN void
+SWIG_Python_SetConstant(PyObject *d, const char *name, PyObject *obj) {   
+  PyDict_SetItemString(d, (char *)name, obj);
+  Py_DECREF(obj);                            
+}
+
+#endif
+
+/* Append a value to the result obj */
+
+SWIGINTERN PyObject*
+SWIG_Python_AppendOutput(PyObject* result, PyObject* obj) {
+#if !defined(SWIG_PYTHON_OUTPUT_TUPLE)
+  if (!result) {
+    result = obj;
+  } else if (result == Py_None) {
+    Py_DECREF(result);
+    result = obj;
+  } else {
+    if (!PyList_Check(result)) {
+      PyObject *o2 = result;
+      result = PyList_New(1);
+      PyList_SetItem(result, 0, o2);
+    }
+    PyList_Append(result,obj);
+    Py_DECREF(obj);
+  }
+  return result;
+#else
+  PyObject*   o2;
+  PyObject*   o3;
+  if (!result) {
+    result = obj;
+  } else if (result == Py_None) {
+    Py_DECREF(result);
+    result = obj;
+  } else {
+    if (!PyTuple_Check(result)) {
+      o2 = result;
+      result = PyTuple_New(1);
+      PyTuple_SET_ITEM(result, 0, o2);
+    }
+    o3 = PyTuple_New(1);
+    PyTuple_SET_ITEM(o3, 0, obj);
+    o2 = result;
+    result = PySequence_Concat(o2, o3);
+    Py_DECREF(o2);
+    Py_DECREF(o3);
+  }
+  return result;
+#endif
+}
+
+/* Unpack the argument tuple */
+
+SWIGINTERN int
+SWIG_Python_UnpackTuple(PyObject *args, const char *name, Py_ssize_t min, Py_ssize_t max, PyObject **objs)
+{
+  if (!args) {
+    if (!min && !max) {
+      return 1;
+    } else {
+      PyErr_Format(PyExc_TypeError, "%s expected %s%d arguments, got none", 
+		   name, (min == max ? "" : "at least "), (int)min);
+      return 0;
+    }
+  }  
+  if (!PyTuple_Check(args)) {
+    if (min <= 1 && max >= 1) {
+      register int i;
+      objs[0] = args;
+      for (i = 1; i < max; ++i) {
+	objs[i] = 0;
+      }
+      return 2;
+    }
+    PyErr_SetString(PyExc_SystemError, "UnpackTuple() argument list is not a tuple");
+    return 0;
+  } else {
+    register Py_ssize_t l = PyTuple_GET_SIZE(args);
+    if (l < min) {
+      PyErr_Format(PyExc_TypeError, "%s expected %s%d arguments, got %d", 
+		   name, (min == max ? "" : "at least "), (int)min, (int)l);
+      return 0;
+    } else if (l > max) {
+      PyErr_Format(PyExc_TypeError, "%s expected %s%d arguments, got %d", 
+		   name, (min == max ? "" : "at most "), (int)max, (int)l);
+      return 0;
+    } else {
+      register int i;
+      for (i = 0; i < l; ++i) {
+	objs[i] = PyTuple_GET_ITEM(args, i);
+      }
+      for (; l < max; ++l) {
+	objs[l] = 0;
+      }
+      return i + 1;
+    }    
+  }
+}
+
+/* A functor is a function object with one single object argument */
+#if PY_VERSION_HEX >= 0x02020000
+#define SWIG_Python_CallFunctor(functor, obj)	        PyObject_CallFunctionObjArgs(functor, obj, NULL);
+#else
+#define SWIG_Python_CallFunctor(functor, obj)	        PyObject_CallFunction(functor, "O", obj);
+#endif
+
+/*
+  Helper for static pointer initialization for both C and C++ code, for example
+  static PyObject *SWIG_STATIC_POINTER(MyVar) = NewSomething(...);
+*/
+#ifdef __cplusplus
+#define SWIG_STATIC_POINTER(var)  var
+#else
+#define SWIG_STATIC_POINTER(var)  var = 0; if (!var) var
+#endif
+
+/* -----------------------------------------------------------------------------
+ * Pointer declarations
+ * ----------------------------------------------------------------------------- */
+
+/* Flags for new pointer objects */
+#define SWIG_POINTER_NOSHADOW       (SWIG_POINTER_OWN      << 1)
+#define SWIG_POINTER_NEW            (SWIG_POINTER_NOSHADOW | SWIG_POINTER_OWN)
+
+#define SWIG_POINTER_IMPLICIT_CONV  (SWIG_POINTER_DISOWN   << 1)
+
+#define SWIG_BUILTIN_TP_INIT	    (SWIG_POINTER_OWN << 2)
+#define SWIG_BUILTIN_INIT	    (SWIG_BUILTIN_TP_INIT | SWIG_POINTER_OWN)
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*  How to access Py_None */
+#if defined(_WIN32) || defined(__WIN32__) || defined(__CYGWIN__)
+#  ifndef SWIG_PYTHON_NO_BUILD_NONE
+#    ifndef SWIG_PYTHON_BUILD_NONE
+#      define SWIG_PYTHON_BUILD_NONE
+#    endif
+#  endif
+#endif
+
+#ifdef SWIG_PYTHON_BUILD_NONE
+#  ifdef Py_None
+#   undef Py_None
+#   define Py_None SWIG_Py_None()
+#  endif
+SWIGRUNTIMEINLINE PyObject * 
+_SWIG_Py_None(void)
+{
+  PyObject *none = Py_BuildValue((char*)"");
+  Py_DECREF(none);
+  return none;
+}
+SWIGRUNTIME PyObject * 
+SWIG_Py_None(void)
+{
+  static PyObject *SWIG_STATIC_POINTER(none) = _SWIG_Py_None();
+  return none;
+}
+#endif
+
+/* The python void return value */
+
+SWIGRUNTIMEINLINE PyObject * 
+SWIG_Py_Void(void)
+{
+  PyObject *none = Py_None;
+  Py_INCREF(none);
+  return none;
+}
+
+/* SwigPyClientData */
+
+typedef struct {
+  PyObject *klass;
+  PyObject *newraw;
+  PyObject *newargs;
+  PyObject *destroy;
+  int delargs;
+  int implicitconv;
+  PyTypeObject *pytype;
+} SwigPyClientData;
+
+SWIGRUNTIMEINLINE int 
+SWIG_Python_CheckImplicit(swig_type_info *ty)
+{
+  SwigPyClientData *data = (SwigPyClientData *)ty->clientdata;
+  return data ? data->implicitconv : 0;
+}
+
+SWIGRUNTIMEINLINE PyObject *
+SWIG_Python_ExceptionType(swig_type_info *desc) {
+  SwigPyClientData *data = desc ? (SwigPyClientData *) desc->clientdata : 0;
+  PyObject *klass = data ? data->klass : 0;
+  return (klass ? klass : PyExc_RuntimeError);
+}
+
+
+SWIGRUNTIME SwigPyClientData * 
+SwigPyClientData_New(PyObject* obj)
+{
+  if (!obj) {
+    return 0;
+  } else {
+    SwigPyClientData *data = (SwigPyClientData *)malloc(sizeof(SwigPyClientData));
+    /* the klass element */
+    data->klass = obj;
+    Py_INCREF(data->klass);
+    /* the newraw method and newargs arguments used to create a new raw instance */
+    if (PyClass_Check(obj)) {
+      data->newraw = 0;
+      data->newargs = obj;
+      Py_INCREF(obj);
+    } else {
+#if (PY_VERSION_HEX < 0x02020000)
+      data->newraw = 0;
+#else
+      data->newraw = PyObject_GetAttrString(data->klass, (char *)"__new__");
+#endif
+      if (data->newraw) {
+	Py_INCREF(data->newraw);
+	data->newargs = PyTuple_New(1);
+	PyTuple_SetItem(data->newargs, 0, obj);
+      } else {
+	data->newargs = obj;
+      }
+      Py_INCREF(data->newargs);
+    }
+    /* the destroy method, aka as the C++ delete method */
+    data->destroy = PyObject_GetAttrString(data->klass, (char *)"__swig_destroy__");
+    if (PyErr_Occurred()) {
+      PyErr_Clear();
+      data->destroy = 0;
+    }
+    if (data->destroy) {
+      int flags;
+      Py_INCREF(data->destroy);
+      flags = PyCFunction_GET_FLAGS(data->destroy);
+#ifdef METH_O
+      data->delargs = !(flags & (METH_O));
+#else
+      data->delargs = 0;
+#endif
+    } else {
+      data->delargs = 0;
+    }
+    data->implicitconv = 0;
+    data->pytype = 0;
+    return data;
+  }
+}
+
+SWIGRUNTIME void 
+SwigPyClientData_Del(SwigPyClientData *data) {
+  Py_XDECREF(data->newraw);
+  Py_XDECREF(data->newargs);
+  Py_XDECREF(data->destroy);
+}
+
+/* =============== SwigPyObject =====================*/
+
+typedef struct {
+  PyObject_HEAD
+  void *ptr;
+  swig_type_info *ty;
+  int own;
+  PyObject *next;
+#ifdef SWIGPYTHON_BUILTIN
+  PyObject *dict;
+#endif
+} SwigPyObject;
+
+SWIGRUNTIME PyObject *
+SwigPyObject_long(SwigPyObject *v)
+{
+  return PyLong_FromVoidPtr(v->ptr);
+}
+
+SWIGRUNTIME PyObject *
+SwigPyObject_format(const char* fmt, SwigPyObject *v)
+{
+  PyObject *res = NULL;
+  PyObject *args = PyTuple_New(1);
+  if (args) {
+    if (PyTuple_SetItem(args, 0, SwigPyObject_long(v)) == 0) {
+      PyObject *ofmt = SWIG_Python_str_FromChar(fmt);
+      if (ofmt) {
+#if PY_VERSION_HEX >= 0x03000000
+	res = PyUnicode_Format(ofmt,args);
+#else
+	res = PyString_Format(ofmt,args);
+#endif
+	Py_DECREF(ofmt);
+      }
+      Py_DECREF(args);
+    }
+  }
+  return res;
+}
+
+SWIGRUNTIME PyObject *
+SwigPyObject_oct(SwigPyObject *v)
+{
+  return SwigPyObject_format("%o",v);
+}
+
+SWIGRUNTIME PyObject *
+SwigPyObject_hex(SwigPyObject *v)
+{
+  return SwigPyObject_format("%x",v);
+}
+
+SWIGRUNTIME PyObject *
+#ifdef METH_NOARGS
+SwigPyObject_repr(SwigPyObject *v)
+#else
+SwigPyObject_repr(SwigPyObject *v, PyObject *args)
+#endif
+{
+  const char *name = SWIG_TypePrettyName(v->ty);
+  PyObject *repr = SWIG_Python_str_FromFormat("<Swig Object of type '%s' at %p>", name, (void *)v);
+  if (v->next) {
+# ifdef METH_NOARGS
+    PyObject *nrep = SwigPyObject_repr((SwigPyObject *)v->next);
+# else
+    PyObject *nrep = SwigPyObject_repr((SwigPyObject *)v->next, args);
+# endif
+# if PY_VERSION_HEX >= 0x03000000
+    PyObject *joined = PyUnicode_Concat(repr, nrep);
+    Py_DecRef(repr);
+    Py_DecRef(nrep);
+    repr = joined;
+# else
+    PyString_ConcatAndDel(&repr,nrep);
+# endif
+  }
+  return repr;  
+}
+
+SWIGRUNTIME int
+SwigPyObject_print(SwigPyObject *v, FILE *fp, int SWIGUNUSEDPARM(flags))
+{
+  char *str;
+#ifdef METH_NOARGS
+  PyObject *repr = SwigPyObject_repr(v);
+#else
+  PyObject *repr = SwigPyObject_repr(v, NULL);
+#endif
+  if (repr) {
+    str = SWIG_Python_str_AsChar(repr); 
+    fputs(str, fp);
+    SWIG_Python_str_DelForPy3(str);
+    Py_DECREF(repr);
+    return 0; 
+  } else {
+    return 1; 
+  }
+}
+
+SWIGRUNTIME PyObject *
+SwigPyObject_str(SwigPyObject *v)
+{
+  char result[SWIG_BUFFER_SIZE];
+  return SWIG_PackVoidPtr(result, v->ptr, v->ty->name, sizeof(result)) ?
+    SWIG_Python_str_FromChar(result) : 0;
+}
+
+SWIGRUNTIME int
+SwigPyObject_compare(SwigPyObject *v, SwigPyObject *w)
+{
+  void *i = v->ptr;
+  void *j = w->ptr;
+  return (i < j) ? -1 : ((i > j) ? 1 : 0);
+}
+
+/* Added for Python 3.x, would it also be useful for Python 2.x? */
+SWIGRUNTIME PyObject*
+SwigPyObject_richcompare(SwigPyObject *v, SwigPyObject *w, int op)
+{
+  PyObject* res;
+  if( op != Py_EQ && op != Py_NE ) {
+    Py_INCREF(Py_NotImplemented);
+    return Py_NotImplemented;
+  }
+  res = PyBool_FromLong( (SwigPyObject_compare(v, w)==0) == (op == Py_EQ) ? 1 : 0);
+  return res;  
+}
+
+
+SWIGRUNTIME PyTypeObject* SwigPyObject_TypeOnce(void);
+
+#ifdef SWIGPYTHON_BUILTIN
+static swig_type_info *SwigPyObject_stype = 0;
+SWIGRUNTIME PyTypeObject*
+SwigPyObject_type(void) {
+    SwigPyClientData *cd;
+    assert(SwigPyObject_stype);
+    cd = (SwigPyClientData*) SwigPyObject_stype->clientdata;
+    assert(cd);
+    assert(cd->pytype);
+    return cd->pytype;
+}
+#else
+SWIGRUNTIME PyTypeObject*
+SwigPyObject_type(void) {
+  static PyTypeObject *SWIG_STATIC_POINTER(type) = SwigPyObject_TypeOnce();
+  return type;
+}
+#endif
+
+SWIGRUNTIMEINLINE int
+SwigPyObject_Check(PyObject *op) {
+#ifdef SWIGPYTHON_BUILTIN
+  PyTypeObject *target_tp = SwigPyObject_type();
+  if (PyType_IsSubtype(op->ob_type, target_tp))
+    return 1;
+  return (strcmp(op->ob_type->tp_name, "SwigPyObject") == 0);
+#else
+  return (Py_TYPE(op) == SwigPyObject_type())
+    || (strcmp(Py_TYPE(op)->tp_name,"SwigPyObject") == 0);
+#endif
+}
+
+SWIGRUNTIME PyObject *
+SwigPyObject_New(void *ptr, swig_type_info *ty, int own);
+
+SWIGRUNTIME void
+SwigPyObject_dealloc(PyObject *v)
+{
+  SwigPyObject *sobj = (SwigPyObject *) v;
+  PyObject *next = sobj->next;
+  if (sobj->own == SWIG_POINTER_OWN) {
+    swig_type_info *ty = sobj->ty;
+    SwigPyClientData *data = ty ? (SwigPyClientData *) ty->clientdata : 0;
+    PyObject *destroy = data ? data->destroy : 0;
+    if (destroy) {
+      /* destroy is always a VARARGS method */
+      PyObject *res;
+      if (data->delargs) {
+	/* we need to create a temporary object to carry the destroy operation */
+	PyObject *tmp = SwigPyObject_New(sobj->ptr, ty, 0);
+	res = SWIG_Python_CallFunctor(destroy, tmp);
+	Py_DECREF(tmp);
+      } else {
+	PyCFunction meth = PyCFunction_GET_FUNCTION(destroy);
+	PyObject *mself = PyCFunction_GET_SELF(destroy);
+	res = ((*meth)(mself, v));
+      }
+      Py_XDECREF(res);
+    } 
+#if !defined(SWIG_PYTHON_SILENT_MEMLEAK)
+    else {
+      const char *name = SWIG_TypePrettyName(ty);
+      printf("swig/python detected a memory leak of type '%s', no destructor found.\n", (name ? name : "unknown"));
+    }
+#endif
+  } 
+  Py_XDECREF(next);
+  PyObject_DEL(v);
+}
+
+SWIGRUNTIME PyObject* 
+SwigPyObject_append(PyObject* v, PyObject* next)
+{
+  SwigPyObject *sobj = (SwigPyObject *) v;
+#ifndef METH_O
+  PyObject *tmp = 0;
+  if (!PyArg_ParseTuple(next,(char *)"O:append", &tmp)) return NULL;
+  next = tmp;
+#endif
+  if (!SwigPyObject_Check(next)) {
+    return NULL;
+  }
+  sobj->next = next;
+  Py_INCREF(next);
+  return SWIG_Py_Void();
+}
+
+SWIGRUNTIME PyObject* 
+#ifdef METH_NOARGS
+SwigPyObject_next(PyObject* v)
+#else
+SwigPyObject_next(PyObject* v, PyObject *SWIGUNUSEDPARM(args))
+#endif
+{
+  SwigPyObject *sobj = (SwigPyObject *) v;
+  if (sobj->next) {    
+    Py_INCREF(sobj->next);
+    return sobj->next;
+  } else {
+    return SWIG_Py_Void();
+  }
+}
+
+SWIGINTERN PyObject*
+#ifdef METH_NOARGS
+SwigPyObject_disown(PyObject *v)
+#else
+SwigPyObject_disown(PyObject* v, PyObject *SWIGUNUSEDPARM(args))
+#endif
+{
+  SwigPyObject *sobj = (SwigPyObject *)v;
+  sobj->own = 0;
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject*
+#ifdef METH_NOARGS
+SwigPyObject_acquire(PyObject *v)
+#else
+SwigPyObject_acquire(PyObject* v, PyObject *SWIGUNUSEDPARM(args))
+#endif
+{
+  SwigPyObject *sobj = (SwigPyObject *)v;
+  sobj->own = SWIG_POINTER_OWN;
+  return SWIG_Py_Void();
+}
+
+SWIGINTERN PyObject*
+SwigPyObject_own(PyObject *v, PyObject *args)
+{
+  PyObject *val = 0;
+#if (PY_VERSION_HEX < 0x02020000)
+  if (!PyArg_ParseTuple(args,(char *)"|O:own",&val))
+#else
+  if (!PyArg_UnpackTuple(args, (char *)"own", 0, 1, &val)) 
+#endif
+    {
+      return NULL;
+    } 
+  else
+    {
+      SwigPyObject *sobj = (SwigPyObject *)v;
+      PyObject *obj = PyBool_FromLong(sobj->own);
+      if (val) {
+#ifdef METH_NOARGS
+	if (PyObject_IsTrue(val)) {
+	  SwigPyObject_acquire(v);
+	} else {
+	  SwigPyObject_disown(v);
+	}
+#else
+	if (PyObject_IsTrue(val)) {
+	  SwigPyObject_acquire(v,args);
+	} else {
+	  SwigPyObject_disown(v,args);
+	}
+#endif
+      } 
+      return obj;
+    }
+}
+
+#ifdef METH_O
+static PyMethodDef
+swigobject_methods[] = {
+  {(char *)"disown",  (PyCFunction)SwigPyObject_disown,  METH_NOARGS,  (char *)"releases ownership of the pointer"},
+  {(char *)"acquire", (PyCFunction)SwigPyObject_acquire, METH_NOARGS,  (char *)"aquires ownership of the pointer"},
+  {(char *)"own",     (PyCFunction)SwigPyObject_own,     METH_VARARGS, (char *)"returns/sets ownership of the pointer"},
+  {(char *)"append",  (PyCFunction)SwigPyObject_append,  METH_O,       (char *)"appends another 'this' object"},
+  {(char *)"next",    (PyCFunction)SwigPyObject_next,    METH_NOARGS,  (char *)"returns the next 'this' object"},
+  {(char *)"__repr__",(PyCFunction)SwigPyObject_repr,    METH_NOARGS,  (char *)"returns object representation"},
+  {0, 0, 0, 0}  
+};
+#else
+static PyMethodDef
+swigobject_methods[] = {
+  {(char *)"disown",  (PyCFunction)SwigPyObject_disown,  METH_VARARGS,  (char *)"releases ownership of the pointer"},
+  {(char *)"acquire", (PyCFunction)SwigPyObject_acquire, METH_VARARGS,  (char *)"aquires ownership of the pointer"},
+  {(char *)"own",     (PyCFunction)SwigPyObject_own,     METH_VARARGS,  (char *)"returns/sets ownership of the pointer"},
+  {(char *)"append",  (PyCFunction)SwigPyObject_append,  METH_VARARGS,  (char *)"appends another 'this' object"},
+  {(char *)"next",    (PyCFunction)SwigPyObject_next,    METH_VARARGS,  (char *)"returns the next 'this' object"},
+  {(char *)"__repr__",(PyCFunction)SwigPyObject_repr,   METH_VARARGS,  (char *)"returns object representation"},
+  {0, 0, 0, 0}  
+};
+#endif
+
+#if PY_VERSION_HEX < 0x02020000
+SWIGINTERN PyObject *
+SwigPyObject_getattr(SwigPyObject *sobj,char *name)
+{
+  return Py_FindMethod(swigobject_methods, (PyObject *)sobj, name);
+}
+#endif
+
+SWIGRUNTIME PyTypeObject*
+SwigPyObject_TypeOnce(void) {
+  static char swigobject_doc[] = "Swig object carries a C/C++ instance pointer";
+
+  static PyNumberMethods SwigPyObject_as_number = {
+    (binaryfunc)0, /*nb_add*/
+    (binaryfunc)0, /*nb_subtract*/
+    (binaryfunc)0, /*nb_multiply*/
+    /* nb_divide removed in Python 3 */
+#if PY_VERSION_HEX < 0x03000000
+    (binaryfunc)0, /*nb_divide*/
+#endif
+    (binaryfunc)0, /*nb_remainder*/
+    (binaryfunc)0, /*nb_divmod*/
+    (ternaryfunc)0,/*nb_power*/
+    (unaryfunc)0,  /*nb_negative*/
+    (unaryfunc)0,  /*nb_positive*/
+    (unaryfunc)0,  /*nb_absolute*/
+    (inquiry)0,    /*nb_nonzero*/
+    0,		   /*nb_invert*/
+    0,		   /*nb_lshift*/
+    0,		   /*nb_rshift*/
+    0,		   /*nb_and*/
+    0,		   /*nb_xor*/
+    0,		   /*nb_or*/
+#if PY_VERSION_HEX < 0x03000000
+    0,   /*nb_coerce*/
+#endif
+    (unaryfunc)SwigPyObject_long, /*nb_int*/
+#if PY_VERSION_HEX < 0x03000000
+    (unaryfunc)SwigPyObject_long, /*nb_long*/
+#else
+    0, /*nb_reserved*/
+#endif
+    (unaryfunc)0,                 /*nb_float*/
+#if PY_VERSION_HEX < 0x03000000
+    (unaryfunc)SwigPyObject_oct,  /*nb_oct*/
+    (unaryfunc)SwigPyObject_hex,  /*nb_hex*/
+#endif
+#if PY_VERSION_HEX >= 0x03000000 /* 3.0 */
+    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 /* nb_inplace_add -> nb_index, nb_inplace_divide removed */
+#elif PY_VERSION_HEX >= 0x02050000 /* 2.5.0 */
+    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 /* nb_inplace_add -> nb_index */
+#elif PY_VERSION_HEX >= 0x02020000 /* 2.2.0 */
+    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 /* nb_inplace_add -> nb_inplace_true_divide */
+#elif PY_VERSION_HEX >= 0x02000000 /* 2.0.0 */
+    0,0,0,0,0,0,0,0,0,0,0 /* nb_inplace_add -> nb_inplace_or */
+#endif
+  };
+
+  static PyTypeObject swigpyobject_type;
+  static int type_init = 0;
+  if (!type_init) {
+    const PyTypeObject tmp = {
+      /* PyObject header changed in Python 3 */
+#if PY_VERSION_HEX >= 0x03000000
+      PyVarObject_HEAD_INIT(NULL, 0)
+#else
+      PyObject_HEAD_INIT(NULL)
+      0,                                    /* ob_size */
+#endif
+      (char *)"SwigPyObject",               /* tp_name */
+      sizeof(SwigPyObject),                 /* tp_basicsize */
+      0,                                    /* tp_itemsize */
+      (destructor)SwigPyObject_dealloc,     /* tp_dealloc */
+      (printfunc)SwigPyObject_print,        /* tp_print */
+#if PY_VERSION_HEX < 0x02020000
+      (getattrfunc)SwigPyObject_getattr,    /* tp_getattr */
+#else
+      (getattrfunc)0,                       /* tp_getattr */
+#endif
+      (setattrfunc)0,                       /* tp_setattr */
+#if PY_VERSION_HEX >= 0x03000000
+    0, /* tp_reserved in 3.0.1, tp_compare in 3.0.0 but not used */
+#else
+      (cmpfunc)SwigPyObject_compare,        /* tp_compare */
+#endif
+      (reprfunc)SwigPyObject_repr,          /* tp_repr */
+      &SwigPyObject_as_number,              /* tp_as_number */
+      0,                                    /* tp_as_sequence */
+      0,                                    /* tp_as_mapping */
+      (hashfunc)0,                          /* tp_hash */
+      (ternaryfunc)0,                       /* tp_call */
+      (reprfunc)SwigPyObject_str,           /* tp_str */
+      PyObject_GenericGetAttr,              /* tp_getattro */
+      0,                                    /* tp_setattro */
+      0,                                    /* tp_as_buffer */
+      Py_TPFLAGS_DEFAULT,                   /* tp_flags */
+      swigobject_doc,                       /* tp_doc */
+      0,                                    /* tp_traverse */
+      0,                                    /* tp_clear */
+      (richcmpfunc)SwigPyObject_richcompare,/* tp_richcompare */
+      0,                                    /* tp_weaklistoffset */
+#if PY_VERSION_HEX >= 0x02020000
+      0,                                    /* tp_iter */
+      0,                                    /* tp_iternext */
+      swigobject_methods,                   /* tp_methods */
+      0,                                    /* tp_members */
+      0,                                    /* tp_getset */
+      0,                                    /* tp_base */
+      0,                                    /* tp_dict */
+      0,                                    /* tp_descr_get */
+      0,                                    /* tp_descr_set */
+      0,                                    /* tp_dictoffset */
+      0,                                    /* tp_init */
+      0,                                    /* tp_alloc */
+      0,                                    /* tp_new */
+      0,                                    /* tp_free */
+      0,                                    /* tp_is_gc */
+      0,                                    /* tp_bases */
+      0,                                    /* tp_mro */
+      0,                                    /* tp_cache */
+      0,                                    /* tp_subclasses */
+      0,                                    /* tp_weaklist */
+#endif
+#if PY_VERSION_HEX >= 0x02030000
+      0,                                    /* tp_del */
+#endif
+#if PY_VERSION_HEX >= 0x02060000
+      0,                                    /* tp_version */
+#endif
+#ifdef COUNT_ALLOCS
+      0,0,0,0                               /* tp_alloc -> tp_next */
+#endif
+    };
+    swigpyobject_type = tmp;
+    type_init = 1;
+#if PY_VERSION_HEX < 0x02020000
+    swigpyobject_type.ob_type = &PyType_Type;
+#else
+    if (PyType_Ready(&swigpyobject_type) < 0)
+      return NULL;
+#endif
+  }
+  return &swigpyobject_type;
+}
+
+SWIGRUNTIME PyObject *
+SwigPyObject_New(void *ptr, swig_type_info *ty, int own)
+{
+  SwigPyObject *sobj = PyObject_NEW(SwigPyObject, SwigPyObject_type());
+  if (sobj) {
+    sobj->ptr  = ptr;
+    sobj->ty   = ty;
+    sobj->own  = own;
+    sobj->next = 0;
+  }
+  return (PyObject *)sobj;
+}
+
+/* -----------------------------------------------------------------------------
+ * Implements a simple Swig Packed type, and use it instead of string
+ * ----------------------------------------------------------------------------- */
+
+typedef struct {
+  PyObject_HEAD
+  void *pack;
+  swig_type_info *ty;
+  size_t size;
+} SwigPyPacked;
+
+SWIGRUNTIME int
+SwigPyPacked_print(SwigPyPacked *v, FILE *fp, int SWIGUNUSEDPARM(flags))
+{
+  char result[SWIG_BUFFER_SIZE];
+  fputs("<Swig Packed ", fp); 
+  if (SWIG_PackDataName(result, v->pack, v->size, 0, sizeof(result))) {
+    fputs("at ", fp); 
+    fputs(result, fp); 
+  }
+  fputs(v->ty->name,fp); 
+  fputs(">", fp);
+  return 0; 
+}
+  
+SWIGRUNTIME PyObject *
+SwigPyPacked_repr(SwigPyPacked *v)
+{
+  char result[SWIG_BUFFER_SIZE];
+  if (SWIG_PackDataName(result, v->pack, v->size, 0, sizeof(result))) {
+    return SWIG_Python_str_FromFormat("<Swig Packed at %s%s>", result, v->ty->name);
+  } else {
+    return SWIG_Python_str_FromFormat("<Swig Packed %s>", v->ty->name);
+  }  
+}
+
+SWIGRUNTIME PyObject *
+SwigPyPacked_str(SwigPyPacked *v)
+{
+  char result[SWIG_BUFFER_SIZE];
+  if (SWIG_PackDataName(result, v->pack, v->size, 0, sizeof(result))){
+    return SWIG_Python_str_FromFormat("%s%s", result, v->ty->name);
+  } else {
+    return SWIG_Python_str_FromChar(v->ty->name);
+  }  
+}
+
+SWIGRUNTIME int
+SwigPyPacked_compare(SwigPyPacked *v, SwigPyPacked *w)
+{
+  size_t i = v->size;
+  size_t j = w->size;
+  int s = (i < j) ? -1 : ((i > j) ? 1 : 0);
+  return s ? s : strncmp((char *)v->pack, (char *)w->pack, 2*v->size);
+}
+
+SWIGRUNTIME PyTypeObject* SwigPyPacked_TypeOnce(void);
+
+SWIGRUNTIME PyTypeObject*
+SwigPyPacked_type(void) {
+  static PyTypeObject *SWIG_STATIC_POINTER(type) = SwigPyPacked_TypeOnce();
+  return type;
+}
+
+SWIGRUNTIMEINLINE int
+SwigPyPacked_Check(PyObject *op) {
+  return ((op)->ob_type == SwigPyPacked_TypeOnce()) 
+    || (strcmp((op)->ob_type->tp_name,"SwigPyPacked") == 0);
+}
+
+SWIGRUNTIME void
+SwigPyPacked_dealloc(PyObject *v)
+{
+  if (SwigPyPacked_Check(v)) {
+    SwigPyPacked *sobj = (SwigPyPacked *) v;
+    free(sobj->pack);
+  }
+  PyObject_DEL(v);
+}
+
+SWIGRUNTIME PyTypeObject*
+SwigPyPacked_TypeOnce(void) {
+  static char swigpacked_doc[] = "Swig object carries a C/C++ instance pointer";
+  static PyTypeObject swigpypacked_type;
+  static int type_init = 0;
+  if (!type_init) {
+    const PyTypeObject tmp = {
+      /* PyObject header changed in Python 3 */
+#if PY_VERSION_HEX>=0x03000000
+      PyVarObject_HEAD_INIT(NULL, 0)
+#else
+      PyObject_HEAD_INIT(NULL)
+      0,                                    /* ob_size */
+#endif
+      (char *)"SwigPyPacked",               /* tp_name */
+      sizeof(SwigPyPacked),                 /* tp_basicsize */
+      0,                                    /* tp_itemsize */
+      (destructor)SwigPyPacked_dealloc,     /* tp_dealloc */
+      (printfunc)SwigPyPacked_print,        /* tp_print */
+      (getattrfunc)0,                       /* tp_getattr */
+      (setattrfunc)0,                       /* tp_setattr */
+#if PY_VERSION_HEX>=0x03000000
+      0, /* tp_reserved in 3.0.1 */
+#else
+      (cmpfunc)SwigPyPacked_compare,        /* tp_compare */
+#endif
+      (reprfunc)SwigPyPacked_repr,          /* tp_repr */
+      0,                                    /* tp_as_number */
+      0,                                    /* tp_as_sequence */
+      0,                                    /* tp_as_mapping */
+      (hashfunc)0,                          /* tp_hash */
+      (ternaryfunc)0,                       /* tp_call */
+      (reprfunc)SwigPyPacked_str,           /* tp_str */
+      PyObject_GenericGetAttr,              /* tp_getattro */
+      0,                                    /* tp_setattro */
+      0,                                    /* tp_as_buffer */
+      Py_TPFLAGS_DEFAULT,                   /* tp_flags */
+      swigpacked_doc,                       /* tp_doc */
+      0,                                    /* tp_traverse */
+      0,                                    /* tp_clear */
+      0,                                    /* tp_richcompare */
+      0,                                    /* tp_weaklistoffset */
+#if PY_VERSION_HEX >= 0x02020000
+      0,                                    /* tp_iter */
+      0,                                    /* tp_iternext */
+      0,                                    /* tp_methods */
+      0,                                    /* tp_members */
+      0,                                    /* tp_getset */
+      0,                                    /* tp_base */
+      0,                                    /* tp_dict */
+      0,                                    /* tp_descr_get */
+      0,                                    /* tp_descr_set */
+      0,                                    /* tp_dictoffset */
+      0,                                    /* tp_init */
+      0,                                    /* tp_alloc */
+      0,                                    /* tp_new */
+      0,                                    /* tp_free */
+      0,                                    /* tp_is_gc */
+      0,                                    /* tp_bases */
+      0,                                    /* tp_mro */
+      0,                                    /* tp_cache */
+      0,                                    /* tp_subclasses */
+      0,                                    /* tp_weaklist */
+#endif
+#if PY_VERSION_HEX >= 0x02030000
+      0,                                    /* tp_del */
+#endif
+#if PY_VERSION_HEX >= 0x02060000
+      0,                                    /* tp_version */
+#endif
+#ifdef COUNT_ALLOCS
+      0,0,0,0                               /* tp_alloc -> tp_next */
+#endif
+    };
+    swigpypacked_type = tmp;
+    type_init = 1;
+#if PY_VERSION_HEX < 0x02020000
+    swigpypacked_type.ob_type = &PyType_Type;
+#else
+    if (PyType_Ready(&swigpypacked_type) < 0)
+      return NULL;
+#endif
+  }
+  return &swigpypacked_type;
+}
+
+SWIGRUNTIME PyObject *
+SwigPyPacked_New(void *ptr, size_t size, swig_type_info *ty)
+{
+  SwigPyPacked *sobj = PyObject_NEW(SwigPyPacked, SwigPyPacked_type());
+  if (sobj) {
+    void *pack = malloc(size);
+    if (pack) {
+      memcpy(pack, ptr, size);
+      sobj->pack = pack;
+      sobj->ty   = ty;
+      sobj->size = size;
+    } else {
+      PyObject_DEL((PyObject *) sobj);
+      sobj = 0;
+    }
+  }
+  return (PyObject *) sobj;
+}
+
+SWIGRUNTIME swig_type_info *
+SwigPyPacked_UnpackData(PyObject *obj, void *ptr, size_t size)
+{
+  if (SwigPyPacked_Check(obj)) {
+    SwigPyPacked *sobj = (SwigPyPacked *)obj;
+    if (sobj->size != size) return 0;
+    memcpy(ptr, sobj->pack, size);
+    return sobj->ty;
+  } else {
+    return 0;
+  }
+}
+
+/* -----------------------------------------------------------------------------
+ * pointers/data manipulation
+ * ----------------------------------------------------------------------------- */
+
+SWIGRUNTIMEINLINE PyObject *
+_SWIG_This(void)
+{
+    return SWIG_Python_str_FromChar("this");
+}
+
+static PyObject *swig_this = NULL;
+
+SWIGRUNTIME PyObject *
+SWIG_This(void)
+{
+  if (swig_this == NULL)
+    swig_this = _SWIG_This();
+  return swig_this;
+}
+
+/* #define SWIG_PYTHON_SLOW_GETSET_THIS */
+
+/* TODO: I don't know how to implement the fast getset in Python 3 right now */
+#if PY_VERSION_HEX>=0x03000000
+#define SWIG_PYTHON_SLOW_GETSET_THIS 
+#endif
+
+SWIGRUNTIME SwigPyObject *
+SWIG_Python_GetSwigThis(PyObject *pyobj) 
+{
+  PyObject *obj;
+
+  if (SwigPyObject_Check(pyobj))
+    return (SwigPyObject *) pyobj;
+
+#ifdef SWIGPYTHON_BUILTIN
+  (void)obj;
+# ifdef PyWeakref_CheckProxy
+  if (PyWeakref_CheckProxy(pyobj)) {
+    pyobj = PyWeakref_GET_OBJECT(pyobj);
+    if (pyobj && SwigPyObject_Check(pyobj))
+      return (SwigPyObject*) pyobj;
+  }
+# endif
+  return NULL;
+#else
+
+  obj = 0;
+
+#if (!defined(SWIG_PYTHON_SLOW_GETSET_THIS) && (PY_VERSION_HEX >= 0x02030000))
+  if (PyInstance_Check(pyobj)) {
+    obj = _PyInstance_Lookup(pyobj, SWIG_This());      
+  } else {
+    PyObject **dictptr = _PyObject_GetDictPtr(pyobj);
+    if (dictptr != NULL) {
+      PyObject *dict = *dictptr;
+      obj = dict ? PyDict_GetItem(dict, SWIG_This()) : 0;
+    } else {
+#ifdef PyWeakref_CheckProxy
+      if (PyWeakref_CheckProxy(pyobj)) {
+	PyObject *wobj = PyWeakref_GET_OBJECT(pyobj);
+	return wobj ? SWIG_Python_GetSwigThis(wobj) : 0;
+      }
+#endif
+      obj = PyObject_GetAttr(pyobj,SWIG_This());
+      if (obj) {
+	Py_DECREF(obj);
+      } else {
+	if (PyErr_Occurred()) PyErr_Clear();
+	return 0;
+      }
+    }
+  }
+#else
+  obj = PyObject_GetAttr(pyobj,SWIG_This());
+  if (obj) {
+    Py_DECREF(obj);
+  } else {
+    if (PyErr_Occurred()) PyErr_Clear();
+    return 0;
+  }
+#endif
+  if (obj && !SwigPyObject_Check(obj)) {
+    /* a PyObject is called 'this', try to get the 'real this'
+       SwigPyObject from it */ 
+    return SWIG_Python_GetSwigThis(obj);
+  }
+  return (SwigPyObject *)obj;
+#endif
+}
+
+/* Acquire a pointer value */
+
+SWIGRUNTIME int
+SWIG_Python_AcquirePtr(PyObject *obj, int own) {
+  if (own == SWIG_POINTER_OWN) {
+    SwigPyObject *sobj = SWIG_Python_GetSwigThis(obj);
+    if (sobj) {
+      int oldown = sobj->own;
+      sobj->own = own;
+      return oldown;
+    }
+  }
+  return 0;
+}
+
+/* Convert a pointer value */
+
+SWIGRUNTIME int
+SWIG_Python_ConvertPtrAndOwn(PyObject *obj, void **ptr, swig_type_info *ty, int flags, int *own) {
+  int res;
+  SwigPyObject *sobj;
+
+  if (!obj)
+    return SWIG_ERROR;
+  if (obj == Py_None) {
+    if (ptr)
+      *ptr = 0;
+    return SWIG_OK;
+  }
+
+  res = SWIG_ERROR;
+
+  sobj = SWIG_Python_GetSwigThis(obj);
+  if (own)
+    *own = 0;
+  while (sobj) {
+    void *vptr = sobj->ptr;
+    if (ty) {
+      swig_type_info *to = sobj->ty;
+      if (to == ty) {
+        /* no type cast needed */
+        if (ptr) *ptr = vptr;
+        break;
+      } else {
+        swig_cast_info *tc = SWIG_TypeCheck(to->name,ty);
+        if (!tc) {
+          sobj = (SwigPyObject *)sobj->next;
+        } else {
+          if (ptr) {
+            int newmemory = 0;
+            *ptr = SWIG_TypeCast(tc,vptr,&newmemory);
+            if (newmemory == SWIG_CAST_NEW_MEMORY) {
+              assert(own); /* badly formed typemap which will lead to a memory leak - it must set and use own to delete *ptr */
+              if (own)
+                *own = *own | SWIG_CAST_NEW_MEMORY;
+            }
+          }
+          break;
+        }
+      }
+    } else {
+      if (ptr) *ptr = vptr;
+      break;
+    }
+  }
+  if (sobj) {
+    if (own)
+      *own = *own | sobj->own;
+    if (flags & SWIG_POINTER_DISOWN) {
+      sobj->own = 0;
+    }
+    res = SWIG_OK;
+  } else {
+    if (flags & SWIG_POINTER_IMPLICIT_CONV) {
+      SwigPyClientData *data = ty ? (SwigPyClientData *) ty->clientdata : 0;
+      if (data && !data->implicitconv) {
+        PyObject *klass = data->klass;
+        if (klass) {
+          PyObject *impconv;
+          data->implicitconv = 1; /* avoid recursion and call 'explicit' constructors*/
+          impconv = SWIG_Python_CallFunctor(klass, obj);
+          data->implicitconv = 0;
+          if (PyErr_Occurred()) {
+            PyErr_Clear();
+            impconv = 0;
+          }
+          if (impconv) {
+            SwigPyObject *iobj = SWIG_Python_GetSwigThis(impconv);
+            if (iobj) {
+              void *vptr;
+              res = SWIG_Python_ConvertPtrAndOwn((PyObject*)iobj, &vptr, ty, 0, 0);
+              if (SWIG_IsOK(res)) {
+                if (ptr) {
+                  *ptr = vptr;
+                  /* transfer the ownership to 'ptr' */
+                  iobj->own = 0;
+                  res = SWIG_AddCast(res);
+                  res = SWIG_AddNewMask(res);
+                } else {
+                  res = SWIG_AddCast(res);		    
+                }
+              }
+            }
+            Py_DECREF(impconv);
+          }
+        }
+      }
+    }
+  }
+  return res;
+}
+
+/* Convert a function ptr value */
+
+SWIGRUNTIME int
+SWIG_Python_ConvertFunctionPtr(PyObject *obj, void **ptr, swig_type_info *ty) {
+  if (!PyCFunction_Check(obj)) {
+    return SWIG_ConvertPtr(obj, ptr, ty, 0);
+  } else {
+    void *vptr = 0;
+    
+    /* here we get the method pointer for callbacks */
+    const char *doc = (((PyCFunctionObject *)obj) -> m_ml -> ml_doc);
+    const char *desc = doc ? strstr(doc, "swig_ptr: ") : 0;
+    if (desc)
+      desc = ty ? SWIG_UnpackVoidPtr(desc + 10, &vptr, ty->name) : 0;
+    if (!desc) 
+      return SWIG_ERROR;
+    if (ty) {
+      swig_cast_info *tc = SWIG_TypeCheck(desc,ty);
+      if (tc) {
+        int newmemory = 0;
+        *ptr = SWIG_TypeCast(tc,vptr,&newmemory);
+        assert(!newmemory); /* newmemory handling not yet implemented */
+      } else {
+        return SWIG_ERROR;
+      }
+    } else {
+      *ptr = vptr;
+    }
+    return SWIG_OK;
+  }
+}
+
+/* Convert a packed value value */
+
+SWIGRUNTIME int
+SWIG_Python_ConvertPacked(PyObject *obj, void *ptr, size_t sz, swig_type_info *ty) {
+  swig_type_info *to = SwigPyPacked_UnpackData(obj, ptr, sz);
+  if (!to) return SWIG_ERROR;
+  if (ty) {
+    if (to != ty) {
+      /* check type cast? */
+      swig_cast_info *tc = SWIG_TypeCheck(to->name,ty);
+      if (!tc) return SWIG_ERROR;
+    }
+  }
+  return SWIG_OK;
+}  
+
+/* -----------------------------------------------------------------------------
+ * Create a new pointer object
+ * ----------------------------------------------------------------------------- */
+
+/*
+  Create a new instance object, without calling __init__, and set the
+  'this' attribute.
+*/
+
+SWIGRUNTIME PyObject* 
+SWIG_Python_NewShadowInstance(SwigPyClientData *data, PyObject *swig_this)
+{
+#if (PY_VERSION_HEX >= 0x02020000)
+  PyObject *inst = 0;
+  PyObject *newraw = data->newraw;
+  if (newraw) {
+    inst = PyObject_Call(newraw, data->newargs, NULL);
+    if (inst) {
+#if !defined(SWIG_PYTHON_SLOW_GETSET_THIS)
+      PyObject **dictptr = _PyObject_GetDictPtr(inst);
+      if (dictptr != NULL) {
+	PyObject *dict = *dictptr;
+	if (dict == NULL) {
+	  dict = PyDict_New();
+	  *dictptr = dict;
+	  PyDict_SetItem(dict, SWIG_This(), swig_this);
+	}
+      }
+#else
+      PyObject *key = SWIG_This();
+      PyObject_SetAttr(inst, key, swig_this);
+#endif
+    }
+  } else {
+#if PY_VERSION_HEX >= 0x03000000
+    inst = PyBaseObject_Type.tp_new((PyTypeObject*) data->newargs, Py_None, Py_None);
+    PyObject_SetAttr(inst, SWIG_This(), swig_this);
+    Py_TYPE(inst)->tp_flags &= ~Py_TPFLAGS_VALID_VERSION_TAG;
+#else
+    PyObject *dict = PyDict_New();
+    PyDict_SetItem(dict, SWIG_This(), swig_this);
+    inst = PyInstance_NewRaw(data->newargs, dict);
+    Py_DECREF(dict);
+#endif
+  }
+  return inst;
+#else
+#if (PY_VERSION_HEX >= 0x02010000)
+  PyObject *inst;
+  PyObject *dict = PyDict_New();
+  PyDict_SetItem(dict, SWIG_This(), swig_this);
+  inst = PyInstance_NewRaw(data->newargs, dict);
+  Py_DECREF(dict);
+  return (PyObject *) inst;
+#else
+  PyInstanceObject *inst = PyObject_NEW(PyInstanceObject, &PyInstance_Type);
+  if (inst == NULL) {
+    return NULL;
+  }
+  inst->in_class = (PyClassObject *)data->newargs;
+  Py_INCREF(inst->in_class);
+  inst->in_dict = PyDict_New();
+  if (inst->in_dict == NULL) {
+    Py_DECREF(inst);
+    return NULL;
+  }
+#ifdef Py_TPFLAGS_HAVE_WEAKREFS
+  inst->in_weakreflist = NULL;
+#endif
+#ifdef Py_TPFLAGS_GC
+  PyObject_GC_Init(inst);
+#endif
+  PyDict_SetItem(inst->in_dict, SWIG_This(), swig_this);
+  return (PyObject *) inst;
+#endif
+#endif
+}
+
+SWIGRUNTIME void
+SWIG_Python_SetSwigThis(PyObject *inst, PyObject *swig_this)
+{
+ PyObject *dict;
+#if (PY_VERSION_HEX >= 0x02020000) && !defined(SWIG_PYTHON_SLOW_GETSET_THIS)
+ PyObject **dictptr = _PyObject_GetDictPtr(inst);
+ if (dictptr != NULL) {
+   dict = *dictptr;
+   if (dict == NULL) {
+     dict = PyDict_New();
+     *dictptr = dict;
+   }
+   PyDict_SetItem(dict, SWIG_This(), swig_this);
+   return;
+ }
+#endif
+ dict = PyObject_GetAttrString(inst, (char*)"__dict__");
+ PyDict_SetItem(dict, SWIG_This(), swig_this);
+ Py_DECREF(dict);
+} 
+
+
+SWIGINTERN PyObject *
+SWIG_Python_InitShadowInstance(PyObject *args) {
+  PyObject *obj[2];
+  if (!SWIG_Python_UnpackTuple(args,(char*)"swiginit", 2, 2, obj)) {
+    return NULL;
+  } else {
+    SwigPyObject *sthis = SWIG_Python_GetSwigThis(obj[0]);
+    if (sthis) {
+      SwigPyObject_append((PyObject*) sthis, obj[1]);
+    } else {
+      SWIG_Python_SetSwigThis(obj[0], obj[1]);
+    }
+    return SWIG_Py_Void();
+  }
+}
+
+/* Create a new pointer object */
+
+SWIGRUNTIME PyObject *
+SWIG_Python_NewPointerObj(PyObject *self, void *ptr, swig_type_info *type, int flags) {
+  SwigPyClientData *clientdata;
+  PyObject * robj;
+  int own;
+
+  if (!ptr)
+    return SWIG_Py_Void();
+
+  clientdata = type ? (SwigPyClientData *)(type->clientdata) : 0;
+  own = (flags & SWIG_POINTER_OWN) ? SWIG_POINTER_OWN : 0;
+  if (clientdata && clientdata->pytype) {
+    SwigPyObject *newobj;
+    if (flags & SWIG_BUILTIN_TP_INIT) {
+      newobj = (SwigPyObject*) self;
+      if (newobj->ptr) {
+        PyObject *next_self = clientdata->pytype->tp_alloc(clientdata->pytype, 0);
+        while (newobj->next)
+	  newobj = (SwigPyObject *) newobj->next;
+        newobj->next = next_self;
+        newobj = (SwigPyObject *)next_self;
+      }
+    } else {
+      newobj = PyObject_New(SwigPyObject, clientdata->pytype);
+    }
+    if (newobj) {
+      newobj->ptr = ptr;
+      newobj->ty = type;
+      newobj->own = own;
+      newobj->next = 0;
+#ifdef SWIGPYTHON_BUILTIN
+      newobj->dict = 0;
+#endif
+      return (PyObject*) newobj;
+    }
+    return SWIG_Py_Void();
+  }
+
+  assert(!(flags & SWIG_BUILTIN_TP_INIT));
+
+  robj = SwigPyObject_New(ptr, type, own);
+  if (clientdata && !(flags & SWIG_POINTER_NOSHADOW)) {
+    PyObject *inst = SWIG_Python_NewShadowInstance(clientdata, robj);
+    if (inst) {
+      Py_DECREF(robj);
+      robj = inst;
+    }
+  }
+  return robj;
+}
+
+/* Create a new packed object */
+
+SWIGRUNTIMEINLINE PyObject *
+SWIG_Python_NewPackedObj(void *ptr, size_t sz, swig_type_info *type) {
+  return ptr ? SwigPyPacked_New((void *) ptr, sz, type) : SWIG_Py_Void();
+}
+
+/* -----------------------------------------------------------------------------*
+ *  Get type list 
+ * -----------------------------------------------------------------------------*/
+
+#ifdef SWIG_LINK_RUNTIME
+void *SWIG_ReturnGlobalTypeList(void *);
+#endif
+
+SWIGRUNTIME swig_module_info *
+SWIG_Python_GetModule(void) {
+  static void *type_pointer = (void *)0;
+  /* first check if module already created */
+  if (!type_pointer) {
+#ifdef SWIG_LINK_RUNTIME
+    type_pointer = SWIG_ReturnGlobalTypeList((void *)0);
+#else
+# ifdef SWIGPY_USE_CAPSULE
+    type_pointer = PyCapsule_Import(SWIGPY_CAPSULE_NAME, 0);
+# else
+    type_pointer = PyCObject_Import((char*)"swig_runtime_data" SWIG_RUNTIME_VERSION,
+				    (char*)"type_pointer" SWIG_TYPE_TABLE_NAME);
+# endif
+    if (PyErr_Occurred()) {
+      PyErr_Clear();
+      type_pointer = (void *)0;
+    }
+#endif
+  }
+  return (swig_module_info *) type_pointer;
+}
+
+#if PY_MAJOR_VERSION < 2
+/* PyModule_AddObject function was introduced in Python 2.0.  The following function
+   is copied out of Python/modsupport.c in python version 2.3.4 */
+SWIGINTERN int
+PyModule_AddObject(PyObject *m, char *name, PyObject *o)
+{
+  PyObject *dict;
+  if (!PyModule_Check(m)) {
+    PyErr_SetString(PyExc_TypeError,
+		    "PyModule_AddObject() needs module as first arg");
+    return SWIG_ERROR;
+  }
+  if (!o) {
+    PyErr_SetString(PyExc_TypeError,
+		    "PyModule_AddObject() needs non-NULL value");
+    return SWIG_ERROR;
+  }
+  
+  dict = PyModule_GetDict(m);
+  if (dict == NULL) {
+    /* Internal error -- modules must have a dict! */
+    PyErr_Format(PyExc_SystemError, "module '%s' has no __dict__",
+		 PyModule_GetName(m));
+    return SWIG_ERROR;
+  }
+  if (PyDict_SetItemString(dict, name, o))
+    return SWIG_ERROR;
+  Py_DECREF(o);
+  return SWIG_OK;
+}
+#endif
+
+SWIGRUNTIME void
+#ifdef SWIGPY_USE_CAPSULE
+SWIG_Python_DestroyModule(PyObject *obj)
+#else
+SWIG_Python_DestroyModule(void *vptr)
+#endif
+{
+#ifdef SWIGPY_USE_CAPSULE
+  swig_module_info *swig_module = (swig_module_info *) PyCapsule_GetPointer(obj, SWIGPY_CAPSULE_NAME);
+#else
+  swig_module_info *swig_module = (swig_module_info *) vptr;
+#endif
+  swig_type_info **types = swig_module->types;
+  size_t i;
+  for (i =0; i < swig_module->size; ++i) {
+    swig_type_info *ty = types[i];
+    if (ty->owndata) {
+      SwigPyClientData *data = (SwigPyClientData *) ty->clientdata;
+      if (data) SwigPyClientData_Del(data);
+    }
+  }
+  Py_DECREF(SWIG_This());
+  swig_this = NULL;
+}
+
+SWIGRUNTIME void
+SWIG_Python_SetModule(swig_module_info *swig_module) {
+#if PY_VERSION_HEX >= 0x03000000
+ /* Add a dummy module object into sys.modules */
+  PyObject *module = PyImport_AddModule((char*)"swig_runtime_data" SWIG_RUNTIME_VERSION);
+#else
+  static PyMethodDef swig_empty_runtime_method_table[] = { {NULL, NULL, 0, NULL} }; /* Sentinel */
+  PyObject *module = Py_InitModule((char*)"swig_runtime_data" SWIG_RUNTIME_VERSION, swig_empty_runtime_method_table);
+#endif
+#ifdef SWIGPY_USE_CAPSULE
+  PyObject *pointer = PyCapsule_New((void *) swig_module, SWIGPY_CAPSULE_NAME, SWIG_Python_DestroyModule);
+  if (pointer && module) {
+    PyModule_AddObject(module, (char*)"type_pointer_capsule" SWIG_TYPE_TABLE_NAME, pointer);
+  } else {
+    Py_XDECREF(pointer);
+  }
+#else
+  PyObject *pointer = PyCObject_FromVoidPtr((void *) swig_module, SWIG_Python_DestroyModule);
+  if (pointer && module) {
+    PyModule_AddObject(module, (char*)"type_pointer" SWIG_TYPE_TABLE_NAME, pointer);
+  } else {
+    Py_XDECREF(pointer);
+  }
+#endif
+}
+
+/* The python cached type query */
+SWIGRUNTIME PyObject *
+SWIG_Python_TypeCache(void) {
+  static PyObject *SWIG_STATIC_POINTER(cache) = PyDict_New();
+  return cache;
+}
+
+SWIGRUNTIME swig_type_info *
+SWIG_Python_TypeQuery(const char *type)
+{
+  PyObject *cache = SWIG_Python_TypeCache();
+  PyObject *key = SWIG_Python_str_FromChar(type); 
+  PyObject *obj = PyDict_GetItem(cache, key);
+  swig_type_info *descriptor;
+  if (obj) {
+#ifdef SWIGPY_USE_CAPSULE
+    descriptor = (swig_type_info *) PyCapsule_GetPointer(obj, NULL);
+#else
+    descriptor = (swig_type_info *) PyCObject_AsVoidPtr(obj);
+#endif
+  } else {
+    swig_module_info *swig_module = SWIG_Python_GetModule();
+    descriptor = SWIG_TypeQueryModule(swig_module, swig_module, type);
+    if (descriptor) {
+#ifdef SWIGPY_USE_CAPSULE
+      obj = PyCapsule_New((void*) descriptor, NULL, NULL);
+#else
+      obj = PyCObject_FromVoidPtr(descriptor, NULL);
+#endif
+      PyDict_SetItem(cache, key, obj);
+      Py_DECREF(obj);
+    }
+  }
+  Py_DECREF(key);
+  return descriptor;
+}
+
+/* 
+   For backward compatibility only
+*/
+#define SWIG_POINTER_EXCEPTION  0
+#define SWIG_arg_fail(arg)      SWIG_Python_ArgFail(arg)
+#define SWIG_MustGetPtr(p, type, argnum, flags)  SWIG_Python_MustGetPtr(p, type, argnum, flags)
+
+SWIGRUNTIME int
+SWIG_Python_AddErrMesg(const char* mesg, int infront)
+{  
+  if (PyErr_Occurred()) {
+    PyObject *type = 0;
+    PyObject *value = 0;
+    PyObject *traceback = 0;
+    PyErr_Fetch(&type, &value, &traceback);
+    if (value) {
+      char *tmp;
+      PyObject *old_str = PyObject_Str(value);
+      Py_XINCREF(type);
+      PyErr_Clear();
+      if (infront) {
+	PyErr_Format(type, "%s %s", mesg, tmp = SWIG_Python_str_AsChar(old_str));
+      } else {
+	PyErr_Format(type, "%s %s", tmp = SWIG_Python_str_AsChar(old_str), mesg);
+      }
+      SWIG_Python_str_DelForPy3(tmp);
+      Py_DECREF(old_str);
+    }
+    return 1;
+  } else {
+    return 0;
+  }
+}
+  
+SWIGRUNTIME int
+SWIG_Python_ArgFail(int argnum)
+{
+  if (PyErr_Occurred()) {
+    /* add information about failing argument */
+    char mesg[256];
+    PyOS_snprintf(mesg, sizeof(mesg), "argument number %d:", argnum);
+    return SWIG_Python_AddErrMesg(mesg, 1);
+  } else {
+    return 0;
+  }
+}
+
+SWIGRUNTIMEINLINE const char *
+SwigPyObject_GetDesc(PyObject *self)
+{
+  SwigPyObject *v = (SwigPyObject *)self;
+  swig_type_info *ty = v ? v->ty : 0;
+  return ty ? ty->str : (char*)"";
+}
+
+SWIGRUNTIME void
+SWIG_Python_TypeError(const char *type, PyObject *obj)
+{
+  if (type) {
+#if defined(SWIG_COBJECT_TYPES)
+    if (obj && SwigPyObject_Check(obj)) {
+      const char *otype = (const char *) SwigPyObject_GetDesc(obj);
+      if (otype) {
+	PyErr_Format(PyExc_TypeError, "a '%s' is expected, 'SwigPyObject(%s)' is received",
+		     type, otype);
+	return;
+      }
+    } else 
+#endif      
+    {
+      const char *otype = (obj ? obj->ob_type->tp_name : 0); 
+      if (otype) {
+	PyObject *str = PyObject_Str(obj);
+	const char *cstr = str ? SWIG_Python_str_AsChar(str) : 0;
+	if (cstr) {
+	  PyErr_Format(PyExc_TypeError, "a '%s' is expected, '%s(%s)' is received",
+		       type, otype, cstr);
+          SWIG_Python_str_DelForPy3(cstr);
+	} else {
+	  PyErr_Format(PyExc_TypeError, "a '%s' is expected, '%s' is received",
+		       type, otype);
+	}
+	Py_XDECREF(str);
+	return;
+      }
+    }   
+    PyErr_Format(PyExc_TypeError, "a '%s' is expected", type);
+  } else {
+    PyErr_Format(PyExc_TypeError, "unexpected type is received");
+  }
+}
+
+
+/* Convert a pointer value, signal an exception on a type mismatch */
+SWIGRUNTIME void *
+SWIG_Python_MustGetPtr(PyObject *obj, swig_type_info *ty, int SWIGUNUSEDPARM(argnum), int flags) {
+  void *result;
+  if (SWIG_Python_ConvertPtr(obj, &result, ty, flags) == -1) {
+    PyErr_Clear();
+#if SWIG_POINTER_EXCEPTION
+    if (flags) {
+      SWIG_Python_TypeError(SWIG_TypePrettyName(ty), obj);
+      SWIG_Python_ArgFail(argnum);
+    }
+#endif
+  }
+  return result;
+}
+
+SWIGRUNTIME int
+SWIG_Python_NonDynamicSetAttr(PyObject *obj, PyObject *name, PyObject *value) {
+  PyTypeObject *tp = obj->ob_type;
+  PyObject *descr;
+  PyObject *encoded_name;
+  descrsetfunc f;
+  int res;
+
+#ifdef Py_USING_UNICODE
+  if (PyString_Check(name)) {
+    name = PyUnicode_Decode(PyString_AsString(name), PyString_Size(name), NULL, NULL);
+    if (!name)
+      return -1;
+  } else if (!PyUnicode_Check(name))
+#else
+  if (!PyString_Check(name))
+#endif
+  {
+    PyErr_Format(PyExc_TypeError, "attribute name must be string, not '%.200s'", name->ob_type->tp_name);
+    return -1;
+  } else {
+    Py_INCREF(name);
+  }
+
+  if (!tp->tp_dict) {
+    if (PyType_Ready(tp) < 0)
+      goto done;
+  }
+
+  res = -1;
+  descr = _PyType_Lookup(tp, name);
+  f = NULL;
+  if (descr != NULL)
+    f = descr->ob_type->tp_descr_set;
+  if (!f) {
+    if (PyString_Check(name)) {
+      encoded_name = name;
+      Py_INCREF(name);
+    } else {
+      encoded_name = PyUnicode_AsUTF8String(name);
+    }
+    PyErr_Format(PyExc_AttributeError, "'%.100s' object has no attribute '%.200s'", tp->tp_name, PyString_AsString(encoded_name));
+    Py_DECREF(encoded_name);
+  } else {
+    res = f(descr, obj, value);
+  }
+  
+  done:
+  Py_DECREF(name);
+  return res;
+}
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#define SWIGPY_UNARYFUNC_CLOSURE(wrapper)	\
+SWIGINTERN PyObject *				\
+wrapper##_closure(PyObject *a) {		\
+  return wrapper(a, NULL);			\
+}
+
+#define SWIGPY_DESTRUCTOR_CLOSURE(wrapper)	\
+SWIGINTERN void					\
+wrapper##_closure(PyObject *a) {		\
+    SwigPyObject *sobj;				\
+    sobj = (SwigPyObject *)a;			\
+    if (sobj->own) {				\
+	PyObject *o = wrapper(a, NULL);		\
+	Py_XDECREF(o);				\
+    }						\
+}
+
+#define SWIGPY_INQUIRY_CLOSURE(wrapper)				\
+SWIGINTERN int							\
+wrapper##_closure(PyObject *a) {				\
+    PyObject *pyresult;						\
+    int result;							\
+    pyresult = wrapper(a, NULL);				\
+    result = pyresult && PyObject_IsTrue(pyresult) ? 1 : 0;	\
+    Py_XDECREF(pyresult);					\
+    return result;						\
+}
+
+#define SWIGPY_BINARYFUNC_CLOSURE(wrapper)	\
+SWIGINTERN PyObject *				\
+wrapper##_closure(PyObject *a, PyObject *b) {	\
+    PyObject *tuple, *result;			\
+    tuple = PyTuple_New(1);			\
+    assert(tuple);				\
+    PyTuple_SET_ITEM(tuple, 0, b);		\
+    Py_XINCREF(b);				\
+    result = wrapper(a, tuple);			\
+    Py_DECREF(tuple);				\
+    return result;				\
+}
+
+#define SWIGPY_TERNARYFUNC_CLOSURE(wrapper)			\
+SWIGINTERN PyObject *						\
+wrapper##_closure(PyObject *a, PyObject *b, PyObject *c) {	\
+    PyObject *tuple, *result;					\
+    tuple = PyTuple_New(2);					\
+    assert(tuple);						\
+    PyTuple_SET_ITEM(tuple, 0, b);				\
+    PyTuple_SET_ITEM(tuple, 1, c);				\
+    Py_XINCREF(b);						\
+    Py_XINCREF(c);						\
+    result = wrapper(a, tuple);					\
+    Py_DECREF(tuple);						\
+    return result;						\
+}
+
+#define SWIGPY_LENFUNC_CLOSURE(wrapper)			\
+SWIGINTERN Py_ssize_t					\
+wrapper##_closure(PyObject *a) {			\
+    PyObject *resultobj;				\
+    Py_ssize_t result;					\
+    resultobj = wrapper(a, NULL);			\
+    result = PyNumber_AsSsize_t(resultobj, NULL);	\
+    Py_DECREF(resultobj);				\
+    return result;					\
+}
+
+#define SWIGPY_SSIZESSIZEARGFUNC_CLOSURE(wrapper)		\
+SWIGINTERN PyObject *						\
+wrapper##_closure(PyObject *a, Py_ssize_t b, Py_ssize_t c) {	\
+    PyObject *tuple, *result;					\
+    tuple = PyTuple_New(2);					\
+    assert(tuple);						\
+    PyTuple_SET_ITEM(tuple, 0, _PyLong_FromSsize_t(b));		\
+    PyTuple_SET_ITEM(tuple, 1, _PyLong_FromSsize_t(c));		\
+    result = wrapper(a, tuple);					\
+    Py_DECREF(tuple);						\
+    return result;						\
+}
+
+#define SWIGPY_SSIZESSIZEOBJARGPROC_CLOSURE(wrapper)			\
+SWIGINTERN int								\
+wrapper##_closure(PyObject *a, Py_ssize_t b, Py_ssize_t c, PyObject *d) { \
+    PyObject *tuple, *resultobj;					\
+    int result;								\
+    tuple = PyTuple_New(d ? 3 : 2);					\
+    assert(tuple);							\
+    PyTuple_SET_ITEM(tuple, 0, _PyLong_FromSsize_t(b));			\
+    PyTuple_SET_ITEM(tuple, 1, _PyLong_FromSsize_t(c));			\
+    if (d) {								\
+        PyTuple_SET_ITEM(tuple, 2, d);					\
+        Py_INCREF(d);							\
+    }									\
+    resultobj = wrapper(a, tuple);					\
+    result = resultobj ? 0 : -1;					\
+    Py_DECREF(tuple);							\
+    Py_XDECREF(resultobj);						\
+    return result;							\
+}
+
+#define SWIGPY_SSIZEARGFUNC_CLOSURE(wrapper)		\
+SWIGINTERN PyObject *					\
+wrapper##_closure(PyObject *a, Py_ssize_t b) {		\
+    PyObject *tuple, *result;				\
+    tuple = PyTuple_New(1);				\
+    assert(tuple);					\
+    PyTuple_SET_ITEM(tuple, 0, _PyLong_FromSsize_t(b));	\
+    result = wrapper(a, tuple);				\
+    Py_DECREF(tuple);					\
+    return result;					\
+}
+
+#define SWIGPY_FUNPACK_SSIZEARGFUNC_CLOSURE(wrapper)		\
+SWIGINTERN PyObject *					\
+wrapper##_closure(PyObject *a, Py_ssize_t b) {		\
+    PyObject *arg, *result;				\
+    arg = _PyLong_FromSsize_t(b);			\
+    result = wrapper(a, arg);				\
+    Py_DECREF(arg);					\
+    return result;					\
+}
+
+#define SWIGPY_SSIZEOBJARGPROC_CLOSURE(wrapper)			\
+SWIGINTERN int							\
+wrapper##_closure(PyObject *a, Py_ssize_t b, PyObject *c) {	\
+    PyObject *tuple, *resultobj;				\
+    int result;							\
+    tuple = PyTuple_New(2);					\
+    assert(tuple);						\
+    PyTuple_SET_ITEM(tuple, 0, _PyLong_FromSsize_t(b));		\
+    PyTuple_SET_ITEM(tuple, 1, c);				\
+    Py_XINCREF(c);						\
+    resultobj = wrapper(a, tuple);				\
+    result = resultobj ? 0 : -1;				\
+    Py_XDECREF(resultobj);					\
+    Py_DECREF(tuple);						\
+    return result;						\
+}
+
+#define SWIGPY_OBJOBJARGPROC_CLOSURE(wrapper)			\
+SWIGINTERN int							\
+wrapper##_closure(PyObject *a, PyObject *b, PyObject *c) {	\
+    PyObject *tuple, *resultobj;				\
+    int result;							\
+    tuple = PyTuple_New(c ? 2 : 1);				\
+    assert(tuple);						\
+    PyTuple_SET_ITEM(tuple, 0, b);				\
+    Py_XINCREF(b);						\
+    if (c) {							\
+        PyTuple_SET_ITEM(tuple, 1, c);				\
+        Py_XINCREF(c);						\
+    }								\
+    resultobj = wrapper(a, tuple);				\
+    result = resultobj ? 0 : -1;				\
+    Py_XDECREF(resultobj);					\
+    Py_DECREF(tuple);						\
+    return result;						\
+}
+
+#define SWIGPY_REPRFUNC_CLOSURE(wrapper)	\
+SWIGINTERN PyObject *				\
+wrapper##_closure(PyObject *a) {		\
+    return wrapper(a, NULL);			\
+}
+
+#define SWIGPY_HASHFUNC_CLOSURE(wrapper)	\
+SWIGINTERN long					\
+wrapper##_closure(PyObject *a) {		\
+    PyObject *pyresult;				\
+    long result;				\
+    pyresult = wrapper(a, NULL);		\
+    if (!pyresult || !PyLong_Check(pyresult))	\
+	return -1;				\
+    result = PyLong_AsLong(pyresult);		\
+    Py_DECREF(pyresult);			\
+    return result;				\
+}
+
+#define SWIGPY_ITERNEXT_CLOSURE(wrapper)	\
+SWIGINTERN PyObject *				\
+wrapper##_closure(PyObject *a) {		\
+    PyObject *result;				\
+    result = wrapper(a, NULL);			\
+    if (result && result == Py_None) {		\
+	Py_DECREF(result);			\
+	result = NULL;				\
+    }						\
+    return result;				\
+}
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+SWIGINTERN int
+SwigPyBuiltin_BadInit(PyObject *self, PyObject *SWIGUNUSEDPARM(args), PyObject *SWIGUNUSEDPARM(kwds)) {
+  PyErr_Format(PyExc_TypeError, "Cannot create new instances of type '%.300s'", self->ob_type->tp_name);
+  return -1;
+}
+
+SWIGINTERN void
+SwigPyBuiltin_BadDealloc(PyObject *pyobj) {
+  SwigPyObject *sobj;
+  sobj = (SwigPyObject *)pyobj;
+  if (sobj->own) {
+    PyErr_Format(PyExc_TypeError, "Swig detected a memory leak in type '%.300s': no callable destructor found.", pyobj->ob_type->tp_name);
+  }
+}
+
+typedef struct {
+  PyCFunction get;
+  PyCFunction set;
+} SwigPyGetSet;
+
+SWIGINTERN PyObject *
+SwigPyBuiltin_GetterClosure (PyObject *obj, void *closure) {
+  SwigPyGetSet *getset;
+  PyObject *tuple, *result;
+  if (!closure)
+    return SWIG_Py_Void();
+  getset = (SwigPyGetSet *)closure;
+  if (!getset->get)
+    return SWIG_Py_Void();
+  tuple = PyTuple_New(0);
+  assert(tuple);
+  result = (*getset->get)(obj, tuple);
+  Py_DECREF(tuple);
+  return result;
+}
+
+SWIGINTERN PyObject *
+SwigPyBuiltin_FunpackGetterClosure (PyObject *obj, void *closure) {
+  SwigPyGetSet *getset;
+  PyObject *result;
+  if (!closure)
+    return SWIG_Py_Void();
+  getset = (SwigPyGetSet *)closure;
+  if (!getset->get)
+    return SWIG_Py_Void();
+  result = (*getset->get)(obj, NULL);
+  return result;
+}
+
+SWIGINTERN int
+SwigPyBuiltin_SetterClosure (PyObject *obj, PyObject *val, void *closure) {
+  SwigPyGetSet *getset;
+  PyObject *tuple, *result;
+  if (!closure) {
+    PyErr_Format(PyExc_TypeError, "Missing getset closure");
+    return -1;
+  }
+  getset = (SwigPyGetSet *)closure;
+  if (!getset->set) {
+    PyErr_Format(PyExc_TypeError, "Illegal member variable assignment in type '%.300s'", obj->ob_type->tp_name);
+    return -1;
+  }
+  tuple = PyTuple_New(1);
+  assert(tuple);
+  PyTuple_SET_ITEM(tuple, 0, val);
+  Py_XINCREF(val);
+  result = (*getset->set)(obj, tuple);
+  Py_DECREF(tuple);
+  Py_XDECREF(result);
+  return result ? 0 : -1;
+}
+
+SWIGINTERN int
+SwigPyBuiltin_FunpackSetterClosure (PyObject *obj, PyObject *val, void *closure) {
+  SwigPyGetSet *getset;
+  PyObject *result;
+  if (!closure) {
+    PyErr_Format(PyExc_TypeError, "Missing getset closure");
+    return -1;
+  }
+  getset = (SwigPyGetSet *)closure;
+  if (!getset->set) {
+    PyErr_Format(PyExc_TypeError, "Illegal member variable assignment in type '%.300s'", obj->ob_type->tp_name);
+    return -1;
+  }
+  result = (*getset->set)(obj, val);
+  Py_XDECREF(result);
+  return result ? 0 : -1;
+}
+
+SWIGINTERN void
+SwigPyStaticVar_dealloc(PyDescrObject *descr) {
+  _PyObject_GC_UNTRACK(descr);
+  Py_XDECREF(PyDescr_TYPE(descr));
+  Py_XDECREF(PyDescr_NAME(descr));
+  PyObject_GC_Del(descr);
+}
+
+SWIGINTERN PyObject *
+SwigPyStaticVar_repr(PyGetSetDescrObject *descr) {
+#if PY_VERSION_HEX >= 0x03000000
+
+  return PyUnicode_FromFormat("<class attribute '%S' of type '%s'>", PyDescr_NAME(descr), PyDescr_TYPE(descr)->tp_name);
+#else
+  return PyString_FromFormat("<class attribute '%s' of type '%s'>", PyString_AsString(PyDescr_NAME(descr)), PyDescr_TYPE(descr)->tp_name);
+#endif
+}
+
+SWIGINTERN int
+SwigPyStaticVar_traverse(PyObject *self, visitproc visit, void *arg) {
+  PyDescrObject *descr;
+  descr = (PyDescrObject *)self;
+  Py_VISIT((PyObject*) PyDescr_TYPE(descr));
+  return 0;
+}
+
+SWIGINTERN PyObject *
+SwigPyStaticVar_get(PyGetSetDescrObject *descr, PyObject *obj, PyObject *SWIGUNUSEDPARM(type)) {
+  if (descr->d_getset->get != NULL)
+    return descr->d_getset->get(obj, descr->d_getset->closure);
+#if PY_VERSION_HEX >= 0x03000000
+  PyErr_Format(PyExc_AttributeError, "attribute '%.300S' of '%.100s' objects is not readable", PyDescr_NAME(descr), PyDescr_TYPE(descr)->tp_name);
+#else
+  PyErr_Format(PyExc_AttributeError, "attribute '%.300s' of '%.100s' objects is not readable", PyString_AsString(PyDescr_NAME(descr)), PyDescr_TYPE(descr)->tp_name);
+#endif
+  return NULL;
+}
+
+SWIGINTERN int
+SwigPyStaticVar_set(PyGetSetDescrObject *descr, PyObject *obj, PyObject *value) {
+  if (descr->d_getset->set != NULL)
+    return descr->d_getset->set(obj, value, descr->d_getset->closure);
+#if PY_VERSION_HEX >= 0x03000000
+  PyErr_Format(PyExc_AttributeError, "attribute '%.300S' of '%.100s' objects is not writable", PyDescr_NAME(descr), PyDescr_TYPE(descr)->tp_name);
+#else
+  PyErr_Format(PyExc_AttributeError, "attribute '%.300s' of '%.100s' objects is not writable", PyString_AsString(PyDescr_NAME(descr)), PyDescr_TYPE(descr)->tp_name);
+#endif
+  return -1;
+}
+
+SWIGINTERN int
+SwigPyObjectType_setattro(PyTypeObject *type, PyObject *name, PyObject *value) {
+  PyObject *attribute;
+  descrsetfunc local_set;
+  attribute = _PyType_Lookup(type, name);
+  if (attribute != NULL) {
+    /* Implement descriptor functionality, if any */
+    local_set = attribute->ob_type->tp_descr_set;
+    if (local_set != NULL)
+      return local_set(attribute, (PyObject *)type, value);
+#if PY_VERSION_HEX >= 0x03000000
+    PyErr_Format(PyExc_AttributeError, "cannot modify read-only attribute '%.50s.%.400S'", type->tp_name, name);
+#else 
+    PyErr_Format(PyExc_AttributeError, "cannot modify read-only attribute '%.50s.%.400s'", type->tp_name, PyString_AS_STRING(name));
+#endif
+  } else {
+#if PY_VERSION_HEX >= 0x03000000
+    PyErr_Format(PyExc_AttributeError, "type '%.50s' has no attribute '%.400S'", type->tp_name, name);
+#else
+    PyErr_Format(PyExc_AttributeError, "type '%.50s' has no attribute '%.400s'", type->tp_name, PyString_AS_STRING(name));
+#endif
+  }
+
+  return -1;
+}
+
+SWIGINTERN PyTypeObject*
+SwigPyStaticVar_Type(void) {
+  static PyTypeObject staticvar_type;
+  static int type_init = 0;
+  if (!type_init) {
+    const PyTypeObject tmp = {
+      /* PyObject header changed in Python 3 */
+#if PY_VERSION_HEX >= 0x03000000
+      PyVarObject_HEAD_INIT(&PyType_Type, 0)
+#else
+      PyObject_HEAD_INIT(&PyType_Type)
+      0,
+#endif
+      "swig_static_var_getset_descriptor",
+      sizeof(PyGetSetDescrObject),
+      0,
+      (destructor)SwigPyStaticVar_dealloc,      /* tp_dealloc */
+      0,                                        /* tp_print */
+      0,                                        /* tp_getattr */
+      0,                                        /* tp_setattr */
+      0,                                        /* tp_compare */
+      (reprfunc)SwigPyStaticVar_repr,           /* tp_repr */
+      0,                                        /* tp_as_number */
+      0,                                        /* tp_as_sequence */
+      0,                                        /* tp_as_mapping */
+      0,                                        /* tp_hash */
+      0,                                        /* tp_call */
+      0,                                        /* tp_str */
+      PyObject_GenericGetAttr,                  /* tp_getattro */
+      0,                                        /* tp_setattro */
+      0,                                        /* tp_as_buffer */
+      Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_GC|Py_TPFLAGS_HAVE_CLASS, /* tp_flags */
+      0,                                        /* tp_doc */
+      SwigPyStaticVar_traverse,                 /* tp_traverse */
+      0,                                        /* tp_clear */
+      0,                                        /* tp_richcompare */
+      0,                                        /* tp_weaklistoffset */
+      0,                                        /* tp_iter */
+      0,                                        /* tp_iternext */
+      0,                                        /* tp_methods */
+      0,                                        /* tp_members */
+      0,                                        /* tp_getset */
+      0,                                        /* tp_base */
+      0,                                        /* tp_dict */
+      (descrgetfunc)SwigPyStaticVar_get,        /* tp_descr_get */
+      (descrsetfunc)SwigPyStaticVar_set,        /* tp_descr_set */
+      0,                                        /* tp_dictoffset */
+      0,                                        /* tp_init */
+      0,                                        /* tp_alloc */
+      0,                                        /* tp_new */
+      0,                                        /* tp_free */
+      0,                                        /* tp_is_gc */
+      0,                                        /* tp_bases */
+      0,                                        /* tp_mro */
+      0,                                        /* tp_cache */
+      0,                                        /* tp_subclasses */
+      0,                                        /* tp_weaklist */
+#if PY_VERSION_HEX >= 0x02030000
+      0,                                        /* tp_del */
+#endif
+#if PY_VERSION_HEX >= 0x02060000
+      0,                                        /* tp_version */
+#endif
+#ifdef COUNT_ALLOCS
+      0,0,0,0                                   /* tp_alloc -> tp_next */
+#endif
+    };
+    staticvar_type = tmp;
+    type_init = 1;
+#if PY_VERSION_HEX < 0x02020000
+    staticvar_type.ob_type = &PyType_Type;
+#else
+    if (PyType_Ready(&staticvar_type) < 0)
+      return NULL;
+#endif
+  }
+  return &staticvar_type;
+}
+
+SWIGINTERN PyGetSetDescrObject *
+SwigPyStaticVar_new_getset(PyTypeObject *type, PyGetSetDef *getset) {
+
+  PyGetSetDescrObject *descr;
+  descr = (PyGetSetDescrObject *)PyType_GenericAlloc(SwigPyStaticVar_Type(), 0);
+  assert(descr);
+  Py_XINCREF(type);
+  PyDescr_TYPE(descr) = type;
+  PyDescr_NAME(descr) = PyString_InternFromString(getset->name);
+  descr->d_getset = getset;
+  if (PyDescr_NAME(descr) == NULL) {
+    Py_DECREF(descr);
+    descr = NULL;
+  }
+  return descr;
+}
+
+SWIGINTERN void
+SwigPyBuiltin_InitBases (PyTypeObject *type, PyTypeObject **bases) {
+  int base_count = 0;
+  PyTypeObject **b;
+  PyObject *tuple;
+  int i;
+
+  if (!bases[0]) {
+    bases[0] = SwigPyObject_type();
+    bases[1] = NULL;
+  }
+  type->tp_base = bases[0];
+  Py_INCREF((PyObject *)bases[0]);
+  for (b = bases; *b != NULL; ++b)
+    ++base_count;
+  tuple = PyTuple_New(base_count);
+  for (i = 0; i < base_count; ++i) {
+    PyTuple_SET_ITEM(tuple, i, (PyObject *)bases[i]);
+    Py_INCREF((PyObject *)bases[i]);
+  }
+  type->tp_bases = tuple;
+}
+
+SWIGINTERN PyObject *
+SwigPyBuiltin_ThisClosure (PyObject *self, void *SWIGUNUSEDPARM(closure)) {
+  PyObject *result;
+  result = (PyObject *)SWIG_Python_GetSwigThis(self);
+  Py_XINCREF(result);
+  return result;
+}
+
+SWIGINTERN void
+SwigPyBuiltin_SetMetaType (PyTypeObject *type, PyTypeObject *metatype)
+{
+#if PY_VERSION_HEX >= 0x03000000
+    type->ob_base.ob_base.ob_type = metatype;
+#else
+    type->ob_type = metatype;
+#endif
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+
+
+#define SWIG_exception_fail(code, msg) do { SWIG_Error(code, msg); SWIG_fail; } while(0) 
+
+#define SWIG_contract_assert(expr, msg) if (!(expr)) { SWIG_Error(SWIG_RuntimeError, msg); SWIG_fail; } else 
+
+
+
+/* -------- TYPES TABLE (BEGIN) -------- */
+
+#define SWIGTYPE_p_SwigPyObject swig_types[0]
+#define SWIGTYPE_p__THyPhy swig_types[1]
+#define SWIGTYPE_p__THyPhyMatrix swig_types[2]
+#define SWIGTYPE_p__THyPhyNumber swig_types[3]
+#define SWIGTYPE_p__THyPhyReturnObject swig_types[4]
+#define SWIGTYPE_p__THyPhyString swig_types[5]
+#define SWIGTYPE_p_char swig_types[6]
+#define SWIGTYPE_p_double swig_types[7]
+#define SWIGTYPE_p_f_p_char_int_double__bool swig_types[8]
+#define SWIGTYPE_p_void swig_types[9]
+static swig_type_info *swig_types[11];
+static swig_module_info swig_module = {swig_types, 10, 0, 0, 0, 0};
+#define SWIG_TypeQuery(name) SWIG_TypeQueryModule(&swig_module, &swig_module, name)
+#define SWIG_MangledTypeQuery(name) SWIG_MangledTypeQueryModule(&swig_module, &swig_module, name)
+
+/* -------- TYPES TABLE (END) -------- */
+
+#if (PY_VERSION_HEX <= 0x02000000)
+# if !defined(SWIG_PYTHON_CLASSIC)
+#  error "This python version requires swig to be run with the '-classic' option"
+# endif
+#endif
+
+/*-----------------------------------------------
+              @(target):= _HyPhy.so
+  ------------------------------------------------*/
+#if PY_VERSION_HEX >= 0x03000000
+#  define SWIG_init    PyInit__HyPhy
+
+#else
+#  define SWIG_init    init_HyPhy
+
+#endif
+#define SWIG_name    "_HyPhy"
+
+#define SWIGVERSION 0x020004 
+#define SWIG_VERSION SWIGVERSION
+
+
+#define SWIG_as_voidptr(a) const_cast< void * >(static_cast< const void * >(a)) 
+#define SWIG_as_voidptrptr(a) ((void)SWIG_as_voidptr(*a),reinterpret_cast< void** >(a)) 
+
+
+#include <stdexcept>
+
+
+namespace swig {
+  class SwigPtr_PyObject {
+  protected:
+    PyObject *_obj;
+
+  public:
+    SwigPtr_PyObject() :_obj(0)
+    {
+    }
+
+    SwigPtr_PyObject(const SwigPtr_PyObject& item) : _obj(item._obj)
+    {
+      Py_XINCREF(_obj);      
+    }
+    
+    SwigPtr_PyObject(PyObject *obj, bool initial_ref = true) :_obj(obj)
+    {
+      if (initial_ref) {
+        Py_XINCREF(_obj);
+      }
+    }
+    
+    SwigPtr_PyObject & operator=(const SwigPtr_PyObject& item) 
+    {
+      Py_XINCREF(item._obj);
+      Py_XDECREF(_obj);
+      _obj = item._obj;
+      return *this;      
+    }
+    
+    ~SwigPtr_PyObject() 
+    {
+      Py_XDECREF(_obj);
+    }
+    
+    operator PyObject *() const
+    {
+      return _obj;
+    }
+
+    PyObject *operator->() const
+    {
+      return _obj;
+    }
+  };
+}
+
+
+namespace swig {
+  struct SwigVar_PyObject : SwigPtr_PyObject {
+    SwigVar_PyObject(PyObject* obj = 0) : SwigPtr_PyObject(obj, false) { }
+    
+    SwigVar_PyObject & operator = (PyObject* obj)
+    {
+      Py_XDECREF(_obj);
+      _obj = obj;
+      return *this;      
+    }
+  };
+}
+
+
+#include "THyPhy.h"
+
+
+  #define SWIG_From_long   PyInt_FromLong 
+
+
+SWIGINTERNINLINE PyObject *
+SWIG_From_int  (int value)
+{    
+  return SWIG_From_long  (value);
+}
+
+
+SWIGINTERN swig_type_info*
+SWIG_pchar_descriptor(void)
+{
+  static int init = 0;
+  static swig_type_info* info = 0;
+  if (!init) {
+    info = SWIG_TypeQuery("_p_char");
+    init = 1;
+  }
+  return info;
+}
+
+
+SWIGINTERN int
+SWIG_AsCharPtrAndSize(PyObject *obj, char** cptr, size_t* psize, int *alloc)
+{
+#if PY_VERSION_HEX>=0x03000000
+  if (PyUnicode_Check(obj))
+#else  
+  if (PyString_Check(obj))
+#endif
+  {
+    char *cstr; Py_ssize_t len;
+#if PY_VERSION_HEX>=0x03000000
+    if (!alloc && cptr) {
+        /* We can't allow converting without allocation, since the internal
+           representation of string in Python 3 is UCS-2/UCS-4 but we require
+           a UTF-8 representation.
+           TODO(bhy) More detailed explanation */
+        return SWIG_RuntimeError;
+    }
+    obj = PyUnicode_AsUTF8String(obj);
+    PyBytes_AsStringAndSize(obj, &cstr, &len);
+    if(alloc) *alloc = SWIG_NEWOBJ;
+#else
+    PyString_AsStringAndSize(obj, &cstr, &len);
+#endif
+    if (cptr) {
+      if (alloc) {
+	/* 
+	   In python the user should not be able to modify the inner
+	   string representation. To warranty that, if you define
+	   SWIG_PYTHON_SAFE_CSTRINGS, a new/copy of the python string
+	   buffer is always returned.
+
+	   The default behavior is just to return the pointer value,
+	   so, be careful.
+	*/ 
+#if defined(SWIG_PYTHON_SAFE_CSTRINGS)
+	if (*alloc != SWIG_OLDOBJ) 
+#else
+	if (*alloc == SWIG_NEWOBJ) 
+#endif
+	  {
+	    *cptr = reinterpret_cast< char* >(memcpy((new char[len + 1]), cstr, sizeof(char)*(len + 1)));
+	    *alloc = SWIG_NEWOBJ;
+	  }
+	else {
+	  *cptr = cstr;
+	  *alloc = SWIG_OLDOBJ;
+	}
+      } else {
+        #if PY_VERSION_HEX>=0x03000000
+        assert(0); /* Should never reach here in Python 3 */
+        #endif
+	*cptr = SWIG_Python_str_AsChar(obj);
+      }
+    }
+    if (psize) *psize = len + 1;
+#if PY_VERSION_HEX>=0x03000000
+    Py_XDECREF(obj);
+#endif
+    return SWIG_OK;
+  } else {
+    swig_type_info* pchar_descriptor = SWIG_pchar_descriptor();
+    if (pchar_descriptor) {
+      void* vptr = 0;
+      if (SWIG_ConvertPtr(obj, &vptr, pchar_descriptor, 0) == SWIG_OK) {
+	if (cptr) *cptr = (char *) vptr;
+	if (psize) *psize = vptr ? (strlen((char *)vptr) + 1) : 0;
+	if (alloc) *alloc = SWIG_OLDOBJ;
+	return SWIG_OK;
+      }
+    }
+  }
+  return SWIG_TypeError;
+}
+
+
+
+
+
+SWIGINTERN int
+SWIG_AsVal_double (PyObject *obj, double *val)
+{
+  int res = SWIG_TypeError;
+  if (PyFloat_Check(obj)) {
+    if (val) *val = PyFloat_AsDouble(obj);
+    return SWIG_OK;
+  } else if (PyInt_Check(obj)) {
+    if (val) *val = PyInt_AsLong(obj);
+    return SWIG_OK;
+  } else if (PyLong_Check(obj)) {
+    double v = PyLong_AsDouble(obj);
+    if (!PyErr_Occurred()) {
+      if (val) *val = v;
+      return SWIG_OK;
+    } else {
+      PyErr_Clear();
+    }
+  }
+#ifdef SWIG_PYTHON_CAST_MODE
+  {
+    int dispatch = 0;
+    double d = PyFloat_AsDouble(obj);
+    if (!PyErr_Occurred()) {
+      if (val) *val = d;
+      return SWIG_AddCast(SWIG_OK);
+    } else {
+      PyErr_Clear();
+    }
+    if (!dispatch) {
+      long v = PyLong_AsLong(obj);
+      if (!PyErr_Occurred()) {
+	if (val) *val = v;
+	return SWIG_AddCast(SWIG_AddCast(SWIG_OK));
+      } else {
+	PyErr_Clear();
+      }
+    }
+  }
+#endif
+  return res;
+}
+
+
+#include <float.h>
+
+
+#include <math.h>
+
+
+SWIGINTERNINLINE int
+SWIG_CanCastAsInteger(double *d, double min, double max) {
+  double x = *d;
+  if ((min <= x && x <= max)) {
+   double fx = floor(x);
+   double cx = ceil(x);
+   double rd =  ((x - fx) < 0.5) ? fx : cx; /* simple rint */
+   if ((errno == EDOM) || (errno == ERANGE)) {
+     errno = 0;
+   } else {
+     double summ, reps, diff;
+     if (rd < x) {
+       diff = x - rd;
+     } else if (rd > x) {
+       diff = rd - x;
+     } else {
+       return 1;
+     }
+     summ = rd + x;
+     reps = diff/summ;
+     if (reps < 8*DBL_EPSILON) {
+       *d = rd;
+       return 1;
+     }
+   }
+  }
+  return 0;
+}
+
+
+SWIGINTERN int
+SWIG_AsVal_long (PyObject *obj, long* val)
+{
+  if (PyInt_Check(obj)) {
+    if (val) *val = PyInt_AsLong(obj);
+    return SWIG_OK;
+  } else if (PyLong_Check(obj)) {
+    long v = PyLong_AsLong(obj);
+    if (!PyErr_Occurred()) {
+      if (val) *val = v;
+      return SWIG_OK;
+    } else {
+      PyErr_Clear();
+    }
+  }
+#ifdef SWIG_PYTHON_CAST_MODE
+  {
+    int dispatch = 0;
+    long v = PyInt_AsLong(obj);
+    if (!PyErr_Occurred()) {
+      if (val) *val = v;
+      return SWIG_AddCast(SWIG_OK);
+    } else {
+      PyErr_Clear();
+    }
+    if (!dispatch) {
+      double d;
+      int res = SWIG_AddCast(SWIG_AsVal_double (obj,&d));
+      if (SWIG_IsOK(res) && SWIG_CanCastAsInteger(&d, LONG_MIN, LONG_MAX)) {
+	if (val) *val = (long)(d);
+	return res;
+      }
+    }
+  }
+#endif
+  return SWIG_TypeError;
+}
+
+
+SWIGINTERNINLINE PyObject *
+SWIG_FromCharPtrAndSize(const char* carray, size_t size)
+{
+  if (carray) {
+    if (size > INT_MAX) {
+      swig_type_info* pchar_descriptor = SWIG_pchar_descriptor();
+      return pchar_descriptor ? 
+	SWIG_InternalNewPointerObj(const_cast< char * >(carray), pchar_descriptor, 0) : SWIG_Py_Void();
+    } else {
+#if PY_VERSION_HEX >= 0x03000000
+      return PyUnicode_FromStringAndSize(carray, static_cast< int >(size));
+#else
+      return PyString_FromStringAndSize(carray, static_cast< int >(size));
+#endif
+    }
+  } else {
+    return SWIG_Py_Void();
+  }
+}
+
+
+SWIGINTERNINLINE PyObject * 
+SWIG_FromCharPtr(const char *cptr)
+{ 
+  return SWIG_FromCharPtrAndSize(cptr, (cptr ? strlen(cptr) : 0));
+}
+
+
+  #define SWIG_From_double   PyFloat_FromDouble 
+
+
+SWIGINTERN int
+SWIG_AsVal_bool (PyObject *obj, bool *val)
+{
+  int r = PyObject_IsTrue(obj);
+  if (r == -1)
+    return SWIG_ERROR;
+  if (val) *val = r ? true : false;
+  return SWIG_OK;
+}
+
+
+#include <limits.h>
+#if !defined(SWIG_NO_LLONG_MAX)
+# if !defined(LLONG_MAX) && defined(__GNUC__) && defined (__LONG_LONG_MAX__)
+#   define LLONG_MAX __LONG_LONG_MAX__
+#   define LLONG_MIN (-LLONG_MAX - 1LL)
+#   define ULLONG_MAX (LLONG_MAX * 2ULL + 1ULL)
+# endif
+#endif
+
+
+SWIGINTERN int
+SWIG_AsVal_int (PyObject * obj, int *val)
+{
+  long v;
+  int res = SWIG_AsVal_long (obj, &v);
+  if (SWIG_IsOK(res)) {
+    if ((v < INT_MIN || v > INT_MAX)) {
+      return SWIG_OverflowError;
+    } else {
+      if (val) *val = static_cast< int >(v);
+    }
+  }  
+  return res;
+}
+
+
+SWIGINTERNINLINE PyObject*
+  SWIG_From_bool  (bool value)
+{
+  return PyBool_FromLong(value ? 1 : 0);
+}
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+SWIGINTERN PyObject *_wrap__THyPhyReturnObject_myType(PyObject *self, PyObject *args) {
+  PyObject *resultobj = 0;
+  _THyPhyReturnObject *arg1 = (_THyPhyReturnObject *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int result;
+  
+  if (args && PyTuple_Check(args) && PyTuple_GET_SIZE(args) > 0) SWIG_fail;
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p__THyPhyReturnObject, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "_THyPhyReturnObject_myType" "', argument " "1"" of type '" "_THyPhyReturnObject *""'"); 
+  }
+  arg1 = reinterpret_cast< _THyPhyReturnObject * >(argp1);
+  result = (int)(arg1)->myType();
+  resultobj = SWIG_From_int(static_cast< int >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete__THyPhyReturnObject(PyObject *self, PyObject *args) {
+  PyObject *resultobj = 0;
+  _THyPhyReturnObject *arg1 = (_THyPhyReturnObject *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  
+  if (args && PyTuple_Check(args) && PyTuple_GET_SIZE(args) > 0) SWIG_fail;
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p__THyPhyReturnObject, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete__THyPhyReturnObject" "', argument " "1"" of type '" "_THyPhyReturnObject *""'"); 
+  }
+  arg1 = reinterpret_cast< _THyPhyReturnObject * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap__THyPhyReturnObject_castToString(PyObject *self, PyObject *args) {
+  PyObject *resultobj = 0;
+  _THyPhyReturnObject *arg1 = (_THyPhyReturnObject *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  _THyPhyString *result = 0 ;
+  
+  if (args && PyTuple_Check(args) && PyTuple_GET_SIZE(args) > 0) SWIG_fail;
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p__THyPhyReturnObject, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "_THyPhyReturnObject_castToString" "', argument " "1"" of type '" "_THyPhyReturnObject *""'"); 
+  }
+  arg1 = reinterpret_cast< _THyPhyReturnObject * >(argp1);
+  result = (_THyPhyString *)(arg1)->castToString();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p__THyPhyString, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap__THyPhyReturnObject_castToNumber(PyObject *self, PyObject *args) {
+  PyObject *resultobj = 0;
+  _THyPhyReturnObject *arg1 = (_THyPhyReturnObject *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  _THyPhyNumber *result = 0 ;
+  
+  if (args && PyTuple_Check(args) && PyTuple_GET_SIZE(args) > 0) SWIG_fail;
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p__THyPhyReturnObject, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "_THyPhyReturnObject_castToNumber" "', argument " "1"" of type '" "_THyPhyReturnObject *""'"); 
+  }
+  arg1 = reinterpret_cast< _THyPhyReturnObject * >(argp1);
+  result = (_THyPhyNumber *)(arg1)->castToNumber();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p__THyPhyNumber, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap__THyPhyReturnObject_castToMatrix(PyObject *self, PyObject *args) {
+  PyObject *resultobj = 0;
+  _THyPhyReturnObject *arg1 = (_THyPhyReturnObject *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  _THyPhyMatrix *result = 0 ;
+  
+  if (args && PyTuple_Check(args) && PyTuple_GET_SIZE(args) > 0) SWIG_fail;
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p__THyPhyReturnObject, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "_THyPhyReturnObject_castToMatrix" "', argument " "1"" of type '" "_THyPhyReturnObject *""'"); 
+  }
+  arg1 = reinterpret_cast< _THyPhyReturnObject * >(argp1);
+  result = (_THyPhyMatrix *)(arg1)->castToMatrix();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p__THyPhyMatrix, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN int _wrap_new__THyPhyString__SWIG_0(PyObject *self, PyObject *args) {
+  PyObject *resultobj = 0;
+  char *arg1 = (char *) 0 ;
+  long arg2 ;
+  int res1 ;
+  char *buf1 = 0 ;
+  int alloc1 = 0 ;
+  long val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  _THyPhyString *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:new__THyPhyString",&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_AsCharPtrAndSize(obj1, &buf1, NULL, &alloc1);
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new__THyPhyString" "', argument " "1"" of type '" "char const *""'");
+  }
+  arg1 = reinterpret_cast< char * >(buf1);
+  ecode2 = SWIG_AsVal_long(obj2, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "new__THyPhyString" "', argument " "2"" of type '" "long""'");
+  } 
+  arg2 = static_cast< long >(val2);
+  result = (_THyPhyString *)new _THyPhyString((char const *)arg1,arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p__THyPhyString, SWIG_BUILTIN_INIT |  0 );
+  if (alloc1 == SWIG_NEWOBJ) delete[] buf1;
+  return resultobj == Py_None ? 1 : 0;
+fail:
+  if (alloc1 == SWIG_NEWOBJ) delete[] buf1;
+  return -1;
+}
+
+
+SWIGINTERN int _wrap_new__THyPhyString__SWIG_1(PyObject *self, PyObject *args) {
+  PyObject *resultobj = 0;
+  char *arg1 = (char *) 0 ;
+  int res1 ;
+  char *buf1 = 0 ;
+  int alloc1 = 0 ;
+  PyObject * obj1 = 0 ;
+  _THyPhyString *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:new__THyPhyString",&obj1)) SWIG_fail;
+  res1 = SWIG_AsCharPtrAndSize(obj1, &buf1, NULL, &alloc1);
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new__THyPhyString" "', argument " "1"" of type '" "char const *""'");
+  }
+  arg1 = reinterpret_cast< char * >(buf1);
+  result = (_THyPhyString *)new _THyPhyString((char const *)arg1);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p__THyPhyString, SWIG_BUILTIN_INIT |  0 );
+  if (alloc1 == SWIG_NEWOBJ) delete[] buf1;
+  return resultobj == Py_None ? 1 : 0;
+fail:
+  if (alloc1 == SWIG_NEWOBJ) delete[] buf1;
+  return -1;
+}
+
+
+SWIGINTERN int _wrap_new__THyPhyString__SWIG_2(PyObject *self, PyObject *args) {
+  PyObject *resultobj = 0;
+  _THyPhyString *result = 0 ;
+  
+  if (args && PyTuple_Check(args) && PyTuple_GET_SIZE(args) > 0) SWIG_fail;
+  result = (_THyPhyString *)new _THyPhyString();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p__THyPhyString, SWIG_BUILTIN_INIT |  0 );
+  return resultobj == Py_None ? 1 : 0;
+fail:
+  return -1;
+}
+
+
+SWIGINTERN int _wrap_new__THyPhyString(PyObject *self, PyObject *args) {
+  int argc;
+  PyObject *argv[3];
+  int ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? (int)PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 2) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 0) {
+    return _wrap_new__THyPhyString__SWIG_2(self, args);
+  }
+  if (argc == 1) {
+    int _v;
+    int res = SWIG_AsCharPtrAndSize(argv[0], 0, NULL, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      return _wrap_new__THyPhyString__SWIG_1(self, args);
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    int res = SWIG_AsCharPtrAndSize(argv[0], 0, NULL, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_long(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_new__THyPhyString__SWIG_0(self, args);
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'new__THyPhyString'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    _THyPhyString::_THyPhyString(char const *,long)\n"
+    "    _THyPhyString::_THyPhyString(char const *)\n"
+    "    _THyPhyString::_THyPhyString()\n");
+  return -1;
+}
+
+
+SWIGINTERN PyObject *_wrap__THyPhyString_myType(PyObject *self, PyObject *args) {
+  PyObject *resultobj = 0;
+  _THyPhyString *arg1 = (_THyPhyString *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int result;
+  
+  if (args && PyTuple_Check(args) && PyTuple_GET_SIZE(args) > 0) SWIG_fail;
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p__THyPhyString, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "_THyPhyString_myType" "', argument " "1"" of type '" "_THyPhyString *""'"); 
+  }
+  arg1 = reinterpret_cast< _THyPhyString * >(argp1);
+  result = (int)(arg1)->myType();
+  resultobj = SWIG_From_int(static_cast< int >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete__THyPhyString(PyObject *self, PyObject *args) {
+  PyObject *resultobj = 0;
+  _THyPhyString *arg1 = (_THyPhyString *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  
+  if (args && PyTuple_Check(args) && PyTuple_GET_SIZE(args) > 0) SWIG_fail;
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p__THyPhyString, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete__THyPhyString" "', argument " "1"" of type '" "_THyPhyString *""'"); 
+  }
+  arg1 = reinterpret_cast< _THyPhyString * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap__THyPhyString_sLength_set(PyObject *self, PyObject *args) {
+  PyObject *resultobj = 0;
+  _THyPhyString *arg1 = (_THyPhyString *) 0 ;
+  long arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  long val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:_THyPhyString_sLength_set",&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p__THyPhyString, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "_THyPhyString_sLength_set" "', argument " "1"" of type '" "_THyPhyString *""'"); 
+  }
+  arg1 = reinterpret_cast< _THyPhyString * >(argp1);
+  ecode2 = SWIG_AsVal_long(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "_THyPhyString_sLength_set" "', argument " "2"" of type '" "long""'");
+  } 
+  arg2 = static_cast< long >(val2);
+  if (arg1) (arg1)->sLength = arg2;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap__THyPhyString_sLength_get(PyObject *self, PyObject *args) {
+  PyObject *resultobj = 0;
+  _THyPhyString *arg1 = (_THyPhyString *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  long result;
+  
+  if (args && PyTuple_Check(args) && PyTuple_GET_SIZE(args) > 0) SWIG_fail;
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p__THyPhyString, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "_THyPhyString_sLength_get" "', argument " "1"" of type '" "_THyPhyString *""'"); 
+  }
+  arg1 = reinterpret_cast< _THyPhyString * >(argp1);
+  result = (long) ((arg1)->sLength);
+  resultobj = SWIG_From_long(static_cast< long >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap__THyPhyString_sData_set(PyObject *self, PyObject *args) {
+  PyObject *resultobj = 0;
+  _THyPhyString *arg1 = (_THyPhyString *) 0 ;
+  char *arg2 = (char *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int res2 ;
+  char *buf2 = 0 ;
+  int alloc2 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:_THyPhyString_sData_set",&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p__THyPhyString, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "_THyPhyString_sData_set" "', argument " "1"" of type '" "_THyPhyString *""'"); 
+  }
+  arg1 = reinterpret_cast< _THyPhyString * >(argp1);
+  res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "_THyPhyString_sData_set" "', argument " "2"" of type '" "char *""'");
+  }
+  arg2 = reinterpret_cast< char * >(buf2);
+  if (arg1->sData) delete[] arg1->sData;
+  if (arg2) {
+    size_t size = strlen(reinterpret_cast< const char * >(arg2)) + 1;
+    arg1->sData = (char *)reinterpret_cast< char* >(memcpy((new char[size]), reinterpret_cast< const char * >(arg2), sizeof(char)*(size)));
+  } else {
+    arg1->sData = 0;
+  }
+  resultobj = SWIG_Py_Void();
+  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
+  return resultobj;
+fail:
+  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap__THyPhyString_sData_get(PyObject *self, PyObject *args) {
+  PyObject *resultobj = 0;
+  _THyPhyString *arg1 = (_THyPhyString *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  char *result = 0 ;
+  
+  if (args && PyTuple_Check(args) && PyTuple_GET_SIZE(args) > 0) SWIG_fail;
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p__THyPhyString, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "_THyPhyString_sData_get" "', argument " "1"" of type '" "_THyPhyString *""'"); 
+  }
+  arg1 = reinterpret_cast< _THyPhyString * >(argp1);
+  result = (char *) ((arg1)->sData);
+  resultobj = SWIG_FromCharPtr((const char *)result);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN int _wrap_new__THyPhyNumber__SWIG_0(PyObject *self, PyObject *args) {
+  PyObject *resultobj = 0;
+  double arg1 ;
+  double val1 ;
+  int ecode1 = 0 ;
+  PyObject * obj1 = 0 ;
+  _THyPhyNumber *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:new__THyPhyNumber",&obj1)) SWIG_fail;
+  ecode1 = SWIG_AsVal_double(obj1, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new__THyPhyNumber" "', argument " "1"" of type '" "double""'");
+  } 
+  arg1 = static_cast< double >(val1);
+  result = (_THyPhyNumber *)new _THyPhyNumber(arg1);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p__THyPhyNumber, SWIG_BUILTIN_INIT |  0 );
+  return resultobj == Py_None ? 1 : 0;
+fail:
+  return -1;
+}
+
+
+SWIGINTERN int _wrap_new__THyPhyNumber__SWIG_1(PyObject *self, PyObject *args) {
+  PyObject *resultobj = 0;
+  _THyPhyNumber *result = 0 ;
+  
+  if (args && PyTuple_Check(args) && PyTuple_GET_SIZE(args) > 0) SWIG_fail;
+  result = (_THyPhyNumber *)new _THyPhyNumber();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p__THyPhyNumber, SWIG_BUILTIN_INIT |  0 );
+  return resultobj == Py_None ? 1 : 0;
+fail:
+  return -1;
+}
+
+
+SWIGINTERN int _wrap_new__THyPhyNumber(PyObject *self, PyObject *args) {
+  int argc;
+  PyObject *argv[2];
+  int ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? (int)PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 1) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 0) {
+    return _wrap_new__THyPhyNumber__SWIG_1(self, args);
+  }
+  if (argc == 1) {
+    int _v;
+    {
+      int res = SWIG_AsVal_double(argv[0], NULL);
+      _v = SWIG_CheckState(res);
+    }
+    if (_v) {
+      return _wrap_new__THyPhyNumber__SWIG_0(self, args);
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'new__THyPhyNumber'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    _THyPhyNumber::_THyPhyNumber(double)\n"
+    "    _THyPhyNumber::_THyPhyNumber()\n");
+  return -1;
+}
+
+
+SWIGINTERN PyObject *_wrap__THyPhyNumber_myType(PyObject *self, PyObject *args) {
+  PyObject *resultobj = 0;
+  _THyPhyNumber *arg1 = (_THyPhyNumber *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int result;
+  
+  if (args && PyTuple_Check(args) && PyTuple_GET_SIZE(args) > 0) SWIG_fail;
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p__THyPhyNumber, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "_THyPhyNumber_myType" "', argument " "1"" of type '" "_THyPhyNumber *""'"); 
+  }
+  arg1 = reinterpret_cast< _THyPhyNumber * >(argp1);
+  result = (int)(arg1)->myType();
+  resultobj = SWIG_From_int(static_cast< int >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete__THyPhyNumber(PyObject *self, PyObject *args) {
+  PyObject *resultobj = 0;
+  _THyPhyNumber *arg1 = (_THyPhyNumber *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  
+  if (args && PyTuple_Check(args) && PyTuple_GET_SIZE(args) > 0) SWIG_fail;
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p__THyPhyNumber, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete__THyPhyNumber" "', argument " "1"" of type '" "_THyPhyNumber *""'"); 
+  }
+  arg1 = reinterpret_cast< _THyPhyNumber * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap__THyPhyNumber_nValue_set(PyObject *self, PyObject *args) {
+  PyObject *resultobj = 0;
+  _THyPhyNumber *arg1 = (_THyPhyNumber *) 0 ;
+  double arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:_THyPhyNumber_nValue_set",&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p__THyPhyNumber, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "_THyPhyNumber_nValue_set" "', argument " "1"" of type '" "_THyPhyNumber *""'"); 
+  }
+  arg1 = reinterpret_cast< _THyPhyNumber * >(argp1);
+  ecode2 = SWIG_AsVal_double(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "_THyPhyNumber_nValue_set" "', argument " "2"" of type '" "double""'");
+  } 
+  arg2 = static_cast< double >(val2);
+  if (arg1) (arg1)->nValue = arg2;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap__THyPhyNumber_nValue_get(PyObject *self, PyObject *args) {
+  PyObject *resultobj = 0;
+  _THyPhyNumber *arg1 = (_THyPhyNumber *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double result;
+  
+  if (args && PyTuple_Check(args) && PyTuple_GET_SIZE(args) > 0) SWIG_fail;
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p__THyPhyNumber, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "_THyPhyNumber_nValue_get" "', argument " "1"" of type '" "_THyPhyNumber *""'"); 
+  }
+  arg1 = reinterpret_cast< _THyPhyNumber * >(argp1);
+  result = (double) ((arg1)->nValue);
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN int _wrap_new__THyPhyMatrix__SWIG_0(PyObject *self, PyObject *args) {
+  PyObject *resultobj = 0;
+  _THyPhyMatrix *result = 0 ;
+  
+  if (args && PyTuple_Check(args) && PyTuple_GET_SIZE(args) > 0) SWIG_fail;
+  result = (_THyPhyMatrix *)new _THyPhyMatrix();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p__THyPhyMatrix, SWIG_BUILTIN_INIT |  0 );
+  return resultobj == Py_None ? 1 : 0;
+fail:
+  return -1;
+}
+
+
+SWIGINTERN int _wrap_new__THyPhyMatrix__SWIG_1(PyObject *self, PyObject *args) {
+  PyObject *resultobj = 0;
+  long arg1 ;
+  long arg2 ;
+  double *arg3 = (double *) 0 ;
+  long val1 ;
+  int ecode1 = 0 ;
+  long val2 ;
+  int ecode2 = 0 ;
+  void *argp3 = 0 ;
+  int res3 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  PyObject * obj3 = 0 ;
+  _THyPhyMatrix *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:new__THyPhyMatrix",&obj1,&obj2,&obj3)) SWIG_fail;
+  ecode1 = SWIG_AsVal_long(obj1, &val1);
+  if (!SWIG_IsOK(ecode1)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "new__THyPhyMatrix" "', argument " "1"" of type '" "long""'");
+  } 
+  arg1 = static_cast< long >(val1);
+  ecode2 = SWIG_AsVal_long(obj2, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "new__THyPhyMatrix" "', argument " "2"" of type '" "long""'");
+  } 
+  arg2 = static_cast< long >(val2);
+  res3 = SWIG_ConvertPtr(obj3, &argp3,SWIGTYPE_p_double, 0 |  0 );
+  if (!SWIG_IsOK(res3)) {
+    SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "new__THyPhyMatrix" "', argument " "3"" of type '" "double const *""'"); 
+  }
+  arg3 = reinterpret_cast< double * >(argp3);
+  result = (_THyPhyMatrix *)new _THyPhyMatrix(arg1,arg2,(double const *)arg3);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p__THyPhyMatrix, SWIG_BUILTIN_INIT |  0 );
+  return resultobj == Py_None ? 1 : 0;
+fail:
+  return -1;
+}
+
+
+SWIGINTERN int _wrap_new__THyPhyMatrix(PyObject *self, PyObject *args) {
+  int argc;
+  PyObject *argv[4];
+  int ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? (int)PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 3) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 0) {
+    return _wrap_new__THyPhyMatrix__SWIG_0(self, args);
+  }
+  if (argc == 3) {
+    int _v;
+    {
+      int res = SWIG_AsVal_long(argv[0], NULL);
+      _v = SWIG_CheckState(res);
+    }
+    if (_v) {
+      {
+        int res = SWIG_AsVal_long(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        void *vptr = 0;
+        int res = SWIG_ConvertPtr(argv[2], &vptr, SWIGTYPE_p_double, 0);
+        _v = SWIG_CheckState(res);
+        if (_v) {
+          return _wrap_new__THyPhyMatrix__SWIG_1(self, args);
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'new__THyPhyMatrix'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    _THyPhyMatrix::_THyPhyMatrix()\n"
+    "    _THyPhyMatrix::_THyPhyMatrix(long const,long const,double const *)\n");
+  return -1;
+}
+
+
+SWIGINTERN PyObject *_wrap__THyPhyMatrix_myType(PyObject *self, PyObject *args) {
+  PyObject *resultobj = 0;
+  _THyPhyMatrix *arg1 = (_THyPhyMatrix *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int result;
+  
+  if (args && PyTuple_Check(args) && PyTuple_GET_SIZE(args) > 0) SWIG_fail;
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p__THyPhyMatrix, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "_THyPhyMatrix_myType" "', argument " "1"" of type '" "_THyPhyMatrix *""'"); 
+  }
+  arg1 = reinterpret_cast< _THyPhyMatrix * >(argp1);
+  result = (int)(arg1)->myType();
+  resultobj = SWIG_From_int(static_cast< int >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete__THyPhyMatrix(PyObject *self, PyObject *args) {
+  PyObject *resultobj = 0;
+  _THyPhyMatrix *arg1 = (_THyPhyMatrix *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  
+  if (args && PyTuple_Check(args) && PyTuple_GET_SIZE(args) > 0) SWIG_fail;
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p__THyPhyMatrix, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete__THyPhyMatrix" "', argument " "1"" of type '" "_THyPhyMatrix *""'"); 
+  }
+  arg1 = reinterpret_cast< _THyPhyMatrix * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap__THyPhyMatrix_MatrixCell(PyObject *self, PyObject *args) {
+  PyObject *resultobj = 0;
+  _THyPhyMatrix *arg1 = (_THyPhyMatrix *) 0 ;
+  long arg2 ;
+  long arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  long val2 ;
+  int ecode2 = 0 ;
+  long val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:_THyPhyMatrix_MatrixCell",&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p__THyPhyMatrix, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "_THyPhyMatrix_MatrixCell" "', argument " "1"" of type '" "_THyPhyMatrix *""'"); 
+  }
+  arg1 = reinterpret_cast< _THyPhyMatrix * >(argp1);
+  ecode2 = SWIG_AsVal_long(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "_THyPhyMatrix_MatrixCell" "', argument " "2"" of type '" "long""'");
+  } 
+  arg2 = static_cast< long >(val2);
+  ecode3 = SWIG_AsVal_long(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "_THyPhyMatrix_MatrixCell" "', argument " "3"" of type '" "long""'");
+  } 
+  arg3 = static_cast< long >(val3);
+  result = (double)(arg1)->MatrixCell(arg2,arg3);
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap__THyPhyMatrix_mRows_set(PyObject *self, PyObject *args) {
+  PyObject *resultobj = 0;
+  _THyPhyMatrix *arg1 = (_THyPhyMatrix *) 0 ;
+  long arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  long val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:_THyPhyMatrix_mRows_set",&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p__THyPhyMatrix, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "_THyPhyMatrix_mRows_set" "', argument " "1"" of type '" "_THyPhyMatrix *""'"); 
+  }
+  arg1 = reinterpret_cast< _THyPhyMatrix * >(argp1);
+  ecode2 = SWIG_AsVal_long(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "_THyPhyMatrix_mRows_set" "', argument " "2"" of type '" "long""'");
+  } 
+  arg2 = static_cast< long >(val2);
+  if (arg1) (arg1)->mRows = arg2;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap__THyPhyMatrix_mRows_get(PyObject *self, PyObject *args) {
+  PyObject *resultobj = 0;
+  _THyPhyMatrix *arg1 = (_THyPhyMatrix *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  long result;
+  
+  if (args && PyTuple_Check(args) && PyTuple_GET_SIZE(args) > 0) SWIG_fail;
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p__THyPhyMatrix, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "_THyPhyMatrix_mRows_get" "', argument " "1"" of type '" "_THyPhyMatrix *""'"); 
+  }
+  arg1 = reinterpret_cast< _THyPhyMatrix * >(argp1);
+  result = (long) ((arg1)->mRows);
+  resultobj = SWIG_From_long(static_cast< long >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap__THyPhyMatrix_mCols_set(PyObject *self, PyObject *args) {
+  PyObject *resultobj = 0;
+  _THyPhyMatrix *arg1 = (_THyPhyMatrix *) 0 ;
+  long arg2 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  long val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:_THyPhyMatrix_mCols_set",&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p__THyPhyMatrix, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "_THyPhyMatrix_mCols_set" "', argument " "1"" of type '" "_THyPhyMatrix *""'"); 
+  }
+  arg1 = reinterpret_cast< _THyPhyMatrix * >(argp1);
+  ecode2 = SWIG_AsVal_long(obj1, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "_THyPhyMatrix_mCols_set" "', argument " "2"" of type '" "long""'");
+  } 
+  arg2 = static_cast< long >(val2);
+  if (arg1) (arg1)->mCols = arg2;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap__THyPhyMatrix_mCols_get(PyObject *self, PyObject *args) {
+  PyObject *resultobj = 0;
+  _THyPhyMatrix *arg1 = (_THyPhyMatrix *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  long result;
+  
+  if (args && PyTuple_Check(args) && PyTuple_GET_SIZE(args) > 0) SWIG_fail;
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p__THyPhyMatrix, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "_THyPhyMatrix_mCols_get" "', argument " "1"" of type '" "_THyPhyMatrix *""'"); 
+  }
+  arg1 = reinterpret_cast< _THyPhyMatrix * >(argp1);
+  result = (long) ((arg1)->mCols);
+  resultobj = SWIG_From_long(static_cast< long >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap__THyPhyMatrix_mData_set(PyObject *self, PyObject *args) {
+  PyObject *resultobj = 0;
+  _THyPhyMatrix *arg1 = (_THyPhyMatrix *) 0 ;
+  double *arg2 = (double *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  void *argp2 = 0 ;
+  int res2 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:_THyPhyMatrix_mData_set",&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p__THyPhyMatrix, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "_THyPhyMatrix_mData_set" "', argument " "1"" of type '" "_THyPhyMatrix *""'"); 
+  }
+  arg1 = reinterpret_cast< _THyPhyMatrix * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1, &argp2,SWIGTYPE_p_double, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "_THyPhyMatrix_mData_set" "', argument " "2"" of type '" "double *""'"); 
+  }
+  arg2 = reinterpret_cast< double * >(argp2);
+  if (arg1) (arg1)->mData = arg2;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap__THyPhyMatrix_mData_get(PyObject *self, PyObject *args) {
+  PyObject *resultobj = 0;
+  _THyPhyMatrix *arg1 = (_THyPhyMatrix *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  double *result = 0 ;
+  
+  if (args && PyTuple_Check(args) && PyTuple_GET_SIZE(args) > 0) SWIG_fail;
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p__THyPhyMatrix, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "_THyPhyMatrix_mData_get" "', argument " "1"" of type '" "_THyPhyMatrix *""'"); 
+  }
+  arg1 = reinterpret_cast< _THyPhyMatrix * >(argp1);
+  result = (double *) ((arg1)->mData);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_double, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN int _wrap_new__THyPhy__SWIG_0(PyObject *self, PyObject *args) {
+  PyObject *resultobj = 0;
+  _ProgressCancelHandler *arg1 = (_ProgressCancelHandler *) 0 ;
+  char *arg2 = (char *) 0 ;
+  long arg3 ;
+  int res2 ;
+  char *buf2 = 0 ;
+  int alloc2 = 0 ;
+  long val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  PyObject * obj3 = 0 ;
+  _THyPhy *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:new__THyPhy",&obj1,&obj2,&obj3)) SWIG_fail;
+  {
+    int res = SWIG_ConvertFunctionPtr(obj1, (void**)(&arg1), SWIGTYPE_p_f_p_char_int_double__bool);
+    if (!SWIG_IsOK(res)) {
+      SWIG_exception_fail(SWIG_ArgError(res), "in method '" "new__THyPhy" "', argument " "1"" of type '" "_ProgressCancelHandler *""'"); 
+    }
+  }
+  res2 = SWIG_AsCharPtrAndSize(obj2, &buf2, NULL, &alloc2);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "new__THyPhy" "', argument " "2"" of type '" "char const *""'");
+  }
+  arg2 = reinterpret_cast< char * >(buf2);
+  ecode3 = SWIG_AsVal_long(obj3, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "new__THyPhy" "', argument " "3"" of type '" "long""'");
+  } 
+  arg3 = static_cast< long >(val3);
+  result = (_THyPhy *)new _THyPhy(arg1,(char const *)arg2,arg3);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p__THyPhy, SWIG_BUILTIN_INIT |  0 );
+  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
+  return resultobj == Py_None ? 1 : 0;
+fail:
+  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
+  return -1;
+}
+
+
+SWIGINTERN int _wrap_new__THyPhy__SWIG_1(PyObject *self, PyObject *args) {
+  PyObject *resultobj = 0;
+  _ProgressCancelHandler *arg1 = (_ProgressCancelHandler *) 0 ;
+  char *arg2 = (char *) 0 ;
+  int res2 ;
+  char *buf2 = 0 ;
+  int alloc2 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  _THyPhy *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:new__THyPhy",&obj1,&obj2)) SWIG_fail;
+  {
+    int res = SWIG_ConvertFunctionPtr(obj1, (void**)(&arg1), SWIGTYPE_p_f_p_char_int_double__bool);
+    if (!SWIG_IsOK(res)) {
+      SWIG_exception_fail(SWIG_ArgError(res), "in method '" "new__THyPhy" "', argument " "1"" of type '" "_ProgressCancelHandler *""'"); 
+    }
+  }
+  res2 = SWIG_AsCharPtrAndSize(obj2, &buf2, NULL, &alloc2);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "new__THyPhy" "', argument " "2"" of type '" "char const *""'");
+  }
+  arg2 = reinterpret_cast< char * >(buf2);
+  result = (_THyPhy *)new _THyPhy(arg1,(char const *)arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p__THyPhy, SWIG_BUILTIN_INIT |  0 );
+  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
+  return resultobj == Py_None ? 1 : 0;
+fail:
+  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
+  return -1;
+}
+
+
+SWIGINTERN int _wrap_new__THyPhy__SWIG_2(PyObject *self, PyObject *args) {
+  PyObject *resultobj = 0;
+  char *arg1 = (char *) 0 ;
+  long arg2 ;
+  int res1 ;
+  char *buf1 = 0 ;
+  int alloc1 = 0 ;
+  long val2 ;
+  int ecode2 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  _THyPhy *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:new__THyPhy",&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_AsCharPtrAndSize(obj1, &buf1, NULL, &alloc1);
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new__THyPhy" "', argument " "1"" of type '" "char const *""'");
+  }
+  arg1 = reinterpret_cast< char * >(buf1);
+  ecode2 = SWIG_AsVal_long(obj2, &val2);
+  if (!SWIG_IsOK(ecode2)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode2), "in method '" "new__THyPhy" "', argument " "2"" of type '" "long""'");
+  } 
+  arg2 = static_cast< long >(val2);
+  result = (_THyPhy *)new _THyPhy((char const *)arg1,arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p__THyPhy, SWIG_BUILTIN_INIT |  0 );
+  if (alloc1 == SWIG_NEWOBJ) delete[] buf1;
+  return resultobj == Py_None ? 1 : 0;
+fail:
+  if (alloc1 == SWIG_NEWOBJ) delete[] buf1;
+  return -1;
+}
+
+
+SWIGINTERN int _wrap_new__THyPhy__SWIG_3(PyObject *self, PyObject *args) {
+  PyObject *resultobj = 0;
+  char *arg1 = (char *) 0 ;
+  int res1 ;
+  char *buf1 = 0 ;
+  int alloc1 = 0 ;
+  PyObject * obj1 = 0 ;
+  _THyPhy *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:new__THyPhy",&obj1)) SWIG_fail;
+  res1 = SWIG_AsCharPtrAndSize(obj1, &buf1, NULL, &alloc1);
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "new__THyPhy" "', argument " "1"" of type '" "char const *""'");
+  }
+  arg1 = reinterpret_cast< char * >(buf1);
+  result = (_THyPhy *)new _THyPhy((char const *)arg1);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p__THyPhy, SWIG_BUILTIN_INIT |  0 );
+  if (alloc1 == SWIG_NEWOBJ) delete[] buf1;
+  return resultobj == Py_None ? 1 : 0;
+fail:
+  if (alloc1 == SWIG_NEWOBJ) delete[] buf1;
+  return -1;
+}
+
+
+SWIGINTERN int _wrap_new__THyPhy(PyObject *self, PyObject *args) {
+  int argc;
+  PyObject *argv[4];
+  int ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? (int)PyObject_Length(args) : 0;
+  for (ii = 0; (ii < 3) && (ii < argc); ii++) {
+    argv[ii] = PyTuple_GET_ITEM(args,ii);
+  }
+  if (argc == 1) {
+    int _v;
+    int res = SWIG_AsCharPtrAndSize(argv[0], 0, NULL, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      return _wrap_new__THyPhy__SWIG_3(self, args);
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    void *ptr = 0;
+    int res = SWIG_ConvertFunctionPtr(argv[0], &ptr, SWIGTYPE_p_f_p_char_int_double__bool);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      int res = SWIG_AsCharPtrAndSize(argv[1], 0, NULL, 0);
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        return _wrap_new__THyPhy__SWIG_1(self, args);
+      }
+    }
+  }
+  if (argc == 2) {
+    int _v;
+    int res = SWIG_AsCharPtrAndSize(argv[0], 0, NULL, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      {
+        int res = SWIG_AsVal_long(argv[1], NULL);
+        _v = SWIG_CheckState(res);
+      }
+      if (_v) {
+        return _wrap_new__THyPhy__SWIG_2(self, args);
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    void *ptr = 0;
+    int res = SWIG_ConvertFunctionPtr(argv[0], &ptr, SWIGTYPE_p_f_p_char_int_double__bool);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      int res = SWIG_AsCharPtrAndSize(argv[1], 0, NULL, 0);
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        {
+          int res = SWIG_AsVal_long(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          return _wrap_new__THyPhy__SWIG_0(self, args);
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function 'new__THyPhy'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    _THyPhy::_THyPhy(_ProgressCancelHandler *,char const *,long)\n"
+    "    _THyPhy::_THyPhy(_ProgressCancelHandler *,char const *)\n"
+    "    _THyPhy::_THyPhy(char const *,long)\n"
+    "    _THyPhy::_THyPhy(char const *)\n");
+  return -1;
+}
+
+
+SWIGINTERN PyObject *_wrap_delete__THyPhy(PyObject *self, PyObject *args) {
+  PyObject *resultobj = 0;
+  _THyPhy *arg1 = (_THyPhy *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  
+  if (args && PyTuple_Check(args) && PyTuple_GET_SIZE(args) > 0) SWIG_fail;
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p__THyPhy, SWIG_POINTER_DISOWN |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "delete__THyPhy" "', argument " "1"" of type '" "_THyPhy *""'"); 
+  }
+  arg1 = reinterpret_cast< _THyPhy * >(argp1);
+  delete arg1;
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap__THyPhy_ExecuteBF__SWIG_0(PyObject *self, PyObject *args) {
+  PyObject *resultobj = 0;
+  _THyPhy *arg1 = (_THyPhy *) 0 ;
+  char *arg2 = (char *) 0 ;
+  bool arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int res2 ;
+  char *buf2 = 0 ;
+  int alloc2 = 0 ;
+  bool val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  _THyPhyString *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:_THyPhy_ExecuteBF",&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p__THyPhy, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "_THyPhy_ExecuteBF" "', argument " "1"" of type '" "_THyPhy *""'"); 
+  }
+  arg1 = reinterpret_cast< _THyPhy * >(argp1);
+  res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "_THyPhy_ExecuteBF" "', argument " "2"" of type '" "char const *""'");
+  }
+  arg2 = reinterpret_cast< char * >(buf2);
+  ecode3 = SWIG_AsVal_bool(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "_THyPhy_ExecuteBF" "', argument " "3"" of type '" "bool""'");
+  } 
+  arg3 = static_cast< bool >(val3);
+  result = (_THyPhyString *)(arg1)->ExecuteBF((char const *)arg2,arg3);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p__THyPhyString, 0 |  0 );
+  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
+  return resultobj;
+fail:
+  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap__THyPhy_ExecuteBF__SWIG_1(PyObject *self, PyObject *args) {
+  PyObject *resultobj = 0;
+  _THyPhy *arg1 = (_THyPhy *) 0 ;
+  char *arg2 = (char *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int res2 ;
+  char *buf2 = 0 ;
+  int alloc2 = 0 ;
+  PyObject * obj1 = 0 ;
+  _THyPhyString *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:_THyPhy_ExecuteBF",&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p__THyPhy, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "_THyPhy_ExecuteBF" "', argument " "1"" of type '" "_THyPhy *""'"); 
+  }
+  arg1 = reinterpret_cast< _THyPhy * >(argp1);
+  res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "_THyPhy_ExecuteBF" "', argument " "2"" of type '" "char const *""'");
+  }
+  arg2 = reinterpret_cast< char * >(buf2);
+  result = (_THyPhyString *)(arg1)->ExecuteBF((char const *)arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p__THyPhyString, 0 |  0 );
+  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
+  return resultobj;
+fail:
+  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap__THyPhy_ExecuteBF(PyObject *self, PyObject *args) {
+  int argc;
+  PyObject *argv[4];
+  int ii;
+  
+  if (!PyTuple_Check(args)) SWIG_fail;
+  argc = args ? (int)PyObject_Length(args) : 0;
+  argv[0] = self;
+  for (ii = 0; (ii < 2) && (ii < argc); ii++) {
+    argv[ii + 1] = PyTuple_GET_ITEM(args,ii);
+  }
+  argc++;
+  if (argc == 2) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p__THyPhy, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      int res = SWIG_AsCharPtrAndSize(argv[1], 0, NULL, 0);
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        return _wrap__THyPhy_ExecuteBF__SWIG_1(self, args);
+      }
+    }
+  }
+  if (argc == 3) {
+    int _v;
+    void *vptr = 0;
+    int res = SWIG_ConvertPtr(argv[0], &vptr, SWIGTYPE_p__THyPhy, 0);
+    _v = SWIG_CheckState(res);
+    if (_v) {
+      int res = SWIG_AsCharPtrAndSize(argv[1], 0, NULL, 0);
+      _v = SWIG_CheckState(res);
+      if (_v) {
+        {
+          int res = SWIG_AsVal_bool(argv[2], NULL);
+          _v = SWIG_CheckState(res);
+        }
+        if (_v) {
+          return _wrap__THyPhy_ExecuteBF__SWIG_0(self, args);
+        }
+      }
+    }
+  }
+  
+fail:
+  SWIG_SetErrorMsg(PyExc_NotImplementedError,"Wrong number or type of arguments for overloaded function '_THyPhy_ExecuteBF'.\n"
+    "  Possible C/C++ prototypes are:\n"
+    "    _THyPhy::ExecuteBF(char const *,bool)\n"
+    "    _THyPhy::ExecuteBF(char const *)\n");
+  return 0;
+}
+
+
+SWIGINTERN PyObject *_wrap__THyPhy_InitTHyPhy(PyObject *self, PyObject *args) {
+  PyObject *resultobj = 0;
+  _THyPhy *arg1 = (_THyPhy *) 0 ;
+  _ProgressCancelHandler *arg2 = (_ProgressCancelHandler *) 0 ;
+  char *arg3 = (char *) 0 ;
+  long arg4 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int res3 ;
+  char *buf3 = 0 ;
+  int alloc3 = 0 ;
+  long val4 ;
+  int ecode4 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  PyObject * obj3 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OOO:_THyPhy_InitTHyPhy",&obj1,&obj2,&obj3)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p__THyPhy, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "_THyPhy_InitTHyPhy" "', argument " "1"" of type '" "_THyPhy *""'"); 
+  }
+  arg1 = reinterpret_cast< _THyPhy * >(argp1);
+  {
+    int res = SWIG_ConvertFunctionPtr(obj1, (void**)(&arg2), SWIGTYPE_p_f_p_char_int_double__bool);
+    if (!SWIG_IsOK(res)) {
+      SWIG_exception_fail(SWIG_ArgError(res), "in method '" "_THyPhy_InitTHyPhy" "', argument " "2"" of type '" "_ProgressCancelHandler *""'"); 
+    }
+  }
+  res3 = SWIG_AsCharPtrAndSize(obj2, &buf3, NULL, &alloc3);
+  if (!SWIG_IsOK(res3)) {
+    SWIG_exception_fail(SWIG_ArgError(res3), "in method '" "_THyPhy_InitTHyPhy" "', argument " "3"" of type '" "char const *""'");
+  }
+  arg3 = reinterpret_cast< char * >(buf3);
+  ecode4 = SWIG_AsVal_long(obj3, &val4);
+  if (!SWIG_IsOK(ecode4)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode4), "in method '" "_THyPhy_InitTHyPhy" "', argument " "4"" of type '" "long""'");
+  } 
+  arg4 = static_cast< long >(val4);
+  (arg1)->InitTHyPhy(arg2,(char const *)arg3,arg4);
+  resultobj = SWIG_Py_Void();
+  if (alloc3 == SWIG_NEWOBJ) delete[] buf3;
+  return resultobj;
+fail:
+  if (alloc3 == SWIG_NEWOBJ) delete[] buf3;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap__THyPhy_ClearAll(PyObject *self, PyObject *args) {
+  PyObject *resultobj = 0;
+  _THyPhy *arg1 = (_THyPhy *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  
+  if (args && PyTuple_Check(args) && PyTuple_GET_SIZE(args) > 0) SWIG_fail;
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p__THyPhy, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "_THyPhy_ClearAll" "', argument " "1"" of type '" "_THyPhy *""'"); 
+  }
+  arg1 = reinterpret_cast< _THyPhy * >(argp1);
+  (arg1)->ClearAll();
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap__THyPhy_AskFor(PyObject *self, PyObject *args) {
+  PyObject *resultobj = 0;
+  _THyPhy *arg1 = (_THyPhy *) 0 ;
+  char *arg2 = (char *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int res2 ;
+  char *buf2 = 0 ;
+  int alloc2 = 0 ;
+  PyObject * obj1 = 0 ;
+  void *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:_THyPhy_AskFor",&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p__THyPhy, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "_THyPhy_AskFor" "', argument " "1"" of type '" "_THyPhy *""'"); 
+  }
+  arg1 = reinterpret_cast< _THyPhy * >(argp1);
+  res2 = SWIG_AsCharPtrAndSize(obj1, &buf2, NULL, &alloc2);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "_THyPhy_AskFor" "', argument " "2"" of type '" "char const *""'");
+  }
+  arg2 = reinterpret_cast< char * >(buf2);
+  result = (void *)(arg1)->AskFor((char const *)arg2);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_void, 0 |  0 );
+  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
+  return resultobj;
+fail:
+  if (alloc2 == SWIG_NEWOBJ) delete[] buf2;
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap__THyPhy_DumpResult(PyObject *self, PyObject *args) {
+  PyObject *resultobj = 0;
+  _THyPhy *arg1 = (_THyPhy *) 0 ;
+  void *arg2 = (void *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int res2 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:_THyPhy_DumpResult",&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p__THyPhy, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "_THyPhy_DumpResult" "', argument " "1"" of type '" "_THyPhy *""'"); 
+  }
+  arg1 = reinterpret_cast< _THyPhy * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1,SWIG_as_voidptrptr(&arg2), 0, 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "_THyPhy_DumpResult" "', argument " "2"" of type '" "void *""'"); 
+  }
+  (arg1)->DumpResult(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap__THyPhy_CanCast(PyObject *self, PyObject *args) {
+  PyObject *resultobj = 0;
+  _THyPhy *arg1 = (_THyPhy *) 0 ;
+  void *arg2 = (void *) 0 ;
+  int arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int res2 ;
+  int val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  bool result;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:_THyPhy_CanCast",&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p__THyPhy, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "_THyPhy_CanCast" "', argument " "1"" of type '" "_THyPhy *""'"); 
+  }
+  arg1 = reinterpret_cast< _THyPhy * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1,SWIG_as_voidptrptr(&arg2), 0, 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "_THyPhy_CanCast" "', argument " "2"" of type '" "void const *""'"); 
+  }
+  ecode3 = SWIG_AsVal_int(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "_THyPhy_CanCast" "', argument " "3"" of type '" "int""'");
+  } 
+  arg3 = static_cast< int >(val3);
+  result = (bool)(arg1)->CanCast((void const *)arg2,arg3);
+  resultobj = SWIG_From_bool(static_cast< bool >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap__THyPhy_CastResult(PyObject *self, PyObject *args) {
+  PyObject *resultobj = 0;
+  _THyPhy *arg1 = (_THyPhy *) 0 ;
+  void *arg2 = (void *) 0 ;
+  int arg3 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int res2 ;
+  int val3 ;
+  int ecode3 = 0 ;
+  PyObject * obj1 = 0 ;
+  PyObject * obj2 = 0 ;
+  _THyPhyReturnObject *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"OO:_THyPhy_CastResult",&obj1,&obj2)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p__THyPhy, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "_THyPhy_CastResult" "', argument " "1"" of type '" "_THyPhy *""'"); 
+  }
+  arg1 = reinterpret_cast< _THyPhy * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1,SWIG_as_voidptrptr(&arg2), 0, 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "_THyPhy_CastResult" "', argument " "2"" of type '" "void const *""'"); 
+  }
+  ecode3 = SWIG_AsVal_int(obj2, &val3);
+  if (!SWIG_IsOK(ecode3)) {
+    SWIG_exception_fail(SWIG_ArgError(ecode3), "in method '" "_THyPhy_CastResult" "', argument " "3"" of type '" "int""'");
+  } 
+  arg3 = static_cast< int >(val3);
+  result = (_THyPhyReturnObject *)(arg1)->CastResult((void const *)arg2,arg3);
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p__THyPhyReturnObject, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap__THyPhy_SetCallbackHandler(PyObject *self, PyObject *args) {
+  PyObject *resultobj = 0;
+  _THyPhy *arg1 = (_THyPhy *) 0 ;
+  _ProgressCancelHandler *arg2 = (_ProgressCancelHandler *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:_THyPhy_SetCallbackHandler",&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p__THyPhy, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "_THyPhy_SetCallbackHandler" "', argument " "1"" of type '" "_THyPhy *""'"); 
+  }
+  arg1 = reinterpret_cast< _THyPhy * >(argp1);
+  {
+    int res = SWIG_ConvertFunctionPtr(obj1, (void**)(&arg2), SWIGTYPE_p_f_p_char_int_double__bool);
+    if (!SWIG_IsOK(res)) {
+      SWIG_exception_fail(SWIG_ArgError(res), "in method '" "_THyPhy_SetCallbackHandler" "', argument " "2"" of type '" "_ProgressCancelHandler *""'"); 
+    }
+  }
+  (arg1)->SetCallbackHandler(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap__THyPhy_GetCallbackHandler(PyObject *self, PyObject *args) {
+  PyObject *resultobj = 0;
+  _THyPhy *arg1 = (_THyPhy *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  _ProgressCancelHandler *result = 0 ;
+  
+  if (args && PyTuple_Check(args) && PyTuple_GET_SIZE(args) > 0) SWIG_fail;
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p__THyPhy, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "_THyPhy_GetCallbackHandler" "', argument " "1"" of type '" "_THyPhy *""'"); 
+  }
+  arg1 = reinterpret_cast< _THyPhy * >(argp1);
+  result = (_ProgressCancelHandler *)(arg1)->GetCallbackHandler();
+  resultobj = SWIG_NewFunctionPtrObj((void *)(result), SWIGTYPE_p_f_p_char_int_double__bool);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap__THyPhy_GetWarnings(PyObject *self, PyObject *args) {
+  PyObject *resultobj = 0;
+  _THyPhy *arg1 = (_THyPhy *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  _THyPhyString *result = 0 ;
+  
+  if (args && PyTuple_Check(args) && PyTuple_GET_SIZE(args) > 0) SWIG_fail;
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p__THyPhy, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "_THyPhy_GetWarnings" "', argument " "1"" of type '" "_THyPhy *""'"); 
+  }
+  arg1 = reinterpret_cast< _THyPhy * >(argp1);
+  result = (_THyPhyString *)(arg1)->GetWarnings();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p__THyPhyString, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap__THyPhy_GetErrors(PyObject *self, PyObject *args) {
+  PyObject *resultobj = 0;
+  _THyPhy *arg1 = (_THyPhy *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  _THyPhyString *result = 0 ;
+  
+  if (args && PyTuple_Check(args) && PyTuple_GET_SIZE(args) > 0) SWIG_fail;
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p__THyPhy, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "_THyPhy_GetErrors" "', argument " "1"" of type '" "_THyPhy *""'"); 
+  }
+  arg1 = reinterpret_cast< _THyPhy * >(argp1);
+  result = (_THyPhyString *)(arg1)->GetErrors();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p__THyPhyString, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap__THyPhy_GetStdout(PyObject *self, PyObject *args) {
+  PyObject *resultobj = 0;
+  _THyPhy *arg1 = (_THyPhy *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  _THyPhyString *result = 0 ;
+  
+  if (args && PyTuple_Check(args) && PyTuple_GET_SIZE(args) > 0) SWIG_fail;
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p__THyPhy, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "_THyPhy_GetStdout" "', argument " "1"" of type '" "_THyPhy *""'"); 
+  }
+  arg1 = reinterpret_cast< _THyPhy * >(argp1);
+  result = (_THyPhyString *)(arg1)->GetStdout();
+  resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p__THyPhyString, 0 |  0 );
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap__THyPhy_PushWarning(PyObject *self, PyObject *args) {
+  PyObject *resultobj = 0;
+  _THyPhy *arg1 = (_THyPhy *) 0 ;
+  void *arg2 = (void *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int res2 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:_THyPhy_PushWarning",&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p__THyPhy, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "_THyPhy_PushWarning" "', argument " "1"" of type '" "_THyPhy *""'"); 
+  }
+  arg1 = reinterpret_cast< _THyPhy * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1,SWIG_as_voidptrptr(&arg2), 0, 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "_THyPhy_PushWarning" "', argument " "2"" of type '" "void *""'"); 
+  }
+  (arg1)->PushWarning(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap__THyPhy_PushError(PyObject *self, PyObject *args) {
+  PyObject *resultobj = 0;
+  _THyPhy *arg1 = (_THyPhy *) 0 ;
+  void *arg2 = (void *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int res2 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:_THyPhy_PushError",&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p__THyPhy, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "_THyPhy_PushError" "', argument " "1"" of type '" "_THyPhy *""'"); 
+  }
+  arg1 = reinterpret_cast< _THyPhy * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1,SWIG_as_voidptrptr(&arg2), 0, 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "_THyPhy_PushError" "', argument " "2"" of type '" "void *""'"); 
+  }
+  (arg1)->PushError(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap__THyPhy_PushOutString(PyObject *self, PyObject *args) {
+  PyObject *resultobj = 0;
+  _THyPhy *arg1 = (_THyPhy *) 0 ;
+  void *arg2 = (void *) 0 ;
+  void *argp1 = 0 ;
+  int res1 = 0 ;
+  int res2 ;
+  PyObject * obj1 = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)"O:_THyPhy_PushOutString",&obj1)) SWIG_fail;
+  res1 = SWIG_ConvertPtr(self, &argp1,SWIGTYPE_p__THyPhy, 0 |  0 );
+  if (!SWIG_IsOK(res1)) {
+    SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "_THyPhy_PushOutString" "', argument " "1"" of type '" "_THyPhy *""'"); 
+  }
+  arg1 = reinterpret_cast< _THyPhy * >(argp1);
+  res2 = SWIG_ConvertPtr(obj1,SWIG_as_voidptrptr(&arg2), 0, 0);
+  if (!SWIG_IsOK(res2)) {
+    SWIG_exception_fail(SWIG_ArgError(res2), "in method '" "_THyPhy_PushOutString" "', argument " "2"" of type '" "void *""'"); 
+  }
+  (arg1)->PushOutString(arg2);
+  resultobj = SWIG_Py_Void();
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap__THyPhyGetLongStatus(PyObject *self, PyObject *args) {
+  PyObject *resultobj = 0;
+  long result;
+  
+  if (!PyArg_ParseTuple(args,(char *)":_THyPhyGetLongStatus")) SWIG_fail;
+  result = (long)_THyPhyGetLongStatus();
+  resultobj = SWIG_From_long(static_cast< long >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap__THyPhyGetStringStatus(PyObject *self, PyObject *args) {
+  PyObject *resultobj = 0;
+  char *result = 0 ;
+  
+  if (!PyArg_ParseTuple(args,(char *)":_THyPhyGetStringStatus")) SWIG_fail;
+  result = (char *)_THyPhyGetStringStatus();
+  resultobj = SWIG_FromCharPtr((const char *)result);
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN PyObject *_wrap__THyPhyGetDoubleStatus(PyObject *self, PyObject *args) {
+  PyObject *resultobj = 0;
+  double result;
+  
+  if (!PyArg_ParseTuple(args,(char *)":_THyPhyGetDoubleStatus")) SWIG_fail;
+  result = (double)_THyPhyGetDoubleStatus();
+  resultobj = SWIG_From_double(static_cast< double >(result));
+  return resultobj;
+fail:
+  return NULL;
+}
+
+
+SWIGINTERN int Swig_var_globalInterfaceInstance_set(PyObject *_val) {
+  {
+    void *argp = 0;
+    int res = SWIG_ConvertPtr(_val, &argp, SWIGTYPE_p__THyPhy,  0 );  
+    if (!SWIG_IsOK(res)) {
+      SWIG_exception_fail(SWIG_ArgError(res), "in variable '""globalInterfaceInstance""' of type '""_THyPhy *""'");
+    }
+    globalInterfaceInstance = reinterpret_cast< _THyPhy * >(argp);
+  }
+  return 0;
+fail:
+  return 1;
+}
+
+
+SWIGINTERN PyObject *Swig_var_globalInterfaceInstance_get(void) {
+  PyObject *pyobj = 0;
+  PyObject *self = 0;
+  
+  (void)self;
+  pyobj = SWIG_NewPointerObj(SWIG_as_voidptr(globalInterfaceInstance), SWIGTYPE_p__THyPhy,  0 );
+  return pyobj;
+}
+
+
+static PyMethodDef SwigMethods[] = {
+	 { (char *)"SWIG_PyInstanceMethod_New", (PyCFunction)SWIG_PyInstanceMethod_New, METH_O, NULL},
+	 { (char *)"_THyPhyGetLongStatus", _wrap__THyPhyGetLongStatus, METH_VARARGS, NULL},
+	 { (char *)"_THyPhyGetStringStatus", _wrap__THyPhyGetStringStatus, METH_VARARGS, NULL},
+	 { (char *)"_THyPhyGetDoubleStatus", _wrap__THyPhyGetDoubleStatus, METH_VARARGS, NULL},
+	 { NULL, NULL, 0, NULL }
+};
+
+SWIGPY_DESTRUCTOR_CLOSURE(_wrap_delete__THyPhyReturnObject)
+SWIGINTERN PyGetSetDef SwigPyBuiltin___THyPhyReturnObject_getset[] = {
+    {NULL, NULL, NULL, NULL, NULL} /* Sentinel */
+};
+
+SWIGINTERN PyObject *
+SwigPyBuiltin___THyPhyReturnObject_richcompare(PyObject *self, PyObject *other, int op) {
+  PyObject *result = NULL;
+  PyObject *tuple = PyTuple_New(1);
+  assert(tuple);
+  PyTuple_SET_ITEM(tuple, 0, other);
+  Py_XINCREF(other);
+  if (!result) {
+    if (SwigPyObject_Check(self) && SwigPyObject_Check(other)) {
+      result = SwigPyObject_richcompare((SwigPyObject *)self, (SwigPyObject *)other, op);
+    } else {
+      result = Py_NotImplemented;
+      Py_INCREF(result);
+    }
+  }
+  Py_DECREF(tuple);
+  return result;
+}
+
+SWIGINTERN PyMethodDef SwigPyBuiltin___THyPhyReturnObject_methods[] = {
+  { "myType", (PyCFunction) _wrap__THyPhyReturnObject_myType, METH_VARARGS, (char*) "" },
+  { "castToString", (PyCFunction) _wrap__THyPhyReturnObject_castToString, METH_VARARGS, (char*) "" },
+  { "castToNumber", (PyCFunction) _wrap__THyPhyReturnObject_castToNumber, METH_VARARGS, (char*) "" },
+  { "castToMatrix", (PyCFunction) _wrap__THyPhyReturnObject_castToMatrix, METH_VARARGS, (char*) "" },
+  { NULL, NULL, 0, NULL } /* Sentinel */
+};
+
+static PyHeapTypeObject SwigPyBuiltin___THyPhyReturnObject_type = {
+  {
+#if PY_VERSION_HEX >= 0x03000000
+    PyVarObject_HEAD_INIT(NULL, 0)
+#else
+    PyObject_HEAD_INIT(NULL)
+    0,                                        /* ob_size */
+#endif
+    "_THyPhyReturnObject",                    /* tp_name */
+    sizeof(SwigPyObject),                     /* tp_basicsize */
+    0,                                        /* tp_itemsize */
+    (destructor) _wrap_delete__THyPhyReturnObject_closure, /* tp_dealloc */
+    (printfunc) 0,                            /* tp_print */
+    (getattrfunc) 0,                          /* tp_getattr */
+    (setattrfunc) 0,                          /* tp_setattr */
+#if PY_VERSION_HEX >= 0x03000000
+    0,                                        /* tp_compare */
+#else
+    (cmpfunc) 0,                              /* tp_compare */
+#endif
+    (reprfunc) 0,                             /* tp_repr */
+    &SwigPyBuiltin___THyPhyReturnObject_type.as_number,      /* tp_as_number */
+    &SwigPyBuiltin___THyPhyReturnObject_type.as_sequence,    /* tp_as_sequence */
+    &SwigPyBuiltin___THyPhyReturnObject_type.as_mapping,     /* tp_as_mapping */
+    (hashfunc) 0,                             /* tp_hash */
+    (ternaryfunc) 0,                          /* tp_call */
+    (reprfunc) 0,                             /* tp_str */
+    (getattrofunc) 0,                         /* tp_getattro */
+    (setattrofunc) 0,                         /* tp_setattro */
+    &SwigPyBuiltin___THyPhyReturnObject_type.as_buffer,      /* tp_as_buffer */
+#if PY_VERSION_HEX >= 0x03000000
+    Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE,   /* tp_flags */
+#else
+    Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_CHECKTYPES, /* tp_flags */
+#endif
+    "::_THyPhyReturnObject",                  /* tp_doc */
+    (traverseproc) 0,                         /* tp_traverse */
+    (inquiry) 0,                              /* tp_clear */
+    (richcmpfunc) SwigPyBuiltin___THyPhyReturnObject_richcompare, /* feature:python:tp_richcompare */
+    0,                                        /* tp_weaklistoffset */
+    (getiterfunc) 0,                          /* tp_iter */
+    (iternextfunc) 0,                         /* tp_iternext */
+    SwigPyBuiltin___THyPhyReturnObject_methods, /* tp_methods */
+    0,                                        /* tp_members */
+    SwigPyBuiltin___THyPhyReturnObject_getset, /* tp_getset */
+    0,                                        /* tp_base */
+    0,                                        /* tp_dict */
+    (descrgetfunc) 0,                         /* tp_descr_get */
+    (descrsetfunc) 0,                         /* tp_descr_set */
+    (size_t)(((char*)&((SwigPyObject *) 64L)->dict) - (char*) 64L), /* tp_dictoffset */
+    (initproc) SwigPyBuiltin_BadInit,         /* tp_init */
+    (allocfunc) 0,                            /* tp_alloc */
+    (newfunc) 0,                              /* tp_new */
+    (freefunc) 0,                             /* tp_free */
+    (inquiry) 0,                              /* tp_is_gc */
+    (PyObject*) 0,                            /* tp_bases */
+    (PyObject*) 0,                            /* tp_mro */
+    (PyObject*) 0,                            /* tp_cache */
+    (PyObject*) 0,                            /* tp_subclasses */
+    (PyObject*) 0,                            /* tp_weaklist */
+    (destructor) 0,                           /* tp_del */
+#if PY_VERSION_HEX >= 0x02060000
+    (int) 0,                                  /* tp_version_tag */
+#endif
+  },
+  {
+    (binaryfunc) 0,                           /* nb_add */
+    (binaryfunc) 0,                           /* nb_subtract */
+    (binaryfunc) 0,                           /* nb_multiply */
+#if PY_VERSION_HEX < 0x03000000
+    (binaryfunc) 0,                           /* nb_divide */
+#endif
+    (binaryfunc) 0,                           /* nb_remainder */
+    (binaryfunc) 0,                           /* nb_divmod */
+    (ternaryfunc) 0,                          /* nb_power */
+    (unaryfunc) 0,                            /* nb_negative */
+    (unaryfunc) 0,                            /* nb_positive */
+    (unaryfunc) 0,                            /* nb_absolute */
+    (inquiry) 0,                              /* nb_nonzero */
+    (unaryfunc) 0,                            /* nb_invert */
+    (binaryfunc) 0,                           /* nb_lshift */
+    (binaryfunc) 0,                           /* nb_rshift */
+    (binaryfunc) 0,                           /* nb_and */
+    (binaryfunc) 0,                           /* nb_xor */
+    (binaryfunc) 0,                           /* nb_or */
+#if PY_VERSION_HEX < 0x03000000
+    (coercion) 0,                             /* nb_coerce */
+#endif
+    (unaryfunc) 0,                            /* nb_int */
+#if PY_VERSION_HEX >= 0x03000000
+    (void*) 0,                                /* nb_reserved */
+#else
+    (unaryfunc) 0,                            /* nb_long */
+#endif
+    (unaryfunc) 0,                            /* nb_float */
+#if PY_VERSION_HEX < 0x03000000
+    (unaryfunc) 0,                            /* nb_oct */
+    (unaryfunc) 0,                            /* nb_hex */
+#endif
+    (binaryfunc) 0,                           /* nb_inplace_add */
+    (binaryfunc) 0,                           /* nb_inplace_subtract */
+    (binaryfunc) 0,                           /* nb_inplace_multiply */
+#if PY_VERSION_HEX < 0x03000000
+    (binaryfunc) 0,                           /* nb_inplace_divide */
+#endif
+    (binaryfunc) 0,                           /* nb_inplace_remainder */
+    (ternaryfunc) 0,                          /* nb_inplace_power */
+    (binaryfunc) 0,                           /* nb_inplace_lshift */
+    (binaryfunc) 0,                           /* nb_inplace_rshift */
+    (binaryfunc) 0,                           /* nb_inplace_and */
+    (binaryfunc) 0,                           /* nb_inplace_xor */
+    (binaryfunc) 0,                           /* nb_inplace_or */
+    (binaryfunc) 0,                           /* nb_floor_divide */
+    (binaryfunc) 0,                           /* nb_true_divide */
+    (binaryfunc) 0,                           /* nb_inplace_floor_divide */
+    (binaryfunc) 0,                           /* nb_inplace_true_divide */
+#if PY_VERSION_HEX >= 0x02050000
+    (unaryfunc) 0,                            /* nb_index */
+#endif
+  },
+  {
+    (lenfunc) 0,                              /* mp_length */
+    (binaryfunc) 0,                           /* mp_subscript */
+    (objobjargproc) 0,                        /* mp_ass_subscript */
+  },
+  {
+    (lenfunc) 0,                              /* sq_length */
+    (binaryfunc) 0,                           /* sq_concat */
+    (ssizeargfunc) 0,                         /* sq_repeat */
+    (ssizeargfunc) 0,                         /* sq_item */
+#if PY_VERSION_HEX >= 0x03000000
+    (void*) 0,                                /* was_sq_slice */
+#else
+    (ssizessizeargfunc) 0,                    /* sq_slice */
+#endif
+    (ssizeobjargproc) 0,                      /* sq_ass_item */
+#if PY_VERSION_HEX >= 0x03000000
+    (void*) 0,                                /* was_sq_ass_slice */
+#else
+    (ssizessizeobjargproc) 0,                 /* sq_ass_slice */
+#endif
+    (objobjproc) 0,                           /* sq_contains */
+    (binaryfunc) 0,                           /* sq_inplace_concat */
+    (ssizeargfunc) 0,                         /* sq_inplace_repeat */
+  },
+  {
+#if PY_VERSION_HEX < 0x03000000
+    (readbufferproc) 0,                       /* bf_getreadbuffer */
+    (writebufferproc) 0,                      /* bf_getwritebuffer */
+    (segcountproc) 0,                         /* bf_getsegcount */
+    (charbufferproc) 0,                       /* bf_getcharbuffer */
+#endif
+#if PY_VERSION_HEX >= 0x02060000
+    (getbufferproc) 0,                        /* bf_getbuffer */
+    (releasebufferproc) 0,                    /* bf_releasebuffer */
+#endif
+  },
+    (PyObject*) 0,                            /* ht_name */
+    (PyObject*) 0,                            /* ht_slots */
+};
+
+SWIGINTERN SwigPyClientData SwigPyBuiltin___THyPhyReturnObject_clientdata = {0, 0, 0, 0, 0, 0, (PyTypeObject *)&SwigPyBuiltin___THyPhyReturnObject_type};
+
+SWIGPY_DESTRUCTOR_CLOSURE(_wrap_delete__THyPhyString)
+static SwigPyGetSet _THyPhyString_sData_getset = { _wrap__THyPhyString_sData_get, _wrap__THyPhyString_sData_set };
+static SwigPyGetSet _THyPhyString_sLength_getset = { _wrap__THyPhyString_sLength_get, _wrap__THyPhyString_sLength_set };
+SWIGINTERN PyGetSetDef SwigPyBuiltin___THyPhyString_getset[] = {
+    { (char*) "sData", (getter) SwigPyBuiltin_GetterClosure, (setter) SwigPyBuiltin_SetterClosure, (char*)"_THyPhyString.sData", (void*) &_THyPhyString_sData_getset }
+,
+    { (char*) "sLength", (getter) SwigPyBuiltin_GetterClosure, (setter) SwigPyBuiltin_SetterClosure, (char*)"_THyPhyString.sLength", (void*) &_THyPhyString_sLength_getset }
+,
+    {NULL, NULL, NULL, NULL, NULL} /* Sentinel */
+};
+
+SWIGINTERN PyObject *
+SwigPyBuiltin___THyPhyString_richcompare(PyObject *self, PyObject *other, int op) {
+  PyObject *result = NULL;
+  PyObject *tuple = PyTuple_New(1);
+  assert(tuple);
+  PyTuple_SET_ITEM(tuple, 0, other);
+  Py_XINCREF(other);
+  if (!result) {
+    if (SwigPyObject_Check(self) && SwigPyObject_Check(other)) {
+      result = SwigPyObject_richcompare((SwigPyObject *)self, (SwigPyObject *)other, op);
+    } else {
+      result = Py_NotImplemented;
+      Py_INCREF(result);
+    }
+  }
+  Py_DECREF(tuple);
+  return result;
+}
+
+SWIGINTERN PyMethodDef SwigPyBuiltin___THyPhyString_methods[] = {
+  { "myType", (PyCFunction) _wrap__THyPhyString_myType, METH_VARARGS, (char*) "" },
+  { NULL, NULL, 0, NULL } /* Sentinel */
+};
+
+static PyHeapTypeObject SwigPyBuiltin___THyPhyString_type = {
+  {
+#if PY_VERSION_HEX >= 0x03000000
+    PyVarObject_HEAD_INIT(NULL, 0)
+#else
+    PyObject_HEAD_INIT(NULL)
+    0,                                        /* ob_size */
+#endif
+    "_THyPhyString",                          /* tp_name */
+    sizeof(SwigPyObject),                     /* tp_basicsize */
+    0,                                        /* tp_itemsize */
+    (destructor) _wrap_delete__THyPhyString_closure, /* tp_dealloc */
+    (printfunc) 0,                            /* tp_print */
+    (getattrfunc) 0,                          /* tp_getattr */
+    (setattrfunc) 0,                          /* tp_setattr */
+#if PY_VERSION_HEX >= 0x03000000
+    0,                                        /* tp_compare */
+#else
+    (cmpfunc) 0,                              /* tp_compare */
+#endif
+    (reprfunc) 0,                             /* tp_repr */
+    &SwigPyBuiltin___THyPhyString_type.as_number,      /* tp_as_number */
+    &SwigPyBuiltin___THyPhyString_type.as_sequence,    /* tp_as_sequence */
+    &SwigPyBuiltin___THyPhyString_type.as_mapping,     /* tp_as_mapping */
+    (hashfunc) 0,                             /* tp_hash */
+    (ternaryfunc) 0,                          /* tp_call */
+    (reprfunc) 0,                             /* tp_str */
+    (getattrofunc) 0,                         /* tp_getattro */
+    (setattrofunc) 0,                         /* tp_setattro */
+    &SwigPyBuiltin___THyPhyString_type.as_buffer,      /* tp_as_buffer */
+#if PY_VERSION_HEX >= 0x03000000
+    Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE,   /* tp_flags */
+#else
+    Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_CHECKTYPES, /* tp_flags */
+#endif
+    "::_THyPhyString",                        /* tp_doc */
+    (traverseproc) 0,                         /* tp_traverse */
+    (inquiry) 0,                              /* tp_clear */
+    (richcmpfunc) SwigPyBuiltin___THyPhyString_richcompare, /* feature:python:tp_richcompare */
+    0,                                        /* tp_weaklistoffset */
+    (getiterfunc) 0,                          /* tp_iter */
+    (iternextfunc) 0,                         /* tp_iternext */
+    SwigPyBuiltin___THyPhyString_methods,     /* tp_methods */
+    0,                                        /* tp_members */
+    SwigPyBuiltin___THyPhyString_getset,      /* tp_getset */
+    0,                                        /* tp_base */
+    0,                                        /* tp_dict */
+    (descrgetfunc) 0,                         /* tp_descr_get */
+    (descrsetfunc) 0,                         /* tp_descr_set */
+    (size_t)(((char*)&((SwigPyObject *) 64L)->dict) - (char*) 64L), /* tp_dictoffset */
+    (initproc) _wrap_new__THyPhyString,       /* tp_init */
+    (allocfunc) 0,                            /* tp_alloc */
+    (newfunc) 0,                              /* tp_new */
+    (freefunc) 0,                             /* tp_free */
+    (inquiry) 0,                              /* tp_is_gc */
+    (PyObject*) 0,                            /* tp_bases */
+    (PyObject*) 0,                            /* tp_mro */
+    (PyObject*) 0,                            /* tp_cache */
+    (PyObject*) 0,                            /* tp_subclasses */
+    (PyObject*) 0,                            /* tp_weaklist */
+    (destructor) 0,                           /* tp_del */
+#if PY_VERSION_HEX >= 0x02060000
+    (int) 0,                                  /* tp_version_tag */
+#endif
+  },
+  {
+    (binaryfunc) 0,                           /* nb_add */
+    (binaryfunc) 0,                           /* nb_subtract */
+    (binaryfunc) 0,                           /* nb_multiply */
+#if PY_VERSION_HEX < 0x03000000
+    (binaryfunc) 0,                           /* nb_divide */
+#endif
+    (binaryfunc) 0,                           /* nb_remainder */
+    (binaryfunc) 0,                           /* nb_divmod */
+    (ternaryfunc) 0,                          /* nb_power */
+    (unaryfunc) 0,                            /* nb_negative */
+    (unaryfunc) 0,                            /* nb_positive */
+    (unaryfunc) 0,                            /* nb_absolute */
+    (inquiry) 0,                              /* nb_nonzero */
+    (unaryfunc) 0,                            /* nb_invert */
+    (binaryfunc) 0,                           /* nb_lshift */
+    (binaryfunc) 0,                           /* nb_rshift */
+    (binaryfunc) 0,                           /* nb_and */
+    (binaryfunc) 0,                           /* nb_xor */
+    (binaryfunc) 0,                           /* nb_or */
+#if PY_VERSION_HEX < 0x03000000
+    (coercion) 0,                             /* nb_coerce */
+#endif
+    (unaryfunc) 0,                            /* nb_int */
+#if PY_VERSION_HEX >= 0x03000000
+    (void*) 0,                                /* nb_reserved */
+#else
+    (unaryfunc) 0,                            /* nb_long */
+#endif
+    (unaryfunc) 0,                            /* nb_float */
+#if PY_VERSION_HEX < 0x03000000
+    (unaryfunc) 0,                            /* nb_oct */
+    (unaryfunc) 0,                            /* nb_hex */
+#endif
+    (binaryfunc) 0,                           /* nb_inplace_add */
+    (binaryfunc) 0,                           /* nb_inplace_subtract */
+    (binaryfunc) 0,                           /* nb_inplace_multiply */
+#if PY_VERSION_HEX < 0x03000000
+    (binaryfunc) 0,                           /* nb_inplace_divide */
+#endif
+    (binaryfunc) 0,                           /* nb_inplace_remainder */
+    (ternaryfunc) 0,                          /* nb_inplace_power */
+    (binaryfunc) 0,                           /* nb_inplace_lshift */
+    (binaryfunc) 0,                           /* nb_inplace_rshift */
+    (binaryfunc) 0,                           /* nb_inplace_and */
+    (binaryfunc) 0,                           /* nb_inplace_xor */
+    (binaryfunc) 0,                           /* nb_inplace_or */
+    (binaryfunc) 0,                           /* nb_floor_divide */
+    (binaryfunc) 0,                           /* nb_true_divide */
+    (binaryfunc) 0,                           /* nb_inplace_floor_divide */
+    (binaryfunc) 0,                           /* nb_inplace_true_divide */
+#if PY_VERSION_HEX >= 0x02050000
+    (unaryfunc) 0,                            /* nb_index */
+#endif
+  },
+  {
+    (lenfunc) 0,                              /* mp_length */
+    (binaryfunc) 0,                           /* mp_subscript */
+    (objobjargproc) 0,                        /* mp_ass_subscript */
+  },
+  {
+    (lenfunc) 0,                              /* sq_length */
+    (binaryfunc) 0,                           /* sq_concat */
+    (ssizeargfunc) 0,                         /* sq_repeat */
+    (ssizeargfunc) 0,                         /* sq_item */
+#if PY_VERSION_HEX >= 0x03000000
+    (void*) 0,                                /* was_sq_slice */
+#else
+    (ssizessizeargfunc) 0,                    /* sq_slice */
+#endif
+    (ssizeobjargproc) 0,                      /* sq_ass_item */
+#if PY_VERSION_HEX >= 0x03000000
+    (void*) 0,                                /* was_sq_ass_slice */
+#else
+    (ssizessizeobjargproc) 0,                 /* sq_ass_slice */
+#endif
+    (objobjproc) 0,                           /* sq_contains */
+    (binaryfunc) 0,                           /* sq_inplace_concat */
+    (ssizeargfunc) 0,                         /* sq_inplace_repeat */
+  },
+  {
+#if PY_VERSION_HEX < 0x03000000
+    (readbufferproc) 0,                       /* bf_getreadbuffer */
+    (writebufferproc) 0,                      /* bf_getwritebuffer */
+    (segcountproc) 0,                         /* bf_getsegcount */
+    (charbufferproc) 0,                       /* bf_getcharbuffer */
+#endif
+#if PY_VERSION_HEX >= 0x02060000
+    (getbufferproc) 0,                        /* bf_getbuffer */
+    (releasebufferproc) 0,                    /* bf_releasebuffer */
+#endif
+  },
+    (PyObject*) 0,                            /* ht_name */
+    (PyObject*) 0,                            /* ht_slots */
+};
+
+SWIGINTERN SwigPyClientData SwigPyBuiltin___THyPhyString_clientdata = {0, 0, 0, 0, 0, 0, (PyTypeObject *)&SwigPyBuiltin___THyPhyString_type};
+
+SWIGPY_DESTRUCTOR_CLOSURE(_wrap_delete__THyPhyNumber)
+static SwigPyGetSet _THyPhyNumber_nValue_getset = { _wrap__THyPhyNumber_nValue_get, _wrap__THyPhyNumber_nValue_set };
+SWIGINTERN PyGetSetDef SwigPyBuiltin___THyPhyNumber_getset[] = {
+    { (char*) "nValue", (getter) SwigPyBuiltin_GetterClosure, (setter) SwigPyBuiltin_SetterClosure, (char*)"_THyPhyNumber.nValue", (void*) &_THyPhyNumber_nValue_getset }
+,
+    {NULL, NULL, NULL, NULL, NULL} /* Sentinel */
+};
+
+SWIGINTERN PyObject *
+SwigPyBuiltin___THyPhyNumber_richcompare(PyObject *self, PyObject *other, int op) {
+  PyObject *result = NULL;
+  PyObject *tuple = PyTuple_New(1);
+  assert(tuple);
+  PyTuple_SET_ITEM(tuple, 0, other);
+  Py_XINCREF(other);
+  if (!result) {
+    if (SwigPyObject_Check(self) && SwigPyObject_Check(other)) {
+      result = SwigPyObject_richcompare((SwigPyObject *)self, (SwigPyObject *)other, op);
+    } else {
+      result = Py_NotImplemented;
+      Py_INCREF(result);
+    }
+  }
+  Py_DECREF(tuple);
+  return result;
+}
+
+SWIGINTERN PyMethodDef SwigPyBuiltin___THyPhyNumber_methods[] = {
+  { "myType", (PyCFunction) _wrap__THyPhyNumber_myType, METH_VARARGS, (char*) "" },
+  { NULL, NULL, 0, NULL } /* Sentinel */
+};
+
+static PyHeapTypeObject SwigPyBuiltin___THyPhyNumber_type = {
+  {
+#if PY_VERSION_HEX >= 0x03000000
+    PyVarObject_HEAD_INIT(NULL, 0)
+#else
+    PyObject_HEAD_INIT(NULL)
+    0,                                        /* ob_size */
+#endif
+    "_THyPhyNumber",                          /* tp_name */
+    sizeof(SwigPyObject),                     /* tp_basicsize */
+    0,                                        /* tp_itemsize */
+    (destructor) _wrap_delete__THyPhyNumber_closure, /* tp_dealloc */
+    (printfunc) 0,                            /* tp_print */
+    (getattrfunc) 0,                          /* tp_getattr */
+    (setattrfunc) 0,                          /* tp_setattr */
+#if PY_VERSION_HEX >= 0x03000000
+    0,                                        /* tp_compare */
+#else
+    (cmpfunc) 0,                              /* tp_compare */
+#endif
+    (reprfunc) 0,                             /* tp_repr */
+    &SwigPyBuiltin___THyPhyNumber_type.as_number,      /* tp_as_number */
+    &SwigPyBuiltin___THyPhyNumber_type.as_sequence,    /* tp_as_sequence */
+    &SwigPyBuiltin___THyPhyNumber_type.as_mapping,     /* tp_as_mapping */
+    (hashfunc) 0,                             /* tp_hash */
+    (ternaryfunc) 0,                          /* tp_call */
+    (reprfunc) 0,                             /* tp_str */
+    (getattrofunc) 0,                         /* tp_getattro */
+    (setattrofunc) 0,                         /* tp_setattro */
+    &SwigPyBuiltin___THyPhyNumber_type.as_buffer,      /* tp_as_buffer */
+#if PY_VERSION_HEX >= 0x03000000
+    Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE,   /* tp_flags */
+#else
+    Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_CHECKTYPES, /* tp_flags */
+#endif
+    "::_THyPhyNumber",                        /* tp_doc */
+    (traverseproc) 0,                         /* tp_traverse */
+    (inquiry) 0,                              /* tp_clear */
+    (richcmpfunc) SwigPyBuiltin___THyPhyNumber_richcompare, /* feature:python:tp_richcompare */
+    0,                                        /* tp_weaklistoffset */
+    (getiterfunc) 0,                          /* tp_iter */
+    (iternextfunc) 0,                         /* tp_iternext */
+    SwigPyBuiltin___THyPhyNumber_methods,     /* tp_methods */
+    0,                                        /* tp_members */
+    SwigPyBuiltin___THyPhyNumber_getset,      /* tp_getset */
+    0,                                        /* tp_base */
+    0,                                        /* tp_dict */
+    (descrgetfunc) 0,                         /* tp_descr_get */
+    (descrsetfunc) 0,                         /* tp_descr_set */
+    (size_t)(((char*)&((SwigPyObject *) 64L)->dict) - (char*) 64L), /* tp_dictoffset */
+    (initproc) _wrap_new__THyPhyNumber,       /* tp_init */
+    (allocfunc) 0,                            /* tp_alloc */
+    (newfunc) 0,                              /* tp_new */
+    (freefunc) 0,                             /* tp_free */
+    (inquiry) 0,                              /* tp_is_gc */
+    (PyObject*) 0,                            /* tp_bases */
+    (PyObject*) 0,                            /* tp_mro */
+    (PyObject*) 0,                            /* tp_cache */
+    (PyObject*) 0,                            /* tp_subclasses */
+    (PyObject*) 0,                            /* tp_weaklist */
+    (destructor) 0,                           /* tp_del */
+#if PY_VERSION_HEX >= 0x02060000
+    (int) 0,                                  /* tp_version_tag */
+#endif
+  },
+  {
+    (binaryfunc) 0,                           /* nb_add */
+    (binaryfunc) 0,                           /* nb_subtract */
+    (binaryfunc) 0,                           /* nb_multiply */
+#if PY_VERSION_HEX < 0x03000000
+    (binaryfunc) 0,                           /* nb_divide */
+#endif
+    (binaryfunc) 0,                           /* nb_remainder */
+    (binaryfunc) 0,                           /* nb_divmod */
+    (ternaryfunc) 0,                          /* nb_power */
+    (unaryfunc) 0,                            /* nb_negative */
+    (unaryfunc) 0,                            /* nb_positive */
+    (unaryfunc) 0,                            /* nb_absolute */
+    (inquiry) 0,                              /* nb_nonzero */
+    (unaryfunc) 0,                            /* nb_invert */
+    (binaryfunc) 0,                           /* nb_lshift */
+    (binaryfunc) 0,                           /* nb_rshift */
+    (binaryfunc) 0,                           /* nb_and */
+    (binaryfunc) 0,                           /* nb_xor */
+    (binaryfunc) 0,                           /* nb_or */
+#if PY_VERSION_HEX < 0x03000000
+    (coercion) 0,                             /* nb_coerce */
+#endif
+    (unaryfunc) 0,                            /* nb_int */
+#if PY_VERSION_HEX >= 0x03000000
+    (void*) 0,                                /* nb_reserved */
+#else
+    (unaryfunc) 0,                            /* nb_long */
+#endif
+    (unaryfunc) 0,                            /* nb_float */
+#if PY_VERSION_HEX < 0x03000000
+    (unaryfunc) 0,                            /* nb_oct */
+    (unaryfunc) 0,                            /* nb_hex */
+#endif
+    (binaryfunc) 0,                           /* nb_inplace_add */
+    (binaryfunc) 0,                           /* nb_inplace_subtract */
+    (binaryfunc) 0,                           /* nb_inplace_multiply */
+#if PY_VERSION_HEX < 0x03000000
+    (binaryfunc) 0,                           /* nb_inplace_divide */
+#endif
+    (binaryfunc) 0,                           /* nb_inplace_remainder */
+    (ternaryfunc) 0,                          /* nb_inplace_power */
+    (binaryfunc) 0,                           /* nb_inplace_lshift */
+    (binaryfunc) 0,                           /* nb_inplace_rshift */
+    (binaryfunc) 0,                           /* nb_inplace_and */
+    (binaryfunc) 0,                           /* nb_inplace_xor */
+    (binaryfunc) 0,                           /* nb_inplace_or */
+    (binaryfunc) 0,                           /* nb_floor_divide */
+    (binaryfunc) 0,                           /* nb_true_divide */
+    (binaryfunc) 0,                           /* nb_inplace_floor_divide */
+    (binaryfunc) 0,                           /* nb_inplace_true_divide */
+#if PY_VERSION_HEX >= 0x02050000
+    (unaryfunc) 0,                            /* nb_index */
+#endif
+  },
+  {
+    (lenfunc) 0,                              /* mp_length */
+    (binaryfunc) 0,                           /* mp_subscript */
+    (objobjargproc) 0,                        /* mp_ass_subscript */
+  },
+  {
+    (lenfunc) 0,                              /* sq_length */
+    (binaryfunc) 0,                           /* sq_concat */
+    (ssizeargfunc) 0,                         /* sq_repeat */
+    (ssizeargfunc) 0,                         /* sq_item */
+#if PY_VERSION_HEX >= 0x03000000
+    (void*) 0,                                /* was_sq_slice */
+#else
+    (ssizessizeargfunc) 0,                    /* sq_slice */
+#endif
+    (ssizeobjargproc) 0,                      /* sq_ass_item */
+#if PY_VERSION_HEX >= 0x03000000
+    (void*) 0,                                /* was_sq_ass_slice */
+#else
+    (ssizessizeobjargproc) 0,                 /* sq_ass_slice */
+#endif
+    (objobjproc) 0,                           /* sq_contains */
+    (binaryfunc) 0,                           /* sq_inplace_concat */
+    (ssizeargfunc) 0,                         /* sq_inplace_repeat */
+  },
+  {
+#if PY_VERSION_HEX < 0x03000000
+    (readbufferproc) 0,                       /* bf_getreadbuffer */
+    (writebufferproc) 0,                      /* bf_getwritebuffer */
+    (segcountproc) 0,                         /* bf_getsegcount */
+    (charbufferproc) 0,                       /* bf_getcharbuffer */
+#endif
+#if PY_VERSION_HEX >= 0x02060000
+    (getbufferproc) 0,                        /* bf_getbuffer */
+    (releasebufferproc) 0,                    /* bf_releasebuffer */
+#endif
+  },
+    (PyObject*) 0,                            /* ht_name */
+    (PyObject*) 0,                            /* ht_slots */
+};
+
+SWIGINTERN SwigPyClientData SwigPyBuiltin___THyPhyNumber_clientdata = {0, 0, 0, 0, 0, 0, (PyTypeObject *)&SwigPyBuiltin___THyPhyNumber_type};
+
+SWIGPY_DESTRUCTOR_CLOSURE(_wrap_delete__THyPhyMatrix)
+static SwigPyGetSet _THyPhyMatrix_mRows_getset = { _wrap__THyPhyMatrix_mRows_get, _wrap__THyPhyMatrix_mRows_set };
+static SwigPyGetSet _THyPhyMatrix_mCols_getset = { _wrap__THyPhyMatrix_mCols_get, _wrap__THyPhyMatrix_mCols_set };
+static SwigPyGetSet _THyPhyMatrix_mData_getset = { _wrap__THyPhyMatrix_mData_get, _wrap__THyPhyMatrix_mData_set };
+SWIGINTERN PyGetSetDef SwigPyBuiltin___THyPhyMatrix_getset[] = {
+    { (char*) "mRows", (getter) SwigPyBuiltin_GetterClosure, (setter) SwigPyBuiltin_SetterClosure, (char*)"_THyPhyMatrix.mRows", (void*) &_THyPhyMatrix_mRows_getset }
+,
+    { (char*) "mCols", (getter) SwigPyBuiltin_GetterClosure, (setter) SwigPyBuiltin_SetterClosure, (char*)"_THyPhyMatrix.mCols", (void*) &_THyPhyMatrix_mCols_getset }
+,
+    { (char*) "mData", (getter) SwigPyBuiltin_GetterClosure, (setter) SwigPyBuiltin_SetterClosure, (char*)"_THyPhyMatrix.mData", (void*) &_THyPhyMatrix_mData_getset }
+,
+    {NULL, NULL, NULL, NULL, NULL} /* Sentinel */
+};
+
+SWIGINTERN PyObject *
+SwigPyBuiltin___THyPhyMatrix_richcompare(PyObject *self, PyObject *other, int op) {
+  PyObject *result = NULL;
+  PyObject *tuple = PyTuple_New(1);
+  assert(tuple);
+  PyTuple_SET_ITEM(tuple, 0, other);
+  Py_XINCREF(other);
+  if (!result) {
+    if (SwigPyObject_Check(self) && SwigPyObject_Check(other)) {
+      result = SwigPyObject_richcompare((SwigPyObject *)self, (SwigPyObject *)other, op);
+    } else {
+      result = Py_NotImplemented;
+      Py_INCREF(result);
+    }
+  }
+  Py_DECREF(tuple);
+  return result;
+}
+
+SWIGINTERN PyMethodDef SwigPyBuiltin___THyPhyMatrix_methods[] = {
+  { "myType", (PyCFunction) _wrap__THyPhyMatrix_myType, METH_VARARGS, (char*) "" },
+  { "MatrixCell", (PyCFunction) _wrap__THyPhyMatrix_MatrixCell, METH_VARARGS, (char*) "" },
+  { NULL, NULL, 0, NULL } /* Sentinel */
+};
+
+static PyHeapTypeObject SwigPyBuiltin___THyPhyMatrix_type = {
+  {
+#if PY_VERSION_HEX >= 0x03000000
+    PyVarObject_HEAD_INIT(NULL, 0)
+#else
+    PyObject_HEAD_INIT(NULL)
+    0,                                        /* ob_size */
+#endif
+    "_THyPhyMatrix",                          /* tp_name */
+    sizeof(SwigPyObject),                     /* tp_basicsize */
+    0,                                        /* tp_itemsize */
+    (destructor) _wrap_delete__THyPhyMatrix_closure, /* tp_dealloc */
+    (printfunc) 0,                            /* tp_print */
+    (getattrfunc) 0,                          /* tp_getattr */
+    (setattrfunc) 0,                          /* tp_setattr */
+#if PY_VERSION_HEX >= 0x03000000
+    0,                                        /* tp_compare */
+#else
+    (cmpfunc) 0,                              /* tp_compare */
+#endif
+    (reprfunc) 0,                             /* tp_repr */
+    &SwigPyBuiltin___THyPhyMatrix_type.as_number,      /* tp_as_number */
+    &SwigPyBuiltin___THyPhyMatrix_type.as_sequence,    /* tp_as_sequence */
+    &SwigPyBuiltin___THyPhyMatrix_type.as_mapping,     /* tp_as_mapping */
+    (hashfunc) 0,                             /* tp_hash */
+    (ternaryfunc) 0,                          /* tp_call */
+    (reprfunc) 0,                             /* tp_str */
+    (getattrofunc) 0,                         /* tp_getattro */
+    (setattrofunc) 0,                         /* tp_setattro */
+    &SwigPyBuiltin___THyPhyMatrix_type.as_buffer,      /* tp_as_buffer */
+#if PY_VERSION_HEX >= 0x03000000
+    Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE,   /* tp_flags */
+#else
+    Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_CHECKTYPES, /* tp_flags */
+#endif
+    "::_THyPhyMatrix",                        /* tp_doc */
+    (traverseproc) 0,                         /* tp_traverse */
+    (inquiry) 0,                              /* tp_clear */
+    (richcmpfunc) SwigPyBuiltin___THyPhyMatrix_richcompare, /* feature:python:tp_richcompare */
+    0,                                        /* tp_weaklistoffset */
+    (getiterfunc) 0,                          /* tp_iter */
+    (iternextfunc) 0,                         /* tp_iternext */
+    SwigPyBuiltin___THyPhyMatrix_methods,     /* tp_methods */
+    0,                                        /* tp_members */
+    SwigPyBuiltin___THyPhyMatrix_getset,      /* tp_getset */
+    0,                                        /* tp_base */
+    0,                                        /* tp_dict */
+    (descrgetfunc) 0,                         /* tp_descr_get */
+    (descrsetfunc) 0,                         /* tp_descr_set */
+    (size_t)(((char*)&((SwigPyObject *) 64L)->dict) - (char*) 64L), /* tp_dictoffset */
+    (initproc) _wrap_new__THyPhyMatrix,       /* tp_init */
+    (allocfunc) 0,                            /* tp_alloc */
+    (newfunc) 0,                              /* tp_new */
+    (freefunc) 0,                             /* tp_free */
+    (inquiry) 0,                              /* tp_is_gc */
+    (PyObject*) 0,                            /* tp_bases */
+    (PyObject*) 0,                            /* tp_mro */
+    (PyObject*) 0,                            /* tp_cache */
+    (PyObject*) 0,                            /* tp_subclasses */
+    (PyObject*) 0,                            /* tp_weaklist */
+    (destructor) 0,                           /* tp_del */
+#if PY_VERSION_HEX >= 0x02060000
+    (int) 0,                                  /* tp_version_tag */
+#endif
+  },
+  {
+    (binaryfunc) 0,                           /* nb_add */
+    (binaryfunc) 0,                           /* nb_subtract */
+    (binaryfunc) 0,                           /* nb_multiply */
+#if PY_VERSION_HEX < 0x03000000
+    (binaryfunc) 0,                           /* nb_divide */
+#endif
+    (binaryfunc) 0,                           /* nb_remainder */
+    (binaryfunc) 0,                           /* nb_divmod */
+    (ternaryfunc) 0,                          /* nb_power */
+    (unaryfunc) 0,                            /* nb_negative */
+    (unaryfunc) 0,                            /* nb_positive */
+    (unaryfunc) 0,                            /* nb_absolute */
+    (inquiry) 0,                              /* nb_nonzero */
+    (unaryfunc) 0,                            /* nb_invert */
+    (binaryfunc) 0,                           /* nb_lshift */
+    (binaryfunc) 0,                           /* nb_rshift */
+    (binaryfunc) 0,                           /* nb_and */
+    (binaryfunc) 0,                           /* nb_xor */
+    (binaryfunc) 0,                           /* nb_or */
+#if PY_VERSION_HEX < 0x03000000
+    (coercion) 0,                             /* nb_coerce */
+#endif
+    (unaryfunc) 0,                            /* nb_int */
+#if PY_VERSION_HEX >= 0x03000000
+    (void*) 0,                                /* nb_reserved */
+#else
+    (unaryfunc) 0,                            /* nb_long */
+#endif
+    (unaryfunc) 0,                            /* nb_float */
+#if PY_VERSION_HEX < 0x03000000
+    (unaryfunc) 0,                            /* nb_oct */
+    (unaryfunc) 0,                            /* nb_hex */
+#endif
+    (binaryfunc) 0,                           /* nb_inplace_add */
+    (binaryfunc) 0,                           /* nb_inplace_subtract */
+    (binaryfunc) 0,                           /* nb_inplace_multiply */
+#if PY_VERSION_HEX < 0x03000000
+    (binaryfunc) 0,                           /* nb_inplace_divide */
+#endif
+    (binaryfunc) 0,                           /* nb_inplace_remainder */
+    (ternaryfunc) 0,                          /* nb_inplace_power */
+    (binaryfunc) 0,                           /* nb_inplace_lshift */
+    (binaryfunc) 0,                           /* nb_inplace_rshift */
+    (binaryfunc) 0,                           /* nb_inplace_and */
+    (binaryfunc) 0,                           /* nb_inplace_xor */
+    (binaryfunc) 0,                           /* nb_inplace_or */
+    (binaryfunc) 0,                           /* nb_floor_divide */
+    (binaryfunc) 0,                           /* nb_true_divide */
+    (binaryfunc) 0,                           /* nb_inplace_floor_divide */
+    (binaryfunc) 0,                           /* nb_inplace_true_divide */
+#if PY_VERSION_HEX >= 0x02050000
+    (unaryfunc) 0,                            /* nb_index */
+#endif
+  },
+  {
+    (lenfunc) 0,                              /* mp_length */
+    (binaryfunc) 0,                           /* mp_subscript */
+    (objobjargproc) 0,                        /* mp_ass_subscript */
+  },
+  {
+    (lenfunc) 0,                              /* sq_length */
+    (binaryfunc) 0,                           /* sq_concat */
+    (ssizeargfunc) 0,                         /* sq_repeat */
+    (ssizeargfunc) 0,                         /* sq_item */
+#if PY_VERSION_HEX >= 0x03000000
+    (void*) 0,                                /* was_sq_slice */
+#else
+    (ssizessizeargfunc) 0,                    /* sq_slice */
+#endif
+    (ssizeobjargproc) 0,                      /* sq_ass_item */
+#if PY_VERSION_HEX >= 0x03000000
+    (void*) 0,                                /* was_sq_ass_slice */
+#else
+    (ssizessizeobjargproc) 0,                 /* sq_ass_slice */
+#endif
+    (objobjproc) 0,                           /* sq_contains */
+    (binaryfunc) 0,                           /* sq_inplace_concat */
+    (ssizeargfunc) 0,                         /* sq_inplace_repeat */
+  },
+  {
+#if PY_VERSION_HEX < 0x03000000
+    (readbufferproc) 0,                       /* bf_getreadbuffer */
+    (writebufferproc) 0,                      /* bf_getwritebuffer */
+    (segcountproc) 0,                         /* bf_getsegcount */
+    (charbufferproc) 0,                       /* bf_getcharbuffer */
+#endif
+#if PY_VERSION_HEX >= 0x02060000
+    (getbufferproc) 0,                        /* bf_getbuffer */
+    (releasebufferproc) 0,                    /* bf_releasebuffer */
+#endif
+  },
+    (PyObject*) 0,                            /* ht_name */
+    (PyObject*) 0,                            /* ht_slots */
+};
+
+SWIGINTERN SwigPyClientData SwigPyBuiltin___THyPhyMatrix_clientdata = {0, 0, 0, 0, 0, 0, (PyTypeObject *)&SwigPyBuiltin___THyPhyMatrix_type};
+
+SWIGPY_DESTRUCTOR_CLOSURE(_wrap_delete__THyPhy)
+SWIGINTERN PyGetSetDef SwigPyBuiltin___THyPhy_getset[] = {
+    {NULL, NULL, NULL, NULL, NULL} /* Sentinel */
+};
+
+SWIGINTERN PyObject *
+SwigPyBuiltin___THyPhy_richcompare(PyObject *self, PyObject *other, int op) {
+  PyObject *result = NULL;
+  PyObject *tuple = PyTuple_New(1);
+  assert(tuple);
+  PyTuple_SET_ITEM(tuple, 0, other);
+  Py_XINCREF(other);
+  if (!result) {
+    if (SwigPyObject_Check(self) && SwigPyObject_Check(other)) {
+      result = SwigPyObject_richcompare((SwigPyObject *)self, (SwigPyObject *)other, op);
+    } else {
+      result = Py_NotImplemented;
+      Py_INCREF(result);
+    }
+  }
+  Py_DECREF(tuple);
+  return result;
+}
+
+SWIGINTERN PyMethodDef SwigPyBuiltin___THyPhy_methods[] = {
+  { "ExecuteBF", (PyCFunction) _wrap__THyPhy_ExecuteBF, METH_VARARGS, (char*) "" },
+  { "InitTHyPhy", (PyCFunction) _wrap__THyPhy_InitTHyPhy, METH_VARARGS, (char*) "" },
+  { "ClearAll", (PyCFunction) _wrap__THyPhy_ClearAll, METH_VARARGS, (char*) "" },
+  { "AskFor", (PyCFunction) _wrap__THyPhy_AskFor, METH_VARARGS, (char*) "" },
+  { "DumpResult", (PyCFunction) _wrap__THyPhy_DumpResult, METH_VARARGS, (char*) "" },
+  { "CanCast", (PyCFunction) _wrap__THyPhy_CanCast, METH_VARARGS, (char*) "" },
+  { "CastResult", (PyCFunction) _wrap__THyPhy_CastResult, METH_VARARGS, (char*) "" },
+  { "SetCallbackHandler", (PyCFunction) _wrap__THyPhy_SetCallbackHandler, METH_VARARGS, (char*) "" },
+  { "GetCallbackHandler", (PyCFunction) _wrap__THyPhy_GetCallbackHandler, METH_VARARGS, (char*) "" },
+  { "GetWarnings", (PyCFunction) _wrap__THyPhy_GetWarnings, METH_VARARGS, (char*) "" },
+  { "GetErrors", (PyCFunction) _wrap__THyPhy_GetErrors, METH_VARARGS, (char*) "" },
+  { "GetStdout", (PyCFunction) _wrap__THyPhy_GetStdout, METH_VARARGS, (char*) "" },
+  { "PushWarning", (PyCFunction) _wrap__THyPhy_PushWarning, METH_VARARGS, (char*) "" },
+  { "PushError", (PyCFunction) _wrap__THyPhy_PushError, METH_VARARGS, (char*) "" },
+  { "PushOutString", (PyCFunction) _wrap__THyPhy_PushOutString, METH_VARARGS, (char*) "" },
+  { NULL, NULL, 0, NULL } /* Sentinel */
+};
+
+static PyHeapTypeObject SwigPyBuiltin___THyPhy_type = {
+  {
+#if PY_VERSION_HEX >= 0x03000000
+    PyVarObject_HEAD_INIT(NULL, 0)
+#else
+    PyObject_HEAD_INIT(NULL)
+    0,                                        /* ob_size */
+#endif
+    "_THyPhy",                                /* tp_name */
+    sizeof(SwigPyObject),                     /* tp_basicsize */
+    0,                                        /* tp_itemsize */
+    (destructor) _wrap_delete__THyPhy_closure, /* tp_dealloc */
+    (printfunc) 0,                            /* tp_print */
+    (getattrfunc) 0,                          /* tp_getattr */
+    (setattrfunc) 0,                          /* tp_setattr */
+#if PY_VERSION_HEX >= 0x03000000
+    0,                                        /* tp_compare */
+#else
+    (cmpfunc) 0,                              /* tp_compare */
+#endif
+    (reprfunc) 0,                             /* tp_repr */
+    &SwigPyBuiltin___THyPhy_type.as_number,      /* tp_as_number */
+    &SwigPyBuiltin___THyPhy_type.as_sequence,    /* tp_as_sequence */
+    &SwigPyBuiltin___THyPhy_type.as_mapping,     /* tp_as_mapping */
+    (hashfunc) 0,                             /* tp_hash */
+    (ternaryfunc) 0,                          /* tp_call */
+    (reprfunc) 0,                             /* tp_str */
+    (getattrofunc) 0,                         /* tp_getattro */
+    (setattrofunc) 0,                         /* tp_setattro */
+    &SwigPyBuiltin___THyPhy_type.as_buffer,      /* tp_as_buffer */
+#if PY_VERSION_HEX >= 0x03000000
+    Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE,   /* tp_flags */
+#else
+    Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_CHECKTYPES, /* tp_flags */
+#endif
+    "::_THyPhy",                              /* tp_doc */
+    (traverseproc) 0,                         /* tp_traverse */
+    (inquiry) 0,                              /* tp_clear */
+    (richcmpfunc) SwigPyBuiltin___THyPhy_richcompare, /* feature:python:tp_richcompare */
+    0,                                        /* tp_weaklistoffset */
+    (getiterfunc) 0,                          /* tp_iter */
+    (iternextfunc) 0,                         /* tp_iternext */
+    SwigPyBuiltin___THyPhy_methods,           /* tp_methods */
+    0,                                        /* tp_members */
+    SwigPyBuiltin___THyPhy_getset,            /* tp_getset */
+    0,                                        /* tp_base */
+    0,                                        /* tp_dict */
+    (descrgetfunc) 0,                         /* tp_descr_get */
+    (descrsetfunc) 0,                         /* tp_descr_set */
+    (size_t)(((char*)&((SwigPyObject *) 64L)->dict) - (char*) 64L), /* tp_dictoffset */
+    (initproc) _wrap_new__THyPhy,             /* tp_init */
+    (allocfunc) 0,                            /* tp_alloc */
+    (newfunc) 0,                              /* tp_new */
+    (freefunc) 0,                             /* tp_free */
+    (inquiry) 0,                              /* tp_is_gc */
+    (PyObject*) 0,                            /* tp_bases */
+    (PyObject*) 0,                            /* tp_mro */
+    (PyObject*) 0,                            /* tp_cache */
+    (PyObject*) 0,                            /* tp_subclasses */
+    (PyObject*) 0,                            /* tp_weaklist */
+    (destructor) 0,                           /* tp_del */
+#if PY_VERSION_HEX >= 0x02060000
+    (int) 0,                                  /* tp_version_tag */
+#endif
+  },
+  {
+    (binaryfunc) 0,                           /* nb_add */
+    (binaryfunc) 0,                           /* nb_subtract */
+    (binaryfunc) 0,                           /* nb_multiply */
+#if PY_VERSION_HEX < 0x03000000
+    (binaryfunc) 0,                           /* nb_divide */
+#endif
+    (binaryfunc) 0,                           /* nb_remainder */
+    (binaryfunc) 0,                           /* nb_divmod */
+    (ternaryfunc) 0,                          /* nb_power */
+    (unaryfunc) 0,                            /* nb_negative */
+    (unaryfunc) 0,                            /* nb_positive */
+    (unaryfunc) 0,                            /* nb_absolute */
+    (inquiry) 0,                              /* nb_nonzero */
+    (unaryfunc) 0,                            /* nb_invert */
+    (binaryfunc) 0,                           /* nb_lshift */
+    (binaryfunc) 0,                           /* nb_rshift */
+    (binaryfunc) 0,                           /* nb_and */
+    (binaryfunc) 0,                           /* nb_xor */
+    (binaryfunc) 0,                           /* nb_or */
+#if PY_VERSION_HEX < 0x03000000
+    (coercion) 0,                             /* nb_coerce */
+#endif
+    (unaryfunc) 0,                            /* nb_int */
+#if PY_VERSION_HEX >= 0x03000000
+    (void*) 0,                                /* nb_reserved */
+#else
+    (unaryfunc) 0,                            /* nb_long */
+#endif
+    (unaryfunc) 0,                            /* nb_float */
+#if PY_VERSION_HEX < 0x03000000
+    (unaryfunc) 0,                            /* nb_oct */
+    (unaryfunc) 0,                            /* nb_hex */
+#endif
+    (binaryfunc) 0,                           /* nb_inplace_add */
+    (binaryfunc) 0,                           /* nb_inplace_subtract */
+    (binaryfunc) 0,                           /* nb_inplace_multiply */
+#if PY_VERSION_HEX < 0x03000000
+    (binaryfunc) 0,                           /* nb_inplace_divide */
+#endif
+    (binaryfunc) 0,                           /* nb_inplace_remainder */
+    (ternaryfunc) 0,                          /* nb_inplace_power */
+    (binaryfunc) 0,                           /* nb_inplace_lshift */
+    (binaryfunc) 0,                           /* nb_inplace_rshift */
+    (binaryfunc) 0,                           /* nb_inplace_and */
+    (binaryfunc) 0,                           /* nb_inplace_xor */
+    (binaryfunc) 0,                           /* nb_inplace_or */
+    (binaryfunc) 0,                           /* nb_floor_divide */
+    (binaryfunc) 0,                           /* nb_true_divide */
+    (binaryfunc) 0,                           /* nb_inplace_floor_divide */
+    (binaryfunc) 0,                           /* nb_inplace_true_divide */
+#if PY_VERSION_HEX >= 0x02050000
+    (unaryfunc) 0,                            /* nb_index */
+#endif
+  },
+  {
+    (lenfunc) 0,                              /* mp_length */
+    (binaryfunc) 0,                           /* mp_subscript */
+    (objobjargproc) 0,                        /* mp_ass_subscript */
+  },
+  {
+    (lenfunc) 0,                              /* sq_length */
+    (binaryfunc) 0,                           /* sq_concat */
+    (ssizeargfunc) 0,                         /* sq_repeat */
+    (ssizeargfunc) 0,                         /* sq_item */
+#if PY_VERSION_HEX >= 0x03000000
+    (void*) 0,                                /* was_sq_slice */
+#else
+    (ssizessizeargfunc) 0,                    /* sq_slice */
+#endif
+    (ssizeobjargproc) 0,                      /* sq_ass_item */
+#if PY_VERSION_HEX >= 0x03000000
+    (void*) 0,                                /* was_sq_ass_slice */
+#else
+    (ssizessizeobjargproc) 0,                 /* sq_ass_slice */
+#endif
+    (objobjproc) 0,                           /* sq_contains */
+    (binaryfunc) 0,                           /* sq_inplace_concat */
+    (ssizeargfunc) 0,                         /* sq_inplace_repeat */
+  },
+  {
+#if PY_VERSION_HEX < 0x03000000
+    (readbufferproc) 0,                       /* bf_getreadbuffer */
+    (writebufferproc) 0,                      /* bf_getwritebuffer */
+    (segcountproc) 0,                         /* bf_getsegcount */
+    (charbufferproc) 0,                       /* bf_getcharbuffer */
+#endif
+#if PY_VERSION_HEX >= 0x02060000
+    (getbufferproc) 0,                        /* bf_getbuffer */
+    (releasebufferproc) 0,                    /* bf_releasebuffer */
+#endif
+  },
+    (PyObject*) 0,                            /* ht_name */
+    (PyObject*) 0,                            /* ht_slots */
+};
+
+SWIGINTERN SwigPyClientData SwigPyBuiltin___THyPhy_clientdata = {0, 0, 0, 0, 0, 0, (PyTypeObject *)&SwigPyBuiltin___THyPhy_type};
+
+
+/* -------- TYPE CONVERSION AND EQUIVALENCE RULES (BEGIN) -------- */
+
+static void *_p__THyPhyNumberTo_p__THyPhyReturnObject(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((_THyPhyReturnObject *)  ((_THyPhyNumber *) x));
+}
+static void *_p__THyPhyMatrixTo_p__THyPhyReturnObject(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((_THyPhyReturnObject *)  ((_THyPhyMatrix *) x));
+}
+static void *_p__THyPhyStringTo_p__THyPhyReturnObject(void *x, int *SWIGUNUSEDPARM(newmemory)) {
+    return (void *)((_THyPhyReturnObject *)  ((_THyPhyString *) x));
+}
+static swig_type_info _swigt__p_SwigPyObject = {"_p_SwigPyObject", "SwigPyObject *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p__THyPhy = {"_p__THyPhy", "_THyPhy *", 0, 0, (void*)&SwigPyBuiltin___THyPhy_clientdata, 0};
+static swig_type_info _swigt__p__THyPhyMatrix = {"_p__THyPhyMatrix", "_THyPhyMatrix *", 0, 0, (void*)&SwigPyBuiltin___THyPhyMatrix_clientdata, 0};
+static swig_type_info _swigt__p__THyPhyNumber = {"_p__THyPhyNumber", "_THyPhyNumber *", 0, 0, (void*)&SwigPyBuiltin___THyPhyNumber_clientdata, 0};
+static swig_type_info _swigt__p__THyPhyReturnObject = {"_p__THyPhyReturnObject", "_THyPhyReturnObject *", 0, 0, (void*)&SwigPyBuiltin___THyPhyReturnObject_clientdata, 0};
+static swig_type_info _swigt__p__THyPhyString = {"_p__THyPhyString", "_THyPhyString *", 0, 0, (void*)&SwigPyBuiltin___THyPhyString_clientdata, 0};
+static swig_type_info _swigt__p_char = {"_p_char", "char *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_double = {"_p_double", "double *", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_f_p_char_int_double__bool = {"_p_f_p_char_int_double__bool", "_ProgressCancelHandler *|bool (*)(char *,int,double)", 0, 0, (void*)0, 0};
+static swig_type_info _swigt__p_void = {"_p_void", "void *", 0, 0, (void*)0, 0};
+
+static swig_type_info *swig_type_initial[] = {
+  &_swigt__p_SwigPyObject,
+  &_swigt__p__THyPhy,
+  &_swigt__p__THyPhyMatrix,
+  &_swigt__p__THyPhyNumber,
+  &_swigt__p__THyPhyReturnObject,
+  &_swigt__p__THyPhyString,
+  &_swigt__p_char,
+  &_swigt__p_double,
+  &_swigt__p_f_p_char_int_double__bool,
+  &_swigt__p_void,
+};
+
+static swig_cast_info _swigc__p_SwigPyObject[] = {  {&_swigt__p_SwigPyObject, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p__THyPhy[] = {  {&_swigt__p__THyPhy, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p__THyPhyMatrix[] = {  {&_swigt__p__THyPhyMatrix, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p__THyPhyNumber[] = {  {&_swigt__p__THyPhyNumber, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p__THyPhyReturnObject[] = {  {&_swigt__p__THyPhyReturnObject, 0, 0, 0},  {&_swigt__p__THyPhyNumber, _p__THyPhyNumberTo_p__THyPhyReturnObject, 0, 0},  {&_swigt__p__THyPhyMatrix, _p__THyPhyMatrixTo_p__THyPhyReturnObject, 0, 0},  {&_swigt__p__THyPhyString, _p__THyPhyStringTo_p__THyPhyReturnObject, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p__THyPhyString[] = {  {&_swigt__p__THyPhyString, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_char[] = {  {&_swigt__p_char, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_double[] = {  {&_swigt__p_double, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_f_p_char_int_double__bool[] = {  {&_swigt__p_f_p_char_int_double__bool, 0, 0, 0},{0, 0, 0, 0}};
+static swig_cast_info _swigc__p_void[] = {  {&_swigt__p_void, 0, 0, 0},{0, 0, 0, 0}};
+
+static swig_cast_info *swig_cast_initial[] = {
+  _swigc__p_SwigPyObject,
+  _swigc__p__THyPhy,
+  _swigc__p__THyPhyMatrix,
+  _swigc__p__THyPhyNumber,
+  _swigc__p__THyPhyReturnObject,
+  _swigc__p__THyPhyString,
+  _swigc__p_char,
+  _swigc__p_double,
+  _swigc__p_f_p_char_int_double__bool,
+  _swigc__p_void,
+};
+
+
+/* -------- TYPE CONVERSION AND EQUIVALENCE RULES (END) -------- */
+
+static swig_const_info swig_const_table[] = {
+{0, 0, 0, 0.0, 0, 0}};
+
+#ifdef __cplusplus
+}
+#endif
+static PyTypeObject *builtin_bases[3];
+
+/* -----------------------------------------------------------------------------
+ * Type initialization:
+ * This problem is tough by the requirement that no dynamic 
+ * memory is used. Also, since swig_type_info structures store pointers to 
+ * swig_cast_info structures and swig_cast_info structures store pointers back
+ * to swig_type_info structures, we need some lookup code at initialization. 
+ * The idea is that swig generates all the structures that are needed. 
+ * The runtime then collects these partially filled structures. 
+ * The SWIG_InitializeModule function takes these initial arrays out of 
+ * swig_module, and does all the lookup, filling in the swig_module.types
+ * array with the correct data and linking the correct swig_cast_info
+ * structures together.
+ *
+ * The generated swig_type_info structures are assigned staticly to an initial 
+ * array. We just loop through that array, and handle each type individually.
+ * First we lookup if this type has been already loaded, and if so, use the
+ * loaded structure instead of the generated one. Then we have to fill in the
+ * cast linked list. The cast data is initially stored in something like a
+ * two-dimensional array. Each row corresponds to a type (there are the same
+ * number of rows as there are in the swig_type_initial array). Each entry in
+ * a column is one of the swig_cast_info structures for that type.
+ * The cast_initial array is actually an array of arrays, because each row has
+ * a variable number of columns. So to actually build the cast linked list,
+ * we find the array of casts associated with the type, and loop through it 
+ * adding the casts to the list. The one last trick we need to do is making
+ * sure the type pointer in the swig_cast_info struct is correct.
+ *
+ * First off, we lookup the cast->type name to see if it is already loaded. 
+ * There are three cases to handle:
+ *  1) If the cast->type has already been loaded AND the type we are adding
+ *     casting info to has not been loaded (it is in this module), THEN we
+ *     replace the cast->type pointer with the type pointer that has already
+ *     been loaded.
+ *  2) If BOTH types (the one we are adding casting info to, and the 
+ *     cast->type) are loaded, THEN the cast info has already been loaded by
+ *     the previous module so we just ignore it.
+ *  3) Finally, if cast->type has not already been loaded, then we add that
+ *     swig_cast_info to the linked list (because the cast->type) pointer will
+ *     be correct.
+ * ----------------------------------------------------------------------------- */
+
+#ifdef __cplusplus
+extern "C" {
+#if 0
+} /* c-mode */
+#endif
+#endif
+
+#if 0
+#define SWIGRUNTIME_DEBUG
+#endif
+
+
+SWIGRUNTIME void
+SWIG_InitializeModule(void *clientdata) {
+  size_t i;
+  swig_module_info *module_head, *iter;
+  int found, init;
+  
+  clientdata = clientdata;
+  
+  /* check to see if the circular list has been setup, if not, set it up */
+  if (swig_module.next==0) {
+    /* Initialize the swig_module */
+    swig_module.type_initial = swig_type_initial;
+    swig_module.cast_initial = swig_cast_initial;
+    swig_module.next = &swig_module;
+    init = 1;
+  } else {
+    init = 0;
+  }
+  
+  /* Try and load any already created modules */
+  module_head = SWIG_GetModule(clientdata);
+  if (!module_head) {
+    /* This is the first module loaded for this interpreter */
+    /* so set the swig module into the interpreter */
+    SWIG_SetModule(clientdata, &swig_module);
+    module_head = &swig_module;
+  } else {
+    /* the interpreter has loaded a SWIG module, but has it loaded this one? */
+    found=0;
+    iter=module_head;
+    do {
+      if (iter==&swig_module) {
+        found=1;
+        break;
+      }
+      iter=iter->next;
+    } while (iter!= module_head);
+    
+    /* if the is found in the list, then all is done and we may leave */
+    if (found) return;
+    /* otherwise we must add out module into the list */
+    swig_module.next = module_head->next;
+    module_head->next = &swig_module;
+  }
+  
+  /* When multiple interpeters are used, a module could have already been initialized in
+       a different interpreter, but not yet have a pointer in this interpreter.
+       In this case, we do not want to continue adding types... everything should be
+       set up already */
+  if (init == 0) return;
+  
+  /* Now work on filling in swig_module.types */
+#ifdef SWIGRUNTIME_DEBUG
+  printf("SWIG_InitializeModule: size %d\n", swig_module.size);
+#endif
+  for (i = 0; i < swig_module.size; ++i) {
+    swig_type_info *type = 0;
+    swig_type_info *ret;
+    swig_cast_info *cast;
+    
+#ifdef SWIGRUNTIME_DEBUG
+    printf("SWIG_InitializeModule: type %d %s\n", i, swig_module.type_initial[i]->name);
+#endif
+    
+    /* if there is another module already loaded */
+    if (swig_module.next != &swig_module) {
+      type = SWIG_MangledTypeQueryModule(swig_module.next, &swig_module, swig_module.type_initial[i]->name);
+    }
+    if (type) {
+      /* Overwrite clientdata field */
+#ifdef SWIGRUNTIME_DEBUG
+      printf("SWIG_InitializeModule: found type %s\n", type->name);
+#endif
+      if (swig_module.type_initial[i]->clientdata) {
+        type->clientdata = swig_module.type_initial[i]->clientdata;
+#ifdef SWIGRUNTIME_DEBUG
+        printf("SWIG_InitializeModule: found and overwrite type %s \n", type->name);
+#endif
+      }
+    } else {
+      type = swig_module.type_initial[i];
+    }
+    
+    /* Insert casting types */
+    cast = swig_module.cast_initial[i];
+    while (cast->type) {
+      /* Don't need to add information already in the list */
+      ret = 0;
+#ifdef SWIGRUNTIME_DEBUG
+      printf("SWIG_InitializeModule: look cast %s\n", cast->type->name);
+#endif
+      if (swig_module.next != &swig_module) {
+        ret = SWIG_MangledTypeQueryModule(swig_module.next, &swig_module, cast->type->name);
+#ifdef SWIGRUNTIME_DEBUG
+        if (ret) printf("SWIG_InitializeModule: found cast %s\n", ret->name);
+#endif
+      }
+      if (ret) {
+        if (type == swig_module.type_initial[i]) {
+#ifdef SWIGRUNTIME_DEBUG
+          printf("SWIG_InitializeModule: skip old type %s\n", ret->name);
+#endif
+          cast->type = ret;
+          ret = 0;
+        } else {
+          /* Check for casting already in the list */
+          swig_cast_info *ocast = SWIG_TypeCheck(ret->name, type);
+#ifdef SWIGRUNTIME_DEBUG
+          if (ocast) printf("SWIG_InitializeModule: skip old cast %s\n", ret->name);
+#endif
+          if (!ocast) ret = 0;
+        }
+      }
+      
+      if (!ret) {
+#ifdef SWIGRUNTIME_DEBUG
+        printf("SWIG_InitializeModule: adding cast %s\n", cast->type->name);
+#endif
+        if (type->cast) {
+          type->cast->prev = cast;
+          cast->next = type->cast;
+        }
+        type->cast = cast;
+      }
+      cast++;
+    }
+    /* Set entry in modules->types array equal to the type */
+    swig_module.types[i] = type;
+  }
+  swig_module.types[i] = 0;
+  
+#ifdef SWIGRUNTIME_DEBUG
+  printf("**** SWIG_InitializeModule: Cast List ******\n");
+  for (i = 0; i < swig_module.size; ++i) {
+    int j = 0;
+    swig_cast_info *cast = swig_module.cast_initial[i];
+    printf("SWIG_InitializeModule: type %d %s\n", i, swig_module.type_initial[i]->name);
+    while (cast->type) {
+      printf("SWIG_InitializeModule: cast type %s\n", cast->type->name);
+      cast++;
+      ++j;
+    }
+    printf("---- Total casts: %d\n",j);
+  }
+  printf("**** SWIG_InitializeModule: Cast List ******\n");
+#endif
+}
+
+/* This function will propagate the clientdata field of type to
+* any new swig_type_info structures that have been added into the list
+* of equivalent types.  It is like calling
+* SWIG_TypeClientData(type, clientdata) a second time.
+*/
+SWIGRUNTIME void
+SWIG_PropagateClientData(void) {
+  size_t i;
+  swig_cast_info *equiv;
+  static int init_run = 0;
+  
+  if (init_run) return;
+  init_run = 1;
+  
+  for (i = 0; i < swig_module.size; i++) {
+    if (swig_module.types[i]->clientdata) {
+      equiv = swig_module.types[i]->cast;
+      while (equiv) {
+        if (!equiv->converter) {
+          if (equiv->type && !equiv->type->clientdata)
+          SWIG_TypeClientData(equiv->type, swig_module.types[i]->clientdata);
+        }
+        equiv = equiv->next;
+      }
+    }
+  }
+}
+
+#ifdef __cplusplus
+#if 0
+{
+  /* c-mode */
+#endif
+}
+#endif
+
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+  
+  /* Python-specific SWIG API */
+#define SWIG_newvarlink()                             SWIG_Python_newvarlink()
+#define SWIG_addvarlink(p, name, get_attr, set_attr)  SWIG_Python_addvarlink(p, name, get_attr, set_attr)
+#define SWIG_InstallConstants(d, constants)           SWIG_Python_InstallConstants(d, constants)
+  
+  /* -----------------------------------------------------------------------------
+   * global variable support code.
+   * ----------------------------------------------------------------------------- */
+  
+  typedef struct swig_globalvar {
+    char       *name;                  /* Name of global variable */
+    PyObject *(*get_attr)(void);       /* Return the current value */
+    int       (*set_attr)(PyObject *); /* Set the value */
+    struct swig_globalvar *next;
+  } swig_globalvar;
+  
+  typedef struct swig_varlinkobject {
+    PyObject_HEAD
+    swig_globalvar *vars;
+  } swig_varlinkobject;
+  
+  SWIGINTERN PyObject *
+  swig_varlink_repr(swig_varlinkobject *SWIGUNUSEDPARM(v)) {
+#if PY_VERSION_HEX >= 0x03000000
+    return PyUnicode_InternFromString("<Swig global variables>");
+#else
+    return PyString_FromString("<Swig global variables>");
+#endif
+  }
+  
+  SWIGINTERN PyObject *
+  swig_varlink_str(swig_varlinkobject *v) {
+#if PY_VERSION_HEX >= 0x03000000
+    PyObject *str = PyUnicode_InternFromString("(");
+    PyObject *tail;
+    PyObject *joined;
+    swig_globalvar *var;
+    for (var = v->vars; var; var=var->next) {
+      tail = PyUnicode_FromString(var->name);
+      joined = PyUnicode_Concat(str, tail);
+      Py_DecRef(str);
+      Py_DecRef(tail);
+      str = joined;
+      if (var->next) {
+        tail = PyUnicode_InternFromString(", ");
+        joined = PyUnicode_Concat(str, tail);
+        Py_DecRef(str);
+        Py_DecRef(tail);
+        str = joined;
+      }
+    }
+    tail = PyUnicode_InternFromString(")");
+    joined = PyUnicode_Concat(str, tail);
+    Py_DecRef(str);
+    Py_DecRef(tail);
+    str = joined;
+#else
+    PyObject *str = PyString_FromString("(");
+    swig_globalvar *var;
+    for (var = v->vars; var; var=var->next) {
+      PyString_ConcatAndDel(&str,PyString_FromString(var->name));
+      if (var->next) PyString_ConcatAndDel(&str,PyString_FromString(", "));
+    }
+    PyString_ConcatAndDel(&str,PyString_FromString(")"));
+#endif
+    return str;
+  }
+  
+  SWIGINTERN int
+  swig_varlink_print(swig_varlinkobject *v, FILE *fp, int SWIGUNUSEDPARM(flags)) {
+    char *tmp;
+    PyObject *str = swig_varlink_str(v);
+    fprintf(fp,"Swig global variables ");
+    fprintf(fp,"%s\n", tmp = SWIG_Python_str_AsChar(str));
+    SWIG_Python_str_DelForPy3(tmp);
+    Py_DECREF(str);
+    return 0;
+  }
+  
+  SWIGINTERN void
+  swig_varlink_dealloc(swig_varlinkobject *v) {
+    swig_globalvar *var = v->vars;
+    while (var) {
+      swig_globalvar *n = var->next;
+      free(var->name);
+      free(var);
+      var = n;
+    }
+  }
+  
+  SWIGINTERN PyObject *
+  swig_varlink_getattr(swig_varlinkobject *v, char *n) {
+    PyObject *res = NULL;
+    swig_globalvar *var = v->vars;
+    while (var) {
+      if (strcmp(var->name,n) == 0) {
+        res = (*var->get_attr)();
+        break;
+      }
+      var = var->next;
+    }
+    if (res == NULL && !PyErr_Occurred()) {
+      PyErr_SetString(PyExc_NameError,"Unknown C global variable");
+    }
+    return res;
+  }
+  
+  SWIGINTERN int
+  swig_varlink_setattr(swig_varlinkobject *v, char *n, PyObject *p) {
+    int res = 1;
+    swig_globalvar *var = v->vars;
+    while (var) {
+      if (strcmp(var->name,n) == 0) {
+        res = (*var->set_attr)(p);
+        break;
+      }
+      var = var->next;
+    }
+    if (res == 1 && !PyErr_Occurred()) {
+      PyErr_SetString(PyExc_NameError,"Unknown C global variable");
+    }
+    return res;
+  }
+  
+  SWIGINTERN PyTypeObject*
+  swig_varlink_type(void) {
+    static char varlink__doc__[] = "Swig var link object";
+    static PyTypeObject varlink_type;
+    static int type_init = 0;
+    if (!type_init) {
+      const PyTypeObject tmp = {
+        /* PyObject header changed in Python 3 */
+#if PY_VERSION_HEX >= 0x03000000
+        PyVarObject_HEAD_INIT(NULL, 0)
+#else
+        PyObject_HEAD_INIT(NULL)
+        0,                                  /* ob_size */
+#endif
+        (char *)"swigvarlink",              /* tp_name */
+        sizeof(swig_varlinkobject),         /* tp_basicsize */
+        0,                                  /* tp_itemsize */
+        (destructor) swig_varlink_dealloc,  /* tp_dealloc */
+        (printfunc) swig_varlink_print,     /* tp_print */
+        (getattrfunc) swig_varlink_getattr, /* tp_getattr */
+        (setattrfunc) swig_varlink_setattr, /* tp_setattr */
+        0,                                  /* tp_compare */
+        (reprfunc) swig_varlink_repr,       /* tp_repr */
+        0,                                  /* tp_as_number */
+        0,                                  /* tp_as_sequence */
+        0,                                  /* tp_as_mapping */
+        0,                                  /* tp_hash */
+        0,                                  /* tp_call */
+        (reprfunc) swig_varlink_str,        /* tp_str */
+        0,                                  /* tp_getattro */
+        0,                                  /* tp_setattro */
+        0,                                  /* tp_as_buffer */
+        0,                                  /* tp_flags */
+        varlink__doc__,                     /* tp_doc */
+        0,                                  /* tp_traverse */
+        0,                                  /* tp_clear */
+        0,                                  /* tp_richcompare */
+        0,                                  /* tp_weaklistoffset */
+#if PY_VERSION_HEX >= 0x02020000
+        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* tp_iter -> tp_weaklist */
+#endif
+#if PY_VERSION_HEX >= 0x02030000
+        0,                                  /* tp_del */
+#endif
+#if PY_VERSION_HEX >= 0x02060000
+        0,                                  /* tp_version */
+#endif
+#ifdef COUNT_ALLOCS
+        0,0,0,0                             /* tp_alloc -> tp_next */
+#endif
+      };
+      varlink_type = tmp;
+      type_init = 1;
+#if PY_VERSION_HEX < 0x02020000
+      varlink_type.ob_type = &PyType_Type;
+#else
+      if (PyType_Ready(&varlink_type) < 0)
+      return NULL;
+#endif
+    }
+    return &varlink_type;
+  }
+  
+  /* Create a variable linking object for use later */
+  SWIGINTERN PyObject *
+  SWIG_Python_newvarlink(void) {
+    swig_varlinkobject *result = PyObject_NEW(swig_varlinkobject, swig_varlink_type());
+    if (result) {
+      result->vars = 0;
+    }
+    return ((PyObject*) result);
+  }
+  
+  SWIGINTERN void 
+  SWIG_Python_addvarlink(PyObject *p, char *name, PyObject *(*get_attr)(void), int (*set_attr)(PyObject *p)) {
+    swig_varlinkobject *v = (swig_varlinkobject *) p;
+    swig_globalvar *gv = (swig_globalvar *) malloc(sizeof(swig_globalvar));
+    if (gv) {
+      size_t size = strlen(name)+1;
+      gv->name = (char *)malloc(size);
+      if (gv->name) {
+        strncpy(gv->name,name,size);
+        gv->get_attr = get_attr;
+        gv->set_attr = set_attr;
+        gv->next = v->vars;
+      }
+    }
+    v->vars = gv;
+  }
+  
+  SWIGINTERN PyObject *
+  SWIG_globals(void) {
+    static PyObject *_SWIG_globals = 0; 
+    if (!_SWIG_globals) _SWIG_globals = SWIG_newvarlink();  
+    return _SWIG_globals;
+  }
+  
+  /* -----------------------------------------------------------------------------
+   * constants/methods manipulation
+   * ----------------------------------------------------------------------------- */
+  
+  /* Install Constants */
+  SWIGINTERN void
+  SWIG_Python_InstallConstants(PyObject *d, swig_const_info constants[]) {
+    PyObject *obj = 0;
+    size_t i;
+    for (i = 0; constants[i].type; ++i) {
+      switch(constants[i].type) {
+      case SWIG_PY_POINTER:
+        obj = SWIG_InternalNewPointerObj(constants[i].pvalue, *(constants[i]).ptype,0);
+        break;
+      case SWIG_PY_BINARY:
+        obj = SWIG_NewPackedObj(constants[i].pvalue, constants[i].lvalue, *(constants[i].ptype));
+        break;
+      default:
+        obj = 0;
+        break;
+      }
+      if (obj) {
+        PyDict_SetItemString(d, constants[i].name, obj);
+        Py_DECREF(obj);
+      }
+    }
+  }
+  
+  /* -----------------------------------------------------------------------------*/
+  /* Fix SwigMethods to carry the callback ptrs when needed */
+  /* -----------------------------------------------------------------------------*/
+  
+  SWIGINTERN void
+  SWIG_Python_FixMethods(PyMethodDef *methods,
+    swig_const_info *const_table,
+    swig_type_info **types,
+    swig_type_info **types_initial) {
+    size_t i;
+    for (i = 0; methods[i].ml_name; ++i) {
+      const char *c = methods[i].ml_doc;
+      if (c && (c = strstr(c, "swig_ptr: "))) {
+        int j;
+        swig_const_info *ci = 0;
+        const char *name = c + 10;
+        for (j = 0; const_table[j].type; ++j) {
+          if (strncmp(const_table[j].name, name, 
+              strlen(const_table[j].name)) == 0) {
+            ci = &(const_table[j]);
+            break;
+          }
+        }
+        if (ci) {
+          void *ptr = (ci->type == SWIG_PY_POINTER) ? ci->pvalue : 0;
+          if (ptr) {
+            size_t shift = (ci->ptype) - types;
+            swig_type_info *ty = types_initial[shift];
+            size_t ldoc = (c - methods[i].ml_doc);
+            size_t lptr = strlen(ty->name)+2*sizeof(void*)+2;
+            char *ndoc = (char*)malloc(ldoc + lptr + 10);
+            if (ndoc) {
+              char *buff = ndoc;
+              strncpy(buff, methods[i].ml_doc, ldoc);
+              buff += ldoc;
+              strncpy(buff, "swig_ptr: ", 10);
+              buff += 10;
+              SWIG_PackVoidPtr(buff, ptr, ty->name, lptr);
+              methods[i].ml_doc = ndoc;
+            }
+          }
+        }
+      }
+    }
+  } 
+  
+#ifdef __cplusplus
+}
+#endif
+
+/* -----------------------------------------------------------------------------*
+ *  Partial Init method
+ * -----------------------------------------------------------------------------*/
+
+#ifdef __cplusplus
+extern "C"
+#endif
+
+SWIGEXPORT 
+#if PY_VERSION_HEX >= 0x03000000
+PyObject*
+#else
+void
+#endif
+SWIG_init(void) {
+  PyObject *m, *d, *md;
+#if PY_VERSION_HEX >= 0x03000000
+  static struct PyModuleDef SWIG_module = {
+# if PY_VERSION_HEX >= 0x03020000
+    PyModuleDef_HEAD_INIT,
+# else
+    {
+      PyObject_HEAD_INIT(NULL)
+      NULL, /* m_init */
+      0,    /* m_index */
+      NULL, /* m_copy */
+    },
+# endif
+    (char *) SWIG_name,
+    NULL,
+    -1,
+    SwigMethods,
+    NULL,
+    NULL,
+    NULL,
+    NULL
+  };
+#endif
+  
+#if defined(SWIGPYTHON_BUILTIN)
+  static SwigPyClientData SwigPyObject_clientdata = {
+    0, 0, 0, 0, 0, 0, 0
+  };
+  static PyGetSetDef this_getset_def = {
+    (char *)"this", &SwigPyBuiltin_ThisClosure, NULL, NULL, NULL
+  };
+  static SwigPyGetSet thisown_getset_closure = {
+    (PyCFunction) SwigPyObject_own,
+    (PyCFunction) SwigPyObject_own
+  };
+  static PyGetSetDef thisown_getset_def = {
+    (char *)"thisown", SwigPyBuiltin_GetterClosure, SwigPyBuiltin_SetterClosure, NULL, &thisown_getset_closure
+  };
+  PyObject *metatype_args;
+  PyTypeObject *builtin_pytype;
+  int builtin_base_count;
+  swig_type_info *builtin_basetype;
+  PyObject *tuple;
+  PyGetSetDescrObject *static_getset;
+  PyTypeObject *metatype;
+  SwigPyClientData *cd;
+  PyObject *public_interface, *public_symbol;
+  PyObject *this_descr;
+  PyObject *thisown_descr;
+  int i;
+  
+  (void)builtin_pytype;
+  (void)builtin_base_count;
+  (void)builtin_basetype;
+  (void)tuple;
+  (void)static_getset;
+  
+  /* metatype is used to implement static member variables. */
+  metatype_args = Py_BuildValue("(s(O){})", "SwigPyObjectType", &PyType_Type);
+  assert(metatype_args);
+  metatype = (PyTypeObject *) PyType_Type.tp_call((PyObject *) &PyType_Type, metatype_args, NULL);
+  assert(metatype);
+  Py_DECREF(metatype_args);
+  metatype->tp_setattro = (setattrofunc) &SwigPyObjectType_setattro;
+  assert(PyType_Ready(metatype) >= 0);
+#endif
+  
+  /* Fix SwigMethods to carry the callback ptrs when needed */
+  SWIG_Python_FixMethods(SwigMethods, swig_const_table, swig_types, swig_type_initial);
+  
+#if PY_VERSION_HEX >= 0x03000000
+  m = PyModule_Create(&SWIG_module);
+#else
+  m = Py_InitModule((char *) SWIG_name, SwigMethods);
+#endif
+  md = d = PyModule_GetDict(m);
+  
+  SWIG_InitializeModule(0);
+  
+#ifdef SWIGPYTHON_BUILTIN
+  SwigPyObject_stype = SWIG_MangledTypeQuery("_p_SwigPyObject");
+  assert(SwigPyObject_stype);
+  cd = (SwigPyClientData*) SwigPyObject_stype->clientdata;
+  if (!cd) {
+    SwigPyObject_stype->clientdata = &SwigPyObject_clientdata;
+    SwigPyObject_clientdata.pytype = SwigPyObject_TypeOnce();
+  } else if (SwigPyObject_TypeOnce()->tp_basicsize != cd->pytype->tp_basicsize) {
+    PyErr_SetString(PyExc_RuntimeError, "Import error: attempted to load two incompatible swig-generated modules.");
+# if PY_VERSION_HEX >= 0x03000000
+    return NULL;
+# else
+    return;
+# endif
+  }
+  
+  /* All objects have a 'this' attribute */
+  this_descr = PyDescr_NewGetSet(SwigPyObject_type(), &this_getset_def);
+  (void)this_descr;
+  
+  /* All objects have a 'thisown' attribute */
+  thisown_descr = PyDescr_NewGetSet(SwigPyObject_type(), &thisown_getset_def);
+  (void)thisown_descr;
+  
+  public_interface = PyList_New(0);
+  public_symbol = 0;
+  (void)public_symbol;
+  
+  PyDict_SetItemString(md, "__all__", public_interface);
+  Py_DECREF(public_interface);
+  for (i = 0; SwigMethods[i].ml_name != NULL; ++i)
+  SwigPyBuiltin_AddPublicSymbol(public_interface, SwigMethods[i].ml_name);
+  for (i = 0; swig_const_table[i].name != 0; ++i)
+  SwigPyBuiltin_AddPublicSymbol(public_interface, swig_const_table[i].name);
+#endif
+  
+  SWIG_InstallConstants(d,swig_const_table);
+  
+  SWIG_Python_SetConstant(d, d == md ? public_interface : NULL, "THYPHY_TYPE_COUNT",SWIG_From_int(static_cast< int >(3)));
+  SWIG_Python_SetConstant(d, d == md ? public_interface : NULL, "THYPHY_TYPE_STRING",SWIG_From_int(static_cast< int >(0)));
+  SWIG_Python_SetConstant(d, d == md ? public_interface : NULL, "THYPHY_TYPE_NUMBER",SWIG_From_int(static_cast< int >(1)));
+  SWIG_Python_SetConstant(d, d == md ? public_interface : NULL, "THYPHY_TYPE_MATRIX",SWIG_From_int(static_cast< int >(2)));
+  
+  /* type '::_THyPhyReturnObject' */
+  builtin_pytype = (PyTypeObject *)&SwigPyBuiltin___THyPhyReturnObject_type;
+  builtin_pytype->tp_dict = d = PyDict_New();
+  SwigPyBuiltin_SetMetaType(builtin_pytype, metatype);
+  builtin_pytype->tp_new = PyType_GenericNew;
+  builtin_base_count = 0;
+  builtin_bases[builtin_base_count] = NULL;
+  SwigPyBuiltin_InitBases(builtin_pytype, builtin_bases);
+  PyDict_SetItemString(d, "this", this_descr);
+  PyDict_SetItemString(d, "thisown", thisown_descr);
+  if (PyType_Ready(builtin_pytype) < 0) {
+    PyErr_SetString(PyExc_TypeError, "Could not create type '_THyPhyReturnObject'.");
+#if PY_VERSION_HEX >= 0x03000000
+    return NULL;
+#else
+    return;
+#endif
+  }
+  Py_INCREF(builtin_pytype);
+  PyModule_AddObject(m, "_THyPhyReturnObject", (PyObject*) builtin_pytype);
+  SwigPyBuiltin_AddPublicSymbol(public_interface, "_THyPhyReturnObject");
+  d = md;
+  
+  /* type '::_THyPhyString' */
+  builtin_pytype = (PyTypeObject *)&SwigPyBuiltin___THyPhyString_type;
+  builtin_pytype->tp_dict = d = PyDict_New();
+  SwigPyBuiltin_SetMetaType(builtin_pytype, metatype);
+  builtin_pytype->tp_new = PyType_GenericNew;
+  builtin_base_count = 0;
+  builtin_basetype = SWIG_MangledTypeQuery("_p__THyPhyReturnObject");
+  if (builtin_basetype && builtin_basetype->clientdata && ((SwigPyClientData*) builtin_basetype->clientdata)->pytype) {
+    builtin_bases[builtin_base_count++] = ((SwigPyClientData*) builtin_basetype->clientdata)->pytype;
+  } else {
+    PyErr_SetString(PyExc_TypeError, "Could not create type '_THyPhyString' as base '_THyPhyReturnObject' has not been initialized.\n");
+#if PY_VERSION_HEX >= 0x03000000
+    return NULL;
+#else
+    return;
+#endif
+  }
+  builtin_bases[builtin_base_count] = NULL;
+  SwigPyBuiltin_InitBases(builtin_pytype, builtin_bases);
+  PyDict_SetItemString(d, "this", this_descr);
+  PyDict_SetItemString(d, "thisown", thisown_descr);
+  if (PyType_Ready(builtin_pytype) < 0) {
+    PyErr_SetString(PyExc_TypeError, "Could not create type '_THyPhyString'.");
+#if PY_VERSION_HEX >= 0x03000000
+    return NULL;
+#else
+    return;
+#endif
+  }
+  Py_INCREF(builtin_pytype);
+  PyModule_AddObject(m, "_THyPhyString", (PyObject*) builtin_pytype);
+  SwigPyBuiltin_AddPublicSymbol(public_interface, "_THyPhyString");
+  d = md;
+  
+  /* type '::_THyPhyNumber' */
+  builtin_pytype = (PyTypeObject *)&SwigPyBuiltin___THyPhyNumber_type;
+  builtin_pytype->tp_dict = d = PyDict_New();
+  SwigPyBuiltin_SetMetaType(builtin_pytype, metatype);
+  builtin_pytype->tp_new = PyType_GenericNew;
+  builtin_base_count = 0;
+  builtin_basetype = SWIG_MangledTypeQuery("_p__THyPhyReturnObject");
+  if (builtin_basetype && builtin_basetype->clientdata && ((SwigPyClientData*) builtin_basetype->clientdata)->pytype) {
+    builtin_bases[builtin_base_count++] = ((SwigPyClientData*) builtin_basetype->clientdata)->pytype;
+  } else {
+    PyErr_SetString(PyExc_TypeError, "Could not create type '_THyPhyNumber' as base '_THyPhyReturnObject' has not been initialized.\n");
+#if PY_VERSION_HEX >= 0x03000000
+    return NULL;
+#else
+    return;
+#endif
+  }
+  builtin_bases[builtin_base_count] = NULL;
+  SwigPyBuiltin_InitBases(builtin_pytype, builtin_bases);
+  PyDict_SetItemString(d, "this", this_descr);
+  PyDict_SetItemString(d, "thisown", thisown_descr);
+  if (PyType_Ready(builtin_pytype) < 0) {
+    PyErr_SetString(PyExc_TypeError, "Could not create type '_THyPhyNumber'.");
+#if PY_VERSION_HEX >= 0x03000000
+    return NULL;
+#else
+    return;
+#endif
+  }
+  Py_INCREF(builtin_pytype);
+  PyModule_AddObject(m, "_THyPhyNumber", (PyObject*) builtin_pytype);
+  SwigPyBuiltin_AddPublicSymbol(public_interface, "_THyPhyNumber");
+  d = md;
+  
+  /* type '::_THyPhyMatrix' */
+  builtin_pytype = (PyTypeObject *)&SwigPyBuiltin___THyPhyMatrix_type;
+  builtin_pytype->tp_dict = d = PyDict_New();
+  SwigPyBuiltin_SetMetaType(builtin_pytype, metatype);
+  builtin_pytype->tp_new = PyType_GenericNew;
+  builtin_base_count = 0;
+  builtin_basetype = SWIG_MangledTypeQuery("_p__THyPhyReturnObject");
+  if (builtin_basetype && builtin_basetype->clientdata && ((SwigPyClientData*) builtin_basetype->clientdata)->pytype) {
+    builtin_bases[builtin_base_count++] = ((SwigPyClientData*) builtin_basetype->clientdata)->pytype;
+  } else {
+    PyErr_SetString(PyExc_TypeError, "Could not create type '_THyPhyMatrix' as base '_THyPhyReturnObject' has not been initialized.\n");
+#if PY_VERSION_HEX >= 0x03000000
+    return NULL;
+#else
+    return;
+#endif
+  }
+  builtin_bases[builtin_base_count] = NULL;
+  SwigPyBuiltin_InitBases(builtin_pytype, builtin_bases);
+  PyDict_SetItemString(d, "this", this_descr);
+  PyDict_SetItemString(d, "thisown", thisown_descr);
+  if (PyType_Ready(builtin_pytype) < 0) {
+    PyErr_SetString(PyExc_TypeError, "Could not create type '_THyPhyMatrix'.");
+#if PY_VERSION_HEX >= 0x03000000
+    return NULL;
+#else
+    return;
+#endif
+  }
+  Py_INCREF(builtin_pytype);
+  PyModule_AddObject(m, "_THyPhyMatrix", (PyObject*) builtin_pytype);
+  SwigPyBuiltin_AddPublicSymbol(public_interface, "_THyPhyMatrix");
+  d = md;
+  
+  /* type '::_THyPhy' */
+  builtin_pytype = (PyTypeObject *)&SwigPyBuiltin___THyPhy_type;
+  builtin_pytype->tp_dict = d = PyDict_New();
+  SwigPyBuiltin_SetMetaType(builtin_pytype, metatype);
+  builtin_pytype->tp_new = PyType_GenericNew;
+  builtin_base_count = 0;
+  builtin_bases[builtin_base_count] = NULL;
+  SwigPyBuiltin_InitBases(builtin_pytype, builtin_bases);
+  PyDict_SetItemString(d, "this", this_descr);
+  PyDict_SetItemString(d, "thisown", thisown_descr);
+  if (PyType_Ready(builtin_pytype) < 0) {
+    PyErr_SetString(PyExc_TypeError, "Could not create type '_THyPhy'.");
+#if PY_VERSION_HEX >= 0x03000000
+    return NULL;
+#else
+    return;
+#endif
+  }
+  Py_INCREF(builtin_pytype);
+  PyModule_AddObject(m, "_THyPhy", (PyObject*) builtin_pytype);
+  SwigPyBuiltin_AddPublicSymbol(public_interface, "_THyPhy");
+  d = md;
+  PyDict_SetItemString(md,(char*)"cvar", SWIG_globals());
+  SwigPyBuiltin_AddPublicSymbol(public_interface, "cvar");
+  SWIG_addvarlink(SWIG_globals(),(char*)"globalInterfaceInstance",Swig_var_globalInterfaceInstance_get, Swig_var_globalInterfaceInstance_set);
+#if PY_VERSION_HEX >= 0x03000000
+  return m;
+#else
+  return;
+#endif
+}
+
diff --git a/src/lib/batchfiles.list b/src/lib/batchfiles.list
new file mode 100644
index 0000000..61bd176
--- /dev/null
+++ b/src/lib/batchfiles.list
@@ -0,0 +1,530 @@
+res/ChartAddIns/Approximate_CDF
+res/ChartAddIns/Column Operations
+res/ChartAddIns/Complex Select Cells By Value
+res/ChartAddIns/Contigency Table
+res/ChartAddIns/Covariance
+res/ChartAddIns/DBAddIns/DescriptiveStats.bf
+res/ChartAddIns/DBAddIns/FromSQLFlatFile.bf
+res/ChartAddIns/DBAddIns/HY_DBW_TemplateList
+res/ChartAddIns/DBAddIns/ToChartWindow.bf
+res/ChartAddIns/DBAddIns/ToConsole.bf
+res/ChartAddIns/DBAddIns/ToFastaFile.bf
+res/ChartAddIns/DBAddIns/ToFastaFileFromPandit.bf
+res/ChartAddIns/DBAddIns/ToFrontierFastaFile.bf
+res/ChartAddIns/DBAddIns/ToSQLFlatFile.bf
+res/ChartAddIns/DBAddIns/ToTabFile.bf
+res/ChartAddIns/Descriptive Statistics
+res/ChartAddIns/Distribution Moments
+res/ChartAddIns/DistributionAddIns/Event Posteriors
+res/ChartAddIns/DistributionAddIns/Includes/posteriors.ibf
+res/ChartAddIns/DistributionAddIns/Most Likely Class Assignment
+res/ChartAddIns/DistributionAddIns/Posterior Distribution
+res/ChartAddIns/DistributionAddIns/Posterior Moments
+res/ChartAddIns/DistributionAddIns/Prior Moments
+res/ChartAddIns/Gaussian Penalty Clustering
+res/ChartAddIns/Goodness of Fit
+res/ChartAddIns/Histogram
+res/ChartAddIns/K-Mean Clustering
+res/ChartAddIns/KH Resampler
+res/ChartAddIns/Linear Fit
+res/ChartAddIns/Mean Profile Plot
+res/ChartAddIns/Median Profile Plot
+res/ChartAddIns/Poisson Mixture Fit
+res/ChartAddIns/Populate Cells
+res/ChartAddIns/Profile Mean Clustering
+res/ChartAddIns/Running Sum
+res/ChartAddIns/Samplers/lhc.bf
+res/ChartAddIns/Samplers/sir.bf
+res/ChartAddIns/Samplers/srs.ibf
+res/ChartAddIns/Select Cells By Index
+res/ChartAddIns/Select Cells By Value
+res/ChartAddIns/SingleColumn
+res/ChartAddIns/Sort
+res/data/.DS_Store
+res/data/brown.nuc
+res/data/integrase_BDA.nex
+res/data/p51.aa
+res/data/p51.nex
+res/DatapanelAddIns/Character Plot
+res/DatapanelAddIns/Character Plot Two
+res/DatapanelAddIns/Compare Subsets
+res/DatapanelAddIns/ibfs/char_colors.def
+res/DatapanelAddIns/Sequence Plot
+res/DatapanelAddIns/TBD/Character Plot By Sequence
+res/GeneticCodes/Alt_Yeast_Nuclear.cod
+res/GeneticCodes/Ascidian_mtDNA.cod
+res/GeneticCodes/Blepharisma_Nuclear.cod
+res/GeneticCodes/Ciliate.cod
+res/GeneticCodes/Echinoderm_mtDNA.cod
+res/GeneticCodes/Euplotid_Nuclear.cod
+res/GeneticCodes/Flatworm_mtDNA.cod
+res/GeneticCodes/Invertebrate_mtDNA.cod
+res/GeneticCodes/Mold_mtDNA.cod
+res/GeneticCodes/Thraustochytrium_mtDNA.cod
+res/GeneticCodes/Vertebratemtdna.cod
+res/GeneticCodes/Yeast_mtDNA.cod
+res/SubstitutionClasses/aa.bf
+res/SubstitutionClasses/AAEFV/Equal
+res/SubstitutionClasses/AAEFV/Estimated
+res/SubstitutionClasses/AAEFV/Observed In Data Set
+res/SubstitutionClasses/AAEFV/Observed In Partition
+res/SubstitutionClasses/codon.bf
+res/SubstitutionClasses/CodonEFV/Equal
+res/SubstitutionClasses/CodonEFV/Observed Codon
+res/SubstitutionClasses/CodonEFV/Observed Nuc 3 params.
+res/SubstitutionClasses/CodonEFV/Observed Nuc 9 params.
+res/SubstitutionClasses/dinuc.bf
+res/SubstitutionClasses/Heterogeneity/2 Bin Discrete
+res/SubstitutionClasses/Heterogeneity/Beta
+res/SubstitutionClasses/Heterogeneity/Beta-Gamma
+res/SubstitutionClasses/Heterogeneity/General Discrete
+res/SubstitutionClasses/Heterogeneity/Half Normal
+res/SubstitutionClasses/Heterogeneity/Lognormal
+res/SubstitutionClasses/nuc.bf
+res/SubstitutionClasses/NucEFV/Equal
+res/SubstitutionClasses/NucEFV/Estimated
+res/SubstitutionClasses/NucEFV/Observed In Data Set
+res/SubstitutionClasses/NucEFV/Observed In Partition
+res/SubstitutionModels/Aminoacid/Dayhoff.mdl
+res/SubstitutionModels/Aminoacid/EIAA.mdl
+res/SubstitutionModels/Aminoacid/Fitness.mdl
+res/SubstitutionModels/Aminoacid/Jones.mdl
+res/SubstitutionModels/Aminoacid/mtREV.mdl
+res/SubstitutionModels/Binary/F81.mdl
+res/SubstitutionModels/Codon/GY94_3x4.mdl
+res/SubstitutionModels/Codon/Lineage_MG94xHKY85.mdl
+res/SubstitutionModels/Codon/MG94.mdl
+res/SubstitutionModels/Codon/MG94_3x4.mdl
+res/SubstitutionModels/Codon/MG94_HKY85x3_4.mdl
+res/SubstitutionModels/Codon/MG94_REV_3x4.mdl
+res/SubstitutionModels/Codon/MG94_REV_3x4.mdl copy
+res/SubstitutionModels/Codon/MG94REVOmegaCF3x4.mdl
+res/SubstitutionModels/Codon/MG94xHKY85_3x4_2Rates.mdl
+res/SubstitutionModels/Codon/MG94xREV_3x4_DualRV.mdl
+res/SubstitutionModels/Codon/MG94xREV_3x4_DualRV_GDD.mdl
+res/SubstitutionModels/Codon/MG94xTN93_3x4.mdl
+res/SubstitutionModels/Nucleotide/EFVEstimated.ibf
+res/SubstitutionModels/Nucleotide/F81.mdl
+res/SubstitutionModels/Nucleotide/HKY85.mdl
+res/SubstitutionModels/Nucleotide/REV.mdl
+res/SubstitutionModels/Nucleotide/REVBetaGamma.mdl
+res/SubstitutionModels/Nucleotide/TrN.mdl
+res/SubstitutionModels/User/Nucleotide/JC69
+res/SubstitutionModels/User/Nucleotide/K2P
+res/TemplateBatchFiles/2RatesAnalyses/discreteGenerator.bf
+res/TemplateBatchFiles/2RatesAnalyses/discreteGeneratorNoPS.bf
+res/TemplateBatchFiles/2RatesAnalyses/gamma1.def
+res/TemplateBatchFiles/2RatesAnalyses/gamma2+Inv.def
+res/TemplateBatchFiles/2RatesAnalyses/gamma2.def
+res/TemplateBatchFiles/2RatesAnalyses/GY94.mdl
+res/TemplateBatchFiles/2RatesAnalyses/MG94GY94xREV_PARRIS_syn3.mdl
+res/TemplateBatchFiles/2RatesAnalyses/MG94xREV.mdl
+res/TemplateBatchFiles/2RatesAnalyses/MG94xREVxBivariate.mdl
+res/TemplateBatchFiles/2RatesAnalyses/MG94xREVxBivariate_Multirate.mdl
+res/TemplateBatchFiles/2RatesAnalyses/PARRIS_M1.def
+res/TemplateBatchFiles/2RatesAnalyses/PARRIS_M2.def
+res/TemplateBatchFiles/2RatesAnalyses/PARRIS_M3.def
+res/TemplateBatchFiles/2RatesAnalyses/PARRIS_syn3.def
+res/TemplateBatchFiles/2RatesAnalyses/PARRIS_synvar.def
+res/TemplateBatchFiles/454.bf
+res/TemplateBatchFiles/_BMS_Aux.ibf
+res/TemplateBatchFiles/_CMS_Aux.ibf
+res/TemplateBatchFiles/_MFReader_.ibf
+res/TemplateBatchFiles/_MSCOneStep.ibf
+res/TemplateBatchFiles/_tipDater.ibf
+res/TemplateBatchFiles/AAModelComparison.bf
+res/TemplateBatchFiles/AddABias.ibf
+res/TemplateBatchFiles/AnalyzeCodonData.bf
+res/TemplateBatchFiles/AnalyzeCodonDataMPI.bf
+res/TemplateBatchFiles/AnalyzeDiNucData.bf
+res/TemplateBatchFiles/AnalyzeNucDataFreq.bf
+res/TemplateBatchFiles/AnalyzeNucDataFreq2.bf
+res/TemplateBatchFiles/AnalyzeNucProtData.bf
+res/TemplateBatchFiles/AnalyzeNucProtData2.bf
+res/TemplateBatchFiles/BGM.bf
+res/TemplateBatchFiles/binomial.ibf
+res/TemplateBatchFiles/BivariateCodonRateAnalysis.bf
+res/TemplateBatchFiles/BranchClassDNDS.bf
+res/TemplateBatchFiles/BranchSiteREL.bf
+res/TemplateBatchFiles/BranchSwap.bf
+res/TemplateBatchFiles/branchSwappingFunctions.bf
+res/TemplateBatchFiles/BS2007.bf
+res/TemplateBatchFiles/categoryEcho.bf
+res/TemplateBatchFiles/chooseDistanceFormula.def
+res/TemplateBatchFiles/CleanGaps.bf
+res/TemplateBatchFiles/CleanStopCodons.bf
+res/TemplateBatchFiles/ClusterAnalysis.bf
+res/TemplateBatchFiles/ClusterByDistanceRange.bf
+res/TemplateBatchFiles/CodonBivariateRateProcessor.bf
+res/TemplateBatchFiles/CodonModelCompare.bf
+res/TemplateBatchFiles/CodonToProtein.bf
+res/TemplateBatchFiles/CodonUsageBias.bf
+res/TemplateBatchFiles/CompareSelectivePressure.bf
+res/TemplateBatchFiles/CompareSelectivePressureIVL.bf
+res/TemplateBatchFiles/ConvertDataFile.bf
+res/TemplateBatchFiles/DatedTipsMolecularClock.bf
+res/TemplateBatchFiles/DirectionalREL.bf
+res/TemplateBatchFiles/DirectionalREL_MF.bf
+res/TemplateBatchFiles/DistanceMatrix.bf
+res/TemplateBatchFiles/DistanceMatrix_Splits.bf
+res/TemplateBatchFiles/distanceMethodNPBootstrap.bf
+res/TemplateBatchFiles/distanceRMethodNPBootstrap.bf
+res/TemplateBatchFiles/Distances/CodonTools.def
+res/TemplateBatchFiles/Distances/CodonTools2.def
+res/TemplateBatchFiles/Distances/CodonToolsMain.def
+res/TemplateBatchFiles/Distances/JC69
+res/TemplateBatchFiles/Distances/K2P
+res/TemplateBatchFiles/Distances/K2P_RV
+res/TemplateBatchFiles/Distances/Modified_Nei_Gojobori
+res/TemplateBatchFiles/Distances/Nei_Gojobori
+res/TemplateBatchFiles/Distances/p_Distance
+res/TemplateBatchFiles/Distances/p_Distance_aa
+res/TemplateBatchFiles/Distances/p_Distance_binary
+res/TemplateBatchFiles/Distances/p_Distance_codon
+res/TemplateBatchFiles/Distances/PC
+res/TemplateBatchFiles/Distances/PC_MH
+res/TemplateBatchFiles/Distances/PC_RV
+res/TemplateBatchFiles/Distances/T3P
+res/TemplateBatchFiles/Distances/TN84
+res/TemplateBatchFiles/Distances/TN93
+res/TemplateBatchFiles/Distances/TN93_RV
+res/TemplateBatchFiles/Distances/Unaligned_LZ
+res/TemplateBatchFiles/Distances/Unaligned_LZ_FR
+res/TemplateBatchFiles/dNdSBivariateRateAnalysis.bf
+res/TemplateBatchFiles/dNdSBivariateRateAnalysis_CompareDS.bf
+res/TemplateBatchFiles/dNdSDistributionComparison.bf
+res/TemplateBatchFiles/dNdSDistributionComparisonMF.bf
+res/TemplateBatchFiles/dNdSDistributionComparisonPartitions.bf
+res/TemplateBatchFiles/dNdSRateAnalysis.bf
+res/TemplateBatchFiles/dNdSRateAnalysis_MF.bf
+res/TemplateBatchFiles/dNdSResultProcessor.bf
+res/TemplateBatchFiles/doNNISwap.bf
+res/TemplateBatchFiles/doSPRSwap.bf
+res/TemplateBatchFiles/dSdNTreeTools.ibf
+res/TemplateBatchFiles/F_ST.bf
+res/TemplateBatchFiles/files.lst
+res/TemplateBatchFiles/FitnessAAModels.bf
+res/TemplateBatchFiles/GA_CHC.ibf
+res/TemplateBatchFiles/GA_CHC_Binary.ibf
+res/TemplateBatchFiles/GA_CHC_kernel.ibf
+res/TemplateBatchFiles/GADatedClock.bf
+res/TemplateBatchFiles/GADatedClock.ibf
+res/TemplateBatchFiles/GADatedClockProcessor.bf
+res/TemplateBatchFiles/GADatedClockProcessorM.bf
+res/TemplateBatchFiles/GARD.bf
+res/TemplateBatchFiles/GARD_GA_CHC.ibf
+res/TemplateBatchFiles/GARDProcessor.bf
+res/TemplateBatchFiles/GARecomb.bf
+res/TemplateBatchFiles/Gateaux.bf
+res/TemplateBatchFiles/Gateaux2.bf
+res/TemplateBatchFiles/GateauxMR.bf
+res/TemplateBatchFiles/globalChecker.ibf
+res/TemplateBatchFiles/GUI/crayolaColors.def
+res/TemplateBatchFiles/heuristicMethodNPBootstrap.bf
+res/TemplateBatchFiles/Kernel_k_means.bf
+res/TemplateBatchFiles/Kernel_PCA.bf
+res/TemplateBatchFiles/Kernel_support.ibf
+res/TemplateBatchFiles/KHTest.bf
+res/TemplateBatchFiles/last.date
+res/TemplateBatchFiles/LHT.bf
+res/TemplateBatchFiles/LocalBranchSiteTest.bf
+res/TemplateBatchFiles/LocalMolClock.bf
+res/TemplateBatchFiles/LRTRecombTest.bf
+res/TemplateBatchFiles/LZ_Complexity.bf
+res/TemplateBatchFiles/MaxChi2.bf
+res/TemplateBatchFiles/MEDS.bf
+res/TemplateBatchFiles/MergeSequences.bf
+res/TemplateBatchFiles/MergeSites.bf
+res/TemplateBatchFiles/MFPositiveSelection.bf
+res/TemplateBatchFiles/MFPositiveSelectionPooled.bf
+res/TemplateBatchFiles/MFPSreader.def
+res/TemplateBatchFiles/MGvsGY.bf
+res/TemplateBatchFiles/ModelSelectorAAProcessor.bf
+res/TemplateBatchFiles/ModelSelectorBranch.bf
+res/TemplateBatchFiles/ModelSelectorCodon.bf
+res/TemplateBatchFiles/ModelSelectorCodon.ibf
+res/TemplateBatchFiles/ModelSelectorCodonProcessor.bf
+res/TemplateBatchFiles/ModelSelectorRNA.bf
+res/TemplateBatchFiles/ModelSelectorRNA_1.bf
+res/TemplateBatchFiles/ModelTest.bf
+res/TemplateBatchFiles/MolClockAllRoots.bf
+res/TemplateBatchFiles/molclockBootstrap.bf
+res/TemplateBatchFiles/MolecularClock.bf
+res/TemplateBatchFiles/NeighborJoining.bf
+res/TemplateBatchFiles/NielsenYang.bf
+res/TemplateBatchFiles/NucModelCompare.bf
+res/TemplateBatchFiles/pairwiseDistanceEstimator.ibf
+res/TemplateBatchFiles/pairwiseDistanceEstimatorCounter.ibf
+res/TemplateBatchFiles/PairwiseDNDS.bf
+res/TemplateBatchFiles/PairwiseRelativeRate.bf
+res/TemplateBatchFiles/PairwiseRelativeRatio.bf
+res/TemplateBatchFiles/PairwiseSiteDiversity.bf
+res/TemplateBatchFiles/PARRIS.bf
+res/TemplateBatchFiles/PartitionDataFile.bf
+res/TemplateBatchFiles/PartitionRateComparison.bf
+res/TemplateBatchFiles/partitionSequences.ibf
+res/TemplateBatchFiles/Phylohandbook.bf
+res/TemplateBatchFiles/Plato.bf
+res/TemplateBatchFiles/PositiveSelectionLI.bf
+res/TemplateBatchFiles/post_ancestors.bf
+res/TemplateBatchFiles/post_counting.bf
+res/TemplateBatchFiles/post_covariance.bf
+res/TemplateBatchFiles/post_dNdS.bf
+res/TemplateBatchFiles/post_lfprofile.bf
+res/TemplateBatchFiles/post_npbs.bf
+res/TemplateBatchFiles/post_pbs.bf
+res/TemplateBatchFiles/post_sampler.bf
+res/TemplateBatchFiles/post_saveResults.bf
+res/TemplateBatchFiles/post_sns.bf
+res/TemplateBatchFiles/post_variance.bf
+res/TemplateBatchFiles/post_viewResults.bf
+res/TemplateBatchFiles/postprocessors.lst
+res/TemplateBatchFiles/qndhelper1.ibf
+res/TemplateBatchFiles/qndhelper1_mf.ibf
+res/TemplateBatchFiles/qndhelper2.ibf
+res/TemplateBatchFiles/qndhelper2_mf.ibf
+res/TemplateBatchFiles/qndhelper3.ibf
+res/TemplateBatchFiles/qndhelper4.ibf
+res/TemplateBatchFiles/queryTree.bf
+res/TemplateBatchFiles/QuickSelectionDetection.bf
+res/TemplateBatchFiles/QuickSelectionDetectionMF.bf
+res/TemplateBatchFiles/RateClassCounter.bf
+res/TemplateBatchFiles/readIndexFile.bf
+res/TemplateBatchFiles/ReduceDataSetMatrix.bf
+res/TemplateBatchFiles/RelativeRate.bf
+res/TemplateBatchFiles/RelativeRateL.bf
+res/TemplateBatchFiles/RelativeRatio.bf
+res/TemplateBatchFiles/relrateBootstrap.bf
+res/TemplateBatchFiles/relrateBootstrapL.bf
+res/TemplateBatchFiles/relratioBootstrap.bf
+res/TemplateBatchFiles/SampleProcessor.bf
+res/TemplateBatchFiles/Samplers/lhc.bf
+res/TemplateBatchFiles/Samplers/lhc_supp.ibf
+res/TemplateBatchFiles/Samplers/sir.bf
+res/TemplateBatchFiles/Samplers/srs.ibf
+res/TemplateBatchFiles/SandNSAmbigs.bf
+res/TemplateBatchFiles/SelectionLRT.bf
+res/TemplateBatchFiles/selectModelParameters.bf
+res/TemplateBatchFiles/SeqAlignment.bf
+res/TemplateBatchFiles/SeqAlignmentCodon.bf
+res/TemplateBatchFiles/SeqAlignmentCodonShared.ibf
+res/TemplateBatchFiles/SeqAlignmentNuc.bf
+res/TemplateBatchFiles/SeqAlignmentNucShared.ibf
+res/TemplateBatchFiles/SeqAlignmentProt.bf
+res/TemplateBatchFiles/SeqAlignmentTop75.bf
+res/TemplateBatchFiles/SeqAlignShared.ibf
+res/TemplateBatchFiles/SequentialAddition.bf
+res/TemplateBatchFiles/SequentialAddition.ibf
+res/TemplateBatchFiles/SGASimProcessor.bf
+res/TemplateBatchFiles/SGEmulator.bf
+res/TemplateBatchFiles/SGEmulator_MF.bf
+res/TemplateBatchFiles/SGIvL.bf
+res/TemplateBatchFiles/SimilarityPlot.bf
+res/TemplateBatchFiles/SimmondsAI.bf
+res/TemplateBatchFiles/simpleBootstrap.bf
+res/TemplateBatchFiles/SimpleMutationCounter.bf
+res/TemplateBatchFiles/SingleBreakpointRecomb-2.bf
+res/TemplateBatchFiles/SingleBreakpointRecomb.bf
+res/TemplateBatchFiles/SiteRates.bf
+res/TemplateBatchFiles/SiteRates2.bf
+res/TemplateBatchFiles/SlatkinMaddison-2parts.bf
+res/TemplateBatchFiles/SlatkinMaddison.bf
+res/TemplateBatchFiles/SlidingNucWindow.bf
+res/TemplateBatchFiles/SlidingWindowAnalysis.bf
+res/TemplateBatchFiles/SplitSequencesByPattern.bf
+res/TemplateBatchFiles/SSRatesTest.bf
+res/TemplateBatchFiles/StarDecomposition.bf
+res/TemplateBatchFiles/StrandGRMTest.bf
+res/TemplateBatchFiles/StripStopCodons.bf
+res/TemplateBatchFiles/SubtreeSelectionComparison.bf
+res/TemplateBatchFiles/TemplateModels/190
+res/TemplateBatchFiles/TemplateModels/BranchSiteTemplate.mdl
+res/TemplateBatchFiles/TemplateModels/CF3x4.bf
+res/TemplateBatchFiles/TemplateModels/chooseGeneticCode.def
+res/TemplateBatchFiles/TemplateModels/custm4x4.mdl
+res/TemplateBatchFiles/TemplateModels/Custom_AA.mdl
+res/TemplateBatchFiles/TemplateModels/Custom_AA_empirical.mdl
+res/TemplateBatchFiles/TemplateModels/Dayhoff.mdl
+res/TemplateBatchFiles/TemplateModels/Dayhoff_F.mdl
+res/TemplateBatchFiles/TemplateModels/Default
+res/TemplateBatchFiles/TemplateModels/defineGamma.mdl
+res/TemplateBatchFiles/TemplateModels/defineHM.mdl
+res/TemplateBatchFiles/TemplateModels/ECM+F+omega.mdl
+res/TemplateBatchFiles/TemplateModels/ECM+F.mdl
+res/TemplateBatchFiles/TemplateModels/ECM+F3x4.mdl
+res/TemplateBatchFiles/TemplateModels/ECM+MLFREQS.mdl
+res/TemplateBatchFiles/TemplateModels/ECM.mdl
+res/TemplateBatchFiles/TemplateModels/EIAA.mdl
+res/TemplateBatchFiles/TemplateModels/EIAAFreq.mdl
+res/TemplateBatchFiles/TemplateModels/EmpiricalAA/BLOSUM62
+res/TemplateBatchFiles/TemplateModels/EmpiricalAA/cpREV
+res/TemplateBatchFiles/TemplateModels/EmpiricalAA/Dayhoff
+res/TemplateBatchFiles/TemplateModels/EmpiricalAA/H5N1
+res/TemplateBatchFiles/TemplateModels/EmpiricalAA/HIVBetween
+res/TemplateBatchFiles/TemplateModels/EmpiricalAA/HIVWithin
+res/TemplateBatchFiles/TemplateModels/EmpiricalAA/IAV
+res/TemplateBatchFiles/TemplateModels/EmpiricalAA/JTT
+res/TemplateBatchFiles/TemplateModels/EmpiricalAA/LCAP
+res/TemplateBatchFiles/TemplateModels/EmpiricalAA/LG
+res/TemplateBatchFiles/TemplateModels/EmpiricalAA/modellist.ibf
+res/TemplateBatchFiles/TemplateModels/EmpiricalAA/MtArt
+res/TemplateBatchFiles/TemplateModels/EmpiricalAA/mtMAM
+res/TemplateBatchFiles/TemplateModels/EmpiricalAA/mtREV24
+res/TemplateBatchFiles/TemplateModels/EmpiricalAA/rtREV
+res/TemplateBatchFiles/TemplateModels/EmpiricalAA/VT
+res/TemplateBatchFiles/TemplateModels/EmpiricalAA/WAG
+res/TemplateBatchFiles/TemplateModels/EmpiricalCodon/.DS_Store
+res/TemplateBatchFiles/TemplateModels/EmpiricalCodon/KHG_ECM
+res/TemplateBatchFiles/TemplateModels/EmpiricalCodon/KHG_ECMu
+res/TemplateBatchFiles/TemplateModels/EX.dat
+res/TemplateBatchFiles/TemplateModels/EX.mdl
+res/TemplateBatchFiles/TemplateModels/F81.mdl
+res/TemplateBatchFiles/TemplateModels/F81_binary.mdl
+res/TemplateBatchFiles/TemplateModels/F84.mdl
+res/TemplateBatchFiles/TemplateModels/F84P.mdl
+res/TemplateBatchFiles/TemplateModels/fitness.mdl
+res/TemplateBatchFiles/TemplateModels/GRM.mdl
+res/TemplateBatchFiles/TemplateModels/GY94.ibf
+res/TemplateBatchFiles/TemplateModels/GY94.mdl
+res/TemplateBatchFiles/TemplateModels/GY94customF3x4.mdl
+res/TemplateBatchFiles/TemplateModels/GY94w9.mdl
+res/TemplateBatchFiles/TemplateModels/HIVbetween+F.mdl
+res/TemplateBatchFiles/TemplateModels/HIVbetween.ibf
+res/TemplateBatchFiles/TemplateModels/HIVbetween.mdl
+res/TemplateBatchFiles/TemplateModels/HIVwithin+F.mdl
+res/TemplateBatchFiles/TemplateModels/HIVwithin.ibf
+res/TemplateBatchFiles/TemplateModels/HIVwithin.mdl
+res/TemplateBatchFiles/TemplateModels/HKY85.mdl
+res/TemplateBatchFiles/TemplateModels/JC69.mdl
+res/TemplateBatchFiles/TemplateModels/JC69_binary.mdl
+res/TemplateBatchFiles/TemplateModels/Jones.mdl
+res/TemplateBatchFiles/TemplateModels/Jones_F.mdl
+res/TemplateBatchFiles/TemplateModels/K2P.mdl
+res/TemplateBatchFiles/TemplateModels/K3ST.mdl
+res/TemplateBatchFiles/TemplateModels/LCAP.mdl
+res/TemplateBatchFiles/TemplateModels/MEC.mdl
+res/TemplateBatchFiles/TemplateModels/MG94.mdl
+res/TemplateBatchFiles/TemplateModels/MG94custom.mdl
+res/TemplateBatchFiles/TemplateModels/MG94customCF3x4.mdl
+res/TemplateBatchFiles/TemplateModels/MG94customF1x4.mdl
+res/TemplateBatchFiles/TemplateModels/MG94customFreqs.mdl
+res/TemplateBatchFiles/TemplateModels/MG94wAA.mdl
+res/TemplateBatchFiles/TemplateModels/MG94wAAF61.mdl
+res/TemplateBatchFiles/TemplateModels/MG94wAAF61multiple.mdl
+res/TemplateBatchFiles/TemplateModels/MG94wAAFreqs.mdl
+res/TemplateBatchFiles/TemplateModels/MG94wAAUserFreqs.mdl
+res/TemplateBatchFiles/TemplateModels/MG94wEX.mdl
+res/TemplateBatchFiles/TemplateModels/MG94with9freqs.mdl
+res/TemplateBatchFiles/TemplateModels/MG94x2.mdl
+res/TemplateBatchFiles/TemplateModels/MGFreqsEstimator.ibf
+res/TemplateBatchFiles/TemplateModels/MGwAA.ibf
+res/TemplateBatchFiles/TemplateModels/MGwEX.ibf
+res/TemplateBatchFiles/TemplateModels/modelParameters.mdl
+res/TemplateBatchFiles/TemplateModels/modelParameters2.mdl
+res/TemplateBatchFiles/TemplateModels/modelParameters3.mdl
+res/TemplateBatchFiles/TemplateModels/modelParameters4.mdl
+res/TemplateBatchFiles/TemplateModels/modelParameters5.mdl
+res/TemplateBatchFiles/TemplateModels/models.lst
+res/TemplateBatchFiles/TemplateModels/mtMAM.mdl
+res/TemplateBatchFiles/TemplateModels/mtMAM_F.mdl
+res/TemplateBatchFiles/TemplateModels/mtREV.mdl
+res/TemplateBatchFiles/TemplateModels/mtREV_24.mdl
+res/TemplateBatchFiles/TemplateModels/mtREV_24_F.mdl
+res/TemplateBatchFiles/TemplateModels/NRM+Freqs.mdl
+res/TemplateBatchFiles/TemplateModels/NRM.mdl
+res/TemplateBatchFiles/TemplateModels/PCH
+res/TemplateBatchFiles/TemplateModels/reducedREV.mdl
+res/TemplateBatchFiles/TemplateModels/RNA16.mdl
+res/TemplateBatchFiles/TemplateModels/RNA16A
+res/TemplateBatchFiles/TemplateModels/RNA16SvH.mdl
+res/TemplateBatchFiles/TemplateModels/RNAEqualInput
+res/TemplateBatchFiles/TemplateModels/RNAF81
+res/TemplateBatchFiles/TemplateModels/RNAMuse95.mdl
+res/TemplateBatchFiles/TemplateModels/RNAREV
+res/TemplateBatchFiles/TemplateModels/RNAREV_1
+res/TemplateBatchFiles/TemplateModels/rtREV.mdl
+res/TemplateBatchFiles/TemplateModels/rtREV_F.mdl
+res/TemplateBatchFiles/TemplateModels/S4
+res/TemplateBatchFiles/TemplateModels/STGRM.mdl
+res/TemplateBatchFiles/TemplateModels/TrN.mdl
+res/TemplateBatchFiles/TemplateModels/UniversalCode.def
+res/TemplateBatchFiles/TemplateModels/WAG.mdl
+res/TemplateBatchFiles/TemplateModels/WAG_F.mdl
+res/TemplateBatchFiles/TemplateModels/Yang2000Distributions.def
+res/TemplateBatchFiles/TestBranchDNDS.bf
+res/TemplateBatchFiles/TestClade.bf
+res/TemplateBatchFiles/TestCladeMeans.bf
+res/TemplateBatchFiles/TopologySearch.bf
+res/TemplateBatchFiles/TopologySearchConstrained.bf
+res/TemplateBatchFiles/TreeCorrelationCoefficients.bf
+res/TemplateBatchFiles/TreeTools.ibf
+res/TemplateBatchFiles/UpperBound.bf
+res/TemplateBatchFiles/Utility/AncestralMapper.bf
+res/TemplateBatchFiles/Utility/CoalescentPostProcessor.bf
+res/TemplateBatchFiles/Utility/CodonTools.bf
+res/TemplateBatchFiles/Utility/DBTools.ibf
+res/TemplateBatchFiles/Utility/DescriptiveStatistics.bf
+res/TemplateBatchFiles/Utility/GrabBag.bf
+res/TemplateBatchFiles/Utility/HXB2Mapper.bf
+res/TemplateBatchFiles/Utility/LocalMGREV.bf
+res/TemplateBatchFiles/Utility/LocalMGREVMLFreqs.bf
+res/TemplateBatchFiles/Utility/MPITools.bf
+res/TemplateBatchFiles/Utility/NJ.bf
+res/TemplateBatchFiles/Utility/PostScript.bf
+res/TemplateBatchFiles/Utility/ProbabilityDistributions.bf
+res/TemplateBatchFiles/Utility/PS_Plotters.bf
+res/TemplateBatchFiles/Utility/ReadDelimitedFiles.bf
+res/TemplateBatchFiles/Utility/TreeFunctions.bf
+res/TemplateBatchFiles/Utility/WriteDelimitedFiles.bf
+res/TemplateBatchFiles/WANC.bf
+res/TemplateBatchFiles/WebUpdate.bf
+res/TemplateBatchFiles/YangNielsenBranchSite2005.bf
+res/TopologyInference/Exhaustive_Search
+res/TopologyInference/Neighbor_Joining
+res/TopologyInference/Sequential_Addition
+res/TopologyInference/Star_Decomposition
+res/TopologyInference/Support/branchSwappingFunctions.bf
+res/TopologyInference/Support/doNNISwap.bf
+res/TopologyInference/Support/doSPRSwap.bf
+res/TreeAddIns/Splits
+res/TreeAddIns/Tree Statistics
+res/UserAddins/AAContent
+res/UserAddins/BatchFileByURL
+res/UserAddins/BranchLengthCI
+res/UserAddins/CodonMutationToTreeMapper
+res/UserAddins/CountSubstitutions
+res/UserAddins/ExportLikelihoodFunction
+res/UserAddins/GenBankSequences
+res/UserAddins/Includes/ChooseALF.ibf
+res/UserAddins/Includes/MappersHelp.ibf
+res/UserAddins/Includes/MappersHelpAA.ibf
+res/UserAddins/ListUserFunctions
+res/UserAddins/LRT
+res/UserAddins/MapSubstitutions
+res/UserAddins/MeanPairwiseDivergence
+res/UserAddins/MeanPairwiseDivergenceSubset
+res/UserAddins/ModelCounter
+res/UserAddins/OldAddins/AAMutationCounter
+res/UserAddins/OldAddins/CodonMutationToTreeMapper.bf
+res/UserAddins/OldAddins/ColorPSTree
+res/UserAddins/OldAddins/ConvergentAndParallel
+res/UserAddins/OldAddins/CopyBranchLengths
+res/UserAddins/OldAddins/DashPSTree
+res/UserAddins/OldAddins/dNanddSTrees.bf
+res/UserAddins/OldAddins/dS and dN factors
+res/UserAddins/OldAddins/ExpsPerDirection
+res/UserAddins/OldAddins/FilterAssignments
+res/UserAddins/OldAddins/InferredAASubstitutionsCounter
+res/UserAddins/OldAddins/LocaldNdS
+res/UserAddins/OldAddins/ModelFitSummary
+res/UserAddins/OldAddins/ModelFitSummaryAA
+res/UserAddins/OldAddins/Multiclass DN DS inference
+res/UserAddins/OldAddins/PartitionBranchesByClasses
+res/UserAddins/OldAddins/PredictivePosteriorP
+res/UserAddins/OldAddins/RNARateMatrix
+res/UserAddins/OldAddins/SimulateAndTabDN_DS
+res/UserAddins/OldAddins/SimulateFromLF
+res/UserAddins/OldAddins/TreeLengthConstraint
+res/UserAddins/RecombinationProcessor.bf
+res/UserAddins/SimulateFromLF
+res/UserAddins/Tidbits
diff --git a/src/lib/build.sh b/src/lib/build.sh
new file mode 100644
index 0000000..0a2d47f
--- /dev/null
+++ b/src/lib/build.sh
@@ -0,0 +1,186 @@
+#!/bin/sh
+
+
+TARGET_NAME="BLANK"
+LIBRARY_BINDINGS=""
+
+if [ $# -ne 1 -a $# -ne 2 ]
+then
+	TARGET_NAME="HELP";
+else
+	if [ $1 != "SP" -a $1 != "MP" -a $1 != "MP2"  -a $1 != "MPI" -a $1 != "DEBUG" -a $1 != "LIBRARY" ] 
+	then
+		$TARGET_NAME = "HELP"
+	else
+		TARGET_NAME=$1
+	fi
+fi
+
+if [ $TARGET_NAME = "HELP" ] 
+then
+	echo "Usage: build.sh package_name"
+	echo "  LIBRARY [Python|R]: multi-threaded library version with optional wrappers for Python or R."
+	exit 1
+fi
+
+if [ $TARGET_NAME = "LIBRARY" -a $# -eq 2 ]
+then
+	if [ $2 != "R" -a $2 != "Python" ] 
+	then
+		echo "Library binding options must be one of the following:"
+		echo "  LIBRARY [Python|R]: multi-threaded library version with optional wrappers for Python or R."
+		exit 1
+	else
+		echo "Library bindings for $2 will be linked into the library. See README for details"
+		LIBRARY_BINDINGS=$2
+	fi
+fi
+
+
+# MODIFY THESE BASED ON YOUR SYSTEM
+# DEFAULT SETTINGS ARE FOR GCC
+	
+COMPILER="g++";
+COMPILERC="gcc";
+sysName=`uname`;
+echo $sysName;
+CURL_LINKER_LIBS=" -lssl -lcrypto -lcurl";
+
+if [ $sysName == "Darwin" ]
+then
+	machName=`machine`;
+	if [ $machName == "ppc7450" ] 
+	then
+		COMPILER_FLAGS=" -D __UNIX__ -w -c -fsigned-char -fast -mcpu=7450 -fpermissive -I`pwd`/../Core -I`pwd`/../NewerFunctionality -I`pwd`/../../SQLite/trunk -D SQLITE_PTR_SIZE=sizeof(long) "
+	else
+		COMPILER_FLAGS=" -D __UNIX__ -w -c -fsigned-char -fast -fpermissive -I`pwd`/../Core -I`pwd`/../NewerFunctionality -I`pwd`/../../SQLite/trunk -D SQLITE_PTR_SIZE=sizeof(long) "	
+	fi
+	COMPILER_LINK_FLAGS=" -w -fsigned-char ";
+else
+	if [ $sysName == "AIX" ]
+	then
+		COMPILER="xlC";
+		COMPILERC="xlc";
+		COMPILER_FLAGS=" -c -qchar=signed -O3 -D SQLITE_PTR_SIZE=sizeof(long) -D __UNIX__ -I`pwd`/../Core -I`pwd`/../NewerFunctionality -I`pwd`/../../SQLite/trunk ";
+		COMPILER_LINK_FLAGS="  -qchar=signed ";
+	else
+		COMPILER_LINK_FLAGS=" -w -fsigned-char ";
+		COMPILER_FLAGS=" -w -c -fsigned-char -O3 -fpermissive -I`pwd`/../Core -I`pwd`/../NewerFunctionality -I`pwd`/../../SQLite/trunk -D SQLITE_PTR_SIZE=sizeof(long) -D __UNIX__ ";
+	fi
+fi
+
+
+# END MODIFY
+
+echo "Checking for curl";
+echo "#include <curl/curl.h>\nint main(void) {return 0;}" > curl_check.cpp
+
+if `$COMPILER -o curl_check -w $CURL_LINKER_LIBS curl_check.cpp`
+then
+ echo "Curl seems to be present"
+else
+	echo "Curl seems to be absent (setting up compiler options skip CURL code)";
+	CURL_LINKER_LIBS="";
+	COMPILER_FLAGS=$COMPILER_FLAGS" -D__HYPHY_NO_CURL__";
+	COMPILER_LINK_FLAGS=$COMPILER_LINK_FLAGS" -D__HYPHY_NO_CURL__";
+fi
+
+rm -rf curl_check*
+
+	
+makedir () {
+	if [ -f $1 ] 
+	then
+		echo "Insufficient permissions to create an object directory";
+		exit 1;
+	fi
+	
+	if [ ! -d $1  ]
+	then
+		if [ `mkdir $1` ]
+		then
+			echo "Failed to create directory $1";
+			exit 1;
+		fi
+	fi
+}
+
+compileAll () {
+	cd $1
+	for fileName in *$2
+	do
+	  obj_file=$3/$OBJ_DIR_NAME/${fileName}.o;
+	  if [ $obj_file -nt $fileName ]
+	  then
+		echo File "$fileName" is up to date
+	  else
+		  echo Building "$fileName";
+		  if [ $2 = "c" ]
+		  then 
+		  	ccd=$COMPILERC
+		  else
+		  	ccd=$COMPILER
+		  fi
+		  if `$ccd -o $obj_file $COMPILER_FLAGS -fvisibility=hidden $fileName `
+		   then
+			 echo Complete
+		   else
+				echo Error during compilation;
+				exit 1;
+		   fi
+	  fi
+	done
+	cd $3
+}
+
+OBJ_DIR_NAME="obj_$TARGET_NAME"
+
+if [ -f $OBJ_DIR_NAME ] 
+then
+	rm -rf $OBJ_DIR_NAME;
+fi
+
+makedir $OBJ_DIR_NAME
+
+
+if [ $1 = "LIBRARY" ] 
+then
+	LINKER_FLAGS=$CURL_LINKER_LIBS" -ldl -lm -lpthread ";
+	echo "+-----------------------------------------------------------+"
+	echo "|Building a multi-threaded HYPHY library version            |"
+	echo "+-----------------------------------------------------------+"
+	if [ $sysName == "Darwin" ]
+	then
+		TARGET_NAME="libhyphy.so";
+		COMPILER_FLAGS=$COMPILER_FLAGS" -fno-strict-aliasing -D __MP__ -D __MP2__ -D __HEADLESS__ -fPIC -I`pwd`/Link "
+		COMPILER_LINK_FLAGS=$COMPILER_LINK_FLAGS" -bundle -flat_namespace -undefined suppress "	
+	else
+		COMPILER_FLAGS=$COMPILER_FLAGS" -D __MP__ -D __MP2__ -D __HEADLESS__ -fPIC -I`pwd`/Link "
+		COMPILER_LINK_FLAGS=$COMPILER_LINK_FLAGS" -Wl,-shared "
+	fi
+	
+fi
+
+COMPILER_FLAGS=$COMPILER_FLAGS" -I `pwd`/../Source"
+
+echo "COMPILER=$COMPILER, $COMPILERC";
+echo "COMPILER_FLAGS=$COMPILER_FLAGS";
+
+compileAll ../Source cpp ../Library
+compileAll ../GUI preferences.cpp ../Library
+compileAll ../Source/SQLite c ../../Library
+
+if [ $LIBRARY_BINDINGS = "R" ]
+then	
+	echo $COMPILER_FLAGS
+	compileAll Link THyPhy.cpp ../
+	echo Linking HyPhy.so
+	cppf="PKG_CPPFLAGS=\"-I`pwd`/Link/\""
+	#echo  $cppf R CMD SHLIB -o LibraryModules/R/HyPhy.so $OBJ_DIR_NAME/*.o    Link/Source/THyPhy_R.cpp $LINKER_FLAGS
+	export $cppf; R CMD SHLIB -o LibraryModules/R/HyPhy.so $OBJ_DIR_NAME/*.o  SWIGWrappers/THyPhy_R.cpp	$LINKER_FLAGS	
+	echo R library written to `pwd`/LibraryModules/R/HyPhy.so
+fi
+
+echo Finished
+
+
diff --git a/src/lib/setup.py b/src/lib/setup.py
new file mode 100644
index 0000000..cf17360
--- /dev/null
+++ b/src/lib/setup.py
@@ -0,0 +1,95 @@
+#!/usr/bin/python
+
+from distutils.core      import setup, Extension
+from distutils.sysconfig import get_python_inc
+from os                  import listdir, getcwd, path
+from glob                import glob
+import sys
+
+from platform import architecture, mac_ver
+
+#incdir = get_python_inc(plat_specific=1)
+#print incdir
+
+
+#build the list of Source files
+
+scriptPath = path.realpath(path.dirname(sys.argv[0]))
+srcPath, libDir = path.split(scriptPath)
+hyphyPath, srcDir = path.split(srcPath)
+# with open('batchfiles.list') as fh:
+#     resFiles = [(f, path.join(*(['..'] * 5 + f.split('/')))) for f in fh.read().split('\n') if f != '']
+
+contribPath = path.join(hyphyPath, 'contrib')
+sqlitePath = path.join(contribPath, 'SQLite-3.8.2')
+
+linkPath = path.join(scriptPath, 'Link')
+coreSrcPath = path.join(srcPath, 'core')
+newSrcPath = path.join(srcPath, 'new')
+guiSrcPath = path.join(srcPath, 'gui')
+prefFile = [path.join(guiSrcPath, 'preferences.cpp')]
+if sys.version_info >= (3,0,0):
+    swigFile = [path.join(scriptPath, 'SWIGWrappers', 'THyPhy_py3.cpp')]
+else:
+    swigFile = [path.join(scriptPath, 'SWIGWrappers', 'THyPhy_python.cpp')]
+
+coreSrcFiles = glob(path.join(coreSrcPath, '*.cpp'))
+newSrcFiles = glob(path.join(newSrcPath, '*.cpp'))
+sqliteFiles = glob(path.join(sqlitePath, '*.c'))
+linkFiles = glob(path.join(linkPath, '*.cpp')) # + glob(path.join(linkPath, '*.cxx'))
+utilFiles = glob(path.join(srcPath, 'utils', '*.cpp'))
+
+sourceFiles = coreSrcFiles + newSrcFiles +  sqliteFiles + prefFile + linkFiles + swigFile + utilFiles
+
+includePaths =  [path.join(p, 'include') for p in [coreSrcPath, newSrcPath, guiSrcPath]]
+includePaths += [linkPath, contribPath, sqlitePath]
+
+# check for 64bit and define as such
+define_macros = [('__HYPHY_64__', None)] if '64' in architecture()[0] else []
+
+# openmp on Mac OS X Lion is broken
+openmp = ['-fopenmp'] if mac_ver()[0] < '10.7.0' else []
+
+setup(
+    name = 'HyPhy',
+    version = '0.1',
+    description = 'HyPhy package interface library',
+    author = 'Sergei L Kosakovsky Pond',
+    author_email = 'spond at ucsd.edu',
+    url = 'http://www.hyphy.org/',
+    packages = ['HyPhy'],
+    package_dir = {'HyPhy': 'LibraryModules/Python/HyPhy'},
+#    data_files = resFiles,
+    # py_modules = ['HyPhy'],
+    ext_modules = [Extension('_HyPhy',
+            sourceFiles,
+            include_dirs = includePaths,
+            define_macros = [('SQLITE_PTR_SIZE','sizeof(long)'),
+                             ('__UNIX__', None),
+                             ('__MP__', None),
+                             ('__MP2__', None),
+                             ('_SLKP_LFENGINE_REWRITE_', None),
+                             ('__AFYP_REWRITE_BGM__', None),
+                             ('__HEADLESS__', None),
+                             ('_HYPHY_LIBDIRECTORY_', '"/usr/local/lib/hyphy"')] + define_macros,
+            libraries = ['pthread', 'ssl', 'crypto', 'curl'],
+            extra_compile_args = [
+                    '-Wno-int-to-pointer-cast',
+                    # '-Wno-pointer-to-int-cast',
+                    '-Wno-char-subscripts',
+                    '-Wno-sign-compare',
+                    '-Wno-parentheses',
+                    '-Wno-uninitialized',
+#                    '-Wno-conversion-null',
+                    '-Wno-unused-variable',
+#                    '-Wno-unused-but-set-variable',
+                    '-Wno-shorten-64-to-32',
+                    '-fsigned-char',
+                    '-O3',
+                    '-fpermissive',
+                    '-fPIC',
+            ] + openmp,
+            extra_link_args = [
+            ] + openmp
+    )]
+)
diff --git a/src/mains/gtk.cpp b/src/mains/gtk.cpp
new file mode 100644
index 0000000..788b720
--- /dev/null
+++ b/src/mains/gtk.cpp
@@ -0,0 +1,424 @@
+/*
+
+HyPhy - Hypothesis Testing Using Phylogenies.
+
+Copyright (C) 1997-now
+Core Developers:
+  Sergei L Kosakovsky Pond (spond at ucsd.edu)
+  Art FY Poon    (apoon at cfenet.ubc.ca)
+  Steven Weaver (sweaver at ucsd.edu)
+  
+Module Developers:
+	Lance Hepler (nlhepler at gmail.com)
+	Martin Smith (martin.audacis at gmail.com)
+
+Significant contributions from:
+  Spencer V Muse (muse at stat.ncsu.edu)
+  Simon DW Frost (sdf22 at cam.ac.uk)
+
+Permission is hereby granted, free of charge, to any person obtaining a
+copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be included
+in all copies or substantial portions of the Software.
+
+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.
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+*/
+
+
+#include "HYDialogs.h"
+#include "hy_strings.h"
+#include "HYTreePanel.h"
+#include "HYDataPanel.h"
+#include "HYObjectInspector.h"
+#include "HYConsoleWindow.h"
+#include "HYEventTypes.h"
+
+#include <gtk/gtk.h>
+#include <gdk/gdk.h>
+#include <unistd.h>
+#include <time.h>
+#include <stdio.h>
+#include "batchlan.h"
+#include "calcnode.h"
+#include <unistd.h>
+//#include <curses.h>
+#include <termios.h>
+#ifdef   __MP2__
+#include <pthread.h>
+#endif
+
+#include "likefunc.h"
+#include "preferences.h"
+#include "HYSharedMain.h"
+
+#ifndef __HYPHY_NO_CURL__
+#define __HYPHYCURL__
+#endif
+
+#ifdef  __HYPHYCURL__
+#include <curl/curl.h>
+#endif
+
+#ifdef    __HYPHYDMALLOC__
+#include "dmalloc.h"
+#endif
+
+
+#include "HYWindow.h"
+#include "HYUtils.h"
+
+
+void    ProcessConfigStr (_String&);
+long    DisplayListOfPostChoices (void);
+
+
+bool    usePostProcessors = false,
+        updateMode        = false,
+        pipeMode          = false,
+        logInputMode    = false;
+
+#ifdef  __HYPHYMPI__
+bool mpiParallelOptimizer   = false,
+     mpiPartitionOptimizer     = false;
+void mpiNormalLoop    (int, int, _String &);
+void mpiOptimizerLoop (int, int);
+
+
+#endif
+
+
+/* GLOBALS */
+
+double                  fontConversionFactor = 1.0;
+
+PangoContext*           screenPContext;
+GdkPixbuf*              tablePDMenuIcon,
+                        *redButtonIcon,
+                        *yellowButtonIcon,
+                        *orangeButtonIcon,
+                        *greenButtonIcon;
+
+GdkCursor               *hSizeCursor,
+                        *pickUpCursor,
+                        *dropOffCursor;
+
+clock_t                 timerStart = 0,
+                        lastTimer  = 0;
+
+//__________________________________________________________________________________
+void    ProcessConfigStr (_String& conf)
+{
+    _String errMsg;
+    for (long i=1; i<conf.sLength; i++) {
+        switch (conf.sData[i]) {
+        case 'p':
+        case 'P': {
+            usePostProcessors = true;
+            break;
+        }
+        case 'c':
+        case 'C': {
+            calculatorMode = true;
+            break;
+        }
+        case 'u':
+        case 'U': {
+            updateMode = true;
+            break;
+        }
+        case 'l':
+        case 'L': {
+            logInputMode = true;
+            break;
+        }
+        //case 'i':
+        //case 'I':
+        //{
+        //pipeMode = true;
+        //break;
+        //}
+        default: {
+            errMsg = "Option ";
+            errMsg = errMsg & conf.sData[i] & " is not valid and is ignored";
+            ReportWarning (errMsg);
+        }
+        }
+    }
+}
+
+//__________________________________________________________________
+
+gboolean progressTimerFunction (Ptr* userData)
+{
+    if (updateTimer) {
+        clock_t time_diff = clock()-lastTimer;
+
+        if (time_diff>CLOCKS_PER_SEC) { // update dispay
+            lastTimer+=time_diff;
+            _String r;
+            updateTimerF(r,clock()-timerStart);
+            SetStatusLine (empty, empty, r, 0, HY_SL_TIMER);
+        }
+    }
+    return true;
+}
+
+//__________________________________________________________________
+
+gboolean GlobalQueueTimer (Ptr* userData)
+{
+    if (GlobalGUIEventQueue.lLength) {
+        HandleGlobalQueueEvent ();
+    }
+    //if (updateTimer)
+    //  SendMessage ((HWND)hyphyConsoleWindow->GetOSWindowData(), UPDATE_TIMER, 0, 0);
+
+    return true;
+}
+
+//__________________________________________________________________
+
+void SetUpStatusBarStuff (GtkWidget* aWindow)
+{
+    _String            fName = libDirectory & "GTKResources/striped.xpm";
+    statusBarLayout          = pango_layout_new (screenPContext);
+    statusBarFontDesc        = pango_font_description_new ();
+    stripedFill              = gdk_pixmap_create_from_xpm (GDK_DRAWABLE(aWindow->window), NULL, NULL, fName.sData);
+    stripedFillGC            = gdk_gc_new (GDK_DRAWABLE(aWindow->window));
+    if (stripedFill) {
+        gdk_gc_set_fill (stripedFillGC,GDK_TILED);
+        gdk_gc_set_tile (stripedFillGC,stripedFill);
+    } else {
+        printf ("Failed to load a status bar .xpm from %s\n", fName.sData);
+    }
+
+    gdk_gc_set_line_attributes        (stripedFillGC, 1, GDK_LINE_SOLID, GDK_CAP_NOT_LAST, GDK_JOIN_MITER);
+    GdkColor saveFG = {0,0,0,0};
+    gdk_gc_set_foreground             (stripedFillGC, &saveFG);
+
+    pango_font_description_set_family (statusBarFontDesc, statusBarFont.face.sData);
+    pango_font_description_set_style  (statusBarFontDesc, (statusBarFont.style & HY_FONT_ITALIC) ? PANGO_STYLE_ITALIC : PANGO_STYLE_NORMAL);
+    pango_font_description_set_weight (statusBarFontDesc, (statusBarFont.style & HY_FONT_BOLD) ? PANGO_WEIGHT_BOLD : PANGO_WEIGHT_NORMAL);
+    pango_font_description_set_size   (statusBarFontDesc, statusBarFont.size*PANGO_SCALE);
+    pango_layout_set_font_description (statusBarLayout, statusBarFontDesc ); // ref ?
+    pango_layout_set_width            (statusBarLayout, -1);
+
+    redButtonIcon = (GdkPixbuf*)ProcureIconResource(4000);
+    yellowButtonIcon = (GdkPixbuf*)ProcureIconResource(4001);
+    greenButtonIcon = (GdkPixbuf*)ProcureIconResource(4002);
+    orangeButtonIcon = (GdkPixbuf*)ProcureIconResource(4003);
+
+}
+//_________________________________________________________________________
+
+void    ShowObjectInspector (void)
+{
+    long f = FindWindowByName (objectInspectorTitle);
+    if (f>=0) {
+        gtk_window_present(GTK_WINDOW(windowPtrs(f)));
+    } else {
+        _HYObjectInspector* newOI = new _HYObjectInspector ();
+        newOI->BringToFront       ( );
+    }
+}
+
+//_________________________________________________________________________
+
+void displayAbout (bool splash)
+{
+    // TBI
+}
+
+//__________________________________________________________________
+
+int main( int   argc, char *argv[] )
+{
+
+#ifdef  __HYPHYMPI__
+    int            rank,
+                   size;
+
+    MPI_Init       (&argc, &argv);
+    MPI_Comm_rank(MPI_COMM_WORLD, &rank);
+    MPI_Comm_size(MPI_COMM_WORLD, &size);
+
+    _hy_mpi_node_rank = rank;
+
+    setParameter  (mpiNodeID, (_Parameter)rank);
+    setParameter    (mpiNodeCount, (_Parameter)size);
+
+    if (rank == 0)
+#endif
+
+        gtk_init (&argc, &argv);
+
+    /* set up globals */
+
+    char curWd[4096];
+    getcwd (curWd,4096);
+
+    _String baseDir (curWd);
+    baseDir=baseDir & '/';
+
+#ifdef _HYPHY_LIBDIRECTORY_
+    _String libDir (_HYPHY_LIBDIRECTORY_);
+    pathNames&& &libDir;
+#else
+    _String libDir (baseDir);
+#endif
+
+    if (libDir.sData[libDir.sLength-1] != '/') {
+        libDir = libDir & "/";
+    }
+
+    pathNames&& &baseDir;
+    baseDirectory = baseDir;
+    libDirectory = libDir;
+    for (long i=1; i<argc; i++) {
+        _String thisArg (argv[i]);
+        if (thisArg.beginswith ("BASEPATH=")) {
+            baseDirectory = thisArg.Cut(9,-1);
+            if (baseDirectory.sLength) {
+                if (baseDirectory.sData[baseDirectory.sLength-1]!='/') {
+                    baseDirectory = baseDirectory & "/";
+                }
+            } else {
+                baseDirectory = baseDir;
+            }
+        } else if (thisArg.beginswith ("LIBPATH=")) {
+            libDirectory = thisArg.Cut(8,-1);
+            if (libDirectory.sLength) {
+                if (libDirectory.sData[baseDirectory.sLength-1] != '/') {
+                    libDirectory = libDirectory & "/";
+                }
+            } else {
+                libDirectory = libDir;
+            }
+        } else if (thisArg.beginswith ("USEPATH=")) {
+            _String     baseArgDir          (thisArg,8,-1);
+            errorFileName                   = baseArgDir & errorFileName;
+            messageFileName                 = baseArgDir & messageFileName;
+            pathNames.Delete                (0);
+            pathNames&&                     &baseDir;
+        } else if (thisArg.beginswith ("CPU=")) {
+#ifdef __MP__
+            _String cpus = thisArg.Cut(4,-1);
+            systemCPUCount = cpus.toNum();
+            if (systemCPUCount<1) {
+                systemCPUCount = 1;
+            }
+#ifdef __MP2__
+            pthread_setconcurrency (systemCPUCount+1);
+#endif
+#endif
+        }
+#ifdef  __HYPHYMPI__
+        else if (thisArg == _String("MPIOPTIMIZER")) {
+            mpiParallelOptimizer = true;
+            setParameter    (mpiNodeCount, 0.0);
+        } else if (thisArg == _String("MPIPARTITIONS")) {
+            mpiPartitionOptimizer = true;
+            setParameter    (mpiNodeCount, 0.0);
+        }
+#endif
+    }
+
+#ifdef  __HYPHYMPI__
+    if (rank == 0)
+#endif
+    {
+        baseDir = libDirectory & "GTKResources";
+        _List scanRes;
+        ScanDirectoryForFileNames(baseDir,scanRes,false);
+        if (scanRes.lLength == 0) {
+            GtkWidget * noRez = gtk_message_dialog_new (NULL, GTK_DIALOG_MODAL, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, "HYPHY_GTK was unable to find a required GTKResources directory in %s. Please use BASEPATH= command line option to specify where the installation directory of HyPhy can be found.", baseDirectory.sData);
+            gtk_dialog_run (GTK_DIALOG (noRez));
+            gtk_widget_destroy (noRez);
+            return 1;
+        }
+        _String rcPath = baseDir & "/theme/theme.rc";
+        //printf ("Loading res files from %s\n", rcPath.sData);
+        gtk_rc_parse (rcPath.sData);
+    }
+
+    GlobalStartup();
+
+#ifdef  __HYPHYMPI__
+    if (rank == 0) {
+#endif
+        GdkDisplay * defDisplay = gdk_screen_get_display (gdk_screen_get_default());
+        hSizeCursor = gdk_cursor_new_for_display (defDisplay,GDK_SB_H_DOUBLE_ARROW);
+        pickUpCursor = gdk_cursor_new_for_display (defDisplay,GDK_TARGET);
+        dropOffCursor = gdk_cursor_new_for_display (defDisplay,GDK_TCROSS);
+
+        screenPContext = gdk_pango_context_get_for_screen (gdk_screen_get_default());
+        tablePDMenuIcon = (GdkPixbuf*)ProcureIconResource(4020);
+
+        /*{
+            GdkScreen * defD = gdk_screen_get_default();
+            fontConversionFactor = 72.27 / (gdk_screen_get_height (defD) *25.4 / gdk_screen_get_height_mm(defD));
+            printf ("Pango conversion factor computed at: %g\n", fontConversionFactor);
+        }*/
+
+
+        ReadInTemplateFiles ();
+
+        hyphyConsoleWindow = new _HYConsoleWindow ("HYPHY Console");
+        ReadPreferences     ();
+        SetStatusLine ("None","Idle","00:00:00");
+        while (gtk_events_pending()) {
+            gtk_main_iteration();
+        }
+
+        SetPreferences      ();
+        ReadGeneticCodes    ();
+        ReadModelTemplates  ();
+        ReadTreeProcessors ();
+        MoveConsoleWindow  (consolePositionRectangle);
+        StringToConsole (hyphyCiteString);
+        hyphyConsoleWindow->BringToFront();
+
+#ifdef __HYPHYMPI__
+        {
+            char statBuffer[1024];
+            snprintf (statBuffer, sizeof(statBuffer),"MPI version of HyPhy running on %d nodes (a master and %d compute nodes) in %s mode\n",
+                     size,
+                     size-1,
+                     mpiPartitionOptimizer?"partition":(mpiParallelOptimizer?"rate heterogeneity":"normal"));
+            BufferToConsole (statBuffer);
+        }
+#endif
+
+        g_timeout_add  (100,(GSourceFunc)GlobalQueueTimer,nil);
+        g_timeout_add  (1000,(GSourceFunc)progressTimerFunction,nil);
+        gtk_main ();
+
+        WritePreferences();
+#ifdef  __HYPHYMPI__
+    } else { // slave node
+        if (mpiParallelOptimizer || mpiPartitionOptimizer) {
+            mpiOptimizerLoop (rank, size);
+        } else {
+            mpiNormalLoop (rank, size, baseDir);
+        }
+    }
+#endif
+
+    GlobalShutdown();
+    return 0;
+}
+
+
diff --git a/src/mains/mac.cpp b/src/mains/mac.cpp
new file mode 100644
index 0000000..2eaba05
--- /dev/null
+++ b/src/mains/mac.cpp
@@ -0,0 +1,1559 @@
+/*
+
+HyPhy - Hypothesis Testing Using Phylogenies.
+
+Copyright (C) 1997-2009
+  Sergei L Kosakovsky Pond (spond at ucsd.edu)
+  Art FY Poon              (apoon at cfenet.ubc.ca)
+
+Permission is hereby granted, free of charge, to any person obtaining a
+copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be included
+in all copies or substantial portions of the Software.
+
+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.
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+*/
+
+#ifndef __HYPHYXCODE__
+#include <unix.h>
+#endif
+
+#ifndef  TARGET_API_MAC_CARBON
+#include <Types.h>
+#else
+#include <MacTextEditor.h>
+#endif
+
+
+#include <events.h>
+#include <AppleEvents.h>
+#include <Aliases.h>
+#include <Dialogs.h>
+#include <Files.h>
+#include <Script.h>
+#include <unistd.h>
+#include <Menus.h>
+#include <stdlib.h>
+#include <Fonts.h>
+#include <Resources.h>
+#include <TextUtils.h>
+#include <Sound.h>
+#include <Folders.h>
+#include <ToolUtils.h>
+#include <resources.h>
+#include "likefunc.h"
+#include <string.h>
+#include <ctype.h>
+#include <Memory.h>
+#include <Gestalt.h>
+#include <Appearance.h>
+#include <CarbonEvents.h>
+#include "Lists.h"
+#include <time.h>
+#include "HYWindow.h"
+#include "HYTreePanel.h"
+#include "HYDataPanel.h"
+#include "HYUtils.h"
+#include "HYDialogs.h"
+
+#include "preferences.h"
+
+#include "HYSharedMain.h"
+#include "HYButtonBar.h"
+#include "HYButton.h"
+
+#include "HYConsoleWindow.h"
+#include "HYEventTypes.h"
+#include "HYTextBox.h"
+#include "HYObjectInspector.h"
+
+#include "HYDBWindow.h"
+
+#ifdef   HYPHY_MACH
+#include <Carbon/Carbon.h>
+#include <console.h>
+systemCPUCount = (long)MPProcessors();
+#else
+#include <windows.h>
+#endif
+
+
+#ifdef  __MACPROFILE__
+#include "profiler.h"
+#endif
+
+
+extern long     matrixExpCount,
+       taylorTermsCount,
+       squaringsCount,
+       likeFuncEvalCallCount,
+       _fcreator,
+       _ftype;
+
+
+
+bool            aquaInterfaceOn = false;
+
+OSType          fileCreatorType = 'MuSe';
+
+Pattern         penHatchPattern,
+                vertPenHatchPattern;
+
+
+void    DisplayAbout                (bool = false);
+void    HandleSuspend               (void);
+void    HandleResume                (void);
+void    HandleCancel                (void);
+void    ShowMessagesLog             (void);
+long    SelectATemplate             (void);
+void    RunTemplate                 (long);
+void    SetupMenusAndSuch           (void);
+void    updateTimerF                (_String&, time_t);
+void    SpoolFile                   (void);
+bool    HandleFirstDialog           (long& choice);
+void    RunStandardAnalyses         (void);
+void    NewModel                    (_String*);
+void    BuildBalancedTree           (long, long , _String& , _List& );
+void    SetStatusBarValue           (long,_Parameter, _Parameter);
+pascal  OSErr GUIOpenHandler        (AppleEvent *, AppleEvent*, long);
+OSErr   HandleQuit                  (AppleEvent *, AppleEvent*, long);
+void    InitToolbox                 (void);
+void    CleanupMenusAndSuch         (void);
+void    GetFullPathName             (FSSpec&,_String&);
+
+
+pascal  void        TimerAction                     (EventLoopTimerRef,void*);
+pascal  void        DialogTimerAnimateAction        (EventLoopTimerRef,void*);
+pascal  void        DialogTimerAnimateCornholio     (EventLoopTimerRef,void*);
+pascal OSStatus     PrefAction                      (EventHandlerCallRef, EventRef event, void*);
+
+
+
+
+PixPatHandle    whiteFill,
+                blueFill,
+                statusBarFill;
+
+Handle          menuBar;
+
+MenuHandle      recentFilesMenu   = NewMenu (200, "\pRun Recent");
+
+time_t          timerStart = 0,
+                lastTimer  = 0;
+
+bool            trackMouseMovement = false;
+
+CIconHandle     redButtonIcon,
+                yellowButtonIcon,
+                orangeButtonIcon,
+                greenButtonIcon,
+                pullDownArrowsIcon,
+                tablePDMenuIcon;
+
+Cursor          hSizeCursor,
+                editStateCursor;
+
+CCrsrHandle     pickUpCursor,
+                dropOffCursor;
+
+
+//____________________________________________________________________________________________
+
+PMPageFormat            gPageFormat         = kPMNoPageFormat;
+PMPrintSettings         gPrintSettings      = kPMNoPrintSettings;
+Handle                  gFlattenedFormat    = NULL;
+Handle                  gFlattenedSettings  = NULL;
+
+//____________________________________________________________________________________________
+
+Boolean InitPrint(PMPrintSession theSession)
+{
+    OSStatus theStatus;
+
+    if (gFlattenedFormat != NULL) {
+        theStatus = PMUnflattenPageFormat(gFlattenedFormat, &gPageFormat);
+
+        if (theStatus != noErr) {
+            return FALSE;
+        }
+    }
+
+    if (gFlattenedSettings != NULL) {
+        theStatus = PMUnflattenPrintSettings(gFlattenedSettings, &gPrintSettings);
+
+        if (theStatus != noErr) {
+            return FALSE;
+        }
+    }
+
+    if (gPageFormat != kPMNoPageFormat) {
+        theStatus = PMSessionValidatePageFormat(theSession,gPageFormat, kPMDontWantBoolean);
+    } else {
+        theStatus = PMCreatePageFormat(&gPageFormat);
+
+        if ((theStatus == noErr) && (gPageFormat != kPMNoPageFormat)) {
+            theStatus = PMSessionDefaultPageFormat(theSession, gPageFormat);
+        }
+    }
+
+    return (theStatus == noErr);
+}
+
+//____________________________________________________________________________________________
+
+RgnHandle       mouseRgn = nil;
+
+pascal void TimerAction (EventLoopTimerRef,void*)
+{
+    if (updateTimer) {
+        time_t  tt,
+                time_diff = time(&tt)-lastTimer;
+
+        if (time_diff>=1) { // update dispay
+            lastTimer   = tt;
+
+            _String      r;
+            updateTimerF(r,tt-timerStart);
+            SetStatusLine (empty, empty, r, 0, HY_SL_TIMER);
+        }
+    }
+}
+
+//____________________________________________________________________________________________
+
+struct conrholioTimeScrollData {
+    PicHandle  corn1,
+               corn2;
+
+    Rect       cornRect,
+               bigRect;
+
+    long       callCount;
+
+    DialogPtr  AW;
+};
+
+
+//____________________________________________________________________________________________
+
+struct textScrollTimerAction {
+    DialogPtr  AW;
+
+    bool       fadeout,
+               morePages;
+
+    long       decrement,
+               startingString,
+               stringDisp,
+               textTime,
+               color,
+               shutter,
+               callCount;
+
+    Rect       textBoxInset,
+               textBoxSlide;
+
+    _List*     theText;
+
+};
+
+//____________________________________________________________________________________________
+
+pascal void DialogTimerAnimateAction (EventLoopTimerRef,void*userData)
+{
+    textScrollTimerAction * tSTA = (textScrollTimerAction*)userData;
+
+    GrafPtr   sPort;
+    GetPort  (&sPort);
+    SetPort  (GetDialogPort (tSTA->AW));
+    Str255    buffer;
+
+    RGBColor  myColor;
+
+    if (!tSTA->fadeout) {
+        if (tSTA->color >= 0) {
+            myColor.red     = tSTA->color;
+            myColor.blue    = tSTA->color;
+            myColor.green   = tSTA->color;
+            RGBForeColor(&myColor);
+            tSTA->color -= tSTA->decrement;
+            tSTA->decrement+=100;
+
+            long i,
+                 //width = tSTA->textBoxInset.right - tSTA->textBoxInset.left,
+                 finalTick = tSTA->textBoxInset.top + 11;
+
+            for (i = tSTA->startingString; i<tSTA->theText->lLength; i++, finalTick += 11) {
+                if (finalTick>tSTA->textBoxInset.bottom) {
+                    break;
+                }
+
+                _String* thisString = (_String*)(*tSTA->theText)(i);
+
+                buffer[0] =thisString ->sLength;
+                if (buffer[0]&& (thisString->sData[0]=='\\')) { // new page
+                    if (i!=tSTA->startingString) {
+                        tSTA->morePages = true;
+                        tSTA->stringDisp = i;
+                        break;
+                    }
+                    if (buffer[0]&& (thisString->sData[1]=='_')) {
+                        TextFace(1);
+                        buffer[0]-=2;
+                        memcpy (buffer+1,thisString->sData+2,buffer[0]);
+                    } else {
+                        TextFace(0);
+                        buffer[0]--;
+                        memcpy (buffer+1,thisString->sData+1,buffer[0]);
+                    }
+                } else if (buffer[0]&& (thisString->sData[0]=='_')) {
+                    TextFace(1);
+                    buffer[0]--;
+                    memcpy (buffer+1,thisString->sData+1,buffer[0]);
+                } else {
+                    TextFace(0);
+                    memcpy (buffer+1,thisString->sData,buffer[0]);
+                }
+                //MoveTo ((width-TextWidth ((Ptr)buffer,1,buffer[0]))/2+textBoxInset.left,finalTick);
+                MoveTo (tSTA->textBoxInset.left+5,finalTick);
+                DrawString (buffer);
+            }
+
+            if ((i==tSTA->theText->lLength)&&(tSTA->color<=0)) {
+                tSTA->morePages = false;
+                tSTA->startingString = -1;
+            }
+
+        } else {
+            if (tSTA->morePages) {
+                tSTA->startingString = tSTA->stringDisp;
+            }
+
+            tSTA->color = 0xddff;
+            tSTA->fadeout = true;
+            tSTA->decrement = 100;
+            tSTA->callCount = 1;
+            tSTA->textTime = 0;
+            if (tSTA->startingString==-1) {
+                tSTA->startingString = 0;
+            }
+        }
+    } else {
+        if (tSTA->callCount%100 == 0) {
+            if (tSTA->shutter == 0) {
+                if (tSTA->textTime<tSTA->textBoxSlide.bottom-tSTA->textBoxSlide.top) {
+                    tSTA->textTime+=4;
+
+                    Rect    eraser = tSTA->textBoxSlide;
+
+                    eraser.bottom = eraser.top + tSTA->textTime/2;
+                    EraseRect (&eraser);
+                    eraser.bottom = tSTA->textBoxSlide.bottom;
+                    eraser.top = eraser.bottom - tSTA->textTime/2;
+                    EraseRect (&eraser);
+                } else {
+                    tSTA->shutter = (tSTA->shutter+1)%3;
+                    tSTA->fadeout = false;
+                }
+            } else if (tSTA->shutter == 1) {
+                if (tSTA->textTime<tSTA->textBoxSlide.right-tSTA->textBoxSlide.left) {
+                    tSTA->textTime+=4;
+
+                    Rect    eraser = tSTA->textBoxSlide;
+
+                    eraser.right = eraser.left + tSTA->textTime/2;
+                    EraseRect (&eraser);
+                    eraser.right = tSTA->textBoxSlide.right;
+                    eraser.left = eraser.right - tSTA->textTime/2;
+                    EraseRect (&eraser);
+                } else {
+                    tSTA->shutter = (tSTA->shutter+1)%3;
+                    tSTA->fadeout = false;
+                }
+            } else {
+                if (tSTA->textTime<tSTA->textBoxSlide.right-tSTA->textBoxSlide.left) {
+                    tSTA->textTime+=4;
+
+                    Rect    eraser = tSTA->textBoxSlide;
+
+                    eraser.right = eraser.left + tSTA->textTime;
+                    EraseRect (&eraser);
+                    eraser = tSTA->textBoxSlide;
+                    eraser.bottom = eraser.top + tSTA->textTime;
+                    if (eraser.bottom<=tSTA->textBoxSlide.bottom) {
+                        EraseRect (&eraser);
+                    }
+                } else {
+                    tSTA->shutter = (tSTA->shutter+1)%3;
+                    tSTA->fadeout = false;
+                }
+            }
+
+        } else {
+            tSTA->callCount ++;
+        }
+
+    }
+    SetPort(sPort);
+}
+
+//____________________________________________________________________________________________
+
+pascal void DialogTimerAnimateCornholio (EventLoopTimerRef,void* userData)
+{
+    conrholioTimeScrollData * tSTA = (conrholioTimeScrollData*)userData;
+
+    GrafPtr   sPort;
+    GetPort  (&sPort);
+    SetPort  (GetDialogPort (tSTA->AW));
+
+    if (tSTA->callCount%2) {
+        DrawPicture (tSTA->corn2, &tSTA->cornRect);
+    } else {
+        DrawPicture (tSTA->corn1, &tSTA->cornRect);
+    }
+
+    tSTA->cornRect.left += 3;
+    tSTA->cornRect.right+= 3;
+
+    if (tSTA->cornRect.left>tSTA->bigRect.right) {
+        long w = tSTA->cornRect.right-tSTA->cornRect.left;
+        long h = tSTA->cornRect.bottom-tSTA->cornRect.top;
+        tSTA->cornRect.left = tSTA->bigRect.left;
+        tSTA->cornRect.right = tSTA->cornRect.left+w;
+        tSTA->cornRect.top+=h;
+        tSTA->cornRect.bottom+=h;
+    }
+
+    if (tSTA->cornRect.bottom>tSTA->bigRect.bottom) {
+        long h = tSTA->cornRect.bottom-tSTA->cornRect.top;
+        tSTA->cornRect.top = tSTA->bigRect.top;
+        tSTA->cornRect.bottom = tSTA->cornRect.top + h;
+    }
+
+    tSTA->callCount++;
+
+    SetPort(sPort);
+}
+
+//____________________________________________________________________________________________
+
+pascal OSStatus PrefAction (EventHandlerCallRef, EventRef event, void*)
+{
+    HICommand commandStruct;
+    GetEventParameter (event, kEventParamDirectObject,typeHICommand, NULL, sizeof(HICommand),NULL, &commandStruct);
+    if (commandStruct.commandID ==  kHICommandPreferences) {
+        HandlePreferences (globalPreferencesList,"HYPHY Preferences");
+        return noErr;
+    }
+    return eventNotHandledErr;
+}
+
+//__________________________________________________________________________________
+
+pascal OSErr GUIOpenHandler (AppleEvent *guiMessage, AppleEvent* , long )
+{
+    char        aliasRec [8192];
+    AEDescList  docList;
+    OSErr       myErr;
+    long        itemsInList;
+    Size        actualSize;
+    AEKeyword   keywd;
+    DescType    returnedType;
+    FSSpec      resolvedFile;
+    unsigned char       hasChanged;
+    // get the direct parameter--a descriptor list--and put
+    // it into docList
+    myErr = AEGetParamDesc(guiMessage, keyDirectObject,
+                           typeAEList, &docList);
+    if (myErr != noErr) {
+        return myErr;
+    }
+
+    // count the number of descriptor records in the list
+    myErr = AECountItems (&docList,&itemsInList);
+
+    // now get each descriptor record from the list, coerce
+    // the returned data to an FSSpec record, and open the
+    // associated file
+    if (itemsInList>=1) {
+        for (long daItem = 1; daItem <= itemsInList; daItem++) {
+            myErr = AEGetNthPtr(&docList, daItem, typeAlias, &keywd,
+                                &returnedType, aliasRec,
+                                sizeof(aliasRec), &actualSize);
+            if (myErr != noErr) {
+                return myErr;
+            }
+
+            AliasPtr fileAlias = (AliasPtr)aliasRec;
+            myErr = ResolveAlias((FSSpec*)NULL, &fileAlias,&resolvedFile, &hasChanged);
+            if (myErr) {
+                return myErr;
+            }
+            resolvedFile.name [resolvedFile.name[0]+1]=0;
+            if (!argFileName) {
+                argFileName = new _String ((char*)(resolvedFile.name+1));
+            } else {
+                *argFileName =  _String ((char*)(resolvedFile.name+1));
+            }
+            // get full path name
+            long parentDirID = resolvedFile.parID, sPDID = parentDirID;
+            CInfoPBRec infoRec;
+            HFileInfo* accessInfo = (HFileInfo*)&infoRec;
+            Str63 fName;
+            accessInfo->ioVRefNum = resolvedFile.vRefNum;
+            accessInfo->ioNamePtr = fName;
+            accessInfo->ioFDirIndex = -1;
+            while (parentDirID!=fsRtParID) {
+                accessInfo->ioDirID = parentDirID;
+                if (PBGetCatInfo (&infoRec,false)) {
+                    return -43;
+                }
+                parentDirID = accessInfo->ioFlParID;
+                accessInfo->ioNamePtr [accessInfo->ioNamePtr[0]+1]=0;
+                *argFileName = _String(((char*)(accessInfo->ioNamePtr+1)))&_String(":")&(*argFileName);
+            }
+            volumeName =  _String(((char*)(accessInfo->ioNamePtr+1))) & ':';
+            FInfo thisFile;
+            myErr = HGetFInfo(resolvedFile.vRefNum,sPDID,resolvedFile.name,&thisFile);
+            if (thisFile.fdCreator==fileCreatorType || argFileName->endswith (".bf")) {
+                OpenBatchFile(false);
+                ExecuteBatchFile();
+            } else {
+                SpoolFile();
+            }
+        }
+        return  noErr;
+    }
+    return -1;
+}
+
+//__________________________________________________________________________________
+
+OSErr HandleQuit (AppleEvent *, AppleEvent*, long)
+{
+    highLevelQuit = true;
+    terminateExecution = true;
+    return  noErr;
+}
+
+//____________________________________________________________________________________________
+
+void DisplayAbout (bool splash)
+{
+
+
+    DialogPtr       AW;
+    EventRecord     theEvent;
+    GrafPtr         sPort;
+    WindowPtr       whatWindow;
+
+    short           iType,
+                    counter;
+
+    Rect            textBox;
+
+    RgnHandle       borderRegion;
+
+    Handle          iHandle;
+    _List           theText;
+    _String         theString, theMessage;
+    Str255          buffer;
+
+
+    conrholioTimeScrollData cTSD;
+
+
+
+    counter = 1;
+    GetIndString(buffer,9000+splash,counter);
+    do {
+        counter ++;
+        buffer[buffer[0]+1]=0;
+        if (buffer[0]) {
+            theString = _String((char*)buffer+1);
+            //if (splash&&(theString.sData[0]=='\\')) break;
+            theText&&(&theString);
+        }
+        GetIndString(buffer,9000+splash,counter);
+    } while (buffer[0]);
+
+    Handle         sndHandle = nil;
+    SndChannelPtr  sndChn = nil;
+
+    char           whichOne = 0;
+
+    if (!splash) {
+        theString = "\\_System Tidbits";
+        theText&&(&theString);
+        theString = _String("Free HYPHY Memory: ")&_String(FreeMem()/1024)&_String (" K");
+        theText&&(&theString);
+        if (!aquaInterfaceOn) {
+            theString = _String("Free Temporary Memory: ")&_String(TempFreeMem()/1024)&_String (" K");
+            theText&&(&theString);
+        }
+        long    gestResp;
+        Gestalt (gestaltProcClkSpeed, &gestResp);
+        theString = _String("Processor Speed: ")&_String(gestResp/1000000.0)&" MHz";
+        theText&&(&theString);
+#ifdef __MP__
+        theString = _String("Processor Count: ")&_String((long)MPProcessors());
+        theText&&(&theString);
+#endif
+        theString = MatrixExpCounter();
+        if (theString.sLength) {
+            theText&&(&theString);
+            counter+=5;
+        }
+    } else {
+        whichOne = (genrand_real2()>=.5);
+        sndHandle = GetResource ('snd ',whichOne?128:129);
+        if (sndHandle) {
+            HLock (sndHandle);
+            SndNewChannel (&sndChn, 0, 0, nil);
+            SndPlay (sndChn, (SndListResource**)sndHandle, true);
+        }
+    }
+
+    theString = "";
+
+    AW = GetNewDialog (132,nil,(WindowPtr)(-1));
+    TransitionWindow (GetDialogWindow(AW), kWindowZoomTransitionEffect,kWindowShowTransitionAction,NULL);
+    SetThemeWindowBackground (GetDialogWindow(AW),kThemeBrushDialogBackgroundActive,true);
+    ShowWindow(GetDialogWindow(AW));
+    GetDialogItem(AW,2,&iType,&iHandle,&textBox);
+
+    textScrollTimerAction tsat;
+
+    tsat.textBoxInset = textBox;
+    tsat.textBoxSlide = textBox;
+    tsat.textBoxSlide.left+=2;
+    tsat.textBoxSlide.right-=2;
+    tsat.textBoxSlide.top+=2;
+    tsat.textBoxSlide.bottom-=2;
+    InsetRect (&tsat.textBoxInset,-1,-1);
+    tsat.textBoxInset.top+=4;
+
+
+    tsat.AW         = AW;
+    tsat.fadeout    = false;
+    tsat.morePages  = false;
+    tsat.decrement  = 100;
+    tsat.startingString
+        = 0;
+    tsat.textTime   = 0;
+    tsat.color      =  0xffff;
+    tsat.shutter    =  0;
+
+    tsat.theText    = & theText;
+    tsat.callCount  = 0;
+
+    borderRegion    = NewRgn ();
+
+
+    GetPort(&sPort);
+
+#ifdef OPAQUE_TOOLBOX_STRUCTS
+    SetPort(GetDialogPort(AW));
+#else
+    SetPort(AW);
+#endif
+    DrawDialog (AW);
+    TextFont (20);
+    TextSize (10);
+
+    if (splash) {
+        theMessage = "The Great Conrholio Lives!";
+    } else {
+        theMessage = GetVersionString();
+    }
+
+    StringToStr255 (theMessage, buffer);
+    counter = TextWidth ((Ptr)buffer,1,buffer[0]);
+#ifdef OPAQUE_TOOLBOX_STRUCTS
+    Rect    awr;
+    GetWindowBounds (GetDialogWindow(AW),kWindowGlobalPortRgn,&awr);
+    OffsetRect (&awr,-awr.left,-awr.top);
+    MoveTo ((awr.right-awr.left-counter)/2,textBox.top-10);
+#else
+    MoveTo ((AW->portRect.right-AW->portRect.left-counter)/2,textBox.top-10);
+#endif
+
+#ifdef TARGET_API_MAC_CARBON
+    SetThemeWindowBackground (GetDialogWindow(AW),kThemeBrushWhite,false);
+#else
+    SetThemeWindowBackground (AW,kThemeBrushWhite,false);
+#endif
+
+    EraseRect       (&textBox);
+    DrawEmbossedBox (textBox);
+    DrawString      (buffer);
+
+    EventLoopRef        mainLoop;
+    EventLoopTimerUPP   timerUPP,
+                        cTimerUPP;
+
+    EventLoopTimerRef   theTimer,
+                        cTimer;
+
+    mainLoop = GetMainEventLoop();
+    timerUPP = NewEventLoopTimerUPP(DialogTimerAnimateAction);
+    InstallEventLoopTimer (mainLoop,0,kEventDurationMillisecond*50,timerUPP,(void*)&tsat,&theTimer);
+
+    if (splash) {
+        cTSD.AW         = AW;
+        cTSD.corn1   = GetPicture (whichOne?160:128);
+        cTSD.corn2   = GetPicture (whichOne?161:129);
+        cTSD.cornRect = (*cTSD.corn1)->picFrame;
+        cTSD.cornRect.left = -cTSD.cornRect.right;
+        cTSD.cornRect.right = 0;
+        cTSD.callCount = 0;
+        GetDialogItem(AW,1,&iType,&iHandle,&cTSD.bigRect);
+        cTimerUPP = NewEventLoopTimerUPP(DialogTimerAnimateCornholio);
+        InstallEventLoopTimer (mainLoop,0,kEventDurationMillisecond*60,cTimerUPP,(void*)&cTSD,&cTimer);
+    }
+
+
+    while (1) {
+#ifdef TARGET_API_MAC_CARBON
+        if (WaitNextEvent(everyEvent, &theEvent, 0x7FFFFFFF, (RgnHandle)nil))
+#else
+        if (WaitNextEvent(everyEvent, &theEvent, 0x7FFFFFFF, (RgnHandle)nil))
+#endif
+        {
+            FindWindow(theEvent.where,&whatWindow);
+            if (theEvent.what == mouseDown)
+#ifdef OPAQUE_TOOLBOX_STRUCTS
+                if (splash||(whatWindow == GetDialogWindow(AW)))
+#else
+                if (splash||(whatWindow == AW))
+#endif
+                    break;
+            if (theEvent.what == keyDown) {
+                break;
+            }
+
+        }
+    }
+
+    if (splash) {
+        if (sndChn) {
+            SndDisposeChannel (sndChn, true);
+        }
+
+        if (sndHandle) {
+            HUnlock (sndHandle);
+            ReleaseResource (sndHandle);
+        }
+
+    }
+
+    if (splash) {
+        ReleaseResource((Handle)cTSD.corn1);
+        ReleaseResource((Handle)cTSD.corn2);
+        RemoveEventLoopTimer     (cTimer);
+        DisposeEventLoopTimerUPP (cTimerUPP);
+    }
+
+    RemoveEventLoopTimer     (theTimer);
+    DisposeEventLoopTimerUPP (timerUPP);
+    TransitionWindow         ((WindowPtr)AW, kWindowZoomTransitionEffect,kWindowHideTransitionAction,NULL);
+    DisposeDialog(AW);
+    DisposeRgn (borderRegion);
+
+    SetPort (sPort);
+}
+
+//____________________________________________________________________________________________
+
+bool    handleGUI (bool useGet)
+{
+    static              _HYPlatformWindow*  lastWindow = nil;
+    short                whatW,
+                         f;
+
+    WindowPtr            whatWindow;
+    bool                 gotEvent = false,
+                         loopMore = false;
+
+    EventRecord         guiEvent;
+    long                menuChoice,
+                        mSel;
+    do {
+        if (GlobalGUIEventQueue.lLength) {
+            HandleGlobalQueueEvent ();
+        }
+        mSel = -1;
+
+        if (useGet && ! isSuspended) {
+            gotEvent = GetNextEvent (everyEvent, &guiEvent);
+            loopMore = gotEvent;
+        } else {
+            gotEvent = WaitNextEvent (everyEvent, &guiEvent, 0x7FFFFFFF, mouseRgn);
+        }
+
+        if (highLevelQuit) {
+            return false;
+        }
+
+        if (!gotEvent) {
+            continue;
+        }
+
+        if (guiEvent.what==osEvt) {
+            if (((guiEvent.message&osEvtMessageMask)>>24)==suspendResumeMessage) {
+                Cursor arrow;
+                SetCursor(GetQDGlobalsArrow(&arrow));
+                continue;
+            } else if (trackMouseMovement) {
+                f = windowPtrs.Find ((long)FrontWindow());
+                if (f>=0) {
+                    _HYPlatformWindow* clickedWindow = (_HYPlatformWindow*)windowObjects (f);
+                    clickedWindow->_ProcessOSEvent ((Ptr)&guiEvent);
+                }
+                continue;
+            }
+        }
+
+        if(guiEvent.what == kHighLevelEvent) {
+            if ((OSType)guiEvent.message==typeAppleEvent)
+                if ((*((OSType*)(&guiEvent.where))==kAEOpenDocuments)
+                        || (*((OSType*)(&guiEvent.where))==kAEQuitApplication)) {
+                    AEProcessAppleEvent(&guiEvent);
+                    if (highLevelQuit) {
+                        return false;
+                    }
+                    continue;
+                }
+        }
+
+        if ((guiEvent.what == keyDown)||(guiEvent.what == autoKey)) {
+            whatWindow = FrontWindow();
+        } else {
+            whatW = FindWindow(guiEvent.where,&whatWindow);
+        }
+
+        if (guiEvent.what == updateEvt || guiEvent.what == activateEvt) {
+            f = windowPtrs.Find ((long)guiEvent.message);
+        } else {
+            f = windowPtrs.Find ((long)whatWindow);
+        }
+
+        if ((guiEvent.what != updateEvt)&&(guiEvent.what != activateEvt)&&(guiEvent.what != nullEvent)&&windowPtrs.lLength) {
+            WindowPtr fw = FrontWindow ();
+            mSel = windowPtrs.Find((long)fw);
+            if ((mSel!=f)&&(mSel>=0)) {
+                _HYWindow* dW = (_HYWindow*) windowObjectRefs (mSel);
+                if (dW->flags & HY_WINDOW_DLOG) {
+                    continue;
+                }
+            }
+            mSel = -1;
+        }
+
+        if (f>=0) {
+            _HYPlatformWindow* clickedWindow = (_HYPlatformWindow*)windowObjects (f);
+
+            if (clickedWindow!=lastWindow) {
+#ifdef TARGET_API_MAC_CARBON
+                Cursor arrow;
+                SetCursor(GetQDGlobalsArrow(&arrow));
+#else
+                SetCursor (&qd.arrow);
+#endif
+                lastWindow = clickedWindow;
+            }
+            if(clickedWindow->_ProcessOSEvent ((Ptr)&guiEvent)) {
+                continue;
+            }
+        }
+
+
+        if (guiEvent.what == keyDown) {
+            if (guiEvent.modifiers&cmdKey) {
+                if (guiEvent.modifiers&optionKey) {
+                    if ((guiEvent.message&keyCodeMask)==0x1F00) {
+                        mSel = (long)150*0x10000+2;
+                    } else if ((guiEvent.message&keyCodeMask)==0x2D00) {
+                        mSel = (long)151*0x10000+2;
+                    }
+                } else {
+                    if (guiEvent.modifiers&shiftKey) {
+                        if (((guiEvent.message&charCodeMask)=='O')||((guiEvent.message&charCodeMask)=='o')) {
+                            mSel = (long)150*0x10000+3;
+                        }
+                    } else {
+                        mSel = MenuKey (guiEvent.message&charCodeMask);
+                    }
+                }
+            }
+        }
+
+
+        if (guiEvent.what == mouseDown) {
+            switch (whatW) { //what window contained the last apple event
+            case inDesk:
+            case inSysWindow: {
+#ifndef TARGET_API_MAC_CARBON
+                SystemClick(&guiEvent, whatWindow);
+#endif
+                continue;
+            }
+            case inMenuBar: {
+                mSel = MenuSelect(guiEvent.where);
+            }
+            }
+        }
+
+        if (mSel>0) {
+            HiliteMenu(0);
+            f = windowPtrs.Find ((long)FrontWindow());
+            if (f>=0) {
+                _HYPlatformWindow* clickedWindow = (_HYPlatformWindow*)windowObjects (f);
+                if(clickedWindow->_ProcessMenuSelection (mSel)) {
+                    continue;
+                }
+            }
+
+            menuChoice = mSel&0x0000ffff;
+            switch (mSel/0xffff) {
+            case 128: { // apple menu
+                if ((mSel&0x0000ffff) == 1)
+                    // About Window
+                {
+                    DisplayAbout(guiEvent.modifiers&optionKey);
+                    continue;
+                }
+
+#ifndef TARGET_API_MAC_CARBON
+                GetMenuItemText(GetMenu(128),mSel&0x0000ffff,daName);
+                OpenDeskAcc(daName);
+#endif
+                continue;
+            }
+
+            case 129: { // file menu
+                if (menuChoice==4) { // save
+                    SaveConsole ();
+                    continue;
+                }
+
+                if (menuChoice==10) { // quit
+                    terminateExecution = true;
+                    return false;
+                }
+                continue;
+            }
+
+            case 130: {
+                switch (menuChoice) {
+                case 11:
+                    HandlePreferences (globalPreferencesList,"HYPHY Preferences");
+                    break;
+                }
+
+                continue;
+            }
+
+            case 131: { // action menu
+                if (menuChoice==2) { // suspend
+                    if (!isSuspended) {
+                        HandleSuspend();
+                        isSuspended = true;
+                    } else {
+                        HandleResume();
+                        isSuspended = false;
+                    }
+                } else if (menuChoice == 1) { // cancel execution
+                    HandleCancel();
+                } else if (menuChoice == 4) { // show messages
+                    ShowMessagesLog();
+                } else if (menuChoice == 6) { // display template files
+                    RunStandardAnalyses();
+                } else if (menuChoice == 8) { // rerun last analysus
+                    OpenBatchFile(false);
+                    ExecuteBatchFile();
+                } else if (menuChoice == 10) { // calculate expression
+                    if (calculatorMode) {
+                        _HYTextBox         *ib = (_HYTextBox*)hyphyConsoleWindow->GetObject(1);
+                        ib->SetText ("exit");
+                        hyphyConsoleWindow->ProcessEvent (generateTextEditChangeEvent(ib->GetID(),2));
+                        calculatorMode         = false;
+                        //ib->SetText (empty);
+                    } else {
+                        calculatorMode = true;
+                        while(calculatorMode&&ExpressionCalculator()) {}
+                        calculatorMode = false;
+                        if (terminateExecution) {
+                            return false;
+                        }
+                    }
+                } else if (menuChoice == 11) { // calculate expression
+                    ExecuteSelection();
+                }
+
+                continue;
+            }
+
+            case 132: { // window menu
+                if (menuChoice == 1) { // console window
+                    hyphyConsoleWindow->BringToFront();
+                } else if (menuChoice == 2) { // object inspector
+                    ShowObjectInspector ();
+                } else if (menuChoice == 3) { // cycle thru windows
+                    if (windowPtrs.lLength>1) {
+                        menuChoice = windowPtrs.Find ((long)FrontWindow());
+                        if (menuChoice == windowPtrs.lLength-1) {
+                            SelectWindow ((WindowPtr)(windowPtrs.lData[0]));
+                        } else {
+                            SelectWindow ((WindowPtr)(windowPtrs.lData[menuChoice+1]));
+                        }
+                    }
+                } else if (menuChoice == 4) { // hide windows
+                    if ((WindowPtr)hyphyConsoleWindow->GetOSWindowData() != FrontWindow()) {
+                        HideWindow (FrontWindow());
+                    }
+                } else {
+                    long f = FindWindowByName (objectInspectorTitle);
+                    if((f>=0)&&(menuChoice-6>=f)) {
+                        menuChoice++;
+                    }
+                    ShowWindow   ((WindowPtr)(windowPtrs.lData[menuChoice-6]));
+                    SelectWindow ((WindowPtr)(windowPtrs.lData[menuChoice-6]));
+                }
+                continue;
+            }
+
+            case 150: { // open submenu
+                if (menuChoice==1) { // open batch file
+                    if (OpenBatchFile()) {
+                        ExecuteBatchFile ();
+                    }
+                } else if (menuChoice==2) { // open tree file
+                    OpenDataFile();
+                } else if (menuChoice==3) { // open tree file
+                    OpenTreeFile();
+                } else if (menuChoice==7) { // open text file
+                    OpenTextFile();
+                } else if (menuChoice==8) { // open table
+                    OpenTable ();
+                } else if (menuChoice==9) { // open table
+                    OpenDatabaseFile (nil);
+                } else if ((menuChoice==11)||(menuChoice==12)) { // convert movie file
+                    ConvertMovieFile (menuChoice-10);
+                }
+                continue;
+            }
+
+            case 151: { // new submenu
+                if (menuChoice==1) { // open batch file
+                    NewTreeWindow();
+                } else if (menuChoice==2) { // open batch file
+                    NewModel(nil);
+                } else if (menuChoice==3) {
+                    NewChartWindow();
+                } else if (menuChoice==4) {
+                    NewGeneticCodeTable(0);
+                } else if (menuChoice==5) {
+                    NewDatabaseFile(nil);
+                }
+                continue;
+            }
+
+            case 200: { // recent files menu
+                if (!argFileName) {
+                    argFileName = new _String (*(_String*)recentPaths(menuChoice-1));
+                } else {
+                    *argFileName = *(_String*)recentPaths(menuChoice-1);
+                }
+
+                volumeName          =   argFileName->Cut(0,argFileName->Find(':'));
+                OpenBatchFile       (false);
+                ExecuteBatchFile    ();
+                continue;
+
+            }
+
+            case 201: { // results menu
+                ExecuteAPostProcessor (*(_String*)(*(_List*)availablePostProcessors(menuChoice-1))(1));
+                continue;
+            }
+            }
+
+        }
+
+    } while (isSuspended||loopMore);
+
+
+    return true;
+}
+
+//___________________________________________________________________
+void InitToolbox()
+{
+    FlushEvents(everyEvent,0);
+    InitCursor();
+    long result;
+    Gestalt( gestaltMenuMgrAttr, &result);
+    if (result & gestaltMenuMgrAquaLayoutMask) {
+        aquaInterfaceOn = true;
+    }
+}
+
+
+
+//_________________________________________________________________________
+void    HandleSuspend (void)
+{
+    SetStatusLine (empty,empty,empty,-1,HY_SL_SUSPEND);
+    SetMenuItemText (GetMenuHandle(131),2,"\pResume");
+    DisableMenuItem(GetMenuHandle(131),1);
+}
+
+//_________________________________________________________________________
+void    HandleResume (void)
+{
+    SetStatusLine (empty,empty,empty,-1,HY_SL_RESUME);
+    SetMenuItemText (GetMenuHandle(131),2,"\pSuspend");
+
+    time_t      tt;
+    timerStart += time(&tt)-lastTimer;
+
+    EnableMenuItem(GetMenuHandle(131),1);
+}
+
+//_________________________________________________________________________
+void    HandleCancel (void)
+{
+    SetStatusLine (empty,"Canceling",empty,-1,HY_SL_TASK);
+    terminateExecution = true;
+}
+
+//_________________________________________________________________________
+void    SetupMenusAndSuch (void)
+{
+    bool good = true;
+    if (AEInstallEventHandler ((OSType)typeAppleEvent,(OSType)kAEOpenDocuments,NewAEEventHandlerUPP((AEEventHandlerProcPtr)GUIOpenHandler),0,false)) {
+        good = false;
+    }
+    if (AEInstallEventHandler ((OSType)typeAppleEvent,(OSType)kAEQuitApplication,NewAEEventHandlerUPP((AEEventHandlerProcPtr)HandleQuit),0,false)) {
+        good = false;
+    }
+
+    if (!good) {
+        _String        errMsg ("Apple Event Initialization Error. Quitting....");
+        ProblemReport (errMsg);
+        exit(1);
+    }
+
+    AppendResMenu(GetMenu(128),'DRVR');
+
+    if (aquaInterfaceOn) {
+        DeleteMenuItem (GetMenuHandle (129), 9);
+        DeleteMenuItem (GetMenuHandle (129), 9);
+        DeleteMenuItem (GetMenuHandle (130), 10);
+        DeleteMenuItem (GetMenuHandle (130), 10);
+        EnableMenuCommand(NULL, kHICommandPreferences);
+        EventTypeSpec   eventTypes[1];
+        EventHandlerUPP handlerUPP;
+        eventTypes[0].eventClass = kEventClassCommand;
+        eventTypes[0].eventKind  = kEventCommandProcess;
+        handlerUPP = NewEventHandlerUPP(PrefAction);
+        InstallApplicationEventHandler (handlerUPP,1, eventTypes,NULL, NULL);
+    }
+
+
+    Str255  buffer2;
+    long counter = 1;
+
+
+    EnableMenuItem  (GetMenuHandle(130),0);
+    DisableMenuItem (GetMenuHandle(130),1);
+    DisableMenuItem (GetMenuHandle(130),3);
+    DisableMenuItem (GetMenuHandle(130),4);
+    DisableMenuItem (GetMenuHandle(130),5);
+    DisableMenuItem (GetMenuHandle(130),6);
+    //DisableMenuItem (GetMenuHandle(130),8);
+
+    DisableMenuItem (GetMenuHandle(131),1);
+    DisableMenuItem (GetMenuHandle(131),2);
+    if (!hasTemplates) {
+        DisableMenuItem (GetMenuHandle(131),6);
+    }
+
+    DisableMenuItem (GetMenuHandle(131),7);
+    DisableMenuItem (GetMenuHandle(131),8);
+
+    // set up the 2nd menu
+    InsertMenu(GetMenu (150), hierMenu);
+    InsertMenu(GetMenu (151), hierMenu);
+    SetItemCmd (GetMenuHandle(129),1,hMenuCmd);
+    SetItemMark(GetMenuHandle(129),1,151);
+    SetItemCmd (GetMenuHandle(129),2,hMenuCmd);
+    SetItemMark(GetMenuHandle(129),2,150);
+    //SetMenuItemText (GetMenuHandle(150),5,"\pRun Recent");
+    MenuHandle openMenu = GetMenuHandle(150);
+    SetItemCmd (openMenu,5,hMenuCmd);
+    SetItemMark(openMenu,5,200);
+    InsertMenu(recentFilesMenu,-1);
+    if (!recentPaths.lLength) {
+        DisableMenuItem(GetMenuHandle(150),5);
+    }
+
+    SetMenuItemModifiers (openMenu, 2, kMenuOptionModifier);
+    SetMenuItemModifiers (openMenu, 3, kMenuShiftModifier);
+    SetMenuItemModifiers (GetMenuHandle(151), 2, kMenuOptionModifier);
+    //SetMenuItemModifiers (openMenu, 7, kMenuShiftModifier|kMenuOptionModifier);
+
+    if (availablePostProcessors.countitems()) {
+        MenuHandle resultsMenu = NewMenu (201,"\pResults");
+        for (counter=0; counter<availablePostProcessors.countitems(); counter++) {
+            _String * postItem = (_String*)(*(_List*)availablePostProcessors(counter))(0);
+            if (postItem->Equal(&menuSeparator)) {
+                AppendMenu (resultsMenu,"\p(-");
+            } else {
+                StringToStr255 (*postItem,buffer2);
+                AppendMenu (resultsMenu,buffer2);
+            }
+        }
+        SetItemCmd (GetMenuHandle(131),7,hMenuCmd);
+        SetItemMark(GetMenuHandle(131),7,201);
+        SetMenuItemText (GetMenuHandle(131),7,"\pResults");
+        InsertMenu(resultsMenu,hierMenu);
+        DisableMenuItem(GetMenuHandle(131),7);
+    }
+
+    InvalMenuBar();
+    GetIndPattern (&penHatchPattern,0,8);
+    GetIndPattern (&vertPenHatchPattern,0,27);
+}
+
+//_________________________________________________________________________
+void    CleanupMenusAndSuch (void)
+{
+    DisposeHandle(menuBar);
+    DisposeMenu  (recentFilesMenu);
+}
+
+//________________________________________________________
+
+extern  ModalFilterUPP myFilterProc;
+
+//________________________________________________________
+bool        HandleFirstDialog (long& choice)
+{
+    bool           checkFlag = false;
+    short      iType;
+    Handle     iHandle;
+    Rect       iRect,
+               textBox;
+    Str255     buffer;
+    GrafPtr    sPort;
+
+    DialogPtr  theDlg = GetNewDialog (143,nil,(WindowPtr)-1);
+    if (!theDlg) {
+        return false;
+    }
+
+    GetPort(&sPort);
+#ifdef OPAQUE_TOOLBOX_STRUCTS
+    SetPort(GetDialogPort(theDlg));
+#else
+    SetPort(theDlg);
+#endif
+
+    SetDialogDefaultItem (theDlg,1);
+    GetDialogItem (theDlg,3,&iType,&iHandle,&textBox);
+    GetDialogItem (theDlg,2,&iType,&iHandle,&iRect);
+    iType = 0;
+#ifdef OPAQUE_TOOLBOX_STRUCTS
+    SelectWindow (GetDialogWindow(theDlg));
+#else
+    SelectWindow (theDlg);
+#endif
+    SetControlValue ((ControlHandle)iHandle,checkFlag);
+
+    DrawDialog (theDlg);
+    TextFont (20);
+    TextSize (10);
+    _String theMessage = GetVersionString();
+    StringToStr255 (theMessage, buffer);
+    long            counter = TextWidth ((Ptr)buffer,1,buffer[0]);
+
+#ifdef OPAQUE_TOOLBOX_STRUCTS
+    Rect    awr;
+    GetWindowBounds (GetDialogWindow(theDlg),kWindowGlobalPortRgn,&awr);
+    OffsetRect (&awr,-awr.left,-awr.top);
+    MoveTo ((awr.right-awr.left-counter)/2,textBox.top-10);
+#else
+    MoveTo ((theDlg->portRect.right-theDlg->portRect.left-counter)/2,textBox.top-10);
+#endif
+
+    DrawString (buffer);
+
+    while (1) {
+        ModalDialog (myFilterProc,&iType);
+        if (iType == 2) {
+            checkFlag = !checkFlag;
+            SetControlValue ((ControlHandle)iHandle,checkFlag);
+        } else {
+            break;
+        }
+    }
+    if (iType > 1) {
+        choice = iType-2;
+    } else {
+        choice = 0;
+    }
+
+
+    SetPort (sPort);
+    DisposeDialog (theDlg);
+    return !checkFlag;
+}
+
+
+//_________________________________________________________________________
+
+int main (void)
+{
+#ifndef __HYPHYXCODE__
+    _fcreator = 'MuSe';
+    _ftype    = 'TEXT';
+#endif
+
+    RegisterAppearanceClient();
+
+    InitToolbox();
+    whiteFill       = GetPixPat(128);
+    blueFill        = GetPixPat(131);
+    statusBarFill   = GetPixPat(134);
+
+    redButtonIcon       = GetCIcon (4000);
+    yellowButtonIcon    = GetCIcon (4001);
+    greenButtonIcon     = GetCIcon (4002);
+    orangeButtonIcon    = GetCIcon (4003);
+    pullDownArrowsIcon  = GetCIcon (4010);
+    tablePDMenuIcon     = GetCIcon (4020);
+
+    CursHandle          hCursor = GetCursor(132);
+    if (hCursor) {
+        HLock ((Handle)hCursor);
+        hSizeCursor = ** hCursor;
+        DisposeHandle ((Handle)hCursor);
+    }
+
+    hCursor = GetCursor(iBeamCursor);
+    if (hCursor) {
+        //HLock ((Handle)hCursor);
+        editStateCursor = ** hCursor;
+        //DisposeHandle ((Handle)hCursor);
+    }
+
+    pickUpCursor    = GetCCursor (128);
+    dropOffCursor   = GetCCursor (129);
+
+
+    char buffer[4096];
+#ifdef __HYPHYXCODE__
+    {
+        CFBundleRef myAppsBundle = CFBundleGetMainBundle();
+        CFURLRef myBundleURL = CFBundleCopyBundleURL(myAppsBundle);
+        FSRef myBundleRef;
+        CFURLGetFSRef(myBundleURL, &myBundleRef);
+        CFRelease(myBundleURL);
+        FSSpec   baseDirSpec;
+        FSGetCatalogInfo(&myBundleRef, kFSCatInfoNone,NULL, NULL, &baseDirSpec, NULL);
+        GetFullPathName (baseDirSpec, baseDirectory);
+        baseDirectory.Trim(0,baseDirectory.FindBackwards (':',0,-1));
+    }
+#else
+    getcwd (buffer,4095);
+    baseDirectory = buffer;
+#endif
+    pathNames && & baseDirectory;
+
+    libDirectory = baseDirectory & APPNAME ".app" & GetPlatformDirectoryChar() & "Contents" & GetPlatformDirectoryChar() & "Resources" & GetPlatformDirectoryChar() & "HBL" & GetPlatformDirectoryChar();
+    pathNames && & libDirectory;
+
+    if (!(menuBar = GetNewMBar(128))) {
+        _String        errMsg("Error reading menu resources. Quitting....");
+        ProblemReport (errMsg);
+        exit(1);
+    }
+    // fprintf(stderr, "%s\n", libDirectory.sData);
+
+    SetMenuBar(menuBar);
+    GlobalStartup();
+#ifdef __MP__
+    if (!(systemCPUCount = MPProcessors())) {
+        systemCPUCount = 1;
+    }
+#endif
+
+
+
+    OSErr           status;
+    TXNInitOptions options;
+    TXNMacOSPreferredFontDescription  defaults;
+    ATSUFontID      theFontID;
+
+    defaults.fontID = ATSUFindFontFromName ("Times Roman",
+                                            strlen("Times Roman"),
+                                            kFontFullName, kFontNoPlatformCode,
+                                            kFontNoScriptCode, kFontNoLanguageCode,
+                                            &theFontID);
+
+    defaults.pointSize = kTXNDefaultFontSize;
+    defaults.fontStyle = kTXNDefaultFontStyle;
+    defaults.encoding  = CreateTextEncoding (kTextEncodingMacRoman,
+                         kTextEncodingDefaultVariant,
+                         kTextEncodingDefaultFormat);
+
+    if (aquaInterfaceOn) {
+        options  =  0;
+    } else {
+        options  =  kTXNAlwaysUseQuickDrawTextMask;
+    }
+
+    status = TXNInitTextension (&defaults, 1, options);
+    if (status != noErr) {
+        FlagError ("Failed to initialize MLTE. Check the version of your CarbonLib (get the latest)");
+        return -1;
+    }
+
+    hyphyConsoleWindow = new _HYConsoleWindow ("HYPHY Console");
+    ReadPreferences();
+#ifdef __MP__
+    if (systemCPUCount == 1) {
+        BufferToConsole ("One processor detected.\n");
+    } else {
+        snprintf (buffer, sizeof(buffer),"%ld processors detected.\n", systemCPUCount);
+        BufferToConsole (buffer);
+    }
+#endif
+    
+
+    MoveConsoleWindow       (consolePositionRectangle);
+    SetPreferences          ();
+    ReadInTemplateFiles     ();
+    SetStatusLine           ("None","Idle","00:00:00");
+    hasTemplates = availableTemplateFiles.lLength;
+    SetupMenusAndSuch();
+    ReadModelTemplates ();
+    ReadGeneticCodes ();
+    StringToConsole (hyphyCiteString);
+
+    hyphyConsoleWindow->Activate();
+
+    mouseRgn = NewRgn();
+    Rect     dummy = {0,0,1,1};
+    RectRgn  (mouseRgn,&dummy);
+    trackMouseMovement = true;
+
+    long            choice = 0;
+
+    if (showDialogAtStartup) {
+        showDialogAtStartup = HandleFirstDialog (choice);
+
+        if (!showDialogAtStartup) {
+            _String wStr ("You can later change startup dialog settings in 'Preferences'");
+            ProblemReport (wStr);
+        }
+
+        if (choice == 1) {
+            RunStandardAnalyses();
+        } else {
+            _String dL (baseDirectory);
+            if (choice == 2) {
+                dL = dL & "data:";
+                OpenDataFile (&dL);
+            } else if (choice == 3) {
+                dL = dL & "Saves:";
+                if (OpenBatchFile (true,&dL)) {
+                    ExecuteBatchFile ();
+                }
+            }
+        }
+
+        SetShowDialogAtStartup (showDialogAtStartup);
+    }
+
+
+#ifdef TARGET_API_MAC_CARBON
+    EventLoopRef mainLoop;
+    EventLoopTimerUPP timerUPP;
+    EventLoopTimerRef theTimer;
+    mainLoop = GetMainEventLoop();
+    timerUPP = NewEventLoopTimerUPP(TimerAction);
+    InstallEventLoopTimer (mainLoop,0,kEventDurationSecond,timerUPP,NULL,&theTimer);
+#endif
+
+
+    bool  canQuit;
+    do {
+        canQuit = true;
+        while (handleGUI()) ; // main loop
+        highLevelQuit = false;
+        for (long i=windowObjects.countitems()-1; i>=1; i--) {
+            _HYPlatformWindow* thisWindow = (_HYPlatformWindow*)windowObjects(i);
+            _HYWindow*         pWindow = (_HYWindow*)thisWindow;
+            postWindowCloseEvent (pWindow->GetID());
+            handleGUI (false);
+            //if (!pWindow->Close(nil))
+            //break;
+        }
+        handleGUI (true);
+        if (windowObjects.lLength>1) {
+            canQuit = false;
+        }
+    } while (!canQuit);
+    // close all the windows with prompts
+
+    GlobalShutdown();
+    WritePreferences();
+    CleanupMenusAndSuch();
+
+    batchLanguageFunctions.Clear();
+    PurgeAll(true);
+
+    if (mouseRgn) {
+        DisposeRgn  (mouseRgn);
+    }
+
+    DisposePixPat(whiteFill);
+    DisposePixPat(blueFill);
+    DisposePixPat(statusBarFill);
+
+    DisposeCIcon (redButtonIcon);
+    DisposeCIcon (yellowButtonIcon);
+    DisposeCIcon (greenButtonIcon);
+    DisposeCIcon (pullDownArrowsIcon);
+    DisposeCIcon (tablePDMenuIcon);
+
+
+#ifdef TARGET_API_MAC_CARBON
+    RemoveEventLoopTimer (theTimer);
+    DisposeEventLoopTimerUPP (timerUPP);
+#endif
+    //ProfilerDump("\pProfile");
+    //ProfilerTerm();
+    return 0;
+}
+
+
+
+
diff --git a/src/mains/unix.cpp b/src/mains/unix.cpp
new file mode 100644
index 0000000..1af417c
--- /dev/null
+++ b/src/mains/unix.cpp
@@ -0,0 +1,841 @@
+/*
+
+HyPhy - Hypothesis Testing Using Phylogenies.
+
+Copyright (C) 1997-2002
+Sergei L Kosakovsky Pond (sergeilkp at mac.com)
+Spencer V Muse (muse at stat.ncsu.edu)
+
+Permission is hereby granted, free of charge, to any person obtaining a
+copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be included
+in all copies or substantial portions of the Software.
+
+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.
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+*/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include "batchlan.h"
+#include "calcnode.h"
+#include <unistd.h>
+#include "polynoml.h"
+
+#if !defined __MINGW32__
+
+    #include <termios.h>
+    #include <signal.h>
+    #define __HYPHY_HANDLE_TERM_SIGNAL__
+
+#endif
+
+
+#ifdef _MINGW32_MEGA_
+#include <Windows.h>
+HANDLE _HY_MEGA_Pipe = INVALID_HANDLE_VALUE;
+#endif
+
+#ifdef  __UNITTEST__
+#include "gtest/gtest.h"
+#include "ut_strings.h"
+#endif
+
+#if defined   __MP2__ || defined __MP__
+#include <pthread.h>
+#endif
+#include "likefunc.h"
+
+#ifndef __HYPHY_NO_CURL__
+//#define __HYPHYCURL__
+#endif
+
+#ifdef  __HYPHYCURL__
+#include <curl/curl.h>
+#endif
+
+#ifdef    __HYPHYDMALLOC__
+#include "dmalloc.h"
+#endif
+
+#ifdef _OPENMP
+#include "omp.h"
+#endif
+
+_List   availableTemplateFiles,
+        availablePostProcessors,
+        loggedUserInputs;
+
+_String baseArgDir,
+        libArgDir,
+        loggedFileEntry ("__USER_ENTRY__");
+
+void    ReadInTemplateFiles         (void);
+long    DisplayListOfChoices        (void);
+void    ProcessConfigStr            (_String&);
+void    ReadInPostFiles             (void);
+long    DisplayListOfPostChoices    (void);
+_String getLibraryPath              (void);
+
+
+extern  long
+systemCPUCount;
+
+extern  _String         VerbosityLevelString,
+        errorFileName,
+        messageFileName,
+        baseDirectory,
+        libDirectory,
+        shortMPIReturn,
+        dialogPrompt;
+
+long    mainArgCount = 0;
+
+bool    usePostProcessors = false,
+        calculatorMode    = false,
+        updateMode       = false,
+        pipeMode         = false,
+        dropIntoDebugMode = false,
+        logInputMode   = false,
+        needExtraNL    = false;
+
+char    prefFileName[] = ".hyphyinit";
+
+#ifdef  __HYPHYMPI__
+extern int          _hy_mpi_node_rank;
+
+void            mpiNormalLoop    (int, int, _String &);
+void            mpiOptimizerLoop (int, int);
+#endif
+
+
+#ifdef     __HYPHY_HANDLE_TERM_SIGNAL__
+    volatile sig_atomic_t hyphy_sigterm_in_progress = 0;
+     
+    void    hyphy_sigterm_handler (int sig)
+    {
+       if (hyphy_sigterm_in_progress)
+           raise (sig);
+           
+       hyphy_sigterm_in_progress = 1;
+     
+       WarnError (_String("HyPhy killed by signal ") & (long)sig);
+       
+       signal (sig, SIG_DFL);
+       raise  (sig);
+    }
+     
+#endif  
+
+//bool  terminateExecution = false;
+
+//____________________________________________________________________________________
+
+_String getLibraryPath() {
+
+    char    curWd[4096],
+            dirSlash = GetPlatformDirectoryChar();
+    getcwd (curWd,4096);
+
+    _String baseDir (curWd);
+
+    if (baseDir.getChar (baseDir.sLength-1) != dirSlash) {
+        baseDir=baseDir & dirSlash;
+    }
+
+#if defined _HYPHY_LIBDIRECTORY_
+    _String libDir (_HYPHY_LIBDIRECTORY_);
+
+    if (libDir.getChar (libDir.sLength-1) != dirSlash) {
+        libDir=libDir & dirSlash;
+    }
+
+#else
+     pathNames&& &baseDir;
+    _String libDir = baseDir;
+#endif
+
+    // SW20141119: Check environment libpath and override default path if it exists
+    // TODO: Move string to globals in v3
+    // TODO: Move function to helpers location in v3
+    char* hyphyEnv = getenv("HYPHY_PATH");
+    if(hyphyEnv) {
+      _String hyphyPath(hyphyEnv);
+      if(hyphyPath.sLength != 0) {
+        libDir = hyphyPath;
+      }
+    }
+
+    return libDir;
+
+}
+
+//__________________________________________________________________________________
+void    ReadInTemplateFiles(void)
+{
+    _String fileIndex;
+    fileIndex = *((_String*)pathNames(0)) &"TemplateBatchFiles/files.lst";
+    FILE* modelList = fopen (fileIndex.getStr(),"r");
+    if (!modelList) {
+        fileIndex = baseArgDir&"TemplateBatchFiles/files.lst";
+        modelList = fopen (fileIndex.getStr(),"r");
+        if (!modelList) {
+            return;
+        }
+    } else {
+        baseArgDir = *((_String*)pathNames(0));
+    }
+
+    _String theData (modelList);
+    fclose (modelList);
+    
+    if (theData.sLength) {
+        _ElementaryCommand::ExtractConditions(theData,0,availableTemplateFiles);
+        for (long i = 0; i<availableTemplateFiles.countitems(); i++) {
+            _String* thisString = (_String*)availableTemplateFiles(i);
+            _List   thisFile;
+            _ElementaryCommand::ExtractConditions(*thisString,thisString->FirstNonSpaceIndex(),thisFile,',');
+            if (thisFile.lLength!=3) {
+                availableTemplateFiles.Delete(i);
+                i--;
+                continue;
+            }
+            for (long j = 0; j<3; j++) {
+                ((_String*)thisFile(j))->StripQuotes();
+            }
+            availableTemplateFiles.Replace(i,&thisFile,true);
+        }
+
+    }
+}
+
+//__________________________________________________________________________________
+void    ReadInPostFiles(void)
+{
+    //if (!likeFuncList.lLength)
+    //  return;
+
+    _String fileIndex;
+    FILE* modelList = fopen (fileIndex.getStr(),"r");
+    fileIndex = libArgDir &"TemplateBatchFiles/postprocessors.lst";
+    modelList = fopen (fileIndex.getStr(),"r");
+    
+    if (modelList == NULL) {
+        return;
+    }
+
+    _String theData (modelList);
+    fclose (modelList);
+    
+    if (theData.sLength) {
+        _ElementaryCommand::ExtractConditions(theData,0,availablePostProcessors);
+        for (long i = 0; i<availablePostProcessors.countitems(); i++) {
+            _String* thisString = (_String*)availablePostProcessors(i);
+            _List   thisFile;
+            _ElementaryCommand::ExtractConditions(*thisString,thisString->FirstNonSpaceIndex(),thisFile,',');
+            if (thisFile.lLength!=3) {
+                availablePostProcessors.Delete(i);
+                i--;
+                continue;
+            }
+            for (long j = 0; j<3; j++) {
+                ((_String*)thisFile(j))->StripQuotes();
+            }
+            if (*(_String*)thisFile(0)!=_String("SEPARATOR")) {
+                fileIndex = *((_String*)pathNames(0)) &"TemplateBatchFiles/" & *(_String*)thisFile(1);
+                //printf ("%s\n", fileIndex.sData);
+                FILE* dummyFile = fopen (fileIndex,"r");
+                if (!dummyFile) {
+                    fileIndex =libArgDir&"TemplateBatchFiles/"& *(_String*)thisFile(1);
+                    dummyFile = fopen (fileIndex,"r");
+                }
+                if (dummyFile) {
+                    fclose (dummyFile);
+                    _String* condition = (_String*)thisFile(2);
+                    if (condition->sLength) {
+                        _Formula condCheck (*condition,nil);
+                        _PMathObj condCheckRes = condCheck.Compute();
+                        if ((!condCheckRes)||(condCheckRes->Value()<.5)) {
+                            availablePostProcessors.Delete(i);
+                            i--;
+                            continue;
+                        }
+                    }
+                    *(_String*)thisFile(1) = fileIndex;
+                    availablePostProcessors.Replace(i,&thisFile,true);
+                    continue;
+                }
+            }
+            availablePostProcessors.Delete(i);
+            i--;
+        }
+
+    }
+}
+
+//__________________________________________________________________________________
+long    DisplayListOfChoices (void)
+{
+    ReadInTemplateFiles();
+
+    if (!availableTemplateFiles.lLength) {
+        return -1;
+    }
+
+    long        choice = -1;
+    char        buffer[2048];
+    _String     fileAbbr,
+                *thisLine;
+    _SimpleList categoryDelimiters;
+    _List       categoryHeadings;
+
+    for (choice = 0; choice< availableTemplateFiles.lLength; choice++) {
+        thisLine = (_String*)(*(_List*)availableTemplateFiles(choice))(2);
+        if (thisLine->sData[0]=='!') {
+            categoryDelimiters<<choice;
+            fileAbbr = *thisLine;
+            fileAbbr.Trim (1,-1);
+            categoryHeadings && &fileAbbr;
+        }
+    }
+
+    choice = -1;
+    if (categoryDelimiters.lLength==0) {
+        while (choice == -1) {
+            for (choice = 0; choice<availableTemplateFiles.lLength; choice++) {
+                printf ("\n\t(%s):%s",((_String*)(*(_List*)availableTemplateFiles(choice))(0))->getStr(),
+                        ((_String*)(*(_List*)availableTemplateFiles(choice))(1))->getStr());
+            }
+            printf ("\n\n Please type in the abbreviation for the file you want to use (or press ENTER to process custom batch file):");
+            fgets (buffer,2048,stdin);
+            fgets (buffer,2048,stdin);
+            fileAbbr = buffer;
+            if (fileAbbr.FirstNonSpaceIndex()<0) {
+                return -1;
+            }
+            fileAbbr.UpCase();
+            for (choice = 0; choice<availableTemplateFiles.lLength; choice++) {
+                if (fileAbbr.Equal((_String*)(*(_List*)availableTemplateFiles(choice))(0))) {
+                    break;
+                }
+            }
+            if (choice==availableTemplateFiles.lLength) {
+                choice=-1;
+            }
+        }
+    } else {
+        long categNumber = -1;
+        while (choice==-1) {
+            if (categNumber<0) {
+                _String   header ("***************** TYPES OF STANDARD ANALYSES *****************"),
+                          verString (GetVersionString().getStr());
+
+                if (verString.sLength<header.sLength-2) {
+                    _String padder (128,true);
+                    long    poop = (header.sLength-2-verString.sLength)/2;
+                    if (!poop) {
+                        poop = 1;
+                    }
+                    for (choice=0; choice<poop; choice++) {
+                        padder << ' ';
+                    }
+                    padder.Finalize();
+                    verString = padder & '/' & verString & "\\" & padder;
+                }
+
+                printf ("\n\033[2J\033[H%s\n%s\n\n",verString.getStr(), header.getStr());
+                for (choice = 0; choice<categoryHeadings.lLength; choice++) {
+                    printf ("\n\t(%ld) %s",choice+1,((_String*)categoryHeadings(choice))->getStr());
+                }
+
+                printf ("\n\n Please select type of analyses you want to list (or press ENTER to process custom batch file):");
+
+
+                fgets (buffer,2048,stdin);
+                fileAbbr = buffer;
+
+                if (logInputMode) {
+                    loggedUserInputs && & fileAbbr;
+                }
+
+                if (fileAbbr.FirstNonSpaceIndex()<0) {
+                    return -1;
+                }
+
+                choice = fileAbbr.toNum();
+
+                if ( choice>0 && choice<=categoryHeadings.lLength) {
+                    categNumber = choice-1;
+                }
+            } else {
+                printf ("\n\033[2J\033[H ***************** FILES IN '%s' ***************** \n\n",((_String*)categoryHeadings(categNumber))->getStr());
+                long start = categoryDelimiters.lData[categNumber]+1,
+                     end = categNumber==categoryDelimiters.lLength-1?availableTemplateFiles.lLength:categoryDelimiters.lData[categNumber+1];
+
+                for (choice = start; choice<end; choice++) {
+                    printf ("\n\t(%ld) %s",choice-start+1,((_String*)(*(_List*)availableTemplateFiles(choice))(1))->getStr());
+                }
+
+                printf ("\n\n Please select the file you want to use (or press ENTER to return to the list of analysis types):");
+
+                fileAbbr = *StringFromConsole ();
+
+                if (logInputMode) {
+                    loggedUserInputs && & fileAbbr;
+                }
+
+                if (fileAbbr.FirstNonSpaceIndex()<0) {
+                    categNumber = -1;
+                } else {
+                    choice = fileAbbr.toNum();
+                    if ((choice>0 && choice<=end-start)) {
+                        return start+choice-1;
+                    }
+                }
+
+            }
+            choice = -1;
+        }
+    }
+    return choice;
+}
+
+//__________________________________________________________________________________
+long    DisplayListOfPostChoices (void)
+{
+    long choice = -1;
+    if (availablePostProcessors.lLength) {
+        _String fileAbbr;
+        printf ("\033[2J\033[H\n\t Available Result Processing Tools\n\t ---------------------------------\n\n");
+        while (choice == -1) {
+            for (choice = 0; choice<availablePostProcessors.lLength; choice++) {
+                printf ("\n\t(%ld):%s",choice+1,
+                        ((_String*)(*(_List*)availablePostProcessors(choice))(0))->getStr());
+            }
+            printf ("\n\n Please type in the abbreviation for the tool you want to use (or press q to exit):");
+            fileAbbr = *StringFromConsole();
+            fileAbbr.UpCase();
+            if (logInputMode) {
+                loggedUserInputs && & fileAbbr;
+            }
+            if (!fileAbbr.sLength||((fileAbbr.sLength==1)&&(fileAbbr.sData[0]=='Q'))) {
+                return -1;
+            }
+            choice = fileAbbr.toNum();
+
+            if (choice<=0 || choice>availablePostProcessors.lLength) {
+                choice = -1;
+            }
+        }
+    }
+    return choice;
+}
+
+
+//__________________________________________________________________________________
+void    ProcessConfigStr (_String& conf)
+{
+    _String errMsg;
+    for (long i=1; i<conf.sLength; i++) {
+        switch (conf.sData[i]) {
+        case 'p':
+        case 'P': {
+            usePostProcessors = true;
+            break;
+        }
+        case 'c':
+        case 'C': {
+            calculatorMode = true;
+            break;
+        }
+        case 'd':
+        case 'D': {
+            dropIntoDebugMode = true;
+            break;
+        }
+        case 'u':
+        case 'U': {
+            updateMode = true;
+            break;
+        }
+        case 'l':
+        case 'L': {
+            logInputMode = true;
+            break;
+        }
+        //case 'i':
+        //case 'I':
+        //{
+        //pipeMode = true;
+        //break;
+        //}
+        default: {
+            errMsg = "Option ";
+            errMsg = errMsg & conf.sData[i] & " is not valid and is ignored";
+            ReportWarning (errMsg);
+        }
+        }
+    }
+}
+
+
+//__________________________________________________________________________________
+
+void hyphyBreak (int signo)
+{
+    //terminateExecution = false;
+    printf ("\nInterrupt received %d. HYPHY will break into calculator mode at the earliest possibility...\n", signo);
+}
+
+//__________________________________________________________________________________
+void    SetStatusBarValue           (long,_Parameter,_Parameter)
+{
+
+}
+//__________________________________________________________________________________
+void    SetStatusLine               (_String s)
+{
+#ifdef  _MINGW32_MEGA_
+    if (_HY_MEGA_Pipe != INVALID_HANDLE_VALUE) {
+        DWORD bytesWritten = 0;
+        if (WriteFile (_HY_MEGA_Pipe,(LPCVOID)s.sData,s.sLength,&bytesWritten,NULL) == FALSE || bytesWritten != s.sLength) {
+            _String errMsg ("Failed to write the entire status update to a named MEGA pipe");
+            StringToConsole (errMsg);
+        }
+        FlushFileBuffers(_HY_MEGA_Pipe);
+    } else {
+        StringToConsole (s);
+    }
+#endif
+
+}
+
+//__________________________________________________________________________________
+void    SetStatusLineUser   (_String s)
+{
+    setvbuf(stdout, NULL, _IONBF, 0);
+    BufferToConsole("\33[2K\r");
+    StringToConsole(s);
+    needExtraNL = true;
+}
+
+//__________________________________________________________________________________
+
+#ifndef __UNITTEST__
+int main (int argc, char* argv[])
+{
+    mainArgCount = argc - 1;
+
+
+#ifdef  __HYPHYMPI__
+    int            rank,
+                   size;
+
+    MPI_Init       (&argc, &argv);
+    MPI_Comm_rank(MPI_COMM_WORLD, &rank);
+    MPI_Comm_size(MPI_COMM_WORLD, &size);
+
+    setParameter  (mpiNodeID,    (_Parameter)rank);
+    setParameter    (mpiNodeCount, (_Parameter)size);
+    _hy_mpi_node_rank = rank;
+
+    if (rank == 0) {
+        mpiNodesThatCantSwitch.Populate (size,1,0);
+        /* {
+              char hostname[256];
+              gethostname(hostname, sizeof(hostname));
+              printf("PID %d on %s ready for attach\n", getpid(), hostname);
+              fflush(stdout);
+              //getchar ();
+          } */
+#endif
+
+
+        //for (long k=0; k<NSIG; k++)
+        //{
+        //  signal(k, &hyphyBreak);
+        //}
+
+#ifdef  __HYPHYMPI__
+    }
+#endif
+
+#ifdef __HYPHY_HANDLE_TERM_SIGNAL__
+    if (signal (SIGTERM, hyphy_sigterm_handler) == SIG_IGN)
+         signal (SIGTERM, SIG_IGN);
+     if (signal (SIGINT, hyphy_sigterm_handler) == SIG_IGN)
+         signal (SIGINT, SIG_IGN);
+         
+#endif
+    char    curWd[4096],
+            dirSlash = GetPlatformDirectoryChar();
+    getcwd (curWd,4096);
+
+    _String baseDir (curWd);
+
+    if (baseDir.getChar (baseDir.sLength-1) != dirSlash) {
+        baseDir=baseDir & dirSlash;
+    }
+    
+    _String libDir = getLibraryPath();
+    pathNames&& &libDir;
+    _String argFile;
+
+    libDirectory  = libDir;
+    libArgDir     = libDirectory;
+    baseDirectory = baseDir;
+    baseArgDir    = baseDirectory;
+
+  
+#ifdef _OPENMP
+    systemCPUCount = omp_get_max_threads();
+#endif
+
+#ifdef _MINGW32_MEGA_
+    {
+        char pid[16];
+        snprintf (pid,16,"%u", GetCurrentProcessId());
+
+        _String pipeName = _String("\\\\.\\pipe\\MEGAPipe") & pid;
+        printf ("Pipe name = %s\n", pipeName.sData);
+        if ((_HY_MEGA_Pipe = CreateFile(pipeName.sData, GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL)) == INVALID_HANDLE_VALUE) {
+            char* lpMsgBuf;
+            FormatMessage(
+                FORMAT_MESSAGE_ALLOCATE_BUFFER |
+                FORMAT_MESSAGE_FROM_SYSTEM |
+                FORMAT_MESSAGE_IGNORE_INSERTS,
+                NULL,
+                GetLastError(),
+                MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
+                (LPTSTR) &lpMsgBuf,
+                0, NULL );
+            FlagError (_String("Failed to create a pipe named '") & pipeName & "' to send data from HyPhy to MEGA. Error: "&lpMsgBuf);
+        }
+    }
+#endif
+
+    for (long i=1; i<argc; i++) {
+        _String thisArg (argv[i]);
+        if (thisArg.sData[0]=='-') {
+            ProcessConfigStr (thisArg);
+        } else if (thisArg.beginswith ("BASEPATH=")) {
+            baseArgDir = thisArg.Cut(9,-1);
+            if (baseArgDir.sLength) {
+                if (baseArgDir.sData[baseArgDir.sLength-1]!=dirSlash) {
+                    baseArgDir = baseArgDir&dirSlash;
+                }
+                baseDirectory = baseArgDir;
+                pathNames.Delete    (0);
+                pathNames&&         &baseDirectory;
+           }
+        } else if (thisArg.beginswith ("LIBPATH=")) {
+            libArgDir = thisArg.Cut(8,-1);
+            if (libArgDir.sLength) {
+                if (libArgDir.sData[libArgDir.sLength-1] != dirSlash) {
+                    libArgDir = libArgDir & dirSlash;
+                }
+                libDirectory = libArgDir;
+                pathNames.Delete    (0);
+                pathNames&&         &libDirectory;
+           }
+        } else if (thisArg.beginswith ("USEPATH=")) {
+            baseDir             = thisArg.Cut(8,-1);
+            errorFileName       = baseDir & errorFileName;
+            messageFileName     = baseDir & messageFileName;
+            pathNames.Delete    (0);
+            pathNames&&         &baseDir;
+        } else
+#ifdef __MP__
+            if (thisArg.beginswith ("CPU=")) {
+                _String cpus = thisArg.Cut(4,-1);
+                systemCPUCount = cpus.toNum();
+                if (systemCPUCount<1) {
+                    systemCPUCount = 1;
+                }
+                pthread_setconcurrency (systemCPUCount+1);
+            } else
+#endif
+                argFile = thisArg;
+    }
+
+    GlobalStartup();
+  
+  /*_String exp2 ("1+x*t+y*t"),
+          exp1 ("y*t");
+  
+  _Formula f1 (exp1),
+           f2 (exp2);
+  
+  _MathObject *pl = ((_Polynomial*)f1.ConstructPolynomial ())->Add (f2.ConstructPolynomial());
+  
+  fprintf (stdout, "%s\n", _String ((_String*)pl->toStr()).getStr());*/
+           
+
+    _ExecutionList ex;
+  
+  
+  if (calculatorMode) {
+        printf ("\nHYPHY is running in calculator mode. Type 'exit' when you are finished.\n");
+        while (ExpressionCalculator()) ;
+        return 0;
+    }
+
+    if (pipeMode) {
+        _String bfIn (stdin);
+        _ExecutionList exIn (bfIn);
+        exIn.Execute();
+        GlobalShutdown();
+        return 0;
+    }
+
+    // try to read the preferences
+    _String     prefFile (curWd);
+    prefFile = prefFile & '/' & prefFileName;
+    FILE     * testPrefFile = fopen (prefFile.sData,"r");
+    if (!testPrefFile) {
+        prefFile = baseArgDir & prefFileName;
+        testPrefFile = fopen (prefFile.sData,"r");
+    }
+    if (testPrefFile) {
+        fclose(testPrefFile);
+        ReadBatchFile (prefFile,ex);
+        ex.Execute();
+        ex.Clear();
+    }
+    //printf ("Node %d before mpiParallelOptimizer\n", rank);
+#ifdef __HYPHYMPI__
+    if (rank>0) {
+        //if (mpiParallelOptimizer || mpiPartitionOptimizer)
+        //  mpiOptimizerLoop (rank, size);
+        //else
+        _String defaultBaseDirectory = *(_String*)pathNames(0);
+        mpiNormalLoop (rank, size, defaultBaseDirectory);
+        /*argFile = "SHUTDOWN_CONFIRM";
+        MPISendString (argFile, senderID);*/
+    } else {
+#endif
+        if (!argFile.sLength) {
+            long selection = -2;
+            if (!updateMode) {
+                selection = DisplayListOfChoices();
+            }
+
+            if (selection == -1) {
+                dialogPrompt = "Batch file to run:";
+                _String fStr (ReturnDialogInput (true));
+                if (logInputMode) {
+                    _String tts = loggedFileEntry&fStr;
+                    loggedUserInputs && & tts;
+                }
+
+                PushFilePath (fStr);
+                ReadBatchFile (fStr,ex);
+            } else {
+                _String templ;
+
+                if (selection >= 0) {
+                    templ = baseArgDir &"TemplateBatchFiles" & dirSlash;
+                } else {
+                    templ = baseArgDir & "TemplateBatchFiles" & dirSlash & "WebUpdate.bf";
+                }
+
+                if (selection >= 0) {
+                    templ= templ&*(_String*)(*(_List*)availableTemplateFiles(selection))(2);
+                }
+
+                PushFilePath (templ);
+                ReadBatchFile (templ,ex);
+            }
+        } else {
+#ifndef __MINGW32__
+            if (argFile.sData[0] != '/') {
+                argFile       = baseDirectory & argFile;
+            }
+#else
+            if (argFile.sData[1] != ':') { // not an absolute path
+                argFile       = baseDirectory & argFile;
+            }
+#endif
+            PushFilePath  (argFile);
+            ReadBatchFile (argFile,ex);
+        }
+
+        ex.Execute();
+
+        if (usePostProcessors && (!updateMode)) {
+            ReadInPostFiles();
+            printf ("\n\n**********Continue with result processing (y/n)?");
+            _String c_str (StringFromConsole());
+
+            if (logInputMode) {
+                loggedUserInputs && & c_str;
+            }
+
+            if (c_str.getChar(0) !='n' && c_str.getChar(0)!='N' ) {
+                long choice = DisplayListOfPostChoices();
+                while (choice != -1) {
+                    _ExecutionList postEx;
+                    argFile = *(_String*)(*(_List*)availablePostProcessors(choice-1))(1);
+                    PushFilePath (argFile);
+                    ReadBatchFile (argFile, postEx);
+                    postEx.Execute();
+                    PopFilePath ();
+                    printf ("\n\n**********Continue with result processing (y/n)?");
+
+                    c_str = StringFromConsole();
+                    if (logInputMode) {
+                        loggedUserInputs && & c_str;
+                    }
+
+                    if (c_str.getChar(0)=='n' || c_str.getChar(0)=='N' ) {
+                        break;
+                    }
+
+                    choice = DisplayListOfPostChoices();
+                }
+            }
+        }
+#ifdef __HYPHYMPI__
+    }
+    ReportWarning               (_String ("Node ") & (long)rank & " is shutting down\n");
+#endif
+
+
+#ifdef _MINGW32_MEGA_
+    if (_HY_MEGA_Pipe != INVALID_HANDLE_VALUE) {
+        CloseHandle (_HY_MEGA_Pipe);
+    }
+#endif
+
+    PurgeAll                    (true);
+    GlobalShutdown              ();
+
+#ifdef __HYPHYMPI__
+    if (rank == 0) {
+        printf ("\n\n");
+    }
+#endif
+
+}
+
+#endif
+
+#ifdef  __UNITTEST__
+int main(int argc, char **argv)
+{
+    ::testing::InitGoogleTest(&argc, argv);
+    return RUN_ALL_TESTS();
+}
+#endif
diff --git a/src/mains/win.cpp b/src/mains/win.cpp
new file mode 100644
index 0000000..b5aef38
--- /dev/null
+++ b/src/mains/win.cpp
@@ -0,0 +1,859 @@
+#include "batchlan.h"
+#include "preferences.h"
+#include "HYSharedMain.h"
+#include "HYUtils.h"
+#include "HYDialogs.h"
+#include "HYChartWindow.h"
+#include "HYModelWindow.h"
+#include "HYConsoleWindow.h"
+#include "HYCanvas.h"
+#include "HYTextBox.h"
+#include "HYDataPanel.h"
+#include "HYEventTypes.h"
+
+#include <io.h>
+#include <windows.h>
+#include <winuser.h>
+#include <wingdi.h>
+#include <commdlg.h>
+#include <time.h>
+#include <stdio.h>
+
+#ifndef _WIN32_IE
+#define _WIN32_IE 0x0400
+#endif
+
+#include <commctrl.h>
+
+#define  RECENT_FILE_ITEMS       10
+
+//____________________________________________________________________________________________
+/* EXTERNAL GLOBAL VARIABLES */
+//____________________________________________________________________________________________
+
+
+extern           _Parameter         printDigits;
+extern           _String            dialogPrompt;
+
+//____________________________________________________________________________________________
+/* GLOBAL VARIABLES */
+//____________________________________________________________________________________________
+
+HMENU                   recentFilesMenu,
+                        resultsMenu         = nil;
+
+char                    AppName[] = "HYPHY";
+char                    WinName[] = "HPGUIW";
+
+
+_String                 lastWinPathUsed,
+                        consoleWindowTitle ("HYPHY Console");
+
+
+bool                    onlyStatusBar       = false,
+                        hyphyExiting        = false;
+
+time_t                  timerStart          = 0,
+                        lastTimer             = 0;
+
+_SimpleList             *currentListBoxSel,
+                        *currentListBoxAvChoices,
+                        *currentListBoxRec;
+
+long                    currentListBoxSelLength,
+                        barPercentage = -1;
+
+
+HFONT                   statusBarBold,
+                        statusBarPlain;
+
+HBRUSH                  windowStatusBarBrush,
+                        dlgWhite = CreateSolidBrush (RGB (255,255,255));
+
+HDC                     offScreenContext;
+
+HINSTANCE               ProgramInstance;
+
+BOOL                    UserAbortFlag;
+HWND                    PrintDialogHandle;
+
+
+//__________________________________________________________________________________
+// RESOURCE IMPORT DEFS
+//__________________________________________________________________________________
+
+HCURSOR                 hSizeCursor,
+                        pickUpCursor,
+                        dropOffCursor;
+
+HBITMAP                 tablePDMenuIcon,
+                        redButtonIcon,
+                        yellowButtonIcon,
+                        orangeButtonIcon,
+                        greenButtonIcon;
+
+HDC                     otherDC;
+HBITMAP                 oDCBM;
+
+
+//____________________________________________________________________________________________
+/* FUNCTION PROTOTYPES */
+//____________________________________________________________________________________________
+
+
+LRESULT         CALLBACK HYWndProc               (HWND , UINT , WPARAM  , LPARAM );
+LRESULT         CALLBACK HYDlgProc               (HWND , UINT , WPARAM  , LPARAM );
+VOID            CALLBACK GlobalQueueTimer        (HWND , UINT , UINT_PTR, DWORD );
+BOOL            CALLBACK startupBoxHandlerFunction
+(HWND , UINT , WPARAM , LPARAM );
+
+BOOL            CALLBACK aboutBoxHandlerFunction (HWND , UINT , WPARAM , LPARAM );
+BOOL            CALLBACK PrintDialogProc         (HWND, UINT, WPARAM, LPARAM);
+BOOL            CALLBACK AbortProc               (HDC, int);
+HDC             GetPrinterDeviceContext          (HWND);
+
+void            LoadHYPHYResources               (void);
+void            UpdateTimer                      (void);
+bool            displayFirstDialog               (long&);
+
+void            WinInitSet                       (void);
+void            WinErrorBox                      (_String&, bool = false);
+bool            runFile                          (void);
+void            displayAbout                     (bool);
+void            centerDialogBox                  (HWND);
+void            getUserFont                      (void);
+
+//__________________________________________________________________________________
+
+BOOL CALLBACK PrintDialogProc(HWND DialogHandle, UINT msg, WPARAM /* wParam */, LPARAM /*lParam */)
+{
+    switch(msg) {
+    case WM_INITDIALOG:
+        EnableMenuItem(GetSystemMenu(DialogHandle, FALSE), SC_CLOSE, MF_GRAYED);
+        return TRUE;
+
+    case WM_COMMAND:
+        UserAbortFlag = TRUE;
+        EnableWindow(GetParent(DialogHandle), TRUE);
+        DestroyWindow(DialogHandle);
+        PrintDialogHandle = 0;
+        return TRUE;
+    }
+    return FALSE;
+}
+
+//__________________________________________________________________________________
+
+void        UpdateTimer (void)
+{
+    time_t tt,
+           time_diff = time(&tt)-lastTimer;
+
+    if (time_diff>=1) { // update dispay
+        lastTimer = tt;
+
+        _String     r;
+        updateTimerF(r,tt-timerStart);
+        SetStatusLine (empty,empty,r,0,HY_SL_TIMER);
+    }
+}
+
+
+//__________________________________________________________________________________
+
+HDC GetPrinterDeviceContext(HWND WindowHandle)
+{
+    PRINTER_INFO_4  * PrinterInfo4;             /* mm 990507 */
+    PRINTER_INFO_5  * PrinterInfo5;             /* mm 990507 */
+    DWORD           BytesCopied, StructuresCopied;
+    char            Msg[]  = "Default printer not found";
+    HDC             hdc;
+    /* begin mm 990507 */
+    if (GetVersion() & 0x80000000) { /*  Windows 98  */
+
+        EnumPrinters(PRINTER_ENUM_DEFAULT, NULL, 5, NULL, 0, &BytesCopied,  &StructuresCopied);
+
+        PrinterInfo5 = (PRINTER_INFO_5 *)malloc(BytesCopied);
+
+        if (EnumPrinters(PRINTER_ENUM_DEFAULT, NULL, 5, (PBYTE) PrinterInfo5,
+                         BytesCopied, &BytesCopied, &StructuresCopied)) {
+            hdc = CreateDC(NULL, PrinterInfo5->pPrinterName, NULL, NULL);
+            free(PrinterInfo5);
+        } else {
+
+            MessageBox(WindowHandle, Msg, "HYPHY",
+                       MB_OK | MB_ICONEXCLAMATION);
+            return (0);
+        }
+
+    } else {
+        /*  Windows NT || Windows 95 */
+
+        EnumPrinters(PRINTER_ENUM_LOCAL, NULL, 4, NULL, 0, &BytesCopied, &StructuresCopied);
+
+        PrinterInfo4 = (PRINTER_INFO_4 *)malloc(BytesCopied);
+
+        if (EnumPrinters(PRINTER_ENUM_LOCAL, NULL, 4, (PBYTE) PrinterInfo4,
+                         BytesCopied, &BytesCopied, &StructuresCopied)) {
+            hdc = CreateDC(NULL, PrinterInfo4->pPrinterName, NULL, NULL);
+            free(PrinterInfo4);
+
+        } else {
+
+            MessageBox(WindowHandle, Msg, "HYPHYKernel",
+                       MB_OK | MB_ICONEXCLAMATION);
+            return (0);
+        }
+    }
+    /* end mm 990507 */
+
+    return(hdc);
+}
+
+
+//__________________________________________________________________________________
+
+BOOL CALLBACK AbortProc(HDC /* hPrinterDC */, int /* iCode */)
+{
+    MSG msg;
+
+    while (!UserAbortFlag && PeekMessage (&msg, NULL, 0, 0, PM_REMOVE)) {
+        if (!PrintDialogHandle || !IsDialogMessage(PrintDialogHandle, &msg)) {
+            TranslateMessage(&msg);
+            DispatchMessage(&msg);
+        }
+    }
+    return !UserAbortFlag;
+}
+
+//_________________________________________________________________________
+void  getUserFont (void)
+{
+    LOGFONT fInfo;
+    CHOOSEFONT cInfo;
+    cInfo.lStructSize = sizeof (CHOOSEFONT);
+    cInfo.hwndOwner = (HWND)hyphyConsoleWindow->GetOSWindowData();
+    cInfo.lpLogFont = &fInfo;
+    cInfo.hDC = NULL;
+    cInfo.Flags = CF_BOTH|CF_LIMITSIZE|CF_FIXEDPITCHONLY;
+    cInfo.nSizeMin = 8;
+    cInfo.nSizeMax = 14;
+    cInfo.lCustData = 0;
+    cInfo.hInstance = NULL;
+    cInfo.lpszStyle = (LPTSTR)NULL;
+    cInfo.nFontType = SCREEN_FONTTYPE;
+
+    if (ChooseFont(&cInfo)) {
+        _HYFont cF;
+        cF.face     = fInfo.lfFaceName;
+        cF.size     = cInfo.iPointSize/10;
+        cF.style    = HY_FONT_PLAIN;
+
+        ((_HYTextBox*)hyphyConsoleWindow->GetObject(0))->SetFont(cF);
+        ((_HYTextBox*)hyphyConsoleWindow->GetObject(1))->SetFont(cF);
+    }
+}
+
+//_________________________________________________________________________
+BOOL CALLBACK startupBoxHandlerFunction (HWND DialogHandle, UINT iMsg, WPARAM wParam, LPARAM )
+{
+    switch (iMsg) {
+    case WM_COMMAND: {
+        if ((HIWORD (wParam)==STN_CLICKED)||(HIWORD (wParam)==BN_CLICKED)) {
+            if (LOWORD(wParam)) {
+                HWND   checkBoxHandle = GetDlgItem (DialogHandle,0);
+                char   isChecked = (SendMessage (checkBoxHandle, BM_GETCHECK, 0,0)==BST_CHECKED);
+                EndDialog (DialogHandle, LOWORD (wParam)+5*isChecked);
+                return 1;
+            }
+        }
+        break;
+    }
+
+    case WM_CLOSE:
+    case WM_DESTROY: {
+        EndDialog (DialogHandle,0);
+        return 1;
+    }
+    case WM_INITDIALOG: {
+        _String theMessage = GetVersionString();
+        SetDlgItemText (DialogHandle, 5, theMessage.sData);
+        centerDialogBox (DialogHandle);
+        return 1;
+        break;
+    }
+    case WM_ERASEBKGND: {
+        RECT cr;
+        GetClientRect (DialogHandle, &cr);
+        FillRect ((HDC)wParam, &cr, dlgWhite);
+        return 1;
+    }
+    case WM_CTLCOLORBTN:
+    case WM_CTLCOLORSTATIC:
+        return (LRESULT)dlgWhite;
+    }
+    return 0;
+}
+
+//_________________________________________________________________________
+
+bool            runFile (void)
+{
+    return argFileName && argFileName->sLength;
+}
+
+//_________________________________________________________________________
+void    WinInitSet (void)
+{
+    GlobalStartup();
+
+    ReadInTemplateFiles     ();
+    ReadModelTemplates      ();
+    ReadGeneticCodes        ();
+
+    {
+        SYSTEM_INFO      sysInfo;
+        GetSystemInfo (&sysInfo);
+
+        systemCPUCount = sysInfo.dwNumberOfProcessors;
+
+        if (systemCPUCount < 1) {
+            systemCPUCount = 1;
+        }
+
+        _String procType;
+
+        switch (sysInfo.wProcessorArchitecture) {
+        case PROCESSOR_ARCHITECTURE_INTEL:
+            procType = " Intel x86 architecture ";
+            break;
+        case PROCESSOR_ARCHITECTURE_IA64:
+            procType = " Intel 64-bit IA (Itanium) architecture ";
+            break;
+
+        case PROCESSOR_ARCHITECTURE_AMD64:
+            procType = " AMD64 architecture ";
+            break;
+        }
+
+        if (systemCPUCount == 1) {
+            procType = _String ("One ") & procType & " processor detected\n";
+            StringToConsole (procType);
+        } else {
+            procType = _String ('\n') & _String ((long)systemCPUCount) & procType & " processors detected.\n You can change the number of processors utilized by HyPhy via the HyPhy settings dialog.\n";
+            StringToConsole (procType);
+        }
+    }
+
+    StringToConsole (hyphyCiteString);
+
+    if (availablePostProcessors.lLength) {
+        resultsMenu = CreatePopupMenu();
+        if (!resultsMenu) {
+            return;
+        }
+
+        for (long counter=0; counter<availablePostProcessors.countitems(); counter++) {
+            _String * postItem = (_String*)(*(_List*)availablePostProcessors(counter))(0);
+            if (postItem->Equal(&menuSeparator)) {
+                InsertMenu (resultsMenu,-1,MF_BYPOSITION|MF_SEPARATOR,0,(LPSTR)0);
+            } else {
+                InsertMenu (resultsMenu,-1,MF_BYPOSITION,1000+counter,(LPSTR)postItem->getStr());
+            }
+        }
+
+        HMENU               sMenu = GetSubMenu (GetMenu((HWND)hyphyConsoleWindow->GetOSWindowData()),2);
+        ModifyMenu          (sMenu,6,MF_BYPOSITION|MF_POPUP,(UINT)resultsMenu,"&Results");
+        EnableMenuItem      (sMenu,6,MF_BYPOSITION|MF_GRAYED);
+        recentFilesMenu  = CreatePopupMenu();
+        checkPointer (recentFilesMenu);
+        InsertMenu (recentFilesMenu,-1,MF_BYPOSITION,1999,"&Clear Menu");
+        InsertMenu (recentFilesMenu,-1,MF_BYPOSITION|MF_SEPARATOR,0,(LPSTR)0);
+        ModifyMenu (GetSubMenu(GetSubMenu (GetMenu((HWND)hyphyConsoleWindow->GetOSWindowData()),0),1),4,MF_BYPOSITION|MF_POPUP,(UINT)recentFilesMenu,"Open &Recent");
+        DrawMenuBar((HWND)hyphyConsoleWindow->GetOSWindowData());
+    }
+
+}
+
+//__________________________________________________________________________________
+
+void    LoadHYPHYResources (void)
+{
+    tablePDMenuIcon  = LoadBitmap (GetModuleHandle(NULL),MAKEINTRESOURCE(4020));
+    pickUpCursor     = LoadCursor (GetModuleHandle(NULL),MAKEINTRESOURCE(128));
+    dropOffCursor    = LoadCursor (GetModuleHandle(NULL),MAKEINTRESOURCE(129));
+    hSizeCursor      = LoadCursor (GetModuleHandle(NULL),MAKEINTRESOURCE(132));
+
+    redButtonIcon    = LoadBitmap (GetModuleHandle(NULL),MAKEINTRESOURCE(4000));
+    yellowButtonIcon = LoadBitmap (GetModuleHandle(NULL),MAKEINTRESOURCE(4001));
+    greenButtonIcon  = LoadBitmap (GetModuleHandle(NULL),MAKEINTRESOURCE(4002));
+    orangeButtonIcon = LoadBitmap (GetModuleHandle(NULL),MAKEINTRESOURCE(4003));
+
+
+    otherDC         = CreateCompatibleDC (NULL);
+    oDCBM           = CreateCompatibleBitmap (otherDC,1,1);
+    DeleteObject    (SelectObject (otherDC, oDCBM));
+}
+
+//__________________________________________________________________
+
+VOID CALLBACK GlobalQueueTimer (HWND , UINT , UINT_PTR idEvent, DWORD )
+{
+    if (idEvent == GLOBAL_QUEUE_TIMER) {
+        if (GlobalGUIEventQueue.lLength) {
+            HandleGlobalQueueEvent ();
+        }
+        if (updateTimer) {
+            SendMessage ((HWND)hyphyConsoleWindow->GetOSWindowData(), UPDATE_TIMER, 0, 0);
+        }
+    }
+}
+
+
+//_________________________________________________________________________
+bool displayFirstDialog (long& choice)
+{
+    long res = DialogBoxParam(ProgramInstance, MAKEINTRESOURCE(107), (HWND)hyphyConsoleWindow->GetOSWindowData(),  startupBoxHandlerFunction, nil);
+    choice = res%5;
+    return !(res/5);
+}
+
+//_________________________________________________________________________
+
+int MessageLoop         (bool peek, bool moreThanOne)
+{
+    MSG msg;
+    int loopMore = peek?PeekMessage(&msg, NULL, 0, 0, PM_REMOVE):GetMessage (&msg, NULL, 0, 0);
+    while (loopMore) {
+        _HYWindow* me = nil;
+        HWND       daWindow = msg.hwnd;
+        long f = windowPtrs.Find((long)daWindow);
+
+        if (f<0) {
+            daWindow = GetParent (msg.hwnd);
+            f = windowPtrs.Find ((long)daWindow);
+        }
+
+        if (f>=0) {
+            me = (_HYWindow*)(windowObjectRefs.lData[f]);
+            if ( me->menuKeys!=NULL && TranslateAccelerator (daWindow, me->menuKeys, &msg) && moreThanOne) {
+                loopMore = peek?PeekMessage(&msg, NULL, 0, 0, PM_REMOVE):GetMessage (&msg, NULL, 0, 0);
+                continue;
+            }
+
+        }
+        TranslateMessage(&msg);
+        DispatchMessage(&msg);
+
+        if (hyphyExiting) {
+            return 0;
+        }
+        if (moreThanOne) {
+            loopMore = peek?PeekMessage(&msg, NULL, 0, 0, PM_REMOVE):GetMessage (&msg, NULL, 0, 0);
+        } else {
+            return msg.wParam;
+        }
+    }
+    return msg.wParam ;
+}
+
+//_________________________________________________________________________
+
+void     WinErrorBox (_String& errText, bool warn)
+{
+    if (warn) {
+        errText = errText & " Current Task has been terminated. Would you like to see the remaining error messages, if there are any?";
+        int retVal = MessageBox(hyphyConsoleWindow?(HWND)hyphyConsoleWindow->GetOSWindowData():nil,errText.getStr(), AppName, MB_TASKMODAL | MB_ICONWARNING | MB_YESNO);
+        if (retVal==IDNO) {
+            skipWarningMessages = true;
+        }
+    } else {
+        MessageBox(hyphyConsoleWindow?(HWND)hyphyConsoleWindow->GetOSWindowData():nil,errText.getStr(), AppName, MB_TASKMODAL | MB_ICONERROR);
+    }
+}
+
+//_________________________________________________________________________
+BOOL CALLBACK aboutBoxHandlerFunction (HWND DialogHandle, UINT iMsg, WPARAM wParam, LPARAM lParam)
+{
+    long k;
+    static _List  theStrings;
+    static long   currentTopPosition = -1, currentFirstLine = 0, currentDrawnLines;
+    static bool   splash = false;
+
+    //static _String theText;
+    static  HFONT plainFont,boldFont;
+    switch (iMsg) {
+    case WM_COMMAND: {
+        switch (HIWORD (wParam)) {
+        case BN_CLICKED: {
+            if (LOWORD(wParam)==1) { // selection
+                EndDialog (DialogHandle,0);
+                return 1;
+            }
+            break;
+        }
+        }
+        break;
+    }
+    case WM_CLOSE:
+    case WM_DESTROY: {
+        //if (currentTopPosition!=-1)
+        KillTimer (DialogHandle,5);
+        EndDialog (DialogHandle,-1);
+        DeleteObject (plainFont);
+        DeleteObject (boldFont);
+        return 1;
+    }
+    case WM_PAINT: {
+        PAINTSTRUCT      thePS;
+        HWND theBox = GetDlgItem (DialogHandle,129);
+        HDC theContext = BeginPaint (theBox,&thePS);
+        RECT bRC;
+        SIZE stringSize;
+        GetClientRect (theBox,&bRC);
+        bool paintLast = false;
+
+        long v = bRC.bottom-currentTopPosition, h = (bRC.left+bRC.right)/2;
+        SetTextAlign (theContext,TA_NOUPDATECP |TA_TOP |TA_CENTER);
+        k = currentFirstLine;
+        SetTextColor (theContext, GetSysColor (COLOR_WINDOWTEXT));
+        SetBkMode (theContext, TRANSPARENT);
+        //SetBkColor (theContext, GetSysColor (COLOR_WINDOW));
+        if (currentTopPosition == -1) {
+            v = 1;
+//              FillRect (theContext, &bRC, (HBRUSH)GetStockObject(WHITE_BRUSH));
+            while((v<bRC.bottom)&&(k<theStrings.lLength)) {
+                _String * thisLine = (_String*)theStrings.lData[k];
+                GetTextExtentPoint32(theContext,thisLine->sData, thisLine->sLength,&stringSize);
+                if (thisLine->sData[0]=='_') {
+                    SelectObject (theContext, boldFont);
+                    TextOut(theContext,h,v,thisLine->sData+1, thisLine->sLength-1);
+                } else {
+                    SelectObject (theContext, plainFont);
+                    TextOut(theContext,h,v,thisLine->sData, thisLine->sLength);
+                }
+                v+=stringSize.cy+1;
+                k++;
+            }
+        } else {
+//              if (currentTopPosition == 15)
+//                  FillRect (theContext, &bRC, (HBRUSH)GetStockObject(WHITE_BRUSH));
+
+            if (currentFirstLine<theStrings.lLength) {
+                ScrollWindow (theBox,0,-1,NULL,NULL);
+                _String * thisLine;;
+                while((v<bRC.bottom)&&(k<currentFirstLine+currentDrawnLines)&&(k<theStrings.lLength)) {
+                    thisLine = (_String*)theStrings.lData[k];
+                    GetTextExtentPoint32(theContext,thisLine->sData, thisLine->sLength,&stringSize);
+                    v+=stringSize.cy+1;
+                    k++;
+                }
+                if (k<theStrings.lLength) {
+                    thisLine = (_String*)theStrings.lData[k];
+                    if (v+stringSize.cy+2<bRC.bottom) { // enough room for a new line
+                        currentDrawnLines++;
+                        if (thisLine->sData[0]=='_') {
+                            SelectObject (theContext, boldFont);
+                            TextOut(theContext,h,v,thisLine->sData+1, thisLine->sLength-1);
+                        } else {
+                            SelectObject (theContext, plainFont);
+                            TextOut(theContext,h,v,thisLine->sData, thisLine->sLength);
+                        }
+                    }
+                } else {
+                    currentFirstLine++;
+                }
+            } else {
+                currentTopPosition = -1;
+            }
+        }
+
+        EndPaint (theBox,&thePS);
+        return 0;
+
+    }
+    case WM_TIMER: {
+        //color -= 5;
+        if (currentTopPosition == -1) {
+            //KillTimer (DialogHandle,5);
+            currentTopPosition = 15;
+            currentFirstLine = 0;
+            currentDrawnLines = 1;
+            if (splash) {
+                SendMessage (DialogHandle, WM_CLOSE, 0, 0);
+            }
+            return 1;
+        }
+        currentTopPosition++;
+        HWND theBox = GetDlgItem (DialogHandle,129);
+        RECT bRC;
+        GetClientRect (theBox,&bRC);
+        InvalidateRect (theBox, &bRC, FALSE);
+        SendMessage (DialogHandle, WM_PAINT,0,0);
+        return 1;
+
+    }
+    case WM_INITDIALOG: {
+        char    buffer[256];
+        _String theText;
+        theStrings.Clear();
+        splash = (bool)lParam;
+
+        plainFont = CreateFont (8,0,0,0,400,FALSE,FALSE,FALSE,ANSI_CHARSET,OUT_DEFAULT_PRECIS,
+                                CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH|FF_SWISS,"MS Sans Serif"),
+                    boldFont =  CreateFont (8,0,0,0,700,FALSE,TRUE,FALSE,ANSI_CHARSET,OUT_DEFAULT_PRECIS,
+                                            CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH|FF_SWISS,"MS Sans Serif");
+
+
+        theStrings && " ";
+        theText = GetVersionString();
+        theStrings && & theText;
+        k = 1;
+        while (LoadString(ProgramInstance,k,buffer,255)) {
+            if (splash&& buffer[0]==' ') {
+                break;
+            }
+            theStrings && buffer;
+            k++;
+        }
+
+        theStrings && " ";
+        theStrings && "_System Tidbits";
+        /*long      cpuCount = 1;
+
+        PROCESSOR_POWER_INFORMATION * cpuInfo = new PROCESSOR_POWER_INFORMATION[cpuCount];
+        checkPointer (cpuInfo);
+
+        CallNtPowerInformation (ProcessorInformation,NULL,0,cpuInfo,sizeof (PROCESSOR_POWER_INFORMATION)*cpuCount);
+
+        theText = _String ("CPU Count: ") & cpuCount;
+        theStrings && & theText;
+
+        theText = _String ("CPU Speed: ") & (long) cpuInfo[0].CurrentMHz & " MHz";
+        theStrings && & theText;*/
+
+        MEMORYSTATUS        memStat;
+        GlobalMemoryStatus (&memStat);
+
+        theText = _String("Total Memory:")&_String ((long)(memStat.dwTotalPhys>>10)) & " K";
+        theStrings && & theText;
+
+        theText = _String("Available Memory:")&_String ((long)(memStat.dwAvailPhys>>10)) & " K";
+        theStrings && & theText;
+
+        theText = MatrixExpCounter ();
+        if (theText.sLength) {
+            theStrings&&(&theText);
+        }
+        k += 5;
+        currentTopPosition = 15;
+        currentFirstLine = 0;
+        currentDrawnLines = 1;
+        SetTimer (DialogHandle, 5, splash?5:35, (TIMERPROC)aboutBoxHandlerFunction);
+        centerDialogBox (DialogHandle);
+        return 1;
+        break;
+    }
+    }
+    return 0;
+}
+
+//_________________________________________________________________________
+void  displayAbout (bool splash)
+{
+    DialogBoxParam(  ProgramInstance, MAKEINTRESOURCE(103), (HWND)hyphyConsoleWindow->GetOSWindowData(),  aboutBoxHandlerFunction, (LPARAM)splash);
+}
+
+//_________________________________________________________________________
+void  centerDialogBox (HWND hwndDlg)
+{
+    HWND hwndOwner;
+    RECT rc, rcOwner,rcDlg;
+    if ((hwndOwner = GetParent(hwndDlg)) == NULL) {
+        hwndOwner = GetDesktopWindow();
+    }
+
+    GetWindowRect(hwndOwner, &rcOwner);
+    GetWindowRect(hwndDlg, &rcDlg);
+    CopyRect(&rc, &rcOwner);
+    OffsetRect(&rcDlg, -rcDlg.left, -rcDlg.top);
+    OffsetRect(&rc, -rc.left, -rc.top);
+    OffsetRect(&rc, -rcDlg.right, -rcDlg.bottom);
+    SetWindowPos(hwndDlg,HWND_TOP,
+                 rcOwner.left + (rc.right / 2),
+                 rcOwner.top + (rc.bottom / 2),
+                 0, 0,
+                 SWP_NOSIZE);
+}
+
+//_________________________________________________________________________
+
+bool    handleGUI (bool )
+{
+    Sleep (10);
+    MessageLoop ();
+    return true;
+}
+
+//_________________________________________________________________________
+
+int WINAPI WinMain (HINSTANCE thisInstance, HINSTANCE , LPSTR , int)
+{
+    WNDCLASSEX  windowClass;
+
+    HICON       progIcon        = LoadIcon(thisInstance, MAKEINTRESOURCE(101));
+    HCURSOR     arrowCursor     = LoadCursor(NULL, IDC_ARROW);
+
+    ProgramInstance           = thisInstance;
+    windowClass.cbSize        = sizeof(windowClass);/* Number of bytes in structure  */
+    windowClass.cbClsExtra    = 0;              /* No extra class data            */
+    windowClass.cbWndExtra    = 0;              /* No extra window data           */
+    windowClass.hInstance     = thisInstance;   /* Current instance is the owner  */
+    windowClass.hIcon         = progIcon;       /* Set icon                       */
+    windowClass.hCursor       = arrowCursor;    /* Set cursor                     */
+    windowClass.hIconSm       = progIcon;       /* Set icon                       */
+    windowClass.lpszClassName = WinName;
+    windowClass.lpszMenuName  = nil;
+    windowClass.lpfnWndProc   = HYWndProc;
+    windowClass.hbrBackground = NULL;
+    windowClass.style         = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS ;
+    windowClass.hCursor       = nil;
+
+    bool regStatus            = RegisterClassEx(&windowClass);
+
+    windowClass.lpszClassName = AppName;
+    windowClass.lpszMenuName  = AppName;
+
+    if (regStatus) {
+        regStatus = RegisterClassEx(&windowClass);
+    }
+
+    if (!regStatus) {
+        LPVOID lpMsgBuf;
+        _String errMsg = _String ("Failed to register a window class: ") &windowClass.lpszClassName & " with error: ";
+
+        if (!FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
+                            NULL,GetLastError(),MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR) &lpMsgBuf,0,NULL )) {
+            errMsg = errMsg&"unknown system error";
+        } else {
+            errMsg = errMsg & (char*)lpMsgBuf;
+        }
+        MessageBox(nil, errMsg.getStr() , GetVersionString(), MB_OK | MB_ICONEXCLAMATION);
+    }
+
+
+    char    dlgName[] = "HPGUIDLG";
+
+    windowClass.lpszMenuName  = empty.sData;
+    windowClass.lpszClassName = dlgName;
+    windowClass.style        |= CS_NOCLOSE;
+    windowClass.lpszMenuName  = nil;
+    windowClass.lpfnWndProc   = HYDlgProc;
+    windowClass.hbrBackground = (HBRUSH)(COLOR_MENU+1);
+    windowClass.cbWndExtra    = DLGWINDOWEXTRA;
+
+    if (!RegisterClassEx(&windowClass)) {
+        _String errMsg = _String ("Failed to register a window class: ") &dlgName& " with error " & (long)GetLastError();
+        MessageBox(nil, errMsg.getStr() , GetVersionString(), MB_OK | MB_ICONEXCLAMATION);
+    }
+
+    HBITMAP        sbPatternBitMap = LoadBitmap (ProgramInstance,MAKEINTRESOURCE(3000));
+    windowStatusBarBrush = CreatePatternBrush (sbPatternBitMap);
+
+    if (!LoadLibrary ("Riched20.dll")) {
+        MessageBox(nil, "HyPhy reqires Rich Edit 2.0 or better (included in Riched20.dll)", GetVersionString(), MB_OK | MB_ICONEXCLAMATION);
+        exit (0);
+    }
+
+    //char curWd[4096];
+
+    //_getcwd (curWd,4096);
+    
+    HMODULE hModule = GetModuleHandleW(NULL);
+    CHAR path[MAX_PATH];
+    GetModuleFileName(hModule, path, MAX_PATH);
+
+    _String baseDir = path;
+    
+    baseDir = baseDir.Cut(0,baseDir.FindBackwards ("\\",0,-1));
+    
+    if (baseDir.sData[baseDir.sLength-1]!='\\') {
+        baseDir = baseDir & '\\';
+    }
+
+    baseDirectory = baseDir;
+    libDirectory  = baseDir;
+    pathNames&&     &baseDir;
+
+    statusBarPlain = CreateFont (9,0,0,0,400,FALSE,FALSE,FALSE,ANSI_CHARSET,OUT_DEFAULT_PRECIS,
+                                 CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH|FF_SWISS,"MS Sans Serif");
+    statusBarBold =  CreateFont (9,0,0,0,700,FALSE,FALSE,FALSE,ANSI_CHARSET,OUT_DEFAULT_PRECIS,
+                                 CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH|FF_SWISS,"MS Sans Serif");
+
+    InitCommonControls();
+    INITCOMMONCONTROLSEX icces;
+    icces.dwICC = ICC_WIN95_CLASSES;
+    icces.dwSize = sizeof (INITCOMMONCONTROLSEX);
+    InitCommonControlsEx(&icces);
+
+
+    LoadHYPHYResources ();
+
+    hyphyConsoleWindow = new _HYConsoleWindow (consoleWindowTitle);
+
+    UINT_PTR gqTimer = SetTimer ((HWND)hyphyConsoleWindow->GetOSWindowData(), GLOBAL_QUEUE_TIMER , 100,(TIMERPROC) GlobalQueueTimer);
+    WinInitSet();
+    ReadChartProcessors ();
+    ReadPreferences     ();
+    MoveConsoleWindow   (consolePositionRectangle);
+    hyphyConsoleWindow->BringToFront();
+    
+
+    if (showDialogAtStartup) {
+        long                  choice = 0;
+
+        showDialogAtStartup = displayFirstDialog (choice);
+
+        if (!showDialogAtStartup) {
+            _String wStr ("You can later change startup dialog settings in 'Preferences'");
+            ProblemReport (wStr);
+        }
+
+        if (choice == 2) {
+            RunStandardAnalyses();
+        } else {
+            _String dL (baseDirectory);
+            if (choice == 3) {
+                dL = dL & "data\\";
+                OpenDataFile (&dL);
+            } else if (choice == 4) {
+                dL = dL & "Saves\\";
+                if (OpenBatchFile (true,&dL)) {
+                    ExecuteBatchFile ();
+                }
+            }
+        }
+
+        SetShowDialogAtStartup (showDialogAtStartup);
+    }
+
+
+    while (!hyphyExiting) {
+        //if (runFile())
+        //  ExecuteBatchFile ();
+        //else
+        MessageLoop(false);
+    }
+
+    // -- end main -- //
+
+    WritePreferences    ();
+    GlobalShutdown      ();
+    KillTimer ((HWND)hyphyConsoleWindow->GetOSWindowData(),gqTimer);
+    //exit(0);
+    DeleteObject (statusBarPlain);
+    DeleteObject (statusBarBold);
+    DeleteDC (offScreenContext);
+    return   0;
+
+}
diff --git a/src/new/HYNetInterface.cpp b/src/new/HYNetInterface.cpp
new file mode 100644
index 0000000..d45fa09
--- /dev/null
+++ b/src/new/HYNetInterface.cpp
@@ -0,0 +1,375 @@
+/*
+
+    This is a file which does NN interfacing with HBL model structures.
+
+    September 2003, Sergei L Kosakovsky Pond
+
+*/
+
+#include "HYNetInterface.h"
+#include "baseobj.h"
+#include "parser.h"
+
+_String   ModelTrainNNFlag          ("TRAIN_MODEL_NN"),
+          ModelLoadNNFlag             ("LOAD_MODEL_NN"),
+          ModelNNTrainingSteps        ("MODEL_NN_TRAINING_STEPS"),
+          ModelNNVerificationSample   ("MODEL_NN_VERIFICATION_STEPS"),
+          ModelNNPrecision            ("MODEL_NN_PRECISION"),
+          ModelNNLoops                ("MODEL_MAX_LOOPS"),
+          ModelNNHiddenNodes      ("MODEL_NN_HIDDEN_NODES"),
+          ModelNNFile             ("MODEL_NN_FILE_PATH"),
+          ModelNNLearningRate     ("MODEL_NN_LEARNING_RATE"),
+          ModelNNPersistenceRate  ("MODEL_NN_PERSISTENCE_RATE");
+
+
+
+/*______________________________________________________________________*/
+
+void         TrainModelNN   (_String* model, _String* matrix)
+{
+    _String         errMsg;
+
+    long            modelIdx = modelNames.Find(model);
+
+    _Parameter      verbI;
+
+    checkParameter (VerbosityLevelString, verbI, 0.0);
+
+    char            buffer [128];
+
+    if (modelIdx < 0) {
+        errMsg = *model & " did not refer to an existring model";
+    } else {
+        _Variable*    boundsMatrix              =   FetchVar  (LocateVarByName (*matrix));
+
+        if (boundsMatrix && (boundsMatrix->ObjectClass() == MATRIX)) {
+            _Matrix  *    bmatrix               =   (_Matrix*)      boundsMatrix->GetValue ();
+
+            if (bmatrix->IsAStringMatrix() && (bmatrix->GetVDim () == 3)) {
+                _Variable*    modelMatrix           =   LocateVar       (modelMatrixIndices.lData[modelIdx]);
+                _SimpleList   modelVariableList;
+                {
+                    _AVLList mvla (&modelVariableList);
+                    modelMatrix->ScanForVariables       (mvla, true);
+                    mvla.ReorderList();
+                }
+
+                if (bmatrix->GetHDim () == modelVariableList.lLength) {
+                    // now map model variables to bounds matrix
+                    _SimpleList          variableMap;
+                    _String             *myName;
+
+                    for (long k = 0; k < modelVariableList.lLength; k++) {
+                        myName = ((_FString*)bmatrix->GetFormula(k,0)->Compute())->theString;
+                        long      vID    = LocateVarByName (*myName);
+
+                        if (vID < 0) {
+                            break;
+                        }
+
+                        vID = variableNames.GetXtra (vID);
+                        vID = modelVariableList.Find(vID);
+
+                        if (vID < 0) {
+                            break;
+                        }
+
+                        variableMap << vID;
+                    }
+
+                    if (variableMap.lLength == modelVariableList.lLength) {
+                        _Matrix     vBounds (variableMap.lLength,2, false, true);
+
+                        long        k2 = 0;
+
+                        for (; k2 < variableMap.lLength; k2++) {
+                            _Parameter lb = ((_FString*)bmatrix->GetFormula(k2,1)->Compute())->theString->toNum(),
+                                       ub = ((_FString*)bmatrix->GetFormula(k2,2)->Compute())->theString->toNum();
+
+                            if ( ub>lb || k2) {
+                                vBounds.Store (k2,0,lb);
+                                vBounds.Store (k2,1,ub);
+                                if (ub<=lb && vBounds (k2-1,0) <= vBounds (k2-1,1) && (!CheckEqual(vBounds (k2-1,0),0.0) || !CheckEqual(vBounds (k2-1,1),1.0))) {
+                                    break;
+                                }
+                            }
+
+                        }
+                        if (k2 == modelVariableList.lLength) {
+                            // set up the sampling now
+                            _String             fName       = ProcessLiteralArgument (&ModelNNFile,nil);
+                            FILE*               nnFile      = doFileOpen (fName.getStr(), "w");
+                            if (nnFile) {
+                                _Matrix*            modelMatrix = (_Matrix*) LocateVar(modelMatrixIndices.lData[modelIdx])->GetValue();
+
+                                _Parameter          mainSteps,
+                                                    checkSteps,
+                                                    errorTerm,
+                                                    loopMax,
+                                                    hiddenNodes,
+                                                    absError,
+                                                    nn1,
+                                                    nn2;
+
+                                long                fullDimension = modelMatrix->GetHDim() * modelMatrix->GetVDim();
+
+
+                                checkParameter      (ModelNNTrainingSteps,      mainSteps,      10000.0);
+                                checkParameter      (ModelNNVerificationSample, checkSteps,     500.0);
+                                checkParameter      (ModelNNPrecision,          errorTerm,      0.01);
+                                checkParameter      (ModelNNTrainingSteps,      loopMax,        10);
+                                checkParameter      (ModelNNHiddenNodes,        hiddenNodes,    5);
+                                checkParameter      (ModelNNLearningRate,       nn1,            .3);
+                                checkParameter      (ModelNNPersistenceRate,    nn2,            .1);
+
+                                Net**               matrixNet = new Net* [fullDimension] ;
+
+                                for (long i = 0; i < fullDimension; i++) {
+                                    checkPointer (matrixNet [i] = new Net (variableMap.lLength,(long)hiddenNodes,1,errorTerm,nn1,nn2,100,200,true));
+                                    //matrixNet[i]->verbose = true;
+                                }
+
+                                checkPointer        (matrixNet);
+
+                                _List               tIn,
+                                                    tOut;
+
+                                FILE*               varSamples = doFileOpen ("variableSamples.out", "w");
+
+                                fprintf (varSamples, "%s" ,LocateVar(modelVariableList.lData[0])->GetName()->getStr());
+                                for (long vc = 1; vc < modelVariableList.lLength; vc++) {
+                                    fprintf (varSamples, ",%s" ,LocateVar(modelVariableList.lData[variableMap.lData[vc]])->GetName()->getStr());
+                                }
+
+                                fprintf (varSamples, "\n");
+
+                                for (long itCount = 0; itCount < loopMax; itCount ++) {
+                                    if (verbI > 5) {
+                                        snprintf (buffer, sizeof(buffer), "\nNeural Network Pass %ld. Building a training set...\n", itCount);
+                                        BufferToConsole (buffer);
+                                    }
+
+                                    while   (tIn.countitems() < mainSteps) {
+                                        NNMatrixSampler     (0, vBounds, modelVariableList, variableMap, modelMatrix, tIn, tOut);
+                                    }
+
+                                    _Matrix             inData (mainSteps, variableMap.lLength, false, true);
+                                    _Parameter          *md = inData.theData;
+
+                                    for (long matrixC = 0; matrixC < mainSteps; matrixC++) {
+                                        _Parameter  *   ed = ((_Matrix*)tIn (matrixC))->theData;
+                                        fprintf (varSamples, "\n%g",*ed);
+                                        *md = *ed;
+                                        ed++;
+                                        md++;
+                                        for (long entryC = 1; entryC < variableMap.lLength; entryC++, ed++, md++) {
+                                            *md = *ed;
+                                            fprintf (varSamples, ",%g", *md);
+                                        }
+                                    }
+
+                                    tIn.Clear();
+
+                                    if (verbI > 5) {
+                                        BufferToConsole ( "Done Building Training Set. Training...\n");
+                                    }
+
+                                    long lastDone = 0;
+
+                                    for (long cellCount = 0; cellCount < fullDimension; cellCount++) {
+                                        Net* thisCell = matrixNet[cellCount];
+                                        _Matrix outVector (mainSteps, 1, false, true);
+
+                                        for (long oc = 0; oc < mainSteps; oc++) {
+                                            outVector.theData[oc] = ((_Matrix*)tOut(oc))->theData[cellCount];
+                                        }
+
+                                        thisCell->studyAll (inData.theData, outVector.theData, mainSteps);
+
+                                        long    nowDone = (cellCount+1)*100./fullDimension;
+                                        if (nowDone > lastDone) {
+                                            snprintf (buffer, sizeof(buffer),"%ld%% done\n", lastDone = nowDone);
+                                            BufferToConsole (buffer);
+                                        }
+                                    }
+                                    tOut.Clear();
+
+                                    if (verbI > 5) {
+                                        BufferToConsole ( "Done Training. Resampling...\n");
+                                    }
+
+                                    _PMathObj  tObj = _Constant(0).Time();
+                                    _Parameter time1 = tObj->Value(),
+                                               time2;
+
+                                    while   (tIn.countitems() < checkSteps) {
+                                        NNMatrixSampler     (0, vBounds, modelVariableList, variableMap, modelMatrix, tIn, tOut);
+                                    }
+
+                                    absError = 0.0;
+
+                                    DeleteObject (tObj);
+                                    tObj = _Constant(0).Time();
+                                    time2 = tObj->Value();
+
+                                    if (verbI > 5) {
+                                        snprintf (buffer, sizeof(buffer),"Done Resampling in %g seconds. Computing Error...\n", time2-time1);
+                                        BufferToConsole (buffer);
+                                    }
+
+                                    _Parameter  maxValT,
+                                                maxValE;
+
+                                    for (long verCount = 0; verCount < checkSteps; verCount++) {
+                                        _Parameter*  inData     = ((_Matrix*)tIn(verCount))->theData,
+                                                     *  outData  = ((_Matrix*)tOut(verCount))->theData;
+
+                                        for (long cellCount = 0; cellCount < fullDimension; cellCount++) {
+                                            Net         *thisCell = matrixNet[cellCount];
+
+                                            _Parameter estVal     = thisCell->eval(inData)[0],
+                                                       trueVal      = outData[cellCount],
+                                                       localError;
+
+                                            localError = estVal-trueVal;
+
+                                            if (localError < 0) {
+                                                localError = -localError;
+                                            }
+
+                                            if (absError < localError) {
+                                                maxValT  = trueVal;
+                                                maxValE  = estVal;
+                                                absError = localError;
+                                            }
+                                        }
+                                    }
+
+                                    DeleteObject (tObj);
+                                    tObj = _Constant(0).Time();
+                                    time1 = tObj->Value();
+                                    DeleteObject (tObj);
+
+
+                                    if (verbI > 5) {
+                                        snprintf (buffer, sizeof(buffer), "Done Error Checking in %g seconds. Got max abs error %g on the pair %g %g\n", time1-time2, absError, maxValT, maxValE);
+                                        BufferToConsole (buffer);
+                                    }
+                                    if (absError <= errorTerm) {
+                                        break;
+                                    }
+                                }
+
+                                if (absError > errorTerm) {
+                                    ReportWarning (_String("Couldn't achive desired precision in TrainModelNN. Achieved error of ") & absError);
+                                }
+                                fclose  (varSamples);
+                                fprintf (nnFile,"{{\n\"%s\"", LocateVar(modelVariableList.lData[0])->GetName()->getStr());
+                                _Matrix newBounds (modelVariableList.lLength, 2, false, true);
+                                if (vBounds(0,0)>vBounds(0,1)) {
+                                    newBounds.Store (variableMap.lData[0],0,0.);
+                                    newBounds.Store (variableMap.lData[0],1,1.);
+                                } else {
+                                    newBounds.Store (variableMap.lData[0],0,vBounds(0,0));
+                                    newBounds.Store (variableMap.lData[0],1,vBounds(0,1));
+                                }
+                                for (long varCounter = 1; varCounter < modelVariableList.lLength; varCounter ++) {
+                                    fprintf (nnFile,",\n\"%s\"", LocateVar(modelVariableList.lData[varCounter])->GetName()->getStr());
+                                    if (vBounds(varCounter,0)>vBounds(varCounter,1)) {
+                                        newBounds.Store (variableMap.lData[varCounter],0,0.);
+                                        newBounds.Store (variableMap.lData[varCounter],1,1.);
+                                    } else {
+                                        newBounds.Store (variableMap.lData[varCounter],0,vBounds(varCounter,0));
+                                        newBounds.Store (variableMap.lData[varCounter],1,vBounds(varCounter,1));
+                                    }
+                                }
+
+                                fprintf (nnFile,"\n}}\n");
+                                newBounds.toFileStr (nnFile);
+
+
+                                for (long i2 = 0; i2 < fullDimension; i2++) {
+                                    matrixNet[i2]->save(nnFile);
+                                    delete matrixNet [i2];
+                                }
+
+                                fclose (nnFile);
+                                delete              matrixNet;
+                            } else {
+                                errMsg = _String ("Failed to open ") & fName & " for writing";
+                            }
+                        } else {
+                            errMsg = _String ("Invalid variable bounds in row ") & (k2+1) & " of the bounds matrix";
+                        }
+                    } else {
+                        errMsg = *myName & " was not one of the model parameters";
+                    }
+
+                } else {
+                    errMsg = *matrix & " must be a have the same number of rows as the number of model parameters";
+                }
+
+            } else {
+                errMsg = *matrix & " must be a string matrix with 3 columns";
+            }
+        } else {
+            errMsg = *matrix & " was not the identifier of a valid matrix variable";
+        }
+
+
+
+    }
+
+    if (errMsg.sLength) {
+        errMsg = errMsg & _String(" in call to TrainModelNN.");
+        WarnError (errMsg);
+    }
+}
+
+/*______________________________________________________________________*/
+
+void        NNMatrixSampler (long index, _Matrix& bnds, _SimpleList& varList, _SimpleList& reidx, _Matrix* modelMatrix, _List& trainIn, _List& trainOut)
+{
+    _Parameter lb = bnds (index,0),
+               ub = bnds (index,1);
+
+    if (ub<=lb)
+        // freq parameter
+    {
+        ub = 1.;
+        lb = 0.;
+        for (long k = index-1; k>=0; k--) {
+            ub -= LocateVar (varList.lData[reidx.lData[k]])->Value();
+            if (bnds (k,1) > bnds (k,0)) {
+                break;
+            }
+        }
+
+        if ((index == varList.lLength - 1)||(bnds (index+1,1) > bnds (index+1,0))) {
+            lb = ub;
+        }
+    }
+
+    _Constant cv (lb + genrand_real2 () * (ub-lb));
+    LocateVar (varList.lData[reidx.lData[index]])->SetValue (&cv);
+
+    if (index == varList.lLength - 1) {
+        _Matrix*  inMx = new _Matrix (index+1,1,false,true);
+
+        checkPointer (inMx);
+
+        for (long m = 0; m <= index; m++) {
+            inMx->Store (m,0,LocateVar (varList.lData[reidx.lData[m]])->Value());
+        }
+
+        trainIn << inMx;
+
+        DeleteObject (inMx);
+
+        _Matrix  *em = ((_Matrix*)modelMatrix->ComputeNumeric())->Exponentiate();
+        trainOut <<  em;
+        DeleteObject (em);
+    } else {
+        NNMatrixSampler (index+1, bnds, varList, reidx, modelMatrix, trainIn, trainOut);
+    }
+}
diff --git a/src/new/Net.cpp b/src/new/Net.cpp
new file mode 100644
index 0000000..c22e8e7
--- /dev/null
+++ b/src/new/Net.cpp
@@ -0,0 +1,606 @@
+// copyright Oliver Serang, 2003
+// this document may not be duplicated, not redistributed without
+// written consent of the author
+
+#include "SerangNet.h"
+#include "parser.h"
+//#include <iostream.h>
+
+Net::Net(int innum, int hiddennum, int outnum, _Parameter eps, _Parameter c, _Parameter m,int d, int t, bool v)
+{
+    init(innum, hiddennum, outnum, eps);
+    coef=c;
+    mom=m;
+    timeout=t;
+    verbose=v;
+    density=d;
+}
+
+Net::Net(int innum, int hiddennum, int outnum, _Parameter eps)
+{
+    init(innum, hiddennum, outnum, eps);
+    coef=.3;
+    mom=.1;
+    timeout=600;
+    verbose=false;
+    density=100;
+}
+
+void Net::init(int innum, int hiddennum, int outnum, _Parameter eps)
+{
+//  cout << innum << " " << hiddennum << " " << outnum << endl;
+    inNum=innum;
+    hiddenNum=hiddennum;
+    outNum=outnum;
+    in=new Node[innum+1];
+    hidden=new Node[hiddennum+1];
+    out= new _Parameter[outnum];
+    temp= new _Parameter[outnum];
+    int k, i;
+    for (k=0; k<=innum; k++) {
+        in[k].weights=new _Parameter[hiddennum];
+        in[k].lastDelta=new _Parameter[hiddennum];
+        for (i=0; i<hiddennum; i++) {
+            in[k].weights[i]=randReal(.1);
+            in[k].lastDelta[i]=0;
+//          in[k].weights[i]=.1;
+        }
+    }
+    for (k=0; k<=hiddennum; k++) {
+        hidden[k].weights= new _Parameter[outnum];
+        hidden[k].lastDelta=new _Parameter[outnum];
+        for (i=0; i<outnum; i++) {
+            hidden[k].weights[i]=randReal(.1);
+            hidden[k].lastDelta[i]=0;
+//          hidden[k].weights[i]=.1;
+        }
+    }
+    hidden[hiddenNum].value=1;
+    in[inNum].value=1;
+    LR=learningRate= .1;
+    epsilon= eps;
+    momentum=.01;
+//  cout << "INIT" << endl;
+}
+
+void Net::randomize()
+{
+    //if (verbose)
+    //cout << "RANDING" << endl;
+    int k,i;
+    for (k=0; k<=inNum; k++) {
+        for (i=0; i<hiddenNum; i++) {
+            in[k].weights[i]=randReal(.1);
+            in[k].lastDelta[i]=0;
+        }
+    }
+    for (k=0; k<=hiddenNum; k++) {
+        for (i=0; i<outNum; i++) {
+            hidden[k].weights[i]=randReal(.1);
+            hidden[k].lastDelta[i]=0;
+        }
+    }
+}
+
+void Net::destroy()
+{
+    int k;
+    for (k=0; k<=inNum; k++) {
+        delete in[k].weights;
+        delete in[k].lastDelta;
+    }
+    delete in;
+    for (k=0; k<hiddenNum; k++) {
+        delete hidden[k].weights;
+        delete hidden[k].lastDelta;
+    }
+    delete hidden;
+    delete out;
+    delete temp;
+}
+
+Net::~Net()
+{
+    destroy();
+}
+
+_Parameter Net::dOdW1(int cell, int w, int outN)
+{
+    // changed to make linear output
+    _Parameter dOdH= hidden[w].weights[outN];
+    _Parameter dHdW= (1-hidden[w].value)*hidden[w].value*in[cell].value;
+    return dOdH*dHdW;
+}
+
+void Net::adjust()
+{
+    learningRate=1*learningRate;
+}
+
+_Parameter Net::dOdW2(int cell, int)
+{
+    // changed to make linear ouput
+    return hidden[cell].value;
+}
+
+/*void Net::save(ofstream & fout)
+{
+    fout << endl;
+    fout << inNum << " " << hiddenNum << " " << outNum << endl;
+    int k, j;
+    for (k=0; k<=inNum; k++)
+    {
+        for (j=0; j<hiddenNum; j++)
+        {
+            fout << in[k].weights[j] << " ";
+        }
+    }
+    for (k=0; k<=hiddenNum; k++)
+    {
+        for (j=0; j<outNum; j++)
+        {
+            fout << hidden[k].weights[j] << " ";
+        }
+    }
+    fout << endl;
+}*/
+
+void Net::save(FILE* f)
+{
+    fprintf (f, "\n{{%d,%d,%d}}\n{{",inNum, hiddenNum, outNum);
+    int k, j;
+    for (k=0; k<=inNum; k++)
+        for (j=0; j<hiddenNum; j++)
+            if (k+j == 0) {
+                fprintf (f,"%g",in[k].weights[j]);
+            } else {
+                fprintf (f,",%g",in[k].weights[j]);
+            }
+
+    for (k=0; k<=hiddenNum; k++)
+        for (j=0; j<outNum; j++) {
+            fprintf (f,",%g",hidden[k].weights[j]);
+        }
+
+    fprintf (f,"\n}}");
+}
+
+void Net::load(FILE*)
+{
+    /*inNum       = dim[0];
+    hiddenNum = dim[0];
+    outNum    = (*dim)(2,0);
+
+    hidden=new Node[hiddenNum+1];
+    out= new _Parameter[outNum];
+    temp= new _Parameter[outNum];
+    int k, j, i;
+    for (k=0; k<=inNum; k++)
+    {
+        in[k].weights=new _Parameter[hiddenNum];
+        in[k].lastDelta=new _Parameter[hiddenNum];
+        for (i=0; i<hiddenNum; i++)
+        {
+            in[k].lastDelta[i]=0;
+        }
+    }
+    for (k=0; k<=hiddenNum; k++)
+    {
+        hidden[k].weights= new _Parameter[outNum];
+        hidden[k].lastDelta=new _Parameter[outNum];
+        for (i=0; i<outNum; i++)
+        {
+            hidden[k].lastDelta[i]=0;
+        }
+    }
+
+    hidden[hiddenNum].value=1;
+    in[inNum].value=1;
+    LR=learningRate= .25;
+    momentum=.25;
+
+    long cntr = 0;
+    for (k=0; k<=inNum; k++)
+    {
+        for (j=0; j<hiddenNum; j++)
+        {
+            in[k].weights[j] = (*coeff)(0,cntr++);
+        }
+    }
+    for (k=0; k<=hiddenNum; k++)
+    {
+        for (j=0; j<outNum; j++)
+        {
+            hidden[k].weights[j] = (*coeff)(0,cntr++);
+        }
+    }*/
+}
+
+/*void Net::load(ifstream & fin)
+{
+    destroy();
+    fin >> inNum >> hiddenNum >> outNum;
+    in=new Node[inNum+1];
+    hidden=new Node[hiddenNum+1];
+    out= new _Parameter[outNum];
+    temp= new _Parameter[outNum];
+    int k, j, i;
+    for (k=0; k<=inNum; k++)
+    {
+        in[k].weights=new _Parameter[hiddenNum];
+        in[k].lastDelta=new _Parameter[hiddenNum];
+        for (i=0; i<hiddenNum; i++)
+        {
+            in[k].lastDelta[i]=0;
+        }
+    }
+    for (k=0; k<=hiddenNum; k++)
+    {
+        hidden[k].weights= new _Parameter[outNum];
+        hidden[k].lastDelta=new _Parameter[outNum];
+        for (i=0; i<outNum; i++)
+        {
+            hidden[k].lastDelta[i]=0;
+        }
+    }
+    hidden[hiddenNum].value=1;
+    in[inNum].value=1;
+    LR=learningRate= .25;
+    momentum=.25;
+
+
+    for (k=0; k<=inNum; k++)
+    {
+        for (j=0; j<hiddenNum; j++)
+        {
+            fin >> in[k].weights[j];
+        }
+    }
+    for (k=0; k<=hiddenNum; k++)
+    {
+        for (j=0; j<outNum; j++)
+        {
+            fin >> hidden[k].weights[j];
+        }
+    }
+}*/
+
+void Net::learn(_Parameter * input, _Parameter * output)
+{
+    int k/*, j*/;
+
+    if (outNum == 1) {
+        eval1(input);
+    } else {
+        eval(input);
+    }
+
+
+    for (k=0; k<outNum; k++) {
+        temp[k]=2.*(out[k]-output[k]);
+    }
+
+    _Parameter *p1 = output,
+                *p2 = out,
+                 *p3 = out+outNum,
+                  *p4 = temp;
+
+    for (; p2!=p3; p1++,p2++,p4++) {
+        *p4 = 2.*(*p2-*p1);
+    }
+
+
+    if (outNum == 1)
+        for (k=0; k<=inNum; k++) {
+            _Parameter* t1   = in[k].weights,
+                        *   t2   = in[k].lastDelta,
+                            iv   = in[k].value,
+                            * t5   = t1,
+                              * t5s  = t5+hiddenNum,
+                                * t6   = t2;
+
+            Node  *hn= hidden;
+
+            for (; t5!=t5s; t5++,t6++,hn++) {
+                // changed
+                _Parameter  delta = hn->value;
+
+                delta   = (1.-delta)*delta*iv* * hn->weights
+                          *learningRate * *temp +momentum* *t6;
+                *t5 -=  delta;
+                *t6 =   delta;
+            }
+        }
+    else
+        for (k=0; k<=inNum; k++) {
+            _Parameter* t1  = in[k].weights,
+                        *   t2  = in[k].lastDelta,
+                            * t3  = temp,
+                              * t3s = temp+outNum,
+                                iv  = in[k].value;
+
+            long  outN = 0;
+
+            for (; t3!=t3s; t3++, outN++) {
+                _Parameter*  t5  = t1,
+                             *  t5s = t5+hiddenNum,
+                                *  t6  = t2;
+
+                Node  *  hn  = hidden;
+
+                for (; t5!=t5s; t5++,t6++,hn++) {
+                    // changed
+                    _Parameter  delta = hn->value;
+
+                    delta   = (1.-delta)*delta*iv*hn->weights[outN]
+                              *learningRate * *t3 +momentum* *t6;
+                    *t5 -=  delta;
+                    *t6 =   delta;
+                }
+            }
+        }
+
+
+    /*for (k=0; k<=inNum; k++)
+    {
+        for (j=0; j<outNum; j++)
+        {
+            for (int w=0; w<hiddenNum; w++)
+            {
+            // changed
+                _Parameter delta=learningRate*dOdW1(k,w,j)*temp[j]+momentum*in[k].lastDelta[w];
+                in[k].weights[w]-=delta;
+                in[k].lastDelta[w]=delta;
+            }
+        }
+    }*/
+
+    Node   *hn  = hidden,
+            *hns = hidden+hiddenNum+1;
+
+    if (outNum > 1) {
+        for (; hn!=hns; hn++) {
+            _Parameter *x1  = temp,
+                        *x1s = temp+outNum,
+                         *x2    = hn->weights,
+                          *x3  = hn->lastDelta,
+                           hcv  = hn->value;
+
+            for (; x1!=x1s; x1++,x2++,x3++) {
+                _Parameter delta    =   learningRate* hcv * *x1 +momentum* *x3;
+                *x2 -= delta;
+                *x3  = delta;
+            }
+        }
+    } else {
+        for (; hn!=hns; hn++) {
+            _Parameter delta    = learningRate* hn->value * *temp +momentum* *hn->lastDelta;
+            *hn->weights   -= delta;
+            *hn->lastDelta  = delta;
+        }
+    }
+
+
+
+    /*for (k=0; k<=hiddenNum; k++)
+    {
+        for (j=0; j<outNum; j++)
+        {
+            _Parameter delta=learningRate*dOdW2(k,j)*temp[j]+momentum*hidden[k].lastDelta[j];
+            hidden[k].weights[j]-=delta;
+            hidden[k].lastDelta[j]=delta;
+        }
+    }*/
+}
+
+void Net::studyAll(_Parameter**input, _Parameter**output, int samp)
+{
+    _Parameter  max = 1.; // to make sure we enter for loop
+
+    int     rep;
+
+    for (rep=0 ; max>epsilon && rep<timeout; rep++) {
+        max=-1;
+        for (int count=0; count<density; count++) {
+            for (int k=0; k<samp; k++) {
+                learn(input[k],output[k]);
+            }
+        }
+
+        for (int k=0; k<samp; k++) {
+            _Parameter err=error();
+            if (err>max) {
+                max=err;
+            }
+            learn(input[k],output[k]);
+        }
+
+        learningRate=sigmaF(2*(max-.45))*coef;
+        momentum=learningRate*mom;
+    }
+
+    /*if (verbose)
+    {
+        if (rep>=timeout)
+            cout << "DIVERGE" << endl;
+        cout << "Cycles taken: " << rep << endl << "Largest Error: " << max << endl;
+    }*/
+
+    cycles=rep;
+//  cout << endl;
+}
+
+_Parameter Net::studyAll(_Parameter*input, _Parameter*output, int samp)
+{
+    _Parameter  max = 1.; // to make sure we enter for loop
+
+    int     rep;
+
+    for (rep=0 ; max>epsilon && rep<timeout; rep++) {
+        max=-1;
+        for (int count=0; count<density; count++) {
+            for (int k=0; k<samp; k++) {
+                learn(input + k*inNum ,output + k*outNum);
+            }
+        }
+        for (int k=0; k<samp; k++) {
+            _Parameter err=error();
+            if (err>max) {
+                max = err;
+            }
+            learn(input + k*inNum ,output + k*outNum);
+        }
+
+        learningRate=sigmaF(2*(max-.45))*coef;
+        momentum=learningRate*mom;
+    }
+
+    /*if (verbose)
+    {
+        if (rep>=timeout)
+            cout << "DIVERGE" << endl;
+        cout << "Cycles taken: " << rep << endl << "Largest Error: " << max << endl;
+    }*/
+
+    cycles=rep;
+    return max;
+//  cout << endl;
+}
+
+_Parameter Net::sum(_Parameter * x, int p)
+{
+    _Parameter total=0;
+    for (int k=0; k<p; k++) {
+        total+=x[k];
+    }
+    //cout << total << endl;
+    return total;
+}
+
+_Parameter Net::error()
+{
+    _Parameter tempTotal=0;
+    for (int y=0; y<outNum; y++) {
+        tempTotal+=fabs(temp[y] * .5);
+    }
+    // this is the Mean Squared Error
+    return tempTotal;
+}
+
+bool Net::accurate(_Parameter **, _Parameter**output, int samp)
+{
+    for (int k=0; k<samp; k++) {
+        if (!within(out,output[k])) {
+            return false;
+        }
+    }
+    return true;
+}
+
+bool Net::within(const _Parameter * pred, const _Parameter * act) const
+{
+    for (int k=0; k<outNum; k++) {
+        if (fabs(pred[k]-act[k])>epsilon) {
+            return false;
+        }
+    }
+    return true;
+}
+
+const _Parameter * Net::eval(_Parameter * input)
+{
+    int     k,
+            i;
+
+    /*for (k=0; k<inNum; k++)
+    {
+        in[k].value=input[k];
+    }*/
+
+    _Parameter* in1 = input, *in2 = input+inNum;
+    Node*   np  = in;
+
+    while (in1<in2) {
+        np->value = *in1;
+        in1++;
+        np++;
+    }
+
+    for (k=0; k<hiddenNum; k++) {
+        _Parameter total = 0.;
+        for (i=0; i<=inNum; i++) {
+            total+=in[i].value*in[i].weights[k];
+        }
+        hidden[k].value= sigmaF(total);
+    }
+
+    for (k=0; k<outNum; k++) {
+        _Parameter total = 0.;
+        for (i=0; i<=hiddenNum; i++) {
+            total+=hidden[i].value*hidden[i].weights[k];
+        }
+        out[k]= total;
+    }
+    return out;
+}
+
+const _Parameter * Net::eval1(_Parameter * input)
+{
+    int     k,
+            i;
+
+    _Parameter* in1 = input,
+                *in2 = input+inNum,
+                 temp [100]; // hack for serial access
+
+    Node*   np  = in;
+
+    while (in1<in2) {
+        np->value = *in1;
+        in1++;
+        np++;
+    }
+
+    np = in;
+    Node * nps = in+inNum+1;
+
+    in2 = temp+hiddenNum;
+
+    for (in1 = temp; in1 < in2; in1++) {
+        *in1 = 0.0;
+    }
+
+    for (; np<nps; np++) {
+        _Parameter iv  = np->value,
+                   *w1  = np->weights;
+
+        for (in1 = temp; in1<in2; in1++, w1++) {
+            *in1 += iv * *w1;
+        }
+    }
+
+    for (k=0; k<hiddenNum; k++) {
+        hidden[k].value = sigmaF (temp[k]);
+    }
+
+    /*for (k=0; k<hiddenNum; k++)
+    {
+        _Parameter total = 0.;
+        for (i=0; i<=inNum; i++)
+        {
+            total+=in[i].value*in[i].weights[k];
+        }
+        hidden[k].value= sigmaF(total);
+    }*/
+
+    {
+        _Parameter total = 0.;
+        for (i=0; i<=hiddenNum; i++) {
+            total+=hidden[i].value**hidden[i].weights;
+        }
+        out[0]= total;
+    }
+
+    return out;
+}
+
diff --git a/src/new/bayesgraph.cpp b/src/new/bayesgraph.cpp
new file mode 100644
index 0000000..3440320
--- /dev/null
+++ b/src/new/bayesgraph.cpp
@@ -0,0 +1,2658 @@
+/*
+ 
+ HyPhy - Hypothesis Testing Using Phylogenies.
+ 
+ Copyright (C) 1997-now
+ Core Developers:
+ Sergei L Kosakovsky Pond (spond at ucsd.edu)
+ Art FY Poon    (apoon at cfenet.ubc.ca)
+ Steven Weaver (sweaver at ucsd.edu)
+ 
+ Module Developers:
+ Lance Hepler (nlhepler at gmail.com)
+ Martin Smith (martin.audacis at gmail.com)
+ 
+ Significant contributions from:
+ Spencer V Muse (muse at stat.ncsu.edu)
+ Simon DW Frost (sdf22 at cam.ac.uk)
+ 
+ Permission is hereby granted, free of charge, to any person obtaining a
+ copy of this software and associated documentation files (the
+ "Software"), to deal in the Software without restriction, including
+ without limitation the rights to use, copy, modify, merge, publish,
+ distribute, sublicense, and/or sell copies of the Software, and to
+ permit persons to whom the Software is furnished to do so, subject to
+ the following conditions:
+ 
+ The above copyright notice and this permission notice shall be included
+ in all copies or substantial portions of the Software.
+ 
+ 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.
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ 
+ */
+
+
+#include "bayesgraph.h"
+
+#ifdef __HYPHYQT__
+    #include "hyphymain.h"
+#endif
+
+#if defined __MAC__ || defined __WINDOZE__ || defined __HYPHY_GTK__
+    #include "HYConsoleWindow.h"
+    #include "HYDialogs.h"
+
+#endif
+
+extern  _Parameter  lnGamma (_Parameter);
+
+
+_String     _HYBgm_NODE_INDEX   ("NodeID"),
+            _HYBgm_NODETYPE       ("NodeType"),
+            _HYBgm_NUM_LEVELS ("NumLevels"),
+            _HYBgm_MAX_PARENT ("MaxParents"),
+            _HYBgm_PRIOR_SIZE ("PriorSize"),
+            _HYBgm_PRIOR_MEAN ("PriorMean"),      /* for continuous (Gaussian) nodes */
+            _HYBgm_PRIOR_PRECISION    ("PriorPrecision"),
+            _HYBgm_PRIOR_SCALE    ("PriorScale"),
+
+            /*SLKP 20070926; add string constants for progress report updates */
+            _HYBgm_STATUS_LINE_MCMC           ("Running Bgm MCMC"),
+            _HYBgm_STATUS_LINE_MCMC_DONE  ("Finished Bgm MCMC"),
+            _HYBgm_STATUS_LINE_CACHE      ("Caching Bgm scores"),
+            _HYBgm_STATUS_LINE_CACHE_DONE ("Done caching Bgm scores"),
+            /*SLKP*/
+
+            _HYBgm_METHOD_KEY ("BGM_OPTIMIZATION_METHOD"),
+            _HYBgm_MPI_CACHING ("USE_MPI_CACHING"),
+
+            _HYBgm_K2_RESTARTS ("BGM_K2_RESTARTS"),
+            _HYBgm_K2_RANDOMIZE ("BGM_K2_RANDOMIZE"),
+
+            _HYBgm_MCMC_NCHAINS       ("BGM_MCMC_NCHAINS"),
+            _HYBgm_MCMC_TEMP      ("BGM_MCMC_TEMPERATURE"),
+            _HYBgm_MCMC_MAXSTEPS  ("BGM_MCMC_MAXSTEPS"),
+            _HYBgm_MCMC_BURNIN        ("BGM_MCMC_BURNIN"),
+            _HYBgm_MCMC_SAMPLES       ("BGM_MCMC_SAMPLES"),
+
+            _HYBgm_MCMC_PROBSWAP  ("BGM_MCMC_PROBSWAP"),
+            _HYBgm_MCMC_MAXFAILS  ("BGM_MCMC_MAXFAILS"),
+
+            _HYBgm_IMPUTE_MAXSTEPS    ("BGM_IMPUTE_MAXSTEPS"),
+            _HYBgm_IMPUTE_BURNIN  ("BGM_IMPUTE_BURNIN"),
+            _HYBgm_IMPUTE_SAMPLES ("BGM_IMPUTE_SAMPLES"),
+
+            _HYBgm_CONTINUOUS_MISSING_VALUE ("BGM_CONTINUOUS_MISSING_VALUE");
+
+
+//__________________________________________________________________________________________________________
+#ifdef      __UNIX__
+
+void        ConsoleBGMStatus (_String, _Parameter, _String * fileName = nil);
+
+
+void        ConsoleBGMStatus (_String statusLine, _Parameter percentDone, _String * fileName)
+{
+    FILE           *outFile = fileName?doFileOpen (fileName->sData,"w"):nil;
+    _String        reportLine (statusLine);
+
+
+    if (percentDone >= 0.0) {
+        reportLine = reportLine & ". " & percentDone & "% done.";
+    }
+
+    if (outFile) {
+        fprintf (outFile,"%s", reportLine.sData);
+    } else if (verbosityLevel == 1) {
+        printf ("\033\015 %s", reportLine.sData);
+    }
+
+    if (percentDone < -1.5) {
+        printf ("\033\015 ");
+        setvbuf (stdout,nil,_IOLBF,1024);
+    } else if (percentDone < -0.5) {
+        setvbuf (stdout,nil, _IONBF,1);
+    }
+    if (outFile) {
+        fclose (outFile);
+    }
+
+}
+
+#endif
+
+
+
+//__________________________________________________________________________________________________________
+long        integerPower (long base, long exponent)
+{
+    //  Rapid computation of an integer power.
+    long    result = 1,
+            mask   = 1L<<(sizeof(long)*8-2); // left shift to left-most position of binary sequence for long integer
+    // e.g. 100...0 (30 zeroes for signed long)
+
+    while ((exponent & mask) == 0) {
+        mask >>= 1;    // bitwise AND, right-shift mask until overlaps with first '1'
+    }
+
+    while (mask) {
+        result *= result;
+        if (exponent & mask) {
+            result = result * base;
+        }
+        mask >>= 1;
+    }
+    return result;
+}
+
+
+
+
+
+//__________________________________________________________________________________________________________
+_Parameter      LogSumExpo (_GrowingVector * log_values)
+{
+    //  Computes the sum of a vector whose values are stored as log-transforms,
+    //  such that exponentiating the vector entries would result in numerical underflow.
+
+    long        size            = log_values->GetUsed();
+    _Parameter  sum_exponents   = 0.;
+
+
+    // handle some trivial cases
+    if (size == 0) {
+        return 0.;    // log(exp(0)) = log(1) = 0
+    } else if (size == 1) {
+        return (*log_values)(0,0);    // log(exp(log(x)))
+    }
+
+
+    // find the largest (least negative) log-value
+    _Parameter      max_log  = (*log_values) (0, 0),
+                    this_log;
+
+    for (long val = 1; val < size; val++) {
+        this_log = (*log_values) (val, 0);
+
+        if (this_log > max_log) {
+            max_log = this_log;
+        }
+    }
+
+
+    // go back through log values and increment by max log value
+    //      This will cause some underflow for the smallest values, but we can
+    //  use this approximation to handle very large ranges of values.
+    //  NOTE: subtracting a negative value.
+    for (long val = 0; val < size; val++) {
+        sum_exponents += exp( (*log_values) (val, 0) - max_log );
+    }
+
+    return (log(sum_exponents) + max_log);
+}
+
+
+
+
+//__________________________________________________________________________________________________________
+//__________________________________________________________________________________________________________
+//__________________________________________________________________________________________________________
+_BayesianGraphicalModel::_BayesianGraphicalModel (_AssociativeList * nodes)
+{
+    _String             errorMessage;
+    _AssociativeList *  this_avl;
+    long                global_max_parents  = 0;
+    _Constant *         avl_val;
+
+    node_names.Clear();
+
+
+    // the fundamental defining characteristic of _BayesianGraphicalModel objects
+    num_nodes           = nodes->avl.countitems();
+
+
+    // allocate space to class matrices
+    CreateMatrix (&theStructure, num_nodes, num_nodes, false, true, false);
+
+    CreateMatrix (&prior_sample_size, num_nodes, 1, false, true, false);
+    CreateMatrix (&prior_mean, num_nodes, 1, false, true, false);
+    CreateMatrix (&prior_precision, num_nodes, 1, false, true, false);
+    CreateMatrix (&prior_scale, num_nodes, 1, false, true, false);
+
+    CreateMatrix (&constraint_graph, num_nodes, num_nodes, false, true, false);
+
+
+    // allocate space for _SimpleList objects
+    node_type.Populate (num_nodes, 0, 0);
+    max_parents.Populate (num_nodes, 0, 0);
+    num_levels.Populate(num_nodes, 0, 0);
+    has_missing.Populate(num_nodes, 0, 0);
+
+
+    for (long node = 0; node < num_nodes; node++) {
+        this_avl = (_AssociativeList *) (nodes->GetByKey (node, ASSOCIATIVE_LIST));
+
+        // AVL should include following items:  "NodeID"        - variable name
+        //                                      "NodeType"      - 0 = discrete, 1 = continuous (Gaussian)
+        //                                      "NLevels"       - (discrete only)
+        //                                      "MaxParents"    - maximum number of parents
+        //                                      "PriorSize"     - hyperparameter for multinomial-Dirichlet
+        //                                                      - also used for degrees of freedom hyperparameter for Gaussian node
+        //                                      "PriorMean"     - hyperparameter for Gaussian node
+        //                                      "PriorPrecision" - hyperparameter for Gaussian node
+        //                                      "PriorScale"    - fourth hyperparameter for Gaussian node
+
+        _FString *name = (_FString*)this_avl->GetByKey (_HYBgm_NODE_INDEX, STRING);
+        if (!name){
+            WarnError("Invalid node name (expected a string) passed to a BGM constructor");
+            return;
+        }
+        
+        node_names.AppendNewInstance(new _String (*name->theString));  // append a pointer to _String duplicate
+
+        // DEBUGGING
+        /* wuz: ReportWarning (_String("node_name[") & node & "]=" & (_String *)node_names.lData[node]);
+         20111210 SLKP : _String (_String*) contstructor will actually assume that the argument is 
+                       : 'unencumbered' i.e. not a member of _Lists etc
+                       : this function call will create a stack copy of node_names.lData[node]
+                       : print it to messages.log and then kill the dynamic portion of the object (sData)
+                       : this will create all kinds of havoc downstream
+         */
+        // bug fix:
+        ReportWarning (_String("node_name[") & node & "]=" & *((_String *)node_names.lData[node]));
+        
+
+        // node type (0 = discrete, 1 = continuous)
+        if ((avl_val = (_Constant *) (this_avl->GetByKey (_HYBgm_NODETYPE, NUMBER)))) {
+            node_type.lData[node] = (long)(avl_val->Value());
+            if (node_type.lData[node] < 0 || node_type.lData[node] > 2) {
+                errorMessage = _String("Unsupported NodeType ") & node_type.lData[node] & " for node " & node;
+                break;
+            }
+        } else {
+            errorMessage = _String ("Missing NodeType in associative array for node ") & node;
+            break;
+        }
+
+
+        // number of levels (discrete nodes)
+        if ((avl_val = (_Constant *) (this_avl->GetByKey (_HYBgm_NUM_LEVELS, NUMBER)))) {
+            num_levels.lData[node] = (long)(avl_val->Value());
+
+            if (num_levels.lData[node] <= 1) {
+                errorMessage = _String("NLevels must be greater than 1, received ") & num_levels.lData[node] & " for node " & node;
+                break;
+            }
+        } else {
+            if (!avl_val && node_type.lData[node] == 0) {
+                errorMessage = _String ("Missing NumLevels in associative array for node ") & node;
+                break;
+            }
+        }
+
+
+        // max parents
+        if ((avl_val = (_Constant *) (this_avl->GetByKey (_HYBgm_MAX_PARENT, NUMBER)))) {
+            max_parents.lData[node] = (long)(avl_val->Value());
+
+            if (max_parents.lData[node] > global_max_parents) {
+                global_max_parents = max_parents.lData[node];
+            }
+
+            if (max_parents.lData[node] <= 0) {
+                errorMessage = _String ("MaxParents must be greater than zero, received ") & max_parents.lData[node] & " for node " & node;
+                break;
+            }
+
+            if (max_parents.lData[node] >= num_nodes) {
+                errorMessage = _String ("MaxParents cannot equal or exceed the number of nodes in the network, see node ") & node;
+                break;
+            }
+        } else {
+            errorMessage = _String ("Missing MaxParents in associative array for node ") & node;
+            break;
+        }
+
+
+        // prior sample size
+        if ((avl_val = (_Constant *) (this_avl->GetByKey (_HYBgm_PRIOR_SIZE, NUMBER)))) {
+            prior_sample_size.Store (node, 0, (_Parameter) (avl_val->Value()));
+
+            if (prior_sample_size(node,0) < 0) {
+                errorMessage = _String ("PriorSampleSize must be at least zero, received ") & prior_sample_size(node,0) & " for node " & node;
+                break;
+            }
+        } else {
+            errorMessage = _String ("Missing PriorSize in associative array for node ") & node;
+            break;
+        }
+
+
+        // prior mean (Gaussian)
+        if ((avl_val = (_Constant *) (this_avl->GetByKey (_HYBgm_PRIOR_MEAN, NUMBER)))) {
+            prior_mean.Store (node, 0, (_Parameter) (avl_val->Value()));
+        } else if (!avl_val && node_type.lData[node] == 1) {
+            errorMessage = _String ("Missing PriorMean in associative array for node ") & node;
+            break;
+        }
+
+
+        // prior precision (Gaussian)
+        if ((avl_val = (_Constant *) (this_avl->GetByKey (_HYBgm_PRIOR_PRECISION, NUMBER)))) {
+            prior_precision.Store (node, 0, (_Parameter) (avl_val->Value()));
+
+            if (avl_val <= 0) {
+                errorMessage = _String ("PriorPrecision must be greater than zero, received ") & prior_precision(node,0) & " for node " & node;
+                break;
+            }
+            // ReportWarning (_String("prior_precision[") & node & "] set to " & prior_precision(node,0) );
+        } else if (!avl_val && node_type.lData[node] == 1) {
+            errorMessage = _String ("Missing PriorPrecision in associative array for node ") & node;
+            break;
+        }
+
+
+        // prior scale (Gaussian)
+        if ((avl_val = (_Constant *) (this_avl->GetByKey (_HYBgm_PRIOR_SCALE, NUMBER)))) {
+            prior_scale.Store (node, 0, (_Parameter) (avl_val->Value()));
+
+            if (avl_val <= 0) {
+                errorMessage = _String ("PriorScale must be greater than zero, received ") & prior_scale(node,0) & " for node " & node;
+                break;
+            }
+        } else if (!avl_val && node_type.lData[node] == 1) {
+            errorMessage = _String ("Missing PriorScale in associative array for node ") & node;
+            break;
+        }
+    }
+
+
+    if (errorMessage.sLength) {
+        WarnError (errorMessage);
+    }
+
+
+    // allocate node score cache
+    _List   emptyList (global_max_parents + 1);
+
+    for (long node = 0; node < num_nodes; node++) {
+        node_score_cache && (&emptyList);	// appends a dynamic copy of _List object to start
+    }
+
+    scores_cached = FALSE;
+
+    ReportWarning (_String ("Constructed BayesianGraphicalModel with ") & num_nodes & " nodes.");
+}
+
+
+
+//__________________________________________________________________________________________________________
+_BayesianGraphicalModel::~_BayesianGraphicalModel (void)
+{
+    /* destructor */
+}
+
+
+
+
+//__________________________________________________________________________________________________________
+bool _BayesianGraphicalModel::SetDataMatrix (_Matrix * data)
+{
+    /* ------------------------------------------------------------------------------------------------
+        SetDataMatrix()
+            Takes a matrix pointer passed from HBL and assign it to class member variable.
+            Checks that number of levels for discrete nodes agrees with value set at construction.
+            Checks for missing values in each column and annotate the [has_missing] list accordingly.
+            Missing values for discrete nodes are flagged by any negative integer.
+            Missing values for continuous nodes are flagged by a value set by the user; otherwise,
+            it defaults to a fun value I picked arbitrarily.
+       ------------------------------------------------------------------------------------------------ */
+
+
+    _SimpleList data_nlevels;
+
+	/* reset missing value indicators to 0, in case we 
+		are replacing a data matrix with missing values */
+	for (long node = 0; node < num_nodes; node++) {
+		has_missing.lData[node] = 0;
+	}
+	
+    /* check for user assignment of continuous missing value indicator */
+    checkParameter (_HYBgm_CONTINUOUS_MISSING_VALUE, continuous_missing_value, -666.0);
+	ReportWarning (_String ("Entered SetDataMatrix() with missing CG flag: ") & continuous_missing_value & " and node types" & (_String *) node_type.toStr());
+	
+    data_nlevels.Populate (num_nodes, 1, 0);
+
+    if (data->GetVDim() == num_nodes) {
+        // if (theData) DeleteObject (theData);
+        // purge duplicate from memory (makeDynamic)
+
+        theData = (_Matrix &) *data;        // duplicate matrix to member variable
+        theData.CheckIfSparseEnough (TRUE);
+
+        scores_cached = FALSE;
+
+
+        for (long nrows = theData.GetHDim(), node = 0; node < num_nodes; node++) {
+            // if discrete node, compute number of levels and missingness
+            if (node_type.lData[node] == 0) {
+                data_nlevels.lData[node] = 1;
+
+                for (long val, row = 0; row < nrows; row++) {
+                    val = theData (row, node);
+
+                    if (val < 0 && has_missing.lData[node] == 0) {
+                        has_missing.lData[node] = 1;
+                        continue;
+                    }
+
+                    if (val + 1 > data_nlevels.lData[node]) {
+                        data_nlevels.lData[node] = data_nlevels.lData[node] + 1;
+                    }
+                }
+
+                if (data_nlevels.lData[node] != num_levels.lData[node]) {
+                    WarnError (_String ("ERROR: Number of levels in data (") & data_nlevels.lData[node] & ") for discrete node "
+                               & node & " is not compatible with node setting (" & num_levels.lData[node]
+                               & ").  Check your data or reset the BayesianGraphicalModel.");
+
+                    return (FALSE);
+                }
+            }
+
+            // continuous
+            else if (node_type.lData[node] == 1) {
+                for (long val, row = 0; row < nrows; row++) {
+					val = theData (row, node);
+                    if (val == continuous_missing_value && has_missing.lData[node] == 0) {
+                        has_missing.lData[node] = 1;
+						ReportWarning (_String("Detected missing continuous value at row ") & row);
+                        break;
+                    }
+                }
+            }
+        }
+
+        ReportWarning (_String ("Set data matrix to:\n") & (_String *)theData.toStr() & "\n" & " and missing values at " & (_String *) has_missing.toStr());
+    } else {
+        WarnError (_String("ERROR: Number of variables in data (") & data->GetVDim() & ") does not match number of nodes in graph (" & num_nodes & ")");
+        return (FALSE);
+    }
+
+
+    // compute node scores and store in cache
+    CacheNodeScores();
+
+
+    return (TRUE);
+}
+
+
+
+bool _BayesianGraphicalModel::SetWeightMatrix (_Matrix * weights)
+{
+    if (weights->GetHDim() == theData.GetHDim() && weights->GetHDim() == num_nodes) {
+        theWeights = (_Matrix &) *weights;
+        ReportWarning(_String("Assigned weight matrix:\n") & (_String *) theWeights.toStr());
+        return TRUE;
+    }
+
+    WarnError (_String("Incompatible matrix dimensions in SetWeightMatrix()."));
+    return FALSE;
+}
+
+
+//__________________________________________________________________________________________________________
+bool _BayesianGraphicalModel::SetConstraints (_Matrix * constraints)
+{
+    /* -----------------------------------------------------------------
+        SetConstraints()
+            Assign pointer to _Matrix object passed from batchlan.cpp
+            A constraint matrix is N x N where N is the number of nodes
+            in the network.
+            1 entry indicates an enforced edge (always in network)
+            -1 entry indicates a banned edge (never in network)
+            0 entry indicates no constraint
+       ----------------------------------------------------------------- */
+    if (constraints->GetHDim() == num_nodes) {
+        constraint_graph = (_Matrix &) (*constraints);
+        ReportWarning (_String("Assigned constraint matrix:\n ") & (_String*) constraint_graph.toStr() );
+        return (TRUE);
+    }
+
+    _String errorMsg ("ERROR: Constraint matrix incompatible dimensions to graph.");
+    WarnError (errorMsg);
+    return (FALSE);
+}
+
+
+
+//__________________________________________________________________________________________________________
+bool _BayesianGraphicalModel::SetStructure (_Matrix * structure)
+{
+    /* -------------------------------------------------------------------
+        SetStructure()
+            Assign pointer to _Matrix object from batchlan:SetParameter()
+            that specificies a network structure.
+            Check the structure against constraint matrix and node
+            ordering if the latter is set.
+            If node order is incompatible, reset the node order.
+       ------------------------------------------------------------------- */
+
+    if (structure->GetHDim() == num_nodes) {
+        // check graph against constraint matrix
+        for (long row = 0; row < num_nodes; row++) {
+            for (long col = 0; col < num_nodes; col++) {
+                if (constraint_graph(row,col) < 0 && (*structure)(row,col) == 1) {
+                    _String errorMsg ("ERROR: Structure contains banned edge: ");
+                    errorMsg = errorMsg & _String (row) & _String ("->") & _String (col);
+                    WarnError (errorMsg);
+                    return (FALSE);
+                }
+
+                if (constraint_graph(row,col) > 0 && (*structure)(row,col) == 0) {
+                    _String errorMsg ("ERROR: Structure lacks enforced edge:");
+                    errorMsg = errorMsg & _String (row) & _String ("->") & _String (col);
+                    WarnError (errorMsg);
+                    return (FALSE);
+                }
+            }
+        }
+
+
+        // is new structure compatible with node order set in HBL?
+        if (node_order_arg.lLength == num_nodes && !GraphObeysOrder (theStructure, node_order_arg)) {
+            // need to reset node_order
+            _SimpleList * templist;
+
+            templist = GetOrderFromGraph (theStructure);
+            node_order_arg = (_SimpleList &) (*templist);
+            DeleteObject (templist);
+
+            ReportWarning (_String ("Structure is incompatible with existing node order, resetting order."));
+        }
+
+        theStructure = (_Matrix &) (*structure);
+        return (TRUE);
+    }
+
+    _String errorMsg ("ERROR: Structure incompatible dimensions to graph.");
+    WarnError (errorMsg);
+    return (FALSE);
+}
+
+
+void _BayesianGraphicalModel::GetStructure (_Matrix * graph)
+{
+    for (long row = 0; row < num_nodes; row++)
+        for (long col = 0; col < num_nodes; col++) {
+            graph->Store (row, col, theStructure(row, col));
+        }
+
+    ReportWarning (_String("GetStructure() copied graph ") & (_String *) graph->toStr());
+}
+
+//__________________________________________________________________________________________________________
+bool _BayesianGraphicalModel::SetNodeOrder (_SimpleList * order)
+{
+    /* -----------------------------------------------------------------
+        SetNodeOrder()
+            Set node ordering to vector argument from HBL SetParameter().
+       ----------------------------------------------------------------- */
+
+    if (order->lLength == num_nodes) {
+        if (GraphObeysOrder (theStructure, (_SimpleList &) *order)) {
+            node_order_arg.Populate(num_nodes, 0, 0);   // reset member variable
+
+            for (long i = 0; i < num_nodes; i++) {
+                node_order_arg.lData[i] = order->lData[i];
+            }
+
+            ReportWarning (_String("BayesianGraphicalModel node order arg set to ") & (_String *) node_order_arg.toStr());
+
+            return (TRUE);
+        } else {
+            _String errorMsg ("ERROR: Node order incompatible with current graph.");
+            WarnError (errorMsg);
+            return (FALSE);
+        }
+    } else {
+        _String errorMsg ("ERROR: Node order argument incorrect length.");
+        WarnError (errorMsg);
+        return (FALSE);
+    }
+}
+
+
+void _BayesianGraphicalModel::GetNodeOrder (_Matrix * receptacle)
+{
+    if (node_order_arg.lLength == num_nodes) {
+        for (long node = 0; node < num_nodes; node++) {
+            receptacle->Store (0, node, node_order_arg.lData[node]);
+        }
+    }
+}
+
+
+//__________________________________________________________________________________________________________
+_Parameter _BayesianGraphicalModel::Compute (void)
+{
+    /* --------------------------------------------------------------
+        Compute()   [POLYMORPHIC]
+            Return posterior probability of [CURRENT] network
+            structure.
+       -------------------------------------------------------------- */
+
+    _Parameter  log_score = 0.;
+
+    for (long node_id = 0; node_id < num_nodes; node_id++) {
+        log_score += node_type.lData[node_id] ? ComputeContinuousScore (node_id) : ComputeDiscreteScore (node_id);
+    }
+
+    return log_score;
+}
+
+
+
+//__________________________________________________________________________________________________________
+_Parameter _BayesianGraphicalModel::Compute (_Matrix & g)
+{
+    /* --------------------------------------------------------------
+        Compute()   [POLYMORPHIC]
+            Return posterior probability of [GIVEN] network
+            structure argument.
+       -------------------------------------------------------------- */
+
+    _Parameter  log_score = 0.;
+
+    for (long node_id = 0; node_id < num_nodes; node_id++) {    // discrete nodes are 0 (FALSE)
+        log_score += node_type.lData[node_id] ? ComputeContinuousScore (node_id, g) : ComputeDiscreteScore (node_id, g);
+    }
+
+    return log_score;
+}
+
+
+
+//__________________________________________________________________________________________________________
+_Parameter  _BayesianGraphicalModel::Compute (_SimpleList & node_order, _List * marginals)
+{
+    /* --------------------------------------------------------------
+        Compute()   [POLYMORPHIC]
+            Return posterior probability of given node order by
+            integrating over all compatible structures.
+            Also return marginal posterior probabilities for edges.
+       -------------------------------------------------------------- */
+
+    _Parameter          log_likel   = 0.;
+    _GrowingVector      *gv1, *gv2;
+
+
+    // reset _GrowingVector objects stored in _List object
+    for (long i = 0; i < num_nodes * num_nodes; i++) {
+        gv1 = (_GrowingVector *) marginals->lData[i];
+        gv1 -> ZeroUsed();
+    }
+
+
+    for (long nodeIndex = 0; nodeIndex < node_order.lLength; nodeIndex++) {
+        long                child_node      = node_order.lData[nodeIndex],
+                            maxp            = max_parents.lData[child_node];
+
+        _List           *   score_lists     = (_List *) node_score_cache.lData[child_node];
+        _Constant       *   orphan_score    = (_Constant *) (score_lists->lData[0]);
+
+
+        gv1 = (_GrowingVector *) marginals->lData[child_node * num_nodes + child_node]; // store denominator in diagonal
+        gv1->ZeroUsed();
+        gv1 -> Store (orphan_score->Value());   // append score - note gv1 does not change within
+
+
+
+        if (maxp > 0) {
+            // all nodes to the right are potential parents, except banned parents!
+            _SimpleList     precedes;
+            for (long parIndex = nodeIndex + 1; parIndex < node_order.lLength; parIndex++) {
+                long    par = node_order.lData[parIndex];
+
+                if (constraint_graph(par, child_node) >= 0) {   // not banned
+                    precedes << par;
+                }
+            }
+
+
+            // handle trivial case of one parent
+            _Matrix *   single_parent_scores    = (_Matrix *) (score_lists->lData[1]);
+
+            for (long i = 0; i < precedes.lLength; i++) {
+                long    par = precedes.lData[i];
+
+                gv1 -> Store ((*single_parent_scores) (par, 0)); // append to denominator
+                gv2 = (_GrowingVector *) marginals->lData[child_node * num_nodes + par]; // update parent-specific numerator
+                gv2 -> Store ((*single_parent_scores) (par, 0));
+            }
+
+
+            // more than one parent requires k-tuples
+            if (maxp > 1) {
+                _SimpleList         indices (precedes.lLength, 0, 1);   // populates list with 0, 1, 2, ..., M-1
+                // where M is the number of eligible parents in [precedes]
+                _NTupleStorage *    family_scores;
+
+                for (long nparents = 2; nparents <= maxp; nparents++) {
+                    _SimpleList     subset,
+                                    auxil;
+
+                    bool            not_finished;
+
+
+                    if (nparents > precedes.lLength) {  // not enough eligible parents to form tuples!
+                        break;
+                    }
+
+
+                    if (indices.NChooseKInit (auxil, subset, nparents, false)) {
+                        _Parameter      tuple_score;
+                        _SimpleList     parents;
+
+                        parents.Populate (nparents, 0, 0);  // allocate memory
+
+                        family_scores = (_NTupleStorage *) (score_lists->lData[nparents]);
+
+
+                        do {
+                            //parents.Clear();
+                            not_finished = indices.NChooseK (auxil, subset);    // cycle through index combinations
+
+
+                            for (long i = 0; i < nparents; i++) {   // convert indices to parent IDs (skipping child)
+                                long    realized = precedes.lData[subset.lData[i]];
+                                if (realized >= child_node) {
+                                    realized--;
+                                }
+                                parents.lData[i] = realized;
+                            }
+                            parents.Sort(TRUE);
+
+                            tuple_score = family_scores -> Retrieve (parents);
+
+                            gv1 -> Store (tuple_score); // append to denominator
+
+                            for (long i = 0; i < nparents; i++) {
+								// update parent combination-specific numerator
+                                gv2 = (_GrowingVector *) marginals->lData[child_node * num_nodes + precedes.lData[subset.lData[i]]];
+                                gv2 -> Store (tuple_score);
+                            }
+                        } while (not_finished);
+                    }
+                }
+            }
+        }
+
+        gv1 -> _Matrix::Store (0, 0, LogSumExpo(gv1));  // replace first entry with sum, i.e. marginal log-likelihood of child node
+        log_likel += (*gv1)(0, 0);
+
+    }
+    // end loop over child nodes
+
+    return log_likel;
+}
+
+
+
+//__________________________________________________________________________________________________________
+_Parameter  _BayesianGraphicalModel::ComputeDiscreteScore (long node_id)
+{
+    _SimpleList     parents;
+
+    for (long par = 0; par < num_nodes; par++) {
+        if (theStructure(par, node_id) == 1 && node_type.lData[par] == 0) {
+            parents << par;
+        }
+    }
+
+    return ComputeDiscreteScore (node_id, parents);
+}
+
+
+//__________________________________________________________________________________________________________
+_Parameter  _BayesianGraphicalModel::ComputeDiscreteScore (long node_id, _Matrix & g)
+{
+    _SimpleList     parents;
+
+    for (long par = 0; par < num_nodes; par++) {
+        if ( g(par, node_id) == 1 && node_type.lData[par] == 0) {
+            parents << par;
+        }
+    }
+
+    return ComputeDiscreteScore (node_id, parents);
+}
+
+
+//__________________________________________________________________________________________________________
+_Parameter  _BayesianGraphicalModel::ComputeDiscreteScore (long node_id, _SimpleList & parents)
+{
+    /* --------------------------------------------------------------------
+        ComputeDiscreteScore()
+            Returns posterior probability of local network structure
+            centered at discrete child node.
+            Only discrete nodes may be parents of a discrete child node.
+       -------------------------------------------------------------------- */
+
+
+    // use cached node scores if available
+    if (scores_cached) {
+        _List *     scores  = (_List *) node_score_cache.lData[node_id];
+
+        if (parents.lLength == 0) {
+            _Constant *     orphan_score = (_Constant *) scores->lData[0];
+            return (_Parameter) orphan_score->Value();
+        } else if (parents.lLength == 1) {
+            _Matrix *   single_parent_scores = (_Matrix *) scores->lData[1];
+            return (_Parameter) (*single_parent_scores) (parents.lData[0], 0);
+        } else {
+            _NTupleStorage *    family_scores   = (_NTupleStorage *) scores->lData[parents.lLength];
+            _SimpleList         nktuple;
+
+            for (long i = 0; i < parents.lLength; i++) {    // map parents back to nk-tuple
+                long    par = parents.lData[i];
+                if (par > node_id) {
+                    par--;
+                }
+                nktuple << par;
+            }
+            return (_Parameter) family_scores->Retrieve (nktuple);  // using nk-tuple
+        }
+    }
+
+
+    //ReportWarning (_String ("Non-cached call of ComputeDiscreteScore with ") & node_id & " <- " & (_String *) parents.toStr());
+
+    // impute score if missing data
+    if (has_missing.lData[node_id]) {
+        return ImputeDiscreteNodeScore (node_id, parents);
+    } else {
+        for (long par = 0; par < parents.lLength; par++) {
+            if (has_missing.lData[parents.lData[par]]) {
+                return ImputeDiscreteNodeScore (node_id, parents);
+            }
+        }
+    }
+
+    _Matrix         n_ijk,
+                    n_ij;       // [i] indexes child nodes,
+    // [j] indexes combinations of values for parents of i-th node,
+    // [k] indexes values of i-th node
+
+    UpdateDirichletHyperparameters (node_id, parents, &n_ij, &n_ijk);
+
+    return ( (prior_sample_size (node_id, 0) == 0) ?
+             K2Score (node_id, n_ij, n_ijk) :
+             BDeScore (node_id, n_ij, n_ijk) );
+}
+
+
+//_______________________________________________________________
+void    _BayesianGraphicalModel::UpdateDirichletHyperparameters (long dnode, _SimpleList &dparents, _Matrix * n_ij, _Matrix * n_ijk)
+{
+    if (node_type.lData[dnode] > 0) {
+        ReportWarning ("ERROR: UpdateDirichletHyperparameters() called on non-discrete node!  That sucks!");
+    }
+
+
+    if (dparents.lLength > 0) {
+        _SimpleList     multipliers ((long)1);
+        long            num_parent_combos   = 1;
+
+        for (long par = 0; par < dparents.lLength; par++) {
+            num_parent_combos *= num_levels.lData[dparents.lData[par]];
+            multipliers << num_parent_combos;
+        }
+
+        CreateMatrix (n_ij, num_parent_combos, 1, false, true, false);
+        CreateMatrix (n_ijk, num_parent_combos, num_levels.lData[dnode], false, true, false);
+
+
+        // initialize matrices with prior hyperparameters (a_ijk) -- if using K2, entries will remain zero
+        for (long j = 0; j < num_parent_combos; j++) {
+            n_ij->Store (j, 0, prior_sample_size(dnode,0) / num_parent_combos);
+
+            for (long k = 0; k < num_levels.lData[dnode]; k++) {
+                n_ijk->Store (j, k, (*n_ij)(j,0) / num_levels.lData[dnode]);
+            }
+        }
+
+
+        // update hyperparameters with data
+        /*
+            What should we do with incomplete cases?  Currently using Gibbs sampling to impute
+                an average node score - should we export one of these samples?
+            For now, just export complete cases - BUT THIS WILL CAUSE PROBLEMS IF NONE OF
+                THE CASES IS COMPLETE! - afyp, 2010/02/25
+         */
+        for (long obs = 0; obs < theData.GetHDim(); obs++) {
+            long    index           = 0,
+                    child_state     = theData(obs, dnode);
+
+            if (child_state < 0) {
+                continue;    /* missing observation */
+            }
+
+            for (long par = 0; par < dparents.lLength; par++) {
+                long    this_parent         = dparents.lData[par],
+                        this_parent_state = theData(obs, this_parent);
+
+                if (this_parent_state < 0) {
+                    index = -1; /* missing observation */
+                    break;
+                }
+                index += this_parent_state * multipliers.lData[par];
+            }
+
+            if (index >= 0) {
+				// this is where we would modify the increment value (1) if we are weighting cases...
+                n_ijk->Store ((long) index, child_state, (*n_ijk)(index, child_state) + 1);
+                n_ij->Store ((long) index, 0, (*n_ij)(index, 0) + 1);
+            }
+        }
+    }
+
+    else {
+        // conditionally independent node
+        CreateMatrix (n_ij, 1, 1, false, true, false);
+        CreateMatrix (n_ijk, 1, num_levels.lData[dnode], false, true, false);
+
+        // prior hyperparameters (uniform distribution)
+        for (long k = 0; k < num_levels.lData[dnode]; k++) {
+            n_ijk->Store(0, k, prior_sample_size(dnode,0) / num_levels.lData[dnode]);
+        }
+
+        // update with data
+        for (long obs = 0; obs < theData.GetHDim(); obs++) {
+            long child_state = theData(obs, dnode);
+
+            if (child_state < 0) {
+                continue;
+            }
+
+			// this is where we would modify the increment value (1) if we are weighting cases...
+            n_ijk->Store (0, child_state, (*n_ijk)(0, child_state) + 1);
+            n_ij->Store (0, 0, (*n_ij)(0,0) + 1);
+        }
+    }
+}
+
+
+
+//___________________________________________________________________________________________
+_Parameter _BayesianGraphicalModel::K2Score (long node_id, _Matrix & n_ij, _Matrix & n_ijk)
+{
+    _Parameter  log_score   = 0.;
+    long        r_i         = num_levels.lData[node_id];
+
+    for (long j = 0; j < n_ij.GetHDim(); j++) {
+        log_score += lnGamma(r_i);  // (r-1)!
+        log_score -= lnGamma(n_ij(j, 0) + r_i); // (N+r-1)!
+
+        for (long k = 0; k < r_i; k++) {
+            log_score += lnGamma(n_ijk(j,k) + 1);   // (N_ijk)!
+        }
+    }
+
+    return log_score;
+}
+
+
+
+//___________________________________________________________________________________________
+_Parameter _BayesianGraphicalModel::BDeScore (long node_id, _Matrix & n_ij, _Matrix & n_ijk)
+{
+    // note that n_ij and n_ijk already contain prior counts, updated by data
+    _Parameter  n_prior_ij      = prior_sample_size (node_id, 0) / n_ij.GetHDim(),
+                n_prior_ijk     = n_prior_ij / num_levels.lData[node_id],
+                log_score        = 0.;
+
+    for (long j = 0; j < n_ij.GetHDim(); j++) {
+        log_score += lnGamma(n_prior_ij) - lnGamma(n_ij(j,0));
+
+        for (long k = 0; k < num_levels.lData[node_id]; k++) {
+            log_score += lnGamma(n_ijk(j,k)) - lnGamma(n_prior_ijk);
+        }
+    }
+
+    return log_score;
+}
+
+
+
+//___________________________________________________________________________________________
+void    _BayesianGraphicalModel::InitMarginalVectors (_List * compute_list)
+{
+    /* ------------------------------------------------------------------------------------
+        InitMarginalVectors()
+            Allocate storage of node and edge marginal posterior probabilities accumulated
+            during order-MCMC.  Off-diagonals correspond to entries of an adjacency matrix
+            (edges), whereas diagonal entries are used to store node marginals.
+       ------------------------------------------------------------------------------------ */
+
+    _GrowingVector * newstore;
+    checkPointer (newstore = new _GrowingVector);
+
+    for (long i = 0; i < num_nodes * num_nodes; i++) {
+        (*compute_list) && newstore;
+    }
+
+    DeleteObject (newstore);
+}
+
+
+
+//___________________________________________________________________________________________
+void    _BayesianGraphicalModel::DumpMarginalVectors (_List * compute_list)
+{
+    for (long i = 0; i < compute_list->lLength; i++) {
+        ((_GrowingVector *) compute_list->lData[i]) -> Clear();
+    }
+
+    DeleteObject (compute_list);
+}
+
+
+
+
+//___________________________________________________________________________________________
+void    _BayesianGraphicalModel::CacheNodeScores (void)
+{
+    /*  -----------------------------------------------------------------------------------
+        CacheNodeScores() loops through nodes in the network and calls compute functions
+        to calculate local network scores given the number and identity of parents for that node.
+
+        The node scores are cached in a custom data structure that comprises a _List object
+        that stores pointers to the following objects:
+
+            0 parents   _Constant       a single float for node score without parents
+            1           _Matrix         a vector where i-th entry holds score with parent i
+            2 or more   _NTupleStorage  a vector indexed by combinadics, i.e., a (n,k) tuple
+                                        mapped to integer space
+
+        Each of these _List object are in turn stored in a _List object that is a class member
+        variable [node_score_cache].
+        ----------------------------------------------------------------------------------- */
+
+    ReportWarning (_String ("Entered CacheNodeScores()"));
+
+    if (scores_cached) {
+        return;
+    }
+
+
+#if defined __HYPHYMPI__
+    _Parameter  use_mpi_caching;
+    checkParameter (_HYBgm_MPI_CACHING, use_mpi_caching, 0);
+
+    if (use_mpi_caching) {
+        ReportWarning (_String ("Using MPI to cache node scores."));
+
+        // MPI_Init() is called in main()
+        int             size, rank;
+        long            mpi_node;
+        _SimpleList     parents,
+                        all_but_one (num_nodes-1, 0, 1),
+                        aux_list,
+                        nk_tuple;
+
+        _Parameter      score;
+        _Matrix         single_parent_scores (num_nodes, 1, false, true);
+
+        MPI_Status      status; // contains source, tag, and error code
+
+
+        MPI_Comm_size (MPI_COMM_WORLD, &size);  // number of processes
+        MPI_Comm_rank (MPI_COMM_WORLD, &rank);
+
+
+        if (rank == 0) {
+            _String     bgmSwitch ("_BGM_SWITCH_"),
+                        bgmStr;
+
+            _List       * this_list;
+
+            _Matrix     * mpi_node_status = new _Matrix ((long)size, 2, false, true);   // semaphore
+
+
+            // prepare message exporting _BayesianGraphicalModel object to compute nodes
+            SerializeBGMtoMPI (bgmStr);
+            ReportWarning (_String("Serialized _BayesianGraphicalModel object as:\n") & bgmStr);
+
+
+            // switch compute nodes from mpiNormal to bgm loop context
+            for (long ni = 1; ni < size; ni++) {
+                MPISendString (bgmSwitch, ni);
+            }
+
+
+            // receive confirmation of successful switch
+            for (long ni = 1; ni < size; ni++) {
+                long fromNode = ni;
+
+                _String t (MPIRecvString (ni,fromNode));
+                if (!t.Equal (&bgmSwitch)) {
+                    WarnError (_String("Failed to confirm MPI mode switch at node ") & ni);
+                    return;
+                } else {
+                    ReportWarning (_String("Successful mode switch to Bgm MPI confirmed from node ") & ni);
+                    MPISendString (bgmStr, ni);
+                }
+            }
+
+
+            // farm out jobs to idle nodes until none are left
+            for (long node_id = 0; node_id < num_nodes; node_id++) {
+                long        maxp            = max_parents.lData[node_id];
+                _String     mxString,
+                            mxName;
+                _Parameter  score;
+
+
+                this_list   = (_List *) node_score_cache.lData[node_id];
+
+                if (node_type.lData[node_id] == 0) {
+                    score = ComputeDiscreteScore (node_id, parents);    // [_SimpleList parents] should always be empty for master node
+                } else {
+                    score = ComputeContinuousScore (node_id, parents);
+                }
+
+                _Constant   orphan_score (score);
+
+
+                this_list->Clear();
+                (*this_list) && (&orphan_score);    // handle orphan score locally
+
+
+                if (maxp > 0) { // don't bother to farm out trivial cases
+                    // look for idle nodes
+                    mpi_node = 1;
+                    do {
+                        if ((*mpi_node_status)(mpi_node, 0) == 0) {
+                            ReportMPIError(MPI_Send(&node_id, 1, MPI_LONG, mpi_node, HYPHY_MPI_VARS_TAG, MPI_COMM_WORLD), true);
+                            ReportWarning (_String ("Sent child ") & node_id & " to node " & mpi_node);
+
+                            mpi_node_status->Store (mpi_node, 0, 1);    // set busy signal
+                            mpi_node_status->Store (mpi_node, 1, node_id);
+
+                            break;
+                        }
+                        mpi_node++;
+                    } while (mpi_node < size);
+                }
+
+
+                if (mpi_node == size) { // all nodes are busy, wait for one to send results
+                    MPIReceiveScores (mpi_node_status, true, node_id);
+                }
+            }
+            // end loop over child nodes
+
+
+            // collect remaining jobs
+            while (1) {
+                // look for a busy node
+                mpi_node = 1;
+                do {
+                    if ( (*mpi_node_status)(mpi_node,0) == 1) {
+                        break;
+                    }
+                    mpi_node++;
+                } while (mpi_node < size);
+
+                if (mpi_node < size) {
+                    MPIReceiveScores (mpi_node_status, false, 0);    // at least one node is busy
+                } else {
+                    break;
+                }
+            }
+
+
+            // shut down compute nodes
+            for (long shutdown = -1, mpi_node = 1; mpi_node < size; mpi_node++) {
+                ReportMPIError(MPI_Send(&shutdown, 1, MPI_LONG, mpi_node, HYPHY_MPI_VARS_TAG, MPI_COMM_WORLD), true);
+                ReportWarning (_String ("Node 0 sending shutdown signal to node ") & mpi_node);
+            }
+
+        }
+
+        else {  // compute node
+            long        node_id, maxp;  // update in while loop
+            _List       list_of_matrices;
+
+            while (1) {
+                _String     mxString,
+                            mxName;
+
+                list_of_matrices.Clear();
+
+
+                // wait for master node to issue node ID to compute
+                ReportMPIError (MPI_Recv (&node_id, 1, MPI_LONG, 0, HYPHY_MPI_VARS_TAG, MPI_COMM_WORLD, &status), false);
+                ReportWarning (_String("Node") & (long)rank & " received child " & (long)node_id & " from node " & (long)status.MPI_SOURCE);
+
+                if (node_id < 0) {
+                    ReportWarning (_String("Node") & (long)rank & " recognizes shutdown signal.\n");
+                    break;  // received shutdown message (-1)
+                }
+
+                maxp = max_parents.lData[node_id];
+                parents << 0;   // allocate space for one parent
+
+                if (parents.lLength != 1) { /* DEBUGGING */
+                    WarnError (_String("ERROR: _SimpleList parents not expected length (1), found ") & parents.lLength);
+                }
+
+
+                // compute single parent scores
+                for (long par = 0; par < num_nodes; par++) {
+                    if (par == node_id) {   // child cannot be its own parent
+                        continue;
+                    }
+
+                    parents.lData[0] = par;
+
+                    if (node_type.lData[node_id] == 0) {
+                        // discrete-valued child node cannot have continuous parent
+                        if (node_type.lData[par] == 0) {
+                            score = ComputeDiscreteScore (node_id, parents);
+                        }
+                    } else {
+                        // continuous child can have discrete or continuous parents
+                        score = ComputeContinuousScore (node_id, parents);
+                    }
+
+                    single_parent_scores.Store (par, 0, score);
+                }
+
+
+                // compute multiple parent scores
+                for (long np = 2; np <= maxp; np++) {
+                    _NTupleStorage  family_scores (num_nodes-1, np);
+
+                    parents << 0;   // allocate space for one additional parent
+
+                    if (all_but_one.NChooseKInit (aux_list, nk_tuple, np, false)) {
+                        bool    remaining, family_is_discrete;
+                        long    res;
+
+                        do {
+                            remaining = all_but_one.NChooseK (aux_list, nk_tuple);
+
+                            if (node_type.lData[node_id] == 0) {
+                                family_is_discrete = TRUE;
+                                for (long par, par_idx = 0; par_idx < np; par_idx++) {
+                                    par = nk_tuple.lData[par_idx];
+                                    if (par >= node_id) {
+                                        par++;
+                                    }
+
+                                    if (node_type.lData[par] != 0) {    // all parents must be discrete
+                                        family_is_discrete = FALSE;
+                                        break;
+                                    }
+
+                                    parents.lData[par_idx] = par;
+                                }
+
+                                if (family_is_discrete) {
+                                    score = ComputeDiscreteScore (node_id, parents);
+                                }
+                            } else {
+                                for (long par_idx = 0; par_idx < np; par_idx++) {
+                                    long par = nk_tuple.lData[par_idx];
+                                    if (par >= node_id) {
+                                        par++;
+                                    }
+                                    parents.lData[par_idx] = par;
+                                }
+
+                                score = ComputeContinuousScore (node_id, parents);
+                            }
+
+                            res = family_scores.Store (score, nk_tuple);
+                        } while (remaining);
+                    } else {
+                        _String oops ("Failed to initialize _NTupleStorage object in Bgm::CacheNodeScores().\n");
+                        WarnError(oops);
+                    }
+
+                    list_of_matrices << (&family_scores);   // append duplicate to storage
+                }
+
+                // send results to master node
+
+                ReportMPIError (MPI_Send (single_parent_scores.theData, num_nodes, MPI_DOUBLE, 0, HYPHY_MPI_DATA_TAG, MPI_COMM_WORLD), true);
+
+                for (long np = 2; np <= maxp; np++) {
+                    _Matrix * storedMx = (_Matrix *) list_of_matrices.lData[np-2];
+                    ReportMPIError (MPI_Send (storedMx->theData, storedMx->GetHDim(), MPI_DOUBLE, 0, HYPHY_MPI_DATA_TAG, MPI_COMM_WORLD), true);
+                }
+            }
+            // end while, received shutdown from master node
+        }
+        // end else if compute node
+    }
+
+    else {  // perform single-threaded
+#else
+
+    _SimpleList     parents,
+                    all_but_one (num_nodes-1, 0, 1),
+                    aux_list,
+                    nk_tuple;
+
+    _Matrix         single_parent_scores (num_nodes, 1, false, true);
+
+
+#if !defined __UNIX__ || defined __HEADLESS__ || defined __HYPHYQT__ || defined __HYPHY_GTK__
+    TimerDifferenceFunction(false); // save initial timer; will only update every 1 second
+#if !defined __HEADLESS__
+    SetStatusLine     (empty,_HYBgm_STATUS_LINE_CACHE, empty, 0, HY_SL_TASK|HY_SL_PERCENT);
+#else
+    SetStatusLine     (_HYBgm_STATUS_LINE_CACHE);
+#endif
+    _Parameter  seconds_accumulator = .0,
+                temp;
+#endif
+
+    for (long node_id = 0; node_id < num_nodes; node_id++) {
+        long        maxp        = max_parents.lData[node_id];
+        _List   *   this_list   = (_List *) node_score_cache.lData[node_id];    // retrieve pointer to list of scores for this child node
+
+        this_list->Clear();     // reset the list
+
+        // prepare some containers
+        _SimpleList parents;
+        _Parameter  score;
+
+        if (node_type.lData[node_id] == 0) {    // child node is discrete (multinomial)
+            score = ComputeDiscreteScore (node_id, parents);
+        } else {                            // child node is continuous (conditional Gaussian)
+            score = ComputeContinuousScore (node_id, parents);
+        }
+
+
+        _Constant   orphan_score (score);   // score computed with no parents (initialized empty list)
+        (*this_list) && (&orphan_score);
+
+#if !defined __UNIX__ || defined __HEADLESS__
+        temp = .0;
+#endif
+
+        if (maxp > 0) {
+            _Matrix     single_parent_scores (num_nodes, 1, false, true);
+
+            parents << 0;   // allocate space for one parent
+
+            for (long par = 0; par < num_nodes; par++) {
+                if (par == node_id) {   // child cannot be its own parent, except morally-challenged time travellers
+                    continue;
+                }
+
+                parents.lData[0] = par;
+
+                // discrete child cannot have continuous parent
+                if (node_type.lData[node_id] == 0) {
+                    score = (node_type.lData[par] == 0) ? ComputeDiscreteScore (node_id, parents) : -A_LARGE_NUMBER;
+                } else {
+                    score = ComputeContinuousScore (node_id, parents);
+                }
+
+                single_parent_scores.Store (par, 0, score);
+            }
+            (*this_list) && (&single_parent_scores);
+        }
+
+        for (long np = 2; np <= maxp; np++) {
+            _NTupleStorage  family_scores (num_nodes-1, np);
+
+            parents << 0;   // allocate space for one additional parent
+
+            if (all_but_one.NChooseKInit (aux_list, nk_tuple, np, false)) {
+                bool    remaining, family_is_discrete;
+                long    res;
+
+                do {
+                    remaining = all_but_one.NChooseK (aux_list, nk_tuple);
+
+                    if (node_type.lData[node_id] == 0) {
+                        family_is_discrete = TRUE;
+                        for (long par, par_idx = 0; par_idx < np; par_idx++) {
+                            par = nk_tuple.lData[par_idx];
+                            if (par >= node_id) {
+                                par++;
+                            }
+
+                            if (node_type.lData[par] != 0) {    // all parents must be discrete
+                                family_is_discrete = FALSE;
+                                break;
+                            }
+
+                            parents.lData[par_idx] = par;
+                        }
+
+                        if (family_is_discrete) {
+                            score = ComputeDiscreteScore (node_id, parents);
+                        }
+                    } else {
+                        for (long par_idx = 0; par_idx < np; par_idx++) {
+                            long par = nk_tuple.lData[par_idx];
+                            if (par >= node_id) {
+                                par++;
+                            }
+                            parents.lData[par_idx] = par;
+                        }
+
+                        score = ComputeContinuousScore (node_id, parents);
+                    }
+
+                    res = family_scores.Store (score, nk_tuple);
+                } while (remaining);
+            } else {
+                _String oops ("Failed to initialize _NTupleStorage object in Bgm::CacheNodeScores().\n");
+                WarnError(oops);
+            }
+            (*this_list) && (&family_scores);   // append duplicate to storage
+        }
+
+
+#if !defined __UNIX__ || defined __HEADLESS__ || defined __HYPHYQT__ || defined __HYPHY_GTK__
+        if ((temp=TimerDifferenceFunction(true))>1.0) { // time to update
+            seconds_accumulator += temp;
+
+            _String statusLine = _HYBgm_STATUS_LINE_CACHE & " " & (node_id+1) & "/" & num_nodes
+                                 & " nodes (" & (1.0+node_id)/seconds_accumulator & "/second)";
+
+#if defined __HEADLESS__
+            SetStatusLine (statusLine);
+#else
+            SetStatusLine (empty,statusLine,empty,100*(float)node_id/(num_nodes),HY_SL_TASK|HY_SL_PERCENT);
+#endif
+            TimerDifferenceFunction (false); // reset timer for the next second
+            yieldCPUTime (); // let the GUI handle user actions
+
+            if (terminateExecution) { // user wants to cancel the analysis
+                break;
+            }
+        }
+#endif
+    }
+#endif
+
+#if defined __HYPHYMPI__
+    }   // completes else statement
+#endif
+
+#if !defined __UNIX__ || defined __HEADLESS__
+    SetStatusLine     (_HYBgm_STATUS_LINE_CACHE_DONE);
+#endif
+
+    scores_cached = TRUE;
+
+    ReportWarning (_String ("Cached node scores."));
+}
+
+
+
+//________________________________________________________________________________________________________
+#if defined __HYPHYMPI__
+/*
+	Head node processes results from compute node.
+ */
+void _BayesianGraphicalModel::MPIReceiveScores (_Matrix * mpi_node_status, bool sendNextJob, long node_id)
+{
+    _Matrix     single_parent_scores (num_nodes, 1, false, true);
+    MPI_Status  status;
+
+    ReportMPIError (MPI_Recv (single_parent_scores.theData, num_nodes, MPI_DOUBLE, MPI_ANY_SOURCE,
+                              HYPHY_MPI_DATA_TAG, MPI_COMM_WORLD, &status), false);
+
+
+    long        senderID    = (long) status.MPI_SOURCE,
+                this_node    = (long) (*mpi_node_status) (senderID, 1),
+                maxp       = max_parents.lData[this_node];
+
+    _List   *   this_list   = (_List *) node_score_cache.lData[this_node];
+
+
+    _String     mxString,
+                mxName;
+
+
+    mpi_node_status->Store (senderID, 0, 0);    // set node status to idle
+    ReportWarning (_String("Received scores for child ") & this_node & " from node " & senderID);
+
+    (*this_list) && (&single_parent_scores);
+
+
+    _SimpleList     parents,
+                    all_but_one (num_nodes-1, 0, 1),
+                    aux_list,
+                    nk_tuple;
+
+    _Parameter      score;
+
+    // parse nk-tuple results
+    for (long np = 2; np <= maxp; np++) {
+        _NTupleStorage  family_scores (num_nodes-1, np);
+        bool            remaining;
+
+
+        if (all_but_one.NChooseKInit (aux_list, nk_tuple, np, false)) {
+            long        score_index     = 0,
+                        num_ktuples      = exp(lnGamma(num_nodes) - lnGamma(num_nodes - np) - lnGamma(np+1)),
+                        ntuple_receipt;
+
+            _Matrix     scores_to_store (num_ktuples, 1, false, true);
+
+            // receive nk-tuple indexed node scores from same compute node
+            ReportMPIError (MPI_Recv (scores_to_store.theData, num_ktuples, MPI_DOUBLE, senderID,
+                                      HYPHY_MPI_DATA_TAG, MPI_COMM_WORLD, &status), false);
+
+            do {
+                remaining = all_but_one.NChooseK (aux_list, nk_tuple);  // update nk-tuple in aux_list
+                ntuple_receipt = family_scores.Store (scores_to_store(score_index, 0), nk_tuple);
+                score_index++;
+            } while (remaining);
+        } else {
+            _String oops ("Failed to initialize _NTupleStorage object in Bgm::CacheNodeScores().\n");
+            WarnError(oops);
+        }
+
+        (*this_list) && (&family_scores);
+    }
+
+
+    // send next job
+    if (sendNextJob) {
+        ReportMPIError(MPI_Send(&node_id, 1, MPI_LONG, senderID, HYPHY_MPI_VARS_TAG, MPI_COMM_WORLD), true);
+        mpi_node_status->Store (senderID, 0, 1);    // reset busy signal
+        mpi_node_status->Store (senderID, 1, node_id);
+        ReportWarning (_String ("Sent child ") & node_id & " to node " & senderID);
+    }
+}
+
+
+//___________________________________________________________________________________________
+
+/* ------------------------------------------------------------------------------------
+	Pass current network structure, data, constraint graph, and other analysis settings
+	to compute node as HBL.
+   ------------------------------------------------------------------------------------ */
+void _BayesianGraphicalModel::SerializeBGMtoMPI (_String & rec)
+{
+    char        buf [255];
+
+    _String *   bgmName = (_String *) bgmNamesList (bgmList._SimpleList::Find((long)this));
+
+    _Parameter  impute_max_steps, impute_burnin, impute_sample_size;    // permit user to reset impute settings
+
+    checkParameter (_HYBgm_IMPUTE_MAXSTEPS, impute_max_steps, 10000);
+    checkParameter (_HYBgm_IMPUTE_BURNIN, impute_burnin, 1000);
+    checkParameter (_HYBgm_IMPUTE_SAMPLES, impute_sample_size, 100);
+
+    rec << "USE_MPI_CACHING=1;\n";
+    rec << "PRINT_DIGITS=-1;\n";
+
+    // write utility functions
+    rec << "function add_discrete_node (id,maxp,size,nlev)\n";
+    rec << "{\ndnode={};\n";
+    rec << "dnode[\"NodeID\"]=id;\n";
+    rec << "dnode[\"NodeType\"]=0;\n";
+    rec << "dnode[\"MaxParents\"]=maxp;\n";
+    rec << "dnode[\"PriorSize\"]=size;\n";
+    rec << "dnode[\"NumLevels\"]=nlev;\n";
+    rec << "return dnode;\n}\n";
+
+    rec << "function add_gaussian_node (id,maxp,size,mean,prec,scale)\n";
+    rec << "{\ngnode={};\n";
+    rec << "gnode[\"NodeID\"]=id;\n";
+    rec << "gnode[\"NodeType\"]=1;\n";
+    rec << "gnode[\"PriorSize\"]=size;\n";
+    rec << "gnode[\"MaxParents\"]=maxp;\n";
+    rec << "gnode[\"PriorMean\"]=mean;\n";
+    rec << "gnode[\"PriorVar\"]=prec;\n";
+    rec << "gnode[\"PriorScale\"]=scale;\n";
+    rec << "return gnode;\n}\n";
+
+
+    // prepare assortative lists
+    rec << "nodes={};\n";
+
+    for (long node_id = 0; node_id < num_nodes; node_id++) {
+        if (node_type.lData[node_id] == 0) {
+            rec << "nodes[Abs(nodes)]=add_discrete_node(";
+            // I can't figure out how to write the _String object from [node_names] to file :-P
+            snprintf (buf, sizeof(buf), "\"Node%d\",%d,%d,%d", node_id, (long)max_parents.lData[node_id], (long)prior_sample_size(node_id,0), num_levels.lData[node_id]);
+            rec << buf;
+            rec << ");\n";
+        } else {
+            rec << "nodes[Abs(nodes)]=add_gaussian_node(";
+            snprintf (buf, sizeof(buf), "\"Node%d\",%d,%d,%f,%f,%f", node_id, (long)max_parents.lData[node_id], (long)prior_sample_size(node_id,0),
+                     prior_mean(node_id,0), prior_precision(node_id,0), prior_scale(node_id,0) );
+            rec << buf;
+            rec << ");\n";
+        }
+    }
+
+    // write BGM constructor
+    rec << "BayesianGraphicalModel ";
+    rec << bgmName;
+    rec << "=(nodes);\n";
+
+    // missing data imputation settings
+    snprintf (buf, sizeof(buf), "BGM_IMPUTE_MAXSTEPS = %d;\n", (long)impute_max_steps);
+    rec << buf;
+    snprintf (buf, sizeof(buf), "BGM_IMPUTE_BURNIN = %d;\n", (long)impute_burnin);
+    rec << buf;
+    snprintf (buf, sizeof(buf), "BGM_IMPUTE_SAMPLES = %d;\n", (long)impute_sample_size);
+    rec << buf;
+
+    // serialize constraint matrix
+    rec << "bgmConstraints=";
+    rec << (_String *)constraint_graph.toStr();
+    rec << ";\n";
+    rec << "SetParameter(";
+    rec << bgmName;
+    rec << ",BGM_CONSTRAINT_MATRIX,bgmConstraints);\n";
+
+    // serialize data matrix and assign to BGM
+    rec << "bgmData=";
+    rec << (_String *)theData.toStr();
+    rec << ";\n";
+    rec << "SetParameter(";
+    rec << bgmName;
+    rec << ",BGM_DATA_MATRIX,bgmData);\n";
+
+    /*
+    rec << "bgmWeights=";
+    rec << (_String *)theWeights.toStr();
+    rec << ";\n";
+    rec << "SetParameter(";
+    rec << bgmName;
+    rec << ",BGM_WEIGHT_MATRIX,bgmWeights);\n";
+    */
+}
+#endif
+
+
+
+//_________________________________________________________________________________________________________
+_Matrix *   _BayesianGraphicalModel::Optimize (void)
+{
+    /* ---------------------------------------------------------------------------------------------
+        OPTIMIZE()
+        Wrapper function to access various optimization methods (K2, structural MCMC, order MCMC)
+            and implement MPI functionality.
+       --------------------------------------------------------------------------------------------- */
+    ReportWarning (_String("Entered _BayesianGraphicalModel::Optimize()"));
+
+    if (!scores_cached) {
+        CacheNodeScores();
+    }
+
+
+    _Parameter      optMethod;      // 0 = K2 fixed order
+    // 1 = K2 shuffle order with restarts
+    // 2 = structural MCMC, fixed order
+    // 3 = structural MCMC
+    // 4 = order MCMC
+
+    _Matrix *   output_matrix;      // for order-MCMC and graph-MCMC has 4 columns: (1) chain trace;
+    //  (2) edge marginal posteriors; (3) best state (node ordering or graph);
+    //  (4) last state visited in chain
+
+
+    checkParameter (_HYBgm_METHOD_KEY, optMethod, 0.);
+
+    ReportWarning (_String("... optimization method set to ") & optMethod);
+
+    if (optMethod < 2) {
+        ReportWarning (_String("... starting K2 algorithm"));
+
+        _Parameter  num_restarts,           // HBL settings
+                    num_randomize;
+
+        checkParameter (_HYBgm_K2_RESTARTS, num_restarts, 1.);
+        checkParameter (_HYBgm_K2_RANDOMIZE, num_randomize, num_nodes);
+
+        checkPointer (output_matrix =  new _Matrix (num_nodes * num_nodes, 2, false, true));
+        K2Search (optMethod, num_restarts, num_randomize, output_matrix);
+    } else {
+        _String         oops;
+        _Parameter      mcmc_steps, mcmc_burnin, mcmc_samples,
+                        mcmc_nchains, mcmc_dtemp;
+
+
+        // acquisition of HBL arguments with a few sanity checks
+        checkParameter (_HYBgm_MCMC_MAXSTEPS, mcmc_steps, 0);
+        if (mcmc_steps <= 0)    {
+            oops = _String ("You asked HyPhy to run MCMC with zero steps in the chain! Did you forget to set Bgm_MCMC_STEPS?\n");
+        }
+
+        checkParameter (_HYBgm_MCMC_BURNIN, mcmc_burnin, 0);
+        if (mcmc_burnin < 0)    {
+            oops = _String("You can't have a negative burn-in (_HYBgm_MCMC_BURNIN)!\n");
+        }
+
+        checkParameter (_HYBgm_MCMC_SAMPLES, mcmc_samples, 0);
+        if (mcmc_samples < 0)   {
+            oops = _String ("You can't have a negative sample size!");
+        }
+
+        if (oops.sLength > 0) {
+            WarnError (oops);
+            return nil;
+        }
+
+#if defined __HYPHYMPI__ && defined __AFYP_DEVELOPMENT__
+        int         size,
+                    rank;
+        long        mpi_node;
+        char        mpi_message [256];
+
+        MPI_Status  status; // contains source, tag, and error code
+
+        MPI_Comm_size (MPI_COMM_WORLD, &size);  // number of processes
+        MPI_Comm_rank (MPI_COMM_WORLD, &rank);
+
+
+        checkParameter (_HYBgm_MCMC_NCHAINS, mcmc_nchains, 1);
+        if (mcmc_nchains <= 0) {
+            oops = _String ("You must run at least one chain in MCMC.");
+            WarnError (oops);
+
+            return nil;
+        }
+
+
+
+        // parallel coupled chains (MPI)
+        if (mcmc_nchains > 1) {
+            checkParameter (_HYBgm_MCMC_TEMP, mcmc_dtemp, 1);
+            if (mcmc_nchains > 0 && mcmc_dtemp <= 1) {
+                oops = _String ("Temperature increment must be greater than 1.");
+                WarnError (oops);
+            }
+
+            _Parameter  chain_T = 1. / (1. + mcmc_dtemp*rank);
+
+
+            /* note that GraphMetropolis already returns structure and last posterior prob as matrix entries */
+            /* use sampling interval to swap chains */
+            /* each chain needs a matrix pointer for output */
+            if (optMethod < 4) {
+                checkPointer (output_matrix = new _Matrix ( (mcmc_samples > num_nodes*num_nodes) ? mcmc_samples : num_nodes*num_nodes, 4, false, true));
+                GraphMetropolis (optMethod==2, mcmc_burnin, mcmc_steps, mcmc_samples, chain_T, output_matrix);
+
+                for (long samp = 0; samp < mcmc_samples; samp++) {
+                    /*** UNDER DEVELOPMENT ***/
+                    if (rank > 0) {
+
+                    } else {
+
+                    }
+                }
+            }
+        }
+
+        // single chain
+        else {
+#endif
+            checkPointer (output_matrix = new _Matrix ( (mcmc_samples > num_nodes*num_nodes) ? mcmc_samples : num_nodes*num_nodes, 4, false, true));
+
+            if (optMethod < 4) {
+                ReportWarning (_String("... starting graph-mcmc"));
+                GraphMetropolis ( (optMethod == 2), mcmc_burnin, mcmc_steps, mcmc_samples, 1., output_matrix);
+            } else {
+                ReportWarning (_String("... starting order-mcmc"));
+                if (mcmc_burnin > 0) {
+                    ReportWarning (_String("Executing order-MCMC for burn-in period of ") & mcmc_burnin & " steps");
+                    OrderMetropolis (FALSE, mcmc_burnin, mcmc_samples, 1., output_matrix);
+
+                    ReportWarning (_String("Automatically reset node_order_arg to best order visited in order-MCMC burn-in:\n "));
+                    if (node_order_arg.lLength == 0) {
+                        node_order_arg.Populate (num_nodes, 0, 0);
+                    }
+                    for (long i = 0; i < num_nodes; i++) {
+                        node_order_arg.lData[i] = (*output_matrix) (i,3);
+                    }
+                    ReportWarning    (_String((_String*)node_order_arg.toStr()));
+                }
+                ReportWarning (_String("Executing order-MCMC for ") & mcmc_steps & " steps, sample size " & mcmc_samples);
+                OrderMetropolis (TRUE, mcmc_steps, mcmc_samples, 1., output_matrix);
+            }
+
+#if defined __AFYP_DEVELOPMENT__ && defined __HYPHYMPI__
+        }
+#endif
+
+    }
+
+
+    return (_Matrix *) output_matrix;
+}
+
+
+
+//_________________________________________________________________________________________________________
+void _BayesianGraphicalModel::K2Search (bool do_permute_order, long n_restart, long n_randomize, _Matrix * result)
+{
+    //  THIS NEEDS UPDATING
+#ifdef __NEVER_DEFINED__
+    _Parameter  this_score, best_score, next_score;
+
+    _Matrix     order_matrix (num_nodes, num_nodes, false, true),
+                best_dag (num_nodes, num_nodes, false, true);
+
+    _SimpleList best_node_order;
+
+
+
+    best_node_order.Populate (num_nodes, 0, 1);
+    best_node_order.Permute (1);
+
+
+
+    //  Convert node order to binary matrix where edge A->B is permitted if
+    //  order_matrix[B][A] = 1, i.e. B is to the right of A in node order.
+    for (long i = 0; i < num_nodes; i++) {
+        long    child = best_node_order.lData[i];
+
+        for (long j = 0; j < num_nodes; j++) {
+            long    parent = best_node_order.lData[j];
+
+            order_matrix.Store (parent, child, (j > i) ? 1 : 0);
+        }
+    }
+
+
+    // greedy hill-climbing algorithm (K2)
+    // ResetGraph (nil);
+    best_score = Compute();     // best over all node orders (if we're reshuffling)
+
+
+    for (long iter = 0; iter < n_restart; iter++) {
+        next_score = Compute();     // reset to empty graph score
+
+
+        for (long child = 0; child < num_nodes; child++) {
+            long        num_parents = 0,
+                        improvement_flag = 0,
+                        next_parent_to_add;
+
+            do {
+                for (long parent = 0; parent < num_nodes; parent++) {
+                    if ( (parent != child)                      // must meet all conditions!
+                            && (theStructure(parent, child) == 0)
+                            && (order_matrix (parent, child) == 1)
+                            && constraint_graph(parent, child) >= 0) {
+                        theStructure.Store (parent, child, 1);
+                        this_score = Compute();
+
+                        if (this_score > next_score) {
+                            improvement_flag    = 1;
+                            next_score          = this_score;
+                            next_parent_to_add  = parent;
+                        }
+                        theStructure.Store (parent, child, 0);  // revert
+                    }
+                }
+
+                if (improvement_flag) { // adding another parent improves network score
+                    theStructure.Store (next_parent_to_add, child, 1);
+                    num_parents++;
+                    improvement_flag = 0;   // reset for next parent
+                } else {
+                    break;  // unable to improve further
+                }
+            } while (num_parents < max_parents.lData[child]);
+        }
+
+
+        if (do_permute_order) {
+            this_score = Compute();
+
+            if (this_score > best_score) {
+                best_score = this_score;
+                best_dag = (_Matrix &) theStructure;        // store graph optimized from the current ordering
+            }
+
+            // ResetGraph (nil);
+
+            best_node_order.Permute (1);
+
+            for (long i = 0; i < num_nodes; i++) {
+                long    child = best_node_order.lData[i];
+                for (long j = 0; j < num_nodes; j++) {
+                    long    parent = best_node_order.lData[j];
+                    order_matrix.Store (parent, child, (j > i) ? 1 : 0);
+                }
+            }
+        } else {
+            break;  // only one iteration when node ordering is known
+        }
+    }
+
+    if (do_permute_order) {
+        theStructure = (_Matrix &) best_dag;
+        best_node_order.Clear();    // reset to initial state
+    }
+
+
+    result->Store (0, 0, Compute());
+
+    for (long row = 0; row < num_nodes; row++) {
+        for (long col = 0; col < num_nodes; col++) {
+            result->Store (row*num_nodes+col, 1, theStructure(row, col));
+        }
+    }
+#endif
+}
+
+
+
+//_______________________________________________________________________________________________________________________
+bool    _BayesianGraphicalModel::GraphObeysOrder (_Matrix & graph, _SimpleList & order)
+{
+    _Matrix order_matrix (num_nodes, num_nodes, false, true);
+
+    // convert order vector to matrix form
+    for (long p_index = 0; p_index < num_nodes; p_index++) {
+        for (long par = order.lData[p_index], c_index = 0; c_index < num_nodes; c_index++) {
+            order_matrix.Store (par, order.lData[c_index], (p_index > c_index) ? 1 : 0);
+        }
+    }
+
+    // loop thru graph, check that edges are compatible with node order
+    for (long parent = 0; parent < num_nodes; parent++) {
+        for (long child = 0; child < num_nodes; child++) {
+            if (graph(parent, child)==1 && order_matrix(parent, child)==0) {
+                return 0;
+            }
+        }
+    }
+
+    return 1;
+}
+
+
+
+//_______________________________________________________________________________________________________________________
+_SimpleList *   _BayesianGraphicalModel::GetOrderFromGraph (_Matrix & graph)
+{
+    /* ---------------------------------------------------------------------------------
+        GetOrderFromGraph()
+            To quickly generate a node order based on graph argument.
+            Loop through nodes in graph and insert into list according to parentage.
+			*** Nodes can only be parents of nodes that appear to their left ***
+            For an empty graph, this should return (0,1,2,...,num_nodes-1)
+     ----------------------------------------------------------------------------------- */
+
+    _SimpleList *   new_order  = new _SimpleList (1, 0, 0); // initialize with single entry, [0]
+
+    for (long left_of, node = 1; node < num_nodes; node++) {
+        // loop through nodes in list looking for parents
+        for (left_of = 0; left_of < new_order->lLength; left_of++) {
+            // if the node is the child,
+            if (graph (left_of, node)) {
+                new_order->InsertElement ((BaseRef) node, left_of, false, false);
+                break;
+            }
+        }
+
+        // if we reach end of list, append
+        if (left_of == new_order->lLength) {
+            (*new_order) << node;
+        }
+
+    }
+	ReportWarning(_String("Constructed node order from graph:\n") & (_String *)new_order->toStr() & "\n");
+    return new_order;
+}
+
+
+
+//_______________________________________________________________________________________________________________________
+void    _BayesianGraphicalModel::GraphMetropolis (bool fixed_order, long mcmc_burnin, long mcmc_steps, long mcmc_samples,
+        _Parameter chain_t, _Matrix * result)
+{
+    /* --------------------------------------------------------------------------------------------------------
+        GraphMetropolis()
+
+        Performs MCMC over structures.  Initialize chain using class member [theStructure] (accessible by HBL).
+            If theStructure is empty graph, initialize order with random permutation.
+            If [fixed_order]=TRUE, only explores the subset of graphs compatible with [node_order_arg] if specified.
+
+        Returns pointer to matrix containing:   (1) vector of posterior probabiities
+                                                (2) linearized matrix of edge marginal posteriors
+                                                (3)     "       "   for best graph
+                                                (4)     "       "   for last graph visited in chain
+       --------------------------------------------------------------------------------------------------------- */
+
+    _Matrix     *   proposed_graph  = new _Matrix (num_nodes, num_nodes, false, true);
+
+    _Matrix         current_graph (num_nodes, num_nodes, false, true),
+                    best_graph (num_nodes, num_nodes, false, true);
+
+    _Parameter      current_score, proposed_score, best_score,
+                    lk_ratio,
+                    prob_swap, param_max_fails;
+
+    long            sampling_interval = mcmc_steps / mcmc_samples,
+                    max_fails;
+
+    _SimpleList *   proposed_order  = new _SimpleList();
+    _SimpleList     current_order;
+
+
+    // parse HBL settings
+    checkParameter (_HYBgm_MCMC_PROBSWAP, prob_swap, 0.1);
+    if (prob_swap < 0 || prob_swap > 1.) {
+        _String oops ("BGM_MCMC_PROBSWAP must be assigned a value between 0 and 1.  Exiting.\n");
+        WarnError (oops);
+        return;
+    }
+
+    checkParameter (_HYBgm_MCMC_MAXFAILS, param_max_fails, 100);
+    if (param_max_fails <= 0.) {
+        WarnError ("BGM_MCMC_MAXFAILS must be assigned a value greater than 0");
+        return;
+    } else {
+        max_fails = (long) param_max_fails;
+    }
+
+
+
+
+    // initialize chain state
+	if (fixed_order)
+	{
+		if (node_order_arg.lLength > 0 && GraphObeysOrder (theStructure, node_order_arg) )
+		{
+			(*proposed_graph) = (_Matrix &) theStructure;
+            (*proposed_order) = (_SimpleList &) node_order_arg;
+
+            ReportWarning (_String ("Starting GraphMetropolis() using node_order_arg:\n ") & (_String *) proposed_order->toStr());
+        } else {
+            _String oops ("ERROR: Structure does not match order, aborting GraphMetropolis().");
+            WarnError (oops);
+
+            return;
+		}
+	} else {
+		/*
+		(*proposed_graph)   = (_Matrix &) theStructure;
+		proposed_order      = GetOrderFromGraph (theStructure);
+		 */
+		proposed_order = GetOrderFromGraph (*proposed_graph);
+	}
+
+	
+	// randomize the initial graph
+	RandomizeGraph (proposed_graph, proposed_order, prob_swap, num_nodes*num_nodes, max_fails, fixed_order);
+	ReportWarning (_String ("seeding with randomized graph:\n") & (_String *) proposed_graph->toStr());
+
+    // status line
+#if !defined __UNIX__ || defined __HEADLESS__ || defined __HYPHYQT__ || defined __HYPHY_GTK__
+    long    updates = 0;
+    TimerDifferenceFunction (false);
+#if defined __HEADLESS__
+    SetStatusLine (_HYBgm_STATUS_LINE_MCMC);
+#else
+    SetStatusLine (empty, _HYBgm_STATUS_LINE_MCMC, empty, 0, HY_SL_TASK|HY_SL_PERCENT);
+#endif
+#endif
+
+
+    current_order = (*proposed_order);
+
+    current_graph = (_Matrix &) (*proposed_graph);
+    best_graph = (_Matrix &) (*proposed_graph);
+
+    best_score = proposed_score = current_score = Compute((_Matrix &) *proposed_graph);
+
+
+    // main loop
+    for (long step = 0; step < mcmc_steps + mcmc_burnin; step++) {
+        //ReportWarning (_String ("current graph (") & current_score & "): \n" & (_String *) current_graph.toStr());
+		
+		// modify the graph by one edge
+        RandomizeGraph (proposed_graph, proposed_order, prob_swap, 1, max_fails, fixed_order);
+
+
+        proposed_score = Compute((_Matrix &) *proposed_graph);
+        //ReportWarning (_String ("propose graph: (") & proposed_score & "):\n" & (_String *) proposed_graph->toStr());
+
+        lk_ratio = exp(proposed_score - current_score);
+
+        if (lk_ratio > 1. || genrand_real2() < lk_ratio) {  // Metropolis-Hastings
+            current_graph   = (_Matrix &) (*proposed_graph);        // accept proposed graph
+            current_score   = proposed_score;
+
+            for (long foo = 0; foo < num_nodes; foo++) {
+                current_order.lData[foo] = proposed_order->lData[foo];
+            }
+
+            if (current_score > best_score) {
+                best_score = current_score;
+                best_graph = (_Matrix &) current_graph;         // keep track of best graph ever visited by chain
+            }
+        } else {
+            // revert proposal
+            for (long row = 0; row < num_nodes; row++) {
+                proposed_order->lData[row] = current_order.lData[row];
+
+                for (long col = 0; col < num_nodes; col++) {
+                    proposed_graph->Store(row, col, current_graph(row, col));
+                }
+            }
+        }
+
+        // chain sampling
+        if (step >= mcmc_burnin) {
+            if ( (step-(long)mcmc_burnin) % sampling_interval == 0) {
+                long    entry   = (long int) ((step-mcmc_burnin) / sampling_interval);
+
+                result->Store (entry, 0, current_score);        // update chain trace
+
+                for (long row = 0; row < num_nodes; row++) {    // update edge tallies
+                    for (long offset=row*num_nodes, col = 0; col < num_nodes; col++) {
+                        result->Store (offset+col, 1, (*result)(offset+col,1) + current_graph(row, col));
+                    }
+                }
+            }
+        }
+
+#if !defined __UNIX__ || defined __HEADLESS__
+        if (TimerDifferenceFunction(true)>1.0) { // time to update
+            updates ++;
+            _String statusLine = _HYBgm_STATUS_LINE_MCMC & " " & (step+1) & "/" & (mcmc_steps + mcmc_burnin)
+                                 & " steps (" & (1.0+step)/updates & "/second)";
+#if defined __HEADLESS__
+            SetStatusLine     (statusLine);
+#else
+            SetStatusLine     (empty,statusLine,empty,100*step/(mcmc_steps + mcmc_burnin),HY_SL_TASK|HY_SL_PERCENT);
+#endif
+            TimerDifferenceFunction(false); // reset timer for the next second
+            yieldCPUTime(); // let the GUI handle user actions
+            if (terminateExecution) { // user wants to cancel the analysis
+                break;
+            }
+        }
+#else
+        if (step % ((mcmc_steps + mcmc_burnin)/100) == 0) {
+            ReportWarning (_String ("graphMCMC at step ") & step & " of " & (mcmc_steps+mcmc_burnin));
+        }
+#endif
+
+    }
+
+    // convert edge tallies to frequencies, and report best and last graph
+    for (long row = 0; row < num_nodes; row++) {
+        for (long offset=row*num_nodes, col = 0; col < num_nodes; col++) {
+            result->Store (offset+col, 1, (*result)(offset+col,1)/mcmc_samples);
+            result->Store (offset+col, 2, (_Parameter) best_graph(row, col));
+            result->Store (offset+col, 3, (_Parameter) current_graph(row,col));
+        }
+    }
+
+
+    // update theStructure with last graph visited by chain
+    theStructure = (_Matrix &) current_graph;
+    ReportWarning (_String("On exiting GraphMetropolic() assigned last state to theStructure: ") & (_String *) theStructure.toStr());
+
+    // release memory
+    delete (proposed_graph);
+    delete (proposed_order);
+}
+
+
+
+//_____________________________________________________________________________________________________________
+void    _BayesianGraphicalModel::RandomizeGraph (_Matrix * graph, _SimpleList * order, _Parameter prob_swap, long num_steps, long max_fails, bool fixed_order)
+{
+    //  Modify a graph by adding, removing, or reversing an edge, so long as that modification
+    //  complies with the constraint matrix and (when fixed_order=TRUE) node order.
+
+    long    step = 0, fail = 0;
+
+
+    // calculate number of parents for each child for rapid access later
+    _SimpleList     num_parents;
+
+    num_parents.Populate (num_nodes, 0, 0);
+
+    for (long child = 0; child < num_nodes; child++) {
+        for (long parent = 0; parent < num_nodes; parent++) {
+            if ( (*graph)(parent, child) > 0) {
+                num_parents.lData[child]++;
+            }
+        }
+
+        if (num_parents.lData[child] > max_parents.lData[child]) {
+            WarnError (_String ("Number of parents exceeds maximum BEFORE randomization of graph at node ") & child & " (" & num_parents.lData[child] & " > " & max_parents.lData[child] & ")\n" );
+            break;
+        }
+    }
+
+
+    // randomize graph
+    long    p_rank, c_rank, parent, child;
+
+    do {
+        // a fail-safe to avoid infinite loops
+        if (fail > max_fails) {
+            WarnError (_String ("Failed to modify the graph in RandomizeGraph() after ") & max_fails & " attempts.");
+            break;
+        }
+
+        // pick a random edge
+        p_rank  = (genrand_int32() % (num_nodes-1)) + 1;    // shift right to not include lowest node in order
+        c_rank  = genrand_int32() % p_rank;
+
+        child = order->lData[c_rank];
+        parent = order->lData[p_rank];
+
+
+        if (fixed_order || genrand_real2() > prob_swap) {
+            if ( (*graph)(parent,child) == 0 && constraint_graph(parent,child) >= 0) {
+				// add an edge if it is absent and not banned
+                if (num_parents.lData[child] == max_parents.lData[child]) {
+					// child is already at maximum number of parents
+                    // move an edge from an existing parent to target parent
+                    _SimpleList     removeable_edges;
+
+                    // build a list of current parents
+                    for (long par = 0; par < num_nodes; par++)
+						// par is parent of child AND the edge is NOT enforced
+                        if ((*graph)(par,child) && constraint_graph(par,child)<=0) {
+                            removeable_edges << par;
+                        }
+
+                    if (removeable_edges.lLength > 0) {
+                        // shuffle the list and remove the first parent
+						removeable_edges.Permute(1);
+						graph->Store (removeable_edges.lData[0], child, 0.);
+						graph->Store (parent, child, 1.);
+						
+						/*
+                        graph->Store (removeable_edges.lData[ (long) (genrand_real2()*removeable_edges.lLength) ], child, 0.);
+                        graph->Store (parent, child, 1.);
+						 */
+                        step++;
+                    } else {
+                        // none of the edges can be removed
+                        fail++;
+                    }
+                } else {
+					// child can accept one more edge
+                    graph->Store (parent, child, 1.);
+                    num_parents.lData[child]++;
+                    step++;
+                }
+            }
+
+            else if ( (*graph)(parent,child) == 1 && constraint_graph(parent,child) <= 0) {
+				// delete an edge if it is present and not enforced
+                graph->Store (parent, child, 0.);
+                num_parents.lData[child]--;
+                step++;
+            } else {
+                fail++;
+            }
+        } else {    // swap nodes in ordering and flip edge if present
+            bool    ok_to_go = TRUE;
+
+            // P->C cannot be flipped if C->P is banned or P->C is enforced
+            if ( (*graph)(parent,child) == 1  &&  ( constraint_graph(child,parent)<0 || constraint_graph(parent,child)>0 )  ) {
+                ok_to_go = FALSE;
+            }
+
+
+            // check all other nodes affected by the swap
+            if (ok_to_go) {
+                for (long bystander, i=c_rank+1; i < p_rank; i++) {
+                    bystander = order->lData[i];    // retrieve node id
+					
+					// by flipping the parent->child edge, we would screw up ordering for
+					// an enforced edge:  C < B < P   becomes  P < B < C  where B->C or P->B is enforced.
+					// also, a banned edge implies a node ordering constraint
+                    if (
+                        ( (*graph)(parent,bystander)==1 && constraint_graph (parent, bystander)>0 )  ||
+                        ( (*graph)(bystander,child)==1 && constraint_graph (bystander, child)>0 )  ||
+                        constraint_graph (bystander,parent)<0  ||  
+						constraint_graph (child,bystander)<0
+                    ) {
+                        ok_to_go = FALSE;
+                        break;
+                    }
+                }
+            }
+
+
+            // if everything checks out OK
+            if ( ok_to_go ) {
+                if ( (*graph)(parent,child) == 1 && constraint_graph(child,parent)>=0 ) {
+					// flip the target edge
+                    graph->Store (parent, child, 0);
+                    graph->Store (child, parent, 1);
+                    num_parents.lData[child]--;
+                    num_parents.lData[parent]++;
+
+                    if (num_parents.lData[parent] > max_parents.lData[parent]) {
+                        // parent cannot accept any more edges, delete one of the edges at random (including the edge to flip)
+                        _SimpleList     removeable_edges;
+
+                        for (long par = 0; par < num_nodes; par++)
+                            if (  (*graph)(par, parent)  &&  constraint_graph(par, parent)<=0  ) {
+                                removeable_edges << par;
+                            }
+
+						removeable_edges.Permute(1);
+						graph->Store (removeable_edges.lData[0], parent, 0.);
+						/*
+                        graph->Store (removeable_edges.lData[ (long) (genrand_real2()*removeable_edges.lLength) ], parent, 0.);
+						 */
+                        num_parents.lData[parent]--;
+                    }
+
+                    step++;
+                }
+				// if the number of parents for parent node will exceed maximum, 
+				// then the edge is deleted instead of flipped (delete without add)
+
+                // swap nodes in order
+                order->lData[p_rank] = child;
+                order->lData[c_rank] = parent;	// remember to update the order matrix also!
+
+                // update edges affected by node swap
+				//  child <-  N   ...   N <- parent                   _________________,
+                //                                    becomes        |                 v
+                //                                                 parent    N         N    child
+                //                                                           ^                |
+                //                                                           `----------------+
+                for (long bystander, i = c_rank+1; i < p_rank; i++) {
+                    bystander = order->lData[i];
+
+                    if ( (*graph)(bystander, child) == 1 ) {
+                        graph->Store (bystander, child, 0);
+                        num_parents.lData[child]--;
+
+                        graph->Store (child, bystander, 1);
+                        num_parents.lData[bystander]++;
+
+                        if (num_parents.lData[bystander] > max_parents.lData[bystander]) {
+                            // number of parents for bystander node now exceeds maximum,
+                            //  select a random edge to remove - including the edge C->B we just made!
+                            _SimpleList     removeable_edges;
+
+                            for (long par = 0; par < num_nodes; par++) {
+                                if (  (*graph)(par, bystander)  &&  constraint_graph(par, bystander)<=0  ) {
+                                    removeable_edges << par;
+                                }
+							}
+							
+							
+                            removeable_edges.Permute(1);
+							graph->Store (removeable_edges.lData[0], bystander, 0.);
+							/*
+                            graph->Store (removeable_edges.lData[ (long) (genrand_real2()*removeable_edges.lLength) ], bystander, 0.);
+							 */
+                            num_parents.lData[bystander]--;
+                        }
+                    }
+
+                    if ( (*graph)(parent,bystander) == 1) {
+						// flip edge from parent to bystander (P->B)
+                        graph->Store (parent, bystander, 0);
+                        num_parents.lData[bystander]--;
+
+                        graph->Store (bystander, parent, 1);
+                        num_parents.lData[parent]++;
+
+                        if (num_parents.lData[parent] > max_parents.lData[parent]) {
+							// remove excess edge from X to parent other than bystander
+                            _SimpleList     removeable_edges;
+
+                            for (long par = 0; par < num_nodes; par++) {
+                                if (  (*graph)(par, parent)  &&  constraint_graph(par, parent)<=0  ) {
+                                    removeable_edges << par;
+                                }
+							}
+							
+                            removeable_edges.Permute(1);
+							graph->Store (removeable_edges.lData[0], parent, 0.);
+							/*
+                            graph->Store (removeable_edges.lData[ (long) (genrand_real2()*removeable_edges.lLength) ], parent, 0.);
+							 */
+                            num_parents.lData[parent]--;
+                        }
+                    }
+                }
+
+                step++;
+            } else {
+                fail++;
+            }
+        }
+    } while (step < num_steps);
+}
+
+
+
+//_______________________________________________________________________________________________________________________
+void    _BayesianGraphicalModel::OrderMetropolis (bool do_sampling, long n_steps, long sample_size, _Parameter chain_t,
+        _Matrix * result)
+{
+    /* ----------------------------------------------------------------------------------------
+        OrderMetropolis()
+
+        Execute Metropolis sampler using a swap of two nodes in an ordered sequence
+        as a proposal function.  The posterior probabilities of edges in the network are
+        stored as a member matrix [edge_posteriors].  Note that the total number of
+        possible orderings (i.e. permutations of a sequence of length N) is factorial(N),
+        and can possibly be computed exactly for N < 8.
+       ---------------------------------------------------------------------------------------- */
+    long            first_node, second_node,
+                    sample_lag = n_steps / sample_size;
+
+    _Parameter      lk_ratio,
+                    prob_current_order, prob_proposed_order, best_prob,
+                    denom;
+
+    _SimpleList     current_order, proposed_order, best_node_order,
+                    * ptr_to_order;
+
+    _List           * marginals         = new _List ();
+
+    _GrowingVector  * gv;
+
+
+    InitMarginalVectors (marginals);    // allocate storage
+
+
+
+    /* SLKP 20070926
+     Add user feedback via the console window status bar
+     */
+    VerbosityLevel();
+    long howManyTimesUpdated = 0; // how many times has the line been updated; is the same as the # of seconds
+    TimerDifferenceFunction(false); // save initial timer; will only update every 1 second
+#ifdef __HEADLESS__
+    SetStatusLine (_HYBgm_STATUS_LINE_MCMC & (do_sampling ? empty : _String(" burnin")));
+#else
+#ifndef __UNIX__
+    SetStatusLine     (empty,_HYBgm_STATUS_LINE_MCMC & (do_sampling ? empty : _String(" burnin")), empty ,0,HY_SL_TASK|HY_SL_PERCENT);
+#else
+    _String         * progressReportFile = NULL;
+    _Variable       * progressFile = CheckReceptacle (&optimizationStatusFile, empty, false);
+
+    if (progressFile->ObjectClass () == STRING) {
+        progressReportFile = ((_FString*)progressFile->Compute())->theString;
+    }
+    ConsoleBGMStatus (_HYBgm_STATUS_LINE_MCMC & (do_sampling ? empty : _String(" burnin")), -1., progressReportFile);
+#endif
+#endif
+
+    /* SLKP */
+
+
+
+    // initialize node ordering
+    if (node_order_arg.lLength > 0) {
+        current_order = node_order_arg;
+    } else {
+        ptr_to_order = GetOrderFromGraph (theStructure);
+        current_order.Duplicate(ptr_to_order);
+        DeleteObject (ptr_to_order);
+    }
+
+    best_prob = prob_current_order = Compute (current_order, marginals);
+    best_node_order = current_order;
+
+    proposed_order.Populate (num_nodes, 0, 1);
+
+    // chain
+    for (long step = 0; step < n_steps; step++) {
+        // copy over current order to proposed order
+        for (long i = 0; i < proposed_order.lLength; i++) {
+            proposed_order.lData[i] = current_order.lData[i];
+        }
+
+
+        // swap random nodes in ordered sequence
+        first_node  = genrand_int32() % num_nodes;
+        second_node = genrand_int32() % num_nodes;
+
+        while (first_node == second_node) {
+            second_node = genrand_int32() % num_nodes;
+        }
+
+        proposed_order.Swap (first_node, second_node);
+
+
+        // compute likelihood ratio of proposed : current orders
+        prob_proposed_order = Compute (proposed_order, marginals);
+        lk_ratio            = exp(prob_proposed_order - prob_current_order);
+
+        if (lk_ratio > 1. || genrand_real2() < lk_ratio) {  // then set current to proposed order
+            current_order = proposed_order;
+            prob_current_order = prob_proposed_order;
+
+            if (prob_proposed_order > best_prob) {
+                best_prob = prob_proposed_order;        // update best node ordering
+                best_node_order = proposed_order;
+            }
+        }
+
+
+        // if past burn-in period and at sampling step, record trace and marginals
+        if (do_sampling) {
+            if (step % sample_lag == 0) {
+				ReportWarning(_String("At step ") & step & " order: " & (_String *) current_order.toStr());
+				
+                result->Store (step / sample_lag, 0, prob_current_order);
+
+                for (long child = 0; child < num_nodes; child++) {
+                    // retrieve information from Compute()
+                    gv      = (_GrowingVector *) marginals->lData[child * num_nodes + child];
+                    denom   = (*gv)(0, 0);  // first entry holds node marginal post pr
+
+                    for (long edge, parent = 0; parent < num_nodes; parent++) {
+                        if (parent == child) {
+                            continue;
+                        }
+
+                        edge    = child * num_nodes + parent;
+                        gv      = (_GrowingVector *) marginals->lData[edge];
+
+                        // not all _GrowingVector entries in marginals are being used,
+                        //      i.e., edges incompatible with order
+                        if (gv->GetUsed() > 0) {
+							// store as transpose so that row = parent and column = child, same as GraphMCMC
+                            result->Store (parent*num_nodes+child, 1, (*result)(parent*num_nodes+child, 1) + exp (LogSumExpo(gv) - denom));
+                        }
+                    }
+                }
+            }
+        }
+
+
+        /*SLKP 20070926; include progress report updates */
+        if (TimerDifferenceFunction(true)>1.0) { // time to update
+            howManyTimesUpdated ++;
+            _String statusLine = _HYBgm_STATUS_LINE_MCMC & (do_sampling ? empty : _String(" burnin")) & " " & (step+1) & "/" & n_steps
+                                 & " steps (" & (1.0+step)/howManyTimesUpdated & "/second)";
+#if  defined __HEADLESS__
+            SetStatusLine (statusLine);
+#else
+#if !defined __UNIX__
+            SetStatusLine     (empty,statusLine,empty,100*step/(n_steps),HY_SL_TASK|HY_SL_PERCENT);
+            yieldCPUTime(); // let the GUI handle user actions
+            if (terminateExecution) { // user wants to cancel the analysis
+                break;
+            }
+#endif
+#if defined __UNIX__ && ! defined __HEADLESS__ 
+            ConsoleBGMStatus (statusLine, 100.*step/(n_steps), progressReportFile);
+#endif
+#endif
+
+            TimerDifferenceFunction(false); // reset timer for the next second
+        }
+        /* SLKP */
+
+    }
+    // chain terminates
+
+
+    // convert sums of edge posterior probs. in container to means
+    for (long edge = 0; edge < num_nodes * num_nodes; edge++) {
+        result->Store (edge, 1, (*result)(edge,1) / sample_size);
+    }
+
+
+    // export node ordering info
+    for (long node = 0; node < num_nodes; node++) {
+        result->Store (node, 2, (_Parameter) (best_node_order.lData[node]));
+        result->Store (node, 3, (_Parameter) (current_order.lData[node]));
+    }
+
+
+    DumpMarginalVectors (marginals);
+
+
+    /*SLKP 20070926; include progress report updates */
+#if !defined __UNIX__ || defined __HEADLESS__ || defined __HYPHYQT__ || defined __HYPHY_GTK__
+    SetStatusLine     (_HYBgm_STATUS_LINE_MCMC_DONE);
+#endif
+#if defined __UNIX__ && ! defined __HEADLESS__ && !defined __HYPHYQT__ && !defined __HYPHY_GTK__
+    ConsoleBGMStatus (_HYBgm_STATUS_LINE_MCMC_DONE, -1.0, progressReportFile);
+#endif
+    /* SLKP */
+
+
+    // update node order
+    node_order_arg = current_order;
+    ReportWarning (_String("Set node_order_arg to last order visited in orderMCMC:\n") & (_String*)node_order_arg.toStr());
+}
+
+
+
+
+
+
diff --git a/src/new/bayesgraph2.cpp b/src/new/bayesgraph2.cpp
new file mode 100644
index 0000000..5737e52
--- /dev/null
+++ b/src/new/bayesgraph2.cpp
@@ -0,0 +1,1801 @@
+/*
+ 
+ HyPhy - Hypothesis Testing Using Phylogenies.
+ 
+ Copyright (C) 1997-now
+ Core Developers:
+ Sergei L Kosakovsky Pond (spond at ucsd.edu)
+ Art FY Poon    (apoon at cfenet.ubc.ca)
+ Steven Weaver (sweaver at ucsd.edu)
+ 
+ Module Developers:
+ Lance Hepler (nlhepler at gmail.com)
+ Martin Smith (martin.audacis at gmail.com)
+ 
+ Significant contributions from:
+ Spencer V Muse (muse at stat.ncsu.edu)
+ Simon DW Frost (sdf22 at cam.ac.uk)
+ 
+ Permission is hereby granted, free of charge, to any person obtaining a
+ copy of this software and associated documentation files (the
+ "Software"), to deal in the Software without restriction, including
+ without limitation the rights to use, copy, modify, merge, publish,
+ distribute, sublicense, and/or sell copies of the Software, and to
+ permit persons to whom the Software is furnished to do so, subject to
+ the following conditions:
+ 
+ The above copyright notice and this permission notice shall be included
+ in all copies or substantial portions of the Software.
+ 
+ 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.
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ 
+ */
+
+
+#include "bayesgraph.h"
+
+extern _String      _HYBgm_IMPUTE_MAXSTEPS,
+       _HYBgm_IMPUTE_BURNIN,
+       _HYBgm_IMPUTE_SAMPLES;
+
+extern _Parameter   lnGamma (_Parameter),
+       gaussDeviate (void),
+       LogSumExpo (_GrowingVector *);
+
+
+
+
+//___________________________________________________________________________________________
+void _BayesianGraphicalModel::SerializeBGM (_String & rec)
+{
+    /* --------------------------------------------------------------------
+        ExportModel()
+            Export the network structure and parameters as an associative
+            array.
+       -------------------------------------------------------------------- */
+
+    ReportWarning (_String("Entered _BayesianGraphicalModel::ExportModel()"));
+
+    if (theData.GetHDim() > 0) {
+        _String *   bgmName = (_String *) bgmNamesList (bgmList._SimpleList::Find((long)this));
+        _String     bgmNameLocal;
+        _String     nodeKey;
+
+        bgmNameLocal.Duplicate(bgmName);
+        bgmNameLocal << "_export";
+
+        rec << bgmNameLocal;
+        rec << "={};\n";
+
+        for (long node = 0; node < num_nodes; node++) {
+            nodeKey = bgmNameLocal & "[\"" & node & "\"]";
+
+            rec << nodeKey;
+            rec << " = {};\n";
+
+            // record node type
+            rec << '(';
+            rec << nodeKey;
+            rec << ")[\"NodeType\"] = ";
+            rec << _String(node_type.lData[node]);
+            rec << ";\n";
+
+            // record parents as _Matrix object
+            _SimpleList parents,
+                        d_parents, c_parents;
+
+            for (long pnode = 0; pnode < num_nodes; pnode++) {
+                if (pnode == node) {
+                    continue;
+                }
+                if (theStructure(pnode,node) == 1) {
+                    parents << pnode;
+
+                    if (node_type.lData[pnode] == 0) {
+                        d_parents << pnode;
+                    } else {
+                        c_parents << pnode;
+                    }
+                }
+            }
+
+            rec << '(';
+            rec << nodeKey;
+            rec << ")[\"Parents\"] = {";
+            rec << _String((_String *)parents.toStr());
+            rec << "};\n";
+
+            // record network parameters as conditional probability density functions
+            rec << '(';
+            rec << nodeKey;
+            rec << ")[\"CPDFs\"] = {{";
+
+
+            // posterior probability density functions (PDFs) conditional on child node state (indexed by i)
+            if (node_type.lData[node] == 0) {
+                // discrete child node, compute Dirichlet hyperparameters
+                _Matrix     n_ij, n_ijk;
+
+
+                // tally cases by discrete parent combination and child state
+                UpdateDirichletHyperparameters (node, d_parents, &n_ij, &n_ijk);
+
+
+                // report posterior Dirichlet PDFs
+                for (long j = 0; j < n_ij.GetHDim(); j++) {
+                    rec << "\"Random({{";
+                    for (long k = 0; k < num_levels.lData[node]; k++) { // k indexes child node states
+                        rec << _String(n_ijk(j,k));
+                        if (k < num_levels.lData[node]-1) {
+                            rec << ',';
+                        }
+                    }
+                    rec << "}},{\\\"PDF\\\":\\\"Dirichlet\\\"})\"";
+                    if (j < n_ij.GetHDim()-1) {
+                        rec << ',';
+                    }
+                }
+            }
+
+            else if (node_type.lData[node] == 1) {  // CG child node
+                long            k                   = c_parents.lLength,        // a useful short-hand
+                                num_parent_combos = 1;
+
+                _SimpleList     multipliers ((long)1),
+                                n_ij, pa_indexing;
+
+                _Parameter      rho_prior   = prior_sample_size (node, 0) > 0 ? (prior_sample_size (node, 0) / num_parent_combos) : 1.0,
+                                phi_prior = prior_scale (node, 0);
+
+                _Matrix         mu_prior (k+1, 1, false, true),
+                                tau_prior (k+1, k+1, false, true);
+
+
+                // index cases by discrete parent configurations
+                for (long par = 0; par < d_parents.lLength; par++) {
+                    num_parent_combos *= num_levels.lData[d_parents.lData[par]];
+                    multipliers << num_parent_combos;
+                }
+
+                n_ij.Populate (num_parent_combos, 0, 0);
+                pa_indexing.Populate (theData.GetHDim(), 0, 0);
+
+                if (d_parents.lLength > 0) {
+                    for (long obs = 0; obs < theData.GetHDim(); obs++) {
+                        long    index       = 0,
+                                multiplier = 1;
+
+                        for (long par = 0; par < d_parents.lLength; par++) {
+                            long    this_parent     = parents.lData[par];
+
+                            index += theData(obs, this_parent) * multiplier;    // max index = sum (parent * levels(parent))
+                            multiplier *= num_levels.lData[this_parent];
+                        }
+
+                        pa_indexing.lData[obs] = index;
+                        n_ij.lData[index] += 1;
+                    }
+                } else {
+                    n_ij.lData[0] = theData.GetHDim();
+                }
+
+
+                // set CG hyperparameter priors (independent of discrete parent config)
+                for (long row = 0; row < k+1; row++) {
+                    for (long col = 0; col < k+1; col++) {
+                        if (row == col) {   // set diagonal entries
+                            if (row == 0) {
+                                tau_prior.Store (0, 0, prior_precision (node, 0));
+                            } else {
+                                tau_prior.Store (row, col, prior_precision (c_parents.lData[row],0));
+                            }
+                        } else {
+                            tau_prior.Store (row, col, 0.);    // zero off-diagonal entries
+                        }
+                    }
+                }
+
+
+                mu_prior.Store (0, 0, prior_mean (node, 0));                // prior intercept
+                for (long i = 1; i < k+1; i++) {
+                    mu_prior.Store (i, 0, 0);    // set prior expectation of regression coefficients to zero
+                }
+
+
+                // for every discrete parent config (on which CG marginal distribution is conditioned)
+                for (long pa = 0; pa < num_parent_combos; pa++) {
+                    // compute summary statistics
+                    _Matrix     zbpa (n_ij.lData[pa], k+1, false, true),
+                                yb (n_ij.lData[pa], 1, false, true);
+
+                    for (long count_n = 0, obs = 0; obs < theData.GetHDim(); obs++) {
+                        if (pa_indexing.lData[obs] == pa) {
+                            zbpa.Store (count_n, 0, 1);
+                            for (long cpar = 0; cpar < k; cpar++) {
+                                zbpa.Store (count_n, cpar+1, theData(obs, c_parents.lData[cpar]));
+                            }
+
+                            yb.Store (count_n, 0, theData(obs, node));
+
+                            count_n++;
+                        }
+                    }
+
+
+                    // update CG hyperparameters with summary statistics (y_b, Z_bpa, n_ij)
+                    _Matrix     t_zbpa = zbpa;
+                    t_zbpa.Transpose();
+                    t_zbpa *= zbpa;     // Z^T x Z
+
+                    _Matrix     tau (tau_prior);    // duplicator
+                    tau += t_zbpa;
+
+                    _Matrix     temp (tau_prior);
+                    temp *= mu_prior;
+                    _Matrix     mu (temp);
+                    temp = zbpa;
+                    temp.Transpose();
+                    temp *= yb;
+                    mu += temp;
+
+                    _Matrix     * tauinv = (_Matrix *) tau.Inverse();
+                    temp = *tauinv;
+                    temp *= mu;
+                    mu = temp;
+
+					DeleteObject (tauinv);
+					
+                    _Parameter  rho = rho_prior + n_ij.lData[pa],
+                                phi = phi_prior;
+
+                    temp = zbpa;
+                    temp *= mu;
+                    temp *= -1;
+                    temp += yb;
+                    temp.Transpose();
+
+                    temp *= yb;
+                    phi += temp(0,0);
+
+                    temp = mu_prior;
+                    temp -= mu;
+                    temp.Transpose();
+                    temp *= tau_prior;
+                    temp *= mu_prior;
+
+                    phi += temp(0,0);
+
+                    // report CG posterior distributions to output string
+                    rec << "\"Random(";
+                    rec << _String((_String *)mu.toStr());
+                    rec << ",{\\\"PDF\\\":\\\"Gaussian\\\",\\\"ARG0\\\":Random({{";
+                    rec << _String(phi);
+                    rec << "}},{\\\"PDF\\\":\\\"InverseWishart\\\",\\\"ARG0\\\":{{";
+                    rec << _String(rho);
+                    rec << "}}})*";
+                    rec << _String((_String*)tau.Inverse()->toStr());
+                    rec << "})\"";
+
+                    if (pa < num_parent_combos-1) {
+                        rec << ',';
+                    }
+                }
+
+            }
+
+            rec << "}};\n"; // end matrix entry of conditional PDFs.
+        }
+    } else {
+        WarnError (_String("Cannot export network parameters, this _BayesianGraphicalModel object has no data!"));
+    }
+}
+
+
+
+
+//___________________________________________________________________________________________
+bool _BayesianGraphicalModel::ImportCache (_AssociativeList * cache_import)
+{
+    //  Unpack contents of associative list sent from HBL.
+    //   use to restore node score cache as an alternative to computing scores
+    //   de novo from data -- particularly useful for time-consuming imputation
+    //   in cases of missing data
+    ReportWarning (_String("Entered ImportCache() with avl: ") & (_String *) cache_import->toStr());
+
+    _String         keyString;
+    _PMathObj       valuePtr;
+
+    if (scores_cached) {
+        ReportWarning (_String("WARNING: Overwriting pre-existing node score cache in bayesgraph2.cpp:ImportCache()"));
+    }
+
+    for (long node = 0; node < num_nodes; node++) {
+        _String     errMsg;
+        _List   *   node_scores = (_List *) node_score_cache.lData[node];
+
+        node_scores->Clear();
+
+        for (long num_parents = 0; num_parents <= max_parents.lData[node]; num_parents++) {
+            keyString = _String("Node") & node & "NumParents" & num_parents;
+
+            if (num_parents == 0) {
+                if ((valuePtr = cache_import->GetByKey(keyString, NUMBER))) {
+                    (*node_scores) && (_Constant *) valuePtr;    // append duplicate
+                } else {
+                    errMsg = _String ("Expecting numerical value in associative list for key ") & keyString;
+                }
+            } else if (num_parents == 1) {
+                if ((valuePtr = cache_import->GetByKey(keyString, MATRIX))) {
+                    (*node_scores) && (_Matrix *) valuePtr;
+                } else {
+                    errMsg = _String ("Expecting matrix in associative list for key ") & keyString;
+                }
+            } else {
+                if ((valuePtr = cache_import->GetByKey(keyString, MATRIX))) {
+                    (*node_scores) && (_NTupleStorage *) valuePtr;
+                } else {
+                    errMsg = _String("Expecting matrix (_NTupleStorage) object in associative list for key ") & keyString;
+                }
+            }
+        }
+
+        if (errMsg) {
+            WarnError (errMsg);
+            return false;
+        }
+    }
+
+    scores_cached = TRUE;
+    return true;
+}
+
+
+//___________________________________________________________________________________________
+bool _BayesianGraphicalModel::ExportCache (_AssociativeList * cache_export)
+{
+    // Export an associative list containing node_score_cache contents to HBL
+    //  entries are indexed by key string referring to child node and number of parents,
+    //      e.g. "N0P2" refers to scores associated with child node 0 and two parents
+    _String         keyString;
+
+    _List           * this_list;
+    _Constant       * orphan_score;
+    _Matrix         * single_parent_scores;
+    _NTupleStorage  * family_scores;
+
+    if (scores_cached) {
+        ReportWarning (_String("Exporting cache with ") & num_nodes & " nodes");
+
+        for (long node = 0; node < num_nodes; node++) {
+            this_list = (_List *) node_score_cache.lData[node];
+
+            for (long npar = 0; npar <= max_parents.lData[node]; npar++) {
+                keyString = _String ("Node") & node & "NumParents" & npar;
+                _FString    aKey (keyString, false);
+
+                ReportWarning (_String("Inserting with key ") & keyString);
+
+                if (npar == 0) {
+                    orphan_score = (_Constant *) this_list->lData[npar];
+                    cache_export->MStore (&aKey, orphan_score, true);   // make a dynamic copy
+                } else if (npar == 1) {
+                    single_parent_scores = (_Matrix *) this_list->lData[npar];
+                    cache_export->MStore (&aKey, single_parent_scores, true);   // make a dynamic copy
+                } else {
+                    family_scores = (_NTupleStorage *) this_list->lData[npar];
+                    cache_export->MStore (&aKey, family_scores, true);  // make a dynamic copy
+                }
+            }
+        }
+
+        return TRUE;
+    } else {
+        WarnError (_String ("Unable to export node score cache, no cache exists!"));
+        return FALSE;
+    }
+}
+
+
+
+
+//___________________________________________________________________________________________
+// #define _DEBUG_CCS_
+_Parameter _BayesianGraphicalModel::ComputeContinuousScore (long node_id)
+{
+    _SimpleList parents;
+
+    // generate lists of discrete or continuous parents from graph
+    for (long par = 0; par < num_nodes; par++) {
+        if (theStructure(par, node_id) == 1) {
+            parents << par;
+        }
+    }
+
+    return ComputeContinuousScore (node_id, parents);
+}
+
+
+_Parameter _BayesianGraphicalModel::ComputeContinuousScore (long node_id, _Matrix &dag)
+{
+    _SimpleList     parents;
+
+    for (long par = 0; par < num_nodes; par++) {
+        // support for discrete parents only
+        if (dag(par, node_id) == 1) {
+            parents << par;
+        }
+    }
+    return ComputeContinuousScore (node_id, parents);
+}
+
+
+//___________________________________________________________________________________________
+
+_Parameter _BayesianGraphicalModel::ComputeContinuousScore (long node_id, _SimpleList & parents)
+{
+    /* ---------------------------------------------------------------------------
+        ComputeContinuousScore()
+            Returns the network score based on Bottcher's formulation.
+            Note, does not update posterior distributions of hyperparameters,
+            this requires a separate albeit highly similar function.
+       ----------------------------------------------------------------------------- */
+
+    //ReportWarning (_String ("Called ComputeContinuousScore with ") & node_id & " <- " & (_String *) parents.toStr());
+
+
+    long            k;
+    _Parameter      log_score = 0.;
+    _SimpleList     c_parents, d_parents;
+
+
+    // use cached node scores if available
+    if (scores_cached) {
+        _List *     scores  = (_List *) node_score_cache.lData[node_id];
+
+        if (parents.lLength == 0) {
+            _Constant *     orphan_score = (_Constant *) scores->lData[0];
+            return (_Parameter) orphan_score->Value();
+        } else if (parents.lLength == 1) {
+            _Matrix *   single_parent_scores = (_Matrix *) scores->lData[1];
+            return (_Parameter) (*single_parent_scores) (parents.lData[0], 0);
+        } else {
+            _NTupleStorage *    family_scores   = (_NTupleStorage *) scores->lData[parents.lLength];
+            _SimpleList         nktuple;
+
+            for (long i = 0; i < parents.lLength; i++) {    // map parents back to nk-tuple
+                long    par = parents.lData[i];
+                if (par > node_id) {
+                    par--;
+                }
+                nktuple << par;
+            }
+            return (_Parameter) family_scores->Retrieve (nktuple);  // using nk-tuple
+        }
+    }
+
+
+    if (theData.GetHDim() == 0) {
+        WarnError (_String ("Uh-oh, there's no node score cache nor is there any data matrix to compute scores from!"));
+        return 0.;
+    }
+
+	
+	// impute score if missing data
+	if (has_missing.lData[node_id]) {
+		return ImputeCGNodeScore (node_id, parents);
+	} else {
+		for (long par = 0; par < parents.lLength; par++) {
+			if (has_missing.lData[parents.lData[par]]) {
+				return ImputeCGNodeScore (node_id, parents);
+			}
+		}
+	}
+	
+
+    // partition parent list into discrete and continuous
+    for (long p = 0; p < parents.lLength; p++) {
+        if (node_type.lData[parents.lData[p]] == 0) {   // discrete
+            d_parents << parents.lData[p];	// note these are network-level node indices
+        } else {
+            c_parents << parents.lData[p];
+        }
+    }
+    k = c_parents.lLength;
+
+
+    // if there are discrete parents then integrate over marginal posteriors conditioned on discrete parent states
+
+	long            num_parent_combos = 1;
+	_SimpleList     multipliers ((long)1);
+
+
+	// how many combinations of parental states are there?
+	for (long par = 0; par < d_parents.lLength; par++) {
+		num_parent_combos *= num_levels.lData[d_parents.lData[par]];
+		multipliers << num_parent_combos;
+	}
+
+
+
+	// count up number of data points per discrete parent combination
+	_SimpleList     n_ij,               // CAVEAT: other functions use _Matrix for this object
+					pa_indexing;        // track discrete parent combinations per observation
+
+	n_ij.Populate (num_parent_combos, 0, 0);
+	pa_indexing.Populate (theData.GetHDim(), 0, 0);
+
+	for (long obs = 0; obs < theData.GetHDim(); obs++) {
+		long    index       = 0,
+				multiplier = 1;
+
+		for (long par = 0; par < d_parents.lLength; par++) {
+			long    this_parent     = d_parents.lData[par];
+
+			index += theData(obs, this_parent) * multiplier;    // max index = sum (parent * levels(parent))
+			multiplier *= num_levels.lData[this_parent];
+		}
+
+		pa_indexing.lData[obs] = index;
+		n_ij.lData[index] += 1;
+	}
+
+
+	// set hyperparameter priors -- they will not be modified on pass to BottcherScore() so keep outside loop
+	_Matrix     tau (k+1, k+1, false, true),
+				mu (k+1, 1, false, true);
+
+	_Parameter  rho     = prior_sample_size (node_id, 0) > 0 ? (prior_sample_size (node_id, 0) / num_parent_combos) : 1.0,
+				phi      = prior_scale (node_id, 0);
+
+	for (long row = 0; row < k+1; row++) {
+		for (long col = 0; col < k+1; col++) {
+			if (row == col) {   // set diagonal entries
+				if (row == 0) {
+					tau.Store (0, 0, prior_precision (node_id, 0));
+				} else {
+					tau.Store (row, col, prior_precision (c_parents.lData[row-1],0));
+				}
+			} else {
+				tau.Store (row, col, 0.);    // zero off-diagonal entries
+			}
+		}
+	}
+
+	mu.Store (0, 0, prior_mean (node_id, 0));               // prior intercept
+	for (long i = 1; i < mu.GetHDim(); i++) {
+		mu.Store (i, 0, 0);    // set prior expectation of regression coefficients to zero
+	}
+
+
+	// for every discrete parent combination (on which Gaussian node state is conditioned)
+	for (long pa = 0; pa < num_parent_combos; pa++) {
+		// collect cases into a batch defined by discrete parent states
+		_Matrix     zbpa (n_ij.lData[pa], k+1, false, true),
+					yb (n_ij.lData[pa], 1, false, true);
+
+		for (long count_n = 0, obs = 0; obs < theData.GetHDim(); obs++) {
+			if (pa_indexing.lData[obs] == pa) {
+				// populate zbpa matrix with (1, y_1, y_2, ..., y_m) entries for this parental combo
+				zbpa.Store (count_n, 0, 1);
+				for (long cpar = 0; cpar < k; cpar++) {
+					zbpa.Store (count_n, cpar+1, theData(obs, c_parents.lData[cpar]));
+				}
+
+				yb.Store (count_n, 0, theData(obs, node_id));
+
+				count_n++;
+			}
+		}
+		/*
+		ReportWarning (_String("Calling BottcherScore() for node ") & node_id & ", parents " & (_String *)parents.toStr() & ", pa=" & pa);
+		ReportWarning (_String("yb=") & (_String *) yb.toStr());
+		ReportWarning (_String("zpba=") & (_String *) zbpa.toStr());
+		ReportWarning (_String("tau=") & (_String *) tau.toStr());
+		ReportWarning (_String("mu=") & (_String *) mu.toStr());
+		ReportWarning (_String("rho=") & rho);
+			*/
+		log_score += BottcherScore (yb, zbpa, tau, mu, rho, phi, n_ij.lData[pa]);
+	}
+
+
+    return log_score;
+}
+
+
+
+//___________________________________________________________________________________________________
+
+_Parameter  _BayesianGraphicalModel::BottcherScore (_Matrix & yb, _Matrix & zbpa, _Matrix & tau, _Matrix & mu, _Parameter rho, _Parameter phi, long batch_size)
+{
+    /* -------------------------------------------------------------------------------
+     Compute the conditional Gaussian network score of node [c] according to
+     Susanne G. Bottcher's formulation.
+
+     Let [y] denote the set of other continuous nodes.
+     Let [i] denote the set of discrete nodes.
+     Let [pa] define a subset of continuous or discrete nodes on [c]
+
+     Assume local probability distribution is Gaussian local regression on
+     continuous parents, with parameters conditional on discrete parent
+     configuration [pa_i].  This has parameters:
+
+     beta (c | pa_i(c))     = vector of regression coefficients over
+                                pa_y (continuous parents)
+     m (c | pa_i(c))        = regression intercept
+     sigma^2 (c | pa_i(c))  = variance conditional on discrete parent
+                                configuration
+
+     Hence, for a case {y_1, y_2, ..., y_c-1, y_c+1, ..., y_m, i_1, i_2, ..., i_n},
+     (y_c | pa_i(c) ~ Gaussian(m + beta_1 y_1 + ... + beta_m y_m, sigma^2)
+
+     but conditional variance (sigma^2) is unknown.
+
+     Posterior distributions are:
+        (m, beta | sigma^2) ~ Gaussian (mu, sigma^2 tau^-1)
+        (sigma^2) ~ Inverse-Gamma ( rho_{y|pa_i(y)} / 2, phi_{y|pa_i(y)} / 2)
+
+     given the hyperparameters:
+     mu     - mean vector (intercept, regression coefficients...) [(k+1) x 1 matrix]
+     tau    - precision [(k+1) x (k+1) matrix]
+     rho    - degrees of freedom for inverse Gamma conjugate prior [scalar]
+     phi    - scale parameter for inverse Gamma conjugate prior [scalar]
+    --------------------------------------------------------------------------------- */
+
+    // ReportWarning (_String("Entered BottcherScore()"));
+
+    // calculate scale parameter for non-central t distribution
+    // from S. Bottcher (2001) p.25
+
+
+    // zbpa is a {N x (k+1)} matrix where 'k' is the number of continuous parents
+    //  so if there are no parents then it is a column vector of length N (number of cases in data)
+    _Matrix temp_mat (zbpa);
+
+    //ReportWarning (_String("zbpa = ") & (_String *) temp_mat.toStr());
+
+	if (tau.GetHDim() == 1 && tau.GetVDim() == 1) {
+		temp_mat *= 1/(tau(0,0)); // just use scalar multiplication of the reciprocal
+	} else {
+		_Matrix * tauinv = (_Matrix *) tau.Inverse();
+		temp_mat *= *tauinv;
+		DeleteObject (tauinv);
+	}
+
+    //ReportWarning (_String("... %*% tau^(-1) = ") & (_String *) temp_mat.toStr());
+
+    _Matrix t_zbpa (zbpa);
+    t_zbpa.Transpose();
+
+    temp_mat *= t_zbpa;
+
+    //ReportWarning (_String("... %*% zbpa^T = ") & (_String *) temp_mat.toStr());
+
+    for (long row = 0; row < temp_mat.GetHDim(); row++) {
+        temp_mat.Store (row, row, temp_mat(row,row)+(_Parameter)1.);    // add identity matrix
+    }
+
+    //ReportWarning (_String("... + I = ") & (_String *) temp_mat.toStr());
+
+    _Matrix scale (temp_mat);
+    scale *= phi / rho;
+
+    //ReportWarning (_String("scale = ") & (_String *) scale.toStr());
+
+    // calculate the determinant of scale parameter matrix
+    _Parameter      pi_const = 3.141592653589793;
+
+    temp_mat = scale;
+    temp_mat *= (_Parameter) (pi_const * rho);
+	
+	//ReportWarning (_String("BottcherScore() calling Eigensystem on matrix ") & (_String *) temp_mat.toStr() );
+	
+    _AssociativeList *  eigen       = (_AssociativeList *) temp_mat.Eigensystem();
+	
+	// sometimes the eigendecomposition fails
+	if ( (eigen->GetKeys())->lLength == 0 ) {
+		WarnError (_String("Eigendecomposition failed in bayesgraph2.cpp BottcherScore()."));
+		return -A_LARGE_NUMBER;
+	}
+	
+    _Matrix *           eigenvalues = (_Matrix *)eigen->GetByKey(0, MATRIX);
+    _Parameter          log_det         = 0.;   // compute determinant on log scale to avoid overflow
+
+    // determinant is product of eigenvalues (should be > 0 for positive definite matrices)
+    for (long i = 0; i < eigenvalues->GetHDim(); i++) {
+        log_det += log((*eigenvalues) (i,0));
+    }
+	
+	DeleteObject (eigen);
+	
+    //ReportWarning (_String("log(det) = ") & log_det);
+
+    // calculate first term of score
+    _Parameter  pa_log_score = 0.;
+
+    pa_log_score += lnGamma((rho + batch_size)/2.);
+    pa_log_score -= lnGamma(rho/2.) + 0.5 * log_det;
+
+
+    // calculate second term of score
+    _Matrix     next_mat (yb);  // N x 1
+
+    temp_mat = zbpa;        // N x (k+1)
+    temp_mat *= mu;         // (k+1) x 1
+    next_mat -= temp_mat;   // (yb - zbpa %*% mu)
+    next_mat.Transpose();
+
+    temp_mat = next_mat;
+	
+	_Matrix * scaleinv = (_Matrix *) scale.Inverse();
+	
+    temp_mat *= *scaleinv;  // N x N
+	
+	DeleteObject (scaleinv);
+	
+    next_mat.Transpose();
+    temp_mat *= next_mat;
+    temp_mat *= (_Parameter) 1./rho;
+
+    //ReportWarning (_String ("2nd term = ") & (_Parameter) temp_mat(0,0));
+
+    pa_log_score += -(rho + batch_size)/2. * log(1. + temp_mat(0,0));
+
+
+    //ReportWarning (_String("BottcherScore() returning with log L = ") & pa_log_score);
+
+    return pa_log_score;
+}
+
+
+
+//___________________________________________________________________________________________________
+_Parameter _BayesianGraphicalModel::ImputeDiscreteNodeScore (long node_id, _SimpleList & parents)
+{
+    /* ---------------------------------------------------------------------------------------
+	 ImputeDiscreteNodeScore
+		Impute (i.e., "fill in") missing values in the data.  More exactly, take the
+	 expectation of node score over imputations of the data sampled using Gibbs
+	 sampling.  Missing values are flagged for discrete data by negative values.
+	 --------------------------------------------------------------------------------------- */
+	
+	long            num_parent_combos   = 1,
+					r_i                 = num_levels.lData[node_id],	// number of levels for child node
+					max_num_levels		= r_i,
+					family_size			= parents.lLength + 1,
+					sampling_interval,
+					parent_state,
+					child_state;
+	
+	_SimpleList     multipliers (1, 1, 0),  // length constructor, populator
+					family_nlevels (family_size, 0, 0),
+					is_missing,		// store linear indices to missing entries in deep copy
+					pa_indices;
+	
+	
+	_Matrix         n_ijk, n_ij,	// summary statistics for discrete node
+					data_deep_copy,
+					observed_values;
+	
+	
+    _GrowingVector  * vector_of_scores  = new _GrowingVector(),     // store scores sampled during imputation
+					* reassign_probs    = new _GrowingVector();
+    
+	
+	_Parameter      log_score           = 0,
+					denom, this_prob,
+					impute_maxsteps, impute_burnin, impute_samples; // HBL settings
+    
+	double			urn;	// uniform random number
+	
+	
+	
+	// set Gibbs sampler parameters from batch language definitions
+    checkParameter (_HYBgm_IMPUTE_MAXSTEPS, impute_maxsteps, 0);
+    checkParameter (_HYBgm_IMPUTE_BURNIN, impute_burnin, 0);
+    checkParameter (_HYBgm_IMPUTE_SAMPLES, impute_samples, 0);
+	
+    if (impute_maxsteps <= 0 || impute_burnin < 0 || impute_samples <= 0 || impute_samples > impute_maxsteps) {
+        WarnError (_String("ERROR: Invalid IMPUTE setting(s) in ImputeNodeScore()"));
+        return 0.;
+    }
+
+	// number of steps between samples
+    sampling_interval = (long) (impute_maxsteps / impute_samples);
+	
+	
+	family_nlevels.lData[0] = r_i; // for more convenient look-up
+	
+    for (long nlev, p = 0; p < parents.lLength; p++) {
+		nlev = family_nlevels.lData[p+1] = num_levels.lData[parents.lData[p]];
+		num_parent_combos *= nlev;
+		multipliers << num_parent_combos;
+		if (nlev > max_num_levels)  {
+			max_num_levels = nlev;
+		}
+	}
+	
+	
+	
+    // allocate space to matrices
+    CreateMatrix (&n_ijk, num_parent_combos, r_i, false, true, false);
+    CreateMatrix (&n_ij, num_parent_combos, 1, false, true, false);
+    CreateMatrix (&data_deep_copy, theData.GetHDim(), family_size, false, true, false);
+	
+    pa_indices.Populate(theData.GetHDim(), 0, 0);
+	
+	
+    // allocate space to _GrowingVector object -- used for imputing discrete nodes only
+    for (long pa = 0; pa < num_parent_combos; pa++) {
+        reassign_probs->Store (0.);
+    }
+	
+	
+	
+    // for discrete nodes, the j-th column tallies the number of observed instances of j-th level
+    CreateMatrix (&observed_values, family_size, (max_num_levels > 3) ? max_num_levels : 3, false, true, false);
+	
+	
+    // make deep copy, annotate which entries are missing, and record empirical distributions
+    for (long row = 0; row < theData.GetHDim(); row++) {
+        // findex = family-wise index
+        for (long fnode, fstate, findex = 0; findex < family_size; findex++) {
+            fnode = (findex == 0) ? node_id : parents.lData[findex-1];  // parent node, get network-wide index
+            fstate = theData (row, fnode);
+            data_deep_copy.Store (row, findex, fstate);
+			
+			if (fstate < 0) {
+				// store location of missing entry by linear index
+				is_missing << row * family_size + findex;
+			} else {
+				// use state to index into vector and increment counter
+				observed_values.Store (findex, fstate, observed_values(findex,fstate) + 1);
+			}
+        }
+    }
+	
+	
+	
+    // make a decision whether to use empirical or prior distribution to do initial imputations
+    for (long obs_total, fnode, findex = 0; findex < family_size; findex++) {
+        obs_total = 0;
+        fnode = (findex == 0) ? node_id : parents.lData[findex-1];
+		
+        // count non-missing entries across states for this node
+		for (long lev = 0; lev < family_nlevels.lData[findex]; lev++) {
+			obs_total += observed_values (findex, lev);    
+		}
+		
+		if (obs_total < MIN_SAMPLE_SIZE) {   
+			// not enough observations - sample from prior given hyperparameters
+			_Matrix imaginary_sample_counts;
+			
+			CreateMatrix (&imaginary_sample_counts, family_nlevels.lData[findex], 1, false, true, false);
+			
+			for (long lev = 0; lev < family_nlevels.lData[findex]; lev++) {
+				imaginary_sample_counts.Store (lev, 0, prior_sample_size (fnode, 0) / family_nlevels.lData[findex] + DIRICHLET_FLATTENING_CONST);
+			}
+			
+			// random deviate from Dirichlet distribution parameterized by imaginary sample size hyperparameters
+			_Matrix * result = (_Matrix *) imaginary_sample_counts.DirichletDeviate();
+			
+			for (long lev = 0; lev < family_nlevels.lData[findex]; lev++) {
+				observed_values.Store (findex, lev, (*result) (lev,0));
+			}
+			
+			DeleteObject (result);
+		} else {
+			// normalize counts to get empirical distribution
+			for (long lev = 0; lev < family_nlevels.lData[findex]; lev++) {
+				observed_values.Store (findex, lev, observed_values(findex, lev) / (_Parameter) obs_total);
+			}
+		}
+    }
+	
+	
+	
+    // initialize missing entries to random assignments based on observed cases or prior info
+    for (long fnode, row, col, missing_idx = 0; missing_idx < is_missing.lLength; missing_idx++) {
+        row     = is_missing.lData[missing_idx] / family_size;
+        col     = is_missing.lData[missing_idx] % family_size;
+        fnode   = (col == 0) ? node_id : parents.lData[col-1];
+		
+		urn = genrand_real2 ();
+		
+		for (long level = 0; level < family_nlevels.lData[col]; level++) {
+			if (urn < observed_values (col, level)) {
+				data_deep_copy.Store (row, col, (_Parameter) level);
+				break;
+			} else {
+				urn -= observed_values (col, level);
+			}
+		}
+    }
+	
+	
+	// tally N_ijk summary statistics for imputed data
+	for (long pa_index, row = 0; row < data_deep_copy.GetHDim(); row++) {
+		pa_index    = 0;
+		child_state = data_deep_copy (row, 0);
+		for (long par = 0; par < parents.lLength; par++) {
+			pa_index += (long) data_deep_copy (row, par+1) * multipliers[par];
+		}
+		n_ijk.Store (pa_index, (long) child_state, n_ijk(pa_index, (long) child_state) + 1);
+		n_ij.Store (pa_index, 0, n_ij(pa_index, 0) + 1);
+	}
+	
+	
+	// Gibbs sampler
+	for (long iter = 0; iter < impute_maxsteps + impute_burnin; iter++) {
+		// this line was commented out in bgm2.cpp, but I can't remember why - afyp
+		//is_missing.Permute(1);  // shuffle list of missing entries
+		
+		log_score = K2Score (r_i, n_ij, n_ijk); // compute initial score
+		
+		for (long row, col, pa_index, missing_idx = 0; missing_idx < is_missing.lLength; missing_idx++) {
+			row         = is_missing.lData[missing_idx] / family_size;
+			col         = is_missing.lData[missing_idx] % family_size;
+			pa_index    = 0;
+			denom       = 0.;
+			
+			
+			// determine parent combination for this row -- use [pa_indices] object instead?  AFYP
+			for (long par = 0; par < parents.lLength; par++) {
+				pa_index += ((long) data_deep_copy (row, par+1)) * multipliers.lData[par];
+			}
+			
+			reassign_probs->ZeroUsed(); // reset _GrowingVector
+			
+			if (col == 0) { // child node, reassign N_ijk's, keep N_ij's constant
+				child_state = data_deep_copy (row, col);
+				log_score -= log(n_ijk(pa_index, child_state));
+				
+				n_ijk.Store (pa_index, (long) child_state, n_ijk(pa_index, (long) child_state) - 1);
+				
+				// compute probabilities for all instantiations of child node
+				for (long k = 0; k < r_i; k++) {
+					reassign_probs->Store (log_score + log (n_ijk(pa_index, k) + 1));
+				}
+				
+				denom = LogSumExpo (reassign_probs);
+				
+				// random reassignment
+				urn = genrand_real2 ();
+				
+				for (long lev = 0; lev < r_i; lev++) {
+					if ( urn  <  ( this_prob = exp ((* (_Matrix *) reassign_probs) (lev,0) - denom) )) {
+						n_ijk.Store (pa_index, lev, n_ijk(pa_index,lev) + 1);
+						data_deep_copy.Store (row, col, lev);
+						
+						log_score = (* (_Matrix *) reassign_probs) (lev, 0);
+						
+						/* // I don't see why this is necessary - this would short-circuit the burnin!
+						if (missing_idx == is_missing.lLength - 1) {
+							vector_of_scores->Store ((* (_Matrix *) reassign_probs) (lev,0));
+						}
+						 */
+						
+						break;
+					}
+					
+					urn -= this_prob;
+				}
+				
+			} else {    // parent node, reassign both N_ij's AND N_ijk's
+				parent_state    = data_deep_copy (row, col);
+				child_state     = data_deep_copy (row, 0);
+				
+				log_score   -= log (n_ijk (pa_index, (long) child_state));
+				log_score   += log (n_ij  (pa_index, 0) + 1);
+				
+				n_ij.Store  (pa_index, 0, n_ij(pa_index,0) - 1);
+				n_ijk.Store (pa_index, (long) child_state, n_ijk(pa_index, (long) child_state) - 1);
+				
+				pa_index    -= parent_state * multipliers.lData[col-1];
+				
+				
+				for (long pa_temp, lev = 0; lev < family_nlevels.lData[col]; lev++) {
+					pa_temp = pa_index + lev * multipliers.lData[col-1];
+					reassign_probs->Store (log_score + log (n_ijk (pa_temp, (long) child_state) + 1)
+										   - log (n_ij (pa_temp, 0) + 1) ); // why was this adding 2?
+				}
+				
+				
+				// compute denominator and convert log-values to probability vector
+				denom = LogSumExpo (reassign_probs);
+				
+				// re-assign state
+				urn = genrand_real2();  // a uniform random number within interval [0,1)
+				
+				for (long lev = 0; lev < family_nlevels.lData[col]; lev++) {
+					this_prob = exp((* (_Matrix *) reassign_probs) (lev, 0) - denom);
+					
+					if (urn < this_prob) {
+						pa_index += lev * multipliers.lData[col-1];
+						
+						n_ij.Store (pa_index, 0, n_ij(pa_index,0) + 1);
+						n_ijk.Store (pa_index, (long) child_state, n_ijk(pa_index, (long) child_state) + 1);
+						
+						log_score = (* (_Matrix *) reassign_probs) (lev, 0);
+						
+						data_deep_copy.Store (row, col, lev);
+						
+						/*
+						if (missing_idx == is_missing.lLength - 1) {
+							vector_of_scores->Store ((* (_Matrix *) reassign_probs) (lev,0));
+						}
+						 */
+						break;
+					}
+					urn -= this_prob;
+				}
+			}
+		}
+		// end loop over missing values
+		
+		// record current log score
+		if (iter > impute_burnin && ((long)(iter-impute_burnin) % sampling_interval == 0)) {
+			vector_of_scores->Store (log_score);
+		}
+	}
+	
+	
+	ReportWarning (_String("ImputeDiscreteNodeScore(") & node_id & "<-" & (_String *) parents.toStr() & ":\n");
+	long gv_used = vector_of_scores->GetUsed();
+	for (long i = 0; i < gv_used; i++) {
+		ReportWarning ( _String (",") & (*vector_of_scores)(i,0) );
+		log_score += (*vector_of_scores)(i,0);
+	}
+	
+	log_score /= gv_used;
+	
+	
+    // compute the average of sampled log-likelihoods
+    //log_score = LogSumExpo (vector_of_scores) - log((double)vector_of_scores->GetUsed());
+	
+	
+    DeleteObject (vector_of_scores);
+    DeleteObject (reassign_probs);
+	
+    return (log_score);
+}
+
+
+
+//___________________________________________________________________________________________________
+_Parameter _BayesianGraphicalModel::ImputeCGNodeScore (long node_id, _SimpleList & parents)
+{
+    /* ---------------------------------------------------------------------------------------
+        ImputeNodeScore ()
+            Impute (i.e., "fill in") missing values in the data.  More exactly, take the
+            expectation of node score over imputations of the data sampled using Gibbs
+            sampling.  Missing values are flagged for discrete data by negative values.
+            For continuous data, I haven't settled on an unambiguous flag and I'm leaving this
+            up to the user for now (BGM_CONTINUOUS_MISSING_VALUE).
+       --------------------------------------------------------------------------------------- */
+
+	ReportWarning (_String("ImputeCGNodeScore(") & node_id & "<-" & (_String *) parents.toStr() & ":\n");
+	
+    long            num_parent_combos   = 1,
+                    r_i                   = num_levels.lData[node_id],	// number of levels for child node
+                    max_num_levels        = r_i,
+                    family_size           = parents.lLength + 1,
+                    sampling_interval,
+					batch_count;
+
+
+    _SimpleList     multipliers (1, 1, 0),  // length constructor, populator
+
+                    dparents, cparents,
+                    parents_by_nodetype,    // indexes parents separately in mixed family (discete and CG)
+
+                    family_nlevels (family_size, 0, 0),     // for fast look-up
+                    family_datatype (family_size, 0, 0),
+
+                    is_missing,             // store linear indices to missing entries in deep copy
+
+                    pa_indices;				// store discrete parent combination per row
+
+
+    _Matrix         n_ijk, n_ij,        // summary statistics for discrete nodes
+                    mu, tau,            // prior hyperparameters for CG nodes
+
+                    data_deep_copy,     // make a deep copy of the relevant columns of the data matrix
+                    observed_values;
+
+
+    _GrowingVector  * vector_of_scores  = new _GrowingVector(),     // store scores sampled during imputation
+					* reassign_probs    = new _GrowingVector();
+
+    _Parameter      log_score           = 0,
+
+                    impute_maxsteps, impute_burnin, impute_samples, // HBL settings
+
+                    parent_state, child_state,
+                    denom,
+                    // prior hyperparameters for CG nodes
+                    rho = prior_sample_size (node_id, 0) > 0 ? (prior_sample_size (node_id, 0) / num_parent_combos) : 1.0,
+                    phi = prior_scale (node_id, 0);
+
+
+    double          urn;            // uniform random number
+
+	
+	// parameters for CG
+	_Matrix rho_mx (1, 1, false, true);
+	rho_mx.Store(0, 0, rho);
+	ReportWarning (_String("rho_mx: ") & (_String *) rho_mx.toStr());
+	
+	_Matrix phi_mx (1, 1, false, true);
+	phi_mx.Store(0, 0, phi);
+	
+	_Matrix * iw_ptr;
+	_Parameter iw_deviate;
+	
+
+    // set Gibbs sampler parameters from batch language definitions
+    checkParameter (_HYBgm_IMPUTE_MAXSTEPS, impute_maxsteps, 0);
+    checkParameter (_HYBgm_IMPUTE_BURNIN, impute_burnin, 0);
+    checkParameter (_HYBgm_IMPUTE_SAMPLES, impute_samples, 0);
+
+    if (impute_maxsteps <= 0 || impute_burnin < 0 || impute_samples <= 0 || impute_samples > impute_maxsteps) {
+        WarnError (_String("ERROR: Invalid IMPUTE setting(s) in ImputeNodeScore()"));
+        return 0.;
+    }
+
+
+    // number of steps between samples
+    sampling_interval = (long) (impute_maxsteps / impute_samples);
+	//ReportWarning(_String("ImputeCGNodeScore sampling interval set to ") & sampling_interval);
+
+
+    // partition parent list into discrete and continuous; record stuff while we're at it
+    num_parent_combos = 1;
+    family_nlevels.lData[0] = r_i;
+
+    for (long nlev, p = 0; p < parents.lLength; p++) {
+        if (node_type.lData[parents.lData[p]] == 0) {
+			// parent is discrete-valued
+            dparents << parents.lData[p];
+            parents_by_nodetype << (dparents.lLength-1);	// stores index into dparents
+
+            nlev = family_nlevels.lData[p+1] = num_levels.lData[parents.lData[p]];
+
+            num_parent_combos *= nlev;
+            multipliers << num_parent_combos;
+
+            if (nlev > max_num_levels)  {
+                max_num_levels = nlev;
+            }
+        } else { 
+			// parent is continuous-valued
+            cparents << parents.lData[p];
+            parents_by_nodetype << (cparents.lLength-1);
+            family_nlevels.lData[p+1] = 0;
+        }
+    }
+
+
+
+    // allocate space to matrices
+    CreateMatrix (&n_ijk, num_parent_combos, r_i, false, true, false);
+    CreateMatrix (&n_ij, num_parent_combos, 1, false, true, false);
+    CreateMatrix (&data_deep_copy, theData.GetHDim(), family_size, false, true, false);
+
+    pa_indices.Populate(theData.GetHDim(), 0, 0);
+
+
+    // allocate space to _GrowingVector object -- used for imputing discrete nodes only
+    for (long pa = 0; pa < num_parent_combos; pa++) {
+        reassign_probs->Store (0.);
+    }
+
+
+
+    // for discrete nodes, the j-th column tallies the number of observed instances of j-th level
+    // for continuous nodes, store summary statistics (sample size, mean, variance)
+	// therefore, the minimum number of columns is 3
+    CreateMatrix (&observed_values, family_size, (max_num_levels > 3) ? max_num_levels : 3, false, true, false);
+
+	
+    // make deep copy, annotate which entries are missing, and record empirical distributions
+    for (long row = 0; row < theData.GetHDim(); row++) {
+        // findex = family-wise index
+        for (long fnode, findex = 0; findex < family_size; findex++) {
+            fnode = (findex == 0) ? node_id : parents.lData[findex-1];  // parent node, get network-wide index
+            _Parameter fstate = theData (row, fnode);
+            data_deep_copy.Store (row, findex, fstate);
+
+            if (node_type.lData[fnode] == 0) {  // discrete node
+                if (fstate < 0) {
+                    is_missing << row * family_size + findex; // note this is family level indexing
+                } else {
+					// use state into index into vector and increment counter
+                    observed_values.Store (findex, fstate, observed_values(findex,fstate) + 1);
+                }
+            } else {                            // continuous node
+                if (fstate == continuous_missing_value) {
+                    is_missing << row * family_size + findex;
+                } else {
+                    // column 0 stores number of observations
+                    observed_values.Store (findex, 0, observed_values(findex,0) + 1);
+
+                    // column 1 stores sum for computing mean
+                    observed_values.Store (findex, 1, observed_values(findex,1) + fstate);
+
+                    // column 2 stores sum of squares for computing variance
+                    observed_values.Store (findex, 2, observed_values(findex,2) + fstate*fstate);
+                }
+            }
+        }
+    }
+
+	//ReportWarning (_String ("is_missing = ") & (_String *) is_missing.toStr() );
+	ReportWarning (_String ("observed values matrix: ") & (_String *) observed_values.toStr() );
+
+
+    // make a decision whether to use empirical or prior distribution to do initial imputations
+    for (long obs_total, fnode, findex = 0; findex < family_size; findex++) {
+        obs_total = 0;
+        fnode = (findex == 0) ? node_id : parents.lData[findex-1];
+
+        if (node_type.lData[fnode] == 0) {
+			// DISCRETE NODE
+            for (long lev = 0; lev < family_nlevels.lData[findex]; lev++) {
+                obs_total += observed_values (findex, lev);    // sum tallies across levels
+            }
+
+            if (obs_total < MIN_SAMPLE_SIZE) {   
+				// not enough observations - sample from prior given hyperparameters
+				_Matrix imaginary_sample_counts;
+				
+				CreateMatrix (&imaginary_sample_counts, family_nlevels.lData[findex], 1, false, true, false);
+				
+				for (long lev = 0; lev < family_nlevels.lData[findex]; lev++) {
+					imaginary_sample_counts.Store (lev, 0, prior_sample_size (fnode, 0) / family_nlevels.lData[findex] + DIRICHLET_FLATTENING_CONST);
+				}
+				
+				// random deviate from Dirichlet distribution parameterized by imaginary sample size hyperparameters
+				_Matrix * result = (_Matrix *) imaginary_sample_counts.DirichletDeviate();
+				
+                for (long lev = 0; lev < family_nlevels.lData[findex]; lev++) {
+                    observed_values.Store (findex, lev, (*result) (lev,0));
+                }
+				
+				DeleteObject (result);
+            } else {
+				// normalize counts to get empirical distribution
+                for (long lev = 0; lev < family_nlevels.lData[findex]; lev++) {
+                    observed_values.Store (findex, lev, observed_values(findex, lev) / (_Parameter) obs_total);
+                }
+            }
+        } else {
+			// CONTINUOUS NODE
+            if (observed_values(findex, 0) < MIN_SAMPLE_SIZE) {	
+				
+				// unknown variance drawn from scaled inverse chi-square distribution
+				_Matrix		temp1, temp2;
+				CreateMatrix (&temp1, 1, 1, false, true, false);
+				temp1.Store (0, 0, prior_scale(fnode,0));
+				CreateMatrix (&temp2, 1, 1, false, true, false);
+				temp2.Store (0, 0, prior_sample_size(fnode,0));
+				
+				_Matrix *	result = (_Matrix *) temp1.InverseWishartDeviate (temp2);
+				
+                observed_values.Store (findex, 2, (*result)(0,0));
+				observed_values.Store (findex, 1, gaussDeviate() * sqrt( (*result)(0,0) ) + prior_mean(fnode,0));
+				
+				DeleteObject (result);
+				
+			} else { 
+				// compute empirical mean and s.d.
+				
+					// E[x] = sum(x) / len(x)
+                observed_values.Store (findex, 1, observed_values(findex,1) / observed_values(findex,0));
+					// Var[x] = E[x^2] - (E[x])^2
+                observed_values.Store (findex, 2, sqrt(observed_values(findex,2) / observed_values(findex,0)
+                                                       - observed_values(findex,1) * observed_values(findex,1)) );
+            }
+        }
+    }
+
+	ReportWarning (_String ("observed values matrix 2: ") & (_String *) observed_values.toStr() );
+	
+	ReportWarning (_String ("data before impute:\n") & (_String *) data_deep_copy.toStr());
+
+    // initialize missing entries to random assignments based on observed cases or prior info
+    for (long fnode, row, col, missing_idx = 0; missing_idx < is_missing.lLength; missing_idx++) {
+        row     = is_missing.lData[missing_idx] / family_size;
+        col     = is_missing.lData[missing_idx] % family_size;
+        fnode   = (col == 0) ? node_id : parents.lData[col-1];
+
+        if (node_type.lData[fnode] == 0) {  // discrete node
+            urn = genrand_real2 ();
+
+            for (long level = 0; level < family_nlevels.lData[col]; level++) {
+                if (urn < observed_values (col, level)) {
+                    data_deep_copy.Store (row, col, (_Parameter) level);
+                    break;
+                } else {
+                    urn -= observed_values (col, level);
+                }
+            }
+        } else {                            // continuous node
+            data_deep_copy.Store (row, col, gaussDeviate() * observed_values(col,2) + observed_values(col,1) );
+        }
+    }
+
+	ReportWarning (_String ("data after impute:\n") & (_String *) data_deep_copy.toStr());
+
+
+	long            k           = cparents.lLength,
+					pa_index;
+
+	_Parameter      lk_ratio,
+					next_log_score;     // log-likelihood of the proposed step
+
+	_Matrix         log_scores_by_pa (num_parent_combos, 1, false, true),   // track separately to make updating easier
+					next_log_score_by_pa (num_parent_combos, 1, false, true);
+
+
+
+	// set mean intercept/regression coeff. hyperparameter vector for CG prior
+	CreateMatrix (&mu, k+1, 1, false, true, false);
+
+	mu.Store (0, 0, prior_mean (node_id, 0));   // intercept
+	for (long i = 1; i < k+1; i++) {
+		mu.Store (i,0,0);    // set prior expectation of regression coeffs. to 0
+	}
+
+
+	// set precision hyperparameter for CG prior
+	CreateMatrix (&tau, k+1, k+1, false, true, false);
+
+	tau.Store (0, 0, prior_precision (node_id, 0));
+	for (long i = 1; i < k+1; i++) {
+		tau.Store (i, i, prior_precision(cparents.lData[i-1],0));
+	}
+
+
+
+
+	// partition data set by discrete parent state combination
+	for (long obs = 0; obs < theData.GetHDim(); obs++) {
+		pa_index = 0;
+		
+		for (long this_parent, findex = 1; findex < family_size; findex++)
+		{
+			this_parent = parents.lData[findex-1];
+			
+			if (node_type.lData[this_parent] == 0) {
+				// discrete parent
+				pa_index += data_deep_copy (obs, findex) * multipliers.lData[parents_by_nodetype.lData[findex-1]];
+			}
+		}
+
+		pa_indices.lData[obs] = pa_index;
+		n_ij.Store (pa_index, 0, n_ij(pa_index,0) + 1);
+	}
+
+
+
+	// calculate CG summary statistics and compute initial scores
+	log_score = 0.;
+
+	for (long pa = 0; pa < num_parent_combos; pa++) {
+		if (n_ij(pa,0) == 0) {
+			continue; // this batch is empty
+		}
+		
+		// these are single-use matrices, reset with every loop
+		_Matrix zbpa (n_ij(pa,0), k+1, false, true);	// (1, CG parent node values) in batch
+		_Matrix yb (n_ij(pa,0), 1, false, true);		// CG child node values in batch
+		
+
+		// populate zbpa with continuous parent states
+		batch_count = 0;
+		for (long obs = 0; obs < pa_indices.lLength; obs++) {
+			if (pa_indices.lData[obs] == pa) {
+				// (1, x_0, x_1, ..., x_N)
+				zbpa.Store (batch_count, 0, 1); // intercept
+
+				for (long findex = 1; findex < family_size; findex++) {
+					if (node_type.lData[parents.lData[findex-1]] == 1) {    // CG parent
+						zbpa.Store (batch_count, parents_by_nodetype.lData[findex-1], data_deep_copy(obs, findex));
+					}
+				}
+
+				yb.Store (batch_count, 0, data_deep_copy(obs, 0));  // child node state
+
+				batch_count++;
+			}
+		}
+
+		log_scores_by_pa.Store (pa, 0, BottcherScore (yb, zbpa, tau, mu, rho, phi, n_ij(pa,0)));
+		log_score += log_scores_by_pa (pa, 0);
+	}
+
+
+
+	// Gibbs sampling over missing entries
+	for (long iter = 0; iter < impute_burnin + impute_maxsteps; iter++) {
+		//is_missing.Permute(1);
+
+		for (long row, col, missing_idx = 0; missing_idx < is_missing.lLength; missing_idx++) {
+			// indices into data_deep_copy for this missing value
+			row         = is_missing.lData[missing_idx] / family_size;
+			col         = is_missing.lData[missing_idx] % family_size;
+			denom       = 0.;
+			pa_index    = pa_indices.lData[row];
+
+
+			// if child node, then row remains in same 'pa' batch, Z^b_pa and N_ij unchanged
+			if (col == 0) {
+				
+				// draw new state from posterior of CG node
+								
+				iw_ptr = (_Matrix *) phi_mx.InverseWishartDeviate (rho_mx);
+				iw_deviate = (*iw_ptr)(0,0);
+				ReportWarning(_String("sigma=") & iw_deviate);
+				
+
+				_Matrix zbpa (n_ij(pa_index,0), k+1, false, true);
+				_Matrix yb (n_ij(pa_index,0), 1, false, true);
+				
+				// collect all continuous parent states under given discrete parent combination (pa_index)
+				batch_count = 0;
+				for (long obs = 0; obs < pa_indices.lLength; obs++) {
+					if (obs == row) continue; // skip the current case
+					if (pa_indices.lData[obs] == pa_index) {
+						zbpa.Store (batch_count, 0, 1);
+						for (long findex = 1; findex < family_size; findex++) {
+							if (node_type.lData[parents.lData[findex-1]] == 1) {
+								zbpa.Store (batch_count, parents_by_nodetype.lData[findex-1], data_deep_copy(obs, findex));
+							}
+						}
+						yb.Store (batch_count, 0, data_deep_copy(obs, 0));
+						batch_count++;
+					}
+				}
+				
+				ReportWarning(_String("zbpa=") & (_String *) zbpa.toStr());
+				zbpa.Transpose();
+				ReportWarning(_String("zbpa=") & (_String *) zbpa.toStr());
+				zbpa *= yb;
+				ReportWarning(_String("zbpa=") & (_String *) zbpa.toStr());
+				
+
+				next_log_score_by_pa.Store (pa_index, 0, BottcherScore (yb, zbpa, tau, mu, rho, phi, (long)n_ij(pa_index,0)));
+				next_log_score  = log_score - log_scores_by_pa (pa_index, 0) + next_log_score_by_pa(pa_index, 0);
+
+				lk_ratio        = exp(log_score - next_log_score);
+
+
+				// accept this step?
+				if (lk_ratio >= 1. || genrand_real2() < lk_ratio) {
+					log_score = next_log_score;
+
+					// update log score contribution for this parent combo (pa)
+					log_scores_by_pa.Store (pa_index, 0, next_log_score_by_pa(pa_index, 0));
+				} else {
+					// revert to previous state
+					data_deep_copy.Store (row, col, child_state);
+				}
+			}
+
+			/* ---------- MISSING VALUE AT PARENT NODE (col > 0) ---------- */
+			else {
+				// if parent is discrete, then this case is moved to another batch (pa) -- MORE THAN ONE BATCH IS AFFECTED
+				if (node_type.lData[parents.lData[col-1]] == 0) {
+					
+					parent_state    = data_deep_copy (row, col);
+
+					// first compute the likelihood of the original batch minus this case
+					n_ij.Store  (pa_index, 0, n_ij(pa_index,0) - 1);
+					
+					_Matrix zbpa (n_ij(pa_index,0), k+1, false, true);
+					_Matrix yb (n_ij(pa_index,0), 1, false, true);
+
+					batch_count = 0;
+					for (long obs = 0; obs < data_deep_copy.GetHDim(); obs++) {
+						if (obs == row) {
+							continue;    // skip this case
+						}
+
+						if (pa_indices.lData[obs] == pa_index) {
+							zbpa.Store (batch_count, 0, 1);
+
+							for (long findex = 1; findex < family_size; findex++) {
+								if (node_type.lData[parents.lData[findex-1]] == 1) {
+									zbpa.Store (batch_count, parents_by_nodetype.lData[findex-1], data_deep_copy(obs, findex));
+								}
+							}
+
+							yb.Store (batch_count, 0, data_deep_copy(obs, 0));
+
+							batch_count++;
+						}
+					}
+
+					next_log_score_by_pa.Store (pa_index, 0, BottcherScore (yb, zbpa, tau, mu, rho, phi, (long) n_ij (pa_index, 0)));
+					next_log_score = log_score - log_scores_by_pa (pa_index,0) + next_log_score_by_pa (pa_index,0);
+
+
+					// random re-assignment of discrete parent node, compute likelihood of second batch
+					
+					urn = genrand_real2() * (1.0 - observed_values(col, parent_state)); // rescale to omit original state
+
+					for (long lev = 0; lev < family_nlevels.lData[col]; lev++) {
+						if (lev == parent_state) {
+							continue;
+						}
+
+						if (urn < observed_values(col, lev)) {
+							data_deep_copy.Store (row, col, lev);
+							
+							/* BREAK */
+							
+							pa_index += (lev - parent_state) * multipliers.lData[parents_by_nodetype.lData[col-1]];
+
+
+							// compute summary stats
+							n_ij.Store  (pa_index, 0, n_ij(pa_index,0) + 1);
+							
+							_Matrix zbpa (n_ij(pa_index,0), k+1, false, true);
+							_Matrix yb (n_ij(pa_index,0), 1, false, true);
+
+							batch_count = 0;
+							
+							for (long obs = 0; obs < data_deep_copy.GetHDim(); obs++) {
+								// we won't update pa_indices[] for this case, already have pa_index to work with
+								if (obs == row || pa_indices.lData[obs] == pa_index) {
+									zbpa.Store (batch_count, 0, 1);
+
+									for (long findex = 1; findex < family_size; findex++) {
+										if (node_type.lData[parents.lData[findex-1]] == 1) {
+											zbpa.Store (batch_count, parents_by_nodetype.lData[findex-1], data_deep_copy(obs, findex));
+										}
+									}
+									yb.Store (batch_count, 0, data_deep_copy(obs, 0));
+									batch_count++;
+								}
+							}
+
+							next_log_score_by_pa.Store (pa_index, 0, BottcherScore (yb, zbpa, tau, mu, rho, phi, (long) n_ij (pa_index, 0)));
+							break;
+						} else {
+							urn -= observed_values(col, lev);
+						}
+					}
+
+					next_log_score -= log_scores_by_pa (pa_index, 0);   // remove old score for second batch
+					next_log_score += next_log_score_by_pa (pa_index, 0);               // add new scores for both batches
+
+					lk_ratio        = exp(log_score - next_log_score);
+					if (lk_ratio >= 1. || genrand_real2() < lk_ratio) {
+						log_score = next_log_score;
+						log_scores_by_pa.Store (pa_index, 0, next_log_score_by_pa (pa_index,0) );
+						log_scores_by_pa.Store (pa_indices.lData[row], 0, next_log_score_by_pa (pa_indices.lData[row],0) ); // contains the old index
+
+						pa_indices.lData[row] = pa_index;   // replace old pa index with new
+					} else {
+						// revert to previous state
+						data_deep_copy.Store (row, col, parent_state);
+
+						n_ij.Store (pa_index, 0, n_ij(pa_index,0) - 1);
+						n_ij.Store (pa_indices.lData[row], 0, n_ij(pa_indices.lData[row],0) + 1);
+						pa_index = pa_indices.lData[row];
+					}
+				}
+
+				// otherwise, if parent is continuous then just update Z_bpa; case stays in the same batch
+				else {
+					// random draw from Gaussian distribution centered at previous value
+					data_deep_copy.Store (row, col, (gaussDeviate() + data_deep_copy(row,col)) * observed_values(0,2));
+
+					_Matrix zbpa (n_ij(pa_index,0), k+1, false, true);
+					_Matrix yb (n_ij(pa_index,0), 1, false, true);
+
+					batch_count = 0;
+					
+					for (long obs = 0; obs < data_deep_copy.GetHDim(); obs++) {
+						if (pa_indices.lData[obs] == pa_index) {
+							zbpa.Store (batch_count, 0, 1);
+
+							for (long findex = 1; findex < family_size; findex++) {
+								if (node_type.lData[parents.lData[findex-1]] == 1) {
+									zbpa.Store (batch_count, parents_by_nodetype.lData[findex-1], data_deep_copy(obs, findex));
+								}
+							}
+
+							yb.Store (batch_count, 0, data_deep_copy(obs, 0));
+
+							batch_count++;
+						}
+					}
+
+					next_log_score_by_pa.Store (pa_index, 0, BottcherScore (yb,zbpa,tau,mu,rho,phi, (long)n_ij(pa_index,0)));
+					next_log_score = log_score - log_scores_by_pa(pa_index,0) + next_log_score_by_pa(pa_index,0);
+
+					lk_ratio = exp(log_score - next_log_score);
+
+					if (lk_ratio >= 1. || genrand_real2() < lk_ratio) {
+						log_score = next_log_score;
+						log_scores_by_pa.Store (pa_index, 0, next_log_score_by_pa(pa_index,0));
+						pa_indices.lData[row] = pa_index;
+					} else {
+						data_deep_copy.Store (row, col, parent_state);
+					}
+				}
+			}
+		}
+		// end loop over missing entries
+
+		
+		if (iter > impute_burnin && ((long)(iter - impute_burnin) % sampling_interval == 0) ) {
+			vector_of_scores->Store (log_score);
+			//ReportWarning (_String("ImputeCGNodeScore: ") & log_score);
+		}
+	}
+	// end sampler
+
+	
+	long gv_used = vector_of_scores->GetUsed();
+	for (long i = 0; i < gv_used; i++) {
+		//ReportWarning ( _String (",") & (*vector_of_scores)(i,0) );
+		log_score += (*vector_of_scores)(i,0);
+	}
+	ReportWarning(_String("chain = ") & (_String *) vector_of_scores->toStr());
+	
+	log_score /= gv_used;
+    // compute the average of sampled log-likelihoods
+    //log_score = LogSumExpo (vector_of_scores) - log((double)vector_of_scores->GetUsed());
+
+    DeleteObject (vector_of_scores);
+    DeleteObject (reassign_probs);
+
+    return (log_score);
+}
+
+
+
+
+#ifdef __NEVER_DEFINED__
+// __________________________________________________________________________________________
+void _BayesianGraphicalModel::ComputeParameters(_Matrix * structure)
+{
+    /* -----------------------------------------------------------------------
+        ComputeParameters()
+
+            Store _Formula objects into _AssociativeArray, each represents
+            a posterior probability distribution over network parameters for
+            each node in the network, given network structure.
+
+            These distributions are defined by hyperparameters that in turn
+            are defined by prior assumptions and data.
+
+            Discrete node has conditional probability table (π):
+                π_ijk ~ Dirichlet(n_ijk + a_ijk)
+
+            where n_ijk is from data and a_ijk is prior.
+
+            Continuous node has intercept (m) and k-vector of regression
+            coefficients (ß), where k is number of continuous parents:
+                (m,ß) ~ k-Gauss(mu', sigma/tau')
+                sigma ~ Inv-Gamma(rho'/2, phi'/2)
+
+
+       ----------------------------------------------------------------------- */
+
+    _Matrix     n_ijk, n_ij,
+                params;
+
+    _Formula    * aFormula;
+
+
+
+    // loop through nodes in the network
+    for (long node = 0; node < num_nodes; node++) {
+        long            r_i         = num_levels.lData[node];
+
+        _SimpleList     parents;
+
+
+        // find parents in graph
+        for (long other_node = 0; other_node < num_nodes; node++) {
+            if (other_node == node) {
+                continue;
+            }
+
+            if (theStructure(other_node, node) == 1) {
+                parents << other_node;
+            }
+        }
+
+
+        // this is a root node without parents
+        if (parents.lLength == 0) {
+            if (node_type.lData[node] == 0) {   /* discrete node */
+                long            a_ijk   = (prior_sample_size(node,0) == 0) ? 1 : prior_sample_size(node,0);
+                _Parameter      n_i     = 0;
+
+
+                // tally Dirichlet hyperparameters
+                CreateMatrix (&n_ijk, 1, r_i, false, true, false);
+
+                for (long k, obs = 0; obs < theData.GetHDim(); obs++) {
+                    k = theData(obs, node); // child state
+                    n_ijk.Store (0, k, n_ijk(0,k) + a_ijk);
+                    n_i += n_ijk(0,k);
+                }
+
+
+                // store posterior distribution
+                CreateMatrix (&params, 1, r_i, false, true, false);
+                params.Convert2Formulas();
+
+                for (long k = 0; k < r_i; k++) {
+                    checkPointer (aFormula = new _Formula (new _Constant (n_ijk(0,k)/n_i), false));
+                    params.StoreFormula(0, k, *aFormula);
+                }
+            } else if (node_type.lData[node] == 1) {
+
+            } else {
+                WarnError (_String ("Unsupported data type detected for node ") & node & " in ComputeParameters()");
+            }
+        }
+
+        else {
+            long    num_parent_combos   = 1,
+                    pa_index;
+
+            _SimpleList multipliers ((long)1);
+
+            // tabulate parent combinations
+            for (long par = 0; par < parents.lLength; par++) {
+                num_parent_combos *= num_levels.lData[parents.lData[par]];
+                multipliers << num_parent_combos;
+            }
+
+            CreateMatrix (&n_ijk, num_parent_combos, r_i, false, true, false);
+            CreateMatrix (&n_ij, num_parent_combos, 1, false, true, false);
+
+
+            // tally N_ijk and N_ij's
+            for (long child_state, obs = 0; obs < theData.GetHDim(); obs++) {
+                child_state =  theData(obs, node);
+                pa_index    = 0;
+
+                for (long par = 0; par < parents.lLength; par++) {
+                    pa_index += theData(obs, parents.lData[par]) * multipliers.lData[par];
+                }
+
+                n_ijk.Store (pa_index, child_state, n_ijk(pa_index, child_state) + 1);
+                n_ij.Store (pa_index, 0, n_ij(pa_index,0) + 1);
+            }
+
+
+            if (node_type.lData[node] == 0) {
+                // that's enough information to compute parameters on discrete nodes
+
+            } else if (node_type.lData[node] == 1) {
+
+            } else {
+                WarnError (_String ("Unsupported data type detected for node ") & node & " in ComputeParameters()");
+            }
+        }
+    }
+}
+#endif
+
+
+
+
+
+
+
diff --git a/src/new/bgm.cpp b/src/new/bgm.cpp
new file mode 100644
index 0000000..14c62d0
--- /dev/null
+++ b/src/new/bgm.cpp
@@ -0,0 +1,3257 @@
+/*
+
+ HyPhy - Hypothesis Testing Using Phylogenies.
+
+ Copyright (C) 1997-2006
+ Primary Development:
+ Sergei L Kosakovsky Pond (sergeilkp at mac.com)
+ Significant contributions from:
+ Spencer V Muse (muse at stat.ncsu.edu)
+ Simon DW Frost (sdfrost at ucsd.edu)
+ Art FY Poon    (apoon at biomail.ucsd.edu)
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License
+ as published by the Free Software Foundation; either version 2
+ of the License, or (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+
+ _AVLList   structure inspired by the excellent documentation of
+ GNU libavl 2.0.1 by Ben Pfaff (http://www.msu.edu/~pfaffben/avl/index.html)
+
+                                */
+
+/*
+ *  Bgm.cpp
+ *  HYPHY_XCode
+ *
+ *  Created by Art Poon on 2/5/07.
+ *  Based on source code written in C by Fraser Iain Lewis.
+ *
+ */
+
+#if not defined __AFYP_REWRITE_BGM__
+
+#ifdef __HYPHYQT__
+    #include "hyphymain.h"
+#endif
+
+#if defined __MAC__ || defined __WINDOZE__ || defined __HYPHY_GTK__
+    #include "HYConsoleWindow.h"
+    #include "HYDialogs.h"
+
+#endif
+
+
+//#define       __AFYP_DEVELOPMENT__
+#define     __MISSING_DATA__
+
+
+#include "bgm.h"
+
+_String     _HYBgm_BAN_PARENT_KEY   ("BanParent"),
+            _HYBgm_BAN_CHILD_KEY  ("BanChild"),
+            _HYBgm_ENFORCE_PARENT_KEY ("EnforceParent"),
+            _HYBgm_ENFORCE_CHILD_KEY  ("EnforceChild"),
+
+            _HYBgm_NODE_INDEX_KEY ("NodeID"),
+            _HYBgm_PRIOR_SIZE_KEY ("PriorSize"),
+            _HYBgm_MAX_PARENT_KEY ("MaxParents"),
+
+            _HYBgm_PRIOR_MEAN_KEY ("PriorMean"),      /* for continuous (Gaussian) nodes */
+            _HYBgm_PRIOR_PREC_KEY ("PriorVar"),
+
+            /*SLKP 20070926; add string constants for progress report updates */
+            _HYBgm_STATUS_LINE_MCMC           ("Running Bgm MCMC"),
+            _HYBgm_STATUS_LINE_MCMC_DONE  ("Finished Bgm MCMC"),
+            _HYBgm_STATUS_LINE_CACHE      ("Caching Bgm scores"),
+            _HYBgm_STATUS_LINE_CACHE_DONE ("Done caching Bgm scores"),
+            /*SLKP*/
+
+            _HYBgm_MPI_CACHING ("USE_MPI_CACHING"),
+
+            /* maxParentString ("Bgm_MAXIMUM_PARENTS"), */
+            maxNumRestart ("BGM_NUM_RESTARTS"),
+            numRandomize  ("BGM_NUM_RANDOMIZE"),
+            useNodeOrder  ("BGM_USE_NODEORDER"),
+            bgmOptimizationMethod ("BGM_OPTIMIZATION_METHOD"),
+
+            useMPIcaching ("USE_MPI_CACHING"),
+
+            mcmcNumChains ("BGM_MCMC_NCHAINS"),       // re-use parameter
+            mcmcTemperature ("BGM_MCMC_TEMPERATURE"),
+            mcmcSteps     ("BGM_MCMC_DURATION"),
+            mcmcBurnin        ("BGM_MCMC_BURNIN"),
+            mcmcSamples       ("BGM_MCMC_SAMPLES"),
+
+            mcemMaxSteps  ("BGM_MCEM_MAXSTEPS"),
+            mcemBurnin        ("BGM_MCEM_BURNIN"),
+            mcemSampleSize    ("BGM_MCEM_SAMPLES");
+
+
+#ifdef      __UNIX__
+
+void        ConsoleBGMStatus (_String, _Parameter, _String * fileName);
+
+//__________________________________________________________________________________
+
+void        ConsoleBGMStatus (_String statusLine, _Parameter percentDone, _String * fileName = nil)
+{
+    FILE           *outFile = fileName?doFileOpen (fileName->sData,"w"):nil;
+
+    _String        reportLine (statusLine);
+
+
+
+
+    if (percentDone >= 0.0) {
+        reportLine = reportLine & ". " & percentDone & "% done.";
+    }
+
+    if (outFile) {
+        fprintf (outFile,"%s", reportLine.sData);
+    } else if (verbosityLevel == 1) {
+        printf ("\033\015 %s", reportLine.sData);
+    }
+
+    if (percentDone < -1.5) {
+        printf ("\033\015 ");
+        setvbuf (stdout,nil,_IOLBF,1024);
+    } else if (percentDone < -0.5) {
+        setvbuf (stdout,nil, _IONBF,1);
+    }
+    if (outFile) {
+        fclose (outFile);
+    }
+
+}
+
+#endif
+
+
+//___________________________________________________________________________________________
+
+long integerPower (long base, long exponent)
+{
+    long    result = 1L,
+            mask   = 1L<<(sizeof(long)*8-2); // left shift to left-most position of binary sequence for long integer
+    // e.g. 100...0 (30 zeroes for signed long)
+
+    while ((exponent & mask) == 0) {
+        mask >>= 1;    // bitwise AND, right-shift mask until overlaps with first '1'
+    }
+
+    while (mask) {
+        result *= result;
+        if (exponent & mask) {
+            result = result * base;
+        }
+        mask >>= 1;
+    }
+    return result;
+}
+
+
+
+//___________________________________________________________________________________________
+//  afyp Oct. 15, 2008, replaced wrapper function for _Constant member function
+//  with this local function.
+_Parameter Bgm::LnGamma(_Parameter theValue)
+{
+    if (theValue <= 0) {
+
+
+        _String oops ("ERROR: Requested Bgm::LnGamma(x) for x <= 0.");
+        WarnError (oops);
+
+        return 0;
+    }
+
+    static _Parameter lngammaCoeff [6] = {   76.18009172947146,
+                                         -86.50532032941677,
+                                         24.01409824083091,
+                                         - 1.231739572450155,
+                                         0.1208650973866179e-2,
+                                         - 0.5395239384953e-5
+                                         };
+
+    static _Parameter lookUpTable [20] = {  0., 0., 0.6931472, 1.7917595, 3.1780538,
+                                            4.7874917, 6.5792512, 8.5251614, 10.6046029, 12.8018275,
+                                            15.1044126, 17.5023078, 19.9872145, 22.5521639, 25.1912212,
+                                            27.8992714, 30.6718601, 33.5050735, 36.3954452, 39.3398842
+                                         };
+
+    // use look-up table for small integer values
+    if (theValue <= 20 && (theValue - (long)theValue) > 0.) {
+        return (lookUpTable [(long) theValue - 1]);
+    }
+
+
+    // else do it the hard way
+    _Parameter  x, y, tmp, ser;
+
+    y = x = theValue;
+    tmp = x + 5.5;
+    tmp -= (x+0.5) * log(tmp);
+    ser = 1.000000000190015;
+
+    for (long j = 0; j <= 5; j++) {
+        ser += lngammaCoeff[j] / ++y;
+    }
+
+    return (-tmp + log(2.506628274631005*ser/x));
+}
+
+
+
+//___________________________________________________________________________________________
+Bgm::Bgm(_AssociativeList * dnodes, _AssociativeList * cnodes)
+{
+    _String     errorMessage;
+
+    long        num_discrete    = dnodes->avl.countitems(),
+                num_continuous   = cnodes->avl.countitems(),
+                node_index;
+
+    num_nodes   = num_discrete + num_continuous;    // set member variable
+
+
+
+    _Constant   * node_id,                      /* pointers into HBL associative array arguments */
+                * mp,
+                * size, * mean, * precision;
+
+    _AssociativeList    * discreteNode, * continuousNode;
+
+
+
+    // set member variables to default values
+    calc_bit            = new _Constant ();         // for calculating LnGamma in member functions
+    max_max_parents     = 0;                        // record the most parents a node can have
+    obsData             = NULL;
+    obsWeights          = NULL;
+
+
+
+    // extract number of variables in data
+    CreateMatrix (&dag, num_nodes, num_nodes, false, true, false);      // allocate space for matrices
+    CreateMatrix (&banned_edges, num_nodes, num_nodes, false, true, false);
+    CreateMatrix (&enforced_edges, num_nodes, num_nodes, false, true, false);
+    CreateMatrix (&prior_sample_size, num_nodes, 1, false, true, false);    // for storing floats as _Parameter objects
+    CreateMatrix (&prior_mean, num_nodes, 1, false, true, false);
+    CreateMatrix (&prior_precision, num_nodes, 1, false, true, false);
+
+
+    // allocate space for _SimpleList objects
+    is_discrete.Populate (num_nodes, 0, 0);
+    num_levels.Populate (num_nodes, 0, 0);
+    max_parents.Populate (num_nodes, 0, 0);
+    has_missing.Populate (num_nodes, 0, 0);
+
+
+
+    // initialize discrete nodes
+    for (long dn = 0; dn < num_discrete; dn++) {
+        discreteNode    = (_AssociativeList *) (dnodes->GetByKey (dn, ASSOCIATIVE_LIST));
+
+        if (discreteNode) {
+            node_id     = (_Constant *) (discreteNode->GetByKey (_HYBgm_NODE_INDEX_KEY, NUMBER));
+            mp          = (_Constant *) (discreteNode->GetByKey (_HYBgm_MAX_PARENT_KEY, NUMBER));
+            size        = (_Constant *) (discreteNode->GetByKey (_HYBgm_PRIOR_SIZE_KEY, NUMBER));
+
+            if (node_id && mp && size) {
+                node_index  = (long) (node_id->Value());
+
+                is_discrete.lData[node_index] = 1.;
+                max_parents.lData[node_index] = (long) mp->Value();
+
+                if ((long) mp->Value() > max_max_parents) {
+                    max_max_parents = (long) mp->Value();
+                }
+
+                prior_sample_size.Store(node_index, 0, (long) size->Value());
+            } else {
+                errorMessage = _String ("Missing key (NodeID, MaxParents, PriorSize) in associative array for discrete node ")
+                               & dn;
+                break;
+            }
+        } else {
+            errorMessage = _String("Failed to retrieve discrete node specification at index ") & dn;
+            break;
+        }
+    }
+    if (errorMessage.sLength) {
+        WarnError (errorMessage);
+        errorMessage = _String();   // reset to empty string
+    }
+
+
+
+    // initialize continuous nodes
+    for (long cn = 0; cn < num_continuous; cn++) {
+        continuousNode  = (_AssociativeList *) (cnodes->GetByKey (cn, ASSOCIATIVE_LIST));
+
+        if (continuousNode) {
+            node_id     = (_Constant *) (continuousNode->GetByKey (_HYBgm_NODE_INDEX_KEY, NUMBER));
+            mp          = (_Constant *) (continuousNode->GetByKey (_HYBgm_MAX_PARENT_KEY, NUMBER));
+            size        = (_Constant *) (continuousNode->GetByKey (_HYBgm_PRIOR_SIZE_KEY, NUMBER));
+            mean        = (_Constant *) (continuousNode->GetByKey (_HYBgm_PRIOR_MEAN_KEY, NUMBER));
+            precision   = (_Constant *) (continuousNode->GetByKey (_HYBgm_PRIOR_PREC_KEY, NUMBER));
+
+            if (node_id && mp && size && mean && precision) {
+                node_index = (long) (node_id->Value());
+
+                is_discrete.lData[node_index] = 0.;
+                max_parents.lData[node_index] = (long) mp->Value();
+
+                if (mp->Value() > max_max_parents) {
+                    max_max_parents = (long) mp->Value();
+                }
+
+                prior_sample_size.Store (node_index, 0, (_Parameter) size->Value());
+                prior_mean.Store (node_index, 0, (_Parameter) mean->Value());
+                prior_precision.Store (node_index, 0, (_Parameter) precision->Value());
+
+            } else {
+                errorMessage = _String ("Missing key (NodeID, MaxParents, PriorSize, PriorMean, PriorVar)")
+                               & "in associative array for continuous node " & cn;
+                break;
+            }
+        } else {
+            errorMessage = _String ("Failed to retrieve continuous node specification at index ") & cn;
+            break;
+        }
+    }
+
+    if (errorMessage.sLength) {
+        WarnError (errorMessage);
+        errorMessage = _String();   // reset to empty string
+    }
+
+
+
+    // append duplicates of _List object to store pointers to _Constant, _Matrix, _NTupleStorage objects
+    _List       emptyList (max_max_parents+1);
+    for (long node = 0; node < num_nodes; node++) {
+        node_scores && (&emptyList);
+    }
+
+
+    // require Bgm to recalculate node scores
+    scores_cached = FALSE;
+}
+
+
+
+//___________________________________________________________________________________________
+Bgm::~Bgm (void)
+{
+    DeleteObject (calc_bit);
+}
+
+
+
+//___________________________________________________________________________________________
+void Bgm::SetDataMatrix (_Matrix * data)
+{
+    // reset cached node scores and edge posteriors
+    // DumpComputeLists ();
+    scores_cached   = FALSE;
+
+    if (obsData)    {
+        DeleteObject (obsData);    // dispense with previous data matrix
+    }
+
+    obsData         = data;
+
+    obsData->CheckIfSparseEnough(TRUE);     // check if we can use a more compact representation of the
+    // matrix; before including this command, we suffered a
+    // noticeable slow-down in this routine. - AFYP
+
+    /*
+    // allocate space to weight matrix
+    if (obsWeights)
+    {
+        DeleteObject(obsWeights);
+    }
+    obsWeights = new _Matrix (obsData->GetHDim(), obsData->GetVDim(), false, true);
+
+    // by default all cases are weighted equally - require user to call SetWeightMatrix() if otherwise
+    for (long row = 0; row < obsData->GetHDim(); row++)
+        for (long col = 0; col < obsData->GetVDim(); col++)
+            obsWeights->Store(row, col, 1.);
+
+    */
+
+    // reset data-dependent member variables
+    for (long node = 0; node < num_nodes; node++) {
+        has_missing.lData[node] = 0;
+        num_levels.lData[node] = 0;
+    }
+
+
+
+#ifdef DEBUG_SDM
+    char buf [256];
+    for (long i = 0; i < obsData->GetHDim(); i++) {
+        for (long j = 0; j < obsData->GetVDim(); j++) {
+            snprintf (buf, sizeof(buf), "%d ", (long) (*obsData)(i,j));
+            BufferToConsole (buf);
+        }
+        NLToConsole ();
+    }
+#endif
+
+
+
+    if (obsData->GetVDim() == num_nodes) {  // make sure the data matrix is compatible with graph
+#ifdef __MISSING_DATA__
+        long    nrows = obsData->GetHDim();
+
+        for (long node = 0; node < num_nodes; node++) {
+            if (is_discrete.lData[node]) {
+                num_levels.lData[node] = 1;
+
+                for (long obs, row = 0; row < nrows; row++) {
+                    obs = (*obsData)(row, node);
+
+                    if (has_missing.lData[node] == 0 && obs < 0) {  // use negative integer values to annotate missing data
+                        has_missing.lData[node] = 1;
+                        continue;   // skip next step to check levels
+                    }
+
+                    if (obs+1 > num_levels.lData[node]) {
+                        num_levels.lData[node] = num_levels.lData[node] + 1;
+                    }
+                }
+            } else {
+                num_levels.lData[node] = 0;
+
+                // not implementing missing data for continuous nodes yet
+                //  not until I've decided on annotation anyhow :-/  afyp
+            }
+        }
+
+#ifdef DEBUG_SDM
+        snprintf (buf, sizeof(buf), "Levels: ");
+        BufferToConsole (buf);
+        for (long i = 0; i < num_nodes; i++) {
+            snprintf (buf, sizeof(buf), "%d ", num_levels.lData[i]);
+            BufferToConsole (buf);
+        }
+        NLToConsole ();
+
+        snprintf (buf, sizeof(buf), "Missing (0=FALSE, 1=TRUE): ");
+        BufferToConsole (buf);
+        for (long i = 0; i < num_nodes; i++) {
+            snprintf (buf, sizeof(buf), "%d ", has_missing.lData[i]);
+            BufferToConsole (buf);
+        }
+        NLToConsole ();
+#endif
+
+#else
+        for (long node = 0; node < num_nodes; node++) { // for every column in matrix
+            if (is_discrete.lData[node]) {
+                // calculate number of levels for discrete node
+                num_levels.lData[node] = 1;
+
+                for (long obs = 0; obs < obsData->GetHDim(); obs++) {
+                    // adjust for zero-indexing
+                    if ( ((*obsData)(obs,node) + 1) > num_levels.lData[node]) {
+                        num_levels.lData[node] = num_levels.lData[node] + 1;
+                    }
+                }
+            } else {
+                // continuous node defined to have no levels
+                num_levels.lData[node] = 0;
+            }
+        }
+#endif
+    } else {
+        _String errorMsg ("Number of variables in data matrix do not match number of nodes in graph.");
+        WarnError (errorMsg);       // note, this produces a crash because the batch file proceeds to execute
+        // BGM routines without data. - AFYP
+    }
+
+
+    last_node_order.Clear();        // forget the last step taken in MCMC chain
+    best_node_order.Clear();
+
+    CacheNodeScores();
+
+    // re-allocate memory to lists
+    // InitComputeLists ();
+}
+
+
+
+//___________________________________________________________________________________________
+void    Bgm::SetWeightMatrix (_Matrix * weights)
+{
+    if ( obsData
+            && (long) (obsData->GetHDim()) == (long) (weights->GetHDim())
+            /*&& (long) (obsData->GetVDim()) == (long) (weights->GetVDim())*/ ) {
+        obsWeights = weights;
+        ReportWarning( _String("Set weight matrix to ") & (_String *) obsWeights->toStr() );
+    } else {
+        _String errorMsg ("Number of weights does not match number of observations in current data set.");
+        WarnError (errorMsg);
+    }
+
+    scores_cached = FALSE;
+}
+
+
+
+
+//___________________________________________________________________________________________
+void    Bgm::SetGraphMatrix (_Matrix *graph)
+{
+    /*
+    char    bug [255];
+
+    snprintf (bug, sizeof(bug), "Entered Bgm::SetGraphMatrix()\n");
+    BufferToConsole (bug);
+    */
+    dag = (_Matrix &) (*graph); // matrix assignment
+    ReportWarning (_String("set graph matrix to:\n") & (_String *) dag.toStr() & "\n" );
+}
+
+
+void    Bgm::SetBanMatrix (_Matrix *banMx)
+{
+    banned_edges = (_Matrix &) (*banMx);
+
+    ReportWarning (_String("Set ban matrix to ") & (_String *) banned_edges.toStr() & "\n" );
+}
+
+void    Bgm::SetEnforceMatrix (_Matrix *enforceMx)
+{
+    enforced_edges = (_Matrix &) (*enforceMx);
+    ReportWarning (_String("Set enforce matrix to ") & (_String *) enforced_edges.toStr() & "\n" );
+}
+
+void    Bgm::SetBestOrder (_SimpleList * orderList)
+{
+    best_node_order.Populate(num_nodes, 0, 0);
+
+    for (long i = 0; i < num_nodes; i++) {
+        best_node_order.lData[i] = orderList->lData[i];
+    }
+}
+
+//___________________________________________________________________________________________
+//  For debugging..
+void Bgm::PrintGraph (_Matrix * g)
+{
+    char    buf [255];
+
+    if (g) {
+        for (long row = 0; row < g->GetHDim(); row++) {
+            for (long col = 0; col < g->GetVDim(); col++) {
+                snprintf (buf, sizeof(buf), "%ld ", (long) (*g)(row,col));
+                BufferToConsole (buf);
+            }
+            snprintf (buf, sizeof(buf), "\n");
+            BufferToConsole (buf);
+        }
+    } else {
+        for (long row = 0; row < dag.GetHDim(); row++) {
+            for (long col = 0; col < dag.GetVDim(); col++) {
+                snprintf (buf, sizeof(buf), "%ld ", (long)dag(row,col));
+                BufferToConsole (buf);
+            }
+            snprintf (buf, sizeof(buf), "\n");
+            BufferToConsole (buf);
+        }
+    }
+    NLToConsole();
+}
+
+
+//___________________________________________________________________________________________
+void    Bgm::ResetGraph (_Matrix * g)
+{
+    if (g) {
+        for (long row = 0; row < num_nodes; row++) {
+            for (long col = 0; col < num_nodes; col++) {
+                g->Store (row, col, dag (row, col));
+            }
+        }
+        ReportWarning (_String("Reset graph to dag argument\n"));
+    } else {
+        for (long row = 0; row < num_nodes; row++) {
+            for (long col = 0; col < num_nodes; col++) {
+                // enforced edges must always appear in DAG
+                // if none specified, all entries are zeroed
+                dag.Store (row, col, enforced_edges (row, col));
+            }
+        }
+    }
+}
+
+
+
+//___________________________________________________________________________________________
+long    Bgm::MarginalSum (bool over_rows, long offset)
+{
+    long    res     = 0;
+
+    if (over_rows)
+        for (long i = 0; i < num_nodes; i++) {
+            res += dag(offset,i);    // sum of n-th row
+        }
+    else
+        for (long i = 0; i < num_nodes; i++) {
+            res += dag(i,offset);    // sum of n-th column
+        }
+
+    return res;
+}
+
+
+
+//___________________________________________________________________________________________
+//  DEPRECATED
+bool    Bgm::IsCyclic (void)
+{
+    _Matrix     nodes_left (num_nodes, 1, false, true);
+
+    for (long i = 0; i < num_nodes; i++) {  // populate vector with 1's
+        nodes_left.Store (i,0,1.);
+    }
+
+    long        one_count = num_nodes,
+                last_count,
+                num_children;
+
+    do {    // until no more leaves are removed
+        last_count = one_count;
+        one_count = 0;
+
+        // find and remove all nodes with no children (i.e. leaf nodes)
+        for (long parent = 0; parent < num_nodes; parent++) {
+            if (nodes_left(parent,0) == 1.) {
+                one_count++;
+
+                num_children = 0;
+                // count all existing nodes that have this parent
+                for (long child = 0; child < num_nodes; child++)
+                    if (nodes_left(child,0) == 1. && child != parent)
+                        if (dag(parent,child) == 1.) {
+                            num_children++;
+                        }
+
+                if (num_children == 0) {    // count number of nodes with this node as parent
+                    nodes_left.Store (parent, 0, 0.);
+                    one_count--;
+                }
+            }
+        }
+    } while (one_count < last_count);
+
+
+    if (one_count > 0) {
+        return TRUE;    // dag is cyclic
+    } else {
+        return FALSE;   // removed all nodes as leaves, dag is acyclic
+    }
+}
+
+
+
+
+//___________________________________________________________________________________________
+void    Bgm::RandomizeGraph (_Matrix * graphMx, _SimpleList * order, long num_steps, bool fixed_order)
+{
+    long    step = 0, fail = 0;
+
+
+    // convert order into matrix format of edge permissions for more rapid look-up later  /* DEBUGGING ONLY */
+#ifdef __DEBUG_RG__
+    long    mode = 0;
+    _Matrix orderMx (num_nodes, num_nodes, false, true);
+
+    for (long p_rank = 0; p_rank < num_nodes; p_rank++) {
+        for (long c_rank = 0; c_rank < num_nodes; c_rank++) {
+            // use actual node id's to index into matrix - 1 indicates a permitted edge
+            orderMx.Store (order->lData[p_rank], order->lData[c_rank], p_rank > c_rank ? 1 : 0);
+        }
+    }
+#endif
+
+
+    // before we do anything, make sure that graph complies with order /* DEBUGGING */
+    // calculate number of parents for each child for rapid access later
+    _SimpleList     num_parents;
+
+    num_parents.Populate (num_nodes, 0, 0);
+
+    for (long child = 0; child < num_nodes; child++) {
+        for (long parent = 0; parent < num_nodes; parent++) {
+#ifdef __DEBUG_RG__
+            if ((*graphMx)(parent,child) > 0 && banned_edges(parent,child) > 0) {
+                WarnError (_String("BEFORE RandomizeGraph() there is a banned edge: ") & parent & "->" & child & " mode " & mode);
+                break;
+            }
+            if ((*graphMx)(parent,child) == 0 && enforced_edges(parent,child) > 0) {
+                WarnError (_String("BEFORE RandomizeGraph() there is a missing enforced edge: ") & parent & "->" & child);
+                break;
+            }
+
+            if ( (*graphMx)(parent, child)==1 && orderMx(parent, child)==0 ) {
+                WarnError (_String ("Order-network discrepancy at start of RandomizeGraph() at edge ") & parent & "->" & child);
+                break;
+            }
+#endif
+
+            if ( (*graphMx)(parent, child) > 0) {
+                num_parents.lData[child]++;
+            }
+        }
+        // end for
+
+        if (num_parents.lData[child] > max_parents.lData[child]) {
+            WarnError (_String ("Number of parents exceeds maximum BEFORE randomization of graph at node ") & child & " (" & num_parents.lData[child] & " > " & max_parents.lData[child] & ")\n" );
+            break;
+        }
+    }
+
+
+
+
+    // randomize graph
+    long    p_rank, c_rank, parent, child;
+
+    do {
+        // a fail-safe to avoid infinite loops
+        if (fail > MAX_FAIL_RANDOMIZE) {
+            WarnError(_String("Bgm::RandomizeGraph() failed to modify the graph in GraphMCMC() after MAX_FAIL_RANDOMIZE (") & (long)MAX_FAIL_RANDOMIZE & ") attempts.\n");
+            break;
+        }
+
+        // pick a random edge permitted under ordering
+        p_rank  = (genrand_int32() % (num_nodes-1)) + 1;    // shift right to not include lowest node in order
+        c_rank  = genrand_int32() % p_rank;
+
+        child = order->lData[c_rank];
+        parent = order->lData[p_rank];
+
+
+        if (fixed_order || genrand_real2() > RANDOMIZE_PROB_SWAP) { // attempt an add or delete
+            if ( (*graphMx)(parent,child) == 0 && !banned_edges(parent,child)) {    // add an edge
+#ifdef __DEBUG_RG__
+                mode = 0;
+#endif
+                if (num_parents.lData[child] == max_parents.lData[child]) { // child cannot accept any additional edges
+                    // move an edge from an existing parent to target parent
+                    _SimpleList     removeable_edges;
+
+                    // build a list of current parents
+                    for (long par = 0; par < num_nodes; par++)
+                        if ((*graphMx)(par,child) && !enforced_edges(par,child)) {
+                            removeable_edges << par;
+                        }
+
+                    if (removeable_edges.lLength > 0) {
+                        // shuffle the list and remove the first parent
+                        removeable_edges.Permute(1);
+                        graphMx->Store (removeable_edges.lData[0], child, 0.);
+                        graphMx->Store (parent, child, 1.);
+                        step++;
+                    } else {
+                        // none of the edges can be removed
+                        fail++;
+                    }
+                } else {
+                    // child can accept another edge
+                    graphMx->Store (parent, child, 1.);
+                    num_parents.lData[child]++;
+                    step++;
+                }
+            } else if ( (*graphMx)(parent,child) == 1 && !enforced_edges(parent,child)) {   // delete an edge
+#ifdef __DEBUG_RG__
+                mode = 1;
+#endif
+                graphMx->Store (parent, child, 0.);
+                num_parents.lData[child]--;
+                step++;
+            } else {
+                fail++;
+            }
+        } else {    // swap nodes in ordering and flip edge if present
+            long    ok_to_go = 1;
+#ifdef __DEBUG_RG__
+            mode = 2;
+#endif
+            // edge cannot be flipped
+            if ( (*graphMx)(parent,child) == 1  &&  ( banned_edges(child,parent) || enforced_edges(parent,child) )  ) {
+                ok_to_go = 0;
+            }
+
+
+            // check all other nodes affected by the swap
+            if (ok_to_go) {
+                for (long bystander, i=c_rank+1; i < p_rank; i++) {
+                    bystander = order->lData[i];    // retrieve node id
+
+                    if (
+                        ( (*graphMx)(parent,bystander)==1 && enforced_edges (parent, bystander) )  ||
+                        ( (*graphMx)(bystander,child)==1 && enforced_edges (bystander, child) )  ||
+                        banned_edges (bystander,parent)  ||  banned_edges (child,bystander)
+                    ) {
+                        // by flipping the parent->child edge, we would screw up ordering for
+                        // an enforced edge:  C < B < P   becomes  P < B < C  where B->C or P->B is enforced
+
+                        // also, a banned edge implies a node ordering constraint
+                        ok_to_go = 0;
+                        break;
+                    }
+                }
+            }
+
+
+            // if everything checks out OK
+            if ( ok_to_go ) {
+                // flip the target edge
+                if ( (*graphMx)(parent,child) == 1 && !banned_edges(child,parent) ) {
+                    graphMx->Store (parent, child, 0);
+                    graphMx->Store (child, parent, 1);
+                    num_parents.lData[child]--;
+                    num_parents.lData[parent]++;
+
+                    if (num_parents.lData[parent] > max_parents.lData[parent]) {
+                        // parent cannot accept any more edges, delete one of the edges at random (including the edge to flip)
+                        _SimpleList     removeable_edges;
+
+                        for (long par = 0; par < num_nodes; par++)
+                            if (  (*graphMx)(par, parent)  &&  !enforced_edges(par, parent)  ) {
+                                removeable_edges << par;
+                            }
+
+                        removeable_edges.Permute(1);
+                        graphMx->Store (removeable_edges.lData[0], parent, 0.);
+                        num_parents.lData[parent]--;
+                    }
+
+                    step++;
+                }
+                // if number of parents for parent node will exceed maximum, then the edge is deleted instead of flipped
+
+                // swap nodes in order
+                order->lData[p_rank] = child;
+                order->lData[c_rank] = parent;  // remember to update order matrix also!
+
+
+                // flip the other edges affected by node swap
+                //  child <-  N   ...   N <- parent                   _________________,
+                //                                    becomes        |                 v
+                //                                                 parent    N         N    child
+                //                                                           ^                |
+                //                                                           `----------------+
+                for (long bystander, i = c_rank+1; i < p_rank; i++) {
+                    bystander = order->lData[i];
+
+                    if ( (*graphMx)(bystander, child) == 1 ) {
+                        graphMx->Store (bystander, child, 0);
+                        num_parents.lData[child]--;
+
+                        graphMx->Store (child, bystander, 1);
+                        num_parents.lData[bystander]++;
+
+                        if (num_parents.lData[bystander] > max_parents.lData[bystander]) {
+                            _SimpleList     removeable_edges;
+
+                            for (long par = 0; par < num_nodes; par++)
+                                if (  (*graphMx)(par, bystander)  &&  !enforced_edges(par, bystander)  ) {
+                                    removeable_edges << par;
+                                }
+
+                            removeable_edges.Permute(1);
+                            graphMx->Store (removeable_edges.lData[0], bystander, 0.);
+                            num_parents.lData[bystander]--;
+                        }
+                    }
+
+                    if ( (*graphMx)(parent,bystander) == 1) {
+                        graphMx->Store (parent, bystander, 0);
+                        num_parents.lData[bystander]--;
+
+                        graphMx->Store (bystander, parent, 1);
+                        num_parents.lData[parent]++;
+
+                        if (num_parents.lData[parent] > max_parents.lData[parent]) {
+                            _SimpleList     removeable_edges;
+
+                            for (long par = 0; par < num_nodes; par++)
+                                if (  (*graphMx)(par, parent)  &&  !enforced_edges(par, parent)  ) {
+                                    removeable_edges << par;
+                                }
+
+                            removeable_edges.Permute(1);
+                            graphMx->Store (removeable_edges.lData[0], parent, 0.);
+                            num_parents.lData[parent]--;
+                        }
+                    }
+                }
+#ifdef __DEBUG_RG__
+                // refresh order matrix
+                for (long p_rank = 0; p_rank < num_nodes; p_rank++) {
+                    for (long c_rank = 0; c_rank < p_rank; c_rank++) {
+                        orderMx.Store (order->lData[p_rank], order->lData[c_rank], 1);
+                    }
+                }
+#endif
+                step++;
+            } else {
+                fail++;
+            }
+        }
+    } while (step < num_steps);
+
+
+    // a final check to make sure we haven't screwed up!
+#ifdef __DEBUG_RG__
+    num_parents.Populate (num_nodes, 0, 0);
+
+    for (long child = 0; child < num_nodes; child++) {
+        for (long parent = 0; parent < num_nodes; parent++) {
+            if ((*graphMx)(parent,child) > 0 && banned_edges(parent,child) > 0) {
+                WarnError (_String("Aw crap!  RandomizeGraph() introduced a banned edge: ") & parent & "->" & child & " mode " & mode);
+                break;
+            }
+            if ((*graphMx)(parent,child) == 0 && enforced_edges(parent,child) > 0) {
+                WarnError (_String("Aw crap!  RandomizeGraph() deleted an enforced edge: ") & parent & "->" & child);
+                break;
+            }
+            if ( (*graphMx)(parent, child)==1 && orderMx(parent, child)==0 ) {
+                WarnError (_String ("Order-network discrepancy at end of RandomizeGraph(), mode ") & mode);
+                break;
+            }
+
+            if ( (*graphMx)(parent, child) > 0) {
+                num_parents.lData[child]++;
+            }
+        }
+
+        if (num_parents.lData[child] > max_parents.lData[child]) {
+            WarnError (_String ("Exceeded acceptable number of parents for node ") & child &  ", mode " & mode);
+            break;
+        }
+    }
+#endif
+}
+
+
+
+//___________________________________________________________________________________________
+void    Bgm::RandomizeDag (long num_steps)
+{
+
+    for (long step = 0; step < num_steps; step++) {
+        // store current graph in case altered graph becomes cyclic
+        _Matrix reset_dag (num_nodes, num_nodes, false, true);
+        for (long h = 0; h < num_nodes; h++)
+            for (long v = 0; v < num_nodes; v++) {
+                reset_dag.Store (h,v,dag(h,v));
+            }
+
+        do {
+            for (long row = 0; row < num_nodes; row++) {
+                for (long col = 0; col < num_nodes; col++) {
+                    dag.Store (row,col,reset_dag(row,col));
+                }
+            }
+
+
+            // select a random arc, discarding cycles and banned edges
+            long    row     = 0,
+                    col      = row;
+
+            while (col == row && banned_edges(row,col) == 1) {
+                row = genrand_int32() % num_nodes;
+                col = genrand_int32() % num_nodes;
+            }
+
+            // printf ("RandomizeDag() picked %d,%d\n", row, col);
+
+            if (dag(row,col) == 0.) {
+                if (dag(col,row) == 0.) {   // no arc
+                    // add an arc -- sum over n-th column gives number of parents for n-th child
+                    if (MarginalSum(FALSE,col) < max_parents.lData[col]) {
+                        dag.Store (row,col,1.);
+                    }
+                } else {
+                    // reverse or remove arc
+                    dag.Store (col,row,0.);
+                    if (genrand_int32() % 2 == 0) {
+                        dag.Store (row,col,1.);
+                    }
+                }
+            } else {
+                if (dag(col,row) == 0.) {
+                    // reverse or remove
+                    dag.Store (row,col,0.);
+                    if (genrand_int32() % 2 == 0) {
+                        dag.Store (col,row,1.);
+                    }
+                } else {
+                    // double arc, set to one of three legal arcs
+                    long    option = genrand_int32() % 3;
+                    if (option == 0) {
+                        dag.Store (row,col,0.);
+                    } else if (option == 1) {
+                        dag.Store (col,row,0.);
+                    } else {
+                        dag.Store (row,col,0.);
+                        dag.Store (col,row,0.);
+                    }
+                }
+            }
+
+            // PrintGraph(nil);
+
+        } while ( IsCyclic() );
+    }
+    // end loop over steps
+}
+
+
+
+
+//___________________________________________________________________________________________
+//  Wrappers to retain original functionality.
+_Parameter  Bgm::ComputeDiscreteScore (long node_id)
+{
+    _SimpleList     parents;
+
+    for (long par = 0; par < num_nodes; par++) {
+        if (dag(par, node_id) == 1 && is_discrete.lData[par]) {
+            parents << par;
+        }
+    }
+
+    return ComputeDiscreteScore (node_id, parents);
+}
+
+_Parameter  Bgm::ComputeDiscreteScore (long node_id, _Matrix * g)
+{
+    _SimpleList     parents;
+
+    for (long par = 0; par < num_nodes; par++) {
+        if ((*g)(par, node_id) == 1 && is_discrete.lData[par]) {
+            parents << par;
+        }
+    }
+
+    return ComputeDiscreteScore (node_id, parents);
+}
+
+
+//___________________________________________________________________________________________
+//#define BGM_DEBUG_CDS
+_Parameter  Bgm::ComputeDiscreteScore (long node_id, _SimpleList & parents)
+{
+    //char          buf [255];
+
+    // use cached node scores if possible
+    if (scores_cached) {
+        _List *     scores  = (_List *) node_scores.lData[node_id];
+
+        if (parents.lLength == 0) {
+            _Constant *     orphan_score = (_Constant *) scores->lData[0];
+            return (_Parameter) orphan_score->Value();
+        } else if (parents.lLength == 1) {
+            _Matrix *   single_parent_scores = (_Matrix *) scores->lData[1];
+            return (_Parameter) (*single_parent_scores) (parents.lData[0], 0);
+        } else {
+            _NTupleStorage *    family_scores   = (_NTupleStorage *) scores->lData[parents.lLength];
+            _SimpleList         nktuple;
+
+            for (long i = 0; i < parents.lLength; i++) {    // map parents back to nk-tuple
+                long    par = parents.lData[i];
+                if (par > node_id) {
+                    par--;
+                }
+                nktuple << par;
+            }
+            return (_Parameter) family_scores->Retrieve (nktuple);  // using nk-tuple
+        }
+    }
+
+
+
+#ifdef __MISSING_DATA__
+    //  Are any of the edges banned?
+    for (long par = 0; par < parents.lLength; par++) {
+        if (banned_edges(parents.lData[par], node_id) > 0) {
+            // score should never be used
+            ReportWarning(_String("Skipping node score for family containing banned edge ") & parents.lData[par] & "->" & node_id & "\n");
+            return (-A_LARGE_NUMBER);
+        }
+    }
+
+
+    //  Is node with missing data in Markov blanket of focal node?
+    if (has_missing.lData[node_id]) {
+        //return (ImputeDiscreteScore (node_id, parents));
+        return (GibbsApproximateDiscreteScore (node_id, parents));
+    } else {
+        for (long par = 0; par < parents.lLength; par++) {
+            if (has_missing.lData[parents.lData[par]]) {
+                // return (ImputeDiscreteScore (node_id, parents));
+                return (GibbsApproximateDiscreteScore (node_id, parents));
+            }
+        }
+    }
+#endif
+
+
+    _SimpleList     multipliers ((long)1);
+
+    // else need to compute de novo
+    _Matrix     n_ijk,
+                n_ij;       // [i] indexes child nodes,
+    // [j] indexes combinations of values for parents of i-th node,
+    // [k] indexes values of i-th node
+
+    long        num_parent_combos   = 1,                    // i.e. 'q'
+                r_i                   = num_levels.lData[node_id];
+
+    _Parameter  n_prior_ijk = 0,
+                n_prior_ij  = 0,
+                log_score  = 0;
+
+
+
+    // how many combinations of parental states are there?
+    for (long par = 0; par < parents.lLength; par++) {
+        num_parent_combos *= num_levels.lData[parents.lData[par]];
+        multipliers << num_parent_combos;
+    }
+
+
+#ifdef BGM_DEBUG_CDS
+    snprintf (buf, sizeof(buf), "Multipliers: ");
+    BufferToConsole (buf);
+    for (long i = 0; i < multipliers.lLength; i++) {
+        snprintf (buf, sizeof(buf), "%d ", multipliers.lData[i]);
+        BufferToConsole (buf);
+    }
+    NLToConsole();
+#endif
+
+
+    /* count observations by parent combination, using direct indexing */
+    CreateMatrix (&n_ijk, num_parent_combos, r_i, false, true, false);
+    CreateMatrix (&n_ij, num_parent_combos, 1, false, true, false);
+
+
+#ifdef __MISSING_DATA__
+    /*  METHODS FOR COMPLETE DATA  */
+    for (long obs = 0; obs < obsData->GetHDim(); obs++) {
+        long    index           = 0,
+                //multiplier    = 1,
+                child_state     = (*obsData)(obs, node_id);
+
+        for (long par = 0; par < parents.lLength; par++) {
+            long    this_parent         = parents.lData[par],
+                    this_parent_state = (*obsData)(obs, this_parent);
+
+            index += this_parent_state * multipliers.lData[par];
+        }
+
+        n_ijk.Store ((long) index, child_state, n_ijk(index, child_state) + 1 );
+        n_ij.Store ((long) index, 0, n_ij(index, 0) + 1 );
+    }
+
+
+#ifdef BGM_DEBUG_CDS
+    snprintf (buf, sizeof(buf), "Node %d, parent(s) ", node_id);
+    BufferToConsole (buf);
+
+    for (long k = 0; k < parents.lLength; k++) {
+        snprintf (buf, sizeof(buf), "%d ", parents.lData[k]);
+        BufferToConsole (buf);
+    }
+    NLToConsole();
+
+    for (long j = 0; j < num_parent_combos; j++) {
+        snprintf (buf, sizeof(buf), "N(%d,%d) = %f\n", node_id, j, n_ij(j,0));
+        BufferToConsole (buf);
+
+        for (long k = 0; k < r_i; k++) {
+            snprintf (buf, sizeof(buf), "N(%d,%d,%d) = %f\n", node_id, j, k, n_ijk(j,k));
+            BufferToConsole (buf);
+        }
+    }
+#endif
+
+
+    if (prior_sample_size (node_id, 0) == 0) {  // K2
+        for (long j = 0; j < num_parent_combos; j++) {
+            log_score += LnGamma(num_levels.lData[node_id]);    // (r-1)!
+            log_score -= LnGamma(n_ij(j, 0) + num_levels.lData[node_id]);   // (N+r-1)!
+
+            for (long k = 0; k < r_i; k++) {
+                log_score += LnGamma (n_ijk(j,k) + 1);    // (N_ijk)!
+            }
+
+#ifdef BGM_DEBUG_CDS
+            snprintf (buf, sizeof(buf), "\tlog(r-1)! = log %d! = %lf\n", num_levels.lData[node_id] - 1, LnGamma(num_levels.lData[node_id]));
+            BufferToConsole (buf);
+
+            snprintf (buf, sizeof(buf), "\tlog(N(%d,%d)+r-1)! = log %d! = %lf\n", node_id, j, ((long)n_ij(j, 0)) + r_i - 1,
+                     LnGamma(n_ij(j, 0) + num_levels.lData[node_id]));
+            BufferToConsole (buf);
+
+            for (long k = 0; k < r_i; k++) {
+                snprintf (buf, sizeof(buf), "\tlog (N(%d,%d,%d)!) = log %d! = %lf\n", node_id, j, k, ((long)n_ijk(j,k)), LnGamma(n_ijk(j,k) + 1));
+                BufferToConsole (buf);
+            }
+
+            snprintf (buf, sizeof(buf), "j = %d\tcumulative log score = %lf\n", j, log_score);
+            BufferToConsole (buf);
+#endif
+        }
+    } else {    // BDe
+        n_prior_ij = prior_sample_size (node_id, 0) / num_parent_combos;
+        n_prior_ijk = n_prior_ij / num_levels.lData[node_id];
+
+        for (long j = 0; j < num_parent_combos; j++) {
+            log_score += LnGamma(n_prior_ij) - LnGamma(n_prior_ij + n_ij(j,0));
+
+            for (long k = 0; k < num_levels.lData[node_id]; k++) {
+                log_score += LnGamma(n_prior_ijk + n_ijk(j,k)) - LnGamma(n_prior_ijk);
+            }
+        }
+    }
+
+#else
+    for (long obs = 0; obs < obsData->GetHDim(); obs++) {
+        long    index       = 0,
+                //multiplier   = 1,
+                child_state = (*obsData)(obs, node_id);
+
+        for (long par = 0; par < parents.lLength; par++) {
+            long    this_parent         = parents.lData[par],
+                    this_parent_state = (*obsData)(obs, this_parent);
+
+
+            /*      // this system doesn't work with unequal levels!  :-P  afyp March 31, 2008
+            index += this_parent_state * multiplier;
+            multiplier *= num_levels.lData[this_parent];
+             */
+            index += this_parent_state * multipliers.lData[par];
+        }
+
+        n_ijk.Store ((long) index, child_state, n_ijk(index, child_state) + 1);
+        n_ij.Store ((long) index, 0, n_ij(index, 0) + 1);
+
+    }
+
+
+
+    /* compute scoring metric */
+    if (prior_sample_size (node_id, 0) == 0) {
+        /* assume no prior information, use K2 metric */
+        for (long j = 0; j < num_parent_combos; j++) {
+            log_score += LnGamma(r_i);  // (r-1)!
+            log_score -= LnGamma(n_ij(j, 0) + r_i); // (N+r-1)!
+
+            for (long k = 0; k < num_levels.lData[node_id]; k++) {
+                log_score += LnGamma(n_ijk(j,k) + 1);    // (N_ijk)!
+            }
+
+
+
+            snprintf (buf, sizeof(buf), "Node %d, parent(s) ", node_id);
+            BufferToConsole (buf);
+
+            for (long k = 0; k < parents.lLength; k++) {
+                snprintf (buf, sizeof(buf), "%d ", parents.lData[k]);
+                BufferToConsole (buf);
+            }
+            NLToConsole();
+
+            snprintf (buf, sizeof(buf), "j = %d\tcumulative log score = %lf\n", j, log_score);
+            BufferToConsole (buf);
+
+#ifdef BGM_DEBUG_CDS
+            snprintf (buf, sizeof(buf), "\tlog(r-1)! = log %d! = %lf\n", num_levels.lData[node_id] - 1, LnGamma(num_levels.lData[node_id]));
+            BufferToConsole (buf);
+
+            snprintf (buf, sizeof(buf), "\tlog(N+r-1)! = log %d! = %lf\n", n_ij(j, 0) + num_levels.lData[node_id] - 1,
+                     LnGamma(n_ij(j, 0) + num_levels.lData[node_id]));
+            BufferToConsole (buf);
+
+            for (long k = 0; k < num_levels.lData[node_id]; k++) {
+                snprintf (buf, sizeof(buf), "\tlog (N_ijk)! = log %d! = %lf\n", ((long)n_ijk(j,k)), LnGamma(n_ijk(j,k) + 1));
+                BufferToConsole (buf);
+            }
+
+
+#endif
+        }
+    } else {
+        /* calculate Bayesian Dirichlet metric (BDeu) for this node */
+        /* see p212 in Heckerman, Geiger, and Chickering (1995) Machine Learning 20, 197-243 */
+        n_prior_ij = prior_sample_size (node_id, 0) / num_parent_combos;
+        n_prior_ijk = n_prior_ij / num_levels.lData[node_id];
+
+        for (long j = 0; j < num_parent_combos; j++) {
+            log_score += LnGamma(n_prior_ij) - LnGamma(n_prior_ij + n_ij(j,0));
+
+            for (long k = 0; k < num_levels.lData[node_id]; k++) {
+                log_score += LnGamma(n_prior_ijk + n_ijk(j,k)) - LnGamma(n_prior_ijk);
+            }
+        }
+    }
+#endif
+
+    /*
+    snprintf (buf, sizeof(buf), "Node %d, parents (%d): ", node_id, parents.lLength);
+    BufferToConsole (buf);
+
+    for (long par = 0; par < parents.lLength; par++)
+    {
+        snprintf (buf, sizeof(buf), " %d", parents.lData[par]);
+        BufferToConsole (buf);
+    }
+    snprintf (buf, sizeof(buf), " Log score = %f\n", log_score);
+    BufferToConsole (buf);
+    */
+
+    return (log_score);
+}
+
+
+
+
+//___________________________________________________________________________________________
+//#define __DEBUG_CNS__
+void Bgm::CacheNodeScores (void)
+{
+    if (scores_cached) {
+        return;
+    }
+
+    /*
+    char buf [255];
+    snprintf (buf, sizeof(buf), "\nCaching node scores...\n");
+    BufferToConsole (buf);
+    */
+
+
+#if defined __HYPHYMPI_ND__
+    _Parameter  use_mpi_caching;
+    checkParameter (useMPIcaching, use_mpi_caching, 0);
+
+    if (use_mpi_caching) {
+
+        // MPI_Init() is called in main()
+        int     size,
+                rank;
+
+        long    mpi_node;
+
+        _Matrix     single_parent_scores (num_nodes, 1, false, true);
+
+        _SimpleList parents,
+                    all_but_one (num_nodes-1, 0, 1),
+                    aux_list,
+                    nk_tuple;
+
+        _Parameter  score;
+
+        char        mpi_message [256];
+
+        MPI_Status  status; // contains source, tag, and error code
+
+        MPI_Comm_size (MPI_COMM_WORLD, &size);  // number of processes
+        MPI_Comm_rank (MPI_COMM_WORLD, &rank);
+
+
+        if (rank == 0) {
+            _String     bgmSwitch ("_BGM_SWITCH_"),
+                        bgmStr;
+
+            _List   *   this_list;
+
+            SerializeBgm (bgmStr);
+#ifdef __DEBUG_CNS__
+            ReportWarning (bgmStr);
+#endif
+            _Matrix     * mpi_node_status = new _Matrix ((long)size, 2, false, true);
+            long        senderID;
+
+
+
+            // switch compute nodes from mpiNormal to bgm loop context
+            for (long ni = 1; ni < size; ni++) {
+                MPISendString (bgmSwitch, ni);
+            }
+
+
+
+            // receive confirmation of successful switch
+            for (long ni = 1; ni < size; ni++) {
+                long fromNode = ni;
+
+                _String t (MPIRecvString (ni,fromNode));
+                if (!t.Equal (&bgmSwitch)) {
+                    WarnError (_String("Failed to confirm MPI mode switch at node ") & ni);
+                    return;
+                } else {
+                    ReportWarning (_String("Successful mode switch to Bgm MPI confirmed from node ") & ni);
+                    MPISendString (bgmStr, ni);
+                }
+            }
+
+
+            long node_id;
+
+            // farm out jobs to idle nodes until none are left
+            for ( node_id = 0; node_id < num_nodes; node_id++) {
+                long        maxp            = max_parents.lData[node_id],
+                            ntuple_receipt,
+                            this_node;
+
+                bool        remaining;
+
+                _String     mxString,
+                            mxName;
+
+
+                this_list   = (_List *) node_scores.lData[node_id];
+
+                // [_SimpleList parents] should always be empty here
+                _Parameter  score       = is_discrete.lData[node_id] ? ComputeDiscreteScore (node_id, parents) : ComputeContinuousScore (node_id);
+                _Constant   orphan_score (score);
+
+
+                this_list->Clear();
+                (*this_list) && (&orphan_score);    // handle orphan score locally
+
+
+                if (maxp > 0) { // don't bother to farm out trivial cases
+                    // look for idle nodes
+                    mpi_node = 1;
+                    do {
+                        if ((*mpi_node_status)(mpi_node, 0) == 0) {
+                            ReportMPIError(MPI_Send(&node_id, 1, MPI_LONG, mpi_node, HYPHY_MPI_VARS_TAG, MPI_COMM_WORLD), true);
+                            ReportWarning (_String ("Sent child ") & node_id & " to node " & mpi_node);
+
+                            mpi_node_status->Store (mpi_node, 0, 1);    // set busy signal
+                            mpi_node_status->Store (mpi_node, 1, node_id);
+
+                            break;
+                        }
+                        mpi_node++;
+                    } while (mpi_node < size);
+                }
+
+
+                if (mpi_node == size) { // all nodes are busy, wait for one to send results
+                    MPIReceiveScores (mpi_node_status, true, node_id);
+                }
+            }
+            // end loop over child nodes
+
+
+            // collect remaining jobs
+            while (1) {
+                // look for a busy node
+                mpi_node = 1;
+                do {
+                    if ( (*mpi_node_status)(mpi_node,0) == 1) {
+                        break;
+                    }
+                    mpi_node++;
+                } while (mpi_node < size);
+
+
+                if (mpi_node < size) {  // at least one node is busy
+                    MPIReceiveScores (mpi_node_status, false, 0);
+                } else {
+                    break;
+                }
+            }
+
+
+            // shut down compute nodes
+            for (long shutdown = -1, mpi_node = 1; mpi_node < size; mpi_node++) {
+                ReportMPIError(MPI_Send(&shutdown, 1, MPI_LONG, mpi_node, HYPHY_MPI_VARS_TAG, MPI_COMM_WORLD), true);
+                ReportWarning (_String ("Node 0 sending shutdown signal to node ") & mpi_node);
+            }
+
+        } else {    // compute node
+            long        node_id,
+                        maxp;
+
+            _List       list_of_matrices;
+
+            while (1) {
+                _String     mxString,
+                            mxName;
+
+                list_of_matrices.Clear();
+
+
+                // wait for master node to issue node ID to compute
+                ReportMPIError (MPI_Recv (&node_id, 1, MPI_LONG, 0, HYPHY_MPI_VARS_TAG, MPI_COMM_WORLD, &status), false);
+                ReportWarning (_String("Node ") & (long)rank & " received child " & (long)node_id & " from node " & (long)status.MPI_SOURCE & "\n");
+
+                if (node_id < 0) {
+                    ReportWarning (_String("Node") & (long)rank & " recognizes shutdown signal.\n");
+                    break;  // received shutdown message (-1)
+                }
+
+
+                maxp = max_parents.lData[node_id];
+
+                parents.Clear();
+                parents.Populate (1,0,0);
+
+
+                // compute single parent scores
+                for (long par = 0; par < num_nodes; par++) {
+                    if (par == node_id) {   // child cannot be its own parent, except in Kansas
+                        single_parent_scores.Store (par, 0, 0.);
+                    } else {
+                        parents.lData[0] = par;
+                        single_parent_scores.Store (par, 0, is_discrete.lData[node_id] ? ComputeDiscreteScore (node_id, parents) :
+                                                    ComputeContinuousScore (node_id));
+                    }
+                }
+
+
+                // compute multiple parents cores
+                for (long np = 2; np <= maxp; np++) {
+                    parents.Clear();
+                    parents.Populate (np, 0, 0);
+
+                    if (all_but_one.NChooseKInit (aux_list, nk_tuple, np, false)) {
+                        bool        remaining;
+                        long        tuple_index     = 0,
+                                    num_ktuples      = exp(LnGamma(num_nodes) - LnGamma(num_nodes - np) - LnGamma(np+1));
+
+
+                        _Matrix     tuple_scores (num_ktuples, 1, false, true);
+
+                        for (long tuple_index = 0; tuple_index < num_ktuples; tuple_index++) {
+                            remaining = all_but_one.NChooseK (aux_list, nk_tuple);
+
+                            if (!remaining && tuple_index < num_ktuples-1) {
+                                ReportWarning (_String ("ERROR: Ran out of (n,k)tuples in CacheNodeScores()."));
+                            }
+
+                            for (long par_idx = 0; par_idx < np; par_idx++) {
+                                long par = nk_tuple.lData[par_idx];
+                                if (par >= node_id) {
+                                    par++;
+                                }
+                                parents.lData[par_idx] = par;
+                            }
+
+                            score = is_discrete.lData[node_id] ? ComputeDiscreteScore (node_id, parents) :
+                                    ComputeContinuousScore (node_id);
+
+                            tuple_scores.Store (tuple_index, 0, (double)score);
+                        }
+
+                        if (remaining) {
+                            ReportWarning (_String ("ERROR: Did not compute all nk-tuples in CacheNodeScores()"));
+                        }
+
+                        list_of_matrices && (&tuple_scores);        // append duplicate
+                    } else {
+                        ReportWarning (_String ("Failed to initialize _NTupleStorage object in Bgm::CacheNodeScores()"));
+                    }
+
+                }
+
+                // send results to master node
+
+                ReportMPIError (MPI_Send (single_parent_scores.theData, num_nodes, MPI_DOUBLE, 0, HYPHY_MPI_DATA_TAG, MPI_COMM_WORLD), true);
+
+
+                for (long np = 2; np <= maxp; np++) {
+                    _Matrix * storedMx      = (_Matrix *) list_of_matrices.lData[np-2];
+                    ReportMPIError (MPI_Send (storedMx->theData, storedMx->GetHDim(), MPI_DOUBLE, 0, HYPHY_MPI_DATA_TAG, MPI_COMM_WORLD), true);
+                }
+            }
+        }
+    } else {    // perform single-threaded
+#else
+
+
+#if !defined __UNIX__ || defined __HEADLESS__
+    TimerDifferenceFunction(false); // save initial timer; will only update every 1 second
+#if !defined __HEADLESS__
+    SetStatusLine     (empty,_HYBgm_STATUS_LINE_CACHE, empty, 0, HY_SL_TASK|HY_SL_PERCENT);
+#else
+    SetStatusLine     (_HYBgm_STATUS_LINE_CACHE);
+#endif
+    _Parameter  seconds_accumulator = .0,
+                temp;
+#endif
+
+    for (long node_id = 0; node_id < num_nodes; node_id++) {
+        long        maxp        = max_parents.lData[node_id];
+        _List   *   this_list   = (_List *) node_scores.lData[node_id]; // retrieve pointer to list of scores for this child node
+
+        this_list->Clear();     // reset the list
+
+        // prepare some containers
+        _SimpleList parents;
+        _Parameter  score = is_discrete.lData[node_id] ? ComputeDiscreteScore (node_id, parents) : ComputeContinuousScore (node_id);
+        _Constant   orphan_score (score);
+
+        (*this_list) && (&orphan_score);
+
+#if !defined __UNIX__ || defined __HEADLESS__
+        temp = .0;
+#endif
+
+        if (maxp > 0) {
+            _Matrix     single_parent_scores (num_nodes, 1, false, true);
+            for (long par = 0; par < num_nodes; par++) {
+                if (par == node_id) {   // child cannot be its own parent, except in Kansas
+                    continue;
+                }
+
+                parents << par;
+                single_parent_scores.Store (par, 0, is_discrete.lData[node_id] ? ComputeDiscreteScore (node_id, parents) :
+                                            ComputeContinuousScore (node_id));
+                parents.Clear();
+            }
+            (*this_list) && (&single_parent_scores);
+        }
+
+        if (maxp > 1) {
+            _SimpleList     all_but_one (num_nodes-1, 0, 1),    // 0, 1, 2, ... , n-1
+                            aux_list,
+                            nk_tuple;
+
+            for (long np = 2; np <= maxp; np++) {
+                _NTupleStorage  family_scores (num_nodes-1, np);
+
+                if (all_but_one.NChooseKInit (aux_list, nk_tuple, np, false)) {
+                    bool    remaining;
+                    long    res;
+                    do {
+                        remaining = all_but_one.NChooseK (aux_list, nk_tuple);
+                        for (long par_idx = 0; par_idx < np; par_idx++) {
+                            long par = nk_tuple.lData[par_idx];
+                            if (par >= node_id) {
+                                par++;
+                            }
+                            parents << par;
+                        }
+                        score = is_discrete.lData[node_id]  ?   ComputeDiscreteScore (node_id, parents) :
+                                ComputeContinuousScore (node_id);
+                        res = family_scores.Store (score, nk_tuple);
+                        parents.Clear();
+                    } while (remaining);
+                } else {
+                    _String oops ("Failed to initialize _NTupleStorage object in Bgm::CacheNodeScores().\n");
+                    WarnError(oops);
+                }
+                (*this_list) && (&family_scores);   // append duplicate to storage
+            }
+        }
+
+#if !defined __UNIX__ || defined __HEADLESS__
+        if ((temp=TimerDifferenceFunction(true))>1.0) { // time to update
+            seconds_accumulator += temp;
+
+            _String statusLine = _HYBgm_STATUS_LINE_CACHE & " " & (node_id+1) & "/" & num_nodes
+                                 & " nodes (" & (1.0+node_id)/seconds_accumulator & "/second)";
+
+#if defined __HEADLESS__
+            SetStatusLine (statusLine);
+#else
+            SetStatusLine (empty,statusLine,empty,100*(float)node_id/(num_nodes),HY_SL_TASK|HY_SL_PERCENT);
+#endif
+            TimerDifferenceFunction (false); // reset timer for the next second
+            yieldCPUTime (); // let the GUI handle user actions
+
+            if (terminateExecution) { // user wants to cancel the analysis
+                break;
+            }
+        }
+#endif
+
+    } // end for loop over nodes
+#endif
+
+
+#if defined __HYPHYMPI_ND__
+    }
+#endif
+
+#if !defined __UNIX__ || defined __HEADLESS__
+    SetStatusLine     (_HYBgm_STATUS_LINE_CACHE_DONE);
+#endif
+
+    scores_cached = TRUE;
+
+
+}
+
+
+
+
+//___________________________________________________________________________________________
+#if defined __HYPHYMPI__
+void    Bgm::MPIReceiveScores (_Matrix * mpi_node_status, bool sendNextJob, long node_id)
+{
+    _Matrix     single_parent_scores (num_nodes, 1, false, true);
+    MPI_Status  status;
+
+    ReportMPIError (MPI_Recv (single_parent_scores.theData, num_nodes, MPI_DOUBLE, MPI_ANY_SOURCE, HYPHY_MPI_DATA_TAG, MPI_COMM_WORLD, &status), false);
+
+
+    long        senderID    = (long) status.MPI_SOURCE,
+                this_node    = (long) (*mpi_node_status) (senderID, 1),
+                maxp       = max_parents.lData[this_node];
+
+    _List   *   this_list   = (_List *) node_scores.lData[this_node];
+
+
+    mpi_node_status->Store (senderID, 0, 0);    // set node status to idle
+
+
+    _String     mxString,
+                mxName;
+
+    ReportWarning (_String("Received scores for child ") & this_node & " from node " & senderID);
+#ifdef __DEBUG_MPIRS__
+    mxName = _String ("single_parent_scores");
+    single_parent_scores.Serialize (mxString, mxName);
+    ReportWarning (mxString);
+#endif
+    (*this_list) && (&single_parent_scores);
+
+
+
+    _SimpleList     parents,
+                    all_but_one (num_nodes-1, 0, 1),
+                    aux_list,
+                    nk_tuple;
+
+    _Parameter      score;
+
+    // parse nk-tuple results
+    for (long np = 2; np <= maxp; np++) {
+        _NTupleStorage  family_scores (num_nodes-1, np);
+        bool            remaining;
+
+
+        if (all_but_one.NChooseKInit (aux_list, nk_tuple, np, false)) {
+            long        score_index     = 0,
+                        num_ktuples      = exp(LnGamma(num_nodes) - LnGamma(num_nodes - np) - LnGamma(np+1)),
+                        ntuple_receipt;
+
+            _Matrix     scores_to_store (num_ktuples, 1, false, true);
+
+            // receive nk-tuple indexed node scores from same compute node
+            ReportMPIError (MPI_Recv (scores_to_store.theData, num_ktuples, MPI_DOUBLE, senderID, HYPHY_MPI_DATA_TAG, MPI_COMM_WORLD, &status), false);
+#ifdef __DEBUG_MPIRS__
+            mxName = _String("tuple_scores") & np;
+            mxString.Initialize();
+            scores_to_store.Serialize (mxString, mxName);
+            ReportWarning (mxString);
+#endif
+
+            do {
+                remaining = all_but_one.NChooseK (aux_list, nk_tuple);  // update nk-tuple in aux_list
+                ntuple_receipt = family_scores.Store (scores_to_store(score_index, 0), nk_tuple);
+                score_index++;
+            } while (remaining);
+        } else {
+            _String oops ("Failed to initialize _NTupleStorage object in Bgm::CacheNodeScores().\n");
+            WarnError(oops);
+        }
+
+        (*this_list) && (&family_scores);
+    }
+
+
+    // send next job
+    if (sendNextJob) {
+        ReportMPIError(MPI_Send(&node_id, 1, MPI_LONG, senderID, HYPHY_MPI_VARS_TAG, MPI_COMM_WORLD), true);
+        mpi_node_status->Store (senderID, 0, 1);    // reset busy signal
+        mpi_node_status->Store (senderID, 1, node_id);
+        ReportWarning (_String ("Sent child ") & node_id & " to node " & senderID);
+    }
+}
+#endif
+
+
+
+//___________________________________________________________________________________________
+_Matrix *   Bgm::ExportGraph (void)
+{
+    _Matrix * export_graph = new _Matrix ((_Matrix &)dag);  // duplicator
+
+    return (_Matrix *) (export_graph->makeDynamic());
+}
+
+
+
+
+//___________________________________________________________________________________________
+//  Allocate memory for storing node scores and edge posteriors
+
+void    Bgm::InitComputeLists (_List * compute_list)
+{
+    // adaptive storage for floating point numbers
+    _GrowingVector *    newstore;
+    checkPointer (newstore = new _GrowingVector);
+
+    for (long i = 0; i < num_nodes * num_nodes; i++) {
+        (*compute_list) && newstore;
+    }
+
+    DeleteObject (newstore);
+}
+
+
+
+//___________________________________________________________________________________________
+//  Free up memory allocated to cached node scores and edge posteriors
+
+void        Bgm::DumpComputeLists (_List * compute_list)
+{
+    for (long i = 0; i < compute_list->lLength; i++) {
+        ((_GrowingVector *) compute_list->lData[i]) -> Clear();
+    }
+
+    compute_list->Clear();
+}
+
+
+
+//___________________________________________________________________________________________
+_Parameter  Bgm::Compute (_SimpleList * node_order, _List * results)
+{
+    /*  Calculate equation (8) from Friedman and Koller (2003), i.e. joint probability
+        of data by summing all families at i-th node that are consistent with node order,
+        then taking product across all nodes in the network.  Traverse using AVL indexing.
+
+        Node order is a vector of length [num_nodes] containing rank of each node, i.e.
+        a position in an ordered sequence.  In addition, compute marginal posteriors of
+        each potential edge in the graph, by Proposition 3.2.                               */
+
+
+
+    _Parameter          log_likel   = 0.;
+    _GrowingVector      *gv1, *gv2;
+
+
+    // reset _GrowingVector objects stored in _List object
+    for (long i = 0; i < num_nodes * num_nodes; i++) {
+        gv1 = (_GrowingVector *) results->lData[i];
+        gv1 -> ZeroUsed();
+    }
+
+
+    for (long nodeIndex = 0; nodeIndex < node_order->lLength; nodeIndex++) {
+        long                child_node      = node_order->lData[nodeIndex],
+                            maxp            = max_parents.lData[child_node];
+
+        _List           *   score_lists     = (_List *) node_scores.lData[child_node];
+        _Constant       *   orphan_score    = (_Constant *) (score_lists->lData[0]);
+
+
+        gv1 = (_GrowingVector *) results->lData[child_node * num_nodes + child_node];   // store denominator in diagonal
+        gv1->ZeroUsed();
+        gv1 -> Store (orphan_score->Value());   // handle case of no parents
+
+
+
+        if (maxp > 0) {
+            // all nodes to the right are potential parents, except banned parents!
+            _SimpleList     precedes;
+            for (long parIndex = nodeIndex + 1; parIndex < node_order->lLength; parIndex++) {
+                long    par = node_order->lData[parIndex];
+
+                if (banned_edges(par, child_node) == 0) {
+                    precedes << par;
+                }
+            }
+
+
+            // handle trivial case of one parent
+            _Matrix *   single_parent_scores    = (_Matrix *) (score_lists->lData[1]);
+
+            for (long i = 0; i < precedes.lLength; i++) {
+                long    par = precedes.lData[i];
+
+                gv1 -> Store ((*single_parent_scores) (par, 0));
+                gv2 = (_GrowingVector *) results->lData[child_node * num_nodes + par];
+                gv2 -> Store ((*single_parent_scores) (par, 0));
+            }
+
+
+            // more than one parent requires k-tuples
+            if (maxp > 1) {
+                _SimpleList         indices (precedes.lLength, 0, 1);   // populates list with 0, 1, 2, ..., M-1
+                // where M is the number of eligible parents in [precedes]
+                _NTupleStorage *    family_scores;
+
+                for (long nparents = 2; nparents <= maxp; nparents++) {
+                    _SimpleList     subset,
+                                    auxil;
+
+                    bool            not_finished;
+
+
+                    if (nparents > precedes.lLength) {  // not enough eligible parents to form tuples!
+                        break;
+                    }
+
+
+                    if (indices.NChooseKInit (auxil, subset, nparents, false)) {
+                        _Parameter      tuple_score;
+                        _SimpleList     parents;
+
+                        parents.Populate (nparents, 0, 0);  // allocate memory
+
+                        family_scores = (_NTupleStorage *) (score_lists->lData[nparents]);
+
+
+                        do {
+                            //parents.Clear();
+                            not_finished = indices.NChooseK (auxil, subset);    // cycle through index combinations
+
+
+                            for (long i = 0; i < nparents; i++) {   // convert indices to parent IDs (skipping child)
+                                long    realized = precedes.lData[subset.lData[i]];
+                                if (realized >= child_node) {
+                                    realized--;
+                                }
+                                parents.lData[i] = realized;
+                            }
+                            parents.Sort(TRUE);
+
+                            tuple_score = family_scores -> Retrieve (parents);
+
+                            gv1 -> Store (tuple_score);
+
+                            for (long i = 0; i < nparents; i++) {
+                                gv2 = (_GrowingVector *) results->lData[child_node * num_nodes + precedes.lData[subset.lData[i]]];
+                                gv2 -> Store (tuple_score);
+                            }
+                        } while (not_finished);
+                    }
+                }
+            }
+        }
+
+        gv1 -> _Matrix::Store (0, 0, LogSumExpo(gv1));  // replace first entry with sum, i.e. marginal log-likelihood of child node
+        log_likel += (*gv1)(0, 0);
+
+    }
+    // end loop over child nodes
+
+    return log_likel;
+}
+
+
+
+//___________________________________________________________________________________________
+_Parameter Bgm::Compute (void)
+{
+    //CacheNodeScores();
+
+    // return posterior probability of a given network defined by 'dag' matrix
+    _Parameter  log_score = 0.;
+
+    for (long node_id = 0; node_id < num_nodes; node_id++) {
+        log_score += is_discrete.lData[node_id] ? ComputeDiscreteScore (node_id) : ComputeContinuousScore (node_id);
+    }
+
+    return log_score;
+}
+
+
+
+//___________________________________________________________________________________________
+_Parameter Bgm::Compute (_Matrix * g)
+{
+    //CacheNodeScores();
+
+    // return posterior probability of a given network defined by 'dag' matrix
+    _Parameter  log_score = 0.;
+
+    for (long node_id = 0; node_id < num_nodes; node_id++) {
+        log_score += is_discrete.lData[node_id] ? ComputeDiscreteScore (node_id, g) : ComputeContinuousScore (node_id, g);
+    }
+
+    return log_score;
+}
+
+
+
+
+//___________________________________________________________________________________________
+_Matrix *   Bgm::Optimize (void)
+{
+#ifdef DEBUG_OPTIMIZE
+    char        buf [255];
+#endif
+
+    if (!scores_cached) {
+        CacheNodeScores();
+    }
+
+
+    _Parameter  num_restarts,           // HBL settings
+                num_randomize;
+
+    checkParameter (maxNumRestart, num_restarts, 1.);
+    checkParameter (numRandomize, num_randomize, num_nodes);
+    //checkParameter (useNodeOrder, use_node_order, 0);
+
+
+
+    // char     bug [255];
+    _Parameter      optMethod;  /* 0 = K2 fixed order; 1 = K2 shuffle order with restarts */
+    /* 2 = MCMC fixed order; 3 = MCMC over networks and orders */
+    checkParameter (bgmOptimizationMethod, optMethod, 0.);
+
+    if (optMethod > 1) {
+        return GraphMCMC( (optMethod < 3) ? TRUE : FALSE);      // use MCMC to evaluate posterior probability of network space
+    }
+
+
+
+    _Parameter  this_score, best_score, next_score;
+
+    _Matrix     orderMx (num_nodes, num_nodes, false, true),
+                best_dag (num_nodes, num_nodes, false, true);
+
+    bool        reshuffle_order = FALSE;
+
+
+    // if best node order hasn't been estimated,
+    if (optMethod == 1 && best_node_order.lLength == 0) {
+        reshuffle_order = TRUE;
+        best_node_order.Populate (num_nodes, 0, 1);
+        best_node_order.Permute (1);
+    }
+
+
+    //  Convert node order to binary matrix where edge A->B is permitted if
+    //  orderMx[B][A] = 1, i.e. B is to the right of A in node order.
+    for (long i = 0; i < num_nodes; i++) {
+        long    child = best_node_order.lData[i];
+
+        for (long j = 0; j < num_nodes; j++) {
+            long    parent = best_node_order.lData[j];
+
+            orderMx.Store (parent, child, (j > i) ? 1 : 0);
+        }
+    }
+
+
+    // greedy hill-climbing algorithm (K2)
+    ResetGraph (nil);
+    best_score = Compute();     // best over all node orders (if we're reshuffling)
+
+
+    for (long iter = 0; iter < num_restarts; iter++) {
+        next_score = Compute();     // reset to empty graph score
+
+
+        for (long child = 0; child < num_nodes; child++) {
+            long        num_parents = 0,
+                        improvement_flag = 0,
+                        next_parent_to_add;
+
+            do {
+                for (long parent = 0; parent < num_nodes; parent++) {
+                    if ( (parent != child)                      // must meet all conditions!
+                            && (dag(parent, child) == 0)
+                            && (orderMx (parent, child) == 1)
+                            && banned_edges(parent, child) == 0) {
+                        dag.Store (parent, child, 1);
+                        this_score = Compute();
+
+                        if (this_score > next_score) {
+                            improvement_flag    = 1;
+                            next_score          = this_score;
+                            next_parent_to_add  = parent;
+                        }
+                        dag.Store (parent, child, 0);   // revert
+                    }
+                }
+
+                if (improvement_flag) { // adding another parent improves network score
+                    dag.Store (next_parent_to_add, child, 1);
+                    num_parents++;
+                    improvement_flag = 0;   // reset for next parent
+                } else {
+                    break;  // unable to improve further
+                }
+            } while (num_parents < max_parents.lData[child]);
+        }
+
+
+        if (reshuffle_order) {
+            this_score = Compute();
+
+            if (this_score > best_score) {
+                best_score = this_score;
+                best_dag = (_Matrix &) dag;     // store graph optimized from the current ordering
+            }
+
+            ResetGraph (nil);
+
+            best_node_order.Permute (1);
+
+            for (long i = 0; i < num_nodes; i++) {
+                long    child = best_node_order.lData[i];
+                for (long j = 0; j < num_nodes; j++) {
+                    long    parent = best_node_order.lData[j];
+                    orderMx.Store (parent, child, (j > i) ? 1 : 0);
+                }
+            }
+        } else {
+            break;  // only one iteration when node ordering is known
+        }
+    }
+
+    if (reshuffle_order) {
+        dag = (_Matrix &) best_dag;
+        best_node_order.Clear();    // reset to initial state
+    }
+
+
+    _Matrix * result = new _Matrix(num_nodes * num_nodes, 2, false, true);
+    result->Store (0, 0, Compute());
+
+    for (long row = 0; row < num_nodes; row++) {
+        for (long col = 0; col < num_nodes; col++) {
+            result->Store (row*num_nodes+col, 1, dag(row, col));
+        }
+    }
+
+    return (_Matrix*)(result->makeDynamic());
+}
+
+
+
+//___________________________________________________________________________________________
+_Matrix *   Bgm::GraphMCMC (bool fixed_order)
+{
+    _Matrix     *   proposed_graph  = new _Matrix (num_nodes, num_nodes, false, true),
+    *   orderMx         = new _Matrix (num_nodes, num_nodes, false, true);
+
+    _Matrix         current_graph (num_nodes, num_nodes, false, true),
+                    best_graph (num_nodes, num_nodes, false, true);
+
+    _Parameter      mcmc_steps, mcmc_burnin, mcmc_samples,
+                    current_score, proposed_score, best_score,
+                    num_randomize,
+                    lk_ratio;
+
+    long            sampling_interval;
+
+    _SimpleList *   proposed_order  = new _SimpleList();
+    _SimpleList     current_order;
+
+
+    // parse HBL settings
+    checkParameter (mcmcSteps, mcmc_steps, 0);
+    if (mcmc_steps == 0) {
+        _String oops ("You asked HyPhy to run MCMC with zero steps in the chain! Did you forget to set Bgm_MCMC_STEPS?\n");
+        WarnError (oops);
+    }
+
+    checkParameter (mcmcBurnin, mcmc_burnin, 0);
+    checkParameter (mcmcSamples, mcmc_samples, 0);
+    if (mcmc_samples == 0) {
+        _String oops ("You're asking me to run MCMC without reporting any results.  Did you forget to set Bgm_MCMC_SAMPLES?\n");
+        WarnError (oops);
+    }
+
+    sampling_interval = (long) mcmc_steps / (long) mcmc_samples;
+
+    checkParameter (numRandomize, num_randomize, num_nodes*num_nodes);
+
+
+    //  Contents:   (1) chain trace;
+    //              (2) model-averaged edge probabilities;
+    //              (3) best graph;
+    _Matrix     * result;
+
+    checkPointer (result = new _Matrix ( (mcmc_samples > num_nodes*num_nodes) ? mcmc_samples : num_nodes*num_nodes, 3, false, true));
+
+
+
+    //  Set current graph to member object (dag, an empty graph by default)
+    ResetGraph (proposed_graph);
+
+    //  does this graph conform to enforced/banned edges, maximum parentage settings?
+    _SimpleList pars;
+    for (long chi = 0; chi < num_nodes; chi++) {
+        pars.Clear();
+        for (long par = 0; par < num_nodes; par++) {
+            if ( (*proposed_graph)(par,chi) == 1) {
+                if ( banned_edges(par,chi) ) {
+                    proposed_graph->Store(par, chi, 0);
+                    ReportWarning(_String("Deleted banned edge ") & par & "->" & chi & " from graph");
+                }
+                pars << par;
+            } else if ( (*proposed_graph)(par,chi) == 0 && enforced_edges(par,chi) ) {
+                proposed_graph->Store(par, chi, 1);
+                ReportWarning(_String("Restored enforced edge ") & par & "->" & chi & " to graph");
+            }
+        }
+
+        if (pars.lLength > max_parents.lData[chi]) {
+            ReportWarning(_String("Number of parents (") & (long)pars.lLength & ")exceed maximum setting for child node " & chi & ": " & max_parents.lData[chi] & "\n");
+            pars.Permute(1);
+            for (long p = 0; p < (long)pars.lLength - max_parents.lData[chi]; p++) {
+                proposed_graph->Store(pars.lData[p], chi, 0);
+                ReportWarning(_String("Deleted excess edge ") & pars.lData[p] & "->" & chi & " from graph");
+            }
+        }
+    }
+
+
+
+    if (fixed_order) {
+        // coerce graph to conform to user-defined node order
+        if (best_node_order.lLength == 0) {
+            _String oops ("Cannot run fixed-order graph MCMC without defined order (via order-MCMC). Run CovarianceMatrix(receptacle, BGM) first.");
+            WarnError (oops);
+
+            result = new _Matrix();     // return an empty matrix
+        } else {
+            proposed_order->Populate(num_nodes, 0, 0);  // allocate memory
+            for (long i = 0; i < num_nodes; i++) {
+                proposed_order->lData[i] = best_node_order.lData[i];
+            }
+
+            ReportWarning (_String("Transferring best node order to proposal: ") & (_String *)proposed_order->toStr());
+        }
+    } else {
+        if (best_node_order.lLength == 0) {
+            // quickly generate a node order from graph
+            for (long order_index, onode, node = 0; node < num_nodes; node++) {
+                // locate the lowest-ranked parent in the order, if any
+                for (order_index = 0; order_index < proposed_order->lLength; order_index++) {
+                    onode = proposed_order->lData[order_index];
+                    if ((*proposed_graph) (onode, node)) {
+                        // insert new node immediately left of this parent
+                        proposed_order->InsertElement ((BaseRef) node, order_index, false, false);
+                        break;
+                    }
+                }
+                // if reached end of order list without finding a parent, push node onto start of list
+                if (order_index == proposed_order->lLength) {
+                    proposed_order->InsertElement ((BaseRef) node, 0, false, false);
+                }
+            }
+            ReportWarning(_String("Constructed node order from graph:\n") & (_String *)proposed_order->toStr() & "\n");
+        } else {
+            // restore order
+            proposed_order->Populate(num_nodes,0,1);
+            for (long i = 0; i < num_nodes; i++) {
+                proposed_order->lData[i] = best_node_order.lData[i];
+            }
+        }
+    }
+
+
+    // randomize graph
+    if (num_randomize > 0) {
+        RandomizeGraph (proposed_graph, proposed_order, (long)num_randomize, fixed_order);
+    } else {
+        ReportWarning(_String("NUM_RANDOMIZE set to 0, skipping initial RandomizeGraph()\n"));
+    }
+
+
+
+    //  Populate order matrix -- and while we're at it, set proposed order to current order
+    for (long i = 0; i < num_nodes; i++) {
+        long    child = proposed_order->lData[i];
+
+        for (long j = 0; j < num_nodes; j++) {
+            //  if A precedes B, then set entry (A,B) == 1, permitting edge A->B
+            orderMx->Store (proposed_order->lData[j], child, (j > i) ? 1 : 0);
+        }
+    }
+    ReportWarning(_String("Populated order matrix\n"));
+
+
+    // status line
+#if !defined __UNIX__ || defined __HEADLESS__
+    long    updates = 0;
+    TimerDifferenceFunction (false);
+#if defined __HEADLESS__
+    SetStatusLine (_HYBgm_STATUS_LINE_MCMC);
+#else
+    SetStatusLine (empty, _HYBgm_STATUS_LINE_MCMC, empty, 0, HY_SL_TASK|HY_SL_PERCENT);
+#endif
+#endif
+
+
+
+
+
+    current_order = (*proposed_order);
+    current_graph = (_Matrix &) (*proposed_graph);
+    best_graph = (_Matrix &) (*proposed_graph);
+    best_score = proposed_score = current_score = Compute(proposed_graph);
+
+    ReportWarning(_String("Initiating MCMC with graph:\n") & (_String *) current_graph.toStr() );
+
+
+    // MAIN LOOP
+    for (long step = 0; step < mcmc_steps + mcmc_burnin; step++) {
+        RandomizeGraph (proposed_graph, proposed_order, 1, fixed_order);
+
+        proposed_score = Compute(proposed_graph);
+
+
+#ifdef __DEBUG_GMCMC__
+        snprintf (bug, sizeof(bug), "Current score = %f\n", current_score);
+        BufferToConsole (bug);
+        snprintf (bug, sizeof(bug), "Propose graph:\n");
+        BufferToConsole (bug);
+        PrintGraph (proposed_graph);
+        snprintf (bug, sizeof(bug), "Proposed score = %f\n", proposed_score);
+        BufferToConsole (bug);
+#endif
+
+
+        lk_ratio = exp(proposed_score - current_score);
+
+        if (lk_ratio > 1. || genrand_real2() < lk_ratio) {  // Metropolis-Hastings
+#ifdef __DEBUG_GMCMC__
+            snprintf (bug, sizeof(bug), "Accept move\n");
+            BufferToConsole (bug);
+#endif
+            current_graph       = (_Matrix &) (*proposed_graph);        // accept proposed graph
+            current_score   = proposed_score;
+
+            for (long foo = 0; foo < num_nodes; foo++) {
+                current_order.lData[foo] = proposed_order->lData[foo];
+            }
+
+            if (current_score > best_score) {
+                best_score = current_score;
+                best_graph = (_Matrix &) current_graph;         // keep track of best graph ever visited by chain
+
+#ifdef __DEBUG_GMCMC__
+                PrintGraph (&best_graph);
+
+                snprintf (bug, sizeof(bug), "Update best node ordering: ");
+                BufferToConsole (bug);
+                for (long deb = 0; deb < num_nodes; deb++) {
+                    snprintf (bug, sizeof(bug), "%d ", current_order.lData[deb]);
+                    BufferToConsole (bug);
+                }
+                NLToConsole ();
+#endif
+            }
+        } else {
+#ifdef __DEBUG_GMCMC__
+            snprintf (bug, sizeof(bug), "Reject move\n");
+            BufferToConsole (bug);
+#endif
+            // revert proposal
+            for (long row = 0; row < num_nodes; row++) {
+                proposed_order->lData[row] = current_order.lData[row];
+
+                for (long col = 0; col < num_nodes; col++) {
+                    proposed_graph->Store(row, col, current_graph(row, col));
+                }
+            }
+        }
+
+
+
+        if (step >= mcmc_burnin) {  // handle output
+            if ( (step-(long)mcmc_burnin) % sampling_interval == 0) {
+                long    entry   = (long int) ((step-mcmc_burnin) / sampling_interval);
+
+                result->Store (entry, 0, current_score);        // update chain trace
+
+                for (long row = 0; row < num_nodes; row++) {    // update edge tallies
+                    for (long offset=row*num_nodes, col = 0; col < num_nodes; col++) {
+                        // row = parent, col = child
+                        result->Store (offset+col, 1, (*result)(offset+col,1) + current_graph(row, col));
+                    }
+                }
+            }
+        }
+
+#if !defined __UNIX__ || defined __HEADLESS__
+        if (TimerDifferenceFunction(true)>1.0) { // time to update
+            updates ++;
+            _String statusLine = _HYBgm_STATUS_LINE_MCMC & " " & (step+1) & "/" & (mcmc_steps + mcmc_burnin)
+                                 & " steps (" & (1.0+step)/updates & "/second)";
+#if defined __HEADLESS__
+            SetStatusLine     (statusLine);
+#else
+            SetStatusLine     (empty,statusLine,empty,100*step/(mcmc_steps + mcmc_burnin),HY_SL_TASK|HY_SL_PERCENT);
+#endif
+            TimerDifferenceFunction(false); // reset timer for the next second
+            yieldCPUTime(); // let the GUI handle user actions
+            if (terminateExecution) { // user wants to cancel the analysis
+                break;
+            }
+        }
+#else
+        if (step % (long)((mcmc_steps + mcmc_burnin)/100) == 0) {
+            ReportWarning (_String ("GraphMCMC at step ") & step & " of " & (mcmc_steps+mcmc_burnin) & " with posterior " & current_score & " and graph:\n" & (_String *)current_graph.toStr() & " and order:\n" & (_String *)current_order.toStr() & "\n");
+        }
+#endif
+    }
+
+    // convert edge tallies to frequencies, and report best graph
+    for (long row = 0; row < num_nodes; row++) {
+        for (long offset=row*num_nodes, col = 0; col < num_nodes; col++) {
+            result->Store (offset+col, 1, (*result)(offset+col,1)/mcmc_samples);
+            result->Store (offset+col, 2, best_graph(row, col));
+        }
+    }
+
+
+    // set dag member to last visit graph
+    dag = (_Matrix &) current_graph;
+    best_node_order = current_order;
+
+    delete (proposed_graph);
+    delete (orderMx);
+    delete (proposed_order);
+
+    return (_Matrix *) (result->makeDynamic());
+}
+
+
+
+//___________________________________________________________________________________________
+//  DEPRECATED
+_Parameter  Bgm::TryEdge (long child, long parent, long operation, _Parameter old_score)
+{
+#ifdef _NEVER_DEFINED_
+    _Parameter  log_score,
+                last_state1 = dag (child, parent),
+                last_state2 = dag (parent, child);
+
+    /*
+    if (is_marginal)    // modification affects only child node, don't recalculate other scores
+        log_marginal = is_discrete(child,0) ? ComputeDiscreteScore (child) : ComputeContinuousScore (child);
+     */
+
+    switch (operation) {
+    case 0:
+        if (MarginalSum (FALSE, child) < max_parents && banned_edges(parent,child) == 0) {
+            dag.Store (parent, child, 1.);  // add an edge [parent] --> [child]
+            dag.Store (child, parent, 0.);
+        } else {
+            return old_score;
+        }
+        break;
+
+    case 1: // reverse an edge
+        if (MarginalSum (FALSE, parent) < max_parents && banned_edges(child,parent) == 0) {
+            dag.Store (child, parent, last_state2); // switch states
+            dag.Store (parent, child, last_state1);
+        } else {
+            return old_score;
+        }
+        break;
+
+    case 2: // delete an edge
+        dag.Store (child, parent, 0.);
+        dag.Store (parent, child, 0.);
+        break;
+
+    default:
+        return old_score;
+        break;
+    }
+
+    // PrintGraph(nil);
+
+    if (IsCyclic()) {   // new graph is cyclic, reject
+        dag.Store (child, parent, last_state1);
+        dag.Store (parent, child, last_state2);
+        return old_score;
+    }
+
+
+    /*
+    if (is_marginal)        // update one term only
+        log_score = old_score - log_marginal + (is_discrete(child,0) ? ComputeDiscreteScore (child) : ComputeContinuousScore (child));
+    else
+        log_score = Compute();
+     */
+
+
+    log_score = Compute();
+
+    if (log_score > old_score) {    // keep new graph
+        return log_score;
+    } else {
+        // restore previous settings
+        dag.Store (child, parent, last_state1);
+        dag.Store (parent, child, last_state2);
+    }
+
+    return old_score;
+#endif
+    return 0;
+}
+
+
+
+
+//___________________________________________________________________________________________
+//  Calculating equation (8) of Friedman and Koller (2003) requires the term:
+//      log ( Sum ( score(x_i, U | D) ) )
+//  where x_i are very small numbers stored as log(x_i)'s but taking the exponential of
+//  the log values can result in numerical underflow.
+
+_Parameter      Bgm::LogSumExpo (_GrowingVector * log_values)
+{
+    long        size            = log_values->GetUsed();
+    _Parameter  sum_exponents   = 0.;
+
+
+    // handle some trivial cases
+    if (size == 0) {
+        return 0.;    // log(exp(0)) = log(1) = 0
+    } else if (size == 1) {
+        return (*log_values)(0,0);    // log(exp(log(x)))
+    }
+
+
+    // find the largest (least negative) log-value
+    _Parameter      max_log  = (*log_values) (0, 0),
+                    this_log;
+
+    for (long val = 1; val < size; val++) {
+        this_log = (*log_values) (val, 0);
+
+        if (this_log > max_log) {
+            max_log = this_log;
+        }
+    }
+
+    // go back through log values and increment by max log value
+    //      This will cause some underflow for the smallest values, but we can
+    //  use this approximation to handle very large ranges of values.
+    //  NOTE: subtracting a negative value.
+    for (long val = 0; val < size; val++) {
+        sum_exponents += exp( (*log_values) (val, 0) - max_log );
+    }
+
+    return (log(sum_exponents) + max_log);
+}
+
+
+//___________________________________________________________________________________________
+//  Markov chain Monte Carlo for Bgm
+_PMathObj Bgm::CovarianceMatrix (_SimpleList * unused)
+{
+    //char  bug [255];
+
+
+    _Parameter      mcmc_steps,
+                    mcmc_burnin,
+                    mcmc_samples,
+                    mcmc_nchains,
+                    mcmc_temp;
+
+    _SimpleList *   node_order;
+
+    if (last_node_order.lLength == 0) {
+        node_order = new _SimpleList (num_nodes, 0, 1);     // populate with series (0, 1, ..., num_nodes)
+
+
+        node_order->Permute(1);     // initialize with randomized node ordering
+
+    } else {
+        node_order = new _SimpleList (last_node_order);
+    }
+
+
+
+    _Matrix *       mcmc_output;
+
+
+    // acquisition of HBL arguments with a few sanity checks
+    checkParameter (mcmcSteps, mcmc_steps, 0);
+    checkParameter (mcmcBurnin, mcmc_burnin, 0);
+    checkParameter (mcmcSamples, mcmc_samples, 0);
+    checkParameter (mcmcNumChains, mcmc_nchains, 1);
+    checkParameter (mcmcTemperature, mcmc_temp, 1);
+
+    if (mcmc_steps == 0) {
+        _String oops ("You asked HyPhy to run MCMC with zero steps in the chain! Did you forget to set Bgm_MCMC_STEPS?\n");
+        WarnError (oops);
+    }
+
+    if (mcmc_samples == 0) {
+        _String oops ("You're asking me to run MCMC without reporting any results.  Did you forget to set Bgm_MCMC_SAMPLES?\n");
+        WarnError (oops);
+    }
+
+
+
+    // allocate space for output
+    if (mcmc_nchains == 1) {
+        mcmc_output = RunColdChain (node_order, (long) mcmc_burnin, -1);    // negative argument indicates no sampling
+        delete (mcmc_output);       // discard burn-in
+
+        mcmc_output = RunColdChain (node_order, (long) mcmc_steps, (long int) (mcmc_steps / mcmc_samples) );
+    } else {    // run coupled MCMC
+        node_order->Permute(1);
+        // RunHotChain (node_order, (long)
+
+        /* STILL UNDER DEVELOPMENT! */
+    }
+
+    DeleteObject (node_order);
+
+    return mcmc_output;
+}
+
+
+
+//___________________________________________________________________________________________
+_Matrix *   Bgm::RunColdChain (_SimpleList * current_order, long nsteps, long sample_lag)
+{
+    /*  Execute Metropolis sampler using a swap of two nodes in an ordered sequence
+        as a proposal function.  The posterior probabilities of edges in the network are
+        stored as a member matrix [edge_posteriors].  Note that the total number of
+        possible orderings (i.e. permutations of a sequence of length N) is factorial(N),
+        and can possibly be computed exactly for N < 8.                                     */
+
+#ifdef DEBUG_RCC
+    char        buf [255];
+#endif
+
+    long        row,
+                first_node, second_node,
+                mcmc_samples = (long int) (nsteps / sample_lag);
+
+    _SimpleList proposed_order;
+
+    _Matrix *   mcmc_output     = new _Matrix (mcmc_samples > (num_nodes*num_nodes) ? mcmc_samples : (num_nodes*num_nodes), 4, false, true);
+    //  Contents:   (1) chain trace; (2) edge marginal posterior probabilities;
+    //              (3) best node ordering; (4) last node ordering (for restarting chains).
+
+    _List   *   clist           = new _List ();     // compute list
+
+
+    InitComputeLists (clist);       // storage for marginal node- and edge-scores
+
+
+
+    _Parameter  lk_ratio,
+                prob_current_order  = Compute (current_order, clist),
+                prob_proposed_order = 0.,
+                best_prob = prob_current_order;
+
+
+    /* SLKP 20070926
+        Add user feedback via the console window status bar
+    */
+    VerbosityLevel();
+    long howManyTimesUpdated = 0; // how many times has the line been updated; is the same as the # of seconds
+    TimerDifferenceFunction(false); // save initial timer; will only update every 1 second
+#ifdef __HEADLESS__
+    SetStatusLine (_HYBgm_STATUS_LINE_MCMC & (sample_lag < 0 ? _String(" burnin"):empty));
+#else
+#ifndef __UNIX__
+    SetStatusLine     (empty,_HYBgm_STATUS_LINE_MCMC & (sample_lag < 0 ? _String(" burnin"):empty),empty,0,HY_SL_TASK|HY_SL_PERCENT);
+#else
+    _String         * progressReportFile = NULL;
+    _Variable       * progressFile = CheckReceptacle (&optimizationStatusFile, empty, false);
+
+    if (progressFile->ObjectClass () == STRING) {
+        progressReportFile = ((_FString*)progressFile->Compute())->theString;
+    }
+    ConsoleBGMStatus (_HYBgm_STATUS_LINE_MCMC & (sample_lag < 0 ?  _String(" burnin"):empty), -1., progressReportFile);
+#endif
+#endif
+
+    /* SLKP */
+
+
+    best_node_order = (_SimpleList &) (*current_order);     // initialize class member variable
+
+#ifdef DEBUG_RCC
+    snprintf (buf, sizeof(buf), "Initial node order (log L = %f): ", prob_current_order);
+    BufferToConsole (buf);
+    for (long i = 0; i < num_nodes; i++) {
+        snprintf (buf, sizeof(buf), "%d ", best_node_order.lData[i]);
+        BufferToConsole (buf);
+    }
+    NLToConsole();
+#endif
+
+    for (long step = 0; step < nsteps; step++) {
+        // copy contents of current order to proposed ordering for permutation
+        proposed_order.Clear();
+        proposed_order.Duplicate (current_order);
+
+
+        // swap random nodes in ordered sequence
+        first_node  = genrand_int32() % num_nodes;
+        second_node = genrand_int32() % num_nodes;
+
+        while (first_node == second_node) { // keep sampling until pick different node
+            second_node = genrand_int32() % num_nodes;
+        }
+
+        proposed_order.Swap (first_node, second_node);
+
+
+        // calculate probability of proposed order --- edge posterior probs loaded into member variable
+        prob_proposed_order = Compute (&proposed_order, clist);
+
+#ifdef DEBUG_RCC
+        snprintf (buf, sizeof(buf), "Proposed node order (log L = %f): ", prob_proposed_order);
+        BufferToConsole (buf);
+        for (long i = 0; i < num_nodes; i++) {
+            snprintf (buf, sizeof(buf), "%d ", proposed_order.lData[i]);
+            BufferToConsole (buf);
+        }
+        NLToConsole();
+#endif
+
+
+        lk_ratio    = exp(prob_proposed_order - prob_current_order);
+
+        if (lk_ratio > 1. || genrand_real2() < lk_ratio) {  // then set current to proposed order
+            (*current_order).Clear();
+            (*current_order) << proposed_order;
+            prob_current_order = prob_proposed_order;
+
+#ifdef DEBUG_RCC
+            snprintf (buf, sizeof(buf), "Accept\n");
+            BufferToConsole (buf);
+#endif
+
+            if (prob_proposed_order > best_prob) {
+                best_prob = prob_proposed_order;        // update best node ordering
+                best_node_order = proposed_order;
+            }
+        }
+
+
+        if (sample_lag >= 0) {
+            // write Markov chain state to output matrix
+
+            if (step % sample_lag == 0 && step > 0) {   // AFYP 2011/3/2 added this second conditional because the zero-th step was getting recorded
+                _GrowingVector *    gv;
+                _Parameter          denom;
+
+                row = (long int) (step / sample_lag) - 1;   // AFYP 2011/3/2 need to shift over other info to maintain 0-index
+
+                // report log likelhood
+                mcmc_output->Store (row, 0, prob_current_order);
+
+
+#ifdef _DEBUG_RCC
+                snprintf (buf, sizeof(buf), "Contents of clist:\n");
+                BufferToConsole (buf);
+
+                for (long i = 0; i < num_nodes; i++) {
+                    for (long j = 0; j < num_nodes; j++) {
+                        gv = (_GrowingVector *) clist->lData[i * num_nodes + j];
+
+                        snprintf (buf, sizeof(buf), "i=%d, j=%d, n=%d: ", i, j, gv->GetUsed());
+                        BufferToConsole (buf);
+
+                        for (long k = 0; k < gv->GetUsed(); k++) {
+                            snprintf (buf, sizeof(buf), "%f ", (*gv)(k,0));
+                            BufferToConsole (buf);
+                        }
+
+                        NLToConsole ();
+                    }
+                }
+#endif
+
+
+
+                // compute marginal edge posteriors
+                for (long child = 0; child < num_nodes; child++) {
+                    gv      = (_GrowingVector *) clist->lData[child * num_nodes + child];
+                    denom   = (*gv)(0, 0);  // first entry holds node marginal post pr
+
+
+                    for (long edge, parent = 0; parent < num_nodes; parent++) {
+                        if (parent == child) {
+                            continue;
+                        }
+
+                        edge    = child * num_nodes + parent;
+                        gv      = (_GrowingVector *) clist->lData[edge];
+
+
+                        if (gv->GetUsed() > 0) {
+#ifdef DEBUG_RCC
+                            snprintf (buf, sizeof(buf), "edge %d: pp = %f, gv = ", edge, (*mcmc_output)(edge, 1));
+                            BufferToConsole (buf);
+
+                            for (long i = 0; i < gv->GetUsed(); i++) {
+                                snprintf (buf, sizeof(buf), "%f ", (*gv) (i,0));
+                                BufferToConsole (buf);
+                            }
+
+                            snprintf (buf, sizeof(buf), "sum to %f", LogSumExpo (gv));
+                            BufferToConsole (buf);
+#endif
+
+                            mcmc_output->Store (edge, 1, (*mcmc_output)(edge, 1) + exp (LogSumExpo(gv) - denom));
+
+#ifdef DEBUG_RCC
+                            snprintf (buf, sizeof(buf), "= %f\n", (*mcmc_output)(edge, 1));
+                            BufferToConsole (buf);
+#endif
+                        }
+
+
+                    }
+                }
+            }
+        }
+
+
+        /*SLKP 20070926; include progress report updates */
+        if (TimerDifferenceFunction(true)>1.0) { // time to update
+            howManyTimesUpdated ++;
+            _String statusLine = _HYBgm_STATUS_LINE_MCMC & (sample_lag < 0 ? _String(" burnin"):empty) & " " & (step+1) & "/" & nsteps
+                                 & " steps (" & (1.0+step)/howManyTimesUpdated & "/second)";
+#if  defined __HEADLESS__
+            SetStatusLine (statusLine);
+#else
+#if !defined __UNIX__ || defined __HYPHYQT__ || defined __HYPHY_GTK__
+            SetStatusLine     (empty,statusLine,empty,100*step/(nsteps),HY_SL_TASK|HY_SL_PERCENT);
+            yieldCPUTime(); // let the GUI handle user actions
+            if (terminateExecution) { // user wants to cancel the analysis
+                break;
+            }
+#endif
+#if defined __UNIX__ && ! defined __HEADLESS__ && !defined __HYPHYQT__ && !defined __HYPHY_GTK__
+            ConsoleBGMStatus (statusLine, 100.*step/(nsteps), progressReportFile);
+#endif
+#endif
+
+            TimerDifferenceFunction(false); // reset timer for the next second
+        }
+        /* SLKP */
+
+    }
+    // end loop over steps
+
+
+    if (sample_lag >= 0) {
+        // convert sums of edge posterior probs. in container to means
+        for (long edge = 0; edge < num_nodes * num_nodes; edge++) {
+            mcmc_output->Store (edge, 1, (*mcmc_output)(edge,1) / mcmc_samples);
+        }
+    }
+
+
+    // export node ordering info
+    for (long node = 0; node < num_nodes; node++) {
+        mcmc_output->Store (node, 2, (_Parameter) (best_node_order.lData[node]));
+        mcmc_output->Store (node, 3, (_Parameter) (current_order->lData[node]));
+    }
+
+    last_node_order = (_SimpleList &) (*current_order);
+
+
+
+    // release cached scores (assuming that this is the last analysis to be done!)
+    DumpComputeLists (clist);
+
+    /*SLKP 20070926; include progress report updates */
+#if !defined __UNIX__ || defined __HEADLESS__ || defined __HYPHYQT__ || defined __HYPHY_GTK__
+    SetStatusLine     (_HYBgm_STATUS_LINE_MCMC_DONE & (sample_lag < 0 ? _String(" burnin"):empty));
+#endif
+#if defined __UNIX__ && ! defined __HEADLESS__ && !defined __HYPHYQT__ && !defined __HYPHY_GTK__
+    ConsoleBGMStatus (_HYBgm_STATUS_LINE_MCMC_DONE & (sample_lag < 0 ? _String(" burnin"):empty), -1.0, progressReportFile);
+#endif
+    /* SLKP */
+
+    return mcmc_output;
+}
+
+
+
+//___________________________________________________________________________________________
+#ifdef __NEVER_DEFINED__
+void    Bgm::RunHotChain (_SimpleList * current_order, long nsteps, long sample_lag, _Parameter temper)
+{
+    /*  Execute Metropolis sampler using a swap of two nodes in an ordered sequence
+     as a proposal function.  The posterior probabilities of edges in the network are
+     stored as a member matrix [edge_posteriors].  Note that the total number of
+     possible orderings (i.e. permutations of a sequence of length N) is factorial(N),
+     and can possibly be computed exactly for N < 8.                                        */
+
+    _List   *   clist;
+
+    _Parameter  prob_current_order = Compute (current_order, clist),
+                prob_proposed_order = 0.;
+
+    static long step_counter = 0;
+
+    long        sample_interval = (long int) ((nsteps - mcmc_burnin) / mcmc_samples);
+
+    _SimpleList proposed_order;
+
+    bool        accept_step = FALSE;
+
+    /* SLKP 20070926
+     Add user feedback via the console window status bar
+     */
+#if !defined __UNIX__ || defined __HEADLESS__
+    long howManyTimesUpdated = 0; // how many times has the line been updated; is the same as the # of seconds
+    TimerDifferenceFunction(false); // save initial timer; will only update every 1 second
+    SetStatusLine     (empty,_HYBgm_STATUS_LINE_MCMC,empty,0,HY_SL_TASK|HY_SL_PERCENT);
+#endif
+    /* SLKP */
+
+
+    for (long step = 0; step < mcmc_steps; step++) {
+        // copy contents of current order to proposed ordering for permutation
+        proposed_order.Clear();
+        proposed_order.Duplicate (current_order);
+
+
+        // swap random nodes in ordered sequence
+        long    first_node  = genrand_int32 () % proposed_order.lLength,
+                second_node = genrand_int32 () % proposed_order.lLength;
+
+        while (first_node == second_node) { // keep sampling until pick different node
+            second_node = genrand_int32 () % proposed_order.lLength;
+        }
+
+        proposed_order.Swap(first_node, second_node);
+
+
+        // calculate probability of proposed order --- edge posterior probs loaded into member variable
+        prob_proposed_order = Compute (&proposed_order, FALSE);
+
+
+        _Parameter  lk_ratio    = exp(prob_proposed_order - prob_current_order);
+
+        accept_step = FALSE;
+
+        if (lk_ratio > 1.)  {
+            accept_step = TRUE;    // accept greater likelihood
+        } else if (genrand_real2() < lk_ratio) {
+            accept_step = TRUE;
+        }
+
+
+        if (accept_step) {  // then set current to proposed order
+            (*current_order).Clear();
+            (*current_order) << proposed_order;
+            prob_current_order = prob_proposed_order;
+        }
+
+        // write Markov chain state to output matrix
+        if (step % sample_interval == 0 && step >= mcmc_burnin) {
+            long    row = (long int) ((step-mcmc_burnin) / sample_interval);
+
+            mcmc_chain->Store (row, 0, prob_current_order);
+
+            for (long edge = 0; edge < num_nodes*num_nodes; edge++) {
+                long    child   = edge % num_nodes,
+                        parent    = edge / num_nodes;
+
+                mcmc_chain->Store (edge, 1, (*mcmc_chain)(edge, 1) + edge_posteriors(child, parent));
+            }
+        }
+
+        /*SLKP 20070926; include progress report updates */
+#if !defined __UNIX__ || defined __HEADLESS__
+        if (TimerDifferenceFunction(true)>1.0) { // time to update
+            howManyTimesUpdated ++;
+            _String statusLine = _HYBgm_STATUS_LINE_MCMC & " " & (step+1) & "/" & mcmc_steps
+                                 & " steps (" & (1.0+step)/howManyTimesUpdated & "/second)";
+            SetStatusLine     (empty,statusLine,empty,100*step/(mcmc_steps),HY_SL_TASK|HY_SL_PERCENT);
+            TimerDifferenceFunction(false); // reset timer for the next second
+            yieldCPUTime(); // let the GUI handle user actions
+            if (terminateExecution) { // user wants to cancel the analysis
+                break;
+            }
+        }
+#endif
+        /* SLKP */
+    }
+    // end loop over steps
+
+
+    for (long edge = 0; edge < num_nodes * num_nodes; edge++) {
+        // convert sums of edge posterior probs. in container to means
+        mcmc_chain->Store (edge, 1, (*mcmc_chain)(edge,1) / mcmc_samples);
+    }
+
+
+    // release cached scores (assuming that this is the last analysis to be done!)
+    DumpComputeLists ();
+
+    /*SLKP 20070926; include progress report updates */
+#if !defined __UNIX__ || defined __HEADLESS__
+    SetStatusLine     (_HYBgm_STATUS_LINE_MCMC_DONE);
+#endif
+    /* SLKP */
+
+}
+
+#endif
+
+
+
+//___________________________________________________________________________________________
+#ifdef __AFYP_DEVELOPMENT2__
+void        Bgm::CacheNetworkParameters (void)
+{
+    _SimpleList     multipliers,    // for indexing parent combinations (j)
+                    parents;
+
+    long            num_parent_combos,
+                    r_i;
+
+    _Matrix         n_ijk,
+                    theta_ijk;
+
+    network_parameters.Clear();     // reset cache
+
+
+    for (long i = 0; i < num_nodes; i++) {
+        // reset variables to defaults
+        multipliers.Clear();
+        multipliers << 1;
+
+        n_ijk.Clear();
+        theta_ijk.Clear();
+
+        num_parent_combos   = 1;
+        r_i                 = num_levels.lData[i];
+
+
+        // assemble parents based on current graph
+        for (long par = 0; par < num_nodes; par++) {
+            if (dag(par, i) == 1 && is_discrete.lData[par]) {
+                parents << par; // list of parents will be in ascending numerical order
+                num_parent_combos *= num_levels.lData[par];
+                multipliers << num_parent_combos;
+            }
+        }
+
+
+        // re-allocate space in matrix
+        CreateMatrix (&n_ijk, num_parent_combos, r_i+1, false, true, false);
+        CreateMatrix (&theta_ijk, num_parent_combos, r_i, false, true, false);
+
+
+        // tally observations
+        for (long obs = 0; obs < obsData->GetHDim(); obs++) {
+            long    index           = 0,
+                    child_state     = (*obsData)(obs, i);
+
+            // is there a faster algorithm for this? - afyp
+            for (long par = 0; par < parents.lLength; par++) {
+                long    this_parent         = parents.lData[par],
+                        this_parent_state = (*obsData)(obs, this_parent);
+
+                index += this_parent_state * multipliers.lData[par];
+            }
+
+            n_ijk.Store ((long) index, child_state, n_ijk(index, child_state) + 1);
+            n_ijk.Store ((long) index, r_i, n_ijk(index, r_i) + 1); // store n_ij sum in last entry
+        }
+
+
+        // compute expected network conditional probabilities (Cooper and Herskovits 1992 eq.16)
+        for (long j = 0; j < num_parent_combos; j++) {
+            _Parameter  denom = n_ijk(j,r_i+1) + r_i;
+
+            for (long k = 0; k < r_i; k++) {
+                theta_ijk.Store (j, k, (n_ijk(j,k)+1.) / denom);
+            }
+        }
+
+
+        // append parameters to member list
+        network_parameters && (&theta_ijk);
+    }
+}
+#endif
+
+
+//___________________________________________________________________________________________
+#ifdef __AFYP_DEVELOPMENT2__
+_Matrix *   Bgm::SimulateDiscreteCases (long ncases)
+{
+    /*  Identify nodes without parents in given graph.
+        Draw random state assignments based on learned parameters (orphan score).
+        Use graph matrix transpose to index child nodes.
+        Visit children and randomly assign states dependent on parent assignment.
+        Rinse and repeat.
+    */
+    CacheNetworkParameters();
+
+    _Matrix     gad     = dag.Transpose();
+    _Matrix *   cases   = new _Matrix (num_nodes, ncases, false, true);
+
+    // proceed using postorder traversal (check for parents before resolving node)
+
+}
+#endif
+
+
+
+//___________________________________________________________________________________________
+#ifdef __AFYP_DEVELOPMENT2__
+void        Bgm::PostOrderInstantiate (long node_id, _SimpleList & results)
+{
+    _SimpleList     parents;
+
+    // assign parents first
+    for (long par = 0; par < num_nodes; par++) {
+        if (par != node_id && dag (par, node_id) == 1) {
+            PostOrderInstantiate (par, results);
+            parents << par;
+        }
+    }
+
+    // assign random state given parents
+    for (long pindex = 0; pindex < parents.lLength; pindex++) {
+        long    par = parents.lData[pindex];
+
+    }
+}
+
+
+long        Bgm::PredictNode (long node_id, _Matrix * assignments)
+{
+
+}
+#endif
+
+
+//___________________________________________________________________________________________
+#if defined __HYPHYMPI__
+void    Bgm::SerializeBgm (_String & rec)
+{
+    char        buf [255];
+    _String *   bgmName = (_String *) bgmNamesList (bgmList._SimpleList::Find((long)this));
+    _String     dataStr,
+                dataName ("bgmData"),
+                banStr,
+                banName ("ban_matrix");
+
+    _Parameter  mcem_max_steps, mcem_burnin, mcem_sample_size;
+
+    checkParameter (mcemMaxSteps, mcem_max_steps, 10000);
+    checkParameter (mcemBurnin, mcem_burnin, 1000);
+    checkParameter (mcemSampleSize, mcem_sample_size, 100);
+
+    rec << "PRINT_DIGITS=-1;\n";
+    rec << "USE_MPI_CACHING=1;\n";
+
+    // write utility functions
+    rec << "function make_dnode (id,n,maxp)\n";
+    rec << "{\ndnode={};\n";
+    rec << "dnode[\"NodeID\"]=id;\n";
+    rec << "dnode[\"PriorSize\"]=n;\n";
+    rec << "dnode[\"MaxParents\"]=maxp;\n";
+    rec << "return dnode;\n}\n";
+
+    rec << "function make_cnode (id,n,maxp,mean,prec)\n";
+    rec << "{\ncnode={};\n";
+    rec << "cnode[\"NodeID\"]=id;\n";
+    rec << "cnode[\"PriorSize\"]=n;\n";
+    rec << "cnode[\"MaxParents\"]=maxp;\n";
+    rec << "cnode[\"PriorMean\"]=mean;\n";
+    rec << "cnode[\"PriorVar\"]=prec;\n";
+    rec << "return cnode;\n}\n";
+
+
+    // prepare assortative lists
+    rec << "dnodes={};\ncnodes={};\n";
+
+    for (long node_id = 0; node_id < num_nodes; node_id++) {
+        if (is_discrete.lData[node_id]) {
+            rec << "dnodes[Abs(dnodes)]=make_dnode(";
+            snprintf (buf, sizeof(buf), "%ld,%ld,%ld", node_id, (long)prior_sample_size(node_id,0), (long)max_parents.lData[node_id]);
+            rec << buf;
+            rec << ");\n";
+        } else {
+            rec << "cnodes[Abs(cnodes)]=make_cnode(";
+            snprintf (buf, sizeof(buf), "%ld,%ld,%ld,%f,%f", node_id, (long)prior_sample_size(node_id,0), (long)max_parents.lData[node_id],
+                     prior_mean(node_id,0), prior_precision(node_id,0));
+            rec << buf;
+            rec << ");\n";
+        }
+    }
+
+    // write BGM constructor
+    rec << "BGM ";
+    rec << bgmName;
+    rec << "=(dnodes,cnodes);\n";
+
+    // missing data imputation settings
+    snprintf (buf, sizeof(buf), "BGM_MCEM_MAXSTEPS = %d;\n", (long)mcem_max_steps);
+    rec << buf;
+    snprintf (buf, sizeof(buf), "BGM_MCEM_BURNIN = %d;\n", (long)mcem_burnin);
+    rec << buf;
+    snprintf (buf, sizeof(buf), "BGM_MCEM_SAMPLES = %d;\n", (long)mcem_sample_size);
+    rec << buf;
+
+    // ban matrix command has to come BEFORE setting data matrix (which calls CacheNodeScores)
+    rec << "ban_matrix=";
+    rec << (_String *)banned_edges.toStr();
+    rec << ";\n";
+    rec << "SetParameter(";
+    rec << bgmName;
+    rec << ",BGM_BAN_MATRIX,ban_matrix);\n";
+
+    // serialize data matrix and assign to BGM
+    rec << "bgmData=";
+    rec << (_String *)obsData->toStr();
+    rec << ";\n";
+    rec << "SetParameter(";
+    rec << bgmName;
+    rec << ",BGM_DATA_MATRIX,bgmData);\n";
+
+}
+#endif
+
+//___________________________________________________________________________________________
+//___________________________________________________________________________________________
+//___________________________________________________________________________________________
+//___________________________________________________________________________________________
+//___________________________________________________________________________________________
+
+
+#endif
diff --git a/src/new/bgm2.cpp b/src/new/bgm2.cpp
new file mode 100644
index 0000000..67cf048
--- /dev/null
+++ b/src/new/bgm2.cpp
@@ -0,0 +1,1845 @@
+/*
+ *  bgm2.cpp
+ *  HyPhyXCode
+ *
+ *  Created by Art Poon on 7/7/08.
+ *  Copyright 2008 __MyCompanyName__. All rights reserved.
+ *
+ */
+
+#if not defined __AFYP_REWRITE_BGM__
+
+#include "bgm.h"
+
+
+
+// this old method is WAY too slow, constantly allocating and freeing _Constant objects
+
+/*
+inline _Parameter Bgm::LnGamma(_Constant * calculator, _Parameter x)
+{
+    // wrapper function for _Constant member function
+    calculator->SetValue (x);
+    calculator = (_Constant *) calculator->LnGamma();
+    _Parameter rv = calculator->Value();
+    DeleteObject(calculator);
+    return rv;
+}
+*/
+
+//___________________________________________________________________________________________
+
+/* maxParentString ("Bgm_MAXIMUM_PARENTS"), */
+extern _String      mcemMaxSteps,   // modify string constant name to avoid conflicts with bgm.cpp
+       mcemBurnin,
+       mcemSampleSize;
+
+_String     _HYBgm_NThreads ("BGM_NTHREADS");
+
+
+#ifdef __MP__
+#include <pthread.h>
+
+struct  ThreadCacheTask {
+    Bgm     * b;
+
+    long    startNode,
+            nextNode,   // one past the last node
+            numNodes;
+
+    _List   *       nodeScores;
+
+    _SimpleList     maxParents,     // pass member variables to global scope
+                    isDiscrete;
+};
+
+pthread_t *         BgmThreads  = nil;
+ThreadCacheTask *   BgmTasks    = nil;
+void *              CacheNodeScoreThread (void *);
+#endif
+
+
+//___________________________________________________________________________________________
+void    Bgm::ImportNodeScores (_Matrix * import_scores)
+{
+    /* UNDER DEVELOPMENT!!! */
+}
+
+
+
+//___________________________________________________________________________________________
+//  This doesn't work yet -- afyp :-/
+_Matrix *   Bgm::ExportNodeScores (void)
+{
+    // determine the required number of rows
+    long        nrows = 0;
+
+    for (long child = 0; child < num_nodes; child++) {
+        long    maxp = max_parents.lData[child];
+        nrows++;
+        if (maxp > 0) {
+            nrows += num_nodes - 1;
+            if (maxp > 1) {
+                _List   * childs_list   = (_List *) node_scores.lData[child];
+                for (long np = 2; np < maxp; np++) {
+                    _NTupleStorage  * nts   = (_NTupleStorage *) childs_list->lData[np];
+                    nrows += nts->GetSize();
+                }
+            }
+        }
+    }
+
+
+    _Matrix *   export_mx = new _Matrix (nrows, 4, false, true);        // child ID, #parents, parent combo #, score
+
+
+    for (long index = 0, child = 0; child < num_nodes; child++) {
+        _List   * childs_list   = (_List *) node_scores.lData[child];
+
+        for (long np = 0; np < max_parents.lData[child]; np++) {
+            if (np == 0) {
+                _Constant   *   orphan_score = (_Constant *) childs_list->lData[0];
+
+                export_mx->Store (index, 0, child);
+                export_mx->Store (index, 1, np);
+                export_mx->Store (index, 2, 0);
+                export_mx->Store (index, 3, orphan_score->Value());
+
+                index++;
+            } else if (np == 1) {
+                _Matrix *   single_parent_scores = (_Matrix *) childs_list->lData[1];
+
+                for (long parent = 0; parent < num_nodes; parent++) {
+                    if (parent == child) {
+                        continue;
+                    }
+                    export_mx->Store (index, 0, child);
+                    export_mx->Store (index, 1, np);
+                    export_mx->Store (index, 2, parent);
+                    export_mx->Store (index, 3, (*single_parent_scores) (parent, 0));
+                    index++;
+                }
+            } else {
+                _NTupleStorage *    family_scores = (_NTupleStorage *) childs_list->lData[np];
+
+                for (long family = 0; family < family_scores->GetSize(); family++) {
+                    export_mx->Store (index, 0, child);
+                    export_mx->Store (index, 1, np);
+                    export_mx->Store (index, 2, family);    // direct index
+                    export_mx->Store (index, 3, family_scores->DirectIndex(family));
+                    index++;
+                }
+            }
+        }
+    }
+
+
+    return (_Matrix *)(export_mx->makeDynamic());
+}
+
+
+
+//___________________________________________________________________________________________
+//  THIS DOES NOT WORK YET --- need to provide global scope for member variable node_scores,
+//  through accessor function maybe?
+#ifdef __NOT_DEFINED_MP__
+void * CacheNodeScoreThread (void * arg)
+{
+    ThreadCacheTask *   theTask = (ThreadCacheTask *) arg;
+
+    long                num_nodes   = theTask->numNodes;
+    _SimpleList         is_discrete = theTask->isDiscrete;
+
+    for (long node_id = theTask->startNode; node_id < theTask->nextNode; node_id++) {
+        long        maxp        = theTask->maxParents.lData[node_id];
+        _List   *   this_list   = (_List *) (theTask->nodeScores)->lData[node_id];
+
+
+        this_list->Clear();
+
+        /*
+         for (long par = 0; par < num_nodes; par++) // reset local graph at this node
+         {
+         dag.Store (par, node_id, 0);
+         }
+         */
+
+        // handle case of no parents
+        _SimpleList parents;
+        _Parameter  score = is_discrete.lData[node_id] ? theTask->b->ComputeDiscreteScore (node_id, parents) : theTask->b->ComputeContinuousScore (node_id);
+        _Constant   orphan_score (score);
+
+        (*this_list) && (&orphan_score);        // _List Append() specific to objects in BaseObj hierarchy
+
+
+        char buf [256];
+        snprintf (buf, sizeof(buf), "orphan score = %f\n", score);
+        BufferToConsole (buf);
+
+
+        // handle case of one parent
+        if (maxp > 0) {
+            _Matrix     single_parent_scores (num_nodes, 1, false, true);
+
+            for (long par = 0; par < num_nodes; par++) {
+                if (par == node_id) {   // unused
+                    continue;
+                }
+
+                //dag.Store (par, node_id, 1);
+                parents << par;
+                single_parent_scores.Store (par, 0, is_discrete.lData[node_id] ? theTask->b->ComputeDiscreteScore (node_id, parents) :
+                                            theTask->b->ComputeContinuousScore (node_id));
+                parents.Clear();
+                //dag.Store (par, node_id, 0);  // reset
+            }
+            (*this_list) && (&single_parent_scores);
+        }
+
+
+        // handle cases of more than one parent using (n,k)-tuple indexing
+        if (maxp > 1) {
+            _SimpleList     all_but_one (num_nodes-1, 0, 1),    // 0, 1, 2, ... , n-1
+                            aux_list,
+                            nk_tuple;
+
+            for (long np = 2; np <= maxp; np++) {
+                _NTupleStorage  family_scores (num_nodes-1, np);
+
+                if (all_but_one.NChooseKInit (aux_list, nk_tuple, np, false)) {
+                    bool    remaining;
+                    long    res;
+
+                    do {
+                        remaining = all_but_one.NChooseK (aux_list, nk_tuple);
+
+
+                        for (long par_idx = 0; par_idx < np; par_idx++) {
+                            long par = nk_tuple.lData[par_idx];
+
+                            if (par >= node_id) {
+                                par++;    // map from (n-1) parent space to nodespace
+                            }
+                            parents << par;
+                            //  dag.Store (par, node_id, 1);
+                        }
+
+
+                        score = is_discrete.lData[node_id] ? theTask->b->ComputeDiscreteScore (node_id, parents) :
+                                theTask->b->ComputeContinuousScore (node_id);
+
+                        res = family_scores.Store (score, nk_tuple);
+
+                        parents.Clear();
+                        /*
+                         for (long par = 0; par < num_nodes; par++)
+                         {
+                         dag.Store (par, node_id, 0);   // reset graph
+                         }
+                         */
+
+                    } while (remaining);
+
+                } else {
+                    _String oops ("Failed to initialize _NTupleStorage object in Bgm::CacheNodeScores().\n");
+                    WarnError(oops);
+                }
+
+                (*this_list) && (&family_scores);   // append duplicate to storage
+            }
+        }
+    }
+    pthread_exit (NULL);
+}
+#endif
+
+
+
+//___________________________________________________________________________________________
+_Parameter  Bgm::ImputeDiscreteScore (long node_id, _SimpleList & parents)
+{
+    char            buf [256];
+
+    //  Use Monte Carlo over assignments to m_ijk to calculate expectation, which can be used for EM (MCEM)
+    //      but m_ijk are constrained by partial observations, a hassle for bookkeeping  :-/
+    //      Alternatively, we can perform MCMC over imputations of missing values; which is faster?
+
+    _SimpleList     multipliers ((long)1);
+
+    _Matrix     n_ijk, n_ij;
+
+    long        num_parent_combos   = 1,
+                r_i                   = num_levels.lData[node_id],
+                mcem_interval;
+
+    _Parameter  log_score   = 0,
+                mcem_max_steps,
+                mcem_burnin,
+                mcem_sample_size;
+
+
+    // set MCMC parameters from batch language definitions
+    checkParameter (mcemMaxSteps, mcem_max_steps, 0);
+    checkParameter (mcemBurnin, mcem_burnin, 0);
+    checkParameter (mcemSampleSize, mcem_sample_size, 0);
+
+    if (mcem_max_steps == 0 || mcem_sample_size == 0) {
+        _String oops ("Did you forget to specify a value for BGM_MCEM_MAXSTEPS or BGM_MCEM_SAMPLES?\n");
+        WarnError (oops);
+    }
+
+    mcem_interval = (long) (mcem_max_steps / mcem_sample_size);
+
+
+    // count number of parent state combinations
+    for (long par = 0; par < parents.lLength; par++) {
+        num_parent_combos *= num_levels.lData[parents.lData[par]];
+        multipliers << num_parent_combos;
+    }
+
+    CreateMatrix (&n_ijk, num_parent_combos, r_i, false, true, false);
+    CreateMatrix (&n_ij, num_parent_combos, 1, false, true, false);
+
+
+
+    _GrowingVector      impute,     // to store a copy of incomplete cases
+                        is_missing; // boolean values mapping to missing values in [impute]
+
+    _GrowingVector  *   post_chain = new _GrowingVector(),
+    *   prior_denom = new _GrowingVector();
+
+
+    // prepare containers for keeping track of state-frequencies per node
+    // for later use in imputation
+
+    long                max_num_levels  = num_levels.lData [node_id],
+                        family_size        = parents.lLength + 1;
+
+    _SimpleList         family_nlevels (max_num_levels);
+
+    _Matrix             m_ijk,      // let m_ijk denote missing values such that n_ijk + m_ijk sums to N_i for all j, k.
+                        m_ij,
+                        observed_freqs;
+
+
+    CreateMatrix (&m_ijk, num_parent_combos, r_i, false, true, false);  // note these are populated with 0.0's
+    CreateMatrix (&m_ij, num_parent_combos, 1, false, true, false);
+
+
+    // evaluate the number of levels for each node in family
+    for (long par = 0; par < parents.lLength; par++) {
+        long    par_nlevels = num_levels.lData [ parents.lData[par] ];
+
+        family_nlevels << par_nlevels;
+        if (par_nlevels > max_num_levels) {
+            max_num_levels = par_nlevels;
+        }
+    }
+
+    CreateMatrix (&observed_freqs, family_size, max_num_levels, false, true, false);
+
+
+
+#ifdef __DEBUG_IDS__
+    snprintf (buf, sizeof(buf), "family_nlevels: ");
+    BufferToConsole (buf);
+    for (long bug = 0; bug < family_nlevels.lLength; bug++) {
+        snprintf (buf, sizeof(buf), "%d ", family_nlevels.lData[bug]);
+        BufferToConsole (buf);
+    }
+    NLToConsole ();
+#endif
+
+
+
+    // tally complete cases
+    for (long index, obs = 0; obs < obsData->GetHDim(); obs++) {
+        long    child_state = (*obsData) (obs, node_id);
+
+        index = 0;
+
+        if (child_state > -1) {
+            observed_freqs.Store (0, (long)child_state, observed_freqs (0, (long)child_state) + 1);
+
+            for (long par = 0; par < parents.lLength; par++) {
+                long    this_parent         = parents.lData[par],
+                        this_parent_state = (long) ((*obsData) (obs, this_parent));
+
+                if (this_parent_state < 0) {
+                    index = -1; // flag observation to skip
+                    break;
+                } else {
+                    index += this_parent_state * multipliers.lData[par];
+                    observed_freqs.Store (par+1, this_parent_state, observed_freqs (par+1, this_parent_state) + 1);
+                }
+            }
+        } else {
+            index = -1;
+        }
+
+        if (index > -1) {   // update n_ijk's with complete case
+            n_ijk.Store ((long) index, (long)child_state, n_ijk(index, (long)child_state) + 1);
+            n_ij.Store ((long) index, 0, n_ij(index, 0) + 1);
+        } else {
+            // store family in impute, always in the order (child, parent0, parent1, ...)
+            impute.Store ( (_Parameter) child_state);
+            is_missing.Store ( (_Parameter) ((child_state < 0) ? 1 : 0) );
+
+            for (long par = 0; par < parents.lLength; par++) {
+                long    parent_state    = (long) ((*obsData) (obs, parents.lData[par]));
+
+                impute.Store ( (_Parameter) parent_state);
+                is_missing.Store ( (_Parameter) ((parent_state < 0) ? 1 : 0) );
+            }
+        }
+    }
+
+
+#ifdef __DEBUG_IDS__
+    snprintf (buf, sizeof(buf), "complete cases N_ijk: \n");
+    BufferToConsole (buf);
+    for (long j = 0; j < num_parent_combos; j++) {
+        for (long k = 0; k < family_nlevels.lData[0]; k++) {
+            snprintf (buf, sizeof(buf), "%d ", (long) n_ijk (j,k));
+            BufferToConsole (buf);
+        }
+        NLToConsole ();
+    }
+    NLToConsole ();
+
+    snprintf (buf, sizeof(buf), "impute: \n");
+    BufferToConsole (buf);
+    for (long bug = 0; bug < impute.GetUsed(); bug++) {
+        snprintf (buf, sizeof(buf), "%d ", (long) impute (0, bug));
+        BufferToConsole (buf);
+
+        if (bug % family_size == family_size - 1) {
+            NLToConsole ();
+        }
+    }
+    NLToConsole ();
+#endif
+
+
+
+    // convert observed states into frequencies
+    for (long obs_total, i = 0; i < family_size; i++) {
+        obs_total = 0;
+        for (long obs_state = 0; obs_state < family_nlevels.lData[i]; obs_state++) {
+            obs_total += observed_freqs (i, obs_state);
+        }
+
+        for (long obs_state = 0; obs_state < family_nlevels.lData[i]; obs_state++) {
+            observed_freqs.Store (i, obs_state, (_Parameter) (observed_freqs (i, obs_state) / obs_total));
+        }
+    }
+
+
+#ifdef __DEBUG_IDS__
+    snprintf (buf, sizeof(buf), "observed_freqs: \n");
+    BufferToConsole (buf);
+
+    for (long fam = 0; fam < family_size; fam++) {
+        for (long lev = 0; lev < family_nlevels.lData[fam]; lev++) {
+            snprintf (buf, sizeof(buf), "%f ", observed_freqs (fam, lev));
+            BufferToConsole (buf);
+        }
+        NLToConsole ();
+    }
+    NLToConsole ();
+#endif
+
+
+
+    // Initial imputation with random assignments to missing values, based on observed frequencies
+    //  We can always burn-in the chain to converge to more realistic assignments
+    //  before taking expectation.
+    //  Also use this loop to calculate m_ijk's, i.e. cell counts for cases with missing values
+    for (long i = 0; i < impute.GetUsed(); i++) {
+        if (is_missing(0,i)) {
+            double  urn         = genrand_real2();
+            long    member      = i % family_size;
+
+            for (long lev = 0; lev < family_nlevels.lData[member]; lev++) {
+                if (urn < observed_freqs (member, lev)) {
+                    impute._Matrix::Store (0, i, (_Parameter)lev);
+                    break;
+                } else {
+                    urn -= observed_freqs (member, lev);    // rescale random float
+                }
+            }
+        }
+    }
+
+
+
+    // compute m_ijk's and m_ij's
+    long        num_incomplete_cases    = impute.GetUsed() / family_size;
+
+    for (long ic = 0; ic < num_incomplete_cases; ic++) {
+        long    index           = 0,
+                child_state     = impute (0, ic * family_size);
+
+        for (long par = 0; par < parents.lLength; par++) {
+            long    parent_state    = impute (0, ic*family_size + par+1);
+            index += parent_state * multipliers.lData[par];
+        }
+
+        m_ijk.Store ((long) index, child_state, m_ijk(index, child_state) + 1);
+        m_ij.Store ((long) index, 0, m_ij(index, 0) + 1);
+    }
+
+
+
+#ifdef __DEBUG_IDS__
+    snprintf (buf, sizeof(buf), "impute: \n");
+    BufferToConsole (buf);
+    for (long bug = 0; bug < impute.GetUsed(); bug++) {
+        snprintf (buf, sizeof(buf), "%d ", (long) impute (0, bug));
+        BufferToConsole (buf);
+
+        if (bug % family_size == family_size - 1) {
+            NLToConsole ();
+        }
+    }
+    NLToConsole ();
+
+    snprintf (buf, sizeof(buf), "m_ijk: \n");
+    BufferToConsole (buf);
+    for (long j = 0; j < num_parent_combos; j++) {
+        for (long k = 0; k < family_nlevels.lData[0]; k++) {
+            snprintf (buf, sizeof(buf), "%d ", (long) m_ijk (j,k));
+            BufferToConsole (buf);
+        }
+
+        snprintf (buf, sizeof(buf), "| %d", (long) m_ij (j,0));
+        BufferToConsole (buf);
+
+        NLToConsole ();
+    }
+    NLToConsole ();
+#endif
+
+
+    // Calculate probability of imputation {m_ijk}
+    //  For the time being, use multinomial with Dirichlet prior based on non-missing cases (n_ijk)
+    //  for each node, i.e., network parameters for empty graph (independence prior).
+    //  Later, we will want to allow the user to submit their own prior distribution (e.g., after an iteration
+    //  of structural EM) - afyp (March 28, 2008)
+
+    // add Jeffrey's invariance constant (0.5) to every cell n_ijk to avoid zero counts?
+
+    _Parameter  log_prior_impute        = 0.0;
+
+    for (long j = 0; j < num_parent_combos; j++) {
+
+        log_prior_impute += LnGamma(n_ij(j,0) + DIRICHLET_FLATTENING_CONST * r_i)
+                            - LnGamma(n_ij(j,0) + DIRICHLET_FLATTENING_CONST * r_i + m_ij(j,0));
+        /*
+         log_prior_impute += LnGamma(m_ij(j,0)+1) + LnGamma(n_ij(j,0)+DIRICHLET_FLATTENING_CONST*r_i)
+         - LnGamma(m_ij(j,0)+n_ij(j,0)+DIRICHLET_FLATTENING_CONST*r_i);
+         */
+        for (long k = 0; k < r_i; k++) {
+
+            log_prior_impute += LnGamma(n_ijk(j,k) + DIRICHLET_FLATTENING_CONST + m_ijk(j,k))
+                                - LnGamma(n_ijk(j,k) + DIRICHLET_FLATTENING_CONST);
+            /*
+             log_prior_impute += LnGamma(m_ijk(j,k) + n_ijk(j,k)+DIRICHLET_FLATTENING_CONST)
+             - LnGamma(m_ijk(j,k)+1) - LnGamma(n_ijk(j,k)+DIRICHLET_FLATTENING_CONST);
+             */
+        }
+    }
+
+
+
+    // Calculate posterior probability for initial imputation
+    _Parameter  last_score          = log_prior_impute,
+                last_prior_impute    = log_prior_impute;
+
+
+    for (long j = 0; j < num_parent_combos; j++) {
+        last_score += LnGamma(num_levels.lData[node_id]);   // (r-1)!
+        last_score -= LnGamma(n_ij(j, 0) + m_ij(j,0) + num_levels.lData[node_id]);  // (N+r-1)!
+
+        for (long k = 0; k < num_levels.lData[node_id]; k++) {
+            last_score += LnGamma(n_ijk (j,k) + m_ijk (j,k) + 1);   // (N_ijk)!
+        }
+    }
+
+
+
+#ifdef __DEBUG_IDS__
+    snprintf (buf, sizeof(buf), "log_prior_impute = %f\nlast_score = %f\n", log_prior_impute, last_score);
+    BufferToConsole (buf);
+#endif
+
+    /********
+     /  MCMC  /
+     ********/
+
+    // Run MCMC over imputations, use as proposal function a single case reassignment (guaranteed to modify m_ijk's)
+    //      Take into account case being reassigned so that we don't have to re-sum m_ijk every time
+    //      use burn-in and thinning of the sample when calculating the expectation for family posterior probability
+    _Parameter  lk_ratio,
+                expect_log_score = 0.;
+
+    _Matrix     last_impute ((_Matrix &) impute),       // duplicate matrix constructors
+                last_m_ijk (m_ijk),
+                last_m_ij (m_ij);
+
+
+    for (long step = 0; step < mcem_max_steps + mcem_burnin; step++) {
+        /*  PROPOSAL  */
+
+        // choose a random case from the incomplete set and pick a random variable that is missing
+        long    imp,
+                imp_case,
+                imp_var,
+                last_state,
+                child_state,
+                pick;
+
+
+
+        while (1) { // this could be optimized by pre-computing a list of missing value indices
+            imp = genrand_int32 () % impute.GetUsed();
+
+            if (is_missing(0, imp)) {
+                break;
+            }
+        }
+
+        imp_case = (long) (imp / family_size);      // which incomplete case?
+        imp_var  = imp % family_size;       // which variable?
+        last_state = impute (0, imp);
+
+
+
+#ifdef __DEBUG_IDS__
+        snprintf (buf, sizeof(buf), "imp = %d\nimp_case = %d\nimp_var = %d\nnum_incomplete_cases=%d\n", imp, imp_case, imp_var, num_incomplete_cases);
+        BufferToConsole (buf);
+#endif
+
+
+        long    old_index = 0,
+                new_index;
+
+        for (long par = 0; par < parents.lLength; par++) {
+            long    parent_state    = impute (0, imp_case*family_size + par+1);
+            old_index += parent_state * multipliers.lData[par];
+        }
+
+
+
+        // randomly assign a new state to the variable
+
+        if (family_nlevels.lData[imp_var] < 2) {
+            _String oops ("WARNING: Attempting to impute missing values for variable having fewer than two known levels..\n");
+            WarnError(oops);
+
+            continue;   // drop this step from the chain
+        } else if (family_nlevels.lData[imp_var] == 2) {
+            // by convention, levels are zero-indexed; if not, this won't work
+            impute._Matrix::Store (0, imp, (_Parameter) (last_state ? 0 : 1));
+        } else {    // randomly assign a state (other than the current one) with uniform probability
+            pick = genrand_int32() % (family_nlevels.lData[imp_var]-1);
+
+            if (pick >= last_state) {
+                pick++;     // skip current state
+            }
+
+            impute._Matrix::Store (0, imp_var, (_Parameter)pick);
+        }
+
+
+#ifdef __DEBUG_IDS__
+        snprintf (buf, sizeof(buf), "proposed impute: \n");
+        BufferToConsole (buf);
+        for (long bug = 0; bug < impute.GetUsed(); bug++) {
+            snprintf (buf, sizeof(buf), "%d ", (long) impute (0, bug));
+            BufferToConsole (buf);
+
+            if (bug % family_size == family_size - 1) {
+                NLToConsole ();
+            }
+        }
+        NLToConsole ();
+#endif
+
+        // given the case just modified, update m_ijk's.
+
+        child_state = impute(0, imp_case*family_size);
+
+        if (imp_var > 0) {
+            // changed a parental variable, update index
+            new_index = 0;
+
+            for (long par = 0; par < parents.lLength; par++) {
+                long    parent_state    = impute (0, imp_case*family_size + par+1);
+                new_index += parent_state * multipliers.lData[par];
+            }
+
+#ifdef __DEBUG_IDS__
+            snprintf (buf, sizeof(buf), "old_index = %d\nnew_index = %d\n", old_index, new_index);
+            BufferToConsole (buf);
+#endif
+            //  It shouldn't be necessary to re-calculate log_prior_impute from scratch every time
+            //  but this doesn't work properly yet :-P afyp
+
+            /*
+             log_prior_impute -= LnGamma(n_ijk(old_index,child_state) + DIRICHLET_FLATTENING_CONST
+             + m_ijk(old_index, child_state));
+             log_prior_impute -= LnGamma(n_ijk(new_index,child_state) + DIRICHLET_FLATTENING_CONST
+             + m_ijk(new_index, child_state));
+             */
+            m_ijk.Store (old_index, child_state, m_ijk (old_index, child_state) - 1);
+            m_ijk.Store (new_index, child_state, m_ijk (new_index, child_state) + 1);
+            /*
+             log_prior_impute += LnGamma(n_ijk(old_index,child_state) + DIRICHLET_FLATTENING_CONST
+             + m_ijk(old_index, child_state));
+             log_prior_impute += LnGamma(n_ijk(new_index,child_state) + DIRICHLET_FLATTENING_CONST
+             + m_ijk(new_index, child_state));
+             */
+
+            // non-integer flattening constant prevents us from operating directly on factorial terms
+            /*
+             log_prior_impute -= log ( n_ijk (old_index, child_state) + m_ijk (old_index, child_state) + DIRICHLET_FLATTENING_CONST - 1 );
+             log_prior_impute += log ( n_ijk (new_index, child_state) + m_ijk (new_index, child_state) + DIRICHLET_FLATTENING_CONST );
+             */
+
+            /*
+             log_prior_impute -= - LnGamma(n_ij(old_index,0) + DIRICHLET_FLATTENING_CONST * r_i + m_ij(old_index,0));
+             log_prior_impute -= - LnGamma(n_ij(new_index,0) + DIRICHLET_FLATTENING_CONST * r_i + m_ij(new_index,0));
+             */
+            m_ij.Store (old_index, 0, m_ij (old_index, 0) - 1);
+            m_ij.Store (new_index, 0, m_ij (new_index, 0) + 1);
+            /*
+             log_prior_impute += - LnGamma(n_ij(old_index,0) + DIRICHLET_FLATTENING_CONST * r_i + m_ij(old_index,0));
+             log_prior_impute += - LnGamma(n_ij(new_index,0) + DIRICHLET_FLATTENING_CONST * r_i + m_ij(new_index,0));
+             */
+        } else {
+            /*
+             log_prior_impute -= LnGamma(n_ijk(old_index,child_state) + DIRICHLET_FLATTENING_CONST
+             + m_ijk(old_index, last_state));
+             log_prior_impute -= LnGamma(n_ijk(old_index,child_state) + DIRICHLET_FLATTENING_CONST
+             + m_ijk(old_index, last_state));
+             */
+            m_ijk.Store (old_index, last_state, m_ijk (old_index, last_state) - 1);
+            m_ijk.Store (old_index, child_state, m_ijk (old_index, child_state) + 1);
+            /*
+             log_prior_impute += LnGamma(n_ijk(old_index,child_state) + DIRICHLET_FLATTENING_CONST
+             + m_ijk(old_index, child_state));
+             log_prior_impute += LnGamma(n_ijk(old_index,child_state) + DIRICHLET_FLATTENING_CONST
+             + m_ijk(old_index, child_state));
+             */
+
+            /*
+             log_prior_impute -= log ( n_ijk (old_index, last_state) + m_ijk (old_index, last_state) - 1);
+             log_prior_impute += log ( n_ijk (old_index, child_state) + m_ijk (old_index, child_state) );
+             */
+            // m_ij's unchanged, parental combination not modified
+        }
+
+
+        // re-compute prior
+        last_prior_impute       = log_prior_impute;
+        log_prior_impute        = 0.0;
+        /*
+         for (long j = 0; j < num_parent_combos; j++)
+         {
+         log_prior_impute += LnGamma(m_ij(j,0)+1) + LnGamma(n_ij(j,0)+DIRICHLET_FLATTENING_CONST*r_i)
+         - LnGamma(m_ij(j,0)+n_ij(j,0)+DIRICHLET_FLATTENING_CONST*r_i);
+         for (long k = 0; k < r_i; k++)
+         {
+         log_prior_impute += LnGamma(m_ijk(j,k) + n_ijk(j,k)+DIRICHLET_FLATTENING_CONST)
+         - LnGamma(m_ijk(j,k)+1) - LnGamma(n_ijk(j,k)+DIRICHLET_FLATTENING_CONST);
+         }
+         }
+         */
+        for (long j = 0; j < num_parent_combos; j++) {
+            log_prior_impute += LnGamma(n_ij(j,0) + DIRICHLET_FLATTENING_CONST * r_i)
+                                - LnGamma(n_ij(j,0) + DIRICHLET_FLATTENING_CONST * r_i + m_ij(j,0));
+
+            for (long k = 0; k < r_i; k++) {
+                log_prior_impute += LnGamma(n_ijk(j,k) + DIRICHLET_FLATTENING_CONST + m_ijk(j,k))
+                                    - LnGamma(n_ijk(j,k) + DIRICHLET_FLATTENING_CONST);
+            }
+        }
+
+
+#ifdef __DEBUG_IDS__
+        snprintf (buf, sizeof(buf), "proposed m_ijk: \n");
+        BufferToConsole (buf);
+        for (long j = 0; j < num_parent_combos; j++) {
+            for (long k = 0; k < family_nlevels.lData[0]; k++) {
+                snprintf (buf, sizeof(buf), "%d ", (long) m_ijk (j,k));
+                BufferToConsole (buf);
+            }
+            NLToConsole ();
+        }
+        NLToConsole ();
+#endif
+
+
+        // compute posterior probability for this step, given N_ijk = n_ijk + m_ijk
+        log_score = log_prior_impute;
+
+        for (long j = 0; j < num_parent_combos; j++) {
+            log_score += LnGamma(num_levels.lData[node_id]);    // (r-1)!
+            log_score -= LnGamma(n_ij(j, 0) + m_ij(j,0) + num_levels.lData[node_id]);   // (N+r-1)!
+
+            for (long k = 0; k < num_levels.lData[node_id]; k++) {
+                log_score += LnGamma( n_ijk (j,k) + m_ijk (j,k) + 1);   // (N_ijk)!
+            }
+        }
+
+        /* I have a hunch this can all be stream-lined... - afyp April 4, 2008 */
+
+
+        // accept step?     (Metropolis-Hastings)
+        lk_ratio    = exp(log_score - last_score);
+
+#ifdef __DEBUG_IDS__
+        snprintf (buf, sizeof(buf), "prior = %f, log_score = %f, last_score = %f, lk_ratio = %f\n", log_prior_impute, log_score, last_score, lk_ratio);
+        BufferToConsole (buf);
+#endif
+        if (lk_ratio > 1. || genrand_real2() < lk_ratio) {  // accept proposed imputation
+            last_impute = (_Matrix &)impute;
+            last_score = log_score;
+            last_prior_impute   = log_prior_impute;
+            last_m_ijk = m_ijk;
+            last_m_ij = m_ij;
+#ifdef __DEBUG_IDS__
+            snprintf (buf, sizeof(buf), "accept\n\n");
+            BufferToConsole (buf);
+#endif
+        } else {    // revert to original imputation
+            for (long i = 0; i < impute.GetUsed(); i++) {
+                impute._Matrix::Store (0, i, last_impute (0, i));
+            }
+            log_score = last_score;
+            log_prior_impute    = last_prior_impute;
+            m_ijk = last_m_ijk;
+            m_ij = last_m_ij;
+#ifdef __DEBUG_IDS__
+            snprintf (buf, sizeof(buf), "reject\n\n");
+            BufferToConsole (buf);
+#endif
+        }
+
+
+
+        // handle sampling of chain
+        if (step >= mcem_burnin) {
+            if ( (step - (long)mcem_burnin) % (long)mcem_interval == 0) {
+                prior_denom->Store (log_prior_impute);  // append to _GrowingVector objects
+                post_chain->Store (log_score);
+#ifdef __DEBUG_IDS__
+                snprintf (buf, sizeof(buf), "%f, %f\n", log_prior_impute, log_score);
+                BufferToConsole (buf);
+#endif
+            }
+        }
+    }
+    // exit MCEM for-loop
+
+    expect_log_score = LogSumExpo (post_chain) - LogSumExpo (prior_denom);
+
+
+
+    snprintf (buf, sizeof(buf), "Node %ld, parents(%ld): ", node_id, parents.lLength);
+    BufferToConsole (buf);
+    for (long par = 0; par < parents.lLength; par++) {
+        snprintf (buf, sizeof(buf), " %ld", parents.lData[par]);
+        BufferToConsole (buf);
+    }
+
+
+    snprintf (buf, sizeof(buf), "  sum(prior) = %f  E[log score] = %f\n", LogSumExpo (prior_denom), expect_log_score);
+    BufferToConsole (buf);
+
+    DeleteObject (prior_denom);
+    DeleteObject (post_chain);
+
+    return expect_log_score;
+}
+
+
+
+
+
+//___________________________________________________________________________________________
+_Parameter Bgm::ComputeContinuousScore (long node_id)
+{
+    _SimpleList parents,
+                continuous_parents;
+
+    // generate lists of discrete or continuous parents from graph
+    for (long par = 0; par < num_nodes; par++) {
+        if (dag(par, node_id) == 1) {
+            if (is_discrete.lData[par]) {
+                parents << par;
+            } else {
+                continuous_parents << par;
+            }
+        }
+    }
+
+    return ComputeContinuousScore (node_id, parents, continuous_parents);
+}
+
+
+_Parameter Bgm::ComputeContinuousScore (long node_id, _Matrix *g)
+{
+    _SimpleList     dparents,
+                    cparents;
+
+    for (long par = 0; par < num_nodes; par++) {
+        // support for discrete parents only
+        if ((*g)(par, node_id) == 1) {
+            if (is_discrete.lData[par]) {
+                dparents << par;
+            } else {
+                cparents << par;
+            }
+        }
+    }
+    return ComputeContinuousScore (node_id, dparents, cparents);
+}
+
+
+//___________________________________________________________________________________________
+
+_Parameter Bgm::ComputeContinuousScore (long node_id, _SimpleList & parents, _SimpleList & continuous_parents)
+{
+    /* WARNING, untested function! */
+    /* --------------------------- */
+
+    // mm = prior estimate of unconditional mean at continuous node (i.e. intercept)
+    // phi = scale parameter of inverse gamma prior for variance, uninformative at low values
+    //                      (Kohn, Smith, and Chan, 2001 Stat Comput 11: 313-322)
+
+    _Parameter  log_score = 0.;
+
+    long        num_parent_combos = 1,  // i.e. 'q'
+                k = continuous_parents.lLength;     // current number of continuous parents
+
+    _Matrix     n_ij,
+                pa_indexing,        // track discrete parent combinations per observation
+                mu,
+                tau;
+
+    _SimpleList     multipliers ((long)1);
+
+
+
+    // set location hyperparameter for Gaussian prior
+    CreateMatrix (&mu, k+1, 1, false, true, false);
+    mu.Store (0, 0, prior_mean (node_id, 0));               // prior intercept
+    for (long i = 1; i < mu.GetHDim(); i++) {
+        mu.Store (i, 0, 0);     // set prior expectation of regression coefficients to zero
+    }
+
+
+
+    // how many combinations of parental states are there?
+    for (long par = 0; par < parents.lLength; par++) {
+        num_parent_combos *= num_levels.lData[parents.lData[par]];
+        multipliers << num_parent_combos;
+    }
+
+    // set prior degrees of freedom (for inverse gamma / scaled inverse chi-square)
+    _Parameter      rho = prior_sample_size (node_id, 0) > 0 ? (prior_sample_size (node_id, 0) / num_parent_combos) : 1.0;
+
+
+    // set precision hyperparameter for Gaussian prior
+    CreateMatrix (&tau, k+1, k+1, false, true, false);
+    for (long row = 0; row < tau.GetHDim(); row++) {
+        for (long col = 0; col < tau.GetVDim(); col++) {
+            if (row == col) {
+                tau.Store (row, col, rho);
+            } else {
+                tau.Store (row, col, 0.);    // zero off-diagonal entries
+            }
+        }
+    }
+
+
+    // count up number of data points per parent combination
+    CreateMatrix (&n_ij, num_parent_combos, 1, false, true, false);
+    CreateMatrix (&pa_indexing, obsData->GetHDim(), 1, false, true, false);
+
+    for (long obs = 0; obs < obsData->GetHDim(); obs++) {
+        long    index       = 0,
+                multiplier = 1;
+        //child_state = (*obsData)(obs, node_id);
+
+        for (long par = 0; par < parents.lLength; par++) {
+            long    this_parent     = parents.lData[par];
+            // max index = sum (parent * levels(parent))
+            index += (*obsData)(obs, this_parent) * multiplier;
+            multiplier *= num_levels.lData[this_parent];
+        }
+
+        pa_indexing.Store (obs, 0, index);
+        n_ij.Store (index, 0, n_ij(index, 0) + 1);
+    }
+
+
+
+    // for every parent combination, calculate contribution to score
+    for (long pa = 0; pa < num_parent_combos; pa++) {
+        _Parameter  pa_log_score = 0.;
+
+        _Matrix     zbpa (n_ij(pa, 0), continuous_parents.lLength + 1, false, true),
+                    yb (n_ij(pa, 0), 1, false, true),
+                    scale;
+
+        long        count_n     = 0;
+        // number of data points with this parent combination.
+
+
+        // populate zbpa matrix with (1, y_1, y_2, ..., y_m) entries for this parental combo
+        for (long obs = 0; obs < obsData->GetHDim(); obs++) {
+            if (pa_indexing(obs, 0) == pa) {    // this observation has the current parent combo
+                // load observed states at continuous parents into matrix
+                //   I'm sure there's a faster way to do this! - afyp
+
+                zbpa.Store (count_n, 0, 1);     // intercept
+
+                for (long parent = 0; parent < continuous_parents.lLength; parent++) {
+                    zbpa.Store (count_n, parent+1, (*obsData)(obs, continuous_parents.lData[parent]));
+                }
+
+                // state vector for this continuous node
+                yb.Store (count_n, 0, (*obsData)(obs, node_id));
+
+                count_n++;
+            }
+        }
+
+        // calculate scale parameter for non-central t distribution
+        // from S. Bottcher (2001) p.25
+        scale = zbpa;
+        scale *=  * (_Matrix *) tau.Inverse();
+        zbpa.Transpose();
+        scale *= zbpa;
+        zbpa.Transpose();
+        for (long row = 0; row < scale.GetHDim(); row++) {  // add identity matrix
+            scale.Store (row, row, scale(row, row)+(_Parameter)1.);
+        }
+        scale *= (_Parameter) (prior_precision (node_id, 0) / rho);
+
+
+        // calculate the determinant of scale parameter matrix
+        _Matrix         temp_mat (scale);
+        _Parameter      pi_const = 3.141592653589793;
+
+        temp_mat *= (_Parameter) (pi_const * rho);
+
+        _AssociativeList *  eigen       = (_AssociativeList *) temp_mat.Eigensystem();
+        _Matrix *           eigenvalues = (_Matrix *)eigen->GetByKey(0, MATRIX);
+        _Parameter          det         = 1.;
+
+        // determinant is product of eigenvalues (should be > 0 for positive definite matrices)
+        for (long i = 0; i < eigenvalues->GetHDim(); i++) {
+            det *= (_Parameter)(*eigenvalues) (i,0);
+        }
+
+
+        // calculate first term of score
+        pa_log_score += LnGamma((rho + n_ij(pa, 0))/2.);
+        pa_log_score -= LnGamma(rho/2.) + 0.5 * log(det);
+
+
+        // calculate second term of score
+        _Matrix     next_mat;
+        zbpa *= mu;
+        yb -= zbpa;
+        temp_mat = yb;
+        next_mat = temp_mat;
+        next_mat *= * (_Matrix *) scale.Inverse();
+        temp_mat.Transpose();
+        next_mat *= temp_mat;
+        next_mat *= (_Parameter) (1./prior_precision (node_id, 0)); // should be a 1-element matrix
+
+        pa_log_score += -(rho + n_ij(pa,0))/2. * (next_mat(0,0) + 1.);
+        log_score += pa_log_score;
+    }
+
+
+    return log_score;
+}
+
+
+
+//__________________________________________________________________________________________//
+//                                                                                          //
+//                              DYNAMIC BAYESIAN NETWORKS                                   //
+//__________________________________________________________________________________________//
+//                                                                                          //
+//      A(t)    B(t)        "2 parents" means  A(t+1) <-- A(t) + B(t) + B(t+1)              //
+//       |     / |                                                                          //
+//       |   /   |          i.e., there are never actually two parents..                    //
+//       V L     V                                                                          //
+//   A(t+1) <-- B(t+1)                                                                      //
+//__________________________________________________________________________________________//
+
+_DynamicBgm::_DynamicBgm (_AssociativeList * dnodes, _AssociativeList * cnodes) : Bgm (dnodes, cnodes)
+{
+    // call base class constructor
+    if (num_nodes % 2 > 0) {
+        _String errorMsg ("ERROR: Expected even number of nodes in network.");
+        WarnError (errorMsg);
+    }
+
+    // check that variables retain type across time slices, i.e. a discrete node doesn't become continuous
+    for (long node = 0; node < num_nodes; node += 2) {
+        if (is_discrete.lData[node] != is_discrete.lData[node+1]) {
+            _String errorMsg ("ERROR: Inconsistent node type across time slices.");
+            WarnError (errorMsg);
+        }
+    }
+}
+
+//___________________________________________________________________________________________
+#ifdef __NEVER_DEFINED__
+_Parameter  _DynamicBgm::Compute (_SimpleList * node_order, _List * results)
+{
+    _Parameter          log_likel   = 0.;
+    _GrowingVector      *gv1, *gv2;
+
+    for (long i = 0; i < num_nodes * num_nodes; i++) {
+        gv1 = (_GrowingVector *) results->lData[i];
+        gv1 -> ZeroUsed();
+    }
+
+    for (long nodeIndex = 0; nodeIndex < node_order->lLength; nodeIndex++) {
+        long                child_node      = node_order->lData[nodeIndex],
+                            maxp            = max_parents.lData[child_node];
+
+        _List           *   score_lists     = (_List *) node_scores.lData[child_node];
+
+        gv1 = (_GrowingVector *) results->lData[child_node * num_nodes + child_node];
+        gv1->ZeroUsed();
+
+        if (child_node % 2 == 1) {
+            _Constant       *   orphan_score    = (_Constant *) (score_lists->lData[0]);
+            gv1 -> Store (orphan_score->Value());
+        } else {
+            _Matrix *   single_parent_scores    = (_Matrix *) (score_lists->lData[1]);
+        }
+
+        long        self_parent             = node_order->lData[nodeIndex + 1];
+
+
+        gv1 -> Store ((*single_parent_scores) (self_parent, 0));
+
+        gv2 = (_GrowingVector *) results->lData[child_node * num_nodes + self_parent];
+        gv2 -> Store ((*single_parent_scores) (self_parent, 0));
+
+        if (maxp > 1) {
+            _SimpleList         parents,
+                                eligible_parents;
+            _Parameter          tuple_score;
+            _NTupleStorage *    family_scores;
+
+            for (long parIndex = nodeIndex + 3; parIndex < node_order->lLength; parIndex = parIndex + 2) {
+                long    par = node_order->lData[parIndex];
+
+                if (banned_edges (par, child_node) == 0) {
+                    eligible_parents << par;
+                }
+            }
+
+            family_scores = (_NTupleStorage *) (score_lists->lData[2]);
+            parents.Populate (2, 0, 0);
+            for (long ep = 0; ep < eligible_parents.lLength; ep++) {
+                long    this_parent = eligible_parents.lData[ep];
+                if (this_parent > child_node) {
+                    parents.lData[0] = self_parent-1;
+                    parents.lData[1] = this_parent-1;
+                } else {
+                    parents.lData[0] = this_parent;
+                    parents.lData[1] = self_parent-1;
+                }
+                tuple_score = family_scores -> Retrieve (parents);
+
+                gv1 -> Store (tuple_score);
+
+                gv2 = (_GrowingVector *) results->lData[child_node * num_nodes + self_parent];
+                gv2 -> Store (tuple_score);
+                gv2 = (_GrowingVector *) results->lData[child_node * num_nodes + this_parent];
+                gv2 -> Store (tuple_score);
+            }
+
+
+            if (maxp > 2) {
+                _SimpleList         indices (eligible_parents.lLength, 0, 1);
+
+                for (long nparents = 3; nparents <= maxp; nparents++) {
+                    _SimpleList     subset,
+                                    auxil;
+                    bool            not_finished;
+
+                    if (nparents-1 > eligible_parents.lLength) {
+                        break;
+                    }
+
+                    if (indices.NChooseKInit (auxil, subset, nparents-1, false)) {
+                        parents.Populate(nparents, 0, 0);
+                        parents.lData[0] = self_parent;
+
+                        family_scores = (_NTupleStorage *) (score_lists->lData[nparents]);
+
+                        do {
+                            not_finished = indices.NChooseK (auxil, subset);
+
+                            for (long i = 0; i < nparents-1; i++) {
+                                long    realized = eligible_parents.lData[subset.lData[i]];
+                                if (realized >= child_node) {
+                                    realized--;
+                                }
+                                parents.lData[i] = realized;
+                            }
+                            parents.Sort(TRUE);
+
+                            tuple_score = family_scores -> Retrieve (parents);
+                            gv1 -> Store (tuple_score);
+                            gv2 = (_GrowingVector *) results -> lData [child_node*num_nodes + self_parent];
+                            gv2 -> Store (tuple_score);
+
+                            for (long i = 0; i < nparents-1; i++) {
+                                gv2 = (_GrowingVector *) results->lData[child_node * num_nodes + eligible_parents.lData[subset.lData[i]]];
+                                gv2 -> Store (tuple_score);
+                            }
+                        } while (not_finished);
+                    }
+                }
+            }
+        }
+    }
+    gv1 -> _Matrix::Store (0, 0, LogSumExpo(gv1));
+    log_likel += (*gv1)(0, 0);
+}
+return log_likel;
+}
+#endif
+
+#ifdef __NEVER_DEFINED__
+//___________________________________________________________________________________________
+void    _DynamicBgm::SetDataMatrix (_Matrix * data)
+{
+    scores_cached   = FALSE;
+
+    if (obsData)    {
+        DeleteObject (obsData);    // dispense with previous data matrix
+    }
+    obsData         = data;
+    obsData->CheckIfSparseEnough(TRUE);
+
+
+    // reset data-dependent member variables
+    for (long node = 0; node < num_nodes; node++) {
+        has_missing.lData[node] = 0;
+        num_levels.lData[node] = 0;
+    }
+
+
+    // check for missing data and compute levels
+    if (obsData->GetVDim() == 2*num_nodes) {
+        long    nrows = obsData->GetHDim(),
+                obs,
+                node;
+
+        for (long col = 0; col < obsData->GetVDim(); col++) {
+            node = col / 2;
+
+            if (is_discrete.lData[node]) {
+                if (col % 2 == 0) {
+                    num_levels.lData[node] = 1;    // reset for new variable
+                }
+
+                for (long row = 0; row < nrows; row++) {
+                    obs = (*obsData)(row,col);
+
+                    if (has_missing[node] == 0 && obs < 0) {
+                        has_missing.lData[node] = 1;
+                        continue;   // skip next step to check levels
+                    }
+
+                    obs++;  // adjust for zero-indexing
+                    if (obs > num_levels.lData[node]) {
+                        num_levels.lData[node]++;
+                    }
+                }
+            } else {
+                // continuous node defined to have no levels
+                num_levels.lData[node] = 0;
+            }
+        }
+    } else {
+        _String errorMsg ("Number of variables in data matrix do not match number of nodes in graph.");
+        WarnError (errorMsg);       // note, this produces a crash because the batch file proceeds to execute
+        // BGM routines without data. - AFYP
+    }
+
+
+    last_node_order.Clear();        // forget the last step taken in MCMC chain
+    best_node_order.Clear();
+
+    CacheNodeScores();
+}
+#endif
+
+
+//___________________________________________________________________________________________
+void    _DynamicBgm::CacheNodeScores (void)
+{
+    //  derived CacheNodeScores() imposes dBGM structural constraints when computing
+    //  node scores, which are then re-indexed to group like nodes across time slices,
+    //  halving [num_nodes].
+    //  will have to reset member variables.
+    if (scores_cached) {
+        return;
+    }
+
+
+    _SimpleList     parents, empty_list;
+    _Parameter      score;
+    long            dbn_nodes   = num_nodes / 2;
+
+    for (long node_id = 0; node_id < num_nodes; node_id++) {
+        long        maxp        = max_parents.lData[node_id];
+
+        _List   *   this_list   = (_List *) node_scores.lData[node_id]; // retrieve pointer to list of scores for this node
+        this_list->Clear();
+
+        parents.Clear();
+
+        if (node_id % 2 == 0) { // cache only even-numbered nodes in current time slice
+            // will always have at least one parent (node+1)
+            parents << node_id + 1;
+            score = is_discrete.lData[node_id]  ? ComputeDiscreteScore (node_id, parents)
+                    : ComputeContinuousScore (node_id);
+            _Constant   orphan_score (score);
+            (*this_list) && (&orphan_score);
+
+
+            // 1 parent --> 3 DBN-parents
+            _Matrix     single_parent_scores (dbn_nodes, 1, false, true);
+
+            parents.Populate (3, 0, 0);
+            for (long par = 0; par < num_nodes; par = par + 2) {    // traverse even-nodes
+                if (par == node_id) {
+                    continue;
+                }
+
+                if (par < node_id) {    // parents need to be in numerical order
+                    parents.lData[0] = par;
+                    parents.lData[1] = par+1;
+                    parents.lData[2] = node_id+1;
+                } else {
+                    parents.lData[0] = node_id+1;
+                    parents.lData[1] = par;
+                    parents.lData[2] = par+1;
+                }
+
+                single_parent_scores.Store (par/2, 0, is_discrete.lData[node_id]    ? ComputeDiscreteScore (node_id, parents)
+                                            : ComputeContinuousScore (node_id));
+            }
+
+            (*this_list) && (&single_parent_scores);
+
+
+            // more than one other parent
+            if (maxp > 1) {
+                _SimpleList     all_but_one (dbn_nodes-1, 0, 1),    // group nodes into time-slice pairs
+                                aux_list,
+                                nk_tuple;
+
+                for (long unused, np = 2; np <= maxp; np++) {
+                    _NTupleStorage  family_scores (dbn_nodes-1, np);
+
+                    parents.Populate (2*np + 1, 0, 0);
+                    parents.lData[0] = node_id+1;   // always depends on itself!
+
+                    if (all_but_one.NChooseKInit (aux_list, nk_tuple, np, false)) {
+                        bool    remaining = TRUE;
+                        do {
+                            remaining = all_but_one.NChooseK (aux_list, nk_tuple);
+                            for (long par, par_idx = 0; par_idx < np; par_idx++) {
+                                par = 2 * nk_tuple.lData[par_idx];  // convert back to num_nodes index
+                                if (par >= node_id) {
+                                    par += 2;
+                                }
+                                parents.lData[2*par_idx+1] = par;
+                                parents.lData[2*par_idx+2] = par + 1;
+                            }
+                            parents.Sort();
+                            score = is_discrete.lData[node_id]  ? ComputeDiscreteScore (node_id, parents)
+                                    : ComputeContinuousScore (node_id);
+                            unused = family_scores.Store (score, nk_tuple);
+                            parents.lData[0] = node_id+1;   // required because of prior sort
+                        } while (remaining);
+                    } else {
+                        _String oops ("Failed to initialize _NTupleStorage object in Bgm::CacheNodeScores().\n");
+                        WarnError(oops);
+                    }
+                    (*this_list) && (&family_scores);   // append duplicate to storage
+                }
+            }
+        }
+    }
+
+    scores_cached = TRUE;
+    CollapseDynamicGraph(); // rescale graph so that A(t)->A(t+1) is treated as a single node
+}
+
+
+
+//___________________________________________________________________________________________
+void    _DynamicBgm::CollapseDynamicGraph (void)
+{
+    if (scores_cached) {
+        _String oops ("Attempted to call _DynamicBgm::CollapseDynamicGraph() before CacheNodeScores().\n");
+        WarnError(oops);
+    } else if (!obsData) {
+        _String oops ("No data matrix assigned to _DynamicBgm object in CollapseDynamicGraph().\n");
+        WarnError(oops);
+    } else if (num_nodes < obsData->GetVDim()) {
+        _String oops ("In CollapseDynamicGraph(): Node space already collapsed!\n");
+        WarnError(oops);
+    } else {
+        long            dbn_nodes   = num_nodes / 2;
+
+        // overwrite entries in class member _Matrix and _SimpleList objects
+        for (long row = 0; row < num_nodes; row += 2) {
+            for (long col = 0; col < num_nodes; col += 2) {
+                /*
+                if (banned_edges(row,col) == 1 || banned_edges);    // (P-/->C)
+                {
+
+                }
+                 */
+            }
+        }
+        num_nodes  = dbn_nodes;
+    }
+}
+
+//___________________________________________________________________________________________
+
+/*  WARNING:  DO NOT activate these debugging flags unless the number of iterations is very LOW */
+
+//#define   __DEBUG_GADS__
+//#define __DEBUG_GADS2__
+_Parameter  Bgm::GibbsApproximateDiscreteScore (long node_id, _SimpleList & parents)
+{
+    //char          buf [255];
+    ReportWarning (_String("Imputing missing values for node ") & node_id & " with parents " & (_String *) parents.toStr());
+
+    long            num_parent_combos   = 1,
+                    r_i                   = num_levels.lData[node_id],
+                    max_num_levels        = r_i,
+                    family_size           = parents.lLength + 1;
+
+    _SimpleList     multipliers ((long) 1), // length constructor, populator
+                    family_nlevels (family_size, 0, 0),
+                    is_missing;             // store linear indices to missing entries
+
+    is_missing.RequestSpace((long) family_size * obsData->GetHDim());
+
+    _Matrix         n_ijk, n_ij,
+                    m_ijk, m_ij,
+                    data_deep_copy,         // make a deep copy of the relevant columns of the data matrix
+                    reassign_probs;
+
+    _GrowingVector  * vector_of_scores  = new _GrowingVector();     // for storing scores sampled during re-assignment of missing values
+
+    _Parameter      log_score           = 0,
+                    max_iterations,
+                    parent_state, child_state,
+                    denom,
+                    this_prob;
+
+    double          urn;            // uniform random number
+
+
+    // get MCEM settings
+    checkParameter (mcemMaxSteps, max_iterations, 0.);
+    if (max_iterations < 1) {
+        _String oops ("Problem in BGM::GibbsApproximateDiscreteScore(): Did you forget to specify a value for BGM_MCEM_MAXSTEPS?\n");
+        WarnError (oops);
+    }
+
+
+
+    // to index into N_ij/k matrices by parent combination
+    for (long par = 0; par < parents.lLength; par++) {
+        num_parent_combos *= num_levels.lData[parents.lData[par]];
+        multipliers << num_parent_combos;
+    }
+
+
+    // get number of levels per family member
+    family_nlevels.lData[0] = r_i;
+    for (long par = 0; par < parents.lLength; par++) {
+        family_nlevels.lData[par+1] = num_levels.lData [ parents.lData[par] ];
+        if (family_nlevels.lData[par+1] > max_num_levels) {
+            max_num_levels = family_nlevels.lData[par+1];
+        }
+    }
+
+
+
+    // allocate space to matrices
+    CreateMatrix (&n_ijk, num_parent_combos, r_i, false, true, false);
+    CreateMatrix (&n_ij, num_parent_combos, 1, false, true, false);
+    CreateMatrix (&data_deep_copy, obsData->GetHDim(), family_size, false, true, false);
+    CreateMatrix (&reassign_probs, max_num_levels, 1, false, true, false);
+
+
+
+    // make deep copy and annotate which entries are missing - for use during Gibbs sampling
+    // simultaneously tally N_ijk's for complete cases
+    _SimpleList is_complete ((unsigned long) data_deep_copy.GetHDim());
+    long        n_complete_cases = 0;
+
+    for (long pa_index, row = 0; row < obsData->GetHDim(); row++) {
+        pa_index                = 0;
+        child_state             = (*obsData) (row, node_id);
+        data_deep_copy.Store (row, 0, child_state);
+        is_complete.lData[row]  = 1;
+
+        if (child_state < 0) {
+            is_missing << row * family_size;
+            is_complete.lData[row] = 0;
+        }
+
+        for (long par = 0; par < parents.lLength; par++) {
+            parent_state = (*obsData) (row, parents.lData[par]);
+            data_deep_copy.Store (row, par+1, parent_state);
+
+            if (parent_state < 0) {
+                is_missing << row * family_size + par+1;
+                is_complete.lData[row] = 0;
+            } else {
+                pa_index += ((long)parent_state) * multipliers.lData[par];
+            }
+        }
+
+        if (is_complete.lData[row]) {
+            n_complete_cases += 1;
+            n_ijk.Store (pa_index, (long) child_state, n_ijk(pa_index, (long) child_state) + 1);
+            n_ij.Store  (pa_index, 0, n_ij(pa_index, 0) + 1);
+        }
+    }
+
+
+    // convert N_ijk's into probability matrix - equation 16 from Cooper and Herskovits
+    // reset N_ijk and N_ij while we're looping
+    _Matrix prob_n_ijk, prob_n_ij;
+
+    CreateMatrix (&prob_n_ijk, num_parent_combos, r_i, false, true, false);
+    CreateMatrix (&prob_n_ij, num_parent_combos, 1, false, true, false);
+
+    for (long j = 0; j < num_parent_combos; j++) {
+        prob_n_ij.Store ( j, 0, (n_ij(j,0) + 1) / (n_complete_cases + num_parent_combos) ); // is this the correct estimator?
+
+        for (long k = 0; k < r_i; k++) {
+            prob_n_ijk.Store( j, k, prob_n_ij(j,0) * (n_ijk(j,k) + 1) / (n_ij(j,0) + r_i) );
+            n_ijk.Store( j, k, 0.);
+        }
+        n_ij.Store ( j, 0, 0.);
+    }
+
+
+    // cache marginalizations over this probability matrix as determined by which variables are missing
+    // this would be nice, but let's brute-force it for now :-P
+
+
+    // initialize missing entries to random assignments based on complete cases (N_ijk)
+    if (family_size > 1) {
+        for (long row = 0; row < data_deep_copy.GetHDim(); row++) {
+            if (!is_complete.lData[row]) {  // this row contains a missing value
+                _Parameter  denominator = 0.;
+                _SimpleList keep_pa_indices;
+
+                // determine which parental state combinations (indexed by j) are possible
+                // store those indices in a list and accumulate the probabilities in a denominator
+                for (long j = 0; j < num_parent_combos; j++) {
+                    bool keep = TRUE;
+                    for (long par = 1; par <= parents.lLength; par++) {
+                        if ( data_deep_copy(row,par) >= 0 ) {
+                            if ( (long)(j/multipliers.lData[par-1]) % num_levels.lData[parents.lData[par-1]] != (long)data_deep_copy(row,par) ) {
+                                // observed parent state is incompatible with this pa combo
+                                keep = FALSE;
+                                break;
+                            }
+                        }
+                    }
+
+                    if (keep) {
+                        keep_pa_indices << j;
+
+                        long    k = (long) data_deep_copy(row,0);
+                        if ( k >= 0 ) {
+                            denominator += prob_n_ijk (j, k);   // child state is observed, append from this column only
+                        } else {
+                            for (k = 0; k < r_i; k++) {
+                                denominator += prob_n_ijk (j, k);    // sum across columns (unknown child state)
+                            }
+                        }
+                    }
+                }
+
+
+                // select random values (j, k) subject to constraints
+                long    k       = (long) data_deep_copy(row,0),
+                        pick_k,
+                        pick_j;
+
+                urn = genrand_real2();
+
+                for (long pa = 0; pa < keep_pa_indices.lLength; pa++) {
+                    pick_j = keep_pa_indices.lData[pa];
+
+                    if (k >= 0 && k < r_i) {    /* k is a fixed non-missing value */
+                        if ( urn < (prob_n_ijk (pick_j,k) / denominator) ) {    /*** LEAK ***/
+                            break;
+                        }
+                        urn -= prob_n_ijk (pick_j,k) / denominator; /*** LEAK ***/
+                    } else if (k == -1) {   // child is missing
+                        for (pick_k = 0; pick_k < r_i; pick_k++) {
+                            if ( urn < (prob_n_ijk (pick_j,pick_k) / denominator) ) {
+                                break;
+                            }
+                            urn -= prob_n_ijk (pick_j,pick_k) / denominator;
+                        }
+                        if (pick_k < r_i) {
+                            // break out of outer loop carrying current values [j] and [pick_k]
+                            break;
+                        }
+                        // otherwise go to top of outer loop to try a different [j]
+                    } else {
+                        WarnError(_String("This shouldn't happen! : row = ") & row & "  k = " & k & "  data_deep_copy(row,0) = " & data_deep_copy(row,0) & "  (long)data_deep_copy(row,0) = " & (long)data_deep_copy(row,0));
+                    }
+                }
+
+                //ReportWarning (_String ("j,k=") & j & "," & k);
+
+                // convert j, k to data
+                if ( k < 0 ) {
+                    data_deep_copy.Store(row, 0, pick_k);
+                }
+
+                for (long par = 1; par <= parents.lLength; par++) {
+                    if ( data_deep_copy(row,par) < 0 ) {
+                        data_deep_copy.Store(row, par, (long)(pick_j/multipliers.lData[par-1]) % num_levels.lData[parents.lData[par-1]]);
+                    }
+                }
+
+            }
+        }
+    } else {    // family_size == 1
+        for (long row = 0; row < data_deep_copy.GetHDim(); row++) {
+            if (data_deep_copy(row,0) < 0) {
+                urn = genrand_real2();
+                for (child_state = 0; child_state < r_i; child_state++) {
+                    this_prob = prob_n_ijk(0,(long)child_state);
+                    if (urn < this_prob) {
+                        break;
+                    }
+                    urn -= this_prob;
+                }
+
+                data_deep_copy.Store (row, 0, child_state);
+            }
+        }
+    }
+
+
+    //ReportWarning (_String("Initialized data : ") & (_String *) data_deep_copy.toStr());
+
+
+    // recount N_ij and N_ijk from entire data set (with imputed cases)
+    n_complete_cases = data_deep_copy.GetHDim();    // variable re-use!
+    for (long pa_index, row = 0; row < n_complete_cases; row++) {
+        pa_index        = 0;
+        child_state     = data_deep_copy (row, 0);
+
+        for (long par = 0; par < parents.lLength; par++) {
+            parent_state = data_deep_copy (row, par+1);
+            pa_index += ((long)parent_state) * multipliers.lData[par];
+        }
+
+        n_ijk.Store (pa_index, (long) child_state, n_ijk(pa_index, (long) child_state) + 1);
+        n_ij.Store  (pa_index, 0, n_ij(pa_index, 0) + 1);
+    }
+
+
+    //ReportWarning (_String("N_ijk:") & (_String *) n_ijk.toStr());
+
+
+    //  Cycle through random permutation of missing entries and reassign by marginal probability.
+    //      Based on family configuration of the corresponding case, adjust N_ijk to compute reassignment probs.
+    //      If accept reassignment, update N_ijk values.
+
+    // log_score = K2Score (r_i, n_ij, n_ijk);  // compute score from complete cases
+
+    for (long iter = 0; iter < max_iterations; iter++) {
+        // shuffle list of missing entries
+        // is_missing.Permute(1);
+        // ReportWarning (_String("is_missing Permute:") & (_String *) is_missing.toStr());
+
+        for (long row, col, pa_index, missing_idx = 0; missing_idx < is_missing.lLength; missing_idx++) {
+            row         = is_missing.lData[missing_idx] / family_size;
+            col         = is_missing.lData[missing_idx] % family_size;
+            pa_index    = 0;
+
+            // determine parent combination for this row
+            for (long par = 0; par < parents.lLength; par++) {
+                pa_index += ((long) data_deep_copy (row, par+1)) * multipliers.lData[par];
+            }
+
+
+            if (col == 0) { // child node, reassign N_ijk's, keep N_ij's constant
+                child_state = data_deep_copy (row, col);
+                n_ijk.Store (pa_index, (long) child_state, n_ijk(pa_index, (long) child_state) - 1);
+
+                // compute probabilities for all instantiations of child node
+                denom = 0.;
+                for (long k = 0; k < r_i; k++) {
+                    denom += this_prob = (n_ijk(pa_index,k) + 1) / (n_ij(pa_index,0) + r_i);
+                    reassign_probs.Store (k, 0, this_prob);
+                }
+
+
+                // random reassignment
+                urn = genrand_real2 ();
+                for (long lev = 0; lev < r_i; lev++) {
+                    this_prob = reassign_probs(lev,0) / denom;
+                    //ReportWarning(_String("child: urn, this_prob = ") & urn & "," & this_prob);
+                    if ( urn < this_prob ) {
+                        n_ijk.Store (pa_index, lev, n_ijk(pa_index,lev) + 1);
+                        data_deep_copy.Store (row, col, lev);
+                        break;
+                    }
+                    urn -= this_prob;
+                }
+            } else {    // col > 0, parent node, reassign both N_ij's AND N_ijk's
+                parent_state    = data_deep_copy (row, col);
+                child_state     = data_deep_copy (row, 0);
+
+                n_ij.Store  (pa_index, 0, n_ij(pa_index,0) - 1);
+                n_ijk.Store (pa_index, (long) child_state, n_ijk(pa_index, (long) child_state) - 1);
+
+                pa_index    -= ((long)parent_state) * multipliers.lData[col-1]; // marginalize index
+                denom       = 0.;
+                for (long pa_temp, lev = 0; lev < family_nlevels.lData[col]; lev++) {
+                    // parental index for this instantiation of parent node given other parents (fixed)
+                    pa_temp = pa_index + lev * multipliers.lData[col-1];
+
+                    // by Bayes' Theorem, Pr(P|C,P') is proportional to Pr(C|P,P') x Pr(P,P')
+                    denom += this_prob = (n_ijk(pa_temp,(long)child_state) + 1) / (n_ij(pa_temp,0) + r_i)
+                                         * (n_ij(pa_temp,0)+1) / (n_complete_cases + num_parent_combos);
+                    reassign_probs.Store (lev, 0, this_prob);
+                }
+
+
+                // re-assign parent state
+                urn = genrand_real2();  // a uniform random number within interval [0,1)
+
+                for (long lev = 0; lev < family_nlevels.lData[col]; lev++) {
+                    this_prob = reassign_probs (lev,0) / denom;
+                    //ReportWarning(_String("parent: urn, this_prob = ") & urn & "," & this_prob);
+                    if (urn < this_prob) {
+                        pa_index += lev * multipliers.lData[col-1]; // note that pa_index was decremented above
+
+                        n_ij.Store (pa_index, 0, n_ij(pa_index,0) + 1);
+                        n_ijk.Store (pa_index, (long) child_state, n_ijk(pa_index, (long) child_state) + 1);
+                        data_deep_copy.Store (row, col, lev);
+                        break;
+                    }
+
+                    urn -= this_prob;
+                }
+
+            }
+            // end if-else
+            //ReportWarning (_String ("N_ijk at step ") & missing_idx & " : " & (_String *) n_ijk.toStr() );
+        }
+        // end loop over missing values
+        vector_of_scores->Store ( K2Score(r_i, n_ij, n_ijk) );
+    }
+    // end loop over iterations
+
+    /*
+    ReportWarning (_String("Score sample: "));
+    for (long s = 0; s < vector_of_scores->GetUsed(); s++)
+    {
+        ReportWarning (_String(" ") & (* (_Matrix *)vector_of_scores) (s,0));
+    }
+    */
+
+    // compute the average of sampled log-likelihoods
+    log_score = LogSumExpo (vector_of_scores) - log(max_iterations);
+
+    DeleteObject (vector_of_scores);
+
+    ReportWarning (_String("Returning expected log score: ") & log_score);
+
+    return (log_score);
+}
+
+
+
+//___________________________________________________________________________________________
+_Parameter Bgm::K2Score (long r_i, _Matrix & n_ij, _Matrix & n_ijk)
+{
+    _Parameter log_score = 0.;
+
+    for (long j = 0; j < n_ij.GetHDim(); j++) {
+        log_score += LnGamma(r_i);  // (r-1)!
+        log_score -= LnGamma(n_ij(j, 0) + r_i); // (N+r-1)!
+
+        for (long k = 0; k < r_i; k++) {
+            log_score += LnGamma(n_ijk(j,k) + 1);   // (N_ijk)!
+        }
+    }
+
+    return log_score;
+}
+
+
+//___________________________________________________________________________________________
+//  Later we'll need to expand this function to take arbitrary alpha_ijk values.
+/*
+_Parameter Bgm::BDeScore (long r_i, _Matrix & n_ij, _Matrix & n_ijk)
+{
+    _Parameter  n_prior_ij      = prior_sample_size (node_id, 0) / num_parent_combos,
+                n_prior_ijk     = n_prior_ij / num_levels.lData[node_id],
+                log_score       = 0.;
+
+    for (long j = 0; j < num_parent_combos; j++)
+    {
+        log_score += LnGamma(n_prior_ij) - LnGamma(n_prior_ij + n_ij(j,0));
+
+        for (long k = 0; k < num_levels.lData[node_id]; k++)
+        {
+            log_score += LnGamma(n_prior_ijk + n_ijk(j,k)) - LnGamma(n_prior_ijk);
+        }
+    }
+
+    return log_score;
+}
+*/
+
+//___________________________________________________________________________________________
+//___________________________________________________________________________________________
+//___________________________________________________________________________________________
+//___________________________________________________________________________________________
+//___________________________________________________________________________________________
+#endif
+
diff --git a/src/new/include/HYNetInterface.h b/src/new/include/HYNetInterface.h
new file mode 100644
index 0000000..090da9c
--- /dev/null
+++ b/src/new/include/HYNetInterface.h
@@ -0,0 +1,40 @@
+/*
+
+    This is a file which declares NN interfacing with HBL model structures.
+
+    September 2003, Sergei L Kosakovsky Pond
+
+*/
+
+#ifndef __HYNNINTERFACE__
+#define __HYNNINTERFACE__
+
+#include "hy_strings.h"
+#include "batchlan.h"
+#include "matrix.h"
+#include "SerangNet.h"
+
+/*---------------------------------------------------------*/
+
+//class  _MatrixNN: public _SimpleList
+//{
+
+//  Net *
+//}
+
+/*---------------------------------------------------------*/
+
+
+void         TrainModelNN   (_String*, _String*);
+void         LoadModelNN    (_String*, _String*);
+_Matrix*     ComputeModel   (long);
+
+/*---------------------------------------------------------*/
+
+void         NNMatrixSampler(long, _Matrix&, _SimpleList&, _SimpleList&, _Matrix*, _List&, _List&);
+
+extern   _String            ModelTrainNNFlag,
+         ModelLoadNNFlag;
+
+
+#endif
\ No newline at end of file
diff --git a/src/new/include/SerangNet.h b/src/new/include/SerangNet.h
new file mode 100644
index 0000000..1fdbb9c
--- /dev/null
+++ b/src/new/include/SerangNet.h
@@ -0,0 +1,95 @@
+// Oliver Serang
+//
+// Net class implements a one hidden layer Neural Net with a
+// variable number of inputs, outputs, and hidden Nodes.
+//
+//
+// copyright Oliver Serang 2003
+
+// Modified to
+
+#ifndef _NET_H
+#define _NET_H
+
+#include <math.h>
+#include <stdlib.h>
+//#include <fstream.h>
+
+#include "baseobj.h"
+
+
+
+struct Node {
+    _Parameter value;
+    _Parameter*weights;
+    _Parameter*lastDelta;
+};
+
+class Net
+{
+public:
+    Net () {}
+    Net (int innum, int hiddennum, int outnum, _Parameter eps, _Parameter c, _Parameter m, int d, int t, bool v);
+    Net (int innum, int hiddennum, int outnum, _Parameter eps);
+
+
+    void learn(_Parameter*input, _Parameter*output);
+    const _Parameter* eval  (_Parameter*input);
+    const _Parameter* eval1 (_Parameter*input);
+    bool within(const _Parameter *, const _Parameter *) const;
+    bool accurate(_Parameter**input, _Parameter**output, int samp);
+    _Parameter bruteDelta;
+    void   studyAll(_Parameter**input,_Parameter**output,int samp);
+    _Parameter studyAll(_Parameter*input,_Parameter*output,int samp);
+    void destroy();
+    void randomize();
+    void init(int, int, int, _Parameter);
+    ~Net();
+    //void save(ofstream & fout);
+    //void load(ifstream & in);
+    void save(FILE*);
+    void load(FILE*);
+
+
+    int cycles,
+        timeout,
+        density;
+
+    bool verbose;
+
+    _Parameter coef,
+               mom;
+private:
+    _Parameter error();
+    Node*in;    // input nodes of the network
+    Node*hidden;    // hidden nodes of the network
+    _Parameter*out; // output of the network
+    int inNum, hiddenNum, outNum;
+    _Parameter*temp;
+    _Parameter dOdW1(int , int, int);
+    _Parameter dOdW2(int , int);
+    _Parameter sum(_Parameter*x,int p);
+    _Parameter LR;
+    _Parameter learningRate;
+    _Parameter momentum;
+    _Parameter epsilon;
+    void adjust();
+
+    inline _Parameter sigmaF(const _Parameter x) {
+        return 1./(1.+exp(-x));
+    }
+
+    inline _Parameter randReal(_Parameter magnitude) {
+        // return a real # in [-magnitude, magnitude]
+        //_Parameter x=rand()%1000;
+        //x=x-500;
+        // x is now an integer in [-500,500]
+        //x/=500;
+        // x is now a real [-1,1]
+        //x*=magnitude;
+        //return x;
+        return (genrand_int32 () - 2147483648.0) * magnitude / 2147483648.0;
+    }
+};
+
+#endif
diff --git a/src/new/include/bayesgraph.h b/src/new/include/bayesgraph.h
new file mode 100644
index 0000000..a7dfdca
--- /dev/null
+++ b/src/new/include/bayesgraph.h
@@ -0,0 +1,209 @@
+/*
+
+ HyPhy - Hypothesis Testing Using Phylogenies.
+
+ Copyright (C) 1997-2006
+ Primary Development:
+ Sergei L Kosakovsky Pond (sergeilkp at mac.com)
+ Significant contributions from:
+ Spencer V Muse (muse at stat.ncsu.edu)
+ Simon DW Frost (sdfrost at ucsd.edu)
+ Art FY Poon    (apoon at biomail.ucsd.edu)
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License
+ as published by the Free Software Foundation; either version 2
+ of the License, or (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+
+ */
+
+
+
+#include "list.h"
+#include "simplelist.h"
+#include "classes.h"
+#include "likefunc.h"
+#include "parser.h"
+#include <math.h>
+#include "matrix.h"
+#include "baseobj.h"
+#include "batchlan.h"
+// #include "HYUtils.h"
+
+
+/*SLKP 20070926; include progress report updates */
+#if !defined __UNIX__ && !defined __HEADLESS__
+#include "HYConsoleWindow.h"
+#endif
+/*SLKP*/
+
+
+#if defined __AFYP_DEVELOPMENT__ && defined __HYPHYMPI__
+#include "mpi.h"
+#endif
+
+
+
+/* 
+	Quantity to add to all entries in contingency table 
+	to avoid zeroes that would cause an error when taking
+	natural log.
+	see Fienberg and Holland (1972) J Multivar Anal 2: 127-134.
+*/
+#define     DIRICHLET_FLATTENING_CONST  0.5
+#define		MIN_SAMPLE_SIZE				5
+
+
+class _BayesianGraphicalModel : public _LikelihoodFunction
+{
+public:
+    /* constructors */
+    _BayesianGraphicalModel () { }
+    _BayesianGraphicalModel (_AssociativeList *);
+
+    /* destructor */
+    virtual ~_BayesianGraphicalModel (void);
+
+
+    /* network initialization */
+    bool            SetDataMatrix   (_Matrix *),    // via SetParameter HBL
+                    SetWeightMatrix (_Matrix *),
+                    SetConstraints    (_Matrix *),    //  "       "
+                    SetStructure  (_Matrix *),
+                    SetParameters (_AssociativeList *),
+                    SetNodeOrder  (_SimpleList *);
+
+
+    /* computation */
+    virtual _Parameter      Compute (void);	// compute likelihood of current network structure
+    _Parameter      Compute (_Matrix &),	// compute likelihood of given network structure
+                    Compute (_SimpleList &, _List *);	// compute likelihood of given node order
+                    									//	return edge marginal probabilities at pointer
+                    									
+    virtual _Matrix *       Optimize ();	// generic wrapper from HBL to different optimization methods
+    										// e.g., K2, structural MCMC, order MCMC (see next functions)
+	
+    void            GraphMetropolis (bool, long, long, long, _Parameter, _Matrix *),
+                    OrderMetropolis (bool, long, long, _Parameter, _Matrix *),
+                    K2Search (bool, long, long, _Matrix *);
+
+
+    void            CacheNodeScores (void);	// MPI enabled
+    void            MPIReceiveScores (_Matrix *, bool, long);
+    void            ReleaseCache (void);
+
+    _Parameter      ComputeDiscreteScore (long node_id),
+                    ComputeDiscreteScore (long, _Matrix &),
+                    ComputeDiscreteScore (long, _SimpleList &),
+
+                    ComputeContinuousScore (long node_id),
+                    ComputeContinuousScore (long, _Matrix &),
+                    ComputeContinuousScore (long, _SimpleList &);
+
+
+    _Parameter      ImputeDiscreteNodeScore (long, _SimpleList &),	// use Gibbs sampling to compute expectation over missing data
+    				ImputeCGNodeScore (long, _SimpleList &);		// arguments: node ID, parent ID's
+
+    void            ComputeParameters (void),	// UNDER DEVELOPMENT - and I think I ended up using HBL instead
+                    ComputeParameters (_Matrix *);
+
+
+
+
+    /* input/output */
+    void                SerializeBGM (_String &);	// export network structure and parameters to HBL
+    bool                ImportModel (_AssociativeList *),	// THIS HAS NOT BEEN WRITTEN
+                        ExportCache (_AssociativeList *),	// send node score cache to HBL as associative list
+                        ImportCache (_AssociativeList *);	// set node score cache to HBL associative list
+
+
+    /* utility */
+    void            InitMarginalVectors (_List *);
+    void            DumpMarginalVectors (_List *);
+
+    void            SerializeBGMtoMPI (_String &);	// pass network object to compute node as HBL
+
+    void            RandomizeGraph (_Matrix *, _SimpleList *, _Parameter, long, long, bool);
+    _SimpleList *   GetOrderFromGraph (_Matrix &);
+    bool            GraphObeysOrder (_Matrix &, _SimpleList &);
+
+    void            UpdateDirichletHyperparameters (long , _SimpleList &, _Matrix * , _Matrix * );
+
+    _Parameter      K2Score (long, _Matrix &, _Matrix &),
+                    BDeScore (long, _Matrix &, _Matrix &),
+                    BottcherScore (_Matrix &, _Matrix &, _Matrix &, _Matrix &, _Parameter, _Parameter, long);
+
+    long            GetNumNodes (void)  {
+        return num_nodes;
+    }
+    long            GetNumCases (void)  {
+        return theData.GetHDim();
+    }
+
+    void            GetNodeOrder (_Matrix * order);
+    void            GetStructure (_Matrix * graph);
+    void            GetConstraints (_Matrix * graph) {
+        graph = (_Matrix *) constraint_graph.makeDynamic();
+    }
+
+protected:
+
+    long            num_nodes;
+
+    /* ------------------------------------------- */
+
+    _Matrix         theData,
+                    theWeights;
+
+    _List           node_names;     // list of strings
+
+    _SimpleList     node_type,      // boolean, 0 = discrete, 1 = continuous
+                    num_levels,     // integer, if discrete, number of levels
+                    max_parents,    // integer, maximum number of parents
+                    has_missing;    // boolean, 0 = complete data, 1 = missing, (2 = latent, i.e., all missing)
+
+    _Matrix         prior_sample_size,
+                    prior_mean,         // for continuous (Gaussian) nodes
+                    prior_precision,
+                    prior_scale;
+
+    _Parameter      continuous_missing_value;       // some arbitrary value set in HBL to indicate just that
+
+    /* ------------------------------------------- */
+
+    _Matrix         theStructure;
+
+    _Matrix         constraint_graph;   // integer, 0 = no constraint, -1 = banned edge, 1 = enforced edge
+
+    _List           node_score_cache;
+    bool            scores_cached;
+
+    _SimpleList     node_order_arg;     // provides access to node ordering functionality as HBL argument
+
+    /* ------------------------------------------- */
+
+};
+
+
+
+//______________________________________________________________________________________________
+#ifdef __NEVER_DEFINED__
+class _DynamicBayesGraph : public _BayesianGraphicalModel
+{
+public:
+
+protected:
+
+};
+#endif
+
+
diff --git a/src/new/include/bgm.h b/src/new/include/bgm.h
new file mode 100644
index 0000000..088877b
--- /dev/null
+++ b/src/new/include/bgm.h
@@ -0,0 +1,226 @@
+/*
+ *  Bgm.h
+ *  HYPHY_XCode
+ *
+ *  Created by Art Poon on 2/5/07.
+ *  Copyright 2007 __MyCompanyName__. All rights reserved.
+ *
+ */
+#if not defined __AFYP_REWRITE_BGM__
+
+#include "simplelist.h"
+#include "list.h"
+#include "classes.h"
+#include "likefunc.h"
+#include "parser.h"
+#include <math.h>
+#include "matrix.h"
+#include "baseobj.h"
+#include "batchlan.h"
+// #include "HYUtils.h"
+
+
+/*SLKP 20070926; include progress report updates */
+#if !defined __UNIX__ && !defined __HEADLESS__
+#include "HYConsoleWindow.h"
+#endif
+/*SLKP*/
+
+
+#if defined __AFYP_DEVELOPMENT__ && defined __HYPHYMPI__
+#include "mpi.h"
+#endif
+
+
+#define     LOG_SCALING_FACTOR          64.
+#define     LARGE_NEGATIVE_NUMBER       -99999.0
+#define     MAX_LSE_SCALING_ATTEMPTS    4096
+
+#define     MAX_FAIL_RANDOMIZE          1000
+#define     RANDOMIZE_PROB_SWAP         0.1
+
+#define     DIRICHLET_FLATTENING_CONST  0.5
+
+
+
+
+/* ____________________________________________________________________________________________________________________________________ */
+class Bgm : public _LikelihoodFunction
+{
+public:
+    Bgm ()  {
+        /* default constructor does diddly squat */
+    }
+
+    Bgm (_AssociativeList *, _AssociativeList *);       // constructor
+
+    virtual ~Bgm (void);        // destructor
+
+    virtual _Parameter      Compute (void);         // function polymorphism, no argument returns likelihood of network
+    // specified by _Matrix object dag
+
+
+
+
+
+    virtual _Matrix *       Optimize ();    // estimate maximum posterior network via greedy hill-climbing heuristic
+
+    //virtual _Matrix *     Optimize (_SimpleList *);
+
+    virtual _PMathObj       CovarianceMatrix (_SimpleList *);   // wrapper function for MCMC, to explore posterior distribution
+
+
+
+    virtual void            SetDataMatrix (_Matrix *);
+
+    void            SetWeightMatrix (_Matrix *),
+                    SetGraphMatrix (_Matrix *),
+                    SetBanMatrix (_Matrix *),
+                    SetEnforceMatrix (_Matrix *),
+                    SetBestOrder (_SimpleList *);
+
+    _Matrix *       ExportNodeScores (void);
+    _Matrix *       ExportGraph (void);
+
+    void            SerializeBgm (_String &);
+
+    void            ImportNodeScores (_Matrix *);
+
+
+    _Parameter      ComputeDiscreteScore (long node_id),    // compute K2 or BDeu scoring metric for a discrete node in network
+                    // with discrete-valued parents, given data and prior
+                    // use BDeu if prior_sample_size > 0.
+                    ComputeDiscreteScore (long, _Matrix *),
+                    ComputeDiscreteScore (long, _SimpleList &),
+
+                    ComputeContinuousScore (long node_id),  // compute scoring metric for continuous node with both discrete
+                    // and continuous parents.
+                    ComputeContinuousScore (long, _Matrix *),
+                    ComputeContinuousScore (long, _SimpleList &, _SimpleList &);
+
+    virtual _Parameter      ImputeDiscreteScore (long, _SimpleList &);
+
+    _Parameter      GibbsApproximateDiscreteScore (long, _SimpleList &),
+                    K2Score (long, _Matrix &, _Matrix &),
+                    BDeScore (long, _Matrix &, _Matrix &);
+
+    long            GetNumNodes (void)      {
+        return num_nodes;
+    }
+    long            GetNumCases (void)      {
+        return (obsData ? obsData->GetHDim() : 0);
+    }
+    _SimpleList     GetLastOrder (void)     {
+        return last_node_order;
+    }
+
+protected:
+    _Parameter      Compute (_SimpleList*, _List*),         // return likelihood of node ordering, model averaging over all
+                    // possible networks that are consistent with the order.
+                    Compute (_Matrix *),
+                    ComputeDynamic (_SimpleList *, _List *),    // compute for DBNs
+                    ComputeDynamic2 (_SimpleList *, _List *);
+
+
+    virtual void            CacheNodeScores (void);
+    void            ReleaseNodeScores (void);
+
+    void            MPICacheNodeScores (long);
+    void            MPIReceiveScores (_Matrix *, bool, long);
+    void            CacheNetworkParameters (void);
+
+
+    void            InitComputeLists (_List *);
+    void            DumpComputeLists (_List *);
+
+
+
+    _Parameter      LnGamma (_Parameter),
+                    LogSumExpo (_GrowingVector *);
+
+    _Matrix *       RunColdChain (_SimpleList *, long, long);
+    void            RunHotChain (_SimpleList *, long, long, _Parameter);
+
+    _Matrix *       GraphMCMC (bool);
+
+    _Parameter      TryEdge (long, long, long, _Parameter);     // DEPRECATE
+
+    void            RandomizeDag (long),
+                    RandomizeGraph (_Matrix *, _SimpleList *, long, bool),
+                    PrintGraph (_Matrix *),
+                    ResetGraph (_Matrix *);
+
+    long            MarginalSum (bool, long);   // DEPRECATE
+
+    bool            IsCyclic (void);    // DEPRECATE
+
+
+
+    long            num_nodes,          // number of variables in network
+
+                    max_max_parents;    // the global maximum number of parents per node
+
+
+    _Constant   *   calc_bit;           // provides access to mathematical functionality of _Constant
+
+
+    _Matrix         dag,                // i.e. directed acyclic graph as a square adjacency matrix,
+                    // where 1 indicates presence of edge (row --> col)
+
+
+                    banned_edges,       // complements DAG, 1 entry indicates banned edge
+                    enforced_edges,
+
+                    prior_sample_size,  // prior distributions for hyperparameters
+                    prior_mean,
+                    prior_precision;
+
+
+    _SimpleList     is_discrete,        // vector containing 1 for discrete node, 0 for continuous
+
+                    num_levels,         // vector containing number of levels for discrete nodes
+
+                    max_parents,        // maximum number of parents allowed per node
+
+                    has_missing,        // data matrix for i-th node contains missing values
+
+                    last_node_order,    // store node orderings from order-MCMC
+                    best_node_order;
+
+    _List           node_scores,
+                    network_parameters;
+
+
+    _Matrix     *   obsData,            // data matrix read from file
+
+                * obsWeights;         // vector of weights corresponding to each observation in data matrix
+
+
+    bool            scores_cached;
+};
+
+
+
+/* ____________________________________________________________________________________________________________________________________ */
+
+class _DynamicBgm : public Bgm
+{
+
+public:
+    _DynamicBgm (_AssociativeList *, _AssociativeList *);
+
+    virtual ~_DynamicBgm (void)         { } // destructor
+
+    virtual void        CacheNodeScores     (void);
+    void        CollapseNodeSpace   (void);
+
+    void        CollapseDynamicGraph (void);
+private:
+
+};
+
+
+
+#endif
+
+
diff --git a/src/new/include/scfg.h b/src/new/include/scfg.h
new file mode 100644
index 0000000..a0aaab3
--- /dev/null
+++ b/src/new/include/scfg.h
@@ -0,0 +1,706 @@
+/*
+ *  scfg.h
+ *  Class definition for the stochastic context free grammar (SCFG)
+ *  and supporting classes
+ *
+ *  Created  by Art Poon on 11/18/05.
+ *  Modified to use HyPhy class hooks by Sergei L Kosakovsky Pond in June 2006
+ *
+ *
+ */
+
+#ifndef  _HY_INCLUDE_SCFG_
+
+#define  _HY_INCLUDE_SCFG_
+#define  _USE_HYPHY_HOOKS_
+// if defined, the code below will use HyPhy backend classes instead of std namespace things
+// everything inside _USE_HYPHY_HOOKS_ ifdefs is written by SLKP and needs to be checked :)
+
+#ifndef  _USE_HYPHY_HOOKS_
+#include <iostream>
+#include <fstream>
+#include <sstream>
+#include <vector>
+#include "randomc.h"
+#include "strings.h"
+
+#define     MAX_NAME_LENGTH         50
+#define     TRUE                    1
+#define     FALSE                   0
+
+using namespace std;
+#else
+#include "list.h"
+#include "simplelist.h"
+#include "avllist.h"
+#include "avllistx.h"
+#include "classes.h"
+#include "likefunc.h"
+#endif
+
+#ifdef __NEVER_DEFINED__
+
+/* ==================== */
+/*      STRUCTURES      */
+/* ==================== */
+
+struct Prob {       // inner or outer probability stored with sub-string indices
+
+    int     i;      // non-terminal index
+    int     s;      // left index in string
+    int     t;      // right index in string
+
+    double  p;      // non-zero values only
+};
+
+
+struct Production {     // identifies production rules
+    int     i, j, k, m;
+};
+
+
+struct ProductionLink {     // for linking production rule probabilities
+    int             size;
+    Production *    pvec;
+};
+
+
+struct Triplet {    // for trace-backs in CYK algorithm
+    int i1, i2, i3;
+};
+
+
+
+/* ================================================================ */
+/*  CLASS: ParseNode                                                */
+/* ---------------------------------------------------------------- */
+/*  Root node allocates memory for 95 printable ASCII characters.   */
+/*  Character not occurring in grammar corresponds to NULL.         */
+/*  Non-root nodes, push-back vector as required.                   */
+/*                                                                  */
+/*  itsIndex = terminal symbol integer (0-index)                    */
+/*  itsChar = terminal symbol                                       */
+/* ================================================================ */
+
+class ParseNode
+{
+private:
+    ParseNode *             itsParent;
+    vector <ParseNode *>    itsChildren;
+    char                    itsChar;
+    int                     itsIndex;
+
+public:
+    ParseNode() {   // for root node
+        itsParent = NULL;
+        itsChar = '\0';
+        itsIndex = -1;
+        for (int i = 0; i < 95; i++) {
+            itsChildren.push_back(NULL);
+        }
+    }
+
+    ParseNode(ParseNode * p, char c) {
+        itsParent = p;
+        itsChar = c;
+        itsIndex = -1;
+    }
+
+    // default destructor
+    ~ParseNode()    { }
+
+    // member accessor functions
+    void SetParent(ParseNode * p)   {
+        itsParent = p;
+    }
+    ParseNode * GetParent()         {
+        return itsParent;
+    }
+
+    ParseNode * AddChild(char c) {
+        ParseNode * pn = new ParseNode(this, c);
+        itsChildren.push_back(pn);
+        return pn;
+    }
+
+    ParseNode * SetChild(int i, char c) {
+        ParseNode * pn = new ParseNode(this, c);
+        itsChildren.at(i) = pn;
+        return pn;
+    }
+
+    ParseNode * GetChild(int i) {
+        return itsChildren.at(i);
+    }
+
+    void SetIndex(int i)        {
+        itsIndex = i;
+    }
+    int GetIndex()              {
+        return itsIndex;
+    }
+
+    void SetChar(char c)        {
+        itsChar = c;
+    }
+    char GetChar()              {
+        return itsChar;
+    }
+
+    int HowManyChildren()       {
+        return itsChildren.size();
+    }
+
+    ParseNode * FindChild(char c) {
+        for (int i = 0; i < itsChildren.size(); i++)
+            if (c == itsChildren.at(i)->GetChar()) {
+                return itsChildren.at(i);
+            }
+        return NULL;
+    }
+};
+
+
+#endif
+
+// SLKP 20070525: Moved _GrowingVector to matrix.h
+// and renamed it _GrowingVector
+
+
+/* ================================================================ */
+/*  CLASS: Scfg (Stochastic context-free grammar)                   */
+/* ---------------------------------------------------------------- */
+/*  Required functions:                                             */
+/*      - generate string from grammar                              */
+/*      - parse string (membership problem)                         */
+/*      - calculate inside/outside probabilities of a given string  */
+/* ================================================================ */
+
+class Scfg
+#ifdef _USE_HYPHY_HOOKS_
+    : public _LikelihoodFunction
+#endif
+{
+
+private:
+
+#ifdef _NEVER_DEFINED_
+    /* GRAMMAR SYMBOLS */
+
+    int                         numNT;      // number of non-terminal symbols
+    int                         numT;       //  "   "   terminal        "
+
+    int                         firstPreTerm;   // index of first non-terminal symbol
+    // in string of form i->m
+
+    ParseNode *                 itsParseTree;
+
+    /* PRODUCTION PROBABILITIES */
+
+    /* use symbol indices for production probability matrices   */
+    /* ijk initialized N x N x N, where N = numNT               */
+    /* im initialized N x M, where M = numT                     */
+    double *                    itsIJKProbs;    // i->jk production probabilities
+    double *                    itsIMProbs;     // i->m         "       "
+
+
+    /* STRING PROBABILITY STORAGE */
+
+    // stores whether the inside and outside probabilities for
+    // the production of sub-string (s,t) from the i-th non-terminal symbol
+    // has been evaluated;
+    // and if so whether it takes the value 0, 1, or something inbetween.
+
+    /*      character key                                       */
+    /* -------------------------------------------------------- */
+    /*                              inside                      */
+    /*  o               NA      0       1       0 < p < 1       */
+    /*  u   ----------------------------------------------      */
+    /*  t   NA          @       A       B       C               */
+    /*  s   0           D       E       F       G               */
+    /*  i   1           H       I       J       K               */
+    /*  d   0 < p < 1   L       M       N       O               */
+    /*  e   ----------------------------------------------      */
+
+
+
+    char **                     itsStringProbs;
+
+    // stores inside and outside probabilities between 0 and 1
+    vector <Prob>               itsInsideProbs;
+    vector <Prob>               itsOutsideProbs;
+
+    vector <ProductionLink>     itsLinked;
+
+    /* STRING AND CORPUS */
+
+    String *                    itsString;
+    vector <String *>           itsCorpus;
+
+    int                         lengthString;
+
+    TRandomMersenne *           pMersenne;
+
+    ifstream                    infile;
+    ofstream                    outfile;
+
+#endif
+
+#ifdef                  _USE_HYPHY_HOOKS_
+
+#endif
+
+public:
+    // general specification of grammar by string
+#ifndef                     _USE_HYPHY_HOOKS_
+    Scfg(char * grammar, int nt, int t, TRandomMersenne * pMers);
+#else
+    Scfg(_AssociativeList*, _AssociativeList *, long = 0);
+    /* SLKP:
+
+        the first  associative list defines: i->m  type terminal rules
+        the second one                     : i->jk non-terminal  rules
+        the third one                      : the index of the start NT symbol
+
+        the start symbol is assumed to be the non-terminal indexed '0'
+
+        Both arrays are assumed to have integer keys (most naturally: from 0 to the number of rules - 1)
+        Each of the lists has associative arrays as entries.
+
+        (1). Terminal rules are defined as:
+             Term_rule ["L"] = integer - left hand side non-terminal;
+             Term_rule ["T"] = "non-terminal literal";
+             Term_rule ["P"] = either empty (0) which is taken to mean that the rule is deterministic
+                             = or a string with the ID of the parameter controlling the production probability
+
+        (2). Non-terminal rules are defined as:
+             NT_rule ["L"]   = integer - left hand side non-terminal;
+             NT_rule ["1"]   = integer - first  right hand side non-terminal symbol, referred to by its index in the NT associative array;
+             NT_rule ["2"]   = integer - second right hand side non-terminal symbol, referred to by its index in the NT associative array;
+             NT_rule ["P"]   = either empty (0) which is taken to mean that the rule is deterministic
+                             = or a string with the ID of the parameter controlling the production probability
+
+
+        The constructor does the following:
+        (a). Check each rule for validity
+        (b). Check that the terminals form a proper prefix code and build a parse tree for the input; build a map of 'index' <-> 'literal'
+        (c). Verify several condition on the rules involving non-terminal symbols to check for possible grammar specification issues
+        (d). Build a list of production rules, and associated probabilities
+        (e). Compile a list of variables involved as probabilities in the production rules
+
+
+    */
+
+    virtual         ~Scfg(void); // virtual destructor because of inheritance
+
+    BaseRef             toStr                   (void); // a string representation of the SCFG
+
+    virtual void        ScanAllVariables        (void);
+    virtual _String*    GetRuleString           (long); // return a string representation of a derivation rule
+    virtual _String*    VerifyValues            (void);
+    // for a given set of parameter values, check that all probabilities are
+    // (a) in [0,1]
+    // (b) for a fixed NT 'i' the sum of all probabilities for the rules
+    //     involving the NT is 1
+    // returns nil if all is good
+
+    virtual void        RandomSampleVerify      (long);
+    // draw a number of values using LHC sampling on parameter bounds
+    // and check that they all define valid sets of probabilities
+
+    virtual void        SetStringCorpus         (_String*);
+    virtual void        SetStringCorpus         (_Matrix*);
+    // the strings to set SCFG string corpus
+    // the first one does it from a HyPhy variable identifier, which is assumed
+    // to reference either a string or a matrix of strings (it calls the second)
+    // the second one does the work; lexing the input strings and converting
+
+    virtual _Parameter          Compute                 (void);
+    // compute the derivation probability of the current corpus
+    virtual _Matrix*            Optimize                ();
+    // train the grammar using current corpus
+
+    virtual void                AddSCFGInfo             (_AssociativeList*);
+    // store various diagnostics about the grammar into the list
+
+    virtual _String*            SpawnRandomString       (long = -1, _SimpleList* = nil);
+    // generate a random string using current production probabiltities
+    // the argument is the index of a non-terminal (or -1 for the start)
+    // from which to generate a substring (called recursively)
+    // the string argument is the storage, created by the first call
+
+    virtual _String *           BestParseTree           (void);
+
+    virtual void                CykTraceback            (long,long,long,long,_AVLListX *,_SimpleList *,_GrowingVector *,_String *);
+
+#endif
+
+#ifdef _NEVER_DEFINED_
+
+    // destructor
+    ~Scfg()     { }
+
+
+    // member access functions
+    int     GetNumberNTs()                      {
+        return numNT;
+    }
+    int     GetNumberTerms()                    {
+        return numT;
+    }
+
+    void    SetFirstPT(int fpt)     {
+        firstPreTerm = fpt;
+    }
+    int     GetFirstPreTerm()       {
+        return firstPreTerm;
+    }
+
+
+    // allocate memory for production probabilities
+    void    InitIJKProbs();
+    void    InitIMProbs();
+
+
+    /* -------- PRODUCTION PROBABILITY FUNCTIONS ------------- */
+    void    SetProb(int i, int m, double prob) {
+        itsIMProbs[i*numT + m] = prob;
+    }
+
+    void    SetProb(int i, int j, int k, double prob) {
+        itsIJKProbs[i * numNT * numNT + j * numNT + k] = prob;
+    }
+
+    void    CreateProduction(int i, int m, double prob) {
+        itsIMProbs[i * numT + m] = prob;
+    }
+
+    void    CreateProduction(int i, int j, int k, double prob) {
+        itsIJKProbs[i * numNT * numNT + j * numNT + k] = prob;
+    }
+
+
+    double  GetProb(int i, int m)   {
+        return itsIMProbs[i * numT + m];
+    }
+
+    double  GetProb(int i, int j, int k) {
+        return (itsIJKProbs[i*numNT*numNT + j*numNT + k]);
+    }
+
+
+    void    LinkProductions(int nlink, int* linkArray);
+
+    /* list the production rules in this grammar */
+    void    ShowProductions(bool detFlag);
+
+
+
+    /* -------- TERMINAL PARSE TREE FUNCTIONS ---------- */
+
+    void        SetParseTree(char * terminals);
+    String *    ParseString(char * s);
+
+
+    /* -------- MEMBER STRING FUNCTIONS ------------- */
+
+    /* for non-member access to a string */
+    String *        AccessString()      {
+        return itsString;
+    }
+
+    /* start a new string */
+    void    InitiateString() {
+        itsString = new String(0, FALSE, numNT, numT);
+    }
+    void    InitiateString(int nt) {
+        itsString = new String(nt, FALSE, numNT, numT);
+    }
+
+
+    /* converts non-terminal to terminal or other non-
+        terminals symbols using production rules */
+    bool    EmitSymbol(String * theString, int s);
+
+    /* applies ResolveElement to all non-terminals in string */
+    void    GenerateRandomString(bool verbose)  {
+        GenerateRandomString(verbose, itsString);
+    }
+    void    GenerateRandomString(bool verbose, String * thisString);
+
+    void    ReadStringsFromFile(char * filename);
+
+
+
+    /* --------- CORPUS FUNCTIONS ------------------ */
+
+    /* funcitons for managing corpus (group of strings) */
+    void        AddStringToCorpus() {
+        itsCorpus.push_back(itsString);
+    }
+
+    void        AddStringToCorpus(String * string) {
+        itsCorpus.push_back(string);
+    }
+
+    String *    GetStringFromCorpus(int i)      {
+        return itsCorpus.at(i);
+    }
+
+    void    ClearCorpus()       {
+        itsCorpus.clear();
+    }
+
+    void    PrintCorpus();
+
+    int     GetCorpusSize()     {
+        return itsCorpus.size();
+    }
+
+    void    WriteCorpusToFile(char * filename);
+
+
+
+    /* -------- RANDOM NUMBER GENERATOR FUNCTIONS ---------- */
+
+    /* uniform random number generator */
+    float   Urn()           {
+        return pMersenne->Random();
+    }
+
+    /* for non-member access to the random-number generator */
+    TRandomMersenne *   AccessMersenne()    {
+        return pMersenne;
+    }
+
+
+
+    /* --------- PRODUCTION PROBABILITY FUNCTIONS ---------- */
+
+    /* calculate inside probability of sub-string */
+    double  InsideProb(String * thisString, int i, int s, int t);
+
+    /* calculate outside probability of sub-string */
+    double  OutsideProb(String * thisString, int i, int s, int t);
+
+    /* initial calculation of inside and outside probabilities */
+    void    CalculateProbs(String * stringPtr);
+
+    // initialize storage array
+    void    InitStringProbs(String * thisString);
+
+    // release allocated memory and clear stored probabilities
+    void    ReleaseEvals();
+
+    char    GetStringProb(String * thisString, int i, int s, int t);
+
+    /* returns evaluated and stored probabilities not equal to 0 or 1 */
+    double  LookUpProb(bool isInner, int i, int s, int t);
+    void    ShowProbs(bool inside);
+
+    /* print out all stored probabilities not equal to 0 or 1 */
+    void    PrintNonZeroProbs(bool inside);
+    void    PrintStringProbs(String * thisString);
+    void    PrintStringProbs(int s)     {
+        PrintStringProbs(itsCorpus.at(s));
+    }
+
+
+
+    /* --------- PARSING FUNCTIONS ------------------------ */
+
+    /* get likelihood of a string */
+    double  GetLikString(String * stringPtr);
+
+    double  GetLikCorpus();
+
+    /* train production rule probabilities given a corpus */
+    double  TrainCorpus();
+
+    void    BestParseCorpus();
+
+    void    CykFillMatrices(String *, double *, Triplet *);
+    void    CykTraceback(String *, Triplet *);
+#endif
+
+#ifdef      _USE_HYPHY_HOOKS_               // SLKP June 2006
+
+    /* SLKP SCFG data members */
+
+    _List               terminals,          // stores the list of terminal strings. Allows the map from an
+                        // internal terminal index to the actual literal
+                        // as terminals[index]
+
+                        rules,              // a list containing processed rules - lists as well, with
+                        // 2 integer entries for NT->T rules
+                        // 3 integer entries for NT->NT NT rules
+
+                        byNT3,              // a list containing a _SimpleList for each non-terminal
+                        // Each _SimpleList is a collection of NT->NT NT rules (indexed into 'rules')
+                        // which have the corresponding NT on the LHS
+
+                        byNT2,              // a list containing a _SimpleList for each non-terminal
+                        // Each _SimpleList is a collection of NT->Terminal rules (indexed into 'rules')
+                        // which have the corresponding NT on the LHS
+
+                        /* modification by AFYP on June 20, 2006 */
+                        byRightNT1,         // a list containing a _SimpleList for each non-terminal NT
+                        // Each _SimpleList is a collection of NT->NT NT rules (indexed into 'rules')
+                        // which have the corresponding NT on the RHS, appearing first
+
+                        byRightNT2,         // a list containing a _SimpleList for each non-terminal NT
+                        // Each _SimpleList is a collection of NT->NT NT rules (indexed into 'rules')
+                        // which have the corresponding NT on the RHS, appearing second
+
+                        /* -----  end mod ----- */
+
+                        corpusChar,         // a list of strings representing current string corpus
+                        corpusInt,          // the same set of strings, but converted into terminal tokens
+                        // each represented by a _SimpleList
+
+                        insideProbs,        // A list of AVL tree for each string in the corpus.
+                        // Each AVL tree indexed using s (start of the substring), t (end of the substring) and i - index of the nonterminal
+                        // and stores the inside probability of generating this substring (s,t) from non-terminal i
+                        //  -- (s,t,i) is mapped onto an integer using scfgIndexIntoAnArray (see below)
+                        //  -- if (s,t,i) is not in the tree, then the inside probability is 0
+                        //  -- if (s,t,i) is in the tree, the value associated with the key is either
+                        //      -- an index into the appropriate entry of storedInsideP (>=0); these are the only values which will be
+                        //      recomputed when rule probabilities change
+                        //      -- if < 0, then the corresponding inside probability is identically 1 for all parameter values
+
+                        insideProbsT,       // auxiliary list used by insideProbs
+                        outsideProbsT,      // auxiliary list used by outsideProbs
+
+                        outsideProbs,       // similar to InsideProbs, but used for storing outside probabilities
+
+                        storedInsideP,      // storage containers for the 0<p<1 inside probabilities
+                        storedOutsideP;     // storage containers for the 0<p<1 outside probabilities
+
+    _SimpleList         ntToTerminalMap,    // an array which maps each pair (nt, terminal) to
+                        // index of the rule nt->terminal if it exists
+                        // -1, if no such rule exists
+
+                        computeFlagsI,      // a _SimpleList treated as bit strings, and used to flag
+                        // whether a particular (s,t,i) has been computed for inside probabilities
+                        // if this list is not empty, then no computations on the current corpus have
+                        // been done yet; after the first computation this (and the next) list are
+                        // flushed
+                        // It is allocated with enought space to accomodate the longest
+                        // string
+
+                        computeFlagsO,      // same, but for outside probabilities
+
+                        firstArray,         // an NTxT array (stored as a flat vector), where (i,j)-th element is set to one iff
+                        // i-th non terminal can be used to generate a substing beginning with the j-th terminal
+                        // otherwise the element is 0 (i.e. {i} => j ....)
+
+                        lastArray,          // an NTxT array (stored as a flat vector), where (i,j)-th element is set to one iff
+                        // i-th non terminal can be used to generate a substing ending with the j-th terminal
+                        // otherwise the element is 0 (i.e. {i} => .... j)
+
+                        precursorArray,     // an NTxT array (stored as a flat vector), where (i,j)-th element is set to one iff
+                        // i-th non terminal can be used to generate an incompletely resolved substing beginning
+                        // with the j-th terminal, followed by the i-th non-terminal (i.e. {start} => ... j {i} ... )
+
+                        followArray;        // an NTxT array (stored as a flat vector), where (i,j)-th element is set to one iff
+    // i-th non terminal can be used to generate an incompletely resolved substing ending
+    // with the i-th non-terminal, followed by the j-th terminal (i.e. {start} => ... {i} j ...)
+
+    _Matrix             probabilities;      // This is a matrix array of formulae which describe production rule probabilities
+    // For deterministic rules, the formulae are set to constant 1
+    // the indexing for the rules is the same as in the 'rules' list
+
+
+    node<long>**        parseTree;          // maintains a parse tree which maps character input (ASCII) to the set of
+    // terminal characters expressed as integer indices.
+    // Each node is associated with the branch which terminates in it
+    // The 3 highest order bytes of the <long> data filed are only used for leaves,
+    // and represent the index of the terminal symbol, whilst the lowest order byte
+    // associates a character with the branch
+    // The 'root' of the parseTree is represented by the array of 256
+    // node<long>* for faster indexing
+
+    long                startSymbol,
+                        insideCalls,
+                        outsideCalls;
+
+protected:
+
+    void        ClearParseTree  (void);
+    /* SLKP: this function is used to clear the data structures holding the input parse tree */
+    void        ProcessAFormula (_FString*, _List&, _SimpleList&, _String&);
+    /* SLKP: utility function to process a probability expression */
+    bool        CheckANT        (long,long,long, _AVLListX&, long);
+    /* SLKP: utility function which checks conditions on rules involving non-terminals
+             returning true if status flags for some of the non-terminals were modified*/
+    _String*    TokenizeString  (_String&, _SimpleList&);
+    /* SLKP: convert a string (1st argument) into a series of terminal tokens (stored into the 2nd argument)
+             Returns nil if all is good, or an error string if something went wrong
+    */
+
+    void        DumpComputeStructures (void);
+    // clear all computational structures associated with a corpus
+
+    void        InitComputeStructures (void);
+    // initialize compute structures for a new corpus
+    // by populating appropriate data structures with empties
+
+    _Parameter  ComputeInsideProb     (long, long, long, long, bool);
+    // compute the inside probability for substring from s (arg1) to t (arg2) - both zero based -
+    // in corpus string j (arg3) derived from non-terminal i (arg4). The bool flag shows whether or
+    // not this is the first call into a given corpus and that computeFlagsI should be consulted
+    // during computation
+
+    _Parameter  ComputeOutsideProb    (long, long, long, long, bool, bool);
+    // compute the outside probability for substring from s (arg1) to t (arg2) - both zero based -
+    // in corpus string j (arg3) derived from non-terminal i (arg4). The FIRST bool flag shows whether or
+    // not this is the first call for outside probabilities into a given corpus and that computeFlagsO
+    // should be consulted during computation.  The SECOND bool indicates first call for inside
+    // probabilities and that computeFlagsI should be consulted.
+
+    long        indexNT_T             (long, long);
+    // index (nt, term) pairs into ntToTerminalMap
+
+    _Parameter  LookUpRuleProbability (long index) {
+        return ((_Matrix*)probabilities.RetrieveNumeric())->theData[index];
+    }
+
+#endif
+};
+
+#ifdef      _USE_HYPHY_HOOKS_               // SLKP June 2006
+
+inline  long    scfgIndexIntoAnArray            (long,long,long,long);
+/* this function indexes the triple start_substring, end_substring,non-terminal index given the string length (last argument)
+   into a linear array
+*/
+
+_SimpleList *   arrayIntoScfgIndex              (long,long);
+/* this function indexes from a linear array to the triple start_substring, end_substring, non-terminal index
+    given the string length -AFYP
+*/
+
+inline  bool    getIndexBit                             (long,long,long,long,_SimpleList&);
+inline  void    setIndexBit                             (long,long,long,long,_SimpleList&);
+/* this function indexes the triple start_substring, end_substring,non-terminal index given the string length (4th argument)
+   into a bit array stored in the last argument
+*/
+
+#endif
+
+#define    _HY_BITMASK_WIDTH_ (8*sizeof (unsigned long))
+
+struct      bitMasks {
+    unsigned long masks[_HY_BITMASK_WIDTH_];
+    bitMasks (void) {
+        unsigned long aBit = 1;
+        for (long k=0; k<_HY_BITMASK_WIDTH_; k++) {
+            masks[k] = aBit;
+            aBit = aBit << 1;
+        }
+    }
+};
+
+extern bitMasks bitMaskArray;
+
+#endif
diff --git a/src/new/scfg.cpp b/src/new/scfg.cpp
new file mode 100644
index 0000000..b63f435
--- /dev/null
+++ b/src/new/scfg.cpp
@@ -0,0 +1,2272 @@
+/*
+ *  Stochastic context free grammar classes
+ *  Sources
+ *
+ *  Created by Art Poon on 11/18/05.
+ *  Modified to work with the HyPhy API layer by Sergei L Kosakovsky Pond
+ *  June 2006
+ */
+
+#include    "scfg.h"
+
+#ifdef      _USE_HYPHY_HOOKS_
+
+#include    "math.h"
+
+_String     _HYSCFG_TERM_KEY_T  ("T"),
+            _HYSCFG_KEY_P       ("P"),
+            _HYSCFG_KEY_L       ("L"),
+            _HYSCFG_NT_KEY_1    ("1"),
+            _HYSCFG_NT_KEY_2    ("2");
+
+// _String      covariancePrecision ("COVARIANCE_PRECISION");
+
+#define     _HYSCFG_CHARACTER_MASK_  0x000000ff // used to extract the character part from the 'long' data field of the parse tree
+#define     _HYSCFG_TERMINAL_MASK_   0xffffff00 // used to extract the terminal index part from the 'long' data field of the parse tree
+#define     _HYSCFG_NT_LHS_          0x00000001 // a flag used to indicate that a given non-terminal appears on the LHS of a production rule
+#define     _HYSCFG_NT_DTERM_        0x00000002 // a flag used to indicate that a given non-terminal is on the LHS of a <NT>->Terminal production rule
+#define     _HYSCFG_NT_START_        0x00000004 // a flag used to indicate that a given non-terminal can be reached from a start symbol after some productions
+#define     _HYSCFG_NT_TERM_         0x00000008 // a flag used to indicate that a given non-terminal can be resolved to at least one terminal after some productions
+#define     _HYSCFG_UPPER_BOUND_     2147483648.// maximum indexable; constraining the maximum length of input strings 
+
+#define     SCFG_OPTIMIZATION_THRESHOLD     0.0001  // minimum difference between log-likelihood to terminate
+#define     MAX_ITERATIONS_OPTIMIZE         1000        // maximum number of times to iterate Optimize() main loop
+
+bitMasks bitMaskArray;
+
+
+_String     // various constants used in AddSCFGInfo
+_addSCFGInfoStats           ("STATISTICS"),
+                            _addSCFGInfoProductions     ("PRODUCTIONS"),
+                            _addSCFGInfoTerminals       ("TERMINALS"),
+                            _addSCFGInfoProbabilities   ("PROBABILITIES"),
+
+                            useJeffreysPrior            ("USE_JEFFREYS_PRIOR"),     // added Nov. 28, 2006 by afyp
+                            scfgOptimizationMethod      ("SCFG_OPTIMIZATION_METHOD");
+
+extern _String  scfgCorpus;
+
+
+#ifdef      __MACPROFILE__
+#include "profiler.h"
+#endif
+
+#else
+
+#define     MAX_WARNINGS        3
+#define     MAX_LINE_LEN        10000
+
+#endif
+
+/*          ================                                                        */
+/* ========| SCFG FUNCTIONS |====================================================== */
+/*          ================                                                        */
+
+#ifdef                  _USE_HYPHY_HOOKS_
+
+Scfg::Scfg  (_AssociativeList* T_Rules,  _AssociativeList* NT_Rules, long ss)
+{
+    _String         errorMessage;
+    _SimpleList     parsedFormulas;
+    // stash pointers to processed formulas here
+
+    startSymbol     = ss;
+    insideCalls     = 0;
+    outsideCalls    = 0;
+
+    // initialize the pointers
+    parseTree     = nil;
+
+    long          termRules     = T_Rules->avl.countitems(),
+                  nonTermRules  = NT_Rules->avl.countitems();
+
+    if (termRules == 0) {
+        errorMessage = "A SCFG can not be constructed from an empty set of <Nonterminal>-><Terminal> production rules";
+    } else {
+        _List         ruleProbabilities,            // an auxiliary list used to store strings describing production probabilities
+                      alreadySeenX;                 // a list of production rules that have already been added
+        // it is used to keep track of duplicate production rules
+
+        _SimpleList   foundNT,                      // an array to keep track of all 'declared' non-terminals
+                      ntFlags;                      // an array of flags of non-terminal properties
+
+        _AVLList      tempTerminals (&terminals),       // an auxiliary wrapper around the set of terminal symbols used to check for duplication
+                      alreadySeen   (&alreadySeenX);    // and a wrapper for the alreadySeen list
+
+        _AVLListX     tempNT        (&foundNT);         // and a wrapper for the set of non-terminals
+
+        // build a prefix parse tree as we go along
+        // begin by allocating memory for the root data structure
+        checkPointer (parseTree = new node<long>* [256]);
+
+        for (long it = 0; it < 256; it++) {
+            parseTree [it] = (node<long>*)nil;
+        }
+
+        for (long tc = 0; tc < termRules; tc++)
+            // check Terminal rules for consistency
+            // traverse the T_Rules AVL, which is assumed to be indexed by 0..termRules-1
+        {
+            _AssociativeList * aRule = (_AssociativeList*)T_Rules->GetByKey (tc, ASSOCIATIVE_LIST);
+            if (aRule) {
+                _FString    * literal       = (_FString*)aRule->GetByKey (_HYSCFG_TERM_KEY_T,STRING),
+                              * expression  = (_FString*)aRule->GetByKey (_HYSCFG_KEY_P, STRING);
+
+                _Constant   * lhs           = (_Constant*)aRule->GetByKey (_HYSCFG_KEY_L, NUMBER);
+
+                if (literal && lhs && literal->theString->sLength) {
+                    long index = tempTerminals.Insert (literal->theString);
+                    // insert to the list of terminals if not seen before
+                    if  (index>=0) // new terminal; added to list
+                        // now we process the terminal into the parse tree
+                    {
+                        literal->theString->nInstances++; // increase reference counter for the string object
+                        // add    the literal to the parse tree
+                        // handle the first character separately
+
+                        char        currentCharacter = literal->theString->getChar(0);
+                        node<long>* currentTreeNode  = parseTree[currentCharacter];
+
+                        bool        addedRootStub    = false;
+
+                        if (currentTreeNode == nil) {
+                            checkPointer (currentTreeNode = new node<long>);
+                            currentTreeNode->init(0);
+                            parseTree[currentCharacter] = currentTreeNode;
+                            addedRootStub = true;
+                        }
+
+                        long charP = 1;
+
+                        for  (; charP < literal->theString->sLength; charP++) {
+                            currentCharacter        = literal->theString->getChar(charP);
+
+                            long   availableNodes   = currentTreeNode->get_num_nodes (),
+                                   nodeCounter      = (availableNodes>0);
+
+                            // SLKP: 20100630 need to check for a one-character existing prefix
+
+                            if (availableNodes)
+                                for (; nodeCounter<=availableNodes; nodeCounter++) {
+                                    node <long> * tryANode = currentTreeNode->go_down (nodeCounter);
+                                    if ((tryANode->get_data () & _HYSCFG_CHARACTER_MASK_) == currentCharacter)
+                                        // can spell the 'literal' string down this branch
+                                    {
+                                        if (tryANode->get_num_nodes () == 0) // ERROR: not a prefix code; the terminal currently being added
+                                            // contains another terminal as a prefix
+                                        {
+                                            availableNodes = 0;
+                                        } else {
+                                            currentTreeNode = tryANode;
+                                        }
+                                        break;
+                                    }
+                                }
+
+                            if (availableNodes || (addedRootStub && charP == 1)) // no error set
+                                // SLKP: 20100630
+                                // looks like there was a bug here, when a partial prefix would
+                                // not simply be reused, but rather re-added to the parent node
+                            {
+                                if (availableNodes == nodeCounter)
+                                    // and no matching child node has been found
+                                {
+                                    // insert the new child
+                                    node<long> *    addANode = (node<long>*) checkPointer(new node<long>);
+                                    addANode->init ((long)currentCharacter);
+                                    currentTreeNode->add_node (*addANode);
+                                    currentTreeNode = addANode;
+                                }
+                            } else {
+                                errorMessage = _String("Terminal symbols must form a prefix code, but '") & *literal->theString & "' contains another terminal symbol as a prefix.";
+                                break;
+                            }
+                        }
+
+                        if (errorMessage.sLength == 0) { // no error set; check to see if this terminal is not a prefix of something else
+                            if (currentTreeNode->get_num_nodes () != 0) {
+                                errorMessage = _String("Terminal symbols must form a prefix code. ") & *literal->theString & " is a prefix of another terminal.";
+                            } else {
+                                currentTreeNode->init (currentTreeNode->get_data() | (index << 8));
+                            }
+                        }
+                    } else {
+                        index = -index-1;    // if this terminal has already been added, use the index
+                    }
+
+                    if (errorMessage.sLength == 0)
+                        // a valid production rule
+                    {
+                        long          nt_index  = (long)(lhs->Compute()->Value()),
+                                      avl_index = tempNT.Insert ((BaseRef)nt_index); // store the integer index of the LHS if needed
+
+                        if (avl_index<0) { // nt_index already exists; correct to positive range
+                            avl_index = -avl_index - 1;
+                        }
+
+                        // update status flags for this non-terminal
+                        tempNT.SetXtra (avl_index, tempNT.GetXtra (avl_index)|_HYSCFG_NT_LHS_|_HYSCFG_NT_DTERM_|_HYSCFG_NT_TERM_);
+
+
+                        // first ensure the rule is not a duplicate
+                        _String         ruleString = _String (nt_index) & ",[" & index & ']';
+                        long            seenMe     = alreadySeen.Insert (ruleString.makeDynamic());
+                        if (seenMe < 0) { // already seen
+                            errorMessage = _String ("Duplicate production rule:" ) & GetRuleString (-seenMe-1);
+                        } else {
+                            // create a new record for the rule of the form [nt index] -> [t index]
+                            _SimpleList *goodTRule = (_SimpleList*) checkPointer (new _SimpleList ((long)nt_index));
+                            (*goodTRule) << index;
+                            rules.AppendNewInstance (goodTRule); // append the new rule to the list of existing rules
+
+                            // process the formula
+                            ProcessAFormula (expression, ruleProbabilities, parsedFormulas, errorMessage);
+                        }
+
+                        if (errorMessage.sLength == 0) {
+                            continue;    // good rule! go on to check the next one
+                        }
+                    }
+                } else {
+                    errorMessage = _String("Each terminal rule must have a non-empty target terminal and a left-hand side non-terminal. Rule ") & tc & " did not comply.";
+                }
+            } else {
+                errorMessage = _String("Each rule must be specified as an associative array, but rule ") & tc & " was not.";
+            }
+            break;
+        } // done checking terminal rules
+
+        if (errorMessage.sLength == 0) { // all terminal rules were good; now we can check the non-terminal rules
+            for (long tc = 0; tc < nonTermRules; tc++)
+                // check Non-terminal rules for consistency
+                // traverse the NT_Rules AVL, which is assumed to be indexed by 0..nonTermRules-1
+            {
+                _AssociativeList * aRule = (_AssociativeList*)NT_Rules->GetByKey (tc, ASSOCIATIVE_LIST);
+                if (aRule) {
+                    _FString    * expression    = (_FString*)aRule->GetByKey     (_HYSCFG_KEY_P, STRING);
+
+                    _Constant   * lhs           = (_Constant*)aRule->GetByKey    (_HYSCFG_KEY_L, NUMBER),
+                                  * rhs1            = (_Constant*)aRule->GetByKey    (_HYSCFG_NT_KEY_1, NUMBER),
+                                    * rhs2           = (_Constant*)aRule->GetByKey    (_HYSCFG_NT_KEY_2, NUMBER);
+
+                    if (lhs && rhs1 && rhs2) {
+                        ProcessAFormula (expression, ruleProbabilities, parsedFormulas, errorMessage);
+                        if (errorMessage.sLength == 0) {
+                            _SimpleList goodNTRule;
+                            long          nt_index = (long)(lhs->Compute()->Value());
+                            long avl_index = tempNT.Insert ((BaseRef)nt_index); // store the integer index of the LHS if needed
+                            if (avl_index<0) {
+                                avl_index = -avl_index - 1;
+                            }
+                            tempNT.SetXtra (avl_index, tempNT.GetXtra (avl_index)|_HYSCFG_NT_LHS_); // update status flags for this non-terminal
+                            _String     ruleString = _String (nt_index) & ',';
+                            goodNTRule << nt_index;
+                            nt_index    = (long)(rhs1->Compute()->Value());
+                            tempNT.Insert ((BaseRef)nt_index);
+                            goodNTRule << nt_index;
+                            ruleString = ruleString & _String (nt_index) & ',';
+                            nt_index    = (long)(rhs2->Compute()->Value());
+                            tempNT.Insert ((BaseRef)nt_index);
+                            goodNTRule << nt_index;
+                            ruleString = ruleString & _String (nt_index);
+                            long            seenMe     = alreadySeen.Insert (ruleString.makeDynamic());
+                            if (seenMe < 0) { // already seen
+                                //errorMessage = _String ("Duplicate production rule:" ) & GetRuleString (-seenMe-1);
+                                errorMessage = _String ("Duplicate production rule: ") & tc & " : " & ruleString;
+                            } else {
+                                rules     && & goodNTRule; // append the new rule to the list of existing rules
+                                continue;
+                            }
+                        }
+                    } else {
+                        errorMessage = _String("Each non-terminal rule must have two right-hand side non-terminals and a left-hand side non-terminal. Rule ") & tc & " did not comply.";
+                    }
+                } else {
+                    errorMessage = _String("Each rule must be specified as an associative array, but rule ") & tc & " was not.";
+                }
+                break;
+            }
+        }
+
+        if (errorMessage.sLength == 0) { // all rules were good; next steps:
+            // (a). Validate the grammar
+            // (1).   Each non-terminal must appear in at least one LHS
+            // (2).   Each non-terminal must be resolvable to a terminal at some point
+            // (3).   Each non-terminal must be reachable from the start symbol
+
+            ntToTerminalMap.Populate (rules.lLength*terminals.lLength,-1,0);
+
+            bool         continueLoops = true;
+
+            // prepopulate the list of rules stratified by the LHS non-terminal by empty lists
+            for (long ntC = 0; ntC < foundNT.lLength; ntC ++) {
+                _SimpleList emptyList;
+                byNT3 && & emptyList;
+                byNT2 && & emptyList;
+
+                byRightNT1 && & emptyList;  // addition by AFYP, 2006-06-20
+                byRightNT2 && & emptyList;
+            }
+
+            for (long ruleIdx = 0; ruleIdx < rules.lLength; ruleIdx ++) {
+                _SimpleList *aList = (_SimpleList*)rules(ruleIdx);      // retrieve two- or three-integer list
+                if (aList->lLength == 3) { // NT->NT NT
+                    *((_SimpleList*)byNT3 (aList->lData[0])) << ruleIdx;
+                    /* addition by AFYP, 2006-06-20 */
+                    *((_SimpleList*)byRightNT1 (aList->lData[1])) << ruleIdx;
+                    *((_SimpleList*)byRightNT2 (aList->lData[2])) << ruleIdx;
+                    /* ---------- end add --------- */
+                } else {
+                    *((_SimpleList*)byNT2 (aList->lData[0])) << ruleIdx;
+                    ntToTerminalMap.lData [indexNT_T (aList->lData[0],aList->lData[1])] = ruleIdx;
+                }
+
+            }
+
+            while (continueLoops) { // set status flags for all NT symbols based on production rules
+                continueLoops = false;
+                for (long ruleIdx = 0; ruleIdx < rules.lLength; ruleIdx ++) {
+                    _SimpleList *aList = (_SimpleList*)rules(ruleIdx);
+                    if (aList->lLength == 3) { // NT->NT NT
+                        continueLoops = continueLoops || CheckANT (aList->lData[0],aList->lData[1],aList->lData[2], tempNT, startSymbol);
+                    }
+                }
+            }
+
+
+            // now iterate over the list of declared NT and verify that they all comply to the three conditions above
+            {
+                for (long ntC = 0; ntC < foundNT.lLength; ntC ++) {
+                    long ntFlag = tempNT.GetXtra (ntC);
+                    if ((ntFlag & _HYSCFG_NT_LHS_) == 0) {
+                        errorMessage = _String ("Non-terminal symbol ") & foundNT.lData[ntC] & " does not appear on the left-hand side of any production rules.";
+                        break;
+                    }
+                    if ((ntFlag & _HYSCFG_NT_START_) == 0) {
+                        errorMessage = _String ("Non-terminal symbol ") & foundNT.lData[ntC] & " can not be derived from the start symbol.";
+                        break;
+                    }
+                    if ((ntFlag & _HYSCFG_NT_TERM_) == 0) {
+                        errorMessage = _String ("Non-terminal symbol ") & foundNT.lData[ntC] & " can not be used to derive any terminal symbols.";
+                        break;
+                    }
+                }
+            }
+
+            if (errorMessage.sLength == 0) // all non-terminals checked out
+                // populate the matrix of formulas
+            {
+                CreateMatrix (&probabilities, parsedFormulas.lLength, 1, false, true, false);
+                probabilities.Convert2Formulas ();
+                for (long formC = 0; formC < parsedFormulas.lLength; formC++) {
+                    probabilities.StoreFormula (formC,0,* ((_Formula**)parsedFormulas.lData)[formC]);
+                }
+
+                long countT  = terminals.lLength,
+                     countNT = byNT2.lLength;
+
+                // populate firstArray
+                firstArray.Populate (countNT*countT,0,0);
+                lastArray.Populate (countNT*countT,0,0);
+                precursorArray.Populate (countNT*countT,0,0);
+                followArray.Populate (countNT*countT,0,0);
+
+                for (long i = 0; i < countNT; i++) {
+                    _SimpleList * myRules = ((_SimpleList**)byNT2.lData)[i];
+                    for (long i2 = 0; i2 < myRules->lLength; i2++) {    // for all i->m productions
+                        long flatIndex = indexNT_T (i,((_List**)rules.lData)[myRules->lData[i2]]->lData[1]);
+                        firstArray.lData[flatIndex] = 1;
+                        lastArray.lData [flatIndex] = 1;
+                    }
+                }
+
+                continueLoops = true;
+                while (continueLoops) {
+                    continueLoops = false;
+                    for (long i = 0; i < countNT; i++) {
+                        _SimpleList * myRules = ((_SimpleList**)byNT3.lData)[i];
+                        for (long i2 = 0; i2 < myRules->lLength; i2++) {
+                            long rhs1 = ((_List**)rules.lData)[myRules->lData[i2]]->lData[1],
+                                 rhs2 = ((_List**)rules.lData)[myRules->lData[i2]]->lData[2];
+
+                            for (long i3 = 0; i3 < countT; i3++) {
+                                long anIndex = indexNT_T (i,i3),
+                                     rhs1v = firstArray.lData[indexNT_T (rhs1,i3)],
+                                     lhs1v = firstArray.lData[anIndex],
+                                     rhs2v = lastArray.lData [indexNT_T (rhs2,i3)],
+                                     lhs2v = lastArray.lData [anIndex];
+
+                                if (lhs1v == 0 && rhs1v) {
+                                    continueLoops = true;
+                                    firstArray.lData[anIndex] = 1;
+                                }
+                                if (lhs2v == 0 && rhs2v) {
+                                    continueLoops = true;
+                                    lastArray.lData[anIndex] = 1;
+                                }
+                            }
+                        }
+                    }
+                }
+                {
+                    for (long i = 0; i < countNT; i++) { // initialize Precursor and Follow
+                        _SimpleList * myRules = ((_SimpleList**)byNT3.lData)[i];
+                        for (long i2 = 0; i2 < myRules->lLength; i2++) {
+                            long rhs1 = ((_List**)rules.lData)[myRules->lData[i2]]->lData[1],
+                                 rhs2 = ((_List**)rules.lData)[myRules->lData[i2]]->lData[2];
+
+                            for (long i3 = 0; i3 < countT; i3++) {
+                                long idx1 = indexNT_T (rhs1,i3),
+                                     idx2 = indexNT_T (rhs2,i3);
+
+                                if (lastArray.lData [idx1]) {
+                                    precursorArray.lData[idx2] = 1;
+                                }
+                                if (firstArray.lData[idx2]) {
+                                    followArray.lData[idx1]    = 1;
+                                }
+                            }
+                        }
+                    }
+                }
+
+                continueLoops = true;
+                while (continueLoops) { // populate Precursor and Follow
+                    continueLoops = false;
+                    for (long i = 0; i < countNT; i++) {
+                        _SimpleList * myRules = ((_SimpleList**)byNT3.lData)[i];
+                        for (long i2 = 0; i2 < myRules->lLength; i2++) {
+                            long rhs1 = ((_List**)rules.lData)[myRules->lData[i2]]->lData[1],
+                                 rhs2 = ((_List**)rules.lData)[myRules->lData[i2]]->lData[2];
+
+                            for (long i3 = 0; i3 < countT; i3++) {
+                                long anIndex = indexNT_T (i,i3),
+                                     idx1    = indexNT_T (rhs1,i3),
+                                     idx2    = indexNT_T (rhs2,i3),
+                                     rhs1v   = precursorArray.lData[idx1],
+                                     rhs2v   = followArray.lData   [idx2],
+                                     lhs1v   = precursorArray.lData[anIndex],
+                                     lhs2v   = followArray.lData   [anIndex];
+
+                                if (lhs1v && rhs1v == 0) {
+                                    continueLoops = true;
+                                    precursorArray.lData[idx1] = 1;
+                                }
+                                if (lhs2v && rhs2v == 0) {
+                                    continueLoops = true;
+                                    followArray.lData[idx2] = 1;
+                                }
+                            }
+                        }
+                    }
+                }
+                /*
+                for (long i = 0; i < countNT; i++)
+                {
+                    for (long i2 = 0; i2 < countT; i2++)
+                    {
+                        char buf [255];
+                        snprintf (buf, sizeof(buf), "%d=>%d %s %s %s %s\n", i, i2, firstArray.lData[indexNT_T (i,i2)]?"Yes":"No ",
+                                                                lastArray.lData[indexNT_T (i,i2)]?"Yes":"No ",
+                                                                precursorArray.lData[indexNT_T (i,i2)]?"Yes":"No ",
+                                                                followArray.lData[indexNT_T (i,i2)]?"Yes":"No ");
+                        BufferToConsole (buf);
+                    }
+                }
+                */
+            }
+        }
+    }
+
+    for (long clearFormulas = 0; clearFormulas < parsedFormulas.lLength; clearFormulas++)
+        // clean up memory from parsed probability formulas
+    {
+        delete ((_Formula**)parsedFormulas.lData)[clearFormulas];
+    }
+
+    if (errorMessage.sLength) {
+        WarnError      (errorMessage);
+        ClearParseTree ();
+    } else {
+        ScanAllVariables   ();
+        // RandomSampleVerify (100);
+        /* temporarily removed this for node censoring (degenerate grammar) -- AFYP, August 30, 2006 */
+    }
+
+}
+
+/*--------------------------------------------------------------------------------------------------------------------------------*/
+
+void        Scfg::ClearParseTree    (void)
+{
+    if (parseTree) {
+        for (long pt = 0; pt < 256; pt++) {
+            node<long>* aNode = parseTree [pt];
+            if (aNode) {
+                aNode->delete_tree ();
+                delete (aNode);
+            }
+        }
+        delete [] parseTree;
+        parseTree = nil;
+    }
+}
+
+/*--------------------------------------------------------------------------------------------------------------------------------*/
+
+long        Scfg::indexNT_T (long nt, long t)
+{
+    return nt*terminals.lLength+t;
+}
+
+/*--------------------------------------------------------------------------------------------------------------------------------*/
+
+void    Scfg::ProcessAFormula  (_FString* expression, _List & ruleProbabilities, _SimpleList& parsedFormulas, _String& errorMessage)
+{
+    _Formula *aFormula ;
+    if (expression) { // probabilistic rule
+        checkPointer (aFormula = new _Formula);
+
+        _String  anExpression = *expression->theString;
+
+        _Formula lhs;
+        _FormulaParsingContext fpc;
+
+        if (Parse   (aFormula, anExpression, fpc, &lhs) != HY_FORMULA_EXPRESSION) { // not a valid expression
+            errorMessage = _String ("Invalid probability expression: ") & expression->theString;
+        } else {
+            ruleProbabilities << expression->theString;
+        }
+    } else { // determininstic rule (prob = 1.0)
+        checkPointer (aFormula = new _Formula (new _Constant (1.0), false)); // constant 1.0
+        ruleProbabilities && & _HYSCFG_NT_KEY_1;
+    }
+
+    if (errorMessage.sLength == 0) {
+        parsedFormulas << (long)aFormula;
+    }
+}
+
+/*--------------------------------------------------------------------------------------------------------------------------------*/
+
+bool    Scfg::CheckANT  (long lhs, long rhs1, long rhs2, _AVLListX& tempNT, long startSymbol)
+{
+    long avl_index1 = tempNT.Find ((BaseRef)lhs),
+         avl_index2 = tempNT.Find ((BaseRef)rhs1),
+         avl_index3 = tempNT.Find ((BaseRef)rhs2),
+         old_flag1  = tempNT.GetXtra (avl_index1),
+         new_flag1  = old_flag1,
+         old_flag2  = tempNT.GetXtra (avl_index2),
+         new_flag2  = old_flag2,
+         old_flag3  = tempNT.GetXtra (avl_index3),
+         new_flag3  = old_flag3;
+
+    if  (lhs == startSymbol || (old_flag1 & _HYSCFG_NT_START_)) {
+        new_flag1 |= _HYSCFG_NT_START_;
+        new_flag2 |= _HYSCFG_NT_START_;
+        new_flag3 |= _HYSCFG_NT_START_;
+    }
+
+    if  ((old_flag2&_HYSCFG_NT_TERM_) || (old_flag3&_HYSCFG_NT_TERM_)) {
+        new_flag1 |= _HYSCFG_NT_TERM_;
+    }
+
+    tempNT.SetXtra (avl_index1, new_flag1);
+    if (rhs1 != lhs) {
+        tempNT.SetXtra (avl_index2, new_flag2);
+    }
+    if (rhs2 != lhs && rhs2 != rhs1) {
+        tempNT.SetXtra (avl_index3, new_flag3);
+    }
+
+    return (old_flag1!=new_flag1 || old_flag2!=new_flag2 || old_flag3!=new_flag3);
+}
+
+/*--------------------------------------------------------------------------------------------------------------------------------*/
+
+void    Scfg::ScanAllVariables  (void)
+{
+    GetIndependentVars().Clear();
+    GetDependentVars().Clear();
+    GetCategoryVars().Clear();
+
+    _SimpleList allVariables;
+    _AVLList    scannerList(&allVariables);
+
+    for (long formCount = 0; formCount < probabilities.GetHDim(); formCount++) {
+        probabilities.GetFormula (formCount,0)->ScanFForVariables(scannerList,true,false,true,true);
+    }
+
+    scannerList.ReorderList(); // sort all scanned variables
+
+    for (long varID = 0; varID < allVariables.lLength; varID++) {
+        _Variable * aParameter = LocateVar (allVariables.lData[varID]);
+        if (aParameter->IsCategory()) {
+            GetCategoryVars() << allVariables.lData[varID];
+        } else if (aParameter->IsIndependent()) {
+            GetIndependentVars() << allVariables.lData[varID];
+        } else {
+            GetDependentVars() << allVariables.lData[varID];
+        }
+    }
+}
+
+/*--------------------------------------------------------------------------------------------------------------------------------*/
+
+_String*    Scfg::VerifyValues  (void)
+{
+    _Matrix * probValues = (_Matrix*)probabilities.Compute(); // initialize all the probability values
+    for (long k=0; k<rules.lLength; k++) { // check that all probabilities are in [0,1]
+        _Parameter  aValue = (*probValues)(k,0);
+        /*
+        _SimpleList *   r = (_SimpleList*)rules(k);
+        char buf [256];
+        if (r->lLength==2)
+        {
+            snprintf (buf, sizeof(buf), "rule %d [%d->%d] Pr %f\n", k,r->lData[0],r->lData[1],aValue);
+        } else {
+            snprintf (buf, sizeof(buf), "rule %d [%d->%d,%d] Pr %f\n", k,r->lData[0],r->lData[1],r->lData[2],aValue);
+        }
+        BufferToConsole(buf);
+        */
+        if (aValue < 0.0 || aValue > 1.0) {
+            return (_String*)(_String ("Probability value for rule ") & _String (GetRuleString (k)) & " is not within [0,1]: " & aValue).makeDynamic();
+        }
+    }
+
+    // now check that for each non-terminal, the sum of all probabilities is 1
+    {
+        for (long k=0; k<byNT2.lLength; k++) {
+            _Parameter    p_sum = 0.0;
+            _SimpleList * l2 = (_SimpleList*)byNT2(k),
+                          * l3 = (_SimpleList*)byNT3(k);
+
+            for (long r = 0; r < l2->lLength ; r++) {
+                p_sum += (*probValues)(l2->lData[r],0);
+            }
+
+            {
+                for (long r = 0; r < l3->lLength ; r++) {
+                    p_sum += (*probValues)(l3->lData[r],0);
+                }
+            }
+
+            if (!CheckEqual (p_sum, 1.0)) { // check within reasonable system precision
+                return (_String*)(_String ("Probability values for non-terminal ") & (k+1) & " do not appear to add up to one: " & p_sum).makeDynamic();
+            }
+        }
+    }
+
+    return nil;
+}
+
+/*--------------------------------------------------------------------------------------------------------------------------------*/
+
+void    Scfg::RandomSampleVerify  (long samples)
+{
+    if (samples>0) {
+        _String *   errMsg     = nil;
+        long        paramCount = GetIndependentVars().lLength;
+        _Parameter  stepFactor = 1./samples;
+
+        if (paramCount > 0) { // some adjustable parameters
+            _Matrix parameterBounds (paramCount,3,false,true); // used to store the lower parameter bound
+            // the sampling step
+            // and the current value
+            for (long var = 0; var < paramCount; var++) {
+                _Variable * aVar = LocateVar (GetIndependentVars()(var));
+                parameterBounds.Store (var,0,aVar->GetLowerBound());
+                parameterBounds.Store (var,1,(aVar->GetUpperBound()-parameterBounds(var,0))*stepFactor);
+                parameterBounds.Store (var,2,aVar->Compute()->Value());
+            }
+
+            _SimpleList zeroThruNm1 (samples-1,0,1);
+
+            for (long it = 0; it < samples; it = it+1) {
+                zeroThruNm1.Permute (1);
+                for (long var = 0; var < paramCount; var++) {
+                    SetIthIndependent (var, parameterBounds(var,0) + parameterBounds(var,1) * zeroThruNm1.lData[var]);
+                }
+
+                if ((errMsg=VerifyValues ())) {
+                    char buf [256];
+                    snprintf (buf, sizeof(buf), "Breaking from RandomSampleVerify() on iteration %ld of %ld", it, samples);
+                    BufferToConsole(buf);
+
+                    break;
+                }
+            }
+            {
+                for (long var = 0; var < paramCount; var++) { // restore initial parameter values
+                    SetIthIndependent (var,parameterBounds(var,2));
+                }
+            }
+        } else { // check fixed values
+            errMsg = VerifyValues ();
+        }
+
+        if (errMsg) {
+            WarnError (_String(errMsg));
+        }
+    }
+}
+
+/*--------------------------------------------------------------------------------------------------------------------------------*/
+
+void    Scfg::SetStringCorpus  (_String* varID)
+{
+
+
+    _PMathObj    theMatrix  = FetchObjectFromVariableByType (varID, MATRIX),
+                 theString  = nil;
+
+    if (!theMatrix) {   // if the variable is not a matrix, then try treating it as a string
+        theString = FetchObjectFromVariableByType (varID, STRING);
+    }
+
+    if (theMatrix && ((_Matrix*)theMatrix)->IsAStringMatrix ()) {
+        SetStringCorpus ((_Matrix*)theMatrix);
+        return;
+    } else if (theString) {
+        _List t;
+        t << ((_FString*)theString)->theString;
+#ifdef _NEVER_DEFINED_
+        char buf [255];     // DEBUG
+        snprintf (buf, sizeof(buf), "\nSetStringCorpus() string = %s\n", (const char *) *((_FString*)theString)->theString);
+        BufferToConsole (buf);
+#endif
+        _Matrix wrapper (t);
+        SetStringCorpus (&wrapper);
+        return;
+    }
+
+    _String    errMsg = *varID & " must refer either to a matrix of strings or to a single string when setting the corpus for a SCFG.";
+    WarnError (errMsg);
+}
+
+/*--------------------------------------------------------------------------------------------------------------------------------*/
+
+void    Scfg::SetStringCorpus  (_Matrix* stringMatrix)
+{
+    corpusChar.Clear();
+    corpusInt.Clear();
+    DumpComputeStructures ();
+
+    for (long stringRow = 0; stringRow < stringMatrix->GetHDim(); stringRow++) {
+        for (long stringColumn = 0; stringColumn < stringMatrix->GetVDim(); stringColumn++) {
+            _FString    * aString   = (_FString *)stringMatrix->GetFormula (stringRow,stringColumn)->Compute();
+            _SimpleList * tokenized = new _SimpleList;
+            checkPointer (tokenized);
+            _String      * errMsg   = TokenizeString (*aString->theString, *tokenized);
+            if (errMsg) {
+                WarnError (_String(errMsg));
+                return;
+            }
+            corpusChar << aString->theString;
+            corpusInt  << tokenized;
+
+            /*for (long nt=0; nt < byNT2.lLength; nt++)
+                for (long start = 0; start < aString->theString->sLength; start++)
+                    for (long end = start; end < aString->theString->sLength; end++)
+                    {
+                        char buf [255];
+                        snprintf (buf, sizeof(buf), "%2d %2d %2d => %4d\n", start, end, nt, scfgIndexIntoAnArray (start,end,nt,aString->theString->sLength));
+                        BufferToConsole (buf);
+                    }*/
+            DeleteObject (tokenized);
+        }
+
+    }
+    /*
+    char buf [255];
+    for (long c = 0; c < corpusChar.lLength; c++)
+    {
+        snprintf (buf, sizeof(buf), "string %d in corpusChar = %s\n", c, (const char *) *((_String *) corpusChar.lData[c]));
+        BufferToConsole (buf);
+    }
+    */
+    InitComputeStructures();
+}
+
+/*--------------------------------------------------------------------------------------------------------------------------------*/
+_String*    Scfg::TokenizeString    (_String& inString, _SimpleList& outTokens)
+{
+    if (inString.sLength == 0) {
+        return new _String ("Empty strings are not allowed as SCFG input.");
+    }
+
+    // check to see if the string is too long
+
+    if ((inString.sLength+1.0)*inString.sLength*0.5*byNT3.lLength > _HYSCFG_UPPER_BOUND_) {
+        return new _String ("The input string is too long.");
+    }
+
+
+    node<long>* currentTreeNode = nil; // used to keep track of where we are in the tree
+    long        stringIndex     = 0;
+
+    for (; stringIndex < inString.sLength; stringIndex++) {
+        char currentChar  = inString.getChar (stringIndex);
+        if (currentTreeNode == nil) { // root of the tree
+            if   (!(currentTreeNode = parseTree[currentChar])) {
+                break;
+            }
+        } else {
+            long child = 1,
+                 upTo  = currentTreeNode->get_num_nodes();
+
+            for (; child <= upTo; child++)
+                if ((currentTreeNode->go_down(child)->get_data() & _HYSCFG_CHARACTER_MASK_) == currentChar) {
+                    currentTreeNode = currentTreeNode->go_down(child);
+                    break;
+                }
+            if (child == upTo) {
+                break;
+            }
+        }
+
+        if (currentTreeNode->get_num_nodes() == 0) { // at the leaf; emit a token
+            outTokens << ((currentTreeNode->get_data()&_HYSCFG_TERMINAL_MASK_) >> 8);
+            currentTreeNode = nil; // reset to the root
+        }
+    }
+
+    // check error conditions
+    if (currentTreeNode) { // stuck in the middle of the tree
+        return new _String ("Premature string end: incomplete terminal");
+    }
+
+    if (stringIndex < inString.sLength)
+        return new _String (_String("Invalid terminal symbol in the input string between '") & inString.Cut (stringIndex-10, stringIndex-1) & "' and '"
+                            & inString.Cut (stringIndex, stringIndex+10) & "'.");
+
+    return nil;
+}
+
+/*--------------------------------------------------------------------------------------------------------------------------------*/
+
+Scfg::~Scfg  (void)
+{
+    ClearParseTree ();
+}
+
+/*--------------------------------------------------------------------------------------------------------------------------------*/
+
+_String *   Scfg::GetRuleString (long ruleIdx)
+{
+    if (ruleIdx < 0 || ruleIdx >= rules.lLength) {
+        return new _String;
+    }
+
+    _String * result = new _String (64L, true);
+    _SimpleList * aRule = (_SimpleList*) rules (ruleIdx);
+    _String     * temp  = (_String*)probabilities.GetFormula (ruleIdx,0)->toStr();
+
+    (*result) << "{";
+    (*result) << _String(aRule->lData[0]);
+    (*result) << "}->";
+    if (aRule->lLength == 2) { // NT->T
+        (*result) << "\"";
+        (*result) << *(_String*)terminals(aRule->lData[1]);
+        (*result) << "\" : ";
+    } else {
+        (*result) << "{";
+        (*result) << _String(aRule->lData[1]);
+        (*result) << "}{";
+        (*result) << _String(aRule->lData[2]);
+        (*result) << "} : ";
+    }
+
+    (*result) << temp;
+    DeleteObject (temp);
+    result->Finalize ();
+    return result;
+}
+
+/*--------------------------------------------------------------------------------------------------------------------------------*/
+
+BaseRef     Scfg::toStr  (void)
+{
+    _String * result = new _String (128L, true); // allocate a buffer with the initial length of 128 characters
+
+    for (long i = 0; i < rules.lLength; i++) {
+        (*result) << new _String (GetRuleString(i));
+        (*result) << "\n";
+    }
+
+    result->Finalize ();
+    return result;
+}
+
+/*--------------------------------------------------------------------------------------------------------------------------------*/
+
+void        Scfg::DumpComputeStructures (void)
+{
+    insideProbs.Clear       ();
+    insideProbsT.Clear      ();
+    outsideProbs.Clear      ();
+    outsideProbsT.Clear     ();
+    storedInsideP.Clear     ();
+    storedOutsideP.Clear    ();
+    computeFlagsI.Clear     ();
+    computeFlagsO.Clear     ();
+}
+
+/*--------------------------------------------------------------------------------------------------------------------------------*/
+
+_Parameter      Scfg::Compute (void)
+{
+#ifdef      __MACPROFILE__
+    ProfilerInit(collectDetailed,bestTimeBase,1000,500);
+#endif
+
+    bool first = computeFlagsI.lLength;
+
+    _Parameter  res = 0.0,
+                ip,
+                useJP;
+
+    checkParameter (useJeffreysPrior, useJP, 0.0);
+
+    // update the probability matrix
+    probabilities.Compute ();
+
+
+    for (long stringID = 0; stringID < corpusChar.lLength; stringID++) {
+        // assuming that production probabilities have changed since last Compute(),
+        // retain 0 and 1's but clear buffer of stored 0<Pr<1 values.
+        _Matrix * cachedProbs = (_Matrix*)(storedInsideP(stringID));
+        for (long cid = 0; cid < cachedProbs->GetHDim(); cid++) { // reset 0,1 values to -1
+            cachedProbs->Store (cid,0,-1.);
+        }
+
+        /*
+        snprintf (buf, sizeof(buf), "\nComputing inside prob for string: %s\n", (const char *) *(_String *)corpusChar(stringID));
+        BufferToConsole (buf);
+        snprintf (buf, sizeof(buf), "\tstart symbol = %d\n\tfirst = %d\n", startSymbol, first);
+        BufferToConsole (buf);
+        */
+
+        _Parameter  temp = ComputeInsideProb (0,((_String*)corpusChar(stringID))->sLength-1,stringID,startSymbol, first);
+        if (temp == 0.) {
+            ReportWarning (_String("Underflow detected for string ") & stringID & ". Spiking optimizer to avoid this region of parameter space.");
+            return (-A_LARGE_NUMBER);
+        }
+
+        ip = log (temp);
+        // ip = log( ComputeInsideProb (0,((_String*)corpusChar(stringID))->sLength-1,stringID,startSymbol, first) );
+        // note log-transformation
+
+        res += ip;
+        if (first) { // reset the big strings
+            computeFlagsI.Populate (computeFlagsI.lLength,0,0);
+            // computeFlagsO.Populate (computeFlagsO.lLength,0,0);
+        }
+    }
+
+    if (first) {
+        computeFlagsI.Clear();
+        // computeFlagsO.Clear();
+    }
+
+    /*char buf [256];
+    snprintf (buf, sizeof(buf), "Compute() total inside calls = %d\n", insideCalls);
+    BufferToConsole(buf);*/
+
+    insideCalls = 0;    // reset counter
+
+#ifdef      __MACPROFILE__
+    ProfilerDump("\pSCFG Profile");
+    ProfilerTerm();
+#endif
+
+
+#ifdef __NEVER_DEFINED__
+    if (useJP >= 1.0) { // using Jeffrey's prior (the square root of the determinant of Fisher's information matrix)
+        setParameter(useJeffreysPrior, 0.0);        // Compute() is called by CovarianceMatrix(), prevent infinite loop
+
+
+        _Matrix *   fisherinfo  = (_Matrix *) _LikelihoodFunction::CovarianceMatrix (nil, FALSE);
+        // returns the Hessian matrix
+        // i.e. square matrix of second partial derivatives of log-likelihood, obtained from Compute().
+        // This is the empirical Fisher information matrix.
+        // Matrix must be non-negative definite, i.e. all eigenvalues are positive.
+        // The determinant of the matrix is the product of eigenvalues.
+
+
+        // need to remove rows and columns from Fisher's information matrix
+        _Matrix     fi (fisherinfo->GetHDim()-1, fisherinfo->GetVDim()-1, false, true);
+
+        for (long i = 0; i < fisherinfo->GetHDim() - 1; i++) {  // display matrix
+            for (long j = 0; j < fisherinfo->GetVDim() - 1; j++) {
+                fi.Store(i, j, (*fisherinfo) (i,j));
+            }
+        }
+
+
+        setParameter (useJeffreysPrior, 1.0);       // reset flag
+
+        _AssociativeList *  eigen       = (_AssociativeList *) fi.Eigensystem();
+
+
+
+        _Matrix *           eigenvalues = (_Matrix *)eigen->GetByKey(0, MATRIX);
+        _Parameter          logdet      = 0.0,      // avoid overflow from large determinants
+                            checkzero   = 0.0;
+
+
+        for (long i = 0; i < eigenvalues->GetHDim(); i++) { // display eigenvalues
+            for (long j = 0; j < eigenvalues->GetVDim(); j++) {
+                _Parameter      temp = (*eigenvalues) (i,j);
+
+                checkzero += temp;
+
+                if (temp < 0.0) {       // can't allow any negative eigenvalues!
+                    snprintf (buf, sizeof(buf), "WARNING: negative eigenvalue.\n");
+                    BufferToConsole (buf);
+
+                    return res - 100.0;     // return a large negative number (worse log-likelihood)
+                }
+                logdet += log(temp);                // product of eigenvalues is the determinant
+
+            }
+        }
+
+        /*
+        //if (checkzero == 0.0) {       // all eigenvalues are zero, QR probably barfed
+            for (long i = 0; i < fi.GetHDim(); i++)
+            {
+                for (long j = 0; j < fi.GetVDim(); j++)
+                {
+                    snprintf (buf, sizeof(buf), "%lf\t", fi (i, j) );
+                    BufferToConsole (buf);
+                }
+                snprintf (buf, sizeof(buf), "\n");
+                BufferToConsole (buf);
+            }
+            snprintf (buf, sizeof(buf), "\n");
+            BufferToConsole (buf);
+
+        //  return res - 100.0;
+        //}
+
+
+        snprintf (buf, sizeof(buf), "log determinant = %lf\n", logdet);
+        BufferToConsole (buf);
+        */
+
+        _Parameter  jp  = 0.5 * logdet;     // this is Jeffrey's (1946) invariant prior applied to log-likelihood
+
+        return res + jp;    // else
+
+
+        // calculate the determinant
+        _Matrix *   ludFisher   = (_Matrix *) fisherinfo->LUDecompose();        // returns n x (n+1) matrix, where (n+1)th column contains vector
+        // of row interchanges, and the remaining nxn is the LUD.
+
+        for (long i = 0; i < ludFisher->GetHDim(); i++) {   // display matrix
+            for (long j = 0; j < ludFisher->GetVDim(); j++) {
+                _Parameter  temp = (*ludFisher) (i,j);
+                snprintf (buf, sizeof(buf), "%5.3lf\t", temp);
+                BufferToConsole (buf);
+            }
+            snprintf (buf, sizeof(buf), "\n");
+            BufferToConsole (buf);
+        }
+
+        snprintf (buf, sizeof(buf), "\n");
+        BufferToConsole (buf);
+
+        _Parameter  trace       = 1.0;
+
+        for (long diag = 0; diag < ludFisher->GetHDim(); diag++) {          // diagonal of LU contains the eigenvalues
+            _Parameter  temp = (*ludFisher) (diag,diag);
+            snprintf (buf, sizeof(buf), "%5.3lf\t", temp);
+            BufferToConsole (buf);
+
+            trace *= temp;      // product of eigenvalues is the determinant
+        }
+
+        snprintf (buf, sizeof(buf), "<- trace\n");
+        BufferToConsole (buf);
+
+        /*
+        snprintf (buf, sizeof(buf), "penalize %f\n", 0.5 * log(fabs(trace)) );
+        BufferToConsole (buf);
+        */
+
+        fisherinfo->Clear();
+        ludFisher->Clear();
+
+        return res + 0.5 * log(trace);      // penalized log-likelihood
+
+    } else {
+        return res;
+    }
+#endif
+
+    return res;
+}
+
+/*--------------------------------------------------------------------------------------------------------------------------------*/
+
+void        Scfg::InitComputeStructures (void)
+{
+    long maxStringLength = 0;
+    for (long stringCount = 0; stringCount < corpusChar.lLength; stringCount++) {
+        _SimpleList             emptyList;
+        _GrowingVector  *aMatrix;
+        _AVLListX               *searchTree;
+
+        long                    maxDimension = ((_String*)corpusChar(stringCount))->sLength;
+        maxStringLength         = MAX (maxStringLength, maxDimension);
+
+        // unused variable? -AFYP 2006-07-07
+        maxDimension = (maxDimension*(maxDimension+1)/2*byNT2.lLength/32+1)*32;
+
+        insideProbsT  && & emptyList;
+        outsideProbsT && & emptyList;
+
+        checkPointer (searchTree = new _AVLListX ((_SimpleList*)insideProbsT(stringCount)));
+        insideProbs << searchTree;
+        DeleteObject (searchTree);
+
+        checkPointer (searchTree = new _AVLListX ((_SimpleList*)outsideProbsT(stringCount)));
+        outsideProbs << searchTree;
+        DeleteObject (searchTree);
+
+        checkPointer (aMatrix = new _GrowingVector);
+        storedInsideP << aMatrix;
+        DeleteObject (aMatrix);
+
+        checkPointer (aMatrix = new _GrowingVector);
+        storedOutsideP << aMatrix;
+        DeleteObject (aMatrix);
+
+    }
+    maxStringLength = (maxStringLength * (maxStringLength+1) * byNT2.lLength / 64)+1;
+    computeFlagsI.Populate (maxStringLength,0,0);
+    computeFlagsO.Populate (maxStringLength,0,0);
+}
+
+/*--------------------------------------------------------------------------------------------------------------------------------*/
+
+inline  long    scfgIndexIntoAnArray            (long start,long end,long nt,long stringLength)
+{
+    return (2*stringLength-start-1)*start/2 + end + nt*(stringLength+1)*stringLength/2;
+
+    /* Each non terminal is given a triangular array for all substrings of a string, indexed by start, end (0-based, of course),
+       and subject to end >= start
+
+              end
+              0 1 2 ... stringLength
+
+       start =0 1 2 ... stringLength
+              x 1 2 ... stringLength
+              x x 2 ... stringLength
+                    ...
+              x x x ... stringLength
+
+        To find the offest of the (s,e) substring from the 0-th element of this array we compute (L = string length)
+
+        (e-s) + sum_{k=0}{s-1} (L-k) = e-s + s/2 (L + L - s + 1) = e - s + (2L - s + 1) s /2 = e + (2L - s - 1)
+
+     */
+
+
+
+    //return (2*stringLength-start+1)*start/2 + end + nt*(stringLength+1)*stringLength/2;       // AFYP June 21, 2006
+}
+
+
+/*--------------------------------------------------------------------------------------------------------------------------------*/
+
+void    setIndexBit             (long start,long end,long nt,long stringLength,_SimpleList& theArray)
+{
+    long theIndex = (2*stringLength-start-1)*start/2 + end + nt*(stringLength+1)*stringLength/2;
+    theArray.lData[theIndex/32] |= bitMaskArray.masks[theIndex%32];
+    /*char str255 [255];
+    snprintf (str255, sizeof(str255),"Store %d %d %d %d into %x\n", start, end, nt, stringLength, theIndex, theArray.lData[theIndex/32]);
+    BufferToConsole (str255);*/
+}
+
+/*--------------------------------------------------------------------------------------------------------------------------------*/
+
+bool    getIndexBit             (long start,long end,long nt,long stringLength,_SimpleList& theArray)
+{
+    long theIndex = (2*stringLength-start-1)*start/2 + end + nt*(stringLength+1)*stringLength/2;
+    /*char str255 [255];
+    snprintf (str255, sizeof(str255),"Fetch %d %d %d %d from %x to give %d\n", start, end, nt, stringLength, theArray.lData[theIndex/32], (theArray.lData[theIndex/32] & (bitMaskArray.masks[theIndex%32])) > 0);
+    BufferToConsole (str255);*/
+    return (theArray.lData[theIndex/32] & bitMaskArray.masks[theIndex%32]) > 0;
+}
+/*--------------------------------------------------------------------------------------------------------------------------------*/
+
+/* ---- SCFG:  Inside Probability -------------------------- */
+
+_Parameter   Scfg::ComputeInsideProb(long from, long to, long stringIndex, long ntIndex, bool firstPass)
+{
+
+    // static long insideCalls = 0;
+    insideCalls ++;
+
+
+    /* quickly handle extreme cases */
+    if (to > from) { // more than a single terminal in the substring
+        if (((_SimpleList**)byNT3.lData)[ntIndex]->lLength == 0)
+            // ntIndex non-terminal can only generate terminals
+        {
+            //if (firstPass) // mark this triplet as computed
+            //setIndexBit (from, to, ntIndex, ((_String*)corpusChar.lData[stringIndex])->sLength, computeFlagsI);
+            return 0.;
+        }
+    } else {    // to == from
+        if (((_SimpleList**)byNT2.lData)[ntIndex]->lLength == 0)
+            // ntIndex non-terminal can only generate other non-terminals
+        {
+            //if (firstPass) // mark this triplet as computed
+            //setIndexBit (from, to, ntIndex, ((_String*)corpusChar.lData[stringIndex])->sLength, computeFlagsI);
+
+            return 0.;
+        }
+    }
+
+    /* look up the triple in the cache and decide if it's already been done */
+
+    _AVLListX *             theAVL = (_AVLListX*)insideProbs(stringIndex);
+    // see if this is already done
+    long    stringL         = ((_String**)corpusChar.lData)[stringIndex]->sLength,
+            tripletIndex   = scfgIndexIntoAnArray(from,to,ntIndex,stringL),
+            avlIndex        = theAVL->FindLong (tripletIndex),
+            matrixIndex        = -1;
+
+    if (avlIndex < 0) { // the triplet is not in the search tree
+        if (firstPass) { // has this been done?
+            if (getIndexBit (from, to, ntIndex, stringL, computeFlagsI)) { // already done
+                return 0.0;
+            }
+        } else {
+            return 0.0;
+        }
+    } else { // is in the tree
+        matrixIndex = theAVL->GetXtra (avlIndex);
+        if (matrixIndex < 0) { // identically 1
+            return 1.0;
+        } else { // have we already computed this?
+            _Parameter currentValue = ((_GrowingVector**)storedInsideP.lData)[stringIndex]->theData[matrixIndex];
+            if (currentValue >= 0.0) {
+                return currentValue;
+            }
+            // else was reset to -1, re-compute
+        }
+    }
+
+    /* have to compute stuff */
+
+    _Parameter      insideProbValue = 0.0;
+
+    if (to == from) { // single terminal substring; direct lookup
+        long ruleIndex = ntToTerminalMap.lData[indexNT_T(ntIndex,((_SimpleList**)corpusInt.lData)[stringIndex]->lData[to])];
+        if (ruleIndex >= 0) {
+            insideProbValue = LookUpRuleProbability (ruleIndex);
+        }
+    } else {
+        if (firstPass)
+            // try the heuristics
+        {
+            _SimpleList* stringList = ((_SimpleList**)corpusInt.lData)[stringIndex];
+            // if any of these conditions are TRUE, then both inside and outside Pr(s,t,i) = 0
+            if (! (firstArray.lData[indexNT_T(ntIndex, stringList->lData[from])] &&
+                    lastArray.lData[indexNT_T(ntIndex, stringList->lData[to])]
+                    && (from == 0 || precursorArray.lData[indexNT_T(ntIndex, stringList->lData[from-1])])
+                    && (to == stringL-1 || followArray.lData[indexNT_T(ntIndex, stringList->lData[to+1])]))) {
+                setIndexBit (from, to, ntIndex, stringL, computeFlagsI);
+                return 0.0;
+            }
+        }
+
+        _SimpleList     * myNTNTRules = ((_SimpleList**)byNT3.lData)[ntIndex];
+
+        for (long ruleIdx = 0; ruleIdx < myNTNTRules->lLength; ruleIdx++) { // loop over all NT-> NT NT rules
+            long          currentRuleIndex = myNTNTRules->lData[ruleIdx];
+            _Parameter    ruleProb = LookUpRuleProbability(currentRuleIndex);
+
+            if (ruleProb > 0.0) {
+                _SimpleList * currentRule = ((_SimpleList **)rules.lData)[currentRuleIndex];
+                long          nt1         = currentRule->lData[1],
+                              nt2        = currentRule->lData[2],
+                              halfway      = from+(to-from)/2+1;
+
+                {
+                    for (long bp = from+1; bp <= halfway; bp++) { // now loop over all breakpoints
+                        _Parameter t = ComputeInsideProb (from,bp-1,stringIndex,nt1,firstPass);
+                        if (t>0.0) {
+                            insideProbValue += t*
+                                               ComputeInsideProb (bp,to,stringIndex,nt2,firstPass)*
+                                               ruleProb;
+                            /*
+                            insideProbValue += exp( log(t) +
+                                                    log(ComputeInsideProb (bp,to,stringIndex,nt2,firstPass)) +
+                                                    log(ruleProb) );
+                             */
+                            // attempts to prevent likelihood underflow -- AFYP Aug 4, 2006
+                        }
+                    }
+                }
+
+
+                for (long bp = halfway+1; bp <= to; bp++) { // now loop over all breakpoints
+                    _Parameter t = ComputeInsideProb (bp,to,stringIndex,nt2,firstPass);
+                    if (t > 0.0) {
+
+                        insideProbValue += t *
+                                           ComputeInsideProb (from,bp-1,stringIndex,nt1,firstPass)*
+                                           ruleProb;
+                        /*
+                        insideProbValue += exp( log(t) +
+                                                log(ComputeInsideProb (from,bp-1,stringIndex,nt1,firstPass)) +
+                                                log(ruleProb));
+                         */
+                    }
+                }
+            }
+        }
+    }
+
+    /* decide what to do with the probability:
+
+    0 - do nothing
+    1 - store -1 into the AVL
+    2 - store into the buffer matrix and the index into the AVL
+
+    */
+
+
+    if (insideProbValue > 0.0) {
+        /*
+        char str255[255];
+        snprintf (str255, sizeof(str255), "%d->%d:%d \t p = %g\n", ntIndex, from, to, insideProbValue);
+        BufferToConsole (str255);
+        */
+
+        if (avlIndex < 0) {
+            long    mxID = -1;
+            if (insideProbValue < 1.0) {
+                mxID = ((_GrowingVector*)(storedInsideP(stringIndex)))->Store (insideProbValue);
+            }
+            theAVL->Insert ((BaseRef)tripletIndex, mxID);
+        } else { // update values
+            ((_GrowingVector*)(storedInsideP(stringIndex)))->_Matrix::Store (matrixIndex,0,insideProbValue);
+        }
+    }
+
+
+
+    if (firstPass) {
+        setIndexBit (from, to, ntIndex, stringL, computeFlagsI);
+
+        /* ******** DEBUGGING ******** */
+        /*
+        char buf [255];
+        snprintf (buf, sizeof(buf), "inside %d\t%d\t%d\t%lf\n", from, to, ntIndex, insideProbValue);
+        BufferToConsole(buf);
+         */
+    }
+
+
+    return  insideProbValue;
+}
+
+/*--------------------------------------------------------------------------------------------------------------------------------*/
+void        Scfg::AddSCFGInfo (_AssociativeList* theList)
+{
+    _SimpleList indexer (corpusChar.lLength, 0, 1);
+    InsertStringListIntoAVL (theList, scfgCorpus, indexer, corpusChar);
+    _List       ruleStrings;
+    for (long i=0; i<rules.lLength; i++) {
+        ruleStrings.AppendNewInstance(GetRuleString (i));
+    }
+
+    indexer.Populate (rules.lLength, 0, 1);
+    InsertStringListIntoAVL (theList, _addSCFGInfoProductions, indexer, ruleStrings);
+    indexer.Populate (terminals.lLength, 0, 1);
+    InsertStringListIntoAVL (theList, _addSCFGInfoTerminals, indexer, terminals);
+
+    _Matrix * stats = new _Matrix (corpusChar.lLength,3,false,true);
+    checkPointer (stats);
+
+    for (long k=0; k<corpusChar.lLength; k++) {
+        long       strL    = ((_String*)corpusChar(k))->sLength,
+                   pNot0   = ((_AVLListX*)insideProbs(k))->dataList->lLength,
+                   p01     = ((_GrowingVector*)storedInsideP(k))->GetUsed();
+
+        _Parameter totalPR = strL*(strL+1.)*0.5*byNT2.lLength;
+        stats->Store (k,0,totalPR); // total number of tuples (i,j,v)
+        stats->Store (k,1,pNot0-p01);   // number of tuples with probability = 1
+        stats->Store (k,2,p01);     // number of tuples with probability in interval (0,1)
+    }
+    theList->MStore (_addSCFGInfoStats, stats, false);
+    stats = (_Matrix*)probabilities.Compute();
+    theList->MStore (_addSCFGInfoProbabilities, stats, true);
+}
+
+
+/*--------------------------------------------------------------------------------------------------------------------------------*/
+
+_Parameter   Scfg::ComputeOutsideProb(long from, long to, long stringIndex, long ntIndex, bool firstOutside, bool firstInside)
+{
+
+    /* _String nyi ("This function is under development - AFYP");
+    WarnError (nyi); */
+
+    // static long      outsideCalls = 0;
+
+    /* get length of this string */
+    long            stringL = ((_String**)corpusChar.lData)[stringIndex]->sLength;
+
+    outsideCalls++;
+
+    /*
+    if (firstOutside)
+    {
+        char buf [256];
+        snprintf (buf, sizeof(buf), "outside %d\t%d\t%d\n", from,to,ntIndex);
+        BufferToConsole(buf);
+    }
+    */
+
+    // quickly handle extreme cases
+    if (from == 0 && to == stringL-1) { // dealing with entire string
+        if (ntIndex == 0) { // for start symbol
+            //if(firstPass) // mark this triplet as computed
+            //setIndexBit(from, to, ntIndex, ((_String*)corpusChar.lData[stringIndex])->sLength, computeFlagsO);
+            return 1.0;
+        } else {            // not the start symbol
+            //if(firstPass) // mark this triplet as computed
+            //setIndexBit(from, to, ntIndex, ((_String*)corpusChar.lData[stringIndex])->sLength, computeFlagsO);
+            return 0.;
+        }
+    }
+
+    if (to > from) {
+        if (( (_SimpleList**)byNT3.lData)[ntIndex]->lLength == 0) {
+            return 0.;  // NT can only emit terminal; inside is 0, so outside is useless
+        }
+    } else {    // from==to
+        if (( (_SimpleList**)byNT2.lData)[ntIndex]->lLength == 0) {
+            return 0.;  // NT can only generate NT NT
+        }
+    }
+
+
+    if (!firstInside && firstOutside) { // re-use information from inside probs.
+        if (ComputeInsideProb(from,to,stringIndex,ntIndex,firstInside) == 0) {
+            setIndexBit (from,to,ntIndex,stringL,computeFlagsO);
+            return 0.;
+        }
+    }
+
+    /*
+    char buf [256];
+    snprintf (buf, sizeof(buf), "%d\t%d\t%d\n", from, to, ntIndex);
+    BufferToConsole(buf);
+    */
+
+    /* look up (s,t,i) in cache and decide if it has already been computed */
+    _AVLListX *     theAVL          = (_AVLListX*)outsideProbs(stringIndex);
+
+    long            tripletIndex    = scfgIndexIntoAnArray(from,to,ntIndex,stringL),    // convert (s,t,i)
+                    avlIndex     = theAVL->FindLong (tripletIndex),              // retrieve key
+                    matrixIndex        = -1;
+
+    if (avlIndex < 0) { // the triplet is not in the search tree
+        if (firstOutside) { // has this been computed?
+            if (getIndexBit (from, to, ntIndex, stringL, computeFlagsO)) {  // if TRUE, then already done and equals 0
+                return 0.;
+            }
+            // else FALSE, and need to compute
+        } else {            // otherwise, absence from AVL indicates Pr = 0
+            return 0.;
+        }
+    } else {    // is in the tree
+        matrixIndex = theAVL->GetXtra (avlIndex);   // retrieve index into stored outside probs (0<p<1)
+        if (matrixIndex < 0) {  // identically 1
+            return 1.0;
+        } else { // have we already computed this?
+            _Parameter currentValue = ((_GrowingVector**)storedOutsideP.lData)[stringIndex]->theData[matrixIndex];
+            if (currentValue >= 0.0) {
+                return currentValue;
+            }
+        }
+    }
+
+    /* have to compute stuff; note, nothing below this line should get called after the first pass */
+    if (firstOutside)
+        // try the heuristics
+    {
+        _SimpleList* stringList = ((_SimpleList**)corpusInt.lData)[stringIndex];
+        // if any of these conditions are TRUE, then both inside and outside Pr(s,t,i) = 0
+        if (! (firstArray.lData[indexNT_T(ntIndex, stringList->lData[from])] &&
+                lastArray.lData[indexNT_T(ntIndex, stringList->lData[to])]
+                && (from == 0 || precursorArray.lData[indexNT_T(ntIndex, stringList->lData[from-1])])
+                && (to == stringL-1 || followArray.lData[indexNT_T(ntIndex, stringList->lData[to+1])]))) {
+            setIndexBit (from, to, ntIndex, stringL, computeFlagsO);
+            return 0.0;
+        }
+    }
+
+    _Parameter      outsideProbValue = 0.0;
+
+    /* loop over all j->ki productions */
+    _SimpleList *   myNTNTRules = ((_SimpleList**)byRightNT2.lData)[ntIndex];
+    for (long ruleIdx = 0; ruleIdx < myNTNTRules->lLength; ruleIdx++) {
+        long        currentRuleIndex = myNTNTRules->lData[ruleIdx];
+        _Parameter  ruleProb = LookUpRuleProbability(currentRuleIndex);     // Pr(j->ki)
+
+        if (ruleProb > 0.0) {
+            _SimpleList *   currentRule = ((_SimpleList **)rules.lData)[currentRuleIndex];  // rule = list of three integers
+            long            j           = currentRule->lData[0],
+                            k           = currentRule->lData[1];
+
+            for (long leftBisect = 0; leftBisect < from; leftBisect++) {
+                _Parameter  t = ComputeInsideProb(leftBisect,from-1,stringIndex,k,firstInside);
+                if (t > 0.0)
+                    outsideProbValue += t *
+                                        ComputeOutsideProb(leftBisect,to,stringIndex,j,firstOutside,firstInside) *
+                                        ruleProb;
+            }
+        }
+    }
+
+    /* loop over all j->ik productions */
+    myNTNTRules = ((_SimpleList**)byRightNT1.lData)[ntIndex];
+    {
+        for (long ruleIdx = 0; ruleIdx < myNTNTRules->lLength; ruleIdx++) {
+            long        currentRuleIndex = myNTNTRules->lData[ruleIdx];
+            _Parameter  ruleProb = LookUpRuleProbability(currentRuleIndex);     // Pr(j->ik)
+
+            if (ruleProb > 0.0) {
+                _SimpleList *   currentRule = ((_SimpleList **)rules.lData)[currentRuleIndex];
+                long            j           = currentRule->lData[0],
+                                k           = currentRule->lData[2];
+
+                for (long rightBisect = to+1; rightBisect < stringL; rightBisect++) {
+                    _Parameter  t = ComputeInsideProb(to+1,rightBisect,stringIndex,k,firstInside);
+                    if (t > 0.0)
+                        outsideProbValue += t *
+                                            ComputeOutsideProb(from,rightBisect,stringIndex,j,firstOutside,firstInside) *
+                                            ruleProb;
+                }
+            }
+        }
+    }
+
+    /* decide what to do with the probability:
+
+            0 - do nothing
+            1 - store -1 into the AVL
+            2 - store into the buffer matrix and the index into the AVL
+
+    */
+
+    if (outsideProbValue > 0.0) {
+        /* DEBUGGING */
+        //char str255[255];
+        //snprintf (str255, sizeof(str255), "%d->%d:%d \t p = %g\n", ntIndex, from, to, outsideProbValue);
+        //BufferToConsole (str255);
+        /* --------- */
+
+        if (avlIndex < 0) { // triplet (s,t,i) not in search tree
+            long    mxID = -1;
+            if (outsideProbValue < 1.0) {
+                mxID = ((_GrowingVector*)(storedOutsideP(stringIndex)))->Store (outsideProbValue);
+            }
+            theAVL->Insert((BaseRef)tripletIndex, mxID);    // if Pr = 1.0, stores -1
+        } else {    // update values
+            ((_GrowingVector*)(storedOutsideP(stringIndex)))->_Matrix::Store (matrixIndex,0,outsideProbValue);
+        }
+    }
+
+    if (firstOutside) { // flag (s,t,i) as computed
+        setIndexBit (from,to,ntIndex,stringL,computeFlagsO);
+    }
+
+    return outsideProbValue;
+}
+
+/*--------------------------------------------------------------------------------------------------------------------------------*/
+
+_Matrix*     Scfg::Optimize (void)  /* created by AFYP, 2006-06-20 */
+{
+    _Parameter  useJP,
+                sOM;
+
+    checkParameter (useJeffreysPrior, useJP, 0.0);
+    checkParameter (scfgOptimizationMethod, sOM, 0.0);
+
+    if (useJP > 0.0 || sOM > 0.0) {
+        return _LikelihoodFunction::Optimize();    // Jeffrey's prior violates EM
+    }
+
+    char    buf [256];      // debugging buffer
+
+
+#ifdef      __MACPROFILE__
+    ProfilerInit(collectDetailed,bestTimeBase,1000,500);
+#endif
+
+
+    // populated with zeros for longest string by InitComputeStructures();
+    // inside flags cleared by calling Scfg::Compute()
+    bool    firstInside     = computeFlagsI.lLength,
+            firstOutside = computeFlagsO.lLength;
+
+
+    // update probability matrix -- converts formulas to numerical values
+    probabilities.Compute ();
+
+
+    // create container for new production rule probability estimates
+    //  numerator in column 1, denominator in column 2
+    long        nRules = (unsigned long) probabilities.GetHDim();
+    _Matrix     nextProbs(nRules, 2, FALSE, TRUE);
+
+
+
+    // scan production rule formulas for linking constraints, done once for entire optimization
+    _List           links;
+    _SimpleList *   thisLink = new _SimpleList();
+
+    for (long ruleCount = 0; ruleCount < nRules; ruleCount++) {
+        _Formula *  thisRule = probabilities.GetFormula (ruleCount, 0);
+
+        if ( !(thisRule->IsAConstant()) ) {
+            *thisLink << ruleCount;
+
+            for (long nextrule = ruleCount+1; nextrule < nRules; nextrule++) {
+                _Formula *  thatRule = probabilities.GetFormula (nextrule, 0);
+                if ( thisRule->EqualFormula (thatRule) ) {
+                    *thisLink << nextrule;
+                    snprintf (buf, sizeof(buf), "linked rule %ld to %ld\n", ruleCount+1, nextrule+1);
+                    BufferToConsole (buf);
+                }
+            }
+
+            if (thisLink->lLength > 1) {
+                links && thisLink;    // append duplicate
+            }
+            thisLink->Clear();
+        }
+    }
+
+
+    /* calculate current corpus log-likelihood */
+    _Parameter  newLk = Compute(),
+                oldLk = newLk;
+    long        rep = 0;
+
+
+    /* ========================= */
+    /*  start optimization loop  */
+    /* ========================= */
+
+    do {
+        oldLk = newLk;
+
+        for (long ruleCount = 0; ruleCount < nRules; ruleCount++) {
+            nextProbs.Store(ruleCount, 0, 0);   // zero all entries in container matrix
+            nextProbs.Store(ruleCount, 1, 0);
+        }
+
+
+
+        // loop over strings in corpus
+        for (long stringID = 0; stringID < corpusChar.lLength; stringID++) {
+            long    stringL     = ((_String**)corpusChar.lData)[stringID]->sLength,
+                    countNT      = byNT2.lLength;
+
+            _Parameter  denom       = 0,
+                        stringProb = ComputeInsideProb(0, stringL-1, stringID, startSymbol, firstInside);
+            // by calculating this, firstInside should be reset to FALSE
+
+            _SimpleList*    stringList = ((_SimpleList**)corpusInt.lData)[stringID];
+
+
+            /* After computing string Pr., absence in AVL indicates inside Pr = 0   */
+            /* so treat firstInside as FALSE below...                               */
+
+            if (stringProb > 0.) {
+                for (long ntIndex = 0; ntIndex < countNT; ntIndex++) {  // loop over all non-terminal symbols
+
+                    /* calculate denominator (number of times i-th NT was used in string */
+                    denom = 0;
+
+                    for (long from = 0; from < stringL; from++) {
+                        if (( (_SimpleList**)byNT3.lData)[ntIndex]->lLength == 0) { // only i->m
+                            denom += ComputeInsideProb(from,from,stringID,ntIndex,FALSE) *
+                                     ComputeOutsideProb(from,from,stringID,ntIndex,firstOutside,FALSE) /
+                                     stringProb;
+                        } else {    // NT has i->jk productions
+                            //for (long to = from; to < stringL; to++)
+                            for (long to = from + 1; to < stringL; to++) {  // count only i->jk
+
+                                denom += ComputeInsideProb(from,to,stringID,ntIndex,FALSE) *
+                                         ComputeOutsideProb(from,to,stringID,ntIndex,firstOutside,FALSE) /
+                                         stringProb;
+
+
+                                /*  ^^^ It became necesssary to use this calcalation rather than
+                                    the short-cut below, because it choked on node-censored grammars. */
+
+                                /*
+                                long        tripletIndex    = scfgIndexIntoAnArray(from,to,ntIndex,stringL),
+                                avlIndex        = theAVL->Find ((BaseRef)tripletIndex),
+                                matrixIndex     = -1;
+
+                                if (avlIndex > -1)  // triplet has non-zero inside Pr
+                                {
+                                    matrixIndex = theAVL->GetXtra (avlIndex);
+                                    if (matrixIndex > -1)   // skip productions with Pr identically 1, don't train.
+                                                            //  This also applies to node censoring -- afyp, Aug 30, 2006
+                                    {
+                                        _Parameter  ip  = ((_GrowingVector**)storedInsideP.lData)[stringID]->theData[matrixIndex],
+                                        op  = ComputeOutsideProb(from,to,stringID,ntIndex,firstOutside,FALSE);
+                                        if (op > 0)
+                                        {
+                                            denom += ip*op/stringProb;
+                                            // denom += exp( log(ip) + log(op) - log(stringProb) );
+                                        }
+                                    }
+                                }
+                                */
+                            }
+                        }
+                    } // end loop over [s]
+
+                    /*
+                    snprintf (buf, sizeof(buf), "string = %d\tnt = %d\tdenom = %f\n", stringID, ntIndex, denom);
+                    BufferToConsole (buf);
+                     */
+
+                    if (denom > 0.) {
+                        // loop over i->m productions of current NT
+                        _SimpleList *   imRules = ((_SimpleList**)byNT2.lData)[ntIndex];
+
+                        for (long rC = 0; rC < imRules->lLength; rC++) {
+                            _Parameter      numer       = 0.;
+                            long            ruleIndex   = imRules->lData[rC];
+                            _SimpleList *   currentRule = ((_SimpleList**)rules.lData)[ruleIndex];
+                            long            termIndex   = currentRule->lData[1];
+                            _Parameter      ruleProb    = LookUpRuleProbability (ruleIndex);
+
+                            if (ruleProb == 1.0 || ruleProb == 0.0) {
+                                continue;
+                            }
+
+                            char *  thisString = ((_String**)corpusInt.lData)[stringID]->getStr();
+
+                            for (long from = 0; from < stringL; from++) {
+                                long    thisSymbol = thisString[from];
+                                if (thisSymbol == termIndex) {
+                                    _Parameter  tryProb = ComputeInsideProb(from,from,stringID,ntIndex,FALSE);
+                                    if (tryProb > 0.0) {
+                                        numer += tryProb *
+                                                 ComputeOutsideProb(from,from,stringID,ntIndex,firstOutside,FALSE) /
+                                                 stringProb;
+                                    }
+                                }
+                            }
+                            // update i->m production probability
+
+                            /*
+                             snprintf (buf, sizeof(buf), "storing %f/%f into ruleIndex %d\n", numer, denom, ruleIndex);
+                             BufferToConsole(buf);
+                             */
+
+                            nextProbs.theData[ruleIndex] += numer;
+                            nextProbs.theData[nRules + ruleIndex] += denom;
+                        }
+
+
+
+                        // loop over all i->jk productions of current NT
+                        _SimpleList *   ijkRules = ((_SimpleList**)byNT3.lData)[ntIndex];
+
+                        /*
+                         snprintf (buf, sizeof(buf), "nt %d has %d ijk rules\n", ntIndex, ijkRules->lLength);
+                         BufferToConsole(buf);
+                         */
+                        {
+                            for (long rC = 0; rC < ijkRules->lLength; rC++) {
+                                long            ruleIndex   = ijkRules->lData[rC];
+                                _Parameter      ruleProb    = LookUpRuleProbability (ruleIndex),
+                                                numer        = 0.;
+
+                                _SimpleList *   currentRule = ((_SimpleList**)rules.lData)[ruleIndex];
+                                long            jIndex      = currentRule->lData[1],
+                                                kIndex      = currentRule->lData[2];
+
+                                if (ruleProb == 0.0 || ruleProb == 1.0) {
+                                    continue;
+                                }
+
+                                /*
+                                snprintf (buf, sizeof(buf), "rule %d (%d->%d,%d)\tPr = %f\n", ruleIndex, ntIndex, jIndex, kIndex, ruleProb);
+                                BufferToConsole (buf);
+                                 */
+
+
+                                for (long from = 0; from < stringL-1; from++) { /* calculate equation (20) */
+                                    // use heuristics to skip zero productions
+
+                                    if ( ! (firstArray.lData[indexNT_T(ntIndex,stringList->lData[from])]
+                                            && (from == 0 || precursorArray.lData[indexNT_T(ntIndex,stringList->lData[from-1])])) ) {
+                                        continue;
+                                    }
+
+
+                                    for (long to = from; to < stringL; to++) {  /* BUG? <- start at s=t or s=t+1 ??? */
+                                        // more short-cuts from heuristics
+
+                                        if (! (lastArray.lData[indexNT_T(ntIndex, stringList->lData[to])]
+                                                && (to == stringL-1 || followArray.lData[indexNT_T(ntIndex, stringList->lData[to+1])])) ) {
+                                            continue;
+                                        }
+
+
+                                        _Parameter  op  = ComputeOutsideProb(from,to,stringID,ntIndex,firstOutside,FALSE);
+
+                                        if (op == 0) {
+                                            continue;    // yet another short-cut
+                                        }
+
+
+                                        for (long bisect = from; bisect < to; bisect++) {
+                                            _Parameter ip = ComputeInsideProb(from,bisect,stringID,jIndex,FALSE);
+                                            if (ip > 0.) {
+                                                numer += ruleProb * ip *
+                                                         ComputeInsideProb(bisect+1,to,stringID,kIndex,FALSE) * op /
+                                                         stringProb;
+                                            }
+                                        }
+                                    }
+                                }
+
+                                /*
+                                 snprintf (buf, sizeof(buf), "storing %f/%f into ruleIndex %d\n", numer, denom, ruleIndex);
+                                 BufferToConsole(buf);
+                                 */
+
+                                nextProbs.theData[ruleIndex] += numer;
+                                nextProbs.theData[nRules + ruleIndex] += denom;
+                            }
+                        }
+
+                    } // endif denom > 0
+
+
+                } // end loop over NT
+
+
+            } else {    // stringProb <= 0
+                snprintf (buf, sizeof(buf), "WARNING: String probability <= 0 (%f)\n", stringProb);
+                BufferToConsole (buf);
+            }
+
+            // repopulate with zeros for next string
+            if (firstInside) {
+                computeFlagsI.Populate(computeFlagsI.lLength,0,0);
+            }
+            if (firstOutside) {
+                computeFlagsO.Populate(computeFlagsO.lLength,0,0);
+            }
+
+
+
+            // clear stored inside and outside probabilities -- need to re-estimate and re-fill AVLs
+            _Matrix * cachedProbs   = (_Matrix*)(storedInsideP(stringID));
+            {
+                for (long cid = 0; cid < cachedProbs->GetHDim(); cid++) {
+                    cachedProbs->Store(cid,0,-1.);
+                }
+            }
+            cachedProbs = (_Matrix*)(storedOutsideP(stringID));
+            {
+                for (long cid = 0; cid < cachedProbs->GetHDim(); cid++) {
+                    cachedProbs->Store(cid,0,-1.);
+                }
+            }
+        } // end loop over strings
+
+
+
+        // search through rules and sum linked probabilities
+
+        for (long linkIndex = 0; linkIndex < links.lLength; linkIndex++) {
+            _SimpleList *   thisLink    = (_SimpleList*)links.lData[linkIndex];
+            _Parameter      linkNumer   = 0.,
+                            linkDenom = 0.;
+            /*
+            snprintf (buf, sizeof(buf), "Link %d contains ", linkIndex);
+            BufferToConsole (buf);
+             */
+            {
+                for (long lcount = 0; lcount < thisLink->lLength; lcount++) {
+                    /*
+                    snprintf (buf, sizeof(buf), "%d(%3.3f/%3.3f) ", thisLink->lData[lcount], nextProbs.theData[thisLink->lData[lcount]],
+                            nextProbs.theData[nRules+thisLink->lData[lcount]]);
+                    BufferToConsole (buf);
+                     */
+                    linkNumer += nextProbs.theData[thisLink->lData[lcount]];
+                    linkDenom += nextProbs.theData[nRules+thisLink->lData[lcount]];
+                }
+            }
+
+            for (long lcount = 0; lcount < thisLink->lLength; lcount++) {
+                // update linked probabilities
+                nextProbs.theData[thisLink->lData[lcount]] = linkNumer / thisLink->lLength;
+                nextProbs.theData[nRules+thisLink->lData[lcount]] = linkDenom / thisLink->lLength;
+                /*
+                 snprintf (buf, sizeof(buf), "\t all set to %3.3f/%3.3f\n", linkNumer, linkDenom);
+                 BufferToConsole(buf);
+                 */
+            }
+        }
+
+
+        // update rule probabilities with new estimates
+        {
+            for (long ruleCount = 0; ruleCount < probabilities.GetHDim(); ruleCount++) {
+                _Formula *      thisFormula = probabilities.GetFormula (ruleCount,0);
+                if (thisFormula->IsAConstant()) {
+                    continue;
+                }
+
+                _SimpleList     itsVariables;
+                _AVLList        scannerList(&itsVariables);
+
+                thisFormula->ScanFForVariables(scannerList,TRUE,FALSE,TRUE,TRUE);
+                // for the time being, assume that the first variable in the formula is the one to adjust
+                _Variable *     theParameter    = LocateVar (itsVariables.lData[0]);
+                _Constant       nextValue (nextProbs.theData[ruleCount] / nextProbs.theData[nRules+ruleCount]);
+
+
+                if (nextProbs.theData[nRules+ruleCount] > 0.0) {    // skip productions with denominators = 0
+                    // Temporary fix -- AFYP, Sept 27, 2006
+                    /*
+                    snprintf (buf, sizeof(buf), "set rule %d from %f to %f\n", ruleCount, LookUpRuleProbability(ruleCount),
+                         nextProbs.theData[ruleCount] / nextProbs.theData[nRules+ruleCount]);
+                    BufferToConsole(buf);
+                     */
+                    theParameter->SetValue (nextValue.Compute());
+                }
+
+            }
+        }
+
+        if (firstInside) {
+            firstInside = FALSE;    // reset flags
+        }
+        if (firstOutside) {
+            firstOutside = FALSE;
+        }
+
+        probabilities.Compute ();   // convert updated formulas to numerical values
+
+
+        // calculated log-likelihood of corpus using updated production Pr
+        // and compare to previous value.
+        newLk = Compute();
+        ++rep;
+
+        /*
+        snprintf (buf, sizeof(buf), "Iteration %d, Log L = %f\n", rep, newLk);
+        BufferToConsole (buf);
+        */
+
+        if (rep > MAX_ITERATIONS_OPTIMIZE) {
+            break;
+        }
+
+        if (newLk < oldLk) {
+            snprintf (buf, sizeof(buf), "\nERROR: log L = %f is lower than previous value %f at step %ld \n", newLk, oldLk, rep);
+            BufferToConsole (buf);
+            // break;
+        }
+
+    } while (fabs(newLk - oldLk) > SCFG_OPTIMIZATION_THRESHOLD);    // should be non-absolute - afyp 11/30/2006
+
+    snprintf (buf, sizeof(buf), "Used %ld iterations in expectation maximization.\n", rep);
+    BufferToConsole (buf);
+
+    delete  thisLink;   // release allocated memory
+
+#ifdef      __MACPROFILE__
+    ProfilerDump("\pSCFGProfile");
+    ProfilerTerm();
+#endif
+
+    // SLKP:  TBI this actually needs to be populated still
+    /* return new _Matrix (1,1,false,true); */
+    return NULL;
+}
+
+/*--------------------------------------------------------------------------------------------------------------------------------*/
+
+_String* Scfg::SpawnRandomString(long ntIndex, _SimpleList* storageString)
+{
+    if (ntIndex < 0) {
+        checkPointer (storageString = new _SimpleList);
+        SpawnRandomString (startSymbol, storageString);
+        _String      *backString = new _String (storageString->lLength, true);
+        checkPointer (backString);
+        for (long k=0; k<storageString->lLength; k++) {
+            (*backString) << (_String*)terminals (storageString->lData[k]);
+        }
+        backString->Finalize();
+        DeleteObject (storageString);
+        return backString;
+    }
+
+    _Parameter      randomValue = genrand_real2 (),
+                    sum         = 0.;
+
+    long            ruleIndex   = 0;
+    _SimpleList*    aList       = (_SimpleList*)byNT2(ntIndex),
+                    *  aRule;
+
+    // loop through terminal rules (X->x) and sum probabilities
+    for (; ruleIndex<aList->lLength && sum < randomValue ; ruleIndex++) {
+        sum += LookUpRuleProbability (aList->lData[ruleIndex]);
+    }
+
+    if (sum >= randomValue) {
+        aRule = (_SimpleList*)rules(aList->lData[ruleIndex-1]);
+        (*storageString) << aRule->lData[1];
+        return nil;
+    }
+
+    ruleIndex = 0;
+    aList       = (_SimpleList*)byNT3(ntIndex);
+    for (; ruleIndex<aList->lLength && sum < randomValue ; ruleIndex++) {
+        sum += LookUpRuleProbability (aList->lData[ruleIndex]);
+    }
+
+    if (sum >= randomValue) {
+        aRule = (_SimpleList*)rules(aList->lData[ruleIndex-1]);
+        SpawnRandomString (aRule->lData[1],storageString);
+        SpawnRandomString (aRule->lData[2],storageString);
+    } else {
+        _String oops ("SCFG::SpawnRandomString() randomValue ");
+        oops = oops & randomValue & " exceeded sum " & sum;
+        oops = oops & ": nt=" & ntIndex & " stor=" & (_String *) storageString->toStr();
+        WarnError (oops);
+    }
+
+    return nil;
+
+}
+
+
+
+/*--------------------------------------------------------------------------------------------------------------------------------*/
+/*  Implementation of CYK algorithm by AFYP     2006-07-12                                                                        */
+/*--------------------------------------------------------------------------------------------------------------------------------*/
+_String *   Scfg::BestParseTree(void)
+{
+    long            countNT         = byNT2.lLength;
+    bool            firstPass       = computeFlagsI.lLength;
+
+    _String *       parseTreeString = new _String();
+    //char          buf [4096];
+
+
+    for (long stringIndex = 0; stringIndex < corpusChar.lLength; stringIndex++) {
+        long    stringL     = ((_String**)corpusChar.lData)[stringIndex]->sLength;
+
+        // initialize AVL tree for storing non-zero subtrees (i,j,v) to refer to _SimpleList
+        _SimpleList     triplets;
+        _AVLListX *     theAVL;
+
+        checkPointer (theAVL = new _AVLListX (&triplets));
+
+        _SimpleList             argMaxYZK;      // stores (y,z,k) keyed by argmax(i,j,v) in AVL
+        _GrowingVector  *theMatrix;     // stores likelihood for subtree (i,j,v)
+
+        checkPointer (theMatrix = new _GrowingVector);
+
+        {
+            for (long from = 0; from < stringL; from++) {   // initialization
+                for (long ntIndex = 0; ntIndex < countNT; ntIndex++) {
+                    long        tripletIndex    = scfgIndexIntoAnArray (from,from,ntIndex,stringL),
+                                mxID         = -1;
+                    _Parameter  lk = ComputeInsideProb(from,from,stringIndex,ntIndex,firstPass);
+
+                    if (lk > 0.) {
+                        mxID = theMatrix->Store (lk);
+                        theAVL->Insert ((BaseRef)tripletIndex, mxID);
+                        for (long count = 0; count < 3; count++) {
+                            argMaxYZK << 0;    // append (0,0,0)
+                        }
+                    }
+                }
+            }
+        }
+
+        for (long from = 0; from < stringL-1; from++) { // iterate over all substrings and non-terminals
+            for (long to = from+1; to < stringL; to++) {
+                for (long ntIndex = 0; ntIndex < countNT; ntIndex++) {
+                    _Parameter      maxLk = 0;
+                    long            maxLeft,
+                                    maxRight,
+                                    maxBisect;
+                    _SimpleList *   itsRules = ((_SimpleList **) byNT3.lData)[ntIndex];
+
+                    for (long ruleIdx = 0; ruleIdx < itsRules->lLength; ruleIdx++) {    // iterate over all productions
+                        long            currentRuleIndex    = itsRules->lData[ruleIdx];
+                        _SimpleList *   currentRule         = ((_SimpleList**)rules.lData)[currentRuleIndex];
+                        _Parameter      ruleProb            = LookUpRuleProbability(currentRuleIndex);
+                        long            leftNT              = currentRule->lData[1],
+                                        rightNT               = currentRule->lData[2];
+
+                        if (ruleProb > 0.) {
+                            for (long bisect = from; bisect < to; bisect++) {       // iterate over all bisects of substring
+                                _Parameter  tryProb = ComputeInsideProb(from,bisect,stringIndex,leftNT,firstPass);
+                                if (tryProb > 0.) {
+                                    _Parameter  lk  = ruleProb * tryProb *
+                                                      ComputeInsideProb(bisect+1,to,stringIndex,rightNT,firstPass);
+                                    if (lk > maxLk) {
+                                        maxLk = lk;
+                                        maxLeft = leftNT;
+                                        maxRight = rightNT;
+                                        maxBisect = bisect;
+                                    }
+                                }
+                            }
+                        }
+                    }
+
+                    long    tripletIndex    = scfgIndexIntoAnArray (from,to,ntIndex,stringL),
+                            mxID         = -1,
+                            insertFlag;
+
+                    if (maxLk > 0) {
+                        mxID = theMatrix->Store (maxLk);    // store most likely production and bisect for triplet
+
+                        // snprintf (buf, sizeof(buf), "stored triplet into matrix ID %d\n", mxID);
+                        // BufferToConsole(buf);
+
+                        insertFlag = theAVL->Insert ((BaseRef)tripletIndex, mxID);
+                        if (insertFlag > -1) {  // store (y,z,k)
+                            argMaxYZK << maxLeft;
+                            argMaxYZK << maxRight;
+                            argMaxYZK << maxBisect;
+                            /*
+                             snprintf (buf, sizeof(buf), "(%d,%d,%d) stored (%d,%d,%d) with L=%f\n", from,to,ntIndex, maxLeft,maxRight,maxBisect, maxLk);
+                             BufferToConsole(buf);
+                             */
+                        }
+                    }
+                }
+            }
+        }
+
+        // apply stack to reconstructing best parse
+        CykTraceback (0,stringL-1,0,stringIndex,theAVL,&argMaxYZK,theMatrix,parseTreeString);
+
+        (*parseTreeString) = (*parseTreeString) & "\n"; // separate tree strings
+    }
+
+
+    // BufferToConsole((char *)(const char *) (*parseTreeString));
+    parseTreeString -> Finalize();
+    return (parseTreeString);
+}
+
+
+/*------------------------------------------------------------------------------------------------------------------------------*/
+/*  Converts stack of best-parse productions into a tree string.- AFYP                                                          */
+void    Scfg::CykTraceback (long i, long j, long v, long stringIndex, _AVLListX * theAVL, _SimpleList * theYZKs, _GrowingVector * theMatrix, _String * parseTreeString)
+{
+    //  for sub-string (i,j) and non-terminal (v), string of length (stringL)
+
+    long    stringL         = ((_String**)corpusChar.lData)[stringIndex]->sLength,
+            tripletIndex  = scfgIndexIntoAnArray(i,j,v,stringL),
+            avlIndex       = theAVL -> Find ((BaseRef)tripletIndex);
+
+    _String * corpusString  = ((_String**)corpusChar.lData)[stringIndex];
+
+    if (avlIndex < 0) { // value not in tree
+        ReportWarning (_String("ERROR: Unknown triplet encountered in CYK traceback: (") & i & "," & j & "," & v & ")");
+    } else {
+        long        matrixIndex = theAVL->GetXtra (avlIndex),
+                    y           = theYZKs->lData[matrixIndex * 3],
+                    z           = theYZKs->lData[matrixIndex * 3 + 1],
+                    k           = theYZKs->lData[matrixIndex * 3 + 2];
+#ifdef __NEVER_DEFINED__
+        if (y == 0 && z == 0 && k == 0) {   // node terminates
+            snprintf (buf, sizeof(buf), "%d:%d", i, v);
+            // BufferToConsole(buf);
+            (*parseString) << (const char *) buf;
+        } else {                        // node spawns two children
+
+            snprintf (buf, sizeof(buf), "(");
+            // BufferToConsole(buf);
+            (*parseString) << (const char *) buf;
+
+            CykTraceback(i,k,y,stringIndex,theAVL,theYZKs,theMatrix,parseString);
+
+            snprintf (buf, sizeof(buf), ",");
+            // BufferToConsole(buf);
+            (*parseString) << (const char *) buf;
+
+            CykTraceback(k+1,j,z,stringIndex,theAVL,theYZKs,theMatrix,parseString);
+
+            snprintf (nodename, sizeof(nodename), "Node%d", tripletIndex);
+            snprintf (buf, sizeof(buf), ")%s:%d", nodename, v);
+            // BufferToConsole(buf);
+            (*parseString) << (const char *) buf;
+
+        }
+#else
+        if (y==0 && z==0 && k==0) { // node terminates
+            (*parseTreeString) = (*parseTreeString) & "(" & v & " " & corpusString->sData[i] & ")";
+            /*
+            snprintf (buf, sizeof(buf), "(%d %s)", v, corpusString->sData[i]);
+            (*parseString) << (const char *) buf;
+             */
+        } else {
+            (*parseTreeString) = (*parseTreeString) & "(" & v & " ";
+            /*
+            snprintf (buf, sizeof(buf), "(%d ", v);
+            (*parseString) << (const char *) buf;
+            */
+
+            CykTraceback(i,k,y,stringIndex,theAVL,theYZKs,theMatrix,parseTreeString);
+
+            //(*parseTreeString) = (*parseTreeString) & " ";
+
+            CykTraceback(k+1,j,z,stringIndex,theAVL,theYZKs,theMatrix,parseTreeString);
+
+            (*parseTreeString) = (*parseTreeString) & ")";
+
+            /*
+            snprintf (buf, sizeof(buf), ")");
+            (*parseString) << (const char *) buf;
+             */
+        }
+#endif
+    }
+}
+
+#endif
+
+/*--------------------------------------------------------------------------------------------------------------------------------*/
+/*--------------------------------------------------------------------------------------------------------------------------------*/
+/*--------------------------------------------------------------------------------------------------------------------------------*/
+/*--------------------------------------------------------------------------------------------------------------------------------*/
+/*--------------------------------------------------------------------------------------------------------------------------------*/
+/*--------------------------------------------------------------------------------------------------------------------------------*/
+
+
+
diff --git a/src/ocl/opencl_kernels.cl b/src/ocl/opencl_kernels.cl
new file mode 100644
index 0000000..960de85
--- /dev/null
+++ b/src/ocl/opencl_kernels.cl
@@ -0,0 +1,311 @@
+ #define MIN(a,b) ((a)>(b)?(b):(a))
+__kernel void LeafKernel(  __global float* node_cache,                 // argument 0
+                           __global const float* model,                // argument 1
+                           __global const float* nodRes_cache,         // argument 2
+                           __global const long* nodFlag_cache,         // argument 3
+                           long sites,                                 // argument 4
+                           long characters,                            // argument 5
+                           long childNodeIndex,                        // argument 6
+                           long parentNodeIndex,                       // argument 7
+                           long roundCharacters,                       // argument 8
+                           int intTagState,                            // argument 9
+                           int nodeID,                                 // argument 10
+                           __global int* scalings,                     // argument 11
+                           float scalar,                               // argument 12
+                           float uFlowThresh                           // argument 13
+                           )
+{
+   int gx = get_global_id(0); // pchar
+   if (gx > characters) return;
+   int gy = get_global_id(1); // site
+   if (gy > sites) return;
+   long parentCharacterIndex = parentNodeIndex*sites*roundCharacters + gy*roundCharacters + gx;
+   float privateParentScratch = 1.0f;
+   int scale = 0;
+   if (intTagState == 1)
+   {
+       privateParentScratch = node_cache[parentCharacterIndex];
+       scale = scalings[parentCharacterIndex];
+   }
+   long siteState = nodFlag_cache[childNodeIndex*sites + gy];
+   privateParentScratch *= model[nodeID*roundCharacters*roundCharacters + siteState*roundCharacters + gx];
+   if (gy < sites && gx < characters)
+   {
+       node_cache[parentCharacterIndex] = privateParentScratch;
+       scalings[parentCharacterIndex] = scale;
+   }
+}
+__kernel void AmbigKernel(     __global float* node_cache,                 // argument 0
+                               __global const float* model,                // argument 1
+                               __global const float* nodRes_cache,         // argument 2
+                               __global const long* nodFlag_cache,         // argument 3
+                               long sites,                                 // argument 4
+                               long characters,                            // argument 5
+                               long childNodeIndex,                        // argument 6
+                               long parentNodeIndex,                       // argument 7
+                               long roundCharacters,                       // argument 8
+                               int intTagState,                            // argument 9
+                               int nodeID,                                 // argument 10
+                               __global int* scalings,                     // argument 11
+                               float scalar,                               // argument 12
+                               float uFlowThresh                           // argument 13
+                               )
+{
+   // thread index
+   int tx = get_local_id(0);
+   int ty = get_local_id(1);
+   // global index
+   int gx = get_global_id(0);
+   int gy = get_global_id(1);
+   long parentCharacterIndex = parentNodeIndex*sites*roundCharacters + gy*roundCharacters + gx;
+   float privateParentScratch = 1.0f;
+   int scale = 0;
+   if (intTagState == 1 && gy < sites && gx < characters)
+   {
+       privateParentScratch = node_cache[parentCharacterIndex];
+       scale = scalings[parentCharacterIndex];
+   }
+   float sum = 0.f;
+   float childSum = 0.f;
+   int scaleScratch = 0;
+   __local float childScratch[BLOCK_SIZE][BLOCK_SIZE];
+   __local float modelScratch[BLOCK_SIZE][BLOCK_SIZE];
+   int siteState = nodFlag_cache[childNodeIndex*sites + gy];
+   int ambig = 0;
+   if (siteState < 0)
+   {
+       ambig = 1;
+       siteState = -siteState-1;
+   }
+   int cChar = 0;
+   for (int charBlock = 0; charBlock < 64/BLOCK_SIZE; charBlock++)
+   {
+       if (ambig && gy < sites && gx < characters)
+           childScratch[ty][tx] =  nodRes_cache[siteState*characters + (charBlock*BLOCK_SIZE) + tx];
+           //childScratch[ty][tx] =
+            //   nodRes_cache[siteState*characters + (charBlock*BLOCK_SIZE) + tx];
+       else if (gy < sites && gx < characters)
+       {
+           if (charBlock*BLOCK_SIZE + tx == siteState)
+               childScratch[ty][tx] = 1;
+           else
+               childScratch[ty][tx] = 0;
+       }
+       else
+               childScratch[ty][tx] = 0;
+       modelScratch[ty][tx] = model[nodeID*roundCharacters*roundCharacters + roundCharacters*((charBlock*BLOCK_SIZE)+ty) + gx];
+       barrier(CLK_LOCAL_MEM_FENCE);
+       for (int myChar = 0; myChar < MIN(BLOCK_SIZE, (characters-cChar)); myChar++)
+       {
+           sum += childScratch[ty][myChar] * modelScratch[myChar][tx];
+           childSum += childScratch[ty][myChar];
+       }
+       barrier(CLK_LOCAL_MEM_FENCE);
+       cChar += BLOCK_SIZE;
+   }
+   while (childSum < 1 && childSum != 0)
+   {
+       childSum *= scalar;
+       sum *= scalar;
+       scaleScratch++;
+   }
+   scale += scaleScratch;
+   privateParentScratch *= sum;
+   if (gy < sites && gx < characters)
+   {
+       scalings    [parentCharacterIndex]  = scale;
+       node_cache  [parentCharacterIndex]  = privateParentScratch;
+   }
+   /*
+   */
+}
+__kernel void InternalKernel(  __global float* node_cache,                 // argument 0
+                               __global const float* model,                // argument 1
+                               __global const float* nodRes_cache,         // argument 2
+                               long sites,                                 // argument 3
+                               long characters,                            // argument 4
+                               long childNodeIndex,                        // argument 5
+                               long parentNodeIndex,                       // argument 6
+                               long roundCharacters,                       // argument 7
+                               int intTagState,                            // argument 8
+                               int nodeID,                                 // argument 9
+                               __global float* root_cache,                 // argument 10
+                               __global int* scalings,                     // argument 11
+                               float scalar,                               // argument 12
+                               float uFlowThresh,                          // argument 13
+                               __global int* root_scalings                 // argument 10
+                               )
+{
+   // thread index
+   short tx = get_local_id(0);   //local pchar
+   short ty = get_local_id(1);   //local site
+   // global index
+   short gx = get_global_id(0);
+   int gy = get_global_id(1);
+   long parentCharacterIndex = parentNodeIndex*sites*roundCharacters + gy*roundCharacters + gx;
+   float privateParentScratch = 1.0f;
+   short scale = 0;
+   if (intTagState == 1 && gy < sites && gx < characters)
+   {
+       privateParentScratch = node_cache[parentCharacterIndex];
+       scale = scalings[parentCharacterIndex];
+   }
+   float sum = 0.f;
+   float childSum = 0.f;
+   int scaleScratch = scalings[childNodeIndex*sites*roundCharacters + gy*roundCharacters + gx];
+   __local float  childScratch[BLOCK_SIZE][BLOCK_SIZE];
+   __local float  modelScratch[BLOCK_SIZE][BLOCK_SIZE];
+   short cChar = 0;
+   for (int charBlock = 0; charBlock < 64/BLOCK_SIZE; charBlock++)
+   {
+       childScratch[ty][tx] =
+           node_cache[childNodeIndex*sites*roundCharacters + roundCharacters*gy + (charBlock*BLOCK_SIZE) + tx];
+       modelScratch[ty][tx] = model[nodeID*roundCharacters*roundCharacters + roundCharacters*((charBlock*BLOCK_SIZE)+ty) + gx];
+       barrier(CLK_LOCAL_MEM_FENCE);
+       for (int myChar = 0; myChar < MIN(BLOCK_SIZE, (characters-cChar)); myChar++)
+       {
+           sum += childScratch[ty][myChar] * modelScratch[myChar][tx];
+           childSum += childScratch[ty][myChar];
+       }
+       barrier(CLK_LOCAL_MEM_FENCE);
+       cChar += BLOCK_SIZE;
+   }
+   while (childSum < 1 && childSum != 0)
+   {
+       childSum *= scalar;
+       sum *= scalar;
+       scaleScratch++;
+   }
+   scale += scaleScratch;
+   privateParentScratch *= sum;
+   if (gy < sites && gx < characters)
+   {
+       scalings     [parentCharacterIndex]  = scale;
+       root_scalings[gy*roundCharacters+gx] = scale;
+       node_cache   [parentCharacterIndex]  = privateParentScratch;
+       root_cache   [gy*roundCharacters+gx] = privateParentScratch;
+   }
+}
+__kernel void ResultKernel (   __global int* freq_cache,                   // argument 0
+                               __global float* prob_cache,                 // argument 1
+                               __global fpoint* result_cache,              // argument 2
+                               __global float* root_cache,                 // argument 3
+                               __global int* root_scalings,                // argument 4
+                               long sites,                                 // argument 5
+                               long roundCharacters,                       // argument 6
+                               float scalar,                               // argument 7
+                               long characters                             // argument 8
+                           )
+{
+   // shrink the work group to sites, rather than sites x characters
+   #ifdef __GPUResults__
+   int site = get_global_id(0);
+   int localSite = get_local_id(0);
+   __local fpoint resultScratch[BLOCK_SIZE*BLOCK_SIZE];
+   resultScratch[localSite] = 0.0;
+   while (site < sites)
+   {
+       result_cache[site] = 0.0;
+       fpoint acc = 0.0;
+       int scale = root_scalings[site*roundCharacters];
+       for (int rChar = 0; rChar < characters; rChar++)
+       {
+           acc += root_cache[site*roundCharacters + rChar] * prob_cache[rChar];
+       }
+       //resultScratch[localSite] += (native_log(acc)-scale*native_log(scalar)) * freq_cache[site];
+       resultScratch[localSite] += (log(acc)-scale*log(scalar)) * freq_cache[site];
+       //result_cache[site] += (log(acc)-scale*log(scalar)) * freq_cache[site];
+       site += get_global_size(0);
+   }
+   barrier(CLK_LOCAL_MEM_FENCE);
+   for (int offset = get_local_size(0)/2; offset > 0; offset >>= 1)
+   {
+       if (localSite < offset)
+       {
+           fpoint other = resultScratch[localSite + offset];
+           fpoint mine  = resultScratch[localSite];
+           resultScratch[localSite] = mine+other;
+       }
+       barrier(CLK_LOCAL_MEM_FENCE);
+   }
+   // TODO: this would probably be faster if I saved them further apart to reduce bank conflicts
+   if (localSite == 0) result_cache[get_group_id(0)] = resultScratch[0];
+   #else
+   if (get_global_id(0) != 0) return;
+   int site = get_global_id(1);
+   result_cache[site] = 0.0;
+   if (get_group_id(1) >= get_local_size(0)*get_local_size(1)) return;
+   while (site < sites)
+   {
+       float acc = 0.0;
+       int scale = root_scalings[site*roundCharacters];
+       for (int rChar = 0; rChar < characters; rChar++)
+       {
+           acc += root_cache[site*roundCharacters + rChar] * prob_cache[rChar];
+       }
+       result_cache[site] += (native_log(acc)-scale*native_log(scalar)) * freq_cache[site];
+       site += get_local_size(0)*get_local_size(1);
+   }
+   barrier(CLK_LOCAL_MEM_FENCE);
+   #endif
+   /*
+   */
+}
+__kernel void ReductionKernel ( __global double* result_cache               // argument 1
+                           )
+{
+   int groupNum = get_local_id(0);
+   __local double resultScratch[BLOCK_SIZE*BLOCK_SIZE];
+   resultScratch[groupNum] = result_cache[groupNum];
+   barrier(CLK_LOCAL_MEM_FENCE);
+   for (int offset = get_local_size(0)/2; offset > 0; offset >>= 1)
+   {
+       if (groupNum < offset)
+       {
+           double other = resultScratch[groupNum + offset];
+           double mine  = resultScratch[groupNum];
+           double sum  = mine + other;
+				//if (offset > 1)										
+           	resultScratch[groupNum]  = sum;
+				//else										
+			//{
+           //	resultScratch[2]  = mine;
+           //	resultScratch[3]  = other;
+           //	resultScratch[4]  = (sum);
+       	//}
+       }
+       barrier(CLK_LOCAL_MEM_FENCE);
+   }
+   result_cache[groupNum] = resultScratch[groupNum];
+   //
+   /*
+   if (get_group_id(0) != 0) return;
+   if (get_group_id(1) != 0) return;
+   int groupDim = get_local_size(0)*get_local_size(1);
+   int groupNum = get_local_id(1)*get_local_size(0)+get_local_id(0);
+   __local float resultScratch[BLOCK_SIZE*BLOCK_SIZE];
+   resultScratch[groupNum] = result_cache[groupNum];
+   //result_cache[groupNum] = 0.f;
+   barrier(CLK_LOCAL_MEM_FENCE);
+   for (int offset = groupDim/2; offset > 0; offset >>= 1)
+   {
+   //int offset = groupDim/2;
+       if (groupNum < offset)
+       {
+           float other = resultScratch[groupNum + offset];
+           float mine  = resultScratch[groupNum];
+				if (offset > 1)	
+           	resultScratch[groupNum]  = mine + other;
+				else		
+			{
+           	resultScratch[2]  = mine;
+           	resultScratch[3]  = other;
+       	}
+           //resultScratch[groupNum + offset]  = 0.f;
+       }
+       barrier(CLK_LOCAL_MEM_FENCE);
+   }
+   //if (groupNum == 0) result_cache[0] = resultScratch[0];
+   result_cache[groupNum] = resultScratch[groupNum];
+   */
+}
diff --git a/src/utils/hyphyunixutils.cpp b/src/utils/hyphyunixutils.cpp
new file mode 100644
index 0000000..aeaf74f
--- /dev/null
+++ b/src/utils/hyphyunixutils.cpp
@@ -0,0 +1,348 @@
+#include <stdio.h>
+#include "likefunc.h"
+
+
+
+#ifndef __HYPHY_NO_CURL__
+//#define __HYPHYCURL__
+#endif
+
+#ifdef  __HYPHYCURL__
+#include <curl/curl.h>
+#endif
+
+#ifdef          __HYPHYMPI__
+_String         preserveSlaveNodeState ("PRESERVE_SLAVE_NODE_STATE"),
+                MPI_NEXUS_FILE_RETURN  ("MPI_NEXUS_FILE_RETURN");
+
+int             _hy_mpi_node_rank;
+
+void            mpiNormalLoop    (int, int, _String &);
+void            mpiOptimizerLoop (int, int);
+
+void            mpiBgmLoop (int, int);
+_SimpleList     mpiNodesThatCantSwitch;
+#endif
+
+
+//_________________________________________________________________________
+
+size_t url2File   (void *ptr, size_t size, size_t nmemb, void *stream)
+{
+    return fwrite (ptr, size, nmemb, (FILE*)stream);
+}
+
+//_________________________________________________________________________
+
+size_t url2String (void *ptr, size_t size, size_t nmemb, void *stream)
+{
+    _String * s = (_String*)stream;
+    char    * p = (char*)ptr;
+
+    for (unsigned long k=0; k<size*nmemb; k++) {
+        (*s) << p[k];
+    }
+
+    return size*nmemb;
+}
+
+//_________________________________________________________________________
+
+bool    Get_a_URL (_String& urls, _String* fileName)
+{
+#ifdef __HYPHYCURL__
+    CURL *curl;
+    CURLcode res ;
+    curl = curl_easy_init ();
+    FILE   * f = nil;
+    _String* s = nil;
+    char cErr [CURL_ERROR_SIZE+1];
+    if(curl) {
+        if (fileName) {
+            f = fopen (fileName->sData,"wb");
+            if (!f) {
+                urls = _String ("Failed to open ") & *fileName & " for writing";
+                return false;
+            }
+        } else {
+            s = new _String (8192, true);
+            checkPointer (s);
+        }
+
+        curl_easy_setopt (curl, CURLOPT_URL, urls.sData );
+        curl_easy_setopt (curl, CURLOPT_ERRORBUFFER, cErr);
+
+        //Do not check peer certificate, since we only ever get urls
+        curl_easy_setopt (curl, CURLOPT_SSL_VERIFYPEER, 0);
+        curl_easy_setopt (curl, CURLOPT_SSL_VERIFYHOST, 0);
+        
+        if (f) {
+            curl_easy_setopt (curl, CURLOPT_FILE, (void*)f);
+        } else {
+            curl_easy_setopt (curl, CURLOPT_FILE, (void*)s);
+        }
+
+        _String ver (GetVersionString());
+        curl_easy_setopt (curl, CURLOPT_USERAGENT, ver.sData);
+        //curl_easy_setopt (curl, CURLOPT_VERBOSE, 1);
+        curl_easy_setopt (curl, CURLOPT_WRITEFUNCTION, (void*)(f?url2File:url2String));
+        _Parameter vbl = 0.0;
+        checkParameter (VerbosityLevelString,vbl,0.0);
+        if (vbl<0.5) {
+            curl_easy_setopt (curl,CURLOPT_NOPROGRESS,1);
+        }
+        res = curl_easy_perform (curl);
+        curl_easy_cleanup (curl);
+
+        if (f) {
+            fclose (f);
+        } else {
+            s->Finalize();
+            urls = *s;
+            DeleteObject (s);
+        }
+        if (!res) {
+            return true;
+        }
+    } else {
+        urls = "Failed to initialize CURL object";
+        return false;
+    }
+    urls = _String ("CURL error:") & (long)res & "." & cErr;
+    return false;
+#else
+    urls = "This feature requires libcurl";
+    return false;
+#endif
+}
+
+#ifndef __HYPHY_GTK__
+
+//____________________________________________________________________________________
+
+_String*    StringFromConsole   (bool)
+{
+    _String * returnme = new _String (32L, true);
+#if not defined __HEADLESS__ && not defined _MINGW32_MEGA_
+    int       readAChar;
+    while    ((readAChar = getc(stdin)) != '\n') {
+        if (readAChar == EOF) {
+            CheckReceptacleAndStore (&hasEndBeenReached,empty,false,new _Constant (1.), false);
+            break;
+        }
+        *returnme << readAChar;
+    }
+#else
+    WarnError ("Unhandled standard input interaction in StringFromConsole for headless HyPhy");
+    return NULL;
+#endif
+    returnme->Finalize ();
+    return returnme;
+}
+
+//__________________________________________________________________________________
+
+void    StringToConsole (_String & s,  _SimpleList *)
+{
+    BufferToConsole ((const char*)s.sData);
+}
+
+
+//__________________________________________________________________________________
+
+void    BufferToConsole (const char* s, _SimpleList *)
+{
+#ifdef __HYPHYMPI__
+    if (_hy_mpi_node_rank == 0)
+#endif
+#ifdef __HEADLESS__
+        if (globalInterfaceInstance) {
+            _String st (s);
+            globalInterfaceInstance->PushOutString(&st);
+        }
+#else
+        printf ("%s",s);
+#endif
+}
+
+//__________________________________________________________________________________
+
+void    NLToConsole (void)
+{
+    BufferToConsole ("\n");
+}
+
+#endif
+
+#ifdef __HYPHYMPI__
+
+//__________________________________________________________________________________
+void mpiNormalLoop    (int rank, int size, _String & baseDir)
+{
+    long         senderID = 0;
+
+    ReportWarning ("[MPI] Entered mpiNormalLoop");
+
+    _String* theMessage     = MPIRecvString (-1,senderID),  // listen for messages from any node
+             * resStr        = nil;
+
+    while (theMessage->sLength) {
+        setParameter    (mpiNodeID,    (_Parameter)rank);
+        setParameter    (mpiNodeCount, (_Parameter)size);
+
+        //ReportWarning (*theMessage);
+        DeleteObject (resStr);
+        resStr       = nil;
+        if (theMessage->startswith (mpiLoopSwitchToOptimize) ) {
+            hyphyMPIOptimizerMode   = theMessage->Cut(mpiLoopSwitchToOptimize.sLength,-1).toNum();
+
+            ReportWarning           (_String("[MPI] Switched to mpiOptimizer loop with mode ") & hyphyMPIOptimizerMode);
+            MPISendString           (mpiLoopSwitchToOptimize,senderID);
+            mpiOptimizerLoop        (rank,size);
+            ReportWarning           ("[MPI] Returned from mpiOptimizer loop");
+            hyphyMPIOptimizerMode   = _hyphyLFMPIModeNone;
+            pathNames               && & baseDir;
+        } else if ( theMessage->Equal (&mpiLoopSwitchToBGM) ) {
+            ReportWarning       ("[MPI] Received signal to switch to mpiBgmLoop");
+            MPISendString       (mpiLoopSwitchToBGM, senderID); // feedback to source to confirm receipt of message
+            mpiBgmLoop          (rank, size);
+            ReportWarning       ("[MPI] Returned from mpiBgmLoop");
+        } else {
+            if (theMessage->beginswith ("#NEXUS")) {
+                _String             msgCopy (*theMessage);
+                ReportWarning       ("[MPI] Received a function to optimize");
+                ReadDataSetFile     (nil,true,theMessage);
+                ReportWarning       ("[MPI] Done with the optimization");
+                _Variable*          lfName = FetchVar(LocateVarByName(MPI_NEXUS_FILE_RETURN));
+
+                if (lfName) {
+                    resStr = (_String*)(lfName->Compute()->toStr());
+                } else {
+                    _FString        *lfID = (_FString*)FetchObjectFromVariableByType (&lf2SendBack, STRING);
+
+                    if (!lfID) {
+                        FlagError (_String("[MPI] Malformed MPI likelihood function optimization request - did not specify the LF name to return in variable ") & lf2SendBack & ".\n\n\n" );
+                        break;
+                    }
+
+                    long f = likeFuncNamesList.Find (lfID->theString);
+
+                    if (f<0) {
+                        FlagError ("[MPI] Malformed MPI likelihood function optimization request - LF name to return did not refer to a well-defined likelihood function.\n\n\n");
+                        break;
+                    }
+                    _Parameter      pv;
+                    checkParameter (shortMPIReturn, pv ,0);
+                    resStr       = (_String*)checkPointer(new _String (1024L,true));
+                    ((_LikelihoodFunction*)likeFuncList (f))->SerializeLF(*resStr,pv>0.5?_hyphyLFSerializeModeShortMPI:_hyphyLFSerializeModeLongMPI);
+                    resStr->Finalize();
+                }
+            } else {
+                _ExecutionList exL (*theMessage);
+                _PMathObj res = exL.Execute();
+                resStr = res?(_String*)res->toStr():new _String ("0");
+            }
+
+            checkPointer (resStr);
+            MPISendString(*resStr,senderID);
+
+            _Parameter      keepState = 0.0;
+            checkParameter  (preserveSlaveNodeState, keepState, 0.0);
+
+            if (keepState < 0.5) {
+                PurgeAll (true);
+                pathNames && & baseDir;
+            }
+        }
+        DeleteObject (theMessage);
+        theMessage = MPIRecvString (-1,senderID);
+    }
+    /*MPISendString(empty,senderID);*/
+    DeleteObject (resStr);
+    DeleteObject (theMessage);
+}
+
+//__________________________________________________________________________________
+void mpiOptimizerLoop (int rank, int size)
+{
+    long         senderID = 0;
+
+    ReportWarning (_String ("[MPI] Node:") & (long)rank & " is ready for MPIParallelOptimizer tasks");
+
+    if (hyphyMPIOptimizerMode == _hyphyLFMPIModePartitions) {
+        ReportWarning ("[MPI] MPI Partitions mode");
+    }
+
+    //printf ("Node %d waiting for a string\n", rank);
+    _String* theMessage = MPIRecvString (-1,senderID);
+    while (theMessage->sLength) {
+        if (theMessage->beginswith ("#NEXUS")) {
+            //ReportWarning (*theMessage);
+            ReadDataSetFile (nil,true,theMessage);
+            if (likeFuncNamesList.lLength!=1) {
+                FlagError ("[MPI] Malformed MPI likelihood function paraller optimizer startup command. Exactly ONE valid LF must be defined.n\n\n");
+                break;
+            }
+
+            // send back the list of independent variables
+
+            _LikelihoodFunction * theLF = (_LikelihoodFunction*)likeFuncList (0);
+            if (hyphyMPIOptimizerMode == _hyphyLFMPIModeREL && theLF->CountObjects (4)) {
+                FlagError (_String("[MPI] Likelihood functions spawned off to slave MPI nodes can't have category variables.n\n\n"));
+                break;
+            }
+
+            _SimpleList* ivl = & theLF->GetIndependentVars();
+            _String      variableSpec (128L, true);
+
+            (variableSpec) << LocateVar(ivl->lData[0])->GetName();
+
+            for (long kk = 1; kk < ivl->lLength; kk++) {
+                (variableSpec) << ';';
+                (variableSpec) << LocateVar(ivl->lData[kk])->GetName();
+            }
+            variableSpec.Finalize();
+            ReportWarning         (_String("[MPI] Sending back the following variable list\n") & variableSpec);
+            MPISendString         (variableSpec,senderID);
+            theLF->PrepareToCompute();
+            theLF->MPI_LF_Compute (senderID, !(hyphyMPIOptimizerMode == _hyphyLFMPIModeREL ||
+                                               hyphyMPIOptimizerMode  == _hyphyLFMPIModeSiteTemplate));
+            theLF->DoneComputing();
+            PurgeAll (true);
+        }
+        DeleteObject (theMessage);
+        theMessage = MPIRecvString (-1,senderID);
+    }
+    DeleteObject (theMessage);
+}
+
+
+//__________________________________________________________________________________
+void mpiBgmLoop (int rank, int size)
+{
+    long        senderID    = 0;
+    _String *   resStr      = nil;
+
+    ReportWarning (_String ("MPI Node:") & (long)rank & " is ready for MPIBgmCacheNodeScores tasks");
+
+    // receive serialized Bgm
+    _String* theMessage = MPIRecvString (-1, senderID);
+
+    while (theMessage->sLength) {
+        _ExecutionList  exL (*theMessage);
+        _PMathObj       res = exL.Execute();    // should send this process into CacheNodeScores()
+
+        resStr = res ? (_String*)res->toStr() : new _String ("0");
+        ReportWarning (_String ("MPI Node: ") & (long)rank & " executed HBL with result:\n" & resStr);
+
+        if (bgmNamesList.lLength < 1) {
+            _String errMsg ("Malformed HBL. No valid BGM has been defined.\n");
+            FlagError (errMsg);
+            break;
+        }
+    }
+
+    DeleteObject (theMessage);
+}
+#endif
+
diff --git a/tests/gtests/ut_avllists.cpp b/tests/gtests/ut_avllists.cpp
new file mode 100755
index 0000000..ac49b30
--- /dev/null
+++ b/tests/gtests/ut_avllists.cpp
@@ -0,0 +1,623 @@
+/*
+ *  ut_lists.cpp
+ *  HyPhyXCode
+ *
+ *  Created by Steven Weaver on 6/17/11.
+ *  Copyright 2011 __MyCompanyName__. All rights reserved.
+ *
+ */
+
+//#include <tr1/tuple>
+#include <iostream>
+#include "gtest/gtest.h"
+#include "ut_avllists.h"
+#include "avllist.h"
+#include "avllistx.h"
+#include "avllistxl.h"
+#include "hy_strings.h"
+#include "baseobj.h"
+#include <stdio.h>
+#include <stdlib.h>
+#include <time.h>
+#include <math.h>
+
+_List createAVLStrList() {
+
+    _List str_list;
+
+    str_list.AppendNewInstance(new _String("zero"));
+    str_list.AppendNewInstance(new _String("one"));
+    str_list.AppendNewInstance(new _String("two"));
+    str_list.AppendNewInstance(new _String("three"));
+    str_list.AppendNewInstance(new _String("four"));
+    str_list.AppendNewInstance(new _String("five"));
+    str_list.AppendNewInstance(new _String("six"));
+
+    return str_list;
+}
+
+namespace
+{
+
+// The fixture for testing class Foo.
+class AVLListTest : public ::testing::Test
+{
+
+protected:
+    // You can remove any or all of the following functions if its body
+    // is empty.
+
+    AVLListTest() {
+        // You can do set-up work for each test here.
+    }
+
+    virtual ~AVLListTest() {
+        // You can do clean-up work that doesn't throw exceptions here.
+    }
+
+    // If the constructor and destructor are not enough for setting up
+    // and cleaning up each test, you can define the following methods:
+
+    virtual void SetUp() {
+        // Code here will be called immediately after the constructor (right
+        // before each test).
+    }
+
+    virtual void TearDown() {
+        // Code here will be called immediately after each test (right
+        // before the destructor).
+    }
+
+};
+
+class AVLListXTest : public ::testing::Test
+{
+
+protected:
+    // You can remove any or all of the following functions if its body
+    // is empty.
+
+    AVLListXTest() {
+        // You can do set-up work for each test here.
+    }
+
+    virtual ~AVLListXTest() {
+        // You can do clean-up work that doesn't throw exceptions here.
+    }
+
+    // If the constructor and destructor are not enough for setting up
+    // and cleaning up each test, you can define the following methods:
+
+    virtual void SetUp() {
+        // Code here will be called immediately after the constructor (right
+        // before each test).
+    }
+
+    virtual void TearDown() {
+        // Code here will be called immediately after each test (right
+        // before the destructor).
+    }
+
+};
+
+class AVLListXLTest : public ::testing::Test
+{
+
+protected:
+    // You can remove any or all of the following functions if its body
+    // is empty.
+
+    AVLListXLTest() {
+        // You can do set-up work for each test here.
+    }
+
+    virtual ~AVLListXLTest() {
+        // You can do clean-up work that doesn't throw exceptions here.
+    }
+
+    // If the constructor and destructor are not enough for setting up
+    // and cleaning up each test, you can define the following methods:
+
+    virtual void SetUp() {
+        // Code here will be called immediately after the constructor (right
+        // before each test).
+    }
+
+    virtual void TearDown() {
+        // Code here will be called immediately after each test (right
+        // before the destructor).
+    }
+
+};
+
+TEST_F(AVLListTest,FindTest){
+    //AVL List always takes a pointer to a SimpleList
+    //Keeps going down through right children until lData is 0
+    long info; 
+    _SimpleList sl; 
+
+    //sl.Populate(4,1,2);
+    _AVLList al(&sl);
+
+    for(int i=0; i<=10; i++) {
+        al.Insert((BaseRef)i, 0, true, false);    
+    }
+    
+    info = al.Find((BaseRef)3);
+    EXPECT_EQ(3,info);
+ }
+
+TEST_F(AVLListTest,FindLongTest){
+    //AVL List always takes a pointer to a SimpleList
+    //Keeps going down through right children until lData is 0
+    long info; 
+    _SimpleList sl; 
+
+    _AVLList al(&sl);
+
+    for(int i=0; i<=10; i++) {
+        al.Insert((BaseRef)i, 0, true, false);    
+    }
+    
+    info = al.FindLong(3);
+    EXPECT_EQ(3,info);
+}
+
+TEST_F(AVLListTest,FindBestTest){
+    //AVL List always takes a pointer to a SimpleList
+    //Keeps going down through right children until lData is 0
+    long info; 
+    _SimpleList sl; 
+
+    _AVLList al(&sl);
+
+    for(int i=0; i<=10; i++) {
+        al.Insert((BaseRef)i, 0, true, false);    
+    }
+    
+    info = al.FindLong(3);
+    EXPECT_EQ(3,info);
+}
+
+TEST_F(AVLListTest,NextTest){
+
+    //AVL List always takes a pointer to a SimpleList
+    //Keeps going down through right children until lData is 0
+    long info; 
+    _SimpleList sl; 
+    _SimpleList hist;
+
+    _AVLList al(&sl);
+
+    for(int i=0; i<=10; i++) {
+        al.Insert((BaseRef)i, 0, true, false);    
+    }
+    
+    info = al.Next(3, hist);
+    EXPECT_EQ(4,info);
+
+}
+
+TEST_F(AVLListTest,PrevTest){
+
+    //AVL List always takes a pointer to a SimpleList
+    //Keeps going down through right children until lData is 0
+    long info; 
+    _SimpleList sl; 
+    _SimpleList hist;
+
+    _AVLList al(&sl);
+
+    for(int i=0; i<=10; i++) {
+        al.Insert((BaseRef)i, 0, true, false);    
+    }
+    
+    info = al.Prev(3, hist);
+    EXPECT_EQ(2,info);
+
+}
+
+TEST_F(AVLListTest,FirstTest){
+    //AVL List always takes a pointer to a SimpleList
+    //Keeps going down through left children until lData is 0
+
+    long index; 
+    _SimpleList sl; 
+    _AVLList al(&sl);
+
+    for(int i=0; i<=10; i++) {
+        al.Insert((BaseRef)i, 0, true, false);    
+    }
+
+    index = al.First();
+    EXPECT_EQ(0,index);
+
+}
+
+TEST_F(AVLListTest,LastTest){
+
+    //AVL List always takes a pointer to a SimpleList
+    //Keeps going down through left children until lData is 0
+    long index; 
+    _SimpleList sl; 
+    _AVLList al(&sl);
+
+    for(int i=0; i<=10; i++) {
+        al.Insert((BaseRef)i, 0, true, false);    
+    }
+
+    index = al.Last();
+    EXPECT_EQ(10,index);
+}
+
+TEST_F(AVLListTest,GetByIndexTest){
+    //AVL List always takes a pointer to a SimpleList
+    //Keeps going down through right children until lData is 0
+    long info; 
+    _SimpleList sl; 
+
+    _AVLList al(&sl);
+
+    for(int i=0; i<=10; i++) {
+        al.Insert((BaseRef)i, 0, true, false);    
+    }
+    
+    info = al.GetByIndex(3);
+    EXPECT_EQ(3,info);
+}
+
+TEST_F(AVLListTest,ReorderListTest){
+
+    long info; 
+    _SimpleList sl,sl2;
+    _AVLList al(&sl);
+    
+    al.Insert((BaseRef)5, 0, true, false);
+    al.Insert((BaseRef)3, 0, true, false);
+    al.Insert((BaseRef)7, 0, true, false);
+    al.Insert((BaseRef)1, 0, true, false);
+    al.Insert((BaseRef)9, 0, true, false);
+    
+    //A call to Reorderlist may be
+    al.ReorderList(&sl2);
+    EXPECT_EQ(3,sl2[0]);
+}
+
+/*
+ *TEST_F(AVLListTest,ConsistencyCheckTest){
+ *    //Checks to see if it is a valid AVL tree
+ *
+ *    long info; 
+ *    _SimpleList sl; 
+ *
+ *    sl.Populate(4,1,2);
+ *    _AVLList al(&sl);
+ *
+ *    //A call to Reorderlist may be
+ *    al.ConsistencyCheckTest();
+ *
+ *    EXPECT_EQ(1,1);
+ *
+ *}
+ */
+
+
+TEST_F(AVLListTest,TraverserTest){
+
+    long info; 
+    long t = 5;
+    long r = 0;
+
+    _SimpleList sl,sl2;
+    _AVLList al(&sl);
+
+    al.Insert((BaseRef)5, 0, true, false);
+    al.Insert((BaseRef)3, 0, true, false);
+    al.Insert((BaseRef)7, 0, true, false);
+    al.Insert((BaseRef)1, 0, true, false);
+    al.Insert((BaseRef)9, 0, true, false);
+
+    //A call to Reorderlist may be
+    al.Traverser(sl2, t, r);
+    EXPECT_EQ(0,sl2[0]);
+}
+
+TEST_F(AVLListTest,toStrTest){
+
+    long info;
+    _SimpleList sl;
+
+    _AVLList al(&sl);
+
+    for(int i=0; i<=10; i++) {
+        al.Insert((BaseRef)i, 0, true, false);
+    }
+
+    _String* return_str = (_String*)al.toStr();
+    EXPECT_STREQ("0\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n", return_str->getStr());
+}
+
+TEST_F(AVLListTest,RetrieveTest) {
+    
+    long info; 
+
+    _SimpleList sl; 
+    _AVLList al(&sl);
+
+    for(int i=0; i<=10; i++) {
+        al.Insert((BaseRef)i, 0, true, false);    
+    }
+
+    info = (long)al.Retrieve(3);
+    EXPECT_EQ(3,info);
+}
+
+TEST_F(AVLListTest,ClearTest){
+
+    long info; 
+    _SimpleList sl; 
+
+    _AVLList al(&sl);
+
+    for(int i=0; i<=10; i++) {
+        al.Insert((BaseRef)i, 0, true, false);    
+    }
+
+    al.Clear(false);
+
+    EXPECT_EQ(-1,al.root);
+
+}
+
+TEST_F(AVLListTest,InsertTest){
+    long info; 
+    _SimpleList sl; 
+    _AVLList al(&sl);
+
+    for(int i=0; i<=10; i++) {
+        al.Insert((BaseRef)i, 0, true, false);    
+    }
+
+    al.Insert((BaseRef)13,4,false);
+    EXPECT_EQ(13,al.dataList->lData[11]);
+    
+    al.Insert((BaseRef)13,4,false);
+    EXPECT_FALSE(al.dataList->lData[12]==13);
+}
+
+TEST_F(AVLListTest,InsertDataTest){
+    long info;
+    _SimpleList sl;
+    _AVLList al(&sl);
+
+    long a = al.InsertData((BaseRef)1, 1, false);
+    EXPECT_EQ(0,a);
+    
+    a = al.InsertData((BaseRef)1, 1, false);
+    EXPECT_EQ(1,a);
+}
+
+TEST_F(AVLListTest,HasDataTest){
+    long info; 
+    _SimpleList sl; 
+    _AVLList al(&sl);
+
+    for(int i=0; i<=10; i++) {
+        al.Insert((BaseRef)i, 0, true, false);    
+    }
+
+    EXPECT_EQ(true, al.HasData(2));
+    //Do not understand the fail condition
+    //EXPECT_EQ(false, al.HasData(20));
+}
+
+
+TEST_F(AVLListTest,DeleteTest){
+    long info; 
+    _SimpleList sl; 
+    _AVLList al(&sl);
+
+    for(int i=0; i<=10; i++) {
+        al.Insert((BaseRef)i, 0, true, false);    
+    }
+
+    al.Delete((BaseRef)1,false);
+    EXPECT_EQ(0, al.dataList->lData[1]);
+}
+
+TEST_F(AVLListTest,countitemsTest){
+
+    long info; 
+    _SimpleList sl;
+    _AVLList al(&sl);
+
+    for(int i=0; i<=10; i++) {
+        al.Insert((BaseRef)i, 0, true, false);    
+    }
+    
+    EXPECT_EQ(11, al.countitems());
+}
+
+
+//TEST_F(AVLListXTest,toStrTest){
+
+//    long info; 
+//    _SimpleList sl; 
+
+//    _AVLListX alx(&sl);
+//    _String test_string = _String("house,condo,hyphy");
+//    _String* sub_string = new _String(",");
+
+//    _List* result_list = test_string.Tokenize(sub_string);
+//    _List rl = *result_list;
+//    alx.PopulateFromList(rl);
+
+//    _String* rs = (_String*)alx.toStr();
+//    _String expected("house : 0\ncondo : 1\nhyphy : 2\n"); 
+//    EXPECT_STREQ(expected.getStr(),rs->getStr());
+//}
+
+
+//TEST_F(AVLListXLTest,toStrTest){
+//
+//    long info; 
+//    _SimpleList sl; 
+//
+//    _AVLListXL alxl(&sl);
+//
+//    _String* test = new _String("new");
+//
+//    alxl.xtraD.AppendNewInstance(new _String("zero"));
+//
+//    for(int i=0; i<=10; i++) {
+//        alxl.InsertData((BaseRef)test, 0, true);    
+//    }
+//
+//    _String* rs = (_String*)alxl.toStr();
+//    EXPECT_STREQ("1,2,3,4,5",rs->getStr());
+//
+//}
+
+
+TEST_F(AVLListXLTest,ClearTest){
+
+    long info; 
+    _SimpleList sl; 
+    _AVLList alxl(&sl);
+
+    for(int i=0; i<=10; i++) {
+        alxl.Insert((BaseRef)i, 0, true, false);    
+    }
+
+    alxl.Clear(false);
+    EXPECT_EQ(-1,alxl.root);
+
+}
+
+TEST_F(AVLListXTest,InsertDataTest){
+
+    long info;
+    _SimpleList sl;
+    _AVLListX al(&sl);
+
+    long a = al.InsertData((BaseRef)1, 1, false);
+    EXPECT_EQ(0,a);
+
+}
+
+TEST_F(AVLListXLTest,InsertDataTest){
+
+    long info;
+    _SimpleList sl;
+    _AVLListX al(&sl);
+
+    long a = al.InsertData((BaseRef)1, 1, false);
+    EXPECT_EQ(0,a);
+
+}
+
+
+TEST_F(AVLListXLTest,DeleteXtraTest){
+
+    long info; 
+    _SimpleList sl; 
+
+    _AVLListXL alxl(&sl);
+    _String* xtra_str = new _String("xtra");
+
+    alxl.xtraD.AppendNewInstance(new _String("zero"));
+    alxl.xtraD.AppendNewInstance(new _String("one"));
+    alxl.xtraD.AppendNewInstance(new _String("two"));
+    alxl.xtraD.AppendNewInstance(new _String("three"));
+
+    alxl.SetXtra(0,(BaseRef)xtra_str, false);
+    alxl.DeleteXtra(0);
+
+    //_String* x = (_String*)alxl.GetXtra((long)0);
+    //Can't test without segfaulting
+    EXPECT_EQ("","");
+
+}
+
+TEST_F(AVLListXTest,DeleteXtraTest){
+     //It seems as though if you don't use a pointer to 
+    long info; 
+    _SimpleList sl; 
+
+    _AVLListX alx(&sl);
+    _String test_string = _String("house,condo,hyphy");
+    _String* sub_string = new _String(",");
+
+    _List* result_list = test_string.Tokenize(sub_string);
+    _List rl = *result_list;
+
+    alx.PopulateFromList(rl);
+
+    alx.SetXtra(0,13);
+    alx.DeleteXtra((long)0);
+    long x = alx.GetXtra((long)0);
+    EXPECT_EQ(-1,x);
+}
+
+TEST_F(AVLListXTest,PopulateFromListTest){
+
+    //It seems as though if you don't use a pointer to 
+    //a list, you are going to segfault
+
+    _SimpleList sl;
+    _AVLListX alx(&sl);
+    
+    _String test_string = _String("house,condo,hyphy");
+    _String* sub_string = new _String(",");
+    
+    _List* result_list = test_string.Tokenize(sub_string);
+    
+    alx.PopulateFromList(*result_list);
+    _String* return_str = (_String*)alx.dataList->lData[2];
+    EXPECT_STREQ("hyphy", return_str->getStr());
+}
+
+
+
+
+TEST_F(AVLListXTest,SetAndGetXtraTest){
+     //It seems as though if you don't use a pointer to 
+
+    long info; 
+    _SimpleList sl; 
+
+    _AVLListX alx(&sl);
+    _String test_string = _String("house,condo,hyphy");
+    _String* sub_string = new _String(",");
+
+    _List* result_list = test_string.Tokenize(sub_string);
+    _List rl = *result_list;
+
+    alx.PopulateFromList(rl);
+
+    alx.SetXtra(0,13);
+    long x = alx.GetXtra((long)0);
+    EXPECT_EQ(13,x);
+}
+
+
+TEST_F(AVLListXLTest,SetAndGetXtraTest){
+
+    long info; 
+    _SimpleList sl; 
+
+    _AVLListXL alxl(&sl);
+    _String* xtra_str = new _String("xtra");
+
+    alxl.xtraD.AppendNewInstance(new _String("zero"));
+    alxl.xtraD.AppendNewInstance(new _String("one"));
+    alxl.xtraD.AppendNewInstance(new _String("two"));
+    alxl.xtraD.AppendNewInstance(new _String("three"));
+
+    alxl.SetXtra(0,(BaseRef)xtra_str, false);
+
+    _String* x = (_String*)alxl.GetXtra((long)0);
+    EXPECT_STREQ("xtra",x->getStr());
+}
+
+}
diff --git a/tests/gtests/ut_avllists.h b/tests/gtests/ut_avllists.h
new file mode 100755
index 0000000..e69de29
diff --git a/tests/gtests/ut_list.cpp b/tests/gtests/ut_list.cpp
new file mode 100755
index 0000000..7c7895c
--- /dev/null
+++ b/tests/gtests/ut_list.cpp
@@ -0,0 +1,456 @@
+/*
+ *  ut_lists.cpp
+ *  HyPhyXCode
+ *
+ *  Created by Steven Weaver on 6/17/11.
+ *
+ */
+
+//#include <tr1/tuple>
+#include <iostream>
+#include "gtest/gtest.h"
+#include "ut_lists.h"
+
+#include "hy_strings.h"
+#include "list.h"
+
+#include "baseobj.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <time.h>
+#include <math.h>
+
+using ::testing::TestWithParam;
+using ::testing::Values;
+using ::testing::Range;
+//using ::testing::Combine;
+
+//_List createStrList();
+//_SimpleList createIntList(int n, _SimpleList& int_list);
+
+_List createStrList() {
+
+    _List str_list;
+
+    str_list.AppendNewInstance(new _String("zero"));
+    str_list.AppendNewInstance(new _String("one"));
+    str_list.AppendNewInstance(new _String("two"));
+    str_list.AppendNewInstance(new _String("three"));
+    str_list.AppendNewInstance(new _String("four"));
+    str_list.AppendNewInstance(new _String("five"));
+    str_list.AppendNewInstance(new _String("six"));
+
+    return str_list;
+}
+
+void createIntList(int n, _SimpleList& int_list) {
+
+    for(int i=0;i<=n;i++) {
+        int_list << i;
+    }
+}
+
+namespace
+{
+
+// The fixture for testing class Foo.
+class ListTest : public ::testing::Test
+{
+
+protected:
+    // You can remove any or all of the following functions if its body
+    // is empty.
+
+    ListTest() {
+        // You can do set-up work for each test here.
+    }
+
+    virtual ~ListTest() {
+        // You can do clean-up work that doesn't throw exceptions here.
+    }
+
+    // If the constructor and destructor are not enough for setting up
+    // and cleaning up each test, you can define the following methods:
+
+    virtual void SetUp() {
+        // Code here will be called immediately after the constructor (right
+        // before each test).
+    }
+
+    virtual void TearDown() {
+        // Code here will be called immediately after each test (right
+        // before the destructor).
+    }
+
+};
+
+
+TEST_F(ListTest,_NothingListTest){
+    _List list = _List();
+    EXPECT_EQ(list.lLength,0);
+}
+
+TEST_F(ListTest,_LengthConstructorListTest){
+    _List str_list = createStrList();
+    unsigned long l = 7;
+    EXPECT_EQ(str_list.lLength,l);
+}
+
+TEST_F(ListTest,_StackCopyConstructorListTest){
+
+    _List str_list = createStrList();
+    _List list = _List(str_list, 0, 4); 
+
+    _String* return_str = (_String*)list[4];
+    EXPECT_STREQ("four", return_str->getStr());
+
+}
+
+TEST_F(ListTest,_SubStrConstructorListTest){
+
+    _String* str = new _String(",one,two,three");
+    _List list = _List((BaseRef)str, ','); 
+    _String* return_string = (_String*)list[1];
+    EXPECT_STREQ("one", return_string->getStr());
+}
+
+TEST_F(ListTest,_DataConstructorListTest){
+    //one member list
+    _String* string = new _String("one");
+    _List list = _List((BaseRef)string);
+    _String* return_string = (_String*)list[0];
+
+    EXPECT_STREQ("one", return_string->getStr());
+
+}
+
+TEST_F(ListTest,paranthesisTest){
+
+    _List str_list = createStrList();
+    _String* return_string = (_String*)str_list(4);
+
+    EXPECT_STREQ("four", return_string->getStr());
+}
+
+TEST_F(ListTest,EqualOpTest){
+
+    _List str_list = createStrList();
+    _List list = _List();
+    list = str_list;
+
+    _String* return_string = (_String*)list[4];
+
+    EXPECT_STREQ("four", return_string->getStr());
+}
+
+TEST_F(ListTest,EqualTest){
+
+    _List str_list = createStrList();
+    _List list = str_list; 
+    _List l2;
+
+    EXPECT_EQ(true,list.Equal(str_list));
+    EXPECT_EQ(true,list==str_list);
+
+    EXPECT_EQ(false,str_list.Equal(l2));
+    list.AppendNewInstance(new _String("zero"));
+    EXPECT_EQ(false,str_list.Equal(list));
+}
+
+TEST_F(ListTest,AmpersandOpTest){
+
+    //Append Operator
+    _List str_list = createStrList();
+    _String string ("one,two,three");
+    _List* list = string.Tokenize(','); 
+
+    _String append_string("four,five,six");
+    _List* append_list = append_string.Tokenize(','); 
+
+    _String expected_string("one,two,three,four,five,six");
+
+    _List* expected_list = expected_string.Tokenize(','); 
+
+    _List result_list = *list & *append_list;
+
+    _String* result_string = (_String*)result_list[0];
+    EXPECT_STREQ("one", result_string->getStr());
+
+
+    _List* l2  = new _List(); 
+    _List* al2 = new _List();
+    _List rl2 = *l2 & *al2;
+    EXPECT_EQ(0, rl2.lLength);
+}
+
+TEST_F(ListTest,Ampersand2OpTest){
+
+    _List str_list = createStrList();
+    _String* str = new _String("one");
+
+    _List result_list = str_list & (_String*)str;
+
+    _String* result_string = (_String*)result_list[result_list.lLength-1];
+
+    EXPECT_STREQ("one",result_string->getStr());
+}
+
+TEST_F(ListTest,DoubleAmpersandOpTest){
+
+    _List str_list = createStrList();
+
+    _String* str = new _String("one");
+    str_list && (_String*)str;
+
+    _String* result_string = (_String*)str_list[str_list.lLength-1];
+    
+    EXPECT_STREQ("one",result_string->getStr());
+
+}
+
+TEST_F(ListTest,DoubleAmpersand2OpTest){
+    _List str_list = createStrList();
+    str_list && "one"; 
+    _String* result_string = (_String*)str_list[str_list.lLength-1];
+    EXPECT_STREQ("one",result_string->getStr());
+}
+
+TEST_F(ListTest,DoubleLessOpTest){
+
+    //Insert Element
+    _List str_list = createStrList();
+    _String* str = new _String("one");
+    str_list << str;
+
+    _String* result_string = (_String*)str_list[str_list.lLength-1];
+    EXPECT_STREQ("one", result_string->getStr());
+}
+
+TEST_F(ListTest,DoubleLess2OpTest){
+    //Append Operator
+
+    _List str_list = createStrList();
+    _String string ("one,two,three");
+
+    _List* list = string.Tokenize(','); 
+
+    _String append_string("four,five,six");
+    _List* append_list = append_string.Tokenize(','); 
+
+    _String* expected_string = new _String("six");
+
+    *list << *append_list;
+
+    _List result_list = *list;
+
+    _String* result_string = (_String*)result_list[5];
+    EXPECT_STREQ(expected_string->getStr(), result_string->getStr());
+
+}
+
+TEST_F(ListTest,AppendNewInstanceTest){
+
+    //Insert Element
+    _List str_list = createStrList();
+    str_list.AppendNewInstance(new _String("one"));
+    _String* result_string = (_String*)str_list[7];
+
+    EXPECT_STREQ("one", result_string->getStr());
+}
+
+TEST_F(ListTest,PlaceTest){
+    //Place Test
+
+    //TODO: Figure out when laLength would be larger than lLength
+    _List str_list = createStrList();
+    str_list.Place(new _String("one"));
+
+    _String* result_string = (_String*)str_list[7];
+    EXPECT_STREQ("one", result_string->getStr());
+}
+
+TEST_F(ListTest,InsertElementTest){
+
+    _List str_list = createStrList();
+    str_list.InsertElement(new _String("one"),3,true);
+    _String* result_string = (_String*)str_list[3];
+    EXPECT_STREQ("one", result_string->getStr());
+}
+
+TEST_F(ListTest,getStrTest){
+    _List str_list = createStrList();
+
+    _String* str = new _String("{zero,one,two,three,four,five,six}");
+    _String* result_string = (_String*)str_list.toStr();
+
+    EXPECT_STREQ(str->getStr(), result_string->getStr());
+}
+
+TEST_F(ListTest, makeDynamicTest){
+    _List str_list = createStrList();
+    _List* dynamic_list = (_List*)str_list.makeDynamic();
+    EXPECT_EQ(7,dynamic_list->lLength);
+}
+
+TEST_F(ListTest,toFileStrTest){
+    //Doesn't need unit tested
+}
+
+
+TEST_F(ListTest,bumpNInstTest){
+    //TODO
+    _List str_list = createStrList();
+    str_list.bumpNInst();
+
+    _String* result_string = (_String*)str_list[3];
+    EXPECT_STREQ("three", result_string->getStr());
+}
+
+TEST_F(ListTest,FindTest){
+    //This cast the object as a string and then checks if it's equal. 
+    //Why do we send in a BaseRef when we could just pass in a _String if it's strings only.
+    _List str_list = createStrList();
+    
+    _String* needle = new _String("two");
+
+    int index = str_list.Find((BaseRef)needle);
+    EXPECT_EQ(2, index);
+
+    index = str_list.Find((BaseRef)"seventeen");
+    EXPECT_EQ(-1, index);
+}
+
+TEST_F(ListTest,FindStringTest){
+    //Find the position of a search string in the list of strings (ONLY)
+    long upTo = -1;
+    _List str_list = createStrList();
+    
+    _String* needle = new _String("two");
+
+    int index = str_list.FindString((BaseRef)needle, 0, false, upTo); 
+    EXPECT_EQ(2, index);
+
+    index = str_list.FindString((BaseRef)needle, 0, true, upTo); 
+    EXPECT_EQ(2, index);
+
+    _String* needle2 = new _String("france");
+    index = str_list.FindString((BaseRef)needle2, 0, true, upTo); 
+    EXPECT_EQ(-1, index);
+
+} 
+
+TEST_F(ListTest,JoinTest){
+    //Append Operator
+    _String* str = new _String("one,two,three");
+    _String* spacer = new _String(";");
+    _List* list = new _List((BaseRef)str, ','); 
+    _String* return_string = (_String*)list->Join((BaseRef)spacer);
+    EXPECT_STREQ("one;two;three", return_string->getStr());
+}
+
+TEST_F(ListTest,BinaryFindTest){
+
+    //Find the position of a search string in the list of strings (ONLY)
+    int upTo = -1;
+    _List str_list = createStrList();
+    _String* needle = new _String("six");
+    int index = str_list.BinaryFind((BaseRef)needle); 
+    EXPECT_EQ(-4, index);
+
+}
+
+TEST_F(ListTest,BinaryInsertTest){
+
+    //TODO: Debug Coverage
+
+    _List str_list = createStrList();
+
+    //Place Test
+    str_list.BinaryInsert((BaseRef)new _String("one"));
+
+    _String* result_string = (_String*)str_list[3];
+    EXPECT_STREQ("three", result_string->getStr());
+}
+
+TEST_F(ListTest,CompareTest){
+    _List str_list = createStrList();
+
+    _String* test = new _String("hyphy");
+    EXPECT_EQ(-1, str_list.Compare((BaseRef)test,1));
+}
+
+TEST_F(ListTest,Compare2Test){
+    _List str_list = createStrList();
+    EXPECT_EQ(1, str_list.Compare((long)0,(long)1));
+}
+
+TEST_F(ListTest,FreeUpMemoryTest){
+    _List str_list = createStrList();
+    EXPECT_EQ(0,str_list.FreeUpMemory(16));
+} 
+
+TEST_F(ListTest,ClearTest){
+
+    _List str_list = createStrList();
+    str_list.InsertElement(new _String("one"),3,true);
+    str_list.Clear(true);
+
+    EXPECT_EQ(0,str_list.lLength);
+} 
+
+
+TEST_F(ListTest,DeleteTest){
+
+    _List str_list = createStrList();
+    str_list.Delete(0);
+    _String* return_string = (_String*)str_list[1];
+    EXPECT_STREQ("two", return_string->getStr());
+} 
+
+TEST_F(ListTest,DeleteListTest){
+    //See also Clear
+    //It looks like this deletes a subset of a list based on a list of indices
+    _List str_list = createStrList();
+    _SimpleList to_delete; 
+    createIntList(3, to_delete);
+
+    str_list.DeleteList(to_delete);
+    EXPECT_EQ(3,str_list.lLength);
+} 
+
+
+TEST_F(ListTest,ReplaceTest){
+
+    _List str_list = createStrList();
+
+    str_list.Replace(1, new _String("help"), false);
+    _String* return_string = (_String*)str_list[1];
+    EXPECT_STREQ("help", return_string->getStr());
+
+    str_list.Replace(1, new _String("two"), false);
+    _String* return_string2 = (_String*)str_list[1];
+    EXPECT_STREQ("two", return_string2->getStr());
+} 
+
+
+TEST_F(ListTest,IntersectTest){
+    // compute the union of two sorted lists
+    // each repeat appears exactly once
+
+    _List str_list = createStrList();
+
+    _List l1 = str_list;
+    _List l2 = str_list;
+    _SimpleList idx; 
+    _SimpleList idx2;
+
+    _List l3;
+    l3.Intersect(l1, l2, &idx, &idx2);
+
+    _String* return_string = (_String*)str_list[1];
+    EXPECT_STREQ("one",return_string->getStr());
+
+}
+
+}
diff --git a/tests/gtests/ut_lists.h b/tests/gtests/ut_lists.h
new file mode 100755
index 0000000..1afed22
--- /dev/null
+++ b/tests/gtests/ut_lists.h
@@ -0,0 +1,8 @@
+/*
+ *  ut_strings.h
+ *  HyPhyXCode
+ *
+ *  Created by Steven Weaver on 6/17/11.
+ *  Copyright 2011 __MyCompanyName__. All rights reserved.
+ *
+ */
diff --git a/tests/gtests/ut_simplelists.cpp b/tests/gtests/ut_simplelists.cpp
new file mode 100755
index 0000000..28a431f
--- /dev/null
+++ b/tests/gtests/ut_simplelists.cpp
@@ -0,0 +1,698 @@
+/*
+ *  ut_lists.cpp
+ *  HyPhyXCode
+ *
+ *  Created by Steven Weaver on 6/17/11.
+ *  Copyright 2011 __MyCompanyName__. All rights reserved.
+ *
+ */
+
+//#include <tr1/tuple>
+#include <iostream>
+#include "gtest/gtest.h"
+#include "ut_simplelists.h"
+
+#include "hy_strings.h"
+#include "simplelist.h"
+
+#include "baseobj.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <time.h>
+#include <math.h>
+
+using ::testing::TestWithParam;
+using ::testing::Values;
+using ::testing::Range;
+//using ::testing::Combine;
+
+
+namespace
+{
+
+// The fixture for testing class Foo.
+class SimpleListTest : public ::testing::Test
+{
+
+protected:
+    // You can remove any or all of the following functions if its body
+    // is empty.
+
+    SimpleListTest() {
+        // You can do set-up work for each test here.
+    }
+
+    virtual ~SimpleListTest() {
+        // You can do clean-up work that doesn't throw exceptions here.
+    }
+
+    // If the constructor and destructor are not enough for setting up
+    // and cleaning up each test, you can define the following methods:
+
+    virtual void SetUp() {
+        // Code here will be called immediately after the constructor (right
+        // before each test).
+    }
+
+    virtual void TearDown() {
+        // Code here will be called immediately after each test (right
+        // before the destructor).
+    }
+
+};
+
+TEST_F(SimpleListTest,_StackCopyConstructorListTest){
+    _SimpleList sl;
+    sl.Populate(4,1,2);
+
+    _SimpleList sl2(sl,(long)-1,(long)-1); 
+    EXPECT_EQ(0,sl2.lLength);
+
+    _SimpleList sl3(sl,(long)1,(long)3); 
+    EXPECT_EQ(3,sl3[0]);
+}
+
+TEST_F(SimpleListTest,_LengthConstructorTest){
+    _SimpleList sl((long)7);
+    EXPECT_EQ(8,sizeof(sl.lData));
+}
+
+TEST_F(SimpleListTest, _PopulateTest){
+    _SimpleList sl; 
+    sl.Populate(4,1,2);
+
+    EXPECT_EQ(4,sl.lLength);
+    EXPECT_EQ(7,sl[3]);
+}
+
+//TEST_F(SimpleListTest, _NormalizeCoordinatesTest){
+//}
+
+TEST_F(SimpleListTest, _BracketOpTest){
+    _SimpleList sl; 
+    sl.Populate(4,1,2);
+
+    EXPECT_EQ(1,sl[0]);
+    EXPECT_EQ(7,sl[3]);
+
+    sl.lLength = 0;
+    EXPECT_EQ(1,sl[7]);
+
+}
+
+TEST_F(SimpleListTest, _ParenthOpTest){
+    _SimpleList sl; 
+    sl.Populate(4,1,2);
+    EXPECT_EQ(7,sl(3));
+
+    //TODO: We need a way to test for warnErrors
+    //EXPECT_EQ(0,sl(10));
+}
+
+TEST_F(SimpleListTest, _EqualOpTest){
+    _SimpleList sl; 
+    sl.Populate(4,1,2);
+
+    _SimpleList sl2((long)0); 
+    sl2 = sl;
+    EXPECT_EQ(3,sl[1]);
+}
+
+TEST_F(SimpleListTest, _DoubleLessOpTest){
+
+    _SimpleList sl;
+    sl.Populate(4,1,2);
+
+    _SimpleList sl2;
+    sl2.Populate(4,1,2);
+
+    sl << sl2;
+    EXPECT_EQ(3,sl[5]);
+
+}
+
+TEST_F(SimpleListTest, _OffsetTest){
+    _SimpleList sl; 
+    sl.Populate(4,1,2);
+    sl.Offset(3);
+    EXPECT_EQ(10,sl[3]);
+}
+
+TEST_F(SimpleListTest, _ElementTest){
+    _SimpleList sl; 
+    sl.Populate(4,1,2);
+    EXPECT_EQ(7,sl.Element(3));
+    EXPECT_EQ(3,sl.Element(-3));
+    EXPECT_EQ(0,sl.Element(-5));
+}
+
+TEST_F(SimpleListTest, _PopTest){
+
+    _SimpleList sl; 
+    sl.Populate(4,1,2);
+    EXPECT_EQ(7,sl.Pop());
+    EXPECT_EQ(3,sl.lLength);
+
+    //Returns a 0
+    _SimpleList sl2;
+    EXPECT_EQ(0,sl2.Pop());
+}
+
+TEST_F(SimpleListTest, _countitemsTest){
+    //TODO: Not camelcased
+    _SimpleList sl; 
+    sl.Populate(4,1,2);
+    EXPECT_EQ(4,sl.countitems());
+}
+
+TEST_F(SimpleListTest, _EqualTest){
+    _SimpleList sl; 
+    sl.Populate(4,1,2);
+
+    _SimpleList sl2; 
+    sl2.Populate(4,1,2);
+
+    _SimpleList sl3;
+    sl3.Populate(4,1,3);
+
+    _SimpleList sl4;
+    sl4.Populate(9,1,3);
+
+    _SimpleList sl5;
+    sl5.Populate(4,15,3);
+
+
+    EXPECT_EQ(true,sl.Equal(sl2));
+    EXPECT_EQ(false,sl.Equal(sl3));
+    EXPECT_EQ(false,sl.Equal(sl4));
+    EXPECT_EQ(false,sl.Equal(sl5));
+}
+
+TEST_F(SimpleListTest, _MergeTest){
+    //TODO: Coverage Testing
+
+    //Takes 4 parameters
+    _SimpleList sl; 
+
+    _SimpleList l1;
+    l1.Populate(4,1,1);
+
+    _SimpleList l2;
+    l2.Populate(4,5,1);
+
+    _SimpleList l3;
+    l3.Populate(12,1,1);
+
+    //List that are automatically going to be filled
+    _SimpleList m1; 
+    _SimpleList m2; 
+
+    sl.Merge(l1,l2,&m1,&m2);
+    EXPECT_EQ(8,sl[8]);
+
+    sl.Merge(l2,l1,&m1,&m2);
+    EXPECT_EQ(8,sl[8]);
+
+    sl.Merge(l2,l3,&m1,&m2);
+    EXPECT_EQ(9,sl[8]);
+
+    sl.Merge(l1,l1,&m1,&m2);
+    EXPECT_EQ(4,sl[8]);
+
+}
+
+
+//TEST_F(SimpleListTest,AmpersandOpTest){
+//    //TODO: Assignment doesn't work approprately
+//    _SimpleList sl((long)4,(long)1,(long)2); 
+//    _SimpleList sl2((long)4,(long)11,(long)2); 
+//    _SimpleList sl3(sl & sl2);
+//
+//    EXPECT_EQ(11,sl[5]);
+//
+//}
+
+TEST_F(SimpleListTest,DoubleGreaterOpTest){
+    //Does the same as lesser than, but no dupes and returns bool
+    _SimpleList sl; 
+    bool r1, r2;
+
+    sl.Populate(4,1,2);
+
+    r1 = sl >> 1; 
+    r2 = sl >> 12; 
+    
+
+    EXPECT_FALSE(r1);
+    EXPECT_TRUE(r2);
+    EXPECT_EQ(12,sl[5]);
+}
+
+
+TEST_F(SimpleListTest, _ListToPartitionStringTest){
+    _SimpleList sl; 
+    sl.Populate(4,1,2);
+
+    _String* returned_string = (_String*)sl.ListToPartitionString();
+    EXPECT_STREQ("1,3,5,7", returned_string->getStr());
+
+    _SimpleList sl2;
+    sl2.Populate(4,1,1);
+
+    _String* returned_string2 = (_String*)sl2.ListToPartitionString();
+    EXPECT_STREQ("1-4", returned_string2->getStr());
+
+    _SimpleList sl3;
+    sl3.Populate(4,1,1);
+    sl3 << (long)7;
+    sl3 << (long)9;
+    sl3 << (long)10;
+    sl3 << (long)11;
+
+    _String* returned_string3 = (_String*)sl3.ListToPartitionString();
+    EXPECT_STREQ("1-4,7,9-11", returned_string3->getStr());
+}
+
+TEST_F(SimpleListTest, _RequestSpaceTest){
+    _SimpleList sl; 
+    sl.Populate(4,1,2);
+    sl.RequestSpace(10);
+    EXPECT_EQ(1,sl[0]);
+}
+
+TEST_F(SimpleListTest, _toStrTest){
+    _SimpleList sl; 
+    sl.Populate(4,1,2);
+    _String* returned_string = (_String*)sl.toStr();
+    EXPECT_STREQ("{1,3,5,7}", returned_string->getStr());
+
+    _SimpleList sl2;
+    sl2.Populate(100,1,1);
+    _String* returned_string2 = (_String*)sl2.toStr();
+    EXPECT_STREQ("{1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100}", returned_string2->getStr());
+
+    _SimpleList sl3;
+    _String* returned_string3 = (_String*)sl3.toStr();
+    EXPECT_STREQ("{}", returned_string3->getStr());
+}
+
+TEST_F(SimpleListTest, _makeDynamicTest){
+
+    _SimpleList sl; 
+    sl.Populate(4,1,2);
+
+    _SimpleList* dynamic_list = (_SimpleList*)sl.makeDynamic();
+    EXPECT_EQ(4,dynamic_list->lLength);
+
+}
+
+TEST_F(SimpleListTest, _MinTest){
+    _SimpleList sl; 
+    sl.Populate(4,1,2);
+
+    long min = sl.Min();
+    EXPECT_EQ(1, min);
+}
+
+TEST_F(SimpleListTest, _MaxTest){
+    _SimpleList sl; 
+    sl.Populate(4,1,2);
+
+    long min = sl.Min();
+    EXPECT_EQ(1, min);
+}
+
+TEST_F(SimpleListTest, _ClearFormulasInListTest){
+    //TODO: Debug Coverage
+    _SimpleList sl;
+    sl.Populate(4,1,2);
+
+    long max = sl.Max();
+    EXPECT_EQ(7, max);
+}
+
+TEST_F(SimpleListTest, _DebugVarListTest){
+    //We don't have to do a UnitTest for this
+}
+
+TEST_F(SimpleListTest, _CountingSortTest){
+    _SimpleList sl; 
+    _SimpleList ordering_list;
+    sl.Populate(4,1,2);
+
+    _SimpleList* returned_list;
+
+    returned_list = sl.CountingSort(20, &ordering_list);
+    long ret = returned_list->Element(1);
+    EXPECT_EQ(1,1);
+}
+
+TEST_F(SimpleListTest, _BinaryInsertTest){
+
+    _SimpleList sl,sl2;
+    long pos;
+
+    sl.Populate(4,1,2);
+    pos = sl.BinaryInsert(4);
+    EXPECT_EQ(2, pos);
+
+    pos = sl2.BinaryInsert(4);
+    EXPECT_EQ(0, pos);
+
+    pos = sl.BinaryInsert(1);
+    EXPECT_EQ(4, pos);
+}
+
+TEST_F(SimpleListTest, _FindTest){
+
+    _SimpleList sl; 
+    sl.Populate(4,1,2);
+
+    long pos = sl.Find(1,3);
+    EXPECT_EQ( -1, pos);
+
+    pos = sl.Find(3,0);
+    EXPECT_EQ( 1, pos);
+
+}
+
+TEST_F(SimpleListTest, _FindSteppingTest){
+
+    _SimpleList sl; 
+    sl.Populate(4,1,2);
+
+    long pos = sl.FindStepping(1,1,3);
+    EXPECT_EQ( -1, pos);
+
+    pos = sl.FindStepping(3,2,0);
+    EXPECT_EQ( -1, pos);
+
+    pos = sl.FindStepping(5,2,0);
+    EXPECT_EQ( 2, pos);
+
+}
+
+TEST_F(SimpleListTest, _FilterRangeTest){
+
+    _SimpleList sl; 
+    sl.Populate(4,1,2);
+
+    sl.FilterRange(2,4);
+    EXPECT_EQ(3, sl[0]);
+
+    sl.FilterRange(4,2);
+    EXPECT_EQ(0, sl.lLength);
+}
+
+TEST_F(SimpleListTest, _BinaryFindTest){
+
+    _SimpleList sl; 
+    long pos;
+
+    sl.Populate(4,1,3);
+    pos = sl.BinaryFind(3,0);
+    EXPECT_EQ( -3, pos);
+
+}
+
+TEST_F(SimpleListTest, _SortTest){
+    _SimpleList sl; 
+    sl.Populate(4,1,2);
+    sl.Sort(false);
+    EXPECT_EQ( 7, sl[0]);
+
+    sl.Sort(true);
+    EXPECT_EQ( 1, sl[0]);
+
+    _SimpleList sl2; 
+    sl2.Populate(20,1,2);
+    sl2.Sort(false);
+    EXPECT_EQ( 39, sl2[0]);
+
+    //Create a worst case scenario for Quick Sort (Already sorted)
+    sl2.Sort(false);
+    EXPECT_EQ( 39, sl2[0]);
+}
+
+
+TEST_F(SimpleListTest, _CompareTest){
+    _SimpleList sl; 
+    sl.Populate(4,1,2);
+
+    long resp = sl.Compare((long)0,(long)1);
+    EXPECT_EQ( -1, resp);
+
+    resp = sl.Compare((long)1,(long)0);
+    EXPECT_EQ( 1, resp);
+
+    resp = sl.Compare((long)1,(long)1);
+    EXPECT_EQ( 0, resp);
+}
+
+TEST_F(SimpleListTest, _ClearTest){
+    _SimpleList sl; 
+    sl.Populate(4,1,2);
+    sl.Clear(true);
+    EXPECT_EQ(0, sl.lLength);
+}
+
+TEST_F(SimpleListTest, _DeleteTest){
+    //TODO: Debug Coverage
+    _SimpleList sl;
+    sl.Populate(4,1,2);
+    sl.Delete(0,true);
+    EXPECT_EQ(3, sl[0]);
+}
+
+TEST_F(SimpleListTest, _TrimMemoryTest){
+
+    _SimpleList sl;
+    sl.Populate(4,1,2);
+    sl.Delete(0,true);
+    EXPECT_EQ(3, sl[0]);
+
+}
+
+TEST_F(SimpleListTest, _DeleteDuplicatesTest){
+    _SimpleList sl; 
+    sl.Populate(4,1,2);
+    sl << 5;
+    sl.Sort(true); 
+    sl.DeleteDuplicates();
+    
+
+    EXPECT_EQ(5, sl[2]);
+    EXPECT_EQ(7, sl[3]);
+}
+
+TEST_F(SimpleListTest, _DeleteListTest){
+
+    _SimpleList sl; 
+    sl.Populate(4,1,2);
+
+    _SimpleList to_delete; 
+    to_delete.Populate(3,0,1);
+
+    sl.DeleteList(to_delete);
+    EXPECT_EQ(7, sl[0]);
+}
+
+TEST_F(SimpleListTest, _DisplaceTest){
+    _SimpleList sl, sl2, sl3;
+    sl.Populate(10,1,1);
+    sl2.Populate(10,1,1);
+    sl3.Populate(10,1,1);
+
+    //TODO: Doesn't work as expected
+    sl.Displace(1,5,1); 
+    EXPECT_EQ(7, sl[1]);
+    EXPECT_EQ(5, sl[5]);
+
+    //Don't do anything
+    sl2.Displace(11,10,1); 
+    EXPECT_EQ(1, sl2[0]);
+
+    //This shouldn't do anything
+    sl3.Displace(-1,25,0);
+    EXPECT_EQ(1, sl3[0]);
+
+}
+
+TEST_F(SimpleListTest, _PermuteWithReplacementTest){
+
+    //TODO: Go through with debugger
+    _SimpleList sl, sl2;
+    sl.Populate(10,1,1);
+    sl2.Populate(10,1,1);
+
+    sl.PermuteWithReplacement(2);
+
+    //Cannot be zero
+    //sl2.PermuteWithReplacement(0);
+    sl2.PermuteWithReplacement(-1);
+
+    EXPECT_EQ(1, 1);
+
+}
+
+TEST_F(SimpleListTest, _PermuteTest){
+
+    //TODO: Go through with debugger
+    _SimpleList sl, sl2; 
+    sl.Populate(10,1,1);
+    sl2.Populate(10,1,1);
+
+    sl.Permute(2);
+
+    //Cannot be zero
+    //sl2.Permute(0);
+
+    //Cannot be negative
+    //sl2.Permute(-1);
+
+    EXPECT_EQ(1, 1);
+
+}
+
+TEST_F(SimpleListTest, _NChooseKTest){
+
+    _SimpleList sl, sl2;
+    _SimpleList state, state2;
+    _SimpleList store, store2;
+
+    long stride = 3;
+    long large_stride = 42;
+
+    bool algorithm = true;
+
+    sl.Populate(10,1,1);
+
+    bool init_test = sl.NChooseKInit(state,store,large_stride,algorithm);
+    EXPECT_EQ(false, init_test);
+    init_test = sl.NChooseKInit(state,store,stride,algorithm);
+    bool choose_test = sl.NChooseK(state,store);
+
+
+    EXPECT_EQ(true, init_test);
+    EXPECT_EQ(true, choose_test);
+
+    //TODO:This doesn't seem very tuple-ly
+    EXPECT_EQ(1,store[0]);
+    EXPECT_EQ(1,store[0]);
+
+}
+
+TEST_F(SimpleListTest, _SwapTest){
+
+    _SimpleList sl; 
+    sl.Populate(10,1,1);
+    sl.Swap(0,1);
+
+    EXPECT_EQ(2,sl[0]);
+    EXPECT_EQ(1,sl[1]);
+}
+
+TEST_F(SimpleListTest, _FlipTest){
+
+    _SimpleList sl; 
+    sl.Populate(10,1,1);
+    sl.Flip();
+
+    EXPECT_EQ(10,sl[0]);
+    EXPECT_EQ(1,sl[9]);
+
+}
+
+//TEST_F(SimpleListTest, _RecursiveIndexSortTest){
+////TODO
+
+//}
+
+TEST_F(SimpleListTest, _UnionTest){
+
+    _SimpleList sl, sl2; 
+    _SimpleList l1, l2; 
+
+    sl.Populate(10,1,1);
+    l1.Populate(10,1,1);
+    l2.Populate(20,1,1);
+
+    sl.Union(l1, l2);
+    EXPECT_EQ(20,sl[19]);
+
+    //For code coverage
+    sl2.Union(l2, l1);
+    EXPECT_EQ(20,sl[19]);
+
+}
+
+TEST_F(SimpleListTest, _IntersectTest){
+
+    _SimpleList sl, sl2; 
+    _SimpleList l1, l2; 
+
+    sl.Populate(10,1,1);
+    l1.Populate(10,1,1);
+    l2.Populate(10,1,2);
+
+    sl.Intersect(l1, l2);
+    EXPECT_EQ(9,sl[4]);
+
+    //For code coverage
+    sl2.Intersect(l2, l1);
+    EXPECT_EQ(9,sl2[4]);
+}
+
+TEST_F(SimpleListTest, _CountCommonElementsTest){
+
+    _SimpleList sl; 
+
+    _SimpleList l1; 
+    l1.Populate(10,1,1);
+    _SimpleList l2; 
+    l2.Populate(10,1,2);
+
+    sl.Union(l1, l2);
+    EXPECT_EQ(5,l1.CountCommonElements(l2,false));
+
+}
+
+TEST_F(SimpleListTest, _XORTest){
+
+    _SimpleList sl, sl2; 
+
+    _SimpleList l1, l2; 
+
+    sl.Populate(10,1,1);
+    l1.Populate(10,1,1);
+    l2.Populate(10,1,2);
+
+    sl.XOR(l1, l2);
+    EXPECT_EQ(10,sl[4]);
+
+    //For coverage
+    sl2.XOR(l2, l1);
+    EXPECT_EQ(10,sl2[4]);
+}
+
+TEST_F(SimpleListTest, _SubtractTest){
+
+    _SimpleList sl, sl2; 
+
+    _SimpleList l1, l2; 
+
+
+    sl.Populate(10,1,1);
+    l1.Populate(10,1,1);
+    l2.Populate(10,1,2);
+
+    sl.Subtract(l1, l2);
+    EXPECT_EQ(10,sl[9]);
+
+    sl2.Subtract(l1, l2);
+    EXPECT_EQ(10,sl2[9]);
+
+
+}
+}
diff --git a/tests/gtests/ut_simplelists.h b/tests/gtests/ut_simplelists.h
new file mode 100755
index 0000000..e69de29
diff --git a/tests/gtests/ut_strings.cpp b/tests/gtests/ut_strings.cpp
new file mode 100644
index 0000000..e364562
--- /dev/null
+++ b/tests/gtests/ut_strings.cpp
@@ -0,0 +1,1416 @@
+/*
+ *  ut_strings.cpp
+ *  HyPhyXCode
+ *
+ *  Created by Steven Weaver on 6/17/11.
+ *  Copyright 2011 __MyCompanyName__. All rights reserved.
+ *
+ */
+
+//#include <tr1/tuple>
+#include <iostream>
+#include "gtest/gtest.h"
+#include "ut_strings.h"
+
+
+#include "hy_strings.h"
+#include "list.h"
+#include "simplelist.h"
+
+#include "baseobj.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <time.h>
+#include <math.h>
+
+using ::testing::TestWithParam;
+using ::testing::Values;
+using ::testing::Range;
+using ::testing::Combine;
+
+namespace
+{
+
+// The fixture for testing class Foo.
+class StringTest : public ::testing::Test
+{
+protected:
+    // You can remove any or all of the following functions if its body
+    // is empty.
+
+    StringTest() {
+        // You can do set-up work for each test here.
+    }
+
+    virtual ~StringTest() {
+        // You can do clean-up work that doesn't throw exceptions here.
+    }
+
+    // If the constructor and destructor are not enough for setting up
+    // and cleaning up each test, you can define the following methods:
+
+    virtual void SetUp() {
+        // Code here will be called immediately after the constructor (right
+        // before each test).
+    }
+
+    virtual void TearDown() {
+        // Code here will be called immediately after each test (right
+        // before the destructor).
+    }
+
+    // Objects declared here can be used by all tests in the test case for Foo.
+};
+
+
+/* 20110825: SLKP made this a global string.*/
+_String globalTest1 ("You're asking me to run MCMC without reporting any results.  Did you forget to set Bgm_MCMC_SAMPLES?\n");
+
+/******************************************/
+
+TEST_F(StringTest,InitializeTest)
+{
+    _String test("hyphy"),
+            empty;
+
+    test.Initialize();
+    empty.Initialize();
+
+    EXPECT_EQ (test.sData, (char*)NULL);
+    EXPECT_EQ (test.sLength, 0);
+
+    EXPECT_EQ (empty.sData, (char*)NULL);
+    EXPECT_EQ (empty.sLength, 0);
+}
+
+/******************************************/
+
+TEST_F(StringTest,DuplicateTest)
+{
+    /* 20110825: SLKP code coverage complete
+
+        - added an extreme case (empty string)
+        - changed ASSERT to EXPECT
+    */
+    _String test    = _String ("hyphy"),
+            empty;
+    _String dupe1,
+            dupe2;
+
+    dupe1.Duplicate(&test);
+    EXPECT_STREQ(test.getStr(), dupe1.getStr());
+
+    dupe2.Duplicate(&empty);
+    EXPECT_EQ (dupe2.sData, (char*)NULL);
+    EXPECT_EQ (dupe2.sLength, 0);
+}
+
+/******************************************/
+
+TEST_F(StringTest,DuplicateErasingTest)
+{
+    /* 20110825: SLKP code coverage complete
+
+             - changed ASSERT to EXPECT
+             - added a test to ensure that the pointer
+               to the string got reallocated after
+               DuplicateErasing is called
+    */
+    _String test = _String ("hyphy"),
+            dupe = _String ("old_hyphy");
+
+    char*   oldSData = dupe.sData;
+    dupe.DuplicateErasing(&test);
+
+    test = empty;
+
+    EXPECT_STREQ ("hyphy", dupe.getStr());
+}
+
+/******************************************/
+
+
+TEST_F(StringTest,makeDynamicTest)
+{
+    //What is the difference between this and dupicate?
+
+    /* 20110825: SLKP code coverage complete
+          The idea of make dynamic is to convert a stack object into a heap object, see code below
+     */
+
+    _String stackString (globalTest1, 5, -1), // this helps test one of the constructors
+            *heapString = (_String*)stackString.makeDynamic();
+
+    EXPECT_STREQ (stackString.getStr(), heapString->getStr());
+    stackString = empty; // overwrite the stack object
+    EXPECT_EQ (heapString->sLength, globalTest1.sLength-5);
+    DeleteObject (heapString);
+
+}
+
+/******************************************/
+
+TEST_F(StringTest,getCharTest)
+{
+
+    /* 20110825: SLKP code coverage complete */
+
+    _String test (globalTest1);
+    EXPECT_EQ('e', test.getChar(5));
+
+    //Default return is 0
+    _String test2 = empty;
+    EXPECT_EQ(0, test2.getChar(5));
+
+}
+
+/******************************************/
+
+
+TEST_F(StringTest,setCharTest)
+{
+    _String test (globalTest1);
+    test.setChar(5,'d');
+    EXPECT_EQ('d', test.getChar(5));
+
+    //Should be 0
+    _String test2 = empty;
+    test2.setChar(5,'d');
+    EXPECT_EQ('\0', test2.getChar(5));
+}
+
+/******************************************/
+
+TEST_F(StringTest,CopyDynamicStringTest)
+{
+
+    /* 20110825: SLKP code coverage complete
+
+          - added a test case when the source string has object counter > 1, i.e. it can't be
+            simply moved to the destination but has to be copied
+
+    */
+
+
+    _String* test = new _String ("hyphy");
+    _String dupe = _String("old_hyphy");
+    dupe.CopyDynamicString(test);
+    EXPECT_STREQ("hyphy", dupe.getStr());
+
+    _String* test2 = new _String ("beavis");
+    test2->AddAReference(); // add 1 to object counter
+    _String dupe2, dupe3, blank;
+    dupe2.CopyDynamicString(test2);
+    blank.AddAReference();
+    dupe3.CopyDynamicString(&blank);
+    EXPECT_STREQ("beavis", dupe2.getStr());
+    EXPECT_STREQ("beavis", test2->getStr());
+    EXPECT_STREQ("", dupe3.getStr());
+    DeleteObject (test2);
+}
+
+/******************************************/
+
+
+TEST_F(StringTest, LengthTest)
+{
+    _String test = new _String ("You're asking me to run MCMC without reporting any tests.  Did you forget to set Bgm_MCMC_SAMPLES?\n");
+    EXPECT_EQ(99, test.Length());
+
+    _String test2 = new _String ("");
+    EXPECT_EQ(0, test2.Length());
+}
+
+TEST_F(StringTest,InsertTest)
+{
+    _String test = "AAGGCCTTA";
+    _String expected_test = "CAAGGCCTTA";
+    test.Insert('C',0);
+    EXPECT_STREQ(expected_test.getStr(), test.getStr());
+
+    _String test2 = "";
+    _String expected_test2 = "";
+    test2.Insert('C',5);
+    EXPECT_STREQ(expected_test2.getStr(), test2.getStr());
+
+    test = "AAGGCCTTA";
+    expected_test = "AAGGCCTTAC";
+    test.Insert('C',-11);
+    EXPECT_STREQ(expected_test.getStr(), test.getStr());
+
+}
+
+TEST_F(StringTest,DeleteTest)
+{
+    _String test = "AAGGCCTTA";
+    test.Delete(3,4);
+    EXPECT_STREQ("AAGCTTA", test.getStr());
+
+    /*  //ERROR: Program crashes if you go beyond end of string.
+     *
+     *  _String test2 = "AAGG";
+     *  test2.Delete(1,14);
+     *  EXPECT_STREQ("A", test2.getStr());
+     *
+     */
+
+    _String test2 = "AAGG";
+    test2.Delete(1,-5);
+    EXPECT_STREQ("A", test2.getStr());
+
+    _String test3 = "AAGG";
+    test3.Delete(-1,-5);
+    EXPECT_STREQ("", test3.getStr());
+
+}
+
+TEST_F(StringTest,AppendNewInstanceTest)
+{
+    //TODO: Debug for coverage
+    _String orig = _String ("hyphy");
+    _String to_append = _String("-package");
+    _String expected = _String("hyphy-package");
+    _String test = orig&to_append;
+    EXPECT_STREQ(expected.getStr(), test.getStr());
+
+    orig = _String ("");
+    to_append = _String("");
+    expected = _String("");
+    test = orig&to_append;
+    EXPECT_STREQ(expected.getStr(), test.getStr());
+
+}
+
+
+TEST_F(StringTest,EscapeAndAppendTest)
+{
+    _String result = _String("AAGG");
+    _String expected = _String("AAGG\\\\(<\\\[''");
+
+
+    result.EscapeAndAppend('\\',2);
+    result.EscapeAndAppend('(',1);
+    result.EscapeAndAppend('<',4);
+    result.EscapeAndAppend('[',5);
+    result.EscapeAndAppend('\'',2);
+
+    EXPECT_EQ(expected.getStr()[expected.sLength - 1], 
+              result.getStr()[expected.sLength - 1]);
+
+}
+
+TEST_F(StringTest,EscapeAndAppend2Test)
+{
+    _String str = _String("AAGG");
+    _String append = _String("\"AAGG\"");
+    _String expected = _String("AAGG"AAGG"");
+
+    str.EscapeAndAppend(append,4);
+
+    EXPECT_EQ(expected.getStr()[expected.sLength - 1], 
+              str.getStr()[expected.sLength - 1]);
+}
+
+TEST_F(StringTest,FinalizeTest)
+{
+    _String orig = _String ("hyphy");
+    orig.Finalize();
+    EXPECT_EQ(0, orig[orig.Length()]);
+}
+
+TEST_F(StringTest,getStrTest)
+{
+    _String test = _String ("You're asking me to run MCMC without reporting any results.  Did you forget to set Bgm_MCMC_SAMPLES?\n");
+    EXPECT_STREQ("You're asking me to run MCMC without reporting any results.  Did you forget to set Bgm_MCMC_SAMPLES?\n", test.getStr());
+
+    _String test2 = _String ("");
+    EXPECT_STREQ("", test2.getStr());
+
+}
+
+TEST_F(StringTest,ChopTest)
+{
+
+    _String test = globalTest1;
+    _String expected = _String("'re asking me to run MCMC without reporting any results.  Did you forget to set Bgm_MCMC_SAMPLES?\n");
+    _String r1 = test.Chop(0,2);
+    EXPECT_STREQ(expected.getStr(), r1.getStr());
+
+    _String test2 = globalTest1;
+    _String expected2 = _String("'re asking me to run MCMC without reporting any results.  Did you forget to set Bgm_MCMC_SAMPLES?\n");
+    _String r2 = test2.Chop(-1,2);
+    EXPECT_STREQ(expected2.getStr(), r2.getStr());
+
+    _String test3 = _String ("");
+    _String r3 = test3.Chop(0,2);
+    EXPECT_STREQ("", r3.getStr());
+
+    _String test4 = globalTest1;
+    _String r4 = test4.Chop(5,4);
+    EXPECT_STREQ("", r4.getStr());
+
+    _String test5 = globalTest1;
+    _String expected5 = _String("Y're asking me to run MCMC without reporting any results.  Did you forget to set Bgm_MCMC_SAMPLES?\n");
+    _String r5 = test5.Chop(1,2);
+    EXPECT_STREQ(expected5.getStr(), r5.getStr());
+
+    _String test6 = globalTest1;
+    _String r6 = test6.Chop(0,-1);
+    EXPECT_STREQ("", r6.getStr());
+
+    //Error: Should return empty, but it returns "AA"
+    _String test7 = _String ("ABBA");
+    _String substr7 = test7.Chop(11,2);
+    EXPECT_STREQ("", substr7.getStr());
+ 
+
+    //Error: Memory allocation error
+    //_String test3 = _String ("ABBA");
+    //_String substr3 = test3.Chop(2,20);
+    //EXPECT_STREQ("BA", substr3.getStr());
+   
+}
+
+TEST_F(StringTest,CutTest)
+{
+    _String test = globalTest1;
+    _String substr = test.Cut(0,2);
+    EXPECT_STREQ("You", substr.getStr());
+
+    _String test2 = _String ("AABBCC");
+    _String substr2 = test2.Cut(4,12);
+    EXPECT_STREQ("CC", substr2.getStr());
+
+    _String test3 = _String ("");
+    _String substr3 = test3.Cut(4,13);
+    EXPECT_STREQ("", substr3.getStr());
+
+    _String test4 = _String ("AABBCC");
+    _String substr4 = test4.Cut(-1,-1);
+    EXPECT_STREQ("AABBCC", substr4.getStr());
+
+    _String test5 = _String ("AABBCC");
+    _String substr5 = test5.Cut(5,4);
+    EXPECT_STREQ("", substr5.getStr());
+
+    _String test6 = _String ("");
+    _String substr6 = test6.Cut(4,13);
+    EXPECT_STREQ("", substr6.getStr());
+
+}
+
+TEST_F(StringTest,FlipTest)
+{
+    _String result = _String ("ABC");
+    result.Flip();
+    EXPECT_STREQ("CBA",result.getStr());
+}
+
+TEST_F(StringTest,Adler32Test)
+{
+    //TODO: Coverage
+    _String result = new _String ("Wikipedia");
+    EXPECT_EQ(300286872, result.Adler32());
+}
+
+TEST_F(StringTest,TrimTest)
+{
+    _String test = globalTest1; 
+    test.Trim(7,12);
+    EXPECT_STREQ("asking", test.getStr());
+
+    _String test2("");
+    test2.Trim(7,12);
+    EXPECT_STREQ("", test2.getStr());
+
+    //Is there a reason from should act in such a manner?
+    _String test3 = _String ("AABBCC");
+    test3.Trim(13,-1);
+    EXPECT_STREQ("C", test3.getStr());
+
+    _String test4 = _String ("AABBCC");
+    test4.Trim(0,-1);
+    EXPECT_STREQ("AABBCC", test4.getStr());
+
+    _String test5 = _String ("AABBCC");
+    test5.Trim(-1,30, true);
+    EXPECT_STREQ("AABBCC", test5.getStr());
+
+}
+
+TEST_F(StringTest,FirstNonSpaceIndexTest)
+{
+    //Error: curious that it would give me an 8
+    _String test = _String ("    hyphy");
+    EXPECT_EQ(4, test.FirstNonSpaceIndex());
+
+    test = _String ("    hyphy");
+    EXPECT_EQ(8, test.FirstNonSpaceIndex(-1));
+
+    _String test2 = _String ("    hyphy ");
+    EXPECT_EQ(8, test2.FirstNonSpaceIndex(0,-1,-1));
+
+    _String test3 = _String ("");
+    EXPECT_EQ(-1, test3.FirstNonSpaceIndex());
+
+}
+
+TEST_F(StringTest,KillSpacesTest)
+{
+    _String result = _String ("  h   y   p    ");
+    _String r2;
+    result.KillSpaces(r2);
+    EXPECT_STREQ("hyp", r2.getStr());
+
+    _String test2 = _String ("hyp");
+    _String result_string2;
+    test2.KillSpaces(result_string2);
+    EXPECT_STREQ("hyp", result_string2.getStr());
+
+    _String test3 = _String ("");
+    _String result_string3;
+    test3.KillSpaces(result_string3);
+    EXPECT_STREQ("", result_string3.getStr());
+}
+
+TEST_F(StringTest,CompressSpacesTest)
+{
+    _String test = _String ("ABB   and    CCD");
+    test.CompressSpaces();
+    EXPECT_STREQ("ABB and CCD",test.getStr());
+
+    _String test2 = _String ("AB C");
+    test2.CompressSpaces();
+    EXPECT_STREQ("AB C",test2.getStr());
+
+    _String test3 = _String ("");
+    test3.CompressSpaces();
+    EXPECT_STREQ("",test3.getStr());
+
+}
+
+TEST_F(StringTest,FirstSpaceIndexTest)
+{
+    _String test = _String ("AA BB");
+    EXPECT_EQ(2, test.FirstSpaceIndex());
+
+    _String test2 = _String ("");
+    EXPECT_EQ(-1, test2.FirstSpaceIndex());
+
+    _String test3 = _String ("A BBB");
+    EXPECT_EQ(1, test3.FirstSpaceIndex(-1,-1,-1));
+
+    _String test4 = _String (" A BBB");
+    EXPECT_EQ(0, test4.FirstSpaceIndex());
+}
+
+TEST_F(StringTest,FirstNonSpaceTest)
+{
+    _String test = _String ("  AA BB");
+    EXPECT_EQ('A', test.FirstNonSpace());
+
+    _String test2 = _String ("AABB ");
+    EXPECT_EQ('B', test2.FirstNonSpace(0,-1,-1));
+}
+
+TEST_F(StringTest,FirstNonSpace2Test)
+{
+    _String test = _String ("  AA BB");
+    EXPECT_EQ('A', test.FirstNonSpace());
+
+    _String test2 = _String ("AABB ");
+    EXPECT_EQ('B', test2.FirstNonSpace(0,-1,-1));
+}
+
+
+TEST_F(StringTest,FindTest)
+{
+    _String test = _String ("AABBBCCAADDDAABBBEEEFFFF");
+    EXPECT_EQ(19, test.Find(_String("EF"), -1));
+    EXPECT_EQ(-1, test.Find(_String("EFF"),8,9));
+}
+
+TEST_F(StringTest,FindCharTest)
+{
+    _String test = _String ("AABBBCCAADDDAABBBEEEFFFF");
+    EXPECT_EQ(17, test.Find('E', -1));
+    EXPECT_EQ(-1, test.Find('E',9,8));
+
+    test = _String ("");
+    EXPECT_EQ(-1, test.Find('E'));
+}
+
+TEST_F(StringTest,FindKMPTest)
+{
+    //TODO
+}
+
+
+TEST_F(StringTest,FindEndOfIdentTest)
+{
+    _String test = _String ("iden12&iden34");
+    EXPECT_EQ(5, test.FindEndOfIdent(0,-1,'.'));
+
+    _String test2 = _String ("iden12");
+    EXPECT_EQ(5, test2.FindEndOfIdent(0,-1,'.'));
+
+    //Error, returns -2
+    _String test3 = _String ("");
+    EXPECT_EQ(-1, test3.FindEndOfIdent(-1,-1,'.'));
+
+    _String test4 = _String ("iden12&iden34");
+    EXPECT_EQ(5, test4.FindEndOfIdent(0,-1,'.'));
+
+    _String test5 = _String ("iden12__&iden34");
+    EXPECT_EQ(5, test5.FindEndOfIdent(0,-1,'.'));
+}
+
+TEST_F(StringTest,FindAnyCaseTest)
+{
+    _String result = _String ("AABBCCDD");
+    EXPECT_EQ(2, result.FindAnyCase("BBcCDD",-1));
+
+    _String test = _String ("AABBCCDD");
+    EXPECT_EQ(-1, test.FindAnyCase("cBcCDD"));
+
+    _String test2 = _String ("");
+    EXPECT_EQ(-1, test2.FindAnyCase("cBcCDD"));
+
+    test2 = _String("AABBCCDD"); 
+    EXPECT_EQ(-1, test2.FindAnyCase("AABCC", 6,5));
+
+    test2 = _String("AABBCCDD"); 
+    EXPECT_EQ(-1, test2.FindAnyCase("AABCC", 5,6));
+}
+
+TEST_F(StringTest,ContainsSubstringTest)
+{
+
+    _String test = _String ("AABBCCDD");
+    _String substr = _String ("CC");
+    EXPECT_EQ(true, test.ContainsSubstring(substr));
+
+    _String test2 = _String ("AABBCCDD");
+    _String substr2 = _String ("cC");
+    EXPECT_FALSE(test2.ContainsSubstring(substr2));
+
+    _String test3 = _String ("AABBCCDD");
+    _String substr3 = _String ("");
+    EXPECT_EQ(true, test3.ContainsSubstring(substr3));
+
+    _String test4 = _String ("");
+    _String substr4 = _String ("AABCC");
+    EXPECT_EQ(false, test4.ContainsSubstring(substr4));
+
+    //ERROR: returns true
+    _String test5 = _String ("AA");
+    _String substr5 = _String ("AABCC");
+    EXPECT_EQ(false, test5.ContainsSubstring(substr5));
+
+}
+
+TEST_F(StringTest,FindBackwardsTest)
+{
+    _String test = _String ("AABBCCDD");
+    EXPECT_EQ(-1, test.FindBackwards("DC",0,3));
+
+    _String test2 = _String ("AABBCCDD");
+    EXPECT_EQ(5, test2.FindBackwards("CD",-1,-1));
+
+    _String test3 = _String ("");
+    EXPECT_EQ(-1, test3.FindBackwards("CD",-1,-1));
+
+    _String test4 = _String ("AABBCCDD");
+    EXPECT_EQ(-1, test4.FindBackwards("CD",5,4));
+
+    _String test5 = _String ("AABBCCDD");
+    EXPECT_EQ(-1, test5.FindBackwards("CDAACC",8,9));
+
+}
+
+TEST_F(StringTest,FindBinaryTest)
+{
+    _String haystack = _String ("AABBCDDD");
+    char needle = 'C';
+
+    long loc = haystack.FindBinary(needle);
+
+    EXPECT_EQ(4,loc);
+
+
+    _String haystack2 = _String ("AABBCDDD");
+    char needle2 = 'F';
+
+    long loc2 = haystack2.FindBinary(needle2);
+
+    EXPECT_EQ(-1,loc2);
+
+}
+
+TEST_F(StringTest,EqualsTest)
+{
+    _String* test = new _String ("AABBCCDD");
+    _String* r2 = new _String ("AABBCCDD");
+    EXPECT_EQ(true, test->Equal(r2));
+
+    _String test2 = _String("AADCC");
+    EXPECT_EQ(false, test2.Equal(r2));
+
+    _String test3("AABBCCDD");
+    _String r3("AABBCCDD");
+    EXPECT_TRUE(test3==r3);
+
+    delete test;
+    delete r2;
+}
+
+TEST_F(StringTest,CompareTest)
+{
+    //house precedes household
+    //Household precedes house
+    //composer precedes computer
+    //H2O precedes HOTEL
+
+    //ERROR: This returns true
+    _String result = _String ("household");
+    _String* substr = new _String ("house");
+
+    _String result2 = _String ("household");
+    _String* substr2 = new _String ("household");
+    EXPECT_EQ(0, result2.Compare(substr2));
+}
+
+TEST_F(StringTest,EqualWithWildCharTest)
+{
+
+    _String test = _String ("AABBCCDD");
+    _String* t = new _String ("EEBBCCDD");
+
+    EXPECT_EQ(true, test.EqualWithWildChar(t, 'E'));
+
+    _String test2 = _String ("AAFBCCDD");
+    EXPECT_EQ(false, test2.EqualWithWildChar(t, 'E'));
+
+    _String test3 = _String ("EEBBBCDD");
+    EXPECT_EQ(false, test3.EqualWithWildChar(t, 'B'));
+
+    _String test4 = _String ("EEBBBCDB");
+    EXPECT_EQ(false, test4.EqualWithWildChar(t, 'B'));
+
+    delete t;
+}
+
+TEST_F(StringTest,GreaterTest)
+{
+    //TODO: Debug Coverage 
+    //This is a lexicographic comparison
+    _String test = _String ("house");
+    _String t = _String ("household");
+
+    EXPECT_EQ(false, test>t);
+
+    //This is a lexicographic comparison
+    _String test2 = _String ("");
+    _String t2 = _String ("household");
+
+    EXPECT_EQ(false, test2>t2);
+}
+
+TEST_F(StringTest,LessTest)
+{
+
+    //TODO: Debug Coverage 
+
+    _String test = _String ("house");
+    _String t = _String ("household");
+    EXPECT_EQ(true, test<t);
+
+    _String test2 = _String ("");
+    _String t2 = _String ("");
+    EXPECT_EQ(false, test2<t2);
+
+}
+
+TEST_F(StringTest,containsTest)
+{
+
+    _String t = _String ("household");
+    _String test = _String ("house");
+    EXPECT_EQ(true, t.contains(test));
+
+    _String t2 = _String ("");
+    _String test2 = _String ("");
+    EXPECT_EQ(false, t2.contains(test2));
+
+    _String t3 = _String ("household");
+    char test3 = 'o'; 
+    EXPECT_EQ(true, t3.contains(test3));
+
+}
+
+TEST_F(StringTest,beginswithTest)
+{
+    //Why not have an overloaded function instead of beginsWith and startswith?
+    _String test = _String ("household");
+    _String t = _String ("house");
+    EXPECT_EQ(true, test.beginswith(t, true));
+
+    _String test2 = _String ("household");
+    _String t2 = _String ("hold");
+    EXPECT_EQ(false, test2.beginswith(t2, false));
+
+    _String test3 = _String ("household");
+    _String t3 = _String ("House");
+    EXPECT_EQ(false, test3.beginswith(t3, true));
+
+    _String test4 = _String ("household");
+    _String t4 = _String ("House");
+    EXPECT_EQ(true, test4.beginswith(t4, false));
+
+    _String test5 = _String ("");
+    _String t5 = _String ("");
+    EXPECT_EQ(true, test5.beginswith(t5, false));
+
+    _String test6 = _String ("AA");
+    _String t6 = _String ("AABB");
+    EXPECT_EQ(false, test6.beginswith(t6, false));
+
+}
+
+TEST_F(StringTest,startswithTest)
+{
+    //Why not have an overloaded function instead of beginsWith and startswith?
+    _String result = _String ("household");
+    _String substr = _String ("house");
+    EXPECT_EQ(true, result.startswith(substr));
+
+    result = _String ("household");
+    substr = _String ("louse");
+    EXPECT_EQ(false, result.startswith(substr));
+
+    result = _String ("house");
+    substr = _String ("household");
+    EXPECT_EQ(false, result.startswith(substr));
+}
+
+TEST_F(StringTest,endswithTest)
+{
+    _String result = _String ("household");
+    _String r2 = _String ("hold");
+    EXPECT_EQ(true, result.endswith(r2));
+
+    result = _String ("household");
+    r2 = _String ("HOLD");
+    EXPECT_EQ(true, result.endswith(r2, false));
+
+    result = _String ("household");
+    r2 = _String ("HlLD");
+    EXPECT_EQ(false, result.endswith(r2, false));
+
+    result = _String ("household");
+    r2 = _String ("HOLD");
+    EXPECT_EQ(false, result.endswith(r2));
+
+    result = _String ("hold");
+    r2 = _String ("household");
+    EXPECT_EQ(false, result.endswith(r2));
+}
+
+TEST_F(StringTest,FormatTimeStringTest)
+{
+    //Takes seconds
+    long time_diff = 459132;
+    _String result = new _String("127:32:12");
+    _String r2 = new _String("hyphy");
+    r2.FormatTimeString(time_diff);
+    EXPECT_STREQ(result.getStr(), r2.getStr());
+
+    //Takes seconds
+    time_diff = 0;
+    result = new _String("00:00:00");
+    r2 = new _String("hyphy");
+    r2.FormatTimeString(time_diff);
+    EXPECT_STREQ(result.getStr(), r2.getStr());
+}
+
+TEST_F(StringTest,ReplaceTest)
+{
+
+    _String orig_string = _String("household");
+    _String to_replace = _String("hold");
+    _String replacer = _String("house");
+    _String result = _String("househouse");
+
+    _String real_result = orig_string.Replace(to_replace, replacer, true);
+    EXPECT_STREQ(result.getStr(), real_result.getStr());
+
+    _String empty_string = _String("");
+    real_result = empty_string.Replace(to_replace, replacer, true);
+    EXPECT_STREQ("", real_result.getStr());
+
+    _String short_string = _String("hi");
+    real_result = short_string.Replace(to_replace, replacer, true);
+    EXPECT_STREQ("hi", real_result.getStr());
+
+    short_string = _String("hi");
+    to_replace = _String("");
+    real_result = short_string.Replace(to_replace, replacer, true);
+    EXPECT_STREQ("hi", real_result.getStr());
+
+
+    orig_string = _String("household");
+    to_replace = _String("ho");
+    replacer = _String("mo");
+    result = _String("mousemold");
+
+    real_result = orig_string.Replace(to_replace, replacer, true);
+    EXPECT_STREQ(result.getStr(), real_result.getStr());
+
+    orig_string = _String("household");
+    to_replace = _String("ffff");
+    replacer = _String("mo");
+    result = _String("household");
+    real_result = orig_string.Replace(to_replace, replacer, true);
+
+    EXPECT_STREQ(result.getStr(), real_result.getStr());
+
+    orig_string = _String("household");
+    to_replace = _String("ho");
+    replacer = _String("mo");
+    result = _String("mousehold");
+    real_result = orig_string.Replace(to_replace, replacer, false);
+
+    EXPECT_STREQ(result.getStr(), real_result.getStr());
+
+    orig_string = _String("household");
+    to_replace = _String("ffff");
+    replacer = _String("mo");
+    result = _String("household");
+    real_result = orig_string.Replace(to_replace, replacer, false);
+
+    EXPECT_STREQ(result.getStr(), real_result.getStr());
+}
+
+
+TEST_F(StringTest,TokenizeTest)
+{
+    _String test_string = _String("house,condo,hyphy");
+    _String* sub_string = new _String(",");
+
+    _List* result_list = test_string.Tokenize(sub_string);
+    _String* result = (_String*)result_list->lData[0];
+
+    EXPECT_STREQ("house", result->getStr());
+
+
+//    _String test_string2 = _String("house,condo,hyphy");
+//    _String* sub_string2 = new _String("");
+
+//    _List* result_list2 = test_string2.Tokenize(sub_string2);
+//    _String* result2 = (_String*)result_list2->lData[0];
+//    EXPECT_STREQ("house,condo,hyphy", result2->getStr());
+
+
+}
+
+TEST_F(StringTest,toNumTest)
+{
+    _String test_string = _String("3.14");
+    double result = test_string.toNum();
+    double expected = 3.14;
+    EXPECT_EQ(expected, result);
+
+    test_string = _String("");
+    result = test_string.toNum();
+    expected = 0.;
+    EXPECT_EQ(expected, result);
+}
+
+
+TEST_F(StringTest,UpCaseTest)
+{
+    _String result = _String("HOUSE");
+    _String insert = _String("house");
+    insert.UpCase();
+
+    EXPECT_STREQ(result.getStr(), insert.getStr());
+}
+
+TEST_F(StringTest,LoCaseTest)
+{
+    _String insert = _String("HOUSE");
+    _String result = _String("house");
+    insert.LoCase();
+
+    EXPECT_STREQ(result.getStr(), insert.getStr());
+}
+
+TEST_F(StringTest,ProcessTreeBranchLengthTest)
+{
+    //All this does is find the toNum, if it begins with a ':', just skip that.
+    _String test_string = _String(":3.14");
+    double result = test_string.ProcessTreeBranchLength();
+    double expected = 3.14;
+    EXPECT_EQ(expected, result);
+
+    test_string = _String("3.14");
+    result = test_string.ProcessTreeBranchLength();
+    expected = 3.14;
+    EXPECT_EQ(expected, result);
+
+    test_string = _String("1e-12");
+    result = test_string.ProcessTreeBranchLength();
+    expected = 1e-10;
+    EXPECT_EQ(expected, result);
+}
+
+TEST_F(StringTest,ExtractEnclosedExpressionTest)
+{
+    //TODO: Coverage and Debug
+    //returns position
+    _String test_string = _String("[hyp[house]hy]");
+    long i = 0;
+    long j = 0;
+    j = test_string.ExtractEnclosedExpression(i,'[',']',true, true);
+    EXPECT_EQ(13, j);
+}
+
+TEST_F(StringTest,IsALiteralArgumentTest)
+{
+    _String test_string = _String("\"house\"");
+    bool result = test_string.IsALiteralArgument(true);
+    EXPECT_EQ(true, result);
+
+    test_string = _String("hi");
+    result = test_string.IsALiteralArgument(true);
+    EXPECT_EQ(false, result);
+}
+
+TEST_F(StringTest,StripQuotesTest)
+{
+    //Only strips the outer quotes
+    _String insert = _String("\"So this\"");
+    _String result = _String("So this");
+    insert.StripQuotes();
+    EXPECT_STREQ(result.getStr(), insert.getStr());
+}
+
+TEST_F(StringTest,IsValidIdentifierTest)
+{
+    // Valid Identifier must be "greater than 0, doesn't start with non-alpha character and doesn't start wtih "_" if strict, if not strict, accept number"
+    // Also cannot have keyword
+    _String test_string = _String("house");
+    EXPECT_EQ(true, test_string.IsValidIdentifier(true));
+
+    test_string = _String("$house");
+    EXPECT_EQ(false, test_string.IsValidIdentifier(true));
+
+    test_string = _String("");
+    EXPECT_EQ(false, test_string.IsValidIdentifier(true));
+
+    test_string = _String("$house");
+    EXPECT_EQ(false, test_string.IsValidIdentifier(false));
+}
+
+TEST_F(StringTest,IsValidRefIdentifierTest)
+{
+    //Same as IsValidIdentifier, but ends with a &
+    _String test_string = _String("house&");
+    EXPECT_EQ(true, test_string.IsValidRefIdentifier());
+}
+
+/*TEST_F(StringTest,ProcessParameterTest) { */
+////This will be properly tested with batchlan
+//_String initial_path = _String("/home/sergei/hyphy");
+//initial_path.ProcessParameter();
+
+//EXPECT_STREQ("/home/sergei/hyphy", initial_path);
+/*}*/
+
+//TEST_F(StringTest,ProcessFileNameTest) {
+////This will be properly tested with batchlan
+//_String* test_string = new _String("/Users/stevenweaver/Documents/sergei/hyphy/trunk/UnitTests/mtDNA.fas");
+//test_string->ProcessFileName();
+//EXPECT_EQ(2, 2);
+//}
+
+TEST_F(StringTest,PathCompositionTest)
+{
+    _String initial_path = _String("/home/sergei/hyphy");
+    _String change_path = _String("../trunk");
+    _String actual_path = initial_path.PathComposition(change_path);
+    _String result_path = _String("/home/sergei/trunk");
+    EXPECT_STREQ(result_path.getStr(), actual_path.getStr());
+
+    initial_path = _String("/home/sergei/hyphy");
+    change_path = _String("/trunk");
+    actual_path = initial_path.PathComposition(change_path);
+    result_path = _String("/trunk");
+    EXPECT_STREQ(result_path.getStr(), actual_path.getStr());
+
+    initial_path = _String("/home/sergei/hyphy");
+    change_path = _String("/trunk/");
+    actual_path = initial_path.PathComposition(change_path);
+    result_path = _String("/trunk/");
+    EXPECT_STREQ(result_path.getStr(), actual_path.getStr());
+
+}
+
+TEST_F(StringTest,PathSubtractionTest)
+{
+    _String initial_path = _String("/home/sergei/");
+    _String sub_path = _String("/home/sergei/hyphy");
+    _String result_path = initial_path.PathSubtraction(sub_path,'A');
+    EXPECT_STREQ("hyphy", result_path.getStr());
+
+    initial_path = _String("/home/sergei/");
+    sub_path = _String("/home/sergei/documents/hyphy");
+    result_path = initial_path.PathSubtraction(sub_path,'A');
+    EXPECT_STREQ("documents/hyphy", result_path.getStr());
+
+    initial_path = _String("/home/steven");
+    sub_path = _String("/home/sergei/documents/hyphy");
+    result_path = initial_path.PathSubtraction(sub_path,'A');
+    EXPECT_STREQ("sergei/documents/hyphy", result_path.getStr());
+}
+
+TEST_F(StringTest,ConvertToAnIdentTest)
+{
+    //Takes a String and converts it to a valid hyphy ident test
+    _String initial = _String("$house");
+    initial.ConvertToAnIdent();
+    EXPECT_STREQ("_house", initial.getStr());
+
+    initial.ConvertToAnIdent(false);
+    EXPECT_STREQ("_house", initial.getStr());
+
+    initial = _String("_house");
+    initial.ConvertToAnIdent();
+    EXPECT_STREQ("_house", initial.getStr());
+
+    initial.ConvertToAnIdent(false);
+    EXPECT_STREQ("_house", initial.getStr());
+
+    _String initial2 = _String("_ho_use");
+    initial2.ConvertToAnIdent();
+    EXPECT_STREQ("_ho_use", initial2.getStr());
+}
+
+TEST_F(StringTest,ShortenVarIDTest)
+{
+    //TODO Debug Coverage
+    _String initial = _String("house.room");
+    _String container = _String("house");
+    _String result = initial.ShortenVarID(container);
+    EXPECT_STREQ("room", result.getStr());
+
+    initial = _String("house.room");
+    container = _String("friend");
+    result = initial.ShortenVarID(container);
+    EXPECT_STREQ("house.room", result.getStr());
+}
+
+TEST_F(StringTest,RegExpMatchOnceTest)
+{
+    _String initial = new _String("hyphy");
+    _String* pattern = new _String("hyph");
+    _SimpleList matched_pairs;
+    initial.RegExpMatchOnce(pattern, matched_pairs, false, false);
+    EXPECT_EQ(0,matched_pairs.lData[0]);
+}
+
+TEST_F(StringTest,RegExpMatchTest)
+{
+
+    _String initial = new _String("hyphy");
+    _String* pattern = new _String("phy");
+    _SimpleList matched_pairs;
+    initial.RegExpMatchOnce(pattern, matched_pairs, false, false);
+
+    EXPECT_EQ(2,matched_pairs.lData[0]);
+}
+
+TEST_F(StringTest,RegExpMatchAllTest)
+{
+
+    _String initial = new _String("hyphy");
+    _String* pattern = new _String("phy");
+    _SimpleList matched_pairs;
+    int errNo = 0;
+
+    Ptr regex = PrepRegExp (pattern, errNo, false);
+    initial.RegExpMatchAll(regex, matched_pairs);
+
+    EXPECT_EQ(2,matched_pairs.lData[0]);
+}
+
+TEST_F(StringTest,LempelZivProductionHistoryTest)
+{
+    //{1,0,01,1110,1100, 0010}
+    _String initial = _String("1001111011000010");
+    _SimpleList rec;
+    long result = initial.LempelZivProductionHistory(&rec);
+
+    EXPECT_EQ(6, result);
+}
+
+TEST_F(StringTest,SortTest)
+{
+    _String initial = _String("hgfedcba");
+    _SimpleList* index = new _SimpleList();
+    _String* result = initial.Sort(index);
+    EXPECT_STREQ("abcdefgh", result->getStr());
+
+
+    initial = _String();
+    _SimpleList index2;
+    _String* result2 = initial.Sort(&index2);
+    EXPECT_STREQ(nil, result2->getStr());
+
+    delete index;
+    delete result;
+    delete result2;
+}
+
+TEST_F(StringTest,FindTerminatorTest)
+{
+    _String initial = _String("dither");
+    _String terminator = _String("h");
+    long result = initial.FindTerminator(0,terminator);
+    EXPECT_EQ(3, result);
+
+    initial = _String("\"[dither]{dither}(dither)\"dither");
+    terminator = _String("h");
+    result = initial.FindTerminator(0,terminator);
+    EXPECT_EQ(29, result);
+}
+
+TEST_F(StringTest,AppendAnAssignmentToBufferTest)
+{
+
+    _String initial = _String("dither");
+    _String append = _String("test");
+    _String append2 = _String("34");
+    initial.AppendAnAssignmentToBuffer(&append, &append2, false, false, false);
+
+    _String expected = _String("dithertest=34;\n");
+    EXPECT_EQ(expected.getStr()[expected.sLength - 1], 
+              initial.getStr()[expected.sLength -1]);
+
+    initial = _String("dither");
+    append = _String("12");
+    _String* pAppend = new _String("34");
+    initial.AppendAnAssignmentToBuffer(&append, pAppend, true, true, true);
+
+    _String expected2 = _String("dither12:=\"34\";\n");
+    EXPECT_EQ(expected2.getStr()[expected2.sLength - 1], 
+              initial.getStr()[expected2.sLength - 1]);
+
+}
+
+/*
+ *TEST_F(StringTest,AppendVariableValueAVLTest) {
+ *
+ *    _String initial = _String("life");
+ *    _String* append = new _String("answer");
+ *
+ *    unsigned long num = 5;
+ *    _SimpleList matched_pairs(num);
+ *
+ *    long int1 = 4;
+ *    long int2 = 2;
+ *
+ *    matched_pairs.InsertElement((BaseRef)int1,-1,false,false);
+ *    matched_pairs.InsertElement((BaseRef)int1,-1,false,false);
+ *
+ *    initial.AppendVariableValueAVL(append, matched_pairs);
+ *
+ *    EXPECT_STREQ("life[answer]=4,2", initial.getStr());
+ *}
+ */
+
+
+//Operator Tests
+TEST_F(StringTest,BracketTest)
+{
+    //[]
+    _String result = _String ("You're asking me to run MCMC without reporting any results.  Did you forget to set Bgm_MCMC_SAMPLES?\n");
+    EXPECT_EQ('e', result[5L]);
+}
+
+TEST_F(StringTest,ParanthTest)
+{
+    //()
+    _String result = _String ("You're asking me to run MCMC without reporting any results.  Did you forget to set Bgm_MCMC_SAMPLES?\n");
+    EXPECT_EQ('e', result(5));
+
+    EXPECT_EQ(0, result(500));
+}
+
+TEST_F(StringTest,EqualTest)
+{
+    //=
+    _String result = _String ("hyphy");
+    _String dupe = result;
+    EXPECT_STREQ(result.getStr(), dupe.getStr());
+}
+
+TEST_F(StringTest, AmpersandTest)
+{
+
+    // &
+    _String orig = _String ("hyphy");
+    _String to_append = _String("-package");
+    _String expected = _String("hyphy-package");
+    _String result = orig&to_append;
+
+    EXPECT_STREQ(expected.getStr(), result.getStr());
+}
+
+TEST_F(StringTest,DoubleLessTest)
+{
+    _String orig = _String ("hyphy");
+    _String to_append = _String("-package");
+    _String expected = _String("hyphy-package");
+    _String result = orig&to_append;
+
+    EXPECT_STREQ(expected.getStr(), result.getStr());
+}
+
+TEST_F(StringTest,DoubleEqualTest)
+{
+    _String* result = new _String ("AABBCCDD");
+    _String* r2 = new _String ("AABBCCDD");
+    EXPECT_EQ(true, result->Equal(r2));
+
+    delete result;
+    delete r2;
+}
+
+TEST_F(StringTest,GreaterOpTest)
+{
+    // >
+    _String result = _String ("house");
+    _String r2 = _String ("household");
+
+    EXPECT_EQ(false, result>r2);
+}
+
+TEST_F(StringTest,LesserOpTest)
+{
+    _String result = _String ("house");
+    _String r2 = _String ("household");
+
+    EXPECT_EQ(true, result<r2);
+}
+
+TEST_F(StringTest,LesserEqualOpTest)
+{
+    //<=
+    _String result = _String ("house");
+    _String r2 = _String ("household");
+
+    EXPECT_EQ(true, result<=r2);
+}
+
+TEST_F(StringTest,GreaterEqualOpTest)
+{
+    // >=
+    _String result = _String ("house");
+    _String r2 = _String ("household");
+
+    EXPECT_EQ(false, result>=r2);
+}
+
+TEST_F(StringTest,NotEqualOpTest)
+{
+    // !=
+    _String result = _String ("house");
+    _String r2 = _String ("household");
+
+    EXPECT_EQ(true, result!=r2);
+}
+
+//Diagnostic Testing
+
+//I should probably move this out into its own separate test
+/*
+ *class _KMPDiagnosticTest : public TestWithParam< ::std::tr1::tuple<int, int> > {
+ *    protected:
+ *    // You can remove any or all of the following functions if its body
+ *    // is empty.
+ *
+ *    _KMPDiagnosticTest() {
+ *        // You can do set-up work for each test here.
+ *    }
+ *
+ *    virtual ~_KMPDiagnosticTest() {
+ *        // You can do clean-up work that doesn't throw exceptions here.
+ *    }
+ *
+ *    // If the constructor and destructor are not enough for setting up
+ *    // and cleaning up each test, you can define the following methods:
+ *
+ *    virtual void SetUp() {
+ *        // Code here will be called immediately after the constructor (right
+ *        // before each test).
+ *        FILE * test;
+ *        test = fopen ("/Users/stevenweaver/Documents/sergei/hyphy/trunk/UnitTests/mtDNA.fas","r");
+ *        buffer = new _String(test);
+ *        fclose(test);
+ *
+ *        substr = *buffer;
+ *
+ *        rand_start = pow(2,::std::tr1::get<0>(GetParam()));
+ *        rand_length = pow(10,::std::tr1::get<1>(GetParam()));
+ *
+ *        substr.Trim(rand_start, rand_start+rand_length);
+ *        buffer->buildKmpTable(substr);
+ *    }
+ *
+ *    virtual void TearDown() {
+ *        // Code here will be called immediately after each test (right
+ *        // before the destructor).
+ *        delete buffer;
+ *    }
+ *
+ *    // Objects declared here can be used by all tests in the test case for Foo.
+ *    _String* buffer;
+ *    _String substr;
+ *    long rand_start;
+ *    long rand_length;
+ *};
+ *
+ *INSTANTIATE_TEST_CASE_P(SpeedTest,
+ *                        _KMPDiagnosticTest,
+ *                        Combine(Range(1,10), Range(1,10)));
+ *
+ *TEST_P(_KMPDiagnosticTest, KMPDiagnostic) {
+ *    // Inside a test, access the test parameter with the GetParam() method
+ *    // of the TestWithParam<T> class:
+ *    //substr
+ *    int i=0;
+ *    while(i<25){
+ *        buffer->FindKMP(substr);
+ *        ++i;
+ *    }
+ *
+ *    EXPECT_EQ(rand_start, buffer->FindKMP(substr));
+ *}
+ *
+ *TEST_P(_KMPDiagnosticTest, FindDiagnostic) {
+ *    // Inside a test, access the test parameter with the GetParam() method
+ *    // of the TestWithParam<T> class:
+ *    int i=0;
+ *    while(i<25){
+ *        buffer->Find(substr);
+ *        ++i;
+ *    }
+ *
+ *    //substr
+ *    EXPECT_EQ(rand_start, buffer->Find(substr));
+ *}
+ */
+
+}  // namespace
diff --git a/tests/gtests/ut_strings.h b/tests/gtests/ut_strings.h
new file mode 100644
index 0000000..e69de29
diff --git a/tests/hbltests/Ancestors/CodonAncestors.bf b/tests/hbltests/Ancestors/CodonAncestors.bf
new file mode 100644
index 0000000..266f5a3
--- /dev/null
+++ b/tests/hbltests/Ancestors/CodonAncestors.bf
@@ -0,0 +1,664 @@
+#NEXUS
+
+BEGIN TAXA;
+	DIMENSIONS NTAX = 8;
+	TAXLABELS
+		'B_FR_83_HXB2_ACC_K03455''B_US_83_RF_ACC_M17451''B_US_86_JRFL_ACC_U63632''B_US_90_WEAU160_ACC_U21135''D_CD_83_ELI_ACC_K03454''D_CD_83_NDK_ACC_M27323''D_CD_84_84ZR085_ACC_U88822''D_UG_94_94UG114_ACC_U88824';
+END;
+
+BEGIN CHARACTERS;
+	DIMENSIONS NCHAR = 1320;
+	FORMAT
+		DATATYPE = DNA
+		GAP=-
+		MISSING=?
+	;
+
+MATRIX
+	'B_FR_83_HXB2_ACC_K03455'     CCCATTAGCCCTATTGAGACTGTACCAGTAAAATTAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAATAAAAGCATTAGTAGAAATTTGTACAGAGATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAAGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGATGGAA [...]
+	'B_US_83_RF_ACC_M17451'       CCCATTAGTCCTATTGAAACTGTACCAGTAAAATTAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAGGAAAAAATAAAAGCATTGGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCCAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAGTTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAGAAATCAGTAACAGTATTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATAAAGAGTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAAACACCACGGATTAGATATCAGTACAATGTGCTTCCACAAGGGTGGAA [...]
+	'B_US_86_JRFL_ACC_U63632'     CCCATTAGTCCTATTGAAACTGTACCAGTAAAATTAAAGCCAGGAATGGATGGCCCAAAAGTCAAACAATGGCCATTGACAGAAGAAAAAATAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAGAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATAAAGACTTCAGGAAATATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGGTATCAGTACAATGTGCTTCCGCAGGGATGGAA [...]
+	'B_US_90_WEAU160_ACC_U21135'  CCCATTAGTCCTATTGAAACTGTACCAGTAAAATTAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAGAAAATAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTTCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTACCCTTAGATGAAGACTTCAGGAAGTACACTGCATTTACCATACCTAGTATAAACAATGAAACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGATGGAA [...]
+	'D_CD_83_ELI_ACC_K03454'      CCAATTAGTCCTATTGAAACTGTACCAGTAAAATTAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAATAAAAGCATTAACAGAAATTTGTACAGATATGGAAAAGGAAGGAAAAATTTCAAGAATTGGGCCTGAAAATCCATACAATACTCCAATATTTGCCATAAAGAAAAAAGACAGTACCAAGTGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGATTTCTGGGAAGTTCAATTAGGAATACCGCATCCTGCAGGGCTGAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAAGATTTTAGGAAATATACCGCCTTTACCATATCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGATGGAA [...]
+	'D_CD_83_NDK_ACC_M27323'      CCAATTAGTCCTATTGAAACTGTACCAGTAAAATTAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAATAAAAGCATTAACAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAGAATTGGGCCTGAAAATCCATATAATACTCCAATATTTGCCATAAAGAAAAAAGACAGTACCAAGTGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGATTTCTGGGAGGTTCAATTAGGAATACCGCATCCTGCAGGGCTGAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATGAAGATTTTAGGAAATATACCGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTCCCACAGGGATGGAA [...]
+	'D_CD_84_84ZR085_ACC_U88822'  CCAATTAGTCCTATTGAAACTGTACCAGTAAAATTAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCGTTGACAGAAGAAAAAATAAAAGCATTAACAGAAATTTGTACAGATATGGAAAAGGAAGGAAAAATTTCAAGAATTGGGCCTGAAAATCCATACAATACTCCAATATTTGCCATAAAGAAAAAAGACAGTACTAAGTGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGGATACCACATCCTGCAGGATTAAAGAAGAAAAAGTCAATAACAGTACTGGATGTGGGCGATGCATATTTTTCAATTCCCTTATGTGAAGACTTTAGGAAGTACACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTACTTCCACAGGGATGGAA [...]
+	'D_UG_94_94UG114_ACC_U88824'  CCAATTAGTCCTATTGAAACTGTACCAGTAAAATTAAAGCCAGGGATGGATGGCCCAAAAGTTAAACAATGGCCGTTGACAGAAGAAAAAATAAAAGCACTAATAGAAATTTGTTCAGAACTAGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAACCCATACAATACTCCAATATTTGCCATAAAGAAAAAAGACAGTACTAAGTGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTTTGGGAAGTTCAACTAGGAATACCACATCCTGCAGGGCTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGACGCATATTTTTCAGTTCCCTTACATGAAGACTTTAGAAAATATACCGCATTCACCATACCTAGTACAAACAATGAGACACCAGGAATTAGATATCAGTACAATGTGCTTCCACAAGGATGGAA [...]
+END;
+
+BEGIN TREES;
+	TREE tree = ((((D_CD_83_ELI_ACC_K03454,D_CD_83_NDK_ACC_M27323),D_UG_94_94UG114_ACC_U88824),D_CD_84_84ZR085_ACC_U88822),B_US_83_RF_ACC_M17451,((B_FR_83_HXB2_ACC_K03455,B_US_86_JRFL_ACC_U63632),B_US_90_WEAU160_ACC_U21135));
+END;
+
+BEGIN HYPHY;
+USE_ADAPTIVE_VARIABLE_STEP = 0;
+timer = Time(1);
+
+OPTIMIZATION_PRECISION = 0.001;
+OPTIMIZATION_METHOD    = 4;
+VERBOSITY_LEVEL        = -1;
+
+fprintf (stdout, "\nRunning an MG94x012232 model fit on an HIV-1 RT (p51) alignment with 8 sequences and 430 codons\n");
+global AT=1;
+global CT=1;
+global R=1;
+global AC=1;
+global CG:=AT;
+global GT:=AT;
+MG94custom={61,61};
+MG94custom[0][1]:=AC*R*synRate*0.10767;
+MG94custom[0][2]:=synRate*0.19375;
+MG94custom[0][3]:=AT*R*synRate*0.220455;
+MG94custom[0][4]:=AC*R*synRate*0.20142;
+MG94custom[0][8]:=R*synRate*0.150568;
+MG94custom[0][12]:=AT*R*synRate*0.261648;
+MG94custom[0][16]:=AC*R*synRate*0.189773;
+MG94custom[0][32]:=R*synRate*0.284375;
+MG94custom[1][0]:=AC*R*synRate*0.478125;
+MG94custom[1][2]:=CG*R*synRate*0.19375;
+MG94custom[1][3]:=CT*synRate*0.220455;
+MG94custom[1][5]:=AC*R*synRate*0.20142;
+MG94custom[1][9]:=R*synRate*0.150568;
+MG94custom[1][13]:=AT*R*synRate*0.261648;
+MG94custom[1][17]:=AC*R*synRate*0.189773;
+MG94custom[1][33]:=R*synRate*0.284375;
+MG94custom[1][48]:=AT*R*synRate*0.176989;
+MG94custom[2][0]:=synRate*0.478125;
+MG94custom[2][1]:=CG*R*synRate*0.10767;
+MG94custom[2][3]:=GT*R*synRate*0.220455;
+MG94custom[2][6]:=AC*R*synRate*0.20142;
+MG94custom[2][10]:=R*synRate*0.150568;
+MG94custom[2][14]:=AT*R*synRate*0.261648;
+MG94custom[2][18]:=AC*R*synRate*0.189773;
+MG94custom[2][34]:=R*synRate*0.284375;
+MG94custom[3][0]:=AT*R*synRate*0.478125;
+MG94custom[3][1]:=CT*synRate*0.10767;
+MG94custom[3][2]:=GT*R*synRate*0.19375;
+MG94custom[3][7]:=AC*R*synRate*0.20142;
+MG94custom[3][11]:=R*synRate*0.150568;
+MG94custom[3][15]:=AT*R*synRate*0.261648;
+MG94custom[3][19]:=AC*R*synRate*0.189773;
+MG94custom[3][35]:=R*synRate*0.284375;
+MG94custom[3][49]:=AT*R*synRate*0.176989;
+MG94custom[4][0]:=AC*R*synRate*0.386364;
+MG94custom[4][5]:=AC*synRate*0.10767;
+MG94custom[4][6]:=synRate*0.19375;
+MG94custom[4][7]:=AT*synRate*0.220455;
+MG94custom[4][8]:=CG*R*synRate*0.150568;
+MG94custom[4][12]:=CT*R*synRate*0.261648;
+MG94custom[4][20]:=AC*R*synRate*0.189773;
+MG94custom[4][36]:=R*synRate*0.284375;
+MG94custom[4][50]:=AT*R*synRate*0.176989;
+MG94custom[5][1]:=AC*R*synRate*0.386364;
+MG94custom[5][4]:=AC*synRate*0.478125;
+MG94custom[5][6]:=CG*synRate*0.19375;
+MG94custom[5][7]:=CT*synRate*0.220455;
+MG94custom[5][9]:=CG*R*synRate*0.150568;
+MG94custom[5][13]:=CT*R*synRate*0.261648;
+MG94custom[5][21]:=AC*R*synRate*0.189773;
+MG94custom[5][37]:=R*synRate*0.284375;
+MG94custom[5][51]:=AT*R*synRate*0.176989;
+MG94custom[6][2]:=AC*R*synRate*0.386364;
+MG94custom[6][4]:=synRate*0.478125;
+MG94custom[6][5]:=CG*synRate*0.10767;
+MG94custom[6][7]:=GT*synRate*0.220455;
+MG94custom[6][10]:=CG*R*synRate*0.150568;
+MG94custom[6][14]:=CT*R*synRate*0.261648;
+MG94custom[6][22]:=AC*R*synRate*0.189773;
+MG94custom[6][38]:=R*synRate*0.284375;
+MG94custom[6][52]:=AT*R*synRate*0.176989;
+MG94custom[7][3]:=AC*R*synRate*0.386364;
+MG94custom[7][4]:=AT*synRate*0.478125;
+MG94custom[7][5]:=CT*synRate*0.10767;
+MG94custom[7][6]:=GT*synRate*0.19375;
+MG94custom[7][11]:=CG*R*synRate*0.150568;
+MG94custom[7][15]:=CT*R*synRate*0.261648;
+MG94custom[7][23]:=AC*R*synRate*0.189773;
+MG94custom[7][39]:=R*synRate*0.284375;
+MG94custom[7][53]:=AT*R*synRate*0.176989;
+MG94custom[8][0]:=R*synRate*0.386364;
+MG94custom[8][4]:=CG*R*synRate*0.20142;
+MG94custom[8][9]:=AC*R*synRate*0.10767;
+MG94custom[8][10]:=synRate*0.19375;
+MG94custom[8][11]:=AT*R*synRate*0.220455;
+MG94custom[8][12]:=GT*R*synRate*0.261648;
+MG94custom[8][24]:=AC*synRate*0.189773;
+MG94custom[8][40]:=R*synRate*0.284375;
+MG94custom[9][1]:=R*synRate*0.386364;
+MG94custom[9][5]:=CG*R*synRate*0.20142;
+MG94custom[9][8]:=AC*R*synRate*0.478125;
+MG94custom[9][10]:=CG*R*synRate*0.19375;
+MG94custom[9][11]:=CT*synRate*0.220455;
+MG94custom[9][13]:=GT*R*synRate*0.261648;
+MG94custom[9][25]:=AC*R*synRate*0.189773;
+MG94custom[9][41]:=R*synRate*0.284375;
+MG94custom[9][54]:=AT*R*synRate*0.176989;
+MG94custom[10][2]:=R*synRate*0.386364;
+MG94custom[10][6]:=CG*R*synRate*0.20142;
+MG94custom[10][8]:=synRate*0.478125;
+MG94custom[10][9]:=CG*R*synRate*0.10767;
+MG94custom[10][11]:=GT*R*synRate*0.220455;
+MG94custom[10][14]:=GT*R*synRate*0.261648;
+MG94custom[10][26]:=AC*synRate*0.189773;
+MG94custom[10][42]:=R*synRate*0.284375;
+MG94custom[10][55]:=AT*R*synRate*0.176989;
+MG94custom[11][3]:=R*synRate*0.386364;
+MG94custom[11][7]:=CG*R*synRate*0.20142;
+MG94custom[11][8]:=AT*R*synRate*0.478125;
+MG94custom[11][9]:=CT*synRate*0.10767;
+MG94custom[11][10]:=GT*R*synRate*0.19375;
+MG94custom[11][15]:=GT*R*synRate*0.261648;
+MG94custom[11][27]:=AC*R*synRate*0.189773;
+MG94custom[11][43]:=R*synRate*0.284375;
+MG94custom[11][56]:=AT*R*synRate*0.176989;
+MG94custom[12][0]:=AT*R*synRate*0.386364;
+MG94custom[12][4]:=CT*R*synRate*0.20142;
+MG94custom[12][8]:=GT*R*synRate*0.150568;
+MG94custom[12][13]:=AC*synRate*0.10767;
+MG94custom[12][14]:=R*synRate*0.19375;
+MG94custom[12][15]:=AT*synRate*0.220455;
+MG94custom[12][28]:=AC*R*synRate*0.189773;
+MG94custom[12][44]:=R*synRate*0.284375;
+MG94custom[12][57]:=AT*R*synRate*0.176989;
+MG94custom[13][1]:=AT*R*synRate*0.386364;
+MG94custom[13][5]:=CT*R*synRate*0.20142;
+MG94custom[13][9]:=GT*R*synRate*0.150568;
+MG94custom[13][12]:=AC*synRate*0.478125;
+MG94custom[13][14]:=CG*R*synRate*0.19375;
+MG94custom[13][15]:=CT*synRate*0.220455;
+MG94custom[13][29]:=AC*R*synRate*0.189773;
+MG94custom[13][45]:=R*synRate*0.284375;
+MG94custom[13][58]:=AT*R*synRate*0.176989;
+MG94custom[14][2]:=AT*R*synRate*0.386364;
+MG94custom[14][6]:=CT*R*synRate*0.20142;
+MG94custom[14][10]:=GT*R*synRate*0.150568;
+MG94custom[14][12]:=R*synRate*0.478125;
+MG94custom[14][13]:=CG*R*synRate*0.10767;
+MG94custom[14][15]:=GT*R*synRate*0.220455;
+MG94custom[14][30]:=AC*R*synRate*0.189773;
+MG94custom[14][46]:=R*synRate*0.284375;
+MG94custom[14][59]:=AT*R*synRate*0.176989;
+MG94custom[15][3]:=AT*R*synRate*0.386364;
+MG94custom[15][7]:=CT*R*synRate*0.20142;
+MG94custom[15][11]:=GT*R*synRate*0.150568;
+MG94custom[15][12]:=AT*synRate*0.478125;
+MG94custom[15][13]:=CT*synRate*0.10767;
+MG94custom[15][14]:=GT*R*synRate*0.19375;
+MG94custom[15][31]:=AC*R*synRate*0.189773;
+MG94custom[15][47]:=R*synRate*0.284375;
+MG94custom[15][60]:=AT*R*synRate*0.176989;
+MG94custom[16][0]:=AC*R*synRate*0.348864;
+MG94custom[16][17]:=AC*R*synRate*0.10767;
+MG94custom[16][18]:=synRate*0.19375;
+MG94custom[16][19]:=AT*R*synRate*0.220455;
+MG94custom[16][20]:=AC*R*synRate*0.20142;
+MG94custom[16][24]:=R*synRate*0.150568;
+MG94custom[16][28]:=AT*R*synRate*0.261648;
+MG94custom[16][32]:=CG*R*synRate*0.284375;
+MG94custom[17][1]:=AC*R*synRate*0.348864;
+MG94custom[17][16]:=AC*R*synRate*0.478125;
+MG94custom[17][18]:=CG*R*synRate*0.19375;
+MG94custom[17][19]:=CT*synRate*0.220455;
+MG94custom[17][21]:=AC*R*synRate*0.20142;
+MG94custom[17][25]:=R*synRate*0.150568;
+MG94custom[17][29]:=AT*R*synRate*0.261648;
+MG94custom[17][33]:=CG*R*synRate*0.284375;
+MG94custom[17][48]:=CT*R*synRate*0.176989;
+MG94custom[18][2]:=AC*R*synRate*0.348864;
+MG94custom[18][16]:=synRate*0.478125;
+MG94custom[18][17]:=CG*R*synRate*0.10767;
+MG94custom[18][19]:=GT*R*synRate*0.220455;
+MG94custom[18][22]:=AC*R*synRate*0.20142;
+MG94custom[18][26]:=R*synRate*0.150568;
+MG94custom[18][30]:=AT*R*synRate*0.261648;
+MG94custom[18][34]:=CG*R*synRate*0.284375;
+MG94custom[19][3]:=AC*R*synRate*0.348864;
+MG94custom[19][16]:=AT*R*synRate*0.478125;
+MG94custom[19][17]:=CT*synRate*0.10767;
+MG94custom[19][18]:=GT*R*synRate*0.19375;
+MG94custom[19][23]:=AC*R*synRate*0.20142;
+MG94custom[19][27]:=R*synRate*0.150568;
+MG94custom[19][31]:=AT*R*synRate*0.261648;
+MG94custom[19][35]:=CG*R*synRate*0.284375;
+MG94custom[19][49]:=CT*R*synRate*0.176989;
+MG94custom[20][4]:=AC*R*synRate*0.348864;
+MG94custom[20][16]:=AC*R*synRate*0.386364;
+MG94custom[20][21]:=AC*synRate*0.10767;
+MG94custom[20][22]:=synRate*0.19375;
+MG94custom[20][23]:=AT*synRate*0.220455;
+MG94custom[20][24]:=CG*R*synRate*0.150568;
+MG94custom[20][28]:=CT*R*synRate*0.261648;
+MG94custom[20][36]:=CG*R*synRate*0.284375;
+MG94custom[20][50]:=CT*R*synRate*0.176989;
+MG94custom[21][5]:=AC*R*synRate*0.348864;
+MG94custom[21][17]:=AC*R*synRate*0.386364;
+MG94custom[21][20]:=AC*synRate*0.478125;
+MG94custom[21][22]:=CG*synRate*0.19375;
+MG94custom[21][23]:=CT*synRate*0.220455;
+MG94custom[21][25]:=CG*R*synRate*0.150568;
+MG94custom[21][29]:=CT*R*synRate*0.261648;
+MG94custom[21][37]:=CG*R*synRate*0.284375;
+MG94custom[21][51]:=CT*R*synRate*0.176989;
+MG94custom[22][6]:=AC*R*synRate*0.348864;
+MG94custom[22][18]:=AC*R*synRate*0.386364;
+MG94custom[22][20]:=synRate*0.478125;
+MG94custom[22][21]:=CG*synRate*0.10767;
+MG94custom[22][23]:=GT*synRate*0.220455;
+MG94custom[22][26]:=CG*R*synRate*0.150568;
+MG94custom[22][30]:=CT*R*synRate*0.261648;
+MG94custom[22][38]:=CG*R*synRate*0.284375;
+MG94custom[22][52]:=CT*R*synRate*0.176989;
+MG94custom[23][7]:=AC*R*synRate*0.348864;
+MG94custom[23][19]:=AC*R*synRate*0.386364;
+MG94custom[23][20]:=AT*synRate*0.478125;
+MG94custom[23][21]:=CT*synRate*0.10767;
+MG94custom[23][22]:=GT*synRate*0.19375;
+MG94custom[23][27]:=CG*R*synRate*0.150568;
+MG94custom[23][31]:=CT*R*synRate*0.261648;
+MG94custom[23][39]:=CG*R*synRate*0.284375;
+MG94custom[23][53]:=CT*R*synRate*0.176989;
+MG94custom[24][8]:=AC*synRate*0.348864;
+MG94custom[24][16]:=R*synRate*0.386364;
+MG94custom[24][20]:=CG*R*synRate*0.20142;
+MG94custom[24][25]:=AC*synRate*0.10767;
+MG94custom[24][26]:=synRate*0.19375;
+MG94custom[24][27]:=AT*synRate*0.220455;
+MG94custom[24][28]:=GT*R*synRate*0.261648;
+MG94custom[24][40]:=CG*R*synRate*0.284375;
+MG94custom[25][9]:=AC*R*synRate*0.348864;
+MG94custom[25][17]:=R*synRate*0.386364;
+MG94custom[25][21]:=CG*R*synRate*0.20142;
+MG94custom[25][24]:=AC*synRate*0.478125;
+MG94custom[25][26]:=CG*synRate*0.19375;
+MG94custom[25][27]:=CT*synRate*0.220455;
+MG94custom[25][29]:=GT*R*synRate*0.261648;
+MG94custom[25][41]:=CG*R*synRate*0.284375;
+MG94custom[25][54]:=CT*R*synRate*0.176989;
+MG94custom[26][10]:=AC*synRate*0.348864;
+MG94custom[26][18]:=R*synRate*0.386364;
+MG94custom[26][22]:=CG*R*synRate*0.20142;
+MG94custom[26][24]:=synRate*0.478125;
+MG94custom[26][25]:=CG*synRate*0.10767;
+MG94custom[26][27]:=GT*synRate*0.220455;
+MG94custom[26][30]:=GT*R*synRate*0.261648;
+MG94custom[26][42]:=CG*R*synRate*0.284375;
+MG94custom[26][55]:=CT*R*synRate*0.176989;
+MG94custom[27][11]:=AC*R*synRate*0.348864;
+MG94custom[27][19]:=R*synRate*0.386364;
+MG94custom[27][23]:=CG*R*synRate*0.20142;
+MG94custom[27][24]:=AT*synRate*0.478125;
+MG94custom[27][25]:=CT*synRate*0.10767;
+MG94custom[27][26]:=GT*synRate*0.19375;
+MG94custom[27][31]:=GT*R*synRate*0.261648;
+MG94custom[27][43]:=CG*R*synRate*0.284375;
+MG94custom[27][56]:=CT*R*synRate*0.176989;
+MG94custom[28][12]:=AC*R*synRate*0.348864;
+MG94custom[28][16]:=AT*R*synRate*0.386364;
+MG94custom[28][20]:=CT*R*synRate*0.20142;
+MG94custom[28][24]:=GT*R*synRate*0.150568;
+MG94custom[28][29]:=AC*synRate*0.10767;
+MG94custom[28][30]:=synRate*0.19375;
+MG94custom[28][31]:=AT*synRate*0.220455;
+MG94custom[28][44]:=CG*R*synRate*0.284375;
+MG94custom[28][57]:=CT*synRate*0.176989;
+MG94custom[29][13]:=AC*R*synRate*0.348864;
+MG94custom[29][17]:=AT*R*synRate*0.386364;
+MG94custom[29][21]:=CT*R*synRate*0.20142;
+MG94custom[29][25]:=GT*R*synRate*0.150568;
+MG94custom[29][28]:=AC*synRate*0.478125;
+MG94custom[29][30]:=CG*synRate*0.19375;
+MG94custom[29][31]:=CT*synRate*0.220455;
+MG94custom[29][45]:=CG*R*synRate*0.284375;
+MG94custom[29][58]:=CT*R*synRate*0.176989;
+MG94custom[30][14]:=AC*R*synRate*0.348864;
+MG94custom[30][18]:=AT*R*synRate*0.386364;
+MG94custom[30][22]:=CT*R*synRate*0.20142;
+MG94custom[30][26]:=GT*R*synRate*0.150568;
+MG94custom[30][28]:=synRate*0.478125;
+MG94custom[30][29]:=CG*synRate*0.10767;
+MG94custom[30][31]:=GT*synRate*0.220455;
+MG94custom[30][46]:=CG*R*synRate*0.284375;
+MG94custom[30][59]:=CT*synRate*0.176989;
+MG94custom[31][15]:=AC*R*synRate*0.348864;
+MG94custom[31][19]:=AT*R*synRate*0.386364;
+MG94custom[31][23]:=CT*R*synRate*0.20142;
+MG94custom[31][27]:=GT*R*synRate*0.150568;
+MG94custom[31][28]:=AT*synRate*0.478125;
+MG94custom[31][29]:=CT*synRate*0.10767;
+MG94custom[31][30]:=GT*synRate*0.19375;
+MG94custom[31][47]:=CG*R*synRate*0.284375;
+MG94custom[31][60]:=CT*R*synRate*0.176989;
+MG94custom[32][0]:=R*synRate*0.348864;
+MG94custom[32][16]:=CG*R*synRate*0.189773;
+MG94custom[32][33]:=AC*R*synRate*0.10767;
+MG94custom[32][34]:=synRate*0.19375;
+MG94custom[32][35]:=AT*R*synRate*0.220455;
+MG94custom[32][36]:=AC*R*synRate*0.20142;
+MG94custom[32][40]:=R*synRate*0.150568;
+MG94custom[32][44]:=AT*R*synRate*0.261648;
+MG94custom[33][1]:=R*synRate*0.348864;
+MG94custom[33][17]:=CG*R*synRate*0.189773;
+MG94custom[33][32]:=AC*R*synRate*0.478125;
+MG94custom[33][34]:=CG*R*synRate*0.19375;
+MG94custom[33][35]:=CT*synRate*0.220455;
+MG94custom[33][37]:=AC*R*synRate*0.20142;
+MG94custom[33][41]:=R*synRate*0.150568;
+MG94custom[33][45]:=AT*R*synRate*0.261648;
+MG94custom[33][48]:=GT*R*synRate*0.176989;
+MG94custom[34][2]:=R*synRate*0.348864;
+MG94custom[34][18]:=CG*R*synRate*0.189773;
+MG94custom[34][32]:=synRate*0.478125;
+MG94custom[34][33]:=CG*R*synRate*0.10767;
+MG94custom[34][35]:=GT*R*synRate*0.220455;
+MG94custom[34][38]:=AC*R*synRate*0.20142;
+MG94custom[34][42]:=R*synRate*0.150568;
+MG94custom[34][46]:=AT*R*synRate*0.261648;
+MG94custom[35][3]:=R*synRate*0.348864;
+MG94custom[35][19]:=CG*R*synRate*0.189773;
+MG94custom[35][32]:=AT*R*synRate*0.478125;
+MG94custom[35][33]:=CT*synRate*0.10767;
+MG94custom[35][34]:=GT*R*synRate*0.19375;
+MG94custom[35][39]:=AC*R*synRate*0.20142;
+MG94custom[35][43]:=R*synRate*0.150568;
+MG94custom[35][47]:=AT*R*synRate*0.261648;
+MG94custom[35][49]:=GT*R*synRate*0.176989;
+MG94custom[36][4]:=R*synRate*0.348864;
+MG94custom[36][20]:=CG*R*synRate*0.189773;
+MG94custom[36][32]:=AC*R*synRate*0.386364;
+MG94custom[36][37]:=AC*synRate*0.10767;
+MG94custom[36][38]:=synRate*0.19375;
+MG94custom[36][39]:=AT*synRate*0.220455;
+MG94custom[36][40]:=CG*R*synRate*0.150568;
+MG94custom[36][44]:=CT*R*synRate*0.261648;
+MG94custom[36][50]:=GT*R*synRate*0.176989;
+MG94custom[37][5]:=R*synRate*0.348864;
+MG94custom[37][21]:=CG*R*synRate*0.189773;
+MG94custom[37][33]:=AC*R*synRate*0.386364;
+MG94custom[37][36]:=AC*synRate*0.478125;
+MG94custom[37][38]:=CG*synRate*0.19375;
+MG94custom[37][39]:=CT*synRate*0.220455;
+MG94custom[37][41]:=CG*R*synRate*0.150568;
+MG94custom[37][45]:=CT*R*synRate*0.261648;
+MG94custom[37][51]:=GT*R*synRate*0.176989;
+MG94custom[38][6]:=R*synRate*0.348864;
+MG94custom[38][22]:=CG*R*synRate*0.189773;
+MG94custom[38][34]:=AC*R*synRate*0.386364;
+MG94custom[38][36]:=synRate*0.478125;
+MG94custom[38][37]:=CG*synRate*0.10767;
+MG94custom[38][39]:=GT*synRate*0.220455;
+MG94custom[38][42]:=CG*R*synRate*0.150568;
+MG94custom[38][46]:=CT*R*synRate*0.261648;
+MG94custom[38][52]:=GT*R*synRate*0.176989;
+MG94custom[39][7]:=R*synRate*0.348864;
+MG94custom[39][23]:=CG*R*synRate*0.189773;
+MG94custom[39][35]:=AC*R*synRate*0.386364;
+MG94custom[39][36]:=AT*synRate*0.478125;
+MG94custom[39][37]:=CT*synRate*0.10767;
+MG94custom[39][38]:=GT*synRate*0.19375;
+MG94custom[39][43]:=CG*R*synRate*0.150568;
+MG94custom[39][47]:=CT*R*synRate*0.261648;
+MG94custom[39][53]:=GT*R*synRate*0.176989;
+MG94custom[40][8]:=R*synRate*0.348864;
+MG94custom[40][24]:=CG*R*synRate*0.189773;
+MG94custom[40][32]:=R*synRate*0.386364;
+MG94custom[40][36]:=CG*R*synRate*0.20142;
+MG94custom[40][41]:=AC*synRate*0.10767;
+MG94custom[40][42]:=synRate*0.19375;
+MG94custom[40][43]:=AT*synRate*0.220455;
+MG94custom[40][44]:=GT*R*synRate*0.261648;
+MG94custom[41][9]:=R*synRate*0.348864;
+MG94custom[41][25]:=CG*R*synRate*0.189773;
+MG94custom[41][33]:=R*synRate*0.386364;
+MG94custom[41][37]:=CG*R*synRate*0.20142;
+MG94custom[41][40]:=AC*synRate*0.478125;
+MG94custom[41][42]:=CG*synRate*0.19375;
+MG94custom[41][43]:=CT*synRate*0.220455;
+MG94custom[41][45]:=GT*R*synRate*0.261648;
+MG94custom[41][54]:=GT*R*synRate*0.176989;
+MG94custom[42][10]:=R*synRate*0.348864;
+MG94custom[42][26]:=CG*R*synRate*0.189773;
+MG94custom[42][34]:=R*synRate*0.386364;
+MG94custom[42][38]:=CG*R*synRate*0.20142;
+MG94custom[42][40]:=synRate*0.478125;
+MG94custom[42][41]:=CG*synRate*0.10767;
+MG94custom[42][43]:=GT*synRate*0.220455;
+MG94custom[42][46]:=GT*R*synRate*0.261648;
+MG94custom[42][55]:=GT*R*synRate*0.176989;
+MG94custom[43][11]:=R*synRate*0.348864;
+MG94custom[43][27]:=CG*R*synRate*0.189773;
+MG94custom[43][35]:=R*synRate*0.386364;
+MG94custom[43][39]:=CG*R*synRate*0.20142;
+MG94custom[43][40]:=AT*synRate*0.478125;
+MG94custom[43][41]:=CT*synRate*0.10767;
+MG94custom[43][42]:=GT*synRate*0.19375;
+MG94custom[43][47]:=GT*R*synRate*0.261648;
+MG94custom[43][56]:=GT*R*synRate*0.176989;
+MG94custom[44][12]:=R*synRate*0.348864;
+MG94custom[44][28]:=CG*R*synRate*0.189773;
+MG94custom[44][32]:=AT*R*synRate*0.386364;
+MG94custom[44][36]:=CT*R*synRate*0.20142;
+MG94custom[44][40]:=GT*R*synRate*0.150568;
+MG94custom[44][45]:=AC*synRate*0.10767;
+MG94custom[44][46]:=synRate*0.19375;
+MG94custom[44][47]:=AT*synRate*0.220455;
+MG94custom[44][57]:=GT*R*synRate*0.176989;
+MG94custom[45][13]:=R*synRate*0.348864;
+MG94custom[45][29]:=CG*R*synRate*0.189773;
+MG94custom[45][33]:=AT*R*synRate*0.386364;
+MG94custom[45][37]:=CT*R*synRate*0.20142;
+MG94custom[45][41]:=GT*R*synRate*0.150568;
+MG94custom[45][44]:=AC*synRate*0.478125;
+MG94custom[45][46]:=CG*synRate*0.19375;
+MG94custom[45][47]:=CT*synRate*0.220455;
+MG94custom[45][58]:=GT*R*synRate*0.176989;
+MG94custom[46][14]:=R*synRate*0.348864;
+MG94custom[46][30]:=CG*R*synRate*0.189773;
+MG94custom[46][34]:=AT*R*synRate*0.386364;
+MG94custom[46][38]:=CT*R*synRate*0.20142;
+MG94custom[46][42]:=GT*R*synRate*0.150568;
+MG94custom[46][44]:=synRate*0.478125;
+MG94custom[46][45]:=CG*synRate*0.10767;
+MG94custom[46][47]:=GT*synRate*0.220455;
+MG94custom[46][59]:=GT*R*synRate*0.176989;
+MG94custom[47][15]:=R*synRate*0.348864;
+MG94custom[47][31]:=CG*R*synRate*0.189773;
+MG94custom[47][35]:=AT*R*synRate*0.386364;
+MG94custom[47][39]:=CT*R*synRate*0.20142;
+MG94custom[47][43]:=GT*R*synRate*0.150568;
+MG94custom[47][44]:=AT*synRate*0.478125;
+MG94custom[47][45]:=CT*synRate*0.10767;
+MG94custom[47][46]:=GT*synRate*0.19375;
+MG94custom[47][60]:=GT*R*synRate*0.176989;
+MG94custom[48][1]:=AT*R*synRate*0.348864;
+MG94custom[48][17]:=CT*R*synRate*0.189773;
+MG94custom[48][33]:=GT*R*synRate*0.284375;
+MG94custom[48][49]:=CT*synRate*0.220455;
+MG94custom[48][51]:=AC*R*synRate*0.20142;
+MG94custom[48][54]:=R*synRate*0.150568;
+MG94custom[48][58]:=AT*R*synRate*0.261648;
+MG94custom[49][3]:=AT*R*synRate*0.348864;
+MG94custom[49][19]:=CT*R*synRate*0.189773;
+MG94custom[49][35]:=GT*R*synRate*0.284375;
+MG94custom[49][48]:=CT*synRate*0.10767;
+MG94custom[49][53]:=AC*R*synRate*0.20142;
+MG94custom[49][56]:=R*synRate*0.150568;
+MG94custom[49][60]:=AT*R*synRate*0.261648;
+MG94custom[50][4]:=AT*R*synRate*0.348864;
+MG94custom[50][20]:=CT*R*synRate*0.189773;
+MG94custom[50][36]:=GT*R*synRate*0.284375;
+MG94custom[50][51]:=AC*synRate*0.10767;
+MG94custom[50][52]:=synRate*0.19375;
+MG94custom[50][53]:=AT*synRate*0.220455;
+MG94custom[50][57]:=CT*R*synRate*0.261648;
+MG94custom[51][5]:=AT*R*synRate*0.348864;
+MG94custom[51][21]:=CT*R*synRate*0.189773;
+MG94custom[51][37]:=GT*R*synRate*0.284375;
+MG94custom[51][48]:=AC*R*synRate*0.386364;
+MG94custom[51][50]:=AC*synRate*0.478125;
+MG94custom[51][52]:=CG*synRate*0.19375;
+MG94custom[51][53]:=CT*synRate*0.220455;
+MG94custom[51][54]:=CG*R*synRate*0.150568;
+MG94custom[51][58]:=CT*R*synRate*0.261648;
+MG94custom[52][6]:=AT*R*synRate*0.348864;
+MG94custom[52][22]:=CT*R*synRate*0.189773;
+MG94custom[52][38]:=GT*R*synRate*0.284375;
+MG94custom[52][50]:=synRate*0.478125;
+MG94custom[52][51]:=CG*synRate*0.10767;
+MG94custom[52][53]:=GT*synRate*0.220455;
+MG94custom[52][55]:=CG*R*synRate*0.150568;
+MG94custom[52][59]:=CT*R*synRate*0.261648;
+MG94custom[53][7]:=AT*R*synRate*0.348864;
+MG94custom[53][23]:=CT*R*synRate*0.189773;
+MG94custom[53][39]:=GT*R*synRate*0.284375;
+MG94custom[53][49]:=AC*R*synRate*0.386364;
+MG94custom[53][50]:=AT*synRate*0.478125;
+MG94custom[53][51]:=CT*synRate*0.10767;
+MG94custom[53][52]:=GT*synRate*0.19375;
+MG94custom[53][56]:=CG*R*synRate*0.150568;
+MG94custom[53][60]:=CT*R*synRate*0.261648;
+MG94custom[54][9]:=AT*R*synRate*0.348864;
+MG94custom[54][25]:=CT*R*synRate*0.189773;
+MG94custom[54][41]:=GT*R*synRate*0.284375;
+MG94custom[54][48]:=R*synRate*0.386364;
+MG94custom[54][51]:=CG*R*synRate*0.20142;
+MG94custom[54][55]:=CG*R*synRate*0.19375;
+MG94custom[54][56]:=CT*synRate*0.220455;
+MG94custom[54][58]:=GT*R*synRate*0.261648;
+MG94custom[55][10]:=AT*R*synRate*0.348864;
+MG94custom[55][26]:=CT*R*synRate*0.189773;
+MG94custom[55][42]:=GT*R*synRate*0.284375;
+MG94custom[55][52]:=CG*R*synRate*0.20142;
+MG94custom[55][54]:=CG*R*synRate*0.10767;
+MG94custom[55][56]:=GT*R*synRate*0.220455;
+MG94custom[55][59]:=GT*R*synRate*0.261648;
+MG94custom[56][11]:=AT*R*synRate*0.348864;
+MG94custom[56][27]:=CT*R*synRate*0.189773;
+MG94custom[56][43]:=GT*R*synRate*0.284375;
+MG94custom[56][49]:=R*synRate*0.386364;
+MG94custom[56][53]:=CG*R*synRate*0.20142;
+MG94custom[56][54]:=CT*synRate*0.10767;
+MG94custom[56][55]:=GT*R*synRate*0.19375;
+MG94custom[56][60]:=GT*R*synRate*0.261648;
+MG94custom[57][12]:=AT*R*synRate*0.348864;
+MG94custom[57][28]:=CT*synRate*0.189773;
+MG94custom[57][44]:=GT*R*synRate*0.284375;
+MG94custom[57][50]:=CT*R*synRate*0.20142;
+MG94custom[57][58]:=AC*R*synRate*0.10767;
+MG94custom[57][59]:=synRate*0.19375;
+MG94custom[57][60]:=AT*R*synRate*0.220455;
+MG94custom[58][13]:=AT*R*synRate*0.348864;
+MG94custom[58][29]:=CT*R*synRate*0.189773;
+MG94custom[58][45]:=GT*R*synRate*0.284375;
+MG94custom[58][48]:=AT*R*synRate*0.386364;
+MG94custom[58][51]:=CT*R*synRate*0.20142;
+MG94custom[58][54]:=GT*R*synRate*0.150568;
+MG94custom[58][57]:=AC*R*synRate*0.478125;
+MG94custom[58][59]:=CG*R*synRate*0.19375;
+MG94custom[58][60]:=CT*synRate*0.220455;
+MG94custom[59][14]:=AT*R*synRate*0.348864;
+MG94custom[59][30]:=CT*synRate*0.189773;
+MG94custom[59][46]:=GT*R*synRate*0.284375;
+MG94custom[59][52]:=CT*R*synRate*0.20142;
+MG94custom[59][55]:=GT*R*synRate*0.150568;
+MG94custom[59][57]:=synRate*0.478125;
+MG94custom[59][58]:=CG*R*synRate*0.10767;
+MG94custom[59][60]:=GT*R*synRate*0.220455;
+MG94custom[60][15]:=AT*R*synRate*0.348864;
+MG94custom[60][31]:=CT*R*synRate*0.189773;
+MG94custom[60][47]:=GT*R*synRate*0.284375;
+MG94custom[60][49]:=AT*R*synRate*0.386364;
+MG94custom[60][53]:=CT*R*synRate*0.20142;
+MG94custom[60][56]:=GT*R*synRate*0.150568;
+MG94custom[60][57]:=AT*R*synRate*0.478125;
+MG94custom[60][58]:=CT*synRate*0.10767;
+MG94custom[60][59]:=GT*R*synRate*0.19375;
+
+vectorOfFrequencies={
+{   0.0684634387476}
+{   0.0154174945249}
+{   0.0277433542637}
+{   0.0315672183411}
+{   0.0356916015236}
+{  0.00803750266039}
+{   0.0144632633625}
+{   0.0164567336793}
+{   0.0266806048061}
+{  0.00600828830748}
+{   0.0108117483528}
+{   0.0123019306771}
+{    0.046363843446}
+{   0.0104408179834}
+{   0.0187879627036}
+{   0.0213775059501}
+{   0.0372423266151}
+{  0.00838671526271}
+{   0.0150916617656}
+{   0.0171717441791}
+{   0.0194153011545}
+{  0.00437219200093}
+{  0.00786763837634}
+{  0.00895203428158}
+{   0.0145135537544}
+{   0.0032683522715}
+{  0.00588130936454}
+{  0.00669192971684}
+{   0.0252207226563}
+{  0.00567953290953}
+{   0.0102201621222}
+{   0.0116288061683}
+{   0.0558077379368}
+{   0.0125675179311}
+{   0.0226149003404}
+{   0.0257319100647}
+{   0.0290938869097}
+{  0.00655174280379}
+{   0.0117896796627}
+{   0.0134146501734}
+{   0.0217486037548}
+{  0.00489763566432}
+{  0.00881315969148}
+{   0.0100278767164}
+{   0.0377933284116}
+{  0.00851079706952}
+{   0.0153149435393}
+{     0.01742580086}
+{  0.00782174192914}
+{   0.0160149650053}
+{   0.0181073841606}
+{  0.00407765810865}
+{  0.00733763279709}
+{  0.00834897807998}
+{  0.00304817884003}
+{  0.00548511337442}
+{  0.00624112606825}
+{   0.0235217218785}
+{  0.00529692964466}
+{  0.00953167814686}
+{   0.0108454285073}
+}
+;
+Model MG94customModel=(MG94custom,vectorOfFrequencies,0);
+
+UseModel (MG94customModel);
+Tree givenTree=(((D_CD_83_ELI_ACC_K03454,D_CD_83_NDK_ACC_M27323)Node3,D_UG_94_94UG114_ACC_U88824)Node2,D_CD_84_84ZR085_ACC_U88822,(B_US_83_RF_ACC_M17451,((B_FR_83_HXB2_ACC_K03455,B_US_86_JRFL_ACC_U63632)Node11,B_US_90_WEAU160_ACC_U21135)Node10)Node8);
+
+DataSet ds = ReadDataFile(USE_NEXUS_FILE_DATA);
+DataSetFilter filteredData = CreateFilter(ds,3,"0-1319","4,5,7,6,1,0,2,3","TAA,TAG,TGA");
+LikelihoodFunction lf = (filteredData,givenTree);
+
+Optimize (res,lf);
+fprintf (stdout, lf);
+timer2 = Time (1);
+expectedLL = -3189.516375;
+diffLL	   = Abs(expectedLL - res[1][0]);
+fprintf 	 (stdout, "\nTest optimization took ", timer2-timer, " seconds.\n", diffLL , " difference between obtained and expected likelihood\n");
+
+DataSet	 mlAncestors = ReconstructAncestors (lf);
+
+for (k = 0; k < 100; k = k + 1)
+{
+	DataSet	 sampledSequences = SampleAncestors (lf);
+}
+
+DataSet	 margAncestors = ReconstructAncestors (lf,MARGINAL);
+
+END;
diff --git a/tests/hbltests/Ancestors/LeafProbs.bf b/tests/hbltests/Ancestors/LeafProbs.bf
new file mode 100644
index 0000000..2dbdaa3
--- /dev/null
+++ b/tests/hbltests/Ancestors/LeafProbs.bf
@@ -0,0 +1,118 @@
+#NEXUS
+
+BEGIN TAXA;
+	DIMENSIONS NTAX = 8;
+	TAXLABELS
+		'B_FR_83_HXB2_ACC_K03455''B_US_83_RF_ACC_M17451''B_US_86_JRFL_ACC_U63632''B_US_90_WEAU160_ACC_U21135''D_CD_83_ELI_ACC_K03454''D_CD_83_NDK_ACC_M27323''D_CD_84_84ZR085_ACC_U88822''D_UG_94_94UG114_ACC_U88824';
+END;
+
+BEGIN CHARACTERS;
+	DIMENSIONS NCHAR = 1320;
+	FORMAT
+		DATATYPE = DNA
+		GAP=-
+		MISSING=?
+	;
+
+MATRIX
+	'B_FR_83_HXB2_ACC_K03455'     CCCATTAGCCCTATTGAGACTGTACCAGTAAAATTAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAATAAAAGCATTAGTAGAAATTTGTACAGAGATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAAGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGATGGAA [...]
+	'B_US_83_RF_ACC_M17451'       CCCATTAGTCCTATTGAAACTGTACCAGTAAAATTAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAGGAAAAAATAAAAGCATTGGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCCAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAGTTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAGAAATCAGTAACAGTATTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATAAAGAGTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAAACACCACGGATTAGATATCAGTACAATGTGCTTCCACAAGGGTGGAA [...]
+	'B_US_86_JRFL_ACC_U63632'     CCCATTAGTCCTATTGAAACTGTACCAGTAAAATTAAAGCCAGGAATGGATGGCCCAAAAGTCAAACAATGGCCATTGACAGAAGAAAAAATAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAGAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATAAAGACTTCAGGAAATATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGGTATCAGTACAATGTGCTTCCGCAGGGATGGAA [...]
+	'B_US_90_WEAU160_ACC_U21135'  CCCATTAGTCCTATTGAAACTGTACCAGTAAAATTAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAGAAAATAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTTCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTACCCTTAGATGAAGACTTCAGGAAGTACACTGCATTTACCATACCTAGTATAAACAATGAAACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGATGGAA [...]
+	'D_CD_83_ELI_ACC_K03454'      CCAATTAGTCCTATTGAAACTGTACCAGTAAAATTAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAATAAAAGCATTAACAGAAATTTGTACAGATATGGAAAAGGAAGGAAAAATTTCAAGAATTGGGCCTGAAAATCCATACAATACTCCAATATTTGCCATAAAGAAAAAAGACAGTACCAAGTGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGATTTCTGGGAAGTTCAATTAGGAATACCGCATCCTGCAGGGCTGAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAAGATTTTAGGAAATATACCGCCTTTACCATATCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGATGGAA [...]
+	'D_CD_83_NDK_ACC_M27323'      CCAATTAGTCCTATTGAAACTGTACCAGTAAAATTAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAATAAAAGCATTAACAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAGAATTGGGCCTGAAAATCCATATAATACTCCAATATTTGCCATAAAGAAAAAAGACAGTACCAAGTGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGATTTCTGGGAGGTTCAATTAGGAATACCGCATCCTGCAGGGCTGAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATGAAGATTTTAGGAAATATACCGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTCCCACAGGGATGGAA [...]
+	'D_CD_84_84ZR085_ACC_U88822'  CCAATTAGTCCTATTGAAACTGTACCAGTAAAATTAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCGTTGACAGAAGAAAAAATAAAAGCATTAACAGAAATTTGTACAGATATGGAAAAGGAAGGAAAAATTTCAAGAATTGGGCCTGAAAATCCATACAATACTCCAATATTTGCCATAAAGAAAAAAGACAGTACTAAGTGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGGATACCACATCCTGCAGGATTAAAGAAGAAAAAGTCAATAACAGTACTGGATGTGGGCGATGCATATTTTTCAATTCCCTTATGTGAAGACTTTAGGAAGTACACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTACTTCCACAGGGATGGAA [...]
+	'D_UG_94_94UG114_ACC_U88824'  CCAATTAGTCCTATTGAAACTGTACCAGTAAAATTAAAGCCAGGGATGGATGGCCCAAAAGTTAAACAATGGCCGTTGACAGAAGAAAAAATAAAAGCACTAATAGAAATTTGTTCAGAACTAGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAACCCATACAATACTCCAATATTTGCCATAAAGAAAAAAGACAGTACTAAGTGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTTTGGGAAGTTCAACTAGGAATACCACATCCTGCAGGGCTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGACGCATATTTTTCAGTTCCCTTACATGAAGACTTTAGAAAATATACCGCATTCACCATACCTAGTACAAACAATGAGACACCAGGAATTAGATATCAGTACAATGTGCTTCCACAAGGATGGAA [...]
+END;
+
+BEGIN TREES;
+	TREE tree = ((((D_CD_83_ELI_ACC_K03454,D_CD_83_NDK_ACC_M27323),D_UG_94_94UG114_ACC_U88824),D_CD_84_84ZR085_ACC_U88822),B_US_83_RF_ACC_M17451,((B_FR_83_HXB2_ACC_K03455,B_US_86_JRFL_ACC_U63632),B_US_90_WEAU160_ACC_U21135));
+END;
+
+BEGIN HYPHY;
+USE_ADAPTIVE_VARIABLE_STEP = 0;
+timer = Time(1);
+OPTIMIZATION_PRECISION = 0.001;
+OPTIMIZATION_METHOD    = 4;
+VERBOSITY_LEVEL        = -1;
+
+DataSet ds = ReadDataFile(USE_NEXUS_FILE_DATA);
+DataSetFilter filteredData = CreateFilter(ds,1);
+
+HarvestFrequencies (nucFreqs, filteredData, 1, 1, 1);
+global kappa = 1;
+HKY_Q = {{*,t,t*kappa,t}{t,*,t,t*kappa}{t,t*kappa,*,t}{t,t*kappa,t,*}};
+Model HKY85 = (HKY_Q, nucFreqs, 1);
+
+Tree givenTree=(((D_CD_83_ELI_ACC_K03454,D_CD_83_NDK_ACC_M27323)Node3,D_UG_94_94UG114_ACC_U88824)Node2,D_CD_84_84ZR085_ACC_U88822,(B_US_83_RF_ACC_M17451,((B_FR_83_HXB2_ACC_K03455,B_US_86_JRFL_ACC_U63632)Node11,B_US_90_WEAU160_ACC_U21135)Node10)Node8);
+
+LikelihoodFunction _lf_ID = (filteredData,givenTree);
+
+Optimize (res,_lf_ID);
+fprintf (stdout, _lf_ID);
+timer2 = Time (1);
+expectedLL = -3376.66741896393;
+diffLL	   = Abs(expectedLL - res[1][0]);
+
+fprintf 	 (stdout, "\nTest optimization took ", timer2-timer, " seconds.\n", diffLL , " difference between obtained and expected likelihood\n");
+
+DataSet	 		_marginalAncestors 			= ReconstructAncestors (_lf_ID,MARGINAL,DOLEAVES);
+DataSetFilter	_marginalAncestorsFilter	= CreateFilter 		   (_marginalAncestors, 1);
+GetDataInfo 	(_marginalFilterSiteToPatternMap, filteredData);
+GetString		(_AncestralNodeNames, _marginalAncestorsFilter, -1);
+
+_idx_3 = 0;
+GetDataInfo				(_AncestalFilterChars,_marginalAncestorsFilter,"CHARACTERS");
+_characterDimension 	= Columns (_AncestalFilterChars);
+
+
+_marginalInformation	= {};
+/* [(i,j)] -> {chars,1} - marginal support for each character */
+
+for (_idx_1 = 0; _idx_1 < _marginalAncestorsFilter.species; _idx_1 = _idx_1 + 1)
+{
+	for (_idx_2 = 0; _idx_2 < _marginalAncestorsFilter.sites; _idx_2 = _idx_2 + 1)
+	{
+		_patternIndex 				 = _marginalFilterSiteToPatternMap[_idx_2];
+		_marginalInformation[_idx_3] = _marginalAncestors.marginal_support_matrix[{{_idx_1,_patternIndex*_characterDimension}}][{{_idx_1,(1+_patternIndex)*_characterDimension-1}}];
+		_idx_3 						 = _idx_3+1;
+	}
+
+}
+
+_outputCSV = ""; _outputCSV * 2048; 
+_outputCSV * "Sequence,Site";
+
+_idx_3 = 0;
+for (_idx_1 = 0; _idx_1 < _marginalAncestorsFilter.species; _idx_1 = _idx_1 + 1)
+{
+	for (_idx_2 = 0; _idx_2 < _marginalAncestorsFilter.sites; _idx_2 = _idx_2 + 1)
+	{
+		_outputCSV * ("\n" + _AncestralNodeNames[_idx_1] + "," + (1+_idx_2));
+		
+		_maxValue = 0;
+		_maxIndex = 0;
+
+		for (_idx_4 = 0; _idx_4 < _characterDimension; _idx_4 = _idx_4 + 1)
+		{
+			_thisCharacter = (_marginalInformation[_idx_3])[_idx_4];
+			_outputCSV * ("," + _thisCharacter);
+			if (_thisCharacter > _maxValue)
+			{
+				_maxValue = _thisCharacter;
+				_maxIndex = _idx_4;
+			}
+		}
+		
+		_idx_3 = _idx_3 + 1;
+		
+	}
+}
+
+_outputCSV * 0;
+
+fprintf ("dump.csv", CLEAR_FILE, _outputCSV);
+
+return 0;
+
+END;
diff --git a/tests/hbltests/Ancestors/NucAncestors.bf b/tests/hbltests/Ancestors/NucAncestors.bf
new file mode 100644
index 0000000..81690f9
--- /dev/null
+++ b/tests/hbltests/Ancestors/NucAncestors.bf
@@ -0,0 +1,226 @@
+#NEXUS
+
+BEGIN TAXA;
+	DIMENSIONS NTAX = 8;
+	TAXLABELS
+		'B_FR_83_HXB2_ACC_K03455' 'B_US_83_RF_ACC_M17451' 'B_US_86_JRFL_ACC_U63632' 'B_US_90_WEAU160_ACC_U21135' 'D_CD_83_ELI_ACC_K03454' 'D_CD_83_NDK_ACC_M27323' 'D_CD_84_84ZR085_ACC_U88822' 'D_UG_94_94UG114_ACC_U88824';
+END;
+
+BEGIN CHARACTERS;
+	DIMENSIONS NCHAR = 1320;
+	FORMAT
+		DATATYPE = DNA
+		GAP=-
+		MISSING=?
+	;
+
+MATRIX
+	'B_FR_83_HXB2_ACC_K03455'     CCCATTAGCCCTATTGAGACTGTACCAGTAAAATTAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAATAAAAGCATTAGTAGAAATTTGTACAGAGATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAAGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGATGGAA [...]
+	'B_US_83_RF_ACC_M17451'       CCCATTAGTCCTATTGAAACTGTACCAGTAAAATTAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAGGAAAAAATAAAAGCATTGGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCCAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAGTTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAGAAATCAGTAACAGTATTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATAAAGAGTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAAACACCACGGATTAGATATCAGTACAATGTGCTTCCACAAGGGTGGAA [...]
+	'B_US_86_JRFL_ACC_U63632'     CCCATTAGTCCTATTGAAACTGTACCAGTAAAATTAAAGCCAGGAATGGATGGCCCAAAAGTCAAACAATGGCCATTGACAGAAGAAAAAATAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAGAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATAAAGACTTCAGGAAATATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGGTATCAGTACAATGTGCTTCCGCAGGGATGGAA [...]
+	'B_US_90_WEAU160_ACC_U21135'  CCCATTAGTCCTATTGAAACTGTACCAGTAAAATTAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAGAAAATAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTTCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTACCCTTAGATGAAGACTTCAGGAAGTACACTGCATTTACCATACCTAGTATAAACAATGAAACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGATGGAA [...]
+	'D_CD_83_ELI_ACC_K03454'      CCAATTAGTCCTATTGAAACTGTACCAGTAAAATTAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAATAAAAGCATTAACAGAAATTTGTACAGATATGGAAAAGGAAGGAAAAATTTCAAGAATTGGGCCTGAAAATCCATACAATACTCCAATATTTGCCATAAAGAAAAAAGACAGTACCAAGTGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGATTTCTGGGAAGTTCAATTAGGAATACCGCATCCTGCAGGGCTGAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAAGATTTTAGGAAATATACCGCCTTTACCATATCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGATGGAA [...]
+	'D_CD_83_NDK_ACC_M27323'      CCAATTAGTCCTATTGAAACTGTACCAGTAAAATTAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAATAAAAGCATTAACAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAGAATTGGGCCTGAAAATCCATATAATACTCCAATATTTGCCATAAAGAAAAAAGACAGTACCAAGTGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGATTTCTGGGAGGTTCAATTAGGAATACCGCATCCTGCAGGGCTGAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATGAAGATTTTAGGAAATATACCGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTCCCACAGGGATGGAA [...]
+	'D_CD_84_84ZR085_ACC_U88822'  CCAATTAGTCCTATTGAAACTGTACCAGTAAAATTAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCGTTGACAGAAGAAAAAATAAAAGCATTAACAGAAATTTGTACAGATATGGAAAAGGAAGGAAAAATTTCAAGAATTGGGCCTGAAAATCCATACAATACTCCAATATTTGCCATAAAGAAAAAAGACAGTACTAAGTGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGGATACCACATCCTGCAGGATTAAAGAAGAAAAAGTCAATAACAGTACTGGATGTGGGCGATGCATATTTTTCAATTCCCTTATGTGAAGACTTTAGGAAGTACACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTACTTCCACAGGGATGGAA [...]
+	'D_UG_94_94UG114_ACC_U88824'  CCAATTAGTCCTATTGAAACTGTACCAGTAAAATTAAAGCCAGGGATGGATGGCCCAAAAGTTAAACAATGGCCGTTGACAGAAGAAAAAATAAAAGCACTAATAGAAATTTGTTCAGAACTAGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAACCCATACAATACTCCAATATTTGCCATAAAGAAAAAAGACAGTACTAAGTGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTTTGGGAAGTTCAACTAGGAATACCACATCCTGCAGGGCTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGACGCATATTTTTCAGTTCCCTTACATGAAGACTTTAGAAAATATACCGCATTCACCATACCTAGTACAAACAATGAGACACCAGGAATTAGATATCAGTACAATGTGCTTCCACAAGGATGGAA [...]
+END;
+
+BEGIN TREES;
+	TREE tree = ((((D_CD_83_ELI_ACC_K03454,D_CD_83_NDK_ACC_M27323),D_UG_94_94UG114_ACC_U88824),D_CD_84_84ZR085_ACC_U88822),B_US_83_RF_ACC_M17451,((B_FR_83_HXB2_ACC_K03455,B_US_86_JRFL_ACC_U63632),B_US_90_WEAU160_ACC_U21135));
+END;
+
+BEGIN HYPHY;
+USE_ADAPTIVE_VARIABLE_STEP = 0;
+timer = Time(1);
+OPTIMIZATION_PRECISION = 0.001;
+OPTIMIZATION_METHOD    = 4;
+VERBOSITY_LEVEL        = -1;
+
+DataSet ds = ReadDataFile(USE_NEXUS_FILE_DATA);
+DataSetFilter filteredData = CreateFilter(ds,1);
+
+HarvestFrequencies (nucFreqs, filteredData, 1, 1, 1);
+global kappa = 1;
+HKY_Q = {{*,t,t*kappa,t}{t,*,t,t*kappa}{t,t*kappa,*,t}{t,t*kappa,t,*}};
+Model HKY85 = (HKY_Q, nucFreqs, 1);
+
+Tree givenTree=(((D_CD_83_ELI_ACC_K03454,D_CD_83_NDK_ACC_M27323)Node3,D_UG_94_94UG114_ACC_U88824)Node2,D_CD_84_84ZR085_ACC_U88822,(B_US_83_RF_ACC_M17451,((B_FR_83_HXB2_ACC_K03455,B_US_86_JRFL_ACC_U63632)Node11,B_US_90_WEAU160_ACC_U21135)Node10)Node8);
+
+LikelihoodFunction _lf_ID = (filteredData,givenTree);
+
+Optimize (res,_lf_ID);
+fprintf (stdout, _lf_ID);
+timer2 = Time (1);
+expectedLL = -3376.66741896393;
+diffLL	   = Abs(expectedLL - res[1][0]);
+
+fprintf 	 (stdout, "\nTest optimization took ", timer2-timer, " seconds.\n", diffLL , " difference between obtained and expected likelihood\n");
+
+expectedSequences=
+{
+{"CCAATTAGTCCTATTGAAACTGTACCAGTAAAATTAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAATAAAAGCATTAACAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAATATTTGCCATAAAGAAAAAAGACAGTACTAAGTGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAAGACTTTAGGAAATATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGATGGAAAGGATCACCAGCAATATTCCAAAGTAGCA [...]
+{"CCAATTAGTCCTATTGAAACTGTACCAGTAAAATTAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAATAAAAGCATTAACAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAATATTTGCCATAAAGAAAAAAGACAGTACTAAGTGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGCTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAAGACTTTAGGAAATATACCGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGATGGAAAGGATCACCAGCAATATTCCAAAGTAGCA [...]
+{"CCAATTAGTCCTATTGAAACTGTACCAGTAAAATTAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAATAAAAGCATTAACAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAGAATTGGGCCTGAAAATCCATACAATACTCCAATATTTGCCATAAAGAAAAAAGACAGTACCAAGTGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGATTTCTGGGAAGTTCAATTAGGAATACCGCATCCTGCAGGGCTGAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAAGATTTTAGGAAATATACCGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGATGGAAAGGATCACCGGCAATATTCCAAAGTAGCA [...]
+{"CCCATTAGTCCTATTGAAACTGTACCAGTAAAATTAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAATAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAAGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGATGGAAAGGATCACCAGCAATATTCCAAAGTAGCA [...]
+{"CCCATTAGTCCTATTGAAACTGTACCAGTAAAATTAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAATAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAAGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGATGGAAAGGATCACCAGCAATATTCCAAAGTAGCA [...]
+{"CCCATTAGTCCTATTGAAACTGTACCAGTAAAATTAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAATAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAAGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGATGGAAAGGATCACCAGCAATATTCCAAAGTAGCA [...]
+};
+
+
+DataSet	 				mlAncestors = ReconstructAncestors (_lf_ID);
+DataSetFilter			_AncestalFilter	= CreateFilter (mlAncestors,1);
+GetDataInfo				(_AncestalFilterChars,_AncestalFilter,"CHARACTERS");
+
+for (k = 0; k < _AncestalFilter.species; k = k+1)
+{
+	GetDataInfo (aSeq, _AncestalFilter, k);
+	if 	(aSeq != expectedSequences[k])
+	{
+		fprintf (stdout, "[ERROR: MISMATCHED ", k+1, "-TH SEQUENCE]\nRecovered:\n", aSeq, "\nExpected:\n", expectedSequences[k]);
+		return 1;
+	}
+	
+}
+
+fprintf (stdout, "[OK: ML SEQUENCE RECONSTRUCTION]\n");
+
+
+_samplingIterates		= 100;
+
+_characterDimension 	= Columns (_AncestalFilterChars);
+
+/* indexed linearly by seq*_AncestalFilter.sites + site -> (seq,site)*/
+_mlInformation			= {};
+/* [(i,j)] -> integer - most likely ancestor or (-1) for gap */
+
+_sampledInformation		= {};
+/* [(i,j)] -> {chars,1} - the frequency of each sampled character */
+
+_marginalInformation	= {};
+/* [(i,j)] -> {chars,1} - marginal support for each character */
+
+GetString   (_AncestralNodeNames, _AncestalFilter, -1);
+GetDataInfo (_AncestalFilterSiteToPatternMap, _AncestalFilter);
+
+_idx_3 = 0;
+_utility_Vector1 = {1,_characterDimension}["1"];
+_utility_Vector2 = {1,_characterDimension}["_MATRIX_ELEMENT_COLUMN_"];
+
+for (_idx_1 = 0; _idx_1 < _AncestalFilter.species; _idx_1 = _idx_1 + 1)
+{
+	for (_idx_2 = 0; _idx_2 < _AncestalFilter.sites; _idx_2 = _idx_2 + 1)
+	{
+		GetDataInfo (_charInfo, _AncestalFilter, _idx_1, _AncestalFilterSiteToPatternMap[_idx_2]);
+		_whichChar = (_utility_Vector1*_charInfo)[0];
+		if (_whichChar > 1)
+		{
+			_mlInformation[_idx_3] = -1;
+		}
+		else
+		{
+			_mlInformation[_idx_3] = (_utility_Vector2*_charInfo)[0];
+		}
+		_sampledInformation[_idx_3] = {_characterDimension,1};
+		_idx_3 = _idx_3+1;
+	}
+
+}
+
+
+for (k = 0; k < _samplingIterates; k = k + 1)
+{
+	DataSet	 			_sampledSequences = SampleAncestors (_lf_ID);
+	DataSetFilter		_sampledFilter	  = CreateFilter (_sampledSequences,1);
+	_idx_3 								  = 0;
+	
+	GetDataInfo (_sampledFilterSiteToPatternMap, _sampledFilter);
+	for (_idx_1 = 0; _idx_1 < _sampledFilter.species; _idx_1 = _idx_1 + 1)
+	{
+		for (_idx_2 = 0; _idx_2 < _sampledFilter.sites; _idx_2 = _idx_2 + 1)
+		{
+			GetDataInfo 			 	  (_charInfo, _sampledFilter, _idx_1, _sampledFilterSiteToPatternMap[_idx_2]);
+			_sampledInformation[_idx_3] = _sampledInformation[_idx_3]+_charInfo;
+			_idx_3 = _idx_3+1;
+		}
+	}
+}
+
+DataSet	 		_marginalAncestors 			= ReconstructAncestors (_lf_ID,MARGINAL);
+DataSetFilter	_marginalAncestorsFilter	= CreateFilter 		   (_marginalAncestors, 1);
+GetDataInfo 	(_marginalFilterSiteToPatternMap, filteredData);
+
+_idx_3 = 0;
+for (_idx_1 = 0; _idx_1 < _marginalAncestorsFilter.species; _idx_1 = _idx_1 + 1)
+{
+	for (_idx_2 = 0; _idx_2 < _marginalAncestorsFilter.sites; _idx_2 = _idx_2 + 1)
+	{
+		_patternIndex 				 = _marginalFilterSiteToPatternMap[_idx_2];
+		_marginalInformation[_idx_3] = _marginalAncestors.marginal_support_matrix[{{_idx_1,_patternIndex*_characterDimension}}][{{_idx_1,(1+_patternIndex)*_characterDimension-1}}];
+		_idx_3 						 = _idx_3+1;
+	}
+
+}
+
+_outputCSV = ""; _outputCSV * 2048; 
+_outputCSV * "Sequence,Site,ML Joint";
+for (_idx_1 = 0; _idx_1 < _characterDimension; _idx_1 = _idx_1 + 1)
+{
+	_outputCSV * (",Sampled "+ _AncestalFilterChars[_idx_1]);
+}
+for (_idx_1 = 0; _idx_1 < _characterDimension; _idx_1 = _idx_1 + 1)
+{
+	_outputCSV * (",Marginal "+ _AncestalFilterChars[_idx_1]);
+}
+
+_idx_3 = 0;
+for (_idx_1 = 0; _idx_1 < _marginalAncestorsFilter.species; _idx_1 = _idx_1 + 1)
+{
+	for (_idx_2 = 0; _idx_2 < _marginalAncestorsFilter.sites; _idx_2 = _idx_2 + 1)
+	{
+		_outputCSV * ("\n" + _AncestralNodeNames[_idx_1] + "," + (1+_idx_2) + "," + _AncestalFilterChars[_mlInformation[_idx_3]]);
+		
+		_maxValue = 0;
+		_maxIndex = 0;
+		
+		for (_idx_4 = 0; _idx_4 < _characterDimension; _idx_4 = _idx_4 + 1)
+		{
+			_thisCharacter = (_sampledInformation[_idx_3])[_idx_4]/_samplingIterates;
+			_outputCSV * ("," + _thisCharacter);
+			if (_thisCharacter > _maxValue)
+			{
+				_maxValue = _thisCharacter;
+				_maxIndex = _idx_4;
+			}
+		}
+		_maxIndexSampled = _maxIndex;
+
+		_maxValue = 0;
+		_maxIndex = 0;
+
+		for (_idx_4 = 0; _idx_4 < _characterDimension; _idx_4 = _idx_4 + 1)
+		{
+			_thisCharacter = (_marginalInformation[_idx_3])[_idx_4];
+			_outputCSV * ("," + _thisCharacter);
+			if (_thisCharacter > _maxValue)
+			{
+				_maxValue = _thisCharacter;
+				_maxIndex = _idx_4;
+			}
+		}
+		_maxIndexMarginal = _maxIndex;
+		if (_mlInformation[_idx_3] != _maxIndexMarginal || _maxIndexMarginal != _maxIndexSampled || _maxIndexSampled != _mlInformation[_idx_3])
+		{
+			fprintf (stdout, _idx_1, ":", _idx_2+1, " is discrepant\n");
+		}
+		_idx_3 = _idx_3 + 1;
+		
+	}
+}
+
+_outputCSV * 0;
+
+fprintf ("../spool/nuc_ancestors.csv", CLEAR_FILE, _outputCSV);
+
+return 0;
+
+END;
diff --git a/tests/hbltests/Ancestors/NucRVAncestors.bf b/tests/hbltests/Ancestors/NucRVAncestors.bf
new file mode 100644
index 0000000..783f4b3
--- /dev/null
+++ b/tests/hbltests/Ancestors/NucRVAncestors.bf
@@ -0,0 +1,114 @@
+#NEXUS
+
+BEGIN TAXA;
+	DIMENSIONS NTAX = 8;
+	TAXLABELS
+		'B_FR_83_HXB2_ACC_K03455' 'B_US_83_RF_ACC_M17451' 'B_US_86_JRFL_ACC_U63632' 'B_US_90_WEAU160_ACC_U21135' 'D_CD_83_ELI_ACC_K03454' 'D_CD_83_NDK_ACC_M27323' 'D_CD_84_84ZR085_ACC_U88822' 'D_UG_94_94UG114_ACC_U88824' ;
+END;
+
+BEGIN CHARACTERS;
+	DIMENSIONS NCHAR = 1320;
+	FORMAT
+		DATATYPE = DNA
+		GAP=-
+		MISSING=?
+	;
+
+MATRIX
+	'B_FR_83_HXB2_ACC_K03455'     CCCATTAGCCCTATTGAGACTGTACCAGTAAAATTAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAATAAAAGCATTAGTAGAAATTTGTACAGAGATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAAGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGATGGAA [...]
+	'B_US_83_RF_ACC_M17451'       CCCATTAGTCCTATTGAAACTGTACCAGTAAAATTAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAGGAAAAAATAAAAGCATTGGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCCAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAGTTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAGAAATCAGTAACAGTATTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATAAAGAGTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAAACACCACGGATTAGATATCAGTACAATGTGCTTCCACAAGGGTGGAA [...]
+	'B_US_86_JRFL_ACC_U63632'     CCCATTAGTCCTATTGAAACTGTACCAGTAAAATTAAAGCCAGGAATGGATGGCCCAAAAGTCAAACAATGGCCATTGACAGAAGAAAAAATAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAGAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATAAAGACTTCAGGAAATATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGGTATCAGTACAATGTGCTTCCGCAGGGATGGAA [...]
+	'B_US_90_WEAU160_ACC_U21135'  CCCATTAGTCCTATTGAAACTGTACCAGTAAAATTAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAGAAAATAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTTCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTACCCTTAGATGAAGACTTCAGGAAGTACACTGCATTTACCATACCTAGTATAAACAATGAAACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGATGGAA [...]
+	'D_CD_83_ELI_ACC_K03454'      CCAATTAGTCCTATTGAAACTGTACCAGTAAAATTAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAATAAAAGCATTAACAGAAATTTGTACAGATATGGAAAAGGAAGGAAAAATTTCAAGAATTGGGCCTGAAAATCCATACAATACTCCAATATTTGCCATAAAGAAAAAAGACAGTACCAAGTGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGATTTCTGGGAAGTTCAATTAGGAATACCGCATCCTGCAGGGCTGAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAAGATTTTAGGAAATATACCGCCTTTACCATATCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGATGGAA [...]
+	'D_CD_83_NDK_ACC_M27323'      CCAATTAGTCCTATTGAAACTGTACCAGTAAAATTAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAATAAAAGCATTAACAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAGAATTGGGCCTGAAAATCCATATAATACTCCAATATTTGCCATAAAGAAAAAAGACAGTACCAAGTGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGATTTCTGGGAGGTTCAATTAGGAATACCGCATCCTGCAGGGCTGAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATGAAGATTTTAGGAAATATACCGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTCCCACAGGGATGGAA [...]
+	'D_CD_84_84ZR085_ACC_U88822'  CCAATTAGTCCTATTGAAACTGTACCAGTAAAATTAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCGTTGACAGAAGAAAAAATAAAAGCATTAACAGAAATTTGTACAGATATGGAAAAGGAAGGAAAAATTTCAAGAATTGGGCCTGAAAATCCATACAATACTCCAATATTTGCCATAAAGAAAAAAGACAGTACTAAGTGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGGATACCACATCCTGCAGGATTAAAGAAGAAAAAGTCAATAACAGTACTGGATGTGGGCGATGCATATTTTTCAATTCCCTTATGTGAAGACTTTAGGAAGTACACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTACTTCCACAGGGATGGAA [...]
+	'D_UG_94_94UG114_ACC_U88824'  CCAATTAGTCCTATTGAAACTGTACCAGTAAAATTAAAGCCAGGGATGGATGGCCCAAAAGTTAAACAATGGCCGTTGACAGAAGAAAAAATAAAAGCACTAATAGAAATTTGTTCAGAACTAGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAACCCATACAATACTCCAATATTTGCCATAAAGAAAAAAGACAGTACTAAGTGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTTTGGGAAGTTCAACTAGGAATACCACATCCTGCAGGGCTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGACGCATATTTTTCAGTTCCCTTACATGAAGACTTTAGAAAATATACCGCATTCACCATACCTAGTACAAACAATGAGACACCAGGAATTAGATATCAGTACAATGTGCTTCCACAAGGATGGAA [...]
+END;
+
+BEGIN TREES;
+	TREE tree = ((((D_CD_83_ELI_ACC_K03454,D_CD_83_NDK_ACC_M27323),D_UG_94_94UG114_ACC_U88824),D_CD_84_84ZR085_ACC_U88822),B_US_83_RF_ACC_M17451,((B_FR_83_HXB2_ACC_K03455,B_US_86_JRFL_ACC_U63632),B_US_90_WEAU160_ACC_U21135));
+END;
+
+BEGIN HYPHY;
+
+fprintf (stdout, "\nRunning an HKY+gamma model fit on an HIV-1 RT (p51) alignment with 8 sequences and 1320 nucleotides\n");
+
+OPTIMIZE_SUMMATION_ORDER = 1;
+
+timer = Time (1);
+
+global SmallCodon_part_Shared_TVTS=1;
+global SmallCodon_part_Shape=0.5;
+SmallCodon_part_Shape:>0.01;
+SmallCodon_part_Shape:<100;
+SmallCodon_part_Categ.weights={
+{              0.25}
+{              0.25}
+{              0.25}
+{              0.25}
+}
+;
+
+
+category SmallCodon_part_Categ=(4,SmallCodon_part_Categ.weights,MEAN,GammaDist(_x_,SmallCodon_part_Shape,SmallCodon_part_Shape),CGammaDist(_x_,SmallCodon_part_Shape,SmallCodon_part_Shape),0,1e+25,CGammaDist(_x_,SmallCodon_part_Shape+1,SmallCodon_part_Shape));
+SmallCodon_part_HKY85={4,4};
+SmallCodon_part_HKY85[0][1]:=t*SmallCodon_part_Shared_TVTS*SmallCodon_part_Categ;
+SmallCodon_part_HKY85[0][2]:=t*SmallCodon_part_Categ;
+SmallCodon_part_HKY85[0][3]:=t*SmallCodon_part_Shared_TVTS*SmallCodon_part_Categ;
+SmallCodon_part_HKY85[1][0]:=t*SmallCodon_part_Shared_TVTS*SmallCodon_part_Categ;
+SmallCodon_part_HKY85[1][2]:=t*SmallCodon_part_Shared_TVTS*SmallCodon_part_Categ;
+SmallCodon_part_HKY85[1][3]:=t*SmallCodon_part_Categ;
+SmallCodon_part_HKY85[2][0]:=t*SmallCodon_part_Categ;
+SmallCodon_part_HKY85[2][1]:=t*SmallCodon_part_Shared_TVTS*SmallCodon_part_Categ;
+SmallCodon_part_HKY85[2][3]:=t*SmallCodon_part_Shared_TVTS*SmallCodon_part_Categ;
+SmallCodon_part_HKY85[3][0]:=t*SmallCodon_part_Shared_TVTS*SmallCodon_part_Categ;
+SmallCodon_part_HKY85[3][1]:=t*SmallCodon_part_Categ;
+SmallCodon_part_HKY85[3][2]:=t*SmallCodon_part_Shared_TVTS*SmallCodon_part_Categ;
+
+SmallCodon_part_Freqs={
+{    0.404450757576}
+{    0.166287878788}
+{    0.209564393939}
+{    0.219696969697}
+}
+;
+Model SmallCodon_part_HKY85_model=(SmallCodon_part_HKY85,SmallCodon_part_Freqs);
+
+UseModel (SmallCodon_part_HKY85_model);
+Tree SmallCodon_tree=((((D_CD_83_ELI_ACC_K03454,D_CD_83_NDK_ACC_M27323)Node3,D_UG_94_94UG114_ACC_U88824)Node2,D_CD_84_84ZR085_ACC_U88822)Node1,B_US_83_RF_ACC_M17451,((B_FR_83_HXB2_ACC_K03455,B_US_86_JRFL_ACC_U63632)Node10,B_US_90_WEAU160_ACC_U21135)Node9);
+
+SmallCodon_tree.Node2.t=0;
+SmallCodon_tree.D_CD_83_ELI_ACC_K03454.t=0;
+SmallCodon_tree.D_UG_94_94UG114_ACC_U88824.t=0;
+SmallCodon_tree.Node1.t=0;
+SmallCodon_tree.D_CD_84_84ZR085_ACC_U88822.t=0;
+SmallCodon_tree.D_CD_83_NDK_ACC_M27323.t=0;
+SmallCodon_tree.Node3.t=0;
+SmallCodon_tree.B_US_83_RF_ACC_M17451.t=0;
+SmallCodon_tree.B_FR_83_HXB2_ACC_K03455.t=0;
+SmallCodon_tree.B_US_86_JRFL_ACC_U63632.t=0;
+SmallCodon_tree.Node10.t=0;
+SmallCodon_tree.B_US_90_WEAU160_ACC_U21135.t=0;
+SmallCodon_tree.Node9.t=0;
+DataSet SmallCodon = ReadDataFile(USE_NEXUS_FILE_DATA);
+
+DataSetFilter SmallCodon_part = CreateFilter(SmallCodon,1,"","4,5,7,6,1,0,2,3");
+LikelihoodFunction SmallCodon_LF = (SmallCodon_part,SmallCodon_tree);
+
+Optimize(res_SmallCodon_LF,SmallCodon_LF);
+
+timer2 = Time (1);
+expectedLL = -3286.0978773303;
+diffLL	   = Abs(expectedLL - res_SmallCodon_LF[1][0]);
+fprintf (stdout, SmallCodon_LF, "\nTest optimization took ", timer2-timer, " seconds.\n", diffLL , " difference between obtained and expected likelihood\n\n");
+
+/*
+fprintf (stdout, "Recovering category assignments and conditional probabilities for each category\n");
+ConstructCategoryMatrix (catMx, SmallCodon_LF);
+*/
+
+DataSet	 mlSequences      = ReconstructAncestors (SmallCodon_LF);
+DataSet	 margSequences      = ReconstructAncestors (SmallCodon_LF,MARGINAL);
+DataSet	 sampledSequences = SampleAncestors 	 (SmallCodon_LF);
+
+END;
diff --git a/tests/hbltests/BFFeatures/Level1.bf b/tests/hbltests/BFFeatures/Level1.bf
new file mode 100644
index 0000000..63493c6
--- /dev/null
+++ b/tests/hbltests/BFFeatures/Level1.bf
@@ -0,0 +1 @@
+ExecuteAFile("Level2/File2.bf");
\ No newline at end of file
diff --git a/tests/hbltests/BFFeatures/Level2/File1.bf b/tests/hbltests/BFFeatures/Level2/File1.bf
new file mode 100644
index 0000000..3100251
--- /dev/null
+++ b/tests/hbltests/BFFeatures/Level2/File1.bf
@@ -0,0 +1 @@
+ExecuteAFile("File2.bf");
\ No newline at end of file
diff --git a/tests/hbltests/BFFeatures/Level2/File2.bf b/tests/hbltests/BFFeatures/Level2/File2.bf
new file mode 100644
index 0000000..7a64a68
--- /dev/null
+++ b/tests/hbltests/BFFeatures/Level2/File2.bf
@@ -0,0 +1 @@
+fprintf (stdout, "\nGoodbye, cruel world\n");
\ No newline at end of file
diff --git a/tests/hbltests/BFFeatures/TreeSplits.bf b/tests/hbltests/BFFeatures/TreeSplits.bf
new file mode 100644
index 0000000..e4d0eb5
--- /dev/null
+++ b/tests/hbltests/BFFeatures/TreeSplits.bf
@@ -0,0 +1,15 @@
+Topology T = (((A,B)N1,C)N2,(D,E)N3)N0;
+Topology T1 = ((10,7),((8,11),6),(12,(4,(2,1))),14,(5,9,13),3);
+Topology T2 = (((2,4,5,7,9,10,12,13),1,14),(6,(8,11)),3);
+
+fprintf (stdout, T1*T2, "\nvs\n", T2*T1, "\n");
+
+ACCEPT_ROOTED_TREES = 1;
+
+Tree Tr1 = ((((((adi:0.0172745,((aff:0.014859,((dif:0.00870463,pla:1e-05):0.00457861,(het:0.00144118,sil:0.00289722):0.00704791):0.0168892):0.00304292,pic:0.0352788):0.00713567):0.00824975,mim:0.0181748):0.019692,nig:0.0384676):0.0546865,met:0.106553):0.0262207,cra:0.11363):0.0974932,((amb:0.0375718,((mir:0.0023823,((per:1e-05,ps:1e-05):0.0043839,pse:0.00218526):0.00861668):0.0062418,sub:0.0837637):0.0167734):0.0315909,(ere:0.0183531,(((ma:0.00842499,sim:0.00254266):0.00761908,mel:0.0059 [...]
+Tree Tr2 = ((((((((((dif:1e-05,pla:1e-05):1e-05,(het:1e-05,sil:1e-05):0.00663026):0.00244102,aff:0.0278711):0.0104024,pic:0.0291248):0.0126218,adi:0.0579842):0.0100249,mim:0.0320299):0.0227369,nig:0.0359531):0.0355651,cra:0.161111):0.0667939,met:0.0772071):0.0416745,(((amb:0.0498902,sub:0.0319557):0.027741,((mir:0.0134295,per:0.00333638):0.00293222,(ps:1e-05,pse:0.01001):0.00372998):0.0404848):0.051219,(ere:0.00773685,(((ma:0.0136083,mel:0.0135969):0.00327567,sim:1e-05):0.0169718,Yak:0.0 [...]
+
+fprintf (stdout, "\n",Tr1*Tr2);
+
+ACCEPT_ROOTED_TREES = 0;
+
diff --git a/tests/hbltests/BFFeatures/kernel.dump b/tests/hbltests/BFFeatures/kernel.dump
new file mode 100644
index 0000000..d4fde8b
--- /dev/null
+++ b/tests/hbltests/BFFeatures/kernel.dump
@@ -0,0 +1,466 @@
+kernel_eig = {
+{   0.0584517509699,    0.089600911152,   0.0444900624764,  -0.0355345965243,  -0.0270247414522,    0.161217686177,  -0.0374987770515,   -0.150767372026,   0.0288153320489,   0.0187667649407,  -0.0235273033174,   -0.130880633627,   0.0480474263718,   -0.121592218799,   0.0479550990706,   0.0467725931425,   0.0750385264002,   0.0775978802872,   0.0769257862241, -0.00406162587306,    -0.03492443539,   0.0478155411666,   0.0140538475565,  -0.0164460044348,  -0.0789120535853,   -0.1586879871 [...]
+{   0.0669141975671,   0.0683275044949,   0.0423566849098, -0.00616469179369,  -0.0501602133868,    0.128164055748,  -0.0293682452835,   -0.102078874744,  0.00983403562273,   0.0648843573657,   0.0011645872335,  -0.0439432790368,  -0.0314005092332,  -0.0439303399194,   0.0594841519502,   0.0260627393547,   0.0785773744157,   0.0215525459656,   0.0155472167691,  -0.0545007644716,  0.00398612312221,   0.0391695863384,   0.0249528064265,   0.0257809639109,  -0.0245558802851,  -0.03287668156 [...]
+{   0.0598966608177,   0.0913468056283,  0.00701444138301,  0.00509784479379,   0.0114378568262,    0.175080184684,  -0.0463795928727,  -0.0977950841135,   -0.072677510477,  -0.0863560381771,    -0.04078615326,  -0.0843561223263,   0.0837761743496,    0.105425647332,  -0.0208995045644,  -0.0835481356966,   0.0983546998797,   0.0750215057196,    0.167475112233,    -0.04521600848,   0.0878677929939,    0.038790693214,    0.086747758666,  -0.0966873727845,   0.0834429500805,  -0.05950027831 [...]
+{    0.054819939154,    0.123256283236,  -0.0401190875778,  -0.0907011544247,    0.112898403786,  0.00565090195718,   0.0157519122711,  -0.0414277491001,   0.0688704792517,  0.00606317133618, -0.00355550852174,  -0.0162064020371,    0.110721365875,   0.0760635542976,   0.0222798034428, 0.000467893271252,   -0.127910340951,  -0.0415235228726,   0.0652160554655,   0.0250465309761,   0.0403241392033,  -0.0809062801555,   0.0351293131045,   0.0789467667783,  -0.0275526167107,  -0.01974179177 [...]
+{   0.0362936265917,    0.111147753859,   0.0473505338205,   -0.100785010122,    0.127410238386,    0.117991888477,   -0.106858841024,     0.16171565135,    0.151261983469,   0.0911525620265, -0.00258474949549,  -0.0572864190616,  -0.0831510661654,   0.0767043701893,   -0.207537789262,   -0.184463722053,   0.0850797140442,  -0.0145215237324,    -0.17318289205,    0.196716071559,  -0.0303624690191,  -0.0318068781552,   -0.105437380121,  -0.0248225631046,   0.0372366130921,    0.1221146803 [...]
+{   0.0774645073939,    0.033002968607,  -0.0172721621376,   0.0745781465088,   0.0147474567033,   0.0190086761164, -0.00137838981044, -0.00896165198085,  -0.0225472157023,   0.0415733246321,    0.026295904058,   0.0821255368099,  -0.0674696339317,  -0.0342043129132,   0.0474263155641,  0.00559886169856,   0.0565872853801, 0.000511747883018,   0.0127340052149,   -0.041289689397,  -0.0798051121598,   0.0249272565288,  -0.0525211968355,  -0.0281681840165, -0.00413895130581,   0.02620343044 [...]
+{   0.0760107733067,  -0.0103861093147,   -0.100933839259,   0.0423467739572,  -0.0376205938964,  0.00985070381475,   0.0163949130175,   0.0629982947522,  -0.0116748243423,  -0.0325020277996, -0.00042526875651,   0.0175964429162,   0.0234285606432,  -0.0267698770355,  -0.0856972346667,  -0.0411909639697,  -0.0150742270195,  0.00460873445136,   0.0638444386811,  -0.0341465688798,   0.0277796131158,  -0.0176313643794, -0.00694193570453,   0.0100755175495,  -0.0214837721699, -0.003411493451 [...]
+{   0.0761580233931,  -0.0322144843962,  -0.0671372680492,   0.0591873585929, -0.00286741804781,  0.00269450707258,  0.00174078401705,   0.0290822742406,   0.0273841031394,    0.018588635154,  0.00895786546613,   0.0121598726113,   0.0323658057589,   -0.048292663715,   -0.035860861343,  -0.0278806195315,  -0.0187436452994,  -0.0647874505954,  -0.0148381533989,  -0.0644615267638,  -0.0180247624724,  0.00695370554373,  0.00159953629555,     0.07207558644,   0.0135635531804,   0.00469868931 [...]
+{   0.0771336119279,  0.00403711353653,  -0.0560762586245,    0.070024837502, -0.00122752529688,   0.0166135930913,   0.0268790656908, -0.00192822921954, -0.00764065500948,  -0.0170223684657,   0.0081811776788,   0.0446687504215,   0.0107605163249,  -0.0139137918003,  -0.0247868705288,  -0.0302080312543, -0.00388388736221,  -0.0131806940104,   0.0176995011038,   0.0495999016266,  -0.0205649620747, -0.00871724138276,  -0.0243111873571,   0.0651983469271,   0.0734838068919,   0.02984601909 [...]
+{   0.0661097696921,  -0.0940232384382, -0.00999563732805,   0.0187172376347,   0.0878206311705,  -0.0260865914552,    0.021064131928,  0.00443866495695,   0.0711705819426,  0.00260547135167,-0.000393904148061,  -0.0171769085964,  -0.0281092078824,  -0.0534801854457,   -0.035639518022, -0.00390486513963, -0.00501919211992,  -0.0418636871812,   0.0373902447492,  -0.0922184874316,   0.0283965751415,   0.0713054330766, -0.00228981173864,   0.0281529330769,   0.0335170491746,  -0.01080116717 [...]
+{     0.07335630449,  -0.0470305203749,   0.0270221034729,   0.0536094735166,    0.068078436519,  -0.0744792470636,  -0.0285508856117,  -0.0230955874304,   0.0010896905421,   0.0256781693293,   0.0112420520482,   0.0329650021257,  -0.0825598526224,   0.0317455000613,   0.0718256739209,   0.0500003522446,  -0.0141734229688, -0.00590810343553,   0.0272072702388,   0.0120950900648,    0.054250011107,  -0.0118634723998,  -0.0315026469606,   0.0701438305163,  -0.0947883716219,  -0.04615877527 [...]
+{   0.0776988897392, -0.00296362446893,  -0.0619666075819,   0.0598669117803, -0.00955726576189,  0.00945873435905,  -0.0171922135447, -0.00249681746642, -0.00289794399822,   0.0244816553175,   0.0144920073402,   0.0392368044437,  -0.0203189282131,  -0.0352406239605,  -0.0503774467041,  0.00513889159562,   0.0207406901325,  -0.0748219803853,  -0.0152974497576, 0.000162016072102, -0.00852371980948,  -0.0218043281226,   0.0257738632044,   0.0290072854664,    0.013413749032,   0.05263321649 [...]
+{   0.0723385483609,  -0.0396333113967,   0.0478887486289,   0.0464079185943,   0.0590892623502,   -0.102909080895,  0.00839356584705,  0.00271786822425,  -0.0298516516411,  -0.0307300459799,  0.00816781353932,    0.057268506842,  -0.0325587348703,-0.000451158365645,   0.0915260012553,   0.0344750665105,    0.053735152573,    0.110767937869,   0.0522873945853,  -0.0125900938462,   0.0816709647419,   -0.095548552066, -0.00293161034704,   0.0350246513373,   0.0668452364808,  -0.04313536716 [...]
+{   0.0764686244881,  -0.0114408382757,  -0.0583786653498,   0.0711185545386, -0.00613479666877,   0.0315683451839,   0.0190267210904,   0.0110733231676,   0.0121558425942,-3.73496160397e-05,  0.00620021705469,   0.0213526735227,   0.0511520317908,  -0.0203470730879,  -0.0487566398587,  -0.0480182574026,  0.00449132642217, -0.00923644424899,  0.00935850963013,  -0.0163568778616,  0.00759981252827,  -0.0317918909591,   0.0606732047964,  9.1750722188e-05, 0.000548159923745,  -0.01891783476 [...]
+{   0.0759816225475,   0.0153073784083,  -0.0964341008786,   0.0435631552313,  -0.0267568351102,   0.0352845732244,   0.0390628907657,   0.0158131958299,  -0.0309111709237,  -0.0207656277968, -0.00282259488963,  0.00501806844392,   0.0292382775378,  -0.0159534569243,   -0.107778474357,  -0.0329331006445,   0.0154946340612,  -0.0116839188399,  -0.0331346277754,  -0.0396081369026,  0.00996312604347,   0.0270553261238,  -0.0206284802341,   0.0199516690975,  -0.0199916505002,  -0.02565176577 [...]
+{   0.0779033765274,  0.00879919106421,  -0.0584476046014,   0.0570079766206, -0.00783525852362, -0.00124322043861,   0.0142393413607, -0.00712173781278,  0.00699975501515,   0.0166246788407,   0.0193672786227,   0.0633464072807,  -0.0298168840882,  -0.0399411080615,  -0.0141516533317,  -0.0135495949982,   0.0197992524369,  -0.0212091121327,     0.00731860836,  -0.0304122309503,  -0.0289435695258,-0.000943659767548,   0.0346189504295,  0.00930543038088,   0.0580425203697,   0.02425846277 [...]
+{   0.0716255162212,  -0.0717894688008,  -0.0351400159805,   0.0346785359673,   0.0347066194765,  -0.0412121315737,  -0.0065320310016, -0.00871648598374,   0.0572158775458,  0.00263962989086,  0.00359674205492,-0.000114154511423,   0.0180547677445,  -0.0460063189918,  -0.0350548975525,  -0.0315214494451,    -0.01306327914,   0.0102249243198, -0.00546844998727,   0.0344802889358, -0.00121801096925,  -0.0215341898892, -0.00392966631366,   0.0341067088316,   0.0994670597751,    0.0582089112 [...]
+{   0.0756498680995,  -0.0149334264494,   0.0307435617284,   0.0781313233277,   0.0342926033516,  -0.0298330306028,  -0.0415295201792,  0.00819133128217, -0.00653745267859,  -0.0295761474039,  -0.0134199981482,  -0.0337508463141,   0.0534353749638,   0.0825028235797,   0.0421023765229,  -0.0126322193356,  -0.0312867010455,  -0.0371136371144,   0.0581471152842,   0.0475529175721,   0.0398116081605,  -0.0450376588504,  -0.0834810308385,   0.0675657234455,   -0.061934447094,  0.003136167617 [...]
+{   0.0721447326674,  -0.0471742257573,   0.0422541150884,   0.0428209542766,   0.0207361938245,  -0.0125406601883,  -0.0460518484666,  -0.0772491829618,  -0.0212339796762,   0.0956069378754,   0.0154345682213,  0.00418476654533,  -0.0251893418266,   0.0291327637059,   0.0135256588268,   0.0417999894571,   0.0532137332791,   -0.119360920054,   -0.018179989264,   0.0138839708823,  0.00476978632452,  -0.0580893963926,   0.0192873544729,  -0.0735606840853,   0.0286873120535,   0.05046183698 [...]
+{    0.077253649127,  -0.0264774292011,  -0.0129689760104,    0.062246600032,  0.00185021751954,  -0.0211574760879,  -0.0547224902717,  -0.0430801588507,   0.0415783233449,   0.0157876655946,   0.0175518091539,    0.049732088211,  0.00399879697828,  -0.0380515892268,   0.0271493136457,  -0.0342548633562,   0.0423781607905,  -0.0202880461904,   0.0107995718317,   0.0350991837553,  -0.0121625843095,  -0.0159381805337,    0.046339004075,  -0.0199354871746,   0.0262966658708,  -0.04134021519 [...]
+{   0.0668826981609,  -0.0939838487004,  -0.0147000216051,  0.00799889450384,   0.0813208580287,    -0.04624345632,  -0.0206785792726,  -0.0365867942612,   0.0432567879263,   -0.011764867318,  -0.0132441641819,  -0.0588135917595,   -0.070647035106,  -0.0411758049994, -0.00692940891732,   0.0250517869689,  0.00103024140791,  -0.0598506947271,  -0.0325301480465,  -0.0446922973837,   0.0381316371308,   0.0699038333497,  -0.0273365362273,  -0.0181328909805,    0.054231427382,  -0.05584232979 [...]
+{   0.0728298642924, -0.00219452257325,   0.0563566276818,   0.0405671056458, -0.00309495696111,  -0.0416059142829,   -0.021699517428,  0.00233776930198,  -0.0114992143423,    -0.13021722725,  -0.0307256897903,  -0.0495510162724,    0.124427359766,   0.0179267557427,    0.114540459442,   -0.148078354145,  -0.0448498024287,  0.00118864666517,  -0.0631491127673,  -0.0518295237108,   0.0456929657136,  -0.0479688811812,   0.0310731179148,  -0.0750030846076,  0.00215616131681,   0.02195227767 [...]
+{   0.0764318504817,    -0.01000123663,  -0.0872827232877,   0.0527083499676,  -0.0237823672539,   0.0126551785731,  -0.0185246658011,   0.0164701384324,   -0.026403535858,   0.0139002889568,  0.00183899269723,  -0.0040433295989,   0.0166074967321,  -0.0328624587927,  -0.0680088403908,  -0.0393797393979,  0.00418762063252,  -0.0511617813847, -0.00155135939133,  -0.0245249835818,   0.0151389975108,  -0.0314993293707,  -0.0383923427446,   0.0352252099831,    0.043372076495,  -0.02730007975 [...]
+{   0.0764903237336,   0.0156309813854,  -0.0864463889453,    0.033814233884,  -0.0179427487012,  0.00323884595002,    0.013927888549,  -0.0269255280452,  -0.0448778492112,   0.0232122140379,  0.00598076414134,   0.0112616154211,  -0.0385799072693,  -0.0338894548444,  -0.0584256043998,   0.0026062130678,  0.00613583537833,  -0.0502930831428,  0.00677715089881,  -0.0638396264049,    0.025873845989, -0.00896936111705, -0.00224617014846,   0.0415132317238,   0.0159297694527,  -0.07480705671 [...]
+{   0.0734823451032,   0.0561208080027,   0.0341256763379,   0.0496182973008,  0.00903058117798,   0.0524746866099,  -0.0254860606569,    0.013225099489,  -0.0737451093954, -0.00956855238699,-0.000125846158747,   0.0235158847085,  0.00451046034904,   0.0516085347747,    -0.05601967579,   0.0653490897726,   0.0545095294562,   -0.014126414194,    0.058446606272,   0.0153080473807,    0.103693149453,  -0.0721311283083,  0.00931366926567,  -0.0444368983334,  -0.0694980119865,  -0.03334643273 [...]
+{   0.0750640741581, -0.00470630784353,    0.061344759844,   0.0670339663031,   0.0500121594921,  -0.0360768773427,  -0.0527295767765,   0.0299583297108, -0.00244329284161,  -0.0600366679227,  -0.0107751435752,   0.0017926048659,   0.0942788609385,    0.103202375336,   0.0543263006298, 0.000263280681478,  -0.0106086970762,   0.0338946870996,   0.0520875040451, -0.00343832217451,   0.0775170306373,  -0.0417700839225,  -0.0469357079256,   0.0159653586962,  -0.0366792205601,  -0.03098972298 [...]
+{     0.07406072442,  -0.0408242310428,    0.033888001607,    0.060245773409,   0.0393037820059,  -0.0380829190044,  -0.0593342231523,  -0.0528595486307,   0.0255785186986,  -0.0167461650446,  0.00834807829298,   0.0458596797278,  -0.0363099367289,   0.0314200228853,   0.0881827364292,  -0.0269216418945,   0.0214621382863,   0.0548766353034,   0.0263545932399,   0.0278481376021,  -0.0458497957405,  -0.0384973530181,   0.0157466269711,   -0.043499737895,   0.0466609763213,  -0.01364151976 [...]
+{    0.077035510812,  -0.0332687543508, -0.00728742547259,   0.0773015097854,   0.0337217411633,   -0.013124242616,  -0.0225288973785,  0.00500746161031,   0.0504782120734,   0.0338239033675,   0.0111419740708,  0.00623512624614,  -0.0218926564846,  -0.0552745793972,    0.058830643025,  -0.0154594460228,-0.000737462845897,  -0.0514170245637,  0.00277071627539,  -0.0106670025077,  -0.0458975416815, -0.00212977036665, -0.00425052527469,   0.0372410473704,   0.0388852166829,  -0.01753193108 [...]
+{   0.0734865349807, -0.00852749610535,   0.0575577107871,   0.0794162090036,   0.0521477325477,   -0.036262391679,  -0.0640327761694,   0.0212183167541,  -0.0398619925397,   -0.056291505672,  -0.0082114738812,  0.00851272073626,   0.0548120941303,   0.0550233584515,   0.0943650450869,  -0.0314036650557,  -0.0349388975413,   0.0212833991797,   0.0308727583193,   0.0185589405277,   0.0392445100108,   -0.112615114897,   0.0278071179603,   0.0370035605319,   0.0432100443483,     0.100183915 [...]
+{   0.0751440593344,  -0.0187052466817,   0.0295731888485,   0.0758977604553,   0.0630159737317,  -0.0310108784448,  -0.0489214744862, -0.00599584274073,  -0.0287031093584,   0.0478210817598,   0.0215248584438,   0.0662273817221,   -0.035200440986,   0.0233528638014,   0.0722437221661,  -0.0312081162107,    0.037753066074,  -0.0109468591402,  -0.0439648615797,  -0.0440620542001,     0.02443805551,  -0.0223134426057,  -0.0826851490044,  -0.0158625170246,   0.0187007958482,  0.005643128496 [...]
+{    0.073767909466,  -0.0207576800425,   0.0633646937054,   0.0552786715226,   0.0401938530517,  -0.0630433695796,  -0.0521523423897,  -0.0134715784407,  -0.0135357963771,  -0.0649451173609,  -0.0137570507756,  -0.0068306763022,   0.0636101122286,   0.0902770715854,   0.0814931275314,  -0.0451760691566,  0.00993082632977,   0.0368209814911,  -0.0197462624151, -0.00651781091867,    0.083583593193,  -0.0350286668429,  -0.0481398299794, -0.00721756734253,  -0.0694624566618,   0.03840022911 [...]
+{   0.0776381444177,  0.00214331986179,  -0.0164762829267,   0.0674491391172, -0.00950096382108,   0.0133022606397,  -0.0395526353485,  -0.0594328864203,  -0.0108702442038,   0.0473323703949,   0.0204050351391,   0.0508650558067,  -0.0168447254279,  -0.0287118668939, 0.000111296353946,  -0.0805738554111,   0.0355777683912,  -0.0193360005636, -0.00569609406528,   0.0305989017308,  0.00768167076653,  -0.0268412597343,   0.0395713375737,  -0.0152636109829,  -0.0261517562723,  -0.02799585447 [...]
+{   0.0689297145941,   0.0782034764882,    0.037589024617,   0.0457106445292,    0.022982444478,    0.111773640579,  -0.0423001204031,   0.0239914300183,  -0.0931598448195,  -0.0263416320115, -0.00972456433705,  0.00242733271461,  -0.0481601580969,   0.0474514508411,  -0.0402578462134,   0.0497328873607,   0.0489644412015,    0.038374574589,   0.0224947128984,   0.0302432963302,     0.10318384104,  -0.0707182999432,   0.0449821444433,  -0.0203519975002,  -0.0285148446256,   0.03142901383 [...]
+{   0.0679837567793,   0.0382766642974,    0.100107908033,   0.0415258718609,   0.0341315462738, -0.00471765394478,   0.0459976430386,    0.152075701711,  -0.0666421086689,  -0.0805260920356,  -0.0280427614321,  -0.0590871713512,   0.0397541183405,  0.00160921466548,   0.0562118507146,   -0.116441169771,   -0.020933987447,   0.0234246813413,  -0.0389646848348,  -0.0668775082487, -0.00689941181237, -0.00602314047109,   0.0412595994394,  0.00239728082183,    0.057331393598,  -0.02058738134 [...]
+{   0.0665960510216,   0.0906715964714,  -0.0919072806617,  -0.0483178796662,   0.0250074373449,  0.00167469088169,   0.0772913894876,  -0.0740874527334, -0.00235999211004,  -0.0393192555547,  -0.0199405210776,  -0.0547133063335,   0.0755788745522,    0.048478268463,  -0.0172241894887,   0.0414863305005,  -0.0382943606141,  -0.0442096850382,  -0.0279859984476, -0.00573031898469,   0.0118359179472,  -0.0663491814619,  -0.0451842485321,   0.0737233775806, -0.00652156403393,   0.03601671589 [...]
+{   0.0452738107948,    0.104773424777,   0.0578457883578,  -0.0781517330758,  0.00851038239912,    0.205962042831,  -0.0465449643512,  -0.0547925206578,      0.1247918443,  -0.0588114649007,  -0.0563817203271,     -0.2132209336,  -0.0869399992014,  -0.0337275949122,    0.100475667194,  -0.0405178943601,   0.0819760581201,   0.0170280759146,    0.177175605042,    0.147041405396,  -0.0440351064473,   -0.112888421341,  -0.0397756467732,    0.104440792326,   0.0446609705337,    0.1394871199 [...]
+{   0.0662437128098,   0.0973621357859,  -0.0518366269183, -0.00934850627817,   0.0573453321867,   0.0882640039779,    0.084511754441,   -0.075208706876,  -0.0232601072794, -0.00410012254479,  -0.0197130076139,  -0.0728148154899,    0.048730917934,   0.0311466307962,   0.0193632119925,   0.0388150812353,  -0.0693480229901, -0.00388600385404,  -0.0360130574082,   0.0224932036436,  -0.0711876274274,    0.059299919315, -0.00287003942044,   0.0361583255781,   0.0109547147675,  0.002919916079 [...]
+{   0.0570053504754,   0.0738979116432,     0.12491570081,   0.0162279369034,   0.0502850648679,   0.0860023192858,  -0.0601359968389,    0.183711685035,  -0.0898005374373,  -0.0545717180591,  -0.0388505094293,    -0.11007021991,   0.0123639524613,  -0.0106778859975,   -0.109872228395,   0.0552562456824,   0.0538564887287,   0.0387753488832,   -0.113689471929,    0.143735315948,    0.024390507447,   0.0821604760977,   0.0378233196109,  -0.0673574117391,   0.0613925863775,   0.06813004667 [...]
+{   0.0687427341072,   0.0420565152226,   0.0710155866218,   0.0470544119587,   0.0164685295072,    0.018393897107,  -0.0622176257608,   0.0441186803021,   -0.109888816781,  -0.0745167052735,  -0.0388883073633,   -0.112630451726,   0.0614472136298,  -0.0151160919112,     0.13021971239,   -0.118945534211,   0.0351175574575,  -0.0743393527737,  -0.0383818921059,  -0.0718456569852,  0.00232701699317,  -0.0855459798851,  -0.0116892001196,   0.0405703383913,   0.0606208291597,   0.02310501453 [...]
+{   0.0731736405458,   0.0638706344359,   0.0185337675208,   0.0620078508463,   0.0402166892905,   0.0337863964984,  0.00464960330296,   0.0610822843098,  -0.0754317051795,  -0.0404951057796,  0.00491153805399,   0.0632501926785, -0.00447717618324,   0.0201378044811,  -0.0137537570157, -0.00857362390482,   0.0329334009481,   0.0400370577256,   0.0522084371134,  -0.0473255986497,   0.0542558498744, -0.00563129284917,  0.00629063465801,   0.0053876576138,   -0.057250137827, 0.0002366350999 [...]
+{   0.0681518939996,   0.0929571727441,    -0.06045075198,   -0.013030181365,   0.0484660074092,   0.0619464511453,   0.0598478651455,  -0.0775376965481, -0.00696756399242,  0.00877339546613,   -0.012593484741,  -0.0581099205447,   0.0231371397446,   0.0117151835891,    0.045249077745,   0.0385890564792,   -0.070872513056,  -0.0295225530367,  -0.0248910438542,  -0.0130308843213,   -0.036751263987,   0.0766563440407,  -0.0189269909912,   0.0254058792085, 0.000180138071439,  -0.02731089433 [...]
+{   0.0716832465576,  -0.0634352131899,   0.0227045407064,   0.0496032586403,    0.074961288541,  -0.0605636674292,  -0.0179390074894,  -0.0415524617396,   0.0283180749464,   0.0178700884948,  0.00717532528649,    0.010935248094,  -0.0700072335179, -0.00409849696971,   0.0669236237608,   0.0299128512718,   0.0326161642035,   -0.046897348707,   0.0382014800025,  -0.0409924090556,   -0.061021060704,  -0.0123745140491,  -0.0012072700679,  -0.0305132604577, -0.00609340343869,   0.09044485693 [...]
+{   0.0733638994101,  -0.0535339874982, -0.00801048137447,    0.054268826721,   0.0466830630189,  -0.0362430562712,   0.0476478395194,  -0.0064911006083,   0.0496225949729,  -0.0303405853116, -0.00395065290934, -0.00859055681721,   0.0370939136219,  0.00305062113965,   0.0316291472414,  0.00927012564203,  -0.0130313019403,   0.0280494481053,   0.0950233366283,   0.0461392980538,  -0.0273380840663,   0.0006436462511,  -0.0447730191057, -0.00674692421027,  0.00579219310448,  -0.03037377865 [...]
+{    0.076319524504,  -0.0235124840484,  -0.0656212963709,   0.0692247406648,  0.00602638347621,    0.023297888299, 0.000769014747538,   0.0129597952194,  0.00202978399741,  0.00694767895949,-0.000638624119351,  -0.0140044485938,  0.00340733905696,  -0.0322013630486,  -0.0457726300683,  -0.0390977902868,  -0.0417071030016,  -0.0676746242799,   0.0176396493237,  -0.0676429263906,  -0.0198587766447,   0.0029897462486, -0.00810004329368,   0.0256775929328,  -0.0211754347047,  -0.01333465556 [...]
+{   0.0779988871462,   0.0027632949245,  -0.0482175411921,   0.0719796221752, -0.00262828830692,  0.00658113849797,   0.0102201128933,  0.00969335613344,  0.00735431346962,   0.0204368534359,  0.00928400606273,   0.0142126998964,  -0.0262319863028,  -0.0585946187108,  -0.0399498193573,  -0.0452352562692, -0.00487296852647,  -0.0314482487512,   0.0312527009145, -0.00515285872054,  -0.0299822426925,    0.053175235287,   -0.014644340035,   0.0260697187821,  -0.0291750971253,   0.01965552898 [...]
+{   0.0647343809625,  -0.0703163984762,   0.0940402967283,   0.0315705155943,    0.090692763958,  -0.0254705431448,  0.00411250779444,   -0.104058066895,  0.00611001175983,  0.00883666051181,   0.0121459774241,   0.0515526190269,  -0.0570309942956,   0.0140367448941,   0.0651918092412,   0.0501019230707,  0.00549839567331,   0.0816380844923,   0.0264918485501,  -0.0358942815941,   0.0344951618593,    0.053111572811,  -0.0236939007914,-0.000802658762114,  -0.0680294286766,  -0.03525520697 [...]
+{   0.0750713297417,  -0.0361919360143,  -0.0770221930434,   0.0545460997476,  -0.0141024594946,   0.0109113614571,   0.0201351444445,   0.0666470195304,   0.0383059070252,  -0.0180698080301,  0.00109444513997,  0.00387520859395,    0.067749433704,  -0.0375629048213,   -0.065336764851,  0.00526622765021,  -0.0216416711085,   -0.028258731199,   0.0131947474841,  -0.0715955788222,  -0.0299595874719,   -0.013623828524,  -0.0173108095786,   0.0368532081589,   0.0223604436305,  -0.05906753810 [...]
+{   0.0763803125999,   0.0415833301075,  -0.0399896654472,   0.0641801687055,    0.011004001193,   0.0443330641097,    0.046175676997,  -0.0175013033464, -0.00935255811239,   0.0185938699055,   0.0183237836222,   0.0609365406637,  -0.0605411864651,  -0.0569898698045,   0.0191360119906, -0.00392679300431,   0.0501021574362,   0.0182937972107,   -0.048191347219,  -0.0228830330242,   -0.111599094578,  -0.0375941747385,   0.0239123801681,  -0.0439129140083,  0.00726887550043,   -0.0189460963 [...]
+{   0.0728261269819,  -0.0611093069239,-0.000824102890534,   0.0477941737336,   0.0482251784445,  -0.0212901573691, -0.00599946463315,  -0.0410525865045,   0.0573783790261,  -0.0163183014538,  0.00654931780389,    0.024588245539,  -0.0255666908009,  -0.0440064559295,  0.00259889199962, -0.00406286008474,   0.0102435192869,     -0.0099862958,  -0.0395603561387,  0.00976900031522,  -0.0573925516645,  -0.0288218419977,   0.0841417906427,  -0.0317321526542,  -0.0362891663901,   0.03870752906 [...]
+{   0.0761376389755,  -0.0284191905867,   0.0300868973823,   0.0506594279429, -0.00103218880814,  -0.0200347533939,  0.00838645885418,  0.00264512471341,   0.0240967293294,    0.032208495032,  0.00958012182575,   0.0142081971627,   -0.111172159853,  -0.0204695613458,   0.0251063253255,   0.0034311712416,  -0.0434176718603,  -0.0342669904691, -0.00759589711196,  -0.0143056698386,   0.0096423482372,   0.0690173704704,   -0.030141495547,   0.0693079446419,  0.00780745656456,  -0.01511645763 [...]
+{    0.074656803731,  -0.0196108179561,  -0.0882851543943,   0.0585640607829, -0.00675826572931,   0.0413618132855, -0.00272673963891,   0.0293765314931,  -0.0201792554798, -0.00501114253886,  -0.0108160263747,    -0.04640508704,   0.0324561645059,  -0.0226495825243,  -0.0615117335831,  -0.0564745677295,   -0.050510344132,  -0.0848815225942,    0.018711316488, -0.00604772176789,   0.0718989066849,  -0.0183873685699,  -0.0395820429706,   0.0433597584327,-0.000797130513558, 0.0003140929440 [...]
+{    0.075902337624,  -0.0314960257033,   0.0249037824738,   0.0770526118111,   0.0324191308731,  -0.0252654240236,  -0.0206188963662, -0.00410262791638,   0.0519866305237,   0.0148519156866,  0.00774127284809,   0.0101437254634,   0.0349462006003, 0.000438748189536,   0.0841015180345,  -0.0102612343349, -0.00053601583099,   0.0258371386037,   0.0253476690218, -0.00276322186107,  -0.0188355995504,  -0.0352061926755,  -0.0166455855074, -0.00344069671354,  0.00664530286463,   0.02867561985 [...]
+{   0.0650481854591,  -0.0566462006189,   0.0765581585926,    0.017438377568,   0.0641541253554,  -0.0624277237629,    0.116789630376,  -0.0138101994127,  -0.0167786456998,  -0.0864048772754,  -0.0131966223609,   0.0242167299868,   0.0457456654716,    0.151982520714, -0.00854053828892,    0.070281661249,  -0.0347602427052,  -0.0162577939904,   0.0230245741447,    0.118345468305,    0.111488929415,    0.146325721454, -0.00620113594296,   0.0747999182045,   -0.140207299203,    0.3254225276 [...]
+{   0.0732877863869,   0.0469429793784,   0.0369240227836,   0.0221497140597,  -0.0150167608041,   0.0706959885098,   0.0242632632226, -0.00867974617579,  0.00679053061579,   0.0414124106701, 0.000190651816545,   -0.029345730593,   -0.141388009949,  -0.0301683546791,   0.0694296768821,   0.0502883190854,  -0.0422732490676,  -0.0186667209851,  -0.0347156941752,  -0.0215373209053,   0.0103155807973,  -0.0053650080365,  -0.0298856507032,   0.0401605026402,   0.0827774805176,   0.02720029532 [...]
+{   0.0736067957574,   0.0324286572784,   0.0756073716721,   0.0534449199447,   0.0146756970312,   0.0150851951596,   -0.052693969355,    0.061196218118,  -0.0490670054909,   0.0021730736897, -0.00109910574254,  0.00944827126051,   0.0450429303963,   0.0887220135758,  -0.0475743979376,   0.0517078986636,   0.0315274678743,  -0.0149693515759,    0.102339180419,    0.059827785548,    0.103579518439,  -0.0275651385041,  -0.0305562621794,  -0.0340887334013,  -0.0188443317855,   -0.0063238515 [...]
+{   0.0770294711864,   0.0152919887296,  -0.0196957886467,   0.0618220885092,  -0.0172591876775,   0.0223270791456,  -0.0265277776335,   -0.065735570608,  -0.0287782002546,   0.0551539137675,   0.0263078825387,   0.0717437062943,  -0.0162013009935,  -0.0410785991669, -0.00391992779955,  -0.0627367463237,   0.0314011493373,  -0.0364486444253, -0.00599159983716,   0.0356497469462,  -0.0546592178239,  0.00378007464941,   0.0871070010128,  -0.0333272328969,  -0.0582989300078, -0.008574355611 [...]
+{   0.0618008663177,   0.0862595252696,   0.0998545916212,   -0.014522452222,   0.0274089202094,   0.0451568829254,  -0.0399449972547,     0.16138537743, -0.00934725604309,   0.0195644713832, -0.00932719325516,  -0.0617461679073,   -0.014404998407,   -0.103319601282,   -0.119039300543,    0.073270390141,   0.0428304005302,  -0.0128799204069,   -0.117526848111,   0.0835609274314,  -0.0583069904317,  0.00297442701844,   0.0614578270337,  -0.0615370055907,   0.0458236852067,  -0.06460248414 [...]
+{   0.0766411213721,   0.0285656774167,   -0.071020255746,   0.0576644333282, -0.00902172141891,   0.0448626320512,   0.0430119603756, -0.00517377312978,   -0.010531481609,   0.0026593572445,  0.00711042140453,   0.0252075560367,  -0.0280865191335,  -0.0475957906127,  -0.0668861277768,  -0.0324483540816, -0.00479048746481,   -0.023553423958,  -0.0376740506779,  -0.0793238870248,   -0.044295087114,   0.0377026161172,  0.00233411022538,  -0.0136743185793,   0.0149945100623,   0.01011281201 [...]
+{   0.0754904563961,  -0.0388576658346,  -0.0212599032328,   0.0703497701939,   0.0380690293442,  -0.0135773185327,  0.00826476938773, -0.00528652222456,   0.0238774214479,   0.0257980164769,   0.0118796369252,   0.0269241217241,  -0.0350207486679,  -0.0187221566834, -0.00249889545311, -0.00493676193757,   0.0237775420484,  -0.0257296538408,  -0.0050321355377,  -0.0528607314966,   -0.069956821756,  -0.0233835380852,   0.0154783700684,   0.0754359859206,-0.000840385509993,  -0.01430708223 [...]
+{   0.0711947945359,-0.000183960415749,   0.0146738162664,   0.0460995409142,  0.00263315898434,  0.00181836750832,     0.14638752358,   0.0683076169775,    0.023197073555,  -0.0398764303938,  0.00870528436912,   0.0596334142258,   -0.023658855258,  -0.0279972390299,   0.0196928810558, -0.00403060968387, -0.00402027397122,    0.123553651584,  -0.0146545199346,   0.0760754641161,  -0.0185309588135,   0.0981994994587,  -0.0910112455608,     -0.1014254917,   0.0290627034712,   -0.1225289010 [...]
+{   0.0746710786461,  -0.0250563850025,  0.00134911609545,   0.0847090171573,   0.0360908523609,   0.0161092922389,   0.0287325088187,-0.000468052470689,   0.0353485016847,  -0.0313847076566,  0.00452234839248,   0.0422522356009,  0.00342546650281,   0.0535335652202,  -0.0115328903743,   0.0300314969981,   0.0139189004971,  -0.0835530100697,   0.0205455540609,   0.0366069549605,   -0.016230345858,  0.00869636291806,  -0.0293458850765,   0.0330723230591,   0.0173539669151,    0.0407054818 [...]
+{   0.0739917193386,  -0.0420286815245,   0.0112732846402,   0.0380523150947,   0.0402500082557,   -0.091685861047,   0.0114546331256, -0.00133908330365,-0.000695149619763,  -0.0276192794544,  0.00370132340583,   0.0233536351887,  -0.0356779381863,   -0.041345683697,   0.0958109699221,   0.0256354007898,   0.0542889720455,   0.0744849196267,   0.0713508409767,   0.0915961002328,  -0.0145006701868,   -0.067363458077,  -0.0665191058529,   0.0545822123194,   0.0423070611423,   -0.0330690428 [...]
+{   0.0724776809937,   0.0186181620649,   0.0787674125387,   0.0658294399303,  0.00937494262945,  0.00898909086276,  -0.0310564943302,   0.0377765189954,  -0.0314372650362,  -0.0503757454959,  -0.0074778722097,   0.0117699267065,    0.129918103517,   0.0999066165795,  -0.0519157088511,   0.0569559172366, -0.00254635791714,  -0.0519342007916,    0.140290487372,   0.0845747520709,   0.0764846232383,  -0.0747242450323,   0.0210215418775,   0.0105758925616,   -0.066393727237,  -0.02448067898 [...]
+{   0.0710313176878,   0.0459940283277,   0.0826418858364,   0.0282221826624,   0.0374927743274,  -0.0353606044327,  -0.0768392898724,   0.0787911838243,  -0.0382915959974,  -0.0683965903494,  -0.0151984860897,  -0.0176696932506,   0.0583720810069, -0.00107342718814,  -0.0102698032649,  -0.0842113841902,  -0.0523498370507,   0.0245657565637, -0.00802518449504,  -0.0210866353205,   -0.116988870616,   0.0282069018341,  -0.0182012336574,   0.0449680225045,  -0.0347046984375,  -0.06430113569 [...]
+{   0.0630616551638,   0.0688898456728,   0.0175176079713,  -0.0254129985147,  -0.0499655263845,   0.0964030106925,    0.105378260366, -0.00353969495314,     0.10420399858,   -0.133146743696,  -0.0278028974471,  -0.0377928736528,  -0.0991081712704,   0.0159185893491,  0.00429577907004,  -0.0427271082124,   -0.146470665981,  -0.0424487105796,   -0.020365712102,    0.107174227803,   0.0192769157512,   -0.203822115416,   -0.140283832376,   0.0608602588935,  -0.0414916978696,    0.0172042472 [...]
+{   0.0686035535226,   0.0551484827323,   0.0410064827184,   0.0820984863377,   0.0571373251847,    0.108569588104,   0.0143739668034,   0.0410899443002,  -0.0799075863944,  -0.0531410668799,  -0.0107499254626,   0.0223687000253,  0.00893960797509,    0.100664750194,  0.00843843766134,  -0.0190408780773,   0.0501490314228,    0.105035306849,  -0.0333761258957,   0.0710571576683,  -0.0439973227772,   0.0487681339637,   0.0252168482807,  -0.0519892171076, -0.00822912357337,   -0.0300638266 [...]
+{    0.065850398445,   0.0944939890459, -0.00501439481388,   0.0233285974222,   0.0647738334925,   0.0930499351903,   0.0208679362565,  -0.0110086454374,  -0.0871242559265,  -0.0333612677155,  -0.0103651908756,  0.00539671331784,  0.00246700855027,   0.0680763283153,   0.0577072014768,   0.0350496551396,   0.0342363137924,   0.0706807092127, -0.00054933343663,  -0.0217739454154,  -0.0097557224446,  -0.0240360605126,  -0.0558988306539,  -0.0860457798548,    0.032382555878,   0.05355912150 [...]
+{   0.0707998354403,   0.0441354215281,   0.0834302022198,   0.0450298215295,   0.0565861166849,  -0.0321692612129,  -0.0399412032465,    0.107784529533,  -0.0776481053299,   -0.035254450402,  -0.0194882243274,  -0.0557149733868,   0.0533925764562,  0.00160348914398,   0.0582362982037,  -0.0391438715954,   -0.057351872144,   -0.047613397132,  -0.0422744219608,   -0.034041673233,  -0.0686904236982,   0.0811855170526,   0.0453743058688,   0.0809943669846,  -0.0276359786377,  0.003662728828 [...]
+{   0.0690254161576,    0.041994482661,    0.100930693126,   0.0367022038052,   0.0317150331536,   0.0116125456229,  -0.0703953989447,   0.0680334288263,  -0.0546030381198,  -0.0627010351187,  -0.0187260959408,  -0.0184714789114,    0.043812733902,   0.0859424158285,  -0.0914554774037,  0.00774397329263,  -0.0163887194143,    0.034821977594,   0.0766604244702,  0.00660466326413,  -0.0154151129939,   0.0878674487675,  -0.0111407467282,   0.0247440137122,  -0.0392159417385,   -0.0893999463 [...]
+{   0.0605022158797,   0.0814256076322,    0.103411332049, -0.00733127778067,   0.0602948671323,   0.0203123788984,   -0.030062105919,    0.181800822599,  -0.0450240039243,   -0.015455359456,  -0.0235631584944,   -0.092610496306,   0.0212930008432,  -0.0693574580373,   0.0108525367604, -0.00913350138368,    0.030159682886,  -0.0639025793793,   -0.143679100699,   -0.026433874047,   -0.025903669908,   0.0571031844188,   0.0686000444923,    0.104297708753,   0.0813055590866,  -0.04595333392 [...]
+{   0.0589492876433,    0.109618873139,  -0.0752619144485,   -0.115840987354,   0.0634723729899,   -0.128298310727, -0.00615516527193,  -0.0462657066888,    0.045771946142,   0.0439031302349,   0.0166228645512,   0.0313981726013,   0.0205234061504,  0.00559287985453,   0.0701538255126,  0.00550418070229,   -0.043863583616,  0.00298456413112,   0.0607750957399,   0.0375843770796,   0.0265959966874,  -0.0443691274272,  0.00717061304682,   0.0361450715888,  0.00633708318085,  0.002566170200 [...]
+{   0.0652622938146,  -0.0659998027566,    0.110169489087,  0.00761761412124,   0.0265418918948,  0.00919908271984,   0.0720923019178,   -0.049956012343,   0.0480881996774,   0.0725911850195,  0.00846472214067, -0.00962002899714, -0.00432643566073,   0.0504413178959,   0.0693090432411,    0.101622355228,   -0.038273924149,    0.101837367274,   0.0377572149383,   0.0440171603096,  -0.0162400410807,   0.0303276973977,   0.0193909467687,    -0.10586361497,   0.0970956251447,   0.01776107359 [...]
+{    0.068322301807,  -0.0713167855084,  0.00684154994568,  -0.0117033745741,  -0.0434542478303,   0.0154096094939,  -0.0886670018179,  -0.0576487895669, -0.00650368058978,    0.123293600778,  0.00473749653097,  -0.0588757131859,   0.0435567302819,   0.0414692440518,  -0.0933814957578,   0.0654187313068, -0.00747791576411,  -0.0867480607629,  -0.0166851967832, 0.000519453323131,   0.0486435973392,   -0.059527154267,   0.0455490834772,  -0.0196073183865,   0.0261592784715,   0.04731565159 [...]
+{   0.0628166685133,  -0.0953241862459,  -0.0488115321777,  -0.0700643292142,  -0.0523602661594,   0.0202122864457,   -0.049957001077,   0.0834266082778, -0.00987202454625,   0.0150429391684, -0.00610248794704,  -0.0166884496976,  -0.0570056171246,   0.0889636610004,    0.049140059047,    0.054457422918,  -0.0457119751841, -0.00638215561392,  -0.0410107807454,   0.0668852087225,  -0.0372833135227,  -0.0447903843665,    0.133444811054,   0.0164999785379,  -0.0180708253707,  -0.01012485889 [...]
+{     0.06566393374,  -0.0953701897258,    -0.07014348314,  0.00517596402875,   0.0429702187246, -0.00151299574448,  -0.0182225033465,   0.0762929178159,   0.0592966343711,  -0.0441311507827,  -0.0161153246829,     -0.0515477882,   0.0222415897152,  -0.0375592388328,  -0.0172203325279,   0.0109204285007,  -0.0211921068023,  -0.0289343454291,   0.0989539571103,  -0.0789209643593,   0.0605910621597, -0.00176372466798,  -0.0830753756406, -0.00732029837904,  -0.0777408667587,  -0.07030480377 [...]
+{    0.073077865105,    0.022956908536,   0.0662694911595,  -0.0155983647838,  -0.0533611841333,  -0.0759022245794,  0.00300412468933,     0.07103781303,   0.0454040617666,  -0.0632653337315,  0.00451278760393,   0.0529122978482,  -0.0773281604838,  0.00173425337968,   0.0155563030703,   0.0819922972602,  -0.0712743219663,   0.0347432970748,  -0.0423509445431, -0.00337186490967,   -0.079192723835,  -0.0583583513668,  0.00615260276147,  -0.0275391630718, 0.000657539883297,   0.03353930903 [...]
+{   0.0556038993026,  -0.0926759395533,   0.0684276348134,   0.0173975705154,    0.103204510248,   0.0565542616488,    0.119589177141,  -0.0606831631616,    0.137240702552, -0.00425984059557, -0.00767856778939,  -0.0429107986248,   0.0520248364765,  0.00284122664296, -0.00555250780916,  -0.0576766512189,  -0.0660904818736,  -0.0687423846895,  -0.0454349866001,   0.0631806787393,  -0.0154895804452,    0.149922137942,    0.109799458384,   -0.230157854635,   -0.268745251318,   -0.0251142218 [...]
+{   0.0722032284282,  -0.0164265745642,  -0.0880119985906,  -0.0358546883514,   -0.115035950173,  -0.0111262040986, -0.00200283441406,   0.0569905221168,  -0.0517113261908,  -0.0572120242316,  -0.0152158388881, -0.00553197278432,   -0.135625514701,   0.0653777290599,  -0.0438748401526,   0.0323475740137,  -0.0228254850271,   0.0160765945036,  -0.0921624752476,   0.0718165048589,  -0.0591861304276,  -0.0360692970978,  -0.0403417308585,  -0.0279613983878,    0.028177226941, -0.000408630330 [...]
+{   0.0526685796248,   -0.124329764254,  -0.0294021050208,  -0.0954306646725,   0.0732785971261,   0.0320273995258,  -0.0999547787744,  -0.0170417150399,   0.0473501280422,   -0.106951298911,   -0.037903053609,   -0.080104046337,  -0.0352345750551,   0.0268455429622,    0.048544212834,  -0.0358379612362,   0.0611028031701,  -0.0168357086676,   -0.110531165308,  -0.0428333065552,   0.0515122711384,   0.0651292508611,  0.00232683946509,   0.0248402322409,   -0.104507542875,  -0.03677114240 [...]
+{   0.0546526961278,  -0.0429883840539,     0.13120126312,   -0.104822687803,  -0.0906969475983,   -0.104133706919,     0.16315215519,   0.0101841844293,   -0.126667168835,   0.0129514496146, -0.00478091132245,  -0.0219050787264,   0.0864291798208,  -0.0798675736719,  -0.0573476857239,  -0.0858609898349,  0.00243500525901,    0.103945168032,  -0.0407156912938,   -0.068125871007,  -0.0830938042509,  -0.0471891723675,  -0.0451646244661,   0.0116038786332,   0.0538807025039,    0.1353985156 [...]
+{   0.0588763019382,  -0.0276097288317,    0.100011203606,  -0.0469277673642,  -0.0132765040148,  -0.0976597158725,   -0.051332057793,  -0.0591484470051,   -0.180811661083,   0.0261074791288,  -0.0217817187449,  -0.0727170488255,  -0.0428784076541,    0.114158337015,    -0.23090463984,    0.163003274429,  -0.0549527028926,   -0.213557997861,   0.0316864683223,  -0.0537442853824,   -0.222906390127,   0.0708063384984,   -0.263597331669,   -0.223111209541,   0.0577473462714,   -0.1587688692 [...]
+{   0.0693229130592,  -0.0238399278767,    0.065498961914,   0.0158856670226,  -0.0435360869368,     -0.0205920458,   0.0935443135623,   0.0967846025313,   0.0520392204019,   0.0213869945882,  0.00747415414536,  0.00485650174603,   0.0230226404758,-0.000131785870352,    0.066245670658,    0.030316969949,  -0.0506413868202,  -0.0296371179187,   0.0317225264928,   0.0232060242936,   -0.141201621774,   0.0567060987071,    0.172562925776,    0.034837386729,   0.0764215426579,  -0.07696921545 [...]
+{   0.0688041542966, -0.00871095146253,    0.122385265465,  -0.0203453464038,  -0.0859308690421,  -0.0310061002176,   0.0785082121458,   0.0679037738032,   0.0447596857356,   0.0275260693768,   0.0139109645398,    0.034475060206,   0.0171758394177, 0.000988667680262,   0.0151964920178,   0.0269878052774,  -0.0842856101781,   0.0896579912169,-0.000152934126856,  -0.0488765445033,   0.0874926912419,  -0.0397526765231,  -0.0041485979497,  -0.0229822262512,    0.034736677854,  -0.00111113914 [...]
+{   0.0716352385459,  -0.0475311984165,   0.0772731237007,   0.0395416636266,   0.0165572388192,   0.0257576558823,  -0.0746557312246,  -0.0783199143086,   0.0195264600752,     0.10808155951,  0.00818957349788,  -0.0298875002056,  -0.0419517311562,   0.0791234993693,   0.0378655800766,    0.117429627721,  -0.0121342867624,  -0.0730138740701,  -0.0211098881229,  -0.0408866862008,   0.0556578560321,   0.0226402516744,  -0.0286420481787,  -0.0410258406611,  0.00875932212983,   -0.0500217164 [...]
+{   0.0737619567496,  -0.0387918049242,   -0.106856627085,   0.0266636170136,  -0.0519435771541,  -0.0122510568025,  0.00964884971807,    0.093880679382, -0.00836830847835,  -0.0463551666472, -0.00337871702491,   0.0112138208446,   0.0278770926907,  -0.0279617162866,   0.0127978432104,  -0.0476759074798,   0.0423577211485,    0.026885127965,   0.0106899507048,   0.0109362188387,-0.000342796349092,  -0.0460989578577, -0.00445231505189,   0.0103781850639,   0.0320241955378,  -0.02936242769 [...]
+{    0.067909752165,  -0.0730334148073,   0.0399082463922,  -0.0204560365502,  0.00380020805369,  -0.0332336253193,   -0.092507062338,   -0.122086873734,   0.0396057470554,   -0.125068719751,  -0.0153597801281,   0.0334803747944,  -0.0311028009631,   0.0914033058608,  -0.0457132374661,  -0.0601089755581,  -0.0602331416231,   0.0449348672039,   -0.101846319905,  -0.0847689456966,   -0.012999913288,  -0.0158183266626,   0.0361909727179,  -0.0413453050387,   0.0189722160796,   0.04689062362 [...]
+{   0.0637657011917,   -0.104710151774,  -0.0763485846637,  -0.0183525695846,    0.043469543363, -0.00605578724436,  -0.0345834702389,   0.0930459539375,   0.0573986511648,  -0.0333730495702,  -0.0159119308147,  -0.0571302845016,   0.0316797598959,  -0.0378722855272,   0.0241440249894,   0.0149260936626,   0.0291309290461,   0.0312204134639,   0.0461606750574,  -0.0632240198972,    0.109443516033,   0.0374836924873, -0.00890703122831,  0.00911111511124,   -0.022778179488,   0.08433227580 [...]
+{   0.0674589579138,  -0.0126273958906,    0.115335648984, -0.00835276436594,   -0.028136635681,  -0.0800499047892,   0.0578172502858,   0.0620037309151,  -0.0190070659284,    0.063147163687,  0.00866286518421,  -0.0151107633234,   0.0144854704372,  -0.0379558733552,   0.0518145076901,   0.0673081189242,  0.00163985996263,   0.0338811521415,   0.0782778292773,  -0.0175094497667,   0.0323002224145,   0.0778138891372,  -0.0925866364948,    0.100680637422,    0.114089148383,    0.1167546098 [...]
+{    0.074088700516, -0.00653851293096,   0.0166009601994,   0.0879133146428, -0.00153630021237,   0.0910354205255,  -0.0027784542935,  -0.0204250708827,   0.0455469773527,   0.0160167273617,  0.00405125779678, -0.00492360021376,    0.046908828897,  -0.0322897265812,  0.00672165075281,  -0.0279620318778,  0.00695806453127,   0.0265495776424, -0.00423303464765,    0.109531861589,  -0.0850843721141,  -0.0197450482714,   0.0980621548616,    0.025721999136,   0.0754478283874,  -0.09378297800 [...]
+{   0.0540689508231,  -0.0419899134601,     0.16881662126,  -0.0031042507293,   0.0172040440935,   0.0133639683457,    0.182771111049,  0.00266944760727,   -0.109093884298,   0.0553045694812, 0.000456613783094,  0.00112851290866,    0.046445482172,    0.120321807819,  -0.0296461714471,    0.083479525827,  -0.0729437411447,    0.087683621954,   0.0677564962196,   -0.160285127252,   -0.175209026315,   0.0503666869061,   0.0473997003265,     0.17297322543,  -0.0685009571442,   0.09134121324 [...]
+{   0.0645140035785,  -0.0784706837362,   0.0616537507294,   0.0506501043905,   0.0953218068191,   0.0483848268571, -0.00924587857392,   -0.078353855223,    0.108889381225,  -0.0027329513809,  -0.0153993068353,  -0.0732211105576,   0.0425456501426,    0.022293460168,   0.0739671859375,  0.00620550262797,  -0.0597555504459,   0.0085117488637,  -0.0807121850348, -0.00432478843372,  -0.0715082915707,    0.091608968442,    0.029915754938,   -0.079726440292,  -0.0381542799868,   0.07818660745 [...]
+{   0.0759696487423,  -0.0179454092548,  -0.0210640284928,    0.018598181861,  -0.0853269848276,   0.0359052238674,  -0.0511442811212,   -0.051025289099,     0.03054039189,   0.0625716406995,   0.0178047506573,   0.0261406858391,   0.0278090432513,  -0.0329940216432,   -0.118529823956,  -0.0221392656635,  0.00684960826536, -0.00935826854974,  -0.0212159176089,   0.0224471734713,   0.0761096187907,   0.0120286908527,   0.0719103764485, -0.00572573988601,  -0.0498693261927,  -0.05666913932 [...]
+{   0.0703453036922,   0.0503692664802,   -0.139174939433,  -0.0478524218188,  -0.0424932320641,  -0.0414087369751,   0.0371454457271,  -0.0294168599708,  -0.0858900667301,  0.00481220672513,  -0.0062796877447,  -0.0200598190591,  -0.0177785659184, -0.00928285556142,   0.0106103825034,   0.0484151956752,   0.0445064773008,   0.0806299177218,  -0.0400625358611,  -0.0358093701082,   0.0145374790002,  0.00715963196165,  -0.0657405764947,  0.00444130241228,  0.00691654151069,    0.0515764161 [...]
+{   0.0655534561035,   0.0823552995323,   -0.115082687795,  -0.0628090776857,  0.00428297561059,  -0.0349770919739,   0.0717705545342,  -0.0705065471658,   -0.026971390583,  -0.0596427908469,  -0.0197002210838,  -0.0340463206606,   0.0509140734691,   0.0680874470519,  0.00550239690394,   0.0630816056131,  -0.0193379910489,  -0.0059614033815,   0.0078642010023,     0.02257297796,    0.020663932415,   0.0220697308697,  -0.0145795080762, -0.00167783219217,  -0.0170005939151,   0.04148816119 [...]
+{   0.0707082317457,  0.00922145776713,   0.0815756473229,   0.0269029100712,  -0.0394677623787,   0.0727510065541,  -0.0399714479942,  -0.0899339217815,  0.00298413357658,   0.0930456340648,    0.026352004265,   0.0490824079213,  -0.0418535617228,  -0.0459658760033,   0.0201171776239,   0.0415540505636,   0.0647908445706,   0.0994984154149, -0.00940504582001,  -0.0552805245132,   0.0267853514603,   0.0425267901071,  -0.0860048150733,   0.0393364194598,    0.067918021808,  -0.06013129349 [...]
+{   0.0422627820519,  -0.0685688146042,   0.0934167118122,  -0.0839493248953,  -0.0719264267109,  -0.0227217950783,    0.277987071556,   0.0202266405234,  0.00105553099095,   0.0936338818778,   0.0310847922151,   0.0961581909656,    0.162970007899,    0.202949521799,    0.150568655496,   -0.312207386603,    0.173691254859,   0.0366917371803,  -0.0287876407201,   0.0903692059626,  -0.0206143455857,  -0.0376402882816,   -0.298358329945,   -0.263882370237,    0.106166103752,   0.03399863934 [...]
+{   0.0722681206483,  -0.0185689688577,   0.0754345705615,   0.0347460044924,  0.00758145269485,  -0.0496619341014,  -0.0535005561278,  -0.0689492887094,  -0.0785082550409,   0.0292876306623,  0.00227138883935, -0.00531821773912,  0.00784072971748,   0.0113461650502,    0.106962722344,  -0.0323073454673,   0.0240385407271,  -0.0232617161525,   -0.000401671008,  -0.0325857887556,   0.0135168681866,  -0.0287231769703,  -0.0255608894286,   0.0152799426577,   -0.138457314656,   0.01625663873 [...]
+{   0.0773802121281,  0.00331648600707,  -0.0747891975618,   0.0484191206623,  -0.0173724288329,  -0.0121735639307,   0.0137000884629, -0.00843207300782, -0.00990301788745,     0.01470910174,  0.00952155680353,   0.0231990433906,  -0.0245916241408,  -0.0484437219834,   -0.051321006706,  -0.0147876979105,  0.00522761611959, -0.00256306663994,    0.018317245747, -0.00443761248831, -0.00484741160696,  0.00267743510979,    0.022605105524,  -0.0153978344036,   0.0260821916471,   0.05779153138 [...]
+{   0.0739213178722,  -0.0435232417319,   0.0245787283326,   0.0525579978853,   0.0441975375078,  -0.0281666138869,  -0.0358993078454,  -0.0710250675002,-0.000740932689792,    0.012185177242,   0.0160102259031,   0.0601509575718,  -0.0286024683949,  -0.0104374582174,   0.0374948012765,  0.00507019884835,   0.0123957368131,    0.021689727077, -0.00278226338542,    0.069635803364,  -0.0375180057025,   0.0473903368947,   -0.027212197346, 0.000867892418303,  0.00590468423129, -0.006638857889 [...]
+{   0.0622335690261,   -0.108301749377,     -0.0906254952,  -0.0309493726752,   0.0133088629439,  -0.0198094278458,  -0.0789679254881,    0.123564738289,   0.0382768765749, -0.00118004015164,  -0.0238643754631,  -0.0988758232304,   0.0122299103375,   0.0584015419175,    0.100569902113,   0.0301477036567,  0.00837161060386,   0.0235986022924, -0.00702346941602,   0.0286550071102,  -0.0607568826915,   0.0601923726548,  -0.0356485862924,   0.0310493415527,  -0.0472995885376,   0.07096994908 [...]
+{   0.0417441555764,   -0.127653990564,  -0.0206418918939,   -0.125646619543,    0.149761618476,   0.0344029094963,   0.0609712764244,  0.00679753667536,   0.0333432230829,  -0.0880683480274,  -0.0279794106723,  -0.0764159505936,  -0.0988810914112,   -0.107380657443,    -0.14296925376,   0.0101688475913,     0.10812854818,    0.054820497798,   0.0505273000026,  -0.0811884771634,    0.156422640474,  -0.0649114568024,   0.0525918277387,  -0.0705984602231,  -0.0761566590363,   -0.0525497498 [...]
+{    0.051505191914,   -0.117500645321,    0.033037322255,  -0.0716476983067,    0.132725209772,  -0.0315139871591,   0.0427446974819,   -0.139597357373, -0.00536817339328,  -0.0895019667384,  -0.0208960126422,  -0.0193494762578,   -0.120835278691,  -0.0317637830707,  -0.0646022538615,  -0.0988429279374,   0.0240733155282,   0.0451639672332,  -0.0597905004655,   0.0587442034487,   0.0453126575855,   0.0227540077972,     0.10154508403,  -0.0757641603303,   0.0807974183996,   0.03134260534 [...]
+{   0.0641321930451,   0.0169082569729,    0.111292064664,   -0.097073968617,  -0.0991123437784,   -0.131650848709,  0.00687667321494,   0.0271229133448,   0.0171835263065,   -0.029661874862, -0.00971266639738,  -0.0548165529622,    0.134681975321,    -0.17067347718,  -0.0278714259512,   0.0604248756422, -0.00107347197706,    0.132104825991,   -0.059586231041,   0.0120823199299,  -0.0349694202442,    0.029734437405,    0.035317295884,   0.0205548095967,   0.0230008533117,-0.0005761510704 [...]
+{   0.0660133350624,   0.0249939144965,   0.0724960149725, -0.00919236178373,   -0.100096660482,   0.0337841620257,  -0.0281259039194,   -0.098496338055,   0.0144520460692,   -0.144952624109,  -0.0232910850159,  -0.0126456428288,    0.138826526545,  -0.0309930256912,  -0.0395355735464,  -0.0969650535818,  -0.0422784730495,   0.0533571196998, -0.00406226730921,   -0.121917045134,  0.00611399056189,   0.0121879233031,   -0.013436055181,   0.0170360471751,   -0.109982848718,  -0.07555864968 [...]
+{   0.0736027331531,  -0.0563189195748, -0.00439104735466,   0.0452900953944,   0.0212526317918,  -0.0375208751192,  -0.0465577055979,  -0.0655522333916,   0.0563742257811,   0.0172645360935,   0.0125513169264,   0.0285810746626,   0.0181020245437,  -0.0241412594087,   0.0312655337588,   -0.016046845027,  0.00919173435755,  -0.0083907467466,  -0.0586519202232,   0.0558620054483,  0.00122344583623,    0.015170803976,   0.0448356162535,  -0.0404527867802,   0.0187030795792,   0.03247111584 [...]
+{   0.0748472748801,  -0.0391369653526,  -0.0449068866221,   0.0711617972703, 0.000191356589746,    0.024020639793,   0.0171135691053,    0.036065585985,   0.0659441542033,  -0.0176309225118,-0.000954479144962, -0.00617981554778,   0.0633183925594,  -0.0156634554016,  -0.0315634978414,  -0.0329282112473,  -0.0502915848827,  -0.0317585124721, -0.00813778226119,   0.0388614079242, -0.00991246532608,   0.0229960784454,   0.0375882291648,   0.0170267457948,  0.00371959282958,  -0.03240062366 [...]
+{   0.0708033054704,  -0.0701602532113,   0.0207654712247,   0.0566954489065,   0.0582492234027,  0.00599269331095,  -0.0389292100644,  -0.0514990001673,   0.0833864079036,   0.0532734069854,  0.00840717427304,  -0.0171855482348,   0.0434075296122,  -0.0306082617578,   0.0436864017508,  0.00889824342241,  -0.0522414711268,  -0.0171543011125,  -0.0463397124964,  -0.0540153644535,   -0.103190236939,   0.0401030368713,   0.0108329538913,   -0.035634099351,  -0.0290578028053,   0.02222916466 [...]
+{   0.0464283161987,   -0.115126273404,   0.0503846022214,  -0.0848995267619,    0.149717710349,  -0.0377048858904,   0.0747736758969,   -0.174338341874,  -0.0193373856684,  -0.0474679848569, -0.00584304318962,   0.0209052191742,  -0.0629669528962,  -0.0327762943101,  -0.0582082864992,  -0.0939718614265,    0.090251358013,   0.0755724701429,   -0.142580818891,    0.203689568537,    0.185656855746,  -0.0576193443783,   0.0397966861977,  -0.0164676512659,    0.109249180486,  -0.04566813013 [...]
+{   0.0665514178109,  -0.0249054205357,   0.0994043930125,  -0.0244605103796, -0.00923663702232,  -0.0777157113251,   -0.065685940338,  -0.0817363809203,   -0.101516115344,   -0.146278362144,  -0.0525108987476,  -0.0960691835999,   0.0657747314171,    0.145840978789,-0.000602373707303,  -0.0227630838823,    -0.08654686754,  -0.0012359370614,   -0.169720973153,  -0.0906426888044,    0.043224076255,  -0.0561196146762,   0.0143212697123,   0.0168957214408,  -0.0140786256741,  -0.07126364799 [...]
+{   0.0756826523684,   0.0060542131526,  -0.0977446797164,   0.0455096311393,  -0.0252112473524,   0.0346520416216,   0.0366695129631,    0.026127055433,  -0.0391402100764,  -0.0219225117137, -0.00639917220451, -0.00842300643667,    0.005371072881,  -0.0240668581197,  -0.0971283404143,  -0.0485769395259, 0.000195915819487,   0.0215990312888,   -0.022159833858,   0.0079888225211,   0.0158708446291,  -0.0198799248527,  -0.0148929968776,   0.0479990799638,  0.00238286383822,   0.02730437610 [...]
+{   0.0651507845059,   0.0865245473735,   -0.110669540975,   -0.087294328335,   0.0101255459225,  -0.0969311115173,   0.0300247727865,  -0.0733133875499,  -0.0366171755405,   0.0201086877897, -0.00143850827633,  -0.0155621566169,  -0.0212548465212,   0.0238869383189,   0.0449033933092,   0.0309323165562,  -0.0753478821143,   0.0489598914829,   0.0363491173142,   0.0202254829308,  0.00606939370541,   0.0608087324466,  -0.0207726082178,  -0.0296354579532,  -0.0334110175979, -0.007220612967 [...]
+{    0.072301101171,   0.0276174538271,   -0.121278400539,  0.00587659323558,  -0.0296673289137,   0.0224280677087,   0.0762037537393, -0.00126406633965,  -0.0463916410962,  -0.0477573912507,  -0.0145905029343,  -0.0148647727323,   0.0472847550846,   0.0512776518061,  -0.0942512841143,   0.0522936166437,  -0.0189314738716,    0.053446218193,   0.0100659966717,   0.0683436177084,   0.0485294412072,  -0.0222902493132,  -0.0861867232642, -0.00259423534531,  0.00501213467905,   0.09416823564 [...]
+{    0.067247713688,   0.0679524226838,   0.0242264030582,   0.0367442777872,   0.0219619381283,   0.0779774669982, -0.00110670145135,   0.0457397727901,  -0.0508854118078,  -0.0364600933354,  -0.0114802682519, -0.00848386577075,   0.0021175115186,   0.0438333225567, -0.00154690693807,  -0.0639009601464,  0.00901220751845,  -0.0151888685252,  -0.0252621438067,  -0.0328898701796,  -0.0163934595469,   0.0541933208299,   0.0186290651239,   -0.104732040221, -0.00943000314749,  -0.04535208759 [...]
+{   0.0732025402586,  0.00212106374493,   -0.075477347998,   0.0293385882363,  -0.0208244568412,    0.030923501016,   0.0917296851068, -0.00266999483977,   0.0190316405873,  -0.0144897710422, -0.00105791177027,  0.00695149124135,  -0.0209237787334,  0.00231105634863,  -0.0972334303502,   -0.015599764303,  -0.0825873014442,  0.00372537062113,  -0.0506034565401,  -0.0356968713394,   0.0479889559165,  0.00450928814966,  -0.0443152710931,  -0.0853887332453,    0.213269184495,    0.1023445520 [...]
+{   0.0736984025178,  -0.0464497519377,  -0.0304054485427,   0.0699951080139,    0.039650353902, -0.00880259235908,  -0.0109224045849,  -0.0298896920522,   0.0307389843191, -0.00606606153464,  0.00144101431444,  0.00586016813277,   0.0242273053109,   0.0256070329734,  -0.0152906223609,   0.0314844845312,  -0.0227599614311,  -0.0901458528246,   0.0454273865745,   0.0458934033281,   -0.033987372826,  0.00556567286882,  -0.0201572477211,    0.042949972207,  0.00813844924346,-0.0001701443995 [...]
+{   0.0748097140385,    0.042362323851,  -0.0963436187419,   0.0186329632289,  -0.0153077960347,  0.00561619186366,   0.0595703280032,  -0.0116371650559,  -0.0260410474323,  -0.0162765436772,-0.000384441719801,  0.00753376277018,  -0.0230003699942,  -0.0457593101817,  -0.0812455911636,   0.0011591093196,  -0.0202602930749,   0.0281985195441,   0.0287763800888,  -0.0441782885164,  0.00728932422822,   0.0912719203783, -0.00378911318656,  -0.0594513498355,   0.0141751407514,    0.0758156621 [...]
+{   0.0647241715888,  -0.0741914830853, -0.00396436949444,    0.027269718921,   0.0135212937321,   0.0297926856206,    0.157435177833,   0.0532478165365,    0.145661967572,  -0.0552742173948, -0.00801834433129,  -0.0123198457608,   0.0669689183318,   0.0279979054876,  -0.0539293738486,  0.00979651895047,  -0.0311093218498,  -0.0737333640134,    0.093105791469,    0.077579327399,   0.0551125115582,    0.102506452462,   0.0801909253507,  -0.0670291630548,   0.0291379514651,     0.062478553 [...]
+{   0.0713990816346,   0.0426221459771,     -0.1394707003,   -0.038972231444,  -0.0495258601167,  -0.0296765846414,   0.0374548632874,  -0.0239640182539,   -0.107168820245,  -0.0126559406751,   -0.011913326354,  -0.0239878429627,  -0.0436139514962,   0.0209351109479,  0.00834064074311,   0.0310206558488,   0.0538623824647,   0.0597309445124,   -0.061327010305,   -0.014430969813,  -0.0218153930622,   0.0211716651557,  -0.0016657254858,  -0.0471763646292,  0.00591619372062,   0.02055105763 [...]
+{   0.0700862610414,  0.00799800697718,  -0.0730878538578,   0.0303626680701,  -0.0152189315357,    0.070220573671,    0.118581844646, -0.00397220259577,   0.0165390073575,  -0.0791758721801,  -0.0206405805472,  -0.0277523730995,    0.013714837887,   0.0245460284267,  -0.0778096051327,   0.0105072380763,   -0.108354765314,    -0.01541646874,  -0.0620345850424,  -0.0217469062192,   0.0816111548252, -0.00598258700353,   0.0274263211242,   -0.163902425529,  -0.0774254671676,   0.06032178830 [...]
+{    0.056732617478,   -0.121332780941,  -0.0131338597136,  -0.0488088465436,    0.108001586525,  0.00728492281625,   0.0516266368941,   0.0226985540867,    0.103087340815,  -0.0501371680836,  -0.0318230725786,   -0.107824026896,  0.00435632952883,  -0.0353206202892,   -0.104693046677, -0.00214554616692,   0.0285648238692,   0.0472995218272,   0.0458199303115,  -0.0828579351647,   0.0360115395339,   0.0625973971858,   -0.041973834492,   0.0131053910029,  -0.0163605261233,  0.007856039846 [...]
+{    0.063482378085,   0.0321522096328,   0.0858305146533,   -0.107007122768,   -0.042772297206,   -0.184552677575,  0.00481573458187,  0.00574109219233,  -0.0297809583749,   0.0355898303889,  -0.0105950793734,  -0.0980898343218,    0.145322817771,   -0.127776653346,  -0.0407536335115,    0.109581700235,   0.0341999799853,  -0.0420286277615,  -0.0348123619876,    0.110398515345, -0.00900623936389,    0.105240919326,    0.125527059186,  -0.0207488857322,   0.0602914637565,-0.0001106668049 [...]
+{   0.0571446949526,   -0.121067304126,  -0.0642716221399,  -0.0649578574044,   0.0727133188051, -0.00527597924839,  -0.0334337721026,   0.0887040721046,   0.0690166166728,  -0.0329114812658,  -0.0318692026197,   -0.124082835773, -0.00577678890019,  -0.0362882599293,   -0.028472990271,   0.0621215841606,   0.0405864272301,   0.0224661980316,   0.0187701272137,  -0.0441171647489,   0.0433937821004,  -0.0252641865412,  -0.0895339848229,  -0.0190636870605,-0.000319542292015,   0.02178203047 [...]
+{    0.052113577387,   -0.111560994658,   0.0491533265573,  -0.0760959303613,    0.122680912167,  -0.0629310229573,   0.0714839855667,   -0.149178050693,  -0.0688427409179, -0.00602663141726, -0.00115651127161,   0.0208730091443,   -0.122531384814,    0.012080247743,  -0.0307183560236,   0.0117650918275,    0.050108529917,  -0.0208533441623,   -0.088539836888,    0.152942945825,  -0.0425144701196,    0.140260688029,    0.146805011858,    0.107616034335,   0.0264964236261,   0.04452680816 [...]
+{   0.0582024745749,   -0.114275717374,  -0.0454556719055,  -0.0613058875473,   0.0233581404362,   0.0274580765738,   -0.136401169825,  0.00544797462704,    0.069424994447,  -0.0131772902918,  -0.0146150140553,  -0.0642025625338,    0.113794485853,  -0.0251080908981,   0.0646752432461,   -0.011480301432,   0.0096388528746,   -0.039942671689,  -0.0971321604416,   -0.020373888384,  -0.0745173059014,   0.0713170314604,  -0.0666940231558,  -0.0660965041603,  -0.0692230998091,   0.02061233739 [...]
+{   0.0400703318208,   -0.113799923383,   0.0339759525857,   -0.129309450457,    0.125714964512,  0.00330838509936,   0.0730785784772,   -0.113634062291,  -0.0790770239941, -0.00971492605971, -0.00633337913761,  -0.0148678145224,   -0.082628862997,   -0.113215315356,   -0.247181214487,   0.0397180491232,     0.10800013043,     0.13146452229,   0.0385747444876,   -0.078442172724,  0.00913890954379,   -0.365276914635,   0.0504161834633,    0.140031768413,   0.0778109255199,   0.03102473587 [...]
+{   0.0669745262354,  -0.0860541900699,   0.0619983104703, -0.00510492329123,     0.07734030139,  -0.0620737934039, 0.000263057987442,   -0.100788458948,   0.0226415467462,   0.0166281390949, -0.00148568044334,  -0.0113529984933,   -0.105050515552,   0.0279127920933,   0.0548909572453,   0.0704846188974,   0.0256839651694,   0.0296000247576,  -0.0554460167685,   0.0410223876742,  -0.0308770505609,  -0.0135807415555,  -0.0652532660302, -0.00876901935806,   0.0891500585657,  -0.05118824212 [...]
+{   0.0681653242728,  -0.0829713776315,    -0.10813060194, 0.000609584270701,  -0.0228976039221,  -0.0276932194122,  -0.0798748298274,    0.113974432068, -0.00152192308136,   0.0194709662772, -0.00978200968511,  -0.0553699659183,   0.0228641886823,   0.0292351991983,   0.0894347305692,   0.0229250387453,   0.0320943811616,   0.0293118306447,    0.034136626697,   0.0220170452454,  -0.0506214685912,  -0.0514047247944,  -0.0232279352562,   0.0257803957346,  -0.0194251299435,   0.01398429455 [...]
+{   0.0561581196272,  -0.0943921130985,   0.0229057559668,  -0.0730444025787,  -0.0736623190897,   0.0524741360609,  -0.0612620356234,  -0.0371580381776,   0.0250951689149,    0.105328348117,    0.029131855743,   0.0594321746684,    0.160791102537, -0.00892179126531,   -0.159450671842,  -0.0396566728236,   -0.166010029479,   0.0849127415191,   -0.103178807366,  -0.0728307084014,  -0.0166121666795,  -0.0944706850475,  -0.0968780620845,    0.100799776625,   0.0925228233182,   0.02127116042 [...]
+{   0.0688430951031,   0.0726743123177,   0.0645114735952, -0.00156315537766, -0.00566812860448,   0.0052354719919, -0.00764693082063,   0.0908632368887,   0.0210683820796,  -0.0731542962049,  -0.0165378494037,  -0.0365287117624,   0.0282198078818,  -0.0515002142034,  -0.0237390567676,    0.046200949436,   -0.063894697054,  -0.0307080643118,  -0.0136784443516,   0.0944199891705,-0.000635660492315,  -0.0993033858265,  0.00317503875026,   0.0221590971322,    0.044598697732,  -0.07567692483 [...]
+{   0.0745204543764,  -0.0530984372613,  -0.0264676641418,   0.0296689986869, -0.00413929091999,  -0.0544637321929,  -0.0503326801732,  -0.0472903901796,  -0.0179342152978,   0.0696241851237,   0.0101093548884, -0.00730584434016,   0.0298332628047,   0.0149845403211,   0.0133702462601,  0.00965733746097,   0.0344924042996,  -0.0532041611347,   0.0033070696398,    0.119187052051, -0.00877178060529,  -0.0365923696223,   0.0468702408646,  -0.0463698012676, -0.00715055858551, -0.007579919202 [...]
+{   0.0777236784304,  -0.0137271123625,  -0.0465779240729,   0.0415212835486,  -0.0261091045148,  -0.0379807742217,  -0.0115761323326,  -0.0434152487265,  -0.0147456363047,   0.0298708688351,   0.0162121103875,   0.0407657348134,  -0.0119011473866,  -0.0433142494618,  -0.0143751015927,  -0.0385163639786,   0.0450950045096,  -0.0227672554963,   0.0144582913468,    0.108456285735,  -0.0134423315734,  -0.0413420831414,   0.0683579611453,   0.0134395274746,  0.00455707632484,  -0.04349373021 [...]
+{   0.0645263463735,  -0.0946771914059,  -0.0407799190622,  -0.0276837958949,  -0.0411589546265,   0.0180643981958,   -0.133845588319,  -0.0148486634923,   0.0647663862033,   0.0529143856884,  0.00292345990064,  -0.0343773612741,     0.16127811194,  -0.0198393636994, -0.00810522138719,  -0.0156823624312,  -0.0217085033362,   0.0327150261047,  -0.0965144374042,   0.0512051698604, -0.00123881138765,   0.0059849582229,   -0.119033902043,  -0.0342734071288,  -0.0612626195512,  -0.04230905655 [...]
+{    0.067407652097,  -0.0807606276332,  -0.0710591981083,  -0.0043248741613,  -0.0603881215896,   0.0103161073099,   -0.109630825834,   0.0324327313062,    0.032851362647,   0.0560198443756,  0.00717953829129,  -0.0196017131877,     0.16713697449,  -0.0230136220211,   0.0587954434086,   -0.069459761862,   0.0365946570697,   0.0162582339706,  -0.0201813716121,   0.0822936548646,  -0.0299301059877,  -0.0504717395499, 0.000288777638836,   -0.031981167646,  -0.0161958586014,    0.0432410656 [...]
+{   0.0629716075097,   -0.108790816063,  -0.0497534312075,   -0.018952702895,   0.0739550287405,  -0.0333549905961, -0.00349795405086,   0.0441473339973,   0.0835907437051,  -0.0376085016793,   -0.020493436207,  -0.0724866659049,   0.0144834416235,  -0.0299176395468,  -0.0579013027767,   0.0162255552898,-0.000517201560805,   0.0303235688161,  0.00636881620173,  -0.0185761648023,   0.0965538303557, -0.00569054393162,  -0.0451296727605,   0.0483556886631,   0.0373719426463,   0.07439157068 [...]
+{   0.0687636055444,  -0.0941832495742,  -0.0393520527314,   0.0073978492695,   0.0466690789937,  -0.0307574620214,   -0.021876212723,   0.0200197535943,   0.0964807389426,   -0.022713654813,  -0.0157144100052,  -0.0677489624895,   0.0263517672482,  -0.0233531552414, -0.00693201838684,  0.00550802240052,  -0.0274138227554, -0.00783955435026,  -0.0139673471908,  -0.0751084760574,   0.0144155104332,   0.0332024020514,  -0.0121495467004,  -0.0319263433227,  0.00480453344906,  0.008294591947 [...]
+{   0.0704001634522,   -0.068036674419,   -0.115058317715,  0.00882352029558,  -0.0393947307007,  -0.0224197802705,  -0.0747872942346,    0.123978615402,  -0.0307916950329, 0.000480896408336,-0.000950961354439, -0.00544759454076,    0.013778144387,  0.00180819456081,    0.109089071682,   0.0162087984182,   0.0221382071299, -0.00362182797124,   0.0342078114247,   0.0542315042409,  -0.0368505034192,  -0.0443579284314,   0.0100958618425,   0.0279209414656,  -0.0216798960104,   0.03715941424 [...]
+{   0.0781372393748, -0.00451143836513,  -0.0404515658934,   0.0551714646123,  -0.0220485396505,  -0.0189080025335,  -0.0226812222978,  -0.0471299407699,   0.0110309831782,   0.0111593086195,   0.0205461952077,   0.0671578561911, -0.00916066641574,  -0.0615314233719, -0.00824980677118,  -0.0848548582308,   0.0245072540331, -0.00364588746772, -0.00499093846379,   0.0496230510546,  -0.0157535801011,  -0.0215451411646,   0.0447539737151, 0.000841369485487, -0.00848966458063,   -0.0157537103 [...]
+{   0.0763777481179,   0.0131685025522,   -0.084397255113,   0.0523778812425,  -0.0226170685375,   0.0303738916953,   0.0398320750952,  0.00716733720132,  -0.0102522475672,  -0.0116571390233,  0.00295347610991,   0.0154719321171,   0.0170582282989,  -0.0478121672089,  -0.0828618860186,  -0.0256529322925, -0.00702611677304,   0.0126052939198,   0.0201760217809,  -0.0251060335297,  -0.0394344507925,  0.00690139752347,  -0.0204196009439,   0.0302856848931,  -0.0349122480137,  -0.02420461536 [...]
+{   0.0689613363513,   0.0471326276598,   0.0101938661111,  -0.0614990928561,  -0.0534969953974,  -0.0961049848566,   0.0735303209592,   0.0352075924473,  -0.0103828384439,  -0.0310669868058,  -0.0029698246504, -0.00721619333514,  0.00769393735621,  -0.0628531050253,    0.117431406974,   0.0376939101422,  -0.0165488781026,   0.0629912467336,  -0.0324223433649,   0.0222012867944,  -0.0117009354927,  -0.0461924875151,   0.0645252660776,  -0.0589842935759,  -0.0113177710542,   -0.1122193654 [...]
+{   0.0706902746578,  -0.0296658324587,   0.0529261937913,   0.0242614467804, -0.00837603396699,  -0.0230833461529,    0.124902668154,   0.0359224013954,  -0.0112434668162,   0.0275815787815,  0.00149272488077,  -0.0210570058547,  -0.0477558412534,  -0.0512336274737,   0.0868071998726,   -0.040565515129,   -0.022313591468,  -0.0406771010124,   0.0725385678918,    -0.12066195939,  -0.0239517872011,  0.00659715221827,   0.0375284323843,    0.109745173542,   -0.003522226611,  -0.09713694356 [...]
+{   0.0671901404938,   0.0180758526405,   0.0832296188117,   0.0722230337341,   0.0294576786925,    0.023353152916,  -0.0020713018982,   0.0230563941453,   -0.130904048429,  -0.0711969678072,  -0.0227291767694,  -0.0183228016709,   0.0954205824477,    0.125214241524,   -0.104464571167,    0.093996788224, -0.00217490788483,  -0.0179288574684,    0.196926570743,    0.164208890847,   0.0517133350034,   -0.184546886684,   0.0627809492672,-0.000751509503861,  -0.0117708465932,  -0.04001581385 [...]
+{   0.0757958510954,  -0.0511952292793,  -0.0245143509945,   0.0432800309118,   0.0201171190974,  -0.0727837481298,  -0.0129866139692,   0.0150344581812,   0.0555957499037,  0.00125056846892,  0.00109683619532,  -0.0121294527173, -0.00470988887011,  -0.0280691620551,   0.0390738481375,  0.00127677291792,  -0.0491856330208,    0.045795983527, -0.00697375251933,    0.027265818731,  -0.0261725659006,  -0.0174290843445,  0.00475446189522,   0.0462204852172,   0.0715904478431,   0.02793803279 [...]
+{   0.0767356023498,  0.00513999161622,  -0.0126895395125,   0.0595045606483,  -0.0091204703239,   0.0174035195575,  -0.0138178481751,  -0.0433352417116,  -0.0537014840179,   0.0904007017942,   0.0194582466244,   0.0166839268233,  -0.0254589852107,  -0.0586285598122,  -0.0312126729323,   0.0114908214492,   0.0406613055306,  -0.0941714383455,   0.0307727348629,   0.0653894274391, -0.00228107938707,   0.0196453264556,   0.0605825831951,  -0.0659395225506,  -0.0866362493832,   0.01237050668 [...]
+{   0.0772756221718, -0.00492890947206,  -0.0684407947985,   0.0572881625796,  -0.0183356744225,   -0.004035611591,   0.0359629910527,   0.0144316653575,   0.0087853982688,  -0.0057914834088,  0.00984339680181,   0.0380803493474,  0.00157627236293,  -0.0432478451399,  -0.0703965488105,   -0.043207241824,  -0.0296705958065,   0.0235712761853,   0.0436602738588,  -0.0439907244927,  -0.0310881313022,  0.00606887242003,   0.0666406168326,  -0.0289704500092,   0.0438067364261,  0.002123690279 [...]
+{   0.0676953338141,  -0.0243630157241,   0.0413733277623,  -0.0591732508899,  -0.0971962882689,  -0.0826742270824,   0.0847618549255,   0.0220591123813,  -0.0900732754924,  -0.0346811709001,  -0.0351562132777,   -0.115358031655,    -0.04104806609,   0.0494682210719,   0.0184175656629,  -0.0707662810847,    0.104626846976,   -0.125801187069,  -0.0581154221349,   0.0175516654395,    0.117390794049,   0.0772451430522,   0.0120484640685,   0.0563521560778,  -0.0136752185179, -0.004381249645 [...]
+{  2.2531352904e-05,-0.000397141527467, 9.25438034624e-06, -0.00306849292808,  0.00265528578277,  0.00704398185997, 4.29382122939e-06, 0.000976017990886,  -0.0237005888843,   -0.147458238429,    0.961495270456,   -0.226289229558, -0.00768618441199,   0.0402239782491, -0.00715070334531, -0.00182928228778, 0.000919900973579,  0.00835420882302, -0.00540415735663, -0.00195042175939,  0.00190895224913,  0.00281212629171, 9.99378955267e-05,  0.00151034822989,  0.00296481084349, -0.001266153103 [...]
+{   0.0719536027204,   0.0674925493154,  0.00297094455597,   0.0215459860435,    0.044193215606,  -0.0234303531409,  -0.0547552352746,   0.0216158798982,  -0.0930382177699,   0.0169652586308,    0.013122061037,   0.0612408357107,  -0.0724218041519,  0.00319775366904,  0.00993856487334,  -0.0175681109306,   0.0196669245363,   0.0476410734354,  0.00457987935771,  -0.0820867341669,   0.0945413764545,   0.0311583387568,  0.00548598122831,  -0.0865751707586,   0.0162049444115,  0.001258999156 [...]
+{   0.0674560340892,  -0.0162770669755,   0.0691306716056, -0.00881787763069,   -0.059514823379,  -0.0146694326189,    0.138292537168,   0.0452383320471,    0.032199259384,   0.0133760123418,   0.0141921152666,   0.0458121275016,   -0.103618349879, -0.00551819535992,   0.0610005537388,  -0.0227342513421,  -0.0269177700455,   -0.133410834154,  -0.0324811792679,   -0.103168182131,   0.0618927940589,   -0.064708480749,    0.113035132802,   -0.134973746547,   -0.115105906004,  -0.09147326525 [...]
+{   0.0731784499993,   0.0557260488616,   0.0165237647963,   0.0378184247053,   0.0417841719884,  -0.0314698253549,  -0.0433997447044,   0.0471007252761,  -0.0689542387032,   0.0068542362738,   0.0213212472737,   0.0975590922791,  -0.0269210711476,  0.00470562313961,  -0.0015446627903,   0.0175061923575,   0.0717268028792,   0.0146785234124,   0.0210011134325,   -0.137883968978,   0.0730021706221,  0.00423201021216,   0.0374403248575,  -0.0889280017701, -0.00884570898349,   0.03280447372 [...]
+{   0.0576327232256,    0.112226702224,  -0.0685512709941,   -0.118972718504,   0.0694091559795,   -0.130489870448, -0.00642219088556,  -0.0341147971777,   0.0621084055425,   0.0435837990657,   0.0264836325147,   0.0746999840108,   0.0338859159882,    0.020900106837,   0.0368721051543,   0.0164669458304,  0.00256818586022,  -0.0224983415586,   0.0733513404682,   0.0114098590048,  0.00282234823012,  -0.0341572722255,   0.0327461294876,   0.0701446453827,   0.0121624738116,  -0.01627920081 [...]
+{   0.0619905475605,    0.076368602855,   0.0564671349925,  -0.0949254293976,  -0.0375988528166,  -0.0724682343273,  -0.0593032262494, -0.00963450210955,   0.0106141735003,   0.0523775843146, -0.00371513264198,  -0.0626875779142,  -0.0560141540051, -0.00638588348317,  -0.0684524005006,   0.0224209656272,   0.0673123509017,   -0.286540539748,    0.116206357921,    0.057492507423,    0.116859656454,  -0.0324981753607,  -0.0700994316056,   -0.104677770757,   0.0410134013163,   0.02953173257 [...]
+{   0.0616636440209,    0.102204629233,  -0.0880982901533,   -0.109990530871,   0.0410768604791,    -0.11756275828,   0.0154021393204,  -0.0671194525687,  0.00971874326479,   0.0282714683824,  0.00491051203213, -0.00368975834417,   0.0169302197433,  0.00549378635528,   0.0523978176676,  -0.0189866847436,  -0.0518224501967, -0.00353671314925,  0.00251254375499,-0.000555772883019,  -0.0173041063401,  -0.0198032449108,  -0.0228980544831, -0.00948471925994,   0.0358594119456,   0.01323019483 [...]
+{   0.0647391403072,   0.0442444812023,   0.0766752310955,  -0.0598009022528,  -0.0762694179326,  -0.0638709411773,  -0.0491119586438,   0.0167955991462,   0.0924544086271,  -0.0374947042188,   0.0116123792291,   0.0585725180515,   -0.173607172847,  -0.0212822011154,  -0.0982519023833,   0.0686372623625,   -0.150557023617,  -0.0193790036107,    0.103123810874,   0.0299447257536,-0.000437777947171,  -0.0264053542609,   -0.145516041655,   -0.116735818392,   -0.129513900454,   0.06067412160 [...]
+{    0.060654496087,  -0.0158676657166, -0.00461381555139,  -0.0568279723082,   -0.150554924343,   0.0477842514212,   -0.191629610492,   -0.100397830475,  -0.0126291355757,   -0.110340502544,  -0.0157325240649,    0.050907958205,   -0.166428010244,    0.221629315783,  -0.0509747116718,   -0.140488003474,  0.00117250522773,   0.0241029414965,   0.0883236262107, -0.00174950084467,   0.0752223540446,    0.140352682557,   0.0702933306409,    0.141237303946,   0.0638058006264,   0.09192993254 [...]
+{   0.0723486395773,   0.0739731125074,  -0.0509808042883,   0.0165004594742,   0.0226982194835,    0.035988663905,   0.0295718916012,  -0.0561680507412,  -0.0535128072831,   0.0334511299427,  0.00976224142124,    0.026601855725,  -0.0438262084913,  -0.0127255284471,   0.0199861314972,     -0.0162378524,   0.0134479785449,   0.0168217053077, -0.00962904756942,  -0.0704993547356,   0.0124950270866,   0.0414939264124,  -0.0437139331789,  -0.0215845356931,  -0.0156266744797,   0.03257251791 [...]
+{   0.0642606318761,   0.0931742515661,    -0.10598160341,  -0.0977434845479,   0.0184647379183,   -0.101413610737,   0.0350937691038,  -0.0661069993863, -0.00203804282829,  0.00627794396732, -0.00418872869109,  -0.0246639373181,   0.0036207698181,  0.00760106500736,    0.048222503928,   0.0036150494229,  -0.0745166449872,   0.0352210829399, -0.00744178120789,   0.0307337015374,  0.00289305054978,   0.0122602516334,  0.00179957423217,   0.0149588046296,  -0.0130088586024,  -0.02069507447 [...]
+{   0.0656171922527,   0.0283028827695,   0.0833941236094,  -0.0387230117699,  -0.0794088460303,   0.0157523819519,   0.0507836950287,  -0.0512979662589,  -0.0749157068952,    0.107155137778,  -0.0161764545662,   -0.149911605276,  -0.0424529826338,  -0.0527293580514,    0.114991216113,  -0.0441057656086,   0.0533916881017,   -0.287687053656,   -0.043413307225,  -0.0862081514959,     0.14255486593,  -0.0482214420552,   0.0486681376202, -0.00938063798864,  -0.0221098738696,    0.1698505512 [...]
+{   0.0724088422829,   0.0737593471901,  -0.0398256515593,    0.024882424042,   0.0290744449474,   0.0469098170564,   0.0272310744419,  -0.0402181102118,  -0.0452715535299,   0.0247881989816,  0.00828954323565,   0.0267533813793,  -0.0529835377598,  -0.0147782741914,  0.00229538053769,  0.00884836664673,  0.00965273358545,   0.0166692999909,  -0.0275561342976,  -0.0972913037356,  0.00360363683579,   0.0464425897725,  -0.0198062364702, -0.00130888079807,  0.00802055142801,    0.0396989739 [...]
+{   0.0522037193011,   0.0483991930357,   0.0927534416585,  -0.0715098966768,   -0.115515723338,  -0.0118105151358,  -0.0958294864108,   -0.048684565872,     0.16151355656,   -0.242689164962,  -0.0175300316439,    0.069672329276,   -0.197688383724,  -0.0072995183374,  -0.0573105318075,   -0.230170161794,   0.0283998615031, 0.000954403887685,    0.277766146256,  -0.0550508690934,   -0.308926148275,  -0.0076255372819,  -0.0127529968283,  -0.0703256258661,   0.0592679210566,    0.1080160601 [...]
+{   0.0752018520651, -0.00719321899708,  -0.0452627764994,   0.0688720971788,    0.021852107105,   0.0244673713416,   0.0318796492503, -0.00828446893253,  -0.0189987447102,   0.0374625982962,  0.00814533671876,  0.00950406019727,  -0.0355045542694,  -0.0321684768683,  -0.0149570154518,   0.0633900101604,  -0.0679762491777,   0.0538065497572,  -0.0180446292106,  0.00348556331978,  -0.0263982129441,  -0.0253632742119,   0.0130449874787,   0.0893117040523,   0.0233883695813,    0.0670214503 [...]
+{   0.0650245770292,   0.0740757747618,   0.0196493533778,  -0.0653026950046,  -0.0436838972467,  -0.0600485696328,   0.0810793326718,   0.0529537329369,    0.090289444674,   -0.103541460513,  0.00883627282801,    0.091958068617,  -0.0394533358588,  -0.0177788582412,   0.0950934984472,   0.0549322854903,   0.0143766489663,   0.0570886909507,  -0.0524767708657,    0.045794058838,   0.0377888693856,  -0.0957251778608,   0.0325276394039,  -0.0321384357975,  -0.0330354035667, -0.009469393100 [...]
+{   0.0620473197736,   0.0673589422776,   0.0670569898824,  -0.0383799823332,  -0.0518902769785,   0.0699945429306,  0.00615944400938,   -0.040379993483, -0.00164394393167,    0.048266386749,  -0.0283161392934,   -0.182519535836,  0.00336946199923,   -0.142636926813,    0.107174371947,     -0.0190498471,  -0.0679195983597,   -0.209022456224,  -0.0544592098329,   -0.142005773361,    0.121247690285,  -0.0846992792205,  -0.0245862880156,  -0.0293755324803,     0.06925964796,   0.04774800002 [...]
+{   0.0716137469609,   0.0110186637159,   0.0530709284372,   0.0404058673533,   0.0301165163547,  -0.0778332566607,   0.0601315540854,    0.085069894332,  -0.0794992488807,  -0.0314806864346,   0.0123384117358,   0.0791320545461, -0.00923855419009,  -0.0404588910219,   0.0488475719402,  -0.0011702294594,   0.0282084437011,     0.11437235876,  0.00150454674507,  -0.0525597434905,   0.0489283509125,  0.00256329545244,   0.0171252108389,  -0.0102198432942,  0.00217959976055,  0.002746592806 [...]
+{   0.0628798134737,   0.0492110982073,    0.110573883571,  -0.0348472963401,  -0.0671538775526, -0.00968573689866,  -0.0354265744993,   0.0689849520739,   0.0764009908803,  0.00391998726573,    0.024471151233,   0.0783818116741,  -0.0697103395298,   -0.118710517604,  -0.0571838857485,   0.0350784913389,   0.0300026460399,    0.055677146253,  -0.0091009728562,  -0.0108193683962,  0.00745689697276,    0.199118614741,  -0.0340341594045,   0.0552553135082,   -0.101046310733,    0.2780754234 [...]
+{   0.0690127852366,    0.083795109975,  -0.0105043238502,   0.0284660150079,   0.0571989035004,   0.0816045413377,   0.0226965234601,  0.00259476124095,   -0.068861040937,   0.0248943675214,-0.000443074392691, 0.000580460028839, -0.00324728233051,   0.0292540102077,   0.0255352153454,  0.00998030758578,   0.0322010139341,   0.0421415799646,   -0.058888749548,  -0.0688108548954,   0.0309784215444,   0.0484640003834,   0.0296080633587,  0.00514525692289,   0.0620869182737,  -0.01072601946 [...]
+{   0.0663697891781,  -0.0123231621963,  -0.0412047600292,  -0.0399109344974,   -0.144204589212,    0.054660260416,   -0.145978035893,   -0.094173632763,   -0.061226769996,  -0.0481886154125,  -0.0117592491803,   0.0192055471542,  -0.0664152465346,    0.161569303933,  -0.0182765268582,  -0.0285092556515,   0.0692109948503,   0.0334865619736,   0.0532422483442,  -0.0148690815876,  -0.0317414872031,    0.137121763712,   0.0135588331395,   0.0415459621116,   -0.129802299269, -0.002251816333 [...]
+{   0.0579336854488,    0.111956970266,  -0.0725347669607,   -0.117034157452,   0.0665902291564,   -0.122509984002,  0.00132310620118,  -0.0382602156609,   0.0581945020119,   0.0537112702847,   0.0256364810181,   0.0661858815646,   0.0288466383999,   0.0322876111814,   0.0374725614306,   0.0185525972904,  -0.0377582117534,  -0.0270630949964,   0.0974185592008,  -0.0142712731697,  0.00436071117327,  -0.0336206130145,   0.0239666952805,  -0.0222710136684,  -0.0274944909752,  -0.05413236079 [...]
+{   0.0640486175744,   0.0625764166887,   0.0649097487469,  -0.0896220412743,  -0.0381463871757,   -0.129943851158,   -0.122315130662,  -0.0260817756089,   0.0600516813725,  -0.0632287123101,  0.00259650854049,   0.0317793277577,  0.00331390164658,  -0.0551314397062,   -0.101508591357,   0.0221485211279, -0.00667328786099,   -0.016748079831,   0.0677350652838,   0.0551009336619,   -0.160476480489,   0.0452088762887,  -0.0119282918597,  -0.0434282409214,  -0.0649824221808,  -0.05064451522 [...]
+{   0.0688658626077,   0.0575066609923,   0.0307243636591,  -0.0323796209275,   0.0358878143788,   -0.160223958436,    -0.10002659013,   0.0502893996903,  -0.0509163400703,  -0.0366018100806,-0.000725249800889,   0.0220003341572,  -0.0101938102223,   0.0151911674652,  -0.0596801411852,    0.043596654218,    0.018469318823,   -0.112277821947, -0.00254412056827,    0.023362010255,  -0.0250650560102,   0.0427093405767,   0.0605824410953,   0.0258544811755,   -0.018732426918,  -0.01406243604 [...]
+{   0.0592155698912,    0.121496044327,  -0.0244644767161,  -0.0611260520283,    0.104011570997,   0.0570158233338,   0.0213432200777,  -0.0339616881765,   0.0274195036077,   0.0479711982199, -0.00345206311181,  -0.0424051025744,   0.0467716655543,   0.0320785545419,     0.07835931631,   0.0564255124904,   -0.057273900264,   0.0204259564479,   0.0215253538045, -0.00662621748222,  -0.0439751649944,   0.0329110269922,  -0.0480951447959,   0.0270202021992,   0.0491890382279,    0.0167283990 [...]
+{   0.0684616419391,   0.0539367002859,   0.0165704024453,  -0.0967705765651,  -0.0737879476045,   -0.116900568258,  -0.0644296873396,  -0.0841510809049,   0.0159144469129,  -0.0435410559366,  -0.0141716361402,  -0.0549348814749,   0.0862376329043,  -0.0912127339224,  -0.0508150805296,   0.0552299667528,   0.0179647159596,   0.0684451025581,  -0.0245379221207,   0.0869097733361,  -0.0621772318268,   0.0499191755489,   0.0204464546272,   0.0198721514297,    -0.12367789821,  -0.06801461925 [...]
+{   0.0706016393461,   0.0521530132618,   0.0373954071843,-0.000122621010554,   0.0467272521434,   -0.124018403649,  -0.0776097794265,   0.0692607364851,  -0.0897351087161,  -0.0369365672662,  0.00637743249594,   0.0616825138924,   -0.018365961788,  0.00637702727273,  -0.0627853209608,  -0.0315157964546,   0.0780210100771,  -0.0523195982141,   0.0361562885023,  -0.0391859489903,   0.0300868169983,  0.00189742929969,   0.0203656051924,   0.0546431599922,   0.0648872989105,   0.01459681222 [...]
+{   0.0721985105103,   0.0701656183531, -0.00912958474983,    0.028871564048,   0.0370608717258, 0.000522524110509,   0.0236954086199,   0.0251913358632,  -0.0342901589915,  0.00599256418744,   0.0180243447508,   0.0762595865718,  -0.0440392455384,  -0.0262525996306,   0.0294366574395,   0.0156263554938,   0.0239073708508,   0.0815504609933, -0.00585907332833,   -0.058692337014,  -0.0582585310907,   0.0154819819867,  0.00186134990301,  -0.0811155207659,  -0.0331551133679,   0.03914366164 [...]
+{   0.0688631923194,   0.0523374538582,   0.0561891959278,  0.00139031455263,   0.0533800223477,   -0.131521273614,  -0.0813370089028,   0.0978582588132,  -0.0698387063921, -0.00770929872613,   0.0156028608639,   0.0769142102758,  -0.0238958795142,  -0.0106289013936,  -0.0479084788268,  -0.0395986807009,   0.0434951323786,  -0.0761852497988,   0.0228356848911,  -0.0836694649181,  -0.0102716065347,   0.0893705323867,   0.0277387484926,   0.0276485381516,   0.0289635936488,   0.04587854801 [...]
+{    0.068057070114,   0.0495509916118,   0.0602125560047,  -0.0175360179767,  -0.0523109835892,  0.00476382535415,   0.0278212178299,   0.0687712326152,   0.0528881084954,   0.0157465753526,   0.0104075627661,   0.0203617468239,   -0.127259930694,  -0.0292950155198,   0.0864964401373,   0.0161578560869,  -0.0594749551795,  -0.0998381369688,   -0.100062752826,  -0.0148321268077,   0.0339492462975,  -0.0969950260255,  -0.0811224575356,   0.0055421849357,   -0.107948056345,  -0.07209179321 [...]
+{   0.0493016500825,    0.122553952654,    0.025954572374,  -0.0793898821931,    0.129554496551,   0.0835823221219,   -0.018564120323,    0.122241841733,   0.0655973379716,   0.0727701236111,  0.00883460702156,    0.010039659154,   0.0163495458877,   0.0729469823367,  -0.0723799732589,    -0.02706928999,   0.0319959954149,   0.0798894211755,   -0.144831788042,   0.0488629088061,  -0.0429065296896,   0.0576309526283,   0.0446659396805,   0.0590028030095,   0.0486264210487,  -0.08520875458 [...]
+{   0.0397096422837,   0.0024981904383,   0.0122209552193,  -0.0282020855917,   -0.134229319412,    0.080821128242,    0.154254907193,  -0.0438958307412,    0.305168865788,   -0.226161466378,   0.0292532500706,    0.262262227428,    0.217835469545,    0.180660569009,  -0.0244715567159,    0.274729666654,     0.52148770069,   -0.241827455005,   -0.128397276639,   -0.142338964717,  -0.0651124892808,   -0.015935821114,   0.0433073393457,    0.119239013417,   0.0874151832258,  -0.02482636341 [...]
+{   0.0368547428014,    0.122674922863,  -0.0126819166155,   -0.134916139056,    0.183208257278,   0.0118619592113,   -0.057206626939,    0.097619618048,    0.170359817589,    0.227109572452,   0.0586717944559,    0.114640178933, -0.00995229668169,    0.119186857357,  -0.0228640688805,    -0.17273360566,  0.00277733136817,   0.0336306176967,  -0.0889379260371,  -0.0805317111935,    0.089119922582,  0.00950961527909, 0.000239867490804,   0.0625501177317,  -0.0487566315474,  -0.02920337518 [...]
+{   0.0630957934635,   0.0963522614134,  -0.0975489414947,   -0.102656010988,   0.0271968539153,   -0.109233181875,   0.0259515047585,  -0.0631804619013,  0.00766720960172,  0.00257840158646,  0.00309052177439,   0.0085362512612,   0.0208623304539,   0.0191399584759,   0.0466323398386,   0.0425812823274,  -0.0261154721388,  -0.0020888297161,   0.0171746877829,   0.0041380990943,   -0.019964324726,  0.00964441543572,   0.0103721499093,   -0.028682956683,  -0.0286734756324,  -0.06806723924 [...]
+{   0.0476793744821,    0.123657009298,  0.00480303314412,   -0.109020948817,    0.134046943337,  -0.0175867623999,  -0.0707210335386,   0.0930115984939,    0.102984371136,    0.137497531836,   0.0414068613531,   0.0891820780606,  -0.0412432876358,    0.027666448245,  -0.0701131535482,   -0.102931358024,   0.0479158809999,  -0.0294544617631,  -0.0744373634634,  -0.0649241337974,   0.0240304483858,  0.00687554219431,   0.0025803111062,  -0.0402503009979,  -0.0289039339557,  0.004251066598 [...]
+{   0.0640662033502,    0.110548975062,  -0.0050198760099,  -0.0197959270975,   0.0788912236353,   0.0493341729975,  -0.0222966390167,  0.00735322775865,  -0.0549871585905,   0.0372889086538,  0.00954911241072,   0.0349803460476,   -0.019005121942,   0.0266137141437,   0.0315640274223,  0.00150031729751,   0.0695492766207,   0.0511472533718,  -0.0549153420223,  -0.0902873357353,   0.0795716931991,   0.0521059783442,  -0.0283233173624,  -0.0881336109673,  -0.0147035116354,  -0.05402395098 [...]
+{   0.0490062778172,    0.124535644552,  -0.0358624488103,   -0.125405235165,    0.129057875628,    -0.09444107772,  -0.0466519142157,   0.0262326702853,    0.109002813907,    0.127118121855,   0.0518126211938,     0.13299434603, -0.00703871765697,   0.0457199073088,   0.0110805496784,  -0.0484985734488, -0.00140558310078,  -0.0649877833318,   0.0566918358972,  -0.0442982660991,   0.0600303405271,    -0.06139456302,   0.0266273704739,  0.00798499204796,  -0.0367364779642,   0.02983340565 [...]
+{   0.0517566911123,    0.122315274396,   0.0327185963579,  -0.0985580959399,   0.0718352683917,    0.111168829337,   -0.028415865488,  -0.0237922685366,    0.141239075899,  0.00912006835861,  -0.0129071250345,  -0.0703593049219,   0.0245630571253, -0.00651379427721,   0.0327582407617,   -0.048216162474,    0.027263805214,   0.0473143296815,   0.0849211532679,   0.0237212823336,   -0.067324480723,  0.00903166668603,   0.0447268456355,   0.0777434114967, -0.00398539464335,  -0.04876441689 [...]
+{   0.0731418081614,  -0.0395009222232,    -0.12157061764,   0.0283415613869,  -0.0555947023368,    -0.01103856282,  -0.0389487117011,   0.0856875677674,   -0.036580927835, -0.00395744334562,  0.00236818102465,   0.0181301457193,  0.00692876850367,   0.0123859825943,   0.0122833842874,  -0.0367516801379,   0.0629796845362,  0.00798525374358,   0.0227652274616,   0.0451452411619,  -0.0482611146949,  -0.0062198894578,  -0.0140583725225,   0.0293841943453,   0.0352570126762,-0.0007115863939 [...]
+{    0.073248074191,  -0.0164476821351,   -0.139397834497,  0.00888444709006,  -0.0685526583305,   -0.013117892184,  -0.0239542543203,   0.0649455535852,   -0.100776739393,  0.00569615167778, -0.00162751638011, 0.000521890662088,  -0.0279393828073,  -0.0168023401199, 0.000256591271088, -0.00984569923983,    0.075980210733,    0.043491974605,  -0.0142193275592,   0.0593112727032,  -0.0384284041238,   0.0144439308743,  0.00527682252553,   0.0163371194593, -0.00911398900847,  -0.03650440730 [...]
+{   0.0743914922278,  -0.0312733188118,  -0.0381796496732,   0.0817928226912,   0.0369848800064,   0.0430765361521,   0.0273899913555,   0.0126983093476,   0.0292374491319,   0.0251604352185,  0.00754369931262,  0.00527125461696,   0.0213681125087,  -0.0575940461655,  -0.0570359521879, -0.00334648338195,   -0.033114620503,  -0.0262617339324,  -0.0365579242239,  -0.0340512808496,  -0.0621806895384,   0.0341741201104,  -0.0117929170072,   0.0413491395662,  -0.0176958356893, -0.006774877366 [...]
+{    0.073000778032, -0.00383595993035,   0.0808624110147,   0.0173714033203,  -0.0480628223385,  0.00567989541806,   0.0481902436208,   0.0572087297398,   0.0653393215097,   0.0153051193062,   0.0175018521662,   0.0604512070289,   -0.145235632601,   0.0103799383051,   0.0620596674499,    0.070003195366,   -0.109671531399,   0.0325179913224, -0.00253310926957,  0.00828917369391,  -0.0164108888247,  -0.0790451805967,  0.00313546044093,   0.0192274130164,   0.0634221359563,   0.02261575098 [...]
+{   0.0596531513999,  -0.0942229748276,   0.0562276652015,  -0.0365643981713,    0.018171882515,   0.0116418496812,   0.0329470234538,   -0.101258545213,   -0.021832800732,    0.128720360028,  0.00943607485084,  -0.0314918780549,    0.121986913906,   0.0604320644489,   -0.198292616802,   0.0785312061869,   -0.038655668394,  -0.0176579927168,   0.0188756781334,  -0.0248850316363,  -0.0530233829297,  -0.0434921700308,  -0.0787260205141,  -0.0431997680729,   0.0815857809641,    0.0237577469 [...]
+{   0.0618726176977,    0.105898985851,   -0.052694515207,  -0.0548602038155,   0.0627296281704,   0.0216628852484,   0.0686436609523,  -0.0444490610124,   0.0386840522958,  -0.0296871504725, -0.00438241563447,  0.00799086769083,    0.107666747223,   0.0799190710727,  -0.0160931883862,   0.0504819758004,  -0.0891271975084,  0.00221352088565,   0.0197601356842,   0.0409879374897,  -0.0358306097912,   -0.010589237287,  -0.0419147220891,   0.0846685393784,  -0.0420336004778,   0.01356818153 [...]
+{   0.0714143384683,   0.0756466284536,  -0.0292729997842,   0.0436582312282,   0.0414913571318,    0.096142971393,   0.0457325291652,  -0.0290966378989,  -0.0399039417677,    0.026626755025,  0.00387415407312,  0.00628714441938, -0.00443617611676,  -0.0117468647392,   0.0363703722725,   0.0559307783652,   0.0100936261433,   0.0584157013539,  -0.0717647537089,  -0.0114511032737,   -0.054440398927,    0.021842723266, -0.00698090006881,  -0.0078420197177,   0.0405293824876,   0.02799047696 [...]
+{    0.062850381345,    0.107959837502,  -0.0633575726842,  -0.0594186095271,   0.0711316459791,  0.00437134966429,   0.0701248452953,  -0.0511499748721,   0.0406638805342,   -0.016322223667, -0.00738033203042,  -0.0209158942356,    0.110916950244,   0.0469766497249,    -0.01399069218,   0.0381241084926,    -0.12882823534,  -0.0231309964562,   0.0590125549197, -0.00394297952659,     -0.0162300294,  -0.0031693049635,  -0.0103099000515,   0.0653110678292,  0.00713147519332,  -0.03637881731 [...]
+{    0.072109297653,   0.0632989735806,  -0.0484086990485,   0.0560222722095,   0.0280302133032,    0.104001546117,   0.0347566046408,  -0.0589653333297,  -0.0685015901675,   0.0122041586481, -0.00796393993767,  -0.0339716808256,  -0.0134836311245,  -0.0187112773683,  0.00553654178906,   0.0151907155946,  -0.0155256833609,  -0.0370592533146, -0.00658025858442,  -0.0169453264733,   -0.035849869566,  0.00902842336326,   0.0300095837162, 0.000973575586861,   0.0184055040045,   0.04283743587 [...]
+{   0.0475636462515,   -0.119050964077,  -0.0204561024097,   -0.146860887151, -0.00325610042782,   0.0819520968738,  -0.0534272418796,   0.0890690036629,  -0.0235623650342,   0.0061670057628, -0.00323567679937,   0.0116498833156,  -0.0225000737372,   0.0816288614127,    0.107624476118,   0.0582906542746,  -0.0829686518006,   0.0400541300927,  -0.0326772107092,   0.0405327974791,  -0.0515259853078,   -0.028614544271,    0.115670800792,  -0.0660789449678,    0.153746230086,  -0.01851650939 [...]
+{   0.0575084371152,   -0.087828766478, -0.00975546813381,   -0.113546601147,   -0.145489246293,   0.0621951484834,   0.0274989086646,   0.0971293492512,  -0.0617077513174,    0.202660322258,   0.0292418403115,  0.00499279851445,   0.0487023892826,   0.0227979209691, -0.00854509120085,  -0.0587901681745,   0.0205746397686, -0.00312234830197,    0.145674913298,   0.0823172854583,    0.054237874672,   0.0583098879856,   0.0826670115461,   0.0937063143224,  -0.0183371628017,   0.04309317672 [...]
+{   0.0275481487542,   -0.118592409775,  -0.0232348802098,   -0.196143121116,     0.17038860995,    0.119544042715,    0.002519381448,   0.0755496657446,  -0.0614774235333,  -0.0954751433026,  -0.0232204814725,  -0.0610743429756,  -0.0787163151152,   -0.159429269938,   0.0815180775067,   0.0692583570461,    0.185568879165,   0.0473228986375,    0.210497953385,  -0.0140848515984,   0.0712207896505,    0.128340316841,   -0.206754070598,   0.0232134763734,  -0.0268567064098,   -0.1530145992 [...]
+{   0.0457455220579,  -0.0905485173585,    0.068244059916,   -0.104845763632,  0.00326301378243,  -0.0662754429771,     0.17721844948,  -0.0460380037081,   -0.192920721032,   0.0967306341651,   -0.010747763824,  -0.0725765319309,  -0.0689616519759,   0.0873923298553,  -0.0814634110275,   -0.236240682846,    0.145092239995,  -0.0402627158756,   -0.114129710373,   0.0592454581956,   -0.194504712302,  -0.0424994491605,  -0.0758571634037,    0.324280441793,   -0.314181938994,  -0.07935598159 [...]
+{    0.063202158427,   -0.103320894807,   -0.096456220334,  -0.0286081817522,  0.00634250696254, -0.00815407151171,  -0.0789720256957,    0.138590951656,    0.037192184742, -0.00927709701855,  -0.0170891607386,   -0.069680759685,  0.00648448468898,   0.0231096269715,    0.112881646604,   0.0704969074775,   0.0435217356734, -0.00208111721407,    0.024302660732, -0.00932642770689,  -0.0326565860337,     0.00120171593,  -0.0190927231036,   0.0132560604127,  0.00465117068078, -0.002232263966 [...]
+{   0.0589037329871,  -0.0691092592439,  -0.0143955185103,  -0.0900378874199,   -0.187266781318,   0.0872089857585,  -0.0976362285732,   0.0176064013378,  0.00133910998885,    0.145251614048,   0.0381167908395,   0.0751966772721,    0.074523764332,   0.0232850470232,   0.0142363325208,  0.00734114333948,   -0.020384995615,   0.0804486203286,   0.0432005844685,   0.0818493701428,    0.085178476283,   0.0469940805262,  0.00708110776078,  -0.0117736879643,  -0.0298872988164, -0.007120203898 [...]
+{   0.0376493318194,   -0.123202367495, -0.00594261462871,   -0.192360866893,   0.0452634133319,    0.121530505462,  -0.0356986236325,   0.0790482731604,  -0.0750560227607,   0.0819461155267,  0.00784536724875,  0.00788393560005,   0.0316676863222,   0.0705364404256,   0.0500868190598,   0.0951629068939,   0.0345420415254,    0.015703430554,   0.0227014743525,   -0.154699096852,   -0.165472123881,   -0.138549232604,   -0.167248266955,  -0.0765658501204,  0.00224911973702,  -0.03216180270 [...]
+{   0.0580857747195,  -0.0793639444257,   0.0052197931733,   -0.123117518452,   -0.166904189681,   0.0494113645469,   0.0905546293636,    0.104987614256,  -0.0551831246392,    0.179685385618,   0.0215722556395, -0.00382595010163,  -0.0395192809169,   0.0718436171164,   0.0259761286563,  -0.0813201432066,   0.0205704819403,  -0.0118763405081,    0.108136043782,   0.0148571628741,   0.0596475218545,   0.0554212666515,   0.0897011207914,  -0.0157889624915,  -0.0122888777536,  0.009984854359 [...]
+{   0.0218374880676,   -0.101522916613,   0.0016773573695,   -0.219744286741,    0.117614693472,     0.19719198978,  -0.0200653299106,   0.0205289631791,   -0.159680590878,  -0.0542353386335,   0.0368116727711,    0.163184776015,   0.0983395669841,   -0.117757194223,   0.0382250916158,  0.00470767408567,  -0.0704860429656,  -0.0311205051597,   0.0655741276872,  -0.0550960606608,   -0.165706695024,   -0.211564546816,    0.329618447397,   -0.182494449676,   -0.161133852325,    0.2242152251 [...]
+{    0.034237525964,   -0.121676501066,  0.00318961436603,   -0.218345398308,   0.0497294855428,    0.145244717758,  0.00608572780898,   0.0735030572135,  -0.0944026342596,   0.0330073998465,   0.0140226130537,   0.0798602280939, -0.00647723112122,    0.113060597064,   0.0402738830259,   0.0467640819135,  -0.0653007368219,  -0.0305962952337,   0.0825527183619,   -0.147215257661,  -0.0480460290092,   0.0665907211953,     0.11677417369, -0.00842762027843,   0.0477548437677,  -0.08431059705 [...]
+{    0.049760588602,   -0.104328513688,  0.00535473354898,   -0.131438769662,  -0.0478067551103,   0.0682305014546,   -0.117989127585,  0.00208050518149,   -0.009725099378,  -0.0847751461431, -0.00477238703029,    0.087346964269,  -0.0846039258054,    0.199279223135,   0.0248585380996,    0.120184671163,   -0.202234515228,  -0.0280006591763,   -0.195602186219,   -0.029185195044,   0.0239265871113,   0.0185055349715,   0.0983839318677,   0.0944931797335,    0.146000391416,   -0.1078078702 [...]
+{   0.0638618987954,   0.0554676422111,  -0.0179302309608,   -0.119052534339,   -0.147504497542,  -0.0158890761795,     0.01378497095,   -0.106664772315,   0.0426001080444,  -0.0558514391158,  -0.0200894470213,  -0.0687024651174,   0.0138036539305,  -0.0806073078137,   0.0833438121221,   0.0137184235124,   0.0804103292397,   0.0486322262881,  -0.0186022540782,   0.0129680713709,   0.0810812923939,   0.0669920236758,   0.0781500565131,  -0.0155416499082,   0.0178624831773,    0.0311825236 [...]
+{   0.0725104243493, -0.00109857722652,   0.0723260476604,   0.0446024165619,  -0.0484879832105,   0.0775664315422,  -0.0488123222283,  -0.0757646747606,  -0.0269455562271,     0.19175247044,   0.0402070002496,   0.0400804120137,   0.0511586200639,  -0.0521411964339,  -0.0354734038932,   0.0558791444674,   0.0555712391122,   0.0391407743534,  0.00466514754767,   0.0693415958284,   0.0132766030623,  -0.0437070948402,  0.00686060238792,  -0.0153179886765,   0.0349917446313,  -0.06455752459 [...]
+{   0.0579708162341,  -0.0896231913226,   0.0450273504521,  -0.0289299139978,  0.00429434765167,   0.0349376736723,     0.19604763256,   0.0571493596248,   0.0693512479229,   0.0737283052043,  0.00907278396458, -0.00878858312374,  0.00652798121729,   0.0417075068538,  -0.0737418961614,   -0.121102697584,    -0.12798286289,     -0.0461314916,    0.230324762335,  0.00792823194975, 0.000439874535524,    0.191074166023,   0.0194223760231,  -0.0281327819336,    0.121326499458,  -0.07555445469 [...]
+{   0.0591165906742,  -0.0437759995237,   0.0667010206571,  -0.0482186596834,   -0.143214442693,   0.0434085730898,  -0.0696327765849,   -0.100616982342,   0.0565577985098,  -0.0359677185909,   0.0208880999115,   0.0996974535778,     0.14316961914,  -0.0828712976498,  -0.0320009799615,   -0.182793608032,    -0.13540750953,   0.0487314355312,  -0.0381718589647,   -0.167157396792,    0.178129823344,   0.0247165258262,  -0.0467182862923,    0.105491134944,   0.0401559018326,  -0.01818528965 [...]
+{   0.0712694369137,  -0.0298390558804,   0.0629695332421,-2.11756143987e-05,  -0.0490810809564, -0.00338468004767,  -0.0948367135802,   -0.106904335063,   0.0229843964815,  0.00972519414438,   0.0101480674606,   0.0469986785727,  -0.0350826494832,   0.0668385710606,  -0.0397805903169,   0.0432061556937,  -0.0386271373016,   0.0907307330588,  -0.0487141205106,  -0.0200186493694,   0.0336745509179, -0.00651187539451,   -0.054202518216,   0.0300411251776,   0.0375051929975,   -0.0311332949 [...]
+{   0.0716146672777,  -0.0244229587934,    -0.07621410111,  -0.0311129369296,    -0.11645468511, -0.00282919760112,   0.0441394206833,   0.0809039747213, -0.00386825735691,  -0.0683824582847,  -0.0146204619379, -0.00701397927711,   -0.125674405781,   0.0462103527137,   0.0446947650893,  -0.0127517994179,  -0.0447928030419, -0.00133960900481,  -0.0720676314093,   0.0413509773554,   0.0114076168026,  -0.0730296504216,  -0.0289099899592,  -0.0792498831019, -0.00538448450043,  -0.03643375631 [...]
+{   0.0705533866055,  -0.0326444901945,    0.048785120955,   0.0642185291948, -0.00951530532931,   0.0219991762996,  -0.0844652492678,   -0.122787568103,  0.00078210944928,    0.158344656353,    0.040728821938,   0.0526007409146,    0.100395211941,  -0.0567996970865,   0.0263923399217,  -0.0314034901681,    0.038733022106,   0.0191646538837,  0.00631345764087,    0.118777130967,  -0.0655998615071,  -0.0814057773951,  -0.0192449673922,  -0.0446566580575,  -0.0438588492121,   0.01837807909 [...]
+{   0.0682065047895,   0.0374177012121,  -0.0533510953455,  -0.0895733961569,   -0.124972312376,   -0.022458962403,   0.0303611098012,  -0.0705936361653,   -0.058404626548,   0.0041009267184,  -0.0217620514011,  -0.0994806695567,   0.0330044187733,  -0.0548040876631,   0.0214494172894,   0.0593074566871,   0.0400352282811,   0.0508197955115,  -0.0458160192669,   0.0296607764121,   0.0720891621657,    0.113417033803,   0.0566476723377,  -0.0614499050753, -0.00336267933026,  0.004886452423 [...]
+{   0.0681684787722,    0.044405449617,-0.000661640633608, -0.00425770396439,   -0.081613146779,   0.0820443031218,   0.0920536921879,   0.0408992001626,   0.0794532138509,   -0.101214202257, -0.00841994669426,   0.0267877577046,  -0.0591074637844,-0.000303515349435,  -0.0610795518726,   0.0254735214541,  -0.0381962872027,   0.0268316461325,   -0.126027556332,    0.082450208971,  -0.0483099914829,  -0.0657705941912,   -0.065470247079,   -0.063835831355,   -0.171731673217,  0.002293045703 [...]
+{   0.0668854379806,  -0.0391603618486,  -0.0280990347934,  -0.0834348806423,   -0.199841712231,   0.0464661023693, -0.00126808840113,   0.0656155025138,   0.0490373919016,  0.00938447345094,  0.00359970368929,   0.0214397906477,   -0.143499588926,   0.0866048971373,   0.0342417598428,   0.0462337408446,  -0.0394680146459,  -0.0217132329347,  -0.0103594675171,   0.0209417657504,    0.113588013983,  -0.0227994295159,   0.0338194925894,   0.0281104565478,-6.25149490438e-05,  -0.02061057315 [...]
+{   0.0684315576098, -0.00737013791864,   0.0735330461355,   0.0415042611711,  -0.0425498646771,   0.0838231876392,   0.0883747335229,-0.000534751444392,   0.0354886697418,   0.0987863315362,  0.00728913243249,  -0.0453331744814,  -0.0666855952867,  -0.0305636820517,   0.0684332848119,   0.0306672861775, -0.00624597372058,  -0.0264739403014,   0.0591326456516,    0.153698749526,  0.00569987056625,   0.0333400208932,   0.0324025943493,    0.126450325538,   0.0959360623089,   -0.1423547729 [...]
+{  0.00957353034337,  -0.0582595413206,   0.0119581398111,   -0.181595848907,     0.10081362357,    0.208574210564,  -0.0339627720771,   -0.031728352235,   -0.249753192689,    -0.23226696614,   0.0715264753398,    0.422676720957,   0.0995802657465,   -0.306838633222,    0.127474351611,  -0.0288730623543,   -0.149344813956,   -0.276465659061,  -0.0434294401719,    0.235035039502,   0.0620686924585,    0.140800937788,   -0.235831099057,   0.0991195482664,   0.0574021243568,  -0.01542488594 [...]
+{   0.0613202661849,   0.0515829180637,    0.141849930234,  -0.0292094266856,  -0.0921953683453,   0.0257190257093,  -0.0264925255873,    0.100292921925,   0.0866569952846,  -0.0221320427436,   0.0264257641123,     0.10189053032,   0.0505779143688,   -0.140821812114,  -0.0333425185616,   0.0770267028057,   0.0405493736343,    0.188376474604,  -0.0222704181225,  -0.0364194237157,    0.111427565188,   0.0667021356422,  -0.0223585095213,   0.0501428500596,   -0.104220176456, -0.002644112939 [...]
+{   0.0672943320502,  -0.0236931287637,   0.0396808729255, 6.39904302977e-05,   -0.051857026015, 0.000565111400301,    0.162845763877,   0.0458236560318,   0.0545097958388,  -0.0181334641966,  0.00560459973999,   0.0266398077876,  -0.0828555418692,  -0.0236316889682,  -0.0391200946235,  -0.0418410806247,  -0.0486860830835,  -0.0533068698629,  -0.0107923045615,  0.00356464570943,   0.0739420759187,   -0.118843537793,    0.055623699337,    0.024775454098,   -0.177093978439,   -0.2676794613 [...]
+{   0.0681749992007,  -0.0537616959932,    -0.13011477182, -0.00492847421243,  -0.0519286871308,  -0.0314899805218,  -0.0457523765494,   0.0999592739954,  -0.0232552638519,   0.0084355889376, -0.00380655208967,  -0.0244637218119, -0.00716624090039,  -0.0253670531339,   0.0383443993499,   0.0495358681073,   0.0805176483011,   0.0556204669369,  -0.0590939666927,   0.0475460067643,  -0.0574414248553,  -0.0885203478426,  -0.0524276042548,  -0.0480801236514,   -0.143287210804,-0.0009210674820 [...]
+{   0.0605711838907,   0.0282796689336,    0.102809045295,  0.00432403365736,  -0.0838594351018,    0.146073761163,  -0.0169197287014,  -0.0836829305449,   0.0382243799809,   0.0781270638326,  0.00126343795108,  -0.0627657727475,   -0.033756101356,  -0.0794654957774,   0.0786038066052,    0.122326681423,   0.0213876382434,   0.0177127752775,  -0.0401783683795,  -0.0847968048258,  -0.0705722695262,  -0.0723845941084,    -0.14743907383,   0.0799388939074,   -0.104754889451,    0.1924940146 [...]
+{   0.0685376828351,   0.0266021472289,   0.0727031222782,   0.0339875379156,  -0.0511998148452,    0.146345584054,   0.0173129714073,  -0.0302200121999,   0.0717689241745,  0.00513191003018, -0.00677501283398,  -0.0344076583873,   -0.127855724246,  0.00759351698502,  0.00238580159073,   0.0756002379782,  -0.0791219535978, 0.000760916265223,  -0.0392360199976,   0.0548336257575, -0.00381773831281,   0.0060725963362,  -0.0393893094347,   0.0339485969734,  -0.0139895171573, -0.008845645397 [...]
+{   0.0678024046532,   0.0745091085057,   -0.122500255548,  -0.0743157356536,  -0.0171975337495,  -0.0686162964901,   0.0514070838355,  -0.0631279006105,  -0.0501580227935, -0.00257720501194, -0.00694185600078,   -0.018748725132,   0.0192648843474,   0.0432352223939,   0.0362172035527,   0.0442234173836,   0.0322412535828,   0.0302742223063,  -0.0226483488725,  0.00506405974467,  -0.0185402861212,   0.0477033302332,  0.00510837325756, -0.00990590641822,   0.0403480669249,   0.06771397583 [...]
+{   0.0638056478768,   0.0365270770975,    0.140023181087,  -0.0637501118814,  -0.0637982136705,   -0.107065835731,  -0.0290220405135,   0.0822073714337,  0.00694602177082,   0.0461508329347,   0.0266631359813,   0.0587962541952,   0.0634482435928,   -0.124544363387,  -0.0949418823311,    0.107424943545,  0.00174189726256,   0.0183252005496,   0.0388923878908,   -0.017691005417,   0.0571420740761,   -0.041090476283,   -0.020210168692,   -0.083404067303,   0.0146114292192,   0.05377458975 [...]
+{   0.0609641197576,    0.064742483408,   0.0299583495164,   -0.095470987462,  -0.0894358160524,  -0.0625329122563,  -0.0493360926648,  -0.0454518976507,    0.029971136096,  -0.0948921269041,  -0.0392863127466,   -0.132373490424,   0.0187976090773,  -0.0900357240346,   0.0485952888289,     -0.1984008819,   0.0540742445625,  -0.0974856904541,    0.034810928887,  -0.0457116139837,   -0.140103450214,  -0.0542212876147,   0.0512311386256,   -0.053174468118,    0.218756523134,  -0.07090781715 [...]
+{   0.0723653897438,  -0.0127217089708,  0.00618489840435,   0.0064998055453,  -0.0746660406153,   0.0111055541944,  -0.0923719953351,   -0.113104047735, -0.00374888184192, -0.00569744359008,   0.0106678497616,   0.0516199621343, -0.00681247970864,  0.00148157035204,  -0.0295849040144,  -0.0532471828669,  -0.0198904226588,    0.120101591335,    0.033818864737,  -0.0236376536149,     0.06599027559,  0.00344257043437,  -0.0255842007858,  -0.0701982154209, -0.00294906948544,    -0.158615658 [...]
+{   0.0718587995909,   0.0373031222626,   -0.141218588705,  -0.0306568256668,  -0.0513183807029,  -0.0234506647255,   0.0294327378761,  -0.0114246479262,   -0.116730037524, -0.00891958874297,  -0.0137739584946,  -0.0357958086883,  -0.0602978123079, -0.00235703193491, -0.00656716450556,   0.0148400881497,   0.0420952329898,   0.0564923542228,  -0.0613240117706,  -0.0176040036448,  -0.0302345377381,   0.0511048543617, -0.00185846355003,  -0.0639309113586,   0.0254766873636,   0.04746363528 [...]
+};
+
+scaled_diag_k = 
+
+{{     156.05926,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,           [...]
+{             0,      24.42682,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,     7.0911181,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,     5.8111524,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,     4.4564256,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,     2.7444752,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,     2.5226086,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,     2.1507764,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,     1.7844966,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,     1.4771867,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,     1.4415407,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,     1.4049928,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,      1.299393,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,     1.2456808,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,     1.1578161,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,     1.1066934,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,     1.0489475,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,     1.0358262,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,    0.94874312,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,    0.92039208,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,    0.90385433,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,     0.8894499,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,    0.87158788,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,    0.86073851,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,    0.84240908,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,    0.83966705,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,    0.82651301,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,    0.81217394,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,     0.8056651,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,    0.79801378,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,    0.79199189,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,    0.78740002,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,    0.77555 [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+{             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,             0,            [...]
+};
+
+points 		= Rows(scaled_diag_k);
+scaled_diag = {points, points};
+
+for (k = 0; k < points; k = k+1)
+{
+	scaled_diag[k][k] = scaled_diag_k[k][k];
+}
+
+fprintf (stdout, Max(kernel_mx2-kernel_mx1,0));
\ No newline at end of file
diff --git a/tests/hbltests/BayesianGraphicalModels/TestBGM.bf b/tests/hbltests/BayesianGraphicalModels/TestBGM.bf
new file mode 100644
index 0000000..222218d
--- /dev/null
+++ b/tests/hbltests/BayesianGraphicalModels/TestBGM.bf
@@ -0,0 +1,167 @@
+ncases = 500;
+
+fprintf (stdout, "\nTesting BayesianGraphicalModel discrete graph functionality\n\n");
+
+
+ExecuteAFile (HYPHY_LIB_DIRECTORY+"TemplateBatchFiles"+DIRECTORY_SEPARATOR+"bayesgraph.ibf");
+
+fprintf (stdout, "Loaded bayesgraph include file\n");
+
+
+/* import Bayesian network structure and parameters 
+	from XMLBIF (XML Bayesian Interchange Format)
+	as an associative list
+*/
+
+fprintf (stdout, "Import ALARM network from XMLBIF file...");
+
+import_xmlbif ("alarm.xml", "Alarm");
+
+if ( (Rows(Alarm))[0] == "Hypovolemia") {
+	fprintf (stdout, "[PASSED]\n");
+} else {
+	fprintf (stdout, "[FAILED]\n");
+}
+
+
+// adjacency matrix of network
+adjmat = list2adjmat(Alarm);
+
+
+
+/* this object contains all the info we need to simulate data */
+fprintf (stdout, "Simulate ", ncases, " cases from network object...");
+sim = simulate_data (Alarm, ncases);
+if (Rows(sim) == ncases) {
+	fprintf (stdout, "[PASSED]\n");
+} else {
+	fprintf (stdout, "[FAILED]\n");
+}
+
+
+/* keys of associative list are variable (node) names */
+names = Rows(Alarm);
+
+/* a Bayesian Graphical Model object in HyPhy is constructed with 
+	a single (associative list) argument
+*/
+nodes={};
+for (i = 0; i < Abs(Alarm); i=i+1)
+{
+	/* add_discrete_node (	node name, 
+							max. # parents, 
+							prior sample size, 
+							# levels) 
+	*/
+	nodes[Abs(nodes)] = add_discrete_node (names[i], 2, 0, (Alarm[names[i]])["Levels"]);
+}
+
+
+num_nodes = Abs(nodes);
+
+/* construct BGM */
+fprintf (stdout, "Create BGM object...\n");
+
+BayesianGraphicalModel alarm_bgm = (nodes);
+
+GetString (bgm_names_list, BayesianGraphicalModel, -1);	// returns names of all BGMs
+
+// THIS TEST IS BROKEN
+/*
+lLength = Rows(bgm_names_list) * Columns(bgm_names_list);
+for (_i = 0; _i < lLength; _i += 1) {
+	if (bgm_names_list[_i] == "alarm_bgm") {
+		fprintf (stdout, "[PASSED]\n");
+		break;
+	}
+}
+if (_i == lLength) {
+	fprintf (stdout, "[FAILED]\n");
+}
+*/
+
+/*
+	Assign data set to BGM.
+	attach_data ( 	BGM identifier,
+					data matrix,
+					Gibbs imputation #steps,
+					"		"		burnin,
+					"		"		#samples)
+ */
+ 
+fprintf (stdout, "Attaching data and caching node scores...");
+attach_data ("alarm_bgm", sim, 0, 0, 0);
+cache = get_node_score_cache("alarm_bgm");
+if (Abs(cache) == 111) {
+	fprintf (stdout, "[PASSED]\n");
+} else {
+	fprintf (stdout, "[FAILED]\n");
+}
+
+
+/* graph structural MCMC */
+fprintf (stdout, "RUNNING GRAPH-MCMC\n");
+
+result0 = graph_MCMC ("alarm_bgm", 100000, 100000, 100, 0);
+
+
+temp = check_edgelist (result0, adjmat, 0.8);
+fprintf (stdout, "\tTrue positives = ", temp[0], "\n");
+fprintf (stdout, "\tFalse negatives = ", temp[1], "\n");
+fprintf (stdout, "\tFalse positives = ", temp[2], "\n");
+fprintf (stdout, "\tTrue negatives = ", temp[3], "\n");
+
+sens = temp[0]/(temp[0]+temp[1]);
+spec = temp[3]/(temp[2]+temp[3]);
+
+fprintf (stdout, "\tSensitivity (TP/TP+FN) = ", sens, "\n");
+fprintf (stdout, "\tSpecificity (TN/TN+FP) = ", spec, "\n");
+
+fprintf (stdout, "Specificity > 75% and specificity > 90% for cutoff = 0.8 ... ");
+if (sens > 0.75 && spec > 0.9) {
+	fprintf (stdout, "[PASSED]\n");
+} else {
+	fprintf (stdout, "[FAILED]\n");
+}
+
+
+
+display_MCMC_chain (result0);
+write_edgelist("TestBGM.graphMCMC.edges", result0, num_nodes, 1);
+mcmc_graph_to_dotfile("TestBGM.graphMCMC.dot", 0.6, result0, nodes);
+
+
+
+/* node order permutation MCMC */
+
+fprintf (stdout, "RUNNING ORDER-MCMC\n");
+
+result1 = order_MCMC ("alarm_bgm", 10000, 10000, 100);
+
+temp = check_edgelist (result1, adjmat, 0.8);
+fprintf (stdout, "\tTrue positives = ", temp[0], "\n");
+fprintf (stdout, "\tFalse negatives = ", temp[1], "\n");
+fprintf (stdout, "\tFalse positives = ", temp[2], "\n");
+fprintf (stdout, "\tTrue negatives = ", temp[3], "\n");
+
+sens = temp[0]/(temp[0]+temp[1]);
+spec = temp[3]/(temp[2]+temp[3]);
+
+fprintf (stdout, "\tSensitivity (TP/TP+FN) = ", sens, "\n");
+fprintf (stdout, "\tSpecificity (TN/TN+FP) = ", spec, "\n");
+
+fprintf (stdout, "Specificity > 75% and specificity > 90% for cutoff = 0.8 ... ");
+if (sens > 0.75 && spec > 0.9) {
+	fprintf (stdout, "[PASSED]\n");
+} else {
+	fprintf (stdout, "[FAILED]\n");
+}
+
+
+write_edgelist("TestBGM.orderMCMC.edges", result1, num_nodes, 1);
+mcmc_graph_to_dotfile("TestBGM.orderMCMC.dot", 0.6, result1, nodes);
+
+
+
+
+
diff --git a/tests/hbltests/BayesianGraphicalModels/alarm.xml b/tests/hbltests/BayesianGraphicalModels/alarm.xml
new file mode 100644
index 0000000..e7512e1
--- /dev/null
+++ b/tests/hbltests/BayesianGraphicalModels/alarm.xml
@@ -0,0 +1,472 @@
+<?xml version="1.0"?>
+
+<!-- DTD for the XMLBIF 0.3 format -->
+<!DOCTYPE BIF [
+	<!ELEMENT BIF ( NETWORK )*>
+		<!ATTLIST BIF VERSION CDATA #REQUIRED>
+	<!ELEMENT NETWORK ( NAME, ( PROPERTY | VARIABLE | DEFINITION )* )>
+	<!ELEMENT NAME (#PCDATA)>
+	<!ELEMENT VARIABLE ( NAME, ( OUTCOME | PROPERTY )* ) >
+		<!ATTLIST VARIABLE TYPE (nature|decision|utility) "nature">
+	<!ELEMENT OUTCOME (#PCDATA)>
+	<!ELEMENT DEFINITION ( FOR | GIVEN | TABLE | PROPERTY )* >
+	<!ELEMENT FOR (#PCDATA)>
+	<!ELEMENT GIVEN (#PCDATA)>
+	<!ELEMENT TABLE (#PCDATA)>
+	<!ELEMENT PROPERTY (#PCDATA)>
+]>
+
+<BIF VERSION="0.3">
+	<NETWORK>
+	<NAME>bayesiannetwork</NAME>
+		<!-- Variables -->
+		<VARIABLE TYPE="nature">
+			<NAME>Hypovolemia</NAME>
+			<OUTCOME>True</OUTCOME>
+			<OUTCOME>False</OUTCOME>
+			<PROPERTY>position = (225, 321)</PROPERTY>
+		</VARIABLE>
+		<VARIABLE TYPE="nature">
+			<NAME>StrokeVolume</NAME>
+			<OUTCOME>Low</OUTCOME>
+			<OUTCOME>Normal</OUTCOME>
+			<OUTCOME>High</OUTCOME>
+			<PROPERTY>position = (333, 419)</PROPERTY>
+		</VARIABLE>
+		<VARIABLE TYPE="nature">
+			<NAME>LVFailure</NAME>
+			<OUTCOME>True</OUTCOME>
+			<OUTCOME>False</OUTCOME>
+			<PROPERTY>position = (222, 417)</PROPERTY>
+		</VARIABLE>
+		<VARIABLE TYPE="nature">
+			<NAME>LVEDVolume</NAME>
+			<OUTCOME>Low</OUTCOME>
+			<OUTCOME>Normal</OUTCOME>
+			<OUTCOME>High</OUTCOME>
+			<PROPERTY>position = (124, 417)</PROPERTY>
+		</VARIABLE>
+		<VARIABLE TYPE="nature">
+			<NAME>PCWP</NAME>
+			<OUTCOME>Low</OUTCOME>
+			<OUTCOME>Normal</OUTCOME>
+			<OUTCOME>High</OUTCOME>
+			<PROPERTY>position = (226, 488)</PROPERTY>
+		</VARIABLE>
+		<VARIABLE TYPE="nature">
+			<NAME>CVP</NAME>
+			<OUTCOME>Low</OUTCOME>
+			<OUTCOME>Normal</OUTCOME>
+			<OUTCOME>High</OUTCOME>
+			<PROPERTY>position = (123, 487)</PROPERTY>
+		</VARIABLE>
+		<VARIABLE TYPE="nature">
+			<NAME>History</NAME>
+			<OUTCOME>True</OUTCOME>
+			<OUTCOME>False</OUTCOME>
+			<PROPERTY>position = (334, 487)</PROPERTY>
+		</VARIABLE>
+		<VARIABLE TYPE="nature">
+			<NAME>MinVolSet</NAME>
+			<OUTCOME>Low</OUTCOME>
+			<OUTCOME>Normal</OUTCOME>
+			<OUTCOME>High</OUTCOME>
+			<PROPERTY>position = (1373, 154)</PROPERTY>
+		</VARIABLE>
+		<VARIABLE TYPE="nature">
+			<NAME>VentMach</NAME>
+			<OUTCOME>Zero</OUTCOME>
+			<OUTCOME>Low</OUTCOME>
+			<OUTCOME>Normal</OUTCOME>
+			<OUTCOME>High</OUTCOME>
+			<PROPERTY>position = (1374, 235)</PROPERTY>
+		</VARIABLE>
+		<VARIABLE TYPE="nature">
+			<NAME>Disconnect</NAME>
+			<OUTCOME>True</OUTCOME>
+			<OUTCOME>False</OUTCOME>
+			<PROPERTY>position = (1269, 339)</PROPERTY>
+		</VARIABLE>
+		<VARIABLE TYPE="nature">
+			<NAME>VentTube</NAME>
+			<OUTCOME>Zero</OUTCOME>
+			<OUTCOME>Low</OUTCOME>
+			<OUTCOME>Normal</OUTCOME>
+			<OUTCOME>High</OUTCOME>
+			<PROPERTY>position = (1269, 234)</PROPERTY>
+		</VARIABLE>
+		<VARIABLE TYPE="nature">
+			<NAME>KinkedTube</NAME>
+			<OUTCOME>True</OUTCOME>
+			<OUTCOME>False</OUTCOME>
+			<PROPERTY>position = (1185, 151)</PROPERTY>
+		</VARIABLE>
+		<VARIABLE TYPE="nature">
+			<NAME>Press</NAME>
+			<OUTCOME>Zero</OUTCOME>
+			<OUTCOME>Low</OUTCOME>
+			<OUTCOME>Normal</OUTCOME>
+			<OUTCOME>High</OUTCOME>
+			<PROPERTY>position = (1268, 75)</PROPERTY>
+		</VARIABLE>
+		<VARIABLE TYPE="nature">
+			<NAME>ErrLowOutput</NAME>
+			<OUTCOME>True</OUTCOME>
+			<OUTCOME>False</OUTCOME>
+			<PROPERTY>position = (541, 319)</PROPERTY>
+		</VARIABLE>
+		<VARIABLE TYPE="nature">
+			<NAME>HRBP</NAME>
+			<OUTCOME>Low</OUTCOME>
+			<OUTCOME>Normal</OUTCOME>
+			<OUTCOME>High</OUTCOME>
+			<PROPERTY>position = (541, 420)</PROPERTY>
+		</VARIABLE>
+		<VARIABLE TYPE="nature">
+			<NAME>ErrCauter</NAME>
+			<OUTCOME>True</OUTCOME>
+			<OUTCOME>False</OUTCOME>
+			<PROPERTY>position = (756, 492)</PROPERTY>
+		</VARIABLE>
+		<VARIABLE TYPE="nature">
+			<NAME>HREKG</NAME>
+			<OUTCOME>Low</OUTCOME>
+			<OUTCOME>Normal</OUTCOME>
+			<OUTCOME>High</OUTCOME>
+			<PROPERTY>position = (754, 418)</PROPERTY>
+		</VARIABLE>
+		<VARIABLE TYPE="nature">
+			<NAME>HRSat</NAME>
+			<OUTCOME>Low</OUTCOME>
+			<OUTCOME>Normal</OUTCOME>
+			<OUTCOME>High</OUTCOME>
+			<PROPERTY>position = (648, 415)</PROPERTY>
+		</VARIABLE>
+		<VARIABLE TYPE="nature">
+			<NAME>BP</NAME>
+			<OUTCOME>Low</OUTCOME>
+			<OUTCOME>Normal</OUTCOME>
+			<OUTCOME>High</OUTCOME>
+			<PROPERTY>position = (441, 225)</PROPERTY>
+		</VARIABLE>
+		<VARIABLE TYPE="nature">
+			<NAME>CO</NAME>
+			<OUTCOME>Low</OUTCOME>
+			<OUTCOME>Normal</OUTCOME>
+			<OUTCOME>High</OUTCOME>
+			<PROPERTY>position = (332, 225)</PROPERTY>
+		</VARIABLE>
+		<VARIABLE TYPE="nature">
+			<NAME>HR</NAME>
+			<OUTCOME>Low</OUTCOME>
+			<OUTCOME>Normal</OUTCOME>
+			<OUTCOME>High</OUTCOME>
+			<PROPERTY>position = (651, 314)</PROPERTY>
+		</VARIABLE>
+		<VARIABLE TYPE="nature">
+			<NAME>TPR</NAME>
+			<OUTCOME>Low</OUTCOME>
+			<OUTCOME>Normal</OUTCOME>
+			<OUTCOME>High</OUTCOME>
+			<PROPERTY>position = (544, 225)</PROPERTY>
+		</VARIABLE>
+		<VARIABLE TYPE="nature">
+			<NAME>Anaphylaxis</NAME>
+			<OUTCOME>True</OUTCOME>
+			<OUTCOME>False</OUTCOME>
+			<PROPERTY>position = (544, 147)</PROPERTY>
+		</VARIABLE>
+		<VARIABLE TYPE="nature">
+			<NAME>InsuffAnesth</NAME>
+			<OUTCOME>True</OUTCOME>
+			<OUTCOME>False</OUTCOME>
+			<PROPERTY>position = (650, 146)</PROPERTY>
+		</VARIABLE>
+		<VARIABLE TYPE="nature">
+			<NAME>PAP</NAME>
+			<OUTCOME>Low</OUTCOME>
+			<OUTCOME>Normal</OUTCOME>
+			<OUTCOME>High</OUTCOME>
+			<PROPERTY>position = (645, 75)</PROPERTY>
+		</VARIABLE>
+		<VARIABLE TYPE="nature">
+			<NAME>PulmEmbolus</NAME>
+			<OUTCOME>True</OUTCOME>
+			<OUTCOME>False</OUTCOME>
+			<PROPERTY>position = (758, 75)</PROPERTY>
+		</VARIABLE>
+		<VARIABLE TYPE="nature">
+			<NAME>FiO2</NAME>
+			<OUTCOME>Low</OUTCOME>
+			<OUTCOME>Normal</OUTCOME>
+			<PROPERTY>position = (872, 323)</PROPERTY>
+		</VARIABLE>
+		<VARIABLE TYPE="nature">
+			<NAME>Catechol</NAME>
+			<OUTCOME>Normal</OUTCOME>
+			<OUTCOME>High</OUTCOME>
+			<PROPERTY>position = (651, 224)</PROPERTY>
+		</VARIABLE>
+		<VARIABLE TYPE="nature">
+			<NAME>SaO2</NAME>
+			<OUTCOME>Low</OUTCOME>
+			<OUTCOME>Normal</OUTCOME>
+			<OUTCOME>High</OUTCOME>
+			<PROPERTY>position = (761, 224)</PROPERTY>
+		</VARIABLE>
+		<VARIABLE TYPE="nature">
+			<NAME>Shunt</NAME>
+			<OUTCOME>Normal</OUTCOME>
+			<OUTCOME>High</OUTCOME>
+			<PROPERTY>position = (761, 145)</PROPERTY>
+		</VARIABLE>
+		<VARIABLE TYPE="nature">
+			<NAME>PVSat</NAME>
+			<OUTCOME>Low</OUTCOME>
+			<OUTCOME>Normal</OUTCOME>
+			<OUTCOME>High</OUTCOME>
+			<PROPERTY>position = (873, 225)</PROPERTY>
+		</VARIABLE>
+		<VARIABLE TYPE="nature">
+			<NAME>MinVol</NAME>
+			<OUTCOME>Zero</OUTCOME>
+			<OUTCOME>Low</OUTCOME>
+			<OUTCOME>Normal</OUTCOME>
+			<OUTCOME>High</OUTCOME>
+			<PROPERTY>position = (1040, 152)</PROPERTY>
+		</VARIABLE>
+		<VARIABLE TYPE="nature">
+			<NAME>ExpCO2</NAME>
+			<OUTCOME>Zero</OUTCOME>
+			<OUTCOME>Low</OUTCOME>
+			<OUTCOME>Normal</OUTCOME>
+			<OUTCOME>High</OUTCOME>
+			<PROPERTY>position = (1097, 426)</PROPERTY>
+		</VARIABLE>
+		<VARIABLE TYPE="nature">
+			<NAME>ArtCO2</NAME>
+			<OUTCOME>Low</OUTCOME>
+			<OUTCOME>Normal</OUTCOME>
+			<OUTCOME>High</OUTCOME>
+			<PROPERTY>position = (989, 427)</PROPERTY>
+		</VARIABLE>
+		<VARIABLE TYPE="nature">
+			<NAME>VentAlv</NAME>
+			<OUTCOME>Zero</OUTCOME>
+			<OUTCOME>Low</OUTCOME>
+			<OUTCOME>Normal</OUTCOME>
+			<OUTCOME>High</OUTCOME>
+			<PROPERTY>position = (989, 228)</PROPERTY>
+		</VARIABLE>
+		<VARIABLE TYPE="nature">
+			<NAME>VentLung</NAME>
+			<OUTCOME>Zero</OUTCOME>
+			<OUTCOME>Low</OUTCOME>
+			<OUTCOME>Normal</OUTCOME>
+			<OUTCOME>High</OUTCOME>
+			<PROPERTY>position = (1097, 234)</PROPERTY>
+		</VARIABLE>
+		<VARIABLE TYPE="nature">
+			<NAME>Intubation</NAME>
+			<OUTCOME>Normal</OUTCOME>
+			<OUTCOME>Esophageal</OUTCOME>
+			<OUTCOME>OneSided</OUTCOME>
+			<PROPERTY>position = (1039, 75)</PROPERTY>
+		</VARIABLE>
+		<!-- Probability Distributions -->
+		<DEFINITION>
+			<FOR>Hypovolemia</FOR>
+			<TABLE>0.2 0.8 </TABLE>
+		</DEFINITION>
+		<DEFINITION>
+			<FOR>StrokeVolume</FOR>
+			<GIVEN>LVFailure</GIVEN>
+			<GIVEN>Hypovolemia</GIVEN>
+			<TABLE>0.98 0.5 0.95 0.05 0.01 0.49 0.04 0.9 0.01 0.01 0.01 0.05 </TABLE>
+		</DEFINITION>
+		<DEFINITION>
+			<FOR>LVFailure</FOR>
+			<TABLE>0.05 0.95 </TABLE>
+		</DEFINITION>
+		<DEFINITION>
+			<FOR>LVEDVolume</FOR>
+			<GIVEN>Hypovolemia</GIVEN>
+			<GIVEN>LVFailure</GIVEN>
+			<TABLE>0.95 0.98 0.01 0.05 0.04 0.01 0.09 0.9 0.01 0.01 0.9 0.05 </TABLE>
+		</DEFINITION>
+		<DEFINITION>
+			<FOR>PCWP</FOR>
+			<GIVEN>LVEDVolume</GIVEN>
+			<TABLE>0.95 0.04 0.01 0.04 0.95 0.04 0.01 0.01 0.95 </TABLE>
+		</DEFINITION>
+		<DEFINITION>
+			<FOR>CVP</FOR>
+			<GIVEN>LVEDVolume</GIVEN>
+			<TABLE>0.95 0.04 0.01 0.04 0.95 0.29 0.01 0.01 0.7 </TABLE>
+		</DEFINITION>
+		<DEFINITION>
+			<FOR>History</FOR>
+			<GIVEN>LVFailure</GIVEN>
+			<TABLE>0.9 0.01 0.1 0.99 </TABLE>
+		</DEFINITION>
+		<DEFINITION>
+			<FOR>MinVolSet</FOR>
+			<TABLE>0.01 0.98 0.01 </TABLE>
+		</DEFINITION>
+		<DEFINITION>
+			<FOR>VentMach</FOR>
+			<GIVEN>MinVolSet</GIVEN>
+			<TABLE>0.01 0.01 0.01 0.97 0.01 0.01 0.01 0.97 0.01 0.01 0.01 0.97 </TABLE>
+		</DEFINITION>
+		<DEFINITION>
+			<FOR>Disconnect</FOR>
+			<TABLE>0.05 0.95 </TABLE>
+		</DEFINITION>
+		<DEFINITION>
+			<FOR>VentTube</FOR>
+			<GIVEN>VentMach</GIVEN>
+			<GIVEN>Disconnect</GIVEN>
+			<TABLE>0.97 0.97 0.97 0.01 0.97 0.01 0.97 0.01 0.01 0.01 0.01 0.97 0.01 0.01 0.01 0.01 0.01 0.01 0.01 0.01 0.01 0.97 0.01 0.01 0.01 0.01 0.01 0.01 0.01 0.01 0.01 0.97 </TABLE>
+		</DEFINITION>
+		<DEFINITION>
+			<FOR>KinkedTube</FOR>
+			<TABLE>0.04 0.96 </TABLE>
+		</DEFINITION>
+		<DEFINITION>
+			<FOR>Press</FOR>
+			<GIVEN>KinkedTube</GIVEN>
+			<GIVEN>Intubation</GIVEN>
+			<GIVEN>VentTube</GIVEN>
+			<TABLE>0.97 0.01 0.01 0.01 0.97 0.1 0.05 0.01 0.97 0.01 0.01 0.01 0.97 0.01 0.01 0.01 0.97 0.4 0.2 0.2 0.97 0.01 0.01 0.01 0.01 0.49 0.01 0.01 0.01 0.84 0.25 0.15 0.01 0.29 0.01 0.01 0.01 0.97 0.01 0.01 0.01 0.58 0.75 0.7 0.01 0.9 0.01 0.01 0.01 0.3 0.08 0.01 0.01 0.05 0.25 0.25 0.01 0.3 0.08 0.01 0.01 0.01 0.97 0.01 0.01 0.01 0.04 0.09 0.01 0.08 0.38 0.01 0.01 0.2 0.9 0.97 0.01 0.01 0.45 0.59 0.01 0.4 0.9 0.97 0.01 0.01 0.01 0.97 0.01 0.01 0.01 0.01 0.01 0.01 0.6 0.97 </TABLE>
+		</DEFINITION>
+		<DEFINITION>
+			<FOR>ErrLowOutput</FOR>
+			<TABLE>0.05 0.95 </TABLE>
+		</DEFINITION>
+		<DEFINITION>
+			<FOR>HRBP</FOR>
+			<GIVEN>ErrLowOutput</GIVEN>
+			<GIVEN>HR</GIVEN>
+			<TABLE>0.98 0.4 0.3 0.98 0.01 0.01 0.01 0.59 0.4 0.01 0.98 0.01 0.01 0.01 0.3 0.01 0.01 0.98 </TABLE>
+		</DEFINITION>
+		<DEFINITION>
+			<FOR>ErrCauter</FOR>
+			<TABLE>0.1 0.9 </TABLE>
+		</DEFINITION>
+		<DEFINITION>
+			<FOR>HREKG</FOR>
+			<GIVEN>HR</GIVEN>
+			<GIVEN>ErrCauter</GIVEN>
+			<TABLE>0.333333 0.98 0.333333 0.01 0.333333 0.01 0.333333 0.01 0.333333 0.98 0.333333 0.01 0.333333 0.01 0.333333 0.01 0.333333 0.98 </TABLE>
+		</DEFINITION>
+		<DEFINITION>
+			<FOR>HRSat</FOR>
+			<GIVEN>HR</GIVEN>
+			<GIVEN>ErrCauter</GIVEN>
+			<TABLE>0.333333 0.98 0.333333 0.01 0.333333 0.01 0.333333 0.01 0.333333 0.98 0.333333 0.01 0.333333 0.01 0.333333 0.01 0.333333 0.98 </TABLE>
+		</DEFINITION>
+		<DEFINITION>
+			<FOR>BP</FOR>
+			<GIVEN>CO</GIVEN>
+			<GIVEN>TPR</GIVEN>
+			<TABLE>0.98 0.98 0.3 0.98 0.1 0.05 0.9 0.05 0.01 0.01 0.01 0.6 0.01 0.85 0.4 0.09 0.2 0.09 0.01 0.01 0.1 0.01 0.05 0.55 0.01 0.75 0.9 </TABLE>
+		</DEFINITION>
+		<DEFINITION>
+			<FOR>CO</FOR>
+			<GIVEN>HR</GIVEN>
+			<GIVEN>StrokeVolume</GIVEN>
+			<TABLE>0.98 0.95 0.3 0.95 0.04 0.01 0.8 0.01 0.01 0.01 0.04 0.69 0.04 0.95 0.3 0.19 0.04 0.01 0.01 0.01 0.01 0.01 0.01 0.69 0.01 0.95 0.98 </TABLE>
+		</DEFINITION>
+		<DEFINITION>
+			<FOR>HR</FOR>
+			<GIVEN>Catechol</GIVEN>
+			<TABLE>0.1 0.01 0.89 0.09 0.01 0.9 </TABLE>
+		</DEFINITION>
+		<DEFINITION>
+			<FOR>TPR</FOR>
+			<GIVEN>Anaphylaxis</GIVEN>
+			<TABLE>0.98 0.3 0.01 0.4 0.01 0.3 </TABLE>
+		</DEFINITION>
+		<DEFINITION>
+			<FOR>Anaphylaxis</FOR>
+			<TABLE>0.01 0.99 </TABLE>
+		</DEFINITION>
+		<DEFINITION>
+			<FOR>InsuffAnesth</FOR>
+			<TABLE>0.2 0.8 </TABLE>
+		</DEFINITION>
+		<DEFINITION>
+			<FOR>PAP</FOR>
+			<GIVEN>PulmEmbolus</GIVEN>
+			<TABLE>0.01 0.05 0.19 0.9 0.8 0.05 </TABLE>
+		</DEFINITION>
+		<DEFINITION>
+			<FOR>PulmEmbolus</FOR>
+			<TABLE>0.01 0.99 </TABLE>
+		</DEFINITION>
+		<DEFINITION>
+			<FOR>FiO2</FOR>
+			<TABLE>0.01 0.99 </TABLE>
+		</DEFINITION>
+		<DEFINITION>
+			<FOR>Catechol</FOR>
+			<GIVEN>InsuffAnesth</GIVEN>
+			<GIVEN>SaO2</GIVEN>
+			<GIVEN>TPR</GIVEN>
+			<GIVEN>ArtCO2</GIVEN>
+			<TABLE>0.01 0.01 0.01 0.01 0.01 0.01 0.01 0.01 0.01 0.01 0.01 0.01 0.01 0.01 0.01 0.05 0.05 0.01 0.01 0.01 0.01 0.05 0.05 0.01 0.05 0.05 0.01 0.05 0.05 0.01 0.05 0.05 0.01 0.05 0.05 0.01 0.1 0.1 0.1 0.95 0.95 0.3 0.95 0.95 0.3 0.95 0.95 0.3 0.99 0.99 0.99 0.95 0.99 0.3 0.99 0.99 0.99 0.99 0.99 0.99 0.99 0.99 0.99 0.99 0.99 0.99 0.99 0.99 0.99 0.95 0.95 0.99 0.99 0.99 0.99 0.95 0.95 0.99 0.95 0.95 0.99 0.95 0.95 0.99 0.95 0.95 0.99 0.95 0.95 0.99 0.9 0.9 0.9 0.05 0.05 0.7 0.05 0.05 0.7 [...]
+		</DEFINITION>
+		<DEFINITION>
+			<FOR>SaO2</FOR>
+			<GIVEN>Shunt</GIVEN>
+			<GIVEN>PVSat</GIVEN>
+			<TABLE>0.98 0.01 0.01 0.98 0.98 0.69 0.01 0.98 0.01 0.01 0.01 0.3 0.01 0.01 0.98 0.01 0.01 0.01 </TABLE>
+		</DEFINITION>
+		<DEFINITION>
+			<FOR>Shunt</FOR>
+			<GIVEN>PulmEmbolus</GIVEN>
+			<GIVEN>Intubation</GIVEN>
+			<TABLE>0.1 0.1 0.01 0.95 0.95 0.05 0.9 0.9 0.99 0.05 0.05 0.95 </TABLE>
+		</DEFINITION>
+		<DEFINITION>
+			<FOR>PVSat</FOR>
+			<GIVEN>VentAlv</GIVEN>
+			<GIVEN>FiO2</GIVEN>
+			<TABLE>0.98 0.98 0.98 0.98 0.95 0.01 0.95 0.01 0.01 0.01 0.01 0.01 0.04 0.95 0.04 0.01 0.01 0.01 0.01 0.01 0.01 0.04 0.01 0.98 </TABLE>
+		</DEFINITION>
+		<DEFINITION>
+			<FOR>MinVol</FOR>
+			<GIVEN>VentLung</GIVEN>
+			<GIVEN>Intubation</GIVEN>
+			<TABLE>0.97 0.97 0.97 0.01 0.6 0.01 0.01 0.5 0.01 0.01 0.5 0.01 0.01 0.01 0.01 0.97 0.38 0.97 0.01 0.48 0.01 0.01 0.48 0.01 0.01 0.01 0.01 0.01 0.01 0.01 0.97 0.01 0.97 0.01 0.01 0.01 0.01 0.01 0.01 0.01 0.01 0.01 0.01 0.01 0.01 0.97 0.01 0.97 </TABLE>
+		</DEFINITION>
+		<DEFINITION>
+			<FOR>ExpCO2</FOR>
+			<GIVEN>ArtCO2</GIVEN>
+			<GIVEN>VentLung</GIVEN>
+			<TABLE>0.97 0.01 0.01 0.01 0.97 0.01 0.01 0.01 0.97 0.01 0.01 0.01 0.01 0.97 0.97 0.97 0.01 0.01 0.01 0.01 0.01 0.01 0.01 0.01 0.01 0.01 0.01 0.01 0.01 0.97 0.97 0.97 0.01 0.01 0.01 0.01 0.01 0.01 0.01 0.01 0.01 0.01 0.01 0.01 0.01 0.97 0.97 0.97 </TABLE>
+		</DEFINITION>
+		<DEFINITION>
+			<FOR>ArtCO2</FOR>
+			<GIVEN>VentAlv</GIVEN>
+			<TABLE>0.01 0.01 0.04 0.9 0.01 0.01 0.92 0.09 0.98 0.98 0.04 0.01 </TABLE>
+		</DEFINITION>
+		<DEFINITION>
+			<FOR>VentAlv</FOR>
+			<GIVEN>Intubation</GIVEN>
+			<GIVEN>VentLung</GIVEN>
+			<TABLE>0.97 0.01 0.01 0.01 0.97 0.01 0.01 0.01 0.97 0.03 0.01 0.01 0.01 0.97 0.01 0.01 0.01 0.97 0.01 0.01 0.01 0.95 0.94 0.88 0.01 0.01 0.97 0.01 0.01 0.01 0.97 0.01 0.01 0.01 0.04 0.1 0.01 0.01 0.01 0.97 0.01 0.01 0.01 0.97 0.01 0.01 0.01 0.01 </TABLE>
+		</DEFINITION>
+		<DEFINITION>
+			<FOR>VentLung</FOR>
+			<GIVEN>KinkedTube</GIVEN>
+			<GIVEN>VentTube</GIVEN>
+			<GIVEN>Intubation</GIVEN>
+			<TABLE>0.97 0.97 0.97 0.95 0.97 0.95 0.4 0.97 0.5 0.3 0.97 0.3 0.97 0.97 0.97 0.01 0.97 0.01 0.01 0.97 0.01 0.01 0.97 0.01 0.01 0.01 0.01 0.03 0.01 0.03 0.58 0.01 0.48 0.68 0.01 0.68 0.01 0.01 0.01 0.97 0.01 0.97 0.01 0.01 0.01 0.01 0.01 0.01 0.01 0.01 0.01 0.01 0.01 0.01 0.01 0.01 0.01 0.01 0.01 0.01 0.01 0.01 0.01 0.01 0.01 0.01 0.97 0.01 0.97 0.01 0.01 0.01 0.01 0.01 0.01 0.01 0.01 0.01 0.01 0.01 0.01 0.01 0.01 0.01 0.01 0.01 0.01 0.01 0.01 0.01 0.01 0.01 0.01 0.97 0.01 0.97 </TABLE>
+		</DEFINITION>
+		<DEFINITION>
+			<FOR>Intubation</FOR>
+			<TABLE>0.92 0.03 0.05 </TABLE>
+		</DEFINITION>
+	</NETWORK>
+</BIF>
diff --git a/tests/hbltests/HMM/RateHMM.bf b/tests/hbltests/HMM/RateHMM.bf
new file mode 100644
index 0000000..23edb54
--- /dev/null
+++ b/tests/hbltests/HMM/RateHMM.bf
@@ -0,0 +1,89 @@
+fprintf (stdout, "\nRunning an HKY+gamma model fit on a simulated alignment with 8 sequences and 1320 nucleotides with 4 blocks of contiguous rates (HMM test case)\n");
+
+OPTIMIZE_SUMMATION_ORDER = 1;
+
+timer = Time (1);
+
+global SmallCodon_part_Shared_TVTS=1;
+global SmallCodon_part_Shape=0.5;
+SmallCodon_part_Shape:>0.01;
+SmallCodon_part_Shape:<100;
+SmallCodon_part_Categ.weights={
+{              0.25}
+{              0.25}
+{              0.25}
+{              0.25}
+}
+;
+
+global						   lambda = 0.1;
+lambda :< 1/3;
+
+HMM_transition_matrix 		   = {{1-3*lambda,lambda,lambda,lambda}
+								  {lambda,1-3*lambda,lambda,lambda}
+								  {lambda,lambda,1-3*lambda,lambda}
+								  {lambda,lambda,lambda,1-3*lambda}};
+								  
+HMM_starting_frequencies	   = {{0.25,0.25,0.25,0.25}};	
+Model	HMM_model			   = (HMM_transition_matrix,HMM_starting_frequencies,0);
+ 
+
+category SmallCodon_part_Categ =(4,SmallCodon_part_Categ.weights,MEAN,
+								  GammaDist(_x_,SmallCodon_part_Shape,SmallCodon_part_Shape),
+								  CGammaDist(_x_,SmallCodon_part_Shape,SmallCodon_part_Shape),0,1e+25,
+								  CGammaDist(_x_,SmallCodon_part_Shape+1,SmallCodon_part_Shape),
+								  HMM_model);
+								  
+SmallCodon_part_HKY85={4,4};
+SmallCodon_part_HKY85[0][1]:=t*SmallCodon_part_Shared_TVTS*SmallCodon_part_Categ;
+SmallCodon_part_HKY85[0][2]:=t*SmallCodon_part_Categ;
+SmallCodon_part_HKY85[0][3]:=t*SmallCodon_part_Shared_TVTS*SmallCodon_part_Categ;
+SmallCodon_part_HKY85[1][0]:=t*SmallCodon_part_Shared_TVTS*SmallCodon_part_Categ;
+SmallCodon_part_HKY85[1][2]:=t*SmallCodon_part_Shared_TVTS*SmallCodon_part_Categ;
+SmallCodon_part_HKY85[1][3]:=t*SmallCodon_part_Categ;
+SmallCodon_part_HKY85[2][0]:=t*SmallCodon_part_Categ;
+SmallCodon_part_HKY85[2][1]:=t*SmallCodon_part_Shared_TVTS*SmallCodon_part_Categ;
+SmallCodon_part_HKY85[2][3]:=t*SmallCodon_part_Shared_TVTS*SmallCodon_part_Categ;
+SmallCodon_part_HKY85[3][0]:=t*SmallCodon_part_Shared_TVTS*SmallCodon_part_Categ;
+SmallCodon_part_HKY85[3][1]:=t*SmallCodon_part_Categ;
+SmallCodon_part_HKY85[3][2]:=t*SmallCodon_part_Shared_TVTS*SmallCodon_part_Categ;
+
+
+DataSet 	  SmallCodon 	  = ReadDataFile	("../data/HMM4_synthetic.fas");
+DataSetFilter SmallCodon_part = CreateFilter	(SmallCodon,1,"","4,5,7,6,1,0,2,3");
+
+HarvestFrequencies 								(SmallCodon_part_Freqs,SmallCodon_part,1,1,1);
+Model SmallCodon_part_HKY85_model	=			(SmallCodon_part_HKY85,SmallCodon_part_Freqs);
+Tree SmallCodon_tree				=			((((D_CD_83_ELI_ACC_K03454,D_CD_83_NDK_ACC_M27323)Node3,D_UG_94_94UG114_ACC_U88824)Node2,D_CD_84_84ZR085_ACC_U88822)Node1,B_US_83_RF_ACC_M17451,((B_FR_83_HXB2_ACC_K03455,B_US_86_JRFL_ACC_U63632)Node10,B_US_90_WEAU160_ACC_U21135)Node9);
+LikelihoodFunction SmallCodon_LF 	= 			(SmallCodon_part,SmallCodon_tree);
+
+Optimize(res_SmallCodon_LF,SmallCodon_LF);
+
+timer2 								= Time (1);
+expectedLL 							= -3243.9885;
+diffLL	   							= Abs(expectedLL - res_SmallCodon_LF[1][0]);
+fprintf 							(stdout, SmallCodon_LF, "\nTest optimization took ", timer2-timer, " seconds.\n", diffLL , " difference between obtained and expected likelihood\n\n");
+
+ConstructCategoryMatrix				(mx, SmallCodon_LF, SHORT);
+/* this stores the Viterbi path in mx */
+
+expected = {"0":{{200,3,1}},"1":{{681,1,0}},"2":{{823,0,2}}};
+
+switches = 0;
+
+for (k    = 1; k < Columns (mx); k = k+1)
+{
+	if (mx[k] != mx[k-1])
+	{
+		fprintf (stdout, "Switch from ", mx[k-1], " to ", mx[k], " at site ", k, "\n");
+		expectedS = expected[switches];
+		if (expectedS[0] != k || expectedS[1] != mx[k-1] || expectedS[2] != mx[k])
+		{
+			fprintf (stdout, "Test FAILED: expected  a switch from ", expectedS[1], " to ", expectedS[2], " at site ", expectedS[0], "\n");
+			return 1;
+		}
+		switches = switches + 1;
+	}
+}
+
+return 0;
diff --git a/tests/hbltests/HMM/SmallNuc.bf b/tests/hbltests/HMM/SmallNuc.bf
new file mode 100644
index 0000000..1301029
--- /dev/null
+++ b/tests/hbltests/HMM/SmallNuc.bf
@@ -0,0 +1,123 @@
+#NEXUS
+
+BEGIN TAXA;
+	DIMENSIONS NTAX = 8;
+	TAXLABELS
+		'B_FR_83_HXB2_ACC_K03455' 'B_US_83_RF_ACC_M17451' 'B_US_86_JRFL_ACC_U63632' 'B_US_90_WEAU160_ACC_U21135' 'D_CD_83_ELI_ACC_K03454' 'D_CD_83_NDK_ACC_M27323' 'D_CD_84_84ZR085_ACC_U88822' 'D_UG_94_94UG114_ACC_U88824' ;
+END;
+
+BEGIN CHARACTERS;
+	DIMENSIONS NCHAR = 1320;
+	FORMAT
+		DATATYPE = DNA
+		GAP=-
+		MISSING=?
+	;
+
+MATRIX
+	'B_FR_83_HXB2_ACC_K03455'     CCCATTAGCCCTATTGAGACTGTACCAGTAAAATTAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAATAAAAGCATTAGTAGAAATTTGTACAGAGATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAAGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGATGGAA [...]
+	'B_US_83_RF_ACC_M17451'       CCCATTAGTCCTATTGAAACTGTACCAGTAAAATTAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAGGAAAAAATAAAAGCATTGGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCCAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAGTTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAGAAATCAGTAACAGTATTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATAAAGAGTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAAACACCACGGATTAGATATCAGTACAATGTGCTTCCACAAGGGTGGAA [...]
+	'B_US_86_JRFL_ACC_U63632'     CCCATTAGTCCTATTGAAACTGTACCAGTAAAATTAAAGCCAGGAATGGATGGCCCAAAAGTCAAACAATGGCCATTGACAGAAGAAAAAATAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAGAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATAAAGACTTCAGGAAATATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGGTATCAGTACAATGTGCTTCCGCAGGGATGGAA [...]
+	'B_US_90_WEAU160_ACC_U21135'  CCCATTAGTCCTATTGAAACTGTACCAGTAAAATTAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAGAAAATAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTTCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTACCCTTAGATGAAGACTTCAGGAAGTACACTGCATTTACCATACCTAGTATAAACAATGAAACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGATGGAA [...]
+	'D_CD_83_ELI_ACC_K03454'      CCAATTAGTCCTATTGAAACTGTACCAGTAAAATTAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAATAAAAGCATTAACAGAAATTTGTACAGATATGGAAAAGGAAGGAAAAATTTCAAGAATTGGGCCTGAAAATCCATACAATACTCCAATATTTGCCATAAAGAAAAAAGACAGTACCAAGTGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGATTTCTGGGAAGTTCAATTAGGAATACCGCATCCTGCAGGGCTGAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAAGATTTTAGGAAATATACCGCCTTTACCATATCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGATGGAA [...]
+	'D_CD_83_NDK_ACC_M27323'      CCAATTAGTCCTATTGAAACTGTACCAGTAAAATTAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAATAAAAGCATTAACAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAGAATTGGGCCTGAAAATCCATATAATACTCCAATATTTGCCATAAAGAAAAAAGACAGTACCAAGTGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGATTTCTGGGAGGTTCAATTAGGAATACCGCATCCTGCAGGGCTGAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATGAAGATTTTAGGAAATATACCGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTCCCACAGGGATGGAA [...]
+	'D_CD_84_84ZR085_ACC_U88822'  CCAATTAGTCCTATTGAAACTGTACCAGTAAAATTAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCGTTGACAGAAGAAAAAATAAAAGCATTAACAGAAATTTGTACAGATATGGAAAAGGAAGGAAAAATTTCAAGAATTGGGCCTGAAAATCCATACAATACTCCAATATTTGCCATAAAGAAAAAAGACAGTACTAAGTGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGGATACCACATCCTGCAGGATTAAAGAAGAAAAAGTCAATAACAGTACTGGATGTGGGCGATGCATATTTTTCAATTCCCTTATGTGAAGACTTTAGGAAGTACACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTACTTCCACAGGGATGGAA [...]
+	'D_UG_94_94UG114_ACC_U88824'  CCAATTAGTCCTATTGAAACTGTACCAGTAAAATTAAAGCCAGGGATGGATGGCCCAAAAGTTAAACAATGGCCGTTGACAGAAGAAAAAATAAAAGCACTAATAGAAATTTGTTCAGAACTAGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAACCCATACAATACTCCAATATTTGCCATAAAGAAAAAAGACAGTACTAAGTGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTTTGGGAAGTTCAACTAGGAATACCACATCCTGCAGGGCTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGACGCATATTTTTCAGTTCCCTTACATGAAGACTTTAGAAAATATACCGCATTCACCATACCTAGTACAAACAATGAGACACCAGGAATTAGATATCAGTACAATGTGCTTCCACAAGGATGGAA [...]
+END;
+
+BEGIN TREES;
+	TREE tree = ((((D_CD_83_ELI_ACC_K03454,D_CD_83_NDK_ACC_M27323),D_UG_94_94UG114_ACC_U88824),D_CD_84_84ZR085_ACC_U88822),B_US_83_RF_ACC_M17451,((B_FR_83_HXB2_ACC_K03455,B_US_86_JRFL_ACC_U63632),B_US_90_WEAU160_ACC_U21135));
+END;
+
+BEGIN HYPHY;
+
+fprintf (stdout, "\nRunning an HKY+gamma model fit on an HIV-1 RT (p51) alignment with 8 sequences and 1320 nucleotides\n");
+
+OPTIMIZE_SUMMATION_ORDER = 1;
+
+timer = Time (1);
+
+global SmallCodon_part_Shared_TVTS=1;
+global SmallCodon_part_Shape=0.5;
+SmallCodon_part_Shape:>0.01;
+SmallCodon_part_Shape:<100;
+SmallCodon_part_Categ.weights={
+{              0.25}
+{              0.25}
+{              0.25}
+{              0.25}
+}
+;
+
+global						   lambda = 0.025;
+lambda :< 1;
+
+HMM_transition_matrix 		   = {{*,lambda,lambda,lambda}
+								  {lambda,*,lambda,lambda}
+								  {lambda,lambda,*,lambda}
+								  {lambda,lambda,lambda,*}};
+								  
+HMM_starting_frequencies	   = {{0.25,0.25,0.25,0.25}};	
+Model	HMM_model			   = (HMM_transition_matrix,HMM_starting_frequencies,0);
+ 
+
+category SmallCodon_part_Categ =(4,SmallCodon_part_Categ.weights,MEAN,
+								  GammaDist(_x_,SmallCodon_part_Shape,SmallCodon_part_Shape),
+								  CGammaDist(_x_,SmallCodon_part_Shape,SmallCodon_part_Shape),0,1e+25,
+								  CGammaDist(_x_,SmallCodon_part_Shape+1,SmallCodon_part_Shape),
+								  HMM_model);
+								  
+SmallCodon_part_HKY85={4,4};
+SmallCodon_part_HKY85[0][1]:=t*SmallCodon_part_Shared_TVTS*SmallCodon_part_Categ;
+SmallCodon_part_HKY85[0][2]:=t*SmallCodon_part_Categ;
+SmallCodon_part_HKY85[0][3]:=t*SmallCodon_part_Shared_TVTS*SmallCodon_part_Categ;
+SmallCodon_part_HKY85[1][0]:=t*SmallCodon_part_Shared_TVTS*SmallCodon_part_Categ;
+SmallCodon_part_HKY85[1][2]:=t*SmallCodon_part_Shared_TVTS*SmallCodon_part_Categ;
+SmallCodon_part_HKY85[1][3]:=t*SmallCodon_part_Categ;
+SmallCodon_part_HKY85[2][0]:=t*SmallCodon_part_Categ;
+SmallCodon_part_HKY85[2][1]:=t*SmallCodon_part_Shared_TVTS*SmallCodon_part_Categ;
+SmallCodon_part_HKY85[2][3]:=t*SmallCodon_part_Shared_TVTS*SmallCodon_part_Categ;
+SmallCodon_part_HKY85[3][0]:=t*SmallCodon_part_Shared_TVTS*SmallCodon_part_Categ;
+SmallCodon_part_HKY85[3][1]:=t*SmallCodon_part_Categ;
+SmallCodon_part_HKY85[3][2]:=t*SmallCodon_part_Shared_TVTS*SmallCodon_part_Categ;
+
+SmallCodon_part_Freqs={
+{    0.404450757576}
+{    0.166287878788}
+{    0.209564393939}
+{    0.219696969697}
+}
+
+;
+Model SmallCodon_part_HKY85_model=(SmallCodon_part_HKY85,SmallCodon_part_Freqs);
+
+UseModel (SmallCodon_part_HKY85_model);
+Tree SmallCodon_tree=((((D_CD_83_ELI_ACC_K03454,D_CD_83_NDK_ACC_M27323)Node3,D_UG_94_94UG114_ACC_U88824)Node2,D_CD_84_84ZR085_ACC_U88822)Node1,B_US_83_RF_ACC_M17451,((B_FR_83_HXB2_ACC_K03455,B_US_86_JRFL_ACC_U63632)Node10,B_US_90_WEAU160_ACC_U21135)Node9);
+
+SmallCodon_tree.Node2.t=0;
+SmallCodon_tree.D_CD_83_ELI_ACC_K03454.t=0;
+SmallCodon_tree.D_UG_94_94UG114_ACC_U88824.t=0;
+SmallCodon_tree.Node1.t=0;
+SmallCodon_tree.D_CD_84_84ZR085_ACC_U88822.t=0;
+SmallCodon_tree.D_CD_83_NDK_ACC_M27323.t=0;
+SmallCodon_tree.Node3.t=0;
+SmallCodon_tree.B_US_83_RF_ACC_M17451.t=0;
+SmallCodon_tree.B_FR_83_HXB2_ACC_K03455.t=0;
+SmallCodon_tree.B_US_86_JRFL_ACC_U63632.t=0;
+SmallCodon_tree.Node10.t=0;
+SmallCodon_tree.B_US_90_WEAU160_ACC_U21135.t=0;
+SmallCodon_tree.Node9.t=0;
+DataSet SmallCodon = ReadDataFile(USE_NEXUS_FILE_DATA);
+
+DataSetFilter SmallCodon_part = CreateFilter(SmallCodon,1,"","4,5,7,6,1,0,2,3");
+LikelihoodFunction SmallCodon_LF = (SmallCodon_part,SmallCodon_tree);
+
+Optimize(res_SmallCodon_LF,SmallCodon_LF);
+
+timer2 = Time (1);
+expectedLL = -3286.0978773303;
+diffLL	   = Abs(expectedLL - res_SmallCodon_LF[1][0]);
+fprintf (stdout, SmallCodon_LF, "\nTest optimization took ", timer2-timer, " seconds.\n", diffLL , " difference between obtained and expected likelihood\n\n");
+
+
+END;
diff --git a/tests/hbltests/HMM/SmallNucRel.bf b/tests/hbltests/HMM/SmallNucRel.bf
new file mode 100644
index 0000000..215d9c8
--- /dev/null
+++ b/tests/hbltests/HMM/SmallNucRel.bf
@@ -0,0 +1,106 @@
+#NEXUS
+
+BEGIN TAXA;
+	DIMENSIONS NTAX = 8;
+	TAXLABELS
+		'B_FR_83_HXB2_ACC_K03455' 'B_US_83_RF_ACC_M17451' 'B_US_86_JRFL_ACC_U63632' 'B_US_90_WEAU160_ACC_U21135' 'D_CD_83_ELI_ACC_K03454' 'D_CD_83_NDK_ACC_M27323' 'D_CD_84_84ZR085_ACC_U88822' 'D_UG_94_94UG114_ACC_U88824' ;
+END;
+
+BEGIN CHARACTERS;
+	DIMENSIONS NCHAR = 1320;
+	FORMAT
+		DATATYPE = DNA
+		GAP=-
+		MISSING=?
+	;
+
+MATRIX
+	'B_FR_83_HXB2_ACC_K03455'     CCCATTAGCCCTATTGAGACTGTACCAGTAAAATTAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAATAAAAGCATTAGTAGAAATTTGTACAGAGATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAAGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGATGGAA [...]
+	'B_US_83_RF_ACC_M17451'       CCCATTAGTCCTATTGAAACTGTACCAGTAAAATTAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAGGAAAAAATAAAAGCATTGGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCCAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAGTTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAGAAATCAGTAACAGTATTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATAAAGAGTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAAACACCACGGATTAGATATCAGTACAATGTGCTTCCACAAGGGTGGAA [...]
+	'B_US_86_JRFL_ACC_U63632'     CCCATTAGTCCTATTGAAACTGTACCAGTAAAATTAAAGCCAGGAATGGATGGCCCAAAAGTCAAACAATGGCCATTGACAGAAGAAAAAATAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAGAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATAAAGACTTCAGGAAATATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGGTATCAGTACAATGTGCTTCCGCAGGGATGGAA [...]
+	'B_US_90_WEAU160_ACC_U21135'  CCCATTAGTCCTATTGAAACTGTACCAGTAAAATTAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAGAAAATAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTTCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTACCCTTAGATGAAGACTTCAGGAAGTACACTGCATTTACCATACCTAGTATAAACAATGAAACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGATGGAA [...]
+	'D_CD_83_ELI_ACC_K03454'      CCAATTAGTCCTATTGAAACTGTACCAGTAAAATTAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAATAAAAGCATTAACAGAAATTTGTACAGATATGGAAAAGGAAGGAAAAATTTCAAGAATTGGGCCTGAAAATCCATACAATACTCCAATATTTGCCATAAAGAAAAAAGACAGTACCAAGTGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGATTTCTGGGAAGTTCAATTAGGAATACCGCATCCTGCAGGGCTGAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAAGATTTTAGGAAATATACCGCCTTTACCATATCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGATGGAA [...]
+	'D_CD_83_NDK_ACC_M27323'      CCAATTAGTCCTATTGAAACTGTACCAGTAAAATTAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAATAAAAGCATTAACAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAGAATTGGGCCTGAAAATCCATATAATACTCCAATATTTGCCATAAAGAAAAAAGACAGTACCAAGTGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGATTTCTGGGAGGTTCAATTAGGAATACCGCATCCTGCAGGGCTGAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATGAAGATTTTAGGAAATATACCGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTCCCACAGGGATGGAA [...]
+	'D_CD_84_84ZR085_ACC_U88822'  CCAATTAGTCCTATTGAAACTGTACCAGTAAAATTAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCGTTGACAGAAGAAAAAATAAAAGCATTAACAGAAATTTGTACAGATATGGAAAAGGAAGGAAAAATTTCAAGAATTGGGCCTGAAAATCCATACAATACTCCAATATTTGCCATAAAGAAAAAAGACAGTACTAAGTGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGGATACCACATCCTGCAGGATTAAAGAAGAAAAAGTCAATAACAGTACTGGATGTGGGCGATGCATATTTTTCAATTCCCTTATGTGAAGACTTTAGGAAGTACACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTACTTCCACAGGGATGGAA [...]
+	'D_UG_94_94UG114_ACC_U88824'  CCAATTAGTCCTATTGAAACTGTACCAGTAAAATTAAAGCCAGGGATGGATGGCCCAAAAGTTAAACAATGGCCGTTGACAGAAGAAAAAATAAAAGCACTAATAGAAATTTGTTCAGAACTAGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAACCCATACAATACTCCAATATTTGCCATAAAGAAAAAAGACAGTACTAAGTGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTTTGGGAAGTTCAACTAGGAATACCACATCCTGCAGGGCTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGACGCATATTTTTCAGTTCCCTTACATGAAGACTTTAGAAAATATACCGCATTCACCATACCTAGTACAAACAATGAGACACCAGGAATTAGATATCAGTACAATGTGCTTCCACAAGGATGGAA [...]
+END;
+
+BEGIN TREES;
+	TREE tree = ((((D_CD_83_ELI_ACC_K03454,D_CD_83_NDK_ACC_M27323),D_UG_94_94UG114_ACC_U88824),D_CD_84_84ZR085_ACC_U88822),B_US_83_RF_ACC_M17451,((B_FR_83_HXB2_ACC_K03455,B_US_86_JRFL_ACC_U63632),B_US_90_WEAU160_ACC_U21135));
+END;
+
+BEGIN HYPHY;
+
+fprintf (stdout, "\nRunning an HKY+gamma model fit on an HIV-1 RT (p51) alignment with 8 sequences and 1320 nucleotides\n");
+
+OPTIMIZE_SUMMATION_ORDER = 1;
+
+timer = Time (1);
+
+global SmallCodon_part_Shared_TVTS=1;
+global SmallCodon_part_Shape=0.5;
+SmallCodon_part_Shape:>0.01;
+SmallCodon_part_Shape:<100;
+SmallCodon_part_Categ.weights={
+{              0.25}
+{              0.25}
+{              0.25}
+{              0.25}
+}
+;
+
+
+category SmallCodon_part_Categ=(4,SmallCodon_part_Categ.weights,MEAN,GammaDist(_x_,SmallCodon_part_Shape,SmallCodon_part_Shape),CGammaDist(_x_,SmallCodon_part_Shape,SmallCodon_part_Shape),0,1e+25,CGammaDist(_x_,SmallCodon_part_Shape+1,SmallCodon_part_Shape));
+SmallCodon_part_HKY85={4,4};
+SmallCodon_part_HKY85[0][1]:=t*SmallCodon_part_Shared_TVTS*SmallCodon_part_Categ;
+SmallCodon_part_HKY85[0][2]:=t*SmallCodon_part_Categ;
+SmallCodon_part_HKY85[0][3]:=t*SmallCodon_part_Shared_TVTS*SmallCodon_part_Categ;
+SmallCodon_part_HKY85[1][0]:=t*SmallCodon_part_Shared_TVTS*SmallCodon_part_Categ;
+SmallCodon_part_HKY85[1][2]:=t*SmallCodon_part_Shared_TVTS*SmallCodon_part_Categ;
+SmallCodon_part_HKY85[1][3]:=t*SmallCodon_part_Categ;
+SmallCodon_part_HKY85[2][0]:=t*SmallCodon_part_Categ;
+SmallCodon_part_HKY85[2][1]:=t*SmallCodon_part_Shared_TVTS*SmallCodon_part_Categ;
+SmallCodon_part_HKY85[2][3]:=t*SmallCodon_part_Shared_TVTS*SmallCodon_part_Categ;
+SmallCodon_part_HKY85[3][0]:=t*SmallCodon_part_Shared_TVTS*SmallCodon_part_Categ;
+SmallCodon_part_HKY85[3][1]:=t*SmallCodon_part_Categ;
+SmallCodon_part_HKY85[3][2]:=t*SmallCodon_part_Shared_TVTS*SmallCodon_part_Categ;
+
+SmallCodon_part_Freqs={
+{    0.404450757576}
+{    0.166287878788}
+{    0.209564393939}
+{    0.219696969697}
+}
+;
+Model SmallCodon_part_HKY85_model=(SmallCodon_part_HKY85,SmallCodon_part_Freqs);
+
+UseModel (SmallCodon_part_HKY85_model);
+Tree SmallCodon_tree=((((D_CD_83_ELI_ACC_K03454,D_CD_83_NDK_ACC_M27323)Node3,D_UG_94_94UG114_ACC_U88824)Node2,D_CD_84_84ZR085_ACC_U88822)Node1,B_US_83_RF_ACC_M17451,((B_FR_83_HXB2_ACC_K03455,B_US_86_JRFL_ACC_U63632)Node10,B_US_90_WEAU160_ACC_U21135)Node9);
+
+SmallCodon_tree.Node2.t=0;
+SmallCodon_tree.D_CD_83_ELI_ACC_K03454.t=0;
+SmallCodon_tree.D_UG_94_94UG114_ACC_U88824.t=0;
+SmallCodon_tree.Node1.t=0;
+SmallCodon_tree.D_CD_84_84ZR085_ACC_U88822.t=0;
+SmallCodon_tree.D_CD_83_NDK_ACC_M27323.t=0;
+SmallCodon_tree.Node3.t=0;
+SmallCodon_tree.B_US_83_RF_ACC_M17451.t=0;
+SmallCodon_tree.B_FR_83_HXB2_ACC_K03455.t=0;
+SmallCodon_tree.B_US_86_JRFL_ACC_U63632.t=0;
+SmallCodon_tree.Node10.t=0;
+SmallCodon_tree.B_US_90_WEAU160_ACC_U21135.t=0;
+SmallCodon_tree.Node9.t=0;
+DataSet SmallCodon = ReadDataFile(USE_NEXUS_FILE_DATA);
+
+DataSetFilter SmallCodon_part = CreateFilter(SmallCodon,1,"","4,5,7,6,1,0,2,3");
+LikelihoodFunction SmallCodon_LF = (SmallCodon_part,SmallCodon_tree);
+
+Optimize(res_SmallCodon_LF,SmallCodon_LF);
+
+timer2 = Time (1);
+expectedLL = -3286.0978773303;
+diffLL	   = Abs(expectedLL - res_SmallCodon_LF[1][0]);
+fprintf (stdout, SmallCodon_LF, "\nTest optimization took ", timer2-timer, " seconds.\n", diffLL , " difference between obtained and expected likelihood\n\n");
+
+
+END;
diff --git a/tests/hbltests/HMM/TreeHMM.bf b/tests/hbltests/HMM/TreeHMM.bf
new file mode 100644
index 0000000..f99f5d2
--- /dev/null
+++ b/tests/hbltests/HMM/TreeHMM.bf
@@ -0,0 +1,77 @@
+fprintf (stdout, "\nRunning an HKY+gamma model fit on a simulated alignment with 8 sequences and 1320 nucleotides with 2 blocks from different trees (equal size)\n");
+
+OPTIMIZE_SUMMATION_ORDER = 1;
+
+timer = Time (1);
+
+global						   lambda = 0.1;
+lambda :< 1;
+lambda :> 0.000;
+
+HMM_transition_matrix 		   		= {{1-lambda,lambda}
+   								  	  {lambda,1-lambda}};
+								  
+HMM_starting_frequencies	   		= {{0.5,0.5}};	
+Model	HMM_model			   		= (HMM_transition_matrix,HMM_starting_frequencies,0);
+
+category HMM_variable			    =(2,{{0.5,0.5}},,{{0,1}},
+									  ,0,1e+25,
+									  ,
+									  HMM_model);
+ 
+
+DataSet 	  SmallCodon 	  		= ReadDataFile	("../data/HMM2_synthetic.fas");
+DataSetFilter SmallCodon_part 		= CreateFilter	(SmallCodon,1);
+
+global		  SmallCodon_part_Shared_TVTS = 1;
+
+SmallCodon_part_HKY85={4,4};
+SmallCodon_part_HKY85[0][1]:=t*SmallCodon_part_Shared_TVTS;
+SmallCodon_part_HKY85[0][2]:=t;
+SmallCodon_part_HKY85[0][3]:=t*SmallCodon_part_Shared_TVTS;
+SmallCodon_part_HKY85[1][0]:=t*SmallCodon_part_Shared_TVTS;
+SmallCodon_part_HKY85[1][2]:=t*SmallCodon_part_Shared_TVTS;
+SmallCodon_part_HKY85[1][3]:=t;
+SmallCodon_part_HKY85[2][0]:=t;
+SmallCodon_part_HKY85[2][1]:=t*SmallCodon_part_Shared_TVTS;
+SmallCodon_part_HKY85[2][3]:=t*SmallCodon_part_Shared_TVTS;
+SmallCodon_part_HKY85[3][0]:=t*SmallCodon_part_Shared_TVTS;
+SmallCodon_part_HKY85[3][1]:=t;
+SmallCodon_part_HKY85[3][2]:=t*SmallCodon_part_Shared_TVTS;
+
+
+HarvestFrequencies 								(SmallCodon_part_Freqs,SmallCodon_part,1,1,1);
+Model SmallCodon_part_HKY85_model	=			(SmallCodon_part_HKY85,SmallCodon_part_Freqs);
+Tree tree1							=			((((D_CD_83_ELI_ACC_K03454,D_CD_83_NDK_ACC_M27323)Node3,D_UG_94_94UG114_ACC_U88824)Node2,D_CD_84_84ZR085_ACC_U88822)Node1,B_US_83_RF_ACC_M17451,((B_FR_83_HXB2_ACC_K03455,B_US_86_JRFL_ACC_U63632)Node10,B_US_90_WEAU160_ACC_U21135)Node9);
+Tree tree2							=			((((D_CD_83_ELI_ACC_K03454:0.0252441,D_CD_83_NDK_ACC_M27323:0.0135632):0.00881346,D_UG_94_94UG114_ACC_U88824:0.0619783):0.000782367,D_CD_84_84ZR085_ACC_U88822:0.0207434):0.0351827,((B_FR_83_HXB2_ACC_K03455:0.0195062,B_US_86_JRFL_ACC_U63632:0.0157251):0.00159642,B_US_83_RF_ACC_M17451:0.0284274):0,B_US_90_WEAU160_ACC_U21135:0.0245537);
+LikelihoodFunction SmallCodon_LF 	= 			(SmallCodon_part,tree1,SmallCodon_part,tree2,"HMM_variable");
+
+Optimize										(res_SmallCodon_LF,SmallCodon_LF);
+
+timer2 								= Time (1);
+expectedLL 							= -3580.54867;
+diffLL	   							= Abs(expectedLL - res_SmallCodon_LF[1][0]);
+fprintf 							(stdout, SmallCodon_LF, "\nTest optimization took ", timer2-timer, " seconds.\n", diffLL , " difference between obtained and expected likelihood\n\n");
+
+ConstructCategoryMatrix				(mx, SmallCodon_LF, SHORT);
+
+expected = {"0":{{731,1,0}}};
+
+switches = 0;
+
+for (k    = 1; k < Columns (mx); k = k+1)
+{
+	if (mx[k] != mx[k-1])
+	{
+		fprintf (stdout, "Switch from ", mx[k-1], " to ", mx[k], " at site ", k, "\n");
+		expectedS = expected[switches];
+		if (expectedS[0] != k || expectedS[1] != mx[k-1] || expectedS[2] != mx[k])
+		{
+			fprintf (stdout, "Test FAILED: expected  a switch from ", expectedS[1], " to ", expectedS[2], " at site ", expectedS[0], "\n");
+			return 1;
+		}
+		switches = switches + 1;
+	}
+}
+
+return 0;
diff --git a/tests/hbltests/REL/BS-REL.bf b/tests/hbltests/REL/BS-REL.bf
new file mode 100644
index 0000000..2f55911
--- /dev/null
+++ b/tests/hbltests/REL/BS-REL.bf
@@ -0,0 +1,43 @@
+/* test preamble */
+
+	_testDescription 		= "Branch-site REL on the alignment of 10 CD2 sequences";
+	_expectedLL = 			{{-3450.39628591,-3410.18927}};
+	ExecuteAFile 			("../Shared/TestInstrumentation.bf");
+	startTestTimer 			(_testDescription);
+	
+/* end test preamble */
+
+VERBOSITY_LEVEL			   = 1;
+USE_ADAPTIVE_VARIABLE_STEP = 1;
+OPTIMIZATION_METHOD        = 4;
+
+runTimer = Time (1);
+
+inputOptions = {};
+inputOptions ["00"] = "Universal";
+inputOptions ["01"] = PATH_TO_CURRENT_BF + ".." + DIRECTORY_SEPARATOR + "data" + DIRECTORY_SEPARATOR + "CD2.nex"; 
+inputOptions ["02"] = "y";
+inputOptions ["03"] = PATH_TO_CURRENT_BF + ".." + DIRECTORY_SEPARATOR + "Results" + DIRECTORY_SEPARATOR + "CD2.bsrel.out";
+
+
+
+//ExecuteAFile (HYPHY_LIB_DIRECTORY + "TemplateBatchFiles" + DIRECTORY_SEPARATOR + "BranchSiteREL.bf", inputOptions);
+ExecuteAFile ("../../../res/TemplateBatchFiles/BranchSiteREL.bf", inputOptions);
+
+fittedLL = {1,2};
+fittedLL[0] = res_base[1][0];
+fittedLL[1] = res_three_LF[1][0];
+
+
+
+/* test epilogue */
+	timeMatrix = endTestTimer 				  (_testDescription);
+	if (logTestResult (Abs (fittedLL - _expectedLL) < 2*OPTIMIZATION_PRECISION))
+	{
+		return timeMatrix;
+	}
+	return 0;
+/* end test epilogue */
+
+
+
diff --git a/tests/hbltests/REL/GTR_G_I.bf b/tests/hbltests/REL/GTR_G_I.bf
new file mode 100644
index 0000000..8b304e7
--- /dev/null
+++ b/tests/hbltests/REL/GTR_G_I.bf
@@ -0,0 +1,125 @@
+#NEXUS
+
+BEGIN TAXA;
+	DIMENSIONS NTAX = 8;
+	TAXLABELS
+		'1' '2' '3' '4' '5' '6' '7' '8' ;
+END;
+
+BEGIN CHARACTERS;
+	DIMENSIONS NCHAR = 2000;
+	FORMAT
+		DATATYPE = DNA
+		GAP=-
+		MISSING=?
+	;
+
+MATRIX
+	'1'  CTATACCTAGTTTGGTTAAGGCTAATATAACTGAATACGTCACTATCTTAATACTATTCCCAACGAAGAAACTTACGTGTTATGAAACTTAATATAAAAACAAATAAAATAAATTTAAACTTGTGCCATTTTTTTTATTATGCCTAATATCCAATAATTTTATCTCACCCATAGATCACTACCATATTTCTTGAACTGTCTAAACTAATTAAAACTCCAACACCACATAATCGTATATACATTTCAATAAACCAACCTATTCCAATAGAACAAAACTAATATTCAATTATCTCATCATGCTATCTAATCTACTGAACATAGTCAGTCAGCCTTAAACACAGAATAGCAAATACTGTACAATCAAACACGATGTAATATATACTTAAAATAAAAGTACATGAAACATCAATTTTTGAAATATCACAAAATTACATGTAATATGACGAATGGCCTAAGTTGGCGACACTGATGAACTAAAATAATGGC [...]
+	'2'  CTATACCTAGTTTGGTTAAGACTAATCTAATTGAATCCGTAACTATCTAAACATTATTCCCAACGACTAAACTTACGTGATACGAAACTTAAAATAATAACAAATAAAATAAATTTAAACCTATGCCATTTTTTTTATTATACCTAGTATCCATTGAATCTATCTCACCCGTAGATCAATATCACATTTCTTGTACTCTCAAAACTAAGTAAAACTGCTACACCCCATAATCGTCCATAAAGCTTAGTAGACCAACACATTCCTCTAGTACAAAAATGATACCCAATGTCTTTATCTTTTTTCCTAATCCTCTAAACGCAACCAGCCGACTTCAAACACAGAATAGTCCATACAGTACAATTAAAATCAATGTAACATATAATCAAAACCAAAGCACACTAAAAACCCATTTTCGAAACATCACAAAATTATATCTAATATGATGAATGGTCTAAATCGGAGACACTGCTGAGCTAGAAAAATGGC [...]
+	'3'  TTATATTTAGTTTGATTAAGGCTAATCTAACTGAATACGTCACTATATTAACATTCTTCCCGACGAAAAAATTCACATGTTATAAAATTTAATATAACAACATATAAAATAGATCTAAACTTATGCCATTTTATGTATTATGCTTAATACCCAATAATTTTATTTAACCCATAAACCATCATCACATTTTCTTAAATCTCATAACTAACTAAGACTGCAACACCGCATAATCGTCCATAAAGCTTAGTAGACCAACACATTCATATAGTACAAAAATGATACCAAATGTCTTTATCTTTTTTCCTAATCCGCTAAACGCAATCAGCCGACTTCATACACAGAATAGTCTATACAGTACAATTAAAATCAATGTAACATATAATAAAAACCAAAGCACACGAACATACCCCTCTAAAAACATTACTAAATTACATTTTATATATAGACTGGTCTAAACAGGATACACAGCTTAGCTAAAAAAAAGGT [...]
+	'4'  TTATATTTAGTTTGATTGAGCCTAATCTAACTGAATTCGTTACTATATTAACATTCTTCCCTACGAAAAAATTCACCTGTTATAAAATTTAATATAATAACCTATAAAATAGATCTAAACTTATGCCATTTTCTATATTATACTTATTACCCAATGATTATATCTAACCCATAAATCAACATCATATTTTCTTAAATCTCGTAACTAAATAAAACTACCACATCGCATAGTCGTGCAGAGAACTTAATAGACCAACACATTCCCATAGTACAACACTGATACCAAATATCTTTATCTTTTTCCCTAATCCCCTAAACGCAATCAGCCGACTTCAAACACAGAATAGTCCATACAGTACAATTAAAACCAATGTAACATATAATAAAAACAAAAGCACATGAACCTACCCCTTTAGAAACATCACTAAATTACATTTAAGATGTCGACTGGCCTAAACAGGAAACACTGCTTAGCTAAAAAAAAGGT [...]
+	'5'  TTGTAATTAGTTTGGTTAAGTCTAATATAATCGATTCCGTCACTATTTTAACATTTTTCTCAACGAAGAAATTCGTGTGATATGACATAAAGTATACTAACTAAAAAAACAAACCTAACCATATGCTATTTTATCTGTTAAGCATAGAGACCAATTATCTTAATTCATACATAGAACAAAATCATATTTATTGGAATATTAGCACTAGCTAAACTCATTACAACTCATAATCATTAACACATCTTAATATGCAACCCCATTCCTAGAGTAAACTCTCAACATTAAATATATTTATTATACTTTCCAATCTACTAAACCAATTCTATCAATATTAGACTCTTAATAGTTTATATATTACAGTCACAAATATTATAAAATATAATAAAATGAAAAGTACAATAAAGTACAATAATCGAAACATGATTAAAATCTATTTCATATAAAGACAGGCCCAAATCGGAGACATTCCTTAGCTGAAATAACGGT [...]
+	'6'  TTGTAATTAGTTTGGCTTAGTCTAATCTAATCGAATCTGTCACTATATTAATATTTTTCTCAACGGAAAGATTTATATGATATGACATATAGCCTACCAAATAAAAAAACAGAACTAACCATATGCCATTTTATATGTTAAACATAGTGACCAATTATCTTAATTTATCCCTAGACCAATATCACATTTATTGGAATATTAGTACTATCGAAATTCTACACACTTCATAATCATCAAAAGAGCTTAATACACAGCCTCATTCATAGAGCACACGCCCAACACTAAATATATTTATTATATTTTCCAATCTCCTAAACCAAAACCATCCATTTTAGCCCCTTAATGGCTAATTTATTACAACCACAAATATTATAAAACATAATAAAAAGCAAAGCACAACAAAGTCCAATAATAGAAACATGATTAAAATCTATATCATATAATGACAGGTCTAATTCGGAGACATTCCTTAGCTCAAATAACGGT [...]
+	'7'  TTATAATTAGTTTGGTTAAGACTAATTTAACCGAATATGTCACTATATTAATATTTTTCTCGACGAATAGATTTGTATAATATAACAACTAGCTTAACAACCAAAAAAATATATATAACCATATGCCTTTTCATTTATTAAACTTAACGACCAATTATTATAATTTATTATTAGATCAATATCATATTTCCTGGAATATTGACCCTACCTAATCTAACAACATCACATAGTCATTAACAAATCTTAATCCACATCCCCATTCCTCGAGAACACCCCCATTACTAAGTTTGTTTATTATACTTTCCAATCCTCTAAACTCAAACTATCAATCTCAGACCCCTAATGGCTGTTTTGGTACATACAAAAATACTGTAAAATATAGTTAATAGAAGAGTACACCGAAGAACAATTTTAAAAACATGACCAAATTCTATCTTGTCTAACGACAAGTCTAAATTGGGGACACTAAATAGCTCAAACAAGGGT [...]
+	'8'  TTGTAATTAGTTTGGTTAAGTCTAATATAATCGAATATGTCACTATATTAATATTTTTCTCAACGAATAAATTTGTATTCTATAAAATCTAGACTAATAACCAAACAAATACATATAACCATATGCCCTTTCATATATTAACCTTAATGACCAATTATTTTAATTTATCATTAGATCAATATCATATTTTCTGGAATATTTAAACTACATAACACAACAACATCACATGGTCATAAATAAATCTTAATATACATCCCCATTCCTCGAGAACACCCCCATCATTAAGTTTATCTATCACACTTTCCAATCCACTAAACTCAAACTATCAATTTCAGACCTATAATGGTTAATTTGGTACATCAAAAAACACTGTAAAATATAATTAATAGAAAAGTACATCGAAGAACAAATACAAAAACATGACTAAACTCTATCTTGTCTAATGACAAGTCCAAATCGGGGACACTAAATAGCTAAAATACAGGT [...]
+END;
+
+BEGIN TREES;
+	TREE tree = ((1,2),(3,4),((5,6),(7,8)));
+END;
+
+BEGIN HYPHY;
+
+/* test preamble */
+
+	_testDescription 		= " fit the GTR+I+G gamma model to a simulated alignment with 8 sequences and 2000 sites";
+	_expectedLL 			= -10902.8829038266;
+	ExecuteAFile 			("../Shared/TestInstrumentation.bf");
+	startTestTimer 			(_testDescription);
+	
+/* end test preamble */
+
+
+global P=0.2;
+P:<0.9999999999;
+global alpha=0.4999999999999999;
+alpha:>0.01;
+alpha:<100;
+global GT=1;
+global CT=1;
+global CG=1;
+global AT=1;
+global AC=1;
+global beta:=(1-P)*alpha;
+beta:>0.01;
+beta:<200;
+c.weights={5,1};
+c.weights[0][0]:=P;
+c.weights[1][0]:=(1-P)/4;
+c.weights[2][0]:=(1-P)/4;
+c.weights[3][0]:=(1-P)/4;
+c.weights[4][0]:=(1-P)/4;
+
+
+
+category c=(5,c.weights,MEAN,(1-P)*GammaDist(_x_,alpha,beta)*(_x_>0),(1-P)*CGammaDist(_x_,alpha,beta)*(_x_>0)+P,0,1e+25,(1-P)*CGammaDist(_x_,alpha+1,beta)*alpha/beta*(_x_>0));
+GRM={4,4};
+GRM[0][1]:=AC*mu*c;
+GRM[0][2]:=mu*c;
+GRM[0][3]:=AT*mu*c;
+GRM[1][0]:=AC*mu*c;
+GRM[1][2]:=CG*mu*c;
+GRM[1][3]:=CT*mu*c;
+GRM[2][0]:=mu*c;
+GRM[2][1]:=CG*mu*c;
+GRM[2][3]:=GT*mu*c;
+GRM[3][0]:=AT*mu*c;
+GRM[3][1]:=CT*mu*c;
+GRM[3][2]:=GT*mu*c;
+
+vectorOfFrequencies={
+{         0.3985625}
+{            0.2095}
+{          0.094125}
+{         0.2978125}
+}
+;
+Model GRMModel=(GRM,vectorOfFrequencies);
+
+UseModel (GRMModel);
+Tree givenTree=((1,2),(3,4),((5,6),(7,8)));
+
+givenTree.7.mu=0.05740982371030302;
+givenTree.Node9.mu=0.04305817751849737;
+givenTree.6.mu=0.06004715765808272;
+givenTree.5.mu=0.05633624514408575;
+givenTree.Node2.mu=0.0206913217817042;
+givenTree.3.mu=0.04777525638115638;
+givenTree.1.mu=0.08984604347037839;
+givenTree.8.mu=0.05386807848950862;
+givenTree.Node12.mu=0.06115352289304924;
+givenTree.Node8.mu=0.1095519264881135;
+givenTree.4.mu=0.05221556762638653;
+givenTree.Node5.mu=0.03067076253306178;
+givenTree.2.mu=0.06485966277329239;
+DataSet ds = ReadDataFile(USE_NEXUS_FILE_DATA);
+DataSetFilter filteredData = CreateFilter(ds,1,"0-1999","0-7");
+LikelihoodFunction lf = (filteredData,givenTree);
+USE_ADAPTIVE_VARIABLE_STEP	= 1;
+/*
+VERBOSITY_LEVEL			    = 100;
+*/
+
+Optimize(res_lf,lf);
+
+/* test epilogue */
+	timeMatrix = endTestTimer 				  (_testDescription);
+	if (logTestResult (Abs (res_lf[1][0] - _expectedLL) < 0.01))
+	{
+		return timeMatrix;
+	}
+	return 0;
+/* end test epilogue */
+
+END;
diff --git a/tests/hbltests/REL/IntermediateNucRel.bf b/tests/hbltests/REL/IntermediateNucRel.bf
new file mode 100644
index 0000000..69e445e
--- /dev/null
+++ b/tests/hbltests/REL/IntermediateNucRel.bf
@@ -0,0 +1,1056 @@
+/* test preamble */
+
+	_testDescription 		= " fit the HKY85+Gamma(5) model to an Influenza A alignment with 349 sequences and 967 nucleotides and perform an EB analysis";
+	_expectedLL 			= -10824.9555795;
+	ExecuteAFile 			("../Shared/TestInstrumentation.bf");
+	startTestTimer 			(_testDescription);
+	
+/* end test preamble */
+
+timer = Time (1);
+
+
+VERBOSITY_LEVEL = 1;
+OPTIMIZATION_PROGRESS_QUANTUM = 0.5;
+OPTIMIZATION_PROGRESS_STATUS  = "OPTIMIZING THE LIKELIHOOD FUNCTION";
+OPTIMIZATION_PROGRESS_TEMPLATE = "$1 Log(L) = $2 ($3% done) Time elapsed: $4 LF evals/second: $5 CPU load: $6";
+
+
+global flu_part_SharedAC = 1;
+global flu_part_SharedAT = 1;
+global flu_part_SharedCG = 1;
+global flu_part_SharedCT = 1;
+global flu_part_SharedGT = 1;
+global flu_part_Shape2   = 0.25;
+
+global alpha = .5;
+alpha:>0.01;alpha:<100;
+category flu_part_Categ2 = (5, EQUAL, MEAN, 
+				GammaDist(_x_,alpha,alpha), 
+				CGammaDist(_x_,alpha,alpha), 
+				0 , 
+				1e25,
+				CGammaDist(_x_,alpha+1,alpha)
+			 );
+
+
+flu_part_REV2={4,4};
+flu_part_REV2[0][1]:=flu_part_SharedAC*mu*flu_part_Categ2;
+flu_part_REV2[0][2]:=mu*flu_part_Categ2;
+flu_part_REV2[0][3]:=flu_part_SharedAT*mu*flu_part_Categ2;
+flu_part_REV2[1][0]:=flu_part_SharedAC*mu*flu_part_Categ2;
+flu_part_REV2[1][2]:=flu_part_SharedCG*mu*flu_part_Categ2;
+flu_part_REV2[1][3]:=flu_part_SharedCT*mu*flu_part_Categ2;
+flu_part_REV2[2][0]:=mu*flu_part_Categ2;
+flu_part_REV2[2][1]:=flu_part_SharedCG*mu*flu_part_Categ2;
+flu_part_REV2[2][3]:=flu_part_SharedGT*mu*flu_part_Categ2;
+flu_part_REV2[3][0]:=flu_part_SharedAT*mu*flu_part_Categ2;
+flu_part_REV2[3][1]:=flu_part_SharedCT*mu*flu_part_Categ2;
+flu_part_REV2[3][2]:=flu_part_SharedGT*mu*flu_part_Categ2;
+
+flu_part_Freqs2={
+{    0.321488786102}
+{    0.221264478507}
+{    0.225765445963}
+{    0.231481289428}
+};
+
+Model flu_part_REV2_model=(flu_part_REV2,flu_part_Freqs2);
+
+UseModel 	(flu_part_REV2_model);
+DataSet flu 				= 	ReadDataFile("../data/fluHA.nex");
+Tree Tree_1				=	DATAFILE_TREE;
+
+DataSetFilter flu_part 			= CreateFilter(flu,1);
+LikelihoodFunction flu_LF 		= (flu_part,Tree_1);
+USE_ADAPTIVE_VARIABLE_STEP		= 1;
+VERBOSITY_LEVEL					= 1;
+Optimize						(res_flu_LF,flu_LF);
+
+expectedConditionalProbabilities = {
+{0.216283,0.179544,0.108331,0.0349219,0.000618225}
+{2.09265e-14,1.33831e-11,3.20059e-10,1.75442e-09,9.57163e-10}
+{4.03972e-14,2.58347e-11,6.178e-10,3.38584e-09,1.84494e-09}
+{0.314118,0.259864,0.155361,0.0491047,0.000818123}
+{1.0572e-05,8.02644e-05,0.000164091,0.000134207,7.14634e-06}
+{8.98899e-25,4.86033e-20,1.37319e-17,5.15344e-16,3.07981e-15}
+{0.226709,0.191207,0.120442,0.042757,0.00106745}
+{5.45902e-11,3.88049e-09,2.86376e-08,6.83736e-08,1.77146e-08}
+{0.216283,0.179544,0.108331,0.0349219,0.000618225}
+{0.216283,0.179544,0.108331,0.0349219,0.000618225}
+{1.12183e-05,8.54675e-05,0.000176354,0.000147137,8.33035e-06}
+{8.9053e-10,6.04653e-08,3.94045e-07,7.12284e-07,6.87919e-08}
+{0.219889,0.177239,0.0987326,0.026625,0.000250802}
+{2.49031e-06,1.89181e-05,3.87377e-05,3.17963e-05,1.71469e-06}
+{5.00872e-05,0.000380226,0.000777071,0.00063505,3.37025e-05}
+{0.314118,0.259864,0.155361,0.0491047,0.000818123}
+{0.226709,0.191207,0.120442,0.042757,0.00106745}
+{0.219889,0.177239,0.0987326,0.026625,0.000250802}
+{1.40159e-05,0.000106406,0.000217505,0.000177837,9.45879e-06}
+{0.216283,0.179544,0.108331,0.0349219,0.000618225}
+{1.75315e-05,0.000133095,0.000272055,0.00022243,1.18284e-05}
+{0.314118,0.259864,0.155361,0.0491047,0.000818123}
+{0.216283,0.179544,0.108331,0.0349219,0.000618225}
+{0.314118,0.259864,0.155361,0.0491047,0.000818123}
+{0.219889,0.177239,0.0987326,0.026625,0.000250802}
+{0.216283,0.179544,0.108331,0.0349219,0.000618225}
+{0.314118,0.259864,0.155361,0.0491047,0.000818123}
+{6.13429e-06,4.67398e-05,9.64721e-05,8.05435e-05,4.57128e-06}
+{1.76335e-14,1.1223e-11,2.64915e-10,1.41002e-09,6.91592e-10}
+{1.41815e-05,0.000104907,0.000199849,0.000139479,4.20146e-06}
+{0.216283,0.179544,0.108331,0.0349219,0.000618225}
+{0.314118,0.259864,0.155361,0.0491047,0.000818123}
+{0.314118,0.259864,0.155361,0.0491047,0.000818123}
+{0.216283,0.179544,0.108331,0.0349219,0.000618225}
+{1.08543e-33,4.80168e-27,1.4664e-23,3.09124e-21,1.01393e-19}
+{1.35775e-05,0.000103459,0.00021358,0.000178384,1.01377e-05}
+{0.226709,0.191207,0.120442,0.042757,0.00106745}
+{8.8852e-10,6.03457e-08,3.93564e-07,7.12625e-07,6.92452e-08}
+{0.226709,0.191207,0.120442,0.042757,0.00106745}
+{0.219889,0.177239,0.0987326,0.026625,0.000250802}
+{0.216283,0.179544,0.108331,0.0349219,0.000618225}
+{7.5207e-29,3.73452e-23,3.61496e-20,3.52576e-18,6.83827e-17}
+{4.53285e-06,3.50897e-05,7.56106e-05,6.95167e-05,5.56356e-06}
+{3.22026e-15,2.00717e-12,4.4763e-11,2.09738e-10,6.51399e-11}
+{0.219889,0.177239,0.0987326,0.026625,0.000250802}
+{0.219889,0.177239,0.0987326,0.026625,0.000250802}
+{7.17228e-37,2.98568e-29,3.33762e-25,2.12149e-22,3.85136e-20}
+{0.216283,0.179544,0.108331,0.0349219,0.000618225}
+{1.42106e-05,0.000107905,0.000220687,0.000180654,9.64942e-06}
+{1.59312e-37,6.70651e-30,7.72703e-26,5.25114e-23,1.19815e-20}
+{0.216283,0.179544,0.108331,0.0349219,0.000618225}
+{0.314118,0.259864,0.155361,0.0491047,0.000818123}
+{0.226709,0.191207,0.120442,0.042757,0.00106745}
+{1.05993e-05,7.84199e-05,0.000149454,0.000104407,3.15575e-06}
+{0.216283,0.179544,0.108331,0.0349219,0.000618225}
+{1.91194e-05,0.000145131,0.000296552,0.000242266,1.28474e-05}
+{0.219889,0.177239,0.0987326,0.026625,0.000250802}
+{0.226709,0.191207,0.120442,0.042757,0.00106745}
+{1.16746e-09,7.93322e-08,5.18126e-07,9.41167e-07,9.25046e-08}
+{0.216283,0.179544,0.108331,0.0349219,0.000618225}
+{6.49921e-07,4.96106e-06,1.02904e-05,8.68615e-06,5.12235e-07}
+{0.314118,0.259864,0.155361,0.0491047,0.000818123}
+{0.314118,0.259864,0.155361,0.0491047,0.000818123}
+{7.95965e-14,5.08927e-11,1.21636e-09,6.6583e-09,3.61453e-09}
+{1.80621e-14,1.15912e-11,2.79775e-10,1.56433e-09,9.0738e-10}
+{5.73333e-05,0.00042419,0.000808456,0.000564785,1.70619e-05}
+{0.219889,0.177239,0.0987326,0.026625,0.000250802}
+{3.55574e-05,0.000269934,0.000551709,0.000450967,2.39567e-05}
+{0.314118,0.259864,0.155361,0.0491047,0.000818123}
+{0.216283,0.179544,0.108331,0.0349219,0.000618225}
+{3.84838e-10,2.62027e-08,1.72055e-07,3.16315e-07,3.24387e-08}
+{0.216283,0.179544,0.108331,0.0349219,0.000618225}
+{0.226709,0.191207,0.120442,0.042757,0.00106745}
+{1.05712e-05,8.02583e-05,0.000164078,0.000134195,7.14537e-06}
+{0.219889,0.177239,0.0987326,0.026625,0.000250802}
+{0.226709,0.191207,0.120442,0.042757,0.00106745}
+{2.5045e-05,0.000185278,0.000353007,0.000246447,7.43107e-06}
+{0.314118,0.259864,0.155361,0.0491047,0.000818123}
+{1.95371e-10,1.36167e-08,9.52722e-08,2.02017e-07,3.46189e-08}
+{7.97046e-10,5.55387e-08,3.88338e-07,8.2224e-07,1.40136e-07}
+{0.314118,0.259864,0.155361,0.0491047,0.000818123}
+{0.216283,0.179544,0.108331,0.0349219,0.000618225}
+{0.314118,0.259864,0.155361,0.0491047,0.000818123}
+{0.314118,0.259864,0.155361,0.0491047,0.000818123}
+{0.226709,0.191207,0.120442,0.042757,0.00106745}
+{0.216283,0.179544,0.108331,0.0349219,0.000618225}
+{1.6375e-05,0.000124352,0.000254393,0.000208375,1.11563e-05}
+{0.216283,0.179544,0.108331,0.0349219,0.000618225}
+{1.80171e-14,1.12301e-11,2.5046e-10,1.17365e-09,3.64616e-10}
+{6.99182e-06,5.30813e-05,0.000108508,8.87261e-05,4.72072e-06}
+{7.09915e-06,5.38996e-05,0.0001102,9.01449e-05,4.80288e-06}
+{6.19513e-07,4.79565e-06,1.03329e-05,9.49869e-06,7.59799e-07}
+{0.219889,0.177239,0.0987326,0.026625,0.000250802}
+{1.04961e-05,7.9685e-05,0.000162887,0.000133187,7.08512e-06}
+{5.05281e-42,1.96582e-33,7.89408e-29,1.44872e-25,1.22965e-22}
+{0.216283,0.179544,0.108331,0.0349219,0.000618225}
+{0.314118,0.259864,0.155361,0.0491047,0.000818123}
+{9.96011e-23,5.33721e-18,1.47178e-15,5.23487e-14,2.60519e-13}
+{1.40603e-05,0.000106742,0.000218185,0.000178381,9.48526e-06}
+{0.226709,0.191207,0.120442,0.042757,0.00106745}
+{0.226709,0.191207,0.120442,0.042757,0.00106745}
+{0.219889,0.177239,0.0987326,0.026625,0.000250802}
+{1.41387e-05,0.000107345,0.000219462,0.000179507,9.56077e-06}
+{7.84486e-11,5.46841e-09,3.82756e-08,8.12291e-08,1.39595e-08}
+{6.99692e-06,5.17907e-05,9.88261e-05,6.92296e-05,2.1131e-06}
+{0.226709,0.191207,0.120442,0.042757,0.00106745}
+{0.219889,0.177239,0.0987326,0.026625,0.000250802}
+{0.314118,0.259864,0.155361,0.0491047,0.000818123}
+{0.216283,0.179544,0.108331,0.0349219,0.000618225}
+{0.226709,0.191207,0.120442,0.042757,0.00106745}
+{0.314118,0.259864,0.155361,0.0491047,0.000818123}
+{1.05094e-05,7.97858e-05,0.000163093,0.000133355,7.09407e-06}
+{0.226709,0.191207,0.120442,0.042757,0.00106745}
+{0.219889,0.177239,0.0987326,0.026625,0.000250802}
+{0.216283,0.179544,0.108331,0.0349219,0.000618225}
+{0.226709,0.191207,0.120442,0.042757,0.00106745}
+{0.314118,0.259864,0.155361,0.0491047,0.000818123}
+{0.216283,0.179544,0.108331,0.0349219,0.000618225}
+{0.226709,0.191207,0.120442,0.042757,0.00106745}
+{0.219889,0.177239,0.0987326,0.026625,0.000250802}
+{0.314118,0.259864,0.155361,0.0491047,0.000818123}
+{4.77187e-11,3.24723e-09,2.12896e-08,3.90028e-08,3.94716e-09}
+{2.32385e-19,1.3691e-15,1.13108e-13,1.64002e-12,3.06392e-12}
+{0.226709,0.191207,0.120442,0.042757,0.00106745}
+{1.74999e-05,0.000129456,0.000246624,0.000172137,5.18637e-06}
+{2.11134e-05,0.000156201,0.000297649,0.000207865,6.27507e-06}
+{0.226709,0.191207,0.120442,0.042757,0.00106745}
+{2.43412e-28,1.22867e-22,1.24341e-19,1.3397e-17,3.70295e-16}
+{1.60948e-07,1.22675e-06,2.53438e-06,2.1203e-06,1.21232e-07}
+{0.314118,0.259864,0.155361,0.0491047,0.000818123}
+{4.59644e-11,3.12138e-09,2.03503e-08,3.68207e-08,3.56848e-09}
+{1.41258e-05,0.000107247,0.000219264,0.000179347,9.55268e-06}
+{1.81447e-23,9.53792e-19,2.49637e-16,7.89666e-15,2.57925e-14}
+{8.62394e-20,5.15847e-16,4.44078e-14,7.06124e-13,1.8326e-12}
+{0.226709,0.191207,0.120442,0.042757,0.00106745}
+{9.1671e-11,6.40921e-09,4.52183e-08,9.76042e-08,1.76486e-08}
+{5.42407e-10,3.7932e-08,2.67799e-07,5.78924e-07,1.05251e-07}
+{1.14638e-14,7.47033e-12,1.87961e-10,1.15353e-09,9.3236e-10}
+{0.216283,0.179544,0.108331,0.0349219,0.000618225}
+{0.314118,0.259864,0.155361,0.0491047,0.000818123}
+{1.7671e-05,0.000134154,0.000274219,0.000224198,1.19224e-05}
+{1.95931e-15,1.25724e-12,3.03366e-11,1.69512e-10,9.80985e-11}
+{2.51012e-06,1.90686e-05,3.90465e-05,3.20507e-05,1.72859e-06}
+{0.219889,0.177239,0.0987326,0.026625,0.000250802}
+{1.04672e-05,7.74295e-05,0.0001475,0.000102935,3.09984e-06}
+{0.226709,0.191207,0.120442,0.042757,0.00106745}
+{2.19157e-10,1.52714e-08,1.06789e-07,2.26144e-07,3.85642e-08}
+{1.6246e-33,7.19103e-27,2.19958e-23,4.65323e-21,1.54537e-19}
+{8.88629e-10,6.2001e-08,4.35055e-07,9.28416e-07,1.62626e-07}
+{3.66504e-06,2.78281e-05,5.69044e-05,4.65651e-05,2.48411e-06}
+{0.226709,0.191207,0.120442,0.042757,0.00106745}
+{3.49914e-06,2.65694e-05,5.4336e-05,4.44743e-05,2.37518e-06}
+{0.226709,0.191207,0.120442,0.042757,0.00106745}
+{0.219889,0.177239,0.0987326,0.026625,0.000250802}
+{1.42094e-19,8.36966e-16,6.91048e-14,1.00066e-12,1.86044e-12}
+{4.70731e-18,2.69252e-14,2.05309e-12,2.48855e-11,2.46663e-11}
+{3.50513e-10,2.442e-08,1.70675e-07,3.61026e-07,6.13219e-08}
+{3.65438e-06,2.7842e-05,5.74538e-05,4.79436e-05,2.71618e-06}
+{1.40651e-05,0.000106735,0.000217928,0.000177729,9.36665e-06}
+{1.75526e-05,0.000129846,0.000247367,0.000172655,5.20202e-06}
+{1.12803e-05,8.73085e-05,0.000188046,0.000172715,1.37725e-05}
+{0.216283,0.179544,0.108331,0.0349219,0.000618225}
+{4.43835e-06,3.38128e-05,6.97634e-05,5.81939e-05,3.29247e-06}
+{1.1254e-05,8.71081e-05,0.000187631,0.00017237,1.3755e-05}
+{0.216283,0.179544,0.108331,0.0349219,0.000618225}
+{0.314118,0.259864,0.155361,0.0491047,0.000818123}
+{1.4443e-14,9.26792e-12,2.23648e-10,1.24987e-09,7.2369e-10}
+{4.0701e-11,2.84754e-09,2.01267e-08,4.36226e-08,8.00521e-09}
+{9.82971e-15,6.13283e-12,1.37137e-10,6.46424e-10,2.0511e-10}
+{5.89199e-14,3.77037e-11,9.03156e-10,4.96862e-09,2.74497e-09}
+{0.314118,0.259864,0.155361,0.0491047,0.000818123}
+{0.226709,0.191207,0.120442,0.042757,0.00106745}
+{6.77622e-06,5.16241e-05,0.000106515,8.8857e-05,5.02853e-06}
+{6.12306e-06,4.6653e-05,9.62863e-05,8.03757e-05,4.55915e-06}
+{1.87247e-06,1.44989e-05,3.12635e-05,2.87883e-05,2.31666e-06}
+{4.19144e-10,2.9759e-08,2.18908e-07,5.18863e-07,1.30952e-07}
+{0.219889,0.177239,0.0987326,0.026625,0.000250802}
+{0.314118,0.259864,0.155361,0.0491047,0.000818123}
+{0.226709,0.191207,0.120442,0.042757,0.00106745}
+{0.219889,0.177239,0.0987326,0.026625,0.000250802}
+{0.219889,0.177239,0.0987326,0.026625,0.000250802}
+{3.55848e-55,1.05023e-43,1.60301e-37,4.55414e-33,8.52564e-29}
+{3.59195e-10,2.50228e-08,1.74849e-07,3.69663e-07,6.26698e-08}
+{7.63798e-10,5.32217e-08,3.72134e-07,7.87911e-07,1.34274e-07}
+{2.08377e-10,1.45653e-08,1.027e-07,2.21435e-07,4.00146e-08}
+{0.314118,0.259864,0.155361,0.0491047,0.000818123}
+{0.314118,0.259864,0.155361,0.0491047,0.000818123}
+{3.05185e-14,1.96003e-11,4.74089e-10,2.6634e-09,1.57129e-09}
+{0.226709,0.191207,0.120442,0.042757,0.00106745}
+{0.219889,0.177239,0.0987326,0.026625,0.000250802}
+{0.216283,0.179544,0.108331,0.0349219,0.000618225}
+{0.314118,0.259864,0.155361,0.0491047,0.000818123}
+{0.216283,0.179544,0.108331,0.0349219,0.000618225}
+{3.12023e-06,2.3707e-05,4.85643e-05,3.98993e-05,2.1587e-06}
+{3.48176e-10,2.43446e-08,1.71789e-07,3.70969e-07,6.71787e-08}
+{0.226709,0.191207,0.120442,0.042757,0.00106745}
+{0.219889,0.177239,0.0987326,0.026625,0.000250802}
+{0.314118,0.259864,0.155361,0.0491047,0.000818123}
+{0.226709,0.191207,0.120442,0.042757,0.00106745}
+{2.11205e-05,0.000160341,0.000327741,0.000267946,1.42462e-05}
+{0.219889,0.177239,0.0987326,0.026625,0.000250802}
+{0.314118,0.259864,0.155361,0.0491047,0.000818123}
+{1.1207e-05,8.67412e-05,0.000186824,0.000171593,1.3683e-05}
+{0.219889,0.177239,0.0987326,0.026625,0.000250802}
+{0.216283,0.179544,0.108331,0.0349219,0.000618225}
+{3.00289e-15,1.95749e-12,4.92979e-11,3.03174e-10,2.46895e-10}
+{0.216283,0.179544,0.108331,0.0349219,0.000618225}
+{0.226709,0.191207,0.120442,0.042757,0.00106745}
+{2.48416e-06,1.88713e-05,3.86417e-05,3.17172e-05,1.71036e-06}
+{0.226709,0.191207,0.120442,0.042757,0.00106745}
+{0.226709,0.191207,0.120442,0.042757,0.00106745}
+{0.219889,0.177239,0.0987326,0.026625,0.000250802}
+{0.219889,0.177239,0.0987326,0.026625,0.000250802}
+{0.219889,0.177239,0.0987326,0.026625,0.000250802}
+{6.07261e-15,3.88324e-12,9.28454e-11,5.08682e-10,2.77195e-10}
+{0.219889,0.177239,0.0987326,0.026625,0.000250802}
+{0.314118,0.259864,0.155361,0.0491047,0.000818123}
+{0.216283,0.179544,0.108331,0.0349219,0.000618225}
+{0.216283,0.179544,0.108331,0.0349219,0.000618225}
+{4.45586e-06,3.39462e-05,7.00387e-05,5.84235e-05,3.30546e-06}
+{0.226709,0.191207,0.120442,0.042757,0.00106745}
+{2.98612e-10,2.08902e-08,1.47628e-07,3.19838e-07,5.86102e-08}
+{3.12493e-06,2.37428e-05,4.86376e-05,3.99599e-05,2.16203e-06}
+{0.226709,0.191207,0.120442,0.042757,0.00106745}
+{0.226709,0.191207,0.120442,0.042757,0.00106745}
+{0.219889,0.177239,0.0987326,0.026625,0.000250802}
+{0.226709,0.191207,0.120442,0.042757,0.00106745}
+{0.219889,0.177239,0.0987326,0.026625,0.000250802}
+{0.314118,0.259864,0.155361,0.0491047,0.000818123}
+{2.22965e-06,1.72573e-05,3.71693e-05,3.41396e-05,2.7226e-06}
+{1.75842e-05,0.000130096,0.00024793,0.000173184,5.2326e-06}
+{7.87916e-19,4.51167e-15,3.45038e-13,4.21016e-12,4.27583e-12}
+{0.216283,0.179544,0.108331,0.0349219,0.000618225}
+{0.226709,0.191207,0.120442,0.042757,0.00106745}
+{0.226709,0.191207,0.120442,0.042757,0.00106745}
+{3.47293e-05,0.000264768,0.000547332,0.000458527,2.63325e-05}
+{5.24339e-39,2.19217e-31,2.47912e-27,1.616e-24,3.18162e-22}
+{0.314118,0.259864,0.155361,0.0491047,0.000818123}
+{0.314118,0.259864,0.155361,0.0491047,0.000818123}
+{0.314118,0.259864,0.155361,0.0491047,0.000818123}
+{0.314118,0.259864,0.155361,0.0491047,0.000818123}
+{1.12608e-05,8.71604e-05,0.000187742,0.000172468,1.37619e-05}
+{9.28101e-14,5.90586e-11,1.39333e-09,7.40788e-09,3.62107e-09}
+{0.314118,0.259864,0.155361,0.0491047,0.000818123}
+{1.41675e-05,0.000104808,0.000199684,0.000139401,4.20307e-06}
+{2.46335e-05,0.000183103,0.000353406,0.000254004,8.50351e-06}
+{0.314118,0.259864,0.155361,0.0491047,0.000818123}
+{1.32955e-14,8.50122e-12,2.03204e-10,1.11261e-09,6.04623e-10}
+{0.226709,0.191207,0.120442,0.042757,0.00106745}
+{0.219889,0.177239,0.0987326,0.026625,0.000250802}
+{0.219889,0.177239,0.0987326,0.026625,0.000250802}
+{0.219889,0.177239,0.0987326,0.026625,0.000250802}
+{0.314118,0.259864,0.155361,0.0491047,0.000818123}
+{2.7264e-14,1.7516e-11,4.24061e-10,2.38715e-09,1.41804e-09}
+{1.23786e-05,9.43291e-05,0.000194759,0.000162718,9.25836e-06}
+{0.226709,0.191207,0.120442,0.042757,0.00106745}
+{0.226709,0.191207,0.120442,0.042757,0.00106745}
+{0.226709,0.191207,0.120442,0.042757,0.00106745}
+{0.226709,0.191207,0.120442,0.042757,0.00106745}
+{0.226709,0.191207,0.120442,0.042757,0.00106745}
+{9.26676e-15,5.7759e-12,1.28812e-10,6.03555e-10,1.87465e-10}
+{0.226709,0.191207,0.120442,0.042757,0.00106745}
+{3.19747e-05,0.00024748,0.000533013,0.000489526,3.90171e-05}
+{0.219889,0.177239,0.0987326,0.026625,0.000250802}
+{0.314118,0.259864,0.155361,0.0491047,0.000818123}
+{1.54785e-10,1.08127e-08,7.61205e-08,1.63619e-07,2.93711e-08}
+{0.216283,0.179544,0.108331,0.0349219,0.000618225}
+{0.219889,0.177239,0.0987326,0.026625,0.000250802}
+{0.216283,0.179544,0.108331,0.0349219,0.000618225}
+{1.5008e-05,0.000113987,0.000233277,0.000191239,1.02676e-05}
+{4.98193e-15,3.1121e-12,6.98222e-11,3.3153e-10,1.07786e-10}
+{2.21992e-06,1.69119e-05,3.48921e-05,2.91036e-05,1.64623e-06}
+{8.45854e-11,5.90137e-09,4.14042e-08,8.83357e-08,1.54662e-08}
+{3.34464e-11,2.33115e-09,1.63111e-08,3.4588e-08,5.92531e-09}
+{1.95642e-10,1.36255e-08,9.514e-08,2.00819e-07,3.38523e-08}
+{0.219889,0.177239,0.0987326,0.026625,0.000250802}
+{0.216283,0.179544,0.108331,0.0349219,0.000618225}
+{1.27771e-15,8.34046e-13,2.1083e-11,1.30735e-10,1.0959e-10}
+{0.226709,0.191207,0.120442,0.042757,0.00106745}
+{2.73815e-11,1.91532e-09,1.35326e-08,2.93245e-08,5.4173e-09}
+{0.216283,0.179544,0.108331,0.0349219,0.000618225}
+{0.314118,0.259864,0.155361,0.0491047,0.000818123}
+{0.219889,0.177239,0.0987326,0.026625,0.000250802}
+{0.216283,0.179544,0.108331,0.0349219,0.000618225}
+{3.19626e-10,2.22684e-08,1.55643e-07,3.29243e-07,5.59186e-08}
+{7.69911e-11,5.36965e-09,3.76378e-08,8.01288e-08,1.39224e-08}
+{2.13672e-14,1.37199e-11,3.31657e-10,1.86072e-09,1.09244e-09}
+{0.226709,0.191207,0.120442,0.042757,0.00106745}
+{0.219889,0.177239,0.0987326,0.026625,0.000250802}
+{5.33458e-15,3.48587e-12,8.83666e-11,5.51443e-10,4.72698e-10}
+{0.226709,0.191207,0.120442,0.042757,0.00106745}
+{0.314118,0.259864,0.155361,0.0491047,0.000818123}
+{0.216283,0.179544,0.108331,0.0349219,0.000618225}
+{0.216283,0.179544,0.108331,0.0349219,0.000618225}
+{0.216283,0.179544,0.108331,0.0349219,0.000618225}
+{6.74215e-06,5.21852e-05,0.000112405,0.000103259,8.23922e-06}
+{0.226709,0.191207,0.120442,0.042757,0.00106745}
+{0.314118,0.259864,0.155361,0.0491047,0.000818123}
+{0.226709,0.191207,0.120442,0.042757,0.00106745}
+{0.219889,0.177239,0.0987326,0.026625,0.000250802}
+{0.314118,0.259864,0.155361,0.0491047,0.000818123}
+{0.226709,0.191207,0.120442,0.042757,0.00106745}
+{1.0517e-05,7.77979e-05,0.000148201,0.000103425,3.11461e-06}
+{0.226709,0.191207,0.120442,0.042757,0.00106745}
+{6.00141e-07,4.4396e-06,8.45807e-06,5.90397e-06,1.77943e-07}
+{4.45879e-06,3.39685e-05,7.00847e-05,5.84619e-05,3.30764e-06}
+{1.91291e-10,1.33757e-08,9.43976e-08,2.039e-07,3.69605e-08}
+{1.40761e-13,8.81384e-11,1.99016e-09,9.58645e-09,3.28033e-09}
+{0.219889,0.177239,0.0987326,0.026625,0.000250802}
+{0.314118,0.259864,0.155361,0.0491047,0.000818123}
+{0.226709,0.191207,0.120442,0.042757,0.00106745}
+{0.226709,0.191207,0.120442,0.042757,0.00106745}
+{0.314118,0.259864,0.155361,0.0491047,0.000818123}
+{0.226709,0.191207,0.120442,0.042757,0.00106745}
+{4.09418e-11,2.78509e-09,1.82424e-08,3.33496e-08,3.34996e-09}
+{7.67767e-10,5.37405e-08,3.80337e-07,8.26723e-07,1.5325e-07}
+{3.82011e-24,2.06634e-19,5.8443e-17,2.19854e-15,1.32497e-14}
+{6.70998e-06,5.19347e-05,0.000111858,0.00010274,8.19302e-06}
+{0.216283,0.179544,0.108331,0.0349219,0.000618225}
+{0.216283,0.179544,0.108331,0.0349219,0.000618225}
+{0.216283,0.179544,0.108331,0.0349219,0.000618225}
+{0.226709,0.191207,0.120442,0.042757,0.00106745}
+{2.47848e-11,1.76075e-09,1.2973e-08,3.08603e-08,7.88997e-09}
+{3.65875e-06,2.77798e-05,5.68029e-05,4.64769e-05,2.47842e-06}
+{0.219889,0.177239,0.0987326,0.026625,0.000250802}
+{5.04222e-19,2.88309e-15,2.19634e-13,2.65666e-12,2.61464e-12}
+{0.226709,0.191207,0.120442,0.042757,0.00106745}
+{0.216283,0.179544,0.108331,0.0349219,0.000618225}
+{2.0576e-16,1.3173e-13,3.15948e-12,1.74319e-11,9.73506e-12}
+{0.216283,0.179544,0.108331,0.0349219,0.000618225}
+{0.226709,0.191207,0.120442,0.042757,0.00106745}
+{0.314118,0.259864,0.155361,0.0491047,0.000818123}
+{8.82498e-15,5.50048e-12,1.22665e-10,5.74705e-10,1.78435e-10}
+{0.226709,0.191207,0.120442,0.042757,0.00106745}
+{0.226709,0.191207,0.120442,0.042757,0.00106745}
+{0.219889,0.177239,0.0987326,0.026625,0.000250802}
+{0.216283,0.179544,0.108331,0.0349219,0.000618225}
+{1.1203e-05,8.5351e-05,0.000176114,0.000146937,8.31898e-06}
+{0.226709,0.191207,0.120442,0.042757,0.00106745}
+{0.216283,0.179544,0.108331,0.0349219,0.000618225}
+{4.80455e-19,2.82243e-15,2.31387e-13,3.3002e-12,5.86451e-12}
+{0.226709,0.191207,0.120442,0.042757,0.00106745}
+{0.216283,0.179544,0.108331,0.0349219,0.000618225}
+{3.00505e-29,1.49176e-23,1.44298e-20,1.40579e-18,2.73054e-17}
+{0.219889,0.177239,0.0987326,0.026625,0.000250802}
+{0.219889,0.177239,0.0987326,0.026625,0.000250802}
+{2.50631e-11,1.75228e-09,1.23625e-08,2.66835e-08,4.82433e-09}
+{0.314118,0.259864,0.155361,0.0491047,0.000818123}
+{2.43336e-06,1.85388e-05,3.82532e-05,3.19158e-05,1.80705e-06}
+{1.11474e-05,8.4949e-05,0.000175404,0.000146568,8.34413e-06}
+{1.18757e-19,6.99384e-16,5.7718e-14,8.3489e-13,1.54633e-12}
+{0.226709,0.191207,0.120442,0.042757,0.00106745}
+{6.1054e-18,3.49213e-14,2.66262e-12,3.22683e-11,3.19612e-11}
+{0.219889,0.177239,0.0987326,0.026625,0.000250802}
+{0.314118,0.259864,0.155361,0.0491047,0.000818123}
+{2.14952e-23,1.12825e-18,2.94116e-16,9.22044e-15,2.91678e-14}
+{0.226709,0.191207,0.120442,0.042757,0.00106745}
+{0.226709,0.191207,0.120442,0.042757,0.00106745}
+{8.95501e-06,6.93111e-05,0.000149283,0.000137113,1.09339e-05}
+{1.75641e-05,0.000133342,0.00027256,0.000222842,1.18504e-05}
+{3.52974e-45,1.25377e-35,1.69764e-30,7.81291e-27,1.89714e-23}
+{7.63739e-06,5.81979e-05,0.000120152,0.00010037,5.70871e-06}
+{2.82773e-05,0.00021467,0.000438775,0.000358689,1.90631e-05}
+{0.314118,0.259864,0.155361,0.0491047,0.000818123}
+{1.03345e-25,5.66209e-21,1.65805e-18,6.74265e-17,5.36537e-16}
+{0.219889,0.177239,0.0987326,0.026625,0.000250802}
+{0.314118,0.259864,0.155361,0.0491047,0.000818123}
+{1.40537e-05,0.000106697,0.000218118,0.000178374,9.49391e-06}
+{3.76823e-14,2.363e-11,5.35729e-10,2.60446e-09,9.2247e-10}
+{1.43796e-13,9.08119e-11,2.09879e-09,1.06537e-08,4.40841e-09}
+{4.63768e-10,3.24274e-08,2.28836e-07,4.94206e-07,8.95257e-08}
+{0.226709,0.191207,0.120442,0.042757,0.00106745}
+{0.226709,0.191207,0.120442,0.042757,0.00106745}
+{0.216283,0.179544,0.108331,0.0349219,0.000618225}
+{0.314118,0.259864,0.155361,0.0491047,0.000818123}
+{3.89568e-05,0.000295738,0.000604439,0.000494046,2.62395e-05}
+{6.07551e-07,4.70292e-06,1.01322e-05,9.31253e-06,7.4443e-07}
+{0.226709,0.191207,0.120442,0.042757,0.00106745}
+{0.219889,0.177239,0.0987326,0.026625,0.000250802}
+{0.219889,0.177239,0.0987326,0.026625,0.000250802}
+{3.52025e-24,1.8978e-19,5.32011e-17,1.96355e-15,1.11642e-14}
+{1.69126e-14,1.0853e-11,2.61919e-10,1.46402e-09,8.48185e-10}
+{0.226709,0.191207,0.120442,0.042757,0.00106745}
+{0.219889,0.177239,0.0987326,0.026625,0.000250802}
+{1.0458e-05,7.73612e-05,0.000147369,0.000102844,3.0971e-06}
+{1.20034e-13,7.67869e-11,1.83777e-09,1.00903e-08,5.53271e-09}
+{1.52402e-09,1.03477e-07,6.74326e-07,1.21882e-06,1.17663e-07}
+{0.226709,0.191207,0.120442,0.042757,0.00106745}
+{4.39699e-41,1.68672e-32,6.51909e-28,1.09816e-24,6.87252e-22}
+{9.56104e-21,5.50426e-17,4.27141e-15,5.3855e-14,6.14846e-14}
+{0.216283,0.179544,0.108331,0.0349219,0.000618225}
+{1.79409e-10,1.27446e-08,9.38827e-08,2.23234e-07,5.69894e-08}
+{0.216283,0.179544,0.108331,0.0349219,0.000618225}
+{0.314118,0.259864,0.155361,0.0491047,0.000818123}
+{0.219889,0.177239,0.0987326,0.026625,0.000250802}
+{2.5613e-41,9.67587e-33,3.58766e-28,5.50998e-25,2.49682e-22}
+{1.40395e-27,6.89189e-22,6.46723e-19,5.88758e-17,9.0015e-16}
+{0.226709,0.191207,0.120442,0.042757,0.00106745}
+{0.219889,0.177239,0.0987326,0.026625,0.000250802}
+{0.219889,0.177239,0.0987326,0.026625,0.000250802}
+{2.13154e-14,1.33807e-11,3.04236e-10,1.48872e-09,5.40077e-10}
+{6.19339e-14,3.91751e-11,9.09288e-10,4.66053e-09,1.99724e-09}
+{5.6245e-37,2.33309e-29,2.58288e-25,1.6056e-22,2.67759e-20}
+{2.74766e-14,1.75769e-11,4.20666e-10,2.30958e-09,1.26639e-09}
+{0.314118,0.259864,0.155361,0.0491047,0.000818123}
+{0.219889,0.177239,0.0987326,0.026625,0.000250802}
+{0.216283,0.179544,0.108331,0.0349219,0.000618225}
+{2.42918e-06,1.88048e-05,4.05207e-05,3.72559e-05,2.98203e-06}
+{1.20215e-50,3.87273e-40,1.7368e-34,1.927e-30,1.17162e-26}
+{4.46711e-06,3.45752e-05,7.44687e-05,6.83986e-05,5.45464e-06}
+{4.13624e-111,4.65897e-89,5.05059e-77,4.45538e-68,1.96085e-58}
+{0.216283,0.179544,0.108331,0.0349219,0.000618225}
+{0.226709,0.191207,0.120442,0.042757,0.00106745}
+{0.226709,0.191207,0.120442,0.042757,0.00106745}
+{0.219889,0.177239,0.0987326,0.026625,0.000250802}
+{2.15176e-10,1.50528e-08,1.06367e-07,2.30404e-07,4.21909e-08}
+{0.314118,0.259864,0.155361,0.0491047,0.000818123}
+{1.138e-13,7.27514e-11,1.73812e-09,9.50597e-09,5.14271e-09}
+{0.314118,0.259864,0.155361,0.0491047,0.000818123}
+{6.11854e-06,4.6459e-05,9.50131e-05,7.77697e-05,4.1525e-06}
+{0.219889,0.177239,0.0987326,0.026625,0.000250802}
+{8.33924e-19,4.76824e-15,3.63234e-13,4.39334e-12,4.32277e-12}
+{1.62318e-41,6.05773e-33,2.17308e-28,3.09888e-25,1.07698e-22}
+{0.219889,0.177239,0.0987326,0.026625,0.000250802}
+{5.55167e-11,3.87029e-09,2.70972e-08,5.75414e-08,9.90961e-09}
+{0.226709,0.191207,0.120442,0.042757,0.00106745}
+{0.216283,0.179544,0.108331,0.0349219,0.000618225}
+{1.24337e-06,9.6263e-06,2.0749e-05,1.909e-05,1.5316e-06}
+{4.71087e-18,2.69972e-14,2.06929e-12,2.53761e-11,2.62282e-11}
+{3.82979e-10,2.72233e-08,2.00906e-07,4.79786e-07,1.24729e-07}
+{2.48692e-05,0.000192484,0.00041457,0.000380756,3.03537e-05}
+{0.314118,0.259864,0.155361,0.0491047,0.000818123}
+{0.314118,0.259864,0.155361,0.0491047,0.000818123}
+{2.30138e-112,2.65713e-90,3.08032e-78,3.15759e-69,2.36938e-59}
+{4.32104e-10,3.01022e-08,2.10348e-07,4.44745e-07,7.54219e-08}
+{0.219889,0.177239,0.0987326,0.026625,0.000250802}
+{8.70385e-06,6.7364e-05,0.000145071,0.000133207,1.06118e-05}
+{0.226709,0.191207,0.120442,0.042757,0.00106745}
+{0.226709,0.191207,0.120442,0.042757,0.00106745}
+{8.95852e-06,6.82558e-05,0.000140865,0.000117575,6.66635e-06}
+{0.226709,0.191207,0.120442,0.042757,0.00106745}
+{0.226709,0.191207,0.120442,0.042757,0.00106745}
+{3.66581e-24,2.0099e-19,5.89727e-17,2.40864e-15,1.94516e-14}
+{0.314118,0.259864,0.155361,0.0491047,0.000818123}
+{0.219889,0.177239,0.0987326,0.026625,0.000250802}
+{0.226709,0.191207,0.120442,0.042757,0.00106745}
+{0.314118,0.259864,0.155361,0.0491047,0.000818123}
+{2.13357e-05,0.000157847,0.000300795,0.000210078,6.3435e-06}
+{0.314118,0.259864,0.155361,0.0491047,0.000818123}
+{1.25489e-05,9.7252e-05,0.000210192,0.000194563,1.59467e-05}
+{0.226709,0.191207,0.120442,0.042757,0.00106745}
+{1.41826e-05,0.000104915,0.000199865,0.00013949,4.20179e-06}
+{0.314118,0.259864,0.155361,0.0491047,0.000818123}
+{0.314118,0.259864,0.155361,0.0491047,0.000818123}
+{1.79722e-09,1.27803e-07,9.44147e-07,2.2593e-06,5.89709e-07}
+{0.226709,0.191207,0.120442,0.042757,0.00106745}
+{0.219889,0.177239,0.0987326,0.026625,0.000250802}
+{0.219889,0.177239,0.0987326,0.026625,0.000250802}
+{2.22961e-06,1.72541e-05,3.71452e-05,3.40834e-05,2.70935e-06}
+{0.226709,0.191207,0.120442,0.042757,0.00106745}
+{0.219889,0.177239,0.0987326,0.026625,0.000250802}
+{3.8475e-15,2.47488e-12,6.01155e-11,3.40939e-10,2.08044e-10}
+{0.314118,0.259864,0.155361,0.0491047,0.000818123}
+{3.86824e-23,2.09364e-18,5.93117e-16,2.23933e-14,1.36674e-13}
+{5.54522e-99,6.8966e-78,2.26638e-66,8.37634e-58,1.54268e-48}
+{9.81776e-19,5.76846e-15,4.73133e-13,6.75544e-12,1.20526e-11}
+{1.71903e-14,1.10125e-11,2.64582e-10,1.46519e-09,8.27781e-10}
+{5.82684e-49,2.08427e-39,2.87643e-34,1.38166e-30,3.91138e-27}
+{1.06416e-18,6.23346e-15,5.07059e-13,7.10702e-12,1.18734e-11}
+{4.7872e-15,3.07188e-12,7.4128e-11,4.1426e-10,2.39839e-10}
+{0.314118,0.259864,0.155361,0.0491047,0.000818123}
+{0.314118,0.259864,0.155361,0.0491047,0.000818123}
+{3.8586e-16,2.46805e-13,5.90475e-12,3.23967e-11,1.77352e-11}
+{4.48332e-06,3.47021e-05,7.47505e-05,6.86749e-05,5.48163e-06}
+{0.314118,0.259864,0.155361,0.0491047,0.000818123}
+{2.16912e-14,1.41454e-11,3.56621e-10,2.19842e-09,1.80562e-09}
+{0.216283,0.179544,0.108331,0.0349219,0.000618225}
+{8.06824e-06,6.15024e-05,0.000127094,0.000106397,6.0987e-06}
+{8.06503e-06,6.12794e-05,0.000125547,0.000103178,5.59061e-06}
+{4.24518e-15,2.64608e-12,5.90173e-11,2.76584e-10,8.5956e-11}
+{5.74033e-24,3.11244e-19,8.86027e-17,3.38175e-15,2.14521e-14}
+{7.92911e-33,3.54294e-26,1.11183e-22,2.49139e-20,1.01714e-18}
+{1.39244e-10,9.77999e-09,6.98559e-08,1.54933e-07,3.07033e-08}
+{6.24326e-07,4.83295e-06,1.04135e-05,9.57352e-06,7.66121e-07}
+{7.71441e-20,4.41671e-16,3.37644e-14,4.11628e-13,4.16669e-13}
+{4.56895e-15,2.92174e-12,6.98584e-11,3.82746e-10,2.08478e-10}
+{0.314118,0.259864,0.155361,0.0491047,0.000818123}
+{1.00678e-27,4.99616e-22,4.82797e-19,4.69079e-17,8.97269e-16}
+{0.219889,0.177239,0.0987326,0.026625,0.000250802}
+{0.226709,0.191207,0.120442,0.042757,0.00106745}
+{3.88341e-05,0.000287297,0.000547435,0.000382261,1.15327e-05}
+{4.43554e-24,2.39134e-19,6.70425e-17,2.47483e-15,1.40727e-14}
+{8.07202e-07,6.16453e-06,1.28028e-05,1.08367e-05,6.44902e-07}
+{1.76551e-10,1.25403e-08,9.23533e-08,2.19465e-07,5.59033e-08}
+{0.314118,0.259864,0.155361,0.0491047,0.000818123}
+{0.226709,0.191207,0.120442,0.042757,0.00106745}
+{1.15863e-09,7.87054e-08,5.13561e-07,9.30965e-07,9.0843e-08}
+{0.216283,0.179544,0.108331,0.0349219,0.000618225}
+{0.216283,0.179544,0.108331,0.0349219,0.000618225}
+{0.314118,0.259864,0.155361,0.0491047,0.000818123}
+{6.14886e-06,4.66893e-05,9.54843e-05,7.81557e-05,4.17317e-06}
+{0.314118,0.259864,0.155361,0.0491047,0.000818123}
+{3.32543e-10,2.32615e-08,1.64337e-07,3.55802e-07,6.50314e-08}
+{3.48442e-06,2.64535e-05,5.40767e-05,4.42201e-05,2.35312e-06}
+{2.13894e-05,0.000162456,0.000332475,0.000272569,1.46344e-05}
+{1.77234e-10,1.25896e-08,9.27325e-08,2.2045e-07,5.62307e-08}
+{1.78137e-05,0.000131792,0.000251149,0.000175413,5.29788e-06}
+{9.89683e-30,4.42574e-23,1.39191e-19,3.13429e-17,1.30211e-15}
+{7.30123e-10,5.10675e-08,3.60686e-07,7.80449e-07,1.42333e-07}
+{0.314118,0.259864,0.155361,0.0491047,0.000818123}
+{0.314118,0.259864,0.155361,0.0491047,0.000818123}
+{3.82036e-11,2.66992e-09,1.88185e-08,4.05626e-08,7.36165e-09}
+{2.40547e-06,1.86162e-05,4.00845e-05,3.67936e-05,2.92777e-06}
+{2.55914e-15,1.67128e-12,4.22988e-11,2.63017e-10,2.22628e-10}
+{3.13487e-06,2.42807e-05,5.23958e-05,4.83296e-05,3.9125e-06}
+{0.219889,0.177239,0.0987326,0.026625,0.000250802}
+{2.34399e-10,1.63303e-08,1.14133e-07,2.41412e-07,4.09957e-08}
+{0.216283,0.179544,0.108331,0.0349219,0.000618225}
+{0.314118,0.259864,0.155361,0.0491047,0.000818123}
+{0.314118,0.259864,0.155361,0.0491047,0.000818123}
+{7.99679e-18,4.68659e-14,3.81749e-12,5.36693e-11,9.06282e-11}
+{5.08661e-38,2.15965e-30,2.54659e-26,1.82276e-23,5.00243e-21}
+{0.226709,0.191207,0.120442,0.042757,0.00106745}
+{3.50111e-06,2.5918e-05,4.94716e-05,3.468e-05,1.06115e-06}
+{0.226709,0.191207,0.120442,0.042757,0.00106745}
+{0.314118,0.259864,0.155361,0.0491047,0.000818123}
+{0.216283,0.179544,0.108331,0.0349219,0.000618225}
+{1.06187e-05,8.06227e-05,0.000164844,0.000134859,7.1878e-06}
+{0.226709,0.191207,0.120442,0.042757,0.00106745}
+{0.226709,0.191207,0.120442,0.042757,0.00106745}
+{0.226709,0.191207,0.120442,0.042757,0.00106745}
+{0.219889,0.177239,0.0987326,0.026625,0.000250802}
+{0.219889,0.177239,0.0987326,0.026625,0.000250802}
+{0.219889,0.177239,0.0987326,0.026625,0.000250802}
+{0.219889,0.177239,0.0987326,0.026625,0.000250802}
+{0.219889,0.177239,0.0987326,0.026625,0.000250802}
+{3.44916e-35,1.52735e-28,4.67714e-25,9.92017e-23,3.32624e-21}
+{0.226709,0.191207,0.120442,0.042757,0.00106745}
+{6.71634e-06,5.19854e-05,0.000111976,0.000102865,8.20801e-06}
+{0.216283,0.179544,0.108331,0.0349219,0.000618225}
+{2.51676e-11,1.7543e-09,1.22778e-08,2.60506e-08,4.47338e-09}
+{1.20815e-23,6.54714e-19,1.86106e-16,7.07972e-15,4.43674e-14}
+{0.216283,0.179544,0.108331,0.0349219,0.000618225}
+{0.314118,0.259864,0.155361,0.0491047,0.000818123}
+{0.216283,0.179544,0.108331,0.0349219,0.000618225}
+{0.216283,0.179544,0.108331,0.0349219,0.000618225}
+{0.216283,0.179544,0.108331,0.0349219,0.000618225}
+{1.1643e-14,7.26842e-12,1.6279e-10,7.7007e-10,2.47405e-10}
+{2.70164e-15,1.72896e-12,4.14252e-11,2.28026e-10,1.26303e-10}
+{1.63846e-104,2.39009e-85,6.4975e-75,3.32828e-67,4.58863e-59}
+{3.0691e-19,1.81719e-15,1.52169e-13,2.27413e-12,4.72992e-12}
+{0.314118,0.259864,0.155361,0.0491047,0.000818123}
+{1.76863e-05,0.000134793,0.000278404,0.000232786,1.32827e-05}
+{5.87898e-32,2.60244e-25,7.96215e-22,1.68532e-19,5.60956e-18}
+{2.24862e-10,1.52694e-08,9.95398e-08,1.80055e-07,1.74333e-08}
+{0.314118,0.259864,0.155361,0.0491047,0.000818123}
+{1.21241e-06,9.23601e-06,1.9053e-05,1.5888e-05,8.97961e-07}
+{0.314118,0.259864,0.155361,0.0491047,0.000818123}
+{3.18771e-09,2.17283e-07,1.43106e-06,2.64891e-06,2.7851e-07}
+{6.87058e-12,4.8511e-10,3.51541e-09,8.06e-09,1.81419e-09}
+{0.219889,0.177239,0.0987326,0.026625,0.000250802}
+{1.2388e-54,4.3638e-45,5.77775e-40,2.5308e-36,5.19862e-33}
+{2.80246e-15,1.79682e-12,4.32647e-11,2.40683e-10,1.37627e-10}
+{0.216283,0.179544,0.108331,0.0349219,0.000618225}
+{0.314118,0.259864,0.155361,0.0491047,0.000818123}
+{3.56833e-10,2.48618e-08,1.7379e-07,3.67732e-07,6.2522e-08}
+{0.314118,0.259864,0.155361,0.0491047,0.000818123}
+{8.62424e-06,6.57038e-05,0.000135569,0.0001131,6.40167e-06}
+{8.95421e-06,6.82191e-05,0.000140767,0.000117452,6.65111e-06}
+{1.10949e-15,7.0965e-13,1.69779e-11,9.31461e-11,5.09839e-11}
+{5.58492e-26,2.96358e-21,7.95752e-19,2.6653e-17,1.06599e-16}
+{1.55982e-75,3.28448e-60,6.96245e-52,9.17773e-46,2.00792e-39}
+{1.88451e-68,4.71099e-55,8.53762e-48,1.67953e-42,3.58928e-37}
+{0.226709,0.191207,0.120442,0.042757,0.00106745}
+{5.54912e-11,3.86852e-09,2.70847e-08,5.75152e-08,9.90567e-09}
+{0.226709,0.191207,0.120442,0.042757,0.00106745}
+{0.314118,0.259864,0.155361,0.0491047,0.000818123}
+{4.48902e-10,3.18869e-08,2.34862e-07,5.58277e-07,1.4235e-07}
+{2.19398e-26,1.05953e-20,9.51021e-18,7.83523e-16,8.3705e-15}
+{1.33433e-19,8.03268e-16,7.03479e-14,1.16112e-12,3.40306e-12}
+{1.58783e-05,0.000122776,0.000263728,0.000240778,1.8793e-05}
+{4.87924e-06,3.7175e-05,7.67189e-05,6.40307e-05,3.62977e-06}
+{3.00667e-18,1.73659e-14,1.35962e-12,1.74878e-11,2.14545e-11}
+{4.60862e-15,2.95012e-12,7.07322e-11,3.89927e-10,2.1701e-10}
+{6.633e-30,3.21313e-24,2.90823e-21,2.44099e-19,2.78345e-18}
+{1.21816e-06,9.2831e-06,1.91686e-05,1.60187e-05,9.12227e-07}
+{2.31799e-05,0.000176276,0.000361988,0.000299017,1.64833e-05}
+{0.226709,0.191207,0.120442,0.042757,0.00106745}
+{0.216283,0.179544,0.108331,0.0349219,0.000618225}
+{0.314118,0.259864,0.155361,0.0491047,0.000818123}
+{0.219889,0.177239,0.0987326,0.026625,0.000250802}
+{0.219889,0.177239,0.0987326,0.026625,0.000250802}
+{8.33911e-10,5.6614e-08,3.68824e-07,6.66197e-07,6.41694e-08}
+{3.48762e-06,2.64621e-05,5.40066e-05,4.40023e-05,2.31113e-06}
+{3.67166e-19,2.10313e-15,1.60986e-13,1.96827e-12,2.01269e-12}
+{1.75459e-05,0.000133204,0.000272278,0.000222612,1.18381e-05}
+{1.40866e-05,0.000104205,0.000198512,0.000138546,4.17334e-06}
+{0.226709,0.191207,0.120442,0.042757,0.00106745}
+{0.216283,0.179544,0.108331,0.0349219,0.000618225}
+{1.42266e-05,0.000108005,0.000220774,0.00018051,9.60083e-06}
+{3.46963e-09,2.42655e-07,1.71338e-06,3.70498e-06,6.73886e-07}
+{1.24342e-06,9.44324e-06,1.93222e-05,1.58338e-05,8.4899e-07}
+{0.219889,0.177239,0.0987326,0.026625,0.000250802}
+{0.226709,0.191207,0.120442,0.042757,0.00106745}
+{1.55241e-05,0.000118279,0.000244099,0.000203735,1.15498e-05}
+{0.226709,0.191207,0.120442,0.042757,0.00106745}
+{9.70715e-07,7.41694e-06,1.54244e-05,1.3094e-05,7.86864e-07}
+{2.19794e-15,1.43601e-12,3.63872e-11,2.26851e-10,1.93774e-10}
+{0.314118,0.259864,0.155361,0.0491047,0.000818123}
+{0.216283,0.179544,0.108331,0.0349219,0.000618225}
+{0.216283,0.179544,0.108331,0.0349219,0.000618225}
+{5.00872e-05,0.000380226,0.000777071,0.00063505,3.37025e-05}
+{0.314118,0.259864,0.155361,0.0491047,0.000818123}
+{1.93003e-15,1.23073e-12,2.92025e-11,1.57302e-10,8.07542e-11}
+{0.314118,0.259864,0.155361,0.0491047,0.000818123}
+{1.40855e-05,0.000104204,0.000198547,0.000138628,4.182e-06}
+{1.41303e-05,0.000107285,0.00021936,0.00017946,9.56517e-06}
+{0.314118,0.259864,0.155361,0.0491047,0.000818123}
+{1.2051e-06,8.91549e-06,1.69888e-05,1.18641e-05,3.58162e-07}
+{6.73554e-10,4.71037e-08,3.32554e-07,7.18903e-07,1.30653e-07}
+{0.216283,0.179544,0.108331,0.0349219,0.000618225}
+{0.314118,0.259864,0.155361,0.0491047,0.000818123}
+{3.15566e-18,1.84107e-14,1.48138e-12,2.02606e-11,3.09912e-11}
+{0.216283,0.179544,0.108331,0.0349219,0.000618225}
+{1.052e-05,7.98666e-05,0.000163259,0.000133491,7.10149e-06}
+{3.28165e-10,2.28683e-08,1.59929e-07,3.38761e-07,5.78216e-08}
+{0.216283,0.179544,0.108331,0.0349219,0.000618225}
+{3.39622e-06,2.63019e-05,5.67403e-05,5.23026e-05,4.22515e-06}
+{1.57254e-09,1.06943e-07,6.99962e-07,1.27758e-06,1.27691e-07}
+{3.04916e-06,2.36053e-05,5.08714e-05,4.67859e-05,3.74863e-06}
+{5.99701e-10,4.17735e-08,2.91822e-07,6.16617e-07,1.04327e-07}
+{5.75138e-05,0.000436608,0.000892317,0.000729257,3.87005e-05}
+{4.21463e-34,1.94917e-27,6.71518e-24,1.8537e-21,1.5813e-19}
+{6.53145e-16,4.19186e-13,1.012e-11,5.66136e-11,3.28997e-11}
+{0.216283,0.179544,0.108331,0.0349219,0.000618225}
+{4.81035e-07,3.66998e-06,7.60163e-06,6.39644e-06,3.73118e-07}
+{2.31825e-18,1.32597e-14,1.01097e-12,1.22515e-11,1.21373e-11}
+{1.18593e-09,8.24897e-08,5.7401e-07,1.20227e-06,1.9708e-07}
+{9.93507e-19,5.83446e-15,4.77895e-13,6.80282e-12,1.20101e-11}
+{9.02041e-06,6.98217e-05,0.000150409,0.0001382,1.10357e-05}
+{0.314118,0.259864,0.155361,0.0491047,0.000818123}
+{0.226709,0.191207,0.120442,0.042757,0.00106745}
+{4.44718e-06,3.38801e-05,6.99023e-05,5.83097e-05,3.29903e-06}
+{0.219889,0.177239,0.0987326,0.026625,0.000250802}
+{9.67238e-07,7.1768e-06,1.37844e-05,9.79665e-06,3.14129e-07}
+{2.30357e-32,1.02244e-25,3.15083e-22,6.77792e-20,2.38924e-18}
+{5.42653e-19,3.24805e-15,2.80113e-13,4.47175e-12,1.17671e-11}
+{4.23813e-49,1.49362e-39,1.97976e-34,8.68668e-31,1.77971e-27}
+{3.21907e-19,1.92235e-15,1.64755e-13,2.59375e-12,6.49646e-12}
+{3.16453e-10,2.20514e-08,1.54202e-07,3.26568e-07,5.57043e-08}
+{5.13849e-10,3.49146e-08,2.27983e-07,4.13955e-07,4.06462e-08}
+{1.24022e-06,9.41863e-06,1.927e-05,1.57876e-05,8.45813e-07}
+{0.216283,0.179544,0.108331,0.0349219,0.000618225}
+{0.216283,0.179544,0.108331,0.0349219,0.000618225}
+{4.15664e-15,2.66747e-12,6.43835e-11,3.60007e-10,2.08998e-10}
+{0.226709,0.191207,0.120442,0.042757,0.00106745}
+{0.219889,0.177239,0.0987326,0.026625,0.000250802}
+{0.219889,0.177239,0.0987326,0.026625,0.000250802}
+{0.219889,0.177239,0.0987326,0.026625,0.000250802}
+{0.226709,0.191207,0.120442,0.042757,0.00106745}
+{1.09933e-10,7.64968e-09,5.32883e-08,1.11886e-07,1.85068e-08}
+{0.314118,0.259864,0.155361,0.0491047,0.000818123}
+{0.219889,0.177239,0.0987326,0.026625,0.000250802}
+{4.05923e-14,2.5326e-11,5.66355e-10,2.67056e-09,8.50456e-10}
+{0.219889,0.177239,0.0987326,0.026625,0.000250802}
+{2.28404e-06,1.70183e-05,3.3053e-05,2.40614e-05,8.32378e-07}
+{2.75327e-30,1.38589e-24,1.39191e-21,1.47449e-19,3.83809e-18}
+{3.36022e-119,2.98559e-94,1.36757e-80,2.36494e-70,5.26017e-59}
+{1.29701e-98,2.15519e-80,1.93259e-70,5.00842e-63,5.61763e-55}
+{3.97305e-12,2.73307e-10,1.84533e-09,3.61103e-09,4.62446e-10}
+{0.226709,0.191207,0.120442,0.042757,0.00106745}
+{8.99545e-06,6.8535e-05,0.000141428,0.000118021,6.68684e-06}
+{7.35799e-40,3.08635e-32,3.52145e-28,2.3412e-25,4.93817e-23}
+{0.314118,0.259864,0.155361,0.0491047,0.000818123}
+{1.62442e-07,1.20225e-06,2.29341e-06,1.60553e-06,4.89051e-08}
+{5.2266e-24,2.86135e-19,8.36142e-17,3.38417e-15,2.64668e-14}
+{8.59716e-25,4.63065e-20,1.29493e-17,4.75304e-16,2.6487e-15}
+{1.18002e-27,6.20137e-23,1.62203e-20,5.12351e-19,1.66515e-18}
+{7.88205e-15,5.04103e-12,1.20573e-10,6.61153e-10,3.61327e-10}
+{0.314118,0.259864,0.155361,0.0491047,0.000818123}
+{0.226709,0.191207,0.120442,0.042757,0.00106745}
+{1.76278e-20,1.03475e-16,8.46535e-15,1.20184e-13,2.10251e-13}
+{1.40181e-05,0.000106423,0.000217539,0.000177866,9.46029e-06}
+{0.219889,0.177239,0.0987326,0.026625,0.000250802}
+{1.23804e-14,7.95686e-12,1.92829e-10,1.08796e-09,6.5172e-10}
+{0.314118,0.259864,0.155361,0.0491047,0.000818123}
+{0.226709,0.191207,0.120442,0.042757,0.00106745}
+{2.44466e-06,1.86262e-05,3.84409e-05,3.20865e-05,1.8197e-06}
+{6.47302e-14,4.21957e-11,1.06268e-09,6.5354e-09,5.32166e-09}
+{0.314118,0.259864,0.155361,0.0491047,0.000818123}
+{0.226709,0.191207,0.120442,0.042757,0.00106745}
+{0.226709,0.191207,0.120442,0.042757,0.00106745}
+{0.219889,0.177239,0.0987326,0.026625,0.000250802}
+{0.219889,0.177239,0.0987326,0.026625,0.000250802}
+{0.314118,0.259864,0.155361,0.0491047,0.000818123}
+{0.216283,0.179544,0.108331,0.0349219,0.000618225}
+{0.314118,0.259864,0.155361,0.0491047,0.000818123}
+{0.314118,0.259864,0.155361,0.0491047,0.000818123}
+{0.226709,0.191207,0.120442,0.042757,0.00106745}
+{0.314118,0.259864,0.155361,0.0491047,0.000818123}
+{0.219889,0.177239,0.0987326,0.026625,0.000250802}
+{0.226709,0.191207,0.120442,0.042757,0.00106745}
+{2.54626e-10,1.78244e-08,1.26192e-07,2.7465e-07,5.14509e-08}
+{1.76292e-05,0.000133843,0.000273623,0.000223782,1.19136e-05}
+{7.54579e-10,5.25796e-08,3.67648e-07,7.78422e-07,1.3264e-07}
+{0.314118,0.259864,0.155361,0.0491047,0.000818123}
+{0.216283,0.179544,0.108331,0.0349219,0.000618225}
+{0.216283,0.179544,0.108331,0.0349219,0.000618225}
+{1.37149e-23,7.20219e-19,1.87997e-16,5.91102e-15,1.88948e-14}
+{0.219889,0.177239,0.0987326,0.026625,0.000250802}
+{0.219889,0.177239,0.0987326,0.026625,0.000250802}
+{0.314118,0.259864,0.155361,0.0491047,0.000818123}
+{0.219889,0.177239,0.0987326,0.026625,0.000250802}
+{0.314118,0.259864,0.155361,0.0491047,0.000818123}
+{0.216283,0.179544,0.108331,0.0349219,0.000618225}
+{1.87332e-06,1.42291e-05,2.91255e-05,2.38868e-05,1.28448e-06}
+{0.226709,0.191207,0.120442,0.042757,0.00106745}
+{6.13575e-06,4.65897e-05,9.52806e-05,7.79888e-05,4.16428e-06}
+{0.216283,0.179544,0.108331,0.0349219,0.000618225}
+{0.226709,0.191207,0.120442,0.042757,0.00106745}
+{4.01728e-16,2.59505e-13,6.37643e-12,3.71146e-11,2.48902e-11}
+{2.55564e-18,1.52887e-14,1.31662e-12,2.0951e-11,5.44982e-11}
+{0.226709,0.191207,0.120442,0.042757,0.00106745}
+{4.25145e-19,2.43727e-15,1.86989e-13,2.29801e-12,2.3945e-12}
+{0.314118,0.259864,0.155361,0.0491047,0.000818123}
+{0.226709,0.191207,0.120442,0.042757,0.00106745}
+{1.76584e-10,1.25427e-08,9.23709e-08,2.19507e-07,5.59139e-08}
+{1.11309e-19,6.53196e-16,5.33978e-14,7.56804e-13,1.31591e-12}
+{1.25527e-53,4.06773e-43,1.85338e-37,2.12936e-33,1.45689e-29}
+{1.20754e-19,7.19281e-16,6.12213e-14,9.48986e-13,2.24855e-12}
+{0.314118,0.259864,0.155361,0.0491047,0.000818123}
+{0.219889,0.177239,0.0987326,0.026625,0.000250802}
+{1.94573e-10,1.36134e-08,9.62326e-08,2.0862e-07,3.82945e-08}
+{0.314118,0.259864,0.155361,0.0491047,0.000818123}
+{1.51548e-45,5.34408e-36,7.09483e-31,3.12389e-27,6.47252e-24}
+{1.30601e-28,6.48331e-23,6.27132e-20,6.10985e-18,1.1869e-16}
+{0.219889,0.177239,0.0987326,0.026625,0.000250802}
+{0.219889,0.177239,0.0987326,0.026625,0.000250802}
+{2.72341e-23,1.43179e-18,3.74886e-16,1.18688e-14,3.8884e-14}
+{0.314118,0.259864,0.155361,0.0491047,0.000818123}
+{0.314118,0.259864,0.155361,0.0491047,0.000818123}
+{1.75954e-18,1.04796e-14,8.91672e-13,1.38118e-11,3.265e-11}
+{4.66028e-10,3.2585e-08,2.29941e-07,4.96555e-07,8.99276e-08}
+{0.226709,0.191207,0.120442,0.042757,0.00106745}
+{0.314118,0.259864,0.155361,0.0491047,0.000818123}
+{1.77197e-05,0.000134527,0.000275001,0.000224873,1.19649e-05}
+{0.226709,0.191207,0.120442,0.042757,0.00106745}
+{4.18443e-06,3.2418e-05,7.00028e-05,6.46684e-05,5.26338e-06}
+{0.219889,0.177239,0.0987326,0.026625,0.000250802}
+{0.216283,0.179544,0.108331,0.0349219,0.000618225}
+{4.48251e-06,3.46857e-05,7.46568e-05,6.84684e-05,5.43104e-06}
+{0.216283,0.179544,0.108331,0.0349219,0.000618225}
+{0.216283,0.179544,0.108331,0.0349219,0.000618225}
+{1.34448e-16,8.77222e-14,2.2147e-12,1.36965e-11,1.13834e-11}
+{1.16732e-16,7.49655e-14,1.81295e-12,1.01815e-11,6.00045e-12}
+{0.219889,0.177239,0.0987326,0.026625,0.000250802}
+{8.41948e-10,5.71863e-08,3.73025e-07,6.75703e-07,6.57491e-08}
+{0.219889,0.177239,0.0987326,0.026625,0.000250802}
+{0.219889,0.177239,0.0987326,0.026625,0.000250802}
+{0.226709,0.191207,0.120442,0.042757,0.00106745}
+{0.226709,0.191207,0.120442,0.042757,0.00106745}
+{0.314118,0.259864,0.155361,0.0491047,0.000818123}
+{3.47293e-05,0.000264768,0.000547332,0.000458527,2.63325e-05}
+{0.226709,0.191207,0.120442,0.042757,0.00106745}
+{2.0521e-05,0.000158831,0.000342088,0.000314191,2.50497e-05}
+{2.0478e-05,0.000156029,0.000322037,0.000268842,1.52516e-05}
+{0.314118,0.259864,0.155361,0.0491047,0.000818123}
+{0.314118,0.259864,0.155361,0.0491047,0.000818123}
+{3.52748e-06,2.67941e-05,5.48486e-05,4.49901e-05,2.42048e-06}
+{1.27872e-15,8.18884e-13,1.96558e-11,1.08635e-10,6.10262e-11}
+{0.226709,0.191207,0.120442,0.042757,0.00106745}
+{1.24648e-18,7.31552e-15,5.98207e-13,8.48371e-12,1.47818e-11}
+{8.74647e-06,6.66457e-05,0.000137573,0.000114885,6.52569e-06}
+{1.49611e-05,0.000110758,0.000211437,0.000148262,4.54286e-06}
+{7.40589e-20,4.35427e-16,3.57775e-14,5.12778e-13,9.25381e-13}
+{1.05104e-05,7.97932e-05,0.000163109,0.000133368,7.09493e-06}
+{9.95621e-24,5.34367e-19,1.47989e-16,5.31277e-15,2.72278e-14}
+{1.05094e-15,6.85308e-13,1.72752e-11,1.06465e-10,8.73784e-11}
+{1.75467e-05,0.000129802,0.000247284,0.000172597,5.20029e-06}
+{0.219889,0.177239,0.0987326,0.026625,0.000250802}
+{1.33682e-22,7.03183e-18,1.84381e-15,5.85628e-14,1.94052e-13}
+{0.314118,0.259864,0.155361,0.0491047,0.000818123}
+{0.314118,0.259864,0.155361,0.0491047,0.000818123}
+{1.40728e-05,0.000106838,0.000218388,0.00017856,9.49718e-06}
+{6.97993e-06,5.2991e-05,0.000108323,8.85752e-05,4.71269e-06}
+{0.219889,0.177239,0.0987326,0.026625,0.000250802}
+{0.216283,0.179544,0.108331,0.0349219,0.000618225}
+{0.226709,0.191207,0.120442,0.042757,0.00106745}
+{0.216283,0.179544,0.108331,0.0349219,0.000618225}
+{7.95667e-06,6.02903e-05,0.000122602,9.90832e-05,5.05484e-06}
+{0.314118,0.259864,0.155361,0.0491047,0.000818123}
+{0.226709,0.191207,0.120442,0.042757,0.00106745}
+{2.11438e-05,0.000160517,0.000328102,0.000268241,1.42619e-05}
+{0.314118,0.259864,0.155361,0.0491047,0.000818123}
+{0.226709,0.191207,0.120442,0.042757,0.00106745}
+{6.80697e-10,4.62317e-08,3.01527e-07,5.46024e-07,5.30722e-08}
+{0.314118,0.259864,0.155361,0.0491047,0.000818123}
+{7.83936e-14,4.88463e-11,1.08839e-09,5.08955e-09,1.56942e-09}
+{8.35503e-32,3.69645e-25,1.12921e-21,2.38206e-19,7.83387e-18}
+{0.226709,0.191207,0.120442,0.042757,0.00106745}
+{0.216283,0.179544,0.108331,0.0349219,0.000618225}
+{7.00704e-06,5.31811e-05,0.000108624,8.86617e-05,4.6869e-06}
+{0.219889,0.177239,0.0987326,0.026625,0.000250802}
+{0.314118,0.259864,0.155361,0.0491047,0.000818123}
+{0.226709,0.191207,0.120442,0.042757,0.00106745}
+{2.83067e-05,0.000209407,0.000398978,0.000278538,8.39813e-06}
+{0.216283,0.179544,0.108331,0.0349219,0.000618225}
+{1.8344e-05,0.000139263,0.000284662,0.000232735,1.23759e-05}
+{1.21599e-06,9.26388e-06,1.91138e-05,1.59445e-05,9.02223e-07}
+{5.02161e-11,3.51105e-09,2.47745e-08,5.34926e-08,9.68411e-09}
+{7.8518e-19,4.63839e-15,3.86014e-13,5.68955e-12,1.12669e-11}
+{0.314118,0.259864,0.155361,0.0491047,0.000818123}
+{0.226709,0.191207,0.120442,0.042757,0.00106745}
+{0.226709,0.191207,0.120442,0.042757,0.00106745}
+{0.219889,0.177239,0.0987326,0.026625,0.000250802}
+{1.59889e-40,5.98234e-32,2.16098e-27,3.13009e-24,1.15059e-21}
+{0.216283,0.179544,0.108331,0.0349219,0.000618225}
+{1.77613e-05,0.00013484,0.000275621,0.000225344,1.19833e-05}
+{8.40748e-34,3.82103e-27,1.25563e-23,3.11917e-21,1.83642e-19}
+{6.22759e-16,3.99634e-13,9.64483e-12,5.3916e-11,3.12575e-11}
+{0.226709,0.191207,0.120442,0.042757,0.00106745}
+{0.219889,0.177239,0.0987326,0.026625,0.000250802}
+{0.216283,0.179544,0.108331,0.0349219,0.000618225}
+{0.314118,0.259864,0.155361,0.0491047,0.000818123}
+{1.57474e-09,1.07995e-07,7.23147e-07,1.38929e-06,1.66957e-07}
+{2.20274e-15,1.43682e-12,3.62484e-11,2.23793e-10,1.84773e-10}
+{0.226709,0.191207,0.120442,0.042757,0.00106745}
+{5.01693e-11,3.51273e-09,2.48812e-08,5.41825e-08,1.01064e-08}
+{6.57869e-11,4.67271e-09,3.44102e-08,8.17602e-08,2.08168e-08}
+{6.99272e-06,5.17457e-05,9.8668e-05,6.9006e-05,2.09416e-06}
+{1.12319e-09,7.83119e-08,5.48468e-07,1.16552e-06,2.01177e-07}
+{0.314118,0.259864,0.155361,0.0491047,0.000818123}
+{0.226709,0.191207,0.120442,0.042757,0.00106745}
+{0.219889,0.177239,0.0987326,0.026625,0.000250802}
+{0.216283,0.179544,0.108331,0.0349219,0.000618225}
+{6.96606e-06,5.28857e-05,0.000108108,8.83992e-05,4.70334e-06}
+{0.226709,0.191207,0.120442,0.042757,0.00106745}
+{2.3924e-15,1.53661e-12,3.71745e-11,2.08933e-10,1.23444e-10}
+{6.19e-07,4.70017e-06,9.6123e-06,7.86787e-06,4.20131e-07}
+{0.216283,0.179544,0.108331,0.0349219,0.000618225}
+{3.32821e-10,2.36401e-08,1.74097e-07,4.13715e-07,1.05381e-07}
+{0.216283,0.179544,0.108331,0.0349219,0.000618225}
+{0.216283,0.179544,0.108331,0.0349219,0.000618225}
+{1.39814e-05,0.00010613,0.000216862,0.000177167,9.39549e-06}
+{7.04164e-06,5.35128e-05,0.000109685,9.02315e-05,4.90376e-06}
+{0.314118,0.259864,0.155361,0.0491047,0.000818123}
+{4.46788e-06,3.45811e-05,7.44815e-05,6.84103e-05,5.45554e-06}
+{0.219889,0.177239,0.0987326,0.026625,0.000250802}
+{0.219889,0.177239,0.0987326,0.026625,0.000250802}
+{3.08034e-09,2.14576e-07,1.49913e-06,3.16825e-06,5.36212e-07}
+{0.314118,0.259864,0.155361,0.0491047,0.000818123}
+{0.219889,0.177239,0.0987326,0.026625,0.000250802}
+{8.93401e-06,6.80638e-05,0.000140439,0.000117164,6.63191e-06}
+{0.314118,0.259864,0.155361,0.0491047,0.000818123}
+{0.226709,0.191207,0.120442,0.042757,0.00106745}
+{1.26679e-18,7.57123e-15,6.50342e-13,1.02897e-11,2.6235e-11}
+{0.216283,0.179544,0.108331,0.0349219,0.000618225}
+{0.216283,0.179544,0.108331,0.0349219,0.000618225}
+{3.68453e-06,2.80797e-05,5.79889e-05,4.84741e-05,2.7635e-06}
+{0.314118,0.259864,0.155361,0.0491047,0.000818123}
+{0.314118,0.259864,0.155361,0.0491047,0.000818123}
+{0.226709,0.191207,0.120442,0.042757,0.00106745}
+{0.219889,0.177239,0.0987326,0.026625,0.000250802}
+{0.314118,0.259864,0.155361,0.0491047,0.000818123}
+{0.216283,0.179544,0.108331,0.0349219,0.000618225}
+{0.314118,0.259864,0.155361,0.0491047,0.000818123}
+{0.314118,0.259864,0.155361,0.0491047,0.000818123}
+{1.96574e-05,0.000149419,0.000306447,0.000252422,1.37764e-05}
+{0.216283,0.179544,0.108331,0.0349219,0.000618225}
+{3.67566e-06,2.80042e-05,5.77886e-05,4.82231e-05,2.73204e-06}
+{9.7782e-41,4.13636e-33,4.82919e-29,3.38082e-26,8.58654e-24}
+{0.226709,0.191207,0.120442,0.042757,0.00106745}
+{3.75587e-06,2.90946e-05,6.28072e-05,5.79813e-05,4.70753e-06}
+{1.37335e-09,9.75753e-08,7.19122e-07,1.71166e-06,4.38372e-07}
+{0.216283,0.179544,0.108331,0.0349219,0.000618225}
+{4.76875e-11,3.32336e-09,2.32464e-08,4.92622e-08,8.42213e-09}
+{1.77613e-05,0.00013484,0.000275621,0.000225344,1.19833e-05}
+{0.314118,0.259864,0.155361,0.0491047,0.000818123}
+{0.314118,0.259864,0.155361,0.0491047,0.000818123}
+{1.39794e-14,9.12491e-12,2.3064e-10,1.42998e-09,1.19871e-09}
+{1.39636e-05,0.000103294,0.000196777,0.000137335,4.1368e-06}
+{0.226709,0.191207,0.120442,0.042757,0.00106745}
+{9.13787e-10,6.36855e-08,4.45534e-07,9.44438e-07,1.61627e-07}
+{0.314118,0.259864,0.155361,0.0491047,0.000818123}
+{0.314118,0.259864,0.155361,0.0491047,0.000818123}
+{8.94766e-06,6.81678e-05,0.000140654,0.000117343,6.64205e-06}
+{0.314118,0.259864,0.155361,0.0491047,0.000818123}
+{8.21369e-22,4.333e-17,1.14509e-14,3.70156e-13,1.30628e-12}
+{1.04552e-05,7.73408e-05,0.00014733,0.000102817,3.09628e-06}
+{0.314118,0.259864,0.155361,0.0491047,0.000818123}
+{0.226709,0.191207,0.120442,0.042757,0.00106745}
+{3.36141e-10,2.35117e-08,1.66076e-07,3.59418e-07,6.5586e-08}
+{0.314118,0.259864,0.155361,0.0491047,0.000818123}
+{0.216283,0.179544,0.108331,0.0349219,0.000618225}
+{4.72256e-15,3.02308e-12,7.24845e-11,3.9965e-10,2.22708e-10}
+{0.226709,0.191207,0.120442,0.042757,0.00106745}
+{0.314118,0.259864,0.155361,0.0491047,0.000818123}
+{0.226709,0.191207,0.120442,0.042757,0.00106745}
+{0.219889,0.177239,0.0987326,0.026625,0.000250802}
+{0.219889,0.177239,0.0987326,0.026625,0.000250802}
+{1.05396e-05,7.80278e-05,0.000148966,0.000104471,3.2016e-06}
+{6.0991e-07,4.51662e-06,8.62942e-06,6.0623e-06,1.8695e-07}
+{0.216283,0.179544,0.108331,0.0349219,0.000618225}
+{1.15751e-10,8.08599e-09,5.69227e-08,1.22304e-07,2.18393e-08}
+{0.226709,0.191207,0.120442,0.042757,0.00106745}
+{2.42576e-06,1.79491e-05,3.42176e-05,2.39194e-05,7.24657e-07}
+{7.70261e-37,3.25686e-29,3.79761e-25,2.65097e-22,6.65769e-20}
+{0.216283,0.179544,0.108331,0.0349219,0.000618225}
+{0.216283,0.179544,0.108331,0.0349219,0.000618225}
+{7.35259e-06,5.60227e-05,0.000115633,9.6542e-05,5.47947e-06}
+{0.314118,0.259864,0.155361,0.0491047,0.000818123}
+{5.4337e-05,0.00040233,0.00076839,0.000539305,1.65656e-05}
+{5.49948e-37,2.28107e-29,2.52505e-25,1.57004e-22,2.63435e-20}
+{0.226709,0.191207,0.120442,0.042757,0.00106745}
+{0.314118,0.259864,0.155361,0.0491047,0.000818123}
+{3.5406e-10,2.51492e-08,1.85222e-07,4.40205e-07,1.12177e-07}
+{3.4989e-13,2.1808e-10,4.86324e-09,2.27827e-08,7.06663e-09}
+{3.04916e-06,2.36053e-05,5.08714e-05,4.67859e-05,3.74863e-06}
+{3.67157e-05,0.000284178,0.000612075,0.000562179,4.48158e-05}
+{3.55574e-05,0.000269934,0.000551709,0.000450967,2.39567e-05}
+{1.05002e-05,7.97144e-05,0.000162939,0.000133214,7.08361e-06}
+{6.90453e-50,2.60524e-41,9.62765e-37,1.46672e-33,6.41538e-31}
+{8.08215e-07,6.17228e-06,1.2819e-05,1.08506e-05,6.4577e-07}
+{1.23734e-05,9.3968e-05,0.000192254,0.000157509,8.43697e-06}
+{1.05586e-05,8.01593e-05,0.000163857,0.000133979,7.12726e-06}
+{5.22193e-19,3.06592e-15,2.50968e-13,3.56739e-12,6.26419e-12}
+{3.20731e-15,2.05111e-12,4.90486e-11,2.68818e-10,1.46592e-10}
+{1.22137e-06,9.30486e-06,1.91983e-05,1.60151e-05,9.06219e-07}
+{0.314118,0.259864,0.155361,0.0491047,0.000818123}
+{0.216283,0.179544,0.108331,0.0349219,0.000618225}
+{7.23733e-10,5.14068e-08,3.78591e-07,8.99671e-07,2.29096e-07}
+{1.35214e-05,0.000103015,0.000212568,0.000177363,1.00439e-05}
+{0.226709,0.191207,0.120442,0.042757,0.00106745}
+{1.46572e-13,9.13617e-11,2.03774e-09,9.54994e-09,2.9666e-09}
+{0.314118,0.259864,0.155361,0.0491047,0.000818123}
+{3.48442e-06,2.64535e-05,5.40767e-05,4.42201e-05,2.35312e-06}
+{1.31893e-31,5.96386e-25,1.933e-21,4.65721e-19,2.4653e-17}
+{6.72747e-06,5.20716e-05,0.000112161,0.000103036,8.22169e-06}
+{0.226709,0.191207,0.120442,0.042757,0.00106745}
+{0.219889,0.177239,0.0987326,0.026625,0.000250802}
+{5.49791e-06,4.06975e-05,7.76703e-05,5.4429e-05,1.66361e-06}
+{0.216283,0.179544,0.108331,0.0349219,0.000618225}
+{3.66608e-06,2.78354e-05,5.69167e-05,4.65701e-05,2.48341e-06}
+{0.314118,0.259864,0.155361,0.0491047,0.000818123}
+{0.216283,0.179544,0.108331,0.0349219,0.000618225}
+{0.314118,0.259864,0.155361,0.0491047,0.000818123}
+{0.219889,0.177239,0.0987326,0.026625,0.000250802}
+{0.219889,0.177239,0.0987326,0.026625,0.000250802}
+{1.34593e-18,7.71704e-15,5.9227e-13,7.28354e-12,7.59527e-12}
+{0.314118,0.259864,0.155361,0.0491047,0.000818123}
+{0.226709,0.191207,0.120442,0.042757,0.00106745}
+{0.219889,0.177239,0.0987326,0.026625,0.000250802}
+{0.216283,0.179544,0.108331,0.0349219,0.000618225}
+{0.219889,0.177239,0.0987326,0.026625,0.000250802}
+{4.44409e-24,2.3342e-19,6.09605e-17,1.91895e-15,6.15931e-15}
+{1.21042e-14,7.75353e-12,1.86241e-10,1.0309e-09,5.81975e-10}
+{7.04164e-06,5.35128e-05,0.000109685,9.02315e-05,4.90376e-06}
+{0.226709,0.191207,0.120442,0.042757,0.00106745}
+{5.4337e-05,0.00040233,0.00076839,0.000539305,1.65656e-05}
+{0.226709,0.191207,0.120442,0.042757,0.00106745}
+{2.87681e-24,1.55105e-19,4.34896e-17,1.60577e-15,9.13622e-15}
+{0.216283,0.179544,0.108331,0.0349219,0.000618225}
+{0.216283,0.179544,0.108331,0.0349219,0.000618225}
+{2.62623e-11,1.83271e-09,1.28668e-08,2.74918e-08,4.8392e-09}
+{3.21725e-07,2.38227e-06,4.55034e-06,3.19471e-06,9.82778e-08}
+{0.314118,0.259864,0.155361,0.0491047,0.000818123}
+{1.64493e-09,1.11716e-07,7.28535e-07,1.31892e-06,1.28073e-07}
+};
+
+
+exepectedRateClassAssignments =
+{{                 0,                 3,                 3,                 0,                 2,                 4,                 0,                 3,                 0,                 0,                 2,                 3,                 0,                 2,                 2,                 0,                 0,                 0,                 2,                 0,                 2,                 0,                 0,                 0,                 0,                [...]
+};
+
+
+ExecuteAFile ("../Shared/REL_utils.bf");
+marginalErrors = checkMarginalReconstruction ( expectedConditionalProbabilities, exepectedRateClassAssignments, "flu_LF");
+
+/* test epilogue */
+	timeMatrix = endTestTimer 				  (_testDescription);
+	if (logTestResult (Abs (res_flu_LF[1][0] - _expectedLL) < 0.01 && marginalErrors[0] < 0.0001 && marginalErrors[1] == 0))
+	{
+		return timeMatrix;
+	}
+	return 0;
+/* end test epilogue */
\ No newline at end of file
diff --git a/tests/hbltests/REL/ModelMixture.bf b/tests/hbltests/REL/ModelMixture.bf
new file mode 100644
index 0000000..92acc3c
--- /dev/null
+++ b/tests/hbltests/REL/ModelMixture.bf
@@ -0,0 +1,3074 @@
+#NEXUS
+
+BEGIN TAXA;
+	DIMENSIONS NTAX = 25;
+	TAXLABELS
+		'RUFESCENS' 'SORENSENI' 'WALALLENSIS' 'KAMTSCHATKANA' 'SIEBOLDII' 'DISCUS_HANNAI' 'GIGANTEA' 'CORRUGATA' 'CRACHERODII' 'FULGENS' 'ROEI' 'SCALARIS' 'LAEVIGATA' 'CYCLOBATES' 'RUBRA' 'CONICOPORA' 'PUSTULATA' 'MIDAE' 'OVINA' 'DIVERSICOLOR' 'VARIA' 'AUSTRALIS' 'TUBERCULATA' 'COCCINEA' 'IRIS' ;
+END;
+
+BEGIN CHARACTERS;
+	DIMENSIONS NCHAR = 402;
+	FORMAT
+		DATATYPE = DNA
+		GAP=-
+		MISSING=?
+	;
+
+MATRIX
+	'RUFESCENS'      CGCAGCTGGCATTATGTTGAACCCAAGTTTTTAAACAAGGCTTTTGAAGTTGCACTGAAGGTACAGATCATTGCTGGATTCGATAGAGGGCTGGTCAAATGGCTTAGAGTTCATGGCAGAACATTGTCTACCGTTCAGAAGAAGGCGCTGTACTTCGTCAATAGACGTTACATGCAGACCCACTGGGCGAATTACATGCTCTGGATAAATAAGAAGATCGATGCACTGGGCAGAACTCCAGTTGTTGGTGACTACACACGGTTAGGTGCCGAAATTGGAAGACGTATTGATATGGCTTACTTTTACGACTTCCTGAAAGATAAGAACATGATCCCAAAATATCTGCCATACATGGAAGAAATTAATAGAATGCGCCCGGCAGATGTCCCAGTTAAATACATG
+	'SORENSENI'      CGCCGCTGGCATTATGTTCCACCCAAGTTTTTAAACAAGGCTTTTGAAGTTGCACTGAAGGTACAGATCATTGCTGGATTCGATAGAACGCTGGTCAAATGGCTTAGAACTCATGGCGGAACATTGTCTCACGTTCAGAAGAAGGCGCTGTACTTCGTCAATAGACGTTACATGCAGACCCACTGGGCGAACTACATGCTCTGGATAAATAAGAAGACCGATGCACTGGGCAGAACTCCAGTTGTTGGTGACTACACACGGTTAGGTGCCGAAATTGGAAGACGTATTGATATGGATTACTTTTACAACTTCCTGAAAGGGAGGAACATGATCCCAAAATATCTGCCATACATGGAAGAAATTAATAGAATGCGCTCGGCAGATATCCCAGTTAAATACATG
+	'WALALLENSIS'    CGCCGCTGGAATTTTGTTACACCCAGGGAGGTAAACAAGGCTTTTGAAGTTGCACTGAAGGTACAGATCATTGCTGGATTCGATAGAACGCTGGTCAAATGGCTTAGAGCTCATGGCAGATCATTGTCTCACGTTCAGAAGAAGGCGCTGTACTTCGTCAATAGACGTTACATGCAGACCCACTGGGCGAATTACATGCTCTGGGTAAATAAGAAGATCGATGCACTGGGCAGAACTGCAGTTGTTGCTGACTACACACGGTTAGGTGCCGAAATTGGAAGACGTATTGACATGGATTACTTTTACAACTTCCTGAAAGGAAGGAACATGATCCCAAAATATCTGCCATACATGGAAGAAATTAATAGAATGCGCTCGGCAGATATCCCAATTAGATAC---
+	'KAMTSCHATKANA'  CGCAGCTGGACTTATGTTCAACCCAAGTTTTTAAACAAGGCTTTTGAAGTTGCACTGAAGGAAGAGATCATTGTTCGATGGGATAGAAAGCTGGCCAAATGGCTTAGAGTTAATGGCGGACCATTGTCTCACGTTCAGAAGAAGGCGCTGTACTTCGTCAATAGACGTTACATGCAGACCCACTGGGCGAATTACATGCTCTGGATAAATAAGAAGACCGATGCACTGGGCAGAACTCCAGTTGTTGGTGACTACAGACGGTTAGGTGCCGAAATTGGAAGACGTATTGATATGGTTTTCTTTTACAAATTCCTGTCAGGGAGGAACATGATCCCAAAATATATGCCATACATGGAGCAGATTAATAGAATGCGCGCGGCAGATATCCCAGTTAAATACATG
+	'SIEBOLDII'      CGCCGCTGGCATTTTGTTCAACATCAGTATGTAGACAAGGCTTTTGAAATTGCACTGAAGGAAGAGATCGTTGCTGGATTCGACAGAACGCTGGTCAAATGGCTTAGAGTTCATGGCAGAGGTTTGACTCCAGTTCAGAAGAAGGCGCTGTACTTCGTCAATAGACGTTACATGCAGACCCACTGGCAGAATTACATGCTCTGGATAGTCAAGAAGATCGATGCACTGGGCAGAACTCCAGTTGTTGGTGACTACAGACGGTTAGGTGCCGAAATTGGAAGACGTATTGATATGGATTATTTTTACAACTTCCTGAAAAATAGGAACATGATCCCAAAATATATGCCATACATGGAAGAACTTAATAGAATGCCCGCGAGAGATATCCCAGTTAAAAAC---
+	'DISCUS_HANNAI'  CGCCGCTGGAATTTTGTTCGACATCAGTATGTAAACAAGGCTTTTGAAATTGCACTGAAGGAAGAGATCGTTGCTGGATTCGATAGAACGCTGAACAAATGGCTTAGCGCTCATGGCAGAGGTTTGACTCCAGATCAGAGGAAGGCGCTGTTCTTCGTCAATAGACGTTACATGCAGACCCACTGGCAGAATTACATGCTCTGGGTAGTGAAGAAGATCGATGCACTGGGCAGAACTCCAGTTGTTGCTGACTACAGACGGTTAGGTGCCGAAATTGGAAGACGTATTGATATGGATTATTTTTACAACTTCCTGAAAAATAGGAACATGATCCCAAAATATGTGAGATACATGGCCGCACTTAATAGAATGCCAGCGAGAGATATCCCAGTTAAAAAC---
+	'GIGANTEA'       CGCCGCTGGAATTTTGTTCGACATCAGTATGTAAACAAGGCTTTTGAAATTGCACTGAAGGAAGAGATCGTTGCTGGATTCGATAGAACGCTGAACAAATGGCTTAGCGCTCATGGCAGAGGTTTGACTCCAGATCAGAGGAAGGCGCTGTTCTTCGTCAATAGACGTTACATGCAGACCCACTGGCAGAATTACATGCTCTGGGTAGTGAAGAAGATCGATGCACTGGGCAGAACTCCAGTTGTTGCTGACTACAGACGGTTAGGTGCCGAAATTGGAAGACGTATTGATATGGATTATTTTTACAACTTCCTGAAAAATAGGAACATGATCCCAAAATATGTGGGATACATGGCCGAACTTAATAGAATGCCAGCGAGAGATATCCCAGTTAAAAAC---
+	'CORRUGATA'      CGCCGCTTCCGTTTTATTCCACATAAGTATATACGCAAGGAGTTTGAAGTTGCACTGAAGGTAGAGATCATTGCCGGATTCGATAGAACGCTGGTCAAATGGCTTAGAGTTCATGGCGGACGTTTGAGTACAGTTCAGAAGAAGGCGCTGTACTTCGTCAATAGACGTTACATGCAGACCCACTGGCAGAATTACATGCTCTGGATAGTGAGGAAGACCGATGCACTGGGCAGACCTCCAGTTGTTGCTGACTACAGTCGGTTAGGTGCCGAAATTGGAAGACGTATTGATATGGCATATTTTTACAACTTCCTGAACGGGAGGAACATGATCCCAAAATATCTGCCATACATGGAGGAAATTAATAGAATGCGCCCGGCAGATGTCCCAGTTGCAAAC---
+	'CRACHERODII'    CGCCGCTATCAATTTGTTCAACATCAGTATATTCGCAAGGCTTTTGAAGTTGCACTGAAGGTAGAGATCATTGCTGGATTCGACAGAACGCTGGTCAAATGGCTTAGAAATCATGGCAGAGGTTTGAATGAAAATCAGAGGAAGGTGCTGTACTTCGTCAATAGACGTTACATGCAGACCCACTGGCAGAATTACATGCTCTGGATAGTGAAGAAGACCAATGCACTGGGCAGACCTCCAGTTGTTGCTGACTACCGTGCGTTGGGTGCCGAAATTGGAAGACGTATTGATATGGGATATTTTTACAACTTCCTGAAAAATAGGGTCATGATCCCAAAATATTTGCCATACATGCGAAGACTTAATAATATGCGCCCGGAAGATGTCCCAGTTGCAAACAAC
+	'FULGENS'        CGCCGATGGACTTTTGTTCGATATCATTATATAAACAAGGCTTATGAAGTTACAATGAAGATACAGATCATTTCTGGATTCGATAGACAGCTGACCGCATGGCTCAGAGTTCATGGCAGACGTTTGACTAATAATCAGAAGAAGACGCTGTTCTTCGTCAATAGACGTTACATGCAGACCCACTGGCAGAATTACATGCTCTGGGTTAAGAGGAAGATCAAGGCACTGGGCAGACCCGCAGCTGTTGGTGACTACACTCGGTTAGGTGCCGAAATAGGAAGACGTGTTGATATGGTATTTTTTTACAACTTCCTGTCCGGGAGAAAAATGATCCCACCATACAGCGCATATATGGCAAAACTTAATGCCTTGCGCCCGGCAGATGTCCCAGTTAAAAAC---
+	'ROEI'           CGCCATTGGCACTTTGTTGCCCACAAACATGTTTCCAGGCCTTTTGAAGTTGCACTGAAGGTCCAGATCATTGCTGGGTTTGATAGACAGTTGGCCTCCTGGCTTCAACGTCATGGCAGGCGTTTAAGCGCAATTCAGAAGAAGACGCTGTACTTCGTTAATAGGCGTTACATGCAGACTCACTGGCAAGCTTACATGGTGTGGATAGTCAAGCAGATAGAAAAACTTGGTAGGTCACCCAACGTTGGCGACTACAGCTACGTTGGTGCCGAGATCGGAAGACGTATTCCTTTGGAAGTAACCTACAGCTTTTTGGTCAGGAGAAACTTGATCCCTCAATGGCGTCAGTACATGGCAAACCTTATGGCCAAACGCGTGGAAGATATCCCAGTT---------
+	'SCALARIS'       CGCCGATGGGTCTTTACGCCCCACAAACATGTTGCCAGGCAATTTGAAGTTGCACTGAAGGTCCAGATCATTGCTGGGTTTGATAGAAAGTTGGTTAACTGGCTTCGACGTCATGGCAAGTATGTGAGCGCAATTCAGAGGAAGTCGCTGTACTTCGTTAATAGGCGTTACATGCAGACTCACTGGCAAGCTTACATGGTGTGGATAGTCAAGCAAGTAGCCAAACTTGGTAGGCCACCCACCGTTAGCGACTACAGCTACGTTGGTGCCGAGATCGGAAGACGTATTCCTTTGGAAGTAACCTACAGCTTTTTGGTCAGGAGAAACTTGATCCCTGAAATGCGTCAGTACATGAGAGACCTTAATGCCAAACGCGTGGAAGATATCCCAGTT---------
+	'LAEVIGATA'      CGCCGATGGCACTTTGTTCCCCACACACATGTTGCCAGGCCTTTTGAAGTTGCACTGAAGGTCCAGATCATTGCTGGGTTTGATAGAAAGTTGGTTGCCTGGCTTCAACGTCATGGCAGGCATCTAAGCGCAATTCAGAAGAAGTCGCTGTACTTCGTTAATAGGCGTTACATGCAGACTCACTGGCAAGCTTACATGGTGTGGATAGCTAAGCAAGTAGCCAAACTTGGTAGGGCACCCACCGTTAACGACTACAGTCGCATTGGTGCCGAGATCGGAAGACGTATTCCTTTGGAAGTAACCTACAGCTTTTTGGTCAGGAGAAACTTGATCCCTCGAATGCGTCAGTTCATGAGAGACCTTATTGCCAAACCCGTGCAAGATATCCCAATT---------
+	'CYCLOBATES'     CGCCGATGGCACTTTACTGCCCACAGGAGAATTTCCAGGCGTTTTGAAGCTGCACTGAAGGTCCAGATCATTCTTGGGTTTGATAAAAAGTTGGCCACCTGGCTTGCACGTTATGGCAAGAATTTGAGCGCAATTCATAAGAAGACGCTGTACTTCTATAATAGGCGTCACATGCAGACTCACTGGCAATCCTACATGAGGTTCACAGAGAAGGATATAAGAAAACTTGGTAGGCCACCCAACAGTAACGACTACACTCGCATTGGTGCCGAGATCGGAAGACGTATTCCTATTGAATTGATGTACAGCTTTATGGTCAGGAGAAACATGATCCCTAGATGGCGTCCGTATATGGGAGTCCTTCTGTCCAAACGCAAGGAAGATATCCCAGTTAAT------
+	'RUBRA'          CGCCGATGGCACTTTGTTGCCCACAGACATGTTTCCAGGCAATTTGAAGTTGCACTGAAGGTCCAGATCATGGCTGGGTTTGATAAAAAGTTGACCAATTGGCTTGCACGTCATGGCAGGAATTTGAGCCCAATTCAGAAGAAGACGCTGTACTTCGTTAATAGGCGTTACATGCAGACTCACTGGCAGATGTACATGCAGTTCATAGTCAAGGAGATAGACAAACTTGGTAGGGCACCCAACGTTAACGACTACAGTCGCGTTGGTGCCGAGATCGGAAGACGTATTCCTCTGGAAGTAACCTACAGCTTTTTGGTCAGGAGAAACTTGATCCCTAGATGGCGTCAGTACATGGGAAACCTTCTGGCCAAACGCGTGGAAAATATCCCAATT---------
+	'CONICOPORA'     CGCCGATGGCACTTTGTTGCCCACAGACATGTTTCCAGGCAATTTGAAGTTGCACTGAAGGTCCAGATCATGGCTGGGTTTGATAAAAAGTTGGCCAATTGGCTTGCACGTCATGGCAGGAATTTGAGCCCAATTCAGAAGAAGACGCTGTACTTCGTTAATAGGCGTTACATGCAGACTCACTGGCAGATGTACATGCAGTTCATAGTCAAGGAGATAAACAAACTTGGTAGGGCACCCAACGTTAACGACTACAGTCGCGTTGGTGCCGAGATCGGAAGACGTATTCCTCTGGAAGTAACCTACAGCTTTTTGGTCAGGAGAAACTTGATCCCTAGATGGCGTCAGTACATGGGAAACCTTCTGGCCAAACGCGTGGAAAATATCCCAATT---------
+	'PUSTULATA'      CGCCACTGGGGCTTTGTTCCACACAGACGTCTTGCCAGGCAATTTGAAGTTGCACTGAAGGTACAGATCATCGCTGGGTTTGATAGAAAATTGTCTGGCTGGCTTACCCGTCATGGCAGTCGTTTAAGTCCAATTCAGAGGAAGACGCTGTACTTTGTCAACAGACGTTATATGCAGACTCTCTGGCAAAACTACTTTCGGTTCGTAGCGAGGAGAATCGGCAAACTTGGAAGGGCTCCCAACGTGAACGACTACAATGCCGTAGGTGCCGAAATCGGAAGACGTGTTCCTTTGGAAGTGACCTATAGCTTTTTGGTCAGGCGAAACTTGATCCCAACTTGGCGTCAGTACATGGCAAATCTTTTGGCCAGACGTGTGGAAGATATCCCAGTT---------
+	'MIDAE'          CGCCGTTTTTATTTTATTAGGCACCAGTATCTTGCCAAGCCATTTGAAGTTGCACTCAAGGTACAGATCGTTGCTGGGTTTGACAGAAAGTTGACTGCCTGGCTTCGACGTCATGGCAGCCATGTGAGCGCAATTAAGAGGAAGACGCTGTACTTCGTTAATAGACGTTACATGCAGACTCACTGGCAAGCCTACATGGTGTGGATTGTCAGGAAGATCAAAGCACTTGGAAGGCCACCCACCGTCGCAGATTACACTGCACTTGGTGCCGAGATCGGAAGACGTATTCCTTTGGAAGTAACCTACAGCTTTTTGGTCAGGAGAAACTTGATCCCTTCCTGGCGTCCGTACATGGCAAGACTTATGGCCAAACGTCCGGCAGATATCCCAATT---------
+	'OVINA'          CGCCGTTGGGCCTTTATTCCCCCCACACGTATTCCCAGGGCTCATGAAGTTGCACTGAAGGTACAGATCATTGCTGGCTGGAACAGAAAGCTGGCCAACTGGCTTGCACGACATGGCAGTCGTTTGAGTGCAATTCAGAAGAAGACGCTGTACTTTGTGAACAGACGTTATATGCAGACTCACTGGCCATCCTACATGATATTTGTCAAGAAGCAGATAGCTAGACTTGGTAGGCCAGGCAACACTAACGACTACAGTCGCCTGGGTGCCGAGATCGGAAGACGTATTCCTATGGAAGTAAACTACAGCTTTCTGGTCAGGAGAAACTTGATCCCACGATGGCGTCAGTACATGGCAAACCTCATGGCCAAACGCGTGGAAGATATCCCAGTT---------
+	'DIVERSICOLOR'   CGCGGTTGGGGCTATATTCCCCGCACACGTCTAAACAGGGCTTTTGAAGTTGCACTGAAGGTGCAGATCATCGCTGGGTTTGATAGAAAGCTGACCAGCTGGCTTGGACGCCATGGTAGTCGTTTGAGTGCAATTCAGAGGAAGACGCTGTACTTCGTTAACAGGCGCTATCTGCAAACTCACTGGTCAGCCTACATGGTTTGGATAAACAAGCGGATAGCCGCACTTGGTAGAACAGCCACGACTGCAGACTACAATAACCTTGGTGCCGAGATCGGAAGACGTATTCCTATGGAAGTAACATACAGCTTTTTGGTCAGGAGAAACTTGATCCCCAAATGGCGTCCATATATGGCAGCCATTATGGCCAAATCAGCGGCAGATCTTGAAGTTGCA------
+	'VARIA'          CGCCGTTGGACCTTTATTCCGCGCAAACGTCTTCCGATGGCTCATGAAGTTGCATTAAAGGTAGAGATCATTGCTGGGTTCAACAAAAAACTGGACATCTGGCTTGCACGACATGGCAGTCGTTTGAGTCCAATTCAGAAGAAGACGCTGTACTTTGTGAACAGACGTTATATGCAGACTCACTGGTCTAATTACATGTTGTGGGTTAAAAGGCGGATAAATAGTCTTGGAAGGCCAGGTACTACGGCAGACTACAGAAACCTCGGTGCTGAGATTGGAAGACGTGTTCCTTTGGAATTAACCTATAGCTTTTTGGTCCGGAGAAACTTGATCCCACAATGGCGTCAGTACATGGCAGACCTTATGGCCAGACGCGTGGCAGATATCCCAGTTGCA------
+	'AUSTRALIS'      CGCCGTTGGAGATTTGTTCCCCACGTACAAGTTAACAGGTCTTTTGAAGTGGCACTGAAGGTACAGATCATTGCTGGGTTTGATAGAAAGTTGACAAGCTGGCTTTCACGTCATGGGCGTCGTCTGAACGCAGTTCAGAGGAAGACGTTGTACTTCGTCAACAGACGTTACATGCAGACTCACTGGCAATCTTACATGGTGTGGATAAACAAGCAGATCGCCAAACTTGGAAGGACTGCCACCGATGCCGACTACGCTAGCGTTGGTGCCGAAATCGGAAGACGTATTCCTCTGGAACTTACCTACAGCTTTTTGGTCAGGAGAAACTTGATCCCAAGATGGCGCCCATACATGGCAGCCCTTATGGCCAAGCGCGTGCAAGATATCCCAGTTGCAAAT---
+	'TUBERCULATA'    ---------------------------CACCTTACCAGGCAATTTGAAGTTGCTCTGAAGGTACAGATCATTGCTGGGTTTGATAAAAAGTTGGCTACCTGGATTAACCGTCATGGCAGTGGTTTAAGCGCAGTTCAGAAGAAGACGCTGTACTTTGTCAACAGACGTTATATGCAGACTTACTGGCAAAACTACATGCTGTTCGTAGATGAGAAGATACGAAAACTTGGAAGGGCTCCCAACGTTAACGACTACACTGCCATCGGTGCCGAAATTGGAAGACGTGTTCCTTTGCAAATAACATACCCCATTATGATCAAGTACCACATTCTTCCAAAATGGCGTCCGTACATGGGAAAAATTTTGGCCCTACGTGTGGAAGATATCCCAGTTGATTAT---
+	'COCCINEA'       ---------------------------CAACTTACCAGGCAATTTGAAGTTGCTCTGAAGGTACAGATCATTGCTGGGTTTGATAAAAAGTTGGCTGCCTGGATTAACCGTCATGGCAGGGGTTTAAGTGCAGTTCAGAAGAAGACGCTGTACTTTGTCAACAGACGTTATATGCAGACTTACTGGCAAAACTACATGCTGTTCGTAGATGAGAAGATACGAAAACTTGGAAGGGCTCCCAACGTTAACGACTACACTGCCATCGGTGCCGAAATTGGAAGACGTGTTCCTTTGCAAATAACATACCCCATTTTGATCAAGTACAACATTCTTCCAAAATGGCATCCGTACATGGGGAAAGTTTTGAGCCTACGTGTGGAAGATATCCCAGTTGATTAT---
+	'IRIS'           ---GGGTGGGGCTATCCACCAGGGACCTTTTTATCAAAAGCTAAGTTAAGTGCACTGAAGACACAGATCATTGCTGGGTTCGATAGAAAGCTGGCCAGTTGGCTTAGACGTCATGGCAATCGTTTGAGCGCAATTCAGAAGAAGACGCTGTACTTCGTCAATAGACGTTACATGCAGACTCACTGGCGCTCTTACATGAAATTCGTACGAAATCAGATGAAATTACTTGGTAGAGCTGAAACCACTGCGGACTACAATCGCGTAGGTGCCGCAATTGGAAAACGCATTCCCTTGGAAATAACGTACAGCTTTTTAGTCAGGAGGAACTTGATACCTAAATGGAAACCGTACATGGCACGACTTATGGCCAGACGCCCAGGTGATATCCCAACTTCG------;
+END;
+
+BEGIN TREES;
+	TREE tree = ((FULGENS,(((KAMTSCHATKANA,(RUFESCENS,(SORENSENI,WALALLENSIS)NODE9)NODE7)NODE5,(SIEBOLDII,(DISCUS_HANNAI,GIGANTEA)NODE14)NODE12)NODE4,(CORRUGATA,CRACHERODII)NODE17)NODE3)NODE1,IRIS,((PUSTULATA,(COCCINEA,TUBERCULATA)NODE24)NODE22,(AUSTRALIS,((MIDAE,((ROEI,(SCALARIS,LAEVIGATA)NODE35)NODE33,(CYCLOBATES,(RUBRA,CONICOPORA)NODE40)NODE38)NODE32)NODE30,((OVINA,VARIA)NODE44,DIVERSICOLOR)NODE43)NODE29)NODE27)NODE21);
+END;
+
+BEGIN HYPHY;
+
+/* test preamble */
+
+	_testDescription 		= " fit the general bivariate MG94xREV model with 5 rate classes to a lysin alignment.";
+	_expectedLL 			= -4342.96;
+	ExecuteAFile 			("../Shared/TestInstrumentation.bf");
+	startTestTimer 			(_testDescription);
+	
+/* end test preamble */
+
+
+global codonFactor=1;
+global S_0=0.5;
+S_0:>1e-07;
+global S_1=1.342438557686713;
+global S_2=1.462721607130293;
+global S_3=0.006904038502130698;
+global P_3=0.501243626308445;
+P_3:<1;
+global P_1=0.2971856621456794;
+P_1:<1;
+global S_4=0.0109507280714569;
+global P_4=0.5698460657243346;
+P_4:<1;
+global P_2=0.4830442031378996;
+P_2:<1;
+global R_0=0.08222210929495997;
+global CT=0.6291171928769415;
+global AT=0.4609446887622178;
+global CG=0.6064196635287339;
+global AC=0.7886604510211515;
+global NS_4=1.698773849849638;
+global GT=0.2558607550004903;
+global NS_3=0.3303428965899049;
+global NS_2=2.741773900106499;
+global NS_1=1.032408633517949;
+global NS_0:=R_0*S_0;
+global c_scale:=P_1*S_0+(1-P_1)*P_2*S_1+(1-P_1)*(1-P_2)*P_3*S_2+(1-P_1)*(1-P_2)*(1-P_3)*P_4*S_3+(1-P_1)*(1-P_2)*(1-P_3)*(1-P_4)*S_4;
+
+rate_matrix_0={61,61};
+rate_matrix_0[0][1]:=NS_0/c_scale*AC*synRate*0.250149;
+rate_matrix_0[0][2]:=S_0/c_scale*synRate*0.260597;
+rate_matrix_0[0][3]:=NS_0/c_scale*AT*synRate*0.279104;
+rate_matrix_0[0][4]:=NS_0/c_scale*AC*synRate*0.166866;
+rate_matrix_0[0][8]:=NS_0/c_scale*synRate*0.221194;
+rate_matrix_0[0][12]:=NS_0/c_scale*AT*synRate*0.306866;
+rate_matrix_0[0][16]:=NS_0/c_scale*AC*synRate*0.223284;
+rate_matrix_0[0][32]:=NS_0/c_scale*synRate*0.264776;
+rate_matrix_0[1][0]:=NS_0/c_scale*AC*synRate*0.210149;
+rate_matrix_0[1][2]:=NS_0/c_scale*CG*synRate*0.260597;
+rate_matrix_0[1][3]:=S_0/c_scale*CT*synRate*0.279104;
+rate_matrix_0[1][5]:=NS_0/c_scale*AC*synRate*0.166866;
+rate_matrix_0[1][9]:=NS_0/c_scale*synRate*0.221194;
+rate_matrix_0[1][13]:=NS_0/c_scale*AT*synRate*0.306866;
+rate_matrix_0[1][17]:=NS_0/c_scale*AC*synRate*0.223284;
+rate_matrix_0[1][33]:=NS_0/c_scale*synRate*0.264776;
+rate_matrix_0[1][48]:=NS_0/c_scale*AT*synRate*0.171642;
+rate_matrix_0[2][0]:=S_0/c_scale*synRate*0.210149;
+rate_matrix_0[2][1]:=NS_0/c_scale*CG*synRate*0.250149;
+rate_matrix_0[2][3]:=NS_0/c_scale*GT*synRate*0.279104;
+rate_matrix_0[2][6]:=NS_0/c_scale*AC*synRate*0.166866;
+rate_matrix_0[2][10]:=NS_0/c_scale*synRate*0.221194;
+rate_matrix_0[2][14]:=NS_0/c_scale*AT*synRate*0.306866;
+rate_matrix_0[2][18]:=NS_0/c_scale*AC*synRate*0.223284;
+rate_matrix_0[2][34]:=NS_0/c_scale*synRate*0.264776;
+rate_matrix_0[3][0]:=NS_0/c_scale*AT*synRate*0.210149;
+rate_matrix_0[3][1]:=S_0/c_scale*CT*synRate*0.250149;
+rate_matrix_0[3][2]:=NS_0/c_scale*GT*synRate*0.260597;
+rate_matrix_0[3][7]:=NS_0/c_scale*AC*synRate*0.166866;
+rate_matrix_0[3][11]:=NS_0/c_scale*synRate*0.221194;
+rate_matrix_0[3][15]:=NS_0/c_scale*AT*synRate*0.306866;
+rate_matrix_0[3][19]:=NS_0/c_scale*AC*synRate*0.223284;
+rate_matrix_0[3][35]:=NS_0/c_scale*synRate*0.264776;
+rate_matrix_0[3][49]:=NS_0/c_scale*AT*synRate*0.171642;
+rate_matrix_0[4][0]:=NS_0/c_scale*AC*synRate*0.305075;
+rate_matrix_0[4][5]:=S_0/c_scale*AC*synRate*0.250149;
+rate_matrix_0[4][6]:=S_0/c_scale*synRate*0.260597;
+rate_matrix_0[4][7]:=S_0/c_scale*AT*synRate*0.279104;
+rate_matrix_0[4][8]:=NS_0/c_scale*CG*synRate*0.221194;
+rate_matrix_0[4][12]:=NS_0/c_scale*CT*synRate*0.306866;
+rate_matrix_0[4][20]:=NS_0/c_scale*AC*synRate*0.223284;
+rate_matrix_0[4][36]:=NS_0/c_scale*synRate*0.264776;
+rate_matrix_0[4][50]:=NS_0/c_scale*AT*synRate*0.171642;
+rate_matrix_0[5][1]:=NS_0/c_scale*AC*synRate*0.305075;
+rate_matrix_0[5][4]:=S_0/c_scale*AC*synRate*0.210149;
+rate_matrix_0[5][6]:=S_0/c_scale*CG*synRate*0.260597;
+rate_matrix_0[5][7]:=S_0/c_scale*CT*synRate*0.279104;
+rate_matrix_0[5][9]:=NS_0/c_scale*CG*synRate*0.221194;
+rate_matrix_0[5][13]:=NS_0/c_scale*CT*synRate*0.306866;
+rate_matrix_0[5][21]:=NS_0/c_scale*AC*synRate*0.223284;
+rate_matrix_0[5][37]:=NS_0/c_scale*synRate*0.264776;
+rate_matrix_0[5][51]:=NS_0/c_scale*AT*synRate*0.171642;
+rate_matrix_0[6][2]:=NS_0/c_scale*AC*synRate*0.305075;
+rate_matrix_0[6][4]:=S_0/c_scale*synRate*0.210149;
+rate_matrix_0[6][5]:=S_0/c_scale*CG*synRate*0.250149;
+rate_matrix_0[6][7]:=S_0/c_scale*GT*synRate*0.279104;
+rate_matrix_0[6][10]:=NS_0/c_scale*CG*synRate*0.221194;
+rate_matrix_0[6][14]:=NS_0/c_scale*CT*synRate*0.306866;
+rate_matrix_0[6][22]:=NS_0/c_scale*AC*synRate*0.223284;
+rate_matrix_0[6][38]:=NS_0/c_scale*synRate*0.264776;
+rate_matrix_0[6][52]:=NS_0/c_scale*AT*synRate*0.171642;
+rate_matrix_0[7][3]:=NS_0/c_scale*AC*synRate*0.305075;
+rate_matrix_0[7][4]:=S_0/c_scale*AT*synRate*0.210149;
+rate_matrix_0[7][5]:=S_0/c_scale*CT*synRate*0.250149;
+rate_matrix_0[7][6]:=S_0/c_scale*GT*synRate*0.260597;
+rate_matrix_0[7][11]:=NS_0/c_scale*CG*synRate*0.221194;
+rate_matrix_0[7][15]:=NS_0/c_scale*CT*synRate*0.306866;
+rate_matrix_0[7][23]:=NS_0/c_scale*AC*synRate*0.223284;
+rate_matrix_0[7][39]:=NS_0/c_scale*synRate*0.264776;
+rate_matrix_0[7][53]:=NS_0/c_scale*AT*synRate*0.171642;
+rate_matrix_0[8][0]:=NS_0/c_scale*synRate*0.305075;
+rate_matrix_0[8][4]:=NS_0/c_scale*CG*synRate*0.166866;
+rate_matrix_0[8][9]:=NS_0/c_scale*AC*synRate*0.250149;
+rate_matrix_0[8][10]:=S_0/c_scale*synRate*0.260597;
+rate_matrix_0[8][11]:=NS_0/c_scale*AT*synRate*0.279104;
+rate_matrix_0[8][12]:=NS_0/c_scale*GT*synRate*0.306866;
+rate_matrix_0[8][24]:=S_0/c_scale*AC*synRate*0.223284;
+rate_matrix_0[8][40]:=NS_0/c_scale*synRate*0.264776;
+rate_matrix_0[9][1]:=NS_0/c_scale*synRate*0.305075;
+rate_matrix_0[9][5]:=NS_0/c_scale*CG*synRate*0.166866;
+rate_matrix_0[9][8]:=NS_0/c_scale*AC*synRate*0.210149;
+rate_matrix_0[9][10]:=NS_0/c_scale*CG*synRate*0.260597;
+rate_matrix_0[9][11]:=S_0/c_scale*CT*synRate*0.279104;
+rate_matrix_0[9][13]:=NS_0/c_scale*GT*synRate*0.306866;
+rate_matrix_0[9][25]:=NS_0/c_scale*AC*synRate*0.223284;
+rate_matrix_0[9][41]:=NS_0/c_scale*synRate*0.264776;
+rate_matrix_0[9][54]:=NS_0/c_scale*AT*synRate*0.171642;
+rate_matrix_0[10][2]:=NS_0/c_scale*synRate*0.305075;
+rate_matrix_0[10][6]:=NS_0/c_scale*CG*synRate*0.166866;
+rate_matrix_0[10][8]:=S_0/c_scale*synRate*0.210149;
+rate_matrix_0[10][9]:=NS_0/c_scale*CG*synRate*0.250149;
+rate_matrix_0[10][11]:=NS_0/c_scale*GT*synRate*0.279104;
+rate_matrix_0[10][14]:=NS_0/c_scale*GT*synRate*0.306866;
+rate_matrix_0[10][26]:=S_0/c_scale*AC*synRate*0.223284;
+rate_matrix_0[10][42]:=NS_0/c_scale*synRate*0.264776;
+rate_matrix_0[10][55]:=NS_0/c_scale*AT*synRate*0.171642;
+rate_matrix_0[11][3]:=NS_0/c_scale*synRate*0.305075;
+rate_matrix_0[11][7]:=NS_0/c_scale*CG*synRate*0.166866;
+rate_matrix_0[11][8]:=NS_0/c_scale*AT*synRate*0.210149;
+rate_matrix_0[11][9]:=S_0/c_scale*CT*synRate*0.250149;
+rate_matrix_0[11][10]:=NS_0/c_scale*GT*synRate*0.260597;
+rate_matrix_0[11][15]:=NS_0/c_scale*GT*synRate*0.306866;
+rate_matrix_0[11][27]:=NS_0/c_scale*AC*synRate*0.223284;
+rate_matrix_0[11][43]:=NS_0/c_scale*synRate*0.264776;
+rate_matrix_0[11][56]:=NS_0/c_scale*AT*synRate*0.171642;
+rate_matrix_0[12][0]:=NS_0/c_scale*AT*synRate*0.305075;
+rate_matrix_0[12][4]:=NS_0/c_scale*CT*synRate*0.166866;
+rate_matrix_0[12][8]:=NS_0/c_scale*GT*synRate*0.221194;
+rate_matrix_0[12][13]:=S_0/c_scale*AC*synRate*0.250149;
+rate_matrix_0[12][14]:=NS_0/c_scale*synRate*0.260597;
+rate_matrix_0[12][15]:=S_0/c_scale*AT*synRate*0.279104;
+rate_matrix_0[12][28]:=NS_0/c_scale*AC*synRate*0.223284;
+rate_matrix_0[12][44]:=NS_0/c_scale*synRate*0.264776;
+rate_matrix_0[12][57]:=NS_0/c_scale*AT*synRate*0.171642;
+rate_matrix_0[13][1]:=NS_0/c_scale*AT*synRate*0.305075;
+rate_matrix_0[13][5]:=NS_0/c_scale*CT*synRate*0.166866;
+rate_matrix_0[13][9]:=NS_0/c_scale*GT*synRate*0.221194;
+rate_matrix_0[13][12]:=S_0/c_scale*AC*synRate*0.210149;
+rate_matrix_0[13][14]:=NS_0/c_scale*CG*synRate*0.260597;
+rate_matrix_0[13][15]:=S_0/c_scale*CT*synRate*0.279104;
+rate_matrix_0[13][29]:=NS_0/c_scale*AC*synRate*0.223284;
+rate_matrix_0[13][45]:=NS_0/c_scale*synRate*0.264776;
+rate_matrix_0[13][58]:=NS_0/c_scale*AT*synRate*0.171642;
+rate_matrix_0[14][2]:=NS_0/c_scale*AT*synRate*0.305075;
+rate_matrix_0[14][6]:=NS_0/c_scale*CT*synRate*0.166866;
+rate_matrix_0[14][10]:=NS_0/c_scale*GT*synRate*0.221194;
+rate_matrix_0[14][12]:=NS_0/c_scale*synRate*0.210149;
+rate_matrix_0[14][13]:=NS_0/c_scale*CG*synRate*0.250149;
+rate_matrix_0[14][15]:=NS_0/c_scale*GT*synRate*0.279104;
+rate_matrix_0[14][30]:=NS_0/c_scale*AC*synRate*0.223284;
+rate_matrix_0[14][46]:=NS_0/c_scale*synRate*0.264776;
+rate_matrix_0[14][59]:=NS_0/c_scale*AT*synRate*0.171642;
+rate_matrix_0[15][3]:=NS_0/c_scale*AT*synRate*0.305075;
+rate_matrix_0[15][7]:=NS_0/c_scale*CT*synRate*0.166866;
+rate_matrix_0[15][11]:=NS_0/c_scale*GT*synRate*0.221194;
+rate_matrix_0[15][12]:=S_0/c_scale*AT*synRate*0.210149;
+rate_matrix_0[15][13]:=S_0/c_scale*CT*synRate*0.250149;
+rate_matrix_0[15][14]:=NS_0/c_scale*GT*synRate*0.260597;
+rate_matrix_0[15][31]:=NS_0/c_scale*AC*synRate*0.223284;
+rate_matrix_0[15][47]:=NS_0/c_scale*synRate*0.264776;
+rate_matrix_0[15][60]:=NS_0/c_scale*AT*synRate*0.171642;
+rate_matrix_0[16][0]:=NS_0/c_scale*AC*synRate*0.340299;
+rate_matrix_0[16][17]:=NS_0/c_scale*AC*synRate*0.250149;
+rate_matrix_0[16][18]:=S_0/c_scale*synRate*0.260597;
+rate_matrix_0[16][19]:=NS_0/c_scale*AT*synRate*0.279104;
+rate_matrix_0[16][20]:=NS_0/c_scale*AC*synRate*0.166866;
+rate_matrix_0[16][24]:=NS_0/c_scale*synRate*0.221194;
+rate_matrix_0[16][28]:=NS_0/c_scale*AT*synRate*0.306866;
+rate_matrix_0[16][32]:=NS_0/c_scale*CG*synRate*0.264776;
+rate_matrix_0[17][1]:=NS_0/c_scale*AC*synRate*0.340299;
+rate_matrix_0[17][16]:=NS_0/c_scale*AC*synRate*0.210149;
+rate_matrix_0[17][18]:=NS_0/c_scale*CG*synRate*0.260597;
+rate_matrix_0[17][19]:=S_0/c_scale*CT*synRate*0.279104;
+rate_matrix_0[17][21]:=NS_0/c_scale*AC*synRate*0.166866;
+rate_matrix_0[17][25]:=NS_0/c_scale*synRate*0.221194;
+rate_matrix_0[17][29]:=NS_0/c_scale*AT*synRate*0.306866;
+rate_matrix_0[17][33]:=NS_0/c_scale*CG*synRate*0.264776;
+rate_matrix_0[17][48]:=NS_0/c_scale*CT*synRate*0.171642;
+rate_matrix_0[18][2]:=NS_0/c_scale*AC*synRate*0.340299;
+rate_matrix_0[18][16]:=S_0/c_scale*synRate*0.210149;
+rate_matrix_0[18][17]:=NS_0/c_scale*CG*synRate*0.250149;
+rate_matrix_0[18][19]:=NS_0/c_scale*GT*synRate*0.279104;
+rate_matrix_0[18][22]:=NS_0/c_scale*AC*synRate*0.166866;
+rate_matrix_0[18][26]:=NS_0/c_scale*synRate*0.221194;
+rate_matrix_0[18][30]:=NS_0/c_scale*AT*synRate*0.306866;
+rate_matrix_0[18][34]:=NS_0/c_scale*CG*synRate*0.264776;
+rate_matrix_0[19][3]:=NS_0/c_scale*AC*synRate*0.340299;
+rate_matrix_0[19][16]:=NS_0/c_scale*AT*synRate*0.210149;
+rate_matrix_0[19][17]:=S_0/c_scale*CT*synRate*0.250149;
+rate_matrix_0[19][18]:=NS_0/c_scale*GT*synRate*0.260597;
+rate_matrix_0[19][23]:=NS_0/c_scale*AC*synRate*0.166866;
+rate_matrix_0[19][27]:=NS_0/c_scale*synRate*0.221194;
+rate_matrix_0[19][31]:=NS_0/c_scale*AT*synRate*0.306866;
+rate_matrix_0[19][35]:=NS_0/c_scale*CG*synRate*0.264776;
+rate_matrix_0[19][49]:=NS_0/c_scale*CT*synRate*0.171642;
+rate_matrix_0[20][4]:=NS_0/c_scale*AC*synRate*0.340299;
+rate_matrix_0[20][16]:=NS_0/c_scale*AC*synRate*0.305075;
+rate_matrix_0[20][21]:=S_0/c_scale*AC*synRate*0.250149;
+rate_matrix_0[20][22]:=S_0/c_scale*synRate*0.260597;
+rate_matrix_0[20][23]:=S_0/c_scale*AT*synRate*0.279104;
+rate_matrix_0[20][24]:=NS_0/c_scale*CG*synRate*0.221194;
+rate_matrix_0[20][28]:=NS_0/c_scale*CT*synRate*0.306866;
+rate_matrix_0[20][36]:=NS_0/c_scale*CG*synRate*0.264776;
+rate_matrix_0[20][50]:=NS_0/c_scale*CT*synRate*0.171642;
+rate_matrix_0[21][5]:=NS_0/c_scale*AC*synRate*0.340299;
+rate_matrix_0[21][17]:=NS_0/c_scale*AC*synRate*0.305075;
+rate_matrix_0[21][20]:=S_0/c_scale*AC*synRate*0.210149;
+rate_matrix_0[21][22]:=S_0/c_scale*CG*synRate*0.260597;
+rate_matrix_0[21][23]:=S_0/c_scale*CT*synRate*0.279104;
+rate_matrix_0[21][25]:=NS_0/c_scale*CG*synRate*0.221194;
+rate_matrix_0[21][29]:=NS_0/c_scale*CT*synRate*0.306866;
+rate_matrix_0[21][37]:=NS_0/c_scale*CG*synRate*0.264776;
+rate_matrix_0[21][51]:=NS_0/c_scale*CT*synRate*0.171642;
+rate_matrix_0[22][6]:=NS_0/c_scale*AC*synRate*0.340299;
+rate_matrix_0[22][18]:=NS_0/c_scale*AC*synRate*0.305075;
+rate_matrix_0[22][20]:=S_0/c_scale*synRate*0.210149;
+rate_matrix_0[22][21]:=S_0/c_scale*CG*synRate*0.250149;
+rate_matrix_0[22][23]:=S_0/c_scale*GT*synRate*0.279104;
+rate_matrix_0[22][26]:=NS_0/c_scale*CG*synRate*0.221194;
+rate_matrix_0[22][30]:=NS_0/c_scale*CT*synRate*0.306866;
+rate_matrix_0[22][38]:=NS_0/c_scale*CG*synRate*0.264776;
+rate_matrix_0[22][52]:=NS_0/c_scale*CT*synRate*0.171642;
+rate_matrix_0[23][7]:=NS_0/c_scale*AC*synRate*0.340299;
+rate_matrix_0[23][19]:=NS_0/c_scale*AC*synRate*0.305075;
+rate_matrix_0[23][20]:=S_0/c_scale*AT*synRate*0.210149;
+rate_matrix_0[23][21]:=S_0/c_scale*CT*synRate*0.250149;
+rate_matrix_0[23][22]:=S_0/c_scale*GT*synRate*0.260597;
+rate_matrix_0[23][27]:=NS_0/c_scale*CG*synRate*0.221194;
+rate_matrix_0[23][31]:=NS_0/c_scale*CT*synRate*0.306866;
+rate_matrix_0[23][39]:=NS_0/c_scale*CG*synRate*0.264776;
+rate_matrix_0[23][53]:=NS_0/c_scale*CT*synRate*0.171642;
+rate_matrix_0[24][8]:=S_0/c_scale*AC*synRate*0.340299;
+rate_matrix_0[24][16]:=NS_0/c_scale*synRate*0.305075;
+rate_matrix_0[24][20]:=NS_0/c_scale*CG*synRate*0.166866;
+rate_matrix_0[24][25]:=S_0/c_scale*AC*synRate*0.250149;
+rate_matrix_0[24][26]:=S_0/c_scale*synRate*0.260597;
+rate_matrix_0[24][27]:=S_0/c_scale*AT*synRate*0.279104;
+rate_matrix_0[24][28]:=NS_0/c_scale*GT*synRate*0.306866;
+rate_matrix_0[24][40]:=NS_0/c_scale*CG*synRate*0.264776;
+rate_matrix_0[25][9]:=NS_0/c_scale*AC*synRate*0.340299;
+rate_matrix_0[25][17]:=NS_0/c_scale*synRate*0.305075;
+rate_matrix_0[25][21]:=NS_0/c_scale*CG*synRate*0.166866;
+rate_matrix_0[25][24]:=S_0/c_scale*AC*synRate*0.210149;
+rate_matrix_0[25][26]:=S_0/c_scale*CG*synRate*0.260597;
+rate_matrix_0[25][27]:=S_0/c_scale*CT*synRate*0.279104;
+rate_matrix_0[25][29]:=NS_0/c_scale*GT*synRate*0.306866;
+rate_matrix_0[25][41]:=NS_0/c_scale*CG*synRate*0.264776;
+rate_matrix_0[25][54]:=NS_0/c_scale*CT*synRate*0.171642;
+rate_matrix_0[26][10]:=S_0/c_scale*AC*synRate*0.340299;
+rate_matrix_0[26][18]:=NS_0/c_scale*synRate*0.305075;
+rate_matrix_0[26][22]:=NS_0/c_scale*CG*synRate*0.166866;
+rate_matrix_0[26][24]:=S_0/c_scale*synRate*0.210149;
+rate_matrix_0[26][25]:=S_0/c_scale*CG*synRate*0.250149;
+rate_matrix_0[26][27]:=S_0/c_scale*GT*synRate*0.279104;
+rate_matrix_0[26][30]:=NS_0/c_scale*GT*synRate*0.306866;
+rate_matrix_0[26][42]:=NS_0/c_scale*CG*synRate*0.264776;
+rate_matrix_0[26][55]:=NS_0/c_scale*CT*synRate*0.171642;
+rate_matrix_0[27][11]:=NS_0/c_scale*AC*synRate*0.340299;
+rate_matrix_0[27][19]:=NS_0/c_scale*synRate*0.305075;
+rate_matrix_0[27][23]:=NS_0/c_scale*CG*synRate*0.166866;
+rate_matrix_0[27][24]:=S_0/c_scale*AT*synRate*0.210149;
+rate_matrix_0[27][25]:=S_0/c_scale*CT*synRate*0.250149;
+rate_matrix_0[27][26]:=S_0/c_scale*GT*synRate*0.260597;
+rate_matrix_0[27][31]:=NS_0/c_scale*GT*synRate*0.306866;
+rate_matrix_0[27][43]:=NS_0/c_scale*CG*synRate*0.264776;
+rate_matrix_0[27][56]:=NS_0/c_scale*CT*synRate*0.171642;
+rate_matrix_0[28][12]:=NS_0/c_scale*AC*synRate*0.340299;
+rate_matrix_0[28][16]:=NS_0/c_scale*AT*synRate*0.305075;
+rate_matrix_0[28][20]:=NS_0/c_scale*CT*synRate*0.166866;
+rate_matrix_0[28][24]:=NS_0/c_scale*GT*synRate*0.221194;
+rate_matrix_0[28][29]:=S_0/c_scale*AC*synRate*0.250149;
+rate_matrix_0[28][30]:=S_0/c_scale*synRate*0.260597;
+rate_matrix_0[28][31]:=S_0/c_scale*AT*synRate*0.279104;
+rate_matrix_0[28][44]:=NS_0/c_scale*CG*synRate*0.264776;
+rate_matrix_0[28][57]:=S_0/c_scale*CT*synRate*0.171642;
+rate_matrix_0[29][13]:=NS_0/c_scale*AC*synRate*0.340299;
+rate_matrix_0[29][17]:=NS_0/c_scale*AT*synRate*0.305075;
+rate_matrix_0[29][21]:=NS_0/c_scale*CT*synRate*0.166866;
+rate_matrix_0[29][25]:=NS_0/c_scale*GT*synRate*0.221194;
+rate_matrix_0[29][28]:=S_0/c_scale*AC*synRate*0.210149;
+rate_matrix_0[29][30]:=S_0/c_scale*CG*synRate*0.260597;
+rate_matrix_0[29][31]:=S_0/c_scale*CT*synRate*0.279104;
+rate_matrix_0[29][45]:=NS_0/c_scale*CG*synRate*0.264776;
+rate_matrix_0[29][58]:=NS_0/c_scale*CT*synRate*0.171642;
+rate_matrix_0[30][14]:=NS_0/c_scale*AC*synRate*0.340299;
+rate_matrix_0[30][18]:=NS_0/c_scale*AT*synRate*0.305075;
+rate_matrix_0[30][22]:=NS_0/c_scale*CT*synRate*0.166866;
+rate_matrix_0[30][26]:=NS_0/c_scale*GT*synRate*0.221194;
+rate_matrix_0[30][28]:=S_0/c_scale*synRate*0.210149;
+rate_matrix_0[30][29]:=S_0/c_scale*CG*synRate*0.250149;
+rate_matrix_0[30][31]:=S_0/c_scale*GT*synRate*0.279104;
+rate_matrix_0[30][46]:=NS_0/c_scale*CG*synRate*0.264776;
+rate_matrix_0[30][59]:=S_0/c_scale*CT*synRate*0.171642;
+rate_matrix_0[31][15]:=NS_0/c_scale*AC*synRate*0.340299;
+rate_matrix_0[31][19]:=NS_0/c_scale*AT*synRate*0.305075;
+rate_matrix_0[31][23]:=NS_0/c_scale*CT*synRate*0.166866;
+rate_matrix_0[31][27]:=NS_0/c_scale*GT*synRate*0.221194;
+rate_matrix_0[31][28]:=S_0/c_scale*AT*synRate*0.210149;
+rate_matrix_0[31][29]:=S_0/c_scale*CT*synRate*0.250149;
+rate_matrix_0[31][30]:=S_0/c_scale*GT*synRate*0.260597;
+rate_matrix_0[31][47]:=NS_0/c_scale*CG*synRate*0.264776;
+rate_matrix_0[31][60]:=NS_0/c_scale*CT*synRate*0.171642;
+rate_matrix_0[32][0]:=NS_0/c_scale*synRate*0.340299;
+rate_matrix_0[32][16]:=NS_0/c_scale*CG*synRate*0.223284;
+rate_matrix_0[32][33]:=NS_0/c_scale*AC*synRate*0.250149;
+rate_matrix_0[32][34]:=S_0/c_scale*synRate*0.260597;
+rate_matrix_0[32][35]:=NS_0/c_scale*AT*synRate*0.279104;
+rate_matrix_0[32][36]:=NS_0/c_scale*AC*synRate*0.166866;
+rate_matrix_0[32][40]:=NS_0/c_scale*synRate*0.221194;
+rate_matrix_0[32][44]:=NS_0/c_scale*AT*synRate*0.306866;
+rate_matrix_0[33][1]:=NS_0/c_scale*synRate*0.340299;
+rate_matrix_0[33][17]:=NS_0/c_scale*CG*synRate*0.223284;
+rate_matrix_0[33][32]:=NS_0/c_scale*AC*synRate*0.210149;
+rate_matrix_0[33][34]:=NS_0/c_scale*CG*synRate*0.260597;
+rate_matrix_0[33][35]:=S_0/c_scale*CT*synRate*0.279104;
+rate_matrix_0[33][37]:=NS_0/c_scale*AC*synRate*0.166866;
+rate_matrix_0[33][41]:=NS_0/c_scale*synRate*0.221194;
+rate_matrix_0[33][45]:=NS_0/c_scale*AT*synRate*0.306866;
+rate_matrix_0[33][48]:=NS_0/c_scale*GT*synRate*0.171642;
+rate_matrix_0[34][2]:=NS_0/c_scale*synRate*0.340299;
+rate_matrix_0[34][18]:=NS_0/c_scale*CG*synRate*0.223284;
+rate_matrix_0[34][32]:=S_0/c_scale*synRate*0.210149;
+rate_matrix_0[34][33]:=NS_0/c_scale*CG*synRate*0.250149;
+rate_matrix_0[34][35]:=NS_0/c_scale*GT*synRate*0.279104;
+rate_matrix_0[34][38]:=NS_0/c_scale*AC*synRate*0.166866;
+rate_matrix_0[34][42]:=NS_0/c_scale*synRate*0.221194;
+rate_matrix_0[34][46]:=NS_0/c_scale*AT*synRate*0.306866;
+rate_matrix_0[35][3]:=NS_0/c_scale*synRate*0.340299;
+rate_matrix_0[35][19]:=NS_0/c_scale*CG*synRate*0.223284;
+rate_matrix_0[35][32]:=NS_0/c_scale*AT*synRate*0.210149;
+rate_matrix_0[35][33]:=S_0/c_scale*CT*synRate*0.250149;
+rate_matrix_0[35][34]:=NS_0/c_scale*GT*synRate*0.260597;
+rate_matrix_0[35][39]:=NS_0/c_scale*AC*synRate*0.166866;
+rate_matrix_0[35][43]:=NS_0/c_scale*synRate*0.221194;
+rate_matrix_0[35][47]:=NS_0/c_scale*AT*synRate*0.306866;
+rate_matrix_0[35][49]:=NS_0/c_scale*GT*synRate*0.171642;
+rate_matrix_0[36][4]:=NS_0/c_scale*synRate*0.340299;
+rate_matrix_0[36][20]:=NS_0/c_scale*CG*synRate*0.223284;
+rate_matrix_0[36][32]:=NS_0/c_scale*AC*synRate*0.305075;
+rate_matrix_0[36][37]:=S_0/c_scale*AC*synRate*0.250149;
+rate_matrix_0[36][38]:=S_0/c_scale*synRate*0.260597;
+rate_matrix_0[36][39]:=S_0/c_scale*AT*synRate*0.279104;
+rate_matrix_0[36][40]:=NS_0/c_scale*CG*synRate*0.221194;
+rate_matrix_0[36][44]:=NS_0/c_scale*CT*synRate*0.306866;
+rate_matrix_0[36][50]:=NS_0/c_scale*GT*synRate*0.171642;
+rate_matrix_0[37][5]:=NS_0/c_scale*synRate*0.340299;
+rate_matrix_0[37][21]:=NS_0/c_scale*CG*synRate*0.223284;
+rate_matrix_0[37][33]:=NS_0/c_scale*AC*synRate*0.305075;
+rate_matrix_0[37][36]:=S_0/c_scale*AC*synRate*0.210149;
+rate_matrix_0[37][38]:=S_0/c_scale*CG*synRate*0.260597;
+rate_matrix_0[37][39]:=S_0/c_scale*CT*synRate*0.279104;
+rate_matrix_0[37][41]:=NS_0/c_scale*CG*synRate*0.221194;
+rate_matrix_0[37][45]:=NS_0/c_scale*CT*synRate*0.306866;
+rate_matrix_0[37][51]:=NS_0/c_scale*GT*synRate*0.171642;
+rate_matrix_0[38][6]:=NS_0/c_scale*synRate*0.340299;
+rate_matrix_0[38][22]:=NS_0/c_scale*CG*synRate*0.223284;
+rate_matrix_0[38][34]:=NS_0/c_scale*AC*synRate*0.305075;
+rate_matrix_0[38][36]:=S_0/c_scale*synRate*0.210149;
+rate_matrix_0[38][37]:=S_0/c_scale*CG*synRate*0.250149;
+rate_matrix_0[38][39]:=S_0/c_scale*GT*synRate*0.279104;
+rate_matrix_0[38][42]:=NS_0/c_scale*CG*synRate*0.221194;
+rate_matrix_0[38][46]:=NS_0/c_scale*CT*synRate*0.306866;
+rate_matrix_0[38][52]:=NS_0/c_scale*GT*synRate*0.171642;
+rate_matrix_0[39][7]:=NS_0/c_scale*synRate*0.340299;
+rate_matrix_0[39][23]:=NS_0/c_scale*CG*synRate*0.223284;
+rate_matrix_0[39][35]:=NS_0/c_scale*AC*synRate*0.305075;
+rate_matrix_0[39][36]:=S_0/c_scale*AT*synRate*0.210149;
+rate_matrix_0[39][37]:=S_0/c_scale*CT*synRate*0.250149;
+rate_matrix_0[39][38]:=S_0/c_scale*GT*synRate*0.260597;
+rate_matrix_0[39][43]:=NS_0/c_scale*CG*synRate*0.221194;
+rate_matrix_0[39][47]:=NS_0/c_scale*CT*synRate*0.306866;
+rate_matrix_0[39][53]:=NS_0/c_scale*GT*synRate*0.171642;
+rate_matrix_0[40][8]:=NS_0/c_scale*synRate*0.340299;
+rate_matrix_0[40][24]:=NS_0/c_scale*CG*synRate*0.223284;
+rate_matrix_0[40][32]:=NS_0/c_scale*synRate*0.305075;
+rate_matrix_0[40][36]:=NS_0/c_scale*CG*synRate*0.166866;
+rate_matrix_0[40][41]:=S_0/c_scale*AC*synRate*0.250149;
+rate_matrix_0[40][42]:=S_0/c_scale*synRate*0.260597;
+rate_matrix_0[40][43]:=S_0/c_scale*AT*synRate*0.279104;
+rate_matrix_0[40][44]:=NS_0/c_scale*GT*synRate*0.306866;
+rate_matrix_0[41][9]:=NS_0/c_scale*synRate*0.340299;
+rate_matrix_0[41][25]:=NS_0/c_scale*CG*synRate*0.223284;
+rate_matrix_0[41][33]:=NS_0/c_scale*synRate*0.305075;
+rate_matrix_0[41][37]:=NS_0/c_scale*CG*synRate*0.166866;
+rate_matrix_0[41][40]:=S_0/c_scale*AC*synRate*0.210149;
+rate_matrix_0[41][42]:=S_0/c_scale*CG*synRate*0.260597;
+rate_matrix_0[41][43]:=S_0/c_scale*CT*synRate*0.279104;
+rate_matrix_0[41][45]:=NS_0/c_scale*GT*synRate*0.306866;
+rate_matrix_0[41][54]:=NS_0/c_scale*GT*synRate*0.171642;
+rate_matrix_0[42][10]:=NS_0/c_scale*synRate*0.340299;
+rate_matrix_0[42][26]:=NS_0/c_scale*CG*synRate*0.223284;
+rate_matrix_0[42][34]:=NS_0/c_scale*synRate*0.305075;
+rate_matrix_0[42][38]:=NS_0/c_scale*CG*synRate*0.166866;
+rate_matrix_0[42][40]:=S_0/c_scale*synRate*0.210149;
+rate_matrix_0[42][41]:=S_0/c_scale*CG*synRate*0.250149;
+rate_matrix_0[42][43]:=S_0/c_scale*GT*synRate*0.279104;
+rate_matrix_0[42][46]:=NS_0/c_scale*GT*synRate*0.306866;
+rate_matrix_0[42][55]:=NS_0/c_scale*GT*synRate*0.171642;
+rate_matrix_0[43][11]:=NS_0/c_scale*synRate*0.340299;
+rate_matrix_0[43][27]:=NS_0/c_scale*CG*synRate*0.223284;
+rate_matrix_0[43][35]:=NS_0/c_scale*synRate*0.305075;
+rate_matrix_0[43][39]:=NS_0/c_scale*CG*synRate*0.166866;
+rate_matrix_0[43][40]:=S_0/c_scale*AT*synRate*0.210149;
+rate_matrix_0[43][41]:=S_0/c_scale*CT*synRate*0.250149;
+rate_matrix_0[43][42]:=S_0/c_scale*GT*synRate*0.260597;
+rate_matrix_0[43][47]:=NS_0/c_scale*GT*synRate*0.306866;
+rate_matrix_0[43][56]:=NS_0/c_scale*GT*synRate*0.171642;
+rate_matrix_0[44][12]:=NS_0/c_scale*synRate*0.340299;
+rate_matrix_0[44][28]:=NS_0/c_scale*CG*synRate*0.223284;
+rate_matrix_0[44][32]:=NS_0/c_scale*AT*synRate*0.305075;
+rate_matrix_0[44][36]:=NS_0/c_scale*CT*synRate*0.166866;
+rate_matrix_0[44][40]:=NS_0/c_scale*GT*synRate*0.221194;
+rate_matrix_0[44][45]:=S_0/c_scale*AC*synRate*0.250149;
+rate_matrix_0[44][46]:=S_0/c_scale*synRate*0.260597;
+rate_matrix_0[44][47]:=S_0/c_scale*AT*synRate*0.279104;
+rate_matrix_0[44][57]:=NS_0/c_scale*GT*synRate*0.171642;
+rate_matrix_0[45][13]:=NS_0/c_scale*synRate*0.340299;
+rate_matrix_0[45][29]:=NS_0/c_scale*CG*synRate*0.223284;
+rate_matrix_0[45][33]:=NS_0/c_scale*AT*synRate*0.305075;
+rate_matrix_0[45][37]:=NS_0/c_scale*CT*synRate*0.166866;
+rate_matrix_0[45][41]:=NS_0/c_scale*GT*synRate*0.221194;
+rate_matrix_0[45][44]:=S_0/c_scale*AC*synRate*0.210149;
+rate_matrix_0[45][46]:=S_0/c_scale*CG*synRate*0.260597;
+rate_matrix_0[45][47]:=S_0/c_scale*CT*synRate*0.279104;
+rate_matrix_0[45][58]:=NS_0/c_scale*GT*synRate*0.171642;
+rate_matrix_0[46][14]:=NS_0/c_scale*synRate*0.340299;
+rate_matrix_0[46][30]:=NS_0/c_scale*CG*synRate*0.223284;
+rate_matrix_0[46][34]:=NS_0/c_scale*AT*synRate*0.305075;
+rate_matrix_0[46][38]:=NS_0/c_scale*CT*synRate*0.166866;
+rate_matrix_0[46][42]:=NS_0/c_scale*GT*synRate*0.221194;
+rate_matrix_0[46][44]:=S_0/c_scale*synRate*0.210149;
+rate_matrix_0[46][45]:=S_0/c_scale*CG*synRate*0.250149;
+rate_matrix_0[46][47]:=S_0/c_scale*GT*synRate*0.279104;
+rate_matrix_0[46][59]:=NS_0/c_scale*GT*synRate*0.171642;
+rate_matrix_0[47][15]:=NS_0/c_scale*synRate*0.340299;
+rate_matrix_0[47][31]:=NS_0/c_scale*CG*synRate*0.223284;
+rate_matrix_0[47][35]:=NS_0/c_scale*AT*synRate*0.305075;
+rate_matrix_0[47][39]:=NS_0/c_scale*CT*synRate*0.166866;
+rate_matrix_0[47][43]:=NS_0/c_scale*GT*synRate*0.221194;
+rate_matrix_0[47][44]:=S_0/c_scale*AT*synRate*0.210149;
+rate_matrix_0[47][45]:=S_0/c_scale*CT*synRate*0.250149;
+rate_matrix_0[47][46]:=S_0/c_scale*GT*synRate*0.260597;
+rate_matrix_0[47][60]:=NS_0/c_scale*GT*synRate*0.171642;
+rate_matrix_0[48][1]:=NS_0/c_scale*AT*synRate*0.340299;
+rate_matrix_0[48][17]:=NS_0/c_scale*CT*synRate*0.223284;
+rate_matrix_0[48][33]:=NS_0/c_scale*GT*synRate*0.264776;
+rate_matrix_0[48][49]:=S_0/c_scale*CT*synRate*0.279104;
+rate_matrix_0[48][51]:=NS_0/c_scale*AC*synRate*0.166866;
+rate_matrix_0[48][54]:=NS_0/c_scale*synRate*0.221194;
+rate_matrix_0[48][58]:=NS_0/c_scale*AT*synRate*0.306866;
+rate_matrix_0[49][3]:=NS_0/c_scale*AT*synRate*0.340299;
+rate_matrix_0[49][19]:=NS_0/c_scale*CT*synRate*0.223284;
+rate_matrix_0[49][35]:=NS_0/c_scale*GT*synRate*0.264776;
+rate_matrix_0[49][48]:=S_0/c_scale*CT*synRate*0.250149;
+rate_matrix_0[49][53]:=NS_0/c_scale*AC*synRate*0.166866;
+rate_matrix_0[49][56]:=NS_0/c_scale*synRate*0.221194;
+rate_matrix_0[49][60]:=NS_0/c_scale*AT*synRate*0.306866;
+rate_matrix_0[50][4]:=NS_0/c_scale*AT*synRate*0.340299;
+rate_matrix_0[50][20]:=NS_0/c_scale*CT*synRate*0.223284;
+rate_matrix_0[50][36]:=NS_0/c_scale*GT*synRate*0.264776;
+rate_matrix_0[50][51]:=S_0/c_scale*AC*synRate*0.250149;
+rate_matrix_0[50][52]:=S_0/c_scale*synRate*0.260597;
+rate_matrix_0[50][53]:=S_0/c_scale*AT*synRate*0.279104;
+rate_matrix_0[50][57]:=NS_0/c_scale*CT*synRate*0.306866;
+rate_matrix_0[51][5]:=NS_0/c_scale*AT*synRate*0.340299;
+rate_matrix_0[51][21]:=NS_0/c_scale*CT*synRate*0.223284;
+rate_matrix_0[51][37]:=NS_0/c_scale*GT*synRate*0.264776;
+rate_matrix_0[51][48]:=NS_0/c_scale*AC*synRate*0.305075;
+rate_matrix_0[51][50]:=S_0/c_scale*AC*synRate*0.210149;
+rate_matrix_0[51][52]:=S_0/c_scale*CG*synRate*0.260597;
+rate_matrix_0[51][53]:=S_0/c_scale*CT*synRate*0.279104;
+rate_matrix_0[51][54]:=NS_0/c_scale*CG*synRate*0.221194;
+rate_matrix_0[51][58]:=NS_0/c_scale*CT*synRate*0.306866;
+rate_matrix_0[52][6]:=NS_0/c_scale*AT*synRate*0.340299;
+rate_matrix_0[52][22]:=NS_0/c_scale*CT*synRate*0.223284;
+rate_matrix_0[52][38]:=NS_0/c_scale*GT*synRate*0.264776;
+rate_matrix_0[52][50]:=S_0/c_scale*synRate*0.210149;
+rate_matrix_0[52][51]:=S_0/c_scale*CG*synRate*0.250149;
+rate_matrix_0[52][53]:=S_0/c_scale*GT*synRate*0.279104;
+rate_matrix_0[52][55]:=NS_0/c_scale*CG*synRate*0.221194;
+rate_matrix_0[52][59]:=NS_0/c_scale*CT*synRate*0.306866;
+rate_matrix_0[53][7]:=NS_0/c_scale*AT*synRate*0.340299;
+rate_matrix_0[53][23]:=NS_0/c_scale*CT*synRate*0.223284;
+rate_matrix_0[53][39]:=NS_0/c_scale*GT*synRate*0.264776;
+rate_matrix_0[53][49]:=NS_0/c_scale*AC*synRate*0.305075;
+rate_matrix_0[53][50]:=S_0/c_scale*AT*synRate*0.210149;
+rate_matrix_0[53][51]:=S_0/c_scale*CT*synRate*0.250149;
+rate_matrix_0[53][52]:=S_0/c_scale*GT*synRate*0.260597;
+rate_matrix_0[53][56]:=NS_0/c_scale*CG*synRate*0.221194;
+rate_matrix_0[53][60]:=NS_0/c_scale*CT*synRate*0.306866;
+rate_matrix_0[54][9]:=NS_0/c_scale*AT*synRate*0.340299;
+rate_matrix_0[54][25]:=NS_0/c_scale*CT*synRate*0.223284;
+rate_matrix_0[54][41]:=NS_0/c_scale*GT*synRate*0.264776;
+rate_matrix_0[54][48]:=NS_0/c_scale*synRate*0.305075;
+rate_matrix_0[54][51]:=NS_0/c_scale*CG*synRate*0.166866;
+rate_matrix_0[54][55]:=NS_0/c_scale*CG*synRate*0.260597;
+rate_matrix_0[54][56]:=S_0/c_scale*CT*synRate*0.279104;
+rate_matrix_0[54][58]:=NS_0/c_scale*GT*synRate*0.306866;
+rate_matrix_0[55][10]:=NS_0/c_scale*AT*synRate*0.340299;
+rate_matrix_0[55][26]:=NS_0/c_scale*CT*synRate*0.223284;
+rate_matrix_0[55][42]:=NS_0/c_scale*GT*synRate*0.264776;
+rate_matrix_0[55][52]:=NS_0/c_scale*CG*synRate*0.166866;
+rate_matrix_0[55][54]:=NS_0/c_scale*CG*synRate*0.250149;
+rate_matrix_0[55][56]:=NS_0/c_scale*GT*synRate*0.279104;
+rate_matrix_0[55][59]:=NS_0/c_scale*GT*synRate*0.306866;
+rate_matrix_0[56][11]:=NS_0/c_scale*AT*synRate*0.340299;
+rate_matrix_0[56][27]:=NS_0/c_scale*CT*synRate*0.223284;
+rate_matrix_0[56][43]:=NS_0/c_scale*GT*synRate*0.264776;
+rate_matrix_0[56][49]:=NS_0/c_scale*synRate*0.305075;
+rate_matrix_0[56][53]:=NS_0/c_scale*CG*synRate*0.166866;
+rate_matrix_0[56][54]:=S_0/c_scale*CT*synRate*0.250149;
+rate_matrix_0[56][55]:=NS_0/c_scale*GT*synRate*0.260597;
+rate_matrix_0[56][60]:=NS_0/c_scale*GT*synRate*0.306866;
+rate_matrix_0[57][12]:=NS_0/c_scale*AT*synRate*0.340299;
+rate_matrix_0[57][28]:=S_0/c_scale*CT*synRate*0.223284;
+rate_matrix_0[57][44]:=NS_0/c_scale*GT*synRate*0.264776;
+rate_matrix_0[57][50]:=NS_0/c_scale*CT*synRate*0.166866;
+rate_matrix_0[57][58]:=NS_0/c_scale*AC*synRate*0.250149;
+rate_matrix_0[57][59]:=S_0/c_scale*synRate*0.260597;
+rate_matrix_0[57][60]:=NS_0/c_scale*AT*synRate*0.279104;
+rate_matrix_0[58][13]:=NS_0/c_scale*AT*synRate*0.340299;
+rate_matrix_0[58][29]:=NS_0/c_scale*CT*synRate*0.223284;
+rate_matrix_0[58][45]:=NS_0/c_scale*GT*synRate*0.264776;
+rate_matrix_0[58][48]:=NS_0/c_scale*AT*synRate*0.305075;
+rate_matrix_0[58][51]:=NS_0/c_scale*CT*synRate*0.166866;
+rate_matrix_0[58][54]:=NS_0/c_scale*GT*synRate*0.221194;
+rate_matrix_0[58][57]:=NS_0/c_scale*AC*synRate*0.210149;
+rate_matrix_0[58][59]:=NS_0/c_scale*CG*synRate*0.260597;
+rate_matrix_0[58][60]:=S_0/c_scale*CT*synRate*0.279104;
+rate_matrix_0[59][14]:=NS_0/c_scale*AT*synRate*0.340299;
+rate_matrix_0[59][30]:=S_0/c_scale*CT*synRate*0.223284;
+rate_matrix_0[59][46]:=NS_0/c_scale*GT*synRate*0.264776;
+rate_matrix_0[59][52]:=NS_0/c_scale*CT*synRate*0.166866;
+rate_matrix_0[59][55]:=NS_0/c_scale*GT*synRate*0.221194;
+rate_matrix_0[59][57]:=S_0/c_scale*synRate*0.210149;
+rate_matrix_0[59][58]:=NS_0/c_scale*CG*synRate*0.250149;
+rate_matrix_0[59][60]:=NS_0/c_scale*GT*synRate*0.279104;
+rate_matrix_0[60][15]:=NS_0/c_scale*AT*synRate*0.340299;
+rate_matrix_0[60][31]:=NS_0/c_scale*CT*synRate*0.223284;
+rate_matrix_0[60][47]:=NS_0/c_scale*GT*synRate*0.264776;
+rate_matrix_0[60][49]:=NS_0/c_scale*AT*synRate*0.305075;
+rate_matrix_0[60][53]:=NS_0/c_scale*CT*synRate*0.166866;
+rate_matrix_0[60][56]:=NS_0/c_scale*GT*synRate*0.221194;
+rate_matrix_0[60][57]:=NS_0/c_scale*AT*synRate*0.210149;
+rate_matrix_0[60][58]:=S_0/c_scale*CT*synRate*0.250149;
+rate_matrix_0[60][59]:=NS_0/c_scale*GT*synRate*0.260597;
+
+vectorOfFrequencies={
+{   0.0225528119491}
+{   0.0268455346781}
+{   0.0279667682267}
+{   0.0299529533699}
+{   0.0123356378469}
+{   0.0146836143689}
+{   0.0152968918187}
+{   0.0163832690154}
+{   0.0163518920296}
+{   0.0194643260239}
+{   0.0202772752015}
+{   0.0217173566019}
+{   0.0226852159332}
+{   0.0270031405568}
+{   0.0281309566898}
+{   0.0301288024112}
+{   0.0147978099456}
+{   0.0176144385432}
+{   0.0183501251172}
+{    0.019653341334}
+{  0.00809390974518}
+{  0.00963451188417}
+{   0.0100369079653}
+{   0.0107497238803}
+{   0.0107291361738}
+{   0.0127713297069}
+{   0.0133047384656}
+{   0.0142496339809}
+{   0.0148846855421}
+{   0.0177178501197}
+{    0.018457855793}
+{   0.0197687229856}
+{   0.0175476703499}
+{   0.0208877098767}
+{   0.0217601082606}
+{   0.0233054996834}
+{   0.0095979919037}
+{   0.0114248824081}
+{    0.011902055301}
+{   0.0127473329971}
+{   0.0127229195003}
+{   0.0151446115642}
+{   0.0157771430735}
+{   0.0168976274613}
+{    0.017650689941}
+{   0.0210103383104}
+{   0.0218878584069}
+{   0.0234423225779}
+{   0.0135405109122}
+{   0.0151078492875}
+{  0.00622192259823}
+{  0.00740620900187}
+{  0.00771553754013}
+{  0.00826349095077}
+{  0.00981753286294}
+{   0.0102275730183}
+{    0.010953929865}
+{   0.0114421045277}
+{   0.0136200051054}
+{   0.0141888597339}
+{   0.0151965450758}
+}
+;
+Model MG94model_0=(rate_matrix_0,vectorOfFrequencies,0);
+rate_matrix_1={61,61};
+rate_matrix_1[0][1]:=NS_1/c_scale*AC*synRate*0.250149;
+rate_matrix_1[0][2]:=S_1/c_scale*synRate*0.260597;
+rate_matrix_1[0][3]:=NS_1/c_scale*AT*synRate*0.279104;
+rate_matrix_1[0][4]:=NS_1/c_scale*AC*synRate*0.166866;
+rate_matrix_1[0][8]:=NS_1/c_scale*synRate*0.221194;
+rate_matrix_1[0][12]:=NS_1/c_scale*AT*synRate*0.306866;
+rate_matrix_1[0][16]:=NS_1/c_scale*AC*synRate*0.223284;
+rate_matrix_1[0][32]:=NS_1/c_scale*synRate*0.264776;
+rate_matrix_1[1][0]:=NS_1/c_scale*AC*synRate*0.210149;
+rate_matrix_1[1][2]:=NS_1/c_scale*CG*synRate*0.260597;
+rate_matrix_1[1][3]:=S_1/c_scale*CT*synRate*0.279104;
+rate_matrix_1[1][5]:=NS_1/c_scale*AC*synRate*0.166866;
+rate_matrix_1[1][9]:=NS_1/c_scale*synRate*0.221194;
+rate_matrix_1[1][13]:=NS_1/c_scale*AT*synRate*0.306866;
+rate_matrix_1[1][17]:=NS_1/c_scale*AC*synRate*0.223284;
+rate_matrix_1[1][33]:=NS_1/c_scale*synRate*0.264776;
+rate_matrix_1[1][48]:=NS_1/c_scale*AT*synRate*0.171642;
+rate_matrix_1[2][0]:=S_1/c_scale*synRate*0.210149;
+rate_matrix_1[2][1]:=NS_1/c_scale*CG*synRate*0.250149;
+rate_matrix_1[2][3]:=NS_1/c_scale*GT*synRate*0.279104;
+rate_matrix_1[2][6]:=NS_1/c_scale*AC*synRate*0.166866;
+rate_matrix_1[2][10]:=NS_1/c_scale*synRate*0.221194;
+rate_matrix_1[2][14]:=NS_1/c_scale*AT*synRate*0.306866;
+rate_matrix_1[2][18]:=NS_1/c_scale*AC*synRate*0.223284;
+rate_matrix_1[2][34]:=NS_1/c_scale*synRate*0.264776;
+rate_matrix_1[3][0]:=NS_1/c_scale*AT*synRate*0.210149;
+rate_matrix_1[3][1]:=S_1/c_scale*CT*synRate*0.250149;
+rate_matrix_1[3][2]:=NS_1/c_scale*GT*synRate*0.260597;
+rate_matrix_1[3][7]:=NS_1/c_scale*AC*synRate*0.166866;
+rate_matrix_1[3][11]:=NS_1/c_scale*synRate*0.221194;
+rate_matrix_1[3][15]:=NS_1/c_scale*AT*synRate*0.306866;
+rate_matrix_1[3][19]:=NS_1/c_scale*AC*synRate*0.223284;
+rate_matrix_1[3][35]:=NS_1/c_scale*synRate*0.264776;
+rate_matrix_1[3][49]:=NS_1/c_scale*AT*synRate*0.171642;
+rate_matrix_1[4][0]:=NS_1/c_scale*AC*synRate*0.305075;
+rate_matrix_1[4][5]:=S_1/c_scale*AC*synRate*0.250149;
+rate_matrix_1[4][6]:=S_1/c_scale*synRate*0.260597;
+rate_matrix_1[4][7]:=S_1/c_scale*AT*synRate*0.279104;
+rate_matrix_1[4][8]:=NS_1/c_scale*CG*synRate*0.221194;
+rate_matrix_1[4][12]:=NS_1/c_scale*CT*synRate*0.306866;
+rate_matrix_1[4][20]:=NS_1/c_scale*AC*synRate*0.223284;
+rate_matrix_1[4][36]:=NS_1/c_scale*synRate*0.264776;
+rate_matrix_1[4][50]:=NS_1/c_scale*AT*synRate*0.171642;
+rate_matrix_1[5][1]:=NS_1/c_scale*AC*synRate*0.305075;
+rate_matrix_1[5][4]:=S_1/c_scale*AC*synRate*0.210149;
+rate_matrix_1[5][6]:=S_1/c_scale*CG*synRate*0.260597;
+rate_matrix_1[5][7]:=S_1/c_scale*CT*synRate*0.279104;
+rate_matrix_1[5][9]:=NS_1/c_scale*CG*synRate*0.221194;
+rate_matrix_1[5][13]:=NS_1/c_scale*CT*synRate*0.306866;
+rate_matrix_1[5][21]:=NS_1/c_scale*AC*synRate*0.223284;
+rate_matrix_1[5][37]:=NS_1/c_scale*synRate*0.264776;
+rate_matrix_1[5][51]:=NS_1/c_scale*AT*synRate*0.171642;
+rate_matrix_1[6][2]:=NS_1/c_scale*AC*synRate*0.305075;
+rate_matrix_1[6][4]:=S_1/c_scale*synRate*0.210149;
+rate_matrix_1[6][5]:=S_1/c_scale*CG*synRate*0.250149;
+rate_matrix_1[6][7]:=S_1/c_scale*GT*synRate*0.279104;
+rate_matrix_1[6][10]:=NS_1/c_scale*CG*synRate*0.221194;
+rate_matrix_1[6][14]:=NS_1/c_scale*CT*synRate*0.306866;
+rate_matrix_1[6][22]:=NS_1/c_scale*AC*synRate*0.223284;
+rate_matrix_1[6][38]:=NS_1/c_scale*synRate*0.264776;
+rate_matrix_1[6][52]:=NS_1/c_scale*AT*synRate*0.171642;
+rate_matrix_1[7][3]:=NS_1/c_scale*AC*synRate*0.305075;
+rate_matrix_1[7][4]:=S_1/c_scale*AT*synRate*0.210149;
+rate_matrix_1[7][5]:=S_1/c_scale*CT*synRate*0.250149;
+rate_matrix_1[7][6]:=S_1/c_scale*GT*synRate*0.260597;
+rate_matrix_1[7][11]:=NS_1/c_scale*CG*synRate*0.221194;
+rate_matrix_1[7][15]:=NS_1/c_scale*CT*synRate*0.306866;
+rate_matrix_1[7][23]:=NS_1/c_scale*AC*synRate*0.223284;
+rate_matrix_1[7][39]:=NS_1/c_scale*synRate*0.264776;
+rate_matrix_1[7][53]:=NS_1/c_scale*AT*synRate*0.171642;
+rate_matrix_1[8][0]:=NS_1/c_scale*synRate*0.305075;
+rate_matrix_1[8][4]:=NS_1/c_scale*CG*synRate*0.166866;
+rate_matrix_1[8][9]:=NS_1/c_scale*AC*synRate*0.250149;
+rate_matrix_1[8][10]:=S_1/c_scale*synRate*0.260597;
+rate_matrix_1[8][11]:=NS_1/c_scale*AT*synRate*0.279104;
+rate_matrix_1[8][12]:=NS_1/c_scale*GT*synRate*0.306866;
+rate_matrix_1[8][24]:=S_1/c_scale*AC*synRate*0.223284;
+rate_matrix_1[8][40]:=NS_1/c_scale*synRate*0.264776;
+rate_matrix_1[9][1]:=NS_1/c_scale*synRate*0.305075;
+rate_matrix_1[9][5]:=NS_1/c_scale*CG*synRate*0.166866;
+rate_matrix_1[9][8]:=NS_1/c_scale*AC*synRate*0.210149;
+rate_matrix_1[9][10]:=NS_1/c_scale*CG*synRate*0.260597;
+rate_matrix_1[9][11]:=S_1/c_scale*CT*synRate*0.279104;
+rate_matrix_1[9][13]:=NS_1/c_scale*GT*synRate*0.306866;
+rate_matrix_1[9][25]:=NS_1/c_scale*AC*synRate*0.223284;
+rate_matrix_1[9][41]:=NS_1/c_scale*synRate*0.264776;
+rate_matrix_1[9][54]:=NS_1/c_scale*AT*synRate*0.171642;
+rate_matrix_1[10][2]:=NS_1/c_scale*synRate*0.305075;
+rate_matrix_1[10][6]:=NS_1/c_scale*CG*synRate*0.166866;
+rate_matrix_1[10][8]:=S_1/c_scale*synRate*0.210149;
+rate_matrix_1[10][9]:=NS_1/c_scale*CG*synRate*0.250149;
+rate_matrix_1[10][11]:=NS_1/c_scale*GT*synRate*0.279104;
+rate_matrix_1[10][14]:=NS_1/c_scale*GT*synRate*0.306866;
+rate_matrix_1[10][26]:=S_1/c_scale*AC*synRate*0.223284;
+rate_matrix_1[10][42]:=NS_1/c_scale*synRate*0.264776;
+rate_matrix_1[10][55]:=NS_1/c_scale*AT*synRate*0.171642;
+rate_matrix_1[11][3]:=NS_1/c_scale*synRate*0.305075;
+rate_matrix_1[11][7]:=NS_1/c_scale*CG*synRate*0.166866;
+rate_matrix_1[11][8]:=NS_1/c_scale*AT*synRate*0.210149;
+rate_matrix_1[11][9]:=S_1/c_scale*CT*synRate*0.250149;
+rate_matrix_1[11][10]:=NS_1/c_scale*GT*synRate*0.260597;
+rate_matrix_1[11][15]:=NS_1/c_scale*GT*synRate*0.306866;
+rate_matrix_1[11][27]:=NS_1/c_scale*AC*synRate*0.223284;
+rate_matrix_1[11][43]:=NS_1/c_scale*synRate*0.264776;
+rate_matrix_1[11][56]:=NS_1/c_scale*AT*synRate*0.171642;
+rate_matrix_1[12][0]:=NS_1/c_scale*AT*synRate*0.305075;
+rate_matrix_1[12][4]:=NS_1/c_scale*CT*synRate*0.166866;
+rate_matrix_1[12][8]:=NS_1/c_scale*GT*synRate*0.221194;
+rate_matrix_1[12][13]:=S_1/c_scale*AC*synRate*0.250149;
+rate_matrix_1[12][14]:=NS_1/c_scale*synRate*0.260597;
+rate_matrix_1[12][15]:=S_1/c_scale*AT*synRate*0.279104;
+rate_matrix_1[12][28]:=NS_1/c_scale*AC*synRate*0.223284;
+rate_matrix_1[12][44]:=NS_1/c_scale*synRate*0.264776;
+rate_matrix_1[12][57]:=NS_1/c_scale*AT*synRate*0.171642;
+rate_matrix_1[13][1]:=NS_1/c_scale*AT*synRate*0.305075;
+rate_matrix_1[13][5]:=NS_1/c_scale*CT*synRate*0.166866;
+rate_matrix_1[13][9]:=NS_1/c_scale*GT*synRate*0.221194;
+rate_matrix_1[13][12]:=S_1/c_scale*AC*synRate*0.210149;
+rate_matrix_1[13][14]:=NS_1/c_scale*CG*synRate*0.260597;
+rate_matrix_1[13][15]:=S_1/c_scale*CT*synRate*0.279104;
+rate_matrix_1[13][29]:=NS_1/c_scale*AC*synRate*0.223284;
+rate_matrix_1[13][45]:=NS_1/c_scale*synRate*0.264776;
+rate_matrix_1[13][58]:=NS_1/c_scale*AT*synRate*0.171642;
+rate_matrix_1[14][2]:=NS_1/c_scale*AT*synRate*0.305075;
+rate_matrix_1[14][6]:=NS_1/c_scale*CT*synRate*0.166866;
+rate_matrix_1[14][10]:=NS_1/c_scale*GT*synRate*0.221194;
+rate_matrix_1[14][12]:=NS_1/c_scale*synRate*0.210149;
+rate_matrix_1[14][13]:=NS_1/c_scale*CG*synRate*0.250149;
+rate_matrix_1[14][15]:=NS_1/c_scale*GT*synRate*0.279104;
+rate_matrix_1[14][30]:=NS_1/c_scale*AC*synRate*0.223284;
+rate_matrix_1[14][46]:=NS_1/c_scale*synRate*0.264776;
+rate_matrix_1[14][59]:=NS_1/c_scale*AT*synRate*0.171642;
+rate_matrix_1[15][3]:=NS_1/c_scale*AT*synRate*0.305075;
+rate_matrix_1[15][7]:=NS_1/c_scale*CT*synRate*0.166866;
+rate_matrix_1[15][11]:=NS_1/c_scale*GT*synRate*0.221194;
+rate_matrix_1[15][12]:=S_1/c_scale*AT*synRate*0.210149;
+rate_matrix_1[15][13]:=S_1/c_scale*CT*synRate*0.250149;
+rate_matrix_1[15][14]:=NS_1/c_scale*GT*synRate*0.260597;
+rate_matrix_1[15][31]:=NS_1/c_scale*AC*synRate*0.223284;
+rate_matrix_1[15][47]:=NS_1/c_scale*synRate*0.264776;
+rate_matrix_1[15][60]:=NS_1/c_scale*AT*synRate*0.171642;
+rate_matrix_1[16][0]:=NS_1/c_scale*AC*synRate*0.340299;
+rate_matrix_1[16][17]:=NS_1/c_scale*AC*synRate*0.250149;
+rate_matrix_1[16][18]:=S_1/c_scale*synRate*0.260597;
+rate_matrix_1[16][19]:=NS_1/c_scale*AT*synRate*0.279104;
+rate_matrix_1[16][20]:=NS_1/c_scale*AC*synRate*0.166866;
+rate_matrix_1[16][24]:=NS_1/c_scale*synRate*0.221194;
+rate_matrix_1[16][28]:=NS_1/c_scale*AT*synRate*0.306866;
+rate_matrix_1[16][32]:=NS_1/c_scale*CG*synRate*0.264776;
+rate_matrix_1[17][1]:=NS_1/c_scale*AC*synRate*0.340299;
+rate_matrix_1[17][16]:=NS_1/c_scale*AC*synRate*0.210149;
+rate_matrix_1[17][18]:=NS_1/c_scale*CG*synRate*0.260597;
+rate_matrix_1[17][19]:=S_1/c_scale*CT*synRate*0.279104;
+rate_matrix_1[17][21]:=NS_1/c_scale*AC*synRate*0.166866;
+rate_matrix_1[17][25]:=NS_1/c_scale*synRate*0.221194;
+rate_matrix_1[17][29]:=NS_1/c_scale*AT*synRate*0.306866;
+rate_matrix_1[17][33]:=NS_1/c_scale*CG*synRate*0.264776;
+rate_matrix_1[17][48]:=NS_1/c_scale*CT*synRate*0.171642;
+rate_matrix_1[18][2]:=NS_1/c_scale*AC*synRate*0.340299;
+rate_matrix_1[18][16]:=S_1/c_scale*synRate*0.210149;
+rate_matrix_1[18][17]:=NS_1/c_scale*CG*synRate*0.250149;
+rate_matrix_1[18][19]:=NS_1/c_scale*GT*synRate*0.279104;
+rate_matrix_1[18][22]:=NS_1/c_scale*AC*synRate*0.166866;
+rate_matrix_1[18][26]:=NS_1/c_scale*synRate*0.221194;
+rate_matrix_1[18][30]:=NS_1/c_scale*AT*synRate*0.306866;
+rate_matrix_1[18][34]:=NS_1/c_scale*CG*synRate*0.264776;
+rate_matrix_1[19][3]:=NS_1/c_scale*AC*synRate*0.340299;
+rate_matrix_1[19][16]:=NS_1/c_scale*AT*synRate*0.210149;
+rate_matrix_1[19][17]:=S_1/c_scale*CT*synRate*0.250149;
+rate_matrix_1[19][18]:=NS_1/c_scale*GT*synRate*0.260597;
+rate_matrix_1[19][23]:=NS_1/c_scale*AC*synRate*0.166866;
+rate_matrix_1[19][27]:=NS_1/c_scale*synRate*0.221194;
+rate_matrix_1[19][31]:=NS_1/c_scale*AT*synRate*0.306866;
+rate_matrix_1[19][35]:=NS_1/c_scale*CG*synRate*0.264776;
+rate_matrix_1[19][49]:=NS_1/c_scale*CT*synRate*0.171642;
+rate_matrix_1[20][4]:=NS_1/c_scale*AC*synRate*0.340299;
+rate_matrix_1[20][16]:=NS_1/c_scale*AC*synRate*0.305075;
+rate_matrix_1[20][21]:=S_1/c_scale*AC*synRate*0.250149;
+rate_matrix_1[20][22]:=S_1/c_scale*synRate*0.260597;
+rate_matrix_1[20][23]:=S_1/c_scale*AT*synRate*0.279104;
+rate_matrix_1[20][24]:=NS_1/c_scale*CG*synRate*0.221194;
+rate_matrix_1[20][28]:=NS_1/c_scale*CT*synRate*0.306866;
+rate_matrix_1[20][36]:=NS_1/c_scale*CG*synRate*0.264776;
+rate_matrix_1[20][50]:=NS_1/c_scale*CT*synRate*0.171642;
+rate_matrix_1[21][5]:=NS_1/c_scale*AC*synRate*0.340299;
+rate_matrix_1[21][17]:=NS_1/c_scale*AC*synRate*0.305075;
+rate_matrix_1[21][20]:=S_1/c_scale*AC*synRate*0.210149;
+rate_matrix_1[21][22]:=S_1/c_scale*CG*synRate*0.260597;
+rate_matrix_1[21][23]:=S_1/c_scale*CT*synRate*0.279104;
+rate_matrix_1[21][25]:=NS_1/c_scale*CG*synRate*0.221194;
+rate_matrix_1[21][29]:=NS_1/c_scale*CT*synRate*0.306866;
+rate_matrix_1[21][37]:=NS_1/c_scale*CG*synRate*0.264776;
+rate_matrix_1[21][51]:=NS_1/c_scale*CT*synRate*0.171642;
+rate_matrix_1[22][6]:=NS_1/c_scale*AC*synRate*0.340299;
+rate_matrix_1[22][18]:=NS_1/c_scale*AC*synRate*0.305075;
+rate_matrix_1[22][20]:=S_1/c_scale*synRate*0.210149;
+rate_matrix_1[22][21]:=S_1/c_scale*CG*synRate*0.250149;
+rate_matrix_1[22][23]:=S_1/c_scale*GT*synRate*0.279104;
+rate_matrix_1[22][26]:=NS_1/c_scale*CG*synRate*0.221194;
+rate_matrix_1[22][30]:=NS_1/c_scale*CT*synRate*0.306866;
+rate_matrix_1[22][38]:=NS_1/c_scale*CG*synRate*0.264776;
+rate_matrix_1[22][52]:=NS_1/c_scale*CT*synRate*0.171642;
+rate_matrix_1[23][7]:=NS_1/c_scale*AC*synRate*0.340299;
+rate_matrix_1[23][19]:=NS_1/c_scale*AC*synRate*0.305075;
+rate_matrix_1[23][20]:=S_1/c_scale*AT*synRate*0.210149;
+rate_matrix_1[23][21]:=S_1/c_scale*CT*synRate*0.250149;
+rate_matrix_1[23][22]:=S_1/c_scale*GT*synRate*0.260597;
+rate_matrix_1[23][27]:=NS_1/c_scale*CG*synRate*0.221194;
+rate_matrix_1[23][31]:=NS_1/c_scale*CT*synRate*0.306866;
+rate_matrix_1[23][39]:=NS_1/c_scale*CG*synRate*0.264776;
+rate_matrix_1[23][53]:=NS_1/c_scale*CT*synRate*0.171642;
+rate_matrix_1[24][8]:=S_1/c_scale*AC*synRate*0.340299;
+rate_matrix_1[24][16]:=NS_1/c_scale*synRate*0.305075;
+rate_matrix_1[24][20]:=NS_1/c_scale*CG*synRate*0.166866;
+rate_matrix_1[24][25]:=S_1/c_scale*AC*synRate*0.250149;
+rate_matrix_1[24][26]:=S_1/c_scale*synRate*0.260597;
+rate_matrix_1[24][27]:=S_1/c_scale*AT*synRate*0.279104;
+rate_matrix_1[24][28]:=NS_1/c_scale*GT*synRate*0.306866;
+rate_matrix_1[24][40]:=NS_1/c_scale*CG*synRate*0.264776;
+rate_matrix_1[25][9]:=NS_1/c_scale*AC*synRate*0.340299;
+rate_matrix_1[25][17]:=NS_1/c_scale*synRate*0.305075;
+rate_matrix_1[25][21]:=NS_1/c_scale*CG*synRate*0.166866;
+rate_matrix_1[25][24]:=S_1/c_scale*AC*synRate*0.210149;
+rate_matrix_1[25][26]:=S_1/c_scale*CG*synRate*0.260597;
+rate_matrix_1[25][27]:=S_1/c_scale*CT*synRate*0.279104;
+rate_matrix_1[25][29]:=NS_1/c_scale*GT*synRate*0.306866;
+rate_matrix_1[25][41]:=NS_1/c_scale*CG*synRate*0.264776;
+rate_matrix_1[25][54]:=NS_1/c_scale*CT*synRate*0.171642;
+rate_matrix_1[26][10]:=S_1/c_scale*AC*synRate*0.340299;
+rate_matrix_1[26][18]:=NS_1/c_scale*synRate*0.305075;
+rate_matrix_1[26][22]:=NS_1/c_scale*CG*synRate*0.166866;
+rate_matrix_1[26][24]:=S_1/c_scale*synRate*0.210149;
+rate_matrix_1[26][25]:=S_1/c_scale*CG*synRate*0.250149;
+rate_matrix_1[26][27]:=S_1/c_scale*GT*synRate*0.279104;
+rate_matrix_1[26][30]:=NS_1/c_scale*GT*synRate*0.306866;
+rate_matrix_1[26][42]:=NS_1/c_scale*CG*synRate*0.264776;
+rate_matrix_1[26][55]:=NS_1/c_scale*CT*synRate*0.171642;
+rate_matrix_1[27][11]:=NS_1/c_scale*AC*synRate*0.340299;
+rate_matrix_1[27][19]:=NS_1/c_scale*synRate*0.305075;
+rate_matrix_1[27][23]:=NS_1/c_scale*CG*synRate*0.166866;
+rate_matrix_1[27][24]:=S_1/c_scale*AT*synRate*0.210149;
+rate_matrix_1[27][25]:=S_1/c_scale*CT*synRate*0.250149;
+rate_matrix_1[27][26]:=S_1/c_scale*GT*synRate*0.260597;
+rate_matrix_1[27][31]:=NS_1/c_scale*GT*synRate*0.306866;
+rate_matrix_1[27][43]:=NS_1/c_scale*CG*synRate*0.264776;
+rate_matrix_1[27][56]:=NS_1/c_scale*CT*synRate*0.171642;
+rate_matrix_1[28][12]:=NS_1/c_scale*AC*synRate*0.340299;
+rate_matrix_1[28][16]:=NS_1/c_scale*AT*synRate*0.305075;
+rate_matrix_1[28][20]:=NS_1/c_scale*CT*synRate*0.166866;
+rate_matrix_1[28][24]:=NS_1/c_scale*GT*synRate*0.221194;
+rate_matrix_1[28][29]:=S_1/c_scale*AC*synRate*0.250149;
+rate_matrix_1[28][30]:=S_1/c_scale*synRate*0.260597;
+rate_matrix_1[28][31]:=S_1/c_scale*AT*synRate*0.279104;
+rate_matrix_1[28][44]:=NS_1/c_scale*CG*synRate*0.264776;
+rate_matrix_1[28][57]:=S_1/c_scale*CT*synRate*0.171642;
+rate_matrix_1[29][13]:=NS_1/c_scale*AC*synRate*0.340299;
+rate_matrix_1[29][17]:=NS_1/c_scale*AT*synRate*0.305075;
+rate_matrix_1[29][21]:=NS_1/c_scale*CT*synRate*0.166866;
+rate_matrix_1[29][25]:=NS_1/c_scale*GT*synRate*0.221194;
+rate_matrix_1[29][28]:=S_1/c_scale*AC*synRate*0.210149;
+rate_matrix_1[29][30]:=S_1/c_scale*CG*synRate*0.260597;
+rate_matrix_1[29][31]:=S_1/c_scale*CT*synRate*0.279104;
+rate_matrix_1[29][45]:=NS_1/c_scale*CG*synRate*0.264776;
+rate_matrix_1[29][58]:=NS_1/c_scale*CT*synRate*0.171642;
+rate_matrix_1[30][14]:=NS_1/c_scale*AC*synRate*0.340299;
+rate_matrix_1[30][18]:=NS_1/c_scale*AT*synRate*0.305075;
+rate_matrix_1[30][22]:=NS_1/c_scale*CT*synRate*0.166866;
+rate_matrix_1[30][26]:=NS_1/c_scale*GT*synRate*0.221194;
+rate_matrix_1[30][28]:=S_1/c_scale*synRate*0.210149;
+rate_matrix_1[30][29]:=S_1/c_scale*CG*synRate*0.250149;
+rate_matrix_1[30][31]:=S_1/c_scale*GT*synRate*0.279104;
+rate_matrix_1[30][46]:=NS_1/c_scale*CG*synRate*0.264776;
+rate_matrix_1[30][59]:=S_1/c_scale*CT*synRate*0.171642;
+rate_matrix_1[31][15]:=NS_1/c_scale*AC*synRate*0.340299;
+rate_matrix_1[31][19]:=NS_1/c_scale*AT*synRate*0.305075;
+rate_matrix_1[31][23]:=NS_1/c_scale*CT*synRate*0.166866;
+rate_matrix_1[31][27]:=NS_1/c_scale*GT*synRate*0.221194;
+rate_matrix_1[31][28]:=S_1/c_scale*AT*synRate*0.210149;
+rate_matrix_1[31][29]:=S_1/c_scale*CT*synRate*0.250149;
+rate_matrix_1[31][30]:=S_1/c_scale*GT*synRate*0.260597;
+rate_matrix_1[31][47]:=NS_1/c_scale*CG*synRate*0.264776;
+rate_matrix_1[31][60]:=NS_1/c_scale*CT*synRate*0.171642;
+rate_matrix_1[32][0]:=NS_1/c_scale*synRate*0.340299;
+rate_matrix_1[32][16]:=NS_1/c_scale*CG*synRate*0.223284;
+rate_matrix_1[32][33]:=NS_1/c_scale*AC*synRate*0.250149;
+rate_matrix_1[32][34]:=S_1/c_scale*synRate*0.260597;
+rate_matrix_1[32][35]:=NS_1/c_scale*AT*synRate*0.279104;
+rate_matrix_1[32][36]:=NS_1/c_scale*AC*synRate*0.166866;
+rate_matrix_1[32][40]:=NS_1/c_scale*synRate*0.221194;
+rate_matrix_1[32][44]:=NS_1/c_scale*AT*synRate*0.306866;
+rate_matrix_1[33][1]:=NS_1/c_scale*synRate*0.340299;
+rate_matrix_1[33][17]:=NS_1/c_scale*CG*synRate*0.223284;
+rate_matrix_1[33][32]:=NS_1/c_scale*AC*synRate*0.210149;
+rate_matrix_1[33][34]:=NS_1/c_scale*CG*synRate*0.260597;
+rate_matrix_1[33][35]:=S_1/c_scale*CT*synRate*0.279104;
+rate_matrix_1[33][37]:=NS_1/c_scale*AC*synRate*0.166866;
+rate_matrix_1[33][41]:=NS_1/c_scale*synRate*0.221194;
+rate_matrix_1[33][45]:=NS_1/c_scale*AT*synRate*0.306866;
+rate_matrix_1[33][48]:=NS_1/c_scale*GT*synRate*0.171642;
+rate_matrix_1[34][2]:=NS_1/c_scale*synRate*0.340299;
+rate_matrix_1[34][18]:=NS_1/c_scale*CG*synRate*0.223284;
+rate_matrix_1[34][32]:=S_1/c_scale*synRate*0.210149;
+rate_matrix_1[34][33]:=NS_1/c_scale*CG*synRate*0.250149;
+rate_matrix_1[34][35]:=NS_1/c_scale*GT*synRate*0.279104;
+rate_matrix_1[34][38]:=NS_1/c_scale*AC*synRate*0.166866;
+rate_matrix_1[34][42]:=NS_1/c_scale*synRate*0.221194;
+rate_matrix_1[34][46]:=NS_1/c_scale*AT*synRate*0.306866;
+rate_matrix_1[35][3]:=NS_1/c_scale*synRate*0.340299;
+rate_matrix_1[35][19]:=NS_1/c_scale*CG*synRate*0.223284;
+rate_matrix_1[35][32]:=NS_1/c_scale*AT*synRate*0.210149;
+rate_matrix_1[35][33]:=S_1/c_scale*CT*synRate*0.250149;
+rate_matrix_1[35][34]:=NS_1/c_scale*GT*synRate*0.260597;
+rate_matrix_1[35][39]:=NS_1/c_scale*AC*synRate*0.166866;
+rate_matrix_1[35][43]:=NS_1/c_scale*synRate*0.221194;
+rate_matrix_1[35][47]:=NS_1/c_scale*AT*synRate*0.306866;
+rate_matrix_1[35][49]:=NS_1/c_scale*GT*synRate*0.171642;
+rate_matrix_1[36][4]:=NS_1/c_scale*synRate*0.340299;
+rate_matrix_1[36][20]:=NS_1/c_scale*CG*synRate*0.223284;
+rate_matrix_1[36][32]:=NS_1/c_scale*AC*synRate*0.305075;
+rate_matrix_1[36][37]:=S_1/c_scale*AC*synRate*0.250149;
+rate_matrix_1[36][38]:=S_1/c_scale*synRate*0.260597;
+rate_matrix_1[36][39]:=S_1/c_scale*AT*synRate*0.279104;
+rate_matrix_1[36][40]:=NS_1/c_scale*CG*synRate*0.221194;
+rate_matrix_1[36][44]:=NS_1/c_scale*CT*synRate*0.306866;
+rate_matrix_1[36][50]:=NS_1/c_scale*GT*synRate*0.171642;
+rate_matrix_1[37][5]:=NS_1/c_scale*synRate*0.340299;
+rate_matrix_1[37][21]:=NS_1/c_scale*CG*synRate*0.223284;
+rate_matrix_1[37][33]:=NS_1/c_scale*AC*synRate*0.305075;
+rate_matrix_1[37][36]:=S_1/c_scale*AC*synRate*0.210149;
+rate_matrix_1[37][38]:=S_1/c_scale*CG*synRate*0.260597;
+rate_matrix_1[37][39]:=S_1/c_scale*CT*synRate*0.279104;
+rate_matrix_1[37][41]:=NS_1/c_scale*CG*synRate*0.221194;
+rate_matrix_1[37][45]:=NS_1/c_scale*CT*synRate*0.306866;
+rate_matrix_1[37][51]:=NS_1/c_scale*GT*synRate*0.171642;
+rate_matrix_1[38][6]:=NS_1/c_scale*synRate*0.340299;
+rate_matrix_1[38][22]:=NS_1/c_scale*CG*synRate*0.223284;
+rate_matrix_1[38][34]:=NS_1/c_scale*AC*synRate*0.305075;
+rate_matrix_1[38][36]:=S_1/c_scale*synRate*0.210149;
+rate_matrix_1[38][37]:=S_1/c_scale*CG*synRate*0.250149;
+rate_matrix_1[38][39]:=S_1/c_scale*GT*synRate*0.279104;
+rate_matrix_1[38][42]:=NS_1/c_scale*CG*synRate*0.221194;
+rate_matrix_1[38][46]:=NS_1/c_scale*CT*synRate*0.306866;
+rate_matrix_1[38][52]:=NS_1/c_scale*GT*synRate*0.171642;
+rate_matrix_1[39][7]:=NS_1/c_scale*synRate*0.340299;
+rate_matrix_1[39][23]:=NS_1/c_scale*CG*synRate*0.223284;
+rate_matrix_1[39][35]:=NS_1/c_scale*AC*synRate*0.305075;
+rate_matrix_1[39][36]:=S_1/c_scale*AT*synRate*0.210149;
+rate_matrix_1[39][37]:=S_1/c_scale*CT*synRate*0.250149;
+rate_matrix_1[39][38]:=S_1/c_scale*GT*synRate*0.260597;
+rate_matrix_1[39][43]:=NS_1/c_scale*CG*synRate*0.221194;
+rate_matrix_1[39][47]:=NS_1/c_scale*CT*synRate*0.306866;
+rate_matrix_1[39][53]:=NS_1/c_scale*GT*synRate*0.171642;
+rate_matrix_1[40][8]:=NS_1/c_scale*synRate*0.340299;
+rate_matrix_1[40][24]:=NS_1/c_scale*CG*synRate*0.223284;
+rate_matrix_1[40][32]:=NS_1/c_scale*synRate*0.305075;
+rate_matrix_1[40][36]:=NS_1/c_scale*CG*synRate*0.166866;
+rate_matrix_1[40][41]:=S_1/c_scale*AC*synRate*0.250149;
+rate_matrix_1[40][42]:=S_1/c_scale*synRate*0.260597;
+rate_matrix_1[40][43]:=S_1/c_scale*AT*synRate*0.279104;
+rate_matrix_1[40][44]:=NS_1/c_scale*GT*synRate*0.306866;
+rate_matrix_1[41][9]:=NS_1/c_scale*synRate*0.340299;
+rate_matrix_1[41][25]:=NS_1/c_scale*CG*synRate*0.223284;
+rate_matrix_1[41][33]:=NS_1/c_scale*synRate*0.305075;
+rate_matrix_1[41][37]:=NS_1/c_scale*CG*synRate*0.166866;
+rate_matrix_1[41][40]:=S_1/c_scale*AC*synRate*0.210149;
+rate_matrix_1[41][42]:=S_1/c_scale*CG*synRate*0.260597;
+rate_matrix_1[41][43]:=S_1/c_scale*CT*synRate*0.279104;
+rate_matrix_1[41][45]:=NS_1/c_scale*GT*synRate*0.306866;
+rate_matrix_1[41][54]:=NS_1/c_scale*GT*synRate*0.171642;
+rate_matrix_1[42][10]:=NS_1/c_scale*synRate*0.340299;
+rate_matrix_1[42][26]:=NS_1/c_scale*CG*synRate*0.223284;
+rate_matrix_1[42][34]:=NS_1/c_scale*synRate*0.305075;
+rate_matrix_1[42][38]:=NS_1/c_scale*CG*synRate*0.166866;
+rate_matrix_1[42][40]:=S_1/c_scale*synRate*0.210149;
+rate_matrix_1[42][41]:=S_1/c_scale*CG*synRate*0.250149;
+rate_matrix_1[42][43]:=S_1/c_scale*GT*synRate*0.279104;
+rate_matrix_1[42][46]:=NS_1/c_scale*GT*synRate*0.306866;
+rate_matrix_1[42][55]:=NS_1/c_scale*GT*synRate*0.171642;
+rate_matrix_1[43][11]:=NS_1/c_scale*synRate*0.340299;
+rate_matrix_1[43][27]:=NS_1/c_scale*CG*synRate*0.223284;
+rate_matrix_1[43][35]:=NS_1/c_scale*synRate*0.305075;
+rate_matrix_1[43][39]:=NS_1/c_scale*CG*synRate*0.166866;
+rate_matrix_1[43][40]:=S_1/c_scale*AT*synRate*0.210149;
+rate_matrix_1[43][41]:=S_1/c_scale*CT*synRate*0.250149;
+rate_matrix_1[43][42]:=S_1/c_scale*GT*synRate*0.260597;
+rate_matrix_1[43][47]:=NS_1/c_scale*GT*synRate*0.306866;
+rate_matrix_1[43][56]:=NS_1/c_scale*GT*synRate*0.171642;
+rate_matrix_1[44][12]:=NS_1/c_scale*synRate*0.340299;
+rate_matrix_1[44][28]:=NS_1/c_scale*CG*synRate*0.223284;
+rate_matrix_1[44][32]:=NS_1/c_scale*AT*synRate*0.305075;
+rate_matrix_1[44][36]:=NS_1/c_scale*CT*synRate*0.166866;
+rate_matrix_1[44][40]:=NS_1/c_scale*GT*synRate*0.221194;
+rate_matrix_1[44][45]:=S_1/c_scale*AC*synRate*0.250149;
+rate_matrix_1[44][46]:=S_1/c_scale*synRate*0.260597;
+rate_matrix_1[44][47]:=S_1/c_scale*AT*synRate*0.279104;
+rate_matrix_1[44][57]:=NS_1/c_scale*GT*synRate*0.171642;
+rate_matrix_1[45][13]:=NS_1/c_scale*synRate*0.340299;
+rate_matrix_1[45][29]:=NS_1/c_scale*CG*synRate*0.223284;
+rate_matrix_1[45][33]:=NS_1/c_scale*AT*synRate*0.305075;
+rate_matrix_1[45][37]:=NS_1/c_scale*CT*synRate*0.166866;
+rate_matrix_1[45][41]:=NS_1/c_scale*GT*synRate*0.221194;
+rate_matrix_1[45][44]:=S_1/c_scale*AC*synRate*0.210149;
+rate_matrix_1[45][46]:=S_1/c_scale*CG*synRate*0.260597;
+rate_matrix_1[45][47]:=S_1/c_scale*CT*synRate*0.279104;
+rate_matrix_1[45][58]:=NS_1/c_scale*GT*synRate*0.171642;
+rate_matrix_1[46][14]:=NS_1/c_scale*synRate*0.340299;
+rate_matrix_1[46][30]:=NS_1/c_scale*CG*synRate*0.223284;
+rate_matrix_1[46][34]:=NS_1/c_scale*AT*synRate*0.305075;
+rate_matrix_1[46][38]:=NS_1/c_scale*CT*synRate*0.166866;
+rate_matrix_1[46][42]:=NS_1/c_scale*GT*synRate*0.221194;
+rate_matrix_1[46][44]:=S_1/c_scale*synRate*0.210149;
+rate_matrix_1[46][45]:=S_1/c_scale*CG*synRate*0.250149;
+rate_matrix_1[46][47]:=S_1/c_scale*GT*synRate*0.279104;
+rate_matrix_1[46][59]:=NS_1/c_scale*GT*synRate*0.171642;
+rate_matrix_1[47][15]:=NS_1/c_scale*synRate*0.340299;
+rate_matrix_1[47][31]:=NS_1/c_scale*CG*synRate*0.223284;
+rate_matrix_1[47][35]:=NS_1/c_scale*AT*synRate*0.305075;
+rate_matrix_1[47][39]:=NS_1/c_scale*CT*synRate*0.166866;
+rate_matrix_1[47][43]:=NS_1/c_scale*GT*synRate*0.221194;
+rate_matrix_1[47][44]:=S_1/c_scale*AT*synRate*0.210149;
+rate_matrix_1[47][45]:=S_1/c_scale*CT*synRate*0.250149;
+rate_matrix_1[47][46]:=S_1/c_scale*GT*synRate*0.260597;
+rate_matrix_1[47][60]:=NS_1/c_scale*GT*synRate*0.171642;
+rate_matrix_1[48][1]:=NS_1/c_scale*AT*synRate*0.340299;
+rate_matrix_1[48][17]:=NS_1/c_scale*CT*synRate*0.223284;
+rate_matrix_1[48][33]:=NS_1/c_scale*GT*synRate*0.264776;
+rate_matrix_1[48][49]:=S_1/c_scale*CT*synRate*0.279104;
+rate_matrix_1[48][51]:=NS_1/c_scale*AC*synRate*0.166866;
+rate_matrix_1[48][54]:=NS_1/c_scale*synRate*0.221194;
+rate_matrix_1[48][58]:=NS_1/c_scale*AT*synRate*0.306866;
+rate_matrix_1[49][3]:=NS_1/c_scale*AT*synRate*0.340299;
+rate_matrix_1[49][19]:=NS_1/c_scale*CT*synRate*0.223284;
+rate_matrix_1[49][35]:=NS_1/c_scale*GT*synRate*0.264776;
+rate_matrix_1[49][48]:=S_1/c_scale*CT*synRate*0.250149;
+rate_matrix_1[49][53]:=NS_1/c_scale*AC*synRate*0.166866;
+rate_matrix_1[49][56]:=NS_1/c_scale*synRate*0.221194;
+rate_matrix_1[49][60]:=NS_1/c_scale*AT*synRate*0.306866;
+rate_matrix_1[50][4]:=NS_1/c_scale*AT*synRate*0.340299;
+rate_matrix_1[50][20]:=NS_1/c_scale*CT*synRate*0.223284;
+rate_matrix_1[50][36]:=NS_1/c_scale*GT*synRate*0.264776;
+rate_matrix_1[50][51]:=S_1/c_scale*AC*synRate*0.250149;
+rate_matrix_1[50][52]:=S_1/c_scale*synRate*0.260597;
+rate_matrix_1[50][53]:=S_1/c_scale*AT*synRate*0.279104;
+rate_matrix_1[50][57]:=NS_1/c_scale*CT*synRate*0.306866;
+rate_matrix_1[51][5]:=NS_1/c_scale*AT*synRate*0.340299;
+rate_matrix_1[51][21]:=NS_1/c_scale*CT*synRate*0.223284;
+rate_matrix_1[51][37]:=NS_1/c_scale*GT*synRate*0.264776;
+rate_matrix_1[51][48]:=NS_1/c_scale*AC*synRate*0.305075;
+rate_matrix_1[51][50]:=S_1/c_scale*AC*synRate*0.210149;
+rate_matrix_1[51][52]:=S_1/c_scale*CG*synRate*0.260597;
+rate_matrix_1[51][53]:=S_1/c_scale*CT*synRate*0.279104;
+rate_matrix_1[51][54]:=NS_1/c_scale*CG*synRate*0.221194;
+rate_matrix_1[51][58]:=NS_1/c_scale*CT*synRate*0.306866;
+rate_matrix_1[52][6]:=NS_1/c_scale*AT*synRate*0.340299;
+rate_matrix_1[52][22]:=NS_1/c_scale*CT*synRate*0.223284;
+rate_matrix_1[52][38]:=NS_1/c_scale*GT*synRate*0.264776;
+rate_matrix_1[52][50]:=S_1/c_scale*synRate*0.210149;
+rate_matrix_1[52][51]:=S_1/c_scale*CG*synRate*0.250149;
+rate_matrix_1[52][53]:=S_1/c_scale*GT*synRate*0.279104;
+rate_matrix_1[52][55]:=NS_1/c_scale*CG*synRate*0.221194;
+rate_matrix_1[52][59]:=NS_1/c_scale*CT*synRate*0.306866;
+rate_matrix_1[53][7]:=NS_1/c_scale*AT*synRate*0.340299;
+rate_matrix_1[53][23]:=NS_1/c_scale*CT*synRate*0.223284;
+rate_matrix_1[53][39]:=NS_1/c_scale*GT*synRate*0.264776;
+rate_matrix_1[53][49]:=NS_1/c_scale*AC*synRate*0.305075;
+rate_matrix_1[53][50]:=S_1/c_scale*AT*synRate*0.210149;
+rate_matrix_1[53][51]:=S_1/c_scale*CT*synRate*0.250149;
+rate_matrix_1[53][52]:=S_1/c_scale*GT*synRate*0.260597;
+rate_matrix_1[53][56]:=NS_1/c_scale*CG*synRate*0.221194;
+rate_matrix_1[53][60]:=NS_1/c_scale*CT*synRate*0.306866;
+rate_matrix_1[54][9]:=NS_1/c_scale*AT*synRate*0.340299;
+rate_matrix_1[54][25]:=NS_1/c_scale*CT*synRate*0.223284;
+rate_matrix_1[54][41]:=NS_1/c_scale*GT*synRate*0.264776;
+rate_matrix_1[54][48]:=NS_1/c_scale*synRate*0.305075;
+rate_matrix_1[54][51]:=NS_1/c_scale*CG*synRate*0.166866;
+rate_matrix_1[54][55]:=NS_1/c_scale*CG*synRate*0.260597;
+rate_matrix_1[54][56]:=S_1/c_scale*CT*synRate*0.279104;
+rate_matrix_1[54][58]:=NS_1/c_scale*GT*synRate*0.306866;
+rate_matrix_1[55][10]:=NS_1/c_scale*AT*synRate*0.340299;
+rate_matrix_1[55][26]:=NS_1/c_scale*CT*synRate*0.223284;
+rate_matrix_1[55][42]:=NS_1/c_scale*GT*synRate*0.264776;
+rate_matrix_1[55][52]:=NS_1/c_scale*CG*synRate*0.166866;
+rate_matrix_1[55][54]:=NS_1/c_scale*CG*synRate*0.250149;
+rate_matrix_1[55][56]:=NS_1/c_scale*GT*synRate*0.279104;
+rate_matrix_1[55][59]:=NS_1/c_scale*GT*synRate*0.306866;
+rate_matrix_1[56][11]:=NS_1/c_scale*AT*synRate*0.340299;
+rate_matrix_1[56][27]:=NS_1/c_scale*CT*synRate*0.223284;
+rate_matrix_1[56][43]:=NS_1/c_scale*GT*synRate*0.264776;
+rate_matrix_1[56][49]:=NS_1/c_scale*synRate*0.305075;
+rate_matrix_1[56][53]:=NS_1/c_scale*CG*synRate*0.166866;
+rate_matrix_1[56][54]:=S_1/c_scale*CT*synRate*0.250149;
+rate_matrix_1[56][55]:=NS_1/c_scale*GT*synRate*0.260597;
+rate_matrix_1[56][60]:=NS_1/c_scale*GT*synRate*0.306866;
+rate_matrix_1[57][12]:=NS_1/c_scale*AT*synRate*0.340299;
+rate_matrix_1[57][28]:=S_1/c_scale*CT*synRate*0.223284;
+rate_matrix_1[57][44]:=NS_1/c_scale*GT*synRate*0.264776;
+rate_matrix_1[57][50]:=NS_1/c_scale*CT*synRate*0.166866;
+rate_matrix_1[57][58]:=NS_1/c_scale*AC*synRate*0.250149;
+rate_matrix_1[57][59]:=S_1/c_scale*synRate*0.260597;
+rate_matrix_1[57][60]:=NS_1/c_scale*AT*synRate*0.279104;
+rate_matrix_1[58][13]:=NS_1/c_scale*AT*synRate*0.340299;
+rate_matrix_1[58][29]:=NS_1/c_scale*CT*synRate*0.223284;
+rate_matrix_1[58][45]:=NS_1/c_scale*GT*synRate*0.264776;
+rate_matrix_1[58][48]:=NS_1/c_scale*AT*synRate*0.305075;
+rate_matrix_1[58][51]:=NS_1/c_scale*CT*synRate*0.166866;
+rate_matrix_1[58][54]:=NS_1/c_scale*GT*synRate*0.221194;
+rate_matrix_1[58][57]:=NS_1/c_scale*AC*synRate*0.210149;
+rate_matrix_1[58][59]:=NS_1/c_scale*CG*synRate*0.260597;
+rate_matrix_1[58][60]:=S_1/c_scale*CT*synRate*0.279104;
+rate_matrix_1[59][14]:=NS_1/c_scale*AT*synRate*0.340299;
+rate_matrix_1[59][30]:=S_1/c_scale*CT*synRate*0.223284;
+rate_matrix_1[59][46]:=NS_1/c_scale*GT*synRate*0.264776;
+rate_matrix_1[59][52]:=NS_1/c_scale*CT*synRate*0.166866;
+rate_matrix_1[59][55]:=NS_1/c_scale*GT*synRate*0.221194;
+rate_matrix_1[59][57]:=S_1/c_scale*synRate*0.210149;
+rate_matrix_1[59][58]:=NS_1/c_scale*CG*synRate*0.250149;
+rate_matrix_1[59][60]:=NS_1/c_scale*GT*synRate*0.279104;
+rate_matrix_1[60][15]:=NS_1/c_scale*AT*synRate*0.340299;
+rate_matrix_1[60][31]:=NS_1/c_scale*CT*synRate*0.223284;
+rate_matrix_1[60][47]:=NS_1/c_scale*GT*synRate*0.264776;
+rate_matrix_1[60][49]:=NS_1/c_scale*AT*synRate*0.305075;
+rate_matrix_1[60][53]:=NS_1/c_scale*CT*synRate*0.166866;
+rate_matrix_1[60][56]:=NS_1/c_scale*GT*synRate*0.221194;
+rate_matrix_1[60][57]:=NS_1/c_scale*AT*synRate*0.210149;
+rate_matrix_1[60][58]:=S_1/c_scale*CT*synRate*0.250149;
+rate_matrix_1[60][59]:=NS_1/c_scale*GT*synRate*0.260597;
+
+
+Model MG94model_1=(rate_matrix_1,vectorOfFrequencies,0);
+rate_matrix_2={61,61};
+rate_matrix_2[0][1]:=NS_2/c_scale*AC*synRate*0.250149;
+rate_matrix_2[0][2]:=S_2/c_scale*synRate*0.260597;
+rate_matrix_2[0][3]:=NS_2/c_scale*AT*synRate*0.279104;
+rate_matrix_2[0][4]:=NS_2/c_scale*AC*synRate*0.166866;
+rate_matrix_2[0][8]:=NS_2/c_scale*synRate*0.221194;
+rate_matrix_2[0][12]:=NS_2/c_scale*AT*synRate*0.306866;
+rate_matrix_2[0][16]:=NS_2/c_scale*AC*synRate*0.223284;
+rate_matrix_2[0][32]:=NS_2/c_scale*synRate*0.264776;
+rate_matrix_2[1][0]:=NS_2/c_scale*AC*synRate*0.210149;
+rate_matrix_2[1][2]:=NS_2/c_scale*CG*synRate*0.260597;
+rate_matrix_2[1][3]:=S_2/c_scale*CT*synRate*0.279104;
+rate_matrix_2[1][5]:=NS_2/c_scale*AC*synRate*0.166866;
+rate_matrix_2[1][9]:=NS_2/c_scale*synRate*0.221194;
+rate_matrix_2[1][13]:=NS_2/c_scale*AT*synRate*0.306866;
+rate_matrix_2[1][17]:=NS_2/c_scale*AC*synRate*0.223284;
+rate_matrix_2[1][33]:=NS_2/c_scale*synRate*0.264776;
+rate_matrix_2[1][48]:=NS_2/c_scale*AT*synRate*0.171642;
+rate_matrix_2[2][0]:=S_2/c_scale*synRate*0.210149;
+rate_matrix_2[2][1]:=NS_2/c_scale*CG*synRate*0.250149;
+rate_matrix_2[2][3]:=NS_2/c_scale*GT*synRate*0.279104;
+rate_matrix_2[2][6]:=NS_2/c_scale*AC*synRate*0.166866;
+rate_matrix_2[2][10]:=NS_2/c_scale*synRate*0.221194;
+rate_matrix_2[2][14]:=NS_2/c_scale*AT*synRate*0.306866;
+rate_matrix_2[2][18]:=NS_2/c_scale*AC*synRate*0.223284;
+rate_matrix_2[2][34]:=NS_2/c_scale*synRate*0.264776;
+rate_matrix_2[3][0]:=NS_2/c_scale*AT*synRate*0.210149;
+rate_matrix_2[3][1]:=S_2/c_scale*CT*synRate*0.250149;
+rate_matrix_2[3][2]:=NS_2/c_scale*GT*synRate*0.260597;
+rate_matrix_2[3][7]:=NS_2/c_scale*AC*synRate*0.166866;
+rate_matrix_2[3][11]:=NS_2/c_scale*synRate*0.221194;
+rate_matrix_2[3][15]:=NS_2/c_scale*AT*synRate*0.306866;
+rate_matrix_2[3][19]:=NS_2/c_scale*AC*synRate*0.223284;
+rate_matrix_2[3][35]:=NS_2/c_scale*synRate*0.264776;
+rate_matrix_2[3][49]:=NS_2/c_scale*AT*synRate*0.171642;
+rate_matrix_2[4][0]:=NS_2/c_scale*AC*synRate*0.305075;
+rate_matrix_2[4][5]:=S_2/c_scale*AC*synRate*0.250149;
+rate_matrix_2[4][6]:=S_2/c_scale*synRate*0.260597;
+rate_matrix_2[4][7]:=S_2/c_scale*AT*synRate*0.279104;
+rate_matrix_2[4][8]:=NS_2/c_scale*CG*synRate*0.221194;
+rate_matrix_2[4][12]:=NS_2/c_scale*CT*synRate*0.306866;
+rate_matrix_2[4][20]:=NS_2/c_scale*AC*synRate*0.223284;
+rate_matrix_2[4][36]:=NS_2/c_scale*synRate*0.264776;
+rate_matrix_2[4][50]:=NS_2/c_scale*AT*synRate*0.171642;
+rate_matrix_2[5][1]:=NS_2/c_scale*AC*synRate*0.305075;
+rate_matrix_2[5][4]:=S_2/c_scale*AC*synRate*0.210149;
+rate_matrix_2[5][6]:=S_2/c_scale*CG*synRate*0.260597;
+rate_matrix_2[5][7]:=S_2/c_scale*CT*synRate*0.279104;
+rate_matrix_2[5][9]:=NS_2/c_scale*CG*synRate*0.221194;
+rate_matrix_2[5][13]:=NS_2/c_scale*CT*synRate*0.306866;
+rate_matrix_2[5][21]:=NS_2/c_scale*AC*synRate*0.223284;
+rate_matrix_2[5][37]:=NS_2/c_scale*synRate*0.264776;
+rate_matrix_2[5][51]:=NS_2/c_scale*AT*synRate*0.171642;
+rate_matrix_2[6][2]:=NS_2/c_scale*AC*synRate*0.305075;
+rate_matrix_2[6][4]:=S_2/c_scale*synRate*0.210149;
+rate_matrix_2[6][5]:=S_2/c_scale*CG*synRate*0.250149;
+rate_matrix_2[6][7]:=S_2/c_scale*GT*synRate*0.279104;
+rate_matrix_2[6][10]:=NS_2/c_scale*CG*synRate*0.221194;
+rate_matrix_2[6][14]:=NS_2/c_scale*CT*synRate*0.306866;
+rate_matrix_2[6][22]:=NS_2/c_scale*AC*synRate*0.223284;
+rate_matrix_2[6][38]:=NS_2/c_scale*synRate*0.264776;
+rate_matrix_2[6][52]:=NS_2/c_scale*AT*synRate*0.171642;
+rate_matrix_2[7][3]:=NS_2/c_scale*AC*synRate*0.305075;
+rate_matrix_2[7][4]:=S_2/c_scale*AT*synRate*0.210149;
+rate_matrix_2[7][5]:=S_2/c_scale*CT*synRate*0.250149;
+rate_matrix_2[7][6]:=S_2/c_scale*GT*synRate*0.260597;
+rate_matrix_2[7][11]:=NS_2/c_scale*CG*synRate*0.221194;
+rate_matrix_2[7][15]:=NS_2/c_scale*CT*synRate*0.306866;
+rate_matrix_2[7][23]:=NS_2/c_scale*AC*synRate*0.223284;
+rate_matrix_2[7][39]:=NS_2/c_scale*synRate*0.264776;
+rate_matrix_2[7][53]:=NS_2/c_scale*AT*synRate*0.171642;
+rate_matrix_2[8][0]:=NS_2/c_scale*synRate*0.305075;
+rate_matrix_2[8][4]:=NS_2/c_scale*CG*synRate*0.166866;
+rate_matrix_2[8][9]:=NS_2/c_scale*AC*synRate*0.250149;
+rate_matrix_2[8][10]:=S_2/c_scale*synRate*0.260597;
+rate_matrix_2[8][11]:=NS_2/c_scale*AT*synRate*0.279104;
+rate_matrix_2[8][12]:=NS_2/c_scale*GT*synRate*0.306866;
+rate_matrix_2[8][24]:=S_2/c_scale*AC*synRate*0.223284;
+rate_matrix_2[8][40]:=NS_2/c_scale*synRate*0.264776;
+rate_matrix_2[9][1]:=NS_2/c_scale*synRate*0.305075;
+rate_matrix_2[9][5]:=NS_2/c_scale*CG*synRate*0.166866;
+rate_matrix_2[9][8]:=NS_2/c_scale*AC*synRate*0.210149;
+rate_matrix_2[9][10]:=NS_2/c_scale*CG*synRate*0.260597;
+rate_matrix_2[9][11]:=S_2/c_scale*CT*synRate*0.279104;
+rate_matrix_2[9][13]:=NS_2/c_scale*GT*synRate*0.306866;
+rate_matrix_2[9][25]:=NS_2/c_scale*AC*synRate*0.223284;
+rate_matrix_2[9][41]:=NS_2/c_scale*synRate*0.264776;
+rate_matrix_2[9][54]:=NS_2/c_scale*AT*synRate*0.171642;
+rate_matrix_2[10][2]:=NS_2/c_scale*synRate*0.305075;
+rate_matrix_2[10][6]:=NS_2/c_scale*CG*synRate*0.166866;
+rate_matrix_2[10][8]:=S_2/c_scale*synRate*0.210149;
+rate_matrix_2[10][9]:=NS_2/c_scale*CG*synRate*0.250149;
+rate_matrix_2[10][11]:=NS_2/c_scale*GT*synRate*0.279104;
+rate_matrix_2[10][14]:=NS_2/c_scale*GT*synRate*0.306866;
+rate_matrix_2[10][26]:=S_2/c_scale*AC*synRate*0.223284;
+rate_matrix_2[10][42]:=NS_2/c_scale*synRate*0.264776;
+rate_matrix_2[10][55]:=NS_2/c_scale*AT*synRate*0.171642;
+rate_matrix_2[11][3]:=NS_2/c_scale*synRate*0.305075;
+rate_matrix_2[11][7]:=NS_2/c_scale*CG*synRate*0.166866;
+rate_matrix_2[11][8]:=NS_2/c_scale*AT*synRate*0.210149;
+rate_matrix_2[11][9]:=S_2/c_scale*CT*synRate*0.250149;
+rate_matrix_2[11][10]:=NS_2/c_scale*GT*synRate*0.260597;
+rate_matrix_2[11][15]:=NS_2/c_scale*GT*synRate*0.306866;
+rate_matrix_2[11][27]:=NS_2/c_scale*AC*synRate*0.223284;
+rate_matrix_2[11][43]:=NS_2/c_scale*synRate*0.264776;
+rate_matrix_2[11][56]:=NS_2/c_scale*AT*synRate*0.171642;
+rate_matrix_2[12][0]:=NS_2/c_scale*AT*synRate*0.305075;
+rate_matrix_2[12][4]:=NS_2/c_scale*CT*synRate*0.166866;
+rate_matrix_2[12][8]:=NS_2/c_scale*GT*synRate*0.221194;
+rate_matrix_2[12][13]:=S_2/c_scale*AC*synRate*0.250149;
+rate_matrix_2[12][14]:=NS_2/c_scale*synRate*0.260597;
+rate_matrix_2[12][15]:=S_2/c_scale*AT*synRate*0.279104;
+rate_matrix_2[12][28]:=NS_2/c_scale*AC*synRate*0.223284;
+rate_matrix_2[12][44]:=NS_2/c_scale*synRate*0.264776;
+rate_matrix_2[12][57]:=NS_2/c_scale*AT*synRate*0.171642;
+rate_matrix_2[13][1]:=NS_2/c_scale*AT*synRate*0.305075;
+rate_matrix_2[13][5]:=NS_2/c_scale*CT*synRate*0.166866;
+rate_matrix_2[13][9]:=NS_2/c_scale*GT*synRate*0.221194;
+rate_matrix_2[13][12]:=S_2/c_scale*AC*synRate*0.210149;
+rate_matrix_2[13][14]:=NS_2/c_scale*CG*synRate*0.260597;
+rate_matrix_2[13][15]:=S_2/c_scale*CT*synRate*0.279104;
+rate_matrix_2[13][29]:=NS_2/c_scale*AC*synRate*0.223284;
+rate_matrix_2[13][45]:=NS_2/c_scale*synRate*0.264776;
+rate_matrix_2[13][58]:=NS_2/c_scale*AT*synRate*0.171642;
+rate_matrix_2[14][2]:=NS_2/c_scale*AT*synRate*0.305075;
+rate_matrix_2[14][6]:=NS_2/c_scale*CT*synRate*0.166866;
+rate_matrix_2[14][10]:=NS_2/c_scale*GT*synRate*0.221194;
+rate_matrix_2[14][12]:=NS_2/c_scale*synRate*0.210149;
+rate_matrix_2[14][13]:=NS_2/c_scale*CG*synRate*0.250149;
+rate_matrix_2[14][15]:=NS_2/c_scale*GT*synRate*0.279104;
+rate_matrix_2[14][30]:=NS_2/c_scale*AC*synRate*0.223284;
+rate_matrix_2[14][46]:=NS_2/c_scale*synRate*0.264776;
+rate_matrix_2[14][59]:=NS_2/c_scale*AT*synRate*0.171642;
+rate_matrix_2[15][3]:=NS_2/c_scale*AT*synRate*0.305075;
+rate_matrix_2[15][7]:=NS_2/c_scale*CT*synRate*0.166866;
+rate_matrix_2[15][11]:=NS_2/c_scale*GT*synRate*0.221194;
+rate_matrix_2[15][12]:=S_2/c_scale*AT*synRate*0.210149;
+rate_matrix_2[15][13]:=S_2/c_scale*CT*synRate*0.250149;
+rate_matrix_2[15][14]:=NS_2/c_scale*GT*synRate*0.260597;
+rate_matrix_2[15][31]:=NS_2/c_scale*AC*synRate*0.223284;
+rate_matrix_2[15][47]:=NS_2/c_scale*synRate*0.264776;
+rate_matrix_2[15][60]:=NS_2/c_scale*AT*synRate*0.171642;
+rate_matrix_2[16][0]:=NS_2/c_scale*AC*synRate*0.340299;
+rate_matrix_2[16][17]:=NS_2/c_scale*AC*synRate*0.250149;
+rate_matrix_2[16][18]:=S_2/c_scale*synRate*0.260597;
+rate_matrix_2[16][19]:=NS_2/c_scale*AT*synRate*0.279104;
+rate_matrix_2[16][20]:=NS_2/c_scale*AC*synRate*0.166866;
+rate_matrix_2[16][24]:=NS_2/c_scale*synRate*0.221194;
+rate_matrix_2[16][28]:=NS_2/c_scale*AT*synRate*0.306866;
+rate_matrix_2[16][32]:=NS_2/c_scale*CG*synRate*0.264776;
+rate_matrix_2[17][1]:=NS_2/c_scale*AC*synRate*0.340299;
+rate_matrix_2[17][16]:=NS_2/c_scale*AC*synRate*0.210149;
+rate_matrix_2[17][18]:=NS_2/c_scale*CG*synRate*0.260597;
+rate_matrix_2[17][19]:=S_2/c_scale*CT*synRate*0.279104;
+rate_matrix_2[17][21]:=NS_2/c_scale*AC*synRate*0.166866;
+rate_matrix_2[17][25]:=NS_2/c_scale*synRate*0.221194;
+rate_matrix_2[17][29]:=NS_2/c_scale*AT*synRate*0.306866;
+rate_matrix_2[17][33]:=NS_2/c_scale*CG*synRate*0.264776;
+rate_matrix_2[17][48]:=NS_2/c_scale*CT*synRate*0.171642;
+rate_matrix_2[18][2]:=NS_2/c_scale*AC*synRate*0.340299;
+rate_matrix_2[18][16]:=S_2/c_scale*synRate*0.210149;
+rate_matrix_2[18][17]:=NS_2/c_scale*CG*synRate*0.250149;
+rate_matrix_2[18][19]:=NS_2/c_scale*GT*synRate*0.279104;
+rate_matrix_2[18][22]:=NS_2/c_scale*AC*synRate*0.166866;
+rate_matrix_2[18][26]:=NS_2/c_scale*synRate*0.221194;
+rate_matrix_2[18][30]:=NS_2/c_scale*AT*synRate*0.306866;
+rate_matrix_2[18][34]:=NS_2/c_scale*CG*synRate*0.264776;
+rate_matrix_2[19][3]:=NS_2/c_scale*AC*synRate*0.340299;
+rate_matrix_2[19][16]:=NS_2/c_scale*AT*synRate*0.210149;
+rate_matrix_2[19][17]:=S_2/c_scale*CT*synRate*0.250149;
+rate_matrix_2[19][18]:=NS_2/c_scale*GT*synRate*0.260597;
+rate_matrix_2[19][23]:=NS_2/c_scale*AC*synRate*0.166866;
+rate_matrix_2[19][27]:=NS_2/c_scale*synRate*0.221194;
+rate_matrix_2[19][31]:=NS_2/c_scale*AT*synRate*0.306866;
+rate_matrix_2[19][35]:=NS_2/c_scale*CG*synRate*0.264776;
+rate_matrix_2[19][49]:=NS_2/c_scale*CT*synRate*0.171642;
+rate_matrix_2[20][4]:=NS_2/c_scale*AC*synRate*0.340299;
+rate_matrix_2[20][16]:=NS_2/c_scale*AC*synRate*0.305075;
+rate_matrix_2[20][21]:=S_2/c_scale*AC*synRate*0.250149;
+rate_matrix_2[20][22]:=S_2/c_scale*synRate*0.260597;
+rate_matrix_2[20][23]:=S_2/c_scale*AT*synRate*0.279104;
+rate_matrix_2[20][24]:=NS_2/c_scale*CG*synRate*0.221194;
+rate_matrix_2[20][28]:=NS_2/c_scale*CT*synRate*0.306866;
+rate_matrix_2[20][36]:=NS_2/c_scale*CG*synRate*0.264776;
+rate_matrix_2[20][50]:=NS_2/c_scale*CT*synRate*0.171642;
+rate_matrix_2[21][5]:=NS_2/c_scale*AC*synRate*0.340299;
+rate_matrix_2[21][17]:=NS_2/c_scale*AC*synRate*0.305075;
+rate_matrix_2[21][20]:=S_2/c_scale*AC*synRate*0.210149;
+rate_matrix_2[21][22]:=S_2/c_scale*CG*synRate*0.260597;
+rate_matrix_2[21][23]:=S_2/c_scale*CT*synRate*0.279104;
+rate_matrix_2[21][25]:=NS_2/c_scale*CG*synRate*0.221194;
+rate_matrix_2[21][29]:=NS_2/c_scale*CT*synRate*0.306866;
+rate_matrix_2[21][37]:=NS_2/c_scale*CG*synRate*0.264776;
+rate_matrix_2[21][51]:=NS_2/c_scale*CT*synRate*0.171642;
+rate_matrix_2[22][6]:=NS_2/c_scale*AC*synRate*0.340299;
+rate_matrix_2[22][18]:=NS_2/c_scale*AC*synRate*0.305075;
+rate_matrix_2[22][20]:=S_2/c_scale*synRate*0.210149;
+rate_matrix_2[22][21]:=S_2/c_scale*CG*synRate*0.250149;
+rate_matrix_2[22][23]:=S_2/c_scale*GT*synRate*0.279104;
+rate_matrix_2[22][26]:=NS_2/c_scale*CG*synRate*0.221194;
+rate_matrix_2[22][30]:=NS_2/c_scale*CT*synRate*0.306866;
+rate_matrix_2[22][38]:=NS_2/c_scale*CG*synRate*0.264776;
+rate_matrix_2[22][52]:=NS_2/c_scale*CT*synRate*0.171642;
+rate_matrix_2[23][7]:=NS_2/c_scale*AC*synRate*0.340299;
+rate_matrix_2[23][19]:=NS_2/c_scale*AC*synRate*0.305075;
+rate_matrix_2[23][20]:=S_2/c_scale*AT*synRate*0.210149;
+rate_matrix_2[23][21]:=S_2/c_scale*CT*synRate*0.250149;
+rate_matrix_2[23][22]:=S_2/c_scale*GT*synRate*0.260597;
+rate_matrix_2[23][27]:=NS_2/c_scale*CG*synRate*0.221194;
+rate_matrix_2[23][31]:=NS_2/c_scale*CT*synRate*0.306866;
+rate_matrix_2[23][39]:=NS_2/c_scale*CG*synRate*0.264776;
+rate_matrix_2[23][53]:=NS_2/c_scale*CT*synRate*0.171642;
+rate_matrix_2[24][8]:=S_2/c_scale*AC*synRate*0.340299;
+rate_matrix_2[24][16]:=NS_2/c_scale*synRate*0.305075;
+rate_matrix_2[24][20]:=NS_2/c_scale*CG*synRate*0.166866;
+rate_matrix_2[24][25]:=S_2/c_scale*AC*synRate*0.250149;
+rate_matrix_2[24][26]:=S_2/c_scale*synRate*0.260597;
+rate_matrix_2[24][27]:=S_2/c_scale*AT*synRate*0.279104;
+rate_matrix_2[24][28]:=NS_2/c_scale*GT*synRate*0.306866;
+rate_matrix_2[24][40]:=NS_2/c_scale*CG*synRate*0.264776;
+rate_matrix_2[25][9]:=NS_2/c_scale*AC*synRate*0.340299;
+rate_matrix_2[25][17]:=NS_2/c_scale*synRate*0.305075;
+rate_matrix_2[25][21]:=NS_2/c_scale*CG*synRate*0.166866;
+rate_matrix_2[25][24]:=S_2/c_scale*AC*synRate*0.210149;
+rate_matrix_2[25][26]:=S_2/c_scale*CG*synRate*0.260597;
+rate_matrix_2[25][27]:=S_2/c_scale*CT*synRate*0.279104;
+rate_matrix_2[25][29]:=NS_2/c_scale*GT*synRate*0.306866;
+rate_matrix_2[25][41]:=NS_2/c_scale*CG*synRate*0.264776;
+rate_matrix_2[25][54]:=NS_2/c_scale*CT*synRate*0.171642;
+rate_matrix_2[26][10]:=S_2/c_scale*AC*synRate*0.340299;
+rate_matrix_2[26][18]:=NS_2/c_scale*synRate*0.305075;
+rate_matrix_2[26][22]:=NS_2/c_scale*CG*synRate*0.166866;
+rate_matrix_2[26][24]:=S_2/c_scale*synRate*0.210149;
+rate_matrix_2[26][25]:=S_2/c_scale*CG*synRate*0.250149;
+rate_matrix_2[26][27]:=S_2/c_scale*GT*synRate*0.279104;
+rate_matrix_2[26][30]:=NS_2/c_scale*GT*synRate*0.306866;
+rate_matrix_2[26][42]:=NS_2/c_scale*CG*synRate*0.264776;
+rate_matrix_2[26][55]:=NS_2/c_scale*CT*synRate*0.171642;
+rate_matrix_2[27][11]:=NS_2/c_scale*AC*synRate*0.340299;
+rate_matrix_2[27][19]:=NS_2/c_scale*synRate*0.305075;
+rate_matrix_2[27][23]:=NS_2/c_scale*CG*synRate*0.166866;
+rate_matrix_2[27][24]:=S_2/c_scale*AT*synRate*0.210149;
+rate_matrix_2[27][25]:=S_2/c_scale*CT*synRate*0.250149;
+rate_matrix_2[27][26]:=S_2/c_scale*GT*synRate*0.260597;
+rate_matrix_2[27][31]:=NS_2/c_scale*GT*synRate*0.306866;
+rate_matrix_2[27][43]:=NS_2/c_scale*CG*synRate*0.264776;
+rate_matrix_2[27][56]:=NS_2/c_scale*CT*synRate*0.171642;
+rate_matrix_2[28][12]:=NS_2/c_scale*AC*synRate*0.340299;
+rate_matrix_2[28][16]:=NS_2/c_scale*AT*synRate*0.305075;
+rate_matrix_2[28][20]:=NS_2/c_scale*CT*synRate*0.166866;
+rate_matrix_2[28][24]:=NS_2/c_scale*GT*synRate*0.221194;
+rate_matrix_2[28][29]:=S_2/c_scale*AC*synRate*0.250149;
+rate_matrix_2[28][30]:=S_2/c_scale*synRate*0.260597;
+rate_matrix_2[28][31]:=S_2/c_scale*AT*synRate*0.279104;
+rate_matrix_2[28][44]:=NS_2/c_scale*CG*synRate*0.264776;
+rate_matrix_2[28][57]:=S_2/c_scale*CT*synRate*0.171642;
+rate_matrix_2[29][13]:=NS_2/c_scale*AC*synRate*0.340299;
+rate_matrix_2[29][17]:=NS_2/c_scale*AT*synRate*0.305075;
+rate_matrix_2[29][21]:=NS_2/c_scale*CT*synRate*0.166866;
+rate_matrix_2[29][25]:=NS_2/c_scale*GT*synRate*0.221194;
+rate_matrix_2[29][28]:=S_2/c_scale*AC*synRate*0.210149;
+rate_matrix_2[29][30]:=S_2/c_scale*CG*synRate*0.260597;
+rate_matrix_2[29][31]:=S_2/c_scale*CT*synRate*0.279104;
+rate_matrix_2[29][45]:=NS_2/c_scale*CG*synRate*0.264776;
+rate_matrix_2[29][58]:=NS_2/c_scale*CT*synRate*0.171642;
+rate_matrix_2[30][14]:=NS_2/c_scale*AC*synRate*0.340299;
+rate_matrix_2[30][18]:=NS_2/c_scale*AT*synRate*0.305075;
+rate_matrix_2[30][22]:=NS_2/c_scale*CT*synRate*0.166866;
+rate_matrix_2[30][26]:=NS_2/c_scale*GT*synRate*0.221194;
+rate_matrix_2[30][28]:=S_2/c_scale*synRate*0.210149;
+rate_matrix_2[30][29]:=S_2/c_scale*CG*synRate*0.250149;
+rate_matrix_2[30][31]:=S_2/c_scale*GT*synRate*0.279104;
+rate_matrix_2[30][46]:=NS_2/c_scale*CG*synRate*0.264776;
+rate_matrix_2[30][59]:=S_2/c_scale*CT*synRate*0.171642;
+rate_matrix_2[31][15]:=NS_2/c_scale*AC*synRate*0.340299;
+rate_matrix_2[31][19]:=NS_2/c_scale*AT*synRate*0.305075;
+rate_matrix_2[31][23]:=NS_2/c_scale*CT*synRate*0.166866;
+rate_matrix_2[31][27]:=NS_2/c_scale*GT*synRate*0.221194;
+rate_matrix_2[31][28]:=S_2/c_scale*AT*synRate*0.210149;
+rate_matrix_2[31][29]:=S_2/c_scale*CT*synRate*0.250149;
+rate_matrix_2[31][30]:=S_2/c_scale*GT*synRate*0.260597;
+rate_matrix_2[31][47]:=NS_2/c_scale*CG*synRate*0.264776;
+rate_matrix_2[31][60]:=NS_2/c_scale*CT*synRate*0.171642;
+rate_matrix_2[32][0]:=NS_2/c_scale*synRate*0.340299;
+rate_matrix_2[32][16]:=NS_2/c_scale*CG*synRate*0.223284;
+rate_matrix_2[32][33]:=NS_2/c_scale*AC*synRate*0.250149;
+rate_matrix_2[32][34]:=S_2/c_scale*synRate*0.260597;
+rate_matrix_2[32][35]:=NS_2/c_scale*AT*synRate*0.279104;
+rate_matrix_2[32][36]:=NS_2/c_scale*AC*synRate*0.166866;
+rate_matrix_2[32][40]:=NS_2/c_scale*synRate*0.221194;
+rate_matrix_2[32][44]:=NS_2/c_scale*AT*synRate*0.306866;
+rate_matrix_2[33][1]:=NS_2/c_scale*synRate*0.340299;
+rate_matrix_2[33][17]:=NS_2/c_scale*CG*synRate*0.223284;
+rate_matrix_2[33][32]:=NS_2/c_scale*AC*synRate*0.210149;
+rate_matrix_2[33][34]:=NS_2/c_scale*CG*synRate*0.260597;
+rate_matrix_2[33][35]:=S_2/c_scale*CT*synRate*0.279104;
+rate_matrix_2[33][37]:=NS_2/c_scale*AC*synRate*0.166866;
+rate_matrix_2[33][41]:=NS_2/c_scale*synRate*0.221194;
+rate_matrix_2[33][45]:=NS_2/c_scale*AT*synRate*0.306866;
+rate_matrix_2[33][48]:=NS_2/c_scale*GT*synRate*0.171642;
+rate_matrix_2[34][2]:=NS_2/c_scale*synRate*0.340299;
+rate_matrix_2[34][18]:=NS_2/c_scale*CG*synRate*0.223284;
+rate_matrix_2[34][32]:=S_2/c_scale*synRate*0.210149;
+rate_matrix_2[34][33]:=NS_2/c_scale*CG*synRate*0.250149;
+rate_matrix_2[34][35]:=NS_2/c_scale*GT*synRate*0.279104;
+rate_matrix_2[34][38]:=NS_2/c_scale*AC*synRate*0.166866;
+rate_matrix_2[34][42]:=NS_2/c_scale*synRate*0.221194;
+rate_matrix_2[34][46]:=NS_2/c_scale*AT*synRate*0.306866;
+rate_matrix_2[35][3]:=NS_2/c_scale*synRate*0.340299;
+rate_matrix_2[35][19]:=NS_2/c_scale*CG*synRate*0.223284;
+rate_matrix_2[35][32]:=NS_2/c_scale*AT*synRate*0.210149;
+rate_matrix_2[35][33]:=S_2/c_scale*CT*synRate*0.250149;
+rate_matrix_2[35][34]:=NS_2/c_scale*GT*synRate*0.260597;
+rate_matrix_2[35][39]:=NS_2/c_scale*AC*synRate*0.166866;
+rate_matrix_2[35][43]:=NS_2/c_scale*synRate*0.221194;
+rate_matrix_2[35][47]:=NS_2/c_scale*AT*synRate*0.306866;
+rate_matrix_2[35][49]:=NS_2/c_scale*GT*synRate*0.171642;
+rate_matrix_2[36][4]:=NS_2/c_scale*synRate*0.340299;
+rate_matrix_2[36][20]:=NS_2/c_scale*CG*synRate*0.223284;
+rate_matrix_2[36][32]:=NS_2/c_scale*AC*synRate*0.305075;
+rate_matrix_2[36][37]:=S_2/c_scale*AC*synRate*0.250149;
+rate_matrix_2[36][38]:=S_2/c_scale*synRate*0.260597;
+rate_matrix_2[36][39]:=S_2/c_scale*AT*synRate*0.279104;
+rate_matrix_2[36][40]:=NS_2/c_scale*CG*synRate*0.221194;
+rate_matrix_2[36][44]:=NS_2/c_scale*CT*synRate*0.306866;
+rate_matrix_2[36][50]:=NS_2/c_scale*GT*synRate*0.171642;
+rate_matrix_2[37][5]:=NS_2/c_scale*synRate*0.340299;
+rate_matrix_2[37][21]:=NS_2/c_scale*CG*synRate*0.223284;
+rate_matrix_2[37][33]:=NS_2/c_scale*AC*synRate*0.305075;
+rate_matrix_2[37][36]:=S_2/c_scale*AC*synRate*0.210149;
+rate_matrix_2[37][38]:=S_2/c_scale*CG*synRate*0.260597;
+rate_matrix_2[37][39]:=S_2/c_scale*CT*synRate*0.279104;
+rate_matrix_2[37][41]:=NS_2/c_scale*CG*synRate*0.221194;
+rate_matrix_2[37][45]:=NS_2/c_scale*CT*synRate*0.306866;
+rate_matrix_2[37][51]:=NS_2/c_scale*GT*synRate*0.171642;
+rate_matrix_2[38][6]:=NS_2/c_scale*synRate*0.340299;
+rate_matrix_2[38][22]:=NS_2/c_scale*CG*synRate*0.223284;
+rate_matrix_2[38][34]:=NS_2/c_scale*AC*synRate*0.305075;
+rate_matrix_2[38][36]:=S_2/c_scale*synRate*0.210149;
+rate_matrix_2[38][37]:=S_2/c_scale*CG*synRate*0.250149;
+rate_matrix_2[38][39]:=S_2/c_scale*GT*synRate*0.279104;
+rate_matrix_2[38][42]:=NS_2/c_scale*CG*synRate*0.221194;
+rate_matrix_2[38][46]:=NS_2/c_scale*CT*synRate*0.306866;
+rate_matrix_2[38][52]:=NS_2/c_scale*GT*synRate*0.171642;
+rate_matrix_2[39][7]:=NS_2/c_scale*synRate*0.340299;
+rate_matrix_2[39][23]:=NS_2/c_scale*CG*synRate*0.223284;
+rate_matrix_2[39][35]:=NS_2/c_scale*AC*synRate*0.305075;
+rate_matrix_2[39][36]:=S_2/c_scale*AT*synRate*0.210149;
+rate_matrix_2[39][37]:=S_2/c_scale*CT*synRate*0.250149;
+rate_matrix_2[39][38]:=S_2/c_scale*GT*synRate*0.260597;
+rate_matrix_2[39][43]:=NS_2/c_scale*CG*synRate*0.221194;
+rate_matrix_2[39][47]:=NS_2/c_scale*CT*synRate*0.306866;
+rate_matrix_2[39][53]:=NS_2/c_scale*GT*synRate*0.171642;
+rate_matrix_2[40][8]:=NS_2/c_scale*synRate*0.340299;
+rate_matrix_2[40][24]:=NS_2/c_scale*CG*synRate*0.223284;
+rate_matrix_2[40][32]:=NS_2/c_scale*synRate*0.305075;
+rate_matrix_2[40][36]:=NS_2/c_scale*CG*synRate*0.166866;
+rate_matrix_2[40][41]:=S_2/c_scale*AC*synRate*0.250149;
+rate_matrix_2[40][42]:=S_2/c_scale*synRate*0.260597;
+rate_matrix_2[40][43]:=S_2/c_scale*AT*synRate*0.279104;
+rate_matrix_2[40][44]:=NS_2/c_scale*GT*synRate*0.306866;
+rate_matrix_2[41][9]:=NS_2/c_scale*synRate*0.340299;
+rate_matrix_2[41][25]:=NS_2/c_scale*CG*synRate*0.223284;
+rate_matrix_2[41][33]:=NS_2/c_scale*synRate*0.305075;
+rate_matrix_2[41][37]:=NS_2/c_scale*CG*synRate*0.166866;
+rate_matrix_2[41][40]:=S_2/c_scale*AC*synRate*0.210149;
+rate_matrix_2[41][42]:=S_2/c_scale*CG*synRate*0.260597;
+rate_matrix_2[41][43]:=S_2/c_scale*CT*synRate*0.279104;
+rate_matrix_2[41][45]:=NS_2/c_scale*GT*synRate*0.306866;
+rate_matrix_2[41][54]:=NS_2/c_scale*GT*synRate*0.171642;
+rate_matrix_2[42][10]:=NS_2/c_scale*synRate*0.340299;
+rate_matrix_2[42][26]:=NS_2/c_scale*CG*synRate*0.223284;
+rate_matrix_2[42][34]:=NS_2/c_scale*synRate*0.305075;
+rate_matrix_2[42][38]:=NS_2/c_scale*CG*synRate*0.166866;
+rate_matrix_2[42][40]:=S_2/c_scale*synRate*0.210149;
+rate_matrix_2[42][41]:=S_2/c_scale*CG*synRate*0.250149;
+rate_matrix_2[42][43]:=S_2/c_scale*GT*synRate*0.279104;
+rate_matrix_2[42][46]:=NS_2/c_scale*GT*synRate*0.306866;
+rate_matrix_2[42][55]:=NS_2/c_scale*GT*synRate*0.171642;
+rate_matrix_2[43][11]:=NS_2/c_scale*synRate*0.340299;
+rate_matrix_2[43][27]:=NS_2/c_scale*CG*synRate*0.223284;
+rate_matrix_2[43][35]:=NS_2/c_scale*synRate*0.305075;
+rate_matrix_2[43][39]:=NS_2/c_scale*CG*synRate*0.166866;
+rate_matrix_2[43][40]:=S_2/c_scale*AT*synRate*0.210149;
+rate_matrix_2[43][41]:=S_2/c_scale*CT*synRate*0.250149;
+rate_matrix_2[43][42]:=S_2/c_scale*GT*synRate*0.260597;
+rate_matrix_2[43][47]:=NS_2/c_scale*GT*synRate*0.306866;
+rate_matrix_2[43][56]:=NS_2/c_scale*GT*synRate*0.171642;
+rate_matrix_2[44][12]:=NS_2/c_scale*synRate*0.340299;
+rate_matrix_2[44][28]:=NS_2/c_scale*CG*synRate*0.223284;
+rate_matrix_2[44][32]:=NS_2/c_scale*AT*synRate*0.305075;
+rate_matrix_2[44][36]:=NS_2/c_scale*CT*synRate*0.166866;
+rate_matrix_2[44][40]:=NS_2/c_scale*GT*synRate*0.221194;
+rate_matrix_2[44][45]:=S_2/c_scale*AC*synRate*0.250149;
+rate_matrix_2[44][46]:=S_2/c_scale*synRate*0.260597;
+rate_matrix_2[44][47]:=S_2/c_scale*AT*synRate*0.279104;
+rate_matrix_2[44][57]:=NS_2/c_scale*GT*synRate*0.171642;
+rate_matrix_2[45][13]:=NS_2/c_scale*synRate*0.340299;
+rate_matrix_2[45][29]:=NS_2/c_scale*CG*synRate*0.223284;
+rate_matrix_2[45][33]:=NS_2/c_scale*AT*synRate*0.305075;
+rate_matrix_2[45][37]:=NS_2/c_scale*CT*synRate*0.166866;
+rate_matrix_2[45][41]:=NS_2/c_scale*GT*synRate*0.221194;
+rate_matrix_2[45][44]:=S_2/c_scale*AC*synRate*0.210149;
+rate_matrix_2[45][46]:=S_2/c_scale*CG*synRate*0.260597;
+rate_matrix_2[45][47]:=S_2/c_scale*CT*synRate*0.279104;
+rate_matrix_2[45][58]:=NS_2/c_scale*GT*synRate*0.171642;
+rate_matrix_2[46][14]:=NS_2/c_scale*synRate*0.340299;
+rate_matrix_2[46][30]:=NS_2/c_scale*CG*synRate*0.223284;
+rate_matrix_2[46][34]:=NS_2/c_scale*AT*synRate*0.305075;
+rate_matrix_2[46][38]:=NS_2/c_scale*CT*synRate*0.166866;
+rate_matrix_2[46][42]:=NS_2/c_scale*GT*synRate*0.221194;
+rate_matrix_2[46][44]:=S_2/c_scale*synRate*0.210149;
+rate_matrix_2[46][45]:=S_2/c_scale*CG*synRate*0.250149;
+rate_matrix_2[46][47]:=S_2/c_scale*GT*synRate*0.279104;
+rate_matrix_2[46][59]:=NS_2/c_scale*GT*synRate*0.171642;
+rate_matrix_2[47][15]:=NS_2/c_scale*synRate*0.340299;
+rate_matrix_2[47][31]:=NS_2/c_scale*CG*synRate*0.223284;
+rate_matrix_2[47][35]:=NS_2/c_scale*AT*synRate*0.305075;
+rate_matrix_2[47][39]:=NS_2/c_scale*CT*synRate*0.166866;
+rate_matrix_2[47][43]:=NS_2/c_scale*GT*synRate*0.221194;
+rate_matrix_2[47][44]:=S_2/c_scale*AT*synRate*0.210149;
+rate_matrix_2[47][45]:=S_2/c_scale*CT*synRate*0.250149;
+rate_matrix_2[47][46]:=S_2/c_scale*GT*synRate*0.260597;
+rate_matrix_2[47][60]:=NS_2/c_scale*GT*synRate*0.171642;
+rate_matrix_2[48][1]:=NS_2/c_scale*AT*synRate*0.340299;
+rate_matrix_2[48][17]:=NS_2/c_scale*CT*synRate*0.223284;
+rate_matrix_2[48][33]:=NS_2/c_scale*GT*synRate*0.264776;
+rate_matrix_2[48][49]:=S_2/c_scale*CT*synRate*0.279104;
+rate_matrix_2[48][51]:=NS_2/c_scale*AC*synRate*0.166866;
+rate_matrix_2[48][54]:=NS_2/c_scale*synRate*0.221194;
+rate_matrix_2[48][58]:=NS_2/c_scale*AT*synRate*0.306866;
+rate_matrix_2[49][3]:=NS_2/c_scale*AT*synRate*0.340299;
+rate_matrix_2[49][19]:=NS_2/c_scale*CT*synRate*0.223284;
+rate_matrix_2[49][35]:=NS_2/c_scale*GT*synRate*0.264776;
+rate_matrix_2[49][48]:=S_2/c_scale*CT*synRate*0.250149;
+rate_matrix_2[49][53]:=NS_2/c_scale*AC*synRate*0.166866;
+rate_matrix_2[49][56]:=NS_2/c_scale*synRate*0.221194;
+rate_matrix_2[49][60]:=NS_2/c_scale*AT*synRate*0.306866;
+rate_matrix_2[50][4]:=NS_2/c_scale*AT*synRate*0.340299;
+rate_matrix_2[50][20]:=NS_2/c_scale*CT*synRate*0.223284;
+rate_matrix_2[50][36]:=NS_2/c_scale*GT*synRate*0.264776;
+rate_matrix_2[50][51]:=S_2/c_scale*AC*synRate*0.250149;
+rate_matrix_2[50][52]:=S_2/c_scale*synRate*0.260597;
+rate_matrix_2[50][53]:=S_2/c_scale*AT*synRate*0.279104;
+rate_matrix_2[50][57]:=NS_2/c_scale*CT*synRate*0.306866;
+rate_matrix_2[51][5]:=NS_2/c_scale*AT*synRate*0.340299;
+rate_matrix_2[51][21]:=NS_2/c_scale*CT*synRate*0.223284;
+rate_matrix_2[51][37]:=NS_2/c_scale*GT*synRate*0.264776;
+rate_matrix_2[51][48]:=NS_2/c_scale*AC*synRate*0.305075;
+rate_matrix_2[51][50]:=S_2/c_scale*AC*synRate*0.210149;
+rate_matrix_2[51][52]:=S_2/c_scale*CG*synRate*0.260597;
+rate_matrix_2[51][53]:=S_2/c_scale*CT*synRate*0.279104;
+rate_matrix_2[51][54]:=NS_2/c_scale*CG*synRate*0.221194;
+rate_matrix_2[51][58]:=NS_2/c_scale*CT*synRate*0.306866;
+rate_matrix_2[52][6]:=NS_2/c_scale*AT*synRate*0.340299;
+rate_matrix_2[52][22]:=NS_2/c_scale*CT*synRate*0.223284;
+rate_matrix_2[52][38]:=NS_2/c_scale*GT*synRate*0.264776;
+rate_matrix_2[52][50]:=S_2/c_scale*synRate*0.210149;
+rate_matrix_2[52][51]:=S_2/c_scale*CG*synRate*0.250149;
+rate_matrix_2[52][53]:=S_2/c_scale*GT*synRate*0.279104;
+rate_matrix_2[52][55]:=NS_2/c_scale*CG*synRate*0.221194;
+rate_matrix_2[52][59]:=NS_2/c_scale*CT*synRate*0.306866;
+rate_matrix_2[53][7]:=NS_2/c_scale*AT*synRate*0.340299;
+rate_matrix_2[53][23]:=NS_2/c_scale*CT*synRate*0.223284;
+rate_matrix_2[53][39]:=NS_2/c_scale*GT*synRate*0.264776;
+rate_matrix_2[53][49]:=NS_2/c_scale*AC*synRate*0.305075;
+rate_matrix_2[53][50]:=S_2/c_scale*AT*synRate*0.210149;
+rate_matrix_2[53][51]:=S_2/c_scale*CT*synRate*0.250149;
+rate_matrix_2[53][52]:=S_2/c_scale*GT*synRate*0.260597;
+rate_matrix_2[53][56]:=NS_2/c_scale*CG*synRate*0.221194;
+rate_matrix_2[53][60]:=NS_2/c_scale*CT*synRate*0.306866;
+rate_matrix_2[54][9]:=NS_2/c_scale*AT*synRate*0.340299;
+rate_matrix_2[54][25]:=NS_2/c_scale*CT*synRate*0.223284;
+rate_matrix_2[54][41]:=NS_2/c_scale*GT*synRate*0.264776;
+rate_matrix_2[54][48]:=NS_2/c_scale*synRate*0.305075;
+rate_matrix_2[54][51]:=NS_2/c_scale*CG*synRate*0.166866;
+rate_matrix_2[54][55]:=NS_2/c_scale*CG*synRate*0.260597;
+rate_matrix_2[54][56]:=S_2/c_scale*CT*synRate*0.279104;
+rate_matrix_2[54][58]:=NS_2/c_scale*GT*synRate*0.306866;
+rate_matrix_2[55][10]:=NS_2/c_scale*AT*synRate*0.340299;
+rate_matrix_2[55][26]:=NS_2/c_scale*CT*synRate*0.223284;
+rate_matrix_2[55][42]:=NS_2/c_scale*GT*synRate*0.264776;
+rate_matrix_2[55][52]:=NS_2/c_scale*CG*synRate*0.166866;
+rate_matrix_2[55][54]:=NS_2/c_scale*CG*synRate*0.250149;
+rate_matrix_2[55][56]:=NS_2/c_scale*GT*synRate*0.279104;
+rate_matrix_2[55][59]:=NS_2/c_scale*GT*synRate*0.306866;
+rate_matrix_2[56][11]:=NS_2/c_scale*AT*synRate*0.340299;
+rate_matrix_2[56][27]:=NS_2/c_scale*CT*synRate*0.223284;
+rate_matrix_2[56][43]:=NS_2/c_scale*GT*synRate*0.264776;
+rate_matrix_2[56][49]:=NS_2/c_scale*synRate*0.305075;
+rate_matrix_2[56][53]:=NS_2/c_scale*CG*synRate*0.166866;
+rate_matrix_2[56][54]:=S_2/c_scale*CT*synRate*0.250149;
+rate_matrix_2[56][55]:=NS_2/c_scale*GT*synRate*0.260597;
+rate_matrix_2[56][60]:=NS_2/c_scale*GT*synRate*0.306866;
+rate_matrix_2[57][12]:=NS_2/c_scale*AT*synRate*0.340299;
+rate_matrix_2[57][28]:=S_2/c_scale*CT*synRate*0.223284;
+rate_matrix_2[57][44]:=NS_2/c_scale*GT*synRate*0.264776;
+rate_matrix_2[57][50]:=NS_2/c_scale*CT*synRate*0.166866;
+rate_matrix_2[57][58]:=NS_2/c_scale*AC*synRate*0.250149;
+rate_matrix_2[57][59]:=S_2/c_scale*synRate*0.260597;
+rate_matrix_2[57][60]:=NS_2/c_scale*AT*synRate*0.279104;
+rate_matrix_2[58][13]:=NS_2/c_scale*AT*synRate*0.340299;
+rate_matrix_2[58][29]:=NS_2/c_scale*CT*synRate*0.223284;
+rate_matrix_2[58][45]:=NS_2/c_scale*GT*synRate*0.264776;
+rate_matrix_2[58][48]:=NS_2/c_scale*AT*synRate*0.305075;
+rate_matrix_2[58][51]:=NS_2/c_scale*CT*synRate*0.166866;
+rate_matrix_2[58][54]:=NS_2/c_scale*GT*synRate*0.221194;
+rate_matrix_2[58][57]:=NS_2/c_scale*AC*synRate*0.210149;
+rate_matrix_2[58][59]:=NS_2/c_scale*CG*synRate*0.260597;
+rate_matrix_2[58][60]:=S_2/c_scale*CT*synRate*0.279104;
+rate_matrix_2[59][14]:=NS_2/c_scale*AT*synRate*0.340299;
+rate_matrix_2[59][30]:=S_2/c_scale*CT*synRate*0.223284;
+rate_matrix_2[59][46]:=NS_2/c_scale*GT*synRate*0.264776;
+rate_matrix_2[59][52]:=NS_2/c_scale*CT*synRate*0.166866;
+rate_matrix_2[59][55]:=NS_2/c_scale*GT*synRate*0.221194;
+rate_matrix_2[59][57]:=S_2/c_scale*synRate*0.210149;
+rate_matrix_2[59][58]:=NS_2/c_scale*CG*synRate*0.250149;
+rate_matrix_2[59][60]:=NS_2/c_scale*GT*synRate*0.279104;
+rate_matrix_2[60][15]:=NS_2/c_scale*AT*synRate*0.340299;
+rate_matrix_2[60][31]:=NS_2/c_scale*CT*synRate*0.223284;
+rate_matrix_2[60][47]:=NS_2/c_scale*GT*synRate*0.264776;
+rate_matrix_2[60][49]:=NS_2/c_scale*AT*synRate*0.305075;
+rate_matrix_2[60][53]:=NS_2/c_scale*CT*synRate*0.166866;
+rate_matrix_2[60][56]:=NS_2/c_scale*GT*synRate*0.221194;
+rate_matrix_2[60][57]:=NS_2/c_scale*AT*synRate*0.210149;
+rate_matrix_2[60][58]:=S_2/c_scale*CT*synRate*0.250149;
+rate_matrix_2[60][59]:=NS_2/c_scale*GT*synRate*0.260597;
+
+
+Model MG94model_2=(rate_matrix_2,vectorOfFrequencies,0);
+rate_matrix_3={61,61};
+rate_matrix_3[0][1]:=NS_3/c_scale*AC*synRate*0.250149;
+rate_matrix_3[0][2]:=S_3/c_scale*synRate*0.260597;
+rate_matrix_3[0][3]:=NS_3/c_scale*AT*synRate*0.279104;
+rate_matrix_3[0][4]:=NS_3/c_scale*AC*synRate*0.166866;
+rate_matrix_3[0][8]:=NS_3/c_scale*synRate*0.221194;
+rate_matrix_3[0][12]:=NS_3/c_scale*AT*synRate*0.306866;
+rate_matrix_3[0][16]:=NS_3/c_scale*AC*synRate*0.223284;
+rate_matrix_3[0][32]:=NS_3/c_scale*synRate*0.264776;
+rate_matrix_3[1][0]:=NS_3/c_scale*AC*synRate*0.210149;
+rate_matrix_3[1][2]:=NS_3/c_scale*CG*synRate*0.260597;
+rate_matrix_3[1][3]:=S_3/c_scale*CT*synRate*0.279104;
+rate_matrix_3[1][5]:=NS_3/c_scale*AC*synRate*0.166866;
+rate_matrix_3[1][9]:=NS_3/c_scale*synRate*0.221194;
+rate_matrix_3[1][13]:=NS_3/c_scale*AT*synRate*0.306866;
+rate_matrix_3[1][17]:=NS_3/c_scale*AC*synRate*0.223284;
+rate_matrix_3[1][33]:=NS_3/c_scale*synRate*0.264776;
+rate_matrix_3[1][48]:=NS_3/c_scale*AT*synRate*0.171642;
+rate_matrix_3[2][0]:=S_3/c_scale*synRate*0.210149;
+rate_matrix_3[2][1]:=NS_3/c_scale*CG*synRate*0.250149;
+rate_matrix_3[2][3]:=NS_3/c_scale*GT*synRate*0.279104;
+rate_matrix_3[2][6]:=NS_3/c_scale*AC*synRate*0.166866;
+rate_matrix_3[2][10]:=NS_3/c_scale*synRate*0.221194;
+rate_matrix_3[2][14]:=NS_3/c_scale*AT*synRate*0.306866;
+rate_matrix_3[2][18]:=NS_3/c_scale*AC*synRate*0.223284;
+rate_matrix_3[2][34]:=NS_3/c_scale*synRate*0.264776;
+rate_matrix_3[3][0]:=NS_3/c_scale*AT*synRate*0.210149;
+rate_matrix_3[3][1]:=S_3/c_scale*CT*synRate*0.250149;
+rate_matrix_3[3][2]:=NS_3/c_scale*GT*synRate*0.260597;
+rate_matrix_3[3][7]:=NS_3/c_scale*AC*synRate*0.166866;
+rate_matrix_3[3][11]:=NS_3/c_scale*synRate*0.221194;
+rate_matrix_3[3][15]:=NS_3/c_scale*AT*synRate*0.306866;
+rate_matrix_3[3][19]:=NS_3/c_scale*AC*synRate*0.223284;
+rate_matrix_3[3][35]:=NS_3/c_scale*synRate*0.264776;
+rate_matrix_3[3][49]:=NS_3/c_scale*AT*synRate*0.171642;
+rate_matrix_3[4][0]:=NS_3/c_scale*AC*synRate*0.305075;
+rate_matrix_3[4][5]:=S_3/c_scale*AC*synRate*0.250149;
+rate_matrix_3[4][6]:=S_3/c_scale*synRate*0.260597;
+rate_matrix_3[4][7]:=S_3/c_scale*AT*synRate*0.279104;
+rate_matrix_3[4][8]:=NS_3/c_scale*CG*synRate*0.221194;
+rate_matrix_3[4][12]:=NS_3/c_scale*CT*synRate*0.306866;
+rate_matrix_3[4][20]:=NS_3/c_scale*AC*synRate*0.223284;
+rate_matrix_3[4][36]:=NS_3/c_scale*synRate*0.264776;
+rate_matrix_3[4][50]:=NS_3/c_scale*AT*synRate*0.171642;
+rate_matrix_3[5][1]:=NS_3/c_scale*AC*synRate*0.305075;
+rate_matrix_3[5][4]:=S_3/c_scale*AC*synRate*0.210149;
+rate_matrix_3[5][6]:=S_3/c_scale*CG*synRate*0.260597;
+rate_matrix_3[5][7]:=S_3/c_scale*CT*synRate*0.279104;
+rate_matrix_3[5][9]:=NS_3/c_scale*CG*synRate*0.221194;
+rate_matrix_3[5][13]:=NS_3/c_scale*CT*synRate*0.306866;
+rate_matrix_3[5][21]:=NS_3/c_scale*AC*synRate*0.223284;
+rate_matrix_3[5][37]:=NS_3/c_scale*synRate*0.264776;
+rate_matrix_3[5][51]:=NS_3/c_scale*AT*synRate*0.171642;
+rate_matrix_3[6][2]:=NS_3/c_scale*AC*synRate*0.305075;
+rate_matrix_3[6][4]:=S_3/c_scale*synRate*0.210149;
+rate_matrix_3[6][5]:=S_3/c_scale*CG*synRate*0.250149;
+rate_matrix_3[6][7]:=S_3/c_scale*GT*synRate*0.279104;
+rate_matrix_3[6][10]:=NS_3/c_scale*CG*synRate*0.221194;
+rate_matrix_3[6][14]:=NS_3/c_scale*CT*synRate*0.306866;
+rate_matrix_3[6][22]:=NS_3/c_scale*AC*synRate*0.223284;
+rate_matrix_3[6][38]:=NS_3/c_scale*synRate*0.264776;
+rate_matrix_3[6][52]:=NS_3/c_scale*AT*synRate*0.171642;
+rate_matrix_3[7][3]:=NS_3/c_scale*AC*synRate*0.305075;
+rate_matrix_3[7][4]:=S_3/c_scale*AT*synRate*0.210149;
+rate_matrix_3[7][5]:=S_3/c_scale*CT*synRate*0.250149;
+rate_matrix_3[7][6]:=S_3/c_scale*GT*synRate*0.260597;
+rate_matrix_3[7][11]:=NS_3/c_scale*CG*synRate*0.221194;
+rate_matrix_3[7][15]:=NS_3/c_scale*CT*synRate*0.306866;
+rate_matrix_3[7][23]:=NS_3/c_scale*AC*synRate*0.223284;
+rate_matrix_3[7][39]:=NS_3/c_scale*synRate*0.264776;
+rate_matrix_3[7][53]:=NS_3/c_scale*AT*synRate*0.171642;
+rate_matrix_3[8][0]:=NS_3/c_scale*synRate*0.305075;
+rate_matrix_3[8][4]:=NS_3/c_scale*CG*synRate*0.166866;
+rate_matrix_3[8][9]:=NS_3/c_scale*AC*synRate*0.250149;
+rate_matrix_3[8][10]:=S_3/c_scale*synRate*0.260597;
+rate_matrix_3[8][11]:=NS_3/c_scale*AT*synRate*0.279104;
+rate_matrix_3[8][12]:=NS_3/c_scale*GT*synRate*0.306866;
+rate_matrix_3[8][24]:=S_3/c_scale*AC*synRate*0.223284;
+rate_matrix_3[8][40]:=NS_3/c_scale*synRate*0.264776;
+rate_matrix_3[9][1]:=NS_3/c_scale*synRate*0.305075;
+rate_matrix_3[9][5]:=NS_3/c_scale*CG*synRate*0.166866;
+rate_matrix_3[9][8]:=NS_3/c_scale*AC*synRate*0.210149;
+rate_matrix_3[9][10]:=NS_3/c_scale*CG*synRate*0.260597;
+rate_matrix_3[9][11]:=S_3/c_scale*CT*synRate*0.279104;
+rate_matrix_3[9][13]:=NS_3/c_scale*GT*synRate*0.306866;
+rate_matrix_3[9][25]:=NS_3/c_scale*AC*synRate*0.223284;
+rate_matrix_3[9][41]:=NS_3/c_scale*synRate*0.264776;
+rate_matrix_3[9][54]:=NS_3/c_scale*AT*synRate*0.171642;
+rate_matrix_3[10][2]:=NS_3/c_scale*synRate*0.305075;
+rate_matrix_3[10][6]:=NS_3/c_scale*CG*synRate*0.166866;
+rate_matrix_3[10][8]:=S_3/c_scale*synRate*0.210149;
+rate_matrix_3[10][9]:=NS_3/c_scale*CG*synRate*0.250149;
+rate_matrix_3[10][11]:=NS_3/c_scale*GT*synRate*0.279104;
+rate_matrix_3[10][14]:=NS_3/c_scale*GT*synRate*0.306866;
+rate_matrix_3[10][26]:=S_3/c_scale*AC*synRate*0.223284;
+rate_matrix_3[10][42]:=NS_3/c_scale*synRate*0.264776;
+rate_matrix_3[10][55]:=NS_3/c_scale*AT*synRate*0.171642;
+rate_matrix_3[11][3]:=NS_3/c_scale*synRate*0.305075;
+rate_matrix_3[11][7]:=NS_3/c_scale*CG*synRate*0.166866;
+rate_matrix_3[11][8]:=NS_3/c_scale*AT*synRate*0.210149;
+rate_matrix_3[11][9]:=S_3/c_scale*CT*synRate*0.250149;
+rate_matrix_3[11][10]:=NS_3/c_scale*GT*synRate*0.260597;
+rate_matrix_3[11][15]:=NS_3/c_scale*GT*synRate*0.306866;
+rate_matrix_3[11][27]:=NS_3/c_scale*AC*synRate*0.223284;
+rate_matrix_3[11][43]:=NS_3/c_scale*synRate*0.264776;
+rate_matrix_3[11][56]:=NS_3/c_scale*AT*synRate*0.171642;
+rate_matrix_3[12][0]:=NS_3/c_scale*AT*synRate*0.305075;
+rate_matrix_3[12][4]:=NS_3/c_scale*CT*synRate*0.166866;
+rate_matrix_3[12][8]:=NS_3/c_scale*GT*synRate*0.221194;
+rate_matrix_3[12][13]:=S_3/c_scale*AC*synRate*0.250149;
+rate_matrix_3[12][14]:=NS_3/c_scale*synRate*0.260597;
+rate_matrix_3[12][15]:=S_3/c_scale*AT*synRate*0.279104;
+rate_matrix_3[12][28]:=NS_3/c_scale*AC*synRate*0.223284;
+rate_matrix_3[12][44]:=NS_3/c_scale*synRate*0.264776;
+rate_matrix_3[12][57]:=NS_3/c_scale*AT*synRate*0.171642;
+rate_matrix_3[13][1]:=NS_3/c_scale*AT*synRate*0.305075;
+rate_matrix_3[13][5]:=NS_3/c_scale*CT*synRate*0.166866;
+rate_matrix_3[13][9]:=NS_3/c_scale*GT*synRate*0.221194;
+rate_matrix_3[13][12]:=S_3/c_scale*AC*synRate*0.210149;
+rate_matrix_3[13][14]:=NS_3/c_scale*CG*synRate*0.260597;
+rate_matrix_3[13][15]:=S_3/c_scale*CT*synRate*0.279104;
+rate_matrix_3[13][29]:=NS_3/c_scale*AC*synRate*0.223284;
+rate_matrix_3[13][45]:=NS_3/c_scale*synRate*0.264776;
+rate_matrix_3[13][58]:=NS_3/c_scale*AT*synRate*0.171642;
+rate_matrix_3[14][2]:=NS_3/c_scale*AT*synRate*0.305075;
+rate_matrix_3[14][6]:=NS_3/c_scale*CT*synRate*0.166866;
+rate_matrix_3[14][10]:=NS_3/c_scale*GT*synRate*0.221194;
+rate_matrix_3[14][12]:=NS_3/c_scale*synRate*0.210149;
+rate_matrix_3[14][13]:=NS_3/c_scale*CG*synRate*0.250149;
+rate_matrix_3[14][15]:=NS_3/c_scale*GT*synRate*0.279104;
+rate_matrix_3[14][30]:=NS_3/c_scale*AC*synRate*0.223284;
+rate_matrix_3[14][46]:=NS_3/c_scale*synRate*0.264776;
+rate_matrix_3[14][59]:=NS_3/c_scale*AT*synRate*0.171642;
+rate_matrix_3[15][3]:=NS_3/c_scale*AT*synRate*0.305075;
+rate_matrix_3[15][7]:=NS_3/c_scale*CT*synRate*0.166866;
+rate_matrix_3[15][11]:=NS_3/c_scale*GT*synRate*0.221194;
+rate_matrix_3[15][12]:=S_3/c_scale*AT*synRate*0.210149;
+rate_matrix_3[15][13]:=S_3/c_scale*CT*synRate*0.250149;
+rate_matrix_3[15][14]:=NS_3/c_scale*GT*synRate*0.260597;
+rate_matrix_3[15][31]:=NS_3/c_scale*AC*synRate*0.223284;
+rate_matrix_3[15][47]:=NS_3/c_scale*synRate*0.264776;
+rate_matrix_3[15][60]:=NS_3/c_scale*AT*synRate*0.171642;
+rate_matrix_3[16][0]:=NS_3/c_scale*AC*synRate*0.340299;
+rate_matrix_3[16][17]:=NS_3/c_scale*AC*synRate*0.250149;
+rate_matrix_3[16][18]:=S_3/c_scale*synRate*0.260597;
+rate_matrix_3[16][19]:=NS_3/c_scale*AT*synRate*0.279104;
+rate_matrix_3[16][20]:=NS_3/c_scale*AC*synRate*0.166866;
+rate_matrix_3[16][24]:=NS_3/c_scale*synRate*0.221194;
+rate_matrix_3[16][28]:=NS_3/c_scale*AT*synRate*0.306866;
+rate_matrix_3[16][32]:=NS_3/c_scale*CG*synRate*0.264776;
+rate_matrix_3[17][1]:=NS_3/c_scale*AC*synRate*0.340299;
+rate_matrix_3[17][16]:=NS_3/c_scale*AC*synRate*0.210149;
+rate_matrix_3[17][18]:=NS_3/c_scale*CG*synRate*0.260597;
+rate_matrix_3[17][19]:=S_3/c_scale*CT*synRate*0.279104;
+rate_matrix_3[17][21]:=NS_3/c_scale*AC*synRate*0.166866;
+rate_matrix_3[17][25]:=NS_3/c_scale*synRate*0.221194;
+rate_matrix_3[17][29]:=NS_3/c_scale*AT*synRate*0.306866;
+rate_matrix_3[17][33]:=NS_3/c_scale*CG*synRate*0.264776;
+rate_matrix_3[17][48]:=NS_3/c_scale*CT*synRate*0.171642;
+rate_matrix_3[18][2]:=NS_3/c_scale*AC*synRate*0.340299;
+rate_matrix_3[18][16]:=S_3/c_scale*synRate*0.210149;
+rate_matrix_3[18][17]:=NS_3/c_scale*CG*synRate*0.250149;
+rate_matrix_3[18][19]:=NS_3/c_scale*GT*synRate*0.279104;
+rate_matrix_3[18][22]:=NS_3/c_scale*AC*synRate*0.166866;
+rate_matrix_3[18][26]:=NS_3/c_scale*synRate*0.221194;
+rate_matrix_3[18][30]:=NS_3/c_scale*AT*synRate*0.306866;
+rate_matrix_3[18][34]:=NS_3/c_scale*CG*synRate*0.264776;
+rate_matrix_3[19][3]:=NS_3/c_scale*AC*synRate*0.340299;
+rate_matrix_3[19][16]:=NS_3/c_scale*AT*synRate*0.210149;
+rate_matrix_3[19][17]:=S_3/c_scale*CT*synRate*0.250149;
+rate_matrix_3[19][18]:=NS_3/c_scale*GT*synRate*0.260597;
+rate_matrix_3[19][23]:=NS_3/c_scale*AC*synRate*0.166866;
+rate_matrix_3[19][27]:=NS_3/c_scale*synRate*0.221194;
+rate_matrix_3[19][31]:=NS_3/c_scale*AT*synRate*0.306866;
+rate_matrix_3[19][35]:=NS_3/c_scale*CG*synRate*0.264776;
+rate_matrix_3[19][49]:=NS_3/c_scale*CT*synRate*0.171642;
+rate_matrix_3[20][4]:=NS_3/c_scale*AC*synRate*0.340299;
+rate_matrix_3[20][16]:=NS_3/c_scale*AC*synRate*0.305075;
+rate_matrix_3[20][21]:=S_3/c_scale*AC*synRate*0.250149;
+rate_matrix_3[20][22]:=S_3/c_scale*synRate*0.260597;
+rate_matrix_3[20][23]:=S_3/c_scale*AT*synRate*0.279104;
+rate_matrix_3[20][24]:=NS_3/c_scale*CG*synRate*0.221194;
+rate_matrix_3[20][28]:=NS_3/c_scale*CT*synRate*0.306866;
+rate_matrix_3[20][36]:=NS_3/c_scale*CG*synRate*0.264776;
+rate_matrix_3[20][50]:=NS_3/c_scale*CT*synRate*0.171642;
+rate_matrix_3[21][5]:=NS_3/c_scale*AC*synRate*0.340299;
+rate_matrix_3[21][17]:=NS_3/c_scale*AC*synRate*0.305075;
+rate_matrix_3[21][20]:=S_3/c_scale*AC*synRate*0.210149;
+rate_matrix_3[21][22]:=S_3/c_scale*CG*synRate*0.260597;
+rate_matrix_3[21][23]:=S_3/c_scale*CT*synRate*0.279104;
+rate_matrix_3[21][25]:=NS_3/c_scale*CG*synRate*0.221194;
+rate_matrix_3[21][29]:=NS_3/c_scale*CT*synRate*0.306866;
+rate_matrix_3[21][37]:=NS_3/c_scale*CG*synRate*0.264776;
+rate_matrix_3[21][51]:=NS_3/c_scale*CT*synRate*0.171642;
+rate_matrix_3[22][6]:=NS_3/c_scale*AC*synRate*0.340299;
+rate_matrix_3[22][18]:=NS_3/c_scale*AC*synRate*0.305075;
+rate_matrix_3[22][20]:=S_3/c_scale*synRate*0.210149;
+rate_matrix_3[22][21]:=S_3/c_scale*CG*synRate*0.250149;
+rate_matrix_3[22][23]:=S_3/c_scale*GT*synRate*0.279104;
+rate_matrix_3[22][26]:=NS_3/c_scale*CG*synRate*0.221194;
+rate_matrix_3[22][30]:=NS_3/c_scale*CT*synRate*0.306866;
+rate_matrix_3[22][38]:=NS_3/c_scale*CG*synRate*0.264776;
+rate_matrix_3[22][52]:=NS_3/c_scale*CT*synRate*0.171642;
+rate_matrix_3[23][7]:=NS_3/c_scale*AC*synRate*0.340299;
+rate_matrix_3[23][19]:=NS_3/c_scale*AC*synRate*0.305075;
+rate_matrix_3[23][20]:=S_3/c_scale*AT*synRate*0.210149;
+rate_matrix_3[23][21]:=S_3/c_scale*CT*synRate*0.250149;
+rate_matrix_3[23][22]:=S_3/c_scale*GT*synRate*0.260597;
+rate_matrix_3[23][27]:=NS_3/c_scale*CG*synRate*0.221194;
+rate_matrix_3[23][31]:=NS_3/c_scale*CT*synRate*0.306866;
+rate_matrix_3[23][39]:=NS_3/c_scale*CG*synRate*0.264776;
+rate_matrix_3[23][53]:=NS_3/c_scale*CT*synRate*0.171642;
+rate_matrix_3[24][8]:=S_3/c_scale*AC*synRate*0.340299;
+rate_matrix_3[24][16]:=NS_3/c_scale*synRate*0.305075;
+rate_matrix_3[24][20]:=NS_3/c_scale*CG*synRate*0.166866;
+rate_matrix_3[24][25]:=S_3/c_scale*AC*synRate*0.250149;
+rate_matrix_3[24][26]:=S_3/c_scale*synRate*0.260597;
+rate_matrix_3[24][27]:=S_3/c_scale*AT*synRate*0.279104;
+rate_matrix_3[24][28]:=NS_3/c_scale*GT*synRate*0.306866;
+rate_matrix_3[24][40]:=NS_3/c_scale*CG*synRate*0.264776;
+rate_matrix_3[25][9]:=NS_3/c_scale*AC*synRate*0.340299;
+rate_matrix_3[25][17]:=NS_3/c_scale*synRate*0.305075;
+rate_matrix_3[25][21]:=NS_3/c_scale*CG*synRate*0.166866;
+rate_matrix_3[25][24]:=S_3/c_scale*AC*synRate*0.210149;
+rate_matrix_3[25][26]:=S_3/c_scale*CG*synRate*0.260597;
+rate_matrix_3[25][27]:=S_3/c_scale*CT*synRate*0.279104;
+rate_matrix_3[25][29]:=NS_3/c_scale*GT*synRate*0.306866;
+rate_matrix_3[25][41]:=NS_3/c_scale*CG*synRate*0.264776;
+rate_matrix_3[25][54]:=NS_3/c_scale*CT*synRate*0.171642;
+rate_matrix_3[26][10]:=S_3/c_scale*AC*synRate*0.340299;
+rate_matrix_3[26][18]:=NS_3/c_scale*synRate*0.305075;
+rate_matrix_3[26][22]:=NS_3/c_scale*CG*synRate*0.166866;
+rate_matrix_3[26][24]:=S_3/c_scale*synRate*0.210149;
+rate_matrix_3[26][25]:=S_3/c_scale*CG*synRate*0.250149;
+rate_matrix_3[26][27]:=S_3/c_scale*GT*synRate*0.279104;
+rate_matrix_3[26][30]:=NS_3/c_scale*GT*synRate*0.306866;
+rate_matrix_3[26][42]:=NS_3/c_scale*CG*synRate*0.264776;
+rate_matrix_3[26][55]:=NS_3/c_scale*CT*synRate*0.171642;
+rate_matrix_3[27][11]:=NS_3/c_scale*AC*synRate*0.340299;
+rate_matrix_3[27][19]:=NS_3/c_scale*synRate*0.305075;
+rate_matrix_3[27][23]:=NS_3/c_scale*CG*synRate*0.166866;
+rate_matrix_3[27][24]:=S_3/c_scale*AT*synRate*0.210149;
+rate_matrix_3[27][25]:=S_3/c_scale*CT*synRate*0.250149;
+rate_matrix_3[27][26]:=S_3/c_scale*GT*synRate*0.260597;
+rate_matrix_3[27][31]:=NS_3/c_scale*GT*synRate*0.306866;
+rate_matrix_3[27][43]:=NS_3/c_scale*CG*synRate*0.264776;
+rate_matrix_3[27][56]:=NS_3/c_scale*CT*synRate*0.171642;
+rate_matrix_3[28][12]:=NS_3/c_scale*AC*synRate*0.340299;
+rate_matrix_3[28][16]:=NS_3/c_scale*AT*synRate*0.305075;
+rate_matrix_3[28][20]:=NS_3/c_scale*CT*synRate*0.166866;
+rate_matrix_3[28][24]:=NS_3/c_scale*GT*synRate*0.221194;
+rate_matrix_3[28][29]:=S_3/c_scale*AC*synRate*0.250149;
+rate_matrix_3[28][30]:=S_3/c_scale*synRate*0.260597;
+rate_matrix_3[28][31]:=S_3/c_scale*AT*synRate*0.279104;
+rate_matrix_3[28][44]:=NS_3/c_scale*CG*synRate*0.264776;
+rate_matrix_3[28][57]:=S_3/c_scale*CT*synRate*0.171642;
+rate_matrix_3[29][13]:=NS_3/c_scale*AC*synRate*0.340299;
+rate_matrix_3[29][17]:=NS_3/c_scale*AT*synRate*0.305075;
+rate_matrix_3[29][21]:=NS_3/c_scale*CT*synRate*0.166866;
+rate_matrix_3[29][25]:=NS_3/c_scale*GT*synRate*0.221194;
+rate_matrix_3[29][28]:=S_3/c_scale*AC*synRate*0.210149;
+rate_matrix_3[29][30]:=S_3/c_scale*CG*synRate*0.260597;
+rate_matrix_3[29][31]:=S_3/c_scale*CT*synRate*0.279104;
+rate_matrix_3[29][45]:=NS_3/c_scale*CG*synRate*0.264776;
+rate_matrix_3[29][58]:=NS_3/c_scale*CT*synRate*0.171642;
+rate_matrix_3[30][14]:=NS_3/c_scale*AC*synRate*0.340299;
+rate_matrix_3[30][18]:=NS_3/c_scale*AT*synRate*0.305075;
+rate_matrix_3[30][22]:=NS_3/c_scale*CT*synRate*0.166866;
+rate_matrix_3[30][26]:=NS_3/c_scale*GT*synRate*0.221194;
+rate_matrix_3[30][28]:=S_3/c_scale*synRate*0.210149;
+rate_matrix_3[30][29]:=S_3/c_scale*CG*synRate*0.250149;
+rate_matrix_3[30][31]:=S_3/c_scale*GT*synRate*0.279104;
+rate_matrix_3[30][46]:=NS_3/c_scale*CG*synRate*0.264776;
+rate_matrix_3[30][59]:=S_3/c_scale*CT*synRate*0.171642;
+rate_matrix_3[31][15]:=NS_3/c_scale*AC*synRate*0.340299;
+rate_matrix_3[31][19]:=NS_3/c_scale*AT*synRate*0.305075;
+rate_matrix_3[31][23]:=NS_3/c_scale*CT*synRate*0.166866;
+rate_matrix_3[31][27]:=NS_3/c_scale*GT*synRate*0.221194;
+rate_matrix_3[31][28]:=S_3/c_scale*AT*synRate*0.210149;
+rate_matrix_3[31][29]:=S_3/c_scale*CT*synRate*0.250149;
+rate_matrix_3[31][30]:=S_3/c_scale*GT*synRate*0.260597;
+rate_matrix_3[31][47]:=NS_3/c_scale*CG*synRate*0.264776;
+rate_matrix_3[31][60]:=NS_3/c_scale*CT*synRate*0.171642;
+rate_matrix_3[32][0]:=NS_3/c_scale*synRate*0.340299;
+rate_matrix_3[32][16]:=NS_3/c_scale*CG*synRate*0.223284;
+rate_matrix_3[32][33]:=NS_3/c_scale*AC*synRate*0.250149;
+rate_matrix_3[32][34]:=S_3/c_scale*synRate*0.260597;
+rate_matrix_3[32][35]:=NS_3/c_scale*AT*synRate*0.279104;
+rate_matrix_3[32][36]:=NS_3/c_scale*AC*synRate*0.166866;
+rate_matrix_3[32][40]:=NS_3/c_scale*synRate*0.221194;
+rate_matrix_3[32][44]:=NS_3/c_scale*AT*synRate*0.306866;
+rate_matrix_3[33][1]:=NS_3/c_scale*synRate*0.340299;
+rate_matrix_3[33][17]:=NS_3/c_scale*CG*synRate*0.223284;
+rate_matrix_3[33][32]:=NS_3/c_scale*AC*synRate*0.210149;
+rate_matrix_3[33][34]:=NS_3/c_scale*CG*synRate*0.260597;
+rate_matrix_3[33][35]:=S_3/c_scale*CT*synRate*0.279104;
+rate_matrix_3[33][37]:=NS_3/c_scale*AC*synRate*0.166866;
+rate_matrix_3[33][41]:=NS_3/c_scale*synRate*0.221194;
+rate_matrix_3[33][45]:=NS_3/c_scale*AT*synRate*0.306866;
+rate_matrix_3[33][48]:=NS_3/c_scale*GT*synRate*0.171642;
+rate_matrix_3[34][2]:=NS_3/c_scale*synRate*0.340299;
+rate_matrix_3[34][18]:=NS_3/c_scale*CG*synRate*0.223284;
+rate_matrix_3[34][32]:=S_3/c_scale*synRate*0.210149;
+rate_matrix_3[34][33]:=NS_3/c_scale*CG*synRate*0.250149;
+rate_matrix_3[34][35]:=NS_3/c_scale*GT*synRate*0.279104;
+rate_matrix_3[34][38]:=NS_3/c_scale*AC*synRate*0.166866;
+rate_matrix_3[34][42]:=NS_3/c_scale*synRate*0.221194;
+rate_matrix_3[34][46]:=NS_3/c_scale*AT*synRate*0.306866;
+rate_matrix_3[35][3]:=NS_3/c_scale*synRate*0.340299;
+rate_matrix_3[35][19]:=NS_3/c_scale*CG*synRate*0.223284;
+rate_matrix_3[35][32]:=NS_3/c_scale*AT*synRate*0.210149;
+rate_matrix_3[35][33]:=S_3/c_scale*CT*synRate*0.250149;
+rate_matrix_3[35][34]:=NS_3/c_scale*GT*synRate*0.260597;
+rate_matrix_3[35][39]:=NS_3/c_scale*AC*synRate*0.166866;
+rate_matrix_3[35][43]:=NS_3/c_scale*synRate*0.221194;
+rate_matrix_3[35][47]:=NS_3/c_scale*AT*synRate*0.306866;
+rate_matrix_3[35][49]:=NS_3/c_scale*GT*synRate*0.171642;
+rate_matrix_3[36][4]:=NS_3/c_scale*synRate*0.340299;
+rate_matrix_3[36][20]:=NS_3/c_scale*CG*synRate*0.223284;
+rate_matrix_3[36][32]:=NS_3/c_scale*AC*synRate*0.305075;
+rate_matrix_3[36][37]:=S_3/c_scale*AC*synRate*0.250149;
+rate_matrix_3[36][38]:=S_3/c_scale*synRate*0.260597;
+rate_matrix_3[36][39]:=S_3/c_scale*AT*synRate*0.279104;
+rate_matrix_3[36][40]:=NS_3/c_scale*CG*synRate*0.221194;
+rate_matrix_3[36][44]:=NS_3/c_scale*CT*synRate*0.306866;
+rate_matrix_3[36][50]:=NS_3/c_scale*GT*synRate*0.171642;
+rate_matrix_3[37][5]:=NS_3/c_scale*synRate*0.340299;
+rate_matrix_3[37][21]:=NS_3/c_scale*CG*synRate*0.223284;
+rate_matrix_3[37][33]:=NS_3/c_scale*AC*synRate*0.305075;
+rate_matrix_3[37][36]:=S_3/c_scale*AC*synRate*0.210149;
+rate_matrix_3[37][38]:=S_3/c_scale*CG*synRate*0.260597;
+rate_matrix_3[37][39]:=S_3/c_scale*CT*synRate*0.279104;
+rate_matrix_3[37][41]:=NS_3/c_scale*CG*synRate*0.221194;
+rate_matrix_3[37][45]:=NS_3/c_scale*CT*synRate*0.306866;
+rate_matrix_3[37][51]:=NS_3/c_scale*GT*synRate*0.171642;
+rate_matrix_3[38][6]:=NS_3/c_scale*synRate*0.340299;
+rate_matrix_3[38][22]:=NS_3/c_scale*CG*synRate*0.223284;
+rate_matrix_3[38][34]:=NS_3/c_scale*AC*synRate*0.305075;
+rate_matrix_3[38][36]:=S_3/c_scale*synRate*0.210149;
+rate_matrix_3[38][37]:=S_3/c_scale*CG*synRate*0.250149;
+rate_matrix_3[38][39]:=S_3/c_scale*GT*synRate*0.279104;
+rate_matrix_3[38][42]:=NS_3/c_scale*CG*synRate*0.221194;
+rate_matrix_3[38][46]:=NS_3/c_scale*CT*synRate*0.306866;
+rate_matrix_3[38][52]:=NS_3/c_scale*GT*synRate*0.171642;
+rate_matrix_3[39][7]:=NS_3/c_scale*synRate*0.340299;
+rate_matrix_3[39][23]:=NS_3/c_scale*CG*synRate*0.223284;
+rate_matrix_3[39][35]:=NS_3/c_scale*AC*synRate*0.305075;
+rate_matrix_3[39][36]:=S_3/c_scale*AT*synRate*0.210149;
+rate_matrix_3[39][37]:=S_3/c_scale*CT*synRate*0.250149;
+rate_matrix_3[39][38]:=S_3/c_scale*GT*synRate*0.260597;
+rate_matrix_3[39][43]:=NS_3/c_scale*CG*synRate*0.221194;
+rate_matrix_3[39][47]:=NS_3/c_scale*CT*synRate*0.306866;
+rate_matrix_3[39][53]:=NS_3/c_scale*GT*synRate*0.171642;
+rate_matrix_3[40][8]:=NS_3/c_scale*synRate*0.340299;
+rate_matrix_3[40][24]:=NS_3/c_scale*CG*synRate*0.223284;
+rate_matrix_3[40][32]:=NS_3/c_scale*synRate*0.305075;
+rate_matrix_3[40][36]:=NS_3/c_scale*CG*synRate*0.166866;
+rate_matrix_3[40][41]:=S_3/c_scale*AC*synRate*0.250149;
+rate_matrix_3[40][42]:=S_3/c_scale*synRate*0.260597;
+rate_matrix_3[40][43]:=S_3/c_scale*AT*synRate*0.279104;
+rate_matrix_3[40][44]:=NS_3/c_scale*GT*synRate*0.306866;
+rate_matrix_3[41][9]:=NS_3/c_scale*synRate*0.340299;
+rate_matrix_3[41][25]:=NS_3/c_scale*CG*synRate*0.223284;
+rate_matrix_3[41][33]:=NS_3/c_scale*synRate*0.305075;
+rate_matrix_3[41][37]:=NS_3/c_scale*CG*synRate*0.166866;
+rate_matrix_3[41][40]:=S_3/c_scale*AC*synRate*0.210149;
+rate_matrix_3[41][42]:=S_3/c_scale*CG*synRate*0.260597;
+rate_matrix_3[41][43]:=S_3/c_scale*CT*synRate*0.279104;
+rate_matrix_3[41][45]:=NS_3/c_scale*GT*synRate*0.306866;
+rate_matrix_3[41][54]:=NS_3/c_scale*GT*synRate*0.171642;
+rate_matrix_3[42][10]:=NS_3/c_scale*synRate*0.340299;
+rate_matrix_3[42][26]:=NS_3/c_scale*CG*synRate*0.223284;
+rate_matrix_3[42][34]:=NS_3/c_scale*synRate*0.305075;
+rate_matrix_3[42][38]:=NS_3/c_scale*CG*synRate*0.166866;
+rate_matrix_3[42][40]:=S_3/c_scale*synRate*0.210149;
+rate_matrix_3[42][41]:=S_3/c_scale*CG*synRate*0.250149;
+rate_matrix_3[42][43]:=S_3/c_scale*GT*synRate*0.279104;
+rate_matrix_3[42][46]:=NS_3/c_scale*GT*synRate*0.306866;
+rate_matrix_3[42][55]:=NS_3/c_scale*GT*synRate*0.171642;
+rate_matrix_3[43][11]:=NS_3/c_scale*synRate*0.340299;
+rate_matrix_3[43][27]:=NS_3/c_scale*CG*synRate*0.223284;
+rate_matrix_3[43][35]:=NS_3/c_scale*synRate*0.305075;
+rate_matrix_3[43][39]:=NS_3/c_scale*CG*synRate*0.166866;
+rate_matrix_3[43][40]:=S_3/c_scale*AT*synRate*0.210149;
+rate_matrix_3[43][41]:=S_3/c_scale*CT*synRate*0.250149;
+rate_matrix_3[43][42]:=S_3/c_scale*GT*synRate*0.260597;
+rate_matrix_3[43][47]:=NS_3/c_scale*GT*synRate*0.306866;
+rate_matrix_3[43][56]:=NS_3/c_scale*GT*synRate*0.171642;
+rate_matrix_3[44][12]:=NS_3/c_scale*synRate*0.340299;
+rate_matrix_3[44][28]:=NS_3/c_scale*CG*synRate*0.223284;
+rate_matrix_3[44][32]:=NS_3/c_scale*AT*synRate*0.305075;
+rate_matrix_3[44][36]:=NS_3/c_scale*CT*synRate*0.166866;
+rate_matrix_3[44][40]:=NS_3/c_scale*GT*synRate*0.221194;
+rate_matrix_3[44][45]:=S_3/c_scale*AC*synRate*0.250149;
+rate_matrix_3[44][46]:=S_3/c_scale*synRate*0.260597;
+rate_matrix_3[44][47]:=S_3/c_scale*AT*synRate*0.279104;
+rate_matrix_3[44][57]:=NS_3/c_scale*GT*synRate*0.171642;
+rate_matrix_3[45][13]:=NS_3/c_scale*synRate*0.340299;
+rate_matrix_3[45][29]:=NS_3/c_scale*CG*synRate*0.223284;
+rate_matrix_3[45][33]:=NS_3/c_scale*AT*synRate*0.305075;
+rate_matrix_3[45][37]:=NS_3/c_scale*CT*synRate*0.166866;
+rate_matrix_3[45][41]:=NS_3/c_scale*GT*synRate*0.221194;
+rate_matrix_3[45][44]:=S_3/c_scale*AC*synRate*0.210149;
+rate_matrix_3[45][46]:=S_3/c_scale*CG*synRate*0.260597;
+rate_matrix_3[45][47]:=S_3/c_scale*CT*synRate*0.279104;
+rate_matrix_3[45][58]:=NS_3/c_scale*GT*synRate*0.171642;
+rate_matrix_3[46][14]:=NS_3/c_scale*synRate*0.340299;
+rate_matrix_3[46][30]:=NS_3/c_scale*CG*synRate*0.223284;
+rate_matrix_3[46][34]:=NS_3/c_scale*AT*synRate*0.305075;
+rate_matrix_3[46][38]:=NS_3/c_scale*CT*synRate*0.166866;
+rate_matrix_3[46][42]:=NS_3/c_scale*GT*synRate*0.221194;
+rate_matrix_3[46][44]:=S_3/c_scale*synRate*0.210149;
+rate_matrix_3[46][45]:=S_3/c_scale*CG*synRate*0.250149;
+rate_matrix_3[46][47]:=S_3/c_scale*GT*synRate*0.279104;
+rate_matrix_3[46][59]:=NS_3/c_scale*GT*synRate*0.171642;
+rate_matrix_3[47][15]:=NS_3/c_scale*synRate*0.340299;
+rate_matrix_3[47][31]:=NS_3/c_scale*CG*synRate*0.223284;
+rate_matrix_3[47][35]:=NS_3/c_scale*AT*synRate*0.305075;
+rate_matrix_3[47][39]:=NS_3/c_scale*CT*synRate*0.166866;
+rate_matrix_3[47][43]:=NS_3/c_scale*GT*synRate*0.221194;
+rate_matrix_3[47][44]:=S_3/c_scale*AT*synRate*0.210149;
+rate_matrix_3[47][45]:=S_3/c_scale*CT*synRate*0.250149;
+rate_matrix_3[47][46]:=S_3/c_scale*GT*synRate*0.260597;
+rate_matrix_3[47][60]:=NS_3/c_scale*GT*synRate*0.171642;
+rate_matrix_3[48][1]:=NS_3/c_scale*AT*synRate*0.340299;
+rate_matrix_3[48][17]:=NS_3/c_scale*CT*synRate*0.223284;
+rate_matrix_3[48][33]:=NS_3/c_scale*GT*synRate*0.264776;
+rate_matrix_3[48][49]:=S_3/c_scale*CT*synRate*0.279104;
+rate_matrix_3[48][51]:=NS_3/c_scale*AC*synRate*0.166866;
+rate_matrix_3[48][54]:=NS_3/c_scale*synRate*0.221194;
+rate_matrix_3[48][58]:=NS_3/c_scale*AT*synRate*0.306866;
+rate_matrix_3[49][3]:=NS_3/c_scale*AT*synRate*0.340299;
+rate_matrix_3[49][19]:=NS_3/c_scale*CT*synRate*0.223284;
+rate_matrix_3[49][35]:=NS_3/c_scale*GT*synRate*0.264776;
+rate_matrix_3[49][48]:=S_3/c_scale*CT*synRate*0.250149;
+rate_matrix_3[49][53]:=NS_3/c_scale*AC*synRate*0.166866;
+rate_matrix_3[49][56]:=NS_3/c_scale*synRate*0.221194;
+rate_matrix_3[49][60]:=NS_3/c_scale*AT*synRate*0.306866;
+rate_matrix_3[50][4]:=NS_3/c_scale*AT*synRate*0.340299;
+rate_matrix_3[50][20]:=NS_3/c_scale*CT*synRate*0.223284;
+rate_matrix_3[50][36]:=NS_3/c_scale*GT*synRate*0.264776;
+rate_matrix_3[50][51]:=S_3/c_scale*AC*synRate*0.250149;
+rate_matrix_3[50][52]:=S_3/c_scale*synRate*0.260597;
+rate_matrix_3[50][53]:=S_3/c_scale*AT*synRate*0.279104;
+rate_matrix_3[50][57]:=NS_3/c_scale*CT*synRate*0.306866;
+rate_matrix_3[51][5]:=NS_3/c_scale*AT*synRate*0.340299;
+rate_matrix_3[51][21]:=NS_3/c_scale*CT*synRate*0.223284;
+rate_matrix_3[51][37]:=NS_3/c_scale*GT*synRate*0.264776;
+rate_matrix_3[51][48]:=NS_3/c_scale*AC*synRate*0.305075;
+rate_matrix_3[51][50]:=S_3/c_scale*AC*synRate*0.210149;
+rate_matrix_3[51][52]:=S_3/c_scale*CG*synRate*0.260597;
+rate_matrix_3[51][53]:=S_3/c_scale*CT*synRate*0.279104;
+rate_matrix_3[51][54]:=NS_3/c_scale*CG*synRate*0.221194;
+rate_matrix_3[51][58]:=NS_3/c_scale*CT*synRate*0.306866;
+rate_matrix_3[52][6]:=NS_3/c_scale*AT*synRate*0.340299;
+rate_matrix_3[52][22]:=NS_3/c_scale*CT*synRate*0.223284;
+rate_matrix_3[52][38]:=NS_3/c_scale*GT*synRate*0.264776;
+rate_matrix_3[52][50]:=S_3/c_scale*synRate*0.210149;
+rate_matrix_3[52][51]:=S_3/c_scale*CG*synRate*0.250149;
+rate_matrix_3[52][53]:=S_3/c_scale*GT*synRate*0.279104;
+rate_matrix_3[52][55]:=NS_3/c_scale*CG*synRate*0.221194;
+rate_matrix_3[52][59]:=NS_3/c_scale*CT*synRate*0.306866;
+rate_matrix_3[53][7]:=NS_3/c_scale*AT*synRate*0.340299;
+rate_matrix_3[53][23]:=NS_3/c_scale*CT*synRate*0.223284;
+rate_matrix_3[53][39]:=NS_3/c_scale*GT*synRate*0.264776;
+rate_matrix_3[53][49]:=NS_3/c_scale*AC*synRate*0.305075;
+rate_matrix_3[53][50]:=S_3/c_scale*AT*synRate*0.210149;
+rate_matrix_3[53][51]:=S_3/c_scale*CT*synRate*0.250149;
+rate_matrix_3[53][52]:=S_3/c_scale*GT*synRate*0.260597;
+rate_matrix_3[53][56]:=NS_3/c_scale*CG*synRate*0.221194;
+rate_matrix_3[53][60]:=NS_3/c_scale*CT*synRate*0.306866;
+rate_matrix_3[54][9]:=NS_3/c_scale*AT*synRate*0.340299;
+rate_matrix_3[54][25]:=NS_3/c_scale*CT*synRate*0.223284;
+rate_matrix_3[54][41]:=NS_3/c_scale*GT*synRate*0.264776;
+rate_matrix_3[54][48]:=NS_3/c_scale*synRate*0.305075;
+rate_matrix_3[54][51]:=NS_3/c_scale*CG*synRate*0.166866;
+rate_matrix_3[54][55]:=NS_3/c_scale*CG*synRate*0.260597;
+rate_matrix_3[54][56]:=S_3/c_scale*CT*synRate*0.279104;
+rate_matrix_3[54][58]:=NS_3/c_scale*GT*synRate*0.306866;
+rate_matrix_3[55][10]:=NS_3/c_scale*AT*synRate*0.340299;
+rate_matrix_3[55][26]:=NS_3/c_scale*CT*synRate*0.223284;
+rate_matrix_3[55][42]:=NS_3/c_scale*GT*synRate*0.264776;
+rate_matrix_3[55][52]:=NS_3/c_scale*CG*synRate*0.166866;
+rate_matrix_3[55][54]:=NS_3/c_scale*CG*synRate*0.250149;
+rate_matrix_3[55][56]:=NS_3/c_scale*GT*synRate*0.279104;
+rate_matrix_3[55][59]:=NS_3/c_scale*GT*synRate*0.306866;
+rate_matrix_3[56][11]:=NS_3/c_scale*AT*synRate*0.340299;
+rate_matrix_3[56][27]:=NS_3/c_scale*CT*synRate*0.223284;
+rate_matrix_3[56][43]:=NS_3/c_scale*GT*synRate*0.264776;
+rate_matrix_3[56][49]:=NS_3/c_scale*synRate*0.305075;
+rate_matrix_3[56][53]:=NS_3/c_scale*CG*synRate*0.166866;
+rate_matrix_3[56][54]:=S_3/c_scale*CT*synRate*0.250149;
+rate_matrix_3[56][55]:=NS_3/c_scale*GT*synRate*0.260597;
+rate_matrix_3[56][60]:=NS_3/c_scale*GT*synRate*0.306866;
+rate_matrix_3[57][12]:=NS_3/c_scale*AT*synRate*0.340299;
+rate_matrix_3[57][28]:=S_3/c_scale*CT*synRate*0.223284;
+rate_matrix_3[57][44]:=NS_3/c_scale*GT*synRate*0.264776;
+rate_matrix_3[57][50]:=NS_3/c_scale*CT*synRate*0.166866;
+rate_matrix_3[57][58]:=NS_3/c_scale*AC*synRate*0.250149;
+rate_matrix_3[57][59]:=S_3/c_scale*synRate*0.260597;
+rate_matrix_3[57][60]:=NS_3/c_scale*AT*synRate*0.279104;
+rate_matrix_3[58][13]:=NS_3/c_scale*AT*synRate*0.340299;
+rate_matrix_3[58][29]:=NS_3/c_scale*CT*synRate*0.223284;
+rate_matrix_3[58][45]:=NS_3/c_scale*GT*synRate*0.264776;
+rate_matrix_3[58][48]:=NS_3/c_scale*AT*synRate*0.305075;
+rate_matrix_3[58][51]:=NS_3/c_scale*CT*synRate*0.166866;
+rate_matrix_3[58][54]:=NS_3/c_scale*GT*synRate*0.221194;
+rate_matrix_3[58][57]:=NS_3/c_scale*AC*synRate*0.210149;
+rate_matrix_3[58][59]:=NS_3/c_scale*CG*synRate*0.260597;
+rate_matrix_3[58][60]:=S_3/c_scale*CT*synRate*0.279104;
+rate_matrix_3[59][14]:=NS_3/c_scale*AT*synRate*0.340299;
+rate_matrix_3[59][30]:=S_3/c_scale*CT*synRate*0.223284;
+rate_matrix_3[59][46]:=NS_3/c_scale*GT*synRate*0.264776;
+rate_matrix_3[59][52]:=NS_3/c_scale*CT*synRate*0.166866;
+rate_matrix_3[59][55]:=NS_3/c_scale*GT*synRate*0.221194;
+rate_matrix_3[59][57]:=S_3/c_scale*synRate*0.210149;
+rate_matrix_3[59][58]:=NS_3/c_scale*CG*synRate*0.250149;
+rate_matrix_3[59][60]:=NS_3/c_scale*GT*synRate*0.279104;
+rate_matrix_3[60][15]:=NS_3/c_scale*AT*synRate*0.340299;
+rate_matrix_3[60][31]:=NS_3/c_scale*CT*synRate*0.223284;
+rate_matrix_3[60][47]:=NS_3/c_scale*GT*synRate*0.264776;
+rate_matrix_3[60][49]:=NS_3/c_scale*AT*synRate*0.305075;
+rate_matrix_3[60][53]:=NS_3/c_scale*CT*synRate*0.166866;
+rate_matrix_3[60][56]:=NS_3/c_scale*GT*synRate*0.221194;
+rate_matrix_3[60][57]:=NS_3/c_scale*AT*synRate*0.210149;
+rate_matrix_3[60][58]:=S_3/c_scale*CT*synRate*0.250149;
+rate_matrix_3[60][59]:=NS_3/c_scale*GT*synRate*0.260597;
+
+
+Model MG94model_3=(rate_matrix_3,vectorOfFrequencies,0);
+rate_matrix_4={61,61};
+rate_matrix_4[0][1]:=NS_4/c_scale*AC*synRate*0.250149;
+rate_matrix_4[0][2]:=S_4/c_scale*synRate*0.260597;
+rate_matrix_4[0][3]:=NS_4/c_scale*AT*synRate*0.279104;
+rate_matrix_4[0][4]:=NS_4/c_scale*AC*synRate*0.166866;
+rate_matrix_4[0][8]:=NS_4/c_scale*synRate*0.221194;
+rate_matrix_4[0][12]:=NS_4/c_scale*AT*synRate*0.306866;
+rate_matrix_4[0][16]:=NS_4/c_scale*AC*synRate*0.223284;
+rate_matrix_4[0][32]:=NS_4/c_scale*synRate*0.264776;
+rate_matrix_4[1][0]:=NS_4/c_scale*AC*synRate*0.210149;
+rate_matrix_4[1][2]:=NS_4/c_scale*CG*synRate*0.260597;
+rate_matrix_4[1][3]:=S_4/c_scale*CT*synRate*0.279104;
+rate_matrix_4[1][5]:=NS_4/c_scale*AC*synRate*0.166866;
+rate_matrix_4[1][9]:=NS_4/c_scale*synRate*0.221194;
+rate_matrix_4[1][13]:=NS_4/c_scale*AT*synRate*0.306866;
+rate_matrix_4[1][17]:=NS_4/c_scale*AC*synRate*0.223284;
+rate_matrix_4[1][33]:=NS_4/c_scale*synRate*0.264776;
+rate_matrix_4[1][48]:=NS_4/c_scale*AT*synRate*0.171642;
+rate_matrix_4[2][0]:=S_4/c_scale*synRate*0.210149;
+rate_matrix_4[2][1]:=NS_4/c_scale*CG*synRate*0.250149;
+rate_matrix_4[2][3]:=NS_4/c_scale*GT*synRate*0.279104;
+rate_matrix_4[2][6]:=NS_4/c_scale*AC*synRate*0.166866;
+rate_matrix_4[2][10]:=NS_4/c_scale*synRate*0.221194;
+rate_matrix_4[2][14]:=NS_4/c_scale*AT*synRate*0.306866;
+rate_matrix_4[2][18]:=NS_4/c_scale*AC*synRate*0.223284;
+rate_matrix_4[2][34]:=NS_4/c_scale*synRate*0.264776;
+rate_matrix_4[3][0]:=NS_4/c_scale*AT*synRate*0.210149;
+rate_matrix_4[3][1]:=S_4/c_scale*CT*synRate*0.250149;
+rate_matrix_4[3][2]:=NS_4/c_scale*GT*synRate*0.260597;
+rate_matrix_4[3][7]:=NS_4/c_scale*AC*synRate*0.166866;
+rate_matrix_4[3][11]:=NS_4/c_scale*synRate*0.221194;
+rate_matrix_4[3][15]:=NS_4/c_scale*AT*synRate*0.306866;
+rate_matrix_4[3][19]:=NS_4/c_scale*AC*synRate*0.223284;
+rate_matrix_4[3][35]:=NS_4/c_scale*synRate*0.264776;
+rate_matrix_4[3][49]:=NS_4/c_scale*AT*synRate*0.171642;
+rate_matrix_4[4][0]:=NS_4/c_scale*AC*synRate*0.305075;
+rate_matrix_4[4][5]:=S_4/c_scale*AC*synRate*0.250149;
+rate_matrix_4[4][6]:=S_4/c_scale*synRate*0.260597;
+rate_matrix_4[4][7]:=S_4/c_scale*AT*synRate*0.279104;
+rate_matrix_4[4][8]:=NS_4/c_scale*CG*synRate*0.221194;
+rate_matrix_4[4][12]:=NS_4/c_scale*CT*synRate*0.306866;
+rate_matrix_4[4][20]:=NS_4/c_scale*AC*synRate*0.223284;
+rate_matrix_4[4][36]:=NS_4/c_scale*synRate*0.264776;
+rate_matrix_4[4][50]:=NS_4/c_scale*AT*synRate*0.171642;
+rate_matrix_4[5][1]:=NS_4/c_scale*AC*synRate*0.305075;
+rate_matrix_4[5][4]:=S_4/c_scale*AC*synRate*0.210149;
+rate_matrix_4[5][6]:=S_4/c_scale*CG*synRate*0.260597;
+rate_matrix_4[5][7]:=S_4/c_scale*CT*synRate*0.279104;
+rate_matrix_4[5][9]:=NS_4/c_scale*CG*synRate*0.221194;
+rate_matrix_4[5][13]:=NS_4/c_scale*CT*synRate*0.306866;
+rate_matrix_4[5][21]:=NS_4/c_scale*AC*synRate*0.223284;
+rate_matrix_4[5][37]:=NS_4/c_scale*synRate*0.264776;
+rate_matrix_4[5][51]:=NS_4/c_scale*AT*synRate*0.171642;
+rate_matrix_4[6][2]:=NS_4/c_scale*AC*synRate*0.305075;
+rate_matrix_4[6][4]:=S_4/c_scale*synRate*0.210149;
+rate_matrix_4[6][5]:=S_4/c_scale*CG*synRate*0.250149;
+rate_matrix_4[6][7]:=S_4/c_scale*GT*synRate*0.279104;
+rate_matrix_4[6][10]:=NS_4/c_scale*CG*synRate*0.221194;
+rate_matrix_4[6][14]:=NS_4/c_scale*CT*synRate*0.306866;
+rate_matrix_4[6][22]:=NS_4/c_scale*AC*synRate*0.223284;
+rate_matrix_4[6][38]:=NS_4/c_scale*synRate*0.264776;
+rate_matrix_4[6][52]:=NS_4/c_scale*AT*synRate*0.171642;
+rate_matrix_4[7][3]:=NS_4/c_scale*AC*synRate*0.305075;
+rate_matrix_4[7][4]:=S_4/c_scale*AT*synRate*0.210149;
+rate_matrix_4[7][5]:=S_4/c_scale*CT*synRate*0.250149;
+rate_matrix_4[7][6]:=S_4/c_scale*GT*synRate*0.260597;
+rate_matrix_4[7][11]:=NS_4/c_scale*CG*synRate*0.221194;
+rate_matrix_4[7][15]:=NS_4/c_scale*CT*synRate*0.306866;
+rate_matrix_4[7][23]:=NS_4/c_scale*AC*synRate*0.223284;
+rate_matrix_4[7][39]:=NS_4/c_scale*synRate*0.264776;
+rate_matrix_4[7][53]:=NS_4/c_scale*AT*synRate*0.171642;
+rate_matrix_4[8][0]:=NS_4/c_scale*synRate*0.305075;
+rate_matrix_4[8][4]:=NS_4/c_scale*CG*synRate*0.166866;
+rate_matrix_4[8][9]:=NS_4/c_scale*AC*synRate*0.250149;
+rate_matrix_4[8][10]:=S_4/c_scale*synRate*0.260597;
+rate_matrix_4[8][11]:=NS_4/c_scale*AT*synRate*0.279104;
+rate_matrix_4[8][12]:=NS_4/c_scale*GT*synRate*0.306866;
+rate_matrix_4[8][24]:=S_4/c_scale*AC*synRate*0.223284;
+rate_matrix_4[8][40]:=NS_4/c_scale*synRate*0.264776;
+rate_matrix_4[9][1]:=NS_4/c_scale*synRate*0.305075;
+rate_matrix_4[9][5]:=NS_4/c_scale*CG*synRate*0.166866;
+rate_matrix_4[9][8]:=NS_4/c_scale*AC*synRate*0.210149;
+rate_matrix_4[9][10]:=NS_4/c_scale*CG*synRate*0.260597;
+rate_matrix_4[9][11]:=S_4/c_scale*CT*synRate*0.279104;
+rate_matrix_4[9][13]:=NS_4/c_scale*GT*synRate*0.306866;
+rate_matrix_4[9][25]:=NS_4/c_scale*AC*synRate*0.223284;
+rate_matrix_4[9][41]:=NS_4/c_scale*synRate*0.264776;
+rate_matrix_4[9][54]:=NS_4/c_scale*AT*synRate*0.171642;
+rate_matrix_4[10][2]:=NS_4/c_scale*synRate*0.305075;
+rate_matrix_4[10][6]:=NS_4/c_scale*CG*synRate*0.166866;
+rate_matrix_4[10][8]:=S_4/c_scale*synRate*0.210149;
+rate_matrix_4[10][9]:=NS_4/c_scale*CG*synRate*0.250149;
+rate_matrix_4[10][11]:=NS_4/c_scale*GT*synRate*0.279104;
+rate_matrix_4[10][14]:=NS_4/c_scale*GT*synRate*0.306866;
+rate_matrix_4[10][26]:=S_4/c_scale*AC*synRate*0.223284;
+rate_matrix_4[10][42]:=NS_4/c_scale*synRate*0.264776;
+rate_matrix_4[10][55]:=NS_4/c_scale*AT*synRate*0.171642;
+rate_matrix_4[11][3]:=NS_4/c_scale*synRate*0.305075;
+rate_matrix_4[11][7]:=NS_4/c_scale*CG*synRate*0.166866;
+rate_matrix_4[11][8]:=NS_4/c_scale*AT*synRate*0.210149;
+rate_matrix_4[11][9]:=S_4/c_scale*CT*synRate*0.250149;
+rate_matrix_4[11][10]:=NS_4/c_scale*GT*synRate*0.260597;
+rate_matrix_4[11][15]:=NS_4/c_scale*GT*synRate*0.306866;
+rate_matrix_4[11][27]:=NS_4/c_scale*AC*synRate*0.223284;
+rate_matrix_4[11][43]:=NS_4/c_scale*synRate*0.264776;
+rate_matrix_4[11][56]:=NS_4/c_scale*AT*synRate*0.171642;
+rate_matrix_4[12][0]:=NS_4/c_scale*AT*synRate*0.305075;
+rate_matrix_4[12][4]:=NS_4/c_scale*CT*synRate*0.166866;
+rate_matrix_4[12][8]:=NS_4/c_scale*GT*synRate*0.221194;
+rate_matrix_4[12][13]:=S_4/c_scale*AC*synRate*0.250149;
+rate_matrix_4[12][14]:=NS_4/c_scale*synRate*0.260597;
+rate_matrix_4[12][15]:=S_4/c_scale*AT*synRate*0.279104;
+rate_matrix_4[12][28]:=NS_4/c_scale*AC*synRate*0.223284;
+rate_matrix_4[12][44]:=NS_4/c_scale*synRate*0.264776;
+rate_matrix_4[12][57]:=NS_4/c_scale*AT*synRate*0.171642;
+rate_matrix_4[13][1]:=NS_4/c_scale*AT*synRate*0.305075;
+rate_matrix_4[13][5]:=NS_4/c_scale*CT*synRate*0.166866;
+rate_matrix_4[13][9]:=NS_4/c_scale*GT*synRate*0.221194;
+rate_matrix_4[13][12]:=S_4/c_scale*AC*synRate*0.210149;
+rate_matrix_4[13][14]:=NS_4/c_scale*CG*synRate*0.260597;
+rate_matrix_4[13][15]:=S_4/c_scale*CT*synRate*0.279104;
+rate_matrix_4[13][29]:=NS_4/c_scale*AC*synRate*0.223284;
+rate_matrix_4[13][45]:=NS_4/c_scale*synRate*0.264776;
+rate_matrix_4[13][58]:=NS_4/c_scale*AT*synRate*0.171642;
+rate_matrix_4[14][2]:=NS_4/c_scale*AT*synRate*0.305075;
+rate_matrix_4[14][6]:=NS_4/c_scale*CT*synRate*0.166866;
+rate_matrix_4[14][10]:=NS_4/c_scale*GT*synRate*0.221194;
+rate_matrix_4[14][12]:=NS_4/c_scale*synRate*0.210149;
+rate_matrix_4[14][13]:=NS_4/c_scale*CG*synRate*0.250149;
+rate_matrix_4[14][15]:=NS_4/c_scale*GT*synRate*0.279104;
+rate_matrix_4[14][30]:=NS_4/c_scale*AC*synRate*0.223284;
+rate_matrix_4[14][46]:=NS_4/c_scale*synRate*0.264776;
+rate_matrix_4[14][59]:=NS_4/c_scale*AT*synRate*0.171642;
+rate_matrix_4[15][3]:=NS_4/c_scale*AT*synRate*0.305075;
+rate_matrix_4[15][7]:=NS_4/c_scale*CT*synRate*0.166866;
+rate_matrix_4[15][11]:=NS_4/c_scale*GT*synRate*0.221194;
+rate_matrix_4[15][12]:=S_4/c_scale*AT*synRate*0.210149;
+rate_matrix_4[15][13]:=S_4/c_scale*CT*synRate*0.250149;
+rate_matrix_4[15][14]:=NS_4/c_scale*GT*synRate*0.260597;
+rate_matrix_4[15][31]:=NS_4/c_scale*AC*synRate*0.223284;
+rate_matrix_4[15][47]:=NS_4/c_scale*synRate*0.264776;
+rate_matrix_4[15][60]:=NS_4/c_scale*AT*synRate*0.171642;
+rate_matrix_4[16][0]:=NS_4/c_scale*AC*synRate*0.340299;
+rate_matrix_4[16][17]:=NS_4/c_scale*AC*synRate*0.250149;
+rate_matrix_4[16][18]:=S_4/c_scale*synRate*0.260597;
+rate_matrix_4[16][19]:=NS_4/c_scale*AT*synRate*0.279104;
+rate_matrix_4[16][20]:=NS_4/c_scale*AC*synRate*0.166866;
+rate_matrix_4[16][24]:=NS_4/c_scale*synRate*0.221194;
+rate_matrix_4[16][28]:=NS_4/c_scale*AT*synRate*0.306866;
+rate_matrix_4[16][32]:=NS_4/c_scale*CG*synRate*0.264776;
+rate_matrix_4[17][1]:=NS_4/c_scale*AC*synRate*0.340299;
+rate_matrix_4[17][16]:=NS_4/c_scale*AC*synRate*0.210149;
+rate_matrix_4[17][18]:=NS_4/c_scale*CG*synRate*0.260597;
+rate_matrix_4[17][19]:=S_4/c_scale*CT*synRate*0.279104;
+rate_matrix_4[17][21]:=NS_4/c_scale*AC*synRate*0.166866;
+rate_matrix_4[17][25]:=NS_4/c_scale*synRate*0.221194;
+rate_matrix_4[17][29]:=NS_4/c_scale*AT*synRate*0.306866;
+rate_matrix_4[17][33]:=NS_4/c_scale*CG*synRate*0.264776;
+rate_matrix_4[17][48]:=NS_4/c_scale*CT*synRate*0.171642;
+rate_matrix_4[18][2]:=NS_4/c_scale*AC*synRate*0.340299;
+rate_matrix_4[18][16]:=S_4/c_scale*synRate*0.210149;
+rate_matrix_4[18][17]:=NS_4/c_scale*CG*synRate*0.250149;
+rate_matrix_4[18][19]:=NS_4/c_scale*GT*synRate*0.279104;
+rate_matrix_4[18][22]:=NS_4/c_scale*AC*synRate*0.166866;
+rate_matrix_4[18][26]:=NS_4/c_scale*synRate*0.221194;
+rate_matrix_4[18][30]:=NS_4/c_scale*AT*synRate*0.306866;
+rate_matrix_4[18][34]:=NS_4/c_scale*CG*synRate*0.264776;
+rate_matrix_4[19][3]:=NS_4/c_scale*AC*synRate*0.340299;
+rate_matrix_4[19][16]:=NS_4/c_scale*AT*synRate*0.210149;
+rate_matrix_4[19][17]:=S_4/c_scale*CT*synRate*0.250149;
+rate_matrix_4[19][18]:=NS_4/c_scale*GT*synRate*0.260597;
+rate_matrix_4[19][23]:=NS_4/c_scale*AC*synRate*0.166866;
+rate_matrix_4[19][27]:=NS_4/c_scale*synRate*0.221194;
+rate_matrix_4[19][31]:=NS_4/c_scale*AT*synRate*0.306866;
+rate_matrix_4[19][35]:=NS_4/c_scale*CG*synRate*0.264776;
+rate_matrix_4[19][49]:=NS_4/c_scale*CT*synRate*0.171642;
+rate_matrix_4[20][4]:=NS_4/c_scale*AC*synRate*0.340299;
+rate_matrix_4[20][16]:=NS_4/c_scale*AC*synRate*0.305075;
+rate_matrix_4[20][21]:=S_4/c_scale*AC*synRate*0.250149;
+rate_matrix_4[20][22]:=S_4/c_scale*synRate*0.260597;
+rate_matrix_4[20][23]:=S_4/c_scale*AT*synRate*0.279104;
+rate_matrix_4[20][24]:=NS_4/c_scale*CG*synRate*0.221194;
+rate_matrix_4[20][28]:=NS_4/c_scale*CT*synRate*0.306866;
+rate_matrix_4[20][36]:=NS_4/c_scale*CG*synRate*0.264776;
+rate_matrix_4[20][50]:=NS_4/c_scale*CT*synRate*0.171642;
+rate_matrix_4[21][5]:=NS_4/c_scale*AC*synRate*0.340299;
+rate_matrix_4[21][17]:=NS_4/c_scale*AC*synRate*0.305075;
+rate_matrix_4[21][20]:=S_4/c_scale*AC*synRate*0.210149;
+rate_matrix_4[21][22]:=S_4/c_scale*CG*synRate*0.260597;
+rate_matrix_4[21][23]:=S_4/c_scale*CT*synRate*0.279104;
+rate_matrix_4[21][25]:=NS_4/c_scale*CG*synRate*0.221194;
+rate_matrix_4[21][29]:=NS_4/c_scale*CT*synRate*0.306866;
+rate_matrix_4[21][37]:=NS_4/c_scale*CG*synRate*0.264776;
+rate_matrix_4[21][51]:=NS_4/c_scale*CT*synRate*0.171642;
+rate_matrix_4[22][6]:=NS_4/c_scale*AC*synRate*0.340299;
+rate_matrix_4[22][18]:=NS_4/c_scale*AC*synRate*0.305075;
+rate_matrix_4[22][20]:=S_4/c_scale*synRate*0.210149;
+rate_matrix_4[22][21]:=S_4/c_scale*CG*synRate*0.250149;
+rate_matrix_4[22][23]:=S_4/c_scale*GT*synRate*0.279104;
+rate_matrix_4[22][26]:=NS_4/c_scale*CG*synRate*0.221194;
+rate_matrix_4[22][30]:=NS_4/c_scale*CT*synRate*0.306866;
+rate_matrix_4[22][38]:=NS_4/c_scale*CG*synRate*0.264776;
+rate_matrix_4[22][52]:=NS_4/c_scale*CT*synRate*0.171642;
+rate_matrix_4[23][7]:=NS_4/c_scale*AC*synRate*0.340299;
+rate_matrix_4[23][19]:=NS_4/c_scale*AC*synRate*0.305075;
+rate_matrix_4[23][20]:=S_4/c_scale*AT*synRate*0.210149;
+rate_matrix_4[23][21]:=S_4/c_scale*CT*synRate*0.250149;
+rate_matrix_4[23][22]:=S_4/c_scale*GT*synRate*0.260597;
+rate_matrix_4[23][27]:=NS_4/c_scale*CG*synRate*0.221194;
+rate_matrix_4[23][31]:=NS_4/c_scale*CT*synRate*0.306866;
+rate_matrix_4[23][39]:=NS_4/c_scale*CG*synRate*0.264776;
+rate_matrix_4[23][53]:=NS_4/c_scale*CT*synRate*0.171642;
+rate_matrix_4[24][8]:=S_4/c_scale*AC*synRate*0.340299;
+rate_matrix_4[24][16]:=NS_4/c_scale*synRate*0.305075;
+rate_matrix_4[24][20]:=NS_4/c_scale*CG*synRate*0.166866;
+rate_matrix_4[24][25]:=S_4/c_scale*AC*synRate*0.250149;
+rate_matrix_4[24][26]:=S_4/c_scale*synRate*0.260597;
+rate_matrix_4[24][27]:=S_4/c_scale*AT*synRate*0.279104;
+rate_matrix_4[24][28]:=NS_4/c_scale*GT*synRate*0.306866;
+rate_matrix_4[24][40]:=NS_4/c_scale*CG*synRate*0.264776;
+rate_matrix_4[25][9]:=NS_4/c_scale*AC*synRate*0.340299;
+rate_matrix_4[25][17]:=NS_4/c_scale*synRate*0.305075;
+rate_matrix_4[25][21]:=NS_4/c_scale*CG*synRate*0.166866;
+rate_matrix_4[25][24]:=S_4/c_scale*AC*synRate*0.210149;
+rate_matrix_4[25][26]:=S_4/c_scale*CG*synRate*0.260597;
+rate_matrix_4[25][27]:=S_4/c_scale*CT*synRate*0.279104;
+rate_matrix_4[25][29]:=NS_4/c_scale*GT*synRate*0.306866;
+rate_matrix_4[25][41]:=NS_4/c_scale*CG*synRate*0.264776;
+rate_matrix_4[25][54]:=NS_4/c_scale*CT*synRate*0.171642;
+rate_matrix_4[26][10]:=S_4/c_scale*AC*synRate*0.340299;
+rate_matrix_4[26][18]:=NS_4/c_scale*synRate*0.305075;
+rate_matrix_4[26][22]:=NS_4/c_scale*CG*synRate*0.166866;
+rate_matrix_4[26][24]:=S_4/c_scale*synRate*0.210149;
+rate_matrix_4[26][25]:=S_4/c_scale*CG*synRate*0.250149;
+rate_matrix_4[26][27]:=S_4/c_scale*GT*synRate*0.279104;
+rate_matrix_4[26][30]:=NS_4/c_scale*GT*synRate*0.306866;
+rate_matrix_4[26][42]:=NS_4/c_scale*CG*synRate*0.264776;
+rate_matrix_4[26][55]:=NS_4/c_scale*CT*synRate*0.171642;
+rate_matrix_4[27][11]:=NS_4/c_scale*AC*synRate*0.340299;
+rate_matrix_4[27][19]:=NS_4/c_scale*synRate*0.305075;
+rate_matrix_4[27][23]:=NS_4/c_scale*CG*synRate*0.166866;
+rate_matrix_4[27][24]:=S_4/c_scale*AT*synRate*0.210149;
+rate_matrix_4[27][25]:=S_4/c_scale*CT*synRate*0.250149;
+rate_matrix_4[27][26]:=S_4/c_scale*GT*synRate*0.260597;
+rate_matrix_4[27][31]:=NS_4/c_scale*GT*synRate*0.306866;
+rate_matrix_4[27][43]:=NS_4/c_scale*CG*synRate*0.264776;
+rate_matrix_4[27][56]:=NS_4/c_scale*CT*synRate*0.171642;
+rate_matrix_4[28][12]:=NS_4/c_scale*AC*synRate*0.340299;
+rate_matrix_4[28][16]:=NS_4/c_scale*AT*synRate*0.305075;
+rate_matrix_4[28][20]:=NS_4/c_scale*CT*synRate*0.166866;
+rate_matrix_4[28][24]:=NS_4/c_scale*GT*synRate*0.221194;
+rate_matrix_4[28][29]:=S_4/c_scale*AC*synRate*0.250149;
+rate_matrix_4[28][30]:=S_4/c_scale*synRate*0.260597;
+rate_matrix_4[28][31]:=S_4/c_scale*AT*synRate*0.279104;
+rate_matrix_4[28][44]:=NS_4/c_scale*CG*synRate*0.264776;
+rate_matrix_4[28][57]:=S_4/c_scale*CT*synRate*0.171642;
+rate_matrix_4[29][13]:=NS_4/c_scale*AC*synRate*0.340299;
+rate_matrix_4[29][17]:=NS_4/c_scale*AT*synRate*0.305075;
+rate_matrix_4[29][21]:=NS_4/c_scale*CT*synRate*0.166866;
+rate_matrix_4[29][25]:=NS_4/c_scale*GT*synRate*0.221194;
+rate_matrix_4[29][28]:=S_4/c_scale*AC*synRate*0.210149;
+rate_matrix_4[29][30]:=S_4/c_scale*CG*synRate*0.260597;
+rate_matrix_4[29][31]:=S_4/c_scale*CT*synRate*0.279104;
+rate_matrix_4[29][45]:=NS_4/c_scale*CG*synRate*0.264776;
+rate_matrix_4[29][58]:=NS_4/c_scale*CT*synRate*0.171642;
+rate_matrix_4[30][14]:=NS_4/c_scale*AC*synRate*0.340299;
+rate_matrix_4[30][18]:=NS_4/c_scale*AT*synRate*0.305075;
+rate_matrix_4[30][22]:=NS_4/c_scale*CT*synRate*0.166866;
+rate_matrix_4[30][26]:=NS_4/c_scale*GT*synRate*0.221194;
+rate_matrix_4[30][28]:=S_4/c_scale*synRate*0.210149;
+rate_matrix_4[30][29]:=S_4/c_scale*CG*synRate*0.250149;
+rate_matrix_4[30][31]:=S_4/c_scale*GT*synRate*0.279104;
+rate_matrix_4[30][46]:=NS_4/c_scale*CG*synRate*0.264776;
+rate_matrix_4[30][59]:=S_4/c_scale*CT*synRate*0.171642;
+rate_matrix_4[31][15]:=NS_4/c_scale*AC*synRate*0.340299;
+rate_matrix_4[31][19]:=NS_4/c_scale*AT*synRate*0.305075;
+rate_matrix_4[31][23]:=NS_4/c_scale*CT*synRate*0.166866;
+rate_matrix_4[31][27]:=NS_4/c_scale*GT*synRate*0.221194;
+rate_matrix_4[31][28]:=S_4/c_scale*AT*synRate*0.210149;
+rate_matrix_4[31][29]:=S_4/c_scale*CT*synRate*0.250149;
+rate_matrix_4[31][30]:=S_4/c_scale*GT*synRate*0.260597;
+rate_matrix_4[31][47]:=NS_4/c_scale*CG*synRate*0.264776;
+rate_matrix_4[31][60]:=NS_4/c_scale*CT*synRate*0.171642;
+rate_matrix_4[32][0]:=NS_4/c_scale*synRate*0.340299;
+rate_matrix_4[32][16]:=NS_4/c_scale*CG*synRate*0.223284;
+rate_matrix_4[32][33]:=NS_4/c_scale*AC*synRate*0.250149;
+rate_matrix_4[32][34]:=S_4/c_scale*synRate*0.260597;
+rate_matrix_4[32][35]:=NS_4/c_scale*AT*synRate*0.279104;
+rate_matrix_4[32][36]:=NS_4/c_scale*AC*synRate*0.166866;
+rate_matrix_4[32][40]:=NS_4/c_scale*synRate*0.221194;
+rate_matrix_4[32][44]:=NS_4/c_scale*AT*synRate*0.306866;
+rate_matrix_4[33][1]:=NS_4/c_scale*synRate*0.340299;
+rate_matrix_4[33][17]:=NS_4/c_scale*CG*synRate*0.223284;
+rate_matrix_4[33][32]:=NS_4/c_scale*AC*synRate*0.210149;
+rate_matrix_4[33][34]:=NS_4/c_scale*CG*synRate*0.260597;
+rate_matrix_4[33][35]:=S_4/c_scale*CT*synRate*0.279104;
+rate_matrix_4[33][37]:=NS_4/c_scale*AC*synRate*0.166866;
+rate_matrix_4[33][41]:=NS_4/c_scale*synRate*0.221194;
+rate_matrix_4[33][45]:=NS_4/c_scale*AT*synRate*0.306866;
+rate_matrix_4[33][48]:=NS_4/c_scale*GT*synRate*0.171642;
+rate_matrix_4[34][2]:=NS_4/c_scale*synRate*0.340299;
+rate_matrix_4[34][18]:=NS_4/c_scale*CG*synRate*0.223284;
+rate_matrix_4[34][32]:=S_4/c_scale*synRate*0.210149;
+rate_matrix_4[34][33]:=NS_4/c_scale*CG*synRate*0.250149;
+rate_matrix_4[34][35]:=NS_4/c_scale*GT*synRate*0.279104;
+rate_matrix_4[34][38]:=NS_4/c_scale*AC*synRate*0.166866;
+rate_matrix_4[34][42]:=NS_4/c_scale*synRate*0.221194;
+rate_matrix_4[34][46]:=NS_4/c_scale*AT*synRate*0.306866;
+rate_matrix_4[35][3]:=NS_4/c_scale*synRate*0.340299;
+rate_matrix_4[35][19]:=NS_4/c_scale*CG*synRate*0.223284;
+rate_matrix_4[35][32]:=NS_4/c_scale*AT*synRate*0.210149;
+rate_matrix_4[35][33]:=S_4/c_scale*CT*synRate*0.250149;
+rate_matrix_4[35][34]:=NS_4/c_scale*GT*synRate*0.260597;
+rate_matrix_4[35][39]:=NS_4/c_scale*AC*synRate*0.166866;
+rate_matrix_4[35][43]:=NS_4/c_scale*synRate*0.221194;
+rate_matrix_4[35][47]:=NS_4/c_scale*AT*synRate*0.306866;
+rate_matrix_4[35][49]:=NS_4/c_scale*GT*synRate*0.171642;
+rate_matrix_4[36][4]:=NS_4/c_scale*synRate*0.340299;
+rate_matrix_4[36][20]:=NS_4/c_scale*CG*synRate*0.223284;
+rate_matrix_4[36][32]:=NS_4/c_scale*AC*synRate*0.305075;
+rate_matrix_4[36][37]:=S_4/c_scale*AC*synRate*0.250149;
+rate_matrix_4[36][38]:=S_4/c_scale*synRate*0.260597;
+rate_matrix_4[36][39]:=S_4/c_scale*AT*synRate*0.279104;
+rate_matrix_4[36][40]:=NS_4/c_scale*CG*synRate*0.221194;
+rate_matrix_4[36][44]:=NS_4/c_scale*CT*synRate*0.306866;
+rate_matrix_4[36][50]:=NS_4/c_scale*GT*synRate*0.171642;
+rate_matrix_4[37][5]:=NS_4/c_scale*synRate*0.340299;
+rate_matrix_4[37][21]:=NS_4/c_scale*CG*synRate*0.223284;
+rate_matrix_4[37][33]:=NS_4/c_scale*AC*synRate*0.305075;
+rate_matrix_4[37][36]:=S_4/c_scale*AC*synRate*0.210149;
+rate_matrix_4[37][38]:=S_4/c_scale*CG*synRate*0.260597;
+rate_matrix_4[37][39]:=S_4/c_scale*CT*synRate*0.279104;
+rate_matrix_4[37][41]:=NS_4/c_scale*CG*synRate*0.221194;
+rate_matrix_4[37][45]:=NS_4/c_scale*CT*synRate*0.306866;
+rate_matrix_4[37][51]:=NS_4/c_scale*GT*synRate*0.171642;
+rate_matrix_4[38][6]:=NS_4/c_scale*synRate*0.340299;
+rate_matrix_4[38][22]:=NS_4/c_scale*CG*synRate*0.223284;
+rate_matrix_4[38][34]:=NS_4/c_scale*AC*synRate*0.305075;
+rate_matrix_4[38][36]:=S_4/c_scale*synRate*0.210149;
+rate_matrix_4[38][37]:=S_4/c_scale*CG*synRate*0.250149;
+rate_matrix_4[38][39]:=S_4/c_scale*GT*synRate*0.279104;
+rate_matrix_4[38][42]:=NS_4/c_scale*CG*synRate*0.221194;
+rate_matrix_4[38][46]:=NS_4/c_scale*CT*synRate*0.306866;
+rate_matrix_4[38][52]:=NS_4/c_scale*GT*synRate*0.171642;
+rate_matrix_4[39][7]:=NS_4/c_scale*synRate*0.340299;
+rate_matrix_4[39][23]:=NS_4/c_scale*CG*synRate*0.223284;
+rate_matrix_4[39][35]:=NS_4/c_scale*AC*synRate*0.305075;
+rate_matrix_4[39][36]:=S_4/c_scale*AT*synRate*0.210149;
+rate_matrix_4[39][37]:=S_4/c_scale*CT*synRate*0.250149;
+rate_matrix_4[39][38]:=S_4/c_scale*GT*synRate*0.260597;
+rate_matrix_4[39][43]:=NS_4/c_scale*CG*synRate*0.221194;
+rate_matrix_4[39][47]:=NS_4/c_scale*CT*synRate*0.306866;
+rate_matrix_4[39][53]:=NS_4/c_scale*GT*synRate*0.171642;
+rate_matrix_4[40][8]:=NS_4/c_scale*synRate*0.340299;
+rate_matrix_4[40][24]:=NS_4/c_scale*CG*synRate*0.223284;
+rate_matrix_4[40][32]:=NS_4/c_scale*synRate*0.305075;
+rate_matrix_4[40][36]:=NS_4/c_scale*CG*synRate*0.166866;
+rate_matrix_4[40][41]:=S_4/c_scale*AC*synRate*0.250149;
+rate_matrix_4[40][42]:=S_4/c_scale*synRate*0.260597;
+rate_matrix_4[40][43]:=S_4/c_scale*AT*synRate*0.279104;
+rate_matrix_4[40][44]:=NS_4/c_scale*GT*synRate*0.306866;
+rate_matrix_4[41][9]:=NS_4/c_scale*synRate*0.340299;
+rate_matrix_4[41][25]:=NS_4/c_scale*CG*synRate*0.223284;
+rate_matrix_4[41][33]:=NS_4/c_scale*synRate*0.305075;
+rate_matrix_4[41][37]:=NS_4/c_scale*CG*synRate*0.166866;
+rate_matrix_4[41][40]:=S_4/c_scale*AC*synRate*0.210149;
+rate_matrix_4[41][42]:=S_4/c_scale*CG*synRate*0.260597;
+rate_matrix_4[41][43]:=S_4/c_scale*CT*synRate*0.279104;
+rate_matrix_4[41][45]:=NS_4/c_scale*GT*synRate*0.306866;
+rate_matrix_4[41][54]:=NS_4/c_scale*GT*synRate*0.171642;
+rate_matrix_4[42][10]:=NS_4/c_scale*synRate*0.340299;
+rate_matrix_4[42][26]:=NS_4/c_scale*CG*synRate*0.223284;
+rate_matrix_4[42][34]:=NS_4/c_scale*synRate*0.305075;
+rate_matrix_4[42][38]:=NS_4/c_scale*CG*synRate*0.166866;
+rate_matrix_4[42][40]:=S_4/c_scale*synRate*0.210149;
+rate_matrix_4[42][41]:=S_4/c_scale*CG*synRate*0.250149;
+rate_matrix_4[42][43]:=S_4/c_scale*GT*synRate*0.279104;
+rate_matrix_4[42][46]:=NS_4/c_scale*GT*synRate*0.306866;
+rate_matrix_4[42][55]:=NS_4/c_scale*GT*synRate*0.171642;
+rate_matrix_4[43][11]:=NS_4/c_scale*synRate*0.340299;
+rate_matrix_4[43][27]:=NS_4/c_scale*CG*synRate*0.223284;
+rate_matrix_4[43][35]:=NS_4/c_scale*synRate*0.305075;
+rate_matrix_4[43][39]:=NS_4/c_scale*CG*synRate*0.166866;
+rate_matrix_4[43][40]:=S_4/c_scale*AT*synRate*0.210149;
+rate_matrix_4[43][41]:=S_4/c_scale*CT*synRate*0.250149;
+rate_matrix_4[43][42]:=S_4/c_scale*GT*synRate*0.260597;
+rate_matrix_4[43][47]:=NS_4/c_scale*GT*synRate*0.306866;
+rate_matrix_4[43][56]:=NS_4/c_scale*GT*synRate*0.171642;
+rate_matrix_4[44][12]:=NS_4/c_scale*synRate*0.340299;
+rate_matrix_4[44][28]:=NS_4/c_scale*CG*synRate*0.223284;
+rate_matrix_4[44][32]:=NS_4/c_scale*AT*synRate*0.305075;
+rate_matrix_4[44][36]:=NS_4/c_scale*CT*synRate*0.166866;
+rate_matrix_4[44][40]:=NS_4/c_scale*GT*synRate*0.221194;
+rate_matrix_4[44][45]:=S_4/c_scale*AC*synRate*0.250149;
+rate_matrix_4[44][46]:=S_4/c_scale*synRate*0.260597;
+rate_matrix_4[44][47]:=S_4/c_scale*AT*synRate*0.279104;
+rate_matrix_4[44][57]:=NS_4/c_scale*GT*synRate*0.171642;
+rate_matrix_4[45][13]:=NS_4/c_scale*synRate*0.340299;
+rate_matrix_4[45][29]:=NS_4/c_scale*CG*synRate*0.223284;
+rate_matrix_4[45][33]:=NS_4/c_scale*AT*synRate*0.305075;
+rate_matrix_4[45][37]:=NS_4/c_scale*CT*synRate*0.166866;
+rate_matrix_4[45][41]:=NS_4/c_scale*GT*synRate*0.221194;
+rate_matrix_4[45][44]:=S_4/c_scale*AC*synRate*0.210149;
+rate_matrix_4[45][46]:=S_4/c_scale*CG*synRate*0.260597;
+rate_matrix_4[45][47]:=S_4/c_scale*CT*synRate*0.279104;
+rate_matrix_4[45][58]:=NS_4/c_scale*GT*synRate*0.171642;
+rate_matrix_4[46][14]:=NS_4/c_scale*synRate*0.340299;
+rate_matrix_4[46][30]:=NS_4/c_scale*CG*synRate*0.223284;
+rate_matrix_4[46][34]:=NS_4/c_scale*AT*synRate*0.305075;
+rate_matrix_4[46][38]:=NS_4/c_scale*CT*synRate*0.166866;
+rate_matrix_4[46][42]:=NS_4/c_scale*GT*synRate*0.221194;
+rate_matrix_4[46][44]:=S_4/c_scale*synRate*0.210149;
+rate_matrix_4[46][45]:=S_4/c_scale*CG*synRate*0.250149;
+rate_matrix_4[46][47]:=S_4/c_scale*GT*synRate*0.279104;
+rate_matrix_4[46][59]:=NS_4/c_scale*GT*synRate*0.171642;
+rate_matrix_4[47][15]:=NS_4/c_scale*synRate*0.340299;
+rate_matrix_4[47][31]:=NS_4/c_scale*CG*synRate*0.223284;
+rate_matrix_4[47][35]:=NS_4/c_scale*AT*synRate*0.305075;
+rate_matrix_4[47][39]:=NS_4/c_scale*CT*synRate*0.166866;
+rate_matrix_4[47][43]:=NS_4/c_scale*GT*synRate*0.221194;
+rate_matrix_4[47][44]:=S_4/c_scale*AT*synRate*0.210149;
+rate_matrix_4[47][45]:=S_4/c_scale*CT*synRate*0.250149;
+rate_matrix_4[47][46]:=S_4/c_scale*GT*synRate*0.260597;
+rate_matrix_4[47][60]:=NS_4/c_scale*GT*synRate*0.171642;
+rate_matrix_4[48][1]:=NS_4/c_scale*AT*synRate*0.340299;
+rate_matrix_4[48][17]:=NS_4/c_scale*CT*synRate*0.223284;
+rate_matrix_4[48][33]:=NS_4/c_scale*GT*synRate*0.264776;
+rate_matrix_4[48][49]:=S_4/c_scale*CT*synRate*0.279104;
+rate_matrix_4[48][51]:=NS_4/c_scale*AC*synRate*0.166866;
+rate_matrix_4[48][54]:=NS_4/c_scale*synRate*0.221194;
+rate_matrix_4[48][58]:=NS_4/c_scale*AT*synRate*0.306866;
+rate_matrix_4[49][3]:=NS_4/c_scale*AT*synRate*0.340299;
+rate_matrix_4[49][19]:=NS_4/c_scale*CT*synRate*0.223284;
+rate_matrix_4[49][35]:=NS_4/c_scale*GT*synRate*0.264776;
+rate_matrix_4[49][48]:=S_4/c_scale*CT*synRate*0.250149;
+rate_matrix_4[49][53]:=NS_4/c_scale*AC*synRate*0.166866;
+rate_matrix_4[49][56]:=NS_4/c_scale*synRate*0.221194;
+rate_matrix_4[49][60]:=NS_4/c_scale*AT*synRate*0.306866;
+rate_matrix_4[50][4]:=NS_4/c_scale*AT*synRate*0.340299;
+rate_matrix_4[50][20]:=NS_4/c_scale*CT*synRate*0.223284;
+rate_matrix_4[50][36]:=NS_4/c_scale*GT*synRate*0.264776;
+rate_matrix_4[50][51]:=S_4/c_scale*AC*synRate*0.250149;
+rate_matrix_4[50][52]:=S_4/c_scale*synRate*0.260597;
+rate_matrix_4[50][53]:=S_4/c_scale*AT*synRate*0.279104;
+rate_matrix_4[50][57]:=NS_4/c_scale*CT*synRate*0.306866;
+rate_matrix_4[51][5]:=NS_4/c_scale*AT*synRate*0.340299;
+rate_matrix_4[51][21]:=NS_4/c_scale*CT*synRate*0.223284;
+rate_matrix_4[51][37]:=NS_4/c_scale*GT*synRate*0.264776;
+rate_matrix_4[51][48]:=NS_4/c_scale*AC*synRate*0.305075;
+rate_matrix_4[51][50]:=S_4/c_scale*AC*synRate*0.210149;
+rate_matrix_4[51][52]:=S_4/c_scale*CG*synRate*0.260597;
+rate_matrix_4[51][53]:=S_4/c_scale*CT*synRate*0.279104;
+rate_matrix_4[51][54]:=NS_4/c_scale*CG*synRate*0.221194;
+rate_matrix_4[51][58]:=NS_4/c_scale*CT*synRate*0.306866;
+rate_matrix_4[52][6]:=NS_4/c_scale*AT*synRate*0.340299;
+rate_matrix_4[52][22]:=NS_4/c_scale*CT*synRate*0.223284;
+rate_matrix_4[52][38]:=NS_4/c_scale*GT*synRate*0.264776;
+rate_matrix_4[52][50]:=S_4/c_scale*synRate*0.210149;
+rate_matrix_4[52][51]:=S_4/c_scale*CG*synRate*0.250149;
+rate_matrix_4[52][53]:=S_4/c_scale*GT*synRate*0.279104;
+rate_matrix_4[52][55]:=NS_4/c_scale*CG*synRate*0.221194;
+rate_matrix_4[52][59]:=NS_4/c_scale*CT*synRate*0.306866;
+rate_matrix_4[53][7]:=NS_4/c_scale*AT*synRate*0.340299;
+rate_matrix_4[53][23]:=NS_4/c_scale*CT*synRate*0.223284;
+rate_matrix_4[53][39]:=NS_4/c_scale*GT*synRate*0.264776;
+rate_matrix_4[53][49]:=NS_4/c_scale*AC*synRate*0.305075;
+rate_matrix_4[53][50]:=S_4/c_scale*AT*synRate*0.210149;
+rate_matrix_4[53][51]:=S_4/c_scale*CT*synRate*0.250149;
+rate_matrix_4[53][52]:=S_4/c_scale*GT*synRate*0.260597;
+rate_matrix_4[53][56]:=NS_4/c_scale*CG*synRate*0.221194;
+rate_matrix_4[53][60]:=NS_4/c_scale*CT*synRate*0.306866;
+rate_matrix_4[54][9]:=NS_4/c_scale*AT*synRate*0.340299;
+rate_matrix_4[54][25]:=NS_4/c_scale*CT*synRate*0.223284;
+rate_matrix_4[54][41]:=NS_4/c_scale*GT*synRate*0.264776;
+rate_matrix_4[54][48]:=NS_4/c_scale*synRate*0.305075;
+rate_matrix_4[54][51]:=NS_4/c_scale*CG*synRate*0.166866;
+rate_matrix_4[54][55]:=NS_4/c_scale*CG*synRate*0.260597;
+rate_matrix_4[54][56]:=S_4/c_scale*CT*synRate*0.279104;
+rate_matrix_4[54][58]:=NS_4/c_scale*GT*synRate*0.306866;
+rate_matrix_4[55][10]:=NS_4/c_scale*AT*synRate*0.340299;
+rate_matrix_4[55][26]:=NS_4/c_scale*CT*synRate*0.223284;
+rate_matrix_4[55][42]:=NS_4/c_scale*GT*synRate*0.264776;
+rate_matrix_4[55][52]:=NS_4/c_scale*CG*synRate*0.166866;
+rate_matrix_4[55][54]:=NS_4/c_scale*CG*synRate*0.250149;
+rate_matrix_4[55][56]:=NS_4/c_scale*GT*synRate*0.279104;
+rate_matrix_4[55][59]:=NS_4/c_scale*GT*synRate*0.306866;
+rate_matrix_4[56][11]:=NS_4/c_scale*AT*synRate*0.340299;
+rate_matrix_4[56][27]:=NS_4/c_scale*CT*synRate*0.223284;
+rate_matrix_4[56][43]:=NS_4/c_scale*GT*synRate*0.264776;
+rate_matrix_4[56][49]:=NS_4/c_scale*synRate*0.305075;
+rate_matrix_4[56][53]:=NS_4/c_scale*CG*synRate*0.166866;
+rate_matrix_4[56][54]:=S_4/c_scale*CT*synRate*0.250149;
+rate_matrix_4[56][55]:=NS_4/c_scale*GT*synRate*0.260597;
+rate_matrix_4[56][60]:=NS_4/c_scale*GT*synRate*0.306866;
+rate_matrix_4[57][12]:=NS_4/c_scale*AT*synRate*0.340299;
+rate_matrix_4[57][28]:=S_4/c_scale*CT*synRate*0.223284;
+rate_matrix_4[57][44]:=NS_4/c_scale*GT*synRate*0.264776;
+rate_matrix_4[57][50]:=NS_4/c_scale*CT*synRate*0.166866;
+rate_matrix_4[57][58]:=NS_4/c_scale*AC*synRate*0.250149;
+rate_matrix_4[57][59]:=S_4/c_scale*synRate*0.260597;
+rate_matrix_4[57][60]:=NS_4/c_scale*AT*synRate*0.279104;
+rate_matrix_4[58][13]:=NS_4/c_scale*AT*synRate*0.340299;
+rate_matrix_4[58][29]:=NS_4/c_scale*CT*synRate*0.223284;
+rate_matrix_4[58][45]:=NS_4/c_scale*GT*synRate*0.264776;
+rate_matrix_4[58][48]:=NS_4/c_scale*AT*synRate*0.305075;
+rate_matrix_4[58][51]:=NS_4/c_scale*CT*synRate*0.166866;
+rate_matrix_4[58][54]:=NS_4/c_scale*GT*synRate*0.221194;
+rate_matrix_4[58][57]:=NS_4/c_scale*AC*synRate*0.210149;
+rate_matrix_4[58][59]:=NS_4/c_scale*CG*synRate*0.260597;
+rate_matrix_4[58][60]:=S_4/c_scale*CT*synRate*0.279104;
+rate_matrix_4[59][14]:=NS_4/c_scale*AT*synRate*0.340299;
+rate_matrix_4[59][30]:=S_4/c_scale*CT*synRate*0.223284;
+rate_matrix_4[59][46]:=NS_4/c_scale*GT*synRate*0.264776;
+rate_matrix_4[59][52]:=NS_4/c_scale*CT*synRate*0.166866;
+rate_matrix_4[59][55]:=NS_4/c_scale*GT*synRate*0.221194;
+rate_matrix_4[59][57]:=S_4/c_scale*synRate*0.210149;
+rate_matrix_4[59][58]:=NS_4/c_scale*CG*synRate*0.250149;
+rate_matrix_4[59][60]:=NS_4/c_scale*GT*synRate*0.279104;
+rate_matrix_4[60][15]:=NS_4/c_scale*AT*synRate*0.340299;
+rate_matrix_4[60][31]:=NS_4/c_scale*CT*synRate*0.223284;
+rate_matrix_4[60][47]:=NS_4/c_scale*GT*synRate*0.264776;
+rate_matrix_4[60][49]:=NS_4/c_scale*AT*synRate*0.305075;
+rate_matrix_4[60][53]:=NS_4/c_scale*CT*synRate*0.166866;
+rate_matrix_4[60][56]:=NS_4/c_scale*GT*synRate*0.221194;
+rate_matrix_4[60][57]:=NS_4/c_scale*AT*synRate*0.210149;
+rate_matrix_4[60][58]:=S_4/c_scale*CT*synRate*0.250149;
+rate_matrix_4[60][59]:=NS_4/c_scale*GT*synRate*0.260597;
+
+
+Model MG94model_4=(rate_matrix_4,vectorOfFrequencies,0);
+
+UseModel (MG94model_0);
+Tree tree_1_0=((FULGENS,(((KAMTSCHATKANA,(RUFESCENS,(SORENSENI,WALALLENSIS)NODE9)NODE7)NODE5,(SIEBOLDII,(DISCUS_HANNAI,GIGANTEA)NODE14)NODE12)NODE4,(CORRUGATA,CRACHERODII)NODE17)NODE3)NODE1,IRIS,((PUSTULATA,(COCCINEA,TUBERCULATA)NODE24)NODE22,(AUSTRALIS,((MIDAE,((ROEI,(SCALARIS,LAEVIGATA)NODE35)NODE33,(CYCLOBATES,(RUBRA,CONICOPORA)NODE40)NODE38)NODE32)NODE30,((OVINA,VARIA)NODE44,DIVERSICOLOR)NODE43)NODE29)NODE27)NODE21);
+
+UseModel (MG94model_1);
+Tree tree_1_1=((FULGENS,(((KAMTSCHATKANA,(RUFESCENS,(SORENSENI,WALALLENSIS)NODE9)NODE7)NODE5,(SIEBOLDII,(DISCUS_HANNAI,GIGANTEA)NODE14)NODE12)NODE4,(CORRUGATA,CRACHERODII)NODE17)NODE3)NODE1,IRIS,((PUSTULATA,(COCCINEA,TUBERCULATA)NODE24)NODE22,(AUSTRALIS,((MIDAE,((ROEI,(SCALARIS,LAEVIGATA)NODE35)NODE33,(CYCLOBATES,(RUBRA,CONICOPORA)NODE40)NODE38)NODE32)NODE30,((OVINA,VARIA)NODE44,DIVERSICOLOR)NODE43)NODE29)NODE27)NODE21);
+
+UseModel (MG94model_2);
+Tree tree_1_2=((FULGENS,(((KAMTSCHATKANA,(RUFESCENS,(SORENSENI,WALALLENSIS)NODE9)NODE7)NODE5,(SIEBOLDII,(DISCUS_HANNAI,GIGANTEA)NODE14)NODE12)NODE4,(CORRUGATA,CRACHERODII)NODE17)NODE3)NODE1,IRIS,((PUSTULATA,(COCCINEA,TUBERCULATA)NODE24)NODE22,(AUSTRALIS,((MIDAE,((ROEI,(SCALARIS,LAEVIGATA)NODE35)NODE33,(CYCLOBATES,(RUBRA,CONICOPORA)NODE40)NODE38)NODE32)NODE30,((OVINA,VARIA)NODE44,DIVERSICOLOR)NODE43)NODE29)NODE27)NODE21);
+
+UseModel (MG94model_3);
+Tree tree_1_3=((FULGENS,(((KAMTSCHATKANA,(RUFESCENS,(SORENSENI,WALALLENSIS)NODE9)NODE7)NODE5,(SIEBOLDII,(DISCUS_HANNAI,GIGANTEA)NODE14)NODE12)NODE4,(CORRUGATA,CRACHERODII)NODE17)NODE3)NODE1,IRIS,((PUSTULATA,(COCCINEA,TUBERCULATA)NODE24)NODE22,(AUSTRALIS,((MIDAE,((ROEI,(SCALARIS,LAEVIGATA)NODE35)NODE33,(CYCLOBATES,(RUBRA,CONICOPORA)NODE40)NODE38)NODE32)NODE30,((OVINA,VARIA)NODE44,DIVERSICOLOR)NODE43)NODE29)NODE27)NODE21);
+
+UseModel (MG94model_4);
+Tree tree_1_4=((FULGENS,(((KAMTSCHATKANA,(RUFESCENS,(SORENSENI,WALALLENSIS)NODE9)NODE7)NODE5,(SIEBOLDII,(DISCUS_HANNAI,GIGANTEA)NODE14)NODE12)NODE4,(CORRUGATA,CRACHERODII)NODE17)NODE3)NODE1,IRIS,((PUSTULATA,(COCCINEA,TUBERCULATA)NODE24)NODE22,(AUSTRALIS,((MIDAE,((ROEI,(SCALARIS,LAEVIGATA)NODE35)NODE33,(CYCLOBATES,(RUBRA,CONICOPORA)NODE40)NODE38)NODE32)NODE30,((OVINA,VARIA)NODE44,DIVERSICOLOR)NODE43)NODE29)NODE27)NODE21);
+
+tree_1_0.GIGANTEA.synRate:=0/codonFactor;
+tree_1_2.COCCINEA.synRate:=tree_1_0.COCCINEA.synRate;
+tree_1_3.NODE30.synRate:=tree_1_0.NODE30.synRate;
+tree_1_3.NODE32.synRate:=tree_1_0.NODE32.synRate;
+tree_1_3.NODE38.synRate:=tree_1_0.NODE38.synRate;
+tree_1_2.NODE4.synRate:=tree_1_0.NODE4.synRate;
+tree_1_1.SORENSENI.synRate:=tree_1_0.SORENSENI.synRate;
+tree_1_3.NODE40.synRate:=tree_1_0.NODE40.synRate;
+tree_1_0.CORRUGATA.synRate:=0.0782842/codonFactor;
+tree_1_0.KAMTSCHATKANA.synRate:=0.122733/codonFactor;
+tree_1_3.CONICOPORA.synRate:=tree_1_0.CONICOPORA.synRate;
+tree_1_2.NODE1.synRate:=tree_1_0.NODE1.synRate;
+tree_1_3.RUBRA.synRate:=tree_1_0.RUBRA.synRate;
+tree_1_3.CYCLOBATES.synRate:=tree_1_0.CYCLOBATES.synRate;
+tree_1_1.DISCUS_HANNAI.synRate:=tree_1_0.DISCUS_HANNAI.synRate;
+tree_1_3.NODE33.synRate:=tree_1_0.NODE33.synRate;
+tree_1_3.NODE35.synRate:=tree_1_0.NODE35.synRate;
+tree_1_0.IRIS.synRate:=0.45025/codonFactor;
+tree_1_3.LAEVIGATA.synRate:=tree_1_0.LAEVIGATA.synRate;
+tree_1_1.NODE17.synRate:=tree_1_0.NODE17.synRate;
+tree_1_3.SCALARIS.synRate:=tree_1_0.SCALARIS.synRate;
+tree_1_0.NODE5.synRate:=0.107292/codonFactor;
+tree_1_3.ROEI.synRate:=tree_1_0.ROEI.synRate;
+tree_1_1.PUSTULATA.synRate:=tree_1_0.PUSTULATA.synRate;
+tree_1_3.MIDAE.synRate:=tree_1_0.MIDAE.synRate;
+tree_1_2.WALALLENSIS.synRate:=tree_1_0.WALALLENSIS.synRate;
+tree_1_2.SIEBOLDII.synRate:=tree_1_0.SIEBOLDII.synRate;
+tree_1_3.AUSTRALIS.synRate:=tree_1_0.AUSTRALIS.synRate;
+tree_1_3.NODE22.synRate:=tree_1_0.NODE22.synRate;
+tree_1_2.NODE21.synRate:=tree_1_0.NODE21.synRate;
+tree_1_2.TUBERCULATA.synRate:=tree_1_0.TUBERCULATA.synRate;
+tree_1_2.NODE9.synRate:=tree_1_0.NODE9.synRate;
+tree_1_1.NODE7.synRate:=tree_1_0.NODE7.synRate;
+tree_1_2.NODE27.synRate:=tree_1_0.NODE27.synRate;
+tree_1_2.RUFESCENS.synRate:=tree_1_0.RUFESCENS.synRate;
+tree_1_1.CRACHERODII.synRate:=tree_1_0.CRACHERODII.synRate;
+tree_1_2.NODE29.synRate:=tree_1_0.NODE29.synRate;
+tree_1_2.NODE43.synRate:=tree_1_0.NODE43.synRate;
+tree_1_1.NODE3.synRate:=tree_1_0.NODE3.synRate;
+tree_1_2.DIVERSICOLOR.synRate:=tree_1_0.DIVERSICOLOR.synRate;
+tree_1_0.NODE14.synRate:=0.0908203/codonFactor;
+tree_1_2.NODE44.synRate:=tree_1_0.NODE44.synRate;
+tree_1_1.NODE24.synRate:=tree_1_0.NODE24.synRate;
+tree_1_2.VARIA.synRate:=tree_1_0.VARIA.synRate;
+tree_1_2.OVINA.synRate:=tree_1_0.OVINA.synRate;
+tree_1_1.FULGENS.synRate:=tree_1_0.FULGENS.synRate;
+tree_1_2.NODE30.synRate:=tree_1_0.NODE30.synRate;
+tree_1_0.NODE12.synRate:=0.0682704/codonFactor;
+tree_1_1.COCCINEA.synRate:=tree_1_0.COCCINEA.synRate;
+tree_1_2.NODE32.synRate:=tree_1_0.NODE32.synRate;
+tree_1_2.NODE38.synRate:=tree_1_0.NODE38.synRate;
+tree_1_1.NODE4.synRate:=tree_1_0.NODE4.synRate;
+tree_1_2.NODE40.synRate:=tree_1_0.NODE40.synRate;
+tree_1_2.CONICOPORA.synRate:=tree_1_0.CONICOPORA.synRate;
+tree_1_1.NODE1.synRate:=tree_1_0.NODE1.synRate;
+tree_1_0.SORENSENI.synRate:=0.0195577/codonFactor;
+tree_1_1.NODE14.synRate:=tree_1_0.NODE14.synRate;
+tree_1_2.RUBRA.synRate:=tree_1_0.RUBRA.synRate;
+tree_1_1.KAMTSCHATKANA.synRate:=tree_1_0.KAMTSCHATKANA.synRate;
+tree_1_2.CYCLOBATES.synRate:=tree_1_0.CYCLOBATES.synRate;
+tree_1_0.DISCUS_HANNAI.synRate:=0.0102967/codonFactor;
+tree_1_2.NODE33.synRate:=tree_1_0.NODE33.synRate;
+tree_1_2.NODE35.synRate:=tree_1_0.NODE35.synRate;
+tree_1_2.LAEVIGATA.synRate:=tree_1_0.LAEVIGATA.synRate;
+tree_1_0.NODE17.synRate:=0.0366778/codonFactor;
+tree_1_2.SCALARIS.synRate:=tree_1_0.SCALARIS.synRate;
+tree_1_1.WALALLENSIS.synRate:=tree_1_0.WALALLENSIS.synRate;
+tree_1_2.ROEI.synRate:=tree_1_0.ROEI.synRate;
+tree_1_1.SIEBOLDII.synRate:=tree_1_0.SIEBOLDII.synRate;
+tree_1_0.PUSTULATA.synRate:=0.154803/codonFactor;
+tree_1_2.MIDAE.synRate:=tree_1_0.MIDAE.synRate;
+tree_1_2.AUSTRALIS.synRate:=tree_1_0.AUSTRALIS.synRate;
+tree_1_2.NODE22.synRate:=tree_1_0.NODE22.synRate;
+tree_1_1.TUBERCULATA.synRate:=tree_1_0.TUBERCULATA.synRate;
+tree_1_1.NODE9.synRate:=tree_1_0.NODE9.synRate;
+tree_1_1.NODE21.synRate:=tree_1_0.NODE21.synRate;
+tree_1_1.NODE5.synRate:=tree_1_0.NODE5.synRate;
+tree_1_1.RUFESCENS.synRate:=tree_1_0.RUFESCENS.synRate;
+tree_1_0.CRACHERODII.synRate:=0.192895/codonFactor;
+tree_1_1.NODE27.synRate:=tree_1_0.NODE27.synRate;
+tree_1_0.NODE7.synRate:=0.0153686/codonFactor;
+tree_1_1.IRIS.synRate:=tree_1_0.IRIS.synRate;
+tree_1_0.NODE3.synRate:=0.119326/codonFactor;
+tree_1_1.NODE29.synRate:=tree_1_0.NODE29.synRate;
+tree_1_1.NODE43.synRate:=tree_1_0.NODE43.synRate;
+tree_1_1.CORRUGATA.synRate:=tree_1_0.CORRUGATA.synRate;
+tree_1_1.DIVERSICOLOR.synRate:=tree_1_0.DIVERSICOLOR.synRate;
+tree_1_1.NODE44.synRate:=tree_1_0.NODE44.synRate;
+tree_1_0.NODE24.synRate:=0.235419/codonFactor;
+tree_1_2.NODE3.synRate:=tree_1_0.NODE3.synRate;
+tree_1_1.GIGANTEA.synRate:=tree_1_0.GIGANTEA.synRate;
+tree_1_1.VARIA.synRate:=tree_1_0.VARIA.synRate;
+tree_1_1.OVINA.synRate:=tree_1_0.OVINA.synRate;
+tree_1_0.FULGENS.synRate:=0.235828/codonFactor;
+tree_1_1.NODE30.synRate:=tree_1_0.NODE30.synRate;
+tree_1_2.NODE24.synRate:=tree_1_0.NODE24.synRate;
+tree_1_1.NODE32.synRate:=tree_1_0.NODE32.synRate;
+tree_1_1.NODE12.synRate:=tree_1_0.NODE12.synRate;
+tree_1_0.COCCINEA.synRate:=0.0444038/codonFactor;
+tree_1_1.NODE38.synRate:=tree_1_0.NODE38.synRate;
+tree_1_2.FULGENS.synRate:=tree_1_0.FULGENS.synRate;
+tree_1_2.CRACHERODII.synRate:=tree_1_0.CRACHERODII.synRate;
+tree_1_1.NODE40.synRate:=tree_1_0.NODE40.synRate;
+tree_1_1.CONICOPORA.synRate:=tree_1_0.CONICOPORA.synRate;
+tree_1_1.RUBRA.synRate:=tree_1_0.RUBRA.synRate;
+tree_1_0.NODE4.synRate:=0.0429988/codonFactor;
+tree_1_1.CYCLOBATES.synRate:=tree_1_0.CYCLOBATES.synRate;
+tree_1_2.NODE5.synRate:=tree_1_0.NODE5.synRate;
+tree_1_0.NODE1.synRate:=0.371054/codonFactor;
+tree_1_1.NODE33.synRate:=tree_1_0.NODE33.synRate;
+tree_1_1.NODE35.synRate:=tree_1_0.NODE35.synRate;
+tree_1_1.LAEVIGATA.synRate:=tree_1_0.LAEVIGATA.synRate;
+tree_1_2.CORRUGATA.synRate:=tree_1_0.CORRUGATA.synRate;
+tree_1_1.SCALARIS.synRate:=tree_1_0.SCALARIS.synRate;
+tree_1_1.ROEI.synRate:=tree_1_0.ROEI.synRate;
+tree_1_2.NODE14.synRate:=tree_1_0.NODE14.synRate;
+tree_1_2.NODE12.synRate:=tree_1_0.NODE12.synRate;
+tree_1_1.MIDAE.synRate:=tree_1_0.MIDAE.synRate;
+tree_1_2.GIGANTEA.synRate:=tree_1_0.GIGANTEA.synRate;
+tree_1_1.AUSTRALIS.synRate:=tree_1_0.AUSTRALIS.synRate;
+tree_1_0.WALALLENSIS.synRate:=0.0865036/codonFactor;
+tree_1_1.NODE22.synRate:=tree_1_0.NODE22.synRate;
+tree_1_2.KAMTSCHATKANA.synRate:=tree_1_0.KAMTSCHATKANA.synRate;
+tree_1_0.SIEBOLDII.synRate:=0.0158806/codonFactor;
+tree_1_2.IRIS.synRate:=tree_1_0.IRIS.synRate;
+tree_1_0.NODE21.synRate:=0.0995652/codonFactor;
+tree_1_0.NODE27.synRate:=0.0411943/codonFactor;
+tree_1_2.NODE7.synRate:=tree_1_0.NODE7.synRate;
+tree_1_0.TUBERCULATA.synRate:=0.0179456/codonFactor;
+tree_1_0.NODE29.synRate:=0.0257492/codonFactor;
+tree_1_0.NODE43.synRate:=0.0863398/codonFactor;
+tree_1_0.NODE9.synRate:=0.0174759/codonFactor;
+tree_1_2.PUSTULATA.synRate:=tree_1_0.PUSTULATA.synRate;
+tree_1_0.RUFESCENS.synRate:=0.0627486/codonFactor;
+tree_1_3.NODE21.synRate:=tree_1_0.NODE21.synRate;
+tree_1_2.NODE17.synRate:=tree_1_0.NODE17.synRate;
+tree_1_3.NODE27.synRate:=tree_1_0.NODE27.synRate;
+tree_1_0.DIVERSICOLOR.synRate:=0.252516/codonFactor;
+tree_1_2.DISCUS_HANNAI.synRate:=tree_1_0.DISCUS_HANNAI.synRate;
+tree_1_0.NODE44.synRate:=0.103799/codonFactor;
+tree_1_3.OVINA.synRate:=tree_1_0.OVINA.synRate;
+tree_1_2.SORENSENI.synRate:=tree_1_0.SORENSENI.synRate;
+tree_1_0.VARIA.synRate:=0.236554/codonFactor;
+tree_1_3.NODE44.synRate:=tree_1_0.NODE44.synRate;
+tree_1_3.NODE43.synRate:=tree_1_0.NODE43.synRate;
+tree_1_0.OVINA.synRate:=0.11803/codonFactor;
+tree_1_3.NODE29.synRate:=tree_1_0.NODE29.synRate;
+tree_1_0.NODE30.synRate:=0.0696769/codonFactor;
+tree_1_3.DIVERSICOLOR.synRate:=tree_1_0.DIVERSICOLOR.synRate;
+tree_1_3.VARIA.synRate:=tree_1_0.VARIA.synRate;
+tree_1_3.DISCUS_HANNAI.synRate:=tree_1_0.DISCUS_HANNAI.synRate;
+tree_1_0.NODE32.synRate:=0.0493371/codonFactor;
+tree_1_3.NODE7.synRate:=tree_1_0.NODE7.synRate;
+tree_1_3.KAMTSCHATKANA.synRate:=tree_1_0.KAMTSCHATKANA.synRate;
+tree_1_0.NODE38.synRate:=0.103847/codonFactor;
+tree_1_3.IRIS.synRate:=tree_1_0.IRIS.synRate;
+tree_1_0.NODE40.synRate:=0.0687337/codonFactor;
+tree_1_0.CONICOPORA.synRate:=0.0024627/codonFactor;
+tree_1_3.NODE5.synRate:=tree_1_0.NODE5.synRate;
+tree_1_0.RUBRA.synRate:=0.0079888/codonFactor;
+tree_1_3.NODE14.synRate:=tree_1_0.NODE14.synRate;
+tree_1_3.GIGANTEA.synRate:=tree_1_0.GIGANTEA.synRate;
+tree_1_0.CYCLOBATES.synRate:=0.271919/codonFactor;
+tree_1_3.NODE17.synRate:=tree_1_0.NODE17.synRate;
+tree_1_0.NODE33.synRate:=0.0169797/codonFactor;
+tree_1_3.NODE12.synRate:=tree_1_0.NODE12.synRate;
+tree_1_0.NODE35.synRate:=0.0894217/codonFactor;
+tree_1_0.LAEVIGATA.synRate:=0.0720711/codonFactor;
+tree_1_3.SORENSENI.synRate:=tree_1_0.SORENSENI.synRate;
+tree_1_0.SCALARIS.synRate:=0.0984683/codonFactor;
+tree_1_3.PUSTULATA.synRate:=tree_1_0.PUSTULATA.synRate;
+tree_1_3.CORRUGATA.synRate:=tree_1_0.CORRUGATA.synRate;
+tree_1_0.ROEI.synRate:=0.0626071/codonFactor;
+tree_1_0.MIDAE.synRate:=0.300024/codonFactor;
+tree_1_3.RUFESCENS.synRate:=tree_1_0.RUFESCENS.synRate;
+tree_1_3.NODE9.synRate:=tree_1_0.NODE9.synRate;
+tree_1_0.AUSTRALIS.synRate:=0.203935/codonFactor;
+tree_1_3.TUBERCULATA.synRate:=tree_1_0.TUBERCULATA.synRate;
+tree_1_0.NODE22.synRate:=0.159581/codonFactor;
+tree_1_3.SIEBOLDII.synRate:=tree_1_0.SIEBOLDII.synRate;
+tree_1_3.WALALLENSIS.synRate:=tree_1_0.WALALLENSIS.synRate;
+tree_1_3.NODE1.synRate:=tree_1_0.NODE1.synRate;
+tree_1_3.NODE4.synRate:=tree_1_0.NODE4.synRate;
+tree_1_3.COCCINEA.synRate:=tree_1_0.COCCINEA.synRate;
+tree_1_3.FULGENS.synRate:=tree_1_0.FULGENS.synRate;
+tree_1_3.NODE24.synRate:=tree_1_0.NODE24.synRate;
+tree_1_3.NODE3.synRate:=tree_1_0.NODE3.synRate;
+tree_1_3.CRACHERODII.synRate:=tree_1_0.CRACHERODII.synRate;
+tree_1_4.FULGENS.synRate:=tree_1_0.FULGENS.synRate;
+tree_1_4.KAMTSCHATKANA.synRate:=tree_1_0.KAMTSCHATKANA.synRate;
+tree_1_4.RUFESCENS.synRate:=tree_1_0.RUFESCENS.synRate;
+tree_1_4.SORENSENI.synRate:=tree_1_0.SORENSENI.synRate;
+tree_1_4.WALALLENSIS.synRate:=tree_1_0.WALALLENSIS.synRate;
+tree_1_4.NODE9.synRate:=tree_1_0.NODE9.synRate;
+tree_1_4.NODE7.synRate:=tree_1_0.NODE7.synRate;
+tree_1_4.NODE5.synRate:=tree_1_0.NODE5.synRate;
+tree_1_4.SIEBOLDII.synRate:=tree_1_0.SIEBOLDII.synRate;
+tree_1_4.DISCUS_HANNAI.synRate:=tree_1_0.DISCUS_HANNAI.synRate;
+tree_1_4.GIGANTEA.synRate:=tree_1_0.GIGANTEA.synRate;
+tree_1_4.NODE14.synRate:=tree_1_0.NODE14.synRate;
+tree_1_4.NODE12.synRate:=tree_1_0.NODE12.synRate;
+tree_1_4.NODE4.synRate:=tree_1_0.NODE4.synRate;
+tree_1_4.CORRUGATA.synRate:=tree_1_0.CORRUGATA.synRate;
+tree_1_4.CRACHERODII.synRate:=tree_1_0.CRACHERODII.synRate;
+tree_1_4.NODE17.synRate:=tree_1_0.NODE17.synRate;
+tree_1_4.NODE3.synRate:=tree_1_0.NODE3.synRate;
+tree_1_4.NODE1.synRate:=tree_1_0.NODE1.synRate;
+tree_1_4.IRIS.synRate:=tree_1_0.IRIS.synRate;
+tree_1_4.PUSTULATA.synRate:=tree_1_0.PUSTULATA.synRate;
+tree_1_4.COCCINEA.synRate:=tree_1_0.COCCINEA.synRate;
+tree_1_4.TUBERCULATA.synRate:=tree_1_0.TUBERCULATA.synRate;
+tree_1_4.NODE24.synRate:=tree_1_0.NODE24.synRate;
+tree_1_4.NODE22.synRate:=tree_1_0.NODE22.synRate;
+tree_1_4.AUSTRALIS.synRate:=tree_1_0.AUSTRALIS.synRate;
+tree_1_4.MIDAE.synRate:=tree_1_0.MIDAE.synRate;
+tree_1_4.ROEI.synRate:=tree_1_0.ROEI.synRate;
+tree_1_4.SCALARIS.synRate:=tree_1_0.SCALARIS.synRate;
+tree_1_4.LAEVIGATA.synRate:=tree_1_0.LAEVIGATA.synRate;
+tree_1_4.NODE35.synRate:=tree_1_0.NODE35.synRate;
+tree_1_4.NODE33.synRate:=tree_1_0.NODE33.synRate;
+tree_1_4.CYCLOBATES.synRate:=tree_1_0.CYCLOBATES.synRate;
+tree_1_4.RUBRA.synRate:=tree_1_0.RUBRA.synRate;
+tree_1_4.CONICOPORA.synRate:=tree_1_0.CONICOPORA.synRate;
+tree_1_4.NODE40.synRate:=tree_1_0.NODE40.synRate;
+tree_1_4.NODE38.synRate:=tree_1_0.NODE38.synRate;
+tree_1_4.NODE32.synRate:=tree_1_0.NODE32.synRate;
+tree_1_4.NODE30.synRate:=tree_1_0.NODE30.synRate;
+tree_1_4.OVINA.synRate:=tree_1_0.OVINA.synRate;
+tree_1_4.VARIA.synRate:=tree_1_0.VARIA.synRate;
+tree_1_4.NODE44.synRate:=tree_1_0.NODE44.synRate;
+tree_1_4.DIVERSICOLOR.synRate:=tree_1_0.DIVERSICOLOR.synRate;
+tree_1_4.NODE43.synRate:=tree_1_0.NODE43.synRate;
+tree_1_4.NODE29.synRate:=tree_1_0.NODE29.synRate;
+tree_1_4.NODE27.synRate:=tree_1_0.NODE27.synRate;
+tree_1_4.NODE21.synRate:=tree_1_0.NODE21.synRate;
+DataSet ds_1 = ReadDataFile(USE_NEXUS_FILE_DATA);
+DataSetFilter filteredData_1 = CreateFilter(ds_1,3,"0-401","9,3,0-2,4-8,24,16,23,22,21,17,10-15,18,20,19","TAA,TAG,TGA");
+
+AUTO_PARALLELIZE_OPTIMIZE = 2;
+
+USE_ADAPTIVE_VARIABLE_STEP	= 0;
+VERBOSITY_LEVEL			    = 10;
+
+
+LikelihoodFunction lf = (filteredData_1,tree_1_0,filteredData_1,tree_1_1,filteredData_1,tree_1_2,filteredData_1,tree_1_3,filteredData_1,tree_1_4,"Log(P_1*SITE_LIKELIHOOD[0]+(1-P_1)*P_2*SITE_LIKELIHOOD[1]+(1-P_1)*(1-P_2)*P_3*SITE_LIKELIHOOD[2]+(1-P_1)*(1-P_2)*(1-P_3)*P_4*SITE_LIKELIHOOD[3]+(1-P_1)*(1-P_2)*(1-P_3)*(1-P_4)*SITE_LIKELIHOOD[4])");
+Optimize (res, lf);
+
+/* test epilogue */
+	timeMatrix = endTestTimer 				  (_testDescription);
+	if (logTestResult (Abs (res[1][0] - _expectedLL) < 0.01))
+	{
+		return timeMatrix;
+	}
+	return 0;
+/* end test epilogue */
+
+END;
\ No newline at end of file
diff --git a/tests/hbltests/REL/MultiplePartitions.bf b/tests/hbltests/REL/MultiplePartitions.bf
new file mode 100644
index 0000000..07a2549
--- /dev/null
+++ b/tests/hbltests/REL/MultiplePartitions.bf
@@ -0,0 +1,221 @@
+#NEXUS
+
+BEGIN TAXA;
+	DIMENSIONS NTAX = 9;
+	TAXLABELS
+		'RecombStrain' 'D_CD_83_ELI_ACC_K03454' 'D_CD_83_NDK_ACC_M27323' 'D_UG_94_94UG114_ACC_U88824' 'D_CD_84_84ZR085_ACC_U88822' 'B_US_83_RF_ACC_M17451' 'B_FR_83_HXB2_ACC_K03455' 'B_US_86_JRFL_ACC_U63632' 'B_US_90_WEAU160_ACC_U21135' ;
+END;
+
+BEGIN CHARACTERS;
+	DIMENSIONS NCHAR = 2400;
+	FORMAT
+		DATATYPE = DNA
+		GAP=-
+		MISSING=?
+	;
+
+MATRIX
+	'RecombStrain'                ACTGCAAACTTACATGAAAAATAAAACGGCGCGATTGGTAGAGAAATTAGAAGACTATATCATTGGACTAAAAAATGAAAAATAGACACTGCACCTCAGTAAAGCAGAGCAGTGACGGTATGTAAAGATCAAAGAAGGGTGTAGGTTATACCTCGAGAAAAAAAAGAACTTCTTGAGGAACCATAAGAGAAGATAACCGTGCAAGTATGATATAACCAAAAATTTGAATTGGAAGGACTGTTTAGAGCGATTAAAAAAAAGACCCACAACCTTGGTTTACTACGGTACATAAAAGCTAACAAATTGCAAAATACGCCCACGTATTTAAGGAAAACATTAAGAAGAAACCAGTAAGAGGAGCTTAGTAAAATCTATATAGAAAAGAAGCATCAAAGATCTACGGTGTAACACATTATACATAGGCAGGCGTCCAAGTTAAGGCCGGGTAATTACCAAAGTGA [...]
+	'D_CD_83_ELI_ACC_K03454'      AATGCAAACTTACATGAAAAATAAAACGGCGCGATTGGTAGAGAAATTAGAAGACTATATCATTGGACTAAAAAATGAAAAATAGACACTGCACCTCAGTAAAGCAGAGCAGTGACGGTATGTAAAGATCAAAGAAGGGTGTAGGTTATACCTCGAAAAAAAAAAGAACTTCTTGAGGAACCATAAGAGAAGATAACCGTACAAGTATGATATAACCAAAAATTTGAATTGGAAGGACTGTTTAGAGCGATTGGAAAAAAAACCCGCAACCTTGGTTTACTACGGTACATAAAAGATAACAAATTGCAAAATACGCCCACGTATTTAAGGAAAACATTAAGAAGAAATCAGTAAGAGGGGCTTAGTAAAATCTATATAGAAAAGAAGCATCAAAGATCTACGGTGTAACACATTATACATAGGCATGTGTCCAAGTTAAGGCCGGGTAATTACCAAAGTGA [...]
+	'D_CD_83_NDK_ACC_M27323'      ACTGCAAACTTACATGAAAAATAAAACGGCGCGATTGGTAGAGAAATTAGAAGACTATATCATTGGACTAAAAAATGAAAAATAGACACTGCACCTCAGTAAAGCAGAGCAGTGACGGTATGTAAAGATCAAAGAAGGGTGTAGGTTATACCTCGAGAAAAAAAAGAACTTCTTGAGGAACCATAAGAGAAGATAACCGTGCAAGTATGATATAACCAAAAATTTGAATTGGAAGGACTGTTTAGAGCGATTAGAAAAAAGACCCGCAACCTTGGTTTACTACGGTACATAAAAGCTAACAAATTGCAAAATACGCCCACGTATTTAAGGAAAACATTAAGAAGAAACCAGTAAGAGGGGCTTAGTAAAATCTATATAGAAAAGAAGCATCAAAGATCTACGGTGTAACACATTATACATAGGCATGCGTCCAAGTTAAGGCCGGGTAATTACCAAAGTGA [...]
+	'D_UG_94_94UG114_ACC_U88824'  ACTGCAAACTTACATGAAGAATGAAACGGCGCGATTGGTAGAGAAATTAGAAGACTATATCATTGGACTAAAAAATGAAAAATAGACACTGCACCTCAGTAAAGCAGAGCAGTGACGGTATGTAAAGATCAAAGAAGGGTGTAAGTTATACCTCGAGAAAAAAAAGTACTTCTTGAGGAACCATAAGAGAAAATAATCGTGCAAGTATGATATGAACAAAAATTTGAATTGAAAGGACTGTATAGAGCGATTAAAAAAAAGACCCGCAACCTTGGTTTACTACGGTACATAAAAGCTAACAAATTGCAAAATACGCCCACGTATTTAAGGAAAACATTAAGAAGAAACCAGTAAGAGGGGCTTAGTAAAATCTATATAGAAAAGAAGCATCAAAGATCTACGGTGTAACACATTATACACAGGCAGGCGTCCAAGTTAAGACCGGGTAATTACCAAAGTGA [...]
+	'D_CD_84_84ZR085_ACC_U88822'  ACTGCAAACTTACATGAAAAATAAAACGGCGCGATTGGTAGAGAAATTAGAAGACTATATCATTGGACTAAAAAATGAAAAATAGACACTGCACCTCAGTAAAGCAGAGCAGTGACGGTATGTAAAGATCAAAGAAGGGTGTAGGTTATACCTCGAGAAAAAAAAGAACTTCTTGAGGAACCATAAGAGAAAATAACCGTGCAAGTATGATATAACCAAAAATTTGAATTGGAAGGACTGTATAGAGCGATTAAAAAAAAGACCCGCAACCTTGGTTTACTACGGTACATAAAAGCTAACAAATTGCAAAATACGCCAACGTATTTAAGGAAAACATTAAGAAGAAATCAGTAAGAGGGGCTTAGTAAAATCTATATAGAAAAGAAGCATCAAAGATCTACGGTGTAACACATTATACATAGGCAGGCGTCCAAGTTAAGGCCGGGTAATTTCCAAAGTGA [...]
+	'B_US_83_RF_ACC_M17451'       ACTGCAAACTTACATGAAAAATAAAACGGCGCGATTGGTAGAGAAATTAGAAGACTATATCATTGGACTAAAAAATGAAAAATAGACACTGCACCTCAGTAAAGCAGAGCAGTGACGGTATGTAAAGATCAAAGAAGGGTGTAGGTTATACCTCGAGAAAAAAAAGACCTTCTTGAGGAACCATAAGATAAAATAACCGTGCAAGTATGATATAACCAAAAATTTGAATTGGAAGGACTGCATAGAGCGATTAAAAAAAAGACCCGCACCCTTGGTTTACTACGGTACCTAAAAGCTAACAAATTGCAAAATACGCCCACGTATTTAAGGAAAATATTAGGAAGAAACCAGTAAGAGGGGCTTAGTAAAATCTATATAGAAAAGAAGAATCAAAGATCTACGGTGTAACACATTATACATAGGCAGGCGTCCAAGTTAAGGCCGGGTAATTACCAAAGTGA [...]
+	'B_FR_83_HXB2_ACC_K03455'     ACTGCAAACTTACATGAAAAATAAAACGGAGCGATTGGTAGAGAAATTAGAAGACTACATCATTGGACTAAAAAATGAAAAATAGACACTGCACCTCAGTAAAGCAGAGCAGTGACGGTATGTAAAGATCAAAGAAGGGTGTAGGTTATACCTCGAGAAAAAAAAGACCTTCTTGAGGAACCATAAGAGAAAATAACCGTGCAAGTATGATATAACCAAAAATTTGAATTGGAAGGACTGTATAGAGCGATTAAAAAAAACACCCGCAACCTTGGTTTACTACGGTACATAAAAGCTAACAAATTGCAAAATACGCCCACCTATTTAAGGAAAACATTAGGAAGAAACCAGTAAGAGGGGCTTAGTAAAATCTATATAGAAAAGAAGCATCAAAGATCTACGGTGTAACACATTATACATAGGCAGGCGTCCAAGTTAAGGCCGGGTAATTACCAAAGTGA [...]
+	'B_US_86_JRFL_ACC_U63632'     ACTGCAAACTTACATGAAAAATAAAACGGCGCGATTGGTAGAGAAATTAGAAGACTATATCATTGGACTAAAAAATGAAAAATAGACACTGCACCTCAGTAAAGCAGAGCAGTGACGGTATGTAAAGATCAAAGAAGGGTGTAGGTTATACCTCGAGAAAAAAAAGACCTTCTTGAGGAACCATAAGAGAAAATAACCGTGCAAGTATGATATAACCAAAAATTTGAATTGGAAGGACTGTATAGAGCGATTAAAAAAAAGACCCGCAACCTTGGTTTACTACGGTACATAAAAGCTAACAAATTGCAAAATACGCCCACCTATTTAAGGAAAACATTAGGAAGAAACCAGTAAGAGGGGCTTAGTAAAATCTATATAGAAAAGAAGCATCAAAGATCTACGGTGTAACACATTATACATAGGCAGGCGTCCAAGTTAAGGCCGGGTAATTACCAAAGTGA [...]
+	'B_US_90_WEAU160_ACC_U21135'  ACTGCAAACTTATATGAAAAATAAAACGGCGCGATTGGTAGAGAAATTAGAAGACTATATCATTGGACTAAAAAATGAAAAATAGACACTGCACCTCAGTAAAGCAGAGCAGTGACGGTATGTAAAGATCAAAGAAGGGTGTAGGTTATACCTCGAGAAAAAAAAGACCTTCTTGAGGAACCATAAGAGAAAATAACCGTGCAAGTATGATATAACCAAAAATTTGAATTGGAAGGACTGTATAGAGCGATTAAAAAAAAGACCCGCAACCTTGGTTTACTACGGTACATAAAAGCTAACAAATTGCAAAATACGCCCACGTATTTAAGGAAAACATTAGGAAGAAACCAGTAAGAGGGGCTTAGTAAAATCTATATAGAAAAGAAGCATCAAAGATCTACGGTGTAACACATTATACATAGGCAGGCGTCCAAGTTAAGGCCGGGTAATTACCAAAGTGA [...]
+END;
+
+BEGIN HYPHY;
+
+/* test preamble */
+
+	_testDescription 		= " fit the HKY+gamma model to an HIV-1 alignment with 9 sequences and 2400 nucleotides with 4 partitions and different rate class counts";
+	_expectedLL 			= -4490.24;
+	ExecuteAFile 			("../Shared/TestInstrumentation.bf");
+	startTestTimer 			(_testDescription);
+
+/* end test preamble */
+
+
+global CT=1.22367;
+global AT=0.284002;
+global CG=0.390749;
+global AC=0.369337;
+global GT=0.142059;
+
+global alpha=0.197532;
+alpha:>0.01;
+alpha:<100;
+
+
+category pc=(3,pc.weights,MEAN,_x_^(betaP-1)*(1-_x_)^(betaQ-1)/Beta(betaP,betaQ),IBeta(_x_,betaP,betaQ),0,1,IBeta(_x_,betaP+1,betaQ)*betaP/(betaP+betaQ));
+category c=(4,EQUAL,MEAN,GammaDist(_x_,alpha,alpha),CGammaDist(_x_,alpha,alpha),0,1e+25,CGammaDist(_x_,alpha+1,alpha));
+category d=(5,EQUAL,MEAN,GammaDist(_x_,alpha,alpha),CGammaDist(_x_,alpha,alpha),0,1e+25,CGammaDist(_x_,alpha+1,alpha));
+category e=(3,EQUAL,MEAN,GammaDist(_x_,alpha,alpha),CGammaDist(_x_,alpha,alpha),0,1e+25,CGammaDist(_x_,alpha+1,alpha));
+
+GTR_Matrix={4,4};
+GTR_Matrix[0][1]:=AC*t*c;
+GTR_Matrix[0][2]:=t*c;
+GTR_Matrix[0][3]:=AT*t*c;
+GTR_Matrix[1][0]:=AC*t*c;
+GTR_Matrix[1][2]:=CG*t*c;
+GTR_Matrix[1][3]:=CT*t*c;
+GTR_Matrix[2][0]:=t*c;
+GTR_Matrix[2][1]:=CG*t*c;
+GTR_Matrix[2][3]:=GT*t*c;
+GTR_Matrix[3][0]:=AT*t*c;
+GTR_Matrix[3][1]:=CT*t*c;
+GTR_Matrix[3][2]:=GT*t*c;
+
+GTR_Matrix2={4,4};
+GTR_Matrix2[0][1]:=AC*t*d;
+GTR_Matrix2[0][2]:=t*d;
+GTR_Matrix2[0][3]:=AT*t*d;
+GTR_Matrix2[1][0]:=AC*t*d;
+GTR_Matrix2[1][2]:=CG*t*d;
+GTR_Matrix2[1][3]:=CT*t*d;
+GTR_Matrix2[2][0]:=t*d;
+GTR_Matrix2[2][1]:=CG*t*d;
+GTR_Matrix2[2][3]:=GT*t*d;
+GTR_Matrix2[3][0]:=AT*t*d;
+GTR_Matrix2[3][1]:=CT*t*d;
+GTR_Matrix2[3][2]:=GT*t*d;
+
+GTR_Matrix3={4,4};
+GTR_Matrix3[0][1]:=AC*t*e;
+GTR_Matrix3[0][2]:=t*e;
+GTR_Matrix3[0][3]:=AT*t*e;
+GTR_Matrix3[1][0]:=AC*t*e;
+GTR_Matrix3[1][2]:=CG*t*e;
+GTR_Matrix3[1][3]:=CT*t*e;
+GTR_Matrix3[2][0]:=t*e;
+GTR_Matrix3[2][1]:=CG*t*e;
+GTR_Matrix3[2][3]:=GT*t*e;
+GTR_Matrix3[3][0]:=AT*t*e;
+GTR_Matrix3[3][1]:=CT*t*e;
+GTR_Matrix3[3][2]:=GT*t*e;
+
+baseFreqs={
+{    0.399398148148}
+{    0.163842592593}
+{    0.223981481481}
+{    0.212777777778}
+}
+;
+Model GTR_Model=(GTR_Matrix,baseFreqs);
+UseModel (GTR_Model);
+Tree tree_0=((((RecombStrain,(D_CD_83_ELI_ACC_K03454,D_CD_83_NDK_ACC_M27323)Node5)Node3,D_CD_84_84ZR085_ACC_U88822)Node2,D_UG_94_94UG114_ACC_U88824)Node1,(B_US_83_RF_ACC_M17451,B_US_90_WEAU160_ACC_U21135)Node10,(B_FR_83_HXB2_ACC_K03455,B_US_86_JRFL_ACC_U63632)Node13);
+
+UseModel (GTR_Model);
+Tree tree_1=((((RecombStrain,(D_CD_83_ELI_ACC_K03454,D_CD_83_NDK_ACC_M27323)Node5)Node3,B_US_86_JRFL_ACC_U63632)Node2,B_US_90_WEAU160_ACC_U21135)Node1,((D_UG_94_94UG114_ACC_U88824,D_CD_84_84ZR085_ACC_U88822)Node11,B_US_83_RF_ACC_M17451)Node10,B_FR_83_HXB2_ACC_K03455);
+
+Model GTR_Model2=(GTR_Matrix2,baseFreqs);
+Tree tree_2=(((((RecombStrain,D_UG_94_94UG114_ACC_U88824)Node4,D_CD_84_84ZR085_ACC_U88822)Node3,B_US_83_RF_ACC_M17451)Node2,B_FR_83_HXB2_ACC_K03455)Node1,((D_CD_83_ELI_ACC_K03454,D_CD_83_NDK_ACC_M27323)Node11,B_US_86_JRFL_ACC_U63632)Node10,B_US_90_WEAU160_ACC_U21135);
+
+Model GTR_Model3=(GTR_Matrix3,baseFreqs);
+Tree tree_3=(RecombStrain,(D_CD_83_ELI_ACC_K03454,(D_UG_94_94UG114_ACC_U88824,(D_CD_84_84ZR085_ACC_U88822,(B_US_83_RF_ACC_M17451,((B_FR_83_HXB2_ACC_K03455,B_US_86_JRFL_ACC_U63632)Node11,B_US_90_WEAU160_ACC_U21135)Node10)Node8)Node6)Node4)Node2,D_CD_83_NDK_ACC_M27323);
+
+tree_2.B_US_83_RF_ACC_M17451.t=0.02755683682993398;
+tree_2.Node1.t=0;
+tree_2.B_US_86_JRFL_ACC_U63632.t=0.01326059287271811;
+tree_2.Node10.t=0.01326143467048369;
+tree_2.B_US_90_WEAU160_ACC_U21135.t=0.01987764324853837;
+tree_2.Node11.t=0.003026459698870693;
+tree_2.B_FR_83_HXB2_ACC_K03455.t=0.02329267821605396;
+tree_2.Node2.t=0.002800333307564091;
+tree_2.Node4.t=0.03500361914558993;
+tree_2.D_UG_94_94UG114_ACC_U88824.t=0.04889981365158647;
+tree_2.RecombStrain.t=0.006715808089228459;
+tree_2.D_CD_84_84ZR085_ACC_U88822.t=0.01332295638171858;
+tree_2.D_CD_83_NDK_ACC_M27323.t=0.01328712408506268;
+tree_2.D_CD_83_ELI_ACC_K03454.t=0.01996826383490629;
+tree_2.Node3.t=0.01383818615750967;
+tree_3.RecombStrain.t=0.009992697906091448;
+tree_3.B_US_86_JRFL_ACC_U63632.t=0.0099749493969674;
+tree_3.Node2.t=0;
+tree_3.Node8.t=0.02636648254239594;
+tree_3.Node6.t=0.004563116148969946;
+tree_3.B_US_90_WEAU160_ACC_U21135.t=0;
+tree_3.B_FR_83_HXB2_ACC_K03455.t=0;
+tree_3.B_US_83_RF_ACC_M17451.t=0.02027530226140629;
+tree_3.D_CD_83_NDK_ACC_M27323.t=0.004993954698447391;
+tree_3.Node4.t=0.005135340264405711;
+tree_3.D_UG_94_94UG114_ACC_U88824.t=0.04793012238098922;
+tree_3.Node11.t=0;
+tree_3.D_CD_84_84ZR085_ACC_U88822.t=0.02087877906855073;
+tree_3.D_CD_83_ELI_ACC_K03454.t=0.01507507532185939;
+tree_3.Node10.t=0.005001849275258297;
+tree_1.B_US_90_WEAU160_ACC_U21135.t=0.02321828136492775;
+tree_0.Node10.t=0;
+tree_0.Node2.t=0;
+tree_0.Node5.t=0.01210808669935977;
+tree_0.B_US_86_JRFL_ACC_U63632.t=0;
+tree_0.B_FR_83_HXB2_ACC_K03455.t=0.01816066369929858;
+tree_0.B_US_83_RF_ACC_M17451.t=0.03742153847361689;
+tree_0.Node1.t=0.01195896810357335;
+tree_0.D_CD_83_NDK_ACC_M27323.t=0;
+tree_1.Node10.t=0.003353456605947262;
+tree_0.D_UG_94_94UG114_ACC_U88824.t=0.05673213356293653;
+tree_0.RecombStrain.t=0.01200894050847036;
+tree_0.D_CD_84_84ZR085_ACC_U88822.t=0.01206640617488343;
+tree_0.D_CD_83_ELI_ACC_K03454.t=0.05053803232401123;
+tree_0.Node3.t=0.01211693401151765;
+tree_0.B_US_90_WEAU160_ACC_U21135.t=0.005897424801452161;
+tree_1.Node11.t=0.01943622215056805;
+tree_1.Node2.t=0.01930639918536271;
+tree_1.Node5.t=0.00367221191230085;
+tree_1.B_US_86_JRFL_ACC_U63632.t=0.003556907631311533;
+tree_1.B_FR_83_HXB2_ACC_K03455.t=0.003761914794499745;
+tree_1.B_US_83_RF_ACC_M17451.t=0.01579657810015503;
+tree_1.Node1.t=0;
+tree_1.D_CD_83_NDK_ACC_M27323.t=0;
+tree_1.D_UG_94_94UG114_ACC_U88824.t=0.05405801345442108;
+tree_1.RecombStrain.t=0.007591494164654542;
+tree_0.Node13.t=0.005916039435863761;
+tree_1.D_CD_84_84ZR085_ACC_U88822.t=0.03313660975482054;
+tree_1.D_CD_83_ELI_ACC_K03454.t=0.01143840296527942;
+tree_1.Node3.t=0.007767398822293749;
+DataSet ds = ReadDataFile(USE_NEXUS_FILE_DATA);
+DataSetFilter part_0 = CreateFilter(ds,1,"0-427","0-2,4,3,5,8,6,7");
+DataSetFilter part_1 = CreateFilter(ds,1,"428-1105","0-2,7,8,3-6");
+DataSetFilter part_2 = CreateFilter(ds,1,"1106-1891","0,3-6,1,2,7,8");
+DataSetFilter part_3 = CreateFilter(ds,1,"1892-2399","0,1,3-8,2");
+
+exepectedRateClassAssignments = 
+{
+{                 0,                 3,                 0,                 0,                 0,                 0,                 0,                 0,                 0,                 0,                 0,                 0,                 3,                 0,                 0,                 0,                 0,                 0,                 3,                 0,                 0,                 0,                 3,                 0,                 0,                 [...]
+};
+expectedConditionalProbabilities = 
+
+{
+{    0.373102612625,  0.00100640393898,    0.198909372471,    0.203294686753,    0.148615761204,    0.373102612625,    0.373102612625,    0.373102612625,    0.148615761204,    0.198909372471,    0.198909372471,    0.373102612625, 0.000189131144695,    0.373102612625,    0.198909372471,    0.203294686753,    0.373102612625,    0.373102612625,  0.00384825332164,    0.373102612625,    0.373102612625,    0.198909372471,  0.00384825332164,    0.373102612625,    0.373102612625,    0.3731026126 [...]
+{    0.370546777204,  0.00109882478718,    0.197557881821,    0.201312536128,    0.147155834141,    0.370546777204,    0.370546777204,    0.370546777204,    0.147155834141,    0.197557881821,    0.197557881821,    0.370546777204,  0.00020627770484,    0.370546777204,    0.197557881821,    0.201312536128,    0.370546777204,    0.370546777204,  0.00420834766579,    0.370546777204,    0.370546777204,    0.197557881821,  0.00420834766579,    0.370546777204,    0.370546777204,    0.3705467772 [...]
+{    0.368694592794,  0.00116519035075,    0.196578076453,    0.199879321967,    0.146100118453,    0.368694592794,    0.368694592794,    0.368694592794,    0.146100118453,    0.196578076453,    0.196578076453,    0.368694592794, 0.000218564871153,    0.368694592794,    0.196578076453,    0.199879321967,    0.368694592794,    0.368694592794,  0.00446771289936,    0.368694592794,    0.368694592794,    0.196578076453,  0.00446771289936,    0.368694592794,    0.368694592794,    0.3686945927 [...]
+{    0.365849961858,  0.00126611153379,    0.195072617524,    0.197683464968,    0.144482471494,    0.365849961858,    0.365849961858,    0.365849961858,    0.144482471494,    0.195072617524,    0.195072617524,    0.365849961858, 0.000237208018652,    0.365849961858,    0.195072617524,    0.197683464968,    0.365849961858,    0.365849961858,  0.00486342980985,    0.365849961858,    0.365849961858,    0.195072617524,  0.00486342980985,    0.365849961858,    0.365849961858,    0.3658499618 [...]
+{                 0,                 0,                 0,                 0,                 0,                 0,                 0,                 0,                 0,                 0,                 0,                 0,                 0,                 0,                 0,                 0,                 0,                 0,                 0,                 0,                 0,                 0,                 0,                 0,                 0,                 [...]
+};
+
+expectedConditionalProbabilities = Transpose(expectedConditionalProbabilities);
+
+
+AUTO_PARALLELIZE_OPTIMIZE = 1;
+
+LikelihoodFunction multiPart = (part_0, tree_0, part_1, tree_1, part_2, tree_2, part_3, tree_3);
+
+Optimize(res_multiPart,multiPart);
+
+ExecuteAFile ("../Shared/REL_utils.bf");
+marginalErrors = checkMarginalReconstruction ( expectedConditionalProbabilities, exepectedRateClassAssignments, "multiPart");
+
+/* test epilogue */
+	timeMatrix = endTestTimer 				  (_testDescription);
+	if (logTestResult (Abs (res_multiPart[1][0] - _expectedLL) < 0.01 && marginalErrors[0] < 0.0001 && marginalErrors[1] == 0))
+	{
+		return timeMatrix;
+	}
+	return 0;
+/* end test epilogue */
+
+
+END;
diff --git a/tests/hbltests/REL/NY.bf b/tests/hbltests/REL/NY.bf
new file mode 100644
index 0000000..be9a518
--- /dev/null
+++ b/tests/hbltests/REL/NY.bf
@@ -0,0 +1,49 @@
+/* test preamble */
+
+	_testDescription 		= " M0,M1,M2 PAML style fit out an HIV env alignment with 13 sequences";
+	_expectedLL = 			{{-1137.68873768577,-1114.64174822308,-1106.44533632047}};
+	ExecuteAFile 			("../Shared/TestInstrumentation.bf");
+	startTestTimer 			(_testDescription);
+	
+/* end test preamble */
+
+VERBOSITY_LEVEL			   = 1;
+USE_ADAPTIVE_VARIABLE_STEP = 1;
+OPTIMIZATION_METHOD        = 4;
+
+fprintf (stdout, "\nRunning an \n");
+runTimer = Time (1);
+
+inputOptions = {};
+inputOptions ["00"] = "Universal";
+inputOptions ["01"] = PATH_TO_CURRENT_BF + ".." + DIRECTORY_SEPARATOR + "data" + DIRECTORY_SEPARATOR + "HIVenvSweden.seq"; 
+inputOptions ["02"] = "y";
+inputOptions ["03"] = "Run Custom";
+inputOptions ["04"] = "Single Rate";
+inputOptions ["05"] = "Neutral";
+inputOptions ["06"] = "Selection";
+inputOptions ["07"] = "";
+inputOptions ["08"] = "Default";
+inputOptions ["09"] = "GY94 3x4";
+inputOptions ["10"] = "0.9";
+inputOptions ["11"] = PATH_TO_CURRENT_BF + ".." + DIRECTORY_SEPARATOR + "Results" + DIRECTORY_SEPARATOR + "HIVSweden.out";
+
+ExecuteAFile (HYPHY_LIB_DIRECTORY + "TemplateBatchFiles" + DIRECTORY_SEPARATOR + "NielsenYang.bf", inputOptions);
+
+
+fittedLL = {1,3};
+fittedLL[0] = modelLL[-1];
+fittedLL[1] = modelLL[0];
+fittedLL[2] = modelLL[1];
+
+/* test epilogue */
+	timeMatrix = endTestTimer 				  (_testDescription);
+	if (logTestResult (Abs (fittedLL - _expectedLL) < 2*OPTIMIZATION_PRECISION))
+	{
+		return timeMatrix;
+	}
+	return 0;
+/* end test epilogue */
+
+
+
diff --git a/tests/hbltests/REL/SmallNucRel.bf b/tests/hbltests/REL/SmallNucRel.bf
new file mode 100644
index 0000000..0c447ee
--- /dev/null
+++ b/tests/hbltests/REL/SmallNucRel.bf
@@ -0,0 +1,1447 @@
+#NEXUS
+
+BEGIN TAXA;
+	DIMENSIONS NTAX = 8;
+	TAXLABELS
+		'B_FR_83_HXB2_ACC_K03455' 'B_US_83_RF_ACC_M17451' 'B_US_86_JRFL_ACC_U63632' 'B_US_90_WEAU160_ACC_U21135' 'D_CD_83_ELI_ACC_K03454' 'D_CD_83_NDK_ACC_M27323' 'D_CD_84_84ZR085_ACC_U88822' 'D_UG_94_94UG114_ACC_U88824' ;
+END;
+
+BEGIN CHARACTERS;
+	DIMENSIONS NCHAR = 1320;
+	FORMAT
+		DATATYPE = DNA
+		GAP=-
+		MISSING=?
+	;
+
+MATRIX
+	'B_FR_83_HXB2_ACC_K03455'     CCCATTAGCCCTATTGAGACTGTACCAGTAAAATTAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAATAAAAGCATTAGTAGAAATTTGTACAGAGATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAAGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGATGGAA [...]
+	'B_US_83_RF_ACC_M17451'       CCCATTAGTCCTATTGAAACTGTACCAGTAAAATTAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAGGAAAAAATAAAAGCATTGGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCCAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAGTTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAGAAATCAGTAACAGTATTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATAAAGAGTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAAACACCACGGATTAGATATCAGTACAATGTGCTTCCACAAGGGTGGAA [...]
+	'B_US_86_JRFL_ACC_U63632'     CCCATTAGTCCTATTGAAACTGTACCAGTAAAATTAAAGCCAGGAATGGATGGCCCAAAAGTCAAACAATGGCCATTGACAGAAGAAAAAATAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAGAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATAAAGACTTCAGGAAATATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGGTATCAGTACAATGTGCTTCCGCAGGGATGGAA [...]
+	'B_US_90_WEAU160_ACC_U21135'  CCCATTAGTCCTATTGAAACTGTACCAGTAAAATTAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAGAAAATAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTTCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTACCCTTAGATGAAGACTTCAGGAAGTACACTGCATTTACCATACCTAGTATAAACAATGAAACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGATGGAA [...]
+	'D_CD_83_ELI_ACC_K03454'      CCAATTAGTCCTATTGAAACTGTACCAGTAAAATTAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAATAAAAGCATTAACAGAAATTTGTACAGATATGGAAAAGGAAGGAAAAATTTCAAGAATTGGGCCTGAAAATCCATACAATACTCCAATATTTGCCATAAAGAAAAAAGACAGTACCAAGTGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGATTTCTGGGAAGTTCAATTAGGAATACCGCATCCTGCAGGGCTGAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAAGATTTTAGGAAATATACCGCCTTTACCATATCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGATGGAA [...]
+	'D_CD_83_NDK_ACC_M27323'      CCAATTAGTCCTATTGAAACTGTACCAGTAAAATTAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAATAAAAGCATTAACAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAGAATTGGGCCTGAAAATCCATATAATACTCCAATATTTGCCATAAAGAAAAAAGACAGTACCAAGTGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGATTTCTGGGAGGTTCAATTAGGAATACCGCATCCTGCAGGGCTGAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATGAAGATTTTAGGAAATATACCGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTCCCACAGGGATGGAA [...]
+	'D_CD_84_84ZR085_ACC_U88822'  CCAATTAGTCCTATTGAAACTGTACCAGTAAAATTAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCGTTGACAGAAGAAAAAATAAAAGCATTAACAGAAATTTGTACAGATATGGAAAAGGAAGGAAAAATTTCAAGAATTGGGCCTGAAAATCCATACAATACTCCAATATTTGCCATAAAGAAAAAAGACAGTACTAAGTGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGGATACCACATCCTGCAGGATTAAAGAAGAAAAAGTCAATAACAGTACTGGATGTGGGCGATGCATATTTTTCAATTCCCTTATGTGAAGACTTTAGGAAGTACACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTACTTCCACAGGGATGGAA [...]
+	'D_UG_94_94UG114_ACC_U88824'  CCAATTAGTCCTATTGAAACTGTACCAGTAAAATTAAAGCCAGGGATGGATGGCCCAAAAGTTAAACAATGGCCGTTGACAGAAGAAAAAATAAAAGCACTAATAGAAATTTGTTCAGAACTAGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAACCCATACAATACTCCAATATTTGCCATAAAGAAAAAAGACAGTACTAAGTGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTTTGGGAAGTTCAACTAGGAATACCACATCCTGCAGGGCTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGACGCATATTTTTCAGTTCCCTTACATGAAGACTTTAGAAAATATACCGCATTCACCATACCTAGTACAAACAATGAGACACCAGGAATTAGATATCAGTACAATGTGCTTCCACAAGGATGGAA [...]
+END;
+
+BEGIN TREES;
+	TREE tree = ((((D_CD_83_ELI_ACC_K03454,D_CD_83_NDK_ACC_M27323),D_UG_94_94UG114_ACC_U88824),D_CD_84_84ZR085_ACC_U88822),B_US_83_RF_ACC_M17451,((B_FR_83_HXB2_ACC_K03455,B_US_86_JRFL_ACC_U63632),B_US_90_WEAU160_ACC_U21135));
+END;
+
+BEGIN HYPHY;
+
+/* test preamble */
+
+	_testDescription 		= " fit the HKY+gamma model to an HIV-1 RT (p51) alignment with 8 sequences and 1320 nucleotides and perform marginal site-by-site reconstruction";
+	_expectedLL 			= -3286.0978773303;
+	ExecuteAFile 			("../Shared/TestInstrumentation.bf");
+	startTestTimer 			(_testDescription);
+
+/* end test preamble */
+
+global SmallCodon_part_Shared_TVTS=1;
+global SmallCodon_part_Shape=0.5;
+SmallCodon_part_Shape:>0.01;
+SmallCodon_part_Shape:<100;
+SmallCodon_part_Categ.weights={
+{              0.25}
+{              0.25}
+{              0.25}
+{              0.25}
+}
+;
+
+
+category SmallCodon_part_Categ=(4,SmallCodon_part_Categ.weights,MEAN,GammaDist(_x_,SmallCodon_part_Shape,SmallCodon_part_Shape),CGammaDist(_x_,SmallCodon_part_Shape,SmallCodon_part_Shape),0,1e+25,CGammaDist(_x_,SmallCodon_part_Shape+1,SmallCodon_part_Shape));
+SmallCodon_part_HKY85={4,4};
+SmallCodon_part_HKY85[0][1]:=t*SmallCodon_part_Shared_TVTS*SmallCodon_part_Categ;
+SmallCodon_part_HKY85[0][2]:=t*SmallCodon_part_Categ;
+SmallCodon_part_HKY85[0][3]:=t*SmallCodon_part_Shared_TVTS*SmallCodon_part_Categ;
+SmallCodon_part_HKY85[1][0]:=t*SmallCodon_part_Shared_TVTS*SmallCodon_part_Categ;
+SmallCodon_part_HKY85[1][2]:=t*SmallCodon_part_Shared_TVTS*SmallCodon_part_Categ;
+SmallCodon_part_HKY85[1][3]:=t*SmallCodon_part_Categ;
+SmallCodon_part_HKY85[2][0]:=t*SmallCodon_part_Categ;
+SmallCodon_part_HKY85[2][1]:=t*SmallCodon_part_Shared_TVTS*SmallCodon_part_Categ;
+SmallCodon_part_HKY85[2][3]:=t*SmallCodon_part_Shared_TVTS*SmallCodon_part_Categ;
+SmallCodon_part_HKY85[3][0]:=t*SmallCodon_part_Shared_TVTS*SmallCodon_part_Categ;
+SmallCodon_part_HKY85[3][1]:=t*SmallCodon_part_Categ;
+SmallCodon_part_HKY85[3][2]:=t*SmallCodon_part_Shared_TVTS*SmallCodon_part_Categ;
+
+SmallCodon_part_Freqs={
+{    0.404450757576}
+{    0.166287878788}
+{    0.209564393939}
+{    0.219696969697}
+}
+;
+Model SmallCodon_part_HKY85_model=(SmallCodon_part_HKY85,SmallCodon_part_Freqs);
+
+UseModel (SmallCodon_part_HKY85_model);
+Tree SmallCodon_tree=((((D_CD_83_ELI_ACC_K03454,D_CD_83_NDK_ACC_M27323)Node3,D_UG_94_94UG114_ACC_U88824)Node2,D_CD_84_84ZR085_ACC_U88822)Node1,B_US_83_RF_ACC_M17451,((B_FR_83_HXB2_ACC_K03455,B_US_86_JRFL_ACC_U63632)Node10,B_US_90_WEAU160_ACC_U21135)Node9);
+
+SmallCodon_tree.Node2.t=0;
+SmallCodon_tree.D_CD_83_ELI_ACC_K03454.t=0;
+SmallCodon_tree.D_UG_94_94UG114_ACC_U88824.t=0;
+SmallCodon_tree.Node1.t=0;
+SmallCodon_tree.D_CD_84_84ZR085_ACC_U88822.t=0;
+SmallCodon_tree.D_CD_83_NDK_ACC_M27323.t=0;
+SmallCodon_tree.Node3.t=0;
+SmallCodon_tree.B_US_83_RF_ACC_M17451.t=0;
+SmallCodon_tree.B_FR_83_HXB2_ACC_K03455.t=0;
+SmallCodon_tree.B_US_86_JRFL_ACC_U63632.t=0;
+SmallCodon_tree.Node10.t=0;
+SmallCodon_tree.B_US_90_WEAU160_ACC_U21135.t=0;
+SmallCodon_tree.Node9.t=0;
+DataSet SmallCodon = ReadDataFile(USE_NEXUS_FILE_DATA);
+
+DataSetFilter SmallCodon_part = CreateFilter(SmallCodon,1,"","4,5,7,6,1,0,2,3");
+LikelihoodFunction SmallCodon_LF = (SmallCodon_part,SmallCodon_tree);
+
+AUTO_PARALLELIZE_OPTIMIZE = 3;
+OPTIMIZATION_PRECISION    = 0.001;
+
+Optimize(res_SmallCodon_LF,SmallCodon_LF);
+
+expectedConditionalProbabilities = 
+{
+{    0.166238705839,    0.164203697858,    0.148535535877,   0.0702168402446}
+{    0.166238705839,    0.164203697858,    0.148535535877,   0.0702168402446}
+{ 7.38658166722e-07, 3.11860538125e-05,  0.00025731587261,  0.00109420284125}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{ 1.83661195511e-06, 7.75805035614e-05, 0.000642558662221,  0.00276510223348}
+{    0.166238705839,    0.164203697858,    0.148535535877,   0.0702168402446}
+{    0.166238705839,    0.164203697858,    0.148535535877,   0.0702168402446}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{ 4.26094355493e-06, 0.000179813528012,  0.00147831910146,  0.00618625232335}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.166238705839,    0.164203697858,    0.148535535877,   0.0702168402446}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.166238705839,    0.164203697858,    0.148535535877,   0.0702168402446}
+{    0.166238705839,    0.164203697858,    0.148535535877,   0.0702168402446}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{    0.166238705839,    0.164203697858,    0.148535535877,   0.0702168402446}
+{    0.166238705839,    0.164203697858,    0.148535535877,   0.0702168402446}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{ 2.21580726116e-05, 0.000934146944386,  0.00761592498171,   0.0294481352427}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{    0.166238705839,    0.164203697858,    0.148535535877,   0.0702168402446}
+{    0.166238705839,    0.164203697858,    0.148535535877,   0.0702168402446}
+{    0.166238705839,    0.164203697858,    0.148535535877,   0.0702168402446}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{ 2.79624651168e-06, 0.000118106492323, 0.000977521826166,  0.00417921511147}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.166238705839,    0.164203697858,    0.148535535877,   0.0702168402446}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{    0.166238705839,    0.164203697858,    0.148535535877,   0.0702168402446}
+{    0.166238705839,    0.164203697858,    0.148535535877,   0.0702168402446}
+{ 7.88847971872e-10, 1.41796625714e-06, 0.000103290486744,  0.00299568594427}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.166238705839,    0.164203697858,    0.148535535877,   0.0702168402446}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{ 1.02019455151e-05,  0.00043045265715,  0.00353362917585,    0.014508561498}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{ 7.69864375107e-06, 0.000324780097948,  0.00266296785967,   0.0108781605597}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{    0.166238705839,    0.164203697858,    0.148535535877,   0.0702168402446}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{ 9.55104590897e-06, 0.000403328269813,  0.00333221475702,   0.0139772453133}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{ 1.02019455151e-05,  0.00043045265715,  0.00353362917585,    0.014508561498}
+{ 9.38186261623e-06, 0.000394741564219,  0.00316804707249,   0.0111107216435}
+{ 2.70756352035e-10, 4.87582062747e-07, 3.60435524331e-05,  0.00115070853772}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{ 2.30487308997e-06, 9.74776307459e-05, 0.000815382916642,  0.00379977662246}
+{    0.166238705839,    0.164203697858,    0.148535535877,   0.0702168402446}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{ 2.25346531639e-17,  1.7345720108e-12, 1.16999990872e-09, 3.42991187508e-07}
+{ 1.74455049396e-06, 7.37804825819e-05, 0.000617160517941,  0.00287603782287}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{ 2.21546415155e-05, 0.000927995234234,  0.00717699579814,    0.018486850731}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{  6.2870984938e-07,  2.6731172332e-05, 0.000233761242124,  0.00154653710575}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.166238705839,    0.164203697858,    0.148535535877,   0.0702168402446}
+{ 8.03182216087e-07, 3.39296336015e-05, 0.000281284579091,  0.00124487616694}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{ 1.10457535612e-09, 1.98206712799e-06, 0.000142364455313,  0.00371357194388}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{    0.166238705839,    0.164203697858,    0.148535535877,   0.0702168402446}
+{    0.166238705839,    0.164203697858,    0.148535535877,   0.0702168402446}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{ 9.55104590897e-06, 0.000403328269813,  0.00333221475702,   0.0139772453133}
+{    0.166238705839,    0.164203697858,    0.148535535877,   0.0702168402446}
+{    0.166238705839,    0.164203697858,    0.148535535877,   0.0702168402446}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{ 2.98802423149e-11, 5.37651121173e-08,  3.9486661381e-06,  0.00012088071666}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.166238705839,    0.164203697858,    0.148535535877,   0.0702168402446}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.166238705839,    0.164203697858,    0.148535535877,   0.0702168402446}
+{    0.166238705839,    0.164203697858,    0.148535535877,   0.0702168402446}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{ 9.38186261623e-06, 0.000394741564219,  0.00316804707249,   0.0111107216435}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{    0.166238705839,    0.164203697858,    0.148535535877,   0.0702168402446}
+{    0.166238705839,    0.164203697858,    0.148535535877,   0.0702168402446}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{ 6.48727777487e-06, 0.000273707326406,  0.00224624497732,  0.00923816223587}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.166238705839,    0.164203697858,    0.148535535877,   0.0702168402446}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.166238705839,    0.164203697858,    0.148535535877,   0.0702168402446}
+{ 1.77487499003e-06, 7.50246822393e-05, 0.000625179517055,  0.00287728854194}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{ 9.38148581793e-06, 0.000394064486396,   0.0031188816339,  0.00975455935601}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.166238705839,    0.164203697858,    0.148535535877,   0.0702168402446}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.166238705839,    0.164203697858,    0.148535535877,   0.0702168402446}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{ 6.48603603158e-06, 0.000271481039546,  0.00208739930959,  0.00521107241223}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.166238705839,    0.164203697858,    0.148535535877,   0.0702168402446}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.166238705839,    0.164203697858,    0.148535535877,   0.0702168402446}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{ 1.77480458955e-06, 7.48976242837e-05, 0.000615617190139,  0.00252882917831}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{ 9.55064057807e-06, 0.000402598639786,  0.00327845613921,   0.0123030325578}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{ 3.47322153253e-06, 0.000146799205253,  0.00122219889735,  0.00563162205063}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.166238705839,    0.164203697858,    0.148535535877,   0.0702168402446}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{ 1.02019455151e-05,  0.00043045265715,  0.00353362917585,    0.014508561498}
+{ 9.55104590897e-06, 0.000403328269813,  0.00333221475702,   0.0139772453133}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{ 1.10302475445e-05, 0.000465322449213,  0.00381541353889,   0.0156935932933}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.166238705839,    0.164203697858,    0.148535535877,   0.0702168402446}
+{    0.166238705839,    0.164203697858,    0.148535535877,   0.0702168402446}
+{ 4.11769224283e-06, 0.000173853512346,  0.00143701229445,  0.00660320200352}
+{    0.166238705839,    0.164203697858,    0.148535535877,   0.0702168402446}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.166238705839,    0.164203697858,    0.148535535877,   0.0702168402446}
+{    0.166238705839,    0.164203697858,    0.148535535877,   0.0702168402446}
+{ 2.70982019297e-07, 1.15087723766e-05,  9.9613603471e-05, 0.000590520639472}
+{ 4.14837388999e-07, 1.73831561172e-05, 0.000134892789696, 0.000360648266411}
+{    0.166238705839,    0.164203697858,    0.148535535877,   0.0702168402446}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{ 1.10282407115e-05, 0.000461723328786,  0.00355796204548,  0.00904961737758}
+{ 4.23722314807e-07, 1.82190640527e-05, 0.000172442571143,  0.00141288850809}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{ 4.11769224283e-06, 0.000173853512346,  0.00143701229445,  0.00660320200352}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{ 1.10302475445e-05, 0.000465322449213,  0.00381541353889,   0.0156935932933}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{ 6.48727777487e-06, 0.000273707326406,  0.00224624497732,  0.00923816223587}
+{ 1.02019455151e-05,  0.00043045265715,  0.00353362917585,    0.014508561498}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{ 1.10302475445e-05, 0.000465322449213,  0.00381541353889,   0.0156935932933}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.166238705839,    0.164203697858,    0.148535535877,   0.0702168402446}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{ 1.10282407115e-05, 0.000461723328786,  0.00355796204548,  0.00904961737758}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.166238705839,    0.164203697858,    0.148535535877,   0.0702168402446}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{ 4.39717980769e-06, 0.000185347051972,  0.00150863918172,  0.00566885418334}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{ 4.75444133113e-06, 0.000200814439054,  0.00166204426545,   0.0071214899314}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{ 9.55104590897e-06, 0.000403328269813,  0.00333221475702,   0.0139772453133}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{    0.166238705839,    0.164203697858,    0.148535535877,   0.0702168402446}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{  1.4970509901e-06,  6.3289801906e-05, 0.000527769233348,  0.00239305307311}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.166238705839,    0.164203697858,    0.148535535877,   0.0702168402446}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{ 1.10282407115e-05, 0.000461723328786,  0.00355796204548,  0.00904961737758}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{ 8.00785502416e-07, 3.38470196483e-05, 0.000281750747817,  0.00125740093634}
+{    0.166238705839,    0.164203697858,    0.148535535877,   0.0702168402446}
+{    0.166238705839,    0.164203697858,    0.148535535877,   0.0702168402446}
+{    0.166238705839,    0.164203697858,    0.148535535877,   0.0702168402446}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{ 2.56457348507e-12, 4.60989985599e-09, 3.35776437422e-07, 9.65195307678e-06}
+{ 1.10302475445e-05, 0.000465322449213,  0.00381541353889,   0.0156935932933}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{ 3.15841782486e-10,  5.6449997324e-07, 3.92576557353e-05, 0.000811248788564}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{ 4.44294416632e-12, 8.00828554034e-09, 5.96685321849e-07, 2.06716864805e-05}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{ 4.04412355929e-06,  0.00017070809095,  0.00140587025629,  0.00580935691889}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{ 2.21546415155e-05, 0.000927995234234,  0.00717699579814,    0.018486850731}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{ 3.04439637348e-11, 5.61579600475e-08,  4.9252593617e-06, 0.000298736590453}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{ 7.18302583913e-11, 1.29424753944e-07, 9.61246872775e-06, 0.000321206627814}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.166238705839,    0.164203697858,    0.148535535877,   0.0702168402446}
+{ 4.23722314807e-07, 1.82190640527e-05, 0.000172442571143,  0.00141288850809}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{    0.166238705839,    0.164203697858,    0.148535535877,   0.0702168402446}
+{ 5.70427287032e-07, 2.40904241153e-05, 0.000199269036849, 0.000868942291988}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{ 9.55104590897e-06, 0.000403328269813,  0.00333221475702,   0.0139772453133}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.166238705839,    0.164203697858,    0.148535535877,   0.0702168402446}
+{    0.166238705839,    0.164203697858,    0.148535535877,   0.0702168402446}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{ 3.12293746506e-06, 0.000131635365032,  0.00107142128944,  0.00402887895612}
+{    0.166238705839,    0.164203697858,    0.148535535877,   0.0702168402446}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{ 9.55104590897e-06, 0.000403328269813,  0.00333221475702,   0.0139772453133}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.166238705839,    0.164203697858,    0.148535535877,   0.0702168402446}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{ 3.89403405406e-10, 6.95979470025e-07, 4.84025049793e-05, 0.000999270358126}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.166238705839,    0.164203697858,    0.148535535877,   0.0702168402446}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.166238705839,    0.164203697858,    0.148535535877,   0.0702168402446}
+{    0.166238705839,    0.164203697858,    0.148535535877,   0.0702168402446}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{ 4.16089505722e-07, 1.74443054768e-05, 0.000135917520361, 0.000374600376156}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{ 2.21546415155e-05, 0.000927995234234,  0.00717699579814,    0.018486850731}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{ 6.48727777487e-06, 0.000273707326406,  0.00224624497732,  0.00923816223587}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.166238705839,    0.164203697858,    0.148535535877,   0.0702168402446}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.166238705839,    0.164203697858,    0.148535535877,   0.0702168402446}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{ 1.10282407115e-05, 0.000461723328786,  0.00355796204548,  0.00904961737758}
+{    0.166238705839,    0.164203697858,    0.148535535877,   0.0702168402446}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{  1.4970509901e-06,  6.3289801906e-05, 0.000527769233348,  0.00239305307311}
+{    0.166238705839,    0.164203697858,    0.148535535877,   0.0702168402446}
+{    0.166238705839,    0.164203697858,    0.148535535877,   0.0702168402446}
+{ 6.48727777487e-06, 0.000273707326406,  0.00224624497732,  0.00923816223587}
+{    0.166238705839,    0.164203697858,    0.148535535877,   0.0702168402446}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{ 1.07882883884e-09, 1.92915624507e-06, 0.000134687209892,   0.0028251875274}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{ 1.02019455151e-05,  0.00043045265715,  0.00353362917585,    0.014508561498}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.166238705839,    0.164203697858,    0.148535535877,   0.0702168402446}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.166238705839,    0.164203697858,    0.148535535877,   0.0702168402446}
+{    0.166238705839,    0.164203697858,    0.148535535877,   0.0702168402446}
+{ 4.11769224283e-06, 0.000173853512346,  0.00143701229445,  0.00660320200352}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{    0.166238705839,    0.164203697858,    0.148535535877,   0.0702168402446}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.166238705839,    0.164203697858,    0.148535535877,   0.0702168402446}
+{    0.166238705839,    0.164203697858,    0.148535535877,   0.0702168402446}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{ 4.39717980769e-06, 0.000185347051972,  0.00150863918172,  0.00566885418334}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{ 4.75420425548e-06, 0.000200387610598,  0.00163054969894,  0.00612462773546}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{ 6.06080603885e-07, 2.55625247516e-05, 0.000209094431733, 0.000815898502028}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{ 2.21546415155e-05, 0.000927995234234,  0.00717699579814,    0.018486850731}
+{    0.166238705839,    0.164203697858,    0.148535535877,   0.0702168402446}
+{    0.166238705839,    0.164203697858,    0.148535535877,   0.0702168402446}
+{ 2.70756352035e-10, 4.87582062747e-07, 3.60435524331e-05,  0.00115070853772}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{ 1.02000541866e-05, 0.000427061389771,  0.00329146826665,  0.00835551793455}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.166238705839,    0.164203697858,    0.148535535877,   0.0702168402446}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.166238705839,    0.164203697858,    0.148535535877,   0.0702168402446}
+{    0.166238705839,    0.164203697858,    0.148535535877,   0.0702168402446}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{ 1.29120766248e-07, 5.45461961984e-06, 4.52347104522e-05,  0.00020348800546}
+{ 1.10302475445e-05, 0.000465322449213,  0.00381541353889,   0.0156935932933}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{ 4.13354206585e-10, 7.44021259511e-07,  5.4794288451e-05,  0.00171449826313}
+{  6.8600809737e-10, 1.22633392157e-06, 8.54022615927e-05,  0.00175919963497}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.166238705839,    0.164203697858,    0.148535535877,   0.0702168402446}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.166238705839,    0.164203697858,    0.148535535877,   0.0702168402446}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.166238705839,    0.164203697858,    0.148535535877,   0.0702168402446}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.166238705839,    0.164203697858,    0.148535535877,   0.0702168402446}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{ 1.27116833184e-10, 2.28662463171e-07, 1.67542418254e-05, 0.000503191862781}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{ 6.48727777487e-06, 0.000273707326406,  0.00224624497732,  0.00923816223587}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{ 1.10282407115e-05, 0.000461723328786,  0.00355796204548,  0.00904961737758}
+{    0.166238705839,    0.164203697858,    0.148535535877,   0.0702168402446}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{    0.166238705839,    0.164203697858,    0.148535535877,   0.0702168402446}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{ 7.24560290628e-06, 0.000305786041853,  0.00251509318058,   0.0105187580341}
+{ 1.76968328634e-10,  3.1842725594e-07, 2.34001028093e-05, 0.000745687980282}
+{ 2.52624106064e-10, 4.54447935738e-07, 3.33048057032e-05, 0.000994855059673}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{ 3.81405554332e-10, 6.81957180523e-07, 4.75885693622e-05,  0.00101626915347}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{ 1.31923737849e-10, 2.38375254857e-07, 1.81031967943e-05, 0.000694505170305}
+{ 6.80218571444e-11, 1.22553080053e-07, 9.09644166661e-06, 0.000302717905056}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{ 9.38186261623e-06, 0.000394741564219,  0.00316804707249,   0.0111107216435}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{ 2.21580726116e-05, 0.000934146944386,  0.00761592498171,   0.0294481352427}
+{ 6.68919167555e-08, 2.80573649241e-06, 2.19527261671e-05, 6.36820603625e-05}
+{ 2.21580726116e-05, 0.000934146944386,  0.00761592498171,   0.0294481352427}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.166238705839,    0.164203697858,    0.148535535877,   0.0702168402446}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{ 9.55104590897e-06, 0.000403328269813,  0.00333221475702,   0.0139772453133}
+{    0.166238705839,    0.164203697858,    0.148535535877,   0.0702168402446}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{ 2.20821696622e-11, 3.97585746748e-08, 2.93460826021e-06, 9.26199697283e-05}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{ 1.02000541866e-05, 0.000427061389771,  0.00329146826665,  0.00835551793455}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{ 1.07882883884e-09, 1.92915624507e-06, 0.000134687209892,   0.0028251875274}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{ 5.32329077802e-15, 4.10161515627e-10, 2.78522089515e-07, 7.97961111153e-05}
+{ 3.97554643405e-11, 7.16404381747e-08, 5.32602330007e-06, 0.000179592564946}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.166238705839,    0.164203697858,    0.148535535877,   0.0702168402446}
+{    0.166238705839,    0.164203697858,    0.148535535877,   0.0702168402446}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{ 2.95554868249e-07, 1.24650975462e-05, 0.000101932005869, 0.000397152611601}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.166238705839,    0.164203697858,    0.148535535877,   0.0702168402446}
+{    0.166238705839,    0.164203697858,    0.148535535877,   0.0702168402446}
+{ 1.02019455151e-05,  0.00043045265715,  0.00353362917585,    0.014508561498}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{ 1.77480458955e-06, 7.48976242837e-05, 0.000615617190139,  0.00252882917831}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{ 1.02019455151e-05,  0.00043045265715,  0.00353362917585,    0.014508561498}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{ 2.21580726116e-05, 0.000934146944386,  0.00761592498171,   0.0294481352427}
+{ 9.55064057807e-06, 0.000402598639786,  0.00327845613921,   0.0123030325578}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.166238705839,    0.164203697858,    0.148535535877,   0.0702168402446}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{ 7.69719652028e-06, 0.000322185435532,  0.00247786349579,  0.00619525495981}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{ 6.06099749236e-07, 2.55971438085e-05, 0.000211739415081, 0.000922186020803}
+{    0.166238705839,    0.164203697858,    0.148535535877,   0.0702168402446}
+{    0.166238705839,    0.164203697858,    0.148535535877,   0.0702168402446}
+{ 1.39620251334e-10, 2.51639921043e-07, 1.87287916431e-05, 0.000629298513284}
+{    0.166238705839,    0.164203697858,    0.148535535877,   0.0702168402446}
+{    0.166238705839,    0.164203697858,    0.148535535877,   0.0702168402446}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{ 7.07034502174e-07, 3.00441242197e-05, 0.000260831496113,  0.00150219140425}
+{    0.166238705839,    0.164203697858,    0.148535535877,   0.0702168402446}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.166238705839,    0.164203697858,    0.148535535877,   0.0702168402446}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.166238705839,    0.164203697858,    0.148535535877,   0.0702168402446}
+{    0.166238705839,    0.164203697858,    0.148535535877,   0.0702168402446}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.166238705839,    0.164203697858,    0.148535535877,   0.0702168402446}
+{    0.166238705839,    0.164203697858,    0.148535535877,   0.0702168402446}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{ 2.79624651168e-06, 0.000118106492323, 0.000977521826166,  0.00417921511147}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{ 7.88847971872e-10, 1.41796625714e-06, 0.000103290486744,  0.00299568594427}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.166238705839,    0.164203697858,    0.148535535877,   0.0702168402446}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.166238705839,    0.164203697858,    0.148535535877,   0.0702168402446}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{ 8.93130258593e-11, 1.60734565472e-07, 1.18224041659e-05, 0.000366080942495}
+{    0.166238705839,    0.164203697858,    0.148535535877,   0.0702168402446}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{ 1.55590347932e-15, 1.19592920124e-10,  7.9693960482e-08, 2.05821992493e-05}
+{  2.2937287084e-17, 1.76710003177e-12, 1.20050283217e-09, 3.70219657392e-07}
+{ 3.61676678882e-17, 2.78998689219e-12, 1.91202606642e-09, 5.77793145894e-07}
+{    0.166238705839,    0.164203697858,    0.148535535877,   0.0702168402446}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{    0.166238705839,    0.164203697858,    0.148535535877,   0.0702168402446}
+{    0.166238705839,    0.164203697858,    0.148535535877,   0.0702168402446}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{ 1.10302475445e-05, 0.000465322449213,  0.00381541353889,   0.0156935932933}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{ 4.13354206585e-10, 7.44021259511e-07,  5.4794288451e-05,  0.00171449826313}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{ 5.00188951251e-17, 3.84715180774e-12, 2.57905313807e-09, 7.22649273899e-07}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{ 3.31822261532e-06,  0.00013984674255,  0.00113691804158,  0.00423588029312}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.166238705839,    0.164203697858,    0.148535535877,   0.0702168402446}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.166238705839,    0.164203697858,    0.148535535877,   0.0702168402446}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{ 4.04412355929e-06,  0.00017070809095,  0.00140587025629,  0.00580935691889}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.166238705839,    0.164203697858,    0.148535535877,   0.0702168402446}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{ 2.95508496221e-07, 1.23820059768e-05, 9.60329859378e-05, 0.000256125883425}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{ 7.24420263976e-06, 0.000303275058098,  0.00233564634075,  0.00590701131793}
+{ 4.33917795294e-11, 7.81583757536e-08, 5.80052587072e-06, 0.000214230085252}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{ 7.24560290628e-06, 0.000305786041853,  0.00251509318058,   0.0105187580341}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{ 2.90507028364e-10, 5.21803018517e-07, 3.78011684714e-05,   0.0010813967308}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{ 1.77487499003e-06, 7.50246822393e-05, 0.000625179517055,  0.00287728854194}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{    0.166238705839,    0.164203697858,    0.148535535877,   0.0702168402446}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{ 4.04407904728e-06, 0.000170627852692,  0.00139989116725,  0.00560856612921}
+{    0.166238705839,    0.164203697858,    0.148535535877,   0.0702168402446}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{ 7.07034502174e-07, 3.00441242197e-05, 0.000260831496113,  0.00150219140425}
+{ 2.70577727033e-19, 2.07616856039e-14, 1.36442761435e-11, 3.22259085102e-09}
+{    0.166238705839,    0.164203697858,    0.148535535877,   0.0702168402446}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{ 9.38186261623e-06, 0.000394741564219,  0.00316804707249,   0.0111107216435}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{ 4.35588032899e-15, 3.34486950957e-10,  2.2123240436e-07, 5.51428234213e-05}
+{ 7.74638299433e-10,  1.3852375884e-06, 9.67356645525e-05,  0.00203807213046}
+{    0.166238705839,    0.164203697858,    0.148535535877,   0.0702168402446}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{ 3.31839358328e-06, 0.000140154487326,  0.00115958701938,    0.004944012748}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{ 9.55104590897e-06, 0.000403328269813,  0.00333221475702,   0.0139772453133}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{ 9.55064057807e-06, 0.000402598639786,  0.00327845613921,   0.0123030325578}
+{  1.1942794233e-06, 5.05426372181e-05, 0.000425025988981,  0.00203383727267}
+{    0.166238705839,    0.164203697858,    0.148535535877,   0.0702168402446}
+{    0.166238705839,    0.164203697858,    0.148535535877,   0.0702168402446}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{ 4.26010081287e-06, 0.000178302438228,  0.00137040032253,   0.0034161865421}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{ 7.69864375107e-06, 0.000324780097948,  0.00266296785967,   0.0108781605597}
+{ 2.21580726116e-05, 0.000934146944386,  0.00761592498171,   0.0294481352427}
+{    0.166238705839,    0.164203697858,    0.148535535877,   0.0702168402446}
+{    0.166238705839,    0.164203697858,    0.148535535877,   0.0702168402446}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{ 1.10302475445e-05, 0.000465322449213,  0.00381541353889,   0.0156935932933}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{    0.166238705839,    0.164203697858,    0.148535535877,   0.0702168402446}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.166238705839,    0.164203697858,    0.148535535877,   0.0702168402446}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{ 2.21580726116e-05, 0.000934146944386,  0.00761592498171,   0.0294481352427}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.166238705839,    0.164203697858,    0.148535535877,   0.0702168402446}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{ 1.10302475445e-05, 0.000465322449213,  0.00381541353889,   0.0156935932933}
+{ 7.69719652028e-06, 0.000322185435532,  0.00247786349579,  0.00619525495981}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{ 8.76321126884e-11, 1.57987080905e-07, 1.17973810143e-05, 0.000427867526874}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.166238705839,    0.164203697858,    0.148535535877,   0.0702168402446}
+{  8.0315731476e-07, 3.38845930855e-05, 0.000277835184284,  0.00110403219807}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{ 6.06080603885e-07, 2.55625247516e-05, 0.000209094431733, 0.000815898502028}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{ 2.21580726116e-05, 0.000934146944386,  0.00761592498171,   0.0294481352427}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.166238705839,    0.164203697858,    0.148535535877,   0.0702168402446}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{ 1.02000541866e-05, 0.000427061389771,  0.00329146826665,  0.00835551793455}
+{ 1.74455049396e-06, 7.37804825819e-05, 0.000617160517941,  0.00287603782287}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{    0.166238705839,    0.164203697858,    0.148535535877,   0.0702168402446}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{ 9.38186261623e-06, 0.000394741564219,  0.00316804707249,   0.0111107216435}
+{ 4.04412355929e-06,  0.00017070809095,  0.00140587025629,  0.00580935691889}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{ 7.69864375107e-06, 0.000324780097948,  0.00266296785967,   0.0108781605597}
+{    0.166238705839,    0.164203697858,    0.148535535877,   0.0702168402446}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{    0.166238705839,    0.164203697858,    0.148535535877,   0.0702168402446}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{ 4.39717980769e-06, 0.000185347051972,  0.00150863918172,  0.00566885418334}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{ 4.26010081287e-06, 0.000178302438228,  0.00137040032253,   0.0034161865421}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{ 3.61293055628e-11, 6.66796562552e-08, 5.86780119034e-06, 0.000359232242266}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{ 2.30491071709e-06, 9.75452343241e-05,  0.00082028287345,  0.00392522322259}
+{ 3.12293746506e-06, 0.000131635365032,  0.00107142128944,  0.00402887895612}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{ 1.10302475445e-05, 0.000465322449213,  0.00381541353889,   0.0156935932933}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{ 6.48727777487e-06, 0.000273707326406,  0.00224624497732,  0.00923816223587}
+{    0.166238705839,    0.164203697858,    0.148535535877,   0.0702168402446}
+{    0.166238705839,    0.164203697858,    0.148535535877,   0.0702168402446}
+{ 7.69864375107e-06, 0.000324780097948,  0.00266296785967,   0.0108781605597}
+{ 1.10282407115e-05, 0.000461723328786,  0.00355796204548,  0.00904961737758}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{ 1.10302475445e-05, 0.000465322449213,  0.00381541353889,   0.0156935932933}
+{    0.166238705839,    0.164203697858,    0.148535535877,   0.0702168402446}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{ 9.55104590897e-06, 0.000403328269813,  0.00333221475702,   0.0139772453133}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.166238705839,    0.164203697858,    0.148535535877,   0.0702168402446}
+{    0.166238705839,    0.164203697858,    0.148535535877,   0.0702168402446}
+{    0.166238705839,    0.164203697858,    0.148535535877,   0.0702168402446}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.166238705839,    0.164203697858,    0.148535535877,   0.0702168402446}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.166238705839,    0.164203697858,    0.148535535877,   0.0702168402446}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{    0.166238705839,    0.164203697858,    0.148535535877,   0.0702168402446}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{ 7.69864375107e-06, 0.000324780097948,  0.00266296785967,   0.0108781605597}
+{ 1.97053966273e-24, 6.70941114441e-18, 5.26707807363e-14,   3.575717291e-10}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.166238705839,    0.164203697858,    0.148535535877,   0.0702168402446}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{ 9.38186261623e-06, 0.000394741564219,  0.00316804707249,   0.0111107216435}
+{    0.166238705839,    0.164203697858,    0.148535535877,   0.0702168402446}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{ 9.38186261623e-06, 0.000394741564219,  0.00316804707249,   0.0111107216435}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{  1.4166957907e-07,  5.9727119408e-06, 4.86934913252e-05, 0.000185697264747}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{ 3.24169091676e-07, 1.36854373337e-05, 0.000112875773141, 0.000484406609502}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{ 2.21546415155e-05, 0.000927995234234,  0.00717699579814,    0.018486850731}
+{ 3.05814230858e-10, 5.50166223805e-07, 4.03399579628e-05,  0.00120945451007}
+{    0.166238705839,    0.164203697858,    0.148535535877,   0.0702168402446}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.166238705839,    0.164203697858,    0.148535535877,   0.0702168402446}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{  3.5535152826e-11, 6.41720598054e-08, 4.85506241991e-06, 0.000187267339044}
+{    0.166238705839,    0.164203697858,    0.148535535877,   0.0702168402446}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{ 7.69864375107e-06, 0.000324780097948,  0.00266296785967,   0.0108781605597}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{ 2.30491071709e-06, 9.75452343241e-05,  0.00082028287345,  0.00392522322259}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.166238705839,    0.164203697858,    0.148535535877,   0.0702168402446}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{ 9.38186261623e-06, 0.000394741564219,  0.00316804707249,   0.0111107216435}
+{    0.166238705839,    0.164203697858,    0.148535535877,   0.0702168402446}
+{ 1.74450511764e-06, 7.36984210754e-05, 0.000610881476131,  0.00261690066484}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{ 2.30491071709e-06, 9.75452343241e-05,  0.00082028287345,  0.00392522322259}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{  6.7476648497e-07, 2.84939142369e-05,  0.00023548891647,   0.0010194047666}
+{ 4.39740323869e-06, 0.000185749262116,  0.00153828494069,  0.00659847201982}
+{    0.166238705839,    0.164203697858,    0.148535535877,   0.0702168402446}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{ 3.47246733786e-06, 0.000145445627288,   0.0011247726583,  0.00295086249714}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.166238705839,    0.164203697858,    0.148535535877,   0.0702168402446}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{ 6.28647226098e-07, 2.66161860174e-05, 0.000223965801359, 0.000972404350203}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{    0.166238705839,    0.164203697858,    0.148535535877,   0.0702168402446}
+{ 2.21580726116e-05, 0.000934146944386,  0.00761592498171,   0.0294481352427}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{ 2.21546415155e-05, 0.000927995234234,  0.00717699579814,    0.018486850731}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{ 7.69864375107e-06, 0.000324780097948,  0.00266296785967,   0.0108781605597}
+{ 1.90586431651e-11, 3.43730551744e-08, 2.57283371039e-06, 9.10994872729e-05}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{ 2.21546415155e-05, 0.000927995234234,  0.00717699579814,    0.018486850731}
+{    0.166238705839,    0.164203697858,    0.148535535877,   0.0702168402446}
+{    0.166238705839,    0.164203697858,    0.148535535877,   0.0702168402446}
+{    0.166238705839,    0.164203697858,    0.148535535877,   0.0702168402446}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.166238705839,    0.164203697858,    0.148535535877,   0.0702168402446}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.166238705839,    0.164203697858,    0.148535535877,   0.0702168402446}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{ 7.24560290628e-06, 0.000305786041853,  0.00251509318058,   0.0105187580341}
+{    0.166238705839,    0.164203697858,    0.148535535877,   0.0702168402446}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{ 1.10302475445e-05, 0.000465322449213,  0.00381541353889,   0.0156935932933}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{ 7.24560290628e-06, 0.000305786041853,  0.00251509318058,   0.0105187580341}
+{    0.166238705839,    0.164203697858,    0.148535535877,   0.0702168402446}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{    0.166238705839,    0.164203697858,    0.148535535877,   0.0702168402446}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{ 1.02000541866e-05, 0.000427061389771,  0.00329146826665,  0.00835551793455}
+{    0.166238705839,    0.164203697858,    0.148535535877,   0.0702168402446}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{ 4.21884918542e-10,    7.58532704e-07, 5.53729996482e-05,  0.00164385591601}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{ 7.24560290628e-06, 0.000305786041853,  0.00251509318058,   0.0105187580341}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{ 1.02019455151e-05,  0.00043045265715,  0.00353362917585,    0.014508561498}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{ 3.40824731647e-16, 2.60358909669e-11, 1.65055770486e-08, 3.01261885201e-06}
+{    0.166238705839,    0.164203697858,    0.148535535877,   0.0702168402446}
+{    0.166238705839,    0.164203697858,    0.148535535877,   0.0702168402446}
+{ 1.74455049396e-06, 7.37804825819e-05, 0.000617160517941,  0.00287603782287}
+{ 1.53272722928e-16, 1.18000076779e-11, 7.96573632617e-09, 2.25680652696e-06}
+{  6.7476648497e-07, 2.84939142369e-05,  0.00023548891647,   0.0010194047666}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{ 2.30487308997e-06, 9.74776307459e-05, 0.000815382916642,  0.00379977662246}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{ 9.55064057807e-06, 0.000402598639786,  0.00327845613921,   0.0123030325578}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{ 1.10457535612e-09, 1.98206712799e-06, 0.000142364455313,  0.00371357194388}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{ 7.24560290628e-06, 0.000305786041853,  0.00251509318058,   0.0105187580341}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{ 2.79609981892e-06, 0.000117842441171, 0.000958070039042,  0.00357105888348}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.166238705839,    0.164203697858,    0.148535535877,   0.0702168402446}
+{    0.166238705839,    0.164203697858,    0.148535535877,   0.0702168402446}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{ 1.55533949002e-10, 2.79822157891e-07,   2.053944763e-05, 0.000644077175039}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{ 2.79609981892e-06, 0.000117842441171, 0.000958070039042,  0.00357105888348}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{ 4.26094355493e-06, 0.000179813528012,  0.00147831910146,  0.00618625232335}
+{    0.166238705839,    0.164203697858,    0.148535535877,   0.0702168402446}
+{    0.166238705839,    0.164203697858,    0.148535535877,   0.0702168402446}
+{    0.166238705839,    0.164203697858,    0.148535535877,   0.0702168402446}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.166238705839,    0.164203697858,    0.148535535877,   0.0702168402446}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{ 9.88726524934e-11, 1.78042288416e-07, 1.31404660133e-05, 0.000396623682975}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.166238705839,    0.164203697858,    0.148535535877,   0.0702168402446}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{ 1.02019455151e-05,  0.00043045265715,  0.00353362917585,    0.014508561498}
+{ 1.02019455151e-05,  0.00043045265715,  0.00353362917585,    0.014508561498}
+{    0.166238705839,    0.164203697858,    0.148535535877,   0.0702168402446}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{ 7.24560290628e-06, 0.000305786041853,  0.00251509318058,   0.0105187580341}
+{ 4.28136049566e-11, 7.72325072341e-08,  5.7900535492e-06, 0.000205299357641}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{ 4.49875578531e-07, 1.88636507879e-05, 0.000147156826309,  0.00040912024442}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{    0.166238705839,    0.164203697858,    0.148535535877,   0.0702168402446}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{ 2.21580726116e-05, 0.000934146944386,  0.00761592498171,   0.0294481352427}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{    0.166238705839,    0.164203697858,    0.148535535877,   0.0702168402446}
+{    0.166238705839,    0.164203697858,    0.148535535877,   0.0702168402446}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.166238705839,    0.164203697858,    0.148535535877,   0.0702168402446}
+{ 3.12293746506e-06, 0.000131635365032,  0.00107142128944,  0.00402887895612}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.166238705839,    0.164203697858,    0.148535535877,   0.0702168402446}
+{    0.166238705839,    0.164203697858,    0.148535535877,   0.0702168402446}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{ 7.30883496508e-10, 1.31000036004e-06, 9.32123837054e-05,  0.00226258894081}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{ 2.30491071709e-06, 9.75452343241e-05,  0.00082028287345,  0.00392522322259}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{ 1.83651239827e-06, 7.74012868262e-05, 0.000629349019288,  0.00234964337631}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{ 9.55104590897e-06, 0.000403328269813,  0.00333221475702,   0.0139772453133}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.166238705839,    0.164203697858,    0.148535535877,   0.0702168402446}
+{    0.166238705839,    0.164203697858,    0.148535535877,   0.0702168402446}
+{    0.166238705839,    0.164203697858,    0.148535535877,   0.0702168402446}
+{    0.166238705839,    0.164203697858,    0.148535535877,   0.0702168402446}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.166238705839,    0.164203697858,    0.148535535877,   0.0702168402446}
+{    0.166238705839,    0.164203697858,    0.148535535877,   0.0702168402446}
+{ 4.04412355929e-06,  0.00017070809095,  0.00140587025629,  0.00580935691889}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{ 9.35116950494e-12,  1.7040453329e-08, 1.38150362443e-06, 7.51560707659e-05}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{ 1.02019455151e-05,  0.00043045265715,  0.00353362917585,    0.014508561498}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{  1.9063641886e-10, 3.42879664564e-07,   2.509391952e-05, 0.000742234529884}
+{    0.166238705839,    0.164203697858,    0.148535535877,   0.0702168402446}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{ 1.02000541866e-05, 0.000427061389771,  0.00329146826665,  0.00835551793455}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{ 9.38148581793e-06, 0.000394064486396,   0.0031188816339,  0.00975455935601}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.166238705839,    0.164203697858,    0.148535535877,   0.0702168402446}
+{    0.166238705839,    0.164203697858,    0.148535535877,   0.0702168402446}
+{    0.166238705839,    0.164203697858,    0.148535535877,   0.0702168402446}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{ 8.99087331922e-11, 1.64106651761e-07, 1.34053404113e-05, 0.000658885328381}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{    0.166238705839,    0.164203697858,    0.148535535877,   0.0702168402446}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.209466628291,    0.205435979931,    0.175419907202,   0.0547630843276}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.404345118213,    0.399972705468,    0.366265123406,    0.195033733691}
+{    0.166238705839,    0.164203697858,    0.148535535877,   0.0702168402446}
+{ 1.83661195511e-06, 7.75805035614e-05, 0.000642558662221,  0.00276510223348}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.219644366738,     0.21746500173,    0.200520523252,    0.109793534398}
+{    0.166238705839,    0.164203697858,    0.148535535877,   0.0702168402446}
+};
+
+exepectedRateClassAssignments = 
+{
+{                 0,                 0,                 3,                 0,                 0,                 0,                 0,                 0,                 3,                 0,                 0,                 0,                 0,                 0,                 0,                 0,                 0,                 3,                 0,                 0,                 0,                 0,                 0,                 0,                 0,                 [...]
+};
+
+ExecuteAFile ("../Shared/REL_utils.bf");
+marginalErrors = checkMarginalReconstruction ( expectedConditionalProbabilities, exepectedRateClassAssignments, "SmallCodon_LF");
+
+/* test epilogue */
+	timeMatrix = endTestTimer 				  (_testDescription);
+	if (logTestResult (Abs (res_SmallCodon_LF[1][0] - _expectedLL) < 2*OPTIMIZATION_PRECISION && marginalErrors[0] < 0.0001 && marginalErrors[1] == 0))
+	{
+		return timeMatrix;
+	}
+	return 0;
+/* end test epilogue */
+
+END;
diff --git a/tests/hbltests/RegressionTesting/ClearConstraintsBug.bf b/tests/hbltests/RegressionTesting/ClearConstraintsBug.bf
new file mode 100644
index 0000000..48700f0
--- /dev/null
+++ b/tests/hbltests/RegressionTesting/ClearConstraintsBug.bf
@@ -0,0 +1,683 @@
+#NEXUS
+
+BEGIN TAXA;
+	DIMENSIONS NTAX = 11;
+	TAXLABELS
+		'D1_5' 'D1_10' 'D1_8' 'D1_9' 'D1_7' 'D1_0' 'D1_1' 'D1_2' 'D1_3' 'D1_4' 'D1_6' ;
+END;
+
+BEGIN CHARACTERS;
+	DIMENSIONS NCHAR = 882;
+	FORMAT
+		DATATYPE = DNA
+		GAP=-
+		MISSING=?
+	;
+
+MATRIX
+	'D1_5'   TGCATTGATGATGTGGTTTGCACTGATAATACTACTAGATCCAATTGTACTTTTTTGACTAATGATAATAGTACCACTAATCTTACTTGGGGAAAAATGGAAAAAGGAGAAATAAAAAATTGCTCTTTCAATGTCACCAGTATAACAAATAAGATGCAGAAAGAATATGCACTTTTTTATAAACTTGATGTAATGCCAATAAATAATGACAGTTATACACTGATAAATTGTAACACCTCAGTCATTACACAGGCCTGTCCAAAGGTATCCTTTGAACCCATTCCTATACATTATTGTGCCCCGGCTGGTTTTGCGATTCTAAAGTGTAATAATAAGACATTCAATGGATCAGGACCATGTACAAATGTCAGCACAGTACAATGTACACATGGAATTAGGCCAGTAGTGTCAACTCAACTACTGTTAAATGACAGTCTAGCAGAAGAGGAGGTAATGATTAGGTCTGAGAATTTCTCGGACAA [...]
+	'D1_10'  TGCATTGATGATGTGGTTTGCACTGATAATACTACTAGATCCAATTGTACTTTTTTGACTAATGATAATAGTACCACTAATCTTACTTGGGGAAAAATGGAAAAAGGAGAAATAAAAAATTGCTCTTTCAATGTCACCAGTATAACAAATAAGATGCAGAAAGAATATGCACTTTTTTATAAACTTGATGTAATGCCAATAAATAATGACAGTTATACACTGATAAATTGTAACACCTCAGTCATTACACAGGCCTGTCCAAAGGTATCCTTTGAACCCATTCCTATACATTATTGTGCCCCGGCTGGTTTTGCGATTCTAAAGTGTAATAATAAGACATTCAATGGATCAGGACCATGTACAAATGTCAGCACAGTACAATGTACACATGGAATTAGGCCAGTAGTGTCAACTCAACTACTGTTAAATGGCAGTCTAGCAGAAGAGGAGGTAATGATTAGGTCTGAGAATTTCTCGGACAA [...]
+	'D1_8'   TGCATTGATGATGTGGTTTGCACTGATAATACTACTAGATCCAATTGTACTTTTTTGACTAATGATAATAGTACCACTAATCTTACTTGGGGAAAAATGGAAAAAGGAGAAATAAAAAATTGCTCTTTCAATGTCACCAGTATAACAAATAAGATGCAGAAAGAATATGCACTTTTTTATAAACTTGATGTAATGCCAATAAATAATGACAGTTATACACTGATAAATTGTAACACCTCAGTCATTACACAGGCCTGTCCAAAGGTATCCTTTGAACCCATTCCTATACATTATTGTGCCCCGGCTGGTTTTGCGATTCTAAAGTGTAATAATAAGACATTCAATGGATCAGGACCATGTACAAATGTCAGCACAGTACAATGTACACATGGAATTAGGCCAGTAGTGTCAACTCAACTACTGTTAAATGGCAGTCTAGCAGAAGAGGAGGTAATGATTAGGTCTGAGAATTTCTCGGACAA [...]
+	'D1_9'   TGCATTGATGATGTGGTTTGCACTGATAATACTACTAGATCCAATTGTACTTTTTTGACTAATGATAATAGTACCACTAATCTTACTTGGGGAAAAATGGAAAAAGGAGAAATAAAAAATTGCTCTTTCAATGTCACCAGTATAACAAATAAGATGCAGAAAGAATATGCACTTTTTTATAAACTTGATGTAATGCCAATAAATAATGACAGTTATACACTGATAAATTGTAACACCTCAGTCATTACACAGGCCTGTCCAAAGGTATCCTTTGAACCCATTCCTATACATTATTGTGCCCCGGCTGGTTTTGCGATTCTAAAGTGTAATAATAAGACATTCAATGGATCAGGACCATGTACAAATGTCAGCACAGTACAATGTACACATGGAATTAGGCCAGTAGTGTCAACTCAACTACTGTTAAATGGCAGTCTAGCAGAAGAGGAGGTAATGATTAGGTCTGAGAATTTCTCGGACAA [...]
+	'D1_7'   TGCATTGATGATGTGGTTTGCACTGATAATACTACTAGATCCAATTGTACTTTTTTGACTAATGATAATAGTACCACTAATCTTACTTGGGGAAAAATGGAAAAAGGAGAAATAAAAAATTGCTCTTTCAATGTCACCAGTATAACAAATAAGATGCAGAAAGAATATGCACTTTTTTATAAACTTGATGTAATGCCAATAAATAATGACAGTTATACACTGATAAATTGTAACACCTCAGTCATTACACAGGCCTGTCCAAAGGTATCCTTTGAACCCATTCCTATACATTATTGTGCCCCGGCTGGTTTTGCGATTCTAAAGTGTAATAATAAGACATTCAATGGATCAGGACCATGTACAAATGTCAGCACAGTACAATGTACACATGGAATTAGGCCAGTAGTGTCAACTCAACTACTGTTAAATGGCAGTCTAGCAGAAGAGGAGGTAATGATTAGGTCTGAGAATTTCTCGGACAA [...]
+	'D1_0'   TGCATTGATGATGTGGTTTGCACTGATAATACTACTAGATCCAATTGTACTTTTTTGACTAATGATAATAGTACCACTAATCTTACTTGGGGAAAAATGGAAAAAGGAGAAATAAAAAATTGCTCTTTCAATGTCACCAGTATAACAAATAAGATGCAGAAAGAATATGCACTTTTTTATAAACTTGATGTAATGCCAATAAATAATGACAGTTATACACTGATAAATTGTAACACCTCAGTCATTACACAGGCCTGTCCAAAGGTATCCTTTGAACCCATTCCTATACATTATTGTGCCCCGGCTGGTTTTGCGATTCTAAAGTGTAATAATAAGACATTCAATGGATCAGGACCATGTACAAATGTCAGCACAGTACAATGTACACATGGAATTAGGCCAGTAGTGTCAACTCAACTACTGTTAAATGGCAGTCTAGCAGAAGAGGAGGTAATGATTAGGTCTGAGAATTTCTCGGACAA [...]
+	'D1_1'   TGCATTGATGATGTGGTTTGCACTGATAATACTACTAGATCCAATTGTACTTTTTTGACTAATGATAATAGTACCACTAATCTTACTTGGGGAAAAATGGAAAAAGGAGAAATAAAAAATTGCTCTTTCAATGTCACCAGTATAACAAATAAGATGCAGAAAGAATATGCACTTTTTTATAAACTTGATGTAATGCCAATAAATAATGACAGTTATACACTGATAAATTGTAACACCTCAGTCATTACACAGGCCTGTCCAAAGGTATCCTTTGAACCCATTCCCATACATTATTGTGCCCCGGCTGGTTTTGCGATTCTAAAGTGTAATAATAAGACATTCAATGGATCAGGACCATGTACAAATGTCAGTACAGTACAATGTACACATGGAATCAGGCCAGTAGTGTCAACTCAACTACTGTTAAATGGCAGTCTAGCAGAAGAGGAGGTAATGATTAGGTCTGAGAATTTCTCGAGAAA [...]
+	'D1_2'   TGCATTGATGATGTGGTTTGCACTGATAATACTACTAGATCCAATTGTACTTTTTTGACTAATGATAATAGTACCACTAATCTTACTTGGGGAAAAATGGAAAAAGGAGAAATAAAAAATTGCTCTTTCAATGTCACCAGTATAACAAATAAGATGCAGAAAGAATATGCACTTTTTTATAAACTTGATGTAATGCCGATAAATAATGACAGTTATACACTGATAAATTGTAACACCTCAGTCATTACACAGGCCTGTCCAAAGGTATCCTTTGAACCCATTCCCATACATTATTGTGCCCCGGCTGGTTTTGCGATTCTAAAGTGTAATAATAAGACATTCAATGGATCAGGACCATGTACAAATGTCAGTACAGTACAATGTACACATGGAATCAGGCCAGTAGTGTCAACTCAACTACTGTTAAATGGCAGTCTAGCAGAAGAGGAGGTAATGATTAGGTCTGAGAATTTCTCGAGAAA [...]
+	'D1_3'   TGCATTGATGATGTGGTTTGCACTGATAATACTACTAGATCCAATTGTACTTTTTTGACTAATGATAATAGTACCACTAATCTTACTTGGGGAAAAATGGAAAAAGGAGAAATAAAAAATTGCTCTTTCAATGTCACCAGTATAACAAATAAGATGCAGAAAGAATCTGCACTTTTTTATAAACTTGATGTAATGCCAATAAATAATGACAGTTATACACTGATAAATTGTAACACCTCAGTCATTACACAGGCCTGTCCAAAGGTATCCTTTGAACCCATTCCCATACATTATTGTGCCCCGGCTGGTTTTGCGATTCTAAAGTGTAATAATAAGACATTCAATGGATCAGGACCATGTACAAATGTCAGTACAGTACAATGTACACATGGAATCAGGCCAGTAGTGTCAACTCAACTACTGTTAAATGGCAGTCTAGCAGAAGAGGAGGTAATGATTAGGTCTGAGAATTTCTCGAGAAA [...]
+	'D1_4'   TGCATTGATGATGTGGTTTGCACTGATAATACTACTAGATCCAATTGTACTTTTTTGACTAATGATAATAGTACCACTAATCTTACTTGGGGAAAAATGGAAAAAGGAGAAATAAAAAATTGCTCTTTCAATGTCACCAGTATAACAAATAAGATGCAGAAAGAATATGCACTTTTTTATAAACTTGATGTAATGCCAATAAATAATGACAGTTATACACTGATAAATTGTAACACCTCAGTCATTACACAGGCCTGTCCAAAGGTATCCTTTGAACCCATTCCCATACATTATTGTGCCCCGGCTGGTTTTGCGATTCTAAAGTGTAATAATAAGACATTCAATGGATCAGGACCATGTACAAATGTCAGTACAGTACAATGTACACATGGAATCAGGCCAGTAGTGTCAACTCAACTACTGTTAAATGGCAGTCTAGCAGAAGAGGAGGTAATGATTAGGTCTGAGAATTTCTCGAGAAA [...]
+	'D1_6'   TGCATTGATGATGTGGTTTGCACTGATAATACTACTAGATCCAATTGTACTTTTTTGACTAATGATAATAGTACCACTAATCTTACTTGGGGAAAAATGGAAAAAGGAGAAATAAAAAATTGCTCTTTCAATGTCACCAGTATAACAAATAAGATGCAGAAAGAATATGCACTTTTTTATAAACTTGATGTAATGCCAATAAATAATGACAGTTATACACTGATAAATTGTAACACCTCAGTCATTACACAGGCCTGTCCAAAGGTATCCTTTGAACCCATTCCTATACATTATTGTGCCCCGGCTGGTTTTGCGATTCTAAAGTGTAATAATAAGACATTCAATGGATCAGGACCATGTACAAATGTCAGCACAGTACAATGTACACATGGAATTAGGCCAGTAGTGTCAACTCAACTACTGTTAAATGGCAGTCTAGCAGAAGAGGAGGTAATGATTAGGTCTGAGAATTTCTCGGACAA [...]
+END;
+
+BEGIN TREES;
+	TREE tree = (D1_5:0.00113652,D1_10:0,D1_8:0.00113575,D1_9:0,D1_7:0,D1_0:0,(D1_1:0,D1_2:0.0011321,D1_3:0.00113262,D1_4:0):0.030296,D1_6:0);
+END;
+
+BEGIN HYPHY;
+
+
+global omega=0.4906081221454927;
+global _fasta_part_Shared_GT=0.10978373885463;
+global _fasta_part_Shared_AC=0.3275863477719206;
+global _fasta_part_Shared_AT=0.09055098248123046;
+global _fasta_part_Shared_CG=0.1590071141754616;
+global _fasta_part_Shared_CT=0.6330418473697754;
+_fasta_part_MG94xREV_3x4={61,61};
+_fasta_part_MG94xREV_3x4[0][1]:=_fasta_part_Shared_AC*nonSynRate*0.128015;
+_fasta_part_MG94xREV_3x4[0][2]:=synRate*0.12987;
+_fasta_part_MG94xREV_3x4[0][3]:=_fasta_part_Shared_AT*nonSynRate*0.38188;
+_fasta_part_MG94xREV_3x4[0][4]:=_fasta_part_Shared_AC*nonSynRate*0.226964;
+_fasta_part_MG94xREV_3x4[0][8]:=nonSynRate*0.188312;
+_fasta_part_MG94xREV_3x4[0][12]:=_fasta_part_Shared_AT*nonSynRate*0.259431;
+_fasta_part_MG94xREV_3x4[0][16]:=_fasta_part_Shared_AC*nonSynRate*0.134818;
+_fasta_part_MG94xREV_3x4[0][32]:=nonSynRate*0.238095;
+_fasta_part_MG94xREV_3x4[1][0]:=_fasta_part_Shared_AC*nonSynRate*0.360235;
+_fasta_part_MG94xREV_3x4[1][2]:=_fasta_part_Shared_CG*nonSynRate*0.12987;
+_fasta_part_MG94xREV_3x4[1][3]:=_fasta_part_Shared_CT*synRate*0.38188;
+_fasta_part_MG94xREV_3x4[1][5]:=_fasta_part_Shared_AC*nonSynRate*0.226964;
+_fasta_part_MG94xREV_3x4[1][9]:=nonSynRate*0.188312;
+_fasta_part_MG94xREV_3x4[1][13]:=_fasta_part_Shared_AT*nonSynRate*0.259431;
+_fasta_part_MG94xREV_3x4[1][17]:=_fasta_part_Shared_AC*nonSynRate*0.134818;
+_fasta_part_MG94xREV_3x4[1][33]:=nonSynRate*0.238095;
+_fasta_part_MG94xREV_3x4[1][48]:=_fasta_part_Shared_AT*nonSynRate*0.183673;
+_fasta_part_MG94xREV_3x4[2][0]:=synRate*0.360235;
+_fasta_part_MG94xREV_3x4[2][1]:=_fasta_part_Shared_CG*nonSynRate*0.128015;
+_fasta_part_MG94xREV_3x4[2][3]:=_fasta_part_Shared_GT*nonSynRate*0.38188;
+_fasta_part_MG94xREV_3x4[2][6]:=_fasta_part_Shared_AC*nonSynRate*0.226964;
+_fasta_part_MG94xREV_3x4[2][10]:=nonSynRate*0.188312;
+_fasta_part_MG94xREV_3x4[2][14]:=_fasta_part_Shared_AT*nonSynRate*0.259431;
+_fasta_part_MG94xREV_3x4[2][18]:=_fasta_part_Shared_AC*nonSynRate*0.134818;
+_fasta_part_MG94xREV_3x4[2][34]:=nonSynRate*0.238095;
+_fasta_part_MG94xREV_3x4[3][0]:=_fasta_part_Shared_AT*nonSynRate*0.360235;
+_fasta_part_MG94xREV_3x4[3][1]:=_fasta_part_Shared_CT*synRate*0.128015;
+_fasta_part_MG94xREV_3x4[3][2]:=_fasta_part_Shared_GT*nonSynRate*0.12987;
+_fasta_part_MG94xREV_3x4[3][7]:=_fasta_part_Shared_AC*nonSynRate*0.226964;
+_fasta_part_MG94xREV_3x4[3][11]:=nonSynRate*0.188312;
+_fasta_part_MG94xREV_3x4[3][15]:=_fasta_part_Shared_AT*nonSynRate*0.259431;
+_fasta_part_MG94xREV_3x4[3][19]:=_fasta_part_Shared_AC*nonSynRate*0.134818;
+_fasta_part_MG94xREV_3x4[3][35]:=nonSynRate*0.238095;
+_fasta_part_MG94xREV_3x4[3][49]:=_fasta_part_Shared_AT*nonSynRate*0.183673;
+_fasta_part_MG94xREV_3x4[4][0]:=_fasta_part_Shared_AC*nonSynRate*0.325294;
+_fasta_part_MG94xREV_3x4[4][5]:=_fasta_part_Shared_AC*synRate*0.128015;
+_fasta_part_MG94xREV_3x4[4][6]:=synRate*0.12987;
+_fasta_part_MG94xREV_3x4[4][7]:=_fasta_part_Shared_AT*synRate*0.38188;
+_fasta_part_MG94xREV_3x4[4][8]:=_fasta_part_Shared_CG*nonSynRate*0.188312;
+_fasta_part_MG94xREV_3x4[4][12]:=_fasta_part_Shared_CT*nonSynRate*0.259431;
+_fasta_part_MG94xREV_3x4[4][20]:=_fasta_part_Shared_AC*nonSynRate*0.134818;
+_fasta_part_MG94xREV_3x4[4][36]:=nonSynRate*0.238095;
+_fasta_part_MG94xREV_3x4[4][50]:=_fasta_part_Shared_AT*nonSynRate*0.183673;
+_fasta_part_MG94xREV_3x4[5][1]:=_fasta_part_Shared_AC*nonSynRate*0.325294;
+_fasta_part_MG94xREV_3x4[5][4]:=_fasta_part_Shared_AC*synRate*0.360235;
+_fasta_part_MG94xREV_3x4[5][6]:=_fasta_part_Shared_CG*synRate*0.12987;
+_fasta_part_MG94xREV_3x4[5][7]:=_fasta_part_Shared_CT*synRate*0.38188;
+_fasta_part_MG94xREV_3x4[5][9]:=_fasta_part_Shared_CG*nonSynRate*0.188312;
+_fasta_part_MG94xREV_3x4[5][13]:=_fasta_part_Shared_CT*nonSynRate*0.259431;
+_fasta_part_MG94xREV_3x4[5][21]:=_fasta_part_Shared_AC*nonSynRate*0.134818;
+_fasta_part_MG94xREV_3x4[5][37]:=nonSynRate*0.238095;
+_fasta_part_MG94xREV_3x4[5][51]:=_fasta_part_Shared_AT*nonSynRate*0.183673;
+_fasta_part_MG94xREV_3x4[6][2]:=_fasta_part_Shared_AC*nonSynRate*0.325294;
+_fasta_part_MG94xREV_3x4[6][4]:=synRate*0.360235;
+_fasta_part_MG94xREV_3x4[6][5]:=_fasta_part_Shared_CG*synRate*0.128015;
+_fasta_part_MG94xREV_3x4[6][7]:=_fasta_part_Shared_GT*synRate*0.38188;
+_fasta_part_MG94xREV_3x4[6][10]:=_fasta_part_Shared_CG*nonSynRate*0.188312;
+_fasta_part_MG94xREV_3x4[6][14]:=_fasta_part_Shared_CT*nonSynRate*0.259431;
+_fasta_part_MG94xREV_3x4[6][22]:=_fasta_part_Shared_AC*nonSynRate*0.134818;
+_fasta_part_MG94xREV_3x4[6][38]:=nonSynRate*0.238095;
+_fasta_part_MG94xREV_3x4[6][52]:=_fasta_part_Shared_AT*nonSynRate*0.183673;
+_fasta_part_MG94xREV_3x4[7][3]:=_fasta_part_Shared_AC*nonSynRate*0.325294;
+_fasta_part_MG94xREV_3x4[7][4]:=_fasta_part_Shared_AT*synRate*0.360235;
+_fasta_part_MG94xREV_3x4[7][5]:=_fasta_part_Shared_CT*synRate*0.128015;
+_fasta_part_MG94xREV_3x4[7][6]:=_fasta_part_Shared_GT*synRate*0.12987;
+_fasta_part_MG94xREV_3x4[7][11]:=_fasta_part_Shared_CG*nonSynRate*0.188312;
+_fasta_part_MG94xREV_3x4[7][15]:=_fasta_part_Shared_CT*nonSynRate*0.259431;
+_fasta_part_MG94xREV_3x4[7][23]:=_fasta_part_Shared_AC*nonSynRate*0.134818;
+_fasta_part_MG94xREV_3x4[7][39]:=nonSynRate*0.238095;
+_fasta_part_MG94xREV_3x4[7][53]:=_fasta_part_Shared_AT*nonSynRate*0.183673;
+_fasta_part_MG94xREV_3x4[8][0]:=nonSynRate*0.325294;
+_fasta_part_MG94xREV_3x4[8][4]:=_fasta_part_Shared_CG*nonSynRate*0.226964;
+_fasta_part_MG94xREV_3x4[8][9]:=_fasta_part_Shared_AC*nonSynRate*0.128015;
+_fasta_part_MG94xREV_3x4[8][10]:=synRate*0.12987;
+_fasta_part_MG94xREV_3x4[8][11]:=_fasta_part_Shared_AT*nonSynRate*0.38188;
+_fasta_part_MG94xREV_3x4[8][12]:=_fasta_part_Shared_GT*nonSynRate*0.259431;
+_fasta_part_MG94xREV_3x4[8][24]:=_fasta_part_Shared_AC*synRate*0.134818;
+_fasta_part_MG94xREV_3x4[8][40]:=nonSynRate*0.238095;
+_fasta_part_MG94xREV_3x4[9][1]:=nonSynRate*0.325294;
+_fasta_part_MG94xREV_3x4[9][5]:=_fasta_part_Shared_CG*nonSynRate*0.226964;
+_fasta_part_MG94xREV_3x4[9][8]:=_fasta_part_Shared_AC*nonSynRate*0.360235;
+_fasta_part_MG94xREV_3x4[9][10]:=_fasta_part_Shared_CG*nonSynRate*0.12987;
+_fasta_part_MG94xREV_3x4[9][11]:=_fasta_part_Shared_CT*synRate*0.38188;
+_fasta_part_MG94xREV_3x4[9][13]:=_fasta_part_Shared_GT*nonSynRate*0.259431;
+_fasta_part_MG94xREV_3x4[9][25]:=_fasta_part_Shared_AC*nonSynRate*0.134818;
+_fasta_part_MG94xREV_3x4[9][41]:=nonSynRate*0.238095;
+_fasta_part_MG94xREV_3x4[9][54]:=_fasta_part_Shared_AT*nonSynRate*0.183673;
+_fasta_part_MG94xREV_3x4[10][2]:=nonSynRate*0.325294;
+_fasta_part_MG94xREV_3x4[10][6]:=_fasta_part_Shared_CG*nonSynRate*0.226964;
+_fasta_part_MG94xREV_3x4[10][8]:=synRate*0.360235;
+_fasta_part_MG94xREV_3x4[10][9]:=_fasta_part_Shared_CG*nonSynRate*0.128015;
+_fasta_part_MG94xREV_3x4[10][11]:=_fasta_part_Shared_GT*nonSynRate*0.38188;
+_fasta_part_MG94xREV_3x4[10][14]:=_fasta_part_Shared_GT*nonSynRate*0.259431;
+_fasta_part_MG94xREV_3x4[10][26]:=_fasta_part_Shared_AC*synRate*0.134818;
+_fasta_part_MG94xREV_3x4[10][42]:=nonSynRate*0.238095;
+_fasta_part_MG94xREV_3x4[10][55]:=_fasta_part_Shared_AT*nonSynRate*0.183673;
+_fasta_part_MG94xREV_3x4[11][3]:=nonSynRate*0.325294;
+_fasta_part_MG94xREV_3x4[11][7]:=_fasta_part_Shared_CG*nonSynRate*0.226964;
+_fasta_part_MG94xREV_3x4[11][8]:=_fasta_part_Shared_AT*nonSynRate*0.360235;
+_fasta_part_MG94xREV_3x4[11][9]:=_fasta_part_Shared_CT*synRate*0.128015;
+_fasta_part_MG94xREV_3x4[11][10]:=_fasta_part_Shared_GT*nonSynRate*0.12987;
+_fasta_part_MG94xREV_3x4[11][15]:=_fasta_part_Shared_GT*nonSynRate*0.259431;
+_fasta_part_MG94xREV_3x4[11][27]:=_fasta_part_Shared_AC*nonSynRate*0.134818;
+_fasta_part_MG94xREV_3x4[11][43]:=nonSynRate*0.238095;
+_fasta_part_MG94xREV_3x4[11][56]:=_fasta_part_Shared_AT*nonSynRate*0.183673;
+_fasta_part_MG94xREV_3x4[12][0]:=_fasta_part_Shared_AT*nonSynRate*0.325294;
+_fasta_part_MG94xREV_3x4[12][4]:=_fasta_part_Shared_CT*nonSynRate*0.226964;
+_fasta_part_MG94xREV_3x4[12][8]:=_fasta_part_Shared_GT*nonSynRate*0.188312;
+_fasta_part_MG94xREV_3x4[12][13]:=_fasta_part_Shared_AC*synRate*0.128015;
+_fasta_part_MG94xREV_3x4[12][14]:=nonSynRate*0.12987;
+_fasta_part_MG94xREV_3x4[12][15]:=_fasta_part_Shared_AT*synRate*0.38188;
+_fasta_part_MG94xREV_3x4[12][28]:=_fasta_part_Shared_AC*nonSynRate*0.134818;
+_fasta_part_MG94xREV_3x4[12][44]:=nonSynRate*0.238095;
+_fasta_part_MG94xREV_3x4[12][57]:=_fasta_part_Shared_AT*nonSynRate*0.183673;
+_fasta_part_MG94xREV_3x4[13][1]:=_fasta_part_Shared_AT*nonSynRate*0.325294;
+_fasta_part_MG94xREV_3x4[13][5]:=_fasta_part_Shared_CT*nonSynRate*0.226964;
+_fasta_part_MG94xREV_3x4[13][9]:=_fasta_part_Shared_GT*nonSynRate*0.188312;
+_fasta_part_MG94xREV_3x4[13][12]:=_fasta_part_Shared_AC*synRate*0.360235;
+_fasta_part_MG94xREV_3x4[13][14]:=_fasta_part_Shared_CG*nonSynRate*0.12987;
+_fasta_part_MG94xREV_3x4[13][15]:=_fasta_part_Shared_CT*synRate*0.38188;
+_fasta_part_MG94xREV_3x4[13][29]:=_fasta_part_Shared_AC*nonSynRate*0.134818;
+_fasta_part_MG94xREV_3x4[13][45]:=nonSynRate*0.238095;
+_fasta_part_MG94xREV_3x4[13][58]:=_fasta_part_Shared_AT*nonSynRate*0.183673;
+_fasta_part_MG94xREV_3x4[14][2]:=_fasta_part_Shared_AT*nonSynRate*0.325294;
+_fasta_part_MG94xREV_3x4[14][6]:=_fasta_part_Shared_CT*nonSynRate*0.226964;
+_fasta_part_MG94xREV_3x4[14][10]:=_fasta_part_Shared_GT*nonSynRate*0.188312;
+_fasta_part_MG94xREV_3x4[14][12]:=nonSynRate*0.360235;
+_fasta_part_MG94xREV_3x4[14][13]:=_fasta_part_Shared_CG*nonSynRate*0.128015;
+_fasta_part_MG94xREV_3x4[14][15]:=_fasta_part_Shared_GT*nonSynRate*0.38188;
+_fasta_part_MG94xREV_3x4[14][30]:=_fasta_part_Shared_AC*nonSynRate*0.134818;
+_fasta_part_MG94xREV_3x4[14][46]:=nonSynRate*0.238095;
+_fasta_part_MG94xREV_3x4[14][59]:=_fasta_part_Shared_AT*nonSynRate*0.183673;
+_fasta_part_MG94xREV_3x4[15][3]:=_fasta_part_Shared_AT*nonSynRate*0.325294;
+_fasta_part_MG94xREV_3x4[15][7]:=_fasta_part_Shared_CT*nonSynRate*0.226964;
+_fasta_part_MG94xREV_3x4[15][11]:=_fasta_part_Shared_GT*nonSynRate*0.188312;
+_fasta_part_MG94xREV_3x4[15][12]:=_fasta_part_Shared_AT*synRate*0.360235;
+_fasta_part_MG94xREV_3x4[15][13]:=_fasta_part_Shared_CT*synRate*0.128015;
+_fasta_part_MG94xREV_3x4[15][14]:=_fasta_part_Shared_GT*nonSynRate*0.12987;
+_fasta_part_MG94xREV_3x4[15][31]:=_fasta_part_Shared_AC*nonSynRate*0.134818;
+_fasta_part_MG94xREV_3x4[15][47]:=nonSynRate*0.238095;
+_fasta_part_MG94xREV_3x4[15][60]:=_fasta_part_Shared_AT*nonSynRate*0.183673;
+_fasta_part_MG94xREV_3x4[16][0]:=_fasta_part_Shared_AC*nonSynRate*0.443414;
+_fasta_part_MG94xREV_3x4[16][17]:=_fasta_part_Shared_AC*nonSynRate*0.128015;
+_fasta_part_MG94xREV_3x4[16][18]:=synRate*0.12987;
+_fasta_part_MG94xREV_3x4[16][19]:=_fasta_part_Shared_AT*nonSynRate*0.38188;
+_fasta_part_MG94xREV_3x4[16][20]:=_fasta_part_Shared_AC*nonSynRate*0.226964;
+_fasta_part_MG94xREV_3x4[16][24]:=nonSynRate*0.188312;
+_fasta_part_MG94xREV_3x4[16][28]:=_fasta_part_Shared_AT*nonSynRate*0.259431;
+_fasta_part_MG94xREV_3x4[16][32]:=_fasta_part_Shared_CG*nonSynRate*0.238095;
+_fasta_part_MG94xREV_3x4[17][1]:=_fasta_part_Shared_AC*nonSynRate*0.443414;
+_fasta_part_MG94xREV_3x4[17][16]:=_fasta_part_Shared_AC*nonSynRate*0.360235;
+_fasta_part_MG94xREV_3x4[17][18]:=_fasta_part_Shared_CG*nonSynRate*0.12987;
+_fasta_part_MG94xREV_3x4[17][19]:=_fasta_part_Shared_CT*synRate*0.38188;
+_fasta_part_MG94xREV_3x4[17][21]:=_fasta_part_Shared_AC*nonSynRate*0.226964;
+_fasta_part_MG94xREV_3x4[17][25]:=nonSynRate*0.188312;
+_fasta_part_MG94xREV_3x4[17][29]:=_fasta_part_Shared_AT*nonSynRate*0.259431;
+_fasta_part_MG94xREV_3x4[17][33]:=_fasta_part_Shared_CG*nonSynRate*0.238095;
+_fasta_part_MG94xREV_3x4[17][48]:=_fasta_part_Shared_CT*nonSynRate*0.183673;
+_fasta_part_MG94xREV_3x4[18][2]:=_fasta_part_Shared_AC*nonSynRate*0.443414;
+_fasta_part_MG94xREV_3x4[18][16]:=synRate*0.360235;
+_fasta_part_MG94xREV_3x4[18][17]:=_fasta_part_Shared_CG*nonSynRate*0.128015;
+_fasta_part_MG94xREV_3x4[18][19]:=_fasta_part_Shared_GT*nonSynRate*0.38188;
+_fasta_part_MG94xREV_3x4[18][22]:=_fasta_part_Shared_AC*nonSynRate*0.226964;
+_fasta_part_MG94xREV_3x4[18][26]:=nonSynRate*0.188312;
+_fasta_part_MG94xREV_3x4[18][30]:=_fasta_part_Shared_AT*nonSynRate*0.259431;
+_fasta_part_MG94xREV_3x4[18][34]:=_fasta_part_Shared_CG*nonSynRate*0.238095;
+_fasta_part_MG94xREV_3x4[19][3]:=_fasta_part_Shared_AC*nonSynRate*0.443414;
+_fasta_part_MG94xREV_3x4[19][16]:=_fasta_part_Shared_AT*nonSynRate*0.360235;
+_fasta_part_MG94xREV_3x4[19][17]:=_fasta_part_Shared_CT*synRate*0.128015;
+_fasta_part_MG94xREV_3x4[19][18]:=_fasta_part_Shared_GT*nonSynRate*0.12987;
+_fasta_part_MG94xREV_3x4[19][23]:=_fasta_part_Shared_AC*nonSynRate*0.226964;
+_fasta_part_MG94xREV_3x4[19][27]:=nonSynRate*0.188312;
+_fasta_part_MG94xREV_3x4[19][31]:=_fasta_part_Shared_AT*nonSynRate*0.259431;
+_fasta_part_MG94xREV_3x4[19][35]:=_fasta_part_Shared_CG*nonSynRate*0.238095;
+_fasta_part_MG94xREV_3x4[19][49]:=_fasta_part_Shared_CT*nonSynRate*0.183673;
+_fasta_part_MG94xREV_3x4[20][4]:=_fasta_part_Shared_AC*nonSynRate*0.443414;
+_fasta_part_MG94xREV_3x4[20][16]:=_fasta_part_Shared_AC*nonSynRate*0.325294;
+_fasta_part_MG94xREV_3x4[20][21]:=_fasta_part_Shared_AC*synRate*0.128015;
+_fasta_part_MG94xREV_3x4[20][22]:=synRate*0.12987;
+_fasta_part_MG94xREV_3x4[20][23]:=_fasta_part_Shared_AT*synRate*0.38188;
+_fasta_part_MG94xREV_3x4[20][24]:=_fasta_part_Shared_CG*nonSynRate*0.188312;
+_fasta_part_MG94xREV_3x4[20][28]:=_fasta_part_Shared_CT*nonSynRate*0.259431;
+_fasta_part_MG94xREV_3x4[20][36]:=_fasta_part_Shared_CG*nonSynRate*0.238095;
+_fasta_part_MG94xREV_3x4[20][50]:=_fasta_part_Shared_CT*nonSynRate*0.183673;
+_fasta_part_MG94xREV_3x4[21][5]:=_fasta_part_Shared_AC*nonSynRate*0.443414;
+_fasta_part_MG94xREV_3x4[21][17]:=_fasta_part_Shared_AC*nonSynRate*0.325294;
+_fasta_part_MG94xREV_3x4[21][20]:=_fasta_part_Shared_AC*synRate*0.360235;
+_fasta_part_MG94xREV_3x4[21][22]:=_fasta_part_Shared_CG*synRate*0.12987;
+_fasta_part_MG94xREV_3x4[21][23]:=_fasta_part_Shared_CT*synRate*0.38188;
+_fasta_part_MG94xREV_3x4[21][25]:=_fasta_part_Shared_CG*nonSynRate*0.188312;
+_fasta_part_MG94xREV_3x4[21][29]:=_fasta_part_Shared_CT*nonSynRate*0.259431;
+_fasta_part_MG94xREV_3x4[21][37]:=_fasta_part_Shared_CG*nonSynRate*0.238095;
+_fasta_part_MG94xREV_3x4[21][51]:=_fasta_part_Shared_CT*nonSynRate*0.183673;
+_fasta_part_MG94xREV_3x4[22][6]:=_fasta_part_Shared_AC*nonSynRate*0.443414;
+_fasta_part_MG94xREV_3x4[22][18]:=_fasta_part_Shared_AC*nonSynRate*0.325294;
+_fasta_part_MG94xREV_3x4[22][20]:=synRate*0.360235;
+_fasta_part_MG94xREV_3x4[22][21]:=_fasta_part_Shared_CG*synRate*0.128015;
+_fasta_part_MG94xREV_3x4[22][23]:=_fasta_part_Shared_GT*synRate*0.38188;
+_fasta_part_MG94xREV_3x4[22][26]:=_fasta_part_Shared_CG*nonSynRate*0.188312;
+_fasta_part_MG94xREV_3x4[22][30]:=_fasta_part_Shared_CT*nonSynRate*0.259431;
+_fasta_part_MG94xREV_3x4[22][38]:=_fasta_part_Shared_CG*nonSynRate*0.238095;
+_fasta_part_MG94xREV_3x4[22][52]:=_fasta_part_Shared_CT*nonSynRate*0.183673;
+_fasta_part_MG94xREV_3x4[23][7]:=_fasta_part_Shared_AC*nonSynRate*0.443414;
+_fasta_part_MG94xREV_3x4[23][19]:=_fasta_part_Shared_AC*nonSynRate*0.325294;
+_fasta_part_MG94xREV_3x4[23][20]:=_fasta_part_Shared_AT*synRate*0.360235;
+_fasta_part_MG94xREV_3x4[23][21]:=_fasta_part_Shared_CT*synRate*0.128015;
+_fasta_part_MG94xREV_3x4[23][22]:=_fasta_part_Shared_GT*synRate*0.12987;
+_fasta_part_MG94xREV_3x4[23][27]:=_fasta_part_Shared_CG*nonSynRate*0.188312;
+_fasta_part_MG94xREV_3x4[23][31]:=_fasta_part_Shared_CT*nonSynRate*0.259431;
+_fasta_part_MG94xREV_3x4[23][39]:=_fasta_part_Shared_CG*nonSynRate*0.238095;
+_fasta_part_MG94xREV_3x4[23][53]:=_fasta_part_Shared_CT*nonSynRate*0.183673;
+_fasta_part_MG94xREV_3x4[24][8]:=_fasta_part_Shared_AC*synRate*0.443414;
+_fasta_part_MG94xREV_3x4[24][16]:=nonSynRate*0.325294;
+_fasta_part_MG94xREV_3x4[24][20]:=_fasta_part_Shared_CG*nonSynRate*0.226964;
+_fasta_part_MG94xREV_3x4[24][25]:=_fasta_part_Shared_AC*synRate*0.128015;
+_fasta_part_MG94xREV_3x4[24][26]:=synRate*0.12987;
+_fasta_part_MG94xREV_3x4[24][27]:=_fasta_part_Shared_AT*synRate*0.38188;
+_fasta_part_MG94xREV_3x4[24][28]:=_fasta_part_Shared_GT*nonSynRate*0.259431;
+_fasta_part_MG94xREV_3x4[24][40]:=_fasta_part_Shared_CG*nonSynRate*0.238095;
+_fasta_part_MG94xREV_3x4[25][9]:=_fasta_part_Shared_AC*nonSynRate*0.443414;
+_fasta_part_MG94xREV_3x4[25][17]:=nonSynRate*0.325294;
+_fasta_part_MG94xREV_3x4[25][21]:=_fasta_part_Shared_CG*nonSynRate*0.226964;
+_fasta_part_MG94xREV_3x4[25][24]:=_fasta_part_Shared_AC*synRate*0.360235;
+_fasta_part_MG94xREV_3x4[25][26]:=_fasta_part_Shared_CG*synRate*0.12987;
+_fasta_part_MG94xREV_3x4[25][27]:=_fasta_part_Shared_CT*synRate*0.38188;
+_fasta_part_MG94xREV_3x4[25][29]:=_fasta_part_Shared_GT*nonSynRate*0.259431;
+_fasta_part_MG94xREV_3x4[25][41]:=_fasta_part_Shared_CG*nonSynRate*0.238095;
+_fasta_part_MG94xREV_3x4[25][54]:=_fasta_part_Shared_CT*nonSynRate*0.183673;
+_fasta_part_MG94xREV_3x4[26][10]:=_fasta_part_Shared_AC*synRate*0.443414;
+_fasta_part_MG94xREV_3x4[26][18]:=nonSynRate*0.325294;
+_fasta_part_MG94xREV_3x4[26][22]:=_fasta_part_Shared_CG*nonSynRate*0.226964;
+_fasta_part_MG94xREV_3x4[26][24]:=synRate*0.360235;
+_fasta_part_MG94xREV_3x4[26][25]:=_fasta_part_Shared_CG*synRate*0.128015;
+_fasta_part_MG94xREV_3x4[26][27]:=_fasta_part_Shared_GT*synRate*0.38188;
+_fasta_part_MG94xREV_3x4[26][30]:=_fasta_part_Shared_GT*nonSynRate*0.259431;
+_fasta_part_MG94xREV_3x4[26][42]:=_fasta_part_Shared_CG*nonSynRate*0.238095;
+_fasta_part_MG94xREV_3x4[26][55]:=_fasta_part_Shared_CT*nonSynRate*0.183673;
+_fasta_part_MG94xREV_3x4[27][11]:=_fasta_part_Shared_AC*nonSynRate*0.443414;
+_fasta_part_MG94xREV_3x4[27][19]:=nonSynRate*0.325294;
+_fasta_part_MG94xREV_3x4[27][23]:=_fasta_part_Shared_CG*nonSynRate*0.226964;
+_fasta_part_MG94xREV_3x4[27][24]:=_fasta_part_Shared_AT*synRate*0.360235;
+_fasta_part_MG94xREV_3x4[27][25]:=_fasta_part_Shared_CT*synRate*0.128015;
+_fasta_part_MG94xREV_3x4[27][26]:=_fasta_part_Shared_GT*synRate*0.12987;
+_fasta_part_MG94xREV_3x4[27][31]:=_fasta_part_Shared_GT*nonSynRate*0.259431;
+_fasta_part_MG94xREV_3x4[27][43]:=_fasta_part_Shared_CG*nonSynRate*0.238095;
+_fasta_part_MG94xREV_3x4[27][56]:=_fasta_part_Shared_CT*nonSynRate*0.183673;
+_fasta_part_MG94xREV_3x4[28][12]:=_fasta_part_Shared_AC*nonSynRate*0.443414;
+_fasta_part_MG94xREV_3x4[28][16]:=_fasta_part_Shared_AT*nonSynRate*0.325294;
+_fasta_part_MG94xREV_3x4[28][20]:=_fasta_part_Shared_CT*nonSynRate*0.226964;
+_fasta_part_MG94xREV_3x4[28][24]:=_fasta_part_Shared_GT*nonSynRate*0.188312;
+_fasta_part_MG94xREV_3x4[28][29]:=_fasta_part_Shared_AC*synRate*0.128015;
+_fasta_part_MG94xREV_3x4[28][30]:=synRate*0.12987;
+_fasta_part_MG94xREV_3x4[28][31]:=_fasta_part_Shared_AT*synRate*0.38188;
+_fasta_part_MG94xREV_3x4[28][44]:=_fasta_part_Shared_CG*nonSynRate*0.238095;
+_fasta_part_MG94xREV_3x4[28][57]:=_fasta_part_Shared_CT*synRate*0.183673;
+_fasta_part_MG94xREV_3x4[29][13]:=_fasta_part_Shared_AC*nonSynRate*0.443414;
+_fasta_part_MG94xREV_3x4[29][17]:=_fasta_part_Shared_AT*nonSynRate*0.325294;
+_fasta_part_MG94xREV_3x4[29][21]:=_fasta_part_Shared_CT*nonSynRate*0.226964;
+_fasta_part_MG94xREV_3x4[29][25]:=_fasta_part_Shared_GT*nonSynRate*0.188312;
+_fasta_part_MG94xREV_3x4[29][28]:=_fasta_part_Shared_AC*synRate*0.360235;
+_fasta_part_MG94xREV_3x4[29][30]:=_fasta_part_Shared_CG*synRate*0.12987;
+_fasta_part_MG94xREV_3x4[29][31]:=_fasta_part_Shared_CT*synRate*0.38188;
+_fasta_part_MG94xREV_3x4[29][45]:=_fasta_part_Shared_CG*nonSynRate*0.238095;
+_fasta_part_MG94xREV_3x4[29][58]:=_fasta_part_Shared_CT*nonSynRate*0.183673;
+_fasta_part_MG94xREV_3x4[30][14]:=_fasta_part_Shared_AC*nonSynRate*0.443414;
+_fasta_part_MG94xREV_3x4[30][18]:=_fasta_part_Shared_AT*nonSynRate*0.325294;
+_fasta_part_MG94xREV_3x4[30][22]:=_fasta_part_Shared_CT*nonSynRate*0.226964;
+_fasta_part_MG94xREV_3x4[30][26]:=_fasta_part_Shared_GT*nonSynRate*0.188312;
+_fasta_part_MG94xREV_3x4[30][28]:=synRate*0.360235;
+_fasta_part_MG94xREV_3x4[30][29]:=_fasta_part_Shared_CG*synRate*0.128015;
+_fasta_part_MG94xREV_3x4[30][31]:=_fasta_part_Shared_GT*synRate*0.38188;
+_fasta_part_MG94xREV_3x4[30][46]:=_fasta_part_Shared_CG*nonSynRate*0.238095;
+_fasta_part_MG94xREV_3x4[30][59]:=_fasta_part_Shared_CT*synRate*0.183673;
+_fasta_part_MG94xREV_3x4[31][15]:=_fasta_part_Shared_AC*nonSynRate*0.443414;
+_fasta_part_MG94xREV_3x4[31][19]:=_fasta_part_Shared_AT*nonSynRate*0.325294;
+_fasta_part_MG94xREV_3x4[31][23]:=_fasta_part_Shared_CT*nonSynRate*0.226964;
+_fasta_part_MG94xREV_3x4[31][27]:=_fasta_part_Shared_GT*nonSynRate*0.188312;
+_fasta_part_MG94xREV_3x4[31][28]:=_fasta_part_Shared_AT*synRate*0.360235;
+_fasta_part_MG94xREV_3x4[31][29]:=_fasta_part_Shared_CT*synRate*0.128015;
+_fasta_part_MG94xREV_3x4[31][30]:=_fasta_part_Shared_GT*synRate*0.12987;
+_fasta_part_MG94xREV_3x4[31][47]:=_fasta_part_Shared_CG*nonSynRate*0.238095;
+_fasta_part_MG94xREV_3x4[31][60]:=_fasta_part_Shared_CT*nonSynRate*0.183673;
+_fasta_part_MG94xREV_3x4[32][0]:=nonSynRate*0.443414;
+_fasta_part_MG94xREV_3x4[32][16]:=_fasta_part_Shared_CG*nonSynRate*0.134818;
+_fasta_part_MG94xREV_3x4[32][33]:=_fasta_part_Shared_AC*nonSynRate*0.128015;
+_fasta_part_MG94xREV_3x4[32][34]:=synRate*0.12987;
+_fasta_part_MG94xREV_3x4[32][35]:=_fasta_part_Shared_AT*nonSynRate*0.38188;
+_fasta_part_MG94xREV_3x4[32][36]:=_fasta_part_Shared_AC*nonSynRate*0.226964;
+_fasta_part_MG94xREV_3x4[32][40]:=nonSynRate*0.188312;
+_fasta_part_MG94xREV_3x4[32][44]:=_fasta_part_Shared_AT*nonSynRate*0.259431;
+_fasta_part_MG94xREV_3x4[33][1]:=nonSynRate*0.443414;
+_fasta_part_MG94xREV_3x4[33][17]:=_fasta_part_Shared_CG*nonSynRate*0.134818;
+_fasta_part_MG94xREV_3x4[33][32]:=_fasta_part_Shared_AC*nonSynRate*0.360235;
+_fasta_part_MG94xREV_3x4[33][34]:=_fasta_part_Shared_CG*nonSynRate*0.12987;
+_fasta_part_MG94xREV_3x4[33][35]:=_fasta_part_Shared_CT*synRate*0.38188;
+_fasta_part_MG94xREV_3x4[33][37]:=_fasta_part_Shared_AC*nonSynRate*0.226964;
+_fasta_part_MG94xREV_3x4[33][41]:=nonSynRate*0.188312;
+_fasta_part_MG94xREV_3x4[33][45]:=_fasta_part_Shared_AT*nonSynRate*0.259431;
+_fasta_part_MG94xREV_3x4[33][48]:=_fasta_part_Shared_GT*nonSynRate*0.183673;
+_fasta_part_MG94xREV_3x4[34][2]:=nonSynRate*0.443414;
+_fasta_part_MG94xREV_3x4[34][18]:=_fasta_part_Shared_CG*nonSynRate*0.134818;
+_fasta_part_MG94xREV_3x4[34][32]:=synRate*0.360235;
+_fasta_part_MG94xREV_3x4[34][33]:=_fasta_part_Shared_CG*nonSynRate*0.128015;
+_fasta_part_MG94xREV_3x4[34][35]:=_fasta_part_Shared_GT*nonSynRate*0.38188;
+_fasta_part_MG94xREV_3x4[34][38]:=_fasta_part_Shared_AC*nonSynRate*0.226964;
+_fasta_part_MG94xREV_3x4[34][42]:=nonSynRate*0.188312;
+_fasta_part_MG94xREV_3x4[34][46]:=_fasta_part_Shared_AT*nonSynRate*0.259431;
+_fasta_part_MG94xREV_3x4[35][3]:=nonSynRate*0.443414;
+_fasta_part_MG94xREV_3x4[35][19]:=_fasta_part_Shared_CG*nonSynRate*0.134818;
+_fasta_part_MG94xREV_3x4[35][32]:=_fasta_part_Shared_AT*nonSynRate*0.360235;
+_fasta_part_MG94xREV_3x4[35][33]:=_fasta_part_Shared_CT*synRate*0.128015;
+_fasta_part_MG94xREV_3x4[35][34]:=_fasta_part_Shared_GT*nonSynRate*0.12987;
+_fasta_part_MG94xREV_3x4[35][39]:=_fasta_part_Shared_AC*nonSynRate*0.226964;
+_fasta_part_MG94xREV_3x4[35][43]:=nonSynRate*0.188312;
+_fasta_part_MG94xREV_3x4[35][47]:=_fasta_part_Shared_AT*nonSynRate*0.259431;
+_fasta_part_MG94xREV_3x4[35][49]:=_fasta_part_Shared_GT*nonSynRate*0.183673;
+_fasta_part_MG94xREV_3x4[36][4]:=nonSynRate*0.443414;
+_fasta_part_MG94xREV_3x4[36][20]:=_fasta_part_Shared_CG*nonSynRate*0.134818;
+_fasta_part_MG94xREV_3x4[36][32]:=_fasta_part_Shared_AC*nonSynRate*0.325294;
+_fasta_part_MG94xREV_3x4[36][37]:=_fasta_part_Shared_AC*synRate*0.128015;
+_fasta_part_MG94xREV_3x4[36][38]:=synRate*0.12987;
+_fasta_part_MG94xREV_3x4[36][39]:=_fasta_part_Shared_AT*synRate*0.38188;
+_fasta_part_MG94xREV_3x4[36][40]:=_fasta_part_Shared_CG*nonSynRate*0.188312;
+_fasta_part_MG94xREV_3x4[36][44]:=_fasta_part_Shared_CT*nonSynRate*0.259431;
+_fasta_part_MG94xREV_3x4[36][50]:=_fasta_part_Shared_GT*nonSynRate*0.183673;
+_fasta_part_MG94xREV_3x4[37][5]:=nonSynRate*0.443414;
+_fasta_part_MG94xREV_3x4[37][21]:=_fasta_part_Shared_CG*nonSynRate*0.134818;
+_fasta_part_MG94xREV_3x4[37][33]:=_fasta_part_Shared_AC*nonSynRate*0.325294;
+_fasta_part_MG94xREV_3x4[37][36]:=_fasta_part_Shared_AC*synRate*0.360235;
+_fasta_part_MG94xREV_3x4[37][38]:=_fasta_part_Shared_CG*synRate*0.12987;
+_fasta_part_MG94xREV_3x4[37][39]:=_fasta_part_Shared_CT*synRate*0.38188;
+_fasta_part_MG94xREV_3x4[37][41]:=_fasta_part_Shared_CG*nonSynRate*0.188312;
+_fasta_part_MG94xREV_3x4[37][45]:=_fasta_part_Shared_CT*nonSynRate*0.259431;
+_fasta_part_MG94xREV_3x4[37][51]:=_fasta_part_Shared_GT*nonSynRate*0.183673;
+_fasta_part_MG94xREV_3x4[38][6]:=nonSynRate*0.443414;
+_fasta_part_MG94xREV_3x4[38][22]:=_fasta_part_Shared_CG*nonSynRate*0.134818;
+_fasta_part_MG94xREV_3x4[38][34]:=_fasta_part_Shared_AC*nonSynRate*0.325294;
+_fasta_part_MG94xREV_3x4[38][36]:=synRate*0.360235;
+_fasta_part_MG94xREV_3x4[38][37]:=_fasta_part_Shared_CG*synRate*0.128015;
+_fasta_part_MG94xREV_3x4[38][39]:=_fasta_part_Shared_GT*synRate*0.38188;
+_fasta_part_MG94xREV_3x4[38][42]:=_fasta_part_Shared_CG*nonSynRate*0.188312;
+_fasta_part_MG94xREV_3x4[38][46]:=_fasta_part_Shared_CT*nonSynRate*0.259431;
+_fasta_part_MG94xREV_3x4[38][52]:=_fasta_part_Shared_GT*nonSynRate*0.183673;
+_fasta_part_MG94xREV_3x4[39][7]:=nonSynRate*0.443414;
+_fasta_part_MG94xREV_3x4[39][23]:=_fasta_part_Shared_CG*nonSynRate*0.134818;
+_fasta_part_MG94xREV_3x4[39][35]:=_fasta_part_Shared_AC*nonSynRate*0.325294;
+_fasta_part_MG94xREV_3x4[39][36]:=_fasta_part_Shared_AT*synRate*0.360235;
+_fasta_part_MG94xREV_3x4[39][37]:=_fasta_part_Shared_CT*synRate*0.128015;
+_fasta_part_MG94xREV_3x4[39][38]:=_fasta_part_Shared_GT*synRate*0.12987;
+_fasta_part_MG94xREV_3x4[39][43]:=_fasta_part_Shared_CG*nonSynRate*0.188312;
+_fasta_part_MG94xREV_3x4[39][47]:=_fasta_part_Shared_CT*nonSynRate*0.259431;
+_fasta_part_MG94xREV_3x4[39][53]:=_fasta_part_Shared_GT*nonSynRate*0.183673;
+_fasta_part_MG94xREV_3x4[40][8]:=nonSynRate*0.443414;
+_fasta_part_MG94xREV_3x4[40][24]:=_fasta_part_Shared_CG*nonSynRate*0.134818;
+_fasta_part_MG94xREV_3x4[40][32]:=nonSynRate*0.325294;
+_fasta_part_MG94xREV_3x4[40][36]:=_fasta_part_Shared_CG*nonSynRate*0.226964;
+_fasta_part_MG94xREV_3x4[40][41]:=_fasta_part_Shared_AC*synRate*0.128015;
+_fasta_part_MG94xREV_3x4[40][42]:=synRate*0.12987;
+_fasta_part_MG94xREV_3x4[40][43]:=_fasta_part_Shared_AT*synRate*0.38188;
+_fasta_part_MG94xREV_3x4[40][44]:=_fasta_part_Shared_GT*nonSynRate*0.259431;
+_fasta_part_MG94xREV_3x4[41][9]:=nonSynRate*0.443414;
+_fasta_part_MG94xREV_3x4[41][25]:=_fasta_part_Shared_CG*nonSynRate*0.134818;
+_fasta_part_MG94xREV_3x4[41][33]:=nonSynRate*0.325294;
+_fasta_part_MG94xREV_3x4[41][37]:=_fasta_part_Shared_CG*nonSynRate*0.226964;
+_fasta_part_MG94xREV_3x4[41][40]:=_fasta_part_Shared_AC*synRate*0.360235;
+_fasta_part_MG94xREV_3x4[41][42]:=_fasta_part_Shared_CG*synRate*0.12987;
+_fasta_part_MG94xREV_3x4[41][43]:=_fasta_part_Shared_CT*synRate*0.38188;
+_fasta_part_MG94xREV_3x4[41][45]:=_fasta_part_Shared_GT*nonSynRate*0.259431;
+_fasta_part_MG94xREV_3x4[41][54]:=_fasta_part_Shared_GT*nonSynRate*0.183673;
+_fasta_part_MG94xREV_3x4[42][10]:=nonSynRate*0.443414;
+_fasta_part_MG94xREV_3x4[42][26]:=_fasta_part_Shared_CG*nonSynRate*0.134818;
+_fasta_part_MG94xREV_3x4[42][34]:=nonSynRate*0.325294;
+_fasta_part_MG94xREV_3x4[42][38]:=_fasta_part_Shared_CG*nonSynRate*0.226964;
+_fasta_part_MG94xREV_3x4[42][40]:=synRate*0.360235;
+_fasta_part_MG94xREV_3x4[42][41]:=_fasta_part_Shared_CG*synRate*0.128015;
+_fasta_part_MG94xREV_3x4[42][43]:=_fasta_part_Shared_GT*synRate*0.38188;
+_fasta_part_MG94xREV_3x4[42][46]:=_fasta_part_Shared_GT*nonSynRate*0.259431;
+_fasta_part_MG94xREV_3x4[42][55]:=_fasta_part_Shared_GT*nonSynRate*0.183673;
+_fasta_part_MG94xREV_3x4[43][11]:=nonSynRate*0.443414;
+_fasta_part_MG94xREV_3x4[43][27]:=_fasta_part_Shared_CG*nonSynRate*0.134818;
+_fasta_part_MG94xREV_3x4[43][35]:=nonSynRate*0.325294;
+_fasta_part_MG94xREV_3x4[43][39]:=_fasta_part_Shared_CG*nonSynRate*0.226964;
+_fasta_part_MG94xREV_3x4[43][40]:=_fasta_part_Shared_AT*synRate*0.360235;
+_fasta_part_MG94xREV_3x4[43][41]:=_fasta_part_Shared_CT*synRate*0.128015;
+_fasta_part_MG94xREV_3x4[43][42]:=_fasta_part_Shared_GT*synRate*0.12987;
+_fasta_part_MG94xREV_3x4[43][47]:=_fasta_part_Shared_GT*nonSynRate*0.259431;
+_fasta_part_MG94xREV_3x4[43][56]:=_fasta_part_Shared_GT*nonSynRate*0.183673;
+_fasta_part_MG94xREV_3x4[44][12]:=nonSynRate*0.443414;
+_fasta_part_MG94xREV_3x4[44][28]:=_fasta_part_Shared_CG*nonSynRate*0.134818;
+_fasta_part_MG94xREV_3x4[44][32]:=_fasta_part_Shared_AT*nonSynRate*0.325294;
+_fasta_part_MG94xREV_3x4[44][36]:=_fasta_part_Shared_CT*nonSynRate*0.226964;
+_fasta_part_MG94xREV_3x4[44][40]:=_fasta_part_Shared_GT*nonSynRate*0.188312;
+_fasta_part_MG94xREV_3x4[44][45]:=_fasta_part_Shared_AC*synRate*0.128015;
+_fasta_part_MG94xREV_3x4[44][46]:=synRate*0.12987;
+_fasta_part_MG94xREV_3x4[44][47]:=_fasta_part_Shared_AT*synRate*0.38188;
+_fasta_part_MG94xREV_3x4[44][57]:=_fasta_part_Shared_GT*nonSynRate*0.183673;
+_fasta_part_MG94xREV_3x4[45][13]:=nonSynRate*0.443414;
+_fasta_part_MG94xREV_3x4[45][29]:=_fasta_part_Shared_CG*nonSynRate*0.134818;
+_fasta_part_MG94xREV_3x4[45][33]:=_fasta_part_Shared_AT*nonSynRate*0.325294;
+_fasta_part_MG94xREV_3x4[45][37]:=_fasta_part_Shared_CT*nonSynRate*0.226964;
+_fasta_part_MG94xREV_3x4[45][41]:=_fasta_part_Shared_GT*nonSynRate*0.188312;
+_fasta_part_MG94xREV_3x4[45][44]:=_fasta_part_Shared_AC*synRate*0.360235;
+_fasta_part_MG94xREV_3x4[45][46]:=_fasta_part_Shared_CG*synRate*0.12987;
+_fasta_part_MG94xREV_3x4[45][47]:=_fasta_part_Shared_CT*synRate*0.38188;
+_fasta_part_MG94xREV_3x4[45][58]:=_fasta_part_Shared_GT*nonSynRate*0.183673;
+_fasta_part_MG94xREV_3x4[46][14]:=nonSynRate*0.443414;
+_fasta_part_MG94xREV_3x4[46][30]:=_fasta_part_Shared_CG*nonSynRate*0.134818;
+_fasta_part_MG94xREV_3x4[46][34]:=_fasta_part_Shared_AT*nonSynRate*0.325294;
+_fasta_part_MG94xREV_3x4[46][38]:=_fasta_part_Shared_CT*nonSynRate*0.226964;
+_fasta_part_MG94xREV_3x4[46][42]:=_fasta_part_Shared_GT*nonSynRate*0.188312;
+_fasta_part_MG94xREV_3x4[46][44]:=synRate*0.360235;
+_fasta_part_MG94xREV_3x4[46][45]:=_fasta_part_Shared_CG*synRate*0.128015;
+_fasta_part_MG94xREV_3x4[46][47]:=_fasta_part_Shared_GT*synRate*0.38188;
+_fasta_part_MG94xREV_3x4[46][59]:=_fasta_part_Shared_GT*nonSynRate*0.183673;
+_fasta_part_MG94xREV_3x4[47][15]:=nonSynRate*0.443414;
+_fasta_part_MG94xREV_3x4[47][31]:=_fasta_part_Shared_CG*nonSynRate*0.134818;
+_fasta_part_MG94xREV_3x4[47][35]:=_fasta_part_Shared_AT*nonSynRate*0.325294;
+_fasta_part_MG94xREV_3x4[47][39]:=_fasta_part_Shared_CT*nonSynRate*0.226964;
+_fasta_part_MG94xREV_3x4[47][43]:=_fasta_part_Shared_GT*nonSynRate*0.188312;
+_fasta_part_MG94xREV_3x4[47][44]:=_fasta_part_Shared_AT*synRate*0.360235;
+_fasta_part_MG94xREV_3x4[47][45]:=_fasta_part_Shared_CT*synRate*0.128015;
+_fasta_part_MG94xREV_3x4[47][46]:=_fasta_part_Shared_GT*synRate*0.12987;
+_fasta_part_MG94xREV_3x4[47][60]:=_fasta_part_Shared_GT*nonSynRate*0.183673;
+_fasta_part_MG94xREV_3x4[48][1]:=_fasta_part_Shared_AT*nonSynRate*0.443414;
+_fasta_part_MG94xREV_3x4[48][17]:=_fasta_part_Shared_CT*nonSynRate*0.134818;
+_fasta_part_MG94xREV_3x4[48][33]:=_fasta_part_Shared_GT*nonSynRate*0.238095;
+_fasta_part_MG94xREV_3x4[48][49]:=_fasta_part_Shared_CT*synRate*0.38188;
+_fasta_part_MG94xREV_3x4[48][51]:=_fasta_part_Shared_AC*nonSynRate*0.226964;
+_fasta_part_MG94xREV_3x4[48][54]:=nonSynRate*0.188312;
+_fasta_part_MG94xREV_3x4[48][58]:=_fasta_part_Shared_AT*nonSynRate*0.259431;
+_fasta_part_MG94xREV_3x4[49][3]:=_fasta_part_Shared_AT*nonSynRate*0.443414;
+_fasta_part_MG94xREV_3x4[49][19]:=_fasta_part_Shared_CT*nonSynRate*0.134818;
+_fasta_part_MG94xREV_3x4[49][35]:=_fasta_part_Shared_GT*nonSynRate*0.238095;
+_fasta_part_MG94xREV_3x4[49][48]:=_fasta_part_Shared_CT*synRate*0.128015;
+_fasta_part_MG94xREV_3x4[49][53]:=_fasta_part_Shared_AC*nonSynRate*0.226964;
+_fasta_part_MG94xREV_3x4[49][56]:=nonSynRate*0.188312;
+_fasta_part_MG94xREV_3x4[49][60]:=_fasta_part_Shared_AT*nonSynRate*0.259431;
+_fasta_part_MG94xREV_3x4[50][4]:=_fasta_part_Shared_AT*nonSynRate*0.443414;
+_fasta_part_MG94xREV_3x4[50][20]:=_fasta_part_Shared_CT*nonSynRate*0.134818;
+_fasta_part_MG94xREV_3x4[50][36]:=_fasta_part_Shared_GT*nonSynRate*0.238095;
+_fasta_part_MG94xREV_3x4[50][51]:=_fasta_part_Shared_AC*synRate*0.128015;
+_fasta_part_MG94xREV_3x4[50][52]:=synRate*0.12987;
+_fasta_part_MG94xREV_3x4[50][53]:=_fasta_part_Shared_AT*synRate*0.38188;
+_fasta_part_MG94xREV_3x4[50][57]:=_fasta_part_Shared_CT*nonSynRate*0.259431;
+_fasta_part_MG94xREV_3x4[51][5]:=_fasta_part_Shared_AT*nonSynRate*0.443414;
+_fasta_part_MG94xREV_3x4[51][21]:=_fasta_part_Shared_CT*nonSynRate*0.134818;
+_fasta_part_MG94xREV_3x4[51][37]:=_fasta_part_Shared_GT*nonSynRate*0.238095;
+_fasta_part_MG94xREV_3x4[51][48]:=_fasta_part_Shared_AC*nonSynRate*0.325294;
+_fasta_part_MG94xREV_3x4[51][50]:=_fasta_part_Shared_AC*synRate*0.360235;
+_fasta_part_MG94xREV_3x4[51][52]:=_fasta_part_Shared_CG*synRate*0.12987;
+_fasta_part_MG94xREV_3x4[51][53]:=_fasta_part_Shared_CT*synRate*0.38188;
+_fasta_part_MG94xREV_3x4[51][54]:=_fasta_part_Shared_CG*nonSynRate*0.188312;
+_fasta_part_MG94xREV_3x4[51][58]:=_fasta_part_Shared_CT*nonSynRate*0.259431;
+_fasta_part_MG94xREV_3x4[52][6]:=_fasta_part_Shared_AT*nonSynRate*0.443414;
+_fasta_part_MG94xREV_3x4[52][22]:=_fasta_part_Shared_CT*nonSynRate*0.134818;
+_fasta_part_MG94xREV_3x4[52][38]:=_fasta_part_Shared_GT*nonSynRate*0.238095;
+_fasta_part_MG94xREV_3x4[52][50]:=synRate*0.360235;
+_fasta_part_MG94xREV_3x4[52][51]:=_fasta_part_Shared_CG*synRate*0.128015;
+_fasta_part_MG94xREV_3x4[52][53]:=_fasta_part_Shared_GT*synRate*0.38188;
+_fasta_part_MG94xREV_3x4[52][55]:=_fasta_part_Shared_CG*nonSynRate*0.188312;
+_fasta_part_MG94xREV_3x4[52][59]:=_fasta_part_Shared_CT*nonSynRate*0.259431;
+_fasta_part_MG94xREV_3x4[53][7]:=_fasta_part_Shared_AT*nonSynRate*0.443414;
+_fasta_part_MG94xREV_3x4[53][23]:=_fasta_part_Shared_CT*nonSynRate*0.134818;
+_fasta_part_MG94xREV_3x4[53][39]:=_fasta_part_Shared_GT*nonSynRate*0.238095;
+_fasta_part_MG94xREV_3x4[53][49]:=_fasta_part_Shared_AC*nonSynRate*0.325294;
+_fasta_part_MG94xREV_3x4[53][50]:=_fasta_part_Shared_AT*synRate*0.360235;
+_fasta_part_MG94xREV_3x4[53][51]:=_fasta_part_Shared_CT*synRate*0.128015;
+_fasta_part_MG94xREV_3x4[53][52]:=_fasta_part_Shared_GT*synRate*0.12987;
+_fasta_part_MG94xREV_3x4[53][56]:=_fasta_part_Shared_CG*nonSynRate*0.188312;
+_fasta_part_MG94xREV_3x4[53][60]:=_fasta_part_Shared_CT*nonSynRate*0.259431;
+_fasta_part_MG94xREV_3x4[54][9]:=_fasta_part_Shared_AT*nonSynRate*0.443414;
+_fasta_part_MG94xREV_3x4[54][25]:=_fasta_part_Shared_CT*nonSynRate*0.134818;
+_fasta_part_MG94xREV_3x4[54][41]:=_fasta_part_Shared_GT*nonSynRate*0.238095;
+_fasta_part_MG94xREV_3x4[54][48]:=nonSynRate*0.325294;
+_fasta_part_MG94xREV_3x4[54][51]:=_fasta_part_Shared_CG*nonSynRate*0.226964;
+_fasta_part_MG94xREV_3x4[54][55]:=_fasta_part_Shared_CG*nonSynRate*0.12987;
+_fasta_part_MG94xREV_3x4[54][56]:=_fasta_part_Shared_CT*synRate*0.38188;
+_fasta_part_MG94xREV_3x4[54][58]:=_fasta_part_Shared_GT*nonSynRate*0.259431;
+_fasta_part_MG94xREV_3x4[55][10]:=_fasta_part_Shared_AT*nonSynRate*0.443414;
+_fasta_part_MG94xREV_3x4[55][26]:=_fasta_part_Shared_CT*nonSynRate*0.134818;
+_fasta_part_MG94xREV_3x4[55][42]:=_fasta_part_Shared_GT*nonSynRate*0.238095;
+_fasta_part_MG94xREV_3x4[55][52]:=_fasta_part_Shared_CG*nonSynRate*0.226964;
+_fasta_part_MG94xREV_3x4[55][54]:=_fasta_part_Shared_CG*nonSynRate*0.128015;
+_fasta_part_MG94xREV_3x4[55][56]:=_fasta_part_Shared_GT*nonSynRate*0.38188;
+_fasta_part_MG94xREV_3x4[55][59]:=_fasta_part_Shared_GT*nonSynRate*0.259431;
+_fasta_part_MG94xREV_3x4[56][11]:=_fasta_part_Shared_AT*nonSynRate*0.443414;
+_fasta_part_MG94xREV_3x4[56][27]:=_fasta_part_Shared_CT*nonSynRate*0.134818;
+_fasta_part_MG94xREV_3x4[56][43]:=_fasta_part_Shared_GT*nonSynRate*0.238095;
+_fasta_part_MG94xREV_3x4[56][49]:=nonSynRate*0.325294;
+_fasta_part_MG94xREV_3x4[56][53]:=_fasta_part_Shared_CG*nonSynRate*0.226964;
+_fasta_part_MG94xREV_3x4[56][54]:=_fasta_part_Shared_CT*synRate*0.128015;
+_fasta_part_MG94xREV_3x4[56][55]:=_fasta_part_Shared_GT*nonSynRate*0.12987;
+_fasta_part_MG94xREV_3x4[56][60]:=_fasta_part_Shared_GT*nonSynRate*0.259431;
+_fasta_part_MG94xREV_3x4[57][12]:=_fasta_part_Shared_AT*nonSynRate*0.443414;
+_fasta_part_MG94xREV_3x4[57][28]:=_fasta_part_Shared_CT*synRate*0.134818;
+_fasta_part_MG94xREV_3x4[57][44]:=_fasta_part_Shared_GT*nonSynRate*0.238095;
+_fasta_part_MG94xREV_3x4[57][50]:=_fasta_part_Shared_CT*nonSynRate*0.226964;
+_fasta_part_MG94xREV_3x4[57][58]:=_fasta_part_Shared_AC*nonSynRate*0.128015;
+_fasta_part_MG94xREV_3x4[57][59]:=synRate*0.12987;
+_fasta_part_MG94xREV_3x4[57][60]:=_fasta_part_Shared_AT*nonSynRate*0.38188;
+_fasta_part_MG94xREV_3x4[58][13]:=_fasta_part_Shared_AT*nonSynRate*0.443414;
+_fasta_part_MG94xREV_3x4[58][29]:=_fasta_part_Shared_CT*nonSynRate*0.134818;
+_fasta_part_MG94xREV_3x4[58][45]:=_fasta_part_Shared_GT*nonSynRate*0.238095;
+_fasta_part_MG94xREV_3x4[58][48]:=_fasta_part_Shared_AT*nonSynRate*0.325294;
+_fasta_part_MG94xREV_3x4[58][51]:=_fasta_part_Shared_CT*nonSynRate*0.226964;
+_fasta_part_MG94xREV_3x4[58][54]:=_fasta_part_Shared_GT*nonSynRate*0.188312;
+_fasta_part_MG94xREV_3x4[58][57]:=_fasta_part_Shared_AC*nonSynRate*0.360235;
+_fasta_part_MG94xREV_3x4[58][59]:=_fasta_part_Shared_CG*nonSynRate*0.12987;
+_fasta_part_MG94xREV_3x4[58][60]:=_fasta_part_Shared_CT*synRate*0.38188;
+_fasta_part_MG94xREV_3x4[59][14]:=_fasta_part_Shared_AT*nonSynRate*0.443414;
+_fasta_part_MG94xREV_3x4[59][30]:=_fasta_part_Shared_CT*synRate*0.134818;
+_fasta_part_MG94xREV_3x4[59][46]:=_fasta_part_Shared_GT*nonSynRate*0.238095;
+_fasta_part_MG94xREV_3x4[59][52]:=_fasta_part_Shared_CT*nonSynRate*0.226964;
+_fasta_part_MG94xREV_3x4[59][55]:=_fasta_part_Shared_GT*nonSynRate*0.188312;
+_fasta_part_MG94xREV_3x4[59][57]:=synRate*0.360235;
+_fasta_part_MG94xREV_3x4[59][58]:=_fasta_part_Shared_CG*nonSynRate*0.128015;
+_fasta_part_MG94xREV_3x4[59][60]:=_fasta_part_Shared_GT*nonSynRate*0.38188;
+_fasta_part_MG94xREV_3x4[60][15]:=_fasta_part_Shared_AT*nonSynRate*0.443414;
+_fasta_part_MG94xREV_3x4[60][31]:=_fasta_part_Shared_CT*nonSynRate*0.134818;
+_fasta_part_MG94xREV_3x4[60][47]:=_fasta_part_Shared_GT*nonSynRate*0.238095;
+_fasta_part_MG94xREV_3x4[60][49]:=_fasta_part_Shared_AT*nonSynRate*0.325294;
+_fasta_part_MG94xREV_3x4[60][53]:=_fasta_part_Shared_CT*nonSynRate*0.226964;
+_fasta_part_MG94xREV_3x4[60][56]:=_fasta_part_Shared_GT*nonSynRate*0.188312;
+_fasta_part_MG94xREV_3x4[60][57]:=_fasta_part_Shared_AT*nonSynRate*0.360235;
+_fasta_part_MG94xREV_3x4[60][58]:=_fasta_part_Shared_CT*synRate*0.128015;
+_fasta_part_MG94xREV_3x4[60][59]:=_fasta_part_Shared_GT*nonSynRate*0.12987;
+
+
+_fasta_part_Freqs={
+{   0.0542236230763}
+{   0.0192691673421}
+{    0.019548430637}
+{   0.0574816948491}
+{   0.0378328320704}
+{   0.0134444570619}
+{   0.0136393042657}
+{    0.040106049448}
+{   0.0313899110774}
+{   0.0111548696876}
+{   0.0113165344657}
+{   0.0332760001551}
+{   0.0432448857044}
+{   0.0153677104563}
+{   0.0155904308977}
+{    0.045843290854}
+{   0.0164864014374}
+{  0.00585868686274}
+{    0.005943595368}
+{   0.0174770006654}
+{    0.011502869444}
+{  0.00408771497838}
+{  0.00414695722444}
+{   0.0121940289814}
+{  0.00954393391197}
+{  0.00339157823138}
+{  0.00344073153908}
+{   0.0101173891685}
+{   0.0131483752909}
+{  0.00467246984586}
+{  0.00474018680014}
+{   0.0139384064242}
+{   0.0291158924468}
+{   0.0103467634961}
+{   0.0104967165903}
+{   0.0308653452119}
+{   0.0203147006236}
+{  0.00721912966365}
+{  0.00732375473124}
+{   0.0215353264121}
+{   0.0168551126427}
+{  0.00598971384899}
+{  0.00607652129608}
+{    0.017867866192}
+{   0.0232207545275}
+{  0.00825183894796}
+{  0.00837143081677}
+{   0.0246159929969}
+{  0.00798178898273}
+{   0.0238104091635}
+{    0.015671340481}
+{  0.00556904288339}
+{  0.00564975364981}
+{   0.0166129660893}
+{   0.0046206363978}
+{  0.00468760214269}
+{    0.013783782491}
+{   0.0179131534926}
+{  0.00636570433128}
+{  0.00645796091579}
+{   0.0189894803119}
+}
+;
+Model _fasta_part_MG94xREV_3x4_model=(_fasta_part_MG94xREV_3x4,_fasta_part_Freqs,0);
+
+UseModel (_fasta_part_MG94xREV_3x4_model);
+Tree _fasta_tree=(D1_5,D1_10,D1_8,D1_9,D1_7,D1_0,(D1_1,D1_2,D1_3,D1_4)Node7,D1_6);
+
+_fasta_tree.D1_3.synRate=0.006957042058010423;
+_fasta_tree.D1_2.synRate=0.006951740248521895;
+_fasta_tree.D1_1.synRate=0;
+_fasta_tree.D1_0.synRate=0;
+_fasta_tree.Node7.synRate=0.1871920897518702;
+_fasta_tree.D1_4.synRate=0;
+_fasta_tree.D1_6.synRate=0;
+_fasta_tree.D1_7.synRate=0;
+_fasta_tree.D1_5.synRate=0.006995758267155891;
+_fasta_tree.D1_10.synRate=0;
+_fasta_tree.D1_8.synRate=0.006987551134318812;
+_fasta_tree.D1_9.synRate=0;
+_fasta_tree.D1_9.nonSynRate:=omega*_fasta_tree.D1_9.synRate;
+_fasta_tree.D1_10.nonSynRate:=omega*_fasta_tree.D1_10.synRate;
+_fasta_tree.D1_8.nonSynRate:=omega*_fasta_tree.D1_8.synRate;
+_fasta_tree.D1_5.nonSynRate:=omega*_fasta_tree.D1_5.synRate;
+_fasta_tree.D1_7.nonSynRate:=omega*_fasta_tree.D1_7.synRate;
+_fasta_tree.D1_0.nonSynRate:=omega*_fasta_tree.D1_0.synRate;
+_fasta_tree.D1_1.nonSynRate:=omega*_fasta_tree.D1_1.synRate;
+_fasta_tree.D1_2.nonSynRate:=omega*_fasta_tree.D1_2.synRate;
+_fasta_tree.D1_3.nonSynRate:=omega*_fasta_tree.D1_3.synRate;
+_fasta_tree.D1_4.nonSynRate:=omega*_fasta_tree.D1_4.synRate;
+_fasta_tree.Node7.nonSynRate:=omega*_fasta_tree.Node7.synRate;
+_fasta_tree.D1_6.nonSynRate:=omega*_fasta_tree.D1_6.synRate;
+DataSet _fasta = ReadDataFile(USE_NEXUS_FILE_DATA);
+DataSetFilter _fasta_part = CreateFilter(_fasta,3,"0-881","0-10","TAA,TAG,TGA");
+LikelihoodFunction _fasta_LF = (_fasta_part,_fasta_tree);
+
+fprintf (stdout, _fasta_LF);
+
+Tree _fasta_tree2=(D1_5,D1_10,D1_8,D1_9,D1_7,D1_0,(D1_1,D1_2,D1_3,D1_4)Node7,D1_6);
+LikelihoodFunction _fasta_LF_2 = (_fasta_part,_fasta_tree2);
+_fasta_tree.Node7.synRate=0.1871920897518702;
+fprintf (stdout, _fasta_LF);
+
+Tree _fasta_tree3=(D1_5,D1_10,D1_8,D1_9,D1_7,D1_0,D1_6,(D1_1,D1_2,D1_3,D1_4)Node7);
+LikelihoodFunction _fasta_LF_3 = (_fasta_part,_fasta_tree3);
+/* this should throw an error */
+_fasta_tree.Node7.synRate=0.1871920897518702;
+fprintf (stdout, _fasta_LF);
+
+END;
\ No newline at end of file
diff --git a/tests/hbltests/RegressionTesting/LocalReferenceBug.bf b/tests/hbltests/RegressionTesting/LocalReferenceBug.bf
new file mode 100644
index 0000000..467c7d6
--- /dev/null
+++ b/tests/hbltests/RegressionTesting/LocalReferenceBug.bf
@@ -0,0 +1,14 @@
+lfunction foo (x) {
+    fprintf (stdout, ^x, "\n");
+}
+
+lfunction bar () {
+    y = "Hai!";
+    foo (&y);
+}
+
+bar ();
+
+x = "Canadian devil!";
+
+fprintf (stdout, "*" , &x, " = ", x, " = ", *(&x), "\n");
\ No newline at end of file
diff --git a/tests/hbltests/RegressionTesting/ParseNexus.bf b/tests/hbltests/RegressionTesting/ParseNexus.bf
new file mode 100644
index 0000000..4c7912d
--- /dev/null
+++ b/tests/hbltests/RegressionTesting/ParseNexus.bf
@@ -0,0 +1,44 @@
+/*
+
+HyPhy - Hypothesis Testing Using Phylogenies.
+
+Copyright (C) 1997-2015
+  Sergei L Kosakovsky Pond (spond at ucsd.edu)
+  Steven Weaver (sweaver at ucsd.edu)
+
+Permission is hereby granted, free of charge, to any person obtaining a
+copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be included
+in all copies or substantial portions of the Software.
+
+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.
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+*/
+
+/* 
+
+  ParseNexus.bf 
+
+  Parses sample Nexus file and asserts that a the correct number of sites have
+  been parsed, the number of species are correct, and that the tree has been
+  found, respectively. 
+
+*/
+
+fileName = "./res/69genes.test.nex";
+DataSet ds	=  ReadDataFile (fileName);
+assert(ds.sites == 2199);
+assert(ds.species == 50);
+assert(DATAFILE_TREE != 0);
diff --git a/tests/hbltests/RegressionTesting/RELAX/segfault.nex b/tests/hbltests/RegressionTesting/RELAX/segfault.nex
new file mode 100644
index 0000000..9e21ad2
--- /dev/null
+++ b/tests/hbltests/RegressionTesting/RELAX/segfault.nex
@@ -0,0 +1,86 @@
+#NEXUS
+
+[
+Generated by HYPHY 2.1120130115beta(MP) for Linux on x86_64 on Mon Jan  5 13:07:28 2015
+
+]
+
+BEGIN TAXA;
+	DIMENSIONS NTAX = 61;
+	TAXLABELS
+		'70' '151' '1150' '50' '30' '80' '471' '270' '501' '310' '460' '330' '290' '520' '560' '540' '20' '60' '511' '1281' '90' '130' '571' '301' '281' '531' '490' '640' '961' '740' '591' '1260' '11' '191' '231' '161' '1110' '141' '171' '670' '1200' '241' '1270' '1190' '680' '941' '650' '970' '700' '431' '1250' '1210' '770' '720' '750' '1070' '811' '1220' '401' '181' '1180' ;
+END;
+
+BEGIN CHARACTERS;
+	DIMENSIONS NCHAR = 681;
+	FORMAT
+		DATATYPE = DNA
+
+		GAP=-
+		MISSING=?
+		NOLABELS
+	;
+
+MATRIX
+ ------GTTCTTATGAGAAGAATGGCTCTTAAGAAATTGAAGGTGATACCAAAGGAAGGTTACTTATTACTTTTGGACTTTGATGATGAGGACGATGACATAAAAGTTTCAGAGGAGGCTCTTTCAGAAGTAAAGAGCCCAGCATTTGATAAAAATGAGAATATATCACCTCAAGCAGAAGCAGATGAAGATATCGGAGATGAAGTAGATAGTATGTTGGATAAATCTGAAGTAAACAACCCAGAAATTGGTAAAGATGAAAATATATCGCCTCAAGTAAAAGGAGATGAAGACATGGGACATGAAGTAGGCAGTATGTTGGATAAATCTGGAGATGACATTTATAAGACGCTTCACATAAAGAGAAAATGGATGGAAACTTATGTCAAAGAATCTTTCAAAGGCAGCAACCAGAAATTAGAAAGATTTTGCAAAATGAACGAACGAGAGAGGAAGAACATCAACAACAAATTTGTGAGCAGTATA----- [...]
+ ------GTTCTTATGAGAAGAATGGCTCTTAAGAAATTGAAGGTGATACCAAAGGAAGGTTACTTATTACTTTTGGACTTTGATGATGAGGACGATGACATAAAAGTTTCAGAGGAGGCTCTTTCGGAAGTAAAGAGCCCAGCATTTGATAAAAATGAGAATATATCGCCTCAAGCAGAAGCAGATGAAGATATGGGAGATGAAGTAGACAGTATGTTGGATAAATATGAAGTAAATAATCCAGCAATTGGTAAAGATGAAAATATATCGCCTCAAGTAAAAGGAGATGAAGACATGGGACATGAAGTAGGCAGTATGTTGGATAAATCTGGAGATGACATTTATAAGACGCTTCACATAAAGAGAAAATGGATGGAAACTTATGTCAAAGAATCTTTCAAAGGCAGCAACCAGAAATTAGAAAGATTTTGCAAAACGAACGAACGAGAGAGGAAGAACATCAACAACAAATTTTGTGAGCAGTATATATC [...]
+ ------GTTCTTATGAGAAGAATGGCTCTTAAGAAATTGAAGGTGATACCAAAGGAAGGTTACTTATTACTTTTGGACTTTGATGATGAGGACGATGACATAAAAGTTTCAGAGGAGGCTCTTTCGGAAGTAAAGAGCCCAGCATTTGATAAAAATGAGAATATATCGCCTCAAGCAGAAGCAGATGAAGATATGGGAGATGAAGTAGACAGTATGTTGGATAAATATGAAGTAAATAATCCAGCAATTGGTAAAGATGAAAATATATCGCCTCAAGTAAAAGGAGATGAAGACATGGGACATGAAGTAGGCAGTATGTTGGATAAATCTGGAGATGACATTTATAAGACGCTTCACATAAAGAGAAAATGGATGGAAACTTATGTCAAAGAATCTTTCAAAGGCAGCAACCAGAAATTAGAAAGATTTTGCAAAACGAACGAACGAGAGAGGAAGAACATCAACAACAAATTTTGTGAGCAGTATATATC [...]
+ ------GTTCTTATGAGAAGAATGGCTCTTAAGAAATTGAAGGTGATACCAAAGGAAGGTTACTTATTACTTTTGGACTTTGATGATGAGGACGATGACATAAAAGTTTCAGAGGAGGCTCTTTCGGAAGTAAAGAGCCCAGCATTTGATAAAAATGAGAATATATCGCCTCAAGCAGAAGCAGATGAAGATATGGGAGATGAAGTAGACAGTATGTTGGATAAATCTGAAGTAAATAATCCAGCAATTGGTAAAGATGAAAATATATCGCCTCAAGTAAAAGGAGATGAAGACATGGGACATGAAGTAGGCAGTATGTTGGATAAATCTGGAGATGACATTTATAAGACGCTTCACATAAAGAGAAAATGGATGGAAACTTATGTCAAAGAATCTTTCAAAGGCAGCAACCAGAAATTAGAAAGATTTTGCAAAACGAACGAACGAGAGAGGAAGAACATCAACAACAAATTTTGTGAGCAGTATATATC [...]
+ ------GTTCTTATGAGAAGAATGGCTCTTAAGAAATTGAAGGTGATACCAAAGGAAGGTTACTTATTACTTTTGGACTTTGATGATGAGGACGATGACATAAAAGTTTCAGAGGAGGCTCTTTCGGAAGTAAAGAGCCCAGCGTTTGATAAAAATGAGAATATATCGCCTCAAGCAGAAGCAGATGAAGATATGGGAGATGAAGTAGACAGTATGTTGGATAAATCTGAAGTAAATAACCCAGCAATTGGTAAAGATGGAAATATATCGCCTCAAGTAAAAGGAGATGAAGACATGGGACATGAAGTAGGCAGTATGTTGGATAAATCTGGAGATGACATTTATAAGACGCTTCACATAAAGAGAAAATGGATGGAAACTTATGTCAAAGAATCTTTCAAAGGCAGCAACCAGAAATTAGAAAGATTTTGCAAAACGAACGAACGAGAGAGGAAGAACATCAACAACAAATTTTGTGAGCAGTATATAAC [...]
+ ------GTTCTTATGAGAAAAATGGCTCTTAAGAAATTGAAGGTGATACCAAAGGAAGGTTACTTATTACTTTTGGACTTTGATGATGAGGACGATGACATAAAAGTTTCAGAGGAGGCTCTTTCGGAAGTAAAGAGCCCAGCGTTTGATAAAAATGAGAATATATCGCCTCAAGCAGAAGCAGATGAAGATATGGGAGATGAAGTAGACAGTATGTTGGATAAATCTGAAGTAAATAACCCAGCAATTGGTAAAGATGGATATATATCGCCTCAAGTAAAAGGAGATGAAGACATGGGACATGAAGTAGGCAGTATGTTGGATAAATCTGGAGATGACATTTATAAGACGCTTCACATAAAGAGAAAATGGATGGAAACTTATGTCAAAGAATCTTTCAAAGGCAGCAACCAGAAATTAGAAAGATTTTGCAAAACGAACGAACGAGAGAGGAAGAACATCAACAACAAATTTTGTGAGCAGTATATAAC [...]
+ ------GTTCTCATGAGAAAAATGGCTCTTAAGAAATTGAAGGTGATACCAAAGGAAGGTTACTTATTACTTTTGGACTTTGATGATGAGGACGATGACATAAAAGTTTCAGAGGAGGCTCTTTCAGAAGTAAAGAGCCCAGCGTTTGATAAAAATGAGAATATATCGCCTCAAGCAGAAGCAGATGAAGATATGGGAGATGAAGTAGACAGTATGTTGGATAAATCTGAAGTAAATAACCCAGCAATTGGTAAAGATGGATATATATCGCCTCAAGTAAAAGGAGATGAAGACATGGGACATGAAGTAGGCAGTATGTTGGATAAATCTGGAGATGACATTTATAAGACGCTTCACATAAAGAGAAAATGGATGGAAACTTATGTCAAAGAATCTTTCAAAGGCAGCAACCAGAAATTAGAAAGATTTTGCAAAACGAACGAACGAGAGAGGAAGAACATCAACAACAAATTTTGTGAGCAGTATATAAC [...]
+ ------GTTCTTATGAGAAGAATGGCTCTTAAGAAATTGAAGGTGATACCAAAGGAAGGTTACTTATTACTTTTGGACTTTGATGATGAGGACGATGACATGAAAGTTTCAGAGGAGGCTCTTTCGGAAGTAAAGAGCCCAGCGTTTGATAAAAATGAGAATATATCGCCTCAAGCAGAAGCAGATGAAGATATGGGAGATGAAGTAGACAGTATGTTGGATAAATCTGAAGTAAATAACCCAGCAATTGGTAAAGATGGATATATATCGCCTCAAGTAAAAGGAGATGAAGACATGGGACATGAAGTAGGCAGTATGTTGGATAAATCTGGAGATGACATTTATAAGACGCTTCACATAAAGAGAAAATGGATGGAAACTTATGTCAAAGAATCTTTCAAAGGCAGCAACCAGAAATTAGAAAGATTTTGCAAAACGAACGAACGAGAGAGGAAGAACATCAACAACAAATTTTGTGAGCAGTATATAAC [...]
+ ------GTTCTTATGAGAAGAATGGCTCTTAAGAAATTGAAGGTGATACCAAAGGAAGGTTACTTATTACTTTTGGACTTTGATGATGAGGACGATGACATGAAAGTTTCAGAGGAGGCTCTTTCGGAAGTAAAGAGCCCAGCGTTTGATAAAAATGAGAATATATCGCCTCAAGCAGAAGCAGATGAAGATATGGGAGATGAAGTAGACAGTATGTTGGATAAATCTGAAGTAAATAACCCAGCAATTGGTAAAGATGGATATATATCGCCTCAAGTAAAAGGAGATGAAGACATGGGACATGAAGTAGGCAGTATGTTGGATAAATCTGGAGATGACATTTATAAGACGCTTCACATAAAGAGAAAATGGATGGAAACTTATGTCAAAGAATCTTTCAAAGGTAGCAACCAGAAATTAGAAAGATTTTGCAAAACGAACGAACGAGAGAGGAAGAACATCAACAACAAATTTTGTGAGCAGTATATAAC [...]
+ ------GTTCTTATGAGAAGAATGGCTCTTAAGAAATTGAAGGTGATACCAAAGGAAGGTTACTTATTACTTTTGGACTTTGATGATGAGGATGATGACATAAAAGTTTCAGAGGAGGCTCTTTCGGAAGTAAAGAGCCCAGCGTTTGATAAAAATGAGAATATATCGCCTCAAGCAGAAGCAGATGAAGATATGGGAGATGAAGTAGACAGTATGTTGGATAAATCTGAAGTAAATAACCCAGCAATTGGTAAAGATGGATATATATCGCCTCAAGTAAAAGGAGATGAAGACATGGGACATGAAGTAGGCAGTATGTTGGATAAATCTGGAGATGACATTTATAAGACGCTTCACATAAAGAGAAAATGGATGGAAACTTATGTCAAAGAATCTTTCAAAGGCAGCAACCAGAAATTAGAAAGATTTTGCAAAACGAACGAACGAGAGAGGAAGAACATCAACAACAAATTTTGTGAGCAGTATATAAC [...]
+ ------GTTCTTATGAGAAGAATGGCTCTTAAGAAATTGAAGGTGATACCAAAGGAAGGTTACTTATTACTTTTGGACTTTGATGATGAGGATGATGACATAAAAGTTTCAGAGGAGGCTCTTTCGGAAGTAAAGAGCCCAGCGTTTGATAAAAATGAGAATATATCGCCTCAAGCAGAAGCAGATGAAGATATGGGAGATGAAGTAGACAGTATGTTGGATAAATCTGAAGTAAATAACCCAGCAATTGGTAAAGATGGATATATATCGCCTCAAGTAAAAGGAGATGAAGACATGGGACATGAAGTAGGCAGTATGTTGGATAAATCTGGAGATGACATTTATAAGACGCTTCACATAAAGAGAAAATGGATGGAAACTTATGTCAAAGAATCTTTCAAAGGCAGCAACCAGAAATTAGAAAGATTTTGCAAAACGACCGAACGAGAGAGGAAGAACATCAACAACAAATTTTGTGAGCAGTATATAAC [...]
+ ------GTTCTTATGAGAAGAATGGCTCTTAAGAAATTGAAGGTGATACCAAAGGAAGGTTACTTATTACTTTTGGACTTTGATGATGAGGATGATGACATAAAAGTTTCAGAGGAGGTTCTTTCGGAAGTAAAGAGCCCAGCGTTTGATAAAAATGAGAATATATCGCCTCAAGCAGAAGCAGATGAAGATATGGGAGATGAAGTAGACAGTATGTTGGATAAATCTGAAGTAAATAACCCAGCAATTGGTAAAGATGGATATATATCGCCTCAAGTAAAAGGAGATGAAGACATGGGACATGAAGTAGGCAGTATGTTGGATAAATCTGGAGATGACATTTATAAGACACTTCACATAAAGAGAAAATGGATGGAAACTTATGTCAAAGAATCTTTCAAAGGCAGCAACCAGAAATTAGAAAGATTTTGCAAAACGAACGAACGAGAGAGGAAGAACATCAACAACAAATTTTGTGAGCAGTATATAAC [...]
+ ------GTTCTTATGAGAAGAATGGCTCTTAAGAAATTGAAGGTGATACCAAAGGAAGGTTACTTATTACTTTTGGACTTTGATGATGAGGATGATGACATAAAAGTTTCAGAGGAGGCTCTTTCGGAAGTAAAGAGCCCAGCGTTTGATAAAAATGAGAATATATCGCCTCAAGCAGAAGCAGATGAAGATATGGGAGATGAAGTAGACAGTATGTTGGATAAATCTGAAGTAAATAACCCAGCAATTGGTAAAGATGGATATATATCGCCTCAAGTAAAAGGAGATGAAGACATGGGACATGAAGTAGGCAGTATGTTGGATAAATCTGGAGATGACATTTATAAGACGCTTCACATAAAGAGAAAATGGATGGAAACTTATGTCAAAGAATCTTTCAAAGGCAGCAACCAGAAATTAGAAAGATTTTGCAAAACGAACGAACGAGAGAGGAAGAACATCAACAACAAATTTTGTGAGCAGTATATAAC [...]
+ ------GTTCTTATGAGAAGAATGGCTCTTAAGAAATTGAAGGTGATACCAAAGGAAGGTTACTTATTACTTTTGGACTTTGATGATGAGGATGATGACATAAAAGTTTCAGAGGAGGCTCTTTCGGAAGTAAAGAGCCCAGCGTTTGATAAAAATGAGAATATATCGCCTCAAGCAGAAGCAGATGAAGATATGGGAGATGAAGTAGACAGTATGTTGGATAAATCTGAAGTAAATAACCCAGCAATTGGTAAAGATGGATATATATCGCCTCAAGTAAAAGGAGATGAAGACATGGGACATGAAGTAGGCAGTATGTTGGATAAATCTGGAGATGACATTTATAAGACGCTTCACATAAAGAGAAAATGGATGGAAACTTATGTCAAAGAATCTTTCAAAGGCAGCAACCAGAAATTAGAAAGATTTTGCAAAACGAACGAACGAGAGAGGAAGAACATCAACAACAAATTTTGTGAGCAGCATATAAC [...]
+ ------GTTCTTATGAGAAGAATGGCTCTTAAGAAATTGAAGGTGATACCAAAGGAAGGTTACTTATTACTTTTGGACTTTGATGATGAGGATGATGACATAAAAGTTTCAGAGGAGGCTCTTTCGGAAGTAAAGAGCCCAGCGTTTGATAAAAATGAGAATATATCGCCTCAAGCAGAAGCAGATGAAGATATGGGAGATGAAGTAGACAGTATGTTGGATAAATCTGAAGTAAATAACCCAGCAATTGGTAAAGATGGATATATATCGCCTCAAGTAAAAGGAGATGAAGACATGGGACATGAAGTAGCCAGTATGTTGGATAAATCTGGAGATGACATTTATAAGACGCTTCACATAAAGAGAAAATGGATGGAAACTTATGTCAAAGAATCTTTCAAAGGCAGCAACCAGAAATTAGAAAGATTTTGCAAAACGAACGAACGAGAGAGGAAGAACATCAACAACAAATTTTGTGAGCAGCATATAAC [...]
+ ------GTTCTTATGAGAAGAATGGCTCTTAAGAAATTGAAGGTGATACCAAAGGAAGGTTACTTATTACTTTTGGACTTTGATGATGAGGATGATGACATAAAAGTTTCAGAGGAGGCTCTTTCGGAAGTAAAGAGCCCAGCGTTTGATAAAAATGAGAATATATCGCCTCAAGCAGAAGCAGATGAAGATATGGGAGATGAAGTAGACAGTATGTTGGATAAATCTGAAGTAAATAACCCAGCAATTGGTAAAGATGGATATATATCGCCTCAAGTAAAAGGAGATGAAGACATGGGACATGAAGTAGGCAGTATGTTGGATAAATCTGGAGATGACATTTATAAGACGCTTCACATAAAGAGAAAATGGATGGAAACTTATGTCAAAGAATCTTTCAAAGGCAGCAACCAGAAATTAGAAAGATTTTGCAAAACGAACGAACGAGAGAGGAAGAACATCAACAACAAATTTTGTGAGCAGTATATAAC [...]
+ ------GTTCTTATGAGAAGAATGGCTCTTAAGAAATTGAAGGTGATACCAAAGGAAGGTTACTTATTACTTTTGGACTTTGATGATGAGGACGATGACATAAAAGTTTCAGAGGAGGCTCTTCCGGAAGTAAAGAGCCCAGCATTTGATAAAAATGAGAATATATCGCCTCAAGCAGAAGCAGATGAAGATATGGGAGATGAAGTAGATAGTATTTTGGATAAATCTGAAGTAAATAACCCAGCAATTGGTAAAGATGAAAATATATCGCCTCAAGTAAAAGGAGATGAAGACATGGGACATGAAGTAGGCAGTATGTTGGATAAATCTGGAGATGACATTTATAAGATGCTTCACATAAAGAGAAAATGGATGGAAACTTATGTCAAAGAATCATTCAAAGACAGCAACCAGAAATTAGAAAGATTTTGCAAAATGAACGAACGAGAGAGGAAGAACATCAACAACAAATTTTGTGAGCAGTATATAAC [...]
+ ------GTTCTTATGAGAAGAATGGCTCTTAAGAAATTGAAGGTGATACCAAAGGAAGGTTACTTATTACTTTTGGACTTTGATGATGAGGACGATGACATAAAAGTTTCAGAGGAGGCTCTTTCGGAAGTAAAGAGCCAAGCATTTGATAAAAATGAGAATATATCGCCTCAAGCAGAAGCAGATGAAGATATGGGAGATGAAGTAGATAGTATATTGGATAAATCTGAATTAAATAACCCAGCAATTGGTAAAGATGAAAATATATCGCCTCAAGTAAAAGGAGATGAAGACATGGGACATGAAGTAGGCAGTATGTTGGATAAATCTGGAGATGACATTTATAAGACGCTTCACATAAAGAGAAAATTGATGGAAACTTATGTCAAAGAATCTTTCAAAGGCAGCAACCAGAAATTAGAAAGATTTTGCAAAATGAACGAACGAGAGAGGAAGAACATCAACAACAAATTTTGTGAGCAGTACATAAC [...]
+ TATTCAGTTCTTATGAGAAAAATGGCTCTTAAGAAATTGAAGGTGATACCAAAGGAAGGTTACTTATTACTTTTGGACTTTGATGATGAGGATGATGACATAAAAGTTTCAGAGGAGGCTCTTTCGGAAGTAAAGAGCCCAGCATTTGATAAAAATGAGAATATATCGCCTCAAGCAGAAGCAGATGAAGATATGGGAGATGAAGTAGACAGTATGTTGGATAAATCTGAAGTAAACCACCCAGCAATTGGTAAAGATGAAAATATATCGCCTCAAGTAAAAGGACATGAAGACAGGGGACATGAAGTAGGCAGTATGTTGGATAAATCTGGAGATGACATTTATAAGACGCTTCACATAAAGAGAAAATGGATGGAAACTTATGTCAAAGAATCTTTCAAAGGCAGGAACCAGAAATTAGAAAGATTTTGCAAAATGAACGAACGAGAGAGGAAGAACATCAACAACAAATTTTGTGAGCAGTATATAAC [...]
+ ------GTTCTTATGAGAAAAATGGCTCTTAAGAAATTGAAGGTGATACCAAAGGAAGGTTACTTATTACTTTTGGACTTTGATGATGAGGATGATGACATAAAAGTTTCAGAGGAGGCTCTATCGGAAGTAAAGAGCCCAGCATTTGATAAAAATGAGAATATATCGCCTCAAGCAGAAGCAGATGAAGATATGGGAGATGAAGTAGACAGTATGTTGGATAAATCTGAAGTAAACAACCCAGCAATTGGTAAAGATGAAAATATATCGCCTCAAGTAAAAGGACATGAAGACAGGGGACATGAAGTAGGCAGTATGTTGGATAAATCTGGAGATGACATTTATAAGACGCTTCACATAAAGAGAAAATGGATGGAAACTTATGTCAAAGAATCTTTCAAAGGCAGGAACCAGAAATTAGAAAGATTTTGCAAAATGAACGAACGAGAGAGGAAGAACATCAACAACAAATTTTGTGAGCAGTATATAAC [...]
+ ------GTTCTTATGAGAAAAATGGCTCTTAAGAAATTGAAGGTGATACCAAAGGAAGGTTACTTATTACTTTTGGACTTTGATGATGAGGATGATGACATAAAAGTTTCAGAGGAGGCTCTTTCGGAAGTAAAGAGCCCAGCATTTGATAAAAATGAGAATATATCGCCTCAAGCAGAAGCAGATGAAGATATGGGAGATGAAGTAGACAGTATGTTGGATAAATCTGAAGTAAACAACCCAGCAATTGGTAAAGATGAAAATATATCGCCTCAAGTAAAAGGACATGAAGACAGGGGACATGAAGTAGGCAGTATGTTGGATAAATCTGGAGATGACATTTATAAGACGCTTCACATAAAGAGAAAATGGATGGAAACTTATGTCAAAGAATCTTTCAAAGGCAGGAACCAGAAATTAGAAAGATTTTGCAAAATGAACGAACGAGAGAGGAAGAACATCAACAACAAATTTTGTGAGCAGTATATAAC [...]
+ ------GTTCTTATGAGAAAAATGGCTCTTAAGAAATTGAAGGTGATACCAAAGGAAAGTTACTTATTACTTTTGGACTTTGATGATGAGGACGATGATATAAAAGTTTCAGAGGAGGCTCTTTCGGAAGTAAAGAGCCCAGCATTTGATAAAAATGAGAATATATCGCCTCAAGCAGAAGCAGATGAAGATATGGGAGATGAAGTAGACAGTATGTTGGATAAATCTGAAGTAAACAACCCAGCAATTGGTAAAGATGAAAATATATCGCCTCAAGTAAAAGGACATGAAGACAGGGGACATGAAATAGGCAGTATGTTGGATAAATCTGGAGATGACATTTATAAGACGCTTCACATAAAGAGAAAATGGATGGAAACTTATGTCAAAGAATCTTTCAAAGGCAGGAACCAGAAATTAGAAAGATTTTGCAAAATGCACGAACGAGAGAGGAAGAACATCAACAACAAATTTTGTGAGCAGTATATAAC [...]
+ ------GTTCTTATGAGAAAAATGGCTCTTAAGAAATTGAAGGTGATACCAAAGGAAAGTTACTTATTACTTTTGGACTTTGATGATGAGGACGATGATATAAAAGTTTCAGAGGAGGCTCTTTCGGAAGTAAAGAGCCCAGCATTTGATAAAAATGAGAATATATCGCCTCAAGCAGAAGCAGATGAAGATATGGGAGATGAAGTAGACAGTATGTTGGATAAATCTGAAGTAAACAACCCAGCAATTGGTAAAGATGAAAATATATCGCCTCAAGTAAAAGGACATGAAGACAGGGGACATGAAATAGGCAGTATGTTGGATAAATCTGGAGATGACATTTATAAGACGCTTCACATAAAGAGAAAATGGATGGAAACTTATGTCAAAGAATCTTTCAAAGGCAGGAACCAGAAATTAGAAAGATTTTGCAAAATGAACGAACGAGAGAGGAAGAACATCAACAACAAATTTTGTGAGCAGTATATAAC [...]
+ ------GTTCTTATGAGAAAAATGGCTCTTAAGAAATTGAAGGTGATACCAAAGGAAAGTTACTTATTACTTTTGGACTTTGATGATGAGGACGATGATATAAAAGTTTCAGAGGAGGCTCTTTCGGAAGTAAAGAGCCCAGCATTTGATAAAAATGAGAATATATCGCCTCAAGCAGAAGCAGATGAAGATATGGGAGATGAAGTAGACAGTATGTTGGATAAATCTGAAGTAAACAACCCAGCAATTGGTAAAGATGAAAATATATCGCCTCAAGTAAAAGGACATGAAGACAGGGGACATGAAATAGGCAGTATGTTGGATAAATCTGGAGATGACATTTATAAGACGCTTCACATAAAGAGAAAATTGATGGAAACTTATGTCAAAGAATCTTTCAAAGGCAGGAACCAGAAATTAGAAAGATTTTGCAAAATGAACGAACGAGAGAGGAAGAACATCAACAACAAATTTTGTGAGCAGTATATAAC [...]
+ ------GTTCTTATGAGAAAAATGGCTCTTAAGAAATTGAAGGTGATACCAAAGGAAAGTTACTTATTACTTTTGGACTTTGATGATGAGGACGATGATATAAAAGTTTCAGAGGAGGCTCTTTCGGAAGTAAAGAGCCCAGCATTTGATAAAAATGAGAATATATCGCCTCAAGCAGAAGCAGATGAAGATATGGGAGATGAAGTAGACAGTATGTTGGATAAATCTGAAGTAAACAACCCAGCAATTGGTAAAGATGAAAATATATCGCCTCAAGTAAAAGGACATGAAGACAGGGGACATGAAATAGGCAGTATGTTGGATAAATCTGGAGATGACATTTATAAGACGCTTCACATAAAGAGAAAATGGATGGAAACTTATGTCAAAGAATCTTTCAAAGGCAGGAACCAGAAATTAGAAAGATTTTGCAAAATGAACGAACGAGAGAGGAAGAACATCAACAACAAATTTTGTGAGCAGTATATAAC [...]
+ ------GTTCTTATGAGAAAAATGGCTCTTAAGAAATTGAAGGTGATACCAAAGGAAAGTTACTTATTACTTTTGGACTTTGATGATGAGGACGATGATATAAAAGTTTCAGAGGAGGCTCTTTCGGAAGTAAAGAGCCCAGCATTTGATAAAAATGAGAATATATCGCCTCAAGCAGAAGCAGATGAAGATATGGGAGATGAAGTAGACAGTATGTTGGATAAATCTGAAGTAAACAACCCAGCAATTGGTAAAGATGAAAATATATCGCCTCAAGTAAAAGGACATGAAGACAGGGGACATGAAGTAGGCAGTATGTTGGATAAATCTGGAGATGACATTTATAAGACGCTTCACATAAAGAGAAAATGGATGGAAACTTATGTCAAAGAATCTTTCAAAGGCAGGAACCAGAAATTAGAAAGATTTTGCAAAATGAACGAACGAGAGAGGAAGAACATCAACAACAAATTTTGTGAGCAGTATATAAC [...]
+ ------GTTCTTATGAGAAGAATGGCTCTTAAGAAATTGAAGGTGATACCAAAGGAAGGTTACTTATTACTATTGGACTTTGATGATGAGGATGATGACATAAAAGTTTCAGAGGAGGCTCTTTCGGAAGTAAAGAGCCCAGCATTTGATAAAAATGAGAATATATCACCTCAAGCAGAAGCAGATGAAGATATCGGAGATGAAATAGATAGTATGTTGGATAAATCTGAAGTAAACAACCCAGCAATTGGTAAAGATGAAAATATATCGCCTCAAGTAAAAGGAGATGAAGACATGGGACATGAAGTAGGCAGTATGTTGGATAAATCTGGAGATGACATATATAAGACGCTTCACATAAAGAGAAAATGGATGGAAACTTATGTCAAAGAATCTTTCAAAGGCAGGAACCAGAAATTAGAAAGATTTTGCAAAATGAATGAACGAGAGAGGAAGAACATCAACAACAAATTTTGTGAGCAGTATATAAC [...]
+ ------GTTCTTATGAGAAGAATGGCTCTTAAGAAATTGAAGGTGATACCAAAGGAAGGTTACTTATTACTTTTGGACTTTGATGATGAGGACGATGACATAAAAGTTTCAGAGGAGGCTCTTTCGGAAGTAAAAAGCCCAGCATTTGATAAAAATGAGAATATATCGCCTCAAGCAGAAGCAGATGAAGATATGGGAGATGAAGTAGACAGTATATTGGATAAATCTGAAGTAAATAATCCAGCAATTGGTAAAGATGAAAATACATCGCCTCAAGTAAAAGGAGATGAAGACATGGGACATGAAGTAGGCAGTATGTTGGATAAATCTGGAGATGACATTTATAAGACGCTTCACATAAAGAGAAAATGGATGGAAACTTATGTCAAAGAATCTTTCAAAGGCAGCAACCAGAAATTAGAAAGATTTTGCAAAACGAACGAACGAGAGAGGAAGAACATCAACAACAAATTTTGTGAGCAGTATATAAC [...]
+ ------GTTCTTATGAGAAGAATGGCTCTTAAGAAATTGAAGGTGATACCAAAGGAAGGTTACTTATTACTTTTGGACTTTGATGATGAGGACGATGACATAAAAGTTTCAGAGGAGGCTCTTTCGGAAGTAAAGAGCCCAGCATTTGATAAAAATGAGAATATATCGCCTCAAGCAGAAGCAGATGAAGATATGGGAGATGAAGTAGACAGTATATTGGATAAATCTGAAGTAAATAATCCAGCAATTGGTAAAGATGAAAATACATCGCCTCAAGTAAAAGGAGATGAAGACATGGGACATGAAGTAGGCAGTATGTTGGATAAATCTGGAGATGACATTTATAAGACGCTTCACATAAAGAGAAAATGGATGGAAACTTATGTCAAAGAATCTTTCAAAGGCAGCAACCAGAAATTAGAAAGATTTTGCAAAACGAACGAACGAGAGAGGAAGAACATCAACAACAAATTTTGTGAGCAGTATATAAC [...]
+ ------GTTCTTATGAGAAGAATGGCTCTTAAGAAATTGAAGGTGATACCAAAGGAAGGTTACTTATTACTTTTGGACTTTGATGATGAGGACGATGACATAAAAGTTTCAGAGGAGGCTCTTTTGGAAGTAAAGAGCCCAGCATTTGATAAAAATGAGAATATATCGCCTCAAGCAGAAGCAGATGAAGATATGGGAGATGAAGTAGACAGTATGTTGGATAAATCTGAAGTAAATAATCCAGCAATTGGTAAAGATGAAAATACATCGCCTCAAGTAAAAGGAGATGAAGACATGGGACATGAAGTAGGCAGTATGTTGGATAAATCTGGAGATGACATTTATAAGACGCTTCACATAAAGAGAAAATGGATGGAAACTTATGTCAAAGAATCTTTCAAAGGCAGCAACCAGAAATTAGAAAGATTTTGCAAAACGAACGAACGAGAGAGGAAGAACATCAACAACAAATTTTGTGAGCAGTATATAAC [...]
+ ---------------AGAGCCCAGCGTTTGATAAAAATGAGAATATATCGCCTCAAG------------------------------------------------------------------------------------------CAGAAGCAGATGAAGATATGG------------------------------GATGAAGTAGACAGTATGTTGGATAAATCTGAAGTAAATAACCCAGCAATTGGTAAAGATGGATATATATCGCCTCAAGTAAAAGGAGATGAAGACATGGGACATGAAGTAGCCAGTATGTTGGATAAATCTGGAGATGACATTTATAAGACGCTTCACATAAAGAGAAAATGGATGGAAACTTATGTCAAAGAATCTTTCAAAGGCAGCAACCAGAAATTAGAAAGATTTTGCAAAACGAACGAACGAGAGAGGAAGAACATCAACAACAAATTTTGTGAGCAGCATATAAC [...]
+ ---------------AGAGCCCAGCATTTGATAAAAATGAGAATATATCGCCTCAAG------------------------------------------------------------------------------------------CAGAAGCAGATGAAGATATGG------------------------------GATACAGTAGACAGTATATTGGATAAATCTGAAGTAAATAATCCAGCAATTGGTAAAGATGAAAATATATCGCCTCAAGTAAAAGGAGATGAAGACATGGGACATGAAGTAGGCAGTATGTTGGATAAATCTGGAGATGACATTTATAAGACGCTTCACATAAAGAGAAAATGGATGGAAACTTATGTCAAAGAATCTTTCAAAGGCAGCAACCAGAAATTAGAAAGATTTTGCAAAACGAACGAACGAGAGAGGAAGAACATCAACAACAAATTTTGTGAGCAGTATATAAC [...]
+ ------------------------------------------------------GCA------------------------------------------------------------------------------------------GAAGCAGATGAAGATATGGGA------------------------------GATGAAGTAGACAGTATGTTGGATAAATCTGAAGTAAATAACCCAGCAATTGGTAAAGATGGAAATATATCGCCTCAAGTAAAAGGAGATGAAGACATGGGACATGAAGTAGGCAGTATGTTGGATAAATCTGGAGATGACATTTATAAGACGCTTCACATAAAGAGAAAATGGATGGAAACTTATGTCAAAGAATCTTTCAAAGGCAGCAACCAGAAATTAGAAAGATTTTGCAAAACGAACGAACGAGAGAGGAAGAACATAAACAACAAATTTTGTGAGCAGTATATAAC [...]
+ ---------------AGCCCAGCATTTGATAAAAATGAGAATATATCGCCTCAAGCA------------------------------------------------------------------------------------------GAAGCAGATGAAGATATGGGA------------------------------GATGAAGTAGACAGTATGTTGGATAAATCTGAAGTAAATAATCCAGCAATTGGTAAAGATGAAAATATATCGCCTCAAGTAAAAGGAGATGAAGACATGGGACATGAAGTAGGCAGTATGTTGGATAAATCTGGAGATGACATTTATAAGACGCTTCACATAAAGAGAAAATGGATGGAAACTTATGTCAAAGAATCTTTCAAAGGCAGCAACCAGAAATTAGAAAGATTTTGCAAAACGAACGAACGAGAGAGGAAGAACATCAACAACAAATTTTGTGAGCAGTATATAAC [...]
+ ---------------AGCCCAGCATTTGATAAAAATGAGAATATATCGCCTCAAGCA------------------------------------------------------------------------------------------GAAGCAGATGAAGATATGGGA------------------------------GATGAAGTAGACAGTATGTTGGATAAATCTGAAGTAAATAATCTAGCAATTGGTAAAGATGAAAATATATCGCCTCAAGTAAAAGGAGATGAAGACATGGGACATGAAGTAGGCAGTATGTTGGATAAATCTGGAGATGACATTTATAAGACGCTTCACATAAAGAGAAAATGGATGGAAACTTATGTCAAAGAATCTTTCAAAGGCAGCAACCAGAAATTAGAAAGATTTTGCAAAACGAACGAACGAGAGAGGAAGAACATCAACAACAAATTTTGTGAGCAGTATATAAC [...]
+ ------GTTCTTATGAGAAGAATGTCTCTTAAGAAATTGAAGGTGATACCAAAGGAAGGTTACTTATTACTTTTGGACTTTGATGATGAGGACGATGACATAAAAGTTTCAGAGGAGGCTCTTTCGGAAGTAAAGAGCCCAGCATTTGATAAAAATGAGAATATATCGCCTCAAGCAGAAGGAGATGAAGATATGGGAGATGAAGTAGACAGTATGTTGGATAAATCTGAAGTAAATAATCCAGCAATTGGTAAAGATGAAAATATATCGCCTCAAGTAAAAGGAGATGAAGACATGGGACATGAAGTAGGCAGTATGTTGGATAAATCTGGAGATGACATTTATAAGACGCTTCACATAAAGAGAAAATGGATGGAAACTTATGTCAAAGAATCTTTCAAAGGCAGCAACCAGAAATTAGAAAGATTTTGCAAAACGAACGAACGAGAGAGGAAGAACATCAACAACAAATTTTGTGAGCAGTATATAAC [...]
+ ------GTTCTTATGAGAAGAATGTCTCTTAAGAAATTGAAGGTGATACCAAAGGAAGGTTACTTATTACTTTTGGACTTTGATGATGAGGACGATGACATAAAAGTTTCAGAGGAGGCTCTTTCGGAAGTAAAGAGCCCAGCATTTGATAAAAATGAGAATATATCGCCTCAAGCAGAAGGAGATGAAGATATGGGAGATGAAGTAGACAGTATGTTGGATAAATCTGAAGTAAATAATCCAGCAATTGGTAAAGATGAAAATATATCGCCTCAAGTAAAAGGAGATGAAGACATGGGACATGAAGTAGGCAGTATGTTGGATAAATCTGGAGATGACATTTATAAGACGCTTCACATAAAGAGAAAATGGATGGAAACTTATGTCAAAGAATCTTTCAAAGGCAGCAACCAGAAATTAGAAAGATTTTGCAAAACGAACGAACGAGAGAGGAAGAACATCAACAACAAATTTTGTGAGCAGTATATAAC [...]
+ ------GTTCTTATGAGAAGAATGGCTCTTAAGAAATTGAAGGTGATACCAAAGGAAGGTTACTTATTATTTTTGGACTTTGATGATGAGGACGATGACATAAAAGTTTCAGAGGAGGCTCTTTCGGAAGTAAAGAGCCCAGCATTTGATAAAAATGAGAATATATCGCCTCAAGCAGAAGCAGATGAAGATATGGGAGATGAAGTAGACAGTATGTTGGATAAATCTGAAGTAAATAATCCAGCAATTGGTAAAGATGAAAATATATCGCCTCAAGTAAAAGGAGATGAAGACATGGGACATGAAGTAGGCAGTATGTTGGATAAATCTGGAGATGACATTTATAAGACGCTTCACATAAAGAGAAAATGGATGGAAACTTATGTCAAAGAATCTTTCAAAGGCAGCAACCAGAAATTAGAAAGATTTTGCAAAACGAACGAACGAGAGAGGAAGAACATCAACAACAAATTTTGTGAGCAGTATATAAC [...]
+ ------GTTCTTATGAGAAGAATGGCTCTTAAGAAATTGAAGGTGATACCAAAGGAAGGTTACTTATTACTTTTGGACTTTGATGATGAGGACGATGACATAAAAGTTTCAGAGGAGGCTCTTTCGGAAGTAAAGAGCCCAGCATTTGATAAAAATGAGAATATATCGCCTCAAGCAGAAGCAGATGAAGATATGGGAGATGAAGTAGACAGTATGTTGGATAAATCTGAAGTAAATAATCCAGCAATTGGTAAAGATGAAAATATATCGCCTCAAGTAAAAGGAGATGAAGACATGGGACATGAAGTAGGCAGTATGTTGGATAAATCTGGAGATGACATTTATAAGACGCTTCACATAAAGAGAAAATGGATGGAAACTTATGTCAAAGAATCTTTCAAAGGCAGCAACCAGAAATTAGAAAGATTTTGCAAAACGAACGAACGAGAGAGGAAGAACATCAACAACAAATTTTGTGAGCAGTATATAAC [...]
+ ------GTTCTTATGAGAAGAATGGCTCTTAAGAAATTGAAGGTGATACCAAAGGAAGGTTACTTATTACTTTTGGACTTTGATGATGAGGACGATGACATAAAAGTTTCAGAGGAGGCTCTTTCGGAAGTAAAGAGCCCAGCATTTGATAAAAATGAGAATATATCGCCTCAAGCAGAAGCAGATGAAGATATGGGAGATGAAGTAGACAGTATGTTGGATAAATCTGAAGTAAATAACCCAGCAATTGGTAAAGATGAAAATATATCGCCTCAAGTAAAAGGAGATGAAGACATGGGACATGAAGTAGGCAGTATGTTGGATAAATCTGGAGATGACATTTATAAGACGCTTCACATAAAGAGAAAATGGATGGAAACTTATGTCAAAGAATCTTTCAAAGGCAGCAACCAGAAATTAGAAAGATTTTGCAAAACGAACGAACGAGAGAGGAAGAACATCAACAACAAATTTTGTGAGCAGTATATAAC [...]
+ ------GTTCTTATGAGAAGAATGGCTCTTAAGAAATTGAAGGTGATACCAAAGGAAGGTTACTTATTACTTTTGGACTTTGATGATGAGGACGATGACATAAAAGTTTCAGAGGAGGCTCTTTCAGAAGTAAAGAGCCCAGCATTTGATAAAAATGAGAATATATCGCCTCAAGCAGAAGCAGATGAAGATATGGGAGATGAAGTAGACAGTATGTTGGATAAATCTGAAGTAAATAATCCAGCAATTGGTAAAGATGAAAATATATCGCCTCAAGTAAAAGGAGATGAAGACATGGGACATGAAGTAGGCAGTATGTTGGATAAATCTGGAGATGACATTTATAAGACGCTTCACATAAAGAGAAAATGGATGGAAACTTATGTCAAAGAATCTTTCAAAGGCAGCAACCAGAAATTAGAAAGATTTTGCAAAACGAACGAACGAGAGAGGAAGAACATCAACAACAAATTTTGTGAGCAGTATATAAC [...]
+ ------GTTCTTATGAGAAGAATGGCTCTTAAGAAATTGAAGGTGATACCAAAGGAAGGTTACTTATTACTTTTGGACTTTGATGATGAGGACGATGACATAAAAGTTTCAGAGGAGGCTCTTTCGGAAGTAAAGAGCCCAGCATTTGATAAAAATGAGAATATATCGCCTCAAGCAGAAGCAGATGAAGATATGGGAGATGAAGTAGACAGTATGTTGGATATATCTGAAGTAAATAATCCAGCAATTGGTAAAGATGAAAATATATCGCCTCAAGTAAAAGGAGATGAAGACATGGGACATGAAGTAGGCAGTATGTTGGATAAATCTGGAGATGACATTTATAAGACGCTTCACATAAAGAGAAAATGGATGGAAACTTATGTCAAAGAATCTTTCAAAGGCAGCAACCAGAAATTAGAAAGATTTTGCAAAACGAACGAACGAGAGAGGAAGAACATCAACAACAAATTTTGTGAGCAGTATATAAC [...]
+ ------GTTCTTATGAGAAGAATGGCTCTTAAGAAATTGAAGGTGATACCAAAGGAAGGTTACTTATTACTTTTGGACTTTGATGATGAGGACGATGACATAAAAGTTTCAGAGGAGGCTCTTTCAGAAGTAAAGAGCCCAGCATTTGATAAAAATGAGAATATATCGCCTCAAGCAGAAGCAGATGAAGATATGGGAGATGAAGTAGACAGTATGTTGGATAAATCTGAAATAAATAATCCAGCAATTGGTAAAGATGAAAATATATTGCCTCAAGTAAAAGGAGATGAAGACATGGGACATGAAGTAGGCAGTATGTTGGATAAATCTGGAGATGACATTTATAAGACGCTTCACATAAAGAGAAAATGGATGGAAACTTATGTCAAAGAATCTTTCAAAGGCAGCAACCAGAAATTAGAAAGATTTTGCAAAACGAACGAACGAGAGAGGAAGAACATCAACAACAAATTTTGTGAGCAGTATATAAC [...]
+ ------GTTCTTATGAGAAGAATGGCTCTTAAGAAATTGAAGGTGATACCAAAGGAAGGTTACTTATTACTTTTGGACTTTGATGATGAGGACGATGACATAAAAGTTTCAGAGGAGGCTCTTTCGGAAGTAAAGAGCCCAGCATTTGATAAAAATGAGAATATATCGCCTCAAGCAGAAGCAGATGAAGATATGGGAGATGAAGTAGACAGTATGTTGGATAAATCTGAAGTAAATAATCCAGCAATTGGTAAAGATGAAAATATATCGCCTCAAGTAAAAGGAGATGAAGACATGGGACATGAAGTAGGCAGTATGTTGGATAAATCTGGAGATGACATTTATAAGACGCTTCACATAAAGAGAAAATGGATGGAAACTTATGTCAAAGAATCTTTCAAAGGCAGCAACCAGAAATTAGAAAGATTTTGCAAAACGAACGAACGAGAGAGGAAGAACATCAACAACAAATTTTGTGAGCAGTATATAAC [...]
+ TACTGTGTTCTTATGAGAAGAATGGCTCTTAAGAAATTGAAGGTGATACCAAAGGAAGGTTACTTATTACTTTTGGACTTTGATGATGAGGACGATGACATAAAAGTTTCAGAGGAGGCTCTTTCGGAAGTAAAGAGCCCAGCATTTGATAAAAATGAGAATATATCGCCTCAAGCAGAAGCAGATGAAGATATGGGAGATGAAGTAGACAGTATGTTGGATAAATCTGAAGTAAATAATCCAGCAATTGGTAAAGATGAAAATATATCGCCTCAAGTAAAAGGAGATGAAGACATGGGACATGAAGTAGGCAGTATGTTGGATAAATCTGGAGATGACATTTATAAGACGCTTCACATAAAGAGAAAATGGATGGTAACTTATGTCAAAGAATCTTTCAAATGCAGCAACCAGAAATTAGAAAGATTTTGCAAAACGAACGAACGAGAGAGGAAGAACATCAACAACAAATTTTGTGAGCAGTATATAAC [...]
+ TACTGTGTTCTTATGAGAAGAATGGCTCTTAAGAAATTGAAGGTGATACCAAAGGAAGGTTACTTATTACTTTTGGACTTTGATGATGAGGACGATGACATAAAAGTTTCAGAGGAGGCTCTTTCGGAAGTAAAGAGCCCAGCATTTGATAAAAATGAGAATATATCGCCTCAAGCAGAAGCAGATGAAGATATGGGAGATGAAGTAGACAGTATGTTGGATAAATCTGAAGTAAATAATCCAGCAATTGGTAAAGATGAAAATATATCGCCTCAAGTAAAAGGAGTTGAAGACATGGGACATGAAGTAGGCAGTATGTTGGATAAATCTGGAGATGACATTTATAAGACGCTTCACATAAAGAGAAAATGGATGGAAACTTATGTCAAAGAATCTTTCAAATGCAGCAACCAGAAATTAGAAAGATTTTGCAAAACGAACGAACGAGAGAGGAAGAACATCAACAACAAATTTTGTGAGCAGTATATAAC [...]
+ TACTGTGTTCTTATGAGAAGAATGGCTCTTAAGAAATTGAAGGTGATACCAAAGGAAGGTTACTTATTACTTTTGGACTTTGATGATGAGGACGATGACATAAAAGTTTCAGAGGAGGCTCTTTCGGAAGTAAAGAGCCCAGCATTTGATAAAAATGAGAATATATCGCCTCAAGCAGAAGCAGATGAAGATATGGGAGATGAAGTAGACAGTATGTTGGATAAATCTGAAGTAAATAATCCAGCAATTGGTAAAGATGAAAATATATCGCCTCAAGTAAAAGGAGATGAAGACATGGGACATGAAGTAGGCAGTATGTTGGATAAATCTGGAGATGACATTTATAAGACGCTTCACATAAAGAGAAAATGGATGGAAACTTATGTCAAAGAATCTTTCAAATGCAGCAACCAGAAATTAGAAAGATTTTGCAAAACGAACGAACGAGAGAGGAAGAACATCAACAACAAATTTTGTGAGCAGTATATAAC [...]
+ TACTGTGTTCTTATGAGAAGAATGGCTCTTAAGAAATTGAAGGTGATACCAAAGGAAGGTTACTTATTACTTTTGGACTTTGATGATGAGGACGATGACATAAAAGTTTCAGAGGAGGCTCTTTCGGAAGTAAAGAGCCCAGCATTTGATAAAAATGAGAATATATCGCCTCAAGCAGAAGCAGATGAAGATATGGGAGATGAAGTAGACAGTATGTTGGATAAATCTGAAGTAAATAATCCAGCAATTGGTAAAGATGAAAATATATCGCCTCAAGTAAAAGGAGATGAAGACATGGGACATGAAGTAGGCAGTATGTTGGATAAATCTGGAGATGACATTTATAAGACGCTTCACATAAAGAGAAAATGGATGGAAACTTATGTCAAAGAATCTTTCAAATGCAGCAACCAGAAATTAGAAAGATTTTGCAAAACGAACGAACGAGAGAGGAAGAACATCAACAACAAATTTTGTGAGCAGTATATAAC [...]
+ ------GTTCTTATGAGAAGAATGGCTCTTAAGAAATTGAAGGTGATACCAAAGGAAGGTTACTTATTACTTTTGGACTTTGATGATGAGGACGATGACATAAAAGTTTCAGAGGAGGCTCTTTCGGAAGTAAAGAGCCCAGCATTTGATAAAAATGAGAATATATCGCCTCAAGCAGAAGCAGATGAAGATATGGGAGATGAAGTAGACAGTATGTTGGATAAATCTGAAGTAAATAATCCAGCAATTGGTAAAGATGAAAATATATCGCCTCAAGTAAAAGGAGATGAAGACATGGGACATGAAGTAGGCAGTATGTTGGATAAATCTGGAGATGACATTTATAAGACGCTTCACATAAAGAGAAAATGGATGGAAACTTATGTCAAAGAATCTTTCAAATGCAGCAACCAGAAATTAGAAAGATTTTGCAAAACGAACGAACGAGAGAGGAAGAACATCAACAACAAATTTTGTGAGCAGTATATAAC [...]
+ ------GTTCTTATGAGAAGAATGGCTCTTAAGAAATTGAAGGTGATACCAAAGGAAGGTTACTTATTACTTTTGGACTTTGATGATGAGGACGATGACATAAAAGTTTCAGAGGAGGCTCTTTCGGAAGTAAAGAGCCCAGCATTTGATAAAAATGAGAATATATCGCCTCAAGCAGAAGCAGATGAAGATATGGGAGATGAAGTAGACAGTATGTTGGATAAATCTGAAGTAAATTATCCAGCAATTGGTAAAGATGAAAATATATCGCCTCAAGTAAAAGGAAATGAAGACATGGGACATGAAGTAGGCAGTATGTTAGATAAATCTGGAGATGACATTTATAAGACGCTTCACATAAAGAGAAAATGGATGGAAACTTATGTCAAAGAATCTTTCAAAGGCAGCAACCAGAAATTAGAAAGATTTTGCAAAACGAACGAACGAGAGAGGAAGAACATCAACAACAAATTTTGTGAGCAGTATATATC [...]
+ ------GTTCTTATGAGAAGAATGGCTCTTAAGAAATTGAAGGTGATACCAAAGGAAGGTTACTTATTACTTTTGGACTTTGATGATGAGGACGATGACATAAAAGTTTCAGAGGAGGCTCTTTCGGAAGTAAAGAGCCCAGCATTTGATAAAAATGAGAATATATCGCCTCAAGCAGAAGCAGATGAAGATATGGGAGATGAAGTAGACAGTATGTTGGATAAATCTGAAGTAAATTATCCAGCAATTGGTAAAGATGAAAATATATCGCCTCAAGTAAAAGGAGATGAAGACATGGGACATGAAGTAGGCAGTATGTTGGATAAATCTGGAGATGACATTTATAAGACGCTTCACATAAAGAGAAAATGGATGGAAACTTATGTCAAAGAATCTTTCAAAGGCAGCAACCAGAAATTAGAAAGATTTTGCAAAACGAACGAACGAGAGAGGAAGAACATCAACAACAAATTTTGTGAGCAGTATATATC [...]
+ ------GTTCTTATGAGAAGAATGGCTCTTAAGAAATTGAAGGTGATACCAAAGGAAGGTTACTTATTACTTTTGGACTTTGATGATGAGGACGATGACATAAAAGTTTCAGAGGAGGCTCTTTCGGAAGTAAAGAGCCCAGCATTTGATAAAAATGAGAATATATCGCCTCAAGCAGAAGCAGATGAAGATATGGGAGATGAAGTAGACAGTATGTTGGATAAATCTGAAGTAAATAATCCAGCAATTGGTAAAGATGAAAATATATCGCCTCAAGTAAAAGGAGATGAAGACATGGGACATGAAGTAGGCAGTATGTTGGATAAATCTGGAGATGACATTTATAAGACGCTTCACATAAAGAGAAAATGGATGGAAACTTATGTCAAAGAATCTTTCAAAGGCAGCAACCAGAAATTAGAAAGATTTTGCAAAACGAACGAACGAGAGAGGAAGAACATCAACAACAAATTTTGTGAGCAGTATATATC [...]
+ ------GTTCTTATGAGAAGAATGGCTCTTAAGAAATTGAAGGTGATACCAAAGGAAGGTTACTTATTACTTTTGGACTTTGATGATGAGGACGATGACATAAAAGTTTCAGAGGAGGCTCTTTTGGAAGTAAAGAGCCCAGCATTTGATAAAAATGAGAATATATCGCCTCAAGCAGAAGCAGATGAAGATATGGGAGATGAAGTAGACAGTATGTTGGATAAATCTGAAGTAAATAATCCAGCAATTGGTAAAGATGAAAATATATCGCCTCAAGTAAAAGGAGATGAAGACATGGGACATGAAGTAGTCAGTATGTTGGATAAATCTGGAGATGACATTTATAAGACGCTTCACATAAAGAGAAAATGGATGGAAACTTATGTCAAAGAATCTTTCAAAGGCAGCAACCAGAAATTAGAAAGATTTTGCAAAACGAACGAACGAGAGAGGAAGAACATCAACAACAAATTTTGTGAGCAGTATATATC [...]
+ ------GTTCTTATGAGAAGAATGGCTCTTAAGAAATTGAAGGTGATACCAAAGGAAGGTTACTTATTACTTTTGGACTTTGATGATGAGGACGATGACATAAAAGTTTCAGAGGAGGCTCTTTCGGAAGTAAAGAGCCCAGCATTTGATAAAAATGAGAATATATCGCCTCAAGCAGAAGCAGATGAAGATATGGGAGATGAAGTAGACAGTATGTTGGATAAATCTGAAGTAAATAATCCAGCAATTGGTAAAGATGAAAATATATCGCCTCAAGTAAAAGGAGATGAAGACATGGGACATGAAGTAGGCAGTATGTTGGATAAATCTGGAGATGACATTTATAAGACGCTTCACATAAAGAGAAAATGGATGGAAACTTATGTCAAAGAATCTTTCAAAGGCAGCAACCAGAAATTAGAAAGATTTTGCAAAACGAACGAACGAGAGAGGAAGAACATCAACAACAAATTTTGTGAGCAGTATATAAC [...]
+ ------GTTCTTATGAGAAGAATGGCTCTTAAGAAATTGAAGGTGATACCAAAGGAAGGTTACTTATTACTTTTGGACTTTGATGATGAGGACGATGACATAAAAGTTTCAGAGGAGGCTCTTTCGGAAGTAAAGAGCCCAGCATTTGATAAAAATGAGAATATATCGCCTCAAGCAGAAGCAGATGAAGATATGGGAGATGAAGTAGACAGTATGTTGGATAAATCTGAAGTAAATAATCCAGCAATTGGTAAAGATGAAAATATATCGCCTCAAGTAAAAGGAGATGAAGACATTGGACATGAAGTAGGCAGTATGTTGGATAAATCTGGAGATGACATTTATAAGACGCTTCACATAAAGAGAAAATGGATGGAAACTTATGTCAAAGAATCTTTCAAAGGCAGCAACCAGAAATTAGAAAGATTTTGCAAAACGAACGAACGAGAGAGGAAGAACATCAACAACAAATTTTGTGAGCAGTATATAAC [...]
+ ------GTTCTTATGAGAAGAATGGCTCTTAAGATATTGAAGGTGATACCAAAGGAAGGTTACTTATTACTTTTGGACTTTGATGATGAGGACGATGACATAAAAGTTTCAGAGGAGGCTCTTTCGGAAGTAAAGAGCCCAGCATTTGATAAAAATGAGAATATATCGCCTCAAGCAGAAGCAGATGAAGATATGGGAGATGAAGTAGACAGTATGTTGGATAAATCTGAAGTAAATAATCCAGCAATTGGTAAAGATGAAAATATATCGCCTCAAGTAAAAGGAGATGAAGACATGGGACATGAAGTAGTCAGTATGTTGGATAAATCTGGAGATGACATTTATAAGACGCTTCACATAAAGAGAAAATGGATGGAAACTTATGTCAAAGAATCTTTCAAAGGCAGCAACCAGAAATTAGAAAGATTTTGCAAAACGAACGAA----------------------------------------------- [...]
+ ------GTTCTTATGAGAAGAATGGCTCTTAAGAAATTGAAGGTGATACCAAAGGAAGGTTACTTATTACTTTTGGACTTTGATGATGAGGATGATGACATAAAAGTTTCAGAGGAGGCTCTTTCGGAAGTAAAGAGCCCAGCGTTTGATAAAAATGAGAATATATCGCCTCAAGCAGAAGCAGATGAAGATATGGGAGATGAAGTAGACAGTATGTTGGATAAATCTGAAGTAAATAACCCAGCAATTGGTAAAGATGGATATATATCGCCTCAAGTAAAAGGAGATGAAGACATGGGACATGAAGTAGGCAGTATGTTGGATAAATCTGGAGATGACATTTATAAGACGCTTCACATAAAGAGAAAATGGATGGAAACTTATGTCAAAGAATCTTTCAAAGGCAGCAACCAGAAATTAGAAAGATTTTGCAAAACGAACGAACGAGAAGGAAGAACATCAACAACAAATTTTGTGAGCAGTATA----- [...]
+ ------ATTCTTATGAGAAGAATGGCTCTTAAGAAATTGAAGGTGATACCAAAGGAAGGTTACTTATTACTTTTGGACTTTGATGATGAGGACGATGACATAAAAGTTTCAGAGGAGGCTCTTTCGGAAGTAAAGAGCCCAGCATTTGATAAAAATGAGAATATATCGCCTCAAGCAGAAGCAGATGAAGATATGGGAGATGAAGTAGACAGTATGTTGGATAAATCTGAAGTAAATAATCCAGCAATTGGTAAAGATGAAAATATATCGCCTCAAGTAAAAGGAGATGAAGACATGGGACATGAAGTAGGCAGTATGTTGGATAAATCTGGAGATGACATTTATAAGACGCTTCACATAAAGAGAAAATGGATGGAAACTTATGTCAAAGAATCTTTCAAAGGCAGCAACCAGAAATTAGAAAGATTTTGCAAAACGAACGAA----------------------------------------------- [...]
+ ------GTTCTTATGAGAAGAATGGCTCTTAAGAAATTGAAGGTGATACCAAAGGAAGGTTACTTATTACTTTTGGACTTTGATGATGAGGACGATGACATAAAAGTTTCAGAGGAGGCTCTTTCGGAAGTAAAGAGCCCAGCATTTGATAAAAATGAGAATATATCGCCTCAAGCAGAAGCAGATGAAGATATGGGAGATGAAGTAGACAGTATGTTGGATAAATCTGAAGTAAATAATCCAGCAATTGGTAAAGATGAAAATATATCGCCTCAAGTAAAAGGAGATGAAGACATGGGACATGAAGTAGGCAGTATGTTGGATAAATCTGGAGATGACATTTATAAGACGCTTCACATAAAGAGAAAATGGATGGAAACTTATGTCAAAGAATCTTTCAAAGGCAGCAAC-------------------------------------------------------------------------------- [...]
+ ------GTTCTTATGAGAAGAATGGCTCTTAAGAAATTGAAGGTGATACCAAAGGAAGGTTACTTATTACTTTTGGACTTTGATGATGAGGACGATGACATAAAAGTTTCAGAGGAGGCTCTTTCGGAAGTAAAGAGCCCAGCATTTGATAAAAATGAGAATATATCGCCTCAAGCAGAAGCAGATGAAGATATGGGAGATGAAGTAGACAGTATGTTGGATAAATCTGAAGTAAATAATCCAGCAATTGGTAAAGATGAAAATATATCGCCTCAAGTAAAAGGAGAT----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- [...]
+ ------GTTCTTATGAGAAGAATGGCTCTTAAGAAATTGAAGGTGATACCAAAGGAAGGTTACTTATTACTTTTGGACTTTGATGATGAGGACGATGACATAAAAGTTTCAGAGGAGGCTCTTTCGGAAGTAAAGAGCCCAGCATTTGATAAAAATGAGAATATATCGCCTCAAGCAGAAGCAGATGAAGATATGGGAGATGAAGTAGACAGTATGTTGGATAAATCTGAAGTAAATAATCCAGCAATTGGTAAAGATGAAAATATATCGCCTCAAGTAAAAGGAGATGAAGACATGGGACATGAAGTAGGCAGTATGTTGGATAAATCTGGAGGTATGTGTTTTAGAAATATTTCCCTTATGAAATGTTCAATTGAATTTGTTCTGAGTGTTCATTTTCAT---ATTGGTATGAAATGTGCCTGCTTTTGTTACTGTGCTTTACAGGAAGAACAT---------------------CAACAACAAATTTT [...]
+END;
\ No newline at end of file
diff --git a/tests/hbltests/RegressionTesting/RELAX/segfault.nex.RELAX.json b/tests/hbltests/RegressionTesting/RELAX/segfault.nex.RELAX.json
new file mode 100644
index 0000000..8c03610
--- /dev/null
+++ b/tests/hbltests/RegressionTesting/RELAX/segfault.nex.RELAX.json
@@ -0,0 +1,1285 @@
+{"fits":{"Partitioned MG94xREV":{"log-likelihood":-2684.888498229526,
+"parameters":135,
+"AIC-c":5642.455138097153,
+"runtime":64,
+"branch-lengths":{"1070":0.004541247765584171,
+"11":0.01098025204525015,
+"1110":0.001488605071424621,
+"1150":0.001489177357875911,
+"1180":0,
+"1190":0.001486157510746217,
+"1200":0,
+"1210":0,
+"1220":0.00226449833700854,
+"1250":0,
+"1260":0.0104498768605209,
+"1270":0.002980094713265147,
+"1281":0.001486974666769165,
+"130":0.009681374109911227,
+"141":0.001488087102419831,
+"151":0.001882791993990916,
+"161":0,
+"171":0,
+"181":0,
+"191":0,
+"20":0.01052065083855782,
+"231":0.001842844650359562,
+"241":0.001486844152384339,
+"270":0,
+"281":0,
+"290":0.001598705384764011,
+"30":0.001483706289432683,
+"301":0.001487754660812699,
+"310":0,
+"330":0.003203033682804932,
+"401":0,
+"431":0.00297983779218626,
+"460":0.001597130889478484,
+"471":0.002974516050108387,
+"490":0.0158997415328232,
+"50":0.004486211607576859,
+"501":0.001596513814308986,
+"511":0.001754047584164595,
+"520":0,
+"531":0,
+"540":0.001598572275648211,
+"560":0.001596025223578268,
+"571":0,
+"591":0.01564122579936378,
+"60":0.008890086763953359,
+"640":0.001486138697600215,
+"650":0,
+"670":0,
+"680":0.001477443847940522,
+"70":0.01791597833971876,
+"700":0,
+"720":0,
+"740":0.001486590832950856,
+"750":0.001833166200077433,
+"770":0.002996528807332027,
+"80":0.001490627448917253,
+"811":0.03190775569786413,
+"90":0,
+"941":0.00147767375136921,
+"961":0,
+"970":0.001478982807032822,
+"Node1":0,
+"Node10":0.009219351096596377,
+"Node101":0,
+"Node107":0.002981896290401657,
+"Node11":0.00428435629762718,
+"Node110":0.001487862231477124,
+"Node114":0.001487028677200215,
+"Node115":0.001486831844443805,
+"Node13":0,
+"Node14":0.01190103062061484,
+"Node16":0.2018572940341614,
+"Node2":0,
+"Node22":0.01294130736944616,
+"Node26":0.0009093274493876565,
+"Node3":0,
+"Node30":0,
+"Node31":0.001488035240367915,
+"Node35":0.001758161860106438,
+"Node36":0.001760463997526154,
+"Node37":0,
+"Node38":0,
+"Node4":0.001487774145909841,
+"Node46":0,
+"Node47":0,
+"Node48":0,
+"Node49":0,
+"Node5":0,
+"Node50":0.001754569791371799,
+"Node51":0.002970847098621362,
+"Node53":0,
+"Node54":0.001484780206377543,
+"Node55":0.002982613222219915,
+"Node58":0.008038721879341756,
+"Node59":0.001601590461237247,
+"Node6":0.0005653976240505934,
+"Node60":0.003200451356318042,
+"Node64":0,
+"Node65":0,
+"Node66":0,
+"Node67":0,
+"Node7":0,
+"Node70":0.001596876297825144,
+"Node75":0.02872356320468966,
+"Node76":0.049129774916543,
+"Node79":0.03909819323680001,
+"Node8":0,
+"Node81":0.008316800628003823,
+"Node84":0,
+"Node85":0.002486337383330317,
+"Node86":0.001082958839435574,
+"Node89":0.003661846109839252,
+"Node9":0.01156458576814094,
+"Node90":0.01147855001505077,
+"Node91":0.003360856522414658,
+"Node92":0,
+"Node96":0.003112289371236688,
+"Node97":0.001493134317219758,
+"Node98":0},
+"branch-annotations":{"1070":0.7867562235496764,
+"11":0.7867562235496764,
+"1110":0.7867562235496764,
+"1150":0.7867562235496764,
+"1180":1,
+"1190":0.7867562235496764,
+"1200":1,
+"1210":1,
+"1220":0.7867562235496764,
+"1250":1,
+"1260":0.7867562235496763,
+"1270":0.7867562235496763,
+"1281":0.7867562235496764,
+"130":0.7867562235496764,
+"141":0.7867562235496764,
+"151":0.7867562235496764,
+"161":1,
+"171":1,
+"181":1,
+"191":1,
+"20":0.7867562235496764,
+"231":0.7867562235496764,
+"241":0.7867562235496764,
+"270":1,
+"281":1,
+"290":0.7867562235496764,
+"30":0.7867562235496764,
+"301":0.7867562235496763,
+"310":1,
+"330":0.7867562235496764,
+"401":1,
+"431":0.7867562235496764,
+"460":0.7867562235496764,
+"471":0.7867562235496763,
+"490":0.7867562235496764,
+"50":0.7867562235496764,
+"501":0.7867562235496764,
+"511":0.7867562235496764,
+"520":1,
+"531":1,
+"540":0.7867562235496766,
+"560":0.7867562235496766,
+"571":1,
+"591":0.7867562235496764,
+"60":0.7867562235496764,
+"640":0.7867562235496764,
+"650":1,
+"670":1,
+"680":0.7867562235496764,
+"70":0.6948312492800665,
+"700":1,
+"720":1,
+"740":0.7867562235496766,
+"750":0.7867562235496764,
+"770":0.7867562235496764,
+"80":0.7867562235496763,
+"811":0.6948312492800665,
+"90":1,
+"941":0.7867562235496764,
+"961":1,
+"970":0.7867562235496764,
+"Node1":1,
+"Node10":0.7867562235496764,
+"Node101":1,
+"Node107":0.7867562235496764,
+"Node11":0.7867562235496764,
+"Node110":0.7867562235496764,
+"Node114":0.7867562235496764,
+"Node115":0.7867562235496766,
+"Node13":1,
+"Node14":0.6948312492800665,
+"Node16":0.6948312492800665,
+"Node2":1,
+"Node22":0.7867562235496764,
+"Node26":0.7867562235496764,
+"Node3":1,
+"Node30":1,
+"Node31":0.7867562235496764,
+"Node35":0.7867562235496764,
+"Node36":0.7867562235496764,
+"Node37":1,
+"Node38":1,
+"Node4":0.7867562235496764,
+"Node46":1,
+"Node47":1,
+"Node48":1,
+"Node49":1,
+"Node5":1,
+"Node50":0.7867562235496764,
+"Node51":0.7867562235496764,
+"Node53":1,
+"Node54":0.7867562235496764,
+"Node55":0.7867562235496764,
+"Node58":0.7867562235496764,
+"Node59":0.7867562235496764,
+"Node6":0.7867562235496764,
+"Node60":0.7867562235496766,
+"Node64":1,
+"Node65":1,
+"Node66":1,
+"Node67":1,
+"Node7":1,
+"Node70":0.7867562235496764,
+"Node75":0.7867562235496764,
+"Node76":0.7867562235496766,
+"Node79":0.7867562235496764,
+"Node8":1,
+"Node81":0.7867562235496764,
+"Node84":1,
+"Node85":0.7867562235496764,
+"Node86":0.7867562235496764,
+"Node89":0.7867562235496764,
+"Node9":0.7867562235496764,
+"Node90":0.7867562235496764,
+"Node91":0.7867562235496764,
+"Node92":1,
+"Node96":0.7867562235496766,
+"Node97":0.7867562235496764,
+"Node98":1},
+"rate-distributions":{"Reference":[
+[0.7867562235496764,1]
+]
+,
+"Test":[
+[0.6948312492800665,1]
+]
+},
+"K":null,
+"annotation-tag":"ω",
+"display-order":0},
+"General Descriptive":{"log-likelihood":-2510.12148333978,
+"parameters":256,
+"AIC-c":5541.925380218928,
+"runtime":1042,
+"branch-lengths":{"1070":0.01507051688092633,
+"11":0.0480336113032309,
+"1110":0.004621629454448378,
+"1150":0.004633116866875893,
+"1180":0.08374807341574794,
+"1190":0.004594312815410755,
+"1200":0,
+"1210":0,
+"1220":0.00682126027537663,
+"1250":0,
+"1260":0.04094107488937999,
+"1270":0.00909003286515344,
+"1281":0.004616582454958663,
+"130":0.04056795750568561,
+"141":0.004386214873879342,
+"151":0.005829852698792406,
+"161":0,
+"171":0,
+"181":0,
+"191":0,
+"20":0.0315006825991361,
+"231":0.00551864637905406,
+"241":0.004647497237457152,
+"270":0,
+"281":0,
+"290":0.004901275973305227,
+"30":0.004542222660792435,
+"301":0.004593746265676476,
+"310":0,
+"330":0.009917723583064281,
+"401":0,
+"431":0.009234146865227558,
+"460":0.004961156145667872,
+"471":0.009285219544458807,
+"490":0.05289079532445221,
+"50":0.01545153393216615,
+"501":0.004960429901950151,
+"511":0.004667525154623543,
+"520":0,
+"531":0,
+"540":0.004897396448489392,
+"560":0.004913943992730562,
+"571":0,
+"591":0.06146932762711033,
+"60":0.02878875791915617,
+"640":0.004614464873424848,
+"650":0,
+"670":0,
+"680":0.004611985036817362,
+"70":0.0538087475156656,
+"700":0,
+"720":0,
+"740":0.00450756855996975,
+"750":0.005406787913423546,
+"770":0.009302247305630494,
+"80":0.004621703425348568,
+"811":3.752355498375274,
+"90":0,
+"941":0.004537454887772691,
+"961":0,
+"970":0.004580659197920004,
+"Node1":0,
+"Node10":0,
+"Node101":0,
+"Node107":0.009312827044637238,
+"Node11":0,
+"Node110":0.00461999325555066,
+"Node114":0.004499835732887994,
+"Node115":0.00445013663304825,
+"Node13":0,
+"Node14":0.006442548606459479,
+"Node16":2.366271314924698,
+"Node2":0,
+"Node22":0.4181008403731409,
+"Node26":0.004627049606230478,
+"Node3":0,
+"Node30":0,
+"Node31":0.004667592421998447,
+"Node35":0.005113277016877582,
+"Node36":0.005312262277801167,
+"Node37":0,
+"Node38":0,
+"Node4":0.004535503343203903,
+"Node46":0,
+"Node47":0,
+"Node48":0,
+"Node49":0,
+"Node5":0,
+"Node50":0.005624711390746245,
+"Node51":0.00921262763823744,
+"Node53":0,
+"Node54":0.00466126644682283,
+"Node55":0.009484479834269558,
+"Node58":0.03013005001219087,
+"Node59":0.004974177776953071,
+"Node6":0,
+"Node60":0.009878464103954807,
+"Node64":0,
+"Node65":0,
+"Node66":0,
+"Node67":0,
+"Node7":0,
+"Node70":0.004814209408545826,
+"Node75":0.2381857766395922,
+"Node76":1.177557216240729,
+"Node79":1.58778646244752,
+"Node8":0,
+"Node81":0.02464365618145849,
+"Node84":0,
+"Node85":0.004929415578494338,
+"Node86":0.005369109377542775,
+"Node89":0.01188899670949422,
+"Node9":0.7504734838118268,
+"Node90":0.03865251901821646,
+"Node91":0.01132667171226762,
+"Node92":0,
+"Node96":0.009615056223657751,
+"Node97":0.004507186671036597,
+"Node98":0},
+"branch-annotations":{"1070":1.435746831559039,
+"11":0.7646582204931152,
+"1110":0.2816051958596132,
+"1150":1.419200858031383,
+"1180":0,
+"1190":1.419734954117826,
+"1200":0.06129024270048154,
+"1210":0.1378089653093327,
+"1220":1.414430996646104,
+"1250":0.1530709791377931,
+"1260":0.7459564421149689,
+"1270":1.42827771499787,
+"1281":0.2814346209917335,
+"130":6.323456659351865,
+"141":1.435747060468951,
+"151":1.423616906365281,
+"161":0.1852202256872906,
+"171":0.2115399563014776,
+"181":0.2988928917993303,
+"191":0.2921427218541583,
+"20":0.651892202362062,
+"231":1.435748686358649,
+"241":1.42018004786682,
+"270":0.2800146402062697,
+"281":0.144745190266959,
+"290":1.424147077348344,
+"30":1.435747029319405,
+"301":1.415323083242052,
+"310":0.1765051104484718,
+"330":0.262258769253264,
+"401":0.2640595872733408,
+"431":0.2731066100164073,
+"460":1.43574722496873,
+"471":0.2841186393900197,
+"490":0.2759320565781293,
+"50":8.67223246359751,
+"501":0.2816308150645453,
+"511":1.421399613935878,
+"520":0.1575259830831688,
+"531":0.1552916560193421,
+"540":1.435743881955572,
+"560":1.435746346693554,
+"571":0.3978142145096692,
+"591":5.0974646152625,
+"60":0.6687599655460934,
+"640":0.2815997189208768,
+"650":0.282307909781026,
+"670":0.1556029898113709,
+"680":1.418029475946428,
+"70":0.2757364954509461,
+"700":0.1833183289300373,
+"720":0.4010677770670187,
+"740":1.43574683867239,
+"750":1.404944833852861,
+"770":1.435213760852394,
+"80":0.2814389776060152,
+"811":1.435752585894778,
+"90":0.2660280197858532,
+"941":1.435749580157444,
+"961":0.2451949741172605,
+"970":0.2814223424799863,
+"Node1":0.2302911937514692,
+"Node10":0.3214988528498675,
+"Node101":0.1225702273154639,
+"Node107":1.435225465994825,
+"Node11":0.3091148846003915,
+"Node110":0.2814378838541954,
+"Node114":1.415478773089694,
+"Node115":1.412931360522061,
+"Node13":0.264096450580804,
+"Node14":0.2837851301403708,
+"Node16":6.025699988138011,
+"Node2":0.2487211656192402,
+"Node22":9.679688550418428,
+"Node26":0.2815407914501583,
+"Node3":0.2097952205341261,
+"Node30":0.2435283319937726,
+"Node31":10.0383905426233,
+"Node35":1.435746707825414,
+"Node36":10.85073635245529,
+"Node37":0.2558518716515806,
+"Node38":0.2703674248927084,
+"Node4":1.435745865043083,
+"Node46":0.2665239830580788,
+"Node47":0.2279930122641046,
+"Node48":0.173198953646394,
+"Node49":0.1258026034238854,
+"Node5":0.1920904114295298,
+"Node50":0.2821985245426114,
+"Node51":0.2773774453823882,
+"Node53":0.4299198505956639,
+"Node54":12.24502285329729,
+"Node55":1.435740683940214,
+"Node58":0.7137934075615333,
+"Node59":0.2818110114725682,
+"Node6":0.2814726760655693,
+"Node60":0.2559565436323231,
+"Node64":0.180014561168595,
+"Node65":0.109180820794452,
+"Node66":0.1596713666576127,
+"Node67":0.1900684634874889,
+"Node7":0.2066500295149583,
+"Node70":1.435745408608493,
+"Node75":9.06111936391245,
+"Node76":9.323788629405337,
+"Node79":1.43575255590769,
+"Node8":0.1374162775033255,
+"Node81":0.3020581840684259,
+"Node84":0.1299599988915341,
+"Node85":1.27416720690502,
+"Node86":0.2808836793697092,
+"Node89":0.271337741339141,
+"Node9":8.821991299488696,
+"Node90":0.6180032225118092,
+"Node91":0.280505466193416,
+"Node92":0.3734016823511493,
+"Node96":0.26721757452034,
+"Node97":1.43575104691327,
+"Node98":0.0718949979594838},
+"rate-distributions":{"All":[
+[0.008122612252609357,0.9360895381153814]
+,[0.9999999999999998,0]
+,[123.1131031373256,0.06391046188461857]
+]
+},
+"K":null,
+"annotation-tag":"k",
+"display-order":1},
+"Null":{"log-likelihood":-2562.371199555051,
+"parameters":138,
+"AIC-c":5403.541056828222,
+"runtime":209,
+"branch-lengths":{"1070":0.01462711941796287,
+"11":0.05050056759614677,
+"1110":0.004878118762717492,
+"1150":0.004551119558292154,
+"1180":0.4289794553740333,
+"1190":0.004558232637574136,
+"1200":0,
+"1210":0,
+"1220":0.006880356401280621,
+"1250":0,
+"1260":0.03915463163372545,
+"1270":0.009050898210974359,
+"1281":0.004824074439022313,
+"130":0.03448150138874911,
+"141":0.004397930172403918,
+"151":0.00574509162503912,
+"161":0,
+"171":0,
+"181":0,
+"191":0,
+"20":0.03133451903821367,
+"231":0.00547638227062397,
+"241":0.004592868844808312,
+"270":0,
+"281":0,
+"290":0.004852263857587514,
+"30":0.004525378479560312,
+"301":0.004554327012698227,
+"310":0,
+"330":0.0104270841992153,
+"401":0,
+"431":0.009868254330027028,
+"460":0.004866395668442037,
+"471":0.01056155418473654,
+"490":0.09042336270870725,
+"50":0.01479378765115098,
+"501":0.005202392820705712,
+"511":0.005044030518039352,
+"520":0,
+"531":0,
+"540":0.004874725014268311,
+"560":0.004873299417069752,
+"571":0,
+"591":0.05192497613139486,
+"60":0.02932526840444127,
+"640":0.004877655702135851,
+"650":0,
+"670":0,
+"680":0.004564269278214246,
+"70":0.09853640176191064,
+"700":0,
+"720":0,
+"740":0.004507252013142027,
+"750":0.005391491711459772,
+"770":0.00920756156965717,
+"80":0.00483840324444017,
+"811":0.3120997320182787,
+"90":0,
+"941":0.004521878099260026,
+"961":0,
+"970":0.00478297817402365,
+"Node1":0,
+"Node10":0,
+"Node101":0,
+"Node107":0.009116283979142778,
+"Node11":0,
+"Node110":0.00482501851633887,
+"Node114":0.004463333895117553,
+"Node115":0.004410675637547546,
+"Node13":0,
+"Node14":0,
+"Node16":0.3959356394710737,
+"Node2":0,
+"Node22":0.06082316414102965,
+"Node26":0.004843692919517652,
+"Node3":0,
+"Node30":0,
+"Node31":0.004633899849705593,
+"Node35":0.005079640390364305,
+"Node36":0.005249499077811148,
+"Node37":0,
+"Node38":0,
+"Node4":0.004517810463091177,
+"Node46":0,
+"Node47":0,
+"Node48":0,
+"Node49":0,
+"Node5":0,
+"Node50":0.005559131948068716,
+"Node51":0.009867191295594839,
+"Node53":0,
+"Node54":0.004623152545662543,
+"Node55":0.009288982091602926,
+"Node58":0.03214163959860373,
+"Node59":0.005282743309007533,
+"Node6":0,
+"Node60":0.01030968239122324,
+"Node64":0,
+"Node65":0,
+"Node66":0,
+"Node67":0,
+"Node7":0,
+"Node70":0.004803139041718783,
+"Node75":0.1160109908535136,
+"Node76":0.2712429933163992,
+"Node79":0.2116154270344629,
+"Node8":0,
+"Node81":0.03041278464349408,
+"Node84":0,
+"Node85":0.006771853256524351,
+"Node86":0.003912188512866112,
+"Node89":0.01128189881291893,
+"Node9":0.2004818364093213,
+"Node90":0.05036774743248931,
+"Node91":0.01094245489586052,
+"Node92":0,
+"Node96":0.009977132731292625,
+"Node97":0.004508105586064859,
+"Node98":0},
+"branch-annotations":{"1070":1,
+"11":1,
+"1110":1,
+"1150":1,
+"1180":1,
+"1190":1,
+"1200":1,
+"1210":1,
+"1220":1,
+"1250":1,
+"1260":1,
+"1270":1,
+"1281":1,
+"130":1,
+"141":1,
+"151":1,
+"161":1,
+"171":1,
+"181":1,
+"191":1,
+"20":1,
+"231":1,
+"241":1,
+"270":1,
+"281":1,
+"290":1,
+"30":1,
+"301":1,
+"310":1,
+"330":1,
+"401":1,
+"431":1,
+"460":1,
+"471":1,
+"490":1,
+"50":1,
+"501":1,
+"511":1,
+"520":1,
+"531":1,
+"540":1,
+"560":1,
+"571":1,
+"591":1,
+"60":1,
+"640":1,
+"650":1,
+"670":1,
+"680":1,
+"70":1,
+"700":1,
+"720":1,
+"740":1,
+"750":1,
+"770":1,
+"80":1,
+"811":1,
+"90":1,
+"941":1,
+"961":1,
+"970":1,
+"Node1":1,
+"Node10":1,
+"Node101":1,
+"Node107":1,
+"Node11":1,
+"Node110":1,
+"Node114":1,
+"Node115":1,
+"Node13":1,
+"Node14":1,
+"Node16":1,
+"Node2":1,
+"Node22":1,
+"Node26":1,
+"Node3":1,
+"Node30":1,
+"Node31":1,
+"Node35":1,
+"Node36":1,
+"Node37":1,
+"Node38":1,
+"Node4":1,
+"Node46":1,
+"Node47":1,
+"Node48":1,
+"Node49":1,
+"Node5":1,
+"Node50":1,
+"Node51":1,
+"Node53":1,
+"Node54":1,
+"Node55":1,
+"Node58":1,
+"Node59":1,
+"Node6":1,
+"Node60":1,
+"Node64":1,
+"Node65":1,
+"Node66":1,
+"Node67":1,
+"Node7":1,
+"Node70":1,
+"Node75":1,
+"Node76":1,
+"Node79":1,
+"Node8":1,
+"Node81":1,
+"Node84":1,
+"Node85":1,
+"Node86":1,
+"Node89":1,
+"Node9":1,
+"Node90":1,
+"Node91":1,
+"Node92":1,
+"Node96":1,
+"Node97":1,
+"Node98":1},
+"rate-distributions":{"Test":[
+[0.02973602259399898,0.9456472444336249]
+,[0.3479875991254224,0]
+,[39.54524762740255,0.05435275556637509]
+]
+,
+"Reference":[
+[0.02973602259399898,0.9456472444336249]
+,[0.3479875991254224,0]
+,[39.54524762740255,0.05435275556637509]
+]
+},
+"K":1,
+"annotation-tag":"k",
+"display-order":2},
+"Alternative":{"log-likelihood":-2557.086440387337,
+"parameters":139,
+"AIC-c":5395.01230588593,
+"runtime":327,
+"branch-lengths":{"1070":0.01436622657326509,
+"11":0.04741542951029464,
+"1110":0.004826637617723217,
+"1150":0.004573297891874367,
+"1180":0.6564162822540249,
+"1190":0.004545668533884496,
+"1200":0,
+"1210":0,
+"1220":0.006842045191118135,
+"1250":0,
+"1260":0.0383245556513511,
+"1270":0.008998434574935557,
+"1281":0.00479104899044448,
+"130":0.03401428813320267,
+"141":0.004404368676887101,
+"151":0.005776574005834475,
+"161":0,
+"171":0,
+"181":0,
+"191":0,
+"20":0.03134271501143725,
+"231":0.005516417640521894,
+"241":0.004576740357112272,
+"270":0,
+"281":0,
+"290":0.004845003008172904,
+"30":0.004513825735215008,
+"301":0.004540159845210981,
+"310":0,
+"330":0.01031760334396423,
+"401":0,
+"431":0.009721008870128396,
+"460":0.004912197127167806,
+"471":0.01035013922625157,
+"490":0.07963099693065259,
+"50":0.01460520341288432,
+"501":0.005162287514882782,
+"511":0.005180569663749735,
+"520":0,
+"531":0,
+"540":0.004865907279816374,
+"560":0.004864172338354037,
+"571":0,
+"591":0.05100620505159464,
+"60":0.0289640345161489,
+"640":0.004826509082013928,
+"650":0,
+"670":0,
+"680":0.004541214469949049,
+"70":6.51570776422033,
+"700":0,
+"720":0,
+"740":0.00450018006901429,
+"750":0.005390943932304935,
+"770":0.009137375353039505,
+"80":0.004803337267138058,
+"811":3.9796708631624,
+"90":0,
+"941":0.004498595753720075,
+"961":0,
+"970":0.004747758990983371,
+"Node1":0,
+"Node10":0,
+"Node101":0,
+"Node107":0.009100622834494582,
+"Node11":0,
+"Node110":0.004791259836901851,
+"Node114":0.004470277419108585,
+"Node115":0.004413040341719759,
+"Node13":0,
+"Node14":0,
+"Node16":4.217677485272404,
+"Node2":0,
+"Node22":0.05645674998930948,
+"Node26":0.004792029647101104,
+"Node3":0,
+"Node30":0,
+"Node31":0.004615965876161487,
+"Node35":0.0051259025191208,
+"Node36":0.005303828646584515,
+"Node37":0,
+"Node38":0,
+"Node4":0.004524736657703141,
+"Node46":0,
+"Node47":0,
+"Node48":0,
+"Node49":0,
+"Node5":0,
+"Node50":0.005570694119953209,
+"Node51":0.009735786437534451,
+"Node53":0,
+"Node54":0.00460625117727008,
+"Node55":0.009213582224213779,
+"Node58":0.03065276968737884,
+"Node59":0.005218198040104283,
+"Node6":0,
+"Node60":0.01018299886655923,
+"Node64":0,
+"Node65":0,
+"Node66":0,
+"Node67":0,
+"Node7":0,
+"Node70":0.004808859684168497,
+"Node75":0.1055640860744371,
+"Node76":0.2620825088369714,
+"Node79":0.1917783410032683,
+"Node8":0,
+"Node81":0.02742551889289364,
+"Node84":0,
+"Node85":0.006932022075821644,
+"Node86":0.003837155477350114,
+"Node89":0.01133653979780969,
+"Node9":0.2026499365633034,
+"Node90":0.04600470192072581,
+"Node91":0.01091287619328137,
+"Node92":0,
+"Node96":0.0098659981338331,
+"Node97":0.004499556713951075,
+"Node98":0},
+"branch-annotations":{"1070":1,
+"11":1,
+"1110":1,
+"1150":1,
+"1180":2.030710072857724,
+"1190":1,
+"1200":1,
+"1210":1,
+"1220":1,
+"1250":1,
+"1260":1,
+"1270":1,
+"1281":1,
+"130":1,
+"141":1,
+"151":1,
+"161":1,
+"171":1,
+"181":2.030710072857724,
+"191":1,
+"20":1,
+"231":1,
+"241":1,
+"270":1,
+"281":1,
+"290":1,
+"30":1,
+"301":1,
+"310":1,
+"330":1,
+"401":2.030710072857724,
+"431":1,
+"460":1,
+"471":1,
+"490":1,
+"50":1,
+"501":1,
+"511":1,
+"520":1,
+"531":1,
+"540":1,
+"560":1,
+"571":1,
+"591":1,
+"60":1,
+"640":1,
+"650":1,
+"670":1,
+"680":1,
+"70":2.030710072857724,
+"700":1,
+"720":1,
+"740":1,
+"750":1,
+"770":1,
+"80":1,
+"811":2.030710072857724,
+"90":1,
+"941":1,
+"961":1,
+"970":1,
+"Node1":1,
+"Node10":1,
+"Node101":1,
+"Node107":1,
+"Node11":1,
+"Node110":1,
+"Node114":1,
+"Node115":1,
+"Node13":2.030710072857724,
+"Node14":2.030710072857724,
+"Node16":2.030710072857724,
+"Node2":1,
+"Node22":1,
+"Node26":1,
+"Node3":1,
+"Node30":1,
+"Node31":1,
+"Node35":1,
+"Node36":1,
+"Node37":1,
+"Node38":1,
+"Node4":1,
+"Node46":1,
+"Node47":1,
+"Node48":1,
+"Node49":1,
+"Node5":1,
+"Node50":1,
+"Node51":1,
+"Node53":1,
+"Node54":1,
+"Node55":1,
+"Node58":1,
+"Node59":1,
+"Node6":1,
+"Node60":1,
+"Node64":1,
+"Node65":1,
+"Node66":1,
+"Node67":1,
+"Node7":1,
+"Node70":1,
+"Node75":1,
+"Node76":1,
+"Node79":1,
+"Node8":1,
+"Node81":1,
+"Node84":1,
+"Node85":1,
+"Node86":1,
+"Node89":1,
+"Node9":1,
+"Node90":1,
+"Node91":1,
+"Node92":1,
+"Node96":1,
+"Node97":1,
+"Node98":1},
+"rate-distributions":{"Test":[
+[0,0.9235180502528358]
+,[1,0.01834530417127372]
+,[1012.865280372721,0.05813664557589043]
+]
+,
+"Reference":[
+[0,0.9235180502528358]
+,[1,0.01834530417127372]
+,[30.20296826021891,0.05813664557589043]
+]
+},
+"K":2.030710072857724,
+"annotation-tag":"k",
+"display-order":3},
+"Partitioned Exploratory":{"log-likelihood":-2549.182213814729,
+"parameters":143,
+"AIC-c":5387.369900883489,
+"runtime":189,
+"branch-lengths":{"1070":0.01486871606281431,
+"11":0.05351884403941704,
+"1110":0.005235359157636393,
+"1150":0.004663828311312744,
+"1180":0.9741375099746545,
+"1190":0.00461607960715451,
+"1200":0,
+"1210":0,
+"1220":0.006837729282280222,
+"1250":0,
+"1260":0.03994995266937723,
+"1270":0.008933726533974494,
+"1281":0.005157435650941742,
+"130":0.03532923967201963,
+"141":0.004316326572483558,
+"151":0.005916032469420116,
+"161":0,
+"171":0,
+"181":0,
+"191":0,
+"20":0.02963033574863408,
+"231":0.005434594922698812,
+"241":0.004674702339410777,
+"270":0,
+"281":0,
+"290":0.004875127053353635,
+"30":0.004553340968900367,
+"301":0.004599971911470282,
+"310":0,
+"330":0.01106951934208059,
+"401":0,
+"431":0.01058694610936185,
+"460":0.005020168650320477,
+"471":0.01243445021099481,
+"490":0.196027702198881,
+"50":0.0156075875703526,
+"501":0.005591541746957689,
+"511":0.005147859053022721,
+"520":0,
+"531":0,
+"540":0.004910047290862558,
+"560":0.00492590532199209,
+"571":0,
+"591":0.04655899820441398,
+"60":0.02987427387628377,
+"640":0.005239144984992887,
+"650":0,
+"670":0,
+"680":0.004643011883176456,
+"70":8.055816550706549,
+"700":0,
+"720":0,
+"740":0.004506341018784102,
+"750":0.005279606013161881,
+"770":0.009200423281226767,
+"80":0.005177263229720848,
+"811":5.051884203007309,
+"90":0,
+"941":0.004553449777095297,
+"961":0,
+"970":0.005110948825201298,
+"Node1":0,
+"Node10":0,
+"Node101":0,
+"Node107":0.009163352885359617,
+"Node11":0,
+"Node110":0.005156848156420883,
+"Node114":0.004448766461624355,
+"Node115":0.004337573713901547,
+"Node13":0,
+"Node14":0,
+"Node16":6.362270371803258,
+"Node2":0,
+"Node22":0.06817631801033337,
+"Node26":0.005184997586898156,
+"Node3":0,
+"Node30":0,
+"Node31":0.004750390017656249,
+"Node35":0.004975077313845621,
+"Node36":0.00531485536203878,
+"Node37":0,
+"Node38":0,
+"Node4":0.004552997479515763,
+"Node46":0,
+"Node47":0,
+"Node48":0,
+"Node49":0,
+"Node5":0,
+"Node50":0.005917834127367785,
+"Node51":0.01067554132870384,
+"Node53":0,
+"Node54":0.004740491981176166,
+"Node55":0.009417708857766004,
+"Node58":0.03659531327327033,
+"Node59":0.00570046219999534,
+"Node6":0,
+"Node60":0.01073976986776252,
+"Node64":0,
+"Node65":0,
+"Node66":0,
+"Node67":0,
+"Node7":0,
+"Node70":0.004797003507325493,
+"Node75":0.1081579140779527,
+"Node76":0.219700289812137,
+"Node79":0.2154761657345406,
+"Node8":0,
+"Node81":0.06315236636143448,
+"Node84":0,
+"Node85":0.005391585049577654,
+"Node86":0.006402689892193427,
+"Node89":0.01116909767154517,
+"Node9":0.1420788444161731,
+"Node90":0.0531669495424948,
+"Node91":0.01213939586205096,
+"Node92":0,
+"Node96":0.01029957631795297,
+"Node97":0.004497888420554997,
+"Node98":0},
+"branch-annotations":null,
+"rate-distributions":{"Test":[
+[0.08291946728273129,0.9089324901425473]
+,[0.08646915808282422,0.009074524447653966]
+,[1315.85318806039,0.08199298540979874]
+]
+,
+"Reference":[
+[0.1106140465901804,0.01184049837539402]
+,[0.1298864281494123,0.9599701794455813]
+,[68.05520944414916,0.02818932217902471]
+]
+},
+"K":null,
+"annotation-tag":"",
+"display-order":4}},
+"timers":{"Overall":1832,
+"Preliminaries":64,
+"General Descriptive":1042,
+"Null":209,
+"Alternative":327,
+"Partitioned Descriptive":189},
+"relaxation-test":{"LR":10.56951833542826,
+"p":0.001149676785119569},
+"partition":{"RELAX.test":{"1180":1,
+"181":1,
+"401":1,
+"70":1,
+"811":1,
+"Node13":1,
+"Node14":1,
+"Node16":1},
+"RELAX.reference":{"1070":1,
+"11":1,
+"1110":1,
+"1150":1,
+"1190":1,
+"1200":1,
+"1210":1,
+"1220":1,
+"1250":1,
+"1260":1,
+"1270":1,
+"1281":1,
+"130":1,
+"141":1,
+"151":1,
+"161":1,
+"171":1,
+"191":1,
+"20":1,
+"231":1,
+"241":1,
+"270":1,
+"281":1,
+"290":1,
+"30":1,
+"301":1,
+"310":1,
+"330":1,
+"431":1,
+"460":1,
+"471":1,
+"490":1,
+"50":1,
+"501":1,
+"511":1,
+"520":1,
+"531":1,
+"540":1,
+"560":1,
+"571":1,
+"591":1,
+"60":1,
+"640":1,
+"650":1,
+"670":1,
+"680":1,
+"700":1,
+"720":1,
+"740":1,
+"750":1,
+"770":1,
+"80":1,
+"90":1,
+"941":1,
+"961":1,
+"970":1,
+"Node1":1,
+"Node10":1,
+"Node101":1,
+"Node107":1,
+"Node11":1,
+"Node110":1,
+"Node114":1,
+"Node115":1,
+"Node2":1,
+"Node22":1,
+"Node26":1,
+"Node3":1,
+"Node30":1,
+"Node31":1,
+"Node35":1,
+"Node36":1,
+"Node37":1,
+"Node38":1,
+"Node4":1,
+"Node46":1,
+"Node47":1,
+"Node48":1,
+"Node49":1,
+"Node5":1,
+"Node50":1,
+"Node51":1,
+"Node53":1,
+"Node54":1,
+"Node55":1,
+"Node58":1,
+"Node59":1,
+"Node6":1,
+"Node60":1,
+"Node64":1,
+"Node65":1,
+"Node66":1,
+"Node67":1,
+"Node7":1,
+"Node70":1,
+"Node75":1,
+"Node76":1,
+"Node79":1,
+"Node8":1,
+"Node81":1,
+"Node84":1,
+"Node85":1,
+"Node86":1,
+"Node89":1,
+"Node9":1,
+"Node90":1,
+"Node91":1,
+"Node92":1,
+"Node96":1,
+"Node97":1,
+"Node98":1}},
+"tree":"((((((((((((70,((811,(181,1180)Node16)Node14,401)Node13)Node11,1220)Node10,1070)Node9,(720,750)Node22)Node8,151)Node7,(50,770)Node26)Node6,1150)Node5,((431,1250)Node31,1210)Node30)Node4,((((680,941)Node38,650)Node37,970)Node36,700)Node35)Node3,1190)Node2,171)Node1,((((((30,(((80,471)Node55,(((270,501)Node60,460)Node59,((((310,330)Node67,(520,560)Node70)Node66,290)Node65,540)Node64)Node58)Node54,((591,1260)Node76,(11,(191,231)Node81)Node79)Node75)Node53)Node51,(((20,60)Node86,(((( [...]
\ No newline at end of file
diff --git a/tests/hbltests/RegressionTesting/RELAX/segfault.nex.alternative.fit b/tests/hbltests/RegressionTesting/RELAX/segfault.nex.alternative.fit
new file mode 100644
index 0000000..8e0cf55
--- /dev/null
+++ b/tests/hbltests/RegressionTesting/RELAX/segfault.nex.alternative.fit
@@ -0,0 +1,3783 @@
+#NEXUS
+
+BEGIN TAXA;
+	DIMENSIONS NTAX = 61;
+	TAXLABELS
+		'70' '151' '1150' '50' '30' '80' '471' '270' '501' '310' '460' '330' '290' '520' '560' '540' '20' '60' '511' '1281' '90' '130' '571' '301' '281' '531' '490' '640' '961' '740' '591' '1260' '11' '191' '231' '161' '1110' '141' '171' '670' '1200' '241' '1270' '1190' '680' '941' '650' '970' '700' '431' '1250' '1210' '770' '720' '750' '1070' '811' '1220' '401' '181' '1180' ;
+END;
+
+BEGIN CHARACTERS;
+	DIMENSIONS NCHAR = 681;
+	FORMAT
+		DATATYPE = DNA
+		GAP=-
+		MISSING=?
+	;
+
+MATRIX
+	'70'    ------GTTCTTATGAGAAGAATGGCTCTTAAGAAATTGAAGGTGATACCAAAGGAAGGTTACTTATTACTTTTGGACTTTGATGATGAGGACGATGACATAAAAGTTTCAGAGGAGGCTCTTTCAGAAGTAAAGAGCCCAGCATTTGATAAAAATGAGAATATATCACCTCAAGCAGAAGCAGATGAAGATATCGGAGATGAAGTAGATAGTATGTTGGATAAATCTGAAGTAAACAACCCAGAAATTGGTAAAGATGAAAATATATCGCCTCAAGTAAAAGGAGATGAAGACATGGGACATGAAGTAGGCAGTATGTTGGATAAATCTGGAGATGACATTTATAAGACGCTTCACATAAAGAGAAAATGGATGGAAACTTATGTCAAAGAATCTTTCAAAGGCAGCAACCAGAAATTAGAAAGATTTTGCAAAATGAACGAACGAGAGAGGAAGAACATCAACAACAAATTTGTGAGCAGT [...]
+	'151'   ------GTTCTTATGAGAAGAATGGCTCTTAAGAAATTGAAGGTGATACCAAAGGAAGGTTACTTATTACTTTTGGACTTTGATGATGAGGACGATGACATAAAAGTTTCAGAGGAGGCTCTTTCGGAAGTAAAGAGCCCAGCATTTGATAAAAATGAGAATATATCGCCTCAAGCAGAAGCAGATGAAGATATGGGAGATGAAGTAGACAGTATGTTGGATAAATATGAAGTAAATAATCCAGCAATTGGTAAAGATGAAAATATATCGCCTCAAGTAAAAGGAGATGAAGACATGGGACATGAAGTAGGCAGTATGTTGGATAAATCTGGAGATGACATTTATAAGACGCTTCACATAAAGAGAAAATGGATGGAAACTTATGTCAAAGAATCTTTCAAAGGCAGCAACCAGAAATTAGAAAGATTTTGCAAAACGAACGAACGAGAGAGGAAGAACATCAACAACAAATTTTGTGAGCAG [...]
+	'1150'  ------GTTCTTATGAGAAGAATGGCTCTTAAGAAATTGAAGGTGATACCAAAGGAAGGTTACTTATTACTTTTGGACTTTGATGATGAGGACGATGACATAAAAGTTTCAGAGGAGGCTCTTTCGGAAGTAAAGAGCCCAGCATTTGATAAAAATGAGAATATATCGCCTCAAGCAGAAGCAGATGAAGATATGGGAGATGAAGTAGACAGTATGTTGGATAAATATGAAGTAAATAATCCAGCAATTGGTAAAGATGAAAATATATCGCCTCAAGTAAAAGGAGATGAAGACATGGGACATGAAGTAGGCAGTATGTTGGATAAATCTGGAGATGACATTTATAAGACGCTTCACATAAAGAGAAAATGGATGGAAACTTATGTCAAAGAATCTTTCAAAGGCAGCAACCAGAAATTAGAAAGATTTTGCAAAACGAACGAACGAGAGAGGAAGAACATCAACAACAAATTTTGTGAGCAG [...]
+	'50'    ------GTTCTTATGAGAAGAATGGCTCTTAAGAAATTGAAGGTGATACCAAAGGAAGGTTACTTATTACTTTTGGACTTTGATGATGAGGACGATGACATAAAAGTTTCAGAGGAGGCTCTTTCGGAAGTAAAGAGCCCAGCATTTGATAAAAATGAGAATATATCGCCTCAAGCAGAAGCAGATGAAGATATGGGAGATGAAGTAGACAGTATGTTGGATAAATCTGAAGTAAATAATCCAGCAATTGGTAAAGATGAAAATATATCGCCTCAAGTAAAAGGAGATGAAGACATGGGACATGAAGTAGGCAGTATGTTGGATAAATCTGGAGATGACATTTATAAGACGCTTCACATAAAGAGAAAATGGATGGAAACTTATGTCAAAGAATCTTTCAAAGGCAGCAACCAGAAATTAGAAAGATTTTGCAAAACGAACGAACGAGAGAGGAAGAACATCAACAACAAATTTTGTGAGCAG [...]
+	'30'    ------GTTCTTATGAGAAGAATGGCTCTTAAGAAATTGAAGGTGATACCAAAGGAAGGTTACTTATTACTTTTGGACTTTGATGATGAGGACGATGACATAAAAGTTTCAGAGGAGGCTCTTTCGGAAGTAAAGAGCCCAGCGTTTGATAAAAATGAGAATATATCGCCTCAAGCAGAAGCAGATGAAGATATGGGAGATGAAGTAGACAGTATGTTGGATAAATCTGAAGTAAATAACCCAGCAATTGGTAAAGATGGAAATATATCGCCTCAAGTAAAAGGAGATGAAGACATGGGACATGAAGTAGGCAGTATGTTGGATAAATCTGGAGATGACATTTATAAGACGCTTCACATAAAGAGAAAATGGATGGAAACTTATGTCAAAGAATCTTTCAAAGGCAGCAACCAGAAATTAGAAAGATTTTGCAAAACGAACGAACGAGAGAGGAAGAACATCAACAACAAATTTTGTGAGCAG [...]
+	'80'    ------GTTCTTATGAGAAAAATGGCTCTTAAGAAATTGAAGGTGATACCAAAGGAAGGTTACTTATTACTTTTGGACTTTGATGATGAGGACGATGACATAAAAGTTTCAGAGGAGGCTCTTTCGGAAGTAAAGAGCCCAGCGTTTGATAAAAATGAGAATATATCGCCTCAAGCAGAAGCAGATGAAGATATGGGAGATGAAGTAGACAGTATGTTGGATAAATCTGAAGTAAATAACCCAGCAATTGGTAAAGATGGATATATATCGCCTCAAGTAAAAGGAGATGAAGACATGGGACATGAAGTAGGCAGTATGTTGGATAAATCTGGAGATGACATTTATAAGACGCTTCACATAAAGAGAAAATGGATGGAAACTTATGTCAAAGAATCTTTCAAAGGCAGCAACCAGAAATTAGAAAGATTTTGCAAAACGAACGAACGAGAGAGGAAGAACATCAACAACAAATTTTGTGAGCAG [...]
+	'471'   ------GTTCTCATGAGAAAAATGGCTCTTAAGAAATTGAAGGTGATACCAAAGGAAGGTTACTTATTACTTTTGGACTTTGATGATGAGGACGATGACATAAAAGTTTCAGAGGAGGCTCTTTCAGAAGTAAAGAGCCCAGCGTTTGATAAAAATGAGAATATATCGCCTCAAGCAGAAGCAGATGAAGATATGGGAGATGAAGTAGACAGTATGTTGGATAAATCTGAAGTAAATAACCCAGCAATTGGTAAAGATGGATATATATCGCCTCAAGTAAAAGGAGATGAAGACATGGGACATGAAGTAGGCAGTATGTTGGATAAATCTGGAGATGACATTTATAAGACGCTTCACATAAAGAGAAAATGGATGGAAACTTATGTCAAAGAATCTTTCAAAGGCAGCAACCAGAAATTAGAAAGATTTTGCAAAACGAACGAACGAGAGAGGAAGAACATCAACAACAAATTTTGTGAGCAG [...]
+	'270'   ------GTTCTTATGAGAAGAATGGCTCTTAAGAAATTGAAGGTGATACCAAAGGAAGGTTACTTATTACTTTTGGACTTTGATGATGAGGACGATGACATGAAAGTTTCAGAGGAGGCTCTTTCGGAAGTAAAGAGCCCAGCGTTTGATAAAAATGAGAATATATCGCCTCAAGCAGAAGCAGATGAAGATATGGGAGATGAAGTAGACAGTATGTTGGATAAATCTGAAGTAAATAACCCAGCAATTGGTAAAGATGGATATATATCGCCTCAAGTAAAAGGAGATGAAGACATGGGACATGAAGTAGGCAGTATGTTGGATAAATCTGGAGATGACATTTATAAGACGCTTCACATAAAGAGAAAATGGATGGAAACTTATGTCAAAGAATCTTTCAAAGGCAGCAACCAGAAATTAGAAAGATTTTGCAAAACGAACGAACGAGAGAGGAAGAACATCAACAACAAATTTTGTGAGCAG [...]
+	'501'   ------GTTCTTATGAGAAGAATGGCTCTTAAGAAATTGAAGGTGATACCAAAGGAAGGTTACTTATTACTTTTGGACTTTGATGATGAGGACGATGACATGAAAGTTTCAGAGGAGGCTCTTTCGGAAGTAAAGAGCCCAGCGTTTGATAAAAATGAGAATATATCGCCTCAAGCAGAAGCAGATGAAGATATGGGAGATGAAGTAGACAGTATGTTGGATAAATCTGAAGTAAATAACCCAGCAATTGGTAAAGATGGATATATATCGCCTCAAGTAAAAGGAGATGAAGACATGGGACATGAAGTAGGCAGTATGTTGGATAAATCTGGAGATGACATTTATAAGACGCTTCACATAAAGAGAAAATGGATGGAAACTTATGTCAAAGAATCTTTCAAAGGTAGCAACCAGAAATTAGAAAGATTTTGCAAAACGAACGAACGAGAGAGGAAGAACATCAACAACAAATTTTGTGAGCAG [...]
+	'310'   ------GTTCTTATGAGAAGAATGGCTCTTAAGAAATTGAAGGTGATACCAAAGGAAGGTTACTTATTACTTTTGGACTTTGATGATGAGGATGATGACATAAAAGTTTCAGAGGAGGCTCTTTCGGAAGTAAAGAGCCCAGCGTTTGATAAAAATGAGAATATATCGCCTCAAGCAGAAGCAGATGAAGATATGGGAGATGAAGTAGACAGTATGTTGGATAAATCTGAAGTAAATAACCCAGCAATTGGTAAAGATGGATATATATCGCCTCAAGTAAAAGGAGATGAAGACATGGGACATGAAGTAGGCAGTATGTTGGATAAATCTGGAGATGACATTTATAAGACGCTTCACATAAAGAGAAAATGGATGGAAACTTATGTCAAAGAATCTTTCAAAGGCAGCAACCAGAAATTAGAAAGATTTTGCAAAACGAACGAACGAGAGAGGAAGAACATCAACAACAAATTTTGTGAGCAG [...]
+	'460'   ------GTTCTTATGAGAAGAATGGCTCTTAAGAAATTGAAGGTGATACCAAAGGAAGGTTACTTATTACTTTTGGACTTTGATGATGAGGATGATGACATAAAAGTTTCAGAGGAGGCTCTTTCGGAAGTAAAGAGCCCAGCGTTTGATAAAAATGAGAATATATCGCCTCAAGCAGAAGCAGATGAAGATATGGGAGATGAAGTAGACAGTATGTTGGATAAATCTGAAGTAAATAACCCAGCAATTGGTAAAGATGGATATATATCGCCTCAAGTAAAAGGAGATGAAGACATGGGACATGAAGTAGGCAGTATGTTGGATAAATCTGGAGATGACATTTATAAGACGCTTCACATAAAGAGAAAATGGATGGAAACTTATGTCAAAGAATCTTTCAAAGGCAGCAACCAGAAATTAGAAAGATTTTGCAAAACGACCGAACGAGAGAGGAAGAACATCAACAACAAATTTTGTGAGCAG [...]
+	'330'   ------GTTCTTATGAGAAGAATGGCTCTTAAGAAATTGAAGGTGATACCAAAGGAAGGTTACTTATTACTTTTGGACTTTGATGATGAGGATGATGACATAAAAGTTTCAGAGGAGGTTCTTTCGGAAGTAAAGAGCCCAGCGTTTGATAAAAATGAGAATATATCGCCTCAAGCAGAAGCAGATGAAGATATGGGAGATGAAGTAGACAGTATGTTGGATAAATCTGAAGTAAATAACCCAGCAATTGGTAAAGATGGATATATATCGCCTCAAGTAAAAGGAGATGAAGACATGGGACATGAAGTAGGCAGTATGTTGGATAAATCTGGAGATGACATTTATAAGACACTTCACATAAAGAGAAAATGGATGGAAACTTATGTCAAAGAATCTTTCAAAGGCAGCAACCAGAAATTAGAAAGATTTTGCAAAACGAACGAACGAGAGAGGAAGAACATCAACAACAAATTTTGTGAGCAG [...]
+	'290'   ------GTTCTTATGAGAAGAATGGCTCTTAAGAAATTGAAGGTGATACCAAAGGAAGGTTACTTATTACTTTTGGACTTTGATGATGAGGATGATGACATAAAAGTTTCAGAGGAGGCTCTTTCGGAAGTAAAGAGCCCAGCGTTTGATAAAAATGAGAATATATCGCCTCAAGCAGAAGCAGATGAAGATATGGGAGATGAAGTAGACAGTATGTTGGATAAATCTGAAGTAAATAACCCAGCAATTGGTAAAGATGGATATATATCGCCTCAAGTAAAAGGAGATGAAGACATGGGACATGAAGTAGGCAGTATGTTGGATAAATCTGGAGATGACATTTATAAGACGCTTCACATAAAGAGAAAATGGATGGAAACTTATGTCAAAGAATCTTTCAAAGGCAGCAACCAGAAATTAGAAAGATTTTGCAAAACGAACGAACGAGAGAGGAAGAACATCAACAACAAATTTTGTGAGCAG [...]
+	'520'   ------GTTCTTATGAGAAGAATGGCTCTTAAGAAATTGAAGGTGATACCAAAGGAAGGTTACTTATTACTTTTGGACTTTGATGATGAGGATGATGACATAAAAGTTTCAGAGGAGGCTCTTTCGGAAGTAAAGAGCCCAGCGTTTGATAAAAATGAGAATATATCGCCTCAAGCAGAAGCAGATGAAGATATGGGAGATGAAGTAGACAGTATGTTGGATAAATCTGAAGTAAATAACCCAGCAATTGGTAAAGATGGATATATATCGCCTCAAGTAAAAGGAGATGAAGACATGGGACATGAAGTAGGCAGTATGTTGGATAAATCTGGAGATGACATTTATAAGACGCTTCACATAAAGAGAAAATGGATGGAAACTTATGTCAAAGAATCTTTCAAAGGCAGCAACCAGAAATTAGAAAGATTTTGCAAAACGAACGAACGAGAGAGGAAGAACATCAACAACAAATTTTGTGAGCAG [...]
+	'560'   ------GTTCTTATGAGAAGAATGGCTCTTAAGAAATTGAAGGTGATACCAAAGGAAGGTTACTTATTACTTTTGGACTTTGATGATGAGGATGATGACATAAAAGTTTCAGAGGAGGCTCTTTCGGAAGTAAAGAGCCCAGCGTTTGATAAAAATGAGAATATATCGCCTCAAGCAGAAGCAGATGAAGATATGGGAGATGAAGTAGACAGTATGTTGGATAAATCTGAAGTAAATAACCCAGCAATTGGTAAAGATGGATATATATCGCCTCAAGTAAAAGGAGATGAAGACATGGGACATGAAGTAGCCAGTATGTTGGATAAATCTGGAGATGACATTTATAAGACGCTTCACATAAAGAGAAAATGGATGGAAACTTATGTCAAAGAATCTTTCAAAGGCAGCAACCAGAAATTAGAAAGATTTTGCAAAACGAACGAACGAGAGAGGAAGAACATCAACAACAAATTTTGTGAGCAG [...]
+	'540'   ------GTTCTTATGAGAAGAATGGCTCTTAAGAAATTGAAGGTGATACCAAAGGAAGGTTACTTATTACTTTTGGACTTTGATGATGAGGATGATGACATAAAAGTTTCAGAGGAGGCTCTTTCGGAAGTAAAGAGCCCAGCGTTTGATAAAAATGAGAATATATCGCCTCAAGCAGAAGCAGATGAAGATATGGGAGATGAAGTAGACAGTATGTTGGATAAATCTGAAGTAAATAACCCAGCAATTGGTAAAGATGGATATATATCGCCTCAAGTAAAAGGAGATGAAGACATGGGACATGAAGTAGGCAGTATGTTGGATAAATCTGGAGATGACATTTATAAGACGCTTCACATAAAGAGAAAATGGATGGAAACTTATGTCAAAGAATCTTTCAAAGGCAGCAACCAGAAATTAGAAAGATTTTGCAAAACGAACGAACGAGAGAGGAAGAACATCAACAACAAATTTTGTGAGCAG [...]
+	'20'    ------GTTCTTATGAGAAGAATGGCTCTTAAGAAATTGAAGGTGATACCAAAGGAAGGTTACTTATTACTTTTGGACTTTGATGATGAGGACGATGACATAAAAGTTTCAGAGGAGGCTCTTCCGGAAGTAAAGAGCCCAGCATTTGATAAAAATGAGAATATATCGCCTCAAGCAGAAGCAGATGAAGATATGGGAGATGAAGTAGATAGTATTTTGGATAAATCTGAAGTAAATAACCCAGCAATTGGTAAAGATGAAAATATATCGCCTCAAGTAAAAGGAGATGAAGACATGGGACATGAAGTAGGCAGTATGTTGGATAAATCTGGAGATGACATTTATAAGATGCTTCACATAAAGAGAAAATGGATGGAAACTTATGTCAAAGAATCATTCAAAGACAGCAACCAGAAATTAGAAAGATTTTGCAAAATGAACGAACGAGAGAGGAAGAACATCAACAACAAATTTTGTGAGCAG [...]
+	'60'    ------GTTCTTATGAGAAGAATGGCTCTTAAGAAATTGAAGGTGATACCAAAGGAAGGTTACTTATTACTTTTGGACTTTGATGATGAGGACGATGACATAAAAGTTTCAGAGGAGGCTCTTTCGGAAGTAAAGAGCCAAGCATTTGATAAAAATGAGAATATATCGCCTCAAGCAGAAGCAGATGAAGATATGGGAGATGAAGTAGATAGTATATTGGATAAATCTGAATTAAATAACCCAGCAATTGGTAAAGATGAAAATATATCGCCTCAAGTAAAAGGAGATGAAGACATGGGACATGAAGTAGGCAGTATGTTGGATAAATCTGGAGATGACATTTATAAGACGCTTCACATAAAGAGAAAATTGATGGAAACTTATGTCAAAGAATCTTTCAAAGGCAGCAACCAGAAATTAGAAAGATTTTGCAAAATGAACGAACGAGAGAGGAAGAACATCAACAACAAATTTTGTGAGCAG [...]
+	'511'   TATTCAGTTCTTATGAGAAAAATGGCTCTTAAGAAATTGAAGGTGATACCAAAGGAAGGTTACTTATTACTTTTGGACTTTGATGATGAGGATGATGACATAAAAGTTTCAGAGGAGGCTCTTTCGGAAGTAAAGAGCCCAGCATTTGATAAAAATGAGAATATATCGCCTCAAGCAGAAGCAGATGAAGATATGGGAGATGAAGTAGACAGTATGTTGGATAAATCTGAAGTAAACCACCCAGCAATTGGTAAAGATGAAAATATATCGCCTCAAGTAAAAGGACATGAAGACAGGGGACATGAAGTAGGCAGTATGTTGGATAAATCTGGAGATGACATTTATAAGACGCTTCACATAAAGAGAAAATGGATGGAAACTTATGTCAAAGAATCTTTCAAAGGCAGGAACCAGAAATTAGAAAGATTTTGCAAAATGAACGAACGAGAGAGGAAGAACATCAACAACAAATTTTGTGAGCAG [...]
+	'1281'  ------GTTCTTATGAGAAAAATGGCTCTTAAGAAATTGAAGGTGATACCAAAGGAAGGTTACTTATTACTTTTGGACTTTGATGATGAGGATGATGACATAAAAGTTTCAGAGGAGGCTCTATCGGAAGTAAAGAGCCCAGCATTTGATAAAAATGAGAATATATCGCCTCAAGCAGAAGCAGATGAAGATATGGGAGATGAAGTAGACAGTATGTTGGATAAATCTGAAGTAAACAACCCAGCAATTGGTAAAGATGAAAATATATCGCCTCAAGTAAAAGGACATGAAGACAGGGGACATGAAGTAGGCAGTATGTTGGATAAATCTGGAGATGACATTTATAAGACGCTTCACATAAAGAGAAAATGGATGGAAACTTATGTCAAAGAATCTTTCAAAGGCAGGAACCAGAAATTAGAAAGATTTTGCAAAATGAACGAACGAGAGAGGAAGAACATCAACAACAAATTTTGTGAGCAG [...]
+	'90'    ------GTTCTTATGAGAAAAATGGCTCTTAAGAAATTGAAGGTGATACCAAAGGAAGGTTACTTATTACTTTTGGACTTTGATGATGAGGATGATGACATAAAAGTTTCAGAGGAGGCTCTTTCGGAAGTAAAGAGCCCAGCATTTGATAAAAATGAGAATATATCGCCTCAAGCAGAAGCAGATGAAGATATGGGAGATGAAGTAGACAGTATGTTGGATAAATCTGAAGTAAACAACCCAGCAATTGGTAAAGATGAAAATATATCGCCTCAAGTAAAAGGACATGAAGACAGGGGACATGAAGTAGGCAGTATGTTGGATAAATCTGGAGATGACATTTATAAGACGCTTCACATAAAGAGAAAATGGATGGAAACTTATGTCAAAGAATCTTTCAAAGGCAGGAACCAGAAATTAGAAAGATTTTGCAAAATGAACGAACGAGAGAGGAAGAACATCAACAACAAATTTTGTGAGCAG [...]
+	'130'   ------GTTCTTATGAGAAAAATGGCTCTTAAGAAATTGAAGGTGATACCAAAGGAAAGTTACTTATTACTTTTGGACTTTGATGATGAGGACGATGATATAAAAGTTTCAGAGGAGGCTCTTTCGGAAGTAAAGAGCCCAGCATTTGATAAAAATGAGAATATATCGCCTCAAGCAGAAGCAGATGAAGATATGGGAGATGAAGTAGACAGTATGTTGGATAAATCTGAAGTAAACAACCCAGCAATTGGTAAAGATGAAAATATATCGCCTCAAGTAAAAGGACATGAAGACAGGGGACATGAAATAGGCAGTATGTTGGATAAATCTGGAGATGACATTTATAAGACGCTTCACATAAAGAGAAAATGGATGGAAACTTATGTCAAAGAATCTTTCAAAGGCAGGAACCAGAAATTAGAAAGATTTTGCAAAATGCACGAACGAGAGAGGAAGAACATCAACAACAAATTTTGTGAGCAG [...]
+	'571'   ------GTTCTTATGAGAAAAATGGCTCTTAAGAAATTGAAGGTGATACCAAAGGAAAGTTACTTATTACTTTTGGACTTTGATGATGAGGACGATGATATAAAAGTTTCAGAGGAGGCTCTTTCGGAAGTAAAGAGCCCAGCATTTGATAAAAATGAGAATATATCGCCTCAAGCAGAAGCAGATGAAGATATGGGAGATGAAGTAGACAGTATGTTGGATAAATCTGAAGTAAACAACCCAGCAATTGGTAAAGATGAAAATATATCGCCTCAAGTAAAAGGACATGAAGACAGGGGACATGAAATAGGCAGTATGTTGGATAAATCTGGAGATGACATTTATAAGACGCTTCACATAAAGAGAAAATGGATGGAAACTTATGTCAAAGAATCTTTCAAAGGCAGGAACCAGAAATTAGAAAGATTTTGCAAAATGAACGAACGAGAGAGGAAGAACATCAACAACAAATTTTGTGAGCAG [...]
+	'301'   ------GTTCTTATGAGAAAAATGGCTCTTAAGAAATTGAAGGTGATACCAAAGGAAAGTTACTTATTACTTTTGGACTTTGATGATGAGGACGATGATATAAAAGTTTCAGAGGAGGCTCTTTCGGAAGTAAAGAGCCCAGCATTTGATAAAAATGAGAATATATCGCCTCAAGCAGAAGCAGATGAAGATATGGGAGATGAAGTAGACAGTATGTTGGATAAATCTGAAGTAAACAACCCAGCAATTGGTAAAGATGAAAATATATCGCCTCAAGTAAAAGGACATGAAGACAGGGGACATGAAATAGGCAGTATGTTGGATAAATCTGGAGATGACATTTATAAGACGCTTCACATAAAGAGAAAATTGATGGAAACTTATGTCAAAGAATCTTTCAAAGGCAGGAACCAGAAATTAGAAAGATTTTGCAAAATGAACGAACGAGAGAGGAAGAACATCAACAACAAATTTTGTGAGCAG [...]
+	'281'   ------GTTCTTATGAGAAAAATGGCTCTTAAGAAATTGAAGGTGATACCAAAGGAAAGTTACTTATTACTTTTGGACTTTGATGATGAGGACGATGATATAAAAGTTTCAGAGGAGGCTCTTTCGGAAGTAAAGAGCCCAGCATTTGATAAAAATGAGAATATATCGCCTCAAGCAGAAGCAGATGAAGATATGGGAGATGAAGTAGACAGTATGTTGGATAAATCTGAAGTAAACAACCCAGCAATTGGTAAAGATGAAAATATATCGCCTCAAGTAAAAGGACATGAAGACAGGGGACATGAAATAGGCAGTATGTTGGATAAATCTGGAGATGACATTTATAAGACGCTTCACATAAAGAGAAAATGGATGGAAACTTATGTCAAAGAATCTTTCAAAGGCAGGAACCAGAAATTAGAAAGATTTTGCAAAATGAACGAACGAGAGAGGAAGAACATCAACAACAAATTTTGTGAGCAG [...]
+	'531'   ------GTTCTTATGAGAAAAATGGCTCTTAAGAAATTGAAGGTGATACCAAAGGAAAGTTACTTATTACTTTTGGACTTTGATGATGAGGACGATGATATAAAAGTTTCAGAGGAGGCTCTTTCGGAAGTAAAGAGCCCAGCATTTGATAAAAATGAGAATATATCGCCTCAAGCAGAAGCAGATGAAGATATGGGAGATGAAGTAGACAGTATGTTGGATAAATCTGAAGTAAACAACCCAGCAATTGGTAAAGATGAAAATATATCGCCTCAAGTAAAAGGACATGAAGACAGGGGACATGAAGTAGGCAGTATGTTGGATAAATCTGGAGATGACATTTATAAGACGCTTCACATAAAGAGAAAATGGATGGAAACTTATGTCAAAGAATCTTTCAAAGGCAGGAACCAGAAATTAGAAAGATTTTGCAAAATGAACGAACGAGAGAGGAAGAACATCAACAACAAATTTTGTGAGCAG [...]
+	'490'   ------GTTCTTATGAGAAGAATGGCTCTTAAGAAATTGAAGGTGATACCAAAGGAAGGTTACTTATTACTATTGGACTTTGATGATGAGGATGATGACATAAAAGTTTCAGAGGAGGCTCTTTCGGAAGTAAAGAGCCCAGCATTTGATAAAAATGAGAATATATCACCTCAAGCAGAAGCAGATGAAGATATCGGAGATGAAATAGATAGTATGTTGGATAAATCTGAAGTAAACAACCCAGCAATTGGTAAAGATGAAAATATATCGCCTCAAGTAAAAGGAGATGAAGACATGGGACATGAAGTAGGCAGTATGTTGGATAAATCTGGAGATGACATATATAAGACGCTTCACATAAAGAGAAAATGGATGGAAACTTATGTCAAAGAATCTTTCAAAGGCAGGAACCAGAAATTAGAAAGATTTTGCAAAATGAATGAACGAGAGAGGAAGAACATCAACAACAAATTTTGTGAGCAG [...]
+	'640'   ------GTTCTTATGAGAAGAATGGCTCTTAAGAAATTGAAGGTGATACCAAAGGAAGGTTACTTATTACTTTTGGACTTTGATGATGAGGACGATGACATAAAAGTTTCAGAGGAGGCTCTTTCGGAAGTAAAAAGCCCAGCATTTGATAAAAATGAGAATATATCGCCTCAAGCAGAAGCAGATGAAGATATGGGAGATGAAGTAGACAGTATATTGGATAAATCTGAAGTAAATAATCCAGCAATTGGTAAAGATGAAAATACATCGCCTCAAGTAAAAGGAGATGAAGACATGGGACATGAAGTAGGCAGTATGTTGGATAAATCTGGAGATGACATTTATAAGACGCTTCACATAAAGAGAAAATGGATGGAAACTTATGTCAAAGAATCTTTCAAAGGCAGCAACCAGAAATTAGAAAGATTTTGCAAAACGAACGAACGAGAGAGGAAGAACATCAACAACAAATTTTGTGAGCAG [...]
+	'961'   ------GTTCTTATGAGAAGAATGGCTCTTAAGAAATTGAAGGTGATACCAAAGGAAGGTTACTTATTACTTTTGGACTTTGATGATGAGGACGATGACATAAAAGTTTCAGAGGAGGCTCTTTCGGAAGTAAAGAGCCCAGCATTTGATAAAAATGAGAATATATCGCCTCAAGCAGAAGCAGATGAAGATATGGGAGATGAAGTAGACAGTATATTGGATAAATCTGAAGTAAATAATCCAGCAATTGGTAAAGATGAAAATACATCGCCTCAAGTAAAAGGAGATGAAGACATGGGACATGAAGTAGGCAGTATGTTGGATAAATCTGGAGATGACATTTATAAGACGCTTCACATAAAGAGAAAATGGATGGAAACTTATGTCAAAGAATCTTTCAAAGGCAGCAACCAGAAATTAGAAAGATTTTGCAAAACGAACGAACGAGAGAGGAAGAACATCAACAACAAATTTTGTGAGCAG [...]
+	'740'   ------GTTCTTATGAGAAGAATGGCTCTTAAGAAATTGAAGGTGATACCAAAGGAAGGTTACTTATTACTTTTGGACTTTGATGATGAGGACGATGACATAAAAGTTTCAGAGGAGGCTCTTTTGGAAGTAAAGAGCCCAGCATTTGATAAAAATGAGAATATATCGCCTCAAGCAGAAGCAGATGAAGATATGGGAGATGAAGTAGACAGTATGTTGGATAAATCTGAAGTAAATAATCCAGCAATTGGTAAAGATGAAAATACATCGCCTCAAGTAAAAGGAGATGAAGACATGGGACATGAAGTAGGCAGTATGTTGGATAAATCTGGAGATGACATTTATAAGACGCTTCACATAAAGAGAAAATGGATGGAAACTTATGTCAAAGAATCTTTCAAAGGCAGCAACCAGAAATTAGAAAGATTTTGCAAAACGAACGAACGAGAGAGGAAGAACATCAACAACAAATTTTGTGAGCAG [...]
+	'591'   ---------------AGAGCCCAGCGTTTGATAAAAATGAGAATATATCGCCTCAAG------------------------------------------------------------------------------------------CAGAAGCAGATGAAGATATGG------------------------------GATGAAGTAGACAGTATGTTGGATAAATCTGAAGTAAATAACCCAGCAATTGGTAAAGATGGATATATATCGCCTCAAGTAAAAGGAGATGAAGACATGGGACATGAAGTAGCCAGTATGTTGGATAAATCTGGAGATGACATTTATAAGACGCTTCACATAAAGAGAAAATGGATGGAAACTTATGTCAAAGAATCTTTCAAAGGCAGCAACCAGAAATTAGAAAGATTTTGCAAAACGAACGAACGAGAGAGGAAGAACATCAACAACAAATTTTGTGAGCAG [...]
+	'1260'  ---------------AGAGCCCAGCATTTGATAAAAATGAGAATATATCGCCTCAAG------------------------------------------------------------------------------------------CAGAAGCAGATGAAGATATGG------------------------------GATACAGTAGACAGTATATTGGATAAATCTGAAGTAAATAATCCAGCAATTGGTAAAGATGAAAATATATCGCCTCAAGTAAAAGGAGATGAAGACATGGGACATGAAGTAGGCAGTATGTTGGATAAATCTGGAGATGACATTTATAAGACGCTTCACATAAAGAGAAAATGGATGGAAACTTATGTCAAAGAATCTTTCAAAGGCAGCAACCAGAAATTAGAAAGATTTTGCAAAACGAACGAACGAGAGAGGAAGAACATCAACAACAAATTTTGTGAGCAG [...]
+	'11'    ------------------------------------------------------GCA------------------------------------------------------------------------------------------GAAGCAGATGAAGATATGGGA------------------------------GATGAAGTAGACAGTATGTTGGATAAATCTGAAGTAAATAACCCAGCAATTGGTAAAGATGGAAATATATCGCCTCAAGTAAAAGGAGATGAAGACATGGGACATGAAGTAGGCAGTATGTTGGATAAATCTGGAGATGACATTTATAAGACGCTTCACATAAAGAGAAAATGGATGGAAACTTATGTCAAAGAATCTTTCAAAGGCAGCAACCAGAAATTAGAAAGATTTTGCAAAACGAACGAACGAGAGAGGAAGAACATAAACAACAAATTTTGTGAGCAG [...]
+	'191'   ---------------AGCCCAGCATTTGATAAAAATGAGAATATATCGCCTCAAGCA------------------------------------------------------------------------------------------GAAGCAGATGAAGATATGGGA------------------------------GATGAAGTAGACAGTATGTTGGATAAATCTGAAGTAAATAATCCAGCAATTGGTAAAGATGAAAATATATCGCCTCAAGTAAAAGGAGATGAAGACATGGGACATGAAGTAGGCAGTATGTTGGATAAATCTGGAGATGACATTTATAAGACGCTTCACATAAAGAGAAAATGGATGGAAACTTATGTCAAAGAATCTTTCAAAGGCAGCAACCAGAAATTAGAAAGATTTTGCAAAACGAACGAACGAGAGAGGAAGAACATCAACAACAAATTTTGTGAGCAG [...]
+	'231'   ---------------AGCCCAGCATTTGATAAAAATGAGAATATATCGCCTCAAGCA------------------------------------------------------------------------------------------GAAGCAGATGAAGATATGGGA------------------------------GATGAAGTAGACAGTATGTTGGATAAATCTGAAGTAAATAATCTAGCAATTGGTAAAGATGAAAATATATCGCCTCAAGTAAAAGGAGATGAAGACATGGGACATGAAGTAGGCAGTATGTTGGATAAATCTGGAGATGACATTTATAAGACGCTTCACATAAAGAGAAAATGGATGGAAACTTATGTCAAAGAATCTTTCAAAGGCAGCAACCAGAAATTAGAAAGATTTTGCAAAACGAACGAACGAGAGAGGAAGAACATCAACAACAAATTTTGTGAGCAG [...]
+	'161'   ------GTTCTTATGAGAAGAATGTCTCTTAAGAAATTGAAGGTGATACCAAAGGAAGGTTACTTATTACTTTTGGACTTTGATGATGAGGACGATGACATAAAAGTTTCAGAGGAGGCTCTTTCGGAAGTAAAGAGCCCAGCATTTGATAAAAATGAGAATATATCGCCTCAAGCAGAAGGAGATGAAGATATGGGAGATGAAGTAGACAGTATGTTGGATAAATCTGAAGTAAATAATCCAGCAATTGGTAAAGATGAAAATATATCGCCTCAAGTAAAAGGAGATGAAGACATGGGACATGAAGTAGGCAGTATGTTGGATAAATCTGGAGATGACATTTATAAGACGCTTCACATAAAGAGAAAATGGATGGAAACTTATGTCAAAGAATCTTTCAAAGGCAGCAACCAGAAATTAGAAAGATTTTGCAAAACGAACGAACGAGAGAGGAAGAACATCAACAACAAATTTTGTGAGCAG [...]
+	'1110'  ------GTTCTTATGAGAAGAATGTCTCTTAAGAAATTGAAGGTGATACCAAAGGAAGGTTACTTATTACTTTTGGACTTTGATGATGAGGACGATGACATAAAAGTTTCAGAGGAGGCTCTTTCGGAAGTAAAGAGCCCAGCATTTGATAAAAATGAGAATATATCGCCTCAAGCAGAAGGAGATGAAGATATGGGAGATGAAGTAGACAGTATGTTGGATAAATCTGAAGTAAATAATCCAGCAATTGGTAAAGATGAAAATATATCGCCTCAAGTAAAAGGAGATGAAGACATGGGACATGAAGTAGGCAGTATGTTGGATAAATCTGGAGATGACATTTATAAGACGCTTCACATAAAGAGAAAATGGATGGAAACTTATGTCAAAGAATCTTTCAAAGGCAGCAACCAGAAATTAGAAAGATTTTGCAAAACGAACGAACGAGAGAGGAAGAACATCAACAACAAATTTTGTGAGCAG [...]
+	'141'   ------GTTCTTATGAGAAGAATGGCTCTTAAGAAATTGAAGGTGATACCAAAGGAAGGTTACTTATTATTTTTGGACTTTGATGATGAGGACGATGACATAAAAGTTTCAGAGGAGGCTCTTTCGGAAGTAAAGAGCCCAGCATTTGATAAAAATGAGAATATATCGCCTCAAGCAGAAGCAGATGAAGATATGGGAGATGAAGTAGACAGTATGTTGGATAAATCTGAAGTAAATAATCCAGCAATTGGTAAAGATGAAAATATATCGCCTCAAGTAAAAGGAGATGAAGACATGGGACATGAAGTAGGCAGTATGTTGGATAAATCTGGAGATGACATTTATAAGACGCTTCACATAAAGAGAAAATGGATGGAAACTTATGTCAAAGAATCTTTCAAAGGCAGCAACCAGAAATTAGAAAGATTTTGCAAAACGAACGAACGAGAGAGGAAGAACATCAACAACAAATTTTGTGAGCAG [...]
+	'171'   ------GTTCTTATGAGAAGAATGGCTCTTAAGAAATTGAAGGTGATACCAAAGGAAGGTTACTTATTACTTTTGGACTTTGATGATGAGGACGATGACATAAAAGTTTCAGAGGAGGCTCTTTCGGAAGTAAAGAGCCCAGCATTTGATAAAAATGAGAATATATCGCCTCAAGCAGAAGCAGATGAAGATATGGGAGATGAAGTAGACAGTATGTTGGATAAATCTGAAGTAAATAATCCAGCAATTGGTAAAGATGAAAATATATCGCCTCAAGTAAAAGGAGATGAAGACATGGGACATGAAGTAGGCAGTATGTTGGATAAATCTGGAGATGACATTTATAAGACGCTTCACATAAAGAGAAAATGGATGGAAACTTATGTCAAAGAATCTTTCAAAGGCAGCAACCAGAAATTAGAAAGATTTTGCAAAACGAACGAACGAGAGAGGAAGAACATCAACAACAAATTTTGTGAGCAG [...]
+	'670'   ------GTTCTTATGAGAAGAATGGCTCTTAAGAAATTGAAGGTGATACCAAAGGAAGGTTACTTATTACTTTTGGACTTTGATGATGAGGACGATGACATAAAAGTTTCAGAGGAGGCTCTTTCGGAAGTAAAGAGCCCAGCATTTGATAAAAATGAGAATATATCGCCTCAAGCAGAAGCAGATGAAGATATGGGAGATGAAGTAGACAGTATGTTGGATAAATCTGAAGTAAATAACCCAGCAATTGGTAAAGATGAAAATATATCGCCTCAAGTAAAAGGAGATGAAGACATGGGACATGAAGTAGGCAGTATGTTGGATAAATCTGGAGATGACATTTATAAGACGCTTCACATAAAGAGAAAATGGATGGAAACTTATGTCAAAGAATCTTTCAAAGGCAGCAACCAGAAATTAGAAAGATTTTGCAAAACGAACGAACGAGAGAGGAAGAACATCAACAACAAATTTTGTGAGCAG [...]
+	'1200'  ------GTTCTTATGAGAAGAATGGCTCTTAAGAAATTGAAGGTGATACCAAAGGAAGGTTACTTATTACTTTTGGACTTTGATGATGAGGACGATGACATAAAAGTTTCAGAGGAGGCTCTTTCAGAAGTAAAGAGCCCAGCATTTGATAAAAATGAGAATATATCGCCTCAAGCAGAAGCAGATGAAGATATGGGAGATGAAGTAGACAGTATGTTGGATAAATCTGAAGTAAATAATCCAGCAATTGGTAAAGATGAAAATATATCGCCTCAAGTAAAAGGAGATGAAGACATGGGACATGAAGTAGGCAGTATGTTGGATAAATCTGGAGATGACATTTATAAGACGCTTCACATAAAGAGAAAATGGATGGAAACTTATGTCAAAGAATCTTTCAAAGGCAGCAACCAGAAATTAGAAAGATTTTGCAAAACGAACGAACGAGAGAGGAAGAACATCAACAACAAATTTTGTGAGCAG [...]
+	'241'   ------GTTCTTATGAGAAGAATGGCTCTTAAGAAATTGAAGGTGATACCAAAGGAAGGTTACTTATTACTTTTGGACTTTGATGATGAGGACGATGACATAAAAGTTTCAGAGGAGGCTCTTTCGGAAGTAAAGAGCCCAGCATTTGATAAAAATGAGAATATATCGCCTCAAGCAGAAGCAGATGAAGATATGGGAGATGAAGTAGACAGTATGTTGGATATATCTGAAGTAAATAATCCAGCAATTGGTAAAGATGAAAATATATCGCCTCAAGTAAAAGGAGATGAAGACATGGGACATGAAGTAGGCAGTATGTTGGATAAATCTGGAGATGACATTTATAAGACGCTTCACATAAAGAGAAAATGGATGGAAACTTATGTCAAAGAATCTTTCAAAGGCAGCAACCAGAAATTAGAAAGATTTTGCAAAACGAACGAACGAGAGAGGAAGAACATCAACAACAAATTTTGTGAGCAG [...]
+	'1270'  ------GTTCTTATGAGAAGAATGGCTCTTAAGAAATTGAAGGTGATACCAAAGGAAGGTTACTTATTACTTTTGGACTTTGATGATGAGGACGATGACATAAAAGTTTCAGAGGAGGCTCTTTCAGAAGTAAAGAGCCCAGCATTTGATAAAAATGAGAATATATCGCCTCAAGCAGAAGCAGATGAAGATATGGGAGATGAAGTAGACAGTATGTTGGATAAATCTGAAATAAATAATCCAGCAATTGGTAAAGATGAAAATATATTGCCTCAAGTAAAAGGAGATGAAGACATGGGACATGAAGTAGGCAGTATGTTGGATAAATCTGGAGATGACATTTATAAGACGCTTCACATAAAGAGAAAATGGATGGAAACTTATGTCAAAGAATCTTTCAAAGGCAGCAACCAGAAATTAGAAAGATTTTGCAAAACGAACGAACGAGAGAGGAAGAACATCAACAACAAATTTTGTGAGCAG [...]
+	'1190'  ------GTTCTTATGAGAAGAATGGCTCTTAAGAAATTGAAGGTGATACCAAAGGAAGGTTACTTATTACTTTTGGACTTTGATGATGAGGACGATGACATAAAAGTTTCAGAGGAGGCTCTTTCGGAAGTAAAGAGCCCAGCATTTGATAAAAATGAGAATATATCGCCTCAAGCAGAAGCAGATGAAGATATGGGAGATGAAGTAGACAGTATGTTGGATAAATCTGAAGTAAATAATCCAGCAATTGGTAAAGATGAAAATATATCGCCTCAAGTAAAAGGAGATGAAGACATGGGACATGAAGTAGGCAGTATGTTGGATAAATCTGGAGATGACATTTATAAGACGCTTCACATAAAGAGAAAATGGATGGAAACTTATGTCAAAGAATCTTTCAAAGGCAGCAACCAGAAATTAGAAAGATTTTGCAAAACGAACGAACGAGAGAGGAAGAACATCAACAACAAATTTTGTGAGCAG [...]
+	'680'   TACTGTGTTCTTATGAGAAGAATGGCTCTTAAGAAATTGAAGGTGATACCAAAGGAAGGTTACTTATTACTTTTGGACTTTGATGATGAGGACGATGACATAAAAGTTTCAGAGGAGGCTCTTTCGGAAGTAAAGAGCCCAGCATTTGATAAAAATGAGAATATATCGCCTCAAGCAGAAGCAGATGAAGATATGGGAGATGAAGTAGACAGTATGTTGGATAAATCTGAAGTAAATAATCCAGCAATTGGTAAAGATGAAAATATATCGCCTCAAGTAAAAGGAGATGAAGACATGGGACATGAAGTAGGCAGTATGTTGGATAAATCTGGAGATGACATTTATAAGACGCTTCACATAAAGAGAAAATGGATGGTAACTTATGTCAAAGAATCTTTCAAATGCAGCAACCAGAAATTAGAAAGATTTTGCAAAACGAACGAACGAGAGAGGAAGAACATCAACAACAAATTTTGTGAGCAG [...]
+	'941'   TACTGTGTTCTTATGAGAAGAATGGCTCTTAAGAAATTGAAGGTGATACCAAAGGAAGGTTACTTATTACTTTTGGACTTTGATGATGAGGACGATGACATAAAAGTTTCAGAGGAGGCTCTTTCGGAAGTAAAGAGCCCAGCATTTGATAAAAATGAGAATATATCGCCTCAAGCAGAAGCAGATGAAGATATGGGAGATGAAGTAGACAGTATGTTGGATAAATCTGAAGTAAATAATCCAGCAATTGGTAAAGATGAAAATATATCGCCTCAAGTAAAAGGAGTTGAAGACATGGGACATGAAGTAGGCAGTATGTTGGATAAATCTGGAGATGACATTTATAAGACGCTTCACATAAAGAGAAAATGGATGGAAACTTATGTCAAAGAATCTTTCAAATGCAGCAACCAGAAATTAGAAAGATTTTGCAAAACGAACGAACGAGAGAGGAAGAACATCAACAACAAATTTTGTGAGCAG [...]
+	'650'   TACTGTGTTCTTATGAGAAGAATGGCTCTTAAGAAATTGAAGGTGATACCAAAGGAAGGTTACTTATTACTTTTGGACTTTGATGATGAGGACGATGACATAAAAGTTTCAGAGGAGGCTCTTTCGGAAGTAAAGAGCCCAGCATTTGATAAAAATGAGAATATATCGCCTCAAGCAGAAGCAGATGAAGATATGGGAGATGAAGTAGACAGTATGTTGGATAAATCTGAAGTAAATAATCCAGCAATTGGTAAAGATGAAAATATATCGCCTCAAGTAAAAGGAGATGAAGACATGGGACATGAAGTAGGCAGTATGTTGGATAAATCTGGAGATGACATTTATAAGACGCTTCACATAAAGAGAAAATGGATGGAAACTTATGTCAAAGAATCTTTCAAATGCAGCAACCAGAAATTAGAAAGATTTTGCAAAACGAACGAACGAGAGAGGAAGAACATCAACAACAAATTTTGTGAGCAG [...]
+	'970'   TACTGTGTTCTTATGAGAAGAATGGCTCTTAAGAAATTGAAGGTGATACCAAAGGAAGGTTACTTATTACTTTTGGACTTTGATGATGAGGACGATGACATAAAAGTTTCAGAGGAGGCTCTTTCGGAAGTAAAGAGCCCAGCATTTGATAAAAATGAGAATATATCGCCTCAAGCAGAAGCAGATGAAGATATGGGAGATGAAGTAGACAGTATGTTGGATAAATCTGAAGTAAATAATCCAGCAATTGGTAAAGATGAAAATATATCGCCTCAAGTAAAAGGAGATGAAGACATGGGACATGAAGTAGGCAGTATGTTGGATAAATCTGGAGATGACATTTATAAGACGCTTCACATAAAGAGAAAATGGATGGAAACTTATGTCAAAGAATCTTTCAAATGCAGCAACCAGAAATTAGAAAGATTTTGCAAAACGAACGAACGAGAGAGGAAGAACATCAACAACAAATTTTGTGAGCAG [...]
+	'700'   ------GTTCTTATGAGAAGAATGGCTCTTAAGAAATTGAAGGTGATACCAAAGGAAGGTTACTTATTACTTTTGGACTTTGATGATGAGGACGATGACATAAAAGTTTCAGAGGAGGCTCTTTCGGAAGTAAAGAGCCCAGCATTTGATAAAAATGAGAATATATCGCCTCAAGCAGAAGCAGATGAAGATATGGGAGATGAAGTAGACAGTATGTTGGATAAATCTGAAGTAAATAATCCAGCAATTGGTAAAGATGAAAATATATCGCCTCAAGTAAAAGGAGATGAAGACATGGGACATGAAGTAGGCAGTATGTTGGATAAATCTGGAGATGACATTTATAAGACGCTTCACATAAAGAGAAAATGGATGGAAACTTATGTCAAAGAATCTTTCAAATGCAGCAACCAGAAATTAGAAAGATTTTGCAAAACGAACGAACGAGAGAGGAAGAACATCAACAACAAATTTTGTGAGCAG [...]
+	'431'   ------GTTCTTATGAGAAGAATGGCTCTTAAGAAATTGAAGGTGATACCAAAGGAAGGTTACTTATTACTTTTGGACTTTGATGATGAGGACGATGACATAAAAGTTTCAGAGGAGGCTCTTTCGGAAGTAAAGAGCCCAGCATTTGATAAAAATGAGAATATATCGCCTCAAGCAGAAGCAGATGAAGATATGGGAGATGAAGTAGACAGTATGTTGGATAAATCTGAAGTAAATTATCCAGCAATTGGTAAAGATGAAAATATATCGCCTCAAGTAAAAGGAAATGAAGACATGGGACATGAAGTAGGCAGTATGTTAGATAAATCTGGAGATGACATTTATAAGACGCTTCACATAAAGAGAAAATGGATGGAAACTTATGTCAAAGAATCTTTCAAAGGCAGCAACCAGAAATTAGAAAGATTTTGCAAAACGAACGAACGAGAGAGGAAGAACATCAACAACAAATTTTGTGAGCAG [...]
+	'1250'  ------GTTCTTATGAGAAGAATGGCTCTTAAGAAATTGAAGGTGATACCAAAGGAAGGTTACTTATTACTTTTGGACTTTGATGATGAGGACGATGACATAAAAGTTTCAGAGGAGGCTCTTTCGGAAGTAAAGAGCCCAGCATTTGATAAAAATGAGAATATATCGCCTCAAGCAGAAGCAGATGAAGATATGGGAGATGAAGTAGACAGTATGTTGGATAAATCTGAAGTAAATTATCCAGCAATTGGTAAAGATGAAAATATATCGCCTCAAGTAAAAGGAGATGAAGACATGGGACATGAAGTAGGCAGTATGTTGGATAAATCTGGAGATGACATTTATAAGACGCTTCACATAAAGAGAAAATGGATGGAAACTTATGTCAAAGAATCTTTCAAAGGCAGCAACCAGAAATTAGAAAGATTTTGCAAAACGAACGAACGAGAGAGGAAGAACATCAACAACAAATTTTGTGAGCAG [...]
+	'1210'  ------GTTCTTATGAGAAGAATGGCTCTTAAGAAATTGAAGGTGATACCAAAGGAAGGTTACTTATTACTTTTGGACTTTGATGATGAGGACGATGACATAAAAGTTTCAGAGGAGGCTCTTTCGGAAGTAAAGAGCCCAGCATTTGATAAAAATGAGAATATATCGCCTCAAGCAGAAGCAGATGAAGATATGGGAGATGAAGTAGACAGTATGTTGGATAAATCTGAAGTAAATAATCCAGCAATTGGTAAAGATGAAAATATATCGCCTCAAGTAAAAGGAGATGAAGACATGGGACATGAAGTAGGCAGTATGTTGGATAAATCTGGAGATGACATTTATAAGACGCTTCACATAAAGAGAAAATGGATGGAAACTTATGTCAAAGAATCTTTCAAAGGCAGCAACCAGAAATTAGAAAGATTTTGCAAAACGAACGAACGAGAGAGGAAGAACATCAACAACAAATTTTGTGAGCAG [...]
+	'770'   ------GTTCTTATGAGAAGAATGGCTCTTAAGAAATTGAAGGTGATACCAAAGGAAGGTTACTTATTACTTTTGGACTTTGATGATGAGGACGATGACATAAAAGTTTCAGAGGAGGCTCTTTTGGAAGTAAAGAGCCCAGCATTTGATAAAAATGAGAATATATCGCCTCAAGCAGAAGCAGATGAAGATATGGGAGATGAAGTAGACAGTATGTTGGATAAATCTGAAGTAAATAATCCAGCAATTGGTAAAGATGAAAATATATCGCCTCAAGTAAAAGGAGATGAAGACATGGGACATGAAGTAGTCAGTATGTTGGATAAATCTGGAGATGACATTTATAAGACGCTTCACATAAAGAGAAAATGGATGGAAACTTATGTCAAAGAATCTTTCAAAGGCAGCAACCAGAAATTAGAAAGATTTTGCAAAACGAACGAACGAGAGAGGAAGAACATCAACAACAAATTTTGTGAGCAG [...]
+	'720'   ------GTTCTTATGAGAAGAATGGCTCTTAAGAAATTGAAGGTGATACCAAAGGAAGGTTACTTATTACTTTTGGACTTTGATGATGAGGACGATGACATAAAAGTTTCAGAGGAGGCTCTTTCGGAAGTAAAGAGCCCAGCATTTGATAAAAATGAGAATATATCGCCTCAAGCAGAAGCAGATGAAGATATGGGAGATGAAGTAGACAGTATGTTGGATAAATCTGAAGTAAATAATCCAGCAATTGGTAAAGATGAAAATATATCGCCTCAAGTAAAAGGAGATGAAGACATGGGACATGAAGTAGGCAGTATGTTGGATAAATCTGGAGATGACATTTATAAGACGCTTCACATAAAGAGAAAATGGATGGAAACTTATGTCAAAGAATCTTTCAAAGGCAGCAACCAGAAATTAGAAAGATTTTGCAAAACGAACGAACGAGAGAGGAAGAACATCAACAACAAATTTTGTGAGCAG [...]
+	'750'   ------GTTCTTATGAGAAGAATGGCTCTTAAGAAATTGAAGGTGATACCAAAGGAAGGTTACTTATTACTTTTGGACTTTGATGATGAGGACGATGACATAAAAGTTTCAGAGGAGGCTCTTTCGGAAGTAAAGAGCCCAGCATTTGATAAAAATGAGAATATATCGCCTCAAGCAGAAGCAGATGAAGATATGGGAGATGAAGTAGACAGTATGTTGGATAAATCTGAAGTAAATAATCCAGCAATTGGTAAAGATGAAAATATATCGCCTCAAGTAAAAGGAGATGAAGACATTGGACATGAAGTAGGCAGTATGTTGGATAAATCTGGAGATGACATTTATAAGACGCTTCACATAAAGAGAAAATGGATGGAAACTTATGTCAAAGAATCTTTCAAAGGCAGCAACCAGAAATTAGAAAGATTTTGCAAAACGAACGAACGAGAGAGGAAGAACATCAACAACAAATTTTGTGAGCAG [...]
+	'1070'  ------GTTCTTATGAGAAGAATGGCTCTTAAGATATTGAAGGTGATACCAAAGGAAGGTTACTTATTACTTTTGGACTTTGATGATGAGGACGATGACATAAAAGTTTCAGAGGAGGCTCTTTCGGAAGTAAAGAGCCCAGCATTTGATAAAAATGAGAATATATCGCCTCAAGCAGAAGCAGATGAAGATATGGGAGATGAAGTAGACAGTATGTTGGATAAATCTGAAGTAAATAATCCAGCAATTGGTAAAGATGAAAATATATCGCCTCAAGTAAAAGGAGATGAAGACATGGGACATGAAGTAGTCAGTATGTTGGATAAATCTGGAGATGACATTTATAAGACGCTTCACATAAAGAGAAAATGGATGGAAACTTATGTCAAAGAATCTTTCAAAGGCAGCAACCAGAAATTAGAAAGATTTTGCAAAACGAACGAA--------------------------------------- [...]
+	'811'   ------GTTCTTATGAGAAGAATGGCTCTTAAGAAATTGAAGGTGATACCAAAGGAAGGTTACTTATTACTTTTGGACTTTGATGATGAGGATGATGACATAAAAGTTTCAGAGGAGGCTCTTTCGGAAGTAAAGAGCCCAGCGTTTGATAAAAATGAGAATATATCGCCTCAAGCAGAAGCAGATGAAGATATGGGAGATGAAGTAGACAGTATGTTGGATAAATCTGAAGTAAATAACCCAGCAATTGGTAAAGATGGATATATATCGCCTCAAGTAAAAGGAGATGAAGACATGGGACATGAAGTAGGCAGTATGTTGGATAAATCTGGAGATGACATTTATAAGACGCTTCACATAAAGAGAAAATGGATGGAAACTTATGTCAAAGAATCTTTCAAAGGCAGCAACCAGAAATTAGAAAGATTTTGCAAAACGAACGAACGAGAAGGAAGAACATCAACAACAAATTTTGTGAGCAGT [...]
+	'1220'  ------ATTCTTATGAGAAGAATGGCTCTTAAGAAATTGAAGGTGATACCAAAGGAAGGTTACTTATTACTTTTGGACTTTGATGATGAGGACGATGACATAAAAGTTTCAGAGGAGGCTCTTTCGGAAGTAAAGAGCCCAGCATTTGATAAAAATGAGAATATATCGCCTCAAGCAGAAGCAGATGAAGATATGGGAGATGAAGTAGACAGTATGTTGGATAAATCTGAAGTAAATAATCCAGCAATTGGTAAAGATGAAAATATATCGCCTCAAGTAAAAGGAGATGAAGACATGGGACATGAAGTAGGCAGTATGTTGGATAAATCTGGAGATGACATTTATAAGACGCTTCACATAAAGAGAAAATGGATGGAAACTTATGTCAAAGAATCTTTCAAAGGCAGCAACCAGAAATTAGAAAGATTTTGCAAAACGAACGAA--------------------------------------- [...]
+	'401'   ------GTTCTTATGAGAAGAATGGCTCTTAAGAAATTGAAGGTGATACCAAAGGAAGGTTACTTATTACTTTTGGACTTTGATGATGAGGACGATGACATAAAAGTTTCAGAGGAGGCTCTTTCGGAAGTAAAGAGCCCAGCATTTGATAAAAATGAGAATATATCGCCTCAAGCAGAAGCAGATGAAGATATGGGAGATGAAGTAGACAGTATGTTGGATAAATCTGAAGTAAATAATCCAGCAATTGGTAAAGATGAAAATATATCGCCTCAAGTAAAAGGAGATGAAGACATGGGACATGAAGTAGGCAGTATGTTGGATAAATCTGGAGATGACATTTATAAGACGCTTCACATAAAGAGAAAATGGATGGAAACTTATGTCAAAGAATCTTTCAAAGGCAGCAAC------------------------------------------------------------------------ [...]
+	'181'   ------GTTCTTATGAGAAGAATGGCTCTTAAGAAATTGAAGGTGATACCAAAGGAAGGTTACTTATTACTTTTGGACTTTGATGATGAGGACGATGACATAAAAGTTTCAGAGGAGGCTCTTTCGGAAGTAAAGAGCCCAGCATTTGATAAAAATGAGAATATATCGCCTCAAGCAGAAGCAGATGAAGATATGGGAGATGAAGTAGACAGTATGTTGGATAAATCTGAAGTAAATAATCCAGCAATTGGTAAAGATGAAAATATATCGCCTCAAGTAAAAGGAGAT--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- [...]
+	'1180'  ------GTTCTTATGAGAAGAATGGCTCTTAAGAAATTGAAGGTGATACCAAAGGAAGGTTACTTATTACTTTTGGACTTTGATGATGAGGACGATGACATAAAAGTTTCAGAGGAGGCTCTTTCGGAAGTAAAGAGCCCAGCATTTGATAAAAATGAGAATATATCGCCTCAAGCAGAAGCAGATGAAGATATGGGAGATGAAGTAGACAGTATGTTGGATAAATCTGAAGTAAATAATCCAGCAATTGGTAAAGATGAAAATATATCGCCTCAAGTAAAAGGAGATGAAGACATGGGACATGAAGTAGGCAGTATGTTGGATAAATCTGGAGGTATGTGTTTTAGAAATATTTCCCTTATGAAATGTTCAATTGAATTTGTTCTGAGTGTTCATTTTCAT---ATTGGTATGAAATGTGCCTGCTTTTGTTACTGTGCTTTACAGGAAGAACAT---------------------CAACAA [...]
+END;
+
+BEGIN HYPHY;
+
+
+global RELAX.reference.aux_freq_1=0.2398644939351058;
+RELAX.reference.aux_freq_1:<1;
+global RELAX.reference.aux_freq_0=0.9235180502528358;
+RELAX.reference.aux_freq_0:<1;
+global RELAX.reference.omega_0=0;
+RELAX.reference.omega_0:<1;
+global AC=0.5066405196756801;
+global AT=0.5066068888112617;
+global CG=0.8606367073798165;
+global RELAX.reference.omega_2=30.20296826021891;
+RELAX.reference.omega_2:>1;
+global RELAX.reference.omega_1=1;
+RELAX.reference.omega_1:>0.0001;
+RELAX.reference.omega_1:<1;
+global GT=0.7994123065796686;
+global CT=2.357083579771258;
+global RELAX.K=2.030710072857724;
+global RELAX.test.omega_2:=RELAX.reference.omega_2;
+RELAX.test.omega_2:>1;
+global RELAX.test.omega_1:=RELAX.reference.omega_1;
+RELAX.test.omega_1:>0.0001;
+RELAX.test.omega_1:<1;
+global RELAX.test.omega_0:=RELAX.reference.omega_0;
+RELAX.test.omega_0:<1;
+global RELAX.test.aux_freq_1:=RELAX.reference.aux_freq_1;
+RELAX.test.aux_freq_1:<1;
+global RELAX.test.aux_freq_0:=RELAX.reference.aux_freq_0;
+RELAX.test.aux_freq_0:<1;
+Q_RELAX.test_1={61,61};
+Q_RELAX.test_1[0][1]:=AC*t*Min(1000,RELAX.test.omega_0^local_k)*0.1264560133035801;
+Q_RELAX.test_1[0][2]:=t*0.2406378906553946;
+Q_RELAX.test_1[0][3]:=AT*t*Min(1000,RELAX.test.omega_0^local_k)*0.2504957133922061;
+Q_RELAX.test_1[0][4]:=AC*t*Min(1000,RELAX.test.omega_0^local_k)*0.1351200521140052;
+Q_RELAX.test_1[0][8]:=t*Min(1000,RELAX.test.omega_0^local_k)*0.1344351325741675;
+Q_RELAX.test_1[0][12]:=AT*t*Min(1000,RELAX.test.omega_0^local_k)*0.2296926126195792;
+Q_RELAX.test_1[0][16]:=AC*t*Min(1000,RELAX.test.omega_0^local_k)*0.1214054057357627;
+Q_RELAX.test_1[0][32]:=t*Min(1000,RELAX.test.omega_0^local_k)*0.3053650319994416;
+Q_RELAX.test_1[1][0]:=AC*t*Min(1000,RELAX.test.omega_0^local_k)*0.3824103826488193;
+Q_RELAX.test_1[1][2]:=CG*t*Min(1000,RELAX.test.omega_0^local_k)*0.2406378906553946;
+Q_RELAX.test_1[1][3]:=CT*t*0.2504957133922061;
+Q_RELAX.test_1[1][5]:=AC*t*Min(1000,RELAX.test.omega_0^local_k)*0.1351200521140052;
+Q_RELAX.test_1[1][9]:=t*Min(1000,RELAX.test.omega_0^local_k)*0.1344351325741675;
+Q_RELAX.test_1[1][13]:=AT*t*Min(1000,RELAX.test.omega_0^local_k)*0.2296926126195792;
+Q_RELAX.test_1[1][17]:=AC*t*Min(1000,RELAX.test.omega_0^local_k)*0.1214054057357627;
+Q_RELAX.test_1[1][33]:=t*Min(1000,RELAX.test.omega_0^local_k)*0.3053650319994416;
+Q_RELAX.test_1[1][48]:=AT*t*Min(1000,RELAX.test.omega_0^local_k)*0.250994522453953;
+Q_RELAX.test_1[2][0]:=t*0.3824103826488193;
+Q_RELAX.test_1[2][1]:=CG*t*Min(1000,RELAX.test.omega_0^local_k)*0.1264560133035801;
+Q_RELAX.test_1[2][3]:=GT*t*Min(1000,RELAX.test.omega_0^local_k)*0.2504957133922061;
+Q_RELAX.test_1[2][6]:=AC*t*Min(1000,RELAX.test.omega_0^local_k)*0.1351200521140052;
+Q_RELAX.test_1[2][10]:=t*Min(1000,RELAX.test.omega_0^local_k)*0.1344351325741675;
+Q_RELAX.test_1[2][14]:=AT*t*Min(1000,RELAX.test.omega_0^local_k)*0.2296926126195792;
+Q_RELAX.test_1[2][18]:=AC*t*Min(1000,RELAX.test.omega_0^local_k)*0.1214054057357627;
+Q_RELAX.test_1[2][34]:=t*Min(1000,RELAX.test.omega_0^local_k)*0.3053650319994416;
+Q_RELAX.test_1[3][0]:=AT*t*Min(1000,RELAX.test.omega_0^local_k)*0.3824103826488193;
+Q_RELAX.test_1[3][1]:=CT*t*0.1264560133035801;
+Q_RELAX.test_1[3][2]:=GT*t*Min(1000,RELAX.test.omega_0^local_k)*0.2406378906553946;
+Q_RELAX.test_1[3][7]:=AC*t*Min(1000,RELAX.test.omega_0^local_k)*0.1351200521140052;
+Q_RELAX.test_1[3][11]:=t*Min(1000,RELAX.test.omega_0^local_k)*0.1344351325741675;
+Q_RELAX.test_1[3][15]:=AT*t*Min(1000,RELAX.test.omega_0^local_k)*0.2296926126195792;
+Q_RELAX.test_1[3][19]:=AC*t*Min(1000,RELAX.test.omega_0^local_k)*0.1214054057357627;
+Q_RELAX.test_1[3][35]:=t*Min(1000,RELAX.test.omega_0^local_k)*0.3053650319994416;
+Q_RELAX.test_1[3][49]:=AT*t*Min(1000,RELAX.test.omega_0^local_k)*0.250994522453953;
+Q_RELAX.test_1[4][0]:=AC*t*Min(1000,RELAX.test.omega_0^local_k)*0.5007522026922482;
+Q_RELAX.test_1[4][5]:=AC*t*0.1264560133035801;
+Q_RELAX.test_1[4][6]:=t*0.2406378906553946;
+Q_RELAX.test_1[4][7]:=AT*t*0.2504957133922061;
+Q_RELAX.test_1[4][8]:=CG*t*Min(1000,RELAX.test.omega_0^local_k)*0.1344351325741675;
+Q_RELAX.test_1[4][12]:=CT*t*Min(1000,RELAX.test.omega_0^local_k)*0.2296926126195792;
+Q_RELAX.test_1[4][20]:=AC*t*Min(1000,RELAX.test.omega_0^local_k)*0.1214054057357627;
+Q_RELAX.test_1[4][36]:=t*Min(1000,RELAX.test.omega_0^local_k)*0.3053650319994416;
+Q_RELAX.test_1[4][50]:=AT*t*Min(1000,RELAX.test.omega_0^local_k)*0.250994522453953;
+Q_RELAX.test_1[5][1]:=AC*t*Min(1000,RELAX.test.omega_0^local_k)*0.5007522026922482;
+Q_RELAX.test_1[5][4]:=AC*t*0.3824103826488193;
+Q_RELAX.test_1[5][6]:=CG*t*0.2406378906553946;
+Q_RELAX.test_1[5][7]:=CT*t*0.2504957133922061;
+Q_RELAX.test_1[5][9]:=CG*t*Min(1000,RELAX.test.omega_0^local_k)*0.1344351325741675;
+Q_RELAX.test_1[5][13]:=CT*t*Min(1000,RELAX.test.omega_0^local_k)*0.2296926126195792;
+Q_RELAX.test_1[5][21]:=AC*t*Min(1000,RELAX.test.omega_0^local_k)*0.1214054057357627;
+Q_RELAX.test_1[5][37]:=t*Min(1000,RELAX.test.omega_0^local_k)*0.3053650319994416;
+Q_RELAX.test_1[5][51]:=AT*t*Min(1000,RELAX.test.omega_0^local_k)*0.250994522453953;
+Q_RELAX.test_1[6][2]:=AC*t*Min(1000,RELAX.test.omega_0^local_k)*0.5007522026922482;
+Q_RELAX.test_1[6][4]:=t*0.3824103826488193;
+Q_RELAX.test_1[6][5]:=CG*t*0.1264560133035801;
+Q_RELAX.test_1[6][7]:=GT*t*0.2504957133922061;
+Q_RELAX.test_1[6][10]:=CG*t*Min(1000,RELAX.test.omega_0^local_k)*0.1344351325741675;
+Q_RELAX.test_1[6][14]:=CT*t*Min(1000,RELAX.test.omega_0^local_k)*0.2296926126195792;
+Q_RELAX.test_1[6][22]:=AC*t*Min(1000,RELAX.test.omega_0^local_k)*0.1214054057357627;
+Q_RELAX.test_1[6][38]:=t*Min(1000,RELAX.test.omega_0^local_k)*0.3053650319994416;
+Q_RELAX.test_1[6][52]:=AT*t*Min(1000,RELAX.test.omega_0^local_k)*0.250994522453953;
+Q_RELAX.test_1[7][3]:=AC*t*Min(1000,RELAX.test.omega_0^local_k)*0.5007522026922482;
+Q_RELAX.test_1[7][4]:=AT*t*0.3824103826488193;
+Q_RELAX.test_1[7][5]:=CT*t*0.1264560133035801;
+Q_RELAX.test_1[7][6]:=GT*t*0.2406378906553946;
+Q_RELAX.test_1[7][11]:=CG*t*Min(1000,RELAX.test.omega_0^local_k)*0.1344351325741675;
+Q_RELAX.test_1[7][15]:=CT*t*Min(1000,RELAX.test.omega_0^local_k)*0.2296926126195792;
+Q_RELAX.test_1[7][23]:=AC*t*Min(1000,RELAX.test.omega_0^local_k)*0.1214054057357627;
+Q_RELAX.test_1[7][39]:=t*Min(1000,RELAX.test.omega_0^local_k)*0.3053650319994416;
+Q_RELAX.test_1[7][53]:=AT*t*Min(1000,RELAX.test.omega_0^local_k)*0.250994522453953;
+Q_RELAX.test_1[8][0]:=t*Min(1000,RELAX.test.omega_0^local_k)*0.5007522026922482;
+Q_RELAX.test_1[8][4]:=CG*t*Min(1000,RELAX.test.omega_0^local_k)*0.1351200521140052;
+Q_RELAX.test_1[8][9]:=AC*t*Min(1000,RELAX.test.omega_0^local_k)*0.1264560133035801;
+Q_RELAX.test_1[8][10]:=t*0.2406378906553946;
+Q_RELAX.test_1[8][11]:=AT*t*Min(1000,RELAX.test.omega_0^local_k)*0.2504957133922061;
+Q_RELAX.test_1[8][12]:=GT*t*Min(1000,RELAX.test.omega_0^local_k)*0.2296926126195792;
+Q_RELAX.test_1[8][24]:=AC*t*0.1214054057357627;
+Q_RELAX.test_1[8][40]:=t*Min(1000,RELAX.test.omega_0^local_k)*0.3053650319994416;
+Q_RELAX.test_1[9][1]:=t*Min(1000,RELAX.test.omega_0^local_k)*0.5007522026922482;
+Q_RELAX.test_1[9][5]:=CG*t*Min(1000,RELAX.test.omega_0^local_k)*0.1351200521140052;
+Q_RELAX.test_1[9][8]:=AC*t*Min(1000,RELAX.test.omega_0^local_k)*0.3824103826488193;
+Q_RELAX.test_1[9][10]:=CG*t*Min(1000,RELAX.test.omega_0^local_k)*0.2406378906553946;
+Q_RELAX.test_1[9][11]:=CT*t*0.2504957133922061;
+Q_RELAX.test_1[9][13]:=GT*t*Min(1000,RELAX.test.omega_0^local_k)*0.2296926126195792;
+Q_RELAX.test_1[9][25]:=AC*t*Min(1000,RELAX.test.omega_0^local_k)*0.1214054057357627;
+Q_RELAX.test_1[9][41]:=t*Min(1000,RELAX.test.omega_0^local_k)*0.3053650319994416;
+Q_RELAX.test_1[9][54]:=AT*t*Min(1000,RELAX.test.omega_0^local_k)*0.250994522453953;
+Q_RELAX.test_1[10][2]:=t*Min(1000,RELAX.test.omega_0^local_k)*0.5007522026922482;
+Q_RELAX.test_1[10][6]:=CG*t*Min(1000,RELAX.test.omega_0^local_k)*0.1351200521140052;
+Q_RELAX.test_1[10][8]:=t*0.3824103826488193;
+Q_RELAX.test_1[10][9]:=CG*t*Min(1000,RELAX.test.omega_0^local_k)*0.1264560133035801;
+Q_RELAX.test_1[10][11]:=GT*t*Min(1000,RELAX.test.omega_0^local_k)*0.2504957133922061;
+Q_RELAX.test_1[10][14]:=GT*t*Min(1000,RELAX.test.omega_0^local_k)*0.2296926126195792;
+Q_RELAX.test_1[10][26]:=AC*t*0.1214054057357627;
+Q_RELAX.test_1[10][42]:=t*Min(1000,RELAX.test.omega_0^local_k)*0.3053650319994416;
+Q_RELAX.test_1[10][55]:=AT*t*Min(1000,RELAX.test.omega_0^local_k)*0.250994522453953;
+Q_RELAX.test_1[11][3]:=t*Min(1000,RELAX.test.omega_0^local_k)*0.5007522026922482;
+Q_RELAX.test_1[11][7]:=CG*t*Min(1000,RELAX.test.omega_0^local_k)*0.1351200521140052;
+Q_RELAX.test_1[11][8]:=AT*t*Min(1000,RELAX.test.omega_0^local_k)*0.3824103826488193;
+Q_RELAX.test_1[11][9]:=CT*t*0.1264560133035801;
+Q_RELAX.test_1[11][10]:=GT*t*Min(1000,RELAX.test.omega_0^local_k)*0.2406378906553946;
+Q_RELAX.test_1[11][15]:=GT*t*Min(1000,RELAX.test.omega_0^local_k)*0.2296926126195792;
+Q_RELAX.test_1[11][27]:=AC*t*Min(1000,RELAX.test.omega_0^local_k)*0.1214054057357627;
+Q_RELAX.test_1[11][43]:=t*Min(1000,RELAX.test.omega_0^local_k)*0.3053650319994416;
+Q_RELAX.test_1[11][56]:=AT*t*Min(1000,RELAX.test.omega_0^local_k)*0.250994522453953;
+Q_RELAX.test_1[12][0]:=AT*t*Min(1000,RELAX.test.omega_0^local_k)*0.5007522026922482;
+Q_RELAX.test_1[12][4]:=CT*t*Min(1000,RELAX.test.omega_0^local_k)*0.1351200521140052;
+Q_RELAX.test_1[12][8]:=GT*t*Min(1000,RELAX.test.omega_0^local_k)*0.1344351325741675;
+Q_RELAX.test_1[12][13]:=AC*t*0.1264560133035801;
+Q_RELAX.test_1[12][14]:=t*Min(1000,RELAX.test.omega_0^local_k)*0.2406378906553946;
+Q_RELAX.test_1[12][15]:=AT*t*0.2504957133922061;
+Q_RELAX.test_1[12][28]:=AC*t*Min(1000,RELAX.test.omega_0^local_k)*0.1214054057357627;
+Q_RELAX.test_1[12][44]:=t*Min(1000,RELAX.test.omega_0^local_k)*0.3053650319994416;
+Q_RELAX.test_1[12][57]:=AT*t*Min(1000,RELAX.test.omega_0^local_k)*0.250994522453953;
+Q_RELAX.test_1[13][1]:=AT*t*Min(1000,RELAX.test.omega_0^local_k)*0.5007522026922482;
+Q_RELAX.test_1[13][5]:=CT*t*Min(1000,RELAX.test.omega_0^local_k)*0.1351200521140052;
+Q_RELAX.test_1[13][9]:=GT*t*Min(1000,RELAX.test.omega_0^local_k)*0.1344351325741675;
+Q_RELAX.test_1[13][12]:=AC*t*0.3824103826488193;
+Q_RELAX.test_1[13][14]:=CG*t*Min(1000,RELAX.test.omega_0^local_k)*0.2406378906553946;
+Q_RELAX.test_1[13][15]:=CT*t*0.2504957133922061;
+Q_RELAX.test_1[13][29]:=AC*t*Min(1000,RELAX.test.omega_0^local_k)*0.1214054057357627;
+Q_RELAX.test_1[13][45]:=t*Min(1000,RELAX.test.omega_0^local_k)*0.3053650319994416;
+Q_RELAX.test_1[13][58]:=AT*t*Min(1000,RELAX.test.omega_0^local_k)*0.250994522453953;
+Q_RELAX.test_1[14][2]:=AT*t*Min(1000,RELAX.test.omega_0^local_k)*0.5007522026922482;
+Q_RELAX.test_1[14][6]:=CT*t*Min(1000,RELAX.test.omega_0^local_k)*0.1351200521140052;
+Q_RELAX.test_1[14][10]:=GT*t*Min(1000,RELAX.test.omega_0^local_k)*0.1344351325741675;
+Q_RELAX.test_1[14][12]:=t*Min(1000,RELAX.test.omega_0^local_k)*0.3824103826488193;
+Q_RELAX.test_1[14][13]:=CG*t*Min(1000,RELAX.test.omega_0^local_k)*0.1264560133035801;
+Q_RELAX.test_1[14][15]:=GT*t*Min(1000,RELAX.test.omega_0^local_k)*0.2504957133922061;
+Q_RELAX.test_1[14][30]:=AC*t*Min(1000,RELAX.test.omega_0^local_k)*0.1214054057357627;
+Q_RELAX.test_1[14][46]:=t*Min(1000,RELAX.test.omega_0^local_k)*0.3053650319994416;
+Q_RELAX.test_1[14][59]:=AT*t*Min(1000,RELAX.test.omega_0^local_k)*0.250994522453953;
+Q_RELAX.test_1[15][3]:=AT*t*Min(1000,RELAX.test.omega_0^local_k)*0.5007522026922482;
+Q_RELAX.test_1[15][7]:=CT*t*Min(1000,RELAX.test.omega_0^local_k)*0.1351200521140052;
+Q_RELAX.test_1[15][11]:=GT*t*Min(1000,RELAX.test.omega_0^local_k)*0.1344351325741675;
+Q_RELAX.test_1[15][12]:=AT*t*0.3824103826488193;
+Q_RELAX.test_1[15][13]:=CT*t*0.1264560133035801;
+Q_RELAX.test_1[15][14]:=GT*t*Min(1000,RELAX.test.omega_0^local_k)*0.2406378906553946;
+Q_RELAX.test_1[15][31]:=AC*t*Min(1000,RELAX.test.omega_0^local_k)*0.1214054057357627;
+Q_RELAX.test_1[15][47]:=t*Min(1000,RELAX.test.omega_0^local_k)*0.3053650319994416;
+Q_RELAX.test_1[15][60]:=AT*t*Min(1000,RELAX.test.omega_0^local_k)*0.250994522453953;
+Q_RELAX.test_1[16][0]:=AC*t*Min(1000,RELAX.test.omega_0^local_k)*0.3222350398108426;
+Q_RELAX.test_1[16][17]:=AC*t*Min(1000,RELAX.test.omega_0^local_k)*0.1264560133035801;
+Q_RELAX.test_1[16][18]:=t*0.2406378906553946;
+Q_RELAX.test_1[16][19]:=AT*t*Min(1000,RELAX.test.omega_0^local_k)*0.2504957133922061;
+Q_RELAX.test_1[16][20]:=AC*t*Min(1000,RELAX.test.omega_0^local_k)*0.1351200521140052;
+Q_RELAX.test_1[16][24]:=t*Min(1000,RELAX.test.omega_0^local_k)*0.1344351325741675;
+Q_RELAX.test_1[16][28]:=AT*t*Min(1000,RELAX.test.omega_0^local_k)*0.2296926126195792;
+Q_RELAX.test_1[16][32]:=CG*t*Min(1000,RELAX.test.omega_0^local_k)*0.3053650319994416;
+Q_RELAX.test_1[17][1]:=AC*t*Min(1000,RELAX.test.omega_0^local_k)*0.3222350398108426;
+Q_RELAX.test_1[17][16]:=AC*t*Min(1000,RELAX.test.omega_0^local_k)*0.3824103826488193;
+Q_RELAX.test_1[17][18]:=CG*t*Min(1000,RELAX.test.omega_0^local_k)*0.2406378906553946;
+Q_RELAX.test_1[17][19]:=CT*t*0.2504957133922061;
+Q_RELAX.test_1[17][21]:=AC*t*Min(1000,RELAX.test.omega_0^local_k)*0.1351200521140052;
+Q_RELAX.test_1[17][25]:=t*Min(1000,RELAX.test.omega_0^local_k)*0.1344351325741675;
+Q_RELAX.test_1[17][29]:=AT*t*Min(1000,RELAX.test.omega_0^local_k)*0.2296926126195792;
+Q_RELAX.test_1[17][33]:=CG*t*Min(1000,RELAX.test.omega_0^local_k)*0.3053650319994416;
+Q_RELAX.test_1[17][48]:=CT*t*Min(1000,RELAX.test.omega_0^local_k)*0.250994522453953;
+Q_RELAX.test_1[18][2]:=AC*t*Min(1000,RELAX.test.omega_0^local_k)*0.3222350398108426;
+Q_RELAX.test_1[18][16]:=t*0.3824103826488193;
+Q_RELAX.test_1[18][17]:=CG*t*Min(1000,RELAX.test.omega_0^local_k)*0.1264560133035801;
+Q_RELAX.test_1[18][19]:=GT*t*Min(1000,RELAX.test.omega_0^local_k)*0.2504957133922061;
+Q_RELAX.test_1[18][22]:=AC*t*Min(1000,RELAX.test.omega_0^local_k)*0.1351200521140052;
+Q_RELAX.test_1[18][26]:=t*Min(1000,RELAX.test.omega_0^local_k)*0.1344351325741675;
+Q_RELAX.test_1[18][30]:=AT*t*Min(1000,RELAX.test.omega_0^local_k)*0.2296926126195792;
+Q_RELAX.test_1[18][34]:=CG*t*Min(1000,RELAX.test.omega_0^local_k)*0.3053650319994416;
+Q_RELAX.test_1[19][3]:=AC*t*Min(1000,RELAX.test.omega_0^local_k)*0.3222350398108426;
+Q_RELAX.test_1[19][16]:=AT*t*Min(1000,RELAX.test.omega_0^local_k)*0.3824103826488193;
+Q_RELAX.test_1[19][17]:=CT*t*0.1264560133035801;
+Q_RELAX.test_1[19][18]:=GT*t*Min(1000,RELAX.test.omega_0^local_k)*0.2406378906553946;
+Q_RELAX.test_1[19][23]:=AC*t*Min(1000,RELAX.test.omega_0^local_k)*0.1351200521140052;
+Q_RELAX.test_1[19][27]:=t*Min(1000,RELAX.test.omega_0^local_k)*0.1344351325741675;
+Q_RELAX.test_1[19][31]:=AT*t*Min(1000,RELAX.test.omega_0^local_k)*0.2296926126195792;
+Q_RELAX.test_1[19][35]:=CG*t*Min(1000,RELAX.test.omega_0^local_k)*0.3053650319994416;
+Q_RELAX.test_1[19][49]:=CT*t*Min(1000,RELAX.test.omega_0^local_k)*0.250994522453953;
+Q_RELAX.test_1[20][4]:=AC*t*Min(1000,RELAX.test.omega_0^local_k)*0.3222350398108426;
+Q_RELAX.test_1[20][16]:=AC*t*Min(1000,RELAX.test.omega_0^local_k)*0.5007522026922482;
+Q_RELAX.test_1[20][21]:=AC*t*0.1264560133035801;
+Q_RELAX.test_1[20][22]:=t*0.2406378906553946;
+Q_RELAX.test_1[20][23]:=AT*t*0.2504957133922061;
+Q_RELAX.test_1[20][24]:=CG*t*Min(1000,RELAX.test.omega_0^local_k)*0.1344351325741675;
+Q_RELAX.test_1[20][28]:=CT*t*Min(1000,RELAX.test.omega_0^local_k)*0.2296926126195792;
+Q_RELAX.test_1[20][36]:=CG*t*Min(1000,RELAX.test.omega_0^local_k)*0.3053650319994416;
+Q_RELAX.test_1[20][50]:=CT*t*Min(1000,RELAX.test.omega_0^local_k)*0.250994522453953;
+Q_RELAX.test_1[21][5]:=AC*t*Min(1000,RELAX.test.omega_0^local_k)*0.3222350398108426;
+Q_RELAX.test_1[21][17]:=AC*t*Min(1000,RELAX.test.omega_0^local_k)*0.5007522026922482;
+Q_RELAX.test_1[21][20]:=AC*t*0.3824103826488193;
+Q_RELAX.test_1[21][22]:=CG*t*0.2406378906553946;
+Q_RELAX.test_1[21][23]:=CT*t*0.2504957133922061;
+Q_RELAX.test_1[21][25]:=CG*t*Min(1000,RELAX.test.omega_0^local_k)*0.1344351325741675;
+Q_RELAX.test_1[21][29]:=CT*t*Min(1000,RELAX.test.omega_0^local_k)*0.2296926126195792;
+Q_RELAX.test_1[21][37]:=CG*t*Min(1000,RELAX.test.omega_0^local_k)*0.3053650319994416;
+Q_RELAX.test_1[21][51]:=CT*t*Min(1000,RELAX.test.omega_0^local_k)*0.250994522453953;
+Q_RELAX.test_1[22][6]:=AC*t*Min(1000,RELAX.test.omega_0^local_k)*0.3222350398108426;
+Q_RELAX.test_1[22][18]:=AC*t*Min(1000,RELAX.test.omega_0^local_k)*0.5007522026922482;
+Q_RELAX.test_1[22][20]:=t*0.3824103826488193;
+Q_RELAX.test_1[22][21]:=CG*t*0.1264560133035801;
+Q_RELAX.test_1[22][23]:=GT*t*0.2504957133922061;
+Q_RELAX.test_1[22][26]:=CG*t*Min(1000,RELAX.test.omega_0^local_k)*0.1344351325741675;
+Q_RELAX.test_1[22][30]:=CT*t*Min(1000,RELAX.test.omega_0^local_k)*0.2296926126195792;
+Q_RELAX.test_1[22][38]:=CG*t*Min(1000,RELAX.test.omega_0^local_k)*0.3053650319994416;
+Q_RELAX.test_1[22][52]:=CT*t*Min(1000,RELAX.test.omega_0^local_k)*0.250994522453953;
+Q_RELAX.test_1[23][7]:=AC*t*Min(1000,RELAX.test.omega_0^local_k)*0.3222350398108426;
+Q_RELAX.test_1[23][19]:=AC*t*Min(1000,RELAX.test.omega_0^local_k)*0.5007522026922482;
+Q_RELAX.test_1[23][20]:=AT*t*0.3824103826488193;
+Q_RELAX.test_1[23][21]:=CT*t*0.1264560133035801;
+Q_RELAX.test_1[23][22]:=GT*t*0.2406378906553946;
+Q_RELAX.test_1[23][27]:=CG*t*Min(1000,RELAX.test.omega_0^local_k)*0.1344351325741675;
+Q_RELAX.test_1[23][31]:=CT*t*Min(1000,RELAX.test.omega_0^local_k)*0.2296926126195792;
+Q_RELAX.test_1[23][39]:=CG*t*Min(1000,RELAX.test.omega_0^local_k)*0.3053650319994416;
+Q_RELAX.test_1[23][53]:=CT*t*Min(1000,RELAX.test.omega_0^local_k)*0.250994522453953;
+Q_RELAX.test_1[24][8]:=AC*t*0.3222350398108426;
+Q_RELAX.test_1[24][16]:=t*Min(1000,RELAX.test.omega_0^local_k)*0.5007522026922482;
+Q_RELAX.test_1[24][20]:=CG*t*Min(1000,RELAX.test.omega_0^local_k)*0.1351200521140052;
+Q_RELAX.test_1[24][25]:=AC*t*0.1264560133035801;
+Q_RELAX.test_1[24][26]:=t*0.2406378906553946;
+Q_RELAX.test_1[24][27]:=AT*t*0.2504957133922061;
+Q_RELAX.test_1[24][28]:=GT*t*Min(1000,RELAX.test.omega_0^local_k)*0.2296926126195792;
+Q_RELAX.test_1[24][40]:=CG*t*Min(1000,RELAX.test.omega_0^local_k)*0.3053650319994416;
+Q_RELAX.test_1[25][9]:=AC*t*Min(1000,RELAX.test.omega_0^local_k)*0.3222350398108426;
+Q_RELAX.test_1[25][17]:=t*Min(1000,RELAX.test.omega_0^local_k)*0.5007522026922482;
+Q_RELAX.test_1[25][21]:=CG*t*Min(1000,RELAX.test.omega_0^local_k)*0.1351200521140052;
+Q_RELAX.test_1[25][24]:=AC*t*0.3824103826488193;
+Q_RELAX.test_1[25][26]:=CG*t*0.2406378906553946;
+Q_RELAX.test_1[25][27]:=CT*t*0.2504957133922061;
+Q_RELAX.test_1[25][29]:=GT*t*Min(1000,RELAX.test.omega_0^local_k)*0.2296926126195792;
+Q_RELAX.test_1[25][41]:=CG*t*Min(1000,RELAX.test.omega_0^local_k)*0.3053650319994416;
+Q_RELAX.test_1[25][54]:=CT*t*Min(1000,RELAX.test.omega_0^local_k)*0.250994522453953;
+Q_RELAX.test_1[26][10]:=AC*t*0.3222350398108426;
+Q_RELAX.test_1[26][18]:=t*Min(1000,RELAX.test.omega_0^local_k)*0.5007522026922482;
+Q_RELAX.test_1[26][22]:=CG*t*Min(1000,RELAX.test.omega_0^local_k)*0.1351200521140052;
+Q_RELAX.test_1[26][24]:=t*0.3824103826488193;
+Q_RELAX.test_1[26][25]:=CG*t*0.1264560133035801;
+Q_RELAX.test_1[26][27]:=GT*t*0.2504957133922061;
+Q_RELAX.test_1[26][30]:=GT*t*Min(1000,RELAX.test.omega_0^local_k)*0.2296926126195792;
+Q_RELAX.test_1[26][42]:=CG*t*Min(1000,RELAX.test.omega_0^local_k)*0.3053650319994416;
+Q_RELAX.test_1[26][55]:=CT*t*Min(1000,RELAX.test.omega_0^local_k)*0.250994522453953;
+Q_RELAX.test_1[27][11]:=AC*t*Min(1000,RELAX.test.omega_0^local_k)*0.3222350398108426;
+Q_RELAX.test_1[27][19]:=t*Min(1000,RELAX.test.omega_0^local_k)*0.5007522026922482;
+Q_RELAX.test_1[27][23]:=CG*t*Min(1000,RELAX.test.omega_0^local_k)*0.1351200521140052;
+Q_RELAX.test_1[27][24]:=AT*t*0.3824103826488193;
+Q_RELAX.test_1[27][25]:=CT*t*0.1264560133035801;
+Q_RELAX.test_1[27][26]:=GT*t*0.2406378906553946;
+Q_RELAX.test_1[27][31]:=GT*t*Min(1000,RELAX.test.omega_0^local_k)*0.2296926126195792;
+Q_RELAX.test_1[27][43]:=CG*t*Min(1000,RELAX.test.omega_0^local_k)*0.3053650319994416;
+Q_RELAX.test_1[27][56]:=CT*t*Min(1000,RELAX.test.omega_0^local_k)*0.250994522453953;
+Q_RELAX.test_1[28][12]:=AC*t*Min(1000,RELAX.test.omega_0^local_k)*0.3222350398108426;
+Q_RELAX.test_1[28][16]:=AT*t*Min(1000,RELAX.test.omega_0^local_k)*0.5007522026922482;
+Q_RELAX.test_1[28][20]:=CT*t*Min(1000,RELAX.test.omega_0^local_k)*0.1351200521140052;
+Q_RELAX.test_1[28][24]:=GT*t*Min(1000,RELAX.test.omega_0^local_k)*0.1344351325741675;
+Q_RELAX.test_1[28][29]:=AC*t*0.1264560133035801;
+Q_RELAX.test_1[28][30]:=t*0.2406378906553946;
+Q_RELAX.test_1[28][31]:=AT*t*0.2504957133922061;
+Q_RELAX.test_1[28][44]:=CG*t*Min(1000,RELAX.test.omega_0^local_k)*0.3053650319994416;
+Q_RELAX.test_1[28][57]:=CT*t*0.250994522453953;
+Q_RELAX.test_1[29][13]:=AC*t*Min(1000,RELAX.test.omega_0^local_k)*0.3222350398108426;
+Q_RELAX.test_1[29][17]:=AT*t*Min(1000,RELAX.test.omega_0^local_k)*0.5007522026922482;
+Q_RELAX.test_1[29][21]:=CT*t*Min(1000,RELAX.test.omega_0^local_k)*0.1351200521140052;
+Q_RELAX.test_1[29][25]:=GT*t*Min(1000,RELAX.test.omega_0^local_k)*0.1344351325741675;
+Q_RELAX.test_1[29][28]:=AC*t*0.3824103826488193;
+Q_RELAX.test_1[29][30]:=CG*t*0.2406378906553946;
+Q_RELAX.test_1[29][31]:=CT*t*0.2504957133922061;
+Q_RELAX.test_1[29][45]:=CG*t*Min(1000,RELAX.test.omega_0^local_k)*0.3053650319994416;
+Q_RELAX.test_1[29][58]:=CT*t*Min(1000,RELAX.test.omega_0^local_k)*0.250994522453953;
+Q_RELAX.test_1[30][14]:=AC*t*Min(1000,RELAX.test.omega_0^local_k)*0.3222350398108426;
+Q_RELAX.test_1[30][18]:=AT*t*Min(1000,RELAX.test.omega_0^local_k)*0.5007522026922482;
+Q_RELAX.test_1[30][22]:=CT*t*Min(1000,RELAX.test.omega_0^local_k)*0.1351200521140052;
+Q_RELAX.test_1[30][26]:=GT*t*Min(1000,RELAX.test.omega_0^local_k)*0.1344351325741675;
+Q_RELAX.test_1[30][28]:=t*0.3824103826488193;
+Q_RELAX.test_1[30][29]:=CG*t*0.1264560133035801;
+Q_RELAX.test_1[30][31]:=GT*t*0.2504957133922061;
+Q_RELAX.test_1[30][46]:=CG*t*Min(1000,RELAX.test.omega_0^local_k)*0.3053650319994416;
+Q_RELAX.test_1[30][59]:=CT*t*0.250994522453953;
+Q_RELAX.test_1[31][15]:=AC*t*Min(1000,RELAX.test.omega_0^local_k)*0.3222350398108426;
+Q_RELAX.test_1[31][19]:=AT*t*Min(1000,RELAX.test.omega_0^local_k)*0.5007522026922482;
+Q_RELAX.test_1[31][23]:=CT*t*Min(1000,RELAX.test.omega_0^local_k)*0.1351200521140052;
+Q_RELAX.test_1[31][27]:=GT*t*Min(1000,RELAX.test.omega_0^local_k)*0.1344351325741675;
+Q_RELAX.test_1[31][28]:=AT*t*0.3824103826488193;
+Q_RELAX.test_1[31][29]:=CT*t*0.1264560133035801;
+Q_RELAX.test_1[31][30]:=GT*t*0.2406378906553946;
+Q_RELAX.test_1[31][47]:=CG*t*Min(1000,RELAX.test.omega_0^local_k)*0.3053650319994416;
+Q_RELAX.test_1[31][60]:=CT*t*Min(1000,RELAX.test.omega_0^local_k)*0.250994522453953;
+Q_RELAX.test_1[32][0]:=t*Min(1000,RELAX.test.omega_0^local_k)*0.3222350398108426;
+Q_RELAX.test_1[32][16]:=CG*t*Min(1000,RELAX.test.omega_0^local_k)*0.1214054057357627;
+Q_RELAX.test_1[32][33]:=AC*t*Min(1000,RELAX.test.omega_0^local_k)*0.1264560133035801;
+Q_RELAX.test_1[32][34]:=t*0.2406378906553946;
+Q_RELAX.test_1[32][35]:=AT*t*Min(1000,RELAX.test.omega_0^local_k)*0.2504957133922061;
+Q_RELAX.test_1[32][36]:=AC*t*Min(1000,RELAX.test.omega_0^local_k)*0.1351200521140052;
+Q_RELAX.test_1[32][40]:=t*Min(1000,RELAX.test.omega_0^local_k)*0.1344351325741675;
+Q_RELAX.test_1[32][44]:=AT*t*Min(1000,RELAX.test.omega_0^local_k)*0.2296926126195792;
+Q_RELAX.test_1[33][1]:=t*Min(1000,RELAX.test.omega_0^local_k)*0.3222350398108426;
+Q_RELAX.test_1[33][17]:=CG*t*Min(1000,RELAX.test.omega_0^local_k)*0.1214054057357627;
+Q_RELAX.test_1[33][32]:=AC*t*Min(1000,RELAX.test.omega_0^local_k)*0.3824103826488193;
+Q_RELAX.test_1[33][34]:=CG*t*Min(1000,RELAX.test.omega_0^local_k)*0.2406378906553946;
+Q_RELAX.test_1[33][35]:=CT*t*0.2504957133922061;
+Q_RELAX.test_1[33][37]:=AC*t*Min(1000,RELAX.test.omega_0^local_k)*0.1351200521140052;
+Q_RELAX.test_1[33][41]:=t*Min(1000,RELAX.test.omega_0^local_k)*0.1344351325741675;
+Q_RELAX.test_1[33][45]:=AT*t*Min(1000,RELAX.test.omega_0^local_k)*0.2296926126195792;
+Q_RELAX.test_1[33][48]:=GT*t*Min(1000,RELAX.test.omega_0^local_k)*0.250994522453953;
+Q_RELAX.test_1[34][2]:=t*Min(1000,RELAX.test.omega_0^local_k)*0.3222350398108426;
+Q_RELAX.test_1[34][18]:=CG*t*Min(1000,RELAX.test.omega_0^local_k)*0.1214054057357627;
+Q_RELAX.test_1[34][32]:=t*0.3824103826488193;
+Q_RELAX.test_1[34][33]:=CG*t*Min(1000,RELAX.test.omega_0^local_k)*0.1264560133035801;
+Q_RELAX.test_1[34][35]:=GT*t*Min(1000,RELAX.test.omega_0^local_k)*0.2504957133922061;
+Q_RELAX.test_1[34][38]:=AC*t*Min(1000,RELAX.test.omega_0^local_k)*0.1351200521140052;
+Q_RELAX.test_1[34][42]:=t*Min(1000,RELAX.test.omega_0^local_k)*0.1344351325741675;
+Q_RELAX.test_1[34][46]:=AT*t*Min(1000,RELAX.test.omega_0^local_k)*0.2296926126195792;
+Q_RELAX.test_1[35][3]:=t*Min(1000,RELAX.test.omega_0^local_k)*0.3222350398108426;
+Q_RELAX.test_1[35][19]:=CG*t*Min(1000,RELAX.test.omega_0^local_k)*0.1214054057357627;
+Q_RELAX.test_1[35][32]:=AT*t*Min(1000,RELAX.test.omega_0^local_k)*0.3824103826488193;
+Q_RELAX.test_1[35][33]:=CT*t*0.1264560133035801;
+Q_RELAX.test_1[35][34]:=GT*t*Min(1000,RELAX.test.omega_0^local_k)*0.2406378906553946;
+Q_RELAX.test_1[35][39]:=AC*t*Min(1000,RELAX.test.omega_0^local_k)*0.1351200521140052;
+Q_RELAX.test_1[35][43]:=t*Min(1000,RELAX.test.omega_0^local_k)*0.1344351325741675;
+Q_RELAX.test_1[35][47]:=AT*t*Min(1000,RELAX.test.omega_0^local_k)*0.2296926126195792;
+Q_RELAX.test_1[35][49]:=GT*t*Min(1000,RELAX.test.omega_0^local_k)*0.250994522453953;
+Q_RELAX.test_1[36][4]:=t*Min(1000,RELAX.test.omega_0^local_k)*0.3222350398108426;
+Q_RELAX.test_1[36][20]:=CG*t*Min(1000,RELAX.test.omega_0^local_k)*0.1214054057357627;
+Q_RELAX.test_1[36][32]:=AC*t*Min(1000,RELAX.test.omega_0^local_k)*0.5007522026922482;
+Q_RELAX.test_1[36][37]:=AC*t*0.1264560133035801;
+Q_RELAX.test_1[36][38]:=t*0.2406378906553946;
+Q_RELAX.test_1[36][39]:=AT*t*0.2504957133922061;
+Q_RELAX.test_1[36][40]:=CG*t*Min(1000,RELAX.test.omega_0^local_k)*0.1344351325741675;
+Q_RELAX.test_1[36][44]:=CT*t*Min(1000,RELAX.test.omega_0^local_k)*0.2296926126195792;
+Q_RELAX.test_1[36][50]:=GT*t*Min(1000,RELAX.test.omega_0^local_k)*0.250994522453953;
+Q_RELAX.test_1[37][5]:=t*Min(1000,RELAX.test.omega_0^local_k)*0.3222350398108426;
+Q_RELAX.test_1[37][21]:=CG*t*Min(1000,RELAX.test.omega_0^local_k)*0.1214054057357627;
+Q_RELAX.test_1[37][33]:=AC*t*Min(1000,RELAX.test.omega_0^local_k)*0.5007522026922482;
+Q_RELAX.test_1[37][36]:=AC*t*0.3824103826488193;
+Q_RELAX.test_1[37][38]:=CG*t*0.2406378906553946;
+Q_RELAX.test_1[37][39]:=CT*t*0.2504957133922061;
+Q_RELAX.test_1[37][41]:=CG*t*Min(1000,RELAX.test.omega_0^local_k)*0.1344351325741675;
+Q_RELAX.test_1[37][45]:=CT*t*Min(1000,RELAX.test.omega_0^local_k)*0.2296926126195792;
+Q_RELAX.test_1[37][51]:=GT*t*Min(1000,RELAX.test.omega_0^local_k)*0.250994522453953;
+Q_RELAX.test_1[38][6]:=t*Min(1000,RELAX.test.omega_0^local_k)*0.3222350398108426;
+Q_RELAX.test_1[38][22]:=CG*t*Min(1000,RELAX.test.omega_0^local_k)*0.1214054057357627;
+Q_RELAX.test_1[38][34]:=AC*t*Min(1000,RELAX.test.omega_0^local_k)*0.5007522026922482;
+Q_RELAX.test_1[38][36]:=t*0.3824103826488193;
+Q_RELAX.test_1[38][37]:=CG*t*0.1264560133035801;
+Q_RELAX.test_1[38][39]:=GT*t*0.2504957133922061;
+Q_RELAX.test_1[38][42]:=CG*t*Min(1000,RELAX.test.omega_0^local_k)*0.1344351325741675;
+Q_RELAX.test_1[38][46]:=CT*t*Min(1000,RELAX.test.omega_0^local_k)*0.2296926126195792;
+Q_RELAX.test_1[38][52]:=GT*t*Min(1000,RELAX.test.omega_0^local_k)*0.250994522453953;
+Q_RELAX.test_1[39][7]:=t*Min(1000,RELAX.test.omega_0^local_k)*0.3222350398108426;
+Q_RELAX.test_1[39][23]:=CG*t*Min(1000,RELAX.test.omega_0^local_k)*0.1214054057357627;
+Q_RELAX.test_1[39][35]:=AC*t*Min(1000,RELAX.test.omega_0^local_k)*0.5007522026922482;
+Q_RELAX.test_1[39][36]:=AT*t*0.3824103826488193;
+Q_RELAX.test_1[39][37]:=CT*t*0.1264560133035801;
+Q_RELAX.test_1[39][38]:=GT*t*0.2406378906553946;
+Q_RELAX.test_1[39][43]:=CG*t*Min(1000,RELAX.test.omega_0^local_k)*0.1344351325741675;
+Q_RELAX.test_1[39][47]:=CT*t*Min(1000,RELAX.test.omega_0^local_k)*0.2296926126195792;
+Q_RELAX.test_1[39][53]:=GT*t*Min(1000,RELAX.test.omega_0^local_k)*0.250994522453953;
+Q_RELAX.test_1[40][8]:=t*Min(1000,RELAX.test.omega_0^local_k)*0.3222350398108426;
+Q_RELAX.test_1[40][24]:=CG*t*Min(1000,RELAX.test.omega_0^local_k)*0.1214054057357627;
+Q_RELAX.test_1[40][32]:=t*Min(1000,RELAX.test.omega_0^local_k)*0.5007522026922482;
+Q_RELAX.test_1[40][36]:=CG*t*Min(1000,RELAX.test.omega_0^local_k)*0.1351200521140052;
+Q_RELAX.test_1[40][41]:=AC*t*0.1264560133035801;
+Q_RELAX.test_1[40][42]:=t*0.2406378906553946;
+Q_RELAX.test_1[40][43]:=AT*t*0.2504957133922061;
+Q_RELAX.test_1[40][44]:=GT*t*Min(1000,RELAX.test.omega_0^local_k)*0.2296926126195792;
+Q_RELAX.test_1[41][9]:=t*Min(1000,RELAX.test.omega_0^local_k)*0.3222350398108426;
+Q_RELAX.test_1[41][25]:=CG*t*Min(1000,RELAX.test.omega_0^local_k)*0.1214054057357627;
+Q_RELAX.test_1[41][33]:=t*Min(1000,RELAX.test.omega_0^local_k)*0.5007522026922482;
+Q_RELAX.test_1[41][37]:=CG*t*Min(1000,RELAX.test.omega_0^local_k)*0.1351200521140052;
+Q_RELAX.test_1[41][40]:=AC*t*0.3824103826488193;
+Q_RELAX.test_1[41][42]:=CG*t*0.2406378906553946;
+Q_RELAX.test_1[41][43]:=CT*t*0.2504957133922061;
+Q_RELAX.test_1[41][45]:=GT*t*Min(1000,RELAX.test.omega_0^local_k)*0.2296926126195792;
+Q_RELAX.test_1[41][54]:=GT*t*Min(1000,RELAX.test.omega_0^local_k)*0.250994522453953;
+Q_RELAX.test_1[42][10]:=t*Min(1000,RELAX.test.omega_0^local_k)*0.3222350398108426;
+Q_RELAX.test_1[42][26]:=CG*t*Min(1000,RELAX.test.omega_0^local_k)*0.1214054057357627;
+Q_RELAX.test_1[42][34]:=t*Min(1000,RELAX.test.omega_0^local_k)*0.5007522026922482;
+Q_RELAX.test_1[42][38]:=CG*t*Min(1000,RELAX.test.omega_0^local_k)*0.1351200521140052;
+Q_RELAX.test_1[42][40]:=t*0.3824103826488193;
+Q_RELAX.test_1[42][41]:=CG*t*0.1264560133035801;
+Q_RELAX.test_1[42][43]:=GT*t*0.2504957133922061;
+Q_RELAX.test_1[42][46]:=GT*t*Min(1000,RELAX.test.omega_0^local_k)*0.2296926126195792;
+Q_RELAX.test_1[42][55]:=GT*t*Min(1000,RELAX.test.omega_0^local_k)*0.250994522453953;
+Q_RELAX.test_1[43][11]:=t*Min(1000,RELAX.test.omega_0^local_k)*0.3222350398108426;
+Q_RELAX.test_1[43][27]:=CG*t*Min(1000,RELAX.test.omega_0^local_k)*0.1214054057357627;
+Q_RELAX.test_1[43][35]:=t*Min(1000,RELAX.test.omega_0^local_k)*0.5007522026922482;
+Q_RELAX.test_1[43][39]:=CG*t*Min(1000,RELAX.test.omega_0^local_k)*0.1351200521140052;
+Q_RELAX.test_1[43][40]:=AT*t*0.3824103826488193;
+Q_RELAX.test_1[43][41]:=CT*t*0.1264560133035801;
+Q_RELAX.test_1[43][42]:=GT*t*0.2406378906553946;
+Q_RELAX.test_1[43][47]:=GT*t*Min(1000,RELAX.test.omega_0^local_k)*0.2296926126195792;
+Q_RELAX.test_1[43][56]:=GT*t*Min(1000,RELAX.test.omega_0^local_k)*0.250994522453953;
+Q_RELAX.test_1[44][12]:=t*Min(1000,RELAX.test.omega_0^local_k)*0.3222350398108426;
+Q_RELAX.test_1[44][28]:=CG*t*Min(1000,RELAX.test.omega_0^local_k)*0.1214054057357627;
+Q_RELAX.test_1[44][32]:=AT*t*Min(1000,RELAX.test.omega_0^local_k)*0.5007522026922482;
+Q_RELAX.test_1[44][36]:=CT*t*Min(1000,RELAX.test.omega_0^local_k)*0.1351200521140052;
+Q_RELAX.test_1[44][40]:=GT*t*Min(1000,RELAX.test.omega_0^local_k)*0.1344351325741675;
+Q_RELAX.test_1[44][45]:=AC*t*0.1264560133035801;
+Q_RELAX.test_1[44][46]:=t*0.2406378906553946;
+Q_RELAX.test_1[44][47]:=AT*t*0.2504957133922061;
+Q_RELAX.test_1[44][57]:=GT*t*Min(1000,RELAX.test.omega_0^local_k)*0.250994522453953;
+Q_RELAX.test_1[45][13]:=t*Min(1000,RELAX.test.omega_0^local_k)*0.3222350398108426;
+Q_RELAX.test_1[45][29]:=CG*t*Min(1000,RELAX.test.omega_0^local_k)*0.1214054057357627;
+Q_RELAX.test_1[45][33]:=AT*t*Min(1000,RELAX.test.omega_0^local_k)*0.5007522026922482;
+Q_RELAX.test_1[45][37]:=CT*t*Min(1000,RELAX.test.omega_0^local_k)*0.1351200521140052;
+Q_RELAX.test_1[45][41]:=GT*t*Min(1000,RELAX.test.omega_0^local_k)*0.1344351325741675;
+Q_RELAX.test_1[45][44]:=AC*t*0.3824103826488193;
+Q_RELAX.test_1[45][46]:=CG*t*0.2406378906553946;
+Q_RELAX.test_1[45][47]:=CT*t*0.2504957133922061;
+Q_RELAX.test_1[45][58]:=GT*t*Min(1000,RELAX.test.omega_0^local_k)*0.250994522453953;
+Q_RELAX.test_1[46][14]:=t*Min(1000,RELAX.test.omega_0^local_k)*0.3222350398108426;
+Q_RELAX.test_1[46][30]:=CG*t*Min(1000,RELAX.test.omega_0^local_k)*0.1214054057357627;
+Q_RELAX.test_1[46][34]:=AT*t*Min(1000,RELAX.test.omega_0^local_k)*0.5007522026922482;
+Q_RELAX.test_1[46][38]:=CT*t*Min(1000,RELAX.test.omega_0^local_k)*0.1351200521140052;
+Q_RELAX.test_1[46][42]:=GT*t*Min(1000,RELAX.test.omega_0^local_k)*0.1344351325741675;
+Q_RELAX.test_1[46][44]:=t*0.3824103826488193;
+Q_RELAX.test_1[46][45]:=CG*t*0.1264560133035801;
+Q_RELAX.test_1[46][47]:=GT*t*0.2504957133922061;
+Q_RELAX.test_1[46][59]:=GT*t*Min(1000,RELAX.test.omega_0^local_k)*0.250994522453953;
+Q_RELAX.test_1[47][15]:=t*Min(1000,RELAX.test.omega_0^local_k)*0.3222350398108426;
+Q_RELAX.test_1[47][31]:=CG*t*Min(1000,RELAX.test.omega_0^local_k)*0.1214054057357627;
+Q_RELAX.test_1[47][35]:=AT*t*Min(1000,RELAX.test.omega_0^local_k)*0.5007522026922482;
+Q_RELAX.test_1[47][39]:=CT*t*Min(1000,RELAX.test.omega_0^local_k)*0.1351200521140052;
+Q_RELAX.test_1[47][43]:=GT*t*Min(1000,RELAX.test.omega_0^local_k)*0.1344351325741675;
+Q_RELAX.test_1[47][44]:=AT*t*0.3824103826488193;
+Q_RELAX.test_1[47][45]:=CT*t*0.1264560133035801;
+Q_RELAX.test_1[47][46]:=GT*t*0.2406378906553946;
+Q_RELAX.test_1[47][60]:=GT*t*Min(1000,RELAX.test.omega_0^local_k)*0.250994522453953;
+Q_RELAX.test_1[48][1]:=AT*t*Min(1000,RELAX.test.omega_0^local_k)*0.3222350398108426;
+Q_RELAX.test_1[48][17]:=CT*t*Min(1000,RELAX.test.omega_0^local_k)*0.1214054057357627;
+Q_RELAX.test_1[48][33]:=GT*t*Min(1000,RELAX.test.omega_0^local_k)*0.3053650319994416;
+Q_RELAX.test_1[48][49]:=CT*t*0.2504957133922061;
+Q_RELAX.test_1[48][51]:=AC*t*Min(1000,RELAX.test.omega_0^local_k)*0.1351200521140052;
+Q_RELAX.test_1[48][54]:=t*Min(1000,RELAX.test.omega_0^local_k)*0.1344351325741675;
+Q_RELAX.test_1[48][58]:=AT*t*Min(1000,RELAX.test.omega_0^local_k)*0.2296926126195792;
+Q_RELAX.test_1[49][3]:=AT*t*Min(1000,RELAX.test.omega_0^local_k)*0.3222350398108426;
+Q_RELAX.test_1[49][19]:=CT*t*Min(1000,RELAX.test.omega_0^local_k)*0.1214054057357627;
+Q_RELAX.test_1[49][35]:=GT*t*Min(1000,RELAX.test.omega_0^local_k)*0.3053650319994416;
+Q_RELAX.test_1[49][48]:=CT*t*0.1264560133035801;
+Q_RELAX.test_1[49][53]:=AC*t*Min(1000,RELAX.test.omega_0^local_k)*0.1351200521140052;
+Q_RELAX.test_1[49][56]:=t*Min(1000,RELAX.test.omega_0^local_k)*0.1344351325741675;
+Q_RELAX.test_1[49][60]:=AT*t*Min(1000,RELAX.test.omega_0^local_k)*0.2296926126195792;
+Q_RELAX.test_1[50][4]:=AT*t*Min(1000,RELAX.test.omega_0^local_k)*0.3222350398108426;
+Q_RELAX.test_1[50][20]:=CT*t*Min(1000,RELAX.test.omega_0^local_k)*0.1214054057357627;
+Q_RELAX.test_1[50][36]:=GT*t*Min(1000,RELAX.test.omega_0^local_k)*0.3053650319994416;
+Q_RELAX.test_1[50][51]:=AC*t*0.1264560133035801;
+Q_RELAX.test_1[50][52]:=t*0.2406378906553946;
+Q_RELAX.test_1[50][53]:=AT*t*0.2504957133922061;
+Q_RELAX.test_1[50][57]:=CT*t*Min(1000,RELAX.test.omega_0^local_k)*0.2296926126195792;
+Q_RELAX.test_1[51][5]:=AT*t*Min(1000,RELAX.test.omega_0^local_k)*0.3222350398108426;
+Q_RELAX.test_1[51][21]:=CT*t*Min(1000,RELAX.test.omega_0^local_k)*0.1214054057357627;
+Q_RELAX.test_1[51][37]:=GT*t*Min(1000,RELAX.test.omega_0^local_k)*0.3053650319994416;
+Q_RELAX.test_1[51][48]:=AC*t*Min(1000,RELAX.test.omega_0^local_k)*0.5007522026922482;
+Q_RELAX.test_1[51][50]:=AC*t*0.3824103826488193;
+Q_RELAX.test_1[51][52]:=CG*t*0.2406378906553946;
+Q_RELAX.test_1[51][53]:=CT*t*0.2504957133922061;
+Q_RELAX.test_1[51][54]:=CG*t*Min(1000,RELAX.test.omega_0^local_k)*0.1344351325741675;
+Q_RELAX.test_1[51][58]:=CT*t*Min(1000,RELAX.test.omega_0^local_k)*0.2296926126195792;
+Q_RELAX.test_1[52][6]:=AT*t*Min(1000,RELAX.test.omega_0^local_k)*0.3222350398108426;
+Q_RELAX.test_1[52][22]:=CT*t*Min(1000,RELAX.test.omega_0^local_k)*0.1214054057357627;
+Q_RELAX.test_1[52][38]:=GT*t*Min(1000,RELAX.test.omega_0^local_k)*0.3053650319994416;
+Q_RELAX.test_1[52][50]:=t*0.3824103826488193;
+Q_RELAX.test_1[52][51]:=CG*t*0.1264560133035801;
+Q_RELAX.test_1[52][53]:=GT*t*0.2504957133922061;
+Q_RELAX.test_1[52][55]:=CG*t*Min(1000,RELAX.test.omega_0^local_k)*0.1344351325741675;
+Q_RELAX.test_1[52][59]:=CT*t*Min(1000,RELAX.test.omega_0^local_k)*0.2296926126195792;
+Q_RELAX.test_1[53][7]:=AT*t*Min(1000,RELAX.test.omega_0^local_k)*0.3222350398108426;
+Q_RELAX.test_1[53][23]:=CT*t*Min(1000,RELAX.test.omega_0^local_k)*0.1214054057357627;
+Q_RELAX.test_1[53][39]:=GT*t*Min(1000,RELAX.test.omega_0^local_k)*0.3053650319994416;
+Q_RELAX.test_1[53][49]:=AC*t*Min(1000,RELAX.test.omega_0^local_k)*0.5007522026922482;
+Q_RELAX.test_1[53][50]:=AT*t*0.3824103826488193;
+Q_RELAX.test_1[53][51]:=CT*t*0.1264560133035801;
+Q_RELAX.test_1[53][52]:=GT*t*0.2406378906553946;
+Q_RELAX.test_1[53][56]:=CG*t*Min(1000,RELAX.test.omega_0^local_k)*0.1344351325741675;
+Q_RELAX.test_1[53][60]:=CT*t*Min(1000,RELAX.test.omega_0^local_k)*0.2296926126195792;
+Q_RELAX.test_1[54][9]:=AT*t*Min(1000,RELAX.test.omega_0^local_k)*0.3222350398108426;
+Q_RELAX.test_1[54][25]:=CT*t*Min(1000,RELAX.test.omega_0^local_k)*0.1214054057357627;
+Q_RELAX.test_1[54][41]:=GT*t*Min(1000,RELAX.test.omega_0^local_k)*0.3053650319994416;
+Q_RELAX.test_1[54][48]:=t*Min(1000,RELAX.test.omega_0^local_k)*0.5007522026922482;
+Q_RELAX.test_1[54][51]:=CG*t*Min(1000,RELAX.test.omega_0^local_k)*0.1351200521140052;
+Q_RELAX.test_1[54][55]:=CG*t*Min(1000,RELAX.test.omega_0^local_k)*0.2406378906553946;
+Q_RELAX.test_1[54][56]:=CT*t*0.2504957133922061;
+Q_RELAX.test_1[54][58]:=GT*t*Min(1000,RELAX.test.omega_0^local_k)*0.2296926126195792;
+Q_RELAX.test_1[55][10]:=AT*t*Min(1000,RELAX.test.omega_0^local_k)*0.3222350398108426;
+Q_RELAX.test_1[55][26]:=CT*t*Min(1000,RELAX.test.omega_0^local_k)*0.1214054057357627;
+Q_RELAX.test_1[55][42]:=GT*t*Min(1000,RELAX.test.omega_0^local_k)*0.3053650319994416;
+Q_RELAX.test_1[55][52]:=CG*t*Min(1000,RELAX.test.omega_0^local_k)*0.1351200521140052;
+Q_RELAX.test_1[55][54]:=CG*t*Min(1000,RELAX.test.omega_0^local_k)*0.1264560133035801;
+Q_RELAX.test_1[55][56]:=GT*t*Min(1000,RELAX.test.omega_0^local_k)*0.2504957133922061;
+Q_RELAX.test_1[55][59]:=GT*t*Min(1000,RELAX.test.omega_0^local_k)*0.2296926126195792;
+Q_RELAX.test_1[56][11]:=AT*t*Min(1000,RELAX.test.omega_0^local_k)*0.3222350398108426;
+Q_RELAX.test_1[56][27]:=CT*t*Min(1000,RELAX.test.omega_0^local_k)*0.1214054057357627;
+Q_RELAX.test_1[56][43]:=GT*t*Min(1000,RELAX.test.omega_0^local_k)*0.3053650319994416;
+Q_RELAX.test_1[56][49]:=t*Min(1000,RELAX.test.omega_0^local_k)*0.5007522026922482;
+Q_RELAX.test_1[56][53]:=CG*t*Min(1000,RELAX.test.omega_0^local_k)*0.1351200521140052;
+Q_RELAX.test_1[56][54]:=CT*t*0.1264560133035801;
+Q_RELAX.test_1[56][55]:=GT*t*Min(1000,RELAX.test.omega_0^local_k)*0.2406378906553946;
+Q_RELAX.test_1[56][60]:=GT*t*Min(1000,RELAX.test.omega_0^local_k)*0.2296926126195792;
+Q_RELAX.test_1[57][12]:=AT*t*Min(1000,RELAX.test.omega_0^local_k)*0.3222350398108426;
+Q_RELAX.test_1[57][28]:=CT*t*0.1214054057357627;
+Q_RELAX.test_1[57][44]:=GT*t*Min(1000,RELAX.test.omega_0^local_k)*0.3053650319994416;
+Q_RELAX.test_1[57][50]:=CT*t*Min(1000,RELAX.test.omega_0^local_k)*0.1351200521140052;
+Q_RELAX.test_1[57][58]:=AC*t*Min(1000,RELAX.test.omega_0^local_k)*0.1264560133035801;
+Q_RELAX.test_1[57][59]:=t*0.2406378906553946;
+Q_RELAX.test_1[57][60]:=AT*t*Min(1000,RELAX.test.omega_0^local_k)*0.2504957133922061;
+Q_RELAX.test_1[58][13]:=AT*t*Min(1000,RELAX.test.omega_0^local_k)*0.3222350398108426;
+Q_RELAX.test_1[58][29]:=CT*t*Min(1000,RELAX.test.omega_0^local_k)*0.1214054057357627;
+Q_RELAX.test_1[58][45]:=GT*t*Min(1000,RELAX.test.omega_0^local_k)*0.3053650319994416;
+Q_RELAX.test_1[58][48]:=AT*t*Min(1000,RELAX.test.omega_0^local_k)*0.5007522026922482;
+Q_RELAX.test_1[58][51]:=CT*t*Min(1000,RELAX.test.omega_0^local_k)*0.1351200521140052;
+Q_RELAX.test_1[58][54]:=GT*t*Min(1000,RELAX.test.omega_0^local_k)*0.1344351325741675;
+Q_RELAX.test_1[58][57]:=AC*t*Min(1000,RELAX.test.omega_0^local_k)*0.3824103826488193;
+Q_RELAX.test_1[58][59]:=CG*t*Min(1000,RELAX.test.omega_0^local_k)*0.2406378906553946;
+Q_RELAX.test_1[58][60]:=CT*t*0.2504957133922061;
+Q_RELAX.test_1[59][14]:=AT*t*Min(1000,RELAX.test.omega_0^local_k)*0.3222350398108426;
+Q_RELAX.test_1[59][30]:=CT*t*0.1214054057357627;
+Q_RELAX.test_1[59][46]:=GT*t*Min(1000,RELAX.test.omega_0^local_k)*0.3053650319994416;
+Q_RELAX.test_1[59][52]:=CT*t*Min(1000,RELAX.test.omega_0^local_k)*0.1351200521140052;
+Q_RELAX.test_1[59][55]:=GT*t*Min(1000,RELAX.test.omega_0^local_k)*0.1344351325741675;
+Q_RELAX.test_1[59][57]:=t*0.3824103826488193;
+Q_RELAX.test_1[59][58]:=CG*t*Min(1000,RELAX.test.omega_0^local_k)*0.1264560133035801;
+Q_RELAX.test_1[59][60]:=GT*t*Min(1000,RELAX.test.omega_0^local_k)*0.2504957133922061;
+Q_RELAX.test_1[60][15]:=AT*t*Min(1000,RELAX.test.omega_0^local_k)*0.3222350398108426;
+Q_RELAX.test_1[60][31]:=CT*t*Min(1000,RELAX.test.omega_0^local_k)*0.1214054057357627;
+Q_RELAX.test_1[60][47]:=GT*t*Min(1000,RELAX.test.omega_0^local_k)*0.3053650319994416;
+Q_RELAX.test_1[60][49]:=AT*t*Min(1000,RELAX.test.omega_0^local_k)*0.5007522026922482;
+Q_RELAX.test_1[60][53]:=CT*t*Min(1000,RELAX.test.omega_0^local_k)*0.1351200521140052;
+Q_RELAX.test_1[60][56]:=GT*t*Min(1000,RELAX.test.omega_0^local_k)*0.1344351325741675;
+Q_RELAX.test_1[60][57]:=AT*t*Min(1000,RELAX.test.omega_0^local_k)*0.3824103826488193;
+Q_RELAX.test_1[60][58]:=CT*t*0.1264560133035801;
+Q_RELAX.test_1[60][59]:=GT*t*Min(1000,RELAX.test.omega_0^local_k)*0.2406378906553946;
+
+
+Q_RELAX.test_2={61,61};
+Q_RELAX.test_2[0][1]:=AC*t*Min(1000,RELAX.test.omega_1^local_k)*0.1264560133035801;
+Q_RELAX.test_2[0][2]:=t*0.2406378906553946;
+Q_RELAX.test_2[0][3]:=AT*t*Min(1000,RELAX.test.omega_1^local_k)*0.2504957133922061;
+Q_RELAX.test_2[0][4]:=AC*t*Min(1000,RELAX.test.omega_1^local_k)*0.1351200521140052;
+Q_RELAX.test_2[0][8]:=t*Min(1000,RELAX.test.omega_1^local_k)*0.1344351325741675;
+Q_RELAX.test_2[0][12]:=AT*t*Min(1000,RELAX.test.omega_1^local_k)*0.2296926126195792;
+Q_RELAX.test_2[0][16]:=AC*t*Min(1000,RELAX.test.omega_1^local_k)*0.1214054057357627;
+Q_RELAX.test_2[0][32]:=t*Min(1000,RELAX.test.omega_1^local_k)*0.3053650319994416;
+Q_RELAX.test_2[1][0]:=AC*t*Min(1000,RELAX.test.omega_1^local_k)*0.3824103826488193;
+Q_RELAX.test_2[1][2]:=CG*t*Min(1000,RELAX.test.omega_1^local_k)*0.2406378906553946;
+Q_RELAX.test_2[1][3]:=CT*t*0.2504957133922061;
+Q_RELAX.test_2[1][5]:=AC*t*Min(1000,RELAX.test.omega_1^local_k)*0.1351200521140052;
+Q_RELAX.test_2[1][9]:=t*Min(1000,RELAX.test.omega_1^local_k)*0.1344351325741675;
+Q_RELAX.test_2[1][13]:=AT*t*Min(1000,RELAX.test.omega_1^local_k)*0.2296926126195792;
+Q_RELAX.test_2[1][17]:=AC*t*Min(1000,RELAX.test.omega_1^local_k)*0.1214054057357627;
+Q_RELAX.test_2[1][33]:=t*Min(1000,RELAX.test.omega_1^local_k)*0.3053650319994416;
+Q_RELAX.test_2[1][48]:=AT*t*Min(1000,RELAX.test.omega_1^local_k)*0.250994522453953;
+Q_RELAX.test_2[2][0]:=t*0.3824103826488193;
+Q_RELAX.test_2[2][1]:=CG*t*Min(1000,RELAX.test.omega_1^local_k)*0.1264560133035801;
+Q_RELAX.test_2[2][3]:=GT*t*Min(1000,RELAX.test.omega_1^local_k)*0.2504957133922061;
+Q_RELAX.test_2[2][6]:=AC*t*Min(1000,RELAX.test.omega_1^local_k)*0.1351200521140052;
+Q_RELAX.test_2[2][10]:=t*Min(1000,RELAX.test.omega_1^local_k)*0.1344351325741675;
+Q_RELAX.test_2[2][14]:=AT*t*Min(1000,RELAX.test.omega_1^local_k)*0.2296926126195792;
+Q_RELAX.test_2[2][18]:=AC*t*Min(1000,RELAX.test.omega_1^local_k)*0.1214054057357627;
+Q_RELAX.test_2[2][34]:=t*Min(1000,RELAX.test.omega_1^local_k)*0.3053650319994416;
+Q_RELAX.test_2[3][0]:=AT*t*Min(1000,RELAX.test.omega_1^local_k)*0.3824103826488193;
+Q_RELAX.test_2[3][1]:=CT*t*0.1264560133035801;
+Q_RELAX.test_2[3][2]:=GT*t*Min(1000,RELAX.test.omega_1^local_k)*0.2406378906553946;
+Q_RELAX.test_2[3][7]:=AC*t*Min(1000,RELAX.test.omega_1^local_k)*0.1351200521140052;
+Q_RELAX.test_2[3][11]:=t*Min(1000,RELAX.test.omega_1^local_k)*0.1344351325741675;
+Q_RELAX.test_2[3][15]:=AT*t*Min(1000,RELAX.test.omega_1^local_k)*0.2296926126195792;
+Q_RELAX.test_2[3][19]:=AC*t*Min(1000,RELAX.test.omega_1^local_k)*0.1214054057357627;
+Q_RELAX.test_2[3][35]:=t*Min(1000,RELAX.test.omega_1^local_k)*0.3053650319994416;
+Q_RELAX.test_2[3][49]:=AT*t*Min(1000,RELAX.test.omega_1^local_k)*0.250994522453953;
+Q_RELAX.test_2[4][0]:=AC*t*Min(1000,RELAX.test.omega_1^local_k)*0.5007522026922482;
+Q_RELAX.test_2[4][5]:=AC*t*0.1264560133035801;
+Q_RELAX.test_2[4][6]:=t*0.2406378906553946;
+Q_RELAX.test_2[4][7]:=AT*t*0.2504957133922061;
+Q_RELAX.test_2[4][8]:=CG*t*Min(1000,RELAX.test.omega_1^local_k)*0.1344351325741675;
+Q_RELAX.test_2[4][12]:=CT*t*Min(1000,RELAX.test.omega_1^local_k)*0.2296926126195792;
+Q_RELAX.test_2[4][20]:=AC*t*Min(1000,RELAX.test.omega_1^local_k)*0.1214054057357627;
+Q_RELAX.test_2[4][36]:=t*Min(1000,RELAX.test.omega_1^local_k)*0.3053650319994416;
+Q_RELAX.test_2[4][50]:=AT*t*Min(1000,RELAX.test.omega_1^local_k)*0.250994522453953;
+Q_RELAX.test_2[5][1]:=AC*t*Min(1000,RELAX.test.omega_1^local_k)*0.5007522026922482;
+Q_RELAX.test_2[5][4]:=AC*t*0.3824103826488193;
+Q_RELAX.test_2[5][6]:=CG*t*0.2406378906553946;
+Q_RELAX.test_2[5][7]:=CT*t*0.2504957133922061;
+Q_RELAX.test_2[5][9]:=CG*t*Min(1000,RELAX.test.omega_1^local_k)*0.1344351325741675;
+Q_RELAX.test_2[5][13]:=CT*t*Min(1000,RELAX.test.omega_1^local_k)*0.2296926126195792;
+Q_RELAX.test_2[5][21]:=AC*t*Min(1000,RELAX.test.omega_1^local_k)*0.1214054057357627;
+Q_RELAX.test_2[5][37]:=t*Min(1000,RELAX.test.omega_1^local_k)*0.3053650319994416;
+Q_RELAX.test_2[5][51]:=AT*t*Min(1000,RELAX.test.omega_1^local_k)*0.250994522453953;
+Q_RELAX.test_2[6][2]:=AC*t*Min(1000,RELAX.test.omega_1^local_k)*0.5007522026922482;
+Q_RELAX.test_2[6][4]:=t*0.3824103826488193;
+Q_RELAX.test_2[6][5]:=CG*t*0.1264560133035801;
+Q_RELAX.test_2[6][7]:=GT*t*0.2504957133922061;
+Q_RELAX.test_2[6][10]:=CG*t*Min(1000,RELAX.test.omega_1^local_k)*0.1344351325741675;
+Q_RELAX.test_2[6][14]:=CT*t*Min(1000,RELAX.test.omega_1^local_k)*0.2296926126195792;
+Q_RELAX.test_2[6][22]:=AC*t*Min(1000,RELAX.test.omega_1^local_k)*0.1214054057357627;
+Q_RELAX.test_2[6][38]:=t*Min(1000,RELAX.test.omega_1^local_k)*0.3053650319994416;
+Q_RELAX.test_2[6][52]:=AT*t*Min(1000,RELAX.test.omega_1^local_k)*0.250994522453953;
+Q_RELAX.test_2[7][3]:=AC*t*Min(1000,RELAX.test.omega_1^local_k)*0.5007522026922482;
+Q_RELAX.test_2[7][4]:=AT*t*0.3824103826488193;
+Q_RELAX.test_2[7][5]:=CT*t*0.1264560133035801;
+Q_RELAX.test_2[7][6]:=GT*t*0.2406378906553946;
+Q_RELAX.test_2[7][11]:=CG*t*Min(1000,RELAX.test.omega_1^local_k)*0.1344351325741675;
+Q_RELAX.test_2[7][15]:=CT*t*Min(1000,RELAX.test.omega_1^local_k)*0.2296926126195792;
+Q_RELAX.test_2[7][23]:=AC*t*Min(1000,RELAX.test.omega_1^local_k)*0.1214054057357627;
+Q_RELAX.test_2[7][39]:=t*Min(1000,RELAX.test.omega_1^local_k)*0.3053650319994416;
+Q_RELAX.test_2[7][53]:=AT*t*Min(1000,RELAX.test.omega_1^local_k)*0.250994522453953;
+Q_RELAX.test_2[8][0]:=t*Min(1000,RELAX.test.omega_1^local_k)*0.5007522026922482;
+Q_RELAX.test_2[8][4]:=CG*t*Min(1000,RELAX.test.omega_1^local_k)*0.1351200521140052;
+Q_RELAX.test_2[8][9]:=AC*t*Min(1000,RELAX.test.omega_1^local_k)*0.1264560133035801;
+Q_RELAX.test_2[8][10]:=t*0.2406378906553946;
+Q_RELAX.test_2[8][11]:=AT*t*Min(1000,RELAX.test.omega_1^local_k)*0.2504957133922061;
+Q_RELAX.test_2[8][12]:=GT*t*Min(1000,RELAX.test.omega_1^local_k)*0.2296926126195792;
+Q_RELAX.test_2[8][24]:=AC*t*0.1214054057357627;
+Q_RELAX.test_2[8][40]:=t*Min(1000,RELAX.test.omega_1^local_k)*0.3053650319994416;
+Q_RELAX.test_2[9][1]:=t*Min(1000,RELAX.test.omega_1^local_k)*0.5007522026922482;
+Q_RELAX.test_2[9][5]:=CG*t*Min(1000,RELAX.test.omega_1^local_k)*0.1351200521140052;
+Q_RELAX.test_2[9][8]:=AC*t*Min(1000,RELAX.test.omega_1^local_k)*0.3824103826488193;
+Q_RELAX.test_2[9][10]:=CG*t*Min(1000,RELAX.test.omega_1^local_k)*0.2406378906553946;
+Q_RELAX.test_2[9][11]:=CT*t*0.2504957133922061;
+Q_RELAX.test_2[9][13]:=GT*t*Min(1000,RELAX.test.omega_1^local_k)*0.2296926126195792;
+Q_RELAX.test_2[9][25]:=AC*t*Min(1000,RELAX.test.omega_1^local_k)*0.1214054057357627;
+Q_RELAX.test_2[9][41]:=t*Min(1000,RELAX.test.omega_1^local_k)*0.3053650319994416;
+Q_RELAX.test_2[9][54]:=AT*t*Min(1000,RELAX.test.omega_1^local_k)*0.250994522453953;
+Q_RELAX.test_2[10][2]:=t*Min(1000,RELAX.test.omega_1^local_k)*0.5007522026922482;
+Q_RELAX.test_2[10][6]:=CG*t*Min(1000,RELAX.test.omega_1^local_k)*0.1351200521140052;
+Q_RELAX.test_2[10][8]:=t*0.3824103826488193;
+Q_RELAX.test_2[10][9]:=CG*t*Min(1000,RELAX.test.omega_1^local_k)*0.1264560133035801;
+Q_RELAX.test_2[10][11]:=GT*t*Min(1000,RELAX.test.omega_1^local_k)*0.2504957133922061;
+Q_RELAX.test_2[10][14]:=GT*t*Min(1000,RELAX.test.omega_1^local_k)*0.2296926126195792;
+Q_RELAX.test_2[10][26]:=AC*t*0.1214054057357627;
+Q_RELAX.test_2[10][42]:=t*Min(1000,RELAX.test.omega_1^local_k)*0.3053650319994416;
+Q_RELAX.test_2[10][55]:=AT*t*Min(1000,RELAX.test.omega_1^local_k)*0.250994522453953;
+Q_RELAX.test_2[11][3]:=t*Min(1000,RELAX.test.omega_1^local_k)*0.5007522026922482;
+Q_RELAX.test_2[11][7]:=CG*t*Min(1000,RELAX.test.omega_1^local_k)*0.1351200521140052;
+Q_RELAX.test_2[11][8]:=AT*t*Min(1000,RELAX.test.omega_1^local_k)*0.3824103826488193;
+Q_RELAX.test_2[11][9]:=CT*t*0.1264560133035801;
+Q_RELAX.test_2[11][10]:=GT*t*Min(1000,RELAX.test.omega_1^local_k)*0.2406378906553946;
+Q_RELAX.test_2[11][15]:=GT*t*Min(1000,RELAX.test.omega_1^local_k)*0.2296926126195792;
+Q_RELAX.test_2[11][27]:=AC*t*Min(1000,RELAX.test.omega_1^local_k)*0.1214054057357627;
+Q_RELAX.test_2[11][43]:=t*Min(1000,RELAX.test.omega_1^local_k)*0.3053650319994416;
+Q_RELAX.test_2[11][56]:=AT*t*Min(1000,RELAX.test.omega_1^local_k)*0.250994522453953;
+Q_RELAX.test_2[12][0]:=AT*t*Min(1000,RELAX.test.omega_1^local_k)*0.5007522026922482;
+Q_RELAX.test_2[12][4]:=CT*t*Min(1000,RELAX.test.omega_1^local_k)*0.1351200521140052;
+Q_RELAX.test_2[12][8]:=GT*t*Min(1000,RELAX.test.omega_1^local_k)*0.1344351325741675;
+Q_RELAX.test_2[12][13]:=AC*t*0.1264560133035801;
+Q_RELAX.test_2[12][14]:=t*Min(1000,RELAX.test.omega_1^local_k)*0.2406378906553946;
+Q_RELAX.test_2[12][15]:=AT*t*0.2504957133922061;
+Q_RELAX.test_2[12][28]:=AC*t*Min(1000,RELAX.test.omega_1^local_k)*0.1214054057357627;
+Q_RELAX.test_2[12][44]:=t*Min(1000,RELAX.test.omega_1^local_k)*0.3053650319994416;
+Q_RELAX.test_2[12][57]:=AT*t*Min(1000,RELAX.test.omega_1^local_k)*0.250994522453953;
+Q_RELAX.test_2[13][1]:=AT*t*Min(1000,RELAX.test.omega_1^local_k)*0.5007522026922482;
+Q_RELAX.test_2[13][5]:=CT*t*Min(1000,RELAX.test.omega_1^local_k)*0.1351200521140052;
+Q_RELAX.test_2[13][9]:=GT*t*Min(1000,RELAX.test.omega_1^local_k)*0.1344351325741675;
+Q_RELAX.test_2[13][12]:=AC*t*0.3824103826488193;
+Q_RELAX.test_2[13][14]:=CG*t*Min(1000,RELAX.test.omega_1^local_k)*0.2406378906553946;
+Q_RELAX.test_2[13][15]:=CT*t*0.2504957133922061;
+Q_RELAX.test_2[13][29]:=AC*t*Min(1000,RELAX.test.omega_1^local_k)*0.1214054057357627;
+Q_RELAX.test_2[13][45]:=t*Min(1000,RELAX.test.omega_1^local_k)*0.3053650319994416;
+Q_RELAX.test_2[13][58]:=AT*t*Min(1000,RELAX.test.omega_1^local_k)*0.250994522453953;
+Q_RELAX.test_2[14][2]:=AT*t*Min(1000,RELAX.test.omega_1^local_k)*0.5007522026922482;
+Q_RELAX.test_2[14][6]:=CT*t*Min(1000,RELAX.test.omega_1^local_k)*0.1351200521140052;
+Q_RELAX.test_2[14][10]:=GT*t*Min(1000,RELAX.test.omega_1^local_k)*0.1344351325741675;
+Q_RELAX.test_2[14][12]:=t*Min(1000,RELAX.test.omega_1^local_k)*0.3824103826488193;
+Q_RELAX.test_2[14][13]:=CG*t*Min(1000,RELAX.test.omega_1^local_k)*0.1264560133035801;
+Q_RELAX.test_2[14][15]:=GT*t*Min(1000,RELAX.test.omega_1^local_k)*0.2504957133922061;
+Q_RELAX.test_2[14][30]:=AC*t*Min(1000,RELAX.test.omega_1^local_k)*0.1214054057357627;
+Q_RELAX.test_2[14][46]:=t*Min(1000,RELAX.test.omega_1^local_k)*0.3053650319994416;
+Q_RELAX.test_2[14][59]:=AT*t*Min(1000,RELAX.test.omega_1^local_k)*0.250994522453953;
+Q_RELAX.test_2[15][3]:=AT*t*Min(1000,RELAX.test.omega_1^local_k)*0.5007522026922482;
+Q_RELAX.test_2[15][7]:=CT*t*Min(1000,RELAX.test.omega_1^local_k)*0.1351200521140052;
+Q_RELAX.test_2[15][11]:=GT*t*Min(1000,RELAX.test.omega_1^local_k)*0.1344351325741675;
+Q_RELAX.test_2[15][12]:=AT*t*0.3824103826488193;
+Q_RELAX.test_2[15][13]:=CT*t*0.1264560133035801;
+Q_RELAX.test_2[15][14]:=GT*t*Min(1000,RELAX.test.omega_1^local_k)*0.2406378906553946;
+Q_RELAX.test_2[15][31]:=AC*t*Min(1000,RELAX.test.omega_1^local_k)*0.1214054057357627;
+Q_RELAX.test_2[15][47]:=t*Min(1000,RELAX.test.omega_1^local_k)*0.3053650319994416;
+Q_RELAX.test_2[15][60]:=AT*t*Min(1000,RELAX.test.omega_1^local_k)*0.250994522453953;
+Q_RELAX.test_2[16][0]:=AC*t*Min(1000,RELAX.test.omega_1^local_k)*0.3222350398108426;
+Q_RELAX.test_2[16][17]:=AC*t*Min(1000,RELAX.test.omega_1^local_k)*0.1264560133035801;
+Q_RELAX.test_2[16][18]:=t*0.2406378906553946;
+Q_RELAX.test_2[16][19]:=AT*t*Min(1000,RELAX.test.omega_1^local_k)*0.2504957133922061;
+Q_RELAX.test_2[16][20]:=AC*t*Min(1000,RELAX.test.omega_1^local_k)*0.1351200521140052;
+Q_RELAX.test_2[16][24]:=t*Min(1000,RELAX.test.omega_1^local_k)*0.1344351325741675;
+Q_RELAX.test_2[16][28]:=AT*t*Min(1000,RELAX.test.omega_1^local_k)*0.2296926126195792;
+Q_RELAX.test_2[16][32]:=CG*t*Min(1000,RELAX.test.omega_1^local_k)*0.3053650319994416;
+Q_RELAX.test_2[17][1]:=AC*t*Min(1000,RELAX.test.omega_1^local_k)*0.3222350398108426;
+Q_RELAX.test_2[17][16]:=AC*t*Min(1000,RELAX.test.omega_1^local_k)*0.3824103826488193;
+Q_RELAX.test_2[17][18]:=CG*t*Min(1000,RELAX.test.omega_1^local_k)*0.2406378906553946;
+Q_RELAX.test_2[17][19]:=CT*t*0.2504957133922061;
+Q_RELAX.test_2[17][21]:=AC*t*Min(1000,RELAX.test.omega_1^local_k)*0.1351200521140052;
+Q_RELAX.test_2[17][25]:=t*Min(1000,RELAX.test.omega_1^local_k)*0.1344351325741675;
+Q_RELAX.test_2[17][29]:=AT*t*Min(1000,RELAX.test.omega_1^local_k)*0.2296926126195792;
+Q_RELAX.test_2[17][33]:=CG*t*Min(1000,RELAX.test.omega_1^local_k)*0.3053650319994416;
+Q_RELAX.test_2[17][48]:=CT*t*Min(1000,RELAX.test.omega_1^local_k)*0.250994522453953;
+Q_RELAX.test_2[18][2]:=AC*t*Min(1000,RELAX.test.omega_1^local_k)*0.3222350398108426;
+Q_RELAX.test_2[18][16]:=t*0.3824103826488193;
+Q_RELAX.test_2[18][17]:=CG*t*Min(1000,RELAX.test.omega_1^local_k)*0.1264560133035801;
+Q_RELAX.test_2[18][19]:=GT*t*Min(1000,RELAX.test.omega_1^local_k)*0.2504957133922061;
+Q_RELAX.test_2[18][22]:=AC*t*Min(1000,RELAX.test.omega_1^local_k)*0.1351200521140052;
+Q_RELAX.test_2[18][26]:=t*Min(1000,RELAX.test.omega_1^local_k)*0.1344351325741675;
+Q_RELAX.test_2[18][30]:=AT*t*Min(1000,RELAX.test.omega_1^local_k)*0.2296926126195792;
+Q_RELAX.test_2[18][34]:=CG*t*Min(1000,RELAX.test.omega_1^local_k)*0.3053650319994416;
+Q_RELAX.test_2[19][3]:=AC*t*Min(1000,RELAX.test.omega_1^local_k)*0.3222350398108426;
+Q_RELAX.test_2[19][16]:=AT*t*Min(1000,RELAX.test.omega_1^local_k)*0.3824103826488193;
+Q_RELAX.test_2[19][17]:=CT*t*0.1264560133035801;
+Q_RELAX.test_2[19][18]:=GT*t*Min(1000,RELAX.test.omega_1^local_k)*0.2406378906553946;
+Q_RELAX.test_2[19][23]:=AC*t*Min(1000,RELAX.test.omega_1^local_k)*0.1351200521140052;
+Q_RELAX.test_2[19][27]:=t*Min(1000,RELAX.test.omega_1^local_k)*0.1344351325741675;
+Q_RELAX.test_2[19][31]:=AT*t*Min(1000,RELAX.test.omega_1^local_k)*0.2296926126195792;
+Q_RELAX.test_2[19][35]:=CG*t*Min(1000,RELAX.test.omega_1^local_k)*0.3053650319994416;
+Q_RELAX.test_2[19][49]:=CT*t*Min(1000,RELAX.test.omega_1^local_k)*0.250994522453953;
+Q_RELAX.test_2[20][4]:=AC*t*Min(1000,RELAX.test.omega_1^local_k)*0.3222350398108426;
+Q_RELAX.test_2[20][16]:=AC*t*Min(1000,RELAX.test.omega_1^local_k)*0.5007522026922482;
+Q_RELAX.test_2[20][21]:=AC*t*0.1264560133035801;
+Q_RELAX.test_2[20][22]:=t*0.2406378906553946;
+Q_RELAX.test_2[20][23]:=AT*t*0.2504957133922061;
+Q_RELAX.test_2[20][24]:=CG*t*Min(1000,RELAX.test.omega_1^local_k)*0.1344351325741675;
+Q_RELAX.test_2[20][28]:=CT*t*Min(1000,RELAX.test.omega_1^local_k)*0.2296926126195792;
+Q_RELAX.test_2[20][36]:=CG*t*Min(1000,RELAX.test.omega_1^local_k)*0.3053650319994416;
+Q_RELAX.test_2[20][50]:=CT*t*Min(1000,RELAX.test.omega_1^local_k)*0.250994522453953;
+Q_RELAX.test_2[21][5]:=AC*t*Min(1000,RELAX.test.omega_1^local_k)*0.3222350398108426;
+Q_RELAX.test_2[21][17]:=AC*t*Min(1000,RELAX.test.omega_1^local_k)*0.5007522026922482;
+Q_RELAX.test_2[21][20]:=AC*t*0.3824103826488193;
+Q_RELAX.test_2[21][22]:=CG*t*0.2406378906553946;
+Q_RELAX.test_2[21][23]:=CT*t*0.2504957133922061;
+Q_RELAX.test_2[21][25]:=CG*t*Min(1000,RELAX.test.omega_1^local_k)*0.1344351325741675;
+Q_RELAX.test_2[21][29]:=CT*t*Min(1000,RELAX.test.omega_1^local_k)*0.2296926126195792;
+Q_RELAX.test_2[21][37]:=CG*t*Min(1000,RELAX.test.omega_1^local_k)*0.3053650319994416;
+Q_RELAX.test_2[21][51]:=CT*t*Min(1000,RELAX.test.omega_1^local_k)*0.250994522453953;
+Q_RELAX.test_2[22][6]:=AC*t*Min(1000,RELAX.test.omega_1^local_k)*0.3222350398108426;
+Q_RELAX.test_2[22][18]:=AC*t*Min(1000,RELAX.test.omega_1^local_k)*0.5007522026922482;
+Q_RELAX.test_2[22][20]:=t*0.3824103826488193;
+Q_RELAX.test_2[22][21]:=CG*t*0.1264560133035801;
+Q_RELAX.test_2[22][23]:=GT*t*0.2504957133922061;
+Q_RELAX.test_2[22][26]:=CG*t*Min(1000,RELAX.test.omega_1^local_k)*0.1344351325741675;
+Q_RELAX.test_2[22][30]:=CT*t*Min(1000,RELAX.test.omega_1^local_k)*0.2296926126195792;
+Q_RELAX.test_2[22][38]:=CG*t*Min(1000,RELAX.test.omega_1^local_k)*0.3053650319994416;
+Q_RELAX.test_2[22][52]:=CT*t*Min(1000,RELAX.test.omega_1^local_k)*0.250994522453953;
+Q_RELAX.test_2[23][7]:=AC*t*Min(1000,RELAX.test.omega_1^local_k)*0.3222350398108426;
+Q_RELAX.test_2[23][19]:=AC*t*Min(1000,RELAX.test.omega_1^local_k)*0.5007522026922482;
+Q_RELAX.test_2[23][20]:=AT*t*0.3824103826488193;
+Q_RELAX.test_2[23][21]:=CT*t*0.1264560133035801;
+Q_RELAX.test_2[23][22]:=GT*t*0.2406378906553946;
+Q_RELAX.test_2[23][27]:=CG*t*Min(1000,RELAX.test.omega_1^local_k)*0.1344351325741675;
+Q_RELAX.test_2[23][31]:=CT*t*Min(1000,RELAX.test.omega_1^local_k)*0.2296926126195792;
+Q_RELAX.test_2[23][39]:=CG*t*Min(1000,RELAX.test.omega_1^local_k)*0.3053650319994416;
+Q_RELAX.test_2[23][53]:=CT*t*Min(1000,RELAX.test.omega_1^local_k)*0.250994522453953;
+Q_RELAX.test_2[24][8]:=AC*t*0.3222350398108426;
+Q_RELAX.test_2[24][16]:=t*Min(1000,RELAX.test.omega_1^local_k)*0.5007522026922482;
+Q_RELAX.test_2[24][20]:=CG*t*Min(1000,RELAX.test.omega_1^local_k)*0.1351200521140052;
+Q_RELAX.test_2[24][25]:=AC*t*0.1264560133035801;
+Q_RELAX.test_2[24][26]:=t*0.2406378906553946;
+Q_RELAX.test_2[24][27]:=AT*t*0.2504957133922061;
+Q_RELAX.test_2[24][28]:=GT*t*Min(1000,RELAX.test.omega_1^local_k)*0.2296926126195792;
+Q_RELAX.test_2[24][40]:=CG*t*Min(1000,RELAX.test.omega_1^local_k)*0.3053650319994416;
+Q_RELAX.test_2[25][9]:=AC*t*Min(1000,RELAX.test.omega_1^local_k)*0.3222350398108426;
+Q_RELAX.test_2[25][17]:=t*Min(1000,RELAX.test.omega_1^local_k)*0.5007522026922482;
+Q_RELAX.test_2[25][21]:=CG*t*Min(1000,RELAX.test.omega_1^local_k)*0.1351200521140052;
+Q_RELAX.test_2[25][24]:=AC*t*0.3824103826488193;
+Q_RELAX.test_2[25][26]:=CG*t*0.2406378906553946;
+Q_RELAX.test_2[25][27]:=CT*t*0.2504957133922061;
+Q_RELAX.test_2[25][29]:=GT*t*Min(1000,RELAX.test.omega_1^local_k)*0.2296926126195792;
+Q_RELAX.test_2[25][41]:=CG*t*Min(1000,RELAX.test.omega_1^local_k)*0.3053650319994416;
+Q_RELAX.test_2[25][54]:=CT*t*Min(1000,RELAX.test.omega_1^local_k)*0.250994522453953;
+Q_RELAX.test_2[26][10]:=AC*t*0.3222350398108426;
+Q_RELAX.test_2[26][18]:=t*Min(1000,RELAX.test.omega_1^local_k)*0.5007522026922482;
+Q_RELAX.test_2[26][22]:=CG*t*Min(1000,RELAX.test.omega_1^local_k)*0.1351200521140052;
+Q_RELAX.test_2[26][24]:=t*0.3824103826488193;
+Q_RELAX.test_2[26][25]:=CG*t*0.1264560133035801;
+Q_RELAX.test_2[26][27]:=GT*t*0.2504957133922061;
+Q_RELAX.test_2[26][30]:=GT*t*Min(1000,RELAX.test.omega_1^local_k)*0.2296926126195792;
+Q_RELAX.test_2[26][42]:=CG*t*Min(1000,RELAX.test.omega_1^local_k)*0.3053650319994416;
+Q_RELAX.test_2[26][55]:=CT*t*Min(1000,RELAX.test.omega_1^local_k)*0.250994522453953;
+Q_RELAX.test_2[27][11]:=AC*t*Min(1000,RELAX.test.omega_1^local_k)*0.3222350398108426;
+Q_RELAX.test_2[27][19]:=t*Min(1000,RELAX.test.omega_1^local_k)*0.5007522026922482;
+Q_RELAX.test_2[27][23]:=CG*t*Min(1000,RELAX.test.omega_1^local_k)*0.1351200521140052;
+Q_RELAX.test_2[27][24]:=AT*t*0.3824103826488193;
+Q_RELAX.test_2[27][25]:=CT*t*0.1264560133035801;
+Q_RELAX.test_2[27][26]:=GT*t*0.2406378906553946;
+Q_RELAX.test_2[27][31]:=GT*t*Min(1000,RELAX.test.omega_1^local_k)*0.2296926126195792;
+Q_RELAX.test_2[27][43]:=CG*t*Min(1000,RELAX.test.omega_1^local_k)*0.3053650319994416;
+Q_RELAX.test_2[27][56]:=CT*t*Min(1000,RELAX.test.omega_1^local_k)*0.250994522453953;
+Q_RELAX.test_2[28][12]:=AC*t*Min(1000,RELAX.test.omega_1^local_k)*0.3222350398108426;
+Q_RELAX.test_2[28][16]:=AT*t*Min(1000,RELAX.test.omega_1^local_k)*0.5007522026922482;
+Q_RELAX.test_2[28][20]:=CT*t*Min(1000,RELAX.test.omega_1^local_k)*0.1351200521140052;
+Q_RELAX.test_2[28][24]:=GT*t*Min(1000,RELAX.test.omega_1^local_k)*0.1344351325741675;
+Q_RELAX.test_2[28][29]:=AC*t*0.1264560133035801;
+Q_RELAX.test_2[28][30]:=t*0.2406378906553946;
+Q_RELAX.test_2[28][31]:=AT*t*0.2504957133922061;
+Q_RELAX.test_2[28][44]:=CG*t*Min(1000,RELAX.test.omega_1^local_k)*0.3053650319994416;
+Q_RELAX.test_2[28][57]:=CT*t*0.250994522453953;
+Q_RELAX.test_2[29][13]:=AC*t*Min(1000,RELAX.test.omega_1^local_k)*0.3222350398108426;
+Q_RELAX.test_2[29][17]:=AT*t*Min(1000,RELAX.test.omega_1^local_k)*0.5007522026922482;
+Q_RELAX.test_2[29][21]:=CT*t*Min(1000,RELAX.test.omega_1^local_k)*0.1351200521140052;
+Q_RELAX.test_2[29][25]:=GT*t*Min(1000,RELAX.test.omega_1^local_k)*0.1344351325741675;
+Q_RELAX.test_2[29][28]:=AC*t*0.3824103826488193;
+Q_RELAX.test_2[29][30]:=CG*t*0.2406378906553946;
+Q_RELAX.test_2[29][31]:=CT*t*0.2504957133922061;
+Q_RELAX.test_2[29][45]:=CG*t*Min(1000,RELAX.test.omega_1^local_k)*0.3053650319994416;
+Q_RELAX.test_2[29][58]:=CT*t*Min(1000,RELAX.test.omega_1^local_k)*0.250994522453953;
+Q_RELAX.test_2[30][14]:=AC*t*Min(1000,RELAX.test.omega_1^local_k)*0.3222350398108426;
+Q_RELAX.test_2[30][18]:=AT*t*Min(1000,RELAX.test.omega_1^local_k)*0.5007522026922482;
+Q_RELAX.test_2[30][22]:=CT*t*Min(1000,RELAX.test.omega_1^local_k)*0.1351200521140052;
+Q_RELAX.test_2[30][26]:=GT*t*Min(1000,RELAX.test.omega_1^local_k)*0.1344351325741675;
+Q_RELAX.test_2[30][28]:=t*0.3824103826488193;
+Q_RELAX.test_2[30][29]:=CG*t*0.1264560133035801;
+Q_RELAX.test_2[30][31]:=GT*t*0.2504957133922061;
+Q_RELAX.test_2[30][46]:=CG*t*Min(1000,RELAX.test.omega_1^local_k)*0.3053650319994416;
+Q_RELAX.test_2[30][59]:=CT*t*0.250994522453953;
+Q_RELAX.test_2[31][15]:=AC*t*Min(1000,RELAX.test.omega_1^local_k)*0.3222350398108426;
+Q_RELAX.test_2[31][19]:=AT*t*Min(1000,RELAX.test.omega_1^local_k)*0.5007522026922482;
+Q_RELAX.test_2[31][23]:=CT*t*Min(1000,RELAX.test.omega_1^local_k)*0.1351200521140052;
+Q_RELAX.test_2[31][27]:=GT*t*Min(1000,RELAX.test.omega_1^local_k)*0.1344351325741675;
+Q_RELAX.test_2[31][28]:=AT*t*0.3824103826488193;
+Q_RELAX.test_2[31][29]:=CT*t*0.1264560133035801;
+Q_RELAX.test_2[31][30]:=GT*t*0.2406378906553946;
+Q_RELAX.test_2[31][47]:=CG*t*Min(1000,RELAX.test.omega_1^local_k)*0.3053650319994416;
+Q_RELAX.test_2[31][60]:=CT*t*Min(1000,RELAX.test.omega_1^local_k)*0.250994522453953;
+Q_RELAX.test_2[32][0]:=t*Min(1000,RELAX.test.omega_1^local_k)*0.3222350398108426;
+Q_RELAX.test_2[32][16]:=CG*t*Min(1000,RELAX.test.omega_1^local_k)*0.1214054057357627;
+Q_RELAX.test_2[32][33]:=AC*t*Min(1000,RELAX.test.omega_1^local_k)*0.1264560133035801;
+Q_RELAX.test_2[32][34]:=t*0.2406378906553946;
+Q_RELAX.test_2[32][35]:=AT*t*Min(1000,RELAX.test.omega_1^local_k)*0.2504957133922061;
+Q_RELAX.test_2[32][36]:=AC*t*Min(1000,RELAX.test.omega_1^local_k)*0.1351200521140052;
+Q_RELAX.test_2[32][40]:=t*Min(1000,RELAX.test.omega_1^local_k)*0.1344351325741675;
+Q_RELAX.test_2[32][44]:=AT*t*Min(1000,RELAX.test.omega_1^local_k)*0.2296926126195792;
+Q_RELAX.test_2[33][1]:=t*Min(1000,RELAX.test.omega_1^local_k)*0.3222350398108426;
+Q_RELAX.test_2[33][17]:=CG*t*Min(1000,RELAX.test.omega_1^local_k)*0.1214054057357627;
+Q_RELAX.test_2[33][32]:=AC*t*Min(1000,RELAX.test.omega_1^local_k)*0.3824103826488193;
+Q_RELAX.test_2[33][34]:=CG*t*Min(1000,RELAX.test.omega_1^local_k)*0.2406378906553946;
+Q_RELAX.test_2[33][35]:=CT*t*0.2504957133922061;
+Q_RELAX.test_2[33][37]:=AC*t*Min(1000,RELAX.test.omega_1^local_k)*0.1351200521140052;
+Q_RELAX.test_2[33][41]:=t*Min(1000,RELAX.test.omega_1^local_k)*0.1344351325741675;
+Q_RELAX.test_2[33][45]:=AT*t*Min(1000,RELAX.test.omega_1^local_k)*0.2296926126195792;
+Q_RELAX.test_2[33][48]:=GT*t*Min(1000,RELAX.test.omega_1^local_k)*0.250994522453953;
+Q_RELAX.test_2[34][2]:=t*Min(1000,RELAX.test.omega_1^local_k)*0.3222350398108426;
+Q_RELAX.test_2[34][18]:=CG*t*Min(1000,RELAX.test.omega_1^local_k)*0.1214054057357627;
+Q_RELAX.test_2[34][32]:=t*0.3824103826488193;
+Q_RELAX.test_2[34][33]:=CG*t*Min(1000,RELAX.test.omega_1^local_k)*0.1264560133035801;
+Q_RELAX.test_2[34][35]:=GT*t*Min(1000,RELAX.test.omega_1^local_k)*0.2504957133922061;
+Q_RELAX.test_2[34][38]:=AC*t*Min(1000,RELAX.test.omega_1^local_k)*0.1351200521140052;
+Q_RELAX.test_2[34][42]:=t*Min(1000,RELAX.test.omega_1^local_k)*0.1344351325741675;
+Q_RELAX.test_2[34][46]:=AT*t*Min(1000,RELAX.test.omega_1^local_k)*0.2296926126195792;
+Q_RELAX.test_2[35][3]:=t*Min(1000,RELAX.test.omega_1^local_k)*0.3222350398108426;
+Q_RELAX.test_2[35][19]:=CG*t*Min(1000,RELAX.test.omega_1^local_k)*0.1214054057357627;
+Q_RELAX.test_2[35][32]:=AT*t*Min(1000,RELAX.test.omega_1^local_k)*0.3824103826488193;
+Q_RELAX.test_2[35][33]:=CT*t*0.1264560133035801;
+Q_RELAX.test_2[35][34]:=GT*t*Min(1000,RELAX.test.omega_1^local_k)*0.2406378906553946;
+Q_RELAX.test_2[35][39]:=AC*t*Min(1000,RELAX.test.omega_1^local_k)*0.1351200521140052;
+Q_RELAX.test_2[35][43]:=t*Min(1000,RELAX.test.omega_1^local_k)*0.1344351325741675;
+Q_RELAX.test_2[35][47]:=AT*t*Min(1000,RELAX.test.omega_1^local_k)*0.2296926126195792;
+Q_RELAX.test_2[35][49]:=GT*t*Min(1000,RELAX.test.omega_1^local_k)*0.250994522453953;
+Q_RELAX.test_2[36][4]:=t*Min(1000,RELAX.test.omega_1^local_k)*0.3222350398108426;
+Q_RELAX.test_2[36][20]:=CG*t*Min(1000,RELAX.test.omega_1^local_k)*0.1214054057357627;
+Q_RELAX.test_2[36][32]:=AC*t*Min(1000,RELAX.test.omega_1^local_k)*0.5007522026922482;
+Q_RELAX.test_2[36][37]:=AC*t*0.1264560133035801;
+Q_RELAX.test_2[36][38]:=t*0.2406378906553946;
+Q_RELAX.test_2[36][39]:=AT*t*0.2504957133922061;
+Q_RELAX.test_2[36][40]:=CG*t*Min(1000,RELAX.test.omega_1^local_k)*0.1344351325741675;
+Q_RELAX.test_2[36][44]:=CT*t*Min(1000,RELAX.test.omega_1^local_k)*0.2296926126195792;
+Q_RELAX.test_2[36][50]:=GT*t*Min(1000,RELAX.test.omega_1^local_k)*0.250994522453953;
+Q_RELAX.test_2[37][5]:=t*Min(1000,RELAX.test.omega_1^local_k)*0.3222350398108426;
+Q_RELAX.test_2[37][21]:=CG*t*Min(1000,RELAX.test.omega_1^local_k)*0.1214054057357627;
+Q_RELAX.test_2[37][33]:=AC*t*Min(1000,RELAX.test.omega_1^local_k)*0.5007522026922482;
+Q_RELAX.test_2[37][36]:=AC*t*0.3824103826488193;
+Q_RELAX.test_2[37][38]:=CG*t*0.2406378906553946;
+Q_RELAX.test_2[37][39]:=CT*t*0.2504957133922061;
+Q_RELAX.test_2[37][41]:=CG*t*Min(1000,RELAX.test.omega_1^local_k)*0.1344351325741675;
+Q_RELAX.test_2[37][45]:=CT*t*Min(1000,RELAX.test.omega_1^local_k)*0.2296926126195792;
+Q_RELAX.test_2[37][51]:=GT*t*Min(1000,RELAX.test.omega_1^local_k)*0.250994522453953;
+Q_RELAX.test_2[38][6]:=t*Min(1000,RELAX.test.omega_1^local_k)*0.3222350398108426;
+Q_RELAX.test_2[38][22]:=CG*t*Min(1000,RELAX.test.omega_1^local_k)*0.1214054057357627;
+Q_RELAX.test_2[38][34]:=AC*t*Min(1000,RELAX.test.omega_1^local_k)*0.5007522026922482;
+Q_RELAX.test_2[38][36]:=t*0.3824103826488193;
+Q_RELAX.test_2[38][37]:=CG*t*0.1264560133035801;
+Q_RELAX.test_2[38][39]:=GT*t*0.2504957133922061;
+Q_RELAX.test_2[38][42]:=CG*t*Min(1000,RELAX.test.omega_1^local_k)*0.1344351325741675;
+Q_RELAX.test_2[38][46]:=CT*t*Min(1000,RELAX.test.omega_1^local_k)*0.2296926126195792;
+Q_RELAX.test_2[38][52]:=GT*t*Min(1000,RELAX.test.omega_1^local_k)*0.250994522453953;
+Q_RELAX.test_2[39][7]:=t*Min(1000,RELAX.test.omega_1^local_k)*0.3222350398108426;
+Q_RELAX.test_2[39][23]:=CG*t*Min(1000,RELAX.test.omega_1^local_k)*0.1214054057357627;
+Q_RELAX.test_2[39][35]:=AC*t*Min(1000,RELAX.test.omega_1^local_k)*0.5007522026922482;
+Q_RELAX.test_2[39][36]:=AT*t*0.3824103826488193;
+Q_RELAX.test_2[39][37]:=CT*t*0.1264560133035801;
+Q_RELAX.test_2[39][38]:=GT*t*0.2406378906553946;
+Q_RELAX.test_2[39][43]:=CG*t*Min(1000,RELAX.test.omega_1^local_k)*0.1344351325741675;
+Q_RELAX.test_2[39][47]:=CT*t*Min(1000,RELAX.test.omega_1^local_k)*0.2296926126195792;
+Q_RELAX.test_2[39][53]:=GT*t*Min(1000,RELAX.test.omega_1^local_k)*0.250994522453953;
+Q_RELAX.test_2[40][8]:=t*Min(1000,RELAX.test.omega_1^local_k)*0.3222350398108426;
+Q_RELAX.test_2[40][24]:=CG*t*Min(1000,RELAX.test.omega_1^local_k)*0.1214054057357627;
+Q_RELAX.test_2[40][32]:=t*Min(1000,RELAX.test.omega_1^local_k)*0.5007522026922482;
+Q_RELAX.test_2[40][36]:=CG*t*Min(1000,RELAX.test.omega_1^local_k)*0.1351200521140052;
+Q_RELAX.test_2[40][41]:=AC*t*0.1264560133035801;
+Q_RELAX.test_2[40][42]:=t*0.2406378906553946;
+Q_RELAX.test_2[40][43]:=AT*t*0.2504957133922061;
+Q_RELAX.test_2[40][44]:=GT*t*Min(1000,RELAX.test.omega_1^local_k)*0.2296926126195792;
+Q_RELAX.test_2[41][9]:=t*Min(1000,RELAX.test.omega_1^local_k)*0.3222350398108426;
+Q_RELAX.test_2[41][25]:=CG*t*Min(1000,RELAX.test.omega_1^local_k)*0.1214054057357627;
+Q_RELAX.test_2[41][33]:=t*Min(1000,RELAX.test.omega_1^local_k)*0.5007522026922482;
+Q_RELAX.test_2[41][37]:=CG*t*Min(1000,RELAX.test.omega_1^local_k)*0.1351200521140052;
+Q_RELAX.test_2[41][40]:=AC*t*0.3824103826488193;
+Q_RELAX.test_2[41][42]:=CG*t*0.2406378906553946;
+Q_RELAX.test_2[41][43]:=CT*t*0.2504957133922061;
+Q_RELAX.test_2[41][45]:=GT*t*Min(1000,RELAX.test.omega_1^local_k)*0.2296926126195792;
+Q_RELAX.test_2[41][54]:=GT*t*Min(1000,RELAX.test.omega_1^local_k)*0.250994522453953;
+Q_RELAX.test_2[42][10]:=t*Min(1000,RELAX.test.omega_1^local_k)*0.3222350398108426;
+Q_RELAX.test_2[42][26]:=CG*t*Min(1000,RELAX.test.omega_1^local_k)*0.1214054057357627;
+Q_RELAX.test_2[42][34]:=t*Min(1000,RELAX.test.omega_1^local_k)*0.5007522026922482;
+Q_RELAX.test_2[42][38]:=CG*t*Min(1000,RELAX.test.omega_1^local_k)*0.1351200521140052;
+Q_RELAX.test_2[42][40]:=t*0.3824103826488193;
+Q_RELAX.test_2[42][41]:=CG*t*0.1264560133035801;
+Q_RELAX.test_2[42][43]:=GT*t*0.2504957133922061;
+Q_RELAX.test_2[42][46]:=GT*t*Min(1000,RELAX.test.omega_1^local_k)*0.2296926126195792;
+Q_RELAX.test_2[42][55]:=GT*t*Min(1000,RELAX.test.omega_1^local_k)*0.250994522453953;
+Q_RELAX.test_2[43][11]:=t*Min(1000,RELAX.test.omega_1^local_k)*0.3222350398108426;
+Q_RELAX.test_2[43][27]:=CG*t*Min(1000,RELAX.test.omega_1^local_k)*0.1214054057357627;
+Q_RELAX.test_2[43][35]:=t*Min(1000,RELAX.test.omega_1^local_k)*0.5007522026922482;
+Q_RELAX.test_2[43][39]:=CG*t*Min(1000,RELAX.test.omega_1^local_k)*0.1351200521140052;
+Q_RELAX.test_2[43][40]:=AT*t*0.3824103826488193;
+Q_RELAX.test_2[43][41]:=CT*t*0.1264560133035801;
+Q_RELAX.test_2[43][42]:=GT*t*0.2406378906553946;
+Q_RELAX.test_2[43][47]:=GT*t*Min(1000,RELAX.test.omega_1^local_k)*0.2296926126195792;
+Q_RELAX.test_2[43][56]:=GT*t*Min(1000,RELAX.test.omega_1^local_k)*0.250994522453953;
+Q_RELAX.test_2[44][12]:=t*Min(1000,RELAX.test.omega_1^local_k)*0.3222350398108426;
+Q_RELAX.test_2[44][28]:=CG*t*Min(1000,RELAX.test.omega_1^local_k)*0.1214054057357627;
+Q_RELAX.test_2[44][32]:=AT*t*Min(1000,RELAX.test.omega_1^local_k)*0.5007522026922482;
+Q_RELAX.test_2[44][36]:=CT*t*Min(1000,RELAX.test.omega_1^local_k)*0.1351200521140052;
+Q_RELAX.test_2[44][40]:=GT*t*Min(1000,RELAX.test.omega_1^local_k)*0.1344351325741675;
+Q_RELAX.test_2[44][45]:=AC*t*0.1264560133035801;
+Q_RELAX.test_2[44][46]:=t*0.2406378906553946;
+Q_RELAX.test_2[44][47]:=AT*t*0.2504957133922061;
+Q_RELAX.test_2[44][57]:=GT*t*Min(1000,RELAX.test.omega_1^local_k)*0.250994522453953;
+Q_RELAX.test_2[45][13]:=t*Min(1000,RELAX.test.omega_1^local_k)*0.3222350398108426;
+Q_RELAX.test_2[45][29]:=CG*t*Min(1000,RELAX.test.omega_1^local_k)*0.1214054057357627;
+Q_RELAX.test_2[45][33]:=AT*t*Min(1000,RELAX.test.omega_1^local_k)*0.5007522026922482;
+Q_RELAX.test_2[45][37]:=CT*t*Min(1000,RELAX.test.omega_1^local_k)*0.1351200521140052;
+Q_RELAX.test_2[45][41]:=GT*t*Min(1000,RELAX.test.omega_1^local_k)*0.1344351325741675;
+Q_RELAX.test_2[45][44]:=AC*t*0.3824103826488193;
+Q_RELAX.test_2[45][46]:=CG*t*0.2406378906553946;
+Q_RELAX.test_2[45][47]:=CT*t*0.2504957133922061;
+Q_RELAX.test_2[45][58]:=GT*t*Min(1000,RELAX.test.omega_1^local_k)*0.250994522453953;
+Q_RELAX.test_2[46][14]:=t*Min(1000,RELAX.test.omega_1^local_k)*0.3222350398108426;
+Q_RELAX.test_2[46][30]:=CG*t*Min(1000,RELAX.test.omega_1^local_k)*0.1214054057357627;
+Q_RELAX.test_2[46][34]:=AT*t*Min(1000,RELAX.test.omega_1^local_k)*0.5007522026922482;
+Q_RELAX.test_2[46][38]:=CT*t*Min(1000,RELAX.test.omega_1^local_k)*0.1351200521140052;
+Q_RELAX.test_2[46][42]:=GT*t*Min(1000,RELAX.test.omega_1^local_k)*0.1344351325741675;
+Q_RELAX.test_2[46][44]:=t*0.3824103826488193;
+Q_RELAX.test_2[46][45]:=CG*t*0.1264560133035801;
+Q_RELAX.test_2[46][47]:=GT*t*0.2504957133922061;
+Q_RELAX.test_2[46][59]:=GT*t*Min(1000,RELAX.test.omega_1^local_k)*0.250994522453953;
+Q_RELAX.test_2[47][15]:=t*Min(1000,RELAX.test.omega_1^local_k)*0.3222350398108426;
+Q_RELAX.test_2[47][31]:=CG*t*Min(1000,RELAX.test.omega_1^local_k)*0.1214054057357627;
+Q_RELAX.test_2[47][35]:=AT*t*Min(1000,RELAX.test.omega_1^local_k)*0.5007522026922482;
+Q_RELAX.test_2[47][39]:=CT*t*Min(1000,RELAX.test.omega_1^local_k)*0.1351200521140052;
+Q_RELAX.test_2[47][43]:=GT*t*Min(1000,RELAX.test.omega_1^local_k)*0.1344351325741675;
+Q_RELAX.test_2[47][44]:=AT*t*0.3824103826488193;
+Q_RELAX.test_2[47][45]:=CT*t*0.1264560133035801;
+Q_RELAX.test_2[47][46]:=GT*t*0.2406378906553946;
+Q_RELAX.test_2[47][60]:=GT*t*Min(1000,RELAX.test.omega_1^local_k)*0.250994522453953;
+Q_RELAX.test_2[48][1]:=AT*t*Min(1000,RELAX.test.omega_1^local_k)*0.3222350398108426;
+Q_RELAX.test_2[48][17]:=CT*t*Min(1000,RELAX.test.omega_1^local_k)*0.1214054057357627;
+Q_RELAX.test_2[48][33]:=GT*t*Min(1000,RELAX.test.omega_1^local_k)*0.3053650319994416;
+Q_RELAX.test_2[48][49]:=CT*t*0.2504957133922061;
+Q_RELAX.test_2[48][51]:=AC*t*Min(1000,RELAX.test.omega_1^local_k)*0.1351200521140052;
+Q_RELAX.test_2[48][54]:=t*Min(1000,RELAX.test.omega_1^local_k)*0.1344351325741675;
+Q_RELAX.test_2[48][58]:=AT*t*Min(1000,RELAX.test.omega_1^local_k)*0.2296926126195792;
+Q_RELAX.test_2[49][3]:=AT*t*Min(1000,RELAX.test.omega_1^local_k)*0.3222350398108426;
+Q_RELAX.test_2[49][19]:=CT*t*Min(1000,RELAX.test.omega_1^local_k)*0.1214054057357627;
+Q_RELAX.test_2[49][35]:=GT*t*Min(1000,RELAX.test.omega_1^local_k)*0.3053650319994416;
+Q_RELAX.test_2[49][48]:=CT*t*0.1264560133035801;
+Q_RELAX.test_2[49][53]:=AC*t*Min(1000,RELAX.test.omega_1^local_k)*0.1351200521140052;
+Q_RELAX.test_2[49][56]:=t*Min(1000,RELAX.test.omega_1^local_k)*0.1344351325741675;
+Q_RELAX.test_2[49][60]:=AT*t*Min(1000,RELAX.test.omega_1^local_k)*0.2296926126195792;
+Q_RELAX.test_2[50][4]:=AT*t*Min(1000,RELAX.test.omega_1^local_k)*0.3222350398108426;
+Q_RELAX.test_2[50][20]:=CT*t*Min(1000,RELAX.test.omega_1^local_k)*0.1214054057357627;
+Q_RELAX.test_2[50][36]:=GT*t*Min(1000,RELAX.test.omega_1^local_k)*0.3053650319994416;
+Q_RELAX.test_2[50][51]:=AC*t*0.1264560133035801;
+Q_RELAX.test_2[50][52]:=t*0.2406378906553946;
+Q_RELAX.test_2[50][53]:=AT*t*0.2504957133922061;
+Q_RELAX.test_2[50][57]:=CT*t*Min(1000,RELAX.test.omega_1^local_k)*0.2296926126195792;
+Q_RELAX.test_2[51][5]:=AT*t*Min(1000,RELAX.test.omega_1^local_k)*0.3222350398108426;
+Q_RELAX.test_2[51][21]:=CT*t*Min(1000,RELAX.test.omega_1^local_k)*0.1214054057357627;
+Q_RELAX.test_2[51][37]:=GT*t*Min(1000,RELAX.test.omega_1^local_k)*0.3053650319994416;
+Q_RELAX.test_2[51][48]:=AC*t*Min(1000,RELAX.test.omega_1^local_k)*0.5007522026922482;
+Q_RELAX.test_2[51][50]:=AC*t*0.3824103826488193;
+Q_RELAX.test_2[51][52]:=CG*t*0.2406378906553946;
+Q_RELAX.test_2[51][53]:=CT*t*0.2504957133922061;
+Q_RELAX.test_2[51][54]:=CG*t*Min(1000,RELAX.test.omega_1^local_k)*0.1344351325741675;
+Q_RELAX.test_2[51][58]:=CT*t*Min(1000,RELAX.test.omega_1^local_k)*0.2296926126195792;
+Q_RELAX.test_2[52][6]:=AT*t*Min(1000,RELAX.test.omega_1^local_k)*0.3222350398108426;
+Q_RELAX.test_2[52][22]:=CT*t*Min(1000,RELAX.test.omega_1^local_k)*0.1214054057357627;
+Q_RELAX.test_2[52][38]:=GT*t*Min(1000,RELAX.test.omega_1^local_k)*0.3053650319994416;
+Q_RELAX.test_2[52][50]:=t*0.3824103826488193;
+Q_RELAX.test_2[52][51]:=CG*t*0.1264560133035801;
+Q_RELAX.test_2[52][53]:=GT*t*0.2504957133922061;
+Q_RELAX.test_2[52][55]:=CG*t*Min(1000,RELAX.test.omega_1^local_k)*0.1344351325741675;
+Q_RELAX.test_2[52][59]:=CT*t*Min(1000,RELAX.test.omega_1^local_k)*0.2296926126195792;
+Q_RELAX.test_2[53][7]:=AT*t*Min(1000,RELAX.test.omega_1^local_k)*0.3222350398108426;
+Q_RELAX.test_2[53][23]:=CT*t*Min(1000,RELAX.test.omega_1^local_k)*0.1214054057357627;
+Q_RELAX.test_2[53][39]:=GT*t*Min(1000,RELAX.test.omega_1^local_k)*0.3053650319994416;
+Q_RELAX.test_2[53][49]:=AC*t*Min(1000,RELAX.test.omega_1^local_k)*0.5007522026922482;
+Q_RELAX.test_2[53][50]:=AT*t*0.3824103826488193;
+Q_RELAX.test_2[53][51]:=CT*t*0.1264560133035801;
+Q_RELAX.test_2[53][52]:=GT*t*0.2406378906553946;
+Q_RELAX.test_2[53][56]:=CG*t*Min(1000,RELAX.test.omega_1^local_k)*0.1344351325741675;
+Q_RELAX.test_2[53][60]:=CT*t*Min(1000,RELAX.test.omega_1^local_k)*0.2296926126195792;
+Q_RELAX.test_2[54][9]:=AT*t*Min(1000,RELAX.test.omega_1^local_k)*0.3222350398108426;
+Q_RELAX.test_2[54][25]:=CT*t*Min(1000,RELAX.test.omega_1^local_k)*0.1214054057357627;
+Q_RELAX.test_2[54][41]:=GT*t*Min(1000,RELAX.test.omega_1^local_k)*0.3053650319994416;
+Q_RELAX.test_2[54][48]:=t*Min(1000,RELAX.test.omega_1^local_k)*0.5007522026922482;
+Q_RELAX.test_2[54][51]:=CG*t*Min(1000,RELAX.test.omega_1^local_k)*0.1351200521140052;
+Q_RELAX.test_2[54][55]:=CG*t*Min(1000,RELAX.test.omega_1^local_k)*0.2406378906553946;
+Q_RELAX.test_2[54][56]:=CT*t*0.2504957133922061;
+Q_RELAX.test_2[54][58]:=GT*t*Min(1000,RELAX.test.omega_1^local_k)*0.2296926126195792;
+Q_RELAX.test_2[55][10]:=AT*t*Min(1000,RELAX.test.omega_1^local_k)*0.3222350398108426;
+Q_RELAX.test_2[55][26]:=CT*t*Min(1000,RELAX.test.omega_1^local_k)*0.1214054057357627;
+Q_RELAX.test_2[55][42]:=GT*t*Min(1000,RELAX.test.omega_1^local_k)*0.3053650319994416;
+Q_RELAX.test_2[55][52]:=CG*t*Min(1000,RELAX.test.omega_1^local_k)*0.1351200521140052;
+Q_RELAX.test_2[55][54]:=CG*t*Min(1000,RELAX.test.omega_1^local_k)*0.1264560133035801;
+Q_RELAX.test_2[55][56]:=GT*t*Min(1000,RELAX.test.omega_1^local_k)*0.2504957133922061;
+Q_RELAX.test_2[55][59]:=GT*t*Min(1000,RELAX.test.omega_1^local_k)*0.2296926126195792;
+Q_RELAX.test_2[56][11]:=AT*t*Min(1000,RELAX.test.omega_1^local_k)*0.3222350398108426;
+Q_RELAX.test_2[56][27]:=CT*t*Min(1000,RELAX.test.omega_1^local_k)*0.1214054057357627;
+Q_RELAX.test_2[56][43]:=GT*t*Min(1000,RELAX.test.omega_1^local_k)*0.3053650319994416;
+Q_RELAX.test_2[56][49]:=t*Min(1000,RELAX.test.omega_1^local_k)*0.5007522026922482;
+Q_RELAX.test_2[56][53]:=CG*t*Min(1000,RELAX.test.omega_1^local_k)*0.1351200521140052;
+Q_RELAX.test_2[56][54]:=CT*t*0.1264560133035801;
+Q_RELAX.test_2[56][55]:=GT*t*Min(1000,RELAX.test.omega_1^local_k)*0.2406378906553946;
+Q_RELAX.test_2[56][60]:=GT*t*Min(1000,RELAX.test.omega_1^local_k)*0.2296926126195792;
+Q_RELAX.test_2[57][12]:=AT*t*Min(1000,RELAX.test.omega_1^local_k)*0.3222350398108426;
+Q_RELAX.test_2[57][28]:=CT*t*0.1214054057357627;
+Q_RELAX.test_2[57][44]:=GT*t*Min(1000,RELAX.test.omega_1^local_k)*0.3053650319994416;
+Q_RELAX.test_2[57][50]:=CT*t*Min(1000,RELAX.test.omega_1^local_k)*0.1351200521140052;
+Q_RELAX.test_2[57][58]:=AC*t*Min(1000,RELAX.test.omega_1^local_k)*0.1264560133035801;
+Q_RELAX.test_2[57][59]:=t*0.2406378906553946;
+Q_RELAX.test_2[57][60]:=AT*t*Min(1000,RELAX.test.omega_1^local_k)*0.2504957133922061;
+Q_RELAX.test_2[58][13]:=AT*t*Min(1000,RELAX.test.omega_1^local_k)*0.3222350398108426;
+Q_RELAX.test_2[58][29]:=CT*t*Min(1000,RELAX.test.omega_1^local_k)*0.1214054057357627;
+Q_RELAX.test_2[58][45]:=GT*t*Min(1000,RELAX.test.omega_1^local_k)*0.3053650319994416;
+Q_RELAX.test_2[58][48]:=AT*t*Min(1000,RELAX.test.omega_1^local_k)*0.5007522026922482;
+Q_RELAX.test_2[58][51]:=CT*t*Min(1000,RELAX.test.omega_1^local_k)*0.1351200521140052;
+Q_RELAX.test_2[58][54]:=GT*t*Min(1000,RELAX.test.omega_1^local_k)*0.1344351325741675;
+Q_RELAX.test_2[58][57]:=AC*t*Min(1000,RELAX.test.omega_1^local_k)*0.3824103826488193;
+Q_RELAX.test_2[58][59]:=CG*t*Min(1000,RELAX.test.omega_1^local_k)*0.2406378906553946;
+Q_RELAX.test_2[58][60]:=CT*t*0.2504957133922061;
+Q_RELAX.test_2[59][14]:=AT*t*Min(1000,RELAX.test.omega_1^local_k)*0.3222350398108426;
+Q_RELAX.test_2[59][30]:=CT*t*0.1214054057357627;
+Q_RELAX.test_2[59][46]:=GT*t*Min(1000,RELAX.test.omega_1^local_k)*0.3053650319994416;
+Q_RELAX.test_2[59][52]:=CT*t*Min(1000,RELAX.test.omega_1^local_k)*0.1351200521140052;
+Q_RELAX.test_2[59][55]:=GT*t*Min(1000,RELAX.test.omega_1^local_k)*0.1344351325741675;
+Q_RELAX.test_2[59][57]:=t*0.3824103826488193;
+Q_RELAX.test_2[59][58]:=CG*t*Min(1000,RELAX.test.omega_1^local_k)*0.1264560133035801;
+Q_RELAX.test_2[59][60]:=GT*t*Min(1000,RELAX.test.omega_1^local_k)*0.2504957133922061;
+Q_RELAX.test_2[60][15]:=AT*t*Min(1000,RELAX.test.omega_1^local_k)*0.3222350398108426;
+Q_RELAX.test_2[60][31]:=CT*t*Min(1000,RELAX.test.omega_1^local_k)*0.1214054057357627;
+Q_RELAX.test_2[60][47]:=GT*t*Min(1000,RELAX.test.omega_1^local_k)*0.3053650319994416;
+Q_RELAX.test_2[60][49]:=AT*t*Min(1000,RELAX.test.omega_1^local_k)*0.5007522026922482;
+Q_RELAX.test_2[60][53]:=CT*t*Min(1000,RELAX.test.omega_1^local_k)*0.1351200521140052;
+Q_RELAX.test_2[60][56]:=GT*t*Min(1000,RELAX.test.omega_1^local_k)*0.1344351325741675;
+Q_RELAX.test_2[60][57]:=AT*t*Min(1000,RELAX.test.omega_1^local_k)*0.3824103826488193;
+Q_RELAX.test_2[60][58]:=CT*t*0.1264560133035801;
+Q_RELAX.test_2[60][59]:=GT*t*Min(1000,RELAX.test.omega_1^local_k)*0.2406378906553946;
+
+
+Q_RELAX.test_3={61,61};
+Q_RELAX.test_3[0][1]:=AC*t*Min(1000,RELAX.test.omega_2^local_k)*0.1264560133035801;
+Q_RELAX.test_3[0][2]:=t*0.2406378906553946;
+Q_RELAX.test_3[0][3]:=AT*t*Min(1000,RELAX.test.omega_2^local_k)*0.2504957133922061;
+Q_RELAX.test_3[0][4]:=AC*t*Min(1000,RELAX.test.omega_2^local_k)*0.1351200521140052;
+Q_RELAX.test_3[0][8]:=t*Min(1000,RELAX.test.omega_2^local_k)*0.1344351325741675;
+Q_RELAX.test_3[0][12]:=AT*t*Min(1000,RELAX.test.omega_2^local_k)*0.2296926126195792;
+Q_RELAX.test_3[0][16]:=AC*t*Min(1000,RELAX.test.omega_2^local_k)*0.1214054057357627;
+Q_RELAX.test_3[0][32]:=t*Min(1000,RELAX.test.omega_2^local_k)*0.3053650319994416;
+Q_RELAX.test_3[1][0]:=AC*t*Min(1000,RELAX.test.omega_2^local_k)*0.3824103826488193;
+Q_RELAX.test_3[1][2]:=CG*t*Min(1000,RELAX.test.omega_2^local_k)*0.2406378906553946;
+Q_RELAX.test_3[1][3]:=CT*t*0.2504957133922061;
+Q_RELAX.test_3[1][5]:=AC*t*Min(1000,RELAX.test.omega_2^local_k)*0.1351200521140052;
+Q_RELAX.test_3[1][9]:=t*Min(1000,RELAX.test.omega_2^local_k)*0.1344351325741675;
+Q_RELAX.test_3[1][13]:=AT*t*Min(1000,RELAX.test.omega_2^local_k)*0.2296926126195792;
+Q_RELAX.test_3[1][17]:=AC*t*Min(1000,RELAX.test.omega_2^local_k)*0.1214054057357627;
+Q_RELAX.test_3[1][33]:=t*Min(1000,RELAX.test.omega_2^local_k)*0.3053650319994416;
+Q_RELAX.test_3[1][48]:=AT*t*Min(1000,RELAX.test.omega_2^local_k)*0.250994522453953;
+Q_RELAX.test_3[2][0]:=t*0.3824103826488193;
+Q_RELAX.test_3[2][1]:=CG*t*Min(1000,RELAX.test.omega_2^local_k)*0.1264560133035801;
+Q_RELAX.test_3[2][3]:=GT*t*Min(1000,RELAX.test.omega_2^local_k)*0.2504957133922061;
+Q_RELAX.test_3[2][6]:=AC*t*Min(1000,RELAX.test.omega_2^local_k)*0.1351200521140052;
+Q_RELAX.test_3[2][10]:=t*Min(1000,RELAX.test.omega_2^local_k)*0.1344351325741675;
+Q_RELAX.test_3[2][14]:=AT*t*Min(1000,RELAX.test.omega_2^local_k)*0.2296926126195792;
+Q_RELAX.test_3[2][18]:=AC*t*Min(1000,RELAX.test.omega_2^local_k)*0.1214054057357627;
+Q_RELAX.test_3[2][34]:=t*Min(1000,RELAX.test.omega_2^local_k)*0.3053650319994416;
+Q_RELAX.test_3[3][0]:=AT*t*Min(1000,RELAX.test.omega_2^local_k)*0.3824103826488193;
+Q_RELAX.test_3[3][1]:=CT*t*0.1264560133035801;
+Q_RELAX.test_3[3][2]:=GT*t*Min(1000,RELAX.test.omega_2^local_k)*0.2406378906553946;
+Q_RELAX.test_3[3][7]:=AC*t*Min(1000,RELAX.test.omega_2^local_k)*0.1351200521140052;
+Q_RELAX.test_3[3][11]:=t*Min(1000,RELAX.test.omega_2^local_k)*0.1344351325741675;
+Q_RELAX.test_3[3][15]:=AT*t*Min(1000,RELAX.test.omega_2^local_k)*0.2296926126195792;
+Q_RELAX.test_3[3][19]:=AC*t*Min(1000,RELAX.test.omega_2^local_k)*0.1214054057357627;
+Q_RELAX.test_3[3][35]:=t*Min(1000,RELAX.test.omega_2^local_k)*0.3053650319994416;
+Q_RELAX.test_3[3][49]:=AT*t*Min(1000,RELAX.test.omega_2^local_k)*0.250994522453953;
+Q_RELAX.test_3[4][0]:=AC*t*Min(1000,RELAX.test.omega_2^local_k)*0.5007522026922482;
+Q_RELAX.test_3[4][5]:=AC*t*0.1264560133035801;
+Q_RELAX.test_3[4][6]:=t*0.2406378906553946;
+Q_RELAX.test_3[4][7]:=AT*t*0.2504957133922061;
+Q_RELAX.test_3[4][8]:=CG*t*Min(1000,RELAX.test.omega_2^local_k)*0.1344351325741675;
+Q_RELAX.test_3[4][12]:=CT*t*Min(1000,RELAX.test.omega_2^local_k)*0.2296926126195792;
+Q_RELAX.test_3[4][20]:=AC*t*Min(1000,RELAX.test.omega_2^local_k)*0.1214054057357627;
+Q_RELAX.test_3[4][36]:=t*Min(1000,RELAX.test.omega_2^local_k)*0.3053650319994416;
+Q_RELAX.test_3[4][50]:=AT*t*Min(1000,RELAX.test.omega_2^local_k)*0.250994522453953;
+Q_RELAX.test_3[5][1]:=AC*t*Min(1000,RELAX.test.omega_2^local_k)*0.5007522026922482;
+Q_RELAX.test_3[5][4]:=AC*t*0.3824103826488193;
+Q_RELAX.test_3[5][6]:=CG*t*0.2406378906553946;
+Q_RELAX.test_3[5][7]:=CT*t*0.2504957133922061;
+Q_RELAX.test_3[5][9]:=CG*t*Min(1000,RELAX.test.omega_2^local_k)*0.1344351325741675;
+Q_RELAX.test_3[5][13]:=CT*t*Min(1000,RELAX.test.omega_2^local_k)*0.2296926126195792;
+Q_RELAX.test_3[5][21]:=AC*t*Min(1000,RELAX.test.omega_2^local_k)*0.1214054057357627;
+Q_RELAX.test_3[5][37]:=t*Min(1000,RELAX.test.omega_2^local_k)*0.3053650319994416;
+Q_RELAX.test_3[5][51]:=AT*t*Min(1000,RELAX.test.omega_2^local_k)*0.250994522453953;
+Q_RELAX.test_3[6][2]:=AC*t*Min(1000,RELAX.test.omega_2^local_k)*0.5007522026922482;
+Q_RELAX.test_3[6][4]:=t*0.3824103826488193;
+Q_RELAX.test_3[6][5]:=CG*t*0.1264560133035801;
+Q_RELAX.test_3[6][7]:=GT*t*0.2504957133922061;
+Q_RELAX.test_3[6][10]:=CG*t*Min(1000,RELAX.test.omega_2^local_k)*0.1344351325741675;
+Q_RELAX.test_3[6][14]:=CT*t*Min(1000,RELAX.test.omega_2^local_k)*0.2296926126195792;
+Q_RELAX.test_3[6][22]:=AC*t*Min(1000,RELAX.test.omega_2^local_k)*0.1214054057357627;
+Q_RELAX.test_3[6][38]:=t*Min(1000,RELAX.test.omega_2^local_k)*0.3053650319994416;
+Q_RELAX.test_3[6][52]:=AT*t*Min(1000,RELAX.test.omega_2^local_k)*0.250994522453953;
+Q_RELAX.test_3[7][3]:=AC*t*Min(1000,RELAX.test.omega_2^local_k)*0.5007522026922482;
+Q_RELAX.test_3[7][4]:=AT*t*0.3824103826488193;
+Q_RELAX.test_3[7][5]:=CT*t*0.1264560133035801;
+Q_RELAX.test_3[7][6]:=GT*t*0.2406378906553946;
+Q_RELAX.test_3[7][11]:=CG*t*Min(1000,RELAX.test.omega_2^local_k)*0.1344351325741675;
+Q_RELAX.test_3[7][15]:=CT*t*Min(1000,RELAX.test.omega_2^local_k)*0.2296926126195792;
+Q_RELAX.test_3[7][23]:=AC*t*Min(1000,RELAX.test.omega_2^local_k)*0.1214054057357627;
+Q_RELAX.test_3[7][39]:=t*Min(1000,RELAX.test.omega_2^local_k)*0.3053650319994416;
+Q_RELAX.test_3[7][53]:=AT*t*Min(1000,RELAX.test.omega_2^local_k)*0.250994522453953;
+Q_RELAX.test_3[8][0]:=t*Min(1000,RELAX.test.omega_2^local_k)*0.5007522026922482;
+Q_RELAX.test_3[8][4]:=CG*t*Min(1000,RELAX.test.omega_2^local_k)*0.1351200521140052;
+Q_RELAX.test_3[8][9]:=AC*t*Min(1000,RELAX.test.omega_2^local_k)*0.1264560133035801;
+Q_RELAX.test_3[8][10]:=t*0.2406378906553946;
+Q_RELAX.test_3[8][11]:=AT*t*Min(1000,RELAX.test.omega_2^local_k)*0.2504957133922061;
+Q_RELAX.test_3[8][12]:=GT*t*Min(1000,RELAX.test.omega_2^local_k)*0.2296926126195792;
+Q_RELAX.test_3[8][24]:=AC*t*0.1214054057357627;
+Q_RELAX.test_3[8][40]:=t*Min(1000,RELAX.test.omega_2^local_k)*0.3053650319994416;
+Q_RELAX.test_3[9][1]:=t*Min(1000,RELAX.test.omega_2^local_k)*0.5007522026922482;
+Q_RELAX.test_3[9][5]:=CG*t*Min(1000,RELAX.test.omega_2^local_k)*0.1351200521140052;
+Q_RELAX.test_3[9][8]:=AC*t*Min(1000,RELAX.test.omega_2^local_k)*0.3824103826488193;
+Q_RELAX.test_3[9][10]:=CG*t*Min(1000,RELAX.test.omega_2^local_k)*0.2406378906553946;
+Q_RELAX.test_3[9][11]:=CT*t*0.2504957133922061;
+Q_RELAX.test_3[9][13]:=GT*t*Min(1000,RELAX.test.omega_2^local_k)*0.2296926126195792;
+Q_RELAX.test_3[9][25]:=AC*t*Min(1000,RELAX.test.omega_2^local_k)*0.1214054057357627;
+Q_RELAX.test_3[9][41]:=t*Min(1000,RELAX.test.omega_2^local_k)*0.3053650319994416;
+Q_RELAX.test_3[9][54]:=AT*t*Min(1000,RELAX.test.omega_2^local_k)*0.250994522453953;
+Q_RELAX.test_3[10][2]:=t*Min(1000,RELAX.test.omega_2^local_k)*0.5007522026922482;
+Q_RELAX.test_3[10][6]:=CG*t*Min(1000,RELAX.test.omega_2^local_k)*0.1351200521140052;
+Q_RELAX.test_3[10][8]:=t*0.3824103826488193;
+Q_RELAX.test_3[10][9]:=CG*t*Min(1000,RELAX.test.omega_2^local_k)*0.1264560133035801;
+Q_RELAX.test_3[10][11]:=GT*t*Min(1000,RELAX.test.omega_2^local_k)*0.2504957133922061;
+Q_RELAX.test_3[10][14]:=GT*t*Min(1000,RELAX.test.omega_2^local_k)*0.2296926126195792;
+Q_RELAX.test_3[10][26]:=AC*t*0.1214054057357627;
+Q_RELAX.test_3[10][42]:=t*Min(1000,RELAX.test.omega_2^local_k)*0.3053650319994416;
+Q_RELAX.test_3[10][55]:=AT*t*Min(1000,RELAX.test.omega_2^local_k)*0.250994522453953;
+Q_RELAX.test_3[11][3]:=t*Min(1000,RELAX.test.omega_2^local_k)*0.5007522026922482;
+Q_RELAX.test_3[11][7]:=CG*t*Min(1000,RELAX.test.omega_2^local_k)*0.1351200521140052;
+Q_RELAX.test_3[11][8]:=AT*t*Min(1000,RELAX.test.omega_2^local_k)*0.3824103826488193;
+Q_RELAX.test_3[11][9]:=CT*t*0.1264560133035801;
+Q_RELAX.test_3[11][10]:=GT*t*Min(1000,RELAX.test.omega_2^local_k)*0.2406378906553946;
+Q_RELAX.test_3[11][15]:=GT*t*Min(1000,RELAX.test.omega_2^local_k)*0.2296926126195792;
+Q_RELAX.test_3[11][27]:=AC*t*Min(1000,RELAX.test.omega_2^local_k)*0.1214054057357627;
+Q_RELAX.test_3[11][43]:=t*Min(1000,RELAX.test.omega_2^local_k)*0.3053650319994416;
+Q_RELAX.test_3[11][56]:=AT*t*Min(1000,RELAX.test.omega_2^local_k)*0.250994522453953;
+Q_RELAX.test_3[12][0]:=AT*t*Min(1000,RELAX.test.omega_2^local_k)*0.5007522026922482;
+Q_RELAX.test_3[12][4]:=CT*t*Min(1000,RELAX.test.omega_2^local_k)*0.1351200521140052;
+Q_RELAX.test_3[12][8]:=GT*t*Min(1000,RELAX.test.omega_2^local_k)*0.1344351325741675;
+Q_RELAX.test_3[12][13]:=AC*t*0.1264560133035801;
+Q_RELAX.test_3[12][14]:=t*Min(1000,RELAX.test.omega_2^local_k)*0.2406378906553946;
+Q_RELAX.test_3[12][15]:=AT*t*0.2504957133922061;
+Q_RELAX.test_3[12][28]:=AC*t*Min(1000,RELAX.test.omega_2^local_k)*0.1214054057357627;
+Q_RELAX.test_3[12][44]:=t*Min(1000,RELAX.test.omega_2^local_k)*0.3053650319994416;
+Q_RELAX.test_3[12][57]:=AT*t*Min(1000,RELAX.test.omega_2^local_k)*0.250994522453953;
+Q_RELAX.test_3[13][1]:=AT*t*Min(1000,RELAX.test.omega_2^local_k)*0.5007522026922482;
+Q_RELAX.test_3[13][5]:=CT*t*Min(1000,RELAX.test.omega_2^local_k)*0.1351200521140052;
+Q_RELAX.test_3[13][9]:=GT*t*Min(1000,RELAX.test.omega_2^local_k)*0.1344351325741675;
+Q_RELAX.test_3[13][12]:=AC*t*0.3824103826488193;
+Q_RELAX.test_3[13][14]:=CG*t*Min(1000,RELAX.test.omega_2^local_k)*0.2406378906553946;
+Q_RELAX.test_3[13][15]:=CT*t*0.2504957133922061;
+Q_RELAX.test_3[13][29]:=AC*t*Min(1000,RELAX.test.omega_2^local_k)*0.1214054057357627;
+Q_RELAX.test_3[13][45]:=t*Min(1000,RELAX.test.omega_2^local_k)*0.3053650319994416;
+Q_RELAX.test_3[13][58]:=AT*t*Min(1000,RELAX.test.omega_2^local_k)*0.250994522453953;
+Q_RELAX.test_3[14][2]:=AT*t*Min(1000,RELAX.test.omega_2^local_k)*0.5007522026922482;
+Q_RELAX.test_3[14][6]:=CT*t*Min(1000,RELAX.test.omega_2^local_k)*0.1351200521140052;
+Q_RELAX.test_3[14][10]:=GT*t*Min(1000,RELAX.test.omega_2^local_k)*0.1344351325741675;
+Q_RELAX.test_3[14][12]:=t*Min(1000,RELAX.test.omega_2^local_k)*0.3824103826488193;
+Q_RELAX.test_3[14][13]:=CG*t*Min(1000,RELAX.test.omega_2^local_k)*0.1264560133035801;
+Q_RELAX.test_3[14][15]:=GT*t*Min(1000,RELAX.test.omega_2^local_k)*0.2504957133922061;
+Q_RELAX.test_3[14][30]:=AC*t*Min(1000,RELAX.test.omega_2^local_k)*0.1214054057357627;
+Q_RELAX.test_3[14][46]:=t*Min(1000,RELAX.test.omega_2^local_k)*0.3053650319994416;
+Q_RELAX.test_3[14][59]:=AT*t*Min(1000,RELAX.test.omega_2^local_k)*0.250994522453953;
+Q_RELAX.test_3[15][3]:=AT*t*Min(1000,RELAX.test.omega_2^local_k)*0.5007522026922482;
+Q_RELAX.test_3[15][7]:=CT*t*Min(1000,RELAX.test.omega_2^local_k)*0.1351200521140052;
+Q_RELAX.test_3[15][11]:=GT*t*Min(1000,RELAX.test.omega_2^local_k)*0.1344351325741675;
+Q_RELAX.test_3[15][12]:=AT*t*0.3824103826488193;
+Q_RELAX.test_3[15][13]:=CT*t*0.1264560133035801;
+Q_RELAX.test_3[15][14]:=GT*t*Min(1000,RELAX.test.omega_2^local_k)*0.2406378906553946;
+Q_RELAX.test_3[15][31]:=AC*t*Min(1000,RELAX.test.omega_2^local_k)*0.1214054057357627;
+Q_RELAX.test_3[15][47]:=t*Min(1000,RELAX.test.omega_2^local_k)*0.3053650319994416;
+Q_RELAX.test_3[15][60]:=AT*t*Min(1000,RELAX.test.omega_2^local_k)*0.250994522453953;
+Q_RELAX.test_3[16][0]:=AC*t*Min(1000,RELAX.test.omega_2^local_k)*0.3222350398108426;
+Q_RELAX.test_3[16][17]:=AC*t*Min(1000,RELAX.test.omega_2^local_k)*0.1264560133035801;
+Q_RELAX.test_3[16][18]:=t*0.2406378906553946;
+Q_RELAX.test_3[16][19]:=AT*t*Min(1000,RELAX.test.omega_2^local_k)*0.2504957133922061;
+Q_RELAX.test_3[16][20]:=AC*t*Min(1000,RELAX.test.omega_2^local_k)*0.1351200521140052;
+Q_RELAX.test_3[16][24]:=t*Min(1000,RELAX.test.omega_2^local_k)*0.1344351325741675;
+Q_RELAX.test_3[16][28]:=AT*t*Min(1000,RELAX.test.omega_2^local_k)*0.2296926126195792;
+Q_RELAX.test_3[16][32]:=CG*t*Min(1000,RELAX.test.omega_2^local_k)*0.3053650319994416;
+Q_RELAX.test_3[17][1]:=AC*t*Min(1000,RELAX.test.omega_2^local_k)*0.3222350398108426;
+Q_RELAX.test_3[17][16]:=AC*t*Min(1000,RELAX.test.omega_2^local_k)*0.3824103826488193;
+Q_RELAX.test_3[17][18]:=CG*t*Min(1000,RELAX.test.omega_2^local_k)*0.2406378906553946;
+Q_RELAX.test_3[17][19]:=CT*t*0.2504957133922061;
+Q_RELAX.test_3[17][21]:=AC*t*Min(1000,RELAX.test.omega_2^local_k)*0.1351200521140052;
+Q_RELAX.test_3[17][25]:=t*Min(1000,RELAX.test.omega_2^local_k)*0.1344351325741675;
+Q_RELAX.test_3[17][29]:=AT*t*Min(1000,RELAX.test.omega_2^local_k)*0.2296926126195792;
+Q_RELAX.test_3[17][33]:=CG*t*Min(1000,RELAX.test.omega_2^local_k)*0.3053650319994416;
+Q_RELAX.test_3[17][48]:=CT*t*Min(1000,RELAX.test.omega_2^local_k)*0.250994522453953;
+Q_RELAX.test_3[18][2]:=AC*t*Min(1000,RELAX.test.omega_2^local_k)*0.3222350398108426;
+Q_RELAX.test_3[18][16]:=t*0.3824103826488193;
+Q_RELAX.test_3[18][17]:=CG*t*Min(1000,RELAX.test.omega_2^local_k)*0.1264560133035801;
+Q_RELAX.test_3[18][19]:=GT*t*Min(1000,RELAX.test.omega_2^local_k)*0.2504957133922061;
+Q_RELAX.test_3[18][22]:=AC*t*Min(1000,RELAX.test.omega_2^local_k)*0.1351200521140052;
+Q_RELAX.test_3[18][26]:=t*Min(1000,RELAX.test.omega_2^local_k)*0.1344351325741675;
+Q_RELAX.test_3[18][30]:=AT*t*Min(1000,RELAX.test.omega_2^local_k)*0.2296926126195792;
+Q_RELAX.test_3[18][34]:=CG*t*Min(1000,RELAX.test.omega_2^local_k)*0.3053650319994416;
+Q_RELAX.test_3[19][3]:=AC*t*Min(1000,RELAX.test.omega_2^local_k)*0.3222350398108426;
+Q_RELAX.test_3[19][16]:=AT*t*Min(1000,RELAX.test.omega_2^local_k)*0.3824103826488193;
+Q_RELAX.test_3[19][17]:=CT*t*0.1264560133035801;
+Q_RELAX.test_3[19][18]:=GT*t*Min(1000,RELAX.test.omega_2^local_k)*0.2406378906553946;
+Q_RELAX.test_3[19][23]:=AC*t*Min(1000,RELAX.test.omega_2^local_k)*0.1351200521140052;
+Q_RELAX.test_3[19][27]:=t*Min(1000,RELAX.test.omega_2^local_k)*0.1344351325741675;
+Q_RELAX.test_3[19][31]:=AT*t*Min(1000,RELAX.test.omega_2^local_k)*0.2296926126195792;
+Q_RELAX.test_3[19][35]:=CG*t*Min(1000,RELAX.test.omega_2^local_k)*0.3053650319994416;
+Q_RELAX.test_3[19][49]:=CT*t*Min(1000,RELAX.test.omega_2^local_k)*0.250994522453953;
+Q_RELAX.test_3[20][4]:=AC*t*Min(1000,RELAX.test.omega_2^local_k)*0.3222350398108426;
+Q_RELAX.test_3[20][16]:=AC*t*Min(1000,RELAX.test.omega_2^local_k)*0.5007522026922482;
+Q_RELAX.test_3[20][21]:=AC*t*0.1264560133035801;
+Q_RELAX.test_3[20][22]:=t*0.2406378906553946;
+Q_RELAX.test_3[20][23]:=AT*t*0.2504957133922061;
+Q_RELAX.test_3[20][24]:=CG*t*Min(1000,RELAX.test.omega_2^local_k)*0.1344351325741675;
+Q_RELAX.test_3[20][28]:=CT*t*Min(1000,RELAX.test.omega_2^local_k)*0.2296926126195792;
+Q_RELAX.test_3[20][36]:=CG*t*Min(1000,RELAX.test.omega_2^local_k)*0.3053650319994416;
+Q_RELAX.test_3[20][50]:=CT*t*Min(1000,RELAX.test.omega_2^local_k)*0.250994522453953;
+Q_RELAX.test_3[21][5]:=AC*t*Min(1000,RELAX.test.omega_2^local_k)*0.3222350398108426;
+Q_RELAX.test_3[21][17]:=AC*t*Min(1000,RELAX.test.omega_2^local_k)*0.5007522026922482;
+Q_RELAX.test_3[21][20]:=AC*t*0.3824103826488193;
+Q_RELAX.test_3[21][22]:=CG*t*0.2406378906553946;
+Q_RELAX.test_3[21][23]:=CT*t*0.2504957133922061;
+Q_RELAX.test_3[21][25]:=CG*t*Min(1000,RELAX.test.omega_2^local_k)*0.1344351325741675;
+Q_RELAX.test_3[21][29]:=CT*t*Min(1000,RELAX.test.omega_2^local_k)*0.2296926126195792;
+Q_RELAX.test_3[21][37]:=CG*t*Min(1000,RELAX.test.omega_2^local_k)*0.3053650319994416;
+Q_RELAX.test_3[21][51]:=CT*t*Min(1000,RELAX.test.omega_2^local_k)*0.250994522453953;
+Q_RELAX.test_3[22][6]:=AC*t*Min(1000,RELAX.test.omega_2^local_k)*0.3222350398108426;
+Q_RELAX.test_3[22][18]:=AC*t*Min(1000,RELAX.test.omega_2^local_k)*0.5007522026922482;
+Q_RELAX.test_3[22][20]:=t*0.3824103826488193;
+Q_RELAX.test_3[22][21]:=CG*t*0.1264560133035801;
+Q_RELAX.test_3[22][23]:=GT*t*0.2504957133922061;
+Q_RELAX.test_3[22][26]:=CG*t*Min(1000,RELAX.test.omega_2^local_k)*0.1344351325741675;
+Q_RELAX.test_3[22][30]:=CT*t*Min(1000,RELAX.test.omega_2^local_k)*0.2296926126195792;
+Q_RELAX.test_3[22][38]:=CG*t*Min(1000,RELAX.test.omega_2^local_k)*0.3053650319994416;
+Q_RELAX.test_3[22][52]:=CT*t*Min(1000,RELAX.test.omega_2^local_k)*0.250994522453953;
+Q_RELAX.test_3[23][7]:=AC*t*Min(1000,RELAX.test.omega_2^local_k)*0.3222350398108426;
+Q_RELAX.test_3[23][19]:=AC*t*Min(1000,RELAX.test.omega_2^local_k)*0.5007522026922482;
+Q_RELAX.test_3[23][20]:=AT*t*0.3824103826488193;
+Q_RELAX.test_3[23][21]:=CT*t*0.1264560133035801;
+Q_RELAX.test_3[23][22]:=GT*t*0.2406378906553946;
+Q_RELAX.test_3[23][27]:=CG*t*Min(1000,RELAX.test.omega_2^local_k)*0.1344351325741675;
+Q_RELAX.test_3[23][31]:=CT*t*Min(1000,RELAX.test.omega_2^local_k)*0.2296926126195792;
+Q_RELAX.test_3[23][39]:=CG*t*Min(1000,RELAX.test.omega_2^local_k)*0.3053650319994416;
+Q_RELAX.test_3[23][53]:=CT*t*Min(1000,RELAX.test.omega_2^local_k)*0.250994522453953;
+Q_RELAX.test_3[24][8]:=AC*t*0.3222350398108426;
+Q_RELAX.test_3[24][16]:=t*Min(1000,RELAX.test.omega_2^local_k)*0.5007522026922482;
+Q_RELAX.test_3[24][20]:=CG*t*Min(1000,RELAX.test.omega_2^local_k)*0.1351200521140052;
+Q_RELAX.test_3[24][25]:=AC*t*0.1264560133035801;
+Q_RELAX.test_3[24][26]:=t*0.2406378906553946;
+Q_RELAX.test_3[24][27]:=AT*t*0.2504957133922061;
+Q_RELAX.test_3[24][28]:=GT*t*Min(1000,RELAX.test.omega_2^local_k)*0.2296926126195792;
+Q_RELAX.test_3[24][40]:=CG*t*Min(1000,RELAX.test.omega_2^local_k)*0.3053650319994416;
+Q_RELAX.test_3[25][9]:=AC*t*Min(1000,RELAX.test.omega_2^local_k)*0.3222350398108426;
+Q_RELAX.test_3[25][17]:=t*Min(1000,RELAX.test.omega_2^local_k)*0.5007522026922482;
+Q_RELAX.test_3[25][21]:=CG*t*Min(1000,RELAX.test.omega_2^local_k)*0.1351200521140052;
+Q_RELAX.test_3[25][24]:=AC*t*0.3824103826488193;
+Q_RELAX.test_3[25][26]:=CG*t*0.2406378906553946;
+Q_RELAX.test_3[25][27]:=CT*t*0.2504957133922061;
+Q_RELAX.test_3[25][29]:=GT*t*Min(1000,RELAX.test.omega_2^local_k)*0.2296926126195792;
+Q_RELAX.test_3[25][41]:=CG*t*Min(1000,RELAX.test.omega_2^local_k)*0.3053650319994416;
+Q_RELAX.test_3[25][54]:=CT*t*Min(1000,RELAX.test.omega_2^local_k)*0.250994522453953;
+Q_RELAX.test_3[26][10]:=AC*t*0.3222350398108426;
+Q_RELAX.test_3[26][18]:=t*Min(1000,RELAX.test.omega_2^local_k)*0.5007522026922482;
+Q_RELAX.test_3[26][22]:=CG*t*Min(1000,RELAX.test.omega_2^local_k)*0.1351200521140052;
+Q_RELAX.test_3[26][24]:=t*0.3824103826488193;
+Q_RELAX.test_3[26][25]:=CG*t*0.1264560133035801;
+Q_RELAX.test_3[26][27]:=GT*t*0.2504957133922061;
+Q_RELAX.test_3[26][30]:=GT*t*Min(1000,RELAX.test.omega_2^local_k)*0.2296926126195792;
+Q_RELAX.test_3[26][42]:=CG*t*Min(1000,RELAX.test.omega_2^local_k)*0.3053650319994416;
+Q_RELAX.test_3[26][55]:=CT*t*Min(1000,RELAX.test.omega_2^local_k)*0.250994522453953;
+Q_RELAX.test_3[27][11]:=AC*t*Min(1000,RELAX.test.omega_2^local_k)*0.3222350398108426;
+Q_RELAX.test_3[27][19]:=t*Min(1000,RELAX.test.omega_2^local_k)*0.5007522026922482;
+Q_RELAX.test_3[27][23]:=CG*t*Min(1000,RELAX.test.omega_2^local_k)*0.1351200521140052;
+Q_RELAX.test_3[27][24]:=AT*t*0.3824103826488193;
+Q_RELAX.test_3[27][25]:=CT*t*0.1264560133035801;
+Q_RELAX.test_3[27][26]:=GT*t*0.2406378906553946;
+Q_RELAX.test_3[27][31]:=GT*t*Min(1000,RELAX.test.omega_2^local_k)*0.2296926126195792;
+Q_RELAX.test_3[27][43]:=CG*t*Min(1000,RELAX.test.omega_2^local_k)*0.3053650319994416;
+Q_RELAX.test_3[27][56]:=CT*t*Min(1000,RELAX.test.omega_2^local_k)*0.250994522453953;
+Q_RELAX.test_3[28][12]:=AC*t*Min(1000,RELAX.test.omega_2^local_k)*0.3222350398108426;
+Q_RELAX.test_3[28][16]:=AT*t*Min(1000,RELAX.test.omega_2^local_k)*0.5007522026922482;
+Q_RELAX.test_3[28][20]:=CT*t*Min(1000,RELAX.test.omega_2^local_k)*0.1351200521140052;
+Q_RELAX.test_3[28][24]:=GT*t*Min(1000,RELAX.test.omega_2^local_k)*0.1344351325741675;
+Q_RELAX.test_3[28][29]:=AC*t*0.1264560133035801;
+Q_RELAX.test_3[28][30]:=t*0.2406378906553946;
+Q_RELAX.test_3[28][31]:=AT*t*0.2504957133922061;
+Q_RELAX.test_3[28][44]:=CG*t*Min(1000,RELAX.test.omega_2^local_k)*0.3053650319994416;
+Q_RELAX.test_3[28][57]:=CT*t*0.250994522453953;
+Q_RELAX.test_3[29][13]:=AC*t*Min(1000,RELAX.test.omega_2^local_k)*0.3222350398108426;
+Q_RELAX.test_3[29][17]:=AT*t*Min(1000,RELAX.test.omega_2^local_k)*0.5007522026922482;
+Q_RELAX.test_3[29][21]:=CT*t*Min(1000,RELAX.test.omega_2^local_k)*0.1351200521140052;
+Q_RELAX.test_3[29][25]:=GT*t*Min(1000,RELAX.test.omega_2^local_k)*0.1344351325741675;
+Q_RELAX.test_3[29][28]:=AC*t*0.3824103826488193;
+Q_RELAX.test_3[29][30]:=CG*t*0.2406378906553946;
+Q_RELAX.test_3[29][31]:=CT*t*0.2504957133922061;
+Q_RELAX.test_3[29][45]:=CG*t*Min(1000,RELAX.test.omega_2^local_k)*0.3053650319994416;
+Q_RELAX.test_3[29][58]:=CT*t*Min(1000,RELAX.test.omega_2^local_k)*0.250994522453953;
+Q_RELAX.test_3[30][14]:=AC*t*Min(1000,RELAX.test.omega_2^local_k)*0.3222350398108426;
+Q_RELAX.test_3[30][18]:=AT*t*Min(1000,RELAX.test.omega_2^local_k)*0.5007522026922482;
+Q_RELAX.test_3[30][22]:=CT*t*Min(1000,RELAX.test.omega_2^local_k)*0.1351200521140052;
+Q_RELAX.test_3[30][26]:=GT*t*Min(1000,RELAX.test.omega_2^local_k)*0.1344351325741675;
+Q_RELAX.test_3[30][28]:=t*0.3824103826488193;
+Q_RELAX.test_3[30][29]:=CG*t*0.1264560133035801;
+Q_RELAX.test_3[30][31]:=GT*t*0.2504957133922061;
+Q_RELAX.test_3[30][46]:=CG*t*Min(1000,RELAX.test.omega_2^local_k)*0.3053650319994416;
+Q_RELAX.test_3[30][59]:=CT*t*0.250994522453953;
+Q_RELAX.test_3[31][15]:=AC*t*Min(1000,RELAX.test.omega_2^local_k)*0.3222350398108426;
+Q_RELAX.test_3[31][19]:=AT*t*Min(1000,RELAX.test.omega_2^local_k)*0.5007522026922482;
+Q_RELAX.test_3[31][23]:=CT*t*Min(1000,RELAX.test.omega_2^local_k)*0.1351200521140052;
+Q_RELAX.test_3[31][27]:=GT*t*Min(1000,RELAX.test.omega_2^local_k)*0.1344351325741675;
+Q_RELAX.test_3[31][28]:=AT*t*0.3824103826488193;
+Q_RELAX.test_3[31][29]:=CT*t*0.1264560133035801;
+Q_RELAX.test_3[31][30]:=GT*t*0.2406378906553946;
+Q_RELAX.test_3[31][47]:=CG*t*Min(1000,RELAX.test.omega_2^local_k)*0.3053650319994416;
+Q_RELAX.test_3[31][60]:=CT*t*Min(1000,RELAX.test.omega_2^local_k)*0.250994522453953;
+Q_RELAX.test_3[32][0]:=t*Min(1000,RELAX.test.omega_2^local_k)*0.3222350398108426;
+Q_RELAX.test_3[32][16]:=CG*t*Min(1000,RELAX.test.omega_2^local_k)*0.1214054057357627;
+Q_RELAX.test_3[32][33]:=AC*t*Min(1000,RELAX.test.omega_2^local_k)*0.1264560133035801;
+Q_RELAX.test_3[32][34]:=t*0.2406378906553946;
+Q_RELAX.test_3[32][35]:=AT*t*Min(1000,RELAX.test.omega_2^local_k)*0.2504957133922061;
+Q_RELAX.test_3[32][36]:=AC*t*Min(1000,RELAX.test.omega_2^local_k)*0.1351200521140052;
+Q_RELAX.test_3[32][40]:=t*Min(1000,RELAX.test.omega_2^local_k)*0.1344351325741675;
+Q_RELAX.test_3[32][44]:=AT*t*Min(1000,RELAX.test.omega_2^local_k)*0.2296926126195792;
+Q_RELAX.test_3[33][1]:=t*Min(1000,RELAX.test.omega_2^local_k)*0.3222350398108426;
+Q_RELAX.test_3[33][17]:=CG*t*Min(1000,RELAX.test.omega_2^local_k)*0.1214054057357627;
+Q_RELAX.test_3[33][32]:=AC*t*Min(1000,RELAX.test.omega_2^local_k)*0.3824103826488193;
+Q_RELAX.test_3[33][34]:=CG*t*Min(1000,RELAX.test.omega_2^local_k)*0.2406378906553946;
+Q_RELAX.test_3[33][35]:=CT*t*0.2504957133922061;
+Q_RELAX.test_3[33][37]:=AC*t*Min(1000,RELAX.test.omega_2^local_k)*0.1351200521140052;
+Q_RELAX.test_3[33][41]:=t*Min(1000,RELAX.test.omega_2^local_k)*0.1344351325741675;
+Q_RELAX.test_3[33][45]:=AT*t*Min(1000,RELAX.test.omega_2^local_k)*0.2296926126195792;
+Q_RELAX.test_3[33][48]:=GT*t*Min(1000,RELAX.test.omega_2^local_k)*0.250994522453953;
+Q_RELAX.test_3[34][2]:=t*Min(1000,RELAX.test.omega_2^local_k)*0.3222350398108426;
+Q_RELAX.test_3[34][18]:=CG*t*Min(1000,RELAX.test.omega_2^local_k)*0.1214054057357627;
+Q_RELAX.test_3[34][32]:=t*0.3824103826488193;
+Q_RELAX.test_3[34][33]:=CG*t*Min(1000,RELAX.test.omega_2^local_k)*0.1264560133035801;
+Q_RELAX.test_3[34][35]:=GT*t*Min(1000,RELAX.test.omega_2^local_k)*0.2504957133922061;
+Q_RELAX.test_3[34][38]:=AC*t*Min(1000,RELAX.test.omega_2^local_k)*0.1351200521140052;
+Q_RELAX.test_3[34][42]:=t*Min(1000,RELAX.test.omega_2^local_k)*0.1344351325741675;
+Q_RELAX.test_3[34][46]:=AT*t*Min(1000,RELAX.test.omega_2^local_k)*0.2296926126195792;
+Q_RELAX.test_3[35][3]:=t*Min(1000,RELAX.test.omega_2^local_k)*0.3222350398108426;
+Q_RELAX.test_3[35][19]:=CG*t*Min(1000,RELAX.test.omega_2^local_k)*0.1214054057357627;
+Q_RELAX.test_3[35][32]:=AT*t*Min(1000,RELAX.test.omega_2^local_k)*0.3824103826488193;
+Q_RELAX.test_3[35][33]:=CT*t*0.1264560133035801;
+Q_RELAX.test_3[35][34]:=GT*t*Min(1000,RELAX.test.omega_2^local_k)*0.2406378906553946;
+Q_RELAX.test_3[35][39]:=AC*t*Min(1000,RELAX.test.omega_2^local_k)*0.1351200521140052;
+Q_RELAX.test_3[35][43]:=t*Min(1000,RELAX.test.omega_2^local_k)*0.1344351325741675;
+Q_RELAX.test_3[35][47]:=AT*t*Min(1000,RELAX.test.omega_2^local_k)*0.2296926126195792;
+Q_RELAX.test_3[35][49]:=GT*t*Min(1000,RELAX.test.omega_2^local_k)*0.250994522453953;
+Q_RELAX.test_3[36][4]:=t*Min(1000,RELAX.test.omega_2^local_k)*0.3222350398108426;
+Q_RELAX.test_3[36][20]:=CG*t*Min(1000,RELAX.test.omega_2^local_k)*0.1214054057357627;
+Q_RELAX.test_3[36][32]:=AC*t*Min(1000,RELAX.test.omega_2^local_k)*0.5007522026922482;
+Q_RELAX.test_3[36][37]:=AC*t*0.1264560133035801;
+Q_RELAX.test_3[36][38]:=t*0.2406378906553946;
+Q_RELAX.test_3[36][39]:=AT*t*0.2504957133922061;
+Q_RELAX.test_3[36][40]:=CG*t*Min(1000,RELAX.test.omega_2^local_k)*0.1344351325741675;
+Q_RELAX.test_3[36][44]:=CT*t*Min(1000,RELAX.test.omega_2^local_k)*0.2296926126195792;
+Q_RELAX.test_3[36][50]:=GT*t*Min(1000,RELAX.test.omega_2^local_k)*0.250994522453953;
+Q_RELAX.test_3[37][5]:=t*Min(1000,RELAX.test.omega_2^local_k)*0.3222350398108426;
+Q_RELAX.test_3[37][21]:=CG*t*Min(1000,RELAX.test.omega_2^local_k)*0.1214054057357627;
+Q_RELAX.test_3[37][33]:=AC*t*Min(1000,RELAX.test.omega_2^local_k)*0.5007522026922482;
+Q_RELAX.test_3[37][36]:=AC*t*0.3824103826488193;
+Q_RELAX.test_3[37][38]:=CG*t*0.2406378906553946;
+Q_RELAX.test_3[37][39]:=CT*t*0.2504957133922061;
+Q_RELAX.test_3[37][41]:=CG*t*Min(1000,RELAX.test.omega_2^local_k)*0.1344351325741675;
+Q_RELAX.test_3[37][45]:=CT*t*Min(1000,RELAX.test.omega_2^local_k)*0.2296926126195792;
+Q_RELAX.test_3[37][51]:=GT*t*Min(1000,RELAX.test.omega_2^local_k)*0.250994522453953;
+Q_RELAX.test_3[38][6]:=t*Min(1000,RELAX.test.omega_2^local_k)*0.3222350398108426;
+Q_RELAX.test_3[38][22]:=CG*t*Min(1000,RELAX.test.omega_2^local_k)*0.1214054057357627;
+Q_RELAX.test_3[38][34]:=AC*t*Min(1000,RELAX.test.omega_2^local_k)*0.5007522026922482;
+Q_RELAX.test_3[38][36]:=t*0.3824103826488193;
+Q_RELAX.test_3[38][37]:=CG*t*0.1264560133035801;
+Q_RELAX.test_3[38][39]:=GT*t*0.2504957133922061;
+Q_RELAX.test_3[38][42]:=CG*t*Min(1000,RELAX.test.omega_2^local_k)*0.1344351325741675;
+Q_RELAX.test_3[38][46]:=CT*t*Min(1000,RELAX.test.omega_2^local_k)*0.2296926126195792;
+Q_RELAX.test_3[38][52]:=GT*t*Min(1000,RELAX.test.omega_2^local_k)*0.250994522453953;
+Q_RELAX.test_3[39][7]:=t*Min(1000,RELAX.test.omega_2^local_k)*0.3222350398108426;
+Q_RELAX.test_3[39][23]:=CG*t*Min(1000,RELAX.test.omega_2^local_k)*0.1214054057357627;
+Q_RELAX.test_3[39][35]:=AC*t*Min(1000,RELAX.test.omega_2^local_k)*0.5007522026922482;
+Q_RELAX.test_3[39][36]:=AT*t*0.3824103826488193;
+Q_RELAX.test_3[39][37]:=CT*t*0.1264560133035801;
+Q_RELAX.test_3[39][38]:=GT*t*0.2406378906553946;
+Q_RELAX.test_3[39][43]:=CG*t*Min(1000,RELAX.test.omega_2^local_k)*0.1344351325741675;
+Q_RELAX.test_3[39][47]:=CT*t*Min(1000,RELAX.test.omega_2^local_k)*0.2296926126195792;
+Q_RELAX.test_3[39][53]:=GT*t*Min(1000,RELAX.test.omega_2^local_k)*0.250994522453953;
+Q_RELAX.test_3[40][8]:=t*Min(1000,RELAX.test.omega_2^local_k)*0.3222350398108426;
+Q_RELAX.test_3[40][24]:=CG*t*Min(1000,RELAX.test.omega_2^local_k)*0.1214054057357627;
+Q_RELAX.test_3[40][32]:=t*Min(1000,RELAX.test.omega_2^local_k)*0.5007522026922482;
+Q_RELAX.test_3[40][36]:=CG*t*Min(1000,RELAX.test.omega_2^local_k)*0.1351200521140052;
+Q_RELAX.test_3[40][41]:=AC*t*0.1264560133035801;
+Q_RELAX.test_3[40][42]:=t*0.2406378906553946;
+Q_RELAX.test_3[40][43]:=AT*t*0.2504957133922061;
+Q_RELAX.test_3[40][44]:=GT*t*Min(1000,RELAX.test.omega_2^local_k)*0.2296926126195792;
+Q_RELAX.test_3[41][9]:=t*Min(1000,RELAX.test.omega_2^local_k)*0.3222350398108426;
+Q_RELAX.test_3[41][25]:=CG*t*Min(1000,RELAX.test.omega_2^local_k)*0.1214054057357627;
+Q_RELAX.test_3[41][33]:=t*Min(1000,RELAX.test.omega_2^local_k)*0.5007522026922482;
+Q_RELAX.test_3[41][37]:=CG*t*Min(1000,RELAX.test.omega_2^local_k)*0.1351200521140052;
+Q_RELAX.test_3[41][40]:=AC*t*0.3824103826488193;
+Q_RELAX.test_3[41][42]:=CG*t*0.2406378906553946;
+Q_RELAX.test_3[41][43]:=CT*t*0.2504957133922061;
+Q_RELAX.test_3[41][45]:=GT*t*Min(1000,RELAX.test.omega_2^local_k)*0.2296926126195792;
+Q_RELAX.test_3[41][54]:=GT*t*Min(1000,RELAX.test.omega_2^local_k)*0.250994522453953;
+Q_RELAX.test_3[42][10]:=t*Min(1000,RELAX.test.omega_2^local_k)*0.3222350398108426;
+Q_RELAX.test_3[42][26]:=CG*t*Min(1000,RELAX.test.omega_2^local_k)*0.1214054057357627;
+Q_RELAX.test_3[42][34]:=t*Min(1000,RELAX.test.omega_2^local_k)*0.5007522026922482;
+Q_RELAX.test_3[42][38]:=CG*t*Min(1000,RELAX.test.omega_2^local_k)*0.1351200521140052;
+Q_RELAX.test_3[42][40]:=t*0.3824103826488193;
+Q_RELAX.test_3[42][41]:=CG*t*0.1264560133035801;
+Q_RELAX.test_3[42][43]:=GT*t*0.2504957133922061;
+Q_RELAX.test_3[42][46]:=GT*t*Min(1000,RELAX.test.omega_2^local_k)*0.2296926126195792;
+Q_RELAX.test_3[42][55]:=GT*t*Min(1000,RELAX.test.omega_2^local_k)*0.250994522453953;
+Q_RELAX.test_3[43][11]:=t*Min(1000,RELAX.test.omega_2^local_k)*0.3222350398108426;
+Q_RELAX.test_3[43][27]:=CG*t*Min(1000,RELAX.test.omega_2^local_k)*0.1214054057357627;
+Q_RELAX.test_3[43][35]:=t*Min(1000,RELAX.test.omega_2^local_k)*0.5007522026922482;
+Q_RELAX.test_3[43][39]:=CG*t*Min(1000,RELAX.test.omega_2^local_k)*0.1351200521140052;
+Q_RELAX.test_3[43][40]:=AT*t*0.3824103826488193;
+Q_RELAX.test_3[43][41]:=CT*t*0.1264560133035801;
+Q_RELAX.test_3[43][42]:=GT*t*0.2406378906553946;
+Q_RELAX.test_3[43][47]:=GT*t*Min(1000,RELAX.test.omega_2^local_k)*0.2296926126195792;
+Q_RELAX.test_3[43][56]:=GT*t*Min(1000,RELAX.test.omega_2^local_k)*0.250994522453953;
+Q_RELAX.test_3[44][12]:=t*Min(1000,RELAX.test.omega_2^local_k)*0.3222350398108426;
+Q_RELAX.test_3[44][28]:=CG*t*Min(1000,RELAX.test.omega_2^local_k)*0.1214054057357627;
+Q_RELAX.test_3[44][32]:=AT*t*Min(1000,RELAX.test.omega_2^local_k)*0.5007522026922482;
+Q_RELAX.test_3[44][36]:=CT*t*Min(1000,RELAX.test.omega_2^local_k)*0.1351200521140052;
+Q_RELAX.test_3[44][40]:=GT*t*Min(1000,RELAX.test.omega_2^local_k)*0.1344351325741675;
+Q_RELAX.test_3[44][45]:=AC*t*0.1264560133035801;
+Q_RELAX.test_3[44][46]:=t*0.2406378906553946;
+Q_RELAX.test_3[44][47]:=AT*t*0.2504957133922061;
+Q_RELAX.test_3[44][57]:=GT*t*Min(1000,RELAX.test.omega_2^local_k)*0.250994522453953;
+Q_RELAX.test_3[45][13]:=t*Min(1000,RELAX.test.omega_2^local_k)*0.3222350398108426;
+Q_RELAX.test_3[45][29]:=CG*t*Min(1000,RELAX.test.omega_2^local_k)*0.1214054057357627;
+Q_RELAX.test_3[45][33]:=AT*t*Min(1000,RELAX.test.omega_2^local_k)*0.5007522026922482;
+Q_RELAX.test_3[45][37]:=CT*t*Min(1000,RELAX.test.omega_2^local_k)*0.1351200521140052;
+Q_RELAX.test_3[45][41]:=GT*t*Min(1000,RELAX.test.omega_2^local_k)*0.1344351325741675;
+Q_RELAX.test_3[45][44]:=AC*t*0.3824103826488193;
+Q_RELAX.test_3[45][46]:=CG*t*0.2406378906553946;
+Q_RELAX.test_3[45][47]:=CT*t*0.2504957133922061;
+Q_RELAX.test_3[45][58]:=GT*t*Min(1000,RELAX.test.omega_2^local_k)*0.250994522453953;
+Q_RELAX.test_3[46][14]:=t*Min(1000,RELAX.test.omega_2^local_k)*0.3222350398108426;
+Q_RELAX.test_3[46][30]:=CG*t*Min(1000,RELAX.test.omega_2^local_k)*0.1214054057357627;
+Q_RELAX.test_3[46][34]:=AT*t*Min(1000,RELAX.test.omega_2^local_k)*0.5007522026922482;
+Q_RELAX.test_3[46][38]:=CT*t*Min(1000,RELAX.test.omega_2^local_k)*0.1351200521140052;
+Q_RELAX.test_3[46][42]:=GT*t*Min(1000,RELAX.test.omega_2^local_k)*0.1344351325741675;
+Q_RELAX.test_3[46][44]:=t*0.3824103826488193;
+Q_RELAX.test_3[46][45]:=CG*t*0.1264560133035801;
+Q_RELAX.test_3[46][47]:=GT*t*0.2504957133922061;
+Q_RELAX.test_3[46][59]:=GT*t*Min(1000,RELAX.test.omega_2^local_k)*0.250994522453953;
+Q_RELAX.test_3[47][15]:=t*Min(1000,RELAX.test.omega_2^local_k)*0.3222350398108426;
+Q_RELAX.test_3[47][31]:=CG*t*Min(1000,RELAX.test.omega_2^local_k)*0.1214054057357627;
+Q_RELAX.test_3[47][35]:=AT*t*Min(1000,RELAX.test.omega_2^local_k)*0.5007522026922482;
+Q_RELAX.test_3[47][39]:=CT*t*Min(1000,RELAX.test.omega_2^local_k)*0.1351200521140052;
+Q_RELAX.test_3[47][43]:=GT*t*Min(1000,RELAX.test.omega_2^local_k)*0.1344351325741675;
+Q_RELAX.test_3[47][44]:=AT*t*0.3824103826488193;
+Q_RELAX.test_3[47][45]:=CT*t*0.1264560133035801;
+Q_RELAX.test_3[47][46]:=GT*t*0.2406378906553946;
+Q_RELAX.test_3[47][60]:=GT*t*Min(1000,RELAX.test.omega_2^local_k)*0.250994522453953;
+Q_RELAX.test_3[48][1]:=AT*t*Min(1000,RELAX.test.omega_2^local_k)*0.3222350398108426;
+Q_RELAX.test_3[48][17]:=CT*t*Min(1000,RELAX.test.omega_2^local_k)*0.1214054057357627;
+Q_RELAX.test_3[48][33]:=GT*t*Min(1000,RELAX.test.omega_2^local_k)*0.3053650319994416;
+Q_RELAX.test_3[48][49]:=CT*t*0.2504957133922061;
+Q_RELAX.test_3[48][51]:=AC*t*Min(1000,RELAX.test.omega_2^local_k)*0.1351200521140052;
+Q_RELAX.test_3[48][54]:=t*Min(1000,RELAX.test.omega_2^local_k)*0.1344351325741675;
+Q_RELAX.test_3[48][58]:=AT*t*Min(1000,RELAX.test.omega_2^local_k)*0.2296926126195792;
+Q_RELAX.test_3[49][3]:=AT*t*Min(1000,RELAX.test.omega_2^local_k)*0.3222350398108426;
+Q_RELAX.test_3[49][19]:=CT*t*Min(1000,RELAX.test.omega_2^local_k)*0.1214054057357627;
+Q_RELAX.test_3[49][35]:=GT*t*Min(1000,RELAX.test.omega_2^local_k)*0.3053650319994416;
+Q_RELAX.test_3[49][48]:=CT*t*0.1264560133035801;
+Q_RELAX.test_3[49][53]:=AC*t*Min(1000,RELAX.test.omega_2^local_k)*0.1351200521140052;
+Q_RELAX.test_3[49][56]:=t*Min(1000,RELAX.test.omega_2^local_k)*0.1344351325741675;
+Q_RELAX.test_3[49][60]:=AT*t*Min(1000,RELAX.test.omega_2^local_k)*0.2296926126195792;
+Q_RELAX.test_3[50][4]:=AT*t*Min(1000,RELAX.test.omega_2^local_k)*0.3222350398108426;
+Q_RELAX.test_3[50][20]:=CT*t*Min(1000,RELAX.test.omega_2^local_k)*0.1214054057357627;
+Q_RELAX.test_3[50][36]:=GT*t*Min(1000,RELAX.test.omega_2^local_k)*0.3053650319994416;
+Q_RELAX.test_3[50][51]:=AC*t*0.1264560133035801;
+Q_RELAX.test_3[50][52]:=t*0.2406378906553946;
+Q_RELAX.test_3[50][53]:=AT*t*0.2504957133922061;
+Q_RELAX.test_3[50][57]:=CT*t*Min(1000,RELAX.test.omega_2^local_k)*0.2296926126195792;
+Q_RELAX.test_3[51][5]:=AT*t*Min(1000,RELAX.test.omega_2^local_k)*0.3222350398108426;
+Q_RELAX.test_3[51][21]:=CT*t*Min(1000,RELAX.test.omega_2^local_k)*0.1214054057357627;
+Q_RELAX.test_3[51][37]:=GT*t*Min(1000,RELAX.test.omega_2^local_k)*0.3053650319994416;
+Q_RELAX.test_3[51][48]:=AC*t*Min(1000,RELAX.test.omega_2^local_k)*0.5007522026922482;
+Q_RELAX.test_3[51][50]:=AC*t*0.3824103826488193;
+Q_RELAX.test_3[51][52]:=CG*t*0.2406378906553946;
+Q_RELAX.test_3[51][53]:=CT*t*0.2504957133922061;
+Q_RELAX.test_3[51][54]:=CG*t*Min(1000,RELAX.test.omega_2^local_k)*0.1344351325741675;
+Q_RELAX.test_3[51][58]:=CT*t*Min(1000,RELAX.test.omega_2^local_k)*0.2296926126195792;
+Q_RELAX.test_3[52][6]:=AT*t*Min(1000,RELAX.test.omega_2^local_k)*0.3222350398108426;
+Q_RELAX.test_3[52][22]:=CT*t*Min(1000,RELAX.test.omega_2^local_k)*0.1214054057357627;
+Q_RELAX.test_3[52][38]:=GT*t*Min(1000,RELAX.test.omega_2^local_k)*0.3053650319994416;
+Q_RELAX.test_3[52][50]:=t*0.3824103826488193;
+Q_RELAX.test_3[52][51]:=CG*t*0.1264560133035801;
+Q_RELAX.test_3[52][53]:=GT*t*0.2504957133922061;
+Q_RELAX.test_3[52][55]:=CG*t*Min(1000,RELAX.test.omega_2^local_k)*0.1344351325741675;
+Q_RELAX.test_3[52][59]:=CT*t*Min(1000,RELAX.test.omega_2^local_k)*0.2296926126195792;
+Q_RELAX.test_3[53][7]:=AT*t*Min(1000,RELAX.test.omega_2^local_k)*0.3222350398108426;
+Q_RELAX.test_3[53][23]:=CT*t*Min(1000,RELAX.test.omega_2^local_k)*0.1214054057357627;
+Q_RELAX.test_3[53][39]:=GT*t*Min(1000,RELAX.test.omega_2^local_k)*0.3053650319994416;
+Q_RELAX.test_3[53][49]:=AC*t*Min(1000,RELAX.test.omega_2^local_k)*0.5007522026922482;
+Q_RELAX.test_3[53][50]:=AT*t*0.3824103826488193;
+Q_RELAX.test_3[53][51]:=CT*t*0.1264560133035801;
+Q_RELAX.test_3[53][52]:=GT*t*0.2406378906553946;
+Q_RELAX.test_3[53][56]:=CG*t*Min(1000,RELAX.test.omega_2^local_k)*0.1344351325741675;
+Q_RELAX.test_3[53][60]:=CT*t*Min(1000,RELAX.test.omega_2^local_k)*0.2296926126195792;
+Q_RELAX.test_3[54][9]:=AT*t*Min(1000,RELAX.test.omega_2^local_k)*0.3222350398108426;
+Q_RELAX.test_3[54][25]:=CT*t*Min(1000,RELAX.test.omega_2^local_k)*0.1214054057357627;
+Q_RELAX.test_3[54][41]:=GT*t*Min(1000,RELAX.test.omega_2^local_k)*0.3053650319994416;
+Q_RELAX.test_3[54][48]:=t*Min(1000,RELAX.test.omega_2^local_k)*0.5007522026922482;
+Q_RELAX.test_3[54][51]:=CG*t*Min(1000,RELAX.test.omega_2^local_k)*0.1351200521140052;
+Q_RELAX.test_3[54][55]:=CG*t*Min(1000,RELAX.test.omega_2^local_k)*0.2406378906553946;
+Q_RELAX.test_3[54][56]:=CT*t*0.2504957133922061;
+Q_RELAX.test_3[54][58]:=GT*t*Min(1000,RELAX.test.omega_2^local_k)*0.2296926126195792;
+Q_RELAX.test_3[55][10]:=AT*t*Min(1000,RELAX.test.omega_2^local_k)*0.3222350398108426;
+Q_RELAX.test_3[55][26]:=CT*t*Min(1000,RELAX.test.omega_2^local_k)*0.1214054057357627;
+Q_RELAX.test_3[55][42]:=GT*t*Min(1000,RELAX.test.omega_2^local_k)*0.3053650319994416;
+Q_RELAX.test_3[55][52]:=CG*t*Min(1000,RELAX.test.omega_2^local_k)*0.1351200521140052;
+Q_RELAX.test_3[55][54]:=CG*t*Min(1000,RELAX.test.omega_2^local_k)*0.1264560133035801;
+Q_RELAX.test_3[55][56]:=GT*t*Min(1000,RELAX.test.omega_2^local_k)*0.2504957133922061;
+Q_RELAX.test_3[55][59]:=GT*t*Min(1000,RELAX.test.omega_2^local_k)*0.2296926126195792;
+Q_RELAX.test_3[56][11]:=AT*t*Min(1000,RELAX.test.omega_2^local_k)*0.3222350398108426;
+Q_RELAX.test_3[56][27]:=CT*t*Min(1000,RELAX.test.omega_2^local_k)*0.1214054057357627;
+Q_RELAX.test_3[56][43]:=GT*t*Min(1000,RELAX.test.omega_2^local_k)*0.3053650319994416;
+Q_RELAX.test_3[56][49]:=t*Min(1000,RELAX.test.omega_2^local_k)*0.5007522026922482;
+Q_RELAX.test_3[56][53]:=CG*t*Min(1000,RELAX.test.omega_2^local_k)*0.1351200521140052;
+Q_RELAX.test_3[56][54]:=CT*t*0.1264560133035801;
+Q_RELAX.test_3[56][55]:=GT*t*Min(1000,RELAX.test.omega_2^local_k)*0.2406378906553946;
+Q_RELAX.test_3[56][60]:=GT*t*Min(1000,RELAX.test.omega_2^local_k)*0.2296926126195792;
+Q_RELAX.test_3[57][12]:=AT*t*Min(1000,RELAX.test.omega_2^local_k)*0.3222350398108426;
+Q_RELAX.test_3[57][28]:=CT*t*0.1214054057357627;
+Q_RELAX.test_3[57][44]:=GT*t*Min(1000,RELAX.test.omega_2^local_k)*0.3053650319994416;
+Q_RELAX.test_3[57][50]:=CT*t*Min(1000,RELAX.test.omega_2^local_k)*0.1351200521140052;
+Q_RELAX.test_3[57][58]:=AC*t*Min(1000,RELAX.test.omega_2^local_k)*0.1264560133035801;
+Q_RELAX.test_3[57][59]:=t*0.2406378906553946;
+Q_RELAX.test_3[57][60]:=AT*t*Min(1000,RELAX.test.omega_2^local_k)*0.2504957133922061;
+Q_RELAX.test_3[58][13]:=AT*t*Min(1000,RELAX.test.omega_2^local_k)*0.3222350398108426;
+Q_RELAX.test_3[58][29]:=CT*t*Min(1000,RELAX.test.omega_2^local_k)*0.1214054057357627;
+Q_RELAX.test_3[58][45]:=GT*t*Min(1000,RELAX.test.omega_2^local_k)*0.3053650319994416;
+Q_RELAX.test_3[58][48]:=AT*t*Min(1000,RELAX.test.omega_2^local_k)*0.5007522026922482;
+Q_RELAX.test_3[58][51]:=CT*t*Min(1000,RELAX.test.omega_2^local_k)*0.1351200521140052;
+Q_RELAX.test_3[58][54]:=GT*t*Min(1000,RELAX.test.omega_2^local_k)*0.1344351325741675;
+Q_RELAX.test_3[58][57]:=AC*t*Min(1000,RELAX.test.omega_2^local_k)*0.3824103826488193;
+Q_RELAX.test_3[58][59]:=CG*t*Min(1000,RELAX.test.omega_2^local_k)*0.2406378906553946;
+Q_RELAX.test_3[58][60]:=CT*t*0.2504957133922061;
+Q_RELAX.test_3[59][14]:=AT*t*Min(1000,RELAX.test.omega_2^local_k)*0.3222350398108426;
+Q_RELAX.test_3[59][30]:=CT*t*0.1214054057357627;
+Q_RELAX.test_3[59][46]:=GT*t*Min(1000,RELAX.test.omega_2^local_k)*0.3053650319994416;
+Q_RELAX.test_3[59][52]:=CT*t*Min(1000,RELAX.test.omega_2^local_k)*0.1351200521140052;
+Q_RELAX.test_3[59][55]:=GT*t*Min(1000,RELAX.test.omega_2^local_k)*0.1344351325741675;
+Q_RELAX.test_3[59][57]:=t*0.3824103826488193;
+Q_RELAX.test_3[59][58]:=CG*t*Min(1000,RELAX.test.omega_2^local_k)*0.1264560133035801;
+Q_RELAX.test_3[59][60]:=GT*t*Min(1000,RELAX.test.omega_2^local_k)*0.2504957133922061;
+Q_RELAX.test_3[60][15]:=AT*t*Min(1000,RELAX.test.omega_2^local_k)*0.3222350398108426;
+Q_RELAX.test_3[60][31]:=CT*t*Min(1000,RELAX.test.omega_2^local_k)*0.1214054057357627;
+Q_RELAX.test_3[60][47]:=GT*t*Min(1000,RELAX.test.omega_2^local_k)*0.3053650319994416;
+Q_RELAX.test_3[60][49]:=AT*t*Min(1000,RELAX.test.omega_2^local_k)*0.5007522026922482;
+Q_RELAX.test_3[60][53]:=CT*t*Min(1000,RELAX.test.omega_2^local_k)*0.1351200521140052;
+Q_RELAX.test_3[60][56]:=GT*t*Min(1000,RELAX.test.omega_2^local_k)*0.1344351325741675;
+Q_RELAX.test_3[60][57]:=AT*t*Min(1000,RELAX.test.omega_2^local_k)*0.3824103826488193;
+Q_RELAX.test_3[60][58]:=CT*t*0.1264560133035801;
+Q_RELAX.test_3[60][59]:=GT*t*Min(1000,RELAX.test.omega_2^local_k)*0.2406378906553946;
+
+
+RELAX.test_model_eqf={
+{0.06789889450438902}
+{0.02245290372942207}
+{0.04272647263966693}
+{0.04447677884582558}
+{0.01832144145265965}
+{0.006058560513002445}
+{0.01152906203643302}
+{0.01200135444876809}
+{0.01822857060889821}
+{0.006027849849309518}
+{0.01147062156263798}
+{0.01194051993873147}
+{0.03114489439855585}
+{0.01029903830832752}
+{0.01959842627922601}
+{0.0204012832676034}
+{0.0255816153362901}
+{0.008459365216199515}
+{0.0160976433522615}
+{0.01675708943622944}
+{0.006902793794647167}
+{0.002282625743269596}
+{0.004343694140486931}
+{0.004521635223427881}
+{0.00686780373746872}
+{0.002271055181023346}
+{0.004321676083615643}
+{0.004498715188480508}
+{0.01173416318496511}
+{0.003880269896298824}
+{0.007383911121548391}
+{0.007686395849711308}
+{0.06434417593204837}
+{0.02127742429823938}
+{0.04048960874178697}
+{0.04214828096739659}
+{0.01736225693751837}
+{0.005741376003086347}
+{0.01092547973598884}
+{0.0113730461697648}
+{0.01727424817163843}
+{0.005712273138274315}
+{0.01087009880298738}
+{0.01131539653577432}
+{0.02951436218797651}
+{0.009759851580486268}
+{0.01857238763173507}
+{0.01933321255658108}
+{0.01748896039542764}
+{0.03464374288175238}
+{0.01427089198858639}
+{0.004719119012048105}
+{0.008980188566318471}
+{0.00934806540727982}
+{0.004695197937628716}
+{0.008934668256606717}
+{0.009300680340763385}
+{0.02425930432963823}
+{0.008022101517733991}
+{0.01526555786015987}
+{0.01589091724539275}
+}
+;
+Model RELAX.test_model=("Exp(Q_RELAX.test_1)*RELAX.test.aux_freq_0+Exp(Q_RELAX.test_2)*(1-RELAX.test.aux_freq_0)*RELAX.test.aux_freq_1+Exp(Q_RELAX.test_3)*(1-RELAX.test.aux_freq_0)*(1-RELAX.test.aux_freq_1)",RELAX.test_model_eqf,EXPLICIT_FORM_MATRIX_EXPONENTIAL);
+
+Q_RELAX.reference_1={61,61};
+Q_RELAX.reference_1[0][1]:=AC*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1264560133035801;
+Q_RELAX.reference_1[0][2]:=t*0.2406378906553946;
+Q_RELAX.reference_1[0][3]:=AT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.2504957133922061;
+Q_RELAX.reference_1[0][4]:=AC*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1351200521140052;
+Q_RELAX.reference_1[0][8]:=t*Min(1000,RELAX.reference.omega_0^local_k)*0.1344351325741675;
+Q_RELAX.reference_1[0][12]:=AT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.2296926126195792;
+Q_RELAX.reference_1[0][16]:=AC*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1214054057357627;
+Q_RELAX.reference_1[0][32]:=t*Min(1000,RELAX.reference.omega_0^local_k)*0.3053650319994416;
+Q_RELAX.reference_1[1][0]:=AC*t*Min(1000,RELAX.reference.omega_0^local_k)*0.3824103826488193;
+Q_RELAX.reference_1[1][2]:=CG*t*Min(1000,RELAX.reference.omega_0^local_k)*0.2406378906553946;
+Q_RELAX.reference_1[1][3]:=CT*t*0.2504957133922061;
+Q_RELAX.reference_1[1][5]:=AC*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1351200521140052;
+Q_RELAX.reference_1[1][9]:=t*Min(1000,RELAX.reference.omega_0^local_k)*0.1344351325741675;
+Q_RELAX.reference_1[1][13]:=AT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.2296926126195792;
+Q_RELAX.reference_1[1][17]:=AC*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1214054057357627;
+Q_RELAX.reference_1[1][33]:=t*Min(1000,RELAX.reference.omega_0^local_k)*0.3053650319994416;
+Q_RELAX.reference_1[1][48]:=AT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.250994522453953;
+Q_RELAX.reference_1[2][0]:=t*0.3824103826488193;
+Q_RELAX.reference_1[2][1]:=CG*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1264560133035801;
+Q_RELAX.reference_1[2][3]:=GT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.2504957133922061;
+Q_RELAX.reference_1[2][6]:=AC*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1351200521140052;
+Q_RELAX.reference_1[2][10]:=t*Min(1000,RELAX.reference.omega_0^local_k)*0.1344351325741675;
+Q_RELAX.reference_1[2][14]:=AT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.2296926126195792;
+Q_RELAX.reference_1[2][18]:=AC*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1214054057357627;
+Q_RELAX.reference_1[2][34]:=t*Min(1000,RELAX.reference.omega_0^local_k)*0.3053650319994416;
+Q_RELAX.reference_1[3][0]:=AT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.3824103826488193;
+Q_RELAX.reference_1[3][1]:=CT*t*0.1264560133035801;
+Q_RELAX.reference_1[3][2]:=GT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.2406378906553946;
+Q_RELAX.reference_1[3][7]:=AC*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1351200521140052;
+Q_RELAX.reference_1[3][11]:=t*Min(1000,RELAX.reference.omega_0^local_k)*0.1344351325741675;
+Q_RELAX.reference_1[3][15]:=AT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.2296926126195792;
+Q_RELAX.reference_1[3][19]:=AC*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1214054057357627;
+Q_RELAX.reference_1[3][35]:=t*Min(1000,RELAX.reference.omega_0^local_k)*0.3053650319994416;
+Q_RELAX.reference_1[3][49]:=AT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.250994522453953;
+Q_RELAX.reference_1[4][0]:=AC*t*Min(1000,RELAX.reference.omega_0^local_k)*0.5007522026922482;
+Q_RELAX.reference_1[4][5]:=AC*t*0.1264560133035801;
+Q_RELAX.reference_1[4][6]:=t*0.2406378906553946;
+Q_RELAX.reference_1[4][7]:=AT*t*0.2504957133922061;
+Q_RELAX.reference_1[4][8]:=CG*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1344351325741675;
+Q_RELAX.reference_1[4][12]:=CT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.2296926126195792;
+Q_RELAX.reference_1[4][20]:=AC*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1214054057357627;
+Q_RELAX.reference_1[4][36]:=t*Min(1000,RELAX.reference.omega_0^local_k)*0.3053650319994416;
+Q_RELAX.reference_1[4][50]:=AT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.250994522453953;
+Q_RELAX.reference_1[5][1]:=AC*t*Min(1000,RELAX.reference.omega_0^local_k)*0.5007522026922482;
+Q_RELAX.reference_1[5][4]:=AC*t*0.3824103826488193;
+Q_RELAX.reference_1[5][6]:=CG*t*0.2406378906553946;
+Q_RELAX.reference_1[5][7]:=CT*t*0.2504957133922061;
+Q_RELAX.reference_1[5][9]:=CG*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1344351325741675;
+Q_RELAX.reference_1[5][13]:=CT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.2296926126195792;
+Q_RELAX.reference_1[5][21]:=AC*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1214054057357627;
+Q_RELAX.reference_1[5][37]:=t*Min(1000,RELAX.reference.omega_0^local_k)*0.3053650319994416;
+Q_RELAX.reference_1[5][51]:=AT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.250994522453953;
+Q_RELAX.reference_1[6][2]:=AC*t*Min(1000,RELAX.reference.omega_0^local_k)*0.5007522026922482;
+Q_RELAX.reference_1[6][4]:=t*0.3824103826488193;
+Q_RELAX.reference_1[6][5]:=CG*t*0.1264560133035801;
+Q_RELAX.reference_1[6][7]:=GT*t*0.2504957133922061;
+Q_RELAX.reference_1[6][10]:=CG*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1344351325741675;
+Q_RELAX.reference_1[6][14]:=CT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.2296926126195792;
+Q_RELAX.reference_1[6][22]:=AC*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1214054057357627;
+Q_RELAX.reference_1[6][38]:=t*Min(1000,RELAX.reference.omega_0^local_k)*0.3053650319994416;
+Q_RELAX.reference_1[6][52]:=AT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.250994522453953;
+Q_RELAX.reference_1[7][3]:=AC*t*Min(1000,RELAX.reference.omega_0^local_k)*0.5007522026922482;
+Q_RELAX.reference_1[7][4]:=AT*t*0.3824103826488193;
+Q_RELAX.reference_1[7][5]:=CT*t*0.1264560133035801;
+Q_RELAX.reference_1[7][6]:=GT*t*0.2406378906553946;
+Q_RELAX.reference_1[7][11]:=CG*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1344351325741675;
+Q_RELAX.reference_1[7][15]:=CT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.2296926126195792;
+Q_RELAX.reference_1[7][23]:=AC*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1214054057357627;
+Q_RELAX.reference_1[7][39]:=t*Min(1000,RELAX.reference.omega_0^local_k)*0.3053650319994416;
+Q_RELAX.reference_1[7][53]:=AT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.250994522453953;
+Q_RELAX.reference_1[8][0]:=t*Min(1000,RELAX.reference.omega_0^local_k)*0.5007522026922482;
+Q_RELAX.reference_1[8][4]:=CG*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1351200521140052;
+Q_RELAX.reference_1[8][9]:=AC*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1264560133035801;
+Q_RELAX.reference_1[8][10]:=t*0.2406378906553946;
+Q_RELAX.reference_1[8][11]:=AT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.2504957133922061;
+Q_RELAX.reference_1[8][12]:=GT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.2296926126195792;
+Q_RELAX.reference_1[8][24]:=AC*t*0.1214054057357627;
+Q_RELAX.reference_1[8][40]:=t*Min(1000,RELAX.reference.omega_0^local_k)*0.3053650319994416;
+Q_RELAX.reference_1[9][1]:=t*Min(1000,RELAX.reference.omega_0^local_k)*0.5007522026922482;
+Q_RELAX.reference_1[9][5]:=CG*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1351200521140052;
+Q_RELAX.reference_1[9][8]:=AC*t*Min(1000,RELAX.reference.omega_0^local_k)*0.3824103826488193;
+Q_RELAX.reference_1[9][10]:=CG*t*Min(1000,RELAX.reference.omega_0^local_k)*0.2406378906553946;
+Q_RELAX.reference_1[9][11]:=CT*t*0.2504957133922061;
+Q_RELAX.reference_1[9][13]:=GT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.2296926126195792;
+Q_RELAX.reference_1[9][25]:=AC*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1214054057357627;
+Q_RELAX.reference_1[9][41]:=t*Min(1000,RELAX.reference.omega_0^local_k)*0.3053650319994416;
+Q_RELAX.reference_1[9][54]:=AT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.250994522453953;
+Q_RELAX.reference_1[10][2]:=t*Min(1000,RELAX.reference.omega_0^local_k)*0.5007522026922482;
+Q_RELAX.reference_1[10][6]:=CG*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1351200521140052;
+Q_RELAX.reference_1[10][8]:=t*0.3824103826488193;
+Q_RELAX.reference_1[10][9]:=CG*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1264560133035801;
+Q_RELAX.reference_1[10][11]:=GT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.2504957133922061;
+Q_RELAX.reference_1[10][14]:=GT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.2296926126195792;
+Q_RELAX.reference_1[10][26]:=AC*t*0.1214054057357627;
+Q_RELAX.reference_1[10][42]:=t*Min(1000,RELAX.reference.omega_0^local_k)*0.3053650319994416;
+Q_RELAX.reference_1[10][55]:=AT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.250994522453953;
+Q_RELAX.reference_1[11][3]:=t*Min(1000,RELAX.reference.omega_0^local_k)*0.5007522026922482;
+Q_RELAX.reference_1[11][7]:=CG*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1351200521140052;
+Q_RELAX.reference_1[11][8]:=AT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.3824103826488193;
+Q_RELAX.reference_1[11][9]:=CT*t*0.1264560133035801;
+Q_RELAX.reference_1[11][10]:=GT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.2406378906553946;
+Q_RELAX.reference_1[11][15]:=GT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.2296926126195792;
+Q_RELAX.reference_1[11][27]:=AC*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1214054057357627;
+Q_RELAX.reference_1[11][43]:=t*Min(1000,RELAX.reference.omega_0^local_k)*0.3053650319994416;
+Q_RELAX.reference_1[11][56]:=AT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.250994522453953;
+Q_RELAX.reference_1[12][0]:=AT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.5007522026922482;
+Q_RELAX.reference_1[12][4]:=CT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1351200521140052;
+Q_RELAX.reference_1[12][8]:=GT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1344351325741675;
+Q_RELAX.reference_1[12][13]:=AC*t*0.1264560133035801;
+Q_RELAX.reference_1[12][14]:=t*Min(1000,RELAX.reference.omega_0^local_k)*0.2406378906553946;
+Q_RELAX.reference_1[12][15]:=AT*t*0.2504957133922061;
+Q_RELAX.reference_1[12][28]:=AC*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1214054057357627;
+Q_RELAX.reference_1[12][44]:=t*Min(1000,RELAX.reference.omega_0^local_k)*0.3053650319994416;
+Q_RELAX.reference_1[12][57]:=AT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.250994522453953;
+Q_RELAX.reference_1[13][1]:=AT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.5007522026922482;
+Q_RELAX.reference_1[13][5]:=CT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1351200521140052;
+Q_RELAX.reference_1[13][9]:=GT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1344351325741675;
+Q_RELAX.reference_1[13][12]:=AC*t*0.3824103826488193;
+Q_RELAX.reference_1[13][14]:=CG*t*Min(1000,RELAX.reference.omega_0^local_k)*0.2406378906553946;
+Q_RELAX.reference_1[13][15]:=CT*t*0.2504957133922061;
+Q_RELAX.reference_1[13][29]:=AC*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1214054057357627;
+Q_RELAX.reference_1[13][45]:=t*Min(1000,RELAX.reference.omega_0^local_k)*0.3053650319994416;
+Q_RELAX.reference_1[13][58]:=AT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.250994522453953;
+Q_RELAX.reference_1[14][2]:=AT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.5007522026922482;
+Q_RELAX.reference_1[14][6]:=CT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1351200521140052;
+Q_RELAX.reference_1[14][10]:=GT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1344351325741675;
+Q_RELAX.reference_1[14][12]:=t*Min(1000,RELAX.reference.omega_0^local_k)*0.3824103826488193;
+Q_RELAX.reference_1[14][13]:=CG*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1264560133035801;
+Q_RELAX.reference_1[14][15]:=GT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.2504957133922061;
+Q_RELAX.reference_1[14][30]:=AC*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1214054057357627;
+Q_RELAX.reference_1[14][46]:=t*Min(1000,RELAX.reference.omega_0^local_k)*0.3053650319994416;
+Q_RELAX.reference_1[14][59]:=AT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.250994522453953;
+Q_RELAX.reference_1[15][3]:=AT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.5007522026922482;
+Q_RELAX.reference_1[15][7]:=CT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1351200521140052;
+Q_RELAX.reference_1[15][11]:=GT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1344351325741675;
+Q_RELAX.reference_1[15][12]:=AT*t*0.3824103826488193;
+Q_RELAX.reference_1[15][13]:=CT*t*0.1264560133035801;
+Q_RELAX.reference_1[15][14]:=GT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.2406378906553946;
+Q_RELAX.reference_1[15][31]:=AC*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1214054057357627;
+Q_RELAX.reference_1[15][47]:=t*Min(1000,RELAX.reference.omega_0^local_k)*0.3053650319994416;
+Q_RELAX.reference_1[15][60]:=AT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.250994522453953;
+Q_RELAX.reference_1[16][0]:=AC*t*Min(1000,RELAX.reference.omega_0^local_k)*0.3222350398108426;
+Q_RELAX.reference_1[16][17]:=AC*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1264560133035801;
+Q_RELAX.reference_1[16][18]:=t*0.2406378906553946;
+Q_RELAX.reference_1[16][19]:=AT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.2504957133922061;
+Q_RELAX.reference_1[16][20]:=AC*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1351200521140052;
+Q_RELAX.reference_1[16][24]:=t*Min(1000,RELAX.reference.omega_0^local_k)*0.1344351325741675;
+Q_RELAX.reference_1[16][28]:=AT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.2296926126195792;
+Q_RELAX.reference_1[16][32]:=CG*t*Min(1000,RELAX.reference.omega_0^local_k)*0.3053650319994416;
+Q_RELAX.reference_1[17][1]:=AC*t*Min(1000,RELAX.reference.omega_0^local_k)*0.3222350398108426;
+Q_RELAX.reference_1[17][16]:=AC*t*Min(1000,RELAX.reference.omega_0^local_k)*0.3824103826488193;
+Q_RELAX.reference_1[17][18]:=CG*t*Min(1000,RELAX.reference.omega_0^local_k)*0.2406378906553946;
+Q_RELAX.reference_1[17][19]:=CT*t*0.2504957133922061;
+Q_RELAX.reference_1[17][21]:=AC*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1351200521140052;
+Q_RELAX.reference_1[17][25]:=t*Min(1000,RELAX.reference.omega_0^local_k)*0.1344351325741675;
+Q_RELAX.reference_1[17][29]:=AT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.2296926126195792;
+Q_RELAX.reference_1[17][33]:=CG*t*Min(1000,RELAX.reference.omega_0^local_k)*0.3053650319994416;
+Q_RELAX.reference_1[17][48]:=CT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.250994522453953;
+Q_RELAX.reference_1[18][2]:=AC*t*Min(1000,RELAX.reference.omega_0^local_k)*0.3222350398108426;
+Q_RELAX.reference_1[18][16]:=t*0.3824103826488193;
+Q_RELAX.reference_1[18][17]:=CG*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1264560133035801;
+Q_RELAX.reference_1[18][19]:=GT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.2504957133922061;
+Q_RELAX.reference_1[18][22]:=AC*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1351200521140052;
+Q_RELAX.reference_1[18][26]:=t*Min(1000,RELAX.reference.omega_0^local_k)*0.1344351325741675;
+Q_RELAX.reference_1[18][30]:=AT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.2296926126195792;
+Q_RELAX.reference_1[18][34]:=CG*t*Min(1000,RELAX.reference.omega_0^local_k)*0.3053650319994416;
+Q_RELAX.reference_1[19][3]:=AC*t*Min(1000,RELAX.reference.omega_0^local_k)*0.3222350398108426;
+Q_RELAX.reference_1[19][16]:=AT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.3824103826488193;
+Q_RELAX.reference_1[19][17]:=CT*t*0.1264560133035801;
+Q_RELAX.reference_1[19][18]:=GT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.2406378906553946;
+Q_RELAX.reference_1[19][23]:=AC*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1351200521140052;
+Q_RELAX.reference_1[19][27]:=t*Min(1000,RELAX.reference.omega_0^local_k)*0.1344351325741675;
+Q_RELAX.reference_1[19][31]:=AT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.2296926126195792;
+Q_RELAX.reference_1[19][35]:=CG*t*Min(1000,RELAX.reference.omega_0^local_k)*0.3053650319994416;
+Q_RELAX.reference_1[19][49]:=CT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.250994522453953;
+Q_RELAX.reference_1[20][4]:=AC*t*Min(1000,RELAX.reference.omega_0^local_k)*0.3222350398108426;
+Q_RELAX.reference_1[20][16]:=AC*t*Min(1000,RELAX.reference.omega_0^local_k)*0.5007522026922482;
+Q_RELAX.reference_1[20][21]:=AC*t*0.1264560133035801;
+Q_RELAX.reference_1[20][22]:=t*0.2406378906553946;
+Q_RELAX.reference_1[20][23]:=AT*t*0.2504957133922061;
+Q_RELAX.reference_1[20][24]:=CG*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1344351325741675;
+Q_RELAX.reference_1[20][28]:=CT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.2296926126195792;
+Q_RELAX.reference_1[20][36]:=CG*t*Min(1000,RELAX.reference.omega_0^local_k)*0.3053650319994416;
+Q_RELAX.reference_1[20][50]:=CT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.250994522453953;
+Q_RELAX.reference_1[21][5]:=AC*t*Min(1000,RELAX.reference.omega_0^local_k)*0.3222350398108426;
+Q_RELAX.reference_1[21][17]:=AC*t*Min(1000,RELAX.reference.omega_0^local_k)*0.5007522026922482;
+Q_RELAX.reference_1[21][20]:=AC*t*0.3824103826488193;
+Q_RELAX.reference_1[21][22]:=CG*t*0.2406378906553946;
+Q_RELAX.reference_1[21][23]:=CT*t*0.2504957133922061;
+Q_RELAX.reference_1[21][25]:=CG*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1344351325741675;
+Q_RELAX.reference_1[21][29]:=CT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.2296926126195792;
+Q_RELAX.reference_1[21][37]:=CG*t*Min(1000,RELAX.reference.omega_0^local_k)*0.3053650319994416;
+Q_RELAX.reference_1[21][51]:=CT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.250994522453953;
+Q_RELAX.reference_1[22][6]:=AC*t*Min(1000,RELAX.reference.omega_0^local_k)*0.3222350398108426;
+Q_RELAX.reference_1[22][18]:=AC*t*Min(1000,RELAX.reference.omega_0^local_k)*0.5007522026922482;
+Q_RELAX.reference_1[22][20]:=t*0.3824103826488193;
+Q_RELAX.reference_1[22][21]:=CG*t*0.1264560133035801;
+Q_RELAX.reference_1[22][23]:=GT*t*0.2504957133922061;
+Q_RELAX.reference_1[22][26]:=CG*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1344351325741675;
+Q_RELAX.reference_1[22][30]:=CT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.2296926126195792;
+Q_RELAX.reference_1[22][38]:=CG*t*Min(1000,RELAX.reference.omega_0^local_k)*0.3053650319994416;
+Q_RELAX.reference_1[22][52]:=CT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.250994522453953;
+Q_RELAX.reference_1[23][7]:=AC*t*Min(1000,RELAX.reference.omega_0^local_k)*0.3222350398108426;
+Q_RELAX.reference_1[23][19]:=AC*t*Min(1000,RELAX.reference.omega_0^local_k)*0.5007522026922482;
+Q_RELAX.reference_1[23][20]:=AT*t*0.3824103826488193;
+Q_RELAX.reference_1[23][21]:=CT*t*0.1264560133035801;
+Q_RELAX.reference_1[23][22]:=GT*t*0.2406378906553946;
+Q_RELAX.reference_1[23][27]:=CG*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1344351325741675;
+Q_RELAX.reference_1[23][31]:=CT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.2296926126195792;
+Q_RELAX.reference_1[23][39]:=CG*t*Min(1000,RELAX.reference.omega_0^local_k)*0.3053650319994416;
+Q_RELAX.reference_1[23][53]:=CT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.250994522453953;
+Q_RELAX.reference_1[24][8]:=AC*t*0.3222350398108426;
+Q_RELAX.reference_1[24][16]:=t*Min(1000,RELAX.reference.omega_0^local_k)*0.5007522026922482;
+Q_RELAX.reference_1[24][20]:=CG*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1351200521140052;
+Q_RELAX.reference_1[24][25]:=AC*t*0.1264560133035801;
+Q_RELAX.reference_1[24][26]:=t*0.2406378906553946;
+Q_RELAX.reference_1[24][27]:=AT*t*0.2504957133922061;
+Q_RELAX.reference_1[24][28]:=GT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.2296926126195792;
+Q_RELAX.reference_1[24][40]:=CG*t*Min(1000,RELAX.reference.omega_0^local_k)*0.3053650319994416;
+Q_RELAX.reference_1[25][9]:=AC*t*Min(1000,RELAX.reference.omega_0^local_k)*0.3222350398108426;
+Q_RELAX.reference_1[25][17]:=t*Min(1000,RELAX.reference.omega_0^local_k)*0.5007522026922482;
+Q_RELAX.reference_1[25][21]:=CG*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1351200521140052;
+Q_RELAX.reference_1[25][24]:=AC*t*0.3824103826488193;
+Q_RELAX.reference_1[25][26]:=CG*t*0.2406378906553946;
+Q_RELAX.reference_1[25][27]:=CT*t*0.2504957133922061;
+Q_RELAX.reference_1[25][29]:=GT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.2296926126195792;
+Q_RELAX.reference_1[25][41]:=CG*t*Min(1000,RELAX.reference.omega_0^local_k)*0.3053650319994416;
+Q_RELAX.reference_1[25][54]:=CT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.250994522453953;
+Q_RELAX.reference_1[26][10]:=AC*t*0.3222350398108426;
+Q_RELAX.reference_1[26][18]:=t*Min(1000,RELAX.reference.omega_0^local_k)*0.5007522026922482;
+Q_RELAX.reference_1[26][22]:=CG*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1351200521140052;
+Q_RELAX.reference_1[26][24]:=t*0.3824103826488193;
+Q_RELAX.reference_1[26][25]:=CG*t*0.1264560133035801;
+Q_RELAX.reference_1[26][27]:=GT*t*0.2504957133922061;
+Q_RELAX.reference_1[26][30]:=GT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.2296926126195792;
+Q_RELAX.reference_1[26][42]:=CG*t*Min(1000,RELAX.reference.omega_0^local_k)*0.3053650319994416;
+Q_RELAX.reference_1[26][55]:=CT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.250994522453953;
+Q_RELAX.reference_1[27][11]:=AC*t*Min(1000,RELAX.reference.omega_0^local_k)*0.3222350398108426;
+Q_RELAX.reference_1[27][19]:=t*Min(1000,RELAX.reference.omega_0^local_k)*0.5007522026922482;
+Q_RELAX.reference_1[27][23]:=CG*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1351200521140052;
+Q_RELAX.reference_1[27][24]:=AT*t*0.3824103826488193;
+Q_RELAX.reference_1[27][25]:=CT*t*0.1264560133035801;
+Q_RELAX.reference_1[27][26]:=GT*t*0.2406378906553946;
+Q_RELAX.reference_1[27][31]:=GT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.2296926126195792;
+Q_RELAX.reference_1[27][43]:=CG*t*Min(1000,RELAX.reference.omega_0^local_k)*0.3053650319994416;
+Q_RELAX.reference_1[27][56]:=CT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.250994522453953;
+Q_RELAX.reference_1[28][12]:=AC*t*Min(1000,RELAX.reference.omega_0^local_k)*0.3222350398108426;
+Q_RELAX.reference_1[28][16]:=AT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.5007522026922482;
+Q_RELAX.reference_1[28][20]:=CT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1351200521140052;
+Q_RELAX.reference_1[28][24]:=GT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1344351325741675;
+Q_RELAX.reference_1[28][29]:=AC*t*0.1264560133035801;
+Q_RELAX.reference_1[28][30]:=t*0.2406378906553946;
+Q_RELAX.reference_1[28][31]:=AT*t*0.2504957133922061;
+Q_RELAX.reference_1[28][44]:=CG*t*Min(1000,RELAX.reference.omega_0^local_k)*0.3053650319994416;
+Q_RELAX.reference_1[28][57]:=CT*t*0.250994522453953;
+Q_RELAX.reference_1[29][13]:=AC*t*Min(1000,RELAX.reference.omega_0^local_k)*0.3222350398108426;
+Q_RELAX.reference_1[29][17]:=AT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.5007522026922482;
+Q_RELAX.reference_1[29][21]:=CT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1351200521140052;
+Q_RELAX.reference_1[29][25]:=GT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1344351325741675;
+Q_RELAX.reference_1[29][28]:=AC*t*0.3824103826488193;
+Q_RELAX.reference_1[29][30]:=CG*t*0.2406378906553946;
+Q_RELAX.reference_1[29][31]:=CT*t*0.2504957133922061;
+Q_RELAX.reference_1[29][45]:=CG*t*Min(1000,RELAX.reference.omega_0^local_k)*0.3053650319994416;
+Q_RELAX.reference_1[29][58]:=CT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.250994522453953;
+Q_RELAX.reference_1[30][14]:=AC*t*Min(1000,RELAX.reference.omega_0^local_k)*0.3222350398108426;
+Q_RELAX.reference_1[30][18]:=AT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.5007522026922482;
+Q_RELAX.reference_1[30][22]:=CT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1351200521140052;
+Q_RELAX.reference_1[30][26]:=GT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1344351325741675;
+Q_RELAX.reference_1[30][28]:=t*0.3824103826488193;
+Q_RELAX.reference_1[30][29]:=CG*t*0.1264560133035801;
+Q_RELAX.reference_1[30][31]:=GT*t*0.2504957133922061;
+Q_RELAX.reference_1[30][46]:=CG*t*Min(1000,RELAX.reference.omega_0^local_k)*0.3053650319994416;
+Q_RELAX.reference_1[30][59]:=CT*t*0.250994522453953;
+Q_RELAX.reference_1[31][15]:=AC*t*Min(1000,RELAX.reference.omega_0^local_k)*0.3222350398108426;
+Q_RELAX.reference_1[31][19]:=AT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.5007522026922482;
+Q_RELAX.reference_1[31][23]:=CT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1351200521140052;
+Q_RELAX.reference_1[31][27]:=GT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1344351325741675;
+Q_RELAX.reference_1[31][28]:=AT*t*0.3824103826488193;
+Q_RELAX.reference_1[31][29]:=CT*t*0.1264560133035801;
+Q_RELAX.reference_1[31][30]:=GT*t*0.2406378906553946;
+Q_RELAX.reference_1[31][47]:=CG*t*Min(1000,RELAX.reference.omega_0^local_k)*0.3053650319994416;
+Q_RELAX.reference_1[31][60]:=CT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.250994522453953;
+Q_RELAX.reference_1[32][0]:=t*Min(1000,RELAX.reference.omega_0^local_k)*0.3222350398108426;
+Q_RELAX.reference_1[32][16]:=CG*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1214054057357627;
+Q_RELAX.reference_1[32][33]:=AC*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1264560133035801;
+Q_RELAX.reference_1[32][34]:=t*0.2406378906553946;
+Q_RELAX.reference_1[32][35]:=AT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.2504957133922061;
+Q_RELAX.reference_1[32][36]:=AC*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1351200521140052;
+Q_RELAX.reference_1[32][40]:=t*Min(1000,RELAX.reference.omega_0^local_k)*0.1344351325741675;
+Q_RELAX.reference_1[32][44]:=AT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.2296926126195792;
+Q_RELAX.reference_1[33][1]:=t*Min(1000,RELAX.reference.omega_0^local_k)*0.3222350398108426;
+Q_RELAX.reference_1[33][17]:=CG*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1214054057357627;
+Q_RELAX.reference_1[33][32]:=AC*t*Min(1000,RELAX.reference.omega_0^local_k)*0.3824103826488193;
+Q_RELAX.reference_1[33][34]:=CG*t*Min(1000,RELAX.reference.omega_0^local_k)*0.2406378906553946;
+Q_RELAX.reference_1[33][35]:=CT*t*0.2504957133922061;
+Q_RELAX.reference_1[33][37]:=AC*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1351200521140052;
+Q_RELAX.reference_1[33][41]:=t*Min(1000,RELAX.reference.omega_0^local_k)*0.1344351325741675;
+Q_RELAX.reference_1[33][45]:=AT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.2296926126195792;
+Q_RELAX.reference_1[33][48]:=GT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.250994522453953;
+Q_RELAX.reference_1[34][2]:=t*Min(1000,RELAX.reference.omega_0^local_k)*0.3222350398108426;
+Q_RELAX.reference_1[34][18]:=CG*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1214054057357627;
+Q_RELAX.reference_1[34][32]:=t*0.3824103826488193;
+Q_RELAX.reference_1[34][33]:=CG*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1264560133035801;
+Q_RELAX.reference_1[34][35]:=GT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.2504957133922061;
+Q_RELAX.reference_1[34][38]:=AC*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1351200521140052;
+Q_RELAX.reference_1[34][42]:=t*Min(1000,RELAX.reference.omega_0^local_k)*0.1344351325741675;
+Q_RELAX.reference_1[34][46]:=AT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.2296926126195792;
+Q_RELAX.reference_1[35][3]:=t*Min(1000,RELAX.reference.omega_0^local_k)*0.3222350398108426;
+Q_RELAX.reference_1[35][19]:=CG*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1214054057357627;
+Q_RELAX.reference_1[35][32]:=AT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.3824103826488193;
+Q_RELAX.reference_1[35][33]:=CT*t*0.1264560133035801;
+Q_RELAX.reference_1[35][34]:=GT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.2406378906553946;
+Q_RELAX.reference_1[35][39]:=AC*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1351200521140052;
+Q_RELAX.reference_1[35][43]:=t*Min(1000,RELAX.reference.omega_0^local_k)*0.1344351325741675;
+Q_RELAX.reference_1[35][47]:=AT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.2296926126195792;
+Q_RELAX.reference_1[35][49]:=GT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.250994522453953;
+Q_RELAX.reference_1[36][4]:=t*Min(1000,RELAX.reference.omega_0^local_k)*0.3222350398108426;
+Q_RELAX.reference_1[36][20]:=CG*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1214054057357627;
+Q_RELAX.reference_1[36][32]:=AC*t*Min(1000,RELAX.reference.omega_0^local_k)*0.5007522026922482;
+Q_RELAX.reference_1[36][37]:=AC*t*0.1264560133035801;
+Q_RELAX.reference_1[36][38]:=t*0.2406378906553946;
+Q_RELAX.reference_1[36][39]:=AT*t*0.2504957133922061;
+Q_RELAX.reference_1[36][40]:=CG*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1344351325741675;
+Q_RELAX.reference_1[36][44]:=CT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.2296926126195792;
+Q_RELAX.reference_1[36][50]:=GT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.250994522453953;
+Q_RELAX.reference_1[37][5]:=t*Min(1000,RELAX.reference.omega_0^local_k)*0.3222350398108426;
+Q_RELAX.reference_1[37][21]:=CG*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1214054057357627;
+Q_RELAX.reference_1[37][33]:=AC*t*Min(1000,RELAX.reference.omega_0^local_k)*0.5007522026922482;
+Q_RELAX.reference_1[37][36]:=AC*t*0.3824103826488193;
+Q_RELAX.reference_1[37][38]:=CG*t*0.2406378906553946;
+Q_RELAX.reference_1[37][39]:=CT*t*0.2504957133922061;
+Q_RELAX.reference_1[37][41]:=CG*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1344351325741675;
+Q_RELAX.reference_1[37][45]:=CT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.2296926126195792;
+Q_RELAX.reference_1[37][51]:=GT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.250994522453953;
+Q_RELAX.reference_1[38][6]:=t*Min(1000,RELAX.reference.omega_0^local_k)*0.3222350398108426;
+Q_RELAX.reference_1[38][22]:=CG*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1214054057357627;
+Q_RELAX.reference_1[38][34]:=AC*t*Min(1000,RELAX.reference.omega_0^local_k)*0.5007522026922482;
+Q_RELAX.reference_1[38][36]:=t*0.3824103826488193;
+Q_RELAX.reference_1[38][37]:=CG*t*0.1264560133035801;
+Q_RELAX.reference_1[38][39]:=GT*t*0.2504957133922061;
+Q_RELAX.reference_1[38][42]:=CG*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1344351325741675;
+Q_RELAX.reference_1[38][46]:=CT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.2296926126195792;
+Q_RELAX.reference_1[38][52]:=GT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.250994522453953;
+Q_RELAX.reference_1[39][7]:=t*Min(1000,RELAX.reference.omega_0^local_k)*0.3222350398108426;
+Q_RELAX.reference_1[39][23]:=CG*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1214054057357627;
+Q_RELAX.reference_1[39][35]:=AC*t*Min(1000,RELAX.reference.omega_0^local_k)*0.5007522026922482;
+Q_RELAX.reference_1[39][36]:=AT*t*0.3824103826488193;
+Q_RELAX.reference_1[39][37]:=CT*t*0.1264560133035801;
+Q_RELAX.reference_1[39][38]:=GT*t*0.2406378906553946;
+Q_RELAX.reference_1[39][43]:=CG*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1344351325741675;
+Q_RELAX.reference_1[39][47]:=CT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.2296926126195792;
+Q_RELAX.reference_1[39][53]:=GT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.250994522453953;
+Q_RELAX.reference_1[40][8]:=t*Min(1000,RELAX.reference.omega_0^local_k)*0.3222350398108426;
+Q_RELAX.reference_1[40][24]:=CG*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1214054057357627;
+Q_RELAX.reference_1[40][32]:=t*Min(1000,RELAX.reference.omega_0^local_k)*0.5007522026922482;
+Q_RELAX.reference_1[40][36]:=CG*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1351200521140052;
+Q_RELAX.reference_1[40][41]:=AC*t*0.1264560133035801;
+Q_RELAX.reference_1[40][42]:=t*0.2406378906553946;
+Q_RELAX.reference_1[40][43]:=AT*t*0.2504957133922061;
+Q_RELAX.reference_1[40][44]:=GT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.2296926126195792;
+Q_RELAX.reference_1[41][9]:=t*Min(1000,RELAX.reference.omega_0^local_k)*0.3222350398108426;
+Q_RELAX.reference_1[41][25]:=CG*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1214054057357627;
+Q_RELAX.reference_1[41][33]:=t*Min(1000,RELAX.reference.omega_0^local_k)*0.5007522026922482;
+Q_RELAX.reference_1[41][37]:=CG*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1351200521140052;
+Q_RELAX.reference_1[41][40]:=AC*t*0.3824103826488193;
+Q_RELAX.reference_1[41][42]:=CG*t*0.2406378906553946;
+Q_RELAX.reference_1[41][43]:=CT*t*0.2504957133922061;
+Q_RELAX.reference_1[41][45]:=GT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.2296926126195792;
+Q_RELAX.reference_1[41][54]:=GT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.250994522453953;
+Q_RELAX.reference_1[42][10]:=t*Min(1000,RELAX.reference.omega_0^local_k)*0.3222350398108426;
+Q_RELAX.reference_1[42][26]:=CG*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1214054057357627;
+Q_RELAX.reference_1[42][34]:=t*Min(1000,RELAX.reference.omega_0^local_k)*0.5007522026922482;
+Q_RELAX.reference_1[42][38]:=CG*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1351200521140052;
+Q_RELAX.reference_1[42][40]:=t*0.3824103826488193;
+Q_RELAX.reference_1[42][41]:=CG*t*0.1264560133035801;
+Q_RELAX.reference_1[42][43]:=GT*t*0.2504957133922061;
+Q_RELAX.reference_1[42][46]:=GT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.2296926126195792;
+Q_RELAX.reference_1[42][55]:=GT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.250994522453953;
+Q_RELAX.reference_1[43][11]:=t*Min(1000,RELAX.reference.omega_0^local_k)*0.3222350398108426;
+Q_RELAX.reference_1[43][27]:=CG*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1214054057357627;
+Q_RELAX.reference_1[43][35]:=t*Min(1000,RELAX.reference.omega_0^local_k)*0.5007522026922482;
+Q_RELAX.reference_1[43][39]:=CG*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1351200521140052;
+Q_RELAX.reference_1[43][40]:=AT*t*0.3824103826488193;
+Q_RELAX.reference_1[43][41]:=CT*t*0.1264560133035801;
+Q_RELAX.reference_1[43][42]:=GT*t*0.2406378906553946;
+Q_RELAX.reference_1[43][47]:=GT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.2296926126195792;
+Q_RELAX.reference_1[43][56]:=GT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.250994522453953;
+Q_RELAX.reference_1[44][12]:=t*Min(1000,RELAX.reference.omega_0^local_k)*0.3222350398108426;
+Q_RELAX.reference_1[44][28]:=CG*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1214054057357627;
+Q_RELAX.reference_1[44][32]:=AT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.5007522026922482;
+Q_RELAX.reference_1[44][36]:=CT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1351200521140052;
+Q_RELAX.reference_1[44][40]:=GT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1344351325741675;
+Q_RELAX.reference_1[44][45]:=AC*t*0.1264560133035801;
+Q_RELAX.reference_1[44][46]:=t*0.2406378906553946;
+Q_RELAX.reference_1[44][47]:=AT*t*0.2504957133922061;
+Q_RELAX.reference_1[44][57]:=GT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.250994522453953;
+Q_RELAX.reference_1[45][13]:=t*Min(1000,RELAX.reference.omega_0^local_k)*0.3222350398108426;
+Q_RELAX.reference_1[45][29]:=CG*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1214054057357627;
+Q_RELAX.reference_1[45][33]:=AT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.5007522026922482;
+Q_RELAX.reference_1[45][37]:=CT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1351200521140052;
+Q_RELAX.reference_1[45][41]:=GT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1344351325741675;
+Q_RELAX.reference_1[45][44]:=AC*t*0.3824103826488193;
+Q_RELAX.reference_1[45][46]:=CG*t*0.2406378906553946;
+Q_RELAX.reference_1[45][47]:=CT*t*0.2504957133922061;
+Q_RELAX.reference_1[45][58]:=GT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.250994522453953;
+Q_RELAX.reference_1[46][14]:=t*Min(1000,RELAX.reference.omega_0^local_k)*0.3222350398108426;
+Q_RELAX.reference_1[46][30]:=CG*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1214054057357627;
+Q_RELAX.reference_1[46][34]:=AT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.5007522026922482;
+Q_RELAX.reference_1[46][38]:=CT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1351200521140052;
+Q_RELAX.reference_1[46][42]:=GT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1344351325741675;
+Q_RELAX.reference_1[46][44]:=t*0.3824103826488193;
+Q_RELAX.reference_1[46][45]:=CG*t*0.1264560133035801;
+Q_RELAX.reference_1[46][47]:=GT*t*0.2504957133922061;
+Q_RELAX.reference_1[46][59]:=GT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.250994522453953;
+Q_RELAX.reference_1[47][15]:=t*Min(1000,RELAX.reference.omega_0^local_k)*0.3222350398108426;
+Q_RELAX.reference_1[47][31]:=CG*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1214054057357627;
+Q_RELAX.reference_1[47][35]:=AT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.5007522026922482;
+Q_RELAX.reference_1[47][39]:=CT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1351200521140052;
+Q_RELAX.reference_1[47][43]:=GT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1344351325741675;
+Q_RELAX.reference_1[47][44]:=AT*t*0.3824103826488193;
+Q_RELAX.reference_1[47][45]:=CT*t*0.1264560133035801;
+Q_RELAX.reference_1[47][46]:=GT*t*0.2406378906553946;
+Q_RELAX.reference_1[47][60]:=GT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.250994522453953;
+Q_RELAX.reference_1[48][1]:=AT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.3222350398108426;
+Q_RELAX.reference_1[48][17]:=CT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1214054057357627;
+Q_RELAX.reference_1[48][33]:=GT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.3053650319994416;
+Q_RELAX.reference_1[48][49]:=CT*t*0.2504957133922061;
+Q_RELAX.reference_1[48][51]:=AC*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1351200521140052;
+Q_RELAX.reference_1[48][54]:=t*Min(1000,RELAX.reference.omega_0^local_k)*0.1344351325741675;
+Q_RELAX.reference_1[48][58]:=AT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.2296926126195792;
+Q_RELAX.reference_1[49][3]:=AT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.3222350398108426;
+Q_RELAX.reference_1[49][19]:=CT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1214054057357627;
+Q_RELAX.reference_1[49][35]:=GT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.3053650319994416;
+Q_RELAX.reference_1[49][48]:=CT*t*0.1264560133035801;
+Q_RELAX.reference_1[49][53]:=AC*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1351200521140052;
+Q_RELAX.reference_1[49][56]:=t*Min(1000,RELAX.reference.omega_0^local_k)*0.1344351325741675;
+Q_RELAX.reference_1[49][60]:=AT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.2296926126195792;
+Q_RELAX.reference_1[50][4]:=AT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.3222350398108426;
+Q_RELAX.reference_1[50][20]:=CT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1214054057357627;
+Q_RELAX.reference_1[50][36]:=GT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.3053650319994416;
+Q_RELAX.reference_1[50][51]:=AC*t*0.1264560133035801;
+Q_RELAX.reference_1[50][52]:=t*0.2406378906553946;
+Q_RELAX.reference_1[50][53]:=AT*t*0.2504957133922061;
+Q_RELAX.reference_1[50][57]:=CT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.2296926126195792;
+Q_RELAX.reference_1[51][5]:=AT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.3222350398108426;
+Q_RELAX.reference_1[51][21]:=CT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1214054057357627;
+Q_RELAX.reference_1[51][37]:=GT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.3053650319994416;
+Q_RELAX.reference_1[51][48]:=AC*t*Min(1000,RELAX.reference.omega_0^local_k)*0.5007522026922482;
+Q_RELAX.reference_1[51][50]:=AC*t*0.3824103826488193;
+Q_RELAX.reference_1[51][52]:=CG*t*0.2406378906553946;
+Q_RELAX.reference_1[51][53]:=CT*t*0.2504957133922061;
+Q_RELAX.reference_1[51][54]:=CG*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1344351325741675;
+Q_RELAX.reference_1[51][58]:=CT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.2296926126195792;
+Q_RELAX.reference_1[52][6]:=AT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.3222350398108426;
+Q_RELAX.reference_1[52][22]:=CT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1214054057357627;
+Q_RELAX.reference_1[52][38]:=GT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.3053650319994416;
+Q_RELAX.reference_1[52][50]:=t*0.3824103826488193;
+Q_RELAX.reference_1[52][51]:=CG*t*0.1264560133035801;
+Q_RELAX.reference_1[52][53]:=GT*t*0.2504957133922061;
+Q_RELAX.reference_1[52][55]:=CG*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1344351325741675;
+Q_RELAX.reference_1[52][59]:=CT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.2296926126195792;
+Q_RELAX.reference_1[53][7]:=AT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.3222350398108426;
+Q_RELAX.reference_1[53][23]:=CT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1214054057357627;
+Q_RELAX.reference_1[53][39]:=GT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.3053650319994416;
+Q_RELAX.reference_1[53][49]:=AC*t*Min(1000,RELAX.reference.omega_0^local_k)*0.5007522026922482;
+Q_RELAX.reference_1[53][50]:=AT*t*0.3824103826488193;
+Q_RELAX.reference_1[53][51]:=CT*t*0.1264560133035801;
+Q_RELAX.reference_1[53][52]:=GT*t*0.2406378906553946;
+Q_RELAX.reference_1[53][56]:=CG*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1344351325741675;
+Q_RELAX.reference_1[53][60]:=CT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.2296926126195792;
+Q_RELAX.reference_1[54][9]:=AT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.3222350398108426;
+Q_RELAX.reference_1[54][25]:=CT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1214054057357627;
+Q_RELAX.reference_1[54][41]:=GT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.3053650319994416;
+Q_RELAX.reference_1[54][48]:=t*Min(1000,RELAX.reference.omega_0^local_k)*0.5007522026922482;
+Q_RELAX.reference_1[54][51]:=CG*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1351200521140052;
+Q_RELAX.reference_1[54][55]:=CG*t*Min(1000,RELAX.reference.omega_0^local_k)*0.2406378906553946;
+Q_RELAX.reference_1[54][56]:=CT*t*0.2504957133922061;
+Q_RELAX.reference_1[54][58]:=GT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.2296926126195792;
+Q_RELAX.reference_1[55][10]:=AT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.3222350398108426;
+Q_RELAX.reference_1[55][26]:=CT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1214054057357627;
+Q_RELAX.reference_1[55][42]:=GT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.3053650319994416;
+Q_RELAX.reference_1[55][52]:=CG*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1351200521140052;
+Q_RELAX.reference_1[55][54]:=CG*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1264560133035801;
+Q_RELAX.reference_1[55][56]:=GT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.2504957133922061;
+Q_RELAX.reference_1[55][59]:=GT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.2296926126195792;
+Q_RELAX.reference_1[56][11]:=AT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.3222350398108426;
+Q_RELAX.reference_1[56][27]:=CT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1214054057357627;
+Q_RELAX.reference_1[56][43]:=GT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.3053650319994416;
+Q_RELAX.reference_1[56][49]:=t*Min(1000,RELAX.reference.omega_0^local_k)*0.5007522026922482;
+Q_RELAX.reference_1[56][53]:=CG*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1351200521140052;
+Q_RELAX.reference_1[56][54]:=CT*t*0.1264560133035801;
+Q_RELAX.reference_1[56][55]:=GT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.2406378906553946;
+Q_RELAX.reference_1[56][60]:=GT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.2296926126195792;
+Q_RELAX.reference_1[57][12]:=AT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.3222350398108426;
+Q_RELAX.reference_1[57][28]:=CT*t*0.1214054057357627;
+Q_RELAX.reference_1[57][44]:=GT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.3053650319994416;
+Q_RELAX.reference_1[57][50]:=CT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1351200521140052;
+Q_RELAX.reference_1[57][58]:=AC*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1264560133035801;
+Q_RELAX.reference_1[57][59]:=t*0.2406378906553946;
+Q_RELAX.reference_1[57][60]:=AT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.2504957133922061;
+Q_RELAX.reference_1[58][13]:=AT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.3222350398108426;
+Q_RELAX.reference_1[58][29]:=CT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1214054057357627;
+Q_RELAX.reference_1[58][45]:=GT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.3053650319994416;
+Q_RELAX.reference_1[58][48]:=AT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.5007522026922482;
+Q_RELAX.reference_1[58][51]:=CT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1351200521140052;
+Q_RELAX.reference_1[58][54]:=GT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1344351325741675;
+Q_RELAX.reference_1[58][57]:=AC*t*Min(1000,RELAX.reference.omega_0^local_k)*0.3824103826488193;
+Q_RELAX.reference_1[58][59]:=CG*t*Min(1000,RELAX.reference.omega_0^local_k)*0.2406378906553946;
+Q_RELAX.reference_1[58][60]:=CT*t*0.2504957133922061;
+Q_RELAX.reference_1[59][14]:=AT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.3222350398108426;
+Q_RELAX.reference_1[59][30]:=CT*t*0.1214054057357627;
+Q_RELAX.reference_1[59][46]:=GT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.3053650319994416;
+Q_RELAX.reference_1[59][52]:=CT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1351200521140052;
+Q_RELAX.reference_1[59][55]:=GT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1344351325741675;
+Q_RELAX.reference_1[59][57]:=t*0.3824103826488193;
+Q_RELAX.reference_1[59][58]:=CG*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1264560133035801;
+Q_RELAX.reference_1[59][60]:=GT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.2504957133922061;
+Q_RELAX.reference_1[60][15]:=AT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.3222350398108426;
+Q_RELAX.reference_1[60][31]:=CT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1214054057357627;
+Q_RELAX.reference_1[60][47]:=GT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.3053650319994416;
+Q_RELAX.reference_1[60][49]:=AT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.5007522026922482;
+Q_RELAX.reference_1[60][53]:=CT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1351200521140052;
+Q_RELAX.reference_1[60][56]:=GT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1344351325741675;
+Q_RELAX.reference_1[60][57]:=AT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.3824103826488193;
+Q_RELAX.reference_1[60][58]:=CT*t*0.1264560133035801;
+Q_RELAX.reference_1[60][59]:=GT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.2406378906553946;
+
+
+Q_RELAX.reference_2={61,61};
+Q_RELAX.reference_2[0][1]:=AC*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1264560133035801;
+Q_RELAX.reference_2[0][2]:=t*0.2406378906553946;
+Q_RELAX.reference_2[0][3]:=AT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.2504957133922061;
+Q_RELAX.reference_2[0][4]:=AC*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1351200521140052;
+Q_RELAX.reference_2[0][8]:=t*Min(1000,RELAX.reference.omega_1^local_k)*0.1344351325741675;
+Q_RELAX.reference_2[0][12]:=AT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.2296926126195792;
+Q_RELAX.reference_2[0][16]:=AC*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1214054057357627;
+Q_RELAX.reference_2[0][32]:=t*Min(1000,RELAX.reference.omega_1^local_k)*0.3053650319994416;
+Q_RELAX.reference_2[1][0]:=AC*t*Min(1000,RELAX.reference.omega_1^local_k)*0.3824103826488193;
+Q_RELAX.reference_2[1][2]:=CG*t*Min(1000,RELAX.reference.omega_1^local_k)*0.2406378906553946;
+Q_RELAX.reference_2[1][3]:=CT*t*0.2504957133922061;
+Q_RELAX.reference_2[1][5]:=AC*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1351200521140052;
+Q_RELAX.reference_2[1][9]:=t*Min(1000,RELAX.reference.omega_1^local_k)*0.1344351325741675;
+Q_RELAX.reference_2[1][13]:=AT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.2296926126195792;
+Q_RELAX.reference_2[1][17]:=AC*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1214054057357627;
+Q_RELAX.reference_2[1][33]:=t*Min(1000,RELAX.reference.omega_1^local_k)*0.3053650319994416;
+Q_RELAX.reference_2[1][48]:=AT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.250994522453953;
+Q_RELAX.reference_2[2][0]:=t*0.3824103826488193;
+Q_RELAX.reference_2[2][1]:=CG*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1264560133035801;
+Q_RELAX.reference_2[2][3]:=GT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.2504957133922061;
+Q_RELAX.reference_2[2][6]:=AC*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1351200521140052;
+Q_RELAX.reference_2[2][10]:=t*Min(1000,RELAX.reference.omega_1^local_k)*0.1344351325741675;
+Q_RELAX.reference_2[2][14]:=AT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.2296926126195792;
+Q_RELAX.reference_2[2][18]:=AC*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1214054057357627;
+Q_RELAX.reference_2[2][34]:=t*Min(1000,RELAX.reference.omega_1^local_k)*0.3053650319994416;
+Q_RELAX.reference_2[3][0]:=AT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.3824103826488193;
+Q_RELAX.reference_2[3][1]:=CT*t*0.1264560133035801;
+Q_RELAX.reference_2[3][2]:=GT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.2406378906553946;
+Q_RELAX.reference_2[3][7]:=AC*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1351200521140052;
+Q_RELAX.reference_2[3][11]:=t*Min(1000,RELAX.reference.omega_1^local_k)*0.1344351325741675;
+Q_RELAX.reference_2[3][15]:=AT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.2296926126195792;
+Q_RELAX.reference_2[3][19]:=AC*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1214054057357627;
+Q_RELAX.reference_2[3][35]:=t*Min(1000,RELAX.reference.omega_1^local_k)*0.3053650319994416;
+Q_RELAX.reference_2[3][49]:=AT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.250994522453953;
+Q_RELAX.reference_2[4][0]:=AC*t*Min(1000,RELAX.reference.omega_1^local_k)*0.5007522026922482;
+Q_RELAX.reference_2[4][5]:=AC*t*0.1264560133035801;
+Q_RELAX.reference_2[4][6]:=t*0.2406378906553946;
+Q_RELAX.reference_2[4][7]:=AT*t*0.2504957133922061;
+Q_RELAX.reference_2[4][8]:=CG*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1344351325741675;
+Q_RELAX.reference_2[4][12]:=CT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.2296926126195792;
+Q_RELAX.reference_2[4][20]:=AC*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1214054057357627;
+Q_RELAX.reference_2[4][36]:=t*Min(1000,RELAX.reference.omega_1^local_k)*0.3053650319994416;
+Q_RELAX.reference_2[4][50]:=AT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.250994522453953;
+Q_RELAX.reference_2[5][1]:=AC*t*Min(1000,RELAX.reference.omega_1^local_k)*0.5007522026922482;
+Q_RELAX.reference_2[5][4]:=AC*t*0.3824103826488193;
+Q_RELAX.reference_2[5][6]:=CG*t*0.2406378906553946;
+Q_RELAX.reference_2[5][7]:=CT*t*0.2504957133922061;
+Q_RELAX.reference_2[5][9]:=CG*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1344351325741675;
+Q_RELAX.reference_2[5][13]:=CT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.2296926126195792;
+Q_RELAX.reference_2[5][21]:=AC*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1214054057357627;
+Q_RELAX.reference_2[5][37]:=t*Min(1000,RELAX.reference.omega_1^local_k)*0.3053650319994416;
+Q_RELAX.reference_2[5][51]:=AT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.250994522453953;
+Q_RELAX.reference_2[6][2]:=AC*t*Min(1000,RELAX.reference.omega_1^local_k)*0.5007522026922482;
+Q_RELAX.reference_2[6][4]:=t*0.3824103826488193;
+Q_RELAX.reference_2[6][5]:=CG*t*0.1264560133035801;
+Q_RELAX.reference_2[6][7]:=GT*t*0.2504957133922061;
+Q_RELAX.reference_2[6][10]:=CG*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1344351325741675;
+Q_RELAX.reference_2[6][14]:=CT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.2296926126195792;
+Q_RELAX.reference_2[6][22]:=AC*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1214054057357627;
+Q_RELAX.reference_2[6][38]:=t*Min(1000,RELAX.reference.omega_1^local_k)*0.3053650319994416;
+Q_RELAX.reference_2[6][52]:=AT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.250994522453953;
+Q_RELAX.reference_2[7][3]:=AC*t*Min(1000,RELAX.reference.omega_1^local_k)*0.5007522026922482;
+Q_RELAX.reference_2[7][4]:=AT*t*0.3824103826488193;
+Q_RELAX.reference_2[7][5]:=CT*t*0.1264560133035801;
+Q_RELAX.reference_2[7][6]:=GT*t*0.2406378906553946;
+Q_RELAX.reference_2[7][11]:=CG*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1344351325741675;
+Q_RELAX.reference_2[7][15]:=CT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.2296926126195792;
+Q_RELAX.reference_2[7][23]:=AC*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1214054057357627;
+Q_RELAX.reference_2[7][39]:=t*Min(1000,RELAX.reference.omega_1^local_k)*0.3053650319994416;
+Q_RELAX.reference_2[7][53]:=AT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.250994522453953;
+Q_RELAX.reference_2[8][0]:=t*Min(1000,RELAX.reference.omega_1^local_k)*0.5007522026922482;
+Q_RELAX.reference_2[8][4]:=CG*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1351200521140052;
+Q_RELAX.reference_2[8][9]:=AC*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1264560133035801;
+Q_RELAX.reference_2[8][10]:=t*0.2406378906553946;
+Q_RELAX.reference_2[8][11]:=AT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.2504957133922061;
+Q_RELAX.reference_2[8][12]:=GT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.2296926126195792;
+Q_RELAX.reference_2[8][24]:=AC*t*0.1214054057357627;
+Q_RELAX.reference_2[8][40]:=t*Min(1000,RELAX.reference.omega_1^local_k)*0.3053650319994416;
+Q_RELAX.reference_2[9][1]:=t*Min(1000,RELAX.reference.omega_1^local_k)*0.5007522026922482;
+Q_RELAX.reference_2[9][5]:=CG*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1351200521140052;
+Q_RELAX.reference_2[9][8]:=AC*t*Min(1000,RELAX.reference.omega_1^local_k)*0.3824103826488193;
+Q_RELAX.reference_2[9][10]:=CG*t*Min(1000,RELAX.reference.omega_1^local_k)*0.2406378906553946;
+Q_RELAX.reference_2[9][11]:=CT*t*0.2504957133922061;
+Q_RELAX.reference_2[9][13]:=GT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.2296926126195792;
+Q_RELAX.reference_2[9][25]:=AC*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1214054057357627;
+Q_RELAX.reference_2[9][41]:=t*Min(1000,RELAX.reference.omega_1^local_k)*0.3053650319994416;
+Q_RELAX.reference_2[9][54]:=AT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.250994522453953;
+Q_RELAX.reference_2[10][2]:=t*Min(1000,RELAX.reference.omega_1^local_k)*0.5007522026922482;
+Q_RELAX.reference_2[10][6]:=CG*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1351200521140052;
+Q_RELAX.reference_2[10][8]:=t*0.3824103826488193;
+Q_RELAX.reference_2[10][9]:=CG*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1264560133035801;
+Q_RELAX.reference_2[10][11]:=GT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.2504957133922061;
+Q_RELAX.reference_2[10][14]:=GT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.2296926126195792;
+Q_RELAX.reference_2[10][26]:=AC*t*0.1214054057357627;
+Q_RELAX.reference_2[10][42]:=t*Min(1000,RELAX.reference.omega_1^local_k)*0.3053650319994416;
+Q_RELAX.reference_2[10][55]:=AT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.250994522453953;
+Q_RELAX.reference_2[11][3]:=t*Min(1000,RELAX.reference.omega_1^local_k)*0.5007522026922482;
+Q_RELAX.reference_2[11][7]:=CG*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1351200521140052;
+Q_RELAX.reference_2[11][8]:=AT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.3824103826488193;
+Q_RELAX.reference_2[11][9]:=CT*t*0.1264560133035801;
+Q_RELAX.reference_2[11][10]:=GT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.2406378906553946;
+Q_RELAX.reference_2[11][15]:=GT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.2296926126195792;
+Q_RELAX.reference_2[11][27]:=AC*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1214054057357627;
+Q_RELAX.reference_2[11][43]:=t*Min(1000,RELAX.reference.omega_1^local_k)*0.3053650319994416;
+Q_RELAX.reference_2[11][56]:=AT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.250994522453953;
+Q_RELAX.reference_2[12][0]:=AT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.5007522026922482;
+Q_RELAX.reference_2[12][4]:=CT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1351200521140052;
+Q_RELAX.reference_2[12][8]:=GT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1344351325741675;
+Q_RELAX.reference_2[12][13]:=AC*t*0.1264560133035801;
+Q_RELAX.reference_2[12][14]:=t*Min(1000,RELAX.reference.omega_1^local_k)*0.2406378906553946;
+Q_RELAX.reference_2[12][15]:=AT*t*0.2504957133922061;
+Q_RELAX.reference_2[12][28]:=AC*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1214054057357627;
+Q_RELAX.reference_2[12][44]:=t*Min(1000,RELAX.reference.omega_1^local_k)*0.3053650319994416;
+Q_RELAX.reference_2[12][57]:=AT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.250994522453953;
+Q_RELAX.reference_2[13][1]:=AT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.5007522026922482;
+Q_RELAX.reference_2[13][5]:=CT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1351200521140052;
+Q_RELAX.reference_2[13][9]:=GT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1344351325741675;
+Q_RELAX.reference_2[13][12]:=AC*t*0.3824103826488193;
+Q_RELAX.reference_2[13][14]:=CG*t*Min(1000,RELAX.reference.omega_1^local_k)*0.2406378906553946;
+Q_RELAX.reference_2[13][15]:=CT*t*0.2504957133922061;
+Q_RELAX.reference_2[13][29]:=AC*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1214054057357627;
+Q_RELAX.reference_2[13][45]:=t*Min(1000,RELAX.reference.omega_1^local_k)*0.3053650319994416;
+Q_RELAX.reference_2[13][58]:=AT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.250994522453953;
+Q_RELAX.reference_2[14][2]:=AT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.5007522026922482;
+Q_RELAX.reference_2[14][6]:=CT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1351200521140052;
+Q_RELAX.reference_2[14][10]:=GT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1344351325741675;
+Q_RELAX.reference_2[14][12]:=t*Min(1000,RELAX.reference.omega_1^local_k)*0.3824103826488193;
+Q_RELAX.reference_2[14][13]:=CG*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1264560133035801;
+Q_RELAX.reference_2[14][15]:=GT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.2504957133922061;
+Q_RELAX.reference_2[14][30]:=AC*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1214054057357627;
+Q_RELAX.reference_2[14][46]:=t*Min(1000,RELAX.reference.omega_1^local_k)*0.3053650319994416;
+Q_RELAX.reference_2[14][59]:=AT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.250994522453953;
+Q_RELAX.reference_2[15][3]:=AT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.5007522026922482;
+Q_RELAX.reference_2[15][7]:=CT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1351200521140052;
+Q_RELAX.reference_2[15][11]:=GT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1344351325741675;
+Q_RELAX.reference_2[15][12]:=AT*t*0.3824103826488193;
+Q_RELAX.reference_2[15][13]:=CT*t*0.1264560133035801;
+Q_RELAX.reference_2[15][14]:=GT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.2406378906553946;
+Q_RELAX.reference_2[15][31]:=AC*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1214054057357627;
+Q_RELAX.reference_2[15][47]:=t*Min(1000,RELAX.reference.omega_1^local_k)*0.3053650319994416;
+Q_RELAX.reference_2[15][60]:=AT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.250994522453953;
+Q_RELAX.reference_2[16][0]:=AC*t*Min(1000,RELAX.reference.omega_1^local_k)*0.3222350398108426;
+Q_RELAX.reference_2[16][17]:=AC*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1264560133035801;
+Q_RELAX.reference_2[16][18]:=t*0.2406378906553946;
+Q_RELAX.reference_2[16][19]:=AT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.2504957133922061;
+Q_RELAX.reference_2[16][20]:=AC*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1351200521140052;
+Q_RELAX.reference_2[16][24]:=t*Min(1000,RELAX.reference.omega_1^local_k)*0.1344351325741675;
+Q_RELAX.reference_2[16][28]:=AT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.2296926126195792;
+Q_RELAX.reference_2[16][32]:=CG*t*Min(1000,RELAX.reference.omega_1^local_k)*0.3053650319994416;
+Q_RELAX.reference_2[17][1]:=AC*t*Min(1000,RELAX.reference.omega_1^local_k)*0.3222350398108426;
+Q_RELAX.reference_2[17][16]:=AC*t*Min(1000,RELAX.reference.omega_1^local_k)*0.3824103826488193;
+Q_RELAX.reference_2[17][18]:=CG*t*Min(1000,RELAX.reference.omega_1^local_k)*0.2406378906553946;
+Q_RELAX.reference_2[17][19]:=CT*t*0.2504957133922061;
+Q_RELAX.reference_2[17][21]:=AC*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1351200521140052;
+Q_RELAX.reference_2[17][25]:=t*Min(1000,RELAX.reference.omega_1^local_k)*0.1344351325741675;
+Q_RELAX.reference_2[17][29]:=AT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.2296926126195792;
+Q_RELAX.reference_2[17][33]:=CG*t*Min(1000,RELAX.reference.omega_1^local_k)*0.3053650319994416;
+Q_RELAX.reference_2[17][48]:=CT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.250994522453953;
+Q_RELAX.reference_2[18][2]:=AC*t*Min(1000,RELAX.reference.omega_1^local_k)*0.3222350398108426;
+Q_RELAX.reference_2[18][16]:=t*0.3824103826488193;
+Q_RELAX.reference_2[18][17]:=CG*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1264560133035801;
+Q_RELAX.reference_2[18][19]:=GT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.2504957133922061;
+Q_RELAX.reference_2[18][22]:=AC*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1351200521140052;
+Q_RELAX.reference_2[18][26]:=t*Min(1000,RELAX.reference.omega_1^local_k)*0.1344351325741675;
+Q_RELAX.reference_2[18][30]:=AT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.2296926126195792;
+Q_RELAX.reference_2[18][34]:=CG*t*Min(1000,RELAX.reference.omega_1^local_k)*0.3053650319994416;
+Q_RELAX.reference_2[19][3]:=AC*t*Min(1000,RELAX.reference.omega_1^local_k)*0.3222350398108426;
+Q_RELAX.reference_2[19][16]:=AT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.3824103826488193;
+Q_RELAX.reference_2[19][17]:=CT*t*0.1264560133035801;
+Q_RELAX.reference_2[19][18]:=GT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.2406378906553946;
+Q_RELAX.reference_2[19][23]:=AC*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1351200521140052;
+Q_RELAX.reference_2[19][27]:=t*Min(1000,RELAX.reference.omega_1^local_k)*0.1344351325741675;
+Q_RELAX.reference_2[19][31]:=AT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.2296926126195792;
+Q_RELAX.reference_2[19][35]:=CG*t*Min(1000,RELAX.reference.omega_1^local_k)*0.3053650319994416;
+Q_RELAX.reference_2[19][49]:=CT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.250994522453953;
+Q_RELAX.reference_2[20][4]:=AC*t*Min(1000,RELAX.reference.omega_1^local_k)*0.3222350398108426;
+Q_RELAX.reference_2[20][16]:=AC*t*Min(1000,RELAX.reference.omega_1^local_k)*0.5007522026922482;
+Q_RELAX.reference_2[20][21]:=AC*t*0.1264560133035801;
+Q_RELAX.reference_2[20][22]:=t*0.2406378906553946;
+Q_RELAX.reference_2[20][23]:=AT*t*0.2504957133922061;
+Q_RELAX.reference_2[20][24]:=CG*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1344351325741675;
+Q_RELAX.reference_2[20][28]:=CT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.2296926126195792;
+Q_RELAX.reference_2[20][36]:=CG*t*Min(1000,RELAX.reference.omega_1^local_k)*0.3053650319994416;
+Q_RELAX.reference_2[20][50]:=CT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.250994522453953;
+Q_RELAX.reference_2[21][5]:=AC*t*Min(1000,RELAX.reference.omega_1^local_k)*0.3222350398108426;
+Q_RELAX.reference_2[21][17]:=AC*t*Min(1000,RELAX.reference.omega_1^local_k)*0.5007522026922482;
+Q_RELAX.reference_2[21][20]:=AC*t*0.3824103826488193;
+Q_RELAX.reference_2[21][22]:=CG*t*0.2406378906553946;
+Q_RELAX.reference_2[21][23]:=CT*t*0.2504957133922061;
+Q_RELAX.reference_2[21][25]:=CG*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1344351325741675;
+Q_RELAX.reference_2[21][29]:=CT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.2296926126195792;
+Q_RELAX.reference_2[21][37]:=CG*t*Min(1000,RELAX.reference.omega_1^local_k)*0.3053650319994416;
+Q_RELAX.reference_2[21][51]:=CT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.250994522453953;
+Q_RELAX.reference_2[22][6]:=AC*t*Min(1000,RELAX.reference.omega_1^local_k)*0.3222350398108426;
+Q_RELAX.reference_2[22][18]:=AC*t*Min(1000,RELAX.reference.omega_1^local_k)*0.5007522026922482;
+Q_RELAX.reference_2[22][20]:=t*0.3824103826488193;
+Q_RELAX.reference_2[22][21]:=CG*t*0.1264560133035801;
+Q_RELAX.reference_2[22][23]:=GT*t*0.2504957133922061;
+Q_RELAX.reference_2[22][26]:=CG*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1344351325741675;
+Q_RELAX.reference_2[22][30]:=CT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.2296926126195792;
+Q_RELAX.reference_2[22][38]:=CG*t*Min(1000,RELAX.reference.omega_1^local_k)*0.3053650319994416;
+Q_RELAX.reference_2[22][52]:=CT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.250994522453953;
+Q_RELAX.reference_2[23][7]:=AC*t*Min(1000,RELAX.reference.omega_1^local_k)*0.3222350398108426;
+Q_RELAX.reference_2[23][19]:=AC*t*Min(1000,RELAX.reference.omega_1^local_k)*0.5007522026922482;
+Q_RELAX.reference_2[23][20]:=AT*t*0.3824103826488193;
+Q_RELAX.reference_2[23][21]:=CT*t*0.1264560133035801;
+Q_RELAX.reference_2[23][22]:=GT*t*0.2406378906553946;
+Q_RELAX.reference_2[23][27]:=CG*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1344351325741675;
+Q_RELAX.reference_2[23][31]:=CT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.2296926126195792;
+Q_RELAX.reference_2[23][39]:=CG*t*Min(1000,RELAX.reference.omega_1^local_k)*0.3053650319994416;
+Q_RELAX.reference_2[23][53]:=CT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.250994522453953;
+Q_RELAX.reference_2[24][8]:=AC*t*0.3222350398108426;
+Q_RELAX.reference_2[24][16]:=t*Min(1000,RELAX.reference.omega_1^local_k)*0.5007522026922482;
+Q_RELAX.reference_2[24][20]:=CG*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1351200521140052;
+Q_RELAX.reference_2[24][25]:=AC*t*0.1264560133035801;
+Q_RELAX.reference_2[24][26]:=t*0.2406378906553946;
+Q_RELAX.reference_2[24][27]:=AT*t*0.2504957133922061;
+Q_RELAX.reference_2[24][28]:=GT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.2296926126195792;
+Q_RELAX.reference_2[24][40]:=CG*t*Min(1000,RELAX.reference.omega_1^local_k)*0.3053650319994416;
+Q_RELAX.reference_2[25][9]:=AC*t*Min(1000,RELAX.reference.omega_1^local_k)*0.3222350398108426;
+Q_RELAX.reference_2[25][17]:=t*Min(1000,RELAX.reference.omega_1^local_k)*0.5007522026922482;
+Q_RELAX.reference_2[25][21]:=CG*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1351200521140052;
+Q_RELAX.reference_2[25][24]:=AC*t*0.3824103826488193;
+Q_RELAX.reference_2[25][26]:=CG*t*0.2406378906553946;
+Q_RELAX.reference_2[25][27]:=CT*t*0.2504957133922061;
+Q_RELAX.reference_2[25][29]:=GT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.2296926126195792;
+Q_RELAX.reference_2[25][41]:=CG*t*Min(1000,RELAX.reference.omega_1^local_k)*0.3053650319994416;
+Q_RELAX.reference_2[25][54]:=CT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.250994522453953;
+Q_RELAX.reference_2[26][10]:=AC*t*0.3222350398108426;
+Q_RELAX.reference_2[26][18]:=t*Min(1000,RELAX.reference.omega_1^local_k)*0.5007522026922482;
+Q_RELAX.reference_2[26][22]:=CG*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1351200521140052;
+Q_RELAX.reference_2[26][24]:=t*0.3824103826488193;
+Q_RELAX.reference_2[26][25]:=CG*t*0.1264560133035801;
+Q_RELAX.reference_2[26][27]:=GT*t*0.2504957133922061;
+Q_RELAX.reference_2[26][30]:=GT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.2296926126195792;
+Q_RELAX.reference_2[26][42]:=CG*t*Min(1000,RELAX.reference.omega_1^local_k)*0.3053650319994416;
+Q_RELAX.reference_2[26][55]:=CT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.250994522453953;
+Q_RELAX.reference_2[27][11]:=AC*t*Min(1000,RELAX.reference.omega_1^local_k)*0.3222350398108426;
+Q_RELAX.reference_2[27][19]:=t*Min(1000,RELAX.reference.omega_1^local_k)*0.5007522026922482;
+Q_RELAX.reference_2[27][23]:=CG*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1351200521140052;
+Q_RELAX.reference_2[27][24]:=AT*t*0.3824103826488193;
+Q_RELAX.reference_2[27][25]:=CT*t*0.1264560133035801;
+Q_RELAX.reference_2[27][26]:=GT*t*0.2406378906553946;
+Q_RELAX.reference_2[27][31]:=GT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.2296926126195792;
+Q_RELAX.reference_2[27][43]:=CG*t*Min(1000,RELAX.reference.omega_1^local_k)*0.3053650319994416;
+Q_RELAX.reference_2[27][56]:=CT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.250994522453953;
+Q_RELAX.reference_2[28][12]:=AC*t*Min(1000,RELAX.reference.omega_1^local_k)*0.3222350398108426;
+Q_RELAX.reference_2[28][16]:=AT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.5007522026922482;
+Q_RELAX.reference_2[28][20]:=CT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1351200521140052;
+Q_RELAX.reference_2[28][24]:=GT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1344351325741675;
+Q_RELAX.reference_2[28][29]:=AC*t*0.1264560133035801;
+Q_RELAX.reference_2[28][30]:=t*0.2406378906553946;
+Q_RELAX.reference_2[28][31]:=AT*t*0.2504957133922061;
+Q_RELAX.reference_2[28][44]:=CG*t*Min(1000,RELAX.reference.omega_1^local_k)*0.3053650319994416;
+Q_RELAX.reference_2[28][57]:=CT*t*0.250994522453953;
+Q_RELAX.reference_2[29][13]:=AC*t*Min(1000,RELAX.reference.omega_1^local_k)*0.3222350398108426;
+Q_RELAX.reference_2[29][17]:=AT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.5007522026922482;
+Q_RELAX.reference_2[29][21]:=CT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1351200521140052;
+Q_RELAX.reference_2[29][25]:=GT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1344351325741675;
+Q_RELAX.reference_2[29][28]:=AC*t*0.3824103826488193;
+Q_RELAX.reference_2[29][30]:=CG*t*0.2406378906553946;
+Q_RELAX.reference_2[29][31]:=CT*t*0.2504957133922061;
+Q_RELAX.reference_2[29][45]:=CG*t*Min(1000,RELAX.reference.omega_1^local_k)*0.3053650319994416;
+Q_RELAX.reference_2[29][58]:=CT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.250994522453953;
+Q_RELAX.reference_2[30][14]:=AC*t*Min(1000,RELAX.reference.omega_1^local_k)*0.3222350398108426;
+Q_RELAX.reference_2[30][18]:=AT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.5007522026922482;
+Q_RELAX.reference_2[30][22]:=CT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1351200521140052;
+Q_RELAX.reference_2[30][26]:=GT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1344351325741675;
+Q_RELAX.reference_2[30][28]:=t*0.3824103826488193;
+Q_RELAX.reference_2[30][29]:=CG*t*0.1264560133035801;
+Q_RELAX.reference_2[30][31]:=GT*t*0.2504957133922061;
+Q_RELAX.reference_2[30][46]:=CG*t*Min(1000,RELAX.reference.omega_1^local_k)*0.3053650319994416;
+Q_RELAX.reference_2[30][59]:=CT*t*0.250994522453953;
+Q_RELAX.reference_2[31][15]:=AC*t*Min(1000,RELAX.reference.omega_1^local_k)*0.3222350398108426;
+Q_RELAX.reference_2[31][19]:=AT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.5007522026922482;
+Q_RELAX.reference_2[31][23]:=CT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1351200521140052;
+Q_RELAX.reference_2[31][27]:=GT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1344351325741675;
+Q_RELAX.reference_2[31][28]:=AT*t*0.3824103826488193;
+Q_RELAX.reference_2[31][29]:=CT*t*0.1264560133035801;
+Q_RELAX.reference_2[31][30]:=GT*t*0.2406378906553946;
+Q_RELAX.reference_2[31][47]:=CG*t*Min(1000,RELAX.reference.omega_1^local_k)*0.3053650319994416;
+Q_RELAX.reference_2[31][60]:=CT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.250994522453953;
+Q_RELAX.reference_2[32][0]:=t*Min(1000,RELAX.reference.omega_1^local_k)*0.3222350398108426;
+Q_RELAX.reference_2[32][16]:=CG*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1214054057357627;
+Q_RELAX.reference_2[32][33]:=AC*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1264560133035801;
+Q_RELAX.reference_2[32][34]:=t*0.2406378906553946;
+Q_RELAX.reference_2[32][35]:=AT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.2504957133922061;
+Q_RELAX.reference_2[32][36]:=AC*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1351200521140052;
+Q_RELAX.reference_2[32][40]:=t*Min(1000,RELAX.reference.omega_1^local_k)*0.1344351325741675;
+Q_RELAX.reference_2[32][44]:=AT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.2296926126195792;
+Q_RELAX.reference_2[33][1]:=t*Min(1000,RELAX.reference.omega_1^local_k)*0.3222350398108426;
+Q_RELAX.reference_2[33][17]:=CG*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1214054057357627;
+Q_RELAX.reference_2[33][32]:=AC*t*Min(1000,RELAX.reference.omega_1^local_k)*0.3824103826488193;
+Q_RELAX.reference_2[33][34]:=CG*t*Min(1000,RELAX.reference.omega_1^local_k)*0.2406378906553946;
+Q_RELAX.reference_2[33][35]:=CT*t*0.2504957133922061;
+Q_RELAX.reference_2[33][37]:=AC*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1351200521140052;
+Q_RELAX.reference_2[33][41]:=t*Min(1000,RELAX.reference.omega_1^local_k)*0.1344351325741675;
+Q_RELAX.reference_2[33][45]:=AT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.2296926126195792;
+Q_RELAX.reference_2[33][48]:=GT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.250994522453953;
+Q_RELAX.reference_2[34][2]:=t*Min(1000,RELAX.reference.omega_1^local_k)*0.3222350398108426;
+Q_RELAX.reference_2[34][18]:=CG*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1214054057357627;
+Q_RELAX.reference_2[34][32]:=t*0.3824103826488193;
+Q_RELAX.reference_2[34][33]:=CG*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1264560133035801;
+Q_RELAX.reference_2[34][35]:=GT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.2504957133922061;
+Q_RELAX.reference_2[34][38]:=AC*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1351200521140052;
+Q_RELAX.reference_2[34][42]:=t*Min(1000,RELAX.reference.omega_1^local_k)*0.1344351325741675;
+Q_RELAX.reference_2[34][46]:=AT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.2296926126195792;
+Q_RELAX.reference_2[35][3]:=t*Min(1000,RELAX.reference.omega_1^local_k)*0.3222350398108426;
+Q_RELAX.reference_2[35][19]:=CG*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1214054057357627;
+Q_RELAX.reference_2[35][32]:=AT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.3824103826488193;
+Q_RELAX.reference_2[35][33]:=CT*t*0.1264560133035801;
+Q_RELAX.reference_2[35][34]:=GT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.2406378906553946;
+Q_RELAX.reference_2[35][39]:=AC*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1351200521140052;
+Q_RELAX.reference_2[35][43]:=t*Min(1000,RELAX.reference.omega_1^local_k)*0.1344351325741675;
+Q_RELAX.reference_2[35][47]:=AT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.2296926126195792;
+Q_RELAX.reference_2[35][49]:=GT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.250994522453953;
+Q_RELAX.reference_2[36][4]:=t*Min(1000,RELAX.reference.omega_1^local_k)*0.3222350398108426;
+Q_RELAX.reference_2[36][20]:=CG*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1214054057357627;
+Q_RELAX.reference_2[36][32]:=AC*t*Min(1000,RELAX.reference.omega_1^local_k)*0.5007522026922482;
+Q_RELAX.reference_2[36][37]:=AC*t*0.1264560133035801;
+Q_RELAX.reference_2[36][38]:=t*0.2406378906553946;
+Q_RELAX.reference_2[36][39]:=AT*t*0.2504957133922061;
+Q_RELAX.reference_2[36][40]:=CG*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1344351325741675;
+Q_RELAX.reference_2[36][44]:=CT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.2296926126195792;
+Q_RELAX.reference_2[36][50]:=GT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.250994522453953;
+Q_RELAX.reference_2[37][5]:=t*Min(1000,RELAX.reference.omega_1^local_k)*0.3222350398108426;
+Q_RELAX.reference_2[37][21]:=CG*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1214054057357627;
+Q_RELAX.reference_2[37][33]:=AC*t*Min(1000,RELAX.reference.omega_1^local_k)*0.5007522026922482;
+Q_RELAX.reference_2[37][36]:=AC*t*0.3824103826488193;
+Q_RELAX.reference_2[37][38]:=CG*t*0.2406378906553946;
+Q_RELAX.reference_2[37][39]:=CT*t*0.2504957133922061;
+Q_RELAX.reference_2[37][41]:=CG*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1344351325741675;
+Q_RELAX.reference_2[37][45]:=CT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.2296926126195792;
+Q_RELAX.reference_2[37][51]:=GT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.250994522453953;
+Q_RELAX.reference_2[38][6]:=t*Min(1000,RELAX.reference.omega_1^local_k)*0.3222350398108426;
+Q_RELAX.reference_2[38][22]:=CG*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1214054057357627;
+Q_RELAX.reference_2[38][34]:=AC*t*Min(1000,RELAX.reference.omega_1^local_k)*0.5007522026922482;
+Q_RELAX.reference_2[38][36]:=t*0.3824103826488193;
+Q_RELAX.reference_2[38][37]:=CG*t*0.1264560133035801;
+Q_RELAX.reference_2[38][39]:=GT*t*0.2504957133922061;
+Q_RELAX.reference_2[38][42]:=CG*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1344351325741675;
+Q_RELAX.reference_2[38][46]:=CT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.2296926126195792;
+Q_RELAX.reference_2[38][52]:=GT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.250994522453953;
+Q_RELAX.reference_2[39][7]:=t*Min(1000,RELAX.reference.omega_1^local_k)*0.3222350398108426;
+Q_RELAX.reference_2[39][23]:=CG*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1214054057357627;
+Q_RELAX.reference_2[39][35]:=AC*t*Min(1000,RELAX.reference.omega_1^local_k)*0.5007522026922482;
+Q_RELAX.reference_2[39][36]:=AT*t*0.3824103826488193;
+Q_RELAX.reference_2[39][37]:=CT*t*0.1264560133035801;
+Q_RELAX.reference_2[39][38]:=GT*t*0.2406378906553946;
+Q_RELAX.reference_2[39][43]:=CG*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1344351325741675;
+Q_RELAX.reference_2[39][47]:=CT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.2296926126195792;
+Q_RELAX.reference_2[39][53]:=GT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.250994522453953;
+Q_RELAX.reference_2[40][8]:=t*Min(1000,RELAX.reference.omega_1^local_k)*0.3222350398108426;
+Q_RELAX.reference_2[40][24]:=CG*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1214054057357627;
+Q_RELAX.reference_2[40][32]:=t*Min(1000,RELAX.reference.omega_1^local_k)*0.5007522026922482;
+Q_RELAX.reference_2[40][36]:=CG*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1351200521140052;
+Q_RELAX.reference_2[40][41]:=AC*t*0.1264560133035801;
+Q_RELAX.reference_2[40][42]:=t*0.2406378906553946;
+Q_RELAX.reference_2[40][43]:=AT*t*0.2504957133922061;
+Q_RELAX.reference_2[40][44]:=GT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.2296926126195792;
+Q_RELAX.reference_2[41][9]:=t*Min(1000,RELAX.reference.omega_1^local_k)*0.3222350398108426;
+Q_RELAX.reference_2[41][25]:=CG*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1214054057357627;
+Q_RELAX.reference_2[41][33]:=t*Min(1000,RELAX.reference.omega_1^local_k)*0.5007522026922482;
+Q_RELAX.reference_2[41][37]:=CG*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1351200521140052;
+Q_RELAX.reference_2[41][40]:=AC*t*0.3824103826488193;
+Q_RELAX.reference_2[41][42]:=CG*t*0.2406378906553946;
+Q_RELAX.reference_2[41][43]:=CT*t*0.2504957133922061;
+Q_RELAX.reference_2[41][45]:=GT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.2296926126195792;
+Q_RELAX.reference_2[41][54]:=GT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.250994522453953;
+Q_RELAX.reference_2[42][10]:=t*Min(1000,RELAX.reference.omega_1^local_k)*0.3222350398108426;
+Q_RELAX.reference_2[42][26]:=CG*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1214054057357627;
+Q_RELAX.reference_2[42][34]:=t*Min(1000,RELAX.reference.omega_1^local_k)*0.5007522026922482;
+Q_RELAX.reference_2[42][38]:=CG*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1351200521140052;
+Q_RELAX.reference_2[42][40]:=t*0.3824103826488193;
+Q_RELAX.reference_2[42][41]:=CG*t*0.1264560133035801;
+Q_RELAX.reference_2[42][43]:=GT*t*0.2504957133922061;
+Q_RELAX.reference_2[42][46]:=GT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.2296926126195792;
+Q_RELAX.reference_2[42][55]:=GT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.250994522453953;
+Q_RELAX.reference_2[43][11]:=t*Min(1000,RELAX.reference.omega_1^local_k)*0.3222350398108426;
+Q_RELAX.reference_2[43][27]:=CG*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1214054057357627;
+Q_RELAX.reference_2[43][35]:=t*Min(1000,RELAX.reference.omega_1^local_k)*0.5007522026922482;
+Q_RELAX.reference_2[43][39]:=CG*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1351200521140052;
+Q_RELAX.reference_2[43][40]:=AT*t*0.3824103826488193;
+Q_RELAX.reference_2[43][41]:=CT*t*0.1264560133035801;
+Q_RELAX.reference_2[43][42]:=GT*t*0.2406378906553946;
+Q_RELAX.reference_2[43][47]:=GT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.2296926126195792;
+Q_RELAX.reference_2[43][56]:=GT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.250994522453953;
+Q_RELAX.reference_2[44][12]:=t*Min(1000,RELAX.reference.omega_1^local_k)*0.3222350398108426;
+Q_RELAX.reference_2[44][28]:=CG*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1214054057357627;
+Q_RELAX.reference_2[44][32]:=AT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.5007522026922482;
+Q_RELAX.reference_2[44][36]:=CT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1351200521140052;
+Q_RELAX.reference_2[44][40]:=GT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1344351325741675;
+Q_RELAX.reference_2[44][45]:=AC*t*0.1264560133035801;
+Q_RELAX.reference_2[44][46]:=t*0.2406378906553946;
+Q_RELAX.reference_2[44][47]:=AT*t*0.2504957133922061;
+Q_RELAX.reference_2[44][57]:=GT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.250994522453953;
+Q_RELAX.reference_2[45][13]:=t*Min(1000,RELAX.reference.omega_1^local_k)*0.3222350398108426;
+Q_RELAX.reference_2[45][29]:=CG*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1214054057357627;
+Q_RELAX.reference_2[45][33]:=AT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.5007522026922482;
+Q_RELAX.reference_2[45][37]:=CT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1351200521140052;
+Q_RELAX.reference_2[45][41]:=GT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1344351325741675;
+Q_RELAX.reference_2[45][44]:=AC*t*0.3824103826488193;
+Q_RELAX.reference_2[45][46]:=CG*t*0.2406378906553946;
+Q_RELAX.reference_2[45][47]:=CT*t*0.2504957133922061;
+Q_RELAX.reference_2[45][58]:=GT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.250994522453953;
+Q_RELAX.reference_2[46][14]:=t*Min(1000,RELAX.reference.omega_1^local_k)*0.3222350398108426;
+Q_RELAX.reference_2[46][30]:=CG*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1214054057357627;
+Q_RELAX.reference_2[46][34]:=AT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.5007522026922482;
+Q_RELAX.reference_2[46][38]:=CT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1351200521140052;
+Q_RELAX.reference_2[46][42]:=GT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1344351325741675;
+Q_RELAX.reference_2[46][44]:=t*0.3824103826488193;
+Q_RELAX.reference_2[46][45]:=CG*t*0.1264560133035801;
+Q_RELAX.reference_2[46][47]:=GT*t*0.2504957133922061;
+Q_RELAX.reference_2[46][59]:=GT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.250994522453953;
+Q_RELAX.reference_2[47][15]:=t*Min(1000,RELAX.reference.omega_1^local_k)*0.3222350398108426;
+Q_RELAX.reference_2[47][31]:=CG*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1214054057357627;
+Q_RELAX.reference_2[47][35]:=AT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.5007522026922482;
+Q_RELAX.reference_2[47][39]:=CT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1351200521140052;
+Q_RELAX.reference_2[47][43]:=GT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1344351325741675;
+Q_RELAX.reference_2[47][44]:=AT*t*0.3824103826488193;
+Q_RELAX.reference_2[47][45]:=CT*t*0.1264560133035801;
+Q_RELAX.reference_2[47][46]:=GT*t*0.2406378906553946;
+Q_RELAX.reference_2[47][60]:=GT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.250994522453953;
+Q_RELAX.reference_2[48][1]:=AT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.3222350398108426;
+Q_RELAX.reference_2[48][17]:=CT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1214054057357627;
+Q_RELAX.reference_2[48][33]:=GT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.3053650319994416;
+Q_RELAX.reference_2[48][49]:=CT*t*0.2504957133922061;
+Q_RELAX.reference_2[48][51]:=AC*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1351200521140052;
+Q_RELAX.reference_2[48][54]:=t*Min(1000,RELAX.reference.omega_1^local_k)*0.1344351325741675;
+Q_RELAX.reference_2[48][58]:=AT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.2296926126195792;
+Q_RELAX.reference_2[49][3]:=AT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.3222350398108426;
+Q_RELAX.reference_2[49][19]:=CT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1214054057357627;
+Q_RELAX.reference_2[49][35]:=GT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.3053650319994416;
+Q_RELAX.reference_2[49][48]:=CT*t*0.1264560133035801;
+Q_RELAX.reference_2[49][53]:=AC*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1351200521140052;
+Q_RELAX.reference_2[49][56]:=t*Min(1000,RELAX.reference.omega_1^local_k)*0.1344351325741675;
+Q_RELAX.reference_2[49][60]:=AT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.2296926126195792;
+Q_RELAX.reference_2[50][4]:=AT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.3222350398108426;
+Q_RELAX.reference_2[50][20]:=CT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1214054057357627;
+Q_RELAX.reference_2[50][36]:=GT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.3053650319994416;
+Q_RELAX.reference_2[50][51]:=AC*t*0.1264560133035801;
+Q_RELAX.reference_2[50][52]:=t*0.2406378906553946;
+Q_RELAX.reference_2[50][53]:=AT*t*0.2504957133922061;
+Q_RELAX.reference_2[50][57]:=CT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.2296926126195792;
+Q_RELAX.reference_2[51][5]:=AT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.3222350398108426;
+Q_RELAX.reference_2[51][21]:=CT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1214054057357627;
+Q_RELAX.reference_2[51][37]:=GT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.3053650319994416;
+Q_RELAX.reference_2[51][48]:=AC*t*Min(1000,RELAX.reference.omega_1^local_k)*0.5007522026922482;
+Q_RELAX.reference_2[51][50]:=AC*t*0.3824103826488193;
+Q_RELAX.reference_2[51][52]:=CG*t*0.2406378906553946;
+Q_RELAX.reference_2[51][53]:=CT*t*0.2504957133922061;
+Q_RELAX.reference_2[51][54]:=CG*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1344351325741675;
+Q_RELAX.reference_2[51][58]:=CT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.2296926126195792;
+Q_RELAX.reference_2[52][6]:=AT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.3222350398108426;
+Q_RELAX.reference_2[52][22]:=CT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1214054057357627;
+Q_RELAX.reference_2[52][38]:=GT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.3053650319994416;
+Q_RELAX.reference_2[52][50]:=t*0.3824103826488193;
+Q_RELAX.reference_2[52][51]:=CG*t*0.1264560133035801;
+Q_RELAX.reference_2[52][53]:=GT*t*0.2504957133922061;
+Q_RELAX.reference_2[52][55]:=CG*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1344351325741675;
+Q_RELAX.reference_2[52][59]:=CT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.2296926126195792;
+Q_RELAX.reference_2[53][7]:=AT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.3222350398108426;
+Q_RELAX.reference_2[53][23]:=CT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1214054057357627;
+Q_RELAX.reference_2[53][39]:=GT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.3053650319994416;
+Q_RELAX.reference_2[53][49]:=AC*t*Min(1000,RELAX.reference.omega_1^local_k)*0.5007522026922482;
+Q_RELAX.reference_2[53][50]:=AT*t*0.3824103826488193;
+Q_RELAX.reference_2[53][51]:=CT*t*0.1264560133035801;
+Q_RELAX.reference_2[53][52]:=GT*t*0.2406378906553946;
+Q_RELAX.reference_2[53][56]:=CG*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1344351325741675;
+Q_RELAX.reference_2[53][60]:=CT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.2296926126195792;
+Q_RELAX.reference_2[54][9]:=AT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.3222350398108426;
+Q_RELAX.reference_2[54][25]:=CT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1214054057357627;
+Q_RELAX.reference_2[54][41]:=GT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.3053650319994416;
+Q_RELAX.reference_2[54][48]:=t*Min(1000,RELAX.reference.omega_1^local_k)*0.5007522026922482;
+Q_RELAX.reference_2[54][51]:=CG*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1351200521140052;
+Q_RELAX.reference_2[54][55]:=CG*t*Min(1000,RELAX.reference.omega_1^local_k)*0.2406378906553946;
+Q_RELAX.reference_2[54][56]:=CT*t*0.2504957133922061;
+Q_RELAX.reference_2[54][58]:=GT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.2296926126195792;
+Q_RELAX.reference_2[55][10]:=AT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.3222350398108426;
+Q_RELAX.reference_2[55][26]:=CT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1214054057357627;
+Q_RELAX.reference_2[55][42]:=GT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.3053650319994416;
+Q_RELAX.reference_2[55][52]:=CG*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1351200521140052;
+Q_RELAX.reference_2[55][54]:=CG*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1264560133035801;
+Q_RELAX.reference_2[55][56]:=GT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.2504957133922061;
+Q_RELAX.reference_2[55][59]:=GT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.2296926126195792;
+Q_RELAX.reference_2[56][11]:=AT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.3222350398108426;
+Q_RELAX.reference_2[56][27]:=CT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1214054057357627;
+Q_RELAX.reference_2[56][43]:=GT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.3053650319994416;
+Q_RELAX.reference_2[56][49]:=t*Min(1000,RELAX.reference.omega_1^local_k)*0.5007522026922482;
+Q_RELAX.reference_2[56][53]:=CG*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1351200521140052;
+Q_RELAX.reference_2[56][54]:=CT*t*0.1264560133035801;
+Q_RELAX.reference_2[56][55]:=GT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.2406378906553946;
+Q_RELAX.reference_2[56][60]:=GT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.2296926126195792;
+Q_RELAX.reference_2[57][12]:=AT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.3222350398108426;
+Q_RELAX.reference_2[57][28]:=CT*t*0.1214054057357627;
+Q_RELAX.reference_2[57][44]:=GT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.3053650319994416;
+Q_RELAX.reference_2[57][50]:=CT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1351200521140052;
+Q_RELAX.reference_2[57][58]:=AC*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1264560133035801;
+Q_RELAX.reference_2[57][59]:=t*0.2406378906553946;
+Q_RELAX.reference_2[57][60]:=AT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.2504957133922061;
+Q_RELAX.reference_2[58][13]:=AT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.3222350398108426;
+Q_RELAX.reference_2[58][29]:=CT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1214054057357627;
+Q_RELAX.reference_2[58][45]:=GT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.3053650319994416;
+Q_RELAX.reference_2[58][48]:=AT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.5007522026922482;
+Q_RELAX.reference_2[58][51]:=CT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1351200521140052;
+Q_RELAX.reference_2[58][54]:=GT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1344351325741675;
+Q_RELAX.reference_2[58][57]:=AC*t*Min(1000,RELAX.reference.omega_1^local_k)*0.3824103826488193;
+Q_RELAX.reference_2[58][59]:=CG*t*Min(1000,RELAX.reference.omega_1^local_k)*0.2406378906553946;
+Q_RELAX.reference_2[58][60]:=CT*t*0.2504957133922061;
+Q_RELAX.reference_2[59][14]:=AT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.3222350398108426;
+Q_RELAX.reference_2[59][30]:=CT*t*0.1214054057357627;
+Q_RELAX.reference_2[59][46]:=GT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.3053650319994416;
+Q_RELAX.reference_2[59][52]:=CT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1351200521140052;
+Q_RELAX.reference_2[59][55]:=GT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1344351325741675;
+Q_RELAX.reference_2[59][57]:=t*0.3824103826488193;
+Q_RELAX.reference_2[59][58]:=CG*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1264560133035801;
+Q_RELAX.reference_2[59][60]:=GT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.2504957133922061;
+Q_RELAX.reference_2[60][15]:=AT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.3222350398108426;
+Q_RELAX.reference_2[60][31]:=CT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1214054057357627;
+Q_RELAX.reference_2[60][47]:=GT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.3053650319994416;
+Q_RELAX.reference_2[60][49]:=AT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.5007522026922482;
+Q_RELAX.reference_2[60][53]:=CT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1351200521140052;
+Q_RELAX.reference_2[60][56]:=GT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1344351325741675;
+Q_RELAX.reference_2[60][57]:=AT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.3824103826488193;
+Q_RELAX.reference_2[60][58]:=CT*t*0.1264560133035801;
+Q_RELAX.reference_2[60][59]:=GT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.2406378906553946;
+
+
+Q_RELAX.reference_3={61,61};
+Q_RELAX.reference_3[0][1]:=AC*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1264560133035801;
+Q_RELAX.reference_3[0][2]:=t*0.2406378906553946;
+Q_RELAX.reference_3[0][3]:=AT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.2504957133922061;
+Q_RELAX.reference_3[0][4]:=AC*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1351200521140052;
+Q_RELAX.reference_3[0][8]:=t*Min(1000,RELAX.reference.omega_2^local_k)*0.1344351325741675;
+Q_RELAX.reference_3[0][12]:=AT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.2296926126195792;
+Q_RELAX.reference_3[0][16]:=AC*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1214054057357627;
+Q_RELAX.reference_3[0][32]:=t*Min(1000,RELAX.reference.omega_2^local_k)*0.3053650319994416;
+Q_RELAX.reference_3[1][0]:=AC*t*Min(1000,RELAX.reference.omega_2^local_k)*0.3824103826488193;
+Q_RELAX.reference_3[1][2]:=CG*t*Min(1000,RELAX.reference.omega_2^local_k)*0.2406378906553946;
+Q_RELAX.reference_3[1][3]:=CT*t*0.2504957133922061;
+Q_RELAX.reference_3[1][5]:=AC*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1351200521140052;
+Q_RELAX.reference_3[1][9]:=t*Min(1000,RELAX.reference.omega_2^local_k)*0.1344351325741675;
+Q_RELAX.reference_3[1][13]:=AT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.2296926126195792;
+Q_RELAX.reference_3[1][17]:=AC*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1214054057357627;
+Q_RELAX.reference_3[1][33]:=t*Min(1000,RELAX.reference.omega_2^local_k)*0.3053650319994416;
+Q_RELAX.reference_3[1][48]:=AT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.250994522453953;
+Q_RELAX.reference_3[2][0]:=t*0.3824103826488193;
+Q_RELAX.reference_3[2][1]:=CG*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1264560133035801;
+Q_RELAX.reference_3[2][3]:=GT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.2504957133922061;
+Q_RELAX.reference_3[2][6]:=AC*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1351200521140052;
+Q_RELAX.reference_3[2][10]:=t*Min(1000,RELAX.reference.omega_2^local_k)*0.1344351325741675;
+Q_RELAX.reference_3[2][14]:=AT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.2296926126195792;
+Q_RELAX.reference_3[2][18]:=AC*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1214054057357627;
+Q_RELAX.reference_3[2][34]:=t*Min(1000,RELAX.reference.omega_2^local_k)*0.3053650319994416;
+Q_RELAX.reference_3[3][0]:=AT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.3824103826488193;
+Q_RELAX.reference_3[3][1]:=CT*t*0.1264560133035801;
+Q_RELAX.reference_3[3][2]:=GT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.2406378906553946;
+Q_RELAX.reference_3[3][7]:=AC*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1351200521140052;
+Q_RELAX.reference_3[3][11]:=t*Min(1000,RELAX.reference.omega_2^local_k)*0.1344351325741675;
+Q_RELAX.reference_3[3][15]:=AT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.2296926126195792;
+Q_RELAX.reference_3[3][19]:=AC*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1214054057357627;
+Q_RELAX.reference_3[3][35]:=t*Min(1000,RELAX.reference.omega_2^local_k)*0.3053650319994416;
+Q_RELAX.reference_3[3][49]:=AT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.250994522453953;
+Q_RELAX.reference_3[4][0]:=AC*t*Min(1000,RELAX.reference.omega_2^local_k)*0.5007522026922482;
+Q_RELAX.reference_3[4][5]:=AC*t*0.1264560133035801;
+Q_RELAX.reference_3[4][6]:=t*0.2406378906553946;
+Q_RELAX.reference_3[4][7]:=AT*t*0.2504957133922061;
+Q_RELAX.reference_3[4][8]:=CG*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1344351325741675;
+Q_RELAX.reference_3[4][12]:=CT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.2296926126195792;
+Q_RELAX.reference_3[4][20]:=AC*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1214054057357627;
+Q_RELAX.reference_3[4][36]:=t*Min(1000,RELAX.reference.omega_2^local_k)*0.3053650319994416;
+Q_RELAX.reference_3[4][50]:=AT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.250994522453953;
+Q_RELAX.reference_3[5][1]:=AC*t*Min(1000,RELAX.reference.omega_2^local_k)*0.5007522026922482;
+Q_RELAX.reference_3[5][4]:=AC*t*0.3824103826488193;
+Q_RELAX.reference_3[5][6]:=CG*t*0.2406378906553946;
+Q_RELAX.reference_3[5][7]:=CT*t*0.2504957133922061;
+Q_RELAX.reference_3[5][9]:=CG*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1344351325741675;
+Q_RELAX.reference_3[5][13]:=CT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.2296926126195792;
+Q_RELAX.reference_3[5][21]:=AC*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1214054057357627;
+Q_RELAX.reference_3[5][37]:=t*Min(1000,RELAX.reference.omega_2^local_k)*0.3053650319994416;
+Q_RELAX.reference_3[5][51]:=AT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.250994522453953;
+Q_RELAX.reference_3[6][2]:=AC*t*Min(1000,RELAX.reference.omega_2^local_k)*0.5007522026922482;
+Q_RELAX.reference_3[6][4]:=t*0.3824103826488193;
+Q_RELAX.reference_3[6][5]:=CG*t*0.1264560133035801;
+Q_RELAX.reference_3[6][7]:=GT*t*0.2504957133922061;
+Q_RELAX.reference_3[6][10]:=CG*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1344351325741675;
+Q_RELAX.reference_3[6][14]:=CT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.2296926126195792;
+Q_RELAX.reference_3[6][22]:=AC*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1214054057357627;
+Q_RELAX.reference_3[6][38]:=t*Min(1000,RELAX.reference.omega_2^local_k)*0.3053650319994416;
+Q_RELAX.reference_3[6][52]:=AT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.250994522453953;
+Q_RELAX.reference_3[7][3]:=AC*t*Min(1000,RELAX.reference.omega_2^local_k)*0.5007522026922482;
+Q_RELAX.reference_3[7][4]:=AT*t*0.3824103826488193;
+Q_RELAX.reference_3[7][5]:=CT*t*0.1264560133035801;
+Q_RELAX.reference_3[7][6]:=GT*t*0.2406378906553946;
+Q_RELAX.reference_3[7][11]:=CG*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1344351325741675;
+Q_RELAX.reference_3[7][15]:=CT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.2296926126195792;
+Q_RELAX.reference_3[7][23]:=AC*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1214054057357627;
+Q_RELAX.reference_3[7][39]:=t*Min(1000,RELAX.reference.omega_2^local_k)*0.3053650319994416;
+Q_RELAX.reference_3[7][53]:=AT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.250994522453953;
+Q_RELAX.reference_3[8][0]:=t*Min(1000,RELAX.reference.omega_2^local_k)*0.5007522026922482;
+Q_RELAX.reference_3[8][4]:=CG*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1351200521140052;
+Q_RELAX.reference_3[8][9]:=AC*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1264560133035801;
+Q_RELAX.reference_3[8][10]:=t*0.2406378906553946;
+Q_RELAX.reference_3[8][11]:=AT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.2504957133922061;
+Q_RELAX.reference_3[8][12]:=GT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.2296926126195792;
+Q_RELAX.reference_3[8][24]:=AC*t*0.1214054057357627;
+Q_RELAX.reference_3[8][40]:=t*Min(1000,RELAX.reference.omega_2^local_k)*0.3053650319994416;
+Q_RELAX.reference_3[9][1]:=t*Min(1000,RELAX.reference.omega_2^local_k)*0.5007522026922482;
+Q_RELAX.reference_3[9][5]:=CG*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1351200521140052;
+Q_RELAX.reference_3[9][8]:=AC*t*Min(1000,RELAX.reference.omega_2^local_k)*0.3824103826488193;
+Q_RELAX.reference_3[9][10]:=CG*t*Min(1000,RELAX.reference.omega_2^local_k)*0.2406378906553946;
+Q_RELAX.reference_3[9][11]:=CT*t*0.2504957133922061;
+Q_RELAX.reference_3[9][13]:=GT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.2296926126195792;
+Q_RELAX.reference_3[9][25]:=AC*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1214054057357627;
+Q_RELAX.reference_3[9][41]:=t*Min(1000,RELAX.reference.omega_2^local_k)*0.3053650319994416;
+Q_RELAX.reference_3[9][54]:=AT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.250994522453953;
+Q_RELAX.reference_3[10][2]:=t*Min(1000,RELAX.reference.omega_2^local_k)*0.5007522026922482;
+Q_RELAX.reference_3[10][6]:=CG*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1351200521140052;
+Q_RELAX.reference_3[10][8]:=t*0.3824103826488193;
+Q_RELAX.reference_3[10][9]:=CG*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1264560133035801;
+Q_RELAX.reference_3[10][11]:=GT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.2504957133922061;
+Q_RELAX.reference_3[10][14]:=GT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.2296926126195792;
+Q_RELAX.reference_3[10][26]:=AC*t*0.1214054057357627;
+Q_RELAX.reference_3[10][42]:=t*Min(1000,RELAX.reference.omega_2^local_k)*0.3053650319994416;
+Q_RELAX.reference_3[10][55]:=AT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.250994522453953;
+Q_RELAX.reference_3[11][3]:=t*Min(1000,RELAX.reference.omega_2^local_k)*0.5007522026922482;
+Q_RELAX.reference_3[11][7]:=CG*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1351200521140052;
+Q_RELAX.reference_3[11][8]:=AT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.3824103826488193;
+Q_RELAX.reference_3[11][9]:=CT*t*0.1264560133035801;
+Q_RELAX.reference_3[11][10]:=GT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.2406378906553946;
+Q_RELAX.reference_3[11][15]:=GT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.2296926126195792;
+Q_RELAX.reference_3[11][27]:=AC*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1214054057357627;
+Q_RELAX.reference_3[11][43]:=t*Min(1000,RELAX.reference.omega_2^local_k)*0.3053650319994416;
+Q_RELAX.reference_3[11][56]:=AT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.250994522453953;
+Q_RELAX.reference_3[12][0]:=AT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.5007522026922482;
+Q_RELAX.reference_3[12][4]:=CT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1351200521140052;
+Q_RELAX.reference_3[12][8]:=GT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1344351325741675;
+Q_RELAX.reference_3[12][13]:=AC*t*0.1264560133035801;
+Q_RELAX.reference_3[12][14]:=t*Min(1000,RELAX.reference.omega_2^local_k)*0.2406378906553946;
+Q_RELAX.reference_3[12][15]:=AT*t*0.2504957133922061;
+Q_RELAX.reference_3[12][28]:=AC*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1214054057357627;
+Q_RELAX.reference_3[12][44]:=t*Min(1000,RELAX.reference.omega_2^local_k)*0.3053650319994416;
+Q_RELAX.reference_3[12][57]:=AT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.250994522453953;
+Q_RELAX.reference_3[13][1]:=AT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.5007522026922482;
+Q_RELAX.reference_3[13][5]:=CT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1351200521140052;
+Q_RELAX.reference_3[13][9]:=GT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1344351325741675;
+Q_RELAX.reference_3[13][12]:=AC*t*0.3824103826488193;
+Q_RELAX.reference_3[13][14]:=CG*t*Min(1000,RELAX.reference.omega_2^local_k)*0.2406378906553946;
+Q_RELAX.reference_3[13][15]:=CT*t*0.2504957133922061;
+Q_RELAX.reference_3[13][29]:=AC*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1214054057357627;
+Q_RELAX.reference_3[13][45]:=t*Min(1000,RELAX.reference.omega_2^local_k)*0.3053650319994416;
+Q_RELAX.reference_3[13][58]:=AT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.250994522453953;
+Q_RELAX.reference_3[14][2]:=AT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.5007522026922482;
+Q_RELAX.reference_3[14][6]:=CT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1351200521140052;
+Q_RELAX.reference_3[14][10]:=GT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1344351325741675;
+Q_RELAX.reference_3[14][12]:=t*Min(1000,RELAX.reference.omega_2^local_k)*0.3824103826488193;
+Q_RELAX.reference_3[14][13]:=CG*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1264560133035801;
+Q_RELAX.reference_3[14][15]:=GT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.2504957133922061;
+Q_RELAX.reference_3[14][30]:=AC*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1214054057357627;
+Q_RELAX.reference_3[14][46]:=t*Min(1000,RELAX.reference.omega_2^local_k)*0.3053650319994416;
+Q_RELAX.reference_3[14][59]:=AT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.250994522453953;
+Q_RELAX.reference_3[15][3]:=AT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.5007522026922482;
+Q_RELAX.reference_3[15][7]:=CT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1351200521140052;
+Q_RELAX.reference_3[15][11]:=GT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1344351325741675;
+Q_RELAX.reference_3[15][12]:=AT*t*0.3824103826488193;
+Q_RELAX.reference_3[15][13]:=CT*t*0.1264560133035801;
+Q_RELAX.reference_3[15][14]:=GT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.2406378906553946;
+Q_RELAX.reference_3[15][31]:=AC*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1214054057357627;
+Q_RELAX.reference_3[15][47]:=t*Min(1000,RELAX.reference.omega_2^local_k)*0.3053650319994416;
+Q_RELAX.reference_3[15][60]:=AT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.250994522453953;
+Q_RELAX.reference_3[16][0]:=AC*t*Min(1000,RELAX.reference.omega_2^local_k)*0.3222350398108426;
+Q_RELAX.reference_3[16][17]:=AC*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1264560133035801;
+Q_RELAX.reference_3[16][18]:=t*0.2406378906553946;
+Q_RELAX.reference_3[16][19]:=AT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.2504957133922061;
+Q_RELAX.reference_3[16][20]:=AC*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1351200521140052;
+Q_RELAX.reference_3[16][24]:=t*Min(1000,RELAX.reference.omega_2^local_k)*0.1344351325741675;
+Q_RELAX.reference_3[16][28]:=AT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.2296926126195792;
+Q_RELAX.reference_3[16][32]:=CG*t*Min(1000,RELAX.reference.omega_2^local_k)*0.3053650319994416;
+Q_RELAX.reference_3[17][1]:=AC*t*Min(1000,RELAX.reference.omega_2^local_k)*0.3222350398108426;
+Q_RELAX.reference_3[17][16]:=AC*t*Min(1000,RELAX.reference.omega_2^local_k)*0.3824103826488193;
+Q_RELAX.reference_3[17][18]:=CG*t*Min(1000,RELAX.reference.omega_2^local_k)*0.2406378906553946;
+Q_RELAX.reference_3[17][19]:=CT*t*0.2504957133922061;
+Q_RELAX.reference_3[17][21]:=AC*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1351200521140052;
+Q_RELAX.reference_3[17][25]:=t*Min(1000,RELAX.reference.omega_2^local_k)*0.1344351325741675;
+Q_RELAX.reference_3[17][29]:=AT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.2296926126195792;
+Q_RELAX.reference_3[17][33]:=CG*t*Min(1000,RELAX.reference.omega_2^local_k)*0.3053650319994416;
+Q_RELAX.reference_3[17][48]:=CT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.250994522453953;
+Q_RELAX.reference_3[18][2]:=AC*t*Min(1000,RELAX.reference.omega_2^local_k)*0.3222350398108426;
+Q_RELAX.reference_3[18][16]:=t*0.3824103826488193;
+Q_RELAX.reference_3[18][17]:=CG*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1264560133035801;
+Q_RELAX.reference_3[18][19]:=GT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.2504957133922061;
+Q_RELAX.reference_3[18][22]:=AC*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1351200521140052;
+Q_RELAX.reference_3[18][26]:=t*Min(1000,RELAX.reference.omega_2^local_k)*0.1344351325741675;
+Q_RELAX.reference_3[18][30]:=AT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.2296926126195792;
+Q_RELAX.reference_3[18][34]:=CG*t*Min(1000,RELAX.reference.omega_2^local_k)*0.3053650319994416;
+Q_RELAX.reference_3[19][3]:=AC*t*Min(1000,RELAX.reference.omega_2^local_k)*0.3222350398108426;
+Q_RELAX.reference_3[19][16]:=AT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.3824103826488193;
+Q_RELAX.reference_3[19][17]:=CT*t*0.1264560133035801;
+Q_RELAX.reference_3[19][18]:=GT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.2406378906553946;
+Q_RELAX.reference_3[19][23]:=AC*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1351200521140052;
+Q_RELAX.reference_3[19][27]:=t*Min(1000,RELAX.reference.omega_2^local_k)*0.1344351325741675;
+Q_RELAX.reference_3[19][31]:=AT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.2296926126195792;
+Q_RELAX.reference_3[19][35]:=CG*t*Min(1000,RELAX.reference.omega_2^local_k)*0.3053650319994416;
+Q_RELAX.reference_3[19][49]:=CT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.250994522453953;
+Q_RELAX.reference_3[20][4]:=AC*t*Min(1000,RELAX.reference.omega_2^local_k)*0.3222350398108426;
+Q_RELAX.reference_3[20][16]:=AC*t*Min(1000,RELAX.reference.omega_2^local_k)*0.5007522026922482;
+Q_RELAX.reference_3[20][21]:=AC*t*0.1264560133035801;
+Q_RELAX.reference_3[20][22]:=t*0.2406378906553946;
+Q_RELAX.reference_3[20][23]:=AT*t*0.2504957133922061;
+Q_RELAX.reference_3[20][24]:=CG*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1344351325741675;
+Q_RELAX.reference_3[20][28]:=CT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.2296926126195792;
+Q_RELAX.reference_3[20][36]:=CG*t*Min(1000,RELAX.reference.omega_2^local_k)*0.3053650319994416;
+Q_RELAX.reference_3[20][50]:=CT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.250994522453953;
+Q_RELAX.reference_3[21][5]:=AC*t*Min(1000,RELAX.reference.omega_2^local_k)*0.3222350398108426;
+Q_RELAX.reference_3[21][17]:=AC*t*Min(1000,RELAX.reference.omega_2^local_k)*0.5007522026922482;
+Q_RELAX.reference_3[21][20]:=AC*t*0.3824103826488193;
+Q_RELAX.reference_3[21][22]:=CG*t*0.2406378906553946;
+Q_RELAX.reference_3[21][23]:=CT*t*0.2504957133922061;
+Q_RELAX.reference_3[21][25]:=CG*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1344351325741675;
+Q_RELAX.reference_3[21][29]:=CT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.2296926126195792;
+Q_RELAX.reference_3[21][37]:=CG*t*Min(1000,RELAX.reference.omega_2^local_k)*0.3053650319994416;
+Q_RELAX.reference_3[21][51]:=CT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.250994522453953;
+Q_RELAX.reference_3[22][6]:=AC*t*Min(1000,RELAX.reference.omega_2^local_k)*0.3222350398108426;
+Q_RELAX.reference_3[22][18]:=AC*t*Min(1000,RELAX.reference.omega_2^local_k)*0.5007522026922482;
+Q_RELAX.reference_3[22][20]:=t*0.3824103826488193;
+Q_RELAX.reference_3[22][21]:=CG*t*0.1264560133035801;
+Q_RELAX.reference_3[22][23]:=GT*t*0.2504957133922061;
+Q_RELAX.reference_3[22][26]:=CG*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1344351325741675;
+Q_RELAX.reference_3[22][30]:=CT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.2296926126195792;
+Q_RELAX.reference_3[22][38]:=CG*t*Min(1000,RELAX.reference.omega_2^local_k)*0.3053650319994416;
+Q_RELAX.reference_3[22][52]:=CT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.250994522453953;
+Q_RELAX.reference_3[23][7]:=AC*t*Min(1000,RELAX.reference.omega_2^local_k)*0.3222350398108426;
+Q_RELAX.reference_3[23][19]:=AC*t*Min(1000,RELAX.reference.omega_2^local_k)*0.5007522026922482;
+Q_RELAX.reference_3[23][20]:=AT*t*0.3824103826488193;
+Q_RELAX.reference_3[23][21]:=CT*t*0.1264560133035801;
+Q_RELAX.reference_3[23][22]:=GT*t*0.2406378906553946;
+Q_RELAX.reference_3[23][27]:=CG*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1344351325741675;
+Q_RELAX.reference_3[23][31]:=CT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.2296926126195792;
+Q_RELAX.reference_3[23][39]:=CG*t*Min(1000,RELAX.reference.omega_2^local_k)*0.3053650319994416;
+Q_RELAX.reference_3[23][53]:=CT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.250994522453953;
+Q_RELAX.reference_3[24][8]:=AC*t*0.3222350398108426;
+Q_RELAX.reference_3[24][16]:=t*Min(1000,RELAX.reference.omega_2^local_k)*0.5007522026922482;
+Q_RELAX.reference_3[24][20]:=CG*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1351200521140052;
+Q_RELAX.reference_3[24][25]:=AC*t*0.1264560133035801;
+Q_RELAX.reference_3[24][26]:=t*0.2406378906553946;
+Q_RELAX.reference_3[24][27]:=AT*t*0.2504957133922061;
+Q_RELAX.reference_3[24][28]:=GT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.2296926126195792;
+Q_RELAX.reference_3[24][40]:=CG*t*Min(1000,RELAX.reference.omega_2^local_k)*0.3053650319994416;
+Q_RELAX.reference_3[25][9]:=AC*t*Min(1000,RELAX.reference.omega_2^local_k)*0.3222350398108426;
+Q_RELAX.reference_3[25][17]:=t*Min(1000,RELAX.reference.omega_2^local_k)*0.5007522026922482;
+Q_RELAX.reference_3[25][21]:=CG*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1351200521140052;
+Q_RELAX.reference_3[25][24]:=AC*t*0.3824103826488193;
+Q_RELAX.reference_3[25][26]:=CG*t*0.2406378906553946;
+Q_RELAX.reference_3[25][27]:=CT*t*0.2504957133922061;
+Q_RELAX.reference_3[25][29]:=GT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.2296926126195792;
+Q_RELAX.reference_3[25][41]:=CG*t*Min(1000,RELAX.reference.omega_2^local_k)*0.3053650319994416;
+Q_RELAX.reference_3[25][54]:=CT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.250994522453953;
+Q_RELAX.reference_3[26][10]:=AC*t*0.3222350398108426;
+Q_RELAX.reference_3[26][18]:=t*Min(1000,RELAX.reference.omega_2^local_k)*0.5007522026922482;
+Q_RELAX.reference_3[26][22]:=CG*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1351200521140052;
+Q_RELAX.reference_3[26][24]:=t*0.3824103826488193;
+Q_RELAX.reference_3[26][25]:=CG*t*0.1264560133035801;
+Q_RELAX.reference_3[26][27]:=GT*t*0.2504957133922061;
+Q_RELAX.reference_3[26][30]:=GT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.2296926126195792;
+Q_RELAX.reference_3[26][42]:=CG*t*Min(1000,RELAX.reference.omega_2^local_k)*0.3053650319994416;
+Q_RELAX.reference_3[26][55]:=CT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.250994522453953;
+Q_RELAX.reference_3[27][11]:=AC*t*Min(1000,RELAX.reference.omega_2^local_k)*0.3222350398108426;
+Q_RELAX.reference_3[27][19]:=t*Min(1000,RELAX.reference.omega_2^local_k)*0.5007522026922482;
+Q_RELAX.reference_3[27][23]:=CG*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1351200521140052;
+Q_RELAX.reference_3[27][24]:=AT*t*0.3824103826488193;
+Q_RELAX.reference_3[27][25]:=CT*t*0.1264560133035801;
+Q_RELAX.reference_3[27][26]:=GT*t*0.2406378906553946;
+Q_RELAX.reference_3[27][31]:=GT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.2296926126195792;
+Q_RELAX.reference_3[27][43]:=CG*t*Min(1000,RELAX.reference.omega_2^local_k)*0.3053650319994416;
+Q_RELAX.reference_3[27][56]:=CT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.250994522453953;
+Q_RELAX.reference_3[28][12]:=AC*t*Min(1000,RELAX.reference.omega_2^local_k)*0.3222350398108426;
+Q_RELAX.reference_3[28][16]:=AT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.5007522026922482;
+Q_RELAX.reference_3[28][20]:=CT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1351200521140052;
+Q_RELAX.reference_3[28][24]:=GT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1344351325741675;
+Q_RELAX.reference_3[28][29]:=AC*t*0.1264560133035801;
+Q_RELAX.reference_3[28][30]:=t*0.2406378906553946;
+Q_RELAX.reference_3[28][31]:=AT*t*0.2504957133922061;
+Q_RELAX.reference_3[28][44]:=CG*t*Min(1000,RELAX.reference.omega_2^local_k)*0.3053650319994416;
+Q_RELAX.reference_3[28][57]:=CT*t*0.250994522453953;
+Q_RELAX.reference_3[29][13]:=AC*t*Min(1000,RELAX.reference.omega_2^local_k)*0.3222350398108426;
+Q_RELAX.reference_3[29][17]:=AT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.5007522026922482;
+Q_RELAX.reference_3[29][21]:=CT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1351200521140052;
+Q_RELAX.reference_3[29][25]:=GT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1344351325741675;
+Q_RELAX.reference_3[29][28]:=AC*t*0.3824103826488193;
+Q_RELAX.reference_3[29][30]:=CG*t*0.2406378906553946;
+Q_RELAX.reference_3[29][31]:=CT*t*0.2504957133922061;
+Q_RELAX.reference_3[29][45]:=CG*t*Min(1000,RELAX.reference.omega_2^local_k)*0.3053650319994416;
+Q_RELAX.reference_3[29][58]:=CT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.250994522453953;
+Q_RELAX.reference_3[30][14]:=AC*t*Min(1000,RELAX.reference.omega_2^local_k)*0.3222350398108426;
+Q_RELAX.reference_3[30][18]:=AT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.5007522026922482;
+Q_RELAX.reference_3[30][22]:=CT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1351200521140052;
+Q_RELAX.reference_3[30][26]:=GT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1344351325741675;
+Q_RELAX.reference_3[30][28]:=t*0.3824103826488193;
+Q_RELAX.reference_3[30][29]:=CG*t*0.1264560133035801;
+Q_RELAX.reference_3[30][31]:=GT*t*0.2504957133922061;
+Q_RELAX.reference_3[30][46]:=CG*t*Min(1000,RELAX.reference.omega_2^local_k)*0.3053650319994416;
+Q_RELAX.reference_3[30][59]:=CT*t*0.250994522453953;
+Q_RELAX.reference_3[31][15]:=AC*t*Min(1000,RELAX.reference.omega_2^local_k)*0.3222350398108426;
+Q_RELAX.reference_3[31][19]:=AT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.5007522026922482;
+Q_RELAX.reference_3[31][23]:=CT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1351200521140052;
+Q_RELAX.reference_3[31][27]:=GT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1344351325741675;
+Q_RELAX.reference_3[31][28]:=AT*t*0.3824103826488193;
+Q_RELAX.reference_3[31][29]:=CT*t*0.1264560133035801;
+Q_RELAX.reference_3[31][30]:=GT*t*0.2406378906553946;
+Q_RELAX.reference_3[31][47]:=CG*t*Min(1000,RELAX.reference.omega_2^local_k)*0.3053650319994416;
+Q_RELAX.reference_3[31][60]:=CT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.250994522453953;
+Q_RELAX.reference_3[32][0]:=t*Min(1000,RELAX.reference.omega_2^local_k)*0.3222350398108426;
+Q_RELAX.reference_3[32][16]:=CG*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1214054057357627;
+Q_RELAX.reference_3[32][33]:=AC*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1264560133035801;
+Q_RELAX.reference_3[32][34]:=t*0.2406378906553946;
+Q_RELAX.reference_3[32][35]:=AT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.2504957133922061;
+Q_RELAX.reference_3[32][36]:=AC*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1351200521140052;
+Q_RELAX.reference_3[32][40]:=t*Min(1000,RELAX.reference.omega_2^local_k)*0.1344351325741675;
+Q_RELAX.reference_3[32][44]:=AT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.2296926126195792;
+Q_RELAX.reference_3[33][1]:=t*Min(1000,RELAX.reference.omega_2^local_k)*0.3222350398108426;
+Q_RELAX.reference_3[33][17]:=CG*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1214054057357627;
+Q_RELAX.reference_3[33][32]:=AC*t*Min(1000,RELAX.reference.omega_2^local_k)*0.3824103826488193;
+Q_RELAX.reference_3[33][34]:=CG*t*Min(1000,RELAX.reference.omega_2^local_k)*0.2406378906553946;
+Q_RELAX.reference_3[33][35]:=CT*t*0.2504957133922061;
+Q_RELAX.reference_3[33][37]:=AC*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1351200521140052;
+Q_RELAX.reference_3[33][41]:=t*Min(1000,RELAX.reference.omega_2^local_k)*0.1344351325741675;
+Q_RELAX.reference_3[33][45]:=AT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.2296926126195792;
+Q_RELAX.reference_3[33][48]:=GT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.250994522453953;
+Q_RELAX.reference_3[34][2]:=t*Min(1000,RELAX.reference.omega_2^local_k)*0.3222350398108426;
+Q_RELAX.reference_3[34][18]:=CG*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1214054057357627;
+Q_RELAX.reference_3[34][32]:=t*0.3824103826488193;
+Q_RELAX.reference_3[34][33]:=CG*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1264560133035801;
+Q_RELAX.reference_3[34][35]:=GT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.2504957133922061;
+Q_RELAX.reference_3[34][38]:=AC*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1351200521140052;
+Q_RELAX.reference_3[34][42]:=t*Min(1000,RELAX.reference.omega_2^local_k)*0.1344351325741675;
+Q_RELAX.reference_3[34][46]:=AT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.2296926126195792;
+Q_RELAX.reference_3[35][3]:=t*Min(1000,RELAX.reference.omega_2^local_k)*0.3222350398108426;
+Q_RELAX.reference_3[35][19]:=CG*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1214054057357627;
+Q_RELAX.reference_3[35][32]:=AT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.3824103826488193;
+Q_RELAX.reference_3[35][33]:=CT*t*0.1264560133035801;
+Q_RELAX.reference_3[35][34]:=GT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.2406378906553946;
+Q_RELAX.reference_3[35][39]:=AC*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1351200521140052;
+Q_RELAX.reference_3[35][43]:=t*Min(1000,RELAX.reference.omega_2^local_k)*0.1344351325741675;
+Q_RELAX.reference_3[35][47]:=AT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.2296926126195792;
+Q_RELAX.reference_3[35][49]:=GT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.250994522453953;
+Q_RELAX.reference_3[36][4]:=t*Min(1000,RELAX.reference.omega_2^local_k)*0.3222350398108426;
+Q_RELAX.reference_3[36][20]:=CG*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1214054057357627;
+Q_RELAX.reference_3[36][32]:=AC*t*Min(1000,RELAX.reference.omega_2^local_k)*0.5007522026922482;
+Q_RELAX.reference_3[36][37]:=AC*t*0.1264560133035801;
+Q_RELAX.reference_3[36][38]:=t*0.2406378906553946;
+Q_RELAX.reference_3[36][39]:=AT*t*0.2504957133922061;
+Q_RELAX.reference_3[36][40]:=CG*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1344351325741675;
+Q_RELAX.reference_3[36][44]:=CT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.2296926126195792;
+Q_RELAX.reference_3[36][50]:=GT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.250994522453953;
+Q_RELAX.reference_3[37][5]:=t*Min(1000,RELAX.reference.omega_2^local_k)*0.3222350398108426;
+Q_RELAX.reference_3[37][21]:=CG*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1214054057357627;
+Q_RELAX.reference_3[37][33]:=AC*t*Min(1000,RELAX.reference.omega_2^local_k)*0.5007522026922482;
+Q_RELAX.reference_3[37][36]:=AC*t*0.3824103826488193;
+Q_RELAX.reference_3[37][38]:=CG*t*0.2406378906553946;
+Q_RELAX.reference_3[37][39]:=CT*t*0.2504957133922061;
+Q_RELAX.reference_3[37][41]:=CG*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1344351325741675;
+Q_RELAX.reference_3[37][45]:=CT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.2296926126195792;
+Q_RELAX.reference_3[37][51]:=GT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.250994522453953;
+Q_RELAX.reference_3[38][6]:=t*Min(1000,RELAX.reference.omega_2^local_k)*0.3222350398108426;
+Q_RELAX.reference_3[38][22]:=CG*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1214054057357627;
+Q_RELAX.reference_3[38][34]:=AC*t*Min(1000,RELAX.reference.omega_2^local_k)*0.5007522026922482;
+Q_RELAX.reference_3[38][36]:=t*0.3824103826488193;
+Q_RELAX.reference_3[38][37]:=CG*t*0.1264560133035801;
+Q_RELAX.reference_3[38][39]:=GT*t*0.2504957133922061;
+Q_RELAX.reference_3[38][42]:=CG*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1344351325741675;
+Q_RELAX.reference_3[38][46]:=CT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.2296926126195792;
+Q_RELAX.reference_3[38][52]:=GT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.250994522453953;
+Q_RELAX.reference_3[39][7]:=t*Min(1000,RELAX.reference.omega_2^local_k)*0.3222350398108426;
+Q_RELAX.reference_3[39][23]:=CG*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1214054057357627;
+Q_RELAX.reference_3[39][35]:=AC*t*Min(1000,RELAX.reference.omega_2^local_k)*0.5007522026922482;
+Q_RELAX.reference_3[39][36]:=AT*t*0.3824103826488193;
+Q_RELAX.reference_3[39][37]:=CT*t*0.1264560133035801;
+Q_RELAX.reference_3[39][38]:=GT*t*0.2406378906553946;
+Q_RELAX.reference_3[39][43]:=CG*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1344351325741675;
+Q_RELAX.reference_3[39][47]:=CT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.2296926126195792;
+Q_RELAX.reference_3[39][53]:=GT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.250994522453953;
+Q_RELAX.reference_3[40][8]:=t*Min(1000,RELAX.reference.omega_2^local_k)*0.3222350398108426;
+Q_RELAX.reference_3[40][24]:=CG*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1214054057357627;
+Q_RELAX.reference_3[40][32]:=t*Min(1000,RELAX.reference.omega_2^local_k)*0.5007522026922482;
+Q_RELAX.reference_3[40][36]:=CG*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1351200521140052;
+Q_RELAX.reference_3[40][41]:=AC*t*0.1264560133035801;
+Q_RELAX.reference_3[40][42]:=t*0.2406378906553946;
+Q_RELAX.reference_3[40][43]:=AT*t*0.2504957133922061;
+Q_RELAX.reference_3[40][44]:=GT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.2296926126195792;
+Q_RELAX.reference_3[41][9]:=t*Min(1000,RELAX.reference.omega_2^local_k)*0.3222350398108426;
+Q_RELAX.reference_3[41][25]:=CG*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1214054057357627;
+Q_RELAX.reference_3[41][33]:=t*Min(1000,RELAX.reference.omega_2^local_k)*0.5007522026922482;
+Q_RELAX.reference_3[41][37]:=CG*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1351200521140052;
+Q_RELAX.reference_3[41][40]:=AC*t*0.3824103826488193;
+Q_RELAX.reference_3[41][42]:=CG*t*0.2406378906553946;
+Q_RELAX.reference_3[41][43]:=CT*t*0.2504957133922061;
+Q_RELAX.reference_3[41][45]:=GT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.2296926126195792;
+Q_RELAX.reference_3[41][54]:=GT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.250994522453953;
+Q_RELAX.reference_3[42][10]:=t*Min(1000,RELAX.reference.omega_2^local_k)*0.3222350398108426;
+Q_RELAX.reference_3[42][26]:=CG*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1214054057357627;
+Q_RELAX.reference_3[42][34]:=t*Min(1000,RELAX.reference.omega_2^local_k)*0.5007522026922482;
+Q_RELAX.reference_3[42][38]:=CG*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1351200521140052;
+Q_RELAX.reference_3[42][40]:=t*0.3824103826488193;
+Q_RELAX.reference_3[42][41]:=CG*t*0.1264560133035801;
+Q_RELAX.reference_3[42][43]:=GT*t*0.2504957133922061;
+Q_RELAX.reference_3[42][46]:=GT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.2296926126195792;
+Q_RELAX.reference_3[42][55]:=GT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.250994522453953;
+Q_RELAX.reference_3[43][11]:=t*Min(1000,RELAX.reference.omega_2^local_k)*0.3222350398108426;
+Q_RELAX.reference_3[43][27]:=CG*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1214054057357627;
+Q_RELAX.reference_3[43][35]:=t*Min(1000,RELAX.reference.omega_2^local_k)*0.5007522026922482;
+Q_RELAX.reference_3[43][39]:=CG*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1351200521140052;
+Q_RELAX.reference_3[43][40]:=AT*t*0.3824103826488193;
+Q_RELAX.reference_3[43][41]:=CT*t*0.1264560133035801;
+Q_RELAX.reference_3[43][42]:=GT*t*0.2406378906553946;
+Q_RELAX.reference_3[43][47]:=GT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.2296926126195792;
+Q_RELAX.reference_3[43][56]:=GT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.250994522453953;
+Q_RELAX.reference_3[44][12]:=t*Min(1000,RELAX.reference.omega_2^local_k)*0.3222350398108426;
+Q_RELAX.reference_3[44][28]:=CG*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1214054057357627;
+Q_RELAX.reference_3[44][32]:=AT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.5007522026922482;
+Q_RELAX.reference_3[44][36]:=CT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1351200521140052;
+Q_RELAX.reference_3[44][40]:=GT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1344351325741675;
+Q_RELAX.reference_3[44][45]:=AC*t*0.1264560133035801;
+Q_RELAX.reference_3[44][46]:=t*0.2406378906553946;
+Q_RELAX.reference_3[44][47]:=AT*t*0.2504957133922061;
+Q_RELAX.reference_3[44][57]:=GT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.250994522453953;
+Q_RELAX.reference_3[45][13]:=t*Min(1000,RELAX.reference.omega_2^local_k)*0.3222350398108426;
+Q_RELAX.reference_3[45][29]:=CG*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1214054057357627;
+Q_RELAX.reference_3[45][33]:=AT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.5007522026922482;
+Q_RELAX.reference_3[45][37]:=CT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1351200521140052;
+Q_RELAX.reference_3[45][41]:=GT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1344351325741675;
+Q_RELAX.reference_3[45][44]:=AC*t*0.3824103826488193;
+Q_RELAX.reference_3[45][46]:=CG*t*0.2406378906553946;
+Q_RELAX.reference_3[45][47]:=CT*t*0.2504957133922061;
+Q_RELAX.reference_3[45][58]:=GT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.250994522453953;
+Q_RELAX.reference_3[46][14]:=t*Min(1000,RELAX.reference.omega_2^local_k)*0.3222350398108426;
+Q_RELAX.reference_3[46][30]:=CG*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1214054057357627;
+Q_RELAX.reference_3[46][34]:=AT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.5007522026922482;
+Q_RELAX.reference_3[46][38]:=CT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1351200521140052;
+Q_RELAX.reference_3[46][42]:=GT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1344351325741675;
+Q_RELAX.reference_3[46][44]:=t*0.3824103826488193;
+Q_RELAX.reference_3[46][45]:=CG*t*0.1264560133035801;
+Q_RELAX.reference_3[46][47]:=GT*t*0.2504957133922061;
+Q_RELAX.reference_3[46][59]:=GT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.250994522453953;
+Q_RELAX.reference_3[47][15]:=t*Min(1000,RELAX.reference.omega_2^local_k)*0.3222350398108426;
+Q_RELAX.reference_3[47][31]:=CG*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1214054057357627;
+Q_RELAX.reference_3[47][35]:=AT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.5007522026922482;
+Q_RELAX.reference_3[47][39]:=CT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1351200521140052;
+Q_RELAX.reference_3[47][43]:=GT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1344351325741675;
+Q_RELAX.reference_3[47][44]:=AT*t*0.3824103826488193;
+Q_RELAX.reference_3[47][45]:=CT*t*0.1264560133035801;
+Q_RELAX.reference_3[47][46]:=GT*t*0.2406378906553946;
+Q_RELAX.reference_3[47][60]:=GT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.250994522453953;
+Q_RELAX.reference_3[48][1]:=AT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.3222350398108426;
+Q_RELAX.reference_3[48][17]:=CT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1214054057357627;
+Q_RELAX.reference_3[48][33]:=GT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.3053650319994416;
+Q_RELAX.reference_3[48][49]:=CT*t*0.2504957133922061;
+Q_RELAX.reference_3[48][51]:=AC*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1351200521140052;
+Q_RELAX.reference_3[48][54]:=t*Min(1000,RELAX.reference.omega_2^local_k)*0.1344351325741675;
+Q_RELAX.reference_3[48][58]:=AT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.2296926126195792;
+Q_RELAX.reference_3[49][3]:=AT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.3222350398108426;
+Q_RELAX.reference_3[49][19]:=CT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1214054057357627;
+Q_RELAX.reference_3[49][35]:=GT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.3053650319994416;
+Q_RELAX.reference_3[49][48]:=CT*t*0.1264560133035801;
+Q_RELAX.reference_3[49][53]:=AC*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1351200521140052;
+Q_RELAX.reference_3[49][56]:=t*Min(1000,RELAX.reference.omega_2^local_k)*0.1344351325741675;
+Q_RELAX.reference_3[49][60]:=AT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.2296926126195792;
+Q_RELAX.reference_3[50][4]:=AT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.3222350398108426;
+Q_RELAX.reference_3[50][20]:=CT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1214054057357627;
+Q_RELAX.reference_3[50][36]:=GT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.3053650319994416;
+Q_RELAX.reference_3[50][51]:=AC*t*0.1264560133035801;
+Q_RELAX.reference_3[50][52]:=t*0.2406378906553946;
+Q_RELAX.reference_3[50][53]:=AT*t*0.2504957133922061;
+Q_RELAX.reference_3[50][57]:=CT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.2296926126195792;
+Q_RELAX.reference_3[51][5]:=AT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.3222350398108426;
+Q_RELAX.reference_3[51][21]:=CT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1214054057357627;
+Q_RELAX.reference_3[51][37]:=GT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.3053650319994416;
+Q_RELAX.reference_3[51][48]:=AC*t*Min(1000,RELAX.reference.omega_2^local_k)*0.5007522026922482;
+Q_RELAX.reference_3[51][50]:=AC*t*0.3824103826488193;
+Q_RELAX.reference_3[51][52]:=CG*t*0.2406378906553946;
+Q_RELAX.reference_3[51][53]:=CT*t*0.2504957133922061;
+Q_RELAX.reference_3[51][54]:=CG*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1344351325741675;
+Q_RELAX.reference_3[51][58]:=CT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.2296926126195792;
+Q_RELAX.reference_3[52][6]:=AT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.3222350398108426;
+Q_RELAX.reference_3[52][22]:=CT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1214054057357627;
+Q_RELAX.reference_3[52][38]:=GT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.3053650319994416;
+Q_RELAX.reference_3[52][50]:=t*0.3824103826488193;
+Q_RELAX.reference_3[52][51]:=CG*t*0.1264560133035801;
+Q_RELAX.reference_3[52][53]:=GT*t*0.2504957133922061;
+Q_RELAX.reference_3[52][55]:=CG*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1344351325741675;
+Q_RELAX.reference_3[52][59]:=CT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.2296926126195792;
+Q_RELAX.reference_3[53][7]:=AT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.3222350398108426;
+Q_RELAX.reference_3[53][23]:=CT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1214054057357627;
+Q_RELAX.reference_3[53][39]:=GT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.3053650319994416;
+Q_RELAX.reference_3[53][49]:=AC*t*Min(1000,RELAX.reference.omega_2^local_k)*0.5007522026922482;
+Q_RELAX.reference_3[53][50]:=AT*t*0.3824103826488193;
+Q_RELAX.reference_3[53][51]:=CT*t*0.1264560133035801;
+Q_RELAX.reference_3[53][52]:=GT*t*0.2406378906553946;
+Q_RELAX.reference_3[53][56]:=CG*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1344351325741675;
+Q_RELAX.reference_3[53][60]:=CT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.2296926126195792;
+Q_RELAX.reference_3[54][9]:=AT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.3222350398108426;
+Q_RELAX.reference_3[54][25]:=CT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1214054057357627;
+Q_RELAX.reference_3[54][41]:=GT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.3053650319994416;
+Q_RELAX.reference_3[54][48]:=t*Min(1000,RELAX.reference.omega_2^local_k)*0.5007522026922482;
+Q_RELAX.reference_3[54][51]:=CG*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1351200521140052;
+Q_RELAX.reference_3[54][55]:=CG*t*Min(1000,RELAX.reference.omega_2^local_k)*0.2406378906553946;
+Q_RELAX.reference_3[54][56]:=CT*t*0.2504957133922061;
+Q_RELAX.reference_3[54][58]:=GT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.2296926126195792;
+Q_RELAX.reference_3[55][10]:=AT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.3222350398108426;
+Q_RELAX.reference_3[55][26]:=CT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1214054057357627;
+Q_RELAX.reference_3[55][42]:=GT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.3053650319994416;
+Q_RELAX.reference_3[55][52]:=CG*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1351200521140052;
+Q_RELAX.reference_3[55][54]:=CG*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1264560133035801;
+Q_RELAX.reference_3[55][56]:=GT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.2504957133922061;
+Q_RELAX.reference_3[55][59]:=GT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.2296926126195792;
+Q_RELAX.reference_3[56][11]:=AT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.3222350398108426;
+Q_RELAX.reference_3[56][27]:=CT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1214054057357627;
+Q_RELAX.reference_3[56][43]:=GT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.3053650319994416;
+Q_RELAX.reference_3[56][49]:=t*Min(1000,RELAX.reference.omega_2^local_k)*0.5007522026922482;
+Q_RELAX.reference_3[56][53]:=CG*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1351200521140052;
+Q_RELAX.reference_3[56][54]:=CT*t*0.1264560133035801;
+Q_RELAX.reference_3[56][55]:=GT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.2406378906553946;
+Q_RELAX.reference_3[56][60]:=GT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.2296926126195792;
+Q_RELAX.reference_3[57][12]:=AT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.3222350398108426;
+Q_RELAX.reference_3[57][28]:=CT*t*0.1214054057357627;
+Q_RELAX.reference_3[57][44]:=GT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.3053650319994416;
+Q_RELAX.reference_3[57][50]:=CT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1351200521140052;
+Q_RELAX.reference_3[57][58]:=AC*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1264560133035801;
+Q_RELAX.reference_3[57][59]:=t*0.2406378906553946;
+Q_RELAX.reference_3[57][60]:=AT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.2504957133922061;
+Q_RELAX.reference_3[58][13]:=AT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.3222350398108426;
+Q_RELAX.reference_3[58][29]:=CT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1214054057357627;
+Q_RELAX.reference_3[58][45]:=GT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.3053650319994416;
+Q_RELAX.reference_3[58][48]:=AT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.5007522026922482;
+Q_RELAX.reference_3[58][51]:=CT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1351200521140052;
+Q_RELAX.reference_3[58][54]:=GT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1344351325741675;
+Q_RELAX.reference_3[58][57]:=AC*t*Min(1000,RELAX.reference.omega_2^local_k)*0.3824103826488193;
+Q_RELAX.reference_3[58][59]:=CG*t*Min(1000,RELAX.reference.omega_2^local_k)*0.2406378906553946;
+Q_RELAX.reference_3[58][60]:=CT*t*0.2504957133922061;
+Q_RELAX.reference_3[59][14]:=AT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.3222350398108426;
+Q_RELAX.reference_3[59][30]:=CT*t*0.1214054057357627;
+Q_RELAX.reference_3[59][46]:=GT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.3053650319994416;
+Q_RELAX.reference_3[59][52]:=CT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1351200521140052;
+Q_RELAX.reference_3[59][55]:=GT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1344351325741675;
+Q_RELAX.reference_3[59][57]:=t*0.3824103826488193;
+Q_RELAX.reference_3[59][58]:=CG*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1264560133035801;
+Q_RELAX.reference_3[59][60]:=GT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.2504957133922061;
+Q_RELAX.reference_3[60][15]:=AT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.3222350398108426;
+Q_RELAX.reference_3[60][31]:=CT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1214054057357627;
+Q_RELAX.reference_3[60][47]:=GT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.3053650319994416;
+Q_RELAX.reference_3[60][49]:=AT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.5007522026922482;
+Q_RELAX.reference_3[60][53]:=CT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1351200521140052;
+Q_RELAX.reference_3[60][56]:=GT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1344351325741675;
+Q_RELAX.reference_3[60][57]:=AT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.3824103826488193;
+Q_RELAX.reference_3[60][58]:=CT*t*0.1264560133035801;
+Q_RELAX.reference_3[60][59]:=GT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.2406378906553946;
+
+
+RELAX.reference_model_eqf={
+{0.06789889450438902}
+{0.02245290372942207}
+{0.04272647263966693}
+{0.04447677884582558}
+{0.01832144145265965}
+{0.006058560513002445}
+{0.01152906203643302}
+{0.01200135444876809}
+{0.01822857060889821}
+{0.006027849849309518}
+{0.01147062156263798}
+{0.01194051993873147}
+{0.03114489439855585}
+{0.01029903830832752}
+{0.01959842627922601}
+{0.0204012832676034}
+{0.0255816153362901}
+{0.008459365216199515}
+{0.0160976433522615}
+{0.01675708943622944}
+{0.006902793794647167}
+{0.002282625743269596}
+{0.004343694140486931}
+{0.004521635223427881}
+{0.00686780373746872}
+{0.002271055181023346}
+{0.004321676083615643}
+{0.004498715188480508}
+{0.01173416318496511}
+{0.003880269896298824}
+{0.007383911121548391}
+{0.007686395849711308}
+{0.06434417593204837}
+{0.02127742429823938}
+{0.04048960874178697}
+{0.04214828096739659}
+{0.01736225693751837}
+{0.005741376003086347}
+{0.01092547973598884}
+{0.0113730461697648}
+{0.01727424817163843}
+{0.005712273138274315}
+{0.01087009880298738}
+{0.01131539653577432}
+{0.02951436218797651}
+{0.009759851580486268}
+{0.01857238763173507}
+{0.01933321255658108}
+{0.01748896039542764}
+{0.03464374288175238}
+{0.01427089198858639}
+{0.004719119012048105}
+{0.008980188566318471}
+{0.00934806540727982}
+{0.004695197937628716}
+{0.008934668256606717}
+{0.009300680340763385}
+{0.02425930432963823}
+{0.008022101517733991}
+{0.01526555786015987}
+{0.01589091724539275}
+}
+;
+Model RELAX.reference_model=("Exp(Q_RELAX.reference_1)*RELAX.reference.aux_freq_0+Exp(Q_RELAX.reference_2)*(1-RELAX.reference.aux_freq_0)*RELAX.reference.aux_freq_1+Exp(Q_RELAX.reference_3)*(1-RELAX.reference.aux_freq_0)*(1-RELAX.reference.aux_freq_1)",RELAX.reference_model_eqf,EXPLICIT_FORM_MATRIX_EXPONENTIAL);
+TRY_NUMERIC_SEQUENCE_MATCH=0;
+ACCEPT_ROOTED_TREES=0;
+Tree RELAX.tree=((((((((((((70{RELAX.test_model},((811{RELAX.test_model},(181{RELAX.test_model},1180{RELAX.test_model})Node16{RELAX.test_model})Node14{RELAX.test_model},401{RELAX.test_model})Node13{RELAX.test_model})Node11{RELAX.reference_model},1220{RELAX.reference_model})Node10{RELAX.reference_model},1070{RELAX.reference_model})Node9{RELAX.reference_model},(720{RELAX.reference_model},750{RELAX.reference_model})Node22{RELAX.reference_model})Node8{RELAX.reference_model},151{RELAX.referen [...]
+
+RELAX.tree.70.t=0.0874752949058627;
+RELAX.tree.811.t=0.05342825292058761;
+RELAX.tree.181.t=0;
+RELAX.tree.1180.t=0.008812581832858147;
+RELAX.tree.Node16.t=0.05662356188962207;
+RELAX.tree.Node14.t=0;
+RELAX.tree.401.t=0;
+RELAX.tree.Node13.t=0;
+RELAX.tree.Node11.t=0;
+RELAX.tree.1220.t=0.002524109595042646;
+RELAX.tree.Node10.t=0;
+RELAX.tree.1070.t=0.005299867119440801;
+RELAX.tree.Node9.t=0.07475990511992309;
+RELAX.tree.720.t=0;
+RELAX.tree.750.t=0.001988781559574017;
+RELAX.tree.Node22.t=0.0208275479586027;
+RELAX.tree.Node8.t=0;
+RELAX.tree.151.t=0.002131044953273385;
+RELAX.tree.Node7.t=0;
+RELAX.tree.50.t=0.005388028439196321;
+RELAX.tree.770.t=0.003370883435855254;
+RELAX.tree.Node26.t=0.001767835153687439;
+RELAX.tree.Node6.t=0;
+RELAX.tree.1150.t=0.001687142479686245;
+RELAX.tree.Node5.t=0;
+RELAX.tree.431.t=0.003586192589671557;
+RELAX.tree.1250.t=0;
+RELAX.tree.Node31.t=0.001702883192518727;
+RELAX.tree.1210.t=0;
+RELAX.tree.Node30.t=0;
+RELAX.tree.Node4.t=0.001669227678819712;
+RELAX.tree.680.t=0.001675306534312979;
+RELAX.tree.941.t=0.001659583997036902;
+RELAX.tree.Node38.t=0;
+RELAX.tree.650.t=0;
+RELAX.tree.Node37.t=0;
+RELAX.tree.970.t=0.001751503196682731;
+RELAX.tree.Node36.t=0.001956643723237122;
+RELAX.tree.700.t=0;
+RELAX.tree.Node35.t=0.001891004717209664;
+RELAX.tree.Node3.t=0;
+RELAX.tree.1190.t=0.001676949690007272;
+RELAX.tree.Node2.t=0;
+RELAX.tree.171.t=0;
+RELAX.tree.Node1.t=0;
+RELAX.tree.30.t=0.001665202513335741;
+RELAX.tree.80.t=0.001772006665484733;
+RELAX.tree.471.t=0.003818286053550534;
+RELAX.tree.Node55.t=0.003398997031916978;
+RELAX.tree.270.t=0;
+RELAX.tree.501.t=0.001904427562916329;
+RELAX.tree.Node60.t=0.003756626041984696;
+RELAX.tree.460.t=0.00181216632674695;
+RELAX.tree.Node59.t=0.001925053602241333;
+RELAX.tree.310.t=0;
+RELAX.tree.330.t=0.003806283190317289;
+RELAX.tree.Node67.t=0;
+RELAX.tree.520.t=0;
+RELAX.tree.560.t=0.001794449426776443;
+RELAX.tree.Node70.t=0.001774043948990615;
+RELAX.tree.Node66.t=0;
+RELAX.tree.290.t=0.001787377639191124;
+RELAX.tree.Node65.t=0;
+RELAX.tree.540.t=0.001795089466745428;
+RELAX.tree.Node64.t=0;
+RELAX.tree.Node58.t=0.0113081612180789;
+RELAX.tree.Node54.t=0.001699299327753176;
+RELAX.tree.591.t=0.01881677889888405;
+RELAX.tree.1260.t=0.0141383717796685;
+RELAX.tree.Node76.t=0.09668526833277785;
+RELAX.tree.11.t=0.01749210027659062;
+RELAX.tree.191.t=0;
+RELAX.tree.231.t=0.002035070261561419;
+RELAX.tree.Node81.t=0.01011759107882528;
+RELAX.tree.Node79.t=0.07074924779451842;
+RELAX.tree.Node75.t=0.03894381213650683;
+RELAX.tree.Node53.t=0;
+RELAX.tree.Node51.t=0.003591644205181118;
+RELAX.tree.20.t=0.01156269002691684;
+RELAX.tree.60.t=0.01068516728422988;
+RELAX.tree.Node86.t=0.001415571029934556;
+RELAX.tree.511.t=0.001911172059055141;
+RELAX.tree.1281.t=0.00176747337810612;
+RELAX.tree.Node92.t=0;
+RELAX.tree.90.t=0;
+RELAX.tree.Node91.t=0.004025886228394305;
+RELAX.tree.130.t=0.01254826424663405;
+RELAX.tree.571.t=0;
+RELAX.tree.Node98.t=0;
+RELAX.tree.301.t=0.00167491747105102;
+RELAX.tree.281.t=0;
+RELAX.tree.Node101.t=0;
+RELAX.tree.Node97.t=0.001659938506379031;
+RELAX.tree.531.t=0;
+RELAX.tree.Node96.t=0.00363968080576377;
+RELAX.tree.Node90.t=0.01697166655460285;
+RELAX.tree.490.t=0.02937679565115888;
+RELAX.tree.Node89.t=0.004182180631513489;
+RELAX.tree.Node85.t=0.002557303108337034;
+RELAX.tree.670.t=0;
+RELAX.tree.Node84.t=0;
+RELAX.tree.Node50.t=0.002055093482497691;
+RELAX.tree.161.t=0;
+RELAX.tree.1110.t=0.001780602434269803;
+RELAX.tree.Node107.t=0.003357325006743786;
+RELAX.tree.Node49.t=0;
+RELAX.tree.1200.t=0;
+RELAX.tree.1270.t=0.003319626576048171;
+RELAX.tree.Node110.t=0.001767551161802553;
+RELAX.tree.Node48.t=0;
+RELAX.tree.141.t=0.001624822538715102;
+RELAX.tree.Node47.t=0;
+RELAX.tree.640.t=0.001780555015960211;
+RELAX.tree.961.t=0;
+RELAX.tree.Node115.t=0.001628021616154333;
+RELAX.tree.740.t=0.00166016846927057;
+RELAX.tree.Node114.t=0.001649137035914623;
+RELAX.tree.Node46.t=0;
+RELAX.tree.241.t=0.001688412444922499;
+RELAX.tree.Node14.local_k:=RELAX.K;
+RELAX.tree.Node14.local_k:<50;
+RELAX.tree.11.local_k:=1;
+RELAX.tree.11.local_k:<50;
+RELAX.tree.811.local_k:=RELAX.K;
+RELAX.tree.811.local_k:<50;
+RELAX.tree.1070.local_k:=1;
+RELAX.tree.1070.local_k:<50;
+RELAX.tree.401.local_k:=RELAX.K;
+RELAX.tree.401.local_k:<50;
+RELAX.tree.Node16.local_k:=RELAX.K;
+RELAX.tree.Node16.local_k:<50;
+RELAX.tree.1150.local_k:=1;
+RELAX.tree.1150.local_k:<50;
+RELAX.tree.181.local_k:=RELAX.K;
+RELAX.tree.181.local_k:<50;
+RELAX.tree.1110.local_k:=1;
+RELAX.tree.1110.local_k:<50;
+RELAX.tree.1190.local_k:=1;
+RELAX.tree.1190.local_k:<50;
+RELAX.tree.Node13.local_k:=RELAX.K;
+RELAX.tree.Node13.local_k:<50;
+RELAX.tree.1210.local_k:=1;
+RELAX.tree.1210.local_k:<50;
+RELAX.tree.1180.local_k:=RELAX.K;
+RELAX.tree.1180.local_k:<50;
+RELAX.tree.1200.local_k:=1;
+RELAX.tree.1200.local_k:<50;
+RELAX.tree.70.local_k:=RELAX.K;
+RELAX.tree.70.local_k:<50;
+RELAX.tree.1250.local_k:=1;
+RELAX.tree.1250.local_k:<50;
+RELAX.tree.1220.local_k:=1;
+RELAX.tree.1220.local_k:<50;
+RELAX.tree.1260.local_k:=1;
+RELAX.tree.1260.local_k:<50;
+RELAX.tree.1270.local_k:=1;
+RELAX.tree.1270.local_k:<50;
+RELAX.tree.1281.local_k:=1;
+RELAX.tree.1281.local_k:<50;
+RELAX.tree.130.local_k:=1;
+RELAX.tree.130.local_k:<50;
+RELAX.tree.141.local_k:=1;
+RELAX.tree.141.local_k:<50;
+RELAX.tree.151.local_k:=1;
+RELAX.tree.151.local_k:<50;
+RELAX.tree.161.local_k:=1;
+RELAX.tree.161.local_k:<50;
+RELAX.tree.171.local_k:=1;
+RELAX.tree.171.local_k:<50;
+RELAX.tree.191.local_k:=1;
+RELAX.tree.191.local_k:<50;
+RELAX.tree.20.local_k:=1;
+RELAX.tree.20.local_k:<50;
+RELAX.tree.231.local_k:=1;
+RELAX.tree.231.local_k:<50;
+RELAX.tree.241.local_k:=1;
+RELAX.tree.241.local_k:<50;
+RELAX.tree.270.local_k:=1;
+RELAX.tree.270.local_k:<50;
+RELAX.tree.281.local_k:=1;
+RELAX.tree.281.local_k:<50;
+RELAX.tree.290.local_k:=1;
+RELAX.tree.290.local_k:<50;
+RELAX.tree.30.local_k:=1;
+RELAX.tree.30.local_k:<50;
+RELAX.tree.301.local_k:=1;
+RELAX.tree.301.local_k:<50;
+RELAX.tree.310.local_k:=1;
+RELAX.tree.310.local_k:<50;
+RELAX.tree.330.local_k:=1;
+RELAX.tree.330.local_k:<50;
+RELAX.tree.431.local_k:=1;
+RELAX.tree.431.local_k:<50;
+RELAX.tree.460.local_k:=1;
+RELAX.tree.460.local_k:<50;
+RELAX.tree.471.local_k:=1;
+RELAX.tree.471.local_k:<50;
+RELAX.tree.490.local_k:=1;
+RELAX.tree.490.local_k:<50;
+RELAX.tree.50.local_k:=1;
+RELAX.tree.50.local_k:<50;
+RELAX.tree.501.local_k:=1;
+RELAX.tree.501.local_k:<50;
+RELAX.tree.511.local_k:=1;
+RELAX.tree.511.local_k:<50;
+RELAX.tree.520.local_k:=1;
+RELAX.tree.520.local_k:<50;
+RELAX.tree.531.local_k:=1;
+RELAX.tree.531.local_k:<50;
+RELAX.tree.540.local_k:=1;
+RELAX.tree.540.local_k:<50;
+RELAX.tree.560.local_k:=1;
+RELAX.tree.560.local_k:<50;
+RELAX.tree.571.local_k:=1;
+RELAX.tree.571.local_k:<50;
+RELAX.tree.591.local_k:=1;
+RELAX.tree.591.local_k:<50;
+RELAX.tree.60.local_k:=1;
+RELAX.tree.60.local_k:<50;
+RELAX.tree.640.local_k:=1;
+RELAX.tree.640.local_k:<50;
+RELAX.tree.650.local_k:=1;
+RELAX.tree.650.local_k:<50;
+RELAX.tree.670.local_k:=1;
+RELAX.tree.670.local_k:<50;
+RELAX.tree.680.local_k:=1;
+RELAX.tree.680.local_k:<50;
+RELAX.tree.700.local_k:=1;
+RELAX.tree.700.local_k:<50;
+RELAX.tree.720.local_k:=1;
+RELAX.tree.720.local_k:<50;
+RELAX.tree.740.local_k:=1;
+RELAX.tree.740.local_k:<50;
+RELAX.tree.750.local_k:=1;
+RELAX.tree.750.local_k:<50;
+RELAX.tree.770.local_k:=1;
+RELAX.tree.770.local_k:<50;
+RELAX.tree.80.local_k:=1;
+RELAX.tree.80.local_k:<50;
+RELAX.tree.90.local_k:=1;
+RELAX.tree.90.local_k:<50;
+RELAX.tree.941.local_k:=1;
+RELAX.tree.941.local_k:<50;
+RELAX.tree.961.local_k:=1;
+RELAX.tree.961.local_k:<50;
+RELAX.tree.970.local_k:=1;
+RELAX.tree.970.local_k:<50;
+RELAX.tree.Node1.local_k:=1;
+RELAX.tree.Node1.local_k:<50;
+RELAX.tree.Node10.local_k:=1;
+RELAX.tree.Node10.local_k:<50;
+RELAX.tree.Node101.local_k:=1;
+RELAX.tree.Node101.local_k:<50;
+RELAX.tree.Node107.local_k:=1;
+RELAX.tree.Node107.local_k:<50;
+RELAX.tree.Node11.local_k:=1;
+RELAX.tree.Node11.local_k:<50;
+RELAX.tree.Node110.local_k:=1;
+RELAX.tree.Node110.local_k:<50;
+RELAX.tree.Node114.local_k:=1;
+RELAX.tree.Node114.local_k:<50;
+RELAX.tree.Node115.local_k:=1;
+RELAX.tree.Node115.local_k:<50;
+RELAX.tree.Node2.local_k:=1;
+RELAX.tree.Node2.local_k:<50;
+RELAX.tree.Node22.local_k:=1;
+RELAX.tree.Node22.local_k:<50;
+RELAX.tree.Node26.local_k:=1;
+RELAX.tree.Node26.local_k:<50;
+RELAX.tree.Node3.local_k:=1;
+RELAX.tree.Node3.local_k:<50;
+RELAX.tree.Node30.local_k:=1;
+RELAX.tree.Node30.local_k:<50;
+RELAX.tree.Node31.local_k:=1;
+RELAX.tree.Node31.local_k:<50;
+RELAX.tree.Node35.local_k:=1;
+RELAX.tree.Node35.local_k:<50;
+RELAX.tree.Node36.local_k:=1;
+RELAX.tree.Node36.local_k:<50;
+RELAX.tree.Node37.local_k:=1;
+RELAX.tree.Node37.local_k:<50;
+RELAX.tree.Node38.local_k:=1;
+RELAX.tree.Node38.local_k:<50;
+RELAX.tree.Node4.local_k:=1;
+RELAX.tree.Node4.local_k:<50;
+RELAX.tree.Node46.local_k:=1;
+RELAX.tree.Node46.local_k:<50;
+RELAX.tree.Node47.local_k:=1;
+RELAX.tree.Node47.local_k:<50;
+RELAX.tree.Node48.local_k:=1;
+RELAX.tree.Node48.local_k:<50;
+RELAX.tree.Node49.local_k:=1;
+RELAX.tree.Node49.local_k:<50;
+RELAX.tree.Node5.local_k:=1;
+RELAX.tree.Node5.local_k:<50;
+RELAX.tree.Node50.local_k:=1;
+RELAX.tree.Node50.local_k:<50;
+RELAX.tree.Node51.local_k:=1;
+RELAX.tree.Node51.local_k:<50;
+RELAX.tree.Node53.local_k:=1;
+RELAX.tree.Node53.local_k:<50;
+RELAX.tree.Node54.local_k:=1;
+RELAX.tree.Node54.local_k:<50;
+RELAX.tree.Node55.local_k:=1;
+RELAX.tree.Node55.local_k:<50;
+RELAX.tree.Node58.local_k:=1;
+RELAX.tree.Node58.local_k:<50;
+RELAX.tree.Node59.local_k:=1;
+RELAX.tree.Node59.local_k:<50;
+RELAX.tree.Node6.local_k:=1;
+RELAX.tree.Node6.local_k:<50;
+RELAX.tree.Node60.local_k:=1;
+RELAX.tree.Node60.local_k:<50;
+RELAX.tree.Node64.local_k:=1;
+RELAX.tree.Node64.local_k:<50;
+RELAX.tree.Node65.local_k:=1;
+RELAX.tree.Node65.local_k:<50;
+RELAX.tree.Node66.local_k:=1;
+RELAX.tree.Node66.local_k:<50;
+RELAX.tree.Node67.local_k:=1;
+RELAX.tree.Node67.local_k:<50;
+RELAX.tree.Node7.local_k:=1;
+RELAX.tree.Node7.local_k:<50;
+RELAX.tree.Node70.local_k:=1;
+RELAX.tree.Node70.local_k:<50;
+RELAX.tree.Node75.local_k:=1;
+RELAX.tree.Node75.local_k:<50;
+RELAX.tree.Node76.local_k:=1;
+RELAX.tree.Node76.local_k:<50;
+RELAX.tree.Node79.local_k:=1;
+RELAX.tree.Node79.local_k:<50;
+RELAX.tree.Node8.local_k:=1;
+RELAX.tree.Node8.local_k:<50;
+RELAX.tree.Node81.local_k:=1;
+RELAX.tree.Node81.local_k:<50;
+RELAX.tree.Node84.local_k:=1;
+RELAX.tree.Node84.local_k:<50;
+RELAX.tree.Node85.local_k:=1;
+RELAX.tree.Node85.local_k:<50;
+RELAX.tree.Node86.local_k:=1;
+RELAX.tree.Node86.local_k:<50;
+RELAX.tree.Node89.local_k:=1;
+RELAX.tree.Node89.local_k:<50;
+RELAX.tree.Node9.local_k:=1;
+RELAX.tree.Node9.local_k:<50;
+RELAX.tree.Node90.local_k:=1;
+RELAX.tree.Node90.local_k:<50;
+RELAX.tree.Node91.local_k:=1;
+RELAX.tree.Node91.local_k:<50;
+RELAX.tree.Node92.local_k:=1;
+RELAX.tree.Node92.local_k:<50;
+RELAX.tree.Node96.local_k:=1;
+RELAX.tree.Node96.local_k:<50;
+RELAX.tree.Node97.local_k:=1;
+RELAX.tree.Node97.local_k:<50;
+RELAX.tree.Node98.local_k:=1;
+RELAX.tree.Node98.local_k:<50;
+DataSet RELAX.codon_data = ReadDataFile(USE_NEXUS_FILE_DATA);
+DataSetFilter RELAX.codon_filter = CreateFilter(RELAX.codon_data,3,"0-680","0,56,59,60,58,57,55,53,54,1,3,52,2,49-51,44-48,43,38,4-8,10,9,11,13,14,12,15,30-34,16-26,39,35,36,40,42,37,27-29,41","TAA,TAG,TGA");
+ASSUME_REVERSIBLE_MODELS=1;
+LikelihoodFunction relax.LF = (RELAX.codon_filter,RELAX.tree);
+
+END;
\ No newline at end of file
diff --git a/tests/hbltests/RegressionTesting/RELAX/segfault.nex.partitioned_descriptive.fit b/tests/hbltests/RegressionTesting/RELAX/segfault.nex.partitioned_descriptive.fit
new file mode 100644
index 0000000..b581472
--- /dev/null
+++ b/tests/hbltests/RegressionTesting/RELAX/segfault.nex.partitioned_descriptive.fit
@@ -0,0 +1,3783 @@
+#NEXUS
+
+BEGIN TAXA;
+	DIMENSIONS NTAX = 61;
+	TAXLABELS
+		'70' '151' '1150' '50' '30' '80' '471' '270' '501' '310' '460' '330' '290' '520' '560' '540' '20' '60' '511' '1281' '90' '130' '571' '301' '281' '531' '490' '640' '961' '740' '591' '1260' '11' '191' '231' '161' '1110' '141' '171' '670' '1200' '241' '1270' '1190' '680' '941' '650' '970' '700' '431' '1250' '1210' '770' '720' '750' '1070' '811' '1220' '401' '181' '1180' ;
+END;
+
+BEGIN CHARACTERS;
+	DIMENSIONS NCHAR = 681;
+	FORMAT
+		DATATYPE = DNA
+		GAP=-
+		MISSING=?
+	;
+
+MATRIX
+	'70'    ------GTTCTTATGAGAAGAATGGCTCTTAAGAAATTGAAGGTGATACCAAAGGAAGGTTACTTATTACTTTTGGACTTTGATGATGAGGACGATGACATAAAAGTTTCAGAGGAGGCTCTTTCAGAAGTAAAGAGCCCAGCATTTGATAAAAATGAGAATATATCACCTCAAGCAGAAGCAGATGAAGATATCGGAGATGAAGTAGATAGTATGTTGGATAAATCTGAAGTAAACAACCCAGAAATTGGTAAAGATGAAAATATATCGCCTCAAGTAAAAGGAGATGAAGACATGGGACATGAAGTAGGCAGTATGTTGGATAAATCTGGAGATGACATTTATAAGACGCTTCACATAAAGAGAAAATGGATGGAAACTTATGTCAAAGAATCTTTCAAAGGCAGCAACCAGAAATTAGAAAGATTTTGCAAAATGAACGAACGAGAGAGGAAGAACATCAACAACAAATTTGTGAGCAGT [...]
+	'151'   ------GTTCTTATGAGAAGAATGGCTCTTAAGAAATTGAAGGTGATACCAAAGGAAGGTTACTTATTACTTTTGGACTTTGATGATGAGGACGATGACATAAAAGTTTCAGAGGAGGCTCTTTCGGAAGTAAAGAGCCCAGCATTTGATAAAAATGAGAATATATCGCCTCAAGCAGAAGCAGATGAAGATATGGGAGATGAAGTAGACAGTATGTTGGATAAATATGAAGTAAATAATCCAGCAATTGGTAAAGATGAAAATATATCGCCTCAAGTAAAAGGAGATGAAGACATGGGACATGAAGTAGGCAGTATGTTGGATAAATCTGGAGATGACATTTATAAGACGCTTCACATAAAGAGAAAATGGATGGAAACTTATGTCAAAGAATCTTTCAAAGGCAGCAACCAGAAATTAGAAAGATTTTGCAAAACGAACGAACGAGAGAGGAAGAACATCAACAACAAATTTTGTGAGCAG [...]
+	'1150'  ------GTTCTTATGAGAAGAATGGCTCTTAAGAAATTGAAGGTGATACCAAAGGAAGGTTACTTATTACTTTTGGACTTTGATGATGAGGACGATGACATAAAAGTTTCAGAGGAGGCTCTTTCGGAAGTAAAGAGCCCAGCATTTGATAAAAATGAGAATATATCGCCTCAAGCAGAAGCAGATGAAGATATGGGAGATGAAGTAGACAGTATGTTGGATAAATATGAAGTAAATAATCCAGCAATTGGTAAAGATGAAAATATATCGCCTCAAGTAAAAGGAGATGAAGACATGGGACATGAAGTAGGCAGTATGTTGGATAAATCTGGAGATGACATTTATAAGACGCTTCACATAAAGAGAAAATGGATGGAAACTTATGTCAAAGAATCTTTCAAAGGCAGCAACCAGAAATTAGAAAGATTTTGCAAAACGAACGAACGAGAGAGGAAGAACATCAACAACAAATTTTGTGAGCAG [...]
+	'50'    ------GTTCTTATGAGAAGAATGGCTCTTAAGAAATTGAAGGTGATACCAAAGGAAGGTTACTTATTACTTTTGGACTTTGATGATGAGGACGATGACATAAAAGTTTCAGAGGAGGCTCTTTCGGAAGTAAAGAGCCCAGCATTTGATAAAAATGAGAATATATCGCCTCAAGCAGAAGCAGATGAAGATATGGGAGATGAAGTAGACAGTATGTTGGATAAATCTGAAGTAAATAATCCAGCAATTGGTAAAGATGAAAATATATCGCCTCAAGTAAAAGGAGATGAAGACATGGGACATGAAGTAGGCAGTATGTTGGATAAATCTGGAGATGACATTTATAAGACGCTTCACATAAAGAGAAAATGGATGGAAACTTATGTCAAAGAATCTTTCAAAGGCAGCAACCAGAAATTAGAAAGATTTTGCAAAACGAACGAACGAGAGAGGAAGAACATCAACAACAAATTTTGTGAGCAG [...]
+	'30'    ------GTTCTTATGAGAAGAATGGCTCTTAAGAAATTGAAGGTGATACCAAAGGAAGGTTACTTATTACTTTTGGACTTTGATGATGAGGACGATGACATAAAAGTTTCAGAGGAGGCTCTTTCGGAAGTAAAGAGCCCAGCGTTTGATAAAAATGAGAATATATCGCCTCAAGCAGAAGCAGATGAAGATATGGGAGATGAAGTAGACAGTATGTTGGATAAATCTGAAGTAAATAACCCAGCAATTGGTAAAGATGGAAATATATCGCCTCAAGTAAAAGGAGATGAAGACATGGGACATGAAGTAGGCAGTATGTTGGATAAATCTGGAGATGACATTTATAAGACGCTTCACATAAAGAGAAAATGGATGGAAACTTATGTCAAAGAATCTTTCAAAGGCAGCAACCAGAAATTAGAAAGATTTTGCAAAACGAACGAACGAGAGAGGAAGAACATCAACAACAAATTTTGTGAGCAG [...]
+	'80'    ------GTTCTTATGAGAAAAATGGCTCTTAAGAAATTGAAGGTGATACCAAAGGAAGGTTACTTATTACTTTTGGACTTTGATGATGAGGACGATGACATAAAAGTTTCAGAGGAGGCTCTTTCGGAAGTAAAGAGCCCAGCGTTTGATAAAAATGAGAATATATCGCCTCAAGCAGAAGCAGATGAAGATATGGGAGATGAAGTAGACAGTATGTTGGATAAATCTGAAGTAAATAACCCAGCAATTGGTAAAGATGGATATATATCGCCTCAAGTAAAAGGAGATGAAGACATGGGACATGAAGTAGGCAGTATGTTGGATAAATCTGGAGATGACATTTATAAGACGCTTCACATAAAGAGAAAATGGATGGAAACTTATGTCAAAGAATCTTTCAAAGGCAGCAACCAGAAATTAGAAAGATTTTGCAAAACGAACGAACGAGAGAGGAAGAACATCAACAACAAATTTTGTGAGCAG [...]
+	'471'   ------GTTCTCATGAGAAAAATGGCTCTTAAGAAATTGAAGGTGATACCAAAGGAAGGTTACTTATTACTTTTGGACTTTGATGATGAGGACGATGACATAAAAGTTTCAGAGGAGGCTCTTTCAGAAGTAAAGAGCCCAGCGTTTGATAAAAATGAGAATATATCGCCTCAAGCAGAAGCAGATGAAGATATGGGAGATGAAGTAGACAGTATGTTGGATAAATCTGAAGTAAATAACCCAGCAATTGGTAAAGATGGATATATATCGCCTCAAGTAAAAGGAGATGAAGACATGGGACATGAAGTAGGCAGTATGTTGGATAAATCTGGAGATGACATTTATAAGACGCTTCACATAAAGAGAAAATGGATGGAAACTTATGTCAAAGAATCTTTCAAAGGCAGCAACCAGAAATTAGAAAGATTTTGCAAAACGAACGAACGAGAGAGGAAGAACATCAACAACAAATTTTGTGAGCAG [...]
+	'270'   ------GTTCTTATGAGAAGAATGGCTCTTAAGAAATTGAAGGTGATACCAAAGGAAGGTTACTTATTACTTTTGGACTTTGATGATGAGGACGATGACATGAAAGTTTCAGAGGAGGCTCTTTCGGAAGTAAAGAGCCCAGCGTTTGATAAAAATGAGAATATATCGCCTCAAGCAGAAGCAGATGAAGATATGGGAGATGAAGTAGACAGTATGTTGGATAAATCTGAAGTAAATAACCCAGCAATTGGTAAAGATGGATATATATCGCCTCAAGTAAAAGGAGATGAAGACATGGGACATGAAGTAGGCAGTATGTTGGATAAATCTGGAGATGACATTTATAAGACGCTTCACATAAAGAGAAAATGGATGGAAACTTATGTCAAAGAATCTTTCAAAGGCAGCAACCAGAAATTAGAAAGATTTTGCAAAACGAACGAACGAGAGAGGAAGAACATCAACAACAAATTTTGTGAGCAG [...]
+	'501'   ------GTTCTTATGAGAAGAATGGCTCTTAAGAAATTGAAGGTGATACCAAAGGAAGGTTACTTATTACTTTTGGACTTTGATGATGAGGACGATGACATGAAAGTTTCAGAGGAGGCTCTTTCGGAAGTAAAGAGCCCAGCGTTTGATAAAAATGAGAATATATCGCCTCAAGCAGAAGCAGATGAAGATATGGGAGATGAAGTAGACAGTATGTTGGATAAATCTGAAGTAAATAACCCAGCAATTGGTAAAGATGGATATATATCGCCTCAAGTAAAAGGAGATGAAGACATGGGACATGAAGTAGGCAGTATGTTGGATAAATCTGGAGATGACATTTATAAGACGCTTCACATAAAGAGAAAATGGATGGAAACTTATGTCAAAGAATCTTTCAAAGGTAGCAACCAGAAATTAGAAAGATTTTGCAAAACGAACGAACGAGAGAGGAAGAACATCAACAACAAATTTTGTGAGCAG [...]
+	'310'   ------GTTCTTATGAGAAGAATGGCTCTTAAGAAATTGAAGGTGATACCAAAGGAAGGTTACTTATTACTTTTGGACTTTGATGATGAGGATGATGACATAAAAGTTTCAGAGGAGGCTCTTTCGGAAGTAAAGAGCCCAGCGTTTGATAAAAATGAGAATATATCGCCTCAAGCAGAAGCAGATGAAGATATGGGAGATGAAGTAGACAGTATGTTGGATAAATCTGAAGTAAATAACCCAGCAATTGGTAAAGATGGATATATATCGCCTCAAGTAAAAGGAGATGAAGACATGGGACATGAAGTAGGCAGTATGTTGGATAAATCTGGAGATGACATTTATAAGACGCTTCACATAAAGAGAAAATGGATGGAAACTTATGTCAAAGAATCTTTCAAAGGCAGCAACCAGAAATTAGAAAGATTTTGCAAAACGAACGAACGAGAGAGGAAGAACATCAACAACAAATTTTGTGAGCAG [...]
+	'460'   ------GTTCTTATGAGAAGAATGGCTCTTAAGAAATTGAAGGTGATACCAAAGGAAGGTTACTTATTACTTTTGGACTTTGATGATGAGGATGATGACATAAAAGTTTCAGAGGAGGCTCTTTCGGAAGTAAAGAGCCCAGCGTTTGATAAAAATGAGAATATATCGCCTCAAGCAGAAGCAGATGAAGATATGGGAGATGAAGTAGACAGTATGTTGGATAAATCTGAAGTAAATAACCCAGCAATTGGTAAAGATGGATATATATCGCCTCAAGTAAAAGGAGATGAAGACATGGGACATGAAGTAGGCAGTATGTTGGATAAATCTGGAGATGACATTTATAAGACGCTTCACATAAAGAGAAAATGGATGGAAACTTATGTCAAAGAATCTTTCAAAGGCAGCAACCAGAAATTAGAAAGATTTTGCAAAACGACCGAACGAGAGAGGAAGAACATCAACAACAAATTTTGTGAGCAG [...]
+	'330'   ------GTTCTTATGAGAAGAATGGCTCTTAAGAAATTGAAGGTGATACCAAAGGAAGGTTACTTATTACTTTTGGACTTTGATGATGAGGATGATGACATAAAAGTTTCAGAGGAGGTTCTTTCGGAAGTAAAGAGCCCAGCGTTTGATAAAAATGAGAATATATCGCCTCAAGCAGAAGCAGATGAAGATATGGGAGATGAAGTAGACAGTATGTTGGATAAATCTGAAGTAAATAACCCAGCAATTGGTAAAGATGGATATATATCGCCTCAAGTAAAAGGAGATGAAGACATGGGACATGAAGTAGGCAGTATGTTGGATAAATCTGGAGATGACATTTATAAGACACTTCACATAAAGAGAAAATGGATGGAAACTTATGTCAAAGAATCTTTCAAAGGCAGCAACCAGAAATTAGAAAGATTTTGCAAAACGAACGAACGAGAGAGGAAGAACATCAACAACAAATTTTGTGAGCAG [...]
+	'290'   ------GTTCTTATGAGAAGAATGGCTCTTAAGAAATTGAAGGTGATACCAAAGGAAGGTTACTTATTACTTTTGGACTTTGATGATGAGGATGATGACATAAAAGTTTCAGAGGAGGCTCTTTCGGAAGTAAAGAGCCCAGCGTTTGATAAAAATGAGAATATATCGCCTCAAGCAGAAGCAGATGAAGATATGGGAGATGAAGTAGACAGTATGTTGGATAAATCTGAAGTAAATAACCCAGCAATTGGTAAAGATGGATATATATCGCCTCAAGTAAAAGGAGATGAAGACATGGGACATGAAGTAGGCAGTATGTTGGATAAATCTGGAGATGACATTTATAAGACGCTTCACATAAAGAGAAAATGGATGGAAACTTATGTCAAAGAATCTTTCAAAGGCAGCAACCAGAAATTAGAAAGATTTTGCAAAACGAACGAACGAGAGAGGAAGAACATCAACAACAAATTTTGTGAGCAG [...]
+	'520'   ------GTTCTTATGAGAAGAATGGCTCTTAAGAAATTGAAGGTGATACCAAAGGAAGGTTACTTATTACTTTTGGACTTTGATGATGAGGATGATGACATAAAAGTTTCAGAGGAGGCTCTTTCGGAAGTAAAGAGCCCAGCGTTTGATAAAAATGAGAATATATCGCCTCAAGCAGAAGCAGATGAAGATATGGGAGATGAAGTAGACAGTATGTTGGATAAATCTGAAGTAAATAACCCAGCAATTGGTAAAGATGGATATATATCGCCTCAAGTAAAAGGAGATGAAGACATGGGACATGAAGTAGGCAGTATGTTGGATAAATCTGGAGATGACATTTATAAGACGCTTCACATAAAGAGAAAATGGATGGAAACTTATGTCAAAGAATCTTTCAAAGGCAGCAACCAGAAATTAGAAAGATTTTGCAAAACGAACGAACGAGAGAGGAAGAACATCAACAACAAATTTTGTGAGCAG [...]
+	'560'   ------GTTCTTATGAGAAGAATGGCTCTTAAGAAATTGAAGGTGATACCAAAGGAAGGTTACTTATTACTTTTGGACTTTGATGATGAGGATGATGACATAAAAGTTTCAGAGGAGGCTCTTTCGGAAGTAAAGAGCCCAGCGTTTGATAAAAATGAGAATATATCGCCTCAAGCAGAAGCAGATGAAGATATGGGAGATGAAGTAGACAGTATGTTGGATAAATCTGAAGTAAATAACCCAGCAATTGGTAAAGATGGATATATATCGCCTCAAGTAAAAGGAGATGAAGACATGGGACATGAAGTAGCCAGTATGTTGGATAAATCTGGAGATGACATTTATAAGACGCTTCACATAAAGAGAAAATGGATGGAAACTTATGTCAAAGAATCTTTCAAAGGCAGCAACCAGAAATTAGAAAGATTTTGCAAAACGAACGAACGAGAGAGGAAGAACATCAACAACAAATTTTGTGAGCAG [...]
+	'540'   ------GTTCTTATGAGAAGAATGGCTCTTAAGAAATTGAAGGTGATACCAAAGGAAGGTTACTTATTACTTTTGGACTTTGATGATGAGGATGATGACATAAAAGTTTCAGAGGAGGCTCTTTCGGAAGTAAAGAGCCCAGCGTTTGATAAAAATGAGAATATATCGCCTCAAGCAGAAGCAGATGAAGATATGGGAGATGAAGTAGACAGTATGTTGGATAAATCTGAAGTAAATAACCCAGCAATTGGTAAAGATGGATATATATCGCCTCAAGTAAAAGGAGATGAAGACATGGGACATGAAGTAGGCAGTATGTTGGATAAATCTGGAGATGACATTTATAAGACGCTTCACATAAAGAGAAAATGGATGGAAACTTATGTCAAAGAATCTTTCAAAGGCAGCAACCAGAAATTAGAAAGATTTTGCAAAACGAACGAACGAGAGAGGAAGAACATCAACAACAAATTTTGTGAGCAG [...]
+	'20'    ------GTTCTTATGAGAAGAATGGCTCTTAAGAAATTGAAGGTGATACCAAAGGAAGGTTACTTATTACTTTTGGACTTTGATGATGAGGACGATGACATAAAAGTTTCAGAGGAGGCTCTTCCGGAAGTAAAGAGCCCAGCATTTGATAAAAATGAGAATATATCGCCTCAAGCAGAAGCAGATGAAGATATGGGAGATGAAGTAGATAGTATTTTGGATAAATCTGAAGTAAATAACCCAGCAATTGGTAAAGATGAAAATATATCGCCTCAAGTAAAAGGAGATGAAGACATGGGACATGAAGTAGGCAGTATGTTGGATAAATCTGGAGATGACATTTATAAGATGCTTCACATAAAGAGAAAATGGATGGAAACTTATGTCAAAGAATCATTCAAAGACAGCAACCAGAAATTAGAAAGATTTTGCAAAATGAACGAACGAGAGAGGAAGAACATCAACAACAAATTTTGTGAGCAG [...]
+	'60'    ------GTTCTTATGAGAAGAATGGCTCTTAAGAAATTGAAGGTGATACCAAAGGAAGGTTACTTATTACTTTTGGACTTTGATGATGAGGACGATGACATAAAAGTTTCAGAGGAGGCTCTTTCGGAAGTAAAGAGCCAAGCATTTGATAAAAATGAGAATATATCGCCTCAAGCAGAAGCAGATGAAGATATGGGAGATGAAGTAGATAGTATATTGGATAAATCTGAATTAAATAACCCAGCAATTGGTAAAGATGAAAATATATCGCCTCAAGTAAAAGGAGATGAAGACATGGGACATGAAGTAGGCAGTATGTTGGATAAATCTGGAGATGACATTTATAAGACGCTTCACATAAAGAGAAAATTGATGGAAACTTATGTCAAAGAATCTTTCAAAGGCAGCAACCAGAAATTAGAAAGATTTTGCAAAATGAACGAACGAGAGAGGAAGAACATCAACAACAAATTTTGTGAGCAG [...]
+	'511'   TATTCAGTTCTTATGAGAAAAATGGCTCTTAAGAAATTGAAGGTGATACCAAAGGAAGGTTACTTATTACTTTTGGACTTTGATGATGAGGATGATGACATAAAAGTTTCAGAGGAGGCTCTTTCGGAAGTAAAGAGCCCAGCATTTGATAAAAATGAGAATATATCGCCTCAAGCAGAAGCAGATGAAGATATGGGAGATGAAGTAGACAGTATGTTGGATAAATCTGAAGTAAACCACCCAGCAATTGGTAAAGATGAAAATATATCGCCTCAAGTAAAAGGACATGAAGACAGGGGACATGAAGTAGGCAGTATGTTGGATAAATCTGGAGATGACATTTATAAGACGCTTCACATAAAGAGAAAATGGATGGAAACTTATGTCAAAGAATCTTTCAAAGGCAGGAACCAGAAATTAGAAAGATTTTGCAAAATGAACGAACGAGAGAGGAAGAACATCAACAACAAATTTTGTGAGCAG [...]
+	'1281'  ------GTTCTTATGAGAAAAATGGCTCTTAAGAAATTGAAGGTGATACCAAAGGAAGGTTACTTATTACTTTTGGACTTTGATGATGAGGATGATGACATAAAAGTTTCAGAGGAGGCTCTATCGGAAGTAAAGAGCCCAGCATTTGATAAAAATGAGAATATATCGCCTCAAGCAGAAGCAGATGAAGATATGGGAGATGAAGTAGACAGTATGTTGGATAAATCTGAAGTAAACAACCCAGCAATTGGTAAAGATGAAAATATATCGCCTCAAGTAAAAGGACATGAAGACAGGGGACATGAAGTAGGCAGTATGTTGGATAAATCTGGAGATGACATTTATAAGACGCTTCACATAAAGAGAAAATGGATGGAAACTTATGTCAAAGAATCTTTCAAAGGCAGGAACCAGAAATTAGAAAGATTTTGCAAAATGAACGAACGAGAGAGGAAGAACATCAACAACAAATTTTGTGAGCAG [...]
+	'90'    ------GTTCTTATGAGAAAAATGGCTCTTAAGAAATTGAAGGTGATACCAAAGGAAGGTTACTTATTACTTTTGGACTTTGATGATGAGGATGATGACATAAAAGTTTCAGAGGAGGCTCTTTCGGAAGTAAAGAGCCCAGCATTTGATAAAAATGAGAATATATCGCCTCAAGCAGAAGCAGATGAAGATATGGGAGATGAAGTAGACAGTATGTTGGATAAATCTGAAGTAAACAACCCAGCAATTGGTAAAGATGAAAATATATCGCCTCAAGTAAAAGGACATGAAGACAGGGGACATGAAGTAGGCAGTATGTTGGATAAATCTGGAGATGACATTTATAAGACGCTTCACATAAAGAGAAAATGGATGGAAACTTATGTCAAAGAATCTTTCAAAGGCAGGAACCAGAAATTAGAAAGATTTTGCAAAATGAACGAACGAGAGAGGAAGAACATCAACAACAAATTTTGTGAGCAG [...]
+	'130'   ------GTTCTTATGAGAAAAATGGCTCTTAAGAAATTGAAGGTGATACCAAAGGAAAGTTACTTATTACTTTTGGACTTTGATGATGAGGACGATGATATAAAAGTTTCAGAGGAGGCTCTTTCGGAAGTAAAGAGCCCAGCATTTGATAAAAATGAGAATATATCGCCTCAAGCAGAAGCAGATGAAGATATGGGAGATGAAGTAGACAGTATGTTGGATAAATCTGAAGTAAACAACCCAGCAATTGGTAAAGATGAAAATATATCGCCTCAAGTAAAAGGACATGAAGACAGGGGACATGAAATAGGCAGTATGTTGGATAAATCTGGAGATGACATTTATAAGACGCTTCACATAAAGAGAAAATGGATGGAAACTTATGTCAAAGAATCTTTCAAAGGCAGGAACCAGAAATTAGAAAGATTTTGCAAAATGCACGAACGAGAGAGGAAGAACATCAACAACAAATTTTGTGAGCAG [...]
+	'571'   ------GTTCTTATGAGAAAAATGGCTCTTAAGAAATTGAAGGTGATACCAAAGGAAAGTTACTTATTACTTTTGGACTTTGATGATGAGGACGATGATATAAAAGTTTCAGAGGAGGCTCTTTCGGAAGTAAAGAGCCCAGCATTTGATAAAAATGAGAATATATCGCCTCAAGCAGAAGCAGATGAAGATATGGGAGATGAAGTAGACAGTATGTTGGATAAATCTGAAGTAAACAACCCAGCAATTGGTAAAGATGAAAATATATCGCCTCAAGTAAAAGGACATGAAGACAGGGGACATGAAATAGGCAGTATGTTGGATAAATCTGGAGATGACATTTATAAGACGCTTCACATAAAGAGAAAATGGATGGAAACTTATGTCAAAGAATCTTTCAAAGGCAGGAACCAGAAATTAGAAAGATTTTGCAAAATGAACGAACGAGAGAGGAAGAACATCAACAACAAATTTTGTGAGCAG [...]
+	'301'   ------GTTCTTATGAGAAAAATGGCTCTTAAGAAATTGAAGGTGATACCAAAGGAAAGTTACTTATTACTTTTGGACTTTGATGATGAGGACGATGATATAAAAGTTTCAGAGGAGGCTCTTTCGGAAGTAAAGAGCCCAGCATTTGATAAAAATGAGAATATATCGCCTCAAGCAGAAGCAGATGAAGATATGGGAGATGAAGTAGACAGTATGTTGGATAAATCTGAAGTAAACAACCCAGCAATTGGTAAAGATGAAAATATATCGCCTCAAGTAAAAGGACATGAAGACAGGGGACATGAAATAGGCAGTATGTTGGATAAATCTGGAGATGACATTTATAAGACGCTTCACATAAAGAGAAAATTGATGGAAACTTATGTCAAAGAATCTTTCAAAGGCAGGAACCAGAAATTAGAAAGATTTTGCAAAATGAACGAACGAGAGAGGAAGAACATCAACAACAAATTTTGTGAGCAG [...]
+	'281'   ------GTTCTTATGAGAAAAATGGCTCTTAAGAAATTGAAGGTGATACCAAAGGAAAGTTACTTATTACTTTTGGACTTTGATGATGAGGACGATGATATAAAAGTTTCAGAGGAGGCTCTTTCGGAAGTAAAGAGCCCAGCATTTGATAAAAATGAGAATATATCGCCTCAAGCAGAAGCAGATGAAGATATGGGAGATGAAGTAGACAGTATGTTGGATAAATCTGAAGTAAACAACCCAGCAATTGGTAAAGATGAAAATATATCGCCTCAAGTAAAAGGACATGAAGACAGGGGACATGAAATAGGCAGTATGTTGGATAAATCTGGAGATGACATTTATAAGACGCTTCACATAAAGAGAAAATGGATGGAAACTTATGTCAAAGAATCTTTCAAAGGCAGGAACCAGAAATTAGAAAGATTTTGCAAAATGAACGAACGAGAGAGGAAGAACATCAACAACAAATTTTGTGAGCAG [...]
+	'531'   ------GTTCTTATGAGAAAAATGGCTCTTAAGAAATTGAAGGTGATACCAAAGGAAAGTTACTTATTACTTTTGGACTTTGATGATGAGGACGATGATATAAAAGTTTCAGAGGAGGCTCTTTCGGAAGTAAAGAGCCCAGCATTTGATAAAAATGAGAATATATCGCCTCAAGCAGAAGCAGATGAAGATATGGGAGATGAAGTAGACAGTATGTTGGATAAATCTGAAGTAAACAACCCAGCAATTGGTAAAGATGAAAATATATCGCCTCAAGTAAAAGGACATGAAGACAGGGGACATGAAGTAGGCAGTATGTTGGATAAATCTGGAGATGACATTTATAAGACGCTTCACATAAAGAGAAAATGGATGGAAACTTATGTCAAAGAATCTTTCAAAGGCAGGAACCAGAAATTAGAAAGATTTTGCAAAATGAACGAACGAGAGAGGAAGAACATCAACAACAAATTTTGTGAGCAG [...]
+	'490'   ------GTTCTTATGAGAAGAATGGCTCTTAAGAAATTGAAGGTGATACCAAAGGAAGGTTACTTATTACTATTGGACTTTGATGATGAGGATGATGACATAAAAGTTTCAGAGGAGGCTCTTTCGGAAGTAAAGAGCCCAGCATTTGATAAAAATGAGAATATATCACCTCAAGCAGAAGCAGATGAAGATATCGGAGATGAAATAGATAGTATGTTGGATAAATCTGAAGTAAACAACCCAGCAATTGGTAAAGATGAAAATATATCGCCTCAAGTAAAAGGAGATGAAGACATGGGACATGAAGTAGGCAGTATGTTGGATAAATCTGGAGATGACATATATAAGACGCTTCACATAAAGAGAAAATGGATGGAAACTTATGTCAAAGAATCTTTCAAAGGCAGGAACCAGAAATTAGAAAGATTTTGCAAAATGAATGAACGAGAGAGGAAGAACATCAACAACAAATTTTGTGAGCAG [...]
+	'640'   ------GTTCTTATGAGAAGAATGGCTCTTAAGAAATTGAAGGTGATACCAAAGGAAGGTTACTTATTACTTTTGGACTTTGATGATGAGGACGATGACATAAAAGTTTCAGAGGAGGCTCTTTCGGAAGTAAAAAGCCCAGCATTTGATAAAAATGAGAATATATCGCCTCAAGCAGAAGCAGATGAAGATATGGGAGATGAAGTAGACAGTATATTGGATAAATCTGAAGTAAATAATCCAGCAATTGGTAAAGATGAAAATACATCGCCTCAAGTAAAAGGAGATGAAGACATGGGACATGAAGTAGGCAGTATGTTGGATAAATCTGGAGATGACATTTATAAGACGCTTCACATAAAGAGAAAATGGATGGAAACTTATGTCAAAGAATCTTTCAAAGGCAGCAACCAGAAATTAGAAAGATTTTGCAAAACGAACGAACGAGAGAGGAAGAACATCAACAACAAATTTTGTGAGCAG [...]
+	'961'   ------GTTCTTATGAGAAGAATGGCTCTTAAGAAATTGAAGGTGATACCAAAGGAAGGTTACTTATTACTTTTGGACTTTGATGATGAGGACGATGACATAAAAGTTTCAGAGGAGGCTCTTTCGGAAGTAAAGAGCCCAGCATTTGATAAAAATGAGAATATATCGCCTCAAGCAGAAGCAGATGAAGATATGGGAGATGAAGTAGACAGTATATTGGATAAATCTGAAGTAAATAATCCAGCAATTGGTAAAGATGAAAATACATCGCCTCAAGTAAAAGGAGATGAAGACATGGGACATGAAGTAGGCAGTATGTTGGATAAATCTGGAGATGACATTTATAAGACGCTTCACATAAAGAGAAAATGGATGGAAACTTATGTCAAAGAATCTTTCAAAGGCAGCAACCAGAAATTAGAAAGATTTTGCAAAACGAACGAACGAGAGAGGAAGAACATCAACAACAAATTTTGTGAGCAG [...]
+	'740'   ------GTTCTTATGAGAAGAATGGCTCTTAAGAAATTGAAGGTGATACCAAAGGAAGGTTACTTATTACTTTTGGACTTTGATGATGAGGACGATGACATAAAAGTTTCAGAGGAGGCTCTTTTGGAAGTAAAGAGCCCAGCATTTGATAAAAATGAGAATATATCGCCTCAAGCAGAAGCAGATGAAGATATGGGAGATGAAGTAGACAGTATGTTGGATAAATCTGAAGTAAATAATCCAGCAATTGGTAAAGATGAAAATACATCGCCTCAAGTAAAAGGAGATGAAGACATGGGACATGAAGTAGGCAGTATGTTGGATAAATCTGGAGATGACATTTATAAGACGCTTCACATAAAGAGAAAATGGATGGAAACTTATGTCAAAGAATCTTTCAAAGGCAGCAACCAGAAATTAGAAAGATTTTGCAAAACGAACGAACGAGAGAGGAAGAACATCAACAACAAATTTTGTGAGCAG [...]
+	'591'   ---------------AGAGCCCAGCGTTTGATAAAAATGAGAATATATCGCCTCAAG------------------------------------------------------------------------------------------CAGAAGCAGATGAAGATATGG------------------------------GATGAAGTAGACAGTATGTTGGATAAATCTGAAGTAAATAACCCAGCAATTGGTAAAGATGGATATATATCGCCTCAAGTAAAAGGAGATGAAGACATGGGACATGAAGTAGCCAGTATGTTGGATAAATCTGGAGATGACATTTATAAGACGCTTCACATAAAGAGAAAATGGATGGAAACTTATGTCAAAGAATCTTTCAAAGGCAGCAACCAGAAATTAGAAAGATTTTGCAAAACGAACGAACGAGAGAGGAAGAACATCAACAACAAATTTTGTGAGCAG [...]
+	'1260'  ---------------AGAGCCCAGCATTTGATAAAAATGAGAATATATCGCCTCAAG------------------------------------------------------------------------------------------CAGAAGCAGATGAAGATATGG------------------------------GATACAGTAGACAGTATATTGGATAAATCTGAAGTAAATAATCCAGCAATTGGTAAAGATGAAAATATATCGCCTCAAGTAAAAGGAGATGAAGACATGGGACATGAAGTAGGCAGTATGTTGGATAAATCTGGAGATGACATTTATAAGACGCTTCACATAAAGAGAAAATGGATGGAAACTTATGTCAAAGAATCTTTCAAAGGCAGCAACCAGAAATTAGAAAGATTTTGCAAAACGAACGAACGAGAGAGGAAGAACATCAACAACAAATTTTGTGAGCAG [...]
+	'11'    ------------------------------------------------------GCA------------------------------------------------------------------------------------------GAAGCAGATGAAGATATGGGA------------------------------GATGAAGTAGACAGTATGTTGGATAAATCTGAAGTAAATAACCCAGCAATTGGTAAAGATGGAAATATATCGCCTCAAGTAAAAGGAGATGAAGACATGGGACATGAAGTAGGCAGTATGTTGGATAAATCTGGAGATGACATTTATAAGACGCTTCACATAAAGAGAAAATGGATGGAAACTTATGTCAAAGAATCTTTCAAAGGCAGCAACCAGAAATTAGAAAGATTTTGCAAAACGAACGAACGAGAGAGGAAGAACATAAACAACAAATTTTGTGAGCAG [...]
+	'191'   ---------------AGCCCAGCATTTGATAAAAATGAGAATATATCGCCTCAAGCA------------------------------------------------------------------------------------------GAAGCAGATGAAGATATGGGA------------------------------GATGAAGTAGACAGTATGTTGGATAAATCTGAAGTAAATAATCCAGCAATTGGTAAAGATGAAAATATATCGCCTCAAGTAAAAGGAGATGAAGACATGGGACATGAAGTAGGCAGTATGTTGGATAAATCTGGAGATGACATTTATAAGACGCTTCACATAAAGAGAAAATGGATGGAAACTTATGTCAAAGAATCTTTCAAAGGCAGCAACCAGAAATTAGAAAGATTTTGCAAAACGAACGAACGAGAGAGGAAGAACATCAACAACAAATTTTGTGAGCAG [...]
+	'231'   ---------------AGCCCAGCATTTGATAAAAATGAGAATATATCGCCTCAAGCA------------------------------------------------------------------------------------------GAAGCAGATGAAGATATGGGA------------------------------GATGAAGTAGACAGTATGTTGGATAAATCTGAAGTAAATAATCTAGCAATTGGTAAAGATGAAAATATATCGCCTCAAGTAAAAGGAGATGAAGACATGGGACATGAAGTAGGCAGTATGTTGGATAAATCTGGAGATGACATTTATAAGACGCTTCACATAAAGAGAAAATGGATGGAAACTTATGTCAAAGAATCTTTCAAAGGCAGCAACCAGAAATTAGAAAGATTTTGCAAAACGAACGAACGAGAGAGGAAGAACATCAACAACAAATTTTGTGAGCAG [...]
+	'161'   ------GTTCTTATGAGAAGAATGTCTCTTAAGAAATTGAAGGTGATACCAAAGGAAGGTTACTTATTACTTTTGGACTTTGATGATGAGGACGATGACATAAAAGTTTCAGAGGAGGCTCTTTCGGAAGTAAAGAGCCCAGCATTTGATAAAAATGAGAATATATCGCCTCAAGCAGAAGGAGATGAAGATATGGGAGATGAAGTAGACAGTATGTTGGATAAATCTGAAGTAAATAATCCAGCAATTGGTAAAGATGAAAATATATCGCCTCAAGTAAAAGGAGATGAAGACATGGGACATGAAGTAGGCAGTATGTTGGATAAATCTGGAGATGACATTTATAAGACGCTTCACATAAAGAGAAAATGGATGGAAACTTATGTCAAAGAATCTTTCAAAGGCAGCAACCAGAAATTAGAAAGATTTTGCAAAACGAACGAACGAGAGAGGAAGAACATCAACAACAAATTTTGTGAGCAG [...]
+	'1110'  ------GTTCTTATGAGAAGAATGTCTCTTAAGAAATTGAAGGTGATACCAAAGGAAGGTTACTTATTACTTTTGGACTTTGATGATGAGGACGATGACATAAAAGTTTCAGAGGAGGCTCTTTCGGAAGTAAAGAGCCCAGCATTTGATAAAAATGAGAATATATCGCCTCAAGCAGAAGGAGATGAAGATATGGGAGATGAAGTAGACAGTATGTTGGATAAATCTGAAGTAAATAATCCAGCAATTGGTAAAGATGAAAATATATCGCCTCAAGTAAAAGGAGATGAAGACATGGGACATGAAGTAGGCAGTATGTTGGATAAATCTGGAGATGACATTTATAAGACGCTTCACATAAAGAGAAAATGGATGGAAACTTATGTCAAAGAATCTTTCAAAGGCAGCAACCAGAAATTAGAAAGATTTTGCAAAACGAACGAACGAGAGAGGAAGAACATCAACAACAAATTTTGTGAGCAG [...]
+	'141'   ------GTTCTTATGAGAAGAATGGCTCTTAAGAAATTGAAGGTGATACCAAAGGAAGGTTACTTATTATTTTTGGACTTTGATGATGAGGACGATGACATAAAAGTTTCAGAGGAGGCTCTTTCGGAAGTAAAGAGCCCAGCATTTGATAAAAATGAGAATATATCGCCTCAAGCAGAAGCAGATGAAGATATGGGAGATGAAGTAGACAGTATGTTGGATAAATCTGAAGTAAATAATCCAGCAATTGGTAAAGATGAAAATATATCGCCTCAAGTAAAAGGAGATGAAGACATGGGACATGAAGTAGGCAGTATGTTGGATAAATCTGGAGATGACATTTATAAGACGCTTCACATAAAGAGAAAATGGATGGAAACTTATGTCAAAGAATCTTTCAAAGGCAGCAACCAGAAATTAGAAAGATTTTGCAAAACGAACGAACGAGAGAGGAAGAACATCAACAACAAATTTTGTGAGCAG [...]
+	'171'   ------GTTCTTATGAGAAGAATGGCTCTTAAGAAATTGAAGGTGATACCAAAGGAAGGTTACTTATTACTTTTGGACTTTGATGATGAGGACGATGACATAAAAGTTTCAGAGGAGGCTCTTTCGGAAGTAAAGAGCCCAGCATTTGATAAAAATGAGAATATATCGCCTCAAGCAGAAGCAGATGAAGATATGGGAGATGAAGTAGACAGTATGTTGGATAAATCTGAAGTAAATAATCCAGCAATTGGTAAAGATGAAAATATATCGCCTCAAGTAAAAGGAGATGAAGACATGGGACATGAAGTAGGCAGTATGTTGGATAAATCTGGAGATGACATTTATAAGACGCTTCACATAAAGAGAAAATGGATGGAAACTTATGTCAAAGAATCTTTCAAAGGCAGCAACCAGAAATTAGAAAGATTTTGCAAAACGAACGAACGAGAGAGGAAGAACATCAACAACAAATTTTGTGAGCAG [...]
+	'670'   ------GTTCTTATGAGAAGAATGGCTCTTAAGAAATTGAAGGTGATACCAAAGGAAGGTTACTTATTACTTTTGGACTTTGATGATGAGGACGATGACATAAAAGTTTCAGAGGAGGCTCTTTCGGAAGTAAAGAGCCCAGCATTTGATAAAAATGAGAATATATCGCCTCAAGCAGAAGCAGATGAAGATATGGGAGATGAAGTAGACAGTATGTTGGATAAATCTGAAGTAAATAACCCAGCAATTGGTAAAGATGAAAATATATCGCCTCAAGTAAAAGGAGATGAAGACATGGGACATGAAGTAGGCAGTATGTTGGATAAATCTGGAGATGACATTTATAAGACGCTTCACATAAAGAGAAAATGGATGGAAACTTATGTCAAAGAATCTTTCAAAGGCAGCAACCAGAAATTAGAAAGATTTTGCAAAACGAACGAACGAGAGAGGAAGAACATCAACAACAAATTTTGTGAGCAG [...]
+	'1200'  ------GTTCTTATGAGAAGAATGGCTCTTAAGAAATTGAAGGTGATACCAAAGGAAGGTTACTTATTACTTTTGGACTTTGATGATGAGGACGATGACATAAAAGTTTCAGAGGAGGCTCTTTCAGAAGTAAAGAGCCCAGCATTTGATAAAAATGAGAATATATCGCCTCAAGCAGAAGCAGATGAAGATATGGGAGATGAAGTAGACAGTATGTTGGATAAATCTGAAGTAAATAATCCAGCAATTGGTAAAGATGAAAATATATCGCCTCAAGTAAAAGGAGATGAAGACATGGGACATGAAGTAGGCAGTATGTTGGATAAATCTGGAGATGACATTTATAAGACGCTTCACATAAAGAGAAAATGGATGGAAACTTATGTCAAAGAATCTTTCAAAGGCAGCAACCAGAAATTAGAAAGATTTTGCAAAACGAACGAACGAGAGAGGAAGAACATCAACAACAAATTTTGTGAGCAG [...]
+	'241'   ------GTTCTTATGAGAAGAATGGCTCTTAAGAAATTGAAGGTGATACCAAAGGAAGGTTACTTATTACTTTTGGACTTTGATGATGAGGACGATGACATAAAAGTTTCAGAGGAGGCTCTTTCGGAAGTAAAGAGCCCAGCATTTGATAAAAATGAGAATATATCGCCTCAAGCAGAAGCAGATGAAGATATGGGAGATGAAGTAGACAGTATGTTGGATATATCTGAAGTAAATAATCCAGCAATTGGTAAAGATGAAAATATATCGCCTCAAGTAAAAGGAGATGAAGACATGGGACATGAAGTAGGCAGTATGTTGGATAAATCTGGAGATGACATTTATAAGACGCTTCACATAAAGAGAAAATGGATGGAAACTTATGTCAAAGAATCTTTCAAAGGCAGCAACCAGAAATTAGAAAGATTTTGCAAAACGAACGAACGAGAGAGGAAGAACATCAACAACAAATTTTGTGAGCAG [...]
+	'1270'  ------GTTCTTATGAGAAGAATGGCTCTTAAGAAATTGAAGGTGATACCAAAGGAAGGTTACTTATTACTTTTGGACTTTGATGATGAGGACGATGACATAAAAGTTTCAGAGGAGGCTCTTTCAGAAGTAAAGAGCCCAGCATTTGATAAAAATGAGAATATATCGCCTCAAGCAGAAGCAGATGAAGATATGGGAGATGAAGTAGACAGTATGTTGGATAAATCTGAAATAAATAATCCAGCAATTGGTAAAGATGAAAATATATTGCCTCAAGTAAAAGGAGATGAAGACATGGGACATGAAGTAGGCAGTATGTTGGATAAATCTGGAGATGACATTTATAAGACGCTTCACATAAAGAGAAAATGGATGGAAACTTATGTCAAAGAATCTTTCAAAGGCAGCAACCAGAAATTAGAAAGATTTTGCAAAACGAACGAACGAGAGAGGAAGAACATCAACAACAAATTTTGTGAGCAG [...]
+	'1190'  ------GTTCTTATGAGAAGAATGGCTCTTAAGAAATTGAAGGTGATACCAAAGGAAGGTTACTTATTACTTTTGGACTTTGATGATGAGGACGATGACATAAAAGTTTCAGAGGAGGCTCTTTCGGAAGTAAAGAGCCCAGCATTTGATAAAAATGAGAATATATCGCCTCAAGCAGAAGCAGATGAAGATATGGGAGATGAAGTAGACAGTATGTTGGATAAATCTGAAGTAAATAATCCAGCAATTGGTAAAGATGAAAATATATCGCCTCAAGTAAAAGGAGATGAAGACATGGGACATGAAGTAGGCAGTATGTTGGATAAATCTGGAGATGACATTTATAAGACGCTTCACATAAAGAGAAAATGGATGGAAACTTATGTCAAAGAATCTTTCAAAGGCAGCAACCAGAAATTAGAAAGATTTTGCAAAACGAACGAACGAGAGAGGAAGAACATCAACAACAAATTTTGTGAGCAG [...]
+	'680'   TACTGTGTTCTTATGAGAAGAATGGCTCTTAAGAAATTGAAGGTGATACCAAAGGAAGGTTACTTATTACTTTTGGACTTTGATGATGAGGACGATGACATAAAAGTTTCAGAGGAGGCTCTTTCGGAAGTAAAGAGCCCAGCATTTGATAAAAATGAGAATATATCGCCTCAAGCAGAAGCAGATGAAGATATGGGAGATGAAGTAGACAGTATGTTGGATAAATCTGAAGTAAATAATCCAGCAATTGGTAAAGATGAAAATATATCGCCTCAAGTAAAAGGAGATGAAGACATGGGACATGAAGTAGGCAGTATGTTGGATAAATCTGGAGATGACATTTATAAGACGCTTCACATAAAGAGAAAATGGATGGTAACTTATGTCAAAGAATCTTTCAAATGCAGCAACCAGAAATTAGAAAGATTTTGCAAAACGAACGAACGAGAGAGGAAGAACATCAACAACAAATTTTGTGAGCAG [...]
+	'941'   TACTGTGTTCTTATGAGAAGAATGGCTCTTAAGAAATTGAAGGTGATACCAAAGGAAGGTTACTTATTACTTTTGGACTTTGATGATGAGGACGATGACATAAAAGTTTCAGAGGAGGCTCTTTCGGAAGTAAAGAGCCCAGCATTTGATAAAAATGAGAATATATCGCCTCAAGCAGAAGCAGATGAAGATATGGGAGATGAAGTAGACAGTATGTTGGATAAATCTGAAGTAAATAATCCAGCAATTGGTAAAGATGAAAATATATCGCCTCAAGTAAAAGGAGTTGAAGACATGGGACATGAAGTAGGCAGTATGTTGGATAAATCTGGAGATGACATTTATAAGACGCTTCACATAAAGAGAAAATGGATGGAAACTTATGTCAAAGAATCTTTCAAATGCAGCAACCAGAAATTAGAAAGATTTTGCAAAACGAACGAACGAGAGAGGAAGAACATCAACAACAAATTTTGTGAGCAG [...]
+	'650'   TACTGTGTTCTTATGAGAAGAATGGCTCTTAAGAAATTGAAGGTGATACCAAAGGAAGGTTACTTATTACTTTTGGACTTTGATGATGAGGACGATGACATAAAAGTTTCAGAGGAGGCTCTTTCGGAAGTAAAGAGCCCAGCATTTGATAAAAATGAGAATATATCGCCTCAAGCAGAAGCAGATGAAGATATGGGAGATGAAGTAGACAGTATGTTGGATAAATCTGAAGTAAATAATCCAGCAATTGGTAAAGATGAAAATATATCGCCTCAAGTAAAAGGAGATGAAGACATGGGACATGAAGTAGGCAGTATGTTGGATAAATCTGGAGATGACATTTATAAGACGCTTCACATAAAGAGAAAATGGATGGAAACTTATGTCAAAGAATCTTTCAAATGCAGCAACCAGAAATTAGAAAGATTTTGCAAAACGAACGAACGAGAGAGGAAGAACATCAACAACAAATTTTGTGAGCAG [...]
+	'970'   TACTGTGTTCTTATGAGAAGAATGGCTCTTAAGAAATTGAAGGTGATACCAAAGGAAGGTTACTTATTACTTTTGGACTTTGATGATGAGGACGATGACATAAAAGTTTCAGAGGAGGCTCTTTCGGAAGTAAAGAGCCCAGCATTTGATAAAAATGAGAATATATCGCCTCAAGCAGAAGCAGATGAAGATATGGGAGATGAAGTAGACAGTATGTTGGATAAATCTGAAGTAAATAATCCAGCAATTGGTAAAGATGAAAATATATCGCCTCAAGTAAAAGGAGATGAAGACATGGGACATGAAGTAGGCAGTATGTTGGATAAATCTGGAGATGACATTTATAAGACGCTTCACATAAAGAGAAAATGGATGGAAACTTATGTCAAAGAATCTTTCAAATGCAGCAACCAGAAATTAGAAAGATTTTGCAAAACGAACGAACGAGAGAGGAAGAACATCAACAACAAATTTTGTGAGCAG [...]
+	'700'   ------GTTCTTATGAGAAGAATGGCTCTTAAGAAATTGAAGGTGATACCAAAGGAAGGTTACTTATTACTTTTGGACTTTGATGATGAGGACGATGACATAAAAGTTTCAGAGGAGGCTCTTTCGGAAGTAAAGAGCCCAGCATTTGATAAAAATGAGAATATATCGCCTCAAGCAGAAGCAGATGAAGATATGGGAGATGAAGTAGACAGTATGTTGGATAAATCTGAAGTAAATAATCCAGCAATTGGTAAAGATGAAAATATATCGCCTCAAGTAAAAGGAGATGAAGACATGGGACATGAAGTAGGCAGTATGTTGGATAAATCTGGAGATGACATTTATAAGACGCTTCACATAAAGAGAAAATGGATGGAAACTTATGTCAAAGAATCTTTCAAATGCAGCAACCAGAAATTAGAAAGATTTTGCAAAACGAACGAACGAGAGAGGAAGAACATCAACAACAAATTTTGTGAGCAG [...]
+	'431'   ------GTTCTTATGAGAAGAATGGCTCTTAAGAAATTGAAGGTGATACCAAAGGAAGGTTACTTATTACTTTTGGACTTTGATGATGAGGACGATGACATAAAAGTTTCAGAGGAGGCTCTTTCGGAAGTAAAGAGCCCAGCATTTGATAAAAATGAGAATATATCGCCTCAAGCAGAAGCAGATGAAGATATGGGAGATGAAGTAGACAGTATGTTGGATAAATCTGAAGTAAATTATCCAGCAATTGGTAAAGATGAAAATATATCGCCTCAAGTAAAAGGAAATGAAGACATGGGACATGAAGTAGGCAGTATGTTAGATAAATCTGGAGATGACATTTATAAGACGCTTCACATAAAGAGAAAATGGATGGAAACTTATGTCAAAGAATCTTTCAAAGGCAGCAACCAGAAATTAGAAAGATTTTGCAAAACGAACGAACGAGAGAGGAAGAACATCAACAACAAATTTTGTGAGCAG [...]
+	'1250'  ------GTTCTTATGAGAAGAATGGCTCTTAAGAAATTGAAGGTGATACCAAAGGAAGGTTACTTATTACTTTTGGACTTTGATGATGAGGACGATGACATAAAAGTTTCAGAGGAGGCTCTTTCGGAAGTAAAGAGCCCAGCATTTGATAAAAATGAGAATATATCGCCTCAAGCAGAAGCAGATGAAGATATGGGAGATGAAGTAGACAGTATGTTGGATAAATCTGAAGTAAATTATCCAGCAATTGGTAAAGATGAAAATATATCGCCTCAAGTAAAAGGAGATGAAGACATGGGACATGAAGTAGGCAGTATGTTGGATAAATCTGGAGATGACATTTATAAGACGCTTCACATAAAGAGAAAATGGATGGAAACTTATGTCAAAGAATCTTTCAAAGGCAGCAACCAGAAATTAGAAAGATTTTGCAAAACGAACGAACGAGAGAGGAAGAACATCAACAACAAATTTTGTGAGCAG [...]
+	'1210'  ------GTTCTTATGAGAAGAATGGCTCTTAAGAAATTGAAGGTGATACCAAAGGAAGGTTACTTATTACTTTTGGACTTTGATGATGAGGACGATGACATAAAAGTTTCAGAGGAGGCTCTTTCGGAAGTAAAGAGCCCAGCATTTGATAAAAATGAGAATATATCGCCTCAAGCAGAAGCAGATGAAGATATGGGAGATGAAGTAGACAGTATGTTGGATAAATCTGAAGTAAATAATCCAGCAATTGGTAAAGATGAAAATATATCGCCTCAAGTAAAAGGAGATGAAGACATGGGACATGAAGTAGGCAGTATGTTGGATAAATCTGGAGATGACATTTATAAGACGCTTCACATAAAGAGAAAATGGATGGAAACTTATGTCAAAGAATCTTTCAAAGGCAGCAACCAGAAATTAGAAAGATTTTGCAAAACGAACGAACGAGAGAGGAAGAACATCAACAACAAATTTTGTGAGCAG [...]
+	'770'   ------GTTCTTATGAGAAGAATGGCTCTTAAGAAATTGAAGGTGATACCAAAGGAAGGTTACTTATTACTTTTGGACTTTGATGATGAGGACGATGACATAAAAGTTTCAGAGGAGGCTCTTTTGGAAGTAAAGAGCCCAGCATTTGATAAAAATGAGAATATATCGCCTCAAGCAGAAGCAGATGAAGATATGGGAGATGAAGTAGACAGTATGTTGGATAAATCTGAAGTAAATAATCCAGCAATTGGTAAAGATGAAAATATATCGCCTCAAGTAAAAGGAGATGAAGACATGGGACATGAAGTAGTCAGTATGTTGGATAAATCTGGAGATGACATTTATAAGACGCTTCACATAAAGAGAAAATGGATGGAAACTTATGTCAAAGAATCTTTCAAAGGCAGCAACCAGAAATTAGAAAGATTTTGCAAAACGAACGAACGAGAGAGGAAGAACATCAACAACAAATTTTGTGAGCAG [...]
+	'720'   ------GTTCTTATGAGAAGAATGGCTCTTAAGAAATTGAAGGTGATACCAAAGGAAGGTTACTTATTACTTTTGGACTTTGATGATGAGGACGATGACATAAAAGTTTCAGAGGAGGCTCTTTCGGAAGTAAAGAGCCCAGCATTTGATAAAAATGAGAATATATCGCCTCAAGCAGAAGCAGATGAAGATATGGGAGATGAAGTAGACAGTATGTTGGATAAATCTGAAGTAAATAATCCAGCAATTGGTAAAGATGAAAATATATCGCCTCAAGTAAAAGGAGATGAAGACATGGGACATGAAGTAGGCAGTATGTTGGATAAATCTGGAGATGACATTTATAAGACGCTTCACATAAAGAGAAAATGGATGGAAACTTATGTCAAAGAATCTTTCAAAGGCAGCAACCAGAAATTAGAAAGATTTTGCAAAACGAACGAACGAGAGAGGAAGAACATCAACAACAAATTTTGTGAGCAG [...]
+	'750'   ------GTTCTTATGAGAAGAATGGCTCTTAAGAAATTGAAGGTGATACCAAAGGAAGGTTACTTATTACTTTTGGACTTTGATGATGAGGACGATGACATAAAAGTTTCAGAGGAGGCTCTTTCGGAAGTAAAGAGCCCAGCATTTGATAAAAATGAGAATATATCGCCTCAAGCAGAAGCAGATGAAGATATGGGAGATGAAGTAGACAGTATGTTGGATAAATCTGAAGTAAATAATCCAGCAATTGGTAAAGATGAAAATATATCGCCTCAAGTAAAAGGAGATGAAGACATTGGACATGAAGTAGGCAGTATGTTGGATAAATCTGGAGATGACATTTATAAGACGCTTCACATAAAGAGAAAATGGATGGAAACTTATGTCAAAGAATCTTTCAAAGGCAGCAACCAGAAATTAGAAAGATTTTGCAAAACGAACGAACGAGAGAGGAAGAACATCAACAACAAATTTTGTGAGCAG [...]
+	'1070'  ------GTTCTTATGAGAAGAATGGCTCTTAAGATATTGAAGGTGATACCAAAGGAAGGTTACTTATTACTTTTGGACTTTGATGATGAGGACGATGACATAAAAGTTTCAGAGGAGGCTCTTTCGGAAGTAAAGAGCCCAGCATTTGATAAAAATGAGAATATATCGCCTCAAGCAGAAGCAGATGAAGATATGGGAGATGAAGTAGACAGTATGTTGGATAAATCTGAAGTAAATAATCCAGCAATTGGTAAAGATGAAAATATATCGCCTCAAGTAAAAGGAGATGAAGACATGGGACATGAAGTAGTCAGTATGTTGGATAAATCTGGAGATGACATTTATAAGACGCTTCACATAAAGAGAAAATGGATGGAAACTTATGTCAAAGAATCTTTCAAAGGCAGCAACCAGAAATTAGAAAGATTTTGCAAAACGAACGAA--------------------------------------- [...]
+	'811'   ------GTTCTTATGAGAAGAATGGCTCTTAAGAAATTGAAGGTGATACCAAAGGAAGGTTACTTATTACTTTTGGACTTTGATGATGAGGATGATGACATAAAAGTTTCAGAGGAGGCTCTTTCGGAAGTAAAGAGCCCAGCGTTTGATAAAAATGAGAATATATCGCCTCAAGCAGAAGCAGATGAAGATATGGGAGATGAAGTAGACAGTATGTTGGATAAATCTGAAGTAAATAACCCAGCAATTGGTAAAGATGGATATATATCGCCTCAAGTAAAAGGAGATGAAGACATGGGACATGAAGTAGGCAGTATGTTGGATAAATCTGGAGATGACATTTATAAGACGCTTCACATAAAGAGAAAATGGATGGAAACTTATGTCAAAGAATCTTTCAAAGGCAGCAACCAGAAATTAGAAAGATTTTGCAAAACGAACGAACGAGAAGGAAGAACATCAACAACAAATTTTGTGAGCAGT [...]
+	'1220'  ------ATTCTTATGAGAAGAATGGCTCTTAAGAAATTGAAGGTGATACCAAAGGAAGGTTACTTATTACTTTTGGACTTTGATGATGAGGACGATGACATAAAAGTTTCAGAGGAGGCTCTTTCGGAAGTAAAGAGCCCAGCATTTGATAAAAATGAGAATATATCGCCTCAAGCAGAAGCAGATGAAGATATGGGAGATGAAGTAGACAGTATGTTGGATAAATCTGAAGTAAATAATCCAGCAATTGGTAAAGATGAAAATATATCGCCTCAAGTAAAAGGAGATGAAGACATGGGACATGAAGTAGGCAGTATGTTGGATAAATCTGGAGATGACATTTATAAGACGCTTCACATAAAGAGAAAATGGATGGAAACTTATGTCAAAGAATCTTTCAAAGGCAGCAACCAGAAATTAGAAAGATTTTGCAAAACGAACGAA--------------------------------------- [...]
+	'401'   ------GTTCTTATGAGAAGAATGGCTCTTAAGAAATTGAAGGTGATACCAAAGGAAGGTTACTTATTACTTTTGGACTTTGATGATGAGGACGATGACATAAAAGTTTCAGAGGAGGCTCTTTCGGAAGTAAAGAGCCCAGCATTTGATAAAAATGAGAATATATCGCCTCAAGCAGAAGCAGATGAAGATATGGGAGATGAAGTAGACAGTATGTTGGATAAATCTGAAGTAAATAATCCAGCAATTGGTAAAGATGAAAATATATCGCCTCAAGTAAAAGGAGATGAAGACATGGGACATGAAGTAGGCAGTATGTTGGATAAATCTGGAGATGACATTTATAAGACGCTTCACATAAAGAGAAAATGGATGGAAACTTATGTCAAAGAATCTTTCAAAGGCAGCAAC------------------------------------------------------------------------ [...]
+	'181'   ------GTTCTTATGAGAAGAATGGCTCTTAAGAAATTGAAGGTGATACCAAAGGAAGGTTACTTATTACTTTTGGACTTTGATGATGAGGACGATGACATAAAAGTTTCAGAGGAGGCTCTTTCGGAAGTAAAGAGCCCAGCATTTGATAAAAATGAGAATATATCGCCTCAAGCAGAAGCAGATGAAGATATGGGAGATGAAGTAGACAGTATGTTGGATAAATCTGAAGTAAATAATCCAGCAATTGGTAAAGATGAAAATATATCGCCTCAAGTAAAAGGAGAT--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- [...]
+	'1180'  ------GTTCTTATGAGAAGAATGGCTCTTAAGAAATTGAAGGTGATACCAAAGGAAGGTTACTTATTACTTTTGGACTTTGATGATGAGGACGATGACATAAAAGTTTCAGAGGAGGCTCTTTCGGAAGTAAAGAGCCCAGCATTTGATAAAAATGAGAATATATCGCCTCAAGCAGAAGCAGATGAAGATATGGGAGATGAAGTAGACAGTATGTTGGATAAATCTGAAGTAAATAATCCAGCAATTGGTAAAGATGAAAATATATCGCCTCAAGTAAAAGGAGATGAAGACATGGGACATGAAGTAGGCAGTATGTTGGATAAATCTGGAGGTATGTGTTTTAGAAATATTTCCCTTATGAAATGTTCAATTGAATTTGTTCTGAGTGTTCATTTTCAT---ATTGGTATGAAATGTGCCTGCTTTTGTTACTGTGCTTTACAGGAAGAACAT---------------------CAACAA [...]
+END;
+
+BEGIN HYPHY;
+
+
+global CT=2.470616666028472;
+global GT=0.7893015924606257;
+global CG=0.8495093591315428;
+global AC=0.4956658101979723;
+global AT=0.51292963890532;
+global RELAX.reference.aux_freq_0=0.9599701794455813;
+RELAX.reference.aux_freq_0:<1;
+global RELAX.reference.aux_freq_1=0.2957919423919824;
+RELAX.reference.aux_freq_1:<1;
+global RELAX.reference.omega_0=0.1298864281494123;
+RELAX.reference.omega_0:<1;
+global RELAX.reference.omega_1=0.1106140465901805;
+RELAX.reference.omega_1:>0.0001;
+RELAX.reference.omega_1:<1;
+global RELAX.reference.omega_2=68.05520944414918;
+RELAX.reference.omega_2:>1;
+global RELAX.test.aux_freq_0=0.9089324901425473;
+RELAX.test.aux_freq_0:<1;
+global RELAX.test.omega_2=34.35722701973235;
+RELAX.test.omega_2:>1;
+global RELAX.test.omega_1=0.2995500841627319;
+RELAX.test.omega_1:>0.0001;
+RELAX.test.omega_1:<1;
+global RELAX.test.aux_freq_1=0.0996461247469954;
+RELAX.test.aux_freq_1:<1;
+global RELAX.test.omega_0=0.2934301501313333;
+RELAX.test.omega_0:<1;
+global RELAX.K:=2.030710072857724;
+Q_RELAX.test_1={61,61};
+Q_RELAX.test_1[0][1]:=AC*t*Min(1000,RELAX.test.omega_0^local_k)*0.1264560133035801;
+Q_RELAX.test_1[0][2]:=t*0.2406378906553946;
+Q_RELAX.test_1[0][3]:=AT*t*Min(1000,RELAX.test.omega_0^local_k)*0.2504957133922061;
+Q_RELAX.test_1[0][4]:=AC*t*Min(1000,RELAX.test.omega_0^local_k)*0.1351200521140052;
+Q_RELAX.test_1[0][8]:=t*Min(1000,RELAX.test.omega_0^local_k)*0.1344351325741675;
+Q_RELAX.test_1[0][12]:=AT*t*Min(1000,RELAX.test.omega_0^local_k)*0.2296926126195792;
+Q_RELAX.test_1[0][16]:=AC*t*Min(1000,RELAX.test.omega_0^local_k)*0.1214054057357627;
+Q_RELAX.test_1[0][32]:=t*Min(1000,RELAX.test.omega_0^local_k)*0.3053650319994416;
+Q_RELAX.test_1[1][0]:=AC*t*Min(1000,RELAX.test.omega_0^local_k)*0.3824103826488193;
+Q_RELAX.test_1[1][2]:=CG*t*Min(1000,RELAX.test.omega_0^local_k)*0.2406378906553946;
+Q_RELAX.test_1[1][3]:=CT*t*0.2504957133922061;
+Q_RELAX.test_1[1][5]:=AC*t*Min(1000,RELAX.test.omega_0^local_k)*0.1351200521140052;
+Q_RELAX.test_1[1][9]:=t*Min(1000,RELAX.test.omega_0^local_k)*0.1344351325741675;
+Q_RELAX.test_1[1][13]:=AT*t*Min(1000,RELAX.test.omega_0^local_k)*0.2296926126195792;
+Q_RELAX.test_1[1][17]:=AC*t*Min(1000,RELAX.test.omega_0^local_k)*0.1214054057357627;
+Q_RELAX.test_1[1][33]:=t*Min(1000,RELAX.test.omega_0^local_k)*0.3053650319994416;
+Q_RELAX.test_1[1][48]:=AT*t*Min(1000,RELAX.test.omega_0^local_k)*0.250994522453953;
+Q_RELAX.test_1[2][0]:=t*0.3824103826488193;
+Q_RELAX.test_1[2][1]:=CG*t*Min(1000,RELAX.test.omega_0^local_k)*0.1264560133035801;
+Q_RELAX.test_1[2][3]:=GT*t*Min(1000,RELAX.test.omega_0^local_k)*0.2504957133922061;
+Q_RELAX.test_1[2][6]:=AC*t*Min(1000,RELAX.test.omega_0^local_k)*0.1351200521140052;
+Q_RELAX.test_1[2][10]:=t*Min(1000,RELAX.test.omega_0^local_k)*0.1344351325741675;
+Q_RELAX.test_1[2][14]:=AT*t*Min(1000,RELAX.test.omega_0^local_k)*0.2296926126195792;
+Q_RELAX.test_1[2][18]:=AC*t*Min(1000,RELAX.test.omega_0^local_k)*0.1214054057357627;
+Q_RELAX.test_1[2][34]:=t*Min(1000,RELAX.test.omega_0^local_k)*0.3053650319994416;
+Q_RELAX.test_1[3][0]:=AT*t*Min(1000,RELAX.test.omega_0^local_k)*0.3824103826488193;
+Q_RELAX.test_1[3][1]:=CT*t*0.1264560133035801;
+Q_RELAX.test_1[3][2]:=GT*t*Min(1000,RELAX.test.omega_0^local_k)*0.2406378906553946;
+Q_RELAX.test_1[3][7]:=AC*t*Min(1000,RELAX.test.omega_0^local_k)*0.1351200521140052;
+Q_RELAX.test_1[3][11]:=t*Min(1000,RELAX.test.omega_0^local_k)*0.1344351325741675;
+Q_RELAX.test_1[3][15]:=AT*t*Min(1000,RELAX.test.omega_0^local_k)*0.2296926126195792;
+Q_RELAX.test_1[3][19]:=AC*t*Min(1000,RELAX.test.omega_0^local_k)*0.1214054057357627;
+Q_RELAX.test_1[3][35]:=t*Min(1000,RELAX.test.omega_0^local_k)*0.3053650319994416;
+Q_RELAX.test_1[3][49]:=AT*t*Min(1000,RELAX.test.omega_0^local_k)*0.250994522453953;
+Q_RELAX.test_1[4][0]:=AC*t*Min(1000,RELAX.test.omega_0^local_k)*0.5007522026922482;
+Q_RELAX.test_1[4][5]:=AC*t*0.1264560133035801;
+Q_RELAX.test_1[4][6]:=t*0.2406378906553946;
+Q_RELAX.test_1[4][7]:=AT*t*0.2504957133922061;
+Q_RELAX.test_1[4][8]:=CG*t*Min(1000,RELAX.test.omega_0^local_k)*0.1344351325741675;
+Q_RELAX.test_1[4][12]:=CT*t*Min(1000,RELAX.test.omega_0^local_k)*0.2296926126195792;
+Q_RELAX.test_1[4][20]:=AC*t*Min(1000,RELAX.test.omega_0^local_k)*0.1214054057357627;
+Q_RELAX.test_1[4][36]:=t*Min(1000,RELAX.test.omega_0^local_k)*0.3053650319994416;
+Q_RELAX.test_1[4][50]:=AT*t*Min(1000,RELAX.test.omega_0^local_k)*0.250994522453953;
+Q_RELAX.test_1[5][1]:=AC*t*Min(1000,RELAX.test.omega_0^local_k)*0.5007522026922482;
+Q_RELAX.test_1[5][4]:=AC*t*0.3824103826488193;
+Q_RELAX.test_1[5][6]:=CG*t*0.2406378906553946;
+Q_RELAX.test_1[5][7]:=CT*t*0.2504957133922061;
+Q_RELAX.test_1[5][9]:=CG*t*Min(1000,RELAX.test.omega_0^local_k)*0.1344351325741675;
+Q_RELAX.test_1[5][13]:=CT*t*Min(1000,RELAX.test.omega_0^local_k)*0.2296926126195792;
+Q_RELAX.test_1[5][21]:=AC*t*Min(1000,RELAX.test.omega_0^local_k)*0.1214054057357627;
+Q_RELAX.test_1[5][37]:=t*Min(1000,RELAX.test.omega_0^local_k)*0.3053650319994416;
+Q_RELAX.test_1[5][51]:=AT*t*Min(1000,RELAX.test.omega_0^local_k)*0.250994522453953;
+Q_RELAX.test_1[6][2]:=AC*t*Min(1000,RELAX.test.omega_0^local_k)*0.5007522026922482;
+Q_RELAX.test_1[6][4]:=t*0.3824103826488193;
+Q_RELAX.test_1[6][5]:=CG*t*0.1264560133035801;
+Q_RELAX.test_1[6][7]:=GT*t*0.2504957133922061;
+Q_RELAX.test_1[6][10]:=CG*t*Min(1000,RELAX.test.omega_0^local_k)*0.1344351325741675;
+Q_RELAX.test_1[6][14]:=CT*t*Min(1000,RELAX.test.omega_0^local_k)*0.2296926126195792;
+Q_RELAX.test_1[6][22]:=AC*t*Min(1000,RELAX.test.omega_0^local_k)*0.1214054057357627;
+Q_RELAX.test_1[6][38]:=t*Min(1000,RELAX.test.omega_0^local_k)*0.3053650319994416;
+Q_RELAX.test_1[6][52]:=AT*t*Min(1000,RELAX.test.omega_0^local_k)*0.250994522453953;
+Q_RELAX.test_1[7][3]:=AC*t*Min(1000,RELAX.test.omega_0^local_k)*0.5007522026922482;
+Q_RELAX.test_1[7][4]:=AT*t*0.3824103826488193;
+Q_RELAX.test_1[7][5]:=CT*t*0.1264560133035801;
+Q_RELAX.test_1[7][6]:=GT*t*0.2406378906553946;
+Q_RELAX.test_1[7][11]:=CG*t*Min(1000,RELAX.test.omega_0^local_k)*0.1344351325741675;
+Q_RELAX.test_1[7][15]:=CT*t*Min(1000,RELAX.test.omega_0^local_k)*0.2296926126195792;
+Q_RELAX.test_1[7][23]:=AC*t*Min(1000,RELAX.test.omega_0^local_k)*0.1214054057357627;
+Q_RELAX.test_1[7][39]:=t*Min(1000,RELAX.test.omega_0^local_k)*0.3053650319994416;
+Q_RELAX.test_1[7][53]:=AT*t*Min(1000,RELAX.test.omega_0^local_k)*0.250994522453953;
+Q_RELAX.test_1[8][0]:=t*Min(1000,RELAX.test.omega_0^local_k)*0.5007522026922482;
+Q_RELAX.test_1[8][4]:=CG*t*Min(1000,RELAX.test.omega_0^local_k)*0.1351200521140052;
+Q_RELAX.test_1[8][9]:=AC*t*Min(1000,RELAX.test.omega_0^local_k)*0.1264560133035801;
+Q_RELAX.test_1[8][10]:=t*0.2406378906553946;
+Q_RELAX.test_1[8][11]:=AT*t*Min(1000,RELAX.test.omega_0^local_k)*0.2504957133922061;
+Q_RELAX.test_1[8][12]:=GT*t*Min(1000,RELAX.test.omega_0^local_k)*0.2296926126195792;
+Q_RELAX.test_1[8][24]:=AC*t*0.1214054057357627;
+Q_RELAX.test_1[8][40]:=t*Min(1000,RELAX.test.omega_0^local_k)*0.3053650319994416;
+Q_RELAX.test_1[9][1]:=t*Min(1000,RELAX.test.omega_0^local_k)*0.5007522026922482;
+Q_RELAX.test_1[9][5]:=CG*t*Min(1000,RELAX.test.omega_0^local_k)*0.1351200521140052;
+Q_RELAX.test_1[9][8]:=AC*t*Min(1000,RELAX.test.omega_0^local_k)*0.3824103826488193;
+Q_RELAX.test_1[9][10]:=CG*t*Min(1000,RELAX.test.omega_0^local_k)*0.2406378906553946;
+Q_RELAX.test_1[9][11]:=CT*t*0.2504957133922061;
+Q_RELAX.test_1[9][13]:=GT*t*Min(1000,RELAX.test.omega_0^local_k)*0.2296926126195792;
+Q_RELAX.test_1[9][25]:=AC*t*Min(1000,RELAX.test.omega_0^local_k)*0.1214054057357627;
+Q_RELAX.test_1[9][41]:=t*Min(1000,RELAX.test.omega_0^local_k)*0.3053650319994416;
+Q_RELAX.test_1[9][54]:=AT*t*Min(1000,RELAX.test.omega_0^local_k)*0.250994522453953;
+Q_RELAX.test_1[10][2]:=t*Min(1000,RELAX.test.omega_0^local_k)*0.5007522026922482;
+Q_RELAX.test_1[10][6]:=CG*t*Min(1000,RELAX.test.omega_0^local_k)*0.1351200521140052;
+Q_RELAX.test_1[10][8]:=t*0.3824103826488193;
+Q_RELAX.test_1[10][9]:=CG*t*Min(1000,RELAX.test.omega_0^local_k)*0.1264560133035801;
+Q_RELAX.test_1[10][11]:=GT*t*Min(1000,RELAX.test.omega_0^local_k)*0.2504957133922061;
+Q_RELAX.test_1[10][14]:=GT*t*Min(1000,RELAX.test.omega_0^local_k)*0.2296926126195792;
+Q_RELAX.test_1[10][26]:=AC*t*0.1214054057357627;
+Q_RELAX.test_1[10][42]:=t*Min(1000,RELAX.test.omega_0^local_k)*0.3053650319994416;
+Q_RELAX.test_1[10][55]:=AT*t*Min(1000,RELAX.test.omega_0^local_k)*0.250994522453953;
+Q_RELAX.test_1[11][3]:=t*Min(1000,RELAX.test.omega_0^local_k)*0.5007522026922482;
+Q_RELAX.test_1[11][7]:=CG*t*Min(1000,RELAX.test.omega_0^local_k)*0.1351200521140052;
+Q_RELAX.test_1[11][8]:=AT*t*Min(1000,RELAX.test.omega_0^local_k)*0.3824103826488193;
+Q_RELAX.test_1[11][9]:=CT*t*0.1264560133035801;
+Q_RELAX.test_1[11][10]:=GT*t*Min(1000,RELAX.test.omega_0^local_k)*0.2406378906553946;
+Q_RELAX.test_1[11][15]:=GT*t*Min(1000,RELAX.test.omega_0^local_k)*0.2296926126195792;
+Q_RELAX.test_1[11][27]:=AC*t*Min(1000,RELAX.test.omega_0^local_k)*0.1214054057357627;
+Q_RELAX.test_1[11][43]:=t*Min(1000,RELAX.test.omega_0^local_k)*0.3053650319994416;
+Q_RELAX.test_1[11][56]:=AT*t*Min(1000,RELAX.test.omega_0^local_k)*0.250994522453953;
+Q_RELAX.test_1[12][0]:=AT*t*Min(1000,RELAX.test.omega_0^local_k)*0.5007522026922482;
+Q_RELAX.test_1[12][4]:=CT*t*Min(1000,RELAX.test.omega_0^local_k)*0.1351200521140052;
+Q_RELAX.test_1[12][8]:=GT*t*Min(1000,RELAX.test.omega_0^local_k)*0.1344351325741675;
+Q_RELAX.test_1[12][13]:=AC*t*0.1264560133035801;
+Q_RELAX.test_1[12][14]:=t*Min(1000,RELAX.test.omega_0^local_k)*0.2406378906553946;
+Q_RELAX.test_1[12][15]:=AT*t*0.2504957133922061;
+Q_RELAX.test_1[12][28]:=AC*t*Min(1000,RELAX.test.omega_0^local_k)*0.1214054057357627;
+Q_RELAX.test_1[12][44]:=t*Min(1000,RELAX.test.omega_0^local_k)*0.3053650319994416;
+Q_RELAX.test_1[12][57]:=AT*t*Min(1000,RELAX.test.omega_0^local_k)*0.250994522453953;
+Q_RELAX.test_1[13][1]:=AT*t*Min(1000,RELAX.test.omega_0^local_k)*0.5007522026922482;
+Q_RELAX.test_1[13][5]:=CT*t*Min(1000,RELAX.test.omega_0^local_k)*0.1351200521140052;
+Q_RELAX.test_1[13][9]:=GT*t*Min(1000,RELAX.test.omega_0^local_k)*0.1344351325741675;
+Q_RELAX.test_1[13][12]:=AC*t*0.3824103826488193;
+Q_RELAX.test_1[13][14]:=CG*t*Min(1000,RELAX.test.omega_0^local_k)*0.2406378906553946;
+Q_RELAX.test_1[13][15]:=CT*t*0.2504957133922061;
+Q_RELAX.test_1[13][29]:=AC*t*Min(1000,RELAX.test.omega_0^local_k)*0.1214054057357627;
+Q_RELAX.test_1[13][45]:=t*Min(1000,RELAX.test.omega_0^local_k)*0.3053650319994416;
+Q_RELAX.test_1[13][58]:=AT*t*Min(1000,RELAX.test.omega_0^local_k)*0.250994522453953;
+Q_RELAX.test_1[14][2]:=AT*t*Min(1000,RELAX.test.omega_0^local_k)*0.5007522026922482;
+Q_RELAX.test_1[14][6]:=CT*t*Min(1000,RELAX.test.omega_0^local_k)*0.1351200521140052;
+Q_RELAX.test_1[14][10]:=GT*t*Min(1000,RELAX.test.omega_0^local_k)*0.1344351325741675;
+Q_RELAX.test_1[14][12]:=t*Min(1000,RELAX.test.omega_0^local_k)*0.3824103826488193;
+Q_RELAX.test_1[14][13]:=CG*t*Min(1000,RELAX.test.omega_0^local_k)*0.1264560133035801;
+Q_RELAX.test_1[14][15]:=GT*t*Min(1000,RELAX.test.omega_0^local_k)*0.2504957133922061;
+Q_RELAX.test_1[14][30]:=AC*t*Min(1000,RELAX.test.omega_0^local_k)*0.1214054057357627;
+Q_RELAX.test_1[14][46]:=t*Min(1000,RELAX.test.omega_0^local_k)*0.3053650319994416;
+Q_RELAX.test_1[14][59]:=AT*t*Min(1000,RELAX.test.omega_0^local_k)*0.250994522453953;
+Q_RELAX.test_1[15][3]:=AT*t*Min(1000,RELAX.test.omega_0^local_k)*0.5007522026922482;
+Q_RELAX.test_1[15][7]:=CT*t*Min(1000,RELAX.test.omega_0^local_k)*0.1351200521140052;
+Q_RELAX.test_1[15][11]:=GT*t*Min(1000,RELAX.test.omega_0^local_k)*0.1344351325741675;
+Q_RELAX.test_1[15][12]:=AT*t*0.3824103826488193;
+Q_RELAX.test_1[15][13]:=CT*t*0.1264560133035801;
+Q_RELAX.test_1[15][14]:=GT*t*Min(1000,RELAX.test.omega_0^local_k)*0.2406378906553946;
+Q_RELAX.test_1[15][31]:=AC*t*Min(1000,RELAX.test.omega_0^local_k)*0.1214054057357627;
+Q_RELAX.test_1[15][47]:=t*Min(1000,RELAX.test.omega_0^local_k)*0.3053650319994416;
+Q_RELAX.test_1[15][60]:=AT*t*Min(1000,RELAX.test.omega_0^local_k)*0.250994522453953;
+Q_RELAX.test_1[16][0]:=AC*t*Min(1000,RELAX.test.omega_0^local_k)*0.3222350398108426;
+Q_RELAX.test_1[16][17]:=AC*t*Min(1000,RELAX.test.omega_0^local_k)*0.1264560133035801;
+Q_RELAX.test_1[16][18]:=t*0.2406378906553946;
+Q_RELAX.test_1[16][19]:=AT*t*Min(1000,RELAX.test.omega_0^local_k)*0.2504957133922061;
+Q_RELAX.test_1[16][20]:=AC*t*Min(1000,RELAX.test.omega_0^local_k)*0.1351200521140052;
+Q_RELAX.test_1[16][24]:=t*Min(1000,RELAX.test.omega_0^local_k)*0.1344351325741675;
+Q_RELAX.test_1[16][28]:=AT*t*Min(1000,RELAX.test.omega_0^local_k)*0.2296926126195792;
+Q_RELAX.test_1[16][32]:=CG*t*Min(1000,RELAX.test.omega_0^local_k)*0.3053650319994416;
+Q_RELAX.test_1[17][1]:=AC*t*Min(1000,RELAX.test.omega_0^local_k)*0.3222350398108426;
+Q_RELAX.test_1[17][16]:=AC*t*Min(1000,RELAX.test.omega_0^local_k)*0.3824103826488193;
+Q_RELAX.test_1[17][18]:=CG*t*Min(1000,RELAX.test.omega_0^local_k)*0.2406378906553946;
+Q_RELAX.test_1[17][19]:=CT*t*0.2504957133922061;
+Q_RELAX.test_1[17][21]:=AC*t*Min(1000,RELAX.test.omega_0^local_k)*0.1351200521140052;
+Q_RELAX.test_1[17][25]:=t*Min(1000,RELAX.test.omega_0^local_k)*0.1344351325741675;
+Q_RELAX.test_1[17][29]:=AT*t*Min(1000,RELAX.test.omega_0^local_k)*0.2296926126195792;
+Q_RELAX.test_1[17][33]:=CG*t*Min(1000,RELAX.test.omega_0^local_k)*0.3053650319994416;
+Q_RELAX.test_1[17][48]:=CT*t*Min(1000,RELAX.test.omega_0^local_k)*0.250994522453953;
+Q_RELAX.test_1[18][2]:=AC*t*Min(1000,RELAX.test.omega_0^local_k)*0.3222350398108426;
+Q_RELAX.test_1[18][16]:=t*0.3824103826488193;
+Q_RELAX.test_1[18][17]:=CG*t*Min(1000,RELAX.test.omega_0^local_k)*0.1264560133035801;
+Q_RELAX.test_1[18][19]:=GT*t*Min(1000,RELAX.test.omega_0^local_k)*0.2504957133922061;
+Q_RELAX.test_1[18][22]:=AC*t*Min(1000,RELAX.test.omega_0^local_k)*0.1351200521140052;
+Q_RELAX.test_1[18][26]:=t*Min(1000,RELAX.test.omega_0^local_k)*0.1344351325741675;
+Q_RELAX.test_1[18][30]:=AT*t*Min(1000,RELAX.test.omega_0^local_k)*0.2296926126195792;
+Q_RELAX.test_1[18][34]:=CG*t*Min(1000,RELAX.test.omega_0^local_k)*0.3053650319994416;
+Q_RELAX.test_1[19][3]:=AC*t*Min(1000,RELAX.test.omega_0^local_k)*0.3222350398108426;
+Q_RELAX.test_1[19][16]:=AT*t*Min(1000,RELAX.test.omega_0^local_k)*0.3824103826488193;
+Q_RELAX.test_1[19][17]:=CT*t*0.1264560133035801;
+Q_RELAX.test_1[19][18]:=GT*t*Min(1000,RELAX.test.omega_0^local_k)*0.2406378906553946;
+Q_RELAX.test_1[19][23]:=AC*t*Min(1000,RELAX.test.omega_0^local_k)*0.1351200521140052;
+Q_RELAX.test_1[19][27]:=t*Min(1000,RELAX.test.omega_0^local_k)*0.1344351325741675;
+Q_RELAX.test_1[19][31]:=AT*t*Min(1000,RELAX.test.omega_0^local_k)*0.2296926126195792;
+Q_RELAX.test_1[19][35]:=CG*t*Min(1000,RELAX.test.omega_0^local_k)*0.3053650319994416;
+Q_RELAX.test_1[19][49]:=CT*t*Min(1000,RELAX.test.omega_0^local_k)*0.250994522453953;
+Q_RELAX.test_1[20][4]:=AC*t*Min(1000,RELAX.test.omega_0^local_k)*0.3222350398108426;
+Q_RELAX.test_1[20][16]:=AC*t*Min(1000,RELAX.test.omega_0^local_k)*0.5007522026922482;
+Q_RELAX.test_1[20][21]:=AC*t*0.1264560133035801;
+Q_RELAX.test_1[20][22]:=t*0.2406378906553946;
+Q_RELAX.test_1[20][23]:=AT*t*0.2504957133922061;
+Q_RELAX.test_1[20][24]:=CG*t*Min(1000,RELAX.test.omega_0^local_k)*0.1344351325741675;
+Q_RELAX.test_1[20][28]:=CT*t*Min(1000,RELAX.test.omega_0^local_k)*0.2296926126195792;
+Q_RELAX.test_1[20][36]:=CG*t*Min(1000,RELAX.test.omega_0^local_k)*0.3053650319994416;
+Q_RELAX.test_1[20][50]:=CT*t*Min(1000,RELAX.test.omega_0^local_k)*0.250994522453953;
+Q_RELAX.test_1[21][5]:=AC*t*Min(1000,RELAX.test.omega_0^local_k)*0.3222350398108426;
+Q_RELAX.test_1[21][17]:=AC*t*Min(1000,RELAX.test.omega_0^local_k)*0.5007522026922482;
+Q_RELAX.test_1[21][20]:=AC*t*0.3824103826488193;
+Q_RELAX.test_1[21][22]:=CG*t*0.2406378906553946;
+Q_RELAX.test_1[21][23]:=CT*t*0.2504957133922061;
+Q_RELAX.test_1[21][25]:=CG*t*Min(1000,RELAX.test.omega_0^local_k)*0.1344351325741675;
+Q_RELAX.test_1[21][29]:=CT*t*Min(1000,RELAX.test.omega_0^local_k)*0.2296926126195792;
+Q_RELAX.test_1[21][37]:=CG*t*Min(1000,RELAX.test.omega_0^local_k)*0.3053650319994416;
+Q_RELAX.test_1[21][51]:=CT*t*Min(1000,RELAX.test.omega_0^local_k)*0.250994522453953;
+Q_RELAX.test_1[22][6]:=AC*t*Min(1000,RELAX.test.omega_0^local_k)*0.3222350398108426;
+Q_RELAX.test_1[22][18]:=AC*t*Min(1000,RELAX.test.omega_0^local_k)*0.5007522026922482;
+Q_RELAX.test_1[22][20]:=t*0.3824103826488193;
+Q_RELAX.test_1[22][21]:=CG*t*0.1264560133035801;
+Q_RELAX.test_1[22][23]:=GT*t*0.2504957133922061;
+Q_RELAX.test_1[22][26]:=CG*t*Min(1000,RELAX.test.omega_0^local_k)*0.1344351325741675;
+Q_RELAX.test_1[22][30]:=CT*t*Min(1000,RELAX.test.omega_0^local_k)*0.2296926126195792;
+Q_RELAX.test_1[22][38]:=CG*t*Min(1000,RELAX.test.omega_0^local_k)*0.3053650319994416;
+Q_RELAX.test_1[22][52]:=CT*t*Min(1000,RELAX.test.omega_0^local_k)*0.250994522453953;
+Q_RELAX.test_1[23][7]:=AC*t*Min(1000,RELAX.test.omega_0^local_k)*0.3222350398108426;
+Q_RELAX.test_1[23][19]:=AC*t*Min(1000,RELAX.test.omega_0^local_k)*0.5007522026922482;
+Q_RELAX.test_1[23][20]:=AT*t*0.3824103826488193;
+Q_RELAX.test_1[23][21]:=CT*t*0.1264560133035801;
+Q_RELAX.test_1[23][22]:=GT*t*0.2406378906553946;
+Q_RELAX.test_1[23][27]:=CG*t*Min(1000,RELAX.test.omega_0^local_k)*0.1344351325741675;
+Q_RELAX.test_1[23][31]:=CT*t*Min(1000,RELAX.test.omega_0^local_k)*0.2296926126195792;
+Q_RELAX.test_1[23][39]:=CG*t*Min(1000,RELAX.test.omega_0^local_k)*0.3053650319994416;
+Q_RELAX.test_1[23][53]:=CT*t*Min(1000,RELAX.test.omega_0^local_k)*0.250994522453953;
+Q_RELAX.test_1[24][8]:=AC*t*0.3222350398108426;
+Q_RELAX.test_1[24][16]:=t*Min(1000,RELAX.test.omega_0^local_k)*0.5007522026922482;
+Q_RELAX.test_1[24][20]:=CG*t*Min(1000,RELAX.test.omega_0^local_k)*0.1351200521140052;
+Q_RELAX.test_1[24][25]:=AC*t*0.1264560133035801;
+Q_RELAX.test_1[24][26]:=t*0.2406378906553946;
+Q_RELAX.test_1[24][27]:=AT*t*0.2504957133922061;
+Q_RELAX.test_1[24][28]:=GT*t*Min(1000,RELAX.test.omega_0^local_k)*0.2296926126195792;
+Q_RELAX.test_1[24][40]:=CG*t*Min(1000,RELAX.test.omega_0^local_k)*0.3053650319994416;
+Q_RELAX.test_1[25][9]:=AC*t*Min(1000,RELAX.test.omega_0^local_k)*0.3222350398108426;
+Q_RELAX.test_1[25][17]:=t*Min(1000,RELAX.test.omega_0^local_k)*0.5007522026922482;
+Q_RELAX.test_1[25][21]:=CG*t*Min(1000,RELAX.test.omega_0^local_k)*0.1351200521140052;
+Q_RELAX.test_1[25][24]:=AC*t*0.3824103826488193;
+Q_RELAX.test_1[25][26]:=CG*t*0.2406378906553946;
+Q_RELAX.test_1[25][27]:=CT*t*0.2504957133922061;
+Q_RELAX.test_1[25][29]:=GT*t*Min(1000,RELAX.test.omega_0^local_k)*0.2296926126195792;
+Q_RELAX.test_1[25][41]:=CG*t*Min(1000,RELAX.test.omega_0^local_k)*0.3053650319994416;
+Q_RELAX.test_1[25][54]:=CT*t*Min(1000,RELAX.test.omega_0^local_k)*0.250994522453953;
+Q_RELAX.test_1[26][10]:=AC*t*0.3222350398108426;
+Q_RELAX.test_1[26][18]:=t*Min(1000,RELAX.test.omega_0^local_k)*0.5007522026922482;
+Q_RELAX.test_1[26][22]:=CG*t*Min(1000,RELAX.test.omega_0^local_k)*0.1351200521140052;
+Q_RELAX.test_1[26][24]:=t*0.3824103826488193;
+Q_RELAX.test_1[26][25]:=CG*t*0.1264560133035801;
+Q_RELAX.test_1[26][27]:=GT*t*0.2504957133922061;
+Q_RELAX.test_1[26][30]:=GT*t*Min(1000,RELAX.test.omega_0^local_k)*0.2296926126195792;
+Q_RELAX.test_1[26][42]:=CG*t*Min(1000,RELAX.test.omega_0^local_k)*0.3053650319994416;
+Q_RELAX.test_1[26][55]:=CT*t*Min(1000,RELAX.test.omega_0^local_k)*0.250994522453953;
+Q_RELAX.test_1[27][11]:=AC*t*Min(1000,RELAX.test.omega_0^local_k)*0.3222350398108426;
+Q_RELAX.test_1[27][19]:=t*Min(1000,RELAX.test.omega_0^local_k)*0.5007522026922482;
+Q_RELAX.test_1[27][23]:=CG*t*Min(1000,RELAX.test.omega_0^local_k)*0.1351200521140052;
+Q_RELAX.test_1[27][24]:=AT*t*0.3824103826488193;
+Q_RELAX.test_1[27][25]:=CT*t*0.1264560133035801;
+Q_RELAX.test_1[27][26]:=GT*t*0.2406378906553946;
+Q_RELAX.test_1[27][31]:=GT*t*Min(1000,RELAX.test.omega_0^local_k)*0.2296926126195792;
+Q_RELAX.test_1[27][43]:=CG*t*Min(1000,RELAX.test.omega_0^local_k)*0.3053650319994416;
+Q_RELAX.test_1[27][56]:=CT*t*Min(1000,RELAX.test.omega_0^local_k)*0.250994522453953;
+Q_RELAX.test_1[28][12]:=AC*t*Min(1000,RELAX.test.omega_0^local_k)*0.3222350398108426;
+Q_RELAX.test_1[28][16]:=AT*t*Min(1000,RELAX.test.omega_0^local_k)*0.5007522026922482;
+Q_RELAX.test_1[28][20]:=CT*t*Min(1000,RELAX.test.omega_0^local_k)*0.1351200521140052;
+Q_RELAX.test_1[28][24]:=GT*t*Min(1000,RELAX.test.omega_0^local_k)*0.1344351325741675;
+Q_RELAX.test_1[28][29]:=AC*t*0.1264560133035801;
+Q_RELAX.test_1[28][30]:=t*0.2406378906553946;
+Q_RELAX.test_1[28][31]:=AT*t*0.2504957133922061;
+Q_RELAX.test_1[28][44]:=CG*t*Min(1000,RELAX.test.omega_0^local_k)*0.3053650319994416;
+Q_RELAX.test_1[28][57]:=CT*t*0.250994522453953;
+Q_RELAX.test_1[29][13]:=AC*t*Min(1000,RELAX.test.omega_0^local_k)*0.3222350398108426;
+Q_RELAX.test_1[29][17]:=AT*t*Min(1000,RELAX.test.omega_0^local_k)*0.5007522026922482;
+Q_RELAX.test_1[29][21]:=CT*t*Min(1000,RELAX.test.omega_0^local_k)*0.1351200521140052;
+Q_RELAX.test_1[29][25]:=GT*t*Min(1000,RELAX.test.omega_0^local_k)*0.1344351325741675;
+Q_RELAX.test_1[29][28]:=AC*t*0.3824103826488193;
+Q_RELAX.test_1[29][30]:=CG*t*0.2406378906553946;
+Q_RELAX.test_1[29][31]:=CT*t*0.2504957133922061;
+Q_RELAX.test_1[29][45]:=CG*t*Min(1000,RELAX.test.omega_0^local_k)*0.3053650319994416;
+Q_RELAX.test_1[29][58]:=CT*t*Min(1000,RELAX.test.omega_0^local_k)*0.250994522453953;
+Q_RELAX.test_1[30][14]:=AC*t*Min(1000,RELAX.test.omega_0^local_k)*0.3222350398108426;
+Q_RELAX.test_1[30][18]:=AT*t*Min(1000,RELAX.test.omega_0^local_k)*0.5007522026922482;
+Q_RELAX.test_1[30][22]:=CT*t*Min(1000,RELAX.test.omega_0^local_k)*0.1351200521140052;
+Q_RELAX.test_1[30][26]:=GT*t*Min(1000,RELAX.test.omega_0^local_k)*0.1344351325741675;
+Q_RELAX.test_1[30][28]:=t*0.3824103826488193;
+Q_RELAX.test_1[30][29]:=CG*t*0.1264560133035801;
+Q_RELAX.test_1[30][31]:=GT*t*0.2504957133922061;
+Q_RELAX.test_1[30][46]:=CG*t*Min(1000,RELAX.test.omega_0^local_k)*0.3053650319994416;
+Q_RELAX.test_1[30][59]:=CT*t*0.250994522453953;
+Q_RELAX.test_1[31][15]:=AC*t*Min(1000,RELAX.test.omega_0^local_k)*0.3222350398108426;
+Q_RELAX.test_1[31][19]:=AT*t*Min(1000,RELAX.test.omega_0^local_k)*0.5007522026922482;
+Q_RELAX.test_1[31][23]:=CT*t*Min(1000,RELAX.test.omega_0^local_k)*0.1351200521140052;
+Q_RELAX.test_1[31][27]:=GT*t*Min(1000,RELAX.test.omega_0^local_k)*0.1344351325741675;
+Q_RELAX.test_1[31][28]:=AT*t*0.3824103826488193;
+Q_RELAX.test_1[31][29]:=CT*t*0.1264560133035801;
+Q_RELAX.test_1[31][30]:=GT*t*0.2406378906553946;
+Q_RELAX.test_1[31][47]:=CG*t*Min(1000,RELAX.test.omega_0^local_k)*0.3053650319994416;
+Q_RELAX.test_1[31][60]:=CT*t*Min(1000,RELAX.test.omega_0^local_k)*0.250994522453953;
+Q_RELAX.test_1[32][0]:=t*Min(1000,RELAX.test.omega_0^local_k)*0.3222350398108426;
+Q_RELAX.test_1[32][16]:=CG*t*Min(1000,RELAX.test.omega_0^local_k)*0.1214054057357627;
+Q_RELAX.test_1[32][33]:=AC*t*Min(1000,RELAX.test.omega_0^local_k)*0.1264560133035801;
+Q_RELAX.test_1[32][34]:=t*0.2406378906553946;
+Q_RELAX.test_1[32][35]:=AT*t*Min(1000,RELAX.test.omega_0^local_k)*0.2504957133922061;
+Q_RELAX.test_1[32][36]:=AC*t*Min(1000,RELAX.test.omega_0^local_k)*0.1351200521140052;
+Q_RELAX.test_1[32][40]:=t*Min(1000,RELAX.test.omega_0^local_k)*0.1344351325741675;
+Q_RELAX.test_1[32][44]:=AT*t*Min(1000,RELAX.test.omega_0^local_k)*0.2296926126195792;
+Q_RELAX.test_1[33][1]:=t*Min(1000,RELAX.test.omega_0^local_k)*0.3222350398108426;
+Q_RELAX.test_1[33][17]:=CG*t*Min(1000,RELAX.test.omega_0^local_k)*0.1214054057357627;
+Q_RELAX.test_1[33][32]:=AC*t*Min(1000,RELAX.test.omega_0^local_k)*0.3824103826488193;
+Q_RELAX.test_1[33][34]:=CG*t*Min(1000,RELAX.test.omega_0^local_k)*0.2406378906553946;
+Q_RELAX.test_1[33][35]:=CT*t*0.2504957133922061;
+Q_RELAX.test_1[33][37]:=AC*t*Min(1000,RELAX.test.omega_0^local_k)*0.1351200521140052;
+Q_RELAX.test_1[33][41]:=t*Min(1000,RELAX.test.omega_0^local_k)*0.1344351325741675;
+Q_RELAX.test_1[33][45]:=AT*t*Min(1000,RELAX.test.omega_0^local_k)*0.2296926126195792;
+Q_RELAX.test_1[33][48]:=GT*t*Min(1000,RELAX.test.omega_0^local_k)*0.250994522453953;
+Q_RELAX.test_1[34][2]:=t*Min(1000,RELAX.test.omega_0^local_k)*0.3222350398108426;
+Q_RELAX.test_1[34][18]:=CG*t*Min(1000,RELAX.test.omega_0^local_k)*0.1214054057357627;
+Q_RELAX.test_1[34][32]:=t*0.3824103826488193;
+Q_RELAX.test_1[34][33]:=CG*t*Min(1000,RELAX.test.omega_0^local_k)*0.1264560133035801;
+Q_RELAX.test_1[34][35]:=GT*t*Min(1000,RELAX.test.omega_0^local_k)*0.2504957133922061;
+Q_RELAX.test_1[34][38]:=AC*t*Min(1000,RELAX.test.omega_0^local_k)*0.1351200521140052;
+Q_RELAX.test_1[34][42]:=t*Min(1000,RELAX.test.omega_0^local_k)*0.1344351325741675;
+Q_RELAX.test_1[34][46]:=AT*t*Min(1000,RELAX.test.omega_0^local_k)*0.2296926126195792;
+Q_RELAX.test_1[35][3]:=t*Min(1000,RELAX.test.omega_0^local_k)*0.3222350398108426;
+Q_RELAX.test_1[35][19]:=CG*t*Min(1000,RELAX.test.omega_0^local_k)*0.1214054057357627;
+Q_RELAX.test_1[35][32]:=AT*t*Min(1000,RELAX.test.omega_0^local_k)*0.3824103826488193;
+Q_RELAX.test_1[35][33]:=CT*t*0.1264560133035801;
+Q_RELAX.test_1[35][34]:=GT*t*Min(1000,RELAX.test.omega_0^local_k)*0.2406378906553946;
+Q_RELAX.test_1[35][39]:=AC*t*Min(1000,RELAX.test.omega_0^local_k)*0.1351200521140052;
+Q_RELAX.test_1[35][43]:=t*Min(1000,RELAX.test.omega_0^local_k)*0.1344351325741675;
+Q_RELAX.test_1[35][47]:=AT*t*Min(1000,RELAX.test.omega_0^local_k)*0.2296926126195792;
+Q_RELAX.test_1[35][49]:=GT*t*Min(1000,RELAX.test.omega_0^local_k)*0.250994522453953;
+Q_RELAX.test_1[36][4]:=t*Min(1000,RELAX.test.omega_0^local_k)*0.3222350398108426;
+Q_RELAX.test_1[36][20]:=CG*t*Min(1000,RELAX.test.omega_0^local_k)*0.1214054057357627;
+Q_RELAX.test_1[36][32]:=AC*t*Min(1000,RELAX.test.omega_0^local_k)*0.5007522026922482;
+Q_RELAX.test_1[36][37]:=AC*t*0.1264560133035801;
+Q_RELAX.test_1[36][38]:=t*0.2406378906553946;
+Q_RELAX.test_1[36][39]:=AT*t*0.2504957133922061;
+Q_RELAX.test_1[36][40]:=CG*t*Min(1000,RELAX.test.omega_0^local_k)*0.1344351325741675;
+Q_RELAX.test_1[36][44]:=CT*t*Min(1000,RELAX.test.omega_0^local_k)*0.2296926126195792;
+Q_RELAX.test_1[36][50]:=GT*t*Min(1000,RELAX.test.omega_0^local_k)*0.250994522453953;
+Q_RELAX.test_1[37][5]:=t*Min(1000,RELAX.test.omega_0^local_k)*0.3222350398108426;
+Q_RELAX.test_1[37][21]:=CG*t*Min(1000,RELAX.test.omega_0^local_k)*0.1214054057357627;
+Q_RELAX.test_1[37][33]:=AC*t*Min(1000,RELAX.test.omega_0^local_k)*0.5007522026922482;
+Q_RELAX.test_1[37][36]:=AC*t*0.3824103826488193;
+Q_RELAX.test_1[37][38]:=CG*t*0.2406378906553946;
+Q_RELAX.test_1[37][39]:=CT*t*0.2504957133922061;
+Q_RELAX.test_1[37][41]:=CG*t*Min(1000,RELAX.test.omega_0^local_k)*0.1344351325741675;
+Q_RELAX.test_1[37][45]:=CT*t*Min(1000,RELAX.test.omega_0^local_k)*0.2296926126195792;
+Q_RELAX.test_1[37][51]:=GT*t*Min(1000,RELAX.test.omega_0^local_k)*0.250994522453953;
+Q_RELAX.test_1[38][6]:=t*Min(1000,RELAX.test.omega_0^local_k)*0.3222350398108426;
+Q_RELAX.test_1[38][22]:=CG*t*Min(1000,RELAX.test.omega_0^local_k)*0.1214054057357627;
+Q_RELAX.test_1[38][34]:=AC*t*Min(1000,RELAX.test.omega_0^local_k)*0.5007522026922482;
+Q_RELAX.test_1[38][36]:=t*0.3824103826488193;
+Q_RELAX.test_1[38][37]:=CG*t*0.1264560133035801;
+Q_RELAX.test_1[38][39]:=GT*t*0.2504957133922061;
+Q_RELAX.test_1[38][42]:=CG*t*Min(1000,RELAX.test.omega_0^local_k)*0.1344351325741675;
+Q_RELAX.test_1[38][46]:=CT*t*Min(1000,RELAX.test.omega_0^local_k)*0.2296926126195792;
+Q_RELAX.test_1[38][52]:=GT*t*Min(1000,RELAX.test.omega_0^local_k)*0.250994522453953;
+Q_RELAX.test_1[39][7]:=t*Min(1000,RELAX.test.omega_0^local_k)*0.3222350398108426;
+Q_RELAX.test_1[39][23]:=CG*t*Min(1000,RELAX.test.omega_0^local_k)*0.1214054057357627;
+Q_RELAX.test_1[39][35]:=AC*t*Min(1000,RELAX.test.omega_0^local_k)*0.5007522026922482;
+Q_RELAX.test_1[39][36]:=AT*t*0.3824103826488193;
+Q_RELAX.test_1[39][37]:=CT*t*0.1264560133035801;
+Q_RELAX.test_1[39][38]:=GT*t*0.2406378906553946;
+Q_RELAX.test_1[39][43]:=CG*t*Min(1000,RELAX.test.omega_0^local_k)*0.1344351325741675;
+Q_RELAX.test_1[39][47]:=CT*t*Min(1000,RELAX.test.omega_0^local_k)*0.2296926126195792;
+Q_RELAX.test_1[39][53]:=GT*t*Min(1000,RELAX.test.omega_0^local_k)*0.250994522453953;
+Q_RELAX.test_1[40][8]:=t*Min(1000,RELAX.test.omega_0^local_k)*0.3222350398108426;
+Q_RELAX.test_1[40][24]:=CG*t*Min(1000,RELAX.test.omega_0^local_k)*0.1214054057357627;
+Q_RELAX.test_1[40][32]:=t*Min(1000,RELAX.test.omega_0^local_k)*0.5007522026922482;
+Q_RELAX.test_1[40][36]:=CG*t*Min(1000,RELAX.test.omega_0^local_k)*0.1351200521140052;
+Q_RELAX.test_1[40][41]:=AC*t*0.1264560133035801;
+Q_RELAX.test_1[40][42]:=t*0.2406378906553946;
+Q_RELAX.test_1[40][43]:=AT*t*0.2504957133922061;
+Q_RELAX.test_1[40][44]:=GT*t*Min(1000,RELAX.test.omega_0^local_k)*0.2296926126195792;
+Q_RELAX.test_1[41][9]:=t*Min(1000,RELAX.test.omega_0^local_k)*0.3222350398108426;
+Q_RELAX.test_1[41][25]:=CG*t*Min(1000,RELAX.test.omega_0^local_k)*0.1214054057357627;
+Q_RELAX.test_1[41][33]:=t*Min(1000,RELAX.test.omega_0^local_k)*0.5007522026922482;
+Q_RELAX.test_1[41][37]:=CG*t*Min(1000,RELAX.test.omega_0^local_k)*0.1351200521140052;
+Q_RELAX.test_1[41][40]:=AC*t*0.3824103826488193;
+Q_RELAX.test_1[41][42]:=CG*t*0.2406378906553946;
+Q_RELAX.test_1[41][43]:=CT*t*0.2504957133922061;
+Q_RELAX.test_1[41][45]:=GT*t*Min(1000,RELAX.test.omega_0^local_k)*0.2296926126195792;
+Q_RELAX.test_1[41][54]:=GT*t*Min(1000,RELAX.test.omega_0^local_k)*0.250994522453953;
+Q_RELAX.test_1[42][10]:=t*Min(1000,RELAX.test.omega_0^local_k)*0.3222350398108426;
+Q_RELAX.test_1[42][26]:=CG*t*Min(1000,RELAX.test.omega_0^local_k)*0.1214054057357627;
+Q_RELAX.test_1[42][34]:=t*Min(1000,RELAX.test.omega_0^local_k)*0.5007522026922482;
+Q_RELAX.test_1[42][38]:=CG*t*Min(1000,RELAX.test.omega_0^local_k)*0.1351200521140052;
+Q_RELAX.test_1[42][40]:=t*0.3824103826488193;
+Q_RELAX.test_1[42][41]:=CG*t*0.1264560133035801;
+Q_RELAX.test_1[42][43]:=GT*t*0.2504957133922061;
+Q_RELAX.test_1[42][46]:=GT*t*Min(1000,RELAX.test.omega_0^local_k)*0.2296926126195792;
+Q_RELAX.test_1[42][55]:=GT*t*Min(1000,RELAX.test.omega_0^local_k)*0.250994522453953;
+Q_RELAX.test_1[43][11]:=t*Min(1000,RELAX.test.omega_0^local_k)*0.3222350398108426;
+Q_RELAX.test_1[43][27]:=CG*t*Min(1000,RELAX.test.omega_0^local_k)*0.1214054057357627;
+Q_RELAX.test_1[43][35]:=t*Min(1000,RELAX.test.omega_0^local_k)*0.5007522026922482;
+Q_RELAX.test_1[43][39]:=CG*t*Min(1000,RELAX.test.omega_0^local_k)*0.1351200521140052;
+Q_RELAX.test_1[43][40]:=AT*t*0.3824103826488193;
+Q_RELAX.test_1[43][41]:=CT*t*0.1264560133035801;
+Q_RELAX.test_1[43][42]:=GT*t*0.2406378906553946;
+Q_RELAX.test_1[43][47]:=GT*t*Min(1000,RELAX.test.omega_0^local_k)*0.2296926126195792;
+Q_RELAX.test_1[43][56]:=GT*t*Min(1000,RELAX.test.omega_0^local_k)*0.250994522453953;
+Q_RELAX.test_1[44][12]:=t*Min(1000,RELAX.test.omega_0^local_k)*0.3222350398108426;
+Q_RELAX.test_1[44][28]:=CG*t*Min(1000,RELAX.test.omega_0^local_k)*0.1214054057357627;
+Q_RELAX.test_1[44][32]:=AT*t*Min(1000,RELAX.test.omega_0^local_k)*0.5007522026922482;
+Q_RELAX.test_1[44][36]:=CT*t*Min(1000,RELAX.test.omega_0^local_k)*0.1351200521140052;
+Q_RELAX.test_1[44][40]:=GT*t*Min(1000,RELAX.test.omega_0^local_k)*0.1344351325741675;
+Q_RELAX.test_1[44][45]:=AC*t*0.1264560133035801;
+Q_RELAX.test_1[44][46]:=t*0.2406378906553946;
+Q_RELAX.test_1[44][47]:=AT*t*0.2504957133922061;
+Q_RELAX.test_1[44][57]:=GT*t*Min(1000,RELAX.test.omega_0^local_k)*0.250994522453953;
+Q_RELAX.test_1[45][13]:=t*Min(1000,RELAX.test.omega_0^local_k)*0.3222350398108426;
+Q_RELAX.test_1[45][29]:=CG*t*Min(1000,RELAX.test.omega_0^local_k)*0.1214054057357627;
+Q_RELAX.test_1[45][33]:=AT*t*Min(1000,RELAX.test.omega_0^local_k)*0.5007522026922482;
+Q_RELAX.test_1[45][37]:=CT*t*Min(1000,RELAX.test.omega_0^local_k)*0.1351200521140052;
+Q_RELAX.test_1[45][41]:=GT*t*Min(1000,RELAX.test.omega_0^local_k)*0.1344351325741675;
+Q_RELAX.test_1[45][44]:=AC*t*0.3824103826488193;
+Q_RELAX.test_1[45][46]:=CG*t*0.2406378906553946;
+Q_RELAX.test_1[45][47]:=CT*t*0.2504957133922061;
+Q_RELAX.test_1[45][58]:=GT*t*Min(1000,RELAX.test.omega_0^local_k)*0.250994522453953;
+Q_RELAX.test_1[46][14]:=t*Min(1000,RELAX.test.omega_0^local_k)*0.3222350398108426;
+Q_RELAX.test_1[46][30]:=CG*t*Min(1000,RELAX.test.omega_0^local_k)*0.1214054057357627;
+Q_RELAX.test_1[46][34]:=AT*t*Min(1000,RELAX.test.omega_0^local_k)*0.5007522026922482;
+Q_RELAX.test_1[46][38]:=CT*t*Min(1000,RELAX.test.omega_0^local_k)*0.1351200521140052;
+Q_RELAX.test_1[46][42]:=GT*t*Min(1000,RELAX.test.omega_0^local_k)*0.1344351325741675;
+Q_RELAX.test_1[46][44]:=t*0.3824103826488193;
+Q_RELAX.test_1[46][45]:=CG*t*0.1264560133035801;
+Q_RELAX.test_1[46][47]:=GT*t*0.2504957133922061;
+Q_RELAX.test_1[46][59]:=GT*t*Min(1000,RELAX.test.omega_0^local_k)*0.250994522453953;
+Q_RELAX.test_1[47][15]:=t*Min(1000,RELAX.test.omega_0^local_k)*0.3222350398108426;
+Q_RELAX.test_1[47][31]:=CG*t*Min(1000,RELAX.test.omega_0^local_k)*0.1214054057357627;
+Q_RELAX.test_1[47][35]:=AT*t*Min(1000,RELAX.test.omega_0^local_k)*0.5007522026922482;
+Q_RELAX.test_1[47][39]:=CT*t*Min(1000,RELAX.test.omega_0^local_k)*0.1351200521140052;
+Q_RELAX.test_1[47][43]:=GT*t*Min(1000,RELAX.test.omega_0^local_k)*0.1344351325741675;
+Q_RELAX.test_1[47][44]:=AT*t*0.3824103826488193;
+Q_RELAX.test_1[47][45]:=CT*t*0.1264560133035801;
+Q_RELAX.test_1[47][46]:=GT*t*0.2406378906553946;
+Q_RELAX.test_1[47][60]:=GT*t*Min(1000,RELAX.test.omega_0^local_k)*0.250994522453953;
+Q_RELAX.test_1[48][1]:=AT*t*Min(1000,RELAX.test.omega_0^local_k)*0.3222350398108426;
+Q_RELAX.test_1[48][17]:=CT*t*Min(1000,RELAX.test.omega_0^local_k)*0.1214054057357627;
+Q_RELAX.test_1[48][33]:=GT*t*Min(1000,RELAX.test.omega_0^local_k)*0.3053650319994416;
+Q_RELAX.test_1[48][49]:=CT*t*0.2504957133922061;
+Q_RELAX.test_1[48][51]:=AC*t*Min(1000,RELAX.test.omega_0^local_k)*0.1351200521140052;
+Q_RELAX.test_1[48][54]:=t*Min(1000,RELAX.test.omega_0^local_k)*0.1344351325741675;
+Q_RELAX.test_1[48][58]:=AT*t*Min(1000,RELAX.test.omega_0^local_k)*0.2296926126195792;
+Q_RELAX.test_1[49][3]:=AT*t*Min(1000,RELAX.test.omega_0^local_k)*0.3222350398108426;
+Q_RELAX.test_1[49][19]:=CT*t*Min(1000,RELAX.test.omega_0^local_k)*0.1214054057357627;
+Q_RELAX.test_1[49][35]:=GT*t*Min(1000,RELAX.test.omega_0^local_k)*0.3053650319994416;
+Q_RELAX.test_1[49][48]:=CT*t*0.1264560133035801;
+Q_RELAX.test_1[49][53]:=AC*t*Min(1000,RELAX.test.omega_0^local_k)*0.1351200521140052;
+Q_RELAX.test_1[49][56]:=t*Min(1000,RELAX.test.omega_0^local_k)*0.1344351325741675;
+Q_RELAX.test_1[49][60]:=AT*t*Min(1000,RELAX.test.omega_0^local_k)*0.2296926126195792;
+Q_RELAX.test_1[50][4]:=AT*t*Min(1000,RELAX.test.omega_0^local_k)*0.3222350398108426;
+Q_RELAX.test_1[50][20]:=CT*t*Min(1000,RELAX.test.omega_0^local_k)*0.1214054057357627;
+Q_RELAX.test_1[50][36]:=GT*t*Min(1000,RELAX.test.omega_0^local_k)*0.3053650319994416;
+Q_RELAX.test_1[50][51]:=AC*t*0.1264560133035801;
+Q_RELAX.test_1[50][52]:=t*0.2406378906553946;
+Q_RELAX.test_1[50][53]:=AT*t*0.2504957133922061;
+Q_RELAX.test_1[50][57]:=CT*t*Min(1000,RELAX.test.omega_0^local_k)*0.2296926126195792;
+Q_RELAX.test_1[51][5]:=AT*t*Min(1000,RELAX.test.omega_0^local_k)*0.3222350398108426;
+Q_RELAX.test_1[51][21]:=CT*t*Min(1000,RELAX.test.omega_0^local_k)*0.1214054057357627;
+Q_RELAX.test_1[51][37]:=GT*t*Min(1000,RELAX.test.omega_0^local_k)*0.3053650319994416;
+Q_RELAX.test_1[51][48]:=AC*t*Min(1000,RELAX.test.omega_0^local_k)*0.5007522026922482;
+Q_RELAX.test_1[51][50]:=AC*t*0.3824103826488193;
+Q_RELAX.test_1[51][52]:=CG*t*0.2406378906553946;
+Q_RELAX.test_1[51][53]:=CT*t*0.2504957133922061;
+Q_RELAX.test_1[51][54]:=CG*t*Min(1000,RELAX.test.omega_0^local_k)*0.1344351325741675;
+Q_RELAX.test_1[51][58]:=CT*t*Min(1000,RELAX.test.omega_0^local_k)*0.2296926126195792;
+Q_RELAX.test_1[52][6]:=AT*t*Min(1000,RELAX.test.omega_0^local_k)*0.3222350398108426;
+Q_RELAX.test_1[52][22]:=CT*t*Min(1000,RELAX.test.omega_0^local_k)*0.1214054057357627;
+Q_RELAX.test_1[52][38]:=GT*t*Min(1000,RELAX.test.omega_0^local_k)*0.3053650319994416;
+Q_RELAX.test_1[52][50]:=t*0.3824103826488193;
+Q_RELAX.test_1[52][51]:=CG*t*0.1264560133035801;
+Q_RELAX.test_1[52][53]:=GT*t*0.2504957133922061;
+Q_RELAX.test_1[52][55]:=CG*t*Min(1000,RELAX.test.omega_0^local_k)*0.1344351325741675;
+Q_RELAX.test_1[52][59]:=CT*t*Min(1000,RELAX.test.omega_0^local_k)*0.2296926126195792;
+Q_RELAX.test_1[53][7]:=AT*t*Min(1000,RELAX.test.omega_0^local_k)*0.3222350398108426;
+Q_RELAX.test_1[53][23]:=CT*t*Min(1000,RELAX.test.omega_0^local_k)*0.1214054057357627;
+Q_RELAX.test_1[53][39]:=GT*t*Min(1000,RELAX.test.omega_0^local_k)*0.3053650319994416;
+Q_RELAX.test_1[53][49]:=AC*t*Min(1000,RELAX.test.omega_0^local_k)*0.5007522026922482;
+Q_RELAX.test_1[53][50]:=AT*t*0.3824103826488193;
+Q_RELAX.test_1[53][51]:=CT*t*0.1264560133035801;
+Q_RELAX.test_1[53][52]:=GT*t*0.2406378906553946;
+Q_RELAX.test_1[53][56]:=CG*t*Min(1000,RELAX.test.omega_0^local_k)*0.1344351325741675;
+Q_RELAX.test_1[53][60]:=CT*t*Min(1000,RELAX.test.omega_0^local_k)*0.2296926126195792;
+Q_RELAX.test_1[54][9]:=AT*t*Min(1000,RELAX.test.omega_0^local_k)*0.3222350398108426;
+Q_RELAX.test_1[54][25]:=CT*t*Min(1000,RELAX.test.omega_0^local_k)*0.1214054057357627;
+Q_RELAX.test_1[54][41]:=GT*t*Min(1000,RELAX.test.omega_0^local_k)*0.3053650319994416;
+Q_RELAX.test_1[54][48]:=t*Min(1000,RELAX.test.omega_0^local_k)*0.5007522026922482;
+Q_RELAX.test_1[54][51]:=CG*t*Min(1000,RELAX.test.omega_0^local_k)*0.1351200521140052;
+Q_RELAX.test_1[54][55]:=CG*t*Min(1000,RELAX.test.omega_0^local_k)*0.2406378906553946;
+Q_RELAX.test_1[54][56]:=CT*t*0.2504957133922061;
+Q_RELAX.test_1[54][58]:=GT*t*Min(1000,RELAX.test.omega_0^local_k)*0.2296926126195792;
+Q_RELAX.test_1[55][10]:=AT*t*Min(1000,RELAX.test.omega_0^local_k)*0.3222350398108426;
+Q_RELAX.test_1[55][26]:=CT*t*Min(1000,RELAX.test.omega_0^local_k)*0.1214054057357627;
+Q_RELAX.test_1[55][42]:=GT*t*Min(1000,RELAX.test.omega_0^local_k)*0.3053650319994416;
+Q_RELAX.test_1[55][52]:=CG*t*Min(1000,RELAX.test.omega_0^local_k)*0.1351200521140052;
+Q_RELAX.test_1[55][54]:=CG*t*Min(1000,RELAX.test.omega_0^local_k)*0.1264560133035801;
+Q_RELAX.test_1[55][56]:=GT*t*Min(1000,RELAX.test.omega_0^local_k)*0.2504957133922061;
+Q_RELAX.test_1[55][59]:=GT*t*Min(1000,RELAX.test.omega_0^local_k)*0.2296926126195792;
+Q_RELAX.test_1[56][11]:=AT*t*Min(1000,RELAX.test.omega_0^local_k)*0.3222350398108426;
+Q_RELAX.test_1[56][27]:=CT*t*Min(1000,RELAX.test.omega_0^local_k)*0.1214054057357627;
+Q_RELAX.test_1[56][43]:=GT*t*Min(1000,RELAX.test.omega_0^local_k)*0.3053650319994416;
+Q_RELAX.test_1[56][49]:=t*Min(1000,RELAX.test.omega_0^local_k)*0.5007522026922482;
+Q_RELAX.test_1[56][53]:=CG*t*Min(1000,RELAX.test.omega_0^local_k)*0.1351200521140052;
+Q_RELAX.test_1[56][54]:=CT*t*0.1264560133035801;
+Q_RELAX.test_1[56][55]:=GT*t*Min(1000,RELAX.test.omega_0^local_k)*0.2406378906553946;
+Q_RELAX.test_1[56][60]:=GT*t*Min(1000,RELAX.test.omega_0^local_k)*0.2296926126195792;
+Q_RELAX.test_1[57][12]:=AT*t*Min(1000,RELAX.test.omega_0^local_k)*0.3222350398108426;
+Q_RELAX.test_1[57][28]:=CT*t*0.1214054057357627;
+Q_RELAX.test_1[57][44]:=GT*t*Min(1000,RELAX.test.omega_0^local_k)*0.3053650319994416;
+Q_RELAX.test_1[57][50]:=CT*t*Min(1000,RELAX.test.omega_0^local_k)*0.1351200521140052;
+Q_RELAX.test_1[57][58]:=AC*t*Min(1000,RELAX.test.omega_0^local_k)*0.1264560133035801;
+Q_RELAX.test_1[57][59]:=t*0.2406378906553946;
+Q_RELAX.test_1[57][60]:=AT*t*Min(1000,RELAX.test.omega_0^local_k)*0.2504957133922061;
+Q_RELAX.test_1[58][13]:=AT*t*Min(1000,RELAX.test.omega_0^local_k)*0.3222350398108426;
+Q_RELAX.test_1[58][29]:=CT*t*Min(1000,RELAX.test.omega_0^local_k)*0.1214054057357627;
+Q_RELAX.test_1[58][45]:=GT*t*Min(1000,RELAX.test.omega_0^local_k)*0.3053650319994416;
+Q_RELAX.test_1[58][48]:=AT*t*Min(1000,RELAX.test.omega_0^local_k)*0.5007522026922482;
+Q_RELAX.test_1[58][51]:=CT*t*Min(1000,RELAX.test.omega_0^local_k)*0.1351200521140052;
+Q_RELAX.test_1[58][54]:=GT*t*Min(1000,RELAX.test.omega_0^local_k)*0.1344351325741675;
+Q_RELAX.test_1[58][57]:=AC*t*Min(1000,RELAX.test.omega_0^local_k)*0.3824103826488193;
+Q_RELAX.test_1[58][59]:=CG*t*Min(1000,RELAX.test.omega_0^local_k)*0.2406378906553946;
+Q_RELAX.test_1[58][60]:=CT*t*0.2504957133922061;
+Q_RELAX.test_1[59][14]:=AT*t*Min(1000,RELAX.test.omega_0^local_k)*0.3222350398108426;
+Q_RELAX.test_1[59][30]:=CT*t*0.1214054057357627;
+Q_RELAX.test_1[59][46]:=GT*t*Min(1000,RELAX.test.omega_0^local_k)*0.3053650319994416;
+Q_RELAX.test_1[59][52]:=CT*t*Min(1000,RELAX.test.omega_0^local_k)*0.1351200521140052;
+Q_RELAX.test_1[59][55]:=GT*t*Min(1000,RELAX.test.omega_0^local_k)*0.1344351325741675;
+Q_RELAX.test_1[59][57]:=t*0.3824103826488193;
+Q_RELAX.test_1[59][58]:=CG*t*Min(1000,RELAX.test.omega_0^local_k)*0.1264560133035801;
+Q_RELAX.test_1[59][60]:=GT*t*Min(1000,RELAX.test.omega_0^local_k)*0.2504957133922061;
+Q_RELAX.test_1[60][15]:=AT*t*Min(1000,RELAX.test.omega_0^local_k)*0.3222350398108426;
+Q_RELAX.test_1[60][31]:=CT*t*Min(1000,RELAX.test.omega_0^local_k)*0.1214054057357627;
+Q_RELAX.test_1[60][47]:=GT*t*Min(1000,RELAX.test.omega_0^local_k)*0.3053650319994416;
+Q_RELAX.test_1[60][49]:=AT*t*Min(1000,RELAX.test.omega_0^local_k)*0.5007522026922482;
+Q_RELAX.test_1[60][53]:=CT*t*Min(1000,RELAX.test.omega_0^local_k)*0.1351200521140052;
+Q_RELAX.test_1[60][56]:=GT*t*Min(1000,RELAX.test.omega_0^local_k)*0.1344351325741675;
+Q_RELAX.test_1[60][57]:=AT*t*Min(1000,RELAX.test.omega_0^local_k)*0.3824103826488193;
+Q_RELAX.test_1[60][58]:=CT*t*0.1264560133035801;
+Q_RELAX.test_1[60][59]:=GT*t*Min(1000,RELAX.test.omega_0^local_k)*0.2406378906553946;
+
+
+Q_RELAX.test_2={61,61};
+Q_RELAX.test_2[0][1]:=AC*t*Min(1000,RELAX.test.omega_1^local_k)*0.1264560133035801;
+Q_RELAX.test_2[0][2]:=t*0.2406378906553946;
+Q_RELAX.test_2[0][3]:=AT*t*Min(1000,RELAX.test.omega_1^local_k)*0.2504957133922061;
+Q_RELAX.test_2[0][4]:=AC*t*Min(1000,RELAX.test.omega_1^local_k)*0.1351200521140052;
+Q_RELAX.test_2[0][8]:=t*Min(1000,RELAX.test.omega_1^local_k)*0.1344351325741675;
+Q_RELAX.test_2[0][12]:=AT*t*Min(1000,RELAX.test.omega_1^local_k)*0.2296926126195792;
+Q_RELAX.test_2[0][16]:=AC*t*Min(1000,RELAX.test.omega_1^local_k)*0.1214054057357627;
+Q_RELAX.test_2[0][32]:=t*Min(1000,RELAX.test.omega_1^local_k)*0.3053650319994416;
+Q_RELAX.test_2[1][0]:=AC*t*Min(1000,RELAX.test.omega_1^local_k)*0.3824103826488193;
+Q_RELAX.test_2[1][2]:=CG*t*Min(1000,RELAX.test.omega_1^local_k)*0.2406378906553946;
+Q_RELAX.test_2[1][3]:=CT*t*0.2504957133922061;
+Q_RELAX.test_2[1][5]:=AC*t*Min(1000,RELAX.test.omega_1^local_k)*0.1351200521140052;
+Q_RELAX.test_2[1][9]:=t*Min(1000,RELAX.test.omega_1^local_k)*0.1344351325741675;
+Q_RELAX.test_2[1][13]:=AT*t*Min(1000,RELAX.test.omega_1^local_k)*0.2296926126195792;
+Q_RELAX.test_2[1][17]:=AC*t*Min(1000,RELAX.test.omega_1^local_k)*0.1214054057357627;
+Q_RELAX.test_2[1][33]:=t*Min(1000,RELAX.test.omega_1^local_k)*0.3053650319994416;
+Q_RELAX.test_2[1][48]:=AT*t*Min(1000,RELAX.test.omega_1^local_k)*0.250994522453953;
+Q_RELAX.test_2[2][0]:=t*0.3824103826488193;
+Q_RELAX.test_2[2][1]:=CG*t*Min(1000,RELAX.test.omega_1^local_k)*0.1264560133035801;
+Q_RELAX.test_2[2][3]:=GT*t*Min(1000,RELAX.test.omega_1^local_k)*0.2504957133922061;
+Q_RELAX.test_2[2][6]:=AC*t*Min(1000,RELAX.test.omega_1^local_k)*0.1351200521140052;
+Q_RELAX.test_2[2][10]:=t*Min(1000,RELAX.test.omega_1^local_k)*0.1344351325741675;
+Q_RELAX.test_2[2][14]:=AT*t*Min(1000,RELAX.test.omega_1^local_k)*0.2296926126195792;
+Q_RELAX.test_2[2][18]:=AC*t*Min(1000,RELAX.test.omega_1^local_k)*0.1214054057357627;
+Q_RELAX.test_2[2][34]:=t*Min(1000,RELAX.test.omega_1^local_k)*0.3053650319994416;
+Q_RELAX.test_2[3][0]:=AT*t*Min(1000,RELAX.test.omega_1^local_k)*0.3824103826488193;
+Q_RELAX.test_2[3][1]:=CT*t*0.1264560133035801;
+Q_RELAX.test_2[3][2]:=GT*t*Min(1000,RELAX.test.omega_1^local_k)*0.2406378906553946;
+Q_RELAX.test_2[3][7]:=AC*t*Min(1000,RELAX.test.omega_1^local_k)*0.1351200521140052;
+Q_RELAX.test_2[3][11]:=t*Min(1000,RELAX.test.omega_1^local_k)*0.1344351325741675;
+Q_RELAX.test_2[3][15]:=AT*t*Min(1000,RELAX.test.omega_1^local_k)*0.2296926126195792;
+Q_RELAX.test_2[3][19]:=AC*t*Min(1000,RELAX.test.omega_1^local_k)*0.1214054057357627;
+Q_RELAX.test_2[3][35]:=t*Min(1000,RELAX.test.omega_1^local_k)*0.3053650319994416;
+Q_RELAX.test_2[3][49]:=AT*t*Min(1000,RELAX.test.omega_1^local_k)*0.250994522453953;
+Q_RELAX.test_2[4][0]:=AC*t*Min(1000,RELAX.test.omega_1^local_k)*0.5007522026922482;
+Q_RELAX.test_2[4][5]:=AC*t*0.1264560133035801;
+Q_RELAX.test_2[4][6]:=t*0.2406378906553946;
+Q_RELAX.test_2[4][7]:=AT*t*0.2504957133922061;
+Q_RELAX.test_2[4][8]:=CG*t*Min(1000,RELAX.test.omega_1^local_k)*0.1344351325741675;
+Q_RELAX.test_2[4][12]:=CT*t*Min(1000,RELAX.test.omega_1^local_k)*0.2296926126195792;
+Q_RELAX.test_2[4][20]:=AC*t*Min(1000,RELAX.test.omega_1^local_k)*0.1214054057357627;
+Q_RELAX.test_2[4][36]:=t*Min(1000,RELAX.test.omega_1^local_k)*0.3053650319994416;
+Q_RELAX.test_2[4][50]:=AT*t*Min(1000,RELAX.test.omega_1^local_k)*0.250994522453953;
+Q_RELAX.test_2[5][1]:=AC*t*Min(1000,RELAX.test.omega_1^local_k)*0.5007522026922482;
+Q_RELAX.test_2[5][4]:=AC*t*0.3824103826488193;
+Q_RELAX.test_2[5][6]:=CG*t*0.2406378906553946;
+Q_RELAX.test_2[5][7]:=CT*t*0.2504957133922061;
+Q_RELAX.test_2[5][9]:=CG*t*Min(1000,RELAX.test.omega_1^local_k)*0.1344351325741675;
+Q_RELAX.test_2[5][13]:=CT*t*Min(1000,RELAX.test.omega_1^local_k)*0.2296926126195792;
+Q_RELAX.test_2[5][21]:=AC*t*Min(1000,RELAX.test.omega_1^local_k)*0.1214054057357627;
+Q_RELAX.test_2[5][37]:=t*Min(1000,RELAX.test.omega_1^local_k)*0.3053650319994416;
+Q_RELAX.test_2[5][51]:=AT*t*Min(1000,RELAX.test.omega_1^local_k)*0.250994522453953;
+Q_RELAX.test_2[6][2]:=AC*t*Min(1000,RELAX.test.omega_1^local_k)*0.5007522026922482;
+Q_RELAX.test_2[6][4]:=t*0.3824103826488193;
+Q_RELAX.test_2[6][5]:=CG*t*0.1264560133035801;
+Q_RELAX.test_2[6][7]:=GT*t*0.2504957133922061;
+Q_RELAX.test_2[6][10]:=CG*t*Min(1000,RELAX.test.omega_1^local_k)*0.1344351325741675;
+Q_RELAX.test_2[6][14]:=CT*t*Min(1000,RELAX.test.omega_1^local_k)*0.2296926126195792;
+Q_RELAX.test_2[6][22]:=AC*t*Min(1000,RELAX.test.omega_1^local_k)*0.1214054057357627;
+Q_RELAX.test_2[6][38]:=t*Min(1000,RELAX.test.omega_1^local_k)*0.3053650319994416;
+Q_RELAX.test_2[6][52]:=AT*t*Min(1000,RELAX.test.omega_1^local_k)*0.250994522453953;
+Q_RELAX.test_2[7][3]:=AC*t*Min(1000,RELAX.test.omega_1^local_k)*0.5007522026922482;
+Q_RELAX.test_2[7][4]:=AT*t*0.3824103826488193;
+Q_RELAX.test_2[7][5]:=CT*t*0.1264560133035801;
+Q_RELAX.test_2[7][6]:=GT*t*0.2406378906553946;
+Q_RELAX.test_2[7][11]:=CG*t*Min(1000,RELAX.test.omega_1^local_k)*0.1344351325741675;
+Q_RELAX.test_2[7][15]:=CT*t*Min(1000,RELAX.test.omega_1^local_k)*0.2296926126195792;
+Q_RELAX.test_2[7][23]:=AC*t*Min(1000,RELAX.test.omega_1^local_k)*0.1214054057357627;
+Q_RELAX.test_2[7][39]:=t*Min(1000,RELAX.test.omega_1^local_k)*0.3053650319994416;
+Q_RELAX.test_2[7][53]:=AT*t*Min(1000,RELAX.test.omega_1^local_k)*0.250994522453953;
+Q_RELAX.test_2[8][0]:=t*Min(1000,RELAX.test.omega_1^local_k)*0.5007522026922482;
+Q_RELAX.test_2[8][4]:=CG*t*Min(1000,RELAX.test.omega_1^local_k)*0.1351200521140052;
+Q_RELAX.test_2[8][9]:=AC*t*Min(1000,RELAX.test.omega_1^local_k)*0.1264560133035801;
+Q_RELAX.test_2[8][10]:=t*0.2406378906553946;
+Q_RELAX.test_2[8][11]:=AT*t*Min(1000,RELAX.test.omega_1^local_k)*0.2504957133922061;
+Q_RELAX.test_2[8][12]:=GT*t*Min(1000,RELAX.test.omega_1^local_k)*0.2296926126195792;
+Q_RELAX.test_2[8][24]:=AC*t*0.1214054057357627;
+Q_RELAX.test_2[8][40]:=t*Min(1000,RELAX.test.omega_1^local_k)*0.3053650319994416;
+Q_RELAX.test_2[9][1]:=t*Min(1000,RELAX.test.omega_1^local_k)*0.5007522026922482;
+Q_RELAX.test_2[9][5]:=CG*t*Min(1000,RELAX.test.omega_1^local_k)*0.1351200521140052;
+Q_RELAX.test_2[9][8]:=AC*t*Min(1000,RELAX.test.omega_1^local_k)*0.3824103826488193;
+Q_RELAX.test_2[9][10]:=CG*t*Min(1000,RELAX.test.omega_1^local_k)*0.2406378906553946;
+Q_RELAX.test_2[9][11]:=CT*t*0.2504957133922061;
+Q_RELAX.test_2[9][13]:=GT*t*Min(1000,RELAX.test.omega_1^local_k)*0.2296926126195792;
+Q_RELAX.test_2[9][25]:=AC*t*Min(1000,RELAX.test.omega_1^local_k)*0.1214054057357627;
+Q_RELAX.test_2[9][41]:=t*Min(1000,RELAX.test.omega_1^local_k)*0.3053650319994416;
+Q_RELAX.test_2[9][54]:=AT*t*Min(1000,RELAX.test.omega_1^local_k)*0.250994522453953;
+Q_RELAX.test_2[10][2]:=t*Min(1000,RELAX.test.omega_1^local_k)*0.5007522026922482;
+Q_RELAX.test_2[10][6]:=CG*t*Min(1000,RELAX.test.omega_1^local_k)*0.1351200521140052;
+Q_RELAX.test_2[10][8]:=t*0.3824103826488193;
+Q_RELAX.test_2[10][9]:=CG*t*Min(1000,RELAX.test.omega_1^local_k)*0.1264560133035801;
+Q_RELAX.test_2[10][11]:=GT*t*Min(1000,RELAX.test.omega_1^local_k)*0.2504957133922061;
+Q_RELAX.test_2[10][14]:=GT*t*Min(1000,RELAX.test.omega_1^local_k)*0.2296926126195792;
+Q_RELAX.test_2[10][26]:=AC*t*0.1214054057357627;
+Q_RELAX.test_2[10][42]:=t*Min(1000,RELAX.test.omega_1^local_k)*0.3053650319994416;
+Q_RELAX.test_2[10][55]:=AT*t*Min(1000,RELAX.test.omega_1^local_k)*0.250994522453953;
+Q_RELAX.test_2[11][3]:=t*Min(1000,RELAX.test.omega_1^local_k)*0.5007522026922482;
+Q_RELAX.test_2[11][7]:=CG*t*Min(1000,RELAX.test.omega_1^local_k)*0.1351200521140052;
+Q_RELAX.test_2[11][8]:=AT*t*Min(1000,RELAX.test.omega_1^local_k)*0.3824103826488193;
+Q_RELAX.test_2[11][9]:=CT*t*0.1264560133035801;
+Q_RELAX.test_2[11][10]:=GT*t*Min(1000,RELAX.test.omega_1^local_k)*0.2406378906553946;
+Q_RELAX.test_2[11][15]:=GT*t*Min(1000,RELAX.test.omega_1^local_k)*0.2296926126195792;
+Q_RELAX.test_2[11][27]:=AC*t*Min(1000,RELAX.test.omega_1^local_k)*0.1214054057357627;
+Q_RELAX.test_2[11][43]:=t*Min(1000,RELAX.test.omega_1^local_k)*0.3053650319994416;
+Q_RELAX.test_2[11][56]:=AT*t*Min(1000,RELAX.test.omega_1^local_k)*0.250994522453953;
+Q_RELAX.test_2[12][0]:=AT*t*Min(1000,RELAX.test.omega_1^local_k)*0.5007522026922482;
+Q_RELAX.test_2[12][4]:=CT*t*Min(1000,RELAX.test.omega_1^local_k)*0.1351200521140052;
+Q_RELAX.test_2[12][8]:=GT*t*Min(1000,RELAX.test.omega_1^local_k)*0.1344351325741675;
+Q_RELAX.test_2[12][13]:=AC*t*0.1264560133035801;
+Q_RELAX.test_2[12][14]:=t*Min(1000,RELAX.test.omega_1^local_k)*0.2406378906553946;
+Q_RELAX.test_2[12][15]:=AT*t*0.2504957133922061;
+Q_RELAX.test_2[12][28]:=AC*t*Min(1000,RELAX.test.omega_1^local_k)*0.1214054057357627;
+Q_RELAX.test_2[12][44]:=t*Min(1000,RELAX.test.omega_1^local_k)*0.3053650319994416;
+Q_RELAX.test_2[12][57]:=AT*t*Min(1000,RELAX.test.omega_1^local_k)*0.250994522453953;
+Q_RELAX.test_2[13][1]:=AT*t*Min(1000,RELAX.test.omega_1^local_k)*0.5007522026922482;
+Q_RELAX.test_2[13][5]:=CT*t*Min(1000,RELAX.test.omega_1^local_k)*0.1351200521140052;
+Q_RELAX.test_2[13][9]:=GT*t*Min(1000,RELAX.test.omega_1^local_k)*0.1344351325741675;
+Q_RELAX.test_2[13][12]:=AC*t*0.3824103826488193;
+Q_RELAX.test_2[13][14]:=CG*t*Min(1000,RELAX.test.omega_1^local_k)*0.2406378906553946;
+Q_RELAX.test_2[13][15]:=CT*t*0.2504957133922061;
+Q_RELAX.test_2[13][29]:=AC*t*Min(1000,RELAX.test.omega_1^local_k)*0.1214054057357627;
+Q_RELAX.test_2[13][45]:=t*Min(1000,RELAX.test.omega_1^local_k)*0.3053650319994416;
+Q_RELAX.test_2[13][58]:=AT*t*Min(1000,RELAX.test.omega_1^local_k)*0.250994522453953;
+Q_RELAX.test_2[14][2]:=AT*t*Min(1000,RELAX.test.omega_1^local_k)*0.5007522026922482;
+Q_RELAX.test_2[14][6]:=CT*t*Min(1000,RELAX.test.omega_1^local_k)*0.1351200521140052;
+Q_RELAX.test_2[14][10]:=GT*t*Min(1000,RELAX.test.omega_1^local_k)*0.1344351325741675;
+Q_RELAX.test_2[14][12]:=t*Min(1000,RELAX.test.omega_1^local_k)*0.3824103826488193;
+Q_RELAX.test_2[14][13]:=CG*t*Min(1000,RELAX.test.omega_1^local_k)*0.1264560133035801;
+Q_RELAX.test_2[14][15]:=GT*t*Min(1000,RELAX.test.omega_1^local_k)*0.2504957133922061;
+Q_RELAX.test_2[14][30]:=AC*t*Min(1000,RELAX.test.omega_1^local_k)*0.1214054057357627;
+Q_RELAX.test_2[14][46]:=t*Min(1000,RELAX.test.omega_1^local_k)*0.3053650319994416;
+Q_RELAX.test_2[14][59]:=AT*t*Min(1000,RELAX.test.omega_1^local_k)*0.250994522453953;
+Q_RELAX.test_2[15][3]:=AT*t*Min(1000,RELAX.test.omega_1^local_k)*0.5007522026922482;
+Q_RELAX.test_2[15][7]:=CT*t*Min(1000,RELAX.test.omega_1^local_k)*0.1351200521140052;
+Q_RELAX.test_2[15][11]:=GT*t*Min(1000,RELAX.test.omega_1^local_k)*0.1344351325741675;
+Q_RELAX.test_2[15][12]:=AT*t*0.3824103826488193;
+Q_RELAX.test_2[15][13]:=CT*t*0.1264560133035801;
+Q_RELAX.test_2[15][14]:=GT*t*Min(1000,RELAX.test.omega_1^local_k)*0.2406378906553946;
+Q_RELAX.test_2[15][31]:=AC*t*Min(1000,RELAX.test.omega_1^local_k)*0.1214054057357627;
+Q_RELAX.test_2[15][47]:=t*Min(1000,RELAX.test.omega_1^local_k)*0.3053650319994416;
+Q_RELAX.test_2[15][60]:=AT*t*Min(1000,RELAX.test.omega_1^local_k)*0.250994522453953;
+Q_RELAX.test_2[16][0]:=AC*t*Min(1000,RELAX.test.omega_1^local_k)*0.3222350398108426;
+Q_RELAX.test_2[16][17]:=AC*t*Min(1000,RELAX.test.omega_1^local_k)*0.1264560133035801;
+Q_RELAX.test_2[16][18]:=t*0.2406378906553946;
+Q_RELAX.test_2[16][19]:=AT*t*Min(1000,RELAX.test.omega_1^local_k)*0.2504957133922061;
+Q_RELAX.test_2[16][20]:=AC*t*Min(1000,RELAX.test.omega_1^local_k)*0.1351200521140052;
+Q_RELAX.test_2[16][24]:=t*Min(1000,RELAX.test.omega_1^local_k)*0.1344351325741675;
+Q_RELAX.test_2[16][28]:=AT*t*Min(1000,RELAX.test.omega_1^local_k)*0.2296926126195792;
+Q_RELAX.test_2[16][32]:=CG*t*Min(1000,RELAX.test.omega_1^local_k)*0.3053650319994416;
+Q_RELAX.test_2[17][1]:=AC*t*Min(1000,RELAX.test.omega_1^local_k)*0.3222350398108426;
+Q_RELAX.test_2[17][16]:=AC*t*Min(1000,RELAX.test.omega_1^local_k)*0.3824103826488193;
+Q_RELAX.test_2[17][18]:=CG*t*Min(1000,RELAX.test.omega_1^local_k)*0.2406378906553946;
+Q_RELAX.test_2[17][19]:=CT*t*0.2504957133922061;
+Q_RELAX.test_2[17][21]:=AC*t*Min(1000,RELAX.test.omega_1^local_k)*0.1351200521140052;
+Q_RELAX.test_2[17][25]:=t*Min(1000,RELAX.test.omega_1^local_k)*0.1344351325741675;
+Q_RELAX.test_2[17][29]:=AT*t*Min(1000,RELAX.test.omega_1^local_k)*0.2296926126195792;
+Q_RELAX.test_2[17][33]:=CG*t*Min(1000,RELAX.test.omega_1^local_k)*0.3053650319994416;
+Q_RELAX.test_2[17][48]:=CT*t*Min(1000,RELAX.test.omega_1^local_k)*0.250994522453953;
+Q_RELAX.test_2[18][2]:=AC*t*Min(1000,RELAX.test.omega_1^local_k)*0.3222350398108426;
+Q_RELAX.test_2[18][16]:=t*0.3824103826488193;
+Q_RELAX.test_2[18][17]:=CG*t*Min(1000,RELAX.test.omega_1^local_k)*0.1264560133035801;
+Q_RELAX.test_2[18][19]:=GT*t*Min(1000,RELAX.test.omega_1^local_k)*0.2504957133922061;
+Q_RELAX.test_2[18][22]:=AC*t*Min(1000,RELAX.test.omega_1^local_k)*0.1351200521140052;
+Q_RELAX.test_2[18][26]:=t*Min(1000,RELAX.test.omega_1^local_k)*0.1344351325741675;
+Q_RELAX.test_2[18][30]:=AT*t*Min(1000,RELAX.test.omega_1^local_k)*0.2296926126195792;
+Q_RELAX.test_2[18][34]:=CG*t*Min(1000,RELAX.test.omega_1^local_k)*0.3053650319994416;
+Q_RELAX.test_2[19][3]:=AC*t*Min(1000,RELAX.test.omega_1^local_k)*0.3222350398108426;
+Q_RELAX.test_2[19][16]:=AT*t*Min(1000,RELAX.test.omega_1^local_k)*0.3824103826488193;
+Q_RELAX.test_2[19][17]:=CT*t*0.1264560133035801;
+Q_RELAX.test_2[19][18]:=GT*t*Min(1000,RELAX.test.omega_1^local_k)*0.2406378906553946;
+Q_RELAX.test_2[19][23]:=AC*t*Min(1000,RELAX.test.omega_1^local_k)*0.1351200521140052;
+Q_RELAX.test_2[19][27]:=t*Min(1000,RELAX.test.omega_1^local_k)*0.1344351325741675;
+Q_RELAX.test_2[19][31]:=AT*t*Min(1000,RELAX.test.omega_1^local_k)*0.2296926126195792;
+Q_RELAX.test_2[19][35]:=CG*t*Min(1000,RELAX.test.omega_1^local_k)*0.3053650319994416;
+Q_RELAX.test_2[19][49]:=CT*t*Min(1000,RELAX.test.omega_1^local_k)*0.250994522453953;
+Q_RELAX.test_2[20][4]:=AC*t*Min(1000,RELAX.test.omega_1^local_k)*0.3222350398108426;
+Q_RELAX.test_2[20][16]:=AC*t*Min(1000,RELAX.test.omega_1^local_k)*0.5007522026922482;
+Q_RELAX.test_2[20][21]:=AC*t*0.1264560133035801;
+Q_RELAX.test_2[20][22]:=t*0.2406378906553946;
+Q_RELAX.test_2[20][23]:=AT*t*0.2504957133922061;
+Q_RELAX.test_2[20][24]:=CG*t*Min(1000,RELAX.test.omega_1^local_k)*0.1344351325741675;
+Q_RELAX.test_2[20][28]:=CT*t*Min(1000,RELAX.test.omega_1^local_k)*0.2296926126195792;
+Q_RELAX.test_2[20][36]:=CG*t*Min(1000,RELAX.test.omega_1^local_k)*0.3053650319994416;
+Q_RELAX.test_2[20][50]:=CT*t*Min(1000,RELAX.test.omega_1^local_k)*0.250994522453953;
+Q_RELAX.test_2[21][5]:=AC*t*Min(1000,RELAX.test.omega_1^local_k)*0.3222350398108426;
+Q_RELAX.test_2[21][17]:=AC*t*Min(1000,RELAX.test.omega_1^local_k)*0.5007522026922482;
+Q_RELAX.test_2[21][20]:=AC*t*0.3824103826488193;
+Q_RELAX.test_2[21][22]:=CG*t*0.2406378906553946;
+Q_RELAX.test_2[21][23]:=CT*t*0.2504957133922061;
+Q_RELAX.test_2[21][25]:=CG*t*Min(1000,RELAX.test.omega_1^local_k)*0.1344351325741675;
+Q_RELAX.test_2[21][29]:=CT*t*Min(1000,RELAX.test.omega_1^local_k)*0.2296926126195792;
+Q_RELAX.test_2[21][37]:=CG*t*Min(1000,RELAX.test.omega_1^local_k)*0.3053650319994416;
+Q_RELAX.test_2[21][51]:=CT*t*Min(1000,RELAX.test.omega_1^local_k)*0.250994522453953;
+Q_RELAX.test_2[22][6]:=AC*t*Min(1000,RELAX.test.omega_1^local_k)*0.3222350398108426;
+Q_RELAX.test_2[22][18]:=AC*t*Min(1000,RELAX.test.omega_1^local_k)*0.5007522026922482;
+Q_RELAX.test_2[22][20]:=t*0.3824103826488193;
+Q_RELAX.test_2[22][21]:=CG*t*0.1264560133035801;
+Q_RELAX.test_2[22][23]:=GT*t*0.2504957133922061;
+Q_RELAX.test_2[22][26]:=CG*t*Min(1000,RELAX.test.omega_1^local_k)*0.1344351325741675;
+Q_RELAX.test_2[22][30]:=CT*t*Min(1000,RELAX.test.omega_1^local_k)*0.2296926126195792;
+Q_RELAX.test_2[22][38]:=CG*t*Min(1000,RELAX.test.omega_1^local_k)*0.3053650319994416;
+Q_RELAX.test_2[22][52]:=CT*t*Min(1000,RELAX.test.omega_1^local_k)*0.250994522453953;
+Q_RELAX.test_2[23][7]:=AC*t*Min(1000,RELAX.test.omega_1^local_k)*0.3222350398108426;
+Q_RELAX.test_2[23][19]:=AC*t*Min(1000,RELAX.test.omega_1^local_k)*0.5007522026922482;
+Q_RELAX.test_2[23][20]:=AT*t*0.3824103826488193;
+Q_RELAX.test_2[23][21]:=CT*t*0.1264560133035801;
+Q_RELAX.test_2[23][22]:=GT*t*0.2406378906553946;
+Q_RELAX.test_2[23][27]:=CG*t*Min(1000,RELAX.test.omega_1^local_k)*0.1344351325741675;
+Q_RELAX.test_2[23][31]:=CT*t*Min(1000,RELAX.test.omega_1^local_k)*0.2296926126195792;
+Q_RELAX.test_2[23][39]:=CG*t*Min(1000,RELAX.test.omega_1^local_k)*0.3053650319994416;
+Q_RELAX.test_2[23][53]:=CT*t*Min(1000,RELAX.test.omega_1^local_k)*0.250994522453953;
+Q_RELAX.test_2[24][8]:=AC*t*0.3222350398108426;
+Q_RELAX.test_2[24][16]:=t*Min(1000,RELAX.test.omega_1^local_k)*0.5007522026922482;
+Q_RELAX.test_2[24][20]:=CG*t*Min(1000,RELAX.test.omega_1^local_k)*0.1351200521140052;
+Q_RELAX.test_2[24][25]:=AC*t*0.1264560133035801;
+Q_RELAX.test_2[24][26]:=t*0.2406378906553946;
+Q_RELAX.test_2[24][27]:=AT*t*0.2504957133922061;
+Q_RELAX.test_2[24][28]:=GT*t*Min(1000,RELAX.test.omega_1^local_k)*0.2296926126195792;
+Q_RELAX.test_2[24][40]:=CG*t*Min(1000,RELAX.test.omega_1^local_k)*0.3053650319994416;
+Q_RELAX.test_2[25][9]:=AC*t*Min(1000,RELAX.test.omega_1^local_k)*0.3222350398108426;
+Q_RELAX.test_2[25][17]:=t*Min(1000,RELAX.test.omega_1^local_k)*0.5007522026922482;
+Q_RELAX.test_2[25][21]:=CG*t*Min(1000,RELAX.test.omega_1^local_k)*0.1351200521140052;
+Q_RELAX.test_2[25][24]:=AC*t*0.3824103826488193;
+Q_RELAX.test_2[25][26]:=CG*t*0.2406378906553946;
+Q_RELAX.test_2[25][27]:=CT*t*0.2504957133922061;
+Q_RELAX.test_2[25][29]:=GT*t*Min(1000,RELAX.test.omega_1^local_k)*0.2296926126195792;
+Q_RELAX.test_2[25][41]:=CG*t*Min(1000,RELAX.test.omega_1^local_k)*0.3053650319994416;
+Q_RELAX.test_2[25][54]:=CT*t*Min(1000,RELAX.test.omega_1^local_k)*0.250994522453953;
+Q_RELAX.test_2[26][10]:=AC*t*0.3222350398108426;
+Q_RELAX.test_2[26][18]:=t*Min(1000,RELAX.test.omega_1^local_k)*0.5007522026922482;
+Q_RELAX.test_2[26][22]:=CG*t*Min(1000,RELAX.test.omega_1^local_k)*0.1351200521140052;
+Q_RELAX.test_2[26][24]:=t*0.3824103826488193;
+Q_RELAX.test_2[26][25]:=CG*t*0.1264560133035801;
+Q_RELAX.test_2[26][27]:=GT*t*0.2504957133922061;
+Q_RELAX.test_2[26][30]:=GT*t*Min(1000,RELAX.test.omega_1^local_k)*0.2296926126195792;
+Q_RELAX.test_2[26][42]:=CG*t*Min(1000,RELAX.test.omega_1^local_k)*0.3053650319994416;
+Q_RELAX.test_2[26][55]:=CT*t*Min(1000,RELAX.test.omega_1^local_k)*0.250994522453953;
+Q_RELAX.test_2[27][11]:=AC*t*Min(1000,RELAX.test.omega_1^local_k)*0.3222350398108426;
+Q_RELAX.test_2[27][19]:=t*Min(1000,RELAX.test.omega_1^local_k)*0.5007522026922482;
+Q_RELAX.test_2[27][23]:=CG*t*Min(1000,RELAX.test.omega_1^local_k)*0.1351200521140052;
+Q_RELAX.test_2[27][24]:=AT*t*0.3824103826488193;
+Q_RELAX.test_2[27][25]:=CT*t*0.1264560133035801;
+Q_RELAX.test_2[27][26]:=GT*t*0.2406378906553946;
+Q_RELAX.test_2[27][31]:=GT*t*Min(1000,RELAX.test.omega_1^local_k)*0.2296926126195792;
+Q_RELAX.test_2[27][43]:=CG*t*Min(1000,RELAX.test.omega_1^local_k)*0.3053650319994416;
+Q_RELAX.test_2[27][56]:=CT*t*Min(1000,RELAX.test.omega_1^local_k)*0.250994522453953;
+Q_RELAX.test_2[28][12]:=AC*t*Min(1000,RELAX.test.omega_1^local_k)*0.3222350398108426;
+Q_RELAX.test_2[28][16]:=AT*t*Min(1000,RELAX.test.omega_1^local_k)*0.5007522026922482;
+Q_RELAX.test_2[28][20]:=CT*t*Min(1000,RELAX.test.omega_1^local_k)*0.1351200521140052;
+Q_RELAX.test_2[28][24]:=GT*t*Min(1000,RELAX.test.omega_1^local_k)*0.1344351325741675;
+Q_RELAX.test_2[28][29]:=AC*t*0.1264560133035801;
+Q_RELAX.test_2[28][30]:=t*0.2406378906553946;
+Q_RELAX.test_2[28][31]:=AT*t*0.2504957133922061;
+Q_RELAX.test_2[28][44]:=CG*t*Min(1000,RELAX.test.omega_1^local_k)*0.3053650319994416;
+Q_RELAX.test_2[28][57]:=CT*t*0.250994522453953;
+Q_RELAX.test_2[29][13]:=AC*t*Min(1000,RELAX.test.omega_1^local_k)*0.3222350398108426;
+Q_RELAX.test_2[29][17]:=AT*t*Min(1000,RELAX.test.omega_1^local_k)*0.5007522026922482;
+Q_RELAX.test_2[29][21]:=CT*t*Min(1000,RELAX.test.omega_1^local_k)*0.1351200521140052;
+Q_RELAX.test_2[29][25]:=GT*t*Min(1000,RELAX.test.omega_1^local_k)*0.1344351325741675;
+Q_RELAX.test_2[29][28]:=AC*t*0.3824103826488193;
+Q_RELAX.test_2[29][30]:=CG*t*0.2406378906553946;
+Q_RELAX.test_2[29][31]:=CT*t*0.2504957133922061;
+Q_RELAX.test_2[29][45]:=CG*t*Min(1000,RELAX.test.omega_1^local_k)*0.3053650319994416;
+Q_RELAX.test_2[29][58]:=CT*t*Min(1000,RELAX.test.omega_1^local_k)*0.250994522453953;
+Q_RELAX.test_2[30][14]:=AC*t*Min(1000,RELAX.test.omega_1^local_k)*0.3222350398108426;
+Q_RELAX.test_2[30][18]:=AT*t*Min(1000,RELAX.test.omega_1^local_k)*0.5007522026922482;
+Q_RELAX.test_2[30][22]:=CT*t*Min(1000,RELAX.test.omega_1^local_k)*0.1351200521140052;
+Q_RELAX.test_2[30][26]:=GT*t*Min(1000,RELAX.test.omega_1^local_k)*0.1344351325741675;
+Q_RELAX.test_2[30][28]:=t*0.3824103826488193;
+Q_RELAX.test_2[30][29]:=CG*t*0.1264560133035801;
+Q_RELAX.test_2[30][31]:=GT*t*0.2504957133922061;
+Q_RELAX.test_2[30][46]:=CG*t*Min(1000,RELAX.test.omega_1^local_k)*0.3053650319994416;
+Q_RELAX.test_2[30][59]:=CT*t*0.250994522453953;
+Q_RELAX.test_2[31][15]:=AC*t*Min(1000,RELAX.test.omega_1^local_k)*0.3222350398108426;
+Q_RELAX.test_2[31][19]:=AT*t*Min(1000,RELAX.test.omega_1^local_k)*0.5007522026922482;
+Q_RELAX.test_2[31][23]:=CT*t*Min(1000,RELAX.test.omega_1^local_k)*0.1351200521140052;
+Q_RELAX.test_2[31][27]:=GT*t*Min(1000,RELAX.test.omega_1^local_k)*0.1344351325741675;
+Q_RELAX.test_2[31][28]:=AT*t*0.3824103826488193;
+Q_RELAX.test_2[31][29]:=CT*t*0.1264560133035801;
+Q_RELAX.test_2[31][30]:=GT*t*0.2406378906553946;
+Q_RELAX.test_2[31][47]:=CG*t*Min(1000,RELAX.test.omega_1^local_k)*0.3053650319994416;
+Q_RELAX.test_2[31][60]:=CT*t*Min(1000,RELAX.test.omega_1^local_k)*0.250994522453953;
+Q_RELAX.test_2[32][0]:=t*Min(1000,RELAX.test.omega_1^local_k)*0.3222350398108426;
+Q_RELAX.test_2[32][16]:=CG*t*Min(1000,RELAX.test.omega_1^local_k)*0.1214054057357627;
+Q_RELAX.test_2[32][33]:=AC*t*Min(1000,RELAX.test.omega_1^local_k)*0.1264560133035801;
+Q_RELAX.test_2[32][34]:=t*0.2406378906553946;
+Q_RELAX.test_2[32][35]:=AT*t*Min(1000,RELAX.test.omega_1^local_k)*0.2504957133922061;
+Q_RELAX.test_2[32][36]:=AC*t*Min(1000,RELAX.test.omega_1^local_k)*0.1351200521140052;
+Q_RELAX.test_2[32][40]:=t*Min(1000,RELAX.test.omega_1^local_k)*0.1344351325741675;
+Q_RELAX.test_2[32][44]:=AT*t*Min(1000,RELAX.test.omega_1^local_k)*0.2296926126195792;
+Q_RELAX.test_2[33][1]:=t*Min(1000,RELAX.test.omega_1^local_k)*0.3222350398108426;
+Q_RELAX.test_2[33][17]:=CG*t*Min(1000,RELAX.test.omega_1^local_k)*0.1214054057357627;
+Q_RELAX.test_2[33][32]:=AC*t*Min(1000,RELAX.test.omega_1^local_k)*0.3824103826488193;
+Q_RELAX.test_2[33][34]:=CG*t*Min(1000,RELAX.test.omega_1^local_k)*0.2406378906553946;
+Q_RELAX.test_2[33][35]:=CT*t*0.2504957133922061;
+Q_RELAX.test_2[33][37]:=AC*t*Min(1000,RELAX.test.omega_1^local_k)*0.1351200521140052;
+Q_RELAX.test_2[33][41]:=t*Min(1000,RELAX.test.omega_1^local_k)*0.1344351325741675;
+Q_RELAX.test_2[33][45]:=AT*t*Min(1000,RELAX.test.omega_1^local_k)*0.2296926126195792;
+Q_RELAX.test_2[33][48]:=GT*t*Min(1000,RELAX.test.omega_1^local_k)*0.250994522453953;
+Q_RELAX.test_2[34][2]:=t*Min(1000,RELAX.test.omega_1^local_k)*0.3222350398108426;
+Q_RELAX.test_2[34][18]:=CG*t*Min(1000,RELAX.test.omega_1^local_k)*0.1214054057357627;
+Q_RELAX.test_2[34][32]:=t*0.3824103826488193;
+Q_RELAX.test_2[34][33]:=CG*t*Min(1000,RELAX.test.omega_1^local_k)*0.1264560133035801;
+Q_RELAX.test_2[34][35]:=GT*t*Min(1000,RELAX.test.omega_1^local_k)*0.2504957133922061;
+Q_RELAX.test_2[34][38]:=AC*t*Min(1000,RELAX.test.omega_1^local_k)*0.1351200521140052;
+Q_RELAX.test_2[34][42]:=t*Min(1000,RELAX.test.omega_1^local_k)*0.1344351325741675;
+Q_RELAX.test_2[34][46]:=AT*t*Min(1000,RELAX.test.omega_1^local_k)*0.2296926126195792;
+Q_RELAX.test_2[35][3]:=t*Min(1000,RELAX.test.omega_1^local_k)*0.3222350398108426;
+Q_RELAX.test_2[35][19]:=CG*t*Min(1000,RELAX.test.omega_1^local_k)*0.1214054057357627;
+Q_RELAX.test_2[35][32]:=AT*t*Min(1000,RELAX.test.omega_1^local_k)*0.3824103826488193;
+Q_RELAX.test_2[35][33]:=CT*t*0.1264560133035801;
+Q_RELAX.test_2[35][34]:=GT*t*Min(1000,RELAX.test.omega_1^local_k)*0.2406378906553946;
+Q_RELAX.test_2[35][39]:=AC*t*Min(1000,RELAX.test.omega_1^local_k)*0.1351200521140052;
+Q_RELAX.test_2[35][43]:=t*Min(1000,RELAX.test.omega_1^local_k)*0.1344351325741675;
+Q_RELAX.test_2[35][47]:=AT*t*Min(1000,RELAX.test.omega_1^local_k)*0.2296926126195792;
+Q_RELAX.test_2[35][49]:=GT*t*Min(1000,RELAX.test.omega_1^local_k)*0.250994522453953;
+Q_RELAX.test_2[36][4]:=t*Min(1000,RELAX.test.omega_1^local_k)*0.3222350398108426;
+Q_RELAX.test_2[36][20]:=CG*t*Min(1000,RELAX.test.omega_1^local_k)*0.1214054057357627;
+Q_RELAX.test_2[36][32]:=AC*t*Min(1000,RELAX.test.omega_1^local_k)*0.5007522026922482;
+Q_RELAX.test_2[36][37]:=AC*t*0.1264560133035801;
+Q_RELAX.test_2[36][38]:=t*0.2406378906553946;
+Q_RELAX.test_2[36][39]:=AT*t*0.2504957133922061;
+Q_RELAX.test_2[36][40]:=CG*t*Min(1000,RELAX.test.omega_1^local_k)*0.1344351325741675;
+Q_RELAX.test_2[36][44]:=CT*t*Min(1000,RELAX.test.omega_1^local_k)*0.2296926126195792;
+Q_RELAX.test_2[36][50]:=GT*t*Min(1000,RELAX.test.omega_1^local_k)*0.250994522453953;
+Q_RELAX.test_2[37][5]:=t*Min(1000,RELAX.test.omega_1^local_k)*0.3222350398108426;
+Q_RELAX.test_2[37][21]:=CG*t*Min(1000,RELAX.test.omega_1^local_k)*0.1214054057357627;
+Q_RELAX.test_2[37][33]:=AC*t*Min(1000,RELAX.test.omega_1^local_k)*0.5007522026922482;
+Q_RELAX.test_2[37][36]:=AC*t*0.3824103826488193;
+Q_RELAX.test_2[37][38]:=CG*t*0.2406378906553946;
+Q_RELAX.test_2[37][39]:=CT*t*0.2504957133922061;
+Q_RELAX.test_2[37][41]:=CG*t*Min(1000,RELAX.test.omega_1^local_k)*0.1344351325741675;
+Q_RELAX.test_2[37][45]:=CT*t*Min(1000,RELAX.test.omega_1^local_k)*0.2296926126195792;
+Q_RELAX.test_2[37][51]:=GT*t*Min(1000,RELAX.test.omega_1^local_k)*0.250994522453953;
+Q_RELAX.test_2[38][6]:=t*Min(1000,RELAX.test.omega_1^local_k)*0.3222350398108426;
+Q_RELAX.test_2[38][22]:=CG*t*Min(1000,RELAX.test.omega_1^local_k)*0.1214054057357627;
+Q_RELAX.test_2[38][34]:=AC*t*Min(1000,RELAX.test.omega_1^local_k)*0.5007522026922482;
+Q_RELAX.test_2[38][36]:=t*0.3824103826488193;
+Q_RELAX.test_2[38][37]:=CG*t*0.1264560133035801;
+Q_RELAX.test_2[38][39]:=GT*t*0.2504957133922061;
+Q_RELAX.test_2[38][42]:=CG*t*Min(1000,RELAX.test.omega_1^local_k)*0.1344351325741675;
+Q_RELAX.test_2[38][46]:=CT*t*Min(1000,RELAX.test.omega_1^local_k)*0.2296926126195792;
+Q_RELAX.test_2[38][52]:=GT*t*Min(1000,RELAX.test.omega_1^local_k)*0.250994522453953;
+Q_RELAX.test_2[39][7]:=t*Min(1000,RELAX.test.omega_1^local_k)*0.3222350398108426;
+Q_RELAX.test_2[39][23]:=CG*t*Min(1000,RELAX.test.omega_1^local_k)*0.1214054057357627;
+Q_RELAX.test_2[39][35]:=AC*t*Min(1000,RELAX.test.omega_1^local_k)*0.5007522026922482;
+Q_RELAX.test_2[39][36]:=AT*t*0.3824103826488193;
+Q_RELAX.test_2[39][37]:=CT*t*0.1264560133035801;
+Q_RELAX.test_2[39][38]:=GT*t*0.2406378906553946;
+Q_RELAX.test_2[39][43]:=CG*t*Min(1000,RELAX.test.omega_1^local_k)*0.1344351325741675;
+Q_RELAX.test_2[39][47]:=CT*t*Min(1000,RELAX.test.omega_1^local_k)*0.2296926126195792;
+Q_RELAX.test_2[39][53]:=GT*t*Min(1000,RELAX.test.omega_1^local_k)*0.250994522453953;
+Q_RELAX.test_2[40][8]:=t*Min(1000,RELAX.test.omega_1^local_k)*0.3222350398108426;
+Q_RELAX.test_2[40][24]:=CG*t*Min(1000,RELAX.test.omega_1^local_k)*0.1214054057357627;
+Q_RELAX.test_2[40][32]:=t*Min(1000,RELAX.test.omega_1^local_k)*0.5007522026922482;
+Q_RELAX.test_2[40][36]:=CG*t*Min(1000,RELAX.test.omega_1^local_k)*0.1351200521140052;
+Q_RELAX.test_2[40][41]:=AC*t*0.1264560133035801;
+Q_RELAX.test_2[40][42]:=t*0.2406378906553946;
+Q_RELAX.test_2[40][43]:=AT*t*0.2504957133922061;
+Q_RELAX.test_2[40][44]:=GT*t*Min(1000,RELAX.test.omega_1^local_k)*0.2296926126195792;
+Q_RELAX.test_2[41][9]:=t*Min(1000,RELAX.test.omega_1^local_k)*0.3222350398108426;
+Q_RELAX.test_2[41][25]:=CG*t*Min(1000,RELAX.test.omega_1^local_k)*0.1214054057357627;
+Q_RELAX.test_2[41][33]:=t*Min(1000,RELAX.test.omega_1^local_k)*0.5007522026922482;
+Q_RELAX.test_2[41][37]:=CG*t*Min(1000,RELAX.test.omega_1^local_k)*0.1351200521140052;
+Q_RELAX.test_2[41][40]:=AC*t*0.3824103826488193;
+Q_RELAX.test_2[41][42]:=CG*t*0.2406378906553946;
+Q_RELAX.test_2[41][43]:=CT*t*0.2504957133922061;
+Q_RELAX.test_2[41][45]:=GT*t*Min(1000,RELAX.test.omega_1^local_k)*0.2296926126195792;
+Q_RELAX.test_2[41][54]:=GT*t*Min(1000,RELAX.test.omega_1^local_k)*0.250994522453953;
+Q_RELAX.test_2[42][10]:=t*Min(1000,RELAX.test.omega_1^local_k)*0.3222350398108426;
+Q_RELAX.test_2[42][26]:=CG*t*Min(1000,RELAX.test.omega_1^local_k)*0.1214054057357627;
+Q_RELAX.test_2[42][34]:=t*Min(1000,RELAX.test.omega_1^local_k)*0.5007522026922482;
+Q_RELAX.test_2[42][38]:=CG*t*Min(1000,RELAX.test.omega_1^local_k)*0.1351200521140052;
+Q_RELAX.test_2[42][40]:=t*0.3824103826488193;
+Q_RELAX.test_2[42][41]:=CG*t*0.1264560133035801;
+Q_RELAX.test_2[42][43]:=GT*t*0.2504957133922061;
+Q_RELAX.test_2[42][46]:=GT*t*Min(1000,RELAX.test.omega_1^local_k)*0.2296926126195792;
+Q_RELAX.test_2[42][55]:=GT*t*Min(1000,RELAX.test.omega_1^local_k)*0.250994522453953;
+Q_RELAX.test_2[43][11]:=t*Min(1000,RELAX.test.omega_1^local_k)*0.3222350398108426;
+Q_RELAX.test_2[43][27]:=CG*t*Min(1000,RELAX.test.omega_1^local_k)*0.1214054057357627;
+Q_RELAX.test_2[43][35]:=t*Min(1000,RELAX.test.omega_1^local_k)*0.5007522026922482;
+Q_RELAX.test_2[43][39]:=CG*t*Min(1000,RELAX.test.omega_1^local_k)*0.1351200521140052;
+Q_RELAX.test_2[43][40]:=AT*t*0.3824103826488193;
+Q_RELAX.test_2[43][41]:=CT*t*0.1264560133035801;
+Q_RELAX.test_2[43][42]:=GT*t*0.2406378906553946;
+Q_RELAX.test_2[43][47]:=GT*t*Min(1000,RELAX.test.omega_1^local_k)*0.2296926126195792;
+Q_RELAX.test_2[43][56]:=GT*t*Min(1000,RELAX.test.omega_1^local_k)*0.250994522453953;
+Q_RELAX.test_2[44][12]:=t*Min(1000,RELAX.test.omega_1^local_k)*0.3222350398108426;
+Q_RELAX.test_2[44][28]:=CG*t*Min(1000,RELAX.test.omega_1^local_k)*0.1214054057357627;
+Q_RELAX.test_2[44][32]:=AT*t*Min(1000,RELAX.test.omega_1^local_k)*0.5007522026922482;
+Q_RELAX.test_2[44][36]:=CT*t*Min(1000,RELAX.test.omega_1^local_k)*0.1351200521140052;
+Q_RELAX.test_2[44][40]:=GT*t*Min(1000,RELAX.test.omega_1^local_k)*0.1344351325741675;
+Q_RELAX.test_2[44][45]:=AC*t*0.1264560133035801;
+Q_RELAX.test_2[44][46]:=t*0.2406378906553946;
+Q_RELAX.test_2[44][47]:=AT*t*0.2504957133922061;
+Q_RELAX.test_2[44][57]:=GT*t*Min(1000,RELAX.test.omega_1^local_k)*0.250994522453953;
+Q_RELAX.test_2[45][13]:=t*Min(1000,RELAX.test.omega_1^local_k)*0.3222350398108426;
+Q_RELAX.test_2[45][29]:=CG*t*Min(1000,RELAX.test.omega_1^local_k)*0.1214054057357627;
+Q_RELAX.test_2[45][33]:=AT*t*Min(1000,RELAX.test.omega_1^local_k)*0.5007522026922482;
+Q_RELAX.test_2[45][37]:=CT*t*Min(1000,RELAX.test.omega_1^local_k)*0.1351200521140052;
+Q_RELAX.test_2[45][41]:=GT*t*Min(1000,RELAX.test.omega_1^local_k)*0.1344351325741675;
+Q_RELAX.test_2[45][44]:=AC*t*0.3824103826488193;
+Q_RELAX.test_2[45][46]:=CG*t*0.2406378906553946;
+Q_RELAX.test_2[45][47]:=CT*t*0.2504957133922061;
+Q_RELAX.test_2[45][58]:=GT*t*Min(1000,RELAX.test.omega_1^local_k)*0.250994522453953;
+Q_RELAX.test_2[46][14]:=t*Min(1000,RELAX.test.omega_1^local_k)*0.3222350398108426;
+Q_RELAX.test_2[46][30]:=CG*t*Min(1000,RELAX.test.omega_1^local_k)*0.1214054057357627;
+Q_RELAX.test_2[46][34]:=AT*t*Min(1000,RELAX.test.omega_1^local_k)*0.5007522026922482;
+Q_RELAX.test_2[46][38]:=CT*t*Min(1000,RELAX.test.omega_1^local_k)*0.1351200521140052;
+Q_RELAX.test_2[46][42]:=GT*t*Min(1000,RELAX.test.omega_1^local_k)*0.1344351325741675;
+Q_RELAX.test_2[46][44]:=t*0.3824103826488193;
+Q_RELAX.test_2[46][45]:=CG*t*0.1264560133035801;
+Q_RELAX.test_2[46][47]:=GT*t*0.2504957133922061;
+Q_RELAX.test_2[46][59]:=GT*t*Min(1000,RELAX.test.omega_1^local_k)*0.250994522453953;
+Q_RELAX.test_2[47][15]:=t*Min(1000,RELAX.test.omega_1^local_k)*0.3222350398108426;
+Q_RELAX.test_2[47][31]:=CG*t*Min(1000,RELAX.test.omega_1^local_k)*0.1214054057357627;
+Q_RELAX.test_2[47][35]:=AT*t*Min(1000,RELAX.test.omega_1^local_k)*0.5007522026922482;
+Q_RELAX.test_2[47][39]:=CT*t*Min(1000,RELAX.test.omega_1^local_k)*0.1351200521140052;
+Q_RELAX.test_2[47][43]:=GT*t*Min(1000,RELAX.test.omega_1^local_k)*0.1344351325741675;
+Q_RELAX.test_2[47][44]:=AT*t*0.3824103826488193;
+Q_RELAX.test_2[47][45]:=CT*t*0.1264560133035801;
+Q_RELAX.test_2[47][46]:=GT*t*0.2406378906553946;
+Q_RELAX.test_2[47][60]:=GT*t*Min(1000,RELAX.test.omega_1^local_k)*0.250994522453953;
+Q_RELAX.test_2[48][1]:=AT*t*Min(1000,RELAX.test.omega_1^local_k)*0.3222350398108426;
+Q_RELAX.test_2[48][17]:=CT*t*Min(1000,RELAX.test.omega_1^local_k)*0.1214054057357627;
+Q_RELAX.test_2[48][33]:=GT*t*Min(1000,RELAX.test.omega_1^local_k)*0.3053650319994416;
+Q_RELAX.test_2[48][49]:=CT*t*0.2504957133922061;
+Q_RELAX.test_2[48][51]:=AC*t*Min(1000,RELAX.test.omega_1^local_k)*0.1351200521140052;
+Q_RELAX.test_2[48][54]:=t*Min(1000,RELAX.test.omega_1^local_k)*0.1344351325741675;
+Q_RELAX.test_2[48][58]:=AT*t*Min(1000,RELAX.test.omega_1^local_k)*0.2296926126195792;
+Q_RELAX.test_2[49][3]:=AT*t*Min(1000,RELAX.test.omega_1^local_k)*0.3222350398108426;
+Q_RELAX.test_2[49][19]:=CT*t*Min(1000,RELAX.test.omega_1^local_k)*0.1214054057357627;
+Q_RELAX.test_2[49][35]:=GT*t*Min(1000,RELAX.test.omega_1^local_k)*0.3053650319994416;
+Q_RELAX.test_2[49][48]:=CT*t*0.1264560133035801;
+Q_RELAX.test_2[49][53]:=AC*t*Min(1000,RELAX.test.omega_1^local_k)*0.1351200521140052;
+Q_RELAX.test_2[49][56]:=t*Min(1000,RELAX.test.omega_1^local_k)*0.1344351325741675;
+Q_RELAX.test_2[49][60]:=AT*t*Min(1000,RELAX.test.omega_1^local_k)*0.2296926126195792;
+Q_RELAX.test_2[50][4]:=AT*t*Min(1000,RELAX.test.omega_1^local_k)*0.3222350398108426;
+Q_RELAX.test_2[50][20]:=CT*t*Min(1000,RELAX.test.omega_1^local_k)*0.1214054057357627;
+Q_RELAX.test_2[50][36]:=GT*t*Min(1000,RELAX.test.omega_1^local_k)*0.3053650319994416;
+Q_RELAX.test_2[50][51]:=AC*t*0.1264560133035801;
+Q_RELAX.test_2[50][52]:=t*0.2406378906553946;
+Q_RELAX.test_2[50][53]:=AT*t*0.2504957133922061;
+Q_RELAX.test_2[50][57]:=CT*t*Min(1000,RELAX.test.omega_1^local_k)*0.2296926126195792;
+Q_RELAX.test_2[51][5]:=AT*t*Min(1000,RELAX.test.omega_1^local_k)*0.3222350398108426;
+Q_RELAX.test_2[51][21]:=CT*t*Min(1000,RELAX.test.omega_1^local_k)*0.1214054057357627;
+Q_RELAX.test_2[51][37]:=GT*t*Min(1000,RELAX.test.omega_1^local_k)*0.3053650319994416;
+Q_RELAX.test_2[51][48]:=AC*t*Min(1000,RELAX.test.omega_1^local_k)*0.5007522026922482;
+Q_RELAX.test_2[51][50]:=AC*t*0.3824103826488193;
+Q_RELAX.test_2[51][52]:=CG*t*0.2406378906553946;
+Q_RELAX.test_2[51][53]:=CT*t*0.2504957133922061;
+Q_RELAX.test_2[51][54]:=CG*t*Min(1000,RELAX.test.omega_1^local_k)*0.1344351325741675;
+Q_RELAX.test_2[51][58]:=CT*t*Min(1000,RELAX.test.omega_1^local_k)*0.2296926126195792;
+Q_RELAX.test_2[52][6]:=AT*t*Min(1000,RELAX.test.omega_1^local_k)*0.3222350398108426;
+Q_RELAX.test_2[52][22]:=CT*t*Min(1000,RELAX.test.omega_1^local_k)*0.1214054057357627;
+Q_RELAX.test_2[52][38]:=GT*t*Min(1000,RELAX.test.omega_1^local_k)*0.3053650319994416;
+Q_RELAX.test_2[52][50]:=t*0.3824103826488193;
+Q_RELAX.test_2[52][51]:=CG*t*0.1264560133035801;
+Q_RELAX.test_2[52][53]:=GT*t*0.2504957133922061;
+Q_RELAX.test_2[52][55]:=CG*t*Min(1000,RELAX.test.omega_1^local_k)*0.1344351325741675;
+Q_RELAX.test_2[52][59]:=CT*t*Min(1000,RELAX.test.omega_1^local_k)*0.2296926126195792;
+Q_RELAX.test_2[53][7]:=AT*t*Min(1000,RELAX.test.omega_1^local_k)*0.3222350398108426;
+Q_RELAX.test_2[53][23]:=CT*t*Min(1000,RELAX.test.omega_1^local_k)*0.1214054057357627;
+Q_RELAX.test_2[53][39]:=GT*t*Min(1000,RELAX.test.omega_1^local_k)*0.3053650319994416;
+Q_RELAX.test_2[53][49]:=AC*t*Min(1000,RELAX.test.omega_1^local_k)*0.5007522026922482;
+Q_RELAX.test_2[53][50]:=AT*t*0.3824103826488193;
+Q_RELAX.test_2[53][51]:=CT*t*0.1264560133035801;
+Q_RELAX.test_2[53][52]:=GT*t*0.2406378906553946;
+Q_RELAX.test_2[53][56]:=CG*t*Min(1000,RELAX.test.omega_1^local_k)*0.1344351325741675;
+Q_RELAX.test_2[53][60]:=CT*t*Min(1000,RELAX.test.omega_1^local_k)*0.2296926126195792;
+Q_RELAX.test_2[54][9]:=AT*t*Min(1000,RELAX.test.omega_1^local_k)*0.3222350398108426;
+Q_RELAX.test_2[54][25]:=CT*t*Min(1000,RELAX.test.omega_1^local_k)*0.1214054057357627;
+Q_RELAX.test_2[54][41]:=GT*t*Min(1000,RELAX.test.omega_1^local_k)*0.3053650319994416;
+Q_RELAX.test_2[54][48]:=t*Min(1000,RELAX.test.omega_1^local_k)*0.5007522026922482;
+Q_RELAX.test_2[54][51]:=CG*t*Min(1000,RELAX.test.omega_1^local_k)*0.1351200521140052;
+Q_RELAX.test_2[54][55]:=CG*t*Min(1000,RELAX.test.omega_1^local_k)*0.2406378906553946;
+Q_RELAX.test_2[54][56]:=CT*t*0.2504957133922061;
+Q_RELAX.test_2[54][58]:=GT*t*Min(1000,RELAX.test.omega_1^local_k)*0.2296926126195792;
+Q_RELAX.test_2[55][10]:=AT*t*Min(1000,RELAX.test.omega_1^local_k)*0.3222350398108426;
+Q_RELAX.test_2[55][26]:=CT*t*Min(1000,RELAX.test.omega_1^local_k)*0.1214054057357627;
+Q_RELAX.test_2[55][42]:=GT*t*Min(1000,RELAX.test.omega_1^local_k)*0.3053650319994416;
+Q_RELAX.test_2[55][52]:=CG*t*Min(1000,RELAX.test.omega_1^local_k)*0.1351200521140052;
+Q_RELAX.test_2[55][54]:=CG*t*Min(1000,RELAX.test.omega_1^local_k)*0.1264560133035801;
+Q_RELAX.test_2[55][56]:=GT*t*Min(1000,RELAX.test.omega_1^local_k)*0.2504957133922061;
+Q_RELAX.test_2[55][59]:=GT*t*Min(1000,RELAX.test.omega_1^local_k)*0.2296926126195792;
+Q_RELAX.test_2[56][11]:=AT*t*Min(1000,RELAX.test.omega_1^local_k)*0.3222350398108426;
+Q_RELAX.test_2[56][27]:=CT*t*Min(1000,RELAX.test.omega_1^local_k)*0.1214054057357627;
+Q_RELAX.test_2[56][43]:=GT*t*Min(1000,RELAX.test.omega_1^local_k)*0.3053650319994416;
+Q_RELAX.test_2[56][49]:=t*Min(1000,RELAX.test.omega_1^local_k)*0.5007522026922482;
+Q_RELAX.test_2[56][53]:=CG*t*Min(1000,RELAX.test.omega_1^local_k)*0.1351200521140052;
+Q_RELAX.test_2[56][54]:=CT*t*0.1264560133035801;
+Q_RELAX.test_2[56][55]:=GT*t*Min(1000,RELAX.test.omega_1^local_k)*0.2406378906553946;
+Q_RELAX.test_2[56][60]:=GT*t*Min(1000,RELAX.test.omega_1^local_k)*0.2296926126195792;
+Q_RELAX.test_2[57][12]:=AT*t*Min(1000,RELAX.test.omega_1^local_k)*0.3222350398108426;
+Q_RELAX.test_2[57][28]:=CT*t*0.1214054057357627;
+Q_RELAX.test_2[57][44]:=GT*t*Min(1000,RELAX.test.omega_1^local_k)*0.3053650319994416;
+Q_RELAX.test_2[57][50]:=CT*t*Min(1000,RELAX.test.omega_1^local_k)*0.1351200521140052;
+Q_RELAX.test_2[57][58]:=AC*t*Min(1000,RELAX.test.omega_1^local_k)*0.1264560133035801;
+Q_RELAX.test_2[57][59]:=t*0.2406378906553946;
+Q_RELAX.test_2[57][60]:=AT*t*Min(1000,RELAX.test.omega_1^local_k)*0.2504957133922061;
+Q_RELAX.test_2[58][13]:=AT*t*Min(1000,RELAX.test.omega_1^local_k)*0.3222350398108426;
+Q_RELAX.test_2[58][29]:=CT*t*Min(1000,RELAX.test.omega_1^local_k)*0.1214054057357627;
+Q_RELAX.test_2[58][45]:=GT*t*Min(1000,RELAX.test.omega_1^local_k)*0.3053650319994416;
+Q_RELAX.test_2[58][48]:=AT*t*Min(1000,RELAX.test.omega_1^local_k)*0.5007522026922482;
+Q_RELAX.test_2[58][51]:=CT*t*Min(1000,RELAX.test.omega_1^local_k)*0.1351200521140052;
+Q_RELAX.test_2[58][54]:=GT*t*Min(1000,RELAX.test.omega_1^local_k)*0.1344351325741675;
+Q_RELAX.test_2[58][57]:=AC*t*Min(1000,RELAX.test.omega_1^local_k)*0.3824103826488193;
+Q_RELAX.test_2[58][59]:=CG*t*Min(1000,RELAX.test.omega_1^local_k)*0.2406378906553946;
+Q_RELAX.test_2[58][60]:=CT*t*0.2504957133922061;
+Q_RELAX.test_2[59][14]:=AT*t*Min(1000,RELAX.test.omega_1^local_k)*0.3222350398108426;
+Q_RELAX.test_2[59][30]:=CT*t*0.1214054057357627;
+Q_RELAX.test_2[59][46]:=GT*t*Min(1000,RELAX.test.omega_1^local_k)*0.3053650319994416;
+Q_RELAX.test_2[59][52]:=CT*t*Min(1000,RELAX.test.omega_1^local_k)*0.1351200521140052;
+Q_RELAX.test_2[59][55]:=GT*t*Min(1000,RELAX.test.omega_1^local_k)*0.1344351325741675;
+Q_RELAX.test_2[59][57]:=t*0.3824103826488193;
+Q_RELAX.test_2[59][58]:=CG*t*Min(1000,RELAX.test.omega_1^local_k)*0.1264560133035801;
+Q_RELAX.test_2[59][60]:=GT*t*Min(1000,RELAX.test.omega_1^local_k)*0.2504957133922061;
+Q_RELAX.test_2[60][15]:=AT*t*Min(1000,RELAX.test.omega_1^local_k)*0.3222350398108426;
+Q_RELAX.test_2[60][31]:=CT*t*Min(1000,RELAX.test.omega_1^local_k)*0.1214054057357627;
+Q_RELAX.test_2[60][47]:=GT*t*Min(1000,RELAX.test.omega_1^local_k)*0.3053650319994416;
+Q_RELAX.test_2[60][49]:=AT*t*Min(1000,RELAX.test.omega_1^local_k)*0.5007522026922482;
+Q_RELAX.test_2[60][53]:=CT*t*Min(1000,RELAX.test.omega_1^local_k)*0.1351200521140052;
+Q_RELAX.test_2[60][56]:=GT*t*Min(1000,RELAX.test.omega_1^local_k)*0.1344351325741675;
+Q_RELAX.test_2[60][57]:=AT*t*Min(1000,RELAX.test.omega_1^local_k)*0.3824103826488193;
+Q_RELAX.test_2[60][58]:=CT*t*0.1264560133035801;
+Q_RELAX.test_2[60][59]:=GT*t*Min(1000,RELAX.test.omega_1^local_k)*0.2406378906553946;
+
+
+Q_RELAX.test_3={61,61};
+Q_RELAX.test_3[0][1]:=AC*t*Min(1000,RELAX.test.omega_2^local_k)*0.1264560133035801;
+Q_RELAX.test_3[0][2]:=t*0.2406378906553946;
+Q_RELAX.test_3[0][3]:=AT*t*Min(1000,RELAX.test.omega_2^local_k)*0.2504957133922061;
+Q_RELAX.test_3[0][4]:=AC*t*Min(1000,RELAX.test.omega_2^local_k)*0.1351200521140052;
+Q_RELAX.test_3[0][8]:=t*Min(1000,RELAX.test.omega_2^local_k)*0.1344351325741675;
+Q_RELAX.test_3[0][12]:=AT*t*Min(1000,RELAX.test.omega_2^local_k)*0.2296926126195792;
+Q_RELAX.test_3[0][16]:=AC*t*Min(1000,RELAX.test.omega_2^local_k)*0.1214054057357627;
+Q_RELAX.test_3[0][32]:=t*Min(1000,RELAX.test.omega_2^local_k)*0.3053650319994416;
+Q_RELAX.test_3[1][0]:=AC*t*Min(1000,RELAX.test.omega_2^local_k)*0.3824103826488193;
+Q_RELAX.test_3[1][2]:=CG*t*Min(1000,RELAX.test.omega_2^local_k)*0.2406378906553946;
+Q_RELAX.test_3[1][3]:=CT*t*0.2504957133922061;
+Q_RELAX.test_3[1][5]:=AC*t*Min(1000,RELAX.test.omega_2^local_k)*0.1351200521140052;
+Q_RELAX.test_3[1][9]:=t*Min(1000,RELAX.test.omega_2^local_k)*0.1344351325741675;
+Q_RELAX.test_3[1][13]:=AT*t*Min(1000,RELAX.test.omega_2^local_k)*0.2296926126195792;
+Q_RELAX.test_3[1][17]:=AC*t*Min(1000,RELAX.test.omega_2^local_k)*0.1214054057357627;
+Q_RELAX.test_3[1][33]:=t*Min(1000,RELAX.test.omega_2^local_k)*0.3053650319994416;
+Q_RELAX.test_3[1][48]:=AT*t*Min(1000,RELAX.test.omega_2^local_k)*0.250994522453953;
+Q_RELAX.test_3[2][0]:=t*0.3824103826488193;
+Q_RELAX.test_3[2][1]:=CG*t*Min(1000,RELAX.test.omega_2^local_k)*0.1264560133035801;
+Q_RELAX.test_3[2][3]:=GT*t*Min(1000,RELAX.test.omega_2^local_k)*0.2504957133922061;
+Q_RELAX.test_3[2][6]:=AC*t*Min(1000,RELAX.test.omega_2^local_k)*0.1351200521140052;
+Q_RELAX.test_3[2][10]:=t*Min(1000,RELAX.test.omega_2^local_k)*0.1344351325741675;
+Q_RELAX.test_3[2][14]:=AT*t*Min(1000,RELAX.test.omega_2^local_k)*0.2296926126195792;
+Q_RELAX.test_3[2][18]:=AC*t*Min(1000,RELAX.test.omega_2^local_k)*0.1214054057357627;
+Q_RELAX.test_3[2][34]:=t*Min(1000,RELAX.test.omega_2^local_k)*0.3053650319994416;
+Q_RELAX.test_3[3][0]:=AT*t*Min(1000,RELAX.test.omega_2^local_k)*0.3824103826488193;
+Q_RELAX.test_3[3][1]:=CT*t*0.1264560133035801;
+Q_RELAX.test_3[3][2]:=GT*t*Min(1000,RELAX.test.omega_2^local_k)*0.2406378906553946;
+Q_RELAX.test_3[3][7]:=AC*t*Min(1000,RELAX.test.omega_2^local_k)*0.1351200521140052;
+Q_RELAX.test_3[3][11]:=t*Min(1000,RELAX.test.omega_2^local_k)*0.1344351325741675;
+Q_RELAX.test_3[3][15]:=AT*t*Min(1000,RELAX.test.omega_2^local_k)*0.2296926126195792;
+Q_RELAX.test_3[3][19]:=AC*t*Min(1000,RELAX.test.omega_2^local_k)*0.1214054057357627;
+Q_RELAX.test_3[3][35]:=t*Min(1000,RELAX.test.omega_2^local_k)*0.3053650319994416;
+Q_RELAX.test_3[3][49]:=AT*t*Min(1000,RELAX.test.omega_2^local_k)*0.250994522453953;
+Q_RELAX.test_3[4][0]:=AC*t*Min(1000,RELAX.test.omega_2^local_k)*0.5007522026922482;
+Q_RELAX.test_3[4][5]:=AC*t*0.1264560133035801;
+Q_RELAX.test_3[4][6]:=t*0.2406378906553946;
+Q_RELAX.test_3[4][7]:=AT*t*0.2504957133922061;
+Q_RELAX.test_3[4][8]:=CG*t*Min(1000,RELAX.test.omega_2^local_k)*0.1344351325741675;
+Q_RELAX.test_3[4][12]:=CT*t*Min(1000,RELAX.test.omega_2^local_k)*0.2296926126195792;
+Q_RELAX.test_3[4][20]:=AC*t*Min(1000,RELAX.test.omega_2^local_k)*0.1214054057357627;
+Q_RELAX.test_3[4][36]:=t*Min(1000,RELAX.test.omega_2^local_k)*0.3053650319994416;
+Q_RELAX.test_3[4][50]:=AT*t*Min(1000,RELAX.test.omega_2^local_k)*0.250994522453953;
+Q_RELAX.test_3[5][1]:=AC*t*Min(1000,RELAX.test.omega_2^local_k)*0.5007522026922482;
+Q_RELAX.test_3[5][4]:=AC*t*0.3824103826488193;
+Q_RELAX.test_3[5][6]:=CG*t*0.2406378906553946;
+Q_RELAX.test_3[5][7]:=CT*t*0.2504957133922061;
+Q_RELAX.test_3[5][9]:=CG*t*Min(1000,RELAX.test.omega_2^local_k)*0.1344351325741675;
+Q_RELAX.test_3[5][13]:=CT*t*Min(1000,RELAX.test.omega_2^local_k)*0.2296926126195792;
+Q_RELAX.test_3[5][21]:=AC*t*Min(1000,RELAX.test.omega_2^local_k)*0.1214054057357627;
+Q_RELAX.test_3[5][37]:=t*Min(1000,RELAX.test.omega_2^local_k)*0.3053650319994416;
+Q_RELAX.test_3[5][51]:=AT*t*Min(1000,RELAX.test.omega_2^local_k)*0.250994522453953;
+Q_RELAX.test_3[6][2]:=AC*t*Min(1000,RELAX.test.omega_2^local_k)*0.5007522026922482;
+Q_RELAX.test_3[6][4]:=t*0.3824103826488193;
+Q_RELAX.test_3[6][5]:=CG*t*0.1264560133035801;
+Q_RELAX.test_3[6][7]:=GT*t*0.2504957133922061;
+Q_RELAX.test_3[6][10]:=CG*t*Min(1000,RELAX.test.omega_2^local_k)*0.1344351325741675;
+Q_RELAX.test_3[6][14]:=CT*t*Min(1000,RELAX.test.omega_2^local_k)*0.2296926126195792;
+Q_RELAX.test_3[6][22]:=AC*t*Min(1000,RELAX.test.omega_2^local_k)*0.1214054057357627;
+Q_RELAX.test_3[6][38]:=t*Min(1000,RELAX.test.omega_2^local_k)*0.3053650319994416;
+Q_RELAX.test_3[6][52]:=AT*t*Min(1000,RELAX.test.omega_2^local_k)*0.250994522453953;
+Q_RELAX.test_3[7][3]:=AC*t*Min(1000,RELAX.test.omega_2^local_k)*0.5007522026922482;
+Q_RELAX.test_3[7][4]:=AT*t*0.3824103826488193;
+Q_RELAX.test_3[7][5]:=CT*t*0.1264560133035801;
+Q_RELAX.test_3[7][6]:=GT*t*0.2406378906553946;
+Q_RELAX.test_3[7][11]:=CG*t*Min(1000,RELAX.test.omega_2^local_k)*0.1344351325741675;
+Q_RELAX.test_3[7][15]:=CT*t*Min(1000,RELAX.test.omega_2^local_k)*0.2296926126195792;
+Q_RELAX.test_3[7][23]:=AC*t*Min(1000,RELAX.test.omega_2^local_k)*0.1214054057357627;
+Q_RELAX.test_3[7][39]:=t*Min(1000,RELAX.test.omega_2^local_k)*0.3053650319994416;
+Q_RELAX.test_3[7][53]:=AT*t*Min(1000,RELAX.test.omega_2^local_k)*0.250994522453953;
+Q_RELAX.test_3[8][0]:=t*Min(1000,RELAX.test.omega_2^local_k)*0.5007522026922482;
+Q_RELAX.test_3[8][4]:=CG*t*Min(1000,RELAX.test.omega_2^local_k)*0.1351200521140052;
+Q_RELAX.test_3[8][9]:=AC*t*Min(1000,RELAX.test.omega_2^local_k)*0.1264560133035801;
+Q_RELAX.test_3[8][10]:=t*0.2406378906553946;
+Q_RELAX.test_3[8][11]:=AT*t*Min(1000,RELAX.test.omega_2^local_k)*0.2504957133922061;
+Q_RELAX.test_3[8][12]:=GT*t*Min(1000,RELAX.test.omega_2^local_k)*0.2296926126195792;
+Q_RELAX.test_3[8][24]:=AC*t*0.1214054057357627;
+Q_RELAX.test_3[8][40]:=t*Min(1000,RELAX.test.omega_2^local_k)*0.3053650319994416;
+Q_RELAX.test_3[9][1]:=t*Min(1000,RELAX.test.omega_2^local_k)*0.5007522026922482;
+Q_RELAX.test_3[9][5]:=CG*t*Min(1000,RELAX.test.omega_2^local_k)*0.1351200521140052;
+Q_RELAX.test_3[9][8]:=AC*t*Min(1000,RELAX.test.omega_2^local_k)*0.3824103826488193;
+Q_RELAX.test_3[9][10]:=CG*t*Min(1000,RELAX.test.omega_2^local_k)*0.2406378906553946;
+Q_RELAX.test_3[9][11]:=CT*t*0.2504957133922061;
+Q_RELAX.test_3[9][13]:=GT*t*Min(1000,RELAX.test.omega_2^local_k)*0.2296926126195792;
+Q_RELAX.test_3[9][25]:=AC*t*Min(1000,RELAX.test.omega_2^local_k)*0.1214054057357627;
+Q_RELAX.test_3[9][41]:=t*Min(1000,RELAX.test.omega_2^local_k)*0.3053650319994416;
+Q_RELAX.test_3[9][54]:=AT*t*Min(1000,RELAX.test.omega_2^local_k)*0.250994522453953;
+Q_RELAX.test_3[10][2]:=t*Min(1000,RELAX.test.omega_2^local_k)*0.5007522026922482;
+Q_RELAX.test_3[10][6]:=CG*t*Min(1000,RELAX.test.omega_2^local_k)*0.1351200521140052;
+Q_RELAX.test_3[10][8]:=t*0.3824103826488193;
+Q_RELAX.test_3[10][9]:=CG*t*Min(1000,RELAX.test.omega_2^local_k)*0.1264560133035801;
+Q_RELAX.test_3[10][11]:=GT*t*Min(1000,RELAX.test.omega_2^local_k)*0.2504957133922061;
+Q_RELAX.test_3[10][14]:=GT*t*Min(1000,RELAX.test.omega_2^local_k)*0.2296926126195792;
+Q_RELAX.test_3[10][26]:=AC*t*0.1214054057357627;
+Q_RELAX.test_3[10][42]:=t*Min(1000,RELAX.test.omega_2^local_k)*0.3053650319994416;
+Q_RELAX.test_3[10][55]:=AT*t*Min(1000,RELAX.test.omega_2^local_k)*0.250994522453953;
+Q_RELAX.test_3[11][3]:=t*Min(1000,RELAX.test.omega_2^local_k)*0.5007522026922482;
+Q_RELAX.test_3[11][7]:=CG*t*Min(1000,RELAX.test.omega_2^local_k)*0.1351200521140052;
+Q_RELAX.test_3[11][8]:=AT*t*Min(1000,RELAX.test.omega_2^local_k)*0.3824103826488193;
+Q_RELAX.test_3[11][9]:=CT*t*0.1264560133035801;
+Q_RELAX.test_3[11][10]:=GT*t*Min(1000,RELAX.test.omega_2^local_k)*0.2406378906553946;
+Q_RELAX.test_3[11][15]:=GT*t*Min(1000,RELAX.test.omega_2^local_k)*0.2296926126195792;
+Q_RELAX.test_3[11][27]:=AC*t*Min(1000,RELAX.test.omega_2^local_k)*0.1214054057357627;
+Q_RELAX.test_3[11][43]:=t*Min(1000,RELAX.test.omega_2^local_k)*0.3053650319994416;
+Q_RELAX.test_3[11][56]:=AT*t*Min(1000,RELAX.test.omega_2^local_k)*0.250994522453953;
+Q_RELAX.test_3[12][0]:=AT*t*Min(1000,RELAX.test.omega_2^local_k)*0.5007522026922482;
+Q_RELAX.test_3[12][4]:=CT*t*Min(1000,RELAX.test.omega_2^local_k)*0.1351200521140052;
+Q_RELAX.test_3[12][8]:=GT*t*Min(1000,RELAX.test.omega_2^local_k)*0.1344351325741675;
+Q_RELAX.test_3[12][13]:=AC*t*0.1264560133035801;
+Q_RELAX.test_3[12][14]:=t*Min(1000,RELAX.test.omega_2^local_k)*0.2406378906553946;
+Q_RELAX.test_3[12][15]:=AT*t*0.2504957133922061;
+Q_RELAX.test_3[12][28]:=AC*t*Min(1000,RELAX.test.omega_2^local_k)*0.1214054057357627;
+Q_RELAX.test_3[12][44]:=t*Min(1000,RELAX.test.omega_2^local_k)*0.3053650319994416;
+Q_RELAX.test_3[12][57]:=AT*t*Min(1000,RELAX.test.omega_2^local_k)*0.250994522453953;
+Q_RELAX.test_3[13][1]:=AT*t*Min(1000,RELAX.test.omega_2^local_k)*0.5007522026922482;
+Q_RELAX.test_3[13][5]:=CT*t*Min(1000,RELAX.test.omega_2^local_k)*0.1351200521140052;
+Q_RELAX.test_3[13][9]:=GT*t*Min(1000,RELAX.test.omega_2^local_k)*0.1344351325741675;
+Q_RELAX.test_3[13][12]:=AC*t*0.3824103826488193;
+Q_RELAX.test_3[13][14]:=CG*t*Min(1000,RELAX.test.omega_2^local_k)*0.2406378906553946;
+Q_RELAX.test_3[13][15]:=CT*t*0.2504957133922061;
+Q_RELAX.test_3[13][29]:=AC*t*Min(1000,RELAX.test.omega_2^local_k)*0.1214054057357627;
+Q_RELAX.test_3[13][45]:=t*Min(1000,RELAX.test.omega_2^local_k)*0.3053650319994416;
+Q_RELAX.test_3[13][58]:=AT*t*Min(1000,RELAX.test.omega_2^local_k)*0.250994522453953;
+Q_RELAX.test_3[14][2]:=AT*t*Min(1000,RELAX.test.omega_2^local_k)*0.5007522026922482;
+Q_RELAX.test_3[14][6]:=CT*t*Min(1000,RELAX.test.omega_2^local_k)*0.1351200521140052;
+Q_RELAX.test_3[14][10]:=GT*t*Min(1000,RELAX.test.omega_2^local_k)*0.1344351325741675;
+Q_RELAX.test_3[14][12]:=t*Min(1000,RELAX.test.omega_2^local_k)*0.3824103826488193;
+Q_RELAX.test_3[14][13]:=CG*t*Min(1000,RELAX.test.omega_2^local_k)*0.1264560133035801;
+Q_RELAX.test_3[14][15]:=GT*t*Min(1000,RELAX.test.omega_2^local_k)*0.2504957133922061;
+Q_RELAX.test_3[14][30]:=AC*t*Min(1000,RELAX.test.omega_2^local_k)*0.1214054057357627;
+Q_RELAX.test_3[14][46]:=t*Min(1000,RELAX.test.omega_2^local_k)*0.3053650319994416;
+Q_RELAX.test_3[14][59]:=AT*t*Min(1000,RELAX.test.omega_2^local_k)*0.250994522453953;
+Q_RELAX.test_3[15][3]:=AT*t*Min(1000,RELAX.test.omega_2^local_k)*0.5007522026922482;
+Q_RELAX.test_3[15][7]:=CT*t*Min(1000,RELAX.test.omega_2^local_k)*0.1351200521140052;
+Q_RELAX.test_3[15][11]:=GT*t*Min(1000,RELAX.test.omega_2^local_k)*0.1344351325741675;
+Q_RELAX.test_3[15][12]:=AT*t*0.3824103826488193;
+Q_RELAX.test_3[15][13]:=CT*t*0.1264560133035801;
+Q_RELAX.test_3[15][14]:=GT*t*Min(1000,RELAX.test.omega_2^local_k)*0.2406378906553946;
+Q_RELAX.test_3[15][31]:=AC*t*Min(1000,RELAX.test.omega_2^local_k)*0.1214054057357627;
+Q_RELAX.test_3[15][47]:=t*Min(1000,RELAX.test.omega_2^local_k)*0.3053650319994416;
+Q_RELAX.test_3[15][60]:=AT*t*Min(1000,RELAX.test.omega_2^local_k)*0.250994522453953;
+Q_RELAX.test_3[16][0]:=AC*t*Min(1000,RELAX.test.omega_2^local_k)*0.3222350398108426;
+Q_RELAX.test_3[16][17]:=AC*t*Min(1000,RELAX.test.omega_2^local_k)*0.1264560133035801;
+Q_RELAX.test_3[16][18]:=t*0.2406378906553946;
+Q_RELAX.test_3[16][19]:=AT*t*Min(1000,RELAX.test.omega_2^local_k)*0.2504957133922061;
+Q_RELAX.test_3[16][20]:=AC*t*Min(1000,RELAX.test.omega_2^local_k)*0.1351200521140052;
+Q_RELAX.test_3[16][24]:=t*Min(1000,RELAX.test.omega_2^local_k)*0.1344351325741675;
+Q_RELAX.test_3[16][28]:=AT*t*Min(1000,RELAX.test.omega_2^local_k)*0.2296926126195792;
+Q_RELAX.test_3[16][32]:=CG*t*Min(1000,RELAX.test.omega_2^local_k)*0.3053650319994416;
+Q_RELAX.test_3[17][1]:=AC*t*Min(1000,RELAX.test.omega_2^local_k)*0.3222350398108426;
+Q_RELAX.test_3[17][16]:=AC*t*Min(1000,RELAX.test.omega_2^local_k)*0.3824103826488193;
+Q_RELAX.test_3[17][18]:=CG*t*Min(1000,RELAX.test.omega_2^local_k)*0.2406378906553946;
+Q_RELAX.test_3[17][19]:=CT*t*0.2504957133922061;
+Q_RELAX.test_3[17][21]:=AC*t*Min(1000,RELAX.test.omega_2^local_k)*0.1351200521140052;
+Q_RELAX.test_3[17][25]:=t*Min(1000,RELAX.test.omega_2^local_k)*0.1344351325741675;
+Q_RELAX.test_3[17][29]:=AT*t*Min(1000,RELAX.test.omega_2^local_k)*0.2296926126195792;
+Q_RELAX.test_3[17][33]:=CG*t*Min(1000,RELAX.test.omega_2^local_k)*0.3053650319994416;
+Q_RELAX.test_3[17][48]:=CT*t*Min(1000,RELAX.test.omega_2^local_k)*0.250994522453953;
+Q_RELAX.test_3[18][2]:=AC*t*Min(1000,RELAX.test.omega_2^local_k)*0.3222350398108426;
+Q_RELAX.test_3[18][16]:=t*0.3824103826488193;
+Q_RELAX.test_3[18][17]:=CG*t*Min(1000,RELAX.test.omega_2^local_k)*0.1264560133035801;
+Q_RELAX.test_3[18][19]:=GT*t*Min(1000,RELAX.test.omega_2^local_k)*0.2504957133922061;
+Q_RELAX.test_3[18][22]:=AC*t*Min(1000,RELAX.test.omega_2^local_k)*0.1351200521140052;
+Q_RELAX.test_3[18][26]:=t*Min(1000,RELAX.test.omega_2^local_k)*0.1344351325741675;
+Q_RELAX.test_3[18][30]:=AT*t*Min(1000,RELAX.test.omega_2^local_k)*0.2296926126195792;
+Q_RELAX.test_3[18][34]:=CG*t*Min(1000,RELAX.test.omega_2^local_k)*0.3053650319994416;
+Q_RELAX.test_3[19][3]:=AC*t*Min(1000,RELAX.test.omega_2^local_k)*0.3222350398108426;
+Q_RELAX.test_3[19][16]:=AT*t*Min(1000,RELAX.test.omega_2^local_k)*0.3824103826488193;
+Q_RELAX.test_3[19][17]:=CT*t*0.1264560133035801;
+Q_RELAX.test_3[19][18]:=GT*t*Min(1000,RELAX.test.omega_2^local_k)*0.2406378906553946;
+Q_RELAX.test_3[19][23]:=AC*t*Min(1000,RELAX.test.omega_2^local_k)*0.1351200521140052;
+Q_RELAX.test_3[19][27]:=t*Min(1000,RELAX.test.omega_2^local_k)*0.1344351325741675;
+Q_RELAX.test_3[19][31]:=AT*t*Min(1000,RELAX.test.omega_2^local_k)*0.2296926126195792;
+Q_RELAX.test_3[19][35]:=CG*t*Min(1000,RELAX.test.omega_2^local_k)*0.3053650319994416;
+Q_RELAX.test_3[19][49]:=CT*t*Min(1000,RELAX.test.omega_2^local_k)*0.250994522453953;
+Q_RELAX.test_3[20][4]:=AC*t*Min(1000,RELAX.test.omega_2^local_k)*0.3222350398108426;
+Q_RELAX.test_3[20][16]:=AC*t*Min(1000,RELAX.test.omega_2^local_k)*0.5007522026922482;
+Q_RELAX.test_3[20][21]:=AC*t*0.1264560133035801;
+Q_RELAX.test_3[20][22]:=t*0.2406378906553946;
+Q_RELAX.test_3[20][23]:=AT*t*0.2504957133922061;
+Q_RELAX.test_3[20][24]:=CG*t*Min(1000,RELAX.test.omega_2^local_k)*0.1344351325741675;
+Q_RELAX.test_3[20][28]:=CT*t*Min(1000,RELAX.test.omega_2^local_k)*0.2296926126195792;
+Q_RELAX.test_3[20][36]:=CG*t*Min(1000,RELAX.test.omega_2^local_k)*0.3053650319994416;
+Q_RELAX.test_3[20][50]:=CT*t*Min(1000,RELAX.test.omega_2^local_k)*0.250994522453953;
+Q_RELAX.test_3[21][5]:=AC*t*Min(1000,RELAX.test.omega_2^local_k)*0.3222350398108426;
+Q_RELAX.test_3[21][17]:=AC*t*Min(1000,RELAX.test.omega_2^local_k)*0.5007522026922482;
+Q_RELAX.test_3[21][20]:=AC*t*0.3824103826488193;
+Q_RELAX.test_3[21][22]:=CG*t*0.2406378906553946;
+Q_RELAX.test_3[21][23]:=CT*t*0.2504957133922061;
+Q_RELAX.test_3[21][25]:=CG*t*Min(1000,RELAX.test.omega_2^local_k)*0.1344351325741675;
+Q_RELAX.test_3[21][29]:=CT*t*Min(1000,RELAX.test.omega_2^local_k)*0.2296926126195792;
+Q_RELAX.test_3[21][37]:=CG*t*Min(1000,RELAX.test.omega_2^local_k)*0.3053650319994416;
+Q_RELAX.test_3[21][51]:=CT*t*Min(1000,RELAX.test.omega_2^local_k)*0.250994522453953;
+Q_RELAX.test_3[22][6]:=AC*t*Min(1000,RELAX.test.omega_2^local_k)*0.3222350398108426;
+Q_RELAX.test_3[22][18]:=AC*t*Min(1000,RELAX.test.omega_2^local_k)*0.5007522026922482;
+Q_RELAX.test_3[22][20]:=t*0.3824103826488193;
+Q_RELAX.test_3[22][21]:=CG*t*0.1264560133035801;
+Q_RELAX.test_3[22][23]:=GT*t*0.2504957133922061;
+Q_RELAX.test_3[22][26]:=CG*t*Min(1000,RELAX.test.omega_2^local_k)*0.1344351325741675;
+Q_RELAX.test_3[22][30]:=CT*t*Min(1000,RELAX.test.omega_2^local_k)*0.2296926126195792;
+Q_RELAX.test_3[22][38]:=CG*t*Min(1000,RELAX.test.omega_2^local_k)*0.3053650319994416;
+Q_RELAX.test_3[22][52]:=CT*t*Min(1000,RELAX.test.omega_2^local_k)*0.250994522453953;
+Q_RELAX.test_3[23][7]:=AC*t*Min(1000,RELAX.test.omega_2^local_k)*0.3222350398108426;
+Q_RELAX.test_3[23][19]:=AC*t*Min(1000,RELAX.test.omega_2^local_k)*0.5007522026922482;
+Q_RELAX.test_3[23][20]:=AT*t*0.3824103826488193;
+Q_RELAX.test_3[23][21]:=CT*t*0.1264560133035801;
+Q_RELAX.test_3[23][22]:=GT*t*0.2406378906553946;
+Q_RELAX.test_3[23][27]:=CG*t*Min(1000,RELAX.test.omega_2^local_k)*0.1344351325741675;
+Q_RELAX.test_3[23][31]:=CT*t*Min(1000,RELAX.test.omega_2^local_k)*0.2296926126195792;
+Q_RELAX.test_3[23][39]:=CG*t*Min(1000,RELAX.test.omega_2^local_k)*0.3053650319994416;
+Q_RELAX.test_3[23][53]:=CT*t*Min(1000,RELAX.test.omega_2^local_k)*0.250994522453953;
+Q_RELAX.test_3[24][8]:=AC*t*0.3222350398108426;
+Q_RELAX.test_3[24][16]:=t*Min(1000,RELAX.test.omega_2^local_k)*0.5007522026922482;
+Q_RELAX.test_3[24][20]:=CG*t*Min(1000,RELAX.test.omega_2^local_k)*0.1351200521140052;
+Q_RELAX.test_3[24][25]:=AC*t*0.1264560133035801;
+Q_RELAX.test_3[24][26]:=t*0.2406378906553946;
+Q_RELAX.test_3[24][27]:=AT*t*0.2504957133922061;
+Q_RELAX.test_3[24][28]:=GT*t*Min(1000,RELAX.test.omega_2^local_k)*0.2296926126195792;
+Q_RELAX.test_3[24][40]:=CG*t*Min(1000,RELAX.test.omega_2^local_k)*0.3053650319994416;
+Q_RELAX.test_3[25][9]:=AC*t*Min(1000,RELAX.test.omega_2^local_k)*0.3222350398108426;
+Q_RELAX.test_3[25][17]:=t*Min(1000,RELAX.test.omega_2^local_k)*0.5007522026922482;
+Q_RELAX.test_3[25][21]:=CG*t*Min(1000,RELAX.test.omega_2^local_k)*0.1351200521140052;
+Q_RELAX.test_3[25][24]:=AC*t*0.3824103826488193;
+Q_RELAX.test_3[25][26]:=CG*t*0.2406378906553946;
+Q_RELAX.test_3[25][27]:=CT*t*0.2504957133922061;
+Q_RELAX.test_3[25][29]:=GT*t*Min(1000,RELAX.test.omega_2^local_k)*0.2296926126195792;
+Q_RELAX.test_3[25][41]:=CG*t*Min(1000,RELAX.test.omega_2^local_k)*0.3053650319994416;
+Q_RELAX.test_3[25][54]:=CT*t*Min(1000,RELAX.test.omega_2^local_k)*0.250994522453953;
+Q_RELAX.test_3[26][10]:=AC*t*0.3222350398108426;
+Q_RELAX.test_3[26][18]:=t*Min(1000,RELAX.test.omega_2^local_k)*0.5007522026922482;
+Q_RELAX.test_3[26][22]:=CG*t*Min(1000,RELAX.test.omega_2^local_k)*0.1351200521140052;
+Q_RELAX.test_3[26][24]:=t*0.3824103826488193;
+Q_RELAX.test_3[26][25]:=CG*t*0.1264560133035801;
+Q_RELAX.test_3[26][27]:=GT*t*0.2504957133922061;
+Q_RELAX.test_3[26][30]:=GT*t*Min(1000,RELAX.test.omega_2^local_k)*0.2296926126195792;
+Q_RELAX.test_3[26][42]:=CG*t*Min(1000,RELAX.test.omega_2^local_k)*0.3053650319994416;
+Q_RELAX.test_3[26][55]:=CT*t*Min(1000,RELAX.test.omega_2^local_k)*0.250994522453953;
+Q_RELAX.test_3[27][11]:=AC*t*Min(1000,RELAX.test.omega_2^local_k)*0.3222350398108426;
+Q_RELAX.test_3[27][19]:=t*Min(1000,RELAX.test.omega_2^local_k)*0.5007522026922482;
+Q_RELAX.test_3[27][23]:=CG*t*Min(1000,RELAX.test.omega_2^local_k)*0.1351200521140052;
+Q_RELAX.test_3[27][24]:=AT*t*0.3824103826488193;
+Q_RELAX.test_3[27][25]:=CT*t*0.1264560133035801;
+Q_RELAX.test_3[27][26]:=GT*t*0.2406378906553946;
+Q_RELAX.test_3[27][31]:=GT*t*Min(1000,RELAX.test.omega_2^local_k)*0.2296926126195792;
+Q_RELAX.test_3[27][43]:=CG*t*Min(1000,RELAX.test.omega_2^local_k)*0.3053650319994416;
+Q_RELAX.test_3[27][56]:=CT*t*Min(1000,RELAX.test.omega_2^local_k)*0.250994522453953;
+Q_RELAX.test_3[28][12]:=AC*t*Min(1000,RELAX.test.omega_2^local_k)*0.3222350398108426;
+Q_RELAX.test_3[28][16]:=AT*t*Min(1000,RELAX.test.omega_2^local_k)*0.5007522026922482;
+Q_RELAX.test_3[28][20]:=CT*t*Min(1000,RELAX.test.omega_2^local_k)*0.1351200521140052;
+Q_RELAX.test_3[28][24]:=GT*t*Min(1000,RELAX.test.omega_2^local_k)*0.1344351325741675;
+Q_RELAX.test_3[28][29]:=AC*t*0.1264560133035801;
+Q_RELAX.test_3[28][30]:=t*0.2406378906553946;
+Q_RELAX.test_3[28][31]:=AT*t*0.2504957133922061;
+Q_RELAX.test_3[28][44]:=CG*t*Min(1000,RELAX.test.omega_2^local_k)*0.3053650319994416;
+Q_RELAX.test_3[28][57]:=CT*t*0.250994522453953;
+Q_RELAX.test_3[29][13]:=AC*t*Min(1000,RELAX.test.omega_2^local_k)*0.3222350398108426;
+Q_RELAX.test_3[29][17]:=AT*t*Min(1000,RELAX.test.omega_2^local_k)*0.5007522026922482;
+Q_RELAX.test_3[29][21]:=CT*t*Min(1000,RELAX.test.omega_2^local_k)*0.1351200521140052;
+Q_RELAX.test_3[29][25]:=GT*t*Min(1000,RELAX.test.omega_2^local_k)*0.1344351325741675;
+Q_RELAX.test_3[29][28]:=AC*t*0.3824103826488193;
+Q_RELAX.test_3[29][30]:=CG*t*0.2406378906553946;
+Q_RELAX.test_3[29][31]:=CT*t*0.2504957133922061;
+Q_RELAX.test_3[29][45]:=CG*t*Min(1000,RELAX.test.omega_2^local_k)*0.3053650319994416;
+Q_RELAX.test_3[29][58]:=CT*t*Min(1000,RELAX.test.omega_2^local_k)*0.250994522453953;
+Q_RELAX.test_3[30][14]:=AC*t*Min(1000,RELAX.test.omega_2^local_k)*0.3222350398108426;
+Q_RELAX.test_3[30][18]:=AT*t*Min(1000,RELAX.test.omega_2^local_k)*0.5007522026922482;
+Q_RELAX.test_3[30][22]:=CT*t*Min(1000,RELAX.test.omega_2^local_k)*0.1351200521140052;
+Q_RELAX.test_3[30][26]:=GT*t*Min(1000,RELAX.test.omega_2^local_k)*0.1344351325741675;
+Q_RELAX.test_3[30][28]:=t*0.3824103826488193;
+Q_RELAX.test_3[30][29]:=CG*t*0.1264560133035801;
+Q_RELAX.test_3[30][31]:=GT*t*0.2504957133922061;
+Q_RELAX.test_3[30][46]:=CG*t*Min(1000,RELAX.test.omega_2^local_k)*0.3053650319994416;
+Q_RELAX.test_3[30][59]:=CT*t*0.250994522453953;
+Q_RELAX.test_3[31][15]:=AC*t*Min(1000,RELAX.test.omega_2^local_k)*0.3222350398108426;
+Q_RELAX.test_3[31][19]:=AT*t*Min(1000,RELAX.test.omega_2^local_k)*0.5007522026922482;
+Q_RELAX.test_3[31][23]:=CT*t*Min(1000,RELAX.test.omega_2^local_k)*0.1351200521140052;
+Q_RELAX.test_3[31][27]:=GT*t*Min(1000,RELAX.test.omega_2^local_k)*0.1344351325741675;
+Q_RELAX.test_3[31][28]:=AT*t*0.3824103826488193;
+Q_RELAX.test_3[31][29]:=CT*t*0.1264560133035801;
+Q_RELAX.test_3[31][30]:=GT*t*0.2406378906553946;
+Q_RELAX.test_3[31][47]:=CG*t*Min(1000,RELAX.test.omega_2^local_k)*0.3053650319994416;
+Q_RELAX.test_3[31][60]:=CT*t*Min(1000,RELAX.test.omega_2^local_k)*0.250994522453953;
+Q_RELAX.test_3[32][0]:=t*Min(1000,RELAX.test.omega_2^local_k)*0.3222350398108426;
+Q_RELAX.test_3[32][16]:=CG*t*Min(1000,RELAX.test.omega_2^local_k)*0.1214054057357627;
+Q_RELAX.test_3[32][33]:=AC*t*Min(1000,RELAX.test.omega_2^local_k)*0.1264560133035801;
+Q_RELAX.test_3[32][34]:=t*0.2406378906553946;
+Q_RELAX.test_3[32][35]:=AT*t*Min(1000,RELAX.test.omega_2^local_k)*0.2504957133922061;
+Q_RELAX.test_3[32][36]:=AC*t*Min(1000,RELAX.test.omega_2^local_k)*0.1351200521140052;
+Q_RELAX.test_3[32][40]:=t*Min(1000,RELAX.test.omega_2^local_k)*0.1344351325741675;
+Q_RELAX.test_3[32][44]:=AT*t*Min(1000,RELAX.test.omega_2^local_k)*0.2296926126195792;
+Q_RELAX.test_3[33][1]:=t*Min(1000,RELAX.test.omega_2^local_k)*0.3222350398108426;
+Q_RELAX.test_3[33][17]:=CG*t*Min(1000,RELAX.test.omega_2^local_k)*0.1214054057357627;
+Q_RELAX.test_3[33][32]:=AC*t*Min(1000,RELAX.test.omega_2^local_k)*0.3824103826488193;
+Q_RELAX.test_3[33][34]:=CG*t*Min(1000,RELAX.test.omega_2^local_k)*0.2406378906553946;
+Q_RELAX.test_3[33][35]:=CT*t*0.2504957133922061;
+Q_RELAX.test_3[33][37]:=AC*t*Min(1000,RELAX.test.omega_2^local_k)*0.1351200521140052;
+Q_RELAX.test_3[33][41]:=t*Min(1000,RELAX.test.omega_2^local_k)*0.1344351325741675;
+Q_RELAX.test_3[33][45]:=AT*t*Min(1000,RELAX.test.omega_2^local_k)*0.2296926126195792;
+Q_RELAX.test_3[33][48]:=GT*t*Min(1000,RELAX.test.omega_2^local_k)*0.250994522453953;
+Q_RELAX.test_3[34][2]:=t*Min(1000,RELAX.test.omega_2^local_k)*0.3222350398108426;
+Q_RELAX.test_3[34][18]:=CG*t*Min(1000,RELAX.test.omega_2^local_k)*0.1214054057357627;
+Q_RELAX.test_3[34][32]:=t*0.3824103826488193;
+Q_RELAX.test_3[34][33]:=CG*t*Min(1000,RELAX.test.omega_2^local_k)*0.1264560133035801;
+Q_RELAX.test_3[34][35]:=GT*t*Min(1000,RELAX.test.omega_2^local_k)*0.2504957133922061;
+Q_RELAX.test_3[34][38]:=AC*t*Min(1000,RELAX.test.omega_2^local_k)*0.1351200521140052;
+Q_RELAX.test_3[34][42]:=t*Min(1000,RELAX.test.omega_2^local_k)*0.1344351325741675;
+Q_RELAX.test_3[34][46]:=AT*t*Min(1000,RELAX.test.omega_2^local_k)*0.2296926126195792;
+Q_RELAX.test_3[35][3]:=t*Min(1000,RELAX.test.omega_2^local_k)*0.3222350398108426;
+Q_RELAX.test_3[35][19]:=CG*t*Min(1000,RELAX.test.omega_2^local_k)*0.1214054057357627;
+Q_RELAX.test_3[35][32]:=AT*t*Min(1000,RELAX.test.omega_2^local_k)*0.3824103826488193;
+Q_RELAX.test_3[35][33]:=CT*t*0.1264560133035801;
+Q_RELAX.test_3[35][34]:=GT*t*Min(1000,RELAX.test.omega_2^local_k)*0.2406378906553946;
+Q_RELAX.test_3[35][39]:=AC*t*Min(1000,RELAX.test.omega_2^local_k)*0.1351200521140052;
+Q_RELAX.test_3[35][43]:=t*Min(1000,RELAX.test.omega_2^local_k)*0.1344351325741675;
+Q_RELAX.test_3[35][47]:=AT*t*Min(1000,RELAX.test.omega_2^local_k)*0.2296926126195792;
+Q_RELAX.test_3[35][49]:=GT*t*Min(1000,RELAX.test.omega_2^local_k)*0.250994522453953;
+Q_RELAX.test_3[36][4]:=t*Min(1000,RELAX.test.omega_2^local_k)*0.3222350398108426;
+Q_RELAX.test_3[36][20]:=CG*t*Min(1000,RELAX.test.omega_2^local_k)*0.1214054057357627;
+Q_RELAX.test_3[36][32]:=AC*t*Min(1000,RELAX.test.omega_2^local_k)*0.5007522026922482;
+Q_RELAX.test_3[36][37]:=AC*t*0.1264560133035801;
+Q_RELAX.test_3[36][38]:=t*0.2406378906553946;
+Q_RELAX.test_3[36][39]:=AT*t*0.2504957133922061;
+Q_RELAX.test_3[36][40]:=CG*t*Min(1000,RELAX.test.omega_2^local_k)*0.1344351325741675;
+Q_RELAX.test_3[36][44]:=CT*t*Min(1000,RELAX.test.omega_2^local_k)*0.2296926126195792;
+Q_RELAX.test_3[36][50]:=GT*t*Min(1000,RELAX.test.omega_2^local_k)*0.250994522453953;
+Q_RELAX.test_3[37][5]:=t*Min(1000,RELAX.test.omega_2^local_k)*0.3222350398108426;
+Q_RELAX.test_3[37][21]:=CG*t*Min(1000,RELAX.test.omega_2^local_k)*0.1214054057357627;
+Q_RELAX.test_3[37][33]:=AC*t*Min(1000,RELAX.test.omega_2^local_k)*0.5007522026922482;
+Q_RELAX.test_3[37][36]:=AC*t*0.3824103826488193;
+Q_RELAX.test_3[37][38]:=CG*t*0.2406378906553946;
+Q_RELAX.test_3[37][39]:=CT*t*0.2504957133922061;
+Q_RELAX.test_3[37][41]:=CG*t*Min(1000,RELAX.test.omega_2^local_k)*0.1344351325741675;
+Q_RELAX.test_3[37][45]:=CT*t*Min(1000,RELAX.test.omega_2^local_k)*0.2296926126195792;
+Q_RELAX.test_3[37][51]:=GT*t*Min(1000,RELAX.test.omega_2^local_k)*0.250994522453953;
+Q_RELAX.test_3[38][6]:=t*Min(1000,RELAX.test.omega_2^local_k)*0.3222350398108426;
+Q_RELAX.test_3[38][22]:=CG*t*Min(1000,RELAX.test.omega_2^local_k)*0.1214054057357627;
+Q_RELAX.test_3[38][34]:=AC*t*Min(1000,RELAX.test.omega_2^local_k)*0.5007522026922482;
+Q_RELAX.test_3[38][36]:=t*0.3824103826488193;
+Q_RELAX.test_3[38][37]:=CG*t*0.1264560133035801;
+Q_RELAX.test_3[38][39]:=GT*t*0.2504957133922061;
+Q_RELAX.test_3[38][42]:=CG*t*Min(1000,RELAX.test.omega_2^local_k)*0.1344351325741675;
+Q_RELAX.test_3[38][46]:=CT*t*Min(1000,RELAX.test.omega_2^local_k)*0.2296926126195792;
+Q_RELAX.test_3[38][52]:=GT*t*Min(1000,RELAX.test.omega_2^local_k)*0.250994522453953;
+Q_RELAX.test_3[39][7]:=t*Min(1000,RELAX.test.omega_2^local_k)*0.3222350398108426;
+Q_RELAX.test_3[39][23]:=CG*t*Min(1000,RELAX.test.omega_2^local_k)*0.1214054057357627;
+Q_RELAX.test_3[39][35]:=AC*t*Min(1000,RELAX.test.omega_2^local_k)*0.5007522026922482;
+Q_RELAX.test_3[39][36]:=AT*t*0.3824103826488193;
+Q_RELAX.test_3[39][37]:=CT*t*0.1264560133035801;
+Q_RELAX.test_3[39][38]:=GT*t*0.2406378906553946;
+Q_RELAX.test_3[39][43]:=CG*t*Min(1000,RELAX.test.omega_2^local_k)*0.1344351325741675;
+Q_RELAX.test_3[39][47]:=CT*t*Min(1000,RELAX.test.omega_2^local_k)*0.2296926126195792;
+Q_RELAX.test_3[39][53]:=GT*t*Min(1000,RELAX.test.omega_2^local_k)*0.250994522453953;
+Q_RELAX.test_3[40][8]:=t*Min(1000,RELAX.test.omega_2^local_k)*0.3222350398108426;
+Q_RELAX.test_3[40][24]:=CG*t*Min(1000,RELAX.test.omega_2^local_k)*0.1214054057357627;
+Q_RELAX.test_3[40][32]:=t*Min(1000,RELAX.test.omega_2^local_k)*0.5007522026922482;
+Q_RELAX.test_3[40][36]:=CG*t*Min(1000,RELAX.test.omega_2^local_k)*0.1351200521140052;
+Q_RELAX.test_3[40][41]:=AC*t*0.1264560133035801;
+Q_RELAX.test_3[40][42]:=t*0.2406378906553946;
+Q_RELAX.test_3[40][43]:=AT*t*0.2504957133922061;
+Q_RELAX.test_3[40][44]:=GT*t*Min(1000,RELAX.test.omega_2^local_k)*0.2296926126195792;
+Q_RELAX.test_3[41][9]:=t*Min(1000,RELAX.test.omega_2^local_k)*0.3222350398108426;
+Q_RELAX.test_3[41][25]:=CG*t*Min(1000,RELAX.test.omega_2^local_k)*0.1214054057357627;
+Q_RELAX.test_3[41][33]:=t*Min(1000,RELAX.test.omega_2^local_k)*0.5007522026922482;
+Q_RELAX.test_3[41][37]:=CG*t*Min(1000,RELAX.test.omega_2^local_k)*0.1351200521140052;
+Q_RELAX.test_3[41][40]:=AC*t*0.3824103826488193;
+Q_RELAX.test_3[41][42]:=CG*t*0.2406378906553946;
+Q_RELAX.test_3[41][43]:=CT*t*0.2504957133922061;
+Q_RELAX.test_3[41][45]:=GT*t*Min(1000,RELAX.test.omega_2^local_k)*0.2296926126195792;
+Q_RELAX.test_3[41][54]:=GT*t*Min(1000,RELAX.test.omega_2^local_k)*0.250994522453953;
+Q_RELAX.test_3[42][10]:=t*Min(1000,RELAX.test.omega_2^local_k)*0.3222350398108426;
+Q_RELAX.test_3[42][26]:=CG*t*Min(1000,RELAX.test.omega_2^local_k)*0.1214054057357627;
+Q_RELAX.test_3[42][34]:=t*Min(1000,RELAX.test.omega_2^local_k)*0.5007522026922482;
+Q_RELAX.test_3[42][38]:=CG*t*Min(1000,RELAX.test.omega_2^local_k)*0.1351200521140052;
+Q_RELAX.test_3[42][40]:=t*0.3824103826488193;
+Q_RELAX.test_3[42][41]:=CG*t*0.1264560133035801;
+Q_RELAX.test_3[42][43]:=GT*t*0.2504957133922061;
+Q_RELAX.test_3[42][46]:=GT*t*Min(1000,RELAX.test.omega_2^local_k)*0.2296926126195792;
+Q_RELAX.test_3[42][55]:=GT*t*Min(1000,RELAX.test.omega_2^local_k)*0.250994522453953;
+Q_RELAX.test_3[43][11]:=t*Min(1000,RELAX.test.omega_2^local_k)*0.3222350398108426;
+Q_RELAX.test_3[43][27]:=CG*t*Min(1000,RELAX.test.omega_2^local_k)*0.1214054057357627;
+Q_RELAX.test_3[43][35]:=t*Min(1000,RELAX.test.omega_2^local_k)*0.5007522026922482;
+Q_RELAX.test_3[43][39]:=CG*t*Min(1000,RELAX.test.omega_2^local_k)*0.1351200521140052;
+Q_RELAX.test_3[43][40]:=AT*t*0.3824103826488193;
+Q_RELAX.test_3[43][41]:=CT*t*0.1264560133035801;
+Q_RELAX.test_3[43][42]:=GT*t*0.2406378906553946;
+Q_RELAX.test_3[43][47]:=GT*t*Min(1000,RELAX.test.omega_2^local_k)*0.2296926126195792;
+Q_RELAX.test_3[43][56]:=GT*t*Min(1000,RELAX.test.omega_2^local_k)*0.250994522453953;
+Q_RELAX.test_3[44][12]:=t*Min(1000,RELAX.test.omega_2^local_k)*0.3222350398108426;
+Q_RELAX.test_3[44][28]:=CG*t*Min(1000,RELAX.test.omega_2^local_k)*0.1214054057357627;
+Q_RELAX.test_3[44][32]:=AT*t*Min(1000,RELAX.test.omega_2^local_k)*0.5007522026922482;
+Q_RELAX.test_3[44][36]:=CT*t*Min(1000,RELAX.test.omega_2^local_k)*0.1351200521140052;
+Q_RELAX.test_3[44][40]:=GT*t*Min(1000,RELAX.test.omega_2^local_k)*0.1344351325741675;
+Q_RELAX.test_3[44][45]:=AC*t*0.1264560133035801;
+Q_RELAX.test_3[44][46]:=t*0.2406378906553946;
+Q_RELAX.test_3[44][47]:=AT*t*0.2504957133922061;
+Q_RELAX.test_3[44][57]:=GT*t*Min(1000,RELAX.test.omega_2^local_k)*0.250994522453953;
+Q_RELAX.test_3[45][13]:=t*Min(1000,RELAX.test.omega_2^local_k)*0.3222350398108426;
+Q_RELAX.test_3[45][29]:=CG*t*Min(1000,RELAX.test.omega_2^local_k)*0.1214054057357627;
+Q_RELAX.test_3[45][33]:=AT*t*Min(1000,RELAX.test.omega_2^local_k)*0.5007522026922482;
+Q_RELAX.test_3[45][37]:=CT*t*Min(1000,RELAX.test.omega_2^local_k)*0.1351200521140052;
+Q_RELAX.test_3[45][41]:=GT*t*Min(1000,RELAX.test.omega_2^local_k)*0.1344351325741675;
+Q_RELAX.test_3[45][44]:=AC*t*0.3824103826488193;
+Q_RELAX.test_3[45][46]:=CG*t*0.2406378906553946;
+Q_RELAX.test_3[45][47]:=CT*t*0.2504957133922061;
+Q_RELAX.test_3[45][58]:=GT*t*Min(1000,RELAX.test.omega_2^local_k)*0.250994522453953;
+Q_RELAX.test_3[46][14]:=t*Min(1000,RELAX.test.omega_2^local_k)*0.3222350398108426;
+Q_RELAX.test_3[46][30]:=CG*t*Min(1000,RELAX.test.omega_2^local_k)*0.1214054057357627;
+Q_RELAX.test_3[46][34]:=AT*t*Min(1000,RELAX.test.omega_2^local_k)*0.5007522026922482;
+Q_RELAX.test_3[46][38]:=CT*t*Min(1000,RELAX.test.omega_2^local_k)*0.1351200521140052;
+Q_RELAX.test_3[46][42]:=GT*t*Min(1000,RELAX.test.omega_2^local_k)*0.1344351325741675;
+Q_RELAX.test_3[46][44]:=t*0.3824103826488193;
+Q_RELAX.test_3[46][45]:=CG*t*0.1264560133035801;
+Q_RELAX.test_3[46][47]:=GT*t*0.2504957133922061;
+Q_RELAX.test_3[46][59]:=GT*t*Min(1000,RELAX.test.omega_2^local_k)*0.250994522453953;
+Q_RELAX.test_3[47][15]:=t*Min(1000,RELAX.test.omega_2^local_k)*0.3222350398108426;
+Q_RELAX.test_3[47][31]:=CG*t*Min(1000,RELAX.test.omega_2^local_k)*0.1214054057357627;
+Q_RELAX.test_3[47][35]:=AT*t*Min(1000,RELAX.test.omega_2^local_k)*0.5007522026922482;
+Q_RELAX.test_3[47][39]:=CT*t*Min(1000,RELAX.test.omega_2^local_k)*0.1351200521140052;
+Q_RELAX.test_3[47][43]:=GT*t*Min(1000,RELAX.test.omega_2^local_k)*0.1344351325741675;
+Q_RELAX.test_3[47][44]:=AT*t*0.3824103826488193;
+Q_RELAX.test_3[47][45]:=CT*t*0.1264560133035801;
+Q_RELAX.test_3[47][46]:=GT*t*0.2406378906553946;
+Q_RELAX.test_3[47][60]:=GT*t*Min(1000,RELAX.test.omega_2^local_k)*0.250994522453953;
+Q_RELAX.test_3[48][1]:=AT*t*Min(1000,RELAX.test.omega_2^local_k)*0.3222350398108426;
+Q_RELAX.test_3[48][17]:=CT*t*Min(1000,RELAX.test.omega_2^local_k)*0.1214054057357627;
+Q_RELAX.test_3[48][33]:=GT*t*Min(1000,RELAX.test.omega_2^local_k)*0.3053650319994416;
+Q_RELAX.test_3[48][49]:=CT*t*0.2504957133922061;
+Q_RELAX.test_3[48][51]:=AC*t*Min(1000,RELAX.test.omega_2^local_k)*0.1351200521140052;
+Q_RELAX.test_3[48][54]:=t*Min(1000,RELAX.test.omega_2^local_k)*0.1344351325741675;
+Q_RELAX.test_3[48][58]:=AT*t*Min(1000,RELAX.test.omega_2^local_k)*0.2296926126195792;
+Q_RELAX.test_3[49][3]:=AT*t*Min(1000,RELAX.test.omega_2^local_k)*0.3222350398108426;
+Q_RELAX.test_3[49][19]:=CT*t*Min(1000,RELAX.test.omega_2^local_k)*0.1214054057357627;
+Q_RELAX.test_3[49][35]:=GT*t*Min(1000,RELAX.test.omega_2^local_k)*0.3053650319994416;
+Q_RELAX.test_3[49][48]:=CT*t*0.1264560133035801;
+Q_RELAX.test_3[49][53]:=AC*t*Min(1000,RELAX.test.omega_2^local_k)*0.1351200521140052;
+Q_RELAX.test_3[49][56]:=t*Min(1000,RELAX.test.omega_2^local_k)*0.1344351325741675;
+Q_RELAX.test_3[49][60]:=AT*t*Min(1000,RELAX.test.omega_2^local_k)*0.2296926126195792;
+Q_RELAX.test_3[50][4]:=AT*t*Min(1000,RELAX.test.omega_2^local_k)*0.3222350398108426;
+Q_RELAX.test_3[50][20]:=CT*t*Min(1000,RELAX.test.omega_2^local_k)*0.1214054057357627;
+Q_RELAX.test_3[50][36]:=GT*t*Min(1000,RELAX.test.omega_2^local_k)*0.3053650319994416;
+Q_RELAX.test_3[50][51]:=AC*t*0.1264560133035801;
+Q_RELAX.test_3[50][52]:=t*0.2406378906553946;
+Q_RELAX.test_3[50][53]:=AT*t*0.2504957133922061;
+Q_RELAX.test_3[50][57]:=CT*t*Min(1000,RELAX.test.omega_2^local_k)*0.2296926126195792;
+Q_RELAX.test_3[51][5]:=AT*t*Min(1000,RELAX.test.omega_2^local_k)*0.3222350398108426;
+Q_RELAX.test_3[51][21]:=CT*t*Min(1000,RELAX.test.omega_2^local_k)*0.1214054057357627;
+Q_RELAX.test_3[51][37]:=GT*t*Min(1000,RELAX.test.omega_2^local_k)*0.3053650319994416;
+Q_RELAX.test_3[51][48]:=AC*t*Min(1000,RELAX.test.omega_2^local_k)*0.5007522026922482;
+Q_RELAX.test_3[51][50]:=AC*t*0.3824103826488193;
+Q_RELAX.test_3[51][52]:=CG*t*0.2406378906553946;
+Q_RELAX.test_3[51][53]:=CT*t*0.2504957133922061;
+Q_RELAX.test_3[51][54]:=CG*t*Min(1000,RELAX.test.omega_2^local_k)*0.1344351325741675;
+Q_RELAX.test_3[51][58]:=CT*t*Min(1000,RELAX.test.omega_2^local_k)*0.2296926126195792;
+Q_RELAX.test_3[52][6]:=AT*t*Min(1000,RELAX.test.omega_2^local_k)*0.3222350398108426;
+Q_RELAX.test_3[52][22]:=CT*t*Min(1000,RELAX.test.omega_2^local_k)*0.1214054057357627;
+Q_RELAX.test_3[52][38]:=GT*t*Min(1000,RELAX.test.omega_2^local_k)*0.3053650319994416;
+Q_RELAX.test_3[52][50]:=t*0.3824103826488193;
+Q_RELAX.test_3[52][51]:=CG*t*0.1264560133035801;
+Q_RELAX.test_3[52][53]:=GT*t*0.2504957133922061;
+Q_RELAX.test_3[52][55]:=CG*t*Min(1000,RELAX.test.omega_2^local_k)*0.1344351325741675;
+Q_RELAX.test_3[52][59]:=CT*t*Min(1000,RELAX.test.omega_2^local_k)*0.2296926126195792;
+Q_RELAX.test_3[53][7]:=AT*t*Min(1000,RELAX.test.omega_2^local_k)*0.3222350398108426;
+Q_RELAX.test_3[53][23]:=CT*t*Min(1000,RELAX.test.omega_2^local_k)*0.1214054057357627;
+Q_RELAX.test_3[53][39]:=GT*t*Min(1000,RELAX.test.omega_2^local_k)*0.3053650319994416;
+Q_RELAX.test_3[53][49]:=AC*t*Min(1000,RELAX.test.omega_2^local_k)*0.5007522026922482;
+Q_RELAX.test_3[53][50]:=AT*t*0.3824103826488193;
+Q_RELAX.test_3[53][51]:=CT*t*0.1264560133035801;
+Q_RELAX.test_3[53][52]:=GT*t*0.2406378906553946;
+Q_RELAX.test_3[53][56]:=CG*t*Min(1000,RELAX.test.omega_2^local_k)*0.1344351325741675;
+Q_RELAX.test_3[53][60]:=CT*t*Min(1000,RELAX.test.omega_2^local_k)*0.2296926126195792;
+Q_RELAX.test_3[54][9]:=AT*t*Min(1000,RELAX.test.omega_2^local_k)*0.3222350398108426;
+Q_RELAX.test_3[54][25]:=CT*t*Min(1000,RELAX.test.omega_2^local_k)*0.1214054057357627;
+Q_RELAX.test_3[54][41]:=GT*t*Min(1000,RELAX.test.omega_2^local_k)*0.3053650319994416;
+Q_RELAX.test_3[54][48]:=t*Min(1000,RELAX.test.omega_2^local_k)*0.5007522026922482;
+Q_RELAX.test_3[54][51]:=CG*t*Min(1000,RELAX.test.omega_2^local_k)*0.1351200521140052;
+Q_RELAX.test_3[54][55]:=CG*t*Min(1000,RELAX.test.omega_2^local_k)*0.2406378906553946;
+Q_RELAX.test_3[54][56]:=CT*t*0.2504957133922061;
+Q_RELAX.test_3[54][58]:=GT*t*Min(1000,RELAX.test.omega_2^local_k)*0.2296926126195792;
+Q_RELAX.test_3[55][10]:=AT*t*Min(1000,RELAX.test.omega_2^local_k)*0.3222350398108426;
+Q_RELAX.test_3[55][26]:=CT*t*Min(1000,RELAX.test.omega_2^local_k)*0.1214054057357627;
+Q_RELAX.test_3[55][42]:=GT*t*Min(1000,RELAX.test.omega_2^local_k)*0.3053650319994416;
+Q_RELAX.test_3[55][52]:=CG*t*Min(1000,RELAX.test.omega_2^local_k)*0.1351200521140052;
+Q_RELAX.test_3[55][54]:=CG*t*Min(1000,RELAX.test.omega_2^local_k)*0.1264560133035801;
+Q_RELAX.test_3[55][56]:=GT*t*Min(1000,RELAX.test.omega_2^local_k)*0.2504957133922061;
+Q_RELAX.test_3[55][59]:=GT*t*Min(1000,RELAX.test.omega_2^local_k)*0.2296926126195792;
+Q_RELAX.test_3[56][11]:=AT*t*Min(1000,RELAX.test.omega_2^local_k)*0.3222350398108426;
+Q_RELAX.test_3[56][27]:=CT*t*Min(1000,RELAX.test.omega_2^local_k)*0.1214054057357627;
+Q_RELAX.test_3[56][43]:=GT*t*Min(1000,RELAX.test.omega_2^local_k)*0.3053650319994416;
+Q_RELAX.test_3[56][49]:=t*Min(1000,RELAX.test.omega_2^local_k)*0.5007522026922482;
+Q_RELAX.test_3[56][53]:=CG*t*Min(1000,RELAX.test.omega_2^local_k)*0.1351200521140052;
+Q_RELAX.test_3[56][54]:=CT*t*0.1264560133035801;
+Q_RELAX.test_3[56][55]:=GT*t*Min(1000,RELAX.test.omega_2^local_k)*0.2406378906553946;
+Q_RELAX.test_3[56][60]:=GT*t*Min(1000,RELAX.test.omega_2^local_k)*0.2296926126195792;
+Q_RELAX.test_3[57][12]:=AT*t*Min(1000,RELAX.test.omega_2^local_k)*0.3222350398108426;
+Q_RELAX.test_3[57][28]:=CT*t*0.1214054057357627;
+Q_RELAX.test_3[57][44]:=GT*t*Min(1000,RELAX.test.omega_2^local_k)*0.3053650319994416;
+Q_RELAX.test_3[57][50]:=CT*t*Min(1000,RELAX.test.omega_2^local_k)*0.1351200521140052;
+Q_RELAX.test_3[57][58]:=AC*t*Min(1000,RELAX.test.omega_2^local_k)*0.1264560133035801;
+Q_RELAX.test_3[57][59]:=t*0.2406378906553946;
+Q_RELAX.test_3[57][60]:=AT*t*Min(1000,RELAX.test.omega_2^local_k)*0.2504957133922061;
+Q_RELAX.test_3[58][13]:=AT*t*Min(1000,RELAX.test.omega_2^local_k)*0.3222350398108426;
+Q_RELAX.test_3[58][29]:=CT*t*Min(1000,RELAX.test.omega_2^local_k)*0.1214054057357627;
+Q_RELAX.test_3[58][45]:=GT*t*Min(1000,RELAX.test.omega_2^local_k)*0.3053650319994416;
+Q_RELAX.test_3[58][48]:=AT*t*Min(1000,RELAX.test.omega_2^local_k)*0.5007522026922482;
+Q_RELAX.test_3[58][51]:=CT*t*Min(1000,RELAX.test.omega_2^local_k)*0.1351200521140052;
+Q_RELAX.test_3[58][54]:=GT*t*Min(1000,RELAX.test.omega_2^local_k)*0.1344351325741675;
+Q_RELAX.test_3[58][57]:=AC*t*Min(1000,RELAX.test.omega_2^local_k)*0.3824103826488193;
+Q_RELAX.test_3[58][59]:=CG*t*Min(1000,RELAX.test.omega_2^local_k)*0.2406378906553946;
+Q_RELAX.test_3[58][60]:=CT*t*0.2504957133922061;
+Q_RELAX.test_3[59][14]:=AT*t*Min(1000,RELAX.test.omega_2^local_k)*0.3222350398108426;
+Q_RELAX.test_3[59][30]:=CT*t*0.1214054057357627;
+Q_RELAX.test_3[59][46]:=GT*t*Min(1000,RELAX.test.omega_2^local_k)*0.3053650319994416;
+Q_RELAX.test_3[59][52]:=CT*t*Min(1000,RELAX.test.omega_2^local_k)*0.1351200521140052;
+Q_RELAX.test_3[59][55]:=GT*t*Min(1000,RELAX.test.omega_2^local_k)*0.1344351325741675;
+Q_RELAX.test_3[59][57]:=t*0.3824103826488193;
+Q_RELAX.test_3[59][58]:=CG*t*Min(1000,RELAX.test.omega_2^local_k)*0.1264560133035801;
+Q_RELAX.test_3[59][60]:=GT*t*Min(1000,RELAX.test.omega_2^local_k)*0.2504957133922061;
+Q_RELAX.test_3[60][15]:=AT*t*Min(1000,RELAX.test.omega_2^local_k)*0.3222350398108426;
+Q_RELAX.test_3[60][31]:=CT*t*Min(1000,RELAX.test.omega_2^local_k)*0.1214054057357627;
+Q_RELAX.test_3[60][47]:=GT*t*Min(1000,RELAX.test.omega_2^local_k)*0.3053650319994416;
+Q_RELAX.test_3[60][49]:=AT*t*Min(1000,RELAX.test.omega_2^local_k)*0.5007522026922482;
+Q_RELAX.test_3[60][53]:=CT*t*Min(1000,RELAX.test.omega_2^local_k)*0.1351200521140052;
+Q_RELAX.test_3[60][56]:=GT*t*Min(1000,RELAX.test.omega_2^local_k)*0.1344351325741675;
+Q_RELAX.test_3[60][57]:=AT*t*Min(1000,RELAX.test.omega_2^local_k)*0.3824103826488193;
+Q_RELAX.test_3[60][58]:=CT*t*0.1264560133035801;
+Q_RELAX.test_3[60][59]:=GT*t*Min(1000,RELAX.test.omega_2^local_k)*0.2406378906553946;
+
+
+RELAX.test_model_eqf={
+{0.06789889450438902}
+{0.02245290372942207}
+{0.04272647263966693}
+{0.04447677884582558}
+{0.01832144145265965}
+{0.006058560513002445}
+{0.01152906203643302}
+{0.01200135444876809}
+{0.01822857060889821}
+{0.006027849849309518}
+{0.01147062156263798}
+{0.01194051993873147}
+{0.03114489439855585}
+{0.01029903830832752}
+{0.01959842627922601}
+{0.0204012832676034}
+{0.0255816153362901}
+{0.008459365216199515}
+{0.0160976433522615}
+{0.01675708943622944}
+{0.006902793794647167}
+{0.002282625743269596}
+{0.004343694140486931}
+{0.004521635223427881}
+{0.00686780373746872}
+{0.002271055181023346}
+{0.004321676083615643}
+{0.004498715188480508}
+{0.01173416318496511}
+{0.003880269896298824}
+{0.007383911121548391}
+{0.007686395849711308}
+{0.06434417593204837}
+{0.02127742429823938}
+{0.04048960874178697}
+{0.04214828096739659}
+{0.01736225693751837}
+{0.005741376003086347}
+{0.01092547973598884}
+{0.0113730461697648}
+{0.01727424817163843}
+{0.005712273138274315}
+{0.01087009880298738}
+{0.01131539653577432}
+{0.02951436218797651}
+{0.009759851580486268}
+{0.01857238763173507}
+{0.01933321255658108}
+{0.01748896039542764}
+{0.03464374288175238}
+{0.01427089198858639}
+{0.004719119012048105}
+{0.008980188566318471}
+{0.00934806540727982}
+{0.004695197937628716}
+{0.008934668256606717}
+{0.009300680340763385}
+{0.02425930432963823}
+{0.008022101517733991}
+{0.01526555786015987}
+{0.01589091724539275}
+}
+;
+Model RELAX.test_model=("Exp(Q_RELAX.test_1)*RELAX.test.aux_freq_0+Exp(Q_RELAX.test_2)*(1-RELAX.test.aux_freq_0)*RELAX.test.aux_freq_1+Exp(Q_RELAX.test_3)*(1-RELAX.test.aux_freq_0)*(1-RELAX.test.aux_freq_1)",RELAX.test_model_eqf,EXPLICIT_FORM_MATRIX_EXPONENTIAL);
+
+Q_RELAX.reference_1={61,61};
+Q_RELAX.reference_1[0][1]:=AC*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1264560133035801;
+Q_RELAX.reference_1[0][2]:=t*0.2406378906553946;
+Q_RELAX.reference_1[0][3]:=AT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.2504957133922061;
+Q_RELAX.reference_1[0][4]:=AC*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1351200521140052;
+Q_RELAX.reference_1[0][8]:=t*Min(1000,RELAX.reference.omega_0^local_k)*0.1344351325741675;
+Q_RELAX.reference_1[0][12]:=AT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.2296926126195792;
+Q_RELAX.reference_1[0][16]:=AC*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1214054057357627;
+Q_RELAX.reference_1[0][32]:=t*Min(1000,RELAX.reference.omega_0^local_k)*0.3053650319994416;
+Q_RELAX.reference_1[1][0]:=AC*t*Min(1000,RELAX.reference.omega_0^local_k)*0.3824103826488193;
+Q_RELAX.reference_1[1][2]:=CG*t*Min(1000,RELAX.reference.omega_0^local_k)*0.2406378906553946;
+Q_RELAX.reference_1[1][3]:=CT*t*0.2504957133922061;
+Q_RELAX.reference_1[1][5]:=AC*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1351200521140052;
+Q_RELAX.reference_1[1][9]:=t*Min(1000,RELAX.reference.omega_0^local_k)*0.1344351325741675;
+Q_RELAX.reference_1[1][13]:=AT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.2296926126195792;
+Q_RELAX.reference_1[1][17]:=AC*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1214054057357627;
+Q_RELAX.reference_1[1][33]:=t*Min(1000,RELAX.reference.omega_0^local_k)*0.3053650319994416;
+Q_RELAX.reference_1[1][48]:=AT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.250994522453953;
+Q_RELAX.reference_1[2][0]:=t*0.3824103826488193;
+Q_RELAX.reference_1[2][1]:=CG*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1264560133035801;
+Q_RELAX.reference_1[2][3]:=GT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.2504957133922061;
+Q_RELAX.reference_1[2][6]:=AC*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1351200521140052;
+Q_RELAX.reference_1[2][10]:=t*Min(1000,RELAX.reference.omega_0^local_k)*0.1344351325741675;
+Q_RELAX.reference_1[2][14]:=AT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.2296926126195792;
+Q_RELAX.reference_1[2][18]:=AC*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1214054057357627;
+Q_RELAX.reference_1[2][34]:=t*Min(1000,RELAX.reference.omega_0^local_k)*0.3053650319994416;
+Q_RELAX.reference_1[3][0]:=AT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.3824103826488193;
+Q_RELAX.reference_1[3][1]:=CT*t*0.1264560133035801;
+Q_RELAX.reference_1[3][2]:=GT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.2406378906553946;
+Q_RELAX.reference_1[3][7]:=AC*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1351200521140052;
+Q_RELAX.reference_1[3][11]:=t*Min(1000,RELAX.reference.omega_0^local_k)*0.1344351325741675;
+Q_RELAX.reference_1[3][15]:=AT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.2296926126195792;
+Q_RELAX.reference_1[3][19]:=AC*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1214054057357627;
+Q_RELAX.reference_1[3][35]:=t*Min(1000,RELAX.reference.omega_0^local_k)*0.3053650319994416;
+Q_RELAX.reference_1[3][49]:=AT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.250994522453953;
+Q_RELAX.reference_1[4][0]:=AC*t*Min(1000,RELAX.reference.omega_0^local_k)*0.5007522026922482;
+Q_RELAX.reference_1[4][5]:=AC*t*0.1264560133035801;
+Q_RELAX.reference_1[4][6]:=t*0.2406378906553946;
+Q_RELAX.reference_1[4][7]:=AT*t*0.2504957133922061;
+Q_RELAX.reference_1[4][8]:=CG*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1344351325741675;
+Q_RELAX.reference_1[4][12]:=CT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.2296926126195792;
+Q_RELAX.reference_1[4][20]:=AC*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1214054057357627;
+Q_RELAX.reference_1[4][36]:=t*Min(1000,RELAX.reference.omega_0^local_k)*0.3053650319994416;
+Q_RELAX.reference_1[4][50]:=AT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.250994522453953;
+Q_RELAX.reference_1[5][1]:=AC*t*Min(1000,RELAX.reference.omega_0^local_k)*0.5007522026922482;
+Q_RELAX.reference_1[5][4]:=AC*t*0.3824103826488193;
+Q_RELAX.reference_1[5][6]:=CG*t*0.2406378906553946;
+Q_RELAX.reference_1[5][7]:=CT*t*0.2504957133922061;
+Q_RELAX.reference_1[5][9]:=CG*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1344351325741675;
+Q_RELAX.reference_1[5][13]:=CT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.2296926126195792;
+Q_RELAX.reference_1[5][21]:=AC*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1214054057357627;
+Q_RELAX.reference_1[5][37]:=t*Min(1000,RELAX.reference.omega_0^local_k)*0.3053650319994416;
+Q_RELAX.reference_1[5][51]:=AT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.250994522453953;
+Q_RELAX.reference_1[6][2]:=AC*t*Min(1000,RELAX.reference.omega_0^local_k)*0.5007522026922482;
+Q_RELAX.reference_1[6][4]:=t*0.3824103826488193;
+Q_RELAX.reference_1[6][5]:=CG*t*0.1264560133035801;
+Q_RELAX.reference_1[6][7]:=GT*t*0.2504957133922061;
+Q_RELAX.reference_1[6][10]:=CG*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1344351325741675;
+Q_RELAX.reference_1[6][14]:=CT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.2296926126195792;
+Q_RELAX.reference_1[6][22]:=AC*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1214054057357627;
+Q_RELAX.reference_1[6][38]:=t*Min(1000,RELAX.reference.omega_0^local_k)*0.3053650319994416;
+Q_RELAX.reference_1[6][52]:=AT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.250994522453953;
+Q_RELAX.reference_1[7][3]:=AC*t*Min(1000,RELAX.reference.omega_0^local_k)*0.5007522026922482;
+Q_RELAX.reference_1[7][4]:=AT*t*0.3824103826488193;
+Q_RELAX.reference_1[7][5]:=CT*t*0.1264560133035801;
+Q_RELAX.reference_1[7][6]:=GT*t*0.2406378906553946;
+Q_RELAX.reference_1[7][11]:=CG*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1344351325741675;
+Q_RELAX.reference_1[7][15]:=CT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.2296926126195792;
+Q_RELAX.reference_1[7][23]:=AC*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1214054057357627;
+Q_RELAX.reference_1[7][39]:=t*Min(1000,RELAX.reference.omega_0^local_k)*0.3053650319994416;
+Q_RELAX.reference_1[7][53]:=AT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.250994522453953;
+Q_RELAX.reference_1[8][0]:=t*Min(1000,RELAX.reference.omega_0^local_k)*0.5007522026922482;
+Q_RELAX.reference_1[8][4]:=CG*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1351200521140052;
+Q_RELAX.reference_1[8][9]:=AC*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1264560133035801;
+Q_RELAX.reference_1[8][10]:=t*0.2406378906553946;
+Q_RELAX.reference_1[8][11]:=AT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.2504957133922061;
+Q_RELAX.reference_1[8][12]:=GT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.2296926126195792;
+Q_RELAX.reference_1[8][24]:=AC*t*0.1214054057357627;
+Q_RELAX.reference_1[8][40]:=t*Min(1000,RELAX.reference.omega_0^local_k)*0.3053650319994416;
+Q_RELAX.reference_1[9][1]:=t*Min(1000,RELAX.reference.omega_0^local_k)*0.5007522026922482;
+Q_RELAX.reference_1[9][5]:=CG*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1351200521140052;
+Q_RELAX.reference_1[9][8]:=AC*t*Min(1000,RELAX.reference.omega_0^local_k)*0.3824103826488193;
+Q_RELAX.reference_1[9][10]:=CG*t*Min(1000,RELAX.reference.omega_0^local_k)*0.2406378906553946;
+Q_RELAX.reference_1[9][11]:=CT*t*0.2504957133922061;
+Q_RELAX.reference_1[9][13]:=GT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.2296926126195792;
+Q_RELAX.reference_1[9][25]:=AC*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1214054057357627;
+Q_RELAX.reference_1[9][41]:=t*Min(1000,RELAX.reference.omega_0^local_k)*0.3053650319994416;
+Q_RELAX.reference_1[9][54]:=AT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.250994522453953;
+Q_RELAX.reference_1[10][2]:=t*Min(1000,RELAX.reference.omega_0^local_k)*0.5007522026922482;
+Q_RELAX.reference_1[10][6]:=CG*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1351200521140052;
+Q_RELAX.reference_1[10][8]:=t*0.3824103826488193;
+Q_RELAX.reference_1[10][9]:=CG*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1264560133035801;
+Q_RELAX.reference_1[10][11]:=GT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.2504957133922061;
+Q_RELAX.reference_1[10][14]:=GT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.2296926126195792;
+Q_RELAX.reference_1[10][26]:=AC*t*0.1214054057357627;
+Q_RELAX.reference_1[10][42]:=t*Min(1000,RELAX.reference.omega_0^local_k)*0.3053650319994416;
+Q_RELAX.reference_1[10][55]:=AT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.250994522453953;
+Q_RELAX.reference_1[11][3]:=t*Min(1000,RELAX.reference.omega_0^local_k)*0.5007522026922482;
+Q_RELAX.reference_1[11][7]:=CG*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1351200521140052;
+Q_RELAX.reference_1[11][8]:=AT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.3824103826488193;
+Q_RELAX.reference_1[11][9]:=CT*t*0.1264560133035801;
+Q_RELAX.reference_1[11][10]:=GT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.2406378906553946;
+Q_RELAX.reference_1[11][15]:=GT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.2296926126195792;
+Q_RELAX.reference_1[11][27]:=AC*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1214054057357627;
+Q_RELAX.reference_1[11][43]:=t*Min(1000,RELAX.reference.omega_0^local_k)*0.3053650319994416;
+Q_RELAX.reference_1[11][56]:=AT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.250994522453953;
+Q_RELAX.reference_1[12][0]:=AT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.5007522026922482;
+Q_RELAX.reference_1[12][4]:=CT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1351200521140052;
+Q_RELAX.reference_1[12][8]:=GT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1344351325741675;
+Q_RELAX.reference_1[12][13]:=AC*t*0.1264560133035801;
+Q_RELAX.reference_1[12][14]:=t*Min(1000,RELAX.reference.omega_0^local_k)*0.2406378906553946;
+Q_RELAX.reference_1[12][15]:=AT*t*0.2504957133922061;
+Q_RELAX.reference_1[12][28]:=AC*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1214054057357627;
+Q_RELAX.reference_1[12][44]:=t*Min(1000,RELAX.reference.omega_0^local_k)*0.3053650319994416;
+Q_RELAX.reference_1[12][57]:=AT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.250994522453953;
+Q_RELAX.reference_1[13][1]:=AT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.5007522026922482;
+Q_RELAX.reference_1[13][5]:=CT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1351200521140052;
+Q_RELAX.reference_1[13][9]:=GT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1344351325741675;
+Q_RELAX.reference_1[13][12]:=AC*t*0.3824103826488193;
+Q_RELAX.reference_1[13][14]:=CG*t*Min(1000,RELAX.reference.omega_0^local_k)*0.2406378906553946;
+Q_RELAX.reference_1[13][15]:=CT*t*0.2504957133922061;
+Q_RELAX.reference_1[13][29]:=AC*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1214054057357627;
+Q_RELAX.reference_1[13][45]:=t*Min(1000,RELAX.reference.omega_0^local_k)*0.3053650319994416;
+Q_RELAX.reference_1[13][58]:=AT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.250994522453953;
+Q_RELAX.reference_1[14][2]:=AT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.5007522026922482;
+Q_RELAX.reference_1[14][6]:=CT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1351200521140052;
+Q_RELAX.reference_1[14][10]:=GT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1344351325741675;
+Q_RELAX.reference_1[14][12]:=t*Min(1000,RELAX.reference.omega_0^local_k)*0.3824103826488193;
+Q_RELAX.reference_1[14][13]:=CG*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1264560133035801;
+Q_RELAX.reference_1[14][15]:=GT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.2504957133922061;
+Q_RELAX.reference_1[14][30]:=AC*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1214054057357627;
+Q_RELAX.reference_1[14][46]:=t*Min(1000,RELAX.reference.omega_0^local_k)*0.3053650319994416;
+Q_RELAX.reference_1[14][59]:=AT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.250994522453953;
+Q_RELAX.reference_1[15][3]:=AT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.5007522026922482;
+Q_RELAX.reference_1[15][7]:=CT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1351200521140052;
+Q_RELAX.reference_1[15][11]:=GT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1344351325741675;
+Q_RELAX.reference_1[15][12]:=AT*t*0.3824103826488193;
+Q_RELAX.reference_1[15][13]:=CT*t*0.1264560133035801;
+Q_RELAX.reference_1[15][14]:=GT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.2406378906553946;
+Q_RELAX.reference_1[15][31]:=AC*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1214054057357627;
+Q_RELAX.reference_1[15][47]:=t*Min(1000,RELAX.reference.omega_0^local_k)*0.3053650319994416;
+Q_RELAX.reference_1[15][60]:=AT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.250994522453953;
+Q_RELAX.reference_1[16][0]:=AC*t*Min(1000,RELAX.reference.omega_0^local_k)*0.3222350398108426;
+Q_RELAX.reference_1[16][17]:=AC*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1264560133035801;
+Q_RELAX.reference_1[16][18]:=t*0.2406378906553946;
+Q_RELAX.reference_1[16][19]:=AT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.2504957133922061;
+Q_RELAX.reference_1[16][20]:=AC*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1351200521140052;
+Q_RELAX.reference_1[16][24]:=t*Min(1000,RELAX.reference.omega_0^local_k)*0.1344351325741675;
+Q_RELAX.reference_1[16][28]:=AT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.2296926126195792;
+Q_RELAX.reference_1[16][32]:=CG*t*Min(1000,RELAX.reference.omega_0^local_k)*0.3053650319994416;
+Q_RELAX.reference_1[17][1]:=AC*t*Min(1000,RELAX.reference.omega_0^local_k)*0.3222350398108426;
+Q_RELAX.reference_1[17][16]:=AC*t*Min(1000,RELAX.reference.omega_0^local_k)*0.3824103826488193;
+Q_RELAX.reference_1[17][18]:=CG*t*Min(1000,RELAX.reference.omega_0^local_k)*0.2406378906553946;
+Q_RELAX.reference_1[17][19]:=CT*t*0.2504957133922061;
+Q_RELAX.reference_1[17][21]:=AC*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1351200521140052;
+Q_RELAX.reference_1[17][25]:=t*Min(1000,RELAX.reference.omega_0^local_k)*0.1344351325741675;
+Q_RELAX.reference_1[17][29]:=AT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.2296926126195792;
+Q_RELAX.reference_1[17][33]:=CG*t*Min(1000,RELAX.reference.omega_0^local_k)*0.3053650319994416;
+Q_RELAX.reference_1[17][48]:=CT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.250994522453953;
+Q_RELAX.reference_1[18][2]:=AC*t*Min(1000,RELAX.reference.omega_0^local_k)*0.3222350398108426;
+Q_RELAX.reference_1[18][16]:=t*0.3824103826488193;
+Q_RELAX.reference_1[18][17]:=CG*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1264560133035801;
+Q_RELAX.reference_1[18][19]:=GT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.2504957133922061;
+Q_RELAX.reference_1[18][22]:=AC*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1351200521140052;
+Q_RELAX.reference_1[18][26]:=t*Min(1000,RELAX.reference.omega_0^local_k)*0.1344351325741675;
+Q_RELAX.reference_1[18][30]:=AT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.2296926126195792;
+Q_RELAX.reference_1[18][34]:=CG*t*Min(1000,RELAX.reference.omega_0^local_k)*0.3053650319994416;
+Q_RELAX.reference_1[19][3]:=AC*t*Min(1000,RELAX.reference.omega_0^local_k)*0.3222350398108426;
+Q_RELAX.reference_1[19][16]:=AT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.3824103826488193;
+Q_RELAX.reference_1[19][17]:=CT*t*0.1264560133035801;
+Q_RELAX.reference_1[19][18]:=GT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.2406378906553946;
+Q_RELAX.reference_1[19][23]:=AC*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1351200521140052;
+Q_RELAX.reference_1[19][27]:=t*Min(1000,RELAX.reference.omega_0^local_k)*0.1344351325741675;
+Q_RELAX.reference_1[19][31]:=AT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.2296926126195792;
+Q_RELAX.reference_1[19][35]:=CG*t*Min(1000,RELAX.reference.omega_0^local_k)*0.3053650319994416;
+Q_RELAX.reference_1[19][49]:=CT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.250994522453953;
+Q_RELAX.reference_1[20][4]:=AC*t*Min(1000,RELAX.reference.omega_0^local_k)*0.3222350398108426;
+Q_RELAX.reference_1[20][16]:=AC*t*Min(1000,RELAX.reference.omega_0^local_k)*0.5007522026922482;
+Q_RELAX.reference_1[20][21]:=AC*t*0.1264560133035801;
+Q_RELAX.reference_1[20][22]:=t*0.2406378906553946;
+Q_RELAX.reference_1[20][23]:=AT*t*0.2504957133922061;
+Q_RELAX.reference_1[20][24]:=CG*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1344351325741675;
+Q_RELAX.reference_1[20][28]:=CT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.2296926126195792;
+Q_RELAX.reference_1[20][36]:=CG*t*Min(1000,RELAX.reference.omega_0^local_k)*0.3053650319994416;
+Q_RELAX.reference_1[20][50]:=CT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.250994522453953;
+Q_RELAX.reference_1[21][5]:=AC*t*Min(1000,RELAX.reference.omega_0^local_k)*0.3222350398108426;
+Q_RELAX.reference_1[21][17]:=AC*t*Min(1000,RELAX.reference.omega_0^local_k)*0.5007522026922482;
+Q_RELAX.reference_1[21][20]:=AC*t*0.3824103826488193;
+Q_RELAX.reference_1[21][22]:=CG*t*0.2406378906553946;
+Q_RELAX.reference_1[21][23]:=CT*t*0.2504957133922061;
+Q_RELAX.reference_1[21][25]:=CG*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1344351325741675;
+Q_RELAX.reference_1[21][29]:=CT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.2296926126195792;
+Q_RELAX.reference_1[21][37]:=CG*t*Min(1000,RELAX.reference.omega_0^local_k)*0.3053650319994416;
+Q_RELAX.reference_1[21][51]:=CT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.250994522453953;
+Q_RELAX.reference_1[22][6]:=AC*t*Min(1000,RELAX.reference.omega_0^local_k)*0.3222350398108426;
+Q_RELAX.reference_1[22][18]:=AC*t*Min(1000,RELAX.reference.omega_0^local_k)*0.5007522026922482;
+Q_RELAX.reference_1[22][20]:=t*0.3824103826488193;
+Q_RELAX.reference_1[22][21]:=CG*t*0.1264560133035801;
+Q_RELAX.reference_1[22][23]:=GT*t*0.2504957133922061;
+Q_RELAX.reference_1[22][26]:=CG*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1344351325741675;
+Q_RELAX.reference_1[22][30]:=CT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.2296926126195792;
+Q_RELAX.reference_1[22][38]:=CG*t*Min(1000,RELAX.reference.omega_0^local_k)*0.3053650319994416;
+Q_RELAX.reference_1[22][52]:=CT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.250994522453953;
+Q_RELAX.reference_1[23][7]:=AC*t*Min(1000,RELAX.reference.omega_0^local_k)*0.3222350398108426;
+Q_RELAX.reference_1[23][19]:=AC*t*Min(1000,RELAX.reference.omega_0^local_k)*0.5007522026922482;
+Q_RELAX.reference_1[23][20]:=AT*t*0.3824103826488193;
+Q_RELAX.reference_1[23][21]:=CT*t*0.1264560133035801;
+Q_RELAX.reference_1[23][22]:=GT*t*0.2406378906553946;
+Q_RELAX.reference_1[23][27]:=CG*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1344351325741675;
+Q_RELAX.reference_1[23][31]:=CT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.2296926126195792;
+Q_RELAX.reference_1[23][39]:=CG*t*Min(1000,RELAX.reference.omega_0^local_k)*0.3053650319994416;
+Q_RELAX.reference_1[23][53]:=CT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.250994522453953;
+Q_RELAX.reference_1[24][8]:=AC*t*0.3222350398108426;
+Q_RELAX.reference_1[24][16]:=t*Min(1000,RELAX.reference.omega_0^local_k)*0.5007522026922482;
+Q_RELAX.reference_1[24][20]:=CG*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1351200521140052;
+Q_RELAX.reference_1[24][25]:=AC*t*0.1264560133035801;
+Q_RELAX.reference_1[24][26]:=t*0.2406378906553946;
+Q_RELAX.reference_1[24][27]:=AT*t*0.2504957133922061;
+Q_RELAX.reference_1[24][28]:=GT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.2296926126195792;
+Q_RELAX.reference_1[24][40]:=CG*t*Min(1000,RELAX.reference.omega_0^local_k)*0.3053650319994416;
+Q_RELAX.reference_1[25][9]:=AC*t*Min(1000,RELAX.reference.omega_0^local_k)*0.3222350398108426;
+Q_RELAX.reference_1[25][17]:=t*Min(1000,RELAX.reference.omega_0^local_k)*0.5007522026922482;
+Q_RELAX.reference_1[25][21]:=CG*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1351200521140052;
+Q_RELAX.reference_1[25][24]:=AC*t*0.3824103826488193;
+Q_RELAX.reference_1[25][26]:=CG*t*0.2406378906553946;
+Q_RELAX.reference_1[25][27]:=CT*t*0.2504957133922061;
+Q_RELAX.reference_1[25][29]:=GT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.2296926126195792;
+Q_RELAX.reference_1[25][41]:=CG*t*Min(1000,RELAX.reference.omega_0^local_k)*0.3053650319994416;
+Q_RELAX.reference_1[25][54]:=CT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.250994522453953;
+Q_RELAX.reference_1[26][10]:=AC*t*0.3222350398108426;
+Q_RELAX.reference_1[26][18]:=t*Min(1000,RELAX.reference.omega_0^local_k)*0.5007522026922482;
+Q_RELAX.reference_1[26][22]:=CG*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1351200521140052;
+Q_RELAX.reference_1[26][24]:=t*0.3824103826488193;
+Q_RELAX.reference_1[26][25]:=CG*t*0.1264560133035801;
+Q_RELAX.reference_1[26][27]:=GT*t*0.2504957133922061;
+Q_RELAX.reference_1[26][30]:=GT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.2296926126195792;
+Q_RELAX.reference_1[26][42]:=CG*t*Min(1000,RELAX.reference.omega_0^local_k)*0.3053650319994416;
+Q_RELAX.reference_1[26][55]:=CT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.250994522453953;
+Q_RELAX.reference_1[27][11]:=AC*t*Min(1000,RELAX.reference.omega_0^local_k)*0.3222350398108426;
+Q_RELAX.reference_1[27][19]:=t*Min(1000,RELAX.reference.omega_0^local_k)*0.5007522026922482;
+Q_RELAX.reference_1[27][23]:=CG*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1351200521140052;
+Q_RELAX.reference_1[27][24]:=AT*t*0.3824103826488193;
+Q_RELAX.reference_1[27][25]:=CT*t*0.1264560133035801;
+Q_RELAX.reference_1[27][26]:=GT*t*0.2406378906553946;
+Q_RELAX.reference_1[27][31]:=GT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.2296926126195792;
+Q_RELAX.reference_1[27][43]:=CG*t*Min(1000,RELAX.reference.omega_0^local_k)*0.3053650319994416;
+Q_RELAX.reference_1[27][56]:=CT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.250994522453953;
+Q_RELAX.reference_1[28][12]:=AC*t*Min(1000,RELAX.reference.omega_0^local_k)*0.3222350398108426;
+Q_RELAX.reference_1[28][16]:=AT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.5007522026922482;
+Q_RELAX.reference_1[28][20]:=CT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1351200521140052;
+Q_RELAX.reference_1[28][24]:=GT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1344351325741675;
+Q_RELAX.reference_1[28][29]:=AC*t*0.1264560133035801;
+Q_RELAX.reference_1[28][30]:=t*0.2406378906553946;
+Q_RELAX.reference_1[28][31]:=AT*t*0.2504957133922061;
+Q_RELAX.reference_1[28][44]:=CG*t*Min(1000,RELAX.reference.omega_0^local_k)*0.3053650319994416;
+Q_RELAX.reference_1[28][57]:=CT*t*0.250994522453953;
+Q_RELAX.reference_1[29][13]:=AC*t*Min(1000,RELAX.reference.omega_0^local_k)*0.3222350398108426;
+Q_RELAX.reference_1[29][17]:=AT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.5007522026922482;
+Q_RELAX.reference_1[29][21]:=CT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1351200521140052;
+Q_RELAX.reference_1[29][25]:=GT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1344351325741675;
+Q_RELAX.reference_1[29][28]:=AC*t*0.3824103826488193;
+Q_RELAX.reference_1[29][30]:=CG*t*0.2406378906553946;
+Q_RELAX.reference_1[29][31]:=CT*t*0.2504957133922061;
+Q_RELAX.reference_1[29][45]:=CG*t*Min(1000,RELAX.reference.omega_0^local_k)*0.3053650319994416;
+Q_RELAX.reference_1[29][58]:=CT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.250994522453953;
+Q_RELAX.reference_1[30][14]:=AC*t*Min(1000,RELAX.reference.omega_0^local_k)*0.3222350398108426;
+Q_RELAX.reference_1[30][18]:=AT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.5007522026922482;
+Q_RELAX.reference_1[30][22]:=CT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1351200521140052;
+Q_RELAX.reference_1[30][26]:=GT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1344351325741675;
+Q_RELAX.reference_1[30][28]:=t*0.3824103826488193;
+Q_RELAX.reference_1[30][29]:=CG*t*0.1264560133035801;
+Q_RELAX.reference_1[30][31]:=GT*t*0.2504957133922061;
+Q_RELAX.reference_1[30][46]:=CG*t*Min(1000,RELAX.reference.omega_0^local_k)*0.3053650319994416;
+Q_RELAX.reference_1[30][59]:=CT*t*0.250994522453953;
+Q_RELAX.reference_1[31][15]:=AC*t*Min(1000,RELAX.reference.omega_0^local_k)*0.3222350398108426;
+Q_RELAX.reference_1[31][19]:=AT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.5007522026922482;
+Q_RELAX.reference_1[31][23]:=CT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1351200521140052;
+Q_RELAX.reference_1[31][27]:=GT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1344351325741675;
+Q_RELAX.reference_1[31][28]:=AT*t*0.3824103826488193;
+Q_RELAX.reference_1[31][29]:=CT*t*0.1264560133035801;
+Q_RELAX.reference_1[31][30]:=GT*t*0.2406378906553946;
+Q_RELAX.reference_1[31][47]:=CG*t*Min(1000,RELAX.reference.omega_0^local_k)*0.3053650319994416;
+Q_RELAX.reference_1[31][60]:=CT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.250994522453953;
+Q_RELAX.reference_1[32][0]:=t*Min(1000,RELAX.reference.omega_0^local_k)*0.3222350398108426;
+Q_RELAX.reference_1[32][16]:=CG*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1214054057357627;
+Q_RELAX.reference_1[32][33]:=AC*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1264560133035801;
+Q_RELAX.reference_1[32][34]:=t*0.2406378906553946;
+Q_RELAX.reference_1[32][35]:=AT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.2504957133922061;
+Q_RELAX.reference_1[32][36]:=AC*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1351200521140052;
+Q_RELAX.reference_1[32][40]:=t*Min(1000,RELAX.reference.omega_0^local_k)*0.1344351325741675;
+Q_RELAX.reference_1[32][44]:=AT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.2296926126195792;
+Q_RELAX.reference_1[33][1]:=t*Min(1000,RELAX.reference.omega_0^local_k)*0.3222350398108426;
+Q_RELAX.reference_1[33][17]:=CG*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1214054057357627;
+Q_RELAX.reference_1[33][32]:=AC*t*Min(1000,RELAX.reference.omega_0^local_k)*0.3824103826488193;
+Q_RELAX.reference_1[33][34]:=CG*t*Min(1000,RELAX.reference.omega_0^local_k)*0.2406378906553946;
+Q_RELAX.reference_1[33][35]:=CT*t*0.2504957133922061;
+Q_RELAX.reference_1[33][37]:=AC*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1351200521140052;
+Q_RELAX.reference_1[33][41]:=t*Min(1000,RELAX.reference.omega_0^local_k)*0.1344351325741675;
+Q_RELAX.reference_1[33][45]:=AT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.2296926126195792;
+Q_RELAX.reference_1[33][48]:=GT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.250994522453953;
+Q_RELAX.reference_1[34][2]:=t*Min(1000,RELAX.reference.omega_0^local_k)*0.3222350398108426;
+Q_RELAX.reference_1[34][18]:=CG*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1214054057357627;
+Q_RELAX.reference_1[34][32]:=t*0.3824103826488193;
+Q_RELAX.reference_1[34][33]:=CG*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1264560133035801;
+Q_RELAX.reference_1[34][35]:=GT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.2504957133922061;
+Q_RELAX.reference_1[34][38]:=AC*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1351200521140052;
+Q_RELAX.reference_1[34][42]:=t*Min(1000,RELAX.reference.omega_0^local_k)*0.1344351325741675;
+Q_RELAX.reference_1[34][46]:=AT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.2296926126195792;
+Q_RELAX.reference_1[35][3]:=t*Min(1000,RELAX.reference.omega_0^local_k)*0.3222350398108426;
+Q_RELAX.reference_1[35][19]:=CG*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1214054057357627;
+Q_RELAX.reference_1[35][32]:=AT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.3824103826488193;
+Q_RELAX.reference_1[35][33]:=CT*t*0.1264560133035801;
+Q_RELAX.reference_1[35][34]:=GT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.2406378906553946;
+Q_RELAX.reference_1[35][39]:=AC*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1351200521140052;
+Q_RELAX.reference_1[35][43]:=t*Min(1000,RELAX.reference.omega_0^local_k)*0.1344351325741675;
+Q_RELAX.reference_1[35][47]:=AT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.2296926126195792;
+Q_RELAX.reference_1[35][49]:=GT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.250994522453953;
+Q_RELAX.reference_1[36][4]:=t*Min(1000,RELAX.reference.omega_0^local_k)*0.3222350398108426;
+Q_RELAX.reference_1[36][20]:=CG*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1214054057357627;
+Q_RELAX.reference_1[36][32]:=AC*t*Min(1000,RELAX.reference.omega_0^local_k)*0.5007522026922482;
+Q_RELAX.reference_1[36][37]:=AC*t*0.1264560133035801;
+Q_RELAX.reference_1[36][38]:=t*0.2406378906553946;
+Q_RELAX.reference_1[36][39]:=AT*t*0.2504957133922061;
+Q_RELAX.reference_1[36][40]:=CG*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1344351325741675;
+Q_RELAX.reference_1[36][44]:=CT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.2296926126195792;
+Q_RELAX.reference_1[36][50]:=GT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.250994522453953;
+Q_RELAX.reference_1[37][5]:=t*Min(1000,RELAX.reference.omega_0^local_k)*0.3222350398108426;
+Q_RELAX.reference_1[37][21]:=CG*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1214054057357627;
+Q_RELAX.reference_1[37][33]:=AC*t*Min(1000,RELAX.reference.omega_0^local_k)*0.5007522026922482;
+Q_RELAX.reference_1[37][36]:=AC*t*0.3824103826488193;
+Q_RELAX.reference_1[37][38]:=CG*t*0.2406378906553946;
+Q_RELAX.reference_1[37][39]:=CT*t*0.2504957133922061;
+Q_RELAX.reference_1[37][41]:=CG*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1344351325741675;
+Q_RELAX.reference_1[37][45]:=CT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.2296926126195792;
+Q_RELAX.reference_1[37][51]:=GT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.250994522453953;
+Q_RELAX.reference_1[38][6]:=t*Min(1000,RELAX.reference.omega_0^local_k)*0.3222350398108426;
+Q_RELAX.reference_1[38][22]:=CG*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1214054057357627;
+Q_RELAX.reference_1[38][34]:=AC*t*Min(1000,RELAX.reference.omega_0^local_k)*0.5007522026922482;
+Q_RELAX.reference_1[38][36]:=t*0.3824103826488193;
+Q_RELAX.reference_1[38][37]:=CG*t*0.1264560133035801;
+Q_RELAX.reference_1[38][39]:=GT*t*0.2504957133922061;
+Q_RELAX.reference_1[38][42]:=CG*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1344351325741675;
+Q_RELAX.reference_1[38][46]:=CT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.2296926126195792;
+Q_RELAX.reference_1[38][52]:=GT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.250994522453953;
+Q_RELAX.reference_1[39][7]:=t*Min(1000,RELAX.reference.omega_0^local_k)*0.3222350398108426;
+Q_RELAX.reference_1[39][23]:=CG*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1214054057357627;
+Q_RELAX.reference_1[39][35]:=AC*t*Min(1000,RELAX.reference.omega_0^local_k)*0.5007522026922482;
+Q_RELAX.reference_1[39][36]:=AT*t*0.3824103826488193;
+Q_RELAX.reference_1[39][37]:=CT*t*0.1264560133035801;
+Q_RELAX.reference_1[39][38]:=GT*t*0.2406378906553946;
+Q_RELAX.reference_1[39][43]:=CG*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1344351325741675;
+Q_RELAX.reference_1[39][47]:=CT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.2296926126195792;
+Q_RELAX.reference_1[39][53]:=GT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.250994522453953;
+Q_RELAX.reference_1[40][8]:=t*Min(1000,RELAX.reference.omega_0^local_k)*0.3222350398108426;
+Q_RELAX.reference_1[40][24]:=CG*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1214054057357627;
+Q_RELAX.reference_1[40][32]:=t*Min(1000,RELAX.reference.omega_0^local_k)*0.5007522026922482;
+Q_RELAX.reference_1[40][36]:=CG*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1351200521140052;
+Q_RELAX.reference_1[40][41]:=AC*t*0.1264560133035801;
+Q_RELAX.reference_1[40][42]:=t*0.2406378906553946;
+Q_RELAX.reference_1[40][43]:=AT*t*0.2504957133922061;
+Q_RELAX.reference_1[40][44]:=GT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.2296926126195792;
+Q_RELAX.reference_1[41][9]:=t*Min(1000,RELAX.reference.omega_0^local_k)*0.3222350398108426;
+Q_RELAX.reference_1[41][25]:=CG*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1214054057357627;
+Q_RELAX.reference_1[41][33]:=t*Min(1000,RELAX.reference.omega_0^local_k)*0.5007522026922482;
+Q_RELAX.reference_1[41][37]:=CG*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1351200521140052;
+Q_RELAX.reference_1[41][40]:=AC*t*0.3824103826488193;
+Q_RELAX.reference_1[41][42]:=CG*t*0.2406378906553946;
+Q_RELAX.reference_1[41][43]:=CT*t*0.2504957133922061;
+Q_RELAX.reference_1[41][45]:=GT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.2296926126195792;
+Q_RELAX.reference_1[41][54]:=GT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.250994522453953;
+Q_RELAX.reference_1[42][10]:=t*Min(1000,RELAX.reference.omega_0^local_k)*0.3222350398108426;
+Q_RELAX.reference_1[42][26]:=CG*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1214054057357627;
+Q_RELAX.reference_1[42][34]:=t*Min(1000,RELAX.reference.omega_0^local_k)*0.5007522026922482;
+Q_RELAX.reference_1[42][38]:=CG*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1351200521140052;
+Q_RELAX.reference_1[42][40]:=t*0.3824103826488193;
+Q_RELAX.reference_1[42][41]:=CG*t*0.1264560133035801;
+Q_RELAX.reference_1[42][43]:=GT*t*0.2504957133922061;
+Q_RELAX.reference_1[42][46]:=GT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.2296926126195792;
+Q_RELAX.reference_1[42][55]:=GT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.250994522453953;
+Q_RELAX.reference_1[43][11]:=t*Min(1000,RELAX.reference.omega_0^local_k)*0.3222350398108426;
+Q_RELAX.reference_1[43][27]:=CG*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1214054057357627;
+Q_RELAX.reference_1[43][35]:=t*Min(1000,RELAX.reference.omega_0^local_k)*0.5007522026922482;
+Q_RELAX.reference_1[43][39]:=CG*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1351200521140052;
+Q_RELAX.reference_1[43][40]:=AT*t*0.3824103826488193;
+Q_RELAX.reference_1[43][41]:=CT*t*0.1264560133035801;
+Q_RELAX.reference_1[43][42]:=GT*t*0.2406378906553946;
+Q_RELAX.reference_1[43][47]:=GT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.2296926126195792;
+Q_RELAX.reference_1[43][56]:=GT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.250994522453953;
+Q_RELAX.reference_1[44][12]:=t*Min(1000,RELAX.reference.omega_0^local_k)*0.3222350398108426;
+Q_RELAX.reference_1[44][28]:=CG*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1214054057357627;
+Q_RELAX.reference_1[44][32]:=AT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.5007522026922482;
+Q_RELAX.reference_1[44][36]:=CT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1351200521140052;
+Q_RELAX.reference_1[44][40]:=GT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1344351325741675;
+Q_RELAX.reference_1[44][45]:=AC*t*0.1264560133035801;
+Q_RELAX.reference_1[44][46]:=t*0.2406378906553946;
+Q_RELAX.reference_1[44][47]:=AT*t*0.2504957133922061;
+Q_RELAX.reference_1[44][57]:=GT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.250994522453953;
+Q_RELAX.reference_1[45][13]:=t*Min(1000,RELAX.reference.omega_0^local_k)*0.3222350398108426;
+Q_RELAX.reference_1[45][29]:=CG*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1214054057357627;
+Q_RELAX.reference_1[45][33]:=AT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.5007522026922482;
+Q_RELAX.reference_1[45][37]:=CT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1351200521140052;
+Q_RELAX.reference_1[45][41]:=GT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1344351325741675;
+Q_RELAX.reference_1[45][44]:=AC*t*0.3824103826488193;
+Q_RELAX.reference_1[45][46]:=CG*t*0.2406378906553946;
+Q_RELAX.reference_1[45][47]:=CT*t*0.2504957133922061;
+Q_RELAX.reference_1[45][58]:=GT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.250994522453953;
+Q_RELAX.reference_1[46][14]:=t*Min(1000,RELAX.reference.omega_0^local_k)*0.3222350398108426;
+Q_RELAX.reference_1[46][30]:=CG*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1214054057357627;
+Q_RELAX.reference_1[46][34]:=AT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.5007522026922482;
+Q_RELAX.reference_1[46][38]:=CT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1351200521140052;
+Q_RELAX.reference_1[46][42]:=GT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1344351325741675;
+Q_RELAX.reference_1[46][44]:=t*0.3824103826488193;
+Q_RELAX.reference_1[46][45]:=CG*t*0.1264560133035801;
+Q_RELAX.reference_1[46][47]:=GT*t*0.2504957133922061;
+Q_RELAX.reference_1[46][59]:=GT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.250994522453953;
+Q_RELAX.reference_1[47][15]:=t*Min(1000,RELAX.reference.omega_0^local_k)*0.3222350398108426;
+Q_RELAX.reference_1[47][31]:=CG*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1214054057357627;
+Q_RELAX.reference_1[47][35]:=AT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.5007522026922482;
+Q_RELAX.reference_1[47][39]:=CT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1351200521140052;
+Q_RELAX.reference_1[47][43]:=GT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1344351325741675;
+Q_RELAX.reference_1[47][44]:=AT*t*0.3824103826488193;
+Q_RELAX.reference_1[47][45]:=CT*t*0.1264560133035801;
+Q_RELAX.reference_1[47][46]:=GT*t*0.2406378906553946;
+Q_RELAX.reference_1[47][60]:=GT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.250994522453953;
+Q_RELAX.reference_1[48][1]:=AT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.3222350398108426;
+Q_RELAX.reference_1[48][17]:=CT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1214054057357627;
+Q_RELAX.reference_1[48][33]:=GT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.3053650319994416;
+Q_RELAX.reference_1[48][49]:=CT*t*0.2504957133922061;
+Q_RELAX.reference_1[48][51]:=AC*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1351200521140052;
+Q_RELAX.reference_1[48][54]:=t*Min(1000,RELAX.reference.omega_0^local_k)*0.1344351325741675;
+Q_RELAX.reference_1[48][58]:=AT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.2296926126195792;
+Q_RELAX.reference_1[49][3]:=AT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.3222350398108426;
+Q_RELAX.reference_1[49][19]:=CT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1214054057357627;
+Q_RELAX.reference_1[49][35]:=GT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.3053650319994416;
+Q_RELAX.reference_1[49][48]:=CT*t*0.1264560133035801;
+Q_RELAX.reference_1[49][53]:=AC*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1351200521140052;
+Q_RELAX.reference_1[49][56]:=t*Min(1000,RELAX.reference.omega_0^local_k)*0.1344351325741675;
+Q_RELAX.reference_1[49][60]:=AT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.2296926126195792;
+Q_RELAX.reference_1[50][4]:=AT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.3222350398108426;
+Q_RELAX.reference_1[50][20]:=CT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1214054057357627;
+Q_RELAX.reference_1[50][36]:=GT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.3053650319994416;
+Q_RELAX.reference_1[50][51]:=AC*t*0.1264560133035801;
+Q_RELAX.reference_1[50][52]:=t*0.2406378906553946;
+Q_RELAX.reference_1[50][53]:=AT*t*0.2504957133922061;
+Q_RELAX.reference_1[50][57]:=CT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.2296926126195792;
+Q_RELAX.reference_1[51][5]:=AT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.3222350398108426;
+Q_RELAX.reference_1[51][21]:=CT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1214054057357627;
+Q_RELAX.reference_1[51][37]:=GT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.3053650319994416;
+Q_RELAX.reference_1[51][48]:=AC*t*Min(1000,RELAX.reference.omega_0^local_k)*0.5007522026922482;
+Q_RELAX.reference_1[51][50]:=AC*t*0.3824103826488193;
+Q_RELAX.reference_1[51][52]:=CG*t*0.2406378906553946;
+Q_RELAX.reference_1[51][53]:=CT*t*0.2504957133922061;
+Q_RELAX.reference_1[51][54]:=CG*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1344351325741675;
+Q_RELAX.reference_1[51][58]:=CT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.2296926126195792;
+Q_RELAX.reference_1[52][6]:=AT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.3222350398108426;
+Q_RELAX.reference_1[52][22]:=CT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1214054057357627;
+Q_RELAX.reference_1[52][38]:=GT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.3053650319994416;
+Q_RELAX.reference_1[52][50]:=t*0.3824103826488193;
+Q_RELAX.reference_1[52][51]:=CG*t*0.1264560133035801;
+Q_RELAX.reference_1[52][53]:=GT*t*0.2504957133922061;
+Q_RELAX.reference_1[52][55]:=CG*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1344351325741675;
+Q_RELAX.reference_1[52][59]:=CT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.2296926126195792;
+Q_RELAX.reference_1[53][7]:=AT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.3222350398108426;
+Q_RELAX.reference_1[53][23]:=CT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1214054057357627;
+Q_RELAX.reference_1[53][39]:=GT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.3053650319994416;
+Q_RELAX.reference_1[53][49]:=AC*t*Min(1000,RELAX.reference.omega_0^local_k)*0.5007522026922482;
+Q_RELAX.reference_1[53][50]:=AT*t*0.3824103826488193;
+Q_RELAX.reference_1[53][51]:=CT*t*0.1264560133035801;
+Q_RELAX.reference_1[53][52]:=GT*t*0.2406378906553946;
+Q_RELAX.reference_1[53][56]:=CG*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1344351325741675;
+Q_RELAX.reference_1[53][60]:=CT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.2296926126195792;
+Q_RELAX.reference_1[54][9]:=AT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.3222350398108426;
+Q_RELAX.reference_1[54][25]:=CT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1214054057357627;
+Q_RELAX.reference_1[54][41]:=GT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.3053650319994416;
+Q_RELAX.reference_1[54][48]:=t*Min(1000,RELAX.reference.omega_0^local_k)*0.5007522026922482;
+Q_RELAX.reference_1[54][51]:=CG*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1351200521140052;
+Q_RELAX.reference_1[54][55]:=CG*t*Min(1000,RELAX.reference.omega_0^local_k)*0.2406378906553946;
+Q_RELAX.reference_1[54][56]:=CT*t*0.2504957133922061;
+Q_RELAX.reference_1[54][58]:=GT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.2296926126195792;
+Q_RELAX.reference_1[55][10]:=AT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.3222350398108426;
+Q_RELAX.reference_1[55][26]:=CT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1214054057357627;
+Q_RELAX.reference_1[55][42]:=GT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.3053650319994416;
+Q_RELAX.reference_1[55][52]:=CG*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1351200521140052;
+Q_RELAX.reference_1[55][54]:=CG*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1264560133035801;
+Q_RELAX.reference_1[55][56]:=GT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.2504957133922061;
+Q_RELAX.reference_1[55][59]:=GT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.2296926126195792;
+Q_RELAX.reference_1[56][11]:=AT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.3222350398108426;
+Q_RELAX.reference_1[56][27]:=CT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1214054057357627;
+Q_RELAX.reference_1[56][43]:=GT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.3053650319994416;
+Q_RELAX.reference_1[56][49]:=t*Min(1000,RELAX.reference.omega_0^local_k)*0.5007522026922482;
+Q_RELAX.reference_1[56][53]:=CG*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1351200521140052;
+Q_RELAX.reference_1[56][54]:=CT*t*0.1264560133035801;
+Q_RELAX.reference_1[56][55]:=GT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.2406378906553946;
+Q_RELAX.reference_1[56][60]:=GT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.2296926126195792;
+Q_RELAX.reference_1[57][12]:=AT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.3222350398108426;
+Q_RELAX.reference_1[57][28]:=CT*t*0.1214054057357627;
+Q_RELAX.reference_1[57][44]:=GT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.3053650319994416;
+Q_RELAX.reference_1[57][50]:=CT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1351200521140052;
+Q_RELAX.reference_1[57][58]:=AC*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1264560133035801;
+Q_RELAX.reference_1[57][59]:=t*0.2406378906553946;
+Q_RELAX.reference_1[57][60]:=AT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.2504957133922061;
+Q_RELAX.reference_1[58][13]:=AT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.3222350398108426;
+Q_RELAX.reference_1[58][29]:=CT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1214054057357627;
+Q_RELAX.reference_1[58][45]:=GT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.3053650319994416;
+Q_RELAX.reference_1[58][48]:=AT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.5007522026922482;
+Q_RELAX.reference_1[58][51]:=CT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1351200521140052;
+Q_RELAX.reference_1[58][54]:=GT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1344351325741675;
+Q_RELAX.reference_1[58][57]:=AC*t*Min(1000,RELAX.reference.omega_0^local_k)*0.3824103826488193;
+Q_RELAX.reference_1[58][59]:=CG*t*Min(1000,RELAX.reference.omega_0^local_k)*0.2406378906553946;
+Q_RELAX.reference_1[58][60]:=CT*t*0.2504957133922061;
+Q_RELAX.reference_1[59][14]:=AT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.3222350398108426;
+Q_RELAX.reference_1[59][30]:=CT*t*0.1214054057357627;
+Q_RELAX.reference_1[59][46]:=GT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.3053650319994416;
+Q_RELAX.reference_1[59][52]:=CT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1351200521140052;
+Q_RELAX.reference_1[59][55]:=GT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1344351325741675;
+Q_RELAX.reference_1[59][57]:=t*0.3824103826488193;
+Q_RELAX.reference_1[59][58]:=CG*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1264560133035801;
+Q_RELAX.reference_1[59][60]:=GT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.2504957133922061;
+Q_RELAX.reference_1[60][15]:=AT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.3222350398108426;
+Q_RELAX.reference_1[60][31]:=CT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1214054057357627;
+Q_RELAX.reference_1[60][47]:=GT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.3053650319994416;
+Q_RELAX.reference_1[60][49]:=AT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.5007522026922482;
+Q_RELAX.reference_1[60][53]:=CT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1351200521140052;
+Q_RELAX.reference_1[60][56]:=GT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.1344351325741675;
+Q_RELAX.reference_1[60][57]:=AT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.3824103826488193;
+Q_RELAX.reference_1[60][58]:=CT*t*0.1264560133035801;
+Q_RELAX.reference_1[60][59]:=GT*t*Min(1000,RELAX.reference.omega_0^local_k)*0.2406378906553946;
+
+
+Q_RELAX.reference_2={61,61};
+Q_RELAX.reference_2[0][1]:=AC*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1264560133035801;
+Q_RELAX.reference_2[0][2]:=t*0.2406378906553946;
+Q_RELAX.reference_2[0][3]:=AT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.2504957133922061;
+Q_RELAX.reference_2[0][4]:=AC*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1351200521140052;
+Q_RELAX.reference_2[0][8]:=t*Min(1000,RELAX.reference.omega_1^local_k)*0.1344351325741675;
+Q_RELAX.reference_2[0][12]:=AT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.2296926126195792;
+Q_RELAX.reference_2[0][16]:=AC*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1214054057357627;
+Q_RELAX.reference_2[0][32]:=t*Min(1000,RELAX.reference.omega_1^local_k)*0.3053650319994416;
+Q_RELAX.reference_2[1][0]:=AC*t*Min(1000,RELAX.reference.omega_1^local_k)*0.3824103826488193;
+Q_RELAX.reference_2[1][2]:=CG*t*Min(1000,RELAX.reference.omega_1^local_k)*0.2406378906553946;
+Q_RELAX.reference_2[1][3]:=CT*t*0.2504957133922061;
+Q_RELAX.reference_2[1][5]:=AC*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1351200521140052;
+Q_RELAX.reference_2[1][9]:=t*Min(1000,RELAX.reference.omega_1^local_k)*0.1344351325741675;
+Q_RELAX.reference_2[1][13]:=AT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.2296926126195792;
+Q_RELAX.reference_2[1][17]:=AC*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1214054057357627;
+Q_RELAX.reference_2[1][33]:=t*Min(1000,RELAX.reference.omega_1^local_k)*0.3053650319994416;
+Q_RELAX.reference_2[1][48]:=AT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.250994522453953;
+Q_RELAX.reference_2[2][0]:=t*0.3824103826488193;
+Q_RELAX.reference_2[2][1]:=CG*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1264560133035801;
+Q_RELAX.reference_2[2][3]:=GT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.2504957133922061;
+Q_RELAX.reference_2[2][6]:=AC*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1351200521140052;
+Q_RELAX.reference_2[2][10]:=t*Min(1000,RELAX.reference.omega_1^local_k)*0.1344351325741675;
+Q_RELAX.reference_2[2][14]:=AT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.2296926126195792;
+Q_RELAX.reference_2[2][18]:=AC*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1214054057357627;
+Q_RELAX.reference_2[2][34]:=t*Min(1000,RELAX.reference.omega_1^local_k)*0.3053650319994416;
+Q_RELAX.reference_2[3][0]:=AT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.3824103826488193;
+Q_RELAX.reference_2[3][1]:=CT*t*0.1264560133035801;
+Q_RELAX.reference_2[3][2]:=GT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.2406378906553946;
+Q_RELAX.reference_2[3][7]:=AC*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1351200521140052;
+Q_RELAX.reference_2[3][11]:=t*Min(1000,RELAX.reference.omega_1^local_k)*0.1344351325741675;
+Q_RELAX.reference_2[3][15]:=AT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.2296926126195792;
+Q_RELAX.reference_2[3][19]:=AC*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1214054057357627;
+Q_RELAX.reference_2[3][35]:=t*Min(1000,RELAX.reference.omega_1^local_k)*0.3053650319994416;
+Q_RELAX.reference_2[3][49]:=AT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.250994522453953;
+Q_RELAX.reference_2[4][0]:=AC*t*Min(1000,RELAX.reference.omega_1^local_k)*0.5007522026922482;
+Q_RELAX.reference_2[4][5]:=AC*t*0.1264560133035801;
+Q_RELAX.reference_2[4][6]:=t*0.2406378906553946;
+Q_RELAX.reference_2[4][7]:=AT*t*0.2504957133922061;
+Q_RELAX.reference_2[4][8]:=CG*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1344351325741675;
+Q_RELAX.reference_2[4][12]:=CT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.2296926126195792;
+Q_RELAX.reference_2[4][20]:=AC*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1214054057357627;
+Q_RELAX.reference_2[4][36]:=t*Min(1000,RELAX.reference.omega_1^local_k)*0.3053650319994416;
+Q_RELAX.reference_2[4][50]:=AT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.250994522453953;
+Q_RELAX.reference_2[5][1]:=AC*t*Min(1000,RELAX.reference.omega_1^local_k)*0.5007522026922482;
+Q_RELAX.reference_2[5][4]:=AC*t*0.3824103826488193;
+Q_RELAX.reference_2[5][6]:=CG*t*0.2406378906553946;
+Q_RELAX.reference_2[5][7]:=CT*t*0.2504957133922061;
+Q_RELAX.reference_2[5][9]:=CG*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1344351325741675;
+Q_RELAX.reference_2[5][13]:=CT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.2296926126195792;
+Q_RELAX.reference_2[5][21]:=AC*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1214054057357627;
+Q_RELAX.reference_2[5][37]:=t*Min(1000,RELAX.reference.omega_1^local_k)*0.3053650319994416;
+Q_RELAX.reference_2[5][51]:=AT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.250994522453953;
+Q_RELAX.reference_2[6][2]:=AC*t*Min(1000,RELAX.reference.omega_1^local_k)*0.5007522026922482;
+Q_RELAX.reference_2[6][4]:=t*0.3824103826488193;
+Q_RELAX.reference_2[6][5]:=CG*t*0.1264560133035801;
+Q_RELAX.reference_2[6][7]:=GT*t*0.2504957133922061;
+Q_RELAX.reference_2[6][10]:=CG*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1344351325741675;
+Q_RELAX.reference_2[6][14]:=CT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.2296926126195792;
+Q_RELAX.reference_2[6][22]:=AC*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1214054057357627;
+Q_RELAX.reference_2[6][38]:=t*Min(1000,RELAX.reference.omega_1^local_k)*0.3053650319994416;
+Q_RELAX.reference_2[6][52]:=AT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.250994522453953;
+Q_RELAX.reference_2[7][3]:=AC*t*Min(1000,RELAX.reference.omega_1^local_k)*0.5007522026922482;
+Q_RELAX.reference_2[7][4]:=AT*t*0.3824103826488193;
+Q_RELAX.reference_2[7][5]:=CT*t*0.1264560133035801;
+Q_RELAX.reference_2[7][6]:=GT*t*0.2406378906553946;
+Q_RELAX.reference_2[7][11]:=CG*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1344351325741675;
+Q_RELAX.reference_2[7][15]:=CT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.2296926126195792;
+Q_RELAX.reference_2[7][23]:=AC*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1214054057357627;
+Q_RELAX.reference_2[7][39]:=t*Min(1000,RELAX.reference.omega_1^local_k)*0.3053650319994416;
+Q_RELAX.reference_2[7][53]:=AT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.250994522453953;
+Q_RELAX.reference_2[8][0]:=t*Min(1000,RELAX.reference.omega_1^local_k)*0.5007522026922482;
+Q_RELAX.reference_2[8][4]:=CG*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1351200521140052;
+Q_RELAX.reference_2[8][9]:=AC*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1264560133035801;
+Q_RELAX.reference_2[8][10]:=t*0.2406378906553946;
+Q_RELAX.reference_2[8][11]:=AT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.2504957133922061;
+Q_RELAX.reference_2[8][12]:=GT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.2296926126195792;
+Q_RELAX.reference_2[8][24]:=AC*t*0.1214054057357627;
+Q_RELAX.reference_2[8][40]:=t*Min(1000,RELAX.reference.omega_1^local_k)*0.3053650319994416;
+Q_RELAX.reference_2[9][1]:=t*Min(1000,RELAX.reference.omega_1^local_k)*0.5007522026922482;
+Q_RELAX.reference_2[9][5]:=CG*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1351200521140052;
+Q_RELAX.reference_2[9][8]:=AC*t*Min(1000,RELAX.reference.omega_1^local_k)*0.3824103826488193;
+Q_RELAX.reference_2[9][10]:=CG*t*Min(1000,RELAX.reference.omega_1^local_k)*0.2406378906553946;
+Q_RELAX.reference_2[9][11]:=CT*t*0.2504957133922061;
+Q_RELAX.reference_2[9][13]:=GT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.2296926126195792;
+Q_RELAX.reference_2[9][25]:=AC*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1214054057357627;
+Q_RELAX.reference_2[9][41]:=t*Min(1000,RELAX.reference.omega_1^local_k)*0.3053650319994416;
+Q_RELAX.reference_2[9][54]:=AT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.250994522453953;
+Q_RELAX.reference_2[10][2]:=t*Min(1000,RELAX.reference.omega_1^local_k)*0.5007522026922482;
+Q_RELAX.reference_2[10][6]:=CG*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1351200521140052;
+Q_RELAX.reference_2[10][8]:=t*0.3824103826488193;
+Q_RELAX.reference_2[10][9]:=CG*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1264560133035801;
+Q_RELAX.reference_2[10][11]:=GT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.2504957133922061;
+Q_RELAX.reference_2[10][14]:=GT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.2296926126195792;
+Q_RELAX.reference_2[10][26]:=AC*t*0.1214054057357627;
+Q_RELAX.reference_2[10][42]:=t*Min(1000,RELAX.reference.omega_1^local_k)*0.3053650319994416;
+Q_RELAX.reference_2[10][55]:=AT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.250994522453953;
+Q_RELAX.reference_2[11][3]:=t*Min(1000,RELAX.reference.omega_1^local_k)*0.5007522026922482;
+Q_RELAX.reference_2[11][7]:=CG*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1351200521140052;
+Q_RELAX.reference_2[11][8]:=AT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.3824103826488193;
+Q_RELAX.reference_2[11][9]:=CT*t*0.1264560133035801;
+Q_RELAX.reference_2[11][10]:=GT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.2406378906553946;
+Q_RELAX.reference_2[11][15]:=GT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.2296926126195792;
+Q_RELAX.reference_2[11][27]:=AC*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1214054057357627;
+Q_RELAX.reference_2[11][43]:=t*Min(1000,RELAX.reference.omega_1^local_k)*0.3053650319994416;
+Q_RELAX.reference_2[11][56]:=AT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.250994522453953;
+Q_RELAX.reference_2[12][0]:=AT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.5007522026922482;
+Q_RELAX.reference_2[12][4]:=CT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1351200521140052;
+Q_RELAX.reference_2[12][8]:=GT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1344351325741675;
+Q_RELAX.reference_2[12][13]:=AC*t*0.1264560133035801;
+Q_RELAX.reference_2[12][14]:=t*Min(1000,RELAX.reference.omega_1^local_k)*0.2406378906553946;
+Q_RELAX.reference_2[12][15]:=AT*t*0.2504957133922061;
+Q_RELAX.reference_2[12][28]:=AC*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1214054057357627;
+Q_RELAX.reference_2[12][44]:=t*Min(1000,RELAX.reference.omega_1^local_k)*0.3053650319994416;
+Q_RELAX.reference_2[12][57]:=AT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.250994522453953;
+Q_RELAX.reference_2[13][1]:=AT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.5007522026922482;
+Q_RELAX.reference_2[13][5]:=CT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1351200521140052;
+Q_RELAX.reference_2[13][9]:=GT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1344351325741675;
+Q_RELAX.reference_2[13][12]:=AC*t*0.3824103826488193;
+Q_RELAX.reference_2[13][14]:=CG*t*Min(1000,RELAX.reference.omega_1^local_k)*0.2406378906553946;
+Q_RELAX.reference_2[13][15]:=CT*t*0.2504957133922061;
+Q_RELAX.reference_2[13][29]:=AC*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1214054057357627;
+Q_RELAX.reference_2[13][45]:=t*Min(1000,RELAX.reference.omega_1^local_k)*0.3053650319994416;
+Q_RELAX.reference_2[13][58]:=AT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.250994522453953;
+Q_RELAX.reference_2[14][2]:=AT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.5007522026922482;
+Q_RELAX.reference_2[14][6]:=CT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1351200521140052;
+Q_RELAX.reference_2[14][10]:=GT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1344351325741675;
+Q_RELAX.reference_2[14][12]:=t*Min(1000,RELAX.reference.omega_1^local_k)*0.3824103826488193;
+Q_RELAX.reference_2[14][13]:=CG*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1264560133035801;
+Q_RELAX.reference_2[14][15]:=GT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.2504957133922061;
+Q_RELAX.reference_2[14][30]:=AC*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1214054057357627;
+Q_RELAX.reference_2[14][46]:=t*Min(1000,RELAX.reference.omega_1^local_k)*0.3053650319994416;
+Q_RELAX.reference_2[14][59]:=AT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.250994522453953;
+Q_RELAX.reference_2[15][3]:=AT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.5007522026922482;
+Q_RELAX.reference_2[15][7]:=CT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1351200521140052;
+Q_RELAX.reference_2[15][11]:=GT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1344351325741675;
+Q_RELAX.reference_2[15][12]:=AT*t*0.3824103826488193;
+Q_RELAX.reference_2[15][13]:=CT*t*0.1264560133035801;
+Q_RELAX.reference_2[15][14]:=GT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.2406378906553946;
+Q_RELAX.reference_2[15][31]:=AC*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1214054057357627;
+Q_RELAX.reference_2[15][47]:=t*Min(1000,RELAX.reference.omega_1^local_k)*0.3053650319994416;
+Q_RELAX.reference_2[15][60]:=AT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.250994522453953;
+Q_RELAX.reference_2[16][0]:=AC*t*Min(1000,RELAX.reference.omega_1^local_k)*0.3222350398108426;
+Q_RELAX.reference_2[16][17]:=AC*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1264560133035801;
+Q_RELAX.reference_2[16][18]:=t*0.2406378906553946;
+Q_RELAX.reference_2[16][19]:=AT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.2504957133922061;
+Q_RELAX.reference_2[16][20]:=AC*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1351200521140052;
+Q_RELAX.reference_2[16][24]:=t*Min(1000,RELAX.reference.omega_1^local_k)*0.1344351325741675;
+Q_RELAX.reference_2[16][28]:=AT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.2296926126195792;
+Q_RELAX.reference_2[16][32]:=CG*t*Min(1000,RELAX.reference.omega_1^local_k)*0.3053650319994416;
+Q_RELAX.reference_2[17][1]:=AC*t*Min(1000,RELAX.reference.omega_1^local_k)*0.3222350398108426;
+Q_RELAX.reference_2[17][16]:=AC*t*Min(1000,RELAX.reference.omega_1^local_k)*0.3824103826488193;
+Q_RELAX.reference_2[17][18]:=CG*t*Min(1000,RELAX.reference.omega_1^local_k)*0.2406378906553946;
+Q_RELAX.reference_2[17][19]:=CT*t*0.2504957133922061;
+Q_RELAX.reference_2[17][21]:=AC*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1351200521140052;
+Q_RELAX.reference_2[17][25]:=t*Min(1000,RELAX.reference.omega_1^local_k)*0.1344351325741675;
+Q_RELAX.reference_2[17][29]:=AT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.2296926126195792;
+Q_RELAX.reference_2[17][33]:=CG*t*Min(1000,RELAX.reference.omega_1^local_k)*0.3053650319994416;
+Q_RELAX.reference_2[17][48]:=CT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.250994522453953;
+Q_RELAX.reference_2[18][2]:=AC*t*Min(1000,RELAX.reference.omega_1^local_k)*0.3222350398108426;
+Q_RELAX.reference_2[18][16]:=t*0.3824103826488193;
+Q_RELAX.reference_2[18][17]:=CG*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1264560133035801;
+Q_RELAX.reference_2[18][19]:=GT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.2504957133922061;
+Q_RELAX.reference_2[18][22]:=AC*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1351200521140052;
+Q_RELAX.reference_2[18][26]:=t*Min(1000,RELAX.reference.omega_1^local_k)*0.1344351325741675;
+Q_RELAX.reference_2[18][30]:=AT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.2296926126195792;
+Q_RELAX.reference_2[18][34]:=CG*t*Min(1000,RELAX.reference.omega_1^local_k)*0.3053650319994416;
+Q_RELAX.reference_2[19][3]:=AC*t*Min(1000,RELAX.reference.omega_1^local_k)*0.3222350398108426;
+Q_RELAX.reference_2[19][16]:=AT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.3824103826488193;
+Q_RELAX.reference_2[19][17]:=CT*t*0.1264560133035801;
+Q_RELAX.reference_2[19][18]:=GT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.2406378906553946;
+Q_RELAX.reference_2[19][23]:=AC*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1351200521140052;
+Q_RELAX.reference_2[19][27]:=t*Min(1000,RELAX.reference.omega_1^local_k)*0.1344351325741675;
+Q_RELAX.reference_2[19][31]:=AT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.2296926126195792;
+Q_RELAX.reference_2[19][35]:=CG*t*Min(1000,RELAX.reference.omega_1^local_k)*0.3053650319994416;
+Q_RELAX.reference_2[19][49]:=CT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.250994522453953;
+Q_RELAX.reference_2[20][4]:=AC*t*Min(1000,RELAX.reference.omega_1^local_k)*0.3222350398108426;
+Q_RELAX.reference_2[20][16]:=AC*t*Min(1000,RELAX.reference.omega_1^local_k)*0.5007522026922482;
+Q_RELAX.reference_2[20][21]:=AC*t*0.1264560133035801;
+Q_RELAX.reference_2[20][22]:=t*0.2406378906553946;
+Q_RELAX.reference_2[20][23]:=AT*t*0.2504957133922061;
+Q_RELAX.reference_2[20][24]:=CG*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1344351325741675;
+Q_RELAX.reference_2[20][28]:=CT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.2296926126195792;
+Q_RELAX.reference_2[20][36]:=CG*t*Min(1000,RELAX.reference.omega_1^local_k)*0.3053650319994416;
+Q_RELAX.reference_2[20][50]:=CT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.250994522453953;
+Q_RELAX.reference_2[21][5]:=AC*t*Min(1000,RELAX.reference.omega_1^local_k)*0.3222350398108426;
+Q_RELAX.reference_2[21][17]:=AC*t*Min(1000,RELAX.reference.omega_1^local_k)*0.5007522026922482;
+Q_RELAX.reference_2[21][20]:=AC*t*0.3824103826488193;
+Q_RELAX.reference_2[21][22]:=CG*t*0.2406378906553946;
+Q_RELAX.reference_2[21][23]:=CT*t*0.2504957133922061;
+Q_RELAX.reference_2[21][25]:=CG*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1344351325741675;
+Q_RELAX.reference_2[21][29]:=CT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.2296926126195792;
+Q_RELAX.reference_2[21][37]:=CG*t*Min(1000,RELAX.reference.omega_1^local_k)*0.3053650319994416;
+Q_RELAX.reference_2[21][51]:=CT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.250994522453953;
+Q_RELAX.reference_2[22][6]:=AC*t*Min(1000,RELAX.reference.omega_1^local_k)*0.3222350398108426;
+Q_RELAX.reference_2[22][18]:=AC*t*Min(1000,RELAX.reference.omega_1^local_k)*0.5007522026922482;
+Q_RELAX.reference_2[22][20]:=t*0.3824103826488193;
+Q_RELAX.reference_2[22][21]:=CG*t*0.1264560133035801;
+Q_RELAX.reference_2[22][23]:=GT*t*0.2504957133922061;
+Q_RELAX.reference_2[22][26]:=CG*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1344351325741675;
+Q_RELAX.reference_2[22][30]:=CT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.2296926126195792;
+Q_RELAX.reference_2[22][38]:=CG*t*Min(1000,RELAX.reference.omega_1^local_k)*0.3053650319994416;
+Q_RELAX.reference_2[22][52]:=CT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.250994522453953;
+Q_RELAX.reference_2[23][7]:=AC*t*Min(1000,RELAX.reference.omega_1^local_k)*0.3222350398108426;
+Q_RELAX.reference_2[23][19]:=AC*t*Min(1000,RELAX.reference.omega_1^local_k)*0.5007522026922482;
+Q_RELAX.reference_2[23][20]:=AT*t*0.3824103826488193;
+Q_RELAX.reference_2[23][21]:=CT*t*0.1264560133035801;
+Q_RELAX.reference_2[23][22]:=GT*t*0.2406378906553946;
+Q_RELAX.reference_2[23][27]:=CG*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1344351325741675;
+Q_RELAX.reference_2[23][31]:=CT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.2296926126195792;
+Q_RELAX.reference_2[23][39]:=CG*t*Min(1000,RELAX.reference.omega_1^local_k)*0.3053650319994416;
+Q_RELAX.reference_2[23][53]:=CT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.250994522453953;
+Q_RELAX.reference_2[24][8]:=AC*t*0.3222350398108426;
+Q_RELAX.reference_2[24][16]:=t*Min(1000,RELAX.reference.omega_1^local_k)*0.5007522026922482;
+Q_RELAX.reference_2[24][20]:=CG*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1351200521140052;
+Q_RELAX.reference_2[24][25]:=AC*t*0.1264560133035801;
+Q_RELAX.reference_2[24][26]:=t*0.2406378906553946;
+Q_RELAX.reference_2[24][27]:=AT*t*0.2504957133922061;
+Q_RELAX.reference_2[24][28]:=GT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.2296926126195792;
+Q_RELAX.reference_2[24][40]:=CG*t*Min(1000,RELAX.reference.omega_1^local_k)*0.3053650319994416;
+Q_RELAX.reference_2[25][9]:=AC*t*Min(1000,RELAX.reference.omega_1^local_k)*0.3222350398108426;
+Q_RELAX.reference_2[25][17]:=t*Min(1000,RELAX.reference.omega_1^local_k)*0.5007522026922482;
+Q_RELAX.reference_2[25][21]:=CG*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1351200521140052;
+Q_RELAX.reference_2[25][24]:=AC*t*0.3824103826488193;
+Q_RELAX.reference_2[25][26]:=CG*t*0.2406378906553946;
+Q_RELAX.reference_2[25][27]:=CT*t*0.2504957133922061;
+Q_RELAX.reference_2[25][29]:=GT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.2296926126195792;
+Q_RELAX.reference_2[25][41]:=CG*t*Min(1000,RELAX.reference.omega_1^local_k)*0.3053650319994416;
+Q_RELAX.reference_2[25][54]:=CT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.250994522453953;
+Q_RELAX.reference_2[26][10]:=AC*t*0.3222350398108426;
+Q_RELAX.reference_2[26][18]:=t*Min(1000,RELAX.reference.omega_1^local_k)*0.5007522026922482;
+Q_RELAX.reference_2[26][22]:=CG*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1351200521140052;
+Q_RELAX.reference_2[26][24]:=t*0.3824103826488193;
+Q_RELAX.reference_2[26][25]:=CG*t*0.1264560133035801;
+Q_RELAX.reference_2[26][27]:=GT*t*0.2504957133922061;
+Q_RELAX.reference_2[26][30]:=GT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.2296926126195792;
+Q_RELAX.reference_2[26][42]:=CG*t*Min(1000,RELAX.reference.omega_1^local_k)*0.3053650319994416;
+Q_RELAX.reference_2[26][55]:=CT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.250994522453953;
+Q_RELAX.reference_2[27][11]:=AC*t*Min(1000,RELAX.reference.omega_1^local_k)*0.3222350398108426;
+Q_RELAX.reference_2[27][19]:=t*Min(1000,RELAX.reference.omega_1^local_k)*0.5007522026922482;
+Q_RELAX.reference_2[27][23]:=CG*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1351200521140052;
+Q_RELAX.reference_2[27][24]:=AT*t*0.3824103826488193;
+Q_RELAX.reference_2[27][25]:=CT*t*0.1264560133035801;
+Q_RELAX.reference_2[27][26]:=GT*t*0.2406378906553946;
+Q_RELAX.reference_2[27][31]:=GT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.2296926126195792;
+Q_RELAX.reference_2[27][43]:=CG*t*Min(1000,RELAX.reference.omega_1^local_k)*0.3053650319994416;
+Q_RELAX.reference_2[27][56]:=CT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.250994522453953;
+Q_RELAX.reference_2[28][12]:=AC*t*Min(1000,RELAX.reference.omega_1^local_k)*0.3222350398108426;
+Q_RELAX.reference_2[28][16]:=AT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.5007522026922482;
+Q_RELAX.reference_2[28][20]:=CT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1351200521140052;
+Q_RELAX.reference_2[28][24]:=GT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1344351325741675;
+Q_RELAX.reference_2[28][29]:=AC*t*0.1264560133035801;
+Q_RELAX.reference_2[28][30]:=t*0.2406378906553946;
+Q_RELAX.reference_2[28][31]:=AT*t*0.2504957133922061;
+Q_RELAX.reference_2[28][44]:=CG*t*Min(1000,RELAX.reference.omega_1^local_k)*0.3053650319994416;
+Q_RELAX.reference_2[28][57]:=CT*t*0.250994522453953;
+Q_RELAX.reference_2[29][13]:=AC*t*Min(1000,RELAX.reference.omega_1^local_k)*0.3222350398108426;
+Q_RELAX.reference_2[29][17]:=AT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.5007522026922482;
+Q_RELAX.reference_2[29][21]:=CT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1351200521140052;
+Q_RELAX.reference_2[29][25]:=GT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1344351325741675;
+Q_RELAX.reference_2[29][28]:=AC*t*0.3824103826488193;
+Q_RELAX.reference_2[29][30]:=CG*t*0.2406378906553946;
+Q_RELAX.reference_2[29][31]:=CT*t*0.2504957133922061;
+Q_RELAX.reference_2[29][45]:=CG*t*Min(1000,RELAX.reference.omega_1^local_k)*0.3053650319994416;
+Q_RELAX.reference_2[29][58]:=CT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.250994522453953;
+Q_RELAX.reference_2[30][14]:=AC*t*Min(1000,RELAX.reference.omega_1^local_k)*0.3222350398108426;
+Q_RELAX.reference_2[30][18]:=AT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.5007522026922482;
+Q_RELAX.reference_2[30][22]:=CT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1351200521140052;
+Q_RELAX.reference_2[30][26]:=GT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1344351325741675;
+Q_RELAX.reference_2[30][28]:=t*0.3824103826488193;
+Q_RELAX.reference_2[30][29]:=CG*t*0.1264560133035801;
+Q_RELAX.reference_2[30][31]:=GT*t*0.2504957133922061;
+Q_RELAX.reference_2[30][46]:=CG*t*Min(1000,RELAX.reference.omega_1^local_k)*0.3053650319994416;
+Q_RELAX.reference_2[30][59]:=CT*t*0.250994522453953;
+Q_RELAX.reference_2[31][15]:=AC*t*Min(1000,RELAX.reference.omega_1^local_k)*0.3222350398108426;
+Q_RELAX.reference_2[31][19]:=AT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.5007522026922482;
+Q_RELAX.reference_2[31][23]:=CT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1351200521140052;
+Q_RELAX.reference_2[31][27]:=GT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1344351325741675;
+Q_RELAX.reference_2[31][28]:=AT*t*0.3824103826488193;
+Q_RELAX.reference_2[31][29]:=CT*t*0.1264560133035801;
+Q_RELAX.reference_2[31][30]:=GT*t*0.2406378906553946;
+Q_RELAX.reference_2[31][47]:=CG*t*Min(1000,RELAX.reference.omega_1^local_k)*0.3053650319994416;
+Q_RELAX.reference_2[31][60]:=CT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.250994522453953;
+Q_RELAX.reference_2[32][0]:=t*Min(1000,RELAX.reference.omega_1^local_k)*0.3222350398108426;
+Q_RELAX.reference_2[32][16]:=CG*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1214054057357627;
+Q_RELAX.reference_2[32][33]:=AC*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1264560133035801;
+Q_RELAX.reference_2[32][34]:=t*0.2406378906553946;
+Q_RELAX.reference_2[32][35]:=AT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.2504957133922061;
+Q_RELAX.reference_2[32][36]:=AC*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1351200521140052;
+Q_RELAX.reference_2[32][40]:=t*Min(1000,RELAX.reference.omega_1^local_k)*0.1344351325741675;
+Q_RELAX.reference_2[32][44]:=AT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.2296926126195792;
+Q_RELAX.reference_2[33][1]:=t*Min(1000,RELAX.reference.omega_1^local_k)*0.3222350398108426;
+Q_RELAX.reference_2[33][17]:=CG*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1214054057357627;
+Q_RELAX.reference_2[33][32]:=AC*t*Min(1000,RELAX.reference.omega_1^local_k)*0.3824103826488193;
+Q_RELAX.reference_2[33][34]:=CG*t*Min(1000,RELAX.reference.omega_1^local_k)*0.2406378906553946;
+Q_RELAX.reference_2[33][35]:=CT*t*0.2504957133922061;
+Q_RELAX.reference_2[33][37]:=AC*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1351200521140052;
+Q_RELAX.reference_2[33][41]:=t*Min(1000,RELAX.reference.omega_1^local_k)*0.1344351325741675;
+Q_RELAX.reference_2[33][45]:=AT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.2296926126195792;
+Q_RELAX.reference_2[33][48]:=GT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.250994522453953;
+Q_RELAX.reference_2[34][2]:=t*Min(1000,RELAX.reference.omega_1^local_k)*0.3222350398108426;
+Q_RELAX.reference_2[34][18]:=CG*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1214054057357627;
+Q_RELAX.reference_2[34][32]:=t*0.3824103826488193;
+Q_RELAX.reference_2[34][33]:=CG*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1264560133035801;
+Q_RELAX.reference_2[34][35]:=GT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.2504957133922061;
+Q_RELAX.reference_2[34][38]:=AC*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1351200521140052;
+Q_RELAX.reference_2[34][42]:=t*Min(1000,RELAX.reference.omega_1^local_k)*0.1344351325741675;
+Q_RELAX.reference_2[34][46]:=AT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.2296926126195792;
+Q_RELAX.reference_2[35][3]:=t*Min(1000,RELAX.reference.omega_1^local_k)*0.3222350398108426;
+Q_RELAX.reference_2[35][19]:=CG*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1214054057357627;
+Q_RELAX.reference_2[35][32]:=AT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.3824103826488193;
+Q_RELAX.reference_2[35][33]:=CT*t*0.1264560133035801;
+Q_RELAX.reference_2[35][34]:=GT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.2406378906553946;
+Q_RELAX.reference_2[35][39]:=AC*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1351200521140052;
+Q_RELAX.reference_2[35][43]:=t*Min(1000,RELAX.reference.omega_1^local_k)*0.1344351325741675;
+Q_RELAX.reference_2[35][47]:=AT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.2296926126195792;
+Q_RELAX.reference_2[35][49]:=GT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.250994522453953;
+Q_RELAX.reference_2[36][4]:=t*Min(1000,RELAX.reference.omega_1^local_k)*0.3222350398108426;
+Q_RELAX.reference_2[36][20]:=CG*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1214054057357627;
+Q_RELAX.reference_2[36][32]:=AC*t*Min(1000,RELAX.reference.omega_1^local_k)*0.5007522026922482;
+Q_RELAX.reference_2[36][37]:=AC*t*0.1264560133035801;
+Q_RELAX.reference_2[36][38]:=t*0.2406378906553946;
+Q_RELAX.reference_2[36][39]:=AT*t*0.2504957133922061;
+Q_RELAX.reference_2[36][40]:=CG*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1344351325741675;
+Q_RELAX.reference_2[36][44]:=CT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.2296926126195792;
+Q_RELAX.reference_2[36][50]:=GT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.250994522453953;
+Q_RELAX.reference_2[37][5]:=t*Min(1000,RELAX.reference.omega_1^local_k)*0.3222350398108426;
+Q_RELAX.reference_2[37][21]:=CG*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1214054057357627;
+Q_RELAX.reference_2[37][33]:=AC*t*Min(1000,RELAX.reference.omega_1^local_k)*0.5007522026922482;
+Q_RELAX.reference_2[37][36]:=AC*t*0.3824103826488193;
+Q_RELAX.reference_2[37][38]:=CG*t*0.2406378906553946;
+Q_RELAX.reference_2[37][39]:=CT*t*0.2504957133922061;
+Q_RELAX.reference_2[37][41]:=CG*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1344351325741675;
+Q_RELAX.reference_2[37][45]:=CT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.2296926126195792;
+Q_RELAX.reference_2[37][51]:=GT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.250994522453953;
+Q_RELAX.reference_2[38][6]:=t*Min(1000,RELAX.reference.omega_1^local_k)*0.3222350398108426;
+Q_RELAX.reference_2[38][22]:=CG*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1214054057357627;
+Q_RELAX.reference_2[38][34]:=AC*t*Min(1000,RELAX.reference.omega_1^local_k)*0.5007522026922482;
+Q_RELAX.reference_2[38][36]:=t*0.3824103826488193;
+Q_RELAX.reference_2[38][37]:=CG*t*0.1264560133035801;
+Q_RELAX.reference_2[38][39]:=GT*t*0.2504957133922061;
+Q_RELAX.reference_2[38][42]:=CG*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1344351325741675;
+Q_RELAX.reference_2[38][46]:=CT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.2296926126195792;
+Q_RELAX.reference_2[38][52]:=GT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.250994522453953;
+Q_RELAX.reference_2[39][7]:=t*Min(1000,RELAX.reference.omega_1^local_k)*0.3222350398108426;
+Q_RELAX.reference_2[39][23]:=CG*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1214054057357627;
+Q_RELAX.reference_2[39][35]:=AC*t*Min(1000,RELAX.reference.omega_1^local_k)*0.5007522026922482;
+Q_RELAX.reference_2[39][36]:=AT*t*0.3824103826488193;
+Q_RELAX.reference_2[39][37]:=CT*t*0.1264560133035801;
+Q_RELAX.reference_2[39][38]:=GT*t*0.2406378906553946;
+Q_RELAX.reference_2[39][43]:=CG*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1344351325741675;
+Q_RELAX.reference_2[39][47]:=CT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.2296926126195792;
+Q_RELAX.reference_2[39][53]:=GT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.250994522453953;
+Q_RELAX.reference_2[40][8]:=t*Min(1000,RELAX.reference.omega_1^local_k)*0.3222350398108426;
+Q_RELAX.reference_2[40][24]:=CG*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1214054057357627;
+Q_RELAX.reference_2[40][32]:=t*Min(1000,RELAX.reference.omega_1^local_k)*0.5007522026922482;
+Q_RELAX.reference_2[40][36]:=CG*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1351200521140052;
+Q_RELAX.reference_2[40][41]:=AC*t*0.1264560133035801;
+Q_RELAX.reference_2[40][42]:=t*0.2406378906553946;
+Q_RELAX.reference_2[40][43]:=AT*t*0.2504957133922061;
+Q_RELAX.reference_2[40][44]:=GT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.2296926126195792;
+Q_RELAX.reference_2[41][9]:=t*Min(1000,RELAX.reference.omega_1^local_k)*0.3222350398108426;
+Q_RELAX.reference_2[41][25]:=CG*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1214054057357627;
+Q_RELAX.reference_2[41][33]:=t*Min(1000,RELAX.reference.omega_1^local_k)*0.5007522026922482;
+Q_RELAX.reference_2[41][37]:=CG*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1351200521140052;
+Q_RELAX.reference_2[41][40]:=AC*t*0.3824103826488193;
+Q_RELAX.reference_2[41][42]:=CG*t*0.2406378906553946;
+Q_RELAX.reference_2[41][43]:=CT*t*0.2504957133922061;
+Q_RELAX.reference_2[41][45]:=GT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.2296926126195792;
+Q_RELAX.reference_2[41][54]:=GT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.250994522453953;
+Q_RELAX.reference_2[42][10]:=t*Min(1000,RELAX.reference.omega_1^local_k)*0.3222350398108426;
+Q_RELAX.reference_2[42][26]:=CG*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1214054057357627;
+Q_RELAX.reference_2[42][34]:=t*Min(1000,RELAX.reference.omega_1^local_k)*0.5007522026922482;
+Q_RELAX.reference_2[42][38]:=CG*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1351200521140052;
+Q_RELAX.reference_2[42][40]:=t*0.3824103826488193;
+Q_RELAX.reference_2[42][41]:=CG*t*0.1264560133035801;
+Q_RELAX.reference_2[42][43]:=GT*t*0.2504957133922061;
+Q_RELAX.reference_2[42][46]:=GT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.2296926126195792;
+Q_RELAX.reference_2[42][55]:=GT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.250994522453953;
+Q_RELAX.reference_2[43][11]:=t*Min(1000,RELAX.reference.omega_1^local_k)*0.3222350398108426;
+Q_RELAX.reference_2[43][27]:=CG*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1214054057357627;
+Q_RELAX.reference_2[43][35]:=t*Min(1000,RELAX.reference.omega_1^local_k)*0.5007522026922482;
+Q_RELAX.reference_2[43][39]:=CG*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1351200521140052;
+Q_RELAX.reference_2[43][40]:=AT*t*0.3824103826488193;
+Q_RELAX.reference_2[43][41]:=CT*t*0.1264560133035801;
+Q_RELAX.reference_2[43][42]:=GT*t*0.2406378906553946;
+Q_RELAX.reference_2[43][47]:=GT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.2296926126195792;
+Q_RELAX.reference_2[43][56]:=GT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.250994522453953;
+Q_RELAX.reference_2[44][12]:=t*Min(1000,RELAX.reference.omega_1^local_k)*0.3222350398108426;
+Q_RELAX.reference_2[44][28]:=CG*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1214054057357627;
+Q_RELAX.reference_2[44][32]:=AT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.5007522026922482;
+Q_RELAX.reference_2[44][36]:=CT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1351200521140052;
+Q_RELAX.reference_2[44][40]:=GT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1344351325741675;
+Q_RELAX.reference_2[44][45]:=AC*t*0.1264560133035801;
+Q_RELAX.reference_2[44][46]:=t*0.2406378906553946;
+Q_RELAX.reference_2[44][47]:=AT*t*0.2504957133922061;
+Q_RELAX.reference_2[44][57]:=GT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.250994522453953;
+Q_RELAX.reference_2[45][13]:=t*Min(1000,RELAX.reference.omega_1^local_k)*0.3222350398108426;
+Q_RELAX.reference_2[45][29]:=CG*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1214054057357627;
+Q_RELAX.reference_2[45][33]:=AT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.5007522026922482;
+Q_RELAX.reference_2[45][37]:=CT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1351200521140052;
+Q_RELAX.reference_2[45][41]:=GT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1344351325741675;
+Q_RELAX.reference_2[45][44]:=AC*t*0.3824103826488193;
+Q_RELAX.reference_2[45][46]:=CG*t*0.2406378906553946;
+Q_RELAX.reference_2[45][47]:=CT*t*0.2504957133922061;
+Q_RELAX.reference_2[45][58]:=GT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.250994522453953;
+Q_RELAX.reference_2[46][14]:=t*Min(1000,RELAX.reference.omega_1^local_k)*0.3222350398108426;
+Q_RELAX.reference_2[46][30]:=CG*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1214054057357627;
+Q_RELAX.reference_2[46][34]:=AT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.5007522026922482;
+Q_RELAX.reference_2[46][38]:=CT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1351200521140052;
+Q_RELAX.reference_2[46][42]:=GT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1344351325741675;
+Q_RELAX.reference_2[46][44]:=t*0.3824103826488193;
+Q_RELAX.reference_2[46][45]:=CG*t*0.1264560133035801;
+Q_RELAX.reference_2[46][47]:=GT*t*0.2504957133922061;
+Q_RELAX.reference_2[46][59]:=GT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.250994522453953;
+Q_RELAX.reference_2[47][15]:=t*Min(1000,RELAX.reference.omega_1^local_k)*0.3222350398108426;
+Q_RELAX.reference_2[47][31]:=CG*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1214054057357627;
+Q_RELAX.reference_2[47][35]:=AT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.5007522026922482;
+Q_RELAX.reference_2[47][39]:=CT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1351200521140052;
+Q_RELAX.reference_2[47][43]:=GT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1344351325741675;
+Q_RELAX.reference_2[47][44]:=AT*t*0.3824103826488193;
+Q_RELAX.reference_2[47][45]:=CT*t*0.1264560133035801;
+Q_RELAX.reference_2[47][46]:=GT*t*0.2406378906553946;
+Q_RELAX.reference_2[47][60]:=GT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.250994522453953;
+Q_RELAX.reference_2[48][1]:=AT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.3222350398108426;
+Q_RELAX.reference_2[48][17]:=CT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1214054057357627;
+Q_RELAX.reference_2[48][33]:=GT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.3053650319994416;
+Q_RELAX.reference_2[48][49]:=CT*t*0.2504957133922061;
+Q_RELAX.reference_2[48][51]:=AC*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1351200521140052;
+Q_RELAX.reference_2[48][54]:=t*Min(1000,RELAX.reference.omega_1^local_k)*0.1344351325741675;
+Q_RELAX.reference_2[48][58]:=AT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.2296926126195792;
+Q_RELAX.reference_2[49][3]:=AT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.3222350398108426;
+Q_RELAX.reference_2[49][19]:=CT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1214054057357627;
+Q_RELAX.reference_2[49][35]:=GT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.3053650319994416;
+Q_RELAX.reference_2[49][48]:=CT*t*0.1264560133035801;
+Q_RELAX.reference_2[49][53]:=AC*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1351200521140052;
+Q_RELAX.reference_2[49][56]:=t*Min(1000,RELAX.reference.omega_1^local_k)*0.1344351325741675;
+Q_RELAX.reference_2[49][60]:=AT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.2296926126195792;
+Q_RELAX.reference_2[50][4]:=AT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.3222350398108426;
+Q_RELAX.reference_2[50][20]:=CT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1214054057357627;
+Q_RELAX.reference_2[50][36]:=GT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.3053650319994416;
+Q_RELAX.reference_2[50][51]:=AC*t*0.1264560133035801;
+Q_RELAX.reference_2[50][52]:=t*0.2406378906553946;
+Q_RELAX.reference_2[50][53]:=AT*t*0.2504957133922061;
+Q_RELAX.reference_2[50][57]:=CT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.2296926126195792;
+Q_RELAX.reference_2[51][5]:=AT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.3222350398108426;
+Q_RELAX.reference_2[51][21]:=CT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1214054057357627;
+Q_RELAX.reference_2[51][37]:=GT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.3053650319994416;
+Q_RELAX.reference_2[51][48]:=AC*t*Min(1000,RELAX.reference.omega_1^local_k)*0.5007522026922482;
+Q_RELAX.reference_2[51][50]:=AC*t*0.3824103826488193;
+Q_RELAX.reference_2[51][52]:=CG*t*0.2406378906553946;
+Q_RELAX.reference_2[51][53]:=CT*t*0.2504957133922061;
+Q_RELAX.reference_2[51][54]:=CG*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1344351325741675;
+Q_RELAX.reference_2[51][58]:=CT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.2296926126195792;
+Q_RELAX.reference_2[52][6]:=AT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.3222350398108426;
+Q_RELAX.reference_2[52][22]:=CT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1214054057357627;
+Q_RELAX.reference_2[52][38]:=GT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.3053650319994416;
+Q_RELAX.reference_2[52][50]:=t*0.3824103826488193;
+Q_RELAX.reference_2[52][51]:=CG*t*0.1264560133035801;
+Q_RELAX.reference_2[52][53]:=GT*t*0.2504957133922061;
+Q_RELAX.reference_2[52][55]:=CG*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1344351325741675;
+Q_RELAX.reference_2[52][59]:=CT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.2296926126195792;
+Q_RELAX.reference_2[53][7]:=AT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.3222350398108426;
+Q_RELAX.reference_2[53][23]:=CT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1214054057357627;
+Q_RELAX.reference_2[53][39]:=GT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.3053650319994416;
+Q_RELAX.reference_2[53][49]:=AC*t*Min(1000,RELAX.reference.omega_1^local_k)*0.5007522026922482;
+Q_RELAX.reference_2[53][50]:=AT*t*0.3824103826488193;
+Q_RELAX.reference_2[53][51]:=CT*t*0.1264560133035801;
+Q_RELAX.reference_2[53][52]:=GT*t*0.2406378906553946;
+Q_RELAX.reference_2[53][56]:=CG*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1344351325741675;
+Q_RELAX.reference_2[53][60]:=CT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.2296926126195792;
+Q_RELAX.reference_2[54][9]:=AT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.3222350398108426;
+Q_RELAX.reference_2[54][25]:=CT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1214054057357627;
+Q_RELAX.reference_2[54][41]:=GT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.3053650319994416;
+Q_RELAX.reference_2[54][48]:=t*Min(1000,RELAX.reference.omega_1^local_k)*0.5007522026922482;
+Q_RELAX.reference_2[54][51]:=CG*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1351200521140052;
+Q_RELAX.reference_2[54][55]:=CG*t*Min(1000,RELAX.reference.omega_1^local_k)*0.2406378906553946;
+Q_RELAX.reference_2[54][56]:=CT*t*0.2504957133922061;
+Q_RELAX.reference_2[54][58]:=GT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.2296926126195792;
+Q_RELAX.reference_2[55][10]:=AT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.3222350398108426;
+Q_RELAX.reference_2[55][26]:=CT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1214054057357627;
+Q_RELAX.reference_2[55][42]:=GT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.3053650319994416;
+Q_RELAX.reference_2[55][52]:=CG*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1351200521140052;
+Q_RELAX.reference_2[55][54]:=CG*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1264560133035801;
+Q_RELAX.reference_2[55][56]:=GT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.2504957133922061;
+Q_RELAX.reference_2[55][59]:=GT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.2296926126195792;
+Q_RELAX.reference_2[56][11]:=AT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.3222350398108426;
+Q_RELAX.reference_2[56][27]:=CT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1214054057357627;
+Q_RELAX.reference_2[56][43]:=GT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.3053650319994416;
+Q_RELAX.reference_2[56][49]:=t*Min(1000,RELAX.reference.omega_1^local_k)*0.5007522026922482;
+Q_RELAX.reference_2[56][53]:=CG*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1351200521140052;
+Q_RELAX.reference_2[56][54]:=CT*t*0.1264560133035801;
+Q_RELAX.reference_2[56][55]:=GT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.2406378906553946;
+Q_RELAX.reference_2[56][60]:=GT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.2296926126195792;
+Q_RELAX.reference_2[57][12]:=AT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.3222350398108426;
+Q_RELAX.reference_2[57][28]:=CT*t*0.1214054057357627;
+Q_RELAX.reference_2[57][44]:=GT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.3053650319994416;
+Q_RELAX.reference_2[57][50]:=CT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1351200521140052;
+Q_RELAX.reference_2[57][58]:=AC*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1264560133035801;
+Q_RELAX.reference_2[57][59]:=t*0.2406378906553946;
+Q_RELAX.reference_2[57][60]:=AT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.2504957133922061;
+Q_RELAX.reference_2[58][13]:=AT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.3222350398108426;
+Q_RELAX.reference_2[58][29]:=CT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1214054057357627;
+Q_RELAX.reference_2[58][45]:=GT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.3053650319994416;
+Q_RELAX.reference_2[58][48]:=AT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.5007522026922482;
+Q_RELAX.reference_2[58][51]:=CT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1351200521140052;
+Q_RELAX.reference_2[58][54]:=GT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1344351325741675;
+Q_RELAX.reference_2[58][57]:=AC*t*Min(1000,RELAX.reference.omega_1^local_k)*0.3824103826488193;
+Q_RELAX.reference_2[58][59]:=CG*t*Min(1000,RELAX.reference.omega_1^local_k)*0.2406378906553946;
+Q_RELAX.reference_2[58][60]:=CT*t*0.2504957133922061;
+Q_RELAX.reference_2[59][14]:=AT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.3222350398108426;
+Q_RELAX.reference_2[59][30]:=CT*t*0.1214054057357627;
+Q_RELAX.reference_2[59][46]:=GT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.3053650319994416;
+Q_RELAX.reference_2[59][52]:=CT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1351200521140052;
+Q_RELAX.reference_2[59][55]:=GT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1344351325741675;
+Q_RELAX.reference_2[59][57]:=t*0.3824103826488193;
+Q_RELAX.reference_2[59][58]:=CG*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1264560133035801;
+Q_RELAX.reference_2[59][60]:=GT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.2504957133922061;
+Q_RELAX.reference_2[60][15]:=AT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.3222350398108426;
+Q_RELAX.reference_2[60][31]:=CT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1214054057357627;
+Q_RELAX.reference_2[60][47]:=GT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.3053650319994416;
+Q_RELAX.reference_2[60][49]:=AT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.5007522026922482;
+Q_RELAX.reference_2[60][53]:=CT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1351200521140052;
+Q_RELAX.reference_2[60][56]:=GT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.1344351325741675;
+Q_RELAX.reference_2[60][57]:=AT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.3824103826488193;
+Q_RELAX.reference_2[60][58]:=CT*t*0.1264560133035801;
+Q_RELAX.reference_2[60][59]:=GT*t*Min(1000,RELAX.reference.omega_1^local_k)*0.2406378906553946;
+
+
+Q_RELAX.reference_3={61,61};
+Q_RELAX.reference_3[0][1]:=AC*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1264560133035801;
+Q_RELAX.reference_3[0][2]:=t*0.2406378906553946;
+Q_RELAX.reference_3[0][3]:=AT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.2504957133922061;
+Q_RELAX.reference_3[0][4]:=AC*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1351200521140052;
+Q_RELAX.reference_3[0][8]:=t*Min(1000,RELAX.reference.omega_2^local_k)*0.1344351325741675;
+Q_RELAX.reference_3[0][12]:=AT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.2296926126195792;
+Q_RELAX.reference_3[0][16]:=AC*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1214054057357627;
+Q_RELAX.reference_3[0][32]:=t*Min(1000,RELAX.reference.omega_2^local_k)*0.3053650319994416;
+Q_RELAX.reference_3[1][0]:=AC*t*Min(1000,RELAX.reference.omega_2^local_k)*0.3824103826488193;
+Q_RELAX.reference_3[1][2]:=CG*t*Min(1000,RELAX.reference.omega_2^local_k)*0.2406378906553946;
+Q_RELAX.reference_3[1][3]:=CT*t*0.2504957133922061;
+Q_RELAX.reference_3[1][5]:=AC*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1351200521140052;
+Q_RELAX.reference_3[1][9]:=t*Min(1000,RELAX.reference.omega_2^local_k)*0.1344351325741675;
+Q_RELAX.reference_3[1][13]:=AT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.2296926126195792;
+Q_RELAX.reference_3[1][17]:=AC*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1214054057357627;
+Q_RELAX.reference_3[1][33]:=t*Min(1000,RELAX.reference.omega_2^local_k)*0.3053650319994416;
+Q_RELAX.reference_3[1][48]:=AT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.250994522453953;
+Q_RELAX.reference_3[2][0]:=t*0.3824103826488193;
+Q_RELAX.reference_3[2][1]:=CG*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1264560133035801;
+Q_RELAX.reference_3[2][3]:=GT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.2504957133922061;
+Q_RELAX.reference_3[2][6]:=AC*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1351200521140052;
+Q_RELAX.reference_3[2][10]:=t*Min(1000,RELAX.reference.omega_2^local_k)*0.1344351325741675;
+Q_RELAX.reference_3[2][14]:=AT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.2296926126195792;
+Q_RELAX.reference_3[2][18]:=AC*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1214054057357627;
+Q_RELAX.reference_3[2][34]:=t*Min(1000,RELAX.reference.omega_2^local_k)*0.3053650319994416;
+Q_RELAX.reference_3[3][0]:=AT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.3824103826488193;
+Q_RELAX.reference_3[3][1]:=CT*t*0.1264560133035801;
+Q_RELAX.reference_3[3][2]:=GT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.2406378906553946;
+Q_RELAX.reference_3[3][7]:=AC*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1351200521140052;
+Q_RELAX.reference_3[3][11]:=t*Min(1000,RELAX.reference.omega_2^local_k)*0.1344351325741675;
+Q_RELAX.reference_3[3][15]:=AT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.2296926126195792;
+Q_RELAX.reference_3[3][19]:=AC*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1214054057357627;
+Q_RELAX.reference_3[3][35]:=t*Min(1000,RELAX.reference.omega_2^local_k)*0.3053650319994416;
+Q_RELAX.reference_3[3][49]:=AT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.250994522453953;
+Q_RELAX.reference_3[4][0]:=AC*t*Min(1000,RELAX.reference.omega_2^local_k)*0.5007522026922482;
+Q_RELAX.reference_3[4][5]:=AC*t*0.1264560133035801;
+Q_RELAX.reference_3[4][6]:=t*0.2406378906553946;
+Q_RELAX.reference_3[4][7]:=AT*t*0.2504957133922061;
+Q_RELAX.reference_3[4][8]:=CG*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1344351325741675;
+Q_RELAX.reference_3[4][12]:=CT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.2296926126195792;
+Q_RELAX.reference_3[4][20]:=AC*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1214054057357627;
+Q_RELAX.reference_3[4][36]:=t*Min(1000,RELAX.reference.omega_2^local_k)*0.3053650319994416;
+Q_RELAX.reference_3[4][50]:=AT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.250994522453953;
+Q_RELAX.reference_3[5][1]:=AC*t*Min(1000,RELAX.reference.omega_2^local_k)*0.5007522026922482;
+Q_RELAX.reference_3[5][4]:=AC*t*0.3824103826488193;
+Q_RELAX.reference_3[5][6]:=CG*t*0.2406378906553946;
+Q_RELAX.reference_3[5][7]:=CT*t*0.2504957133922061;
+Q_RELAX.reference_3[5][9]:=CG*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1344351325741675;
+Q_RELAX.reference_3[5][13]:=CT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.2296926126195792;
+Q_RELAX.reference_3[5][21]:=AC*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1214054057357627;
+Q_RELAX.reference_3[5][37]:=t*Min(1000,RELAX.reference.omega_2^local_k)*0.3053650319994416;
+Q_RELAX.reference_3[5][51]:=AT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.250994522453953;
+Q_RELAX.reference_3[6][2]:=AC*t*Min(1000,RELAX.reference.omega_2^local_k)*0.5007522026922482;
+Q_RELAX.reference_3[6][4]:=t*0.3824103826488193;
+Q_RELAX.reference_3[6][5]:=CG*t*0.1264560133035801;
+Q_RELAX.reference_3[6][7]:=GT*t*0.2504957133922061;
+Q_RELAX.reference_3[6][10]:=CG*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1344351325741675;
+Q_RELAX.reference_3[6][14]:=CT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.2296926126195792;
+Q_RELAX.reference_3[6][22]:=AC*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1214054057357627;
+Q_RELAX.reference_3[6][38]:=t*Min(1000,RELAX.reference.omega_2^local_k)*0.3053650319994416;
+Q_RELAX.reference_3[6][52]:=AT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.250994522453953;
+Q_RELAX.reference_3[7][3]:=AC*t*Min(1000,RELAX.reference.omega_2^local_k)*0.5007522026922482;
+Q_RELAX.reference_3[7][4]:=AT*t*0.3824103826488193;
+Q_RELAX.reference_3[7][5]:=CT*t*0.1264560133035801;
+Q_RELAX.reference_3[7][6]:=GT*t*0.2406378906553946;
+Q_RELAX.reference_3[7][11]:=CG*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1344351325741675;
+Q_RELAX.reference_3[7][15]:=CT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.2296926126195792;
+Q_RELAX.reference_3[7][23]:=AC*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1214054057357627;
+Q_RELAX.reference_3[7][39]:=t*Min(1000,RELAX.reference.omega_2^local_k)*0.3053650319994416;
+Q_RELAX.reference_3[7][53]:=AT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.250994522453953;
+Q_RELAX.reference_3[8][0]:=t*Min(1000,RELAX.reference.omega_2^local_k)*0.5007522026922482;
+Q_RELAX.reference_3[8][4]:=CG*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1351200521140052;
+Q_RELAX.reference_3[8][9]:=AC*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1264560133035801;
+Q_RELAX.reference_3[8][10]:=t*0.2406378906553946;
+Q_RELAX.reference_3[8][11]:=AT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.2504957133922061;
+Q_RELAX.reference_3[8][12]:=GT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.2296926126195792;
+Q_RELAX.reference_3[8][24]:=AC*t*0.1214054057357627;
+Q_RELAX.reference_3[8][40]:=t*Min(1000,RELAX.reference.omega_2^local_k)*0.3053650319994416;
+Q_RELAX.reference_3[9][1]:=t*Min(1000,RELAX.reference.omega_2^local_k)*0.5007522026922482;
+Q_RELAX.reference_3[9][5]:=CG*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1351200521140052;
+Q_RELAX.reference_3[9][8]:=AC*t*Min(1000,RELAX.reference.omega_2^local_k)*0.3824103826488193;
+Q_RELAX.reference_3[9][10]:=CG*t*Min(1000,RELAX.reference.omega_2^local_k)*0.2406378906553946;
+Q_RELAX.reference_3[9][11]:=CT*t*0.2504957133922061;
+Q_RELAX.reference_3[9][13]:=GT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.2296926126195792;
+Q_RELAX.reference_3[9][25]:=AC*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1214054057357627;
+Q_RELAX.reference_3[9][41]:=t*Min(1000,RELAX.reference.omega_2^local_k)*0.3053650319994416;
+Q_RELAX.reference_3[9][54]:=AT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.250994522453953;
+Q_RELAX.reference_3[10][2]:=t*Min(1000,RELAX.reference.omega_2^local_k)*0.5007522026922482;
+Q_RELAX.reference_3[10][6]:=CG*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1351200521140052;
+Q_RELAX.reference_3[10][8]:=t*0.3824103826488193;
+Q_RELAX.reference_3[10][9]:=CG*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1264560133035801;
+Q_RELAX.reference_3[10][11]:=GT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.2504957133922061;
+Q_RELAX.reference_3[10][14]:=GT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.2296926126195792;
+Q_RELAX.reference_3[10][26]:=AC*t*0.1214054057357627;
+Q_RELAX.reference_3[10][42]:=t*Min(1000,RELAX.reference.omega_2^local_k)*0.3053650319994416;
+Q_RELAX.reference_3[10][55]:=AT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.250994522453953;
+Q_RELAX.reference_3[11][3]:=t*Min(1000,RELAX.reference.omega_2^local_k)*0.5007522026922482;
+Q_RELAX.reference_3[11][7]:=CG*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1351200521140052;
+Q_RELAX.reference_3[11][8]:=AT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.3824103826488193;
+Q_RELAX.reference_3[11][9]:=CT*t*0.1264560133035801;
+Q_RELAX.reference_3[11][10]:=GT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.2406378906553946;
+Q_RELAX.reference_3[11][15]:=GT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.2296926126195792;
+Q_RELAX.reference_3[11][27]:=AC*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1214054057357627;
+Q_RELAX.reference_3[11][43]:=t*Min(1000,RELAX.reference.omega_2^local_k)*0.3053650319994416;
+Q_RELAX.reference_3[11][56]:=AT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.250994522453953;
+Q_RELAX.reference_3[12][0]:=AT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.5007522026922482;
+Q_RELAX.reference_3[12][4]:=CT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1351200521140052;
+Q_RELAX.reference_3[12][8]:=GT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1344351325741675;
+Q_RELAX.reference_3[12][13]:=AC*t*0.1264560133035801;
+Q_RELAX.reference_3[12][14]:=t*Min(1000,RELAX.reference.omega_2^local_k)*0.2406378906553946;
+Q_RELAX.reference_3[12][15]:=AT*t*0.2504957133922061;
+Q_RELAX.reference_3[12][28]:=AC*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1214054057357627;
+Q_RELAX.reference_3[12][44]:=t*Min(1000,RELAX.reference.omega_2^local_k)*0.3053650319994416;
+Q_RELAX.reference_3[12][57]:=AT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.250994522453953;
+Q_RELAX.reference_3[13][1]:=AT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.5007522026922482;
+Q_RELAX.reference_3[13][5]:=CT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1351200521140052;
+Q_RELAX.reference_3[13][9]:=GT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1344351325741675;
+Q_RELAX.reference_3[13][12]:=AC*t*0.3824103826488193;
+Q_RELAX.reference_3[13][14]:=CG*t*Min(1000,RELAX.reference.omega_2^local_k)*0.2406378906553946;
+Q_RELAX.reference_3[13][15]:=CT*t*0.2504957133922061;
+Q_RELAX.reference_3[13][29]:=AC*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1214054057357627;
+Q_RELAX.reference_3[13][45]:=t*Min(1000,RELAX.reference.omega_2^local_k)*0.3053650319994416;
+Q_RELAX.reference_3[13][58]:=AT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.250994522453953;
+Q_RELAX.reference_3[14][2]:=AT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.5007522026922482;
+Q_RELAX.reference_3[14][6]:=CT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1351200521140052;
+Q_RELAX.reference_3[14][10]:=GT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1344351325741675;
+Q_RELAX.reference_3[14][12]:=t*Min(1000,RELAX.reference.omega_2^local_k)*0.3824103826488193;
+Q_RELAX.reference_3[14][13]:=CG*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1264560133035801;
+Q_RELAX.reference_3[14][15]:=GT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.2504957133922061;
+Q_RELAX.reference_3[14][30]:=AC*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1214054057357627;
+Q_RELAX.reference_3[14][46]:=t*Min(1000,RELAX.reference.omega_2^local_k)*0.3053650319994416;
+Q_RELAX.reference_3[14][59]:=AT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.250994522453953;
+Q_RELAX.reference_3[15][3]:=AT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.5007522026922482;
+Q_RELAX.reference_3[15][7]:=CT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1351200521140052;
+Q_RELAX.reference_3[15][11]:=GT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1344351325741675;
+Q_RELAX.reference_3[15][12]:=AT*t*0.3824103826488193;
+Q_RELAX.reference_3[15][13]:=CT*t*0.1264560133035801;
+Q_RELAX.reference_3[15][14]:=GT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.2406378906553946;
+Q_RELAX.reference_3[15][31]:=AC*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1214054057357627;
+Q_RELAX.reference_3[15][47]:=t*Min(1000,RELAX.reference.omega_2^local_k)*0.3053650319994416;
+Q_RELAX.reference_3[15][60]:=AT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.250994522453953;
+Q_RELAX.reference_3[16][0]:=AC*t*Min(1000,RELAX.reference.omega_2^local_k)*0.3222350398108426;
+Q_RELAX.reference_3[16][17]:=AC*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1264560133035801;
+Q_RELAX.reference_3[16][18]:=t*0.2406378906553946;
+Q_RELAX.reference_3[16][19]:=AT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.2504957133922061;
+Q_RELAX.reference_3[16][20]:=AC*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1351200521140052;
+Q_RELAX.reference_3[16][24]:=t*Min(1000,RELAX.reference.omega_2^local_k)*0.1344351325741675;
+Q_RELAX.reference_3[16][28]:=AT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.2296926126195792;
+Q_RELAX.reference_3[16][32]:=CG*t*Min(1000,RELAX.reference.omega_2^local_k)*0.3053650319994416;
+Q_RELAX.reference_3[17][1]:=AC*t*Min(1000,RELAX.reference.omega_2^local_k)*0.3222350398108426;
+Q_RELAX.reference_3[17][16]:=AC*t*Min(1000,RELAX.reference.omega_2^local_k)*0.3824103826488193;
+Q_RELAX.reference_3[17][18]:=CG*t*Min(1000,RELAX.reference.omega_2^local_k)*0.2406378906553946;
+Q_RELAX.reference_3[17][19]:=CT*t*0.2504957133922061;
+Q_RELAX.reference_3[17][21]:=AC*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1351200521140052;
+Q_RELAX.reference_3[17][25]:=t*Min(1000,RELAX.reference.omega_2^local_k)*0.1344351325741675;
+Q_RELAX.reference_3[17][29]:=AT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.2296926126195792;
+Q_RELAX.reference_3[17][33]:=CG*t*Min(1000,RELAX.reference.omega_2^local_k)*0.3053650319994416;
+Q_RELAX.reference_3[17][48]:=CT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.250994522453953;
+Q_RELAX.reference_3[18][2]:=AC*t*Min(1000,RELAX.reference.omega_2^local_k)*0.3222350398108426;
+Q_RELAX.reference_3[18][16]:=t*0.3824103826488193;
+Q_RELAX.reference_3[18][17]:=CG*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1264560133035801;
+Q_RELAX.reference_3[18][19]:=GT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.2504957133922061;
+Q_RELAX.reference_3[18][22]:=AC*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1351200521140052;
+Q_RELAX.reference_3[18][26]:=t*Min(1000,RELAX.reference.omega_2^local_k)*0.1344351325741675;
+Q_RELAX.reference_3[18][30]:=AT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.2296926126195792;
+Q_RELAX.reference_3[18][34]:=CG*t*Min(1000,RELAX.reference.omega_2^local_k)*0.3053650319994416;
+Q_RELAX.reference_3[19][3]:=AC*t*Min(1000,RELAX.reference.omega_2^local_k)*0.3222350398108426;
+Q_RELAX.reference_3[19][16]:=AT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.3824103826488193;
+Q_RELAX.reference_3[19][17]:=CT*t*0.1264560133035801;
+Q_RELAX.reference_3[19][18]:=GT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.2406378906553946;
+Q_RELAX.reference_3[19][23]:=AC*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1351200521140052;
+Q_RELAX.reference_3[19][27]:=t*Min(1000,RELAX.reference.omega_2^local_k)*0.1344351325741675;
+Q_RELAX.reference_3[19][31]:=AT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.2296926126195792;
+Q_RELAX.reference_3[19][35]:=CG*t*Min(1000,RELAX.reference.omega_2^local_k)*0.3053650319994416;
+Q_RELAX.reference_3[19][49]:=CT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.250994522453953;
+Q_RELAX.reference_3[20][4]:=AC*t*Min(1000,RELAX.reference.omega_2^local_k)*0.3222350398108426;
+Q_RELAX.reference_3[20][16]:=AC*t*Min(1000,RELAX.reference.omega_2^local_k)*0.5007522026922482;
+Q_RELAX.reference_3[20][21]:=AC*t*0.1264560133035801;
+Q_RELAX.reference_3[20][22]:=t*0.2406378906553946;
+Q_RELAX.reference_3[20][23]:=AT*t*0.2504957133922061;
+Q_RELAX.reference_3[20][24]:=CG*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1344351325741675;
+Q_RELAX.reference_3[20][28]:=CT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.2296926126195792;
+Q_RELAX.reference_3[20][36]:=CG*t*Min(1000,RELAX.reference.omega_2^local_k)*0.3053650319994416;
+Q_RELAX.reference_3[20][50]:=CT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.250994522453953;
+Q_RELAX.reference_3[21][5]:=AC*t*Min(1000,RELAX.reference.omega_2^local_k)*0.3222350398108426;
+Q_RELAX.reference_3[21][17]:=AC*t*Min(1000,RELAX.reference.omega_2^local_k)*0.5007522026922482;
+Q_RELAX.reference_3[21][20]:=AC*t*0.3824103826488193;
+Q_RELAX.reference_3[21][22]:=CG*t*0.2406378906553946;
+Q_RELAX.reference_3[21][23]:=CT*t*0.2504957133922061;
+Q_RELAX.reference_3[21][25]:=CG*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1344351325741675;
+Q_RELAX.reference_3[21][29]:=CT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.2296926126195792;
+Q_RELAX.reference_3[21][37]:=CG*t*Min(1000,RELAX.reference.omega_2^local_k)*0.3053650319994416;
+Q_RELAX.reference_3[21][51]:=CT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.250994522453953;
+Q_RELAX.reference_3[22][6]:=AC*t*Min(1000,RELAX.reference.omega_2^local_k)*0.3222350398108426;
+Q_RELAX.reference_3[22][18]:=AC*t*Min(1000,RELAX.reference.omega_2^local_k)*0.5007522026922482;
+Q_RELAX.reference_3[22][20]:=t*0.3824103826488193;
+Q_RELAX.reference_3[22][21]:=CG*t*0.1264560133035801;
+Q_RELAX.reference_3[22][23]:=GT*t*0.2504957133922061;
+Q_RELAX.reference_3[22][26]:=CG*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1344351325741675;
+Q_RELAX.reference_3[22][30]:=CT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.2296926126195792;
+Q_RELAX.reference_3[22][38]:=CG*t*Min(1000,RELAX.reference.omega_2^local_k)*0.3053650319994416;
+Q_RELAX.reference_3[22][52]:=CT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.250994522453953;
+Q_RELAX.reference_3[23][7]:=AC*t*Min(1000,RELAX.reference.omega_2^local_k)*0.3222350398108426;
+Q_RELAX.reference_3[23][19]:=AC*t*Min(1000,RELAX.reference.omega_2^local_k)*0.5007522026922482;
+Q_RELAX.reference_3[23][20]:=AT*t*0.3824103826488193;
+Q_RELAX.reference_3[23][21]:=CT*t*0.1264560133035801;
+Q_RELAX.reference_3[23][22]:=GT*t*0.2406378906553946;
+Q_RELAX.reference_3[23][27]:=CG*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1344351325741675;
+Q_RELAX.reference_3[23][31]:=CT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.2296926126195792;
+Q_RELAX.reference_3[23][39]:=CG*t*Min(1000,RELAX.reference.omega_2^local_k)*0.3053650319994416;
+Q_RELAX.reference_3[23][53]:=CT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.250994522453953;
+Q_RELAX.reference_3[24][8]:=AC*t*0.3222350398108426;
+Q_RELAX.reference_3[24][16]:=t*Min(1000,RELAX.reference.omega_2^local_k)*0.5007522026922482;
+Q_RELAX.reference_3[24][20]:=CG*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1351200521140052;
+Q_RELAX.reference_3[24][25]:=AC*t*0.1264560133035801;
+Q_RELAX.reference_3[24][26]:=t*0.2406378906553946;
+Q_RELAX.reference_3[24][27]:=AT*t*0.2504957133922061;
+Q_RELAX.reference_3[24][28]:=GT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.2296926126195792;
+Q_RELAX.reference_3[24][40]:=CG*t*Min(1000,RELAX.reference.omega_2^local_k)*0.3053650319994416;
+Q_RELAX.reference_3[25][9]:=AC*t*Min(1000,RELAX.reference.omega_2^local_k)*0.3222350398108426;
+Q_RELAX.reference_3[25][17]:=t*Min(1000,RELAX.reference.omega_2^local_k)*0.5007522026922482;
+Q_RELAX.reference_3[25][21]:=CG*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1351200521140052;
+Q_RELAX.reference_3[25][24]:=AC*t*0.3824103826488193;
+Q_RELAX.reference_3[25][26]:=CG*t*0.2406378906553946;
+Q_RELAX.reference_3[25][27]:=CT*t*0.2504957133922061;
+Q_RELAX.reference_3[25][29]:=GT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.2296926126195792;
+Q_RELAX.reference_3[25][41]:=CG*t*Min(1000,RELAX.reference.omega_2^local_k)*0.3053650319994416;
+Q_RELAX.reference_3[25][54]:=CT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.250994522453953;
+Q_RELAX.reference_3[26][10]:=AC*t*0.3222350398108426;
+Q_RELAX.reference_3[26][18]:=t*Min(1000,RELAX.reference.omega_2^local_k)*0.5007522026922482;
+Q_RELAX.reference_3[26][22]:=CG*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1351200521140052;
+Q_RELAX.reference_3[26][24]:=t*0.3824103826488193;
+Q_RELAX.reference_3[26][25]:=CG*t*0.1264560133035801;
+Q_RELAX.reference_3[26][27]:=GT*t*0.2504957133922061;
+Q_RELAX.reference_3[26][30]:=GT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.2296926126195792;
+Q_RELAX.reference_3[26][42]:=CG*t*Min(1000,RELAX.reference.omega_2^local_k)*0.3053650319994416;
+Q_RELAX.reference_3[26][55]:=CT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.250994522453953;
+Q_RELAX.reference_3[27][11]:=AC*t*Min(1000,RELAX.reference.omega_2^local_k)*0.3222350398108426;
+Q_RELAX.reference_3[27][19]:=t*Min(1000,RELAX.reference.omega_2^local_k)*0.5007522026922482;
+Q_RELAX.reference_3[27][23]:=CG*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1351200521140052;
+Q_RELAX.reference_3[27][24]:=AT*t*0.3824103826488193;
+Q_RELAX.reference_3[27][25]:=CT*t*0.1264560133035801;
+Q_RELAX.reference_3[27][26]:=GT*t*0.2406378906553946;
+Q_RELAX.reference_3[27][31]:=GT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.2296926126195792;
+Q_RELAX.reference_3[27][43]:=CG*t*Min(1000,RELAX.reference.omega_2^local_k)*0.3053650319994416;
+Q_RELAX.reference_3[27][56]:=CT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.250994522453953;
+Q_RELAX.reference_3[28][12]:=AC*t*Min(1000,RELAX.reference.omega_2^local_k)*0.3222350398108426;
+Q_RELAX.reference_3[28][16]:=AT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.5007522026922482;
+Q_RELAX.reference_3[28][20]:=CT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1351200521140052;
+Q_RELAX.reference_3[28][24]:=GT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1344351325741675;
+Q_RELAX.reference_3[28][29]:=AC*t*0.1264560133035801;
+Q_RELAX.reference_3[28][30]:=t*0.2406378906553946;
+Q_RELAX.reference_3[28][31]:=AT*t*0.2504957133922061;
+Q_RELAX.reference_3[28][44]:=CG*t*Min(1000,RELAX.reference.omega_2^local_k)*0.3053650319994416;
+Q_RELAX.reference_3[28][57]:=CT*t*0.250994522453953;
+Q_RELAX.reference_3[29][13]:=AC*t*Min(1000,RELAX.reference.omega_2^local_k)*0.3222350398108426;
+Q_RELAX.reference_3[29][17]:=AT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.5007522026922482;
+Q_RELAX.reference_3[29][21]:=CT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1351200521140052;
+Q_RELAX.reference_3[29][25]:=GT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1344351325741675;
+Q_RELAX.reference_3[29][28]:=AC*t*0.3824103826488193;
+Q_RELAX.reference_3[29][30]:=CG*t*0.2406378906553946;
+Q_RELAX.reference_3[29][31]:=CT*t*0.2504957133922061;
+Q_RELAX.reference_3[29][45]:=CG*t*Min(1000,RELAX.reference.omega_2^local_k)*0.3053650319994416;
+Q_RELAX.reference_3[29][58]:=CT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.250994522453953;
+Q_RELAX.reference_3[30][14]:=AC*t*Min(1000,RELAX.reference.omega_2^local_k)*0.3222350398108426;
+Q_RELAX.reference_3[30][18]:=AT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.5007522026922482;
+Q_RELAX.reference_3[30][22]:=CT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1351200521140052;
+Q_RELAX.reference_3[30][26]:=GT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1344351325741675;
+Q_RELAX.reference_3[30][28]:=t*0.3824103826488193;
+Q_RELAX.reference_3[30][29]:=CG*t*0.1264560133035801;
+Q_RELAX.reference_3[30][31]:=GT*t*0.2504957133922061;
+Q_RELAX.reference_3[30][46]:=CG*t*Min(1000,RELAX.reference.omega_2^local_k)*0.3053650319994416;
+Q_RELAX.reference_3[30][59]:=CT*t*0.250994522453953;
+Q_RELAX.reference_3[31][15]:=AC*t*Min(1000,RELAX.reference.omega_2^local_k)*0.3222350398108426;
+Q_RELAX.reference_3[31][19]:=AT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.5007522026922482;
+Q_RELAX.reference_3[31][23]:=CT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1351200521140052;
+Q_RELAX.reference_3[31][27]:=GT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1344351325741675;
+Q_RELAX.reference_3[31][28]:=AT*t*0.3824103826488193;
+Q_RELAX.reference_3[31][29]:=CT*t*0.1264560133035801;
+Q_RELAX.reference_3[31][30]:=GT*t*0.2406378906553946;
+Q_RELAX.reference_3[31][47]:=CG*t*Min(1000,RELAX.reference.omega_2^local_k)*0.3053650319994416;
+Q_RELAX.reference_3[31][60]:=CT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.250994522453953;
+Q_RELAX.reference_3[32][0]:=t*Min(1000,RELAX.reference.omega_2^local_k)*0.3222350398108426;
+Q_RELAX.reference_3[32][16]:=CG*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1214054057357627;
+Q_RELAX.reference_3[32][33]:=AC*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1264560133035801;
+Q_RELAX.reference_3[32][34]:=t*0.2406378906553946;
+Q_RELAX.reference_3[32][35]:=AT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.2504957133922061;
+Q_RELAX.reference_3[32][36]:=AC*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1351200521140052;
+Q_RELAX.reference_3[32][40]:=t*Min(1000,RELAX.reference.omega_2^local_k)*0.1344351325741675;
+Q_RELAX.reference_3[32][44]:=AT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.2296926126195792;
+Q_RELAX.reference_3[33][1]:=t*Min(1000,RELAX.reference.omega_2^local_k)*0.3222350398108426;
+Q_RELAX.reference_3[33][17]:=CG*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1214054057357627;
+Q_RELAX.reference_3[33][32]:=AC*t*Min(1000,RELAX.reference.omega_2^local_k)*0.3824103826488193;
+Q_RELAX.reference_3[33][34]:=CG*t*Min(1000,RELAX.reference.omega_2^local_k)*0.2406378906553946;
+Q_RELAX.reference_3[33][35]:=CT*t*0.2504957133922061;
+Q_RELAX.reference_3[33][37]:=AC*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1351200521140052;
+Q_RELAX.reference_3[33][41]:=t*Min(1000,RELAX.reference.omega_2^local_k)*0.1344351325741675;
+Q_RELAX.reference_3[33][45]:=AT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.2296926126195792;
+Q_RELAX.reference_3[33][48]:=GT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.250994522453953;
+Q_RELAX.reference_3[34][2]:=t*Min(1000,RELAX.reference.omega_2^local_k)*0.3222350398108426;
+Q_RELAX.reference_3[34][18]:=CG*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1214054057357627;
+Q_RELAX.reference_3[34][32]:=t*0.3824103826488193;
+Q_RELAX.reference_3[34][33]:=CG*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1264560133035801;
+Q_RELAX.reference_3[34][35]:=GT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.2504957133922061;
+Q_RELAX.reference_3[34][38]:=AC*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1351200521140052;
+Q_RELAX.reference_3[34][42]:=t*Min(1000,RELAX.reference.omega_2^local_k)*0.1344351325741675;
+Q_RELAX.reference_3[34][46]:=AT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.2296926126195792;
+Q_RELAX.reference_3[35][3]:=t*Min(1000,RELAX.reference.omega_2^local_k)*0.3222350398108426;
+Q_RELAX.reference_3[35][19]:=CG*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1214054057357627;
+Q_RELAX.reference_3[35][32]:=AT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.3824103826488193;
+Q_RELAX.reference_3[35][33]:=CT*t*0.1264560133035801;
+Q_RELAX.reference_3[35][34]:=GT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.2406378906553946;
+Q_RELAX.reference_3[35][39]:=AC*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1351200521140052;
+Q_RELAX.reference_3[35][43]:=t*Min(1000,RELAX.reference.omega_2^local_k)*0.1344351325741675;
+Q_RELAX.reference_3[35][47]:=AT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.2296926126195792;
+Q_RELAX.reference_3[35][49]:=GT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.250994522453953;
+Q_RELAX.reference_3[36][4]:=t*Min(1000,RELAX.reference.omega_2^local_k)*0.3222350398108426;
+Q_RELAX.reference_3[36][20]:=CG*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1214054057357627;
+Q_RELAX.reference_3[36][32]:=AC*t*Min(1000,RELAX.reference.omega_2^local_k)*0.5007522026922482;
+Q_RELAX.reference_3[36][37]:=AC*t*0.1264560133035801;
+Q_RELAX.reference_3[36][38]:=t*0.2406378906553946;
+Q_RELAX.reference_3[36][39]:=AT*t*0.2504957133922061;
+Q_RELAX.reference_3[36][40]:=CG*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1344351325741675;
+Q_RELAX.reference_3[36][44]:=CT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.2296926126195792;
+Q_RELAX.reference_3[36][50]:=GT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.250994522453953;
+Q_RELAX.reference_3[37][5]:=t*Min(1000,RELAX.reference.omega_2^local_k)*0.3222350398108426;
+Q_RELAX.reference_3[37][21]:=CG*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1214054057357627;
+Q_RELAX.reference_3[37][33]:=AC*t*Min(1000,RELAX.reference.omega_2^local_k)*0.5007522026922482;
+Q_RELAX.reference_3[37][36]:=AC*t*0.3824103826488193;
+Q_RELAX.reference_3[37][38]:=CG*t*0.2406378906553946;
+Q_RELAX.reference_3[37][39]:=CT*t*0.2504957133922061;
+Q_RELAX.reference_3[37][41]:=CG*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1344351325741675;
+Q_RELAX.reference_3[37][45]:=CT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.2296926126195792;
+Q_RELAX.reference_3[37][51]:=GT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.250994522453953;
+Q_RELAX.reference_3[38][6]:=t*Min(1000,RELAX.reference.omega_2^local_k)*0.3222350398108426;
+Q_RELAX.reference_3[38][22]:=CG*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1214054057357627;
+Q_RELAX.reference_3[38][34]:=AC*t*Min(1000,RELAX.reference.omega_2^local_k)*0.5007522026922482;
+Q_RELAX.reference_3[38][36]:=t*0.3824103826488193;
+Q_RELAX.reference_3[38][37]:=CG*t*0.1264560133035801;
+Q_RELAX.reference_3[38][39]:=GT*t*0.2504957133922061;
+Q_RELAX.reference_3[38][42]:=CG*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1344351325741675;
+Q_RELAX.reference_3[38][46]:=CT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.2296926126195792;
+Q_RELAX.reference_3[38][52]:=GT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.250994522453953;
+Q_RELAX.reference_3[39][7]:=t*Min(1000,RELAX.reference.omega_2^local_k)*0.3222350398108426;
+Q_RELAX.reference_3[39][23]:=CG*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1214054057357627;
+Q_RELAX.reference_3[39][35]:=AC*t*Min(1000,RELAX.reference.omega_2^local_k)*0.5007522026922482;
+Q_RELAX.reference_3[39][36]:=AT*t*0.3824103826488193;
+Q_RELAX.reference_3[39][37]:=CT*t*0.1264560133035801;
+Q_RELAX.reference_3[39][38]:=GT*t*0.2406378906553946;
+Q_RELAX.reference_3[39][43]:=CG*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1344351325741675;
+Q_RELAX.reference_3[39][47]:=CT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.2296926126195792;
+Q_RELAX.reference_3[39][53]:=GT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.250994522453953;
+Q_RELAX.reference_3[40][8]:=t*Min(1000,RELAX.reference.omega_2^local_k)*0.3222350398108426;
+Q_RELAX.reference_3[40][24]:=CG*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1214054057357627;
+Q_RELAX.reference_3[40][32]:=t*Min(1000,RELAX.reference.omega_2^local_k)*0.5007522026922482;
+Q_RELAX.reference_3[40][36]:=CG*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1351200521140052;
+Q_RELAX.reference_3[40][41]:=AC*t*0.1264560133035801;
+Q_RELAX.reference_3[40][42]:=t*0.2406378906553946;
+Q_RELAX.reference_3[40][43]:=AT*t*0.2504957133922061;
+Q_RELAX.reference_3[40][44]:=GT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.2296926126195792;
+Q_RELAX.reference_3[41][9]:=t*Min(1000,RELAX.reference.omega_2^local_k)*0.3222350398108426;
+Q_RELAX.reference_3[41][25]:=CG*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1214054057357627;
+Q_RELAX.reference_3[41][33]:=t*Min(1000,RELAX.reference.omega_2^local_k)*0.5007522026922482;
+Q_RELAX.reference_3[41][37]:=CG*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1351200521140052;
+Q_RELAX.reference_3[41][40]:=AC*t*0.3824103826488193;
+Q_RELAX.reference_3[41][42]:=CG*t*0.2406378906553946;
+Q_RELAX.reference_3[41][43]:=CT*t*0.2504957133922061;
+Q_RELAX.reference_3[41][45]:=GT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.2296926126195792;
+Q_RELAX.reference_3[41][54]:=GT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.250994522453953;
+Q_RELAX.reference_3[42][10]:=t*Min(1000,RELAX.reference.omega_2^local_k)*0.3222350398108426;
+Q_RELAX.reference_3[42][26]:=CG*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1214054057357627;
+Q_RELAX.reference_3[42][34]:=t*Min(1000,RELAX.reference.omega_2^local_k)*0.5007522026922482;
+Q_RELAX.reference_3[42][38]:=CG*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1351200521140052;
+Q_RELAX.reference_3[42][40]:=t*0.3824103826488193;
+Q_RELAX.reference_3[42][41]:=CG*t*0.1264560133035801;
+Q_RELAX.reference_3[42][43]:=GT*t*0.2504957133922061;
+Q_RELAX.reference_3[42][46]:=GT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.2296926126195792;
+Q_RELAX.reference_3[42][55]:=GT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.250994522453953;
+Q_RELAX.reference_3[43][11]:=t*Min(1000,RELAX.reference.omega_2^local_k)*0.3222350398108426;
+Q_RELAX.reference_3[43][27]:=CG*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1214054057357627;
+Q_RELAX.reference_3[43][35]:=t*Min(1000,RELAX.reference.omega_2^local_k)*0.5007522026922482;
+Q_RELAX.reference_3[43][39]:=CG*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1351200521140052;
+Q_RELAX.reference_3[43][40]:=AT*t*0.3824103826488193;
+Q_RELAX.reference_3[43][41]:=CT*t*0.1264560133035801;
+Q_RELAX.reference_3[43][42]:=GT*t*0.2406378906553946;
+Q_RELAX.reference_3[43][47]:=GT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.2296926126195792;
+Q_RELAX.reference_3[43][56]:=GT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.250994522453953;
+Q_RELAX.reference_3[44][12]:=t*Min(1000,RELAX.reference.omega_2^local_k)*0.3222350398108426;
+Q_RELAX.reference_3[44][28]:=CG*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1214054057357627;
+Q_RELAX.reference_3[44][32]:=AT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.5007522026922482;
+Q_RELAX.reference_3[44][36]:=CT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1351200521140052;
+Q_RELAX.reference_3[44][40]:=GT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1344351325741675;
+Q_RELAX.reference_3[44][45]:=AC*t*0.1264560133035801;
+Q_RELAX.reference_3[44][46]:=t*0.2406378906553946;
+Q_RELAX.reference_3[44][47]:=AT*t*0.2504957133922061;
+Q_RELAX.reference_3[44][57]:=GT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.250994522453953;
+Q_RELAX.reference_3[45][13]:=t*Min(1000,RELAX.reference.omega_2^local_k)*0.3222350398108426;
+Q_RELAX.reference_3[45][29]:=CG*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1214054057357627;
+Q_RELAX.reference_3[45][33]:=AT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.5007522026922482;
+Q_RELAX.reference_3[45][37]:=CT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1351200521140052;
+Q_RELAX.reference_3[45][41]:=GT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1344351325741675;
+Q_RELAX.reference_3[45][44]:=AC*t*0.3824103826488193;
+Q_RELAX.reference_3[45][46]:=CG*t*0.2406378906553946;
+Q_RELAX.reference_3[45][47]:=CT*t*0.2504957133922061;
+Q_RELAX.reference_3[45][58]:=GT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.250994522453953;
+Q_RELAX.reference_3[46][14]:=t*Min(1000,RELAX.reference.omega_2^local_k)*0.3222350398108426;
+Q_RELAX.reference_3[46][30]:=CG*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1214054057357627;
+Q_RELAX.reference_3[46][34]:=AT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.5007522026922482;
+Q_RELAX.reference_3[46][38]:=CT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1351200521140052;
+Q_RELAX.reference_3[46][42]:=GT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1344351325741675;
+Q_RELAX.reference_3[46][44]:=t*0.3824103826488193;
+Q_RELAX.reference_3[46][45]:=CG*t*0.1264560133035801;
+Q_RELAX.reference_3[46][47]:=GT*t*0.2504957133922061;
+Q_RELAX.reference_3[46][59]:=GT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.250994522453953;
+Q_RELAX.reference_3[47][15]:=t*Min(1000,RELAX.reference.omega_2^local_k)*0.3222350398108426;
+Q_RELAX.reference_3[47][31]:=CG*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1214054057357627;
+Q_RELAX.reference_3[47][35]:=AT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.5007522026922482;
+Q_RELAX.reference_3[47][39]:=CT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1351200521140052;
+Q_RELAX.reference_3[47][43]:=GT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1344351325741675;
+Q_RELAX.reference_3[47][44]:=AT*t*0.3824103826488193;
+Q_RELAX.reference_3[47][45]:=CT*t*0.1264560133035801;
+Q_RELAX.reference_3[47][46]:=GT*t*0.2406378906553946;
+Q_RELAX.reference_3[47][60]:=GT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.250994522453953;
+Q_RELAX.reference_3[48][1]:=AT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.3222350398108426;
+Q_RELAX.reference_3[48][17]:=CT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1214054057357627;
+Q_RELAX.reference_3[48][33]:=GT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.3053650319994416;
+Q_RELAX.reference_3[48][49]:=CT*t*0.2504957133922061;
+Q_RELAX.reference_3[48][51]:=AC*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1351200521140052;
+Q_RELAX.reference_3[48][54]:=t*Min(1000,RELAX.reference.omega_2^local_k)*0.1344351325741675;
+Q_RELAX.reference_3[48][58]:=AT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.2296926126195792;
+Q_RELAX.reference_3[49][3]:=AT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.3222350398108426;
+Q_RELAX.reference_3[49][19]:=CT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1214054057357627;
+Q_RELAX.reference_3[49][35]:=GT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.3053650319994416;
+Q_RELAX.reference_3[49][48]:=CT*t*0.1264560133035801;
+Q_RELAX.reference_3[49][53]:=AC*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1351200521140052;
+Q_RELAX.reference_3[49][56]:=t*Min(1000,RELAX.reference.omega_2^local_k)*0.1344351325741675;
+Q_RELAX.reference_3[49][60]:=AT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.2296926126195792;
+Q_RELAX.reference_3[50][4]:=AT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.3222350398108426;
+Q_RELAX.reference_3[50][20]:=CT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1214054057357627;
+Q_RELAX.reference_3[50][36]:=GT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.3053650319994416;
+Q_RELAX.reference_3[50][51]:=AC*t*0.1264560133035801;
+Q_RELAX.reference_3[50][52]:=t*0.2406378906553946;
+Q_RELAX.reference_3[50][53]:=AT*t*0.2504957133922061;
+Q_RELAX.reference_3[50][57]:=CT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.2296926126195792;
+Q_RELAX.reference_3[51][5]:=AT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.3222350398108426;
+Q_RELAX.reference_3[51][21]:=CT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1214054057357627;
+Q_RELAX.reference_3[51][37]:=GT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.3053650319994416;
+Q_RELAX.reference_3[51][48]:=AC*t*Min(1000,RELAX.reference.omega_2^local_k)*0.5007522026922482;
+Q_RELAX.reference_3[51][50]:=AC*t*0.3824103826488193;
+Q_RELAX.reference_3[51][52]:=CG*t*0.2406378906553946;
+Q_RELAX.reference_3[51][53]:=CT*t*0.2504957133922061;
+Q_RELAX.reference_3[51][54]:=CG*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1344351325741675;
+Q_RELAX.reference_3[51][58]:=CT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.2296926126195792;
+Q_RELAX.reference_3[52][6]:=AT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.3222350398108426;
+Q_RELAX.reference_3[52][22]:=CT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1214054057357627;
+Q_RELAX.reference_3[52][38]:=GT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.3053650319994416;
+Q_RELAX.reference_3[52][50]:=t*0.3824103826488193;
+Q_RELAX.reference_3[52][51]:=CG*t*0.1264560133035801;
+Q_RELAX.reference_3[52][53]:=GT*t*0.2504957133922061;
+Q_RELAX.reference_3[52][55]:=CG*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1344351325741675;
+Q_RELAX.reference_3[52][59]:=CT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.2296926126195792;
+Q_RELAX.reference_3[53][7]:=AT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.3222350398108426;
+Q_RELAX.reference_3[53][23]:=CT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1214054057357627;
+Q_RELAX.reference_3[53][39]:=GT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.3053650319994416;
+Q_RELAX.reference_3[53][49]:=AC*t*Min(1000,RELAX.reference.omega_2^local_k)*0.5007522026922482;
+Q_RELAX.reference_3[53][50]:=AT*t*0.3824103826488193;
+Q_RELAX.reference_3[53][51]:=CT*t*0.1264560133035801;
+Q_RELAX.reference_3[53][52]:=GT*t*0.2406378906553946;
+Q_RELAX.reference_3[53][56]:=CG*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1344351325741675;
+Q_RELAX.reference_3[53][60]:=CT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.2296926126195792;
+Q_RELAX.reference_3[54][9]:=AT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.3222350398108426;
+Q_RELAX.reference_3[54][25]:=CT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1214054057357627;
+Q_RELAX.reference_3[54][41]:=GT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.3053650319994416;
+Q_RELAX.reference_3[54][48]:=t*Min(1000,RELAX.reference.omega_2^local_k)*0.5007522026922482;
+Q_RELAX.reference_3[54][51]:=CG*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1351200521140052;
+Q_RELAX.reference_3[54][55]:=CG*t*Min(1000,RELAX.reference.omega_2^local_k)*0.2406378906553946;
+Q_RELAX.reference_3[54][56]:=CT*t*0.2504957133922061;
+Q_RELAX.reference_3[54][58]:=GT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.2296926126195792;
+Q_RELAX.reference_3[55][10]:=AT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.3222350398108426;
+Q_RELAX.reference_3[55][26]:=CT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1214054057357627;
+Q_RELAX.reference_3[55][42]:=GT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.3053650319994416;
+Q_RELAX.reference_3[55][52]:=CG*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1351200521140052;
+Q_RELAX.reference_3[55][54]:=CG*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1264560133035801;
+Q_RELAX.reference_3[55][56]:=GT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.2504957133922061;
+Q_RELAX.reference_3[55][59]:=GT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.2296926126195792;
+Q_RELAX.reference_3[56][11]:=AT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.3222350398108426;
+Q_RELAX.reference_3[56][27]:=CT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1214054057357627;
+Q_RELAX.reference_3[56][43]:=GT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.3053650319994416;
+Q_RELAX.reference_3[56][49]:=t*Min(1000,RELAX.reference.omega_2^local_k)*0.5007522026922482;
+Q_RELAX.reference_3[56][53]:=CG*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1351200521140052;
+Q_RELAX.reference_3[56][54]:=CT*t*0.1264560133035801;
+Q_RELAX.reference_3[56][55]:=GT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.2406378906553946;
+Q_RELAX.reference_3[56][60]:=GT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.2296926126195792;
+Q_RELAX.reference_3[57][12]:=AT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.3222350398108426;
+Q_RELAX.reference_3[57][28]:=CT*t*0.1214054057357627;
+Q_RELAX.reference_3[57][44]:=GT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.3053650319994416;
+Q_RELAX.reference_3[57][50]:=CT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1351200521140052;
+Q_RELAX.reference_3[57][58]:=AC*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1264560133035801;
+Q_RELAX.reference_3[57][59]:=t*0.2406378906553946;
+Q_RELAX.reference_3[57][60]:=AT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.2504957133922061;
+Q_RELAX.reference_3[58][13]:=AT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.3222350398108426;
+Q_RELAX.reference_3[58][29]:=CT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1214054057357627;
+Q_RELAX.reference_3[58][45]:=GT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.3053650319994416;
+Q_RELAX.reference_3[58][48]:=AT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.5007522026922482;
+Q_RELAX.reference_3[58][51]:=CT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1351200521140052;
+Q_RELAX.reference_3[58][54]:=GT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1344351325741675;
+Q_RELAX.reference_3[58][57]:=AC*t*Min(1000,RELAX.reference.omega_2^local_k)*0.3824103826488193;
+Q_RELAX.reference_3[58][59]:=CG*t*Min(1000,RELAX.reference.omega_2^local_k)*0.2406378906553946;
+Q_RELAX.reference_3[58][60]:=CT*t*0.2504957133922061;
+Q_RELAX.reference_3[59][14]:=AT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.3222350398108426;
+Q_RELAX.reference_3[59][30]:=CT*t*0.1214054057357627;
+Q_RELAX.reference_3[59][46]:=GT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.3053650319994416;
+Q_RELAX.reference_3[59][52]:=CT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1351200521140052;
+Q_RELAX.reference_3[59][55]:=GT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1344351325741675;
+Q_RELAX.reference_3[59][57]:=t*0.3824103826488193;
+Q_RELAX.reference_3[59][58]:=CG*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1264560133035801;
+Q_RELAX.reference_3[59][60]:=GT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.2504957133922061;
+Q_RELAX.reference_3[60][15]:=AT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.3222350398108426;
+Q_RELAX.reference_3[60][31]:=CT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1214054057357627;
+Q_RELAX.reference_3[60][47]:=GT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.3053650319994416;
+Q_RELAX.reference_3[60][49]:=AT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.5007522026922482;
+Q_RELAX.reference_3[60][53]:=CT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1351200521140052;
+Q_RELAX.reference_3[60][56]:=GT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.1344351325741675;
+Q_RELAX.reference_3[60][57]:=AT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.3824103826488193;
+Q_RELAX.reference_3[60][58]:=CT*t*0.1264560133035801;
+Q_RELAX.reference_3[60][59]:=GT*t*Min(1000,RELAX.reference.omega_2^local_k)*0.2406378906553946;
+
+
+RELAX.reference_model_eqf={
+{0.06789889450438902}
+{0.02245290372942207}
+{0.04272647263966693}
+{0.04447677884582558}
+{0.01832144145265965}
+{0.006058560513002445}
+{0.01152906203643302}
+{0.01200135444876809}
+{0.01822857060889821}
+{0.006027849849309518}
+{0.01147062156263798}
+{0.01194051993873147}
+{0.03114489439855585}
+{0.01029903830832752}
+{0.01959842627922601}
+{0.0204012832676034}
+{0.0255816153362901}
+{0.008459365216199515}
+{0.0160976433522615}
+{0.01675708943622944}
+{0.006902793794647167}
+{0.002282625743269596}
+{0.004343694140486931}
+{0.004521635223427881}
+{0.00686780373746872}
+{0.002271055181023346}
+{0.004321676083615643}
+{0.004498715188480508}
+{0.01173416318496511}
+{0.003880269896298824}
+{0.007383911121548391}
+{0.007686395849711308}
+{0.06434417593204837}
+{0.02127742429823938}
+{0.04048960874178697}
+{0.04214828096739659}
+{0.01736225693751837}
+{0.005741376003086347}
+{0.01092547973598884}
+{0.0113730461697648}
+{0.01727424817163843}
+{0.005712273138274315}
+{0.01087009880298738}
+{0.01131539653577432}
+{0.02951436218797651}
+{0.009759851580486268}
+{0.01857238763173507}
+{0.01933321255658108}
+{0.01748896039542764}
+{0.03464374288175238}
+{0.01427089198858639}
+{0.004719119012048105}
+{0.008980188566318471}
+{0.00934806540727982}
+{0.004695197937628716}
+{0.008934668256606717}
+{0.009300680340763385}
+{0.02425930432963823}
+{0.008022101517733991}
+{0.01526555786015987}
+{0.01589091724539275}
+}
+;
+Model RELAX.reference_model=("Exp(Q_RELAX.reference_1)*RELAX.reference.aux_freq_0+Exp(Q_RELAX.reference_2)*(1-RELAX.reference.aux_freq_0)*RELAX.reference.aux_freq_1+Exp(Q_RELAX.reference_3)*(1-RELAX.reference.aux_freq_0)*(1-RELAX.reference.aux_freq_1)",RELAX.reference_model_eqf,EXPLICIT_FORM_MATRIX_EXPONENTIAL);
+TRY_NUMERIC_SEQUENCE_MATCH=0;
+ACCEPT_ROOTED_TREES=0;
+Tree RELAX.tree=((((((((((((70{RELAX.test_model},((811{RELAX.test_model},(181{RELAX.test_model},1180{RELAX.test_model})Node16{RELAX.test_model})Node14{RELAX.test_model},401{RELAX.test_model})Node13{RELAX.test_model})Node11{RELAX.reference_model},1220{RELAX.reference_model})Node10{RELAX.reference_model},1070{RELAX.reference_model})Node9{RELAX.reference_model},(720{RELAX.reference_model},750{RELAX.reference_model})Node22{RELAX.reference_model})Node8{RELAX.reference_model},151{RELAX.referen [...]
+
+RELAX.tree.70.t=0.07633844506674624;
+RELAX.tree.811.t=0.04787261257594203;
+RELAX.tree.181.t=0;
+RELAX.tree.1180.t=0.009231111746969318;
+RELAX.tree.Node16.t=0.06029008036871097;
+RELAX.tree.Node14.t=0;
+RELAX.tree.401.t=0;
+RELAX.tree.Node13.t=0;
+RELAX.tree.Node11.t=0;
+RELAX.tree.1220.t=0.002221710948574475;
+RELAX.tree.Node10.t=0;
+RELAX.tree.1070.t=0.004831134416743633;
+RELAX.tree.Node9.t=0.04616417397779116;
+RELAX.tree.720.t=0;
+RELAX.tree.750.t=0.001715446458811805;
+RELAX.tree.Node22.t=0.02215180886870997;
+RELAX.tree.Node8.t=0;
+RELAX.tree.151.t=0.001922233766039015;
+RELAX.tree.Node7.t=0;
+RELAX.tree.50.t=0.005071208109356998;
+RELAX.tree.770.t=0.002989396083344868;
+RELAX.tree.Node26.t=0.00168470634498451;
+RELAX.tree.Node6.t=0;
+RELAX.tree.1150.t=0.001515368332637433;
+RELAX.tree.Node5.t=0;
+RELAX.tree.431.t=0.003439904259458107;
+RELAX.tree.1250.t=0;
+RELAX.tree.Node31.t=0.00154349391099413;
+RELAX.tree.1210.t=0;
+RELAX.tree.Node30.t=0;
+RELAX.tree.Node4.t=0.001479357244412417;
+RELAX.tree.680.t=0.001508604671136465;
+RELAX.tree.941.t=0.001479504204674074;
+RELAX.tree.Node38.t=0;
+RELAX.tree.650.t=0;
+RELAX.tree.Node37.t=0;
+RELAX.tree.970.t=0.001660646465191282;
+RELAX.tree.Node36.t=0.001726899656371538;
+RELAX.tree.700.t=0;
+RELAX.tree.Node35.t=0.001616499174195052;
+RELAX.tree.Node3.t=0;
+RELAX.tree.1190.t=0.001499853851962759;
+RELAX.tree.Node2.t=0;
+RELAX.tree.171.t=0;
+RELAX.tree.Node1.t=0;
+RELAX.tree.30.t=0.001479468850779822;
+RELAX.tree.80.t=0.001682193302231334;
+RELAX.tree.471.t=0.004040194197928062;
+RELAX.tree.Node55.t=0.00305999638418093;
+RELAX.tree.270.t=0;
+RELAX.tree.501.t=0.001816800432684641;
+RELAX.tree.Node60.t=0.003489559664523785;
+RELAX.tree.460.t=0.00163115022453594;
+RELAX.tree.Node59.t=0.001852190801774648;
+RELAX.tree.310.t=0;
+RELAX.tree.330.t=0.003596701668416462;
+RELAX.tree.Node67.t=0;
+RELAX.tree.520.t=0;
+RELAX.tree.560.t=0.001600522239725402;
+RELAX.tree.Node70.t=0.001558639538449402;
+RELAX.tree.Node66.t=0;
+RELAX.tree.290.t=0.001584023394754153;
+RELAX.tree.Node65.t=0;
+RELAX.tree.540.t=0.001595369657643128;
+RELAX.tree.Node64.t=0;
+RELAX.tree.Node58.t=0.01189052751421953;
+RELAX.tree.Node54.t=0.001540277846843392;
+RELAX.tree.591.t=0.01512792212079371;
+RELAX.tree.1260.t=0.01298051495992966;
+RELAX.tree.Node76.t=0.07138488804251646;
+RELAX.tree.11.t=0.01738931110735216;
+RELAX.tree.191.t=0;
+RELAX.tree.231.t=0.001765805363502308;
+RELAX.tree.Node81.t=0.0205194294745165;
+RELAX.tree.Node79.t=0.07001238814907183;
+RELAX.tree.Node75.t=0.03514260538285482;
+RELAX.tree.Node53.t=0;
+RELAX.tree.Node51.t=0.00346869056565387;
+RELAX.tree.20.t=0.009627471142104832;
+RELAX.tree.60.t=0.009706731374062031;
+RELAX.tree.Node86.t=0.002080358207610932;
+RELAX.tree.511.t=0.001672639314553971;
+RELAX.tree.1281.t=0.001675750937077829;
+RELAX.tree.Node92.t=0;
+RELAX.tree.90.t=0;
+RELAX.tree.Node91.t=0.003944325313622885;
+RELAX.tree.130.t=0.01147915562956636;
+RELAX.tree.571.t=0;
+RELAX.tree.Node98.t=0;
+RELAX.tree.301.t=0.001494620149021243;
+RELAX.tree.281.t=0;
+RELAX.tree.Node101.t=0;
+RELAX.tree.Node97.t=0.001461451241614666;
+RELAX.tree.531.t=0;
+RELAX.tree.Node96.t=0.003346532237035809;
+RELAX.tree.Node90.t=0.01727497375583091;
+RELAX.tree.490.t=0.06369320489592652;
+RELAX.tree.Node89.t=0.003629056600248224;
+RELAX.tree.Node85.t=0.001751830621001504;
+RELAX.tree.670.t=0;
+RELAX.tree.Node84.t=0;
+RELAX.tree.Node50.t=0.001922819159672292;
+RELAX.tree.161.t=0;
+RELAX.tree.1110.t=0.00170106979672082;
+RELAX.tree.Node107.t=0.002977351192275625;
+RELAX.tree.Node49.t=0;
+RELAX.tree.1200.t=0;
+RELAX.tree.1270.t=0.002902741134185784;
+RELAX.tree.Node110.t=0.00167556004870607;
+RELAX.tree.Node48.t=0;
+RELAX.tree.141.t=0.001402458273474048;
+RELAX.tree.Node47.t=0;
+RELAX.tree.640.t=0.001702299885503237;
+RELAX.tree.961.t=0;
+RELAX.tree.Node115.t=0.001409361882079406;
+RELAX.tree.740.t=0.001464197654824995;
+RELAX.tree.Node114.t=0.001445490563812687;
+RELAX.tree.Node46.t=0;
+RELAX.tree.241.t=0.001518901515406618;
+RELAX.tree.Node14.local_k:=RELAX.K;
+RELAX.tree.Node14.local_k:<50;
+RELAX.tree.11.local_k:=1;
+RELAX.tree.11.local_k:<50;
+RELAX.tree.811.local_k:=RELAX.K;
+RELAX.tree.811.local_k:<50;
+RELAX.tree.1070.local_k:=1;
+RELAX.tree.1070.local_k:<50;
+RELAX.tree.401.local_k:=RELAX.K;
+RELAX.tree.401.local_k:<50;
+RELAX.tree.Node16.local_k:=RELAX.K;
+RELAX.tree.Node16.local_k:<50;
+RELAX.tree.1150.local_k:=1;
+RELAX.tree.1150.local_k:<50;
+RELAX.tree.181.local_k:=RELAX.K;
+RELAX.tree.181.local_k:<50;
+RELAX.tree.1110.local_k:=1;
+RELAX.tree.1110.local_k:<50;
+RELAX.tree.1190.local_k:=1;
+RELAX.tree.1190.local_k:<50;
+RELAX.tree.Node13.local_k:=RELAX.K;
+RELAX.tree.Node13.local_k:<50;
+RELAX.tree.1210.local_k:=1;
+RELAX.tree.1210.local_k:<50;
+RELAX.tree.1180.local_k:=RELAX.K;
+RELAX.tree.1180.local_k:<50;
+RELAX.tree.1200.local_k:=1;
+RELAX.tree.1200.local_k:<50;
+RELAX.tree.70.local_k:=RELAX.K;
+RELAX.tree.70.local_k:<50;
+RELAX.tree.1250.local_k:=1;
+RELAX.tree.1250.local_k:<50;
+RELAX.tree.1220.local_k:=1;
+RELAX.tree.1220.local_k:<50;
+RELAX.tree.1260.local_k:=1;
+RELAX.tree.1260.local_k:<50;
+RELAX.tree.1270.local_k:=1;
+RELAX.tree.1270.local_k:<50;
+RELAX.tree.1281.local_k:=1;
+RELAX.tree.1281.local_k:<50;
+RELAX.tree.130.local_k:=1;
+RELAX.tree.130.local_k:<50;
+RELAX.tree.141.local_k:=1;
+RELAX.tree.141.local_k:<50;
+RELAX.tree.151.local_k:=1;
+RELAX.tree.151.local_k:<50;
+RELAX.tree.161.local_k:=1;
+RELAX.tree.161.local_k:<50;
+RELAX.tree.171.local_k:=1;
+RELAX.tree.171.local_k:<50;
+RELAX.tree.191.local_k:=1;
+RELAX.tree.191.local_k:<50;
+RELAX.tree.20.local_k:=1;
+RELAX.tree.20.local_k:<50;
+RELAX.tree.231.local_k:=1;
+RELAX.tree.231.local_k:<50;
+RELAX.tree.241.local_k:=1;
+RELAX.tree.241.local_k:<50;
+RELAX.tree.270.local_k:=1;
+RELAX.tree.270.local_k:<50;
+RELAX.tree.281.local_k:=1;
+RELAX.tree.281.local_k:<50;
+RELAX.tree.290.local_k:=1;
+RELAX.tree.290.local_k:<50;
+RELAX.tree.30.local_k:=1;
+RELAX.tree.30.local_k:<50;
+RELAX.tree.301.local_k:=1;
+RELAX.tree.301.local_k:<50;
+RELAX.tree.310.local_k:=1;
+RELAX.tree.310.local_k:<50;
+RELAX.tree.330.local_k:=1;
+RELAX.tree.330.local_k:<50;
+RELAX.tree.431.local_k:=1;
+RELAX.tree.431.local_k:<50;
+RELAX.tree.460.local_k:=1;
+RELAX.tree.460.local_k:<50;
+RELAX.tree.471.local_k:=1;
+RELAX.tree.471.local_k:<50;
+RELAX.tree.490.local_k:=1;
+RELAX.tree.490.local_k:<50;
+RELAX.tree.50.local_k:=1;
+RELAX.tree.50.local_k:<50;
+RELAX.tree.501.local_k:=1;
+RELAX.tree.501.local_k:<50;
+RELAX.tree.511.local_k:=1;
+RELAX.tree.511.local_k:<50;
+RELAX.tree.520.local_k:=1;
+RELAX.tree.520.local_k:<50;
+RELAX.tree.531.local_k:=1;
+RELAX.tree.531.local_k:<50;
+RELAX.tree.540.local_k:=1;
+RELAX.tree.540.local_k:<50;
+RELAX.tree.560.local_k:=1;
+RELAX.tree.560.local_k:<50;
+RELAX.tree.571.local_k:=1;
+RELAX.tree.571.local_k:<50;
+RELAX.tree.591.local_k:=1;
+RELAX.tree.591.local_k:<50;
+RELAX.tree.60.local_k:=1;
+RELAX.tree.60.local_k:<50;
+RELAX.tree.640.local_k:=1;
+RELAX.tree.640.local_k:<50;
+RELAX.tree.650.local_k:=1;
+RELAX.tree.650.local_k:<50;
+RELAX.tree.670.local_k:=1;
+RELAX.tree.670.local_k:<50;
+RELAX.tree.680.local_k:=1;
+RELAX.tree.680.local_k:<50;
+RELAX.tree.700.local_k:=1;
+RELAX.tree.700.local_k:<50;
+RELAX.tree.720.local_k:=1;
+RELAX.tree.720.local_k:<50;
+RELAX.tree.740.local_k:=1;
+RELAX.tree.740.local_k:<50;
+RELAX.tree.750.local_k:=1;
+RELAX.tree.750.local_k:<50;
+RELAX.tree.770.local_k:=1;
+RELAX.tree.770.local_k:<50;
+RELAX.tree.80.local_k:=1;
+RELAX.tree.80.local_k:<50;
+RELAX.tree.90.local_k:=1;
+RELAX.tree.90.local_k:<50;
+RELAX.tree.941.local_k:=1;
+RELAX.tree.941.local_k:<50;
+RELAX.tree.961.local_k:=1;
+RELAX.tree.961.local_k:<50;
+RELAX.tree.970.local_k:=1;
+RELAX.tree.970.local_k:<50;
+RELAX.tree.Node1.local_k:=1;
+RELAX.tree.Node1.local_k:<50;
+RELAX.tree.Node10.local_k:=1;
+RELAX.tree.Node10.local_k:<50;
+RELAX.tree.Node101.local_k:=1;
+RELAX.tree.Node101.local_k:<50;
+RELAX.tree.Node107.local_k:=1;
+RELAX.tree.Node107.local_k:<50;
+RELAX.tree.Node11.local_k:=1;
+RELAX.tree.Node11.local_k:<50;
+RELAX.tree.Node110.local_k:=1;
+RELAX.tree.Node110.local_k:<50;
+RELAX.tree.Node114.local_k:=1;
+RELAX.tree.Node114.local_k:<50;
+RELAX.tree.Node115.local_k:=1;
+RELAX.tree.Node115.local_k:<50;
+RELAX.tree.Node2.local_k:=1;
+RELAX.tree.Node2.local_k:<50;
+RELAX.tree.Node22.local_k:=1;
+RELAX.tree.Node22.local_k:<50;
+RELAX.tree.Node26.local_k:=1;
+RELAX.tree.Node26.local_k:<50;
+RELAX.tree.Node3.local_k:=1;
+RELAX.tree.Node3.local_k:<50;
+RELAX.tree.Node30.local_k:=1;
+RELAX.tree.Node30.local_k:<50;
+RELAX.tree.Node31.local_k:=1;
+RELAX.tree.Node31.local_k:<50;
+RELAX.tree.Node35.local_k:=1;
+RELAX.tree.Node35.local_k:<50;
+RELAX.tree.Node36.local_k:=1;
+RELAX.tree.Node36.local_k:<50;
+RELAX.tree.Node37.local_k:=1;
+RELAX.tree.Node37.local_k:<50;
+RELAX.tree.Node38.local_k:=1;
+RELAX.tree.Node38.local_k:<50;
+RELAX.tree.Node4.local_k:=1;
+RELAX.tree.Node4.local_k:<50;
+RELAX.tree.Node46.local_k:=1;
+RELAX.tree.Node46.local_k:<50;
+RELAX.tree.Node47.local_k:=1;
+RELAX.tree.Node47.local_k:<50;
+RELAX.tree.Node48.local_k:=1;
+RELAX.tree.Node48.local_k:<50;
+RELAX.tree.Node49.local_k:=1;
+RELAX.tree.Node49.local_k:<50;
+RELAX.tree.Node5.local_k:=1;
+RELAX.tree.Node5.local_k:<50;
+RELAX.tree.Node50.local_k:=1;
+RELAX.tree.Node50.local_k:<50;
+RELAX.tree.Node51.local_k:=1;
+RELAX.tree.Node51.local_k:<50;
+RELAX.tree.Node53.local_k:=1;
+RELAX.tree.Node53.local_k:<50;
+RELAX.tree.Node54.local_k:=1;
+RELAX.tree.Node54.local_k:<50;
+RELAX.tree.Node55.local_k:=1;
+RELAX.tree.Node55.local_k:<50;
+RELAX.tree.Node58.local_k:=1;
+RELAX.tree.Node58.local_k:<50;
+RELAX.tree.Node59.local_k:=1;
+RELAX.tree.Node59.local_k:<50;
+RELAX.tree.Node6.local_k:=1;
+RELAX.tree.Node6.local_k:<50;
+RELAX.tree.Node60.local_k:=1;
+RELAX.tree.Node60.local_k:<50;
+RELAX.tree.Node64.local_k:=1;
+RELAX.tree.Node64.local_k:<50;
+RELAX.tree.Node65.local_k:=1;
+RELAX.tree.Node65.local_k:<50;
+RELAX.tree.Node66.local_k:=1;
+RELAX.tree.Node66.local_k:<50;
+RELAX.tree.Node67.local_k:=1;
+RELAX.tree.Node67.local_k:<50;
+RELAX.tree.Node7.local_k:=1;
+RELAX.tree.Node7.local_k:<50;
+RELAX.tree.Node70.local_k:=1;
+RELAX.tree.Node70.local_k:<50;
+RELAX.tree.Node75.local_k:=1;
+RELAX.tree.Node75.local_k:<50;
+RELAX.tree.Node76.local_k:=1;
+RELAX.tree.Node76.local_k:<50;
+RELAX.tree.Node79.local_k:=1;
+RELAX.tree.Node79.local_k:<50;
+RELAX.tree.Node8.local_k:=1;
+RELAX.tree.Node8.local_k:<50;
+RELAX.tree.Node81.local_k:=1;
+RELAX.tree.Node81.local_k:<50;
+RELAX.tree.Node84.local_k:=1;
+RELAX.tree.Node84.local_k:<50;
+RELAX.tree.Node85.local_k:=1;
+RELAX.tree.Node85.local_k:<50;
+RELAX.tree.Node86.local_k:=1;
+RELAX.tree.Node86.local_k:<50;
+RELAX.tree.Node89.local_k:=1;
+RELAX.tree.Node89.local_k:<50;
+RELAX.tree.Node9.local_k:=1;
+RELAX.tree.Node9.local_k:<50;
+RELAX.tree.Node90.local_k:=1;
+RELAX.tree.Node90.local_k:<50;
+RELAX.tree.Node91.local_k:=1;
+RELAX.tree.Node91.local_k:<50;
+RELAX.tree.Node92.local_k:=1;
+RELAX.tree.Node92.local_k:<50;
+RELAX.tree.Node96.local_k:=1;
+RELAX.tree.Node96.local_k:<50;
+RELAX.tree.Node97.local_k:=1;
+RELAX.tree.Node97.local_k:<50;
+RELAX.tree.Node98.local_k:=1;
+RELAX.tree.Node98.local_k:<50;
+DataSet RELAX.codon_data = ReadDataFile(USE_NEXUS_FILE_DATA);
+DataSetFilter RELAX.codon_filter = CreateFilter(RELAX.codon_data,3,"0-680","0,56,59,60,58,57,55,53,54,1,3,52,2,49-51,44-48,43,38,4-8,10,9,11,13,14,12,15,30-34,16-26,39,35,36,40,42,37,27-29,41","TAA,TAG,TGA");
+ASSUME_REVERSIBLE_MODELS=1;
+LikelihoodFunction relax.LF = (RELAX.codon_filter,RELAX.tree);
+
+END;
\ No newline at end of file
diff --git a/tests/hbltests/RegressionTesting/RELAX/segfault.nex.tre b/tests/hbltests/RegressionTesting/RELAX/segfault.nex.tre
new file mode 100644
index 0000000..2462190
--- /dev/null
+++ b/tests/hbltests/RegressionTesting/RELAX/segfault.nex.tre
@@ -0,0 +1 @@
+((((((((((((70{TEST}:0.02525582666799697,((811{TEST}:0.03593392032616975,(181{TEST},1180{TEST}:0.09755831585996391){TEST}:0.07668300714280248){TEST}:0.002346396647307368,401{TEST}){TEST}:0.01021932063804901){REFERENCE}:0.004005210999283765,1220{REFERENCE}){REFERENCE}:0.005212822552452396,1070{REFERENCE}){REFERENCE}:0.0005966346129453164,(720{REFERENCE},750{REFERENCE}:0.001867645454551233){REFERENCE}:0.005015550584592456){REFERENCE}:0.002806121648306893,151{REFERENCE}:0.000117704779384285 [...]
\ No newline at end of file
diff --git a/tests/hbltests/RegressionTesting/RELAX/wrapper.bf b/tests/hbltests/RegressionTesting/RELAX/wrapper.bf
new file mode 100644
index 0000000..09899f9
--- /dev/null
+++ b/tests/hbltests/RegressionTesting/RELAX/wrapper.bf
@@ -0,0 +1,7 @@
+LoadFunctionLibrary ("RELAX", 
+
+                        {"0" : "Universal",
+                         "1" : PATH_TO_CURRENT_BF + "segfault.nex",
+                         "2" : PATH_TO_CURRENT_BF + "segfault.nex.tre",
+                         "3" : "TEST", 
+                         "4" : "All"});
\ No newline at end of file
diff --git a/tests/hbltests/RegressionTesting/expModelCrash.bf b/tests/hbltests/RegressionTesting/expModelCrash.bf
new file mode 100644
index 0000000..5e8ffb2
--- /dev/null
+++ b/tests/hbltests/RegressionTesting/expModelCrash.bf
@@ -0,0 +1,1727 @@
+#NEXUS
+
+BEGIN TAXA;
+	DIMENSIONS NTAX = 5;
+	TAXLABELS
+		'AF097023_HHV1_STRAIN_HSZP' 'AB218904_CHHV_PANTROGLODYTES' 'JN561323_HHV2_STRAIN_HG52' 'AF533768_MHV1_STRAIN_E2490_MACACAMULATTA' 'DQ149153_HVP2_STRAIN_X313_PAPIOCYNOCEPHALUS' ;
+END;
+
+BEGIN CHARACTERS;
+	DIMENSIONS NCHAR = 2283;
+	FORMAT
+		DATATYPE = DNA
+		GAP=-
+		MISSING=?
+	;
+
+MATRIX
+	'AF097023_HHV1_STRAIN_HSZP'                    AACGCGACCGTCGCCGCGGGCCACGCCACCCTGCGCGAGCACCTGCGGGACATCAAGGCGGAGAGCACCGATGCAAACTTTTACGTGTGCCCACCCCCCACGGGCGCCACGGTGGTGCAGTTCGAGCAGCCGCGCCGCTGCCCGACCCGGCCCGAGGGTCAGAACTACACGGAGGGCATCGCGGTGGTCTTCAAGGAGAACATCGCCCCGTACAAGTTCAAGGCCACCATGTACTACAAAGACGTCACCGTTTCGCAGGTGTGGTTCGGCCACCGCTACTCCCAGTTTATGGGGATCTTTGAGGACCGCGCCCCCGTCCCCTTCGAGGAGGTGATCGACAAGATCAACGCCAAGGGGGTCTGTCGGTCCACGGCCAAGTACGTGCGCAACAACCTGGAGACCACCGCGTTTCACCGGGACGACCACGAGACCGACATGGAGCTG [...]
+	'AB218904_CHHV_PANTROGLODYTES'                 AATGCGACCGTCGCCGCCGGCCACGCCACGCTGCGCGCGCACCTGCGGGATATCAAGGTCGAGAACGCCGATGCCCAATTCTACGTGTGCCCGCCCCCGACGGGCGCCACGGTGGTGCAGTTTGAGCAACCGCGCCGCTGCCCGACGCGCCCGGAGGGGCAGAACTACACGGAGGGCATCGCGGTGGTCTTTAAGGAGAACATCGCCCCGTACAAATTCAAGGCCACCATGTACTATAAAGACGTGACCGTGTCGCAGGTGTGGTTCGGCCACCGCTACTCCCAGTTTATGAGGATATTCGAGGACCGCGCCCCCGTTCCCTTCGAGGAGGTGATCGACAAAATTAACGCCAAGGGGGTCTGCCGGTCCACGGCCAAGTACGTGCGGAACAACCTGGAGACCACCGCGTTTCATCGGGACGACCACGAGACCGACATGGAGCTC [...]
+	'JN561323_HHV2_STRAIN_HG52'                    AACGCGACCGTCGCCGCCGGCCACGCCACGCTGCGCGCGCACCTGCGGGAAATCAAGGTCGAGAACGCCGATGCCCAGTTTTACGTGTGCCCGCCCCCGACGGGCGCCACGGTGGTGCAGTTTGAGCAGCCGCGCCGCTGCCCGACGCGCCCGGAGGGGCAGAACTACACGGAGGGCATCGCGGTGGTCTTCAAGGAGAACATCGCCCCGTACAAATTCAAGGCCACCATGTACTACAAAGACGTGACCGTGTCGCAGGTGTGGTTCGGCCACCGCTACTCCCAGTTTATGGGGATATTCGAGGACCGCGCCCCCGTTCCCTTCGAGGAGGTGATCGACAAGATTAACGCCAAGGGGGTCTGCCGCTCCACGGCCAAGTACGTGCGGAACAACATGGAGACCACCGCGTTTCACCGGGACGACCACGAGACCGACATGGAGCTC [...]
+	'AF533768_MHV1_STRAIN_E2490_MACACAMULATTA'     AACGCGTCCGTCGAGGCCGGCCACGCGACGCTGCGGGAGAACCTGCGGGACATCAAGGCCCTGGACGGCGACGCGACCTTCTACGTCTGCCCGCCGCCGACCGGCGCCACGGTGGTGCAGTTTGAGCAGCCCCGGCCGTGCCCGCGGGCGCCCGACGGCCAGAACTACACCGAGGGGATCGCGGTGATCTTCAAGGAGAACATCGCCCCGTACAAGTTCAAGGCCACCATGTACTACAAGGACGTGACCGTCTCGCAGGTCTGGTTCGGCCACAGGTACTCGCAGTTCATGGGGATCTTCGAGGACCGCGCCCCCGTGCCCTTCGAGGAGGTGATCGACAAGATCAACGCCAGGGGGGTCTGCCGCTCGACGGCAAAGTACGTGCGGAACAACATGGAGAGCACGGCGTTCCACCGCGACGACGACGAGTCGGACATGAAGCTG [...]
+	'DQ149153_HVP2_STRAIN_X313_PAPIOCYNOCEPHALUS'  AACGCGTCGGTCGAGGCCGGCCGCGCGACGCTGCGGGAGGACCTGCGGGGGATCAAGGCCCGGGACGGCGACGCGACCTTCTACGTCTGCCCGCCGCCGACCGGCGCCACGGTGGTGCAGTTCGAGCAGCCCCGGCCGTGCCCGCGGGCGCCCGACGGTCAGAACTACACGGAGGGGATCGCGGTCGTCTTCAAGGAGAACATCGCCCCGTACAAGTTCCGGGCCACCATGTACTACAAGGACGTGACCGTCTCGCAGGTCTGGTTCGGCCACAGGTACTCGCAGTTCATGGGGATCTTCGAGGACCGCGCCCCCGTGCCCTTCGAGGAGGTGATCGACAAGATCAACGCCAAGGGGGTCTGCCGGTCGACGGCCAAGTACGTGCGGAACAACATGGAGAGCACGGCCTTCCACCGCGACGACCACGAGTCGGACATGGCGCTG [...]
+END;
+
+BEGIN TREES;
+	TREE tree = (AF097023_HHV1_STRAIN_HSZP:0.04227,(JN561323_HHV2_STRAIN_HG52:0.01256,AB218904_CHHV_PANTROGLODYTES:0.01731):0.03677,(DQ149153_HVP2_STRAIN_X313_PAPIOCYNOCEPHALUS:0.02354,AF533768_MHV1_STRAIN_E2490_MACACAMULATTA:0.01846):0.12475);
+END;
+
+BEGIN HYPHY;
+
+
+global GT=0.3440482174110391;
+global CT=0.4515913818364736;
+global CG=0.1482173852412455;
+global AT=0.06288186575012589;
+global AC=0.5400047332524923;
+MGMatrix1={61,61};
+MGMatrix1[0][1]:=AC*t*omega1*0.532391;
+MGMatrix1[0][2]:=t*0.413436;
+MGMatrix1[0][3]:=AT*t*omega1*0.0333855;
+MGMatrix1[0][4]:=AC*t*omega1*0.247183;
+MGMatrix1[0][8]:=t*omega1*0.177887;
+MGMatrix1[0][12]:=AT*t*omega1*0.266144;
+MGMatrix1[0][16]:=AC*t*omega1*0.23836;
+MGMatrix1[0][32]:=t*omega1*0.353264;
+MGMatrix1[1][0]:=AC*t*omega1*0.0207881;
+MGMatrix1[1][2]:=CG*t*omega1*0.413436;
+MGMatrix1[1][3]:=CT*t*0.0333855;
+MGMatrix1[1][5]:=AC*t*omega1*0.247183;
+MGMatrix1[1][9]:=t*omega1*0.177887;
+MGMatrix1[1][13]:=AT*t*omega1*0.266144;
+MGMatrix1[1][17]:=AC*t*omega1*0.23836;
+MGMatrix1[1][33]:=t*omega1*0.353264;
+MGMatrix1[1][48]:=AT*t*omega1*0.184315;
+MGMatrix1[2][0]:=t*0.0207881;
+MGMatrix1[2][1]:=CG*t*omega1*0.532391;
+MGMatrix1[2][3]:=GT*t*omega1*0.0333855;
+MGMatrix1[2][6]:=AC*t*omega1*0.247183;
+MGMatrix1[2][10]:=t*omega1*0.177887;
+MGMatrix1[2][14]:=AT*t*omega1*0.266144;
+MGMatrix1[2][18]:=AC*t*omega1*0.23836;
+MGMatrix1[2][34]:=t*omega1*0.353264;
+MGMatrix1[3][0]:=AT*t*omega1*0.0207881;
+MGMatrix1[3][1]:=CT*t*0.532391;
+MGMatrix1[3][2]:=GT*t*omega1*0.413436;
+MGMatrix1[3][7]:=AC*t*omega1*0.247183;
+MGMatrix1[3][11]:=t*omega1*0.177887;
+MGMatrix1[3][15]:=AT*t*omega1*0.266144;
+MGMatrix1[3][19]:=AC*t*omega1*0.23836;
+MGMatrix1[3][35]:=t*omega1*0.353264;
+MGMatrix1[3][49]:=AT*t*omega1*0.184315;
+MGMatrix1[4][0]:=AC*t*omega1*0.308787;
+MGMatrix1[4][5]:=AC*t*0.532391;
+MGMatrix1[4][6]:=t*0.413436;
+MGMatrix1[4][7]:=AT*t*0.0333855;
+MGMatrix1[4][8]:=CG*t*omega1*0.177887;
+MGMatrix1[4][12]:=CT*t*omega1*0.266144;
+MGMatrix1[4][20]:=AC*t*omega1*0.23836;
+MGMatrix1[4][36]:=t*omega1*0.353264;
+MGMatrix1[4][50]:=AT*t*omega1*0.184315;
+MGMatrix1[5][1]:=AC*t*omega1*0.308787;
+MGMatrix1[5][4]:=AC*t*0.0207881;
+MGMatrix1[5][6]:=CG*t*0.413436;
+MGMatrix1[5][7]:=CT*t*0.0333855;
+MGMatrix1[5][9]:=CG*t*omega1*0.177887;
+MGMatrix1[5][13]:=CT*t*omega1*0.266144;
+MGMatrix1[5][21]:=AC*t*omega1*0.23836;
+MGMatrix1[5][37]:=t*omega1*0.353264;
+MGMatrix1[5][51]:=AT*t*omega1*0.184315;
+MGMatrix1[6][2]:=AC*t*omega1*0.308787;
+MGMatrix1[6][4]:=t*0.0207881;
+MGMatrix1[6][5]:=CG*t*0.532391;
+MGMatrix1[6][7]:=GT*t*0.0333855;
+MGMatrix1[6][10]:=CG*t*omega1*0.177887;
+MGMatrix1[6][14]:=CT*t*omega1*0.266144;
+MGMatrix1[6][22]:=AC*t*omega1*0.23836;
+MGMatrix1[6][38]:=t*omega1*0.353264;
+MGMatrix1[6][52]:=AT*t*omega1*0.184315;
+MGMatrix1[7][3]:=AC*t*omega1*0.308787;
+MGMatrix1[7][4]:=AT*t*0.0207881;
+MGMatrix1[7][5]:=CT*t*0.532391;
+MGMatrix1[7][6]:=GT*t*0.413436;
+MGMatrix1[7][11]:=CG*t*omega1*0.177887;
+MGMatrix1[7][15]:=CT*t*omega1*0.266144;
+MGMatrix1[7][23]:=AC*t*omega1*0.23836;
+MGMatrix1[7][39]:=t*omega1*0.353264;
+MGMatrix1[7][53]:=AT*t*omega1*0.184315;
+MGMatrix1[8][0]:=t*omega1*0.308787;
+MGMatrix1[8][4]:=CG*t*omega1*0.247183;
+MGMatrix1[8][9]:=AC*t*omega1*0.532391;
+MGMatrix1[8][10]:=t*0.413436;
+MGMatrix1[8][11]:=AT*t*omega1*0.0333855;
+MGMatrix1[8][12]:=GT*t*omega1*0.266144;
+MGMatrix1[8][24]:=AC*t*0.23836;
+MGMatrix1[8][40]:=t*omega1*0.353264;
+MGMatrix1[9][1]:=t*omega1*0.308787;
+MGMatrix1[9][5]:=CG*t*omega1*0.247183;
+MGMatrix1[9][8]:=AC*t*omega1*0.0207881;
+MGMatrix1[9][10]:=CG*t*omega1*0.413436;
+MGMatrix1[9][11]:=CT*t*0.0333855;
+MGMatrix1[9][13]:=GT*t*omega1*0.266144;
+MGMatrix1[9][25]:=AC*t*omega1*0.23836;
+MGMatrix1[9][41]:=t*omega1*0.353264;
+MGMatrix1[9][54]:=AT*t*omega1*0.184315;
+MGMatrix1[10][2]:=t*omega1*0.308787;
+MGMatrix1[10][6]:=CG*t*omega1*0.247183;
+MGMatrix1[10][8]:=t*0.0207881;
+MGMatrix1[10][9]:=CG*t*omega1*0.532391;
+MGMatrix1[10][11]:=GT*t*omega1*0.0333855;
+MGMatrix1[10][14]:=GT*t*omega1*0.266144;
+MGMatrix1[10][26]:=AC*t*0.23836;
+MGMatrix1[10][42]:=t*omega1*0.353264;
+MGMatrix1[10][55]:=AT*t*omega1*0.184315;
+MGMatrix1[11][3]:=t*omega1*0.308787;
+MGMatrix1[11][7]:=CG*t*omega1*0.247183;
+MGMatrix1[11][8]:=AT*t*omega1*0.0207881;
+MGMatrix1[11][9]:=CT*t*0.532391;
+MGMatrix1[11][10]:=GT*t*omega1*0.413436;
+MGMatrix1[11][15]:=GT*t*omega1*0.266144;
+MGMatrix1[11][27]:=AC*t*omega1*0.23836;
+MGMatrix1[11][43]:=t*omega1*0.353264;
+MGMatrix1[11][56]:=AT*t*omega1*0.184315;
+MGMatrix1[12][0]:=AT*t*omega1*0.308787;
+MGMatrix1[12][4]:=CT*t*omega1*0.247183;
+MGMatrix1[12][8]:=GT*t*omega1*0.177887;
+MGMatrix1[12][13]:=AC*t*0.532391;
+MGMatrix1[12][14]:=t*omega1*0.413436;
+MGMatrix1[12][15]:=AT*t*0.0333855;
+MGMatrix1[12][28]:=AC*t*omega1*0.23836;
+MGMatrix1[12][44]:=t*omega1*0.353264;
+MGMatrix1[12][57]:=AT*t*omega1*0.184315;
+MGMatrix1[13][1]:=AT*t*omega1*0.308787;
+MGMatrix1[13][5]:=CT*t*omega1*0.247183;
+MGMatrix1[13][9]:=GT*t*omega1*0.177887;
+MGMatrix1[13][12]:=AC*t*0.0207881;
+MGMatrix1[13][14]:=CG*t*omega1*0.413436;
+MGMatrix1[13][15]:=CT*t*0.0333855;
+MGMatrix1[13][29]:=AC*t*omega1*0.23836;
+MGMatrix1[13][45]:=t*omega1*0.353264;
+MGMatrix1[13][58]:=AT*t*omega1*0.184315;
+MGMatrix1[14][2]:=AT*t*omega1*0.308787;
+MGMatrix1[14][6]:=CT*t*omega1*0.247183;
+MGMatrix1[14][10]:=GT*t*omega1*0.177887;
+MGMatrix1[14][12]:=t*omega1*0.0207881;
+MGMatrix1[14][13]:=CG*t*omega1*0.532391;
+MGMatrix1[14][15]:=GT*t*omega1*0.0333855;
+MGMatrix1[14][30]:=AC*t*omega1*0.23836;
+MGMatrix1[14][46]:=t*omega1*0.353264;
+MGMatrix1[14][59]:=AT*t*omega1*0.184315;
+MGMatrix1[15][3]:=AT*t*omega1*0.308787;
+MGMatrix1[15][7]:=CT*t*omega1*0.247183;
+MGMatrix1[15][11]:=GT*t*omega1*0.177887;
+MGMatrix1[15][12]:=AT*t*0.0207881;
+MGMatrix1[15][13]:=CT*t*0.532391;
+MGMatrix1[15][14]:=GT*t*omega1*0.413436;
+MGMatrix1[15][31]:=AC*t*omega1*0.23836;
+MGMatrix1[15][47]:=t*omega1*0.353264;
+MGMatrix1[15][60]:=AT*t*omega1*0.184315;
+MGMatrix1[16][0]:=AC*t*omega1*0.224061;
+MGMatrix1[16][17]:=AC*t*omega1*0.532391;
+MGMatrix1[16][18]:=t*0.413436;
+MGMatrix1[16][19]:=AT*t*omega1*0.0333855;
+MGMatrix1[16][20]:=AC*t*omega1*0.247183;
+MGMatrix1[16][24]:=t*omega1*0.177887;
+MGMatrix1[16][28]:=AT*t*omega1*0.266144;
+MGMatrix1[16][32]:=CG*t*omega1*0.353264;
+MGMatrix1[17][1]:=AC*t*omega1*0.224061;
+MGMatrix1[17][16]:=AC*t*omega1*0.0207881;
+MGMatrix1[17][18]:=CG*t*omega1*0.413436;
+MGMatrix1[17][19]:=CT*t*0.0333855;
+MGMatrix1[17][21]:=AC*t*omega1*0.247183;
+MGMatrix1[17][25]:=t*omega1*0.177887;
+MGMatrix1[17][29]:=AT*t*omega1*0.266144;
+MGMatrix1[17][33]:=CG*t*omega1*0.353264;
+MGMatrix1[17][48]:=CT*t*omega1*0.184315;
+MGMatrix1[18][2]:=AC*t*omega1*0.224061;
+MGMatrix1[18][16]:=t*0.0207881;
+MGMatrix1[18][17]:=CG*t*omega1*0.532391;
+MGMatrix1[18][19]:=GT*t*omega1*0.0333855;
+MGMatrix1[18][22]:=AC*t*omega1*0.247183;
+MGMatrix1[18][26]:=t*omega1*0.177887;
+MGMatrix1[18][30]:=AT*t*omega1*0.266144;
+MGMatrix1[18][34]:=CG*t*omega1*0.353264;
+MGMatrix1[19][3]:=AC*t*omega1*0.224061;
+MGMatrix1[19][16]:=AT*t*omega1*0.0207881;
+MGMatrix1[19][17]:=CT*t*0.532391;
+MGMatrix1[19][18]:=GT*t*omega1*0.413436;
+MGMatrix1[19][23]:=AC*t*omega1*0.247183;
+MGMatrix1[19][27]:=t*omega1*0.177887;
+MGMatrix1[19][31]:=AT*t*omega1*0.266144;
+MGMatrix1[19][35]:=CG*t*omega1*0.353264;
+MGMatrix1[19][49]:=CT*t*omega1*0.184315;
+MGMatrix1[20][4]:=AC*t*omega1*0.224061;
+MGMatrix1[20][16]:=AC*t*omega1*0.308787;
+MGMatrix1[20][21]:=AC*t*0.532391;
+MGMatrix1[20][22]:=t*0.413436;
+MGMatrix1[20][23]:=AT*t*0.0333855;
+MGMatrix1[20][24]:=CG*t*omega1*0.177887;
+MGMatrix1[20][28]:=CT*t*omega1*0.266144;
+MGMatrix1[20][36]:=CG*t*omega1*0.353264;
+MGMatrix1[20][50]:=CT*t*omega1*0.184315;
+MGMatrix1[21][5]:=AC*t*omega1*0.224061;
+MGMatrix1[21][17]:=AC*t*omega1*0.308787;
+MGMatrix1[21][20]:=AC*t*0.0207881;
+MGMatrix1[21][22]:=CG*t*0.413436;
+MGMatrix1[21][23]:=CT*t*0.0333855;
+MGMatrix1[21][25]:=CG*t*omega1*0.177887;
+MGMatrix1[21][29]:=CT*t*omega1*0.266144;
+MGMatrix1[21][37]:=CG*t*omega1*0.353264;
+MGMatrix1[21][51]:=CT*t*omega1*0.184315;
+MGMatrix1[22][6]:=AC*t*omega1*0.224061;
+MGMatrix1[22][18]:=AC*t*omega1*0.308787;
+MGMatrix1[22][20]:=t*0.0207881;
+MGMatrix1[22][21]:=CG*t*0.532391;
+MGMatrix1[22][23]:=GT*t*0.0333855;
+MGMatrix1[22][26]:=CG*t*omega1*0.177887;
+MGMatrix1[22][30]:=CT*t*omega1*0.266144;
+MGMatrix1[22][38]:=CG*t*omega1*0.353264;
+MGMatrix1[22][52]:=CT*t*omega1*0.184315;
+MGMatrix1[23][7]:=AC*t*omega1*0.224061;
+MGMatrix1[23][19]:=AC*t*omega1*0.308787;
+MGMatrix1[23][20]:=AT*t*0.0207881;
+MGMatrix1[23][21]:=CT*t*0.532391;
+MGMatrix1[23][22]:=GT*t*0.413436;
+MGMatrix1[23][27]:=CG*t*omega1*0.177887;
+MGMatrix1[23][31]:=CT*t*omega1*0.266144;
+MGMatrix1[23][39]:=CG*t*omega1*0.353264;
+MGMatrix1[23][53]:=CT*t*omega1*0.184315;
+MGMatrix1[24][8]:=AC*t*0.224061;
+MGMatrix1[24][16]:=t*omega1*0.308787;
+MGMatrix1[24][20]:=CG*t*omega1*0.247183;
+MGMatrix1[24][25]:=AC*t*0.532391;
+MGMatrix1[24][26]:=t*0.413436;
+MGMatrix1[24][27]:=AT*t*0.0333855;
+MGMatrix1[24][28]:=GT*t*omega1*0.266144;
+MGMatrix1[24][40]:=CG*t*omega1*0.353264;
+MGMatrix1[25][9]:=AC*t*omega1*0.224061;
+MGMatrix1[25][17]:=t*omega1*0.308787;
+MGMatrix1[25][21]:=CG*t*omega1*0.247183;
+MGMatrix1[25][24]:=AC*t*0.0207881;
+MGMatrix1[25][26]:=CG*t*0.413436;
+MGMatrix1[25][27]:=CT*t*0.0333855;
+MGMatrix1[25][29]:=GT*t*omega1*0.266144;
+MGMatrix1[25][41]:=CG*t*omega1*0.353264;
+MGMatrix1[25][54]:=CT*t*omega1*0.184315;
+MGMatrix1[26][10]:=AC*t*0.224061;
+MGMatrix1[26][18]:=t*omega1*0.308787;
+MGMatrix1[26][22]:=CG*t*omega1*0.247183;
+MGMatrix1[26][24]:=t*0.0207881;
+MGMatrix1[26][25]:=CG*t*0.532391;
+MGMatrix1[26][27]:=GT*t*0.0333855;
+MGMatrix1[26][30]:=GT*t*omega1*0.266144;
+MGMatrix1[26][42]:=CG*t*omega1*0.353264;
+MGMatrix1[26][55]:=CT*t*omega1*0.184315;
+MGMatrix1[27][11]:=AC*t*omega1*0.224061;
+MGMatrix1[27][19]:=t*omega1*0.308787;
+MGMatrix1[27][23]:=CG*t*omega1*0.247183;
+MGMatrix1[27][24]:=AT*t*0.0207881;
+MGMatrix1[27][25]:=CT*t*0.532391;
+MGMatrix1[27][26]:=GT*t*0.413436;
+MGMatrix1[27][31]:=GT*t*omega1*0.266144;
+MGMatrix1[27][43]:=CG*t*omega1*0.353264;
+MGMatrix1[27][56]:=CT*t*omega1*0.184315;
+MGMatrix1[28][12]:=AC*t*omega1*0.224061;
+MGMatrix1[28][16]:=AT*t*omega1*0.308787;
+MGMatrix1[28][20]:=CT*t*omega1*0.247183;
+MGMatrix1[28][24]:=GT*t*omega1*0.177887;
+MGMatrix1[28][29]:=AC*t*0.532391;
+MGMatrix1[28][30]:=t*0.413436;
+MGMatrix1[28][31]:=AT*t*0.0333855;
+MGMatrix1[28][44]:=CG*t*omega1*0.353264;
+MGMatrix1[28][57]:=CT*t*0.184315;
+MGMatrix1[29][13]:=AC*t*omega1*0.224061;
+MGMatrix1[29][17]:=AT*t*omega1*0.308787;
+MGMatrix1[29][21]:=CT*t*omega1*0.247183;
+MGMatrix1[29][25]:=GT*t*omega1*0.177887;
+MGMatrix1[29][28]:=AC*t*0.0207881;
+MGMatrix1[29][30]:=CG*t*0.413436;
+MGMatrix1[29][31]:=CT*t*0.0333855;
+MGMatrix1[29][45]:=CG*t*omega1*0.353264;
+MGMatrix1[29][58]:=CT*t*omega1*0.184315;
+MGMatrix1[30][14]:=AC*t*omega1*0.224061;
+MGMatrix1[30][18]:=AT*t*omega1*0.308787;
+MGMatrix1[30][22]:=CT*t*omega1*0.247183;
+MGMatrix1[30][26]:=GT*t*omega1*0.177887;
+MGMatrix1[30][28]:=t*0.0207881;
+MGMatrix1[30][29]:=CG*t*0.532391;
+MGMatrix1[30][31]:=GT*t*0.0333855;
+MGMatrix1[30][46]:=CG*t*omega1*0.353264;
+MGMatrix1[30][59]:=CT*t*0.184315;
+MGMatrix1[31][15]:=AC*t*omega1*0.224061;
+MGMatrix1[31][19]:=AT*t*omega1*0.308787;
+MGMatrix1[31][23]:=CT*t*omega1*0.247183;
+MGMatrix1[31][27]:=GT*t*omega1*0.177887;
+MGMatrix1[31][28]:=AT*t*0.0207881;
+MGMatrix1[31][29]:=CT*t*0.532391;
+MGMatrix1[31][30]:=GT*t*0.413436;
+MGMatrix1[31][47]:=CG*t*omega1*0.353264;
+MGMatrix1[31][60]:=CT*t*omega1*0.184315;
+MGMatrix1[32][0]:=t*omega1*0.224061;
+MGMatrix1[32][16]:=CG*t*omega1*0.23836;
+MGMatrix1[32][33]:=AC*t*omega1*0.532391;
+MGMatrix1[32][34]:=t*0.413436;
+MGMatrix1[32][35]:=AT*t*omega1*0.0333855;
+MGMatrix1[32][36]:=AC*t*omega1*0.247183;
+MGMatrix1[32][40]:=t*omega1*0.177887;
+MGMatrix1[32][44]:=AT*t*omega1*0.266144;
+MGMatrix1[33][1]:=t*omega1*0.224061;
+MGMatrix1[33][17]:=CG*t*omega1*0.23836;
+MGMatrix1[33][32]:=AC*t*omega1*0.0207881;
+MGMatrix1[33][34]:=CG*t*omega1*0.413436;
+MGMatrix1[33][35]:=CT*t*0.0333855;
+MGMatrix1[33][37]:=AC*t*omega1*0.247183;
+MGMatrix1[33][41]:=t*omega1*0.177887;
+MGMatrix1[33][45]:=AT*t*omega1*0.266144;
+MGMatrix1[33][48]:=GT*t*omega1*0.184315;
+MGMatrix1[34][2]:=t*omega1*0.224061;
+MGMatrix1[34][18]:=CG*t*omega1*0.23836;
+MGMatrix1[34][32]:=t*0.0207881;
+MGMatrix1[34][33]:=CG*t*omega1*0.532391;
+MGMatrix1[34][35]:=GT*t*omega1*0.0333855;
+MGMatrix1[34][38]:=AC*t*omega1*0.247183;
+MGMatrix1[34][42]:=t*omega1*0.177887;
+MGMatrix1[34][46]:=AT*t*omega1*0.266144;
+MGMatrix1[35][3]:=t*omega1*0.224061;
+MGMatrix1[35][19]:=CG*t*omega1*0.23836;
+MGMatrix1[35][32]:=AT*t*omega1*0.0207881;
+MGMatrix1[35][33]:=CT*t*0.532391;
+MGMatrix1[35][34]:=GT*t*omega1*0.413436;
+MGMatrix1[35][39]:=AC*t*omega1*0.247183;
+MGMatrix1[35][43]:=t*omega1*0.177887;
+MGMatrix1[35][47]:=AT*t*omega1*0.266144;
+MGMatrix1[35][49]:=GT*t*omega1*0.184315;
+MGMatrix1[36][4]:=t*omega1*0.224061;
+MGMatrix1[36][20]:=CG*t*omega1*0.23836;
+MGMatrix1[36][32]:=AC*t*omega1*0.308787;
+MGMatrix1[36][37]:=AC*t*0.532391;
+MGMatrix1[36][38]:=t*0.413436;
+MGMatrix1[36][39]:=AT*t*0.0333855;
+MGMatrix1[36][40]:=CG*t*omega1*0.177887;
+MGMatrix1[36][44]:=CT*t*omega1*0.266144;
+MGMatrix1[36][50]:=GT*t*omega1*0.184315;
+MGMatrix1[37][5]:=t*omega1*0.224061;
+MGMatrix1[37][21]:=CG*t*omega1*0.23836;
+MGMatrix1[37][33]:=AC*t*omega1*0.308787;
+MGMatrix1[37][36]:=AC*t*0.0207881;
+MGMatrix1[37][38]:=CG*t*0.413436;
+MGMatrix1[37][39]:=CT*t*0.0333855;
+MGMatrix1[37][41]:=CG*t*omega1*0.177887;
+MGMatrix1[37][45]:=CT*t*omega1*0.266144;
+MGMatrix1[37][51]:=GT*t*omega1*0.184315;
+MGMatrix1[38][6]:=t*omega1*0.224061;
+MGMatrix1[38][22]:=CG*t*omega1*0.23836;
+MGMatrix1[38][34]:=AC*t*omega1*0.308787;
+MGMatrix1[38][36]:=t*0.0207881;
+MGMatrix1[38][37]:=CG*t*0.532391;
+MGMatrix1[38][39]:=GT*t*0.0333855;
+MGMatrix1[38][42]:=CG*t*omega1*0.177887;
+MGMatrix1[38][46]:=CT*t*omega1*0.266144;
+MGMatrix1[38][52]:=GT*t*omega1*0.184315;
+MGMatrix1[39][7]:=t*omega1*0.224061;
+MGMatrix1[39][23]:=CG*t*omega1*0.23836;
+MGMatrix1[39][35]:=AC*t*omega1*0.308787;
+MGMatrix1[39][36]:=AT*t*0.0207881;
+MGMatrix1[39][37]:=CT*t*0.532391;
+MGMatrix1[39][38]:=GT*t*0.413436;
+MGMatrix1[39][43]:=CG*t*omega1*0.177887;
+MGMatrix1[39][47]:=CT*t*omega1*0.266144;
+MGMatrix1[39][53]:=GT*t*omega1*0.184315;
+MGMatrix1[40][8]:=t*omega1*0.224061;
+MGMatrix1[40][24]:=CG*t*omega1*0.23836;
+MGMatrix1[40][32]:=t*omega1*0.308787;
+MGMatrix1[40][36]:=CG*t*omega1*0.247183;
+MGMatrix1[40][41]:=AC*t*0.532391;
+MGMatrix1[40][42]:=t*0.413436;
+MGMatrix1[40][43]:=AT*t*0.0333855;
+MGMatrix1[40][44]:=GT*t*omega1*0.266144;
+MGMatrix1[41][9]:=t*omega1*0.224061;
+MGMatrix1[41][25]:=CG*t*omega1*0.23836;
+MGMatrix1[41][33]:=t*omega1*0.308787;
+MGMatrix1[41][37]:=CG*t*omega1*0.247183;
+MGMatrix1[41][40]:=AC*t*0.0207881;
+MGMatrix1[41][42]:=CG*t*0.413436;
+MGMatrix1[41][43]:=CT*t*0.0333855;
+MGMatrix1[41][45]:=GT*t*omega1*0.266144;
+MGMatrix1[41][54]:=GT*t*omega1*0.184315;
+MGMatrix1[42][10]:=t*omega1*0.224061;
+MGMatrix1[42][26]:=CG*t*omega1*0.23836;
+MGMatrix1[42][34]:=t*omega1*0.308787;
+MGMatrix1[42][38]:=CG*t*omega1*0.247183;
+MGMatrix1[42][40]:=t*0.0207881;
+MGMatrix1[42][41]:=CG*t*0.532391;
+MGMatrix1[42][43]:=GT*t*0.0333855;
+MGMatrix1[42][46]:=GT*t*omega1*0.266144;
+MGMatrix1[42][55]:=GT*t*omega1*0.184315;
+MGMatrix1[43][11]:=t*omega1*0.224061;
+MGMatrix1[43][27]:=CG*t*omega1*0.23836;
+MGMatrix1[43][35]:=t*omega1*0.308787;
+MGMatrix1[43][39]:=CG*t*omega1*0.247183;
+MGMatrix1[43][40]:=AT*t*0.0207881;
+MGMatrix1[43][41]:=CT*t*0.532391;
+MGMatrix1[43][42]:=GT*t*0.413436;
+MGMatrix1[43][47]:=GT*t*omega1*0.266144;
+MGMatrix1[43][56]:=GT*t*omega1*0.184315;
+MGMatrix1[44][12]:=t*omega1*0.224061;
+MGMatrix1[44][28]:=CG*t*omega1*0.23836;
+MGMatrix1[44][32]:=AT*t*omega1*0.308787;
+MGMatrix1[44][36]:=CT*t*omega1*0.247183;
+MGMatrix1[44][40]:=GT*t*omega1*0.177887;
+MGMatrix1[44][45]:=AC*t*0.532391;
+MGMatrix1[44][46]:=t*0.413436;
+MGMatrix1[44][47]:=AT*t*0.0333855;
+MGMatrix1[44][57]:=GT*t*omega1*0.184315;
+MGMatrix1[45][13]:=t*omega1*0.224061;
+MGMatrix1[45][29]:=CG*t*omega1*0.23836;
+MGMatrix1[45][33]:=AT*t*omega1*0.308787;
+MGMatrix1[45][37]:=CT*t*omega1*0.247183;
+MGMatrix1[45][41]:=GT*t*omega1*0.177887;
+MGMatrix1[45][44]:=AC*t*0.0207881;
+MGMatrix1[45][46]:=CG*t*0.413436;
+MGMatrix1[45][47]:=CT*t*0.0333855;
+MGMatrix1[45][58]:=GT*t*omega1*0.184315;
+MGMatrix1[46][14]:=t*omega1*0.224061;
+MGMatrix1[46][30]:=CG*t*omega1*0.23836;
+MGMatrix1[46][34]:=AT*t*omega1*0.308787;
+MGMatrix1[46][38]:=CT*t*omega1*0.247183;
+MGMatrix1[46][42]:=GT*t*omega1*0.177887;
+MGMatrix1[46][44]:=t*0.0207881;
+MGMatrix1[46][45]:=CG*t*0.532391;
+MGMatrix1[46][47]:=GT*t*0.0333855;
+MGMatrix1[46][59]:=GT*t*omega1*0.184315;
+MGMatrix1[47][15]:=t*omega1*0.224061;
+MGMatrix1[47][31]:=CG*t*omega1*0.23836;
+MGMatrix1[47][35]:=AT*t*omega1*0.308787;
+MGMatrix1[47][39]:=CT*t*omega1*0.247183;
+MGMatrix1[47][43]:=GT*t*omega1*0.177887;
+MGMatrix1[47][44]:=AT*t*0.0207881;
+MGMatrix1[47][45]:=CT*t*0.532391;
+MGMatrix1[47][46]:=GT*t*0.413436;
+MGMatrix1[47][60]:=GT*t*omega1*0.184315;
+MGMatrix1[48][1]:=AT*t*omega1*0.224061;
+MGMatrix1[48][17]:=CT*t*omega1*0.23836;
+MGMatrix1[48][33]:=GT*t*omega1*0.353264;
+MGMatrix1[48][49]:=CT*t*0.0333855;
+MGMatrix1[48][51]:=AC*t*omega1*0.247183;
+MGMatrix1[48][54]:=t*omega1*0.177887;
+MGMatrix1[48][58]:=AT*t*omega1*0.266144;
+MGMatrix1[49][3]:=AT*t*omega1*0.224061;
+MGMatrix1[49][19]:=CT*t*omega1*0.23836;
+MGMatrix1[49][35]:=GT*t*omega1*0.353264;
+MGMatrix1[49][48]:=CT*t*0.532391;
+MGMatrix1[49][53]:=AC*t*omega1*0.247183;
+MGMatrix1[49][56]:=t*omega1*0.177887;
+MGMatrix1[49][60]:=AT*t*omega1*0.266144;
+MGMatrix1[50][4]:=AT*t*omega1*0.224061;
+MGMatrix1[50][20]:=CT*t*omega1*0.23836;
+MGMatrix1[50][36]:=GT*t*omega1*0.353264;
+MGMatrix1[50][51]:=AC*t*0.532391;
+MGMatrix1[50][52]:=t*0.413436;
+MGMatrix1[50][53]:=AT*t*0.0333855;
+MGMatrix1[50][57]:=CT*t*omega1*0.266144;
+MGMatrix1[51][5]:=AT*t*omega1*0.224061;
+MGMatrix1[51][21]:=CT*t*omega1*0.23836;
+MGMatrix1[51][37]:=GT*t*omega1*0.353264;
+MGMatrix1[51][48]:=AC*t*omega1*0.308787;
+MGMatrix1[51][50]:=AC*t*0.0207881;
+MGMatrix1[51][52]:=CG*t*0.413436;
+MGMatrix1[51][53]:=CT*t*0.0333855;
+MGMatrix1[51][54]:=CG*t*omega1*0.177887;
+MGMatrix1[51][58]:=CT*t*omega1*0.266144;
+MGMatrix1[52][6]:=AT*t*omega1*0.224061;
+MGMatrix1[52][22]:=CT*t*omega1*0.23836;
+MGMatrix1[52][38]:=GT*t*omega1*0.353264;
+MGMatrix1[52][50]:=t*0.0207881;
+MGMatrix1[52][51]:=CG*t*0.532391;
+MGMatrix1[52][53]:=GT*t*0.0333855;
+MGMatrix1[52][55]:=CG*t*omega1*0.177887;
+MGMatrix1[52][59]:=CT*t*omega1*0.266144;
+MGMatrix1[53][7]:=AT*t*omega1*0.224061;
+MGMatrix1[53][23]:=CT*t*omega1*0.23836;
+MGMatrix1[53][39]:=GT*t*omega1*0.353264;
+MGMatrix1[53][49]:=AC*t*omega1*0.308787;
+MGMatrix1[53][50]:=AT*t*0.0207881;
+MGMatrix1[53][51]:=CT*t*0.532391;
+MGMatrix1[53][52]:=GT*t*0.413436;
+MGMatrix1[53][56]:=CG*t*omega1*0.177887;
+MGMatrix1[53][60]:=CT*t*omega1*0.266144;
+MGMatrix1[54][9]:=AT*t*omega1*0.224061;
+MGMatrix1[54][25]:=CT*t*omega1*0.23836;
+MGMatrix1[54][41]:=GT*t*omega1*0.353264;
+MGMatrix1[54][48]:=t*omega1*0.308787;
+MGMatrix1[54][51]:=CG*t*omega1*0.247183;
+MGMatrix1[54][55]:=CG*t*omega1*0.413436;
+MGMatrix1[54][56]:=CT*t*0.0333855;
+MGMatrix1[54][58]:=GT*t*omega1*0.266144;
+MGMatrix1[55][10]:=AT*t*omega1*0.224061;
+MGMatrix1[55][26]:=CT*t*omega1*0.23836;
+MGMatrix1[55][42]:=GT*t*omega1*0.353264;
+MGMatrix1[55][52]:=CG*t*omega1*0.247183;
+MGMatrix1[55][54]:=CG*t*omega1*0.532391;
+MGMatrix1[55][56]:=GT*t*omega1*0.0333855;
+MGMatrix1[55][59]:=GT*t*omega1*0.266144;
+MGMatrix1[56][11]:=AT*t*omega1*0.224061;
+MGMatrix1[56][27]:=CT*t*omega1*0.23836;
+MGMatrix1[56][43]:=GT*t*omega1*0.353264;
+MGMatrix1[56][49]:=t*omega1*0.308787;
+MGMatrix1[56][53]:=CG*t*omega1*0.247183;
+MGMatrix1[56][54]:=CT*t*0.532391;
+MGMatrix1[56][55]:=GT*t*omega1*0.413436;
+MGMatrix1[56][60]:=GT*t*omega1*0.266144;
+MGMatrix1[57][12]:=AT*t*omega1*0.224061;
+MGMatrix1[57][28]:=CT*t*0.23836;
+MGMatrix1[57][44]:=GT*t*omega1*0.353264;
+MGMatrix1[57][50]:=CT*t*omega1*0.247183;
+MGMatrix1[57][58]:=AC*t*omega1*0.532391;
+MGMatrix1[57][59]:=t*0.413436;
+MGMatrix1[57][60]:=AT*t*omega1*0.0333855;
+MGMatrix1[58][13]:=AT*t*omega1*0.224061;
+MGMatrix1[58][29]:=CT*t*omega1*0.23836;
+MGMatrix1[58][45]:=GT*t*omega1*0.353264;
+MGMatrix1[58][48]:=AT*t*omega1*0.308787;
+MGMatrix1[58][51]:=CT*t*omega1*0.247183;
+MGMatrix1[58][54]:=GT*t*omega1*0.177887;
+MGMatrix1[58][57]:=AC*t*omega1*0.0207881;
+MGMatrix1[58][59]:=CG*t*omega1*0.413436;
+MGMatrix1[58][60]:=CT*t*0.0333855;
+MGMatrix1[59][14]:=AT*t*omega1*0.224061;
+MGMatrix1[59][30]:=CT*t*0.23836;
+MGMatrix1[59][46]:=GT*t*omega1*0.353264;
+MGMatrix1[59][52]:=CT*t*omega1*0.247183;
+MGMatrix1[59][55]:=GT*t*omega1*0.177887;
+MGMatrix1[59][57]:=t*0.0207881;
+MGMatrix1[59][58]:=CG*t*omega1*0.532391;
+MGMatrix1[59][60]:=GT*t*omega1*0.0333855;
+MGMatrix1[60][15]:=AT*t*omega1*0.224061;
+MGMatrix1[60][31]:=CT*t*omega1*0.23836;
+MGMatrix1[60][47]:=GT*t*omega1*0.353264;
+MGMatrix1[60][49]:=AT*t*omega1*0.308787;
+MGMatrix1[60][53]:=CT*t*omega1*0.247183;
+MGMatrix1[60][56]:=GT*t*omega1*0.177887;
+MGMatrix1[60][57]:=AT*t*omega1*0.0207881;
+MGMatrix1[60][58]:=CT*t*0.532391;
+MGMatrix1[60][59]:=GT*t*omega1*0.413436;
+
+
+MGMatrix2={61,61};
+MGMatrix2[0][1]:=AC*t*omega2*0.532391;
+MGMatrix2[0][2]:=t*0.413436;
+MGMatrix2[0][3]:=AT*t*omega2*0.0333855;
+MGMatrix2[0][4]:=AC*t*omega2*0.247183;
+MGMatrix2[0][8]:=t*omega2*0.177887;
+MGMatrix2[0][12]:=AT*t*omega2*0.266144;
+MGMatrix2[0][16]:=AC*t*omega2*0.23836;
+MGMatrix2[0][32]:=t*omega2*0.353264;
+MGMatrix2[1][0]:=AC*t*omega2*0.0207881;
+MGMatrix2[1][2]:=CG*t*omega2*0.413436;
+MGMatrix2[1][3]:=CT*t*0.0333855;
+MGMatrix2[1][5]:=AC*t*omega2*0.247183;
+MGMatrix2[1][9]:=t*omega2*0.177887;
+MGMatrix2[1][13]:=AT*t*omega2*0.266144;
+MGMatrix2[1][17]:=AC*t*omega2*0.23836;
+MGMatrix2[1][33]:=t*omega2*0.353264;
+MGMatrix2[1][48]:=AT*t*omega2*0.184315;
+MGMatrix2[2][0]:=t*0.0207881;
+MGMatrix2[2][1]:=CG*t*omega2*0.532391;
+MGMatrix2[2][3]:=GT*t*omega2*0.0333855;
+MGMatrix2[2][6]:=AC*t*omega2*0.247183;
+MGMatrix2[2][10]:=t*omega2*0.177887;
+MGMatrix2[2][14]:=AT*t*omega2*0.266144;
+MGMatrix2[2][18]:=AC*t*omega2*0.23836;
+MGMatrix2[2][34]:=t*omega2*0.353264;
+MGMatrix2[3][0]:=AT*t*omega2*0.0207881;
+MGMatrix2[3][1]:=CT*t*0.532391;
+MGMatrix2[3][2]:=GT*t*omega2*0.413436;
+MGMatrix2[3][7]:=AC*t*omega2*0.247183;
+MGMatrix2[3][11]:=t*omega2*0.177887;
+MGMatrix2[3][15]:=AT*t*omega2*0.266144;
+MGMatrix2[3][19]:=AC*t*omega2*0.23836;
+MGMatrix2[3][35]:=t*omega2*0.353264;
+MGMatrix2[3][49]:=AT*t*omega2*0.184315;
+MGMatrix2[4][0]:=AC*t*omega2*0.308787;
+MGMatrix2[4][5]:=AC*t*0.532391;
+MGMatrix2[4][6]:=t*0.413436;
+MGMatrix2[4][7]:=AT*t*0.0333855;
+MGMatrix2[4][8]:=CG*t*omega2*0.177887;
+MGMatrix2[4][12]:=CT*t*omega2*0.266144;
+MGMatrix2[4][20]:=AC*t*omega2*0.23836;
+MGMatrix2[4][36]:=t*omega2*0.353264;
+MGMatrix2[4][50]:=AT*t*omega2*0.184315;
+MGMatrix2[5][1]:=AC*t*omega2*0.308787;
+MGMatrix2[5][4]:=AC*t*0.0207881;
+MGMatrix2[5][6]:=CG*t*0.413436;
+MGMatrix2[5][7]:=CT*t*0.0333855;
+MGMatrix2[5][9]:=CG*t*omega2*0.177887;
+MGMatrix2[5][13]:=CT*t*omega2*0.266144;
+MGMatrix2[5][21]:=AC*t*omega2*0.23836;
+MGMatrix2[5][37]:=t*omega2*0.353264;
+MGMatrix2[5][51]:=AT*t*omega2*0.184315;
+MGMatrix2[6][2]:=AC*t*omega2*0.308787;
+MGMatrix2[6][4]:=t*0.0207881;
+MGMatrix2[6][5]:=CG*t*0.532391;
+MGMatrix2[6][7]:=GT*t*0.0333855;
+MGMatrix2[6][10]:=CG*t*omega2*0.177887;
+MGMatrix2[6][14]:=CT*t*omega2*0.266144;
+MGMatrix2[6][22]:=AC*t*omega2*0.23836;
+MGMatrix2[6][38]:=t*omega2*0.353264;
+MGMatrix2[6][52]:=AT*t*omega2*0.184315;
+MGMatrix2[7][3]:=AC*t*omega2*0.308787;
+MGMatrix2[7][4]:=AT*t*0.0207881;
+MGMatrix2[7][5]:=CT*t*0.532391;
+MGMatrix2[7][6]:=GT*t*0.413436;
+MGMatrix2[7][11]:=CG*t*omega2*0.177887;
+MGMatrix2[7][15]:=CT*t*omega2*0.266144;
+MGMatrix2[7][23]:=AC*t*omega2*0.23836;
+MGMatrix2[7][39]:=t*omega2*0.353264;
+MGMatrix2[7][53]:=AT*t*omega2*0.184315;
+MGMatrix2[8][0]:=t*omega2*0.308787;
+MGMatrix2[8][4]:=CG*t*omega2*0.247183;
+MGMatrix2[8][9]:=AC*t*omega2*0.532391;
+MGMatrix2[8][10]:=t*0.413436;
+MGMatrix2[8][11]:=AT*t*omega2*0.0333855;
+MGMatrix2[8][12]:=GT*t*omega2*0.266144;
+MGMatrix2[8][24]:=AC*t*0.23836;
+MGMatrix2[8][40]:=t*omega2*0.353264;
+MGMatrix2[9][1]:=t*omega2*0.308787;
+MGMatrix2[9][5]:=CG*t*omega2*0.247183;
+MGMatrix2[9][8]:=AC*t*omega2*0.0207881;
+MGMatrix2[9][10]:=CG*t*omega2*0.413436;
+MGMatrix2[9][11]:=CT*t*0.0333855;
+MGMatrix2[9][13]:=GT*t*omega2*0.266144;
+MGMatrix2[9][25]:=AC*t*omega2*0.23836;
+MGMatrix2[9][41]:=t*omega2*0.353264;
+MGMatrix2[9][54]:=AT*t*omega2*0.184315;
+MGMatrix2[10][2]:=t*omega2*0.308787;
+MGMatrix2[10][6]:=CG*t*omega2*0.247183;
+MGMatrix2[10][8]:=t*0.0207881;
+MGMatrix2[10][9]:=CG*t*omega2*0.532391;
+MGMatrix2[10][11]:=GT*t*omega2*0.0333855;
+MGMatrix2[10][14]:=GT*t*omega2*0.266144;
+MGMatrix2[10][26]:=AC*t*0.23836;
+MGMatrix2[10][42]:=t*omega2*0.353264;
+MGMatrix2[10][55]:=AT*t*omega2*0.184315;
+MGMatrix2[11][3]:=t*omega2*0.308787;
+MGMatrix2[11][7]:=CG*t*omega2*0.247183;
+MGMatrix2[11][8]:=AT*t*omega2*0.0207881;
+MGMatrix2[11][9]:=CT*t*0.532391;
+MGMatrix2[11][10]:=GT*t*omega2*0.413436;
+MGMatrix2[11][15]:=GT*t*omega2*0.266144;
+MGMatrix2[11][27]:=AC*t*omega2*0.23836;
+MGMatrix2[11][43]:=t*omega2*0.353264;
+MGMatrix2[11][56]:=AT*t*omega2*0.184315;
+MGMatrix2[12][0]:=AT*t*omega2*0.308787;
+MGMatrix2[12][4]:=CT*t*omega2*0.247183;
+MGMatrix2[12][8]:=GT*t*omega2*0.177887;
+MGMatrix2[12][13]:=AC*t*0.532391;
+MGMatrix2[12][14]:=t*omega2*0.413436;
+MGMatrix2[12][15]:=AT*t*0.0333855;
+MGMatrix2[12][28]:=AC*t*omega2*0.23836;
+MGMatrix2[12][44]:=t*omega2*0.353264;
+MGMatrix2[12][57]:=AT*t*omega2*0.184315;
+MGMatrix2[13][1]:=AT*t*omega2*0.308787;
+MGMatrix2[13][5]:=CT*t*omega2*0.247183;
+MGMatrix2[13][9]:=GT*t*omega2*0.177887;
+MGMatrix2[13][12]:=AC*t*0.0207881;
+MGMatrix2[13][14]:=CG*t*omega2*0.413436;
+MGMatrix2[13][15]:=CT*t*0.0333855;
+MGMatrix2[13][29]:=AC*t*omega2*0.23836;
+MGMatrix2[13][45]:=t*omega2*0.353264;
+MGMatrix2[13][58]:=AT*t*omega2*0.184315;
+MGMatrix2[14][2]:=AT*t*omega2*0.308787;
+MGMatrix2[14][6]:=CT*t*omega2*0.247183;
+MGMatrix2[14][10]:=GT*t*omega2*0.177887;
+MGMatrix2[14][12]:=t*omega2*0.0207881;
+MGMatrix2[14][13]:=CG*t*omega2*0.532391;
+MGMatrix2[14][15]:=GT*t*omega2*0.0333855;
+MGMatrix2[14][30]:=AC*t*omega2*0.23836;
+MGMatrix2[14][46]:=t*omega2*0.353264;
+MGMatrix2[14][59]:=AT*t*omega2*0.184315;
+MGMatrix2[15][3]:=AT*t*omega2*0.308787;
+MGMatrix2[15][7]:=CT*t*omega2*0.247183;
+MGMatrix2[15][11]:=GT*t*omega2*0.177887;
+MGMatrix2[15][12]:=AT*t*0.0207881;
+MGMatrix2[15][13]:=CT*t*0.532391;
+MGMatrix2[15][14]:=GT*t*omega2*0.413436;
+MGMatrix2[15][31]:=AC*t*omega2*0.23836;
+MGMatrix2[15][47]:=t*omega2*0.353264;
+MGMatrix2[15][60]:=AT*t*omega2*0.184315;
+MGMatrix2[16][0]:=AC*t*omega2*0.224061;
+MGMatrix2[16][17]:=AC*t*omega2*0.532391;
+MGMatrix2[16][18]:=t*0.413436;
+MGMatrix2[16][19]:=AT*t*omega2*0.0333855;
+MGMatrix2[16][20]:=AC*t*omega2*0.247183;
+MGMatrix2[16][24]:=t*omega2*0.177887;
+MGMatrix2[16][28]:=AT*t*omega2*0.266144;
+MGMatrix2[16][32]:=CG*t*omega2*0.353264;
+MGMatrix2[17][1]:=AC*t*omega2*0.224061;
+MGMatrix2[17][16]:=AC*t*omega2*0.0207881;
+MGMatrix2[17][18]:=CG*t*omega2*0.413436;
+MGMatrix2[17][19]:=CT*t*0.0333855;
+MGMatrix2[17][21]:=AC*t*omega2*0.247183;
+MGMatrix2[17][25]:=t*omega2*0.177887;
+MGMatrix2[17][29]:=AT*t*omega2*0.266144;
+MGMatrix2[17][33]:=CG*t*omega2*0.353264;
+MGMatrix2[17][48]:=CT*t*omega2*0.184315;
+MGMatrix2[18][2]:=AC*t*omega2*0.224061;
+MGMatrix2[18][16]:=t*0.0207881;
+MGMatrix2[18][17]:=CG*t*omega2*0.532391;
+MGMatrix2[18][19]:=GT*t*omega2*0.0333855;
+MGMatrix2[18][22]:=AC*t*omega2*0.247183;
+MGMatrix2[18][26]:=t*omega2*0.177887;
+MGMatrix2[18][30]:=AT*t*omega2*0.266144;
+MGMatrix2[18][34]:=CG*t*omega2*0.353264;
+MGMatrix2[19][3]:=AC*t*omega2*0.224061;
+MGMatrix2[19][16]:=AT*t*omega2*0.0207881;
+MGMatrix2[19][17]:=CT*t*0.532391;
+MGMatrix2[19][18]:=GT*t*omega2*0.413436;
+MGMatrix2[19][23]:=AC*t*omega2*0.247183;
+MGMatrix2[19][27]:=t*omega2*0.177887;
+MGMatrix2[19][31]:=AT*t*omega2*0.266144;
+MGMatrix2[19][35]:=CG*t*omega2*0.353264;
+MGMatrix2[19][49]:=CT*t*omega2*0.184315;
+MGMatrix2[20][4]:=AC*t*omega2*0.224061;
+MGMatrix2[20][16]:=AC*t*omega2*0.308787;
+MGMatrix2[20][21]:=AC*t*0.532391;
+MGMatrix2[20][22]:=t*0.413436;
+MGMatrix2[20][23]:=AT*t*0.0333855;
+MGMatrix2[20][24]:=CG*t*omega2*0.177887;
+MGMatrix2[20][28]:=CT*t*omega2*0.266144;
+MGMatrix2[20][36]:=CG*t*omega2*0.353264;
+MGMatrix2[20][50]:=CT*t*omega2*0.184315;
+MGMatrix2[21][5]:=AC*t*omega2*0.224061;
+MGMatrix2[21][17]:=AC*t*omega2*0.308787;
+MGMatrix2[21][20]:=AC*t*0.0207881;
+MGMatrix2[21][22]:=CG*t*0.413436;
+MGMatrix2[21][23]:=CT*t*0.0333855;
+MGMatrix2[21][25]:=CG*t*omega2*0.177887;
+MGMatrix2[21][29]:=CT*t*omega2*0.266144;
+MGMatrix2[21][37]:=CG*t*omega2*0.353264;
+MGMatrix2[21][51]:=CT*t*omega2*0.184315;
+MGMatrix2[22][6]:=AC*t*omega2*0.224061;
+MGMatrix2[22][18]:=AC*t*omega2*0.308787;
+MGMatrix2[22][20]:=t*0.0207881;
+MGMatrix2[22][21]:=CG*t*0.532391;
+MGMatrix2[22][23]:=GT*t*0.0333855;
+MGMatrix2[22][26]:=CG*t*omega2*0.177887;
+MGMatrix2[22][30]:=CT*t*omega2*0.266144;
+MGMatrix2[22][38]:=CG*t*omega2*0.353264;
+MGMatrix2[22][52]:=CT*t*omega2*0.184315;
+MGMatrix2[23][7]:=AC*t*omega2*0.224061;
+MGMatrix2[23][19]:=AC*t*omega2*0.308787;
+MGMatrix2[23][20]:=AT*t*0.0207881;
+MGMatrix2[23][21]:=CT*t*0.532391;
+MGMatrix2[23][22]:=GT*t*0.413436;
+MGMatrix2[23][27]:=CG*t*omega2*0.177887;
+MGMatrix2[23][31]:=CT*t*omega2*0.266144;
+MGMatrix2[23][39]:=CG*t*omega2*0.353264;
+MGMatrix2[23][53]:=CT*t*omega2*0.184315;
+MGMatrix2[24][8]:=AC*t*0.224061;
+MGMatrix2[24][16]:=t*omega2*0.308787;
+MGMatrix2[24][20]:=CG*t*omega2*0.247183;
+MGMatrix2[24][25]:=AC*t*0.532391;
+MGMatrix2[24][26]:=t*0.413436;
+MGMatrix2[24][27]:=AT*t*0.0333855;
+MGMatrix2[24][28]:=GT*t*omega2*0.266144;
+MGMatrix2[24][40]:=CG*t*omega2*0.353264;
+MGMatrix2[25][9]:=AC*t*omega2*0.224061;
+MGMatrix2[25][17]:=t*omega2*0.308787;
+MGMatrix2[25][21]:=CG*t*omega2*0.247183;
+MGMatrix2[25][24]:=AC*t*0.0207881;
+MGMatrix2[25][26]:=CG*t*0.413436;
+MGMatrix2[25][27]:=CT*t*0.0333855;
+MGMatrix2[25][29]:=GT*t*omega2*0.266144;
+MGMatrix2[25][41]:=CG*t*omega2*0.353264;
+MGMatrix2[25][54]:=CT*t*omega2*0.184315;
+MGMatrix2[26][10]:=AC*t*0.224061;
+MGMatrix2[26][18]:=t*omega2*0.308787;
+MGMatrix2[26][22]:=CG*t*omega2*0.247183;
+MGMatrix2[26][24]:=t*0.0207881;
+MGMatrix2[26][25]:=CG*t*0.532391;
+MGMatrix2[26][27]:=GT*t*0.0333855;
+MGMatrix2[26][30]:=GT*t*omega2*0.266144;
+MGMatrix2[26][42]:=CG*t*omega2*0.353264;
+MGMatrix2[26][55]:=CT*t*omega2*0.184315;
+MGMatrix2[27][11]:=AC*t*omega2*0.224061;
+MGMatrix2[27][19]:=t*omega2*0.308787;
+MGMatrix2[27][23]:=CG*t*omega2*0.247183;
+MGMatrix2[27][24]:=AT*t*0.0207881;
+MGMatrix2[27][25]:=CT*t*0.532391;
+MGMatrix2[27][26]:=GT*t*0.413436;
+MGMatrix2[27][31]:=GT*t*omega2*0.266144;
+MGMatrix2[27][43]:=CG*t*omega2*0.353264;
+MGMatrix2[27][56]:=CT*t*omega2*0.184315;
+MGMatrix2[28][12]:=AC*t*omega2*0.224061;
+MGMatrix2[28][16]:=AT*t*omega2*0.308787;
+MGMatrix2[28][20]:=CT*t*omega2*0.247183;
+MGMatrix2[28][24]:=GT*t*omega2*0.177887;
+MGMatrix2[28][29]:=AC*t*0.532391;
+MGMatrix2[28][30]:=t*0.413436;
+MGMatrix2[28][31]:=AT*t*0.0333855;
+MGMatrix2[28][44]:=CG*t*omega2*0.353264;
+MGMatrix2[28][57]:=CT*t*0.184315;
+MGMatrix2[29][13]:=AC*t*omega2*0.224061;
+MGMatrix2[29][17]:=AT*t*omega2*0.308787;
+MGMatrix2[29][21]:=CT*t*omega2*0.247183;
+MGMatrix2[29][25]:=GT*t*omega2*0.177887;
+MGMatrix2[29][28]:=AC*t*0.0207881;
+MGMatrix2[29][30]:=CG*t*0.413436;
+MGMatrix2[29][31]:=CT*t*0.0333855;
+MGMatrix2[29][45]:=CG*t*omega2*0.353264;
+MGMatrix2[29][58]:=CT*t*omega2*0.184315;
+MGMatrix2[30][14]:=AC*t*omega2*0.224061;
+MGMatrix2[30][18]:=AT*t*omega2*0.308787;
+MGMatrix2[30][22]:=CT*t*omega2*0.247183;
+MGMatrix2[30][26]:=GT*t*omega2*0.177887;
+MGMatrix2[30][28]:=t*0.0207881;
+MGMatrix2[30][29]:=CG*t*0.532391;
+MGMatrix2[30][31]:=GT*t*0.0333855;
+MGMatrix2[30][46]:=CG*t*omega2*0.353264;
+MGMatrix2[30][59]:=CT*t*0.184315;
+MGMatrix2[31][15]:=AC*t*omega2*0.224061;
+MGMatrix2[31][19]:=AT*t*omega2*0.308787;
+MGMatrix2[31][23]:=CT*t*omega2*0.247183;
+MGMatrix2[31][27]:=GT*t*omega2*0.177887;
+MGMatrix2[31][28]:=AT*t*0.0207881;
+MGMatrix2[31][29]:=CT*t*0.532391;
+MGMatrix2[31][30]:=GT*t*0.413436;
+MGMatrix2[31][47]:=CG*t*omega2*0.353264;
+MGMatrix2[31][60]:=CT*t*omega2*0.184315;
+MGMatrix2[32][0]:=t*omega2*0.224061;
+MGMatrix2[32][16]:=CG*t*omega2*0.23836;
+MGMatrix2[32][33]:=AC*t*omega2*0.532391;
+MGMatrix2[32][34]:=t*0.413436;
+MGMatrix2[32][35]:=AT*t*omega2*0.0333855;
+MGMatrix2[32][36]:=AC*t*omega2*0.247183;
+MGMatrix2[32][40]:=t*omega2*0.177887;
+MGMatrix2[32][44]:=AT*t*omega2*0.266144;
+MGMatrix2[33][1]:=t*omega2*0.224061;
+MGMatrix2[33][17]:=CG*t*omega2*0.23836;
+MGMatrix2[33][32]:=AC*t*omega2*0.0207881;
+MGMatrix2[33][34]:=CG*t*omega2*0.413436;
+MGMatrix2[33][35]:=CT*t*0.0333855;
+MGMatrix2[33][37]:=AC*t*omega2*0.247183;
+MGMatrix2[33][41]:=t*omega2*0.177887;
+MGMatrix2[33][45]:=AT*t*omega2*0.266144;
+MGMatrix2[33][48]:=GT*t*omega2*0.184315;
+MGMatrix2[34][2]:=t*omega2*0.224061;
+MGMatrix2[34][18]:=CG*t*omega2*0.23836;
+MGMatrix2[34][32]:=t*0.0207881;
+MGMatrix2[34][33]:=CG*t*omega2*0.532391;
+MGMatrix2[34][35]:=GT*t*omega2*0.0333855;
+MGMatrix2[34][38]:=AC*t*omega2*0.247183;
+MGMatrix2[34][42]:=t*omega2*0.177887;
+MGMatrix2[34][46]:=AT*t*omega2*0.266144;
+MGMatrix2[35][3]:=t*omega2*0.224061;
+MGMatrix2[35][19]:=CG*t*omega2*0.23836;
+MGMatrix2[35][32]:=AT*t*omega2*0.0207881;
+MGMatrix2[35][33]:=CT*t*0.532391;
+MGMatrix2[35][34]:=GT*t*omega2*0.413436;
+MGMatrix2[35][39]:=AC*t*omega2*0.247183;
+MGMatrix2[35][43]:=t*omega2*0.177887;
+MGMatrix2[35][47]:=AT*t*omega2*0.266144;
+MGMatrix2[35][49]:=GT*t*omega2*0.184315;
+MGMatrix2[36][4]:=t*omega2*0.224061;
+MGMatrix2[36][20]:=CG*t*omega2*0.23836;
+MGMatrix2[36][32]:=AC*t*omega2*0.308787;
+MGMatrix2[36][37]:=AC*t*0.532391;
+MGMatrix2[36][38]:=t*0.413436;
+MGMatrix2[36][39]:=AT*t*0.0333855;
+MGMatrix2[36][40]:=CG*t*omega2*0.177887;
+MGMatrix2[36][44]:=CT*t*omega2*0.266144;
+MGMatrix2[36][50]:=GT*t*omega2*0.184315;
+MGMatrix2[37][5]:=t*omega2*0.224061;
+MGMatrix2[37][21]:=CG*t*omega2*0.23836;
+MGMatrix2[37][33]:=AC*t*omega2*0.308787;
+MGMatrix2[37][36]:=AC*t*0.0207881;
+MGMatrix2[37][38]:=CG*t*0.413436;
+MGMatrix2[37][39]:=CT*t*0.0333855;
+MGMatrix2[37][41]:=CG*t*omega2*0.177887;
+MGMatrix2[37][45]:=CT*t*omega2*0.266144;
+MGMatrix2[37][51]:=GT*t*omega2*0.184315;
+MGMatrix2[38][6]:=t*omega2*0.224061;
+MGMatrix2[38][22]:=CG*t*omega2*0.23836;
+MGMatrix2[38][34]:=AC*t*omega2*0.308787;
+MGMatrix2[38][36]:=t*0.0207881;
+MGMatrix2[38][37]:=CG*t*0.532391;
+MGMatrix2[38][39]:=GT*t*0.0333855;
+MGMatrix2[38][42]:=CG*t*omega2*0.177887;
+MGMatrix2[38][46]:=CT*t*omega2*0.266144;
+MGMatrix2[38][52]:=GT*t*omega2*0.184315;
+MGMatrix2[39][7]:=t*omega2*0.224061;
+MGMatrix2[39][23]:=CG*t*omega2*0.23836;
+MGMatrix2[39][35]:=AC*t*omega2*0.308787;
+MGMatrix2[39][36]:=AT*t*0.0207881;
+MGMatrix2[39][37]:=CT*t*0.532391;
+MGMatrix2[39][38]:=GT*t*0.413436;
+MGMatrix2[39][43]:=CG*t*omega2*0.177887;
+MGMatrix2[39][47]:=CT*t*omega2*0.266144;
+MGMatrix2[39][53]:=GT*t*omega2*0.184315;
+MGMatrix2[40][8]:=t*omega2*0.224061;
+MGMatrix2[40][24]:=CG*t*omega2*0.23836;
+MGMatrix2[40][32]:=t*omega2*0.308787;
+MGMatrix2[40][36]:=CG*t*omega2*0.247183;
+MGMatrix2[40][41]:=AC*t*0.532391;
+MGMatrix2[40][42]:=t*0.413436;
+MGMatrix2[40][43]:=AT*t*0.0333855;
+MGMatrix2[40][44]:=GT*t*omega2*0.266144;
+MGMatrix2[41][9]:=t*omega2*0.224061;
+MGMatrix2[41][25]:=CG*t*omega2*0.23836;
+MGMatrix2[41][33]:=t*omega2*0.308787;
+MGMatrix2[41][37]:=CG*t*omega2*0.247183;
+MGMatrix2[41][40]:=AC*t*0.0207881;
+MGMatrix2[41][42]:=CG*t*0.413436;
+MGMatrix2[41][43]:=CT*t*0.0333855;
+MGMatrix2[41][45]:=GT*t*omega2*0.266144;
+MGMatrix2[41][54]:=GT*t*omega2*0.184315;
+MGMatrix2[42][10]:=t*omega2*0.224061;
+MGMatrix2[42][26]:=CG*t*omega2*0.23836;
+MGMatrix2[42][34]:=t*omega2*0.308787;
+MGMatrix2[42][38]:=CG*t*omega2*0.247183;
+MGMatrix2[42][40]:=t*0.0207881;
+MGMatrix2[42][41]:=CG*t*0.532391;
+MGMatrix2[42][43]:=GT*t*0.0333855;
+MGMatrix2[42][46]:=GT*t*omega2*0.266144;
+MGMatrix2[42][55]:=GT*t*omega2*0.184315;
+MGMatrix2[43][11]:=t*omega2*0.224061;
+MGMatrix2[43][27]:=CG*t*omega2*0.23836;
+MGMatrix2[43][35]:=t*omega2*0.308787;
+MGMatrix2[43][39]:=CG*t*omega2*0.247183;
+MGMatrix2[43][40]:=AT*t*0.0207881;
+MGMatrix2[43][41]:=CT*t*0.532391;
+MGMatrix2[43][42]:=GT*t*0.413436;
+MGMatrix2[43][47]:=GT*t*omega2*0.266144;
+MGMatrix2[43][56]:=GT*t*omega2*0.184315;
+MGMatrix2[44][12]:=t*omega2*0.224061;
+MGMatrix2[44][28]:=CG*t*omega2*0.23836;
+MGMatrix2[44][32]:=AT*t*omega2*0.308787;
+MGMatrix2[44][36]:=CT*t*omega2*0.247183;
+MGMatrix2[44][40]:=GT*t*omega2*0.177887;
+MGMatrix2[44][45]:=AC*t*0.532391;
+MGMatrix2[44][46]:=t*0.413436;
+MGMatrix2[44][47]:=AT*t*0.0333855;
+MGMatrix2[44][57]:=GT*t*omega2*0.184315;
+MGMatrix2[45][13]:=t*omega2*0.224061;
+MGMatrix2[45][29]:=CG*t*omega2*0.23836;
+MGMatrix2[45][33]:=AT*t*omega2*0.308787;
+MGMatrix2[45][37]:=CT*t*omega2*0.247183;
+MGMatrix2[45][41]:=GT*t*omega2*0.177887;
+MGMatrix2[45][44]:=AC*t*0.0207881;
+MGMatrix2[45][46]:=CG*t*0.413436;
+MGMatrix2[45][47]:=CT*t*0.0333855;
+MGMatrix2[45][58]:=GT*t*omega2*0.184315;
+MGMatrix2[46][14]:=t*omega2*0.224061;
+MGMatrix2[46][30]:=CG*t*omega2*0.23836;
+MGMatrix2[46][34]:=AT*t*omega2*0.308787;
+MGMatrix2[46][38]:=CT*t*omega2*0.247183;
+MGMatrix2[46][42]:=GT*t*omega2*0.177887;
+MGMatrix2[46][44]:=t*0.0207881;
+MGMatrix2[46][45]:=CG*t*0.532391;
+MGMatrix2[46][47]:=GT*t*0.0333855;
+MGMatrix2[46][59]:=GT*t*omega2*0.184315;
+MGMatrix2[47][15]:=t*omega2*0.224061;
+MGMatrix2[47][31]:=CG*t*omega2*0.23836;
+MGMatrix2[47][35]:=AT*t*omega2*0.308787;
+MGMatrix2[47][39]:=CT*t*omega2*0.247183;
+MGMatrix2[47][43]:=GT*t*omega2*0.177887;
+MGMatrix2[47][44]:=AT*t*0.0207881;
+MGMatrix2[47][45]:=CT*t*0.532391;
+MGMatrix2[47][46]:=GT*t*0.413436;
+MGMatrix2[47][60]:=GT*t*omega2*0.184315;
+MGMatrix2[48][1]:=AT*t*omega2*0.224061;
+MGMatrix2[48][17]:=CT*t*omega2*0.23836;
+MGMatrix2[48][33]:=GT*t*omega2*0.353264;
+MGMatrix2[48][49]:=CT*t*0.0333855;
+MGMatrix2[48][51]:=AC*t*omega2*0.247183;
+MGMatrix2[48][54]:=t*omega2*0.177887;
+MGMatrix2[48][58]:=AT*t*omega2*0.266144;
+MGMatrix2[49][3]:=AT*t*omega2*0.224061;
+MGMatrix2[49][19]:=CT*t*omega2*0.23836;
+MGMatrix2[49][35]:=GT*t*omega2*0.353264;
+MGMatrix2[49][48]:=CT*t*0.532391;
+MGMatrix2[49][53]:=AC*t*omega2*0.247183;
+MGMatrix2[49][56]:=t*omega2*0.177887;
+MGMatrix2[49][60]:=AT*t*omega2*0.266144;
+MGMatrix2[50][4]:=AT*t*omega2*0.224061;
+MGMatrix2[50][20]:=CT*t*omega2*0.23836;
+MGMatrix2[50][36]:=GT*t*omega2*0.353264;
+MGMatrix2[50][51]:=AC*t*0.532391;
+MGMatrix2[50][52]:=t*0.413436;
+MGMatrix2[50][53]:=AT*t*0.0333855;
+MGMatrix2[50][57]:=CT*t*omega2*0.266144;
+MGMatrix2[51][5]:=AT*t*omega2*0.224061;
+MGMatrix2[51][21]:=CT*t*omega2*0.23836;
+MGMatrix2[51][37]:=GT*t*omega2*0.353264;
+MGMatrix2[51][48]:=AC*t*omega2*0.308787;
+MGMatrix2[51][50]:=AC*t*0.0207881;
+MGMatrix2[51][52]:=CG*t*0.413436;
+MGMatrix2[51][53]:=CT*t*0.0333855;
+MGMatrix2[51][54]:=CG*t*omega2*0.177887;
+MGMatrix2[51][58]:=CT*t*omega2*0.266144;
+MGMatrix2[52][6]:=AT*t*omega2*0.224061;
+MGMatrix2[52][22]:=CT*t*omega2*0.23836;
+MGMatrix2[52][38]:=GT*t*omega2*0.353264;
+MGMatrix2[52][50]:=t*0.0207881;
+MGMatrix2[52][51]:=CG*t*0.532391;
+MGMatrix2[52][53]:=GT*t*0.0333855;
+MGMatrix2[52][55]:=CG*t*omega2*0.177887;
+MGMatrix2[52][59]:=CT*t*omega2*0.266144;
+MGMatrix2[53][7]:=AT*t*omega2*0.224061;
+MGMatrix2[53][23]:=CT*t*omega2*0.23836;
+MGMatrix2[53][39]:=GT*t*omega2*0.353264;
+MGMatrix2[53][49]:=AC*t*omega2*0.308787;
+MGMatrix2[53][50]:=AT*t*0.0207881;
+MGMatrix2[53][51]:=CT*t*0.532391;
+MGMatrix2[53][52]:=GT*t*0.413436;
+MGMatrix2[53][56]:=CG*t*omega2*0.177887;
+MGMatrix2[53][60]:=CT*t*omega2*0.266144;
+MGMatrix2[54][9]:=AT*t*omega2*0.224061;
+MGMatrix2[54][25]:=CT*t*omega2*0.23836;
+MGMatrix2[54][41]:=GT*t*omega2*0.353264;
+MGMatrix2[54][48]:=t*omega2*0.308787;
+MGMatrix2[54][51]:=CG*t*omega2*0.247183;
+MGMatrix2[54][55]:=CG*t*omega2*0.413436;
+MGMatrix2[54][56]:=CT*t*0.0333855;
+MGMatrix2[54][58]:=GT*t*omega2*0.266144;
+MGMatrix2[55][10]:=AT*t*omega2*0.224061;
+MGMatrix2[55][26]:=CT*t*omega2*0.23836;
+MGMatrix2[55][42]:=GT*t*omega2*0.353264;
+MGMatrix2[55][52]:=CG*t*omega2*0.247183;
+MGMatrix2[55][54]:=CG*t*omega2*0.532391;
+MGMatrix2[55][56]:=GT*t*omega2*0.0333855;
+MGMatrix2[55][59]:=GT*t*omega2*0.266144;
+MGMatrix2[56][11]:=AT*t*omega2*0.224061;
+MGMatrix2[56][27]:=CT*t*omega2*0.23836;
+MGMatrix2[56][43]:=GT*t*omega2*0.353264;
+MGMatrix2[56][49]:=t*omega2*0.308787;
+MGMatrix2[56][53]:=CG*t*omega2*0.247183;
+MGMatrix2[56][54]:=CT*t*0.532391;
+MGMatrix2[56][55]:=GT*t*omega2*0.413436;
+MGMatrix2[56][60]:=GT*t*omega2*0.266144;
+MGMatrix2[57][12]:=AT*t*omega2*0.224061;
+MGMatrix2[57][28]:=CT*t*0.23836;
+MGMatrix2[57][44]:=GT*t*omega2*0.353264;
+MGMatrix2[57][50]:=CT*t*omega2*0.247183;
+MGMatrix2[57][58]:=AC*t*omega2*0.532391;
+MGMatrix2[57][59]:=t*0.413436;
+MGMatrix2[57][60]:=AT*t*omega2*0.0333855;
+MGMatrix2[58][13]:=AT*t*omega2*0.224061;
+MGMatrix2[58][29]:=CT*t*omega2*0.23836;
+MGMatrix2[58][45]:=GT*t*omega2*0.353264;
+MGMatrix2[58][48]:=AT*t*omega2*0.308787;
+MGMatrix2[58][51]:=CT*t*omega2*0.247183;
+MGMatrix2[58][54]:=GT*t*omega2*0.177887;
+MGMatrix2[58][57]:=AC*t*omega2*0.0207881;
+MGMatrix2[58][59]:=CG*t*omega2*0.413436;
+MGMatrix2[58][60]:=CT*t*0.0333855;
+MGMatrix2[59][14]:=AT*t*omega2*0.224061;
+MGMatrix2[59][30]:=CT*t*0.23836;
+MGMatrix2[59][46]:=GT*t*omega2*0.353264;
+MGMatrix2[59][52]:=CT*t*omega2*0.247183;
+MGMatrix2[59][55]:=GT*t*omega2*0.177887;
+MGMatrix2[59][57]:=t*0.0207881;
+MGMatrix2[59][58]:=CG*t*omega2*0.532391;
+MGMatrix2[59][60]:=GT*t*omega2*0.0333855;
+MGMatrix2[60][15]:=AT*t*omega2*0.224061;
+MGMatrix2[60][31]:=CT*t*omega2*0.23836;
+MGMatrix2[60][47]:=GT*t*omega2*0.353264;
+MGMatrix2[60][49]:=AT*t*omega2*0.308787;
+MGMatrix2[60][53]:=CT*t*omega2*0.247183;
+MGMatrix2[60][56]:=GT*t*omega2*0.177887;
+MGMatrix2[60][57]:=AT*t*omega2*0.0207881;
+MGMatrix2[60][58]:=CT*t*0.532391;
+MGMatrix2[60][59]:=GT*t*omega2*0.413436;
+
+
+codon3x4={
+{  0.00147574454892}
+{    0.037794316739}
+{   0.0293497163676}
+{  0.00237003094703}
+{  0.00118133156831}
+{   0.0302543007863}
+{   0.0234944093079}
+{  0.00189720665251}
+{ 0.000850150974003}
+{   0.0217726538181}
+{   0.0169078652366}
+{  0.00136533393907}
+{  0.00127194679886}
+{    0.032574987471}
+{   0.0252965716924}
+{   0.0020427338041}
+{  0.00156991974762}
+{   0.0402061754115}
+{   0.0312226796612}
+{  0.00252127537177}
+{  0.00125671869088}
+{   0.0321849904779}
+{   0.0249937139583}
+{  0.00201827761537}
+{ 0.000904403681196}
+{   0.0231620839881}
+{   0.0179868470762}
+{  0.00145246324279}
+{  0.00135311656677}
+{   0.0346537726646}
+{   0.0269108820196}
+{  0.00217309163739}
+{  0.00232672367088}
+{   0.0595881797063}
+{   0.0462740518719}
+{  0.00373669488342}
+{  0.00186253923497}
+{   0.0477002593959}
+{    0.037042317595}
+{  0.00299121933412}
+{  0.00134038536445}
+{   0.0343277222698}
+{   0.0266576829295}
+{  0.00215264545414}
+{   0.0020054071873}
+{   0.0513591559482}
+{   0.0398836859618}
+{   0.0032206638329}
+{   0.0310900142161}
+{  0.00194961312159}
+{ 0.000971776140481}
+{   0.0248875154441}
+{   0.0193267555126}
+{   0.0015606627368}
+{   0.0179104208021}
+{   0.0139085930352}
+{  0.00112313848319}
+{  0.00104631721038}
+{   0.0267965374412}
+{   0.0208092338053}
+{  0.00168037494758}
+}
+;
+Model BSREL2=("Exp(MGMatrix1)*Paux1+Exp(MGMatrix2)*(1-Paux1)",codon3x4,EXPLICIT_FORM_MATRIX_EXPONENTIAL);
+
+MGMatrixLocal={61,61};
+MGMatrixLocal[0][1]:=AC*nonsyn*0.532391;
+MGMatrixLocal[0][2]:=syn*0.413436;
+MGMatrixLocal[0][3]:=AT*nonsyn*0.0333855;
+MGMatrixLocal[0][4]:=AC*nonsyn*0.247183;
+MGMatrixLocal[0][8]:=nonsyn*0.177887;
+MGMatrixLocal[0][12]:=AT*nonsyn*0.266144;
+MGMatrixLocal[0][16]:=AC*nonsyn*0.23836;
+MGMatrixLocal[0][32]:=nonsyn*0.353264;
+MGMatrixLocal[1][0]:=AC*nonsyn*0.0207881;
+MGMatrixLocal[1][2]:=CG*nonsyn*0.413436;
+MGMatrixLocal[1][3]:=CT*syn*0.0333855;
+MGMatrixLocal[1][5]:=AC*nonsyn*0.247183;
+MGMatrixLocal[1][9]:=nonsyn*0.177887;
+MGMatrixLocal[1][13]:=AT*nonsyn*0.266144;
+MGMatrixLocal[1][17]:=AC*nonsyn*0.23836;
+MGMatrixLocal[1][33]:=nonsyn*0.353264;
+MGMatrixLocal[1][48]:=AT*nonsyn*0.184315;
+MGMatrixLocal[2][0]:=syn*0.0207881;
+MGMatrixLocal[2][1]:=CG*nonsyn*0.532391;
+MGMatrixLocal[2][3]:=GT*nonsyn*0.0333855;
+MGMatrixLocal[2][6]:=AC*nonsyn*0.247183;
+MGMatrixLocal[2][10]:=nonsyn*0.177887;
+MGMatrixLocal[2][14]:=AT*nonsyn*0.266144;
+MGMatrixLocal[2][18]:=AC*nonsyn*0.23836;
+MGMatrixLocal[2][34]:=nonsyn*0.353264;
+MGMatrixLocal[3][0]:=AT*nonsyn*0.0207881;
+MGMatrixLocal[3][1]:=CT*syn*0.532391;
+MGMatrixLocal[3][2]:=GT*nonsyn*0.413436;
+MGMatrixLocal[3][7]:=AC*nonsyn*0.247183;
+MGMatrixLocal[3][11]:=nonsyn*0.177887;
+MGMatrixLocal[3][15]:=AT*nonsyn*0.266144;
+MGMatrixLocal[3][19]:=AC*nonsyn*0.23836;
+MGMatrixLocal[3][35]:=nonsyn*0.353264;
+MGMatrixLocal[3][49]:=AT*nonsyn*0.184315;
+MGMatrixLocal[4][0]:=AC*nonsyn*0.308787;
+MGMatrixLocal[4][5]:=AC*syn*0.532391;
+MGMatrixLocal[4][6]:=syn*0.413436;
+MGMatrixLocal[4][7]:=AT*syn*0.0333855;
+MGMatrixLocal[4][8]:=CG*nonsyn*0.177887;
+MGMatrixLocal[4][12]:=CT*nonsyn*0.266144;
+MGMatrixLocal[4][20]:=AC*nonsyn*0.23836;
+MGMatrixLocal[4][36]:=nonsyn*0.353264;
+MGMatrixLocal[4][50]:=AT*nonsyn*0.184315;
+MGMatrixLocal[5][1]:=AC*nonsyn*0.308787;
+MGMatrixLocal[5][4]:=AC*syn*0.0207881;
+MGMatrixLocal[5][6]:=CG*syn*0.413436;
+MGMatrixLocal[5][7]:=CT*syn*0.0333855;
+MGMatrixLocal[5][9]:=CG*nonsyn*0.177887;
+MGMatrixLocal[5][13]:=CT*nonsyn*0.266144;
+MGMatrixLocal[5][21]:=AC*nonsyn*0.23836;
+MGMatrixLocal[5][37]:=nonsyn*0.353264;
+MGMatrixLocal[5][51]:=AT*nonsyn*0.184315;
+MGMatrixLocal[6][2]:=AC*nonsyn*0.308787;
+MGMatrixLocal[6][4]:=syn*0.0207881;
+MGMatrixLocal[6][5]:=CG*syn*0.532391;
+MGMatrixLocal[6][7]:=GT*syn*0.0333855;
+MGMatrixLocal[6][10]:=CG*nonsyn*0.177887;
+MGMatrixLocal[6][14]:=CT*nonsyn*0.266144;
+MGMatrixLocal[6][22]:=AC*nonsyn*0.23836;
+MGMatrixLocal[6][38]:=nonsyn*0.353264;
+MGMatrixLocal[6][52]:=AT*nonsyn*0.184315;
+MGMatrixLocal[7][3]:=AC*nonsyn*0.308787;
+MGMatrixLocal[7][4]:=AT*syn*0.0207881;
+MGMatrixLocal[7][5]:=CT*syn*0.532391;
+MGMatrixLocal[7][6]:=GT*syn*0.413436;
+MGMatrixLocal[7][11]:=CG*nonsyn*0.177887;
+MGMatrixLocal[7][15]:=CT*nonsyn*0.266144;
+MGMatrixLocal[7][23]:=AC*nonsyn*0.23836;
+MGMatrixLocal[7][39]:=nonsyn*0.353264;
+MGMatrixLocal[7][53]:=AT*nonsyn*0.184315;
+MGMatrixLocal[8][0]:=nonsyn*0.308787;
+MGMatrixLocal[8][4]:=CG*nonsyn*0.247183;
+MGMatrixLocal[8][9]:=AC*nonsyn*0.532391;
+MGMatrixLocal[8][10]:=syn*0.413436;
+MGMatrixLocal[8][11]:=AT*nonsyn*0.0333855;
+MGMatrixLocal[8][12]:=GT*nonsyn*0.266144;
+MGMatrixLocal[8][24]:=AC*syn*0.23836;
+MGMatrixLocal[8][40]:=nonsyn*0.353264;
+MGMatrixLocal[9][1]:=nonsyn*0.308787;
+MGMatrixLocal[9][5]:=CG*nonsyn*0.247183;
+MGMatrixLocal[9][8]:=AC*nonsyn*0.0207881;
+MGMatrixLocal[9][10]:=CG*nonsyn*0.413436;
+MGMatrixLocal[9][11]:=CT*syn*0.0333855;
+MGMatrixLocal[9][13]:=GT*nonsyn*0.266144;
+MGMatrixLocal[9][25]:=AC*nonsyn*0.23836;
+MGMatrixLocal[9][41]:=nonsyn*0.353264;
+MGMatrixLocal[9][54]:=AT*nonsyn*0.184315;
+MGMatrixLocal[10][2]:=nonsyn*0.308787;
+MGMatrixLocal[10][6]:=CG*nonsyn*0.247183;
+MGMatrixLocal[10][8]:=syn*0.0207881;
+MGMatrixLocal[10][9]:=CG*nonsyn*0.532391;
+MGMatrixLocal[10][11]:=GT*nonsyn*0.0333855;
+MGMatrixLocal[10][14]:=GT*nonsyn*0.266144;
+MGMatrixLocal[10][26]:=AC*syn*0.23836;
+MGMatrixLocal[10][42]:=nonsyn*0.353264;
+MGMatrixLocal[10][55]:=AT*nonsyn*0.184315;
+MGMatrixLocal[11][3]:=nonsyn*0.308787;
+MGMatrixLocal[11][7]:=CG*nonsyn*0.247183;
+MGMatrixLocal[11][8]:=AT*nonsyn*0.0207881;
+MGMatrixLocal[11][9]:=CT*syn*0.532391;
+MGMatrixLocal[11][10]:=GT*nonsyn*0.413436;
+MGMatrixLocal[11][15]:=GT*nonsyn*0.266144;
+MGMatrixLocal[11][27]:=AC*nonsyn*0.23836;
+MGMatrixLocal[11][43]:=nonsyn*0.353264;
+MGMatrixLocal[11][56]:=AT*nonsyn*0.184315;
+MGMatrixLocal[12][0]:=AT*nonsyn*0.308787;
+MGMatrixLocal[12][4]:=CT*nonsyn*0.247183;
+MGMatrixLocal[12][8]:=GT*nonsyn*0.177887;
+MGMatrixLocal[12][13]:=AC*syn*0.532391;
+MGMatrixLocal[12][14]:=nonsyn*0.413436;
+MGMatrixLocal[12][15]:=AT*syn*0.0333855;
+MGMatrixLocal[12][28]:=AC*nonsyn*0.23836;
+MGMatrixLocal[12][44]:=nonsyn*0.353264;
+MGMatrixLocal[12][57]:=AT*nonsyn*0.184315;
+MGMatrixLocal[13][1]:=AT*nonsyn*0.308787;
+MGMatrixLocal[13][5]:=CT*nonsyn*0.247183;
+MGMatrixLocal[13][9]:=GT*nonsyn*0.177887;
+MGMatrixLocal[13][12]:=AC*syn*0.0207881;
+MGMatrixLocal[13][14]:=CG*nonsyn*0.413436;
+MGMatrixLocal[13][15]:=CT*syn*0.0333855;
+MGMatrixLocal[13][29]:=AC*nonsyn*0.23836;
+MGMatrixLocal[13][45]:=nonsyn*0.353264;
+MGMatrixLocal[13][58]:=AT*nonsyn*0.184315;
+MGMatrixLocal[14][2]:=AT*nonsyn*0.308787;
+MGMatrixLocal[14][6]:=CT*nonsyn*0.247183;
+MGMatrixLocal[14][10]:=GT*nonsyn*0.177887;
+MGMatrixLocal[14][12]:=nonsyn*0.0207881;
+MGMatrixLocal[14][13]:=CG*nonsyn*0.532391;
+MGMatrixLocal[14][15]:=GT*nonsyn*0.0333855;
+MGMatrixLocal[14][30]:=AC*nonsyn*0.23836;
+MGMatrixLocal[14][46]:=nonsyn*0.353264;
+MGMatrixLocal[14][59]:=AT*nonsyn*0.184315;
+MGMatrixLocal[15][3]:=AT*nonsyn*0.308787;
+MGMatrixLocal[15][7]:=CT*nonsyn*0.247183;
+MGMatrixLocal[15][11]:=GT*nonsyn*0.177887;
+MGMatrixLocal[15][12]:=AT*syn*0.0207881;
+MGMatrixLocal[15][13]:=CT*syn*0.532391;
+MGMatrixLocal[15][14]:=GT*nonsyn*0.413436;
+MGMatrixLocal[15][31]:=AC*nonsyn*0.23836;
+MGMatrixLocal[15][47]:=nonsyn*0.353264;
+MGMatrixLocal[15][60]:=AT*nonsyn*0.184315;
+MGMatrixLocal[16][0]:=AC*nonsyn*0.224061;
+MGMatrixLocal[16][17]:=AC*nonsyn*0.532391;
+MGMatrixLocal[16][18]:=syn*0.413436;
+MGMatrixLocal[16][19]:=AT*nonsyn*0.0333855;
+MGMatrixLocal[16][20]:=AC*nonsyn*0.247183;
+MGMatrixLocal[16][24]:=nonsyn*0.177887;
+MGMatrixLocal[16][28]:=AT*nonsyn*0.266144;
+MGMatrixLocal[16][32]:=CG*nonsyn*0.353264;
+MGMatrixLocal[17][1]:=AC*nonsyn*0.224061;
+MGMatrixLocal[17][16]:=AC*nonsyn*0.0207881;
+MGMatrixLocal[17][18]:=CG*nonsyn*0.413436;
+MGMatrixLocal[17][19]:=CT*syn*0.0333855;
+MGMatrixLocal[17][21]:=AC*nonsyn*0.247183;
+MGMatrixLocal[17][25]:=nonsyn*0.177887;
+MGMatrixLocal[17][29]:=AT*nonsyn*0.266144;
+MGMatrixLocal[17][33]:=CG*nonsyn*0.353264;
+MGMatrixLocal[17][48]:=CT*nonsyn*0.184315;
+MGMatrixLocal[18][2]:=AC*nonsyn*0.224061;
+MGMatrixLocal[18][16]:=syn*0.0207881;
+MGMatrixLocal[18][17]:=CG*nonsyn*0.532391;
+MGMatrixLocal[18][19]:=GT*nonsyn*0.0333855;
+MGMatrixLocal[18][22]:=AC*nonsyn*0.247183;
+MGMatrixLocal[18][26]:=nonsyn*0.177887;
+MGMatrixLocal[18][30]:=AT*nonsyn*0.266144;
+MGMatrixLocal[18][34]:=CG*nonsyn*0.353264;
+MGMatrixLocal[19][3]:=AC*nonsyn*0.224061;
+MGMatrixLocal[19][16]:=AT*nonsyn*0.0207881;
+MGMatrixLocal[19][17]:=CT*syn*0.532391;
+MGMatrixLocal[19][18]:=GT*nonsyn*0.413436;
+MGMatrixLocal[19][23]:=AC*nonsyn*0.247183;
+MGMatrixLocal[19][27]:=nonsyn*0.177887;
+MGMatrixLocal[19][31]:=AT*nonsyn*0.266144;
+MGMatrixLocal[19][35]:=CG*nonsyn*0.353264;
+MGMatrixLocal[19][49]:=CT*nonsyn*0.184315;
+MGMatrixLocal[20][4]:=AC*nonsyn*0.224061;
+MGMatrixLocal[20][16]:=AC*nonsyn*0.308787;
+MGMatrixLocal[20][21]:=AC*syn*0.532391;
+MGMatrixLocal[20][22]:=syn*0.413436;
+MGMatrixLocal[20][23]:=AT*syn*0.0333855;
+MGMatrixLocal[20][24]:=CG*nonsyn*0.177887;
+MGMatrixLocal[20][28]:=CT*nonsyn*0.266144;
+MGMatrixLocal[20][36]:=CG*nonsyn*0.353264;
+MGMatrixLocal[20][50]:=CT*nonsyn*0.184315;
+MGMatrixLocal[21][5]:=AC*nonsyn*0.224061;
+MGMatrixLocal[21][17]:=AC*nonsyn*0.308787;
+MGMatrixLocal[21][20]:=AC*syn*0.0207881;
+MGMatrixLocal[21][22]:=CG*syn*0.413436;
+MGMatrixLocal[21][23]:=CT*syn*0.0333855;
+MGMatrixLocal[21][25]:=CG*nonsyn*0.177887;
+MGMatrixLocal[21][29]:=CT*nonsyn*0.266144;
+MGMatrixLocal[21][37]:=CG*nonsyn*0.353264;
+MGMatrixLocal[21][51]:=CT*nonsyn*0.184315;
+MGMatrixLocal[22][6]:=AC*nonsyn*0.224061;
+MGMatrixLocal[22][18]:=AC*nonsyn*0.308787;
+MGMatrixLocal[22][20]:=syn*0.0207881;
+MGMatrixLocal[22][21]:=CG*syn*0.532391;
+MGMatrixLocal[22][23]:=GT*syn*0.0333855;
+MGMatrixLocal[22][26]:=CG*nonsyn*0.177887;
+MGMatrixLocal[22][30]:=CT*nonsyn*0.266144;
+MGMatrixLocal[22][38]:=CG*nonsyn*0.353264;
+MGMatrixLocal[22][52]:=CT*nonsyn*0.184315;
+MGMatrixLocal[23][7]:=AC*nonsyn*0.224061;
+MGMatrixLocal[23][19]:=AC*nonsyn*0.308787;
+MGMatrixLocal[23][20]:=AT*syn*0.0207881;
+MGMatrixLocal[23][21]:=CT*syn*0.532391;
+MGMatrixLocal[23][22]:=GT*syn*0.413436;
+MGMatrixLocal[23][27]:=CG*nonsyn*0.177887;
+MGMatrixLocal[23][31]:=CT*nonsyn*0.266144;
+MGMatrixLocal[23][39]:=CG*nonsyn*0.353264;
+MGMatrixLocal[23][53]:=CT*nonsyn*0.184315;
+MGMatrixLocal[24][8]:=AC*syn*0.224061;
+MGMatrixLocal[24][16]:=nonsyn*0.308787;
+MGMatrixLocal[24][20]:=CG*nonsyn*0.247183;
+MGMatrixLocal[24][25]:=AC*syn*0.532391;
+MGMatrixLocal[24][26]:=syn*0.413436;
+MGMatrixLocal[24][27]:=AT*syn*0.0333855;
+MGMatrixLocal[24][28]:=GT*nonsyn*0.266144;
+MGMatrixLocal[24][40]:=CG*nonsyn*0.353264;
+MGMatrixLocal[25][9]:=AC*nonsyn*0.224061;
+MGMatrixLocal[25][17]:=nonsyn*0.308787;
+MGMatrixLocal[25][21]:=CG*nonsyn*0.247183;
+MGMatrixLocal[25][24]:=AC*syn*0.0207881;
+MGMatrixLocal[25][26]:=CG*syn*0.413436;
+MGMatrixLocal[25][27]:=CT*syn*0.0333855;
+MGMatrixLocal[25][29]:=GT*nonsyn*0.266144;
+MGMatrixLocal[25][41]:=CG*nonsyn*0.353264;
+MGMatrixLocal[25][54]:=CT*nonsyn*0.184315;
+MGMatrixLocal[26][10]:=AC*syn*0.224061;
+MGMatrixLocal[26][18]:=nonsyn*0.308787;
+MGMatrixLocal[26][22]:=CG*nonsyn*0.247183;
+MGMatrixLocal[26][24]:=syn*0.0207881;
+MGMatrixLocal[26][25]:=CG*syn*0.532391;
+MGMatrixLocal[26][27]:=GT*syn*0.0333855;
+MGMatrixLocal[26][30]:=GT*nonsyn*0.266144;
+MGMatrixLocal[26][42]:=CG*nonsyn*0.353264;
+MGMatrixLocal[26][55]:=CT*nonsyn*0.184315;
+MGMatrixLocal[27][11]:=AC*nonsyn*0.224061;
+MGMatrixLocal[27][19]:=nonsyn*0.308787;
+MGMatrixLocal[27][23]:=CG*nonsyn*0.247183;
+MGMatrixLocal[27][24]:=AT*syn*0.0207881;
+MGMatrixLocal[27][25]:=CT*syn*0.532391;
+MGMatrixLocal[27][26]:=GT*syn*0.413436;
+MGMatrixLocal[27][31]:=GT*nonsyn*0.266144;
+MGMatrixLocal[27][43]:=CG*nonsyn*0.353264;
+MGMatrixLocal[27][56]:=CT*nonsyn*0.184315;
+MGMatrixLocal[28][12]:=AC*nonsyn*0.224061;
+MGMatrixLocal[28][16]:=AT*nonsyn*0.308787;
+MGMatrixLocal[28][20]:=CT*nonsyn*0.247183;
+MGMatrixLocal[28][24]:=GT*nonsyn*0.177887;
+MGMatrixLocal[28][29]:=AC*syn*0.532391;
+MGMatrixLocal[28][30]:=syn*0.413436;
+MGMatrixLocal[28][31]:=AT*syn*0.0333855;
+MGMatrixLocal[28][44]:=CG*nonsyn*0.353264;
+MGMatrixLocal[28][57]:=CT*syn*0.184315;
+MGMatrixLocal[29][13]:=AC*nonsyn*0.224061;
+MGMatrixLocal[29][17]:=AT*nonsyn*0.308787;
+MGMatrixLocal[29][21]:=CT*nonsyn*0.247183;
+MGMatrixLocal[29][25]:=GT*nonsyn*0.177887;
+MGMatrixLocal[29][28]:=AC*syn*0.0207881;
+MGMatrixLocal[29][30]:=CG*syn*0.413436;
+MGMatrixLocal[29][31]:=CT*syn*0.0333855;
+MGMatrixLocal[29][45]:=CG*nonsyn*0.353264;
+MGMatrixLocal[29][58]:=CT*nonsyn*0.184315;
+MGMatrixLocal[30][14]:=AC*nonsyn*0.224061;
+MGMatrixLocal[30][18]:=AT*nonsyn*0.308787;
+MGMatrixLocal[30][22]:=CT*nonsyn*0.247183;
+MGMatrixLocal[30][26]:=GT*nonsyn*0.177887;
+MGMatrixLocal[30][28]:=syn*0.0207881;
+MGMatrixLocal[30][29]:=CG*syn*0.532391;
+MGMatrixLocal[30][31]:=GT*syn*0.0333855;
+MGMatrixLocal[30][46]:=CG*nonsyn*0.353264;
+MGMatrixLocal[30][59]:=CT*syn*0.184315;
+MGMatrixLocal[31][15]:=AC*nonsyn*0.224061;
+MGMatrixLocal[31][19]:=AT*nonsyn*0.308787;
+MGMatrixLocal[31][23]:=CT*nonsyn*0.247183;
+MGMatrixLocal[31][27]:=GT*nonsyn*0.177887;
+MGMatrixLocal[31][28]:=AT*syn*0.0207881;
+MGMatrixLocal[31][29]:=CT*syn*0.532391;
+MGMatrixLocal[31][30]:=GT*syn*0.413436;
+MGMatrixLocal[31][47]:=CG*nonsyn*0.353264;
+MGMatrixLocal[31][60]:=CT*nonsyn*0.184315;
+MGMatrixLocal[32][0]:=nonsyn*0.224061;
+MGMatrixLocal[32][16]:=CG*nonsyn*0.23836;
+MGMatrixLocal[32][33]:=AC*nonsyn*0.532391;
+MGMatrixLocal[32][34]:=syn*0.413436;
+MGMatrixLocal[32][35]:=AT*nonsyn*0.0333855;
+MGMatrixLocal[32][36]:=AC*nonsyn*0.247183;
+MGMatrixLocal[32][40]:=nonsyn*0.177887;
+MGMatrixLocal[32][44]:=AT*nonsyn*0.266144;
+MGMatrixLocal[33][1]:=nonsyn*0.224061;
+MGMatrixLocal[33][17]:=CG*nonsyn*0.23836;
+MGMatrixLocal[33][32]:=AC*nonsyn*0.0207881;
+MGMatrixLocal[33][34]:=CG*nonsyn*0.413436;
+MGMatrixLocal[33][35]:=CT*syn*0.0333855;
+MGMatrixLocal[33][37]:=AC*nonsyn*0.247183;
+MGMatrixLocal[33][41]:=nonsyn*0.177887;
+MGMatrixLocal[33][45]:=AT*nonsyn*0.266144;
+MGMatrixLocal[33][48]:=GT*nonsyn*0.184315;
+MGMatrixLocal[34][2]:=nonsyn*0.224061;
+MGMatrixLocal[34][18]:=CG*nonsyn*0.23836;
+MGMatrixLocal[34][32]:=syn*0.0207881;
+MGMatrixLocal[34][33]:=CG*nonsyn*0.532391;
+MGMatrixLocal[34][35]:=GT*nonsyn*0.0333855;
+MGMatrixLocal[34][38]:=AC*nonsyn*0.247183;
+MGMatrixLocal[34][42]:=nonsyn*0.177887;
+MGMatrixLocal[34][46]:=AT*nonsyn*0.266144;
+MGMatrixLocal[35][3]:=nonsyn*0.224061;
+MGMatrixLocal[35][19]:=CG*nonsyn*0.23836;
+MGMatrixLocal[35][32]:=AT*nonsyn*0.0207881;
+MGMatrixLocal[35][33]:=CT*syn*0.532391;
+MGMatrixLocal[35][34]:=GT*nonsyn*0.413436;
+MGMatrixLocal[35][39]:=AC*nonsyn*0.247183;
+MGMatrixLocal[35][43]:=nonsyn*0.177887;
+MGMatrixLocal[35][47]:=AT*nonsyn*0.266144;
+MGMatrixLocal[35][49]:=GT*nonsyn*0.184315;
+MGMatrixLocal[36][4]:=nonsyn*0.224061;
+MGMatrixLocal[36][20]:=CG*nonsyn*0.23836;
+MGMatrixLocal[36][32]:=AC*nonsyn*0.308787;
+MGMatrixLocal[36][37]:=AC*syn*0.532391;
+MGMatrixLocal[36][38]:=syn*0.413436;
+MGMatrixLocal[36][39]:=AT*syn*0.0333855;
+MGMatrixLocal[36][40]:=CG*nonsyn*0.177887;
+MGMatrixLocal[36][44]:=CT*nonsyn*0.266144;
+MGMatrixLocal[36][50]:=GT*nonsyn*0.184315;
+MGMatrixLocal[37][5]:=nonsyn*0.224061;
+MGMatrixLocal[37][21]:=CG*nonsyn*0.23836;
+MGMatrixLocal[37][33]:=AC*nonsyn*0.308787;
+MGMatrixLocal[37][36]:=AC*syn*0.0207881;
+MGMatrixLocal[37][38]:=CG*syn*0.413436;
+MGMatrixLocal[37][39]:=CT*syn*0.0333855;
+MGMatrixLocal[37][41]:=CG*nonsyn*0.177887;
+MGMatrixLocal[37][45]:=CT*nonsyn*0.266144;
+MGMatrixLocal[37][51]:=GT*nonsyn*0.184315;
+MGMatrixLocal[38][6]:=nonsyn*0.224061;
+MGMatrixLocal[38][22]:=CG*nonsyn*0.23836;
+MGMatrixLocal[38][34]:=AC*nonsyn*0.308787;
+MGMatrixLocal[38][36]:=syn*0.0207881;
+MGMatrixLocal[38][37]:=CG*syn*0.532391;
+MGMatrixLocal[38][39]:=GT*syn*0.0333855;
+MGMatrixLocal[38][42]:=CG*nonsyn*0.177887;
+MGMatrixLocal[38][46]:=CT*nonsyn*0.266144;
+MGMatrixLocal[38][52]:=GT*nonsyn*0.184315;
+MGMatrixLocal[39][7]:=nonsyn*0.224061;
+MGMatrixLocal[39][23]:=CG*nonsyn*0.23836;
+MGMatrixLocal[39][35]:=AC*nonsyn*0.308787;
+MGMatrixLocal[39][36]:=AT*syn*0.0207881;
+MGMatrixLocal[39][37]:=CT*syn*0.532391;
+MGMatrixLocal[39][38]:=GT*syn*0.413436;
+MGMatrixLocal[39][43]:=CG*nonsyn*0.177887;
+MGMatrixLocal[39][47]:=CT*nonsyn*0.266144;
+MGMatrixLocal[39][53]:=GT*nonsyn*0.184315;
+MGMatrixLocal[40][8]:=nonsyn*0.224061;
+MGMatrixLocal[40][24]:=CG*nonsyn*0.23836;
+MGMatrixLocal[40][32]:=nonsyn*0.308787;
+MGMatrixLocal[40][36]:=CG*nonsyn*0.247183;
+MGMatrixLocal[40][41]:=AC*syn*0.532391;
+MGMatrixLocal[40][42]:=syn*0.413436;
+MGMatrixLocal[40][43]:=AT*syn*0.0333855;
+MGMatrixLocal[40][44]:=GT*nonsyn*0.266144;
+MGMatrixLocal[41][9]:=nonsyn*0.224061;
+MGMatrixLocal[41][25]:=CG*nonsyn*0.23836;
+MGMatrixLocal[41][33]:=nonsyn*0.308787;
+MGMatrixLocal[41][37]:=CG*nonsyn*0.247183;
+MGMatrixLocal[41][40]:=AC*syn*0.0207881;
+MGMatrixLocal[41][42]:=CG*syn*0.413436;
+MGMatrixLocal[41][43]:=CT*syn*0.0333855;
+MGMatrixLocal[41][45]:=GT*nonsyn*0.266144;
+MGMatrixLocal[41][54]:=GT*nonsyn*0.184315;
+MGMatrixLocal[42][10]:=nonsyn*0.224061;
+MGMatrixLocal[42][26]:=CG*nonsyn*0.23836;
+MGMatrixLocal[42][34]:=nonsyn*0.308787;
+MGMatrixLocal[42][38]:=CG*nonsyn*0.247183;
+MGMatrixLocal[42][40]:=syn*0.0207881;
+MGMatrixLocal[42][41]:=CG*syn*0.532391;
+MGMatrixLocal[42][43]:=GT*syn*0.0333855;
+MGMatrixLocal[42][46]:=GT*nonsyn*0.266144;
+MGMatrixLocal[42][55]:=GT*nonsyn*0.184315;
+MGMatrixLocal[43][11]:=nonsyn*0.224061;
+MGMatrixLocal[43][27]:=CG*nonsyn*0.23836;
+MGMatrixLocal[43][35]:=nonsyn*0.308787;
+MGMatrixLocal[43][39]:=CG*nonsyn*0.247183;
+MGMatrixLocal[43][40]:=AT*syn*0.0207881;
+MGMatrixLocal[43][41]:=CT*syn*0.532391;
+MGMatrixLocal[43][42]:=GT*syn*0.413436;
+MGMatrixLocal[43][47]:=GT*nonsyn*0.266144;
+MGMatrixLocal[43][56]:=GT*nonsyn*0.184315;
+MGMatrixLocal[44][12]:=nonsyn*0.224061;
+MGMatrixLocal[44][28]:=CG*nonsyn*0.23836;
+MGMatrixLocal[44][32]:=AT*nonsyn*0.308787;
+MGMatrixLocal[44][36]:=CT*nonsyn*0.247183;
+MGMatrixLocal[44][40]:=GT*nonsyn*0.177887;
+MGMatrixLocal[44][45]:=AC*syn*0.532391;
+MGMatrixLocal[44][46]:=syn*0.413436;
+MGMatrixLocal[44][47]:=AT*syn*0.0333855;
+MGMatrixLocal[44][57]:=GT*nonsyn*0.184315;
+MGMatrixLocal[45][13]:=nonsyn*0.224061;
+MGMatrixLocal[45][29]:=CG*nonsyn*0.23836;
+MGMatrixLocal[45][33]:=AT*nonsyn*0.308787;
+MGMatrixLocal[45][37]:=CT*nonsyn*0.247183;
+MGMatrixLocal[45][41]:=GT*nonsyn*0.177887;
+MGMatrixLocal[45][44]:=AC*syn*0.0207881;
+MGMatrixLocal[45][46]:=CG*syn*0.413436;
+MGMatrixLocal[45][47]:=CT*syn*0.0333855;
+MGMatrixLocal[45][58]:=GT*nonsyn*0.184315;
+MGMatrixLocal[46][14]:=nonsyn*0.224061;
+MGMatrixLocal[46][30]:=CG*nonsyn*0.23836;
+MGMatrixLocal[46][34]:=AT*nonsyn*0.308787;
+MGMatrixLocal[46][38]:=CT*nonsyn*0.247183;
+MGMatrixLocal[46][42]:=GT*nonsyn*0.177887;
+MGMatrixLocal[46][44]:=syn*0.0207881;
+MGMatrixLocal[46][45]:=CG*syn*0.532391;
+MGMatrixLocal[46][47]:=GT*syn*0.0333855;
+MGMatrixLocal[46][59]:=GT*nonsyn*0.184315;
+MGMatrixLocal[47][15]:=nonsyn*0.224061;
+MGMatrixLocal[47][31]:=CG*nonsyn*0.23836;
+MGMatrixLocal[47][35]:=AT*nonsyn*0.308787;
+MGMatrixLocal[47][39]:=CT*nonsyn*0.247183;
+MGMatrixLocal[47][43]:=GT*nonsyn*0.177887;
+MGMatrixLocal[47][44]:=AT*syn*0.0207881;
+MGMatrixLocal[47][45]:=CT*syn*0.532391;
+MGMatrixLocal[47][46]:=GT*syn*0.413436;
+MGMatrixLocal[47][60]:=GT*nonsyn*0.184315;
+MGMatrixLocal[48][1]:=AT*nonsyn*0.224061;
+MGMatrixLocal[48][17]:=CT*nonsyn*0.23836;
+MGMatrixLocal[48][33]:=GT*nonsyn*0.353264;
+MGMatrixLocal[48][49]:=CT*syn*0.0333855;
+MGMatrixLocal[48][51]:=AC*nonsyn*0.247183;
+MGMatrixLocal[48][54]:=nonsyn*0.177887;
+MGMatrixLocal[48][58]:=AT*nonsyn*0.266144;
+MGMatrixLocal[49][3]:=AT*nonsyn*0.224061;
+MGMatrixLocal[49][19]:=CT*nonsyn*0.23836;
+MGMatrixLocal[49][35]:=GT*nonsyn*0.353264;
+MGMatrixLocal[49][48]:=CT*syn*0.532391;
+MGMatrixLocal[49][53]:=AC*nonsyn*0.247183;
+MGMatrixLocal[49][56]:=nonsyn*0.177887;
+MGMatrixLocal[49][60]:=AT*nonsyn*0.266144;
+MGMatrixLocal[50][4]:=AT*nonsyn*0.224061;
+MGMatrixLocal[50][20]:=CT*nonsyn*0.23836;
+MGMatrixLocal[50][36]:=GT*nonsyn*0.353264;
+MGMatrixLocal[50][51]:=AC*syn*0.532391;
+MGMatrixLocal[50][52]:=syn*0.413436;
+MGMatrixLocal[50][53]:=AT*syn*0.0333855;
+MGMatrixLocal[50][57]:=CT*nonsyn*0.266144;
+MGMatrixLocal[51][5]:=AT*nonsyn*0.224061;
+MGMatrixLocal[51][21]:=CT*nonsyn*0.23836;
+MGMatrixLocal[51][37]:=GT*nonsyn*0.353264;
+MGMatrixLocal[51][48]:=AC*nonsyn*0.308787;
+MGMatrixLocal[51][50]:=AC*syn*0.0207881;
+MGMatrixLocal[51][52]:=CG*syn*0.413436;
+MGMatrixLocal[51][53]:=CT*syn*0.0333855;
+MGMatrixLocal[51][54]:=CG*nonsyn*0.177887;
+MGMatrixLocal[51][58]:=CT*nonsyn*0.266144;
+MGMatrixLocal[52][6]:=AT*nonsyn*0.224061;
+MGMatrixLocal[52][22]:=CT*nonsyn*0.23836;
+MGMatrixLocal[52][38]:=GT*nonsyn*0.353264;
+MGMatrixLocal[52][50]:=syn*0.0207881;
+MGMatrixLocal[52][51]:=CG*syn*0.532391;
+MGMatrixLocal[52][53]:=GT*syn*0.0333855;
+MGMatrixLocal[52][55]:=CG*nonsyn*0.177887;
+MGMatrixLocal[52][59]:=CT*nonsyn*0.266144;
+MGMatrixLocal[53][7]:=AT*nonsyn*0.224061;
+MGMatrixLocal[53][23]:=CT*nonsyn*0.23836;
+MGMatrixLocal[53][39]:=GT*nonsyn*0.353264;
+MGMatrixLocal[53][49]:=AC*nonsyn*0.308787;
+MGMatrixLocal[53][50]:=AT*syn*0.0207881;
+MGMatrixLocal[53][51]:=CT*syn*0.532391;
+MGMatrixLocal[53][52]:=GT*syn*0.413436;
+MGMatrixLocal[53][56]:=CG*nonsyn*0.177887;
+MGMatrixLocal[53][60]:=CT*nonsyn*0.266144;
+MGMatrixLocal[54][9]:=AT*nonsyn*0.224061;
+MGMatrixLocal[54][25]:=CT*nonsyn*0.23836;
+MGMatrixLocal[54][41]:=GT*nonsyn*0.353264;
+MGMatrixLocal[54][48]:=nonsyn*0.308787;
+MGMatrixLocal[54][51]:=CG*nonsyn*0.247183;
+MGMatrixLocal[54][55]:=CG*nonsyn*0.413436;
+MGMatrixLocal[54][56]:=CT*syn*0.0333855;
+MGMatrixLocal[54][58]:=GT*nonsyn*0.266144;
+MGMatrixLocal[55][10]:=AT*nonsyn*0.224061;
+MGMatrixLocal[55][26]:=CT*nonsyn*0.23836;
+MGMatrixLocal[55][42]:=GT*nonsyn*0.353264;
+MGMatrixLocal[55][52]:=CG*nonsyn*0.247183;
+MGMatrixLocal[55][54]:=CG*nonsyn*0.532391;
+MGMatrixLocal[55][56]:=GT*nonsyn*0.0333855;
+MGMatrixLocal[55][59]:=GT*nonsyn*0.266144;
+MGMatrixLocal[56][11]:=AT*nonsyn*0.224061;
+MGMatrixLocal[56][27]:=CT*nonsyn*0.23836;
+MGMatrixLocal[56][43]:=GT*nonsyn*0.353264;
+MGMatrixLocal[56][49]:=nonsyn*0.308787;
+MGMatrixLocal[56][53]:=CG*nonsyn*0.247183;
+MGMatrixLocal[56][54]:=CT*syn*0.532391;
+MGMatrixLocal[56][55]:=GT*nonsyn*0.413436;
+MGMatrixLocal[56][60]:=GT*nonsyn*0.266144;
+MGMatrixLocal[57][12]:=AT*nonsyn*0.224061;
+MGMatrixLocal[57][28]:=CT*syn*0.23836;
+MGMatrixLocal[57][44]:=GT*nonsyn*0.353264;
+MGMatrixLocal[57][50]:=CT*nonsyn*0.247183;
+MGMatrixLocal[57][58]:=AC*nonsyn*0.532391;
+MGMatrixLocal[57][59]:=syn*0.413436;
+MGMatrixLocal[57][60]:=AT*nonsyn*0.0333855;
+MGMatrixLocal[58][13]:=AT*nonsyn*0.224061;
+MGMatrixLocal[58][29]:=CT*nonsyn*0.23836;
+MGMatrixLocal[58][45]:=GT*nonsyn*0.353264;
+MGMatrixLocal[58][48]:=AT*nonsyn*0.308787;
+MGMatrixLocal[58][51]:=CT*nonsyn*0.247183;
+MGMatrixLocal[58][54]:=GT*nonsyn*0.177887;
+MGMatrixLocal[58][57]:=AC*nonsyn*0.0207881;
+MGMatrixLocal[58][59]:=CG*nonsyn*0.413436;
+MGMatrixLocal[58][60]:=CT*syn*0.0333855;
+MGMatrixLocal[59][14]:=AT*nonsyn*0.224061;
+MGMatrixLocal[59][30]:=CT*syn*0.23836;
+MGMatrixLocal[59][46]:=GT*nonsyn*0.353264;
+MGMatrixLocal[59][52]:=CT*nonsyn*0.247183;
+MGMatrixLocal[59][55]:=GT*nonsyn*0.177887;
+MGMatrixLocal[59][57]:=syn*0.0207881;
+MGMatrixLocal[59][58]:=CG*nonsyn*0.532391;
+MGMatrixLocal[59][60]:=GT*nonsyn*0.0333855;
+MGMatrixLocal[60][15]:=AT*nonsyn*0.224061;
+MGMatrixLocal[60][31]:=CT*nonsyn*0.23836;
+MGMatrixLocal[60][47]:=GT*nonsyn*0.353264;
+MGMatrixLocal[60][49]:=AT*nonsyn*0.308787;
+MGMatrixLocal[60][53]:=CT*nonsyn*0.247183;
+MGMatrixLocal[60][56]:=GT*nonsyn*0.177887;
+MGMatrixLocal[60][57]:=AT*nonsyn*0.0207881;
+MGMatrixLocal[60][58]:=CT*syn*0.532391;
+MGMatrixLocal[60][59]:=GT*nonsyn*0.413436;
+
+
+Model MGL=(MGMatrixLocal,codon3x4,0);
+TRY_NUMERIC_SEQUENCE_MATCH=0;
+ACCEPT_ROOTED_TREES=0;
+Tree mixtureTree=(AF097023_HHV1_STRAIN_HSZP{BSREL2},(JN561323_HHV2_STRAIN_HG52{MGL},AB218904_CHHV_PANTROGLODYTES{MGL})Node2{MGL},(DQ149153_HVP2_STRAIN_X313_PAPIOCYNOCEPHALUS{MGL},AF533768_MHV1_STRAIN_E2490_MACACAMULATTA{MGL})Node5{MGL});
+
+mixtureTree.AF097023_HHV1_STRAIN_HSZP.t=0;
+mixtureTree.AF097023_HHV1_STRAIN_HSZP.Paux1=0.9;
+mixtureTree.AF097023_HHV1_STRAIN_HSZP.Paux1:<1;
+mixtureTree.AF097023_HHV1_STRAIN_HSZP.omega2=1;
+mixtureTree.AF097023_HHV1_STRAIN_HSZP.omega1=10;
+mixtureTree.JN561323_HHV2_STRAIN_HG52.syn=0;
+mixtureTree.JN561323_HHV2_STRAIN_HG52.nonsyn=0;
+mixtureTree.AB218904_CHHV_PANTROGLODYTES.nonsyn=0;
+mixtureTree.AB218904_CHHV_PANTROGLODYTES.syn=0;
+mixtureTree.Node2.syn=0;
+mixtureTree.Node2.nonsyn=0;
+mixtureTree.DQ149153_HVP2_STRAIN_X313_PAPIOCYNOCEPHALUS.syn=0;
+mixtureTree.DQ149153_HVP2_STRAIN_X313_PAPIOCYNOCEPHALUS.nonsyn=0;
+mixtureTree.AF533768_MHV1_STRAIN_E2490_MACACAMULATTA.nonsyn=0;
+mixtureTree.AF533768_MHV1_STRAIN_E2490_MACACAMULATTA.syn=0;
+mixtureTree.Node5.syn=0;
+mixtureTree.Node5.nonsyn=0;
+DataSet ds = ReadDataFile(USE_NEXUS_FILE_DATA);
+DataSetFilter dsf = CreateFilter(ds,3,"0-2282","0,2,1,4,3","TAA,TAG,TGA");
+ASSUME_REVERSIBLE_MODELS=1;
+LikelihoodFunction three_LF = (dsf,mixtureTree);
+
+VERBOSITY_LEVEL = 10;
+OPTIMIZATION_TIME_HARD_LIMIT = 5;
+OPTIMIZATION_METHOD = 0;
+
+Optimize(res, three_LF);
+
+LIKELIHOOD_FUNCTION_OUTPUT = 4;
+
+fprintf (stdout, "\n", three_LF, "\n");
+
+END;
\ No newline at end of file
diff --git a/tests/hbltests/RegressionTesting/res/69genes.test.nex b/tests/hbltests/RegressionTesting/res/69genes.test.nex
new file mode 100644
index 0000000..36cabe1
--- /dev/null
+++ b/tests/hbltests/RegressionTesting/res/69genes.test.nex
@@ -0,0 +1,65 @@
+#NEXUS
+
+BEGIN DATA;
+DIMENSIONS  NTAX=50 NCHAR=2198;
+FORMAT DATATYPE=DNA GAP=- MISSING=?;
+MATRIX
+
+Nefrabcubahf_anfbavnr          ATGAACATAGCGCCTGTAGTCGAAGTACTACAAGGCCGTGCGGTAGGCGAAGAAGTCACCGTTCGTGGCTGGGTACGTACAAGGAGAGATTCAAAAGCCGGTTTCTCATTCCTCGCTATCTATGACGGTTCCTGCTTTAATCCATTACAGGCTATTGTAAATAAAGAACTAGATAATTATGAAAACGACGTTTTACACCTGACCACCGGCTGTTCGGTTGAAGTAACCGGCATTGTCAAGCCATCGGAAGGTCAAGGACAACAATTTGAATTATCTGCTACTCAGGTTGTCGTCGTCGGTATAGTAGAAAACCCGGATAGTTATCCGATGGCTGCCAAGCGTCATAGCGTTGAATATTTACGCGAAGTGGCACATTTACGTCCGCGCACCAATCTTATCGGCGCCATTGCCCGTGTTCGCAATACGCTAGCCCAAGCGATTCACCGTTTCTTTCATGAAGA [...]
+Onhznaavn_pvpnqryyvavpbyn      ATGATCATACTACCCATAGCAAAAATATTACAAGGAATTGCAGCTGATCATGAAGTCATTGTACAAGGTTGGGTGCGTACTCGTAGGGATTCTAAAGCAGGAATTTCATTTCTTTCTATTTACGATGGATCATGTTTAGATTCATTACAAGTAATAATTAATCATGATCTTCCAAATTATAAAAGTGATGTTTTGCATTTAACTACAGGCTGCTCAGTAGTAATAACTGGAAGTATCGTTACATCAATTGGTGTTGGTCAGCACTTTGAGATACAGGCTAAAAATATTAAAGTACTAGGGTGGGTTAAAAATCCAGAAACATATCCTATAACAGCTAAAAAGCATAGTCTTGAATTTTTAAGAGAAGTAGCACACTTACGCCCACGTACTAATATCATTGGCGCAGTTACTAGAGTACGACATACTTTAGCACAGGCTATTCATCGTTTTATGCATATAGA [...]
+Oybpuznaavn_sybevqnahf         ATGAATACTATATCTATAGTAAAAATTTTAAATGAATTTCTACAAAACACTGAAATTACTTTATATGGTTGGATTCGAACAAGACGACATTCTAAAACTAAAATTACCTTTCTTAATTTATATGATGGATCTTGTTTAGAATCCTTACAAATAGTGGTAAAAAACAACTTACATAATTATGAAACAGATATTCTAAAATTAACTACTGGTTGTTCTATTATAGCTAAAGGCTACATAACTAATTCACTTGGTACAAAACAACGTATAGAACTTATTGCAACATATATTCAAGTATTAGGGTGGATAGATAATCCTAGTACTTATCCAATAACCACTAAAAAACATTCTATGGAATACTTAAGAAATGTTGCGCATTTAAGACCTCGTACACATATTTTTGGAGCTATTTCTCGGATTAGACATGTACTATTTCAATCAATTCACAACCTTATGAATACAAA [...]
+Oybpuznaavn_craaflyinavphf     ATGAATGTAGTATCAGTAGTAGATATACTAAGCGGTCATTCAAAAAATACTGAAATTACTATACAAGGTTGGATTCGAACCCGACGAGATTCTAAAGCTAAAATCTCCTTCCTAGATTTATACGATGGTTCATGTATCAACTCGTTACAAATAATTGCGTATGATAAGTTACATAACTATAAAAATGAGATATTGCGTTTAACTAGCGGTTGCTCAGTTATAATTGTGGGAATAATAGTTAAATCCATTGGTATAAAACAACATGTTGAAGTAATTGCAAAAAACATTAAAATATTAGGATGGATAGAAGATCCTAGTACTTACCCAATAACTGCCAAAAAACATACTATGGAATATCTGCGTGAAGTTTCTCATCTGAGACCACGTACTAATACAATTGGTGCTGTTGCTCGCATCAGAGACACATTATCACAAGCTATTCATAACTTTTTGCATAAACA [...]
+Ohpuaren_ncuvqvpbyn_fge_NCF    ATGAATAGAGTATCAATATCAGATATATATAAAGATGATATAGTAAATAGTTTAATTACTGTATGTGGATGGGTTCGGAACCGTAGAAGTTCAAAATCTGGTTTTTCTTTTATTACAATTTATGATGGTTCATGTTTTAATTCTATACAAGTGATTGCAAATAATACTTTGCCTAATTATTATAAAGAAATACTACACCTAACAACTGGGTGTTCTGTGATGCTTAGTGGAAAATTAATACTATCAATTGGAGATAAACAAAAATATGAAATTCAATTGAAAAAAATTAAAGTTTTGGGTTGGGTTGAAAACCCAGAGACTTATCCAATATCTTCTAAAAAACATAGCACAGAATATCTGAGAGAAGTAGCACATTTACGATCTCGAACAAATTTAATAGGCGCGATAGCTCGAATAAGAAATTATATATTACACTCATTACATCATTTTTTTTATAAAGA [...]
+Ohpuaren_ncuvqvpbyn_fge_Oc     ATGAAAACGGTTTCTATATTTGATATATACTTAAATAAGAAATTAAATAGTAAAATTAATATTCAGGGCTGGGTTAGAAACAGAAGAAGGTCAAAGTTAGGTTTATTATTTATTGATCTTTATGATGGGTCGTGTTTATATACTATGCAAGTAGTAGTAAAAGATATTTTGTCAAATTATGATAGTGAAATTTCAAAGTTATCTGTCGGGTGTTCGATAAATGTTTTTGGAGTGTTAATATCATCTATTGGAACAAAACAAAAATATGAAATTCAAGCAAAAGTAGTTAAAGTTATTGGTATAATTAATAATCCTGGTAGTTATCCTATTTCATCTAAATATCATACAATGAAACATTTAAGGAATGTTCCTCATTTAAGATCTAGAACAAATTTTTTTGGTGCTGTTTCGAGAGTAAGAAATTATTTATTTAATGCATTACATGAATTTCTTTTTAAAAA [...]
+Ohpuaren_ncuvqvpbyn_fge_Pp     ATGCCTATAACTTCTATATTAGACATTTATACAAAAAAATATTTAAATAAAGAAATTACAATTAATGGATGGATTCGAAGTAAAAGAACTTCAAAAATAGGAATATCTTTTTTAACTATAACTGATGGATCATCAATTAATACTATTCAAGTTATTGCTAAAAAATCTTTATATAATTATGTAACAGAAATTATTAAACTTACTACAGGTTGTTCAGTTATTATATCTGGAGTTTTAGTTTTATCTCCAGGAAATTTACAAATTTATGAAATTCAATCTAATAAAATTAAAGTAATTGGTTGGATAAAAAATCCTGAAAAATATCCTATATCAGCAAAAAAACATACTATAGAACATCTTAGAAAATTTTGTCATTTACGACCACGTACAAATTTAATTAGTGCTATTTCTAGAATTAGAAATATAGTTTTTCAATCTTTAAATTTATTTTTATTTAACAA [...]
+Ohpuaren_ncuvqvpbyn_fge_Ft     ATGAGTAGAATATCAATATCAGAAATTTATAAAGATGATATAGTAAATACCCCTATCACTATATTTGGATGGGTTCGAAGTCGTAGAAGTTCAAAATCTGGTTTTTCTTTTATTACGGTTTATGACGGTTCGTGTTTGAATTCTGTACAAGTTGTTGCCGATAAAACCTTATCTAATTATTACAAAGATATATTGCATTTAACTATTGGATGTTCTGTAACAATAACTGGAATTCTTATTTTATCTATTGGAGATAAACAAAAATATGAAATAAAAGCAACAAAGTTTCAAGTGTTAGGATGGATTAAAAATCCAGATACTTATCCAATATCTGCTAAAAAGCATAGTCTAGAATACCTAAGAGAAGTAGCACATTTACGTTCTAGAACTAATTTGATTGGCGTAATAGTAAGAATAAGGCATCATATATTTCAATCATTACATAAATTTTTAAATAAACA [...]
+Pvgebonpgre_xbfrev             ATGAGCGTAGCGCCTGTAGTCGACGTACTGCAAGGCCGGGCGGTTGATAGTGAAGTCACCGTTCGCGGCTGGATACGTACAAGGAGAGATTCTAAAGCTGGCATCTCTTTCCTCGCCGTCTATGACGGTTCCTGCTTTAATCCATTACAGGCCGTCGTTAATAATAATTTGCCCAATTATCAGGATGAAGTTCTGCATTTAACTACCGGTTGTTCTGTCGAAGTGACAGGGACAGTCGTTGCTTCCCTTGGTCAAGGGCAGAACTTTGAACTGCAAGCGACGAAAATCGTCGTGATCGGTCTGGTTGAAGATCCTGACACCTATCCCATGGCCGCTAAACGCCACAGCATTGAATACCTGCGCGAAGTTGCTCACCTGCGTCCACGTACCAACCTGATTGGTGCCGTTGCTCGTATGCGCCATACCCTTGCTCAAGCACTACACCGTTTCTTCCATGAAAA [...]
+Pvgebonpgre_ebqragvhz          ATGAGCGTTGTGCCTGTAGCCGACGTACTCCAGGGCCGCGCCGTTGACAGCGAAGTCACGGTCCGCGGATGGGTGCGTACCCGCCGAGATTCTAAAGCTGGCTTTTCATTCCTCGCCGTCTATGACGGTTCCTGCTTTGATCCTGTACAGGCCGTTATTAATAATTCTCTGCCCAATTACAATCAGGAAGTGCTGCGTCTGACCACCGGTTGCTCGGTGATTGTCACCGGTAAAGTCGTGGCTTCCCAGGGCCAGGGTCAAAGCTTTGAGATCCAGGCGACCAGCGTGGAAGTGACCGGCTGGGTGGAAGACCCGGACACCTACCCGATGGCGGCCAAGCGCCACAGCATCGAGTATCTGCGTGAAGTAGCGCACCTGCGTCCGCGCACCAACCTGATTGGCGCGGTAGCTCGCGTGCGTCATACCCTGGCGCAGGCGCTGCACCGTTTCTTCGACGAACA [...]
+Pebabonpgre_fnxnmnxvv          ATGAGCGTAGTGCCTGTAGTCGATGTACTGCAAGGCCGTGCCGTTGACAGCGAAGTCACCGTGCGCGGCTGGGTACGTACCCGGAGAGATTCTAAAGCCGGTATCTCCTTTATCGCCGTTTATGACGGCTCCTGCTTTAATCCATTACAGGCTGTCGTTAATAATAATCTCTCGAATTACCAGGATGACGTACTGCGTCTGACTACCGGTTGCTCCGTTGAAATCACCGGTAACGTCGTCGCCTCTCCAGGTGAAGGCCAAAGCTTCGAGCTGCAAGCGACCAACGTCAACGTCGTCGGCTGGGTTGACGATCCCGATACCTACCCGATGGCAGCAAAGCGTCACAGTATCGAATACCTGCGCGAAGTCGCGCACTTGCGTCCACGAACCAATCTGATCGGTGCCGTTGCGCGCGTTCGTCATACGCTGGCGCAGGCGATTCATCGCTTCTTCCACGAGAA [...]
+Pebabonpgre_ghevprafvf         ATGAGCGTTGTGCCTGTAGCCGACGTACTCCAGGGCCGCGCCGTTGACAGTGAAGTCACCGTGCGCGGGTGGGTGCGTACCCGAAGAGATTCAAAAGCTGGCATCTCCTTCCTCGCCGTTTATGACGGTTCCTGCTTTGATCCGATACAGGCTGTCATTAATAATTCTCTGCCCAATTATAATGAAGAGGTTTTGCACCTCACGACGGGCTGCTCAGTTATCGTCACCGGCAAAGTGGTTGAATCCCCGGGCGAAGGCCAGAGCTTCGAACTGCAGGCCACGCAGGTTGAAGTGACCGGCTGGGTGGACGATCCGGATACCTACCCGATGGCGGCCAAGCGCCACAGCATCGAGTATCTGCGTGAAGTGGCGCATCTGCGTCCGCGCACCAACCTGATTGGCGCCGTGGCACGCGTACGCCACACGCTGGCGCAGGCGCTGCACCGTTTCTTCCACGAGCA [...]
+Qvpxrln_qnqnagvv_Rpu586        ATGAGCGTAGTGCCTGTAGTCGACGTACTGCAAGGCCGTGCCGTTGACAGTGACGTCACCGTGCGCGGCTGGGTACGTACCCGGAGAGACTCTAAAGCCGGTATTTCCTTTATTGCCGTCTATGACGGTTCCTGCTTTGATTCGCTACAGGCTGTCGTCAATAATAATCTTGCTAATTATCAGAGCGACATCTTGCGCCTGACCACCGGCTGCTCGGTAGAAGTCACCGGCAAGGTAGTGGAATCTCCCGGCGAAGGCCAAAGCTTCGAACTGCTGGCCACCGAACTCAAAGTTGTCGGCTGGGTGGATGACCCGGACACGTACCCGATGGCGGCTAAGCGCCACAGTATCGAATATCTGCGTGAAGTCGCGCATTTACGCCCTCGTACCAACCTGATCGGTGCTGTCGCCCGTGTGCGCCACACACTGGCGCAGGCTATTCATCGCTTCTTCCATCAGAA [...]
+Qvpxrln_qnqnagvv_Rpu703        ATGAGCGTTGTGCCTGTAGTCGACGTACTGCAAGGCCGTGCCGTTGACAGCGAAGTCACCGTGCGCGGCTGGGTGCGTACCCGGAGAGACTCTAAAGCCGGTATTTCTTTCATCGCCGTCTACGACGGTTCCTGCTTTAATCCGCTACAGGCTGTCGTCAATAATCATCTGGACAATTATCAGAGTGAGATTCTCCGCCTGACGACCGGCTGTTCGGTGGAAGTCACCGGCAACGTGGTCGAATCCCCGGGAGAAGGCCAAAGCTTTGAGTTACAAGCCACCCATGTCGCCGTCGTCGGTTGGGTTGACGACCCCGATACGTATCCAATGGCCGCGAAGCGCCACAGTATCGAATATCTGCGCGAAGTGGCTCACCTGCGCCCTCGCACCAATCTGATTGGCGCCGTAGCGCGTGTACGCCACACGTTGGCACAGGCTATTCACCGTTTCTTCCATCAGAA [...]
+Qvpxrln_mrnr                   ------------------------------------------------------------------------GTGCGTACCCGAAGAGATTCAAAAGCTGGCATCTCCTTCCTCGCCGTTTATGACGGTTCCTGCTTTGATCCGATACAGGCTGTCATTAATAATTCTCTGCCCAATTACAATGAAGAGGTTTTACACCTCACGACGGGCTGCTCGGTTATCGTCACCGGCAAGGTGGTGGAATCCCCGGGCGAAGGCCAGAGCTTTGAGCTGCAGGCAACCCAGGTGGAAGTGACTGGCTGGGTGGACGATCCGGACACCTACCCGATGGCGGCCAAGCGCCACAGTATTGAGTATCTGCGTGAAGTCGCGCACCTGCGCCCGCGTACTAACCTGATAGGTGCCGTGGCTCGCGTACGCCACACGCTGGCGCAGGCGCTGCACCGTTTCTTCCACGAGCA [...]
+Rqjneqfvryyn_vpgnyhev          ATGAGCGTAGTGCCTGTAGTCGACGTACTGCAAGGCCGCGCGGTGGACACTGAGGTCACCGTTCGTGGCTGGGTACGTACCCGGAGAGATTCTAAAGCCGGTATCTCCTTCCTCGCCGTTTATGACGGCTCCTGCTTTAATCCGTTACAGGCCGTCGTAAATAATTCTCTGCCGAATTATGAAAGCGAGGTGCTGCGCCTGACCACCGGTTGCTCCCTTGAGGTCAGCGGCCGGGTCGTCGCGTCACCGGGCGAGGGCCAGAGCTTCGAGCTGCAGGCCACCGCCATTAAGGTGGTTGGCTGGGTCGATGATCCGGACACCTATCCGATGGCCGCCAAGCGCCACAGCATCGAATACCTGCGCGAGGTCGCCCACCTGCGTCCGCGCACCAACCTGATCGGTGCCGTCGCCCGCGTGCGTCACACCTTGGCACAGGCCATTCATCGCTATTTCAACGAAAA [...]
+Rqjneqfvryyn_gneqn             ATGAGCGTAGTGCCTGTAGTCGACGTACTGCAAGGCCGCGCGGTAGACACTGAGGTCACCGTTCGTGGCTGGGTACGTACCCGGAGAGATTCTAAAGCCGGTATCTCCTTCCTCGCCGTTTATGACGGCTCCTGCTTTAATCCGTTACAGGCCGTCGTGAATAATTCTCTGCCGAATTATGAAGATGAAGTGCTGCGCCTGACCACCGGCTGCTCCGTGGAAGTCAGCGGCCGGGTCGTTGCGTCGCCGGGCGAAGGCCAGAGCTTCGAGCTGCAGGCCACCGCCATTAAGGTGGTCGGCTGGGTCGACGATCCGGATACCTATCCGATGGCCGCCAAGCGCCACAGCATCGAATACCTGCGCGAGGTCGCCCACCTGCGTCCGCGCACCAACCTGATCGGCGCCGTCGCCCGCGTGCGTCACACCCTGGCACAGGCTATTCACCGCTATTTCAACGAAAA [...]
+Ragrebonpgre_pybnpnr           ------------------------------------------------------------------------GTGCGTACCCGCCGAGATTCTAAAGCTGGCATCTCCTTCCTTGCCGTCTATGACGGTTCCTGCTTTGATCCTGTACAGGCCGTCATTAATAATTCTCTGCCCAATTACAATGATGACGTTCTGCACCTGACAACCGGTTGTTCCGTAATTGTTACCGGCGTGGTTGTCGCATCACCGGGTCAGGGTCAGAGTTTCGAAATTCAGGCCACTGCCGTTGAAGTAACTGGCTGGGTTGAAGATCCTGATACCTACCCGATGGCCGCAAAACGTCACAGCATCGAATATCTGCGTGAAGTGGCTCACCTGCGTCCACGCACCAACCTTATTGGTGCGGTGGCCCGTGTCCGCCACACGCTGGCGCAGGCACTGCATCGCTTCTTCGATGAGCA [...]
+Ragrebonpgre_fc_638            ATGAGCGTTGTGCCTGTAGCCGACGTACTCCAGGGCCGCGCCGTTGACCAAGAAGTCACCGTGCGCGGATGGGTGCGTACTCGCCGAGATTCTAAAGCTGGCATCTCCTTCCTCGCCGTCTATGACGGTTCCTGCTTTGATCCTGTACAGGCCGTCATTAATAATTCTCTGCCCAATTACAATGACGACGTTCTGCACCTGACGACCGGTTGCTCCGTCATCGTTACGGGTGTTGTGGTCGCTTCCCCGGGTCAAGGCCAGAGCTTTGAACTGCAGGCGACGGCAATTGAAGTCACTGGCTGGGTTGAAGATCCTGACACCTACCCAATGGCGGCTAAACGCCATAGCATTGAGTATCTGCGTGAAGTCGCTCACCTGCGCCCGCGCACCAACATGATCGGCGCCGTGGCCCGTGTGCGCCACACTCTGGCGCAGGCCCTGCATCGCTTCTTCGATGAGCA [...]
+Rejvavn_nzlybiben_NGPP_49946   ATGAGCGTTGTGCCTGTAGCGGATGTACTGCACGGCCGGACGGTAGACAGTGAAGTCACCGTACGTGGCTGGGTGCGTACCCGAAGAGATTCGAAAGCCGGTATTTCCTTTATCGCCGTTTATGACGGTTCCTGCTTTGATCCGGTTCAGGCTGTCGTCAATAATTCTCTGAATAACTATCAGAATGAGGTATTACGTCTGACGACCGGCTGCTCGGTTGTGATTACGGGGAAAGTCGTTGCATCGCCGGGTCAGGGACAAAGCTTTGAAATTCAGGCAACCGAGGTTGAAGTGGTGGGCTGGGTTGATGACCCGGATACCTATCCGATGGCGGCGAAGCGCCACAGCATCGAATATCTGCGTGAAGTTGCGCACCTGCGCCCACGCACTAACCTGATTGGCGCGGTGGCGCGCGTTCGCCATACTCTGGCACAGGCGCTGCATCGTTTCTTCGACGAACA [...]
+Rejvavn_nzlybiben_PSOC1430     ATGAGCGTTGTGCCTGTAGCGGATGTACTGCACGGCCGGACGGTAGACAGTGAAGTCACCGTACGTGGCTGGGTGCGTACCCGAAGAGATTCGAAAGCCGGTATTTCCTTTATCGCCGTTTATGACGGTTCCTGCTTTGATCCGGTTCAGGCTGTCGTCAATAATTCTCTGAATAACTATCAGAATGAGGTATTACGTCTGACGACCGGCTGCTCGGTTGTGATTACGGGGAAAGTCGTTGCATCGCCGGGTCAGGGACAAAGCTTTGAAATTCAGGCAACCGAGGTTGAAGTGGTGGGCTGGGTTGATGACCCGGATACCTATCCGATGGCGGCGAAGCGCCACAGCATCGAATATCTGCGTGAAGTTGCGCACCTGCGCCCACGCACTAACCTGATTGGCGCGGTGGCGCGCGTTCGCCATACTCTGGCACAGGCGCTGCATCGTTTCTTCGACGAACA [...]
+Rejvavn_ovyyvatvnr             ATGAGCGTTGTGCCTGTAGCGGATGTACTGCAAGGCCGGGCGGTTGACAGTGAAGTCACCGTACGTGGCTGGGTACGTACACGAAGAGATTCAAAAGCTGGTATTTCCTTCATCGCCGTATATGACGGCTCCTGCTTTAATCCCGTCCAGGCTGTCGTCAATAATTCTCTGAATAATTATCAGGACGAAGTACTGCGACTGACCACCGGTTGTTCGGTGATCATTACCGGCAAAGTGGTGGAATCACCGGGCGAAGGCCAGAGCTTTGAAATCCAGGCCACTGCAGTAGAAGTGGTCGGCTGGGTGGATGATCCTGATACCTATCCTATGGCTGCTAAACGTCACAGCATCGAATACCTGCGTGAAGTGGCTCACCTGCGCCCGCGTACTAACCTGATCGGTGCCGTGGCGCGTGTTCGTCATACGCTGGCGCAAGCGCTGCATCGTTTCTTTGATGAGCA [...]
+Rejvavn_clevsbyvnr             ATGAGCGTTGTGCCTGTAGCGGATGTACTGCACGGCCGGACGGTAGACAGTGAAGTCACCGTACGTGGCTGGGTGCGTACCCGAAGAGATTCGAAAGCCGGTATATCCTTTATCGCCGTTTATGACGGTTCCTGCTTTAATCCGGTTCAGGCTGTCGTCAATAATTCTCTGAATAATTATCAGGATGAAGTATTACGTCTGACGACCGGCTGCTCGGTAGTGATTACGGGAAAAGTCGTTGCATCACCGGGTCAGGGTCAGAGCTTTGAAATTCAGGCGACCGAGGTCGAAGTGGTCGGCTGGGTCGACGACCCGGATACCTATCCGATGGCGGCAAAGCGCCACAGCATCGAATATCTGCGTGAAGTGGCGCACCTGCGCCCGCGTACAAACCTGATTGGCGCGGTGGCGCGCGTTCGCCATACTCTGGCACAGGCGCTGCATCGTTTCTTCGACGAACA [...]
+Rejvavn_gnfznavrafvf           ATGAGCGTTGTGCCTGTAGCGGATGTACTGCACGGCCGGACGGTAGACAGTGAAGTCACCGTACGCGGCTGGGTGCGTACCCGGAGAGATTCGAAAGCCGGTATTTCCTTTATCGCCGTTTATGACGGTTCCTGCTTTAATCCGGTCCAGGCTGTCGTCAATAATTCTCTGAATAATTATCAGGATGAAGTATTACGCCTGACCACCGGCTGCTCGGTTGTCATTACGGGGAAAGTGGTTGAGTCACCGGGCGAGGGTCAAAGCTTTGAAATTCAGGCGACTCACGTCGAGGTGATCGGCTGGGTTGACGACCCGGATACCTATCCAATGGCGGCCAAACGCCACAGCATTGAATATCTGCGTGAAGTTGCGCACCTGCGCCCACGCACGAATCTGATTGGCGCGGTAGCACGCGTTCGCCATACTCTGGCACAGGCGCTGCATCGCTTCTTTGACGAACA [...]
+Rfpurevpuvn_pbyv               ATGAGCGTTGTGCCTGTAGCCGACGTACTCCAGGGCCGTGCCGTTGACAGCGAAGTCACCGTGCGCGGATGGGTACGTACCCGCCGAGATTCAAAAGCTGGCATCTCCTTCCTCGCCGTTTATGACGGTTCCTGCTTTGATCCTGTACAGGCTGTCATCAATAATTCTCTGCCCAATTACAATGAAGACGTCCTGCGTCTGACCACCGGCTGCTCGGTCATTGTGACGGGTAAAGTCGTGGCGTCGCCGGGCCAGGGGCAACAATTTGAAATTCAGGCCAGCAAGGTTGAAGTTGCTGGTTGGGTTGAAGATCCAGACACTTACCCGATGGCGGCAAAACGCCACAGCATTGAGTATCTGCGTGAAGTCGCTCACCTGCGTCCGCGCACAAACCTGATTGGTGCCGTCGCGCGCGTTCGCCATACGCTGGCGCAGGCGCTGCATCGCTTCTTTAACGAGCA [...]
+Unrzbcuvyhf_vasyhramnr         TCTAAAGTGGCATCAATTGTTGATGTATTACAAGGGAAAGCGATTGGTGAAACCGTCACTGTGCGTGGTTGGGTTCGTACCCGTCGCGATTCTAAAGCAGGCTTATCTTTCTTAGCGGTTTATGACGGTTCTTGTTTTGATCCAATTCAAGCGATTATTAATAACGATATTGAAAATTACGAAAGCGAAATTTTACGTTTAACAACAGGCTGTTCTGTGATTGTAACCGGTAAAGTCGTTGAATCACCTGCAGAAGGACAAGCGGTTGAATTACAAGCAGAAAAAGTGGAAGTGACAGGGTTTGTTGAAGATCCTGATACTTACCCAATGGCAGCAAAACGCCACTCTATCGAATATTTACGCGAAGTAGCTCACTTACGCCCTCGTACCAATATTATTGGCGCGGTCGCACGTGTTCGCCATTGCTTATCTCAAGCAATTCACCGTTTCTTCCATGAGCA [...]
+Unzvygbaryyn_qrsrafn           ATGAAAACAGTCCCCCTGGTGGATGTACTACAAGGACATGACCTTGGCCACACAATCATTGTGCGTGGTTGGGTACGCACACGCCGGGATTCTAAATCCGGGATTTCCTTTGTTGCACTTTATGATGGCTCCTGTTTTGACACACTCCAGATCGTGATTGAGGATTCGCTCGAAAATTATCACGATGACATTCTGCATTTAACCACCGGTTGCTCAATAGAAGTGAGCGGCACAGTGGTTGCTTCTCAAGGTAAGGGGCAAAAATTTGAAATCAGGGCAAACCACCTAAAGGTCATAGGTTGGGTGGAAGATCCCGAAACCTATCCTATGAGCCCTAAACGTCATAGCGTTGAATATTTACGCGAAGTGGCACATTTGCGCCCTCGTACGAATTTGATAGGGGCTGTCACACGAATACGTCATCATTTGGCGCAAGCCATTCATCGTTTTTTTCATGAAAA [...]
+Vfuvxnjnryyn_pncfhyngn         ATGAAAACTATGCTGGTAGCGGATATACTAAATGGTAGGAAAGTAGAAAATAAAGTTATTATACGTGGATGGGTCCGTACTAGAAGAGATTCAAAAGCAGGTATTTCTTTTATTGCTATTTATGATGGTTCTTGTGTAAATACTGTGCAGGTTATAGCTAATAATAATCTTAAAAATTACAAGAGTGAGATCCTACACCTGACATCAGGTTGTTCTGTATCAATTGCCGGATATGTAAAAAAGTCTCCAAGTAAAGGCCAATCTGTTGAGATTTATGCTATACAAATTGATGTAATAGGGTGGATAGACAAACCTGAAACTTACCCAATAGCTCCTAAAAAACACAGTATGGAATATTTGAGAGAAATAGCACACCTACGTCCTCGAACAAATTTGATAGGTTCAGTGACACGTATCCGTCATACTTTAGCATTAGCTCTCCATCAATTTTTTGATCAACA [...]
+Xyrofvryyn_carhzbavnr          ATGAGCGTTGTGCCTGTAGCCGACGTACTCCAGGGCCGCGACGTTGACAGCGAAGTCACCGTACGCGGATGGGTACGTACCCGCCGAGATTCAAAAGCTGGCATCTCCTTCCTCGCCGTTTATGACGGTTCCTGCTTTGATCCTGTACAGGCTGTCATCAATAATTCTCTGCCCAATTACAATGAAGAAGTGCTGCGCCTGACCACCGGCTGCTCGGTCATCGTGACGGGTAAGGTTGTCGCCTCTCCGGGGCAGGGTCAGAGCTTTGAAATTCAGGCCACCCACGTTGAAGTCAGCGGCTGGGTTGAAGATCCGGATACCTACCCGATGGCGGCGAAGCGCCACAGCATCGAGTATCTGCGTGAAGTGGCGCACCTGCGTCCGCGCACCAACATGATTGGCGCGGTTGCCCGCGTTCGCCACACGCTGGCGCAGGCGCTGCACCGTTTCTTTGATGAGCA [...]
+Xyrofvryyn_inevvpbyn           ATGAGCGTTGTGCCTGTAGCCGACGTACTCCAGGGCCGCGCCGTTGACAGCGAAGTCACCGTGCGCGGATGGGTGCGTACCCGCCGAGATTCAAAAGCTGGCATCTCCTTCCTCGCCGTTTATGACGGTTCCTGCTTTGATCCTGTACAGGCTGTCATTAATAATTCTCTGCCCAATTACAATGAAGACGTATTGCGCCTGACAACCGGCTGCTCGGTTATCGTCACAGGTAAAGTCGTTGCGTCTCCAGGACAAGGGCAAAGTTTTGAAATTCAGGCCACCACGGTTGAAGTAACCGGTTGGGTTGAAGATCCTGATACCTATCCGATGGCGGCAAAACGCCACAGTATCGAATATCTGCGTGAAGTCGCGCACCTGCGTCCGCGCACCAATATGATTGGCGCAGTCGCGCGCGTGCGCCATACGCTGGCGCAAGCGCTGCACCGTTTCTTTGACGAGCA [...]
+Cnagbrn_nanangvf               ATGAGCGTAGTGCCTGTAGCGGATGTACTGCACGGTCGCGCGGTTGACAGTGAAGTCACCGTACGTGGTTGGGTGCGTACCCGAAGAGATTCAAAAGCCGGTCTTTCCTTTATCGCTGTCTATGACGGCTCCTGCTTTAATCCCGTTCAGGCTGTCGTCAATAATTCTCTGAATAATTATCAGGACGAAGTGCTGCACCTGACCACCGGCTGTTCCGTCATCGTCACCGGTAAGGTTGTTGCCTCTCCGGGTCAGGGTCAGGCATTCGAAATTCAGGCGACAAAGCTGGAGGTCGTGGGCTGGGTAGAAGATCCCGACAGCTATCCAATGGCGGCAAAACGCCACAGTATCGAATACCTGCGCGAGGTGGCCCACCTGCGTCCGCGTACCAACCTGATTGGCGCCGTGGCGCGCGTTCGTCATACCCTGGCCCAGGCGCTGCACCGCTTCTTTCATGAGAA [...]
+Cnfgrheryyn_zhygbpvqn          ACTAAAGTCGCATCTATTGTAGATGTTTTACAAGGCAAAGCCATTGGTGAAACCGTCACTGTCCGTGGCTGGATTCGTACTCGCCGTGACTCAAAAGCAGGTCTTTCTTTTTTGGCCATTTATGATGGTTCTTGCTTTGATCCTATCCAAGCAATTGTCAATAATGATATTGAAAATTACGAAACAGAAGTGTTGCGTTTAACAACCGGCTGTTCTGTTATTGTAACAGGTACTGTTGTAGAATCCCCTGCTGAAGGTCAAGCTGTTGAATTACAAGCAGAAAAAGTCGAGGTCGCAGGTTGGGTTGAGGACCCAGAAACATATCCAATGGCGGCAAAACGTCACTCAATTGAATATTTACGTGAAGTGGCTCATTTACGCCCTCGTACCAATATTATTGGCGCAGTCGCACGTGTTCGTCACTGCTTAGCACAAGCCATCCACCGTTTTTTCCATGAACA [...]
+Crpgbonpgrevhz_ngebfrcgvphz    ATGAGCGTAGCGCCTGTAGTCGACGTACTGCAAGGCCGGGCGGTTGATAGTGAAGTCACCGTTCGCGGCTGGATACGTACAAGGAGAGATTCTAAAGCTGGTATCTCTTTCCTCGCCGTCTATGACGGTTCCTGCTTTAATCCATTACAGGCCGTCGTTAATAATAATTTACCCAATTATCAGGATGAAGTTCTGTATTTAACTACCGGCTGTTCTGTAGAAGTGACAGGGACAGTCGTTGCTTCCCTTGGTCAAGGGCAGAATTTTGAACTACAAGCGACGAAAGTCGTGGTCATTGGCAAAGTTGAAGATCCTGACACTTATCCGATGGCAGCTAAACGCCATAGCATTGAGTATCTGCGAGAAGTGGCTCACCTGCGCCCACGTACCAACCTGATTGGTGCCGTTGCCCGTATGCGTCATACCCTTGCACAAGCACTACACCGTTTCTTTCATGAGAA [...]
+Crpgbonpgrevhz_pnebgbibehz     ATGAGCGTAGTGCCTGTAGTCGATGTACTGCAAGGCCGTGCCGTTGACAGCGAAGTCACCGTGCGCGGCTGGGTACGTACCCGGAGAGATTCTAAAGCCGGTATCTCCTTTATCGCCGTTTATGACGGCTCCTGCTTTAATCCGTTACAGGCTGTCGTTAATAATAATCTCTCCAATTATCAGGATGACGTACTGCGTCTGACCACTGGTTGCTCCGTAGAAATCACCGGTAACGTCGTCGCCTCTCCGGGTGAAGGCCAAAGCTTCGAGCTGCAAGCAACCAACGTCAACGTCGTCGGCTGGGTTGACGATCCCGATACTTATCCGATGGCAGCAAAGCGTCACAGCATCGAATACCTGCGTGAAGTCGCCCACCTGCGTCCACGCACCAACCTGATCGGCGCCGTTGCGCGCGTTCGTCATACGCTGGCGCAGGCCATTCACCGTTTCTTCCACGAGAA [...]
+Crpgbonpgrevhz_jnfnovnr        ATGAGCGTTGTGCCTGTAGCCGACGTACTCCAGGGCCGCGCCGTTGACCAAGAAGTCACCGTGCGCGGATGGGTGCGTACCCGCCGAGATTCAAAAGCTGGCATCTCCTTCCTCGCCGTTTATGACGGCTCCTGCTTTGATCCTGTACAGGCTGTCATTAATAATTCTCTGCCCAATTATAATGAAGAAGTATTACACCTGACGACAGGCTGCTCCGTGGTAGTAACAGGTAAGGTTGTCGCGTCGCCGGGACAGGGGCAAAGTTTCGAAATCCAGGCCACGAAAGTAGAAGTCGCAGGCTGGGTGGAAGATCCGGATACCTACCCGATGGCGGCAAAACGCCATAGCATTGAGTATCTGCGTGAAGTCGCGCATCTGCGCCCGCGCACCAACCTGATTGGCGCGGTAGCGCGCGTCCGCCATACTCTGGCGCAGGCGCTGCATCGCTTCTTCGATGAGCA [...]
+Cubgbeunoqhf_nflzovbgvpn       ATGACGGTGGTCAGCGTTGAACATGCGCTTGCGGGAAAGCCGGAAGGCGGCGAAGTCACGGTACGGGGGTGGGTGCGCACCTTGCGCGGATCT---GCCGGACTGGCCTTCATCAACGTGACCGACGGCTCGTGCTTTGCTCCGATCCAGGTGGTGGCCAACGACACGCTGCCCAATTTC---GACGAGATCAAGCGCCTGACCAGCGGCTGCTCGCTGATCGCCAAGGGCGTGCTGGTGAAATCGCAGGGCAAGGGTCAATCGTTCGAGATCCAGGCCAGTGGCGTGGACGTCGTCGGCTGGGTCGAAGACCCGCTGACCTACCCGATCCAGCCCAAGCCGATGACGCCGGAATTCCTGCGCGAAGTGGCGCACCTGCGTCCGCGCACCAACCTGTTCGGTGCGGTGACCCGCATCCGCAACTGCCTGGCGCAGGCCGTGCACCGCTTCTTCCACCAGAA [...]
+Cubgbeunoqhf_yhzvarfpraf       ATGAGCGTAGTGCCTGTAGTCGACGTACTGCAAGGCCGTGCGGTTGACAGTGAAGTCACCGTACGCGGTTGGGTGCGTACCCGGAGAGATTCTAAAGCTGGTATCTCCTTCCTGGCCGTCTATGACGGTTCCTGCTTTGATCCGTTACAGGCCGTCGTTAATAATTCTCTGCCGAATTATCAGGATGAAGTGCTGCATCTGACCACGGGCTGTTCCATTGAAGTCACCGGCGTTGTGGTGGCATCTCCGGGCGAAGGTCAGAGTTTCGAACTGCAGGCAACCGCGATTAAAGTGGTTGGCTGGGTTGACGATCCGGACACCTACCCGATGGCGGCCAAACGTCACAGCATCGAATACCTGCGCGAAGTGGCTCACCTGCGCCCACGCACCAATCTGATCGGTGCCGTTGCCCGCGTACGTCATACGCTGGCACAGGCCATTCACCGTTTCTATCACGAGAA [...]
+Cebgrhf_zvenovyvf              ATGATCGTTGCGCCTGTAGTCGACGTACTGCAAGGCCGTGCGGTTGGCGAAGACGTCACCGTTCGCGGTTGGGTACGTACAAGAAGAGATTCAAAAGCTGGTATCTCATTCCTTACCGTCTATGACGGTTCCTGCTTTAATCCAGTACAGGCCATCATTAATAATAATTTACCGAATTATCAAGATGAAGTGCTGCACTTAACCACAGGTTGCTCTGTGGAAGTCACCGGTAAAATTGTTGAATCTCCGGGTCAAGGTCAGAACTTTGAAATTCATGCGACCAAAGTTGTGGTAGTAGGAATGGTTGATGATCCGGAAACTTATCCGATGGCCGCTAAACGTCACAGCGTTGAGTATCTGCGTGAAGTTGCTCATCTTCGTCCACGCACAAACTTAATTGGTGCTGTTGCACGTGTTCGCCATACCTTGGCACAAGCACTACATCGTTTCTTCGATGAGCA [...]
+Cfrhqbzbanf_nrehtvabfn         ATGAGCGTTGTGCCTGTAGCCGACGTACTCCAGGGCCGCGCCGTTGACAGCGAAGTCACGGTCCGCGGATGGGTGCGTACCCGCCGAGATTCTAAAGCTGGCTTTTCTTTCCTCGCCGTCTATGACGGTTCCTGCTTTGATCCTGTACAGGCCGTTATTAATAATTCTCTGCCCAATTACAATCAGGAAGTGCTGCGTCTGACCACCGGCTGCTCGGTGATTGTCACCGGTAAAGTCGTAGCTTCTCAGGGTCAAGGTCAAAGCTTTGAGATCCAGGCGACCAGCGTGGAAGTGACCGGCTGGGTGGAAGACCCGGACACCTACCCGATGGCGGCCAAGCGCCACAGCATCGAGTATCTGCGTGAAGTAGCGCACCTGCGTCCGCGCACCAACCTGATTGGCGCGGTAGCCCGCGTGCGTCACACCCTGGCGCAGGCGCTGCACCGCTTCTTCAACGAACA [...]
+Ertvryyn_vafrpgvpbyn           ---------------------------------------------------------ATGATACGCGGTTGGGTACGCACTCGGAGGGATTCTAAAGCGGGTCTCTCTTTTATCGCTGTTGATGACGGCTCCTGTTTTGCTTCACTACAGGTGGTCGTTAATAACTCGCTGGCTAATTATGAAAAAGAAATACTGCGCTTGACTCCCGGTTGTTCGGTGGAAATTAGCGGGCAAATTGTTGCCTCGCCGGCAAAAGGACAAGCGTTTGAAATGCAAGCGACCGAGGTGGTGGTGAAGGGCTGTGTGGATGATCCTAAGACTTATCCCATGGCGGCAAAATGTCACAGTATTGAATATTTACGTGAAGTTGCGCACTTACGTCCACGTACTCATTTGATTAGCGCGGTCGCACGTGTTCGCCACACCTTAGCCCAGGCCATTCACCGCTTTTTCCATGAAAA [...]
+Evrfvn_crqvphyvpbyn            ATGATTGCAGTTCCAATAGTTGATATTTTTAATGAAAAAAAAATAGGAGAAAAAATTAAAGTAACAGGATGGGTGAAATCCAGAAGAGATTCGAAACTGGGAATCTCTTTTATAGATTTTTATGATGGATCTTGCTTGAAAACTTTACAAGTGGTTGTTAAAGAAAAGATTCAAAATTATCGAAAAAAAATTTTATCAATTACTACTGGATTTTCTTTGGAAATAATTGGAAATTTGAGTTTATCAATTGGAAAAGAACAGAAATTTGAATTATTAAGCACTGATATCAAAGTGGTTGGGAATGTAAAAGATCCAGAAAATTATCCAATATCTATTAAAAAACATAGTTTTGAGTATCTTAGAAAGGTATCTCATCTTAGATCAAGAACTAATATTATAGGTTCTATTTCTAGAATACGAAGTGATTTGATATATTTTATCCATTCTTTTCTAAAAGAAAA [...]
+Fnyzbaryyn_ragrevpn            ATGAGCGTAGTGCCTGTAGTCGACGTACTGCAAGGCCGTGCCGTTGACAGTGACGTCACCGTGCGCGGCTGGGTACGTACCCGGAGAGACTCTAAAGCCGGTATTTCCTTTATTGCCGTCTATGACGGTTCCTGCTTTGATTCGCTACAGGCTGTCGTCAATAATAATCTTGCCAATTACCAAAGCGATGTGCTGCGTCTGACGACCGGCTGCTCGGTGGAAGTCACCGGCAAGGTGGTGGAATCTCCCGGCGAAGGCCAAAGTTTTGAACTGCAGGCAACCGAGCTCAAGGTGGTCGGTTGGGTGGAAGACCCGGATACCTATCCGATGGCCGCCAAGCGCCACAGTATCGAATACCTGCGTGAAGTGGCGCATCTGCGCCCGCGCACCAACCTGATCGGCGCCGTCGCCCGAGTGCGTCATACGCTAGCCCAGGCTATACATCGTTTCTTTCATCAGAG [...]
+Freengvn_cebgrnznphynaf        ATGAGCGTAGTGCCTGTAGTCGATGTACTGCAAGGCCGTGCCGTTGACAGCGAAGTCACCGTGCGCGGCTGGGTACGTACCCGGAGAGATTCTAAAGCCGGTATCTCCTTTATCGCCGTTTATGACGGCTCCTGCTTTAATCCATTACAGGCCGTCGTTAATAATAATCTCTCGAATTATCAAGATGACGTACTGCGCCTGACCACCGGTTGCTCCGTTGAAATCACCGGCAATGTTGTTGCTTCTCCAGGTGAAGGCCAAAGCTTCGAGCTACAGGCGACCCACGTCAACGTGGTCGGCTGGGTTGACGATCCCGATACCTATCCGATGGCGGCAAAGCGTCACAGCATCGAATACCTGCGTGAAGTCGCGCACCTGCGTCCACGTACCAACCTGATCGGCGCGGTTGCGCGCGTTCGCCATACGCTGGCGCAGGCGATCCACCGCTTCTTCCACGAGAA [...]
+Fbqnyvf_tybffvavqvhf           ATGAGCGTAGTGCCTGTAGTCGATGTACTGCAAGGGCGCCCGGCTGACAGTGAAATCACTGTACAGGGTTGGGTGCGTACCCGCCGGGATTCCAAAGCCGGAATCTCCTTTCTTGCCGTCTATGACGGTTCCTGCTTCGATCCCTTACAGGCTGTCATTAATAATACTCTGCCGAATTATCAGAACGACATTTTACGCCTGACCTCGGGTTGCTCCGTGTCGGTGACCGGTCGGGTGGTCGAATCCCTGGGCGGTGGTCAGCGTTACGAAATTCAGGCCCAGGCAATTGAAGTGCTCGGCTGGGTGGACGATCCGGACACCTACCCCATGGCAGCCAAGCGTCACAGCGTGGAATATCTACGCGAGGTCGCTCATCTGCGGCCGCGCACCAACCTTATCGGAGCGGTGGCGCGGGTGCGTCATACCCTGGCGCAGGCCATTCACCGTTTCATGGACGAGCA [...]
+Ivoevb_pubyrenr                ATGACTTACGCGCCTGTAAATGACGTACTCAGCGGCAAGGCAGTAGACAGTGAAGTCACTGTTCGCGGCTGGATTCGCACACGTCGTGATTCCAAAGCTGGAATTTCGTTTCTTGCCATCTATGACGGCTCTTGTTTCAACCCGATTCAGGCCGTGGTTCCTAATAATCTCAATAATTACGACAACGAAGTTCTGAAGCTCACTACAGGCTGTTCCGTTGAAGTAACCGGTAAGATTGTTGAATCTCCAGCTTCAGGCCAAGCATTCGAACTGGCTGCGTCTGACGTAAAAGTCGTCGGTTGGGTTGAAGATGCCGATACTTACCCAATGGCGAAAACGCGTCATTCGATTGAATATCTGCGTGAAGTGGCTCACCTGCGTCCACGTACTAACGTGATCGGTGCGGTTGCGCGTGTTCGTAACTGCTTGGCACAAGCGATTCACCGTTTCTACCATGAACA [...]
+Jvttyrfjbeguvn_tybffvavqvn     GTGAAGTCCGTTTCGATAATAGATATTATAGAAAAAAAATTTAAAAAAAAATTAGTAGAAATAAATGGTTGGGTAAGAACAAAAAGAAATTCTAAATTAGGAATTTCTTTTGTTGATGTATATGATGGATCTTGTTTGCAGCATATACAAGTTATAGCAAAAAAAGATTTATCAAATTATAAATCAGATATTTTAAGATTAACTTCTGGATGTTCAGTAAAAATATTTGGAGTTTTGAAAAAATCTTTAAAAAATTCAAAAATTTATGAACTACATGCAACATGCATAAAAGTATTGGGATGGATTAAAGATCCAGGTAAATACCCTATTTCTTCAAAACCTCATACTTTAGAATATTTAAGAAGCTTTTCTCACTTGAGGCCTAGAACTAATATAATAGGATCAGTATCTAGAATAAGAAATATTATTTTTCAAGAAGTTCATAATTTTTTAAATAAAAA [...]
+Knagubzbanf_nkbabcbqvf         ATGAGCGTAGTGCCTGTAGTCGACGTACTGCAAGGCCGTGCCGTTGACAGTGACGTCACCGTGCGCGGCTGGGTACGTACCCGGAGAGACTCTAAAGCCGGTATTTCCTTTATTGCCGTCTATGACGGTTCCTGCTTTGATTCGCTACAGGCTGTCGTCAATAATAATCTTGCTAATTATCAGAGCGACATCTTGCGCCTGACCACCGGCTGCTCGGTAGAAGTCACCGGCAAGGTAGTGGAATCTCCCGGCGAAGGCCAAAGCTTCGAACTGCTGGCCACCGAACTCAAAGTTGTCGGCTGGGTGGATGACCCGGACACGTACCCGATGGCGGCTAAGCGCCACAGTATCGAATATCTGCGTGAAGTCGCGCATTTACGCCCTCGTACCAACCTGATCGGTGCTGTCGCCCGTGTGCGCCACACACTGGCGCAGGCTATTCATCGCTTCTTCCATCAGAA [...]
+Krabeunoqhf_obivravv           ATGAGCGTTGCGCCTGTAGTCGATGTACTGCAAGGCCGCCCGGTTGACAGCGAAGTCACCGTCCGCGGTTGGGTACGTACAAGGAGAGATTCTAAAGCTGGTATCTCGTTCCTCGCCGTCTATGACGGTTCCTGCTTTAATCCAGTACAGGCCGTCGTTAATAGTAATTTACCTAATTATCAGGATGAAGTTCTGTATTTAACCACTGGCTGTTCTGTGGAAATCACCGGTACAGTCGTGGCATCACAAGGCAAAGGCCAAAACTTTGAACTACAAGCCACCAACGTGGTTGTAGTTGGCATGATAGACGATCCTGATACTTACCCGATGGCAGCCAAACGCCACAGTATCGAATATCTGCGTGAAGTCGCACACTTGCGTCCACGCACGAACCTGATTGGTGCGGTTGCTCGCGTTCGTCATACACTGTCACAAGCCCTGCACCGTTTTTTCCATGAGAA [...]
+Krabeunoqhf_arzngbcuvyn        ATGAGCGTAGCGCCTGTAGTCGATGTACTGCAAGGCCGTCCGGTTGACAGCGAAGTCACCGTTCGCGGTTGGATACGTACAAGGAGAGATTCTAAAGCTGGTATCTCGTTCCTCGCCGTCCATGACGGTTCCTGCTTTAATCCATTACAGGCCGTCGTTAATAATAATTTACCTAATTATCAGGATGAAGTATTACATTTAACCACGGGTTGTTCTGTCGAAATCACGGGTACAGTGGTTGAATCACAAGGTACAGGCCAGTCTTTTGAACTGCAAGCGACTAAAGTCGTTGTGGTTGGCATGGTAGATGATCCTGATACCTACCCGATGGCAGCAAAACGCCACAGTATCGAATACCTGCGTGAAGTGGCGCATCTTCGTCCACGCACTAACCTGATCGGCGCGGTTGCGCGTGTTCGCCATACACTGGCCCAAGCCCTGCACCGTTTCTTCCATGAAAA [...]
+Lrefvavn_crfgvf                ATGAGCGTAGTGCCTGTAGTCGACGTACTGCAAGGCCGCGCGGTTGGCAGTGAAGTCACCGTGCGCGGTTGGGTGCGTACCCGGAGAGATTCTAAAGCGGGTATCTCCTTCGTTGCCGTTTATGACGGTTCCTGCTTTGACCCGTTACAGGCCGTCGTGAATAATACTTTGCCGAATTATCAGGATGAAGTACTGCATCTGACCACCGGTTGTTCCGTTGAAGTCACCGGTACCGTGGTCGCATCACCGGGTGAAGGCCAAAGTTTTGAAATTCAAGCAACCGCCATCAACGTAGTAGGCTGGGTTGATGATCCGGATACCTACCCGATGGCCGCAAAACGTCACAGCATTGAATATTTGCGTGAAGTGGCTCACTTACGCCCGCGTACTAACCTGATTGGTGCCGTTGCCCGTGTTCGCCACACGTTGGCACAAGCAATCCACCGCTTCTTCGACGAAAA [...]
+;
+
+END;
+
+
+Begin trees;
+	tree tree1 = (Cfrhqbzbanf_nrehtvabfn:1.0,(Ivoevb_pubyrenr:1.0,((Cnfgrheryyn_zhygbpvqn:1.0,Unrzbcuvyhf_vasyhramnr:1.0):1.0,(((Cebgrhf_zvenovyvf:1.0,(Evrfvn_crqvphyvpbyn{FG}:1.0,Nefrabcubahf_anfbavnr{FG}:1.0):1.0):1.0,((Krabeunoqhf_arzngbcuvyn:1.0,Krabeunoqhf_obivravv:1.0):1.0,(Cubgbeunoqhf_yhzvarfpraf:1.0,Cubgbeunoqhf_nflzovbgvpn:1.0):1.0):1.0):1.0,((Freengvn_cebgrnznphynaf:1.0,((Ertvryyn_vafrpgvpbyn{FG}:1.0,Unzvygbaryyn_qrsrafn{FG}:1.0):1.0,Lrefvavn_crfgvf:1.0):1.0):1.0,(((((Crpgbonpgre [...]
+end;
diff --git a/tests/hbltests/RegressionTesting/unaryMinus.bf b/tests/hbltests/RegressionTesting/unaryMinus.bf
new file mode 100644
index 0000000..8f1fed9
--- /dev/null
+++ b/tests/hbltests/RegressionTesting/unaryMinus.bf
@@ -0,0 +1,5 @@
+x := y*(-2);
+
+GetString (export, x, -2);
+
+assert (export == "y*(-2)", "Incorrect export string " + export);
\ No newline at end of file
diff --git a/tests/hbltests/Shared/REL_utils.bf b/tests/hbltests/Shared/REL_utils.bf
new file mode 100644
index 0000000..7d183b6
--- /dev/null
+++ b/tests/hbltests/Shared/REL_utils.bf
@@ -0,0 +1,11 @@
+function			checkMarginalReconstruction (expected_partials, expected_classes, lfID)
+{
+	ConstructCategoryMatrix (cmx, "`lfID`");
+	cmx = Transpose(cmx);
+	cmx = cmx["_MATRIX_ELEMENT_VALUE_*Exp(cmx.log_scale_multiplier)^cmx.site_scalers[_MATRIX_ELEMENT_ROW_]"];
+	ConstructCategoryMatrix (cmx2, lfID, SHORT);
+	ConstructCategoryMatrix (cmx3, lfID, WEIGHTS);
+	matrixError1 = Max(expected_partials - cmx, 0);
+	matrixError2 = Abs(expected_classes - cmx2);
+	return {{matrixError1__, matrixError2__}};
+}
diff --git a/tests/hbltests/Shared/TestInstrumentation.bf b/tests/hbltests/Shared/TestInstrumentation.bf
new file mode 100644
index 0000000..9dacc1a
--- /dev/null
+++ b/tests/hbltests/Shared/TestInstrumentation.bf
@@ -0,0 +1,129 @@
+/*
+
+A collection of HBL utility functions shared by various test 
+scripts in the HyPhy distribution. 
+
+Written by SL Kosakovsky Pond (spond at ucsd.edu), March 2009
+
+For linencsing term see
+http://www.gnu.org/licenses/quick-guide-gplv3.html
+
+*/
+
+RequireVersion ("2");
+
+/*###########################################################################
+
+Call startTestTimer to set up timing variables and (optionally) print out 
+the description of a test (passed as an argument). Nothing is printed if
+an something other than a string is passed (e.g. a 0)
+
+----------------------------------------------------------------------------*/
+
+function startTestTimer (descriptiveString)
+{
+	_hyphyTestTimerInWall = Time (1);
+	_hyphyTestTimerInUser = Time (0);
+	
+	if (Type(descriptiveString) == "String")
+	{
+		fprintf (stdout, "[STARTING TEST  : ", descriptiveString, "]\n");
+	}
+	
+	return 0;
+}
+
+/*###########################################################################
+
+Call endTestTimer following a call to startTestTimer to finish timing a test 
+and optionally print out a diagnostic message, run time (both wall clock and
+user space) and their ratio (cpu utilization). Nothing is printed if
+an something other than a string is passed (e.g. a 0). Returns a 1x2 matrix
+of wall clock time and user space time elapsed (in seconds).
+
+----------------------------------------------------------------------------*/
+
+function endTestTimer (descriptiveString)
+{
+	_hyphyTestRangeWall = Time(1) - _hyphyTestTimerInWall;
+	_hyphyTestRangeUser = Time(0) - _hyphyTestTimerInUser;
+	
+	if (Type(descriptiveString) == "String")
+	{
+		fprintf (stdout, "[FINISHED TEST  : ", descriptiveString, "]\n");
+		fprintf (stdout, "[WALL CLOCK TIME: ", reportTimeUsed (_hyphyTestRangeWall), "]\n");
+		fprintf (stdout, "[CPU  TIME      : ", reportTimeUsed (_hyphyTestRangeUser), "]\n");
+		fprintf (stdout, "[CPU UTILIZATION: ", Format(_hyphyTestRangeUser/_hyphyTestRangeWall*100,5,2), "%]\n");
+	}
+	
+	return {{_hyphyTestRangeWall__, _hyphyTestRangeUser__}};
+}
+
+/*###########################################################################
+
+reportTimeUsed takes a positive numeric argument (seconds) and returns it as a string
+formatted as hh:mm:ss 
+An error string is returned if a negative value is passed in.
+
+----------------------------------------------------------------------------*/
+
+function reportTimeUsed (secondCount)
+{
+	if (secondCount >= 0)
+	{
+		_hrs  = secondCount$3600;
+		_mins = (secondCount%3600)$60;
+		_secs = secondCount - secondCount$60*60;
+		
+		if (_hrs < 10)
+		{
+			_hrs = "0" + _hrs;
+		}
+		else
+		{
+			_hrs = "" + _hrs;
+		}
+		
+		if (_mins < 10)
+		{
+			_mins = "0" + _mins;
+		}
+		else
+		{
+			_mins = "" + _mins;
+		}
+
+		if (_secs < 10)
+		{
+			_secs = "0" + _secs;
+		}
+		else
+		{
+			_secs = "" + _secs;
+		}
+		return _hrs + ":" + _mins + ":" + _secs;
+
+	}
+	return "[ERROR: NEGATIVE TIME ELAPSED VALUE]\n";
+}
+
+/*###########################################################################
+
+logTestResults takes a boolean (numeric argument); reports test results
+and logs them to a test database (if one is open)
+
+----------------------------------------------------------------------------*/
+
+function logTestResult (testResult)
+{
+	if (testResult)
+	{
+		fprintf (stdout, "[TEST PASSED]\n");
+	}
+	else
+	{
+		fprintf (stdout, "[TEST FAILED]\n");
+	}
+	return testResult != 0; 
+}
+
diff --git a/tests/hbltests/SimpleOptimizations/IntermediateCodon.bf b/tests/hbltests/SimpleOptimizations/IntermediateCodon.bf
new file mode 100644
index 0000000..08fe40c
--- /dev/null
+++ b/tests/hbltests/SimpleOptimizations/IntermediateCodon.bf
@@ -0,0 +1,634 @@
+/* test preamble */
+
+	_testDescription 		= " fit the MG94xREV model to an Influenza A alignment with 349 sequences and 329 nucleotides";
+	_expectedLL 			= -11402.1903626064;
+	ExecuteAFile 			("../Shared/TestInstrumentation.bf");
+	startTestTimer 			(_testDescription);
+
+/* end test preamble */
+
+global LargeNuc_part_Shared_AC	=	1;
+global LargeNuc_part_Shared_AT	=	1;
+global LargeNuc_part_Shared_CG	=	1;
+global LargeNuc_part_Shared_CT	=	1;
+global LargeNuc_part_Shared_GT	=	1;
+global LargeNuc_part_Shared_R	=	1;
+
+LargeNuc_part_MG94xREV_3x4={61,61};
+
+LargeNuc_part_MG94xREV_3x4[0][1]:=LargeNuc_part_Shared_AC*LargeNuc_part_Shared_R*synRate*0.249915;
+LargeNuc_part_MG94xREV_3x4[0][2]:=synRate*0.179823;
+LargeNuc_part_MG94xREV_3x4[0][3]:=LargeNuc_part_Shared_AT*LargeNuc_part_Shared_R*synRate*0.277297;
+LargeNuc_part_MG94xREV_3x4[0][4]:=LargeNuc_part_Shared_AC*LargeNuc_part_Shared_R*synRate*0.223626;
+LargeNuc_part_MG94xREV_3x4[0][8]:=LargeNuc_part_Shared_R*synRate*0.228782;
+LargeNuc_part_MG94xREV_3x4[0][12]:=LargeNuc_part_Shared_AT*LargeNuc_part_Shared_R*synRate*0.234948;
+LargeNuc_part_MG94xREV_3x4[0][16]:=LargeNuc_part_Shared_AC*LargeNuc_part_Shared_R*synRate*0.184056;
+LargeNuc_part_MG94xREV_3x4[0][32]:=LargeNuc_part_Shared_R*synRate*0.260941;
+LargeNuc_part_MG94xREV_3x4[1][0]:=LargeNuc_part_Shared_AC*LargeNuc_part_Shared_R*synRate*0.292965;
+LargeNuc_part_MG94xREV_3x4[1][2]:=LargeNuc_part_Shared_CG*LargeNuc_part_Shared_R*synRate*0.179823;
+LargeNuc_part_MG94xREV_3x4[1][3]:=LargeNuc_part_Shared_CT*synRate*0.277297;
+LargeNuc_part_MG94xREV_3x4[1][5]:=LargeNuc_part_Shared_AC*LargeNuc_part_Shared_R*synRate*0.223626;
+LargeNuc_part_MG94xREV_3x4[1][9]:=LargeNuc_part_Shared_R*synRate*0.228782;
+LargeNuc_part_MG94xREV_3x4[1][13]:=LargeNuc_part_Shared_AT*LargeNuc_part_Shared_R*synRate*0.234948;
+LargeNuc_part_MG94xREV_3x4[1][17]:=LargeNuc_part_Shared_AC*LargeNuc_part_Shared_R*synRate*0.184056;
+LargeNuc_part_MG94xREV_3x4[1][33]:=LargeNuc_part_Shared_R*synRate*0.260941;
+LargeNuc_part_MG94xREV_3x4[1][48]:=LargeNuc_part_Shared_AT*LargeNuc_part_Shared_R*synRate*0.176322;
+LargeNuc_part_MG94xREV_3x4[2][0]:=synRate*0.292965;
+LargeNuc_part_MG94xREV_3x4[2][1]:=LargeNuc_part_Shared_CG*LargeNuc_part_Shared_R*synRate*0.249915;
+LargeNuc_part_MG94xREV_3x4[2][3]:=LargeNuc_part_Shared_GT*LargeNuc_part_Shared_R*synRate*0.277297;
+LargeNuc_part_MG94xREV_3x4[2][6]:=LargeNuc_part_Shared_AC*LargeNuc_part_Shared_R*synRate*0.223626;
+LargeNuc_part_MG94xREV_3x4[2][10]:=LargeNuc_part_Shared_R*synRate*0.228782;
+LargeNuc_part_MG94xREV_3x4[2][14]:=LargeNuc_part_Shared_AT*LargeNuc_part_Shared_R*synRate*0.234948;
+LargeNuc_part_MG94xREV_3x4[2][18]:=LargeNuc_part_Shared_AC*LargeNuc_part_Shared_R*synRate*0.184056;
+LargeNuc_part_MG94xREV_3x4[2][34]:=LargeNuc_part_Shared_R*synRate*0.260941;
+LargeNuc_part_MG94xREV_3x4[3][0]:=LargeNuc_part_Shared_AT*LargeNuc_part_Shared_R*synRate*0.292965;
+LargeNuc_part_MG94xREV_3x4[3][1]:=LargeNuc_part_Shared_CT*synRate*0.249915;
+LargeNuc_part_MG94xREV_3x4[3][2]:=LargeNuc_part_Shared_GT*LargeNuc_part_Shared_R*synRate*0.179823;
+LargeNuc_part_MG94xREV_3x4[3][7]:=LargeNuc_part_Shared_AC*LargeNuc_part_Shared_R*synRate*0.223626;
+LargeNuc_part_MG94xREV_3x4[3][11]:=LargeNuc_part_Shared_R*synRate*0.228782;
+LargeNuc_part_MG94xREV_3x4[3][15]:=LargeNuc_part_Shared_AT*LargeNuc_part_Shared_R*synRate*0.234948;
+LargeNuc_part_MG94xREV_3x4[3][19]:=LargeNuc_part_Shared_AC*LargeNuc_part_Shared_R*synRate*0.184056;
+LargeNuc_part_MG94xREV_3x4[3][35]:=LargeNuc_part_Shared_R*synRate*0.260941;
+LargeNuc_part_MG94xREV_3x4[3][49]:=LargeNuc_part_Shared_AT*LargeNuc_part_Shared_R*synRate*0.176322;
+LargeNuc_part_MG94xREV_3x4[4][0]:=LargeNuc_part_Shared_AC*LargeNuc_part_Shared_R*synRate*0.312643;
+LargeNuc_part_MG94xREV_3x4[4][5]:=LargeNuc_part_Shared_AC*synRate*0.249915;
+LargeNuc_part_MG94xREV_3x4[4][6]:=synRate*0.179823;
+LargeNuc_part_MG94xREV_3x4[4][7]:=LargeNuc_part_Shared_AT*synRate*0.277297;
+LargeNuc_part_MG94xREV_3x4[4][8]:=LargeNuc_part_Shared_CG*LargeNuc_part_Shared_R*synRate*0.228782;
+LargeNuc_part_MG94xREV_3x4[4][12]:=LargeNuc_part_Shared_CT*LargeNuc_part_Shared_R*synRate*0.234948;
+LargeNuc_part_MG94xREV_3x4[4][20]:=LargeNuc_part_Shared_AC*LargeNuc_part_Shared_R*synRate*0.184056;
+LargeNuc_part_MG94xREV_3x4[4][36]:=LargeNuc_part_Shared_R*synRate*0.260941;
+LargeNuc_part_MG94xREV_3x4[4][50]:=LargeNuc_part_Shared_AT*LargeNuc_part_Shared_R*synRate*0.176322;
+LargeNuc_part_MG94xREV_3x4[5][1]:=LargeNuc_part_Shared_AC*LargeNuc_part_Shared_R*synRate*0.312643;
+LargeNuc_part_MG94xREV_3x4[5][4]:=LargeNuc_part_Shared_AC*synRate*0.292965;
+LargeNuc_part_MG94xREV_3x4[5][6]:=LargeNuc_part_Shared_CG*synRate*0.179823;
+LargeNuc_part_MG94xREV_3x4[5][7]:=LargeNuc_part_Shared_CT*synRate*0.277297;
+LargeNuc_part_MG94xREV_3x4[5][9]:=LargeNuc_part_Shared_CG*LargeNuc_part_Shared_R*synRate*0.228782;
+LargeNuc_part_MG94xREV_3x4[5][13]:=LargeNuc_part_Shared_CT*LargeNuc_part_Shared_R*synRate*0.234948;
+LargeNuc_part_MG94xREV_3x4[5][21]:=LargeNuc_part_Shared_AC*LargeNuc_part_Shared_R*synRate*0.184056;
+LargeNuc_part_MG94xREV_3x4[5][37]:=LargeNuc_part_Shared_R*synRate*0.260941;
+LargeNuc_part_MG94xREV_3x4[5][51]:=LargeNuc_part_Shared_AT*LargeNuc_part_Shared_R*synRate*0.176322;
+LargeNuc_part_MG94xREV_3x4[6][2]:=LargeNuc_part_Shared_AC*LargeNuc_part_Shared_R*synRate*0.312643;
+LargeNuc_part_MG94xREV_3x4[6][4]:=synRate*0.292965;
+LargeNuc_part_MG94xREV_3x4[6][5]:=LargeNuc_part_Shared_CG*synRate*0.249915;
+LargeNuc_part_MG94xREV_3x4[6][7]:=LargeNuc_part_Shared_GT*synRate*0.277297;
+LargeNuc_part_MG94xREV_3x4[6][10]:=LargeNuc_part_Shared_CG*LargeNuc_part_Shared_R*synRate*0.228782;
+LargeNuc_part_MG94xREV_3x4[6][14]:=LargeNuc_part_Shared_CT*LargeNuc_part_Shared_R*synRate*0.234948;
+LargeNuc_part_MG94xREV_3x4[6][22]:=LargeNuc_part_Shared_AC*LargeNuc_part_Shared_R*synRate*0.184056;
+LargeNuc_part_MG94xREV_3x4[6][38]:=LargeNuc_part_Shared_R*synRate*0.260941;
+LargeNuc_part_MG94xREV_3x4[6][52]:=LargeNuc_part_Shared_AT*LargeNuc_part_Shared_R*synRate*0.176322;
+LargeNuc_part_MG94xREV_3x4[7][3]:=LargeNuc_part_Shared_AC*LargeNuc_part_Shared_R*synRate*0.312643;
+LargeNuc_part_MG94xREV_3x4[7][4]:=LargeNuc_part_Shared_AT*synRate*0.292965;
+LargeNuc_part_MG94xREV_3x4[7][5]:=LargeNuc_part_Shared_CT*synRate*0.249915;
+LargeNuc_part_MG94xREV_3x4[7][6]:=LargeNuc_part_Shared_GT*synRate*0.179823;
+LargeNuc_part_MG94xREV_3x4[7][11]:=LargeNuc_part_Shared_CG*LargeNuc_part_Shared_R*synRate*0.228782;
+LargeNuc_part_MG94xREV_3x4[7][15]:=LargeNuc_part_Shared_CT*LargeNuc_part_Shared_R*synRate*0.234948;
+LargeNuc_part_MG94xREV_3x4[7][23]:=LargeNuc_part_Shared_AC*LargeNuc_part_Shared_R*synRate*0.184056;
+LargeNuc_part_MG94xREV_3x4[7][39]:=LargeNuc_part_Shared_R*synRate*0.260941;
+LargeNuc_part_MG94xREV_3x4[7][53]:=LargeNuc_part_Shared_AT*LargeNuc_part_Shared_R*synRate*0.176322;
+LargeNuc_part_MG94xREV_3x4[8][0]:=LargeNuc_part_Shared_R*synRate*0.312643;
+LargeNuc_part_MG94xREV_3x4[8][4]:=LargeNuc_part_Shared_CG*LargeNuc_part_Shared_R*synRate*0.223626;
+LargeNuc_part_MG94xREV_3x4[8][9]:=LargeNuc_part_Shared_AC*LargeNuc_part_Shared_R*synRate*0.249915;
+LargeNuc_part_MG94xREV_3x4[8][10]:=synRate*0.179823;
+LargeNuc_part_MG94xREV_3x4[8][11]:=LargeNuc_part_Shared_AT*LargeNuc_part_Shared_R*synRate*0.277297;
+LargeNuc_part_MG94xREV_3x4[8][12]:=LargeNuc_part_Shared_GT*LargeNuc_part_Shared_R*synRate*0.234948;
+LargeNuc_part_MG94xREV_3x4[8][24]:=LargeNuc_part_Shared_AC*synRate*0.184056;
+LargeNuc_part_MG94xREV_3x4[8][40]:=LargeNuc_part_Shared_R*synRate*0.260941;
+LargeNuc_part_MG94xREV_3x4[9][1]:=LargeNuc_part_Shared_R*synRate*0.312643;
+LargeNuc_part_MG94xREV_3x4[9][5]:=LargeNuc_part_Shared_CG*LargeNuc_part_Shared_R*synRate*0.223626;
+LargeNuc_part_MG94xREV_3x4[9][8]:=LargeNuc_part_Shared_AC*LargeNuc_part_Shared_R*synRate*0.292965;
+LargeNuc_part_MG94xREV_3x4[9][10]:=LargeNuc_part_Shared_CG*LargeNuc_part_Shared_R*synRate*0.179823;
+LargeNuc_part_MG94xREV_3x4[9][11]:=LargeNuc_part_Shared_CT*synRate*0.277297;
+LargeNuc_part_MG94xREV_3x4[9][13]:=LargeNuc_part_Shared_GT*LargeNuc_part_Shared_R*synRate*0.234948;
+LargeNuc_part_MG94xREV_3x4[9][25]:=LargeNuc_part_Shared_AC*LargeNuc_part_Shared_R*synRate*0.184056;
+LargeNuc_part_MG94xREV_3x4[9][41]:=LargeNuc_part_Shared_R*synRate*0.260941;
+LargeNuc_part_MG94xREV_3x4[9][54]:=LargeNuc_part_Shared_AT*LargeNuc_part_Shared_R*synRate*0.176322;
+LargeNuc_part_MG94xREV_3x4[10][2]:=LargeNuc_part_Shared_R*synRate*0.312643;
+LargeNuc_part_MG94xREV_3x4[10][6]:=LargeNuc_part_Shared_CG*LargeNuc_part_Shared_R*synRate*0.223626;
+LargeNuc_part_MG94xREV_3x4[10][8]:=synRate*0.292965;
+LargeNuc_part_MG94xREV_3x4[10][9]:=LargeNuc_part_Shared_CG*LargeNuc_part_Shared_R*synRate*0.249915;
+LargeNuc_part_MG94xREV_3x4[10][11]:=LargeNuc_part_Shared_GT*LargeNuc_part_Shared_R*synRate*0.277297;
+LargeNuc_part_MG94xREV_3x4[10][14]:=LargeNuc_part_Shared_GT*LargeNuc_part_Shared_R*synRate*0.234948;
+LargeNuc_part_MG94xREV_3x4[10][26]:=LargeNuc_part_Shared_AC*synRate*0.184056;
+LargeNuc_part_MG94xREV_3x4[10][42]:=LargeNuc_part_Shared_R*synRate*0.260941;
+LargeNuc_part_MG94xREV_3x4[10][55]:=LargeNuc_part_Shared_AT*LargeNuc_part_Shared_R*synRate*0.176322;
+LargeNuc_part_MG94xREV_3x4[11][3]:=LargeNuc_part_Shared_R*synRate*0.312643;
+LargeNuc_part_MG94xREV_3x4[11][7]:=LargeNuc_part_Shared_CG*LargeNuc_part_Shared_R*synRate*0.223626;
+LargeNuc_part_MG94xREV_3x4[11][8]:=LargeNuc_part_Shared_AT*LargeNuc_part_Shared_R*synRate*0.292965;
+LargeNuc_part_MG94xREV_3x4[11][9]:=LargeNuc_part_Shared_CT*synRate*0.249915;
+LargeNuc_part_MG94xREV_3x4[11][10]:=LargeNuc_part_Shared_GT*LargeNuc_part_Shared_R*synRate*0.179823;
+LargeNuc_part_MG94xREV_3x4[11][15]:=LargeNuc_part_Shared_GT*LargeNuc_part_Shared_R*synRate*0.234948;
+LargeNuc_part_MG94xREV_3x4[11][27]:=LargeNuc_part_Shared_AC*LargeNuc_part_Shared_R*synRate*0.184056;
+LargeNuc_part_MG94xREV_3x4[11][43]:=LargeNuc_part_Shared_R*synRate*0.260941;
+LargeNuc_part_MG94xREV_3x4[11][56]:=LargeNuc_part_Shared_AT*LargeNuc_part_Shared_R*synRate*0.176322;
+LargeNuc_part_MG94xREV_3x4[12][0]:=LargeNuc_part_Shared_AT*LargeNuc_part_Shared_R*synRate*0.312643;
+LargeNuc_part_MG94xREV_3x4[12][4]:=LargeNuc_part_Shared_CT*LargeNuc_part_Shared_R*synRate*0.223626;
+LargeNuc_part_MG94xREV_3x4[12][8]:=LargeNuc_part_Shared_GT*LargeNuc_part_Shared_R*synRate*0.228782;
+LargeNuc_part_MG94xREV_3x4[12][13]:=LargeNuc_part_Shared_AC*synRate*0.249915;
+LargeNuc_part_MG94xREV_3x4[12][14]:=LargeNuc_part_Shared_R*synRate*0.179823;
+LargeNuc_part_MG94xREV_3x4[12][15]:=LargeNuc_part_Shared_AT*synRate*0.277297;
+LargeNuc_part_MG94xREV_3x4[12][28]:=LargeNuc_part_Shared_AC*LargeNuc_part_Shared_R*synRate*0.184056;
+LargeNuc_part_MG94xREV_3x4[12][44]:=LargeNuc_part_Shared_R*synRate*0.260941;
+LargeNuc_part_MG94xREV_3x4[12][57]:=LargeNuc_part_Shared_AT*LargeNuc_part_Shared_R*synRate*0.176322;
+LargeNuc_part_MG94xREV_3x4[13][1]:=LargeNuc_part_Shared_AT*LargeNuc_part_Shared_R*synRate*0.312643;
+LargeNuc_part_MG94xREV_3x4[13][5]:=LargeNuc_part_Shared_CT*LargeNuc_part_Shared_R*synRate*0.223626;
+LargeNuc_part_MG94xREV_3x4[13][9]:=LargeNuc_part_Shared_GT*LargeNuc_part_Shared_R*synRate*0.228782;
+LargeNuc_part_MG94xREV_3x4[13][12]:=LargeNuc_part_Shared_AC*synRate*0.292965;
+LargeNuc_part_MG94xREV_3x4[13][14]:=LargeNuc_part_Shared_CG*LargeNuc_part_Shared_R*synRate*0.179823;
+LargeNuc_part_MG94xREV_3x4[13][15]:=LargeNuc_part_Shared_CT*synRate*0.277297;
+LargeNuc_part_MG94xREV_3x4[13][29]:=LargeNuc_part_Shared_AC*LargeNuc_part_Shared_R*synRate*0.184056;
+LargeNuc_part_MG94xREV_3x4[13][45]:=LargeNuc_part_Shared_R*synRate*0.260941;
+LargeNuc_part_MG94xREV_3x4[13][58]:=LargeNuc_part_Shared_AT*LargeNuc_part_Shared_R*synRate*0.176322;
+LargeNuc_part_MG94xREV_3x4[14][2]:=LargeNuc_part_Shared_AT*LargeNuc_part_Shared_R*synRate*0.312643;
+LargeNuc_part_MG94xREV_3x4[14][6]:=LargeNuc_part_Shared_CT*LargeNuc_part_Shared_R*synRate*0.223626;
+LargeNuc_part_MG94xREV_3x4[14][10]:=LargeNuc_part_Shared_GT*LargeNuc_part_Shared_R*synRate*0.228782;
+LargeNuc_part_MG94xREV_3x4[14][12]:=LargeNuc_part_Shared_R*synRate*0.292965;
+LargeNuc_part_MG94xREV_3x4[14][13]:=LargeNuc_part_Shared_CG*LargeNuc_part_Shared_R*synRate*0.249915;
+LargeNuc_part_MG94xREV_3x4[14][15]:=LargeNuc_part_Shared_GT*LargeNuc_part_Shared_R*synRate*0.277297;
+LargeNuc_part_MG94xREV_3x4[14][30]:=LargeNuc_part_Shared_AC*LargeNuc_part_Shared_R*synRate*0.184056;
+LargeNuc_part_MG94xREV_3x4[14][46]:=LargeNuc_part_Shared_R*synRate*0.260941;
+LargeNuc_part_MG94xREV_3x4[14][59]:=LargeNuc_part_Shared_AT*LargeNuc_part_Shared_R*synRate*0.176322;
+LargeNuc_part_MG94xREV_3x4[15][3]:=LargeNuc_part_Shared_AT*LargeNuc_part_Shared_R*synRate*0.312643;
+LargeNuc_part_MG94xREV_3x4[15][7]:=LargeNuc_part_Shared_CT*LargeNuc_part_Shared_R*synRate*0.223626;
+LargeNuc_part_MG94xREV_3x4[15][11]:=LargeNuc_part_Shared_GT*LargeNuc_part_Shared_R*synRate*0.228782;
+LargeNuc_part_MG94xREV_3x4[15][12]:=LargeNuc_part_Shared_AT*synRate*0.292965;
+LargeNuc_part_MG94xREV_3x4[15][13]:=LargeNuc_part_Shared_CT*synRate*0.249915;
+LargeNuc_part_MG94xREV_3x4[15][14]:=LargeNuc_part_Shared_GT*LargeNuc_part_Shared_R*synRate*0.179823;
+LargeNuc_part_MG94xREV_3x4[15][31]:=LargeNuc_part_Shared_AC*LargeNuc_part_Shared_R*synRate*0.184056;
+LargeNuc_part_MG94xREV_3x4[15][47]:=LargeNuc_part_Shared_R*synRate*0.260941;
+LargeNuc_part_MG94xREV_3x4[15][60]:=LargeNuc_part_Shared_AT*LargeNuc_part_Shared_R*synRate*0.176322;
+LargeNuc_part_MG94xREV_3x4[16][0]:=LargeNuc_part_Shared_AC*LargeNuc_part_Shared_R*synRate*0.378681;
+LargeNuc_part_MG94xREV_3x4[16][17]:=LargeNuc_part_Shared_AC*LargeNuc_part_Shared_R*synRate*0.249915;
+LargeNuc_part_MG94xREV_3x4[16][18]:=synRate*0.179823;
+LargeNuc_part_MG94xREV_3x4[16][19]:=LargeNuc_part_Shared_AT*LargeNuc_part_Shared_R*synRate*0.277297;
+LargeNuc_part_MG94xREV_3x4[16][20]:=LargeNuc_part_Shared_AC*LargeNuc_part_Shared_R*synRate*0.223626;
+LargeNuc_part_MG94xREV_3x4[16][24]:=LargeNuc_part_Shared_R*synRate*0.228782;
+LargeNuc_part_MG94xREV_3x4[16][28]:=LargeNuc_part_Shared_AT*LargeNuc_part_Shared_R*synRate*0.234948;
+LargeNuc_part_MG94xREV_3x4[16][32]:=LargeNuc_part_Shared_CG*LargeNuc_part_Shared_R*synRate*0.260941;
+LargeNuc_part_MG94xREV_3x4[17][1]:=LargeNuc_part_Shared_AC*LargeNuc_part_Shared_R*synRate*0.378681;
+LargeNuc_part_MG94xREV_3x4[17][16]:=LargeNuc_part_Shared_AC*LargeNuc_part_Shared_R*synRate*0.292965;
+LargeNuc_part_MG94xREV_3x4[17][18]:=LargeNuc_part_Shared_CG*LargeNuc_part_Shared_R*synRate*0.179823;
+LargeNuc_part_MG94xREV_3x4[17][19]:=LargeNuc_part_Shared_CT*synRate*0.277297;
+LargeNuc_part_MG94xREV_3x4[17][21]:=LargeNuc_part_Shared_AC*LargeNuc_part_Shared_R*synRate*0.223626;
+LargeNuc_part_MG94xREV_3x4[17][25]:=LargeNuc_part_Shared_R*synRate*0.228782;
+LargeNuc_part_MG94xREV_3x4[17][29]:=LargeNuc_part_Shared_AT*LargeNuc_part_Shared_R*synRate*0.234948;
+LargeNuc_part_MG94xREV_3x4[17][33]:=LargeNuc_part_Shared_CG*LargeNuc_part_Shared_R*synRate*0.260941;
+LargeNuc_part_MG94xREV_3x4[17][48]:=LargeNuc_part_Shared_CT*LargeNuc_part_Shared_R*synRate*0.176322;
+LargeNuc_part_MG94xREV_3x4[18][2]:=LargeNuc_part_Shared_AC*LargeNuc_part_Shared_R*synRate*0.378681;
+LargeNuc_part_MG94xREV_3x4[18][16]:=synRate*0.292965;
+LargeNuc_part_MG94xREV_3x4[18][17]:=LargeNuc_part_Shared_CG*LargeNuc_part_Shared_R*synRate*0.249915;
+LargeNuc_part_MG94xREV_3x4[18][19]:=LargeNuc_part_Shared_GT*LargeNuc_part_Shared_R*synRate*0.277297;
+LargeNuc_part_MG94xREV_3x4[18][22]:=LargeNuc_part_Shared_AC*LargeNuc_part_Shared_R*synRate*0.223626;
+LargeNuc_part_MG94xREV_3x4[18][26]:=LargeNuc_part_Shared_R*synRate*0.228782;
+LargeNuc_part_MG94xREV_3x4[18][30]:=LargeNuc_part_Shared_AT*LargeNuc_part_Shared_R*synRate*0.234948;
+LargeNuc_part_MG94xREV_3x4[18][34]:=LargeNuc_part_Shared_CG*LargeNuc_part_Shared_R*synRate*0.260941;
+LargeNuc_part_MG94xREV_3x4[19][3]:=LargeNuc_part_Shared_AC*LargeNuc_part_Shared_R*synRate*0.378681;
+LargeNuc_part_MG94xREV_3x4[19][16]:=LargeNuc_part_Shared_AT*LargeNuc_part_Shared_R*synRate*0.292965;
+LargeNuc_part_MG94xREV_3x4[19][17]:=LargeNuc_part_Shared_CT*synRate*0.249915;
+LargeNuc_part_MG94xREV_3x4[19][18]:=LargeNuc_part_Shared_GT*LargeNuc_part_Shared_R*synRate*0.179823;
+LargeNuc_part_MG94xREV_3x4[19][23]:=LargeNuc_part_Shared_AC*LargeNuc_part_Shared_R*synRate*0.223626;
+LargeNuc_part_MG94xREV_3x4[19][27]:=LargeNuc_part_Shared_R*synRate*0.228782;
+LargeNuc_part_MG94xREV_3x4[19][31]:=LargeNuc_part_Shared_AT*LargeNuc_part_Shared_R*synRate*0.234948;
+LargeNuc_part_MG94xREV_3x4[19][35]:=LargeNuc_part_Shared_CG*LargeNuc_part_Shared_R*synRate*0.260941;
+LargeNuc_part_MG94xREV_3x4[19][49]:=LargeNuc_part_Shared_CT*LargeNuc_part_Shared_R*synRate*0.176322;
+LargeNuc_part_MG94xREV_3x4[20][4]:=LargeNuc_part_Shared_AC*LargeNuc_part_Shared_R*synRate*0.378681;
+LargeNuc_part_MG94xREV_3x4[20][16]:=LargeNuc_part_Shared_AC*LargeNuc_part_Shared_R*synRate*0.312643;
+LargeNuc_part_MG94xREV_3x4[20][21]:=LargeNuc_part_Shared_AC*synRate*0.249915;
+LargeNuc_part_MG94xREV_3x4[20][22]:=synRate*0.179823;
+LargeNuc_part_MG94xREV_3x4[20][23]:=LargeNuc_part_Shared_AT*synRate*0.277297;
+LargeNuc_part_MG94xREV_3x4[20][24]:=LargeNuc_part_Shared_CG*LargeNuc_part_Shared_R*synRate*0.228782;
+LargeNuc_part_MG94xREV_3x4[20][28]:=LargeNuc_part_Shared_CT*LargeNuc_part_Shared_R*synRate*0.234948;
+LargeNuc_part_MG94xREV_3x4[20][36]:=LargeNuc_part_Shared_CG*LargeNuc_part_Shared_R*synRate*0.260941;
+LargeNuc_part_MG94xREV_3x4[20][50]:=LargeNuc_part_Shared_CT*LargeNuc_part_Shared_R*synRate*0.176322;
+LargeNuc_part_MG94xREV_3x4[21][5]:=LargeNuc_part_Shared_AC*LargeNuc_part_Shared_R*synRate*0.378681;
+LargeNuc_part_MG94xREV_3x4[21][17]:=LargeNuc_part_Shared_AC*LargeNuc_part_Shared_R*synRate*0.312643;
+LargeNuc_part_MG94xREV_3x4[21][20]:=LargeNuc_part_Shared_AC*synRate*0.292965;
+LargeNuc_part_MG94xREV_3x4[21][22]:=LargeNuc_part_Shared_CG*synRate*0.179823;
+LargeNuc_part_MG94xREV_3x4[21][23]:=LargeNuc_part_Shared_CT*synRate*0.277297;
+LargeNuc_part_MG94xREV_3x4[21][25]:=LargeNuc_part_Shared_CG*LargeNuc_part_Shared_R*synRate*0.228782;
+LargeNuc_part_MG94xREV_3x4[21][29]:=LargeNuc_part_Shared_CT*LargeNuc_part_Shared_R*synRate*0.234948;
+LargeNuc_part_MG94xREV_3x4[21][37]:=LargeNuc_part_Shared_CG*LargeNuc_part_Shared_R*synRate*0.260941;
+LargeNuc_part_MG94xREV_3x4[21][51]:=LargeNuc_part_Shared_CT*LargeNuc_part_Shared_R*synRate*0.176322;
+LargeNuc_part_MG94xREV_3x4[22][6]:=LargeNuc_part_Shared_AC*LargeNuc_part_Shared_R*synRate*0.378681;
+LargeNuc_part_MG94xREV_3x4[22][18]:=LargeNuc_part_Shared_AC*LargeNuc_part_Shared_R*synRate*0.312643;
+LargeNuc_part_MG94xREV_3x4[22][20]:=synRate*0.292965;
+LargeNuc_part_MG94xREV_3x4[22][21]:=LargeNuc_part_Shared_CG*synRate*0.249915;
+LargeNuc_part_MG94xREV_3x4[22][23]:=LargeNuc_part_Shared_GT*synRate*0.277297;
+LargeNuc_part_MG94xREV_3x4[22][26]:=LargeNuc_part_Shared_CG*LargeNuc_part_Shared_R*synRate*0.228782;
+LargeNuc_part_MG94xREV_3x4[22][30]:=LargeNuc_part_Shared_CT*LargeNuc_part_Shared_R*synRate*0.234948;
+LargeNuc_part_MG94xREV_3x4[22][38]:=LargeNuc_part_Shared_CG*LargeNuc_part_Shared_R*synRate*0.260941;
+LargeNuc_part_MG94xREV_3x4[22][52]:=LargeNuc_part_Shared_CT*LargeNuc_part_Shared_R*synRate*0.176322;
+LargeNuc_part_MG94xREV_3x4[23][7]:=LargeNuc_part_Shared_AC*LargeNuc_part_Shared_R*synRate*0.378681;
+LargeNuc_part_MG94xREV_3x4[23][19]:=LargeNuc_part_Shared_AC*LargeNuc_part_Shared_R*synRate*0.312643;
+LargeNuc_part_MG94xREV_3x4[23][20]:=LargeNuc_part_Shared_AT*synRate*0.292965;
+LargeNuc_part_MG94xREV_3x4[23][21]:=LargeNuc_part_Shared_CT*synRate*0.249915;
+LargeNuc_part_MG94xREV_3x4[23][22]:=LargeNuc_part_Shared_GT*synRate*0.179823;
+LargeNuc_part_MG94xREV_3x4[23][27]:=LargeNuc_part_Shared_CG*LargeNuc_part_Shared_R*synRate*0.228782;
+LargeNuc_part_MG94xREV_3x4[23][31]:=LargeNuc_part_Shared_CT*LargeNuc_part_Shared_R*synRate*0.234948;
+LargeNuc_part_MG94xREV_3x4[23][39]:=LargeNuc_part_Shared_CG*LargeNuc_part_Shared_R*synRate*0.260941;
+LargeNuc_part_MG94xREV_3x4[23][53]:=LargeNuc_part_Shared_CT*LargeNuc_part_Shared_R*synRate*0.176322;
+LargeNuc_part_MG94xREV_3x4[24][8]:=LargeNuc_part_Shared_AC*synRate*0.378681;
+LargeNuc_part_MG94xREV_3x4[24][16]:=LargeNuc_part_Shared_R*synRate*0.312643;
+LargeNuc_part_MG94xREV_3x4[24][20]:=LargeNuc_part_Shared_CG*LargeNuc_part_Shared_R*synRate*0.223626;
+LargeNuc_part_MG94xREV_3x4[24][25]:=LargeNuc_part_Shared_AC*synRate*0.249915;
+LargeNuc_part_MG94xREV_3x4[24][26]:=synRate*0.179823;
+LargeNuc_part_MG94xREV_3x4[24][27]:=LargeNuc_part_Shared_AT*synRate*0.277297;
+LargeNuc_part_MG94xREV_3x4[24][28]:=LargeNuc_part_Shared_GT*LargeNuc_part_Shared_R*synRate*0.234948;
+LargeNuc_part_MG94xREV_3x4[24][40]:=LargeNuc_part_Shared_CG*LargeNuc_part_Shared_R*synRate*0.260941;
+LargeNuc_part_MG94xREV_3x4[25][9]:=LargeNuc_part_Shared_AC*LargeNuc_part_Shared_R*synRate*0.378681;
+LargeNuc_part_MG94xREV_3x4[25][17]:=LargeNuc_part_Shared_R*synRate*0.312643;
+LargeNuc_part_MG94xREV_3x4[25][21]:=LargeNuc_part_Shared_CG*LargeNuc_part_Shared_R*synRate*0.223626;
+LargeNuc_part_MG94xREV_3x4[25][24]:=LargeNuc_part_Shared_AC*synRate*0.292965;
+LargeNuc_part_MG94xREV_3x4[25][26]:=LargeNuc_part_Shared_CG*synRate*0.179823;
+LargeNuc_part_MG94xREV_3x4[25][27]:=LargeNuc_part_Shared_CT*synRate*0.277297;
+LargeNuc_part_MG94xREV_3x4[25][29]:=LargeNuc_part_Shared_GT*LargeNuc_part_Shared_R*synRate*0.234948;
+LargeNuc_part_MG94xREV_3x4[25][41]:=LargeNuc_part_Shared_CG*LargeNuc_part_Shared_R*synRate*0.260941;
+LargeNuc_part_MG94xREV_3x4[25][54]:=LargeNuc_part_Shared_CT*LargeNuc_part_Shared_R*synRate*0.176322;
+LargeNuc_part_MG94xREV_3x4[26][10]:=LargeNuc_part_Shared_AC*synRate*0.378681;
+LargeNuc_part_MG94xREV_3x4[26][18]:=LargeNuc_part_Shared_R*synRate*0.312643;
+LargeNuc_part_MG94xREV_3x4[26][22]:=LargeNuc_part_Shared_CG*LargeNuc_part_Shared_R*synRate*0.223626;
+LargeNuc_part_MG94xREV_3x4[26][24]:=synRate*0.292965;
+LargeNuc_part_MG94xREV_3x4[26][25]:=LargeNuc_part_Shared_CG*synRate*0.249915;
+LargeNuc_part_MG94xREV_3x4[26][27]:=LargeNuc_part_Shared_GT*synRate*0.277297;
+LargeNuc_part_MG94xREV_3x4[26][30]:=LargeNuc_part_Shared_GT*LargeNuc_part_Shared_R*synRate*0.234948;
+LargeNuc_part_MG94xREV_3x4[26][42]:=LargeNuc_part_Shared_CG*LargeNuc_part_Shared_R*synRate*0.260941;
+LargeNuc_part_MG94xREV_3x4[26][55]:=LargeNuc_part_Shared_CT*LargeNuc_part_Shared_R*synRate*0.176322;
+LargeNuc_part_MG94xREV_3x4[27][11]:=LargeNuc_part_Shared_AC*LargeNuc_part_Shared_R*synRate*0.378681;
+LargeNuc_part_MG94xREV_3x4[27][19]:=LargeNuc_part_Shared_R*synRate*0.312643;
+LargeNuc_part_MG94xREV_3x4[27][23]:=LargeNuc_part_Shared_CG*LargeNuc_part_Shared_R*synRate*0.223626;
+LargeNuc_part_MG94xREV_3x4[27][24]:=LargeNuc_part_Shared_AT*synRate*0.292965;
+LargeNuc_part_MG94xREV_3x4[27][25]:=LargeNuc_part_Shared_CT*synRate*0.249915;
+LargeNuc_part_MG94xREV_3x4[27][26]:=LargeNuc_part_Shared_GT*synRate*0.179823;
+LargeNuc_part_MG94xREV_3x4[27][31]:=LargeNuc_part_Shared_GT*LargeNuc_part_Shared_R*synRate*0.234948;
+LargeNuc_part_MG94xREV_3x4[27][43]:=LargeNuc_part_Shared_CG*LargeNuc_part_Shared_R*synRate*0.260941;
+LargeNuc_part_MG94xREV_3x4[27][56]:=LargeNuc_part_Shared_CT*LargeNuc_part_Shared_R*synRate*0.176322;
+LargeNuc_part_MG94xREV_3x4[28][12]:=LargeNuc_part_Shared_AC*LargeNuc_part_Shared_R*synRate*0.378681;
+LargeNuc_part_MG94xREV_3x4[28][16]:=LargeNuc_part_Shared_AT*LargeNuc_part_Shared_R*synRate*0.312643;
+LargeNuc_part_MG94xREV_3x4[28][20]:=LargeNuc_part_Shared_CT*LargeNuc_part_Shared_R*synRate*0.223626;
+LargeNuc_part_MG94xREV_3x4[28][24]:=LargeNuc_part_Shared_GT*LargeNuc_part_Shared_R*synRate*0.228782;
+LargeNuc_part_MG94xREV_3x4[28][29]:=LargeNuc_part_Shared_AC*synRate*0.249915;
+LargeNuc_part_MG94xREV_3x4[28][30]:=synRate*0.179823;
+LargeNuc_part_MG94xREV_3x4[28][31]:=LargeNuc_part_Shared_AT*synRate*0.277297;
+LargeNuc_part_MG94xREV_3x4[28][44]:=LargeNuc_part_Shared_CG*LargeNuc_part_Shared_R*synRate*0.260941;
+LargeNuc_part_MG94xREV_3x4[28][57]:=LargeNuc_part_Shared_CT*synRate*0.176322;
+LargeNuc_part_MG94xREV_3x4[29][13]:=LargeNuc_part_Shared_AC*LargeNuc_part_Shared_R*synRate*0.378681;
+LargeNuc_part_MG94xREV_3x4[29][17]:=LargeNuc_part_Shared_AT*LargeNuc_part_Shared_R*synRate*0.312643;
+LargeNuc_part_MG94xREV_3x4[29][21]:=LargeNuc_part_Shared_CT*LargeNuc_part_Shared_R*synRate*0.223626;
+LargeNuc_part_MG94xREV_3x4[29][25]:=LargeNuc_part_Shared_GT*LargeNuc_part_Shared_R*synRate*0.228782;
+LargeNuc_part_MG94xREV_3x4[29][28]:=LargeNuc_part_Shared_AC*synRate*0.292965;
+LargeNuc_part_MG94xREV_3x4[29][30]:=LargeNuc_part_Shared_CG*synRate*0.179823;
+LargeNuc_part_MG94xREV_3x4[29][31]:=LargeNuc_part_Shared_CT*synRate*0.277297;
+LargeNuc_part_MG94xREV_3x4[29][45]:=LargeNuc_part_Shared_CG*LargeNuc_part_Shared_R*synRate*0.260941;
+LargeNuc_part_MG94xREV_3x4[29][58]:=LargeNuc_part_Shared_CT*LargeNuc_part_Shared_R*synRate*0.176322;
+LargeNuc_part_MG94xREV_3x4[30][14]:=LargeNuc_part_Shared_AC*LargeNuc_part_Shared_R*synRate*0.378681;
+LargeNuc_part_MG94xREV_3x4[30][18]:=LargeNuc_part_Shared_AT*LargeNuc_part_Shared_R*synRate*0.312643;
+LargeNuc_part_MG94xREV_3x4[30][22]:=LargeNuc_part_Shared_CT*LargeNuc_part_Shared_R*synRate*0.223626;
+LargeNuc_part_MG94xREV_3x4[30][26]:=LargeNuc_part_Shared_GT*LargeNuc_part_Shared_R*synRate*0.228782;
+LargeNuc_part_MG94xREV_3x4[30][28]:=synRate*0.292965;
+LargeNuc_part_MG94xREV_3x4[30][29]:=LargeNuc_part_Shared_CG*synRate*0.249915;
+LargeNuc_part_MG94xREV_3x4[30][31]:=LargeNuc_part_Shared_GT*synRate*0.277297;
+LargeNuc_part_MG94xREV_3x4[30][46]:=LargeNuc_part_Shared_CG*LargeNuc_part_Shared_R*synRate*0.260941;
+LargeNuc_part_MG94xREV_3x4[30][59]:=LargeNuc_part_Shared_CT*synRate*0.176322;
+LargeNuc_part_MG94xREV_3x4[31][15]:=LargeNuc_part_Shared_AC*LargeNuc_part_Shared_R*synRate*0.378681;
+LargeNuc_part_MG94xREV_3x4[31][19]:=LargeNuc_part_Shared_AT*LargeNuc_part_Shared_R*synRate*0.312643;
+LargeNuc_part_MG94xREV_3x4[31][23]:=LargeNuc_part_Shared_CT*LargeNuc_part_Shared_R*synRate*0.223626;
+LargeNuc_part_MG94xREV_3x4[31][27]:=LargeNuc_part_Shared_GT*LargeNuc_part_Shared_R*synRate*0.228782;
+LargeNuc_part_MG94xREV_3x4[31][28]:=LargeNuc_part_Shared_AT*synRate*0.292965;
+LargeNuc_part_MG94xREV_3x4[31][29]:=LargeNuc_part_Shared_CT*synRate*0.249915;
+LargeNuc_part_MG94xREV_3x4[31][30]:=LargeNuc_part_Shared_GT*synRate*0.179823;
+LargeNuc_part_MG94xREV_3x4[31][47]:=LargeNuc_part_Shared_CG*LargeNuc_part_Shared_R*synRate*0.260941;
+LargeNuc_part_MG94xREV_3x4[31][60]:=LargeNuc_part_Shared_CT*LargeNuc_part_Shared_R*synRate*0.176322;
+LargeNuc_part_MG94xREV_3x4[32][0]:=LargeNuc_part_Shared_R*synRate*0.378681;
+LargeNuc_part_MG94xREV_3x4[32][16]:=LargeNuc_part_Shared_CG*LargeNuc_part_Shared_R*synRate*0.184056;
+LargeNuc_part_MG94xREV_3x4[32][33]:=LargeNuc_part_Shared_AC*LargeNuc_part_Shared_R*synRate*0.249915;
+LargeNuc_part_MG94xREV_3x4[32][34]:=synRate*0.179823;
+LargeNuc_part_MG94xREV_3x4[32][35]:=LargeNuc_part_Shared_AT*LargeNuc_part_Shared_R*synRate*0.277297;
+LargeNuc_part_MG94xREV_3x4[32][36]:=LargeNuc_part_Shared_AC*LargeNuc_part_Shared_R*synRate*0.223626;
+LargeNuc_part_MG94xREV_3x4[32][40]:=LargeNuc_part_Shared_R*synRate*0.228782;
+LargeNuc_part_MG94xREV_3x4[32][44]:=LargeNuc_part_Shared_AT*LargeNuc_part_Shared_R*synRate*0.234948;
+LargeNuc_part_MG94xREV_3x4[33][1]:=LargeNuc_part_Shared_R*synRate*0.378681;
+LargeNuc_part_MG94xREV_3x4[33][17]:=LargeNuc_part_Shared_CG*LargeNuc_part_Shared_R*synRate*0.184056;
+LargeNuc_part_MG94xREV_3x4[33][32]:=LargeNuc_part_Shared_AC*LargeNuc_part_Shared_R*synRate*0.292965;
+LargeNuc_part_MG94xREV_3x4[33][34]:=LargeNuc_part_Shared_CG*LargeNuc_part_Shared_R*synRate*0.179823;
+LargeNuc_part_MG94xREV_3x4[33][35]:=LargeNuc_part_Shared_CT*synRate*0.277297;
+LargeNuc_part_MG94xREV_3x4[33][37]:=LargeNuc_part_Shared_AC*LargeNuc_part_Shared_R*synRate*0.223626;
+LargeNuc_part_MG94xREV_3x4[33][41]:=LargeNuc_part_Shared_R*synRate*0.228782;
+LargeNuc_part_MG94xREV_3x4[33][45]:=LargeNuc_part_Shared_AT*LargeNuc_part_Shared_R*synRate*0.234948;
+LargeNuc_part_MG94xREV_3x4[33][48]:=LargeNuc_part_Shared_GT*LargeNuc_part_Shared_R*synRate*0.176322;
+LargeNuc_part_MG94xREV_3x4[34][2]:=LargeNuc_part_Shared_R*synRate*0.378681;
+LargeNuc_part_MG94xREV_3x4[34][18]:=LargeNuc_part_Shared_CG*LargeNuc_part_Shared_R*synRate*0.184056;
+LargeNuc_part_MG94xREV_3x4[34][32]:=synRate*0.292965;
+LargeNuc_part_MG94xREV_3x4[34][33]:=LargeNuc_part_Shared_CG*LargeNuc_part_Shared_R*synRate*0.249915;
+LargeNuc_part_MG94xREV_3x4[34][35]:=LargeNuc_part_Shared_GT*LargeNuc_part_Shared_R*synRate*0.277297;
+LargeNuc_part_MG94xREV_3x4[34][38]:=LargeNuc_part_Shared_AC*LargeNuc_part_Shared_R*synRate*0.223626;
+LargeNuc_part_MG94xREV_3x4[34][42]:=LargeNuc_part_Shared_R*synRate*0.228782;
+LargeNuc_part_MG94xREV_3x4[34][46]:=LargeNuc_part_Shared_AT*LargeNuc_part_Shared_R*synRate*0.234948;
+LargeNuc_part_MG94xREV_3x4[35][3]:=LargeNuc_part_Shared_R*synRate*0.378681;
+LargeNuc_part_MG94xREV_3x4[35][19]:=LargeNuc_part_Shared_CG*LargeNuc_part_Shared_R*synRate*0.184056;
+LargeNuc_part_MG94xREV_3x4[35][32]:=LargeNuc_part_Shared_AT*LargeNuc_part_Shared_R*synRate*0.292965;
+LargeNuc_part_MG94xREV_3x4[35][33]:=LargeNuc_part_Shared_CT*synRate*0.249915;
+LargeNuc_part_MG94xREV_3x4[35][34]:=LargeNuc_part_Shared_GT*LargeNuc_part_Shared_R*synRate*0.179823;
+LargeNuc_part_MG94xREV_3x4[35][39]:=LargeNuc_part_Shared_AC*LargeNuc_part_Shared_R*synRate*0.223626;
+LargeNuc_part_MG94xREV_3x4[35][43]:=LargeNuc_part_Shared_R*synRate*0.228782;
+LargeNuc_part_MG94xREV_3x4[35][47]:=LargeNuc_part_Shared_AT*LargeNuc_part_Shared_R*synRate*0.234948;
+LargeNuc_part_MG94xREV_3x4[35][49]:=LargeNuc_part_Shared_GT*LargeNuc_part_Shared_R*synRate*0.176322;
+LargeNuc_part_MG94xREV_3x4[36][4]:=LargeNuc_part_Shared_R*synRate*0.378681;
+LargeNuc_part_MG94xREV_3x4[36][20]:=LargeNuc_part_Shared_CG*LargeNuc_part_Shared_R*synRate*0.184056;
+LargeNuc_part_MG94xREV_3x4[36][32]:=LargeNuc_part_Shared_AC*LargeNuc_part_Shared_R*synRate*0.312643;
+LargeNuc_part_MG94xREV_3x4[36][37]:=LargeNuc_part_Shared_AC*synRate*0.249915;
+LargeNuc_part_MG94xREV_3x4[36][38]:=synRate*0.179823;
+LargeNuc_part_MG94xREV_3x4[36][39]:=LargeNuc_part_Shared_AT*synRate*0.277297;
+LargeNuc_part_MG94xREV_3x4[36][40]:=LargeNuc_part_Shared_CG*LargeNuc_part_Shared_R*synRate*0.228782;
+LargeNuc_part_MG94xREV_3x4[36][44]:=LargeNuc_part_Shared_CT*LargeNuc_part_Shared_R*synRate*0.234948;
+LargeNuc_part_MG94xREV_3x4[36][50]:=LargeNuc_part_Shared_GT*LargeNuc_part_Shared_R*synRate*0.176322;
+LargeNuc_part_MG94xREV_3x4[37][5]:=LargeNuc_part_Shared_R*synRate*0.378681;
+LargeNuc_part_MG94xREV_3x4[37][21]:=LargeNuc_part_Shared_CG*LargeNuc_part_Shared_R*synRate*0.184056;
+LargeNuc_part_MG94xREV_3x4[37][33]:=LargeNuc_part_Shared_AC*LargeNuc_part_Shared_R*synRate*0.312643;
+LargeNuc_part_MG94xREV_3x4[37][36]:=LargeNuc_part_Shared_AC*synRate*0.292965;
+LargeNuc_part_MG94xREV_3x4[37][38]:=LargeNuc_part_Shared_CG*synRate*0.179823;
+LargeNuc_part_MG94xREV_3x4[37][39]:=LargeNuc_part_Shared_CT*synRate*0.277297;
+LargeNuc_part_MG94xREV_3x4[37][41]:=LargeNuc_part_Shared_CG*LargeNuc_part_Shared_R*synRate*0.228782;
+LargeNuc_part_MG94xREV_3x4[37][45]:=LargeNuc_part_Shared_CT*LargeNuc_part_Shared_R*synRate*0.234948;
+LargeNuc_part_MG94xREV_3x4[37][51]:=LargeNuc_part_Shared_GT*LargeNuc_part_Shared_R*synRate*0.176322;
+LargeNuc_part_MG94xREV_3x4[38][6]:=LargeNuc_part_Shared_R*synRate*0.378681;
+LargeNuc_part_MG94xREV_3x4[38][22]:=LargeNuc_part_Shared_CG*LargeNuc_part_Shared_R*synRate*0.184056;
+LargeNuc_part_MG94xREV_3x4[38][34]:=LargeNuc_part_Shared_AC*LargeNuc_part_Shared_R*synRate*0.312643;
+LargeNuc_part_MG94xREV_3x4[38][36]:=synRate*0.292965;
+LargeNuc_part_MG94xREV_3x4[38][37]:=LargeNuc_part_Shared_CG*synRate*0.249915;
+LargeNuc_part_MG94xREV_3x4[38][39]:=LargeNuc_part_Shared_GT*synRate*0.277297;
+LargeNuc_part_MG94xREV_3x4[38][42]:=LargeNuc_part_Shared_CG*LargeNuc_part_Shared_R*synRate*0.228782;
+LargeNuc_part_MG94xREV_3x4[38][46]:=LargeNuc_part_Shared_CT*LargeNuc_part_Shared_R*synRate*0.234948;
+LargeNuc_part_MG94xREV_3x4[38][52]:=LargeNuc_part_Shared_GT*LargeNuc_part_Shared_R*synRate*0.176322;
+LargeNuc_part_MG94xREV_3x4[39][7]:=LargeNuc_part_Shared_R*synRate*0.378681;
+LargeNuc_part_MG94xREV_3x4[39][23]:=LargeNuc_part_Shared_CG*LargeNuc_part_Shared_R*synRate*0.184056;
+LargeNuc_part_MG94xREV_3x4[39][35]:=LargeNuc_part_Shared_AC*LargeNuc_part_Shared_R*synRate*0.312643;
+LargeNuc_part_MG94xREV_3x4[39][36]:=LargeNuc_part_Shared_AT*synRate*0.292965;
+LargeNuc_part_MG94xREV_3x4[39][37]:=LargeNuc_part_Shared_CT*synRate*0.249915;
+LargeNuc_part_MG94xREV_3x4[39][38]:=LargeNuc_part_Shared_GT*synRate*0.179823;
+LargeNuc_part_MG94xREV_3x4[39][43]:=LargeNuc_part_Shared_CG*LargeNuc_part_Shared_R*synRate*0.228782;
+LargeNuc_part_MG94xREV_3x4[39][47]:=LargeNuc_part_Shared_CT*LargeNuc_part_Shared_R*synRate*0.234948;
+LargeNuc_part_MG94xREV_3x4[39][53]:=LargeNuc_part_Shared_GT*LargeNuc_part_Shared_R*synRate*0.176322;
+LargeNuc_part_MG94xREV_3x4[40][8]:=LargeNuc_part_Shared_R*synRate*0.378681;
+LargeNuc_part_MG94xREV_3x4[40][24]:=LargeNuc_part_Shared_CG*LargeNuc_part_Shared_R*synRate*0.184056;
+LargeNuc_part_MG94xREV_3x4[40][32]:=LargeNuc_part_Shared_R*synRate*0.312643;
+LargeNuc_part_MG94xREV_3x4[40][36]:=LargeNuc_part_Shared_CG*LargeNuc_part_Shared_R*synRate*0.223626;
+LargeNuc_part_MG94xREV_3x4[40][41]:=LargeNuc_part_Shared_AC*synRate*0.249915;
+LargeNuc_part_MG94xREV_3x4[40][42]:=synRate*0.179823;
+LargeNuc_part_MG94xREV_3x4[40][43]:=LargeNuc_part_Shared_AT*synRate*0.277297;
+LargeNuc_part_MG94xREV_3x4[40][44]:=LargeNuc_part_Shared_GT*LargeNuc_part_Shared_R*synRate*0.234948;
+LargeNuc_part_MG94xREV_3x4[41][9]:=LargeNuc_part_Shared_R*synRate*0.378681;
+LargeNuc_part_MG94xREV_3x4[41][25]:=LargeNuc_part_Shared_CG*LargeNuc_part_Shared_R*synRate*0.184056;
+LargeNuc_part_MG94xREV_3x4[41][33]:=LargeNuc_part_Shared_R*synRate*0.312643;
+LargeNuc_part_MG94xREV_3x4[41][37]:=LargeNuc_part_Shared_CG*LargeNuc_part_Shared_R*synRate*0.223626;
+LargeNuc_part_MG94xREV_3x4[41][40]:=LargeNuc_part_Shared_AC*synRate*0.292965;
+LargeNuc_part_MG94xREV_3x4[41][42]:=LargeNuc_part_Shared_CG*synRate*0.179823;
+LargeNuc_part_MG94xREV_3x4[41][43]:=LargeNuc_part_Shared_CT*synRate*0.277297;
+LargeNuc_part_MG94xREV_3x4[41][45]:=LargeNuc_part_Shared_GT*LargeNuc_part_Shared_R*synRate*0.234948;
+LargeNuc_part_MG94xREV_3x4[41][54]:=LargeNuc_part_Shared_GT*LargeNuc_part_Shared_R*synRate*0.176322;
+LargeNuc_part_MG94xREV_3x4[42][10]:=LargeNuc_part_Shared_R*synRate*0.378681;
+LargeNuc_part_MG94xREV_3x4[42][26]:=LargeNuc_part_Shared_CG*LargeNuc_part_Shared_R*synRate*0.184056;
+LargeNuc_part_MG94xREV_3x4[42][34]:=LargeNuc_part_Shared_R*synRate*0.312643;
+LargeNuc_part_MG94xREV_3x4[42][38]:=LargeNuc_part_Shared_CG*LargeNuc_part_Shared_R*synRate*0.223626;
+LargeNuc_part_MG94xREV_3x4[42][40]:=synRate*0.292965;
+LargeNuc_part_MG94xREV_3x4[42][41]:=LargeNuc_part_Shared_CG*synRate*0.249915;
+LargeNuc_part_MG94xREV_3x4[42][43]:=LargeNuc_part_Shared_GT*synRate*0.277297;
+LargeNuc_part_MG94xREV_3x4[42][46]:=LargeNuc_part_Shared_GT*LargeNuc_part_Shared_R*synRate*0.234948;
+LargeNuc_part_MG94xREV_3x4[42][55]:=LargeNuc_part_Shared_GT*LargeNuc_part_Shared_R*synRate*0.176322;
+LargeNuc_part_MG94xREV_3x4[43][11]:=LargeNuc_part_Shared_R*synRate*0.378681;
+LargeNuc_part_MG94xREV_3x4[43][27]:=LargeNuc_part_Shared_CG*LargeNuc_part_Shared_R*synRate*0.184056;
+LargeNuc_part_MG94xREV_3x4[43][35]:=LargeNuc_part_Shared_R*synRate*0.312643;
+LargeNuc_part_MG94xREV_3x4[43][39]:=LargeNuc_part_Shared_CG*LargeNuc_part_Shared_R*synRate*0.223626;
+LargeNuc_part_MG94xREV_3x4[43][40]:=LargeNuc_part_Shared_AT*synRate*0.292965;
+LargeNuc_part_MG94xREV_3x4[43][41]:=LargeNuc_part_Shared_CT*synRate*0.249915;
+LargeNuc_part_MG94xREV_3x4[43][42]:=LargeNuc_part_Shared_GT*synRate*0.179823;
+LargeNuc_part_MG94xREV_3x4[43][47]:=LargeNuc_part_Shared_GT*LargeNuc_part_Shared_R*synRate*0.234948;
+LargeNuc_part_MG94xREV_3x4[43][56]:=LargeNuc_part_Shared_GT*LargeNuc_part_Shared_R*synRate*0.176322;
+LargeNuc_part_MG94xREV_3x4[44][12]:=LargeNuc_part_Shared_R*synRate*0.378681;
+LargeNuc_part_MG94xREV_3x4[44][28]:=LargeNuc_part_Shared_CG*LargeNuc_part_Shared_R*synRate*0.184056;
+LargeNuc_part_MG94xREV_3x4[44][32]:=LargeNuc_part_Shared_AT*LargeNuc_part_Shared_R*synRate*0.312643;
+LargeNuc_part_MG94xREV_3x4[44][36]:=LargeNuc_part_Shared_CT*LargeNuc_part_Shared_R*synRate*0.223626;
+LargeNuc_part_MG94xREV_3x4[44][40]:=LargeNuc_part_Shared_GT*LargeNuc_part_Shared_R*synRate*0.228782;
+LargeNuc_part_MG94xREV_3x4[44][45]:=LargeNuc_part_Shared_AC*synRate*0.249915;
+LargeNuc_part_MG94xREV_3x4[44][46]:=synRate*0.179823;
+LargeNuc_part_MG94xREV_3x4[44][47]:=LargeNuc_part_Shared_AT*synRate*0.277297;
+LargeNuc_part_MG94xREV_3x4[44][57]:=LargeNuc_part_Shared_GT*LargeNuc_part_Shared_R*synRate*0.176322;
+LargeNuc_part_MG94xREV_3x4[45][13]:=LargeNuc_part_Shared_R*synRate*0.378681;
+LargeNuc_part_MG94xREV_3x4[45][29]:=LargeNuc_part_Shared_CG*LargeNuc_part_Shared_R*synRate*0.184056;
+LargeNuc_part_MG94xREV_3x4[45][33]:=LargeNuc_part_Shared_AT*LargeNuc_part_Shared_R*synRate*0.312643;
+LargeNuc_part_MG94xREV_3x4[45][37]:=LargeNuc_part_Shared_CT*LargeNuc_part_Shared_R*synRate*0.223626;
+LargeNuc_part_MG94xREV_3x4[45][41]:=LargeNuc_part_Shared_GT*LargeNuc_part_Shared_R*synRate*0.228782;
+LargeNuc_part_MG94xREV_3x4[45][44]:=LargeNuc_part_Shared_AC*synRate*0.292965;
+LargeNuc_part_MG94xREV_3x4[45][46]:=LargeNuc_part_Shared_CG*synRate*0.179823;
+LargeNuc_part_MG94xREV_3x4[45][47]:=LargeNuc_part_Shared_CT*synRate*0.277297;
+LargeNuc_part_MG94xREV_3x4[45][58]:=LargeNuc_part_Shared_GT*LargeNuc_part_Shared_R*synRate*0.176322;
+LargeNuc_part_MG94xREV_3x4[46][14]:=LargeNuc_part_Shared_R*synRate*0.378681;
+LargeNuc_part_MG94xREV_3x4[46][30]:=LargeNuc_part_Shared_CG*LargeNuc_part_Shared_R*synRate*0.184056;
+LargeNuc_part_MG94xREV_3x4[46][34]:=LargeNuc_part_Shared_AT*LargeNuc_part_Shared_R*synRate*0.312643;
+LargeNuc_part_MG94xREV_3x4[46][38]:=LargeNuc_part_Shared_CT*LargeNuc_part_Shared_R*synRate*0.223626;
+LargeNuc_part_MG94xREV_3x4[46][42]:=LargeNuc_part_Shared_GT*LargeNuc_part_Shared_R*synRate*0.228782;
+LargeNuc_part_MG94xREV_3x4[46][44]:=synRate*0.292965;
+LargeNuc_part_MG94xREV_3x4[46][45]:=LargeNuc_part_Shared_CG*synRate*0.249915;
+LargeNuc_part_MG94xREV_3x4[46][47]:=LargeNuc_part_Shared_GT*synRate*0.277297;
+LargeNuc_part_MG94xREV_3x4[46][59]:=LargeNuc_part_Shared_GT*LargeNuc_part_Shared_R*synRate*0.176322;
+LargeNuc_part_MG94xREV_3x4[47][15]:=LargeNuc_part_Shared_R*synRate*0.378681;
+LargeNuc_part_MG94xREV_3x4[47][31]:=LargeNuc_part_Shared_CG*LargeNuc_part_Shared_R*synRate*0.184056;
+LargeNuc_part_MG94xREV_3x4[47][35]:=LargeNuc_part_Shared_AT*LargeNuc_part_Shared_R*synRate*0.312643;
+LargeNuc_part_MG94xREV_3x4[47][39]:=LargeNuc_part_Shared_CT*LargeNuc_part_Shared_R*synRate*0.223626;
+LargeNuc_part_MG94xREV_3x4[47][43]:=LargeNuc_part_Shared_GT*LargeNuc_part_Shared_R*synRate*0.228782;
+LargeNuc_part_MG94xREV_3x4[47][44]:=LargeNuc_part_Shared_AT*synRate*0.292965;
+LargeNuc_part_MG94xREV_3x4[47][45]:=LargeNuc_part_Shared_CT*synRate*0.249915;
+LargeNuc_part_MG94xREV_3x4[47][46]:=LargeNuc_part_Shared_GT*synRate*0.179823;
+LargeNuc_part_MG94xREV_3x4[47][60]:=LargeNuc_part_Shared_GT*LargeNuc_part_Shared_R*synRate*0.176322;
+LargeNuc_part_MG94xREV_3x4[48][1]:=LargeNuc_part_Shared_AT*LargeNuc_part_Shared_R*synRate*0.378681;
+LargeNuc_part_MG94xREV_3x4[48][17]:=LargeNuc_part_Shared_CT*LargeNuc_part_Shared_R*synRate*0.184056;
+LargeNuc_part_MG94xREV_3x4[48][33]:=LargeNuc_part_Shared_GT*LargeNuc_part_Shared_R*synRate*0.260941;
+LargeNuc_part_MG94xREV_3x4[48][49]:=LargeNuc_part_Shared_CT*synRate*0.277297;
+LargeNuc_part_MG94xREV_3x4[48][51]:=LargeNuc_part_Shared_AC*LargeNuc_part_Shared_R*synRate*0.223626;
+LargeNuc_part_MG94xREV_3x4[48][54]:=LargeNuc_part_Shared_R*synRate*0.228782;
+LargeNuc_part_MG94xREV_3x4[48][58]:=LargeNuc_part_Shared_AT*LargeNuc_part_Shared_R*synRate*0.234948;
+LargeNuc_part_MG94xREV_3x4[49][3]:=LargeNuc_part_Shared_AT*LargeNuc_part_Shared_R*synRate*0.378681;
+LargeNuc_part_MG94xREV_3x4[49][19]:=LargeNuc_part_Shared_CT*LargeNuc_part_Shared_R*synRate*0.184056;
+LargeNuc_part_MG94xREV_3x4[49][35]:=LargeNuc_part_Shared_GT*LargeNuc_part_Shared_R*synRate*0.260941;
+LargeNuc_part_MG94xREV_3x4[49][48]:=LargeNuc_part_Shared_CT*synRate*0.249915;
+LargeNuc_part_MG94xREV_3x4[49][53]:=LargeNuc_part_Shared_AC*LargeNuc_part_Shared_R*synRate*0.223626;
+LargeNuc_part_MG94xREV_3x4[49][56]:=LargeNuc_part_Shared_R*synRate*0.228782;
+LargeNuc_part_MG94xREV_3x4[49][60]:=LargeNuc_part_Shared_AT*LargeNuc_part_Shared_R*synRate*0.234948;
+LargeNuc_part_MG94xREV_3x4[50][4]:=LargeNuc_part_Shared_AT*LargeNuc_part_Shared_R*synRate*0.378681;
+LargeNuc_part_MG94xREV_3x4[50][20]:=LargeNuc_part_Shared_CT*LargeNuc_part_Shared_R*synRate*0.184056;
+LargeNuc_part_MG94xREV_3x4[50][36]:=LargeNuc_part_Shared_GT*LargeNuc_part_Shared_R*synRate*0.260941;
+LargeNuc_part_MG94xREV_3x4[50][51]:=LargeNuc_part_Shared_AC*synRate*0.249915;
+LargeNuc_part_MG94xREV_3x4[50][52]:=synRate*0.179823;
+LargeNuc_part_MG94xREV_3x4[50][53]:=LargeNuc_part_Shared_AT*synRate*0.277297;
+LargeNuc_part_MG94xREV_3x4[50][57]:=LargeNuc_part_Shared_CT*LargeNuc_part_Shared_R*synRate*0.234948;
+LargeNuc_part_MG94xREV_3x4[51][5]:=LargeNuc_part_Shared_AT*LargeNuc_part_Shared_R*synRate*0.378681;
+LargeNuc_part_MG94xREV_3x4[51][21]:=LargeNuc_part_Shared_CT*LargeNuc_part_Shared_R*synRate*0.184056;
+LargeNuc_part_MG94xREV_3x4[51][37]:=LargeNuc_part_Shared_GT*LargeNuc_part_Shared_R*synRate*0.260941;
+LargeNuc_part_MG94xREV_3x4[51][48]:=LargeNuc_part_Shared_AC*LargeNuc_part_Shared_R*synRate*0.312643;
+LargeNuc_part_MG94xREV_3x4[51][50]:=LargeNuc_part_Shared_AC*synRate*0.292965;
+LargeNuc_part_MG94xREV_3x4[51][52]:=LargeNuc_part_Shared_CG*synRate*0.179823;
+LargeNuc_part_MG94xREV_3x4[51][53]:=LargeNuc_part_Shared_CT*synRate*0.277297;
+LargeNuc_part_MG94xREV_3x4[51][54]:=LargeNuc_part_Shared_CG*LargeNuc_part_Shared_R*synRate*0.228782;
+LargeNuc_part_MG94xREV_3x4[51][58]:=LargeNuc_part_Shared_CT*LargeNuc_part_Shared_R*synRate*0.234948;
+LargeNuc_part_MG94xREV_3x4[52][6]:=LargeNuc_part_Shared_AT*LargeNuc_part_Shared_R*synRate*0.378681;
+LargeNuc_part_MG94xREV_3x4[52][22]:=LargeNuc_part_Shared_CT*LargeNuc_part_Shared_R*synRate*0.184056;
+LargeNuc_part_MG94xREV_3x4[52][38]:=LargeNuc_part_Shared_GT*LargeNuc_part_Shared_R*synRate*0.260941;
+LargeNuc_part_MG94xREV_3x4[52][50]:=synRate*0.292965;
+LargeNuc_part_MG94xREV_3x4[52][51]:=LargeNuc_part_Shared_CG*synRate*0.249915;
+LargeNuc_part_MG94xREV_3x4[52][53]:=LargeNuc_part_Shared_GT*synRate*0.277297;
+LargeNuc_part_MG94xREV_3x4[52][55]:=LargeNuc_part_Shared_CG*LargeNuc_part_Shared_R*synRate*0.228782;
+LargeNuc_part_MG94xREV_3x4[52][59]:=LargeNuc_part_Shared_CT*LargeNuc_part_Shared_R*synRate*0.234948;
+LargeNuc_part_MG94xREV_3x4[53][7]:=LargeNuc_part_Shared_AT*LargeNuc_part_Shared_R*synRate*0.378681;
+LargeNuc_part_MG94xREV_3x4[53][23]:=LargeNuc_part_Shared_CT*LargeNuc_part_Shared_R*synRate*0.184056;
+LargeNuc_part_MG94xREV_3x4[53][39]:=LargeNuc_part_Shared_GT*LargeNuc_part_Shared_R*synRate*0.260941;
+LargeNuc_part_MG94xREV_3x4[53][49]:=LargeNuc_part_Shared_AC*LargeNuc_part_Shared_R*synRate*0.312643;
+LargeNuc_part_MG94xREV_3x4[53][50]:=LargeNuc_part_Shared_AT*synRate*0.292965;
+LargeNuc_part_MG94xREV_3x4[53][51]:=LargeNuc_part_Shared_CT*synRate*0.249915;
+LargeNuc_part_MG94xREV_3x4[53][52]:=LargeNuc_part_Shared_GT*synRate*0.179823;
+LargeNuc_part_MG94xREV_3x4[53][56]:=LargeNuc_part_Shared_CG*LargeNuc_part_Shared_R*synRate*0.228782;
+LargeNuc_part_MG94xREV_3x4[53][60]:=LargeNuc_part_Shared_CT*LargeNuc_part_Shared_R*synRate*0.234948;
+LargeNuc_part_MG94xREV_3x4[54][9]:=LargeNuc_part_Shared_AT*LargeNuc_part_Shared_R*synRate*0.378681;
+LargeNuc_part_MG94xREV_3x4[54][25]:=LargeNuc_part_Shared_CT*LargeNuc_part_Shared_R*synRate*0.184056;
+LargeNuc_part_MG94xREV_3x4[54][41]:=LargeNuc_part_Shared_GT*LargeNuc_part_Shared_R*synRate*0.260941;
+LargeNuc_part_MG94xREV_3x4[54][48]:=LargeNuc_part_Shared_R*synRate*0.312643;
+LargeNuc_part_MG94xREV_3x4[54][51]:=LargeNuc_part_Shared_CG*LargeNuc_part_Shared_R*synRate*0.223626;
+LargeNuc_part_MG94xREV_3x4[54][55]:=LargeNuc_part_Shared_CG*LargeNuc_part_Shared_R*synRate*0.179823;
+LargeNuc_part_MG94xREV_3x4[54][56]:=LargeNuc_part_Shared_CT*synRate*0.277297;
+LargeNuc_part_MG94xREV_3x4[54][58]:=LargeNuc_part_Shared_GT*LargeNuc_part_Shared_R*synRate*0.234948;
+LargeNuc_part_MG94xREV_3x4[55][10]:=LargeNuc_part_Shared_AT*LargeNuc_part_Shared_R*synRate*0.378681;
+LargeNuc_part_MG94xREV_3x4[55][26]:=LargeNuc_part_Shared_CT*LargeNuc_part_Shared_R*synRate*0.184056;
+LargeNuc_part_MG94xREV_3x4[55][42]:=LargeNuc_part_Shared_GT*LargeNuc_part_Shared_R*synRate*0.260941;
+LargeNuc_part_MG94xREV_3x4[55][52]:=LargeNuc_part_Shared_CG*LargeNuc_part_Shared_R*synRate*0.223626;
+LargeNuc_part_MG94xREV_3x4[55][54]:=LargeNuc_part_Shared_CG*LargeNuc_part_Shared_R*synRate*0.249915;
+LargeNuc_part_MG94xREV_3x4[55][56]:=LargeNuc_part_Shared_GT*LargeNuc_part_Shared_R*synRate*0.277297;
+LargeNuc_part_MG94xREV_3x4[55][59]:=LargeNuc_part_Shared_GT*LargeNuc_part_Shared_R*synRate*0.234948;
+LargeNuc_part_MG94xREV_3x4[56][11]:=LargeNuc_part_Shared_AT*LargeNuc_part_Shared_R*synRate*0.378681;
+LargeNuc_part_MG94xREV_3x4[56][27]:=LargeNuc_part_Shared_CT*LargeNuc_part_Shared_R*synRate*0.184056;
+LargeNuc_part_MG94xREV_3x4[56][43]:=LargeNuc_part_Shared_GT*LargeNuc_part_Shared_R*synRate*0.260941;
+LargeNuc_part_MG94xREV_3x4[56][49]:=LargeNuc_part_Shared_R*synRate*0.312643;
+LargeNuc_part_MG94xREV_3x4[56][53]:=LargeNuc_part_Shared_CG*LargeNuc_part_Shared_R*synRate*0.223626;
+LargeNuc_part_MG94xREV_3x4[56][54]:=LargeNuc_part_Shared_CT*synRate*0.249915;
+LargeNuc_part_MG94xREV_3x4[56][55]:=LargeNuc_part_Shared_GT*LargeNuc_part_Shared_R*synRate*0.179823;
+LargeNuc_part_MG94xREV_3x4[56][60]:=LargeNuc_part_Shared_GT*LargeNuc_part_Shared_R*synRate*0.234948;
+LargeNuc_part_MG94xREV_3x4[57][12]:=LargeNuc_part_Shared_AT*LargeNuc_part_Shared_R*synRate*0.378681;
+LargeNuc_part_MG94xREV_3x4[57][28]:=LargeNuc_part_Shared_CT*synRate*0.184056;
+LargeNuc_part_MG94xREV_3x4[57][44]:=LargeNuc_part_Shared_GT*LargeNuc_part_Shared_R*synRate*0.260941;
+LargeNuc_part_MG94xREV_3x4[57][50]:=LargeNuc_part_Shared_CT*LargeNuc_part_Shared_R*synRate*0.223626;
+LargeNuc_part_MG94xREV_3x4[57][58]:=LargeNuc_part_Shared_AC*LargeNuc_part_Shared_R*synRate*0.249915;
+LargeNuc_part_MG94xREV_3x4[57][59]:=synRate*0.179823;
+LargeNuc_part_MG94xREV_3x4[57][60]:=LargeNuc_part_Shared_AT*LargeNuc_part_Shared_R*synRate*0.277297;
+LargeNuc_part_MG94xREV_3x4[58][13]:=LargeNuc_part_Shared_AT*LargeNuc_part_Shared_R*synRate*0.378681;
+LargeNuc_part_MG94xREV_3x4[58][29]:=LargeNuc_part_Shared_CT*LargeNuc_part_Shared_R*synRate*0.184056;
+LargeNuc_part_MG94xREV_3x4[58][45]:=LargeNuc_part_Shared_GT*LargeNuc_part_Shared_R*synRate*0.260941;
+LargeNuc_part_MG94xREV_3x4[58][48]:=LargeNuc_part_Shared_AT*LargeNuc_part_Shared_R*synRate*0.312643;
+LargeNuc_part_MG94xREV_3x4[58][51]:=LargeNuc_part_Shared_CT*LargeNuc_part_Shared_R*synRate*0.223626;
+LargeNuc_part_MG94xREV_3x4[58][54]:=LargeNuc_part_Shared_GT*LargeNuc_part_Shared_R*synRate*0.228782;
+LargeNuc_part_MG94xREV_3x4[58][57]:=LargeNuc_part_Shared_AC*LargeNuc_part_Shared_R*synRate*0.292965;
+LargeNuc_part_MG94xREV_3x4[58][59]:=LargeNuc_part_Shared_CG*LargeNuc_part_Shared_R*synRate*0.179823;
+LargeNuc_part_MG94xREV_3x4[58][60]:=LargeNuc_part_Shared_CT*synRate*0.277297;
+LargeNuc_part_MG94xREV_3x4[59][14]:=LargeNuc_part_Shared_AT*LargeNuc_part_Shared_R*synRate*0.378681;
+LargeNuc_part_MG94xREV_3x4[59][30]:=LargeNuc_part_Shared_CT*synRate*0.184056;
+LargeNuc_part_MG94xREV_3x4[59][46]:=LargeNuc_part_Shared_GT*LargeNuc_part_Shared_R*synRate*0.260941;
+LargeNuc_part_MG94xREV_3x4[59][52]:=LargeNuc_part_Shared_CT*LargeNuc_part_Shared_R*synRate*0.223626;
+LargeNuc_part_MG94xREV_3x4[59][55]:=LargeNuc_part_Shared_GT*LargeNuc_part_Shared_R*synRate*0.228782;
+LargeNuc_part_MG94xREV_3x4[59][57]:=synRate*0.292965;
+LargeNuc_part_MG94xREV_3x4[59][58]:=LargeNuc_part_Shared_CG*LargeNuc_part_Shared_R*synRate*0.249915;
+LargeNuc_part_MG94xREV_3x4[59][60]:=LargeNuc_part_Shared_GT*LargeNuc_part_Shared_R*synRate*0.277297;
+LargeNuc_part_MG94xREV_3x4[60][15]:=LargeNuc_part_Shared_AT*LargeNuc_part_Shared_R*synRate*0.378681;
+LargeNuc_part_MG94xREV_3x4[60][31]:=LargeNuc_part_Shared_CT*LargeNuc_part_Shared_R*synRate*0.184056;
+LargeNuc_part_MG94xREV_3x4[60][47]:=LargeNuc_part_Shared_GT*LargeNuc_part_Shared_R*synRate*0.260941;
+LargeNuc_part_MG94xREV_3x4[60][49]:=LargeNuc_part_Shared_AT*LargeNuc_part_Shared_R*synRate*0.312643;
+LargeNuc_part_MG94xREV_3x4[60][53]:=LargeNuc_part_Shared_CT*LargeNuc_part_Shared_R*synRate*0.223626;
+LargeNuc_part_MG94xREV_3x4[60][56]:=LargeNuc_part_Shared_GT*LargeNuc_part_Shared_R*synRate*0.228782;
+LargeNuc_part_MG94xREV_3x4[60][57]:=LargeNuc_part_Shared_AT*LargeNuc_part_Shared_R*synRate*0.292965;
+LargeNuc_part_MG94xREV_3x4[60][58]:=LargeNuc_part_Shared_CT*synRate*0.249915;
+LargeNuc_part_MG94xREV_3x4[60][59]:=LargeNuc_part_Shared_GT*LargeNuc_part_Shared_R*synRate*0.179823;
+
+LargeNuc_part_Freqs={
+{   0.0360502764176}
+{   0.0307528786046}
+{   0.0221278618943}
+{   0.0341222936813}
+{   0.0257859197609}
+{   0.0219968149738}
+{    0.015827542199}
+{   0.0244068787914}
+{   0.0263804309771}
+{   0.0225039659052}
+{   0.0161924565185}
+{   0.0249695953177}
+{   0.0270914342559}
+{   0.0231104910055}
+{   0.0166288743196}
+{    0.025642573866}
+{   0.0175220734967}
+{    0.014947297294}
+{   0.0107551470048}
+{    0.016584986224}
+{    0.012533129455}
+{    0.010691452243}
+{  0.00769290516584}
+{   0.0118628528407}
+{   0.0128220889377}
+{   0.0109379506551}
+{  0.00787027011728}
+{   0.0121363586584}
+{   0.0131676688595}
+{   0.0112327494317}
+{  0.00808238901191}
+{   0.0124634568323}
+{   0.0248414888717}
+{   0.0211911632183}
+{   0.0152478452214}
+{   0.0235129564318}
+{   0.0177685361234}
+{   0.0151575435388}
+{   0.0109064271477}
+{   0.0168182679341}
+{   0.0181782013252}
+{   0.0155070106017}
+{   0.0111578819466}
+{   0.0172060240823}
+{   0.0186681387624}
+{   0.0159249543189}
+{    0.011458608294}
+{   0.0176697594758}
+{   0.0143192328467}
+{   0.0158881083871}
+{   0.0120065049509}
+{   0.0102422124298}
+{  0.00736966009109}
+{   0.0113643924189}
+{   0.0104783533247}
+{  0.00753957241628}
+{   0.0116264059062}
+{   0.0126143819006}
+{   0.0107607650706}
+{  0.00774277837276}
+{    0.011939759874}
+}
+;
+Model LargeNuc_part_MG94xREV_3x4_model=(LargeNuc_part_MG94xREV_3x4,LargeNuc_part_Freqs,0);
+
+UseModel (LargeNuc_part_MG94xREV_3x4_model);
+
+DataSet flu 					= 	ReadDataFile("../data/fluHA_codon.nex");
+Tree LargeNuc_tree				=	DATAFILE_TREE;
+
+
+DataSetFilter LargeNuc_part = CreateFilter(flu,3,"","","TAA,TAG,TGA");
+VERBOSITY_LEVEL = 10;
+LikelihoodFunction LargeNuc_LF = (LargeNuc_part,LargeNuc_tree);
+AUTO_PARALLELIZE_OPTIMIZE = 1;
+OPTIMIZATION_PRECISION    = 0.001;
+USE_ADAPTIVE_VARIABLE_STEP	  = 1;
+
+Optimize(res_LargeNuc_LF,LargeNuc_LF);
+
+/* test epilogue */
+	timeMatrix = endTestTimer 				  (_testDescription);
+	if (logTestResult (Abs (res_LargeNuc_LF[1][0] - _expectedLL) < 2*OPTIMIZATION_PRECISION))
+	{
+		return timeMatrix;
+	}
+	return 0;
+/* end test epilogue */
\ No newline at end of file
diff --git a/tests/hbltests/SimpleOptimizations/IntermediateNuc.bf b/tests/hbltests/SimpleOptimizations/IntermediateNuc.bf
new file mode 100644
index 0000000..d741f29
--- /dev/null
+++ b/tests/hbltests/SimpleOptimizations/IntermediateNuc.bf
@@ -0,0 +1,57 @@
+/* test preamble */
+
+	_testDescription 		= " fit the HKY85 model to an Influenza A alignment with 349 sequences and 967 nucleotides";
+	_expectedLL 			= -11389.4543728884;
+	ExecuteAFile 			("../Shared/TestInstrumentation.bf");
+	startTestTimer 			(_testDescription);
+
+/* end test preamble */
+
+global flu_part2_Shared_TVTS=0.25;
+
+flu_part2_HKY85={4,4};
+flu_part2_HKY85[0][1]:=t*flu_part2_Shared_TVTS;
+flu_part2_HKY85[0][2]:=t;
+flu_part2_HKY85[0][3]:=t*flu_part2_Shared_TVTS;
+flu_part2_HKY85[1][0]:=t*flu_part2_Shared_TVTS;
+flu_part2_HKY85[1][2]:=t*flu_part2_Shared_TVTS;
+flu_part2_HKY85[1][3]:=t;
+flu_part2_HKY85[2][0]:=t;
+flu_part2_HKY85[2][1]:=t*flu_part2_Shared_TVTS;
+flu_part2_HKY85[2][3]:=t*flu_part2_Shared_TVTS;
+flu_part2_HKY85[3][0]:=t*flu_part2_Shared_TVTS;
+flu_part2_HKY85[3][1]:=t;
+flu_part2_HKY85[3][2]:=t*flu_part2_Shared_TVTS;
+
+flu_part2_Freqs={
+{    0.321488786102}
+{    0.221264478507}
+{    0.225765445963}
+{    0.231481289428}
+}
+;
+Model flu_part2_HKY85_model=(flu_part2_HKY85,flu_part2_Freqs);
+
+UseModel (flu_part2_HKY85_model);
+DataSet flu 				= 	ReadDataFile("../data/fluHA.nex");
+DataSetFilter flu_part2 	= 	CreateFilter(flu,1,"0-966","101,26,75,103,100,102,49,89,29,9,4,0,19,91,81,57,43,25,54,66,41,30,51,48,52,83,36,73,34,28,45,39,20,6,76,72,69,56,46,62,38,31,78,15,12,105,104,23,97,86,1,77,88,85,60,119,33,107,106,122,121,120,21,93,87,79,27,84,82,63,61,11,67,24,59,32,53,47,42,99,98,96,70,95,117,118,115,114,8,116,113,80,94,92,108,112,111,68,65,110,74,71,37,109,22,90,35,123,124,159,158,157,156,155,153,150,148,151,149,143,58,50,44,142,40,55,154,147,152,146,145,144,141 [...]
+Tree Tree_12				=	DATAFILE_TREE;
+LikelihoodFunction flu_LF2  = 	(flu_part2,Tree_12);
+
+
+VERBOSITY_LEVEL 			  		= 	1;
+OPTIMIZATION_METHOD					=   4;
+OPTIMIZATION_PROGRESS_QUANTUM 		= 	0.5;
+OPTIMIZATION_PROGRESS_STATUS  		= 	"OPTIMIZING THE LIKELIHOOD FUNCTION";
+OPTIMIZATION_PROGRESS_TEMPLATE 		= 	"$1 $2 $3% $4 $5 $6";
+
+Optimize								(res_flu_LF2,flu_LF2);
+
+/* test epilogue */
+	timeMatrix = endTestTimer 				  (_testDescription);
+	if (logTestResult (Abs (res_flu_LF2[1][0] - _expectedLL) < 2*OPTIMIZATION_PRECISION))
+	{
+		return timeMatrix;
+	}
+	return 0;
+/* end test epilogue */
\ No newline at end of file
diff --git a/tests/hbltests/SimpleOptimizations/IntermediateProtein.bf b/tests/hbltests/SimpleOptimizations/IntermediateProtein.bf
new file mode 100644
index 0000000..5cb01eb
--- /dev/null
+++ b/tests/hbltests/SimpleOptimizations/IntermediateProtein.bf
@@ -0,0 +1,1510 @@
+#NEXUS
+
+BEGIN TAXA;
+	DIMENSIONS NTAX = 349;
+	TAXLABELS
+		'AG207_796' 'IN1_1196' 'PARIS8395' 'TIANJIN3392' 'AG601_796' 'LA5_1195' 'SH19_896' 'VAL_491' 'NCH813_895' 'TD4796' 'DE3_1195' 'NY43_1196' 'TD5096' 'FL4_1195' 'PARIS36395' 'TD5196' 'HK434_1096' 'YOKOHAMA7392' 'HEBEI1293' 'AG39_796' 'FUJIAN133_596' 'NY37_1096' 'AUC10896_97' 'GD1_396' 'NY50_1196' 'AUC5_697' 'NY55_1296' 'PA2_297' 'BE17_197' 'GNX189_796' 'PR1_797' 'BE24496_197' 'GQ1014_1096' 'RI7_397' 'BE62_297' 'GZH66_497' 'SAITAMA8096_97' 'BK197' 'HAR3_1296' 'SANTAFE208_896' 'BR184_696' ' [...]
+END;
+
+BEGIN CHARACTERS;
+	DIMENSIONS NCHAR = 329;
+	FORMAT
+		DATATYPE = PROTEIN
+		GAP=-
+		MISSING=?
+	;
+
+MATRIX
+	'AG207_796'        QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFNNESFNWTGVAQNGTSYACKRGSIKSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPITDSEQTSLYVQASGRVTVSTKRSQQTVIPNIGYRPWVRGVSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRSGKSSIMRSDAPIGNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'IN1_1196'         QKLPGNDNSTATLCLGHHTVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDGPHQILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFTNESFNWTGVAQNGTSYACKRGSVKSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYVQSSGRVTVSTKRSQQTVTPNIGSRPWVRGVSSIISIYWTIVKPGDILLINSTGNLIAPRGYFKIRKGKSSIMRSDAPIDNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'PARIS8395'        QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSPTGRICDSPHRILDGKNCTLIDALLGDPHCDGFENKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINENFNWTGVAQDGKSYACKRGSVNSFFSRLNWLHKLDYKYPALNVTMPNNGKFDKLYIWGVHHPSTDSDQTSLYVRSSGRVTVSTKRSQQTVIPDIGYRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKLRNGKSSIMRSDAPIGNCSSGCITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'TIANJIN3392'      QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQDGGSYACKRGSVNSFFSRLNWLHKSEYKYPALNVTMPNNGKFDKLYIWGVHHPSTDSDQTSLYVRASGRVTVSTKRSQQTVTPNIGSRPWVRGQSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'AG601_796'        QKLPGNDNSTATLCLGRHAVRNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFNNESFNWTGVAQNGTSYACKRGSIKSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPITDSEQTSLYVQASGRVTVSTKRSQQTVIPNIGYGPWVRGVSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRSGKSSIMRSDAPIGNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'LA5_1195'         QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFTNEGFNWTGVAQDGKSYSCKRGSVNSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGISSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIDNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVNQNTLKLATGMRDVPEKQTR
+	'SH19_896'         QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFNNESFNWTGVAQNGTSYACKRRSVKSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTRIYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGVSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRSGKSSIMRSDAPIGNCKSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'VAL_491'          QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNEKWDLFVERGKAFSNCYPYDVPDYASLRSLVASSGTLEFINEGFNWTGVTQSGGSAACKRGSVNSFFSRLNWLYESESKYPALNVTMPNNGKFDKLYIWGVHHPSTDKEQTNLYVRASGRVTVSTKRSQQTVIPNIGPRPWVRGLSSRISIYWTIVKPGDILLISSTGNLIAPRGYFKIHTGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNKITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'NCH813_895'       QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIGVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEGFNWTGVAQDGTSYACKRGSVKSFFSRLNWLHKLEDKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGISSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRSGKSSIMRSDAPIGNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'TD4796'           QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFNNESFNWTGVAQNGTSYACKRRSVKSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPITDSEQTSLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGVSSRISIYWTIVKPGDILLISSTGNLIAPRGYFKIRSGKSSIMRSDAPIGNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPQKLTR
+	'DE3_1195'         QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFTNEGFNWTGVAQDGKSYACKRGSVNSFFSRLNWLHKLEYKYPELNVTMPNNSKFDKLYIWGVHHPSTDSDQTSLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGISSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIDNCNSECITPNGSIPNDKPFQNVNRITYGSCPRYVNQNTLKLATGMRNVPEKQTR
+	'NY43_1196'        QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHQILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSTAYSNCYPYDVPDYASLRSLVASSGTLEFTKEGFNWTGVAQDGTSYACKRGSVKSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGISSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRGGKSSIMRSDAPIDNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'TD5096'           QKLPGNDNSTATLCLGHHAVPNGTLVRTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFNNESFNWTGVAQNGTSYACKRRSVKSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGVSSIISIYWTIVKPGDILLINSTGNLIAPRGYFKIRSGKSSIMRSDAPIDNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'FL4_1195'         QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFTNEGFNWTGVAQDGKSYACKRGSVNSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGISSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIDNCNSECITPDGSIPNDKPFQNVNRITYGACPRYVNQNTLKLATGMRGVPEKQTR
+	'PARIS36395'       QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSPTGRICDSPHRILDGKNCTLIDALLGDPHCDGFKNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINENFNWTGVAQDGKSYACKRGSVNSFFSRLNWLHKLDYKYPALNVTMPNNGKFDKLYIWGVHHPSTDSDQTSLYVRSSGRVTVSTKRSQQTVIPDIGYRPWVRGQSSRISIYWTIVKPGDILLIHSTGNLIAPRGYFKIRNGKSSIMRSDAPIGNCSSGCITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'TD5196'           QRLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFNNESFNWTGVAQNGTSYACKRRSVKSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYVQASGRVTVSTKRSQQTVIPNIGTRPWVRGVSSIISIYWTIVKPGDILLINSTGNLIAPRGYFKIRSGKSSIMRSDAPIDNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'HK434_1096'       QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSPTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINENFNWTGVAQDGKSYACKRGSVNSFFSRLNWLHKLEYKYPALNVTMPNNGKFDKLYIWGVHHPSTDSDQTSLYVRASGRVTVSTKRSQQTVIPDIGYRPWVRGQSSRIGIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIGNCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'YOKOHAMA7392'     QKLPGNGNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQDGGSYACKRGSVNSFFSRLNWLHKLEYKYPALNVTMPNNGKFDKLYIWGVHHPSTDSDQTSLYVRASGRVTVSTKRSQQTVTPNIGSRPWVRGQSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIGKCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'HEBEI1293'        QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQDGGSYACKRGSVNSFFSRLNWLHKLEYKYPALNVTMPNNGKFDKLYIWGVHHPSTDSVQTSLYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGQSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIGNCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'AG39_796'         QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFNNESFNWTGVAQNGTSYACKRRSVKSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGVSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRSGKSSIMRSDAPIGNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'FUJIAN133_596'    QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFNNESFNWTGVAQNGTSYACKRGSVKSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSIYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGVSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRSGKSSIMRSDAPIGNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'NY37_1096'        QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFTNEGFNWTGVAQDGTSYACKRGSVKSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGVSSIISIYWTIVKPGDILLINSTGNLIAPRGYFKIRSGKSSIMRSDAPIDNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'AUC10896_97'      QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSDCYPYDVPDYASLRSLVASSGTLEFTNEGFNWTGVAQDGTSYACKRGSVKSFFSRLNWLHK--YKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYVQASGRVTVSTKRSQQTVIPNIGYRPWVRGISSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRSGKSSIMRSDAPIGNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'GD1_396'          QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDGPHRILDGKNCTLIDALLGDPLCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFTNESFNWTGVAQNGTSYACKRGSVKSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTRLYVQSSGRVTVSTKRSQQTVIPNIGSRPWVRGISSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRSGKSSIMRSDAPIDNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'NY50_1196'        QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHQILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSTAYSNCYPYDVPDYASLRSLVASSGTLEFTKEGFNWTGVAQDGTSYACKRGSVKSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGISSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRSGKSSIMRSDAPIDNCNSECISPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'AUC5_697'         QKIPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGENCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFNNESFNWTGVAQNGTSYACKRRSIKSFFSRLNWLHQLKYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYAQASGRVTVSTKRSQQTVIPNIGSRPWVRGVSSGISIYWTIVKPGDILLINSTGNLIAPRGYFKIRSGKSSIMRSDAPIGKCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'NY55_1296'        QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQNSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFNNESFNWTGVAQNGTSYACKRRSVKSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGVSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRSGKSSIMRSDAPIGNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'PA2_297'          QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFKNKEWDLFVERSTAYSNCYPYDVPDYASLRSLVASSGTLEFTNEGFNWTGVAQDGTSYACKRGSVKSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGVSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRSGKSSIMRSDAPIDNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'BE17_197'         QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGIICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLIASSGTLEFNNESFNWTGVAQNGTSYACKRRSVKSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYAQASGRVTVSTKRSQQTVIPNIGSRPWVRGVSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRSGKSSIMRSDAPIGNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'GNX189_796'       QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFNNESFNWTGVAQNGTSYACKRRSVKSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPITDSEQTSLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGVSSRISIYWTIVKPGDILLISSTGNLIAPRGYFKIRSGKSSIMRSDAPIGNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'PR1_797'          QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGENCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFNNESFNWTGVAQNGTSYACKRRSIKSFFSRLNWLHQLKYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYAQASGRVTVSTKRSQQTVIPNIGSRPWVRGVSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRSGKSSIMRSDAPIGKCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'BE24496_197'      QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFNNESFNWTGVSQNGTSYACKRRSVKSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTRLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGISSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRSGKSSIMRSDAPIDNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'GQ1014_1096'      QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSTAYSNCYPYDVPDYASLRSLVASSGTLEFTNEGFNWTGVAQNGTSYACKRGSVKSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGISSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRSGKSSIMRSDAPIDNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'RI7_397'          QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERNKAYSNCYPYDVPDYASLRSLVASSGTLEFTNEGFNWTGVAQNGTSYACKRGSVKSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSIYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGVSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRSGKSSIMRSDAPIGNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'BE62_297'         QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGIICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFNNESFNWTGVAQNGTSYACKRRSVKSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYAQASGRVTVSTKRSQQTVIPNIGSRPWVRGISSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRSGKSSIMRSDAPIGNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'GZH66_497'        QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSDCYPYDVPDYASLRSLVASSGTLEFTNEGFNWTGVAQDGTSYACKRGSVNSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGVSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIDNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'SAITAMA8096_97'   QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFNNESFNWTGVAQNGTSYACKRRSVKSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYAQASGRVTVSTKRSQQTVIPNIGSRPWVRGVSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRSGKSSIMRSDAPIGKCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'BK197'            QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGKICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSDCYPYDVPDYASLRSLVASSGTLEFTKEGFNWPGVAQDGTSYACKRGSVKSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGISSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRSGKSSIMRSDTPIDNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'HAR3_1296'        QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFNNESFNWTGVSQNGTSYACKRRSVKSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGISSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRSGKSSIMRSDAPIDNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'SANTAFE208_896'   QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFNNESFNWTGVAQNGTSYACKRGSVKSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSIYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGISSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRSGKSSIMRSDAPIGNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQTTLKLATGMRNVPEKQTR
+	'BR184_696'        QKLPGNDNSTATLCLGHHAVPNGTLVKTITNEQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDDFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFTKEGFNWTGVAQDGKSYACKRGSVNSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGISSRISIYWTIVKPGDLLLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIGNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'SAUS54_797'       QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGENCTLIDALLGDLHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFNNESFNWTGVAQNGTSYACKRRSIKSFFSRLNWLHQLKYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYAQASGRVTVSTKRSQQTVIPNIGSRPWVRGVSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRSGKSSIMRSDAPIGKCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'BR309_796'        QKLPGNDNSTATLCLGHHAVPNGTLVKTITSDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFTNEGFNWTGVAQDGTSYACKRGSVKGFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYVQTSGRVTVSTKRSQQTVIPNIGSRPWVRGVSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRSGKSSIMRSDAPIDNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'HI1_997'          QKIPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSFSTGRICDSPHRILDGENCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFNNESFNWTGVAQNGTSYACKRRSIKSFFSRLNWLHQLKYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYAQASGRVTVSTKRSQQTVIPNIGSGPWVRGVSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRSGKSSIMRSDAPIGKCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'BR3_496'          QKIPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDDFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFTKEGFNWTGVAQDGKSYACKRGSVNSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGISSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAHIGNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'HK358_796'        QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGKICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFNNESFNWTGVAQNGTSYACKRGSVKSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGVSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRSGKSSIMRSDAPIGNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'SHZH157_796'      QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFNNESFNWIGVAQNGTSSACKRRSVKSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGISSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRSGKSSIMRSDAPIGNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'BR43_697'         QKLPGNDNSTATLCLGHHAVPNGTLVKTITSDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFTNEGFNWTGVAQNGTSYACKRGSVKGFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYVWGFHHPSTDSDQTSLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGVSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRSGKSSIMRSDAPIDNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'HK387_797'        QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGENCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFNNESFNWTGVAQNGTSYACKRRSIKSFFSRLNWLHQLKYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYAQASGRVTVSTKRSQQTVIPNIGSRPWVRGVSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRSGKSSIMRSDAPIGKCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'SP214_197'        QKFPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDDFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFNNESFNWTGVAQNGTSYACKRRSVKSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGVSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRSGKSSIMRSDAPIGNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'BR45_696'         QKIPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTDRICDSPHRILDGKNCTLIDALLGDPHCDDFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFTKEGFNWTGVAQDGKSYACKRGSVNSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGISSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAHIGNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'HK391_797'        QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGENCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFNNESFNWTGVAQNGTSYACKRRSIKSFFSRLNWLHQLKYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYAQASGRVTVSTKRSQQTVIPNIGSRPWVRGVSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRSGKSSIMRSDAPIGKCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'SYD497'           QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGENCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFNNESFNWTGVAQNGTSYACKRRSIKSFFSRLNWLHQLKYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYAQASGRVTVSTKRSQQTVIPNIGSRPWVRGVSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRSGKSSIMRSDAPIGKCNSECITPNGSIPNDKHFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'BR51_897'         QKLPGNDNSTATLCLGHHAVPNGTLVKTITSDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFTNEGFNWTGVAQNGTSYACKRGSVKGFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYVWGVHHPSTDSDQTSLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGISSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRSGKSSIMRSDAPIDNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'SYD597'           QKIPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGENCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFNNESFNWTGVAQNGTSYACKRSSIKSFFSRLNWLHQLKYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSIYAQASGRVTVSTKRSQQTVIPNIGSRPWVRGISSRISIHWTIVKPGDILLINSTGNLIAPRGYFKIRSGKSSIMRSDAPIGKCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'BR597_796'        QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDDFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFTKEGFNWTGVAQDGKSYACKRGSVNSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYIQASGRVTVSTKRSQQTVIPNIGSRPWVRGISSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIGKCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'JA416_297'        RKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTSATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFNNESFNWTGVAQNGTSYACKRRSVKSFFSRLNWLHQLKYKYPAQNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGVSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRSGKSSIMRSDAPIGNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'SYD697'           QKIPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGENCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFNNESFNWTGVAQNGTSYACKRRSIKSFFSRLNWLHQLKYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYAQASGRVTVSTKRSQQTVIPNIGSRPWVRGVSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRSGKSSIMRSDAPIGKCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'BR87_596'         QKIPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDDFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFTKEGFNWTGVAQDGKSYACKRGSVNSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYVQASGRVTVSTKRSQQTVIPNIGCRPWVRGISSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAHIGNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'JOH10_697'        QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHQILDGKNCTLIDALLGDPHCDGFKNKEWDLFVERSTAYSNCYPYDVPDYASLRSLVASSGTLEFTNEGFNWAGVAQDGTSYACKRGSVKSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGISSRISIYWTIVKPGDILLISSTGNLIAPRGYFKIRSGKSSIIRSDAPIDNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'TAS1_797'         QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSTAYSNCYPYDVPDYASLRSLVASSGTLEFTNEGFNWTGVAQDGTSYACKRRSVKSFFSRLNWLHKPEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYVHASGRVTVSTKRSQQTVIPNIGSRPWVRGVSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRSGKSSIMRSDAPIDNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'CA10_797'         QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHQILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSTAYSNCYPYDVPDYASLRSLVASSGTLEFTKEGFNWTGVAQDGTSYACKRGSVKSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSIYVQASGRVTVSTKRSQQTVIPSIGSRPWVRGISSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRSRKSSIMRSDAPIDNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'JOH3_397'         QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFNNESFNWTGVAQNGTSYACKRGSVKSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGISSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRSGKSSIMRSDAPIGNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'CA13_1296'        QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHQILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSTAYSNCYPYDVPDYASLRSLVASSGTLEFTKEGFNWTGVAQDGTSYACKRGSVKSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGVSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRSGKSSIMRSDAPIDNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'JOH5396_97'       QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGKICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFTDEGFNWTGVAQDGKSSACKRGSVNSFFSRLNWLHKPEHKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGISSRISIHWTIVKPGDILLINSIGNLIAPRGYFKIRNGKSSIMRSDAPIDNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'TH78_397'         QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGGICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSDCYPYDVPDYASLRSLVASSGTLEFTNEGFNWTGVAQDGTSYACKRGSVKSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSVQTSLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGVFSRISIYWTIVKPGDILLISSTGNLIAPRGYFKIRSGKSSIMRSDAPIGNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'CANBERRA5_897'    QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGENCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFNNESFNWTGVAQNGTSYACKRRSIKSFFSRLNWLHQLKYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYAQASGRVTVSTKRSQQTVIPNIGSSPWVRGVSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRSGKSSIMRSDAPIGKCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'JOH9_597'         QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHQILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSTAYSNCYPYDVPDYASLRSLVASSGTLEFTKEGFNWTGVAQDGTSYACKRGSVKSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPITDSEQTSLYVQASGRVTVSTKRSQQTVIPSIGYRPWVRGVSSRISIYWTIVTPGDILLINSTGNLIAPRGYFKIRSGKSSIMRSDAPIDNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'TH79_397'         QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGGICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSDCYPYDVPDYASLRSLVASSGTLEFTNEGFNWTGVAQDGTSYACKRGSVKSFFSRLNWLHKLEYKYPALNVAMPNNDKFDKLYIWGVHHPSTDSVQTSLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGVFSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRSGKSSIMRSDAPIGNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'KO572_297'        QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFNNESFNWTGVAQNGTSYACKRRSVKSFFSRLNWLHQLKYKYPAQNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGVSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRSGKSSIMRSDAPIGNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'TH9496_97'        QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFTNEGFNWTGVAQDGTSYACKRGSVKSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSVQTSLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGVSSRISIYWTIVKPGDILLISSTGNLIAPRGYFKIRSGKSSIMRSDAPIGNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'CAR42297'         QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSDCYPYDVPDYASLRSLVASSGTLEFTNEGFNWTGVAQDGTSYACKRGSVKSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGISSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRSGKSSIMRSDAPIGNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'KO671_297'        QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFNNESFNWTGVAQNGTSYACKRRSVKSFFSRLNWLHQLKYKYPAQNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGISSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRSGKSSIMRSDAPIGNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'TIANJING51_297'   QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFNNESFNWTGVAQNGTSYACKRGSVKSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTRIYAQASGRVTVSTKRSQQTVIPNIGSRPWVRGVSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRSGKSSIMRSDAPIGKCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'CAR465_896'       QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSDCYPYDVPDYASLRSLVASSGTLEFTNEGFNWTGVAQDGTSYACKRGSVKSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGISSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRSGKSSIMRSDAPIGNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'TIANJING55_896'   QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFNNESFNWTGVAQNGTSYACKRRSVKSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGVSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRSGKSSIMRSDAPIGNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'CL170_1096'       QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLIASSGTLEFNNESFNWTGVAQNGTSYACKRRSVKSFFSRLNWLHKLKYKYPAQNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGISSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRSGKSSIMRSDAPIGNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'KY2_297'          QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDGPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFTNESFNWPGVAQNGTSYACKRGSVKSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYVQSSGRVTVSTKRSQQTVTPNIGSRPWVRGVSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRRGKSSIMRSDAPIDNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'TX1196_97'        QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQGSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFNNESFNWTGVAQNGTSYACKRGSVKSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGVSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRSGKSSIMRSDAPIDNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'CN101_197'        QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFKNKEWDLFVERSTAYSNCYPYDVPDYASLRSLVASSGTLEFTNEGFNWTGVAQDGTSYACKRGSVKSFFSRLNWLHKPEYKHPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGVSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRSGKSSIMRSDAPIDNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'MN1_1196'         QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSDCYPYDVPDYASLRSLVASSGTLEFTNEGFNWTGVAQDGTSYACKRGSVKSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGVSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRSGKSSIMRSDALIGNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'CN10679_997'      QKIPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQNSSTGRICDSPHRILDGENCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFNNESFNWTGVAQNGTSYACKRRSIKSFFSRLNWLHQLKYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYAQASGRVTVSTKRSQQTVIPNIGSRPWVRGVSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRSGKSSIMRSDAPIGKCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'MN1_497'          QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHQILDGKNCTLIDALLGDPHCDGFKNKEWDLFVERSTAYSNCYPYDVPDYASLRSLVASSGTLEFTKEGFNWTGVAQDGTSYACKRGSVKSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGISSKISIYWTIVKPGDILLINSTGNLIAPRGYFKIRSGKSSIMRSDAPIDNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'UR41_197'         QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDDFQNEEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFNNESFNWIGVAQNGTSYACKRRSVKSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYAQTSGRVTVSTKRSQQTVIPNIGSKPWVRGISSRISIYWTIVKPGDILLITSTGNLIAPRGYFKIRSGKSSIMRSDAPIGKCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'MO10_1196'        QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHQILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSTAYSNCYPYDVPDYASLRSLVASSGTLEFTKEGFNWTGVAQDGTSYACKRGSVKSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGVSSKISIYWTIVKPGDILLINSTGNLIAPRGYFKIRSGKSSIMRSDAPIDNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'VIC3097'          QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSTAYSNCYPYDVPDYASLRSLVASSGTLEFTNEGFNWTGVAQDGTSYACKRRSVKSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYVHASGRVTVSTKRSQQTVIPNIGSRPWVRGVSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRSGKSSIMRSDAPIDNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'CO11_1196'        QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDGPHQILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFTNESFNWTGVAQNGTSYACKRGSVKSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYVQSSGRVTVSTKRSQQTVTPNIGSRPWVRGISSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRKGKSSIIRSDAPIDNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'MO11_1196'        QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFKNKEWDLFVERSTAYSNCYPYDVPDYASLRSLVASSGTLEFTNEGFNWTGVAQDGTSYACKRGSVKSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGISSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRSGKSSIMRSDAPIDNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'VIC4797'          QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSTAYSNCYPYDVPDYASLRSLVASSGTLEFTNEGFNWTGVAQDGTSYACKRRSVKSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGIHHPSTDSDQTSLYVHASGRVTVSTKRSQQTVIPNIGSRPWVRGVSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRSGKSSIMRSDAPIDNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'CORD3278_796'     QKIPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFNNESFNWTGVAQNGTSYACKRRSVKSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPITDSEQTSLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGVSSRISIYWTIVKPGDILLISSTGNLIAPRGYFKIRSGKSSIMRSDAPIGNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQTTLKLATGMRNVPEKQTR
+	'MON318_696'       QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSDCYPYDVPDYASLRSLVASSGTLEFTNEGFNWTGVAQDGTSYACKRGSVKSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGVSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRSGKSSIMRSDAPIGNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'WE397'            QKIPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGENCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFNNESFNWTGVAQNGTSYACKRGSIKSFFSRLNWLHQLKYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYAQASGRVTVSTKRSQQTVIPNIGSRPWVRGVSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRSGKSSIMRSDAPIGKCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'DE4_397'          QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSDCYPYDVPDYTSLRSLVASSGTLEFTNEGFNWTGVAQDGTSYACKRGSVKSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGVSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRSGKSSIMRSDAPIGNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'MOS2_197'         QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFKNKEWDLFVERSSAYSNCYPYDVPDYASLRSLVASSGTLEFTNEGFNWTGVAQDGTSYACKRGSVKSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSVQTSLYVQASGRITVSTKRSQQTVIPNIGSRPWVRGISSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRSGKSSIMRSDAPIDNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'YOKOHAMA6896_97'  QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSDCYPYDVPDYASLRSLVASSGTLEFTNEGFNWTGVAQDGTSYACKRGSVKSFFSRLNWLHKLEYKYPALNVTMPNDDKFDKLYIWGVHHPSTDSDQTSLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGVSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRSGKSSIMRSDAPIGNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'FG39_1096'        QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLIASSGTLEFTNEGFNWTGVAQDGTSYACKRGSVKSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGVSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRSGKSSIMRSDAPIGNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'FR7597'           QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFTNEGFNWIGVAQDGTSYACKRGSVKSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGVSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRSGKSSIMRSDAPIGNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQSTLKLATGMRNVPEKQTR
+	'NJ8_1296'         QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRMCDGPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFTNESFNWTGVAQNGTSYACKRGSVKSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYVQSSGRVTVSTKRSQQTVTPNIGSRPWVRGVSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRRGKSSIMRSDAPIDNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'NY9_196'          QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGNLEFTNEGFNWTGVAQDGTSYACKRGSVKSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGVSSRISIYWTIVKPGDILLIHSTGNLIAPRGYFKIRSGKSSIMRSDAPIGNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'SHA9_995'         QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFTNEGFNWTGVAQDGTSYACKRGSVKSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTRIYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGVSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRSGKSSIMRSDAPIGNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'HK357_696'        QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVSDYASLRSLVASSGTLEFNNESFNWTGVAQNGTSYACKRRSVKSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGVSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRSGKSSIMRSDAPIGNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'CI2115_696'       QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFNNESFNWTGVAQNGTSYACKRRSVKSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGVSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRSGKSSIMRSDAPIGNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'GZH8_496'         QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFNNESFNWTGVAQNGTSYACKRRSVKSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGVSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRSGKSSIMRSDAPIGNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'GZH11_496'        QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFNNESFNWTGVAQNGTSYACKRRSVKSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGVSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRSGKSSIMRSDAPIGNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'SHZH43_396'       QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDGPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFTNESFNWTGVAQNGTSYACKRGSVKSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPITDSDQTSIYVQSSGRVTVSTKRSQQTVIPNIGSRPWVRGVSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRSGKSSIMRSDAPIDNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'WZH1_596'         QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDGPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFTNESFNWTGVAQNGTSYACKRGSVKSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSIYVQSSGRVTVSTKRSQQTVIPNIGSRPWVRGVSSRISIYWTIVKPGDILLITSTGNLIAPRGYFKIRSGKSSIMRSDAPIDNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'FUK11496E'        QKLPRNDNSTATLCLGHHAVPNGTLVKTITNDQVEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFTNEGFNWTGVAQDGTSYACKRGSVKSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSVQTSLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGVSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRSGKSSIMRSDAPIGNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'FUK11496C'        QKLPRNDNSTATLCLGHHAVPNGTLVKTITNDQVEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFTNEGFNWTGVAQDGTSYACKRGSVKSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSIYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGISSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRSGKSSIMRSDAPIGNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'AUC596'           QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSDCYPYDVPDYASLRSLVASSGTLEFTNEGFNWTGVAQDGTSYACKRGSVKSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGVSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRSGKSSIMRSDAPIGNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'BRI2296'          QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSDCYPYDVPDYASLRSLVASSGTLEFTNEGFNWTGVAQDGTSYACKRGSVKSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGISSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRSGKSSIMRSDAPIGNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'BRIS3596'         QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSDCYPYDVPDYASLRSLVASSGTLEFTNEGFNWTGVAQDGTSYACKRGSVKSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRSGKSSIMRSDAPIGNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'CHR196'           QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSDCYPYDVPDYASLRSLVASSGTLEFTNEGFNWTGVAQDGTSYACKRGSVKSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSVQTSLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGVSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRSGKSSIMRSDAPIGNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'HI2_796'          QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSDCYPYDVPDYASLRSLVASSGTLEFTNEGFNWTGVAQDGTSYACKRGSVKSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGVSSIISIYWTIVKPGDILLINSTGNLIAPRGYFKIRSGKSSIMRSDAPIGNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'WE4896'           QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSDCYPYDVPDYASLRSLVASSGTLEFTNEGFNWTGVAQDGTSYACKRGSVKSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVLHPGTDSDQTSLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGVSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRSGKSSIMRSDAPIGNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'CNIC35_196'       QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFTNEGFNWTGVAQDGTSYACKRGSVKSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGVSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRSGKSSIMRSDAPIGNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'WUH359_995'       QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFTNEGFNWTGVAQDGTSYACKRGSVKSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSIYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGISSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRSGKSSIMRSDAPIGNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'NCH933_995'       QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFTNEGFNWTGVAQDGTSYACKRGSVKSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSVQTSLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGISSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRSGKSSIMRSDAPIGNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'WA596'            QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFTNEGFNWAGVAQDGTSYACKRGSVKSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGISSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRSGKSSIMRSDAPIGNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'FUJIAN47_396'     QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFTNEGFNWTGVAQDGTSYACKRGSVKSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTRLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGISSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRSGKSSIMRSDAPIDNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'JA99_196'         QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFTNEGFNWTGVAQNGTSYACKRGSVKSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGISSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRSGKSSIMRSDAPIDNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'WI3_896'          QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYAPLRSLVASSGTLEFTNEGFNWTGVAQDGTSYACKRGSVKSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGVSSIISIYWTIVKPGDILLINSTGNLIAPRGYFKIRSGKSSIMRSDAPIDNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'AK2_796'          QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFTNEGFNWTGVAQDGTSYACKRGSVKSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGISSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRSGKSSIMRSDAPIDNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'TW523_596'        QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDMPDYASLRSLVASSGTLEFTNEGFNWTGVAQDGTSYACKRGSVKSFFSRLNWLHKLEYKYPALNVAMPNNDKFDKLYIWGVHHPSTDSDQTSLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGISSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRSGKSSIMRSDAPIDNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'CNIC22_195'       QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFTNEGFNWTGVAQDGKSYACKRGSVNSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTRIYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGISSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIGNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'GNX42_495'        QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFTNEGFNWTGVAQDGKSSACKRGSVNSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGISSRISIYWTIVKPGDILLITSTGNLIAPRGYFKIRNGKSSIMRSDAPIGNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'MO6_396'          QKLPGNDNSTATLCLGHHAVPNGTLVKTITDDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFTNEGFNWTGVAQDGKSYACKRGSVNSFFSRLNWLYKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGISSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIDNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'CN2796_1295'      QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSIGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFTNEGFNWTGVAQDGKSYACKRGSVKSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGISSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIDNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'ID3_1195'         QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFTNEGFNWTGVAQDGKSYACKRGSVKSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYVQASGRVTVSTKRIQQTVIPNIGSRPWVRGISSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIDNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'AK16_995'         QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEMTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFTNEGFNWTGVAQDGKSYACKRGSVNSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGISSRISIYWTIVKPGDILLITSTGNLIAPRGYFKIRNGKSSIMRSDAPIDNCNSKCITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'JOH1795'          QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEMTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFTNEGFNWTGVAQDGKSYACKRGSVKSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSIYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGISSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIDNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'ID4_1195'         QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFTNEGFNWTGVAQDGKSYACKRGSVNSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGISSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIDNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQKTLKLATGMRNVPEKQTR
+	'NV1_1195'         QKLPGNDNSTATLCLGHHAVPSGTLVKTITNDQIEVTNATELIQSSPTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFTNEGFNWTGVAQDGKSYSCKRGSVNSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGISSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIDNCNSECITPNGSIPNDKPFQNVNRITYGSCPRYVKQNTLKLATGMRNVPEKQTR
+	'KO45_296'         QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFTNEGFNWTGVAQDGKSYACKRGSVNSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGISSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIDNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'CN61_296'         QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFTNEGFNWTGVAQDGKSYACKRGSVNSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGISSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIDNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'BZ2_395'          QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFTNEGFNWTGVAQDGKSYACKRGSVNSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGISSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIDNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'GE491_396'        QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFTNEGFNWTGVAQDGKSYACKRGSVNSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGISSRISIYWTIVKPGDILLITSTGNLIAPRGYFKIRNGKSSIMRSDAPIDNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'UK897_696'        QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFTNEGFNWTGVAQDGKSYACKRGSVNSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGISSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIDNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'MN6_1195'         QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFTNEGFNWTGVAQDGKSYACKRGSVNSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGISSRISIYWTIVEPGDILLINSIGNLIAPRGYFKIRTGKSSIMRSDAPIDNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'CN17_196'         QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFTNEGFNWTGVAQDGKSYACKRGSVNSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGISSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIDNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'BE281_1294'       QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFTNEGFNWTGVAQDGKSYACKRGSVNSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPITDSDQTRLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGISSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIGNCNSECITPNGSIPNDKPFQNVNRITYGAFPRYVKQNTLKLATGMRNVPEKQTR
+	'SHD5_894'         QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFTNEGFNWTGVAQDGKSYACKRGSVNSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTRIYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGISSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIGNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQDTLKLATGMRNVPEKQTR
+	'AG4057_795'       QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRIIDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFTNEGFNWTGVAQDGKSYACKRGSVKSFFSRLNWLHKLEYKYPALNVAMPNNDKFDKLYIWGVHHPSTDSDQTSLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGISSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIGNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'BZ18_496'         QKIPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDDFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFTKESFNWTGVAQDGKSYACKRGSVNSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYVQASGRVTVCTKRSQQTVIPNIASRPWVRGISSRISIYWTIVKPGDILLINSTGNLIAPRGYFKMRNGKSSIMRSDAHIGNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'BZ8_496'          QKIPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDDFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFTKEGFNWTGVAQDGKSYACKRGSVNSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGISSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAHIGNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'GE578652_295'     QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFTKEGFNWTGVAQDGKSYACKRGSVKSFFSRLNWLHKLEYKYPALNVTMPNNDKFGKLYIWGVHHPSTDSDQTSLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGISSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIGNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'WV1_395'          QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFTKEGFNWTGVAQDGKSYACKRGSVKSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGISSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIGNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'SN27_595'         QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFTKEGFNWTGVAQDGKSYACKRGSVKSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGISSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIGNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'WA186_1294'       QKLPGNDNSTTTLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFTKEGFNWTGVAQDGKSYACKRGSVKSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTNSDQTSLYVQPSGRVAVSTKRSQQTVIPNIGSRPWVRGISSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIGNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKHTR
+	'GE767_495'        QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSKGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFTKEGFNWTGVAQDGKSYACKRGSVNSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGISSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIGNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'HK3_195'          QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFTKEGFNWTGVAQNGKSYACKRGSVNSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGISSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIGNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'SN28_595'         QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICGSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFTKEGFNWTGVAQDGKSYACKRGSVNSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGISSRISIYWTIVKPGDILLINSIGNLIAPRGYFKIRNGKSSIMRSDAPIGNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'NJ11_1294'        QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFTKEGFNWTGVAQDGKSYACKRGSVNSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGISSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIGNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'HK38_895'         QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFTKEGFNWTGVAQDGKSYACKRGSVNSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGISSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIGNCKSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'CN147_495'        QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSAGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFTKEGFNWTGVAQDGKSYSCKRGSVNSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKMYIWGVHHPSTDSDQTSLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGISSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMKSDAPIGNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'VA25_1294'        QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFTKEGFNWTGVAQDGKSYACKRGSVNSFFSRLNWLHKLEDKYPALNVAMPNNDKFDKLYIWGVHHPSTDSDQTSLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGISSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSMMRSDAPIGNCNSECITPNGSIPNDKPYQNVNRITYGACPRYVKQNTLKLATGMRNVPEKHSR
+	'JOH295'           QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFTKEGFSWTGVAQDGGSCACKRGSANSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYVQASGRVTVSTKRSQQTVTPNIGSRPWVRGISSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIGNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'AK10_295'         QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFTNEGFNWTGVAQDGKSYACKRGSVKSFFSRLNWLHKLEYKYPALDVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGISSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIDNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'NE11_395'         QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFTNEGFNWTGVAQDGKSYACKRGSVKSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGISSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIDNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'KWJ195_1194'      QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFTNEGFNWTGVAQDGKSYACKRGSVKSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGFHHPSTDSDQTSLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGISSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIDNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'CHW995_1294'      QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICNSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFTNEGFNWTGVAQDGKSYACKRGSVNSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYVQASGRVTVSTKKSQQTVIPNIGSRPWVRGISSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIDNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'HAR3_194'         QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQDGTSYACKRGSVKSFFSRLNWLHKLEYKYPALNVTIPNSGKFDKLYIWGVHHPSTDSDQTSIYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGISSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIGNCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'HK42_396'         QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSPTGRICDSPHRILDGRNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINENFNWTGVAQDGKSYACKRGSVNSFFSRLNWLHKLDYKYPALNVTMPNNGKFDKLYIWGVHHPSTDSDQISLYVRSSGRVTVSTKRSQQTVIPDIGYRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKLRNGKSSIMRSDAPIGNCSSGCITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'MEM196_1195'      QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSPTGRICDSPHRILDGKNCTLIDALLGDPHCDGFKNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINENFNWTGVAQDGKSYACKRGSVNSFFSRLNWLHKLDYKYPALNVTMPNNGKFDKLYIWGVPHPSTDSDQTTLYVRSSGRVTVSTKRSQQTVIPDIGYRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKLRNGKSSIMRSDAPIGNCSSGCITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'NY17_1294'        QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSPTGRICNSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINENFNWTGVAQDGKSYTCKRGSVNSFFSRLNWLHKLEYKYPALNVTMPNNGKFDKLYIWGVHHPSTDSDQTSIYVRASGRVTVSTKRSQQTVIPDIGYRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKLRNGKSSIMRSDAPIGNCSSECITPNGSIPNDKPFQNVNRITYGACPRYIKQNTLKLSTGMRNVPEKQTR
+	'CA5_395'          QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSPTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVLDYASLRSLVASSGTLEFTNENFNWTGVAQNGKSYTCKRGSVNSFFSRLNWLHKLEYKYPALNVTMPNNGKFDKLYIWGVHHPSTDSDQTRLYVRASGKVTVSTKRSQQTVIPDIGYRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIGNCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'JA8695_1294'      QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSPTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFTNENFNWTGVAQNGKSYSCKRGSVNSFFSRLNWLHKLEYKYPALNVTMPNNGKFDKLYIWGVHHPSTDSDQTSLYVRASGKVTVSTKRSQQTVIPDIGYRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIGNCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'SP378_195'        QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSPTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFTNENFNWTGVAQDGKSYSCKRGSVNSFFSRLNWLHKLEYKYPALNVTMPNNGKFDKLYIWGVHHPSTDSDQTSLYVRASGKVTVSTKRSQQTVIPDIGYRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIGNCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'PA7_1294'         QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSPTGRICDSPHRILDGRNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFTNENFNWTGVAQDGKSYSCKRGSVNSFFSRLNWLHKLEYKYPALNVTMPNNGKFDKLYIWGVHHPSTDSDQTSLYVRASGRVTVSTKRSQQTVIPDIGYRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIDNCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRDVPEK???
+	'LA1_195'          QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQNSPTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFTNENFNWTGVAQDGKSYACKRGSVKSFFSRLNWLHKLEYKYPALNVTMPNNGKFDKLYIWGVHHPSTDSDQTSLYVRASGKVTVSTKRSQQTVIPDIGYRPWVRGQSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIGNCSSECITPNGSIPNDKPFPNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'NJ8_1194'         QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQNSPTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFTNENFNWTGVAQDGKSYACKRGSVKSFFSRLNWLHKLEYKYPALNVTMPNNGKFDKLYIWGVHHPSTDSVQTSLYVRASGKVTVSTKRSQQTVIPDIGYRPWVRGQSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIGNCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'CN124_295'        QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSPTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFTNENFNWTGVAQDGKSYACKRGSVKSFFSRLNWLHKLEYKYPALNVTMPNNGKFDKLYIWGVHHPSTDSDQTSLYVRASGKVTVSTKRSQQTVIPDIGYRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIGNCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'MA1_195'          QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSPTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFTNENFNWTGVAQDGKSYACKRGSVKSFFSRLNWLHKLEYKYPALNVTMPNNGKFDKLYIWGVHHPSTDSDQTSLYVRASGKVTVSTKRSQQTVTRNIGYRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIGNCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'OH3_195'          QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSPTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFTNENFNWTGVAQDGKSYACKRGSVKSFFSRLNWLHKLEYKYPALNVTMPNNGKFDKLYIWGVHHPSTDSDQTSLYVRASGKVTVSTKRSQQTVIPDIGYRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIGNCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLRLATGMRNVPEKQTR
+	'NJ10_195'         QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSPTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFTNENFNWTGVAQDGKSYACKRGSVKSFFSRLNWLHKLEYKYPALNVTMPNNGKFDKLYIWGVHHPSTDSDQTSLYVRASGKVTVSTKRSQQTVIPDIGYRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIGNCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'IL5_195'          QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSPTGRICNSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFTNENFNWTGVAQDGKSYACKRGSVKSFFSRLNWLHKLEYKYPALNVTMPNNGKFDKLYIWGVHHPSTDSDQTSLYVRASGKVTVSTKRSQQTVIPDIGYRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIGNCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPE????
+	'TX5_1294'         QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSFPTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFTNENFNWTGVAQDGKSYACKRGSVKSFFSRLNWLHKLEYKYPALNVTMPNNGKFDKLYIWGVHHPSTDSDQTSLYVRASGKVTVSTKRSQQTVIPDIGYRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIGNCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'SP351_195'        QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSPTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFTNENFNWTGVAQDGKSYACKRGSVKSFFSRLNWLHKLEYKYPALNVTMPNNGKFDKLYIWGVHHPSTDSDQTSLYVRASGKVTVSTKRSQQTVIPDIGYRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKGSIMRSDAPIGNCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'PA15_295'         QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSPTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFTNENFNWTGVAQDGKSYACKRGSVKSFFSRLNWLHKLEYKYPALNVTMPNNGKFDKLYIWGVHHPSTDSDQTSLYVRASGKVTVSTKRSQQTVIPDIGYRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIGNCSSECITPNGSIPNDKPFQNVNRITYGACPRYIKQNTLKLATGMRNVPEKQTR
+	'NY28_1294'        QKLPGNDNSTATLCLGHHAVPSGTLVKTITNDQIEVTNATELVQSSPTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFTNENFNWTGVAQDGKSYACKRGSVKSFFSRLNWLHKLEYKYPALHVTMPNNDKFGKLYIWGVHHPSTDSDQTSLYVRASGTVTVSTKRSQQPVIPDIGYRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIGNCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEK???
+	'HK1_694'          QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSPTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSSCYPYDVPDYASLRSLVASSGTLEFINENFNWTGVAQDGKSYACKRGSVKSFFSRLNWLHKLEYKYPALNVTMPNNGKFDKLYIWGVHHPSTDSDQTSLYVRASGRVTVSTKRSQQTVIPDIGYRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIGNCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'HK55_794'         QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSPTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINENFNWTGVAQDGKSYACKRGSVKSFFSRLNWLHKLEYKYPALNVTMPNNGKFDKLYIWGVHHPSTDSDQTSLYVRASGRVTVSTKRSQQTVIPDIGYRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIGNCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'JOH33_794'        QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSPTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINENFNWTGVAQDGKSYACKRGSVNSFFSRLNWLHKLEYKYPALNVTMPNNGKFDKLYIWGVHHPSTDSDQTSLYVRASGRVTVSTKRSQQTVIPDIGYRPWVRGQSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIGNCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'AG3779_1094'      QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSPTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINENFNWTGVAQDGKSYACKRGSVNSFFSRLNWLHKLEYKYPALNVTMPHNGKFDKLYIWGVHHPSTDSVQTSLYVRASGRVTVSTKRSQQTVIPDIGYRPWVRGQSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIGNCSSECITPNGSIPNDKPFPNVNRITYGACPRYVKENTLKLATGMRNVPEKQTR
+	'AKI194'           QKLPGNDNSTATLCLGHHAVPNGTLVRTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQDGKSYACKRGSVKSFFSRLNWLHKLEYKYPELNVTMPNNGKFDKLYIWGVHHPSTDSDQTSLYVRASGRVTVSTKRSQQTVIPNIGFRPWVRGQSSRMSIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIGNCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'RO182_194'        QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQDGKSYACKRGSVKSFFSRLNWLHKLEYKYPALNVTMPNNGKFDKLYIWGVHHPSTDSDQTSLYVRASGRVTVSTKRSQQTVIPNIGFRPWVRGQSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIGNCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'VT3_194'          QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQDGKSYACKRGSVNSFFSRLNWLHKLEYKYPALNVTMPNNGKFDKLYIWGVHHPSTDSDQTSLYVRASGRVTVSTKRSQQTVIPNIGFRPWVRGQSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIGNCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'RO160_194'        HKLPRNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQDGKSYACKRGSVNSFFSRLNWLHKLEYKYPALNVTMPNNGKFDKLYIWGVHHPSTDSDQTSLYVRASGRVTVSTKRSQQTVIPNIGFRPWVRGQSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIGNCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'SANT7198_894'     QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDIFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQDGKSYACKRGSVNSFFSRLNWLHKLEYKYPALNVTMPNNGKFDKLYIWGVHHPSTDSDQTRLYVRASGRVTVSTKRSQQTVIPNIGFRPWVRGQSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIGSCSSECITPNGSIPNDKPFQNVNRITYGACPRYVEPHTLKLATGMRYVPEKQTR
+	'FR120394'         QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQDGKSYACKRGSVKSFFSRLNWLHKLEYKYPALNVTMPNNGKFDKLYIWGVHHPSTDSDQTSLYVRASGKVTVSTKRSQQTVIPNIGFRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIGNCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'NED37293'         QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQDGKSYACKRGSVKSFFSRLNWLHKLEYKYPALNVTMPNNGKFDKLYIWGVHHPSTNSDQTSLYVRASGRVTVSTKRSQQTVIPNIGFRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIGNCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'NY16_1194'        QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQDGKSYTCKRGSVNSFFSRLNWLHQSKYKYPELNVTMPNNGKFDKLYIWGVHHPSTDSDQTILYARASGRVTVSTKRSQQTVIPNIGFRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIGNCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'NY4295_1194'      QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQDGKSYTCKRGSVNSFFSRLNWLHQSKYKYPELNVTMPNNGKFDKLYIWGVHHPSTDSDQTSLYARASGRVTVSTKRSQQTVIPNIGFRPWVRGQSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIGNCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'PA993_1294'       PKLPGNDNSTATLCLGHHAVPNGTLVKTITNEQIEVTNATELVQSSSTGRICNSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQDGKSYACKRGSVNSFFSRLNWLHKLEYKYPAVNVTMPNNGKFDKLYIWGVHHPSTDSDQTSLYVRASGRVTVSTKRSQQTVIPNIGFRPWVRGLSSGISIYWTIVRPGDILLINSTGNLIAPRGYSKIRNGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'CA5_1193'         QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQDGKSYSCKRGSVNSFFSRLNWLHKLEYKYPALNVTMPNNGKFDKLYIWGVHHPSTDSDQTSLYVRASGRVTVSTKRSQQTVIPNIGFRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIGNCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'WA41_1293'        RKLPGNDNSTATLCLGHHAVPSGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFVNEDFNWTGVAQDGKSYSCKRGSVNSFFSRLNWLHKLEYKYPALDVTMPNNGKFDKLYIWGVHHPSTDSDQTSLYVRASGRVTVSTKRSQQTVIPNIGFRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIGNCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'CA4_794'          QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQDGTSYSCKRGSVNSFFSRLNWLHKLKYKYPALNVTMPNNGKFDKLYIWGVHHPSTDSDQTSLYVRASGGVTVSTKRSQQTVIPNIGSRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIGNCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'SP190_393'        QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQDGKSYSCKRGSVNSFFSRLNWLHELEYKYPALNVTMPNNGKFDKLYIWGVHHPSTDSDQTSLYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIGNCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'ST1_193'          QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQDGKSYSCKRGSVNSFFSRLNWLHKLEYKYPALNVTMPNNGKFDKLYIWGVHHPSTDSDQTSLYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIGNCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'SP125_293'        QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQDGKSYTCKRGSVNSFFSRLNWLHKLEYKYPALNVTMPNNGKFDKLYIWGVHHPSTDSDQTSLYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIGNCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'WY1_1193'         QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYPSLRSLVASSGTLEFINEDFNWTGVAQDGKSYTCKRGSVNSFFSRLNWLHKLEYKYPALNVTMPNNGKFDKLYIWGVHHPSTDSDQTSLYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIGNCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'TX57_1293'        QKLPGNDNSTATLCLGHHAVPNGTLVKTITNGQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFIERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQDGKSYACKRGSVNSFFSRLNWLHKLEYKYPALNVTMPNNGKFDKLYIWGVHHPSTDSDQTSLYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKMRNGKSSIMRSDAPIGNCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'LA4_893'          QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQDGKSYACKRGSVNSFFSRLNWLHKLEYKYPALNVTMPNNGKFDKLYIWGVHHPSTDSDQTSLYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIGNCSSECITPNGSIPNDKPFQNVNKITYGACPRYVRQNTLKLATGMRNVPEKQTR
+	'LA6_993'          QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQDGKSYACKRGSVNSFFSRLNWLHKLEYKYPALNVTMPNNGKFDKLYIWGVHHPSTDSDQTSLYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGLSSRISIYWTIVKPGDILLINSIGNLIAPRGYFKIRNGKSSIMRSDAPIGNCSSECITPNGSIPNDKPFQNVNKITYGACPRYVRQNTLKLATGMRNVPEKQTR
+	'NY3_293'          QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQDGKSYACKRGSVNSFFSRLNWLHKLEYKYPALNVTMPNNGKFDKLYIWGVHHPSTDSDQTSLYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIGNCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'NY15_894'         QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQISSTGRICDSPHRILDGKNCTLIDALLGDPNCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQDGKSYACRRGSVNSFFSRLNWLHSLKYKYPALNVTMPNNGKFDKLYIWGVHHPSKDSDQTSLYARASGRVTVSTKRSQQTVIPNIGSRPWVRGQSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIGNCSSECITPNGSIPNDKPFQNVNRITYGACPRYIKQDTLKLATGMRNVPEKQTR
+	'AK18_493'         QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQDGKSYACKRGSVKSFFSRLNWLHKLEYKYPALNVTMPNNGKFDKLYIWGVHHPSTDSDQTSLYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIGNCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'NY26_293'         QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQDGKSYACKRGSVNSFFSRLNWLHKLEYKYPALNVTMPNNGKFDKLYIWGVHHPSTDSDQTSLYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIGNCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'NY38_193'         QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGIAQDGKSYACKRGSVNSFFSRLNWLHKLEYKYPALNVTMPNNGKSDKLYIWGVHHPSTDSDQTSLYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGQSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIGNCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'ENG22093'         QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQDGKSYACKRGSVKSFFSRLNWLHKLEYKYPALNVTMPNNGKFDKLYIWGVHHPSTDSDQTSLYVRASGGVTVSTKRSQQTVIPNIGSRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIGNCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'WA2693'           QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQDGKSYACKRGSVNSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYVRASGGVTVSTKRSQQTVIPNIGYRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIGNCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'GA3_393'          QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQDGKSYACKRGSVNSFFSRLNWLHKLEYKYPALNVTMPNNGKFDKLYIWGVHHPSTDSDQTSLYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIGNCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'BK122_694'        QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATDLVQNSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQDGKSYACKRGSVNGFFSRLNWLHKLEYKYPALNVTMPNNGKSDKLYIWGVHHPSTDSDQTSLYVRASGGVTVSTKRSQQTVIPSIGSRPWVRGQSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIGNCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'TH7594'           QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQNSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQDGKSYACKRGSVKGFFSRLNWLHKLEYKYPALNVTIPNNGKSDKLYIWGVHHPSTDSDQTSLYVRASGGVTVSTKRSQQTVIPSIGSRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIGNCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'SN7_694'          QKLPGNDNSTATLCLGHHAVPNGTLVKTIANDQIEVTNATELVQNSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQDGKSYTCKRGSVNGFFSRLNWLHKLEYKYPALNVTMPNNGKFDKLYIWGVHHPSTDSDQTSLYVRASGGVTVSTKRSQQTVIPSIGSRPWVRGQSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIGNCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'AG3105_693'       QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDNPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQDGKSYACKRGSVNSFFSRLNWLHKLEDKYPALNVTMPNNGKFDKLYIWGFHHPSTDSDQTSLYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGQSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIGNCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'GD25_693'         QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSEAYSSCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQDGKSYACKRGSVNSFFSRLNWLHKLEYKYPALNVTMPNNGKFDKLYIWGFHHPSTDSDQTSLYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGQSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIGNCSSECITPNGSIPNDKPFQNVNKITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'WUZ1_794'         QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSSCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGIAQDGKSYACKRGSVNSFFSRLNWLHKLEYKYPTLNVTMPNNGKFDKLYIWGVHHPSTDSDQTSLYVRASGRVIVSTKRSQQTVIPNIGSRPWVRGQSSRISIHWTIVKPGDILLINSTGNLIAPRGYFKIRTGKSSIMRSDAPIGNCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'UDE44_394'        QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQDGKSYACKRGSVNSFFSRLNWLHKLEYKYPALNVTMPNNGKFDKLYIWGVHHPSTDSDQTSLYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGQSSRISIYWTIVKPGDILLIDSTGNLIAPRGYFKIRNGKSSIMRSDAPIGNCSSECITPNGSIPNDKPFQNVNKITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'CC893'            QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQDGKSYACKRGSVNSFFSRLNWLHKLEYKYPALNVTMPNNGKFDKLYIWGVHHPSTDSDQTSLYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGQSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIGNCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'WAIK2093'         QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERTKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQDGKSSACKRGSVNSFFSRLNWLHKLEYKYPALNVTMPNNGKFDKLYIWGVHHPSTDSDQTSLYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGQSSRISIYWTIVKPGDILLINSTGNLVAPRGYFKIRNGKSSIMRSDAPIGNCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'GD27_594'         QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGKICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQDGKSYACKRGSVNSFFSRLNWLHKLEYKYPALNVTMPNNGKFDKLYIWGVHHPSTDSDQTILYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGQSSRMSIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIGNCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'AA393'            QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQDGKSYACKRGSVNSFFSRLNWLHKLEYKYPALNVTMPNNGKFDKLYIWGVHHPSTDSDQTSLYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGQSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIGNCSSECITPNGSIPNDKPFQNVNRITYGACPRYVNQNTLKLATGMRNVPEKQTR
+	'NO93'             QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQDGESYACKRGSVNSFFSRLNWLHKLEYKYPALNVTMPNNGKFDKLYIWGVHHPSTDSDQTSLYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGQSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIGNCSSECITPNGSIPNDKPFQNMNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'NCH3396_593'      QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFKNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQDGGSYACKRGSVNSFFSRLNWLHKLEYKYPALNVTMPNNGKFDKLYIWGVHHPSTDSDQTRLYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGQSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIGNCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'NY1393'           QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQDGGSYACKRGSVNSFFSRLNWLHKLEYKYPALNVTMPNNGKFDKLYIWGVHHPSTDSDQTSLYVRASGRVTVSTKRSQQTVTPNIGSRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIGNCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'NGX10_193'        QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVQDYASLRSLVASSGTLEFINEDFNWTGVAQDGGSYACKRGSVNSFFSRLNWLHKLEYKYPALNVTMPNNGKFDKLYIWGVHHPSTDSDQTSLYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGLSSRISIYWTIVKPGDILLIDSTGNLIAPRGYFKIRNGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNRITYGACPRYVNQNTLKLATGMRNVPEKQTR
+	'SIC4_593'         QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVQDYASLRSLVASSGTLEFINEDFNWTGVAQDGGSYACKRGSVNSFFSRLNWLHKLEYKYPALNVTMPNNGKFDKLYIWGVHHPSTDSDQTSLYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGLSSRISIYWTIVKPGDILLIDSTGNLIAPRGYFKIRNGKSSIMRSDAPIGNCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'RU58_393'         QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVQDYASLRSLVASSGTLEFINEDFNWTGVTQDGGSYACKRGSVNSFFSRLNWLHKLEYKYPALNVTMPNNGKFDKLYIWGVHHPSTDSDQTSLYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGLSSGISIYWTIVKPGDILLIDSTGNLIAPRGYFKIRNGKSSIMRSDAPIGNCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'WUZ4_493'         QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVQDYASLRSLVASSGTLEFINEDFNWTGVAQDGGSYACKRGSVNSFFSRLNWLHKLEYKYPALNVTMPNNGKFDKLYIWGVHHPSTDSDQTSLYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGLSSGISIYWTIVKPGDILLIDSTGNLIAPRGYFKIRNGKSSIMRSDAPIGNCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'GD04_393'         QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQDGGSYACKRGSVNSFFSRLNWLHKLEYKYPALNVTMPNNGKFDKLYIWGVHHPSTDSDQTSLYVRESGRVTVSTKRSQQTVIPNIGSRPWVRGQSSRISIYWTIVKPGDILLIDSTGNLIAPRGYFKIRNGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNRITYGACPRYVNQNTLKLATGMRNVPEKQTR
+	'HAR1592'          QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQDGGSYACKRGSVNSFFSRLNWLHKLEYKYPALNVTMPNNGKFDKLYIWGVHHPSTDSDQTSLYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGQSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIGNCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'NCH12_1193'       QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRLCDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQDGGSYACRRGSVNSFFSRLNWLHKLEYKYPALNVTMPNNGKFDKLYIWGVHHPSTDSDQTSLYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGQSSRMSIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIGNCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQHTLKLATGMRNVPEKQTR
+	'NCH3332_493'      QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRLCDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQDGGSYACRRGSVNSFFSRLNWLHKLEYKYPALNVTMPNNGKFDKLYIWGVHHPSTDSDQTSLYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGQSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIGNCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQHTLKLATGMRNVPEKQTR
+	'NCH58_1293'       QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRLCDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFKWTGVAQDGGSYACRRGSVNSFFSRLNWLHKLEYKYPALNVTMPNNGKFDKLYIWGVHHPSTDSDQTSLYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGQSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIGNCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQHTLKLATGMRNVPEKQTR
+	'HK23_792'         QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQDGGSYACKRGSVNSFFSRLNWLYKLEYKYPALNVTMPNNGKFDKLYIWGVHHPSTDSVQTSLYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGQSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIGNCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'SHD9_393'         QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICGSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQDGGSYACKRGSVNSFFSRLNWLHKLEYKYPALNVTMPNNGKFDKLYIWGVHHPSTDSDQTSLYVRASGRVTVSTKRSQQTVTPNIGSRPWVRGQSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIGNCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'PS688_193'        QKLPGNDNSTATLCLGHHAVPNGTLVKTITKDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQDGGSYACKRGSVNSFFSRLNWLHKLEYKYPALNVTMPNNGKFDKLYIWGVHHPSTDSDQTSLYVRASGRVTVSTKRSQQTVTPNIGSRPWVRGQSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIGNCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'SAP_1292'         QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQDGGSYACKRGSVNSFFSRLNWLHKLEYKYPALNVTMPNNGKFDKLYIWGVHHPSTDSDQTSLYVRASGRVTVSTKRSQQTVTPNIGSRPWVRGQSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIGNCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'NY64_1293'        QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPNCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFTNEDFNWTGVAQDGGSYACKRGSVNSFFSRLNWLHKLEYKYPALNVTMPNNGKFDKLYIWGVHHPSTDSDQTSLYVRASGRVTVSTKRSQQTVTPNIGSRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'NY63_1293'        QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPNCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFTNEDFNWTGVAQDGGSYACKRGSVNSFFSRLNWLHKLEYKYPALNVTMPNNGKFDKLYIWGVHHPSTDSDQTSLYVRASGRVTVSTKRSQQTVTPNIGSRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'FR110994'         QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPNCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFTNEDFNWTGVAQDGGSYACKRGSVNSFFSRLNWLHKLEYKYPALNVTMPNNGKFDKLYIWGVHHPSTDSDQTSLYVRASGRVTVSTKRSQQTVTPNIGSRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'UR46967_294'      QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPNCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFTNEDFNWTGVAQDGGSYACKRGSVNSFFSRLNWLHKLEYKYPALNVTMPNNGKFDKLYIWGVHHPSTDSVQTSLYVRASGRVTVSTKRSQQTVTPIIGSRPWVRGQSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'CA271_1192'       QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQDGGSYACKRGSVNSFFSRLNWLHKSEYKYPALNVTMPNNGKFDKLYIWGVHHPSTDSDQTSLYVRASGRVTVSTKRSQQTVTPNIGSRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIGTCSFECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'KITA93'           QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQDGGSYACKRGSVNSFFSRLNWLHKSEYKYPALNVSMPNNGKFDKLYIWGVHHPSTDSDQTSLYVQASGRVTVSTKRSQQTVTPNIGSRPWVRGQSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIGTCSFECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'QD53_392'         QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTEVAQDGGSCACKRGSVNSFFSRLNWLHKSEYKYPALNVTMPNNGKFDKLYIWGVHHPSTDSDQTRLYVRASGRVTVSTKRSQQTVTPNIGSRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'AK9_1192'         QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHQILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQDGGSYSCKRGSVNSFFSRLNWLHKSEYKYPALNVTMPNNGKFDKLYIWGVHHPSTDSDQTSLYVRASGRVTVSTKRSQQTVTPNIGSRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'HI3_1192'         QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQDGGSYACKRGSVNSFFSRLNWLHKSEYKYPALNVTMPNNGKFDKLYIWGVHHPSTDSDQTSLYVRASGRVTVSTKRSQQTVTPNIGSRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'VIC193'           QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFKNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQDGGSYACKRGSVKSFFSRLNWLHKSEYKYPALNVTMPNNGKFDKLYIWGVHHPSTDSDQTSLYVRASGRVTVSTKRSQQTVTPNIGSRPWVRGQSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'BE32_192'         QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQDGGSYACKRGSVNSFFSRLNWLHKSEYKYPALNVTMPNNGKFDKLYIWGVHHPSTDRDQTSLYVRASGRVTVSTKRSQQTVTPNIGSRPWVRGQSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'BE46_292'         QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQDGGSYACKRGSVNSFFSRLNWLHKSEYKYPALNVTMPNNGKFDKLYIWGVHHPSTDSDQTSLYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGQSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'DJ3109_1291'      QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQDGGSYACKRGSVNSFFSRLNWLHKSEYKYPALNVTMPNNGKFDKLYIWGVHHPSTDRDQTSLYVRASGRVTVSTKRSQQTVTPNIGSRPWVRGQSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'KA206_1191'       QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQDGGSYACKRGSVNSFFSRLNWLHKSEYKYPALNVTMPNNGKFDKLYIWGVHHPSTDRDQTSLYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGQSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'PERTH01_492'      QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDSFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQDGGSYACKRGSVNSFFSRLNWLHESEYKYPALNVTMPNNGKVDKLYIWGVHHPSTDRDQTSLYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGQSSRISIYWTIVKPGDILLINSIGNLIAPRGYFKIRNGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'PS192SPF'         QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRIHDGKNCTLIDALLGDPHCDSFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQDGGSYACKRGSVNSFFSRLNWLHKSEYKYPALNVTMPNNGKVDKLYIWGVHHPSTDRDQTSLYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGQSSRISIYWTIVKPGDILLINSNGNLIAPRGYFKIRNGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'HK34_490'         QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQDGGSYACKRGSVNSFFSRLNWLHESKYKYPALNVTMPNNGKVDKLYIWGVHHPSTDRDQTSLYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGQSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'SH24_890'         QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGENCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQSGGSYACKRGSVNSFFSRLNWLHESEYKYPALNVTMPNNGKFDKLYIWGVHHPSTDRDQTSLYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGQSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'SN91'             QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQSGGSYACKRGSVNSFFSRLNWLHESEYKYPALNVTMPNNGKFDKLYIWGVHHPSTDRDQTSLYVRASGRVTVSTKRSQQTVIPNIGPRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIGACSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'VIC29_392'        QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQNGGSYACKRGSVKSFFSRLNWLHESEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDREQTSLYIRASGRVTVSTKRSQQTVIPNIGSRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRTGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'VIC68_792'        QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQNGDSYACKRGSVKSFFSRLNWLHESEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDREQTSLYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRTGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'SAS68_692'        QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQNGDSYACKRGSVKSFFSRLNWLHESEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDREQTSLYIRASGRVTVSTKRSQQTVIPNIGSRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRTGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'BE47_292'         QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQNGDSYACKRGSVKSFFSRLNWLHESEYKYPALNVTMPNNDKFDKLYIWGIHHPITDREQTSLYIRASGRVTVSTKRSQQTVIPNIGSRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRTGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'SP118_293'        QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLMDALLGDPHCDGFQNKEWDLFVERNKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQNGDSYACKRGSVKSFFSRLNWLHESEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDREQTSLYIRASGRVTVSTKRSQQTVIPNIGSRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRTGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'WE66_692'         QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVPQNGDSYACKRGSVKSFFSRLNWLHESEYKYPTLNVTMPNNDKFDKLYIWGVHHPSTDREQTSLYIRASGRVTVSTKRSQQTVIPNIGSRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRTGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'DJ3946_1292'      QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDDFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQSGDSYACKRGSVKSFFSRLNWLHESEYKYPSLNVTMPNNDKFDKLYIWGVHHPSTDREQTSLYIRASGRVTVSTKRSQQTVIPNIGSRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRTGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'SN8_492'          QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGKICDSPHRILDGKNCTLIDALLGDPHCDDFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQSGDSYACKRGSVKSFFSRLNWLHKPEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDREQTSLYIRASGRVTVSTKRSQQTVIPNIGSRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRTGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'RU3193'           QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDDFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFTNEDFNWTGVAQSGDSYACKRGSVKSFFSRLNWLHESEYKYPALNVTMPNNDKFDKLYIWGVHHPITDREQTSLYIRASGRVTVSTKRSQQTVIPNIGSRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRTGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNRITYGACPRYVNQNTLKLATGMRNVPEKQTR
+	'UMEA1_1192'       QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGKICDSPHRILDGKNCTLIDALLGDPHCDDFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQSGDSYACKRGSVKSFFSRLNWLHESEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDREQTSLYIRASGRVTVSTKRSQQTVIPNIGSRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRTGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'UMEA2_1192'       QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGKICDSPHRILDGKNCTLIDALLGDPHCDDFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQSGDSYACKRGSVKSFFSRLNWLHESEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDREQTSLYIRASGRVTVSTKRSQQTVIPNIGSRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRTGKSSIMRSDATIGTCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'II236_1193'       QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWAGVAQSGDSYACKRGSVKSFFSRLNWLHKSEYKYPALNVTMPNNEKFDKLYIWGVHHPSTDREQTSLYIRASGRVTVSTKRSQQTVIPNIGSRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRTGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'II237_1193'       QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQSGDSYACKRGSVKSFFSRLNWLHKSEYKYPALNVTMPNNEKFDKLYIWGVHHPSTDREQTSLYIRASGRVTVSTKRSQQTVIPNIGFRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRTGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNRITYGACPRYVNQNTLKLATGMRNVPEKQTR
+	'KA149_1092'       QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQSGDSYACKRGSVKSFFSRLNWLHESEYKYPALNVTMPNNEKFDKLYIWGVHHPSTDREQTNLYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRTGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'PS8091'           QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQSGDSYACKRGSVKSFFSRLNWLHESEYKYPALNVTMPNNDKFDKLYIWGVHHPITDREQTSLYIRASGRVTVSTKRSQQTVIPNIGSRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRTGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'TW114391_192'     QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDDFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQSGDSYACKRGSVKSFFSRLNWLHESEYKYPALNVTMPNNGKFDKLYIWGVHHPITDREQTRLYIRASGRVTVSTKRSQQTVIPNIGSRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRTGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'EN26191'          QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQSGESYTCKRGSVKSFFSRLNWLHESEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDREQTSLYIRASGRVTVSTKRSQQTVIPNIGSRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRTGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'IN3_991'          QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQSGESYACKRGSVKSFFSRLNWLHESEYKYPALNVTMPNNGKFDKLYIWGVHHPITDREQTSLYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRTGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'SHIGA291'         QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQSGESYACKRGSVKSFFSRLNWLHESEYKYPALNVTMPNNGKFDKLYIWGVHHPITDREQTSLYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRTGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'HW1_291'          QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQSGESYACKRGSVKSFFSRLNWLHKSEYKYPALNVTMPNNGKFDKLYIWGVHHPSTDREQTSLYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRTGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'SH6_490'          QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQSGESYACKRGSVKSFFSRLNWLHKSEYKYPALNVTMPNNGKFDKLYIWGVHHPSTDREQTSLYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRTGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'BZ91'             QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQSGESYACKRGSVKSFFSRLNWLHKSEYKYPALNVTMPNNGKFDKLYIWGVHHPITDREQTSLYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRTGKSSIMRSDAPIGTCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'PR1_1090'         QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQSGESYACKRGSVKSFFSRLNWLHESEYKYPALNVTMPNNGKFDKLYIWGVHHPITDREQTSLYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRTGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'MX3255_194'       QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQSGESYACKRGSVKSFFSRLNWLHESDYKYPALNVTMPNNGKFDKLYIWGVHHPSTDREQTSLYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRTGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'SD1_491'          QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQSGESYACKRGSVKSFFSRLNWLHESDYKYPALNVTMPNNGKFDKLYIWGVHHPSTDREQTSLYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRTGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'SOFIA15593'       QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQSGESYACKRGSVKSFFSRLNWLHESDYKYPALNVTMPNNGKFDKLYIWGVHHPITDREQTSLYVRASGRVTVSTKRSQQTVIPNIGYRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRTGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'WA1591'           QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQSGESYACKRGSVKSFFSRLNWLHESDYKYPALNVTMPNNGKFDKLYIWGVHHPITDREQTSLYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRTGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'SEOUL45_1191'     QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQSGESYACKRGSVKSFFSRLNWLHESDYKYPALNVTMPNNGKFDKLYIWGVHHPITDREQTSLYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRTGKSSIMKSDAPIGTCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'PA09_1191'        QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSTTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFTNEDFNWTGVAQSGESYACKRGSVKSFFSRLNWLHESDYKYPALNVTMPNNGKFDKLYIWGVHHPITDREQTSLYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRTGKSSIMKSDAPIGTCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'SAS36_592'        QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFTNEDFNWTGVAQSGESYACKRGSVKSFFSRLNWLHESDYKYPALNVTMPNNGKFDKLYIWGVHHPSTDREQTSLYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRTGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'BE353_1289'       QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQSGESYACKRGSVKSFFSRLNWLHESEYKYPALNVTMPNNGKFDKLYIWGVHHPITDREQTNLYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRTGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'SHA1_289'         QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQSGGSYACKRGSVNSFFSRLNWLHESEYKYPALNVTMPNNGKFDKLYIWGVHHPITDREQTNLYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRTGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'SHA16_989'        QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQSGGSYACKRGSVNSFFSRLNWLHESEHKYPALNVTMPNNGKFDKLYIWGVHHPITDREQTNLYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRTGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'GUA39_689'        QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQSGGSYACKRGSVNSFFSRLNWLHESEHKYPALNVTMPNNGKFDKLYIWGVHHPITDREQTNLYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKMRTGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'GUA_389'          QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQSGGSYACKRGSVNSFFSRLNWLHESEHKYPALNVTMPNNGKFDKLYIWGVHHPITDREQTNLYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRTGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'BE57_189'         QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQSGGSYACKRGSVNSFFSRLNWLHESEYKYPALNVTMPNNGKFDKLYIWGVHHPITDREQTNLYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRTGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'SIC89'            QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVESSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQSGGSYACKRGSVNSFFSRLNWLHESEYKYPALNVTMPNNGKFDKLYIWGVHHPITDREQTNLYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRTGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'ENG64889'         QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQSGGSYACKRGSVKSFFSRLNWLHESEYKYPALNVTMPNNGKFDKLYIWGVHHPITDREQTNLYIRASGRVTVSTKRSQQTVIPNIGSRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRTGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'GZ54_489'         QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVHSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQSGGSYACKRGSINSFFSRLNWLHESEHKYPALNVTMPNNGKFDKLYIWGVHHPITDREQTNLYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRTGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'VIC589'           QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQSGESCACKRGSVNSFFSRLNWLHESEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDREQTNLYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGQSSRISIYWTIVKPGDILLINSIGNLIAPRGYFKIRTGKSSIMRSDAPIGICSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'BE4_189'          QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQSGGSYACKRGSVNSFFSRLNWLHKSEYKYPALNVTMPNNGKFDKLYIWGVHHPSTDREQTNLYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRTGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'ENG88'            QKLPGNDNSTATLCSGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQSGGSYACKRGSVNSFFSRLNWLHESEYKYPALNVTMPNNGKFDKLYIWGVHHPSTDREQTNLYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRTGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'DL19_389'         QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQSGGSYACKRGSVNSFFSRLNWLHKSEYKYPALNVTMPNNGKFDKLYIWGVHHPSTDREQTNLYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGQSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRTGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'KB_288'           QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKKWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVTQSGGSYTCKRGSVNSFFSRLNWLHESEYKYPALNVTMPNNGKFDKLYIWGVHHPSTDREQTNLYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRTGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNKITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'TX_39989_288'     QKLPGDDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNEKWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVTQSGGSYACKRGSVNSFFSRLNWLHESEYKYPALNVTMPNNGKFDKLYIWGVQHPSTDKEQTNLYARSSGRVTVSTERSQ?TVIPNIGSRPWVRALSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRTGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNKITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'TY5_1287'         QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGIICDSPHRILDGKNCTLIDALLGDPHCDGFQNEKWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVTQSGGSYTCKRGSVNSFFSRLNWLHESEYKYPALNVTMPNNGKSDKLYIWGVHHPSTDREQTNLYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRTGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNKITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'TY6_1287'         QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGIICDSPHRILDGKNCTLIDALLGDPHCDGFQNEKWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVTQSGGSYACKRGSVNSFFSRLNWLHESEYKYPALNVTMPNNGKFDKLYIWGVHHPITDREQTNLYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRTGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNKITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'SYD_1287'         QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNEKWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVTQSGGSYSCKRGSVNSFFSRLNWLHESEYKYPALNVTMPNNGKFDKLYIWGVHHPSTDREQTKLYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRTGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNKITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'CB_188'           QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNEKWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVTQSGGSYACKRGSVNSFFSRLNWLHESEYKYPALNVTMPNNGKFDKLYIWGVHHPSTDREQTNLYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRTGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNKITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'GC_987'           QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNEKWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVTQSGGSYACKRGSVNSFFSRLNWLHKSEYKYPALNVTMPNNGKFDKLYIWGVHHPVTDREQTNLYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRTGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNKITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'SIC_487'          QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNEKWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVTQSGGSYACKRGSVNSFFSRLNWLHKSEYKYPALNVTMPNNGKFDKLYIWGVHHPVTDREQTNLYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRTGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNKITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'GZ187'            QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNEKWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVTQGGGSYSCKRGSVNSFFSRLNWLHESECKYPALNVTMPNNGKFDKLYIWGVHHPSTDREQTNLYVRASGRVTVSTKRSQQAVIPNIGSRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRTGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNKITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'QL_987'           QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNEKWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVTQSGGSYSCKRGSVNSFFSRLNWLHESEYKYPALNVTMPNNGKFDKLYIWGVHHPSTDREQTNLYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRTGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNKITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'LA_1287'          QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNEKWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVTQSGGSYACKRGSVNSFFSRLNWLHESEYKYPALNVTMPNNGKFDKLYIWGVHHPITDREQTNLYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRTGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNKITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'SHA_887'          QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNEKWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVTQSGGSYACKRGSVNSFFSRLNWLHESEYKYPALNVTMPNNGKFDKLYIWGVHHPSTDREQTNLYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGLSSRISIYWTIVKPGDILLINRTGNLIAPRGYFKIRTGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNKITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'CO_1187'          QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNEKWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVTQSGGSYACKRGSVNSFFSRLNWLHVSEYKYPALNVTMPNNGKFDKLYIWGVHHPSTDREQTKLYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRTGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNKITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'VIC87'            QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNEKWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVTQSGGSYACKRGSVNSFFSRLNWLHESEYKYPALNVTMPNNGKFDKLYIWGVHHPSTDREQTNLYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRTGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNKITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'FO_1185'          QKLPGNDNSKATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNEKWDLFVERSKAFSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVTQSGGSYACKRGSVNSFFSRLNWLHESEYKYPALNVTMPNNGKFDKLYIWGVHHPSTDKEQTKLYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGLSSGISIYWTIVKPGDILLINSIGNLIAPRGYFKIRTGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNKITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'YN_1185'          QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNEKWDLFVERSKAFSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVTQSGGSYACKRGSVNSFFSRLNWLHKSEYKYPALNVTMPNNGNFDKLYIWGVHHPSTDKEQTNLYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRTGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNKITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'CC185'            QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNEKWDLFVERSKAFSNCYPYDVPDYASLRSLVASSGTLEFINEGFNWTGVTQSGGSYACKRGSVNSFFSRLNWLYGSESKYPALNVTMPNNGKFDKLYIWGVHHPSTDKEQTNLYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGLSSRISIYWTIVKPGDILLISSTGNLIAPRGYFKIRTGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNKITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'CC485'            QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNEKWDLFVERSKAFSNCYPYDVPDYASLRSLVASSGTLEFINEGFNWTGVTQSGGSYACKRGSVNSFFSRLNWLYGSEYKYPALNVTMPNNGKFDKLYIWGVHHPSTDKEQTNLYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGLSSRISIYWTIVKPGDILLISSTGNLIAPRGYFKIRTGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNKITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'UY3_688'          QKMPGNDNSTATLCLGHHAVPNRTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNEKWDLFVERSKAFSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVTQSGGSCACKRGSVNSFFSRLNWLYESEYKYPALNVTMPNNGKFDKLYIWGVHHPSTDKEQTNLYVRASGRVIVSTKRSQQTVVPNIGSRPWVRGLSSRISIYWTIVKPGDILLISSTGNLIAPRGYFKIRTGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'CC_688'           QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNEKWDLFIERSKAFSNCYPYDVPDYASLRSLVASSGTLEFINEGFNWTGVTQNGGSYACKRGSVNSFFSRLNWLYESEYKYPALNVTMPNNGKFDKLYIWGVHHPITEKEQTNLYVRASGRVTVSTKRSQQTRIPNIGSRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRTGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNKITYGACPRYGKQNTLKLATGMRNVPEKQTR
+	'YG_585'           QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNEKWDLFIERSKAFSNCYPYDVPDYASLRSLVASSGTLEFINEGFNWTGVTQNGGSYACKRGSVNSFFSRLNWLYESEYKYPALNVTMPNNGKFDKLYIWGVHHPSTEKEQTNLYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGLSTRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRTGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNKITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'CZ86'             QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNEKWDLFIERSKAFSNCYPYDVPDYASLRSLVASSGTLEFINEGFNWTGVTQSGGSYACKRGSVNSFFSRLNWLYESEYKYPALNVTMPNNGKFDKLYIWGVHHPITEKEQTNLYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRTGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNKITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'ST_185'           QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNEKWDLFIERSKAFSNCYPYDVPDYASLRSLVASSGTLEFINEGFNWTGVTQSGGSYACKRGSVNSFFSRLNWLYESEYKYPALNVTMPNNGKFDKLYIWGVHHPITEKEQTNLYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRTGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNKITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'GM_1185'          QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNEKWDLFIERSKAFSNCYPYDVPDYASLRSLVASSGTLEFINEGFNWTGVTQSGGSYACKRGSVNSFFSRLNWLYKSEYKYPALNVTMPNNGKFDKLYIWGVHHPSTEKEQTNLYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRTGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNKITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'LN_286'           QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNEKWDLFIERSKAFSNCYPYDVPDYASLRSLVASSGTLEFINEGFNWTGVTQSGGSYTCKRGSVNSFFSRLNWLYESEYKYPALNVTMPNNGKFDKLYIWGVHHPSTEKEQTNLYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRTGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNKITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'BK_785'           QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNEKWDLFVERSKAFSNCYPYDVPDYASLRSLVASSGTLEFINEGFNWTGVTQSGGSYACKRGSVNSFFSRLNWLYKSEYKYPALNVTMPNNGKFDKLYIWGVHHPSTEKEQTNLYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRTGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNKITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'BK25_785'         QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNEKWDLFVERSKAFSNCYPYDVPDYASLRSLVASSGTLEFINEGFNWTGVTQSGGSYSCKRGSVNSFFSRLNWLYESEYKYPALNVTMPNNGKFDKLYIWGVHHPSTEKEQTKLYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRTGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNKITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'YH_1085'          QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNEKWDLFVERSKAFSNCYPYDVPDYASLRSLVASSGTLEFINEGFNWTGVTQSGGSYACKRGSVNSFFSRLNWLYGSEYKYPALNVTMPNNGKFDKLYIWGVHHPSTEKEQTNLYARASGRVTVSTKRSQQTVIPNIGSRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKLRTGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNKITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'TG_885'           QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSIGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNEKWDLFVERSKAFSNCYPYDVPDYASLRSLVASSGTLEFINEGFNWTGVTQSGGSSACKRGSVNSFFSRLNWLYKSEYKYPALNVTMPNNGKFDKLYIWGVHHPSTDKEQTNLYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRTGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNKITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'TX_12764_483'     QNLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNEKWDLFVERSKAFSNCYPYDVPDYASLRSLVASSGTLEFINEGFNWTGVTQSGGSYACKRGSVNSFFSRLNWLYESESKYPALNVTMPNNGKFDKLYIWGVHHPSTDKEQTNLYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRTGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNKITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'TX_25784_385'     QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNEKWDLFVERSKAFSNCYPYDVPDYASLRSLVASSGTLEFINEGFNWTGVTQSGGSYACKRGSVNSFFSRLNWLYESESKYPALNVTMPNNGKFDKLYIWGVHHPSTDKEQTNLYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRTGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNKITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'MS85'             QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNEKWDLFVERSKAFSNCYPYDVPDYASLRSLVASSGTLEFINEGFNWTGVTQSGGSYACKRGSVNSFFSRLNWLYKSESKYPALNVTMPNNGKFDKLYIWGVHHPSTDKEQTNLYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGQSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRTGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNKITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'TX_24753_185'     QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNEKWDLFVERSKAFSNCYPYDVPDYASLRSLVASSGTLEFINEGFNWTGVTQSGGSYACKRGSVNSFFSRLNWLYESESNYPALNVTMPNNGKFDKLYIWGVHHPSTDKEQTNLYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRTGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNKITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'TX_25887_285'     QNLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNEKWDLFVERSKAFSNCYPYDVPDYASLRSLVASSGTLEFINEGFNWTGVTQSGGSYSCKRGSVNSFFSRLNWLYESESKYPALNVTMPNNGKFDKLYIWGVHHPCTDKEQTNLYVRASGRVTVSTKRSQQTVIPNIGPRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRTGKSSIMRSDAPIGTCSSGCITPNGSIPNDKPFQNVNKITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'SH_185'           QKLPGNDNSTATLCLGHHAVPNGTLVKTITNEQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNEKWDLFVERGKAFSNCYPYDVPDYASLRSLVASSGTLEFINEGFNWTGVTQSGGSYACKRGSVNSFFSRLNWLYKSESKYPALNVTMPNNGKFDKLYIWGVHHPSTDKEQTNLYVRASGRVTVSTKRSQQTVIPNIGPRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIHTGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNKITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'US85'             QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNEKWDLFVERGKAFSNCYPYDVPDYASLRSLVASSGTLEFINEGFNWTGVTQSGGSYACRRGSVNSFFSRLNWLYESESKYPALNVTMPNNGKFDKLYIWGVHHPSTDKEQTKLYVRASGRVTVSTKRSQQTVIPNIGPRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIHTGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNKITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'AK_1284'          Q?LPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNEKWDLFVERSKAFSNCYPYDVPDYASLRSLVASSGTLEFINEGFNWTGVTQSGGSYACKRGSVNSFFSRLNWLYESESKYPALNVTMPNNGKFDKLYIWGVHHPITDKEQTNLYVRASGRVTVSTKRSQQTVIPNIGPRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRTGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNKITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'TX_12835_583'     QNLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNEKWDLFVERSKAFSNCYPYDVPDYVSLRSLVASSGTLEFINEGFNWTGVTQSGGSYACKRGSDNSFFSRLNWLYESESKYHVLNVTMPNNGNFDKLYIWGVHHPSTDKEQTNLYVRASGRVTVSTKRSQQTVIPNIGPRPWVRGLSSRISIYWTIVKPGDILLINSSGNLIAPRGYFKIRTGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNKITYGACPKYVKQNTLKLATGMRNIPEKQTR
+	'GZ3_187'          QNLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNEKWDLFVERSKAFSNCYPYDVPDYASLRSLVASSGTLEFINEGFNWTGVTQSGGSYACKRGSDKSFFSRLNWLYESESKYPALNVTMPNNGNFDKLYIWGVHHPSTDKEQTNLYVRASGRVTVSTKRSQQTIIPNIGPRPWVRGLSSRISIYWTIVKPGDILLINSIGNLIAPRGYFKIRTGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNKITYGACPKYVKQNTLKLATGMRNIPEKQTR
+	'CM_885'           QNLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNEKWDLFVERSKAFSNCYPYDVPDYASLRSLVASSGTLEFINEGFNWTGVTQSGGSSTCKRGSNNSFFSRLNWLYESESKYPVLNVTMPNNGKFDKLYIWGIHHPSTDKEQTNLYIRASGRVTVSTKRSQQTVIPNIGSIPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRTGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNKITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'TX_17988_184'     QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNEKWDLFVERSKAFSNCYPYDVPDYVSLRSLVASSGTLEFTNEGFNWTGVTQSGGSYACKRGSVNSFFSRLNWLYESESKYPVLNVSMPNNGKLDKLYIWGVHHPSTDKVQTNLYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRTGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNKITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'TX_18088_184'     QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNEKWDLFVERSKAFSNCYPYDVPDYASLRSLVASSGTLEFTNEGFNWTGVTQSGGSYACKRGSVNSFFSRLNWLYESESKYPVLNVTMPNNGKFDKLYIWGVHHPSTDKEQTNLYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRTGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNKITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'TX_18733_184'     QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSLHRILDGKNCTLIDALLGDPHCDGFQNEKWDLFVERSKAFSNCYPYDVPDYASLRSLVASSGTLEFTNEGFNWTGVTQSGGSYACKRGSVNSFFSRLNWLYESESKYPVLNVTMPNNGKFDKLYIWGVHHPSTDKEQTNLYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRTGKSSIMRSDAPIGTCSSECVTPNGSIPNDKPFQNVNKITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'TX_24752_185'     QKLPGNDDSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNEKWDLFVERSKAFSNCYPYDVPDYASLRSLVASSGTLEFINEGFNWTGVTQSGGSYACKRGSVNSFFSRLNWLYESESKYPVLNVTMPNNGKFDKLYIWGVHHPSTDKEQTNLYVRASGKVTVSTKRSQQTVIPNIGSRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRTGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNKITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'NJ_185'           QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNEKWDLFVERSKAFSNCYPYDVPDYASLRSLVASSGTLEFINEGFNWTGVTQSGGSYACKRGSVNSFFSRLNWLYESESKYPVLNVTMPNNGKFDKLYIWGVHHPSTDKEQTNLYVRASGKVTVSTKRSQQTVIPNIGSRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRTGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNKITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'MI_185'           QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNEKWDLFVERSKAFSNCYPYDVPDYASLRSLVASSGTLEFINEGFNWTGVTQSGGSYACKRGSVNSFFSRLNWLYESESKYPVLNVTMPNNGKFDKLYIWGVHHPSTDKEQTNLYVRASGKVTVSTKRSQQTVIPNIGSRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRTGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNKITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'CT_385'           Q?LPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNEKWDLFVERSKAFSNCYPYDVPDYASLRSLVASSGTLEFINEGFNWTGVTQNGGSYACKRGSVNSFFSKLNWLYESEYKYPVLNVTMPNNGKFDKLYIWGVHHPITDKEQTNLYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRTGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNKITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'CAEN184'          QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNEKWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEGFNWTGVTQSGGSYACKRGSVNSFFSRLNWLYKSESKYPVLNVTMPNNGKFDKLYIWGVHHPSTDKEQTNLYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRTGKSSIMRSDAPIGTCSYECITPNGSIPNDKPFQNVNKITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'OITA83'           QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNEKWDLFVERSKAFSNCYPYDVPDYASLRSLVASSGTLEFINEGFNWTGVTQSGGSYACKRGSVNSFFSRLNWLYKSESKYPVLNVTMPNNGKFDKLYIWGVHHPSTDKEQTNLYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRTGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNKITYGACPRYVKQNTLKLATGMRNVPEKQTR;
+END;
+
+BEGIN TREES;
+	TREE tree = ((((((((((((((((((CO_1187,SHA_887),LA_1287),(GZ187,QL_987)),VIC87),((((((TX_12764_483,((TX_24753_185,TX_25784_385),MS85)),((((((TX_18088_184,(TX_18733_184,TX_17988_184)),(CM_885,(GZ3_187,TX_12835_583))),OITA83),(((MI_185,NJ_185),TX_24752_185),CT_385)),CAEN184),((((VAL_491,SH_185),US85),TX_25887_285),AK_1284))),TG_885),((CC185,CC485),UY3_688)),(BK_785,((BK25_785,(((LN_286,(ST_185,CZ86)),GM_1185),YH_1085)),(YG_585,CC_688)))),(YN_1185,FO_1185))),((((TY6_1287,TY5_1287),SYD_1287) [...]
+END;
+
+BEGIN HYPHY;
+
+/* test preamble */
+
+	_testDescription 		= " fit the JTT model to an Inluenza virus A alignment with 349 sequences and 329 aminoacids";
+	_expectedLL 			=  -6989.162651149;
+	ExecuteAFile 			("../Shared/TestInstrumentation.bf");
+	startTestTimer 			(_testDescription);
+
+/* end test preamble */
+
+IntermediateCodon_AA_part_Jones={20,20};
+IntermediateCodon_AA_part_Jones[0][1]:=t*0.056;
+IntermediateCodon_AA_part_Jones[0][2]:=t*0.081;
+IntermediateCodon_AA_part_Jones[0][3]:=t*0.105;
+IntermediateCodon_AA_part_Jones[0][4]:=t*0.015;
+IntermediateCodon_AA_part_Jones[0][5]:=t*0.179;
+IntermediateCodon_AA_part_Jones[0][6]:=t*0.027;
+IntermediateCodon_AA_part_Jones[0][7]:=t*0.036;
+IntermediateCodon_AA_part_Jones[0][8]:=t*0.035;
+IntermediateCodon_AA_part_Jones[0][9]:=t*0.03;
+IntermediateCodon_AA_part_Jones[0][10]:=t*0.054;
+IntermediateCodon_AA_part_Jones[0][11]:=t*0.054;
+IntermediateCodon_AA_part_Jones[0][12]:=t*0.194;
+IntermediateCodon_AA_part_Jones[0][13]:=t*0.057;
+IntermediateCodon_AA_part_Jones[0][14]:=t*0.058;
+IntermediateCodon_AA_part_Jones[0][15]:=t*0.378;
+IntermediateCodon_AA_part_Jones[0][16]:=t*0.475;
+IntermediateCodon_AA_part_Jones[0][17]:=t*0.298;
+IntermediateCodon_AA_part_Jones[0][18]:=t*0.009;
+IntermediateCodon_AA_part_Jones[0][19]:=t*0.011;
+IntermediateCodon_AA_part_Jones[1][0]:=t*0.056;
+IntermediateCodon_AA_part_Jones[1][2]:=t*0.01;
+IntermediateCodon_AA_part_Jones[1][3]:=t*0.005;
+IntermediateCodon_AA_part_Jones[1][4]:=t*0.078;
+IntermediateCodon_AA_part_Jones[1][5]:=t*0.059;
+IntermediateCodon_AA_part_Jones[1][6]:=t*0.069;
+IntermediateCodon_AA_part_Jones[1][7]:=t*0.017;
+IntermediateCodon_AA_part_Jones[1][8]:=t*0.007;
+IntermediateCodon_AA_part_Jones[1][9]:=t*0.023;
+IntermediateCodon_AA_part_Jones[1][10]:=t*0.031;
+IntermediateCodon_AA_part_Jones[1][11]:=t*0.034;
+IntermediateCodon_AA_part_Jones[1][12]:=t*0.014;
+IntermediateCodon_AA_part_Jones[1][13]:=t*0.009;
+IntermediateCodon_AA_part_Jones[1][14]:=t*0.113;
+IntermediateCodon_AA_part_Jones[1][15]:=t*0.223;
+IntermediateCodon_AA_part_Jones[1][16]:=t*0.042;
+IntermediateCodon_AA_part_Jones[1][17]:=t*0.062;
+IntermediateCodon_AA_part_Jones[1][18]:=t*0.115;
+IntermediateCodon_AA_part_Jones[1][19]:=t*0.209;
+IntermediateCodon_AA_part_Jones[2][0]:=t*0.081;
+IntermediateCodon_AA_part_Jones[2][1]:=t*0.01;
+IntermediateCodon_AA_part_Jones[2][3]:=t*0.767;
+IntermediateCodon_AA_part_Jones[2][4]:=t*0.004;
+IntermediateCodon_AA_part_Jones[2][5]:=t*0.13;
+IntermediateCodon_AA_part_Jones[2][6]:=t*0.112;
+IntermediateCodon_AA_part_Jones[2][7]:=t*0.011;
+IntermediateCodon_AA_part_Jones[2][8]:=t*0.026;
+IntermediateCodon_AA_part_Jones[2][9]:=t*0.007;
+IntermediateCodon_AA_part_Jones[2][10]:=t*0.015;
+IntermediateCodon_AA_part_Jones[2][11]:=t*0.528;
+IntermediateCodon_AA_part_Jones[2][12]:=t*0.015;
+IntermediateCodon_AA_part_Jones[2][13]:=t*0.049;
+IntermediateCodon_AA_part_Jones[2][14]:=t*0.016;
+IntermediateCodon_AA_part_Jones[2][15]:=t*0.059;
+IntermediateCodon_AA_part_Jones[2][16]:=t*0.038;
+IntermediateCodon_AA_part_Jones[2][17]:=t*0.031;
+IntermediateCodon_AA_part_Jones[2][18]:=t*0.004;
+IntermediateCodon_AA_part_Jones[2][19]:=t*0.046;
+IntermediateCodon_AA_part_Jones[3][0]:=t*0.105;
+IntermediateCodon_AA_part_Jones[3][1]:=t*0.005;
+IntermediateCodon_AA_part_Jones[3][2]:=t*0.767;
+IntermediateCodon_AA_part_Jones[3][4]:=t*0.005;
+IntermediateCodon_AA_part_Jones[3][5]:=t*0.119;
+IntermediateCodon_AA_part_Jones[3][6]:=t*0.026;
+IntermediateCodon_AA_part_Jones[3][7]:=t*0.012;
+IntermediateCodon_AA_part_Jones[3][8]:=t*0.181;
+IntermediateCodon_AA_part_Jones[3][9]:=t*0.009;
+IntermediateCodon_AA_part_Jones[3][10]:=t*0.018;
+IntermediateCodon_AA_part_Jones[3][11]:=t*0.058;
+IntermediateCodon_AA_part_Jones[3][12]:=t*0.018;
+IntermediateCodon_AA_part_Jones[3][13]:=t*0.323;
+IntermediateCodon_AA_part_Jones[3][14]:=t*0.029;
+IntermediateCodon_AA_part_Jones[3][15]:=t*0.03;
+IntermediateCodon_AA_part_Jones[3][16]:=t*0.032;
+IntermediateCodon_AA_part_Jones[3][17]:=t*0.045;
+IntermediateCodon_AA_part_Jones[3][18]:=t*0.01;
+IntermediateCodon_AA_part_Jones[3][19]:=t*0.007;
+IntermediateCodon_AA_part_Jones[4][0]:=t*0.015;
+IntermediateCodon_AA_part_Jones[4][1]:=t*0.078;
+IntermediateCodon_AA_part_Jones[4][2]:=t*0.004;
+IntermediateCodon_AA_part_Jones[4][3]:=t*0.005;
+IntermediateCodon_AA_part_Jones[4][5]:=t*0.005;
+IntermediateCodon_AA_part_Jones[4][6]:=t*0.04;
+IntermediateCodon_AA_part_Jones[4][7]:=t*0.089;
+IntermediateCodon_AA_part_Jones[4][8]:=t*0.004;
+IntermediateCodon_AA_part_Jones[4][9]:=t*0.248;
+IntermediateCodon_AA_part_Jones[4][10]:=t*0.043;
+IntermediateCodon_AA_part_Jones[4][11]:=t*0.01;
+IntermediateCodon_AA_part_Jones[4][12]:=t*0.017;
+IntermediateCodon_AA_part_Jones[4][13]:=t*0.004;
+IntermediateCodon_AA_part_Jones[4][14]:=t*0.005;
+IntermediateCodon_AA_part_Jones[4][15]:=t*0.092;
+IntermediateCodon_AA_part_Jones[4][16]:=t*0.012;
+IntermediateCodon_AA_part_Jones[4][17]:=t*0.062;
+IntermediateCodon_AA_part_Jones[4][18]:=t*0.053;
+IntermediateCodon_AA_part_Jones[4][19]:=t*0.536;
+IntermediateCodon_AA_part_Jones[5][0]:=t*0.179;
+IntermediateCodon_AA_part_Jones[5][1]:=t*0.059;
+IntermediateCodon_AA_part_Jones[5][2]:=t*0.13;
+IntermediateCodon_AA_part_Jones[5][3]:=t*0.119;
+IntermediateCodon_AA_part_Jones[5][4]:=t*0.005;
+IntermediateCodon_AA_part_Jones[5][6]:=t*0.023;
+IntermediateCodon_AA_part_Jones[5][7]:=t*0.006;
+IntermediateCodon_AA_part_Jones[5][8]:=t*0.027;
+IntermediateCodon_AA_part_Jones[5][9]:=t*0.006;
+IntermediateCodon_AA_part_Jones[5][10]:=t*0.014;
+IntermediateCodon_AA_part_Jones[5][11]:=t*0.081;
+IntermediateCodon_AA_part_Jones[5][12]:=t*0.024;
+IntermediateCodon_AA_part_Jones[5][13]:=t*0.026;
+IntermediateCodon_AA_part_Jones[5][14]:=t*0.137;
+IntermediateCodon_AA_part_Jones[5][15]:=t*0.201;
+IntermediateCodon_AA_part_Jones[5][16]:=t*0.033;
+IntermediateCodon_AA_part_Jones[5][17]:=t*0.047;
+IntermediateCodon_AA_part_Jones[5][18]:=t*0.055;
+IntermediateCodon_AA_part_Jones[5][19]:=t*0.008;
+IntermediateCodon_AA_part_Jones[6][0]:=t*0.027;
+IntermediateCodon_AA_part_Jones[6][1]:=t*0.069;
+IntermediateCodon_AA_part_Jones[6][2]:=t*0.112;
+IntermediateCodon_AA_part_Jones[6][3]:=t*0.026;
+IntermediateCodon_AA_part_Jones[6][4]:=t*0.04;
+IntermediateCodon_AA_part_Jones[6][5]:=t*0.023;
+IntermediateCodon_AA_part_Jones[6][7]:=t*0.016;
+IntermediateCodon_AA_part_Jones[6][8]:=t*0.045;
+IntermediateCodon_AA_part_Jones[6][9]:=t*0.056;
+IntermediateCodon_AA_part_Jones[6][10]:=t*0.033;
+IntermediateCodon_AA_part_Jones[6][11]:=t*0.391;
+IntermediateCodon_AA_part_Jones[6][12]:=t*0.115;
+IntermediateCodon_AA_part_Jones[6][13]:=t*0.597;
+IntermediateCodon_AA_part_Jones[6][14]:=t*0.328;
+IntermediateCodon_AA_part_Jones[6][15]:=t*0.073;
+IntermediateCodon_AA_part_Jones[6][16]:=t*0.046;
+IntermediateCodon_AA_part_Jones[6][17]:=t*0.011;
+IntermediateCodon_AA_part_Jones[6][18]:=t*0.008;
+IntermediateCodon_AA_part_Jones[6][19]:=t*0.573;
+IntermediateCodon_AA_part_Jones[7][0]:=t*0.036;
+IntermediateCodon_AA_part_Jones[7][1]:=t*0.017;
+IntermediateCodon_AA_part_Jones[7][2]:=t*0.011;
+IntermediateCodon_AA_part_Jones[7][3]:=t*0.012;
+IntermediateCodon_AA_part_Jones[7][4]:=t*0.089;
+IntermediateCodon_AA_part_Jones[7][5]:=t*0.006;
+IntermediateCodon_AA_part_Jones[7][6]:=t*0.016;
+IntermediateCodon_AA_part_Jones[7][8]:=t*0.021;
+IntermediateCodon_AA_part_Jones[7][9]:=t*0.229;
+IntermediateCodon_AA_part_Jones[7][10]:=t*0.479;
+IntermediateCodon_AA_part_Jones[7][11]:=t*0.047;
+IntermediateCodon_AA_part_Jones[7][12]:=t*0.01;
+IntermediateCodon_AA_part_Jones[7][13]:=t*0.009;
+IntermediateCodon_AA_part_Jones[7][14]:=t*0.022;
+IntermediateCodon_AA_part_Jones[7][15]:=t*0.04;
+IntermediateCodon_AA_part_Jones[7][16]:=t*0.245;
+IntermediateCodon_AA_part_Jones[7][17]:=t*0.961;
+IntermediateCodon_AA_part_Jones[7][18]:=t*0.009;
+IntermediateCodon_AA_part_Jones[7][19]:=t*0.032;
+IntermediateCodon_AA_part_Jones[8][0]:=t*0.035;
+IntermediateCodon_AA_part_Jones[8][1]:=t*0.007;
+IntermediateCodon_AA_part_Jones[8][2]:=t*0.026;
+IntermediateCodon_AA_part_Jones[8][3]:=t*0.181;
+IntermediateCodon_AA_part_Jones[8][4]:=t*0.004;
+IntermediateCodon_AA_part_Jones[8][5]:=t*0.027;
+IntermediateCodon_AA_part_Jones[8][6]:=t*0.045;
+IntermediateCodon_AA_part_Jones[8][7]:=t*0.021;
+IntermediateCodon_AA_part_Jones[8][9]:=t*0.014;
+IntermediateCodon_AA_part_Jones[8][10]:=t*0.065;
+IntermediateCodon_AA_part_Jones[8][11]:=t*0.263;
+IntermediateCodon_AA_part_Jones[8][12]:=t*0.021;
+IntermediateCodon_AA_part_Jones[8][13]:=t*0.292;
+IntermediateCodon_AA_part_Jones[8][14]:=t*0.646;
+IntermediateCodon_AA_part_Jones[8][15]:=t*0.047;
+IntermediateCodon_AA_part_Jones[8][16]:=t*0.103;
+IntermediateCodon_AA_part_Jones[8][17]:=t*0.014;
+IntermediateCodon_AA_part_Jones[8][18]:=t*0.01;
+IntermediateCodon_AA_part_Jones[8][19]:=t*0.008;
+IntermediateCodon_AA_part_Jones[9][0]:=t*0.03;
+IntermediateCodon_AA_part_Jones[9][1]:=t*0.023;
+IntermediateCodon_AA_part_Jones[9][2]:=t*0.007;
+IntermediateCodon_AA_part_Jones[9][3]:=t*0.009;
+IntermediateCodon_AA_part_Jones[9][4]:=t*0.248;
+IntermediateCodon_AA_part_Jones[9][5]:=t*0.006;
+IntermediateCodon_AA_part_Jones[9][6]:=t*0.056;
+IntermediateCodon_AA_part_Jones[9][7]:=t*0.229;
+IntermediateCodon_AA_part_Jones[9][8]:=t*0.014;
+IntermediateCodon_AA_part_Jones[9][10]:=t*0.388;
+IntermediateCodon_AA_part_Jones[9][11]:=t*0.012;
+IntermediateCodon_AA_part_Jones[9][12]:=t*0.102;
+IntermediateCodon_AA_part_Jones[9][13]:=t*0.072;
+IntermediateCodon_AA_part_Jones[9][14]:=t*0.038;
+IntermediateCodon_AA_part_Jones[9][15]:=t*0.059;
+IntermediateCodon_AA_part_Jones[9][16]:=t*0.025;
+IntermediateCodon_AA_part_Jones[9][17]:=t*0.18;
+IntermediateCodon_AA_part_Jones[9][18]:=t*0.052;
+IntermediateCodon_AA_part_Jones[9][19]:=t*0.024;
+IntermediateCodon_AA_part_Jones[10][0]:=t*0.054;
+IntermediateCodon_AA_part_Jones[10][1]:=t*0.031;
+IntermediateCodon_AA_part_Jones[10][2]:=t*0.015;
+IntermediateCodon_AA_part_Jones[10][3]:=t*0.018;
+IntermediateCodon_AA_part_Jones[10][4]:=t*0.043;
+IntermediateCodon_AA_part_Jones[10][5]:=t*0.014;
+IntermediateCodon_AA_part_Jones[10][6]:=t*0.033;
+IntermediateCodon_AA_part_Jones[10][7]:=t*0.479;
+IntermediateCodon_AA_part_Jones[10][8]:=t*0.065;
+IntermediateCodon_AA_part_Jones[10][9]:=t*0.388;
+IntermediateCodon_AA_part_Jones[10][11]:=t*0.03;
+IntermediateCodon_AA_part_Jones[10][12]:=t*0.016;
+IntermediateCodon_AA_part_Jones[10][13]:=t*0.043;
+IntermediateCodon_AA_part_Jones[10][14]:=t*0.044;
+IntermediateCodon_AA_part_Jones[10][15]:=t*0.029;
+IntermediateCodon_AA_part_Jones[10][16]:=t*0.226;
+IntermediateCodon_AA_part_Jones[10][17]:=t*0.323;
+IntermediateCodon_AA_part_Jones[10][18]:=t*0.024;
+IntermediateCodon_AA_part_Jones[10][19]:=t*0.018;
+IntermediateCodon_AA_part_Jones[11][0]:=t*0.054;
+IntermediateCodon_AA_part_Jones[11][1]:=t*0.034;
+IntermediateCodon_AA_part_Jones[11][2]:=t*0.528;
+IntermediateCodon_AA_part_Jones[11][3]:=t*0.058;
+IntermediateCodon_AA_part_Jones[11][4]:=t*0.01;
+IntermediateCodon_AA_part_Jones[11][5]:=t*0.081;
+IntermediateCodon_AA_part_Jones[11][6]:=t*0.391;
+IntermediateCodon_AA_part_Jones[11][7]:=t*0.047;
+IntermediateCodon_AA_part_Jones[11][8]:=t*0.263;
+IntermediateCodon_AA_part_Jones[11][9]:=t*0.012;
+IntermediateCodon_AA_part_Jones[11][10]:=t*0.03;
+IntermediateCodon_AA_part_Jones[11][12]:=t*0.015;
+IntermediateCodon_AA_part_Jones[11][13]:=t*0.086;
+IntermediateCodon_AA_part_Jones[11][14]:=t*0.045;
+IntermediateCodon_AA_part_Jones[11][15]:=t*0.503;
+IntermediateCodon_AA_part_Jones[11][16]:=t*0.232;
+IntermediateCodon_AA_part_Jones[11][17]:=t*0.016;
+IntermediateCodon_AA_part_Jones[11][18]:=t*0.008;
+IntermediateCodon_AA_part_Jones[11][19]:=t*0.07;
+IntermediateCodon_AA_part_Jones[12][0]:=t*0.194;
+IntermediateCodon_AA_part_Jones[12][1]:=t*0.014;
+IntermediateCodon_AA_part_Jones[12][2]:=t*0.015;
+IntermediateCodon_AA_part_Jones[12][3]:=t*0.018;
+IntermediateCodon_AA_part_Jones[12][4]:=t*0.017;
+IntermediateCodon_AA_part_Jones[12][5]:=t*0.024;
+IntermediateCodon_AA_part_Jones[12][6]:=t*0.115;
+IntermediateCodon_AA_part_Jones[12][7]:=t*0.01;
+IntermediateCodon_AA_part_Jones[12][8]:=t*0.021;
+IntermediateCodon_AA_part_Jones[12][9]:=t*0.102;
+IntermediateCodon_AA_part_Jones[12][10]:=t*0.016;
+IntermediateCodon_AA_part_Jones[12][11]:=t*0.015;
+IntermediateCodon_AA_part_Jones[12][13]:=t*0.164;
+IntermediateCodon_AA_part_Jones[12][14]:=t*0.074;
+IntermediateCodon_AA_part_Jones[12][15]:=t*0.285;
+IntermediateCodon_AA_part_Jones[12][16]:=t*0.118;
+IntermediateCodon_AA_part_Jones[12][17]:=t*0.023;
+IntermediateCodon_AA_part_Jones[12][18]:=t*0.006;
+IntermediateCodon_AA_part_Jones[12][19]:=t*0.01;
+IntermediateCodon_AA_part_Jones[13][0]:=t*0.057;
+IntermediateCodon_AA_part_Jones[13][1]:=t*0.009;
+IntermediateCodon_AA_part_Jones[13][2]:=t*0.049;
+IntermediateCodon_AA_part_Jones[13][3]:=t*0.323;
+IntermediateCodon_AA_part_Jones[13][4]:=t*0.004;
+IntermediateCodon_AA_part_Jones[13][5]:=t*0.026;
+IntermediateCodon_AA_part_Jones[13][6]:=t*0.597;
+IntermediateCodon_AA_part_Jones[13][7]:=t*0.009;
+IntermediateCodon_AA_part_Jones[13][8]:=t*0.292;
+IntermediateCodon_AA_part_Jones[13][9]:=t*0.072;
+IntermediateCodon_AA_part_Jones[13][10]:=t*0.043;
+IntermediateCodon_AA_part_Jones[13][11]:=t*0.086;
+IntermediateCodon_AA_part_Jones[13][12]:=t*0.164;
+IntermediateCodon_AA_part_Jones[13][14]:=t*0.31;
+IntermediateCodon_AA_part_Jones[13][15]:=t*0.053;
+IntermediateCodon_AA_part_Jones[13][16]:=t*0.051;
+IntermediateCodon_AA_part_Jones[13][17]:=t*0.02;
+IntermediateCodon_AA_part_Jones[13][18]:=t*0.018;
+IntermediateCodon_AA_part_Jones[13][19]:=t*0.024;
+IntermediateCodon_AA_part_Jones[14][0]:=t*0.058;
+IntermediateCodon_AA_part_Jones[14][1]:=t*0.113;
+IntermediateCodon_AA_part_Jones[14][2]:=t*0.016;
+IntermediateCodon_AA_part_Jones[14][3]:=t*0.029;
+IntermediateCodon_AA_part_Jones[14][4]:=t*0.005;
+IntermediateCodon_AA_part_Jones[14][5]:=t*0.137;
+IntermediateCodon_AA_part_Jones[14][6]:=t*0.328;
+IntermediateCodon_AA_part_Jones[14][7]:=t*0.022;
+IntermediateCodon_AA_part_Jones[14][8]:=t*0.646;
+IntermediateCodon_AA_part_Jones[14][9]:=t*0.038;
+IntermediateCodon_AA_part_Jones[14][10]:=t*0.044;
+IntermediateCodon_AA_part_Jones[14][11]:=t*0.045;
+IntermediateCodon_AA_part_Jones[14][12]:=t*0.074;
+IntermediateCodon_AA_part_Jones[14][13]:=t*0.31;
+IntermediateCodon_AA_part_Jones[14][15]:=t*0.101;
+IntermediateCodon_AA_part_Jones[14][16]:=t*0.064;
+IntermediateCodon_AA_part_Jones[14][17]:=t*0.017;
+IntermediateCodon_AA_part_Jones[14][18]:=t*0.126;
+IntermediateCodon_AA_part_Jones[14][19]:=t*0.02;
+IntermediateCodon_AA_part_Jones[15][0]:=t*0.378;
+IntermediateCodon_AA_part_Jones[15][1]:=t*0.223;
+IntermediateCodon_AA_part_Jones[15][2]:=t*0.059;
+IntermediateCodon_AA_part_Jones[15][3]:=t*0.03;
+IntermediateCodon_AA_part_Jones[15][4]:=t*0.092;
+IntermediateCodon_AA_part_Jones[15][5]:=t*0.201;
+IntermediateCodon_AA_part_Jones[15][6]:=t*0.073;
+IntermediateCodon_AA_part_Jones[15][7]:=t*0.04;
+IntermediateCodon_AA_part_Jones[15][8]:=t*0.047;
+IntermediateCodon_AA_part_Jones[15][9]:=t*0.059;
+IntermediateCodon_AA_part_Jones[15][10]:=t*0.029;
+IntermediateCodon_AA_part_Jones[15][11]:=t*0.503;
+IntermediateCodon_AA_part_Jones[15][12]:=t*0.285;
+IntermediateCodon_AA_part_Jones[15][13]:=t*0.053;
+IntermediateCodon_AA_part_Jones[15][14]:=t*0.101;
+IntermediateCodon_AA_part_Jones[15][16]:=t*0.477;
+IntermediateCodon_AA_part_Jones[15][17]:=t*0.038;
+IntermediateCodon_AA_part_Jones[15][18]:=t*0.035;
+IntermediateCodon_AA_part_Jones[15][19]:=t*0.063;
+IntermediateCodon_AA_part_Jones[16][0]:=t*0.475;
+IntermediateCodon_AA_part_Jones[16][1]:=t*0.042;
+IntermediateCodon_AA_part_Jones[16][2]:=t*0.038;
+IntermediateCodon_AA_part_Jones[16][3]:=t*0.032;
+IntermediateCodon_AA_part_Jones[16][4]:=t*0.012;
+IntermediateCodon_AA_part_Jones[16][5]:=t*0.033;
+IntermediateCodon_AA_part_Jones[16][6]:=t*0.046;
+IntermediateCodon_AA_part_Jones[16][7]:=t*0.245;
+IntermediateCodon_AA_part_Jones[16][8]:=t*0.103;
+IntermediateCodon_AA_part_Jones[16][9]:=t*0.025;
+IntermediateCodon_AA_part_Jones[16][10]:=t*0.226;
+IntermediateCodon_AA_part_Jones[16][11]:=t*0.232;
+IntermediateCodon_AA_part_Jones[16][12]:=t*0.118;
+IntermediateCodon_AA_part_Jones[16][13]:=t*0.051;
+IntermediateCodon_AA_part_Jones[16][14]:=t*0.064;
+IntermediateCodon_AA_part_Jones[16][15]:=t*0.477;
+IntermediateCodon_AA_part_Jones[16][17]:=t*0.112;
+IntermediateCodon_AA_part_Jones[16][18]:=t*0.012;
+IntermediateCodon_AA_part_Jones[16][19]:=t*0.021;
+IntermediateCodon_AA_part_Jones[17][0]:=t*0.298;
+IntermediateCodon_AA_part_Jones[17][1]:=t*0.062;
+IntermediateCodon_AA_part_Jones[17][2]:=t*0.031;
+IntermediateCodon_AA_part_Jones[17][3]:=t*0.045;
+IntermediateCodon_AA_part_Jones[17][4]:=t*0.062;
+IntermediateCodon_AA_part_Jones[17][5]:=t*0.047;
+IntermediateCodon_AA_part_Jones[17][6]:=t*0.011;
+IntermediateCodon_AA_part_Jones[17][7]:=t*0.961;
+IntermediateCodon_AA_part_Jones[17][8]:=t*0.014;
+IntermediateCodon_AA_part_Jones[17][9]:=t*0.18;
+IntermediateCodon_AA_part_Jones[17][10]:=t*0.323;
+IntermediateCodon_AA_part_Jones[17][11]:=t*0.016;
+IntermediateCodon_AA_part_Jones[17][12]:=t*0.023;
+IntermediateCodon_AA_part_Jones[17][13]:=t*0.02;
+IntermediateCodon_AA_part_Jones[17][14]:=t*0.017;
+IntermediateCodon_AA_part_Jones[17][15]:=t*0.038;
+IntermediateCodon_AA_part_Jones[17][16]:=t*0.112;
+IntermediateCodon_AA_part_Jones[17][18]:=t*0.025;
+IntermediateCodon_AA_part_Jones[17][19]:=t*0.016;
+IntermediateCodon_AA_part_Jones[18][0]:=t*0.009;
+IntermediateCodon_AA_part_Jones[18][1]:=t*0.115;
+IntermediateCodon_AA_part_Jones[18][2]:=t*0.004;
+IntermediateCodon_AA_part_Jones[18][3]:=t*0.01;
+IntermediateCodon_AA_part_Jones[18][4]:=t*0.053;
+IntermediateCodon_AA_part_Jones[18][5]:=t*0.055;
+IntermediateCodon_AA_part_Jones[18][6]:=t*0.008;
+IntermediateCodon_AA_part_Jones[18][7]:=t*0.009;
+IntermediateCodon_AA_part_Jones[18][8]:=t*0.01;
+IntermediateCodon_AA_part_Jones[18][9]:=t*0.052;
+IntermediateCodon_AA_part_Jones[18][10]:=t*0.024;
+IntermediateCodon_AA_part_Jones[18][11]:=t*0.008;
+IntermediateCodon_AA_part_Jones[18][12]:=t*0.006;
+IntermediateCodon_AA_part_Jones[18][13]:=t*0.018;
+IntermediateCodon_AA_part_Jones[18][14]:=t*0.126;
+IntermediateCodon_AA_part_Jones[18][15]:=t*0.035;
+IntermediateCodon_AA_part_Jones[18][16]:=t*0.012;
+IntermediateCodon_AA_part_Jones[18][17]:=t*0.025;
+IntermediateCodon_AA_part_Jones[18][19]:=t*0.071;
+IntermediateCodon_AA_part_Jones[19][0]:=t*0.011;
+IntermediateCodon_AA_part_Jones[19][1]:=t*0.209;
+IntermediateCodon_AA_part_Jones[19][2]:=t*0.046;
+IntermediateCodon_AA_part_Jones[19][3]:=t*0.007;
+IntermediateCodon_AA_part_Jones[19][4]:=t*0.536;
+IntermediateCodon_AA_part_Jones[19][5]:=t*0.008;
+IntermediateCodon_AA_part_Jones[19][6]:=t*0.573;
+IntermediateCodon_AA_part_Jones[19][7]:=t*0.032;
+IntermediateCodon_AA_part_Jones[19][8]:=t*0.008;
+IntermediateCodon_AA_part_Jones[19][9]:=t*0.024;
+IntermediateCodon_AA_part_Jones[19][10]:=t*0.018;
+IntermediateCodon_AA_part_Jones[19][11]:=t*0.07;
+IntermediateCodon_AA_part_Jones[19][12]:=t*0.01;
+IntermediateCodon_AA_part_Jones[19][13]:=t*0.024;
+IntermediateCodon_AA_part_Jones[19][14]:=t*0.02;
+IntermediateCodon_AA_part_Jones[19][15]:=t*0.063;
+IntermediateCodon_AA_part_Jones[19][16]:=t*0.021;
+IntermediateCodon_AA_part_Jones[19][17]:=t*0.016;
+IntermediateCodon_AA_part_Jones[19][18]:=t*0.071;
+
+IntermediateCodon_AA_part_Freqs={
+{          0.076748}
+{          0.019803}
+{          0.051544}
+{           0.06183}
+{          0.040126}
+{          0.073152}
+{          0.022944}
+{          0.053761}
+{          0.058676}
+{          0.091904}
+{          0.023826}
+{          0.042645}
+{          0.050901}
+{          0.040752}
+{          0.051691}
+{          0.068765}
+{          0.058565}
+{          0.066005}
+{          0.014261}
+{          0.032102}
+}
+;
+Model IntermediateCodon_AA_part_Jones_model=(IntermediateCodon_AA_part_Jones,IntermediateCodon_AA_part_Freqs);
+
+UseModel (IntermediateCodon_AA_part_Jones_model);
+Tree IntermediateCodon_tree=((((((((((((((((((CO_1187,SHA_887),LA_1287),(GZ187,QL_987)),VIC87),((((((TX_12764_483,((TX_24753_185,TX_25784_385),MS85)),((((((TX_18088_184,(TX_18733_184,TX_17988_184)),(CM_885,(GZ3_187,TX_12835_583))),OITA83),(((MI_185,NJ_185),TX_24752_185),CT_385)),CAEN184),((((VAL_491,SH_185),US85),TX_25887_285),AK_1284))),TG_885),((CC185,CC485),UY3_688)),(BK_785,((BK25_785,(((LN_286,(ST_185,CZ86)),GM_1185),YH_1085)),(YG_585,CC_688)))),(YN_1185,FO_1185))),((((TY6_1287,TY5_ [...]
+
+IntermediateCodon_tree.WUZ1_794.t=0;
+IntermediateCodon_tree.Node62.t=0;
+IntermediateCodon_tree.NY1393.t=0;
+IntermediateCodon_tree.Node223.t=0;
+IntermediateCodon_tree.Node44.t=0;
+IntermediateCodon_tree.PS8091.t=0;
+IntermediateCodon_tree.Node253.t=0;
+IntermediateCodon_tree.Node156.t=0;
+IntermediateCodon_tree.Node129.t=0;
+IntermediateCodon_tree.CM_885.t=0;
+IntermediateCodon_tree.NO93.t=0;
+IntermediateCodon_tree.Node294.t=0;
+IntermediateCodon_tree.GZ3_187.t=0;
+IntermediateCodon_tree.Node135.t=0;
+IntermediateCodon_tree.SH6_490.t=0;
+IntermediateCodon_tree.Node85.t=0;
+IntermediateCodon_tree.Node42.t=0;
+IntermediateCodon_tree.Node121.t=0;
+IntermediateCodon_tree.GUA39_689.t=0;
+IntermediateCodon_tree.Node163.t=0;
+IntermediateCodon_tree.Node33.t=0;
+IntermediateCodon_tree.US85.t=0;
+IntermediateCodon_tree.TX_39989_288.t=0;
+IntermediateCodon_tree.Node190.t=0;
+IntermediateCodon_tree.MI_185.t=0;
+IntermediateCodon_tree.PERTH01_492.t=0;
+IntermediateCodon_tree.Node327.t=0;
+IntermediateCodon_tree.MS85.t=0;
+IntermediateCodon_tree.Node90.t=0;
+IntermediateCodon_tree.Node193.t=0;
+IntermediateCodon_tree.Node315.t=0;
+IntermediateCodon_tree.SP378_195.t=0;
+IntermediateCodon_tree.GD25_693.t=0;
+IntermediateCodon_tree.Node81.t=0;
+IntermediateCodon_tree.SHA_887.t=0;
+IntermediateCodon_tree.Node79.t=0;
+IntermediateCodon_tree.YG_585.t=0;
+IntermediateCodon_tree.CC_688.t=0;
+IntermediateCodon_tree.Node306.t=0;
+IntermediateCodon_tree.Node82.t=0;
+IntermediateCodon_tree.QD53_392.t=0;
+IntermediateCodon_tree.TX_18733_184.t=0;
+IntermediateCodon_tree.Node83.t=0;
+IntermediateCodon_tree.GM_1185.t=0;
+IntermediateCodon_tree.TX_17988_184.t=0;
+IntermediateCodon_tree.Node237.t=0;
+IntermediateCodon_tree.TIANJIN3392.t=0;
+IntermediateCodon_tree.IL5_195.t=0;
+IntermediateCodon_tree.VIC193.t=0;
+IntermediateCodon_tree.YH_1085.t=0;
+IntermediateCodon_tree.LA4_893.t=0;
+IntermediateCodon_tree.Node64.t=0;
+IntermediateCodon_tree.CA271_1192.t=0;
+IntermediateCodon_tree.Node290.t=0;
+IntermediateCodon_tree.AK_1284.t=0;
+IntermediateCodon_tree.Node236.t=0;
+IntermediateCodon_tree.PARIS36395.t=0;
+IntermediateCodon_tree.Node239.t=0;
+IntermediateCodon_tree.DL19_389.t=0;
+IntermediateCodon_tree.SN8_492.t=0;
+IntermediateCodon_tree.Node201.t=0;
+IntermediateCodon_tree.Node29.t=0;
+IntermediateCodon_tree.Node224.t=0;
+IntermediateCodon_tree.NCH3396_593.t=0;
+IntermediateCodon_tree.AK9_1192.t=0;
+IntermediateCodon_tree.TH7594.t=0;
+IntermediateCodon_tree.Node272.t=0;
+IntermediateCodon_tree.HI3_1192.t=0;
+IntermediateCodon_tree.Node61.t=0;
+IntermediateCodon_tree.TX_12764_483.t=0;
+IntermediateCodon_tree.Node30.t=0;
+IntermediateCodon_tree.YOKOHAMA7392.t=0;
+IntermediateCodon_tree.PA7_1294.t=0;
+IntermediateCodon_tree.SHD9_393.t=0;
+IntermediateCodon_tree.Node47.t=0;
+IntermediateCodon_tree.Node228.t=0;
+IntermediateCodon_tree.TX_25784_385.t=0;
+IntermediateCodon_tree.Node202.t=0;
+IntermediateCodon_tree.TG_885.t=0;
+IntermediateCodon_tree.PS688_193.t=0;
+IntermediateCodon_tree.CAEN184.t=0;
+IntermediateCodon_tree.Node226.t=0;
+IntermediateCodon_tree.SAP_1292.t=0;
+IntermediateCodon_tree.Node262.t=0;
+IntermediateCodon_tree.Node225.t=0;
+IntermediateCodon_tree.CN124_295.t=0;
+IntermediateCodon_tree.Node220.t=0;
+IntermediateCodon_tree.Node280.t=0;
+IntermediateCodon_tree.Node38.t=0;
+IntermediateCodon_tree.BK25_785.t=0;
+IntermediateCodon_tree.Node264.t=0;
+IntermediateCodon_tree.HEBEI1293.t=0;
+IntermediateCodon_tree.HK23_792.t=0;
+IntermediateCodon_tree.UR46967_294.t=0;
+IntermediateCodon_tree.NGX10_193.t=0;
+IntermediateCodon_tree.Node212.t=0;
+IntermediateCodon_tree.CC485.t=0;
+IntermediateCodon_tree.Node215.t=0;
+IntermediateCodon_tree.NY64_1293.t=0;
+IntermediateCodon_tree.Node301.t=0;
+IntermediateCodon_tree.Node213.t=0;
+IntermediateCodon_tree.HK42_396.t=0;
+IntermediateCodon_tree.WUZ4_493.t=0;
+IntermediateCodon_tree.GD04_393.t=0;
+IntermediateCodon_tree.Node27.t=0;
+IntermediateCodon_tree.TX_25887_285.t=0;
+IntermediateCodon_tree.SIC4_593.t=0;
+IntermediateCodon_tree.Node28.t=0;
+IntermediateCodon_tree.BE46_292.t=0;
+IntermediateCodon_tree.RU58_393.t=0;
+IntermediateCodon_tree.Node254.t=0;
+IntermediateCodon_tree.Node71.t=0;
+IntermediateCodon_tree.Node205.t=0;
+IntermediateCodon_tree.HAR1592.t=0;
+IntermediateCodon_tree.Node346.t=0;
+IntermediateCodon_tree.Node206.t=0;
+IntermediateCodon_tree.NCH58_1293.t=0;
+IntermediateCodon_tree.LA6_993.t=0;
+IntermediateCodon_tree.Node204.t=0;
+IntermediateCodon_tree.Node211.t=0;
+IntermediateCodon_tree.BE32_192.t=0;
+IntermediateCodon_tree.NCH3332_493.t=0;
+IntermediateCodon_tree.Node32.t=0;
+IntermediateCodon_tree.NCH12_1193.t=0;
+IntermediateCodon_tree.Node203.t=0;
+IntermediateCodon_tree.Node318.t=0;
+IntermediateCodon_tree.Node189.t=0;
+IntermediateCodon_tree.Node53.t=0;
+IntermediateCodon_tree.TX_12835_583.t=0;
+IntermediateCodon_tree.PS192SPF.t=0;
+IntermediateCodon_tree.Node194.t=0;
+IntermediateCodon_tree.HK34_490.t=0;
+IntermediateCodon_tree.CZ86.t=0;
+IntermediateCodon_tree.KA206_1191.t=0;
+IntermediateCodon_tree.Node267.t=0;
+IntermediateCodon_tree.Node3.t=0;
+IntermediateCodon_tree.LN_286.t=0;
+IntermediateCodon_tree.SN91.t=0;
+IntermediateCodon_tree.Node279.t=0;
+IntermediateCodon_tree.SH24_890.t=0;
+IntermediateCodon_tree.PA15_295.t=0;
+IntermediateCodon_tree.MA1_195.t=0;
+IntermediateCodon_tree.Node155.t=0;
+IntermediateCodon_tree.Node188.t=0;
+IntermediateCodon_tree.ST_185.t=0;
+IntermediateCodon_tree.JOH33_794.t=0;
+IntermediateCodon_tree.Node16.t=0;
+IntermediateCodon_tree.EN26191.t=0;
+IntermediateCodon_tree.Node234.t=0;
+IntermediateCodon_tree.Node21.t=0;
+IntermediateCodon_tree.Node329.t=0;
+IntermediateCodon_tree.Node157.t=0;
+IntermediateCodon_tree.II236_1193.t=0;
+IntermediateCodon_tree.CA4_794.t=0;
+IntermediateCodon_tree.Node158.t=0;
+IntermediateCodon_tree.VAL_491.t=0;
+IntermediateCodon_tree.II237_1193.t=0;
+IntermediateCodon_tree.Node314.t=0;
+IntermediateCodon_tree.Node291.t=0;
+IntermediateCodon_tree.LA1_195.t=0;
+IntermediateCodon_tree.Node266.t=0;
+IntermediateCodon_tree.Node244.t=0;
+IntermediateCodon_tree.SP118_293.t=0;
+IntermediateCodon_tree.Node160.t=0;
+IntermediateCodon_tree.Node243.t=0;
+IntermediateCodon_tree.Node161.t=0;
+IntermediateCodon_tree.Node184.t=0;
+IntermediateCodon_tree.AA393.t=0;
+IntermediateCodon_tree.Node39.t=0;
+IntermediateCodon_tree.CT_385.t=0;
+IntermediateCodon_tree.BE47_292.t=0;
+IntermediateCodon_tree.Node173.t=0;
+IntermediateCodon_tree.KA149_1092.t=0;
+IntermediateCodon_tree.Node15.t=0;
+IntermediateCodon_tree.SAS68_692.t=0;
+IntermediateCodon_tree.Node341.t=0;
+IntermediateCodon_tree.Node72.t=0;
+IntermediateCodon_tree.WE66_692.t=0;
+IntermediateCodon_tree.Node14.t=0;
+IntermediateCodon_tree.CC185.t=0;
+IntermediateCodon_tree.VIC29_392.t=0;
+IntermediateCodon_tree.Node235.t=0;
+IntermediateCodon_tree.Node162.t=0;
+IntermediateCodon_tree.Node175.t=0;
+IntermediateCodon_tree.Node174.t=0;
+IntermediateCodon_tree.HK55_794.t=0;
+IntermediateCodon_tree.TW114391_192.t=0;
+IntermediateCodon_tree.Node183.t=0;
+IntermediateCodon_tree.Node2.t=0;
+IntermediateCodon_tree.Node320.t=0;
+IntermediateCodon_tree.TX_24752_185.t=0;
+IntermediateCodon_tree.Node345.t=0;
+IntermediateCodon_tree.Node133.t=0;
+IntermediateCodon_tree.BZ91.t=0;
+IntermediateCodon_tree.Node132.t=0;
+IntermediateCodon_tree.BK_785.t=0;
+IntermediateCodon_tree.GD27_594.t=0;
+IntermediateCodon_tree.SAS36_592.t=0;
+IntermediateCodon_tree.Node139.t=0;
+IntermediateCodon_tree.Node54.t=0;
+IntermediateCodon_tree.HW1_291.t=0;
+IntermediateCodon_tree.Node131.t=0;
+IntermediateCodon_tree.TX57_1293.t=0;
+IntermediateCodon_tree.Node140.t=0;
+IntermediateCodon_tree.Node273.t=0;
+IntermediateCodon_tree.NJ10_195.t=0;
+IntermediateCodon_tree.Node141.t=0;
+IntermediateCodon_tree.Node63.t=0;
+IntermediateCodon_tree.PA09_1191.t=0;
+IntermediateCodon_tree.WAIK2093.t=0;
+IntermediateCodon_tree.Node248.t=0;
+IntermediateCodon_tree.SEOUL45_1191.t=0;
+IntermediateCodon_tree.PARIS8395.t=0;
+IntermediateCodon_tree.WA1591.t=0;
+IntermediateCodon_tree.Node296.t=0;
+IntermediateCodon_tree.Node147.t=0;
+IntermediateCodon_tree.NY17_1294.t=0;
+IntermediateCodon_tree.SD1_491.t=0;
+IntermediateCodon_tree.Node350.t=0;
+IntermediateCodon_tree.MX3255_194.t=0;
+IntermediateCodon_tree.Node144.t=0;
+IntermediateCodon_tree.Node340.t=0;
+IntermediateCodon_tree.Node143.t=0;
+IntermediateCodon_tree.Node130.t=0;
+IntermediateCodon_tree.Node41.t=0;
+IntermediateCodon_tree.Node37.t=0;
+IntermediateCodon_tree.HK1_694.t=0;
+IntermediateCodon_tree.Node134.t=0;
+IntermediateCodon_tree.SOFIA15593.t=0;
+IntermediateCodon_tree.NY28_1294.t=0;
+IntermediateCodon_tree.MEM196_1195.t=0;
+IntermediateCodon_tree.NY3_293.t=0;
+IntermediateCodon_tree.PR1_1090.t=0;
+IntermediateCodon_tree.VIC68_792.t=0;
+IntermediateCodon_tree.Node49.t=0;
+IntermediateCodon_tree.NJ_185.t=0;
+IntermediateCodon_tree.Node17.t=0;
+IntermediateCodon_tree.SHIGA291.t=0;
+IntermediateCodon_tree.Node322.t=0;
+IntermediateCodon_tree.Node277.t=0;
+IntermediateCodon_tree.BE353_1289.t=0;
+IntermediateCodon_tree.NJ8_1194.t=0;
+IntermediateCodon_tree.Node200.t=0;
+IntermediateCodon_tree.Node4.t=0;
+IntermediateCodon_tree.IN3_991.t=0;
+IntermediateCodon_tree.UMEA2_1192.t=0;
+IntermediateCodon_tree.TX_24753_185.t=0;
+IntermediateCodon_tree.Node5.t=0;
+IntermediateCodon_tree.Node55.t=0;
+IntermediateCodon_tree.Node278.t=0;
+IntermediateCodon_tree.UMEA1_1192.t=0;
+IntermediateCodon_tree.HK434_1096.t=0;
+IntermediateCodon_tree.UY3_688.t=0;
+IntermediateCodon_tree.Node165.t=0;
+IntermediateCodon_tree.Node334.t=0;
+IntermediateCodon_tree.Node316.t=0;
+IntermediateCodon_tree.Node6.t=0;
+IntermediateCodon_tree.AG3105_693.t=0;
+IntermediateCodon_tree.Node293.t=0;
+IntermediateCodon_tree.Node246.t=0;
+IntermediateCodon_tree.Node113.t=0;
+IntermediateCodon_tree.Node317.t=0;
+IntermediateCodon_tree.Node7.t=0;
+IntermediateCodon_tree.GUA_389.t=0;
+IntermediateCodon_tree.SHA1_289.t=0;
+IntermediateCodon_tree.Node1.t=0;
+IntermediateCodon_tree.Node124.t=0;
+IntermediateCodon_tree.GZ187.t=0;
+IntermediateCodon_tree.KITA93.t=0;
+IntermediateCodon_tree.NY26_293.t=0;
+IntermediateCodon_tree.Node114.t=0;
+IntermediateCodon_tree.SHA16_989.t=0;
+IntermediateCodon_tree.VIC589.t=0;
+IntermediateCodon_tree.Node164.t=0;
+IntermediateCodon_tree.Node304.t=0;
+IntermediateCodon_tree.Node115.t=0;
+IntermediateCodon_tree.OITA83.t=0;
+IntermediateCodon_tree.ENG64889.t=0;
+IntermediateCodon_tree.DJ3946_1292.t=0;
+IntermediateCodon_tree.Node335.t=0;
+IntermediateCodon_tree.Node319.t=0;
+IntermediateCodon_tree.SIC89.t=0;
+IntermediateCodon_tree.GA3_393.t=0;
+IntermediateCodon_tree.JA8695_1294.t=0;
+IntermediateCodon_tree.QL_987.t=0;
+IntermediateCodon_tree.Node261.t=0;
+IntermediateCodon_tree.Node110.t=0;
+IntermediateCodon_tree.CO_1187.t=0;
+IntermediateCodon_tree.Node8.t=0;
+IntermediateCodon_tree.Node263.t=0;
+IntermediateCodon_tree.Node40.t=0;
+IntermediateCodon_tree.CC893.t=0;
+IntermediateCodon_tree.BE4_189.t=0;
+IntermediateCodon_tree.GZ54_489.t=0;
+IntermediateCodon_tree.BE57_189.t=0;
+IntermediateCodon_tree.Node343.t=0;
+IntermediateCodon_tree.ENG88.t=0;
+IntermediateCodon_tree.Node199.t=0;
+IntermediateCodon_tree.Node117.t=0;
+IntermediateCodon_tree.NY63_1293.t=0;
+IntermediateCodon_tree.Node9.t=0;
+IntermediateCodon_tree.RU3193.t=0;
+IntermediateCodon_tree.UDE44_394.t=0;
+IntermediateCodon_tree.Node169.t=0;
+IntermediateCodon_tree.GC_987.t=0;
+IntermediateCodon_tree.SN7_694.t=0;
+IntermediateCodon_tree.SIC_487.t=0;
+IntermediateCodon_tree.Node105.t=0;
+IntermediateCodon_tree.FR110994.t=0;
+IntermediateCodon_tree.NY38_193.t=0;
+IntermediateCodon_tree.Node97.t=0;
+IntermediateCodon_tree.Node292.t=0;
+IntermediateCodon_tree.SH_185.t=0;
+IntermediateCodon_tree.Node265.t=0;
+IntermediateCodon_tree.CB_188.t=0;
+IntermediateCodon_tree.Node96.t=0;
+IntermediateCodon_tree.VIC87.t=0;
+IntermediateCodon_tree.Node98.t=0;
+IntermediateCodon_tree.Node271.t=0;
+IntermediateCodon_tree.Node12.t=0;
+IntermediateCodon_tree.Node11.t=0;
+IntermediateCodon_tree.LA_1287.t=0;
+IntermediateCodon_tree.Node255.t=0;
+IntermediateCodon_tree.Node99.t=0;
+IntermediateCodon_tree.SYD_1287.t=0;
+IntermediateCodon_tree.KB_288.t=0;
+IntermediateCodon_tree.SP351_195.t=0;
+IntermediateCodon_tree.BK122_694.t=0;
+IntermediateCodon_tree.Node25.t=0;
+IntermediateCodon_tree.AG3779_1094.t=0;
+IntermediateCodon_tree.TX_18088_184.t=0;
+IntermediateCodon_tree.CA5_395.t=0;
+IntermediateCodon_tree.Node93.t=0;
+IntermediateCodon_tree.Node13.t=0;
+IntermediateCodon_tree.TY6_1287.t=0;
+IntermediateCodon_tree.Node26.t=0;
+IntermediateCodon_tree.Node276.t=0;
+IntermediateCodon_tree.YN_1185.t=0;
+IntermediateCodon_tree.TX5_1294.t=0;
+IntermediateCodon_tree.AK18_493.t=0;
+IntermediateCodon_tree.OH3_195.t=0;
+IntermediateCodon_tree.FO_1185.t=0;
+IntermediateCodon_tree.Node321.t=0;
+IntermediateCodon_tree.Node76.t=0;
+IntermediateCodon_tree.TY5_1287.t=0;
+IntermediateCodon_tree.Node78.t=0;
+IntermediateCodon_tree.Node10.t=0;
+IntermediateCodon_tree.DJ3109_1291.t=0;
+IntermediateCodon_tree.SP125_293.t=0;
+IntermediateCodon_tree.WY1_1193.t=0;
+IntermediateCodon_tree.Node356.t=0;
+IntermediateCodon_tree.SP190_393.t=0;
+IntermediateCodon_tree.ST1_193.t=0;
+IntermediateCodon_tree.Node359.t=0;
+IntermediateCodon_tree.Node355.t=0;
+IntermediateCodon_tree.Node353.t=0;
+IntermediateCodon_tree.Node313.t=0;
+IntermediateCodon_tree.ENG22093.t=0;
+IntermediateCodon_tree.Node312.t=0;
+IntermediateCodon_tree.PA993_1294.t=0;
+IntermediateCodon_tree.CA5_1193.t=0;
+IntermediateCodon_tree.WA41_1293.t=0;
+IntermediateCodon_tree.Node367.t=0;
+IntermediateCodon_tree.Node365.t=0;
+IntermediateCodon_tree.AKI194.t=0;
+IntermediateCodon_tree.RO182_194.t=0;
+IntermediateCodon_tree.Node372.t=0;
+IntermediateCodon_tree.VT3_194.t=0;
+IntermediateCodon_tree.SANT7198_894.t=0;
+IntermediateCodon_tree.Node376.t=0;
+IntermediateCodon_tree.RO160_194.t=0;
+IntermediateCodon_tree.Node375.t=0;
+IntermediateCodon_tree.Node371.t=0;
+IntermediateCodon_tree.NY4295_1194.t=0;
+IntermediateCodon_tree.NY16_1194.t=0;
+IntermediateCodon_tree.Node381.t=0;
+IntermediateCodon_tree.NY15_894.t=0;
+IntermediateCodon_tree.Node380.t=0;
+IntermediateCodon_tree.Node370.t=0;
+IntermediateCodon_tree.Node364.t=0;
+IntermediateCodon_tree.NED37293.t=0;
+IntermediateCodon_tree.FR120394.t=0;
+IntermediateCodon_tree.Node385.t=0;
+IntermediateCodon_tree.Node363.t=0;
+IntermediateCodon_tree.Node311.t=0;
+IntermediateCodon_tree.WA2693.t=0;
+IntermediateCodon_tree.Node310.t=0;
+IntermediateCodon_tree.Node260.t=0;
+IntermediateCodon_tree.HAR3_194.t=0;
+IntermediateCodon_tree.WE397.t=0;
+IntermediateCodon_tree.CN10679_997.t=0;
+IntermediateCodon_tree.SYD697.t=0;
+IntermediateCodon_tree.HI1_997.t=0;
+IntermediateCodon_tree.AUC5_697.t=0;
+IntermediateCodon_tree.Node422.t=0;
+IntermediateCodon_tree.Node420.t=0;
+IntermediateCodon_tree.Node418.t=0;
+IntermediateCodon_tree.SYD597.t=0;
+IntermediateCodon_tree.Node417.t=0;
+IntermediateCodon_tree.Node415.t=0;
+IntermediateCodon_tree.HK391_797.t=0;
+IntermediateCodon_tree.PR1_797.t=0;
+IntermediateCodon_tree.SAUS54_797.t=0;
+IntermediateCodon_tree.CANBERRA5_897.t=0;
+IntermediateCodon_tree.Node431.t=0;
+IntermediateCodon_tree.Node429.t=0;
+IntermediateCodon_tree.Node427.t=0;
+IntermediateCodon_tree.HK387_797.t=0;
+IntermediateCodon_tree.Node426.t=0;
+IntermediateCodon_tree.Node414.t=0;
+IntermediateCodon_tree.SYD497.t=0;
+IntermediateCodon_tree.Node413.t=0;
+IntermediateCodon_tree.UR41_197.t=0;
+IntermediateCodon_tree.Node412.t=0;
+IntermediateCodon_tree.SAITAMA8096_97.t=0;
+IntermediateCodon_tree.Node411.t=0;
+IntermediateCodon_tree.BE17_197.t=0;
+IntermediateCodon_tree.BE62_297.t=0;
+IntermediateCodon_tree.Node438.t=0;
+IntermediateCodon_tree.Node410.t=0;
+IntermediateCodon_tree.KO671_297.t=0;
+IntermediateCodon_tree.KO572_297.t=0;
+IntermediateCodon_tree.JA416_297.t=0;
+IntermediateCodon_tree.Node445.t=0;
+IntermediateCodon_tree.Node443.t=0;
+IntermediateCodon_tree.CL170_1096.t=0;
+IntermediateCodon_tree.Node442.t=0;
+IntermediateCodon_tree.SHZH157_796.t=0;
+IntermediateCodon_tree.Node441.t=0;
+IntermediateCodon_tree.Node409.t=0;
+IntermediateCodon_tree.CI2115_696.t=0;
+IntermediateCodon_tree.NY55_1296.t=0;
+IntermediateCodon_tree.Node456.t=0;
+IntermediateCodon_tree.GZH8_496.t=0;
+IntermediateCodon_tree.Node455.t=0;
+IntermediateCodon_tree.TIANJING55_896.t=0;
+IntermediateCodon_tree.Node454.t=0;
+IntermediateCodon_tree.GZH11_496.t=0;
+IntermediateCodon_tree.Node453.t=0;
+IntermediateCodon_tree.HK357_696.t=0;
+IntermediateCodon_tree.Node452.t=0;
+IntermediateCodon_tree.SP214_197.t=0;
+IntermediateCodon_tree.Node451.t=0;
+IntermediateCodon_tree.CORD3278_796.t=0;
+IntermediateCodon_tree.GNX189_796.t=0;
+IntermediateCodon_tree.TD4796.t=0;
+IntermediateCodon_tree.Node468.t=0;
+IntermediateCodon_tree.Node466.t=0;
+IntermediateCodon_tree.AG207_796.t=0;
+IntermediateCodon_tree.AG601_796.t=0;
+IntermediateCodon_tree.Node471.t=0;
+IntermediateCodon_tree.Node465.t=0;
+IntermediateCodon_tree.AG39_796.t=0;
+IntermediateCodon_tree.Node464.t=0;
+IntermediateCodon_tree.Node450.t=0;
+IntermediateCodon_tree.Node408.t=0;
+IntermediateCodon_tree.TIANJING51_297.t=0;
+IntermediateCodon_tree.SH19_896.t=0;
+IntermediateCodon_tree.Node477.t=0;
+IntermediateCodon_tree.FUJIAN133_596.t=0;
+IntermediateCodon_tree.SANTAFE208_896.t=0;
+IntermediateCodon_tree.Node480.t=0;
+IntermediateCodon_tree.Node476.t=0;
+IntermediateCodon_tree.JOH3_397.t=0;
+IntermediateCodon_tree.HK358_796.t=0;
+IntermediateCodon_tree.Node483.t=0;
+IntermediateCodon_tree.Node475.t=0;
+IntermediateCodon_tree.Node407.t=0;
+IntermediateCodon_tree.HAR3_1296.t=0;
+IntermediateCodon_tree.BE24496_197.t=0;
+IntermediateCodon_tree.Node486.t=0;
+IntermediateCodon_tree.Node406.t=0;
+IntermediateCodon_tree.TX1196_97.t=0;
+IntermediateCodon_tree.TD5196.t=0;
+IntermediateCodon_tree.TD5096.t=0;
+IntermediateCodon_tree.Node491.t=0;
+IntermediateCodon_tree.Node489.t=0;
+IntermediateCodon_tree.Node405.t=0;
+IntermediateCodon_tree.SHZH43_396.t=0;
+IntermediateCodon_tree.WZH1_596.t=0;
+IntermediateCodon_tree.Node496.t=0;
+IntermediateCodon_tree.GD1_396.t=0;
+IntermediateCodon_tree.Node495.t=0;
+IntermediateCodon_tree.CO11_1196.t=0;
+IntermediateCodon_tree.IN1_1196.t=0;
+IntermediateCodon_tree.Node502.t=0;
+IntermediateCodon_tree.KY2_297.t=0;
+IntermediateCodon_tree.Node501.t=0;
+IntermediateCodon_tree.NJ8_1296.t=0;
+IntermediateCodon_tree.Node500.t=0;
+IntermediateCodon_tree.Node494.t=0;
+IntermediateCodon_tree.Node404.t=0;
+IntermediateCodon_tree.VIC4797.t=0;
+IntermediateCodon_tree.VIC3097.t=0;
+IntermediateCodon_tree.Node508.t=0;
+IntermediateCodon_tree.TAS1_797.t=0;
+IntermediateCodon_tree.Node507.t=0;
+IntermediateCodon_tree.Node403.t=0;
+IntermediateCodon_tree.JA99_196.t=0;
+IntermediateCodon_tree.Node402.t=0;
+IntermediateCodon_tree.FUK11496E.t=0;
+IntermediateCodon_tree.FUK11496C.t=0;
+IntermediateCodon_tree.Node513.t=0;
+IntermediateCodon_tree.Node401.t=0;
+IntermediateCodon_tree.RI7_397.t=0;
+IntermediateCodon_tree.Node400.t=0;
+IntermediateCodon_tree.BR51_897.t=0;
+IntermediateCodon_tree.BR43_697.t=0;
+IntermediateCodon_tree.Node519.t=0;
+IntermediateCodon_tree.BR309_796.t=0;
+IntermediateCodon_tree.Node518.t=0;
+IntermediateCodon_tree.GQ1014_1096.t=0;
+IntermediateCodon_tree.JOH10_697.t=0;
+IntermediateCodon_tree.CA10_797.t=0;
+IntermediateCodon_tree.NY43_1196.t=0;
+IntermediateCodon_tree.Node533.t=0;
+IntermediateCodon_tree.MN1_497.t=0;
+IntermediateCodon_tree.MO10_1196.t=0;
+IntermediateCodon_tree.Node536.t=0;
+IntermediateCodon_tree.Node532.t=0;
+IntermediateCodon_tree.CA13_1296.t=0;
+IntermediateCodon_tree.Node531.t=0;
+IntermediateCodon_tree.JOH9_597.t=0;
+IntermediateCodon_tree.Node530.t=0;
+IntermediateCodon_tree.NY50_1196.t=0;
+IntermediateCodon_tree.Node529.t=0;
+IntermediateCodon_tree.Node527.t=0;
+IntermediateCodon_tree.CN101_197.t=0;
+IntermediateCodon_tree.PA2_297.t=0;
+IntermediateCodon_tree.Node543.t=0;
+IntermediateCodon_tree.MO11_1196.t=0;
+IntermediateCodon_tree.MOS2_197.t=0;
+IntermediateCodon_tree.Node546.t=0;
+IntermediateCodon_tree.Node542.t=0;
+IntermediateCodon_tree.Node526.t=0;
+IntermediateCodon_tree.Node524.t=0;
+IntermediateCodon_tree.WI3_896.t=0;
+IntermediateCodon_tree.NY37_1096.t=0;
+IntermediateCodon_tree.Node551.t=0;
+IntermediateCodon_tree.AK2_796.t=0;
+IntermediateCodon_tree.Node550.t=0;
+IntermediateCodon_tree.TW523_596.t=0;
+IntermediateCodon_tree.Node549.t=0;
+IntermediateCodon_tree.Node523.t=0;
+IntermediateCodon_tree.Node517.t=0;
+IntermediateCodon_tree.Node399.t=0;
+IntermediateCodon_tree.SHA9_995.t=0;
+IntermediateCodon_tree.Node398.t=0;
+IntermediateCodon_tree.FG39_1096.t=0;
+IntermediateCodon_tree.NY9_196.t=0;
+IntermediateCodon_tree.Node559.t=0;
+IntermediateCodon_tree.TH9496_97.t=0;
+IntermediateCodon_tree.Node558.t=0;
+IntermediateCodon_tree.FR7597.t=0;
+IntermediateCodon_tree.Node557.t=0;
+IntermediateCodon_tree.Node397.t=0;
+IntermediateCodon_tree.WA596.t=0;
+IntermediateCodon_tree.Node396.t=0;
+IntermediateCodon_tree.BRIS3596.t=0;
+IntermediateCodon_tree.CAR42297.t=0;
+IntermediateCodon_tree.CAR465_896.t=0;
+IntermediateCodon_tree.Node572.t=0;
+IntermediateCodon_tree.Node570.t=0;
+IntermediateCodon_tree.BK197.t=0;
+IntermediateCodon_tree.Node569.t=0;
+IntermediateCodon_tree.MN1_1196.t=0;
+IntermediateCodon_tree.WE4896.t=0;
+IntermediateCodon_tree.DE4_397.t=0;
+IntermediateCodon_tree.Node582.t=0;
+IntermediateCodon_tree.Node580.t=0;
+IntermediateCodon_tree.YOKOHAMA6896_97.t=0;
+IntermediateCodon_tree.Node579.t=0;
+IntermediateCodon_tree.AUC596.t=0;
+IntermediateCodon_tree.Node578.t=0;
+IntermediateCodon_tree.HI2_796.t=0;
+IntermediateCodon_tree.Node577.t=0;
+IntermediateCodon_tree.TH78_397.t=0;
+IntermediateCodon_tree.TH79_397.t=0;
+IntermediateCodon_tree.Node589.t=0;
+IntermediateCodon_tree.CHR196.t=0;
+IntermediateCodon_tree.Node588.t=0;
+IntermediateCodon_tree.Node576.t=0;
+IntermediateCodon_tree.Node568.t=0;
+IntermediateCodon_tree.AUC10896_97.t=0;
+IntermediateCodon_tree.BRI2296.t=0;
+IntermediateCodon_tree.Node593.t=0;
+IntermediateCodon_tree.Node567.t=0;
+IntermediateCodon_tree.MON318_696.t=0;
+IntermediateCodon_tree.Node566.t=0;
+IntermediateCodon_tree.CNIC35_196.t=0;
+IntermediateCodon_tree.NCH813_895.t=0;
+IntermediateCodon_tree.Node599.t=0;
+IntermediateCodon_tree.FUJIAN47_396.t=0;
+IntermediateCodon_tree.WUH359_995.t=0;
+IntermediateCodon_tree.Node602.t=0;
+IntermediateCodon_tree.Node598.t=0;
+IntermediateCodon_tree.NCH933_995.t=0;
+IntermediateCodon_tree.Node597.t=0;
+IntermediateCodon_tree.Node565.t=0;
+IntermediateCodon_tree.Node395.t=0;
+IntermediateCodon_tree.GZH66_497.t=0;
+IntermediateCodon_tree.Node394.t=0;
+IntermediateCodon_tree.CNIC22_195.t=0;
+IntermediateCodon_tree.Node393.t=0;
+IntermediateCodon_tree.GNX42_495.t=0;
+IntermediateCodon_tree.Node392.t=0;
+IntermediateCodon_tree.BZ18_496.t=0;
+IntermediateCodon_tree.BR3_496.t=0;
+IntermediateCodon_tree.BR45_696.t=0;
+IntermediateCodon_tree.Node619.t=0;
+IntermediateCodon_tree.BR87_596.t=0;
+IntermediateCodon_tree.Node618.t=0;
+IntermediateCodon_tree.BZ8_496.t=0;
+IntermediateCodon_tree.Node617.t=0;
+IntermediateCodon_tree.Node615.t=0;
+IntermediateCodon_tree.BR184_696.t=0;
+IntermediateCodon_tree.Node614.t=0;
+IntermediateCodon_tree.BR597_796.t=0;
+IntermediateCodon_tree.Node613.t=0;
+IntermediateCodon_tree.NJ11_1294.t=0;
+IntermediateCodon_tree.CN147_495.t=0;
+IntermediateCodon_tree.SN28_595.t=0;
+IntermediateCodon_tree.Node633.t=0;
+IntermediateCodon_tree.Node631.t=0;
+IntermediateCodon_tree.GE767_495.t=0;
+IntermediateCodon_tree.Node630.t=0;
+IntermediateCodon_tree.JOH295.t=0;
+IntermediateCodon_tree.Node629.t=0;
+IntermediateCodon_tree.SN27_595.t=0;
+IntermediateCodon_tree.HK38_895.t=0;
+IntermediateCodon_tree.Node638.t=0;
+IntermediateCodon_tree.Node628.t=0;
+IntermediateCodon_tree.WA186_1294.t=0;
+IntermediateCodon_tree.VA25_1294.t=0;
+IntermediateCodon_tree.Node641.t=0;
+IntermediateCodon_tree.Node627.t=0;
+IntermediateCodon_tree.HK3_195.t=0;
+IntermediateCodon_tree.Node626.t=0;
+IntermediateCodon_tree.Node612.t=0;
+IntermediateCodon_tree.WV1_395.t=0;
+IntermediateCodon_tree.GE578652_295.t=0;
+IntermediateCodon_tree.Node645.t=0;
+IntermediateCodon_tree.Node611.t=0;
+IntermediateCodon_tree.NE11_395.t=0;
+IntermediateCodon_tree.AK10_295.t=0;
+IntermediateCodon_tree.Node650.t=0;
+IntermediateCodon_tree.KWJ195_1194.t=0;
+IntermediateCodon_tree.Node649.t=0;
+IntermediateCodon_tree.CHW995_1294.t=0;
+IntermediateCodon_tree.Node648.t=0;
+IntermediateCodon_tree.Node610.t=0;
+IntermediateCodon_tree.CN17_196.t=0;
+IntermediateCodon_tree.FL4_1195.t=0;
+IntermediateCodon_tree.LA5_1195.t=0;
+IntermediateCodon_tree.Node660.t=0;
+IntermediateCodon_tree.KO45_296.t=0;
+IntermediateCodon_tree.BZ2_395.t=0;
+IntermediateCodon_tree.Node666.t=0;
+IntermediateCodon_tree.CN61_296.t=0;
+IntermediateCodon_tree.Node665.t=0;
+IntermediateCodon_tree.GE491_396.t=0;
+IntermediateCodon_tree.Node664.t=0;
+IntermediateCodon_tree.UK897_696.t=0;
+IntermediateCodon_tree.MN6_1195.t=0;
+IntermediateCodon_tree.Node671.t=0;
+IntermediateCodon_tree.Node663.t=0;
+IntermediateCodon_tree.Node659.t=0;
+IntermediateCodon_tree.Node657.t=0;
+IntermediateCodon_tree.DE3_1195.t=0;
+IntermediateCodon_tree.NV1_1195.t=0;
+IntermediateCodon_tree.Node679.t=0;
+IntermediateCodon_tree.ID4_1195.t=0;
+IntermediateCodon_tree.Node678.t=0;
+IntermediateCodon_tree.MO6_396.t=0;
+IntermediateCodon_tree.Node677.t=0;
+IntermediateCodon_tree.JOH5396_97.t=0;
+IntermediateCodon_tree.Node676.t=0;
+IntermediateCodon_tree.AK16_995.t=0;
+IntermediateCodon_tree.JOH1795.t=0;
+IntermediateCodon_tree.Node685.t=0;
+IntermediateCodon_tree.Node675.t=0;
+IntermediateCodon_tree.ID3_1195.t=0;
+IntermediateCodon_tree.CN2796_1295.t=0;
+IntermediateCodon_tree.Node688.t=0;
+IntermediateCodon_tree.Node674.t=0;
+IntermediateCodon_tree.Node656.t=0;
+IntermediateCodon_tree.AG4057_795.t=0;
+IntermediateCodon_tree.SHD5_894.t=0;
+IntermediateCodon_tree.BE281_1294.t=0;
+IntermediateCodon_tree.Node693.t=0;
+IntermediateCodon_tree.Node691.t=0;
+IntermediateCodon_tree.Node655.t=0;
+IntermediateCodon_tree.Node609.t=0;
+IntermediateCodon_tree.Node391.t=0;
+IntermediateCodon_tree.Node389.t=0;
+DataSet IntermediateCodon_AA = ReadDataFile(USE_NEXUS_FILE_DATA);
+DataSetFilter IntermediateCodon_AA_part = CreateFilter(IntermediateCodon_AA,1,"0-328","312,311,310,308,309,313,329,332,330,331,341,342,340,339,338,337,348,345,344,343,346,347,7,334,335,333,336,328,316-318,325,326,324,322,321,323,327,320,319,315,314,303,302,304,305,301,306,307,300,299,298,297,295,293,292,294,289,288,290,291,296,287,275,274,279,282,280,281,284,283,285,286,278,276,277,258,267,266,264,263,265,272,257,262,259-261,271,273,268-270,256,255,252-254,251,232,231,233,230,226-228,225 [...]
+LikelihoodFunction IntermediateCodon_AA_LF = (IntermediateCodon_AA_part,IntermediateCodon_tree);
+
+
+OPTIMIZATION_PRECISION    		= 0.001;
+VERBOSITY_LEVEL			  		= 1;
+USE_ADAPTIVE_VARIABLE_STEP		= 1;
+OPTIMIZATION_METHOD        		= 4;
+
+Optimize(res_IntermediateCodon_AA_LF,IntermediateCodon_AA_LF);
+
+/* test epilogue */
+	timeMatrix = endTestTimer 				  (_testDescription);
+	if (logTestResult (Abs (res_IntermediateCodon_AA_LF[1][0] - _expectedLL) < 2*OPTIMIZATION_PRECISION))
+	{
+		return timeMatrix;
+	}
+	return 0;
+/* end test epilogue */
+
+END;
diff --git a/tests/hbltests/SimpleOptimizations/LargeNuc.bf b/tests/hbltests/SimpleOptimizations/LargeNuc.bf
new file mode 100644
index 0000000..8074c6c
--- /dev/null
+++ b/tests/hbltests/SimpleOptimizations/LargeNuc.bf
@@ -0,0 +1,9407 @@
+#NEXUS
+
+BEGIN TAXA;
+	DIMENSIONS NTAX = 3112;
+	TAXLABELS
+		'KDR_pat62_199605' 'KDR_pat63_199603' 'KDR_pat69_199605' 'KDR_pat60_199604' 'KDR_pat56_199604' 'KDR_pat57_199604' 'KDR_pat7_199605' 'KDR_pat80_199601' 'KDR_pat82_199605' 'KDR_pat77_199602' 'KDR_pat72_199606' 'KDR_pat73_199607' 'KDR_pat55_199604' 'KDR_pat38_199605' 'KDR_pat40_199603' 'KDR_pat41_199604' 'KDR_pat36_199605' 'KDR_pat31_199603' 'KDR_pat32_199604' 'KDR_pat42_199603' 'KDR_pat51_199602' 'KDR_pat52_199602' 'KDR_pat50_199605' 'KDR_pat43_199603' 'KDR_pat5_199604' 'KDR_pat84_199604 [...]
+END;
+
+BEGIN CHARACTERS;
+	DIMENSIONS NCHAR = 873;
+	FORMAT
+		DATATYPE = DNA
+		GAP=-
+		MISSING=?
+	;
+
+MATRIX
+	'KDR_pat62_199605'         ------------------------------------------------------------------------------------------------------NTTTGTACAGAAATGGARAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAATTCAATTAGGAATACCACATCCYGCAGGGTTAMAAMAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGGTKAGATATCAGTACAATGTGCTKCCACAGGGAGGATCACCAGCAATATT [...]
+	'KDR_pat63_199603'         ------------------------------------------------------------------------------------------------------NTTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCARTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGGATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAMTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'KDR_pat69_199605'         ------------------------------------------------------------------------------------------------------NTTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGRAAATTAGTAGATTTCAGAGAACTTAATAAGARAACTCAAGACTTCTGGGAAGTTCAATTAGGRATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCARTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTAYAATGTGCTTCCACAGGGAGGCTCACCAGCAATATT [...]
+	'KDR_pat60_199604'         ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAACTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTYTCAGTTCCCTTAGATGACTTCAGGAAGTACACTGCATTTACCATACCTAGTRTAAACAATGAGACACCAGGGATTAGATATCAATACAATGTGCTTCCACAGGGAGGATCACCATCAATATT [...]
+	'KDR_pat56_199604'         ------------------------------------------------------------------------------------------------------NTTTGTACAGAACTGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGGGAACTTAATAAGAGAACTCAGGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGATTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'KDR_pat57_199604'         ------------------------------------------------------------------------------------------------------NTCTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGRGAACTTAATAAGAAAACTCAAGAYTTYTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAARAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAATACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'KDR_pat7_199605'          ------------------------------------------------------------------------------------------------------NTTTGTACAGAAATGGAAAAGGAAGGGAAAATTACAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCARTTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTRGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTCACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAATACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'KDR_pat80_199601'         ------------------------------------------------------------------------------------------------------NTTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAATATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGCATAAACAATGAAACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'KDR_pat82_199605'         ------------------------------------------------------------------------------------------------------NTTTGTACAGAAATGGAAAAGGAAGGRAAAATTTCAAAAATTGGKCCTGAAAAYCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAGTGGAGAAAATTAGTWGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCRCATCCMGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAYTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATACCAGTACAATGTGCTTCCACAGGGGGGATCACCAGCAATATT [...]
+	'KDR_pat77_199602'         ------------------------------------------------------------------------------------------------------NTTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTTAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTCCAATTAGGGATACCACATCCCGCAGGGTTAAAAAAGAGAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGAYACCAGGGATKAGATATCAGTACAATGTGCTTCCACAGGGAGGGTCACCAGCAATATT [...]
+	'KDR_pat72_199606'         ------------------------------------------------------------------------------------------------------NTTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAGAATTGGGCCTGAAAATCCATAYAATACTCCAGTATTTGCCATAAAGAAAAARGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGARCTTAATAAGAGAACTCAAGACTTCTGGGAGGTTCAATTAGGAATACCACACCCAGCAGGGTTAAAAAAGAAAAARTCAGTAACAGTACTAGATGTGGGYGATGCATATTTTTCAGTTCCYTTAGATGACTTCAGGAAATATACTGCATTYACCATACCTAGTATAAACAATGAGACACCAGGAGTTAGATATCARTACAATGTGCTTCCACAGGGAGGATCRCCAGCAATATT [...]
+	'KDR_pat73_199607'         ------------------------------------------------------------------------------------------------------NTTTGTACAGAGATKGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTYTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAGTCAGTRACAGTACTRGATGTGGGTGATGCATATTTYTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACTATACCTAGTACAAACAATGAGACACCAGGAATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'KDR_pat55_199604'         ------------------------------------------------------------------------------------------------------NTTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGKTTAAAAAAGAAGAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGATTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'KDR_pat38_199605'         ------------------------------------------------------------------------------------------------------NTTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCAATAAAGAAAAAAGACAGTACCAAATGGAGAAAATTAGTGGATTTCAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAGAAGAAAAAATCAGTGACAGTATTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGACGACTTCAGGAAGTACACTGCATTTACAATACCTAGTATAAACAATGAGACACCAGGAATTAGATATCAGTACAATGTGCTTCCACAAGGAGGATCACCAGCAATCTT [...]
+	'KDR_pat40_199603'         ------------------------------------------------------------------------------------------------------NTTTGTACAGAAATGGAAAAGGAAGGRAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGARAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTRGATGTGGGTGATGCATATTTTTCAATYCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTAGAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'KDR_pat41_199604'         ------------------------------------------------------------------------------------------------------NTTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAGAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCAATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTATTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTGTAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'KDR_pat36_199605'         ------------------------------------------------------------------------------------------------------NTTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAARTGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCMGCAGGGTTAAAAAAGAAAAAATCAGTRACAGTACTGGATGTGGGTGATGCATAYTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAAGGAGGATCACCAGCAATATT [...]
+	'KDR_pat31_199603'         ------------------------------------------------------------------------------------------------------NTTTGTACAGAAATGGAAAAGGAAGGAAARATTTCAAAAATTGGGCCTGAAAAYCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAGTTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTCCAATTAGGAATACCACATCCTGCAGGGTTAAAAAGGAAAAAATCAGTAACAGTACTGGATGTRGGTGATGCATATTTTTCAGTTCCYTTAGATGAATTCAGGAAGTATACTGCATTCACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTGCCACAGGGAGGATCACCAGCAATATT [...]
+	'KDR_pat32_199604'         ------------------------------------------------------------------------------------------------------NTTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGARAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAARTGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAGAAGAAAAAATCAGTAACAGTAYTGGATGTGGGTGATGCATATTTTTCAGTTCCYTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAAGGAGGATCACCAGCAATATT [...]
+	'KDR_pat42_199603'         ------------------------------------------------------------------------------------------------------NTYTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAAYCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACYAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGARAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACACCCAGCAGGGTTAAAAMAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTCTCAGTTCCATTAGATGACTTCAGGAAGTATACTGCATTYACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTKCCACAGGGAGGATCACCAGCAATATT [...]
+	'KDR_pat51_199602'         ------------------------------------------------------------------------------------------------------NTTTGTACAGNAATGGAAAAAGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGGACTCAAGATTTCTGGGAAGTYCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAARTCAGTAACAGTACTGGATGTGGGTGATGCATATTTYTCAGTTCCCTTAGATGACTTCAGAAAGTATACTGCATTTACCATACCTAGTAYAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'KDR_pat52_199602'         ------------------------------------------------------------------------------------------------------NTTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGGACTCAAGACTTCTGGGAGGTTCAATTAGGAATACCACATCCYGCAGGGTTAAAACAGAAAAAGTCAGTAACAGTACTGGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGACGAMTTCAGAAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGGTATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAGTATT [...]
+	'KDR_pat50_199605'         ------------------------------------------------------------------------------------------------------NTTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGGACTCAGGACTTYTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAAGGAGGATCACCAGCWATATT [...]
+	'KDR_pat43_199603'         ------------------------------------------------------------------------------------------------------NTTTGTGCAGAAATGGAAAAGGAAGGGAAAATTGAAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCTATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTRAAAAAGAAGAAATCAGTAACAGTACTGGATGTGGGTGATGCATAYTTTTCAGTTCCCTTAGAYGACTTCAGAAAGTATACTGCATTTACCATACCTAGTGTAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'KDR_pat5_199604'          ------------------------------------------------------------------------------------------------------NTTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGAYAGTACAAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCARGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTTGATGTGGGANATGCATAYTTTTCAGTTCCCTTAGATGAGTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTACTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'KDR_pat84_199604'         ------------------------------------------------------------------------------------------------------NTATGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAACCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGACTTCAGAGAACTTAATAAGAGGACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCAGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGACGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGGTTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'MDS_01UAKV258_200101'     CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAATAGAAATCTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACACCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTAGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGAAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'MDS_01UAKV259_200101'     CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGGCCAAAAGTTAAACAATGGCCATTGACAGAAGAGAAAAAAGCACTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTGCTRGATGTGGGTGATGCATACTTTTCAGTTCCCTTAGATGAATTTAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'MDS_01UAKV260_200101'     CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAGGCATTAATAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACACCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGAAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'MDS_01UAKV252_200101'     CCCATTAGTCCTATTGAAACGGTACCAGTAAAAAAGCCAGGAATGGATGGGCCAAAAGTTAAACAATGGCCATTGACAGAAGAGAAAAAAGCACTARTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACGTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATACTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGCGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'MDS_01UAKV242_200101'     CCCATTAGTCCTATTGAGACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAATAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACGGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACACCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGAAAGTATACTGCATTTACCATACCCAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'MDS_01UAKV245_200101'     CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGGCCAAAAGTTAAACAATGGCCATTAACAGAAGAGAAAAAAGCACTAGTAGAAATTTGTACAGAAATGGAGAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTGCTGGATGTGGGTGATGCATACTTTTCAGTTCCCTTAGATGAATTTAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATCAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'MDS_01UAKV263_200101'     CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAGCAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAACCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAGTGGAGAAAATTGGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAGGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGATTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'MDS_01UAOD039_200101'     CCCATAAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAGGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTGCTGGATGTGGGTGATGCATATTTTTCAGTACCATTACATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATGAACAATGAGACACCAGGAATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'MDS_02AZ044_199901'       CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAATAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGRCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACACCCTKCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTGCCACAGGGAGGATCACCAGCAATATT [...]
+	'MDS_01UAOD037_200101'     CCCATAAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAGGGGAAAATTTCAAAAATTGGACCTGAAAATCCTTACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAACTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTGCTGGATGTGGGTGATGCATATTTTTCAGTACCATTACATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATGAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'MDS_01UAKV267_200101'     CCTATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACACCCTGCAGGGTTAAAAAAGAAGAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGAAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'MDS_01UAKV272_200101'     CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAATAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGGGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACACCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGAAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'MDS_01UAKV241_200101'     CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAATAGAAATTTGTRCAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACACCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGAAAGTATACTGCATTYACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'KDR_pat93_199602'         ------------------------------------------------------------------------------------------------------NTTTGTACAGAAATGGAAAAAGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTAGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCGCCAGCAATATT [...]
+	'KDR_pat94_199603'         ------------------------------------------------------------------------------------------------------NTTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGAYAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTYAATAAGARAACTCAAGAYTTYTGGGAAGTTCAAYTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTRGATGTGGGTGATGCATATTTYTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTYCCACAGGGAGGATCACCAGCAATATT [...]
+	'KDR_pat95_199603'         ---------CCCATAGAAACTGTGGACATAAAGAAGNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNTTTGCACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCARTTAGGAATACCACACCCCTCAGGGTTAAAACAGAGAAAATCAGTRACAGTACTAGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGACGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGAATTAGRTATCAGTACAATGTGCTCCCACAGGGAGGATCACCTKCAATATT [...]
+	'KDR_pat91_199602'         ------------------------------------------------------------------------------------------------------NTTTGCACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTCTTTGCTATAAAGAAAAAAGATAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGCGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGTTTAAAAAAGAAGAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGATTTTAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'KDR_pat88_199605'         ------------------------------------------------------------------------------------------------------NTTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCYGCAGGGTTRAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTWCCCTTAGAYGACTTCAGAAAGTATACTGCATTTACCATACCTAGTRTAAATAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'KDR_pat9_199605'          ------------------------------------------------------------------------------------------------------NTCTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAAYCCATACAATACTCCAATATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGAYTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTYAGGAAGTATACTGCATTTACCATACCTAGTGTAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'KDR_pat96_199603'         ------------------------------------------------------------------------------------------------------NTTTNNACAGAAATGGAAAAGGAGGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTYAGAGAACTTAACAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTRAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAVTTYAGAAAGTATACTGCATTTACCATACCTAGTATAAACAATGAAACACCAGGGACTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCATCAATATT [...]
+	'MDS_01UAKV161_200101'     CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGGCCAAAAGTTAAACAATGGCCACTGACAGAAGAAAAAAATGCATTAATAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTCAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTTCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATACTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTAGAAATAATGAAACACCAGGGATTAGATATCAATACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'MDS_01UAKV167_200101'     CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGGCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAGAATTGGGCCTGACAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACCAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACCCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATACTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'MDS_01UAKV106_200101'     CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGGCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCACTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAAYCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAGTGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGGGATGCATACTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'MDS_01AZ018_199901'       CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAATAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACACCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGAAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATACCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'MDS_01UAKV104_200101'     CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGGCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAATATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGACTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAGGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTATTGGATGTGGGTGATGCATACTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGGTTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'KDR_pat30_199603'         ------------------------------------------------------------------------------------------------------NTTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGGGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTRACAGTACTGGATGTGGGTGAYGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCGGGGGTTAGATATCAGTACAATGTGCTTCCACAAGGAGGATCACCAGCAATATT [...]
+	'KDR_pat219_199602'        ------------------------------------------------------------------------------------------------------NTTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAATATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCAGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTRGGTGATGCATATTTCTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTCCCACAGGGAGGATCACCAGCAATATT [...]
+	'KDR_pat230_199604'        ------------------------------------------------------------------------------------------------------NTTTGTACAGAGATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGTTTAAAAAAGAAAAAATCAGTAACAGTATTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTAYAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'KDR_pat231_199605'        ------------------------------------------------------------------------------------------------------NTTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCTTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAATACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'KDR_pat218_199603'        ------------------------------------------------------------------------------------------------------NTTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGAYTTCTGGGAAGTTCAATTAGGAATACCACATCCWGCAGGGTTAAAAAAGAAAAAATCARTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAGTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'KDR_pat214_199602'        ------------------------------------------------------------------------------------------------------NTCTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTWTTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAGCTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACACCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCCAGTATAAACAATGCGACACCAGGGRYTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCCATATT [...]
+	'KDR_pat215_199602'        ------------------------------------------------------------------------------------------------------NTTTGTACAGAAATGGAAAAGGAAGGRAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGAYTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTRAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTYCCATTAGATGATTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCMGGAATTAGATATCAGTACAATGTACTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'KDR_pat234_199602'        ------------------------------------------------------------------------------------------------------NTTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGATAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGGACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATACTTTTCAGTTCCTTTAGATGACTTCAGAAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'KDR_pat240_199603'        ------------------------------------------------------------------------------------------------------NTCTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTYAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCYGCAGGGTTAAAAAAGAAAAAATCAGTWACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACRCCAGGGATTAGATATCAGTACAATGTACTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'KDR_pat241_199605'        ------------------------------------------------------------------------------------------------------NTCTGTGCAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCYATAAAGAAAAAAGACAGTACTAAATGGAGRAAGTTAGTAGATTTCAGAGAACTTAATAAGARAACTCAAGACTTCTGGGAAGTYCAATTRGGAATACCACATCCYGCAGGGTTAAAAAAGAGAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCGGTTCCCTTAGATGAYTTCAGAAARTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTACTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'KDR_pat24_199605'         ------------------------------------------------------------------------------------------------------NTTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAARTTGGGCCTGAAAATCCATACAATACTCCAATATTTGCTATAAAGAAAAAAGACRGTACTARATGGAGAAAATTAGTAGATTTYAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGATTTCAGGAAGTATACTGCATTTACCATACCTAGTASAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'KDR_pat235_199602'        ------------------------------------------------------------------------------------------------------NTCTGTACAGAAATGGAAAAGGAAGGGAARATTTCAAAGATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTYTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATWTT [...]
+	'KDR_pat239_199603'        ------------------------------------------------------------------------------------------------------NTCTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAACCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAATTGAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGYATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'KDR_pat208_199601'        ------------------------------------------------------------------------------------------------------NTTTGTACAGAAATGGAGAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGGGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTGAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCYTTAGATGACTTCAGGAAGTATACTGCATTCACTATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'KDR_pat186_199605'        ------------------------------------------------------------------------------------------------------NTTTGTACAGAAMTGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCTATAAAGAAAAAAGACAGTACTAAATGGAGAAARTTAGTAGATTTCAGAGAACTTAACAAGAGAACCCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCTCAGGGTTAAAAAAGAAAAAATCAGTAACAGTATTRGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'KDR_pat187_199605'        ------------------------------------------------------------------------------------------------------NTTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAACCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTAGATGTGGGCGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'KDR_pat190_199603'        ------------------------------------------------------------------------------------------------------NTTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTGGACTTCAGAGAACTTAATAAGAGAACTCAAGATTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATGADTTCAGAAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'KDR_pat184_199604'        ------------------------------------------------------------------------------------------------------NTTTGTACAGAAATGGAAAAGGAAGGAAAGATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTYAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGGATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTRGATGTGGGTGATGCATATTTYTCAGTTCCYTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'KDR_pat18_199604'         ------------------------------------------------------------------------------------------------------NTTTGTACAGAAAKGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAGTTAGGAATACCACATCCCGCAGGGTTRAAAAAGAAAAGATCAGTAACAGTACTGGATGTGGGGGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGAAAGTATACTGCATTTACCATACCTAGTATAAATAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTCCCACAGGGAGGATCACCAGCAATATT [...]
+	'KDR_pat183_199604'        ------------------------------------------------------------------------------------------------------NTTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGARAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGATAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTCCAGTTAGGAATACCACATCCCGCAGGGTTGAAAAAGAAAAAATCAGTGACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGAATYAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'KDR_pat191_199604'        ------------------------------------------------------------------------------------------------------NTTTGTACAGAAATGGAAAAGGAAGGGAAAATCTCAAAAATTGGGCCTGAAAACCCATACAACACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGATTTYTGGGAAGTTCAATTAGGGATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACARTACTGGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTYCCACAGGGAGGATCACCAGCAATATT [...]
+	'KDR_pat205_199602'        ------------------------------------------------------------------------------------------------------NTTTGYTCAGAAATGGGAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAAYAARAGAACTCARGACTTCTGGGAAGTTCAATTAGGAATACCACATCCYGCAGGGTTAAAAAAGAAAAAATCAGTAACRGTACTGGATGTGGGTGATGCATATTTTTCAGTYCCTTTAGATGACTTCAGAAAGTATACTGCWTTTACCATACCTAGTGTAAACAATGAGACACCAGGRATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'KDR_pat206_199603'        ------------------------------------------------------------------------------------------------------NTTTGYAAAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAACACTCCAGTATTTGCCATAAAGAAAAARGAYAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGWGATGCATATTTCTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAAGGAGGATCACCAGCAATATT [...]
+	'KDR_pat202_199605'        ------------------------------------------------------------------------------------------------------NTTTGTACAGAGATGGAAAAGGAAGGGAAAATTTCAAAGATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAAAAGAAAGACAGTACTAAATGGAGAAAACTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGATTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCTTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCGCCAGCAATATT [...]
+	'KDR_pat200_199603'        ------------------------------------------------------------------------------------------------------NTTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAGAGTTGGGCCTGAAAATCCATACAATACTCCAATATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTACACTGCATTTACCATACCTAGTGTAAACAATGAGACACCAGGGGTTAGATATCAGTACAATGTGCTTCCGCAGGGAGGATCACCAGCAATATT [...]
+	'KDR_pat201_199605'        ------------------------------------------------------------------------------------------------------NTTTGTACAGAAATGGAGAAGGAAGGGAAAATTTCGAAAATTGGGCCTGAAAATCCATACAATACTCCAATATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTGCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTTACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATRAMTTTAGGAAATATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGRTTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'KDR_pat242_199605'        ------------------------------------------------------------------------------------------------------NTTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAATATTTGCAATAAAGAAAAARGACAGTACTAAATGGAGAAAATTAGTAGATTTYAGGGARCTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGRTTAAAAAAGAAAAAATCAGTAACAGTACTRGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACRCCAGGGATTAGATATCAGTACAATGTGCTCCCGCAGGGAGGATCACCAGCAATATT [...]
+	'KDR_pat273_199512'        ------------------------------------------------------------------------------------------------------NTTTGTACAGAAATGGARAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTRTTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCYGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATAAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'KDR_pat278_199603'        ------------------------------------------------------------------------------------------------------NTTTGTACAGAAATGGAAAAGGAAGGGAAAATTACAAAAATTGGGCCTGAAAATCCATACAATACSCCAATATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAAYTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCYGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTRGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAMTTCAGAAAGTATACTGCATTTACCATACCTAGTACAAAYAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTGCCACAGGGAGGCTCACCAGCAATATT [...]
+	'KDR_pat279_199604'        ------------------------------------------------------------------------------------------------------NTTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAGAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAGGTTCAACTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTAYACTGCATTTACCATACCTAGTRTAAACAAYGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'KDR_pat272_199601'        ------------------------------------------------------------------------------------------------------NTTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAGAATCCATACAATACTCCAGTATTTGCCATAAARAAGAAAGACAGTACTAAATGGAGAAAGTTAGTAGACTTCAGRGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAACTAGGAATACCACATCCCGCRGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGYGATGCATATTTYTCAGTTCCCTTAGATGAATTCAGGAAGTATACAGCATTTACCATACCTAGTGTAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'KDR_pat268_199512'        ------------------------------------------------------------------------------------------------------NTTTGTRCAGAAATGGARAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCARTATTTGCCATAAAGAAAAAAGATGGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACWCAAGAYTTCTGGGAAGTTCAATTAGGRATACCACATCCTGCAGGGTTAAAAAAGAAAAARTCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTACATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'KDR_pat270_199512'        ------------------------------------------------------------------------------------------------------NTTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCAGCAGGGTTAAARAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATACTTTTCAGTTCCCTTAGATGAATTCAGAAAGTATACTGCATTTACCATACCTAGTGTAAACAATGAGACACCAGGRATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'KDR_pat281_199603'        ------------------------------------------------------------------------------------------------------NTTTGTACAGAAATGGAAAAGGAAGGRAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTTAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTGGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCTTTAGATGACTTCAGAAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'KDR_pat291_199605'        ------------------------------------------------------------------------------------------------------NTTTGYACAGAAATGGAGAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAGTCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGAAAGTATACTGCATTTACCATACCTAGTGTAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGGTCACCAGCAATATT [...]
+	'KDR_pat292_199601'        ------------------------------------------------------------------------------------------------------NTTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAARATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGARAACYCAAGACTTCTGGGAAGTCCAAYTAGGAATACCACAYCCCGCAGGGTTGAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGAATTAGRTATCAGTACAATGTGCTTCCACAGGGAGGATCCCCAGCAATATT [...]
+	'KDR_pat29_199603'         ------------------------------------------------------------------------------------------------------NTTTGTACCGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTTAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTCCAATTAGGAATACCACACCCCGCAGGGTTAAAAAAGAAGAAATCAGTAACAGTACTAGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACCCCAGGGATTAGATATCAATACAAYGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'KDR_pat287_199604'        ------------------------------------------------------------------------------------------------------NTTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCWTACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAARAGAACTCAAGACTTCTGGGAAGTYCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTRCATGACTTCAGGAARTATACTGCATTTACCATACCTAGTACAAACAATGAGACRCCAGGGATTAGATAYCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'KDR_pat289_199606'        ------------------------------------------------------------------------------------------------------NTCTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAGATTGGGCCTGAAAATCCATACAATACTCCAGTATTCGCAATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCYGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGRGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACTATACCTAGTATAAACAATGAGACACCAGGGATTAGGTATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'KDR_pat267_199512'        ------------------------------------------------------------------------------------------------------NTTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCYATAAAAAAGAAAGACAGTACTAAGTGGAGAAAATTAGTAGATTTCAGGGAACTTAATAAGAGAACTCAAGAYTTCTGGGAAGTTCAACTAGGAATACCACATCCAGCAGGATTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTAYACTGCATTTACCATACCTAGTGTAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'KDR_pat246_199601'        ------------------------------------------------------------------------------------------------------NTCTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTTTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAGAAAGAAAAAATCAGTAACAGTATTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGAAAGTATACTGCATTTACCATACCTAGCACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'KDR_pat248_199602'        ------------------------------------------------------------------------------------------------------NTTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAGAAGGACAGTACTAAGTGGAGAAAATTAGTAGATTTCAGGGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCTCAGGGTTAAAAAAGAAAAAATCAGTAACAGTGCTAGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATGATTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTACTTCCACAGGGGGGATCACCAGCAATATT [...]
+	'KDR_pat245_199601'        ------------------------------------------------------------------------------------------------------NTTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCTTACAATACTCCAGTATTTGCCATAAAGAAAAAAGATAGTACTAAATGGAGAAARTTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCYGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTACTTCCACAAGGAGGATCACCAGCAATATT [...]
+	'KDR_pat243_199605'        ------------------------------------------------------------------------------------------------------NTTTGTACAGAAATGGAAAAGGAAGGRAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAARGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'KDR_pat244_199605'        ------------------------------------------------------------------------------------------------------NTCTGTACAGAAATGGAAAAGGAAGGNAAAATYTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACYCAAGAYTTCTGGGAAGTYCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTRGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGAYGAATTCAGGAAGTATACTGCATTCACCATACCTAGTATAAACAATGAGACACCAGGGATCAGATATCAGTACAATGTGCTGCCACAGGGAGGATCACCAGCAATATT [...]
+	'KDR_pat249_199603'        ------------------------------------------------------------------------------------------------------NTTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACCAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAGAAGAAAAAATCAGTGACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTACATGACTTCAGGAAGTACACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'KDR_pat262_199512'        ------------------------------------------------------------------------------------------------------NTTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGCACTAAATGGAGAAAATTAGTAGATTTCAGAGAGCTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCTTTAGACGACTTTAGGAAGTATACTGCATTTACCATACCTAGTAGAAACAATGAGACACCAGGGATTAGGTATCAGTACAATGTACTTCCACAAGGAGGATCACCAGCAATATT [...]
+	'KDR_pat266_199512'        ------------------------------------------------------------------------------------------------------NTTTGTACAGAAATGGAAAAGGAAGGRAAAATTTCAAAAATTGGGCCTGAAAATCCATAYAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGRTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTCTCAGTTCCCYTAGATGACTTCAGGAAATATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGRTCACCAGCAATATT [...]
+	'KDR_pat259_199607'        ------------------------------------------------------------------------------------------------------NTTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCAATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTRGGTGATGCATATTTTTCGGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'KDR_pat251_199605'        ------------------------------------------------------------------------------------------------------------ACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGATAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCYGCAGGGTTGAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTYTCAGTTCCCTTAGATGACTTCAGAAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGGTATCAGTACAATGTGCTTCCACAGGGAGGRTCACCAGCAATATT [...]
+	'KDR_pat256_199607'        ------------------------------------------------------------------------------------------------------NTTTGTACAGAAATGGAGAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGRGAACTYAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAGAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCYTTAGATGAMTTCAGGAAGTAYACTGCATTTACCATACCTAGCACAAACAATGAGACACCAGGGATTAGATATCAATACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'MDS_02AZ045_199901'       CCAATAAGTCCTATTGAAACTGTACCAGTAACAAAGCCAGGAATGGATGGCCCAAAGGTTAAACAATGGCCATTAACAGAAGAGAAAAAAGCATTAACAGACATTTGTAAGGAGATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGAAAGTATACTGCATTTACCATACCTAGTAGAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATTTT [...]
+	'MZ_03GEMZ023_200301'      CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGGCCAAGAGTTAAACAATGGCCATTGACAGAAGAAAAAAAGGCATTAGTAGAAATTTGTACTGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTCAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGGATACCACATCCTGCAGGGTTAAAAAAGAGAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATGAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'MZ_03GEMZ025_200301'      CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGGCCMAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCTTACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATACTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGACTAGGTATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'MZ_03GEMZ028_200301'      CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTCAAACARTGGCCATTGACAGAAGAAAAAAAAGCATTAATAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAACCCATACAATACTCCAGTATTTGCCATAAAGAAGAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACACCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGAAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'MZ_03GEMZ015_200301'      CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAATAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACACCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGAAAGTATACCGCATTTACCATACCNAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'MZ_03GEMZ010_200301'      CCCATTAGTCCTATTGACACTGTACCAGTAAAAAAGCCAGGAATGGATGGGCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTGGAAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGGGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATACTTTTCAGTTCCCTTAGACGAATTCAGGAAGTATACTGCATTCACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTACTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'MZ_03GEMZ013_200301'      CCTATAAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAACAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGGGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACACCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTMCTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGAAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGAGTTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'MZ_98GEMZ002_199801'      CCCATTAGTCCTATTGAAACTGCACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAGGCATTAGCAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAACACTCCAATATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATACTTTTCAGTTCCCTTAGATGACTTCAGAAAGTATACTGCATTTACCATACCTAGTGTAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'N02_200301'               ---------------------------------------------------------------------------------------------------GAAATTTGTACAGAAATGGAAAAGGAACGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAATATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGGAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGACTAGATATCAGTATAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'N03_200301'               ---------------------------------------------------------------------------------------------------GAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGACTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTCCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATAACTTCAGGAAGTAYACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGAATTAGATACCAGTACAATGTGCTTCCGCAGGGAGGATCACCAGCAATATT [...]
+	'N01_200301'               ---------------------------------------------------------------------------------------------------GAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAATATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGGAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGACTAGATATCAGTATAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'MZ_98GEMZ003_199801'      CCCATTAGTCCTATTGAAACTGTACCAGTAAAGAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAAAAGAAAAAGAAGCATTAATAGAAACTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACACCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGAAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'MZ_99GEMZ014_199901'      CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAATAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAACCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACACCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGAAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'MZ_03GEMZ005_200301'      CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGGCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAAWTTYCAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGGGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATACTTTTCAGTTCCCTTAGACGACTTCAGGAAGTATACTGCATTCACCATACCTAGTACAAACAATGAGACNCCAGGAATTAGATATCAGTACAATGTACTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'MYIDUA5_200401'           CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTAYAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATCGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTTAGAGAACTTAATAAAAGRACTCAAGACTTCTGGGAAGTCCAATTAGGAATACCACATCCCGCAGGGTTAAARAAGAAAAAATCAGTAACAGTCCTGGATGTGGGTGATGCATACTTCTCAGTTCCTTTAGATGARTTTAGAAAATATACTGCATTTACCATACCTAGTAYAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCGCCAGCAATATT [...]
+	'MYIDUA8_200401'           CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATCGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGACTTTAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTCCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTCCTGGATGTGGGTGATGCATACTTCTCAGTTCCTTTAGATGACTTTAGGAAGTATACTGCATTTACTATACCTAGTGTAAACAATGAGACACCAGGAATTAGATATCAGTACAATGTGCTTCCACAAGGAGGATCACCAGCAATATT [...]
+	'MYIDUC1_200401'           CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTGCARAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTTAGAGAGCTTAATAAAAGAACTCAAGACTTTTGGGAAGTCCAATTAGGAATACCACATCCAGCAGGGTTAAAAAAGAAAAAATCTGTAACAGTCCTGGATGTGGGTGATGCATATTTCTCAGTTCCTTTATATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTTTAAACAATGAGACACCAGGAATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'MYIDUA2_200401'           CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATAYAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTTAGAGAACTTAATAAAAGRACTCAAGACTTTTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTGAAAAAGAAAAAATCAGTAACAGTCCTGGATGTGGGTGATGCATATTTCTCAGTTCCTTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTTTAAACAATGAGACACCAGGGCTTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'MYIDUA12_200401'          CCYATTAGTCCTATTGACACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTGGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATCGGACCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTTAGAGAACTTAATAAAAGAACTCAAGACTTTTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTGAAAAAGAAAAAATCAGTAACAGTCCTGGATGTGGGTGATGCATATTTCTCAGTTCCTTTAGATGACTTYAGGAAGTAYACTGCATTTACCATACCTAGTGTAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'MYIDUA14_200401'          CCCATWAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAARTTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTTAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTCCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCTRTATCAGTYCTGGATGTGGGTGATGCATACTTCTCAGTTCCTTTAGATGACTTTAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCGCCAGCAATATT [...]
+	'MYIDUC10_200401'          CCCATTAGTCCTATTGATACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAGAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTATTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAGATTTCAAAAATAGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTTAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAGAAATCCGTAACAGTCCTGGATGTGGGTGATGCATATTTCTCAGTTCCTTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'MZ_03GEMZ001_200301'      CCCATTAGTCCTATTGAGACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAGGCATTAAYAGAAATTTGTACAGAAATGGAAAAGGAAGGTAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACACCCTGCAGGGTTGAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGAAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACRCCAGGGATGAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'MZ_03GEMZ004_200301'      CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTWCAAAAATTGGGCCTGAAAATCCATACAATACTCCAATATTTGCCATAAAGAAAAAAGACAGCAATAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCTCGGGATTAAAAAAGAAAAAATCAGTGACAGTACTGGATGTGGGTGATGCATACTTCTCAGTTCCCTTAGATGAATTCAGAAAGTATACTGCATTCACTATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTGCCACAGGGAGGATCACCAGCAATATT [...]
+	'MYIDUD8_200401'           CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCTTTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATCGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTTAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCTGTAACAGTCCTGGATGTGGGTGATGCATATTTCTCAGTTCCTTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCCAGTGTAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'MYIDUC5_200401'           CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGRAAAATTTCAAAAATTGGGCCTGAAAAYCCATACAATACTCCARTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGGAAATTAGTAGATTTTAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCCRTATCAGTCCTGGATGTGGGTGATGCATATTTCTCAGTTCCTTTAGATRACTTCAGGAAGTATACTGCATTTACCATACCTAGTGTAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTYCCACAGGGAGGATCACCAGCAATATT [...]
+	'MYIDUD5_200401'           CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATAGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTTAGAGAACTTAATAAAAGAACYCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTRAAAAAGAAAAAATCCGTGACAGTCCTGGATATAGGTGATGCATATTTCTCAGTTCCTTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTGTAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACARGGAGGATCACCAGCAATATT [...]
+	'N04_200301'               ---------------------------------------------------------------------------------------------------GAAATTTGTACAGAAATGGAAAAGGAGGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAACTAGTAGATTTTAGAGAACTGAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTGCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCCAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'N37_200301'               ---------------------------------------------------------------------------------------------------GAGATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATCGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAATATACTGCATTTACCATACCGAGTGTAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'N38_200301'               ---------------------------------------------------------------------------------------------------GAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAGAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTAGGTGATGCATATTTTTCAGTTCCTTTGGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTATAATGTGCTTCCCCAGGGAGGGTCACCAGCAATATT [...]
+	'N39_200301'               ---------------------------------------------------------------------------------------------------GAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGACTTCAGGGAACTTAATAAGAGGACTCAAGACTTCTGGGAAGTTCAATTAGGGATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATGATTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTATAATGTGCTCCCCCAGGGAGGATCACCAGCAATATT [...]
+	'N35_200301'               ---------------------------------------------------------------------------------------------------GAGATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAACCCATACAATACTCCAATATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTTTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTGAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAATTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTAGGAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTCCCACAGGGAGGATCACCAGCAATATT [...]
+	'N33_200301'               ---------------------------------------------------------------------------------------------------GAAATATGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCCGAAAATCCATACAATACTCCAGTATTCGCAATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGATCTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAACAGAAAAAATCAGTGACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCTTTAGATGAATTCAGGAAGTACACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGGTATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'N34_200301'               ---------------------------------------------------------------------------------------------------GAGATATGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAGTTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCTTTAGATGACTTCAGGAAGTATACTGCATTTACTATACCTAGTACGAACAATGAGACACCAGGTATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'N40_200301'               ---------------------------------------------------------------------------------------------------GAAATTTGTACAGAAATGGAAAAGGAAGGACAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTTAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTAGGTGATGCATATTTTTCAGTTCCCTTACATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATGAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'N46_200301'               ---------------------------------------------------------------------------------------------------GATATCTGCACAGAGATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGCTGAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATGACTTCAGAAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCGGGGATTAGATATCAATACAATGTGCTCCCACAGGGAGGATCACCAGCAATATT [...]
+	'N47_200301'               ---------------------------------------------------------------------------------------------------GAAATTTGTTCAGAAATGGAAAAGGAAGGAAAAATTGCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGACTTCAGAGAACTTAATAAGAGAACTCAAGATTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTAGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGAATTAGATACCAGTACAATGTGCTTCCTCAGGGAGGATCACCAGCAATATT [...]
+	'N44_200301'               ------------------------------------------------------------------------------------------------------ATTTGTACAGAAATGGAAAAGGAGGGNAAAATTTCAAAAATTGGGCCCGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTGAAGAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCATTAGATAGCTTCAGAAAGTATACTGCATTTACCATACCTAGTACTAACAATGAAACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'N41_200301'               ---------------------------------------------------------------------------------------------------GAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCCCATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGACGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTAGAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTGCCGCAGGGAGGATCACCAGCAATATT [...]
+	'N42_200301'               ---------------------------------------------------------------------------------------------------GAAATCTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCCTACAATACTCCAGTATTTGCCCTAAAGAAAAAAGACAGTACTAAATGGAGGAAATTAGTAGATTTCAGAGAGCTTAATAAAAGAACTCAAGACTTCTGGGAGGTTCAATTAGGAATACCACATCCTGCAGGTTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAATTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATGAGATATCAATACAATGTGCTGCCACAGGGAGGATCACCAGCAATATT [...]
+	'N32_200301'               ---------------------------------------------------------------------------------------------------GAAATCTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCCGAAAATCCATACAATACTCCAGTATTCGCAATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGATCTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAACAGAAAAAATCAGTGACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCTTTAGATGAATTCAGGAAGTACACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGGTATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'N09_200301'               ---------------------------------------------------------------------------------------------------GAGATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGAATTAGATATCAGTACAATGTGCTCCCACAGGGAGGATCACCAGCAATATT [...]
+	'N10_200301'               ---------------------------------------------------------------------------------------------------GAGATTTGTACAGAAATGGAGAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGGAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGATTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATAACTTCAGGAAGTATACTGCATTCACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'N08_200301'               ---------------------------------------------------------------------------------------------------GAAATTTGTACAGAAATGGAAAAGGAAGGAAAGATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAAAAGAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTTTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGCTAAAACAGAAAAAATCAGTAACAGTACTAGATGTGGGTGATGCATATTTTTCAGTTCCTTTAGATGAATTTAGGAAGTATACTGCATTCACCATACCTAGTACAAACAATGAGACACCAGGAATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'N06_200301'               ---------------------------------------------------------------------------------------------------GAGATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCTATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTGGATTTCAGAGAGCTTAATAAGAGAACTCAAGACTTTTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTATTAGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAAGGAGGATCACCAGCAATATT [...]
+	'N07_200301'               ---------------------------------------------------------------------------------------------------GAGATCTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTGTTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGGTATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'N25_200301'               ---------------------------------------------------------------------------------------------------GAGATAAGTACAGAAATGGAAAAAGAAGGGAAAATCTCAAGAATTGGGCCTGAAAATCCATACAATACTCCAATATTTGCCATAAAGAAAAAAGATGGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTCCAATTAGCGATACCACATCCCGCAGGATTAAAAAAGAAAAAATCAGTAACAGTACTAGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATGATTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGCGACACCAGGGATTAGATATCAGTACAATGTGCTRCCACAGGGAGGATCACCAGCAATATT [...]
+	'N30_200301'               ---------------------------------------------------------------------------------------------------GAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAACCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTCCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAATAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACAGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'N31_200301'               ---------------------------------------------------------------------------------------------------GAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGACTTTAGAGAACTTAATAAAAGAACTCAGGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAACAGAGAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAGTTCAGGAAGTATACTGCATTTACCATACCTAGCATAAATAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'N29_200301'               ---------------------------------------------------------------------------------------------------GAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAATATTTGCCATAAAGAAAAAAGACGGTACTAAATGGAGAAAATTAGTAGATTTTAGAGAACTTAATAAAAGAACTCAAGACTTTTGGGAAGTTCAATTAGGAATACCACATCCAGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTATTGGATGTGGGTGATGCATATTTTTCAGTGCCCTTACATGACTTCAGAAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'N27_200301'               ---------------------------------------------------------------------------------------------------GAGATATGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTAGAAATAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'N28_200301'               ---------------------------------------------------------------------------------------------TTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATAYAATACTCCAATATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAACTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTTTGGGAAGTTCAATTAGGAATACCACATCCAGCAGGGTTAAAAAAGAAAAGATCAGTAACAGTATTGGATGTGGGTGATGCATATTTTTCAGTGCCCTTACATGACTTCAGAAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'MYIDUA11_200401'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAGAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTTAGAGAACTTAATAAAAGAACTCAAGACTTTTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCTGTAACAGTCCTGGATGTGGGTGATGCATATTTCTCAGTTCCTTTAGATGACTTTAGGAAGTATACTGCATTTACCATACCTAGTGTAAACAATGAGACACCAGGGATAAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'MDS_02UANK062_200101'     CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAATAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTACCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACACCCTGCAGGGTTAAAAAAGAAAAAGTCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGAAAGTATACTGCATTTACCATACCTAGTATAAACAATGCGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'MDS_02UANK065_200101'     CCCATCAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAATAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACACCCKGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTAGATGTGGGTGATGCATAYTTTTCAGTTCCCTTRGATGACTTCAGAAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGRTATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'MDS_02UANK066_200101'     CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAATGGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCYATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACACCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGAAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAATACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'MDS_02UANK061_200101'     CCCATTAGTCCTATTGAGACTGTACCGGTAAAAAAGCCAGGAATGGATGGCCCAAAAATTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAATAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAATACTAAATGGAGAAAATTAGTAGATTTTAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACACCCTGCAGGGTTAAAAAAGAAAAAATCAATAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGAAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'MDS_02UANK011_200101'     CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAATAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAGATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACACCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGACTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'MDS_02UANK028_200101'     CCTATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAACAGAAATTTGTACAGAAATGGAGAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACACCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGAAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'MDS_02UANK069_200101'     CCTATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAATTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAATAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACACCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGAAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'MDS_02UANK078_200101'     CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAATAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACACCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGAAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATACCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'MDS_02UANK081_200101'     CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAATGGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACACCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGAAAGTATACTGCATTYACCATACCTAGTATAAACAATGAGACACCAGGGCTTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'MDS_02UANK076_200101'     CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAATAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAGAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACACCCTGCAGGATTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGAAAGTATACTGCATTTACCATACCTAGTACAAATAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'MDS_02UANK071_200101'     CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAACAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAGAGTTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACACCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGAAAATATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'MDS_02UANK075_200101'     CCTATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAATAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGATAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAACAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACACCCTGCAGGGTTAAAAAAGAAAAAATCAATAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCCGAAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'MDS_02UAKV186_200101'     CCCATTAGTCCTATTGATACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCACTAACAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCAATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGAAATACCACACCCTGCAGGGTTAAAAAAAAAA---TCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGAAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'MDS_02UAKV105_200101'     CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGGCCAAAAGTTAAACAATGGCCATTAACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAGAATTGGGCCTGACAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACCAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACCCAGGACTTCTGGGAAGTTCAATTAGGAATACCACATCCYGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATACTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'MDS_02UAKV108_200101'     CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGCAGAAAAAAAAGCATTAATAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGATAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACACCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGAAAGTATACTGCATTTACCATACCTAGTATAAATAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTCCCACAGGGAGGATCGCCAGCAATATT [...]
+	'MDS_02UAKV113_200101'     CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAACAGAAATCTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACACCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGAAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGRTTAGATATCAGTACAATGTGCTTCCGCAGGGAGGATCACCAGCAATATT [...]
+	'MDS_02UACR019_200101'     CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCTATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTCCAATTAGGAATACCACACCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGGGATGCATATTTTTCAGTTCCTTTAGATGACTTCAGAAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTCCCACAGGGAGGATCACCAGCAATATT [...]
+	'MDS_02AZ057_199901'       CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAACAGAAAAAATCGGTAACGGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCTTTAGATGACTTCAGAAAGTATACTGCATTTACAATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAATACAATGTGCTGCCACAGGGAGGATCACCAGCAATATT [...]
+	'MDS_02UACR012_200101'     CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCTATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTCCAATTAGGAATACCACCCCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGGGATGCATATTTTTCAGTTCCTTTAGATGACTTCAGAAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTCCCACAGGGAGGATCACCAGCAATATT [...]
+	'MDS_02UAKV123_200101'     CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAGCAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAACCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAGTGGAGAAAATTGGTAGATTTCAGAGAACTTAATAAGAAGACTCAAGACTTCTGGGAGGTTCAATTAGGAATACCACATCCCGCGGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGATTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'MDS_02UAKV177_200101'     CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGGCCAAAAGTTAAACAATGGCCACTGACAGAAGAAAAAAATGCATTAATAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAGATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAGTGGAGAAAATTAGTAGATTTCAGAGAACTCAATAAGAGAACTCAAGATTTCTGGGAAGTTCAATTAGGAATACCACATCCTTCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATACTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTAGAAACAATGAAACACCAGGGATTAGATATCAATACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'MDS_02UAKV181_200101'     CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAATGGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAATATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACACCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGAAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'MDS_02UAKV151_200101'     CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGGCCAAAAGTTAAACAATGGCCATTAACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAARGAAGGAAAAATTTCAAGAATTGGGCCTGACAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACCAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGGACCCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATACTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'MDS_02UAKV129_200101'     CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAATGGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACACCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGAYGACTTCAGAAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'MDS_02UAKV139_200101'     CCCATAAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTGCTGGATGTGGGTGATGCATATTTTTCAGTGCCATTACATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACGAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAAGGAGGATCACCAGCAATATT [...]
+	'MDS_02UANK087_200101'     CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAATAGAAATTTGTACAGAAATGGAAAAGGAGGGGAAACTTTCAAAAATTGGGCCTGAAAATCCGTACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTTTGGGAAGTTCAATTAGGAATACCACACCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGAAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'MYIDU27_200401'           ------------------------------------------------------AAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAGAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTTAGGGAACTGAATAAAAGAACTCAAGACTTTTGGGAGGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCCGTAACAGTCCTAGATGTGGGTGATGCATATTTCTCAGTCCCTTTAGATGACTTCAGAAAGTATACTGCATTTACCATACCTAATGTAAACAATGCGACACCAGGGATTAGATATCAGTACAATGTGCTGCCACAGGGGGGATCACCAGCAATATT [...]
+	'MYIDU29_200401'           ------------------------------------------------------AAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCCTTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATAGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTTAGAGAACTTAATAAAAGAACCCAAGACTTTTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCCGTGACAGTCCTGGATATAGGTGATGCATATTTTTCAGTTCCTTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTGTAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCCCAAGGAGGATCACCAGCAATATT [...]
+	'MYIDU30_200401'           ------------------------------------------------------AAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCTTTAGTAGAAATTTGCACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATCGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTTAGAGAACTTAATAAAAGAACTCAAGACTTTTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCTGTAACAGTCCTGGATGTGGGTGATGCATATTTCTCAGTTCCTTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCCAGTGTAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'MYIDU25_200401'           ------------------------------------------------------AGAGTTAAACAATGGCCATTAACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTGCAGAGATGGAAAAGGAAGGGAAAATTTCAAAAATAGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTTAGAGAACTTAATAAGAAAACTCAAGAATTTTGGGAAGTTCAATTAGGAATACCCCATCCCGCAGGGCTAAAAAAGAAAAAGTCCGTAACAGTCCTGGATGTGGGTGATGCATATTTCTCAGTTCCTTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'MYIDU18_200401'           ------------------------------------------------------AGAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCCTTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATAGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTTAGAGAACTTAATAAAAGAACTCAAGACTTTTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCCGTAACAGTCCTGGATGTGGGTGATGCATATTTCTCAGTTCCTTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTGTAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'MYIDU23_200401'           ------------------------------------------------------AAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGGAGGGAAAATTTCAAAAATCGGGCCTGAAAATCCATACAATACTCCAGTATTTGCTATAAAGAAAAAAGATAGTACTAAATGGAGAAAATTAGTAGATTTTAGAGAACTTAATAAAAGAACTCAAGACTTTTGGGAAGTCCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTCCTGGATGTGGGGGATGCATACTTCTCAGTTCCTTTAGATGAATTTAGGAAGTATACTGCATTTACCATACCCAGTGTAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCGCCAGCAATATT [...]
+	'MYIDU4_200401'            ------------------------------------------------------AAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATCAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTTAGAGAACTTAATAAAAGAACTCAAGACTTTTGGGAAGTCCAATTAGGAATACCACATCCCGCAGGGTTAAAACAGAAAAAATCTGTAACAGTCCTGGATGTGGGTGATGCATATTTCTCAGTTCCTTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'MYIDU9_200401'            ------------------------------------------------------AAGGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAGATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATCGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTTAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTCCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCTGTAACAGTCCTGGATGTGGGTGATGCATACTTCTCAGTTCCTTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTGTAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'MYIDUA10_200401'          CCCATTAGTCCTATTGACACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATCAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTTAGAGAACTTAATAAAAGAACTCAAGACTTTTGGGAAGTCCAATTAGGAATACCACATCCCGCAGGGTTAAARCAGAAAAAATCTGTAACAGTCCTGGATGTGGGTGATGCATATTTCTCAGTTCCTTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATYAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'MYIDU8_200401'            ------------------------------------------------------AAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTTAGAGAACTTAATAAAAGAACTCAAGACTTCTGTGAAGTCCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCTGTAACAGTCTTGGATGTGGGTGATGCATACTTCTCAGTTCCTTTAGATGACTTTAGGAAGTATACTGCATTTACCATACCTAGTGTGAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'MYIDU5_200401'            ------------------------------------------------------AAAGTTAAACAATGGCCATTGACAGAAGAAAAGAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTTAGAGAACTTAATAAAAGAACTCAGGACTTTTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCTGTAACAGTTCTGGATGTGGGTGATGCATATTTCTCAGTTCCTTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTGTAAACAATGAGACACCAGGGATTAGATATCAATACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'MYIDU7_200401'            ------------------------------------------------------AAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTTAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTCCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCTGTATCAGTTCTGGATGTGGGTGATGCATACTTCTCAGTTCCTTTAGATGACTTTAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCGGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCGCCAGCAATATT [...]
+	'MYIDU17_200401'           ------------------------------------------------------AAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGGAAATTAGTAGATTTTAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTCCTGGATGTGGGTGATGCATATTTCTCAGTTCCTTTAGATAACTTCAGGAAGTATACTGCATTTACCATACCTAGTGTAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'MDS_02UANK096_200101'     CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAACAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCTATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACACCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGAAAGTATACTGCATTTACTATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCATCAATATT [...]
+	'MDS_02UANK097_200101'     CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAACAGAAATTTGTACAGAAATGGAAAAGGRAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACACCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGAAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'MDS_02UANK093_200101'     CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAATAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACGGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACACCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGAAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'MDS_02UANK090_200101'     CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGGATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAATAGAAATTTGTACAGATATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTCCAATTAGGAATACCACACCCTGCAGGGTTAAGAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGAAAGTATACTGCATTCACCATACCTAGTATAAACAATGAGACACCAGGGACAAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'MDS_02UANK091_200101'     CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAATAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACACCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGAAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAAGGAGGATCACCAGCAATATT [...]
+	'MDS_02UANK098_200101'     CCCATTAGTCCTATTGAAACTGTACCAGTAAGAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAATAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGATGGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACACCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGAAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'MNR_FO_199408'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCACTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAACCCATACAATACTCCAGTATTTGCAATAAAGAAAAAAGACAGTACTAAATGGAGTAAATTAGTGGATCTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGTAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGAGATGCATATTATTCAATTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACMATACCTAGCACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCAATGGGAGGGTCMCCAGCAATATT [...]
+	'MYIDU13_200401'           ------------------------------------------------------AAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTGCAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTTAGAGAACTTAATAAAAGAACTCAAGACTTTTGGGAAGTCCAATTAGGAATACCACATCCAGCAGGGTTAAAAAAGAAAAAATCTGTAACAGTCCTGGATGTGGGTGATGCATATTTCTCAGTTCCTTTATATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTTTAAACAATGAGACACCAGGAATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'MDS_02UANK104_200101'     CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACMGAAGAAAAAAAAGCATTAATAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACACCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCTTATTTTTCAGTTCCCTTAGATGACTTCAGAAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'MDS_02UANK099_200101'     CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAATAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACACCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTYCCCTTAGATGACTTCAGAAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAATACAATGTGCTCCCGCAGGGAGGATCACCAGCAATATT [...]
+	'MDS_02UANK101_200101'     CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAACAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACACCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGAAAGTATACTGCATTCACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'KDR_pat179_199603'        ------------------------------------------------------------------------------------------------------NTTTGTACAGAGATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCYGAAAATCCATACAATACWCCARTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAARACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCYGCAGGGTTAAAAAAGAAAAAGTCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCCTTTACCATACCTAGTATAAATAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTYCCACAGGGAGGATCACCAGCAATATT [...]
+	'HG052_199901'             ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAGGAAGGAAWNATTTCAAKAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCYATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTKAATAAAAGAACYCAAKACTTYTGGGAAGTYCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTAGATGTGGKTGATGCATWTTTCTCAGTTCCCTTAGATAATTTCAGGAAGTATACTGCATTCACCATACCTAGTGTAAACAATGAGACACCAGGGRTTAGATATATGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'HG053_199901'             ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTRAAAAAGAAAAAATCAGTAACAGTAYTGGATGTGGGTGATGCATATTTTTCARTTCCCTTAGAYGAMTTCAGGAAGTAYACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGGTATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'HG054_199901'             ------------------------------------------------------------------------------------------------------------ACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAACCCATAYAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGAYTTYTGGGAAGTTCAATTAGGAATACCACATCCAKCAGGGTTAAAAAAGAAAAAATCAGTAACAGTMCTGGATGTGGGTGATGCATACTTTTCAGTTCCCTTAGATGAYTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGAATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCGCCAGCAATATT [...]
+	'HG050_199901'             ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAGGAAGGGAAAATTACAARAATTGGGCCTGARAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACYCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATAACTTCAGGAAGTAYACTGCATTYACCATACCTAGTATAAACAAYGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'HG048_199901'             ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCWRTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGRAAGTTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACAYCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTGCTRGATGTGGGTGATGCATATTTYTCAGTTCCCTTAGATGACTTCAGAAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATYAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'HG049_199901'             ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAGGAAGGRAAAATYTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTGTTTGCCATAAAGAAAAAAGACAGCACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGARAACTCAAGACTTCTGGGAAGTYCAATTAGGAATACCCCATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTRGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAHTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGAATTAGATATCAGTACAATGTGCTYCCACAGGGGGGATCACCAGCAATATT [...]
+	'HG055_199901'             ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGATTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAGAAGAAAAAATCAGTAACAGTACTGGATGTGGGTNATGCATATTTCTCAGTTCCTTTAGATGAGTTCAGAAAATATACTGCATTTACCATACCCAGTGTAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCGCCAGCAATATT [...]
+	'HG059_199901'             ---------------------------------------------------------------------------------------------------------TGCACAGAAATGGAAAAGGAAGGAAAGATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAAAAGAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTCAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGATTTCAGGAAGTATACTGCATTTACCATACCTAGTAKAAACAATGAGACACCAGGGGTTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'HG060_199901'             ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAGGAAGGGAAAATTTCGAAAATTGGGCCTGAAAATCCATACAATACTCCAATATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAGGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAACAGATCAGTAACAGTACTAGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATAGCTTCAGGAAGTATACTGCATTCACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAACGTGCTCCCACAGGGAGGATCACCAGCAATATT [...]
+	'HG058_199901'             ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAGGAAGGGAAAATTTCRAAAATTGGGCCTGAAAATCCATAYAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTTTGGGAAGTTCAATTAGGAATACCACATCCCTCRGGATTAAGAAAGAAAAAATCAGTAACAGTACTRGATGTGGGTGATGCATACTTTTCAGTTCCCTTAGATGACTTCAGGAAGTACACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'HG056_199901'             ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCTGTATTTGCCATAAAGAAAAAAGACAGTACTAAGTGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTTTGGGAAGTTCAATTAGGAATACCACATCCAGCAGGATTAAAGAAGAAAAAATCAGTAACAGTACTAGATGTGGGTGATGCATATTTTTCAGTTCCTTTAGATGACTTTAGAAAGTATACTGCATTTACCATACCTAGCATAAACAATGAGACACCAGGAATTAGATATCAGTACAATGTGCTTCCACAGGGGGGATCACCTGCAATATT [...]
+	'HG057_199901'             ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCTATAAAGAARAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGARGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACYATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAAGGAGGRTCACCAGCAATATT [...]
+	'HG047_199901'             ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCTATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTGCAATTAGGGATACCACATCCCTCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGACGACTTTAGAAAGTATACTGCATTTACCATACCTAGTGTAAACAATGAGACACCAGGAATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCGATATT [...]
+	'HG034_199901'             ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTAATAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACACCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAATACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTACATGATTTCAGGAAGTATACTGCATTCACCATACCTAGTATAAACAATGAGACACCAGGGGTTAGATATCAGTACAATGTGCTTCCACAAGGAGGATCACCAGCAATATT [...]
+	'HG035_199901'             ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCKATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCMTTAGATGACTTYAGGAAGTATACTGCATTTACAATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAAGGAGGATCACCAGCAATATT [...]
+	'HG036_199901'             ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCTGTATTTGCCATAAAGAAAAAAGACAGTACTAAGTGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTTTGGGAAGTTCAATTAGGAATACCACATCCAGCAGGGTTAAAAAAGAAAAAATCAGTRACAGTACTAGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTTAGGAAGTATACYGCATTTACCATACCTAGYATAAACAATGAGACACCAGGAATTAGATATCAGTACAATGTGCTKCCACAGGGGGGATCACCTGCAATATT [...]
+	'HG033_199901'             ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAGGAAGGRAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAARAGAACTCAAGACTTYTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGAYTAAAAAAGAAAARATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATRRTTTCAGGAAATATACTGCATTYACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTGCCACAGGGAGGATCACCTGCAATATT [...]
+	'HG031_199901'             ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAACTAGTGGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTTTGGGAAGTTCAATTAGGAATACCACATCCCTCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTCTCAGTTCCATTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAATAATGAGACACCAGGGATTAGATATCAGTATAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'HG032_199901'             ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTYAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGGATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTATTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACTATACCTAGTATAAACAATGAGACACCAGGAATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'HG037_199901'             ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGACAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGATAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTGCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTAGATGTGGGTGATGCATATTTTTCAGTTCCYYTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'HG045_199901'             ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATAGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGATGGTACTAAATGGAGAAAATTAGTAGAYTTCAGAGAACTTAATAAGAGAACTCAAGACTTYTGGGAGGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAARRAAAAAATCAGTKACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTKCCGCAGGGAGGATCACCAGCAATATT [...]
+	'HG046_199901'             ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAGGAAGGAAAAATTTCAARAATTGGGCCTGAAAATCCATACAATACTCCAGTRTTTGCYATAAAGAAAAARGACAGTACYAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCYTCAGGGTTAAAAAAGAAAAAATCAGTAACAGTATTGGATGTGGGTGATGCATATTTTTCAGTTCCYTTAGACGATTTCAGGAAGTACACTGCATTTACCATACCTAGCATAAACAATGAGACACCAGGAATTAGATATCAGTACAATGTACTTCCACAGGGAGGATCRCCATCAGTATT [...]
+	'HG043_199901'             ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAGGAAGGRAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAARGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGGGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATWCCACAYCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAWTGAGACACCAGGGATTAGATATCAGTACAATGTRCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'HG038_199901'             ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTYCAATTAGGAATACCACATCCCGCAGGGTTAAAGAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCATTAGATGACTTCAGGAAGTATACTGCATTCACCATACCTAGTATAAACAATGAGACACCAGGGGTTAGATATCAGTACAATGTGCTTCCACAAGGAGGATCACCAGCAATATT [...]
+	'HG041_199901'             ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCYGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTAYTGGATGTGGGWGATGCATATTTTTCAGTTCCYTTAGATGACTTCAGGAAGTAYACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATCAGATATCAGTAYAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'HG061_199901'             ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCCTACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTTAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACAYCCYGCAGGTTTARAAMAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAWTGAGACACCAGGGATTAGRTATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'HG079_199901'             ---------------------------------------------------------------------------------------------------------TGTACAGARATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCWTACAATACCCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGTTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGAATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCGCCATCAATATT [...]
+	'HG080_199901'             ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACCCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTWAATAAGAGAACTCARGACTTCTGGGAAGTTCAATTAGGAATACCACATCCYGCAGGTTTAAAAAAGAAAAAATCAGTAACAGTACTRGATGTGGGTGATGCATATTTYTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGAATTAGATATCAGTACAATGTGCTKCCACAGGGAGGATCGCCAGCAATATT [...]
+	'HG081_199901'             ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAAYCCATACAATACTCCAGTATTTGCCATAARGAAAAARGACAGTACTAARTGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTATGTGAATTCAGGAAGTATACTGCATTTACCATCCCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'HG078_199901'             ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAARGACAGTACTAAATGGAGAAAATTAGTAGAYTTCAGAGAACTTAATAAGAAAACTCAAGAYTTYTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTAYTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTAYACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGRTATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'HG076_199901'             ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTAMTAAATGGAGAAARTTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCARTAACAGTWTTGGATGTGGGTGATGCATAYTTYTCAGTTCCCTTAGATGACTTYAGGAAGTACACTGCATTTACCATACCTAGTGTAAACAATGAGACACCAGGAATYAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'HG077_199901'             ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAAGATGGAAAAATTTCAAAAATTGGGCCTGAAAAYCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGGGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAACTAGGAATACCACAYCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACTATACCTAGTATAAACAATGAAACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'HG082_199901'             ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAGGAAGGAAAGATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACCAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAARAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCATTAGATGAMTTCAGGAAGTATACTGCATTCACCATACCTAGTATAAACAATGAGACACCAGGAGTTAGATATCAGTACAATGTGCTTCCACAAGGAGGATCACCAGCAATATT [...]
+	'HG086_199901'             ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAGGAAGGGAAAATYTCAAAAATCGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTYAGAGAACTKAATAAGAAAACTCAAGAYTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAARAAATCAGTAACAGTACTGGATGTRGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGRATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'HG087_199901'             ---------------------------------------------------------------------------------------------------------TGTACAGAACTGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAGAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAAGTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTCCAGTTAGGAATACCACATCCCGCAGGGTTAAAGAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATGACTTCAGGAAGTATACWGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATACCAGTACAATGTGCTGCCACAGGGAGGATCACCAGCAATATT [...]
+	'HG085_199901'             ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAARTTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAARTCAGTAACAGTACTGGATGTGGGTGATGCATATTTYTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACCCCAGGGATTAGATATCAGTACAATGTRCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'HG083_199901'             ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACGGCACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTGGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAATATACTGCATTTACCATACCTAGCATAAACAATGCAACACCAGGGATTAGATATCAGTACAATGTGCTCCCACAGGGAGGATCCCCAGCAATATT [...]
+	'HG084_199901'             ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGACCTGATAATCCATACAATACTCCAGTATTTGCCATAARRAAGAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGGACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTAGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTAYAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'HG075_199901'             ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAACAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTGCTAAGTGGAGAAAATTAGTAGATTTTAGAGAACTCAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAGTCAGTAACAGTACTAGATGTGGGTGATGCATACTTTTCAATTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTATAATGTGCTTCCACAAGGAGGATCACCAGCAATATT [...]
+	'HG066_199901'             ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGACTTYTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGATTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCYTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTRTAAACAATGAGACCCCAGGGATTAGATATCAGTACAATGTRCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'HG067_199901'             ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACGCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTYAATAAGMGAACTCAAGACTTTTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAMTTYAGGAAGTACACTGCATTTACCATACCTAGTGTAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'HG068_199901'             ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAACCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAGTTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAGTCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTACCCCTAGATGATTTCAGGAAATACACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGACTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'HG065_199901'             ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAATATTTGCTATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTCCAATTAGGAATACCACATCCAGCAGGGTTAAAAAAGAAAAAGTCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTGGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTGTAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'HG062_199901'             ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAGGAAGGAAAAATCTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCTATAAAGAAAAAAGACAGTACTAAATGGAGRAAGTTAGTAGATTTCAGAGAACTTAATAARAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACAYCCYGCAGGGTTAAAAAAGARAAAGTCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGAYGAHTTCAGGAAGTATACTGCATTTACTATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAAYGTGCTYCCACAAGGAGGATCACCAGCAATATT [...]
+	'HG063_199901'             ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAACCCATACAATACTCCAGTATTTGCAATAARGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAAYAAGAGAACTCAAGACTTCTGGGAAGTYCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTAYACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTAYAATGTGCTTCCACAAGGAGGATCACCAGCTATATT [...]
+	'HG069_199901'             ---------------------------------------------------------------------------------------------------------TGCACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGARCTAAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCTTTACATGACTTCAGGAAGTATACAGCATTTACCATACCTAGTATAAACAATGAGACACCAGGAGTTAGATACCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'HG073_199901'             ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGGGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAACTAGGAATACCACACCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTRTAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTACTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'HG074_199901'             ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAGAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTTCTAAATGGAGAAAATTAGTAGATTTCAGAGAGCTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAGTTAGGAATACCACATCCAGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTCTCAGTTCCYTTAGAYGACTTCAGGAAGTATACTGCATTTACMATACCTAGTATAAACAATGAGACACCAGGRGTTAGATATCAGTACAATGTGCTTCCACARGGAGGATCACCAGCAATATT [...]
+	'HG072_199901'             ---------------------------------------------------------------------------------------------------------TGTACAGAMATGGAAAAGGAAGGAAAAATTTCAARAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTYCAATTAGGRATACCACAYCCAGCAGGGTTAAARAAGAAAAAATCAGTAACAGTACTRGATGTGGGTGATGCATATTTTTCAGTTCCATTAGATGACTTCAGGAAGTAYACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGAATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCGCCAGCAATATT [...]
+	'HG070_199901'             ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAGGAAGGRAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTTTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGAYGTGGGTGATGCATATTTYTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'HG071_199901'             ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTAGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATGACTTCAGRAAGTATACTGCATTTACCATACCTAGTATAAAYAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTGCCACAGGGAGGATCACCAGCAATATT [...]
+	'HG019_199901'             ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAARGACAGTACTAAATGGAGAAAATTAGTAGATTTYAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACACCCAGCAGGGTTAAARAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATAYTTTTCAGTTCCTTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAACGAGACACCAGGGATTAGGTATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'GRSPR55D_200301'          ------------------------------------------------------------------------------------------------------------------ATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGRATACCACATCCTGCAGGGTTAAAGAAGAAAAAATCAGTAACAGTACTRGATGTGGGTGATGCATATTTTTCAGTTCCCTTRGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'GRSPR5D_200301'           ------------------------------------------------------------------------------------------------------------ACAGAAATGGGAGAGGAAGGGAAAATTTCAAAGATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACARTACTGGATGTRGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTYAGAAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAAYGTGCTGCCACAGGGAGGATCACCAGCAATATT [...]
+	'GRSPR67_200301'           ------------------------------------------------------------------------------------------------------------ACAGAAATGGAAAAGGAAGGGAAAATTTCCAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCTATAAAGAAAAAAGACAGTACCAAATGGAGAAAATTAGTAGATTTTAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTGGGAATACCACATCCCTCAGGGTTAAAAAAGAAAAAATCAGTAACAGTATTGGATGTGGGTGATGCATATTTTTCAGTCCCCTTAGATAGCTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGAATTAGATATCAGTACAATGTGCTTCCGCAGGGAGGGTCACCAGCAATATT [...]
+	'GRSPR55_200301'           ------------------------------------------------------------------------------------------------------------------ATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGGATACCACATCCTGCAGGGTTAAAGAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'GRSPR50_200301'           ------------------------------------------------------------------------------------------------------------ACAGAAATGGAGAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTACAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTAAAAACAATGAGACACCAGGGMTTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'GRSPR51_200301'           ------------------------------------------------------------------------------------------------------------------ATGGGAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAATATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGGGAACTTAATAAGAGAACTCAAGACTTTTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTGAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTGGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGCACAAACAATGAGACACCAGGGATTAGATATCAGTATAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'GRSPR7_200301'            ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAGGAAGGACAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAACTAGTAGACTTTAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTGCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACTGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGATTTCAGAAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGGCACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCGCCAGCAATATT [...]
+	'GRSPR77_200301'           ------------------------------------------------------------------------------------------------------------ACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCARTATTTGCCATAAAGAAAAAAGACAGTAMTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTTTGGGAAGTTCAATTAGGAATACCACATCCCGCGGGATTAAAAAAGAAAAAATCAGTAACAGTACTAGATGTGGGTGATGCATATTTTTCAATTCCCTTAKATGACTTTAGAAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATATGTACAATGTGCTGCCACAGGGAGGATCACCAGCAATATT [...]
+	'GRSPR79_200301'           ------------------------------------------------------------------------------------------------------------------ATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGATAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGATTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTGAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGCGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAAACACCAGGGATTAGATATCAGTACAATGTGCTCCCACAGGGAGGATCACCAGCAATATT [...]
+	'GRSPR76_200301'           ------------------------------------------------------------------------------------------------------------------ATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAATATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAGTTAGTAGATTTTAGAGAACTTAATAAGAGAACTAAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAGTCAGTAACAGTACTGGATGTGGGTGATGCATATWTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAATAATGAGACACCAGGGGTTAGATATCAGTACAATGTACTTCCACAAGGAGGATCACCAGCAATATT [...]
+	'GRSPR72_200301'           ------------------------------------------------------------------------------------------------------------ACAAGAATGGAGAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGATTTTTGGGAAGTTCAGTTAGGAATACCACACCCCGCRGGGTTAAAGAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATACTTTTCAGTTCCCYTAGATGACTTCAGAAAGTATACTGCATTTACCATACCTAGTATAAAYAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTCCCACAGGGAGGATCACCAGCAATATT [...]
+	'GRSPR74_200301'           ------------------------------------------------------------------------------------------------------------ACAGAAATGGAAAAAGAAGGAAAATTTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCAATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTTCAGGGTTAAAACAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAGTTCAGGAAGTATACTGCATTTACYATACCTAGCAGAAACAATGAGATACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'GRSPR5_200301'            ------------------------------------------------------------------------------------------------------------ACAGAAATGGAAAAGGAAGGGAAAATTTCAAGAATTGGGCCTGAAAATCCATACAATACTCCAATATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCCCATCCTGCAGGGTTAAAAAAGAAAAAATCGGTAACAATACTGGATGTRGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTTAGAAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTGCCACAGGGAGGATCACCAGCAATATT [...]
+	'GRSPR35_200301'           ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTCAATAAGAGAACTCAAGACTTTTGGGAAGTTCAACTAGGAATACCACATCCAGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGACGCATATTTTTCAGTTCCCTTAGACGACTTCAGGAAATATACTGCATTTACCATACCTAGTACAAACAATGAAACACCAGGGATTAGATATCAGTACAATGTGCTCCCACAGGGAGGATCACCAGCAATATT [...]
+	'GRSPR36_200301'           ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTCAATAAGAGAACTCAAGACTTTTGGGAAGTTCAACTAGGAATACCACATCCAGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGACGCATATTTTTCAGTTCCCTTAGACGACTTCAGGAAATATACTGCATTTACCATACCTAGTACAAACAATGAAACACCAGGGATTAGATATCAGTACAATGTGCTCCCACAGGGAGGATCACCAGCAATATT [...]
+	'GRSPR37_200301'           ------------------------------------------------------------------------------------------------------------ACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTGGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGATTTCTGGGAAATTCAATTAGGAATACCACATCCCGCAGGGTTAAAGAAGAAAAAAGCAGTAACAGTCTTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTTAGAAAGTATACTGCCTTTACCATACCTAGTACAAACAATGAAACACCTGTAATTAGATATCAATACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'GRSPR34_200301'           ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGGAAACTAGTAGACTTTAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTGCAATTAGGAATACCACATCCCGCAGGGTTAAGAAAGAAAAAATCAGTAACTGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGATTTCAGAAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCGCCAGCAATATT [...]
+	'GRSPR30_200301'           ---------------------------------------------------------------------------------------------------------TGTAMMRRAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTTAGAGAACTTAATAAGAGAACTCAGGACTTCTGTGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTGACAGTACTGGATGTGGGTGATGCATAYTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATCAGATATCAGTACAATGTGCTGCCACAGGGAGGATCACCAGCAATATT [...]
+	'GRSPR33_200301'           ------------------------------------------------------------------------------------------------------------------ATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAWTTAGTAGACTTCAGAGAACTTAATAAGARAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTAATGCATATTTTTCAGTTCCTTTAGATGACTTYAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGATTTAGATATCAGTACAATGTGCTTCCACAGGGAGGGTCACCAGCAATATT [...]
+	'GRSPR38_200301'           ------------------------------------------------------------------------------------------------------------ACAGAAATGGAGAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAGTGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGAYTTCTGGGAAGTTCAATTAGGRATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTGCTGGATGTGGGTGATGCATATTTTTCAGTTCCTTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTGGTGTAAACAATGCGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATCTT [...]
+	'GRSPR45_200301'           ---------------------------------------------------------------------------------------------------------TGTAAARMAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAGCTTAATAAGAGAACTCAAGATTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAGAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTACACTGCATTTACCATACCTAGTATGAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'GRSPR49_200301'           ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAAGGAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTTAGAGAGCTTAATAAGAGAACTCAAGATTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAGAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTYAGGAAGTACACTGCATTTACCATACCTAGTATGAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'GRSPR42_200301'           ---------------------------------------------------------------------------------------------------------TGTGCAGAAATGGAGAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAARTTRGTTGATTTCAGAGAACTTAATAAAAGAACTCAAGATTTCTGGGAGGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGATTTCAGGAAGTACACTGCATTTACCATACCTAGTACAAACAATGAGAAACCAGGGACTAGATATCAGTACAATGTGCTTCCACAGGGAGGGTCACCAGCAATATT [...]
+	'GRSPR40_200301'           ---------------------------------------------------------------------------------------------------------------GAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAACCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTCCAATTAGGAATACCACATCCTGCAGGGTTAAAACAGAGAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATAAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'GRSPR41_200301'           ---------------------------------------------------------------------------------------------------------TGTAAAGCAATGGAAAAGGAGGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGKGAAGTTCAATTAGGAATACCACATCCYGCAGNGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATGACTTCAGGAAGTAYACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'GRSPR81_200301'           ------------------------------------------------------------------------------------------------------------ACAGAAATGGAAAAGGAAGGGAAATTTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTCTTTGCCATAAAGAAGAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAGTCAGTAACAGTGCTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTYAGAAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGACTAGATATCAATAYAATGTACTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'HG007_199901'             ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAACTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAGTTCAGGAAGTATACTGCATTTACCATACCTAGTGTAAACAATGAGACACCAGGGATKAGATATCAGTATAATGTTCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'HG009_199901'             ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCTGTATTTGCCATAAAGAAAAAAGACAGTACTAAGTGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTTTGGGAAGTTCAATTAGGAATACCACATCCAGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTAGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTTAGGAAGTATACTGCATTTACCATACCTAGCATAAACAATGAGACACCAGGAATYAGATATCAGTACAATGTGCTTCCACAGGGGGGATCACCTGCAATATT [...]
+	'HG010_199901'             ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTCGCCATAAGGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGATTAAAAAAGAAAAAATCAGTAACAGTCCTGGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATGACTTTAGGAAATATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGAATTAGATACCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'HG005_199901'             ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCTGTATTTGCCATAAAGAAAAAAGACAGTACTAAGTGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTTTGGGAAGTTCAATTAGGAATACCACATCCAGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTAGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTTAGGAAGTATACTGCATTTACCATACCTAGCATAAACAATGAGACACCAGGAATTAGATATCAGTACAATGTGCTTCCACAGGGGGGATCACCTGCRATATT [...]
+	'HG003_199901'             ---------------------------------------------------------------------------------------------------------TGCACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGACCTGAAAATCCATACAATACTCCAGTATTTGCYATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTTAGGAAGTACACTGCATTTACCATACCTAGYATAAACAATGAAACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'HG004_199901'             ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAAGAGGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCTATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAGCTTAATAAAAGAACTCAAGAATTCTGGGAGGTTCAATTAGGAATACCACATCCAGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTCTCAGTTCCCTTGGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAATAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'HG011_199901'             ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCARTATTTGCTATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATAACTTCAGGAAGTATACTGCATTTACTATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAAGGAGGATCACCAGCAATATT [...]
+	'HG016_199901'             ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAGAAGGAAGGRAAAATTTCAAAAATTGGACCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGATTTCTGGGAAGTTCAGTTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAAACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'HG018_199901'             ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTAMTAAATGGAGAAAATTAGTAGATTTCAGAGAACTRAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGGATACCACAYCCCGCAGGGTTAAAAAAGAARAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTYACCATACCYAGTACAAACAATGAGACACCAGGGRTTAGATATCAATACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'HG015_199901'             ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTAATAAATGGAGAAAATTAGTAGATTTCAGAGAACTGAATAAGAGAACTCAAGACTTCTGGGAAGTTCAGTTAGGAATACCACATCCCGCAGGGTTAAAAMAGAAAAAATCAGTAACAGTACTGGATGTAGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTRTAAACAATGAGACACCAGGAATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'HG012_199901'             ---------------------------------------------------------------------------------------------------------TGTACAGAATTGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAGGTTCAATTAGGAATACCACATCCCGCAGGTCTAAAAAAGAAAAAAGCAATAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGACGACTTCAGGAAGTATACTGCATTTACCATACCYAGTATAAATAATGAAACACCAGGGATTAGGTATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'HG013_199901'             ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAGGAAGGAAAAATTACAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTGTTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGARTTAAATAAAAGAACTCAAGAYTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGCTAAARAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTYCCCTTAGATGACTTTAGAAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGGTATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'HG002_199901'             ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAAYCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGATGGTACTAARTGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCMCATCCCGCAGGGTTAAAAAAGAAAAARTCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTACATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAKCAATATT [...]
+	'GRSPR9_200301'            ------------------------------------------------------------------------------------------------------------ACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTCCAGTTAGGAATACCACATCCTGCAGGGTTAAARAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACTATACCTAGTATAAACAATGAGACACCAGGGATTAGGTATCAGTACAATGTACTCCCACAGGGAGGATCACCAGCAATATT [...]
+	'GRSPR90_200301'           ------------------------------------------------------------------------------------------------------------ACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCCGAAAACCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAACTAGTAGATTTTAGAGAACTTAATAAAAGAACTCAAGACTTTTGGGAAGTTCAATTAGGAATACCACATCCYGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACYATACCCAGTTTAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTGCCACAAGGAGGATCACCAGCAATATT [...]
+	'GRSPR86_200301'           ------------------------------------------------------------------------------------------------------------ACAGAAATGGAAAAGGAAGGGAAATTTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCARTATTTGCYATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTTTGGGAAGTTCARTTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAGAAATCAGTAACAGTACTGGATGTGGGTGATGCATACTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGGTCACCAGCAATATT [...]
+	'GRSPR82_200301'           ------------------------------------------------------------------------------------------------------------ACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAATATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAGGACTTCTGGGAGGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAATAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCCTATATGACTTCAGAAAGTATACTGCATTTACCATACCTAGTACAAACAATGCGACACCAGGAATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'GRSPR84_200301'           ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAARTGGAGAAAATTAGTAGATTTCAGAGARCTGAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGGATACCACATCCCGCAGGGTTAAAACAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTCCCCTTAGATGAATTYAGAAAGTATACTGCATTTACCATACCTAGTATAAAYAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'GRSPR96_200301'           ---------------------------------------------------------------------------------------------------------------GAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAATATTTGCCATAAAGAAAAAAGACAGCACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTTTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAGAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCCTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACGAACAATGAGACACCAGGTGTTAGATATCAGTACAATGTGCTTCCACAAGGAGGATCACCAGCAATATT [...]
+	'HE_199201'                ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACACCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'HG001_199901'             ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTGTTTGCCATAAAGAAAAAGGACAGCACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCYGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTAGATGTGGGTGATGCATATTTTTCAGTTCCMTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'HAVANA178696_199904'      CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAGAAAGCATTAGTAGAAATTTGTGCAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCTATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGATTTCTGGGAAATTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAACAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAATAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTGCCACAGGGAGGATCACCAGCGATATT [...]
+	'GRSPR98_200301'           ---------------------------------------------------------------------------------------------------------------GAAATGGAAAAGGAAGGAAAAATTACAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAARGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAATACCMTTAGATGAATTCAGGAAATATACTGCATTTACCATACCCAGTACAAACAATGCGGCACCAGGGACTAGATATCAGTACAATGTACTTCCACAAGGAGGRTCACCAGCAATATT [...]
+	'GRSPR99_200301'           ---------------------------------------------------------------------------------------------------------------GAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAGTCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTACTCCCACAGGGAGGATCACCAGCAATATT [...]
+	'HG088_199901'             ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAGATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAARGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGGGAACTTAATAAGAGAACTCAAGATTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGWGATGCATATTTTTCAGTTCCCTTGTATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAAACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'KDR_pat107_199602'        ------------------------------------------------------------------------------------------------------NTTTGTACAGAAATGGAAAAGGAAGGAAAGATTACAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCKATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGARCTTAATAAGAGAACTCAAGACTTCTGGGAAGTCCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTACATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCGGCAATATT [...]
+	'KDR_pat108_199603'        ------------------------------------------------------------------------------------------------------NTTTGYACAGAGATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGATAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTAYTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAAACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'KDR_pat109_199603'        ------------------------------------------------------------------------------------------------------NTTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAAYCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAGCTTAATAAGAAAACTCAAGACTTCTGGGAAGTYCAATTAGGAATACCACATCCYGCAGGGTTAAAAAAGAAAARATCAGTAACAGTACTRGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGAYGACTTCAGGAAGTATACTGCATTTACCATACCTAGYATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'KDR_pat100_199605'        ------------------------------------------------------------------------------------------------------NTTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCTATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTWCAGTTAGGAATACCACATCCYGCAGGGTTAAAAAAGAAAAARTCAGTAACAGTACTGGATGTGGGGGATGCATATTTTTCAGTTCCCTTAGATGAGTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTACTTCCACAGGGAGGATCRCCAGCAATATT [...]
+	'JF_133_200501'            ---------------------------------AAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTGGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGARCTTAATAAGAGAACTCAAGATTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAARTCAGTRACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGATTTTAGGAAATATACTGCATTTACCATACCRAGTATAAAYAATGAGACACCAGGGGTTAGATATCAGTAYAATGTGCTTCCACAAGGAGGATCACCATCAATATT [...]
+	'KDR_pat10_199603'         ------------------------------------------------------------------------------------------------------NTCTGTACAGAAATGGAAAAGGAAGGGANAATTTCAAAAATTGGGCCTNAAAATCCATATAATACTCCAATATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGCGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAAGGAGGATCACCAGCAATATT [...]
+	'KDR_pat113_199604'        ------------------------------------------------------------------------------------------------------NTTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAATATTTGCCATAAAGAAGAAAAATAGTAATARATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAGAAAATCAGTAACAGTACTGGATGTGGGAGATGCATATTTCTCAGTACCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'KDR_pat118_199602'        ------------------------------------------------------------------------------------------------------NTTTGTACAGAAATGGAAAAAGAAGGAAAAATTTCAAAAATAGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACACCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTRGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTGTAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'KDR_pat121_199605'        ------------------------------------------------------------------------------------------------------NTTTGTACAGAAATGGAGAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACACCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGGACTCAAGATTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAGAAATCAGTAACAGTATTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACAATACCTAGTGTAAACAATGAAACACCAGGGATTAGATATCAGTACAACGTGCTGCCACAGGGAGGATCACCAGCAATATT [...]
+	'KDR_pat117_199602'        ------------------------------------------------------------------------------------------------------NTTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGATGGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAGGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATACTTTTCAGTTCCCTTAGATGACTTCAGAAAGTATACTGCATTTACTATACCTAGTATAAACAATGAGAGACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'KDR_pat114_199604'        ------------------------------------------------------------------------------------------------------NTTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTRTTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAACAAGAGAACTCAAGACTTYTGGGAAGTTCAATTAGGAATACCACAYCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCYTTAGATGAATTCAGAAAGTATACTGCATTYACCATACCYAGTACAAACAATGAGACACCAGGGATTAGATATCAGTAYAATGTRCTTCCACAGGGAGGATCACCAGCWATATT [...]
+	'KDR_pat115_199604'        ------------------------------------------------------------------------------------------------------NTTTGTGCAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATAYAATACTCCARTATTTGCCATAAAGAAAAAAGACAGTACTAARTGGAGAAAATTAGTAGATTTCAGAGAACTTAACAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGAAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGGTTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATCTT [...]
+	'JF_125_200501'            ---ATTAGTCCTATTGATACTGTACCAGTAAAAAAGCCAAGAATGGATGGCCCAAGAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTGCAGAAATGGAAAAAGAGGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATATAACACTCCAGTGTTTGCCATAAAGAAAAAAGACAGCACTAAATGGAGAAAGTTAGTTGATTTTAGGGAACTCAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACACCCAGCAGGGTTAAAAAAGAARAAATCAGTAACAGTATTGGATGTAGGGGATGCATATTTTTCAGTTCCCCTAGATGACTTCAGGAAATATACAGCATTTACTATACCTAGCAYAAACAATGAGACACCAGGRGTAAGATATCAGTACAATGTRCTACCACAGGGAGGATCRCCRGCCATATT [...]
+	'JA_B137_198701'           ------------------ACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAARAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAGAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGATAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACMGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGRTATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'JA_B183_198701'           ------------------ACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAATAGAAATCTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACYCCAGTATTTGCCATTAAGAAAAAAGATAGTACTAAATGGAGGAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGGATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAGTTCAGGAAGTATACTGCAATTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'JA_B197_198701'           ------------------ACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATCTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGATAGTACTAAATGGAGAAAATTAGTAGACTTCAGAGAACTTAATAAGRAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'JA_5043_198701'           ------------------ACTGTACCAGTAAAAAAACCAGGAATGGATGGCCCAARAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAGATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAATCCCATACAATACTCCAGTATTTGCCATAAAGAARAARGATAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATGACTTACGGAAGTATACTGCATTTACCATACCTAGYATGAACAATGAAACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'JA_5015_198701'           ------------------ACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCTATAAAGAAAAAAGATAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCTCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAGTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGGTTAGATATCAGTACAATGTGCTTCCACAGGGAGGGTCACCAGCAATATT [...]
+	'JA_5016_198701'           ------------------ACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTRCAGAAATGGAAAAGGAYGGAAAAATTTCAAAAATTGGGCCTGAAAACCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGATGGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTCCAATTAGGAATACCACATCCTGCAGKGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTCACCATACCTAGTRTAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAGTATT [...]
+	'JA_B254_198701'           ------------------ACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAGAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGRAAAAAGATAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAAAACTCAAGACTTCTGGGAGGTTCAATTAGGAATGCCACATCCCGCAGGGTTAAAAAAGRAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'JF_012_200501'            ---------------------------------AAGCCAGGGATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAARAAAGAGCATTAACAGAAATTTGTGCAGATATGGAAAAGGAAGGAAGAATGTCAAGAATTGGGCCTGAAAATCCATATAATACTCCAGTGTTTGCCATAAAGAAAAAAGACAGCACTAAATGGAGAAAATTAGTTGATTTTAGGGAACTCAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACACCCAGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTTAGAAAGTATACTGCTTTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGGTATCAGTACAATGTGCTTCCACAGGGAGGATCGCCAGCAATATT [...]
+	'JF_018_200501'            CCAATTAGTCCTATTAATACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGRAAAAAAAGCATTAACAGAAATCTGTACAGAGATGGAAAAGGAAGGAAAAATCTCAARAATTGGGCCTGAAAATCCATACAATACTCCAGTGTTTGCCATAAAGAAAAAAGACAGCACTAAATGGAGAAAATTAGTTGATTTTAGGGAACTCAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCAGCAGGRTTAAAAAAGAAAAAATCAGTAGCAGTACTGGATGTGGGGGATGCATATTTTTCAGTCCCTCTAGATAACTTCAGGAAGTATACTGCATTCACTATACCTAGTATAAACAATGAGACACCAGGGATAAGGTATCAGTACAACGTGCTACCACARGGAGGATCACCAGCTATATT [...]
+	'JA_F_198701'              ------------------ACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTCAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAGAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAAGATGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCRGCAATATT [...]
+	'JA_B304_198701'           ------------------ACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAGATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAGAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCTATAAAGAAGAAAGATAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAAGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTTACAGTACTTGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'JA_B85_198701'            ------------------ACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAGAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGATAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCARGATTTCTGGGAGGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'KDR_pat128_199605'        ------------------------------------------------------------------------------------------------------NTTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATAGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGYACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAAYAAGAGAACTCAAGATTTCTGGGAAGTTCAATTAGGAATACCACATCCKGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAGTTCAGGAAATATACTGCATTTACCATACCTAGTATAAACAATGCGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'KDR_pat154_199604'        ------------------------------------------------------------------------------------------------------NTTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGAYAGTACTAAATGGAGAAAATTAGTAGATTTCAGGGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTGAAAAAGAAAAAATCAGTAACAGTGCTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAGTTCAGGAAGTATACTGCATTTACCATACCCAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAAYGTGCTTCCACAGGGAGGATCACCAKCAATATT [...]
+	'KDR_pat156_199604'        ------------------------------------------------------------------------------------------------------NTTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATMAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGATTAAAAAAGAAAAAATCAGTAACAGTACTAGATGTGGGTGATGCATATTTTTCAGTACCCTTACATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGGTATCAGTACAATGTACTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'KDR_pat158_199605'        ------------------------------------------------------------------------------------------------------NTTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGAYTTTAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCYGCAGGATTAAAAAAGAAAAAATCAGTAACAGTAYTGGATGTGGGTGATGCATATTTTTCAGTTCCYTTAGATGACTTCAGGAAGTATACTGCATTTACTATACCTAGYATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCATCAATATT [...]
+	'KDR_pat152_199604'        ------------------------------------------------------------------------------------------------------NTTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTKCAATTAGGAATACCACATCCCGCAGGGTTRAAAARGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGATTTCAGGAAGTATACTGCATTTACTATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'KDR_pat15_199602'         ------------------------------------------------------------------------------------------------------NTTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACGGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAARAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGRCACCAGGGATTAGGTATCAGTACAATGTGCTGCCACAGGGAGGATCACCAGCAATATT [...]
+	'KDR_pat150_199603'        ------------------------------------------------------------------------------------------------------NTTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAACACTCCAGTATTTGCTATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCCCATCCCGCAGGGTTAAAAAAGAAAAARTCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTGTGAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'KDR_pat159_199605'        ------------------------------------------------------------------------------------------------------NTTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGATAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGAAAGTATACTGCATTCACCATACCTAGTGTAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'KDR_pat174_199602'        ------------------------------------------------------------------------------------------------------NTTTGTACAGAAATGGAAAAGGAAGGRAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGARCTTAATAARAGAACTCAAGACTTCTGGGAAGTTCAATTAGGGATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCTTTAGATGACTTTAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGACTAGATATCAGTACAATGTGCTGCCACAGGGAGGATCACCAGCAATATT [...]
+	'KDR_pat175_199602'        ------------------------------------------------------------------------------------------------------NTTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACACCAGTATTTGCCATAAAGAAGAAAGAYGGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTTTGGGAAATTCAACTAGGAATACCACATCCCGCAGGATTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGGTATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'KDR_pat169_199605'        ------------------------------------------------------------------------------------------------------NTTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCCTACAATACTCCAGTATTTGCCATAAAGAAAAARGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGAYTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTGAAAAAGAAAAAATCAGTAACAGTAYTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTACTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'KDR_pat161_199605'        ------------------------------------------------------------------------------------------------------NTCTGTRCAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTRAAAAAGAAAAAATCAGTAACAGTACTRGATGTGGGTGATGCATATTTYTCAGTTCCMTTAGAYGAATTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATCAGRTATCAGTACAATGTRCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'KDR_pat162_199603'        ------------------------------------------------------------------------------------------------------NTTTGTACAGAAATGGAAAAGGAAGGRAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAARGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTGAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'KDR_pat148_199605'        ------------------------------------------------------------------------------------------------------NTTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAATATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTYAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAATATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGAGTTAGGTATCAGTACAATGTGCTTCCACAAGGAGGATCACCAGCAATATT [...]
+	'KDR_pat137_199602'        ------------------------------------------------------------------------------------------------------NTTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATCAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'KDR_pat140_199603'        ------------------------------------------------------------------------------------------------------NTTTGTACAGAAATGGAAAAGGAAGGGAAGATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAKACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAADACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTWACAGTACTGGATGTAGGTGATGCATATTTTTYAATTCCCTTAGATGACTTTAGGAAGTATACTGCATTTACCATACCTAGCAGAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'KDR_pat136_199602'        ------------------------------------------------------------------------------------------------------NTTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTGAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'KDR_pat13_199604'         ------------------------------------------------------------------------------------------------------NTTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATAGGGCCTGAAAATCCATACAATACTCCAGTCTTTGCTATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGGGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGACGCATATTTTTCAGTTCCCTTAGATGATTTTAGAAAGTATACTGCATTTACCATACCAAGTASAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAAGGAGGATCACCAGCAATATT [...]
+	'KDR_pat130_199605'        ------------------------------------------------------------------------------------------------------NTTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCCGTATTTGCTATAAAGAAAAAAGACAATACTAAATGGAGAAAATTAGTAGACTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCARTTAGGAATACCACATCCCGCAGGTTTAAAAAAGAAAAAATCAGTAACAGTAYTGGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTAYAAACAATGAAACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'KDR_pat141_199605'        ------------------------------------------------------------------------------------------------------NTTTGTACAGAAATGGAAAAGGAAGGGAAGATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAATATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGCATACCACACCCAGCAGGGTTAAAGAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTATATGACTTCAGGAAGTATACTGCATTYACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATAYCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'KDR_pat146_199604'        ------------------------------------------------------------------------------------------------------NTTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAGTGGAGAAAATTAGTAGATTTCAGAGAACTTAACAGAAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACACCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAGTTCAGGAAGTATACTGCATTTACCATACCTAGTATGAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'KDR_pat147_199602'        ------------------------------------------------------------------------------------------------------NTTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCCGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTRACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGARACACCAGGGATTAGATATCAGTACAATGTACTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'KDR_pat145_199604'        ------------------------------------------------------------------------------------------------------NTTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACCCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTACTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'KDR_pat142_199605'        ------------------------------------------------------------------------------------------------------NTTTGTAAAGAAATGGAAAAGGAAGGRAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCAGCAGGATTAAAAAAGAAAAAATCAGTAACAGTACTAGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGACGAATTCAGGAAGTATACTGCATTTACCATACCTAGTASAAACAATGAGACACCAGGGATTAGATATCAATACAACGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'KDR_pat143_199603'        ------------------------------------------------------------------------------------------------------NTCTGTACAGAAATGGAAAAGGAAGGGAAGATCTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCTATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCTCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGGGATGCATATTTTTCAGTTCCCTTAGATGATTTCAGAAAGTATACTGCATTTACCATACCTAGTATAAACAATGMGACACCAGGGAYTAGATATCAATACAATGTACTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'JA_5012_198701'           ------------------ACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCACTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAGATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGATAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCRGGGTTAAAAAAGAAAAAATCAGTAACAGTACTAGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGATTTCAGGAAGTATACTGCATTTACCATACCTAGTGTAAACAATGAGACACAGGGAATTAGATATCAGTACAATGTGCYTCCGCAGGGGGGATCACCAGCAATATT [...]
+	'IP_17_199701'             CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAGAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTGGATGNCTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'IP_18_199612'             CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAAYCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAARTGGAGAAAATTRGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCGGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCTTTAGATGACTTCAGGAAGTATACTGCATTTACCATTCCTAGTATAAATAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'IP_19_199701'             CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATAGCTTCAGGAAGTATACTGCGTTTACCATACCTAGTATAAACAATGAGACACCAGGAGTCAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'IP_15_199705'             CCCATAAGTCCTATTGAAACTGTACCAGTAAAAAARCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATYTGTACAGAAATGGAAAAGGAAGGRAAAATTTCAAGAATTGGGCCTGAAAACCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTYAGAGAACTYAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCTCAGGGTTAAAACAGAAAAAGTCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGRAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGNTATCARTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'IP_13_199707'             CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAGGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATWGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTAAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCMCATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACGGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGCGACACCAGGGATTAGGTATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'IP_14_199712'             CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATCTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACYCCAKTATTTGCCATAAAGAAAAAAGACAKTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAARAAAMCYCARRACTTCTGGRAAGTYCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAACTCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'IP_2_199701'              CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAGAATTGGGCCTGAAAATCCATACAATACTCCAATATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGATTTCAGGAAGTACACTGCATTTACCATACCTAGTACAAATAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'IP_26_199612'             CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCGTTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCGTACAATACTCCAGTGTTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTTAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'IP_29_199707'             CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACARTGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAARTTGGGCCTGAAAATCCATAYAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGARAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAARAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCTTTMGATGACTTCAGGAAGTATACTGCATTCACCATACCTMGTATAAACAATGAGACRCCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'IP_25_199612'             CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAANGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAGAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAARAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCWGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGACTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'IP_21_199705'             CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAARATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGRGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTYACCATACCTAGTATAAAYAATGAGACACCAGGGATYAGGTATCAGTACAATGTRCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'IP_23_199712'             CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTYAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAATGGAAATYTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATMTAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGRGAACTTAWTAAGAAAACTCAAGACTTYTGGGAAGTTCAATTAGGAATACCACATCCYGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTATTGGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTGCCACAGGGAGGATCACCAGCAATATT [...]
+	'IP_12_199707'             CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTAACAGAAGAAAAGAAGGCATTAGTAGAGATTTGTGCAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTRCTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAGAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCATTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGGTATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'HG093_199901'             ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAGTTAGGAATACCACATCCGGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATACTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTACAAATAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAAGGAGGATCACCAGCAATATT [...]
+	'HG094_199901'             ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAGGAAGGRAAAATTTCAAARATTGGGCCTGAAAATCCATACAATACTCCAGTGTTTGCCATAAAGAAAAAGGACAGCACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGARAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACAACATCCCGCAGGGTTAAAAAAGAAAAARTCAGTAACAGTACTAGATGTGGGTGATGCATATTTTTCAGTTCCYCTAGATGACTTCAGGAARTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'HG095_199901'             ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAGAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAMAATCAGTAACAGTACTGGAYGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTCACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAACGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'HG092_199901'             ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGGGAACTTAATAAGAAAACTCAAGACTTTTGGGAAGTTCARTTAGGAATACCACATCCCGCAGGGTTACAAAAGAAAAAATCATTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTCACCATACCTAGTGTAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'HG090_199901'             ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAAYCCATACAATACTCCAGTATTTGCHATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGRGAACTTAATAAGAGAACTCAAGACTTCTGGGAAATTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAATTCCCTTAGATCAATTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATGAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'HG091_199901'             ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAGAATTGGGCCTGAAAATCCATACAATACTCCAGTGTTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTTAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTAGATGTGGGTGATGCATATTTTTCAGTGCCCTTAGATGACTTCAGAAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAATACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'HG096_199901'             ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAGGAGGGAAAAATTTCAAGARTTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGAYAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTYAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAGAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCYTAGATRCATTCAGAAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATCAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'HG102_199901'             ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTTAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGATTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATCTT [...]
+	'IP_1_199701'              CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATCTGTRCAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTRTTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGAYTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'HG101_199901'             ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAARGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAAYAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCTCAGGGTTAAAAMAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCTTTAGATGAMTTCAGRAAATATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTCCCACAGGGAGGATCACCAGCAATATT [...]
+	'HG097_199901'             ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACCCCAGTRTTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAGTTAGGAATACCACACCCTGCAGGGTTAAAGAAGAAAARATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTCACCATACCCAGTATAAACAATGAGACACCAGGGATCAGATATCAGTACAAYGTGCTGCCGCAGGGAGGATCACCAGCAATATT [...]
+	'HG099_199901'             ---------------------------------------------------------------------------------------------------------TGTGCAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTGTTTGCCATAAAGAAAAAGGACAGCACTAAATGGAGAAAATTAGTAGATTTCAGRGAACTTAATAAGAAAACTCAAGACTTTTGGGAAATTCAATTAGGAATACCACACCCCGCAGGGTTGAAAAAGAAAAAATCAGTAACAGTACTAGATGTGGGTGATGCATATTTTTCAGTTCCCCTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTAYAAAYAATGAGRMACCAGGRRMKAGATATCAGTACAATGTGCTTCCACARGGAGGATCACCAGCAATATT [...]
+	'IP_3_199707'              CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAACCRGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAGAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAARTTAGTAGATTTCAGGGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAATATACTGCATTTACCATACCTAGTATAAATAATGAGACACCAGGGATTAGATATCAGTAYAATGTGCTACCACAGGGAGGATCACCAGCAATATT [...]
+	'JA_2213_198701'           ------------------ACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAGATTTCAAGAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGATAGTACTAGATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGAYTTYTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCGGTAACAGTACTGGAWKTGGGTGATGCWTATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTAACATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTSCTTCCMCAGGGAGGVTCACCAGCAATATT [...]
+	'JA_27_198701'             ------------------ACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAGAAGGAAGGGAAAATTTCAAGAATTGGGCCTGAAAATCCATATAATACTCCMGTMTTTGCCATAAAGAAAAAAGATAGTACTAGATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACYGCATTTACCATACCTAGTATAAACAATGAGACACCAGGAGTWAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'JA_3885_198701'           ------------------ACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAGGTTAAACAATGGCCATTGACAGAAGAAAAAAAGGCATTAGTAGAAATTTGCACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAATATTTGCTATAAAGAAAAAGGATAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTCAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACAGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'JA_1423_198701'           ------------------ACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAGAGTTAAACAATGGCCATTGACAGAAGAAAAAADRGNATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAARGATAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTAYTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTTAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGTCACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'IP_98CIRMF10_199801'      CCAATTAGTCCTATTGACACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAGAAAAAAGCATTAACAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAATATTTGCCATAAAGAAAAAAGATAGTACTAAGTGGAGAAAATTAGTAGACTTCAGAGAACTTAATAAGAGAACTCAAGACTTTTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTATCAGTACTGGATGTGGGTGATGCATATTTTTCAATTCCCTTATGTGATTTTAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGGTTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'JA_1153_198701'           ------------------ACTGTACCAGTAAAAAAGCCAGGAAWGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAGAATTGGGCCTGAAAATCCATATAATACCCCAGTATTTGCCATAAAGAAAAAAGATAGTACTAAATGGAGAAAATTTGTAGAYTTCAGAGARCTTTATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'JA_4029_198701'           ------------------ACTGTGCCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAGTGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGATAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGGATACCGCATCCCGCAGGGTTAAAGAAGAAAAAATCAGTAACAGTACTAGATGTGGGTGATGCATATTTTTCAGTTCCTTTAGATGAGTTTAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'JA_4935_198701'           ------------------ACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGARGAAAAAAAAGCATTAATAGAGATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGATAGTAMTAAATGGAGAAAATTAGTAGATTTTAGAGAACTTAATAAGAGAACTCAAGAYTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTSCTGGATGTGGGTGATGCATATTTTTCAATTCCCTTAGATGATTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'JA_4982_198701'           ------------------ACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAGATGGAAAAGGAAGGMAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGATAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTCCCTTTAGATGATTTCAGGAAGTACCCTGCATTTACCATACCTAGTACAAACAATGAGACACAGGGGATAAGATATCAGTACAATGTGCTCCCACAGGGAGGATCACCAGCAATATT [...]
+	'JA_4876_198701'           ------------------ACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGRAAAATTTCAAAAATTGGGCCTGAGAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGATAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTAGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGCATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAKCAATATT [...]
+	'JA_408_198701'            ------------------ACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAGAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGATAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'JA_4771_198701'           ------------------ACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAWAGTTAAACAGTGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAGATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGATAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGGATACCGCATCCCGCAGGGTTAAAGAAGAAAAAATCAGTAACAGTACTAGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAGTTTAGGAAGTATACTGCATTTACCATACCTAGTATAAACAWTGAGACACCAGGGATTAGATATCAGTACAATGTACTGCCACAGGGAGGATCACCAGCAATATT [...]
+	'IP_97CIRMF26_199701'      CCAATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGTCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCGTTGACAGAAATTTGTATAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAATATTTGCCATAAAGAAAAAAGATAGTACTAAGTGGAGAAAATTAGTAGACTTCAGAGAACTTAATAAGAGAACTCAAGACTTTTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTTTCAGTGCTGGATGTGGGTGATGCATATTTTTCCATTCCCTTATGTGATTTTAGGAAGTATACTGCATTTACCATACCTAGTGTAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCGATATT [...]
+	'IP_41_199603'             CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAATGGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAGAATTGGGCCTGAAAATCCATATAATACTCCARTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGYTAAAAAAGAAAAAATCAGTAACAGTACTAGATGTGGGTGATGCATATTTTTCAGTCCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'IP_42_199612'             CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAGAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAARGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGGATACCACATCCCGCAGGATTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTCACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'IP_38_199701'             CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAARCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTRACAGAAGAGAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCGGCAGGATTAGAGAAGAAAAAATCAGTAACAGTATTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGCAACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'IP_34_199707'             CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAGAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAATTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAGGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'IP_36_199701'             CCCANTAGACCTATTGAGACTGTACCAGTAAAAAAGCCAGGAATGGRTGGCCCAAGAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAGAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCTATAAAGAAAAAAGACAGTACTAAATGGAGGAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGATTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'IP_43_199703'             CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATCTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACWCCAGTATTTGCCATAAAGAAAAAAGATAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCGGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAATACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'IP_97CIRMF08_199701'      CCAATTAGCCCTATTGACACTGTACCAGTAAAAAAGCCAGGAATGGATGGTCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAACAGAAATTTGTCTAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAATATTTGCCATAAAGAAAAAAGATAGTACTAAGTGGAGAAAATTAGTAGACTTCAGAGAACTTAATAAGAGAACTCAAGACTTTTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTATCAGTACTGGATGTGGGTGATGCATATTTTTCAATTCCCTTATATGATTTTAGGAAGTATACTGCATTTACCATACCCAGTATAAACAATGAGACACCAGGAATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'IP_97CIRMF14_199701'      CCAATTAGTCCTATTGACACTGTACCAGTAAAAAAGCCAGGAATGGATGGTCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAGGCATTAACAGAAATTTGTCTAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAATATTTGCCATAAAGAAAAAAGATAGTACTAAGTGGAGAAAATTAGTAGACTTCAGAGAACTTAATAAGAGAACTCAAGACTTTTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAATTCCCTTAGATGATTTTAGGAAGTATACTGCATTTACCATACCCAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'IP_8_199701'              CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAGGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCTATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGRGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAGAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTTAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'IP_5_199707'              CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCNAGGAATGGATGGTCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGRGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTACTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'IP_6_199701'              CCAATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCGAAAGTTAAAMAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGACCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAACAAGAGAACTCAAGACTTTTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCCTTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'N48_200301'               ---------------------------------------------------------------------------------------------------GAGATTTGTACAGAGATGGAAAAGGAAGGAAAAATTTCAAGAATTGGGCCTGAAAATCCATACAATACTCCAGTGTTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTAGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAATACAATGTGCTCCCACAGGGAGGATCACCAGCAATATT [...]
+	'VT26_200201'              ---------------------------GTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACGGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAACAGAAAAAATCAGTAACAGTACTGGATGTAGGTGATGCATATTTCTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCGGGGATTAGGTATCAGTATAATGTACTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'VT27_200201'              ---------------------------GTAAAAAAACCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAGTTAGGAATACCACATCCCGCAGGGTTGAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGAAAGTATACTGCATTTACCATACCTAGTACAAACAACGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'VT28_200201'              ---------------------------GTAAAAAAGCCAGGAATGGATGGCCCAAGAGTTAAACAATGGCCATTGACAGAGGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACCCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTTAGAGAGCTTAATAAGAGAACTCAAGACTTCTGGGAAGTGCAATTAGGAATACCACATCCCGGAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTGCCACAGGGAGGATCACCAGCAATATT [...]
+	'VT25_200201'              ---------------------------GTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAGAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCCTACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAGTTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATACTTTTCAGTTCCTTTAGATGACTTCAGGAAGTATACTGCATTTACTATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACARGGAGGGTCACCAGCAATATT [...]
+	'VT22_200201'              ---------------------------GTAAAAAAGCCAGGAATGGATGGCCCAAGAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTCACCATACCTAGTACAAACAATGAGACACCAGGAATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'VT23_200201'              ---------------------------GTAAAAAAGCCAGGGATGGATGGCCCAAGAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTTAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAGTTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAGAAATCAGTGACAGTACTGGATGTGGGTGATGCATACTTTTCAGTTCCCTTAGATGACTTCAGAAAATATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'VT28pl_200201'            ---------------------------GTAAAAAAGCCAGGAATGGACGGTCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCCGAGAATCCATATAATACCCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTGGATTTCAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGGATACCACATCCCGCAGGGTTAAAGAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAAACCCCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'VT33_200201'              ---------------------------GTAAAAAAGCCAGGAATGGATGGCCCAAAGGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAACAGAGATATGTAAAGAAATGGAAAAAGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGATTTTTGGGAGGTCCAATTAGGAATACCGCATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTATTGGATGTGGGAGATGCATATTTTTCAGTTCCCTTAGATAATTTCAGGAAGTACACTGCATTCACCATACCTAGTGTAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCCCAGGGAGGATCACCAGCAATATT [...]
+	'VT34_200201'              ---------------------------GTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATTCAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGARCTTAATAAGAGAACTCAAGACTTCTGGGAAGTCCAATTAGGAATACCACATCCCGCAGGATTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTATAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'VT32_200201'              ---------------------------GTAAAAAAGCCAGGAATGGATGGCCCGAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAGGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGATGGTAATAAATGGAGAAAGTTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCCAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'VT29_200201'              ---------------------------GTAAAAAAACCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTGGATTTCAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTGACAGTACTGGATGTGGGTGATGCATATTTTTCAGTCCCCTTAGACGACTTTAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'VT31_200201'              ---------------------------GTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAGTGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTATATGGAGAAAGTTAGTGGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGGGATGCATATTTTTCAGTCCCTTTAGATGACTTCAGGAAGTACACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTGCCACAGGGGGGATCACCAGCAATATT [...]
+	'VT21_200201'              ---------------------------GTAAAAAARCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAGATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTATATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'VT13pl_200201'            ---------------------------GTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTGGTAGAAATTTGTACAGAGATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAATATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTGGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCGGGGTTAAAAAAGAAAAAATCAGTAACAATACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGCGACACCAGGGATTAGATATCAGTCCAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'VT14_200201'              ---------------------------GTAAAAAAGCCAGGAATGGATGGGCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGTCAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTTTGGGAAGTTCAATTAGGAATACCACACCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTCCCCTTAGATGACTTCAGGAAGTACACTGCATTTACCATACCTAGTACGAACAATGAGACACCAGGGACTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'VT15_200201'              ---------------------------GTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAGATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAGGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATCAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'VT12_200201'              ---------------------------GTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATCTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAGGATAGTACTAAATGGAGAAAATTAGTAGACTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCGTTTACCATACCTAGTGTAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'VT10pl_200201'            ---------------------------GTAAAAAAGCCAGGAATGGATGCTCCAAGAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAGATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGATAGTACTAAATGGAGAAAATTAGTAGATTTTAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGGGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'VT11_200201'              ---------------------------GTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAGCAATGGCCACTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTACAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACACCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATGATTTCAGGAAATATACTGCATTTACCATACCTAGTACAAACAATGAAACACCAGGGATTAGGTACCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'VT16_200201'              ---------------------------GTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATCTGTACAGAGATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAGAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTACATGATTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGAGACCAGGGACTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'VT19_200201'              ---------------------------GTAAAAAAGCCAGGAATGGATGGCCCAAGAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTTTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCCTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAAGGAGGATCACCAGCAATATT [...]
+	'VT20_200201'              ---------------------------GTAAAAAAGCCAGGAATGGATGGCCCAAAAATTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAATAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCTATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTTTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTTCTGGATGTGGGTGATGCATACTTTTCAGTTCCCTTAGATAACTTCAGGAAGTACACTGCATTCACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'VT18_200201'              ---------------------------GTAAAAAAGCCAGGGATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCTATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATCTT [...]
+	'VT16pl_200201'            ---------------------------GTAAAAAAGCCAGGAATGGATGGCCCAAAGGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAACAGAAATATGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAATATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAGAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTAGAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCGCAGGGAGGATCACCAGCAATATT [...]
+	'VT17_200201'              ---------------------------GTAAAAAAACCAGGAATGGATGGGCCAAAAGTCAAACAATGGCCATTAACAGAAGAAAAAAAAGCATTGGTAGAAATTTGTACAGAAATGGAAAAAGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTTAGAGAACTTAATAAGAGAACTCAAGATTTCTGGGAAGTTCAATTAGGGATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACTATACCCAGTATAAACAATGAGACCCCAGGGATTAGATATCAGTACAATGTACTTCCACAGGGAGGGTCACCAGCAATATT [...]
+	'VT35_200201'              ---------------------------GTAAAAAAGCCGGCAATGGACGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGATGGTACTAAATGGAGAAAGTTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACAYCCCGCAGGGTTAAAGAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATCAGGTATCAGTACAATGTGCTTCCGCAGGGAGGATCACCAGCAATATT [...]
+	'VT55_200201'              ---------------------------GTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAARATTACAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTTAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAGGAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAAACGCCAGGAATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'VT56_200201'              ---------------------------GTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACARTGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAGAATAGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAGTTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTCCAATTAGGAATACCACATCCCGCAGGATTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'VT58_200201'              ---------------------------GTAAAAAAGCCAGGAATGGCTGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGARATGGAAAAAGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAGAAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCTCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTAGATGTGGGTGATGCGTATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'VT54_200201'              ---------------------------GTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTGGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCCGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAAACACCAGGGATTAGATATCAGTACAATGTACTTCCACAAGGAGGATCACCAGCAATATT [...]
+	'VT52_200201'              ---------------------------GTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTRGAAATTTGTACAGAAATGGAGAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAGTTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTCCAATTAGGAATACCACATCCCGCAGGATTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTATATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'VT53_200201'              ---------------------------GTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAGATTTCAAAAATTGGGCCAGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAGAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTGAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCATTAGACGACTTCAGGAAATATACTGCATTCACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'VT60_200201'              ---------------------------GTAAAAAAGCCAGGAATGGATGGCCCAAAGGTTAAACAGTGGCCATTGACAGAAGAAAAAAAAGCATTAACAGAAATATGTACAGAAATGGAAAAAGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGGAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGATTTTTGGGAAGTTCAATTAGGAATACCGCATCCTGCAGGGTTGAAAAAGAAAAAATCAGTAACAGTACTGGATGTAGGGGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTACACTGCATTCACCATACCTAGTGTCAACAATGAGACACCAGGAATTAGGTACCAGTACAATGTGCTCCCACAAGGAGGATCACCAGCAATATT [...]
+	'VT64_200201'              ---------------------------GTAAAAAAGCCAGGAATGGACGGTCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCCGAGAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTGGATTTCAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGGATACCACATCCCGCAGGGTTAAAGAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCCAGTACAAACAATGAAACACCAGGRATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'VT66_200201'              ---------------------------GTAAAAAAGCCAGGAATGGATGGCTCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAAGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCTATAAAGAAGAAAGACAGTACTAAATGGAGAAAGTTAGTAGATTTTAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTCCAATTAGGAATACCACATCCCGCAGGGCTAAAAAAGAAAAAATCAGTAACGGTACTGGATGTGGGTGATGCATATTTTTCAATTCCCTTACATGACTTCAGGAAGTATACTGCATTTACTATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCGCAGGGAGGATCACCAGCAATATT [...]
+	'VT63_200201'              ---------------------------GTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAGTGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAGAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCTCAGGTTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCCGGAAGTATACTGCATTTACCATACCTAGTACGAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCGCCAGCAATATT [...]
+	'VT61_200201'              ---------------------------GTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGGGAACTTAACAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTTACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'VT62_200201'              ---------------------------GTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAGAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAGAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTTTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTCACCATACCCAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAAGGAGGGTCACCAGCAATATT [...]
+	'VT51_200201'              ---------------------------GTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAGAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATATCAAAAATTGGGCCTGAAAACCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAGTTAGTGGATTTCAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCAGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTATTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGATTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'VT40_200201'              ---------------------------GTAAAAAAGCCAGGGATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATATGTACAGAAATGGAAAAGGAAGGAAAAATCTCAAAAATTGGGCCTGAAAATCCATACAACACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGATTTCTGGGAAGTTCAATTAGGAATACCACATCCCTCAGGGTTAAAAAAGAAGAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'VT42_200201'              ---------------------------GTAAAAAAGCCAGGAATGGATGGCCCAAGAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAGAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGATAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGGGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'VT43_200201'              ---------------------------GTAAAAAAGCCAGGAATGGATGGGCCAAAAGTTAAACAATGGCCACTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTTAGAGAGCTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATACTTCTCAGTTCCATTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'VT39_200201'              ---------------------------GTAAAAAAGCCAGGAATGGATGGCCCAAGAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCGCATCCAGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGAYGCATATTTTTCAGTTCCTTTAGATGACTTCAGGAAGTACACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'VT36_200201'              ---------------------------GTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTCGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTTAGAGAGCTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTGGGAATACCACATCCCGCAGGGCTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGGTCACCAGCAATATT [...]
+	'VT37_200201'              ---------------------------GTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAATGGAAATCTGTGCAGAAATGGAAAAGGAAGGGAAAATTTCAAAGATTGGACCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCGGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTATTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'VT44_200201'              ---------------------------GTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTATTAGAAATTTGTTCAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAACAAGAGAACTCAAGACTTCTGGGAGGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAGAAAATCAGTAACAGTACTGGATGTGGGGGATGCATATTTTTCAGTTCCTTTATATGACTTCAGGAAGTATACTGCATTTACCATACCCAGTATGAACAATGAGACACCAGGTATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'VT49_200201'              ---------------------------GTAAAAAAGCCAGGAATGGATGGCCCAAAGGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAACAGAAATATGTACAGAAATGGAAAAAGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAATATTTGCCATAAAGAAAAAAGACAGTACTAAGTGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAGAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGACGACTTCAGGAAGTATACTGCATTTACCATACCTAGTAGAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCGCAGGGAGGATCACCAGCAATATT [...]
+	'VT50_200201'              ---------------------------GTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAGAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATATCAAAAATTGGGCCTGAAAACCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAGTTAGTGGATTTCAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCAGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTATTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGATTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'VT48_200201'              ---------------------------GTAAAAAAGCCAGGAATGGACGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATCTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTTAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAGAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAAACACCAGGAATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'VT45_200201'              ---------------------------GTGAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTGGTAGAAATTTGTACAGAGATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAATATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTGGATTTCAGAGAGCTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCGGGGTTAAAAAAGAAAAAATCAGTAACAATACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGCGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'VT46_200201'              ---------------------------GTAAAAAAACCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCCGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAGAAGAAAAAATCAGTAACAGTACTAGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTATAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'VT10_200201'              ---------------------------GTAAAAAAGCCAGGAATGGACGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAAGAAGGAAAAATTTCAAAAATTGGGCCCGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGCTAAAGAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATACTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACTATACCTAGTACAAACAATGAAACGCCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'VHE_Pat49_200101'         CCCATTAGTCCTATTGAAACTGTACCAGTAAAGAAACCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAACAGAAATTTGTRCAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTWTTTGCCATAAGGAAGAAAGATAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTTTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGATTAAAAAAGAAAAAATCAGTAACAGTACTRGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGATTTCAGGAAATATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGAATTAGATATCAGTACAATGTGCTTCCGCAGGGAGGATCACCCGCAATATT [...]
+	'VHE_Pat5_200101'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAACCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTGGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAGGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGGGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCAGCAGGATTAAAAAAGAAAAAATCAGTAACAGTATTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGAAAATATACTGCATTTACCATACCTAGTAGGAACAATGAGACACCAGGAATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCCGCAATATT [...]
+	'VHE_Pat50_200101'         CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAACCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTGATAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAGATTTCAAAAATTGGGCCTGAAAATCCATAYAATACTCCAGTATTTGCCATAAAGAAAAAGGATGGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTRACAGTATTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGAATTAGATATCAGTACAATGTACTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'VHE_Pat48_200101'         CCTATTAGTCCTATTGAAACTGTACCAGTGAAAAAACCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGTCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAGGTCCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCTCTAGACGAATTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGAATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'VHE_Pat46_200101'         CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAACCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAGGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAARAGAACTCAAGACTTCTGGGAAGTTCAGTTAGGAATACCACATCCCGCAGGATTAAAAAAGAAAAAATCAGTAACAGTATTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAATATACTGCATTTACCATACCTAGTAGAAACAATGAGACACCAGGAATTAGGTATCAATACAATGTGCTTCCACAGGGAGGATCACCCGCAATATT [...]
+	'VHE_Pat47_200101'         CCCATTAGTCCTATTGAAACTGTACCAGTGAAAAAACCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTAACAGAAGAAAAAAAAGCATTGATAGAAATTTGTACAGATATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTTTTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTTTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACTGTACTAGATGTGGGTGATGCATATTTTTCAGTACCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGAATTAGATATCAGTACAATGTACTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'VHE_Pat51_200101'         CCCATTAGTCCTATTGAAACTGTACCAGTGAAAAAACCAGGAATGGATGGCCCAAAAGTTAAGCAATGGCCATTGACAGAAGAAAAAAAAGCATTGGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGATAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGATTTCTGGGAAGTCCAACTAGGAATACCACATCCCTCAGGGTTAAAAAAGAAAAAATCAGTAACAGTATTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTACATGATTTCAGGAAGTATACTGCATTTACTATACCTAGTATAAACAATGAGACACCAGGGATCAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'VHE_Pat55_200101'         CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAACCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAGGAAAAAAAAGCATTGGTAGAAATTTGTACAGAAATGGAAAARGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGAYTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGATTAAAAAAGAAAAARTCAGTAACAGTATTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGAAAATATACTGCATTTACCATACCGAGTASAAACAATGAGACACCAGGAATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCTGCAATATT [...]
+	'VHE_Pat56_200101'         CCCATTAGTCCTATTGAAACTGTACCAGTGAAAAAACCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACGGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCTATAAAGAAAAAAGACAGTACTAAATGGAGGAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCTCAGGGTTAAAAAAGAAAAAATCAGTAACAGTATTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGAATTAGATATCAGTACAATGTGCTGCCACAGGGAGGATCTCCATCAATATT [...]
+	'VHE_Pat54_200101'         CCTATTAGTCCTATTGAAACTGTACCAGTGAAAAAACCAGGAATGGATGGCCCAAAAGTTAAGCAATGGCCTTTGACAGAAGAAAAAAAAGCATTGGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAARAGAACTCAAGATTTCTGGGAAGTCCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACTGTACTGGATGTAGGTGATGCATATTTTTCAGTACCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGAATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCGCCAGCAATATT [...]
+	'VHE_Pat52_200101'         CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAACCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCACTGACAGAAGAAAAAAAAGCATTGGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCTATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGACTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAATACAATGTGCTTCCACAAGGAGGATCACCAGCAATATT [...]
+	'VHE_Pat53_200101'         CCCATTAGTCCTATTGAAACTGTACCAGTGAAAAAACCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTAACAGAAGAAAAAAAAGCATTGACAGAAATTTGTACAGAGATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAATATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACTGTATTGGATGTGGGTGATGCATATTTTTCAGTACCCCTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGAATTAGATATCAGTACAATGTGCTTCCACAGGGAGGGTCACCAGCAATATT [...]
+	'VHE_Pat45_200101'         CCTATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGTCCAAGAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTGRTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCTATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGGACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAACAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATACTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAATAATGAGACGCCAGGGATTAGATATCAATACAATGTGCTTCCACAAGGAGGATCACCAGCAATATT [...]
+	'VHE_Pat37_200101'         CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTCAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAACTAGGGATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTCCCCTTAGATAACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGGTTAGATATCAGTACAATGTGCTCCCACAGGGAGGATCACCAGCAATATT [...]
+	'VHE_Pat38_200101'         CCTATTAGTCCTATTGAAACTGTACCAGTAAAAAAACCAGGAATGGATGGCCCAAGAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTGGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAGAAAGATAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGATTAAAAAAGAAAAAATCAGTAACAGTATTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATAACTTCAGGAAATATACTGCATTTACCATACCCAGTATAAACAATGAGACACCAGGAATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCCGCAATATT [...]
+	'VHE_Pat39_200101'         CCCATTAGTCCTATTGAAACTGTACCAGTGAAAAAACCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTRGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAGATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAARGATAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGATTAAAAAAGAAAAAATCAGTAACAGTATTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTACATGAYTTCAGGAARTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGAATTAGATATCAGTACAAYGTGCTTCCACAGGGAGGATCACCTGCAATATT [...]
+	'VHE_Pat36_200101'         CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAACCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTAACAGAAGAAAAGAAAGCATTGACAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACCCAAGACTTTTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACTGTACTAGATGTGGGTGATGCATATTTTTCAGTACCTTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGAATTAGATATCAGTACAATGTACTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'VHE_Pat34_200101'         CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAATAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAACCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGCACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGGACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'VHE_Pat35_200101'         CCCATTAGTTCTATTGAAACTGTACCAGTAAAAAAACCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTGGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAACCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGACTTCAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTGGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTATTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACTATACCTAGTCTGAACAATGAGACACCAGGAATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'VHE_Pat4_200101'          CCTATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACCCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCTGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTYTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCCAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'VHE_Pat43_200101'         CCCATAAGTCCTATTGAAACTGTACCAGTAAAAAAACCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTGATAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCTATAAAGAAGAAAGACAGTACTAAATGGAGGAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGGATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTATTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGATTTCAGGAAGTATACTGCATTTACCATACCTAGTGTAAACAATGAGACACCAGGAATTAGATATCAGTACAATGTGCTACCACAGGGAGGATCGCCAGCAATATT [...]
+	'VHE_Pat44_200101'         CCCATTAGTCCTATTGAGACTGTACCAGTGAARAAACCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCACTRGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAGATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCTCAGGGTTAAAAAAGAAAAAATCAGTAACAGTATTRGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGGCTTCAGGAAGTATACTGCATTTACCATACCTAGTASAAACAATGAGACACCAGGAATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'VHE_Pat42_200101'         CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAATAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTGCAGTTAGGAATACCACACCCCKCAGGATTAAAAAAGAAAAAATCAGTAACAGTACTGGACGTGGGTGATGCATACTTCTCAGTTCCTTTAGATGACTTCAGGAAGTATACTGCATTTACCATCCCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'VHE_Pat40_200101'         CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCCAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAGAGCATTGACAGAAATWTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCCGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGACTTCAGAGAACTTAATAAAAGAACTCAAGATTTCTGGGAAGTTCAATTAGGAATACCACAYCCGGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCATTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGAGTTAGATATCAGTACAATGTGCTCCCGCAGGGAGGATCGCCAGCAATATT [...]
+	'VHE_Pat41_200101'         CCTATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGTCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTGGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAGAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCTATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGGACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATACTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAATAATGAGACACCAGGAATTAGATATCAATACAATGTACTCCCACAAGGAGGATCACCAGCAATATT [...]
+	'VHE_Pat57_200101'         CCCATTAGTCCTATTGAAACTGTACCAGTGAAAAAACCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTGATAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACGGTACTAAATGGAGAAAATTAGTAGATTTCAGGGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGTTTAAAAAAGAAAAATTCAGTAACAGTACTGGATGTGGGTGATGCATACTTTTCAGTTCCCTTAGATGAATTCAGAAAGTATACTGCCTTTACCATACCTAGTACAAATAATGAGACACCAGGAATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'VHE_Pat8_200101'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAGGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTGGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAGAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATGAATTTAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTGCCACAGGGAGGATCGCCAGCAATATT [...]
+	'VHE_Pat9_200101'          CCCATTAGTCCTATTGAAACTGTACCAGTGAAAAAACCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTRACAGAAGAAAAAAAAGCATTGGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAGAGTTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGACTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTCCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCTTTAGATGACTTCAGAAAGTATACTGCCTTTACCATACCTAGTGTAAACAATGAGACACCAGGAATTAGATATCAGTACAATGTGCTKCCACAGGGAGGATCGCCAGCAGTATT [...]
+	'VT01_200201'              ---------------------------GTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAGAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAGAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGATAGTACTAAGTGGAGAAAATTAGTAGATTTTAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTAGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTCACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'VHE_Pat71_200101'         CCCATTAGTCCTATTGAAACTGTACCAGTGAAAAAACCAGGAATGGATGGCCCGAAAGTCAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTGGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAGAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGATAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGATTTCTGGGAAGTCCAATTAGGAATACCACATCCCTCAGGGCTAAAAAAGAAAAAATCAGTAACAGTATTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTACATGATTTCAGGAAGTATACTGCATTTACTATACCTAGTATAAACAATGAGACACCAGGAATCAGATATCAGTACAATGTGCTTCCACAGGGAGGATCGCCAGCAATATT [...]
+	'VHE_Pat7_200101'          CCCATTAGTCCTATTGAAACTGTACCAGCAAAAAAACCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTAACAGAAGAAAAAAAAGCATTGACAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACTGTACTGGATGTGGGTGATGCATATTTTTCAGTACCCTTAGATGACTTCAGGAAGTATACTGCATTCACTATACCTAGTATAAACAATGAAACACCAGGAATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCGCCAGCAATATT [...]
+	'VHE_Pat70_200101'         CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTCAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAATGGAAATYTGTACAGAAATGGAGAAGGAAGGRAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAAYAAGAAAACTCAAGACTTCTGGGAAGTTCAAYTAGGAATACCACATCCCGCAGGGYTAAAGMAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCYTTAGATGACTTCAGGAAGTACACTGCATTTACTATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'VT02_200201'              ---------------------------GTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAGAATTGGGCCTGAAAATCCATACAATACCCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGACTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTCCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGAGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAACGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGCTCACCAGCAATATT [...]
+	'VT06_200201'              ---------------------------GTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAGAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAGTTAGGAATACCACATCCTGCAGGRTTACAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCCCAGGGAGGATCACCAGCAATATT [...]
+	'VT08_200201'              ---------------------------GTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAATAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCCTACAATACTCCAGTATTTGCCATAAAGAAAAAAGATAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACACCCCGCAGGGTTAAAAAAGAAAAAGTCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATAGCTTCAGAAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCGGGGATTAGATATCAGTACAATGTACTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'VT05_200201'              ---------------------------GTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCACTAACAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTAGGTGATGCATATTTCTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACTATACCTAGTACAAACAATGAAACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'VT03_200201'              ---------------------------GTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAGGAAAAAAAAGCATTAGTAGAAATTTGTGCAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTTCTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTCCCACAGGGGGGATCACCATCAATATT [...]
+	'VT04_200201'              ---------------------------GTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATCTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAGAGTTGGGCCTGAAAATCCATACAATACTCCAATATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTTAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'VHE_Pat69_200101'         CCTATTAGTCCTATTGAAACTGTACCAGTGAAAAAACCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTGGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGACTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCTCTAGATGACTTCAGGAAGTATACTGCATTTACAATACCCAGTGTAAACAATGAGACACCAGGAATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'VHE_Pat60_200101'         CCCATTAGTCCTATTGAAACTGTACCAGTGAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTGGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAAYACTCCAGTATTTGCTATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCTCAGGGTTAAAAAAGAAAAAATCAGTAACAGTRTTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTATAAAYAATGAGACACCAGGAATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCGCCAGCAATATT [...]
+	'VHE_Pat61_200101'         CCTATTAGTCCTATTGAAACTGTACCAGTAAAAAAACCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAGAAAAAAGCACTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTACAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGATAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAACAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTATTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACTATACCTAGTACAAACAATGAGACACCAGGAATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'VHE_Pat6_200101'          CCCATTAGTCCTATTGARACTGTACCAGTAAAAAAACCAGGAATGGATGGTCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTGATAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGACCTGAWAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGATTAAAAAAGAAAAAATCAGTAACAGTATTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTACATGACTTCAGGAAATATACTGCATTCACCATACCTAGCATAAACAATGAGACACCAGGAATTAGATATCAATACAATGTGCTTCCACAGGGAGGATCACCTGCAATATT [...]
+	'VHE_Pat58_200101'         CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAGAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTGACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATAAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'VHE_Pat59_200101'         CCCATTAGTTCTATTGAAACTGTACCAGTAAAAAAACCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTAACAGAAGAAAAAAAAGCATTGATAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAGATTACRAAAATTGGGCCTGAAAACCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTRGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTATTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACTATACCTAGTATGAACAATGAGACACCAGGAATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'VHE_Pat62_200101'         CCCATTAGTCCTATTGAGACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTRGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAGATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCTATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGATTTCTGGGAAGTTCAATTGGGAATACCACATCCCGCGGGGTTAAAAAAGAAAAAATCAGTAACAGTACTAGATGTAGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTCCCACAAGGAGGATCACCAGCAATATT [...]
+	'VHE_Pat67_200101'         CCCATCAGTCCTATTGAGACTGTACCAGTGAAAAGACCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAGGAAAAAAAAGCACTGGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGACTTTTGGGAAGTTCAATTGGGAATACCACATCCCTCAGGGCTAAAAAAGAAAAAATCAGTAACAGTATTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTCACCATACCTAGTATAAACAATGAGACACCAGGAATTAGATATCAGTACAATGTGCTTCCACAGGGAGGGTCACCAGCAATATT [...]
+	'VHE_Pat68_200101'         CCCATTAGTCCTATTGAAACTGTACCAGTGAAAAAACCAGGAATGGATGGCCCAAAAGTTAAACAGTGGCCATTGACAGAAGAAAAAAAAGCATTGGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTGGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCCCATCCCTCAGGGTTAAAACAGAAAAAATCAGTAACAGTATTGGATGTGGGTGATGCATATTTTTCAGTTCCYTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGAATAAGATATCAGTACAATGTGCTCCCACAGGGAGGATCGCCAGCAATATT [...]
+	'VHE_Pat65_200101'         CCCATTAGTTCTATTGAAACTGTACCAGTGAAAAAACCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGARGAAAAAAGAGCATTGGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCTAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGATTTCTGGGAAGTTCAATTAGGAATACCACATCCCTCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCTTTAGATGAATTCAGGAAGTATACTGCATTCACCATACCTAGTATAAACAATGAGACACCAGGAACTAGATATCAGTACAATGTGCTTCCACAAGGAGGATCGCCAGCAATATT [...]
+	'VHE_Pat63_200101'         CCCATTAGTCCTATTGAAACTGTACCAGTGAAAAAACCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTGGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAGCTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCTCAGGGTTAAAAAAGAAAAAATCAGTAACAGTATTGGATGTGGGTGATGCTTATTTTTCAGTTCCCTTAGATAACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGAATTAGGTATCAGTACAATGTRCTTCCACAGGGAGGATCGCCATCAATATT [...]
+	'VHE_Pat64_200101'         CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAGGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTGGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATYTCAARAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGCACTAARTGGAGRAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGATTTCTGGGAAGTGCAGTTAGGAATACCGCATCCCGCAGGGTTAAAAAAGAAAAAATCAATAACAGTACTRGATGTGGGAGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACTATACCTAGTATAAACAATGAGACACCAGGAATTAGATATCAGTACAATGTGCTTCCGCAGGGAGGATCGCCAGCAATATT [...]
+	'VT67_200201'              ---------------------------GTAAAAAAGCCAGGAATGGATGGCCCAAGAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAGAAGAAAAAATCAGTAACAGTACTAGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAAACGCCAGGAATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'dn75_200008'              ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAGAATTGGGCCTGAAAATCCATATAATACTCCAATATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAGGAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTATAATGTGCTCCCACAGGGAGGATCACCAGCAATATT [...]
+	'dn77_200011'              ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAGGAAGGAAARATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGGACTCAAGACTTCTGGGAAGTCCAATTAGGAATACCACATCCCTCAGGTCTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATAACTTCAGGAAGTACACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCCCAGGGAGGATCACCAGCAATATT [...]
+	'dn78_200005'              ---------------------------------------------------------------------------------------------------------TGTACAGAGATGGAAAAGGAAGGAAAAATTTCAAAAGTTGGSCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTACATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGTGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTAGATGTRGGTGATGCATAYTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'dn72_200007'              ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAGTTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCTATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGAYTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTRGGTGATGCATATTTTTCAGTTCCCTTAGACGACTTCAGGAAGTATACWGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'dn68_200006'              ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAGTCAGTCACAGTACTGGATGTGGGCGATGCATATTTTTCAGTYCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'dn69_200006'              ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATCGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAGGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCCAGTATAAACAATGAAACACCAGGGGTTAGATACCAGTATAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'dn79_200011'              ---------------------------------------------------------------------------------------------------------TGTACAGACATGGAAAGGGAAGGAAAAATTTCAAARATTGGGCCTGAAAAKCCATACAACACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAGCTCAATAAAAGAACTCAAGACTTCTGGGAGGTCCAATTAGGAATACCTCATCCCTCGGGGTTAAAAAAGAAAAAATCAGTAACAGTACTAGATGTAGGGGATGCATACTTTTCAGTGCCCTTAGATAGCTTTAGRAAATATACTGCATTCACTATACCTAGTACAAATAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAAGGAGGATCACCATCAATATT [...]
+	'dn85_200002'              ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAGGAAGGGAAAATTTCAARAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGGATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTGTAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'dn87_200008'              ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGGGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGCTARAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGGGACGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATACCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCGATATT [...]
+	'dn83_200011'              ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTTTGGGAAGTTCAATTAGGAATACCACATCCCTCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTAGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATRATTTTAGAAAGTATACTGCATTTACCATACCTAGTACAAACAATGCGACCCCAGGGATTAGATATCAGTACAATGTGCTTCCACAAGGAGGATCACCAGCAATATT [...]
+	'dn80_200008'              ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAGGAGGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTRTTTGCYATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGGGAACTTAATAAGAGAACTCARGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCKCAGGGCTAAAAAAGAAAAAATCAGTAACAGTAYTRGATGTGGGGGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTAGAAACAATGAGACACCAGGGATTAGATACCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCGATATT [...]
+	'dn81_200007'              ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGCTAAAAAAGAAGAAATCAGTAACAGTACTGGATGTGGGGGACGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAAACACCAGGGATTAGATACCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'dn67_200011'              ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAGGAAGAGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAGTCAGTAACAGTACTGGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'dn57_200001'              ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAARGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGGGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGCYTAAAAAAGAARAAATCAGTAACAGTACTRGATGTGGGGGACGCATATTTYTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCGTTCACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATACCAGTACAATGTGCTTCCRCAGGGAGGATCACCAGCRATATT [...]
+	'dn58_200003'              ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAACTAGGAATACCACACCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTAGGTGATGCATATTTTTCAGTTCCCTTAGATGAMTTCAGAAAGTATACTGCATTTACCATACCTAGTGTAAACAATGAGACACCAGGAATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'dn59_200007'              ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAATATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTTAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTYACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTACTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'dn55_200009'              ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAGGAGGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGGGAACTTAATAAGAGRACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCMKCAGGGCTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGRGAYGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGRATTAGATACCAGTACAATGTRCTTCCACAGGGAGGATCACCAGCGATATT [...]
+	'dn52_200003'              ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAGGAAGGRAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGGGAACTTAATAAGARAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGCTAAAAAAGAAAAAGTCAGTAACAGTACTGGATGTGGGGGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATACCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCGATATT [...]
+	'dn54_200006'              ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAATAACAGTACTGGATGTGGGTGATGCATACTTTTCAGTTCCCTTAGACGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'dn60_200003'              ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTGACAGTACTAGATGTAGGTGATGCATATTTTTCAGTGCCCTTAGATGAMTTCAGGAAATATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTCCCACAGGGAGGATCACCAGCAATATT [...]
+	'dn65_200010'              ---------------------------------------------------------------------------------------------------------TGTACAGAGATGGAAAAGGAAGGRAAAATTTCAAAAATTGGGCCTGAAAATCCATAYAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACWAAATGGAGAAAATTAGTRGATTTCAGAGAACTTAATAARAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTAGATGTAGGKGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGRATTAGATATCAATACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'dn66_200009'              ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCTATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGAGTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCAYTAGATGAATTCAGAAAGTATACTGCATTTACCATACCTAGTGTAAACAATGAGACACCAGGAATTAGATATCAGTACAATGTGCTTCCACAGGGAGGGTCGCCAGCAATCTT [...]
+	'dn63_200010'              ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAGAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTGGTAGATTTCAGAGAGCTCAATAAAAGAACTCAAGACTTCTGGGAGGTCCAATTAGGAATACCTCACCCCTCGGGGTTAAAAAAGAAAAAATCAGTAACAGTGCTAGATGTAGGGGATGCATACTTTTCAGTGCCCTTAGATAGCTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'dn61_200010'              ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAGGAAGGGAAAAATTYAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTTAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAACTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTAGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTACACTGAATTAACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGGGGATCACCTGCAATATT [...]
+	'dn62_200006'              ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAACCCATATTATACTCCAATATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGGACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGAAAGTACACTGCATTCACAGTACCTAGTATAAACAATGCGACACCAGGAACTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'dn90_200003'              ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAACCCATATSATACTCCAATATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGGACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGAAAGTACACTGCATTCACAGTACCTAGTATAAACAATGCGACACCAGGAACTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'n16_200301'               ---------------------------------------------------------------------------------------------------GAGATATGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTGGATTTCAGAGAGCTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACACCCAGCAGGCTTAAAGAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATAACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAAACACCAGGGATTAGATATCAGTACAATGTGCTCCCACAGGGAGGATCACCAGCAATATT [...]
+	'n17_200301'               ---------------------------------------------------------------------------------------------------GAGATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGAAAGTATACTGCATTTACCATACCTAGTATAAACAATGCGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAAGGAGGATCACCAGCAATATT [...]
+	'n18_200301'               ---------------------------------------------------------------------------------------------------GAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATCGGGCCTGAAAATCCATACAATACTCCAATATTTGCCATAAAGAAAAAAGATAGTACTAAATGGAGAAAATTAGTAGATTTTAGAGAACTTAATAAAAGAACTCAAGATTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTAGATGTGGGTGATGCATATTTTTCAGTTCCCTTATATGACTTCAGGAAGTATACTGCATTCACCATACCTAGCATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'n15_200301'               ---------------------------------------------------------------------------------------------------GAAATTTGTACAGAAATGGAAAAGGAAGGAAAGATCTCAAAAATAGGGCCTGAAAATCCATACAATACTCCAGTGTTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTTAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAGTTAGGAATACCACATCCCGCAGGGTTAAAGAAGAAAAAGTCAGTAACAGTATTGGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATGAATTCAGAAAGTATACTGCATTTACCATACCCAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATCTT [...]
+	'n13_200301'               ---------------------------------------------------------------------------------------------------GAGATTTGTACAGAAATGGAGAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGGAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGACTTTTGGGAAGTTCAACTAGGAATACCACATCCCGCAGGCTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTAGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTCACCATACCTAGTACAAACAATGAGACACCAGGAATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'n14_200301'               ---------------------------------------------------------------------------------------------------GAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTCCAATTAGGAATACCACATCCCGCAGGATTAAAAAAGAAAAAATCAGTAACAGTATTGGATGTGGGTGATGCATATTTTTCAGTTCCTCTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAAGGGGGATCGCCAGCAATATT [...]
+	'n19_200301'               ---------------------------------------------------------------------------------------AAAGCATTAGTAGATNNNTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAACTAGTAGATTTTAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAGTTAGGAATACCACATCCAGCAGGATTAAAAAAGAAAAAATCAGTAACAGTACTAGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATAACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGGTATCAGTATAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'n24_200301'               ---------------------------------------------------------------------------------------------------GAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTTAAAAATTGGGCCTGAAAACCCATACAATACTCCTGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGGGAACTTAACAAGAGAACTCAGGATTTCTGGGAAGTCCAATTAGGAATACCACATCCTGCAGGATTAAAGAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGGTTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'sm5_199901'               ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAGGAAGGRAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'n23_200301'               ---------------------------------------------------------------------------------------------------GAGATATGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATACTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTGTAAACAATGAGACACCAGGGGTTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'n20_200301'               ---------------------------------------------------------------------------------------------------GAAATTTGTACAGAAATGGAAAAGGAAGGAAAGATTGAAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAGATGGAGAAAATTAGTAGATTTTAGAGAACTGAATAAGAGAACCCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAGAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGATTTCAGGAAGTATACTGCATTTACCATACCTAGTGTAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTGCCACAGGGAGGATCACCAGCAATATT [...]
+	'n22_200301'               ---------------------------------------------------------------------------------------------------GAAATTTGTACAGAAATGGAAAAGGAAGGAAAGATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTCCAATTAGGAATACCACATCCCGCAGGATTAAAAAAGAAAAAATCAGTGACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAATATACTGCATTTACCATACCTAGTACAAACAATGAAACACCAGGGGTTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'n12_200301'               ---------------------------------------------------------------------------------------------------GAAACTTGTACAGAAATGGAAAAGGAAGGAAAACTCTCAAGACTTGGGCCTGAAAATCCCTACAATACTCCAGTATTTGCCCTAAAGAAAAAAGACAGTACTAAATGGAGGAAATTAGTAGATTTTAGAGAACTCAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAATAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCTGGGATTAGATATCAGTACAACGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'dn95_200004'              ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTCGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGATTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACTATACCCAGTACAAACAATGAGACACCAGGGATTAGGTATCAATACAATGTGCTTCCACAGGGGGGATCACCAGCAATATT [...]
+	'dn96_200003'              ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAGGAAGGAAAGATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCWATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTCCAATTAGGAATACCTCATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTAATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCAWACCTAGTATAAATAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'dn94_200009'              ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAATATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAARTTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCYGCAGGGTTAAAAAAGAAAAARTCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCYTTAGACGAATTCAGAAAGTAYACTGCATTTACCATACCTAGTGTAAACAATGAGACACCAGGGATYAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'dn92_200001'              ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAGGAAGGGAAAATTGAAAAAATTGGGCCTGAAAATCCATACAATACTCCARTATTTGCCATAAAGAAAAAAGACAGTACKAAATGGAGAAAATTAGTAGATTTCAGGGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGCTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGGGACGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATACCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCRATATT [...]
+	'dn93_200011'              ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGCCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAATAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTCCCCTTAGACGACTTCAGGAAGTATACTGCATTTACCATACCTAGTGTAAACAATGAGACACCAGGGATTAGATATCAGTATAATGTGCTTCCACAGGGAGGATCACCATCAATATT [...]
+	'dn98_200002'              ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGSCCTGAAAACCCATACAATACTCCARTATTTGCCATAAAGAAAAAAGAYGGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAARAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTCCTGGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGACGACTTCAGAAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGAATTAGATATCAGTACAATGTGCTTCCACAGGRAGGATCACCAGCAATATT [...]
+	'md4_199901'               ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGARAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTWTTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTCCAATTAGGGATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTRGATGTGGGTGATGCATACTTTTCAGTACCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAACGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'n11_200301'               ---------------------------------------------------------------------------------------------------GAGATATGTACAGAAATGGAAAAGGAAGGAAAGATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAAAAGAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTTTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGCTAAAACAGAAAAAATCAGTAACAGTACTAGATGTGGGTGATGCATATTTTTCAGTTCCTTTAGATGAATTTAGGAAGTATACTGCATTCACCATACCTAGTACAAACAATGAGACACCAGGAATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'hj2_199901'               ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAAYCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTGCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'ea1_199901'               ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAARAGAACTCARGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTRAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGGGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCYAGTACAAACAATGAGACACCAGGGATTAGRTATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'ehh6_199901'              ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAGGAAGGGAAAATCTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGAACAGTACTAAGTGGAGAAAATTAGTAGATTTCAGAGAACTTAACAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATGAATTCAGAAAGTACACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATCAGGTATCAATACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'dn50_200010'              ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAGGAAGGRAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCAGCAGGGTTAAAAAAGAARAAATCAGTGACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTAYACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'VT95_200201'              ---------------------------GTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATCTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'VT98_200201'              ---------------------------GTAAAAAAGCCAGGAATGGATGGTCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAGTTAGGAATACCGCATCCCTCAGGGTTAAAAAAGAAAAAATCAGTAACAGTATTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAAACACCAGGGATTAGATATCAGTACAATGTGCTCCCACAGGGAGGATCACCAGCAATATT [...]
+	'WJ_pat7101_200201'        CCCATTAGTCCTATTGACACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGWTAAGCAATGGCCATTGACAGARGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAGAAGAARAAATCAATAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAGTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGAATTAGATATCAATACAATGTGCTGCCACAGGGAGGATCACCAGCAATATT [...]
+	'VT93a_200201'             ---------------------------GTAAAGAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCTATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACAGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'VT89b_200201'             ---------------------------GTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCTATAAAGAAAAAAGACAGTACTAAATGGAGAAAGTTAGTAGACTTTAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTCCAATTAGGAATACCACATCCCGCAGGATTAAAACAGAAGAAATCAATAACAGTACTAGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTGCCACAGGGAGGATCACCAGCAATATT [...]
+	'VT90E_200201'             ---------------------------GTAAGAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATCTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTGGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTGCTGGATGTGGGTGATGCATATTTCTCAGTTCCTTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACCCCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGTTCACCAGCAATATT [...]
+	'WJ_pat7152_200201'        CCCATTAGTCCTATTGAGACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTACTAGAAATCTGTACAGAGATGGAAAGTGAAGGRAAAATTTCAAAAGTTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTTAGAGAACTTAATAAGAAAACTCAAGATTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTAGATGTGGGAGATGCATATTTTTCAGTTCCATTATGTGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'cw8_199901'               ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAAGAAGGRAAAATTTCAAAAATTGGGCCTGAAAACCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTACATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAARAGAACTCAAGACTTCTGGGAAGTCCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'dn02_200011'              ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTWCTAAATGGAGAAARTTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAARAAAAAATCAGTAACAGTATTGGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGAYGAMTTCAGGAAGTAYACTGCATTTACCATACCTAGTATAAATAATGAGACACCAGGGATTAGRTATCAGTACAATGTGCTTCCACAAGGAGGATCACCAGCAATATT [...]
+	'bc3_199901'               ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAARAGAACTCARGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTRAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGGGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCYAGTACAAACAATGAGACACCAGGGATTAGRTATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'WJ_pat7225_200201'        CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGWKAAACAATGGCCATTGACAGAAGAAAAGAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGACCTGAAAATCCATACAATACGCCAGTATTTGCCATAAAGAAGAAAGACAGTACAAAATGGAGAAAATTAGTAGATTTTAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTATTAGATGTGGGTGATGCATATTTTTCAGTTCCCTTGGATGAATTCAGGAAGTATACTGCATTTACTATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCGCAGGGAGGATCACCAGCAATATT [...]
+	'WJ_pat7728_200201'        CCCATTAGTCCTATTGAGACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGWTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAGATTTCAAAAATTGGGCCTGAAAACCCATACAATACTCCAGTATTTGCCATAAGGAAAAAAGACAGTACTAAATGGAGAAAACTAGTAGATTTCAGGGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAACTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGGTATCAGTACAATGTACTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'VT86b_200201'             ---------------------------GTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAACCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCTCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGACGCATATTTTTCAGTGCCCTTAGATGACTTCAGGAAGTATACTGCATTTACTATACCTAGTACAAACAATGAGACACCAGGGATTAGATACCAGTACAATGTGCTTCCTCAGGGAGGATCACCAGCAATATT [...]
+	'VT74E_200201'             ---------------------------GTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAGGAAAAAGGACAGTACTAAATGGAGAAAGCTAGTGGATTTCAGAGAGCTTAATAAGAGAACTCAAGACTTCTGGGAAATTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTTAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'VT75_200201'              ---------------------------GTGAAAAAGCCAGGAATGGATGGCCCAAAAGTCAAACAATGGCCATTGACAGAAGAAAAGAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAACTAGTAGATTTTAGAGAACTTAAYAAGAGAACTCAAGACTTTTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAAGCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTTAGGAAGTATACCGCGTTTACCATACCTAGTATAAACAATGAGACACCAGGAATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'VT76_200201'              ---------------------------GTAAAAAAGCCAGGAATGGATGGCCCAAGAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAAGAAGGAAAGATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGGGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAAGGAGGATCACCAGCAATATT [...]
+	'VT73b_200201'             ---------------------------GTAAAAAAGCCAGGAATGGATGGCCCAAGGGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAACAGAAATATGTACAGAAATGGAAAAAGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGACTTCAGAGAACTTAATAAAAGAACYCAAGATTTTTGGGAGGTTCAATTAGGAATACCGCATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGAGATGCATATTTTTCAGTTCCCTTAGATGAGTTCAGGAAGTACACTGCATTCACCATACCTAGTGTCAACAATGAGACACCAGGAATTAGATATCAGTACAATGTGCTTCCCCAGGGAGGATCACCAGCAATATT [...]
+	'VT68_200201'              ---------------------------GTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCACTAACAGAAGAAAAAAAAGCATTAATAGAAATTTGTACAGAAATGGAAAAGGACTGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATACTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGAGTTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'VT69_200201'              ---------------------------GTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAGGCAATGGCCATTGACAGAAGAAAAAAAAGCATTGACAGAAATCTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCTATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTGGTAGATTTTAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCTCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATAAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'VT77b_200201'             ---------------------------GTAAAAAAGCCAGGAATGGTTGGCCCAAGAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAAGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAGTGGAGAAAATTAGTAGATTTCAGAGAGCTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGGATACCACATCCCTCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'VT83_200201'              ---------------------------GTAAAAAAGCCTGGTATGGATGGCCCAAGAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAAGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTGACAGTACTAGATGTGGGTGATGCTTATTTCTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTCCCACAGGGAGGATCACCAGCAATATT [...]
+	'VT84b_200201'             ---------------------------GTAAAAAAGCCAGGGATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATCTGTACAGAAATGGAAAAAGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTGAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTGGGAATACCACATCCCGCAGGGTTAGAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTCACCATACCTAATATAAACAATAGAGCACCAGGGACTAGATACCAGTACAATGTGCTTCCACAAGGAGGATCACCAGCAATATT [...]
+	'VT81RTE_200201'           ---------------------------GTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATATGTACAGAAATGGAAAAAGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACGCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTTTGGGAAGTTCAATTAGGAATCCCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCCTTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'VT78_200201'              ---------------------------GTAAAAAAGCCAGGAATGGATGGCCCGAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGATAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGGATACCACATCCCGCAGGGTTAAAGAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCATTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'VT79b_200201'             ---------------------------GTAAAAAAGCCAGGAATGGTTGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATCTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAGTGGAGAAAATTAGTAGATTTCAGGGAACTTAATAAAAGAACTCAAGACTTTTGGGAAGTTCAATTAGGAATACCACACCCAGCAGGGTTGAAAAAGAAAAAATCAGTGACAGTACTRGATGTRGGTGATGCATATTTTTCAGTTCCCTTAGACGACTTTAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGAATTAGATATCARTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'dn05_200001'              ---------------------------------------------------------------------------------------------------------------GAAATGGAAAAGGAAAGGGAAATTTCAAAAATTGGGCCTGAAAATCCATACAACACTCCAATATTTGCTATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTTAGAGAACTTAATAAGAGAACTCAAGATTTCTGGGAAGTGCAATTAGGAATACCACACCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGGTTAGATATCAGTACAATGTGCTTCCACAAGGAGGATCACCAGCAATATT [...]
+	'dn37_200010'              ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTCAATAAGAGAACTCAAGACTTCTGGGAAGTCCAATTGGGAATACCMCATCCCGCAGGGTTAAAACAGAAGAAATCAGTAACARTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTRTRTGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTACTTCCACAGGGAGGATCACCAGCGATATT [...]
+	'dn38_200001'              ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAGAAAAGACGGTGCTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTCCAATTAGGAATACCACATCCCGCAGGATTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCMTACCCAGTMTAAACAATGAGACACCAGGGACTAGATATCAATACAATGTGCTTCCACAGGGGGGATCACCAGCAATATT [...]
+	'dn39_200003'              ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAGAATCCTTACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAGGTTCAATTAGGAATACCACATCCCKCAGGGTTAAAAMAGAAAAAATCAGTAACAGTACTGGATGTGGGYGATGCATATTTTTCAGTTCCCTTAGATGAGTTTAGGAAATATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCRATATT [...]
+	'dn34_200010'              ---------------------------------------------------------------------------------------------------------------GAAATGGAAAAGGAAGGGCAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGGGAACTTAATAAGAAAACTCAARACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGCTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGGGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATACCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCGATATT [...]
+	'dn32_200006'              ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAATTCAATTAGGAATACCACATCCCTCAGGGTTAAAAAAGAAGAAATCAGTMACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTCACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'dn33_200006'              ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAGGAAGGAAAGATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCTATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTCCAATTAGGAATACCTCATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAATAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'dn41_200003'              ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAARGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAATAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGACGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATGAACAATGAGACACCAGGGATTAGATACCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'dn48_200008'              ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGATAGTACTAAATGGAGAAAATTAGTAGATTTCAGGGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCGGGGCTAAAAAAGAAGAAATCAGTAACAGTACTGGATGTGGGGGACGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCCAGTACAAACAATGAGACACCAGGGATTAGATACCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCGATATT [...]
+	'dn49_200012'              ------------------------------------------------------------------------------------------------------------------ATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGRGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGRATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGAYGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGGAGTAYACTGCATTTACCATACCTAGTATAAACAATGAGRCACCWGGGATTAGATAYCAGTACAATGTGCTWCCRCAGGGAGGATCACCAGCMATATT [...]
+	'dn47_200012'              ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGARAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAARTGGAGAAAATTAGTAGATTTCAGGGAACTTAATAAGAGAACTCAAGATTTCTGGGAAGTCCAATTAGGRATACCACATCCCTCAGGGCTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTAGGGGACGCMTATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTAAAAACAATGAGACACCAGGGATTAGATACCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'dn42_200001'              ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAGAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTYAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTGAAAAAGAAAAAATCAATAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGACGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'dn43_200007'              ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGRCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCMGGGTTAAAAAAGAAAAAATCAGTAACAGTACTAGATGTGGGTGATGCATATTTCTCAGTTCCATTAGATGACTTTAGAAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGRATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'dn29_200007'              ------------------------------------------------------------------------------------------------------------ACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAGAARGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGGGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTGCAATTAGGAATACCACACCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTAGATGTAGGGGATGCATATTTTTCAGTTCCTTTAGATAGCTTCAGGAAATATACTGCATTCACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAATATAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'dn13_200012'              ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATYGGGCCTGAAAATCCATACAATACTCCAGTATTTGCYATAAAGAAAAARGACAGCACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCYGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGATTTCAGGAAGTAYACTGCYTTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'dn14_200010'              ---------------------------------------------------------------------------------------------------------TGTACAGAGATGGAGAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAACCCATAYAATACTCCAGTATTTGCTATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGARCTTAATAAGAAGACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'dn11_200009'              ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAGGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTTTGGGAAGTTCAACTAGGRATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTRATGCATATTTTTCAGTTCCCTTAGATGACTTCAGAAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATYAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'dn10_200001'              ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAGTCAGTAACAGTACTRGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTYACCATACCTAGTACAAACAATGAGACACCAGGAATTAGATATCAGTACAATGTGCTCCCACAGGGAGGATCACCAGCAATATT [...]
+	'dn101_200012'             ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGACCTGAAAATCCATACAACACTCCAATATTTGCCATAAAGAAAAAAGACAGTACYAAATGGAGAAAATTGGTAGATTTCAGAGAGCTCAATAAAAGAACTCAAGACTTCTGGGAGGTCCAATTAGGAATACCTCATCCCTCAGGGCTAAAAAAGAAAAAATCAGTAACAGTGCTAGATGTGGGGGATGCATACTTTTCAGTGCCCTTAGATAGCTTTAGAAAGTATACTGCATTYACTATACCTAGTACAAATAATGAGACACCAGGGATTAGATACCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'dn20_200001'              ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAGAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAATAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGACGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGGTTAGATATCAGTACAATGTGCTYCCACAGGGAGGATCACCAGCAATATT [...]
+	'dn25_200005'              ---------------------------------------------------------------------------------------------------------------GAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGGGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGCTAAAAAAGAAAAAATCAGTGACAGTACTGGATGTGGGGGACGCATATTTTTCAGTTCCCTTAGATGAMTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCGATATT [...]
+	'dn26_200004'              ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTRTTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGGGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGCTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGRGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATACCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCGATATT [...]
+	'dn23_200010'              ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAATATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACACCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTGCTGGATGTGGGGGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTACTTCCACAAGGAGGATCACCAGCAATATT [...]
+	'dn21_200008'              ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTRTTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAARAGAACTCAAGACTTCTGGGAAGTCCAATTAGGAATACCACATCCCGCAGGGCTAAARAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCCGTACARTGTGSTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'dn22_200005'              ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTRGATGTAGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAATATACYGCATTTACCATACCTAGTAGAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTRCTTCCACAGGGAGGATCACCAGCGATATT [...]
+	'VHE_Pat33_200101'         CCCATTAGTCCTATTGAAACTGTACCAGTGAAAAAACCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTGGTAGAAATCTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCTATAAAGAAAAAAGATAGTACTAAATGGAGAAAATTAGTAGACTTCAGAGAACTTAATAAAAGAACTCAAGATTTCTGGGAAGTCCAATTAGGAATACCACATCCCTCAGGGCTAAAAAAGAAAAAATCAGTAACAGTATTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTATGTGATTTCAGGAAGTATACTGCATTTACTATACCTAGTATAAACAATGAGACACCAGGAATCAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCATCAATATT [...]
+	'PSW_Pat8_199901'          ---------------------------------------------------------------------------------------------------------------GAGATGGAGAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTNTTTGCCATAAAGAAAAAAGACAGTAATAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACACCCAGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTAGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTACACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGGGGATCACCAGCGATATT [...]
+	'PSW_Pat9_199901'          ---------------------------------------------------------------------------------------------------------------GAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTCAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCAGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGCATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTGNCNCAGGGGGGATCACCAGCATATTT [...]
+	'Pt1218_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAGAGTTAAACAATGGCCATTRACAGAAGAGAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAGATTGGGCCTGAAAACCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGAYTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTGGGAATACCACATCCCGCAGGGTTAAAAAAGAACAAATCAGTAACAGTGCTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATAACTTCAGGAAGTATACTGCATTTACCATACCTAGTGTGAATAATGAAACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'PSW_Pat7_199901'          ---------------------------------------------------------------------------------------------------------------GAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAACTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCAGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTAGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGGGGATCACCAGCGATATT [...]
+	'PSW_Pat5_199802'          ---------------------------------------------------------------------------------------------------------------GAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCAGCAGGGTTAAAAAAGAAAAAATCAATAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCCAGTATAAACAATGAGACACCAGGAATTAGATATCAGTACAATGTACTTCCACAGGGGGGATCACCAGCGATATT [...]
+	'PSW_Pat6_199901'          ---------------------------------------------------------------------------------------------------------------GAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGATGGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTCCAATTAGGAATACCACATCCAGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAAGGGGGATCACCAGCGATATT [...]
+	'RR_MAD_HF003_200501'      ---ATTAGTCCTATTGAAACAGTACCAGTAAAAAAGCCAGGCATGGATGGGCCAAAAGTTAAACAATGGCCATTGACAGAGGAAAAAAAAGCATTAGTAGAAATTTGTACAGAGATGGAGAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACAYCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTAGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCCTTTACCATACCTAGTGTAAATAATGAAACACCAGGAATCAGATACCAGTACAATGTGCTTCCACAAGGAGGATCACCAGCAATATT [...]
+	'RR_MAD_TO086_200501'      CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGCATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAGGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTCCAATTAGGAATACCACATCCAGCGGGGTTAAAAAAGAAAAAATCAGTAACAGTACTAGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGACGAATTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAAACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'RR_MAD_TO182_200501'      ---------------------------------------------GATGGCCCAAAGGTTAAACAATGGCCATTGACAGAAGAGAAAAAAGCATTAGTAGAAATYTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAGTGGAGAAAATTGGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTAYTGGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATGACTTCAGAAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATCAGATATCAGTAYAAYGTGCTTCCGCAAGGAGGATCCCCAGCAATATT [...]
+	'RR_MAD_MO250_200501'      ------------------------------------------------------AAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCTATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGGGAACTYAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTCCTGGATGTGGGTGATGCATATTTCTCAGTTCCTTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTGTTAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'RR_MAD_MO055_200501'      CCCATTAGTCCTATTGAGACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAACAGAAATTTGTAAAGAGATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAATATTTGCTATAAAGAAAAAGGATAGCACTAAATGGAGAAAATTAGTAGATTTTAGAGAGCTCAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCGCATCCCGCAGGTCTAAAAAAGAAAAAATCAGTAACAGTCTTGGATGTGGGTGATGCATATTTTTCAGTTCCATTACATGACTTTAGAAAGTATACTGCATTCACCATACCTAGTATAAACAATGAGACACCAGGAATTAGATATCAGTATAATGTGCTTCCACAAGGAGGATCACCAGCAATATT [...]
+	'RR_MAD_MO132_200501'      ------------------------------------------------------------------------TTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTCCAATTAGGAATACCACATCCAGCGGGGTTAAAAARGAAAAAATCAGTAACAGTACTAGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGACGAATTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAAACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAAGGAGGATCACCAGCAATATT [...]
+	'PSW_Pat47_200201'         ---------------------------------------------------------------------------------------------------------------GAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACCAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTGCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTCTCAGTTCCTTTAGATGAATTCAGGAAATATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTACTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'PSW_Pat39_200201'         ---------------------------------------------------------------------------------------------------------------GAAATGGAAAAGGAAGGAAAGATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCAGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTAGATGTGGGTGATGCATATTTTTCAGTTCCCTTATATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTGTAAACAATGAAACACCAGGGATTAGGTATCAGTACAATGTGCTTCCACAAGGGGGATCACCAGCAATATT [...]
+	'PSW_Pat4_199802'          ---------------------------------------------------------------------------------------------------------------GAAATGGAAAAGGAAGGAAAAATTTCAAAGATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCAGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAATATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGGGGATCACCAGCGATATT [...]
+	'PSW_Pat40_200201'         ---------------------------------------------------------------------------------------------------------------GAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCAGCAGGGTTGAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGATTTCAGAAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACGCCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGGGGATCACCAGCGATATT [...]
+	'PSW_Pat38_200201'         ---------------------------------------------------------------------------------------------------------------GAAATGGAAAAGGAAGGAAAAATTTCAAAGATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAARAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTCAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCAGCAGGGYTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTCACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGGGGATCACCAGCGATATT [...]
+	'PSW_Pat36_200201'         ---------------------------------------------------------------------------------------------------------------GAAATGGAAAGGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAGAGAARAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTSAGAGAACTTAATAGGAGAACTCAAGACTTCTGGGAAGTCCAATTAGGAATACCACACCCAGCAGGGTTGAAAAAGAAAAATTCAGTATCAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAGTTCAGAAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAAGGGGGATCACCAGCGATATT [...]
+	'PSW_Pat37_200201'         ---------------------------------------------------------------------------------------------------------------GAAATGGAAAAGGAAGGAAAAATTTCAANAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTTGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACACCCAGCAGGGTTGAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACTATACCTAGTATAAACAATGAGACACCAGGGATTAGGTATCAGTACAATGTGCTTCCACAGGGGGGATCACCAGCGATATT [...]
+	'PSW_Pat41_200201'         ---------------------------------------------------------------------------------------------------------------GAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCYATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACCCAAGACTTCTGGGAAGTCCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATACTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGCATAAACAATGAGACACCAGGGATTAGGTATCAGTACAATGAGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'PSW_Pat45_200201'         ---------------------------------------------------------------------------------------------------------------GAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGATGGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTCCAATTAGGAATACCACATCCAGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTAGATGTGGGTGATGCATATTTTTCAGTTCCCTTANATGACTTCAGGAAATATACTGCATTTACCATACCTAGTATAAACAATGAAACACCAGGGATTAGATATCAGTACAATGTGCTTCCGCAAGGGGGATCACCAGCGATATT [...]
+	'PSW_Pat46_200201'         ---------------------------------------------------------------------------------------------------------------GAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCAGCAGGGTTAAAAAAGAAAAGATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCTTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGGGGATCACCAGCGATATT [...]
+	'PSW_Pat44_200201'         ---------------------------------------------------------------------------------------------------------------GAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAACTAGGCATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACCGTACTAGATGTGGGTGATGCATATTTTTCAGTTCCTTTAGATGACTTCAGAAAGTATACTGCATTTACCATACCTAGTATAAATAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGGGGATCACCAGCTATATT [...]
+	'PSW_Pat42_200201'         ---------------------------------------------------------------------------------------------------------------GAAATGGAAAAGGAAGGAAAAATTTCAAAGATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTTTGGGAAGTTCAATTAGGAATACCACATCCAGCGGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATACTTTTCAGTTCCCTTAGATGACTTCAGGAAATATACTGCATTTACCATACCTAGTGTAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGGGGTTCACCAGCGATATT [...]
+	'PSW_Pat43_200201'         ---------------------------------------------------------------------------------------------------------------GAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAGAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGCACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACCCAAGACTTCTGGGAAGTTCAATTAGGGATACCACACCCAGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTAGATGTGGGTGATGCATACTTTTCAGTTCCTTTACATGACTTCAGGAAATATACTGCATTTACCATACCTAGTACAAATAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'RR_MAD_TO193_200501'      ---------------------------------------------GATGGCCCAAAAGTTAAACAATGGCCATTGACAGAGGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTCCAATTAGGAATACCACATCCAGCGGGGTTAAAAAAGAAAAAATCAGTAACAGTACTAGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGACGAATTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAAACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAAGGAGGATCACCAGCAATATT [...]
+	'SLMT_IVDU128_200501'      CCCATWAGTCCTATTGAAACTGTACCAGTAAAAAAACCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATCTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTGTTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAARAGAACTCAAGACTTCTGGGAAGTCCAATTAGGAATACCACATCCCGCAGGATTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAGTTCAGGAAGTACACTGCATTTACCATACCTAGCACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'SLMT_IVDU137_200501'      CCCATTAGTCCTATTGACACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAARAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAARGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATAYAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGGGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGAAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCCCAGGGAGGATCACCAGCAATATT [...]
+	'SLMT_IVDU146_200501'      CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAAYTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGACGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTACAAATAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTYCCCCAGGGAGGATCACCAGCCATATT [...]
+	'SLMT_IVDU115_200501'      CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAACTGGAAAAGGAAGGAAAAATTTCAAAAGTTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAGTTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATAACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCGGGAATTAGATATCAGTACAATGTGCTCCCACAAGGAGGATCACCAGCAATATT [...]
+	'SLMT_IVDU109_200501'      CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACGGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAGAAATCAGTAACAGTACTGGATGTAGGTGATGCATATTTCTCAGTTCCCCTAGACGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAATAATGAGACACCAGGGATTAGATATCAGTACAATGTACTCCCACAGGGAGGATCACCAGCAATATT [...]
+	'SLMT_IVDU112_200501'      CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAGGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTACAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAKGGTTAAAAAAGAAAAARTCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTRGATGATTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTATAATGTACTTCCACAGGGAGGGTCACCAGCAATATT [...]
+	'SLMT_IVDU155_200501'      CCCATTAGTCCTATTGAAACTGTACCTGTAAAAAAGCCAGGAATGGATGGYCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAARAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTAYAAACAATGAGACACCAGGGATTAGATATCARTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'SLMT_UD176_200501'        CCCATTAGTCCTATTGAAACTGTACCAGTGAAGAAACCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTAACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGTCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGACTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTGCAATTAGGAATACCACATCCTGCAGGATTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTACCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTACTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'SLMT_UD198_200501'        CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATCTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAARAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTYTCAGTTCCTTTAGATGAMTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'SLMT_UD138_200501'        CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAGGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAAAAGAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGCTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAATTCCTTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGAATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'SLMT_IVDU157_200501'      CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAGAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAGATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATGACTTTAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAAACGCCAGGGATTAGATATCAGTACAATGTGCTCCCACAGGGAGGATCACCAGCAATATT [...]
+	'SLMT_IVDU168_200501'      CCCATTAGTCCTATTGAAACTGTGCCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAGTGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTTTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGAAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'SLMT_IVDU105_200501'      CCAATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAARGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAACAGAAATATGTACAGAAATGGAAAAAGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCCCAGGGAGGATCACCAGCAATATT [...]
+	'SLMT_IVDU023_200501'      CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAAGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAARAAAGATGGTACTAAATGGAGAAAATTAGTAGATTTCAGAGARCTTAATAAGAGAACTCAAGACTTYTGGGARGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTCCCACAGGGAGGATCACCAGCAATATT [...]
+	'SLMT_IVDU033_200501'      CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAGAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAARAGAACTCAAGATTTCTGGGAGGTTCAATTAGGAATACCACATCCCTCAGGGTTAAAAAAGAAAAAATCGGTAACAGTACTAGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGATTTCAGGAAGTATACTGCATTYACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'SLMT_IVDU010_200501'      CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAATTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAGGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCGGGGATTAGATATCAGTACAATGTGCTCCCACAGGGAGGGTCACCAGCAATATT [...]
+	'RR_MAD_UF113_200501'      CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGCATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGARGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTCCAATTAGGAATACCACATCCAGCGGGGTTAAAAAAGAAAAAATCAGTAACAGTACTAGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGACGAATTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAAACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAAGGAGGATCACCAGCAATATT [...]
+	'SLMT_IVDU009_200501'      CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'SLMT_IVDU046_200501'      CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATAYAATACTCCAGTATTTGCCATAAAGAAAAARGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATKAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAGTCAGTAACAGTACTRGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGAYGAATTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'SLMT_IVDU091_200501'      CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCGYTGACAGAAGAAAAAAAAGCATTAGTAGAAATCTGTWCAGAAATGGAAAARGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGWCAGTACTAAATGGAGAAAAYTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCMGGGTTAAAAAAGAAAAAGTCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCYTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGGTATCAGTATAATGTGCTTCCCCAGGGAGGATCACCAGCRATATT [...]
+	'SLMT_IVDU096_200501'      CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAGAGTTAAACAATGGCCACTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGAAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'SLMT_IVDU079_200501'      CCYATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCCGAAAATCCATAYAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAARYTAGTGGATTTCAGAGAACTTAATAARAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAGAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTYACCATACCTAGTACAAACAATGAAACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'SLMT_IVDU063_200501'      CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGTCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAATGGAAATCTGTACAGAAATGGAAAAGGAAGGGAAAATTTCMAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAGAACAGTACTAGATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGRACTCAAGACTTTTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAGAAATCAGTAACAGTACTAGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATGAMTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'SLMT_IVDU077_200501'      CCCATTAGTCCTATTGAAACTGTACCAGTRAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTAACAGAAGARAAAAAAGCATTAVTAGAAATTTGTACTGAATTGGAAAAGGAAGGAAAAATTTCAAAARTTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCHATAAAGAAAAAAGACAGTACTAAATGGAGGAAATTAGTAGATTTCAGAGAACTYAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGTATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCTTTAGATGAATTCAGRAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'PSW_Pat34_200201'         ---------------------------------------------------------------------------------------------------------------GAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTTAGAGAACTTAATAAGAGAACTCAAGACTTTTGGGAAGTTCAATTAGGAATACCACACCCAGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATAACTTCAGGAAGTATACTGCATTTACTATACCTAGTATAAACAATGAGACACCAGGGATTAGGTATCAGTACAATGTGCTTCCACAGGGGGGATCACCAGCGATATT [...]
+	'N75_200301'               ---------------------------------------------------------------------------------------------------GAGATATGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGTCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAATAGATTTCAGAGAACTTAACAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAGTCAGTAACAGTACTGGATGTGGGAGATGCATATTTTTCAGTTCCCTTACATGAGTTCAGGAAGTACACTGCATTCACCATACCTAGTGTCAATAATGAGACACCAGGAATTAGGTACCAGTGCAATGTGCTTCCACAAGGAGGATCACCAGCAATATT [...]
+	'N77_200301'               ------------------------------------------------------------------------------------------GCATTAGTAGAGATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATAGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGAAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCCCAGGGAGGATCACCAGCAATATT [...]
+	'NL_KHM_CA34_200412'       ---------------GAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTAACAGAAGAGAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAGAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGTATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'N74_200301'               ---------------------------------------------------------------------------------------------------GAGATATGTACAGAAATGGAAAAGGAAGGGAAAATTCCAAGAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAGAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTTAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCAGCAGGGTTGAAAAAGAAAAAGTCAGTGACAGTACTGGATGTGGGTGATGCATATTTTTCAGTACCATTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'N70_200301'               ---------------------------------------------------------------------------------------AAAGCTTTAGTANNNATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGACAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAATTCCCTTAGATGACTTCAGGAAGTACACTGCATTTACCATACCTAGTACAAATAATGAGACACCAGGAATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'N72_200301'               ---------------------------------------------------------------------------------------------------GAGATATGTACAGATATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAATATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGATTTTTGGGAAGTTCAATTAGGAATACCACATCCTGCTGGGTTGAAACAGAAAAAATCAGTCACAGTATTGGATGTAGGAGATGCATATTTTTCAGTTCCTTTAAATGATTTCAGGAAATATACTGCATTCACTATACCTAGTAGTAATAATGAGACACCAGGGATTAGATATCAATACAATGTGCTACCACAGGGAGGATCACCAGCAATATT [...]
+	'NL_KHM_CD19_200412'       ---------------GAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGGCCAAAAGTTAAACAATGGCCATTGACAGAAGAGAAAAAAGCATTAATAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCTATAAAGAAAAAAGATGGCACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGTATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'PG_GM142_199801'          CCCATTAGTCCTATTGCAACTGTACCAGTAAAAAAGCCAGGGATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAATGGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAGCTCAATAAGAGAACTCAAGACTTCTGGGAGGTTCAATTAGGAATACCACATCCCGCAGGGTTGAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACAGCGTTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCGCCAGCAATATT [...]
+	'PO_Pt4_199204'            ------AGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGGATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATCTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAACCCATATAATACCCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATGAACAATGAGACACCAGGGATAAGATATCAGTACAATGTCCTGCCACAGGGAGGATCACCAGCAATATT [...]
+	'NTHvr60_200301'           ---------------------------------------------------CCAAAAGTTAAACAGTGGCCATTGACAGAAGAAAAAAAAGCATTACAGAAATTTTGTAAAGAGATGGAAAAGGAAGGAAAAATCTCAAAAATTGGGCCTGAAAATCCATACAATACTCCARTATTTGCYATAAAGAAAAAGGACAGYACTAAATGGAGAAAATTAGTAGATTTCAGAGARCTYAATAAGAGAACTCARGACTTTTGGGAAGTTCARTTAGGAATACCGCATCCAGCAGGTCTAAAACAGAAAAAATCAGTAACAGTACTAGATGTGGGAGATGCATATTTTTCAGTTCCTTTAGATAGCTTTAGAAAGTATACTGCATTCACYATACCTAGTATAAACAATGAGACACCAGGAATCAGATATCAGTACAATGTRCTWCCACAGGGAGGATCACCAGCAATATT [...]
+	'NTHvr199_200301'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAGAAAAAGGCATTAATAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGATGGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAARAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCYTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACWATGAGACACCAGGTATTAGATATCAGTATAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'NTHvr35_200301'           ---------------------------------AAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAGAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGATGGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCAGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGTATTAGATATCAGTATAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'N69_200301'               ---------------------------------------------------------------------------------------------------GAGATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAGAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGGAAATTAGTAGATTTTAGAGAACTCAATAAAAGAACTCAAGACTTTTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCATCAATATT [...]
+	'N55_200301'               ------------------------------------------------------------------------------------------GCACTAATGGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAGAAAATCAGTGACAGTACTGGATGTAGGTGATGCATATTTCTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTCACCATACCCAGTACAAACAATGAGACACCAGGGATTAGATATCAATACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'N58_200301'               ---------------------------------------------------------------------------------------AAAGCACTAGTAGAGATATGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGATGGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAGTTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGCGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTCACCATACCTAGTACAAACAATGAGACACCAGGAATTAGATACCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'N60_200301'               ------------------------------------------------------------------------------------------------------ATATGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCCGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTGGATTTCAGAGAACTAAATAAGAGAACTCAAGACTTTTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTCTCAGTTCCCTTACATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAAACACCAGGGATTAGATATCAGTACAATGTACTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'N53_200301'               ------------------------------------------------------------------------------------------GCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTGTTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACACCCCGCAGGGTTAAAAAAGAAAAAGTCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGCACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'N50_200301'               ---------------------------------------------------------------------------------------------------GAAATTTGTACAGAAATGGAGAAGGAAGGAAAGATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAGGTTCAATTAGGAATACCACACCCCTCAGGGTTAGAAAAGAAAAAGTCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGCGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'N52_200301'               ---------------------------------------------------------------------------------------------------GAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGATAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAGGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAGATCAGTAACAGTATTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGATTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCATCAATATT [...]
+	'N62_200301'               ---------------------------------------------------------------------------------------AAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAAGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAATATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGACTTTTGGGAAGTCCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTAAAAATAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'N66_200301'               ---------------------------------------------------------------------------------------AAAGCATTAATAGAGATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACCCAGGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAATATCAGTACTGGATATAGGTGATGCATATTTTTCAGTTCCTTTAGATGAATTCAGGAAGTATACTGCATTCACCATACCTAGCATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTACTGCCACAGGGAGGATCACCAGCAATATT [...]
+	'N67_200301'               ---------------------------------------------------------------------------------------AAAGCATTAGTAGAGATATGTACAGAGATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGGAAATTAGTAGATTTCAGAGAACTCAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTGAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATACTTTTCAGTTCCCTTAGACGAATTCAGGAAGTATACTGCATTCACCATACCTAGTACAAACAATGAGACACCAGGAATTAGATACCAGTACAATGTGCTCCCACAGGGAGGATCACCAGCAATATT [...]
+	'N65_200301'               ------------------------------------------------------------------------------------------------------ATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAGTTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGATGGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTCCAATTAGGAATACCACATCCTGCAGGATTAAAAGAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCTTTAGATGACTTCAGAAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGAATTAGGTATCAGTACAATGTGCTTCCACAAGGAGGATCACCAGCAATATT [...]
+	'N63_200301'               ---------------------------------------------------------------------------------------AAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAACCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACCCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAGATCAGTAACAGTACTAGATGTGGGTGATGCATATTTCTCAATTCCCTTACATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTGCCACAGGGAGGATCACCAGCAATATT [...]
+	'N64_200301'               ---------------------------------------------------------------------------------------AAAGCATTAGTAGTAATCTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAATATTTGCCATAAAGAAAAAAGACAGTACTAAGTGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTATAAATAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTGCCACAGGGAGGATCACCAGCAATATT [...]
+	'PO_Pt6_199007'            ------AGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAATAGAAATCTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCTATAAAGAAAAAAGACAGTACCAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTAGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTACACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAATACAATGTGCTCCCACAGGGAGGATCACCAGCAATATT [...]
+	'PSW_Pat26_200101'         ---------------------------------------------------------------------------------------------------------------GAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAANATTAGTAGATTTCAGAGAACTTAACAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCAGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTACATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGAATTAGATATCAGTACAATGTGCTGCCACAGGGGGGATCACCAGCGATATT [...]
+	'PSW_Pat27_200101'         ---------------------------------------------------------------------------------------------------------------GAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAACAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCAGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTACATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGAATTAGATATCAGTACAATGTGCTGCCACAGGGGGGATCACCAGCGATATT [...]
+	'PSW_Pat28_200101'         ---------------------------------------------------------------------------------------------------------------GAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCTATAAAGAAAAAGGACAGTACTAARTGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCAGCAGGGTTAAAAAAGAAAAAATCAGTRACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACARGGGGGATCACCAGCAATATT [...]
+	'PSW_Pat24_200101'         ---------------------------------------------------------------------------------------------------------------GAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAGTTAGTAGATTTCAGAGACCTTAATAAGAGAACTCAGGACTTCTGGGAAGTTCAATTAGGAATACCACATCCAGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGATTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCTCAGGGGGGATCACCAGCGATATT [...]
+	'PSW_Pat22_200101'         ---------------------------------------------------------------------------------------------------------------GAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCAGCAGGGTTGAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATACTTTTCAGTTCCTTTAGATAACTTCAGGAAATATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGGGGATCACCAGCGATATT [...]
+	'PSW_Pat23_200101'         ---------------------------------------------------------------------------------------------------------------GAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACCAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCAGCAGGGTTAAAAAAGAAGAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGGGGATCACCAGCGATATT [...]
+	'PSW_Pat29_200101'         ---------------------------------------------------------------------------------------------------------------GAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTTAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCAGCAGGATTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATACTTTTCAGTTCCATTAGATGACTTCAGGAAATATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGGGGATCACCAGCGATATT [...]
+	'PSW_Pat32_200201'         ---------------------------------------------------------------------------------------------------------------GAGATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAGTTAGTAGACTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCAGCAGGGTTGAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGATTTCAGAAAGTATACTGCATTTACCATACCTAGCAGAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGGGGATCACCAGCGATATT [...]
+	'PSW_Pat33_200201'         ---------------------------------------------------------------------------------------------------------------GAGATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCAGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATACTTTTCAATTCCCTTACATGACTTCAGGAAATATACTGCATTTACCATACCTAGCATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAAGGGGGATCACCAGCGATATT [...]
+	'PSW_Pat31_200201'         ---------------------------------------------------------------------------------------------------------------GAAATGGAAAAGGAAGGAAAGATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCTATAAAGAAAAAAGACAGTACCAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCAGCAGGGTTAAAAAGGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAAATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGGGGATCACCAGCGATATT [...]
+	'PSW_Pat3_199802'          ---------------------------------------------------------------------------------------------------------------GAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAGAACAGTACTAGATGGAGAAAATTAGTAGACTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCAGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGGGGATCACCAGCGATATT [...]
+	'PSW_Pat30_200101'         ---------------------------------------------------------------------------------------------------------------GAAATGGAAAAGGAAGGAAAAATCTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGATTTCTGGGAAGTTCAATTAGGAATACCACATCCAGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAAGGGGGATCACCAGCGATATT [...]
+	'PSW_Pat21_200001'         ---------------------------------------------------------------------------------------------------------------GAAATGGAAAAGGAAGGAAAGATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCTATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACACCCAGCAGGGTTAAAAAAGAAAAAAGCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'PSW_Pat12_199901'         ---------------------------------------------------------------------------------------------------------------GAAATGGAAAAGGAAGGAAAGATTTCAAAAATAGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTGGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCGCATCCAGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTACTTCCACAGGGGGGATCACCAGCAATNTT [...]
+	'PSW_Pat13_199901'         ---------------------------------------------------------------------------------------------------------------GAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAGGTTCAATTAGGAATACCACACCCAGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGATTTTAGAAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGGGGATCACCAGCAATATT [...]
+	'PSW_Pat11_199901'         ---------------------------------------------------------------------------------------------------------------GAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACCCCAGTATTTGCCATAAAGAAAAAAGACAGCACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCAGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGGGGATCACCAGCNATATT [...]
+	'PSW_Pat1_199802'          ---------------------------------------------------------------------------------------------------------------GAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCAGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTACACTGCATTTACTATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGGGGATCACCAGCGATATT [...]
+	'PSW_Pat10_199901'         ---------------------------------------------------------------------------------------------------------------GAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACACCCAGCAGGGTTAAAGAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTACATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGGGGATCACCAGCGATATT [...]
+	'PSW_Pat14_200001'         ---------------------------------------------------------------------------------------------------------------GAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCAGCAGGGTTAAAAAAGAAGAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGAATTAGATATCAGTACAATGTGCTTCCACAGGGGGGATCACCAGCGATATT [...]
+	'PSW_Pat2_199802'          ---------------------------------------------------------------------------------------------------------------GAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGACTTCAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCAGCAGGGTTAAAAAAGAAAAAATCAGTGACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGATTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTGCCACAGGGGGGATCACCAGCANTATT [...]
+	'PSW_Pat20_200001'         ---------------------------------------------------------------------------------------------------------------GAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCAGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAATAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGGGGATCACCAGCGATATT [...]
+	'PSW_Pat18_200001'         ---------------------------------------------------------------------------------------------------------------GAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACACCCAGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTGGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTGTAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGGGGGTCACCAGCGATATT [...]
+	'PSW_Pat15_200001'         ---------------------------------------------------------------------------------------------------------------GAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGTGAAGTTCAATTAGGAATACCACATCCAGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTATTGGATGTAGGTGATGCATACTTTTCAATTCCCTTACATGACTTCAGGAAATATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGAATTAGATATCAGTACAATGTGCTTCCACAAGGGGGATCACCAGCGATATT [...]
+	'PSW_Pat17_200001'         ---------------------------------------------------------------------------------------------------------------GAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAACCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGATTTCTGGGAAGTTCAATTAGGAATACCACATCCAGCAGGGTTAAAAAGGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTCACCATACCTAGTATAAACAATGAGACACCAGGAATTAGATATCAGTACAATGTGCTTCCACAGGGGGGATCACCAGCGATATT [...]
+	'SLMT_UD213_200501'        CCTATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTAACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATCTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCTATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAATCCAATTAGGAATACCACATCCCTCAGGATTAAAAAAGAAAAAATCAGTAACAGTACTAGATGTRGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTCACCATACCTAGTACAAACAATGCGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'VC_pat257_199901'         ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAGGAAGGRAAAATYTCAAAAATTGGGCCTGAAAACCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGACTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCRCATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTAGGTGATGCATATTTTTCAGTTCCTTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'VC_pat271_199901'         ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAGAATTGGACCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACACCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTAGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTYACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'VC_pat272_199901'         ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAGAATTGGACCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTRACAGTACTAGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTYACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'VC_pat256_199901'         ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAGGAAGGGAAAATTTTCAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAGAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGYGAACTTTATAAGAAAACTCAAGACTTTKGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAACGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'VC_pat207_199901'         ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTTTTTGCAATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGATTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCGGTAACAGTACTGGATGTGGGTGATGCATACTTTTCAGTCCCTTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGACTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'VC_pat252_199901'         ---------------------------------------------------------------------------------------------------------------GAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTCATAAATGGGAAAAAATAGTAGATTTCAGAGGACTTAATAAGAGAACTCGAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGCAAAAATCAGTAACAGTACTGGATGAGGGTGATGCATACTTTTCAGTTCCCTTAGATGACTTCAGAAAGTATACTGCATTTACTATACCTAGCATAAATAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'VC_pat273_199901'         ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTYGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGRGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAARAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGACTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'VC_pat53_199901'          ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCTATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAACGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'VHE_Pat1_200101'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTGGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAGAATCCATACAATACTCCAGTGTTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACAYCCWGCAGGGTTAAAAAAGAAAAAATCAGTGACAGTACTAGATGTGGGTGATGCATATTTTTCAGTTCCCTTACATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTRTAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAAGGAGGATCACCAGCAATATT [...]
+	'VC_pat49_199901'          ---------------------------------------------------------------------------------------------------------TGCACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTGCTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTACACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGAYTAGATATCAGTACAATGTGCTTCCACAAGGAGGATCACCAGCAATATT [...]
+	'VC_pat287_199901'         ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTTTGGGAGGTTCAATTAGGAATACCACATCCAGCAGGACTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTACCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'VC_pat296_199901'         ---------------------------------------------------------------------------------------------------------TGTACAGATATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTGTTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGAAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTATTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'VC_pat20_199901'          ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAARGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTATTGGATGTGGGTGATGCATATTTTTCAGTGCCCTTAGATGACTTYAGAAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'US3_200111'               CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAACAGAAATTTGTACAGAAATGGAGAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACWCCAGTATTTGCYATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTRCTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTAYACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAAGGAGGATCACCAGCAATATT [...]
+	'US4_200111'               CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAGCAATGGCCATTGACAGAGGAAAAAAAAGCATTRGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAARATTTCAAAAATTGGGCCTGAAAATCCATACAATACKCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTYAGAGARCTTAATAAGAGAACTCAGGACTTCTGGGAAGTCCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAARAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGAAAGTATACTGCATTTACCATACCTAGTATAAAYAATGAGACACCAGGGATTAGATATCAGTACAATGTACTTCCACAAGGAGGATCACCAGCAATATT [...]
+	'V2000_10_199801'          ------------------------------------------------------------------------------------AAAAAAGCATTAGTAGAAATCTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAATTCAATTAGGAATACCACATCCAGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGCGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'US2_200111'               CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTCAATAAGAAAACTCAAGATTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAGAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTTAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'TTDdp15_200106'           ---------------------GTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAGGTTAAACAATGGCCATTGACAGAAGAARAAAAAGCATTAACAGACATTTGTGCAGATATGGAAAAGGAAGGAAAAATCTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGATAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCARTTAGGAATACCGCATCCTGCAGGACTAAAAAAGAAAAAATCAGTAACAGTGTTAGATGTAGGGGATGCATATTTTTCAGTTCCCTTATATGACTTTAGAAAGTATACCGCATTTACTATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAAGGAGGATCRCCAGCAATATT [...]
+	'US1_200111'               CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACCGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGAAAGTATACTGCCTTCACCATACCTAGTATAAACAATGAGACACCAGGAATTAGATACCAGTACAATGTACTTCCACAAGGAGGATCACCAGCTATATT [...]
+	'V2000_12_199801'          ------------------------------------------------------------------------------------AAAAAAGCATTAGTAGAAATCTGTACCGARATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTTTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTATAAATAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'V2000_5_199801'           ------------------------------------------------------------------------------------AAAAAAGCGTTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATCTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATCCCACATCCCTCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCATTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACCCCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAGTATT [...]
+	'VC_pat103_199901'         ---------------------------------------------------------------------------------------------------------------GAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACAGCATTTACCATACCTAGCACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTACTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'V2000_3_199801'           ------------------------------------------------------------------------------------AAAAAAGCATTAATGGAAATTTGTGCAGAAATGGAAAAGGAAGGGAAAATTTCAAAAGTTGGGCCTGAAAATCCATACAATACTCCAATATTTGCCATAAAGAAAAAAGACAGTACTAAGTGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGGATACCACATCCCGCAGGATTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCTTTAGATGAGTTCAGGAAGTACACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCTCAGGGAGGATCACCAGCAATCTT [...]
+	'V2000_15_199801'          ------------------------------------------------------------------------------------AAAAAAGCATTAGTAGAAATTTGTACAGAAATGGARAAGGAAGGAAAAATTTCAAGAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGATTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAACAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTAYAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'V2000_19_199801'          ------------------------------------------------------------------------------------AAAAAAGCATTAGCAGAAATCTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGACGAATTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTATAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'VHE_Pat10_200101'         CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTAACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTCCCACAAGGAGGATCACCAGCAATATT [...]
+	'VHE_Pat25_200101'         CCCATTAGTCCTATTGAAACTGTACCAGTGAAAAAACCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTAACAGAAGAAAAAAAAGCATTGACAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAGAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTTTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACTGTACTAGATGTGGGTGATGCATATTTTTCAGTACCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGAATTAGATATCAGTACAATGTACTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'VHE_Pat26_200101'         CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAATAGAAATTTGTACAGAAATGGAGAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAACTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGATTTCTGGGAAGTGCAGTTAGGAATACCACACCCCGCAGGATTAAAAAAGAAAAAATCAGTAACAGTACTGGACGTGGGTGATGCATAYTTCTCAGTTCCTTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'VHE_Pat27_200101'         CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTAACAGAAGAAAAAAAAGCATTGGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAARGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTCAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTATTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAAGGAGGATCACCATCAATATT [...]
+	'VHE_Pat24_200101'         CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGTCCCAAGGTTAAACAATGGCCATTGACAGAAGAAAAAAGAGCATTGACAGAAATTTGCACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATAGGGCCTGAAAACCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACGAAATGGAGAAAATTAGTAGACTTCAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTATTAGATGTGGGTGATGCATACTTTTCAGTTCCATTAGATGACTTTAGGAAGTATACTGCATTTACCATACCTAGTATAAATAATGAGACACCAGGAGTTAGATATCAATACAATGTGCTCCCACAGGGAGGATCGCCAGCAATATT [...]
+	'VHE_Pat22_200101'         CCCATAAGTCCTATTGAGACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAGAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGGACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTCCCCTTAGATGACTTTAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGAATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'VHE_Pat23_200101'         CCTATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGTCCAAAGGTTAAACAATGGCCATTAACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCTGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAGTTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTGAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCATTAGATGATTTCAGAAAGTATACTGCATTTACCATACCAAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTCCCACAAGGAGGATCACCAGCAATATT [...]
+	'VHE_Pat28_200101'         CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAATGGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGATTAAAACAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTATAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'VHE_Pat31_200101'         CCCATTAGTCCTATTGAAACTGTACCAGTGAAAAAACCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTAACAGAAGAAAAAAAAGCATTGACAGAAATTTGTTTAGAAATGGAAAAAGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTTTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAGAAATCAGTAACTGTACTAGATGTGGGTGACGCATATTTTTCAGTACCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAAYAATGAGACACCAGGAATTAGATATCAGTACAATGTACTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'VHE_Pat32_200101'         CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAACCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAGAAAAAAGCATTAACAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCTCAGGGTTAAAAAAGAAAAAATCAGTAACAGTATTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAGTTCAGGAAGTATACTGCATTTACCATACCTAGTAGAAACAATGAGACGCCAGGAATTAGATATCAGTACAATGTGCTGCCACAGGGAGGATCACCAGCAATATT [...]
+	'VHE_Pat30_200101'         CCCATCAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAGAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACACCCCGCAGGATTAAAAAAGAAAAAATCAGTAACAGTACTGGACGTGGGTGATGCATACTTTTCAGTTCCTTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'VHE_Pat29_200101'         CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAACCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTGATAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAATATTTGCCATAAGGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGGGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGGATACCACATCCCGCAGGATTAAAAAAGAAAAAATCAGTAACAGTATTGGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATGACTTCAGGAAATATACTGCATTTACCATACCTAGTAGAAACAATGAGACACCAGGAATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'VHE_Pat3_200101'          CCCATTAGTCCTATTGAAACTGTACCAGTGAAAAAACCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTGGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAACCCATACAATACTCCAGTATTCGCCATAAAGAAAAAAGACAGTACCAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCTCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCCAGTATAAACAATGAGACACCAGGAATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCGCCTGCAATATT [...]
+	'VHE_Pat21_200101'         CCCATTAGTCCTATTAAAACTGTACCAGTAAAAAAACCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAGAAAAAAGCATTGATAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATAGGGCCTGAAAATCCATATAATACTCCAGTATTTGCTATAAGGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAGCTTAATAAAAGAACTCAAGATTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCGGGATTAAAAAAGAAAAAATCAGTAACAGTATTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAATAATGAGACACCAGGAATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCCGCAATATT [...]
+	'VHE_Pat14_200101'         CCCATAAGTCCTATTGAAACTGTACCAGTAAAGAAGCCAGGAATGGATGGCCCAAGAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATCTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAGTTAGTAGATTTTAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCGCATCCAGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATGACTTTAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGAATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'VHE_Pat15_200101'         CCCATAAGTCCTATTGAAACTGTACCAGTAAAAAAACCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTGGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAGGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGATTAAAAAAGAAAAAATCAGTAACAGTATTGGATGTGGGTGATGCCTATTTTTCAGTTCCCTTAGATGACTTCAGGAAATATACTGCATTCACCATACCTAGTATAAATAATGAGACACCAGGAATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCCGCAATATT [...]
+	'VHE_Pat13_200101'         CCCATTAGTCCTATTGAAACTGTACCAGTGAAAAAACCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTAACAGAAGAAAAAAAAGCACTGACAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTTTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACTGTACTRGATGTGGGTGATGCATATTTTTCAGTACCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGAATTAGATATCAGTACAATGTACTTCCACAGGGAGGGTCACCAGCAATATT [...]
+	'VHE_Pat11_200101'         CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTGACAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAACCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGGGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTATTGGATGTGGGAGATGCATATTTTTCAGTACCCTTAGATGACTTCAGGAAGTATACTGCATTTACTATACCTAGTATGAACAATGAGACACCAGGAATTAGATATCAGTAYAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'VHE_Pat12_200101'         CCCATTAGTCCTATTGAAACTGTACCAGTGAAAAAACCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTGATAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTYTGGGAAGTTCAATTAGGAATACCACATCCCTCAGGGTTAAAAAAGAAAAAATCAGTAACAGTATTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATRACTTCAGGAAGTATACTGCATTTACCATACCTAGTGTAAACAATGAGACACCAGGAATTAGATATCAGTACAATGTGCTGCCACAGGGAGGATCACCAGCAATATT [...]
+	'VHE_Pat16_200101'         CCCATTAGTCCTATTGACACTGTACCAGTGAAAAAACCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTAACAGAAGAAAAAAAAGCATTGACAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGGACTCAAGACTTTTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACTGTACTAGATGTGGGTGAYGCATATTTTTCAGTACCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGAATTAGATATCAGTACAATGTACTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'VHE_Pat2_200101'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTGGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAGGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATCCCTAGTATAAACAATGAGACACCAGGGATTAGGTATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'VHE_Pat20_200101'         CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAACCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCTTTGRTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCTATAAGGAAGAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCYGCAGGATTAAAAAAGAAAAAATCAGTAACAGTATTGGATGTGGGTGATGCATATTTTTCAGTTCCTCTAGATGAATTYAGGAAATATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGAATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCTGCAATATT [...]
+	'VHE_Pat19_200101'         CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAACCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTGATAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCTATAAGGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGATTAAAAAAGAAAAAATCAGTAACAGTATTGGATGTGGGTGATGCATATTTTTCAGTTCCTCTAGATGAATTCAGGAAATATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGAATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCTGCAATATT [...]
+	'VHE_Pat17_200101'         CCCATTAGTCCTATTGAAACTGTACCAGTGAAAAAACCAGGAATGGATGGCCCAAGAGTTAAACAATGGCCATTAACAGAAGAAAAAAAAGCATTGACAGAAATTTGTGAAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGATAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACTGTACTAGATGTGGGTGACGCATATTTTTCAGTACCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTGTAAACAATGAGACACCAGGAATTAGATATCAGTACAATGTACTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'VHE_Pat18_200101'         CCCATTAGTCCTATTGAAACTGTACCAGTGAAAAAACCAGGAATGGATGGCCCGAAAGTTAAACAATGGCCAYTGACAGAAGAAAAGAAAGCATTGATAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAGATTGGGCCTGAAAATCCATACAATACTCCAATATTTGCCATAAAGAAAAAAGATGGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGACTTATGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGATTTCAGGAAGTATACTGCATTTACCATACCTAGTGTAAACAATGAGACACCAGGAATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCGCCAGCAATATT [...]
+	'TRA1116_200101'           CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATATGTACAGAAATGGAAAAAGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGATAGTACTAAATGGAGGAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACACCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATACTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTGTAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'SLMT_UD415_200501'        CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGGATGGATGGCCCAAAGGTTAAACAATGGCCATTGACAGAGGAAAAGAAAGCATTAGTAGAAATTTGTACAGAGATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTGTTTGCTATAAAGAAAAAAGACAGTACTAAATGGAGARAATTAGTAGATTTTAGAGAACTTAATAAAAGGACACAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAGAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTACACTGCATTTACCATACCCAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'SLMT_UD426_200501'        CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAGAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTTAGGAAATATACTGCTTTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCTCAGGGAGGATCACCAGCGATATT [...]
+	'SLMT_UD427_200501'        CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAGAGTTAAACAATGGCCATTGACAGAAGAAAAAAGAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTGGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCYGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAAGGAGGATCACCAGCAATATT [...]
+	'SLMT_UD410_200501'        CCCATTAGTCCTATTGAAACTGTACCAGTAMMMAAGCCAGGAATGGATGGCCCAAGAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTAGGTGATGCATATTTTTCAGTTCCCTTAGATAACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCRGGGATTAGATATCAGTACAATGTGCTCCCACAGGGAGGATCWCCAGCRATATT [...]
+	'SLMT_UD394_200501'        CCCATTAGTTCTATTGACACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCCTACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGGAAATTAGTAGATTTTAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGACGTGGGTGATGCATATTTTTCAGTGCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTCCCACAGGGAGGATCACCAGCAATATT [...]
+	'SLMT_UD398_200501'        CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAACCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTGTTTGCCATAAAGAAAAAAGATAGTACTAAATGGAGAAAATTAGTAGATTTCAGGGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTYCAATTAGGAATAYCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGACGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGTGGATCACCAGCAATATT [...]
+	'SLMT_UD452_200501'        CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCTTTAGTAGAAATCTGTACAGAGATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGASAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAGAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGATTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'SLMT_UD518_200501'        CCCATTAGTYCTATTGAAACTGTACCAGTAAAAAAACYAGGAATGGATGGCCCAAAAGTTAAGCARTGGCCATTGACAGAAGAAAAAAGAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATAYAATACTCCAGTATTTGCCATAARGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAARAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCYGCAGGGTTWWWWWWGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAATATACTGCATTTACCATACCTAGYACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTACCACAGGGARGATCACCAGCTATATT [...]
+	'SLMT_UD549_200501'        CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAGAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAARTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTCCCACAGGGAGGATCACCAGCAATATT [...]
+	'SLMT_UD517_200501'        CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAGATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTGTTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGACGAATTTAGGAAGTACACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCCCAGGGAGGATCACCAGCAATATT [...]
+	'SLMT_UD469_200501'        CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAGTGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAGAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTCCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAGGTATACTGCATTTACCATACCCAGTATAAACAATGAGACACCAGGGGTTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'SLMT_UD492_200501'        CCCATTAGTCCTGTTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCGAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGGAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGGGATGCATATTTTTCAGTTCCTTTACATGACTTCAGGAAATATACTGCATTTACCATACCTAGTACGAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'SLMT_UD388_200501'        CCCATTAGCCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGTCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCARAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACACCCYGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAARTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTCCCACAGGGGGGATCACCAGCAATATT [...]
+	'SLMT_UD269_200501'        CCCATTAGTCCTATTGAAACTGTGCCAGTAAAAAAGCCAGGGATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAGATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTGTTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAGTTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTGCTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'SLMT_UD284_200501'        CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAGGCATTAGTAGARATTTGTGCAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAGGTTCAATTAGGAATACCACATSCYGCAGGGTTAAAAAAGAAAAAATCAGTAGCAGTACTGGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATAACTTCAGGAAGTATACTGCATTTACCATACCCAGTACAAACAATGAGACACCGGGGATTAGATATCAGTACAATGTGCTCCCGCAGGGAGGATCACCAGCAATATT [...]
+	'SLMT_UD294_200501'        CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGYCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGRAAATTAGTAGATTTTAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTYCAAYTAGGAATACCACATCCTGCAGGRTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCTTTAGATGACTTCAGGAAGTACACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTWCAATGTGCTTCCACAAGGAGGATCACCAGCAATATT [...]
+	'SLMT_UD230_200501'        CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAGAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAGGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACTGTACTAGATGTGGGTGATGCATATTTTTCAGTTCCTTTAGATGACTTCAGGAAGTATACTGCATTCACCATACCTAGTATAAACAATGAGACMCCGGGGGTTAGATATCAGTWCAATGTGCTCCCACAGGGAGGATCACCAGCAATATT [...]
+	'SLMT_UD223_200501'        CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGARATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGACTTCAGAGAACTTAATAAGAGAACYCAAGACTTCTGGGAAGTTCAGTTAGGAATACCACATCCTGCAGGGTTGAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAYTTCMGGAAGTATACAGCATTTACTATACCTAGTATAAACAATGAGACACCAGGAATTAGGTATCAGTAYAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'SLMT_UD227_200501'        CCTATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTAACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACGGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTTTGGGAAGTACAGTTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTTGGTGATGCATATTTTTCAGTTCCCTTAGATAACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAATAATGAGACACCGGGGATTAGATATCAGTACAATGTGCTCCCACAGGGAGGATCACCAGCAATATT [...]
+	'SLMT_UD326_200501'        CCCATTAGTCCTATTGAAACTGTACCAGTAAAGAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATCTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAGAATTGGGCCTGAAAATCCATATAATACTCCAGTGTTTGCTATAAAGAAAAAAGACAGTACTAAATGGAGGAAGYTAGTAGATTTTAGAGAGCTTAATAAAAGAACTCAAGATTTTTGGGAGGTTCAACTAGGAATACCGCATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTGCTGGATGTGGGAGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTCCCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTATAATGTGCTTCCACAGGGAGGATCGCCAGCAAWATT [...]
+	'SLMT_UD353_200501'        CCCATTAGTCCTATTGARACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTRGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGAYRGYACTARATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAATAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACYATACCTAGTACAAACAATGAGACACCRGGGATYAGATAYCAGTACAATGTGCTCCCACAGGGAGGATCACCAGCAATATT [...]
+	'SLMT_UD367_200501'        CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAGATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAARAAAAACAGTAATAGATGGAGAAAATTAGTAGACTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAACAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCGGGGATTAGATATCAGTACAATGTACTCCCACAGGGAGGATCACCAGCAATATT [...]
+	'SLMT_UD342_200501'        CCCATAAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGCTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTACAAAYAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAAGGAGGATCACCAGCAATATT [...]
+	'SLMT_UD333_200501'        CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGACCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGARAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTRCTAAATGGAGGAAATTAGTAGATTTTAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCTCATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTGCCCTTAKATGATTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACGCCAGGAATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'SLMT_UD335_200501'        CCCATTAGTCCTATTGAMACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGATAGCACTAAATGGAGRAAATTAGTAGATTTTAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAGGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'SLMT_UD552_200501'        CCCATCAGCCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATCTGTACCGAAATGGAAAAGGAAGGAAAAATTTCAAGAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGGAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCAGCAGGATTAAAGAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCTTTAGATGATTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGGTTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'SP_UFC_E_199108'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGGCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCAYTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAASAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGACTTCAGAGAACTTAATAAGAGAACTCAAGACTTTTGGGAAGTTCAATTAGGAATACCACATCCCTCAGGGTTAAAAAAGAAAAATTCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAAACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'SP_LP19_200106'           ------------------------------------------------------AAGGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAATGGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGGGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCGATATT [...]
+	'SP_LP2_200106'            ------------------------------------------------------------------------------------------GCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTGTTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAGGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGATTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTGCCACAGGGGGGATCACCAGCGATATT [...]
+	'SP_UFC_D_199107'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGACTTCAGAGAACTTAATAAGAGAACTCAAGACTTTTGGGAAGTTCAATTAGGAATACCACATCCCTCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAAACACCAGGGATTAGATATCAGTACAATGTGCTGCCACAGGGAGGATCACCAGCAATATT [...]
+	'SP_UFC_A_199201'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAARAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATCCCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'SP_UFC_B_199201'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTAACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAGAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCTATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACGGTACTGGATGTGGGTGATGCATATTTTTCAATTCCATTAGACGACTTTAGGAAGTATACTGCATTTACCATACCTAGTATTAACAATGAGACACCAGGGATTAGATACCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'SP_LP28_200106'           ------------------------------------------------------------------------------------------------------------------ATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAGTGGAGGAAATTAGTAGATTTCAGGGAACTCAATAAAAGAACTCAGGACTTTTGGGAAGTTCAATTAGGAATACCCCACCCAGCGGGGTTAAAAAAGAACAAATCAGTAACAGTACTAGATGTGGGGGATGCATATTTTTCAGTTCCATTAGATAACTTCAGAAAGTATACTGCATTCACCATACCAAGTATAAACAATGAGACACCAGGGATCAGATACCAGTACAATGTACTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'SWC_1214_199704'          ------------------------------------------------------------AAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAGATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAATTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCCAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTNCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'SWC_7891_199611'          ------------------------------------------------------------AAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTTTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATACTTTTCAGTTCCCTTAGATGACTTTAGAAAGTATACTGCATTTACTATACCTAGTGTAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'SU015_199901'             CCTATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAGAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTCTTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGACTTCAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'SP_LP29_200106'           ------------------------------------------------------AAAGTTAAACAATGGCCATTGACAGAGGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAAGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGTATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'SP_LP32_200106'           ------------------------------------------------------------------------------GAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAGAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTGGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAGAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTATAATGTGCTGCCACAGGGAGGATCACCAGCAATATT [...]
+	'SM_02YE509_200201'        CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAGAGTTAAACAATGGCCATTAACAGAAGAAAAAAAAGCATTAGTRGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAGAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGYACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCTCAGGATTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGACGAATTCAGGAAGTATACTGCATTCACCATACCGAGCACAAACAATGAGACACCAGGGATTAGATATCAGTATAATGTGCTTCCACAGGGAGGATCACCAGCARTATT [...]
+	'SLMT_UD609_200501'        CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAGGATGGTACTAAATGGAGGAAATTAGTAGATTTCAGAGAGCTTAATAAAAGAACTCAAGACTTCTGGGAAATTCAATTAGGAATACCACACCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTRCTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGCGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAAGGAGGATCACCAGCAATATT [...]
+	'SM_00YE084_200001'        CCCATTAGTCCTATTGAAACTATACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTGGAAATTTGTACAGAAATGGAGAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGATTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCATTAGACGACTTTAGGAAGTATACTGCATTTACAATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'SLMT_UD598_200501'        CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGACGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATCTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCSCAGGGTTAAAAAAGAAAAAGTCAGTAACAGTATTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGAAAGTATACTGCATTYACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGGTCACCAGCAATATT [...]
+	'SLMT_UD578_200501'        CCCATTAGTCCTATTAAAACTGTGCCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCTTTAGTAGAAATTTGTACRGAAATGGAAAAGGAAGGAAAAATCTCAAAAATTGGTCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTRGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGATTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAKATGATTTCAGGAAGTACACTGCATTCACCATACCTAGTATCAACAATGAGACACCAGGAATTAGGTACCAATACAATGTGCTTCCACAAGGAGGGTCACCAGCAATATT [...]
+	'SLMT_UD595_200501'        CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTCAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATCTGTACARAAATGGAAAAAGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAGTCAGTAACAGTACTGGATGTGGGTRATGCATACTTTTCAGTTCCCTTAGAKGWCTTCAGGAAGTATWCTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTACTTCCACAKGGAGGATCACCAGCAATATT [...]
+	'SM_01YE373_200101'        CCCATTAGCCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTAACAGAAGAAAAAAAAGCATTAATAGAAATCTGTACAGAAATGGAAAAGGAGGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAGTTAGGAATACCACATCCCTCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTCACTATACCTAGTTTAAACAATGAGACACCAGGGATTAGATATCAGTATAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'SM_01YE397_200101'        CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAATATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTAAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTATTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGACGACTTCAGAAAGTATACTGCATTTACCATACCTAGTTTAAACAATGAAACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'SM_02YE507_200201'        CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAATAGAAATATGTTCAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAGTTAGGAATACCACATCCCTCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGCATTCAGAAAGTACACTGCATTCACTATACCTAGTTTAAACAATGAGACACCAGGGATTAGATATCAGTATAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'SM_01YE395_200101'        CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAATAGAAATATGTTCAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAACTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTCCAGTTAGGAATACCACATCCCTCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGCATTCAGRAAGTACACTGCATTCACTATACCTAGTTTAAACAATGAGACACCAGGGATTAGATATCAGTATAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'SM_01YE381_200101'        CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTACTAGAAATTTGTGCAGAAATGGAAAAAGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTTAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCAGCGGGGCTAAAAAAGAAAAAATCAGTAACAGTATTAGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATAACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTATAACGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'SM_01YE382_200101'        CCAATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAATAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTACAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTCTTTGCTATAAGGAAAAAAGACAGTACTAAATGGAGAAAATTAGTTGATTTCAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCAGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGGGATGCATATTTTTCAGTCCCTCTAGATAATTTCAGGAAGTATACTGCATTCACTATACCWAGTACAAATAATGAGACACCAGGGATTAGATATCAGTATAATGTGCTACCACAGGGAGGATCACCAGCAATATT [...]
+	'GRSPR24_200301'           ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAGGAAGGGAAAATCTCAAAAGATGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGGGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCYGCAGGGTTAAAAAAGAAAARATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGAKTAGATATCAGTACAATGTGCTTCCACAGGGGGGATCACCAGCAATATT [...]
+	'4003914_200401'           ------------------------------------------------------------------------------------------------------NTTTGTGCAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGACCTGAAAATCCCTATAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTCAATAAAAGAACTCAAGACTTCTGGGARGTTCAATTAGGGATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTCACCATACCTAGTACAAACAATGAGACACCAGGGGTTAGATACCAGTACAATGTGCTGCCACAAGGAGGATCACCAGCAATATT [...]
+	'4003912_200401'           ------------------------------------------------------------------------------------------------------NTTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATAYAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTYTGGGAAGTTCAATTAGGAATACCACATCCAGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAARTACACTGCCTTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTCCCACAGGGAGGATCACCAGCAATATT [...]
+	'4003911_200401'           ------------------------------------------------------------------------------------------------------NTTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAGAATCCATACAATACTCCAATATTTGCTATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACCCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAACAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATGACTTCAGGAAGTACACTGCATTYACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'4004043_200401'           ------------------------------------------------------------------------------------------------------NTTTGTACAGAAATGGAAAAAGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAATATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAGTTAGTAGACTTCAGGGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGCTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACAATACCTAGTTTAAATAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTCCCACAGGGAGGATCACCAGCAATATT [...]
+	'4004131_200401'           ------------------------------------------------------------------------------------------------------NTTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATAGGGCCTGAAAATCCATATAATACTCCAATATTTGCCATAAAGAAAAAAGATAGTACTAAATGGAGAAAGCTAGTAGATTTTAGAGAACTAAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGGATACCACATCCCGCAGGGCTGAAACAGAAAAAATCAGTAACAGTACTAGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACWGCATTCACCATACCTAGTATAAACAATGAGACACCAGGAATAAGATATCAGTACAATGTGCTGCCACAGGGAGGATCACCAGCAATATT [...]
+	'4004045_200401'           ------------------------------------------------------------------------------------------------------NTTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGGGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGGATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGACGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAATAATGAGACACCAGGAATTAGATACCAGTACAATGTGCTGCCACAGGGAGGATCACCAGCAATATT [...]
+	'4004044_200401'           ------------------------------------------------------------------------------------------------------NTTTGCACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAGCTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATACTTTTCAGTTCCCTTAGATGACTTTAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACGCCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'4003834_200401'           ------------------------------------------------------------------------------------------------------NTTTGTACAGAAATGGAGAAGGAGGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACGCCAGTATTTGCTATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'4003830_200401'           ------------------------------------------------------------------------------------------------------NTTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGGGAACTTAATAAGAGAACTCAAGACTTTTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAGAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAATATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTACCACAGGGAGGATCCCCAGCAATATT [...]
+	'4003758_200401'           ------------------------------------------------------------------------------------------------------NTTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAGAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTTTGGGAGGTTCAATTAGGAATACCACATCCCTCAGGATTAAAACAGAAAAAATCAGTAACGGTACTGGATGTGGGTGATGCATACTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTCACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'4003711_200401'           ------------------------------------------------------------------------------------------------------NTTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAGTTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'4003831_200401'           ------------------------------------------------------------------------------------------------------NTTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAACACTCCAGTATTTGCTATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCGGGGTTAAAAAAGAAAAAATCAGTAACAGTACTAGATGTGGGTGATGCATATTTCTCCATTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGAATTAGGTATCAGTACAATGTGCTCCCACAGGGGGGATCACCAGCAATATT [...]
+	'4003833_200401'           ------------------------------------------------------------------------------------------------------NTTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAGAATAGGGCCTGAAAATCCATATAATACTCCAGTGTTTGCCATAAAGAAAAAAGATAGTACTAAATGGAGAAAGTTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTCTCAGTCCCTTTAGATGACTTCAGGAAGTACACTGCATTTACCATACCCAGTGTAAATAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCGCCAGCTATATT [...]
+	'4003832_200401'           ------------------------------------------------------------------------------------------------------NTTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAACACTCCAGTATTTGCTATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAARAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACACCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTAGATGTGGGTGATGCGTATTTCTCCATTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTCCCACAGGGGGGATCACCAGCAATATT [...]
+	'4004184_200401'           ------------------------------------------------------------------------------------------------------NTTTGTACAGAAATGGAAAAGGAAGGTAAAATTTCAARGATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCTCATCCCTCAGGTTTAAARAAGAAAAAGTCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGAAAGTATACTGCATTCACTATACCTAGTACAAACAATGAGACACCAGGAATTAGATACCAGTACAATGTGCTTCCACAGGGAGGATCACCRGCAATATT [...]
+	'4004344_200401'           ------------------------------------------------------------------------------------------------------NTTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAACCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAGTGGAGAAAATTAGTGGATTTCAGAGAACTTAATAAGAAAACACAAGACTTYTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTATTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'4004342_200401'           ------------------------------------------------------------------------------------------------------NTTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAGATTGGGCCTGAAAATCCATACAATACTCCGGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTGGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGATTTTAGGAAATACACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCATCAATATT [...]
+	'4004223_200401'           ------------------------------------------------------------------------------------------------------NTTTGCACAGAGATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGATAGTACCAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTATTGGATGTGGGTGATGCATACTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTGTAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'4004345_200401'           ------------------------------------------------------------------------------------------------------NTTTGTACAGAATTGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAATATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAACAGARCAAATCAGTAACAGTATTGGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATGACTTCAGGAAGTACACTGCATTTACCATACCTAGTAGAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAAGGAGGATCACCAGCAATATT [...]
+	'4004405_200401'           ------------------------------------------------------------------------------------------------------NTTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAGAATTGGGCCTGAAAATCCATACAACACTCCAGTGTTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGGAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTAGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCWAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATCTT [...]
+	'4004346_200401'           ------------------------------------------------------------------------------------------------------NTTTGCACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATAYAATACTCCAGTGTTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTCCAATTAGGAATACCACATCCCGCAGGATTRAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATACTTTTCAGTTCCCTTAGATGAATTCAGGAAATATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTCCCACAGGGAGGATCACCAGCAATATT [...]
+	'4004222_200401'           ------------------------------------------------------------------------------------------------------NTTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCGGTGTTTGCCATAAAGAAAAAAGAGGGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGGACTCAAGACTTCTGGGAGATTCAATTAGGAATACCCCATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTCCTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGAAAGTATACTGCATTTACCATACCTAGTGTAAACAATGAGACACCAGGGATTAGATATCAATACAATGTGCTCCCACAGGGAGGATCACCAGCAATATT [...]
+	'4004187_200401'           ------------------------------------------------------------------------------------------------------NTTTGTGCAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGACCTGAAAATCCCTATAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTCAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGGATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTCACCATACCTAGTATAAACAATGAGACACCAGGGGTTAGATACCAGTACAATGTGCTGCCACAAGGAGGATCACCAGCAATATT [...]
+	'4004186_200401'           ------------------------------------------------------------------------------------------------------NTTTGTACAGAAATGGAAAAGGAAGGGAAGATTTCAAAAATTGGGCCTGAAAACCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGACTTCAGGGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACACCCCGCAGGATTAAAAAAGAACAAATCAGTAACAGTCCTAGATGTGGGTGATGCATAYTTTTCAGTTCCCTTAGATGATTTCAGAAAGTATACTGCATTTACCATACCTAGTCTAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'4004185_200401'           ------------------------------------------------------------------------------------------------------NTTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAAYCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTTAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGCTTAAAGAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCATTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATCAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCGATATT [...]
+	'4004188_200401'           ------------------------------------------------------------------------------------------------------NTTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAGAGTTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAACTAGGAATACCACATCCTTCAGGGTTGAAAAAGAAAAAATCAGTGACAGTACTAGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTCACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTACTTCCGCAAGGAGGATCACCAGCAATATT [...]
+	'4004221_200401'           ------------------------------------------------------------------------------------------------------NTTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAGAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGATGGTACTAAATGGAGGAAATTAGTAGATTTCAGAGAACTTAACAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACACCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATCAGATATCAATACAATGTGCTTCCCCAGGGAGGATCACCATCAGTATT [...]
+	'4004220_200401'           ------------------------------------------------------------------------------------------------------NTTTGTACAGAAATGGAAAAAGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTTTGGGAAGTTCAATTAGGAATACCACACCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTAGATGTGGGTGATGCCTACTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACTATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'4003710_200401'           ------------------------------------------------------------------------------------------------------NTTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCRTATAATACTCCAGTGTTTGCCATAAAGAAAAAGGATGGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGAATTCTGGGAAATTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTATTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAMTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAATAATGAAACACCAGGGATTAGGTACCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'4002567_200401'           ------------------------------------------------------------------------------------------------------NTTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTGTTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACCCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCCAGTGTAAACAATGAGACACCAGGAATTAGATATCAGTACAATGTGCTTCCACAGGGAGGTTCACCAGCAATATT [...]
+	'4002566_200401'           ------------------------------------------------------------------------------------------------------NTTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATAGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTAGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACAATACCTAGTATAAACAATGAGACACCAGGGGTTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'4002565_200401'           ------------------------------------------------------------------------------------------------------NTTTGTACAGAAATGGAAAAGGAAGGRAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGATTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCCTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGRTTAGATATCAGTACAATGTRCTGCCACAGGGAGGATCACCAGCAATATT [...]
+	'4002760_200401'           ------------------------------------------------------------------------------------------------------NTTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAGATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAARAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTGCTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGAATGAGATATCAATATAATGTACTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'4002921_200401'           ------------------------------------------------------------------------------------------------------NTTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTTAGGGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGGATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGCCTTCAGGAAGTACACTGCATTTACCATACCTAGTGTGAACAATGAAACACCAGGGATTAGATATCAGTACAATGTACTTCCRCAAGGAGGATCACCAGCAATATT [...]
+	'4002761_200401'           ------------------------------------------------------------------------------------------------------NTTTGTACAGAAATGGAAAAAGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTTTGGGAAGTTCAACTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATAYTTTTCAGTTCCCTTAGATGAATTTAGAAAGTACACTGCCTTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'4002564_200401'           ------------------------------------------------------------------------------------------------------NTTTGTACAGAAATGGAAAAGGAAGGTAAAATTTCAAAGATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCTCATCCCTCAGGTTTAAAAAAGAAAAAGTCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTYCCCTTAGATGACTTCAGRAAGTATACTGCATTCACTATACCTAGTACAAACAATGAGACACCAGGAATTAGATACCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'4002185_200401'           ------------------------------------------------------------------------------------------------------NTTTGTACAGAAATGGAGAAGGAGGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAGTTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCTCAGGGTTAAAAAAGAAAAAATCAGTAACAGTATTGGATGTGGGTGATGCATACTTTTCAGTTCCATTAGATGATTTTAGAAAGTATACTGCATTTACCATACCCAGTATAAATAATGAGACACCAGGGATTAGATATGTGTACAATGTGCTCCCACAGGGAGGATCACCAGCAATATT [...]
+	'4002034_200401'           ------------------------------------------------------------------------------------------------------NTTTGTACAGAAATGGAAAAGGAAGGGAAAATCTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAATATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGGGAACTTAATAAGARAACTCAAGACTTTTGGGAAGTTCAATTAGGGATACCACATCCAGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTAGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACAGCATTTACCATACCCAGTATAAATAATGAGACACCAGGGGTTAGATATCAGTACAATGTGCTGCCACAGGGAGGATCACCAGCAATATT [...]
+	'4002033_200401'           ------------------------------------------------------------------------------------------------------NTTTGTACAGAAATGGAGAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTAAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGCTAAAAAAGAAAAAGTCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTACACTGCATTTACCATACCTAGTGTAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'4002186_200401'           ------------------------------------------------------------------------------------------------------NTTTGTACAGAAATGGAAAAAGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTTTGGGAAGTTCAATTAGGAATACCACACCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTAGATGTGGGTGATGCCTACTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACTATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'4002433_200401'           ------------------------------------------------------------------------------------------------------NTTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATAGGGCCTGAAAATCCATACAATACTCCAGTATTTGCMATAAGGAAAAAAGACAGTACTAAGTGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCAGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGCGACACCAGGGATTAGATATCAGTACAATGTGCTCCCACAGGGAGGATCACCATCAATATT [...]
+	'4002432_200401'           ------------------------------------------------------------------------------------------------------NTTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCTTACAATACTCCAATATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAATATACTGCATTTACTATACCTAGTATAAATAATGAGACACCAGGGATTAGATATCAGTATAATGTGCTGCCACAGGGAGGATCACCAGCAATATT [...]
+	'4002922_200401'           ------------------------------------------------------------------------------------------------------NTTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAGATTGGGCCTGAGAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTAGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACTATACCTAGTATAAACAATGAGACACCAGGGACTAGATATCAGTACAATGTGCTTCCCCAGGGAGGATCACCAGCAATATT [...]
+	'4003354_200401'           ------------------------------------------------------------------------------------------------------NTTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAGATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAGTTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTGCCATTAGATRACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAATAATGAGACACCAGGGATTAGATATCAGTACAATGTACTGCCACAAGGAGGATCACCAGCAATATT [...]
+	'4003353_200401'           ------------------------------------------------------------------------------------------------------NTTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAACAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATGAGTTCAGGAAATATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATGAGATATCAGTACAATGTACTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'4003352_200401'           ------------------------------------------------------------------------------------------------------NTTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCTATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGGACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAATACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTATGTGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTATAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'4003707_200401'           ------------------------------------------------------------------------------------------------------NTTTGTACAGAGATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTGTTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACACCCCGCAGGGTTGAAAAAGAAAAAATCAGTAACARTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTACATGACTTCAGGAAGTACACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGGTATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'4003709_200401'           ------------------------------------------------------------------------------------------------------NTTTGTGACGAAATGGAGAAGGAAGGAAAAATTACAAAAATTGGGCCTGAAAATCCATATAACACTCCAATATTTGCCATAAAAAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTACATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'4003708_200401'           ------------------------------------------------------------------------------------------------------NTTTGTGCAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGGAGGTACTAGATGGAGAAAATTAGTGGACTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAATTCAATTAGGGATACCACATCCCGCAGGGTTGAAAAAGAAAAAATCAGCAACAGTACTAGATGTGGGTGATGCATATTTTTCAGTTCCCTTACATGACTTCAGGAAGTATACTGCATTTACCATACCYAGTATAAACAATGAGACACCAGGGATTAGATATCAATACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'4003351_200401'           ------------------------------------------------------------------------------------------------------NTTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAAYCCATACAATACTCCAGTATTTGCMATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAGCTTAATAAGAGAACTCAAGATTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGATTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCTTTAGATGACTTCAGGAAGTAYACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGGTAYCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'4003090_200401'           ------------------------------------------------------------------------------------------------------NTTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCAATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGACTTCAGAGAACTTAATAAGAGAACTCAAGATTTCTGGGAAGTTCAGTTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGATTTCAGGAAGTACACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'4002924_200401'           ------------------------------------------------------------------------------------------------------NTTTGTRCAGAAATGGARAAGGAAGGAAAAATTTCAAAAATTGGGCCTGARAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGAYAGTACTAAATGGAGAAAATTAGTAGATTTTAGAGAACTTAATAAGAGAACTCAGGACTTCTGGGAAGTTCAATTAGGAATACCACACCCTGCAGGGTTAAAAAAGAAGAAGTCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTAYACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGACTAGRTATCAGTAYAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'4002923_200401'           ------------------------------------------------------------------------------------------------------NTTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTTAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAGAAATCAGTAACAGTATTGGATGTGGGTGACGCATACTTTTCAGTTCCCTTAGATGAATTCAGAAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCCGGGATTAGGTATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'4003091_200401'           ------------------------------------------------------------------------------------------------------NTTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACCCAAGACTTCTGGGAAGTTCAACTAGGAATACCTCATCCTGCAGGGTTAAAAAAGAACAAATCAGTAACAGTACTAGATGTGGGTGATGCCTATTTCTCAGTTCCCTTAGATGAATTCAGAAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCTATATT [...]
+	'4003175_200401'           ------------------------------------------------------------------------------------------------------NTTTGTACAGAAATGGAAAAGGAGGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTGTTTGCCATAAAGAAAAARGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'4003174_200401'           ------------------------------------------------------------------------------------------------------NTTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAATATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGGGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAARGAACAAGTCAGTAACAGTATTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGAATTAGGTATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'4004406_200401'           ------------------------------------------------------------------------------------------------------NTTTGTACAGAWATGGAAAARGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTTTGGGAAGTTCAACTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATAYTTTTCAGTTCCCTTAGATGAATTCAGAAARTACACTGCCTTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'A018_198901'              ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------GTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGARACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAAGGAGGATCACCAGCAATATT [...]
+	'A012_198901'              ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------GTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTTAGAGAACTTAATAAGAAAACTCAAGACTTCTRGGAAGTTCAATTAGGAATACCGCATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTRGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAATACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'98KE234_199801'           CCAATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCGTTGACAGAAGAGAAAAAAGCACTAACAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAGAATTGGGCCTGAAAATCCATACAATACTCCAATATTTGCTATAAAGAAAAAAGACAGTACTAAGTGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAGTTAGGAATACCACATCCTGCAGGGCTAAAAAAGAAAAAGTCAGTAACAGTATTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTTAGAAAATATACCGCATTCACCATACCTAGTAGAAACAATGAGACACCAGGAATTAGATATCAGTACAATGTGCTTCCACAA???????????????????? [...]
+	'AC7_200001'               ------------------------CCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAGAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGATGGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCATTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGTATTAGATATCAGTATAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'ACTG347_0035_199707'      CCTATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTCAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATCTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAGGAAAAAATCAGTAACCGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTCACCATACCTAGTATAAACAATGAGACACCAGGGGTTAGATATCAATACAATGTGCTTCCACAAGGGGGATCACCAGCAATATT [...]
+	'ACTG347_0009_199707'      CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAGTGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATCTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGTTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCGTTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAAGGAGGATCACCAGCAATATT [...]
+	'ACTG347_0008_199706'      ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------NAGAAAAAGGATGGTACTAAATGGAGACAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGAGTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTATATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTGCCACAGGGAGGATCACCAGCAATATT [...]
+	'97KE100_199701'           CCAATTAGTCCTATTGAAACTGTACCAGTAAAGAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCACTAACAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAGAATTGGGCCTGAAAACCCATACAATACTCCAATATTTGCCATAAAGAAAAAGGACAGTACTAAGTGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGGACCCAAGACTTCTGGGAAGTTCAGCTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTATTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTACATGGATTTAGAAAATATACCGCATTCACCATACCTAGTATAAACAATGAGACACCAGGAATTAGATATCAGTACAATGTGCTTCCACACGGAGGATCACCGGCAATATT [...]
+	'92BR030_199201'           CCCATTAGTCCTATTGAAACGGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAATAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCAATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAAGACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAATAACAGTACTGGATGTAGGTGATGCATACTTTTCAGTTCCCTTAGATGATTTCAGGAAGTATACTGCATTTACCATACCCAGTATAAACAATGCAACACCAGGGATTAGATATCAGTACAATGTGCT-CCACAGGGAGGATCACCAGCAATATT [...]
+	'92BR028_199201'           CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACCCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAATAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'92BR026_199201'           CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAGTGGCCATTGACAGAAGAAAAAAAAGCATTAATAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAGATTGGACCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGGAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTCCCACAGGGAGGATCACCAGCAATATT [...]
+	'93US141_200111'           CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGACCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGGGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAGAAGAAAAGATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGGATTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'93US144_200111'           CCCATTAGTCCTATCGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATCTGTACAGAAATGGAAAAAGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTCAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTCACCATACCTAGTATAAACAATGAGACACCAGGGATCAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'93US143_200111'           CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAGTGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAGTTGGGCCTGAAAATCCATACAATACGCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGGATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTACATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGAATTAGATATCAGTACAATGTGCTCCCACAGGGAGGATCACCAGCAATATT [...]
+	'ACTG347_0073_199705'      CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAGAAGAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAATAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTATATGAATTCAGAAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCTGGGATTAGATACCAGTACAATGTGCTCCCACAGGGAGGATCACCAGCAATATT [...]
+	'AP_GR48_200006'           ------------------------------------------------------------------------------------------------------------------ATGGAAAAGGAAGGAAAAATTTCAAAARTTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCTTATTTCTCAATACCCTTAGATGACTTCAGGAAATATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'AP_GR4_200001'            ------------------------------------------------------------------------------------------------------------------ATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAGAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAGTCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTACTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'AP_7_200001'              ------------------------------------------------------------------------------------------------------------------ATGGAGAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTTTGGGAGGTTCAATTAGGAATACCACATCCTGCAGGGTTGAAAAAGAAAAAATCAGTAACAGTGCTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTGGATGATTTCAGGAAGTATACTGCATTTACCATACCTAGCATAAACAATGAGACACCAGGGATTAGATATCAGTATAATGTGCTTCCACAAGGAGGATCACCAGCAATATT [...]
+	'ARG_37_200001'            ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAGGAGGGAAAGATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAARGACAGTACTAAATGGAGAAAATTAGTAGACTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTGCAATTAGGAATACCACATCCCGCAGGGTTAAAGMAGAAAAARTCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTAYAAATAATGMAACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'ARG_41_200001'            ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------GGGACTAGATATCAGTACAATGTGCTYCCACAGGGAGGATCACCAGCAATATT [...]
+	'ARG_39_200001'            ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAATATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCAGCAGGGTTAAAGAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCTTTAGATGACTTCAGAAAGTATACTGCATTTACCATACCTAGTRYAAATAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'AP_40_200001'             ------------------------------------------------------------------------------------------------------------------ATGGAGAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGCATAAACAATGAGACGCCAGGGATTAGATATCAATACAATGTGCTCCCACAGGGAGGATCACCAGCAATATT [...]
+	'AP_19_200001'             ---------------------------------------------------------------------------------------------------------------------GAAAAGGAAGGAAAAATTTCAAAGATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACRGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACACCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTAGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCCAGTATAAACAATGAGACACCAGGGATTAGATACCAGTACAATGTGCTTCCACAAGGAGGATCACCAGCAATATT [...]
+	'ACTG347_0386_199705'      CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATCTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTATTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'ACTG347_0323_199708'      CCYATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGARAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAAYACTCCAGTATTTGCCATAAAGAAAAARGACAGTACTAAATGGAGAAAATTAGTAGATTTYAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTYACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCTCCAGCAATATT [...]
+	'AP_2_200001'              ---------------------------------------------------------------------------------------------------------------------GAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAAACAGTAGTAGATGGAGAAAATTAGTAGATTTCAGAGAACTTAGTAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCTTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGATGCCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCTTCAATATT [...]
+	'AP_32_200001'             ------------------------------------------------------------------------------------------------------------------ATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAARGAYGGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGAYGAATTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACGCCAGRGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCTTCAATATT [...]
+	'AP_21_200001'             ------------------------------------------------------------------------------------------------------------------ATGGAAAAGGAAGGAAAGATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGAATTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTGACAGTACTAGATGTGGGTGATGCATATTTTTCAGTTCCATTAGATGACTTTAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTCCCACAGGGAGGATCACCAGCCATATT [...]
+	'92BR024_199201'           CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACCCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAGCTAGTGGATTTCAGAGAACTCAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTAGGTGATGCATATTTTTCAGTTCCATTAGATGACTTCAGGAAGTATACTGCATTTACTATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'41010_199607'             ------------------------------------------------------------------------------------------------GTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCAATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCGGCAGGATTAAAAAAGGAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCTTTACATGACTTCAGGAAGTACACTGCATTTACCATACCTAGTATAAACAATGGGNCCCCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'41002_199607'             ---------------------------------------------------------------------------------------------------------------------------------------------ATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACACCCCGCAGGGTTAAAAAAGAAAAAGTCAGTAACAGTACTGGATGTGGGTGATGCATACTTTTCAGTTCCCTTAGATGATTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'4004650_200401'           ------------------------------------------------------------------------------------------------------NTTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCCGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAGGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGAAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'41018_199607'             ------------------------------------------------------------------------------------------------GTAGAAATTTGTACAGAAATGGAAAAGGGAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAGTGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGCATACCGCATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGGTTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'44011_199607'             ---------------------------------------------------------------------------------------------------------------------------------------------ATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAGTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'43003_199607'             ------------------------------------------------------------------------------------------------ATAGAAATCTGTTCAGAAATGGAAAAGGGAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTTTGGGAAGTTCAATTAGGAATCCCACATCCCGCAGGGTTAAAAAAGAAAAAGTCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTACACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'4004587_200401'           ------------------------------------------------------------------------------------------------------NTTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCGGTGTTTGCCATAAAGAAAAAAGATGGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGGACTCAAGACTTCTGGGAGATTCAATTAGGAATACCCCATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTCCTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGAAAGTATACTGCATTTACCATACCTAGTGTAAACAATGAGACACCAGGGATTAGATATCAATACAATGTGCTCCCACAGGGAGGATCACCAGCAATATT [...]
+	'4004581_200401'           ------------------------------------------------------------------------------------------------------NTTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAGATTGGGCCTGAGAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTAGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACTATACCTAGTATAAACAATGAGACACCAGGGACTAGATATCAGTACAATGTGCTTCCCCAGGGAGGATCACCAGCAATATT [...]
+	'4004580_200401'           ------------------------------------------------------------------------------------------------------NTTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTGGTAGATTTCAGAGAGCTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAGTTAGGAATACCCCATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCTCTAGATGAGTTCAGGAAGTATACTGCGTTTACTATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'4004579_200401'           ------------------------------------------------------------------------------------------------------NTTTGTACAGAAATGGAAAAGGAAGGRAAAATYTCAAAAATTGGTCCTGAAAATCCATACAATACTCCGATATTTGCTATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTYAGAGAACTTAATAAGAAAACTCAAGATTTTTGGGAAGTTCAATTAGGAATACCACACCCTGCAGGGTTAAAAAAGAAAAAATCAGTGACAGTATTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGAYGAATTCAGGAAGTATACAGCATTTACCATACCTAGTGTAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGMTCRCCAGCAATATT [...]
+	'4004582_200401'           ------------------------------------------------------------------------------------------------------NTTTGTAAAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTTAGGGAACTTAATAAGAGAACCCAAGACTTCTGGGAAGTTCAACTAGGAATACCACATCCCGCAGGGTTGAAAAAGAAAAAATCAGTAACAGTGCTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGATTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCGCCAGCAATCTT [...]
+	'4004585_200401'           ------------------------------------------------------------------------------------------------------NTTTGTACAGAAATGGAAAAGGAAGGGAAAATCTCAAAAATTGGGCCTGAGAATCCATACAATACTCCAATATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTAGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'4004584_200401'           ------------------------------------------------------------------------------------------------------NTTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAGAATAGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACGGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAGAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAMTTTAGRAAGTACACTGCATTCACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTAYAATGTGCTGCCACARGGAGGATCACCAGCAATATT [...]
+	'5000047_200401'           ------------------------------------------------------------------------------------------------------NTTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACGGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAGACTCAAGACTTCTGGGAAGTGCAATTAGGAATACCACATCCCGCAGGATTAAAAAAGAAAAAATCAGTAACAGTACTAGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'92BR017_199201'           CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAGCAATGGCCATTGACAGAAGAAAAAAAAGCATTAATAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCTATAAAGAAGAAAGATAGTACTAAATGGAGGAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGAATTAGATATCAGTACAATGTGCTTCCACAAGGAGGATCACCAGCAATATT [...]
+	'92BR004_199201'           CCCATAAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGACGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAGTGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAGAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAAACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'92BR003_199201'           CCTATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTCCAATTAGGAATACCACATCCCGCAGGATTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTACATGGCTTCAGGAAGTATACTGCATTCACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'92BR018_199201'           CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAGCAATGGCCATTGACAGAAGAAAAAAAAGCATTAATAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCTATAAAGAAAAAAGATAGTACTAAATGGAGGAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTGTAAACAATGAGACACCAGGAATTAGATATCAGTACAATGTGCTTCCACAAGGAGGATCACCAGCAATATT [...]
+	'92BR021_199201'           CCTATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAGAGTTAAACAATGGCCACTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAGAATTGGGCCTGAAAATCCATACAATACTCCAATATTTGCTATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAATATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCACCAATATT [...]
+	'92BR020_199201'           CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAGGAAAAAGAAGCATTGGTAGAAATTTGCACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGATAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACACCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCTTTAGATGAATTCAGGAAGTACACTGCATTCACCATACCTAGTAGAAACAATGAGACACCAGGAATTAGATATCAGTACAATGTGCTTCCACAAGGAGGATCACCAGCAATATT [...]
+	'54002_199607'             ------------------------------------------------------------------------------------------------GTAGAAATCTGTMCAGAAATGGAAAGGGAGGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACCCCAGTATTTGCCCTAAAGAAAAAGGATAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTCCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGGAAAAATCCGTAACAGTACTGGATGTGGGGGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACCCCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCGCCAGCAATATT [...]
+	'5000052_200401'           ------------------------------------------------------------------------------------------------------NTTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTGTTTGCCATAAAGAAAAARGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACCCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAARTATACTGCATTTACCATACCTAGTGTAAACAATGAGACACCAGGRATTAGATATCAGTACAATGTGCTTCCACAGGGAGGTTCACCAGCAATMTT [...]
+	'5000051_200401'           ------------------------------------------------------------------------------------------------------NTTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACCAAATGGAGAAAATTAGTAGATTTTAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCTCAGGATTAAAAAAGAAGAAATCAGTAACAGTACTAGATGTGGGTGATGCATATTTTTCAGTCCCTTTACATGACTTCAGGAAGTACACTGCATTTACAATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTCCCACAGGGAGGATCACCAGCAATATT [...]
+	'5000048_200401'           ------------------------------------------------------------------------------------------------------NTTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCTATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAGCTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCMGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTAYAAACAATGAGRCTCCAGGGATTAGATATCAGTACAATGTACTTCCACAGGGGGGATCACCAGCAATATT [...]
+	'5000053_200401'           ------------------------------------------------------------------------------------------------------NTTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAGTTGGGCCTGARAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACGGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTATTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTACATGACTTCAGGAAGTACACTGCATTTACCATACCTAGTATAAATAATGAGACACCAGGAATTAGATATCAATACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'5000055_200401'           ------------------------------------------------------------------------------------------------------NTTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAACCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGARGTTCAATTAGGRATACCACATCCTGCAGGRTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTYAGGAAGTACACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGGTTAGRTATGAGTACAATGTGCTTCCRCAGGGAGGATCACCAGCAATATT [...]
+	'5000054_200401'           ------------------------------------------------------------------------------------------------------NTTTGTACAGAAATGGAGAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAATATTTGCCATAAAGAAGAAAAACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAACAAGAGAACTCAAGACTTCTGGGAAGTGCAATTAGGAATACCACATCCAGCAGGGTTACAAAAGAGAAAATCAGTAACAGTACTGGATGTGGGTGATGCATACTTTTCAGTTCCCTTAGATGAATTCAGGAAGTACACTGCATTTACCATACCTAGTACAAACAATGAGACACCCGGAATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'4002032_200401'           ------------------------------------------------------------------------------------------------------NTTTGTGACGAAATGGAGAAGGAAGGAAAAATTACAAAAATTGGGCCTGAAAATCCATATAACACTCCAATATTTGCCATAAAAAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTACATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'33013_199607'             ---------------------------------------------------------------------------------------------------------------------------------------------ATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGCCCGTCCTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGGGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTCACCATACCTAGTCTAAACAATGAGACACCAGGGGTTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'33009_199607'             ------------------------------------------------------------------------------------------------GTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAGATTTCAAGAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTAGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTTAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGGTATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'33004_199607'             ---------------------------------------------------------------------------------------------------------------------------------------------ATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGGGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGCTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCTATATT [...]
+	'33017_199607'             ------------------------------------------------------------------------------------------------GTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGACTTCAGGGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGGATACCACATCCCGCAGGGTTAAAAAAGGAAAAATCAGTAACAGTACTGGATGTAGGTGATGCATACTTTTCAGTCCCCTTAGATGAATTCAGAAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACCCCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'36003_199607'             ------------------------------------------------------------------------------------------------GTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGACGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACGAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'33027_199607'             ---------------------------------------------------------------------------------------------------------------------------------------------ATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTTAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTATAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'33018_199607'             ------------------------------------------------------------------------------------------------GTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGATTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTCACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'33001_199607'             ------------------------------------------------------------------------------------------------GTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGGAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'260Pt30_199511'           ------------------------------------------------------------------------TTGACNGAAGAAAAAAAAGCATTAGTAGAAATTTGTACCGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGATAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAACGAGACACCAGGAATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCATCAATATT [...]
+	'260Pt28_199511'           ------------------------------------------------------------------------TTGANNGAAGAAAAAAAGGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTGAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTACCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGGGGATCACCAGCAATATT [...]
+	'260Pt26_199511'           ------------------------------------------------------------------------TTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAAAAGAAAGAYAGTACTAAATGGAGAAAACTAGTAGATTTCAGAGAACTTAATAAGAGGACTCAAGACTTCTGGGAAGTTCAACTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'260Pt4_199511'            ------------------------------------------------------------------------TTGACAGAGGAAAAAAAAGCATTGGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTTAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAGGTTCAATTAGGAATACCACACCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTCTCAGTTCCCTTGGATGAATTCAGGAAGTATACTGCATTCACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTATAATGTGCTACCACAAGGAGGATCACCAGCAATATT [...]
+	'260Pt8_199511'            ------------------------------------------------------------------------------------------------------ATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAARAAAAAAGACAGTACTAAATGGAGAAAATTAGTARATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGCTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAACGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGCTCACCAGCAATATT [...]
+	'260Pt5_199511'            ------------------------------------------------------------------------TTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAGAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGATGGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGAAAGTATACTGCATTTACCATCCCTAGTACRAATAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'36010_199607'             ---------------------------------------------------------------------------------------------------------------------------------------------ATTGGGCCTGAAAATCCATACAATACTCCAATATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACACAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAGAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTAAAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGCTCACCAGCAATATT [...]
+	'38009_199607'             ------------------------------------------------------------------------------------------------GTAGAAATTTGTACAGAAATGGAAAAGGGAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAWTCTGTTACAGTTCTGGATTTGGGTGATGCATATTTTTCAGTCCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTTTAAACAATGAGACCCCCGGSCTTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'38004_199607'             ---------------------------------------------------------------------------------------------------------------------------------------------ATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAGGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATACTTCTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'37010_199607'             ---------------------------------------------------------------------------------------------------------------------------------------------ATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACCAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAGGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGYGACGCATACTTTTCAGTTCCCTTAGATGACTTCAGAAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTACTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'38010_199607'             ---------------------------------------------------------------------------------------------------------------------------------------------ATTGGGCCTGAAAATCCATACAATACTCCAATATTTTCCATAAAGAAAAAAAACAATACTAAATTGAGAAAATTAATAAATTTCAGAAAACTAAATAAGAGAACTCAAGACTTCTTGGAAATTCAATTAGGAATACCACATCCTTCAGGGTTAAAAAAGAAAAAATCAATAACAATACTAGATGTGGGKGATTCATATTTCTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGGGACCCCAGGGGTTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'40001_199607'             ------------------------------------------------------------------------------------------------ATAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCTATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGGGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCTCAGGATTAAAAAAGAAAAAATCNGTTACAGTTCTGGATGTGGGGGATGCATATTTTTCAGTTCCCTTAGATGGCTTCAGGAAGTATTCTGCATTTACCATACCTAGTATAAACAATGGGCCCCCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'38020_199607'             ------------------------------------------------------------------------------------------------GTAGAAATTTGTACAGAAATGGAAAAGGGGGGAAAAATTTCAAAAATTGGGCCTGAAAACCCATACAATACTCCAGTATTTGCTATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAACTAGGAATACCGCATCCTGCAGGGTTAAAAAAGGAAAAATCNGTAACAGTGCTAGATGTGGGTGATGCATATTTTTCAGTTCCCNTTGATGAATTCAGGAAGTATTCTGCATTTACCATACCCAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGGGGATCACCAGCAATATT [...]
+	'37008_199607'             ------------------------------------------------------------------------------------------------GTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGGAAAAATCKGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTCCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACGAACAATGAGACCCCGGGGATTAGATATCAGTATAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'36016_199607'             ---------------------------------------------------------------------------------------------------GAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATAGGGCCTGAAAATCCATACAATACTCCAATATTTGCCATAAAGAAGAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAGAAGAAAAAATCAGTAACAGTATTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTTTAAACCATGGGGCCCCCGGGGTTCGATATCAGTACAATGTGCTTCCACAAGGGGGGTCCCCCGCAATATT [...]
+	'36012_199607'             ---------------------------------------------------------------------------------------------------------------------------------------------ATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAGAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAATAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'36011_199607'             ---------------------------------------------------------------------------------------------------------------------------------------------ATTGGGCCTGAAAATCCATACAATACACCAGTATTTGCYATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAARAGAACTCAAGACTTCTGGGAAGTTCAGTTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTTAGAAAGTATACTGCATTTACCATACCTAGTGTAAACAATGAGACCCCAGGGATTAGATATCAGTACAATGTGCTGCCACAGGGAGGATCACCAGCAATATT [...]
+	'36023_199607'             ---------------------------------------------------------------------------------------------------------------------------------------------ATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTTTGGGAAGTTCAATTAGGAATACCACATCCCTCAGGGTTAAAACAGAAAAAATCAGTAACAGTACTAGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGAATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'37003_199607'             ------------------------------------------------------------------------------------------------GTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGGGAACTTAATAAAAGAACTCAAGACTTTTGGGAAGTTCAATTAGGAATACCACATCCCTCAGGGTTAAAAAAGAAAAAGTCCGTGACAGTTCTGGATTTGGGGGATGCATATTTTTCAGTCCCCTTAGATGACTTCAGGAAGTATACTGCATTTCCCATACCTTGTATAAACAATGGGACCCCAGGGGTTAGATATCAGTACAATGTGCTTCCACAAGGKGGATCACCAGCAATATT [...]
+	'37002_199607'             ---------------------------------------------------------------------------------------------------------------------------------------------ATTGGGCCTGAAAATCCATACAACACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTGACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGACGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCATCAATATT [...]
+	'260Pt25_199511'           ------------------------------------------------------------------------TTGANNGNAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCTAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAGGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCATTAGATGACTTCAGGAAGTATACTGCATTCACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'143P18_199108'            ------------------------------------------------------------------------TTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAGATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGGAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGAAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'143P16_199104'            ------------------------------------------------------------------------TTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCGTTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'143P15_199101'            ------------------------------------------------------------------------TTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCCTACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACCAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCAGCAGGTTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGGTCAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'143P19_199106'            ------------------------------------------------------------------------TTGACAGWAGAGAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAAGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAGGACTTCTGGGAAGTTCAATTAGGAATACCACATCCAGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGACGCATACTTCTCAGTTCCCTTAGATGACTTCAGAAAGTATACTGCATTTACCATACCTAGTATAAACAATGCGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCGATATT [...]
+	'143P20_199104'            ------------------------------------------------------------------------TTGACAGAAGAAAAAAAAGCATTAGTAGAGATTTGTACAGAAATGGAAAAGGAAGGRAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGGTTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'143P2_199104'             ------------------------------------------------------------------------TTGACAGAAGAAAAAAAAGCATTGGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTNAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTCACCATACCTAGTGTAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'143P14_199101'            ------------------------------------------------------------------------TTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTTTGGGAAGTTCAATTGGGGATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTAGATGTGGGTGATGCATATTTTTCAGTTCCTTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'143GW353_199301'          ------------------------------------------------------------------------TTGANAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATCTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGATAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATACTTTTCAGTTCCCTTAGATGACTTCAGAAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACMCCAGGGATTAGATATCAGTACAATGTKCTTCCACAAGGAGGRTCACCAGCAATATT [...]
+	'03UZ011_200301'           CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAATAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACACCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGAAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAACAATATT [...]
+	'02UZ673_200201'           CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGGCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAACAGAAATTTGTACAGAGATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGACTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAACAGAAAAAATCAGTAACAGTATTGGATGTGGGTGATGCATACTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCGTTTACCATACCTAGTATAAACAATGAGACACCAGGGGTTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'143H144_199301'           ------------------------------------------------------------------------TTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAGATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCTATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACWCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGATTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTACCGCAGGGAGGATCACCAGCAATATT [...]
+	'143P1_199104'             ------------------------------------------------------------------------TTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTACATGACTTCAGGAAGTATACTGCATTCACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTCCCGCAGGGAGGATCACCAGCAATATT [...]
+	'143H179_199301'           ------------------------------------------------------------------------TTGACAGAAGAAAAGAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGAAAGTATACTGCATTTACCATACCTAGTATCAACAATGAGACACCAGGGATTAGATATCAGTACAATGTACTTCCACAGGGAGGGTCACCAGCAATATT [...]
+	'143P21_199101'            ------------------------------------------------------------------------TTGACAGGAGAAAAAAAAGCATTWGTAGRMWTWTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGSCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGATAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAAATTAATAAGAGAACTCAAGAATTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGACGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGAAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'260Pt18_199511'           ------------------------------------------------------------------------TTGACAGAAGAAAAAAAGGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCAGAAAATCCATACAATACTCCAGTATTTGCCATAAGGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGGGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTCCCCTTAGATGATTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'260Pt17_199511'           ------------------------------------------------------------------------TTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATYTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTGGTAGATTTCAGAGAACTTAATAAGAGAACCCAAGACTTCTGGGAAGTTCAATTAGGCATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTATATGACTTCAGGAAGTAYACGGCATTTACCATTCCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'260Pt16_199511'           ------------------------------------------------------------------------TTGACAGAAGAAAAGAAAGCATTAGTAGAAATTTGNACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAGGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCTCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTCTCAGTTCCCTTATATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'260Pt22_199511'           ------------------------------------------------------------------------------------AAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAGAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACAYCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATWAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACARGGAGGATCACCAGCAATATT [...]
+	'260Pt24_199511'           ------------------------------------------------------------------------TTGACAGAAGAAAAAAAAGCRTTAGTAGAAATTTGTACAGAATTGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTTAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAGAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATGACTTCAGAAAGTATACTGCATTTACCATCCCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'260Pt23_199511'           ------------------------------------------------------------------------TTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAGAATCCATACAATACTCCAGTTTTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTCCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAANTCAGTAACAGTACTGGATGTAGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'260Pt11_199511'           ------------------------------------------------------------------------------------------------------ATCTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGACAATCCATATAATACTCCAATATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAGGTTCAATTAGGGATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTARATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGGTATCAGTACAATGTGCTTCCACAGGGAGGATCACCATCAATATT [...]
+	'143P6_199104'             ------------------------------------------------------------------------TTGACAGAAGAAAAAAAAGCATTAGTAGAAATCTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGACTTTTGGGAAGTTCAGTTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'143P5_199108'             ------------------------------------------------------------------------TTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAARATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAGTTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTCCTGGATGTGGGTGATGCATATTTTTCAGTCCCATTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAATAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTCCCACAGGGAGGATCACCAGCAATATT [...]
+	'143P4_199104'             ------------------------------------------------------------------------TTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGGAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGATTTCTGGGAAGTTCAATTAGGAATACCACATCCAGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCTCTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'143P8_199101'             ------------------------------------------------------------------------TTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACGCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAARATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'260_Pt1_199511'           ---------------------------------------------------------------------------------------AAAGCCTTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCCAAAATTGGCCCTGAAAATCCATACAATACTCCAGTGTTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTGTRAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'143U206_199203'           ------------------------------------------------------------------------TTGANAGAAGNAAAAAAGGCATTAATAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAACTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTACAAAAGAAAAAATCAGTAACAGTATTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGRAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTKCTTCCACAGGGRGGRTCACCAGCAATATT [...]
+	'4000355_200401'           ------------------------------------------------------------------------------------------------------NTTTGCACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATAYAACACTCCAATATTTGCCATAAAGAAAAAGAACAGCACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGATTTCTGGGAAGTTCAACTAGGAATACCACACCCCGCAGGGTTAAAAAAGAAGAAATCAGTAACAGTGCTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGATTTCAGAAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'4001171_200401'           ------------------------------------------------------------------------------------------------------NTTTGTACAGAAATGGAAAAGGAAGGGAAGATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGATGGTACTAAATGGAGAAAATTAGTAGACTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTCCAATTAGGAATACCACACCCCGCAGGGTTAAAACAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCTTTAGATGACTTCAGAAAGTATACTGCATTCACCATACCAAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTYCCACAGGGAGGATCACCAGCAATATT [...]
+	'4001098_200401'           ------------------------------------------------------------------------------------------------------NTTTGTACAGAAATGGAAAAGGAAGGGAARATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACYAAATGGAGAAAATTAGTAGATTTCAGAGAGCTTAATAAGAGRACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAACAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTYTCAGTTCCMTTAGATGAYTTCAGGAAGTATACTGCATTTACCATACCTAGYATAAACAATGAGACACCAGGGAYTAGATATCAGTACAATGTGCTCCCACAGGGAGGATCACCAGCAATATT [...]
+	'4001097_200401'           ------------------------------------------------------------------------------------------------------NTTTGTGCAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCARGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTAGATGTAGGTGATGCATATTTTTCAGTTCCCTTAGATGATTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATAYCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'4001172_200401'           ------------------------------------------------------------------------------------------------------NTTTGCACAGAAATGGAAAGGGAAGGAAAGATTTCAAAAATTGGGCCTGAAAACCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGACTTCAGAGAACTTAATAAGAGAACTCAAGACTTTTGGGAAGTTCAATTAGGAATACCACATCCCTCAGGGTTAAAAAAGAAGAAATCAGTAACAGTACTAGATGTGGGTGATGCATATTTTTCAGTTCCTTTAGATGACTTTAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCCCAGGGAGGATCACCATCAATATT [...]
+	'4001462_200401'           ------------------------------------------------------------------------------------------------------NTTTGTACAGAAATGGAAAAGGAAGGGAAGATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAATATTTGCAATAAAGAAGAAAGAYAGTACTAAATGGAGAAAACTAGTAGATTTCAGAGAACTYAATAAGAGAACTCAAGACTTCTGGGAAGTGCAAYTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCTTTAGATGAATTTAGAAAATATACTGCATTTACCATACCTAGYACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'4001461_200401'           ------------------------------------------------------------------------------------------------------NTTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAARGAYAGTACTAAATGGAGRAARTTAGTAGATTTCAGAGAACTTAATAARAGAACTCAAGAYTTCTGGGAAGTTCAATTAGGAATACCACAYCCYGCAGGGTTAAARAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTCCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCWAGTATAAACAATGAGACACCAGGGATTAGRTATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'4001096_200401'           ------------------------------------------------------------------------------------------------------NTTTGTACAGAAATGGAAAAGGAAGGAAAGATTTCAAAAATTGGACCTGAAAATCCATACAATACTCCAGTATTTGCCATAAGGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTTAGAGAACTTAATAAGAGAACTCAAGATTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAGAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCATTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTGCCACAGGGAGGATCACCAGCAATATT [...]
+	'4000766_200401'           ------------------------------------------------------------------------------------------------------NTTTGTACAGAAATGGAAAAGGAAGGTAAAATTTCAAAGATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCTCATCCCTCAGGTTTAAAAAAGAAAAAGTCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGAAAGTATACTGCATTCACTATACCTAGTACAAACAATGAGACACCAGGAATTAGATACCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'4000765_200401'           ------------------------------------------------------------------------------------------------------NTTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAGAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAACTAGTAGATTTTAGAGAACTTAATAAGAGAACTCAAGACTTTTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAGAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTCCCATTAGATGACTTCAGGAAATATACTGCATTTACCATACCTAGTATAAACAATGCGACACCAGGGATTAGGTATCAATATAATGTGCTTCCACAGGGAGGATCACCAGCAATTTT [...]
+	'4000764_200401'           ------------------------------------------------------------------------------------------------------NTTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAGAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACACCCAGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGGGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAATACAATGTGCTTCCACAGGGAGGATCACCATCAATATT [...]
+	'4000918_200401'           ------------------------------------------------------------------------------------------------------NTTTGTACAGAAATGGAAAAGGAAGGAAAGATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAGGAAGAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTTAGAGAACTTAATAAGAGAACTCAAGATTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAGAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCATTAGATGATTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTGCCACAGGGAGGATCACCAGCAATATT [...]
+	'4001027_200401'           ------------------------------------------------------------------------------------------------------NTTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTGTTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTCCAGTTAGGGATACCACATCCTGCAGGGTTAAAAAAGAARAAATCAGTAACAGTACTGGATGTGGGAGATGCATATTTTTCAGTTCCCTTAGATGACTTTAGGAAGTATACTGCATTTACCATACCTAGTGTAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'4000919_200401'           ------------------------------------------------------------------------------------------------------NTTTGTACAGAAATGGARAAGGAAGGRAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCTATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTAAATAAGARAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGCTAAAAAAGAAAAAGTCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTACACTGCATTTACCATACCTAGTGTAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'4001463_200401'           ------------------------------------------------------------------------------------------------------NTTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTRAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAGTCAGTAACAGTACTGGATGTGGGTGATGCATACTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAATAATGAGACACCAGGAATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'4001798_200401'           ------------------------------------------------------------------------------------------------------NTTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAARATTGGGCCTGARAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCMTATTTCTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGCTCACCAGCAATATT [...]
+	'4001797_200401'           ------------------------------------------------------------------------------------------------------NTTTGTACAGAGATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAGTTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCTCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTAGATGTGGGTGATGCATATTTCTCAGTTCCCTTGGATGACTTCAGGAAGTATACTGCATTCACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'4001693_200401'           ------------------------------------------------------------------------------------------------------NTTTGTACAGAAATGGAAAAGGAAGGTAAAATTTCAAAGATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCTCATCCCTCAGGTTTAAAAAAGAAAAAGTCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGAAAGTATACTGCATTCACTATACCTAGTACAAACAATGAGACACCAGGAATTAGATACCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'4001904_200401'           ------------------------------------------------------------------------------------------------------NTTTGTACAGAAATGGAAAAGGAAGAGAAAATCTCAAAAATTGGACCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTTTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAACAGAAAAAGTCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCTTTACATGACTTCAGAAAGTATACTGCATTCACCATACCAAGTATAAACAATGAGACACCAGGGATTAGATATCAGTATAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'4001906_200401'           ------------------------------------------------------------------------------------------------------NTTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAGATTGGGCCTGAGAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTGCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTAGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACTATACCTAGTATAAACAATGAGACACCAGGGACTAGATATCAGTACAATGTGCTTCCCCAGGGAGGATCACCAGCAATATT [...]
+	'4001905_200401'           ------------------------------------------------------------------------------------------------------NTTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAACTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTGCAATTAGGAATACCACATCCCGCAGGATTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAGTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGCTCACCAGCAATCTT [...]
+	'4001654_200401'           ------------------------------------------------------------------------------------------------------NTTTGTACAGAAATGGAAAAGGAAGGGAAARTTTCAAGAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGATAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAGGAGTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCTGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATACTTTTCAGTTCCCTTAGATGACTTTAGGAAGTATACTGCATTTACCATACCTAGTATAAACAACGAGACACCAGGAATTAGATATCAGTACAATGTGCTTCCACAGGGAGGGTCACCAGCAATATT [...]
+	'4001519_200401'           ------------------------------------------------------------------------------------------------------NTTTGYACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGGAAATTAGTAGATTTTAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGKTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCCTTTACCATACCTAGTGTAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTACTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'4001518_200401'           ------------------------------------------------------------------------------------------------------NTTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAGAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACACCCAGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGGGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAATACAATGTGCTTCCACAGGGAGGATCACCAKCAATATT [...]
+	'4001464_200401'           ------------------------------------------------------------------------------------------------------NTTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAARAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGRAAGTATACTGCATTCACCATACCTAGCATAAAYAATGAGACACCAGGGRTTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'4001569_200401'           ------------------------------------------------------------------------------------------------------NTTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAGAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGCACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGARAACTCAAGACTTCTGGGAAGTTCAATTAGGCATACCACATCCCGCAGGGTTAAAGAAGAAAAAGTCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAACGTGCTGCCACAGGGAGGATCACCAGCAATATT [...]
+	'4001653_200401'           ------------------------------------------------------------------------------------------------------NTTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAGAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGCACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGCATACCACATCCCGCAGGGTTAAAGAAGAAAAAGTCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAACGTGCTGCCACAGGGAGGATCACCAGCAATATT [...]
+	'4001652_200401'           ------------------------------------------------------------------------------------------------------NTTTGCACAGAAATGGAAAGGGAAGGAAAGATTTCAAAAATTGGGCCTGAAAACCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGACTTCAGAGAACTTAATAAGAGAACTCAAGACTTTTGGGAAGTTCAATTAGGAATACCACATCCCTCAGGGTTAAAAAAGAAGAAATCAGTAACAGTACTAGATGTGGGTGATGCATATTTTTCAGTTCCTTTAGATGACTTTAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCCCAGGGAGGATCACCATCAATATT [...]
+	'4000763_200401'           ------------------------------------------------------------------------------------------------------NTTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGGGAACTTAATAAGAGAACTCAAGAYTTCTGGGAAGTTCARTTAGGAATACCACATCCTGCAGGGTTAAARAAGAAAAAATCAGTAACAGTACTAGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGGTAYCAGTACAATGTGCTTCCACAGGGAGGATCCCCAGCAATATT [...]
+	'4000365_200401'           ------------------------------------------------------------------------------------------------------NTTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAGGTTGGGCCTGAAAACCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTCAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAACAGAAAAAATCAGTAACAGTATTGGAYGTGGGTGATGCATATTTTTCAGTTCCCTTACATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'4000364_200401'           ------------------------------------------------------------------------------------------------------NTTTGTACAGATATGGAAAAGGAAGGGAAAATTTCAAAAATTGGACCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGAYTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACACCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATGAGTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'4000363_200401'           ------------------------------------------------------------------------------------------------------NTTTGTACAGAAATGGARAAGGAAGGRAAAATTTCAAGAATTGGGCCTGAAAATCCATACAAYACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTYCAATTAGGAATACCACATCCMGCAGGGTTAAAAAAGAAAAAATCAATAACRRTACTRGATGTGGGTGATGCATATTTTTCARTTCCCTTAGATRAVTTCAGGAARTATACTGCATTTACYATACCTAGTAYAAACAATGAGRCACCAGGAATCAGGTATCAGTAYAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'4000386_200401'           ------------------------------------------------------------------------------------------------------NTTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAACCCATACAATACTCCAGTATTTGCTATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAATTCAGTTAGGAATACCACATCCATCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCTTTAGATGAWTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAATAATGAGACACCAGGGATTAGGTATCAGTACAATGTGCTTCCACAGGGAGGATCGCCAGCAATATT [...]
+	'4000422_200401'           ------------------------------------------------------------------------------------------------------NTTTGCACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTCCAATTAGGAATACCACATCCCGCAGGATTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATACTTTTCAGTTCCCTTAGATGAATTCAGAAAATATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTCCCACAGGGAGGATCACCAGCAATATT [...]
+	'4000388_200401'           ------------------------------------------------------------------------------------------------------NTTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGACTTTTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGATTGAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGAAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGAATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'4000362_200401'           ------------------------------------------------------------------------------------------------------NTTTGTACAGAAATGGARARGGAAGGAAAAATYTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAATATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGAYTTCAGGGAACTTAATAAGAGAACTCAAGACTTTTGGGARGTTCAATTAGGAATACCACATCCCGCAGGGCTAAARAAGAAAAAATCAGTAACAGTATTGGATGTGGGTGATGCATATTTTTCAGTGCCATTAGATGRATTCAGAAAGTATACTGCATTTACCATACCTAGYATAAAYAATGAGACACCAGGGGTYAGATAYCAATACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'4000358_200401'           ------------------------------------------------------------------------------------------------------NTTTGTACAGAAATGGAAAARGAAGGGAAAATWTCAAAAATTGGGCCTGAAAATCCATACAATACTCCGGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCMTTTACCATACCYAGTATAAATAATGAACRACCAGGGACTAGRTATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'4000357_200401'           ------------------------------------------------------------------------------------------------------NTTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGCACTAAATGGAGAAAATTGGTAGATTTCAGGGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTAGATGTGGGTGATGCATATTTTTCAGTTCCTTTAGACGATTTCAGAAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGAATTAGATACCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'4000356_200401'           ------------------------------------------------------------------------------------------------------NTTTGTACAGAAATGGAAAAGGAAGGAAAGATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAGTTAGGAATACCACATCCAGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGGGATGCATATTTTTCAGTCCCCYTAGATGACTTCAGGAAATATACTGCATTTACCATACCTAGTATAAATAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'4000359_200401'           ------------------------------------------------------------------------------------------------------NTTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAGAATTGGGCCTGAAAATCCATATAATACTCCAGTGTTTGCCATAAAGAAAAAAGATAGTACTAAATGGAGAAAGTTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTCTCAGTCCCTTTAGATGACTTCAGGAAGTACACTGCATTTACCATACCCAGTGTAAATAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCGCCAGCTATATT [...]
+	'4000361_200401'           ------------------------------------------------------------------------------------------------------NTTTGTACAGAAATGGAAAAGGAAGGAAAGATTTCAAAAATTGGGCCTGAAAACCCATACAATACTCCAGTATTTGCCATAAAGAAAAARGACAGTACWAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTRAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCTGTTCCCTTAGATGAATTCAGGAAGTAYACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGGTTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'4000360_200401'           ------------------------------------------------------------------------------------------------------NTTTGTACAGAAATGGAAAAGGAAGGAAAAATTACAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCTATAAAGAAGAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAGGTTCAATTAGGAATACCACATCCCTCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTAGATGTGGGAGATGCATATTTTTCAGTTCCCCTGGACGAGTTCAGGAAGTATACTGCATTYACCATACCTAGTATAAACAATGAGACACCAGGGATTAGGTATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'4000423_200401'           ------------------------------------------------------------------------------------------------------NTTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGACCTGAAAACCCATACAATACTCCAGTATTTGCTATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTCCAATTAGGAATACCACATCCTGCAGGATTAAAAAAGAAAAAATCAGTGACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCTCTAGATGAATTCAGRAAGTACACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATCAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'4000582_200401'           ------------------------------------------------------------------------------------------------------NTTTGTACAGAAATGGAAAAGGAGGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTTAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTATTRGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTACACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAAGGAGGATCACCAGCAATATT [...]
+	'4000580_200401'           ------------------------------------------------------------------------------------------------------NTTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCACAAATTGGGCCTGAAAATCCATACAATACTCCAATATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGGATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACGCCAGGGAAGAGATATCAGTATAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'4000579_200401'           ------------------------------------------------------------------------------------------------------NTTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAGATTGGGCCTGAGAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTAGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACTATACCTAGTATAAACAATGAGACACCAGGGACTAGATATCAGTACAATGTGCTTCCCCAGGGAGGATCACCAGCAATATT [...]
+	'4000583_200401'           ------------------------------------------------------------------------------------------------------NTTTGTACAGAAATGGAAAAGGAAGGTAAAATTTCAAAGATTGGGCCTGAAAATCCATACAATACTCCWGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCTCATCCCTCAGGTTTAAARAAGAAAAAGTCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGAAAGTATACTGCATTYACTATACCTAGTACAAACAATGAGACACCAGGAATTAGATACCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'4000630_200401'           ------------------------------------------------------------------------------------------------------NTTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAAYCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGATAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAAYAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCYGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTGCCCTTAGACGACTTCAGGAAATATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'4000629_200401'           ------------------------------------------------------------------------------------------------------NTTTGTACAGAAATGGAGAAGGAAGGRAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTCAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGYTAAAAAAGARAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTKCCACAGGGAGGATCACCGGCAATATT [...]
+	'4000500_200401'           ------------------------------------------------------------------------------------------------------NTTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTTAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCRCATCCCGCAGGTCTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTACATGACTTTAGGAAGTAYACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'4000427_200401'           ------------------------------------------------------------------------------------------------------NTTTGTACAGAAATGGAAAAGGAAGGAAAGATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGATGGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAARTCAGTAACAGTATTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAACGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'4000426_200401'           ------------------------------------------------------------------------------------------------------NTTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAACCCATACAATACTCCAATATTTGCCATAAAGAAAAAAGACAGTACCAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCTTTAGATGAATTCAGGAAGTATACTGCATTTACTATACCYAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'4000425_200401'           ------------------------------------------------------------------------------------------------------NTTTGTACAGAGATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTGTTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGATTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAGAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAATTCCCTTAGATAACTTCAGGAAGTATACTGCATTTACCATACCYAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'4000428_200401'           ------------------------------------------------------------------------------------------------------NTTTGTACAGAAATGGAAAAGGAAGGAAAGATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAGTTAGGAATACCACATCCAGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGAGATGCATATTTTTCAGTCCCCTTAGATGACTTCAGGAAATATACTGCATTTACTATACCTAGTATAAATAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTCCCACAGGGAGGATCACCAGCAATATT [...]
+	'4000499_200401'           ------------------------------------------------------------------------------------------------------NTTTGTACAGAAATGGAAAAGGAAGGAMAAATTTCAAAAATTGGGCCTGATAATCCATACAATACTCCAGTATTYGCCATAAAGAAAAAAGACAGTACYAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTYCAATTAGGAATACCACAYCCCGCAGGGTTAAAAAAGAAGAAATCAGTAACAGTACTRGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTCACCATACCYAGTGTAAAYAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'4000498_200401'           ------------------------------------------------------------------------------------------------------NTTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAGAATTGGGCCTGAAAATCCATACAATACTCCAGTGTTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGGAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTAGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCAAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCGATCTT [...]
+	'ARG_42_200001'            ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCYGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATACTTTTCAGTTCCCTTAGACGAYTTTAGAAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CA14545_200208'           CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTGCAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAARTTRGTAGATTTCAGRGARCTTAATAAGAGAACYCAAGAYTTCTGGGAAGTTCAATTAGGAATCCCACATCCCKCAGGGTTAAAAAAGAAAAAATCAGTAACAGTAYTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGRAARTATACTGCATTYACCATACCTAGTTTAAACAATGAGACACCAGGGATTAGATATCARTACAATGTGCTTCCACAAGGAGGATCACCAGCAATATT [...]
+	'CA14551_200207'           CCYATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAKTAGAAATTTGYACAGAAATGGAAAAGGAAGGGAAAATYTCAAAGRTTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTRGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGAYTTCTGGGAAGTYCAATTAGGAATACCACAYCCTGCAGGGTTAAAAAAGAAAAAGTCAGTAACAGTACTGGATGTGGGGGATGCATAYTTTTCAGTTCCCTTAGATGAATTCAGAAAGTACACTGCATTTACCATACCCAGTATAAATAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCWCCAGCAATATT [...]
+	'BR04RS175_200401'         ------------------------------------------------------------------------------------AAAAAAGCATTAATAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAGAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGACTTCAGAGAACTAAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACACCCAGCAGGGTTGAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'BR04RS180_200401'         ---------------------------------------------------------------------------------GAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAGAAGGAAGGAAAGATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGCTAAAGAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCATTAGATGACTTCAGGAAGTATACTGCATTCACCATACCTAGTACAAACAATGAGACACCAGGGATTAGGTATCAATACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'BR04RS177_200401'         ------------------------------------------------------------------------------------AAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATAGCTTCAGGAAGTATACTGCATTCACCATACCTAGTAGAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTCCCACAGGGAGGATCACCAGCAATATT [...]
+	'BR04RS172_200401'         ---------------------------------------------------------------------------------GAAAAAAAAGCATTAGTAGAAATCTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAACCCATATAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAACAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGGGACACCAGGGATTAGATATCAGTACAATGTACTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'BR04RS150_200401'         ---------------------------------------------------------------------------------GAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAAGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCTATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTAGGTGATGCATATTTCTCGGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCCAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCATCAATATT [...]
+	'BR04RS147_200401'         ---------------------------------------------------------------------------ACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACAAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGGACTCAAGACTTTTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAGAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACTATACCTAGTATAAACAATAAGACACCAGGGGTTAGATATCAGTACAATGTACTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'BR04RS151_200401'         ------------------------------------------------------AAAGTTAACCAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATCTGTGCAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAACCCATACAATACTCCAGTATTTGCAATAAAGAAAAAAGACAGTAGTAAATGGAGAAAATTGGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTTTGGGAAGTTCAACTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTAGATGTGGGCGATGCATATTTTTCAGTTCCCCTAGATGAATTCAGAAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGGTTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'BR04RS158_200401'         ------------------------------------------------------------------------------------AAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAAGAAGGGAAAATTTCAAGAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCTATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTAGGTGATGCATATTTCTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCATCAATATT [...]
+	'BR04RS156_200401'         ---------------------------------------------------------------------------------GAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGGACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAGAAATCAATAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATAACTTTAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGAGTTAGATATCAGTACAATGTACTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'BR04RS189_200401'         ---------------------------------------------------------------------------------GAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATTAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCAGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATACTTTTCAGTTCCTTTAGATGACTTCAGAAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAATACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CA14410_200205'           CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCACTGACTGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAATTGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAATATTTGCCATAAAGAARAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGAYTTCTGGGAAGTTCAATTAGGAATACCACATCCGGCAGGTTTAAAAAAGAAAAAATCAGTAACAGTGCTGGATGTGGGTGATGCATATTTTTCAGTGCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTATAATGTGCTTCCACAAGGAGGATCACCAGCAATATT [...]
+	'BR04RS219_200401'         ------------------------------------------------------------------------------------AAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAATATTTGCCATAAAGAAGAAAGACAGTACTAAATGGAGAAAGTTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTCCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATAACTTCAGGAAGTATACTGCATTCACCATACCTAGTACCAACAATGAGACACCAGGAATTAGATATCAGTACAATGTGCTTCCACAAGGAGGATCACCAGCAATATT [...]
+	'BR04RS374_200401'         ---------------------------------------------------------------------------------------AAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATCAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGACTTCAGGGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACAGCATTCACCATACCTAGTGTAAACAATGAGACACCAGGGATTAGATACCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CA14380_200204'           CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAGTTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACGGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTATTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTACATGACTTCAGGAAGTACACTGCATTTACCATACCTAGTATAAATAATGAGACACCAGGGATTAGATATCAATACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'BR04RS93_200401'          ---------------------------------------------------------------------------------GAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAARTTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAGGTTCAATTAGGAATACCACATCCAGCAGGGTTAAAAAAGAGAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAATYCCMTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGCACAAACAATGAGACACCRGGGATTAGATATCAGTAYAATGTGCTYCCGCAGGGAGGATCACCAGCAATATT [...]
+	'BR04RS207_200401'         ------------------------------------------------------------------------------------AAAAAAGCATTACTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAGATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCTATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTCCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAACAAATCAGTAACAGTACTGGATGTRGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCCGGGATTAGATATCAGTACAATGTGCTCCCACAGGGAGGATCACCAGCAATATT [...]
+	'BR04RS194_200401'         ---------------------------------------------------------------------------------GAAAAAAAAGCATTAGTAGAAATCTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAGTGGAGAAAATTAGTAGATTTCAGAGAACTTAACAAGAAAACTCAAGACTTCTGGGAAGTCCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTACTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'BR04RS192_200401'         ------------------------------------------------------------------------------------AAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCGGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTAGGTGATGCATATTTTTCAGTTCCCTTAGATAACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCGGGGATTAGATATCAGTACAATGTGCTCCCACAGGGAGGATCACCAGCAATATT [...]
+	'BR04RS195_200401'         ---------------------------------------------------------------------------------GAAAAAAAAGCATTAGTAGAAATCTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAACCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGATGGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTGACAGTACTGGATGTGGGGGATGCATATTTTTCAGTACCTTTAGATAGCTTTAGGAAATATACTGCATTCACCATACCTAGTATAAACAACGAAACACCCGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'BR04RS204_200401'         ------------------------------------------------------------------------------GAAGAAAAAAAAGCATTAGTAGAAATTTGCACAGAACTGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGACTTCAGAGAACTCAATAAGAGAACTCAAGACTTTTGGGAAGTTCAATTAGGAATACCACATCCAGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATGAGTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGGTCAGATATCAGTACAATGTGCTGCCACAGGGAGGATCACCAGCAATATT [...]
+	'CA14700_200211'           CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAGAGTTAAGCAATGGCCATTGACAGAAGAAAAAAAAGCATTAATAGAAATTTGCACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAAYCCATACAATACTCCAGTATTTGCCATAAAGAAAAARGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGGACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACACCCCGCAGGGTTAAAAAAGAAGAAATCAGTAACAGTACTAGATGTGGGTGATGCATATTTTTCAGTTCCTTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCGCAGGGGGGRTCACCAGCAATATT [...]
+	'BR04RS110_200401'         ------------------------------------------------------------------------------------AAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATTAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCAGCAGGGTTAAAAAAGAAAAAGTCAGTAACAGTACTGGATGTGGGTGATGCATACTTTTCAGTTCCTTTAGATGACTTCAGAAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAATACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'BR04RS109_200401'         ---------------------------------------------------------------------------------------------------GAGATATGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCGTATAATACTCCAGTATTTGCTATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGATTTTTGGGAGGTTCAATTAGGAATACCGCATCCTGCAGGATTAAAAAAGAAAAAATCAGTGACAGTACTGGATGTGGGGGATGCATATTTTTCAGTACCTTTAGATAGCTTTAGGAAATATACTGCATTCACCATACCTAGTACAAACAATGAAACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CA16192_200212'           CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAATAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATCTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTAGATGTGGGTGATGCATATTTTTCAGTTCCCTTATATGACTTCAGGAAGTATACTGCATTYACCATACCYAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'BR04RS112_200401'         ---------------------------------------------------------------------------------GAAAAAAAAGCATTAATAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTACAAGAATTGGGCCTGACAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTCAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGTTTAAAACAGAAGAAATCAGTAACAGTATTGGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATGAATTCAGAAAGTATACTGCATTTACCATACCCAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTACTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'BR04RS111_200401'         ------------------------------------------------------------------------------------AAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATTAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCAGCAGGGTTAAAAAAGAAAAAGTCAGTAACAGTACTGGATGTGGGTGATGCATACTTTTCAGTTCCTTTAGATGACTTCAGAAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAATACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CA16238_200301'           CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGRAAGATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTGCCCTTAGATGATTTCAGGAAGTATACTGCATTTACCATACCTAGTGTAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'BK132_200111'             CCTATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTGAAAAAGMAAAAATCAGTAACGGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAATATACTGCATTTACCATACCGAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CA16321_200306'           CCCATTAGTCCTATTGAAACTGTACCAGTCAAAAAGCCAGGAATGGACGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTGTTTGCCATAAAGAAAAAAGACAGCACTAAATGGAGAAAATTAGTAGATTTCAGAGAGCTTAATAAGARAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCMGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGCGATGCATATTTTTCAGTTCCCTTAGAYGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'BR048_200009'             ---CTTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAGAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCTATAAAGAAAAAAGACAGTAYTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTCCAATTAGGAATACCACATCCTGCAGGATTAAAAAAGAAGAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGATTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'BR04RS103_200401'         ------------------------------------------------------------------------------GAAGAAAAGAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAGAGTTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAGCTTAATAAGAGAACTCAAGACTTTTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCGGGGGTTAGATATCAGTACAATGTGCTCCCACAGGGAGGATCACCAGCAATATT [...]
+	'BR04RS114_200401'         ---------------------------------------------------------------------------------------------------------------GAAATGGAAAGGGAAGGAAAAATTACAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGACTTCAGGGAACTTAATAAAAGAACTCAAGACTTTTGGGAAGTTCAATTAGGGATACCACACCCAGCAGGGTTAAAAAAGAAAAAGTCAGTGACAGTACTGGATGTGGGAGATGCATATTTTTCAGTACCTTTAGATGACTTTAGGAAATATACTGCATTCACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATACCAGTACAATGTACTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'BR04RS139_200401'         ------------------------------------------------------------------------------GAAGAAAAAAAAGCATTAATAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGATAGTACTAAATGGAGGAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAGTCAGTAACAGTACTGGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTCACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTCCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'BR04RS138_200401'         ---------------------------------------------------------------------------------------AAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAAGAAGGAAAGATTTCAAAGATTGGGCCTGAAAATCCATACAATACTCCAATATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTATTGGATGTGGGAGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTACACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTACTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'BR04RS142_200401'         ---------------------------------------------------------------------------------------AAAGCTTTAATAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGATGGTACTAAATGGAGAAAGTTAGTAGATTTCAGGGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGATAAAAAAGAACAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAATATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCGCAGGGAGGATCACCAGCAATATT [...]
+	'BR04RS146_200401'         ------------------------------------------------------------------------------GAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAATATTTGCTATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTATATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'BR04RS143_200401'         ---------------------------------------------------------------------------------------AAAGCATTGATAGAGATATGTACAGAAATGGAAAAAGAAGGAAAAATTTCAAAAATTGGGCCTGAAAACCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGATTTTTGGGAGGTTCAATTAGGAATACCACATCCTGCAGGATTAAAAAAGAAAAAATCAGTAACAGTATTGGATGTGGGTGATGCATATTTTTCAATTCCCTTAGATGGTTTCAGGAAGTACACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'BR04RS136_200401'         ------------------------------------------------------------------------------GAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATAGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTGGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAACAGAAAAAATCAGTAACAGTATTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGGTACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'BR04RS116_200401'         ---------------------------------------------------------------------------------------AAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTGTTTGCCATAAAGAAAAAAGATGGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGGACTCAAGACTTCTGGGAAGTCCAATTAGGAATACCACATCCAGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCTTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGAATTAGATATCAGTACAATGTGCTGCCACAGGGAGGATCACCAGCAATATT [...]
+	'BR04RS115_200401'         ------------------------------------------------------------------------TTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTGTTTGCTATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTTCAGGGTTAAAACAGAAAAAATCAGTAACAGTATTGGATGTGGGTGATGCATATTTTTCAGTTCCATTAGATGAATTCAGGAAGTATACTGCATTTACCATCCCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTCCCACAGGGAGGATCACCAGCAATATT [...]
+	'BR04RS126_200401'         ------------------------------------------------------------------------------GAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGTAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACGGTACTAAATGGAGGAAATTAGTGGATTTCAGAGAACTTAACAAGAGAACTCAAGACTTTTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTCACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCTCCAGCAATATT [...]
+	'BR04RS131_200401'         ---------------------------------------------------------------------------------------------------GAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAGTGGAGAAAATTAGTAGACTTCAGAGAACTTAATAAGAGGACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTAGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGGTATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'BR04RS95_200401'          ------------------------------------------------------------------------------------------------------------ACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCTATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCTCAGGGTTAAAGCAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAATAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'BRCN06_200208'            ---------------------------------------------------------------------------------------------------GAGATATGTACAGAGATGGAAAAGGAAGGAAAAATTTCAAGAATTGGGCCTGACAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAGCTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTAGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAATACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'BRC1529_200208'           CCTATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAGCAATGGCCATTGACAGARGAAAAAAAAGCATTGGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAATATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTTAGAGAACTTAATAARAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTACACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAAGGAGGATCACCAGCAATATT [...]
+	'BRC1532_200208'           CCCATTAGTCCTATTGAAACTGTACCAGTAAAGAAGCCAGGAATGGATGGCCCAAGAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTARAAATTTGTAAGGAAATGGAGGAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCTCAGGGTTAAAAAAGAAGAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCTTTAGATGATTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGAATTAGATATCAATACAATGTGCTTCCACAGGGAGGGTCACCAGCAATATT [...]
+	'BRC1535_200208'           CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGACGGCCCAAGGGTTAAACAATGGCCATTGACAGAAGAGAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACKGCATTTACCATACCTAGTATAAACAATGAAACACCAGGAGTTAGATATCAGTACAATGTGCTGCCACAGGGAGGATCACCAGCAATATT [...]
+	'BRC1534_200208'           CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGGAAATTAGTAGATTTCAGAGAACTTAATAARAGAACTCAAGATTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTAGATGTGGGTGATGCATATTTTTCAGTGCCCTTAGATGAATTCAGGAAGTATACTGCATTCACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTACTTCCACAGGGAGGATCACCAGCTATATT [...]
+	'Brp011_199612'            ---------------------------------------------------------------------------------------------------GAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAGAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTTAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCTGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTGCCCTTAGATGAGTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Brp063_199612'            ---------------------------------------------------------------------------------------------------AAAATTTGTACAGAATTGGAAAGGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAKTAAATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGGGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Brp066_199612'            ---------------------------------------------------------------------------------------------------AAAATCTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAAATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAATTCCCTTAAATGAATTCAGGAATTATACTGCATTTACCATACCCAGTACAAACAATGAGACACCAGGAATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Brp044_199612'            ---------------------------------------------------------------------------------------------------AAAATCTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAACACTCCAGTATTCGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTGGATTTCAGAGAACTTAATAAAAGAACTCAAGATTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTAGATGTGGGTGATGCATATTTCTCAGTTCCTTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCGAGTACAAACAATGAAACACCAGGGATTAGATATCATTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Brp019_199612'            ---------------------------------------------------------------------------------------------------AAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCATTATTTGCTATAAAGAAAAAAGATAGTACTAAATGGAGAAAGTTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTCCAATTAGGAATACCACATCCCGCAGGATTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTATATAACTTCAGAAAGTATACTGCATTTACCATACCTAGTACAAATAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Brp026_199612'            ---------------------------------------------------------------------------------------------------GAAATTTGTACAGAAATGGAAAAAGAAGGAACAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAAATTTCAGAGAGCTTAATAAAAGGACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAGAAAAAAAAATCAGTAACAGTACTGGATGTGGGCAATGCATATTTTTCAGTCCCCTTAAATGAGTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGCGACACCAGGGATAAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'BRC1537_200208'           CCCATTAGTCCTATTGATACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTGGAAATTTGTACTGAAATGGAAAAGGAAGGAAAAATTTCGAGAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCAGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTAGATGTGGGTGATGCATATTTTTCAGTACTTTTAGATGACTTCAGGAAGTATACTGCATTCACCATACCTAGTACAAACAATGAGACACCAGGAATTAGATATCAGTACAATGTGCTGCCACAGGGAGGATCACCAGCAATATT [...]
+	'BRSP658_200208'           ---------------------------------------------------------------------------------------------------------------------------------------TCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGGACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTCACCATACCTAGTATAAACAATGAAACACCAGGGATTAGATATCAGTACAATGTACTTCCACAGGGAGGATCACCAGCGATATT [...]
+	'BRSP799_200208'           ---------------------------------------------------------------------------------------------------GAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAACCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAGGTTCAATTAGGAATACCACATCCCGCAGGGCTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGACTAGATATCAGTACAATGTGCTTCCACAAGGAGGATCACCAGCAATATT [...]
+	'BRSP586_200208'           ---------------------------------------------------------------------------------------------------GAAATTTGTAAAGAAATGGAAGAGGAAGGGAAAGATTCAAAAATTGGGCCTGAAAATCCATACAACACTCCAGTATTTGCCATAAAGAAAAAAGATGGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTTTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCGGGGATTAGATATCAGTACAATGTGCTCCCACAGGGAGGATCACCAGCAATATT [...]
+	'BRSP483_200208'           ---------------------------------------------------------------------CCATTGACAGAAGAGAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGATGGTAATAAATGGAGAAAATTAGTTGATTTCAGAGAACTTAATAAGAGAACTCAAGATTTCTGGGAAGTCCAATTAGGGATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'BRSP485_200208'           ---------------------------------------------------------------------CCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAARTTAGTAGATTTCAGAGAGCTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGRGGATCACCMGCAATATT [...]
+	'BZ167_200111'             CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTGGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTRACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'BRC1539_200208'           CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCGAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAACTAGTAGATTTCAGAGAACTTAATAAGAGGACTCAAGACTTTTGGGAAGTTCAATTAGGAATACCACATCCCTCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATCAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'BRC1538_200208'           CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTAACAGAAGAAAAAAAAGCATTAACAGAAATTTGTACAGAACTGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAATATTTGCTATAAAGAAGAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGTATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTACATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATCAGATATCAGTACAATGTGCTTCCACAAGGAGGATCACCAGCAATATT [...]
+	'BRCN10_200208'            ------------------------------------------------------------------------------------AAAAAAGCATTAVCAGMRATATGTACAGAAATGGAAAARGAAGGRAAAATTTCAAAAATTGGGCCTGAAAATCCATACAACACTCCAATATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGACTTTTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGCACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'BRC1540_200208'           CCCATTAGTCCTATTGAAACTGTACCAGTAAAGAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAGAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAARAGTTGGGCCTGAAAACCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTGGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTTTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCATTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGGTTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Brp069_199612'            ---------------------------------------------------------------------------------------------------AAAATTTGTACAGAATTGGAAAAGGAAGGAAAAATTTCGAAAATTGGGCCTGAAAATCCATACTATACTCCAGTATTTGCCATAAAGAARAAGGACAGTACTAAATGGAGAAAATTAGTARATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAGTCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTACACTGCATTCACCATACCTAGTGTCAACAATGAGACACCAGGAATTAGGTACCAGTACAATGTGCTTCCACAAGGAGGATCACCAGCAATATT [...]
+	'BRBS531_200104'           ------------------------------------------------------------AAACAATGGCCATTGACAGAAGAGAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAAYCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGGAAATTAGTAGATTTCAGAGAACTTAATAAGAGGACTCAAGACTTCTGGGAAGTTCAATTAGGGATACCACATCCAGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATACTTTTCAGTTCCCTTAGAYGACTTCAGGAAGTATACTGCATTTACTATACCTAGTATAAACAATGAGACACCAGGGACTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'BRBS530_200104'           ---------------------------------------------------------GTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATCTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACCCCAGTATTTGCCATAAAGAAAAAGGACAGCACTAAATGGAGAAAACTAGTGGATTTCAGGGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTCCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAGYCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCGGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACAATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'BRBS535_200104'           ------------------------------------------------------------AAACAATGGCCATTGACAGAAGAAAAAAGAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CA1407_199804'            CCCATTAGTCCTATTGAAACTGTACCAGTACAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCGAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCTATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGATTTCTGGGAAGTTCAATTAGGAATACCACATCCAGCAGGGTTAAAAAAGAGAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGACGAGTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'BRC1468_200104'           ------------------------------------------------------------------------------------AAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAACTAGTAGATTTCAGAGAACTTAATAAGAGGACTCAAGACTTTTGGGAAGTTCAATTAGGAATACCACATCCCTCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCYAGTACAAACAATGAGACACCAGGGATCAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'BRBS469_200104'           ---------------------------------------------------------------------------------------------------------------GAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCARAGAACTTAATAARAGAACTCAARACTTCTGGGAAGTTCAATTAGGGATACCACATCCCGCAGGATTAAAAAAGAAAAAATCAGTAACARTACTARATGTGGGTGATGCATATTTTTCAGTTCCTTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATGAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAAGGAGGATCACCAGCAATATT [...]
+	'BRBS465_200104'           ---------------------------------------------------------------------------------------AAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGATAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAARAGAACTCAARATTTCTGGGAAGTCCAATTAGGAATACCACATCCCGCAGGATTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCTGGGATTAGATATCAGTACAATGTACTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'BRBS462_200104'           ---------------------------------------------------------------------------------------AAAAGCTTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAATATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAGTCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCATTACATGATTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGACTAGATATCAGTACAATGTGCTGCCACAGGGAGGATCACCAGCAATATT [...]
+	'BRBS467_200104'           ---------------------------------------------------------------------------------------------------GAMATKTGTACAGAAATGGAAAAGGAAGGGAARATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTRTTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTRGTAGATTTCAGRGARCTTAATAARAGAACTCAARAMTTSTGKGAAGTYCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAGTCAGTAACCGTRCTGGATGTGGGTGATGCATATTTTTCAGKTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGCATRAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CA14284_200203'           CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGACGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTRAAAAAGAAAAAATCAGTAACAGTACTAGATGTGGGTGATGCTTATTTCTCAGTTCCTTTAGACGATTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGAYTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CA1261_199710'            CCTATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTCAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGARAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTTAGAGAGCTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCGCATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCCTTTACCATACCTAGTATAAACAATGAGACACCAGGGATKAGATATCAGTATAATGTGCTTCCACAGGGGGGATCACCAGCAATATT [...]
+	'BRC1522_200208'           CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAGCAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTGTTTGCCATAAAGAAAAAAGATAGTACTAAATGGAGAAAATTAGTAGACTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTATTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGACGATTTCAGGAAGTACACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'BRC1521_200208'           CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAGCAATGGCCATTGACAGAAGAAAAAACAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTGTTTGCCATAAAGAAAAAAGATAGTACTAAATGGAGAAAATTAGTAGACTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTATTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGACGATTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Brp130_199612'            ---------------------------------------------------------------------------------------------------AAAATTTGCACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAAATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAATTCCAATTAGGAATACCACATCCCGCAGGATTAAAAAAGAAGAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTACATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Brp089_199612'            ---------------------------------------------------------------------------------------------------GAAATTTGTACAGAAATGGAGAAGGAAGGAAAAATTTCAAAAATTGGGCCCGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTRCTAAATGGAGAAAATTAGTGGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGCTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAAATAACTTCAGGAAGTATACTGCATTTACCATACCTAGTACGAACAATGAAACACCGGGGATTAGATTTCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Brp093_199612'            ---------------------------------------------------------------------------------------------------GAAATTTGTGCAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGGAAATTAGTAAATTTCAGGGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAACAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACGGCATTTACCATACCTAGTATAAATAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'BRC1519_200208'           CCCATAAGTCCTATTGAAACTGTACCAGTAAAGAAACCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAWTGGAAAAGGAAGGAAAGATTTCAAAAATTGGGCCTGARAATCCATACAATACTCCARTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTCCAATTAGGAATACCACATCCCTCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATACTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCCTTTACCATACCTAGTATAAACAATGMGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CA1136_199709'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGARGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAARATTTCAAAAATTGGGCCTGAAAACCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGAYAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTTTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTRCTGGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATYAGRTATCAGTAYAATGTGCTTCCACAGGGGGGATCACCAGCAATATT [...]
+	'BRC1472_200104'           ---------------------------------------------------------------------------------------------------GAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAAYCCATACAATACTCCAGTRTTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCTTTACATGACTTCAGGAAATATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'BRC1517_200208'           CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTACAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGATAGTACTAAATGGAGGAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTYTGGGAAGTTCAATTAGGGATACCACATCCCGCAGGGTTAAAGAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAAACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCCATATT [...]
+	'BRC1518_200208'           CCCATAAGTCCTATTGAAACTGTACCAGTAAAGAAACCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAWTGGAAAAGGAAGGAAAGATTTCAAAAATTGGGCCTGAGAATCCATACAATACTCCAATATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTCCAATTAGGAATACCACATCCCTCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATACTTTTCAGTTCCCTTAGATGAATTCAGAAAGTATACTGCCTTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CA16326_200305'           CCTATTAGTCCTATTGAAACTGTACCAGTYAMAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAGTGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAARATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGYACTAAATGGAGAAAATTAGTAGATTTCAGGGAACTWAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACACCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTCACCATACCTAGTATAAACAATGAGACACCAGGGGTTAGATATCAGTACAATGTGCTGCCACAGGGAGGATCACCAGCAATATT [...]
+	'ED_V67_199901'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCACTGACAGAAGAAAAAAAAGCATTAATAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAACCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTGACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTGTAAACAATGAGACACCAGGGGTTAGATATCAGTACAATGTACTTCCGCAGGGAGGATCACCAGCAATATT [...]
+	'ED_V65_199901'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGATAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGATTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAGAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCTTTAGATGACTTCAGGAAGTACACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATACCAGTACAATGTACTTCCACAAGGAGGATCACCAGCAATATT [...]
+	'ED_V77_199901'            CCCATTAGTCCTATTGCAACTGTACCAGTAAAAAAGCCAGGAATGGATGGTCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGACTAAAAAAGAGAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGAAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGAATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'ED_V84_199901'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAGAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAGAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGATGGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTCAATAAAAGAACTCAAGACTTCTGGGAGGTTCAATTAGGAATACCACATCCCTCAGGGCTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTACATGACTTCAGGAAGTATACTGCATTTACTATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCATCAATATT [...]
+	'ED_V79_199901'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAATAGAAATTTGCACAGAAATGGAAAAGGAAGGGAAAATTACAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGACTTCAGAGAACTCAATAAGAGAACTCAGGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTATTGGATGTGGGTGATGCATATTTTTCAGTGCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATCAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'ARG17_199701'             ------------------------------------------------------------------------------------------------------------------------------------------------GGGCCTGAAAATCCATACAATACTCCAGTGTTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTYAGAGARCTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAGAAATCAGTAMCAGTVCTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTARACGACTTCAGGAAGTATMCTGCATTTACCATACCTAGTGTAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCGCAGGGAGGATCACCAGCAATATT [...]
+	'ED_V51_199901'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAACAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAGATTGGGCCTGAAAATCCATACAATACTCCAATATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTTTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGACGTGGGTGATGCATATTTTTCAGTTCCACTAGATGACTTCAGGAAATATACTGCATTTACCATACCTAGTGTAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTCCCACAGGGAGGATCACCAGCAATATT [...]
+	'ED_V5_199901'             ---------------------------------------------------------------------------------------------TTAATAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACGGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTCACCATACCTAGTACAAACAATGAGACACCAGGGATTAGGTATCAGTACAATGTGCTKCCACAGGGAGGATCACCAGCAATATT [...]
+	'ED_V52_199901'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAATAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTACAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAGGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCCAGTGTAAACAATGAGACACCAGGGATCAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'ED_V61_199901'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAGAAGCCAGGAATGGATGGTCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAATGGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGACCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGGAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGRTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAAYAATGAGACACCAGGGATTAGATATCAGTACAATGTRCTTCCACAGGGAGGGTCACCAGCAATATT [...]
+	'ED_V55_199901'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAGAAAAAAGCTTTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGCGGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGGACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTATTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCCAGTATAAACAATGAGACACCAGGGATTAGATATCAATACAACGTGCTTCCACAGGGAGGGTCACCAGCAATATT [...]
+	'ED_V90_199901'            ---------------------------------------------------------------------------------------AAAGCATTAATAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTTAGGGACCTTAATAAGAGAACTCAAGAYTTCTGGGAGGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAACAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATRACTTCAGGAAGTATACTGCATTTACYGTACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTACTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'GRSPR1_200301'            ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGGAAACTAGTAGACTTTAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTGCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACTGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGATTTCAGAAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCGCCAGCAATATT [...]
+	'ARG18_199701'             ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAAYCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTCCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAATAATGAAACTCCAGGGATTAGATATCAGTACAATGTACTACCACAGGGAGGATCACCAGCAATATT [...]
+	'GRSPR10_200301'           ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGATAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGATTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTGAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGCGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAAACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'GRSPR102_200301'          ---------------------------------------------------------------------------------------------------------------GAAATGGAAAAAGAAGGTAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAATATTTGCCATAAAGAAAAAAGACAGCACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAGGACTTCTGGGAAGTCCAATTAGGAATACCACATCCCTCAGGGTTAAAAAAGAAAAAGTCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAATATACTGCATTTACCATACCTAGTGTAAACAATGCGACACCAGGAATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'GRSPR100_200301'          ------------------------------------------------------------------------------------------------------------ACAGAAATGGAAAAGGAGGGAAAGATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCYATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGATTTCTGGGAAGTTCAATTAGGRATACCACATCCCTCRGGGTTAAAAAAGAAAAAATCAGTAACAGTATTGGATGTGGGTGATGCATATTTTTCAGTTCCTYTAGATGAMTTTAGGAAGTATACTGCATTTACYATACCTAGTAGAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'ED_V97_199901'            ------------------------------------------------------------------------------------------GCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTACAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAGTGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTYCAATTAGGGATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTAGATGTGGGTGATGCATATTTCTCAGTTCCATTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'ED_V92_199901'            CCCATTAGTCCTATTGAGACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAGGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCAGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACCGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTACTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'ED_V91_199901'            ---------------------------------------------------------------------------------------AAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAATATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGACTTTAGAGAACTTAGTAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTGCTAGATGTGGGTGATGCATATTTTTCAGTTCCTTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'ED_V94_199901'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAACCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGATTTYTGGGAAGTTCAGTTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCYTTACATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGRTATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'ED_V95_199901'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAGGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTACAAAAATTGGGCCTGAGAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTTTGGGAAGTTCAATTAGGAATACCCCATCCTGCAGGGTTAAAAAAGAAAAAGTCAGTAACAGTAYTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACTATTCCTAGTATAAACAAYGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'ED_V46_199901'            ------------------------------------------------------------------------------------------------ATAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTTTTTGCCATAAAGAAAAAAGATAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAGGTTCAATTAGGAATACCACATCCTGCAGGGCTAAAACAGAGAAAATCAGTAACAGTAYTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTCACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'ARG14_199701'             ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAGAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCTATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAGAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'ARG13_199701'             ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAAGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGGAARTTAGTAGATTTCAGAGAACTYAATAAAAGAACTCAAGATTTTTGGGAGGTTCAATTAGGAATACCGCAYCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGGGATGCATATTTTTCAGTTCCCTTAGATGATTTCAGGAAGTACACTGCATTCACCATACCTAGTGTCAACAATGAGACACCAGGRATTAGGTACCAGTACAAYGTGCTTCCACAAGGAGGATCACCAGCAATATT [...]
+	'BRCN03_200208'            ---------------------------------------------------------------------------------------------------------TGTGCAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAGAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGATAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAGGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAGTCAGTAACAGTATTGGATGTGGGTGATGCATATTTTTCAGTTCCTTTAGATAACTTCAGGAAGTATACTGCATTTACCATACCTAGTCTAAACAATGAGACACCAGGCATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'ED_V14_199901'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAGATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAATATTTGCCATAAAGAAAAAAGACAGTACTAAATGGGGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGGATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCCAGTAGAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCGCAGGGAGGATCACCAGCAATATT [...]
+	'ARG15_199701'             ---------------------------------------------------------------------------------------------------------TGTACWGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGGAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGATTTTTGGGAGGTTCAATTAGGAATACCGCATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGGGATGCATATTTTTCAGTCCCCTTAGATGATTTCAGGAAGTACACTGCATTCACCATACCTAGTGTCAACAATGAGACACCAGGAATTAGGTACCAGTATAATGTRCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'ARG12_199701'             ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAAGAAGAGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAATATTTGCCATAAAGAAAAAAGATAGTACTAAATGGAGGAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGATTTTTGGGAGGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGGGATGCATATTTTTCAGTCCCCTTAGATGATTTCAGGAAGTACACTGCATTCACCATACCTAGTGTCAACAATGAGACACCAGGAATTAGGTACCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'ARG09_199701'             ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAGAAGGAAGGGAAAATTTCAAGGATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGGAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'ARG08_199701'             ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGATGGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGAAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'ARG10_199701'             ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAAGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGGAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGATTTTTGGGAGGTTCAATTAGGAATACCGCATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTRGATGTGGGGGATGCATATTTTTCAGTYCCCTTAGATRATTTCAGGAAGTACACTGCATTCACCATACCTAGTGTCAACAATGAGACACCAGGAGTTAGATACCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'ARG11_199701'             ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAGAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTCAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCAGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTGCTGGATGTGGGTGATGCATATTTTTCGGTCCCTTTAGATGATTTCAGAAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTACTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'ED_V17_199901'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAGCAGTGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAGATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAGGTTCAATTAGGAATACCACATCCCGCAGGGCTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCCTATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'ED_V37_199901'            ---------------------------------------------------------------------------------------------TTAATAGAAATTTGTACAGAGATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAACTAGGAATACCACATCCYGGAGGGTTAAAAAAGAGAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCYAGTTTAAACAATGAGACACCAGGGATTAGGTATCAGTATAATGTACTTCCACAGGGAGGGTCACCAGCAATATT [...]
+	'ED_V34_199901'            ------------------------------------------------------------------------------------------------------------ACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCATTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGATAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGATTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGCTAAAAAAGAAAAAATCAGTTCACGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATACCAGTACAATGTGCTTACACAGGGAGGATCACCAGCAATATT [...]
+	'ED_V39_199901'            ------------------------------------------------------------------------------------------GCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGGACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCTGTAACAGTATTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGATTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAAGGAGGATCACCAGCCATATT [...]
+	'ED_V43_199901'            ------------------------------------------------------------------------------------------------------ATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATACTTTTCAGTTCCCTTAGATGACTTTAGGAAATATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'ED_V42_199901'            ---------------------------------------------------------------------------------------------------GAAATTTGCACAGAAATGGAAAAGGAGGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGCTAAAAAAGAAAAAATCAATAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCTTTATATGGCTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTCCCACAGGGAGGATCACCAGCAATATT [...]
+	'ED_V31_199901'            ------------------------------------------------------------------------------------AAAAAAGCATTAATGGAAATTTGTGCAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAACAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATACTTTTCAGTTCCTTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'ED_V22_199901'            ---------------------------------------------------------------------------------------AAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGTAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAGGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTAGATGTGGGCGATGCATATTTTTCAGTCCCTTTAGATGACTTTAGAAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'ED_V18_199901'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAGCAGTGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAGATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCTATAAAGAAAAAAGACAGTACTAAATGGGGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAGGTTCAATTAGGAATACCACATCCCGCAGGGCTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCCTATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'ED_V26_199901'            ---------------------------------------------------------------------------------GAAAAAAAAGCATTAGTAGAAATCTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACGGTACTAAATGGAGAAAATTAGTAGATTTTAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGACTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCTTTAGATGAATTCAGGAAATATACTGCATTTACCATACCTAGCACAAACAATGAGACACCAGGGATTAGATATCAGTACAACGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'ED_V28_199901'            ---------------------------------------------------------------------------------------------------GAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAGATTGGGCCTGAAAATCCATACAATACTCCAATATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTTTGGGAAGTTCAATTAGGAATACCACATCCCTCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAATTCCCTTAGATGACTTCAGAAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'GRSPR104_200301'          ---------------------------------------------------------------------------------------------------------------GAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGACCTGATAATCCATACAATACTCCAATATTTGCTATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGATTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAGAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCTTTAGATGAATTCAGGAAGTATACTGCATTTACTATACCTAGTACAAACAATGAGACACCAGGAATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'ARG31_199701'             ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTTAGAGAACTYAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAGAAGAAAAAATCAGTAACAGTACTGGATGTGGGGGATGCATATTTTTCAGTTCCCTTAGATGAYTTYAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CA1816_199809'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAACCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGARAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCTCATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTATTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGACGATTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGGTATCAGTACAATGTACTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CA17652_200311'           CCCATTAGTCCTATTGAAACTGTACCTGTAAAAAAGCCAGGAATGGATGGYCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATYTGTACAGAAATGGAAAAGGAAGGRAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGAYAGTAYTAAATGGAGAAAATTAGTAGATTTCAGAGARCTTAAYAAGAGRACTCAAGACTTYTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATKAGATATCAGTACAAYGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'ARG33_199701'             ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAAGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGGAAATTAGTAGATTTCAGGGAACTTAATAAAAGAACCCAAGATTTTTGGGAAGTTCAATTAGGAATACCGCATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGGGATGCATATTTTTCAGTTCCCTTAGATGATTTCAGGAAGTACACTGCATTTACCATACCTAGTGTCAACAATGAGACACCAGGAATTAGGTACCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CA17630_200310'           CCYATTAGTCCTATTRAAACTGTACCAGTAAAAAARCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGARATGGAAAAGGAAGGGAAAATTTCRAAAATTGGGCCTGAAAATCCATACAATACYCCAGTRTTTGCYATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAARAGAACTCARGACTTCTGGGAAGTTCAATTAGGAATACCACATCCYTCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATAYTTYTCAGTTCCCTTAGATGACTTYAGAAAGTATACWGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTYCCACAGGGAGGRTCACCAGCAATATT [...]
+	'BRCN05_200208'            ---------------------------------------------------------------------------------------------------GAGATATGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAACTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTCCAGTTAGGAATACCACATCCCGCAGGATTAAAACAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'ARG28_199701'             ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAAGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAATATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGGAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGATTTTTGGGAGGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGGGATGCATATTTTTCAGTCCCCYTAGATGAGTTCAGGAAGTACACTGCATTCACCATACCTAGTATCAACAATGAGACACCAGGAATTAGGTACCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'ARG27_199701'             ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAGAATTGGGCCTGAAAATCCATACAATACCCCAGTATTTGCCATAAAGAAAAAGGACGGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGATTTCTGGGAGGTTCAATTAGGAATACCACATCCCGCAGGGCTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'ARG29_199701'             ---------------------------------------------------------------------------------------------------------TGCACAGAAATGGAAAAAGAAGGAAAAATTTCAAAAATCGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAGTGGAGGAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGACTTTTGGGAGGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGGGATGCATATTTTTCAGTCCCCTTAGATGAWTTCAGGAAGTACACTGCATTCACTATACCTAGTATCAACAATGAGACACCAGGAATTAGGTACCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'ARG30_199701'             ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACGGTACTAAATGGAGAAAATTAGTAGATTTTAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCAGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCGGTTCCTTTAGATGACTTCAGAAAGTATACGGCATTTACCATACCTAGTATAAACAATGAGACACCAGGAATCAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCGATATT [...]
+	'ARG34_199701'             ---------------------------------------------------------------------------------------------------------TGTACAGAGATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAATATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCARTTAGGAATACCACATCCAGCAGGATTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCTTTAGATGAATTCAGAAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCGATATT [...]
+	'AV_M4141N_200501'         ------------------------------------CCAGGAATGGATGGCCCAAAGGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAACAGAAATCTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACCCCAGTGTTTGCTATAAAGAAAAAAGACAGCACTAAATGGAGAAAATTAGTTGATTTTAGGGAACTCAATAAAAGAACTCAAGACTTCTGGGAAGTTCAACTAGGAATACCACATCCAGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTAGATGTAGGGGATGCATATTTTTCAGTTCCCTTAGATAACTTTAGAAAGTACACTGCATTCACTATACCTAGTRTAAACAATGAGACACCAGGGATTAGATATCAGTACAAYGTGCTTCCACAGGGAGGATCACCAGCWATATT [...]
+	'AS_SOU_199801'            ---------------------------------------------------------------------------------------------------------------GAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAACCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGATTTCTGGGAAATTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTATTGGATGTGGGTGATGCATATTTTTCAGTTCCTTTACATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGACGAGATATCAGTACAATGTGCTTCCACAAGGAGGATCACCAGCAATATT [...]
+	'AV_M5374N_200501'         CCCATTAGTCCTATTGACACTATACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAACAGAAATCTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTGTTTGCTATAAAGAAAAAAGACAGCACTAAATGGAGAAAATTAGTTGATTTTAGGGAACTCAATAAAAGAACTCAAGACTTCTGGGAAGTTCAACTAGGAATACCACATCCAGCAGGGCTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGGGATGCATATTTTTCAGTCCCCTTAGATAGCTTTAGGAAGTATACTGCATTCACTATACCTAGTATAAACAATGAGACACCRGGGAYTAGATATCAGTACAACGTGCTGCCACAGGGAGGATCACCGGCTATATT [...]
+	'BAL_199701'               ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------AAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAGCTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATCAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'AV_M9721N_200501'         ---------------------------------AAGCCAGGAATGGATGGCCCAAAGGTCAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTGGAGATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGATAGTACTAAATGGAGAAAATTAGTAGATTTTAGAGAACTCAATAAGAGAACCCAAGACTTCTGGGAGGTCCAATTAGGAATACCTCATCCTGCGGGATTAAAGAAGAAAAAATCAGTAACAGTACTGGACGTAGGGGATGCATATTTTTCAGTTCCCTTAGATGATTTCAGGAAGTACACTGCATTCACCATACCTAGCACCAACAATGAGACGCCAGGAATTAGATATCAATACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'AS_CRA_199801'            ---------------------------------------------------------------------------------------------------------------GAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACCAAGTGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTTTGGGAAGTTCAATTAGGGATACCACATCCCGCAGGATTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATAACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGACTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'ARG36_199701'             ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAGAATTGGGCCTGAAAATCCATACAATACTCCAATATTTGCCATAAAGAAAAAAGACAGTGCTAAATGGAGRAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGATTTTTGGGAGGTTCAATTAGGAATACCGCATCCTGCAGGGTTAAAAAAGAAAAAGTCAGTAACAGTACTGGATGTGGGGGATGCATATTTTTCAGTTCCCTTAGATGATTTCAGGAAGTACACTGCATTCACCATACCTAGTGTCAACAATGAGACACCAGGAATTAGGTAYCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'ARG35_199701'             ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAAGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGATAGTACTAAATGGAGGAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGATTTTTGGGAGGTTCAATTAGGAATACCRCATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGGGATGCATATTTTTCAGTCCCCTTAGATGATTTCAGGAAGTACACTGCATTCACCATACCTAGTGTCAACAATGAGACACCAGGAATTAGGTACCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'AS_BER_199801'            ---------------------------------------------------------------------------------------------------------------GAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAATAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'AS_BOC_199801'            ---------------------------------------------------------------------------------------------------------------GAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAACCCATATAATACTCCAGTATTTGCTATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAACAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATACTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCGTTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'ARG26_199701'             ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGACGACTTCAGGAAGTATACTGCATTTACCATACCTAGTGTAAACAATGAGACACCAGGAATTAGATATCAGTACAATGTGCTTCCGCAGGGAGGATCACCAGCAATATT [...]
+	'GRSPR19_200301'           ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAGGAAGGAAARATTTCAAAAATTGGGCCTGAAAAYCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGATTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTATTGGATGTGGGTGATGCATATTTTTCAGTTCCTTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATGAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'GRSPR15_200301'           ---------------------------------------------------------------------------------------------------------TGTAMAGMAATGGAAAAGGAAGGAAAGATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCGATATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAGAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTRGAYGAATTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGCGACACCAGGGATTAGGTATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'GRSPR2_200301'            ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGGAAACTAGTAGACTTTAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTGCAATTAGGAATACCACATCCCGCAGGGTTAAGAAAGAAAAAATCAGTAACTGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGATTTCAGAAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'GRSPR21_200301'           ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAGGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGTTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCACTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGCATAAATAATGAGACACCCGGGATTAGATATCAATACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'GRSPR20_200301'           ------------------------------------------------------------------------------------------------------------------ATGGAAAAGGAAGGAAAAATTTCAAGAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCGGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTAGGTGATGCATATTTTTCAGTTCCCCTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTACTTCCACAGGGGGGATCACCAGCAATATT [...]
+	'GRSPR147_200301'          ---------------------------------------------------------------------------------------------------------------------GAAAAGGAAGGAAAATTTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCTCAGGGTTAAAAAAGAAAAAATCAGTAACAGTATTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTTAGGAAGTATACTGCATTTACTATACCTAGTAGAAACAATGAGACACCAGGAATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCRCCAGCAATATT [...]
+	'GRSPR110_200301'          ---------------------------------------------------------------------------------------------------------TGTAAAGCAATGGAAAAGGAAGGGAAAATCTCAAGAATTGGGCCTGAAAATCCATATAATACTCCAATATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCRCATCCCGCAGGGTTAAAGAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTTAGGAAGTATACTGCCTTTACYATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'GRSPR11_200301'           ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAGAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGNTTACAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCTTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTAAAAACAATGAGACACCAGGGATTAGGTATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'GRSPR113_200301'          ---------------------------------------------------------------------------------------------------------TGTGCAAAGATGGAAAAGGAAGGAAAAATTACAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGATAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTCAATAAGAGAACTCAAGACTTCTGGGAGGTCCAATTAGGAATACCTCATCCCGCGGGGTTAAAAAAGAAGAAATCAGTAACAGTACTAGATGTGGGTGATGCATATTTTTCAGTTCCCCTAGATGACTTTAGAAAGTACACTGCATTCACTATACCTAGTATAAACAATGAGACACCAGGGATTAGATATNNNNNNNNNNNNNNTCCACAGGGGGGATCACCAGCAATATT [...]
+	'GRSPR14_200301'           ------------------------------------------------------------------------------------------------------------ACAGAAATGGAAAAGGAAGGGAWAATTTCAAAAATGGGGCCTGAAAATCCATACAATACTCCAATATTTGCCATAAAGAAWAAAGACAGTACTAAATGGAGAAAATTRGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTCCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATACTTTTCAGTTCCATTAGATGACTTCAGAAAGTATACTGCATTTACCATACCTAGTACAAATAATGAGAAWCCAGGGATTAGGTATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'GRSPR23_200301'           ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAGAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTTAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAGTTCAGGAAGTATACTGCATTTACCATACCTAGCACAAACAATGAGACRCCAGGGATTAGATATCAATACAATGTGCTTCCGCAAGGAGGATCACCAGCAATATT [...]
+	'CA2087_199810'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAGAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAARATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAATATTTGCCATAAAGAAAAAAGATGGTACTAAGTGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCYGCAGGGTTGAAAAAGAAAAAATCAGTAACAGTACTRGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTYACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTGCCACAGGGAGGATCACCAGCAATATT [...]
+	'ARG24_199701'             ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAGGAAGGAAAAATCTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTTAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATTCCACATCCCGCAGGGTTAAAAAAGAAAAAAGCAGTAACAGTGCTGGATGTAGGTGATGCMTATTTTTCAGTTCCYTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTTTAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCATCAATATT [...]
+	'CA1865_199808'            CCCATTAGCCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAGGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTGCAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAATATTTGCCATAAAGAAAAAAGACAGCACTAAATGGAGAAAATTAGTAGACTTCAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGTATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTGTAAACAATGAGACACCASGGGTTAGATATCAGTACAATGTACTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'ARG25_199701'             ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAGGAGGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACGGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTACATGACTTCAGGAAGTATACAGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CA1851_199809'            CCCATTAGTCCTATTGAAACTGTACCTGTAAAGAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTRACAGAAGAAAAAAAAGCATTAGTARAGATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTGTTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAGCTTAATAAAAGGACTCAAGACTTCTGGGAAGTTCAGTTAGGAATACCACATCCCGCAGGGCTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATACCAGTACAATGTGCTTCCGCAGGGAGGATCACCAGCAATATT [...]
+	'ARG23_199701'             ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCTATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAGAAGAAAAAATCAGTAACAGTACTGGACGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTKCCACAGGGAGGATCACCAGCAATATT [...]
+	'ARG19_199701'             ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAGGTTCAATTAGGAATACCACATCCCGCAGGGCTAAAAAAGAAAAAGTCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATAACTTCAGAAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTCGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CA21113_200406'           CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCGAAAGTTAAACAATGGCCATTGACAGAGGAAAAAAAAGCATTGGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAGAATCCATACAATACTCCAGTATTTGCCATAAAAAAGAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGATTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTATTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTGGACGACTTCAGGAAGTATACTGCATTTACCATACCTAGYAYAAACAATGAGACACCAGGAATTAGGTATCAMTACAACGTGCTTCCACAAGGGGGATCACCAGCAATATT [...]
+	'ARG22_199701'             ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCTATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGARGTTCAACTAGGGATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCTTTAKATGATTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CA2106_199810'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTCAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAATAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATTAAGAAGAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTAGATGTAGGTGATGCATATTTCTCRGTTCCCTTAGATGAMTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'BRSP470_200208'           ---------------------------------------------------------------------------------------AGAGCATTAGTAGAAATTTGTACAGAAATGGAAAAAGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAARAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAARTCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGRAARTATACTGCATTTACCATACCTAGCACAAACAATGAGACACCTGGGATTAGATATCAGTACAATGTGCTTCCCCAGGGAGGATCACCAGCAATATT [...]
+	'BRNE268_200208'           ---------------------------------------------------------------------------------------------------GAGATTTGTACAGAAATGGAAAAAGAAAGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGGTTAGATATCAGTACAATGTGCTCCCACAGGGAGGATCACCAGCAATATT [...]
+	'BRNE270_200208'           ---------------------------------------------------------------------------------------------------GAAATCTGTGCAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTTAGAGAACTTAATAAAAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAGAAGAAAAAATCAGTAACAGTACTGGATGTGGGGGATGCATACTTTTCAGTTCCCTTAGATGAGTTCAGAAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'BRNE267_200208'           ---------------------------------------------------------------------------------------------------GAGATATGTACAGAAATGGAAAAGGAGGGAAAAATTTCAAAAATTGGGCCTGAGAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGACTTTTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTACATGACTTCAGGAAGTACACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'BRNE186_200208'           ------------------------------------------------------------------------------------------------------ATATGTACAGAGATGGAAAAGGAAGGAAAAATTTCAAGGATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAGCTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCTCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTAGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'BRNE266_200208'           ---------------------------------------------------------------------------------------------------GAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAATATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTTTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATACTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTACAAATAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'BRNE271_200208'           ---------------------------------------------------------------------------------------------------GAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTGTTTGCCATAAAGAAAAAAGACAGCACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTCACCATACCTAGTACTAACAATGAGACACCAGGTATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'BRP2018_200104'           ---------------------------------------------------------------------------------------------------GAGATTTGTACAGAAATGGAAAAGGAAGGGAAAATTACAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAARGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACCCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATACTTTTCAGTTCCCTTAGATGAATTTAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'BRP2020_200104'           ---------------------------------------------------------------------------------------------------GAAATCTGTACAGAAATGGAAAAGGAAGGGAAGATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTATTGGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAATAATGAGACACCAGGGATTAGATATCAATACAATGTACTTCCACAGGGGGGATCACCAGCAATATT [...]
+	'BRP2017_200104'           ---------------------------------------------------------------------------------------------------GAGATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAATATTTGCAATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTAGATGTAGGTGATGCATATTTTTCAGTTCCATTAGACGAATTCAGGAAATATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'BRNE272_200208'           ---------------------------------------------------------------------------------------------------GAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAGTGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATACTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'BRNE274_200208'           ---------------------------------------------------------------------------------------------------GAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAAGACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACACCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTAGGAGATGCATACTTTTCAGTTCCCTTAGATGAGTTCAGGAAGTATACTGCATTCACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'BRNE135_200208'           ---------------------------------------------------------------------------------------------------GAAATTTGTACGGAATTGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAGAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTCCAATTAGGAATACCACATCCCGCAGGGTTAAGAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTCACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAAGGAGGATCACCAGCAATATT [...]
+	'BRC1546_200208'           CCAATAAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCGAGAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAGATTTCAAAAATTGGGCCCGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTTAGAGAGCTTAATAAAAGAACTCAAGACTTCTGGGAAGTCCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCGAGTATAAACAATGAGACACCAGGGGTTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'BRC1545_200208'           CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAGAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAGAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTAGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTGCCACAGGGAGGATCACCAGCAATATT [...]
+	'BRC1548_200208'           CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCTATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAACAAGAGAACTCAAGACTTCTGGGAGGTCCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGACGAATTCAGGAAGTATACTGCATTTACCATACCTAGTGTAAACAATGAGACACCAGGGATTAGATATCAGTNCAATGTGCTTCCACAGGGAGGATCC??????????? [...]
+	'BRCN28_200208'            ---------------------------------------------------------------------------------------------------GAGATTTGTACAGAACTGGAAAAGGAAGGGACAATTTCAAAACTTGGGCCTGAAAATCCCTACAATACTCCAGTATTTGCCCTAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGACTTTAGAGAACTTAATAAGAGAACTCAAGACTTTTGGGAAGTTCAATTAGGAATACCACATCCGGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACTATACCTAGTACAAACAATGAGACACCAGGGATTAGGTATCAGTACAATGTGCTTCCACAAGGAGGATCACCAGCAATATT [...]
+	'BRCN32_200208'            ---------------------------------------------------------------------------------------------------GAGATATGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAACTAGGGCCTGAAAATCCATACAATACTCCAGTATTTGCTATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGACTTCAGAGAACTTAATAAAAGAACTCAAGACTTTTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTGCTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACTATACCTAGTACAAACAATGAAACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'BRC1544_200208'           CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGGCCAAAAGTCAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTCGCTATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAGCTTAATAGGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTYTCAGTCCCCTTAGATGACTTCAGGAAGTACACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGGTTAGGTATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'BRNE131_200208'           ---------------------------------------------------------------------------------------------------GAAATATGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTTTTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAGAAGAAAAAATCAGTAACAGTACTGGATGTAGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTTAGAAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'BRNE134_200208'           ------------------------------------------------------------------------------------------------------CTATGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGATGGCACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTGAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTACGAATACCACATCCAGCACGGTTAAAAAAGAAAAAATCAGTAACAGTCTTGGATGTGGGTGATGCATACTTTTCAGTTCCCTTGGATGATTTTAGAAAGTATACTGCATTTACCATACCCAGTGTAAACAATGAGGCACCAGGGATTAGATATCAGTACAATGTACTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'BRC1542_200208'           CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAACCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAGAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACCCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAGTTAGTGGATTTCAGAGAACTCAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACTATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'BRCN12_200208'            ---------------------------------------------------------------------------------------------------GAGAAATGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAGATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAGAAGAAAAAATCAGTAACAGTATTGGATGTGGGTGATGCATATTTTTCAATTCCCTTAAATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'BRP2025_200104'           ---------------------------------------------------------------------------------------------------GAAATATGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCCGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAARGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGATTTTTGGGAGGTTCAATTAGGAATACCGCACCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTTTAAACAATGAGACACCAGGAATTAGGTATCAGTACAATGTGCTTCCACAAGGAGGATCACCAACAATATT [...]
+	'BRP2070_200104'           ---------------------------------------------------------------------------------------------------GAGATCTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGATAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAGTTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCATTTCCCTTAGATGAATTCAGGAAGTATACTGCATTCACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTCCCACAGGGAGGATCACCAGCAATATT [...]
+	'BRP2071_200104'           ---------------------------------------------------------------------------------------------------GAAATTTGCNNAGAACTGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAGTACTCCAGTATTTGCTATAAAGAAAAAAGACAGTACTAAGTGGAGGAAATTAGTAGATTTTAGAGAACTTAATAAAAGAACTCAAGACTTTTGGGAAGTGCAATTAGGAATACCACATCCCGCAGGGTTAGAAAAGAAAAAATCAGTGACAGTACTGGATGTGGGAGATGCATATTTTTCGGTACCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATAAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'BRP2062_200104'           ---------------------------------------------------------------------------------------------------GAGATATGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAGAATCCATACAATACTCCAGTGTTTGCCATAAAGAAGAAAGATAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGATTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTCACCATACCCAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTCCCACAGGGAGGATCACCAGCAATATT [...]
+	'BRP2059_200104'           ---------------------------------------------------------------------------------------------------GAAATTTGTACAGAAATGGAAAAGGAAGGAAAGATTTCAAAAGTTGGACCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAACAGAAAAAATCAGTAACAGTACTAGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGAAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCGGGGATTAGATATCAGTACAATGTGCTCCCACAAGGAGGATCACCAGCAATATT [...]
+	'BRP2060_200104'           ---------------------------------------------------------------------------------------------------GAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCAATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCGGGGGTTAGATATCAGTACAATGTACTCCCACAGGGAGGATCACCAGCAATATT [...]
+	'BRP2072_200104'           ---------------------------------------------------------------------------------------------------GAAATATGTACAGAAATGGAAAAAGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATATAACACTCCAATATTTGCCATAAAAAAGAAAGACAGTACTAAGTGGAGAAAATTAGTAGATTTCAGGGAACTCAATAAAAGAACTCAAGACTTTTGGGAAGTTCAATTAGGGATACCACACCCAGCAGGGTTAAAAAAGAAAAAATCAGTGACAGTACTGGATGTGGGGGATGCATATTTTTCAGTACCTTTAGATAGCTTTAGGAAATATACTGCATTCACCATACCTAGTACAAACAATGAAACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'BRP2080_200104'           ---------------------------------------------------------------------------------------------------GAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATAACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCGGGGGTTAGATATCAGTACAATGTACTCCCACAGGGAGGATCACCAGCAATATT [...]
+	'BRP2084_200104'           ---------------------------------------------------------------------------------------------------GAAATTTGTAATGAAATGGAGAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAAYCCATATAACACTCCAGTATTTGCCATAAAAAAGAAGGACAGTACTAAGTGGAGAAAATTAGTAGATTTCAGGGAACTCAATAAAAGAACTCAAGACTTTTGGGAAGTTCAATTAGGAATACCACACCCAGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGGGATGCATATTTTTCAGTACCTTTAGATAGCTTTAGGAAGTATACTGCATTCACCATACCTAGTACAAACAATGAAACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'BRP2079_200104'           ---------------------------------------------------------------------------------------------------GAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCTATAAAGAAAAAAGACAGTACTAAATGGAGGAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGATTTCTGGGAAGTTCAATTAGGAATACCACATCCCTCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTTAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTGCCACAGGGAGGATCACCAGCAATATT [...]
+	'BRP2073_200104'           ---------------------------------------------------------------------------------------------------GAGATATGTACAGAAATGGAAAAGGAAGGAAAATTTACAAAAATTGGGCCTGAAAATCCATATAACACTCCAGTATTTGCTATAAAAAAGAAGGACAGTACTAAGTGGAGAAAATTAGTATATTTCAGGGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAGTTAGGAATACCACACCCAGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACTATACCAAGTACAAACAATGAGACACCAGGGATTAGATATCAGTATAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'BRP2056_200104'           ---------------------------------------------------------------------------------------------------GAAATTTGTACAGAAATGGAAAAGGAGGGAAAAATTGAAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGATAGTACTAAATGGAGAAAATTAGTAGACTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAATTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACTATACCTAGTATAAACAATGAGACACCAGGGGTTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'BRP2040_200104'           ---------------------------------------------------------------------------------------------------GAAATCTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAACAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACAYCCCTCAGGGTTAAAAAAGAAAAATTCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGGTATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'BRP2042_200104'           ---------------------------------------------------------------------------------------------------GAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGARAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTCAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTGGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATAACTTTAGGAAGTATACTGCATTTACCATACCTAGCACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCTGCAATATT [...]
+	'BRP2035_200104'           ---------------------------------------------------------------------------------------------------GAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAGGAAAAAAGACAGCACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTGACAGTAYTGGATGTGGGAGATGCATATTTTTCAGTACCTTTAGATAGCTTTAGGAAGTATACTGCATTYACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAAGGAGGATCACCAGCAATATT [...]
+	'BRP2028_200104'           ---------------------------------------------------------------------------------------------------GAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGGACTCAAGAYTTCTGGGAAGTTCAGTTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGAATTAGATATCAGTACAATGTACTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'BRP2032_200104'           ---------------------------------------------------------------------------------------------------GAAATCTGTGCAGAACTGGAAAAGGAAGGAAAAATTTCAAGAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAAACAGTACTAAATGGAGAAAACTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTCCAATTAGGAATACCACATCCCGCAGGATTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGGTTTCAGGAAATATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGGTATCAGTACAATGTGCTTCCACAAGGAGGATCACCAGCAATATT [...]
+	'BRP2046_200104'           ---------------------------------------------------------------------------------------------------GAAATATGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCCGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGATTTTTGGGAGGTTCAATTAGGAATACCGCACCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTTTAAACAATGAGACACCAGGAATTAGGTATCAGTACAATGTGCTTCCACAAGGAGGATCACCAACAATATT [...]
+	'BRP2054_200104'           ---------------------------------------------------------------------------------------------------GAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAACACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATAGTTTCAGAAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCGGGGGTTAGATATCAGTACAATGTACTCCCACAGGGAGGATCACCGGCAATATT [...]
+	'BRP2055_200104'           ---------------------------------------------------------------------------------------------------GAAATTTGCACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAGTTAGTAGATTTCAGGGAACTTAATAAGAGAACTCAAGACTTCTGGGAGGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAGTCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCTTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCGCAGGGAGGGTCACCAGCAATATT [...]
+	'BRP2050_200104'           ---------------------------------------------------------------------------------------------------GAGATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCTATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTGAATAAGAGAACTCAGGACTTCTGGGAAGTGCAATTAGGAATACCACATCCCGCRGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCATTAGATGACTTCAGGAAGTATACTGCATTTACCATACCCAGTACAAACAATGAGACACCAGGGATGAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'BRP2047_200104'           ---------------------------------------------------------------------------------------------------GAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAAYCCATACAATACTCCAGTATTTGCYATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTWCAACTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAGATCAGTAACAGTACTRGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'BRCN26_200208'            ---------------------------------------------------------------------------------------------------GAAATATGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAGTGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGATTTCTGGGAAGTTCAATTAGGAATACCACATCCAGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTGCCACAGGGAGGATCGCCAGCAATCTT [...]
+	'CA4727_199907'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAACACTCCAGTATTTGCCATAARGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAGCTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCCCATCCTGCAGGGTTAAAAAAGAAAAAATCAGTGACAGTACTGGATGTGGGTGATGCCTATTTTTCAGTCCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CA478_199101'             ------------------------------------------------------------------------TTGACAGAAGAAAAAAAAGCATTAATAGAAATTTGTACAGAAATGGAGAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTAYAATGTGCTTCCACAGGGAGGATCACCATCAATATT [...]
+	'CA4459_199906'            CCTATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAATAGAGATTTGTACAGAAATGGARAAGGAAGGRAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTCCAATTAGGAATACCACATCCTGCAGGGTTRAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAATTCCTTTAGATGACTTCAGGAAGTATACTGCATTCACTATACCTAGTAGAAACAATGAGACACCAGGGMTCAGATACCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CA4314_199905'            CCCATTAGTCCTATTGAGACTGTACCAGTGAAAAAGCCAGGAATGGATGGCCCCAAAGTTAAACAATGGCCATTGACAGAAGAGAAAAAAGCATTAGTAGAGATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTCACCATACCTAGCATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CA4340_199904'            CCCATTAGTYCTATTRAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCRTTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAGAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAGCTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACACCCTGCAGGGTTAAAAAAGAGAAAATCAGTAACAGTACTRGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGGTTAGATACCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CA4820_199907'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAACCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAGAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGATTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAGATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTRGTATAAACAATGAAACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CA5261_199910'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAGAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAATATTTGCCATAAAGAAAAARGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTGCAATTAGGAATACCACATCCCGCAGGATTAAAAAAGAAAAAATCAGTAACAGTACTAGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CA5272_199911'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCYATAARGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGAYTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCMTTAGATGACTTCAGGAAATATACTGCATTTACTATACCTAGTATAAACAATGAGACACCAGGGGTTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CA5184_199910'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGARATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAARTTCAATTAGGAATACCACATCCMGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTACACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CA4882_199908'            CCCATTAGTCCTATTGACACTGTACCAGTAARAAAGCCAGGAATGGATGGCCCAAARGTTAAACAATGGCCATTGACAGAAGAAAAAAAGGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAARATTTCAAAGATTGGGCCTGAGAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGATGGTACTAAATGGAGAAAACTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAATTCAATTAGGAATACCACATCCAGCAGGGTTGAAAAAGAAAAAATCAGTAACAGTATTAGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTAYACTGCATTTACTATACCTAGTATAAACAATGAGACTCCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CA5176_199910'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAARTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGRAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTCCAATTAGGAATACCACATCCCGCAGGGTTAAGACAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTGTAAACAATGAGACGCCAGGACTGAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CA4298_199905'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAACCAGGAATGGATGGCCCAAAAGTTAAGCAATGGCCATTAACAGAAGAAAAGAGAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAGTGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCTCTAGATGACTTCAGGAAGTATACTGCATTCACTATACCTNGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTCCCACAGGGAGGATCACCAGCAATATT [...]
+	'CA3948_199812'            CCCATTAGTCCTATTGAAACTGTACCAGTAARAAAGCCAGGAATGGATGGGCCAAGAGTTAAACAATGGCCATTGACAGAAGAAAAAAAMGCATTAATAGAAATTTGTACAGAAATGGAAAAGGAAGGCAAAATTTCAAAGATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCTCAGGGTTAAAAMAGAAAAARTCAGTGACAGTMCTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGAAAGTATACTGCATTTACTATACCTAGTACAAACAATGAGACACCAGGAATTAGATACCAGTACAATGTGCTTCCACAGGGAGGGTCACCAGCAATATT [...]
+	'CA4002_199901'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTAACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAGAATAGGGCCTGAAAATCCATACAATACTCCAGTATTTGCTATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAGAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCATTAGATGACTTCAGGAAGTACACTGCATTTACCATACCTAGTATAAATAATGAAACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CA3895_199902'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAGAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGTTTAAAGAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGAAAGTATACTGCATTTACCATACCCAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCGCAGGGAGGATCACCAGCAATATT [...]
+	'CA2307_199901'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGARATGGAAAAGGAAGGAAAAATTTCAARAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAARGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGGGAACTTAATAAGAAAACTCAAGACTTTTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGATTAAAAAAGAAAAAATCAGTAACAGTGCTAGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACARGGAGGATCACCAGCAATATT [...]
+	'CA3888_199902'            ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------AATAAGAGAACTCAAGAATTCTGGGAAGTTCAATTAGGAATACCACATCCTGCGGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGATTTCAGAAAGTATACAGCATTTACCATACCTAGTGTAAACAATGAGACACCAGGGGTTAGATATCAATACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CA4007_199901'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAGAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTTAGAGAACTTAATAAGAGGACTCAAGACTTTTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCMTTACATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGGTTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CA4059_199903'            CCCATCAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAACAGAAATTTGTACAGAGATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCTATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGGGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTGACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGAAAGTATACTGCATTTACTATACCTAGTATAAACAATGAAACACCAGGGATTAGGTATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CA4284_199904'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAATAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCRGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTACATGACTTCAGGAAGTAYACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATYAGGTATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CA4046_199903'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAGTGGCCATTGACAGAAGAGAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAARGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAARTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTATTGGATGTGGGTGATGCATATTTTTCAATTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACTATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGRTCACCAGCAATATT [...]
+	'CA4024_199903'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTAACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAARGGAAGGAAAAATTTCAAAAATTGGGCCCGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTAGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGAYGACTTTAGAAAGTATACTGCATTTACCATACCTAGTATAAACAATGCGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CA5297_199911'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAATAGAAATTTGTACAGAAATGGAAAAGGAAGGRAAAATCTCAAGGATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGATGGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCAGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATACTTTTCAGTTCCCTTAGATGARTTCAGAAAGTATACTGCATTTACCATACCTAGTAGAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CA7998_200011'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAGAGTTAAACAATGGCCATTGACAGAAGAAAAAAAGGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAATATTTGCTATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGACTTTAGAGAACTTAATAAGAGAACTCAAGATTTTTGGGAAGTTCAGTTAGGAATACCACATCCCGCAGGGTTRAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTTAGGAAGTACACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGGTTAGATATCAGTACAATGTGCTTCCGCAGGGAGGGTCGCCAGCCATATT [...]
+	'CA800_199709'             CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGAACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CA7971_200011'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGSCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAKTAGAAATTTGTACAGAAATGGAAAAGGAAGGRAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAARGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAGAAGAGAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGAYGAGTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGGTATCAGTAYAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CA6884_200007'            CCAATAAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAGTGGCCATTAACAGAAGAAAAAAAAGCATTGACAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAACACTCCAATATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAGTTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGAAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CA7851_200009'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTARTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTTTGGGAAGTYCAATTAGGAATACCACATCCCGCAGGGYTAAAAAGGAARAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATGABTTCAGGAAGTACACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTATAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'BRCN14_200208'            ------------------------------------------------------------------------------------------------------ATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACCAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATCCCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTAGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTCCCACAGGGAGGATCACCAGCAATATT [...]
+	'BRCN19_200208'            ---------------------------------------------------------------------------------------------------GAAATTTGCACAGAAATGGAAAAAGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCTCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAGTTCAGGAAGTATACTGCATTTACTATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAATACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'BRCN24_200208'            ---------------------------------------------------------------------------------------------------GAAATATGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAACCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTAGATGTGGGTGATGCATACTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAATACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'BRCN18_200208'            ---------------------------------------------------------------------------------------------------GAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAGTTAGTAGACTTCAGAGAACTTAACAAGAGAACTCAAGACTTCTGGGAAGTTCAGTTAGGAATCCCACATCCAGCAGGGTTAAAAAAGAAAAAGTCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATAAATTCAGAAAGTATACTGCATTTACCATACCTAGTGTAAACAATGAGACACCAGGGATTAGATATCAATACAATGTGCTACCACAGGGAGGATCGCCATCAATATT [...]
+	'BRCN17_200208'            ---------------------------------------------------------------------------------------------------GAAATTTGCACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAACACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTTAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTAGATGTGGGTGATGCATACTTTTCAGTTCCCTTAGATGACTTTAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAATACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CA6840_200006'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGRATGGATGGCCCAARMGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAATAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAARATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCKCAGGGTTAAAAAAGAAAAAGTCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGAAAGTATACTGCATTTACKATACCTAGKACAAACAATGAGACACCAGGAATTAGATAYCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCRATATT [...]
+	'CA5705_200001'            CCCATTAGTCCTATTGAAACTGTACCAGTGAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAGATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTGTTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGARCTTAATAAGAAAACTCAAGACTTYTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTRAAAAAGAAAAAATCAGTAACAGTACTRGATGTGGGTGATGCATATTTTTCAGTTCCCYTAGATGACTTCAGAAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATACCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CA5740_200001'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAACCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAGATGGAAAAGGAAGGGAAGATTTCAAAAATTGGGCCTGAAAATCCATACAATACCCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTTAGAGAACTTAATAAGAGAACTCAAGATTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTAGGTGATGCATATTTTTCAGTTCCTTTAGATGAATTCAGAAAGTATACTGCATTTACCATACCTAGTCTAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CA5627_200001'            CCCATTAGTCCTATTGATACTGTACCAGTGAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTARTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAGAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCTTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCCAGTAGAAACAATGAGACACCAGGGGTTAGATATCAGTACAATGTGCTTCCACAAGGAGGATCACCAGCAATATT [...]
+	'CA5318_199910'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAGAAGCCAGGAATGGATGGGCCAAAGGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTTTGGGAAGTTCAATTAGGAATMCCACATCCTGCAGGGTTAAARAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGAAAGTATACTGCATTCACCATACCTAGTATAAAYAATGAGACACCAGGRATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CA5337_199910'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAACCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAAYAAGAGAACTCAAGACTTCTGGGAAGTCCAATTAGGAATACCACATCCATCAGGGTTGAAAAAGAAAAAATCAGTAACGGTACTGGATGTAGGTGATGCATACTTTTCAGTTCCTTTAGACGACTTTAGAAAGTATACTGCATTTACCATACCTAGTGTAAACAATGAGACACCAGGAATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CA6006_200002'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAGAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAGATCTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCTCAGGGTTAAAAAAGAAGAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATACTTTCAGGAAGTATACTGCATTTACCATACCTAGTATWAACAATGARRCACCAGGGATTAGRTWTCAGTACAATGTGCTTCCACAGGGAGGRTCACCTGCAATATT [...]
+	'CA6556_200005'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCAYTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAATATTTGCTATAAAGAAAAAAGACAGTACTAAATGGAGRAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGATTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAATTCCCTTAGATGACTTCAGGAAGTACACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCGCAGGGAGGATCACCAGCAATATT [...]
+	'CA6828_200006'            CCYATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCARTATTTGCCATAAAGAAAAAGGAYAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTCCAATTAGGAATACCACATCCCTCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTAGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CA6435_200003'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCAYTGACAGAAGAAAAAAAAGCATTANTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAACACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAGCTTAATAARAGAACTCAAGACTTCTGGGAAGTTCAGTTAGGAATACCCCATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCCTATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTAYACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CA6390_200003'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAACCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAGATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAATATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGACTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGGATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCRTTTACCATACCTAGTATAAACAATGAGACACCAGGAATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'BRP2086_200104'           ------------------------------------------------------------------------------------------------------ATTTGTGATGAAATGGAGAGGGAAGGAAAAATTACAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAAAAGAAGGACAGTACTAAGTGGAGAAAATTAGTAGATTTTAGGGAACTCAATAAAAGAACTCAAGACTTTTGGGAAGTTCAATTAGGGATACCACACCCAGCAGGGTTAAAAAAGAAAAAATCAGTTACAGTATTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTACTTCCACAAGGAGGATCACCAGCAATATT [...]
+	'BRRJ900_200208'           ---------------------------------------------------------------------------------------------------GAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGACTTCAGAGAACTTAATAAAAGAACCCAAGACTTTTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCTTTAGATGACTTCAGGAAGTATACAGCATTTACTATACCTAGTATAAACAATGAGACACCAGGAATTAGATATCAGTATAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'BRRJ901_200208'           ------------------------------------------------------------------------------------------------------ATATGTACAGAAATGGAAAAAGAGGGTAAAATTGCACAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAGATCAGTAACAGTACTGGATGTGGGAGATGCATATTTTTCAATYCCATTAGATGAATTCAGAAAGTATACTGCATTTACCATACCTAGTACAAACAATGGGACACCAGGGATTAGATATCAGTATAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'BRRJ898_200208'           ---------------------------------------------------------------------------------------------------GAGATATGTACAGAAAATGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAATATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTGGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGGATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTAGATGTGGGTGATGCATACTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGGTATCAGTACAATGTGCTGCCACAGGGAGGATCACCAGCAATATT [...]
+	'BRRJ895_200208'           ---------------------------------------------------------------------------------------------------GATATATGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAGAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGATAGTACTAAATGGAGAAAATTAGTAGATTTTAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTCCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTACCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGGTTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'BRRJ896_200208'           ------------------------------------------------------------------------------------------------CTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAGAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTGAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATAACTTCAGAAAGTATACTGCATTTACCATACCTAGTACAAATAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'BRRJ908_200208'           ------------------------------------------------------------------------------------------------CTAGAAATCTGTACAGAAATGGAAAAGGAAGGAAAGATTTCAAAAATTGGGCCTGAGAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAACAAGAGAACTCAAGACTTCTGGGAAGTTCAACTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAATTCCCTTAGATGACTTCAGAAAGTATACTGCATTTACCATACCCAGTACAAACAATGCGACACCAGGAATTAGATATCAGTACAATGTGCTCCCACAGGGAGGATCACCAGCAATATT [...]
+	'BRRJ912_200208'           ------------------------------------------------------------------------------AAGAAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAGAATCGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGACTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACTATACCTAGTATAAACAATGAGACACCAGGAGTTAGATATCAGTACAATGTGCTCCCACAGGGAGGATCACCATCAATATT [...]
+	'BRRJ913_200208'           ------------------------------------------------------------------------------AAGAAAANAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAGAATTGGGCCTGAAAACCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGACTTCAGAGAACTTAATAAAAGAACTCAAGACTTTTGGGAAGTTCAATTAGGAATACCACACCCAGCAGGATTAAAAAAGAAAAAATCAGTAACAGTATTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAGTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGGGGATCACCAGCAATATT [...]
+	'BRRJ911_200208'           ---------------------------------------------------------------------------------------------------GAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTGGATTTCAGAGAACTTAATAAGAGAACTCAAGATTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTAYAAATAATGAGACACCAGGGATTAGATATCAGTACAATGTACTCCCACAGGGAGGATCACCAGCAATATT [...]
+	'BRRJ909_200208'           ---------------------------------------------------------------------------------------------------GAGATATGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAGAATTGGGCCTGAAAATCCATACAATACTCCAGTGTTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTCCAATTAGGAATACCACATCCCGCAGGGTTAAAGAAGAAAAAATCAGTGACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATAGCTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGGTTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'BRRJ910_200208'           ------------------------------------------------------------------------------GAAAAMAATAAGCATTASTBAGAAATTTGTACAGAAATGGAAAGGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAGCTTAATAAGAGAACTCAAGACTTCTGGGAAGTCCAATTAGGAATACCACATCCCGCAGGATTAAAGAAGAACAAATCAGCGACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTATATGATTTCAGGAAGTATACTGCATTCACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAATACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'BRRJ894_200104'           ---------------------------------------------------------------------------------------------------GAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAGCTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAGAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGAAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATACCAGTACAATGTGCTTCCACAGGGGGGATCACCAGCAATATT [...]
+	'BRRJ838_200104'           ---------------------------------------------------------------------------------------------------GAAATTTGTACAGAGATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAATATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'BRRJ854_200104'           ---------------------------------------------------------------------------------------------------GAGATTTGTACAGAAATGGAAAAAGAAGGAAAAATTTCAAGAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTCCAGTTAGGRATACCACATCCCGCAGGATTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATAGCTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGCGGATCACCAGCAATATT [...]
+	'BRRJ832_200104'           ---------------------------------------------------------------------------------------------------GAGATATGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAATATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTCCAATTAGGAATACCACATCCCGCAGGATTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCTTTAGACGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGGTTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'BRRJ821_200104'           ---------------------------------------------------------------------------------------------------GARATWTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCAATAAAGAAAAAAGATAGTACTAAATGGAGAAAATTAGTAGATTTTAGAGAACTCAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCAGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTAGATGTGGGTGATGCATATTTTTCAGTCCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGCACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'BRRJ829_200104'           ---------------------------------------------------------------------------------------------------GAGATTTGTACAGAAAGGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCCTAGATGASTTCAGGAAGTATACTGCATTYACCATACCTAGTACAAACAATGAGACACCGGGGATTAGATATCAGTACAATGTGCTCCCACAGGGAGGATCACCAGCAATATT [...]
+	'BRRJ866_200104'           ---------------------------------------------------------------------------------------------------AAGATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTCCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAACAAGTCAGTAACAGTATTGGATGTGGGAGATGCATATTTTTCAGTTCCCTTAGATGAGTTCAGGAAGTACACTGCATTCACTATACCTAGTACCAACAATGAGACACCAGGAATTAGGTACCAGTACAATGTGCTTCCACAAGGAGGATCACCAGCAATATT [...]
+	'BRRJ884_200104'           ---------------------------------------------------------------------------------------------------GAGATATGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCTATAAAGAAAAAAGACAGTACTAAATGGAGAAAACTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAGTTAGGAATACCACACCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTATTGGATGTGGGTGATGCATACTTTTCAGTTCCCTTAGATGACTTTAGAAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTGCCACAGGGAGGATCACCAGCAATATT [...]
+	'BRRJ892_200104'           ---------------------------------------------------------------------------------------------------GAGATATGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCTATAAAGAAAAAAGACAGTACTAAATGGAGAAAACTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAGTTAGGAATACCACACCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTATTGGATGTGGGTGATGCATACTTTTCAGTTCCCTTAGATGACTTTAGAAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTGCCACAGGGAGGATCACCAGCAATATT [...]
+	'BRRJ877_200104'           ---------------------------------------------------------------------------------------------------GAGATATGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCTATAAAGAAAAAAGACAGTACTAAATGGAGAAAACTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAGTTAGGAATACCACACCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTATTGGATGTGGGTGATGCATACTTTTCAGTTCCCTTAGATGACTTTAGAAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTGCCACAGGGAGGATCACCAGCAATATT [...]
+	'BRRJ872_200104'           ---------------------------------------------------------------------------------------------------GAGATATGTACAGAAATGGAAAAGGAAGGAAAAATTTCTAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATCAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGGACACAAGACTTCTGGGAAGTCCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'BRRJ915_200208'           ---------------------------------------------------------------------------------------------------AAGATATGCACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCCGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAGTGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAATTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAAACACCAGGGATTAGATATCAGTACAATGTGCTCCCACAGGGAGGATCACCAGCAATATT [...]
+	'BRSP381_200208'           ---------------------------------------------------------------------------------------------------GAAATATGTACAGAAATGGAAAAAGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGGAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTCCAATTAGGAATACCACATCCAGCAGGGTTAAAACAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCCAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'BRSP382_200208'           ---------------------------------------------------------------------------------------------------GAGATCTGTACCGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGACCTGAAAACCCATATAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTGGATTTCAGAGAGCTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAGAAGAAAAAATCAGTAACAGTACTAGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAATATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGAATTAGATACCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'BRSP368_200208'           ---------------------------------------------------------------------------------------------------GAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAGTTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATACTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTCCCACAGGGAGGATCACCAGCAGTATT [...]
+	'BRRJ932_200208'           ---------------------------------------------------------------------------------AAAAAAAAGTCATTAGTAGAAATTTGTACAGAAATGGAGAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAGGAAAAAAGACAGTACTAAATGGAGAAAGTTAGTAGACTTTAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTCCAATTAGGAATACCACATCCAGCAGGATTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTATATGACTTCAGAAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'BRSP367_200208'           ---------------------------------------------------------------------------------------------------GAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAGTTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTGCTGGATGTGGGTGATGCCTACTTTTCAGTTCCCTTAGATGACTTTAGGAAGTATACAGCATTTACCATACCTAGTATAAACAATGAAACACCAGGGATTAGATATCAGTACAACGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'BRSP385_200208'           ---------------------------------------------------------------------------------------------------GAGATTTGTACAGAAATGGAAAAAGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTGGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTCCAATTAGGAATACCACATCCCGCTGGGTTAAAAAAGAAAAAATCAGTAACAGTACTAGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTACACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAAGGAGGATCACCAGCAATATT [...]
+	'BRSP454_200208'           ---------------------------------------------------------------------------------------------------GAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAACCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGCACCAAATGGAGAAAATTAGTAGATTTCAGAGAACTGAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACACCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTAGATGTGGGGGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGAAAGTATACTGCATTCACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCTATATT [...]
+	'BRSP457_200208'           ------------------------------------------------------------------------------------------------------ATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCACGAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAGTGGAGAAAATTAGTGGATTTCAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGCTAAAACAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCATTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTATAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'BRSP451_200208'           ---------------------------------------------------------------------------------------------------GAGATATGTACAGATATGGAAAAAGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGGAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGATTTTTGGGAGGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAACAGAAAAGGTCAGTAACAGTACTGGATGTGGGGGATGCATATTTTTCAGTTCCCCTAGATGATTTCAGGAAGTACACTGCATTCACCATACCTAGTGTCAACAATGAGACCCCAGAGTTAAGATATCAGTACAATGTGCTGCCACAGGGAGGATCACCAGCAATATT [...]
+	'BRSP388_200208'           ---------------------------------------------------------------------------------------------------GAGATTTGTACAGAAATGGAAAAGGAAGGGAAAATTACAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATAACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'BRRJ931_200208'           ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------TTTGCCATAAGGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTGAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTGGGAATACCACATCCAGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCCCCAGCAATATT [...]
+	'BRRJ922_200208'           ---------------------------------------------------------------------------------------------------GAGATATGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAACCCCTACAATACTCCAGTATTTGCCCTAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGGACTCAAGACTTCTGGGAAGTCCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGAAATGCATATTTTTCAGTTCCCTTAAATGACTTCAGGAAGTATACTGCATTCACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'BRRJ923_200208'           ---------------------------------------------------------------------------------------------------GAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCCGAAAATCCATACAATACTCCAGTGTTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTGGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAACAATCAGTAACAGTACTAGATGTGGGTGATGCATATTTTTCGGTTCCCTTAGATGACTTTAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCGGGAATTAGATACCAGTACAATGTGCTTCCACAAGGAGGATCACCAGCAATATT [...]
+	'BRRJ921_200208'           ---------------------------------------------------------------------------------------------------GAGATATGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAMTCCCTACAATACTCCAGTATTTGCCATAAAGAAAAAAGCCAGTACTAAATGGAGAAAACTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAGGACTTCTGGGAGGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAGTCAGTGACAGTACTGGATGTGGGGGATGCATATTTTTCAGTTCCCTTAGATGAGTTCAGAAAGTACACTGCATTCACCATACCTAGTATCAACAATGAGACACCAGGAATTAGGTACCAGTATAATGTGCTTCCACAAGGAGGATCACCAGCAATATT [...]
+	'BRRJ917_200208'           ---------------------------------------------------------------------------------------------------GAAATTTGTACAGAAATGGAAAAGGAGGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGCACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGAATTAGATATCAGTACAATGTGCTTCCTCAGGGAGGCTCACCAGCAATATT [...]
+	'BRRJ919_200208'           ---------------------------------------------------------------------------------------------------GAAATTTGTTCAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGGAAATTAGTAGATTTTAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTCCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTATTGGATGTGGGTGATGCGTATTTTTCAGTACCCTTAGATGACTTCAGGAAGTATACTGCATTTACTATACCTAGTATAAACAATGAGACACCAGGGGTTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCATCAATATT [...]
+	'BRRJ924_200208'           ---------------------------------------------------------------------------------------------------GAGATATGTACAGAAATGGAAAAGGAAGGAAAAATTCCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTCCCATAAAGAAAAAAGCCAGTATTAAATGGAGAAAATTAGTAGCCTTTAGAGAACTTAATAAAAGAACTCAAGATTTCTGGGAAGTTCAGTTAGGAATCCCACATCCCGCTGGGTTAAAAAAGAAAAAATCAGTAACAGTTCTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACTATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCATCAATATT [...]
+	'BRRJ928_200208'           ---------------------------------------------------------------------------------------------------GAAATTTGTACAGAAATGGAGAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGCACTAAATGGAGAAAATTAGTAGACTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTCCAATTAGGAATACCACATCCYGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATAACTTCAGGAAGTACACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGAATTAGATACCAGTACAATGTGCTTCCGCAGGGAGGATCACCAGCAATATT [...]
+	'BRRJ929_200208'           ------------------------------------------------------------------------------------AAAAAAGCATTATTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCCGAAAATCCATACAATACTCCAGTGTTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAGAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGACGAATTCAGGAAGTATACTGCATTTACAATACCTAGTATAAACAATGAGAAGCCAGGAATTAGATATCAGTACAATGTACTTCCACAAGGAGGATCACCAGCAATATT [...]
+	'BRRJ927_200208'           ---------------------------------------------------------------------------------------------------GAAATTTGTACAGAAATGGAAAGGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTTAGAGAACTTAATAAGAGGACTCAAGACTTCTGGGAAGTTCAATTAGGGATACCACATCCCGCAGGGTTGAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTTAGGAAATATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGGTCACCAGCAATATT [...]
+	'BRRJ925_200208'           ---------------------------------------------------------------------------------------------------GAAATTTGTACAGAAATGGAAAAGGAGGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGACTTTAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAATAACAGTTCTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACTATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCATCAATATT [...]
+	'BRRJ819_200104'           ---------------------------------------------------------------------------------------------------GARATMTGTACAGAGATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAGAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGATTTTAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'BRP2123_200208'           ---------------------------------------------------------------------------------------------------GAAATTTGTGCAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAGCTATTAGATTTCAGAGAACTTAATAARAGAACTCAAGATTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTAGATGTAGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'BRP2124_200208'           ---------------------------------------------------------------------------------------------------GAAATTTGTGCAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAGCTATTAGATTTCAGAGAACTTAATAAGAGAACTCAAGATTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTAGATGTAGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'BRP2122_200208'           ---------------------------------------------------------------------------------------------------GAAATTTGTACAGAAATGGAAAAGGAAGAAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAGTTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGAATTAGGTATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'BRP2117_200208'           ---------------------------------------------------------------------------------------------------GAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACACCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCGGGGGTTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCCCCAGCAATATT [...]
+	'BRP2118_200208'           ---------------------------------------------------------------------------------------------------GAAATTTGTACAGAAATGGAAAAGGAAGGAAARATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCTATAAAGAAAAAAGACAGTACCAAATGGAGAAAGTTAGTAGATTTCAGAGAACTTAATAARAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTAGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'BRP2128_200208'           ---------------------------------------------------------------------------------------------------GAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAGTTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'BRP2132_200208'           ---------------------------------------------------------------------------------------------------GAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAACCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGATAGTACCAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAGTCAGTAACAGTACTGGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGGTTAGATATCAGTACAATGTCCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'BRP2133_200208'           ---------------------------------------------------------------------------------------------------GAAATCTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAACCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACGAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTATTGGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAATAATGAGACACCAGGGACTAGATATCAATACAATGTACTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'BRP2130_200208'           ------------------------------------------------------------------------------------------------------ATATGTGCAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAACACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGGGGAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGACTTTTGGGAAGTTCAATTAGGAATACCACACCCAGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGGGATGCATATTTTTCAGTTCCTTTAGATGGCTTTAGGAAGTAYACTGCATTCACCATACCTAGTATMAACAATGAGACACCAGGGATTAGRTATCAGTAYAATGTGCTKCCACARGGAGGATCACCAGCGATATT [...]
+	'BRP2129_200208'           ---------------------------------------------------------------------------------------------------GAAATTTGTACAGAAATGGAAAAGGAAGGAAAGATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACGGTACTAAATGGAGAAAGTTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCGCAGGGAGGATCACCAGCAATATT [...]
+	'BRP2109_200208'           ---------------------------------------------------------------------------------------------------GAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGGATACCCCATCCCGCAGGGTTAAAGAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATGACTTCAGGAAGTACACTGCATTTACCATACCTAGTACAAACAATGAAACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'BRP2093_200208'           ---------------------------------------------------------------------------------------------------GAAATCTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAGAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAACAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGGGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGAAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'BRP2098_200208'           ---------------------------------------------------------------------------------------------------GAGATATGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGCTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTAGGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTGCCGCAGGGAGGATCACCAGCAATATT [...]
+	'BRP2090_200104'           ---------------------------------------------------------------------------------------------------GAGATTTGTACAGAGATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTAGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGGTTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCGGCAATATT [...]
+	'BRP2087_200104'           ---------------------------------------------------------------------------------------------------GAAATCTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAACCCATATAATACTCCAATATTTGCCATAAAGAAAAAAGACAGTACGAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTATTGGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAATAATGAGACACCAGGGACTAGATATCAATACAATGTACTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'BRP2088_200104'           ---------------------------------------------------------------------------------------------------GAGATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGCTAAAAAAGAAAAAATCAGTAACAGTATTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGAATTAGATATCAGTACAATGTGCTTCCGCAGGGAGGATCACCAGCAATATT [...]
+	'BRP2099_200208'           ---------------------------------------------------------------------------------------------------GAAATTTGTACAGAAATGGAAAAGGAAGGAAAGATTTCAAAAATAGGGCCTGAAAATCCATACAATACTCCAGTATTTGCTATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGCTAAAAAAGAAAAAGTCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACAGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'BRP2106_200208'           ---------------------------------------------------------------------------------------------------GAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTCAATAAGAGGACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCYGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'BRP2107_200208'           ---------------------------------------------------------------------------------------------------GAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTGGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTTTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTCCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCGGGGGTTAGATATCAGTACAATGTGCTCCCACAGGGAGGATCACCAGCCATATT [...]
+	'BRP2103_200208'           ---------------------------------------------------------------------------------------------------GAGATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAACACTCCAGTATTTGCTATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAGAAATCAGTAACAGTACTAGATGTAGGTGATGCATATTTCTCAGTTCCATTAGATGACTTCAGGAAGTATACTGCATTCACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'BRP2101_200208'           ---------------------------------------------------------------------------------------------------GAAATCTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGATAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAGTTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTATTGGATGTGGGTGATGCATATTTTTCAATTCCCTTAGATGAATTCAGAAAGTATACTGCATTCACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTCCCACAGGGGGGATCACCAGCAATATT [...]
+	'BRP2137_200208'           ---------------------------------------------------------------------------------------------------GAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCAGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACTATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'BRP2178_200208'           ------------------------------------------------------------------------------------------------------ATTTGTGCAGAAATGGAGAAGGAAGGAAAAATTACAAAAATTGGACCTGAAAATCCCTACAACACTCCAGTATTTGCCATAAAAAAGAAGGACAGTACTAAGTGGAGAAAATTAGTAGATTTCAGGGAACTCAATAAAAGAACTCAAGACTTTTGGGAAGTTCAATTAGGGATACCACACCCAGCAGGGTTAAAAAAGAAAAAATCAGTGACAGTACTGGATGTGGGGGATGCATATTTTTCAGTTCCTTTAGATAGCTTTAGGAAGTATACTGCATTCACCATACCTAGTATAAATAATGAAACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'BRP2394_200104'           ---------------------------------------------------------------------------------------------------GAGATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCCGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGATTAAAACAGAAAAAATCAGTAACAGTACTAGATGTGGGTGATGCATATTTTTCAGTTCCATTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACGCCAGGAGTTAGATATCAGTACAATGTGCTGCCACAGGGAGGATCACCAGCAATATT [...]
+	'BRP2177_200208'           ---------------------------------------------------------------------------------------------------GAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCCGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGATAGTACCAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAACAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGGTTAGATATCAGTACAATGTGCTTCCACAGGGAGGCTCACCAGCAATATT [...]
+	'BRP2172_200208'           ---------------------------------------------------------------------------------------------------GAAATTTGTACAGAAATGGAAAAGGAGGGAAAGATTACAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAGTTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATCCCACATCCCTCAGGGTTAAAACAGAAAAAATCAGTAACAGTACTGGATGTAGGTGATGCATATTTCTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTCACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTACTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'BRP2175_200208'           ---------------------------------------------------------------------------------------------------GAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGATTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAACAGAAAAAATCAGTAACAGTACTGGATGTGGGCGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'BRP2396_200104'           ---------------------------------------------------------------------------------------------------GAAATTTGTACAGAAATGGAAAAGGAAGGAAAGATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTGTTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGATTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAGAAGAAAAAATCAGTAACAGTACTGGATGTGGGAGATGCATATTTCTCAGTTCCTTTAGATGAATTCAGGAAGTATACTGCATTTACTATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'BRP2400_200104'           ---------------------------------------------------------------------------------------------------GAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGACCTGAAAACCCATACAACACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAGTGGAGAAAATTAGTAGATTTCAGGGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGGATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCGCCAGCAATATT [...]
+	'BRP2401_200104'           ------------------------------------------------------------------------------------------------------------ACAGAAATGGAAAAGGAAGGAAAGATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAAAAGAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTTTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGCTAAAACAGAAAAAATCAGTAACAGTACTAGATGTGGGTGATGCATATTTTTCAGTTCCTTTAGATGAATTTAGGAAGTATACTGCATTCACCATACCTAGTACAAACAATGAGACACCAGGAATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'BRP2399_200104'           ------------------------------------------------------------------------------------------------------ATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAGAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGACTTTTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAATTCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTCCAATGTGCTTCCCCAGGGAGGATCACCAGCAATATT [...]
+	'BRP2397_200104'           ---------------------------------------------------------------------------------------------------GAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACCCAAGACTTTTGGGAAGTGCAATTAGGAATACCACATCCCGCAGGATTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCTTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAAACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'BRP2167_200208'           ------------------------------------------------------------------------------------------------------ATATGTGATGAAATGGAGAAGGAAGGAAAAATTACAAAAATTGGGCCTGAAAATCCATATAACACTCCAGTATTTGCCATAAAAAAGAAGGACAGTACTAAGTGGAGAAAATTAGTAGATTTCAGGGAACTCAATAAGAGAACTCAAGACTTTTGGGAAGTTCAATTAGGGATACCACACCCAGCAGGGTTAAAAAAGAAAAAATCAGTGACAGTACTGGATGTGGGGGATGCATATTTTTCAGTACCTTTAGATAACTTTAGGAAGTATACTGCATTTACCATACCTAGTGTAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'BRP2153_200208'           ---------------------------------------------------------------------------------------------------GAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAARAGAACTCAAGACTTCTGGGAAGTCCAATTAGGAATACCACATCCCGCAGGATTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGGTTAGATATCAGTATAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'BRP2154_200208'           ---------------------------------------------------------------------------------------------------GAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACGGCACTAAATGGAGAAAGTTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCAGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAACGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCGCAGGGAGGATCACCAGCAATATT [...]
+	'BRP2148_200208'           ---------------------------------------------------------------------------------------------------GAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGGAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAGGTTCAATTAGGAATACCACATCCCGCAGGATTAAAAAAGAAAAAATCAGTAACAGTACTAGATGTGGGTGATGCATATTTCTCAGTYCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'BRP2146_200208'           ---------------------------------------------------------------------------------------------------GAAATCTGTGCAGAAATGGAAAAGGAAGGAAAAATTTCAAGAGTTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTGAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGCTAAAAAAGAAAAAGTCAGTAACAGTACTAGATGTGGGTGATGCATATTTTTCAGTGCCCTTAGATGAATTCAGGAAGTACACTGCGTTCACCATACCTAGTACAAACAATGAGACACCAGGGACTAGATATCAGTACAATGTGCTTCCGCAGGGAGGATCACCAGCCATATT [...]
+	'BRP2147_200208'           ---------------------------------------------------------------------------------------------------GAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCTATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAGCTTAATAAAAGGACTCAAGACTTCTGGGAAGTACAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATACTTTTCAGTTCCCTTAGATAACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'BRP2155_200208'           ---------------------------------------------------------------------------------------------------GAAATTTGTGATGAAATGGAGAGGGAAGGAAAAATTACAAAAATTGGGCCTGAAAATCCATATAACACTCCAGTATTTGCCATAAAAAAGAAGGACAGTACTAAGTGGAGAAAATTAGTAGATTTCAGGGAACTTAATAAAAGAACTCAAGACTTTTGGGAAGTTCAATTAGGGATACCACACCCAGCAGGGTTAAAAAAGAAAAAATCAGTTACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGAAAGTATACTGCATTCACCATACCTAGTACAAACAATGAAACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'BRP2161_200208'           ------------------------------------------------------------------------------------------------------ATTTGTGATGAAATGGAAAAAGAAGGAAAAATTACAAAAATTGGGCCTGAAAATCCATATAACACTCCAGTATTTGCAATAAAAAAGAAGGACAGTACTAAGTGGAGAAAATTAGTAGATTTCAGGGAACTCAATAAAAGAACTCAAGACTTTTGGGAAGTTCAATTAGGGATACCACACCCAGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTTAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTATAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'BRP2165_200208'           ---------------------------------------------------------------------------------------------------GAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAAYACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTGGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGCACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'BRP2159_200208'           ---------------------------------------------------------------------------------------------------GAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGATTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAACAGAAAAAATCAGTAACAGTACTGGATGTGGGCGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'BRP2156_200208'           ---------------------------------------------------------------------------------------------------GAGATTTGTGATGAAATGGAGAGGGAAGGGAAAAATTCAAAAATTGGACCTGAAAATCCCTATAACACTCCAGTATTTGCCATAAAAAAGAAGGACAGTACTAAGTGGAGAAAATTAGTAGATTTCAGGGAACTCAATAAAAGAACTCAAGACTTTTGGGAAGTTCAATTAGGGATACCACACCCAGCAGGGTTAAAAAAGAAAAAATCAGTGACAGTACTGGATGTGGGGGATGCATATTTTTCAGTACCTTTAGATAGCTTTAGGAAGTATACTGCATTCACCATACCTAGTATAAATAATGAAACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'ARG07_199701'             ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAGTGGAGAAAACTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTCCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_4170_200501'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGAYGGGCCTAGAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCCGAAAATCCATACAATACGCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAGTGGAGAAAATTAGTGGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTYTGGGAAGTTCAATTAGGGATACCACATCCCTCAGGGTTAAGGAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAAACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAAGGAGGRTCACCAGCGATATT [...]
+	'CCB_4162_200501'          CCCATTAGTCCTATTGAAACAGTGCCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCCTTRACAGAAGAAAAAAGAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTAGGTGATGCATATTTTTCAGTTCCCTTAGATGAGTTCAGGAAGTATACTGCATTTACCATACCTAGTGTAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAAGGAGGATCACCGGCAATATT [...]
+	'CCB_4183_200501'          CCCATTAGTCCTATTGAAACTGTGCCAGTAAAAAAACCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGYACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAACCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGATAGTACTAAATGGAGAAAATTAGTAGATTTTAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGATTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAATACCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTGCCACAGGGRGGATCACCAGCAATATT [...]
+	'CCB_4204_200501'          CCCATTAGTCCTATTGAAACTGTACCTGTACAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGATGGTAATAAATGGAGAAAACTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAGGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATAACTTCAGGAAGTATACTGCATTTACCATACCCAGTACGAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_4198_200501'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGGCCAAAAGTTAAACAATGGCCAYTGACAGAAGAGAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAAYCCATACAATACTCCAGTATTTGCCATAAAGAAAAARGACAGTACTAAATGGAGAAAATTGGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTTTGGGAAGTTCAATTAGGRATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCCAGTACAAAYAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTCCCACAAGGAGGATCACCAGCAATATT [...]
+	'CCB_4159_200501'          CCCATTAGTCCTATCGAAACTGTACCAGTGAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAAGAAGGAAAAATTACAAAAATTGGGCCTGAGAATCCATACAATACTCCAGTRTTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATACTTTTCAGTTCCCTTAGATAACTTCAGGAAGTATACTGCATTTACCATACCTAGTAGAAATAATGAGACACCAGGGGTTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_3994_200501'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGACGGCCCAAGAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAGTTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTYTGGGARGTTCAATTAGGGATACCACATCCCGCAGGGTTAAAGAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATGAYTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAAACGCCAGGAATTAGATACCAATACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_3958_200501'          CCTATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGGCCAAGAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAACAGAAATATGTAGAGAAATGGAAAAAGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAGTTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGATTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAATAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_4137_200501'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCTATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTGGATTTCAGAGAACTCAATAAGAGAACTCAAGACTTCTGGGAAGTGCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCTTTAGATGACTTCAGAAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATACCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_4157_200501'          CCCATTAGTCCTATTGAAACTGTGCCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGARAAAAAAGCATTAGTAGAAATCTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAGAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTGGATTTCAGAGAACTTAATAAAAGAACGCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAATTCAGTGACAGTAYTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGACGACTTTAGGAAGTATACTGCRTTYACCATACCTAGTATAAACAATGAGACACCAGGAGTTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_4156_200501'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAAGAAGGRAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTTTGGGAAGTTCAATTAGGAATACCACACCCTGCAGGGTTAAAAAAGAAAAAATCAGTRACAGTACTAGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTACTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_4206_200501'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAGATTTGTACRGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTRGTAGATTTCAGAGAACTTAATAAGAGAACCCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCTGGGTTGAAAAAGAAAAAATCAGTAACAGTACTAGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGACGAATTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAAACACCAGGGGTTAGATATCAGTACAATGTGCTCCCACAAGGAGGATCACCAGCAATATT [...]
+	'CCB_4307_200501'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGACGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCTTTAGTAGAAATCTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTRTTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTTAGAGAACTTAATAAGAGAACTCAAGATTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAGAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGACGATTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAAACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_4302_200501'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCGAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATCTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGGATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGCGACACCAGGGATTAGATATCAATACAATGTGCTTCCACAGGGAGGATCACCGGCAATATT [...]
+	'CCB_4332_200501'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGTCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTACACTGCATTTACCATACCTAGTATAAATAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAAGGAGGATCACCAGCAATATT [...]
+	'CCB_4344_200501'          CCCATTAGTCCTATTGAAACTGTACCAGTAARAAAGCCAGGAATGGATGGCCCAAAGGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGCACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCTATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTTAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAARAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTYTCAGTTCCCTTAGACGAATTCAGGAARTATACTGCATTTACCATACCTAGTATAAACAATGAAACACCAGGGATTAGATATCAATACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_4333_200501'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCACTGACAGAAGAAAAAAAAGCATTAACAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAGGTTCAATTAGGAATACCACACCCCGCAGGGTTAAAACAGAAAAAATCAGTAACAGTACTGGATGTRGGTGATGCATATTTTTCAGTTCCTYTAGATGACTTCAGGAARTAYACTGCATTTACCATACCTAGTATAAACAATGAAACACCAGGGGTTAGATATCAGTACAATGTGCTACCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_4296_200501'          CCCATTAGTCCTATTGAAACTATACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAACAGAAATTTGTACAGAATTGGAAAAGGAAGGAAAAATTTCAAGAATTGGGCCTGAAAATCCATACAATACTCCRATATTTGCCATAAAGAAAAAAGATAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTCCAATTAGGAATACCACATCCCGCAGGATTAAATAAGAACAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTGGATRACTTCAGGAAGTATACTGCATTCACCATACCTAGTACAAACAATGAGAYGCCAGGGGTTAGATATCAGTACAATGTGCTACCTCAGGGAGGATCACCAGCAATATT [...]
+	'CCB_4262_200501'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAGGTTAAACAGTGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTACAAAAATTGGGCCTGAAAATCCATACAATACCCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTACACTGCATTTACTATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_4246_200501'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAGAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCCAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_4286_200501'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAGATGGAAAAGGAGGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACGGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACCCAAGACTTTTGGGAAGTTCAGTTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAAACACCAGGGATTAGATATCAGTACAATGTGCTACCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_4287_200501'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGGCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTRTTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTGGATTTCAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCYGCAGGGTTAAAAAAGAAAAAATCAGTAACGGTRCTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTTAGGAAGTACACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCATCAATATT [...]
+	'CCB_3954_200501'          CCCATTAGTCCTATTGAAACTGTACCAGTACAAAAGCCAGGAATGGATGGCCCAAAGGTTAAACAATGGCCATTGACAGAAGAGAAAAAAGCATTAGTAGAAATTTGTACAGAATTGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGGGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCCTATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAAACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAAGGAGGATCACCAGCAATATT [...]
+	'CCB_3805_200501'          CCCATTAGTCCTATTGAAACTGTACCTGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAGTGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTGGTAGATTTYAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTCCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTCTCAGTTCCCCTAGATGACTTYAGGAAGTATACTGCATTTACCATACCCAGTACAAACAATGAGACACCAGGAATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_3798_200501'          CCCATAAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAGAAAGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGATTTCTGGGAGGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATAACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGGTTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_3808_200501'          CCCATTAGCCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAGAGTTAAGCAATGGCCATTGACAGAAGAAAAAAAAGCATTAATAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTACAAAGATTGGGCCTGATAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGATAGTACTAARTGGAGAAAATTAGTGGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGCGATGCATATTTTTCAGTTCCCTTAGATGARTTTAGAAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGGTATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_3828_200501'          CCCATTAGTCCTATTGAAACTGTACCAGTACRAAAGCCAGGAATGGATGGTCCAAGAGTTAARCAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCCGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATAACTTCAGGAAGTATACTGCATTCACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_3821_200501'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAGAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTGTTTGCTATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATYAGTAACAGTACTGGATGTGGGTGACGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATCAGATATCAGTATAATGTGCTTCCCCAGGGAGGATCACCAGCAATATT [...]
+	'CCB_3783_200501'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAATTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTGGATTTCAGAGAACTTAATAAGAGGACTCAAGACTTTTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTGACAGTACTAGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_3766_200501'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGAYGGTCCAAAAGTTAAACARTGGCCTTTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCCGAAAACCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGGACTCAAGACTTCTGGGAGGTTCAATTAGGAATACCACATCCCGGAGGGTTAAAGAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCTTATTTTTCAGTTCCCTTAGATGATTTCAGGAAGTATACTGCATTTACTATACCTAGTATAAACAATGAAACACCAGGAGTTAGATATCAGTAYAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_3729_200501'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCACTGACAGAAGAAAAAAAAGCATTAGTAGAAATCTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAGATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTTAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCGGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGGGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGAAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTACTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_3774_200501'          CCTATCAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTCAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAGATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGACTTCAGAGAACTTAATAAGAGAACTCAAGACTTTTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGCATAAACAATGAGACACCAGGGATTAGATACCAATACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_3778_200501'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAGCAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATCTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCTATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCATTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGGTTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_3836_200501'          CCCATTAGTCCTATTGAGACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCCGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAACTAGTGGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTATTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACNCCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_3911_200501'          CCTATTAGTCCTATTGAAACTGTACCAGTAAAAAAACCAGGAATGGATGGTCCAAAAGTGAAACAATGGCCACTGACAGAAGAAAAAAAAGCGTTAACTGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAGTTGGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGCTAAAAAAGAAAAAATCAGTAACAGTACTAGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAAACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_3874_200501'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCMTTGACAGAGGAAAAGAAAGCATTAGTAGAAATTTGTACAGAAATGGARAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGACTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAATTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGACGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGGTTAGATACCAGTATAATGTGCTTCCACAAGGAGGATCACCAGCAATATT [...]
+	'CCB_3913_200501'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAACAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTGGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATACCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_3942_200501'          CCCATTAGTCCTATTGAAACTGTACCAGTRAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAGATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCTATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAGCTTAATAAGAGAACTCAAGACTTCTGGGAAGTCCAATTAGGAATACCACATCCCTCAGGGTTAAAGAAGAAAAAATCAGTAACAGTACTAGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAAACGCCAGGAATTAGATATCAGTACAATGTGCTGCCACAAGGAGGATCACCAGCAATATT [...]
+	'CCB_3938_200501'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAGTGGCCATTGACAGAAGAAAAGAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAACCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAGTGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGCTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTAGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCCAGTACAAACAATGAGACACCAGGGACTAGATATCAGTACAATGTGCTCCCACAGGGAGGGTCACCAGCAATATT [...]
+	'CCB_3869_200501'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCTAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCACTAGTAGAAATTTGTACAGAAATGGAGAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAATATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAACTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTCCAACTAGGAATACCACATCCCGCAGGATTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGAGTTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_3862_200501'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTCGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGCTAAAAAAGAAAAAATCAGTAACAGTATTGGATGTGGGTGATGCCTATTTTTCAGTTCCCTTAGATGAYTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAAACGCCAGGAATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_3853_200501'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAGCAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGATAGTACTAAATGGAGAAAATTAGTAGATTTTAGAGAACTTAATAAGAGAACTCAAGACTTTTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAACAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_3866_200501'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGACGGTCCAAAAGTTAAACAATGGCCTTTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCCGAAAACCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAGGTTCAATTAGGAATACCACATCCCGGAGGGTTAAAGAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCTTATTTTTCAGTTCCCTTAGATGATTTCAGGAAGTATACTGCATTTACTATACCTAGTATAAACAATGAAACACCAGGAGTTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_3867_200501'          CCCATTAGTCCTATTGAAATTGTGCCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAGTGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATCTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAGAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGATTTCTGGGAGGTTCAACTAGGAATACCACACCCCTCAGGGTTGAAGAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCTCTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_4346_200501'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAGGTTAAACAATGGCCATTAACAGAAGAAAAAAAAGCATTAACAGAAATATGTACAGATATGGAAAAAGAAGGAAAAATTTCAAAGATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTGGTGGATTTCAGAGAACTTAATAAGAGAACTCAAGATTTTTGGGAGGTTCAATTAGGAATACCGCATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTAGGTGATGCCTATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTCACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_4806_200501'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTCAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAACAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAACCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGATAGTACTAAATGGAGAAAGTTAGTAGATTTCAGGGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCAGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTAGATGTGGGTGATGCATATTTTTCAGTTCCCTTACATGACTTCAGGAAGTACACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGGTTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_4804_200501'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATCTGTACAGAAATGGAAAAGGAAGGAAAGATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGGACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTAGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATGATTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCGCCAGCAATATT [...]
+	'CCB_4815_200501'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATYTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTAGATGTGGGGGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAAGCACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_4837_200501'          CCCATYAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAARCAATGGCCATTGACAGAAGAAAAAAAAGCATTAATAGAAATTTGTACAGAAATGGAAAAGGAAGGRAAAATTTCAAAAATTGGSCCTGAAAATCCATACAATACTCCAGTATTTGCTATAAAGAAAAAAGACAGTACTAAATGGAGRAAATTAGTAGAYTTCAGAGAACTTAATAAAAGAACTCAAGAATTTTGGGAGGTTCAATTAGGAATACCRCATCCYGCAGGGTTAAAACAGAAAAAATCAGTAACAGTACTAGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAAACACCAGGGATTAGATATCAGTATAATGTGCTTCCACAAGGAGGATCACCAGCAATATT [...]
+	'CCB_4825_200501'          CCAATTAGTCCTATTGAACCTGTGCCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAATAGAAATCTGTACAGAAATGGARAAGGACGGAAAAATTTCAAGAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGTCATAAAGAAAAAAGACAGCACTAAATGGAGAAARTTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAGTCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAATATACTGCATTTACCATACCTAGTCTAAACAATGAGACACCAGGAATTAGATACCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_4799_200501'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGACATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCTATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTTAGAGAATTAAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAGTCAGTAACAGTACTGGATGTAGGTGATGCATATTTTTCAGTGCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTAYAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_4739_200501'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAGAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAAGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATAYAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGGACTCAAGACTTCTGGGAAGTCCAATTAGGGATACCACATCCYGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTAGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGACGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_4732_200501'          CCCATTAGCCCTATTGAAACTGTACCAGTAAAGAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTARAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTCCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAATAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTACATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGARACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_4747_200501'          CCCATTAGTCCTATTGAAACAGTACCAGTAAAAAAGCCAGGACTGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAGAATTGGGCCTGARAATCCATACAATACTCCAGTATTTGCTATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTCCAATTAGGAATACCACATCCCGCAGGATTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTTAGRAAGTATACTGCATTTACCATACCTAGTACRAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_4785_200501'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAARCCAGGAATGGATGGCCCAAGAGTTAAACAATGGCCATTGACAGAAGAGAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTCTTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGACTTYTGGGAAGTTCAATTAGGGATACCCCATCCCGCAGGGTTAAAGAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTCTCAGTYCCCTTAGATGAATTCAGGAAGTACACTGCATTCACCATACCTAGTACAAACAATGAAACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_4761_200501'          CCTATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAGAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAGGGAAGGAAAAATTTCAAAGATTGGGCCTGAAAACCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGATTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAAGCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCTTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGGTTAGATATCAGTACAATGTACTTCCACAGGGAGGATCACCTGCAATATT [...]
+	'CCB_4854_200501'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAACCAGGAATGGATGGGCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAATTGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAGTGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTCCAACTAGGAATACCGCATCCCTCAGGGTTAAAAAAGAAAAAGTCAGTAACAGTCCTAGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATAATTTCAGGAAGTATACTGCATTTACCATACCTAGTAGAAACAATGAGACACCAGGGATTAGGTATCAGTACAACGTACTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_4954_200501'          CCCATTAGTCCTATTGAAACTGTACCAGTAAGGAAACCAGGAATGGACGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGATAGTACTAAATGGAGAAAATTAGTAGACTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAGAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAAACACCAGGAATTAGATACCAGTACAATGTACTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_4950_200501'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAATTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAACAGACATATGTCTAGAAATGGAAAAAGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAATATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTGGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTTTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAGTCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCATTAGATGAATTCAGGAAGTACACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTACTTCCGCAGGGAGGATCACCAGCAATATT [...]
+	'CCB_4974_200501'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCGAAAGTTAAACAATGGCCATTRACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAARGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAGGATTTCTGGGAAGTTCAACTAGGAATACCACATCCCGCAGGGTTAAARAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTACATGACTTCAGGAAGTACACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTCCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_4982_200501'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAGGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTTTGGGAAGTCCAACTAGGGATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCCTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTAYAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_4980_200501'          CCCATTAGTCCTATTRAAACTGTACCAGTAAAAAAACCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTAACAGAGGAAAAAAGAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAARAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTTAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCMTATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAATAATGAGACACCAGGAATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_4948_200501'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGGCCAAAAGTTAAGCAATGGCCATTAACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAGCTAGTGGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCTTTGGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_49_200501'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAACAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGATTTTTGGGAGGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGAGATGCATATTTCTCAGTTCCCTTAGATGATTTCAGGAAGTATACTGCATTTACCATACCTAGTGTTAACAATGAGACACCAGGAGTTAGGTACCAATACAATGTGCTTCCACAAGGAGGATCACCAGCAATATT [...]
+	'CCB_4884_200501'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAGAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAAGAAGGGAAAATTTCAAGAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGATTAAAGAAGAAAAAATCAATAACAGTATTGGATGTGGGTGATGCATACTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCGTACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGGTCACCGGCAATATT [...]
+	'CCB_492_200501'           CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTAACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACCAAATGGAGAAAACTAGTGGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGCTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGATTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_4940_200501'          CCCATTAGTCCTATTGAAACTGTACCAGTGAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAACAGAAATTTGTACAGACATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACYCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAARTTRGTGGATTTCAGAGAGCTCAATAAGAGAACTCAAGACTTCTGGGAAATTCAATTAGGAATACCACATCCYGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCTTTACATAGCTTCAGGAAGTATACTGCATTTACTATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAAGGAGGATCACCAGCAATATT [...]
+	'CCB_4701_200501'          CCCATTAGCCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAGGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAGAATTGGGCCTGAAAATCCATACAATACCCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAGTTAGTGGATTTCAGAGAACTCAATAAGAGAACTCAAGACTTTTGGGAAGTTCAATTAGGAATACCACACCCCGCAGGGTTAAAAAAGAAGAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACTATACCTAGCACAAACAATGAGACACCAGGGATTAGGTATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_445_200501'           CCCATTAGTCCTATTGATACTGTACCAGTAAAAAAGCCAGGAATGGATGGSCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCARTATTTGCCATAARGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCYGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTCCCACAGGGAGGATCACCATCAATATT [...]
+	'CCB_4447_200501'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTARTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTACAAGGATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGAYAGTACTAAATGGAGAAAATTAGTGGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAACAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTTAGGAAGTATACTGCATTTACCATACCTAGTATGAACAATGRGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGGTCACCAGCAATATT [...]
+	'CCB_4452_200501'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGTCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGCACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACCCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTGGATTTCAGAGAACTCAATAAGAGAACTCAAGACTTCTGGGAGGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAAAAAAAATCAGTAACAGTGCTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACTATACCTAGTATAAACAATGAGACACCAGGGACTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_4471_200501'          CCCATTAGTCCTATTGAGACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCGAGAGTYAAACAATGGCCATTGACAGAAGAAAAGAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAGGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCAYATTTTTCAGTTCCTTTAGATAACTTCAGGAAGTACACTGCCTTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_447_200501'           CCCATCAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATATGTACAGAAATGGAAAAGGAAGGTAAAATTTCAAGAATTGGGCCTGAAAATCCATATAATACTCCAATATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGGATACCACATCCCGCAGGGTTAAAAARGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTGTAAACAATGAGAAGCCAGGGACTAGGTATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_4415_200501'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAATAGAAATTTGCACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACCAAATGGAGAAAATTAGTAGACTTCAGAGAACTTAATAAGAGAACTCAGGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTACAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACTATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_4361_200501'          CCTATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAGAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAGGGAAGGAAAAATTTCAAAGATTGGGCCTGAAAACCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGATTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAAGCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCTTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGGTTAGATATCAGTACAATGTACTTCCACAGGGAGGATCACCTGCAATATT [...]
+	'CCB_4355_200501'          CCCATTAGTTCTATTGAAACTGTGCCAGTAAAAAAGCCAGGAATGGATGGCCCAAGGGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGARATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTRTTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTTAGAGAACTTAATAAGAGAACTCAAGACTTTTGGGAAGTTCAACTAGGAATACCACATCCCGCAGGGTTAAAAAAGAGAAAATCAGTAACAGTACTGGATGTGGGGGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_4371_200501'          CCCATAAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAAGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACGGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGATTTCTGGGAGGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATAACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_4372_200501'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTGGTAGAAATCTGTACAGACATGGAGAAAGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTGTTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAGCTTAATAAGAGAACCCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAATATACTGCATTTACCATACCTAGCATAAACAATGAGACACCAGGAATTAGATACCAATACAATGTACTCCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_4480_200501'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAACCAGGAATGGATGGCCCAAAAGTTAAGCAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTGTTTGCCATAAAGAAAAAAGATGGTACTAAATGGAGAAAATTAGTAGACTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAAAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGACGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAATAATGAGACACCTGGAATTAGATATCAGTACAATGTGCTTCCTCAGGGAGGATCACCAGCAATATT [...]
+	'CCB_460_200501'           CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTCAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTGGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTAGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTTAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAAACACCAGGGATTAGATATCAATACAATGTGCTTCCACAGGGAGGATCACCAGCAATTTT [...]
+	'CCB_4579_200501'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGTATGGATGGCCCAAAGGTTAAACAGTGGCCATTGACAGAAGAAAAAAGAGCATTAGTAGAAATTTGTACAGAACTGGAAAAGGACGGAAAGATTTCAAAAATTGGACCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGGTGGTGATAAATGGAGAAAATTAGTAGATTTCAGAGAGCTTAATAAAAGAACTCAAGACTTTTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTAGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAAACACCAGGGATTAGATATCAGTACAATGTACTCCCAATGGGAGGATCACCAGCAATATT [...]
+	'CCB_4609_200501'          CCCATTAGTCCTATTGARACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCACTAACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAMATGGAAAAGGAAGGAAARATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGGAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGATTTCTGGGAAGTTCARTTAGGAATACCACATCCYGCAGGGTTAAAGAAGAAAAARTCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_4665_200501'          CCCATAAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTGTTTGCCATAARGAAAAAAGATAGTACCAAATGGAGAAARTTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAGTTAGGAATACCACATCCYGCAGGGTTAAAAAAGAAAARATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCMTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAAACACCAGGGATTAGATATCAGTACAATGTGCTKCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_4647_200501'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCGAAAGTTAAACAATGGCCATTGACAGAAGARAAAAAAGCATTAACAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGGAAATTAGTAGATTTCAGGGAACTTAATAAAAGAACTCAAGATTTTTGGGAGGTTCAATTAGGAATACCGCATCCTGCAGGGTTAAGAAAGAAWAAGTCAGTAACAGTACTGGATGTGGGGGATGCATATTTTTCAGTTCCCTTAGATGAVTTCAGGAAGTATACAGCATTTACCATACCTAGTGCAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_4550_200501'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTKAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCTATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGARCTTAATAAGAGAACTCAAGACTTCTGGGAAGTCCAATTAGGAATACCACATCCAGCAGGATTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCTTTAGATGAATTCAGAAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_4537_200501'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTGAAAAAGAAAAAATCAGTGACAGTACTAGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTTAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTGCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_4526_200501'          CCCATTAGCCCTATTGAAACTGTACCAGTAAAAAAACCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTAACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAGGAAAAAAGACAGCACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAGGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTAGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTACACTGCATTTACCATACCTAGTACAAACAATGGGACACCAGGAATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_4542_200501'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACMCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAGTTAGTGGATTTCAGAGAACTCAATAARAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCTTTAGATGAATTCAGGAAGTATACTGCATTTACTATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_4544_200501'          CCCATTAGTCCTATTGAAACTGTGCCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAGGTTCAATTAGGAATACCACATCCCGCAGGATTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTATATGACTTTAGAAAGTATACTGCATTTACCATACCTAGTACCAATAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTCCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_3726_200501'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAGAAAGCATTAGTAGAAATCTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAACACCCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTGGTGGATTTCAGAGAACTTAATAAGAGAACCCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATGATTTCAGGAAGTACACTGCATTCACCATACCTAGTGTCAATAATGAGACACCAGGAATTAGGTACCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_2857_200501'          CCCATTAGTCCTATTRAAACTRTACCAGTAAAAAAGCCAGGAATGGACGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGATAGTACCAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAAACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_2843_200501'          CCCATTAGTCCTGTTGACACTGTACCAGTAAAAAAGCCAGGAATGGATGGTCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCCGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGATAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAGAAGAAGAAATCAGTAACAGTATTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAAACGCCAGGAATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_2867_200501'          CCCATTAGTCCTATAGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTTCTAAATGGAGAAAATTAGTAGATTTTAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCGCATCCAGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTGCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_2882_200501'          CCTATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAGTGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTCTTTGCTATAAAGAAAAAAGACAGTACTAAGTGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCTCAGGGTTAAAACAGAAAAAGTCAGTAACAGTACTGGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATGACTTCAGGAAGTACACTGCATTCACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCATCAATATT [...]
+	'CCB_287_200501'           CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATCTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTCACCATACCTAGTGTAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_2778_200501'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAGATTTCAAAAGTTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGGGAACTTAATAAGAGAACTCAAGATTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTATTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAATATACTGCATTCACCATACCTAGTATAAACAATGAGACACCAGGGATTAGGTATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_269_200501'           CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGARAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAACCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACTATACCTAGTATAAACAATGAAACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_2653_200501'          CCAATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAGATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCAATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACACAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTATTGGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATGATTTCAGGAAGTATACTGCATTCACCATACCTAGTACAAACAACGAGACACCAGGGATTAGATATCAATACAATGTGCTCCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_27_200501'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCACTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAGATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTGGATTTCAGAGAGCTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCTCTAGACGAATTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGGTTAGATATCAATACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_2764_200501'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAGCAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGAYTTCAGAGAACTTAATAAGAGAACTCAAGAYTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTWACAGTACTGGATGTGGGYGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGAAAGTACACTGCATTTACCATACCTAGCACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCCCAGGGAGGATCACCAGCAATATT [...]
+	'CCB_2738_200501'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAGAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTGGATTTCARARAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTTAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_2884_200501'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGGAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGATTTTTGGGAGGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCGGTAACAGTACTGGATGTAGGTGATGCATATTTTTCAGTTCCCTTGGATGACTTCAGGAAGTATACTGCATTCACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_301_200501'           CCCATTAGTCCTATTGAAACTGTACCAGTAAARAARCCAGGAATGGATGGCCCAAAAGTYAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGARAATCCATACAATACTCCAGTGTTTGCYATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGAYTTTAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTGACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTACATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAAACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_2983_200501'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAARCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAGGAAAAAAAAGCATTRGTAGAAATTTGCACAGAAATGGAAAAGGAAGGAAAAATTTCAAAGATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTCCAATTAGGAATACCCCATCCCGCAGGATWAAAAAAGAAAAAATCAGTAACAGTACTAGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAARTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTAYAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_3014_200501'          CCCATTAGTCCTATTGAAACGGTACCAGTAAAAAAGCCAGGAATGGACGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCCGAAAATCCATACAATACTCCAGTATTTGCTATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAGCTTAATAAGAGAACTCAAGACTTCTGGGAAGTGCAATTAGGAATACCACATCCCGCAGGGTTAAAGAAGAAAAAATCAGTAACAGTACTAGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGAAAGTATACTGCATTTACCATACCTAGTACAAACAATGAAACGCCAGGAGTTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCGATATT [...]
+	'CCB_3091_200501'          CCCATYAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTGAAAAAATTGGRCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTTAGAGAACTTAATAAGAGAACTCAAGATTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAGAAGAAAAAATCAGTAACAGTACTAGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTACACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_3060_200501'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAACAGAAATTTGTACAGATATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTGGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAGAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACTATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_2975_200501'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAMAAGCATTARTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAAYCCATACAATACTCCARTATTTGCCATAAAGAAAAAAGATGGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAGAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCTTTAGAYGAATTCAGGAAGTATACTGCATTTACTATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_2933_200501'          CCAATTAGTCCCATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTACAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTRGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCGGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGAYAACTTCAGGAAGTATACTGCATTTACCATACCTAGCACAAACAATGAGACACCAGGGATTAGATATCAATATAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_2929_200501'          CCCATAAGTCCTATTGACACTGTACCAGTAAAAAAGCCAGGAATGGATGGTCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGACTTTTGGGAAGTTCAATTAGGAATACCACATCCYGCCGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATACTTTTCAGTTCCCTTAGATGAATTCAGAAAGTATACTGCATTTACCATACCTAGTACAAATAATGAGACACCAGGAATTAGATATCAGTACAATGTGCTGCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_2969_200501'          CCCATTAGTCCTATTRAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAGRGTTAAACAGTGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAARGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATATAAYACTCCAGTGTTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTTAGAGAACTTAATAAAAGAACTCAAGACTTTTGGGARGTTCAATTAGGGATACCACACCCCGCAGGATTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTACCACAAGGRGGATCACCAGCAATATT [...]
+	'CCB_2971_200501'          CCCATAAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAGTGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAGAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGATAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCTCAGGWTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCCGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAAACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCGCCAGCAATATT [...]
+	'CCB_2652_200501'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAGAGTTAAACAATGGCCATTGACAGAAGAAAAAAACGCACTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAGATTTCAAGAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCTATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTTAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATACTTTTCAGTTCCCTTAGATAACTTTAGAAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGAATTAGATATCAGTACAATGTGCTCCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_2387_200501'          CCTATCAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGACTTCAGAGAACTTAATAAGAGAACTCAAGACTTTTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGAAAGTATACTGCATTTACCATACCTAGCATAAACAATGAGACACCAGGGATTAGATACCAATACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_2384_200501'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTTGACTTTAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCATTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGAATTAGATACCAGTATAATGTGCTTCCACAGGGAGGATCACCAGCAATTTT [...]
+	'CCB_2389_200501'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTTGACTTTAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCATTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGAATTAGATACCAGTATAATGTGCTTCCACAGGGAGGATCACCAGCAATTTT [...]
+	'CCB_246_200501'           CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAGATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGCACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAGGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTCTCAGTTCCCYTAGATGACTTCAGGAAGTATACTGCATTYACCATACCTAGCATAAACAATGAAACACCAGGGGTTAGATATCAGTACAATGTACTCCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_2415_200501'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAGAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATCTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAGTTAGTGGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGGATACCACATCCCTCAGGGTTAAAGAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCTTATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAAACACCAGGGATTAGATATCAGTACAATGTACTTCCACAGGGAGGATCACCATCAATATT [...]
+	'CCB_2381_200501'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTCAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAACAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAACCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGATAGTACTAAATGGAGAAAGTTAGTAGATTTCAGGGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCAGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTAGATGTGGGTGATGCATATTTTTCAGTTCCCTTACATGACTTCAGGAAGTACACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGGTTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_2354_200501'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATYTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAGCTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCGCATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTCTCAGTTCCTTTAGATGACTTCAGGAAATATACTGCATTTACCATACCYAGTATAAACAATGAGACACCAGGAATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_2329_200501'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAGAGTTAAGCAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACGGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGATTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTAGATGTGGGTGATGCATATTTTTCAGTTCCTTTAGATGACTTCAGGAAGTATACTGCATTCACCATACCTAGTACAAACAATGAGACACCAGGAATTAGATATCAGTACAATGTGCTCCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_2359_200501'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAGAAGCCAGGAATGGATGGYCCAAAAGTTAAACARTGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATCTGTACAGAAATGGAAAAAGAAGGGAAGATTTCAAAGATTGGGCCTGAAAATCCATACAATACYCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTTAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACGGTACTGGATGTGGGTGATGCATATTTTTCAATTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_236_200501'           CCTATTAGCCCTATTGAGACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAGAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTCCAATTAGGAATACCACATCCTGCAGGATTAAAAAAGAAGAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGACGATTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCGGCAATATT [...]
+	'CCB_2466_200501'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAACCAGGAATGGATGGCCCGAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATCTGTACAGAAATGGAAAAGGAAGGAAAAATCTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCAATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTTAGAGAACTTAATAAGAGAACTCAAGACTTTTGGGAAGTTCAATTAGGGATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTACACTGCATTYACCATACCGAGTATAAACAATGAGACACCAGGGGTTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_2589_200501'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAGAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAAGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAATATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAGTTGGTAGATTTCARAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTCCAATTAGGAATACCACATCCCGCAGGATTAAAAAAGAAAAAATYAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCYTTATATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGAATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCGATATT [...]
+	'CCB_2548_200501'          CCTATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAGTGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTCTTTGCTATAAAGAAAAAAGACAGTACTAAGTGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCTCAGGGTTAAAACAGAAAAAGTCAGTAACAGTACTGGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATGACTTCAGGAAGTACACTGCATTCACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_2590_200501'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAGAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCCTACAATACTCCAATATTTGCTATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCARAGAACTTAATAARAGAACTCAAGACTTYTGGGAGGTTCAATTAGGAATACCCCATCCCGCRGGKTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGACGCATATTTTTCAGTYCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCCAGTACAAACAATGAGACACCAGGGAYTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_2638_200501'          CCCATCAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTCAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCCCATCCCGCAGGGTTAAAGAAGAAAAAATCAGTAACAGTACTGGATGTAGGTGATGCGTATTTCTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAAACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_2592_200501'          CCYATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCRGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTYAGAAAGTATACTGCATTTACCATACCTAGTACAAATAATGAGACACCAGGGATTAGATATCAATACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_2547_200501'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGTCCAAAAGTTAAACAATGGCCATTGACWGAAGAAAAAAAAGCATTAACAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAGAATTGGGCCTGAAAATCCATACAATACTCCAATATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGGAAATTAGTAGATTTCAGAGAACTCAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAGAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCTTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAAATGCCAGGAATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_2469_200501'          CCCATTAGCCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGACGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAGGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCCGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAARAGATGGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGGATACCACATCCCGCAGGGTTAAAACAGAAAAAATCAGTAAAAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCCAGTACAAACAATGAAACACCAGGAATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_2468_200501'          CCCATTAGCCCTATTAAAACTGTACCAGTAAAAAAGCCAGGAATGGACGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCCGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGATGGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGGATACCACATCCCGCAGGGTTAAAACAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCCAGTACAAACAATGAAACACCAGGAATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_2515_200501'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAGAGTTAAACAATGGCCATTGACAGAAGAGAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAACCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACCCAGGATTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_252_200501'           CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAGAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTCCAATTAGGAATACCACATCCCGCAGGATTAAAAAAGAAAAAATCAGTAACAGTATTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTACATGATTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGAACTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_3092_200501'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCACTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTTAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAGTCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_3510_200501'          CCCATTAGTCCTATTGAAACTGTACCAGTGAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCCGAAAATCCATACAATACTCCAGTRTTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTYTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAGAAGAAAAAATCAGTRACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAYTTCAGGAAGTATACTGCATTCACCATACCTAGTACAAACAATGAAACACCAGGAATTAGATATCAGTACAATGTGCTGCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_351_200501'           CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAGATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGGGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAGAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAATTCCATTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAAACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_3519_200501'          CCTATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAGCAGTGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAATATTTGCCATAAGGAAAAAAGACAGTAATAGATGGAGAAAGTTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTCCAATTAGGAATACCACATCCCGCGGGATTAAAAAAGAAAAAATCAGTAACAGTATTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTATATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAAACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_3538_200501'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAGATGGAAAAGGAAGGAAAAATTTCAAAAATTGGACCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTTTGGGAGGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTAGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_3522_200501'          CCTATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAGAAAGCATTAACAGAAATATGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAGAATTGGGCCTGAAAACCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGATAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATACTTTTCAGTTCCCTTAGATAGCTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGAATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_3482_200501'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAGAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTGGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTTTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTACAACAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_3469_200501'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAGAATTGGGCCTGAAAATCCATACAATACTCCAATATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAGGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATGACTTCAGGAAGTACACTGCATTCACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_3454_200501'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAACCAGGAATGGATGGCCCGAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCGAAAATTGGGCCCGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACACCCCGCAGGGTTAAAGAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTGCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAAATGCCAGGAACTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCGCCAGCGATATT [...]
+	'CCB_3474_200501'          CCCATTAGTCCTATTGAAMCTGTACCAGTAAAAAAGCCAGGAATGGATGGGCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAAGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGGACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCCCATCCCGCAGGATTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCGTTAGATAACTTTAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTCCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_3476_200501'          CCCATTAGTCCTATTGAAACTGTACCTGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAATAGAGATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCTAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGATKGKWCTWAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAGGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_3545_200501'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAGAAAGCACTAGTAGAAATTTGCACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCTATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTTAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTAGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGAATTAGATATCAATACAATGTGCTTCCGCAGGGAGGATCACCAGCAATATT [...]
+	'CCB_3669_200501'          CCTATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCGAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAGGCMTTAGTAGAAATCTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACGGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGGATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCCGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGGTATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_3650_200501'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAACCAGGAATGGATGGCCCAAAAGTTAAGCAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAGATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTGTTTGCCATAAAGAAAAAAGATGGTAATAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACCCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGACGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAATAATGAGACACCTGGAATTAGATATCAGTACAATGTGCTTCCTCAGGGAGGATCACCAGCAATATT [...]
+	'CCB_368_200501'           CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAGTGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTCCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTTCTAGATGTGGGTGATGCATATTTTTCAGTTCCATTAGATGAGTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATACCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_3699_200501'          CCCATTAGTCCTATTGAAACRGTACCAGTAAAAAAGCCAGGAATGGATGGGCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCMTACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTACACTGCATTTACTATACCTAGCATAAACAATGAGACACCAGGGACTAGATATCAGTACAATGTGCTTCCACAGGGGGGATCACCAGCAATATT [...]
+	'CCB_3692_200501'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAARTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAGAAGGAAGGAAAAATTTCAAAAATTGGGCCCGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTRGGAATACCACATCCCGCAGGGTTAAAGAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAAACGCCAGGAGTTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_3620_200501'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAA---AAAAAAGCATTAGTAGAAATTTGTACAGAGATGGAAAAGGAAGGAAAAATTTCAAAGATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAGGTCCAATTAGGAATACCACATCCTGCAGGATTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATAGCTTCAGGAAGTATACTGCATTCACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCTCCAGCAATCTT [...]
+	'CCB_357_200501'           CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGGATGGACGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATCTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAGAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAATTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCGTACCTAGTACAAACAATGAGACACCAGGGATTAGATACCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_3568_200501'          CCTATTAGTCCTATTGAAACTGTACCAGTAAGAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAAGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTGTTTGCCATAAAGAAAAAGGACGGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTCCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATAACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_3570_200501'          CCCATTAGTCCTATTGAAACTGTACCAGTRAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATCTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAGAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAGTGGAGAAAATTAGTGGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGGGATGCATATTTTTCAGTTCCCTTAGATGACTTTAGGAAGTACACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTATAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_3577_200501'          CCCATTAGTCCTATTGACACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTGGAAATCTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAATATTTGCCATAAAGAAAAAGGACGGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGATTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTATTGGATGTGGGTGATGCATATTTTTCAGTTCCATTAGATGAATTCAGGAAGTATACTGCCTTTACCATACCTAGTATAAATAATGAGACACCAGGAATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_3446_200501'          CCCATTAGTCCTATTGAAACGGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAGAGTTAAACAGTGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAAYACTCCAGTRTTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTGGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTCCAATTAGGAATACCACATCCCGCAGGGYTAAAAAAGAGAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGARACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_3233_200501'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAGGAAAAAAAAGCATTAGTAGAAATCTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAGTTAGGAATACCACATCCTGCAGGGCTAAAAAAGAAAAAATCAGTGACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATAACTTCAGGAAATATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGGTTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_3225_200501'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATCTCAAAAATTGGGCCAGAAAATCCATACAATACACCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGCATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_3236_200501'          CCCATTAGTCCTATTGAAACTGTACCAGTGAAAAAGCCAGGAATGGATGGCCCGAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTAGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTTAGGAAGTATACCGCATTCACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_3265_200501'          CCCATTAGCCCTATTGAAACTGTACCAGTAAAAAAGCCAGGTATGGATGGCCCAAAGGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAGAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGACTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATAAATTCAGGAAGTATACTGCATTTACCATACCTAGTATGAACAATGAAACACCAGGGATTAGATATCAATACAATGTGCTTCCACAGGGAGGATCACCAGCAATYTT [...]
+	'CCB_3258_200501'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAGCAATGGCCATTGACAGAAGAAAAAAAAGCACTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTTTGGGAAGTYCAATTAGGAATACCACATCCCGCAGGGTTAAAGCAGAAAAAATCAGTGACAGTACTAGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATGACTTTAGGAAGTATACTGCATTTACCATACCTAGTATTAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_3223_200501'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAGGAAAAAAAAGCATTAGTAGAAATCTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAGTTAGGAATACCACATCCTGCAGGGCTAAAAAAGAAAAAATCAGTGACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATAACTTCAGGAAATATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGGTTAGATATCAGTACAATGTRCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_3192_200501'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTYAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACACCCCGCAGGGTTAAAAAAGAAAAAGTCAGTAACAGTACTGGATGTGGGTGATGCATACTTTTCAGTTCCATTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGGTATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_3162_200501'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAGAGTTAAGCAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGATATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTGGATTTCAGAGAACTTAATAAGAGAACTCAGGACTTCTGGGAAGTTCAATTAGGGATACCACATCCTGCAGGGTTAAAGAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAAACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_3195_200501'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAAGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTACACTGCATTTACTATACCTAGYACAAACAATGAGACACCAGGGGTTAGATATCAGTACAATGTGCTTCCACAAGGAGGATCACCAGCAATATT [...]
+	'CCB_3216_200501'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAACCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGCACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTTTGGGAAGTTCAGTTAGGAATACCACATCCCGCAGGGTTAAAGAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTCTCAGTTCCTTTAGATGACTTCAGGAAGTATACTGCATTTACTATACCTAGTATAAACAATGAGACACCAGGGACAAGATATCAGTACAATGTGCTTCCACAGGGAGGGTCACCAGCAATATT [...]
+	'CCB_3273_200501'          CCCATYAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAGGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATAYAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTYAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGGATACCACATCCCGCRGGGYTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_332_200501'           CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCTTACAATACYCCAGTATTTGCTATAAAGAAAAAGGACAGTACTAAATGGAGGAAGTTAGTAGATTTCAGAGAACTCAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACTATACCTAGTATAAACAATGCGACACCAGGGACTAGATATCAGTACAATGTGCTTCCACARGGAGGATCACCAGCAATATT [...]
+	'CCB_3319_200501'          CCCATCAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAGAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACACCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAGTGGAGAAAGTTAGTGGATTTCAGAGAACTCAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAACAGAAAAAATCAGTAACAGTATTGGATGTGGGTGATGCATATTTTTCAGTGCCCTTAGATGATTTTAGGAAGTATACTGCATTCACTATACCTAGTATAAACAATGAGACACCGGGGATTAGATATCAGTACAATGTGCTTCCCCAGGGGGGATCACCAGCAATATT [...]
+	'CCB_3327_200501'          CCCATTAGTCCTATTGAGACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCCTTGACAGAAGAAAAAAAAGCGCTAGTAGAAATTTGTACAGAAATGGAACAGGAAGGAAAAATTTCAAGAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCTATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGGACYCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAGAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTTAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGAATTAGATATCAGTACAATGTGCTCCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_3398_200501'          CCCATTAGTCCCATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAGATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAGTGGAGAAAATTAGTAGATTTCAGAGAGCTTAATAAGAGAACTCAAGACTTTTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTACAAATAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAAGGAGGATCACCAGCAATATT [...]
+	'CCB_3384_200501'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGGCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATYTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTGTTTGCCATAAAGAAAAARGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAACAGAAGAAGTCAGTAACAGTACTAGATGTGGGTGATGCATATTTTTCAATTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTRTAAACAATGAGACRCCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_3311_200501'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATCACAAAAATTGGGCCTGAAAACCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGACAGCTTCAGGAAGTACACTGCATTTACCATACCTAGTATCAACAATGAGACACCAGGGATTAGATACCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_3293_200501'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAGAGTTAAACAATGGCCATTGACAGAARAAAAAAARGCCTTAGTAGAAATTTGTACMGAAATGGAAAAGGAAGGAAAAATCTCAAAAATTGGGCCTGRAAATCCATACMATACCCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTCCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCGGTAACRGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAGTTCAGGAAGTATACTGCATTTACCATACCCAGTACAAACAATGAAACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_3287_200501'          CCTATTAGTCCCATTGAAACTGTACCAGTAAGAAAGCCAGGAATGGATGGCCCAAGGGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCTATAAAGAAAAAAGACAGTACTAAGTGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTGAAACAGAAAAAATCAGTAACAGTATTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGATTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCGATATT [...]
+	'CCB_3303_200501'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAAGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCAATAAAGAAAAAAGACAGTACTAAATGGAGAAAGTTAGTAGATTTCAGGGAACTYAATAAAAGAACTCAAGACTTCTGGGAAGTCCAATTAGGAATACCACATCCCGCAGGATTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCATTATATGACTTCAGAAAGTATACTGCCTTTACCATACCCAGCACAAACAATGAGACACCRGGAATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_3308_200501'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAAGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCAATAAAGAAAAAAGACAGTACTAAATGGAGAAAGTTAGTAGATTTCAGGGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTCCAATTAGGAATACCACATCCCGCAGGATTAAAAAGAAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCATTATATGACTTCAGAAAGTATACTGCCTTTACCATACCCAGCACAAACAATGAGACACCAGGAATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_5040_200501'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGTCCAAGAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAATAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAGATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAATATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGGGAACTTAATAAAAAGACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCGGGGTTAAAAAAGAAAAAATCAATAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_2214_200501'          CCYATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGACGGCCCAAAAGTTAARCAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCCGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAGAAGAAAAAATCAGTAACAGTACTAGATGTGGGTGATGCATAYTTTTCAGTTCCCTTAGATGACTTCAGAAAGTATACTGCATTTACCATACCTAGTACAAACAATGAAACGCCAGGAATTAGATATCAGTATAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_222_200501'           CCCATTAGTCCTATTGACACTGTACCAGTAAGAAAGCCAGGAATGGATGGGCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCTTTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAACAAGAGAACTCAAGACTTTTGGGAAATTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGGTTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_2207_200501'          CCCATTAGTCCTATTGATACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATCGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAWTTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTTTGGGAAGTMCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTCCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_2174_200501'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGTATGGATGGCCCGAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATCTGTACAGAAATGGAAAAGGAAGGAAAAATTGAAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTRTTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGGATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAATATACAGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAATACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_2179_200501'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAACCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGCTAAAACAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCCAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTACTCCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_2244_200501'          CCCATTAGCCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAGTGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCCTACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGACTTCAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTACATAGCTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCGGGGATTAGATATCAGTACAATGTACTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_2275_200501'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGGCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGATAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTTTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATAYTTTTCAGTCCCCTTAGATGACTTCAGGAAGTACACTGCATTTACCATACCCAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_2278_200501'          CCCATCAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGYACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGACTTCAGAGARCTTAATAAGAGAACTCAAGACTTCTGGGAAGTCCAATTAGGRATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCARTTCCCTTAGATRACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGGTATCAGTATAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_2274_200501'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAGGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAAGAAGGAAAAATTTCAAAAGTTGGGCCTGAAAATCCATACAACACCCCAGTATTTGCCATAAAGAAAAAGGATGGTACTAAATGGAGAAAGTTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACTATACCTAGTACAAACAATGAGACACCAGGGATTAGATACCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_2246_200501'          CCCATTAGCCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCACTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCCGAGAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTCAATAAGAGAACTCAAGACTTCTGGGAAATTCAACTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTCTCARTTCCCTTAGATAACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAATACAATGTGCTGCCACAGGGAGGCTCACCAGCAATATT [...]
+	'CCB_2248_200501'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAACAGAAATTTGTATGGAAATGGAAAAGGAAGGRAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCTATAAAGAAAAAAGACAGTACCAAATGGAGAAAATTAGTAGACTTCAGAGAACTTAATAAGAGAACTCAAGACTTTTGGGAAGTTCAGTTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAARTCAGTAACAGTGCTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTACACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_2141_200501'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGARAAGGARGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACCCCAGTATTTGCCATAARGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCTCAGGGTTAAAAAAGAAAAAATCAGTAACAGTGCTRGATGTGGGTGATGCATATTTTTCAGTTCCTTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTAGAAACAATGAGACACCAGGAATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_1903_200501'          CCCATTAGTCCTATCGAAACTGTACCAGTAAAAAAACCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCACTGACAGAAGAAAAAAAAGCATTAATAGAAATCTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGACCTGAAAATCCATACAATACTCCAGTATTTGTCATAAAGAAAAAAGACAGTACCAAATGGAGAAAATTAGTAGATTTTAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGCTAAAAAAGAAAAAGTCAGTAACAGTACTGGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATGACTTCAGAAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGAATCAGATATCAGTACAATGTGCTTCCACAGGGAGGATCGCCAGCAATATT [...]
+	'CCB_1904_200501'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCTCAGGGTTAAAAAAGAAGAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCATTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGCGGCACCAGGGGTTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_1901_200501'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAGGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAGAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAARTTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAGGTCCAATTAGGAATACCACATCCCGCAGGGCTAAAAAAGAAGAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGAATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_1840_200501'          CCCATCAGTCCTATTGAAACTGTACCAGTAAGCAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGARGAAAAAAARGCATTAGTAGAAATWTGTACAGAAATGGAAAAGGAAGGAAAAATTTCRAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCTATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTTTGGGAAGTTCAATTAGGGATACCACATCCCTCAGGGTTAAAGAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGGTATCAGTACAATGTGCTGCCACAGGGAGGRTCACCAGCAATATT [...]
+	'CCB_1873_200501'          CCCATTAGTCCTATTGACACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCACTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTACAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAGCTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCTCATCCCTCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTCACTATACCCAGTACAAACAATGAGACACCAGGAATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_1973_200501'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGACGGCCCAARAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAAYACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAGAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAYTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAAACRCCAGGAATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_2044_200501'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGGCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATATGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATCCCACATCCCGCAGGGTTAAAGAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTCACCATACCTAGTACAAACAATGAAACGCCAGGAGTTAGATACCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_2112_200501'          CCCATCAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAACTGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAGAATCCATACAATACTCCAGTATTTGCTATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTGGATTTCAGAGAGCTTAATAAGAGAACTCAAGACTTTTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTGAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGATTTCAGAAAATATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATACGTATACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_2008_200501'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAACCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAGAAGAAAAAATCAGTAACGGTGCTAGATGTAGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAATACACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTGCCACAGGGAGGATCACCAGCGATATT [...]
+	'CCB_1976_200501'          CCTATTAGTCCCATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATCTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTTTGGGAGGTTCAATTAGGAATACCACATCCTGCAGGATTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTCACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTATAATGTACTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_2280_200501'          CCCATYAGTCCTATTGAAACTGTACCAGTAAAAAARCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAACCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTGGATTTCAGAGAACTTAATAARAGAACTCAAGACTTCTGGGAAGTTCAATTAGGGATACCACATCCCGCAGGGTTAAAAAAGAAGAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTYCCCTTAGATGAGTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAAGGAGGATCACCAGCAATATT [...]
+	'ARG_56_200001'            ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAARGAAGGGAAAATTTCAAAAATTGGGCCTGAAAAYCCATACAATACTCCAGTATTTGCYATAAAGAAAAAAGACAGTACTAAATGGAGGAAATTAGTAGATTTYAGAGAACTTAATAAAAGAACTCAAGATTTYTGGGARGTTCAATTAGGAATACCGCATCCTGCTGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGGGATGCATATTTTTCAGTCCCCTTAGATGAGTTCAGGAAGTACACAGCATTCACCATACCTAGTATCAACAATGAGACACCAGGAATTAGATATCARTACAATGTGCTCCCACAGGGAGGATCACCAGCAATATT [...]
+	'ARG_57_200001'            ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGCACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTCCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAWTTCAGGAAGTATACTGCATTTACCATACCTAGYATGAACAATGAGACACCAGGGATTAGATATCAATACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'ARG_55_200001'            ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGARAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAGGACTTCTGGGAAGTYCAATTAGGAATACCACATCCYGCAGGGTTRAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTYTCARTTCCCTTAGATGACTTCAGGAAGTATACTGCATTCACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTYCCACAGGGCGGATCACCAGCAATATT [...]
+	'ARG_53_200001'            ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGGAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACAACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTAGATGTRGGTGATGCATATTTCTCAGTTCCCTTAGATGARTTCAGGAAGTACACGGCATTCACCATACCTAGTATAAACAATGAGACACCAGGGRTTAGATATCAATACAACGTGCTCCCACAGGGAGGATCACCAGCAATATT [...]
+	'ARG_54_200001'            ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAGGAGGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCARTATTTGCYATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGAYTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTRGATGTGGGTGATGCATAYTTTTCAGTTCCYTTACATGAYTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGGTTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'ARG_58_200001'            ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAGGAGGGAAAAATTTCAAAAATTGGGCCTGAAAAYCCATACAATACTCCAGTATTTGCYATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTATTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAYATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCARTACAATGTGCTTCCACAGGGGGGATCACCAGCAATATT [...]
+	'ARG_61_200001'            ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAGAATTGGACCTGAAAATCCATACAATACTCCAGTATTCGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAAGCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACTATACCTAGTATAAACAATGAGAAACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'ARG_62_200001'            ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAGGAAGGGAAAATTGMAAGAATTGGGCCTGAAAAYCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCAGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCRGTTCCTYTAGATGACTTCAGAAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTRCTTCCACAGGGAGGATCACCAGCGATATT [...]
+	'ARG_60_200001'            ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAAGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGATTTTTGGGAAGTTCAATTAGGRATACCACATCCCGCTGGGTTAAAAAAGAAAAAATCAGTAACAGTACTRGATGTGGGWGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTATGAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'ARG_59_200001'            ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAAGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGATTTTTGGGAAGTTCAATTAGGRATACCACATCCCGCTGGGTTAAAAAAGAAAAAATCAGTAACAGTACTRGATGTGGGWGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTATGAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'ARG_52_200001'            ---------------------------------------------------------------------------------------------------------------GAAATGGAAAAGGAAGGGAAAATTACAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTTTGGGAAGTTCAATTAGGAATACCACATCCAGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGACGTGGGTGATGCATATTTTTCAGTTCCTTTAGATGACTTCAGAAAGTATACTGCATTTACCATACCTAGTATAAACAAYGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGRTCACCAGCGATATT [...]
+	'ARG_44_200001'            ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAAGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAACACTCCAATATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGGAAGTTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGATTTTTGGGAGGTTCAATTAGGAATACCGCATCCTGCAGGGTTAAAAAAGAARAAATCAGTAACAGTACTGGATGTGGGGGATGCATATTTTTCAGTTCCCYTAGATGATTTCAGGAAGTACACTGCATTCACCATACCTAGTGTCAACAATGAGACACCAGGAATTAGGTACCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'ARG_46_200001'            ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGRAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAGGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATACTTTTCAGTTCCCTTAGATGAYTTCAGGAAGTATACTGCATTCACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATACCAGTACAATGTGCTCCCACAGGGAGGATCACCAGCAATATT [...]
+	'ARG_43_200001'            ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ATACCTAGTGTCAACAATGAGACACCAGGAVTTAGGTACCAGTATAATGTGCTTCCACAGGGAGGATCACCAGCGATATT [...]
+	'CCB_229_200501'           CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCGAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTGCAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACCCCAGTATTTGCCATAAAGAAAAAAGATGGTAMTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTACACTGCATTTACTATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTACTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_2311_200501'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTAACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAGCTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTACATAGCTTCAGGAAGTACACTGCATTTACCATACCTAGTATAAACAATGAAACACCAGGGATTAGATACCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'ARG_47_200001'            ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------TTTACCATACCTAGTGTAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCGCCAGCAATATT [...]
+	'ARG_50_200001'            ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGGAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAATGAAAAAATCAGTAACAGTATTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGGTTAGATATCAGTATAATGTGCTTCCACAGGGAGGATCACCAGCGATATT [...]
+	'ARG_51_200001'            ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTTTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTRGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAG???????????????????? [...]
+	'ARG_49_200001'            ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAAGAAGGAAAAATCTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGGAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGATTTTTGGGAGGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAARAAATCAGTAACAGTAYTGGATGTGGGGGATGCATATTTTTCAGTYCCCTTAGATGATTTCAGBAAGTACACTGCATTCACCATACCTAGTGTCAACAATGAGACACCAGGAATTAGGTACCAGTATAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'ARG_48_200001'            ---------------------------------------------------------------------------------------------------------TGTAYAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGGAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTGCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAGATCAGTAACAGTACTGGATGTGGGTGATGCATACTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTCACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTYCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_1839_200501'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAGGTTAAACAATGGCCATTAACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGRGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTGAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATGAMTTCAGAAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGRYTAGRTAYCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_1598_200501'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAGATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTGGATTTCAGAGAACTTAATAARAGAACTCAGGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTATTGGATGTGGGTGATGCATATTTTTCAGTTCCYTTAGACGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_161_200501'           CCCATTAGTCCTATTGAGACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAGGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAAYAGAGATTTGTRYRGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTAGATGTGGGAGATGCATATTTCTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTCACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'DB_SI7124_02_200201'      ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAGGAAGGAAAAATCTCAAARATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCYATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTTAGAGAACTTAATAAGAGAACTCAGGACTTCTGGGAAGTTCAATTAGGAATACCACATCCYGCAGGATTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTCTCAGTTCCTTTAGATGACTTCAGGAAGTATACTGCATTTACYATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'DB_SI7097_04_200401'      ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAGAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTAGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTCACCATACCTAGTACTAACAATGAGACACCAGGGATTAGGTATCAGTACAATGTACTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'DB_SI7123_04_200401'      ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAGAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAGGAAAAAAKCAGTAACAGTACTAGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTCACCATACCTAGTACTAACAATGAGACACCAGGGATTAGGTATCAGTACAATGTACTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_1635_200501'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAGAGTTAAACAATGGCCATTGACAGAAGAAMAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGARCTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGGATACCACATCCCGCAGGGTTGAAAAAGAAAAAATCAGTAACAGTACTAGATGTGGGTGATGCATATTTTTCAGTTCCCTTACATGATTTCAGGAAATATACTGCATTTACCATACCTAGTACAAACAATGAGACCCCAGGGATTAGATATCAGTACAATGTGCTTCCACAAGGGGGATCACCAGCAATATT [...]
+	'CCB_1671_200501'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAGAGTTAAACAATGGCCATTGACAGAAGAGAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTTAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTGACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCGTTAGATGAATTCAGGAAATATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_1700_200501'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGTATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAACAGAAATTTGTRCAGAAATGGAAAAGGAAGGAAAGATTTCAAAAATTGGACCTGAAAATCCATACAATACTCCAGTCTTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTAGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAYTTCAGGAAGTATACTGCATTTACCATACCTAGTAAAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTCCCACAGGGAGGATCACCAGCAATATT [...]
+	'DB_SI8504_04_200401'      ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAGAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCTATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTCAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCTCTGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGAGATGCATATTTTTCAGTTCCCTTAGATGACTTTAGGAAGTATACTGCATTTACTATCCCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTGCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_1638_200501'          CCCATTAGTCCTATTGAGACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAGTGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAGAAGGAAGGAAAAATTTCAAAGATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCAATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGGGAGCTTAATAAGAGAACCCAAGACTTCTGGGAAGTCCAATTAGGAATACCACATCCCGCAGGATTAAAAAAGAAAAAATCAGTTACAGTACTGGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATAGTTTCAGGAAGTATACTGCATTTACCATACCCAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'DB_SI8266_04_200401'      ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAGAAGGAAGGAAAAATTTCAAAGATAGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAATTCAGTAACAGTGCTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCTTTTACCATACCTAGTASAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_1588_200501'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAGATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTGGATTTCAGAGAACTTAATAARAGAACTCAGGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTATTGGATGTGGGTGATGCATATTTTTCAGTTCCYTTAGACGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_1373_200501'          CCTATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAGAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAATATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGATTTCTGGGAGGTTCAATTAGGAATACCACATCCCGCAGGGTTGAAGAAGAAAAAATCAGTAACAGTGCTGGATGTGGGGGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAAGGAGGATCACCAGCAATATT [...]
+	'CCB_1374_200501'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAGAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGCAGAGATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_1342_200501'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAGCAATGGCCATTGACAGAGGAAAAAAAAGCATTAGAAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGGGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGATTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTGGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGAATTAGATATCAGTACAATGTGCTTCCACAAGGCGGATCACCAGCAATATT [...]
+	'BRC1564_200208'           CCTATTAGCCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAATAGAAATCTGTACAGAAATGGAAAAAGAAGGGAAAATTTCAAAAATTGGGCCTGAGAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGATAGTACTAAATGGAGAAAATTAGTAGACTTCAGAGAACTTAATAAGARAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTAGATGTGGGTGATGCATATTTTTCAATTCCTTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTCCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_1338_200501'          CCMATTAGTCCCATTGAAACTGTACCAGTAAAAAARCCAGGAATGGATGGCCCAAAGGTCAAACAATGGCCATTGACAGAAGARAAAAAAGCATTAACAGCAATTTGTGMTGAAATGGARAGGGAAGGAAAAATYWCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACRGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTCCAATTAGGAATACCACATCCCGCAGGATTAAAAAAGAAAAAATCAGTAACAGTGCTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCCCAGGGAGGATCACCAGCAATATT [...]
+	'CCB_1444_200501'          CCCATTAGTCCCATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTAACAGAGGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAGAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCAATAAAGAAAAAAGAYAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGAATTCTGGGAAGTCCAATTAGGAATACCACATCCAGCAGGATTAAAAAAGAAGAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGATTTTAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_1507_200501'          CCCATTAGTCCTATTGATACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAGATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACCAAATGGAGAAAATTAGTAGATTTCAGGGAACTTAATAAGAGAACTCAAGATTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGCTAAAAAAGAAACAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATACCAGTACAATGTGCTCCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_1511_200501'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGTCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCACTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAACCCATACAATACTCCAGTATTTGCCATAAAGAAGAAAGACAGTACTAAGTGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGGACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTAGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATAAATTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTATAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_1479_200501'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCTATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGARCTTAACAARAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCKGCAGGGTTAAAACAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCATTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGAYTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_1445_200501'          CCCATTAGTCCTATTGAAACTGTACCTGTAAAAAAGCCAGGGATGGATGGCCCAARAGTTAAACAATGGCCATTGACAGAAGARAAAAAAGCATTAGTAGAAATCTGTACAGAAATGGAAAAGGAAGGAAAAATCTCAAAAATTGGGCCTGAAAATCCATACAACACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGGACTCAAGATTTCTGGGAAGTTCAATTAGGAATACCACATCCCTCAGGGTTAAAAAAGAARAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTCCCYTTAGATGAMTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGRTTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCATCAATATT [...]
+	'DB_SI9192_04_200401'      ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAAGAAGGGAAAATATCTAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGATTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTGAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCCTATATGACTTTAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_1768_200501'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAGGAAAAAAAAGCATTGGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCTGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTCAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTGACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAYTTCAGGAAGTATACAGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTATAATGTACTTCCACAAGGAGGATCACCAGCAATATT [...]
+	'CCB_1769_200501'          CCAATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAGGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAACAGAAATATGTACAGAAATGGAAAAAGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGATTTTTGGGAGGTTCAATTAGGAATACCRCATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGAGATGCATATTTTTCAGTTCCCTTAGATGATTTCAGGAAGTACACTGCATTCACCATACCTAGTATCAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCCCAGGGAGGATCACCAGCAATATT [...]
+	'CCB_1767_200501'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAGTGGCCATTGACAGAAGAAAAAAAAGCCTTAATAGAAATTTGTACAGAAATGGAAAAGGAAGGTAAAATTTCAAAGATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGGAAATTAGTAGATTTTAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTYCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTTAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGGTTAGATATCAGTACAATGTGCTCCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_1739_200501'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAGTGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGACCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGCACTAAATGGAGAAAATTAGTGGATTTCAGAGAACTTAATAAGAGAACTCAAGATTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTGACTGTGCTGGATGTAGGTGATGCATATTTTTCAGTTCCCTTAGATGCTTTCAGGAAGTATACTGCATTTACCATACCTAGTAAAAATAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_1741_200501'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACYTCTGGGAAGTTCAATTAGGGATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTAGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTTAGAAAGTACACTGCATTTACCATACCTAGTATAAATAATGAGACACCAGGGATTAGATACCAGTACAATGTGCTCCCACAGGGAGGATCACCAGCGATATT [...]
+	'CCB_1773_200501'          CCCATTAGTCCTATTGATACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCTATAAAGAAAAAAGACGGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGATTTTTGGGAAGTTCAATTAGGAATACCACATCCCGCTGGGTTAAAAAAGAAGAAATCAGTAACAGTACTAGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTCACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAATACAATGTGCTCCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_1803_200501'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTAACAGAAGAAAAAAAAGCATTAGTAGAAATYTGTACAGAAATGGAAAAGGAAGGGAAAATCTCAAAAATTGGGCCTGAAAACCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTTAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAGATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTTAGGAAGTATACTGCATTTACCATACCTAGTACAAATAATGAGACACCTGGGGTTAGATATCAGTATAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_183_200501'           CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAGAGTTAARCAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATYTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAACCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTGGATTTCAGGGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCTCAGGGTTAAAAAAGAAAAAATCAGTAACAGTTCTGGATGTGGGTGATGCATACTTTTCAGTTCCCTTAGATGACTTTAGRAAGTATACTGCATTTACCATACCYAGTATAAACAATGAGACACCAGGGRTTAGATATCAGTATAATGTGCTCCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_1801_200501'          CCTATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAGGATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTCCAATTAGGAATACCACACCCCTCAGGRTTAAAAAAGAAAAAATCAGTAACAGTAYTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATAGCTTCAGGAAGTATACTGCATTTACAATACCTAGTATAAACAATGAGACACCAGGAATTAGATATCAGTACAATGTGCTTCCACAGGGAGGRTCACCAGCAATATT [...]
+	'CCB_1799_200501'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAARGACAGTACTAAATGGAGAAAATTAGTGGATTTCAGAGARCTAAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAATAACAGTACTGGATGTAGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCYAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_1736_200501'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGTCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATCTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'DH009_200112'             CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATCGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGGGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCTGTAACAGTCTTGGATGTGGGTGATGCATATTTCTCAGTTCCTTTAGACGACTTCAGGAAGTATACTGCATTTACCATACCTAGTGTAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'DH011_200112'             CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAGTTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGGGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTCCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCTGTAACAGTCCTGGATGTGGGTGATGCATATTTCTCAGTTCCTTTAGATGACTTTAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGGTTAGATATCAATACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'DH002_200112'             CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAACCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGGGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAACTAGGAATACCACATCCCGCAGGGTTGAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTCTCAGTTCCTTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTGTAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'DB_SI943_00_200001'       ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAGAATCCATACAATACTCCAATATTTGCTATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAGACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCATTAGATGAGTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'DH001_200112'             CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGGTGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGGGAACTTAATAAAAGAACTCAAGACTTTTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTCCTGGATGTGGGTGATGCATACTTCTCAGTTCCTTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCCAGTATAAACAATGAGACACCAGGGATTAGATATCAGGTCAATGTGCTTCCCCAGGGAGGATCACCAGCAATATT [...]
+	'DH012_200112'             CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGGGAACTTAATAAAAGAACTCAAGATTTTTGGGAAGTTCAATTAGGAATACCACACCCAGCAGGGTTAAAAAAGAAAAAATCAGTGACAGTACTGGATGTGGGGGATGCATATTTTTCAGTTCCCTTATTTGACTTCAGGAAATATACTGCATTCACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATACCAGTATAATGTGCTTCCCCAGGGAGGATCACCATCAATATT [...]
+	'DH017_200112'             CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGGGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCTGTAACAGTCTTGGATGTGGGTGATGCATATTTCTCAGTTCCTTTAGACGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGAATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'DH019_200112'             CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATCGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGGGAACTTAATAAAAGAACTCAAGAGTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCCGTAACAGTCCTGGATGTGGGTGATGCATATTTCTCAGTTCCTTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTGTAAACAATGAAACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'DH016_200112'             CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTGCAGAAATGGAAAAGGAAGGAAAGATTTCAAAAATCGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGGGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTGGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCTGTAACAGTCTTGGATGTGGGTGATGCATATTTCTCAGTTCCTTTAGACGACTTCAGGAAGTATACTGCATTTACCATACCTAGTCTAAACAATGAGACACCAGGGATTAGATATCAGTCCAATGTGCTTCCACAAGGAGGATCACCAGCAATATT [...]
+	'DH013_200112'             CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGGGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTCCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCTGTAACAGTCCTGGATGTGGGTGATGCATATTTCTCAGTTCCTTTAGATGACTTTAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGGTTAGATATCAGTACAATGTGCTTCCCCAGGGAGGATCACCAGCAATATT [...]
+	'ARG_63_200001'            ---------------------------------------------------------------------------------------------------------TGTACAGAGATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAATATTTGCYATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCAGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTRATGCATATTTTTCRRTTCCTTTAGATGACTTCAGAAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCGATATT [...]
+	'CH134_200101'             CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCGCTGACAGAAGAAAAAAAAGCACTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAACCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTTTGGGAAGTTCAATTGGGAATACCACATCCCGCAGGGTTAAAAAARAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTCTCAGTTCCATTAGATGACTTTAGAAAGTACACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CH14_200101'              CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCACTAACAGAAATATGTACAGATATGGAAAAAGAAGGAAAAATCTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAATATTTGCTATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGATTTTTGGGAGGTTCAATTAGGAATACCACATCCTGCTGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGGGATGCATATTTCTCAGTTCCCTTAGATGATTTCAGGAAGTACACTGCATTCACCATACCTAGTGTCAACAATGAGACACCAGGGGTTAGGTACCAGTATAATGTGCTTCCACAGGGAGGGTCACCAGCAATATT [...]
+	'CH132_200101'             CCTATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAGGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTAGATGTGGGTGATGCATATTTTTCAGTTCCTTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAATAATGAAACACCAGGAATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CH130_200101'             CCTATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGYCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAGAGTTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGACTTCAGGGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTGCTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGAAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGRGTTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CH131_200101'             CCCATTAGCCCTATTGAAACTATACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTAACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAGAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCYATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAGAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCCTATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACAGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGGGGATCACCAGCAATATT [...]
+	'CH15_200101'              CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAACAGAAATATGTACAGAAATGGAAAAAGAAGGAAAAATCTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCTATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGATTTTTGGGAGGTTCAATTAGGAATACCACATCCTGCTGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGGGATGCATATTTCTCAGTTCCCTTGGATGATTTCAGGAAGTACACTGCATTCACCATACCTAGTGTCAACAATGAGACACCAGGGGTTAGGTACCAGTATAATGTGCTTCCACAGGGAGGGTCACCAGCAATATT [...]
+	'CH23_200101'              CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGATTTCTGGGAAGTTCAATTAGGAATACCACATCCAGCAGGGTTAAAAAAGAAAAAGTCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTARATGAATTCAGGAAGTATACTGCATTTACCATACCTAGCACAAACAATGAGACACCAGGGATTAGATATCAGTATAATGTGCTTCCACAGGGGGGATCACCAGCAATATT [...]
+	'CH25_200101'              CCCATCAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATCTGTACAGAGATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAACCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACCAAATGGAGGAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGATTTTTGGGAGGTTCAGTTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAGTCAGTAACAGTACTGGATGTGGGGGATGCATATTTTTCAGTTCCATTAGATGAATTCAGGAAGTACACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTCCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CH21_200101'              CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAGATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCTATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTGCTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGAAAGTATACTGCATTCACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CH16_200101'              CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCTATAAAGAAAAAAGATAGTACCAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAACAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTGACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGAAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CH166_200101'             CCCATCAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTAACAGAAGAAAAAAAAGCATTAATGGAGATCTGTACAGAGATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAGAATCCATACAATACTCCAGTATTTGCAATAAAGAAAAAGGACAGTACCAAATGGAGGAAATTAATGGATCTCAGAGAGCTTAATAAAAGAACTCAAGATTTTTGGGAGGTTCAGTTAGGAATACCGCATCCTGCAGGGTTAAAAAGGAAAAAGTCAGTAACAGTACTGGATGTGGGAGATGCATATTTTTCAATTCCATTAGATGAATTCAGGAAGTACACTGCATTCACCATACCTAGTACAAATAATGAGACACCAGGGATTAGATATCAGTACAATGTCCTTCCGCAGGGAGGATCACCAGCAATATT [...]
+	'CH13_200101'              CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGGATGGATGGCCCAAAAGTTAAACARTGGCCATTGACAGAAGAAAAAAAAGCATTAATAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAGATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAAYTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAATAACAATACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACTATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CH119_200101'             CCCATTAGTCCTATTGATACTATACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAGGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATAGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTTTGGGAAGTTCAATTAGGAATACCACATCCCGCGGGGTTAAAAAAGAAAAGATCAGTAACAGTACTGGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATGACTTCAGGAAGTACACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTACCACAGGGAGGATCACCAGCAATATT [...]
+	'CH12_200101'              CCTATCAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAGATCTGTACAGAGATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACCAAATGGAGGAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGATTTTTGGGAGGTTCAGTTAGGAATACCGCATCCTGCAGGGTTAAAAAAGAAAAAGTCAGTCACAGTACTGGATGTGGGGGATGCATATTTTTCAGTTCCATTAGATGAATTCAGGAAGTACACTGCATTTACAATACCTAGTATAAACAATGAGACGCCAGGGATTAGATATCAATACAATGTCCTTCCACAGGGAGGTTCACCAGCAATATT [...]
+	'CH118_200101'             CCCATTAGTCCTATTGAAACTGTRCCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAGTGGCCATTGACAGAAGAAAAAAAAGCATTAATAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAACAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAGTCAGTAACAGTACTAGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATGACTTCAGAAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTCCCACAGGGAGGATCACCAGCAATATT [...]
+	'CH115_200101'             CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCACTAATAGAGATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAGTGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCAGCAGGGTTAAAAAAGAAGAAATCAGTAACAGTACTAGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCWCCAGCAATATT [...]
+	'CH117_200101'             CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAARCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAATAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTGCAATTAGGGATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGATTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CH120_200101'             CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCGGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAATAGAAATTTGTACCGAAATGGAAAAAGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCTATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGACTTCAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCTCAGGATTAAAAAAGAAAAAGTCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGACGACTTTAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CH126_200101'             CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAACCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAGAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGACTTTAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGRCTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTACATGACTTTAGGAAGTATACTGCATTTACCATACCTAGTACAAACAACGAGACACCAGGGGTTAGATACCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CH128_200101'             CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTAAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAGAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTTAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTCCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTTCTGGATGTAGGTGATGCATATTTCTCAGTTCCCTTAGACGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATAAGATATCAATACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CH124_200101'             CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTATCAGAAATATGTACAGAAATGGAAAAAGAAGGAAAGATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGGAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGATTTTTGGGAGGTTCAATTAGGAATACCGCATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTAGATGTGGGGGATGCATATTTCTCAGTTCCCTTAGACGATTTCAGGAAGTACACTGCATTCACCATACCTAGTGTCAACAATGAGACACCAGGAGTTAGGTACCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CH122_200101'             CCCATCAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGACCAAAAGTTAAGCAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAGATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTGTTTGCCATAAAGAAAAAAGACAGTACCAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGATTTTTGGGAGGTTCAGTTAGGAATACCGCATCCTGCAGGGTTAAAAAAGAAAAAGTCAGTAACAGTACTGGATGTGGGGGATGCATATTTTTCAGTTCCATTAGATGAATTCAGGAAGTACACTGCATTCACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTCCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CH26_200101'              CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTAACAGAAGAGAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCTTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAKTATAAACAATGAGACGCCAGGAATTAGATATCAATACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CH53_200101'              CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAGATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAACAAGAGAACTCAAGATTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTAGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATGACTTCAGAAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTCCCRCAGGGAGGGTCACCAGCAATATT [...]
+	'CH54_200101'              CCCATTAGTCCTATTGARACTGTACCAGTAAAAAAACCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTGGAAATTTGTACAGAAATGGARAAGGAGGGRAAAATCTCAAAAATTGGGCCTGAAAATCCATATAATACWCCARTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGACTTTTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAARATCARTAACAGTGCTGGATGTGGGTGATGCATATTTTTCAATTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CH47_200101'              CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGGCCAAAAGTTAAACAATGGCCACTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGATAGTACTAAATGGAGAAAATTAGTGGATTTCAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCCAGCACAAACAATGAGACACCAGGGATTAGRTATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CH45_200101'              CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAGTGGCCATTGACAGAAGAGAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAGAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTGCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTATATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGCGCTTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCTGCAATATT [...]
+	'CH46_200101'              CCTATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAGAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAGATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATYCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAACTAGTAGATTTCAGAGAACTTAACAAGAGAACCCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGAAAATATACTGCATTTACCATACCTAGTKTAAACAATGAGACACCAGGGATTAGATACCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCTATATT [...]
+	'CH55_200101'              CCCATTAGTCCTATTGAAACTGTACCTGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAGGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGRAAAATTACAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCTATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAGAAATCAGTAACAGTACTGGATGTGGGAGATGCATATTTTTCAGTTCCCTTACATGACTTCAGGAAATACACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CH58_200101'              CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGGCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCTTACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAGATAGTAGATTTTAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTCTGAACAATGAGACACCAGGGACTAGATATCAGTACAATGTGCTTCCACAGGGAGGTTCACCAGCAATATT [...]
+	'CH59_200101'              CCCATAAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATCTGTACAGAAATGGAGAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAGAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGRGAACTTAACAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTATATGACTTCAGAAAGTATACTGCATTYACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTACTCCCACAGGGAGGATCACCAGCAATATT [...]
+	'CH57_200101'              CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAACCAGGAATGGATGGGCCAAAGGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCYGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTAGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTTAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CH56_200101'              CCCATTAGCCCTATTGAAACTGTACCAGTAAAGAAGCCAGGAATGGATGGCCCAAGAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAATATTTGCCATAAAGAAAAAAGAYGGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACACCCCGCAGGGTTAAGAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATGAGTTCAGGAAGTATACAGCATTCACCATACCTAGTACAAACAATGAGACACCAGGAATTAGATATCAGTACAATGTGCTGCCACAGGGAGGATCACCAGCAATATT [...]
+	'CH44_200101'              CCTATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTAACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTACAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGGATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTTCTGGATGTGGGTGATGCATATTTTTCGGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACTATACCCAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTCCCACAGGGAGGATCACCAGCAATATT [...]
+	'CH32_200101'              CCCATTAGTCCTATTGAAACTGTACCGGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTGGTAGAAATCTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAGAAAGAAAAAATCAGTAACAGTGCTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTCTAAACAACGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CH33_200101'              CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCGAAAGTTAAACAATGGCCATTAACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAGATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCTATAAAGAAAAAAGACAGTACTAAGTGGAGAAAATTAGTAGATTTCAGAGAACTTAACAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATGACTTCAGAAAGTATACTGCATTTACCATACCTAGTATAAACAATGCGACACCAGGGATTAGATACCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCTATATT [...]
+	'CH30_200201'              CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGTCCAAAAATTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAATAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAACCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTGGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAGATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCTTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CH27_200101'              CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGACCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACCAAATGGAGAAAATTAGTAGACTTCAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAAYTAGGAATACCACATCCTGCAGGTTTAAAAAAGAAAAAGTCAATAACAGTAYTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTTAGGAAGTATACTGCATTCACYATACCTAGTATAAACAATGAGACACCAGGGGTTAGATATCAATACAATGTGCTTCCACAAGGAGGGTCACCAGCAGTATT [...]
+	'CH28_200101'              CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAGAGTTAAACAATGGCCATTGACAGAAGARAAAAAAGCATTAACAGAAATTTGTACAGAATTGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAATATTTGCMATAAAGAAGAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAGGTTCAATTAGGAATACCACATCCCGCTGGGTTAAAAAAGAAAAAATCAGTGACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTCCCACAGGGAGGATCACCAGCAATATT [...]
+	'CH34_200101'              CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAATAGAAATTTGCACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACACAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAGAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGGGGATCACCAGCAATATT [...]
+	'CH40_200101'              CCTATTAGCCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAGAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTAGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGCGAYACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CH42_200101'              CCCATTAGTCCTATTGAAACTGTACCAGTAAARAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCTATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAGAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCTCTAGATAACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACGCCAGGAATTAGATATCAGTAYAATGTGCTTCCACAGGGRGGATCACCAGCAATATT [...]
+	'CH38_200101'              CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACCAAATGGAGAAAATTAGTAGACTTCAGAGAACTTAATAAAAGAACTCAAGATTTCTGGGAAGTTCAATTAGGAATCCCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTARATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CH37_200101'              CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAAAAGATATATGTACAGAAATGGAAAAAGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAGATGGAGGAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGAGTTTTGGGAGGTCCAATTAGGAATACCGCATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGGGATGCATATTTTTCAGTCCCCTTAGATGATTTCAGGAAGTACACTGCATTCACCATACCTAGTTGCAACAATGAGACACCAGGAATTAGGTACCAGTATAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CH113_200101'             CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTAACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAGATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTYTGGGAAGTTCAATTAGGAATACCACACCCTGCAGGGTTAAAAAAGAAAAGATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAARTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGGTGAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CH69_200101'              CCCATTAGTCCTATTGAAACTGTACCCGTAAAAACGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAACAGAAATATGTACAGACATGAAAAAAGAAGGAAAAATTTCAAAAATTGGACCTGAAAATCCATACAATACTCCAATATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGGAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGATTTTTGGGAAGTTCAATTAGGAATACCGCACCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTAGATGTGGGGGATGCATATTTTTCAGTCCCCTTAGATGAGTTCAGGAAGTACACTGCATTCACCATACCTAGTGTCAACAATGAGACACCAGGAATTAGGTACCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CH7_200101'               CCCATTAGTCCTATTGAAACTGTGCCAGTGAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAGCAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGACCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGACTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAGTTAGGAATACCACATCCTGCAGGGTTAAAACAGAAAAGATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTRCAAACAATGAAACACCAGGGACTAGATACCAGTACAATGTACTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CH68_200101'              CCCATTAGTCCTATTGATACTATACCAGTAAAAAAGCCAGGGATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAACAGAAATTTGTTCAGAAATGGAAAAGGAAGGAAAAATTTCAAGAATTGGGCCTGACAATCCATACAATACTCCAGTCTTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACRCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTTCTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAATATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTGCCACAGGGAGGATCACCAGCAATATT [...]
+	'CH66_200101'              CCCATCAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGATAGTACTAAATGGAGAAAATTAGTAGACTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTGCTGGATGTGGGTGATGCATATTTTTCAGTYCCCTTRGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGCATAAACAACGAAACACCAGGGGTTAGATATCAGTATAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CH67_200101'              CCCATTAGCCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAGAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGACTTCAGGGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGACGACTTTAGGAAGTATACTGCATTTACTATACCTAGTCTGAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGGTCACCAGCCATATT [...]
+	'CH71_200101'              CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAGATGGAAAAGGAAGGGAAAATTTCAAGAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTTAGGGAACTTAACAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAGAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGATTTCAGAAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGGCACCAGGGATTAGATACCAGTACAATGTGCTGCCACAGGGAGGGTCACCAGCAATATT [...]
+	'CH8_200101'               CCCATCAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAGATCTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGATAGTACCAAATGGAGGAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGATTTTTGGGAGGTTCAATTAGGAATACCGCATCCTGCAGGGTTAAAAAAGAAAAAGTCAGTAACAGTACTGGATGTGGGGGATGCATATTTTTCAGTTCCATTAGATGAATTCAGGAAGTACACTGCATTCACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTCCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CH80_200101'              CCCATCAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGGAGAAAAAAAAGCATTAATAGAAATTTGTACAGAGATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACCAAATGGAGGAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGATTTTTGGGAGGTTCAGTTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAGTCAGTAACAGTACTGGATGTGGGGGATGCATATTTTTCAGTTCCATTAGATGAATTCAGGAAGTACACTGCATTCACCATACCTAGTACAAACAATGAGACACCAGGGGTTAGATATCAGTACAATGTCCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CH78_200101'              CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGACTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGGGATGCATATTTTTCAGTTCCATTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CH77_200101'              CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAGAGCATTAATRGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAGAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAGACTCAAGACTTCTGGGAAGTCCAATTAGGAATACCACATCCCGCAGGGTTGAAAAAGAAAAAATCAGTAACAGTGCTAGATGTGGGTGATGCATATTTTTCAGTTCCMTTAGATGACTTCAGGAAGTATACAGCATTTACTATACCTAGTATAAACAATGAAACTCCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CH64_200101'              CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAGGGTCAAACAATGGCCATTGACAGAAGAAAAAAAAGCCTTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAATATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGACTTTTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGCTAAAAAAGAAAAAATCAGTAACAGTACTAGATGTGGGTGATGCATATTTTTCAGTTCCTTTACATGACTTTAGAAAGTATACTGCATTTACCATACCTAGTATAAACAATGAAACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_5104_200501'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAGGTCAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTTAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAGAAGAAAAAATCAGTGACAGTACTGGATGTGGGYGATGCATATTTTTCGGTCCCCTTAGATGATTTCAGGAAGTACACTGCATTCACCATACCTAGTGTCAACAATGAGACACCAGGAATAAGGTACCAGTACAATGTGCTCCCACAGGGAGGGTCACCAGCAATATT [...]
+	'CCB_5099_200501'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAGTGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGGAAATTAGTAGATTTCAGGGAACTTAATAAAAGAACTCAAGATTTTTGGGAGGTTCAGTTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAGAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTGKATGAMTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGAATTAGATATCAGTACAATGTGCTTCCACAGGGCGGATCACCAGCCATATT [...]
+	'CCB_5126_200501'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAGAAGCCAGGAATGGATGGCCCAAGAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGARATGGAAAGGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTCCAATTAGGAATACCACATCCCGCGGGGTTAAAAAAGAAAAAATCAGTGACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGAACTAGATATCAGTACAATGTGCTCCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_5152_200501'          CCCATCAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGYACAGAAATGGAAAAGGAAGGAAAAATTTCAAGAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGGACTCAAGACTTCTGGGAAGTCCAATTAGGAATACCACATCCTGCAGGATTAAAAAAGAAAAAATCAGTAACAGTATTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACTATACCTAGTATAAACAATGAGACGCCAGGGGTTAGATATCAATACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_5130_200501'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAGAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCTATAAAGAAAAAGGACWGTACCAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGATTTTTGGGAGGTTCAATTAGGGATACCGCATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATGACTTTAGGAAGTACACTGCATTCACCATACCTAGTGTCAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAAGGAGGATCACCAGCAATATT [...]
+	'CCB_5089_200501'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGACGGTCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAARATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTRTTTGCTATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGGGAACTTAATAAGAGAACTCAAGATTTCTGGGAAGTTCAACTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAATATACTGCATTCACCATACCTAGTACAAACAATGAAACACCAGGGATTAGATACCAGTACAATGTGCTCCCACAGGGAGGATCACCAGCAATATT [...]
+	'CA9656_200104'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGGCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAACCCATACAATACTCCAGTATTTGCAATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAGAAGAAAAAATCAGTAACAGTACTAGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATGATTTCAGAAAGTATACTGCATTTACCATACCTAGTGTAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CH62_200101'              CCCATTAGCCCTATTGAAACTGTGCCAGTAAAAAAGCCCGGAATGGATGGGCCAAAAGTTAAACAATGGCCCTTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAACTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGATTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAGAAGAAAAAATCAGTAACAGTATTGGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTACTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_5045_200501'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCCAAAATTGGGCCTGAAAATCCATATAATACTCCAGTCTTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATCCCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTATATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAAACACCAGGGATTAGATACCAGTACAATGTGCTCCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_5061_200501'          CCCATTAGTCCTATTGAAACTGTACCAGTAAGGAAACCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGACGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATAGGGCCTGAAAATCCATACAATACTCCAGTGTTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTTAGAGAACTTAATAAGAGAACTCAAGACTTTTGGGAAGTTCAATTAGGAATACCACACCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTAGATGTGGGTGATGCATATTTCTCAGTTCCCTTACATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAAACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CH81_200101'              CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCTATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAGGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAGAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTATATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCGCCAGCAATATT [...]
+	'CCB_1000_200501'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAGAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAAGAAGGAAAAATTTCAAGAGTTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAGTTAGGAATACCACATCCCGCGGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGAGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTACACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_06_200501'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTAAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGACATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTGAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCTCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTACATGACTTCAGGAAATATACTGCATTTACCATACCTAGTAGAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_1001_200501'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCTTTGGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAACCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGGACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCTCAGGGTTAAAAAAGAAAAAGTCAGTAACAGTACTGGATGTGGGTGATGCATATTTCTCAGTTCCTTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCGGGGATTAGATATCAGTACAATGTGCTCCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_1033_200501'          CCCATAAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAGATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCTATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTTAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTCCAATTAGGAATACCACATCCCGCAGGATTAAAGAAGAAAAAATCAGTGACAGTACTGGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_1032_200501'          CCCATTAGTCCTATTGAAACTGTACCTGTAAAAAAGCCAGGAATGGATGGCCCAAGAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAGACTCAGGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAACAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTATATGACTTCAGGAAGTAYACTGCATTTACYATACCTAGTATAAACAATGMGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'BRC1556_200208'           CCCATTAGTCCTATTGAGACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTGGATTTCAGGGAACTTAACAAGAGAACTCAAGACTTCTGGGAGGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCATTATATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGAGTTAGATATCAGTATAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'BRC1549_200208'           CCTATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGTATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAATGGAGATTTGTGCAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAGTGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAGACGCAAGACTTTTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CP_Pat8_199712'           CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATCTGTACAGAAATGGAAAARGAAGGGAAAATTTCAAAAATTGGGCCTGARAATCCATATAATACACCAGTATTTGCCATAAAGAAGAAAGACAGTACTAARTGGAGAAAATTAGTAGATTTCAGAGAACTTAATAARAGAACTCAGGACTTCTGGGAAGTGCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CA9947_200104'            CCCATTAGTCCTATTGATACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTRCAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGARAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAGACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGGGATGCATATTTTTCAGTTCCATTAGACGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAATACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'BRC1553_200208'           CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCGAAAGTTAAGCAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTGCAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAACCCATACAATACTCCAGTATTTGTCATAAAGAAAAAAGACAGTACTAAATGGAGAAAGTTAGTAGATTTCAGAGAGCTTAACAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAGAAGAAAAAATCAGTAACAGTACTGGATGTAGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTCACCATACCTAGTACCAACAATGAGACACCAGGGATTAGGTATCAGTATAATGTGCTTCCACAGGGTGGATCACCAGCAATATT [...]
+	'DB_SI1321_04_200401'      ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAAGAAGGGAAGATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAATATTTGCCATAAAAAAGAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTCCCCTTAGATAACTTTAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGAAACCAGGGGTTAGATATCAGTACAATGTGCTCCCACAGGGAGGATCACCAGCAATATT [...]
+	'DB_SI2663_04_200401'      ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAGGAAGGAAAGATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCAATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAATTCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTGGATGACTTCAGGAAGTACACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGAATTAGATATCAGTACAATGTACTTCCACAGGGAGGGTCACCAGCAATATT [...]
+	'DB_SI2704_00_200001'      ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAGGAGGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGTCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGACTTTAGGGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAGAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAATACAATGTGCTTCCACAGGGAGGATCACCAGCGATATT [...]
+	'DB_SI2394_04_200401'      ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTTTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTAGGTGATGCATATTTTTCAGTTCCCTTAGATAACTTCAGGAAATATACTGCATTTACCATCCCTAGTATGAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTCCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_1104_200501'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGTCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTAACAGAAGAAAAAAAGGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAATATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGAYTTCTGGGAAGTTCAATTAGGAATACCACATCCCKCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATGACTTTAGGAAGTATACTGCATTTACCATACCCAGTATAAACAATGAGACACCAGGGGTTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_1132_200501'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGACCAAGAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTGGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAACAGAAAAATTCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGTATTAGATATCAGTACAATGTGCTTCCACARGGAGGATCACCMGCAATATT [...]
+	'CCB_1134_200501'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATCTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTRCTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAATACAATGTGCTTCCACAGGGAGGATCGCCAGCAATATT [...]
+	'CCB_1137_200501'          CCCATTAGTCCTATTGAAACTGTRCCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATATGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAGAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAGTTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTGCTGGATGTGGGTGATGCATATTTYTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCARTACAATGTGCTTCCACAGGGAGGATCACCATCAATATT [...]
+	'DB_SI3927_04_200401'      ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAAGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAATATTTGCCATAAAAAAGAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTRGGTGATGCATATTTTTCAGTCCCCTTAGATAACTTTAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGAAACCAGGGGTTAGATATCAGTACAATGTGCTCCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_1173_200501'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAGATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCCGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTATTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGGTATCAGTACAATGTGCTCCCACAGGGAGGTTCACCAACAATATT [...]
+	'CCB_1238_200501'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAACCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAGCTTAATAAGAGAACTCAAGACTTYTGGGAAGTTCAATTAGGAATACCACATCCAGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCCCAGGGAGGATCACCAGCAATWTT [...]
+	'CCB_1240_200501'          CCCATTAGTCCTATTGAAACAGTACCAGTAAAAAAGCCAGGAATGGATGGGCCAAAAGTTAAACAATGGCCATTGACAGAAGAGAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTTTGGGAAGTTCAATTAGGAATACCACACCCTGCAGGGTTGAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGGGATGCATATTTTTCAGTCCCCTTAGATAACTTCAGGAAGTACACTGCATTTACCATACCTAGCATAAACAATGAGACACCAGGGACTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_1203_200501'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATCTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATAGGGCCTGAAAACCCATATAATACTCCAGTATTTGCCATAAAGAAAAAGGATAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAACAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAAAAAAAATCAGTAACAGTACTAGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTCACCATACCTAGTATGAACAATGAGACACCAGGAATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_1207_200501'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGACGGCCCAAGAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCCGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGATAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGGATACCACATCCCGCAGGGTTAAAGAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAAACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCMATATT [...]
+	'CCB_1135_200501'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACMATGGCCATTGACAGAAGAAAAAAAAGCATTAACAGAAATTTGTACMGAAATGGAAAAGGAAGGAAAAATTTCAAGAATTGGGCCTGAAAATCCATACAATACTCCAATATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGATTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCTTTGGATRACTTYAGGAAGTATACTGCATTTACYATACCTAGTACAAACAATGAGACGCCAGGGGTTAGATATCAGTATAATGTGCTTCCTCAGGGAGGATCACCAGCAATATT [...]
+	'BRC1558_200208'           CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAGAAAAAAGCATTAGTARAAATTTGTACAGAGATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTGTTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGRAAATTAGTAGATTTCAGAGAGCTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_1136_200501'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCCTTTGTTGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAGTTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGATTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGAAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'BRC1559_200208'           CCCATAAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGCACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAACCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGCTAAAAAAGAAAAAATCAGTAACAGTATTGGATGTGGGTGATGCATACTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCCAGTACAAACAATGAAACACCAGGAACTAGATATCAGTACAATGTGCTCCCACAAGGAGGATCACCAGCAATATT [...]
+	'DB_SI1329_04_200401'      ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCTATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTTAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCCTTTACTATMCCTAGTATAAACAATGAGACACCAGGGACTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'DB_SI1339_04_200401'      ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAAGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAATATTTGCCATAAAAAAGAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTCCCCTTAGATAACTTTAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGAAACCAGGGGTTAGATATCAGTACAATGTGCTCCCACAGGGAGGATCACCAGCAATATT [...]
+	'DB_SI156_04_200401'       ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAAGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAATATTTGCCATAAAAAAGAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTCCCCTTAGATAACTTTAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGAAACCAGGGGTTAGATATCAGTACAATGTGCTCCCACAGGGAGGATCACCAGCAATATT [...]
+	'DB_SI1661_04_200401'      ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAACACTCCAGTATTTGCCATAAAGAAAAAAGATAGTACCAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAGAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGRAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGGTACCAGGAATTAGATATCAGTACAACGTGCTGCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_1064_200501'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAGGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAARAAAGACAGTACTAAATGGAGAAAATTAGTAGACTTCAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCYTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAACGAGACACCAGGGACTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_1065_200501'          CCCATTAGTCCTATTGATACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATCTGTACAGAGATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAAAAGAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTTAGAGAACTGAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAGTCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTACCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGGTATCAGTACAACGTGCTGCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_1067_200501'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAGAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAGGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAACACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAACTAGTAGATTTTAGAGAACTTAATAAGAGAACTCAAGACTTTTGGGAAGTTCAATTAGGAATACCACACCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGACGTGGGGGATGCATATTTTTCAGTTCCCTTATATGACTTCAGGAAGTATACTGCATTTACCATACCCAGTATAAATAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTGCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_1070_200501'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCGTTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCYATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTGGATTTCAGAGAACTTAATAAAAGAACTCAAGACTTYTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTGACAGTACTAGATGTGGGYGATGCATATTTTTCAGTTCCCTTAGATGACTTTAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGGTTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_1071_200501'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAAGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCGGTGTTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTYAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCRCATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTAGGTGATGCATACTTTTCAGTTCCCTTAGATGATTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAATAATGAGACACCAGGGAYTAGATATCAGTACAATGTGCTCCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_1103_200501'          CCCATTAGCCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACARTGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAGATTTCAAAAATTGGGCCTGAAAATCCCTACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGACTTCAGRGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTACATAGCTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCGGGGATTAGATATCAGTACAATGTACTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CH82_200101'              CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAATATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAGTTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGGATACCACATCCCGCAGGGTTAAAAAAGAGAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATAATTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGACTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CH83_200101'              CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGASATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAACAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTYTCAGTTCCCTTATATGACTTCAGRAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATACCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CH85_200101'              CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAATAGAAATTTGTGCAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAATATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTTAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAATTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAGAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAATTCCCTTAGATAATTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGCAATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CH87_200101'              CCCATCAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAGATCTGTACAGAGATGGAAAAAGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCTATAAAGAAAAAAGATAGTACCAAATGGAGGAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGATTTTTGGGAGGTTCAATTAGGAATACCGCATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGGGATGCATATTTTTCAGTTCCATTAGATGAATTCAGGAAGTACACGGCGTTCACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTCCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CH89_200101'              CCCATTAGTCCTATTGAAACTGTACCTGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAATAGAAATTTGTACAGAGATGGAAAAGGAAGGGAAGATTTCAAAAATAGGGCCTGARAATCCATACAATACTCCAGTATTTGCCATAAAAAAGAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAACAAGAGAACTCAAGATTTCTGGGAAGTACAATTAGGAATACCACATCCCGCAGGGTTAAAAAGGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCTCTAGATGAATTCAGAAAGTATACTGCATTTACCATACCYAGTACAAACAATGAGGCACCAGGGATTAGATATCAGTATAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CH9_200101'               CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTCTTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGGATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAACGAGACACCAGGGGTTAGATATCAGTACAATGTACTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CH90_200101'              CCCATTAGTCCTATTGAAACTGTACCAGTAAARAAGCCAGGAATGGATGGCCCAAAAGTTAAACAGTGGCCATTGACAGAAGAAAAAAAAGCATTAACAGAAATTTGTGCAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGACCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGACTTCAGGGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGGGATGCATATTTTTCAGTTCCCTTAGATGACTTTAGGAAGTATACTGCATTTACCATACCTAGTATAAACAACGAGACACCAGGGGTTAGATATCAGTACAATGTACTTCCACAGGGCGGATCACCAGCAATATT [...]
+	'CH92_200101'              CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGARATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGACTTCAGAGAACTTAATAAGAGAACTCAAGATTTCTGGGAAGTTCAATTAGGRATACCACATCCCGCAGGGTTAAAAARGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCCAGTACWAACAATGAGACACCAGGRGTTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CH93_200101'              CCTATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAATGGAAATTTGTACAGAGATGGAAAAGGAAGGANAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTTAGAGAACTTAACAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCTTTAGATGACTTCAGAAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGAATTAGATACCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CH94_200101'              CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAGATGGAAAAGGAAGGGAAAATTTCAAAAATCGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAARGACAGTACTAAGTGGAGAAAATTAGTAGATTTCAGAGAACTTAACAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAGTCAGTAACAGTACTAGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATGACTTCAGAAAATATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATACCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCTATATT [...]
+	'CH95_200101'              CCCATTAGTCCTATTGAAACTGTACCAGTGAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAAAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCTATAAAGAAAAAAGACAGTACTAAATGGAGAAAGTTATTAGACTTCAGGGAACTTAATAAGAGAACTCAAGAGTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAGAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTGCTATAAACAATGAGACACCAGGGGTCAGGTATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CH96_200101'              CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAGGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAATAGAAATTTGTACCGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACCCCAATATTTGCTATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGACTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTGCTGGATGTGGGTGATGCATATTTTTCAGCTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACTCCAGGGATTAGGTATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CH97_200101'              CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAGGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGATTAAAAAAGAAAAAATCAGTAACAGTACTAGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTTAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGGTATCAGTACAATGTGCTTCCACAGGGAGGATCACCATCAATATT [...]
+	'CHB168_200301'            CCCATTAGTACTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAATAGAAATTTGYACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCAATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTYTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAARAAGAAAAARTCAGTAACAGTACTGGATGTGGGGGATGCATACTTTTCAGTTCCCTTAGATGACTTTAGAAAGTATACTGCATTTACCATACCTAGTGTAAACAATGCGACACCAGGGATTAGGTATCAGTACAATGTACTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CA9897_200105'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGGATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGCACAGAAATGGAAAAGGAAGGRAAAATTTCAAAAATTGGGCCTGAGAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGARCTTAATAAGAAAACTCAAGACTTCTGGGAAGTCCAATTAGGAATACCACAYCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATRTRGGTGATGCATATTTTTCAGTYCCCCTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTATAAATAATGAGACACCGGGGATTAGATATCAGTACAATGTGCTTCCACAAGGAGGATCACCAGCAATATT [...]
+	'CA9924_200104'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCYATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTTTGGGAAGTTCAACTAGGAATACCACATCCCTCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATARCTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGRATTAGRTATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CP_Pat10_199712'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTAACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAGATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCAGCAGGGTTAAAAAGGAAGAAATCAGTAACAGTATTGGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAATACAATGTGCTGCCACAGGGTGGATCACCAGCAATATT [...]
+	'CP_Pat11_199712'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGCATGGATGGCCCAAGAGTTAAACAATGGCCATTGACAGAAGAAAAAGAAGCATTAGTAGAAATCTGTACAGAAATGGAGAAGGAAGGGAAAATTKCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAGTGGAGAAAATTGGTAGATTTCAGAGAGCTTAATAMAAGAACTCAAGACTTCTGGGAGGTCCAATTAGGAATACCACATCCCTCAGGGTTAAGAAAGAAAAAATCAATATCARTACTAGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGAATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CP_Pat15_199712'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAGAAAAGGGCATTAGTAGAAATTTGTACAGAGATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCAGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCTTTAGATGACTTCAGGAAGTACACTGCATTTACCATACCTAGTATAAACAATGAGACGCCAGGGATTAGGTATCAATACAATGTGCTTCCGCAGGGAGGATCACCAGCAATATT [...]
+	'CP_Pat2_199712'           CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATCTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAACCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTGAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCMTATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGGTTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CP_Pat4_199712'           CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAARAAAGAYAGTACTAAATGGAGAAAATTAGTAGATTTCAGGGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAGTTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CP_Pat7_199712'           CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCMTTAGTAGAAATCTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGATTTCTGGGAAGTTCARTTAGGAATACCACATCCGGCAGGGTTAAAAAGGAAAAAATCAGTACCAGTCYTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTACAAAYAATGAGACACCAGGGATTAGATATCAGTACAATGTRCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CH112_200101'             CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGACCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGGACTCAAGACTTCTGGGAGGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAGAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTATATGAGTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CH111_200101'             CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAGATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAGTGGAGAAAATTAGTAGATTTTAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAGGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTACACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGACTAGATATCAGTACAATGTGCTTCCACAAGGAGGATCACCAGCAATATT [...]
+	'CH110_200101'             CCAATTAGTCCCATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATCTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTTAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAGTTAGGAATACCACATCCCGCAGGGTTAAAGAAGAAAAAATCAGTAACAGTACTGGATGTGGGGGATGCATATTTTTCAGTTCCATTAGATGATTTCAGGAAGTATACTGCATTTACCATACCCAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CH11_200101'              CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAACCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTARTGGAAATTTGTACAGAAATGGAAAAGGAGGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAATATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAGATCAGTAACAGTRCTGGATGTGGGTGATGCATATTTTTCAATTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CH109_200101'             CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAGCAATGGCCATTGACAGAAGAAAAAAAAGCATTAACAGAAATATGTACAGAAATGGAAAAAGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACCCCGATATTTGCCATAAAGAAAAAAGACAGCACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGATTTTTGGGAGGTTCAATTAGGAATACCGCATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGGGATGCATATTTTTCAGTCCCCTTAGATGCTTTCAGGAAGTACACTGCATTCACAATACCTAGTGTCAACAATGAGACACCAGGAGTTAGATACCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CH107_200101'             CCCATTAGTCCTATTGAGACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAGAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTGCTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACAGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CH106_200101'             CCTATCAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAGATCTGTACAGAGATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACCAAATGGAGGAAATTAGTAGGTTTCAGAGAACTTAATAAAAGAACTCAAGATTTTTGGGAGGTTCAGTTAGGAATACCGCATCCTGCAGGGTTAAAAAAGAAAAAGTCAGTCACAGTACTGGATGTGGGGGATGCATATTTTTCAGTTCCATTAGATGAATTCAGGAAGTACACTGCATTTACAATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAATACAATGTCCTTCCACAGGGGGGTTCACCAGCAATATT [...]
+	'CH104_200101'             CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTARACAATGGCCATTGACAGAGGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTRTTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAACAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTAGATGTGGGTGATGCTTATTTYTCAGTTCCCTTAGATRACTTCAGGAAGTATACTGCATTTACCATACCTAGTGTAAAYAATGAAACACCAGGGATTAGATAYCAGTACAATGTGCTKCCACAGGGAGGATCACCAGCAATATT [...]
+	'CH103_200101'             CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGCACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCTCATCCAGCAGGGTTAAAAARGAAAAGATCAATAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAGTTCAGGAAGTACACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCCCAAGGAGGATCACCAGCAATATT [...]
+	'CH102_200101'             CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTGCAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAACCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGGATACCACATCCCGCAGGATTAAAAAAGAAAAAATCAGTAACAGTTCTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTACACTGCATTTACCATACCTAGTATAAACAATGAAACACCAGGGGTTAGATATCAGTACAATGTACTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CH1_200101'               CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGGCCAAAGGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCTCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTAGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATGACTTTAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTACTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_999_200501'           CCTATCAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAACCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGAYAGTACTAAATGGAGAAAATTAGTAGATTTYAGAGAGCTTAATAAAAGAACTCAAGACTTCTGGGAAGTCCAATTAGGAATACCACATCCYGCAGGATTAAAAAAGAAAAAATCAGTACCAGTGCTGGATGTGGGTGATGCATATTTTTCAGTTCCYTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGGTTAGATATCAGTAYAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_969_200501'           CCTATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAGATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTGGATTTTAGAGAACTTAATAAGAGGACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTTCAGGGTTAAAAAAGAAAAAATCAGTAACAGTGCTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGACGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_95_200501'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTGGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACCAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATAYTTTTCAGTTCCCTTAGATAACTTCAGGAAGTATACKGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGGTTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_922_200501'           CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAATAGAGATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGACCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGATAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGGACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTAGATGTGGGTGATGCATATTTTTCAGTTCCCTTARATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTCTAAACAATGAAACACCAGGGATTAGRTATTGTTACAATGTGCTTCCACAAGGAGGATCACCAGCAATATT [...]
+	'CCB_886_200501'           CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTRTTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTGGTGGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTYAGGAAATATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATCAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_881_200501'           CCCATTAGTCCTATTGAGACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAGGTTAAACAATGGCCWTTGACAGAAGAAAAAAAAGCATTAACAGAGATTTGTAYRGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTAGATGTGGGAGATGCATATTTCTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTCACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_86_200501'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAGAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAACCCATACAATACTCCAGTATTTGCCATAAGGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAGCTTAATAAGAGAACTCAAGACTTTTGGGAAGTGCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAATTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACTATACCTAGTACAAACAATGAGACACCAGGTATTAGATATCAGTATAATGTGCTTCCACAAGGAGGATCACCAGCAATATT [...]
+	'CCB_802_200501'           CCAATTAGTCCTATTAAAACTGTAACAGTAAAAAAGCCAGGAATGGATGGTCCAAAGGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAACAGAAATATGTAGAGAAATGGAAAAAGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAATATTTGCCATAAAGAAAAAAGACAGTACTAAGTGGAGGAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGATTTTTGGGAGGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAGTCAGTGACAGTACTGGATGTGGGAGATGCGTATTTTTCAATTCCCTTAGATGATTTCAGGAAGTACACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_763_200501'           CCCATAAGTCCTATTGAAACTGTACCAGTAAAAAAACCAGGTATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCMTTAGTAGAAATTTGTACAGAAATGGARAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAAYACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAGCTTAATAAGAGAACTCAAGACTTCTGGGARGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTAGGTGATGCATATTTTTCAGTTCCCTTACATGACTTCAGGAARTATACTGCATTCACCATACCTAGTACWAATAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTCCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_751_200501'           CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTAACAGAAGAAAAAAAAGCTTTAGTAGAAATTTGTACAGAAATGAAAAAGGAAGGAAAGATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGAAATACCACATCCCGCAGGGTTAAGACAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCCAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_733_200501'           CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAGAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGYACTAAATGGAGGAAATTAGTAGATTTTAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTCCAATTAGGAATACCACATCCCGCGGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTRCCCYTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_72_200501'            CCCATTAGTCCTATTGRAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGCACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGACTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAGGTTCAATTAGGAATACCACATCCCTCAGGGTTAAACAAGAAGAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTCTCAGTTCCATTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGCGACACCAGGGGTTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_623_200501'           CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAGAAATCAGTAACAGTACTAGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTACACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGGTACCAGTACAATGTGCTCCCTCAGGGAGGATCACCAGCAATATT [...]
+	'CCB_62_200501'            CCCATTAGTCCTATTGATACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCTTTAATAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAGATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAAACTTCTGTGAAATTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGRATGTGGGCRATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAATATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTCCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_550_200501'           CCCATTAGCCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCCTACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGACTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTACATAGCTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCGGGGATTAGATATCAGTACAATGTACTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_5427_200501'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAACCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACGGAAAAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGATAGTACTAAATGGAGAAAATTAGTGGATTTCAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTGACAGTATTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTTAGGAAATATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGAATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_5418_200501'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCCGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGACTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAGAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAAACACCAGGGATTAGGTATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_5384_200501'          CCCATYAGTCCTATTGAAACTGTACCAGTAAAAAAACCAGGAATGGATGGCCCAAGAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCGCTAAYAGAAATCTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCTTTAGATGATTTCAGGAAGTATACTGCATTTACCATACCAAGTAGAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_5383_200501'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGACGGTCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAGATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCTATAAAGAAAAAGGACAGTACCAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGATTTCTGGGAAGTTCAATTAGGAATACCACACCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTCTCAGTTCCCTTGGATGACTTCAGAAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATACCAGTACAATGTGCTCCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_5362_200501'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAGTGGCCACTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAAGAAGGAAAGATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGGGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAACTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATAACTTCAGAAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGGTTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_5318_200501'          CCCATTAGTCCTATTGAAACTGTGCCAGTAAAAAAGCCAGGAATGGATGGCCCAAGAGTTAAACAATGGCCACTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGGAAATTAGTAGACTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTRGATGTAGGTGATGCATACTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGAATTAGATATCAGTACAATGTGCTTCCACAAGGAGGATCGCCAGCAATATT [...]
+	'CCB_5314_200501'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCTGGAATGGATGGGCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTATTAGAAATTTGTACAGAAATGGAGAAGGAAGGAAAAATTACAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGATAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGGATACCACATCCCGCAGGGTTAAAGAAGAAAAAATCAGTAACAGTACTRGATGTAGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACYATACCTAGTATAAACAATGAAACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_5310_200501'          CCAATTAGTCCTATYGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAKTAGAAATCTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTRTTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTTAGAGAACTCAATAAGAAAACTCAAGACTTCTGGGARGTTCAATTAGGAATACCACATCCYGCAGGGTTAAAGAAGAAAAAATCAGTAACAGTACTGGATGTGGGGGATGCATATTTTTCAGTTCCCTTAGATGATTTTAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCWCARGGAGGATCACCAGCAATATT [...]
+	'CCB_5298_200501'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAACCAGGAATGGATGGCCCAAGAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCCTACAATACTCCAATATTTGCTATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAGGTTCAATTAGGAATACCCCATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGACGCATATTTTTCAGTTCCCTTARATGACTTCAGGAAGTATACTGCATTTACCATACCCAGTACAAACAATGAGACACCAGGGACTARATATCARTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_5287_200501'          CCCATTAGTCCYATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAARGTTAAACAATGGCCATTGACAGAAGAAAARAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAAYCCATACAATACTCCAGTGTTTGCYATAAAGAAAAAAGACAGTACTAAATGGAGAAARTTAGTAGATTTTAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTKCARTTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGACGACTTCAGGAAGTAYACTGCATTTACCATACCTAGTAYAAACAATGAAACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_5254_200501'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAGGTTAAACAGTGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTACAAAAATTGGGCCTGAAAATCCATACAATACCCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTATATGACTTCAGGAAGTACACTGCATTTACTATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_5251_200501'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACACCCTGCAGGGTTGAAAAAGAAAAAATCAGTAACAGTACTAGATGTAGGTGATGCATATTTCTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTAYAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_5234_200501'          CCCATAAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAARAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAAYTRGTAGATTTCAGAGAACTTAATAAGAGAACCCAGGACTTCTGGGAAGTCCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAGAAAGTCAGTAACAGTATTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTACACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_5219_200501'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAGAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCTATAAGGAAAAAAGACAGTACTAAATGGAGGAAATTAGTAGACTTCAGAGAACTCAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTAGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_5198_200501'          CCTATTAGTCCTATTGAAACTGTACCAGTAAAAAAACCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAGGCATTAATAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAGATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGATGGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAGCTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGGATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_5181_200501'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTCCAATTAGGAATACCACATCCCGCAGGATTAAAGAAAAAGAAATCAGTAACAGTACTAGATGTGGGGGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAATAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGGTCACCAGCAATATT [...]
+	'CCB_518_200501'           CCCATTAGTCCTATTGACACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATCTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAACTAGTAGATTTCAGAGAACTTAATAAGAGAACCCAAGACTTTTGGGAAGTTCAACTAGGAATACCACATCCCKCAGGGTTAAAACAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGAAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAATACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_5158_200501'          CCCATCAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAGAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGGACTCAAGACTTCTGGGAAGTCCAATTAGGAATACCACATCCTGCAGGATTAAAAAAGAAAAAATCAGTAACAGTATTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACTATACCTAGTATAAACAATGAGACGCCAGGGGTTAGATATCAATACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'ARG_64_200001'            ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAACACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAACAGGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTATTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAATATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGGTTAGATATCAGTATAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'ARG01_199701'             ---------------------------------------------------------------------------------------------------------------GAAATGGAAAAAGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGGAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGATTTTTGGGAGGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGGGATGCATATTTTTCAGTCCCCTTAGATGACTTCAGGAAGTACACTGCATTCACCATACCTAGTATCAACAATGAGACACCAGGAATTAGGTACCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'ARG02_199701'             ---------------------------------------------------------------------------------------------------------TGTTYAGAAATGGAAAAAGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGGAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGATTTTTGGGAGGTTCAATTAGGAATACCRCATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGGGATGCATATTTTTCAGTCCCCTTAGATGATTTCAGGAAGTACACTGCATTCACCATACCTAGTATCAACAATGAGACACCAGGAATTAGGTACCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'ARG03_199701'             ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCAGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTAGATGTGGGTGATGCATATTTTTCTGTCCCTTTAGATGACTTCAGAAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'ARG04_199701'             ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAAGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAATATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGGAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGATTTYTGGGAAGTTCAATTAGGAATACCACATCCCGCTGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCYTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTATAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'ARG05_199701'             ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAARGACAGTACTAAATGGAGGAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGATTTTTGGGAAGTTCAATTAGGAATACCACATCCTGCTGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTAAAAATAATGAGACACCAGGGATTAGATATCAGTATAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'ARG06_199701'             ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAGGAAGGRAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAACTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTCCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTTAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_1337_200501'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAGAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTYTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGATTAAAGAAGAAAAAATCAGTAACARTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACTATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_132_200501'           CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAGGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAATAGAAATATGTTCAGAAATGGAAAAAGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAATATTTGCCATAAAGAAAAAAGACCGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTTTGGGAAGTTCAATTAGGAATACCACACCCCGCAGGGTTAAAAAAGAAAAAGTCAGTAACAGTACTGGATGTGGGGGATGCATATTTTTCAGTTCCCTTGGATGATTTCAGGAAGTACACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGACTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'DB_SI5275_01_200101'      ---------------------------------------------------------------------------------------------------------TGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAGGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGATTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATGATTTCAGGAAGTATACTGCCTTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATACCAGTACAATGTGCTCCCACAGGGAGGATCACCAGCAATATT [...]
+	'BRC1561_200208'           CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAATTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTGGATTTCAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTAGATGTGGGTGATGCATATTTTTCAGTTCCYTTAGATGACTTCAGGAAGTACACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGGTATCAATACAATGTGCTTCCACAGGGAGGATCGCCAGCAATATT [...]
+	'BRC1560_200208'           CCCATTAGTCCTATTGAAACTGTACCAGTAAAGAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTARTAGAGATTTGTACAGAAATGGAGAAGGAAGGAAAAATTTCAAAAATTGGACCTGAAAATCCATATAATACTCCAATATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAGGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGACGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGCGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_1309_200501'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTARTAGAAATCTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAGAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTTTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CCB_1308_200501'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAGAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATCTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGATAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGATTTCTGGGAGGTTCAATTAGGGATACCACATCCCGCAGGGTTAAAGAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCCTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGGTATCAGTACAATGTGCTTCCCCAGGGAGGATCACCAGCAATATT [...]
+	'Pt3010_200201'            CCTATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGCAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAGTGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAGTTAGGAATACCACATCCCGCAGGATTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGACGAATTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTACTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'PT_VE6_199301'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAGGAAAAAAAAGCATTGGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCTGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTCAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGGTTAGATATCAGTACAATGTGCTTCCACAAGGAGGATCACCAGCAATATC [...]
+	'00TH_C3198_200001'        CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTAACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTTAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGCTAAAAAAGAAAAAATCCGTAACAGTCCTGGATGTGGGTGATGCATACTTCTCAGTTCCTTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTGTAAACAACGAGACACCAGGGATTAGATATCAGTACAATGTACTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'02BR005_200401'           CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATAGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTGAAAAAGAACAAATCAGTAACGGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCTTTAGATGACTTTAGAAAGTATACTGCATTTACCATACCTAGTACGAACAATGAGACACCAGGGATTAGATATCAGTATAATGTGCTTCCACAGGGAGGATCACCAACAATATT [...]
+	'02BR006_200401'           CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATCTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGACTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTGAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTGGATGAATTCAGGAAATATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGAATTAGATACCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'05_132859_200401'         CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATCTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTTAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAGTTAGGAATACCACACCCAGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAAACACCAGGGATTAGATATCAATACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'05_132863_200401'         CCCATTAGTCCTATTGAAACTGTACCAGTAAGAAAACCAGGAATGGATGGCCCAAARGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAACCCGTACAATACTCCAGTGTTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGRTTAAAAAAGAACAAATCAGTAACAGTACTGGATGTAGGTGATGCATATTTTTCAGTTCCTTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATAAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'05_132868_200401'         CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAAYAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCTATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGGGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAAYTAGGAATACCACATCCAGCAGGGTTAAAGAAGAAAAAATCAGTRACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAAYAATGAGACACCAGGGATTAGATATCAGTACAATGTRCTYCCACAGGGAGGATCACCAGCAATATT [...]
+	'05_132887_200401'         CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGTCCAAAAGTTAAACAATGGCCYTTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAGGAAAAAAGACAGTACTAAATGGAGAAAAYTAGTAGACTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACACCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'05_132888_200401'         CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGTCCAAAAGTTAAACAATGGCCATTGACAGAAGAGAAAAAAGCATTAATAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGACCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTTTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAGAAGAAAAAATCAATAACAGTACTGGATGTGGGTGATGCATACTTTTCAGTTCCCTTAGATGATTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGGTATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'05_132893_200401'         CCCATTAGCCCTATTAAAACTGTACCAGTACAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAGATGGAAAAGGAAGGAAAAATTTCAAGAGTTGGGCCTGAAAATCCATATAACACTCCAATATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAGTTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAGGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAARRAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATGAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'05_132899_200401'         CCCATTAGTCCAATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGGCYAAAAGTTAAACAATGGCCATTAACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGCCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGACTTCAGGGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAGTTAGGRATACCACATCCTGCAGGGTTAAAAAAGAAAAARTCAGTAACAGTATTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATYAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'05_132907_200401'         CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTAACAGAGGAAAAAAAAGCATTGGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAACTAGGAATACCACATCCCGCAGGGCTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGACGCATATTTYTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAAYAATGAGACACCAGGAATTAGATATCAGTACAATGTGCTTCCACAAGGAGGATCACCAGCAATATT [...]
+	'05_132910_200401'         CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAACCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGARGAAAAGAAAGCATTGGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATYTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGGGAACTTAATAAGAGAACTCAAGACTTTTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTCCCCYTAGATGACTTCAGGAAGTATACTGCATTTACTATACCTAGTATAAACAATGAAACACCAGGGATTAGGTATCAGTATAATGTGCTTCCACAGGGAGGATCGCCAGCAATATT [...]
+	'05_132923_200401'         CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAGAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTTAGAGAACTTAATAAGAGAACYCAAGACTTCTGGGAAGTTCAACTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGAAAGTATACTGCATTTACCATACCTAGTTTAAACAATGAGACACCAGGGATTAGATATCAGTATAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'AP_ARRP012_200406'        CCCATAAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAACAGAAATATGTACAGAAATGGAAAAAGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTTAGGGAACTTAATAGAAGAACTCAAGATTTTTGGGAGGTTCAATTAGGAATACCGCACCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGGGATGCATATTTTTCAGTCCCCTTAGATGAGTTCAGGAAGTACACTGCATTCACCATACCTAGTATCAACAATGAGACACCAGGAATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'AP_ARRP013_200406'        CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAACAGAAATATGTTTAGAAATGGAAAAAGAAGGAAAAATCTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAATATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGGAAGTTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGATTTTTGGGAGGTGCAATTAGGAATACCGCATCCTGCAGGGTTAAAAAAGAACAAATCAGTAACAGTGCTGGATGTGGGGGATGCATATTTTTCAGTCCCCTTAGATGAGTTCAGGAAGTACACTGCATTCACCATACCTAGTATCAACAATGAGACACCAGGAATTAGGTACCAGTATAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'410252e_199401'           CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATYTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGACCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGARGTTCAATTAGGAATACCACATCCWGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCTTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'501907h_199401'           CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAGGTTAAACAATGGCCATTGACAGAAGAAAAGAAGGCATTAATAGAAATCTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGACTTCAGAGAACTTAACAAGAAAACTCAAGATTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTATTGGATGTGGGTGATGCATATTTTTCAGTTCCYTTAGATGACTTCAGGAAGTATACTGCATTCACCATACCTAGTAGAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTACCACAGGGAGGATCACCAGCAATATT [...]
+	'AP_ARRP029_200406'        CCCATTAGCCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTGCAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACCAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGATTTCTGGGAAGTCCAATTAGGAATACCACATCCCGCAGGATTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCCTATTTTTCAATTCCCTTATGTGACTTCAGGAAGTATACTGCATTCACTATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAATACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'AP_ARRP034_200406'        CCAATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAATTAAACAATGGCCACTGACAGAAGATAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGCACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAGGTTCAGTTAGGAATACCACATCCCGCAGGGCTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCATTACATGACTTCAGGAAGTATACTGCATTYACCATACCTARTAYAAACAATGCGACACCAGGGACTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'AP_ARRP039_200406'        CCCATTAGTCCTATTGAAACGGTACCAGTAAAGAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTACTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATGCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAATTCCATTAGATGAATTTAGAAAGTATACTGCATTTACCGTACCTTGTATAAACAATGAGAGACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'AP_ARRP040_200406'        CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGCATGGATGGGCCAAGAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAACAGAAATTTGTACAGAAATGGAAAAAGAAGGCAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAATATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTCCAATTAGGAATACCACATCCAGCAGGGCTAAAGAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGACGATTTCAGGAAGTACACTGCATTTACCATACCTAGTACAAACAATGAAACACCAGGAATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'99US_MSC5043_199901'      CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGAGGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACACCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACACCCCGCAGGGTTAAAAAAGAAAAAATCAATAACAGTACTGGATGTAGGAGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTCACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'AC_16_200001'             CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTCAAACAATGGCCACTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTTTGGGAGGTTCAATTAGGAATACCACATCCCTCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGAATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'AP_ARRP048_200406'        CCCATAAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAGAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAACAAAAGAACTCAAGACTTCTGGGAGGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATAACTTCAGAAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGAAGCCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt3272_200201'            CCCATTAGTCCTATTGACACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTARTAGAAATTTGTACAGAAATGGAAAAGGAAGGRAAAATYTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGRGAACTTAATAAAAGAACTCAAGACTTYTGGGAAGTTCAATTAGGAATACCACATCCYGCAGGRTTAAAAAAGAAAAAGTCAGTAACRGTACTGGATGTGGGWGAYGCATACTTTTCAGTTCCCTTAGATGACTTCAGAAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt3297_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGCAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGGAAATTAGTAGATTTCAGAGAACTTAAYAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCYGCAGGATTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGAATTAGATATCAGTACAATGTACTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt3309_200201'            CCCATAAGTCCTATTGAAACTGTACCAGTAAATAAGCCAGGAATGGATGGCCCAARAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAGATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAACTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTWCAGTTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGACGTGGGTGATGCATATTTTTCAGTTCCCTTAGATAACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGRATTAGATATCAGTACAATGTGCTKCCACAGGGAGGATCACCAGCGATATT [...]
+	'Pt3324_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTGAAAAAGCCAGGAATGGATGGCCCAAAGGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATYTGTACAGAAATGGAAAAGGAAGGAAAAATCTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAARGACAGTACTAAGTGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCTCAGGATTAAAAAAGAAAAARTCAGTAACAGTACTRGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATGACTTCAGRAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTRCTTCCACAGGGAGGRTCACCAGCAATATT [...]
+	'Pt3505_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATCTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCYATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGGGAGCTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCATTAGATGACTTCAGAAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt3540_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGMAGAAAAARAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATCGGGCCTGAAAATCCATACAATACTCCAGTCTTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGATTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAMTTYAGGAAGTACACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCGCAGGGAGGATCACCAGCAATATT [...]
+	'Pt3544_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAATGGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATCTCAAAAATTGGACCTGAAAATCCATACAATACTCCAGTTTTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAGCTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCTCATCCCGCAGGGTTAAAAAAGAAAAARTCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCATTAGATGGCTTCAGAAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACGCCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt3552_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAACCAGGAATGGATGGSCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTARTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATCTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGAYRGTRCTAAATGGAGAAAATTAGTAGATTTCAGASATCTTAATAAMAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAARGAAAAAATCAGTGACAGTACTAGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGAAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt3554_200201'            CCYATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAARAGTTAAACAATGGCCATTGACAGCAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTAGTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAARAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGRTTAAARAAGAAAAAATCAGTAACAGTAYTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTTAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTACTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt3563_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAGATCTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAARGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAGCTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCATTAGATGAATTYAGAAARTATACTGCATTTACCATACCTAGTATAAAYAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt3593_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGCAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGAYTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGATTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGAAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGGTTAGATATCAGTATAATGTACTTCCACAGGGAGGRTCACCAGCAATATT [...]
+	'Pt3687_200201'            CCCATTAGTCCCATTGAAACTGTACCAGTAARAAAGCCAGGAATGGATGGCCCAAAAGTTAAGCAATGGCCATTGACAGMAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTRAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTACTYCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt3690_200201'            CCCATTAGTCCTATTGACACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTGAAACAATGGCCATTATCAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATCTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAGTGGAGAAAATTAGTAGATTTCAGGGAGCTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAGAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCAYTAGATGACTTCAGAAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACGCCAGGAATTAGGTATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt3691_200201'            CCCATCAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTCAAACAATGGCCATTGACAGARGAAAAAAAGGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATCTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCYATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAGCTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTARAAAGGARAARATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTKCCCTTAGATGACTTCAGAAAGTATACCGCRTTTACCATACCTAGTATAAACAATGARACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt3721_200201'            CCCATTAGTCCTATTGAAACWGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGRAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAACTAGTAGAYTTCAGAGAACTTAATAAGAGAACTCAAGACTTYTGGGAGGTTCAACTAGGAATACCACATCCCGCAGGGCTAAAAAAGAAAAAATCAGTAACAGTACTRGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGAYGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGRTATCAATACAATGTGCTCCCWCAGGGAGGGTCACCAGCAATATT [...]
+	'Pt3745_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGCAGAAAAARAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGATTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTYAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTACTTCCRCAGGGAGGATCACCAGCAATATT [...]
+	'Pt3798_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGCAGAAAAAAAAGCATTAGTAGAAATTTGCACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACCAAGTGGAGAAAATTAGTGGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGATTAAAAAAGAAAAAATCAGTAACAGTATTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt4020_200201'            CCTATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGCAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGGAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGATTAAAAARGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTACTGCCACAGGGAGGCTCACCAGCAATATT [...]
+	'Pt4041_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTAACAGAAGAAAAAAAAGCATTAACAGAAATTTGTACAGAAATGGARAAGGAAGGGAAAATCTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCTATAAAGAAAAAGGACAGTACYAAATGGAGAAAAYTAGTAGATTTCAGAGAGCTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATAYTTTTCAGTTCCCTTAGATGACTTCAGAAAGTATACTGCGTTTACCATACCTAGTGTAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt4071_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAATAGAGATTTGTACAGAAATGGAAAAGGAAGGGAAAATTGAAAAGATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGATTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTATAAATAATGAGACACCAGGGATTAGATATCAGTACAACGTACTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt4112_200201'            CCCATAAGTCCTATTGAGACTGTACCAGTAAAAAARCCAGGTATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATCTCAAAAATTGGGCCCGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAGTTAGGAATACCACACCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTAGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGAAAGTATACTGCATTCACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAAGGAGGATCACCAGCAATATT [...]
+	'Pt4127_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTKAAACAATGGCCATTGACAGCAGAAAAAAAAGCATTAGTAGAAATTTGCACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGRCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAGTGGAGAAAATTAGTGGATTTCAGGGAACTTAATAAGAGAACTCAAGACTTYTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGATTAAAAAGGAAAAAGTCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTTAGGAAGTACACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTACTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt4131_200201'            CCCATTAGTCCTATTGACACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGCAGAAAAAAAAGCATTAGTAGAAATTTGCACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGACCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAGTGGAGAAARTTAGTGGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTCCAATTAGGAATACCACATCCCGCAGGATTAAAAAGGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTYAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATACCAGTACAATGTRCTCCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt4235_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGCAGAAAAAAAAGCATTAGTAGAAATCTGTACAGAAATGGAAAAAGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCTATAAGGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGATTTCTGGGAAGTTCAATTAGGAATACCGCATCCCGCAGGATTAAAAATGAAAAAATCAGTAACAGTTCTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTTAGGAAGTATACTGCATTCACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAATACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt4518_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAWTGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCTATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACYCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGATTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCTTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGKGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt4533_200201'            CCCATTAGCCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGCAGAAAAAAAAGCATTAGTAGATATTTGTACAGAAATGGAAAAGGAAGGAAAAATTGCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTTTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGATTAAAAAAGAAAAAATCAGTGACAGTACTGGATGTGGGGGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTACACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CA5631_200001'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAATGGAAATTTGTACAGAAATGGAAAAGGAAGGRAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAGTGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGATTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAGAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt4560_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGACGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGRCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTTTGGGAAGTCCAATTAGGAATACCACATCCTGCAGGATTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTCTCAGTTCCTTTAGATRACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAACGTACTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt4604_200201'            CCYATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGRATGGATGGGCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAACAGAAATTTGTACAGATATGGARAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAATATTTGCCATAAAGAAAAARGACAGTACAAAATGGAGAAAACTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGATTTCTGGGAAGTTCAATTAGGRATACCACATCCYGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGAYGCATACTTTTCAGTTCCCTTAGATAACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGARACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt5034_200201'            CCTATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCCGGAATGGATGGCCCAAGAGTTAAACAATGGCCACTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAAGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTGGTAGATTTTAGAGAACTTAATAAGAGAACTCAAGATTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTAGATGTAGGTGATGCATATTTTTCAGTTCCCTTATATGAGTTCAGGAAGTACACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATCAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt5036_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGMAGAAAAARAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATCGGGCCTGAAAATCCATACAATACTCCAGTCTTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGATTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTYAGGAAGTACACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCRCAGGGAGGATCACCAGCAATATT [...]
+	'Pt5054_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGCAGAAAAAAAAGCATTAGTAGAAATTTGCACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGRCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAGTGGAGAAAATTAGTRGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTYCAATTAGGAATACCACATCCRGCAGGATTAAAAAAGAAAAAGTCAGTAACAGTACTAGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTYAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTACTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt5068_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAGAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCACTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGATAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGATTTTTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAARGAAAAAATCAGTAACAGTATTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTYAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt5091_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTGAAAAAGCCAGGAATGGATGGTCCAARAGTTAAACAATGGCCAYTGACAGAAGAAAAAAAAGCATTATTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATCTCAAAGATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCYATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTRCTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTTAGAAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACGCCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt5195_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGCAGAAAAGAAAGCATTAGTAGAAATTTGCACAGAGATGGAAAAGGAAGGAAAAATCTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGCACTAAGTGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCTCAGGATTAAAACAGAARAAGTCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTCCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt5260_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGCAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAGATCGGGCCTGAAAATCCATACAATACTCCAGTCTTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGATTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTACACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt5639_200201'            CCCATAAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATCTCAAAAATTGGACCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGACTTYTGGGAAGTTCAATTAGGGATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTAGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGAAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTATAATGTGCTTCCACAGGGAGGGTCACCAGCAATATT [...]
+	'Pt5663_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAGAGTTAAACAATGGCCACTGACAGARGAAAAAAAAGCATTATTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATATCAAAAATTGGGCCTGAAAATCCATAYAATACTCCAGTWTTTGCCATAAAGAAGAAAGACAGTACTAAATGGAGAAAACTAGTAGATTTTAGAGAACTTAATAAAAGRACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAATTCCCTTAGATGAATTCAGAAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCWGCAATATT [...]
+	'Pt5704_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAGAGTTAAACAATGGCCACTGACAGAAGAAAAAAAAGCATTATTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATATCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAGAAAGACAGCACTAAATGGAGAAAACTAGTAGATTTTAGAGAGCTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAGAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAATTCCCTTAGATGAATTCAGAAAGTATACTGCATTTACCATACCTAGTAGAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt5755_200201'            CCCATTAGTCCTATTGAAACTGTACCCGTAAAAAAGCCAGGAATGGATGGCCCAAGAGTTAAACAATGGCCATTGACAGAAGAAAAGAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAAGAAGGAAAAATCTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAACTAGTAGATTTTAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAGAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGAAAATATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'PCF_Pat128_200101'        CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAACCAGGAATGGATGGCCCAAGAGTTAAGCAATGGCCATTATCAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATCTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTGTTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAGGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTATTGGACGTAGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGAAAGTATACTGCATTTACCATACCTAGTATAAACAATGSGACACCAGGGATTAGATATCAGTCCAATGTACTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'PCF_Pat134_200101'        CCTATTAGTCCTATTGAAACTGTRCCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAGGCATTAGTAGAAATCTGTACAGAAATGGAAAAGGAAGGGAAAATTACAAGAATTGGGCCTGAAAATCCATACAATACTCCAATATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAGTTAGGAATACCACATCCCGCAGGGTTGAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGAAAGTATACTGCATTCACCATACCTAGTGTAAACAATGCGACACCAGGGATTAGATATCAGTATAATGTGCTCCCACAGGGAGGATCACCAGCAATATT [...]
+	'PCF_Pat143_200101'        CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATCTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAGAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACACCCCKCAGGGTTAARGAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCTTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATACCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'PCF_Pat152_200101'        CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAGAGCATTAGTGGAAATATGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGGACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTGAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCTTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'PCF_Pat158_200101'        CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATCTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGGGAACTTAATAAGAGGACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACYATACCYAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'PCF_Pat159_200101'        CCCATTAGTCCTATTAAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAATATTTGCAATAAAGAAAAARGATAGTACTAAATGGAGAAAGTTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGAYTTCTGGGAGGTTCAATTAGGAATACCACATCCCGCAGGGTTAAGAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCATTAGATGACTTCAGGAAGTATACTGCATTTACCATACCAAGTATAAACAATGAGACACCAGGGGTTAGATATCAGTCAAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'PCF_Pat161_200101'        CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAACAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAARTGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTCCAATTAGGAATACCACATCCCGCAGGATTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTACATGACTTCAGGAAATATACTGCATTTACCATACCTAGTACAAACAATGAAACACCAGGGGTTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'PCF_Pat170_200101'        CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAGCAATGGCCATTGACAGAGGAAAAAAAAGCATTGATGGAAATTTGTGCAGAAATGGAAAARGAAGGAAAAATTGAAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCTATAAAGAAAAAAGATAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTGCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGRCACCAGGAATTAGATATCAGTACAATGTGCTTCCACAAGGAGGATCACCAGCAATATT [...]
+	'PCF_Pat171_200101'        CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAGAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAACCCATACAATACTCCTGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGGGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCGGGATTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGAAAGTATACTGCATTTACAATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAAGGAGGATCACCAGCAATATT [...]
+	'PCF_Pat195_200101'        CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATCTGTACAGAAATGGAGAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCYATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGAYTTYTGGGAAGTTCAATTAGGAATACCACATCCYGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTRGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'PCF_Pat2_200101'          CCCATCAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGCACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCTCTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'PCF_Pat23_200101'         CCCATTAGTCCTATTGAAACTGTACCAGTAAAGAAGCCAGGAATGGATGGCCCAAGAGTCAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGRACTCARGACTTCTGGGAAGTTCAATTAGGAATACCACATCCYGCAGGGTTAAAACAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACWGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'JLB_Pat14_200006'         CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCGTTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATAGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAARGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGGGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTCCAATTAGGGATACCMCATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAYTTCAGGAAGTATACTGCATTTACCATACCTAGTAYAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCCCAGGGAGGATCACCAGCAATATT [...]
+	'JLB_Pat2_200006'          CCCATTAGTCCTATTGAAACTGTACCAGTAARAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGARAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAGAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAGAATCCATACAATACTCCAGTTTTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGRGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTTCTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGARTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACRCCAGGGATTAGATATCAGTACAATGTGCTACCACAGGGAGGATCACCAGCAATATT [...]
+	'JLB_Pat30_200006'         CCCATTAGTCCTATTGAAACTGTACCTGTAAAAAAGCCAGGAATGGATGGCCCNAAAGTTAAACAATGGCCATTGNCAGAAGAAAAGAAAGCATTAKTAGAAATTTGTACAGAAATGGAGAAAGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCTATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGACTTCAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCYGCAGGGTTAAAAAAGAAGAAATCAGTAACAGTGCTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTMCMATACCTAGTWTAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'JLB_Pat34_200006'         CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAACCAGGTATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCTATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGACTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'JLB_Pat54_200006'         CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGRATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAGAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGYAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACYTYTGGGAARTTCAATTAGGAATACCACATCCTKCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGACGACTTCAGGAAGTACACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'JLB_Pat66_200006'         CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTGAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAGAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAGTGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGATTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGAAAGTATACTGCATTTACCATCCCTAGTAGAAATAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'JLB_Pat70_200006'         CCCATTAGTCCTATTGACACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTCAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGARAAGGAAGGRAARATYTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAGTGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGATTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGAAAGTATACTGCATTTACCATCCCTAGTAGAAATAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt5795_200201'            CCCATTAGTCCTATTGAAACTGTACCCGTAAAAAAGCCAGGAATGGATGGCCCAAGAGTTAAACAATGGCCATTGACAGAAGAAAAGAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATCTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAACTAGTAGATTTTAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAGAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTCAGTTTCCCTTAGATGACTTCAGAAAATATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt5816_200201'            CCCATCAGTCCTATTGAAACTGTACCCGTAAAAAAGCCAGGAATGGATGGCCCAAGAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATCTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAACTAGTAGATTTTAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAMAGAGAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGAAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt3053_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAGAGTTAAGCAATGGCCATTGACAGAAGAAAAACAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATCTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAGTTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAGAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGAAAGTATACTGCATTTACCATACCTAGTAGAAACAATGAGACACCAGGGATTAGATATCAATACAATGTGCTTCCACAGGGAGGATCACCAGCCATATT [...]
+	'Pt3057_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAGAGTTAAACAATGGCCATTGACAGCAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGARAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTAGTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGATTGAAAAGGAAAAAATCAGTAACAGTATTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTTAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTACTTCCACAGGGGGGATCACCAGCAATATT [...]
+	'Pt3085_200201'            CCTATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGCAGAAAAAAAYGCATTAGTAGAAATTTGTATGRAAATGRAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTAATAGATGGAGAAAATTAGTAGATTTKAGAGAACTTAATAARAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGATTAAAACAGAAAAAAGCAGTGACAGTACTGGATGTGGGGGATGCATATTATTCAATTCCCTTARATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTACTTCCAATGGGAGGATCACCAGCAATATT [...]
+	'Pt3110_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAGAGTTAAGCAATGGCCATTGACAGAAGAAAAACAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATCTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAGTTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAGAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGAAAGTATACTGCATTTACCATACCTAGTASAAACAATGAGACACCAGGGATTAGATATCAATACAATGTGCTTCCACAGGGAGGATCACCAGCCATATT [...]
+	'Pt3131_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGGATGGATGGCCCAAAAGTTAGACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGYCATAAAGAAAAAAGACAGTACTAAATGGAGAAAACTAGTAGATTTTAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGATTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATAGCTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt3134_200201'            CCCATTAGTCCTATTGAAACAGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAACCCATACAATACTCCAGTATTTGCCATAAAGAAAAARGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGATTTCTGGGAGGTTCAATTAGGAATACCACATCCCGCAGGGCTAAAAAAGAGGAAGTCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGACTAGATATCAGTACAATGTGCTTCCACAGGGAGGMTCACCAGCAATATT [...]
+	'Pt3147_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGCAGAAAAAAAAGCATTAGTAGAAATTTGCACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAATATTCGCCATAAAGAAAAAAGACAGTACTAAGTGGAGAAAATTGGTGGATTTCAGAGAACTTAATAARAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGATTAAAAAAGAAAAAGTCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGAGTTAGGTATCAGTACAATGTGCTTCCACAAGGAGGATCACCAGCAATATT [...]
+	'Pt3194_200201'            CCTATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGCAGAAAAAAAAGCATTAGTAGAAATTTGTAYGGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGYACTAAATGGAGGAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTYTGGGAAGTTCAATTAGGAATACCACATCCYGCAGGATTAAAAAAGAAAAAATCAGTGACAGTACTGGATGTGGGGGATGCATATTTYTCARTTCCCTTAGATGACTTCAGRAAGTAYACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTACTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt3219_200201'            CCTATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACARTGGCCACTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTGTTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTGGTAGATTTTAGAGAACTTAATAAGAGAACTCAAGATTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTAGATGTAGGTGATGCATATTTTTCAGTTCCCTTATATGATTTCAGGAAGTACACTGCATTTACCATACCTAGTAYAAACAATGAGACACCAGGGAYCAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt3261_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGCAGAAAAAAAAGCATTAGTAGAAATTTGTACAGARATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCYATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTYAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGATTAAAAAAGAARAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTYTCAGTTCCYTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGYATAAACAATGAGACACCAGGGATTAGRTATCAGTACAATGTACTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt5767_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAARGAAGCCAGGGATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAATAGAAATTTGTACAGAGATGGAAAAGGAAGGAAAAATTACAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTCGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTTAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAGTCAGTAACAGTACTRGATGTGGGTGATGCATACTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAATAATGAGACACCAGGGATTAGATATCAATACAATGTGCTTCCACAGGGRGGATCACCAGCAATATT [...]
+	'BrRJ004_200101'           CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAGAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAGATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGAACAGTAMTAGATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAACTAGGAATACCACATCCCGCAGGGTTAAAAARGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACTATACCTAGTACAAACAATGCGACACCAGGGATTAGGTATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'BrRJ070_200101'           CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGGATGGATGGTCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTTAGAGAACTTAATAAGAGAACTCAAGATTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATAYTTTTCAGTTCCCTTAGATGACTTCAGGAAATATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTCCCACAGGGAGGATCACCAGCAATATT [...]
+	'CA18325_200312'           CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAARGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGRAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTTAGAGARCTTAATAARAGAACTCAAGACTTTTGGGAGGTTCAATTAGGAATACCACATCCYGCAGGGTTAAAAAAGAAGAAATCAGTAACAGTACTRGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATGAYTTCAGGAAGTATACTGCATTYACCATACCYAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAAGGAGGATCACCAGCAATATT [...]
+	'EC8_199407'               CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAGAAAGCATTAATAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAACACTCCAGTGTTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGACTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACGGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCCAGTATAAATAATGAGACACCAGGAATTAGATATCAATACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'DB_SI5336_02_200201'      CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAATAGAAATTTGTACAGAAATGGAAAAAGAAGGGAAAATATCTAAAATTGGGCCTGAAAATCCATATAAYACTCCAGTATTTGCCATAAAGAAAAANGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGATTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTGAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCCTAYATGACTTTAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'DB_SI5191_04_200401'      CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAGAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAGAATTGGGCCTGAAAATCCATACAATACTCCAGTGTTTGCCATAAAGAAAAAAGATAGTACTAAATGGAGAAAGTTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTCTCAGTCCCTTTAGATGACTTCAGGAAGTACACTGCATTTACCATACCCAGTGTAAATAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCGCCAGCTATATT [...]
+	'DB_SI4993_02_200201'      CCCATCAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGGATGGATGGCCCAAAAGTTAAACAGTGGCCATTGACAGAAGAAAAAAAAGCCTTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGACAAATTTCAAAAATTGGGCCTGAAAATCCATACAACACTCCAGTATTTGCCATAAAGAAAAAAGACAGTGCTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTYCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTAGATGTGGGTGATGCATAYTTCTCAGTTCCCTTAGATGATTTCAGGAAGTATACTGCATTTACCATACCTAGTCTAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTCCCACAGGGAGGATCACCAGCAATATT [...]
+	'DB_SI3458_02_200201'      CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAAGAAGGGAAAATATCTAAAATTGGGCCTGAAAATCCATATAATACTCCARTATTTGCCATAAAGAAAAARGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAAYAAGAGAACTCAAGATTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTGAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCCTAYATGACTTTAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGARACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'DB_SI3347_02_200201'      CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAARGACAGYACCAAATGGAGAAARTTAGTAGATTTCAGAGAACTCAATAARAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTAGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATGACTTCAGGAAGTATACAGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Cu43_200401'              CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTGAAGCAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATCTGTACAGAAATGGAAAAGGACGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACGGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGAAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATCAGATATCAGTACAATGTGCTTCCACAGGGAGGGTCACCAGCAATATT [...]
+	'CB_2410_199801'           CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAACAGAAATATGTTTAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCWTAYAATACTCCAGTATTTGCCATAARGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGATTTTTGGGAGGTTCAATTAGGGATACCGCATCCTGCAGGGTTAAAAAAGAAAAAGTCAGTAACAGTACTGGATGTGGGGGATGCATATTTTTCAGTCCCCTTAGATGATTTCAGGAAGTACACTGCATTCACCATACCTAGTATCAACAATGAGACACCAGGAATTAGRTATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Cu100_200401'             CCAATTAGCCCTATTGAAACTGTACCAGTAAAAAAGCCAGGGATGGATGGCCCAAAAGTTAAACAATGGCCGTTGACAGAAGAAAAAAAAGCATTAACAGAAATTTGTACAGATATGGAAAAGGAAGGAAAAATTTCAAGAATTGGGCCTGAAAATCCATATAATACTCCAATATTTGCCATAAAGAAAAAAGACAGTTCTAAGTGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACCCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAGAAGAAAAAATCAGTAACAGTATTGGATGTAGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTTAGAAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAAGGAGGATCACCGGCTATATT [...]
+	'PCF_Pat55_200101'         CCCATAAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAAYAGAAATCTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGATAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTYCAATTAGGAATACCACATCCYGCAGGGTTAAAAAAGAAAAAGTCAGTAACAGTACTGGATGTGGGTGATGCATATTTYTCAGTTCCCTTRGATGAATTCAGGAAGTAYACTGCATTTACCATACCYAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'PCF_Pat7_200101'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATCTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGGAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTYTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAYTTYAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'JLB_Pat97_200006'         CCCATTAGTCCTATTGACACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAGGAAAAAAAAGCATTAGTAGAGATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAGTGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTATTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTACACTGCATTTACCATACCTAGTACAAACAATGAAACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'WR27_198801'              CCTATTAGCCCTATTGAAACTGTACCAGTAAAAAAACCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAATAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATCTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTCCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTAGATGTGGGTGATGCATATTTTTCAGTTCCTTTAGATGAGTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'PCF_Pat75_200101'         CCCATTAGTCCCATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAGATGGAAAAGGAAGGGAAAATTTCAAGAATTGGGCCTGAAAATCCATACAACACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGGATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTATATGAGTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'MI_Pat97_200101'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAGATTACAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTGTTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACACCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTAGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAAGGAGGATCACCAGCAATATT [...]
+	'MI_Pat93_200101'          CCCATTAGTCCTATTGATACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATCTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAGAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAATTCAGTAACAGTACTGGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTYACTATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'PCF_Pat81_200101'         CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTYAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAGAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAARGATAGCACTAAATGGAGAAAATTAGTAGACTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCGGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'PCF_Pat84_200101'         CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAARGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAACCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGATTTCAGGAAGTACACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTATAATGTGCTTCCACAGGGAGGATCACCATCGATATT [...]
+	'PCF_Pat9_200101'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACMATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTTTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTACACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGAATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'PCF_Pat90_200101'         CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAARCCAGGAATGGATGGCCCAARAGTCAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGGAARTTRGTAGATTTTAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTYCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAMTTCAGGAAGTACACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCRCAGGGAGGATCACCAGCAATATT [...]
+	'PCF_Pat97_200101'         CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAARAAAGCATTAGTAGAAATCTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGATAAYCCATATAATACTCCAGTATTTGCCATAAAGAAAAARGAYAGTACTAAATGGAGAAAATTAGTAGATTTTAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAATTCCCTTAGATGACTTCAGGAAGTAYACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCATCAATATT [...]
+	'PS2008_200501'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGTCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAATATTTGCCATAAAGAAAAAGGATGGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTTTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCGGTTCCCTTAGATGAATTCAGAAAGTATACTGCATTTACTATACCTAGTACAAATAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAAGGGGGATCACCAGCAATATT [...]
+	'PS4048_200406'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAACAGAAATATGTACAGAAATGGAAAAGGAAGGRAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGYGTTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAGGTTCAATTAGGAATACCACATCCGGCAGGGTTAAAAAAGAAAAGGTCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAMTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'MI_Pat4_200101'           CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTTAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGGATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAGTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGAATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCGCCAGCARTATT [...]
+	'MI_Pat80_200101'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAAKGGAAATTTGTGMMGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCARTATTTGCCATAAAGAAAAARGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTYTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTRCTAGATGTGGGTGATGCATATTTTTCAGTTCCCTTACATGACTTCAGGAAGTATACTGCATTTACCRTACCYAGTATAAACAATGAGACACCAGGGACTAGGTATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'MI_Pat73_200101'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAGAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTAGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGGTTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'MI_Pat48_200101'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATATGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAACTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTCTCAATTCCCTTAGATGACTTCAGGAAGTATACTGCATTCACCATACCTAGTACAAATAATGAGACACCGGGGATCAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'MI_Pat10_200101'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAACCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAAYTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAATAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'MI_Pat15_200101'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAGATGGAAAAGGAAGGGAAAATTTCAAGARTTGGGCCTGAAAATCCATATAATACTCCAATATTTGCTATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCYGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGAGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGGTATCAGTACAATGTGCTTCCACAGGGAGGCTCACCAGCAATATT [...]
+	'PCF_Pat106_200101'        CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAAYCCATACAATACTCCAGTATTTGCCATAAAGAAAAARGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'SM_02YE508_200201'        CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTAACAGAAGAAAAAAAAGCATTAATAGAAATCTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTCCAGTTAGGAATACCACATCCCTCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAGTTCAGGAAATATACTGCATTCACTATACCTAGTTTAAACAATGAGACACCAGGGATTAGATATCAGTATAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'MI_Pat27_200101'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCAYTGACAGAAGAAAAAAAAGCATTAATAGAAATTTGTACAGAAATGGAGAAGGAAGGGAAAATCTCAAAAATTGGGCCTGAWAATCCATACAATACTCCAGTATTTGCCATAARGAAAAARGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGARAACTCAAGACTTCTGGGAAATTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAARTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGGTTAGATATGAGTACAATGTGCTGCCACAGGGAGGATCACCAGCAATATT [...]
+	'OMVB_RT_41_200301'        ---------------------------GTAAAAAAGCCAGGAATGGATGGCCCAAAAGTAAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAATAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'TY_pat5_200201'           CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGTCCAAAGGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGGGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCTGTAACAGTCCTGGATGTGGGTGATGCATATTTCTCAGGTCCTTTAGATGACTTCAGGAAGTACACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGAATTAGATATCAGTACAATGTACTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'PCF_Pat102_200101'        CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATCTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTRTTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTKCCACAGGGAGGATCACCAGCAATATT [...]
+	'OMVB_RT_65_200301'        ------------------------------------CCAGGAATGGATGGCCCAAAATTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAGGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAACAAGAGAACCCAAGACTTTTGGGAAGTTCAACTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCTTTAGGTGAATTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGNTCACCAGCAATATT [...]
+	'PCF_Pat100_200101'        CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAACCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGRAARATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCYATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTAYTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGAYGAGTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTRCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt7857_200201'            CCCATTAGTCCTATTGAAACTRTACCAGTAAAAAAGCCAGGAATGGATGGGCCAAAAGTCAAACAATGGCCATTGACAGAAGAGAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATCTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAATATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGCTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTATATGACTTCAGAAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCARTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'LV_00FR_MP1473_199601'    CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTGAAACAATGGCCATTGACAGAAGAGAAAAAAGCATTAGTAGAAATATGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAGAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGGGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAGTTAGGAATACCACATCCCGCAGGGTTAAGAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGAAAGTATACTGCATTTACCATACCTAGCACAAACAATGAGACACCAGGAATAAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'LV720EST_199901'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAGAAGCCAGGAATGGATGGCCCAAAAGTTAAACAGTGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAACAAGAGAACTCAAGACTTTTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGATTAAAAAAGAAAAAATCAATAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGAATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt6124_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAGAAAGCCAGGTATGGATGGCCCAAAAGTCAAACAATGGCCATTGACAGCAGAAAAGAAAGCATTAGTAGAAATTTGCACAGAAATGGAAAAGGAAGGAAAAATATCAAAAATTGGGCCTGAAAATCCATACAATACGCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAGTGGAGAAAATTAGTGGATTTCAGGGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCTCAGGATTAAAAAAGAAAAAGTCAGTAACAGTACTAGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt6128_200201'            CCCATTAGTCCTATTGACACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAGCAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTAACGAGATGGAAAAGGAAGGGAAAATYTCAAAAATTGGGCCTGAAAACCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAGTTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAARATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGAAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAATACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt6136_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGCAGAAAAGAAAGCATTAGTAGAAATTTGCACAGAAATGGAAAAGGAAGGAAAAATATCAAAAATTGGGCCTGAAAAYCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAGTGGAGAAAATTAGTGGATTTCAGAGAACTTAATAARAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCTCAGGATTAAAAAAGAAAAGATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt5783_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAGAGTTAAACAATGGCCACTGACAGAAGAAAAAAAAGCATTAKTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATMTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAARAAGAAAGACAGTACTAAATGGAGAAAACTAGTAGAYTTTAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAATTCCCTTAGATGAATTCAGAAAGTATACTGCATTTACCATACCTAGTASAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'BREPM275_199901'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAGAGTTAAACAATGGCCGTTGACAGAAGAAAAAAAAGCAATAATGGAAATTTGTGCATTTCTGGAAGAAGAAGGGAAAATTTCAAAGATTGGGCCTGAAAATCCATATAATACTCCAATATTTGCCATAAAGAAAAAGAACAGTGATAAATGGAGAAAATTAATGGATTTCAGAGAACTTAATAAGAGAACTCAAGATTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAGAAGAATAAGTCAGTGACAATACTGGATGTGGGTGATGCATATTTTTCAATTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTATAAATAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGCTCACCAGCAATATT [...]
+	'Pt3264_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAACAAAGCCAGGAATGGATGGCCCAAGAGTTAAACAATGGCCATTAACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTCAATAAGAGAACTCAAGATTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGACGACTTCAGGAAGTATACTGCATTCACCATACCCAGTAGAAACAATGAGACACCAGGGATTAGATATCAGTATAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt3266_200201'            CCCATTAGTCCTATTGAAACTGTRCCAGTAAAAAAGCCAGGAATGGATGGCCCAAAGGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAATAGAAATCTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACAAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTTTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGATTAAAAAGGAAAAGATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTTAGAAAATACACTGCATTCACCATACCTAGTATAAACAATGAGACACCAGGAATTAGATATCAGTACAATGTACTTCCACAGGGAGGATCGCCAGCAATATT [...]
+	'Pt3270_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAGAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATCTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTTTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGATTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGAAAGTATACTGCATTTACCATACCTAGTASAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAAGGAGGATCACCAGCAATATT [...]
+	'PCF_Pat27_200101'         CCTATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAARGTTAAACAATGGCCCTTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTGCAGAAATGGAAAAGGAAGGACAAATTTCAAAAGTTGGGCCTGAAAATCCATACAATACTCCAGTGTTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAACAAGAGAACTCAAGACTTCTGGGAAGTYCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAYTTCAGGAAGTAYACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt3273_200201'            CCCATTAGYCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATYTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAGTGGAGAAAATTAGTAGATTTTAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAGGTCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTYACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt3284_200201'            CCCATTAGTCCTATTGAAACTATACCAGTAAAAAAACCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAGAAAAAAGCATTARTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAARGATGGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGARGTTCARTTAGGAATACCACATCCHGCAGGATTAAAAAGGAAAAAATCAATAACAGTACTRGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATAACTTCAGGAAGTAYACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt3290_200201'            CCAATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGGATGGATGGCCCAAAAGTTAAACAATGGCCATTGACGGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATCTCAAAAATYGGGCCTGAAAATCCATATAATACTCCAGTATTTGCTATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAACAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCKCAGGGTTAAAAAAGAAAAAATCAGTAACAGTRCTGGATGTGGGTGACGCATATTTTTCAGTTCCCTTAGATGACTTCAGAAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAAGGAGGATCACCAGCAATATT [...]
+	'Pt3620_200201'            CCTATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATCTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATTCCACATCCCGCAGGGTTGAAAAAGAAAAAATCAGTGACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGATTTCAGAAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATACCAATACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt3614_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGYCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAGAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATCTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACCCAAGACTTTTGGGAAGTTCAGTTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGAAAGTATACTGCATTTACCATACCTAGTACAAATAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt3608_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAGAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGRAAAATCTCAAAGATTGGGCCTGAAAATCCATACAATACTCCAATATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTTAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTCCAATTAGGGATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACCGTACTGGATGTGGGTGATGCATATTTTTCGGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACTATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt3607_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATCTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAARGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAARAGAACTCAAGACTTTTGGGAAGTCCAATTAGGAATACCACATCCCTCAGGGTTRAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGATTTYAGAAAGTATACTGCATTTACCATACCTAGTATAAACAATGCGACACCAGGGATYAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt3603_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAARGTTAAACAATGGCCATTGACAGAAGAAAAGAAAGCATTAGTAGAAATCTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACGAAATGGAGAAAATTGGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTGGGAATACCACATCCTGCAGGATTAAAAAGGAAAAGATCAGTAACAGTACTAGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTTAGAAAATACACTGCATTCACCATACCTAGTATAAACAATGAGACACCAGGAATTAGATATCAGTACAATGTACTTCCACAGGGAGGATCGCCAGCAATATT [...]
+	'Pt3602_200201'            CCYATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGRAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTRAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCYTTAGATGACTTCAGGAAGTACACTGCATTTACCATACCTAGTATAAACAATGAGRCACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGCTCACCAGCAATATT [...]
+	'PCF_Pat20_200101'         CCCATTAGTCCTATTGAAACTGTCCCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAATGGAAATTTGTGCAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTYAATAAGARAACTCAAGACTTMTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCTTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGACTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt3589_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTCAAGCAATGGCCATTAACAGAAGAGAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAGATTACAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCTATAAAGAAAAAAGACAGTACTAAGTGGAGAAAGTTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGATTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAGTTCAGGAAGTATACTGCATTCACCATACCTAGTGTAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt1562_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAARAAAGCATTAATAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCTATAAAGAAAAAGGACAGCACTAAATGGAGAAAATTAGTAGATTTCAGRGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCMGCAGGATTAAAGAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATAGCTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTATAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt1563_200201'            CCTATTAGTCCTATTGAAACTGTACCAGTAAGAAAGCCAGGAATGGATGGCCCAAAGGTTAAACAATGGCCATTGACAGAAGARAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGARAAAGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTGGTAGATTTTAGAGAACTTAATAAAAGAACTCAAGATTTCTGGGAAGTTCAAYTAGGAATACCACATCCCKCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTAGGTGATGCATATTTTTCAGTTCCCTTACATGAYTTTAGRAAGTACACTGCATTYACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCGCCAGCAATATT [...]
+	'Pt3003_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTACAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATCTCAAAAATAGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTTAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTATTGGATGTGGGKGATGCATATTTTTCAGTTCCCTTAGATRACTTCAGAAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGGTATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt3004_200201'            CCTATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTGGTAGATTTTAGAGAACTTAATAAGAGAACTCAAGATTTYTGGGAAGTTCAATTAGGAATACCACATCCHGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTAGGTGATGCATATTTYTCAGTTCCTTTATATGACTTCAGGAAGTACACTGCATTTACYATACCTAGTATAAAYAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'PCF_Pat37_200101'         CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGCAGAAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGMAATGGAAAAGGAAGGGAAAATTTCAAGAGTTGGGCCTGAAAATCCATATAATACTCCAATATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt3011_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGTCAGAGGARAAAAAAGCATTARYAGAAATTTGTACAGAAATGGAAAAGGAAGGAAARATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCYATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGACTTCAGAGAACTTAATAAGAGAACTCAAGACTTYTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTGACAGTATTGGATGTGGGTGATGCATATTTTTCRGTTCCCTTAGATGAMTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAAYAATGAGACACCAGGAATTAGATATCAGTAYAATGTACTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt3013_200201'            CCCATTAGTCCTATTGACACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGCAGAAAAAAAAGCATTAGTAGATATTTGTACAGAAATGGAAAAGGAAGGGAAAATCTCAAAAATTGGGCCTGARAAYCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGAAAGTATACTGCATTTACMATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTYCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt3015_200201'            CCCATTAGCCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGARAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATCTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCYGCAGGGTTAAARAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCMTTAGATGACTTCAGAAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt3022_200201'            CCYATTAGTCCTATTGAAACTGTACCAGTAAAAAAACCAGGAATGGATGGCCCGAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTARTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAARATCTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTCAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTRACAGTACTAGATGTGGGTGATGCATACTTYTCAGTTCCMTTAGATGAATTCAGAAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt3029_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACARTGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGARGTTCAATTAGGAATACCCCATCCTGCAGGGTTAAAAAAGAAAAARTCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGACGAATTYAGGAAGTACACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGCTCACCAGCAATATT [...]
+	'Pt3031_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGGCAGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAGGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAGTTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTTTGGGAAGTGCAATTAGGAATACCACATCCTGCAGGGTTAAAAAGACAGAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTTAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGAATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt3042_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGTCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAACCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTCCAATTAGGAATACCACATCCGGCAGGATTAAAAAAGAAAAGATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCTTTAGATAGCTTCAGGAAGTATACTGCATTTACTATACCTAGTACAAACAATGAGACACCAGGAACTAGGTATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt3044_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAAGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAGAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGACGAATTCAGAAAGTATACTGCATTTACCATACCTAGTACGAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCGCCAGCAATATT [...]
+	'PCF_Pat36_200101'         CCAATCAGTCCTATTGAAACTGTGCCTGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAGATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTTCTAAATGGAGAAAATTAGTAGACTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'PCF_Pat35_200101'         CCCATTAGCCCTATTGAAACTGTACCRGTAAAAAAGCCAGGAATGGATGGCCCAAARGTTAAMCAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAARGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACCCAAGACTTTTGGGARGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTATTGGATGTGGGTGATGCATATTTTTCAGTTCCYTTAGATGACTTCAGGAAGTATACAGCATTTACCATACCTAGTACAAACAATGCGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt3060_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAGAGTTAAACAATGGCCATTGTCAGAAGAGAAAAGAGCATTAGTAGAAATTTGTACAGAAATGGAGAAGGAAGGAAAAATTTCAAAAATTGGGCCAGAAAATCCATACAATACTCCAGTATTTGCTATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAACAAGAGAACTCAAGAYTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAGGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt3062_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTGAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAGAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTTAGAGAACTTAATAAGAGAACTCAAGACTTTTGGGAAGTTCAATTAGGAATACCACACCCCGCAGGGTTAAAAAGGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGAAAGTATACTGCATTTACCATACCTAGTGTAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt3084_200201'            CCTATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTATTAGAAATCTGTGCAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATAYAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGATCTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGATTAAAAAAGAAGAAGTCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGATTTCAGGAAGTATACTGCATTCACCATACCTAGTTTAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGRTCACCAGCMATATT [...]
+	'PCF_Pat34_200101'         CCCATWAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAGAGTTAAGCAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATCTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAATATTTGCTATAAAGAAAAARGACAGTACTAAATGGAGAAAATTAGTAGATTTYAGRGAACTTAATAAGAAAACYCAAGACTTCTGGGAAGTYCAATTAGGRATACCACATCCCGCAGGGTTAAAAAAGAAAAARTCAGTAACAGTACTRGATGTGGGTGATGCATATTTYTCAGTTCCMTTAGATGAATTCAGRAAGTAYACTGCATTTACCATACCTAGTACAAACAATGCGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt3207_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGRATGGATGGRCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTTAGAGAGCTTAATAAGAGAACTCAAGATTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTAGGTGATGCATATTTTTCAGTTCCYTTAGATGACTTTAGGAAGTACACTGCATTTACCATACCCAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGCTCACCAGCAATATT [...]
+	'Pt3203_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTACAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCTTTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATCTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTGAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGAAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGRTTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt3198_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCAYTGACAGCAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATMTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATGACTTCAGAAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTCCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt3197_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAACCAGGAATGGATGGCCCAAGAGTTAAACARTGGCCATTGACAGAAGAAAAAAGAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAGATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGAYTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGACTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCTTTAGATGAMTTCAGGAAGTATACTGCATTTACCATACCTAGTGCAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt3196_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGTATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAGGAAAAGAAAGCATTARTAGAAATTTGTACAGAAATGGAAAARGAAGGRAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTCTTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTTTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTATTGGATGTGGGTGATGCCTAYTTTTCAGTTCCCTTAGATRATTTCAGGAAGTAYACTGCATTTACCATACCTAGTRYAAACAATGAGACACCAGGGRTTAGRTATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'PCF_Pat3_200101'          CCCATTAGTCCTATTGACACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAAYAGAAATCTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAGTTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAGCTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCATTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt3193_200201'            CCCATTAGTCCTATTGAAACTGTGCCAGTAAAAAAGCCAGGAATGGATGGTCCAAGAGTTAAACAGTGGCCATTGACAGAAGAAAAAAAAGCATTAATAGAAATTTGTGCAGAAATGGAAAAGGAGGGRAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCTATAAAGAAAAAAGACAGTACTAAGTGGAGAAAGCTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGARAAAATCAGTAACCGTGCTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTTAGAAAGTATACTGCATTTACCATACCTAGTACAAATAATGAGACACCAGGGATTAGATATCAGTACAATGTGYTACCACAAGGAGGATCACCAGCAATATT [...]
+	'Pt3188_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAGAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTARTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGATAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACGGTACTAGATGTAGGTGATGCATATTTTTCAGTTCCATTAGATGACTTCAGAAAGTATACTGCATTCACCATACCTAGTASAAACAATGAGACACCAGGGATTAGATATCAGTACAACGTGCTTCCACAAGGAGGATCACCAGCAATATT [...]
+	'Pt3185_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAMAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTTGATTTCAGGGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGATTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTACACTGCATTTACCATACCTAGCATAAACAATGAGACACCAGGGATTAGATATCAATACAATGTGCTTCCACAGGGAGGCTCACCAGCAATATT [...]
+	'Pt3244_200201'            CCCATTAGTCCTATTGAGACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACGCCAGTATTTGCCATAAAGAAAAAAGACAGTAMTAGATGGAGAAAACTAGTAGAYTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTCCAATTAGGAATACCACATCCCGCMGGATTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATAGCTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt3241_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGGATGGATGGCCCAAGAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAAYCCATACAATACTCCAGTATTTGCTATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGACTTCAGAGAACTTAATARGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGATTAAAAAAGAAAAAATCAGTAACAGTATTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATAGCTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt3239_200201'            CCTATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGYCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAAYAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAARGACAGTACTAAATGGAGGAAATTAGTAGATTTCAGAGAACTCAACAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAGGAAAARATCAGTAACAGTACTGGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATGAATTCAGGAAGTACACTGCATTTACAATACCTAGTACAAATAATGAGACACCAGGGWTGAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt3238_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAGAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTARTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCARTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTAGATGTGGGTGATGCATATTTTTCAGTTCCATTAGATGACTTCAGAAAGTATACTGCATTCACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAAGGAGGATCACCAGCAATATT [...]
+	'PCF_Pat28_200101'         CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAGTGGCCATTAACAGAAGAAAAAAAAGCATTAGTAGAAATTTGCACAGAAATGGAAAAGGAAGGGAAAATTTCAAAGATTGGGCCTGAAAACCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACRGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGCRTAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt3258_200201'            CCTATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAAYAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCARTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGGAAATTAGTAGATTTCAGAGAACTCAACAAGAGAACTCAAGAYTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTRCTGGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATGACTTCAGGAAGTACACTGCATTYACAATACCTAGTATAAATAATGAGACACCAGGGRTGAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt3263_200201'            CCCATTAGTCCCATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAATAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAGGAAAAAATCAGTGACAGTACTGGATATAGGTGATGCATATTTTTCAGTTCCCTTAGATAACTTCAGGAAGTATACTGCGTTCACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTCCCACAAGGAGGATCACCAGCAATATT [...]
+	'Pt3246_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGGATGGATGGGCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAATAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAACCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCGCACCCTGCAGGGCTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt3245_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAGAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAARATCTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAARGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACCCARGACTTCTGGGARGTTCAATTAGGAATACCACATCCTGCAGGATTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGRAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTATAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'PCF_Pat29_200101'         CCCATTAGTCCTATTGAAACTGTACCAGTRAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGARAAAAAAGCATTAATAGAAATCTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAATATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTRGATTTCAGRGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCAGCAGGGTTAAAAAAGAAGAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATGAATTCAGGAAGTAYACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt3211_200201'            CCCATTAGTCCTATTGAGACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAATAGAGATTTGTACAGAAATGGAAAAGGAAGGGAAAATTGAAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTACAAATAATGAGACACCAGGGATTAGATATCAGTACAACGTACTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt3208_200201'            CCTATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAGATTTGTACAGAGATGGAAAAGGAAGGGAAAATCTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAGTTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAAGCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGAAAGTATACTGCATTTACCATACCTAGTGTAAACAATGAGACACCAGGGATTAGATATCAATACAATGTGCTTCCACAAGGAGGATCACCAGCAATATT [...]
+	'Pt3212_200201'            CCCATTAGTCCTATTGACACTGTACCAGTAAAAAAGCCAGGGATGGATGGGCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTTAGAGAACTTAATAAAAGAACTCAAGATTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTAGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTTAGGAAGTACACTGCATTTACCATACCCAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGCTCACCAGCAATATT [...]
+	'Pt3216_200201'            CCCATTAGTCCTATTGAAACTATACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTARTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATATCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACGGTACTAAATGGAGAAAATTAGTAGATTTCAGAGACCTTAATAAGAGAACTCAAGACTTCTGGGAAGTCCAATTAGGAATACCACAYCCCGCAGGGTTAAAAAAGAAAAGATCAGTAACRGTACTGGATGTGGGTGATGCRTACTTTTCAGTTCCCTTAGATGACTTCAGAAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt3183_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGTATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAGGAAAAGAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTCTTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAARGAAAAAATCAGTAACAGTATTGGATGTGGGTGATGCCTATTTTTCAGTTCCCTTAGATGATTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt1468_200201'            CCTATTAGTCCTATTGAAACTGTACCAGTAAGAAAACCAGGAATGGATGGCCCAARAGTTAAACAATGGCCATTRMCAGAAGARAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAAGAAGGRAAAATTTCAAAAATTGGGCCTGAAAATCCATMCAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAARTTGGTAGATTTTAGAGAACTTAATAAAAGAACTCAAGATTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTAGGTGATGCATATTTTTCAGTTCCCTTACATGACTTCAGGAARTACACTGCATTTACCATACCTAGTACAAAYAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCGCCAGCAATATT [...]
+	'Pt1458_200201'            CCTATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAAGAAGGRAAAATTTCAAARATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTGGTAGATTTTAGAGAACTTAATAAAAGAACTCAAGAYTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTRACAGTACTRGATGTAGGTGATGCATATTTTTCAGTTCCCTTACATGACTTCAGGAAGTACACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGAATTAGATATCAGTACAATGTGCTTCCWCAGGGAGGATCGCCAGCAATATT [...]
+	'Pt1558_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAARCAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGRAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCMATAAAGAAAAAAGAYAGTACTAAGTGGAGAAAATTAGTAGATTTTAGAGAACTTAATAARAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCWGCAGGGTTAAAAAAGAAAAAGTCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAYTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt1561_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAARGTTAAACAATGGCCATTGACACAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAGATTGGGCCTGAAAATCCATAYAATACTCCAATATTTGCCATAAAGAAAAAAGACAGCACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAARGAAAAAATCAGTAACAGTACTGGATGTGGGTGACGCATACTTTTCAGTTCCCTTAGATGACTTCAGAAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAAGGAGGATCACCAGCAATATT [...]
+	'Pt1457_200201'            CCTATTAGTCCTATTGAAACTRTACCWGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACACAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTGGTAGATTTTAGAGAACTTAATAAAAGAACTCAAGATTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTAGGTGATGCATATTTTTCAGTTCCCTTACATGACTTCAGGAAGTACACTGCATTCACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTATAATGTGCTTCCACAGGGAGGATCGCCAGCAATATT [...]
+	'Pt1364_200201'            CCTATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAARAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAMATTTGTACAGAAATGGAAAAAGAAGGRAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTAGTAAATGGAGAAAATTGGTAGATTTTAGAGAACTTAATAAAAGAACTCAAGAGTTCTGGGAAGTTCAATTAGGAATACCACACCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTAGGTGATGCATATTTTTCAGTTCCCTTACATGATTTCAGGAAGTACACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCGCCAGCAATATT [...]
+	'Pt1308_200201'            CCTATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTCAAACAATGGCCATTGACAGCAGAAAAAAAAGCATTAGTAGAAATTTGYACAGAAATGGAAAAGGAAGGAAARATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAATATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTGGTAGATTTTAGAGAACTCAATAAGAGAACTCAAGATTTCTGGGAAGTTCAATTAGGAATACCACACCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTAGGTGATGCATATTTTTCAGTTCCCTTACATGACTTCAGGAAGTACACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATCAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt1365_200201'            CCCATTAGTCCTATTGACACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATCTCAAAAATTGGGCCTGAAAACCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAGTGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAGGTTCAATTAGGAATACCACATCCAGCAGGGTTAAAAAAGAAAAAATCGGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGAAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAAGGAGGATCACCAGCAATATT [...]
+	'Pt1454_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGMAGAAAAAAAAGCATTAGTAGAAATTTGTACAGARATGGAAAAGGAAGGGAAAATCTCAAAAATTGGGCCTGAAAAYCCATACAATACTCCARTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTCCAATTAGGAATACCACATCCYGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGAYGAMTTCAGAAARTATACTGCATTTACCATACCTAGYATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt3089_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGGCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGARAAGGAAGGAAAAATCTCAAAAATTGGGCCTGAAAACCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGGATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGAGATGCATATTTTTCAGTTCCATTAGATGACTTCAGAAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt3146_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGCAGAAAAAAAAGCATTAGTAGAAATTTGCACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAATATTCGCCATAAAGAAAAAAGACAGTACTAAGTGGAGAAAATTGGTGGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGATTAAAAAAGAAAAAGTCAGTAACAGTATTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGAGTTAGGTATCAGTACAATGTGCTCCCACAAGGAGGATCACCAGCAATATT [...]
+	'PCF_Pat30_200101'         CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGATGGTAMTAAATGGAGAAAATTGGTAGATTTCAGGGAACTTAATAAGAGAACTCAAGACTTTTGGGAGGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAGAAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGAAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTATAATGTGCTTCCACAGGGAGGATCACCAGCTRTATT [...]
+	'Pt3141_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAGAGTTAAACAGTGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAACCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCYGCAGGGTTAAAAMRGAAAAAATCAGTGACAGTACTGGATGTGGGTGATGCCTATTTTTCAGTTCCCTTAGATGACTTYAGAAAATATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGRTTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt3139_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAMCAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTRCAGAAATGGAAAAGGAAGGGAAAATCTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGAYGGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAARAGAACTCAAGACTTCTGGGAAGTTCAACTRGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGATTTYAGAAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt3151_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCCAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAGGCATTAATAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCTATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTYAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGATTAAAAAAGAAAACATCAGTAACAGTATTGGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATAGCTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGAATTAGATATCAGTATAATGTGCTCCCACAGGGAGGMTCACCAGCAATATT [...]
+	'Pt3169_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCRAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAATAGAAATTTGTGCAGAAATGGAAAAGGAAGGRAAAATTGAAAAAATTGGGCCTGARAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTRMTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAACAAGAGAACTCAAGATTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTRAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATACTTTTCAGTTCCATTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGT-TAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt3170_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAGGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATCTGTACAGAAATGGAAAAGGAAGGRAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACAAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTTTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGATTAAAAAGGAAAAGATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTTAGAAAATAYACTGCATTCACCATACCTAGYATAAACAATGAGACACCAGGAATTAGATATCAGTACAATGTACTTCCACAGGGAGGATCGCCAGCAATATT [...]
+	'Pt3164_200201'            CCCATTAGTCCTATTAAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGGCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGACCTGAAAACCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGGGAACTTAATAAGAGAACTCAAGATTTCTGGGAAGTTCAATTAGGAATACCRCATCCTGCAGGGTTAAAAAGGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGATTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTACCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt3159_200201'            CCCATTAGCCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGGCCAAAAGTTAAACAATGGCCACTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAARATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAATATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGGGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCTCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTACCACAGGGAGGATCRCCAGCAATATT [...]
+	'PCF_Pat31_200101'         CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAARGTTARRCAATGGCCATTGACAGAAGAAAAAAAAGCATTAWTRGAAATTTGTACAGAAATGGAAAAAGAAGGRAAAATYTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAGAAGAAAAAATCAGTAACAGTCCTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATAACTTTAGAAARTATACTGCATTTACCATACCCAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTGCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt3095_200201'            CCCATTAGTCCTATTGACACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCGTTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATCTCAAAAATTGGGCCTGAAAATCCCTAYAACACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTTAGAGAACTTAATAAGAGAACTCAAGATTTCTGGGAAATTCAGTTAGGGATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGCGATGCATATTTCTCAGTTCCCTTAGATGAGTTCAGGAAATATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGRTTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt3106_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGRAAAATCTCAAAAATTGGGCCTGAAAATCCATAYAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCMCATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTATTGGATGTRGGTGATGCATATTTTTCAGTTCCTYTAGATGACTTCAGAAAGTATACTGCATTCACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt3093_200201'            CCCATCAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAGTGGCCATTGACAGAAGAAAAAAAAGCATTAATAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTGAAAAGATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTRYAAACAATGCGACACCAGGGATTAGATATCAGTACAATGTACTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt3092_200201'            CCCATCAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAGTGGCCATTGACAGAAGAAAAAAAAGCATTAATAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTGAAAAGATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGCGACACCAGGGATTAGATATCAGTACAATGTACTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'PCF_Pat33_200101'         CCCATTAGTCCTATTGAAACTGTCCCAGTAAAAAAGCCAGGAATGGATGGTCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAATAGAAATTTGCACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACGGTACTAAATGGAGAAAATTAGTAGATTTTAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAACAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACTATACCTAGTACAAACAATGAAACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt3132_200201'            CCTATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAGATTTGTACAGAGATGGAAAAGGAAGGGAAAATCTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGAAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAATACAATGTGCTTCCACAAGGAGGATCACCAGCAATATT [...]
+	'Pt3133_200201'            CCCATTAGCCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAAGGGAAATTTGTACAGAAATGGAAAAAGAAGGGAAAATCTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACCAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGAYTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTCACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGATTTCAGAAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGACTAGATATCARTACAATGTGCTCCCACAGGGAGGATCACCAGCAATATT [...]
+	'PCF_Pat32_200101'         CCCATTAGTCCTATTGAAACTGTCCCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAATAGAAATCTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAACTAGGAATACCACATCCMGCAGGTTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTACAAATAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt3117_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGGCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCCTTARTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGACAATCCATACAATACTCCAATATTTGCCATAAAGAAAAARGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAGGTTCAATTAGGAATACCACATCCCGCAGGGCTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCTTTATATGATTTCAGGAAATATACTGCCTTTACCATACCTAGTACAAAYAATGAGACACCAGGGATTAGATATCAATACAATGTGCTCCCACAGGGAGGGTCACCAGCAATATT [...]
+	'Pt3586_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAGAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTGGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATCTCAAAAATTGGGCCTGAAAACCCATACAATACTCCAGTATTTGCCATAAAGAAAAARGACAGTACTAAATGGAGAAAATTAGTAGATTTTAGAGAACTTAATAAGAGAACTCAAGACTTTTGGGAAGTTCAATTAGGGATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGAAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAATACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt3504_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAGAAGGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATCTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACCCAAGACTTTTGGGAAGTTCAGTTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGAAAGTATACTGCATTTACAATACCTAGTAYAAACAATGAGACACCAGGGATTAGATATCAGTATAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'PCF_Pat22_200101'         CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCACTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAGAGTTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt3503_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAACCAGGAATGGATGGACCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATCTCAAAAATTGGGCCTGAAAACCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTTAGAGAACTTAATAAGAGAACACAAGACTTCTGGGAGGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTATTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGAAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCTATATT [...]
+	'Pt3347_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGACCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATCTCAAAAATTGGGCCTGAGAATCCATACAATACTCCAGTATTTGCYATAAAGAAAAAAGAYAGTACTAAATGGAGAAAATTAGTAGAYTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTYCAATTAGGAATACCACACCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTAGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGAAAGTATACTGCATTTACCATACCTAGTACAAATAATGAGACACCAGGRATTAGATATCAGTACAATGTGCTTCCACAAGGAGGATCACCAGCAATATT [...]
+	'Pt3507_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATYTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCYATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTYAGAGAACTTAATAAGAGAACTCAAGACTTYTGGGAAGTTCAATTAGGGATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGAYGACTTTAGAAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGAATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt3535_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATYTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGRGAACTTAATAAGAGAACTCAAGAYTTCTGGGARGTCCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAYATGACTTCAGAAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt3536_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATCTCAAAGATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTCAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATACTTCTCAGTTCCCTTAGATGACTTCAGAAAGTATACTGCATTTACTATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt3526_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAGAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATCTCAAAGATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTTAGAGAACTTAATAARAGAACTCAAGACTTCTGGGAAGTCCAATTAGGGATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACCGTACTGGATGTRGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACTATACCTAGTRTAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt3508_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGTATGGATGGCCCAAAAGTTAAACAATGGCCRTTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAARATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAARAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCTGGGTTACAAAAGAAAAAATCAGTGACAGTACTAGATGTGGGGGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGGGACACCAGGGATTAGATATCAGTACAATGTGCTCCCACAGGGGGGATCACCAGCAATATT [...]
+	'Pt3338_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGTCAGAGGAGAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGACTTCAGAGAACTTAATAAAAGAACTCAAGACTTYTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTGACAGTATTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTACTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'PCF_Pat24_200101'         CCCATTAGTCCTATTGATACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAARATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTCACCATACCTAGTATGAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTCCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt3310_200201'            CCCATTAGTCCTATTGACACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATCTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGATTTCTGGGAAGTTCAATTAGGGATACCACATCCCGCAGGGTTGAAAAAGAAAAAATCAGTAACAGTACTAGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGAAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt3304_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAGAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAACTGGAAGAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAACACWCCAATATTCGCTATAAAGAAAAARAACAGTACTAAATGGAGAAARGTAGTAGATTTCAGAGAGCTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAATTCCCCTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTGTAAACAATGAGACACCAGGAATAAGATATCAGTACAATGTACTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'PCF_Pat26_200101'         CCCATTAGTCCTATTGACACTGTACCAGTAAAAAAGCCAGGGATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAGAAAAAAGCATTARTAGAGATCTGTACAGAAATGGAAAAGGAAGGRAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTRTTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGARAACTCAAGACTTCTGGGAAGTYCAATTAGGRATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTYTCAGTTCCYTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGMGACACCAGGGATTAGATATCAGTACAATGTGCTKCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt3316_200201'            CCCATTAGTCCTATTRACACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCACTGACAGAAGAAAAAAAAGCATTAATAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAGATTTCAAAAATTGGGCCTGAAAATCCATACAATACCCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAACTAGTAGATTTTAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGATTAAAAAAGAAAAAATCAGTAACAGTACTAGATGTGGGTGATGCATATTTTTCAGTTCCCTTGGATAGCTTCAGGAAGTATACTGCATTTACAATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt7641_200201'            CCCATTAGTCCTATTGACACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATCTCAAAAATTGGGCCTGAAAACCCATACAATACTCCAATATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGATTTTTGGGAAGTTCAGTTAGGGATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCTTTAGATGACTTCAGAAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGGTTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt3327_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGGCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAGAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGGGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCAGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTCTCAGTTCCYTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATAYCAGTACAATGTGCTCCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt3322_200201'            CCCATTAGCCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTCAAACAATGGCCATTGACAGAAGAAAAAAAGGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTAAATAAGAGAACTCAAGACTTCTGGGAAGTKCAATTAGGAATACCACATCCCGCAGGATTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGACGACTTCAGGAAGTATACTGCATTTACCATACCTAGTRTAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt3318_200201'            CCCATTAGTCCTATTGAGACTGTACCAGTRAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATCTCAAAAATTGGGCCTGAAAAYCCATACAATACTCCARTATTTGCMATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTTAGAGAACTTAATAAGAGAACWCAAGACTTCTGGGAGGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTGACAGTACTAGATGTGGGTGATGCATATTTTTCAGTTCCCTTACATGACTTCAGAAAGTAYACTGCATTTACCATACCTAGTRCAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt3537_200201'            CCCATTAGCCCTATTGAGACTGTACCAGTAARAAARCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGRAAAATCTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTCCARTTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGAAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'PCF_Pat200_200101'        CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATCTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCTATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGARGTTCAATTRGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTATAAATAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt3565_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAACCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAAGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAARGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAAYAAGAGAACTCAAGACTTCTGGGAAGTTCAATTGGGAATACCACATCCCGCRGGGYTAAAAAAGAAAAAWTCAGTRACAGTACTRGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAMTTCAGRAAGTATACTGCATTCACCATACCTAGTAYAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAAGGAGGATCACCAGCAATATT [...]
+	'Pt3560_200201'            CCCATTAGTCCTATTGACACTRTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCACTGACAGAAGAAAAAAAAGCATTARTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATCTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTYCAATTAGGAATACCACATCCYGCAGGGTTAARAAAGAAAAAATCAGTAACAGTATTGGATGTGGGTGATGCATATTTTTCARTTCCATTAGATGACTTCCGAAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGRATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt3559_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATMTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAARGACAGTACTAAATGGAGAAAATTAGTAGATTTYAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTKCCCTTAGATGGCTTCAGAAAGTATACTGCATTTACCATACCTAGTATAAACAATGAAACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAAGGAGGATCACCAGCAATATT [...]
+	'Pt3568_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAGAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATCTCAAAAATTGGGCCTGAAAACCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGCGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTYTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCCTAGATGACTTCAGAAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTACTTCCACAGGGGGGTTCACCAGCAATATT [...]
+	'Pt3578_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAGATTTGTACAGAAATGGAAAAGGAAGGGAAAATCTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAATATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTCCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCTTTAGATGACTTCAGAAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGAATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt3585_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAGAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTGGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATCTCAAAAATTGGGCCTGAAAACCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTTAGAGAACTTAATAAGAGAACTCAAGACTTTTGGGAAGTTCAATTAGGGATACCACATCCTGCAGGGTTAAAAAAGAARAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGAAAGTATACTGCATTTACCATACCYAGTATAAACAATGAGACACCAGGGATTAGATATCAATACAATGTGCTKCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt3575_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGRAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATCTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGARRACCCAAGACTTCTGGGAAGTTCAATTAGGGATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGAAAGTATACTGCATTCACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt3571_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATCTCAAAAATTGGGCCTGAAAATCCATACAACACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTATTGGATGTAGGTGATGCATATTTTTCAGTTCCTCTAGATGACTTCAGAAAGTATACTGCATTCACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt3558_200201'            CCTATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAGATTTGTACAGAAATGGAAAAAGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACCCCAGTGTTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTYTGGGAAGTTCAATTAGGAATACCACACCCTGCAGGGTTAAAAAAGAAAAAATCCGTAACAGTACTGGATGTGGGTGATGCATACTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATGAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt3543_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGGCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAATAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGACCTGAAAACCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGGGAACTTAATAAGAGAACTCAAGATTTATGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAWTTCAGGAAGTATACTGCATTTACCATACCTAGTGTAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTACCACAGGGAGGATCACCAGCAATATT [...]
+	'PCF_Pat203_200101'        CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAGGGAAAGATTTCAAGAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGCACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTYTCAGTTCCCTTAGATGACTTCAGGAAGTAYACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'PCF_Pat21_200101'         CCTATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGASGAAAAAAAAGCATTAATAGAAATCTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTGTTTGCCATAAAGAAAAAAGACAGTGCTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATCCCCATCCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGACGACTTCAGGAAGTATACGGCATTTACCATACCTAGTACAAATAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt3538_200201'            CCTATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCTTTAGTGGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATCTCAAAAATCGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGGATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGAAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGRTATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt3549_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAGAAGGAAGGGAAAATCTCAAAGATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTTAGAGAACTTAACAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAGAAATCAGTAACAGTACTAGATGTGGGTGATGCCTACTTTTCAGTCCCCTTAGATGAMTTCAGAAAATACACTGCATTTACCATACCTAGTATAAACAACGAGACACCAGGGATTAGATATCAGTACAATGTACTTCCACAGGGAGGATCACCAGCGATATT [...]
+	'PCF_Pat201_200101'        CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGTATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAGGGTTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTCCAATTAGGCATACCACATCCCGCAGGATTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGACGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGGTTAGATATCAGTCCAATGTACTTCCACAGGGAGGATCACCTGCAATATT [...]
+	'Pt3555_200201'            CCCATTAGTCCTATTGACACTGTACCAGTAAAAAAGCCAGGGATGGATGGGCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTTAGAGAACTTAATAAGAGAACTCAAGATTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTAGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTTAGGAAGTACACTGCATTTACCATACCCAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGCTCACCAGCAATATT [...]
+	'PCF_Pat202_200101'        CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAGAGCATTAGTAGAAATCTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAGAATCGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAGTTCAGGAAGTATAMTGCATTNACCATACCTAGTATRRATAATGAGACACCAGGGATTAGATATCAGTACAATGTKCTGCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt3550_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGARAAGGAAGGGAAAATCTCAAAGATTGGGCCTGAAAATCCRTACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAACAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCYGCAGGGTTAAAAAAGAAGAAATCAGTAACAGTACTAGATGTGGGTGATGCCTAYTTTTCAGTTCCCTTAGATGACTTCAGAAAATATACTGCATTTACCATACCTAGTATAAACAAYGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCGATATT [...]
+	'Pt1298_200201'            CCTATTAGTCCCATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACARTGGCCATTGACAGARGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAARGACAGTACTAAATGGAGAAAATTGGTAGATTTTAGAGARCTTAAYAAAAGAACTCAAGATTTCTGGGAAGTTCAATTAGGAATACCACACCCCGSAGGGKTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTAGGTGATGCATATTTTTCAGTTCCCTTACATGATTTCAGGAAGTACACTGCATTYACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGKGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'04AR151516_200401'        CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCGAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAGGGAAAAATCTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCTATAAAGAAAAAAGACAGTACTAAGTGGAGAAAACTAGTAGATTTTAGAGAACTCAATAAGAGGACTCAAGACTTCTGGGAAGTCCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCTTTATATGACTTCAGGAAGTACACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTATAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'04AR151263_200401'        CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAGCAATGGCCATTGACAGAAGAAAAAAAAGCATTAACGGAAATTTGTGCAGAAATGGAAAAGGAAGGAAAAATTTCAAAGATTGGGCCTGAAAACCCATACAATACTCCAGTATTTGCTATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGGGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTGAAAAAGAAAAAATCAGTAACAGTATTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTCACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'04KJin8_1955_200401'      CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAGAAGGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCAGCTGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGAATTAGATATCAGTACAATGTGCTTCCACAGGGGGGATCACCATCGATATT [...]
+	'04KMH5_200401'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAGGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTTTTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGGGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCAGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGGGGGTCACCAGCGATATT [...]
+	'04AR143170_200401'        CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGACGGCCCGAAAGTTAAACAATGGCCCTTGACAGAAGAAAAAAAAGCATTAGTAGAAATCTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGGAAACTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTTTGGGAAGTCCAGTTAGGAATACCACATCCCGCAGGATTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATAGCTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCATCGATATT [...]
+	'03AR137681_200301'        CCCATTAGTCCTATTGAAACTGTACCAGTGAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAGAAAAAAGCATTAGTAGAGATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTTAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACACCCAGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCTTTAGATGACTTTAGAAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCGATATT [...]
+	'AP_ARRP010_200406'        CCAATTAGTCCTATCGAAACTGTACCGGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATCYGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAGGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTTAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAATTCAATTAGGAATACCACACCCTGCAGGGTTAAAGAAGAAAAAATCAGTAACAGTACTGGATGTGGGGGATGCATATTTTTCAGTGCCCTTAGATGAGTTCAGGAAATATACTGCATTTACCATACCTAGTGTAAACAATGAGACACCAGGGATTAGATATCAGTATAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'03AR138910_200301'        CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGCATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTTAGAGAACTTAATAAGAGAACCCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTTCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGAGATGCATATTTTTCAGTTCCCTTAGATGACTTCCGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGAATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'AP_ARRP011_200406'        CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAGGAAAAAAAAGCATTAGTAGAAATCTGTACAGAGATGGAGAAGGAAGGAAAAATTTCAAAAATCGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTCCAATTAGGAATCCCGCATCCCGCAGGGTTAAAAAAGAACAAATCAGTGACAGTACTAGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGATTTCAGAAAGTATACTGCATTTACCATACCTAGCACAAACAATGAGACACCAGGGATTAGATATCAGTATAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'04KYR8_200401'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAGAGTTAAACAATGGCCATTGACAGAAGAAAAAAAGGCATTAGTAGAAATTTGTACAGAAATGGAAAAAGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCTATAAAGAAAAAAGACAGTAATAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCAGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATACTTTTCAATTCCCTTAGATGACTTCAGGAAATATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGGGGATCACCAGCGATATT [...]
+	'05_132862_200401'         CCCATTAGTTCTATTGAAACTGTACCAGTRAAAAAGCCAGGAATGGATGGCCCAAAAGTYAARCAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGARATGGAAAAGGAAGGAAAAATTTCAAAAATTGGACCTGAAAATCCATACAATACACCAGTATTTGCTATAAAAAAGAAAGACAGTACAAAATGGAGAAAATTAGTAGATTTTAGAGAACTTAATAAGAGAACYCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTATTAGATGTGGGTGATGCATATTTTTCAGTTCCCTTGGACGAATTCAGRAAGTATACTGCATTTACTATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCARTACAATGTGCTTCCGCAGGGAGGATCACCAGCAATATT [...]
+	'05_132861_200401'         CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGCACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTCCAATTAGGAATACCACATCCCGCAGGATTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATACTTTTCAGTTCCCTTAGATGAATTCAGGAAATATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTCCCACAGGGAGGATCACCAGCAATATT [...]
+	'PCF_Pat42_200101'         CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGTCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATCTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGACCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTYCAATTAGGAATACCACATCCCGCAGGGTTRAAAAAGAAAAAATCAGTAACAGTACTRGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTYACCATACCTAGTACAAACAATGAGACACCAGGGATGAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'05_132864_200401'         CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAGAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAATGGAAATTTGTGCAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACACCCCGCAGGGTTAAAAAAGAACAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAATAATGAGACACCAGGAATCAGATATCAGTACAATGTACTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'05_132860_200401'         CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCACTAACAGAGGAAAAAAAAGCATTGGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAATATTGGATGTGGGTGATGCATACTTTTCAGTTCCTTTAGAYGAGTTCAGGAAATATACTGCCTTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAACGTACTTCCGCAAGGKGGATCGCCAGCAATATT [...]
+	'04RU139095_200401'        CCCATTAGTCCTATTGAAACTGTACCCGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAATATTTGCCATAAAGAAAAAAGACAGTACAAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAGTTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATACTTCTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGCATAAACAATGAGACACCAGGGGTTAGGTATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'04LSK7_200401'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAACCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAGGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCAGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGGGGATCACCAGCGATATT [...]
+	'04WK7_HIV_1_wk_200401'    CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAGGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCTATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGATTTCTGGGAAGTTCAATTAGGAATACCACATCCAGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAGTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGGGGATCACCAGCGATATT [...]
+	'PCF_Pat41_200101'         CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTGGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTATAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'02THOUR847I_200201'       CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAAGAAGGGAAAATTTCAAAAATCGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTTAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGGATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCTGTAACAGTCCTGGATGTGGGTGATGCATATTTCTCAGTGCCTTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'01UYTRA1179_200101'       CCCATTAGTCCTATTGAAACTGTACCAGTGAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAGGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAGAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAAACGCCAGGAATTAGATATCAGTACAATGTGCTGCCACAAGGAGGATCACCAGCAATATT [...]
+	'01UYTRA1092_200101'       CCCATTAGTCCTATTGAAACTGTACCAGTGAAAAAGCCAGGAATGGATGGCCCAAAAGTCAAACAATGGCCATTGACAGAAGAGAAAAAAGCATTAGTAGAAATTTGTACAGAGATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAATATTTGCCATAAAGAAGAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCAGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTCTCGGTTCCTTTAGATGAATTCAGAAAGTATACTGCATTTGCCATACCTAGTACAAACAATGAGACACCAGGGATCAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCGATATT [...]
+	'02AR114146_200201'        CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTRGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATCTCAAAAATTGGGCCTGAAAATCCATACAACACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGGAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGATTAAAGAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCCTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCGATATT [...]
+	'02AR115455_200201'        CCCATTAGTCCTATTGAAACTGTACCAGTAAAGAAGCCAGGAATGGATGGTCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATATGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGATTTTTGGGAGGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGGGATGCATATTTTTCAGTCCCCTTAGATGAATTCAGGAAGTACACTGCATTCACCATACCTAGTACCAACAATGAAACACCAGGAATTAGGTACCAGTACAATGTGCTTCCACAGGGAGGGTCACCAGCAATATT [...]
+	'01UYTRA1020_200101'       CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATCTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCTATAAAGAAAAAAGACAGTACTAAATGGAGGAAATTAGTAGATTTTAGAGAACTTAATAAAAGAACTCAAGACTTTTGGGAGGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAAGCAGTAACAGTACTGGATGTGGGGGATGCATACTTTTCAGTCCCCTTAGATGAGTTCAGGAAGTACACTGCATTCACCATACCTAGTGTCAACAATGAGACACCAGGAGTTAGGTACCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'JLB_Pat1_200006'          CCTATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAGGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAGTGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAATTCAATTAGGAATACCACATCCCGCCGGGTTAAAAAAGAAAAAATCAGTGACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTACACTGCATTTACCATACCTAGTCAAAACAATGAGACACCAGGGATTAGGTATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'LV17HALD_199801'          CCCATCAGTCCTATTGAAACAGTGCCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTTTGGGAAATTCAATTAGGGATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTGTAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTGCCACAGGGAGGATCACCAGCAATATT [...]
+	'HND_DRPI039_200401'       CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGGCCAAAAGTTAAGCAATGGCCACTGACAGAAGAGAAAAAGGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTTTTCGCTATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGGACTCAAGAATTCTGGGAAATTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAATATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGAGTTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCGGCAATATT [...]
+	'PCF_Pat39_200101'         CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGGCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATCTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGADAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTATTGGATGTGGGTGATGCATATTTTTCAGTTCCYTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTGCCACAGGGAGGATCACCAGCAATATT [...]
+	'02BR002_200401'           CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAATTGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAATTCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGAGTTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCGGCAATATT [...]
+	'02HNsmx2_200201'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATCGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAGTGGAGAAAATTAGTAGATTTCAGGGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAGGAAAAAATCTGTAACAGTCCTGGATGTGGGTGATGCATATTTCTCAGTTCCTTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTGTAAACAATGAGACACCAGGGATCAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'02HNsc11_200201'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGGGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTTCTGGATGTGGGTGATGCATATTTCTCAGTCCCTTTAGATGATTTCAGGAAGTATACTGCATTTACCATACCTAGTGTAAACAATGAGACACCAGGGATCAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'02HNsq4_200201'           CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATAGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTGGATTTCAGGGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGATTGAAAAAGAAAAAATCCGTAACAGTCCTGGATGTGGGTGATGCATATTTTTCAGTCCCTTTAGATGACTTCAGGAAATATACTGCATTTACCATACCTAGTGTAAACAATGAGACACCAGGGATCAGATATCAGTACAATGTGCTTCCACAGGGAGGACCACCAGCAATATT [...]
+	'02THOUR740I_200201'       CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGTCAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAACCCATACAATACTCCAGTATTTGCTATAAAGAAAAAAGACAGTACTAAATGGAGGAAATTAGTAGATTTTAGAGAACTTAATAAAAGAACGCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAACAGAAAAAATCTGTAACAGTTCTGGATGTGGGTGATGCATATTTCTCAGTTCCTTTAGATGACTTCAGAAAGTATACTGCATTTACTATACCTAGTGTAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'02BR013_200401'           CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAACCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCTATAAGGAAAAAAGGCAGTGATAGATGGAGAAAATTAGTAGATTTCAGGGAACTTAATAAGAGAACTCAAGACTTTTGGGAAGTCCAATTGGGAATACCACATCCCGGAGGGTTAAAAAAGAAAAAATCAGTAACAGTATTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATAAATTCAGGAAGTATACTGCATTTACTATACCTAGCACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'PCF_Pat40_200101'         CCCATTAGTCCTATTGAAACTGTACCAGTAAARAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCYTTGACAGAAGAAAAAAAAGCATTAGTAGAAATCTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAATATTTGCTATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAGACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTAGATGTGGGTGATGCATATTTTTCAGTTCCMTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAATAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'PCF_Pat4_200101'          CCTATTAGTCCTATTGAAACTGTCCCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAATAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAGTTAGTAGACTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCGGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTATTGGATGTGGGTGATGCATATTTTTCAGTTCCTCTAGATGAMTTCAGGAAGTATACTGCATTTCCCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'02BR008_200401'           CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTGAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCTTTACATGACTTCAGAAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTGCCACAGGGAGGATCACCAGCAATATT [...]
+	'02BR011_200401'           CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAGAATTGGGCCTGAAAATCCATACAATACTCCAATATTTGCCATAAAGAAAAAGAACAGTACTAGATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGATTTCTGGGAGGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCGGGGATTAGGTATCAGTACAATGTGCTCCCACAGGGAGGATCACCAGCAATATT [...]
+	'05_132865_200401'         CCTATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCTAAAGTTAAACAATGGCCATTAACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTACAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGGATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTGCTGGATGTGGGCGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTATAATGTGCTCCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt1205_200201'            CCTATTAGTCCTATTGAAACTRTACCAGTAARAAAGCCAGGAATGGATGGCCCAAGAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAAGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCARTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTGGTAGATTTTAGAGARCTTAATAAAAGAACTCAAGATTTYTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTAGGTGATGCATATTTTTCAGTTCCCTTACATGACTTCAGGAAGTACACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCRCCAGCAATATT [...]
+	'Pt1197_200201'            CCTATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAGAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGRAAAATTTCAAAAGTTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATGATTTCAGAAAGTACACTGCATTTACCATACCTAGCATAAACAATGAGACACCAGGGRTTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'LV716MAU_199901'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGGCCAAGAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATCTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAGAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTAGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGGTATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt1219_200201'            CCTATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGTCAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAAGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTGGTAGATTTTAGAGAACTTAATAAAAGAACTCAAGATTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTAGGTGATGCATATTTTTCAGTTCCCTTACATGAYTTYAGGAAGTACACTGCATTTACCATACCTAGTACAAACAATGAAACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCGCCAGCAATATT [...]
+	'Pt1190_200201'            CCTATTAGTCCTATTGAAACTGTACCAGTAAGAAAGCCAGGAATGGATGGCCCAAAGGTCAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAAGAAGGGAAAATTACAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTGGTAGATTTTAGAGAACTTAATAAAAGAACTCAAGATTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTAGGTGATGCATATTTTTCAGTTCCCTTACATGAYTTCAGGAAGTACACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCGCCAGCAATATT [...]
+	'Pt1112_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTARTRGAAATYTGTGCAGAGATGGAAAAGGAAGGGAARATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAATATTTGCCATAAAGAAAAAAGACAGTTCTAAATGGAGAAAGTTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTAGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATGATTTCAGGAAGTATACTGCATTCACCGTACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCGCCAGCAATATT [...]
+	'Pt1110_200201'            CCTATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAAGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCARTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTGGTAGATTTTAGAGARCTTAATAAAAGAACTCAAGATTTCTGGGAAGTTCAATTAGGAATACCACACCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTRGATGTAGGTGATGCATATTTTTCAGTTCCCTTACATGACTTCAGGAAGTACACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt1146_200201'            CCCATTAGYCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGGCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAATRGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGACCTGAAAACCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGGGAACTTAATAAGAGAACTCAAGATTTATGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAWTTCAGGAAGTATACTGCATTTACCATACCTAGTGTAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTACCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt1186_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAGAGTTAAACARTGGCCATTAACAGAAGAGAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAGATTGGGCCTGAAAACCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGAYTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTGGGAATACCMCATCCCGCAGGGTTAAAAAAGAACAAATCAGTAACAGTGCTGGATGTGGGTGATGCATATTTTTCAGTYCCCTTAGATAACTTCAGGAAGTATACTGCATTTACYATACCTAGTGTGAATAATGAAACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt1220_200201'            CCTATTAGTCCTATTGAAACTGTACCAGTAAGAAAGCCAGGAATGGATGGCCCAAAGGTCAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAAGAAGGGAAAATTACAAAAATTGGGCCTGAAAATCCRTACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTGGTAGATTTTAGAGAACTTAATAAAAGAACTCAAGATTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTAGGTGATGCATATTTTTCAGTTCCYTTACATGAYTTCAGGAAGTACACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCGCCAGCAATATT [...]
+	'Pt1274_200201'            CCCATYAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGTCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGRCCTGAAAATCCATAYAATACTCCAATATTTGCCATAAAGAAAAAAGACAGTACYAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAAYAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACAYCCKGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTCTCAGTTCCCCTAGATRAATTTAGAAAGTATACTGCATTCACCATACCTAGTACAAACAATGAGACACCAGGRATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt1266_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAKTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCTATAAAGAAAAAAGACAGCACAAAATGGAGAAAGTTAGTAGATTTCAGAGAACTTAATAAGAGGACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGATTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGYACACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTGCCACAAGGAGGATCACCAGCAATATT [...]
+	'Pt1280_200201'            CCTATTAGTCCCATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGCAGAAAAAMAAGCATTAGTAGAAATTTGTACAGAAATGGAAAARGAAGGRAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTGGTAGATTTTAGAGAACTTAATAAAAGAACTCAAGATTTYTGGGARGTTCAGTTAGGAATACCACATCCYGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTAGGTGATGCATATTTTTCAGTTCCCTTACATGACTTYAGGAARTACACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCGCCAGCAATATT [...]
+	'Pt1281_200201'            CCTATTAGTCCYATTGAAACTGTACCAGTAAGAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGARATTTGTMCAGAAATGGAAAARGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAARGACAGYACTAAATGGAGAAAATTGGTAGATTTTAGAGAACTTAATAAAAGAACYCAAGATTTCTGGGAAGTTCAATTAGGAATACCACAYCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTRGATGTAGGTGATGCATATTTTTCAGTTCCCTTACATGACTTYAGGAAGTACACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCGCCAGCAATATT [...]
+	'Pt1264_200201'            CCCATYAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGTCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGRCCTGAAAATCCATAYAATACTCCAATATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAAYAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACAYCCKGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTCTCAGTTCCCCTAGATGAATTTAGAAAGTATACTGCATTCACCATACCTAGTAAAAACAATGAGACACCAGGAATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt1241_200201'            CCCATTAGTCCTATTAAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTARACAATGGCCATTGACAGAAGAAAAAAAAGCATTARTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAARATTTCAAAAATTGGGCCTGAAAACCCATACAATACTCCAGTATTTGCCATAAAGAAAAARGACAGTACTAAATGGAGAAAACTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAGTTAGGAATACCACATCCCGCAGGRTTAAAAAAGAARAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAATTCCTTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt1222_200201'            CCTATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGTCAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAAGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTGGTAGATTTTAGAGAACTTAATAAAAGAACTCAAGATTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTAGGTGATGCATATTTTTCAGTTCCCTTACATGAYTTYAGGAAGTACACTGCATTTACCATACCTAGTACAAACAATGAAACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCGCCAGCAATATT [...]
+	'Pt1254_200201'            CCTATTAGTCCTATTGAAACTGTACCTGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTGGTAGATTTTAGAGAACTTAATAAAAGAACTCAAGATTTCTGGGAAGTYCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTAGGTGATGCATATTTTTCAGTTCCCTTRCATGACTTCAGGAAGTACACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt1255_200201'            CCTATTAGTCCTATTGAAACTGTACCTGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATWTGTACAGAAATGGAAAAGGAAGGRAAAATTTCGAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTGGTAGATTTTAGAGAACTTAATAAAAGAACTCAAGATTTCTGGGAAGTYCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTAGGTGATGCATATTTTTCAGTTCCCTTRCATGACTTCAGGAAGTACACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTAYAATGTGCTTCCACAGGGAGGATCRCCAGCAATATT [...]
+	'Pt1080_200201'            CCTATTAGTCCTATTGAAACTGTACCAGTAAGAAAGCCAGGAATGGATGGCCCAAAGGTTAAACAATGGCCATTGACAGAAGAAAAAAARGCATTAGTAGAAATTTGTACAGAAATGGAAAAAGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTGGTAGATTTTAGAGAACTTAATAAAAGAACTCAAGATTTCTGGGAAGTTCAATTAGGAATACCACATCCMGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTAGGTGATGCATATTTTTCAGTTCCCTTACATGACTTCAGGAAGTACACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'05_132876_200401'         CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGRCCCAAAAGTTAAACAATGGCCATTGACAGAAGAGAAAAAAGCATTAGTAGAAATCTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGYCTGAAAATCCGTATAATACTCCAGTATTTGCCATAAAGAAAAARGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAACAAGAGAACTCAAGACTTCTGGGAAGTTCAGTTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTACACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGAATTAGATATCAGTACAATGTGCTTCCGCAGGGAGGATCACCAGCAATATT [...]
+	'05_132873_200401'         CCCATTAGTCCTATKGAAMCTGTACCAGTAAAAAAACCAGGAAKGGATGGCCCAAARGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACCCCAGTATTTGCTATAAAGAAGAARGACAGTACTAAATGGAGAAAATTAGTAGAYTTCAGAGAACTTAATAAGAGAACTCAAGATTTTTGGGAAGTTCAATTAGGAATACCACATCCCGCTGGGTTAAAAAAGAAAAAATCAATCACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAGTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'05_132877_200401'         CCCATTAGCCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGTCCAAAAGTTAAACAATGGCCATTGACAGAGGAAAAAAAAGCATTAGTAGACATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAGTTGGGAATACCACACCCCTCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTTGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGATTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAATAATGAAACACCAGGGATTAGATATCAGTACAATGTGCTCCCACAGGGAGGATCACCAGCAATATT [...]
+	'LV22HALD_199801'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATCTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCTCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTGCCACAAGGGGGATCACCAGCAATATT [...]
+	'05_132870_200401'         CCTATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACACCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCATTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTGTGAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAAGGAGGATCACCAGCAATATT [...]
+	'05_132867_200401'         CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAARTCAAACAATGGCCATTGACAGARGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGACTTTAGAGAGCTCAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTGAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTYTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTAYAATGTGCTTCCACAGGGAGGATCACCAGCAATTTT [...]
+	'05_132866_200401'         CCTATTAGTCCTATTGAAACCGTACCAGTAAAAAAGCCAGGAATGGATGGGCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAATGGAAATTTGTGCAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAGAACCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAACTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAWTCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCTTTAGACGAATTCAGRAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCATCAATATT [...]
+	'PCF_Pat43_200101'         CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTCAAACAATGGCCATTGACAGAAGAAAAAAGAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTACAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGGAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTGCTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGACGAATTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'05_132869_200401'         CCCATTAGTCCTATTGAAACTGTACCAGTGAAAAAGCCAGGAATGGATGGCCCAAGAGTTAAACAATGGCCATTGACAGAAGAGAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAGATTGGGCCTGAAAATCCATACAATACTCCAGTGTTTGCYATAAAGAAAAAAGACAGTACTAAATGGAGAAAGTTAGTGGATTTCAGAGAACTTAATAAGAGAACTCAAGATTTCTGGGAARTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAACAAATCAGTAACAGTACTGGATGTGGGAGATGCATATTTTTCAATTCCATTAGATGATTTCAGGAAGTATACTGCATTTACCATACCTAGCACGAACAATGGGACGCCAGGAATTAGATATCAGTACAATGTGCTTCCACAAGGAGGGTCACCAGCAATATT [...]
+	'LV65HPD_199801'           CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCCTTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGACTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGCTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTAGGTGATGCATATTTTTCAGTTCCTTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCCAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTACTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'PT_VE8_199301'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAGCAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTGTTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGTTTAAAAAAGAAAAAATCAGTAACAGTACTAGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGAAAGTACACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTACTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'PT_VE7_199301'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAGAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGCGGAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAGTCAGTAACAGTACTGGACGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGGCTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGGTCACCAGCAATATT [...]
+	'Pt1025_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTAACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATCTCAAAAATTGGGCCTGAAAATCCGTACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAGTTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTGTTAGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATAACTTCAGAAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt1054_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAACCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATCTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGATTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGAAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATAAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'PCF_Pat38_200101'         CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTGCAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGATGGTACTAAATGGAGAAAATTAGTGGACTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAACAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTATAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'LV713GUE_199901'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGATTTCTGGGAAGTCCAATTAGGAATACCACATCCTGCAGGATTAAAAAAGAAGAAATCAGTGACAGTCCTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGATTTCAGAAAATATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'LV712GRI_199901'          CCCATTAGTCCTATTGAAACTGTACCAGTAAGAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAGGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAGAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCTTTAGACGAATTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTCCCACAGGGAGGATCACCAGCAATATT [...]
+	'PT_VE1_199301'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAACAGAAATTTGTACTAAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAATATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTTTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGTGTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCTTTAGATGACTTCAGGAAATATACTGCATTTACCATACCTAGTGTAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCGATATT [...]
+	'PT_VE5_199301'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAGGCATTAGTAGAAATTTGTACAGAAATGGAGAAGGAAGGAAAAATTTCAAAAATTGGACCTGAAAATCCATACAATACTCCAGTATTTGCTATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGGGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTGCTGGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGAATTAGATATCAGTACAATGTGCTGCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt3632_200201'            CCCATTAGTCCTATTGACACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAATAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATYTCAAAAATTGGGCCTGAAAACCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGATGGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAARAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTGACAGTACTGGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATGACTTCAGAAAATATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt5077_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGAYGGCCCAAAAGTTAAACAATGGCCATTRACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGRAAAATCTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAGTTAGTAGATTTCAGAGAACTTAATAARAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTAGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGAAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACTCCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt5076_200201'            CCCATTAGTCCCATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGACCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAATAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATCTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAATATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTGRCAGTACTGGATGTAGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTTAGAAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACGCCAGGGGTTAGATATCAGTACAATGTACTTCCACAAGGAGGATCACCAGCAATATT [...]
+	'Pt5078_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAARGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGRAAAATCTCAAAAATTGGGCCTGAAAATCCATAYAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTATTGGATGTRGGTGATGCATATTTTTCAGTTCCTYTAGATGACTTCAGAAAGTATACTGCATTYACCATACCTAGTATAAACAATGAGACACCAGGRRTTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt5081_200201'            CCCATTAGTCCTATTGAYACTGTACCAGTAAAGAAGCCAGGAATGGATGGTCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAGAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTTGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCATTAGACGACTTYAGAAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGGGGATCACCAGCAATATT [...]
+	'Pt5073_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTARYAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATWTCAAAAATTGGGCCTGAAAATCCATACAATACTCCARTATTTGCCATAAAGAAAAAAGATAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCYKCAGGGTTRAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGACGAYTTCAGAAAGTATACTGCATTTACCATACCTAGTGTAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTCCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt5060_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAACCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTCCAATTAGGAATACCACATCCTGCAGGATTAAAAAAGAGAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCTTTAGATAGCTTCAGGAAGTATACTGCATTTACTATACCTAGTACAAACAATGAGACACCAGGGATTAGGTATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'PCF_Pat180_200101'        CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAACAGAAATCTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAACCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAACTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAATTCCCTTAGATGACTTCAGGAAATATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATGAGATATCAGTATAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt5066_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTGAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATAYAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGGAAAYTAGTTGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTTTGGGARGTTCARTTAGGAATACCACATCCCGCAGGATTRAAAAAGAAAAAATCAGTAACAGTACTAGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATAGCTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCCCAGGGGGGATCACCAGCAATATT [...]
+	'PCF_Pat18_200101'         CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAGCAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATCTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAAYTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAGTCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAVTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt5085_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAACCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAAGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAARGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAAYAARAGAACTCAAGACTTCTGGGAAGTTCAATTRGGAATACCACATCCCGCRGGGYTAAAAAAGAAAAAWTCAGTRACAGTACTRGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAMTTCAGRAAGTATACTGCATTYACCATACCTAGTAYAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACARGGAGGATCACCAGCAATATT [...]
+	'Pt5117_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTARTAGAAATTTGTACAGAAATGGAAAAGGAGGGGAAAMTCTCAARGATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGACTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATTCCACATCCYGCAGGGTTAAAAAAGAAGAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGAAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTYCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt5114_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCAYTGACAGAAGAAAAAAAAGCATTAATAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAARGATAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTTTGGGAAGTTCAATTAGGAATACCACATCCMGCAGGRTTAAARAAGAAAAAATCAGTAACAGTRCTRGATGTGGGTGATGCATATTTTTCAGTTCCCYTATATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCRCAGGGAGGATCACCAGCAATATT [...]
+	'Pt5130_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAACAGAAATCTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAAYCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACAAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTCCAATTAGGCATACCCCACCCGGCAGGGYTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTCCCCTTAGATGAATTTAGAAAATATACTGCATTTACCATACCTAGTACAAAYAATGAGACACCAGGGATTAGATATCAGTACAATGTACTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt5143_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAATAGAGATTTGTACAGAAATGGAAAAGGAAGGRAAAATTGAAAAGATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAARAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGATTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTCTCAGTTCCCTTGGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTATAAATAATGAGACACCAGGGATTAGATATCAGTACAACGTACTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt5113_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGGATGGATGGCCCAAAAGTTAAGCAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAGGGAAAAATCTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCAGCAGGGTTRAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTGCCCTTAGACGACTTCAGAAAGTATACTGCATTTACCATACCTAGTGTAAATAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTCCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt5092_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAARGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGATAGCACTAAATGGAGGAAACTAGTAGACTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCTCAGGATTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTGCCCTTAGATGACTTCAGGAAGTAYACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTRCTTCCACAGGGAGGATCACCAGCGATATT [...]
+	'PCF_Pat179_200101'        CCCATAAGTCCTATTGAAACTGTACCAGTAAAAAAACCAGGAATGGATGGCCCAAGAGTTAAACAATGGCCACTGACAGAAGAAAAGAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAGATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAATATTTGCCATAAAGAAAAAAGATAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAGAAATCAGTAACAGTRCTAGATGTGGGAGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt5100_200201'            CCCATTAGTCCCATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTCAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATMTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAATATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACCCAAGACTTTTGGGAAGTTCAATTAGGGATACCACATCCCGCAGGATTAAAAAAGAAAARATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAATTCCCTTATATGACTTCAGGAAGTATACTGCATTCACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTCCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt5109_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAGAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAATAGACATTTGTACAGAAATGGAAAAGGAAGGGAAAATCTCAAAAATTGGGCCTGAAAATCCTTACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGATTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGCTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATACTTTTCAGTTCCCTTAGATGAATTCAGAAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt5042_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGGCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATCTCCAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGATTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTCTCAGTTCCCTTACATGACTTCAGAAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAAGGAGGATCACCAGCAATATT [...]
+	'Pt4619_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTARTAGAAATCTGTACAGAAATGGAAAAGGAAGGGAAAATYTCAAAGATTGGGCCTGAAAAYCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTTTGGGAAGTTCAATTAGGAATACCACATCCYGCAGGATTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTYAGAAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGRTATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt4617_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAGAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATCTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGAAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAAGGAGGATCACCAGCAATATT [...]
+	'Pt4629_200201'            CCTATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTGAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATCTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTTAGAAAATATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt4632_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATCTCAAAAATTGGGCCTGAAAATCCATACAACACTCCARTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGARCTTAATAAGAGAACTCAAGATTTCTGGGAAGTTCAACTAGGGATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGACGACTTCAGAAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACRCCAGGGATTAGATATCAATACAATGTGCTTCCACAGGGAGGGTCACCAGCAATATT [...]
+	'Pt4616_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAGAGTTAAACAATGGCCAYTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATCTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGAAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAAGGAGGATCACCAGCAATATT [...]
+	'Pt4598_200201'            CCCATTAGTCCTATTGAAACTGTACCWGTAAAAAAACCAGGAATGGATGGCCCAAGAGTTAAACAATGGCCATTGTCAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATCTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCYATAAAGAAAAAAGACAGTACTAAATGGAGGAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGRATACCACATCCMGCAGGDYTAAAAAAGAARAAATCAGTAACAGTAYTGGATGTGGGTGATGCATATTTTTCAGTKCCYYTAGATGACTTTAGAAAGTATACTGCATTTACCATACCTAGTATAAACAATGARACACCAGGGATTAGATATCAGTACAATGTGCTWCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt4582_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTGARAAAGCCAGGACAAGATGGCCCAAAAGTTAAACAGTGGCCATTGACAGAAGAAAAAAAGGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCARTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTGAAAAAGAAGAAATCAGTAACAGTACTGGATGTGGGTGATGCATACTTTTCAGTTCCCTTACATGACTTCAGGAAGTATACTGCATTTACCATACCYAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGGTCACCAGCAATATT [...]
+	'Pt4601_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAGAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTARTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAARTTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGATAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAARAGAACTCAAGAGTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTGAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACTATACCTAGTGTAAACAATGAGACACCAGGGATCAGATATCAGTACAATGTGCTTCCACAGGGAGGATCMCCAGCAATATT [...]
+	'PCF_Pat184_200101'        CCTATCAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATCTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCAATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACCCAAGACTTCTGGGAAGTGCAATTAGGAATACCACATCCCGCAGGGTTGAAAAAGAAAAAATCAGTAACCGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTAYACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt4640_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGACCAAAAGTTAAACAATGGCCAYTGACAGAAGAAAAAAAAGCATTAWTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGACCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGATAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGATTAAAAAAGAAAARATCAGTGACAGTACTAGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGAAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'PCF_Pat182_200101'        CCCATTAGTCCTATTGAACCTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATCTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAGAGTTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAGAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCTCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTAGATGTGGGTGATGCATATTTTTCAGTTCCCCTAGATGAATTCAGGAAATATACAGCATTCACCATACCTAGTATAAATAATGAGACACCAGGGACCAGATATCAGTACAATGTGCTGCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt5033_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTCAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTAGTAAATGGAGAAAGCTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGATTTCTGGGAAGTTCAATTAGGAATACCACATCCAGCAGGATTAAAAAAGAAAAAATCAGTGACAGTACTGGATGTGGGAGATGCATATTTTTCAGTTCCCTTAGATAGTTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTACTTCCACAAGGAGGATCACCAGCAATATT [...]
+	'Pt5035_200201'            CCCATTAGTCCTATTGAMACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAGAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAARATCTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAARGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACCCAAGACTTCTGGGARGTTCAATTAGGAATACCACATCCTGCAGGRTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGRAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTATAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'PCF_Pat181_200101'        CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAGGTTAAACAATGGCCACTGACAGAAGAAAAGAAAGCATTAGTAGAAATCTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTRGTAGATTTCAGAGAACTTAATAARAGAACTCAAGATTTCTGGGAAGTTCAATTAGGAATACCACATCCCKCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCYTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTATAAATAATGAGACACCAGGGATTAGATATCAGTATAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt5023_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGGATGGATGGCCCAAAAGTTAAGCAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTRCAGAAATGGAAAAGGAGGGAAAAATCTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTGCCCTTAGACGACTTCAGAAAGTATACTGCATTTACCATACCTAGTGTAAATAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTCCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt5015_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAARGTTAAACAATGGCCATTGACAGAAGAAAAGAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATCTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTRTTTGCCATAAAGAAAAARGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACYCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTAYTGGATGTGGGTGATGCCTATTTTTCAGTTCCCTTAGATGACTTCAGAAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt5005_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCTATAAAGAAAAAAGACAGCACTAAATGGAGAAAACTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGACTTTTGGGAAGTTCAATTAGGAATACCCCATCCCGCAGGATTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTATAATGTGCTTCCACAAGGAGGATCACCAGCAATATT [...]
+	'Pt5017_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAGGAAAAAAAAGCATTAAGAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCAATAAAGAAAAAAGACAGTACYAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTCCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAGAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTAYACTGCATTTACTATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCRCCAGCAATATT [...]
+	'Pt5021_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGACGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATCTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAGTTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTCCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTAGATGTGGGTGATGCATATTTTTCAGTTCCCTTRGATGAATTCAGAAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACTCCAGGGATTAGATATCAGTAYAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt5152_200201'            CCCATTAGTCCTATTGAGACTGTACCAGTAAAAAARCCAGGAATGGATGGCCCAARAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAACCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAARAGAACTCAAGACTTCTGGGAAGTCCAGTTAGGAATACCACATCCTGCAGGATTAAAAAAGAGGAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCTTTAGATAGCTTCAGGAAGTATACTGCATTTACTATACCTAGTACAAACAATGAGACACCAGGGATTAGGTATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt5683_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAGTGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAGAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGATTTCTGGGAAGTTCAATTAGGAATACCACATCCAGCAGGGTTAAAAAAGAAAAAATCAGTGACAGTACTGGATGTGGGTGATGCATATTTTTCAGTCCCTTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTACTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'PCF_Pat175_200101'        CCTATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAGGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGAAGAAATCTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGGTATCAGTACAATGTGCTTTCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt5690_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAGAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATCTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAACTAGTAGATTTTAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAGAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGAAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATACCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt5694_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAARAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAGAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGRAAAATCTCAAAAATTGGGCCTGAAAATCCATACAATACCCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGATTTCTGGGAAGTTCAATTAGGGATACCACATCCCGCAGGGTTAAAAAAGAARAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGAAAGTATACTGCATTTACCATACCTAGTATAAAYAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt5650_200201'            CCCATTAGTCCTGTTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAGAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAATAGAAATTTGTACAGATATGGAAAAGGAGGGGAAAATTTCGAAAATTGGGCCTGAAAATCCATATAATACTCCAGTGTTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGACTTCAGAGAACTTAATAAAAGAACTCAAGAGTTCTGTGAAGTTCAATTAGGAATACCACATCCCGCGGGGTTAAAAAAGAAAAAATCAGTAACAGTATTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAATATACTGCATTTACCATACCTAGTGTAAACAATGAGACACCCGGGATTAGATATCAATACAATGTACTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt5620_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAACCAGGAATGGATGGYCCAAGAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAATAGAAATTTGTACAGAAATGGAAAAGGAAGGRAAAATYTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGYACTAAGTGGAGRAAACTAGTAGATTTYAGAGARCTTAATAAGAGAACTCAAGAYTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGRTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATAACTTCAGAAAGTATACTGCATTYACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt5611_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTRAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAATAGAAATTTGTACAGAAATGGAAAAGGAAGGRAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTTTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGATTAAAAAAGAAAAAATCAGTAACAGTAYTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTAYACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'PCF_Pat176_200101'        CCCATTAGTCCTATTGAMACTGTACCAGTAAAAAAACCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAGAGCATTAATAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGACTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCTTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATGAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt5643_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGGATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAATAGAAATATGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTCAATAAGAGAACTCAAGATTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTTCTGGATGTAGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGAAAGTATACTGCATTTACCATACCTAGTATGAACAATGAGACACCAGGGATTAGATATCAGTACAACGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'PCF_Pat174_200101'        CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGRAAAATTTCAAAAATCGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTTAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCHGTAACAGTCCTGGATGTGGGTGATGCATATTTCTCAGTTCCTTTAGATGACTTYAGGAAGTATACTGCATTTACCATACCTAGTGTAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'PCF_Pat173_200101'        CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAACAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCARTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTTTGGGARGTTCAATTAGGAATACCACATCCYGCAGGGTTAAAAAAGAAAAAATCAGTAACMGTACTGGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATGACTTCAGGAAGTWCACTGCATTTACYATACCTAGTACAAACAATGAGACACCAGGGACTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCGATATT [...]
+	'Pt5739_200201'            CCCATTAGTCCTATTGACACTGTACCAGTAAAAAAGCCAGGAATGGATGGTCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAARGAAGGTAAAATATCAAAAATTGGACCTGAAAATCCATACAATACTCCAGTGTTTGCCATAAAGAAAAAAGATGGTACTAAATGGAGAAAATTAGTAGATTTCAGAGARCTTAATAAGAGAACTCAAGACTTCTGGGAARTTCAATTAGGAATACCACATCCCGCAGGBTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCTTTAGATGACTTCAGAAAGTACACTGCATTTACYATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCGCAGGGAGGATCACCAGCAATATT [...]
+	'Pt5757_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAATAGAAATATGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACYAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGATTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAGGAAAAAATCAGTAACAGTACTGGATGTAGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGRAAGTATACTGCATTTACCATACCTAGTATGAACAATGAGACACCAGGGATTAGATATCAGTACAACGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt5762_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAGAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATYTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGATAGTACTAAATGGAGAAAACTAGTAGATTTTAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTGCTGGATGTGGGTGATGCATACTTTTCAGTTCCCTTAGATGAATTCAGAAAGTATACTGCATTTACCATACCTAGTRTAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt5737_200201'            CCCATTAGCCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTAACAGAAGAAAAAAAAGCATTAGTAGAAATATGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGATTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCMTATTTTTCAGTTCCCYTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt5715_200201'            CCCATTAGTCCTATTGACACTGTACCAGTAAAAAAGCCAGGAATGGATGGTCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTRGTAGAAATTTGTACAGAAATGGAAAAGGAAGGTAAAATATCAAAAATTGGACCTGAAAATCCATACAATACTCCAGTGTTTGCCATAAAGAAAAAGGACGGTACTAAATGGAGAAAATTAGTAGATTTYAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAATTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATAYTTTTCAGTTCCTTTAGATGACTTCAGAAAGTACACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCGCAGGGAGGATCACCAGCAATATT [...]
+	'Pt5709_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAGAGTTAAACAATGGCCATTAACAGAAGAGAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATCGGGCCTGAAAACCCATACAATACTCCAGTATTTGCTATAAAGAAAAAAGAYAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGAGTTCTGGGAAGTCCAGTTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCRGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGACGACTTCAGGAAGTATACTGCATTCACCATACCTAGTGTGAATAATGAAACACCAGGGATTAGATATCAGTATAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt5717_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTGAAAAAGCCAGGAATGGATGGCCCAAGAGTTAAACAATGGCCATTAACAGAAGAGAAAAAAGCATTAGTAGAAATTTGCACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATCGGGCCTGAAAACCCATACAATACTCCAGTATTTGCTATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGAGTTCTGGGAAGTCCAGTTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGACGACTTCAGGAAGTATACTGCATTCACCATACCTAGTGTAAATAATGAAACACCAGGGATTAGATATCAGTATAATGTACTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt5719_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAGCAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATCTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACAAAGTGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGATTTCTGGGAAGTTCAATTAGGGATACCACATCCCTCAGGGTTAAAAAGGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAGTTCAGAAAGTATACTGCATTCACCATACCTAGTAGAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt5603_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAGAGTTAAACAATGGCCATTGACAGAAGAAAAGAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATCTCAAGAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAACTAGTAGATTTTAGAGAACTTAATAARAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCYGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGACGAATTCAGAAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGGGGATCACCAGCAATATT [...]
+	'Pt5190_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAGGTCAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATCTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAGGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGAAAGTATACTGCATTTACCATACCCAGTRTAAACAATGAGACACCAGGAATTAGATATCAGTACAATGTGCTCCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt5177_200201'            CCYATTAGTCCTATTGACACTGTACCAGTAAAAAAGCCAGGAATGGATGGSCCAAGAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAACACTCCAATATTCGCTATAAAGAAAAARGACAGTACTAAATGGAGAAAATTGGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTGTAAATAATGAGRCACCAGGGATAAGATATCAGTAYAATGTGCTTCCACARGGAGGATCACCAGCAATATT [...]
+	'PCF_Pat178_200101'        CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAGAATTGGGCCTGAAAATCCATATAATACTCCAATATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCYGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt5198_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAGATCTCAAAAATTGGGCCTGAAAATCCATACAATACACCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAGTTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGAAAGTATACTGCATTTACCATACCTAGTAGAAACAATGAGACACCAGGAGTTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt5175_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAARGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAGCTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCGCATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCATTAGATAACTTTAGAAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAATACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt5160_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAARAGTTAAACAATGGCCATTGACAGAAGARAAAAAAGCATTARTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATCTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTTTGGGAAGTTCAATTAGGAATACCACATCCCGCGGGRCTAAAAAGGAAAAAATCAGTAACAGTACTAGATGTGGGTGATGCATATTTTTCAGTYCCCTTACATGACTTCAGAAAGTATACTGCATTCACCATACCTAGTACAAATAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAAGGAGGATCACCAGCAATATT [...]
+	'Pt5157_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATCTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAGTTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTCCAATTGGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTAGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGCACAAACAATGAGACACCAGGGATTAGATATCAGTATAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt5162_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGAAGAAATTTGTGCAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAACTAGTAGATTTCAGAGAGCTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGATTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCTTTACATAGCTTCAGGAAGTAYACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt5170_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAGAAGGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATCTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAATATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTYAGAGAACTTAATAAGAGAACCCAAGACTTTTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTGCTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGAAAGTATACTGCGTTTACCATACCYAGTACAAATAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt5206_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCCTTGACAGAAGAAAAAAAAGCATTAYTAGAAATTTGTACAGAAATGGAAAAGGAAGGRAAAATCTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGACTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACAYCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTAGATGTGGGTGATGCATATTTTTCAGTGCCCTTAGATGACTTCAGAAAGTACACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAAGGAGGATCACCAGCAATATT [...]
+	'Pt5256_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGRAAAATCTCAAAAATTGGGCCTGAAAACCCATACAATACACCAGTATTTGCCATAAAGAAAAAAGACAGYACTAAATGGAGRAAGTTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGAAAGTATACTGCATTTACCATACCTAGTRTAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt5255_200201'            CCCATAAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGGATGGATGGGCCAAAAGTCAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAATATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTCAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCGCCAGCAATATT [...]
+	'PCF_Pat177_200101'        CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAGAAAAAAGCATTAGTAGAAATTTGTGCAGAAATGGAAAAAGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCTATAAAGAAAAAAGATAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAGAAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAGAAATCAGTAACAGTATTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt5543_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAGAGTTAAACAATGGCCATTGACAGAAGAAAAGAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATCTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAACTAGTAGATTTTAGAGAACTTAATAAGAGAACTCAGGACTTTTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAGTCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTGCCCTTAGATGAATTCAGAAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt5248_200201'            CCTATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAGATTTGTACAGAGATGGAAAAAGAAGGGAAAATCTCAAAAATTGGGCCCGAAAATCCATACAATACTCCAGTGTTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAGTTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAGATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGAAAGTATACTGCATTTACCATACCTAGTGTAAATAATGAGACACCAGGGATTAGATATCAATACAATGTGCTTCCACAAGGAGGATCACCAGCAATATT [...]
+	'Pt5229_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACACAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTGAAAAAGAAAAGGTCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACYATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTGCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt5207_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATCTCAAAAATTGGACCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAGGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAATATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGARTTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt5234_200201'            CCCATTAGTCATATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCCTTAATAGAAATTTGCAAAGAGATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCTATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAGCTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAGTTAGGAATACCACATCCCGCAGGATTAAAAARGAAAARATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTACATAGTTTCAGAAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGGTATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt5246_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAARGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATCTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACAAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTYTGGGAAGTTCAACTAGGAATACCACATCCTGCAGGATTAAAACAGAAAAAATCAGTAACAGTRCTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTTAGAAAATACACTGCATTCACCATACCTAGTATAAACAATGAGACACCAGGAATTAGATATCAGTACAAYGTACTTCCACAGGGAGGATCGCCAGCAATATT [...]
+	'Pt4581_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAGAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTARTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAACACTCCAATATTYGCTATAAAGAAAAAAGACAGTACTAAATGGAGAAAACTAGTAGATTTCAGAGAGCTTAATAARAGAACTCAAGACTTTTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAARAAGAAAAAATCAGTAACAGTATTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTRTAAACAATGAGACACCAGGGATAAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'PCF_Pat194_200101'        CCCATTAGTCCTATTGAAACTGTMCCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGHCAGAAGAAAAAAAAGCATTAGTAGAAATCTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAGATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCTTTAGATGAATTCAGRAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTATAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt3797_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAARCCAGGAATGGATGGCCCAAAAATTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGRAAAATCTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAATATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAGCTTAATAAGAGAACTCAAGACTTCTGGGAAGTCCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATACTTTTCAGTTCCCTTAGATGATTTCAGAAAGTATACTGCATTTACYATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt3799_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAGGGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATATCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAGGAGAAAATCAGTAACAGTACTAGATGTRGGTGATGCATACTTTTCAGTTCCCTTGGATGACTTTAGAAARTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAAGGAGGATCACCAGCAATATT [...]
+	'Pt3801_200201'            CCTATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATCTCAAAAATTGGGCCTGAAAATCCATACAATACKCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTCAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCYTTAGATGACTTYAGRAAGTAYACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAATACAATGTGCTTCCACAAGGAGGATCACCAGCAATATT [...]
+	'Pt3785_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGGATGGATGGCCCAAGAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAGATGGAAAAGGAAGGGAAAATCTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTGAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGAAAGTATACTGCATTCACCATACCTAGTACAAACAATGAAACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATTTT [...]
+	'Pt3759_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAARAGTGAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAGAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTYAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATACTTTTCAGTTCCCTTAGATGACTTCAGAAAGTACACTGCATTTACCATACCTAGTATAAATAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTGCCGCAGGGAGGATCACCAGCAATATT [...]
+	'Pt3753_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGACCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTCAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTGACAGTACTGGATGTGGGTGATGCATACTTCTCAGTTCCCTTAGATGACTTCAGAAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt3772_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTAACAGRGGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATYTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACAAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTATTGGATGTGGGTGATGCATATTTCTCRGTTCCCTTAGATGARTTCAGAAAGTATACTGCATTCACCATACCTAGTATAAACAATGAGACACCAGGAATTAGATATCAATACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt3784_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGYCCAAAAGTRAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTARTAGAAATTTGTACAGAAATGGAAAAGGAAGGRAAAATTTCAAAAATTGGGCCTGAGAATCCCTACAATACTCCAGTATTTGCTATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGACTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTGACAGTACTGGATGTGGGTGATGCATACTTTTCAGTTCCCTTAGATGACTTCAGAAAGTATACTGCATTTACAATACCTAGTACAAATAATGAGACMCCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGRTCACCAGCAATATT [...]
+	'Pt3816_200201'            CCCATAAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCACTGACAGAAGAAAAAAAGGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCTATAAAGAAAAAAGACAGCACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGATTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGATTAAAAAAGAAAAAATCAGTAACGGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTACATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGAATTAGATATCAGTATAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt3848_200201'            CCCATTAGTCCTATAGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGTCAGAAGAGAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGAYTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTAGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTGCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt3837_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGYCCAAAAGTGAAACAGTGGCCATTGACAGAAGAAAAGAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTTTGGGAAGTTCAATTAGGAATACCTCACCCTGCAGGTTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATRACTTCAGAAAGTATACTGCATTCACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt4014_200201'            CCTATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAGGTTAAACAATGGCCACTGACAGAAGAGAAAAAAGCATTACTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGACCTGAAAATCCATACAATACYCCAGTGTTTGCTATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAGGAAAAAATCAGTAACAGTACTGGATGTGGGAGATGCATATTTCTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACGCCAGGGATTAGATATCAGTACAATGTACTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'PCF_Pat193_200101'        CCCATTAGTCCTATTGARACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTARTAGAAATCTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCYGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTATAAATAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt3833_200201'            CCCATTAGTCCTATTGACACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTAAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATCTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTTAGAGAACTTAATAAGAGAACTCAAGATTTCTGGGAAGTTCAGTTAGGGATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGCGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt3829_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTRGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATCTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCMATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTAAGAGAACTTAATAAGAGAACTCAAGAYTTCTGGGAAGTTCARTTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTAYTGGATGTGGGTGATGCATATTTTTCAGTACCCYTAGAYGAATTCAGAAAGTATACTGCATTTACCATACCTAGTATAAACAATGCGACACCAGGGGTTAGATATCAGTACAATGTGCTTCCACAAGGAGGATCACCAGCAATATT [...]
+	'Pt3819_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGGGAACTTAATAAGAGAACTCAAGATTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATACTTTTCAGTTCCCTTAGATGACTTCAGAAAGTACACTGCATTTACTATACCTAGTGTAAACAATGAGACACCAGGGATTAGGTATCAATACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt3831_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAGAGTTAGACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTGAAGAAATGGAAAAAGAGGGAAAAATTTCAAAAATAGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGRAAATTAGTAGATTTCAGAGAACTTAATAAGAGGACTCAAGACTTYTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGATTAAAAAAGAAAAAATCAGTAACAGTACTRGATGTRGGTGATGCATATTTTTCAATTCCCTTAGATAGCTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt3832_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAKTAGAAATTTGTACAGAAATGGAAAAGGAAGGRAAAATCTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTTAGAGAACTTAATAARAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGATTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGAAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt3750_200201'            CCCATTAGTCCTATTGAAACTGTACCRGTAAAAAARCCAGGAATGGATGGGCCAAAARTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAAYACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAACTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCTTTAGATGAATTTAGAAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATACCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'PCF_Pat197_200101'        CCAATCAGTCCTATTGAAACTGTACCTGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'PCF_Pat198_200101'        CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAGATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAAYTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTYCAATTAGGAATACCACATCCYGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTATTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAAGGAGGATCACCAGCAATATT [...]
+	'Pt3693_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAATAGAAATTTGTRCAGAAATGGAAAAGGAAGGAAAAATCTCAAAAATTGGGCCTGAAAACCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGAYGGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCMGCAGGGTTAAAAAAGAAAAAATCAGTGACAGTACTRGATGTGGGTGATGCATATTTYTCAGTTCCYTTAGATGACTTCAGAAAATATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTRCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt3694_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAATAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAACCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGATGGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTGACAGTACTGGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATGACTTCAGAAAATATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt7640_200201'            CCCATTAGTCCTATTGACACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTTCAGAAATGGAAAAGGAAGGGAAAATCTCAAAAATTGGGCCTGAAAACCCATACAATACTCCAATATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGATTTTTGGGAAGTTCAGTTAGGGATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCTTTAGATGACTTCAGAAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGGTTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt3640_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAATAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGGGAACTTAATAAAAGAACTCAAGATTTCTGGGAAGTCCAACTAGGAATACCACATCCTGCAGGGTTAAAAAGGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATACTTTTCAGTTCCCTTAGATGACTTCAGAAAGTATACTGCATTTACCATACCTAGTGTAAACAATGAGACACCAGGGATTAGATATCAATAYAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt3635_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGTCAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTTAGAGAACTTAATAAGAGAACTCAAGACTTMTGGGAARTTCAATTAGGAATACCACATCCCGCAGGATTAAARAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATGAATTCAGRAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGGTATCAGTATAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt3652_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAGAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATCTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAACTAGTAGATTTTAGAGAACTTAATAARAGAACTCAAGACTTCTGGGAAGTTCAGTTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGAAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGRGGATCACCAGCAATATT [...]
+	'Pt3684_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATCTCAAAAATTGGGCCTGAGAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTTCTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGATTTCTGGGARGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCYTTAGATGAATTCAGAAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGRTTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt3705_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAACAAAGCCAGGAATGGATGGCCCAAGAGTTAAACAATGGCCATTAACAGAAGARAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATCGGGCCTGAAAACCCATACAATACTCCAGTATTTGCTATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGATTTCTGGGAAGTCCAGTTAGGAATACCACATCCTGCAGGGTTRAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGACGACTTCAGGAAGTATACTGCATTCACCATACCTAGTGTGAATAATGAAACACCAGGGATTAGATATCAGTATAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt3736_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAMAAGCATTAATAGAAATTTGTGCAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAACCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGATGGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAARGAAAAAATCAGTGACAGTACTGGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATGACTTCAGRAAATATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt3734_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAARAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATCTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAATATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTYTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGYTAAAAAGGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGAAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAAGGAGGATCACCAGCAATATT [...]
+	'Pt3737_200201'            CCCATTAGTCCTATTGACACGGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAATAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAACCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGATGGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTCCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTGACAGTACTGGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATGACTTCAGAAAATATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt7639_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAARCCAGGAATGGATGGCCCAAGAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCACTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATWGGGCCTGAAAAYCCATAYAATACTCCAGTATTTGCTATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGCTAAAAAGGAAGAAATCAGTAACAGTACTAGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGRAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTCCCGCAGGGAGGATCACCAGCAATATT [...]
+	'Pt3732_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTARTAGAAATTTGTACAGAAATGGAAAAGGAAGGRAAAATCTCAAAAATTGGGCCTGAAAAYCCATACAATACTCCAGTATTTGCYATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCYGCAGGGTTRAAAAAGAAAAAATCAGTAACAGTACTRGATGTGGGTGATGCATATTTTTCAGTYCCCTTAGATGACTTCAGAAARTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTRCTTCCACAAGGAGGATCACCAGCAATATT [...]
+	'PCF_Pat196_200101'        CCCATTAGTCCTATTGAAACTGTACCAGTGAAAAAGCCAGGAATGGATGGACCAAGAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGCACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAACCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGRATACCACATCCCTCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAATATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTYCCACAGGGAGGATCGCCAGCAATATT [...]
+	'Pt3715_200201'            CCTATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAGATGGAAAAGGAAGGRAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTGGTAGATTTTAGAGAACTTAATAAGAGAACTCAAGATTTCTGGGAAGTTCAATTAGGAATACCACATCCYGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTAGATGTAGGTGATGCATATTTTTCAGTTCCCTTACATGACTTCAGGAAGTACACTGCATTTACCATACCTAGTAYAAACAATGAGACACCAGGGRTTAGATATCAGTATAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt3722_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGRAAAATMTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTTAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGATTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGAAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt3728_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAGGTTAAACAATGGCCATTAACAGAAGAAAAAAAAGCATTRGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACCCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGATTTCTGGGAAGTGCAATTAGGAATACCACATCCYGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGAATTAGATATCAGTATAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'PCF_Pat192_200101'        CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATCTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAGAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTCCAATTAGGAATACCACATCCCGCAGGGTTAAAGAAGAAAAAATCAGTAACAGTACTAGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTACACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATGAGATATCAGTATAATGTGCTCCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt4529_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATCTCAAAAATTGGGCCTGAAAACCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGTTTAAAAAAGAAAAAATCARTAACTGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATAACTTCAGAAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGARTTAGATATCAGTACAATGTGCTTCCACAAGGAGGATCACCAGCAATATT [...]
+	'Pt4527_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAARAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGARAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATCTCAAAGATTGGGCCTGAGAATCCATACAATACTCCAATATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGATTTCTGGGAGGTTCAGTTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGAAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGGTTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt4530_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAGAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAACACTCCAATATTTGCTATAAAGAAAAAAGACAGTACTAAGTGGAGAAAACTAGTAGATTTCAGAGAGCTTAATAAGAGAACTCAAGACTTTTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTATTGGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTGTAAACAATGAGACACCAGGGATAAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'PCF_Pat186_200101'        CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAACGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAACAGAAATCTGTGCAGACATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGARAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTAGATGTGGGTGATGCATACTTTTCAGTTCCCTTAGATGAATTCAGAAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt4524_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAGGTTAAACAATGGCCATTGACAGAGGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACCAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACCCAAGACTTCTGGGAAGTTCAAYTAGGAATACCACATCCYGCAGGGTTAAARAAGAAAAAATCAGTWACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACTATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTKCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt4248_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTGAAAAAGCCAGGRCAGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAGGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAARTTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTTTGGGAAGTKCAATTAGGAATACCACAYCCTGCAGGGTTAAAAAGACAGAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTYAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGAATWAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt4242_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGMCCAAAAGTTAAACAATGGCCATTAACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGRAAAATCTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGRACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTAYTRGATGTGGGTGATGCATATTTTTCAGTTCCYTTAGATGACTTCAGRAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'PCF_Pat187_200101'        CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGARATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAARGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCAGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTAYACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt4522_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTRACAGAAGAAAAAAAAGCMTTAGTAGAAATYTGTACAGARATGGAAAAGGAAGGRAAAATTTCAAAAATTGGGCCTGARAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAARAGAACTCAAGACTTYTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTRACAGTRCTGGATGTGGGTGATGCATATTTTTCAGTTCCTCTAGATGACTTCAGGAAGTATACTGCATTTACCATACCYAGTATAAACAATGARACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCATCAATATT [...]
+	'Pt4536_200201'            CCCATTAGTCCTATTGAAACTRTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGRAAAATCTCAAAAATTGGGCCTGAAAATCCGTACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGRGAACTTAATAARAGAACTCAAGACTTCTGGGAAGTCCARTTAGGAATACCRCATCCYGCAGGGTTAARAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGAAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGRATTAGGTATCAGTACAATGTGCTTCCACAAGGAGGATCACCAGCAATATT [...]
+	'Pt4564_200201'            CCCATTAGCCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAGAAAAAAGCATTAGTSGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATCTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTTAGAGAACTTAATAAGAGAACYCAAGACTTCTGGGAAGTTCAATTAGGGATACCACATCCCKCAGGGTTAAAAAGGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATGACTTCAGAAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATACCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCTATATT [...]
+	'PCF_Pat185_200101'        CCYATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGTCAGAAGAAAAAAAAGCATTAGTAGAAATCTGTACAGAAATGGAAAAGGAAGGRAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTRTTTGCYATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAAYTAGGAATACCACATCCYGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTYACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt4567_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAGGTTAAACAATGGCCATTGACAGAGGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACCAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACCCAAGACTTCTGGGAAGTTCAACTAGGAATACCACATCCCGCAGGGTTAAAAARGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACTATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt4580_200201'            CCTATTAGTCCTATTGAAACTGTACCAGTAARAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAAYAGAAATTTGTACAGARATGGARAAAGAAGGGAAAATTTCAAAAATTGGGCCTGAGAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTGGTAGATTTTAGAGAACTTAATAAAAGAACTCAAGATTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTAGGTGATGCATATTTTTCAGTTCCCTTACATGACTTCAGGAAATACACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGGTTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCGCCAGCAATATT [...]
+	'Pt4559_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGTATGGATGGCCCAAAAGTTAAACAGTGGCCACTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGRGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCTGGGTTAAARAAGAAAAAATCAGTGACAGTACTAGATGTGGGGGATGCATATTTYTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGARACACCAGGGATTAGATATCAGTACAATGTGCTCCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt4543_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAGAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGGGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGATTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATACTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTYACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt4537_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAGGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATCTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTGTTTGCTATAAAGAAAAAAGACAGTACTAAATGGAGAAAACTAGTAGATTTCAGAGAGCTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGGGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGAAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGCATTAGATATCAGTACAATGTGCTTCCACAAGGAGGATCACCAGCAATATT [...]
+	'Pt4546_200201'            CCCATTAGYCCTATTGAAACTGTACCAGTCAAAAAGCCAGGAATGGATGGCCCAARAGTAAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAGGGGAAAATTTCAAAAATTGGGCCTGAGAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTYTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAGAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTACCCTTAGATGAATTCAGAAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCGGCAATATT [...]
+	'Pt4555_200201'            CCCATYAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAACTAGGAATACCACATCCTGCAGGGTTAAAAARGAAAAGATCAGTGACAGTACTGGATATAGGTGATGCATATTTTTCAGTTCCCTTAGATARCTTCAGGAAGTATACTGCRTTCACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'PCF_Pat188_200101'        CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGGCAGAAGAAAAAAAAGCATTAATAGAAATCTGTACAGAAATGGARAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAARGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAATTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt4076_200201'            CCCATTAGTCCTATTGACACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAGAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATCTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTYTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTTACAGTAYTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGATTTCAGAAAGTATACTGCATTTACCATACCTAGTASAAACAATGMGACACCAGGGATTAGATATCAGTATAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt4075_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGTCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTATTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATCACAAAAATTGGGCCTGAAAACCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGATTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTAGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATGACTTCAGAAAGTATACTGCATTTACCATACCTAGTACCAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCGCCAGCAATATT [...]
+	'Pt4079_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGTCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTATTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATCACAAAAATTGGGCCTGAAAACCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAARAGAACTCAAGATTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTAGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATGACTTCAGAAAGTATACTGCATTTACCATACCTAGTACCAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCGCCAGCAATATT [...]
+	'Pt4105_200201'            CCCATTAGTCCTATTGACACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGACCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAWCTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAACTAGGAATACCACATCCGGCAGGGTTAAAAAAGAAAAAGTCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTTAGAAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt4074_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGTCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTATTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATCACAAAAATTGGGCCTGAAAACCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAARAGAACTCAAGATTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTAGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATGACTTCAGAAAGTATACTGCATTTACCATACCTAGTACCAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCGCCAGCAATATT [...]
+	'Pt4055_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTAACAGAAGAAAAAAAAGCATTAATGGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTYGCTATAAAAAAGAAAGACAGCACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGATTAAAAAAGAAAAGATCRGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTYCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTASAAACMATGAGACACCAGGAATTAGATATCAGTAYAATGTGCTGCCACAGGGAGGGTCACCAGCAATATT [...]
+	'Pt4043_200201'            CCTATTAGTCCCATTGAAACTGTACCAGTGAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGTCAAAAGAAAAAAAAGCATTAGTAGAAATTTGTTCAGAAATGGAAAAGGAAGGAAAAATCTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCTATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTTAGAGAACTTAATAAGAGAACTCAAGATTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAGAAAAGAACAAATCAGTAACAGTACTAGATGTAGGTGATGCATATTTTTCAGTTCCCTTATATGACTTCAGGAAGTACACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATCAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt4059_200201'            CCYATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGARAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGRAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGAYAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAARAGAACTCAGGACTTCTGGGARGTTCAATTAGGAATACCACATCCCTCAGGATTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGATTTCAGRAAATATACTGCATTTACCATACCYAGTATAAACAATGAGACACCAGGAATCAGRTATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'PCF_Pat191_200101'        CCCATTAGTCCTATTGAAACTGTRCCAGTAAAAAAGCCAGGRATGGATGGCCCAAAAGTTAAACAATGGCCATTGRCAGAAGAAAAAAAAGCATTAATGGAAATTTGTACAGAAATGGAAAAGGAAGGRAAAATTTCAAAAATTGGGCCTGATAACCCATACAATACTCCAGTATTTGCMATAAAGAAAAAAGMCARKRCTAAATGGAGAAAATTAGTAGATTTCAGAGAACTGAATAAGAGAACCCAAGACTTCTGGGAAGTTCAATTAGGAAAACCACATCCCGCAGGGYTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTACACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTYCACMGGGAGGATCACCAGCAATATT [...]
+	'PCF_Pat190_200101'        CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGGCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAACCCATATAATACTCCAATATTTGCTATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTAAATAAGAAAACTCAAGACTTYTGGGAAGTTCAATTAGGAATACCACATCCYGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTYTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt4213_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATCTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCTATAAAGAAAAAGGACAGYACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAGGAGAACTCAAGACTTTTGGGAAGTTCAACTAGGAATACCACATCCCTCAGGGTTAAAGAAGAAAAAATCAGTAACAGTACTAGATGTGGGTGATGCATATTTTTCAGTTCCTTTAGATGACTTCAGAAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGGTTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt4176_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCGAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTAAAGAAATGGAAAAAGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAGTTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTGGGAATACCACATCCYGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTYTCAGTTCCCTTAGATGATTTYAGGAAGTATACTGCATTTACCATACCTAGTGTAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt4217_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAGAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATCTCAAGAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGGAAATTAGTAGATTTYAGAGAACTTAATAAGAGAACCCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGATTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGARACACCAGGGATTAGATATCAGTATAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt4234_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATCTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAATATTTGCCATAAAGAAAAAGGACAGTACCAAATGGAGAAAATTAGTAGATTTCAGGGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGATTAAAAAAGCAAAAATCARTAACAGTATTGGATGTGGGTGATGCATATTTTTCAGTTCCTTTAGATAACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGGTATCAGTACAATGTGCTWCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt4156_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCWAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATCTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACRAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTYTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGATTAAAAAGGAAAAGATCAGTAACAGTACTGGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATGACTTTAGAAAATACACTGCATTCACCATACCTAGTATAAACAATGAGACACCAGGAATTAGATATCAGTACAATGTACTTCCACAGGGAGGATCGCCAGCAATATT [...]
+	'PCF_Pat19_200101'         CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAGAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATCTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCTATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCAGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTAGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACTATACCTAGTATAAACAATGAGACACCAGGGATTAGGTATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt4117_200201'            CCTATTAGTCCTATTGACACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGACCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAACTAGGAATACCACATCCGGCAGGGTTAAAAARGAAAAAGTCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTTAGAAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'PCF_Pat189_200101'        CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTRACAGAAGAAAAAAAAGCATTARTAGAAATCTGTACAGAAATGGAAAAGGAAGGGAAAATTACAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGGGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCARTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGAYGAATTCAGGAAGTATACTGCATTTACCATACCYAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTGCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt4155_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATCTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACRAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAARAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGATTAAAAAGGAAAARATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTTAGAAAATACACTGCATTCACCATACCTAGTATAAACAATGAGACACCAGGAATTAGATATCAGTACAATGTACTTCCACAGGGAGGATCGCCAGCAATATT [...]
+	'05_132878_200401'         CCTATTAGTCCTATTGAAACTGTACCAGTAAARAAGCCAGGAATGGATGGCCCAAGAGTTAAACAATGGCCRCTGACAGAAGAAAAAAARGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGRAAAATTTCAAGGATTGGACCTGAAAATCCATAYAATACTCCAGTGTTYGCCATAAARAAAAAGGATAGTACTAAATGGAGAAAATTAGTAGATTTCAGRGAACTTAATAAGAGRACTCAAGAYTTCTGGGAAGTTCAATTAGGAATACCACATCCCKCAGGGTTAAAAAAGAACAAATCAGTAACAGTACTGGATGTGGGTGATGCATAYTTTTCAGTTCCYTTAGATGACTTCAGGAAGTATACTGCMTTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTGCCACAGGGAGGATCACCAGCAATATT [...]
+	'JLB_Pat85_200006'         CCYATTAGTCCTATTGAGACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGRAAAATTTCAAGAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAGTTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAGGTTCAATTAGGAATACCACATCCCTCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTCTCAGTTCCATTAGATGAATTCAGGAAGTATACTGCATTTACCATACCCAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGGTCACCAGCAATATT [...]
+	'CA6445_200004'            CCCATTAGTCCTATTGAAACTGTACCWGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAACCCATACAATACTCCAGTATTTGCCATAAAGAARAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAACAAGAGGACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCYGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGYATAAACAAYGAGACACCAGGGATTAGRTATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CA6400_200003'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTACAAAAATTGGGCCTGAAAATCCATACAATACTCCAATATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTTTGGGAAGTTCAATTAGGAATACCACATCCYGCAGGGTTAAARAAGAAAARATCAGTAACAGTACTGGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATGACTTCAGAAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CA6393_200003'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAGTGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAGATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAACTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTCCAATTAGGCATACCACATCCCGCAGGATTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTTAGRAAGTATACTGCATTTACCATACCTAGTATAAATAATGAGACACCAGGAATTAGATATCAGTACAATGTACTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CA6446_200004'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAGAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAATAGAAATCTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAGAATTGGGCCTGAAAACCCATACAATACTCCAGTATTTGCTATAAAGAAGAAAGACAGTACTAAGTGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTYCAGCTAGGAATACCYCATCCCGCAGGGTTAAAAAAGAAAAAATCAGTGACAGTACTGGATGTGGGAGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCGTTTACCATACCTAGTATAAACAATGARACACCAGGGATCAGATACCAGTACAATGTGCTCCCACAGGGAGGATCACCAGCAATATT [...]
+	'CA6493_200005'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAGGTTAAACAATGGCCATTAACAGAGGAAAAAAARGCATTAGTAGAAATCTGTACAGAAWTGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCARTATTTGCCATAAAGAAAAAGGATRGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTCCARTTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGATTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CA6502_200005'            CCCATTAGTCCTATTGACACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAGAAAAAAGCATTAGTAGAAATTTGTRCAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCYGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATGASTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCCCCAGCAATATT [...]
+	'CA6491_200005'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAGCAATGGCCATTGACAGAGGAGAAAAAAGCATTGRTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGAATTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGTCTAAAAAAGAAAAAATCAGTAACAGTATTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGATTTCAGGAAATATACTGCATTTACCATACCTWGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAAGGAGGATCACCAGCAATATT [...]
+	'CA6490_200004'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTRTTTGCCATAAAGAAAAARGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCTCAGGGTTAAARAAGAAAAAGTCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCTTTAGACGAGTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGAATTAGATATCAGTACAATGTGCTGCCACAGGGAGGATCACCAGCAATATT [...]
+	'JLB_Pat82_200006'         CCCATTAGTCCTATTGAAACAGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAATTGGAAAAGGAAGGRAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAATATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAACAAGAGAACTCAAGACTTTTGGGAGGTTCAATTAGGCATACCACATCCCGCAGGGCTAAAACAGAAAAGATCAGTAACAGTABTGGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTGTGAACAATGAGACACCAGGGATTAGATATCAATACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'JLB_Pat79_200006'         CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAGCAATGGCCATTGACAGAAGAAAAAAAAGCATTGGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATCTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCTATAAAGAAAAAAGACAGTACTAAATGGAGGAAGTTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAGTCAGTAACAGTACTGGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACTATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAACGTGCTCCCACAAGGAGGATCACCAGCAATATT [...]
+	'JLB_Pat8_200006'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCACTGACAGAAGAAAAAAAAGCATTACTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTGTAAACAATGAGACACCAGGGATTAGATACCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCCATATT [...]
+	'CA5704_200001'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAGTGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTTAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGWATACCGCATCCMGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCTTTAGATGAATTCAGGAAGTATACTGCCTTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTATAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'JLB_Pat78_200006'         CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGSCCAAAAGTTAAACAATGGCCAYTGACAGAAGAAAAAAAAGCATTARTGGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAARGACAGTACTAAATGGAGAAAATTAGTAGATTTTAGAGAACTTAATAAGAGAACTCAAGACTTYTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAARAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTAYACTGCCTTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGCTCACCAGCAATATT [...]
+	'CA5771_200001'            CCCATTAGTCCTATTGAAACAGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAGAATCCATATAACACTCCAGTATTTGCTATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCARGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCTGGGTTAAAAAAGAAAAAATCAGTAACAGTACTAGATGTGGGTGATGCATATTTTTCAGTTCCCCTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGAGTTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'JLB_Pat80_200006'         CCCATTAGTCCTATTGATACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAGAATTGGGCCTGAAAATCCATATAATACTCCAATATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTGTAAACAATGCGACACCAGGGATTAGATATCAATACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CA6323_200003'            CCYATTAGTCCTATTGAAACTGTACCAGTAAAAAAACCRGGAATGGATGGTCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAATAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAMAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGACTTCAGRGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTACACTGCATTTACCATACCTAGCTTAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CA5992_200002'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGARAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAGTTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTATGGGAAGTTCAATTAGGAATACCACATCCTGCAGGATTAAAAAGGAARAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCTTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTACTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CA5945_200002'            CCTATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAGAAAAAAGCATTAACAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCGGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGATTTTTGGGAAGTCCAGTTAGGAATACCACACCCTGCAGGGTTAAAAAAGAGAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACRCCAGGGATTAGGTATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'JLB_Pat86_200006'         CCCATTAGCCCTATTGAAACTGTACCAGTWAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCACTGACAGAAGAAAAAAAAGCATTAGTAGAAATATGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAGTGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTGCCCTTAGATGAATTCAGGARGTATACTGCATTCACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTACTTCCACAGGGAGGATCYCCAGCAATATT [...]
+	'CA7062_200007'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGGATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAGTGGAGAAAATTAGTAGATTTCAGAGAACTGAATAAGAGAACTCAAGACTTYTGGGAAGTTCAATTAGGAATACCACATCCTTCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAATACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CA7075_200008'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAGAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCCTGGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTAYAAACAATGARACACCAGGGATTAGATATCAGTACAATGTACTCCCACAGGGAGGATCACCAGCAATATT [...]
+	'CA7061_200007'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATATGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAGGAAAAAAGACAGTACTAAATGGAGGAAATTAGTAGATTTTAGAGAACTTAATAAGAGAACCCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAGAAGAAAAAATCAGTAACAGTRCTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGATTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAAYAATGAGACACCAGGGATCAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt6223_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAGCAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAGGCACTAGTAGAAATTTGTACAGAAATGGAGAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGGGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTCCAATTAGGAATACCACATCCCGCAGGATTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATAGCTTCAGGAAGTATACTGCATTTACCATACCTAGCACAAACAATGAGACACCAGGGATTAGATATCAGTATAATGTGCTTCCACAAGGAGGATCACCAGCAATATT [...]
+	'CA7109_200008'            CCCATTAGTCCTATTGAAACTGTMCCAGTAAGAAASCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAATAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTACAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAGAAAGATGGTAATAAATGGAGAAAGTTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCTCAGGGCTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTCTCAGTTCCCTTATATGACTTCAGAAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGAATTAGGTATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CA7900_200010'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGTCCAAAAGTTAAACAGTGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAACACTCCAGTATTTGCCATAAAGAAAAAAGATGGTACTAAATGGAGAAAATTAGTGGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAACAGAAAAAATCAGTAACAATACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CA7901_200010'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAGAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGARGGGAAGATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTYAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAGAARATCAGTGACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTCACCATACCTAGTATAAACAATGAGACACCAGGRATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt6241_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAACAAGCATTAATAGAAATTTGTACAGAAATGGAAAARGAAGGAAAGATTTCAAAAATTGGGCCTGAAAACCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCTCAGGATTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTACATAGTTTCAGGAAATATACTGCATTTACYATACCTAGTATAAACAAYGAGACACCAGGAATCAGGTATCAGTATAATGTGCTTCCACAGGGAGGATCACCATCAATATT [...]
+	'CA7850_200009'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAGAAGCCAGGAATGGATGGCCCAAAAGTTAAACAGTGGCCATTGACAGAAGAAAAGAAAGCATTAGTAGAAATTTGTACAGAAATGGAGAAGGAAGGAAAAATTTCAAAGATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGRAAATTAGTAGATTTTAGAGAACTCAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGATTAAAAAAGAAGAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGGTTAGATATCAGTACAATGTGCTTCCACAGGGAGGCTCACCAGCAATATT [...]
+	'CA6860_200007'            CCCATWAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACYCAAGATTTCTGGGAAGTTCAATTAGGGATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATGAGTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGNATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CA6606_200005'            CCCATTAGTCCTATTGARACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGATAGTACTAAATGGAGGAAGTTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAACTAGGAATACCACATCCTGCAGGGCTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTCACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CA6610_200005'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAGAGTCAAACAATGGCCATTGACGGAGGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCARTATTTGCCATAAAGAAGAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGGGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCAGCAGGGTTAAAAAAGAAAAAATCAGTAACRGTACTGGATGTGGGTGATGCATATTTTTCAATTCCTTTAGACGAATTCAGGAAGTATACTGCATTTACCGTACCTAGTGTAAACAATGAGACACCAGGAATTAGATATCAGTACAATGTGCTGCCACAAGGAGGATCACCAGCAATATT [...]
+	'CA6577_200005'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAARAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAGATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGTTTAAAAAAGAAAAAATCAGTAACAGTATTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAATAATGAGACACCAGGGRTTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CA6576_200005'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATYTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGAYTTCTGGGAAGTTCAATTAGGGATACCACATCCCGCAGGGTTAAAGAAGAAAAAATCAATAACAGTACTAGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTYACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGGGGATCACCAGCAATATT [...]
+	'CA6789_200005'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAACCAGGAACGGATGGCCCAAAAGTTAAACAATGGCCACTGACAGAAGAGAAGAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCWATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGAYTTCTGGGAAGTGCAATTAGGAATACCACATCCCGCAGGGTTAAARAAGAAAAAATCAGTAACAGTACTRGATGTGGGGGATGCATATTTTTCAGTTCCATTAGACGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'JLB_Pat87_200006'         CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTGAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAGAAGGAAGGGAARATCTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCTTTAGATGAATTCAGGAAGTATACCGCATTTACCATACCTAGTATAAATAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAKCAATATT [...]
+	'Pt6201_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAATAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAGATTTCAAAAATTGGGCCTGAAAACCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAACTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCTCAGGATTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCTTTACATAGTTTCAGGAAATATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGAATCAGGTATCAGTATAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CA6823_200006'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGGCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAGAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAACCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTGTAAACAATGAGACACCAGGGATTAGGTATCAGTACAATGTRCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CA6821_200006'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTRGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTTTTTGCTATAAAGAAAAAAGATAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTRGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCRCAGGGAGGATCACCAGCAATATT [...]
+	'CA5630_199912'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGCACKAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCTCAGGGCTAAAAAAGAAAAAATCAGTAACAGTACTAGATGTAGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGAAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CA4807_199907'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCTATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAARTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAGAAATCAGTAACAGTATTGGATGTGGGTGATGCATACTTTTCAGTTCCCTTAGATGACTTCAGRAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGRTTAGATATCAGTACAATGTGCTTCCACAAGGAGGATCACCAGCAATATT [...]
+	'JLB_Pat62_200006'         CCCATTAGTCCTATTRAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATCAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCYGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTCCTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTTAGAAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTATAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'JLB_Pat60_200006'         CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGGATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTGTTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAGTTAGTAGATTTCAGGGAACTTAMTAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTACCACAGGGAGGATCACCAGCAATATT [...]
+	'CA4775_199907'            CCCATTAGTCCTATTGACACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAARCAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTYAATAAGAGAACTCAAGACTTCTGGGAAGTYCAATTAGGAATACCACATCCCGCAGGGCTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTCACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CA4824_199907'            CCTATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAGCAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATCTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAGAAATCAGTAACAGTATTGGATGTGGGTGATGCATATTTCTCAGTTCCATTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGGTATCAGTACAATGTGCTTCCACAGGGAGGCTCACCAGCAATATT [...]
+	'JLB_Pat63_200006'         CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAGGCATTAGTAGAGATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAMTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAAACACCAGGGATTAGGTATCAGTATAATGTACTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CA4912_199908'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAGAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGMAAAGGAAGGAAAGATTTCAAGAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTACACCGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CA4858_199908'            CCCATTAGTCCTATTGAYACTGTACCAGTAAAAAAACCAGGAATGGATGGCCCAAAAGTCAAACAGTGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAGGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCARTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTTAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATRTAGGTGATGCATATTTTTCAGTTCCCTTATATGACTTCAGAAAGTATACTGCATTCACCATACCTAGTACAAACAATGAGGCACCAGGGATTAGATATCAGTATAATGTGCTTCCGCAGGGAGGATCACCAGCAATATT [...]
+	'CA4825_199907'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAGAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAGAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCYTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGGTATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CA4744_199907'            CCCATTAGTCCTATTGAAACTGTGCCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAGAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGCACTAAATGGAGAAAGTTAGTAGATTTCAGAGAACTCAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCAGCAGGGCTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAATACAATGTGCTTCCACAGGGAGGATCGCCAGCAATATT [...]
+	'CA4425_199906'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGACAAAAAAGCATTAACAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAATATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCCGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGGATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTATTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGATTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAAYAATGAGACACCAGGGATTAGATATCAGTATAATGTGCTGCCACAGGGAGGATCACCAGCAATATT [...]
+	'CA4435_199906'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCACTGACAGAAGAGAAAAAAGCATTAATAGAGATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAACTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCARTTCCCTTAGATGAATTTAGGAAGTATACTGCATTTACTATACCTAGTRKAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTCCCACAAGGAGGATCACCAGCAATATT [...]
+	'CA4399_199905'            CCCATTAGTCCTATTGAAACTGTACCAGTAAGAAAACCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCAATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTTTGGGAARTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACAGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CA4384_199905'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTGACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAAACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'JLB_Pat59_200006'         CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGATTTCTGGGAAGTTCAATTAGGAATACCACATCCYGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGAYGTGGGTGATGCATATTTCTCAGTYCCTTTAGATAACTTCAGAARGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCGGGGATCAGRTATCAATACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CA4575_199906'            CCCATTAGTCCTATTGACACTGTGCCAGTAAAAAAGCCAGGGATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAGAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGATTTCTGGGAAGTTCAACTAGGAATACCACATCCCTCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTTAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCASTACAATGTGCTTCCACAGGGAGGATCACCAGCAATTTT [...]
+	'JLB_Pat6_200006'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGARGAAAAAAAAGCATTAATAGAAATCTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATAYAATACTCCAGTRTTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGGGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAARAAGAAAAARTCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTTAGGAAGTACACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CA4511_199906'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGTCCAAAAGTTAAACAATGGCCATTGACAGAAGAGAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAARGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGGGAACTTAAYAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATAACTTCAGGAAGTACACTGCATTCACCATACCTAGTATAAACAATGWGACACCAGGGATTAGGTATCAGTACAATGTGCTTCCACAAGGAGGATCACCAKCAATATT [...]
+	'CA4462_199906'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAGAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAATAGAAATCTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTMTTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACWCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGRTTAAAAAAGAAAAAATCAGTAACAGTACTAGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTGCCACAGGGAGGATCACCATCAATATT [...]
+	'CA5053_199909'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAGATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCTATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGAAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGACTAGGTATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CA5389_199911'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTGTTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGGGAACTCAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAACAGAAAAAATCAGTAACAGTACTGGATGTAGGTGATGCATATTTTTCAGTTCCCTTASATRACTTCAGGAAGTATACTGCATTCACCATACCCAGTATAAACAATGAGACACCAGGGACTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CA5409_199911'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGARAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAAYCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTTCTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGARAACTCAAGACTTCTGGGAAGTYCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGAGATGCATATTTTTCAGTTCCATTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGAATTAGRTATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CA5373_199911'            CCCATTAGTCCTATTGAAACTGTACCAGTGAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTGGTAGACTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTGACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAGTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'JLB_Pat73_200006'         CCCATTAGTCCTATTGAGACTATACCAGTAAAAAAGCCAGGAATGGATGGGCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAGAATTGGCCCTGAAAATCCATACAATACTCCAATATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAACAAGAGAACTCAAGACTTYTGGGAAATTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTYTCAGTGCCCTTAGATRACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGAATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CA5425_199911'            CCCATTAGTCCTATTGAAACTGTCCCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCGTTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAACTGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAATATTTGCCATAAAGAAAAAAGACAGTACTAAGTGGAGAAAATTAGTAGATTTCAGAGAACTTAACAAGAGAACTCAAGATTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTAGATGTGGGGGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGAAAGTATACTGCATTTACCATACCTAGTGTAAATAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CA5626_200001'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAATATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGACTTTAGAGAACTTAATAAGAAAACCCAAGACTTTTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGCTAAARAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCTTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTGCCACAGGGAGGATCACCAGCAATATT [...]
+	'JLB_Pat77_200006'         CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGGCCAAAAGTTAAACAATGGCCACTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAGTTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTTAGAGAACTTAATAAGAGAACTCAAGACTTTTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAGAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTACACTGCCTTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTACTTCCACAGGGAGGCTCACCAGCAATATT [...]
+	'CA5529_199912'            CCTATYAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTAACAGAAGAGAAAAAAGCATTAATAGAAATTTGTACAGAAATGGARAAGGAAGGRAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGAYTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCTTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CA5479_199912'            CCCATCAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGATTTCTGGGAAGTTCAATTAGGAATACCACACCCAGCAGGGTTAAAGAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAKTTCAGGAAGTATACTGCATTTACGATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTACTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'JLB_Pat71_200006'         CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAGAATTGGGCCTGAGAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGGGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGACGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACAGCATTTACCGTACCTAGTACAAACAATGAGACACCAGGGATCAGATATCAGTACAACGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CA5157_199910'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCACGAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAACACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTTAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCAGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTCCTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGAATTAGATATCAATACAATGTACTTCCACAGGGAGGATCACCAGCAATTTT [...]
+	'JLB_Pat64_200006'         CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCASGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAAGAAGGGAAAATTTCAAGAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCAATAAAGAAAAAAGACAGTACTAAGTGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAGGTTCAATTAGGAATACCACATCCYGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTGTAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGGGGATCACCAGCAATATT [...]
+	'CA5132_199909'            CCCATTAGTCCTATTGAAACTGTACCCGTAAAAAAGCCAGGAATGGATGGCCCAAGAGTTAAACAATGGCCATTAACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAGATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCAATAAAGAAAAAAGACAGTACAAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGATTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTCTCAGKTCCCTTGGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTRNAAACAATGAGACACCAGGGATTAGATATCAGTATAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CA5100_199909'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAGATTACAAAAATTGGGCCTGAGAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGATTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTCCCACAGGGAGGATCACCAGCAATATT [...]
+	'JLB_Pat65_200006'         CCCATTAGTCCTATTGACACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAARAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCTTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTATAAATAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'JLB_Pat7_200006'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAGAGTCAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAGATTTGTACAGAAATGGAAAAGGAAGGGAAGATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTTAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCGGCAGGATTAAGAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCATTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTAGAAACAATGAGACACCAGGGATTAGATATCAATACAATGTGCTTCCACAGGGAGGATCTCCAGCAATATT [...]
+	'Pt5763_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAARAGTTAAACAATGGCCAYTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAACCCATACAATACTCCAGTRTTTGCCATAAAGAAAAARGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGATTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTRAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATAYCAGTACAATGTGCTYCCACAGGGAGGRTCACCAGCAATATT [...]
+	'CA5268_199911'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGRGAAAATTAGTAGATTTTAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAGTCAGTAACAGTACTGGATGTGGGTGATGCATAYTTTTCAGTTCCATTAGATGACTTCAGGAAGTATACTGCATTYACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt5801_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAGAGTTAAACAATGGCCATTGACAGAAGAAAAGAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATCTCAAGAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAACTAGTAGATTTTAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGACGAATTCAGAAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGGGGATCACCAGCAATATT [...]
+	'CA7904_200010'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAGTGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGARAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCMATAAAGAAAAAGGACAGTACTAAATGGAGRAARTTAGTAGATTTCAGGGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACAYCCYGCAGGGTTAAAAMAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTAYACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTKCCACAGGGAGGATCACCAGCAATATT [...]
+	'PCF_Pat149_200101'        CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTARTGGAAATCTGTACAGAAATGGAGAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTYTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGATTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'PCF_Pat15_200101'         CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAGGTTAAACAATGGCCATTGACAGARGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGRAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCTATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGGGAACTTAATAAGARAACTCAAGACTTCTGGGAAGTCCAATTAGGAATACCACATCCCGCAGGGTTAAARAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGAYGAATTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATACCAGTACAATGTGCTKCCACAGGGAGGRTCACCAGCAATATT [...]
+	'PCF_Pat147_200101'        CCCATTAGTCCTATTGATACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATCTGYACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCMTCAGGGTTAAAAAAGAAAAAATCAGTAACMGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTACACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'PCF_Pat146_200101'        CCCATTAGTCCTATTGAGACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATCTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACAAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCYGCAGGGTTAAAAMAGAAAAAATCAGTAACAGTACTAGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTCACCATACCTAGTACAAACAATGAGACACCAGGGATTAGGTATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCGATATT [...]
+	'PCF_Pat150_200101'        CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAARTTGGGCCTGAAAATCCATATAATACTCCAGTTTTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAGGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAGAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATCWGATATCAGTCAATGTGCTTGCCACAGGGAGGATCACCAGCAATATT [...]
+	'PCF_Pat153_200101'        CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGTCCAAAAGTTAARCAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAAGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGARAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCAGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGCCACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'PCF_Pat154_200101'        CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATCTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAAYCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGGCTTCTGGGAAGTTCAATTAGGAATACCACATCCYGCAGGGTTAAAACAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt7579_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACACCAATATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGACTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGGATACCACATCCAGCAGGATTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTCTCAGTTCCATTAGATGACTTCAGGAAGTATACTGCATTTACTATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATTTT [...]
+	'PCF_Pat151_200101'        CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAMCATTGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATCTGTACAGAAATGGAAAAGGAAGGGAAAATTGAAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGRGAACTTAATAAGAAAACTCAAGAYTTCTGGGARGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAARTCAGTAACAGTAYTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTYAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGCGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'PCF_Pat145_200101'        CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAGTGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATCTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGATGGCACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTGAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTATAAATAATGCAACACCAGGGATTAGATATCAATACAATGTGCTKCCACAGGGAGGATCACCAGCAATATT [...]
+	'PCF_Pat139_200101'        CCCATTAGTCCTATTGACACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATCTGTACAGAAATGGAGAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGARAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTTAGGAAGTATACTGCATTTACTATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'PCF_Pat14_200101'         CCYATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAARATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGATTTCAGGAAGTATACTGCATTCACCATACCTAGTATAAAYAATGAGACACCCGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'PCF_Pat138_200101'        CCCATTAGTCCTATTGAAACTGTACCGGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATCTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAGAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATACTTTTCAGTTCCCTTAGATGAATTTAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCGATATT [...]
+	'PCF_Pat137_200101'        CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAGAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAGAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTCCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGATTTCAGAAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGAAKAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'PCF_Pat140_200101'        CCCATYAGTCCTATTGAAACTGTCCCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTAACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGATGGGAAAATTTCAAAAATTGGRCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTYCAATTAGGRATACCACATCCTGCAGGGTTAAAACAGAGAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTYACCATACCCAGTATAAACAATGAGACACCAGGGGTTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt7574_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATCTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACCCAAGACTTCTGGGAAGTTCAATTAGGGATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGAAAGTATACTGCATTCACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'PCF_Pat144_200101'        CCCATTAGCCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAARCAATGGCCATTAACAGAAGAAAAAAAAGCATTAATAGAAATTTGTACAGAAATGGAAAAGGAAGGRAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTTTGTGAAGTTCAATTAGGAATACCACATCCCGCAGGRTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTYTCAGTTCCCTTAGATGAATTTAGGAAGTATACTGCWTTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'PCF_Pat142_200101'        CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATCTGTACTGAAATGGAAAAGGAGGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGGGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCTTTAGATGAATTCAGAAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'PCF_Pat141_200101'        CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCACTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTGGTAGATTTCAGAGAGCTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAGTTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAGTTCAGGAAGTATACTGCGTTTACTATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATCTT [...]
+	'PCF_Pat155_200101'        CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAARGCATTRGTAGAAATCTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAACAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCTCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCYTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'PCF_Pat167_200101'        CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTRGTAGAAATCTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAARAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGATTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTAYACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'PCF_Pat169_200101'        CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATCTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTACACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATTTT [...]
+	'PCF_Pat166_200101'        CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATCTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAGTGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAACTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTAGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTCACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'PCF_Pat165_200101'        CCCATTAGTCCTATTGARACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATCTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATATWATACTCCAGTATTTGCCATAARGAAAAAAGACAGTACTAAATGGAGAAAATTAGTRGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAGTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAATAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'PCF_Pat17_200101'         CCTATAAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAGAAAAAAGCATTAGTAGAAATYTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTRTTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTTTGGGAAGTTCAACTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCYTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGACCAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'PCF_Pat172_200101'        CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAGACAATGGCCATTGACAGAAGAAAAAAAAGCATTAATAGAAATTTGTACAGAAATGGAGAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTGTTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTKAATAAGAAAACTCAAGACTTYTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGRTTAAAAAAGAAAAAATCAATAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGTATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt5778_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAACCAGGAATGGATGGCCCAAGAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCACTAATAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATCTCAAAAATTGGGCCTGACAATCCATACAATACTCCAATATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGGAAACTAGTAGATTTTAGAGAACTTAATAAGAGAACTCAAGATTTCTGGGAAGTTCAACTGGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGAAAGTATACTGCATTCACCATACCTAGTGTAAACAATGAAACACCAGGGATTAGATATCAGTACAATGTGCTTCCGCAGGGAGGATCACCAGCAATATT [...]
+	'Pt7621_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAAYAGAAATTTGTACAGAAATGGAAAAGGAAGGRAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGATAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAGCTTAATAAGAGAACTCAAGAATTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAGGAAAAAATCAGTAACAGTACTGGACGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTACACKGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTACTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt7618_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGGCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATCTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTAAATAAGAGAACTCAAGACTTCTGGGAAGTGCAATTAGGAATACCACATCCCGCGGGGCTAAAAAAGAAAAAGTCAGTAACAGTACTAGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGAAAGTATACTGCATTCACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAAGGAGGATCACCAGCAATATT [...]
+	'PCF_Pat164_200101'        CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCAAGAGTTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGGAAATTGGTAGATTTCAGAGARCTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGATTAAAAAAGAAAAAATCAGTAACAGTCCTGGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATGACTTTAGAAAGTATACTGCATTTACCATACCTAGTATAAATAATGAGACACCAGGGATCAGATATCAGTACAATGTGCTGCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt7599_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGMATGGATGGCCCAAAAGTTAARCAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAARAATTGGGCCTGAAAATCCATATAATACTCCAATATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTRGATTTCAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCTCAGGGTTAAAACAGAAAAAATCAGTAACAGTAYTGGATGTGGGTGATGCATATTTTTCAGTKCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGGTATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt7600_200201'            CCCATTAGCCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAGAGTTAAACARTGGCCATTGACAGAAGAGAAAAAAGCATTAATAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAATATTTGCTATAAGGAAAAAAGACAGTACYAAATGGAGAAAATTAGTRGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAARAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTACATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTAGAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTACTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'PCF_Pat157_200101'        CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGTATGGATGGCCCAAAAGTTAAACAATGGCCATTGKCAGAAGAAAAAAAAGCATTAGTAGAAATCTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTATTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAACGAGACACCAGGGATTAGATATCAATACAATGTGCTTCCACAGGGGGGATCACCAGCAATATT [...]
+	'PCF_Pat156_200101'        CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCACTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGRAAAATTTCAARAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCYATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGARAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTRAAAAAGAAAAAATCAGTAACAGTAYTRGATGTAGGTGATGCATATTTTTCAGTTCCYTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'PCF_Pat16_200101'         CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATCTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGAYTTCTGGGAAGTYCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAGAAATCAGTRACAGTACTGGATGTGGGTGATGCATAYTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTATAAATAATGAGACACCAGGGATTAGATATCAGTACAATGTRCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'PCF_Pat162_200101'        CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATCTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTATAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'PCF_Pat163_200101'        CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAGAAAAAAGCATTAGTAGAAATCTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGNACTTAATAAGAGNACTCNAGANTTCTGGGAAGTTCAATTAGGAATACCACATCCAGCAGGGTTAAAAMAGAAAAAATCAGTGACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGATTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt7603_200201'            CCTATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAGAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAACCCATATAATACTCCAGTATTTGCTATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTGGATTTCAGAGAACTTAATAARAGAACTCAAGACTTCTGGGAAGTTCAGTTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATCAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'PCF_Pat160_200101'        CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAGGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTCCAATTAGGAATACCACATCCYGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTTAGAAAGTAYACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'PCF_Pat136_200101'        CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAGAGTCAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATCTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAGGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCTTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTMCAAMCAATGAGACACCAGGGATCAGATATCAGTATAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'PCF_Pat111_200101'        CCTATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAGGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTARTAGAAATTTGTACAGAAATGGARAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTGTTTGCCATAAAGAAAAAGGACAGCACTAAATGGAGAAAATTAGTAGATTTTAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAARMAGAAAAAATCAGTAACAGTACTRGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAYTTCAGAAAGTACACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGGTATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'PCF_Pat113_200101'        CCCATTAGTCCTATTGAAACTGTACCWGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAACAGAAATCTGTACAGAAATGGAAAAGGAAGGRAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTRTTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCARTTAGGAATACCACATCCTGCAGGRTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTACAAATAATGAGACACCAGGGATTAGGTATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'PCF_Pat110_200101'        CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAATAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTGGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAGTTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCGTTTACTATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAATACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'PCF_Pat11_200101'         CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAGCAATGGCCATTGACAGAGGAAAAAAAAGCATTGGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAGAATCCATACAATACTCCAATATTTGCCATAAAGAAAAAAGACRGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGAYTTCTGGGAAGTTCAATTAGGAATACCACATCCYGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATAYTTTTCAGTTCCYTTACATGACTTCAGGAAGTACACTGCATTTACTATACCTAGTAGAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'PCF_Pat114_200101'        CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATCTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGKGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTACAAATAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'PCF_Pat117_200101'        CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCGAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATCTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACCAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTYTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTGGATGACTTCAGGAAGTATACTGCATTTACCATACCCAGTATAAACAATGAGACACCAGGGAYTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'VH_VHPCR_199001'          CCCATTAGTCCTATTGAGACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGCGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGAAAGTATACCGCATTCACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCGATATT [...]
+	'PCF_Pat116_200101'        CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGGATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATCTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAATATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAGCTTAATAAGAAGACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTACACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'PCF_Pat115_200101'        CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATCTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAGAAATCAGTAACAGTAYTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTCACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'PCF_Pat109_200101'        CCTATTAGTCCTATTGAAACTGTCCCAGTAAAAAAGCCAGGAATGGATGGYCCAAAAGTTAAACARTGGCCHTTGACAGAAGAAAAAAAAGCATTAGTARAAATCTGTVCAGAAATGGAAAAGGWAGGGAAAATTTCAAAAATTNGGCCYGAAAAYCCATATAATAMYCCMGTATTTGCYATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAARAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTDAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGRTATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt6249_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAGGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGARGGAAAAATCTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCTATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTTTGGGAAGTTCAATTAGGAATACCACATCCCTCAGGGTTAAAGAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGAAAGTATACTGCATTTACCATACCTAGTRYAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt6281_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAACAAGCATTAATAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAGATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCTCAGGATTAAAAAAGAAAAAATCAGTAACAGTGCTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTACATAGTTTCAGGAAATATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGAATCAGGTATCAGTATAATGTGCTTCCACAGGGAGGATCACCATCAATATT [...]
+	'CA7965_200011'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTAACAGAAGAGAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAGAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCCCAGGGAGGATCACCAGCAATATT [...]
+	'CA7921_200010'            CCTATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAARGCACTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAACACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAGTTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATACTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTGTAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTACTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt7504_200201'            CCCATTAGCCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAGAGTTAAACAATGGCCATTGACAGAAGAGAAAAAAGCATTAATAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAATATTTGCTATAAAGAAAAAAGACAGTACTAAATGGAGAAAGTTAGTGGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAGAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTAGAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTACTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CA8075_200101'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAGAAAAAAGCATTAGTAGAAATTTGTACAGWKTTAGAAAAGGAAGGGAAAATTTCAAGAATTGGGCCTSAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAGTTAGTAGACTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAGATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGRATTAGATATCAGTATAATGTACTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CA8077_200101'            CCCATCAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGCACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGATGGTACTAAATGGAGAAAATTAGTAGACTTTAGRGAACTGAATAAAAGAACTCAAGACTTCTGGGAAGTTCAACTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTRGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTYACYATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTGCCACAGGGAGGATCACCAGCAATATT [...]
+	'CA8067_200012'            CCCATCAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTARTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTGTTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCTGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CA8040_200012'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAARAGTTAAACAGTGGCCATTGACAGAAGAAAAAAAAGCATTAACAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAATATTTGCCATAAAGAAGAAAGACAGTACTAAATGGAGAAAGTTAGTAGACTTCAGAGAACTTAATAAGAGAACTCAAGACTTTTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTGCCACAGGGAGGATCACCAGCAATATT [...]
+	'PCF_Pat118_200101'        CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAATAGAAATCTGTACAGAAATGGAGAAGGAAGGRAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAATATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTCCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAGAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCCTAGATGAATTCAGGAAGTATACTGCATTTACCATACCCAGTAAAAATAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCTCCAGCAATATT [...]
+	'PCF_Pat13_200101'         CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTMCAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTRTTTGCCATAAAGAAAAAAGACRGTACTAAATGGAGAAAATTAGTAGATTTCAGRGAGCTTAATAARAAAACTCAAGATTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAGAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGARACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'PCF_Pat130_200101'        CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAAAAGAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTCAATAAGAGAMCTCAAGAATTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCYAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'PCF_Pat129_200101'        CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCGAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAGAATTGGGCCTGAAAAYCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACCGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATY [...]
+	'Pt7537_200201'            CCCATTAGTCCTATTGAAACTGTACCAGAAAATAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGCTCAGAAATGGAAAAGGAAGGGAAAATCTCAAAAATTGGACCTGAAAATCCGTACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAACAGAAAAAATCAGTAACAGTACTAGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGACTAGATATCAGTATAATGTGCTTCCACAAGGAGGATCGCCAGCAATATT [...]
+	'PCF_Pat131_200101'        CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTAACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAGATTGGGCCTGAAAACCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAATTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATACTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt7550_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAGAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAATATTTGCTATAAAGAAAAAAGACAGYACTAAGTGGAGAAAATTAGTGGATTTCAGAGAACTTAATAAGAGGACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAGAAATCAGTAACAGTACTGGATGTRGGTGATGCATATTTTTCAGTTCCCTTAGATAACTTYAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTACTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'PCF_Pat135_200101'        CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATCTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGARAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTRAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAATTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTATAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'PCF_Pat133_200101'        CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAACCAGGAATGGATGGGCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGACCTGAAAATCCATACAATACTCCAGTATTTGCYATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATARGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCMGCAGGATTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGYGTAAACAATGAGACACCAGGGATTAGATATCAATACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'PCF_Pat132_200101'        CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATCTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTTAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGARGTTCAATTAGGAATACCACATCCCGCAGGGTTAATAAAGAAAAAGTCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGRAAGTATACTGCATTTACCATACCTAGTATAAATAATGAGACACCAGGGACTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'PCF_Pat127_200101'        CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGTATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAARAGTTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTCCAATTAGGAATACCACATCCCGCAGGAYTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCYTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGGTTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCTGCAATATT [...]
+	'PCF_Pat120_200101'        CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAGAAAGCATTAATGGAAATCTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTGCAGTTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'PCF_Pat121_200101'        CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAARGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAACAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'PCF_Pat12_200101'         CCCATTAGTCCTATTGAAACTGTCCAATTAAAGAAGCCAGGAATNGRTGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGRAAAATTTCAAGAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCMATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAARAGAACTCAAGAYTTCTGGGARGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAACAGAAAAAATCAGTAACAGTAYTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCYAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'PCF_Pat119_200101'        CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTWACAGAAGAGAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCKAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGCACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGATTTCTGGGAAGTTCAATTAGGAATMCCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'PCF_Pat122_200101'        CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTGCAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTRGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'PCF_Pat125_200101'        CCCATTAGTCCTATTGAAACTGTACCAGTAAAGAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGVAAAATTTCAAAAATTGGGCCTGAAAATCCATAYAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAARAGAACTCAAGACTTCTGGGAAGTTCAATTAGGRATACCACATCCTTCAGGGTTAAAAAAGAAAAAATCAGTAACAGTATTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGGTGAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'PCF_Pat126_200101'        CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATCTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGTCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTYTGGGAAGTTCAATTAGGGATACCACATCCTGCAGGGTTAAARAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCMTTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'PCF_Pat124_200101'        CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATCTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAGCTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTRGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGGTACCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'PCF_Pat123_200101'        CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGMCAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAARAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAATCCAATTAGGAATACCACATCCCGCAGGATTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATAGCTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGACTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CA4343_199805'            CCTATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTYAAACAGTGGCCACTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAGATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCYATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTGGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAGTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAATAATGAGACCCCAGGGATTAGATATCAATACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'AP_ARRP018_200406'        CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTCAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAATAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGACTTCAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTCCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTAGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATGACTTCAGAAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTCCCACAGGGAGGATCACCAGCAATATT [...]
+	'440113_199401'            CCCATTAGCCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAACCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTTTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCCTAGATGACTTCAGGAAGTACACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATGAGGTATCAATACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'437895_200101'            CCCATCAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGGCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGYACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCGCATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTGCTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGAYGACTTCAGGAAGTATACTGCATTTACTATACCTAGTACAAACAATGAGACACCGGGGRTTAGATATCAGTACAATGTGCTCCCACAGGGAGGATCACCAGCAATATT [...]
+	'AP_ARRP017_200406'        CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGTCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAACAGAAATATGTACAGAAATGGAAAAAGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGGAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGATTTTTGGGAGGTTCAACTAGGAATACCGCATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTCCCCTTAGATGATTTCAGGAAGTACACTGCATTCACCATACCTAGTATCAACAATGAGACACCAGGAATTAGGTATCAGTACAATGTCCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'AP_ARRP019_200406'        CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATAAAAAAGGAAGGAAAGATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTCCAATTAGAAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAATAACAGTGCTGGATGTGGGTGATGCATACTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTCACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTGCCACAGGGAGGCTCACCAGCAATATT [...]
+	'AP_ARRP022_200406'        CCCATTAGTCCTATTGACACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATATGTACAGAAATGGAAAAGGAAGGAAAAATTACAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGGAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGATTTTTGGGAGGTTCAATTAGGAATACCGCACCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTAGATGTGGGGGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTACACTGCATTCACCATACCTAGTATCAACAATGCGACACCAGGAATTAGGTACCAGTACAATGTACTTCCACAGGGGGGATCACCAGCAATATT [...]
+	'AP_ARRP023_200406'        CCTATTAGTCCTATTGAGACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTGATAGAAATCTGTACAGAAATGGAAAAGGAAGGAAAGATTTCAAGAATTGGGCCTGACAACCCATATAACACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGGATACCACATCCCGCAGGGTTAAAGAAGAAAAAATCAGTAACAGTACTAGATGTGGGTGATGCATATTTTTCAGTCCCCTTAGATGAATTCAGGAAATATACTGCATTTACCATACCTAGTATAAATAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'AP_ARRP021_200406'        CCCATTAGCCCTATTGAGACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAGAAGGAAGGAAAAATTTCAAAAATAGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACACCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTAGATGTGGGCGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAATAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'AP_ARRP020_200406'        CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAATAGAAATATGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGYACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCYGCAGGGTTAAAAAAGAAAAAGTCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTCCCCTTAGACGATTTCAGGAAGTACACTGCATTCACTATACCTAGTGTAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'JLB_Pat21_200006'         CCCATTAGTCCTATTGACACTGTACCAGTANANAAGCCAGGAATGGATGGCCCAAAAGTTAAACAGTGGCCATTGACAGAAGAAAAAAAAGCATTAATAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAGTTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTAGATGTAGGTGATGCATATTTCTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACYTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATYACCAKCAATATT [...]
+	'129005_200401'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAARCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAARGAAGGGAAAATTTCMAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAARGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTTAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAGGTTCAATTAGGAATACCRCAYCCAGCAGGGCTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTAAAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAAGGGGGATCACCAGCAATATT [...]
+	'139089_200401'            CCCATTAGTCCTATTGAGACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAGAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAACCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTTAGAGAGCTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGGATACCACATCCTGCAGGGTTAAAAAGGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTCACCATACCTAGTATAAACAATGAGACACCAGGGTTTAGATATCAGTACAATGTGCTTCCACAGGGGGGATCACCAGCAATATT [...]
+	'1280_200401'              CCCATAAGTCCTATTGAAACTGTACCAGTAAAAAAGTCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGCACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAACCCATACAACACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGACTTCAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCTCAGGRTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCATTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATACCAGTACAATGTACTTCCACAGGGAGGATCACCATCAATATT [...]
+	'05CSR3_200001'            CCCATTAGTCCTATTGAAACTATACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAGTGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'JLB_Pat16_200006'         CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAGAAGGAGGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGGATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'AP_ARRP015_200406'        CCTATTAGTCCTATTGAAACTGTACCAGTAAAAAAACCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCACTAATGGAAATATGTACAGAAATGGAAAAAGAAGGAAAAATTACAAAAATTGGGCCTGAAAATCCATACAATACTCCAATATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGGAAATTGGTAGATTTCAGAGAGCTTAATAAAAGAACTCAAGATTTTTGGGAGGTTCAATTAGGAATACCGCATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGAGATGCATATTTTTCAGTTCCCTTAGATGATTTCAGGAAGTACACTGCATTCACCATACCTAGTATCAATAATGAGACACCAGGAATTAGGTACCAGTACAATGTGCTTCCACAGGGAGGCTCACCAGCAATATT [...]
+	'AP_ARRP016_200406'        CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTCAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAGAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAGTTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTCCAATTAGGAATACCCCATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCTTTAGATGATTTCAGGAAGTATACTGCATTTACCATACCTAGTATGAACAATGAGACACCAGGAATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'AP_ARRP014_200406'        CCTATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAACAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTATTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGCTGACTTCAGAAAATATACTGCATTTACCGTACCTAGTGTAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt5786_200201'            CCCATTAGTCCTATTGACACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAGAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATYTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAGTGGAGAAAACTAGTAGACTTTAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACAYCCCGCAGGACTAAAAAAGAAAAAATCAGTAACAGTACTGGACGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGAAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'AP_ARRP024_200406'        CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCTTTAATAGAAATCTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTTTGGGAAGTTCAATTAGGAATACCACATCCAGCAGGGTTAAAAAAGAAAAAGTCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGATTTCAGGAAGTACACTGCATTTACCATACCTAGTTTAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCGCCAGCAATATT [...]
+	'AP_ARRP030_200406'        CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGGCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAGATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCTATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTTTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTGAAAAAGAAAAGATCAGTAACAGTACTAGATGTAGGTGATGCATATTTTTCAGTCCCCTTAGATGAATTCAGGAAGTACACTGCATTTACCATACCTAGTATAAACAATGAAACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'AP_ARRP031_200406'        CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAGGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCAATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTCAATAAGAGGACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGATTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTGGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAAGGAGGATCACCAGCAATATT [...]
+	'JLB_Pat27_200006'         CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAGATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACTGTACTAGATGTGGGGGATGCATATTTTTCAGTTCCCTTACATAGCTTCAGGAAGTATACTGCATTTACTATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTATAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'AP_ARRP028_200406'        CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAACAGAAATATGTACAGAAATGGAAAAAGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAATATTTGCTATAAAGAAAAAAGACAGTACTAAATGGAGGAAATTAGTAGATTTCAGAGAGCTTAATAAAAGAACTCAAGATTTTTGGGAGGTTCAATTAGGAATACCACACCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGGGATGCATATTTCTCGGTTCCCTTAGATGATTTCAGGAAGTACACTGCATTCACCATACCTAGTGTCAACAATGAGACACCAGGGATTAGGTACCAGTACAATGTGCTGCCACAGGGAGGATCACCAGCAATATT [...]
+	'AP_ARRP032_200406'        CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGTCCAAGAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAATAGAAATCTGTACAGAAATGGAAAAAGAAGGAAAAATTGAAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCTATAAAGAAAAAAGACAGTACTAAATGGAGGAAATTAGTAGATTTTAGAGAACTTAATAAAAGAACTCAAGACTTTTGGGAGGTTCAGTTAGGAATACCGCATCCTGCAGGGTTGAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGGGATGCATATTTTTCAATCCCCTTAGATAATTTTAGGAAGTACACTGCATTCACCATACCTAGTACCAACAATGAGACACCAGGACTTAGATACCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'JLB_Pat3_200006'          CCCATTAGTCCTATTGAGACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATCTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCAGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGACTTCAGRGAACTTAATAAGAAAACTCAGGACTTCTGGGAAGTCCAAYTAGGAATACCACACCCCGCAGGGCTAAAAAAGAAAAAGTCAGTAACAGTACTAGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'AP_ARRP035_200406'        CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGGATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAACAGAAATATGTACAGAAATGGAAAAAGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACMGTACTAAATGGAGGAAGTTAGTAGATTTCAGAGAGCTTAATAAAAGAACTCAAGATTTTTGGGAGGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGGGATGCATATTTTTCAGTCCCCTTAGATGAATTCAGGAAGTACACTGCATTCACCATACCTAGTGTCAATAATGAGACACCAGGACTTAGGTACCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'32_199501'                CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTAACAGAAGAAAAAAAAGCATTAATAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAGTCAGTAACAGTACTGGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTACTCCCACAGGGAGGATCACCAGCAATATT [...]
+	'AP_ARRP033_200406'        CCCATTAGTCCTATTGAGACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATCTGTACAGAAATGGAAAAAGAAGGGAAAATTGAAAGAATTGGGCCTGAAAATCCATACAATACTCCAATATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGGAAATTAGTAGATTTTAGAGAACTTAATAAAAGAACTCAAGATTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAGTCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGATTTTAGGAAGTACACTGCATTCACTATACCTAGTGTAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'AP_ARRP027_200406'        CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTAACAGAAGAGAAAAAAGCATTAGTAGAGATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTTAGAGAACTTAATAAAAGAACTCAAGATTTTTGGGAGGTTCAATTAGGAATACCGCATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGGGATGCATATTTTTCAGTCCCCTTAGATGACTTCAGGAAGTACACTGCATTCACCATACCTAGTATCAACAATGAGACACCAGGAATTAGGTACCAGTATAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'JLB_Pat22_200006'         ---------------------------------------------------------------------------------------AAAGCATTGGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATCTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCTATAAAGAAAAAAGACAGTACTAAATGGAGGAAGTTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAGTCAGTRACMGTACTGGATGTGGGTGATGCATATTTCTCAGWTCCCTTAGATAACTTYAGGAAGTATACTGCATTTACTATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAACGTGCTCCCACAAGGAGGATCACCAGCAATATT [...]
+	'5077_198501'              CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAGGAAAAAAAAGCATTAATAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'501229e_199401'           CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAGAAAGCATTAGTAGAAATCTGTACAGAAATGGAAAAGGAAGGGAARATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTTAGAGAACTCAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTATTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATCAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'AP_ARRP025_200406'        CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGGCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAACAAGAGAACCCAAGACTTTTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAGAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATGACTTCAGAAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTGCCACAGGGAGGATCACCAGCAATATT [...]
+	'5155_199601'              CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAGAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCATTAGATGACTTCAGGAAGTATACTGCATTTCCCATACCTAGTATAAACAATGAGACACCAGGGGTTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'690168j_199401'           CCTATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATCTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTCCAATTAGGAATACCACATCCTGCAGGATTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCTTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATCAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'89SP061_198901'           CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATCTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATCGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTACACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'607000236_200101'         CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAGAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAGGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGAYTTCTGGGAAGTTCAATTAGGAATACCRCATCCCGCAGGGTTAAAAMAGAAAAGATCAGTGACAGTACTRGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGCATTCAGAAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCCCAGGGAGGATCACCAGCAATATT [...]
+	'AP_ARRP026_200406'        CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAGGAAAAAAAAGCATTAACAGAAATATGTTTAGAAATGGAAAAAGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAATATTTGCTATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGATTTTTGGGAAGTTCAATTAGGAATACCACATCCCGCTGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTCTCAGTTCCATTAGACGACTTTAGAAAATATACTGCATTCACCATACCTAGTATTAACAATGAGACACCAGGAATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'05AR163052_200501'        CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAACAGAAATATGTTTAGAAATGGAAAAAGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTGGATTTTAGAGAACTTAATAAAAGAACTCAAGATTTTTGGGAGGTTCAATTAGGAATACCACACCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGGGATGCATATTTTTCAGTCCCCCTAGATGATTTCAGGAAGTACACTGCATTCACCATACCTAGTATAAACAATGAAACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'05_132891_200401'         CCCATTAGTCCTATTGAAACDRTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAGTGGCCCTTGACAGAGGAAAAAAAGGCATTGGTAGAAATTTGYACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGARAACCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGAYAGTACTAAATGGAGAAAATTAGTAGACTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGYTAAAAAAGAAAAAATCAGTAACRGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAYTTCAGGAAGTATACTGCATTYACCATACCYAGTATAAACAATGAGACACCAGGAATTAGATATCAGTACAATGTGCTTCCACAAGGAGGATCACCAKCAATATT [...]
+	'05_132892_200401'         CCCATTAGTCCTATTGAAACTGTACCAGTACAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAGATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGATAGTACTAAATGGAGAAAATTAGTAGATTTCAGGGAACTTAATAAARGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACACCCCGCAGGGTTAAAAAAGAAGAAATCAGTAACAGTACTAGATGTGGGTGATGCATATTTTTCAATTCCCTTAGATGATTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTCCCACAGGGAGGATCACCAGCAATATT [...]
+	'05_132890_200401'         CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTYAAACAATGGCCATTGACAGAAGAAAAGAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACRCCAGTGTTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCARTTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATGAATTYAGAAAGTATACTGCCTTTACCATACCCAGTATAAACAATGAGACACCMGGGATTAGGTATCAGTACAATGTGCTTCCACARGGAGGATCACCAGCAATATT [...]
+	'05_132889_200401'         CCCATTAGCACTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAGAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAGGACTTCTGGGAAGTCCAATTAGGAATACCACACCCCTCAGGGTTAAAGAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGATTTTAGGAAGTATACTGCATTTACCATACCCAGTATAAACAATGAGACACCAGGGACTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'PCF_Pat46_200101'         CCCATTAGTCCTATTGACACTGTACCGGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCCTTAATAGAAATATGTACAGAAATGGAAAAAGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGATGGTACTAAATGGAGAAAGTTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGWTCACCAGCAATATT [...]
+	'05_132897_200401'         CCCATTAGTCCTATTGAMACTGTACCRGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTYAAACAATGGCCATTGACAGAAGARAAAAAAGCATTAGTAGAAATCTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTAGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGRATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCAYCAGCAATATT [...]
+	'PCF_Pat47_200101'         CCCATTAGTCCTATTGAACCTGTCCCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGCCAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAGAATTGGGCCTGAAAATCCATATAATACTCCAATATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTCCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTGTAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'05_132896_200401'         CCCATTAGTHCTATTGAAACTGTACCAGTAAAMAAGCCAGGAATGGATGGTCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATYTCAAAAATTGGACCTGAAAATCCATACAATACTCCAGTWTTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGAYTTCAGGGAACTTAATAAGAAAACTCAAGACTTYTGGGAAATTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTRGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACYGCATTYACCATACCYAGTATAAAYAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTGCCACAGGGAGGATCGCCAGCAATATT [...]
+	'05_132895_200401'         CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGTCCAAAAGTTAAACAATGGCCATTGACAGAAGAGAAAAAAGCATTAGCAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCTATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAGATCAGTAACAGTACTGGATGTGGGTGATGCATACTTTTCAGTTCCACTAGATGAATTCAGAAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATCAGATATCAGTACAATGTGCTGCCACAGGGAGGATCACCAGCAATATT [...]
+	'PCF_Pat45_200101'         CCCATTAGTCCCATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCACTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATAGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGAACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGATTTCTGGGAAGTTCAATTAGGAATACCGCATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATAACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCACAAGGGAGGATCACCAGCAATATT [...]
+	'05_132881_200401'         CCCATAAGTCCTATTGARACTGTACCAGTAAARAAGCCAGGAATGGATGGTCCAAAAGTYAAACAATGGCCATTGACAGAAGAAAAAAARGCATTAACAGAAATTTGTRCAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAAYCCATACAATACTCCAATATTTGCTATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTYAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTYCAATTAGGCATACCACATCCCGCAGGATTAAAAAAGAAAAARTCAGTAACAGTACTGGATGTRGGTGATGCRTATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACRCCAGGGATTAGATATCAGTACAATGTGCTYCCACAGGGAGGATCACCAGCAATATT [...]
+	'05_132882_200401'         CCCATTAGTCCTATTGAAACTGTACCAGTAAAGAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAGAAAAAAGCATTAGCAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAGAATTGGGCCTGAAAATCCATACAATACTCCAATATTTGCTATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGAATTTTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGAGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAACGAGACACCAGGGATCAGATATCAGTACAATGTACTCCCACAGGGAGGATCACCAGCAATATT [...]
+	'05_132880_200401'         CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAGAGTTAAACAATGGCCATTGACAGAAGAAAAAAAGGCATTAATAGAAATTTGTACAGAAATGGAAAAGGARGGRAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCYATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTTTGGGAAGTTCAATTAGGGATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTAGATGTGGGTGATGCATATTTTTCAGTTCCCTTACATGACTTTAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGAATTAGATATCAGTACAATGTGCTTCCACAAGGAGGATCACCAGCAATATT [...]
+	'05_132879_200401'         CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAACAGAGATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAGAATTGGGCCTGAAAATCCATACAATACTCCARTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAGGACTTTTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAATAACAGTACTGGATGTAGGTGATGCATATTTTTCAGTTCCTTTAGACGACTTCAGGAAGTATACTGCATTCACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTGCCACAGGGAGGATCACCAGCAATATT [...]
+	'05_132883_200401'         CCCATTAGTCCTATTGAGACTGTACCAGTAAAAAAGCCAGGAATGGATGGGCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGGATACCACATCCCTCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGAYACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'05_132886_200401'         CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGGCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAATGGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAGAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTACAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAGTCAGTAACAGTACTGGATGTGGGGGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCCAGTATAAACAATGAGACACCAGGGATTAGGTATCAGTATAATGTGCTTCCACAGGGAGGATCACCATCAATATT [...]
+	'PCF_Pat44_200101'         CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTATTAGAAATCTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAGAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGGACYCAAGACTTYTGGGAAGTTCAATTAGGMATACCACATCCCGCAGGRTTRAGAAAGAAAAAATCAGTAACAGTACTAGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGRAAGTATACTGCATTYACCATACCTAGTACAAACAATGAGACACCAGGACTTAGATWTCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'05_132885_200401'         CCCATTAGTCCTATTGAAACTGTACCYGTACAAAAGCCAGGAATGGATGGCCCAAAAGTTAGGCAATGGCCATTGACAGAAGAAAAAAAAGCGTTAGTAGAAATTTGTACAGAACTGGAAAAGGAAGGAAAAATTTCAAAAATTGGACCTGAAAATCCATACAACACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAAGTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGTGAAATTCAATTAGGGATACCACATCCCGCAGGGTTAAAAAAGAACAAATCAGTAACCATACTGGATGTAGGTGAYGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'05_132884_200401'         CCTATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAGATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGGGATGCATACTTCTCAGTTCCCTTAGATGACTTCAGAAAGTATACTGCATTTACCATACCTAGTATAAATAATGAGACACCAGGGATTAGATATCAGTATAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'05_132900_200401'         CCCATTAGTCCTATTGAAACTGTACCAGTAAGAAAGCCAGGAAYGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGARGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAGAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAACTAGGAATACCACATCCGGCAGGGTTAAAAAAGAACAAATCAGTAACAGTACTRGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAAGGAGGATCACCAGCAATATT [...]
+	'05_132917_200401'         CCCATTAGTCCTATTGAAACAGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTCAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAAGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAATATTTGCCATAAAGAAAAAAGATGGTAATAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTCCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTAGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGAATTAGATATCAGTACAATGTGCTGCCACAGGGAGGATCACCAGCAAYATT [...]
+	'05_132918_200401'         CCCATTAGTCCTATTGAAACTGTACCAGTACAAAAGCCAGGRATGGATGGCCCAAAAGTTAARCAATGGCCATTGACAGAAGAAAAAAAAGCATTAATGGAAATTTGTACAGARATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGAYAGTACTAAATGGAGAAAATTAGTAGAYTTCAGAGARCTTAATAARAGAACTCAAGACTTCTGGGAAGTTCAGYTAGGAATACCACATCCTGCAGGKTTAAAAAAGAAAAAATCAATAACAGTACTRGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAYTTCAGRAAGTATACTGCWTTTACCATACCYAGTATAAACAATGAGACACCAGGRMYTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'05_132916_200401'         CCTATAAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTGGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCCTATAATACTCCTGTATTTGCCATAAAGAAAAAAGACAGTACTAAGTGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTTTGGGAAGTCCAATTAGGAATACCACATCCAGCAGGATTAAAGAAGAAAAAATCAGTAACAGTACTAGATGTGGGTGATGCATATTTTTCAGTTCCTTTAGATGACTTTAGGAAGTATACTGCATTTACCATACCTAGCATAAACAATGAGACACCAGGAATTAGATATCAGTACAATGTGCTTCCACAGGGGGGATCACCTGCAATATT [...]
+	'05_132915_200401'         CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAGAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAGAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTTAGAGAACTTAATAARAGAACTCAAGATTTTTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCCTAGATGAATTCAGAAAATATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'05_132919_200401'         CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTTAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGAAAGTATACTGCATTTACCATACCTAGTGTAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'05_132922_200401'         CCTATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAGGAAAAAAAAGCATTAATAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAAAAGAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACACAAGACTTCTGGGAAGTTCAACTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCTTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTTTAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGTTCACCAGCAATATT [...]
+	'Pt7655_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTCAAACARTGGCCATTAACAGAAGAAAAAAAAGCATTAATAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAGATTACAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCTATAAAGAAGAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGATTTCTGGGAAGTACAATTAGGAATACCACATCCKGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAMTTYAGGAAGTATACTGCATTCACCATACCTAGTATAAACAATGARACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'05_132921_200401'         CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGTCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTGGTAGAGATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGCACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTGGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTGACTGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGCGACACCAGGGATTAGGTATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'05_132920_200401'         CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAGAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGACCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAGTTAGTAGACTTCAGAGAACTTAATAAGAGAACTCAAGATTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATAACTTCAGGAAATATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCGCAGGGAGGATCACCCGCAATATT [...]
+	'05_132913_200401'         CCCATTAGTCCTATTGAAACAGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAAGAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCTATAAAGAAAAAGGATAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAAGCACCAGGGATTAGATATCAGTACAATGTACTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'05_132903_200401'         CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCRAGAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGATTAAAAAAGAAAAAATCAGTGACARTACTGGATGTGGGTGATGCATATTTTTCAGTTCCTTTAGATGACTTCAGGAAGTATACTGCATTCACCATACCTAGTATAAACAATGAGACACCAGGGGTTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCATCAATATT [...]
+	'05_132905_200401'         CCCATTAGTCCTATTGAAACCGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAGAAAAAAGCATTAATGGAAATTTGTGCAGAAATGGAAAAGGAAGGGAAGATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTGGGGATACCACATCCTGCAGGGTTAAAAAAGAAGAAATCAGTAACAGTACTGGATGTAGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAATATAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'05_132902_200401'         CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGTCCAAAAGTTAAACAGTGGCCATTGACAGAAGAAAAAAAAGCAYTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAACCCATACAATACCCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGARTACCACATCCTGCAGGGTTAAAACAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAARTATACTGCATTCACCATACCTAGTATAAACAATGAGACACCAGGAACYAGATACCAGTACAATGTGCTTCCACAGGGAGGRTCACCAGCAATATT [...]
+	'05_132901_200401'         CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAGAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGATAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGATTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATACTTCTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCCAGTGTAAACAATGAGACACCAGGAATTAGATATCAGTATAATGTGCTTCCCCAGGGAGGATCACCAGCAATATT [...]
+	'PCF_Pat48_200101'         CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCGAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGGGAACTCAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCGCATCCTTCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGACGAATTTAGGAAGTACACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTTCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'05_132911_200401'         CCYATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAGGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGARAAGGAAGGRAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGACTTTAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAGAGATCAGTAACAGTACTGGATGTGGGTGATGCATACTTTTCAGTTCCCTTAGATGAATTCAGAAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGGTATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'05_132912_200401'         CCCATAAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACACCAGTATTTGCCATAAAGAAAAAGGATAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACACAAGACTTTTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTAGATGTGGGCGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATGAACAATGAGACACCTGGGACTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'JLB_Pat13_200006'         CCCATTAGTCCCATTGARACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAACACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTYTGGGAAGTTCAATTAGGGATACCACATCCCTCCGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAYTTCAGGAAGTATACTGCATTYACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'05_132908_200401'         CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAACAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAACCCATACAATACTCCAGTGTTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTTTGGGAAGTTCAATTAGGAATACCGCATCCTGCAGGGTTAAAAAAGAAAAGATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTYCCCTTAGATGACTTCAGAAAGTATACTGCATTTACTATACCAAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAAGGGGGATCACCAGCAATATT [...]
+	'AP_ARRP036_200406'        CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTATGGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACCCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAACTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTCACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'AP_ARRP004_200406'        CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAACCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAACAGAAATATGTATAGAAATGGAAAAAGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAACACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGGAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAGGATTTTTGGGAGGTTCAATTAGGAATACCGCATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGGGATGCATATTTTTCAGTCCCCTTAGATGATTTCAGGAAGTACACTGCATTCACTATACCTAGTGTCAACAATGAGACACCAGGAATTAGGTACCAGTATAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'AP_ARRP005_200406'        CCCATCAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTCAAACAATGGCCATTAACAGAAGAAAAAAAAGCACTAGTAGAAATCTGCACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCAATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGATTTTTGGGAGGTTCAATTAGGAATACCGCATCCTGCAGGGTTAAAAAAGAAAAGATCAGTAACAGTACTGGATGTGGGGGATGCATATTTTTCAGTCCCCTTAGATGATTTCAGGAAGTACACTGCATTCACCATACCTAGTATCAACAATGAGACACCAGGAATTAGGTACCAGTATAATGTACTTCCACAGGGAGGATCACCCGCAATATT [...]
+	'AP_ARRP003_200406'        CCCATTAGTCCTATTGAAACTGTACCAGTAAAGAAGCCAGGAATGGATGGCCCAAAGGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAACAGAAATATGTACAGAAATGGAAAAAGAAGGAAAAATTTCAAAAATTGGACCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACCAAATGGAGGAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGATTTTTGGGAGGTTCAATTAGGAATACCGCATCCTGCAGGGTTAAAAAAGAAAAAATCAATAACAGTACTGGATGTGGGGGATGCATATTTTTCAGTCCCTTTAGATGATTTCAGGAAGTACACTGCATTCACCATACCTAGTGTCAACAATGAGACACCAGGGATTAGATACCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'AP_ARRP001_200406'        CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAATAGAAATCTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCTATAAAGAAAAAGGACAGTAATAAGTGGAGAAAATTAGTAGATTTTAGAGAGCTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAGTCAGTGACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGATTTCAGGAAGTACACTGCATTCACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'AP_ARRP006_200406'        CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTCAAACAATGGCCATTGACAGAAGAAAAAAAGGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGATGGTACTAAATGGAGRAAATTAGTAGATTTYAGAGAACTTAATAAGAGAACTCAAGAKTTCTGKGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAGTCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCATTAGATGATTTCAGRAAGTATACTGCATTTACCATACCTAGCACAAACAATGAGACACCAGGRATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATMTT [...]
+	'JLB_Pat41_200006'         CCCATCAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTAACAGAAGAAAAAAAAGCATTGGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTTTTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTCAATAAGAGAACTCAAGATTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCDGGRCTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCATTAGATGATTTCAGGAAGTATACTGCATTTACCATACCAAGTGTAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTRCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'JLB_Pat42_200006'         CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAGATTTGTACAGAAATGGAAAAGGAGGGAAAAATTTCAAAAATTGGGCCTGAAAATCCGTACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTGGTAGATTTCAGAGAACTTAATAAGAGAACTCAGGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGACGAYTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'JLB_Pat39_200006'         CCTATTAGTCCTATTGATACTGTACCAGTAAAAAAACCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAATAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGATGGTGCTAAATGGAGAAAACTAGTAGACTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAGGAAGAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACAGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCATCAATATT [...]
+	'AP_ARRP009_200406'        CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAGACAATGGCCATTGACAGAAGAGAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAACCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAGCTTAATAAGAGAACTCAAGAYTTCTGGGAAGTTCAATTAGGAATACCACATCCAGCAGGGTTGAAAAAGAAAAAATCAGTAACGGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCTTTAGATGACTTCAGAAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATCAGATATCAGTATAATGTGCTTCCACAGGGAGGATCACCAGCGATATT [...]
+	'ARES2_199701'             CCTATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGTAAGATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTAGGTGATGCATATTTTTCAGTTCCCTTAGATGATTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'AP_ARRP053_200406'        CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAACAGAAATATGCACAGAAATGGAAAAAGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGGAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGATTTTTGGGARGTTCAATTAGGAATACCACACCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTRCTAGATGTGGGGGATGCCTATTTTTCAGTCCCCTTAGATGAGTTCAGGAAGTACACTGCATTCACCATACCWAGTATCAACAATGAGACACCAGGAATTAGGTACCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'AD8_198601'               CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAGAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAGATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGAAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'AP_ARRP051_200406'        CCCATCAGTCCTATTGAAACTGTACCAGTAAAAAAGCCCGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTGACAGAAATATGTCTAGAAATGGAAAARGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATAYAATACTCCAGTATTTGCTATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGATTTCTGGGAAGTTCAATTAGGAATACCACATCCCTCTGGRTTAAAAAAGAAAAAATCAGTAACAGTACTAGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTAAAAACAATGAAACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'ACTG347_0291_199706'      CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGGCCAAAAGTTAAACAATGGCCACTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGRGAAAGTTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTRGGAATACCACATCCYTCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTGTAAACAATGGGACACCCGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'AP_ARRP054_200406'        CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAGAGTCAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAACAGAAATATGTTTAGAAATGGAAAAAGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAATATTTGCCATAAAGAAAAAAGATAGTACTAAATGGAGGAAATTAGTAGATTTCAGAGAACTGAATAAAAGAACTCAAGATTTTTGGGAGGTTCAATTAGGCATACCGCATCCTGCAGGGTTAAAAAAGAAGAAATCAGTAACAGTATTGGATGTGGGGGATGCATATTTTTCAGTCCCCTTAGATGATTTCAGAAAATACACTGCATTCACCATACCTAGTACCAACAATGAGACACCAGGAATTAGGTACCAGTACAATGTGCTTCCACAAGGGGGATCACCAGCAATATT [...]
+	'AP_ARRP058_200406'        CCCATTAGTCCTATTGAAACTGTACCAGTGAAAAAGCCAGGAATGGATGGCCCAAAAGTTAGACAATGGCCATTGACAGAAGAGAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTGTTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACACCCAGCAGGGTTAAAAAAGAACAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAATTCCTTTAGATGACTTCAGAAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGAATTAGATATCAGTACAATGTGCTTCCACAGGGGGGATCACCAGCGATATT [...]
+	'AP_ARRP059_200406'        CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAACAGAAATATGTACAGAAATGGAAAAAGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGGAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGATTTTTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTGCTGGATGTGGGAGATGCATATTTTTCAGTCCCCTTAGACGAGTTCAGGAAGTACACTGCATTCACCATACCTAGTGTCAACAATGAGACACCAGGAATCAGGTACCAATACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'AP_ARRP057_200406'        CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGGATGGATGGCCCAAAAGTTAAGCAATGGCCATTGACAGAAGAAAAAAAAGCATTAAGAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATCTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCTATAAAGAAAAAAGACAGTACTAAATGGAGGAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGATTTTTGGGAGGTTCAGTTAGGAATACCACACCCTGCAGGGTTAAAAAAGARAAAATCAGTAACAGTACTGGATGTGGGGGATGCATATTTTTCAGTCCCCTTAGATGACTTCAGGAAGTACACTGCATTTACAATACCTAGTATCAACAATGAGACACCAGGAATTAGATACCAGTACAATGTGCTTCCACAGGGAGGCTCACCAGCAATATT [...]
+	'AP_ARRP056_200406'        CCTATTAGTCCTATTGAAACTGTACCAGTAAAAAAACCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAATTGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAGTGGAGAAAATTAGTAGATTTCAGAGAACTAAATAAAAGAACTCAAGACTTYTGGGAAGTGCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAARTCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATAACTTCAGGAAGTATACTGCATTCACCATACCTAGTACAAATAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAAGGAGGATCACCAGCAATCTT [...]
+	'CA3900_199902'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGGATGGATGGCCCAAGAGTTAAACAATGGCCACTGACAGAAGAAAAAAAAGCATTAATAGAAATTTGTACAGAAATGGAAAAGGAAGGCAAAATTTCAAAGATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGATAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTGACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTATATGACTTCAGAAAGTATACTGCATTTACTATACCTAGTACAAACAATGAGACACCAGGAATTAGATACCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CA4161_199904'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAGATGGAAAAAGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGGACTCAAGACTTCTGGGAAGTTCAATTAGGGATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTAGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGGTATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt5798_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATCTCAAGAATTGGGCCTGARAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAGTTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTCCAATTGGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTAGATGTGGGTGACGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGCACAAACAATGAGACACCAGGGATTAGATATCAGTATAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CA4152_199904'            CCCATTAGTCCTATTGAYACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGARAAGGAAGGRAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAARGATAGTACTAAATGGAGGAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCMGTTCCCTTAGATGAATTCAGGAAGTAYACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CA4085_199903'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTTCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAGTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGNTATCAGTACAATGTACTTCCTCAGGGAGGATCACCAGCAATATT [...]
+	'CA4289_199904'            CCCATTAGTCCTATTGAAACTGTACCTGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATYGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGAYTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGAGATGCATATTTTTCAGTTCCCTTAGATGATTTCAGGAAGTATACTGCATTCACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAAGGAGGATCACCAGCAATATT [...]
+	'CA4329_199905'            CCCATTAGTCCYATTGAAACTGTACCAGTAAAGAAGCCAGGAATGGATGGCCCGAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAACCCATACAATACTCCAGTATTTGCCATAARGAAAAAAGACAGTACCAAATGGAGAAAATTGGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACACCCCGCAGGGTTAAAGAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCTTTAGATGACTTTAGGAAGTATACTGCATTTACCATACCTWGTATAAACAATGAGACACCAGGGATTAGGTATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'JLB_Pat57_200006'         CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTCAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAGATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAACTAGTAGATTTTAGAGAACTTAATAAGAGAACTCAAGACTTTTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAACAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACTATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTATAATGTGCTTCCRCAGGGAGGATCACCAGCAATATT [...]
+	'JLB_Pat56_200006'         CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAGGTTAAMCAATGGCCATTGACAGAAGAAAAAAAAGCATTAATAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGACGGCTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCGCCAGCAATATT [...]
+	'JLB_Pat55_200006'         CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAARCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAGAAAAAAGCATTAGTAGAAATCTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCARTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCARTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTCCCRCAGGGAGGATCACCAGCAATATT [...]
+	'JLB_Pat53_200006'         CCCATTAGTCCTATTGACACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGSCCATTGACAGAAGAAAAAAAAGCATTAGTAGAGATTTGTACAGAAATGGAAAAGGAAGGRAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAARGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCAYTAGATGACTTCAGAAAGTATACTGCATTTACCATACCTAGTATAAACAATGAAACACCAGGGATTAGATATCAGTACAATGTGCTKCCACAGGGAGGATCACCAGCAATATT [...]
+	'JLB_Pat43_200006'         CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCTATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTTAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCTTATTTCTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAATACAACGTGCTYCCACAGGGAGGATCACCAGCAATATT [...]
+	'CA3954_199903'            CCCATTAGTCCTATTRAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAGAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACYCAAGACTTCTGGGAAGTCCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAGTCAGTAACAGTACTGGATGTGGGTGATGCATACTTTTCAGTTCCCTTAGATRACTTTAGAAAGTATACTGCATTTACCATACCTAGTACAAATAATGAGACACCAGGGATTAGATATCAGTATAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CA3931_199903'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGARAATCCATACAATACTCCAGTATTTGCTATAAAGAAAAARGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAACAAGAGAACTCAAGACTTCTGGGAGGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTAGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAYTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CA3930_199903'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAACCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTACACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGGTATCAGTACAATGTGCTTCCACARGGAGGNTCACCAGCANTATT [...]
+	'JLB_Pat44_200006'         CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGTCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAATGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAGCTTAATAAAAGAACTCAGGACTTCTGGGAAGTACAGTTGGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGCATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTGCCGCAGGGAGGATCACCAGCAATATT [...]
+	'JLB_Pat52_200006'         CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGYCCAAAAGTKAAACAATGGCCATTGACAGAAGARAAAAAAGCATTAGTAGAAATCTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATAYAATACTCCAATATTTGCYATAAAGAAAAARGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAARAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCARTTCCCTTAGATGAATTCAGGAARTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTCCCRCAGGGMGGATCACCAGCAATATT [...]
+	'CA4052_199903'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAGAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAGATGGAAAAAGAAGGCAAAATTTCAAGAGTTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAGTTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAGTCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCGCAGGGAGGATCACCAGCAATATT [...]
+	'JLB_Pat5_200006'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAARAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGACATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGARAATCCATACAATACTCCAGTRTTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCARGACTTCTGGGAAGTCCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTYTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'JLB_Pat49_200006'         CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAGGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAGGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACACAAGACTTCTGGGAAGTTCAATTAGGGATACCACATCCTGCAGGGTTAAAAAAGAAGAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTYTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTATAATGTGCTTCCACAGGGAGGATCACCRGCAATATT [...]
+	'AP_ARRP050_200406'        CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCACTGACAGAAGAAAAAATAGCATTAACAGAAATATGTACAGAAATGGAAAAAGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCTATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGATTTTTGGGAAGTTCAATTAGGAATACCGCATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTAGATGTGGGGGATGCGTATTTCTCAGTCCCCTTAGATGATTTCAGGAAGTACACTGCATTCACCATACCTAGTGTCAACAATGAGACACCAGGAATTAGGTACCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATCTT [...]
+	'AP_ARRP044_200406'        CCCATTAGTCCTATTGAAACTGTACCAGTGAAAAAACCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAATAGAAATATGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGGAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGATTTTTGGGAGGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGAGATGCATATTTTTCAGTTCCCTTAGATGATTTCAGGAAGTACACTGCATTCACTATACCTAGTACCAACAATGAGACACCAGGAGTTAGGTACCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'AP_ARRP045_200406'        CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCRAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTARTAGARATWTGTACAGAAATGGAAAAAGAAGGAAAAATTWYAAAAATTGGGCCTGAAAAYCCATACAATACTCCARTATTTGCYATAAAGAAAAAAGACAGTACTAAATGGAGRAAATTAGTAGATTTCAGAGAACTTAATAARAGAACTCAAGAYTTYTGGGARGTTCAATTRGGAATACCRCATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGKGATGCATATTTTTCAGTTCCMTTASATGAYTTYAGRAAGTAYACTGCATTYACCATACCTAGYRTMAACAATGAGACACCAGGRRTTAGRTAYCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt5796_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAGTGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAGAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGATTTCTGGGAAGTKCAATTAGGAATACCACATCCAGCAGGGTTAAAAAAGAAAAAATCAGTGACAGTACTGGATGTGGGTGATGCATATTTTTCAGTCCCTTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCYAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTACTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'99TH_C1416_199901'        CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAACCAGGAATGGATGGTCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTTAGAGAGCTTAATAAAAGAACTCAAGAATTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCTGTAACAGTCCTGGATGTGGGTGATGCATATTTCTCAGTTCCTTTAGATGACTTCAGGAAGTACACTGCATTTACCATACCTAGTGTAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTACTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'A025_199901'              CCAATTAGTCCCATCGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAATAGAAATCTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAATATTTGCTATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTATATTTTAGAGAACTTAATAAGAGAACCCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAGAAGAAAAAATCAGTAACAGTACTGGATGTGGGGGATGCATATTTTTCAGTTCCCTTAGATGATTTTAGGAAATATACTGCATTTACCATACCTAGTATGAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTGCCACAGGGAGGATCACCAGCAATATT [...]
+	'A050_199701'              CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAATAGAAATATGCACTGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGGAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGATTTTTGGGAGGTTCAATTAGGAATACCGCATCCTGCAGGGTTAAAAAGGAAAAAATCAGTAACAGTACTGGATGTGGGGGATGCTTATTTTTCAGTCCCCTTAGATGATTTTAGGAAGTACACTGCATTCACCATACCTAGTATCAACAATGAGACACCAGGAGTTAGGTACCAGTATAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'380526c_199401'           CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAGAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTAGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGAAAATATACTGCATTTACCATACCTAGTATAAACAATGAAACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'A047_199901'              CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAACAGAAATATGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGGAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGATTTTTGGGAGGTTCAATTAGGAATACCGCATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGGGATGCATATTTTTCAGTACCCTTAGATGATTTCAGGAAGTACACTGCATTCACCATACCTAGTGTCAACAATGAGACACCAGGAGTTAGGTACCAGTATAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'A027_199901'              CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAACAGAAATATGTACAGAAATGGAAAAAGAAGGAAAAATCTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAATATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGGAAATTAGTAGATTTYAGAGAACTTAATAAAAGAACTCAAGATTTTTGGGAGGTTCAATTAGGAATACCGCATCCTGCAGGGTTAAAAAAGAAAAAGTCAGTAACAGTGCTGGATGTGGGGGATGCATATTTTTCAGTCCCCTTAGATGATTTCAGGAAGTACACTGCATTCACCATACCTAGTGTCAACAATGAGACACCAGGAATTAGGTACCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'98USHVTN941c1_199801'     CCCATTAGTCCTATTAAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAGAAAGCATTAATAGAAATTTGTACAGAAATGAAAAAGAAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGATGGTACTAAATGGAGAAAATTGGTAGATTTTAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTGCAACTAGGAATACCACATCCCGCAGGGTTAAAAAAAAAAAAATCAGTGACAGTACTGGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATGACTTCAGAAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGAATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'AP_ARRP038_200406'        CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAGCAATGGCCATTGACAGAAGAAAAAAAAGCACTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAACCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGCACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAGGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAGAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTATAAATAATGAAACTCCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt6030_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGACGGCCCAAGAGTTAAACAATGGCCATTGACAGAAGAAAAGAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTTTGGGAAGTTCAATTAGGAATACCACATCCYGCAGGATTAAAAAAGAAAAAATCAGTAACAGTATTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTACACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'AP_ARRP037_200406'        CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTACAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGGAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGACGTGGGTGATGCATACTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTCACCATACCTAGTACAAACAATGAAACACCAGGGATTAGATATCAGTACAATGTGCTCCCACAGGGAGGATCACCAGCAATATT [...]
+	'93BR029_199301'           CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAGGGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAACAGAAATATGTACAGAAATGGAAAAAGAAGGAAAAATTTCAAAAATTGGGCCCGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGATAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAGTTAGGGATACCACATCCCGCAGGGTTAAAGAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCATTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAAACACCAGGGCTTAGATATCAGTACAATGTGCTTCCACAGGGGGGATCACCAGCAATATT [...]
+	'JLB_Pat32_200006'         CCTATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGRAAAATYTCAAAAATTGGACCTGAAAATCCATAYAATACTCCAGTATTTGCCATAAAGAAAAARGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGRGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAARAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGACGACTTCAGGAAGTAYACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGGTATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'98USHVTN3605c9_199801'    CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGGATGGATGGCCCCAAAGTCAAACAATGGCCATTGACAGAGGAAAAAAAAGCATTACTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAGATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCAATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAGAAGAAAAAATCAGTAACAGTACTGGATGTGGGCGATGCATATTTTTCAGTTCCCTTGGATGATTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'98USHVTN8229c6_199801'    CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGTCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAGGAAAAAAAAGCATTAATAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGATGGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCAGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCATTAGATGAATTCAGAAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAATACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'98USHVTN1925c1_199801'    CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCTATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAGAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGAAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTATAATGTGCTCCCACAGGGAGGATCACCAGCGATATT [...]
+	'AP_ARRP042_200406'        CCCATTAGTCCTATTGAAACTGTACCAGTAAAGAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAGAAAGCATTAATAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACCCCAGTATTTGCTATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAGGTCCAATTAGGGATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAATACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'380587g_199401'           CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAGTGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCGGTAACAGTACTAGATGTGGGGGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'AP_ARRP046_200406'        CCCATTAGTCCTATTGAAACTGTACCAGTGAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAGAAAGCATTAACAGAAATATGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACCAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGATTTTTGGGAGGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAGTCAGTGACAGTACTGGATGTGGGGGATGCATATTTTTCAGTTCCCTTAGATGATTTCAGGAAGTACACTGCATTCACCATACCTAGTATCAACAATGAAACACCAGGAATTAGGTACCAGTACAATGTGCTTCCACAAGGAGGATCACCAGCAATATT [...]
+	'ACTG320_3169_199605'      CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTRACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAAGAAGGGAAAATTTCAAAAATTGGACCTGAAAATCCATACAATACTCCAGTGTTTGCCATAAAGAAAAAAGAYAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGRTTAAAAAAGAAAAAATCAGTAACAGTACTGGAYGTGGGTGATGCATATTTCTCAGTTCCCTTAGATRACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'AC_59_200012'             CCCATTAGTCCTATTGATACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAATAGAAATCTGTGCAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAGTGGAGAAAATTAGTAGATTTCAGAGAACTGAATAAGAAAACTCAAGACTTTTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAGAAGAAGAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACAGCATTCACCATACCTAGTATAAACAATGAGACACCAGGGATTAGGTACCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'AC_38_200001'             CCCATTAGCCCTATTGAGACTGTACCAGTAAAAAAGCCAGGAATGGATGGTCCAAAAGTTAAACAGTGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAAGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACACCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCAGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCCAGTATAAACAATGAGACACCAGGGATCAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'ACTG320_462_199602'       CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCTTTGACAGAAGAAAAAAAAGCATTAGTAGAGATTTGTGCAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCARTATTTGCCATAAAGAAAAAGAACAGTACTAGATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAARAGAACTCAAGATTTCTGGGAGGTTCAATTAGGAATACCACATCCTGCAGGGTTGAAAAAGAGAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAATATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTATAATGTGCTGCCACAGGGAGGATCACCAGCGATATT [...]
+	'AP_ARRP049_200406'        CCCATAAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAGAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACACAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCAGCAGGGTTGAGAAAGAAAAAATCAGTAACAGTGCTGGATGTGGGTGATGCATATTTTTCAGTTCCTTTAGATGATTTCAGAAAGTATACTGCATTTACTATACCTAGTACAAACAATGAGACACCAGGGATTAGATATGAGTACAATGTACTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'ACTG347_0044_199704'      CCCATTAGCCCTATTGAGACTGTACCAGTAAAAAAGCCAGGAATGGATGGGCCAAAAGTTAAGCAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAATTGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTCAACAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCTCAGGGTTAAAACAGAAAAAATCAGTAACAGTGCTGGWTGTGGGTGATGCATATTTTTCAGTTCCCTTAGATAACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'JLB_Pat38_200006'         CCCATTAGTCCTATTGATACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAGAGTTAAACAGTGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATCTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAATATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAGGACTTCTGGGAAGTCCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAGTCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTGTAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'AP_ARRP047_200406'        CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAGGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATCTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTGTTTGCTATAAAGAAAAAAGACAGTACTAAATGGAGAAAACTAGTAGATTTCAGAGAGCTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTAGATGTGGGGGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGAAAGTATACTGCATTTACCATACCCAGTACAAACAATGAGACACCAGGAATTAGATATCAGTACAATGTGCTTCCACAAGGAGGATCACCAGCAATATT [...]
+	'JLB_Pat35_200006'         CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCYATAAAGAAAAAAGATAGTACTAAATGGAGAAAAYTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAGGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTRACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCATTAGATGACTTYAGGAAGTATACTGCATTTACCATACCTAGYATAAACAATGAGACACCAGGGATTAGATATCAGTATAATGTGCTGCCACAGGGAGGATCACCAGCAATATT [...]
+	'39340_200101'             CCAATTAGTCCTATCGAAACTGTACCAGTAAAAAAACCAGGAATGGATGGCCCAAARGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATCTGTACAGAAATGGAAAAGGAAGGGAAAATCTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAATATTTGCCATAAAGAAAAAAGACAGTACYAAATGGAGAAAATTAGTAGATTTTAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAGGTTCAATTAGGAATACCACATCCYGCAGGGTTAAARAAGAAAAAATCAGTAACAGTACTGGATGTGGGGGATGCATATTTTTCAATTCCCTTAGATGAATTCAGGAAATATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCARTACAATGTGCTCCCACAGGGAGGATCACCAGCAATATT [...]
+	'39462_200101'             CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTARTAGAAATWTGTACAGAAATGGAAAAGGAAGGRAAAATTTCAAAAATCGGGCCYGACAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAGTTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTHAGGAAGTATACTGCATTTACCATACCCAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'380639e_199401'           CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAACTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCTCATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATACTTCTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTGTAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'380626L_199401'           CCCATAAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAGGCATTAGTAGAAATTTGTACAGAAATGGAAAAAGAGGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGATTAAAAAAGAAAAAATCAGTAACAATACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTCACCATACCTAGTATAAACAATGAGACACCAGGGATCAGATATCAGTACAATGTGCTTCCACAAGGAGGATCACCAGCAATATT [...]
+	'A063_199901'              CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAACAGAAATATGTGCAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGGAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGATTTCTGGGAGGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'A32989_199701'            CCCATTAGTCCTATTGAAACTGTGCCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAACAGAAATATGTACAGAAATGGAGAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGGAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGATTTTTGGGAGGGTCAATTAGGAATACCGCATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGGGATGCATATTTTTCAGTCCCCTTAGATGATTTCAGGAAGTACACAGCATTCACCATACCTAGTGTCAACAATGAGACACCAGGAATTAGGTACCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'AC_04_200001'             CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAGCAATGGCCATTGACAGAGGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGCAAAATTCAAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGATAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAACTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGCATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTACTTCCACAAGGGGGATCACCAGCAATATT [...]
+	'A32879_199701'            CCTATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAACAGAAATATGTTTAGAAATGGAAAAAGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGGAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGATTTTTGGGAGGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGGGATGCATATTTTTCAGTCCCCTTAGATGATTTCAGGAAGTACACTGCATTCACCATACCTAGTATTAACAATGAGACACCAGGAATTAGGTACCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'A32878_199701'            CCCATTAGCCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAACAGAAATATGCACAGAAATGGAAAAAGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGGAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGATTTTTGGGAGGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGGGATGCATATTTTTCAGTCCCCTTAGATGACTTCAGGAAGTACACTGCATTCACCATACCTAGTATCAACAATGAGACACCAGGAATTAGGTACCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt6047_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAATAGAAATTTGTACAGAAATGGAAAAAGAAGGGAAAATCTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAATATTTGCTATAAAGAAAAAAGATGGTACTAAATGGAGAAAATTAGTAGACTTCAGGGAACTTAATAAAAGAACTCAAGATTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAACAGAAAAAATCAGTAACAGTATTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGAAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCGCCAGCAATATT [...]
+	'Pt6162_200201'            CCCATTAGTCCTATTGAAACGGTACCAGTAAAAAAGCCAGGAATGGACGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTTTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGATTAAAAAAGAAAAAATCAGTAACAGTATTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTTAGGAAGTACACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt6139_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAGAGTTAAACAGTGGCCATTAACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATCTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAACTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGCTAAAAAAGAGAAAATCAGTAACAGTACTGGATGTGGGCGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGAAAGTATACTGCATTTACTATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt6171_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGACGGCCCAAGAGTTAAACAATGGCCATTGACAGAAGAAAAGAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCTATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTTTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGATTAAAAAAGAAAAAATCAGTAACAGTATTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTACACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt6080_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAGGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATCTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCTATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTYAGAGAACTTAATAAGAGAACTCAAGAYTTTTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAGAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGAAAGTATACTGCATTTACCATACCTAGTGTAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCGATATT [...]
+	'Pt7670_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCAYTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCTATAAAGAAAAAAGACAGTACTAARTGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAARAAATCAGTAACAGTACTAGATGTGGGKGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAAYAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTCCCACAGGGAGGATCACCAGCAATATT [...]
+	'LVMP701VIC_199901'        CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATATGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAATATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGCATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTCCCACAGGGAGGATCACCAGCAATATT [...]
+	'RL42_199801'              CCCATTAGTCCTATTAAAACTGTACCAGTAAAAAAACCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATCGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGGGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGCTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCCGTAACAGTCCTGGATGTGGGTGATGCATATTTCTCAGTTCCTTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTGTAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'R77_200401'               ---ATTCGTCCTATCGAAACTGTGCCAGTCAAAAAGTCAGGAATGGATGGCCCAAAAGTGAAGCAATGGCCATTGACAGAAGAGGAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTGCAAAAATTGGGCCTGAAAATCCATACAACACTCCAGTATTTGCCATAAAGAAGAAAGACAGTACTAAGTGGAGAAAATTAGTAGATTTCAGAGAGCTCAATAAAAGAACTCAAGACTTCTGGGAGGTCCAATTAGGAATACCCCATCCTGCGGGGTTAAAAAAGAAAAAATCAGTAACAGTACTAGATGTGGGGGATGCATATTTCTCAGTTCCCTTAGATAATTTTAGAAAATATACAGCATTCACTATACCTAGTACAAATAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGCGGGTCACCAGCAATATT [...]
+	'LV727DIP_199901'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGATAAAAAAGCATTAGTAGAAATCTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAGTTGGGCCTGAAAATCCATACAATACTCCAGTGTTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTGCTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTGGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCGCAGGGAGGATCACCAGCAATATT [...]
+	'LVMP1321_199901'          CCCATTAGTCCTATTGAAACTGTACCAGTGAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCCATATTCGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACACCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTCCTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTATATGATTTTAGAAAGTATACTGCATTTACTATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'LVMP1271_199901'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAACAGAAATCTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGATAGTACTAAATGGAGAAAATTAGTAGACTTCAGAGAACTTAATAAGAGAACTCAAGATTTCTGGGAAGTTCAATTAGGAATACCACACCCTGCAGGACTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCGGGGATTAGATATCAGTACAATGTGCTACCACAGGGAGGATCACCAGCAATATT [...]
+	'LV73HPD_199801'           CCCATTAGTCCTATTGAGACAGTGCCAGTAAAAAAGCCAGGAATGGATGGGCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTTTGGGAAGTTCAATTAGGAATACCACATCCCTCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTAGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'R140_200201'              CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGGTGGGCCAAAAGTTAAACAATGGCCATTGGCCGAAGAAAAAAAAGCATTGATAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGGGATGCATATTTTTCAGTTCCCTTAGATGATTTCAGGAAATATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'JLB_Pat10_200006'         CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAGATTTGTACAGAAATGGAAAAGGAGGGGAAAATTTCAAAAATTGGGCCTGAAAATCCGTACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTGGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGAYGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCATCAATATT [...]
+	'Pt7846_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAACAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAARAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCTCAGGATTAAAAAAGAAAAAATCAGTAACAGTWYTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTACATAGTTTCAGGAAATATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGAATCAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt7766_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATCTCAAAGATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTCAATAARAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATACTTTTCAGTTCCCTTAGATGACTTCAGAAAGTATACTGCATTTACTATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCMCCAGCAATATT [...]
+	'Pt7898_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTCAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAGATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAGGAAAAAATCAGTAACAGTATTGGATGTGGGTGATGCATATTTTTCAGTCCCCTTAGATGACTTCAGGAAGTATACTGCATTCACCATACCTAGTACAAACAATGAGACACCAGGGATCAGGTATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt7988_200201'            CCCATTAGCCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAACAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGTCCTGAAAACCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACAGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGGGGGTCACCAGCAATATT [...]
+	'Pt7978_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGGCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATCTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCGGGGCTAAAAAAGAAAAAGTCAGTAACAGTACTAGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGAAAGTATACTGCATTCACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAAGGAGGATCACCAGCAATATT [...]
+	'Pt7957_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATCTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACCCAAGACTTCTGGGAAGTTCAATTAGGGATACCACATCCCGCAGGGTTRAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGAAAGTATACTGCATTCACCATACCTAGTATAAACAATGAGACACCAGGGAYTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'JLB_Pat89_200006'         CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAGGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAGTTAGTAGATTTCAGAGARCTTAATAAGAGAACTCAAGACTTTTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATACTTTTCAGTTCCCTTAGATGACTTCAGAAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAATACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'OMVB_RT_15_200301'        ------------------------------------------------------------------------------------------GCATTAATAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGATTTCTGGGAAGTTCAATTAGGGATACCACATCCCGCAGGGTTAAAAAAGAAAAAGTCAGTAACAGTACTAGATGTGGGTGATGCATATTTTTCAATTCCCTTAGATGACTTCAGAAAGTATACTGCATTTACCATACCTAGTAGAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCAAAGGGAGGATCACCAGCAATATT [...]
+	'MI_Pat34_200101'          CCCATTAGTCCTATTGAAACTATACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGARGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAARAGAACTCAAGATTTCTGGGAAGTTCAATTAGGCATACCACAYCCWGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGRAAGTATACTGCATTTACCATACCTAGTATAAACAATGARACWCCAGGAATTAGATATCAGTACAATGTGCTTCCACAGGGGGGATCACCAGCAATATT [...]
+	'PCF_Pat104_200101'        CCCATTAGTCCTATTGAAACTGTACCTGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTAACAGAAGAAAAAAAAGCATTTGTAGAAATCTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTCCCAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAGTTAGGAATACCACATCCTGCAGGGTTAAAACAGAAAAAATCAGTAACAGTACTGGATGTGGGCGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'TH283_200101'             CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGTTATAAAGAAAAAGGATAGCACCAAATGGAGGAAATTAGTAGACTTCAGAGAGCTCAATAAAAGAACTCAGGACTTTTGGGAAGTTCAATTAGGAATACCGCACCCAGCAGGTTTAAAAAAGAAAAAATCAGTAACAGTACTAGATGTGGGAGATGCATATTTCTCAGTTCCTTTAGATAGCTTTAGAAAGTATACTGCATTCACCATACCTAGTATAAACAATGAGACACCAGGGATCAGATATCAGTACAATGTGCTGCCACAGGGGGGATCACCAGCAATATT [...]
+	'MI_Pat32_200101'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTAACAGAAGAAAAAAAGGCATTARTAGAAATTTGTACAGAAATGGAAAAAGAAGGGAAAMTTTCAARAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTAMTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAARAGAACTCAAGATTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTGAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTYTCAGTTCCCTTAGATGAYTTCAGRAAGTATACTGCATTTACCATACCTAGTACAAACAATGAAACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'MI_Pat29_200101'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTCAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGARAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGATTAAGAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTYAGRAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCCGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'NH5_199001'               CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAGTGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATCTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGGACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCAGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCATCAGCAATATT [...]
+	'MI_Pat30_200101'          CCCATTAGTCCTATTGAAACTGTACCAGTAAARAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTCGCCATWAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCTCAGGGTTAAAACAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACTATACCTAGTATAAACAATGCGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAAGGAGGATCACCAGCAATATT [...]
+	'MI_Pat31_200101'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAGCAATGGCCATTGACAGAAGAAAAAAAAGCATTGRTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATCTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAGGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGGGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTGAAAAAGAACAAGTCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACTATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTACTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'OMVB_RT_42_200301'        CCCATTAGCCCTATTGAGACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGATTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTAGAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'PCF_Pat101_200101'        CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGCACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACGGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGAYTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGATTTCAGGAAGTATACTGCATTTACCATACCCAGTATAAACAATGAGACACCAGGAATTAGATATCAGTACAATGTGCTTCCCCAGGGAGGATCACCTGCGATATT [...]
+	'OMVB_RT_62_200301'        ---ATTAGCCCTATTGAGACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTTTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'PCF_Pat1_200101'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAACAGAAATTTGTGCAGAAATGGAAAAGGAAGGAAAGATTTCAAAAATTGGGCCTGAAAATCCTTACAATACTCCAATATTTGCYATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGACGACTTCAGGAAGTATACAGCATTCACCATACCTAGTATAAACAATGAGACACCAGGGACTAGATATCAGTACAATGTGCTGCCACAGGGAGGATCACCAGCAATATT [...]
+	'PCF_Pat10_200101'         CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAARAGAACTCAAGAYTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAGTCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCYTTAGATRMRTTTAGAAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTGCCACAGGGAGGATCACCAGCAATATT [...]
+	'TY_pat9_200201'           CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAATAGAAATTTGTACAGAAATGGAGAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGGGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCTGTATCAGTCCTGGATGTGGGTGATGCATATTTCTCAGTTCCTTTAAATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTGTAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'TY_pat1_200201'           CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAAGAAGGGAAAATTTCAGAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCCGGGAACTTAATAAAAGAACTCAGGACTTCTGGGAAGTACAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCCGTAACAGTCTTGGATGTGGGTGATGCATATTTCTCAGTTCCTTTAGATGACTTCAGGAAGTATACCGCATTTACCATACCTAGTGTAAATAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGGTCACCAGCAATATT [...]
+	'OMVB_RT_47_200301'        ---------------------------GTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGANAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGGTATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'TY_pat4_200201'           CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAAATAGTACTAGATGGAGAAAATTAGTAGATTTTAGGGAACTTAATAGAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTCCTGGATGTGGGTGATGCATACTTCTCAGTTCCTTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTGTAAACAATGAGACACCAGGGGTTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'PCF_Pat103_200101'        CCTATCAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAATAGAAATCTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCTATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCTCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTCACCATACCTAGTACAAACAATGCAATACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'MI_Pat28_200101'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTGAAACAATGGCCATTGACAGAAGAGAAAAAAGCACTAATTGAAATCTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAARATTGGGCCTGAAAATCCATACAATACCCCAGTATTTGCCATAAAGAAGAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTAGATGTGGGTGATGCATACTTTTCAGTYCCCTTAGATGACTTYAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATCAGATATCAGTACAATGTACTYCCACAGGGAGGATCACCAGCAATATT [...]
+	'MI_Pat11_200101'          CCCATTAGTCCTATTGAGACTGTACCAGTAARAAAGCCAGGAATGGATGGCCCAAARGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAGATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGARAACTCAAGACTTYTGGGAAGTTCAATTAGGAATACCACATCCCKCAGGGTTAAAAAAGAAAAAGTCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTATAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'PCF_Pat108_200101'        CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTAACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAGAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAGTGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTGAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCTTTAGATGAATTCAGGAAGTAYACTGCATTTACCATACCTAGTATAAAYAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'MI_Pat12_200101'          CCYATTAGTCCTATTGAAACTGTACCAGTRAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAAGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCYATAAAGAARAAAGACAGTACTAAATGGAGRAAATTAGTAGAYTTCAGAGAACTTAATAAGAGAACTCAAGAYTTCTGGGARRTTCAATTAGGAATACCACATCCTGCAGGRTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGRAAGTAYACTGCATTTACCATACCTAGTGTAAACAATGAGACACCAGGGATTAGATATCARTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'MI_Pat14_200101'          CCCATTAGTCCTATTGAACCTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGARAAAAAAGCATTAGTAGAAATTTGTACAGARATGGAAAAGGAAGGGAARATTTCAAAAATTGGGCCTGARAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAARTTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCMTTASATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTAYAATGTACTCCCACAGGGAGGATCACCAGCAATATT [...]
+	'MI_Pat1_200101'           CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAGGAAAAAAAAGCATTAATAGAGATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAGCTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGATTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGATTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'JLB_Pat94_200006'         CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAGATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTCGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAAYTAGTAGATTTTAGAGARCTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTTAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGGTCACCAGCAATATT [...]
+	'JLB_Pat9_200006'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCNTTAGTAGAAATTTGTACAGAAATGGAGAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTTAGGGAACTTAATAAGAGAACTCAAGACTTYTGGGAAGTCCARTTAGGAATACCACATCCCGCRGGGTTAAAAAAGAAAAAATCAGTAACAGTACTAGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACRCCAGGGATTAGRTATCAGTACAATGTGCTKCCACAGGGAGGRTCACCAGCAATATT [...]
+	'JLB_Pat95_200006'         CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAGAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAATATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGRAAATTAGTAGACTTCAGAGAACTTAATAAGAAAACTCARGAYTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTAYACTGCATTYACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'JLB_Pat96_200006'         CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAGAAAGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAATATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGACTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAMCAGTACTGGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'PCF_Pat107_200101'        CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAACAGAGATCTGTGCAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGTCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTCCAATTAGGAATACCACATCCAGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCCTAGATGAATTCAGGAAGTAYACTGCATTCACCATACCTAGTAGAAACAATGAGACACCAGGGATTAGATATCAGTATAATGGRCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'MI_Pat23_200101'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTARACAATGGCCATTGACAGAAGAAAAAAAAGCATTATTAGARATTTGTGCAGAGATGGAAAAGGAAGGGAARATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCYATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGAYTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTRGATGTGGGTGATGCATATTTTTCAGTTCCTTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGRTATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'SM_02YE519_200201'        CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATCTGTACAGAAATGGAAAAGGAAGGAAAGATTTCAAAAATTGGGCCTGAAAACCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTGGATTTCAGAGAACTCAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGATTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCTTTAGATGACTTCAGGAAGTATACTGCCTTTACCATACCCAGCACGAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'MI_Pat25_200101'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTGATAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAACCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTCAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCTCATCCCGCTGGATTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCTTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'PCF_Pat105_200101'        CCCATTAGTCCTATTGAGACTGTGCCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTCAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAACCCATACAATACTCCAGTATTTGCTATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCGCATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTCCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'MI_Pat22_200101'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAGATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATAYAACACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCMGGGGTTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'MI_Pat2_200101'           CCCATTAGTCCTATTGAAACTATACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAAGAAGGGAAAATCTCAAGAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTGAAYAAGAGAACTCAAGACTTTTGGGAAATTCAATTAGGAATACCACATCCCTCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGGGATGCATATTTTTCAGTTCCTTTAGATGATTTCAGAAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAAGGGGGATCACCAGCAATATT [...]
+	'MI_Pat20_200101'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTCCAATTGGGAATACCACATCCYKCAGGGTTAAARAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGRAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'V62_199901'               CCAATTAGTCCCATCGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCCCATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTATAAATAATGAGACACCAGGAATTAGATATCAGTACAATGTGCTCCCGCAGGGAGGATCACCAGCAATATT [...]
+	'PCF_Pat49_200101'         CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCYATAAAGAAAAARGACAGTACTAAATGGAGAAAACTAGTAGATTTYAGAGAACTTAATAAGAGGACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTAGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTCACCATACCTAGTATAAACAATGAGACACCAGGGATKAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'PCM031_200101'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGCAGAAAAACAAGCATTGACAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACCCCAGTATTTGCCATAAGGAAAAAAGACAGTACTAAATGGAGAAAGTTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGATTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGACGAATTCAGGAAGTATACTGCATTTACCATACCTAGTACGAATAACGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATTTT [...]
+	'PCM034_200101'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTAGGCCTGAAAATCCGTACAATACTCCAATATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGATTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTAGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGAAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGAATTAGATATCAGTATAATGTGCTGCCGCAGGGAGGATCACCAGCAATATT [...]
+	'PCM039_200101'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAGGTTAAACAATGGCCATTAACAGAAGAAAAAAAAGCGTTAATAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGACCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTTAGAGAGCTTAATAAGAAAACCCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTCACCATACCTAGTATAAATAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAAGGAGGGTCACCAGCAATATT [...]
+	'PCM023_200101'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAGGTTAAACAATGGCCATTAACAGAAGAGAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATCTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAGAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACCCAAGACTTTTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAACAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCTTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAATAATGAGACACCAGGGATTAGATATCAATACAATGTGCTGCCACAAGGAGGGTCACCAGCAATATT [...]
+	'PCM001_200101'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAGCAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTTTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGGGATGCTTATTTTTCAGTTCCCTTAGATGATTTCAGGAAATATACTGCATTTACCATACCTAGCATAAACAATGAGACACCAGGGGTTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'PCM013_200101'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAGGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAGAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACACAAGACTTTTGGGAAGTTCAGCTAGGAATACCACATCCCGCAGGGTTAAAACAGAAAAAATCAGTGACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACTATACCTAGTACAAATAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATTTT [...]
+	'PCM074_200101'            CCCATTAGTCCTATTGAAACTGTACCAGTRAAAAAGCCAGGGATGGATGGCCCAAAAGTTAAACAATGGCCTTTGACAGAAGAAAAAAAAGCATTAGAAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAACCCATACAATACTCCAGTGKTTGCAATAAAGAAGAAAGACAGTACTAAGTGGAGAAAGTTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGGATACCACATCCCTCAGGGTTAAAAAAAAAAAAATCAGTAACAGTACTAGATGTGGGAGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTAGAAATAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCGCCAGCAATATT [...]
+	'MI_Pat37_200101'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGRAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCARGACTTCTGGGAAGTTCAATTAGGNATACCACATCCNGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGANTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTNCCACAGGGAGGCTCGCCAGCAATATT [...]
+	'PS1038_200407'            CCCATTAGTCCTATTGAGACTGTACCAGTAAAAAAACCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAGATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAARGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGGGAGCTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCMGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACYATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACARGGAGGGTCACCAGCAATATT [...]
+	'MI_Pat36_200101'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAGAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCACTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTGTTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAGACTCAAGACTTCTGGGAAGTTCAGCTAGGGATACCACATCCAGCAGGGTTAMAAAAGAAAAAATCAGTAACAGTACTAGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATGACTTCAGAAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATAAGATATCAATACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'PD_199301'                CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTATTGGATGTAGGTGACGCATATTTTTCAGTTCCCTTAGATAGCTTCAGAAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCCGGGATTAGGTATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'MI_Pat35_200101'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAGAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAGAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCTATAAAGAAAAAAGACAGTACTAAATGGAGGAAATTAGTAGATTTTAGAGAACTTAATAAAAGAACCCAAGACTTCTGGGAAGTCCAATTAGGAATACCACATCCAGCAGGGCTAAAGAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTGCCCTTAGATGACTTCAGGAAGTACACTGCATTTACCATACCTAGTATAAATAATGAGACACCAGGGGTCAGATATCAGTACAATGTACTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'PCF_Pat99_200101'         CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCCTTAGCAGAAATCTGTGCAGAAATGGAAAAGGAAGGGAAAATCTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAGTTAGTAGATTTCAGAGAACTCAATAAGAGAACTCAGGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTATTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGAYGACTTCAGGAAGTATACTGCATTTACCATACCTAGCATAAATAATGAGACACCAGGGATTAGATATCAGTATAATGTGCTTCCACAGGGAGGATCRCCAGCCATATT [...]
+	'MI_Pat86_200101'          CCCATTAGTCCTATTGAGACTGTACCAGTAAGAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAGATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAGTCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTATAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'PCF_Pat91_200101'         CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTYAAACAATGGCCATTGACAGAAGAAAAAAARGCATTAATAGAAATCTGTACAGAAATGGAACAGGAAGGGAARATTTCAAAARTTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCHATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGAYTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAGAAATCAGTAACAGTACTGGATGTGGGTGATGCATAYTTTTCAGTTCCTTTAGATGAATTCAGGAAGTACACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTRCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'MI_Pat87_200101'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAGGTTAAACAATGGCCATTGACAGARGAAAAAAAAGCATTARTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAARGACAGTACTAAATGGAGAAARTTAGTAGATTTYAGAGAACTTAATAAGAGAACTCARGACTTCTGKGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCYTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGYATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTGCCACAGGGAGGRTCACCAGCAATATT [...]
+	'PCF_Pat88_200101'         CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTARTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTGGTAGATTTCAGAGAACTTAATAAGARAACTCAAGACTTCTGBGAAGTYCARTTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCTTTAGATGACTTCAGGAAGTATACTGCGTTTACCATACCTAGTATAAACAATGAAACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'PCF_Pat89_200101'         CCCATTAGTCCTATTGARACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCGAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAGTAGGGCCTGAAAATCCATACAATACTCCAGTCTTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCCAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'PCF_Pat92_200101'         CCCATTAGTCCTATTGAAACTGTACCAGTAAAWAAGCCAGGAATGGACGGCCCAAAGGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAGTTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTTAGAGAACTTAATAAGAGAACTCAAGATTTCTGTGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGATTTCAGAAAGTACACTGCATTTACCATACCTAGTATAAATAATGCGACGCCAGGGATTAGGTATCAGTATAATGTGCTTCCACMGGGAGGATCACCAGCAATATT [...]
+	'MI_Pat85_200101'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAAGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATATAACACCCCAGTATTTGCAATAAAGAAAAAAGACAGTACTAAATGGAGAAAAYTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGRTTAAAAAAGAAAAAATCAATAACAGTACTAGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTACACTGCATTTACCATACCTAGCATAAACAATGAGACACCAGGGGTTAGATATCAGTATAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'PCF_Pat98_200101'         CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGGCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAACCCATATAATACTCCARTRTTTGCCATAAAGAAAAARGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGAYTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTRGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATAYCAGTACAATGTGCTGCCACAGGGAGGATCACCAGCAATATT [...]
+	'PCF_Pat96_200101'         CCCATTAGTCCTATTGACACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATCTCAGAAGTTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCGCATCCMGCAGGGTTAAAAAAGAAAAGATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGAAGAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'PCF_Pat94_200101'         CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAACCAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATCTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTAYTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGARTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGARACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'PCF_Pat95_200101'         CCCATTAGTCCTATTAAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTCAAACAATGGCCATTGACAGAAGAAAARAAAGCATTAATGGAAATCTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAGGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATWCCTAGTATAAATAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'MI_Pat83_200101'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAGATTTGTACAGAAATGGAAAAGGAAGGAAARATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACYAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTKCAATTAGGAATACCACATCCTGCAGGATTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATAYTTYTCAGTYCCCTTAGATGAATTCAGRAAGTATACTGCATTYACCATACCYAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATYACCAGCAATATT [...]
+	'MI_Pat61_200101'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCAYTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATCTCAAAAATTGGGCCTGAAAACCCATACAATACTCCAGTATTTGCTATAAAGAAAAAGAACAGTGATAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGAYTTCTGGGAAGTTCAATTAGGAATACCACAYCCYGCAGGGCTAMAAMAGAAAAAATCAGTAACAGTACTAGATGTAGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAAGGAGGATCACCAGCAATATT [...]
+	'MI_Pat62_200101'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAARAGTTAAACAATGGCCATTGACAGAAGAAAAGAAAGCATTARTAGAAATTTGTACAGAAATGGAAAAGGAAGGRAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAKTAGATTTCAGAGAACTTAATAARAGAACTCAAGACTTCTGGGARGTTCAATTAGGAATACCACATCCYGCAGGGYTAAARAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTACCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTRCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'MI_Pat59_200101'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAGAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTGTAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'MI_Pat56_200101'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAAGAAGGGAAAATTTCAAAAATTGGGCCTGAAAACCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGATAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGATTTCTGGGAAGTTCAATTAGGCATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTCCCTTTGGATGAGTTCAGGAAGTATACTGCGTTTACCATACCTAGTACAAATAATGAGACACCAGGAATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'MI_Pat57_200101'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTAAAGAATTGGARAAGGAAGGRAAAATCTCRAAAATTGGGCCTGAAAATCCATACAATACTCCAATATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAARAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAARGAARAGATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTGCCACAGGGAGGATCACCAGCAATATT [...]
+	'MI_Pat65_200101'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGCACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGGGAACTTAATAAGAGAACTCAAGATTTCTGGGAAGTTCAGTTAGGAATCCCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCATCAATATT [...]
+	'MI_Pat69_200101'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTCAARCAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATYTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAARAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGATTAAGAAAGAAAAAATCAGTAACAGTAYTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCCGGGGTYAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'MI_Pat70_200101'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTGAAACAATGGCCATTGACAGAAGAGAARAAAGCACTAATTGAAATCTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACCCCAGTATTTGCCATAAAGAAGAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTAGATGTGGGTGATGCATACTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATCAGATATCAGTACAATGTACTCCCACAGGGAGGATCACCAGCAATATT [...]
+	'MI_Pat68_200101'          CCCATTAGTCCTATTGAAACAGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGRAAGATTTCRAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAGAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAAYAAGAGAACTCAAGACTTCTGGGAGGTTCAATTAGGAATACCACATCCTGCAGGGCTAAAACAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAARTATACTGCATTTACCATACCTAGTACAAACAATGARACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'MI_Pat66_200101'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAGGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGRRAAAATTTCAAAAATTGGGCYTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTTAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCAGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCCTATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGGTATCAGTACAATGTGCTTCCACAGGGAGGATCACCATCAATATT [...]
+	'MI_Pat67_200101'          CCCATTAGCCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCACTGACAGAAGAAAAAAAAGCATTATTAGAAATTTGTGCAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAAYAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACAYCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTCACCATACCTAGTATAAACAATGAGACACCAGCGRTGAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'MI_Pat55_200101'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAGATTTCAAAAATTGGGCCTGAAAACCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAACAGAAAAACTCAAGACTTCTGGGAGGTTCAGTTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGACGTGGGTGATGCATATTTTTCAGTTCCTTTAGATGATTTCAGGAAGTATACTGCTTTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTCCCACAGGGAGGATCACCAGCAATATT [...]
+	'MI_Pat82_200101'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAARCAGTGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAGATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAGGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTAGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAARTATACTGCATTTACCATACCTAGTATMAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTYCCACAGGGAGGATCACCAGCAATATT [...]
+	'mother_199601'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'PS3002_200502'            CCCATTAGYCCTATTGARACTGTRCCAGTAAGAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATCTGTACAGAAATGGAAAAAGAAGGGAAAATTTCAAAAATTGGGCCTGAAAACCCATACAATACCCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTGAATAAGAGAACTCAAGATTTTTGGGAAGTTCAATTAGGAATACCACAYCCCTCAGGGTTAAAAAAGAATAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCATTAGATGAATTCAGAAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCTGGGATCAGATATCAATACAACGTGCTTCCACAGGGAGGATCACCAGCRATATT [...]
+	'PS2016_200501'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAAGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCYATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAGGTTCAATTAGGAATACCACATCCAGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATACTTTTCAGTTCCCTTAGATGACTTCAGAAAGTATACAGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGACTAGATATCAGTATAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'PS2019_200501'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAGAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAAGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTGGTAGATTTCAGAGAACTTAATAARAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGAAAATATACAGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATACCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'MI_Pat44_200101'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTAACAGAAGAAAAAAAAGCATTAGYAGAAATCTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAGATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAARGACAGTACYAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGATTTCTGGGAGGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGATTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAAACACCAGGGRTTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'MI_Pat5_200101'           CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCGAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAGGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTCCCYTTACATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGAATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'MI_Pat54_200101'          CCCATTAGCCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTCAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTGGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAATATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTGGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTCCAATTAGGAATACCACATCCCGCAGGGTTAAGAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTACCCCTAGATGACTTCAGGAAGTATACTGCATTTACCRTACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'MI_Pat72_200101'          CCCATTAGTCCTATTGAGACTGTACCAGTAAGAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAGATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGARAACTCAAGACTTYTGGGAAGTTCAATTAGGAATACCACATCCCKCAGGGTTAAAAAAGAAAAAGTCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACYTRGTATAAACAATGAGACACCAGGGATTAGATATCAGTATAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'MI_Pat45_200101'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGTCCAAAAGTTAAACAATGGCCATTGACAGAGGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGACTTTTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTGACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCTTTAGATGACTTCAGGAAATATACTGCATTTACCATACCTAGTATAAACAATGCGACACCAGGGGTTAGATATCARTATAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'MI_Pat46_200101'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTGTTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAGGTTCAATTAGGAATACCACATCCCGCAGGGCTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAMTTCAGGAAGTATACTGCATTTACCATACCTAGCATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'PCF_Pat87_200101'         CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAATAGAAATCTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAATTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACTATACCTAGTACAAACAATGAGACACCAGGGATTAGATACCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'PCF_Pat63_200101'         CCCATTAGTCCTATTGACACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAARGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATCTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCMTTAGATGAATTCAGGAAGTATACTGCATTCACCATACCTAGTATAAACAATGAGACCCCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCCGCAATATT [...]
+	'PCF_Pat64_200101'         CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATCTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCYGCAGGGTTAAAAMAGAAAAAATCAGTAACAGTAYTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGACTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'PCF_Pat62_200101'         CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAATAGAAATCTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAGAATTGGGCCTGAAAATCCATATAATACTCCAATATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAGTTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCCAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'PCF_Pat60_200101'         CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGACCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATCTGTACAGAAATGGAAAAGGAAGGGAARATTTCAAAAATTGGGCCTGAGAATCCATATAATACTCCAGTATTTGCCATAARGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGAYTTTTGGGAAGTTCARTTAGGAATACCACATCCYGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTYTCAGTTCCYTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'PCF_Pat61_200101'         CCCATTAGTCCTATTGAGACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATCTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAABCCATACAATACTCCAGTATTTGCTATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTATTGGATGTGGGTGATGCATATTTYTCAGTTCCYTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTATAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'PCF_Pat65_200101'         CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAGGTTAAACAATGGCCATTAACAGAAGAAAAAAAAGCATTAGTAGAAATCTGTACAGAAATGGAAAAGGAAGGGAARATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAGGTTCAATTAGGAATACCACAYCCCTCAGGGTTAAAAAAGAAGAAATCAGTAACAGTACTGGATGTGGGWGATGCCTATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATGTGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'PCF_Pat69_200101'         CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAACCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAGCTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAACTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATATATACAATGTACTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'JMV_AZT_198407'           CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCTTTAGTAGAAATTTGTACAGAGATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCTATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTAGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'PCF_Pat68_200101'         CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAGAAAAAAGCATTAATAGAAATTTGTACAGAAATGGAAAAGGAAGGRAAAATTTCAAAAATTGGGCCTGAAAATCCATATAACACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTCCAACTAGGAATACCACATCCCGCAGGGTTAAAGAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTCCCATACCCAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'PCF_Pat66_200101'         CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGGTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAATAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCRAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTGAAAAAGAAAAAATCAGTAACAGTAYTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGAYGACTTCAGGAARTATACTGCATTTACCATACCAAGTATAAACAATGAGACACCAGGGATTAGRTATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'PCF_Pat67_200101'         CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAACCAGGAATGGATGGCCCAAAAGTAAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATATGTACAGAAATGGAAAAGGAAGGGAAAATTACAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCTATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGATTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTAGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGAATTAGGTATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'PCF_Pat6_200101'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAACCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAACAGAAATCTGTACAGACATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAATATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTGGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAWGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGAAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTATAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'PCF_Pat52_200101'         CCCATTAGTCCTATTGAAACTGTACCAGTGAGAAAGCCAGGAATGGATGGCCCAAGAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATCTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAGATTGGGCCTGAAAATCCATATAATACTCCAATATTTGCCATAAAGAAAAAAGAYAGTAMTAAATGGAGAAAATTAGTAGACTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGCGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'PCF_Pat53_200101'         CCTATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGGCCAAAAGTTAAACAATGGCCATTGTCAGAAGAAAAAAAAGCATTAGTAGAAATTTGCACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCTCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGATTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCCGGGATTAGATATCAGTACAATGTACTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'PCF_Pat51_200101'         CCTATTAGTCCTATTGAAACTATACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAACAGAAATCTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAARAAGAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAARAGAACTCAAGATTTCTGGGAAGTTCAGTTAGGAATACCACATCCYGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGAGAYGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTATAAATAATGAGACACCAGGGATTAGGTATCDGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'PCF_Pat5_200101'          CCCATTAGTCCTATTGACACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATCTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAATATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'PCF_Pat50_200101'         CCCATTAGTCCTATTGAAACTGTDCCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATATGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAGTTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCTATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCDGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTTAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGMCMCCAGGGACTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'PCF_Pat54_200101'         CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACDGAAGAAAAAAAAGCATTAATAGAAATHTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTRTTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCBGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATAYCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'PCF_Pat58_200101'         CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATCTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATATAAYACTCCRGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGGGAACTTAATAAGAAVCCTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCMTATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACYATACCTAGTATAAACAATGAGACACCAGGAATTAGATATCAGTACAATGTGCTGCCACAGGGAGGATCACCAGCAATATT [...]
+	'PCF_Pat59_200101'         CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTARACAATGGCCATTGACAGAGGAAAAAAAAGCATTAATAGAAATCTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTGAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCCTAGACGAATTCAGGAAGTAYACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTCCAATGTSCTTCCACAAGGAGGATCACCAGCAATATT [...]
+	'PCF_Pat57_200101'         CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAGAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAATGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAGGTTCAATTAGGAATACCACATCCCGCAGGGCTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTCACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'HDM003_200401'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGGATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTACAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGGATACCACATCCCGCAGGGTTAAAAAAGAAGAAATCAGTAACAGTACTGGATGTAGGTGATGCATATTTCTCAGTTCCATTAGATAACTTCAGAAAGTATACTGCATTTACCATACCTAGTATAAACAATGAAACACCAGGGATTAGATATCAGTACAATGTGCTGCCACAGGGAGGATCACCAGCAATATT [...]
+	'PCF_Pat56_200101'         CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGCACAGAAATGGAAAAGGAAGGRAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGATTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGATTTCAGGAARTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGAATTAGATATCAGTAYAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'WEAU1_60_199001'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAGAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTTCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTACCCTTAGATGACTTCAGGAAGTACACTGCATTTACCATACCTAGTATAAACAATGAAACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'PCF_Pat8_200101'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGRAAAATTTCAAGAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAARGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGRATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGAYGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'PCF_Pat80_200101'         CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAATAGAAATCTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAARARAACTCAAGACTTCTGGGARGTTCAATTAGGAATACCACATCCCGCAGGGTTAAARAAGAAAAAATCAGTAACAGTACTRGATGTGGGTGATGCATATTTTTCAGTTCCATTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAATATAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'PCF_Pat79_200101'         CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTCAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTRTTTGCTATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGGACTCAAGACTTCTGKGAAGTTCAATTAGGAATACCACATCCMGCAGGGTTAAAAAAGAAAAARTCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCATTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTAGAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'PCF_Pat77_200101'         CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTARTAGAAATCTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTATAAATAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTBCCACAGGGAGGATCACCAGCAATATT [...]
+	'PCF_Pat78_200101'         CCCATTAGTCCTATTGAAACTGTACMAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTGAAACAATGGCCATTAACAGAAGAAAAAAAAGCATTARTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCKCAGGGTTAAGAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGAAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGAATTAGATATCAGTACAATGTACTGCCACAGGGAGGATCACCAGCAATATT [...]
+	'MI_Pat90_200101'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAGAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAATGGAAATTTGTACAGAATTRGAGAAGGAAGGGAAAATCTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAARGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATACTTCTCAGTTCCCTTAGAYGAATTCAGAAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTAYAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'PCF_Pat85_200101'         CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATCTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCKCAGGGTTAGAACAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATAAGACACCAGGGACTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCMCCAGCAATATT [...]
+	'PCF_Pat86_200101'         CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTGGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAGAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGATTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCGGGGTTAAAAAAGAAAAAGTCAGTAACAGTACTAGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAACGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAAGGAGGATCACCCGCAATATT [...]
+	'MI_Pat89_200101'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTCGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCTCAGGGTTAAAACAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACTATACCTAGTATAAACAATGCGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAAGGAGGATCACCAGCAATATT [...]
+	'PCF_Pat82_200101'         CCCATTAGTCCTATTGAAACTGTCCCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAATRGAAATCTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAARTTGGGCCTGAAAATGCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTYTGTGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAATTCCATTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTTGTCAAAACAATGAGAGACCAGGGATTAGATATCAGTACAATGTACTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'PCF_Pat83_200101'         CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGSCAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCTAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCYAGTATAAACAATGAGACACCAGGGATTAGRTATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'PCF_Pat76_200101'         CCTATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAATGGAAATCTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTGTTTGCMATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGAYTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTYCAATTAGGAATACCACATCCCKCAGGGTTGAAAAAGAGAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGRTATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'PCF_Pat74_200101'         CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCACTGACAGAAGAGAAAAAAGCATTAGTAGAAATCTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAGAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGAYTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCYGCAGGGTTAAAAAAGAAAAAATCAGTAACWGTGCTGGATGTGGGTGATGCATAYTTTTCAGTTCCCTTAGATGAGTTTAGGAAGTATACTGCATTTACCATACCTAGTACAAATAATGAGGTACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'MI_Pat99_200101'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGTCCAAAAGTTAAACAATGGCCATTGACAGAGGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGACTTTTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTGACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCTTTAGATGACTTCAGGAAATATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGGTTAGATATCAGTATAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'PCF_Pat73_200101'         CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAGATCTGTACAGAGATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGGACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATGAATTCAGRAAATATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'PCF_Pat71_200101'         CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAARAATTGGGCCTGAAAATCCATATAATACTCCARTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAAYTWGGAATACCACATCCCGCRGGGTTAAGAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTYAGGAARTATACTGCATTTACCAWACCTAGTATAAACAATGAGACACCAGGGATTAGRTATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'PCF_Pat72_200101'         CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAACCAGGAATGGATGGCCCAAAAGTTAAGCAATGGCCATTGACAGAAGAAAAAAAAGCATTAATAGAAATTTGTACAGAAATGGAGAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAACCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGATAGTACTAAATGGAGAAAATTGGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAGTTAGGAATACCCCATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACTATACCTAGTATAAACAATGAGATACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'X1241_200201'             CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAACAGAAATATGTACAGAAATGGAAAAAGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACCCCCATATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGGAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGATTTTTGGGAGGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTAGATGTGGGAGATGCATATTTTTCAGTCCCCTTAGATGATTTCAGGAAGTACACTGCATTCACCATACCTAGTACCAACAATGAGACACCAGGAATTAGGTACCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'YNRL9828_200301'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATCGGGCCTGAAAATCCATACAATACTCCAGTATTTGCTATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGGGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCCGTATCAGTCCTGGATGTGGGTGATGCATATTTCTCAGTTCCTTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTGTAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'MI_Pat98_200101'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCACTGACAGAAGAAAAAAAAGCATTAACAGAAATTTGTNCAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAGTTGGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATACTTTTCAGTTCCATTAGATGACTTCAGGAAGTATACTGCATTTACCATACCCAGTATAAATAATGAGACACCAGGGATTAGATATCAGTACAATGTACTTCCGCAGGGAGGATCACCAGCAATATT [...]
+	'YNRL9613_200301'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATCGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGGGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTGACAGTACTGGATGTGGGGGATGCATATTTTTCAGTTCCTTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTGTAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAAGGAGGGTCACCAGCAATATT [...]
+	'Y10443_200001'            CCAATAAGCCCTATTGAAACTGTACCAGTAACAAAGCCAGGAATGGATGGCCCAAAGGTTAAACAATGGCCATTAACAGAAGAGAAAAAAGCATTAACAGACATTTGTAGGGAGATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACACCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTTCCTTAGATGACTTCAGAAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATTTT [...]
+	'YNRL9607_200301'          CCAATCAGTCCCATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAGGTTAAACAATGGCCGTTGACAGAAGAGAAAAAAGCATTAACAGCAATTTGTGATGAAATGGAGAAGGAAGGAAAAATTACAAAAATTGGGCCTGAAAATCCATATAACACTCCAATATTTGCCATAAAAAAGAAGGGCAGTACTAAGTGGAGAAAATTAGTAGATTTCAGGGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAGTTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCCGTAACAGTCCTGGATGTGGGTGATGCATATTTCTCAGTTCCTTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTGTAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAAGGAGGGTCACCAGCAATATT [...]
+	'CA8090_200101'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAGATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTTTGGGAAGTTCAATTAGGAATACCACACCCCGCAGGGTTAAAAAAGAGAAAATCAGTAACAGTATTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTGGATGACTTCAGGAAATATACTGCATTCACCATACCTAGTATAAACAATGAGACACCAGGGGTTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CA16370_200306'           CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTAACAGAAGAAAAAAAAGCATTAGTAGACATTTGTACAGAAATGGAAAAGGAAGGRAAAATTTCAARAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAGGAYAGTACTAAATGGAGAAAATTAGTAGACTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCTCAGGGTTAAAACAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATACTTTTCAGTTCCCTTAGATGACTTCAGAAAATATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGAYTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CA16381_200306'           CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAGTGGCCATTGACAGAAGAAAAAAAAGCGTTAGTAGAAATTTGTACAGAAATGGAAAGGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACGGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGCGATGCATATTTTTCAGTTCCCTTAGATAACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGCGACACCAGGGATTAGATACCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CA16385_200306'           CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGARTGGATGGCCCAAARGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAATAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAARGACAGTRCYAAATGGAGAAAATTAGTAGATTTYAGAGAACTTAATAAGAAAACTCAAGAYTTCTGGGAAGTTCAATTAGGAATACCGCATCCYGCAGGGTTAAAAAAGAAAAAATCAGTAACAATACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCCTTTACCATACCTAGTATAAACAATGAGACACCAGGAATTAGATAYCAGTATAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CA16356_200305'           CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGARAAAAAAGCATTAGTAGAAATTTGYACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAARGACAGTACTAAATGGAGAAAATTAGTAGATTTTAGAGAACTTAATAAGAGRACTCAAGACTTCTGGGARGTTCAATTGGGGATACCACATCCCTCAGGGTTRAAAAAGAAAAAATCAGTAACAGTACTRGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTATAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CA16333_200304'           CCTATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAARAAAGATAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAACAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTGCCCTTAGACGACTTCAGGAAATATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CA16342_200304'           CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAGAAAGCATTAGTAGAAATATGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAGAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGCACTAAATGGAGAAAATTAGTAGATTTTAGAGAACTTAATAAGAGAACTCAAGACTTTTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTGAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAATTCCTTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATACCAGTACAATGTGCTTCCACAAGGAGGATCACCAGCAATATT [...]
+	'CA16347_200304'           CCTATTAGTCCTATTGAMACTGTACCAGTAAAAAAACCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGARAAGGAAGGRAAAATTTCCAAAATTGGGCCTGAAAATCCATACAATACTCCAATATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGATTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGCTRAAAAAGAAAAAATCAGTRACAGTRCTRGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTACTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CA16401_200306'           CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAGAGTTAARCAATGGCCATTGACAGAAGAAAAGAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAARATAGGGCCTGAAAATCCATACAATACTCCAATATTTGCCATAAAGAAAAAGGATAGTACTAAATGGAGRAARTTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGGATACCACATCCCGCAGGGTTAAAACAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTCACCATACCTAGTATAAACAATGAGACACCAGGAATAAGATATCAGTACAATGTGCTGCCRCARGGAGGATCACCAGCAATATT [...]
+	'CA16493_200308'           CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTAAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAATGAAGGGAAAATTTCAAAAATTGGGCCTGAAAAYCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAARACTCAAGACTTYTGGGARGTTCAATTAGGRATACCACATCCYGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCMTATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAAGGAGGATCACCAGCAATATT [...]
+	'CA17678_200312'           CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTARACAATGGCCATTGACAGAAGAAAAAAAAGCATTAATAGAAATTTGTACAGAAATGGAAAAGGAAGGAAARATTTCAAAAATTGGGCCTGARAATCCATATAATACTCCARTRTTTGCCATAAAGAAAAAAGACAGYACTAAATGGAGAAAATTAGTRGATTTCAGAGAACTTAATAAGARAACTCAAGATTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTACAGAAGAAAARATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGAYGAATTCAGGAAGTATACTGCATTTACCATACCTAGTATAAATAATGAAACWCCAGGGATTAGATATCAGTACAATGTGCTKCCACAGGGAGGATCACCAGCAATATT [...]
+	'ARG2982_200101'           CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTARTRGAAATCTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTTAGAGAACTTAATAAGARAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAGTCAGTAACAGTACTGGATGTGGGGGATGCATATTTTTCAGTCCCCTTAGATGAGTTCAGGAAGTATACTGCATTTACCATACCTAGTGTAAACAATGAGACACCAGGGATTAGATAYCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CA16407_200306'           CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAGAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGGGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTGAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAATATACTGCMTTCACCATACCTAGCATAAACAATGAGACACCAGGAGTTAGATATCAGTACAATGTGCTCCCACAGGGAGGATCACCAGCAATATT [...]
+	'CA16405_200306'           CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGGATGGATGGCCCAAAAGTCAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAATAGAAATTTGTACAGAAATGGARAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTCAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGRTTAAAAAAGAAAAAATCAGTAACAGTACTAGATGTGGGAGATGCATATTTCTCAGTTCCCTTAGATGACTTCAGAAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGGTATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CA16406_200306'           CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACCGAAGAGAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGGGAACTTAACAAGAGAACTCAAGACTTCTGGGAAGTACAGTTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAGAAATCAGTAACAGTACTGGATGTGGGTGACGCATATTTTTCAGTTCCCTTAGATGAATTCAGAAAGTATACTGCATTTACTATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAAGGAGGATCACCAGCAATATT [...]
+	'BB_85US_Ba_L_198501'      CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAATGGAAATCTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAGCTTAATAAGAAAACTCAAGACTTCTGGGAAGTACAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAAACACCAGGGATCAGATATCAGTACAATGTACTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CA16194_200212'           CCCATTAGTCCTATTAAGACTGTACCAGCAAGAAAGCCAGGAATGGATGGTCCAAAAGTTAAACAATGGCCATTAACAGAAGAAAAAAAAGCATTAGTAGAAATCTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAACCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTTTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAGTCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGGTACCAGTACAATGTTCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CA16218_200304'           CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCAYTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAARATCACAAAAATTGGGCCTGAAAATCCATATAATACTCCAATATTTGCCATAAAGAAAAARGACAGTACTAAATGGAGAAAAYTAGTAGATTTTAGAGAACTTAATAARAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCMGCAGGGTTAAAACAGAAAAAATCAGTAACAGTACTGGATGTRGGTGATGCATATTTTTCAGTTCCCTTGGATRAKTTCAGGAAGTAYACTGCATTTACCATACCYAGTGTAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTRCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CA16245_200303'           CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAACCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGARGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGRAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACYCCAATATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGACTTCAGAGAACTWAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCTTTACATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTMTAAACAATGAAACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CA16170_200302'           CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATAGGGCCTGARAATCCATACAATACTCCAGTATTTGCTATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGARCTTAATAAGARAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCYGCAGGGTTAAGAAAGAAGAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTKCCCTTAGATGACTTYAGGAAGTATACTGCATTTACCATACCTAGTAYAAACAATGMGACACCAGGGAYTAGATATCAGTACAATGTGCTRCCACAGGGAGGATCACCAGCAATATT [...]
+	'CA16157_200303'           CCTATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTAACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAATTGGAAAAGGAAGGGAAAATTTCAAAAATCGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGGGAACTTAATAAGAGAACTCAAGACTTCTGGGAGGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGACGCATATTTTTCAGTTCCCTTAGACGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGGGGATCACCAGCGATATT [...]
+	'CA16159_200303'           CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGAAGAAATTTGTGCAGAAATGGAAAAGGAAGGGAAAATTTCAAAGATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGATGGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAAYAAGAGAACTCAAGACTTTTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTATGTGACTTTAGGAAGTAYACTGCATTTACCATACCTAGTACAAACAATGCGACACCAGGAAAAAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CA16246_200303'           CCCATCAGTCCTATAGAAACTGTACCAGTAAAAAAGCCAGGAATGGAYGGCCCAAAAGTCAAACAATGGCCATTGACAGARGAAAAAAAAGCTTTARTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCCARAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGAYTTCTGGGARGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTGACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCTTTAGATGACTTCAGRAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'BB_94US_33931N_199401'    CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAGAAAAAAGCATTAGTAGAAATTTGCACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAGTTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGATGGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGGACTCAAGACTTTTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATCCCTAGTATAAACAATGAGACACCAGGGATTAGATACCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'BB_92FR_BX08_199201'      CCCATTAGTCCTATTGAAACTGTACCAGTAAGAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCGGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTCCTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTACATGACTTTAGAAARTATACTGCATTTACTATACCTAGCATAAACAATGAGACACCAGGGATCAGGTATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'BB_90US_873_199001'       CCCATTAGTCCTATTGAAACGGTACCAGTAAAAAAGCCAGGAATGGATGGTCCAAAGGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCAGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'BB_96TH_NP1538_199601'    CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAAGAAGGGAAAATTTCAAAAATCGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTTAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCCGTAACAGTCCTGGATGTGGGTGATGCATATTTCTCAGTTCCTTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTGTAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CA16274_200301'           CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAGGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAACCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTCCAATTAGGAATACCACATCCTGCAGGATTAAAGAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCATTAGATAACTTCAGAAAGTATACTGCATTTACCATACCTAGTAAAAACAATGAGACACCAGGGATTAGATATCAATACAATGTGCTTCCACAGGGAGGGTCACCAGCAATATT [...]
+	'BE80_199910'              CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATCTGTACAGAAATGGAAAAGGAAGGRAAAATTTCAAARATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGRAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGATTTTTGGGAGGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGGGATGCATATTTTTCAGTCCCTTTAGATGATTTCAGGAAGTACACTGCATTCACCATACCTAGTATCAACAATGAGACACCAGGAATTAGGTACCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CA18378_200402'           CCCATTAGTCCTATTGAAACTGTGCCAGTAAAAAAGCCAGGAATGGATGGCCCAAGAGTTAAACAATGGCCACTGACAGAAGAAAAAAAAGCATTAATAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAATATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTTTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATRACTTTAGRAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCTCCAGCAATATT [...]
+	'EC35_199407'              CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAGAAAGCATTAGTAGAAATCTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAGCTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATTTT [...]
+	'EC34_199306'              CCCATTAGTCCTATTGAAACTGTACCAGTGAAAAAACCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAGATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTCCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGGTATCAGTACAATGTGCTTCCACAGGGAGGATCACCATCAATATT [...]
+	'EC33_199407'              CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCGTACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAGACTCAGGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTAGATGTAGGTGATGCATATTTTTCAGTTCCCTTAGACGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTGCCACAGGGAGGATCACCAGCAATATT [...]
+	'EC36_199407'              CCCATTAGTCCTATTGAAACTGTACCTGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAACCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAGTCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACTATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'EC5_199407'               CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAGCAATGGCCATTAACAGAGGAAAAAAAAGCATTAGAAGAAATTTGTACAGAAATGGAAAAAGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAATATTTGCCATAAAGAAAAAGGACGGTACTAAATGGAGAAAATTAGTAGACTTCAGAGAACTTAATAAGAGAACTCAGGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGAAAGTATACTGCATTTACCATACCTAGTAGAAACAATGAGACACCAGGAATTAGATATCAGTACAATGTGCTGCCACAGGGAGGATCACCAGCAATATT [...]
+	'EC4_199407'               CCCATCAGTCCTATTGACACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAATAGAAATTTGTACAGAAATGGAAAAAGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGATGGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGATTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTAGGTGATGCATATTTCTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGTCACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'EC32_199407'              CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAACCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTRTTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTGACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACTATACCTAGTACAAACAATGAGACACCAGGGATTAGGTATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'EC29_199407'              CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAGAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAATAGARATTTGTACAGAAATGGAAAAGGAAGGCAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCTCAGGGTTAAAAAAGAAAAAGTCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGAAAGTATACTGCATTTACTATACCTAGTACAAACAATGAGACACCAGGAATTAGATACCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'EC28_199407'              CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAGAAAAAAGCATTAGTAGAAATTTGTACAGAGATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTGTTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAGCTTAATAAGAAAACTCAAGACTTTTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCCTATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGAATTAGATATCAGTACAATGTGCTTCCACAGGGAGGCTCACCAGCAATATT [...]
+	'EC27_199407'              CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAACCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATCTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGATAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAGCTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTGGGAATACCACATCCCGCAGGGTTAAAGAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCATTAGATGACTTTAGGAAGTATACTGCATTTACCATACCCAGTGTAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'EC3_199407'               CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCACAAGTTAAACAATGGCCACTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTGCAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAATACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'EC31_199407'              CCCATTAGTCCTATTGAGACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACGGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTGCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'EC30_199407'              CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAGTGGCCACTGACAGAAGAAAAAAAAGCATTAGTAGAAATATGTACAGAAATGGAAAAGGAAGGGAAAATCTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAATATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTGAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAAACACCAGGGGTTAGATATCAGTACAATGTGCTCCCACAGGGAGGATCGCCAGCAATATT [...]
+	'EC6_199407'               CCCATTAGTCCTATTGAAACTGTACCAGTAAGAAAACCAGGAATGGATGGCCCAAAAGTTAAACAWTGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAGAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACGAAATGGAGAAAATTAGTAGATTTCAGGGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTCACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTACTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CA18421_200403'           CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATCTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCCGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTCAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAGGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGAAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CA18433_200403'           CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAATAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAGTTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCAATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAGTTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAACAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CA2096_200204'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGARAAAAAAGCAYTAATAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGARAATCCATAYAACACTCCAGTATTTGCCATAAAGAAAAAAGATAGTACTAAATGGAGAAARTTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGAYTTYTGGGAAGTTCARTTAGGAATACCACATCCCKCAGGATTAAAAAAGAAAAAATCAGTAACAGTRCTAGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAYTTCAGGAAGTATACTGCATTTACCATACCTAGTAYAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCARTATT [...]
+	'CA18380_200402'           CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTGGTAGATTTCAGAGAACTTAATAARAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCYGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACTATACCTAGTMTAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTCCCACAGGGAGGATCACCAGCAATATT [...]
+	'CA18379_200401'           CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGARAAAAAAGCATTAATRGAAATYTGTACAGAAATGGAGAAGGAAGGRAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTRTTTGCCATAAARAARAARGACAGYACTAARTGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCTCAGGATTAAAAARGAAAAAATCAATATCAGTGCTAGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACTATACCTAGTATAAACAATGAGACACCAGGGATTAGGTATCAATACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'ARG2795_200101'           CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGTCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATATGTACAGAAATGGAAAAAGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGATTTTTGGGAGGTTCAATTAGGAATACCGCATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGGGATGCATATTTTTCAGTCCCCTTAGATGAATTCAGGAAGTACACTGCATTCACCATACCTAGTATTAACAATGAGACACCAGGAATTAGGTACCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CA20981_200403'           CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATYTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACYAARTGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAARTTCAATTAGGAATACCACATCCYGCAGGGTTAARAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGACGACTTTAGGAAGTATACTGCATTTACCATACCYAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'ARG1649_200101'           CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAACAGAAATATGTTTAGAAATGGAAAAAGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGATTTTTGGGAGGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGGGATGCATATTTTTCAGTCCCCTTAGATGATTTTAGGAAGTACACTGCATTCACCATACCTAGTGTCAACAATGAGACACCAGGAATCAGGTACCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'EC9_199407'               CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCACTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCTATAAAGAAAAAAGACAGYACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCTCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCGAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACARGGAGGATCACCAGCAATATT [...]
+	'EC7_199407'               CCCATTAGCCCTATTGAGACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAGATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCMCCAGCAATATT [...]
+	'ED_V62_199901'            CCAATTAGTCCCATCGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCCCATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTATAAATAATGAGACACCAGGAATTAGATATCAGTACAATGTGCTCCCGCAGGGAGGATCACCAGCAATATT [...]
+	'CA21078_200406'           CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACGGAAGAGAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAATATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATAYTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTCACCATACCTAGTGTAAACAATGAGACACCAGGGGTTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'GOL0_200401'              CCYATAAGTCCTATTGAAACTGTACCAGTAAAAAAACCAGGAATGGATGGCCCTAARGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTGACAGAAATTTGTGCAGAAATGGAAAAGGAAGGAAAGATTTCAARAATTGGGCCTGAGAATCCATACAATACTCCAGTATTTGCAATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAGCTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTATTGGATGTGGGTGACGCATATTTTTCAGTTCCCCTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGCATGAACAATGAGACACCAGGGGTTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CA16149_200303'           CCCATYAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAGAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGARATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGAYTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCYGCAGGATTAAAAAAGAAAAARTCAGTAACAGTACTGGATGTGGGRGATGCATAYTTTTCAGTTCCCTTAGATGACTTCAGGAAGTACACTGCATTTACCATACCTAGTATAAAYAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'C98_199607'               CCCATTAGTCCTATTGACACTGTACCAGTAAAAAAGCCAGGAATGCATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATACTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAATAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CA11626_200012'           CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGGCCAAAAGTCAAACAATGGCCATTAACAGAAGAAAAGAAAGCATTAGTAGAAATTTGTACAGAGATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAACTAGGAATACCACATCCCGCAGGGTTAAAGCAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGAATTAGATATCAGTACAATGTGCTACCACAGGGAGGATCACCAGCAATATT [...]
+	'CA14152_200112'           CCCATCAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATCTGTACAGARATGGAAAARGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGARGTTCAATTAGGAATACCACATCCAGCAGGGTTAAAAAAGAAAAAATCAGTGACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTACTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'C925_198705'              CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTAACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTATAGTTATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCTATAAAGAAAAAAGACGGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTATATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'C200_198603'              CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAGATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAATACAATGTGCTTCCACAGGGAGGATCACCAGCTATATT [...]
+	'C54_199506'               CCCATTAGTCCTATTGATACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATACTTTTCAGTTCCCTTAGATAACTTCAGGAAGTATACTGCGTTTACCATACCTAGTATAAATAATGAGACACCAGGAATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CA14155_200112'           CCCATAAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCCTTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAGGAAAAAAGACAGTAATAGATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGTTTAAAAAAGAAAAAATCAGTAACAGTTCTGGATGTGGGTGATGCATATTTTTCAGTCCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTRTAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CA14305_200203'           CCCATTAGTCCTATTGAAACTGTACCAGTGGAAAAACCAGGGATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGATGGTAATAAATGGAGAAAACTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACACCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTAGATGTGGGTGATGCATATTTTTCAGTTCCCCTACATAGCTTCAGGAAGTATACTGCATTCACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CA14315_200203'           CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGGCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAATAGAAATTTGTACAGAAATGGAAAAAGAGGGGAAAATTTCAAAAATTGGACCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTACTAGATTTCAGAGAACTTAATAGGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTACAGAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCAAGTAAAAACAAYGAGACACCAGGGATTAGGTATCAGTACAATGTACTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CA14373_200204'           CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATCTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAGCTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACAYCCCGCAGGGTTAAAAAAGAAGAAGTCAGTAACAGTACTAGATGTGGGTGATGCATATTTTTCAGTTCCCTTATATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGRYACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CA14195_200201'           CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAGAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTCAATAAGAGAACTCAAGACTTTTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAMAAMRGARAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCCAGTATAAATAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CA14172_200112'           CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGTATGGATGGCCCAAGAGTTAARCAATGGCCATTGACAGAAGAAAAGAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGACGGRAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAATATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAGTTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTGCTAGATGTGGGTGATGCATACTTCTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACTATACCTAGTGTAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CA14178_200201'           CCCATTAGTCCTATTGAAACTGTACCTGTAAAAAAGCCAGGGATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAACCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAACTAGTAGATTTCAGAGAACTAAACAAGAGGACTCARGATTTTTGGGAAGTTCAGTTAGGAATACCACATCCAGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTCCCCTTAGATGACTTCAGGAAGTATACTGCATTTACTATACCTAGCATAAACAATGAGACACCAGGGATTAGGTATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'C18_199301'               CCCATTAGTCCTATTGAAACTGTACCAGTACAAAAGCCAGGAATGGATGGCCCAAAGGTTAAACAATGGCCATTGACAGAAGAGAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAGATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGATGGTACTAAATGGAGAAAATTAGTAGATTTCAGAGACCTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCTCAGGATTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATACTTTTCAGTTCCCTTAGATAACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAATAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'BREPM269_199901'          CCAATTAGTCCTATTGACACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAGGGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAACAGAAATATGCACAGAAATGGAAAAAGAAGGACAAATTTCAAAAATTGGGCCCGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTTAGAGAACTTAACAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAGAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAAACGCCAGGAATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'BREPM278_199901'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAACAGAAATATGTACAGAAATGGAAAAAGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGATTTCTGGGAAGTCCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCGTTTACCATACCCAGTACAAACAATGAGACACCAGGGATTAGATATCAATACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'BrRJ002_200101'           CCCATTAGTCCTATTGAAACTGTACCTGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATCTGTACAGAAATGGAAAAGGAAGGGAAAATTTCCAGAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAAACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'BREPM119_199901'          CCTATTAGCCCTATTGAGACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTCCAATTAGGAATACCACATCCTGCAGGATTACAAAAGAAGAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGACGATTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGACTAGATATCAGTACAATGTGCTTCCGCAAGGGGGATCACCGGCAATATT [...]
+	'BREPM107_199901'          CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAGAAAAAAGCATTAGTAGAAATTTGTACAGAATTGGAAAAGGAAGGAAAAATTTCAAAAATTGGACCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGAACAGTACTAGATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGGATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGACGAATTCAGAAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATCAGATATCAGTACAATGTGCTTCCACAGGGAGGGTCACCAGCAATATT [...]
+	'BREPM108_199901'          CCCATTAGTCAGATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAGAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAGAAAAACAGTACTAGATGGAGAAAATTAGTAGATTTTAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAGTTAGGAATACCACATCCCGCAGGGTTGAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAATTCCCCTACATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTACTTCCACAGGGGGGATCACCAGCAATATT [...]
+	'BrRJ007_200101'           CCTATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGACGGCCCAAAAGTTAAACAATGGCCATTAACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCCGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTARTGGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAARGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATGRCTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAAACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'BrRJ036_200101'           CCCATTAGTCCTATTGACACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAGGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAACAGAAATATGTACAGAAATGGAAAAAGAAGGAAAAATTTCAAAAATTGGGCCTGAGAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGGAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGATTTTTGGGAGGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCYTTAGATGACTTCAGGAAGTACACTGCATTTACCATACCTAGTACAAACAATGAGACGCCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'BrRJ041_200101'           CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAGAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTGTTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGGACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTRGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTCACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTRCTCCCACAGGGAGGATCACCAGCAATATT [...]
+	'BrRJ092_200101'           CCTATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAGCAATGGCCATTGACAGAGGAAAAAAAAGCATTGGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTGCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTAGGTGATGCATATTTTTCAGTTCCCTTAGATGATTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGRATTAGGTATCAGTACAATGTGCTCCCACAGGGAGGATCACCAGCAATATT [...]
+	'BrRJ026_200101'           CCTATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAGGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAACAGAAATATGTACAGAAATGGAAAAAGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAGCTTAATAAAAGGACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAGAAGAAAAAATCAGTAACAGTACTGGATGTGGGCGATGCATATTTTTCAGTTCCCTTAGATGAGTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGCGACACCAGGGATAAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'BrRJ009_200101'           CCCATTAGTCCTATTGACACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGCACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTGAAAAAGAAAAAATCAGTRACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTTAGAAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGAATTAGATATCAGTACAATGTGCTTCCACAAGGAGGATCACCAGCAATATT [...]
+	'BrRJ011_200101'           CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAGAATTGGGCCTGAAAATCCATACAAYACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTTAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCTGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTGCCCTTAGATGAGTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CA14379_200204'           CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGTATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGRAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTGTTCGCCATAAAGAAAAAAGACAGCACTAARTGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTCCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTATTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTACACTGCATTTACCATACCWAGTATAAACAATGAGACACCMGGGATTAGRTATCAATACAATGTGCTTCCACAGGGAGGGTCACCAGCAATATT [...]
+	'CA14686_200211'           CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGWAGARATTTGTRCGGAAMTGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCTATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCGCATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTACTTCCACAAGGAGGATCACCAGCAATATT [...]
+	'CA14702_200211'           CCTATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCACTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAGGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCTATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTTTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAGAAGAAAAAATCAGTAACAGTACTAGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGCACTAGATATCAGTACAATGTGCTTCCACAAGGAGGATCACCAGCAATATT [...]
+	'CA1526_199805'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAATATTTGCTATAAAGAAGAAAGACAGTACCAAATGGAGAAAATTAGTAGATTTCAGAGAACTGAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTCCCCTTAGATGACTTCAGGAAGTATACTGCATTTACTATACCTAGTGTAAACAATGAGACACCAGGGATTAGATATCAGTATAATGTACTTCCACAGGGAGGATCACCATCAATATT [...]
+	'CA14661_200210'           CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGRAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCYATAAAGAARAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTYCAATTAGGGATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTRACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTATATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTGCCACAGGGAGGATCACCAGCAATATT [...]
+	'CA14654_200210'           CCCATTAGTCCTATTAAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAGATTGGGCCTGAGAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTAGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACTATACCTAGTATAAACAATGAGACACCAGGGACTAGATATCAGTACAATGTGCTTCCCCAGGGAGGATCACCAGCAATATT [...]
+	'CA14655_200210'           CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCRTTAYTAGAAATTTGTACAGAAATGGARAAGGAAGGRAARATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAARGATGGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAGYTAGGAATACCACATCCCGCAGGRTTAAAAAAGAAAAAATCAGTAACAGTACTRGATGTGGGTGATGCATATTTYTCAGTTCCCTTAGATGATTTCAGGAAATACACTGCATTTACCRTACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCCATATT [...]
+	'CA1540_199806'            CCTATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAGATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGATAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGAGATGCATACTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CA16097_200304'           CCTATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTCAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTGGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAARAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTYTGGGAAGTTCAGTTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTACATGACTTCAGGAAGTACACTGCATTTACCATACCTAGTATAAATAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CA16135_200302'           CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAAGAGAAATTTGCACAGAAATGGAAAAGGAAGGGAAAATTTCAAAGATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCAATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTAGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAATAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CA16147_200301'           CCTATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGGCCAAAAGTTAAACAGTGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTRAAAAAGAAAAAATCAATAACAGTACTGGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATGAGTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTAYAATGTGCTTCCACAGGGAGGATCGCCAGCAATATT [...]
+	'CA16090_200303'           CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAGGAAAAAAAAGCATTAGTAGAAATCTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACYCCAATATTTGCYATAAAGAAAAARGACAGTTCTAAATGGAGAAAATTAGTAGATTTCAGAGAGCTTAATAAGAGAACTCAAGACTTCTGGGARGTTCAATTAGGAATACCACATCCTGCAGGGTTRAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATACTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACYATACCTAGTATGAACAATGAGACACCAGGGATTAGATATCARTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CA16086_200303'           CCCATTAGTCCTATTGAAACTGTACCTGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCAYTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAACCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGGACTCAAGACTTCTGGGAAGTKCAGTTAGGAATACCACATCCCGCAGGGYTAAAAAAGAAAAAGTCARTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGRATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CA1609_199808'            CCMATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAGAAAAAWGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATAGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAARAAAGACWGTACTAAATGGWGAAAATTAGTAGATTTCWGGGAACTTAATAAGAGAACTCAAGACTTNTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CA14615_200209'           CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTAACAGAAGAAAAGAAAGCATTAATAGAAATTTGTACAGAAATGGAAAAGGAAGGRAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAATATTTGCCATAAAGAAAAAAGATGGTACTAAATGGAGAAAATTAGTAGATTTCAGGGAGCTTAATAAGAGAACTCAAGACTTYTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAGAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCCAGTATAAACAATGAAACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CA14422_200205'           CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAARAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAARATAGGGCCTGAAAATCCATATAATACTCCAATATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTGGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGGAGGGTTRAAAAAGAAAAAATCAGTRACAGTACTGGATGTGGGTGATGCATACTTTTCAGTGCCCTTAGATGATTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGACTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CA14482_200206'           CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGARGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTRTTTGCYATAAAGAAAAARGACAGTACTAAATGGAGAAARTTAGTAGATTTCAGRGAACTTAATAARAGAACTCAAGAYTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAARAAAGAAAAAATCAGTRACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCMTTAGATGACTTCAGGAAGTATACTGCATTYACCATACCTAGTATAAAYAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CA14484_200206'           CCCATAAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCACTGACAGAGGAAAAAAAAGCATTARTAGAAATCTGTACAGAAATGGAAAAGGAGGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTCAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGGATACCACATCCCGCAGGATTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCATTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGAYTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CA14421_200205'           CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAGAAAGCATTAGTAGAGATTTGTACAGAAATGGAAAARGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATAYAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTRGGAATACCACATCCTGCAGGGTTAAAACAGAAAAAATCAGTAACAGTACTRGATGTGGGTGATGCATATTTTTCAGTTCCYTTAGATGACTTCAGGAAGTAYACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACARGGAGGATCACCAGCAATATT [...]
+	'CA14384_200204'           CCYATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGARAAAAAAGCAYTAGTAGACATTTGTACAGAAATGGAAAAGGARGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCMATAAAGAAAAARGACAGTACTAAATGGAGRAAATTAGTAGAYTTCAGGGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTACACTGCATTTACCATACCTAGTGTAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGRTCACCAGCAATATT [...]
+	'CA14399_200205'           CCCATTAGTCCYATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTYAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCAATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCARGACTTCTGGGARGTTCAATTAGGAATACCACAYCCCTCAGGGTTAAAAAAGAAAAARTCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCMTTAGATRAWTTCAGGAAATATACTGCATTTACCATACCTAGTASAAACAATGAGACACCAGGGATTAGGTATCAGTACAATGTGCTKCCACAGGGAGGATCGCCAGCAATATT [...]
+	'CA14497_200206'           CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTGCAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAARAAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTGGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTTAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGACTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CA14538_200207'           CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCTATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCTCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGATTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CA14544_200208'           CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGTCCAAAAGTTAAACAGTGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTACAAAAATCGGGCCTGAGAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGATAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGATTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAGATCAGTAACAGTACTAGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCCCAGGGAGGATCACCAGCAATATT [...]
+	'CA14580_200208'           CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGGGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTAYTRGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATAACTTTAGGAAGTATACTGCATTTACCATACCTAGTATAAAYAATGAGACACCAGGGATTAGGTATCARTACAATGTACTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CA14535_200207'           CCTATWAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGTCAGAAGAAAAAAAAGCATTAACAGAAATTTGTACAGAAATGGAAAAGGAAGGRAAAATTTCAAAAATTGGGCCTGARAATCCATACAAYACTCCAATATTTGCCATAAAGAAAAARGATAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAARAGAACTCAAGACTTCTGGGAAGTTCAGTTAGGAATACCACATCCCGCAGGGTTAAAGAAGAAAAAGTCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAATTCCCTTAGATGAYTTTAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAATACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CA14505_200207'           CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGRATGGATGGCCCAAAGGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATAGGGCCTGAAAACCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAGTGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGATTTTTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAGTCAGTAACAGTACTGGATGTGGGTGATGCATATTTCTCAGTTCCCTTACATGACTTCAGGAAGTATACTGCATTTACCATACCCAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CA14517_200207'           CCTATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAARAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATATGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAATATTTGCYATAAAGAAGAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACRCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGKYTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATACTTCTCAGTTCCCTTAGATGACTTCAGAAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACARGGGGGATCACCAGCAATATT [...]
+	'EC26_199407'              CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACARTGGCCCTTGACAGAAGAAAAAAAAGCATTAGTGGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTGTTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGACTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAGTTTAGGAAGTATACTGCATTTACCATACCCAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'DB_SI1305_01_200101'      CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAGAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCGGCAGGGTTRAAAAAGAAAAAATCAGTAACAGTATTGGATGTGGGTGATGCATACTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTACCACAGGGAGGATCACCAGCAATATT [...]
+	'DB_SI11518_04_200401'     CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAGAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAATAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAGATAGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAKTCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCTTTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'DB_SI10858_04_200401'     CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCGAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAACAGAAATTTGTACAGAAATGGAAAAAGAAGGGAAAATTTCAAGAATTGGGCCTGAAAATCCATACAATACTCCAATATTTGCCATAAAAAAGAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTAGATGTGGGTGATGCATATTTTTCAGTCCCCTTAGATAACTTTAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGAAACCAGGGGTTAGATATCAGTACAATGTGCTCCCACAGGGAGGATCACCGGCAATATT [...]
+	'DB_SI1761_01_200101'      CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAACCAGGAATGGATGGCCCAAAAGTTAAACAGTGGCCATTGACAGAAGAAAAAAAAGCACTAGTTGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAATATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATGAATTTAGAAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATKAGATATCAGTACAATGTGCTCCCACAGGGAGGATCACCAGCAATATT [...]
+	'DB_SI2002_02_200201'      CCCATWAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACARTGGCCATTGACAGAAGAAAAAAAAGCATTATTAGAAATCTGTACAGAACTGGAAGAGGCAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAGAAAAACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGATAAAAAAGAACAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAATTCCCTTAGATGACTTCAGGAAGTATACAGCATTTACCATACCTAGTATAAACAATGAGACACCAGGAGTTAGATATCAGTACAATGTGCTTCCACAGGGAGGGTCACCAGCAATATT [...]
+	'DB_SI1994_00_200001'      CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATATGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAGATTGGGCCTGATAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGATGGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTCCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAATAATGAGACACCAGGGATTAGATATCAGTACAATGTACTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'DB_SI18_04_200401'        CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAGAAGAAAGCATTAATAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTTTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTAGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAATATACTGCATTTACCATCCCTAGTATGAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTCCCACAGGGAGGATCACCAGCAATATT [...]
+	'DB_SI10311_03_200301'     CCCATTAGTCCTATTGAMACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAGAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAATGGAAATTTGTGCAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAARTGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGATTTCTGGGAAGTCCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCCTTTACCATACCTAGTATAAACAATGAGACACCGGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CA9968_200110'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGARAAAAAAGCATTRGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAAAAGAAAGACAGTACTAAGTGGAGAAAATTAGTAGAYTTCAGGGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAAYTAGGAATACCACATCCAGCAGGGTTAAAAAAGAAAAGATCAGTGACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTYAGGAAGTATACTGCATTTACCATACCTAGTGTAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CA9960_200107'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGARGAAAARAAAGCATTADTRGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAATATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGARCTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCGCATCCCGCRGGGTTAAAAAAGAAAAAATCAGTAACAGTACTAGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATCAGATATCAATACAACGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CA9959_200109'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAATTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCTATAAAAAAGAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGGGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATAAGATACCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CA9972_200208'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGAYAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAGCTTAATAAGAGAACTCAAGACTTCTGGGAAGTCCAATTAGGAATACCACACCCGGCAGGGTTAAARAGGAAAAAGTCAGTAACAGTACTGGATGTRGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTTAGGAAGTATACTGCATTCACCATACCTAGTATAAACAATGAGACACCAGGGGTTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'D36_199610'               CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGAAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAGATGAAAAAGGAAGGAAAAATTTCAAGAATTGGGCCTAAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGGGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAGTTAGGAATACCACATCCCTCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATACTTTTCAGTTCCCTTAGATAGCTTCAGGAAGTATACTGCATTTACCATACCTAGTATCAATAATGAGACTCCGGGGACTAGATATCAGTACAATGTGCTGCCACAGGGAGGATCACCAGCAATATT [...]
+	'Cu19_200401'              CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTGAAACAGTGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGAAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGAATCAGATATCAGTACAATGTGCTTCCACAGGGAGGGTCACCAGCAATATT [...]
+	'DB_SI2063_00_200001'      CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATCTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCYATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTTTGGGAAGTTCARTTAGGAATACCACATCCCGCAGGGTTAAAAMAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTATAAATAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAAGGAGGATCACCAGCAATATT [...]
+	'DB_SI444_01_200101'       CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAARGATGGTACTAAATGGAGAAAGTTAGTAGATTTYAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACCGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTTAGAAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'DB_SI4314_03_200301'      CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCGAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAAGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAATATTTGCCATAAAAAAGAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTCCCCTTAGATAACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGAAACCAGGGGTTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'DB_SI3943_02_200201'      CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTAACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGGGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTGAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTCTCAGTTCCTTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTCCCACAGGGAGGATCACCAGCAATATT [...]
+	'DB_SI4688_03_200301'      CCCATTAGTCCTATTGAMACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGRAAAATTTCAAGAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAGCTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAARAAGAAAAAATCAGTAACAGTACTAGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATGACTTCAGGAAGTAYACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'DB_SI4736_03_200301'      CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCGAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAAGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAATATTTGCCATAAAAAAGAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTCCCCTTAGATAACTTTAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGAAACCAGGGGTTAGATATCAGTACAATGTGCTCCCACAGGGAGGATCACCAGCAATATT [...]
+	'DB_SI4715_01_200101'      CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAGAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAATAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTCCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAGTCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCCTTTACCATACCTAGTATAAACAATGAGACACCGGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'DB_SI3942_02_200201'      CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTAACAGAAGAAAAGAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGATAGTACTAAATGGAGAAAATTAGTAGATTTCAGGGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTGAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTCTCAGTTCCTYTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTCCCACAGGGAGGATCACCAGCAATATT [...]
+	'DB_SI2338_00_200001'      CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAGAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAATAGAAATATGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAARATTGGGCCTGATAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGATGGTACTAAATGGAGAAAATTAGTAGATTTCAGAGARCTTAATAAAAGAACTCAAGACTTCTGGGAAGTCCARTTAGGRATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAATAATGAGACACCAGGGATTAGATATCAGTACAATGTACTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'DB_SI2113_03_200301'      CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAGTGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCCTACAATACTCCAGTGTTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAGTTAGTAGATTTTAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTGCAATTAGGAATACCACATCCCGCAGGATTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCTTTAGATGACTTCAGAAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGGTATCAGTATAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'DB_SI209_00_200001'       CCCATTAGCCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACTGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAARGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAGGACTTCTGGGARGTCCAATTAGGAATACCACATCCCGCAGGATTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCTTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAATAATGAGACACCAGGGAYTAGATATCAGTACAATGTGCTGCCACAGGGAGGATCACCAGCAATATT [...]
+	'DB_SI3076_00_200001'      CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAGAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAGAATTGGGCCTGAAAATCCATATAATACTCCAATATTTGCCATAAAGAAAAAAGACAGTACTAARTGGAGAAAATTRGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTYTGGGAAGTKCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGRTATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'DB_SI3418_01_200101'      CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCGAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAAGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAATATTTGCCATAAAAAAGAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTCCCCTTAGATAACTTTAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGAAACCAGGGGTTAGATATCAGTACAATGTGCTCCCACAGGGAGGATCACCAGCAATATT [...]
+	'DB_SI3099_01_200101'      CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAGGTTAAACAATGGCCATTGACAGAAGAAAAAAAGGCATTAATAGAAATCTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAGAAAGAAAAAATCAGTGACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTTAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATAYCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Cu103_200401'             CCAATTAGTCCTATCGATACTGTGCCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTGAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAACACTCCAGTATTTGCCATAAAGAAGAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAGCTCAATAAAAGAACTCAAGACTTCTGGGAGGTCCAATTAGGAATACCCCATCCCGCGGGGTTAAAAAAGAAAAAATCAGTAACAGTACTAGATGTGGGGGATGCATATTTCTCAGTTCCCTTAGATGATTTTAGAAAATATACAGCATTCACTATACCTAGTATAAATAATGAGACACCATGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGGTCACCAGCAATATT [...]
+	'CH6_200101'               CCCATTAGTCCTATTGAAACTGTACCAGTAAAGAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAATAGAAATATGCACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAATATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTTAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCGCATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTGCTGGATGTGGGGGATGCATATTTTTCAGTTCCCTTAGATGATTTTAGGAAGTACACAGCATTCACCATACCTAGTCTCAACAATGAGACACCAGGAATTAGGTACCAGTACAATGTGCTCCCACAGGGAGGATCACCAGCAATATT [...]
+	'CA9646_200110'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACCCCAATATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTTAGAGAACTTAATAAGAGAACTCAAGACTTYTGGGAAGTTCAATTAGGAATCCCACAYCCCTCAGGGTTAMAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTACCYTTAGATGAATTCAGGAAGTATACTGCMTTTACCATACCTAGTGTAAACAATGCGRCACCAGGGACTAGGTATCAGTACAATGTGCTYCCACAGGGAGGATCACCAGCAATATT [...]
+	'CA8453_200103'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAACCAGGAATGGATGGCCCAARAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCACTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCTATAAAGAAAAAAGACAGTAGTAAATGGAGAAAATTAGTAGATTTCAGGGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTCCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTACACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGCTCACCAGCAATATT [...]
+	'CA9675_200107'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGGATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAGATTGGGCCTGAAAATCCATACAATACTCCAGTGTTTGCCATAAAGAAAAAGGATAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTCCAGTTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGACGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGAATCAGATATCAGTACAATGTGCTCCCACAGGGAGGATCACCAGCAATATT [...]
+	'CA9714_200111'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAGATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTYTGGGAAGTTCAATTAGGAATACCACACCCCGSAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCYTTAGATGACTTCAGGAAGTATACTGCATTCACCATACCTAGTATAAACAATGAGACACCAGGGGTTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CA9683_200110'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAAGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGGGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGGATACCACATCCTGCAGGTTTAAAAAAGAAAAAATCAGTAACAGTCCTGGATGTGGGGGATGCATATTTTTCAGTTCCCTTAGATGAGTTCAGAAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATACCAGTACAATGTACTTCCACAAGGAGGATCACCAGCAATATT [...]
+	'CA8416_200103'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAGAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACCCCAATATTTGCTATAAAGAAAAARGAYAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCARTTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAKTTCAGGAAGTATACTGCATTTACCATACCTAGTCTRAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CA8359_200102'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAGCAATGGCCATTAACAGAGGAAAAAAAAGCATTGGTAGAAATTTGCACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACCCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTACAGTTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTGACAGTACTGGATGTGGGTGATGCCTATTTTTCAGTTCCCTTAGATGATTTTCGGAAGTATACTGCATTTACCATACCTAGTATAAATAATGAGACACCAGGGATTAGATACCAATACAATGTGCTTCCACAAGGAGGATCACCAGCAATATT [...]
+	'CA8340_200102'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAGCAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAGGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAACACTCCAGTATTTGCCATAAAGAAAAAAGACAGTGCTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAGTCAGTAACAGTACTGGATGTGGGTGATGCATACTTTTCAATTCCCTTAGATGACTTCAGAAAGTATACAGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CA8332_200101'            CCTATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAGCTTAATAAGAGAACTCAAGACTTCTGGGAAGTGCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAARTCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGAATTAGATATCAGTACAATGTGCTGCCACAGGGAGGATCACCAGCWATATT [...]
+	'CA8386_200102'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGYCCAARAGTTAGACAATGGCCATTAACAGAAGAAAAAAAGGCATTARTAGAAATTTGTACAGAAATGGAAAAGGAAGGRAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAATATTTGCCATAAAGAAAAAGGAYAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAGGTTCAATTAGGAATCCCACATCCTGCAGGGTTAAAAAAGAAAAAATCAATAACAGTATTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTCTAAACAATGAGACACCAGGRATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CA8408_200103'            CCYATTAGTCCTATTGAAACTGTACCAGTAAAAAARCCAGGTATGGATGGCCCGAGRGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAGATTGGGCCTGAAAATCCATACAATACTCCAATATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAARTTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAGCTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTCTCAGTACCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATTCCTAGTGTAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CA8387_200102'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGRCCTGAAAATCCATAYAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGAYTTYTGGGAAGTTCAATTAGGAATACCACACCCAGCAGGGTTAAAGAAGAAAAAATCAGTAACAGTACTRGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAKTTCAGGAAGTATACTGCATTYACCATACCTAGTATAAACAATGAGACACCAGGAATTAGATATCAGTACAATGTRCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CA9730_200108'            CCCATTAGTCCTATTGAAACTGTACCTGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAACCCATACAATACTCCAGTATTTGCCATAAAGAAAAARGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAACAAGAGRACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCYGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGCTCACCAGCAATATT [...]
+	'CA9856_200104'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTRACAGAAGAAAAAAARGCATTARTAGAAATTTGTACAGAGATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTGTTTGCCATAAAGAAAAAAGACAGCACTAAATGGAGAAAATTAGTWGAYTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTAGATGTGGGTGATGCATATTTTTCAGTKCCCTTAGATGACTTCAGGAAGTACACTGCATTCACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CA9828_200108'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATCTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAGAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTCACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTGCCACAGGGAGGATCACCAGCAATATT [...]
+	'CA9805_200109'            CCCATTAGTCCTATTGATACTGTACCAGTAAGAAAGCCAGGAATGGATGGCCCCAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAKTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAGTTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAGAAGTCAGTAACAGTACTGGATGTGGGAGATGCATATTTTTCAGTTCCCTTAGACGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAATACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CA9885_200108'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAGAAAGCATTAGTAGAAATTTGTGCAGAAATGGAAAAGGAAGGAAAAATCTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAATATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATCCCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTATTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CMR_03ZAPS045MB2_199901'  CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAACTAGTAGACTTCAGAGAACTTAATAAGAGAACTCAAGACTTTTGGGAAGTTCAACTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAGAAATCAGTAACAGTATTAGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTACTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CM237_200201'             CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATCTCAAAAATCGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTTAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCCGTAACAGTCCTGGATGTGGGTGATGCATATTTCTCAGTTCCTTTAGATGACTTCAGGAAATATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CA9793_200110'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAACCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAACGGAAATTTGTACAGAAATGGAAAAGGAAGGGAAGATTTCAAAAATTGGCCCTGAAAACCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGGATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTGACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAMTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCGCAGGGAGGATCACCAGCAATATT [...]
+	'CA9750_200106'            CCTATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTGAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAGAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTGTTTGCCATAAAGAAAAAAGACAGCACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAGGTTCAATTAGGAATACCACATCCCGCAGGATTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGAAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCATCCATATT [...]
+	'CA9743_200110'            CCCATTAGTCCTATTGAAACTGTACCAGTAAGAAAACCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCACTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGATGGTAATAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGRACTCAAGACTTYTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAGATCAGTAACAGTACTGGATGTGGGTGATGCATATTTYTCAGTTCCYTTAGATGACTTCAGGAAGTACACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CA9731_200111'            CCTATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAGAGTTAAACAATGGCCATTGACACRAGAAAAAGAAGCATTAGTAGAAATYTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCAATAAAGAAAAAAGACAGTAGTAAGTGGAGAAAATTAGTAGATTTCAGAGAACTGAATAAAAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCARTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CA9752_200109'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAACCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTAGTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTAGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACTATACCTAGTGTAAACAATGAGACACCAGGAATTAGATATCAGTACAATGTGCTTCCACARGGAGGATCACCAGCAATATT [...]
+	'CA9792_200104'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAARGTYAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATYTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAARGAAAAAAGATAGTACTAAATGGAGAAAAYTAGTAGATTTCAGAGARCTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAGAAGAAAAAATCAGTAACAGTACTRGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATGACTTCAGAAAGTATACTGCATTCACCATACCTAGTRTAAACAATGAGRCACCAGGRRTYAGATAYCAGTACAATGTGCTCCCACAGGGAGGATCACCAGCAATATT [...]
+	'CA9760_200112'            CCTATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAARGTTAAACAATGGCCATTGWCAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAARGACAGTACTAAATGGAGAAAATTAGTAGATTTTAGAGARCTTAATAAGAGAACTCAAGACTTCTGGGAAGTYCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTRGATGTGGGGGATGCATATTTTTCARTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGMGACACCAGGGATCAGATATCAATACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'DB_SI4982_04_200401'      CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAACCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAACCCATATAATACTCCAATATTTGCCATAAAGAAAAAGGACGGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGACTTYTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTTGATGTGGGTGATGCATATTTTTCAGTTCCTTTAGATGACTTCAGGAAATATACAGCATTCACCATACCGAGTACAAACAATGAGACACCAGGAATTAGATATCAGTATAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'EC24_199308'              CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTGAACAATGGCCATTGACAGATGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAGGGAAAAATCTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTTAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAACTTGGAATACCACACCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTATTGGATGTAGGTGATGCATACTTTTCAGTTCCCTTAGATGACTTCAGAAAATATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'EC25_199407'              CCCATTAGCCCTATTGAGACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAGATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'DMG97_199802'             CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAGGTTAAACAGTGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATCTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTCCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCTTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGRTATCAGTACAATGTGCTGCCACAAGGAGGATCACCAGCAATATT [...]
+	'EC23_199407'              CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAATAGAAATCTGTACAGAAATGGAAAAAGAAGGGAAAATTTCACATGTTGGGCCTGAAAATCCATACACTACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAACTGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTTTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGGTATCAGTACAATGTGCTGCCACAGGGAGGATCACCAGCAATATT [...]
+	'EC21_199407'              CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAGGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTCCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTAGATGTGGGGGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGAAAGTATACTGCATTCACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'EC22_199407'              CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAACTGGAAAAGGAAGGGAAGATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAATATTTGCTATAAAGAAAAAAGATAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAGAAGAAAAAATCAGTAACAGTACTAGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTACCACAGGGAGGATCACCAGCAATATT [...]
+	'DMG82_199808'             CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGRATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCTTTAGTAGAAATCTGTACAGAAATGGARAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTRTTTGCCATAAAGAAAAARGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTKCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAARTCAGTAACAGTACTRGATGTGGGTGATGCATATTTYTCAGTTCCATTAGATGARTTCAGGAAGTATACWGCATTCACCATACCTAGTATAAACAATGAGACACCAGGRATTAGATATCAGTACAATGTGCTKCCACAGGGAGGATCACCAGCAATATT [...]
+	'DMG61_199904'             CCCATTAGTCCTATTGAAACTGTACCAGTAAAGAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGARGAAAAAAAAGCATTAGTAGAAATYTGTACAGAAYTGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGARAATCCATATAATACTCCAATATTTGCMATAAAGAAAAAAGACAGYACTAAATGGAGAAARTTAGTAGAYTTCAGGGAACTTAATAAGAGAACTCAAGAYTTYTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGAYGAATTCAGGAAGTATACTGCATTTACMATACCTAGTACAAACAATGAGACACCAGGGATTAGRTATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'DMG58_199809'             CCCATTAGTCCTATTGAAACTGTACCRGTAAAAAAGCCAGGWATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATCTGYACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAAYACTCCAGTATTTGCTATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGYTCAAYTAGGAATACCACATCCMGCAGGGTTAAAGAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGAYGAATTCAGGAAGTATACTGCATTTACYATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTATAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'DMG56_199807'             CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATYTGTACAGAAATGGAAAAGGAAGGRAAAATTTCAAAAATTGGGCCTGAAAAYCCATATAATACTCCAGTATTTGCMATAAAGAAAAAAGACAGTACTAAGTGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGRATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCYTTAGATGARTTCAGGAAGTAYACTGCATTTACCATACCYAGTATAAATAATGAGACACCAGGAATYAGRTATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCMATATT [...]
+	'DMG69_199809'             CCCATTAGTCCTATTGAAACTGTACCAGTGAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAYGCATTARTAGAAATTTGTACAGAAATGGAGAAGGAAGGRAAAATTTCAAAAATYGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAGAAATCAGTAACAGTAYTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGAAAGTATACTGCATTTACCATACCTAGCAGAAACAATGAGACACCAGGAATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'DMG79_199802'             CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATCTGTACAGAAATGGAAAAGGAAGGRAAAATTTCAAAARTTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAARGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTYCAATTAGGAATACCACATCCCGCAGGGTTAAAGAAGAAAAAATCAGTAACAGTACTRGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGARTTCAGGAAGTATACTGCATTYACCATACCTAGTATAAACAATGAGACACCAGGGAYTAGATATCAGTACAATGTACTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'DMG72_199802'             CCCATTAGTCCTATTGAAACTGTACCAGTAAARAARCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAARAAAGCATTRATRGAAATMTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAAYCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATSCMGCAGGGTTAAAACAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTATAATGTGCTTCCACAGGGRGGATCACCAGCAATATT [...]
+	'EC20_199407'              CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGTCCAAAAGTTAAACAATGGCCATTGACGGAAGAGAAAAAAGCATTAGTAGAAATCTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTGGATTTCAGAGAACTTAATAAGAAAACTCAGGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAGTCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTCACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTATAATGTGCTTCCACAAGGAGGATCACCAGCAATATT [...]
+	'EC102_199012'             CCCATTAGTCCTATTGAAACTGTACCAGTAAGAAAGCCAGGAATGGATGGCCCAAGAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTGCTGGATGTAGGTGATGCATATTTTTCAGTTCCTTTAGATAATTTCAGGAAGTACACTGCATTTACCATACCAAGTACAAACAATGAGACACCAGGAATCAGATATCAGTACAATGTGCTTCCGCAGGGAGGATCACCAGCAATATT [...]
+	'EC11_199407'              CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAATTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAAGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGGACTCAAGATTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'EC12_199407'              CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAGAAGGAAGGAAAAATTTCAAGAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'EC10_199407'              CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAGAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCCGAAAACCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTTCTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGGTATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'EC003_199012'             CCCATTAGTCCTATTGACACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAGAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGGGAACTTAATAAGAGAACTCAGGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTAGATGTAGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGAAAGTATACTGCATTCACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'EC1_199407'               CCCATTAGTCCTATTGAAACTGTACCAGTAAAGAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATATGTACAGARATGGAAAAGGAGGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCTATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAAKCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGAATTAGATATCAGTACAATGTGCTTCCACAAGGAGGATCACCATCAATATT [...]
+	'EC13_199407'              CCCATTAGTCCTATTGAGACTGTCCCAGCCAAAAAGCCAGGAATGGATGGCCCAAAAGTCAACCAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACCAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'EC18_199407'              CCCATTAGCCCTATTGAAACTGTACCAGTAAAAAAGGCAGGAATGGATGGCCCAAAAGTTAAACCATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTGTTTGCCATAAAGAAAAAAGACAGTACTAAGTGGAGAAAATTRGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTTTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGCTCACCAGCAATATT [...]
+	'EC19_199407'              CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATCTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGGAAATTAGTAGATTTCAGAGAACTAAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTACAAAAGAAAAAATCAGTGACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTRCAAACAATGCGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'EC2_199407'               CCCATTAGCCCTATTGAGACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACCATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAACAGAAAAAATCAGTAACAGTATTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTGTAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'EC17_199407'              CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAGGAAAAGAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATATAACACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGGGAACTTAATAAGAGAACTCAAGATTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAGTCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACTATACCTAGTACAAACAATGAGACACCAGGGATTAGGTATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'EC14_199407'              CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTCAAACAATGGCCATTGACAGAAGAAAAAAAAGCACTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGACCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAGTTAGTAGATTTTAGAGAACTTAATAAGAGAACTCAAGACTTTTGGGAAGTTCAATTAGGGATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTAGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGCATAAACAATGAGACACCAGGGATTAGATATCAATACAATGTGCTTCCACAGGGGGGATCACCAGCAATATT [...]
+	'EC15_199407'              CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAGGGAAAAATCTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTTAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAACTTGGAATACCACACCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTATTGGATGTAGGTGATGCATACTTTTCAGTTCCCTTAGATGACTTCAGAAAATATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'DMG54_199807'             CCCATTAGTCCTATTGAAACTGTACCTGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTAACAGAAGAAAAAAAAGCACTAATAGAAATCTGTACAGAAATGGAAAAGGAAGGRAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTWTTTGCMATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATACTTTTCAGTTCCCTTAGATGAATTCAGGAAGTACACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTATAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'DB_SI6439_02_200201'      CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCGAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAATAGAAATTTGTACAGAAATGGAAAAAGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAAAAGAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTCCCCTTAGATAACTTTAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGAAACCAGGGGTTAGATATCAGTACAATGTGCTCCCACAGGGAGGATCACCAGCAATATT [...]
+	'DB_SI6515_04_200401'      CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATATGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTATAAATAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAAGGAGGATCACCAGCAATATT [...]
+	'DB_SI6663_03_200301'      CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCGAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAATATTTGCCATAAAAAAGAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTCCCCTTAGATAACTTTAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGAAACCAGGGGTTAGATATCAGTACAATGTGCTCCCACAGGGAGGATCACCAGCAATATT [...]
+	'DB_SI6424_02_200201'      CCCATTAGTCCTATTGAAACTGTACCAGTGAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATCTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCTATAAGGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCGGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTCACAATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAAGGAGGATCACCAGCAATATT [...]
+	'DB_SI6422_02_200201'      CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCGAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAAGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAATATTTGCCATAAAAAAGAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAGGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTCCCCTTAGATAACTTTAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGAAACCAGGGGTTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'DB_SI6423_02_200201'      CCYATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATCTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCYATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTYTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCRGTTCCCTTAGATGGMTTCAGGAAGTATACTGCATTCACCATACCTAGTATAAAYAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAAGGAGGATCACCAGCAATATT [...]
+	'DB_SI6826_01_200101'      CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCGAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAATAGAAATTTGTACAGAAATGGAAAAAGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAATATTTGCCATAAAAAAGAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTCCCCTTAGATAACTTTAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGAAACCAGGGGTTAGATATCAGTACAATGTGCTCCCACAGGGAGGATCACCAGCAATATT [...]
+	'DB_SI879_00_200001'       CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAGAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAATAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAARGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTCCAAYTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCCTTTACCATACCTAGTATAAACAATGAGACACCGGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'DB_SI9180_04_200401'      CCCATYAGTCCTATTGAAACTGTACCAGTMAAAAAGCCAGGAATGGATGGCCCAAAGGTTAAACAGTGGCCATTGACAGAGGAAAAAAAAGCHTTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTGTTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTTAGAGAACTTAACAAGAGAACTCAAGACTTCTGGGAAGTKCAATTAGGAATCCCACATCCYGCAGGATTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCTTTAGATGACTTCAGAAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGGTATCAGTATAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'DB_SI8213_02_200201'      CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCGAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAAGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAAAAGAAAGATAGTACTAAATGGAGAAAATTGGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTCCCCTTAGATAACTTTAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGACTAGATATCAGTACAATGTGCTCCCACAGGGAGGATCACCAGCAATATT [...]
+	'DB_SI7136_03_200301'      CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTCCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'DB_SI7655_04_200401'      CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCGAARGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTARTAGAGATTTGTACAGAAATGGAAAAAGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAATATTTGCCATAAAAAAGAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCKCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTCCCCTTAGATAACTTTAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGAAACCAGGGGTTAGATATCAATACAATGTGCTCCCACAGGGAGGATCACCAGCAATATT [...]
+	'DB_SI6198_03_200301'      CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGGCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAGTTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCGGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATACTTYTCAGTTCCCTTAGATGAATTCAGAAAGTATACTGCATTTACCATACCTAGTGTGAACAATGAGACACCAGGAATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'DMG33_199812'             CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAACAGAAATCTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTCAATAAGAGRACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTTCTGGATGTGGGTGATGCATATTTTTCAGTTCCYTTAGATGACTTCAGGAARTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTKCCACAGGGAGGATCACCAGCARTATT [...]
+	'DMG35_199809'             CCCATTAGTCCTATTGATACTGTACCAGTAAAAAARCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAATAGAAATCTGTGCAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGACGAATTCAGGAAGTATACTGCATTTACCATACCTAGTTTAAACAATGAGACACCAGGGATTAGRTATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'DMG32_199807'             CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGARGAAAAAAAAGCATTARTRGARATATGTACAGAAATGGAAAAAGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGAYAGTACTAAATGGAGRAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGATTTTTGGGAGGTTCAAYTAGGAATACCACATCCKGCAGGGTTAAAAAAGAAAAARTCAGTAACAGTACTGGATGTGGGGGATGCATATTTTTCAGTMCCCTTAGATGCTTTCAGGAAGTAYACTGCATTCACCATACCTAGTACCAACAATGAGACACCAGGAATTAGGTACCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'DMG30_199807'             CCCATTAGTCCTATTGAAACTGTACCAGTAAAGAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATCTGTRCAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATTCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTAMTAARTGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACACCCCGCAGGGTTGAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'DMG38_199812'             CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTARACAATGGCCATTGACAGAAGAAAAAAAAGCATTAATRGAAATCTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATATAAYACTCCAGTATTTGCCATAAAGAAAAAGGAYAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGTGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTRGATGAATTCAGGAAGTATACTGCATTTACTATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGMTCACCAGCAATATT [...]
+	'DMG48_199809'             CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAGAGTGAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTARTAGAAATTTGTRCAGAAATGGAAAAGGAAGGAAAAATTTCAARAATAGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAARAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAARGTCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCYTTAGATGACTTCAGAAAGTATACTGCATTYACTATACCTAGTATCAACAATGARACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'DMG47_199810'             CCYATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGYCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATCTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAAYAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCKGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTAGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGWCACCAGGAATGAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'DMG49_199809'             CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATCTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAARAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCYGCAGGGTTAAAGAAGAAAAAGTCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGARTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTATAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'DMG51_199810'             CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATCTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTYCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGWGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATAAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'DMG52_199902'             CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATCTGTACAGAATTGGAAAAGGAAGGAAARATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACCAAATGGAGAAARTTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTYCCCTTAGATGRATTCAGGAAGTATACTGCATTTACCATACCTAGTACAAATAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'DMG50_199812'             CCCATTAGTCCTATTGAAACTGTACCAGTAAAGAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCACTAGTAGAAATCTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAARTGGAGAAAATTAGTAGATTTCAGAGAACTTAAYAAGAAAACTCAAGATTTCTGGGAAGTTCAATTAGGAATACCACATCCYGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTAYTGGATGTGGGTGATGCATATTTTTCAGTKCCCTTAGATGARTTCAGGAAGTATACTGCATTTACCATMCCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'DMG41_199811'             CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAGAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAGAATTGGGCCTGAAAATCCATATAATACTCCAGTRTTTGCCATAAAGAAAAAAGACAGTTCTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGATTAAAAAAGAAAAAATCAGTAACAGTACTAGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGATTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'DMG42_199809'             CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAARGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATCTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATATAACACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAARAGAACTCAAGACTTTTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACTGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCYAGTAAAAACAATGAGACACCAGGGATTAGRTATCAGTACAATGTACTGCCACAGGGAGGATCACCAGCAATATT [...]
+	'DMG43_199809'             CCTATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTGCAGARATGGAAAAGGAAGGRAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGGGAACTTAACAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACYATACCTAGTGTAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGRGGATCACCAGCAATATT [...]
+	'DMG44_199809'             CCCATTAGCCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGARAAAAAAGCATTAGTAGAAATYTGTACAGAAATGGAAAAGGAAGGRAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAATATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGARCTTAATAAGARAACTCAAGACTTYTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTAYTGGATGTGGGTGATGCATATTTYTCAGTTCCYTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACARGGAGGATCACCAGCAATATT [...]
+	'DMG46_199808'             CCCATTAGTCCTATTGAAACTGTACCAGTAAAGAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATCTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAGCTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAAYTAGGAATACCACAYCCCGCAGGGTTAAAAAAGAAAAAGTCAGTAACAGTACTGGATGTAGGTGATGCATATTTCTCAGTTCCCTTAGATGAGTTCAGAAAGTATACTGCATTTACCATACCCAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAAGGAGGATCGCCAGCAATATT [...]
+	'DB_SI6145_02_200201'      CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCARTATTTGCCATAAAGAAAAARGATGGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGGCTCCTGGGAAGTTCAATTAGGAATACCACATCCCGCGGGGTTAAAACAGAAAAAATCAGTAACTGTCCTRGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTTAGAAAGTATACTGCATTTACCATACCTAGTACAAACAATGCAACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'DB_SI548_03_200301'       CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAGTGGCCATTGACAGARGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCCTACAATACTCCAGTGTTTGCCATAAAGAAAAAAGAYAGTACTAAATGGAGAAAGTTAGTAGATTTTAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTGCAATTAGGAATACCACATCCMGCMGGATTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCTTTAGATGACTTCAGAAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGGTATCAGTATAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'DB_SI5335_02_200201'      CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAACCAGGAATGGATGGCCCAAAAGTTAGACAATGGCCATTGACAGAAGAGAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATACTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGGTTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'DB_SI5301_03_200301'      CCCATTAGCCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAATAGAAATTTGTACAGAAATGGAGAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACCAAATGGAGAAAGTTAGTAGACTTCAGGGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGAYGACTTCAGGAAGTACACTGCATTTACCATACCTAGTATAAACAATGAGACACCTGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'DMG109_199806'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAGAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAACACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTTTGGGAAGTTCAATTAGGAATACCACACCCCGSAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCYTTAGATGACTTTAGAAAATATACTGCATTTACAATACCTAGTATGAACAATGAAACACCCGGGATTAGATATCAGTACAATGTGCTTCCACAAGGAGGATCACCAGCAATATT [...]
+	'DMG14_199804'             CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCGTTAGTAGAAATTTGTACAGAAATGGAAAARGAAGGGAAAATTTCAAAGATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTGCAACTAGGAATACCACATCCCGCAGGATTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGAAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTCCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'DMG22_199902'             CCCATTAGTCCTATTGATACTGTGCCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAATAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTTTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCGGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTGCCCTTAGATGACTTCAGAAAGTATACTGCATTTACCATACCTAGTASAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'DMG23_199903'             CCCATTAGTCCTATTGAGACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGCAACGAATTAGAAAAGGAAGGAAAAATTTCAAAGATTGGGCCTGAAAATCCATACAATACTCCAATATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACACCCTGCAGGGTTAARAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCATTAYATGACTTTAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAATACAATGTGCTTCCRCAAGGAGGATCACCAGCAATATT [...]
+	'DMG24_199903'             CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAWTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAGAATTGGGCCTGAAAATCCATAYAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGRGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGYTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTAYACTGCATTTACYATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCRATATT [...]
+	'DMG25_199902'             CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAGAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAATTGGAAGAGGCAGGAAAAATTTCAAAAATTGGGCCTGAGAATCCATACAATACTCCAGTATTTGCCATAAAAAAGAAAAACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTTTGGGAGGTTCAATTAGGAATACCACATCCTGCAGGGTTGAAAAAGAAAAAGTCAATAACAGTACTGGATGTGGGTGATGCATATTTTTCAATTCCCTTAGATGACTTTAGGAAGTATACTGCGTTTACCATACCTAGTATAAATAATGAGACACCAGGGATTAGATATCAATACAATGTGCTTCCACAGGGAGGATCACCAGCGATATT [...]
+	'DMG26_199903'             CCCATYAGYCCTATTGAAACTGTACCAGTAAAAAAGCCAGGGATGGATGGCCCAAAAGTAAAACAATGGCCATTGACAGAAGAAAAAAAAGCACTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGATGGTACTAAATGGAGAAAATTAGTAGATTTCAGRGAACTTAATAAGAGAACTCAAGAYTTCTGGGAAGTTCAATTAGGAATACCACATCCYGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTRGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAAYAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCGATATT [...]
+	'DMG28_199807'             CCCATTAGTCCTATTGACACTATACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAATAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCYGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTAYTGGATGTGGGTGAYGCATAYTTTTCAGTTCCYTTRGATGARTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACARGGAGGATCACCYGCAATATT [...]
+	'DMG29_199808'             CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATCTGTACAGAAATGGAGAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAGAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAARTTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAGGACTTCTGGGAAGTGCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAGAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCTTTAGATGAATTCAGGAAGTAYACTGCATTTACCATACCTAGTATAAACAATGAGWCACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'DMG53_199809'             CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAGTGGCCATTGACAGAAGAAAAAAAAGCATTACTAGAAATCTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAGAATCCATATAATACTCCAATATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGGTTAAAAAAGAGAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCTTTCACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTGCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt5018_200201'            CCCATTAGTCCTATTGACACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGRAAAATYTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAGCTTAATAARAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTTCTGGATGTGGGTGATGCATATTTTTCAGTTCCYTTAGATGACTTCAGAAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGRATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'PCF_Pat199_200101'        CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCGAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAGAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGCRTAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt3104_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAARCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTARTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATCTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAARTCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGAAAGTATACTGCATTTACCATACCTAGYACAAAYAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'JLB_Pat11_200006'         CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAARCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAGAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAACCCATACAATACTCCAATATTTGCYATAAAGAAAAAAGACAGTACTAAATGGAGAAARTTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGATTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTGCAAAAGAAAAAATCAGTAACAGTACTGGATGTRGGTGATGCATAYTTTTCAGTTCCCTTASATGACTTCAGGAAGTATACTGCATTTACYATACCTAGTAGAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt3598_200201'            CCCATAAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGAYGGCCCAAAAGTTAAACAATGGCCAYTGACAGAAGAAAAAAAGGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCTATAAAGAAAAAAGACAGCACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGATTAAAAAAGAAAAAATCAATAACAGTACTGGATGTGGGTGATGCATATTTTTCAATTCCCTTAGATAGCTTCAGGAAGTATACTGCATTTACTATACCTAGTATAAACAATGAGACACCAGGAATTAGATATCAGTATAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt3149_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAGGTTAAACAGTGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTACAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCYATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAACTAGGAATACCACATCCGGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTTAGAAAGTATACTGCATTTACCATACCTAGCATAAATAATGAGACACCAGGGATTAGATATCAGTACAATGTACTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'PCF_Pat70_200101'         CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAGTTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTACACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGAATTAGATATCAGTACAATGTGCTTGCACAAGGTGGATCACCAGCAATATT [...]
+	'Pt5730_200201'            CCCATTAGTCCTATTGACACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAGAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAGAAGGAAGGAAAAATCTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAACTAGTAGATTTTAGAGAACTCAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCAGCAGGGTTAAAAAAGAGAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCARTTCCCTTAGATGAATTCAGAAAGTATACTGCATTTACCATACCTAGTAGAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'PCF_Pat112_200101'        CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGAYGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATCTGTACAAAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAGCTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCAGCWGGGTTAAARAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTATGAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt5720_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGRCCTGAAAAYCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTGGTAGATTTCAGRGAACTTAATAAAAGAACTCARGATTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt4060_200201'            CCCATTAGTCCTATTGACACTGTACCAGTAAAAAAGCCAGGRATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGRAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAGCTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTTCTGGATGTGGGTGATGCATATTTTTCAGTTCCYTTAGATGAMTTCAGAAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'PCF_Pat148_200101'        SCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGARGAAAAAAAAGCATTAGTAGAAATCTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAATATTTGCTATAAGGAARAAAGMCAGTACTAAATGGAGAAAATTRGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGARGTTCARTTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCMGTAACAGTACTRGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTGCCACAAGGAGGATCACCAGCAATATT [...]
+	'Pt4637_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAGGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATYTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACAAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTTTGGGAAGTTCAATTAGGAATACCACATCCTGCAGGATTAAAAAAGAAAAGATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTTAGAAAATACACTGCATTCACCATACCTAGTATAAACAATGAGACACCAGGAATTAGATATCAGTACAATGTACTTCCACAGGGAGGATCGCCAGCAATATT [...]
+	'Pt1782_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAARGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTRACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTAGTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTGGGAATACCACATCCCGCAGGATTAAAAARGARAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGAAAGTATACTGCATTTACYATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTAYAATGTGCTTCCACAAGGAGGATCACCAGCAATATT [...]
+	'Pt5219_200201'            CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAARAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATCTCAAAAATTGGGCCTGAAAATCCATAYAATACTCCAGTGTTTGCCATAAAGAAAAAAGACAGCACTAARTGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCARGACTTCTGGGAAGTTCAATTAGGAATACCACATCCYGCAGGRTTAAAAAAGAAAAAATCAGTGACAGTATTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTYAGAAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'Pt4586_200201'            CCYATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAATAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATYTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTRTTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAAAGAACTCAAGACTTCTGGGAAGTTCAGTTAGGAATACCACATCCCTCGGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAYTTCAGAAAATATACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGRGGATCACCAGCAATATT [...]
+	'Pt4583_200201'            CCCATTAGTCCTATTGACACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTGGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATYTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTYGCTATAAAGAAAAAAGACAGYACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGATTTTTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAATTCAGAAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGRATTAGATATCAATACAATGTGCTTCCACARGGAGGATCACCAGCAATATT [...]
+	'CA21066_200405'           CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAATATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTTAGAGAACTTAACAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCAGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTATTAGATGTGGGTGATGCATACTTTTCAGTTCCTTTAGATGACTTCAGAAAGTATACTGCATTTACCATACCTAGTATAAATAATGAGAGACCAGGGACTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'CA18377_200401'           CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCMTACAATACTCCAGTATTTGCCATAAAGAAAAARGACAGTACTAAATGGAGAAAAYTAGTAGATTTTAGAGAACTTAATAAGAAAACTCAAGATTTYTGGGAAGTMCAATTAGGAATACCACATCCYGCAGGGTTAAAAAAGAARAAATCAGTAACAGTACTRGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAAYAATGAGACACCAGGAATTAGATATCAGTACAATGTGCTTCCACAGGGAGGGTCACCRGCAATATT [...]
+	'DB_SI7918_02_200201'      CCCATTAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAAAAGCATTAGTAGAAATCTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAGTTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTCTCAGTKCCCTTAGATGAATTCAGGAAGTATACTGCATTTACCATACCTAGTACAAATAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATATT [...]
+	'DMG31_199809'             CCCATYAGTCCTATTGAAACTGTACCAGTAAAAAARCCAGGAATGGATGGCCCAAAAGTTAAACARTGGCCATTGACAGAAGAGAAAAAAGCATTAGTAGAAATCTGTACAGAAATGGARAAGGAAGGGAAAATCTCAARAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGARAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCARGGTTAAAAAAGAAAAARTCAGTAACAGTRCTGGATGTGGGTGATGCATATTTTTCAGTTCCMTTAGATGAATTCAGGAAGTAYACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTATAATGTGCTTCCWCAGGGAGGATCACCAGCAATATT [...]
+	'DMG39_199810'             CCCATYAGTCCTATTGAAACTGTACCAGTAAAAAAGCCAGGAATGGATGGCCCAARAGTYAAACAATGGCCATTGACTGARGAAAAAAAAGCATTAATAGAAATCTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAGAATTGGGCCTGATAATCCATATAATACTCCAGTATTTGCYATAAAGAAAAAAGACAGTACTAAATGGAGAAAGYTAGTAGATTTCAGAGARCTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTAYTRGATGTGGGTGATGCATAYTTTTCAATTCCTTTAGATGARTTCAGGAAGTAYACTGCATTTACCATACCTAGTACAAACAATGAGACACCAGGAATTAGATATCAGTACAATGTGCTTCCACAGGGAGGATCACCAGCAATCTT [...]
+END;
+
+BEGIN HYPHY;
+
+	_testDescription 		= " fit the REV model to an HIV RT alignment with 3112 sequences and 873 nucleotides";
+	_expectedLL 			= -238637.9062651585;
+	ExecuteAFile 			("../Shared/TestInstrumentation.bf");
+	startTestTimer 			(_testDescription);
+
+global GT=0.1291683629933827;
+global CT=1.179909131778954;
+global CG=0.1277238529399713;
+global AT=0.0993031815400819;
+global AC=0.2150747397107211;
+
+NucleotideMatrix={4,4};
+NucleotideMatrix[0][1]:=AC*t;
+NucleotideMatrix[0][2]:=t;
+NucleotideMatrix[0][3]:=AT*t;
+NucleotideMatrix[1][0]:=AC*t;
+NucleotideMatrix[1][2]:=CG*t;
+NucleotideMatrix[1][3]:=CT*t;
+NucleotideMatrix[2][0]:=t;
+NucleotideMatrix[2][1]:=CG*t;
+NucleotideMatrix[2][3]:=GT*t;
+NucleotideMatrix[3][0]:=AT*t;
+NucleotideMatrix[3][1]:=CT*t;
+NucleotideMatrix[3][2]:=GT*t;
+
+overallFrequencies={
+{    0.376008609715}
+{    0.182477073315}
+{    0.209519420568}
+{    0.231994896402}
+}
+;
+Model NucModel=(NucleotideMatrix,overallFrequencies);
+
+UseModel (NucModel);
+Tree givenTree=((((((((((KDR_pat57_199604,(V2000_19_199801,LV727DIP_199901)Node12)Node10,((GRSPR55D_200301,GRSPR55_200301)Node16,(DMG58_199809,DMG49_199809)Node19)Node15)Node9,((KDR_pat55_199604,(BRRJ894_200104,OMVB_RT_62_200301)Node25)Node23,((((VT18_200201,MI_Pat15_200101)Node31,MI_Pat23_200101)Node30,(SLMT_UD394_200501,(33017_199607,MI_Pat82_200101)Node37)Node35)Node29,((33027_199607,CA16356_200305)Node41,((CA1261_199710,CA5704_200001)Node45,CA16385_200306)Node44)Node40)Node28)Node22) [...]
+
+givenTree.Node4139.t=0;
+givenTree.Node4099.t=0.007505152922284627;
+givenTree.Node4035.t=0.008894977162470839;
+givenTree.Node4145.t=0.014843138244711;
+givenTree.VHE_Pat53_200101.t=0.06005154739946162;
+givenTree.Node4143.t=0.001735489242942704;
+givenTree.Node4161.t=0.009781992451367773;
+givenTree.VHE_Pat7_200101.t=0.05431837762928591;
+givenTree.Node4144.t=0.02751126525557592;
+givenTree.JLB_Pat41_200006.t=0.09702156790788106;
+givenTree.VHE_Pat54_200101.t=0.05067393900818244;
+givenTree.PSW_Pat17_200001.t=0.06350254051454889;
+givenTree.PCM001_200101.t=0.06456346823662151;
+givenTree.PSW_Pat42_200201.t=0.1038428340652263;
+givenTree.Node4166.t=0.01887307999357029;
+givenTree.Node4165.t=0.008318504961024317;
+givenTree.VHE_Pat12_200101.t=0.03593434613823785;
+givenTree.Node4146.t=0.02587058734800433;
+givenTree.Node4150.t=0;
+givenTree.VHE_Pat25_200101.t=0.02728355339357004;
+givenTree.VHE_Pat31_200101.t=0.03744372541354817;
+givenTree.Node4153.t=0.005143403856698696;
+givenTree.VHE_Pat16_200101.t=0.02454644519207917;
+givenTree.Node4149.t=0;
+givenTree.Node4147.t=0.01404043351274995;
+givenTree.VHE_Pat17_200101.t=0.04392919949998191;
+givenTree.VHE_Pat36_200101.t=0.02916250106701753;
+givenTree.VHE_Pat13_200101.t=0.02381966960768294;
+givenTree.Node4148.t=0;
+givenTree.05_132891_200401.t=0.02871643729848987;
+givenTree.Node4180.t=0.003853299283937392;
+givenTree.AP_7_200001.t=0.07965119814181854;
+givenTree.Node4184.t=0.02815149656704169;
+givenTree.VHE_Pat41_200101.t=0.03072425361905816;
+givenTree.Node4186.t=0.02849681083874462;
+givenTree.Node4190.t=0;
+givenTree.Node4191.t=0.01176667467597766;
+givenTree.PCF_Pat170_200101.t=0.05541355538023974;
+givenTree.92BR020_199201.t=0.05534236411164521;
+givenTree.Node4194.t=0.00852614893869473;
+givenTree.260Pt4_199511.t=0.06457338428391994;
+givenTree.VHE_Pat45_200101.t=0.0296126619202065;
+givenTree.Node4174.t=0.04466855357311396;
+givenTree.Node4170.t=0.01457215518616692;
+givenTree.5000052_200401.t=0;
+givenTree.Node4171.t=0.01009476720958305;
+givenTree.4002567_200401.t=0.005600805749706906;
+givenTree.Node4164.t=0.009253341025886659;
+givenTree.Node4181.t=0.01732280862565647;
+givenTree.VHE_Pat52_200101.t=0.03432072241861226;
+givenTree.AC_04_200001.t=0.04915840957540247;
+givenTree.Node4034.t=0.003785240117080613;
+givenTree.KDR_pat245_199601.t=0.03214138638048418;
+givenTree.VHE_Pat47_200101.t=0.03240590643275084;
+givenTree.CA6491_200005.t=0.07238213416798903;
+givenTree.Node4113.t=0.01630877439808614;
+givenTree.Node4107.t=0.02912558422270568;
+givenTree.AS_SOU_199801.t=0.0582959132111112;
+givenTree.Node4110.t=0.008004544414177226;
+givenTree.Node4108.t=0.03754739724184961;
+givenTree.VHE_Pat60_200101.t=0.04662766884115671;
+givenTree.Node4117.t=0.00822091967605312;
+givenTree.VHE_Pat65_200101.t=0.05177651111506019;
+givenTree.Node4119.t=0.009470337215346774;
+givenTree.VHE_Pat63_200101.t=0.03689739124491971;
+givenTree.05_132910_200401.t=0.08330338084913123;
+givenTree.VHE_Pat33_200101.t=0.04970556494517585;
+givenTree.Node4092.t=0.03626302511267829;
+givenTree.Node4096.t=0.01025878705651164;
+givenTree.Node4086.t=0;
+givenTree.Node4036.t=0.005925858635855624;
+givenTree.Node4078.t=0.003820062910000323;
+givenTree.VHE_Pat69_200101.t=0.03668560427153154;
+givenTree.VHE_Pat51_200101.t=0.03562449164144497;
+givenTree.VHE_Pat71_200101.t=0.05685722720892655;
+givenTree.Node4102.t=0.03723410804688171;
+givenTree.HG055_199901.t=0.06323009035398898;
+givenTree.05_132860_200401.t=0.07530566302832443;
+givenTree.VHE_Pat3_200101.t=0.04930812972322565;
+givenTree.VHE_Pat44_200101.t=0.0322253176148983;
+givenTree.VHE_Pat67_200101.t=0.0469919230974521;
+givenTree.Node4127.t=0;
+givenTree.CA6490_200004.t=0.04487218051520225;
+givenTree.Node4133.t=0.02246501950962355;
+givenTree.Node4136.t=0.02315976710292836;
+givenTree.HG080_199901.t=0.004949220422910148;
+givenTree.Node4140.t=0.05039493387597771;
+givenTree.HG079_199901.t=0.0112970080133931;
+givenTree.Node4126.t=0.009487214069645396;
+givenTree.Node4100.t=0;
+givenTree.VHE_Pat32_200101.t=0.03407217300823541;
+givenTree.VHE_Pat64_200101.t=0.06962810870368606;
+givenTree.Node4105.t=0;
+givenTree.Node4106.t=0;
+givenTree.Node4122.t=0.005700013595787879;
+givenTree.Node4116.t=0.008718089018487236;
+givenTree.Node4101.t=0.01471026491412005;
+givenTree.VHE_Pat56_200101.t=0.05116036580164693;
+givenTree.Node4128.t=0;
+givenTree.Node4129.t=0;
+givenTree.HG046_199901.t=0.05248038305392853;
+givenTree.VHE_Pat68_200101.t=0.04552657782777722;
+givenTree.CA21113_200406.t=0.1049581836223224;
+givenTree.Pt3833_200201.t=0.02162516359592082;
+givenTree.Node4258.t=0.0331425972262926;
+givenTree.Node4256.t=0.00495857022883182;
+givenTree.Pt3095_200201.t=0.04293804836501477;
+givenTree.Node4032.t=0.01383514500572305;
+givenTree.V2000_5_199801.t=0.0856433944196883;
+givenTree.CA6860_200007.t=0.02531079873567557;
+givenTree.Node4262.t=0.02420150144804469;
+givenTree.Node4254.t=0.00678948052407595;
+givenTree.Pt3507_200201.t=0.02926321039655157;
+givenTree.Node4255.t=0.007535741046963178;
+givenTree.CCB_3805_200501.t=0.04811674714788611;
+givenTree.Node4236.t=0;
+givenTree.Node4239.t=0.05603273688609307;
+givenTree.VHE_Pat14_200101.t=0.06614771802310428;
+givenTree.HG036_199901.t=0.01540305923668629;
+givenTree.Node4244.t=0.02549077925242661;
+givenTree.Node4240.t=0;
+givenTree.Node4238.t=0.003185769624402035;
+givenTree.Pt3327_200201.t=0.04221874231190546;
+givenTree.Node4250.t=0.02173306209582208;
+givenTree.GRSPR24_200301.t=0.04676039927136772;
+givenTree.VHE_Pat22_200101.t=0.03752753245698394;
+givenTree.Node4237.t=0.02858079020970793;
+givenTree.4001098_200401.t=0.02195665042229009;
+givenTree.CCB_3938_200501.t=0.07052368656414103;
+givenTree.Pt3273_200201.t=0.02157169187385934;
+givenTree.KDR_pat32_199604.t=0.03641559926291627;
+givenTree.Node4253.t=0.004226189188373897;
+givenTree.Node4031.t=0;
+givenTree.Pt1558_200201.t=0.01078932539644739;
+givenTree.Node4282.t=0.01063874106679976;
+givenTree.Node4284.t=0.01973437768061011;
+givenTree.Node4280.t=0.01432272097670914;
+givenTree.JLB_Pat43_200006.t=0.02636937500031303;
+givenTree.SM_01YE381_200101.t=0.06921654148578479;
+givenTree.Node4265.t=0.005617850740638078;
+givenTree.03AR138910_200301.t=0.09281579163676189;
+givenTree.Node4271.t=0.01310967306220925;
+givenTree.BR04RS147_200401.t=0.08471105948053682;
+givenTree.CA17652_200311.t=0;
+givenTree.Node4266.t=0.01042621310143495;
+givenTree.CCB_3699_200501.t=0.04372369676265392;
+givenTree.Node4275.t=0.03666601349623826;
+givenTree.Node4269.t=0.004839299326123388;
+givenTree.JLB_Pat57_200006.t=0.07148568361532835;
+givenTree.Node4270.t=0;
+givenTree.ED_V90_199901.t=0.05808034019361365;
+givenTree.HG005_199901.t=0.005087707676425523;
+givenTree.Node4210.t=0.004180491914541175;
+givenTree.US4_200111.t=0.02416952995921589;
+givenTree.CA8359_200102.t=0.07624346203293665;
+givenTree.PSW_Pat45_200201.t=0.03848145999089862;
+givenTree.Node4211.t=0.04928539449259557;
+givenTree.4002921_200401.t=0.05387105719087385;
+givenTree.Node4208.t=0;
+givenTree.Node4200.t=0.006815777083271147;
+givenTree.VHE_Pat1_200101.t=0.058098585828641;
+givenTree.Node4215.t=0.011433815833465;
+givenTree.Node4209.t=0.01021010587185445;
+givenTree.PSW_Pat6_199901.t=0;
+givenTree.Node4179.t=0;
+givenTree.HG057_199901.t=0.020105988633488;
+givenTree.Node4189.t=0.01791636089523699;
+givenTree.CCB_1342_200501.t=0.04035479384989523;
+givenTree.Node4197.t=0;
+givenTree.VHE_Pat43_200101.t=0.08203269106213323;
+givenTree.Node4203.t=0.01422490871981676;
+givenTree.Node4201.t=0.006448575179722495;
+givenTree.Node4205.t=0.0248019310697793;
+givenTree.92BR017_199201.t=0.01856539287762615;
+givenTree.92BR018_199201.t=0.01029898678241922;
+givenTree.Node4178.t=0.01199851426416696;
+givenTree.Node4229.t=0;
+givenTree.Node4219.t=0;
+givenTree.Node4233.t=0.03178710805980836;
+givenTree.VHE_Pat10_200101.t=0.02277161279310805;
+givenTree.VHE_Pat27_200101.t=0.0182237335906833;
+givenTree.Node4177.t=0.005610931354524983;
+givenTree.Node4241.t=0.01573260989659006;
+givenTree.HG009_199901.t=0;
+givenTree.05_132916_200401.t=0.02676262308127286;
+givenTree.Node4033.t=0.005800624959703952;
+givenTree.HG056_199901.t=0.03597497476220735;
+givenTree.Node4230.t=0.01124294770418762;
+givenTree.CCB_3874_200501.t=0.05780591662758889;
+givenTree.Node4221.t=0.01648388314565416;
+givenTree.Node4222.t=0.03859574097235226;
+givenTree.HG038_199901.t=0;
+givenTree.HG082_199901.t=0.04110934829221189;
+givenTree.HG075_199901.t=0.07943565685995262;
+givenTree.JF_133_200501.t=0.08130454830490558;
+givenTree.PT_VE6_199301.t=0.07323924584535529;
+givenTree.Node4220.t=0.01795848223772052;
+givenTree.CA16342_200304.t=0.06874417150165689;
+givenTree.Node4226.t=0.02562739942760858;
+givenTree.VHE_Pat9_200101.t=0.03812263310277117;
+givenTree.HG072_199901.t=0.04802756138420245;
+givenTree.MI_Pat4_200101.t=0.05269305319924414;
+givenTree.Node3960.t=0.01597860057914226;
+givenTree.Node3902.t=0.01055570408221873;
+givenTree.Node3952.t=0.01326430554810447;
+givenTree.Node3944.t=0;
+givenTree.CCB_4980_200501.t=0.03751366125476353;
+givenTree.Node3965.t=0.01680211991587993;
+givenTree.n18_200301.t=0.07316382957676708;
+givenTree.Pt5767_200201.t=0.07749112295823225;
+givenTree.Node3959.t=0.005883150617039765;
+givenTree.GRSPR76_200301.t=0.079188191719303;
+givenTree.CA5053_199909.t=0.07735106358204248;
+givenTree.KDR_pat218_199603.t=0.02091175335272157;
+givenTree.CH103_200101.t=0.06378596732966922;
+givenTree.Node3903.t=0.003615638736930183;
+givenTree.Node3933.t=0.01123339460903978;
+givenTree.Node3919.t=0;
+givenTree.Node3946.t=0.01555046028157001;
+givenTree.Node3945.t=0.007655983728103342;
+givenTree.PSW_Pat21_200001.t=0.06660886811941816;
+givenTree.Node3949.t=0.01298872196112749;
+givenTree.CCB_2778_200501.t=0.04703195267508569;
+givenTree.CA7901_200010.t=0.03330310747985162;
+givenTree.PCM039_200101.t=0.09499959889104756;
+givenTree.BRC1532_200208.t=0.08234267883581706;
+givenTree.DB_SI2002_02_200201.t=0.1084173993351909;
+givenTree.36012_199607.t=0.03495584104145099;
+givenTree.Node3979.t=0.01833406745080394;
+givenTree.Node3975.t=0.01127386796320516;
+givenTree.Node3984.t=0.01921463458179617;
+givenTree.VT15_200201.t=0.05617476305285632;
+givenTree.VT74E_200201.t=0.0587266836995681;
+givenTree.Node3956.t=0;
+givenTree.Node3982.t=0.004592664421461058;
+givenTree.Node3974.t=0;
+givenTree.CH26_200101.t=0.05335281869375362;
+givenTree.SLMT_UD427_200501.t=0.0453260950760797;
+givenTree.CA4807_199907.t=0.03141871916405393;
+givenTree.Node3958.t=0.01773974328479034;
+givenTree.Node3968.t=0.005576524095681897;
+givenTree.Node3964.t=0.001573385144486847;
+givenTree.Node3971.t=0.01256787615946164;
+givenTree.Node3976.t=0.02318727822592648;
+givenTree.BRC1535_200208.t=0.04760687461958332;
+givenTree.05_132864_200401.t=0.07828840103271442;
+givenTree.Node3957.t=0.007461431352584767;
+givenTree.PSW_Pat44_200201.t=0.1014572109635642;
+givenTree.Node3941.t=0;
+givenTree.N39_200301.t=0.05963167401608814;
+givenTree.JLB_Pat49_200006.t=0.04796016116604811;
+givenTree.Node3905.t=0.01972426613127902;
+givenTree.380526c_199401.t=0.03792073908910594;
+givenTree.Node3907.t=0.01970130297875474;
+givenTree.Node3912.t=0.00947084098533889;
+givenTree.PCF_Pat84_200101.t=0.05073546052448972;
+givenTree.Node3916.t=0.01692774057108685;
+givenTree.ARG_50_200001.t=0.03676710460377972;
+givenTree.CCB_3293_200501.t=0.07890835695303881;
+givenTree.Node3911.t=0.011309228566628;
+givenTree.CCB_2008_200501.t=0.06037102643678501;
+givenTree.Pt3060_200201.t=0.04585165068374909;
+givenTree.DB_SI8504_04_200401.t=0.07978332249508764;
+givenTree.Node3896.t=0.01023356729296975;
+givenTree.Node3888.t=0.01005538933204801;
+givenTree.Node3892.t=0.02185104097592171;
+givenTree.Node3893.t=0.0175458669928194;
+givenTree.Node1516.t=0;
+givenTree.KDR_pat56_199604.t=0.03668253494407194;
+givenTree.Node3586.t=0;
+givenTree.Node3876.t=0.006646681836625374;
+givenTree.Node3838.t=0;
+givenTree.Node3910.t=0.01463674555025136;
+givenTree.EC2_199407.t=0.03743958340139193;
+givenTree.Node3935.t=0.0284872060414263;
+givenTree.KDR_pat41_199604.t=0.05487080666246539;
+givenTree.Node3926.t=0.01085201641938392;
+givenTree.Node3920.t=0.01117803155541351;
+givenTree.CCB_269_200501.t=0.04596824256227124;
+givenTree.hj2_199901.t=0.02077134256036287;
+givenTree.Pt3322_200201.t=0.07164232628401322;
+givenTree.Node3934.t=0.005804990259837207;
+givenTree.Pt5229_200201.t=0.07809207221843364;
+givenTree.Node3938.t=0.01177722658064943;
+givenTree.Node3930.t=0.01367377166951197;
+givenTree.Node3922.t=0.02521696759572109;
+givenTree.CCB_3958_200501.t=0.06292301610503773;
+givenTree.AP_ARRP040_200406.t=0.0604948923654772;
+givenTree.Node3904.t=0;
+givenTree.KDR_pat38_199605.t=0.09535401396540644;
+givenTree.Node3921.t=0.01772986921026514;
+givenTree.GRSPR9_200301.t=0.05282596404833435;
+givenTree.LV716MAU_199901.t=0.03960485578692104;
+givenTree.Node3927.t=0.02743387036858788;
+givenTree.HG012_199901.t=0.08387007160547803;
+givenTree.CCB_3911_200501.t=0.06309923768664104;
+givenTree.05CSR3_200001.t=0.06993269036062506;
+givenTree.Node4045.t=0.004187554369301706;
+givenTree.VHE_Pat39_200101.t=0.03777476129742506;
+givenTree.VHE_Pat6_200101.t=0.05090293610723317;
+givenTree.Node4055.t=0.006988989025460625;
+givenTree.Node4056.t=0;
+givenTree.VHE_Pat46_200101.t=0.06731958586693217;
+givenTree.Node4064.t=0.01792995450461574;
+givenTree.4003710_200401.t=0.09828640999209928;
+givenTree.Node4069.t=0.01448897781931653;
+givenTree.VHE_Pat50_200101.t=0.04106436380394322;
+givenTree.Node4044.t=0.02163526014151579;
+givenTree.Node4038.t=0.01098338460694677;
+givenTree.VHE_Pat29_200101.t=0.04268651532339818;
+givenTree.VHE_Pat15_200101.t=0.02306815290147904;
+givenTree.Node4052.t=0.009328105024767946;
+givenTree.VHE_Pat21_200101.t=0.0718100164723722;
+givenTree.VHE_Pat55_200101.t=0.04920054971199303;
+givenTree.Node4047.t=0.005413324570399197;
+givenTree.Node4046.t=0;
+givenTree.Node4059.t=0.04938966204911443;
+givenTree.Node4057.t=0.009073765668071238;
+givenTree.VHE_Pat19_200101.t=0;
+givenTree.VHE_Pat5_200101.t=0.05221947284952128;
+givenTree.VHE_Pat20_200101.t=0.009146294119255612;
+givenTree.VHE_Pat18_200101.t=0.06122949841387412;
+givenTree.HG032_199901.t=0.02691049980655064;
+givenTree.VHE_Pat35_200101.t=0.02385551508197675;
+givenTree.Node4079.t=0.01362360579429773;
+givenTree.Node4080.t=0.01345953941216247;
+givenTree.05_132918_200401.t=0.04384270231930376;
+givenTree.VHE_Pat59_200101.t=0.01958088771755064;
+givenTree.AP_ARRP016_200406.t=0.1073583151800325;
+givenTree.Node4093.t=0.01623578917537299;
+givenTree.VHE_Pat48_200101.t=0.04309707030107775;
+givenTree.Node4089.t=0.05916803881235951;
+givenTree.Node4087.t=0.0145069926819411;
+givenTree.Node4082.t=0.05259981549380899;
+givenTree.VHE_Pat57_200101.t=0.06113794706231838;
+givenTree.PCF_Pat30_200101.t=0.08904373316604196;
+givenTree.Node4068.t=0.008194342617659337;
+givenTree.CA9743_200110.t=0.06689731089771681;
+givenTree.Node4072.t=0.00774603385404355;
+givenTree.Node4075.t=0.02012801749367023;
+givenTree.VHE_Pat40_200101.t=0.04782008151685904;
+givenTree.VHE_Pat24_200101.t=0.07488312929628428;
+givenTree.HG054_199901.t=0.0298937470750522;
+givenTree.Node4067.t=0.005715999295366886;
+givenTree.Node4037.t=0.009192373151716008;
+givenTree.Node4048.t=0.004894284397493054;
+givenTree.PCF_Pat100_200101.t=0.04316992931907081;
+givenTree.Node4008.t=0.01880693713461143;
+givenTree.4004344_200401.t=0.04950634108679694;
+givenTree.Node3999.t=0.007636339287658933;
+givenTree.Node3989.t=0.01806956428944616;
+givenTree.CA1816_199809.t=0.06246104043545968;
+givenTree.Node4011.t=0;
+givenTree.Node4007.t=0.006397999205517422;
+givenTree.Node4013.t=0.04180173766565304;
+givenTree.CCB_1598_200501.t=0;
+givenTree.CCB_1588_200501.t=0;
+givenTree.Node4003.t=0.01528597439221614;
+givenTree.MI_Pat66_200101.t=0.03123890228900272;
+givenTree.Node3996.t=0.01593659578375081;
+givenTree.4002433_200401.t=0.07201581598814585;
+givenTree.Node3993.t=0;
+givenTree.Node3991.t=0.01386181214727958;
+givenTree.Node3990.t=0.004927675846045102;
+givenTree.CCB_4452_200501.t=0.06336296950855114;
+givenTree.05_132902_200401.t=0.05465685124540884;
+givenTree.Node4000.t=0.01101694787310081;
+givenTree.BRRJ931_200208.t=0.06560978061156766;
+givenTree.CA14497_200206.t=0.04669797609923444;
+givenTree.37002_199607.t=0.0395262350843901;
+givenTree.Node3901.t=0;
+givenTree.KDR_pat72_199606.t=0.06343905087923954;
+givenTree.Node3955.t=0.01436092183640712;
+givenTree.Node4023.t=0;
+givenTree.Node3987.t=0;
+givenTree.VHE_Pat49_200101.t=0.07193729337659564;
+givenTree.HG010_199901.t=0.07853333399387083;
+givenTree.VHE_Pat38_200101.t=0.05103647854781089;
+givenTree.Node4039.t=0.005792202755715826;
+givenTree.Node4040.t=0.01803584770952837;
+givenTree.PCF_Pat56_200101.t=0.04721821328534914;
+givenTree.CCB_1374_200501.t=0.031173088410898;
+givenTree.JLB_Pat32_200006.t=0.03684211040752115;
+givenTree.Node4020.t=0.007927277930405378;
+givenTree.CCB_969_200501.t=0.0463867164960606;
+givenTree.JLB_Pat54_200006.t=0.02926669150169915;
+givenTree.Node4017.t=0.009362091544773089;
+givenTree.Node4016.t=0;
+givenTree.Pt5068_200201.t=0.05902498647254412;
+givenTree.Node4024.t=0.01651041693030599;
+givenTree.Brp063_199612.t=0.06433752540289586;
+givenTree.Node4006.t=0.005787348401388235;
+givenTree.Node3988.t=0;
+givenTree.Node4287.t=0.01307727759444206;
+givenTree.BRCN17_200208.t=0.0402939935373777;
+givenTree.CH57_200101.t=0.02559737579732554;
+givenTree.Node4549.t=0.01250825710225235;
+givenTree.Node4546.t=0;
+givenTree.33009_199607.t=0.01592031376594049;
+givenTree.CH97_200101.t=0.05906164468393811;
+givenTree.Node4545.t=0.007698619328427261;
+givenTree.Node4544.t=0.003914852570576046;
+givenTree.Node4536.t=0.007477097286419847;
+givenTree.Node4552.t=0.01058792073893793;
+givenTree.BRC1561_200208.t=0.03871982691213729;
+givenTree.Pt7599_200201.t=0.03399624766925975;
+givenTree.Node4537.t=0;
+givenTree.Node4533.t=0.01219458643829746;
+givenTree.Node4521.t=0.007826335808408871;
+givenTree.DB_SI3347_02_200201.t=0.04227919157344037;
+givenTree.Node4522.t=0.004220544354466264;
+givenTree.CCB_460_200501.t=0.04571944849145955;
+givenTree.AP_21_200001.t=0.0860503056362157;
+givenTree.Node4538.t=0.009919907058555309;
+givenTree.CCB_1070_200501.t=0.06236671512095394;
+givenTree.Node4540.t=0.07352304192469016;
+givenTree.MI_Pat28_200101.t=0;
+givenTree.MI_Pat70_200101.t=0;
+givenTree.Node4520.t=0;
+givenTree.A018_198901.t=0.03333785562072936;
+givenTree.Node4568.t=0.00596211923687334;
+givenTree.Node4569.t=0.01646607539663629;
+givenTree.VHE_Pat62_200101.t=0.07588133177477357;
+givenTree.PCF_Pat86_200101.t=0.06387907947650392;
+givenTree.CCB_1000_200501.t=0.06303146344658736;
+givenTree.Node4473.t=0.0035429413090963;
+givenTree.Node3899.t=0;
+givenTree.Node4491.t=0;
+givenTree.Node4567.t=0;
+givenTree.Node4555.t=0.02668305349692997;
+givenTree.Node4556.t=0.01180403139780674;
+givenTree.Node4557.t=0.006087927003634943;
+givenTree.BRC1545_200208.t=0.04157140584796859;
+givenTree.39462_200101.t=0.03127468784063894;
+givenTree.Node4492.t=0;
+givenTree.VHE_Pat34_200101.t=0.04854184019831788;
+givenTree.CCB_4537_200501.t=0.02428337973315656;
+givenTree.Node4564.t=0.0171507978063165;
+givenTree.Node4560.t=0.01764188497274307;
+givenTree.AP_ARRP011_200406.t=0.07378136140431089;
+givenTree.Node4561.t=0.02009616186577956;
+givenTree.BRRJ909_200208.t=0.09546075954870194;
+givenTree.Node4526.t=0.005357677294322976;
+givenTree.Node4497.t=0.008769979901593668;
+givenTree.Node4495.t=0.00658809501440101;
+givenTree.N27_200301.t=0.08281891229914626;
+givenTree.CA4462_199906.t=0.02944075650150519;
+givenTree.KDR_pat184_199604.t=0.02868766446139482;
+givenTree.CCB_1700_200501.t=0.07203368263008662;
+givenTree.AP_ARRP021_200406.t=0.0659836840436509;
+givenTree.Node4504.t=0.02164032615432116;
+givenTree.Node4500.t=0.0138026306624005;
+givenTree.Pt1112_200201.t=0.05490269733546434;
+givenTree.Node4501.t=0.004675368095119446;
+givenTree.CCB_4804_200501.t=0.04291150011607579;
+givenTree.Node4474.t=0;
+givenTree.Node4475.t=0.01475449815339068;
+givenTree.dn81_200007.t=0.2020836650381612;
+givenTree.Node4481.t=0.01834599139396486;
+givenTree.BRSP454_200208.t=0.07597157919257085;
+givenTree.EC21_199407.t=0.05949551949409974;
+givenTree.CCB_881_200501.t=0;
+givenTree.PCF_Pat122_200101.t=0.02821634281483631;
+givenTree.Node4484.t=0.02270357985974196;
+givenTree.Node4485.t=0.04734023122396186;
+givenTree.Node4486.t=0;
+givenTree.CCB_161_200501.t=0.009284599810948186;
+givenTree.Node4494.t=0.008836461618912684;
+givenTree.PCF_Pat49_200101.t=0.03177725218855846;
+givenTree.Node4523.t=0.01206719277689513;
+givenTree.HG084_199901.t=0.05729726914100285;
+givenTree.Node4507.t=0;
+givenTree.Node4493.t=0.01082825144422719;
+givenTree.4003708_200401.t=0.1103560794778214;
+givenTree.Node4527.t=0.003982255003769779;
+givenTree.CH77_200101.t=0.07051689837812451;
+givenTree.CCB_3783_200501.t=0.04297552148072082;
+givenTree.MI_Pat80_200101.t=0.03301161164957419;
+givenTree.Node4528.t=0.02539599694097024;
+givenTree.Node4511.t=0;
+givenTree.dn78_200005.t=0.04255402106653681;
+givenTree.JMV_AZT_198407.t=0.0253342807049358;
+givenTree.Node4508.t=0.01653748956529355;
+givenTree.VT58_200201.t=0.04361360574688634;
+givenTree.CA5630_199912.t=0.05944456416536258;
+givenTree.Node4513.t=0.004983422920230102;
+givenTree.CA5425_199911.t=0.0715616892375312;
+givenTree.Node4517.t=0.01615598606496053;
+givenTree.CCB_5181_200501.t=0.06821054099316663;
+givenTree.dn65_200010.t=0.02688459478444459;
+givenTree.Node4512.t=0.01441274989560819;
+givenTree.Node1515.t=0.003536208358168364;
+givenTree.KDR_pat278_199603.t=0.03134429364149142;
+givenTree.Pt3198_200201.t=0.03953482708803376;
+givenTree.Node4649.t=0;
+givenTree.Node4584.t=0.007079484587231909;
+givenTree.Node4636.t=0.01357100085518216;
+givenTree.Node4618.t=0;
+givenTree.RR_MAD_TO182_200501.t=0.09578753807172145;
+givenTree.Pt1197_200201.t=0.02566065375558854;
+givenTree.Pt1274_200201.t=0;
+givenTree.143P19_199106.t=0.04799400872761037;
+givenTree.Pt3801_200201.t=0.03242201112604325;
+givenTree.Node4653.t=0.009446556010884977;
+givenTree.CCB_1736_200501.t=0.02369252134410347;
+givenTree.Pt3549_200201.t=0.03191708881509145;
+givenTree.Pt3550_200201.t=0.003813754706997908;
+givenTree.143GW353_199301.t=0.03117765301319038;
+givenTree.Node4625.t=0;
+givenTree.Node4619.t=0.003544601670272948;
+givenTree.Node4640.t=0.06397369854059462;
+givenTree.Node4643.t=0.0184742748255366;
+givenTree.Node4637.t=0;
+givenTree.Pt4629_200201.t=0.05066927623417234;
+givenTree.Node4638.t=0.004024251375269919;
+givenTree.ARG08_199701.t=0.04378161846404318;
+givenTree.Pt1264_200201.t=0.003940279639533152;
+givenTree.Node4664.t=0;
+givenTree.37008_199607.t=0.04675110633339003;
+givenTree.Node4668.t=0.004578539023604066;
+givenTree.Pt3132_200201.t=0.0122742399438277;
+givenTree.Node4670.t=0.03379323140108252;
+givenTree.Node4676.t=0.0145147895031087;
+givenTree.Pt4217_200201.t=0.01831905866075596;
+givenTree.Pt3245_200201.t=0.003489841029361074;
+givenTree.Node4679.t=0;
+givenTree.Node4678.t=0.0171916815256967;
+givenTree.Pt5035_200201.t=0;
+givenTree.Node4671.t=0.006974587691779385;
+givenTree.Node4652.t=0.01125823995243685;
+givenTree.Node4648.t=0;
+givenTree.Node4656.t=0.005533084614300925;
+givenTree.Node4660.t=0.0343416305242017;
+givenTree.Node4658.t=0.02217308966112302;
+givenTree.SP_LP29_200106.t=0.03093294678197061;
+givenTree.Pt3208_200201.t=0.01987483223645652;
+givenTree.Pt5248_200201.t=0.0337610359973682;
+givenTree.BRP2050_200104.t=0.06266223616895754;
+givenTree.Pt3044_200201.t=0.05073696249004297;
+givenTree.Node4665.t=0.01452417292646815;
+givenTree.Node4629.t=0.003534156475546862;
+givenTree.Node4603.t=0.04798815490114316;
+givenTree.Node4601.t=0.02064731023494313;
+givenTree.Pt7640_200201.t=0.003544625487507594;
+givenTree.BRP2132_200208.t=0.08133652219879275;
+givenTree.Pt7641_200201.t=0;
+givenTree.Pt3089_200201.t=0.02512240920886115;
+givenTree.Node4606.t=0.003513127871363182;
+givenTree.Node4600.t=0;
+givenTree.Node4608.t=0.008339515013251926;
+givenTree.Pt3538_200201.t=0.03838910956666906;
+givenTree.Pt4564_200201.t=0.03981568286405111;
+givenTree.Node4590.t=0.007431995604049776;
+givenTree.BR04RS151_200401.t=0.09477652530349848;
+givenTree.Pt3568_200201.t=0.05897119822504916;
+givenTree.Node4586.t=0;
+givenTree.KDR_pat69_199605.t=0.05247781228898389;
+givenTree.Pt4598_200201.t=0.02526891579827498;
+givenTree.Node4591.t=0.009950917058718044;
+givenTree.Node4596.t=0.05502566578237458;
+givenTree.Node4594.t=0.00526363709647264;
+givenTree.Pt3585_200201.t=0;
+givenTree.CCB_1803_200501.t=0.06980859376812361;
+givenTree.Pt3586_200201.t=0.007536318975149538;
+givenTree.CCB_2466_200501.t=0.06296030493271659;
+givenTree.Pt3003_200201.t=0.04416657290587168;
+givenTree.Node4626.t=0.006634687969192563;
+givenTree.BRSP388_200208.t=0.0484889207883593;
+givenTree.Node4622.t=0.01154711606953264;
+givenTree.Node4620.t=0;
+givenTree.CCB_1873_200501.t=0.09645735495239456;
+givenTree.Pt3104_200201.t=0.02121572482587445;
+givenTree.Node4633.t=0.004039991119847392;
+givenTree.Pt3559_200201.t=0.01776630561634046;
+givenTree.Pt3544_200201.t=0.05906678737361708;
+givenTree.Node4630.t=0.01674880638933564;
+givenTree.Pt5117_200201.t=0.03151330451960777;
+givenTree.Pt5694_200201.t=0.02784104590397357;
+givenTree.Node4613.t=0.01167041520311936;
+givenTree.Node4614.t=0.003321914189478457;
+givenTree.Pt3310_200201.t=0.02413829053390238;
+givenTree.Pt4632_200201.t=0.04068829431145295;
+givenTree.Node4611.t=0;
+givenTree.KDR_pat152_199604.t=0.03648257512075372;
+givenTree.Pt3620_200201.t=0.03599117257073611;
+givenTree.Node4585.t=0.003563442662645409;
+givenTree.Node4599.t=0.0106269604924496;
+givenTree.Node4589.t=0;
+givenTree.Node4476.t=0.02280296299183297;
+givenTree.CCB_4837_200501.t=0.03647088055419191;
+givenTree.Pt5005_200201.t=0.06192427816782849;
+givenTree.Node4356.t=0.01129976763661436;
+givenTree.Node4353.t=0.01131389604350141;
+givenTree.BRSP457_200208.t=0.07652757136638108;
+givenTree.Pt1562_200201.t=0.05464297562412989;
+givenTree.Node4352.t=0.01401265858249745;
+givenTree.Node4329.t=0;
+givenTree.MZ_03GEMZ004_200301.t=0.0828172760452744;
+givenTree.Node4337.t=0.007181631861741064;
+givenTree.EC9_199407.t=0.02450296567867189;
+givenTree.Node4351.t=0.004268417912327247;
+givenTree.Node4338.t=0.01217193507038644;
+givenTree.Node4339.t=0.01362224388959818;
+givenTree.BRCN32_200208.t=0.07043698290223747;
+givenTree.CH120_200101.t=0.08518739000906607;
+givenTree.n13_200301.t=0.04579965082266656;
+givenTree.Node4340.t=0.04970229785669304;
+givenTree.JLB_Pat30_200006.t=0.07799466958745944;
+givenTree.Node4348.t=0.01413355205011226;
+givenTree.Node4344.t=0.01133188376570872;
+givenTree.CH96_200101.t=0.07677127634484848;
+givenTree.Node4345.t=0.007800485601537931;
+givenTree.CCB_2248_200501.t=0.06511299594707945;
+givenTree.CA18379_200401.t=0.07215049706886642;
+givenTree.Node4376.t=0.01526334472762813;
+givenTree.CCB_3216_200501.t=0.06421846184844483;
+givenTree.Node4378.t=0.00690586993780493;
+givenTree.VT14_200201.t=0.02520626256229567;
+givenTree.CH58_200101.t=0.06583994137001671;
+givenTree.PCF_Pat173_200101.t=0.04407745382180994;
+givenTree.VT93a_200201.t=0.05180989707118715;
+givenTree.BZ167_200111.t=0.02245926473822361;
+givenTree.Node4361.t=0.007720589977094094;
+givenTree.Node4381.t=0.01301339666612479;
+givenTree.Node4375.t=0.02183535832220084;
+givenTree.HG070_199901.t=0.03083048823832556;
+givenTree.Node4368.t=0.02256878948903996;
+givenTree.Node4364.t=0;
+givenTree.CA7109_200008.t=0.07986701137511053;
+givenTree.Node4365.t=0.01033616217570291;
+givenTree.BRP2172_200208.t=0.07606504598490553;
+givenTree.CA17630_200310.t=0.02522798112300901;
+givenTree.Node4372.t=0;
+givenTree.Node4362.t=0.007786102780387635;
+givenTree.PCF_Pat101_200101.t=0.06059702352678689;
+givenTree.Node4363.t=0.01235356217949929;
+givenTree.260Pt16_199511.t=0.0460782614177646;
+givenTree.N10_200301.t=0.005279602404235702;
+givenTree.DB_SI156_04_200401.t=0.00506596874326776;
+givenTree.Node4312.t=0;
+givenTree.Node4313.t=0.01572685910001188;
+givenTree.DB_SI3927_04_200401.t=0.005004412526387202;
+givenTree.DB_SI10858_04_200401.t=0.02367355255871379;
+givenTree.DB_SI1339_04_200401.t=0;
+givenTree.Node4302.t=0.00709415801943493;
+givenTree.DB_SI6439_02_200201.t=0.007096602432290524;
+givenTree.DB_SI6826_01_200101.t=0.01064418086284141;
+givenTree.Node4311.t=0;
+givenTree.Node4303.t=0.003534432808414849;
+givenTree.Node4304.t=0;
+givenTree.Node4291.t=0.01707234525952363;
+givenTree.ARG19_199701.t=0.06848500109204997;
+givenTree.CA5409_199911.t=0.02991462761274347;
+givenTree.Node4279.t=0;
+givenTree.IP_19_199701.t=0.04240898811547153;
+givenTree.DB_SI1321_04_200401.t=0.01014523940175806;
+givenTree.Node4305.t=0;
+givenTree.DB_SI4736_03_200301.t=0.003537317874779595;
+givenTree.DB_SI6422_02_200201.t=0.007079062612963251;
+givenTree.DB_SI3418_01_200101.t=0;
+givenTree.Node4306.t=0;
+givenTree.Node4301.t=0;
+givenTree.Node4030.t=0;
+givenTree.KDR_pat91_199602.t=0.06755968539032917;
+givenTree.Node4278.t=0.01428644779035637;
+givenTree.Node4294.t=0.006522291492624436;
+givenTree.Node4290.t=0.00522210074147542;
+givenTree.PCF_Pat105_200101.t=0.02786169282028676;
+givenTree.Node4334.t=0.01344754282239482;
+givenTree.Node4330.t=0.003985276873769231;
+givenTree.Pt5092_200201.t=0.04560068510132691;
+givenTree.Node4331.t=0.02636443067349247;
+givenTree.KDR_pat113_199604.t=0.07202659595039759;
+givenTree.Node4324.t=0.02963607104452438;
+givenTree.Node4299.t=0;
+givenTree.DB_SI4314_03_200301.t=0.0177535480323238;
+givenTree.DB_SI6663_03_200301.t=0.01776816210564165;
+givenTree.DB_SI7655_04_200401.t=0.01429732935214761;
+givenTree.Node4300.t=0;
+givenTree.Node4298.t=0.02020982331739799;
+givenTree.CCB_3620_200501.t=0.07001806039565611;
+givenTree.CA16274_200301.t=0.06185192494497846;
+givenTree.Node4295.t=0.0050167829701034;
+givenTree.DB_SI8213_02_200201.t=0.02627787874066465;
+givenTree.Node4297.t=0.06066179507607779;
+givenTree.Node4384.t=0;
+givenTree.MI_Pat68_200101.t=0.02909671732185331;
+givenTree.Node4448.t=0.008069814159447285;
+givenTree.Node4444.t=0.007719185123436245;
+givenTree.Node4449.t=0.0102189538446727;
+givenTree.ARG27_199701.t=0.04620326585558664;
+givenTree.Pt3134_200201.t=0.05487671506992905;
+givenTree.CCB_4204_200501.t=0.0970147461960834;
+givenTree.Node4429.t=0;
+givenTree.4000582_200401.t=0.05239263201153328;
+givenTree.Node4443.t=0.01777720290405294;
+givenTree.Pt3721_200201.t=0.03846371929456006;
+givenTree.Node4453.t=0.01442359754883802;
+givenTree.Node4445.t=0.01543230578976844;
+givenTree.4004581_200401.t=0.01511358732341648;
+givenTree.Node4432.t=0.0554725305933399;
+givenTree.Node4433.t=0;
+givenTree.4000579_200401.t=0;
+givenTree.Node4435.t=0;
+givenTree.4001798_200401.t=0.01514778251468869;
+givenTree.ED_V46_199901.t=0.07539850818148046;
+givenTree.PCF_Pat57_200101.t=0.02725094565634276;
+givenTree.Node4430.t=0.003367078484021113;
+givenTree.Node4431.t=0.04911137725701634;
+givenTree.MI_Pat62_200101.t=0.02197284885960125;
+givenTree.JLB_Pat78_200006.t=0.006357755605002894;
+givenTree.Node4428.t=0;
+givenTree.Node4412.t=0.0100915516086507;
+givenTree.Node4456.t=0;
+givenTree.Node4470.t=0.008661458727828485;
+givenTree.Node4466.t=0.01858291458422427;
+givenTree.Node4028.t=0;
+givenTree.CMR_03ZAPS045MB2_199901.t=0.06674788071921396;
+givenTree.Node4478.t=0.0179614037154823;
+givenTree.CCB_4156_200501.t=0.03988361863726952;
+givenTree.Node3900.t=0;
+givenTree.MDS_01UAKV267_200101.t=0.03697248940552591;
+givenTree.CH111_200101.t=0.05746381533320116;
+givenTree.CCB_4198_200501.t=0.03941496734178077;
+givenTree.CH119_200101.t=0.06715546576608596;
+givenTree.Node4458.t=0.03066655075489975;
+givenTree.JLB_Pat77_200006.t=0.02739607107563579;
+givenTree.Node4460.t=0.05493219054831406;
+givenTree.Node4463.t=0.02115674600085355;
+givenTree.Node4467.t=0.02171333598018577;
+givenTree.BRSP799_200208.t=0.03510441399781981;
+givenTree.CA18325_200312.t=0.04556037008655221;
+givenTree.Node4457.t=0;
+givenTree.BRC1529_200208.t=0.04303292731269399;
+givenTree.Node4436.t=0;
+givenTree.Node4395.t=0.01735502670077007;
+givenTree.4003834_200401.t=0.06475507408706949;
+givenTree.Node4401.t=0.01519756226023079;
+givenTree.BRP2118_200208.t=0.05573180752369675;
+givenTree.PCM074_200101.t=0.09394936933363392;
+givenTree.CA6821_200006.t=0.02153326103397695;
+givenTree.VC_pat53_199901.t=0.02063573610963205;
+givenTree.CA9959_200109.t=0.05774564652018035;
+givenTree.Node4388.t=0.01079438208038718;
+givenTree.Node4404.t=0.00911514496995396;
+givenTree.Node4394.t=0.009394258051657563;
+givenTree.Node4396.t=0.0101583439653859;
+givenTree.CCB_3287_200501.t=0.08232486374657076;
+givenTree.Node4390.t=0.02029283354946489;
+givenTree.KDR_pat130_199605.t=0.07228240437724891;
+givenTree.Node4360.t=0.004392850812020827;
+givenTree.Node4328.t=0;
+givenTree.CA8416_200103.t=0.03834808569549034;
+givenTree.Node4397.t=0.05916113207129042;
+givenTree.CCB_1511_200501.t=0.07425977082041958;
+givenTree.05_132862_200401.t=0.04774273009796374;
+givenTree.Node4389.t=0.008699573577409771;
+givenTree.WJ_pat7225_200201.t=0.04561833637984974;
+givenTree.Node4408.t=0.006120425519675572;
+givenTree.Node4414.t=0;
+givenTree.4000358_200401.t=0.03587709246406577;
+givenTree.Node4422.t=0.02473549412836559;
+givenTree.CCB_3482_200501.t=0.03993233564017537;
+givenTree.CA14421_200205.t=0.00913806246921486;
+givenTree.CA14422_200205.t=0.05663265997473735;
+givenTree.4001906_200401.t=0.005024820307478792;
+givenTree.CA14654_200210.t=0;
+givenTree.4002922_200401.t=0;
+givenTree.Node4425.t=0.004837820704280068;
+givenTree.Node4413.t=0.007981736874979741;
+givenTree.Node4415.t=0;
+givenTree.Node4327.t=0;
+givenTree.Node4029.t=0;
+givenTree.Node4387.t=0.01178204585547378;
+givenTree.CA3931_199903.t=0.0188190354256025;
+givenTree.Node4407.t=0.007038078308016544;
+givenTree.GRSPR45_200301.t=0.00511006415039098;
+givenTree.Node4416.t=0.02008936213427267;
+givenTree.MI_Pat12_200101.t=0.02188952578393103;
+givenTree.CCB_1240_200501.t=0.05371307795716453;
+givenTree.GRSPR49_200301.t=0.04600018850934543;
+givenTree.Node4417.t=0.04737364948553568;
+givenTree.Pt3848_200201.t=0.0319447431871398;
+givenTree.Node3372.t=0.008085719293828161;
+givenTree.Node3346.t=0.008724082515592313;
+givenTree.HG069_199901.t=0.08470952791956292;
+givenTree.Node3376.t=0.01222877913227227;
+givenTree.CCB_2592_200501.t=0.02102182963903991;
+givenTree.CA3954_199903.t=0.04617733066517674;
+givenTree.Pt3505_200201.t=0.01808404733611289;
+givenTree.CCB_2354_200501.t=0.04375023780797745;
+givenTree.Node3381.t=0.002070101498294514;
+givenTree.Node3382.t=0;
+givenTree.Pt3690_200201.t=0.06125346961357101;
+givenTree.Node3384.t=0.02464495339683486;
+givenTree.Node3373.t=0;
+givenTree.01UYTRA1092_200101.t=0.0503269494838508;
+givenTree.Node3369.t=0;
+givenTree.ARG_63_200001.t=0.03151921734602275;
+givenTree.Node3356.t=0;
+givenTree.ARG34_199701.t=0.0279485036292494;
+givenTree.Node3367.t=0.01064965079410461;
+givenTree.KDR_pat246_199601.t=0.0596367361340286;
+givenTree.Pt5081_200201.t=0.06508990817592138;
+givenTree.Node3347.t=0.01857732655005497;
+givenTree.Node3355.t=0.02406955017214798;
+givenTree.Node3351.t=0;
+givenTree.VT53_200201.t=0.0667864337057054;
+givenTree.HG058_199901.t=0.03520854588721316;
+givenTree.MI_Pat29_200101.t=0;
+givenTree.Node3293.t=0.007076017022621782;
+givenTree.Node3379.t=0;
+givenTree.Node3345.t=0.005183852659605265;
+givenTree.MI_Pat69_200101.t=0.01090228495929681;
+givenTree.PCF_Pat72_200101.t=0.05452959640768749;
+givenTree.Node3408.t=0.01675466921136182;
+givenTree.VHE_Pat70_200101.t=0.04124402858682702;
+givenTree.Node3403.t=0.03784585895894016;
+givenTree.Node3401.t=0.0179385204140863;
+givenTree.Node3391.t=0.002972830838734568;
+givenTree.dn43_200007.t=0.03564206564258724;
+givenTree.JLB_Pat53_200006.t=0.0431719623495686;
+givenTree.Node3380.t=0.02112164934830877;
+givenTree.Pt3563_200201.t=0.02011648249000569;
+givenTree.Node3388.t=0.005477099381374609;
+givenTree.Node3392.t=0.01397524241275153;
+givenTree.CCB_1741_200501.t=0.05199026632107607;
+givenTree.Node3395.t=0;
+givenTree.Node3396.t=0.007663996712101695;
+givenTree.ED_V22_199901.t=0.04919116659627239;
+givenTree.VH_VHPCR_199001.t=0.04909944687702425;
+givenTree.Node3360.t=0;
+givenTree.PCF_Pat160_200101.t=0.04269505383410521;
+givenTree.Node3330.t=0.005255707616727411;
+givenTree.Node3328.t=0;
+givenTree.CA5337_199910.t=0.05914756784491811;
+givenTree.Node3295.t=0.008677334082208958;
+givenTree.KDR_pat270_199512.t=0.03024384731063107;
+givenTree.CCB_86_200501.t=0.07461584742218995;
+givenTree.BRRJ832_200104.t=0.05637907178993464;
+givenTree.Pt3578_200201.t=0.0422905713150488;
+givenTree.Node3327.t=0.005190658410670541;
+givenTree.Pt3797_200201.t=0.0637673056700499;
+givenTree.Node3333.t=0.02249848345412796;
+givenTree.Node3317.t=0.01045772185742085;
+givenTree.KDR_pat158_199605.t=0.03043329634994657;
+givenTree.VT17_200201.t=0.07738635552125778;
+givenTree.Node3296.t=0.000917489061722685;
+givenTree.Node3314.t=0.008817640070239918;
+givenTree.Node3310.t=0.0116010544149551;
+givenTree.EC14_199407.t=0.04768779473052524;
+givenTree.05_132911_200401.t=0.04288941588352052;
+givenTree.Node3323.t=0.02550176851445534;
+givenTree.4002923_200401.t=0.04387476404429044;
+givenTree.Node3320.t=0.01119395287607485;
+givenTree.Node3318.t=0.01300279173969963;
+givenTree.Node3337.t=0.01984713668405375;
+givenTree.AP_ARRP049_200406.t=0.09638291230677214;
+givenTree.Node3357.t=0.02132957574967046;
+givenTree.ARG11_199701.t=0.04069066296070079;
+givenTree.98USHVTN8229c6_199801.t=0.04407720594558792;
+givenTree.Node3352.t=0.03279290016359278;
+givenTree.ARG30_199701.t=0.06464535875167442;
+givenTree.AP_ARRP058_200406.t=0.04969139491969071;
+givenTree.Node3364.t=0;
+givenTree.ARG_62_200001.t=0.03140939009727985;
+givenTree.03AR137681_200301.t=0.0507179546769012;
+givenTree.Node3361.t=0.01432085242858593;
+givenTree.4000362_200401.t=0.05760806463458995;
+givenTree.Pt3537_200201.t=0.01802367147628858;
+givenTree.Node3340.t=0.005504703105566209;
+givenTree.Node3341.t=0;
+givenTree.Pt1454_200201.t=0.01339007025251688;
+givenTree.Pt3535_200201.t=0.007183244217108484;
+givenTree.Node3336.t=0.01672348969361348;
+givenTree.CH134_200101.t=0.07018733735859971;
+givenTree.Node3348.t=0.01940413692869272;
+givenTree.KDR_pat281_199603.t=0.01671574154531106;
+givenTree.Node3326.t=0.01089088488103046;
+givenTree.Node3294.t=0;
+givenTree.4004580_200401.t=0.0397277343076584;
+givenTree.CH92_200101.t=0.03833839813704296;
+givenTree.Node3472.t=0;
+givenTree.Node3464.t=0.02599802204825775;
+givenTree.Node3473.t=0.01337588539993255;
+givenTree.CCB_246_200501.t=0.04244789991197708;
+givenTree.MI_Pat44_200101.t=0.0418951740376226;
+givenTree.Node3442.t=0;
+givenTree.Node3481.t=0.02862525798432592;
+givenTree.CCB_3510_200501.t=0.0585570144284261;
+givenTree.Pt3772_200201.t=0.04401302940097688;
+givenTree.Node3424.t=0.00286910074514194;
+givenTree.GRSPR37_200301.t=0.1272330966756897;
+givenTree.Node3465.t=0.01766009335732013;
+givenTree.Node3459.t=0;
+givenTree.Node3443.t=0;
+givenTree.CA5272_199911.t=0.01906619135532721;
+givenTree.PCF_Pat37_200101.t=0.05158220862169013;
+givenTree.Node3460.t=0.01620026605161919;
+givenTree.KDR_pat95_199603.t=0.1158528840220095;
+givenTree.CA5771_200001.t=0.07143909118770786;
+givenTree.Node3469.t=0;
+givenTree.BRP2394_200104.t=0.06594567050577725;
+givenTree.36023_199607.t=0.01068258926030924;
+givenTree.Node3466.t=0.03027235397172913;
+givenTree.Node3480.t=0.004300546291693982;
+givenTree.Node3496.t=0.01550531729014597;
+givenTree.Node3488.t=0.007174934305741863;
+givenTree.CA4024_199903.t=0.07084304121387723;
+givenTree.CA16159_200303.t=0.08159497047782983;
+givenTree.Node3497.t=0.00938602321848182;
+givenTree.Node3478.t=0;
+givenTree.4001519_200401.t=0.04513996170745419;
+givenTree.Node3502.t=0.001436758361913886;
+givenTree.Node3503.t=0.02696330969653774;
+givenTree.n23_200301.t=0.05072363603776889;
+givenTree.98USHVTN3605c9_199801.t=0.08566052320002299;
+givenTree.BR04RS172_200401.t=0.05934754639722728;
+givenTree.Node3479.t=0.003801555634416224;
+givenTree.PSW_Pat13_199901.t=0.04733960458837412;
+givenTree.Node3485.t=0.01320453978671595;
+givenTree.HG015_199901.t=0.05232001372411058;
+givenTree.PCM034_200101.t=0.05515911490756987;
+givenTree.JLB_Pat35_200006.t=0.05001857794176861;
+givenTree.Node3493.t=0.02878793906128601;
+givenTree.Node3489.t=0.00851128820560685;
+givenTree.Pt3193_200201.t=0.09610798010284186;
+givenTree.Node3490.t=0.007834314522648225;
+givenTree.4002185_200401.t=0.09573445142926015;
+givenTree.33013_199607.t=0.06835381044789478;
+givenTree.KDR_pat63_199603.t=0.01376958411387542;
+givenTree.CA2096_200204.t=0.06543713574164904;
+givenTree.Node1518.t=0;
+givenTree.Node3292.t=0;
+givenTree.Node3262.t=0.003534860588864233;
+givenTree.Node3427.t=0.0104504747999593;
+givenTree.Node3426.t=0.00954689654989886;
+givenTree.JA_5012_198701.t=0.0410753573524803;
+givenTree.Node3430.t=0.009935846854796222;
+givenTree.4001097_200401.t=0.03145841502861794;
+givenTree.JLB_Pat21_200006.t=0.063212490434693;
+givenTree.Node3400.t=0.01028177808982877;
+givenTree.Node3411.t=0.01699483923676345;
+givenTree.Node3407.t=0.01639430904975754;
+givenTree.PCF_Pat88_200101.t=0.01726270057425508;
+givenTree.PCF_Pat141_200101.t=0.01158093015003768;
+givenTree.Node3412.t=0.03346290593805535;
+givenTree.ARG_61_200001.t=0.0474426281911289;
+givenTree.Node3416.t=0.01390476998204182;
+givenTree.Node3406.t=0;
+givenTree.Node3418.t=0.06653029684880442;
+givenTree.Pt5739_200201.t=0.009284924238099419;
+givenTree.Pt5715_200201.t=0.01267745835907664;
+givenTree.CA9752_200109.t=0.05577820197770965;
+givenTree.Node3449.t=0;
+givenTree.Node3445.t=0;
+givenTree.Node3451.t=0.02716051107335397;
+givenTree.PCF_Pat28_200101.t=0.01779757653806517;
+givenTree.PCF_Pat131_200101.t=0.02316176950923211;
+givenTree.IP_13_199707.t=0.03463408189641276;
+givenTree.Node3454.t=0;
+givenTree.Node3444.t=0.007788942355155662;
+givenTree.Node3456.t=0.02554669930882161;
+givenTree.4002034_200401.t=0.07809532921435849;
+givenTree.05_132896_200401.t=0.06946592353270224;
+givenTree.143P2_199104.t=0.02982735829894563;
+givenTree.Node3438.t=0.007016603612295895;
+givenTree.CA5176_199910.t=0.05074015905508054;
+givenTree.JLB_Pat64_200006.t=0.05755429965270217;
+givenTree.Node3434.t=0.005407156255209044;
+givenTree.ARG26_199701.t=0.0356260773232323;
+givenTree.Node3437.t=0;
+givenTree.PCF_Pat69_200101.t=0.06982015233968845;
+givenTree.Node3446.t=0.009551619584725449;
+givenTree.KDR_pat42_199603.t=0.02113192046204307;
+givenTree.Node3433.t=0.0157533635890741;
+givenTree.Node3425.t=0;
+givenTree.CA3895_199902.t=0.04358242472663643;
+givenTree.dn66_200009.t=0.06273887824848298;
+givenTree.05_132895_200401.t=0.0794031265669481;
+givenTree.Node3185.t=0.02170837654042691;
+givenTree.Node3178.t=0.008245651511716209;
+givenTree.CA6789_200005.t=0.05432860289589906;
+givenTree.Node3182.t=0.003828530968224058;
+givenTree.Node3177.t=0.01259135268639766;
+givenTree.MYIDU7_200401.t=0.01037806717719077;
+givenTree.Node3193.t=0.02888620408066007;
+givenTree.MYIDUA14_200401.t=0;
+givenTree.Node3073.t=0;
+givenTree.MYIDUA5_200401.t=0.02178175068587504;
+givenTree.4001171_200401.t=0.09864941840196867;
+givenTree.GRSPR5_200301.t=0.05984051625930285;
+givenTree.DB_SI1761_01_200101.t=0.07498643237418467;
+givenTree.Node3171.t=0;
+givenTree.GRSPR5D_200301.t=0.04166987454977841;
+givenTree.DMG22_199902.t=0.04169887838958959;
+givenTree.Node3174.t=0.03250012650221146;
+givenTree.MDS_02UACR012_200101.t=0.008980701377283492;
+givenTree.Node3179.t=0.03944322551974062;
+givenTree.MDS_02UACR019_200101.t=0;
+givenTree.Node3170.t=0;
+givenTree.Node3074.t=0.01235451579260076;
+givenTree.Node3191.t=0.03011820508695025;
+givenTree.4003353_200401.t=0.05675763536026168;
+givenTree.PCF_Pat27_200101.t=0.03727475565850563;
+givenTree.Node3205.t=0.01307263687278917;
+givenTree.KDR_pat96_199603.t=0.05439797893993185;
+givenTree.CCB_1671_200501.t=0.06483128909278624;
+givenTree.Node3209.t=0.01270162771327728;
+givenTree.GRSPR35_200301.t=0.01579343133370263;
+givenTree.GRSPR36_200301.t=0;
+givenTree.Node3204.t=0.003819890486647597;
+givenTree.PCF_Pat137_200101.t=0.04721130800144981;
+givenTree.Node3208.t=0.00955349811574226;
+givenTree.Node2990.t=0.003554972141671811;
+givenTree.JLB_Pat62_200006.t=0.03528011115639049;
+givenTree.Node3197.t=0.01171036291063166;
+givenTree.143H179_199301.t=0.04901203715966421;
+givenTree.BB_92FR_BX08_199201.t=0.04332908625464934;
+givenTree.Node3190.t=0;
+givenTree.Node3189.t=0.003639732180644955;
+givenTree.Node3188.t=0.01040652446737604;
+givenTree.Node3072.t=0.003622054761418136;
+givenTree.Node3200.t=0.01924071307251084;
+givenTree.4004584_200401.t=0.0881270995859339;
+givenTree.PCF_Pat164_200101.t=0.05014251487823378;
+givenTree.Node3075.t=0.02043735344701351;
+givenTree.Node3144.t=6.106031612686339e-05;
+givenTree.Node3142.t=0.004362917021938501;
+givenTree.MDS_02UANK104_200101.t=0.0090961352219079;
+givenTree.MDS_01AZ018_199901.t=0.008999765406353964;
+givenTree.MDS_02UANK076_200101.t=0.0271191938756385;
+givenTree.MDS_02UANK066_200101.t=0.01356462102525084;
+givenTree.Node3136.t=0;
+givenTree.MZ_03GEMZ028_200301.t=0.01807465830841912;
+givenTree.Node3140.t=0;
+givenTree.Node3141.t=0.00898156400122657;
+givenTree.MDS_02UAKV181_200101.t=0.01356056569697368;
+givenTree.Node3137.t=0.004504911001562855;
+givenTree.Node3129.t=0.004489097584050405;
+givenTree.Node771.t=0;
+givenTree.MDS_02UANK101_200101.t=0.009006022394400811;
+givenTree.MDS_01UAKV241_200101.t=0.00452956604679644;
+givenTree.Node3128.t=0.004475896549768957;
+givenTree.SP_UFC_E_199108.t=0.01300243776509552;
+givenTree.MDS_01UAKV242_200101.t=0.01811652168134456;
+givenTree.MDS_02UANK065_200101.t=0.02269763650159642;
+givenTree.Node3126.t=0;
+givenTree.Node3127.t=0;
+givenTree.MDS_02UANK096_200101.t=0.0362834341905237;
+givenTree.Node3135.t=0.00892678587024664;
+givenTree.Pt4155_200201.t=0;
+givenTree.Node3163.t=0.01192630418868969;
+givenTree.Node3164.t=0;
+givenTree.Pt3603_200201.t=0.02004911073583801;
+givenTree.Pt4156_200201.t=0.007124473712892283;
+givenTree.Node3157.t=0.007035340918310056;
+givenTree.Node3155.t=0.04235641844040226;
+givenTree.Node3153.t=0.01119451073911236;
+givenTree.Pt5130_200201.t=0.04409493942022969;
+givenTree.Pt5246_200201.t=0.007382081766918633;
+givenTree.Node3156.t=0.05798669615615223;
+givenTree.Node3158.t=0.007167256268216012;
+givenTree.MDS_02UANK069_200101.t=0.03177124925695961;
+givenTree.Node3150.t=0.01004962965755646;
+givenTree.MDS_02UANK061_200101.t=0.04466200606786339;
+givenTree.Node3125.t=0.004521625014663606;
+givenTree.Node3077.t=0;
+givenTree.Node3076.t=0.005425718655580428;
+givenTree.Node3159.t=0.00709431894477436;
+givenTree.Pt4637_200201.t=0;
+givenTree.Pt3170_200201.t=0.003556111100033312;
+givenTree.MDS_02UANK071_200101.t=0.02634955631390409;
+givenTree.Pt3266_200201.t=0.003554356305579171;
+givenTree.Node3220.t=0.06666732177231972;
+givenTree.CCB_4162_200501.t=0.06123016373413755;
+givenTree.Node3276.t=0.01980977284531562;
+givenTree.Node3270.t=0.01445467423838773;
+givenTree.Node3277.t=0.01907999235248587;
+givenTree.dn61_200010.t=0.08382887877541335;
+givenTree.HND_DRPI039_200401.t=0.1026525391932049;
+givenTree.Node3264.t=0.004413402936000982;
+givenTree.dn13_200012.t=0.02854060706405412;
+givenTree.Node3282.t=0.01128751466943991;
+givenTree.Node3283.t=0.01930134404076403;
+givenTree.JA_3885_198701.t=0.06250353475095526;
+givenTree.CA8386_200102.t=0.04660929390340109;
+givenTree.Node3271.t=0.004444259806413621;
+givenTree.VT62_200201.t=0.05816169013315149;
+givenTree.380626L_199401.t=0.04963745152479401;
+givenTree.KDR_pat50_199605.t=0.02578852605594866;
+givenTree.Node2845.t=0;
+givenTree.Node1519.t=0;
+givenTree.Node3267.t=0.02189557998095559;
+givenTree.05_132881_200401.t=0.0305218525128665;
+givenTree.Node3273.t=0.01931364311165469;
+givenTree.BRC1538_200208.t=0.07665673669810573;
+givenTree.Node3265.t=0;
+givenTree.HG063_199901.t=0.03103371532952146;
+givenTree.BR04RS150_200401.t=0.02171803791283171;
+givenTree.VT23_200201.t=0.04327868679801101;
+givenTree.05_132884_200401.t=0.05969875533042607;
+givenTree.Node3298.t=0.0103875357560518;
+givenTree.CA21066_200405.t=0.06460484670181479;
+givenTree.Node3300.t=0.005312255265503074;
+givenTree.Node3307.t=0.00976708198923709;
+givenTree.Node3311.t=0.02377587904204813;
+givenTree.CA14551_200207.t=0.04668335546044229;
+givenTree.05_132890_200401.t=0.07036615122382811;
+givenTree.Node3297.t=0.01791833801051787;
+givenTree.n15_200301.t=0.09548214245743297;
+givenTree.Node3301.t=0.045717501179062;
+givenTree.Node3287.t=0.01071905675881603;
+givenTree.Node3281.t=0;
+givenTree.ARES2_199701.t=0.03936213926485319;
+givenTree.BR04RS158_200401.t=0.01677100570395165;
+givenTree.Node3288.t=0.03306552912563888;
+givenTree.Node3263.t=0;
+givenTree.BR04RS111_200401.t=0;
+givenTree.Node3303.t=0.0166257424985725;
+givenTree.BR04RS110_200401.t=0;
+givenTree.KDR_pat234_199602.t=0.01937999292933427;
+givenTree.BR04RS189_200401.t=0;
+givenTree.Node2989.t=0;
+givenTree.Node3216.t=0.003536764445457264;
+givenTree.41018_199607.t=0.03634098639186506;
+givenTree.Node3230.t=0.007085805440111482;
+givenTree.Node3231.t=0.005192256855914183;
+givenTree.EC25_199407.t=0.003580079733990088;
+givenTree.DB_SI7136_03_200301.t=0.01061844183977722;
+givenTree.Node3215.t=0;
+givenTree.BR04RS204_200401.t=0.09051217534736219;
+givenTree.Node3235.t=0;
+givenTree.Node3236.t=0;
+givenTree.CA800_199709.t=0.00750508306603657;
+givenTree.OMVB_RT_42_200301.t=0.01323863441166193;
+givenTree.Node3218.t=0.01021632735372493;
+givenTree.SLMT_IVDU009_200501.t=0;
+givenTree.CCB_886_200501.t=0.0363750118610786;
+givenTree.PCF_Pat180_200101.t=0.07239794447938358;
+givenTree.Node3219.t=0;
+givenTree.BRRJ838_200104.t=0.0113137344625742;
+givenTree.Node3217.t=0;
+givenTree.dn54_200006.t=0.05044562656081002;
+givenTree.Node3225.t=0.006874089342686709;
+givenTree.OMVB_RT_41_200301.t=0.04485569531473512;
+givenTree.Node3227.t=0;
+givenTree.ACTG347_0044_199704.t=0.05274254982711357;
+givenTree.SU015_199901.t=0.02750547978707943;
+givenTree.143P18_199108.t=0.02494292745117088;
+givenTree.Node3250.t=0;
+givenTree.PCF_Pat130_200101.t=0.04662794989712328;
+givenTree.Node3254.t=0;
+givenTree.Node3258.t=0.01080487037580104;
+givenTree.Node3213.t=0;
+givenTree.Node3203.t=0;
+givenTree.Node3249.t=0;
+givenTree.AD8_198601.t=0.02128423467274139;
+givenTree.Node3257.t=0;
+givenTree.260Pt25_199511.t=0.0493927831455363;
+givenTree.PCF_Pat110_200101.t=0.04755924667698944;
+givenTree.Node3246.t=0.01315154455915523;
+givenTree.BRCN19_200208.t=0.05798142871289357;
+givenTree.Node3241.t=0.02490458583551563;
+givenTree.CA1407_199804.t=0.07490092596598091;
+givenTree.Node3244.t=0.003786214670576266;
+givenTree.CA5268_199911.t=0.0256344996295727;
+givenTree.Node3251.t=0.02267644889947373;
+givenTree.VT25_200201.t=0.05081849462354274;
+givenTree.Node3240.t=0.004839193547405318;
+givenTree.Node3214.t=0.01418858628307506;
+givenTree.4001461_200401.t=0.0206932475507099;
+givenTree.Node3760.t=0.001202381834981682;
+givenTree.Node3754.t=0.01449445084267267;
+givenTree.N48_200301.t=0.03709731174587402;
+givenTree.Node3762.t=0.02323302040665893;
+givenTree.Node3763.t=0.06691232345470495;
+givenTree.PT_VE5_199301.t=0.05051706646009697;
+givenTree.PT_VE8_199301.t=0.05339801054291622;
+givenTree.Node3771.t=0.01194555641263272;
+givenTree.Node3767.t=0.009645447000900051;
+givenTree.PS1038_200407.t=0.04063329968866521;
+givenTree.Node3768.t=0.009638726720426228;
+givenTree.BRC1558_200208.t=0.02795371847014937;
+givenTree.4003832_200401.t=0.03242451053536727;
+givenTree.Node3657.t=0.003613027505433508;
+givenTree.N41_200301.t=0.06992743115403297;
+givenTree.Node3739.t=0.004373657943437172;
+givenTree.CA8453_200103.t=0.0536145033226391;
+givenTree.Node3749.t=0.005105832393456885;
+givenTree.CCB_3327_200501.t=0.07940533775928998;
+givenTree.SLMT_UD388_200501.t=0.04873600147511251;
+givenTree.4003831_200401.t=0.01846882341248997;
+givenTree.Node3755.t=0;
+givenTree.PCF_Pat22_200101.t=0.03615445169390785;
+givenTree.Node3757.t=0.01935269069485502;
+givenTree.Node3753.t=0;
+givenTree.Node3786.t=0.01224023198988417;
+givenTree.CCB_5089_200501.t=0.04147886220640523;
+givenTree.Node3788.t=0.06799481654677607;
+givenTree.Pt1146_200201.t=0;
+givenTree.Node3790.t=0.02244742907512105;
+givenTree.CCB_5383_200501.t=0.04180997161034183;
+givenTree.Node3785.t=0.006288837423137844;
+givenTree.DB_SI2663_04_200401.t=0.07861917921314422;
+givenTree.Node3793.t=0.0163869928423553;
+givenTree.MI_Pat61_200101.t=0.07700984681527258;
+givenTree.Node3795.t=0.004612367153244978;
+givenTree.Pt3543_200201.t=0;
+givenTree.Node3778.t=0.006560838237453133;
+givenTree.Node3776.t=0.006924779192663037;
+givenTree.CH59_200101.t=0.06427782529581254;
+givenTree.SLMT_IVDU109_200501.t=0.03892059939710502;
+givenTree.BRRJ911_200208.t=0.03314975920280103;
+givenTree.93US143_200111.t=0.05950095288406008;
+givenTree.CCB_1507_200501.t=0.05046387350436585;
+givenTree.Pt3164_200201.t=0.007151928273225277;
+givenTree.Node3775.t=0.003857762694792423;
+givenTree.CCB_445_200501.t=0.02094726133515486;
+givenTree.Node3781.t=0;
+givenTree.dn37_200010.t=0.05553938374714897;
+givenTree.Node3709.t=0.007496455920100008;
+givenTree.SLMT_UD230_200501.t=0.04833033171319957;
+givenTree.Node3715.t=0;
+givenTree.CA7900_200010.t=0.08506279420714256;
+givenTree.Node3717.t=0.02133836115033291;
+givenTree.CA9792_200104.t=0.04402355295872741;
+givenTree.BRP2054_200104.t=0.0285476554736863;
+givenTree.Node3728.t=0.01143704376145177;
+givenTree.BRP2080_200104.t=0.01128933220192371;
+givenTree.Node3723.t=0.02208732631579536;
+givenTree.BRP2060_200104.t=0.01690366894223734;
+givenTree.BRSP586_200208.t=0.05793290012779308;
+givenTree.Node3681.t=0;
+givenTree.Node3671.t=0.01113556737748737;
+givenTree.Node3699.t=0.008298757763239201;
+givenTree.Node3703.t=0.01537896997774731;
+givenTree.Node3701.t=0.04178446859933888;
+givenTree.SLMT_IVDU023_200501.t=0.02934481000167788;
+givenTree.Node3710.t=0.009104476324647715;
+givenTree.SLMT_UD227_200501.t=0.07902474907752252;
+givenTree.Node3712.t=0.03349448962128294;
+givenTree.DB_SI444_01_200101.t=0.01637811853274921;
+givenTree.DB_SI6145_02_200201.t=0.06563571622362459;
+givenTree.Node3726.t=0.009697908841180538;
+givenTree.CCB_2971_200501.t=0.01701377519453522;
+givenTree.Node3741.t=0.04735133106589349;
+givenTree.VT63_200201.t=0.01702075160247019;
+givenTree.Node3670.t=0.007258455999545177;
+givenTree.Node3658.t=0.003581403982408067;
+givenTree.4004222_200401.t=0.01596246502617163;
+givenTree.Node3744.t=0.01816711689346103;
+givenTree.Node3740.t=0.007682087314687545;
+givenTree.CA9750_200106.t=0.07820513690113334;
+givenTree.4004587_200401.t=0;
+givenTree.Node3745.t=0.08021150824675712;
+givenTree.Node3708.t=0;
+givenTree.Node3731.t=0.009726991223244044;
+givenTree.Node3721.t=0.001777124487489301;
+givenTree.05_132882_200401.t=0.1112663410894485;
+givenTree.Node3722.t=0;
+givenTree.BRP2107_200208.t=0.0566654306519068;
+givenTree.BR04RS103_200401.t=0.03388934255167145;
+givenTree.Node3734.t=0.01670930279105551;
+givenTree.Node3720.t=0.004251514287556741;
+givenTree.Node3736.t=0.04677533991697841;
+givenTree.PCF_Pat201_200101.t=0.02314354710351247;
+givenTree.PCF_Pat127_200101.t=0.008965767131533969;
+givenTree.JLB_Pat86_200006.t=0.05939587506154273;
+givenTree.Node3852.t=0.003709721533446146;
+givenTree.Node3840.t=0.007139203309812321;
+givenTree.HG067_199901.t=0.02069300150736032;
+givenTree.Node3856.t=0.0115473187723843;
+givenTree.Node3857.t=0.02163436235769981;
+givenTree.CA2106_199810.t=0.03481251459433946;
+givenTree.PCF_Pat48_200101.t=0.06811580362110431;
+givenTree.Node3866.t=0;
+givenTree.Node3862.t=0.003715830792693244;
+givenTree.Pt3029_200201.t=0.05767293809583746;
+givenTree.Node3863.t=0.007855511790112115;
+givenTree.5000055_200401.t=0.04124492918097782;
+givenTree.05_132905_200401.t=0.0477336886102505;
+givenTree.CH9_200101.t=0.0491560684868721;
+givenTree.Node3849.t=0.006329210921197681;
+givenTree.SLMT_UD469_200501.t=0.0509851587189822;
+givenTree.PCF_Pat140_200101.t=0.04345639945308215;
+givenTree.Node3846.t=0.01826463704308845;
+givenTree.Node3845.t=0.006665684750716888;
+givenTree.Node3853.t=0.0154832519853543;
+givenTree.ARG17_199701.t=0.03075272241384022;
+givenTree.JLB_Pat60_200006.t=0.03439713261703072;
+givenTree.Node3841.t=0.007193245007794505;
+givenTree.260_Pt1_199511.t=0.04593078522650361;
+givenTree.JA_1423_198701.t=0.02370651246601048;
+givenTree.Node3885.t=0.02049634443508766;
+givenTree.Node3881.t=0.007482929265896337;
+givenTree.CA16407_200306.t=0.06318298443339887;
+givenTree.Node3882.t=0.04479399321170553;
+givenTree.CCB_4372_200501.t=0.08921029303851705;
+givenTree.Node3879.t=0.007470745858758738;
+givenTree.Node3889.t=0.01665346857294238;
+givenTree.BRCN26_200208.t=0.06778969181576908;
+givenTree.CA6823_200006.t=0.03874607334256769;
+givenTree.Node3877.t=0;
+givenTree.MZ_03GEMZ023_200301.t=0.08322011749076318;
+givenTree.GRSPR23_200301.t=0.03454682257139191;
+givenTree.CH67_200101.t=0.07448753188181503;
+givenTree.Node3871.t=0;
+givenTree.Node3872.t=0.02363788735363445;
+givenTree.4001654_200401.t=0.09351123771456234;
+givenTree.05_132893_200401.t=0.08112707954753333;
+givenTree.Node3869.t=0.004092173440621054;
+givenTree.US3_200111.t=0.02221415077977304;
+givenTree.AP_40_200001.t=0.01341366731672855;
+givenTree.KDR_pat256_199607.t=0.02080274095626877;
+givenTree.Node3861.t=0.003486968117952591;
+givenTree.Node3839.t=0.007104516998005817;
+givenTree.HG074_199901.t=0.05194389229808796;
+givenTree.dn10_200001.t=0.03255655289069243;
+givenTree.CCB_2179_200501.t=0.0302583846941345;
+givenTree.Node3810.t=0.005547640062091523;
+givenTree.Node3811.t=0.01169612541850879;
+givenTree.SLMT_IVDU157_200501.t=0.04786825673606932;
+givenTree.Node3815.t=0.01086193982155579;
+givenTree.Node3818.t=0.01904168435382476;
+givenTree.Node3808.t=0.01138550584432467;
+givenTree.Pt5190_200201.t=0.05614466012712889;
+givenTree.Node3809.t=0.01023383197281383;
+givenTree.BRRJ908_200208.t=0.1145308404934148;
+givenTree.Pt7988_200201.t=0.08143539707585727;
+givenTree.Node3752.t=0.006555127915945082;
+givenTree.Node3656.t=0.007067687501951426;
+givenTree.Node3774.t=0.009867311963168297;
+givenTree.Node3798.t=0.03764854565994451;
+givenTree.Node3784.t=0;
+givenTree.N35_200301.t=0.06247515090309048;
+givenTree.Node3803.t=0.01119290480204157;
+givenTree.VT03_200201.t=0.04751540057640131;
+givenTree.CCB_2207_200501.t=0.03499310993219019;
+givenTree.05_132892_200401.t=0.09873424757290503;
+givenTree.Node3804.t=0.01830760979700586;
+givenTree.Node3802.t=0.006742955932563848;
+givenTree.Node3827.t=0.01904021398809234;
+givenTree.Node3821.t=0.01040256888896107;
+givenTree.Node3831.t=0;
+givenTree.DB_SI879_00_200001.t=0.02424678839846363;
+givenTree.Node3833.t=0.01071621251682071;
+givenTree.Node3801.t=0.003296929384596298;
+givenTree.CA21078_200406.t=0.04682694223763482;
+givenTree.Node3842.t=0.01129253926319198;
+givenTree.KDR_pat201_199605.t=0.03677980777745565;
+givenTree.Node3655.t=0.007128693715126823;
+givenTree.Node3587.t=0.007325239814705165;
+givenTree.Node3834.t=0.004866080207479857;
+givenTree.Node3824.t=0.009497753459368865;
+givenTree.Node3822.t=0.009835556954306398;
+givenTree.CA6446_200004.t=0.1019543484914147;
+givenTree.CCB_3994_200501.t=0.06515209513114183;
+givenTree.DB_SI5275_01_200101.t=0.06003129249261956;
+givenTree.DB_SI8266_04_200401.t=0.02184941165110112;
+givenTree.DB_SI10311_03_200301.t=0.02434148222698857;
+givenTree.DB_SI4715_01_200101.t=0.007081768165829031;
+givenTree.DB_SI1329_04_200401.t=0.04077211467042868;
+givenTree.DB_SI11518_04_200401.t=0;
+givenTree.Node3828.t=0.04842815863179766;
+givenTree.Node3705.t=0.02867381318131234;
+givenTree.Node3568.t=0.0119112721027097;
+givenTree.Node3562.t=0.009511124186106222;
+givenTree.Node3554.t=0;
+givenTree.Pt4546_200201.t=0.06036511403958611;
+givenTree.Node3563.t=0.002446280334685389;
+givenTree.CCB_4302_200501.t=0.03842118252557301;
+givenTree.HG092_199901.t=0.04661230821911447;
+givenTree.Node3572.t=0;
+givenTree.WJ_pat7728_200201.t=0.06110554092409023;
+givenTree.143P6_199104.t=0.03487380318432915;
+givenTree.LV17HALD_199801.t=0.05493198434125814;
+givenTree.Node3573.t=0.01892853961571344;
+givenTree.Node3565.t=0.03337212724180917;
+givenTree.Node3556.t=0.0163163142778382;
+givenTree.4004043_200401.t=0.0831391024995979;
+givenTree.CA16090_200303.t=0.03956494426527723;
+givenTree.Node3422.t=0;
+givenTree.KDR_pat9_199605.t=0.02398874988592395;
+givenTree.C98_199607.t=0.03839466262699716;
+givenTree.BRCN18_200208.t=0.09636203049537673;
+givenTree.CA8040_200012.t=0.04695084299462941;
+givenTree.KDR_pat205_199602.t=0.02555989923229921;
+givenTree.Node3559.t=0.02260941871248458;
+givenTree.Node3555.t=0;
+givenTree.CCB_518_200501.t=0.04226471559349582;
+givenTree.CCB_1445_200501.t=0.02275191468384819;
+givenTree.Node3596.t=0.04231802411481764;
+givenTree.VT40_200201.t=0.005379113258921585;
+givenTree.EC11_199407.t=0.01322031548546555;
+givenTree.Node3591.t=0.01937049419775054;
+givenTree.54002_199607.t=0.07819375325648889;
+givenTree.cw8_199901.t=0.03546579035925675;
+givenTree.CCB_2174_200501.t=0.07090475798144023;
+givenTree.Node3595.t=0.005646723426679144;
+givenTree.PS3002_200502.t=0.0924746282756521;
+givenTree.Node3599.t=0.02496429291850252;
+givenTree.KDR_pat51_199602.t=0.02102782763674204;
+givenTree.N53_200301.t=0.03886165704060429;
+givenTree.Pt3272_200201.t=0.03577400192094319;
+givenTree.Node3578.t=0.005890332599228767;
+givenTree.Node3579.t=0.01435483781881216;
+givenTree.VT81RTE_200201.t=0.03678462811522643;
+givenTree.Node3583.t=0.01739090179275737;
+givenTree.Node3421.t=0.003540343861453756;
+givenTree.Node1517.t=0;
+givenTree.Node3553.t=0;
+givenTree.Node3577.t=0.01612076269332996;
+givenTree.Node3571.t=0.01644666385293704;
+givenTree.Node3512.t=0;
+givenTree.CP_Pat15_199712.t=0.0724719409420853;
+givenTree.Node3520.t=0.01711145816648001;
+givenTree.Node3521.t=0.0090314772320759;
+givenTree.CP_Pat10_199712.t=0.07114770750046173;
+givenTree.CA4161_199904.t=0.06068320122884525;
+givenTree.Node3514.t=0.009656422275107254;
+givenTree.BRC1548_200208.t=0.05242817733278466;
+givenTree.CH46_200101.t=0.06457630501282323;
+givenTree.Node3526.t=0.02555436561970039;
+givenTree.4003912_200401.t=0.0500510324352091;
+givenTree.JLB_Pat8_200006.t=0.04999863191896251;
+givenTree.Node3515.t=0.01190636058127728;
+givenTree.Node3507.t=0;
+givenTree.Node3501.t=0;
+givenTree.Node3509.t=0.0326729216328838;
+givenTree.CCB_4948_200501.t=0.0873279480362142;
+givenTree.MI_Pat56_200101.t=0.08963837573196871;
+givenTree.Node3477.t=0.007081451991732985;
+givenTree.CA16326_200305.t=0.06890061268194653;
+givenTree.Node3517.t=0.02859010108624935;
+givenTree.Brp093_199612.t=0.1034969339676059;
+givenTree.Node3423.t=0;
+givenTree.IP_18_199612.t=0.04331622001196126;
+givenTree.Node3530.t=0.01905365120183327;
+givenTree.4004582_200401.t=0.06949621009347536;
+givenTree.CCB_3265_200501.t=0.06773947087072099;
+givenTree.Node3537.t=0.008892782224903145;
+givenTree.CA5100_199909.t=0.0449876287138289;
+givenTree.Node3543.t=0.007861432126853193;
+givenTree.Node3548.t=0.02492730279897917;
+givenTree.Node3546.t=0.005368653223406364;
+givenTree.Node3536.t=0.01407223630943906;
+givenTree.CA14545_200208.t=0.03203182122496299;
+givenTree.JLB_Pat2_200006.t=0.02606122744168676;
+givenTree.Node3547.t=0.008128889054725891;
+givenTree.143P4_199104.t=0.04262929056826227;
+givenTree.Node3529.t=0.02458671701833664;
+givenTree.Node3525.t=0.01709752073243746;
+givenTree.Node3533.t=0.02745916076365446;
+givenTree.CH71_200101.t=0.05021632113790127;
+givenTree.CH93_200101.t=0.03585536945018355;
+givenTree.Node3513.t=0.004537889697979829;
+givenTree.Node3540.t=0.02692349556994534;
+givenTree.Node3538.t=0.01419170034286286;
+givenTree.Pt3022_200201.t=0.03504445451732349;
+givenTree.SLMT_IVDU096_200501.t=0.02484135693675524;
+givenTree.4004186_200401.t=0.08553830330059647;
+givenTree.PS2016_200501.t=0.0498615086685268;
+givenTree.Node3667.t=0.009171779339646214;
+givenTree.Node3659.t=0;
+givenTree.VT08_200201.t=0.0318174429869944;
+givenTree.DMG109_199806.t=0.07809576473074019;
+givenTree.Node3660.t=0.01708641282853784;
+givenTree.BRP2117_200208.t=0.02885487827297751;
+givenTree.CCB_2244_200501.t=0;
+givenTree.Node3675.t=0.01319661349250774;
+givenTree.Node3673.t=0.03077771303490229;
+givenTree.CCB_550_200501.t=0;
+givenTree.CCB_1103_200501.t=0.005172253128207827;
+givenTree.Node3676.t=0.0110526984782546;
+givenTree.Node3664.t=0.006903567739060009;
+givenTree.Node3638.t=0;
+givenTree.Node3620.t=0;
+givenTree.Node3650.t=0.0163374611104199;
+givenTree.Node3651.t=0.03597822125274223;
+givenTree.MI_Pat54_200101.t=0.04954004500608927;
+givenTree.Node3588.t=0.00552692099618152;
+givenTree.BRP2059_200104.t=0.06886857088077504;
+givenTree.CA16406_200306.t=0.07349790066069756;
+givenTree.Node3661.t=0.01517589313408349;
+givenTree.KDR_pat30_199603.t=0.03153044026821436;
+givenTree.PCF_Pat171_200101.t=0.05568199058452483;
+givenTree.Pt5175_200201.t=0.06587898900146093;
+givenTree.BrRJ070_200101.t=0.03872709578270076;
+givenTree.Node3696.t=0.004966571452568587;
+givenTree.BRRJ829_200104.t=0.05166123286113141;
+givenTree.SLMT_UD410_200501.t=0.02535862318621961;
+givenTree.Node3683.t=0.003553570498150934;
+givenTree.Node3682.t=0.007418684340978143;
+givenTree.Pt3832_200201.t=0;
+givenTree.Pt3722_200201.t=0;
+givenTree.Pt1054_200201.t=0.04217568058500512;
+givenTree.BRNE268_200208.t=0.03366288706663498;
+givenTree.Pt3133_200201.t=0.03730301897053961;
+givenTree.Node3684.t=0;
+givenTree.Node3686.t=0;
+givenTree.SLMT_IVDU010_200501.t=0.02457653462538558;
+givenTree.437895_200101.t=0.04647382851533876;
+givenTree.Node3672.t=0.0216789835501814;
+givenTree.SLMT_IVDU115_200501.t=0.03455196759513078;
+givenTree.Node3685.t=0;
+givenTree.Node3692.t=0.01265489523008262;
+givenTree.Node3690.t=0.006635295843740939;
+givenTree.02BR011_200401.t=0.04906906464078302;
+givenTree.SLMT_UD353_200501.t=0.0139846073198717;
+givenTree.SLMT_UD367_200501.t=0.06648055096164052;
+givenTree.dn33_200006.t=0;
+givenTree.Node3615.t=0.007988333743169205;
+givenTree.Node3609.t=0.00592172336066689;
+givenTree.CCB_357_200501.t=0.03487828401586603;
+givenTree.05_132868_200401.t=0.03744924195650964;
+givenTree.Node3616.t=0.02129110156339721;
+givenTree.Node3589.t=0;
+givenTree.Node3624.t=0.02028613439888305;
+givenTree.Node3622.t=0;
+givenTree.Pt7579_200201.t=0.05001111402173269;
+givenTree.KDR_pat266_199512.t=0.0104476504076707;
+givenTree.ED_V97_199901.t=0.05013968675238938;
+givenTree.GRSPR104_200301.t=0.07839838165402702;
+givenTree.Node3602.t=0;
+givenTree.Node3594.t=0.007031183404091339;
+givenTree.Node3604.t=0.01828257570757085;
+givenTree.PS2019_200501.t=0.02409648969366633;
+givenTree.Node3606.t=0.03626908562305575;
+givenTree.Node3590.t=0.00442816091762472;
+givenTree.Node3612.t=0.01933191520159514;
+givenTree.Node3610.t=0.01561376083720762;
+givenTree.CA14505_200207.t=0.08782810108214523;
+givenTree.SLMT_UD198_200501.t=0.02841595379622133;
+givenTree.Brp044_199612.t=0.07089697691261737;
+givenTree.4003911_200401.t=0.04627876778238838;
+givenTree.04RU139095_200401.t=0.06723557376876424;
+givenTree.Node3644.t=0.01768718771573936;
+givenTree.ARG_64_200001.t=0.1070995128711694;
+givenTree.PCF_Pat159_200101.t=0.06582138118822306;
+givenTree.Node3641.t=0;
+givenTree.Node3640.t=0.01586767409258334;
+givenTree.Node3639.t=0;
+givenTree.dn96_200003.t=0.005062353719422365;
+givenTree.Node3647.t=0.02540012879327904;
+givenTree.ED_V14_199901.t=0.04336508128236981;
+givenTree.PCF_Pat89_200101.t=0.04532788856375475;
+givenTree.KDR_pat148_199605.t=0.05089634327830183;
+givenTree.Pt3324_200201.t=0.04806971859994757;
+givenTree.Node3630.t=0.0112855916295479;
+givenTree.Node3631.t=0.05715167417222097;
+givenTree.CCB_2882_200501.t=0.005146426940760023;
+givenTree.CCB_2548_200501.t=0;
+givenTree.Node3628.t=0.008859820551276808;
+givenTree.Node3627.t=0.003527184804760446;
+givenTree.Node3621.t=0.007484435293827082;
+givenTree.Node3635.t=0.007961421877781372;
+givenTree.BRC1544_200208.t=0.06928946408239986;
+givenTree.DB_SI4688_03_200301.t=0.02974000113509159;
+givenTree.CCB_4286_200501.t=0.06282764658916752;
+givenTree.Pt3117_200201.t=0.08759380595921766;
+givenTree.Node5719.t=0.02895192505036022;
+givenTree.Node5707.t=0.003676898321682067;
+givenTree.4000500_200401.t=0.0419933192650042;
+givenTree.Node5714.t=0;
+givenTree.Node5708.t=0.01414340115728873;
+givenTree.Node5677.t=0.007494881077294357;
+givenTree.BR04RS93_200401.t=0.04156114549015284;
+givenTree.CA5157_199910.t=0.09035831404933754;
+givenTree.Node5723.t=0;
+givenTree.143P1_199104.t=0.02988192919910655;
+givenTree.CA6556_200005.t=0.03594836337931447;
+givenTree.CCB_252_200501.t=0.05054923712682439;
+givenTree.VT16_200201.t=0.05412415664703824;
+givenTree.CH81_200101.t=0.01165555885253836;
+givenTree.Node5678.t=0;
+givenTree.Node5696.t=0.006523221093543469;
+givenTree.Node5692.t=0;
+givenTree.CH112_200101.t=0.01952130210841577;
+givenTree.PCF_Pat123_200101.t=0.04855445515783561;
+givenTree.Node5715.t=0.004716265615723868;
+givenTree.BRBS462_200104.t=0.06033497258284071;
+givenTree.Node5711.t=0.03254778032509607;
+givenTree.Node5709.t=0.01314689575836305;
+givenTree.Node5726.t=0.01551913680886269;
+givenTree.CA4858_199908.t=0.0661605787344164;
+givenTree.Node5744.t=0.006953626194789104;
+givenTree.GRSPR82_200301.t=0.09313020298525543;
+givenTree.Node5735.t=0.01602832450397723;
+givenTree.Node5731.t=0.006888280600759125;
+givenTree.dn11_200009.t=0.04532247238368053;
+givenTree.ED_V28_199901.t=0.03087976824043425;
+givenTree.CH64_200101.t=0.09064158074752365;
+givenTree.Node5743.t=0.00516558807391093;
+givenTree.PCF_Pat78_200101.t=0.05929957677614636;
+givenTree.Node5747.t=0;
+givenTree.Node5739.t=0.01659712269172754;
+givenTree.GRSPR86_200301.t=0.04115905842103922;
+givenTree.CA14517_200207.t=0.04124890292311972;
+givenTree.Node5668.t=0;
+givenTree.Node5722.t=0.01063154256616909;
+givenTree.Node5676.t=0.00370430775024034;
+givenTree.Node5732.t=0.006284251000974188;
+givenTree.4001462_200401.t=0.06304519786928241;
+givenTree.Pt5076_200201.t=0.05378098181769585;
+givenTree.Node5736.t=0.005492962800394024;
+givenTree.N70_200301.t=0.06860280969540819;
+givenTree.Pt3347_200201.t=0.05133570720896957;
+givenTree.Node5704.t=0.01276356623147402;
+givenTree.Node5626.t=0.003451008977665285;
+givenTree.HG018_199901.t=0.03154233071281296;
+givenTree.MI_Pat36_200101.t=0.06765676785356228;
+givenTree.Node5642.t=0.003647970579641658;
+givenTree.Node5662.t=0;
+givenTree.Node5658.t=0;
+givenTree.Node5670.t=0.008209135018203254;
+givenTree.Node5669.t=0.01174405395586116;
+givenTree.HG090_199901.t=0.06596730147503033;
+givenTree.Node5673.t=0.02018797030764551;
+givenTree.CCB_2969_200501.t=0.06676954910524541;
+givenTree.129005_200401.t=0.05028475924758239;
+givenTree.CCB_4732_200501.t=0.04183285679018203;
+givenTree.Node5651.t=0.009469652425995487;
+givenTree.Node5643.t=0.006805320213348684;
+givenTree.Node5655.t=0.0164488389721627;
+givenTree.WJ_pat7152_200201.t=0.09684921791275242;
+givenTree.4003352_200401.t=0.04118830820474912;
+givenTree.VT21_200201.t=0.03384219664312315;
+givenTree.C925_198705.t=0.035825951492529;
+givenTree.Node5663.t=0;
+givenTree.ED_V42_199901.t=0.0498191219757983;
+givenTree.PCF_Pat75_200101.t=0.0544262742370448;
+givenTree.Node5659.t=0.01772082507085902;
+givenTree.CCB_4471_200501.t=0.04786101762321922;
+givenTree.04AR151516_200401.t=0.09417249570148073;
+givenTree.Node5699.t=0.01062880201264212;
+givenTree.BRC1472_200104.t=0.0292127936724885;
+givenTree.PCF_Pat40_200101.t=0.05062944043836244;
+givenTree.Node5693.t=0.02128140814994341;
+givenTree.CCB_301_200501.t=0.01712107258790276;
+givenTree.BRP2106_200208.t=0.03027637076134218;
+givenTree.CH40_200101.t=0.06436125169266847;
+givenTree.Node5697.t=0.01499398996420331;
+givenTree.Node5698.t=0;
+givenTree.CCB_5061_200501.t=0.06422395198945031;
+givenTree.BR04RS131_200401.t=0.05908666686917469;
+givenTree.Node5684.t=0.007012471381666806;
+givenTree.Node5680.t=0.01794286422177155;
+givenTree.AP_ARRP034_200406.t=0.08418764809066591;
+givenTree.Node5681.t=0.01831935695978172;
+givenTree.BRP2028_200104.t=0.05495717570420488;
+givenTree.BR04RS156_200401.t=0.07798696027124589;
+givenTree.Node5687.t=0.01740806497928342;
+givenTree.Node5679.t=0.01299997050977643;
+givenTree.CCB_3828_200501.t=0.04831126483456406;
+givenTree.CA14305_200203.t=0.08680826684187155;
+givenTree.Node5688.t=0.006831076877110467;
+givenTree.Node5751.t=0.01035885633778627;
+givenTree.Node5811.t=0.02553383949886481;
+givenTree.Node5809.t=0;
+givenTree.Node5805.t=0.005587690576142959;
+givenTree.Node5813.t=0.05592778873312509;
+givenTree.Node5814.t=0.008277661171999264;
+givenTree.Pt5717_200201.t=0.0200749238129709;
+givenTree.BRP2396_200104.t=0.06526333672271158;
+givenTree.33018_199607.t=0.005576458577684568;
+givenTree.Pt3837_200201.t=0.06215588150247994;
+givenTree.Node5804.t=0.004952920231028832;
+givenTree.Pt4601_200201.t=0.06551934219019204;
+givenTree.Node5818.t=0.01686416739349296;
+givenTree.Pt3705_200201.t=0.01422492487574872;
+givenTree.Node5798.t=0.005410067386914519;
+givenTree.Node5790.t=0.004100703638419493;
+givenTree.Node5800.t=0;
+givenTree.260Pt26_199511.t=0.04930572188363781;
+givenTree.CA16147_200301.t=0.05550478554559721;
+givenTree.KDR_pat121_199605.t=0.0736230855361911;
+givenTree.Pt3264_200201.t=0.0312175341069465;
+givenTree.Pt5709_200201.t=0;
+givenTree.4003090_200401.t=0.05821433782858593;
+givenTree.PCF_Pat119_200101.t=0.04903214980496088;
+givenTree.Node5806.t=0.008397110639882972;
+givenTree.Node5821.t=0.01023385419219438;
+givenTree.Node5832.t=0;
+givenTree.Node5824.t=0.003539935327995516;
+givenTree.Node5836.t=0.01618379292915562;
+givenTree.CCB_763_200501.t=0.05349998805819237;
+givenTree.MI_Pat48_200101.t=0.05249082737792341;
+givenTree.Node5788.t=0.003545587728835363;
+givenTree.CH27_200101.t=0.08579615012623719;
+givenTree.Node5843.t=0.01261305088836942;
+givenTree.Node5844.t=0.01562193698765078;
+givenTree.HG034_199901.t=0.07028074314666892;
+givenTree.SLMT_UD578_200501.t=0.07176132083528228;
+givenTree.Node5833.t=0.02098066397849934;
+givenTree.EC6_199407.t=0.03669540177168643;
+givenTree.Node5826.t=0;
+givenTree.HG050_199901.t=0.04023320583518183;
+givenTree.Node5803.t=0.006980084247952185;
+givenTree.Node5789.t=0;
+givenTree.KDR_pat107_199602.t=0.06362861653977825;
+givenTree.CA4459_199906.t=0.0444631414465961;
+givenTree.ARG_55_200001.t=0.03964847498479107;
+givenTree.Node5825.t=0.007760163439134378;
+givenTree.Pt7655_200201.t=0.04192560581177203;
+givenTree.Node5829.t=0.02231052469753159;
+givenTree.VHE_Pat4_200101.t=0.03825418602664261;
+givenTree.Node5763.t=0.008853246933138235;
+givenTree.Node5757.t=0.02244696660082297;
+givenTree.Node5765.t=0.02157257360842598;
+givenTree.CA1865_199808.t=0.04796637614846231;
+givenTree.CA7998_200011.t=0.08443397070758585;
+givenTree.Node5729.t=0;
+givenTree.LV720EST_199901.t=0.04981102470426783;
+givenTree.Node5772.t=0.005935908055248659;
+givenTree.PSW_Pat5_199802.t=0.06569222484716937;
+givenTree.Node5667.t=0.0101968237413451;
+givenTree.Node5625.t=0;
+givenTree.KDR_pat115_199604.t=0.0270061808634618;
+givenTree.Node5750.t=0.009636836809233643;
+givenTree.Node5742.t=0.0154910130775153;
+givenTree.Node5754.t=0.02242377410002214;
+givenTree.ARG_52_200001.t=0.05880049951529962;
+givenTree.Pt7857_200201.t=0.04757941019811431;
+givenTree.Node5730.t=0.006957318329618544;
+givenTree.CCB_222_200501.t=0.05441565550933418;
+givenTree.Node5758.t=0.009286789326423876;
+givenTree.Node5759.t=0.01069197575707863;
+givenTree.GRSPR96_200301.t=0.05271684452145917;
+givenTree.DMG23_199903.t=0.08332194211570959;
+givenTree.CCB_4954_200501.t=0.06129247083709582;
+givenTree.Node5624.t=0;
+givenTree.KDR_pat287_199604.t=0.01559720163036241;
+givenTree.Node5768.t=0.0105711195350259;
+givenTree.PCF_Pat156_200101.t=0.01494801950224335;
+givenTree.Node5784.t=0.00677773653245811;
+givenTree.CH126_200101.t=0.05350199439900578;
+givenTree.Node5795.t=0;
+givenTree.Node5791.t=0;
+givenTree.EC19_199407.t=0.03884903045459558;
+givenTree.Node5792.t=0.00595407192893976;
+givenTree.VT02_200201.t=0.04321359049879925;
+givenTree.33001_199607.t=0.026187788498415;
+givenTree.Node5776.t=0.02049189821262535;
+givenTree.Node5770.t=0.009880138397674586;
+givenTree.ED_V65_199901.t=0.06748234525957592;
+givenTree.Node5771.t=0.01787886544020586;
+givenTree.US1_200111.t=0.05934369315787939;
+givenTree.N60_200301.t=0.08192072743189166;
+givenTree.Node5779.t=0.006953483536286689;
+givenTree.Node5769.t=0.005768006587600795;
+givenTree.SWC_1214_199704.t=0.03329845147004041;
+givenTree.LV65HPD_199801.t=0.04541022803997947;
+givenTree.Node5780.t=0.01798181490731781;
+givenTree.Node5652.t=0.02243939856467287;
+givenTree.Node5523.t=0.0898491588008675;
+givenTree.Pt3042_200201.t=0.03679988010999539;
+givenTree.Pt5060_200201.t=0.002947335998681199;
+givenTree.CCB_3308_200501.t=0.01037378088690888;
+givenTree.Node5509.t=0.02798970034540351;
+givenTree.CCB_3303_200501.t=0;
+givenTree.Pt5152_200201.t=0.01723975637211789;
+givenTree.Node5508.t=0.0193246165067287;
+givenTree.4004346_200401.t=0.005116374363631977;
+givenTree.Node5522.t=0.008412876525667107;
+givenTree.Node5528.t=0.02037654847530394;
+givenTree.Node5526.t=0.0362436962204048;
+givenTree.Node5519.t=0.02519173819149141;
+givenTree.Node5514.t=0.0222997280368637;
+givenTree.Pt6201_200201.t=0.01976820267327933;
+givenTree.Pt6281_200201.t=0.01667816289448422;
+givenTree.dn77_200011.t=0.06795469132242787;
+givenTree.Pt6241_200201.t=0.001175793201336883;
+givenTree.Node5513.t=0.06007627895763794;
+givenTree.Pt4059_200201.t=0.02050095230032348;
+givenTree.Pt7846_200201.t=0.03350027340889602;
+givenTree.Node5510.t=0.008194711254629415;
+givenTree.Node5511.t=0.004973462252411626;
+givenTree.CCB_1801_200501.t=0.0279682971473801;
+givenTree.4000422_200401.t=0.015221136429578;
+givenTree.C18_199301.t=0.09538479581282888;
+givenTree.Node5549.t=0.02063511376768296;
+givenTree.Brp019_199612.t=0.03214115538245397;
+givenTree.Node5544.t=0.009921131903652633;
+givenTree.Node5542.t=0;
+givenTree.Node5541.t=0.007829699423642969;
+givenTree.CCB_4296_200501.t=0.05305040942881534;
+givenTree.CCB_1135_200501.t=0.01553165669474413;
+givenTree.Node5554.t=0.03101908912676741;
+givenTree.n22_200301.t=0.02848108506580808;
+givenTree.PCF_Pat161_200101.t=0.0162841766466057;
+givenTree.Node5546.t=0.08743061028798943;
+givenTree.CCB_2589_200501.t=0.05719125693702248;
+givenTree.Node5531.t=0.003573821460969491;
+givenTree.Node5532.t=0.06081923564815883;
+givenTree.05_132861_200401.t=0.004242254403561688;
+givenTree.Node5534.t=0.00422993243226275;
+givenTree.Node5507.t=0.01417141828246185;
+givenTree.DB_SI2113_03_200301.t=0.004161762163435069;
+givenTree.DB_SI548_03_200301.t=0;
+givenTree.BRRJ932_200208.t=0.07335473337560468;
+givenTree.Node5453.t=0.00451284217390687;
+givenTree.VT52_200201.t=0.02136523102842026;
+givenTree.Node5454.t=0.009888327778214514;
+givenTree.Pt6223_200201.t=0.06376189553348505;
+givenTree.Node5480.t=0.01479634759680829;
+givenTree.BRP2032_200104.t=0.121229041636439;
+givenTree.CCB_3568_200501.t=0.04329865916059109;
+givenTree.Node5474.t=0.01705698095092006;
+givenTree.CCB_3522_200501.t=0.05583851768059238;
+givenTree.Node5484.t=0.02125312882544739;
+givenTree.Node5478.t=0.00469404617435267;
+givenTree.Pt5234_200201.t=0.1087604349696973;
+givenTree.Node5479.t=0;
+givenTree.BRRJ854_200104.t=0.081000489419308;
+givenTree.ACTG347_0008_199706.t=0.07833842947553604;
+givenTree.Node5456.t=0.01758746795189502;
+givenTree.GRSPR77_200301.t=0.09114553158721668;
+givenTree.Node5462.t=0.01891586149085304;
+givenTree.BRP2147_200208.t=0.07499053860820176;
+givenTree.Pt4055_200201.t=0.08788828927397052;
+givenTree.Pt5100_200201.t=0.06956414057740988;
+givenTree.Node5470.t=0.01449804932679887;
+givenTree.Node5466.t=0.01006318094954083;
+givenTree.Pt3831_200201.t=0.05307147825481592;
+givenTree.Node5467.t=0.02169980581450614;
+givenTree.CCB_3474_200501.t=0.05929142124209991;
+givenTree.CCB_5362_200501.t=0.06737852488709031;
+givenTree.Node5495.t=0.009439725914951397;
+givenTree.AS_CRA_199801.t=0.07036116841191227;
+givenTree.Node5499.t=0.01429767996477605;
+givenTree.CCB_1638_200501.t=0.08240507881713066;
+givenTree.Pt3244_200201.t=0.03083458009066195;
+givenTree.Pt3131_200201.t=0.02873668585990219;
+givenTree.Node5494.t=0.01023958103490345;
+givenTree.Node5490.t=0;
+givenTree.Node5502.t=0;
+givenTree.Pt3241_200201.t=0.03604431638233484;
+givenTree.Node5504.t=0.01520757042379058;
+givenTree.Node5496.t=0.006240946836043651;
+givenTree.Node5473.t=0.005748673270811314;
+givenTree.Node5465.t=0.01023194811085558;
+givenTree.Node5477.t=0.00924274595162645;
+givenTree.Pt4529_200201.t=0.09189006248700804;
+givenTree.Node5487.t=0.0072687730317317;
+givenTree.Node5455.t=0.005073652874027172;
+givenTree.4003351_200401.t=0.03577933783625926;
+givenTree.Pt5162_200201.t=0.03925401751468476;
+givenTree.Node5491.t=0.01513345211271565;
+givenTree.n19_200301.t=0.06324951193999609;
+givenTree.Pt3316_200201.t=0.07183925351379582;
+givenTree.Node5557.t=0.02635453476603236;
+givenTree.Pt5036_200201.t=0;
+givenTree.Node5619.t=0.007391559077692685;
+givenTree.Pt5260_200201.t=0.03095101997374059;
+givenTree.Pt3540_200201.t=0;
+givenTree.Node5613.t=0.01068843204639246;
+givenTree.BRBS469_200104.t=0.07417997800240406;
+givenTree.Node5618.t=0.05411143116089031;
+givenTree.Node5450.t=0.01064501572375574;
+givenTree.Node5244.t=0;
+givenTree.Node5608.t=0.004878415583101238;
+givenTree.Node5616.t=0.01234369017041598;
+givenTree.Node5612.t=0.0108761862309934;
+givenTree.DB_SI4993_02_200201.t=0.07903588506705739;
+givenTree.Node5603.t=0.01132283922285979;
+givenTree.Node5599.t=0.0163133182151882;
+givenTree.CCB_4550_200501.t=0.03525986698705414;
+givenTree.Pt1266_200201.t=0.06675019938831049;
+givenTree.Node5604.t=0.01540217274821183;
+givenTree.Node5591.t=0.003656039263619096;
+givenTree.Node5609.t=0.02111884695418065;
+givenTree.n14_200301.t=0.05821745318328343;
+givenTree.410252e_199401.t=0.03894684293884384;
+givenTree.Node5451.t=0;
+givenTree.VT39_200201.t=0.04891478408463232;
+givenTree.KDR_pat268_199512.t=0.02195486304921898;
+givenTree.CA14661_200210.t=0.02008238007315554;
+givenTree.Node5645.t=0.009604490647809964;
+givenTree.KDR_pat141_199605.t=0.05129664060566877;
+givenTree.Node5635.t=0.02842707739360675;
+givenTree.Node5627.t=0.004701598521357498;
+givenTree.ACTG347_0073_199705.t=0.08168403623547646;
+givenTree.VT44_200201.t=0.06285752017042967;
+givenTree.BRC1556_200208.t=0.06228775577957942;
+givenTree.Node5644.t=0;
+givenTree.CCB_5045_200501.t=0.04719654273920131;
+givenTree.Node5648.t=0.03265401280335788;
+givenTree.Node5639.t=0.0253339022174501;
+givenTree.Node5629.t=0.01955778037217098;
+givenTree.CA16192_200212.t=0.04294471942684402;
+givenTree.Node5631.t=0.007957629594791965;
+givenTree.BRSP483_200208.t=0.06704756808328266;
+givenTree.Pt3284_200201.t=0.04742444385988124;
+givenTree.Node5628.t=0.008741808995263891;
+givenTree.CCB_1635_200501.t=0.06711690082669411;
+givenTree.05_132880_200401.t=0.07329145734010038;
+givenTree.Node5636.t=0.02327699956518166;
+givenTree.PSW_Pat39_200201.t=0.04125443858759983;
+givenTree.PCF_Pat19_200101.t=0.05536198927488147;
+givenTree.4000423_200401.t=0.07204958722190502;
+givenTree.92BR003_199201.t=0.04192130053041151;
+givenTree.Node5573.t=0.004589501072754393;
+givenTree.VT66_200201.t=0.06812064333125921;
+givenTree.Node5552.t=0;
+givenTree.Node5540.t=0;
+givenTree.CCB_3519_200501.t=0.08992713263550234;
+givenTree.92BR021_199201.t=0.0595311480605165;
+givenTree.BRP2099_200208.t=0.06316408699320301;
+givenTree.Node5572.t=0.006211604186156174;
+givenTree.02BR013_200401.t=0.09310798370722329;
+givenTree.Node5576.t=0.01791655368397677;
+givenTree.Node5560.t=0.007618350880161761;
+givenTree.Node5562.t=0.01318975428366533;
+givenTree.CCB_1444_200501.t=0.04553344373743119;
+givenTree.LV713GUE_199901.t=0.05979166656410086;
+givenTree.Node5553.t=0.01795574677593283;
+givenTree.BR048_200009.t=0.04886031769533335;
+givenTree.Node5561.t=0.00941679540309443;
+givenTree.Node5568.t=0.01352114996140952;
+givenTree.Node5566.t=0.006152336995487982;
+givenTree.AP_ARRP029_200406.t=0.07991413062979384;
+givenTree.Brp130_199612.t=0.05748352464386024;
+givenTree.BRRJ910_200208.t=0.1158483223162775;
+givenTree.Node5580.t=0;
+givenTree.Node5593.t=0.009386551958208355;
+givenTree.CCB_1337_200501.t=0.02608542341879871;
+givenTree.CCB_1976_200501.t=0.04412891861986518;
+givenTree.Node5452.t=0;
+givenTree.VC_pat287_199901.t=0.0495006245950071;
+givenTree.Pt4560_200201.t=0.04697318633030852;
+givenTree.CA5992_200002.t=0.07366637323055911;
+givenTree.Node5600.t=0.0006782631642718651;
+givenTree.SLMT_UD552_200501.t=0.07798017851206866;
+givenTree.Node5596.t=0.02160941832190737;
+givenTree.Node5592.t=0.01105199613555496;
+givenTree.Node5538.t=0;
+givenTree.Node5539.t=0.01418790904390529;
+givenTree.DB_SI7124_02_200201.t=0.04549726876948715;
+givenTree.Node5571.t=0.007390203186546073;
+givenTree.CH42_200101.t=0.03228616944722792;
+givenTree.Node5579.t=0.009297860939546234;
+givenTree.DB_SI209_00_200001.t=0.03172236846526015;
+givenTree.Node5588.t=0.006137646388859073;
+givenTree.Node5584.t=0.01829066643669493;
+givenTree.Pt3261_200201.t=0.03761343021043034;
+givenTree.Node5585.t=0.02725333050274444;
+givenTree.CCB_1033_200501.t=0.061621376818745;
+givenTree.N75_200301.t=0.08402470940768234;
+givenTree.Node6101.t=0.01172198113370373;
+givenTree.CCB_3233_200501.t=0;
+givenTree.CCB_3223_200501.t=0;
+givenTree.Pt5017_200201.t=0.04054698072517606;
+givenTree.Node6090.t=0.008254193801346508;
+givenTree.BRRJ872_200104.t=0.06696350073749456;
+givenTree.Node6105.t=0.06323456758071998;
+givenTree.Node6104.t=0.01331836031231066;
+givenTree.Node6100.t=0.003746601386852267;
+givenTree.Node6108.t=0.03685010847894855;
+givenTree.Pt3011_200201.t=0.02311527723308428;
+givenTree.Pt3338_200201.t=0.01151645504101117;
+givenTree.Node6096.t=0.01756347909584598;
+givenTree.Node6066.t=0.01134292015672951;
+givenTree.HG002_199901.t=0.02049683212407045;
+givenTree.Node6074.t=0;
+givenTree.Node6086.t=0.0552877290170712;
+givenTree.Node6084.t=0.02123210424376127;
+givenTree.VHE_Pat11_200101.t=0.07079649459689165;
+givenTree.ED_V84_199901.t=0.07285207890263559;
+givenTree.PCF_Pat125_200101.t=0.0653261757492066;
+givenTree.Node6091.t=0;
+givenTree.MI_Pat31_200101.t=0.06352394905781586;
+givenTree.Node6093.t=0.01461343503499033;
+givenTree.BRRJ924_200208.t=0.08123130064319792;
+givenTree.Node6121.t=0.006089203393702078;
+givenTree.4000580_200401.t=0.05617161462659056;
+givenTree.VT46_200201.t=0.0364721749659444;
+givenTree.AC_38_200001.t=0.07233334397435573;
+givenTree.Node6122.t=0.01472292395427571;
+givenTree.05_132865_200401.t=0.04412219526268215;
+givenTree.Node6120.t=0.007969060746815308;
+givenTree.KDR_pat162_199603.t=0.01041212631181726;
+givenTree.Node6126.t=0.01947073284455686;
+givenTree.Node6127.t=0.01659305778011103;
+givenTree.CH44_200101.t=0.03958777568707999;
+givenTree.HG088_199901.t=0.04414955719884537;
+givenTree.Pt4567_200201.t=0.01573580411171437;
+givenTree.Node6115.t=0.02082870253570552;
+givenTree.Pt4524_200201.t=0.01437985599502001;
+givenTree.BRRJ925_200208.t=0.01623425514193249;
+givenTree.Node6112.t=0.07899560120998089;
+givenTree.Node6111.t=0.01189315911616678;
+givenTree.Node6051.t=0.003708565695532374;
+givenTree.Node5241.t=0;
+givenTree.Node6065.t=0.003420511869167166;
+givenTree.Node6099.t=0.03436582450163362;
+givenTree.Node6089.t=0.004146480487804883;
+givenTree.MI_Pat99_200101.t=0;
+givenTree.Node5242.t=0;
+givenTree.KDR_pat273_199512.t=0.007428211308696806;
+givenTree.Node5892.t=0;
+givenTree.Node6004.t=0.003514211040213344;
+givenTree.Node5980.t=0;
+givenTree.KDR_pat145_199604.t=0.04428272460726682;
+givenTree.4004405_200401.t=0.004857759456455051;
+givenTree.4000498_200401.t=0.01634852307465435;
+givenTree.Node6053.t=0.01097924228963263;
+givenTree.CH45_200101.t=0.06945103310203853;
+givenTree.Node6055.t=0.006291634480191408;
+givenTree.Node6026.t=0.003639307618493823;
+givenTree.CCB_5152_200501.t=0;
+givenTree.CCB_5158_200501.t=0;
+givenTree.Node6042.t=0.02145670742969362;
+givenTree.BRP2153_200208.t=0.02002433465418432;
+givenTree.CCB_999_200501.t=0.02950946064511113;
+givenTree.Node6046.t=0.06013722367916188;
+givenTree.CH102_200101.t=0.05061123904946787;
+givenTree.Node6040.t=0.00391159359342297;
+givenTree.Node6041.t=0.01139456338959473;
+givenTree.CA9972_200208.t=0.06401096647052046;
+givenTree.Node6045.t=0;
+givenTree.Node6060.t=0.07106633929445269;
+givenTree.4000765_200401.t=0.1101756369383503;
+givenTree.CA14178_200201.t=0.0592037051215675;
+givenTree.Node6077.t=0.005576596995289018;
+givenTree.GRSPR90_200301.t=0.06350392798253497;
+givenTree.05_132908_200401.t=0.07167103192542801;
+givenTree.Node6080.t=0.02080705016137077;
+givenTree.CCB_1768_200501.t=0.05340814401079087;
+givenTree.MI_Pat45_200101.t=0.00355542758073801;
+givenTree.Node6075.t=0.009006211919147165;
+givenTree.Node6076.t=0;
+givenTree.CA1136_199709.t=0.02242944761041438;
+givenTree.Node6067.t=0.005345918753422101;
+givenTree.Node6058.t=0.01581995845771548;
+givenTree.Node6052.t=0;
+givenTree.CA4152_199904.t=0.02951030892588909;
+givenTree.CH68_200101.t=0.04775206733727027;
+givenTree.Node6059.t=0.01439389974582599;
+givenTree.HG041_199901.t=0.02049522667585716;
+givenTree.501229e_199401.t=0.0616175434459437;
+givenTree.Node6069.t=0;
+givenTree.Node6070.t=0.02257912397785946;
+givenTree.ED_V79_199901.t=0.02980354545973282;
+givenTree.ED_V52_199901.t=0.03933550447099121;
+givenTree.dn32_200006.t=0.05159926830589574;
+givenTree.CCB_2381_200501.t=0;
+givenTree.Node6199.t=0.06392180318656066;
+givenTree.TY_pat4_200201.t=0.08464923966958249;
+givenTree.CCB_4806_200501.t=0;
+givenTree.Node6188.t=0.01486821797008456;
+givenTree.Node6162.t=0.005629127379806766;
+givenTree.Node6198.t=0.009386865991466643;
+givenTree.Node6143.t=0.008040917121324306;
+givenTree.GRSPR20_200301.t=0.03156946914939438;
+givenTree.Node6161.t=0.004398789185706803;
+givenTree.CH95_200101.t=0.09122667406439591;
+givenTree.Node6197.t=0.02029657373551349;
+givenTree.Node6194.t=0.004900235556468251;
+givenTree.Node6163.t=0.01040428884294498;
+givenTree.BR04RS142_200401.t=0.0427011111225819;
+givenTree.Node6185.t=0.0306283342417911;
+givenTree.CCB_4159_200501.t=0.0578537722121261;
+givenTree.CA16370_200306.t=0.06852392763302713;
+givenTree.BRP2129_200208.t=0.02272977814358623;
+givenTree.CCB_1338_200501.t=0.06557658472054706;
+givenTree.Pt3216_200201.t=0.08590129757721479;
+givenTree.Node6189.t=0.02516329414229847;
+givenTree.Node6190.t=0.01178112579350775;
+givenTree.BRP2154_200208.t=0.05768812373063621;
+givenTree.GRSPR113_200301.t=0.09766193492632656;
+givenTree.Node6216.t=0.01043252034426577;
+givenTree.Node6204.t=0;
+givenTree.Node6220.t=0.02087665386117803;
+givenTree.CCB_2274_200501.t=0.05946560491069575;
+givenTree.CA4052_199903.t=0.047117478003351;
+givenTree.Node6142.t=0.006114044868164185;
+givenTree.Node4574.t=0;
+givenTree.Node1514.t=0;
+givenTree.Node5126.t=0;
+givenTree.Node6118.t=0;
+givenTree.Node5240.t=0;
+givenTree.Node6217.t=0.02036655861691593;
+givenTree.CCB_4262_200501.t=0.01075307441047837;
+givenTree.CCB_5254_200501.t=0.01509665302293293;
+givenTree.Node6206.t=0.01261436567893533;
+givenTree.Node6207.t=0.1070978226182458;
+givenTree.CCB_229_200501.t=0.05904113362930144;
+givenTree.Node6212.t=0.06021147875412654;
+givenTree.CCB_3195_200501.t=0.03938064625617337;
+givenTree.MI_Pat85_200101.t=0.08057225723023059;
+givenTree.Node6205.t=0.008386397339677748;
+givenTree.Pt3149_200201.t=0.07540030163685321;
+givenTree.Node6211.t=0.02926100041702638;
+givenTree.Node6164.t=0.006423444942671629;
+givenTree.CCB_3311_200501.t=0.03141246253147052;
+givenTree.CCB_2311_200501.t=0.03140414628631645;
+givenTree.Node6146.t=0.01528277740811819;
+givenTree.Node6147.t=0.03208691201039461;
+givenTree.CCB_95_200501.t=0.02074310075567736;
+givenTree.Node6152.t=0.02599762522556902;
+givenTree.4002033_200401.t=0.0109646415321769;
+givenTree.4000919_200401.t=0.02584602105521068;
+givenTree.Node6145.t=0.0043486866076627;
+givenTree.CA14373_200204.t=0.08272389300155607;
+givenTree.Node6151.t=0;
+givenTree.VT45_200201.t=0.009371830877918534;
+givenTree.HG096_199901.t=0.04226109730880277;
+givenTree.CH130_200101.t=0.06253189883341637;
+givenTree.Node6132.t=0;
+givenTree.05_132883_200401.t=0.02636814828332156;
+givenTree.Node6134.t=0.01758705725718412;
+givenTree.Node6138.t=0.02005902744062606;
+givenTree.Node6119.t=0.003525763313827364;
+givenTree.VT13pl_200201.t=0.009606946938053133;
+givenTree.Node6131.t=0.0097587402101079;
+givenTree.PCF_Pat14_200101.t=0.03571680321815187;
+givenTree.Node6137.t=0;
+givenTree.Node6157.t=0.06870687524595358;
+givenTree.Node6165.t=0.02040730732344587;
+givenTree.BRP2148_200208.t=0.04396522923300766;
+givenTree.Node6173.t=0.0356470405664906;
+givenTree.Node6174.t=0.02150902370037294;
+givenTree.BRP2035_200104.t=0.04378359129171559;
+givenTree.Pt4020_200201.t=0.1020992842958397;
+givenTree.Node6182.t=0.04103424401821228;
+givenTree.Node6178.t=0;
+givenTree.CCB_4371_200501.t=0.005087318371881414;
+givenTree.Node6179.t=0.02109803239507383;
+givenTree.CCB_3798_200501.t=0.01041137123692473;
+givenTree.Pt5033_200201.t=0.1093851905979347;
+givenTree.dn29_200007.t=0.07944997887631913;
+givenTree.DH012_200112.t=0.07564003130384868;
+givenTree.Node6144.t=0;
+givenTree.PCF_Pat191_200101.t=0.04967302436313688;
+givenTree.Node6156.t=0.01761442349957707;
+givenTree.Node6168.t=0.05504088753409363;
+givenTree.Node6166.t=0.0009234494439119206;
+givenTree.BR04RS109_200401.t=0.1429801901117896;
+givenTree.BR04RS192_200401.t=0.04461776635821284;
+givenTree.CCB_2933_200501.t=0.06976313002214748;
+givenTree.Node6167.t=0.01871533200614687;
+givenTree.Node6027.t=0.0136907923580551;
+givenTree.C54_199506.t=0.03097551344741674;
+givenTree.Node5909.t=0.007869465931653221;
+givenTree.Node5905.t=0.01839024948262416;
+givenTree.4001463_200401.t=0.04201518040488349;
+givenTree.D36_199610.t=0.07207059083484425;
+givenTree.Node5906.t=0.02348453263350388;
+givenTree.Node5895.t=0;
+givenTree.Node5920.t=0.08592805458181518;
+givenTree.Node5918.t=0.0203065798766289;
+givenTree.Cu103_200401.t=0.03731921315435093;
+givenTree.dn79_200011.t=0.07809364891716095;
+givenTree.R77_200401.t=0.046216306226145;
+givenTree.40001_199607.t=0.07844207404625127;
+givenTree.BRCN05_200208.t=0.03868477105460102;
+givenTree.04AR143170_200401.t=0.07150846770838615;
+givenTree.KDR_pat183_199604.t=0.02432840227260159;
+givenTree.Node5623.t=0;
+givenTree.Node5243.t=0.003536444971520917;
+givenTree.Node5899.t=0.008451492142367661;
+givenTree.Node5902.t=0.01002694947023602;
+givenTree.Node5896.t=0.00758237817007353;
+givenTree.Pt3309_200201.t=0.06048692629497893;
+givenTree.Node5897.t=0.007674379831079168;
+givenTree.CCB_1067_200501.t=0.08198006637975307;
+givenTree.dn101_200012.t=0.06558329739220638;
+givenTree.Node5931.t=0;
+givenTree.ED_V61_199901.t=0.03028013300963474;
+givenTree.4000629_200401.t=0.04127335273841894;
+givenTree.PCF_Pat45_200101.t=0.109683929141042;
+givenTree.Node5932.t=0.02371719178399459;
+givenTree.PT_VE7_199301.t=0.01826773596234196;
+givenTree.Node5894.t=0;
+givenTree.JA_4982_198701.t=0.05958071213073197;
+givenTree.Node5912.t=0.004078980662076902;
+givenTree.Node5936.t=0.01452404235438234;
+givenTree.Node5930.t=0.00941387627317658;
+givenTree.PSW_Pat3_199802.t=0.0605636193002264;
+givenTree.CCB_4940_200501.t=0.07985681767581918;
+givenTree.Node5915.t=0.01560596504164479;
+givenTree.Node5916.t=0.05725019014623466;
+givenTree.Node5917.t=0.03145454358255557;
+givenTree.dn63_200010.t=0.04686866063066834;
+givenTree.CA14580_200208.t=0.0555737483544711;
+givenTree.Node5927.t=0.007931612065485658;
+givenTree.Node5913.t=0.005313869157438795;
+givenTree.CA18378_200402.t=0.05974831447296402;
+givenTree.Node5914.t=0;
+givenTree.BRP2042_200104.t=0.05841640558415116;
+givenTree.Node5787.t=0.003540657904952778;
+givenTree.Node5860.t=0;
+givenTree.Node5840.t=0.003959735559410313;
+givenTree.PCF_Pat70_200101.t=0.05029075074107344;
+givenTree.Node5841.t=0.01864400952899849;
+givenTree.CCB_1132_200501.t=0.03744313859418821;
+givenTree.VT79b_200201.t=0.08297228267294943;
+givenTree.BRP2167_200208.t=0.03855661372464121;
+givenTree.YNRL9607_200301.t=0.1271365377110144;
+givenTree.BRP2084_200104.t=0.04958229968481682;
+givenTree.Pt3084_200201.t=0.07420532280033569;
+givenTree.Node5865.t=0.01610302844782242;
+givenTree.Node5857.t=0.02207444440449796;
+givenTree.Node5849.t=0.02018618123077729;
+givenTree.Brp069_199612.t=0.06932611462469869;
+givenTree.BRRJ866_200104.t=0.06893185871595556;
+givenTree.CH6_200101.t=0.1048660060665663;
+givenTree.Node5850.t=0.009881327617116572;
+givenTree.CA16194_200212.t=0.1027831025215844;
+givenTree.4004345_200401.t=0.07909164952975914;
+givenTree.CA4511_199906.t=0.04891799001752695;
+givenTree.Node5842.t=0;
+givenTree.Node5854.t=0.006623105737379138;
+givenTree.Node5848.t=0.0205245887654484;
+givenTree.Node5873.t=0.008258655717907052;
+givenTree.CA4314_199905.t=0;
+givenTree.Node5886.t=0.04780276666115754;
+givenTree.4001464_200401.t=0;
+givenTree.Node5868.t=0.01694110209013547;
+givenTree.Node5864.t=0.00759964129888096;
+givenTree.CCB_3836_200501.t=0.03550141023814427;
+givenTree.Node5863.t=0.003352795614701652;
+givenTree.Node5839.t=0.00368653866277991;
+givenTree.Node5885.t=0.009351498852249748;
+givenTree.EC31_199407.t=0.05179987972540435;
+givenTree.Node5889.t=0.006080810598370294;
+givenTree.AP_ARRP056_200406.t=0.07604802942463182;
+givenTree.Node5876.t=0.06467402535031254;
+givenTree.Node5870.t=0.02711468948346258;
+givenTree.BRP2156_200208.t=0.06961333087538411;
+givenTree.Node5871.t=0;
+givenTree.BRP2178_200208.t=0.07054910159351309;
+givenTree.BRP2086_200104.t=0.08141095988336371;
+givenTree.Node5879.t=0.007402942079227234;
+givenTree.Node5869.t=0.08788377996337517;
+givenTree.Node5881.t=0.01660558445440629;
+givenTree.BRP2155_200208.t=0.05035155179660503;
+givenTree.BRP2161_200208.t=0.02996039558442475;
+givenTree.PCF_Pat35_200101.t=0.04216013998313652;
+givenTree.WJ_pat7101_200201.t=0.09500300381666167;
+givenTree.CCB_2280_200501.t=0.05699120106508923;
+givenTree.Node6008.t=0.01421183694023384;
+givenTree.Node5981.t=0.02248127620987498;
+givenTree.Node6001.t=0.01997379303772242;
+givenTree.Node5991.t=0;
+givenTree.260Pt17_199511.t=0.06406875875061173;
+givenTree.Node6013.t=0.01366973029096009;
+givenTree.CCB_1799_200501.t=0.03432205406380913;
+givenTree.PCF_Pat142_200101.t=0.05302449922934119;
+givenTree.Node6007.t=0.00456828627324511;
+givenTree.VT90E_200201.t=0.07884018059868368;
+givenTree.Pt1782_200201.t=0.03001887445056351;
+givenTree.Pt3598_200201.t=0.03265258399909469;
+givenTree.Node5995.t=0.04188184656781243;
+givenTree.Pt3816_200201.t=0.039472864557452;
+givenTree.Node5982.t=0.003568910776731918;
+givenTree.4000388_200401.t=0.05110825709596651;
+givenTree.Node5993.t=0.01513981194616408;
+givenTree.Node5992.t=0.004693024817992745;
+givenTree.ED_V77_199901.t=0.03654111140766915;
+givenTree.Node5998.t=0.0161957889152964;
+givenTree.BRP2090_200104.t=0.04614223330632688;
+givenTree.JLB_Pat27_200006.t=0.06281120929994263;
+givenTree.Node6012.t=0.00997279192083176;
+givenTree.Pt6030_200201.t=0.01427150185640714;
+givenTree.Pt6171_200201.t=0.01782016938502262;
+givenTree.41010_199607.t=0.1022608314258864;
+givenTree.Pt4234_200201.t=0.05162302504258801;
+givenTree.Node6028.t=0.003994215436588297;
+givenTree.Node6035.t=0.01045067119641942;
+givenTree.Pt5611_200201.t=0.007493680351036879;
+givenTree.Node6031.t=0.02304966092895497;
+givenTree.Node6032.t=0.006740058316986687;
+givenTree.Pt6162_200201.t=0.03244010656866372;
+givenTree.Node6034.t=0.02122111193405771;
+givenTree.SM_01YE397_200101.t=0.06472415843014553;
+givenTree.Node6019.t=0.02486968592880191;
+givenTree.CCB_4287_200501.t=0.04197166401602718;
+givenTree.05_132889_200401.t=0.05242166188303676;
+givenTree.Node6006.t=0.007369609524901019;
+givenTree.4003758_200401.t=0.08852964786628549;
+givenTree.Node6018.t=0;
+givenTree.Node6017.t=0;
+givenTree.Node6005.t=0.01266608326150968;
+givenTree.Node6023.t=0.01672016454841688;
+givenTree.ARG24_199701.t=0.06053994459208178;
+givenTree.EC34_199306.t=0.04309201618290034;
+givenTree.Node5988.t=0.01312371094890023;
+givenTree.PCF_Pat128_200101.t=0.07536380990616899;
+givenTree.Node5960.t=0.02544429203248297;
+givenTree.BRCN03_200208.t=0.1142169376761854;
+givenTree.PCF_Pat133_200101.t=0.02322941596383328;
+givenTree.Node5957.t=0.02874461549223003;
+givenTree.Node5956.t=0.004928915361427627;
+givenTree.Node5964.t=0.07598902813595612;
+givenTree.4000499_200401.t=0.03076608968913859;
+givenTree.Pt1186_200201.t=0;
+givenTree.Node5942.t=0.003046756805380629;
+givenTree.Pt1218_200201.t=0.01915298412589477;
+givenTree.4004223_200401.t=0.0649457383914825;
+givenTree.DB_SI5191_04_200401.t=0.02279235599539891;
+givenTree.Node5951.t=0.01356959452241881;
+givenTree.4000359_200401.t=0;
+givenTree.Node5944.t=0.01589132371330317;
+givenTree.4003833_200401.t=0.005165855951909235;
+givenTree.Node5949.t=0.09251022100554614;
+givenTree.Node5947.t=0;
+givenTree.Node5943.t=0;
+givenTree.CA16238_200301.t=0.02135772393556029;
+givenTree.CA16218_200304.t=0.04189698092806009;
+givenTree.Node5948.t=0.007467554724153343;
+givenTree.Node5963.t=0;
+givenTree.Node5893.t=0;
+givenTree.VT11_200201.t=0.08833403248796204;
+givenTree.Node5939.t=0;
+givenTree.Node5977.t=0.01222712346007228;
+givenTree.Node5971.t=0.005300860792986485;
+givenTree.Pt1241_200201.t=0.06159177726020625;
+givenTree.CCB_1173_200501.t=0.06294728272463404;
+givenTree.98USHVTN1925c1_199801.t=0.04752254288940407;
+givenTree.Node5983.t=0.01261202231992472;
+givenTree.Node5984.t=0.004074755787448135;
+givenTree.dn41_200003.t=0.05128781143236122;
+givenTree.CA6393_200003.t=0.0605141082016341;
+givenTree.Node5968.t=0.01157144323814882;
+givenTree.Node5940.t=0;
+givenTree.CA14379_200204.t=0.02781837404811001;
+givenTree.Node5941.t=0.006389730758191935;
+givenTree.ED_V55_199901.t=0.03915884526232123;
+givenTree.BRP2088_200104.t=0.04408910251502848;
+givenTree.Node5972.t=0.0106970557842356;
+givenTree.CCB_3862_200501.t=0.04588542106110966;
+givenTree.Node5974.t=0.04286742735654497;
+givenTree.Pt3196_200201.t=0.004104747867847313;
+givenTree.Pt3183_200201.t=0.003283846850956824;
+givenTree.Node5457.t=0.01249282748572917;
+givenTree.Node4937.t=0.05569930725317222;
+givenTree.Node4935.t=0.006477394277338544;
+givenTree.VT34_200201.t=0.04207636373826396;
+givenTree.Pt3526_200201.t=0;
+givenTree.KDR_pat292_199601.t=0.03173128962047472;
+givenTree.Pt3608_200201.t=0.01782269105827325;
+givenTree.Pt5157_200201.t=0.02915469684536734;
+givenTree.VT56_200201.t=0.0210394224699112;
+givenTree.JLB_Pat5_200006.t=0.04727463507289124;
+givenTree.Node4941.t=0.01137260715267697;
+givenTree.Pt5798_200201.t=0.03926977804768624;
+givenTree.Node4943.t=0.04025806602886758;
+givenTree.Node4874.t=0.007500147166551003;
+givenTree.CCB_4526_200501.t=0.07382563967247767;
+givenTree.AC_16_200001.t=0.05813831914813213;
+givenTree.HG049_199901.t=0.03559752403487428;
+givenTree.Node4907.t=0.005336485513970477;
+givenTree.Node4875.t=0;
+givenTree.Node4925.t=0.008808374219179372;
+givenTree.Node4928.t=0.01283215197033552;
+givenTree.Node4922.t=0.005665426707098765;
+givenTree.CH85_200101.t=0.05936654776273799;
+givenTree.Node4923.t=0;
+givenTree.BRRJ917_200208.t=0.06166272244061965;
+givenTree.Node4947.t=0;
+givenTree.HG066_199901.t=0.04237368621544146;
+givenTree.SM_02YE509_200201.t=0.05356404254698658;
+givenTree.Node4958.t=0.008739031845108224;
+givenTree.Node4959.t=0.01386959588053764;
+givenTree.SLMT_IVDU112_200501.t=0.03722572957983469;
+givenTree.Node4964.t=0.02687363701187424;
+givenTree.Node4963.t=0.001221230042349667;
+givenTree.Node4957.t=0.01056631320900504;
+givenTree.Node4967.t=0;
+givenTree.CCB_3821_200501.t=0.03663540563669641;
+givenTree.Pt4076_200201.t=0.06305684793073105;
+givenTree.PCF_Pat136_200101.t=0.06978982813148675;
+givenTree.Node4934.t=0.002137735871167172;
+givenTree.VT26_200201.t=0.06159240569275361;
+givenTree.Node4940.t=0;
+givenTree.CCB_4747_200501.t=0.03349019002454696;
+givenTree.Node4946.t=0.005863248576771894;
+givenTree.PCF_Pat192_200101.t=0.06218732024425603;
+givenTree.Node4933.t=0.0107700595589775;
+givenTree.N38_200301.t=0.06750730297892614;
+givenTree.Node4951.t=0.01382448482482069;
+givenTree.Node4952.t=0.01136007042237692;
+givenTree.SLMT_IVDU128_200501.t=0.03579528590883024;
+givenTree.Node4915.t=0.01867987867772609;
+givenTree.Node4885.t=0.01471982983860125;
+givenTree.4004184_200401.t=0;
+givenTree.4002564_200401.t=0;
+givenTree.Node4887.t=0.0415822178209307;
+givenTree.GRSPR100_200301.t=0.02780037102551154;
+givenTree.GRSPR147_200301.t=0.03188979187923167;
+givenTree.Node4896.t=0;
+givenTree.Node4894.t=0.005095226555769616;
+givenTree.4001693_200401.t=0.005000254644837757;
+givenTree.4000766_200401.t=0.01010700035617725;
+givenTree.4000583_200401.t=0;
+givenTree.Node4895.t=0;
+givenTree.VHE_Pat61_200101.t=0.06143021800531784;
+givenTree.Node4578.t=0;
+givenTree.KDR_pat73_199607.t=0.02102610961358321;
+givenTree.Node4832.t=0.003551267477714022;
+givenTree.Node4866.t=0.01555100139961193;
+givenTree.Node4862.t=0.00780289154696353;
+givenTree.CA11626_200012.t=0.03561043514344125;
+givenTree.Node4881.t=0.009236564752756516;
+givenTree.Node4877.t=0.007702508370420983;
+givenTree.CA4298_199905.t=0.049984115978311;
+givenTree.Node4878.t=0.008524913196023975;
+givenTree.KDR_pat208_199601.t=0.03130816734490765;
+givenTree.Node4893.t=0.05551539678496627;
+givenTree.Node4912.t=0;
+givenTree.Node4908.t=0.007728523997927387;
+givenTree.Pt3015_200201.t=0.0482295548723637;
+givenTree.Node4909.t=0.01675502734919173;
+givenTree.CCB_492_200501.t=0.04149183656798787;
+givenTree.PSW_Pat28_200101.t=0.05455250075798318;
+givenTree.EC17_199407.t=0.04634003506969862;
+givenTree.Node4919.t=0.02386729044402135;
+givenTree.BRP2073_200104.t=0.1405229610234292;
+givenTree.PCF_Pat172_200101.t=0.07059963792382037;
+givenTree.Node4916.t=0;
+givenTree.PCF_Pat187_200101.t=0.02240251351253517;
+givenTree.Node4892.t=0.01649038815375256;
+givenTree.CA6840_200006.t=0.01195851099991521;
+givenTree.Node4902.t=0.005804792669140974;
+givenTree.CA3948_199812.t=0.03262664144338459;
+givenTree.CA3900_199902.t=0.02564905319436294;
+givenTree.Node4891.t=0;
+givenTree.Node4876.t=0.01238938334127591;
+givenTree.HG081_199901.t=0.05566589514671235;
+givenTree.Node4884.t=0.006810663333188911;
+givenTree.EC29_199407.t=0.01848123038469238;
+givenTree.Node4890.t=0.04432062892014602;
+givenTree.CA7851_200009.t=0.02872538948929083;
+givenTree.Node5025.t=0.01203009350251764;
+givenTree.CCB_1839_200501.t=0.0450442213313066;
+givenTree.Node5024.t=0;
+givenTree.Node5031.t=0.01223957519707282;
+givenTree.CCB_1238_200501.t=0.05966709918891586;
+givenTree.02BR008_200401.t=0.04986230578422784;
+givenTree.VT27_200201.t=0.02876604176444323;
+givenTree.SLMT_IVDU137_200501.t=0.01052520488850067;
+givenTree.N77_200301.t=0.03999460862046329;
+givenTree.Node5023.t=0.01386800647029749;
+givenTree.BK132_200111.t=0.03994923479247114;
+givenTree.Node5035.t=0;
+givenTree.Node5026.t=0.01204565446894366;
+givenTree.Node5002.t=0.00423669002103368;
+givenTree.VC_pat273_199901.t=0.02560828266653951;
+givenTree.Node5016.t=0.01995367576674952;
+givenTree.Node5017.t=0.02313957042887281;
+givenTree.EC4_199407.t=0.05520918258598747;
+givenTree.Node5001.t=0;
+givenTree.Node5027.t=0.01619221386151348;
+givenTree.BRRJ896_200208.t=0.04166715593233691;
+givenTree.AP_ARRP048_200406.t=0.07386356891127981;
+givenTree.Node4989.t=0;
+givenTree.N44_200301.t=0.07884067731751092;
+givenTree.Node5040.t=0.01586509932054073;
+givenTree.Pt3212_200201.t=0.03247865765624889;
+givenTree.Pt3555_200201.t=0.01388025212523383;
+givenTree.Pt3207_200201.t=0.007625010140680308;
+givenTree.Node4576.t=0.003535625039086367;
+givenTree.N04_200301.t=0.02859443091921493;
+givenTree.Node5057.t=0.004190813439218779;
+givenTree.Pt3691_200201.t=0.03965683600430051;
+givenTree.Node5061.t=0.01518280761203779;
+givenTree.VT75_200201.t=0.06249029070156578;
+givenTree.Node5055.t=0.06171640837621954;
+givenTree.Node5053.t=0.01687750696431013;
+givenTree.Node4988.t=0;
+givenTree.Node5045.t=0.0590757460492019;
+givenTree.Node5043.t=0.004857575166809335;
+givenTree.CA6435_200003.t=0.003457631877584609;
+givenTree.SLMT_IVDU146_200501.t=0.0218550371458217;
+givenTree.CA4727_199907.t=0.01623687097996244;
+givenTree.Node5039.t=0.01527580375452064;
+givenTree.Node5038.t=0.01246298665861322;
+givenTree.Node5022.t=0;
+givenTree.Node5048.t=0.01186108286020273;
+givenTree.BR04RS177_200401.t=0.03424767699766108;
+givenTree.05_132899_200401.t=0.07465033132629899;
+givenTree.BRP2159_200208.t=0;
+givenTree.4000363_200401.t=0.0391276960808709;
+givenTree.CA8332_200101.t=0.04861830793806604;
+givenTree.Node4974.t=0.008896587505888337;
+givenTree.CA8408_200103.t=0.06013308303646794;
+givenTree.Node4982.t=0.00989784546220125;
+givenTree.Node4985.t=0.01011997800231676;
+givenTree.Node4577.t=0;
+givenTree.KDR_pat230_199604.t=0;
+givenTree.Node4873.t=0;
+givenTree.Node4973.t=0.008053225772883744;
+givenTree.Node4931.t=0;
+givenTree.260Pt30_199511.t=0.03197041985162891;
+givenTree.Node4932.t=0;
+givenTree.VT22_200201.t=0.01447509396821588;
+givenTree.Node4956.t=0.008862569830387688;
+givenTree.PCF_Pat41_200101.t=0.03479741638876479;
+givenTree.Node4970.t=0.006322181775107784;
+givenTree.4004131_200401.t=0.06037459904011216;
+givenTree.Node4977.t=0.0116737213348435;
+givenTree.Node4975.t=0.009207733178673929;
+givenTree.CH56_200101.t=0.05549051831563142;
+givenTree.CA16401_200306.t=0.01663631252110592;
+givenTree.Node4978.t=0.05020726985812522;
+givenTree.CA6577_200005.t=0.008252224336441958;
+givenTree.Node5005.t=0.01575391449896206;
+givenTree.BRSP381_200208.t=0.04371548102143905;
+givenTree.Node5009.t=0.01622288536934271;
+givenTree.CCB_4346_200501.t=0.07415718895563182;
+givenTree.BrRJ036_200101.t=0.03252747838994259;
+givenTree.BREPM278_199901.t=0.04043317638336377;
+givenTree.Node5003.t=0.01180999962400326;
+givenTree.BRP2175_200208.t=0;
+givenTree.SLMT_IVDU105_200501.t=0.02457678766331341;
+givenTree.Node5012.t=0.01321482821879536;
+givenTree.Node5004.t=0;
+givenTree.Node5006.t=0.03367062549365421;
+givenTree.143P20_199104.t=0.03972238583529873;
+givenTree.Node4991.t=0;
+givenTree.Node4992.t=0.006905422987573777;
+givenTree.Node4993.t=0.04237473646430419;
+givenTree.IP_17_199701.t=0.02627237612270438;
+givenTree.BRP2165_200208.t=0.01129088252308951;
+givenTree.VT16pl_200201.t=0.009301754264994241;
+givenTree.VT49_200201.t=0.02398327537670042;
+givenTree.Node4990.t=0.01061152170138215;
+givenTree.PCF_Pat121_200101.t=0.03603010330975138;
+givenTree.Node4998.t=0;
+givenTree.Node4868.t=0.01809364520775519;
+givenTree.Node4739.t=0.02595102729742414;
+givenTree.Node4723.t=0.004273527597657096;
+givenTree.Node4581.t=0;
+givenTree.Node4741.t=0.01281621877753615;
+givenTree.Pt5198_200201.t=0.02881319759893619;
+givenTree.Pt5256_200201.t=0.01806601235466324;
+givenTree.N09_200301.t=0.03414382273638043;
+givenTree.Pt4559_200201.t=0.03588021780745569;
+givenTree.Node4748.t=0.02062470475716507;
+givenTree.Node4749.t=0;
+givenTree.VT83_200201.t=0.05849119392847693;
+givenTree.Pt3508_200201.t=0.03560188760673303;
+givenTree.CCB_3225_200501.t=0.0261651910886658;
+givenTree.SLMT_UD335_200501.t=0.04734960509996799;
+givenTree.BRRJ821_200104.t=0.06388343261107714;
+givenTree.Node4725.t=0.02409574393670471;
+givenTree.Node4726.t=0.01463752749982818;
+givenTree.Pt5073_200201.t=0.01333875055664534;
+givenTree.Pt5077_200201.t=0.010634754522764;
+givenTree.Node4732.t=0;
+givenTree.Node4724.t=0.003622928638254458;
+givenTree.Node4734.t=0.004822107694414805;
+givenTree.Pt5021_200201.t=0.02033821922651644;
+givenTree.Node4736.t=0.03920532099178207;
+givenTree.Node4746.t=0.004884624348666263;
+givenTree.CCB_3650_200501.t=0.023976207038527;
+givenTree.Node4770.t=0.05720962757770176;
+givenTree.CCB_4480_200501.t=0.007224855940527119;
+givenTree.EC5_199407.t=0.06690320844777875;
+givenTree.Node4766.t=0.02784481608733452;
+givenTree.PCF_Pat38_200101.t=0.04026966474510727;
+givenTree.Node4745.t=0;
+givenTree.JA_5043_198701.t=0.07946965025091582;
+givenTree.Node4753.t=0.01070532267021431;
+givenTree.Node4769.t=0;
+givenTree.Node4765.t=0.01156942167845882;
+givenTree.dn98_200002.t=0.06040802696576191;
+givenTree.N58_200301.t=0.09373677533362647;
+givenTree.N65_200301.t=0.05931475621278118;
+givenTree.Node4755.t=0.0163321861467313;
+givenTree.HG045_199901.t=0.07917495162290411;
+givenTree.BB_94US_33931N_199401.t=0.06395591466500156;
+givenTree.98USHVTN941c1_199801.t=0.1004000674961476;
+givenTree.Node4758.t=0;
+givenTree.Node4754.t=0;
+givenTree.CCB_3476_200501.t=0.04718832670317569;
+givenTree.Node4761.t=0.005178417939895577;
+givenTree.Node4759.t=0.01295983550423097;
+givenTree.Node4728.t=0.04463967604239716;
+givenTree.SLMT_UD598_200501.t=0.06391429261264762;
+givenTree.Pt5639_200201.t=0.05254573942503975;
+givenTree.Node4692.t=0.01477081939658246;
+givenTree.Node4693.t=0.03057433453695123;
+givenTree.CCB_1903_200501.t=0.07818750672562799;
+givenTree.Node4697.t=0.01342653774698984;
+givenTree.Node4702.t=0.003156034882334419;
+givenTree.ARG14_199701.t=0.04597394695937734;
+givenTree.Pt5015_200201.t=0.02297577353383299;
+givenTree.Node4691.t=0.009829110364419746;
+givenTree.n17_200301.t=0.04003839123454067;
+givenTree.AP_ARRP018_200406.t=0.04086500989048861;
+givenTree.Pt5170_200201.t=0.03523256081300876;
+givenTree.Node4685.t=0.01128867192205625;
+givenTree.Node4686.t=0.01034261810079553;
+givenTree.Pt3614_200201.t=0.0170719013095119;
+givenTree.Pt3504_200201.t=0.01747903557688968;
+givenTree.Node4683.t=0.009496919230031686;
+givenTree.Node4583.t=0;
+givenTree.N46_200301.t=0.09169911655360714;
+givenTree.Node4647.t=0;
+givenTree.Node4675.t=0.01375795395963422;
+givenTree.Node4663.t=0.004111633345290538;
+givenTree.Pt3013_200201.t=0.03224935324010863;
+givenTree.Node4720.t=0.03240687646695792;
+givenTree.Node4708.t=0;
+givenTree.Pt4060_200201.t=0;
+givenTree.Node4709.t=0;
+givenTree.Pt5018_200201.t=0;
+givenTree.Node4700.t=0;
+givenTree.Pt5113_200201.t=0.003593403788387492;
+givenTree.Pt5023_200201.t=0.003492164040236444;
+givenTree.n12_200301.t=0.1248105684941874;
+givenTree.Node4690.t=0.00354349327387358;
+givenTree.Node4582.t=0.0176562928337796;
+givenTree.Node4713.t=0.00671101087965079;
+givenTree.Pt4586_200201.t=0.0555698576444844;
+givenTree.Node4710.t=0.01349412535705816;
+givenTree.BRP2079_200104.t=0.05200877591004253;
+givenTree.Node4705.t=0.02449256968487444;
+givenTree.Node4701.t=0.01466757255683086;
+givenTree.BRSP368_200208.t=0.0505647521390731;
+givenTree.Pt6128_200201.t=0.05744229550337543;
+givenTree.Node4715.t=0.02721002781938034;
+givenTree.Node4716.t=0.03561790508139215;
+givenTree.Pt3053_200201.t=0;
+givenTree.Pt3110_200201.t=0;
+givenTree.AP_GR48_200006.t=0.1024648930199626;
+givenTree.Node4840.t=0;
+givenTree.Node4838.t=0.03966727067023739;
+givenTree.Node4836.t=0.01142893806756673;
+givenTree.MI_Pat72_200101.t=0;
+givenTree.MI_Pat11_200101.t=0;
+givenTree.MI_Pat86_200101.t=0.02760603723766436;
+givenTree.143P14_199101.t=0.0198305603018418;
+givenTree.Node4843.t=0.005011032239192234;
+givenTree.Node4835.t=0;
+givenTree.Node4845.t=0.01217515387281147;
+givenTree.CCB_3853_200501.t=0.04176727895751493;
+givenTree.PCM013_200101.t=0.08094238611644453;
+givenTree.HG031_199901.t=0.06226233148788162;
+givenTree.BRP2062_200104.t=0.09685604941827496;
+givenTree.05_132901_200401.t=0.08924976649243606;
+givenTree.Node4824.t=0.01609375784133003;
+givenTree.BR04RS139_200401.t=0.04289437126902126;
+givenTree.DMG48_199809.t=0.05952294829777842;
+givenTree.Node4828.t=0.01816498494072964;
+givenTree.Node4803.t=0.005268146515559138;
+givenTree.Node4579.t=0;
+givenTree.Node4823.t=0.01836790960183212;
+givenTree.CCB_5198_200501.t=0.04674401368684753;
+givenTree.Node4827.t=0;
+givenTree.BRP2400_200104.t=0.04604390361866744;
+givenTree.VT61_200201.t=0.02019265306925577;
+givenTree.CA1609_199808.t=0.02071912088339471;
+givenTree.Node4833.t=0;
+givenTree.Node4859.t=0.009269191295847613;
+givenTree.Node4855.t=0.01851200305026297;
+givenTree.Node4863.t=0;
+givenTree.JLB_Pat70_200006.t=0.004054875021236926;
+givenTree.Node4870.t=0.09287317909662589;
+givenTree.JLB_Pat66_200006.t=0.00326555605860091;
+givenTree.SLMT_UD398_200501.t=0.03029290586951894;
+givenTree.BRBS465_200104.t=0.04433622710045405;
+givenTree.PCF_Pat83_200101.t=0.03334964558481045;
+givenTree.Node4849.t=0;
+givenTree.CCB_4982_200501.t=0.0266039221676041;
+givenTree.CCB_3273_200501.t=0.005920153195875347;
+givenTree.05_132885_200401.t=0.1254916352345482;
+givenTree.Node4850.t=0.02355045594973532;
+givenTree.Node4848.t=0.02382508474062056;
+givenTree.Node4856.t=0.01164043300372096;
+givenTree.sm5_199901.t=0.006393121176960288;
+givenTree.CA6400_200003.t=0.04449690952461686;
+givenTree.Node4834.t=0.003491919836823354;
+givenTree.IP_6_199701.t=0.04996642888167541;
+givenTree.Node4804.t=0.007378664161467399;
+givenTree.Pt4079_200201.t=0;
+givenTree.Node4794.t=0;
+givenTree.Pt4075_200201.t=0;
+givenTree.Node4776.t=0;
+givenTree.N63_200301.t=0.08655919921144904;
+givenTree.Pt4074_200201.t=0;
+givenTree.ED_V92_199901.t=0.02735412815253244;
+givenTree.BRRJ913_200208.t=0.07466668618774652;
+givenTree.Node4775.t=0.01012576742133224;
+givenTree.Node4793.t=0.05923613578032334;
+givenTree.Node4791.t=0.02395552733161828;
+givenTree.Node4778.t=0.03030128155879248;
+givenTree.Pt3694_200201.t=0;
+givenTree.Pt3736_200201.t=0.003563033703059181;
+givenTree.Pt3632_200201.t=0.006075630148114638;
+givenTree.Pt3141_200201.t=0.02044866873900614;
+givenTree.Node4779.t=0.01230961164856863;
+givenTree.Node4786.t=0.004591218460739075;
+givenTree.Pt3693_200201.t=0.01405532453764071;
+givenTree.Node4782.t=0.02272638163156806;
+givenTree.Node4783.t=0.00559925325582186;
+givenTree.Pt3737_200201.t=0.02026598029871448;
+givenTree.Node4785.t=0;
+givenTree.1280_200401.t=0.09549548020590394;
+givenTree.Node4816.t=0.007751251317551549;
+givenTree.4004221_200401.t=0.07189151247210739;
+givenTree.PS2008_200501.t=0.06177150125388217;
+givenTree.VT35_200201.t=0.05641824573792624;
+givenTree.SLMT_UD609_200501.t=0.04621601033262239;
+givenTree.Node4815.t=0.007854850147353752;
+givenTree.CCB_3669_200501.t=0.04432297679265543;
+givenTree.Node4820.t=0.00906718320603319;
+givenTree.ED_V5_199901.t=0.05511236672000644;
+givenTree.Node4813.t=0.005106009498677158;
+givenTree.Node4805.t=0.007164305861264075;
+givenTree.Node4806.t=0.00933711276655708;
+givenTree.Node4744.t=0;
+givenTree.Node4580.t=0.01054718719827633;
+givenTree.Node4774.t=0.007097978874773844;
+givenTree.Node4800.t=0.01848405104017577;
+givenTree.Node4798.t=0.0154070413946332;
+givenTree.KDR_pat15_199602.t=0.04019758374061558;
+givenTree.PCF_Pat81_200101.t=0.04443988378649696;
+givenTree.Node4810.t=0.02956739034903452;
+givenTree.CCB_4701_200501.t=0.08272853230126338;
+givenTree.CH107_200101.t=0.04345164963612586;
+givenTree.Node4807.t=0.005196263081647787;
+givenTree.4004044_200401.t=0.05638233876349754;
+givenTree.CCB_5219_200501.t=0.07887837931830458;
+givenTree.Node5325.t=0;
+givenTree.Node5321.t=0.02905519537526404;
+givenTree.Node5326.t=0.007356468058534;
+givenTree.BRCN28_200208.t=0.08850495906938467;
+givenTree.05_132867_200401.t=0.07418164547704641;
+givenTree.Node5247.t=0;
+givenTree.SLMT_UD284_200501.t=0.07269640556912724;
+givenTree.05_132920_200401.t=0.06443932277972933;
+givenTree.Node5332.t=0.005769543129738259;
+givenTree.n16_200301.t=0.09345342711744277;
+givenTree.CA16381_200306.t=0.08978537447029153;
+givenTree.Node5322.t=0.02355364565442465;
+givenTree.BRP2071_200104.t=0.1378800534173107;
+givenTree.Pt4043_200201.t=0.09066673013349805;
+givenTree.Node5271.t=0;
+givenTree.Pt3004_200201.t=0.02419905137910394;
+givenTree.Node5273.t=0.0257604536204169;
+givenTree.Node5318.t=0.01970530131480081;
+givenTree.ED_V91_199901.t=0.04583830091293812;
+givenTree.CA16245_200303.t=0.04243598511073754;
+givenTree.Node5248.t=0.004540129118552424;
+givenTree.Node5270.t=0.03138926623803862;
+givenTree.Node5266.t=0.008469159080545699;
+givenTree.Node5335.t=0.01049089917245969;
+givenTree.GRSPR10_200301.t=0;
+givenTree.Node5354.t=0.02041336822654937;
+givenTree.GRSPR79_200301.t=0.005203555440046726;
+givenTree.Node5330.t=0.004123852768029926;
+givenTree.Node5246.t=0.007524599733658251;
+givenTree.MI_Pat32_200101.t=0.01345949564546909;
+givenTree.DB_SI5336_02_200201.t=0.007148110662847339;
+givenTree.DB_SI3458_02_200201.t=0;
+givenTree.DB_SI9192_04_200401.t=0.004975586849920157;
+givenTree.Node5353.t=0.03836461056095804;
+givenTree.CCB_3867_200501.t=0.07580517324199307;
+givenTree.Node5338.t=0.006885765693009914;
+givenTree.OMVB_RT_15_200301.t=0.04653686098849196;
+givenTree.OMVB_RT_47_200301.t=0.008744234965264459;
+givenTree.CCB_1840_200501.t=0.07192446800089407;
+givenTree.Node5331.t=0.01105323380922084;
+givenTree.ARG23_199701.t=0.04000257994767912;
+givenTree.Node5343.t=0.01852532612281972;
+givenTree.CH82_200101.t=0.02926281755023074;
+givenTree.Node5346.t=0.028958764256224;
+givenTree.CH117_200101.t=0.01166776886101334;
+givenTree.Node5341.t=0.04053573603661725;
+givenTree.Node5339.t=0;
+givenTree.Node5274.t=0.003383810772678441;
+givenTree.Pt1468_200201.t=0.007146566250900765;
+givenTree.Pt4580_200201.t=0.01793073034659425;
+givenTree.Node5288.t=0;
+givenTree.Node5289.t=0.003549282450627895;
+givenTree.Pt1281_200201.t=0;
+givenTree.Node5295.t=0;
+givenTree.Pt1364_200201.t=0.02095557233069835;
+givenTree.Pt1219_200201.t=0;
+givenTree.Node5286.t=0;
+givenTree.Node5287.t=0.003544882193266982;
+givenTree.Pt1458_200201.t=0.007176114420622251;
+givenTree.Node5291.t=0.01427262065769028;
+givenTree.Node5267.t=0.006141550610514752;
+givenTree.N40_200301.t=0.05214097611412163;
+givenTree.PCF_Pat11_200101.t=0.04154347070508956;
+givenTree.Node5249.t=0.006669785372939006;
+givenTree.KDR_pat249_199603.t=0.04191319785658798;
+givenTree.Pt5034_200201.t=0.01782609068401607;
+givenTree.Pt1190_200201.t=0;
+givenTree.Pt1220_200201.t=0;
+givenTree.Pt1563_200201.t=0.003577449658365681;
+givenTree.Pt3219_200201.t=0.01131556426069085;
+givenTree.Node5276.t=0.05426379793127211;
+givenTree.Pt1222_200201.t=0;
+givenTree.Pt1457_200201.t=0.03582106956710372;
+givenTree.Node5281.t=0;
+givenTree.Node5282.t=0.003543037452369507;
+givenTree.Pt1255_200201.t=0.007136939892520783;
+givenTree.Node5310.t=0.01070506957846691;
+givenTree.Pt1080_200201.t=0.02139427850484389;
+givenTree.Node5275.t=0.009024556509743821;
+givenTree.Pt1308_200201.t=0.04071920702617517;
+givenTree.Node5279.t=0;
+givenTree.Node5280.t=0.004338012354488654;
+givenTree.Pt3715_200201.t=0.04981064986791139;
+givenTree.Pt1254_200201.t=0;
+givenTree.Node5299.t=0.003538269008668706;
+givenTree.Node5285.t=0.003546319697972289;
+givenTree.Pt1205_200201.t=0.01792023712633752;
+givenTree.Node5302.t=0.0143030154505006;
+givenTree.Node5300.t=0.004165090927149513;
+givenTree.Pt1110_200201.t=0.01791415769688851;
+givenTree.Node5307.t=0.008291284893464059;
+givenTree.Node5283.t=0;
+givenTree.Pt1280_200201.t=0.01678953207725811;
+givenTree.Node5284.t=0.003549221940259266;
+givenTree.Pt1298_200201.t=0.01440582665446036;
+givenTree.Node5362.t=0.01013898654239344;
+givenTree.Node5417.t=0.007721406014031293;
+givenTree.Node5411.t=0.01055330756307386;
+givenTree.Node5405.t=0.006538511321976162;
+givenTree.Node5423.t=0.005154586892932017;
+givenTree.Node5424.t=0.06074972065940398;
+givenTree.Pt7550_200201.t=0.03349953952793117;
+givenTree.4000357_200401.t=0.06816324213153656;
+givenTree.Node5429.t=0.005112402284094678;
+givenTree.BR04RS115_200401.t=0.0801584062500065;
+givenTree.CCB_4246_200501.t=0.01010454298907584;
+givenTree.EC102_199012.t=0.06277066617373292;
+givenTree.Node5430.t=0.02249104524878368;
+givenTree.CCB_5298_200501.t=0.011191205312734;
+givenTree.Node5414.t=0.01589130699388561;
+givenTree.Node5412.t=0.02141225455515939;
+givenTree.Pt7670_200201.t=0.005908229793386221;
+givenTree.VT89b_200201.t=0.0571159411225962;
+givenTree.Pt7639_200201.t=0.02717296597077608;
+givenTree.BR04RS146_200401.t=0.04070068613552595;
+givenTree.Node5418.t=0.01347833987868382;
+givenTree.CCB_2590_200501.t=0;
+givenTree.Node5420.t=0.02948627509001968;
+givenTree.Pt7600_200201.t=0.01824119365062065;
+givenTree.Pt7504_200201.t=0.02718526097718855;
+givenTree.PCF_Pat23_200101.t=0.02922051203263706;
+givenTree.Node5437.t=0.004176908039977303;
+givenTree.Node5403.t=0.005008390680727669;
+givenTree.Node5445.t=0.01134354641396875;
+givenTree.Node5446.t=0.02586008672521035;
+givenTree.CCB_3778_200501.t=0.03133173645830208;
+givenTree.Node5349.t=0.003675387800578664;
+givenTree.Node5458.t=0.01275132676086695;
+givenTree.CCB_2652_200501.t=0.05842928259281996;
+givenTree.Pt3151_200201.t=0.05046263941989673;
+givenTree.Node5245.t=0;
+givenTree.GRSPR67_200301.t=0.09241083417242353;
+givenTree.Pt4213_200201.t=0.07819976932505153;
+givenTree.BR04RS136_200401.t=0.05443522614823867;
+givenTree.JLB_Pat34_200006.t=0.06059234155111032;
+givenTree.Node5404.t=0.006353332629101609;
+givenTree.Node5434.t=0.01160628918091669;
+givenTree.Node5428.t=0.007032080369491575;
+givenTree.Node5439.t=0.01089549750371389;
+givenTree.Node5438.t=0.007339131054144547;
+givenTree.BR04RS95_200401.t=0.05459693072157011;
+givenTree.Node5442.t=0.004944628263311028;
+givenTree.CCB_623_200501.t=0.04345368431942084;
+givenTree.BrRJ004_200101.t=0.0529267548841072;
+givenTree.Node5406.t=0.005133120497198489;
+givenTree.Node5373.t=0.0060126873120587;
+givenTree.BRCN12_200208.t=0.08056044630463179;
+givenTree.Node5375.t=0;
+givenTree.Node5376.t=0.004390683585296374;
+givenTree.ARG_54_200001.t=0.01851649279553558;
+givenTree.MI_Pat5_200101.t=0.06324410157632669;
+givenTree.Node5372.t=0.009554229131577269;
+givenTree.ARG25_199701.t=0.02536803682327045;
+givenTree.Node5380.t=0;
+givenTree.Node5381.t=0.0107594330408357;
+givenTree.BRC1553_200208.t=0.1075033777013678;
+givenTree.BREPM108_199901.t=0.09576563511293004;
+givenTree.BRP2123_200208.t=0;
+givenTree.BRP2124_200208.t=0.005641169756616275;
+givenTree.Node5352.t=0.004229242560785855;
+givenTree.Node5360.t=0.0689038319451914;
+givenTree.Node5358.t=0.01298665672603813;
+givenTree.Node5366.t=0.0533996228970241;
+givenTree.SLMT_UD492_200501.t=0.04259726248786916;
+givenTree.BRNE267_200208.t=0.05066563110604421;
+givenTree.Node5351.t=0.004527177449253388;
+givenTree.Pt4604_200201.t=0.07070275814181545;
+givenTree.Node5365.t=0.01766764974721786;
+givenTree.CA8340_200102.t=0.08168047189459378;
+givenTree.Node5400.t=0.01240088101442023;
+givenTree.Node5392.t=0.005633814109547917;
+givenTree.CCB_1071_200501.t=0.03173092597234925;
+givenTree.Node5393.t=0.02762184951497309;
+givenTree.BRC1559_200208.t=0.07143312679297625;
+givenTree.Node5370.t=0;
+givenTree.Node5407.t=0.01025193013896145;
+givenTree.Pt7603_200201.t=0.0526935206621458;
+givenTree.VT42_200201.t=0.009442385602475062;
+givenTree.Node5350.t=0.007764252720719418;
+givenTree.VT10pl_200201.t=0.02895087151761287;
+givenTree.Pt3732_200201.t=0.01344200757623091;
+givenTree.Node5389.t=0.01306056442015183;
+givenTree.Node5385.t=0.01097272018378189;
+givenTree.AP_ARRP014_200406.t=0.07909653414091082;
+givenTree.Node5386.t=0.005083458111043407;
+givenTree.ARG_58_200001.t=0.01733809101185383;
+givenTree.Node5371.t=0.006422976599594481;
+givenTree.Pt4536_200201.t=0.03137220620250443;
+givenTree.Node5394.t=0.0039300532985971;
+givenTree.Node5395.t=0.01150314381371081;
+givenTree.BR04RS219_200401.t=0.08583125225853985;
+givenTree.Pt5042_200201.t=0.03627164462285905;
+givenTree.Node5261.t=0;
+givenTree.Node5051.t=0.003525118564551642;
+givenTree.Node4575.t=0;
+givenTree.KDR_pat52_199602.t=0.05220612372281357;
+givenTree.Node5065.t=0;
+givenTree.Node5117.t=0.006273852881765447;
+givenTree.Node5107.t=0;
+givenTree.JLB_Pat85_200006.t=0.06157121907174171;
+givenTree.VT36_200201.t=0.02391250060837452;
+givenTree.Node5137.t=0.004440832043203932;
+givenTree.VT43_200201.t=0.04326223621403851;
+givenTree.Node5131.t=0.01789841351001048;
+givenTree.VT28_200201.t=0.03365280852137894;
+givenTree.Node5123.t=0.01241242030810481;
+givenTree.Node5108.t=0.0109789379593645;
+givenTree.BRC1539_200208.t=0.005061692648590441;
+givenTree.Node5114.t=0.00600280653333048;
+givenTree.4001905_200401.t=0.05723329859575419;
+givenTree.DMG41_199811.t=0.03312030279968774;
+givenTree.BRC1468_200104.t=0;
+givenTree.BRP2399_200104.t=0.07503690219921313;
+givenTree.Pt5255_200201.t=0.05967813009813976;
+givenTree.Node5118.t=0.00639766055958512;
+givenTree.Node5119.t=0.06584085993536987;
+givenTree.CA4399_199905.t=0.04787322332016583;
+givenTree.Node5135.t=0.02410400471918732;
+givenTree.Node5147.t=0.01062794210271142;
+givenTree.JA_408_198701.t=0.01002119224944976;
+givenTree.Node5153.t=0;
+givenTree.EC12_199407.t=0.04418171221919433;
+givenTree.Node5157.t=0.006172588531055086;
+givenTree.Node5146.t=0.01063675447298699;
+givenTree.Node5145.t=0.002348693234356589;
+givenTree.IP_42_199612.t=0.01717834282693561;
+givenTree.Node5161.t=0.004231159627189274;
+givenTree.IP_34_199707.t=0.01718759599996869;
+givenTree.PCF_Pat178_200101.t=0.01736457546009604;
+givenTree.JA_27_198701.t=0.02014427906124721;
+givenTree.JA_B137_198701.t=0.01988544568459687;
+givenTree.JA_2213_198701.t=0.02889928163225579;
+givenTree.Node5130.t=0.007021558104124026;
+givenTree.PCF_Pat203_200101.t=0.02865952053974576;
+givenTree.Node5134.t=0;
+givenTree.MI_Pat93_200101.t=0.05109826310579337;
+givenTree.JA_B85_198701.t=0.004988648675664785;
+givenTree.Node5154.t=0.005002664389541934;
+givenTree.JA_B254_198701.t=0.01502288871490454;
+givenTree.Node5150.t=0.007286827317000668;
+givenTree.Node5148.t=0.004568996499587317;
+givenTree.Node5109.t=0.004580872919392419;
+givenTree.Node5078.t=0.02384459457405315;
+givenTree.Node5068.t=0;
+givenTree.CCB_2764_200501.t=0.01832678575681528;
+givenTree.ACTG320_3169_199605.t=0.04833935377226611;
+givenTree.Node5079.t=0.007237532682121766;
+givenTree.SLMT_IVDU155_200501.t=0.02135089629440028;
+givenTree.CA7062_200007.t=0.06410901193481294;
+givenTree.Node5086.t=0;
+givenTree.Node5087.t=0.05772551147155987;
+givenTree.BRCN06_200208.t=0.02605582962035711;
+givenTree.BRNE186_200208.t=0.01479989294580871;
+givenTree.BRSP470_200208.t=0.03912664080462272;
+givenTree.JLB_Pat14_200006.t=0.0631215410160948;
+givenTree.Node5071.t=0.01354741511110678;
+givenTree.N30_200301.t=0.03887343972928464;
+givenTree.Node5060.t=0;
+givenTree.Node5052.t=0.003626348716767468;
+givenTree.SLMT_UD518_200501.t=0.05178233169093983;
+givenTree.Node5075.t=0;
+givenTree.Node5069.t=0.01313283458143732;
+givenTree.PCF_Pat152_200101.t=0.06251013224041727;
+givenTree.Node5070.t=0.005199892051801987;
+givenTree.VT06_200201.t=0.03364208692183859;
+givenTree.Node5084.t=0;
+givenTree.Node5104.t=0.006948333314786967;
+givenTree.Node5098.t=0;
+givenTree.CCB_06_200501.t=0.03142950817802086;
+givenTree.Node5099.t=0;
+givenTree.CH55_200101.t=0.07112305423215175;
+givenTree.Node5094.t=0.004836843605965598;
+givenTree.CH132_200101.t=0.06620155431186521;
+givenTree.Node5111.t=0.01322045916693422;
+givenTree.BRP2397_200104.t=0.0232412937957957;
+givenTree.Node5066.t=0.003542656645560586;
+givenTree.IP_38_199701.t=0.05049320478219988;
+givenTree.Node5101.t=0.02254229651690265;
+givenTree.Node5083.t=0.00256938234123201;
+givenTree.Node5067.t=0;
+givenTree.Node5091.t=0.0116885750792272;
+givenTree.SLMT_IVDU033_200501.t=0.05554572656738705;
+givenTree.Pt1365_200201.t=0.06864357610262256;
+givenTree.US2_200111.t=0.03568944512885556;
+givenTree.BRRJ927_200208.t=0.05718517011444237;
+givenTree.Pt4582_200201.t=0.0791263484147068;
+givenTree.ED_V43_199901.t=0.0263820669343819;
+givenTree.SLMT_UD426_200501.t=0.02384850559884428;
+givenTree.Node5095.t=0.01729055933885617;
+givenTree.VC_pat271_199901.t=0.005940515518608809;
+givenTree.Node5206.t=0.003523721108158999;
+givenTree.36010_199607.t=0.04522903143813189;
+givenTree.MI_Pat57_200101.t=0.02512657902103421;
+givenTree.Node5216.t=0;
+givenTree.JLB_Pat82_200006.t=0.08912677208465027;
+givenTree.Node5222.t=0.01834172797603635;
+givenTree.Node5227.t=0;
+givenTree.Node5226.t=0.004588765368427021;
+givenTree.GRSPR102_200301.t=0.07863449142133147;
+givenTree.Node5230.t=0.01333697227048931;
+givenTree.JLB_Pat95_200006.t=0;
+givenTree.JLB_Pat96_200006.t=0.007072333874303991;
+givenTree.CCB_3469_200501.t=0.05929004626031135;
+givenTree.CA16135_200302.t=0.03733440100417543;
+givenTree.Node5213.t=0.02471535793095482;
+givenTree.HG052_199901.t=0.08100277493601217;
+givenTree.SLMT_UD213_200501.t=0.07531725909852215;
+givenTree.Node5208.t=0.01706271885066713;
+givenTree.Node5207.t=0.005582074002445698;
+givenTree.JLB_Pat73_200006.t=0.07553006037433826;
+givenTree.Node5217.t=0.0267885182810229;
+givenTree.Node5218.t=0.04397238115965461;
+givenTree.N29_200301.t=0.0370560971217026;
+givenTree.N28_200301.t=0.04594258901286225;
+givenTree.PCF_Pat47_200101.t=0.03118573937657116;
+givenTree.CA14380_200204.t=0.004854338919104532;
+givenTree.Node5258.t=0.05601169800209256;
+givenTree.5000053_200401.t=0.009807226091924063;
+givenTree.Node5251.t=0.04841319329514852;
+givenTree.92BR028_199201.t=0.02394590063569624;
+givenTree.Node5256.t=0.009651817233857496;
+givenTree.Node5262.t=0.01311893404235394;
+givenTree.CA16149_200303.t=0.03575071766264498;
+givenTree.CA4002_199901.t=0.05622074963293449;
+givenTree.Node5250.t=0;
+givenTree.HG003_199901.t=0.04331232183027848;
+givenTree.MDS_02UAKV139_200101.t=0.02235745352778069;
+givenTree.Node5237.t=0.01938339576669788;
+givenTree.Node5233.t=0.003548758395958789;
+givenTree.CA9646_200110.t=0.05803922099441165;
+givenTree.Node5234.t=0.01523298583670831;
+givenTree.CCB_447_200501.t=0.07293901566114175;
+givenTree.Node5225.t=0;
+givenTree.MDS_01UAOD037_200101.t=0.01458830123949767;
+givenTree.Node5252.t=0.01157084538501295;
+givenTree.MDS_01UAOD039_200101.t=0.01247979717207723;
+givenTree.Node5205.t=0.01046948073232478;
+givenTree.Node5127.t=0.01070646065968101;
+givenTree.Node5209.t=0.03089491968851818;
+givenTree.PCF_Pat134_200101.t=0.07564233654260562;
+givenTree.Node5179.t=0.02051640718696287;
+givenTree.dn75_200008.t=0.03936262632323891;
+givenTree.Node5172.t=0;
+givenTree.Node5142.t=0.00598567195135084;
+givenTree.dn42_200001.t=0.01027225584056718;
+givenTree.Node5182.t=0;
+givenTree.Node5178.t=0.01062574770775322;
+givenTree.CCB_4157_200501.t=0.06467318166069631;
+givenTree.dn20_200001.t=0.01012548089255244;
+givenTree.Node5183.t=0.02416990081757272;
+givenTree.IP_25_199612.t=0.02148888041112937;
+givenTree.Node5166.t=0.0132373935668269;
+givenTree.Node5164.t=0;
+givenTree.PCF_Pat199_200101.t=0.02721928637322218;
+givenTree.VC_pat272_199901.t=0;
+givenTree.Node5167.t=0.02998567003303894;
+givenTree.Node5144.t=0.003566424374862587;
+givenTree.PCF_Pat96_200101.t=0.05133553302331773;
+givenTree.Node5173.t=0;
+givenTree.JA_F_198701.t=0.03525998354894538;
+givenTree.PCF_Pat71_200101.t=0.02620166462506151;
+givenTree.Node5143.t=0;
+givenTree.dn72_200007.t=0.04148529931441128;
+givenTree.Node5197.t=0;
+givenTree.V2000_15_199801.t=0.04453645422842757;
+givenTree.Node5199.t=0.01882057111919353;
+givenTree.HG091_199901.t=0.05734066625985878;
+givenTree.Pt3062_200201.t=0.03363221223091052;
+givenTree.CH131_200101.t=0.05022873708600984;
+givenTree.N25_200301.t=0.09091655885622507;
+givenTree.05_132917_200401.t=0.09743268192384479;
+givenTree.Node5128.t=0.003498878910823852;
+givenTree.Node5202.t=0.009258411655212982;
+givenTree.Node5196.t=0.01213359865925153;
+givenTree.IP_15_199705.t=0.02770880327652695;
+givenTree.Node5188.t=0.006873429836996238;
+givenTree.BRC1560_200208.t=0.05337995511772679;
+givenTree.Node5190.t=0.009748562422145137;
+givenTree.SP_UFC_B_199201.t=0.05165476267348907;
+givenTree.PCF_Pat15_200101.t=0.04163843295833095;
+givenTree.JLB_Pat80_200006.t=0.03381695640570611;
+givenTree.Node5141.t=0.003640538748432733;
+givenTree.Node5129.t=0;
+givenTree.Node5177.t=0.0144115523462667;
+givenTree.Node5193.t=0.01288252065390636;
+givenTree.Node5187.t=0.01123130377860578;
+givenTree.Node606.t=0.004115920516122585;
+givenTree.DMG61_199904.t=0.02827613278728893;
+givenTree.ED_V94_199901.t=0.05876342334250839;
+givenTree.YNRL9828_200301.t=0.02106100157881814;
+givenTree.Node1736.t=0.005905783352954795;
+givenTree.SLMT_IVDU091_200501.t=0.03955256357212022;
+givenTree.Node2725.t=0.01434351104414598;
+givenTree.Node2634.t=0.04069079667759806;
+givenTree.PCF_Pat115_200101.t=0.01740237912632752;
+givenTree.Node1746.t=0.01747077364344487;
+givenTree.Node1745.t=0.00343070141200123;
+givenTree.Node1749.t=0.01119909172573283;
+givenTree.Node2492.t=0.004304690681421243;
+givenTree.Node402.t=0;
+givenTree.PCF_Pat146_200101.t=0.0356585232293258;
+givenTree.DB_SI7097_04_200401.t=0.004911852469111877;
+givenTree.VT69_200201.t=0.04834817871913154;
+givenTree.DMG51_199810.t=0.01482378342095017;
+givenTree.Node1753.t=0;
+givenTree.Node1759.t=0.01473741253049505;
+givenTree.PCF_Pat182_200101.t=0.05833775141157561;
+givenTree.ARG07_199701.t=0.01703659686928371;
+givenTree.CA16356_200305.t=0.03544348571801746;
+givenTree.Node1758.t=0.007394100046278346;
+givenTree.DMG49_199809.t=0.0174482624600061;
+givenTree.CH113_200101.t=0.04465789476060079;
+givenTree.dn62_200006.t=0.00967591244380238;
+givenTree.Node2819.t=0.008343628220734376;
+givenTree.Node2638.t=0;
+givenTree.PCF_Pat44_200101.t=0.03507769855139615;
+givenTree.Node151.t=0.01252734464058733;
+givenTree.CA6828_200006.t=0.03922565088664019;
+givenTree.Pt4527_200201.t=0.02344423055905215;
+givenTree.Node484.t=0.03332533073746195;
+givenTree.Node3081.t=0.004490509087516774;
+givenTree.Node1677.t=0;
+givenTree.dn90_200003.t=0.005759394954605369;
+givenTree.Node2660.t=0.005782910894605176;
+givenTree.Node345.t=0;
+givenTree.Pt3602_200201.t=0.0219643311496377;
+givenTree.PCF_Pat114_200101.t=0.01428008698887484;
+givenTree.JLB_Pat3_200006.t=0.05051203080508321;
+givenTree.PCF_Pat193_200101.t=0.01433966073866145;
+givenTree.Node1737.t=0;
+givenTree.PO_Pt4_199204.t=0.04650706826001307;
+givenTree.Node1738.t=0.02288416458864238;
+givenTree.Node2426.t=0.00853224291910459;
+givenTree.CP_Pat11_199712.t=0.09623143455990993;
+givenTree.Node180.t=0;
+givenTree.Node2848.t=0.01591224316575541;
+givenTree.PSW_Pat47_200201.t=0.06990485522080286;
+givenTree.dn34_200010.t=0.02565433145212714;
+givenTree.PCF_Pat94_200101.t=0.01808541075278063;
+givenTree.PCF_Pat189_200101.t=0.02167952318127672;
+givenTree.Node1765.t=0.003290180963870186;
+givenTree.Node1788.t=0.005584237372962946;
+givenTree.Node1780.t=0.004080234253420153;
+givenTree.CCB_1309_200501.t=0.03598707117331063;
+givenTree.RR_MAD_TO086_200501.t=0;
+givenTree.PCF_Pat126_200101.t=0.03925977460430081;
+givenTree.Node2661.t=0.04692401378672095;
+givenTree.Node1781.t=0;
+givenTree.Node2739.t=0.004882652800230296;
+givenTree.MI_Pat1_200101.t=0.05456838475595422;
+givenTree.MDS_02UAKV186_200101.t=0.09250978699191725;
+givenTree.Brp026_199612.t=0.06266469437058331;
+givenTree.Node1787.t=0;
+givenTree.PCF_Pat154_200101.t=0.01477811019005584;
+givenTree.PCF_Pat181_200101.t=0.04663986410975594;
+givenTree.Node1779.t=0.004325942470351841;
+givenTree.4003711_200401.t=0.02630147864511225;
+givenTree.PCF_Pat65_200101.t=0.07404324059685348;
+givenTree.Node1791.t=0.007444630591455087;
+givenTree.Node348.t=0.0188050017339236;
+givenTree.BRSP658_200208.t=0.05058091297195225;
+givenTree.03UZ011_200301.t=0.004493483032500922;
+givenTree.CH32_200101.t=0.02878412673727659;
+givenTree.143P8_199101.t=0.01485209156535569;
+givenTree.Node2760.t=0.009090396607437179;
+givenTree.Node1769.t=0.01435190457029076;
+givenTree.Node2563.t=0;
+givenTree.Node2998.t=0.005096979923434006;
+givenTree.Node1757.t=0.002969349416624481;
+givenTree.Node2359.t=0.006630946602175776;
+givenTree.BRP2040_200104.t=0.04513753003113471;
+givenTree.PCF_Pat186_200101.t=0.04074560314986262;
+givenTree.Pt5763_200201.t=0.01951281198569789;
+givenTree.Node1766.t=0.007124095423962796;
+givenTree.PCF_Pat77_200101.t=0.01727098786337409;
+givenTree.Node1767.t=0.00763402542694768;
+givenTree.DMG72_199802.t=0.02535566765544777;
+givenTree.Node319.t=0.00606003540421824;
+givenTree.BRP2093_200208.t=0.04603902496532013;
+givenTree.MI_Pat67_200101.t=0.05858855849640078;
+givenTree.DMG35_199809.t=0.04298572491189256;
+givenTree.Node28.t=0;
+givenTree.Node1772.t=0.007736140723818531;
+givenTree.Node1768.t=0;
+givenTree.Node1705.t=0.003538553103439373;
+givenTree.KDR_pat187_199605.t=0.03112604876363498;
+givenTree.SLMT_UD342_200501.t=0.03990128272237793;
+givenTree.PCF_Pat169_200101.t=0.02078612540602576;
+givenTree.Node1700.t=0.003531455840625506;
+givenTree.BRP2146_200208.t=0.08689304333586576;
+givenTree.Node1775.t=0.005996784932171911;
+givenTree.Node1702.t=0.004168972806990655;
+givenTree.MDS_02UANK075_200101.t=0.02256143203857429;
+givenTree.PCF_Pat185_200101.t=0.01436635191400557;
+givenTree.Pt7618_200201.t=0.01069864059344239;
+givenTree.BRNE134_200208.t=0.1178623849178087;
+givenTree.PCF_Pat167_200101.t=0.02141527204055936;
+givenTree.Node1711.t=0.01014187045212243;
+givenTree.PCF_Pat85_200101.t=0.02463183136642866;
+givenTree.SLMT_IVDU063_200501.t=0.08329318393721422;
+givenTree.EC26_199407.t=0.05756846051808456;
+givenTree.Node1707.t=0;
+givenTree.DMG79_199802.t=0.0242515096166756;
+givenTree.KDR_pat242_199605.t=0.02168978480318019;
+givenTree.Node1708.t=0.006185600938776221;
+givenTree.GRSPR110_200301.t=0.05732012986515731;
+givenTree.PCF_Pat139_200101.t=0.04397161488184593;
+givenTree.Node2430.t=0.01134894404239571;
+givenTree.Node2408.t=0;
+givenTree.Node2713.t=0.02115917248651117;
+givenTree.SLMT_IVDU046_200501.t=0.008451260186428236;
+givenTree.MI_Pat65_200101.t=0.0514596775110391;
+givenTree.Node1678.t=0.007123756836656728;
+givenTree.Node1694.t=0.005331328289291504;
+givenTree.CA6323_200003.t=0.03495827306524974;
+givenTree.Node1688.t=0.009704839529102617;
+givenTree.Node1683.t=0;
+givenTree.CA8387_200102.t=0.01000098449906186;
+givenTree.Node2128.t=0;
+givenTree.JA_B197_198701.t=0.009996924591758329;
+givenTree.AP_ARRP036_200406.t=0.04413313365100424;
+givenTree.PCF_Pat112_200101.t=0.03039110379291529;
+givenTree.Node1693.t=0.003369507350917116;
+givenTree.CA16246_200303.t=0.04762388357045266;
+givenTree.Node1697.t=0.003604151850346538;
+givenTree.Node1692.t=0;
+givenTree.Node2964.t=0;
+givenTree.Node2459.t=0.006386694650786169;
+givenTree.MYIDU30_200401.t=0.009180413872650318;
+givenTree.KDR_pat239_199603.t=0.04231236597045793;
+givenTree.PCF_Pat95_200101.t=0.03549396005109107;
+givenTree.PCF_Pat64_200101.t=0.01111077526564298;
+givenTree.Node2093.t=0;
+givenTree.YNRL9613_200301.t=0.03939768330430746;
+givenTree.Node2997.t=0.01658471803992501;
+givenTree.IP_1_199701.t=0;
+givenTree.Node164.t=0.006767969379795003;
+givenTree.GRSPR74_200301.t=0.05392659286685186;
+givenTree.DMG50_199812.t=0.02356620915349457;
+givenTree.dn58_200003.t=0.06856241990596117;
+givenTree.Node1729.t=0.006273526105022091;
+givenTree.Node2439.t=0.007088553089082647;
+givenTree.Node1714.t=0;
+givenTree.Node331.t=0.007144247388983851;
+givenTree.Node1724.t=0.01152191092398088;
+givenTree.Node1754.t=0.004858625567943637;
+givenTree.JA_5016_198701.t=0.05007283193667386;
+givenTree.02THOUR740I_200201.t=0.04623508667342321;
+givenTree.Node1744.t=0.008857134568604829;
+givenTree.Node1739.t=0.08170473298587254;
+givenTree.DMG30_199807.t=0.03362603428388276;
+givenTree.KDR_pat43_199603.t=0.03464817926187429;
+givenTree.33027_199607.t=0.01979971784633974;
+givenTree.Node2509.t=0.007567419472268511;
+givenTree.Node1727.t=0.008238212590617659;
+givenTree.Pt6139_200201.t=0.06525474796654973;
+givenTree.Node1728.t=0.003472908822619857;
+givenTree.PCF_Pat16_200101.t=0.01074072477450938;
+givenTree.Node2082.t=0.019861012221357;
+givenTree.Node3093.t=0;
+givenTree.PCF_Pat58_200101.t=0.04943604899621442;
+givenTree.DMG29_199808.t=0.02883193797877513;
+givenTree.PCF_Pat118_200101.t=0.0351286767974751;
+givenTree.Node1717.t=0.006061011787312622;
+givenTree.Node150.t=0;
+givenTree.Node44.t=0.01496812845829926;
+givenTree.BR04RS194_200401.t=0.04825174600295452;
+givenTree.Node85.t=0;
+givenTree.CA14155_200112.t=0.05889212946126753;
+givenTree.CA16493_200308.t=0.03624884437565876;
+givenTree.Node310.t=0.006761112954236854;
+givenTree.CCB_3162_200501.t=0.03861656616677492;
+givenTree.Node333.t=0.01739863382586794;
+givenTree.Node2526.t=0;
+givenTree.Node1715.t=0;
+givenTree.Node1716.t=0.003528453776128454;
+givenTree.Node1720.t=0.003926473809507968;
+givenTree.89SP061_198901.t=0.01774567064203645;
+givenTree.Node2108.t=0.003670399760602673;
+givenTree.Node2475.t=0;
+givenTree.Node2476.t=0;
+givenTree.CP_Pat4_199712.t=0.02651598153493895;
+givenTree.PCF_Pat5_200101.t=0.03628240498605541;
+givenTree.Node1866.t=0;
+givenTree.Node1936.t=0.05391292245669067;
+givenTree.Pt3607_200201.t=0.01653162448850068;
+givenTree.Node1855.t=0.01060354052668554;
+givenTree.PCF_Pat148_200101.t=0.02173225947841322;
+givenTree.Node1966.t=0.002395132588476623;
+givenTree.N62_200301.t=0.06354804080279884;
+givenTree.Node1856.t=0.01298029468154397;
+givenTree.IP_2_199701.t=0.03772039868490907;
+givenTree.HG011_199901.t=0.01318066903645452;
+givenTree.JLB_Pat55_200006.t=0.004251808000828081;
+givenTree.Node1861.t=0;
+givenTree.Node2420.t=0.01146613236956184;
+givenTree.Node1868.t=0.007833934321703984;
+givenTree.Pt5816_200201.t=0.02239795527659485;
+givenTree.Node1873.t=0.006295627045622329;
+givenTree.PCF_Pat42_200101.t=0.03223302036016187;
+givenTree.CCB_5234_200501.t=0.05815466306104904;
+givenTree.5000048_200401.t=0.04384193668498231;
+givenTree.Pt7957_200201.t=0;
+givenTree.Node3.t=0;
+givenTree.DMG44_199809.t=0.01110952517597999;
+givenTree.Node2839.t=0.008278104106618884;
+givenTree.Node2290.t=0.02654894452806635;
+givenTree.MDS_02AZ044_199901.t=0.009008550578103132;
+givenTree.Node3083.t=0;
+givenTree.Node77.t=0;
+givenTree.Node1848.t=0.01034625855184816;
+givenTree.PCF_Pat163_200101.t=0.007728724467035025;
+givenTree.PSW_Pat2_199802.t=0.0314808234425064;
+givenTree.Node2386.t=0.02301420508616586;
+givenTree.N07_200301.t=0.03254147434352989;
+givenTree.CH7_200101.t=0.06771682309847915;
+givenTree.Node1847.t=0.01365743081066645;
+givenTree.dn02_200011.t=0.01534520613577144;
+givenTree.PCF_Pat202_200101.t=0.04675380189181149;
+givenTree.440113_199401.t=0.04890681092576502;
+givenTree.DMG53_199809.t=0.03857448729280771;
+givenTree.JLB_Pat52_200006.t=0.007205539069930909;
+givenTree.Node2550.t=0;
+givenTree.PCF_Pat39_200101.t=0.02162543012362194;
+givenTree.CA16385_200306.t=0.02918706367059873;
+givenTree.Node2208.t=0.02323516569836817;
+givenTree.Pt3684_200201.t=0.01595218174227462;
+givenTree.Node1857.t=0.005783815930169875;
+givenTree.37003_199607.t=0.1144728111896041;
+givenTree.HG060_199901.t=0.07821257435334954;
+givenTree.Node1867.t=0.004296008255038178;
+givenTree.LV22HALD_199801.t=0.03892278543353334;
+givenTree.Node226.t=0.003646917282946584;
+givenTree.Node266.t=0.01254064522550741;
+givenTree.Node292.t=0;
+givenTree.CP_Pat2_199712.t=0.03691542470499043;
+givenTree.Node1888.t=0;
+givenTree.Node2285.t=0;
+givenTree.PCF_Pat10_200101.t=0.02878442341261882;
+givenTree.Node2333.t=0;
+givenTree.PCF_Pat143_200101.t=0.03771450544809501;
+givenTree.Node1880.t=0.003510478666137247;
+givenTree.Node1889.t=0;
+givenTree.VT95_200201.t=0;
+givenTree.CCB_4825_200501.t=0.07989565713523739;
+givenTree.IP_43_199703.t=0.03021952593089468;
+givenTree.CCB_3954_200501.t=0.05324474967664079;
+givenTree.CA6390_200003.t=0.02211899120108369;
+givenTree.CA6493_200005.t=0.06743639930690908;
+givenTree.CCB_5314_200501.t=0.03144312393169319;
+givenTree.CH11_200101.t=0.004623840394464637;
+givenTree.Node297.t=0.004357091314940858;
+givenTree.Node2129.t=0;
+givenTree.PCF_Pat155_200101.t=0.02100487751398511;
+givenTree.dn52_200003.t=0.010305485941245;
+givenTree.Node433.t=0.01935338947657982;
+givenTree.Node1876.t=0;
+givenTree.Node1872.t=0.006581169005256089;
+givenTree.Node1912.t=0.00469994674241439;
+givenTree.Node2611.t=0.01310281593327891;
+givenTree.Node2342.t=0.008527730122920414;
+givenTree.93US141_200111.t=0.05318822226246815;
+givenTree.Node499.t=0.003702742299658208;
+givenTree.CA8090_200101.t=0.03921072290217761;
+givenTree.Pt6080_200201.t=0.0131799787339894;
+givenTree.BrRJ002_200101.t=0.05468446456463984;
+givenTree.Node2981.t=0.005899779165200697;
+givenTree.Node3097.t=0;
+givenTree.PCF_Pat132_200101.t=0.0502329710098476;
+givenTree.Node1881.t=0.01137025782623689;
+givenTree.EC15_199407.t=0;
+givenTree.Node1883.t=0.005643186908495775;
+givenTree.Node1916.t=0.007637101530278297;
+givenTree.Node1854.t=0.00708022192642565;
+givenTree.CCB_3729_200501.t=0.05625095822217008;
+givenTree.Node2241.t=0;
+givenTree.GRSPR84_200301.t=0.03945607791651175;
+givenTree.Node2881.t=0.007313153379951135;
+givenTree.MDS_02UANK028_200101.t=0.009007438870688228;
+givenTree.Node1806.t=0.008666649941719371;
+givenTree.Node2654.t=0;
+givenTree.DMG38_199812.t=0.03252023016341472;
+givenTree.Node1802.t=0.01222552446598965;
+givenTree.MDS_02UAKV123_200101.t=0.0182425234660576;
+givenTree.Node3019.t=0.005553000198488984;
+givenTree.Pt4533_200201.t=0.08315934077829801;
+givenTree.LVMP701VIC_199901.t=0.0471517034882002;
+givenTree.Node1809.t=0.004018415410024821;
+givenTree.Node1803.t=0.00673472342198278;
+givenTree.GRSPR72_200301.t=0.06410971983834028;
+givenTree.CCB_287_200501.t=0.04189979784510667;
+givenTree.Node1810.t=0.01138873416349273;
+givenTree.Node2245.t=0.01810129073607239;
+givenTree.05_132923_200401.t=0.07214837742729935;
+givenTree.4004045_200401.t=0.0681542391924739;
+givenTree.NH5_199001.t=0.050287016343569;
+givenTree.Node2271.t=0.0226280804745111;
+givenTree.Node1801.t=0.003792526311424375;
+givenTree.Node3047.t=0.002034920846263634;
+givenTree.PCF_Pat194_200101.t=0.02735373703390725;
+givenTree.MDS_01UAKV252_200101.t=0.006162562004247214;
+givenTree.Node1675.t=0.007080965968863203;
+givenTree.Node2190.t=0.02297768904412701;
+givenTree.Node1816.t=0;
+givenTree.PCF_Pat60_200101.t=0.0179167707768034;
+givenTree.EC24_199308.t=0.01066201758320939;
+givenTree.Pt5786_200201.t=0.03599382732541146;
+givenTree.Node1734.t=0;
+givenTree.KDR_pat57_199604.t=0.008776537568499977;
+givenTree.MI_Pat73_200101.t=0.03872058957202291;
+givenTree.Node2090.t=0;
+givenTree.JLB_Pat16_200006.t=0.03180638701248382;
+givenTree.PCF_Pat55_200101.t=0.03041025167629932;
+givenTree.KDR_pat36_199605.t=0.005167475801308288;
+givenTree.Node1795.t=0;
+givenTree.Node1794.t=0;
+givenTree.Node392.t=0.01752621822688166;
+givenTree.dn68_200006.t=0.03489207043892887;
+givenTree.Node1676.t=0;
+givenTree.Node2346.t=0.006835185409939949;
+givenTree.CCB_2387_200501.t=0.006541221401766702;
+givenTree.4003709_200401.t=0;
+givenTree.Node1786.t=0.003558507614424211;
+givenTree.Node2734.t=0.02174912353963005;
+givenTree.Node290.t=0;
+givenTree.05_132897_200401.t=0.03504279520236676;
+givenTree.Node1764.t=0.003576018054761489;
+givenTree.KDR_pat10_199603.t=0.02588227401901758;
+givenTree.Node2873.t=0;
+givenTree.Node2891.t=0.01848246682177659;
+givenTree.PCF_Pat91_200101.t=0.02495747032849814;
+givenTree.Node1815.t=0;
+givenTree.CA6006_200002.t=0.04455123544516695;
+givenTree.Node1819.t=0.006280260279512148;
+givenTree.MYIDUC10_200401.t=0.04440653537055456;
+givenTree.N64_200301.t=0.04514780852846284;
+givenTree.Node1823.t=0.01391541584264089;
+givenTree.DB_SI943_00_200001.t=0.06114643507269307;
+givenTree.PCF_Pat34_200101.t=0.01436167977724737;
+givenTree.Node2927.t=0.01936750265231877;
+givenTree.Node1834.t=0;
+givenTree.CA9714_200111.t=0;
+givenTree.Node2197.t=0.01861335695635682;
+givenTree.Node1674.t=0;
+givenTree.PCF_Pat76_200101.t=0.03456288230312813;
+givenTree.Node1814.t=0.003593996199820921;
+givenTree.Node1843.t=0;
+givenTree.Node2914.t=0.008208940551146156;
+givenTree.Node1838.t=0.007167319825803186;
+givenTree.Node2797.t=0.05525545415999751;
+givenTree.PCF_Pat29_200101.t=0.03615859132156531;
+givenTree.TY_pat1_200201.t=0.06055684449624995;
+givenTree.CCB_2278_200501.t=0.01759061872444555;
+givenTree.MDS_01UAKV106_200101.t=0.0309710029784452;
+givenTree.Node1827.t=0;
+givenTree.CA8067_200012.t=0.05400499222001152;
+givenTree.A025_199901.t=0.05991097469759882;
+givenTree.Node477.t=0.01518638647257238;
+givenTree.R140_200201.t=0.02639357241761643;
+givenTree.Node3032.t=0.07389516461741118;
+givenTree.Pt4619_200201.t=0.02922545538182256;
+givenTree.ARG31_199701.t=0.02180656127801809;
+givenTree.CCB_5310_200501.t=0.02776644104387062;
+givenTree.Node2130.t=0.006845615048261255;
+givenTree.Node1824.t=0.004252329752883499;
+givenTree.CA5479_199912.t=0.02067754928590932;
+givenTree.VT10_200201.t=0.03533284978731296;
+givenTree.39340_200101.t=0.06630387782120629;
+givenTree.Node49.t=0.006339295133641796;
+givenTree.CH110_200101.t=0.04176728616627111;
+givenTree.Node1831.t=0.01111109931504089;
+givenTree.Node1839.t=0.00761931441019098;
+givenTree.260Pt24_199511.t=0.05563250748753392;
+givenTree.Node2368.t=0.01065909933818147;
+givenTree.Node1825.t=0.005489192439486679;
+givenTree.Node1684.t=0.007227841003026976;
+givenTree.Node1533.t=0.01941363350021762;
+givenTree.32_199501.t=0.07567054410616333;
+givenTree.ED_V51_199901.t=0.05734160743991601;
+givenTree.Node2343.t=0.01147457427185566;
+givenTree.CA5529_199912.t=0.05259874511908624;
+givenTree.Node1547.t=0.01493687464184598;
+givenTree.MYIDUA2_200401.t=0.03318685163989831;
+givenTree.Cu43_200401.t=0.04468724033629495;
+givenTree.CA4575_199906.t=0.03760978371915519;
+givenTree.PT_VE1_199301.t=0.05151451211257398;
+givenTree.HG071_199901.t=0.03846339138760477;
+givenTree.EC30_199407.t=0.04863448073619994;
+givenTree.CCB_4333_200501.t=0.05346305286698193;
+givenTree.Node1532.t=0;
+givenTree.Node2621.t=0.03739347178087915;
+givenTree.MDS_02UANK097_200101.t=0;
+givenTree.PG_GM142_199801.t=0.06832718947638521;
+givenTree.GRSPR11_200301.t=0.0476925962097791;
+givenTree.Node2812.t=0;
+givenTree.143P15_199101.t=0.05397959086502289;
+givenTree.V62_199901.t=0;
+givenTree.Node2668.t=0.009023671476384727;
+givenTree.Node398.t=0.005408899567886617;
+givenTree.Node1526.t=0;
+givenTree.MI_Pat27_200101.t=0.04686444631307212;
+givenTree.Node1475.t=0.003513201611127652;
+givenTree.Node2483.t=0.02226442603212645;
+givenTree.Node1373.t=0.003533306562701688;
+givenTree.Node1071.t=0.003551618117813712;
+givenTree.DMG33_199812.t=0.03586865811257616;
+givenTree.Node905.t=0;
+givenTree.Node1509.t=0.03253487944518803;
+givenTree.KDR_pat159_199605.t=0.03622571646255804;
+givenTree.Node2447.t=0.01915375926156739;
+givenTree.Node1537.t=0.01648952780620823;
+givenTree.Node1642.t=0;
+givenTree.CA14702_200211.t=0.06090384494311062;
+givenTree.Node3023.t=0;
+givenTree.Node1527.t=0.01111129554904637;
+givenTree.Node2955.t=0.04678829150844024;
+givenTree.Pt3536_200201.t=0.007075985649961046;
+givenTree.Node1529.t=0;
+givenTree.KDR_pat62_199605.t=0.00557587726859158;
+givenTree.HG083_199901.t=0.0727046241335129;
+givenTree.Node3036.t=0.01006031542974333;
+givenTree.CCB_62_200501.t=0.1172836453719987;
+givenTree.Node339.t=0.009382860643436913;
+givenTree.MYIDU27_200401.t=0.08191465288829647;
+givenTree.Node2771.t=0;
+givenTree.HG097_199901.t=0.05610891527388506;
+givenTree.Node2731.t=0;
+givenTree.Node1524.t=0.005378521722862316;
+givenTree.PCF_Pat190_200101.t=0.04289511804127775;
+givenTree.Node1546.t=0;
+givenTree.CA9828_200108.t=0.02377862585884968;
+givenTree.CCB_4579_200501.t=0.112753213960546;
+givenTree.Pt5177_200201.t=0.03498667442501683;
+givenTree.Node1553.t=0.03420243837955714;
+givenTree.PCF_Pat107_200101.t=0.05778548992401136;
+givenTree.WEAU1_60_199001.t=0.05960158241890614;
+givenTree.Node1560.t=0;
+givenTree.Pt5160_200201.t=0.06273585370895371;
+givenTree.SLMT_UD595_200501.t=0.04708018539328901;
+givenTree.Node1568.t=0.03744441488971091;
+givenTree.CA1851_199809.t=0.07634173801234778;
+givenTree.Node2686.t=0.009832647987271195;
+givenTree.Node2407.t=0.005788847766077626;
+givenTree.Node2089.t=0;
+givenTree.Node1561.t=0.02048901230616786;
+givenTree.DB_SI3942_02_200201.t=0.007529842956552397;
+givenTree.dn49_200012.t=0.005250931176607056;
+givenTree.TRA1116_200101.t=0.03730701544666991;
+givenTree.Node2077.t=0.007054805994862081;
+givenTree.PSW_Pat12_199901.t=0.04983280748881153;
+givenTree.Node1525.t=0.007032800225817765;
+givenTree.Pt4041_200201.t=0.04407127379853232;
+givenTree.JA_5015_198701.t=0.03412951012260367;
+givenTree.N37_200301.t=0.04388195350589557;
+givenTree.Node2306.t=0.004857771849490767;
+givenTree.Node1543.t=0.005093149215416402;
+givenTree.Node1548.t=0.01325952945807408;
+givenTree.Node442.t=0.003507621083671499;
+givenTree.CH78_200101.t=0.02326168926123371;
+givenTree.Node1541.t=0.02821427741893716;
+givenTree.Node1551.t=0.006019456850144091;
+givenTree.DH019_200112.t=0.02239734910476555;
+givenTree.Pt4581_200201.t=0;
+givenTree.Node2840.t=0.01304252864207682;
+givenTree.Node1556.t=0.0199660085122331;
+givenTree.HG095_199901.t=0.04229805072084837;
+givenTree.Pt4530_200201.t=0.05924260918401233;
+givenTree.Pt3304_200201.t=0.06482220554795969;
+givenTree.GRSPR21_200301.t=0.05039204106748819;
+givenTree.KDR_pat150_199603.t=0.01557572523832846;
+givenTree.Node1554.t=0.01399308495007491;
+givenTree.CH54_200101.t=0.02653755516873995;
+givenTree.AP_32_200001.t=0.03020603408156521;
+givenTree.Node212.t=0.01657024282453455;
+givenTree.CA4384_199905.t=0.01570367755015074;
+givenTree.Node1478.t=0.01746484832910259;
+givenTree.ED_V26_199901.t=0.0442913582952633;
+givenTree.Node1450.t=0;
+givenTree.MYIDU25_200401.t=0.06541403703369668;
+givenTree.Node293.t=0.03230415854827939;
+givenTree.CCB_2214_200501.t=0.01577565055271033;
+givenTree.Node1468.t=0.03754034010071652;
+givenTree.SLMT_IVDU079_200501.t=0.02550333258804355;
+givenTree.CCB_4183_200501.t=0.0582861001222327;
+givenTree.ACTG347_0291_199706.t=0.04345096236915842;
+givenTree.Node1472.t=0.01946893488290047;
+givenTree.Pt3203_200201.t=0.0233134193502698;
+givenTree.Node299.t=0;
+givenTree.Node244.t=0.008307230640666123;
+givenTree.PCF_Pat138_200101.t=0.02969894041656202;
+givenTree.CA20981_200403.t=0.03260563450904737;
+givenTree.GRSPR30_200301.t=0.05064093823583386;
+givenTree.Node1462.t=0.008368223005674261;
+givenTree.CCB_2843_200501.t=0.04581369514725105;
+givenTree.Node149.t=0.004250315396680854;
+givenTree.Node300.t=0.01193577751029055;
+givenTree.Node1374.t=0;
+givenTree.Node1464.t=0.008234593474836946;
+givenTree.4001096_200401.t=0.004806739059954111;
+givenTree.Node68.t=0.003570355222789877;
+givenTree.Node1451.t=0.004189460222200079;
+givenTree.Node362.t=0.01568408515526898;
+givenTree.CA7061_200007.t=0.04235725126719696;
+givenTree.Node349.t=0.03997016676012397;
+givenTree.Node1454.t=0;
+givenTree.CA4329_199905.t=0.04422970224872722;
+givenTree.Node337.t=0;
+givenTree.Node1452.t=0.03057580067423418;
+givenTree.Node193.t=0;
+givenTree.BRRJ915_200208.t=0.06923063665680472;
+givenTree.Node249.t=0.05038637187707121;
+givenTree.4000918_200401.t=0.02556252653364068;
+givenTree.Node1465.t=0.0574797925523088;
+givenTree.Node1463.t=0.006659937095118423;
+givenTree.BREPM269_199901.t=0.07899171372509471;
+givenTree.Node2617.t=0.02365811813304425;
+givenTree.Node1459.t=0.02788228468081297;
+givenTree.Node2991.t=0;
+givenTree.Node254.t=0;
+givenTree.Pt3197_200201.t=0.03938892042731224;
+givenTree.Node326.t=0;
+givenTree.Node1491.t=0.01855372121602853;
+givenTree.Node1502.t=0.004847102736446771;
+givenTree.Node1498.t=0.01191769561639039;
+givenTree.MI_Pat15_200101.t=0.03917290383675245;
+givenTree.OMVB_RT_62_200301.t=0.04595975857301993;
+givenTree.BR04RS180_200401.t=0.05617361419925334;
+givenTree.Node2288.t=0;
+givenTree.Node2117.t=0.02120093624640304;
+givenTree.MYIDU4_200401.t=0;
+givenTree.Node3004.t=0.01382658981100179;
+givenTree.Node429.t=0.01423167488045161;
+givenTree.VT01_200201.t=0.02179891164747484;
+givenTree.Node2683.t=0.02085301016666557;
+givenTree.Node2219.t=0.04078314357456304;
+givenTree.Node2699.t=0.01398735350685849;
+givenTree.Node1505.t=0.006751313881127843;
+givenTree.Pt4522_200201.t=0.04307574883903182;
+givenTree.Node1510.t=0.004483445811433948;
+givenTree.CCB_1767_200501.t=0.04185918635330615;
+givenTree.Node1506.t=0.05622179973372269;
+givenTree.Node65.t=0.01074034061180679;
+givenTree.92BR026_199201.t=0.006671992777774607;
+givenTree.Node2085.t=0.01556036331070693;
+givenTree.Pt3290_200201.t=0.04764652796637409;
+givenTree.Node1476.t=0.01332969779845687;
+givenTree.MZ_98GEMZ002_199801.t=0.03454300544129706;
+givenTree.MI_Pat35_200101.t=0.0593576369381196;
+givenTree.AP_2_200001.t=0.06787045458523706;
+givenTree.Node1486.t=0.005648763646775494;
+givenTree.Node1499.t=0.01659057974220086;
+givenTree.BRRJ919_200208.t=0.04613298925894937;
+givenTree.Pt5690_200201.t=0.01426114356426819;
+givenTree.Node1488.t=0.01210335631202028;
+givenTree.BRRJ895_200208.t=0.04683559913714358;
+givenTree.Node2944.t=0.05757164377802953;
+givenTree.Node84.t=0.00399726104599899;
+givenTree.Node196.t=0;
+givenTree.Node2632.t=0.01871185677727058;
+givenTree.CHB168_200301.t=0.06133156881952617;
+givenTree.Node1494.t=0.01227179430878594;
+givenTree.CA2087_199810.t=0.0538534398027089;
+givenTree.dn83_200011.t=0.06788394095494066;
+givenTree.Node2446.t=0.009499872609307116;
+givenTree.CCB_733_200501.t=0.03558067903412315;
+givenTree.Node2650.t=0;
+givenTree.Node1487.t=0.01835719312581425;
+givenTree.380587g_199401.t=0.03033262080283523;
+givenTree.md4_199901.t=0.02714807877005339;
+givenTree.VT98_200201.t=0.04651756174179673;
+givenTree.MI_Pat34_200101.t=0.02420195697470641;
+givenTree.SM_02YE508_200201.t=0.04983159247244066;
+givenTree.Node123.t=0.01180676268383649;
+givenTree.Node1636.t=0.01570233438757442;
+givenTree.Node1639.t=0.03231297616605372;
+givenTree.TY_pat5_200201.t=0.09252675270194496;
+givenTree.Node121.t=0.01639711332528142;
+givenTree.SM_02YE507_200201.t=0.005093256937765483;
+givenTree.Node112.t=0.01048636942289393;
+givenTree.SM_01YE373_200101.t=0.01918056450141169;
+givenTree.Node1629.t=0.008708817267313679;
+givenTree.Node105.t=0.03124412769361847;
+givenTree.Node415.t=0;
+givenTree.EC35_199407.t=0.02768856990247873;
+givenTree.Node2256.t=0.009467235724186757;
+givenTree.HG077_199901.t=0.09281925460154496;
+givenTree.Node2722.t=0.008570746635407678;
+givenTree.CCB_4785_200501.t=0.03981956153486822;
+givenTree.Node1628.t=0.005186116111957505;
+givenTree.Node1634.t=0.007726020005009641;
+givenTree.ARG09_199701.t=0.03447932009235821;
+givenTree.Pt3552_200201.t=0.05635151792064553;
+givenTree.Node1606.t=0.003546254390850378;
+givenTree.PCF_Pat151_200101.t=0.0301117015793752;
+givenTree.Pt1561_200201.t=0.0720548930557887;
+givenTree.Node1618.t=0.03556241938605601;
+givenTree.JLB_Pat39_200006.t=0.07792243602568542;
+givenTree.Node109.t=0.01297026962204016;
+givenTree.SLMT_UD294_200501.t=0.02877880296273935;
+givenTree.Node1614.t=0.01571367582524543;
+givenTree.CH66_200101.t=0.06490180749651044;
+givenTree.Node3115.t=0.004490839864490237;
+givenTree.BRRJ900_200208.t=0.0350662794419752;
+givenTree.DB_SI3076_00_200001.t=0.01658785150405442;
+givenTree.PCF_Pat166_200101.t=0.0323678722723993;
+givenTree.Node1607.t=0.004029723243212707;
+givenTree.CCB_2141_200501.t=0.05046986561570271;
+givenTree.Node439.t=0.0125768486852356;
+givenTree.05_132879_200401.t=0.09547624243411724;
+givenTree.BR04RS116_200401.t=0.1106925023843041;
+givenTree.N66_200301.t=0.07886727801093243;
+givenTree.PCF_Pat26_200101.t=0.03235140612633224;
+givenTree.Node1635.t=0.03763365457481116;
+givenTree.MZ_98GEMZ003_199801.t=0.02252004103527277;
+givenTree.Node2303.t=0.005801456440176984;
+givenTree.Node1613.t=0.003140757769859133;
+givenTree.CCB_1064_200501.t=0.03133251252339754;
+givenTree.BRSP367_200208.t=0.08356108839480222;
+givenTree.Node1652.t=0.004567432076078163;
+givenTree.Node1679.t=0.008263583177682228;
+givenTree.Node2202.t=0;
+givenTree.JA_B183_198701.t=0.02564363325891209;
+givenTree.Node1661.t=0;
+givenTree.Node1605.t=0;
+givenTree.CA9856_200104.t=0.04411156701448727;
+givenTree.PCF_Pat68_200101.t=0.0467953808874752;
+givenTree.dn21_200008.t=0.04635883329793739;
+givenTree.CA4007_199901.t=0.03301412967279226;
+givenTree.Node1662.t=0.007554504014932416;
+givenTree.C200_198603.t=0.02850383118484458;
+givenTree.Node314.t=0;
+givenTree.Node1680.t=0.0197415621375169;
+givenTree.KDR_pat214_199602.t=0.07403955923440231;
+givenTree.Node2539.t=0;
+givenTree.02HNsmx2_200201.t=0.03661112815809659;
+givenTree.PCF_Pat54_200101.t=0.01191942386754636;
+givenTree.KDR_pat93_199602.t=0.04761742454408331;
+givenTree.DH002_200112.t=0.0572556551504533;
+givenTree.Node16.t=0.0550005282090832;
+givenTree.Node1647.t=0;
+givenTree.04AR151263_200401.t=0.09752762260761111;
+givenTree.Node2331.t=0.006756470249792083;
+givenTree.KDR_pat60_199604.t=0.03634917459250265;
+givenTree.PCF_Pat135_200101.t=0.03386812132316674;
+givenTree.MDS_02UANK099_200101.t=0.02710275457030058;
+givenTree.Node1655.t=0;
+givenTree.JLB_Pat89_200006.t=0.03433054762648478;
+givenTree.Node2854.t=0.00420930623626067;
+givenTree.Node1650.t=0.006924491373572375;
+givenTree.MDS_02UANK093_200101.t=0.01200501866716963;
+givenTree.EC23_199407.t=0.04756059417454096;
+givenTree.Node2746.t=0.02521100014311626;
+givenTree.36011_199607.t=0.04012084426411117;
+givenTree.33004_199607.t=0.03191205746396143;
+givenTree.VT84b_200201.t=0.1027681336871888;
+givenTree.Node1658.t=0.01188658010598624;
+givenTree.Node1648.t=0;
+givenTree.LV727DIP_199901.t=0.0345191713040066;
+givenTree.Node2339.t=0.02500802223778001;
+givenTree.Node194.t=0.01536329399058456;
+givenTree.CCB_2359_200501.t=0.05236075500187194;
+givenTree.Pt3785_200201.t=0.07188371739215696;
+givenTree.Node1649.t=0.007363678528057443;
+givenTree.MDS_02UAKV113_200101.t=0.01352080736963177;
+givenTree.Node152.t=0.004326735952545775;
+givenTree.Node377.t=0.02645181610865804;
+givenTree.CA4085_199903.t=0.03616113482600406;
+givenTree.CCB_1308_200501.t=0.05766535268760741;
+givenTree.BRP2101_200208.t=0.02748406021051955;
+givenTree.Node3084.t=0;
+givenTree.KDR_pat289_199606.t=0.03595180383716563;
+givenTree.Node2255.t=0.007893498384056768;
+givenTree.Node289.t=0.007174605735840264;
+givenTree.05_132913_200401.t=0.05171275336989756;
+givenTree.Node1565.t=0;
+givenTree.05_132877_200401.t=0.0712709293551092;
+givenTree.143P16_199104.t=0.009847509091050269;
+givenTree.Node2326.t=0;
+givenTree.Node1579.t=0.01170568892348118;
+givenTree.PCF_Pat67_200101.t=0.03787196520307317;
+givenTree.Node129.t=0.01527948566068997;
+givenTree.Node1587.t=0.0135839540890821;
+givenTree.CA6576_200005.t=0.04337963835672889;
+givenTree.HG007_199901.t=0.03589109100184759;
+givenTree.Node373.t=0.01772642250419427;
+givenTree.CA8075_200101.t=0.05753554848155637;
+givenTree.Node1584.t=0.003307333704443227;
+givenTree.VT77b_200201.t=0.06258388320616289;
+givenTree.MYIDU13_200401.t=0.01028111309939166;
+givenTree.Node2318.t=0.008421189820098778;
+givenTree.ED_V67_199901.t=0.04653377105046352;
+givenTree.Node316.t=0.01386357402248568;
+givenTree.DH011_200112.t=0.02029389959621352;
+givenTree.Node1573.t=0.006245707135541516;
+givenTree.MDS_02UANK081_200101.t=0.0135435890367527;
+givenTree.BRP2098_200208.t=0.02931544827891827;
+givenTree.Node2877.t=0.01667503762382153;
+givenTree.Node2091.t=0.003539284798364359;
+givenTree.Node157.t=0;
+givenTree.Node2252.t=0.04338396526236536;
+givenTree.Node1567.t=0.0105366874628082;
+givenTree.BRRJ922_200208.t=0.07399611261784414;
+givenTree.Node1566.t=0;
+givenTree.4004585_200401.t=0.04193230051076312;
+givenTree.JLB_Pat10_200006.t=0.007134281053605109;
+givenTree.Node342.t=0.01598732991821098;
+givenTree.Node1643.t=0.05548155309143312;
+givenTree.260Pt8_199511.t=0.02573290078231963;
+givenTree.Node1523.t=0;
+givenTree.Node276.t=0.01054494421650646;
+givenTree.Node2555.t=0.00390954892722568;
+givenTree.VT67_200201.t=0.01933523394733623;
+givenTree.Node1572.t=0.01506688526063441;
+givenTree.Node1576.t=0.01130298973907326;
+givenTree.Node2669.t=0.009218669952871079;
+givenTree.Node1583.t=0.01425469677533381;
+givenTree.PCF_Pat106_200101.t=0.03194497544901956;
+givenTree.Node115.t=0.0115700675365526;
+givenTree.Node98.t=0.02024335853025518;
+givenTree.Node1615.t=0.0105041607132067;
+givenTree.Node103.t=0.03096534988203314;
+givenTree.Node1522.t=0.005351879225368331;
+givenTree.SM_00YE084_200001.t=0.04602493260984507;
+givenTree.Node95.t=0.006846745715683235;
+givenTree.CCB_1203_200501.t=0.03286800636580516;
+givenTree.KDR_pat7_199605.t=0.04053257043582884;
+givenTree.Node126.t=0.008080726244503277;
+givenTree.CCB_2653_200501.t=0.08355874385758622;
+givenTree.CCB_1773_200501.t=0.05721606954978704;
+givenTree.ARG_53_200001.t=0.03292384710395233;
+givenTree.Node70.t=0.003387291118145347;
+givenTree.ARG_46_200001.t=0.02148791232750769;
+givenTree.Node1619.t=0.01886054753010913;
+givenTree.AP_ARRP037_200406.t=0.04423593431130459;
+givenTree.PCF_Pat24_200101.t=0.02700316712197829;
+givenTree.Node2655.t=0.006307366225004137;
+givenTree.VC_pat103_199901.t=0.03096648782741701;
+givenTree.Node94.t=0.002960697737228297;
+givenTree.ARG_48_200001.t=0.01131471121011365;
+givenTree.05_132912_200401.t=0.09191068682956927;
+givenTree.CA1526_199805.t=0.05039442287469163;
+givenTree.CCB_2415_200501.t=0.07998920708757172;
+givenTree.Node2947.t=0.01340833842031352;
+givenTree.Node1582.t=0.008444312941853677;
+givenTree.AC_59_200012.t=0.07710027997240818;
+givenTree.MI_Pat2_200101.t=0.06133064983646398;
+givenTree.IP_41_199603.t=0.03027043965226003;
+givenTree.Node2965.t=0.002842141247494612;
+givenTree.JLB_Pat63_200006.t=0.04610005744118761;
+givenTree.dn93_200011.t=0.06784203302919857;
+givenTree.Node2715.t=0.008688405885086976;
+givenTree.Node1598.t=0.012124286268025;
+givenTree.Node1608.t=0.006312386256030504;
+givenTree.Node1622.t=0.009895737444475765;
+givenTree.Node1610.t=0.03267367323648035;
+givenTree.Node106.t=0.01275046493653999;
+givenTree.Node2250.t=0.01364870554029388;
+givenTree.BRP2070_200104.t=0.01415585526390109;
+givenTree.Node1594.t=0;
+givenTree.VC_pat20_199901.t=0.03076254517895895;
+givenTree.Node1590.t=0.01139846981144759;
+givenTree.ED_V31_199901.t=0.02996273363948893;
+givenTree.Node370.t=0;
+givenTree.Node1879.t=0;
+givenTree.Node448.t=0.008206279711265184;
+givenTree.CCB_5318_200501.t=0.05719733312773752;
+givenTree.Node838.t=0.004832071351350603;
+givenTree.DMG58_199809.t=0.01598926524628121;
+givenTree.Node78.t=0.0287122329096979;
+givenTree.Node869.t=0.01906158494266192;
+givenTree.44011_199607.t=0.01101576834449396;
+givenTree.Node1911.t=0.001251932558691466;
+givenTree.PSW_Pat33_200201.t=0.06501907708550315;
+givenTree.05_132900_200401.t=0.0346345348742243;
+givenTree.EC28_199407.t=0.03213679249080004;
+givenTree.Node2529.t=0.02105480530983265;
+givenTree.CA6445_200004.t=0.0168616642363207;
+givenTree.Node1042.t=0.01307651794246702;
+givenTree.Node465.t=0.05105807465426094;
+givenTree.DB_SI7123_04_200401.t=0.0103316798878027;
+givenTree.Node949.t=0;
+givenTree.DH001_200112.t=0.06952688733520425;
+givenTree.Node878.t=0;
+givenTree.KDR_pat82_199605.t=0.02088849196264033;
+givenTree.Node861.t=0.003528065390307254;
+givenTree.Node86.t=0.007726482604989299;
+givenTree.Node288.t=0;
+givenTree.Node879.t=0;
+givenTree.ARG18_199701.t=0.02975269648882762;
+givenTree.Pt5683_200201.t=0;
+givenTree.Node695.t=0.007938439400694513;
+givenTree.Node69.t=0.01232617466418435;
+givenTree.Node715.t=0.04478992927535541;
+givenTree.BRP2020_200104.t=0.03498132588215527;
+givenTree.Node2287.t=0.003911347752393;
+givenTree.Node3028.t=0;
+givenTree.BRRJ892_200104.t=0;
+givenTree.Node672.t=0;
+givenTree.Node2092.t=0;
+givenTree.CCB_2246_200501.t=0.1113087794065167;
+givenTree.JLB_Pat59_200006.t=0.0369526689686391;
+givenTree.Node30.t=0.008409596969927038;
+givenTree.Node19.t=0.01330943195284726;
+givenTree.MDS_01UAKV167_200101.t=0;
+givenTree.Node2465.t=0;
+givenTree.Node2860.t=0.005121498440733799;
+givenTree.Node2178.t=0.002049743588631484;
+givenTree.Node542.t=0;
+givenTree.Node2652.t=0.006546504531149936;
+givenTree.Node750.t=0.01268533644775702;
+givenTree.Node704.t=0.009729551976084289;
+givenTree.Node2058.t=0.01161659828742308;
+givenTree.Node923.t=0.005215756788416848;
+givenTree.PCF_Pat104_200101.t=0.03657863283188498;
+givenTree.Node133.t=0;
+givenTree.Node2423.t=0.005358001549545112;
+givenTree.Node1184.t=0.009605030866146235;
+givenTree.Node3039.t=0.03507181584151385;
+givenTree.CB_2410_199801.t=0.04305297090345166;
+givenTree.IP_97CIRMF26_199701.t=0.03830887967577881;
+givenTree.PCF_Pat98_200101.t=0.040467653991172;
+givenTree.Pt3750_200201.t=0.04204737764992611;
+givenTree.IP_97CIRMF14_199701.t=0.03158235307229305;
+givenTree.Node2389.t=0;
+givenTree.Node2419.t=0.00314222803175566;
+givenTree.Node1176.t=0.01116442747284498;
+givenTree.Node416.t=0.0252569863130071;
+givenTree.ARG35_199701.t=0.0170239544288044;
+givenTree.Node1206.t=0.001559165167969787;
+givenTree.Node1203.t=0;
+givenTree.Node1281.t=0.02874293279974962;
+givenTree.Node2777.t=0.02163672415013352;
+givenTree.CCB_3866_200501.t=0;
+givenTree.DMG82_199808.t=0.03767450366269866;
+givenTree.PCF_Pat12_200101.t=0.02934858487624877;
+givenTree.Node1214.t=0.002710955347178225;
+givenTree.Node1284.t=0.01360810219706864;
+givenTree.Node2832.t=0.004170682071603616;
+givenTree.PCF_Pat150_200101.t=0.05516451470895886;
+givenTree.CCB_4665_200501.t=0.03402378520423079;
+givenTree.Node965.t=0.005119290577736761;
+givenTree.Node991.t=0.009713201669161238;
+givenTree.Node2314.t=0;
+givenTree.41002_199607.t=0.04154544977151711;
+givenTree.Node2762.t=0.02608233777134171;
+givenTree.Node2401.t=0.01134356354907809;
+givenTree.AP_ARRP031_200406.t=0.07172078388962067;
+givenTree.Node500.t=0.007826615035609021;
+givenTree.VT76_200201.t=0.04210942930487265;
+givenTree.Node2078.t=0.007213065093478456;
+givenTree.Node1063.t=0.03960054870257685;
+givenTree.KDR_pat279_199604.t=0.0468742425522318;
+givenTree.Pt4616_200201.t=0;
+givenTree.Node3011.t=0.01477114167866794;
+givenTree.Node1054.t=0.01568237779573928;
+givenTree.PSW_Pat43_200201.t=0.09662531676014056;
+givenTree.PSW_Pat9_199901.t=0.07966256986237405;
+givenTree.CCB_2329_200501.t=0.05181475410693952;
+givenTree.Node3106.t=0.004463909303483755;
+givenTree.CH34_200101.t=0.0467635892783595;
+givenTree.Node3069.t=0.04392401534731234;
+givenTree.Node648.t=0.00467546750087622;
+givenTree.CA16405_200306.t=0.04767842377683677;
+givenTree.Node506.t=0.00984483707476996;
+givenTree.VT18_200201.t=0.0349658425402069;
+givenTree.Node737.t=0.02314044603424516;
+givenTree.CA5184_199910.t=0.02162137817361763;
+givenTree.Node580.t=0;
+givenTree.Node3099.t=0.005999596083549285;
+givenTree.PCF_Pat157_200101.t=0.05949634603060471;
+givenTree.CH38_200101.t=0.03381689903204136;
+givenTree.Node496.t=0.007204245063506403;
+givenTree.260Pt28_199511.t=0.04400275644442556;
+givenTree.Node572.t=0.02019649519169654;
+givenTree.dn69_200006.t=0.04629950714188139;
+givenTree.DB_SI18_04_200401.t=0;
+givenTree.CA9885_200108.t=0.04062865807801384;
+givenTree.Node583.t=0.003124291635022182;
+givenTree.Node586.t=0.05782376028981807;
+givenTree.BRC1518_200208.t=0.03176558471649102;
+givenTree.PSW_Pat11_199901.t=0.03051399694050175;
+givenTree.EC22_199407.t=0.04146634047337431;
+givenTree.BRC1534_200208.t=0.04021428173018705;
+givenTree.PCF_Pat21_200101.t=0.04877050807127979;
+givenTree.DB_SI2394_04_200401.t=0.005063316517282096;
+givenTree.KDR_pat251_199605.t=0.01038108947427835;
+givenTree.HG016_199901.t=0.03393514527958517;
+givenTree.CA7971_200011.t=0.04344721781562799;
+givenTree.Node564.t=0.01135637551885127;
+givenTree.Node520.t=0;
+givenTree.BRP2087_200104.t=0.00550676081961632;
+givenTree.BR04RS374_200401.t=0.0600959539736322;
+givenTree.JLB_Pat42_200006.t=0.003925181198923587;
+givenTree.PSW_Pat36_200201.t=0.07406746084314883;
+givenTree.Node2972.t=0;
+givenTree.PSW_Pat22_200101.t=0.02255368983456532;
+givenTree.Node486.t=0.01055725186815784;
+givenTree.MDS_01UAKV258_200101.t=0.01349348259175997;
+givenTree.CA14700_200211.t=0.08445774692166261;
+givenTree.PSW_Pat34_200201.t=0.02420065923489835;
+givenTree.PCF_Pat62_200101.t=0.02877969149100496;
+givenTree.Node29.t=0.007204446142310664;
+givenTree.Node574.t=0.03884084753905666;
+givenTree.BrRJ092_200101.t=0.07456875459129476;
+givenTree.PSW_Pat37_200201.t=0.01767679559720836;
+givenTree.Node568.t=0.01467790004509182;
+givenTree.Node567.t=0.01238695602971969;
+givenTree.CA4882_199908.t=0.08990007350623823;
+givenTree.Node573.t=0.006250620789368599;
+givenTree.dn47_200012.t=0.03089684877847682;
+givenTree.CA5945_200002.t=0.08046328592063699;
+givenTree.CCB_5251_200501.t=0.0289455480135448;
+givenTree.BRRJ894_200104.t=0.05680830974629662;
+givenTree.Node2667.t=0;
+givenTree.Node591.t=0;
+givenTree.Node9.t=0.01165217614858971;
+givenTree.SLMT_UD394_200501.t=0.07154485939556668;
+givenTree.Node37.t=0;
+givenTree.Node15.t=0.006091707811349806;
+givenTree.Node598.t=0.0105592316945799;
+givenTree.33017_199607.t=0.07324562973810238;
+givenTree.EC33_199407.t=0.05429648782150708;
+givenTree.CA14152_200112.t=0.04033192432786837;
+givenTree.Node590.t=0.007344160221165737;
+givenTree.SP_UFC_D_199107.t=0.01282482633066722;
+givenTree.Node2260.t=0.01207527913112809;
+givenTree.Node2189.t=0.005265375461177821;
+givenTree.ARG03_199701.t=0.07320407840352397;
+givenTree.Node607.t=0.006648957574777307;
+givenTree.5077_198501.t=0.0308246944600489;
+givenTree.Node2278.t=0.0171094571558582;
+givenTree.Pt5650_200201.t=0.1192892176146393;
+givenTree.4001652_200401.t=0;
+givenTree.Node2381.t=0.01049528440895925;
+givenTree.Node592.t=0.007632858475557988;
+givenTree.KDR_pat77_199602.t=0.03167242263416215;
+givenTree.Node579.t=0.007024159785802432;
+givenTree.Node2983.t=0.01332760431441641;
+givenTree.Node593.t=0;
+givenTree.Node620.t=0;
+givenTree.Node495.t=0.003454347918005616;
+givenTree.Node584.t=0.01112905185443318;
+givenTree.Node2808.t=0.01869076924409625;
+givenTree.38009_199607.t=0.09061930744993454;
+givenTree.KDR_pat219_199602.t=0.03106335909230173;
+givenTree.Node2264.t=0;
+givenTree.CH104_200101.t=0.02749910097629907;
+givenTree.CA14284_200203.t=0.03341306679899846;
+givenTree.Node6.t=0;
+givenTree.HG001_199901.t=0.02280843947515107;
+givenTree.CA1261_199710.t=0.05540518102092742;
+givenTree.HG094_199901.t=0.01539959473214293;
+givenTree.Node2709.t=0.006459613601671551;
+givenTree.Pt5219_200201.t=0.02506944337978748;
+givenTree.PCF_Pat1_200101.t=0.04172040384450548;
+givenTree.Node595.t=0.03572869437521673;
+givenTree.Node603.t=0.02277427541411943;
+givenTree.ARG_37_200001.t=0.05438662132528524;
+givenTree.Node2392.t=0.01210887011192527;
+givenTree.Node2375.t=0;
+givenTree.143U206_199203.t=0.06022230559230484;
+givenTree.Node1946.t=0.007550313790573495;
+givenTree.Node532.t=0;
+givenTree.PSW_Pat8_199901.t=0.04839597137158266;
+givenTree.Node1978.t=0.007074794346832165;
+givenTree.4004406_200401.t=0;
+givenTree.02BR006_200401.t=0.04819860646478526;
+givenTree.PSW_Pat20_200001.t=0.05335061171549409;
+givenTree.PCF_Pat82_200101.t=0.02938605210027287;
+givenTree.Pt5762_200201.t=0.02506262482662275;
+givenTree.V2000_12_199801.t=0.05718721299269329;
+givenTree.Node2803.t=0.009360349770637332;
+givenTree.CCB_2975_200501.t=0.03026831886369503;
+givenTree.HG101_199901.t=0.04653510040470388;
+givenTree.Node2933.t=0.02361151801558477;
+givenTree.Node2612.t=0;
+givenTree.Node2041.t=0.003638273616447816;
+givenTree.DMG39_199810.t=0.04418113029038022;
+givenTree.Node2005.t=0.01679210646144142;
+givenTree.Node2823.t=0.02103422148544692;
+givenTree.BRP2401_200104.t=0;
+givenTree.AP_ARRP020_200406.t=0.06155145105662841;
+givenTree.n11_200301.t=0.01128666449232599;
+givenTree.CH94_200101.t=0.06252739304396071;
+givenTree.BRNE270_200208.t=0.04619220970875988;
+givenTree.Node2267.t=0.01890376263986058;
+givenTree.JA_4771_198701.t=0.01882116995021325;
+givenTree.Node1844.t=0.01299523975867491;
+givenTree.CA5318_199910.t=0.02626392917877142;
+givenTree.Node2352.t=0.01372654356131709;
+givenTree.V2000_10_199801.t=0.02220616852083455;
+givenTree.Pt5801_200201.t=0.01233015511630995;
+givenTree.Node411.t=0.08234288164169515;
+givenTree.BRP2128_200208.t=0.02721125344889766;
+givenTree.CP_Pat8_199712.t=0.03429472929258771;
+givenTree.Node1835.t=0.02684993863580245;
+givenTree.Node405.t=0.006324137945289488;
+givenTree.Node2908.t=0;
+givenTree.CCB_4815_200501.t=0.02691238977862811;
+givenTree.4000356_200401.t=0.004631458208710221;
+givenTree.IP_23_199712.t=0.01862264106543234;
+givenTree.CCB_2468_200501.t=0.005070558144213251;
+givenTree.Node401.t=0.003537913301571376;
+givenTree.EC27_199407.t=0.05788171613234055;
+givenTree.CA5631_200001.t=0.03816097603151152;
+givenTree.Node1862.t=0.01720391418760659;
+givenTree.PCF_Pat147_200101.t=0.03276152754925335;
+givenTree.Pt3571_200201.t=0.03090537016178662;
+givenTree.Node192.t=0;
+givenTree.CA17678_200312.t=0.0334290902843378;
+givenTree.Node2223.t=0;
+givenTree.Node2356.t=0.01799931783302545;
+givenTree.JLB_Pat97_200006.t=0.05163591156211215;
+givenTree.Cu100_200401.t=0.1190239965185828;
+givenTree.Node1003.t=0.02283705061295674;
+givenTree.MI_Pat82_200101.t=0.04038501211574464;
+givenTree.BE80_199910.t=0.01186592198136042;
+givenTree.Node227.t=0.01399804139042411;
+givenTree.Node1227.t=0.006825660943832404;
+givenTree.05_132876_200401.t=0.05485153246677707;
+givenTree.KDR_pat240_199603.t=0.03138362597572238;
+givenTree.LVMP1271_199901.t=0.04905283503494747;
+givenTree.PCF_Pat66_200101.t=0.02428975544353217;
+givenTree.MZ_03GEMZ001_200301.t=0.02264259992526478;
+givenTree.Node2184.t=0.004996823567952495;
+givenTree.PCF_Pat102_200101.t=0.05025452280832422;
+givenTree.DH016_200112.t=0.04396626214806899;
+givenTree.Node1820.t=0.01736864668224079;
+givenTree.GRSPR33_200301.t=0.04801973093319411;
+givenTree.Node1796.t=0.01114792560942945;
+givenTree.PCF_Pat61_200101.t=0.02530586021853793;
+givenTree.Node2034.t=0.01383150465183616;
+givenTree.4000425_200401.t=0.02011465793413574;
+givenTree.ACTG347_0035_199707.t=0.1024494798439019;
+givenTree.Node560.t=0.03763366378942517;
+givenTree.MI_Pat87_200101.t=0.01860327055994668;
+givenTree.PCF_Pat53_200101.t=0.05626041994276076;
+givenTree.Node507.t=0.00484380029856085;
+givenTree.Node403.t=0.003593089398773872;
+givenTree.Node2050.t=0.01035674896142141;
+givenTree.PSW_Pat24_200101.t=0.04443758987001721;
+givenTree.Node2153.t=0.005270246700005633;
+givenTree.VT68_200201.t=0.05614791828605896;
+givenTree.MI_Pat10_200101.t=0.03729956664345486;
+givenTree.PCF_Pat111_200101.t=0.03294177275091061;
+givenTree.Node663.t=0;
+givenTree.CA14482_200206.t=0.007436682176120774;
+givenTree.AP_ARRP038_200406.t=0.03248884545950653;
+givenTree.HG062_199901.t=0.002031454175306112;
+givenTree.Node2781.t=0;
+givenTree.4001518_200401.t=0.005051927395264142;
+givenTree.GRSPR15_200301.t=0.06636578152939424;
+givenTree.Node599.t=0.02317721465244298;
+givenTree.260Pt22_199511.t=0.0234728575336407;
+givenTree.Node862.t=0;
+givenTree.CP_Pat7_199712.t=0.0235354403900379;
+givenTree.PCF_Pat31_200101.t=0.04683982038800509;
+givenTree.Node1405.t=0.07323673996623489;
+givenTree.Node1417.t=0.02410997285900493;
+givenTree.Node444.t=0.008928751422479838;
+givenTree.Node1442.t=0.008996427619965986;
+givenTree.MDS_01UAKV245_200101.t=0.01810924650341788;
+givenTree.143H144_199301.t=0.05595429759196847;
+givenTree.38010_199607.t=0.1398074151286623;
+givenTree.4000364_200401.t=0.03185536318837101;
+givenTree.KDR_pat215_199602.t=0.02336283333900118;
+givenTree.Node1379.t=0.04008091412124971;
+givenTree.CH28_200101.t=0.05963780969324393;
+givenTree.Node435.t=0;
+givenTree.PCF_Pat176_200101.t=0.03074961047902715;
+givenTree.CCB_368_200501.t=0.02775703154654712;
+givenTree.CCB_1479_200501.t=0.03198484027290893;
+givenTree.05_132915_200401.t=0.05728257405411098;
+givenTree.Node2869.t=0.006453230881354187;
+givenTree.Node1375.t=0;
+givenTree.BRC1537_200208.t=0.09633994460987615;
+givenTree.CCB_5287_200501.t=0.04680257899905473;
+givenTree.Node2679.t=0.005665380663055723;
+givenTree.CA5626_200001.t=0.05211030827468308;
+givenTree.Node1482.t=0.01006878946018087;
+givenTree.CCB_5099_200501.t=0.05198179848689944;
+givenTree.dn57_200001.t=0.03844945681658977;
+givenTree.CCB_49_200501.t=0.07349090500396979;
+givenTree.Node1270.t=0.1059864754578363;
+givenTree.Node1162.t=0.02317520485936108;
+givenTree.RR_MAD_UF113_200501.t=0;
+givenTree.Node1249.t=0.01417505312490522;
+givenTree.607000236_200101.t=0.0688116355907188;
+givenTree.Node1226.t=0.003957227312685518;
+givenTree.MYIDUA8_200401.t=0.03041651085102427;
+givenTree.Node1200.t=0;
+givenTree.KDR_pat13_199604.t=0.05244224589476023;
+givenTree.Node2391.t=0.01010975147983907;
+givenTree.Node2564.t=0.03691278624264008;
+givenTree.Pt7574_200201.t=0;
+givenTree.VC_pat296_199901.t=0.02066801667253859;
+givenTree.PCF_Pat179_200101.t=0.07053397049882441;
+givenTree.ACTG320_462_199602.t=0.09154101278841459;
+givenTree.ARG05_199701.t=0.05094771845830019;
+givenTree.CH166_200101.t=0.1304081067345859;
+givenTree.Node1391.t=0.01989820870866597;
+givenTree.Node2176.t=0;
+givenTree.Node2448.t=0.02720384388724371;
+givenTree.Node462.t=0.003925075076885917;
+givenTree.4000365_200401.t=0.05117496340834481;
+givenTree.Node174.t=0.01384336124035755;
+givenTree.Node2394.t=0;
+givenTree.PCF_Pat200_200101.t=0.02753998142429285;
+givenTree.PCF_Pat158_200101.t=0.01791541621281102;
+givenTree.PCF_Pat52_200101.t=0.04356389335951908;
+givenTree.PCF_Pat120_200101.t=0.01480224249801855;
+givenTree.PCF_Pat162_200101.t=0.03472765548771554;
+givenTree.Node1664.t=0.009325854805290057;
+givenTree.93US144_200111.t=0.03153115329940747;
+givenTree.MI_Pat90_200101.t=0.04659329227112355;
+givenTree.Pt6249_200201.t=0.01029136301614835;
+givenTree.Node461.t=0;
+givenTree.Node2248.t=0;
+givenTree.Node425.t=0.02875292651563094;
+givenTree.Node1735.t=0.003596829269242187;
+givenTree.JA_4029_198701.t=0.01048497672089514;
+givenTree.Node489.t=0.007636378634014586;
+givenTree.JLB_Pat13_200006.t=0.04572786538855261;
+givenTree.Node2390.t=0.00817300363480432;
+givenTree.DMG14_199804.t=0.05312686367357355;
+givenTree.Node1706.t=0;
+givenTree.Node1673.t=0;
+givenTree.Node31.t=0;
+givenTree.PCF_Pat46_200101.t=0.07469477501990301;
+givenTree.CA4775_199907.t=0.0293221826431068;
+givenTree.Node1887.t=0.007595669379783391;
+givenTree.dn85_200002.t=0.01607844256449589;
+givenTree.Node463.t=0.0109889604083034;
+givenTree.CCB_1901_200501.t=0.04679671021971294;
+givenTree.MYIDU29_200401.t=0.02691529634613522;
+givenTree.Node1497.t=0.007171767582659544;
+givenTree.GRSPR50_200301.t=0.01645046707243314;
+givenTree.Node451.t=0.03421972437720266;
+givenTree.Node2160.t=0.01261276281601762;
+givenTree.Node1536.t=0.01513703518694619;
+givenTree.KDR_pat136_199602.t=0.007739404698645746;
+givenTree.Node1623.t=0;
+givenTree.Node1631.t=0.02977295250749697;
+givenTree.PCF_Pat50_200101.t=0.03674619837995087;
+givenTree.Node1691.t=0.003537946159511922;
+givenTree.KDR_pat244_199605.t=0.01861425710643547;
+givenTree.DMG28_199807.t=0.03219379242987462;
+givenTree.Node422.t=0.01392837524357381;
+givenTree.JLB_Pat44_200006.t=0.06472288031556976;
+givenTree.Node1595.t=0.01789654499842118;
+givenTree.SM_01YE395_200101.t=0.01356011145075253;
+givenTree.Node1591.t=0;
+givenTree.Node557.t=0.007486730501215458;
+givenTree.260Pt11_199511.t=0.03628386368089597;
+givenTree.PCF_Pat99_200101.t=0.05118688522925287;
+givenTree.Y10443_200001.t=0.03207688167710075;
+givenTree.Node3050.t=0.007191485485883898;
+givenTree.MI_Pat14_200101.t=0.03827628212299017;
+givenTree.Node1940.t=0.006972056865058348;
+givenTree.CCB_3774_200501.t=0.02459582026897318;
+givenTree.BRC1549_200208.t=0.06006349006012817;
+givenTree.Node2304.t=0.007057537511665239;
+givenTree.Node1974.t=0;
+givenTree.BRBS467_200104.t=0.02361195686171632;
+givenTree.PCF_Pat144_200101.t=0.06280584494726282;
+givenTree.dn14_200010.t=0.04647345581224467;
+givenTree.ACTG347_0386_199705.t=0.03192222370102716;
+givenTree.ACTG347_0009_199707.t=0.0312697420961794;
+givenTree.CA4059_199903.t=0.05738930190020265;
+givenTree.Node2677.t=0.01539354529022055;
+givenTree.Node1981.t=0;
+givenTree.CA18421_200403.t=0.01821349772248858;
+givenTree.Node1670.t=0.003643156324902723;
+givenTree.KDR_pat235_199602.t=0.005160640850662025;
+givenTree.CA8077_200101.t=0.05500936652533464;
+givenTree.Node2682.t=0;
+givenTree.DH013_200112.t=0.01033887365492392;
+givenTree.Node2438.t=0;
+givenTree.Node1968.t=0.05790091477292289;
+givenTree.CCB_3454_200501.t=0.06651055618311505;
+givenTree.Node1960.t=0.01282520364579195;
+givenTree.Node240.t=0.01462922336628587;
+givenTree.PCF_Pat2_200101.t=0.0263638253280998;
+givenTree.Node1956.t=0;
+givenTree.PCF_Pat18_200101.t=0.03034873598741674;
+givenTree.Node1942.t=0;
+givenTree.Node2919.t=0.007931203824449038;
+givenTree.WR27_198801.t=0.07121229599761308;
+givenTree.CCB_4332_200501.t=0.04167353481960331;
+givenTree.02AR114146_200201.t=0.06734393853728834;
+givenTree.Node260.t=0.03491595996293588;
+givenTree.PCF_Pat108_200101.t=0.03277396422224749;
+givenTree.Node1941.t=0;
+givenTree.Node1971.t=0.02285146922483616;
+givenTree.Node3049.t=0.007173003894487285;
+givenTree.Node1963.t=0.01435702918041965;
+givenTree.BRNE272_200208.t=0.05070112391808699;
+givenTree.4002761_200401.t=0.02272099860059089;
+givenTree.Pt7537_200201.t=0.08411146053008943;
+givenTree.Node1959.t=0;
+givenTree.CCB_4355_200501.t=0.03910579796980952;
+givenTree.AS_BER_199801.t=0.01784226392690954;
+givenTree.Node1996.t=0.01546017952053077;
+givenTree.Cu19_200401.t=0.02660319477483993;
+givenTree.Node2625.t=0.01001850061758217;
+givenTree.Node2006.t=0.02580821650717452;
+givenTree.CCB_3726_200501.t=0.1173127606849688;
+givenTree.Node2868.t=0.007958866288447152;
+givenTree.Node1997.t=0.005661068579137075;
+givenTree.HG053_199901.t=0.01569073565090517;
+givenTree.Node2469.t=0.03363370139488056;
+givenTree.JLB_Pat6_200006.t=0.03843239820021603;
+givenTree.Node2579.t=0.004893339248107266;
+givenTree.CCB_27_200501.t=0.05776335528723985;
+givenTree.Node2218.t=0;
+givenTree.MI_Pat20_200101.t=0.03674146310114225;
+givenTree.Node1995.t=0;
+givenTree.PO_Pt6_199007.t=0.02106341251240133;
+givenTree.Node2383.t=0.008082016528004322;
+givenTree.Node2003.t=0.01217157254169092;
+givenTree.VC_pat252_199901.t=0.09604063799923408;
+givenTree.43003_199607.t=0.05503431498473681;
+givenTree.Node2012.t=0;
+givenTree.4002566_200401.t=0.03059148391691141;
+givenTree.GRSPR55_200301.t=0.0233354454811349;
+givenTree.Node2227.t=0.005776330571705295;
+givenTree.VT04_200201.t=0.04326625719417428;
+givenTree.PCF_Pat3_200101.t=0.02851114999178745;
+givenTree.Node3008.t=0.003549277253047837;
+givenTree.Node2296.t=0.01610478749378751;
+givenTree.CCB_3577_200501.t=0.07041592858360704;
+givenTree.Node1984.t=0.009091693887023602;
+givenTree.Node1980.t=0;
+givenTree.Node1979.t=0.006372642341328137;
+givenTree.Node1986.t=0.01986547009647167;
+givenTree.Node2279.t=0;
+givenTree.Node2696.t=0.009701786871033135;
+givenTree.Node1989.t=0.01838810830576803;
+givenTree.Node1998.t=0.09050804912324917;
+givenTree.N33_200301.t=0.00560667558979788;
+givenTree.Node2455.t=0.01109596306760593;
+givenTree.Node2466.t=0.03027166614020235;
+givenTree.N32_200301.t=0.01127299384985625;
+givenTree.DMG54_199807.t=0.03927219553339655;
+givenTree.Node1991.t=0.02819675093230568;
+givenTree.VT37_200201.t=0.02518502535092157;
+givenTree.DMG97_199802.t=0.05941752865004428;
+givenTree.PCF_Pat124_200101.t=0.01737347457108401;
+givenTree.BRP2133_200208.t=0.02286351488604629;
+givenTree.Node1945.t=0.02016470300354615;
+givenTree.Node1672.t=0.003638711409820573;
+givenTree.4000428_200401.t=0.01049477959899544;
+givenTree.Node2163.t=0.004974389591711215;
+givenTree.DMG56_199807.t=0.02167431208882354;
+givenTree.Node1895.t=0.0100349166067638;
+givenTree.Node264.t=0;
+givenTree.Node1906.t=0.0216268839804123;
+givenTree.Node1907.t=0.05520224535584009;
+givenTree.Node2139.t=0;
+givenTree.Node2100.t=0.008442190193082894;
+givenTree.Node2097.t=0.01816577802085126;
+givenTree.Node1896.t=0.003665951781683554;
+givenTree.Node2831.t=0.01785478018666134;
+givenTree.KDR_pat24_199605.t=0.04368954660580891;
+givenTree.BRRJ819_200104.t=0.005646130659061803;
+givenTree.PCF_Pat63_200101.t=0.02791788436782036;
+givenTree.Node1920.t=0.003312046446798508;
+givenTree.Node1852.t=0;
+givenTree.Node2704.t=0;
+givenTree.Node1923.t=0.02473761910832604;
+givenTree.IP_5_199707.t=0.01689874159394823;
+givenTree.SLMT_UD452_200501.t=0;
+givenTree.Node2337.t=0.004036257398487069;
+givenTree.KDR_pat259_199607.t=0.0312780556298546;
+givenTree.IP_26_199612.t=0.02953511103571371;
+givenTree.DMG47_199810.t=0.04749542012691797;
+givenTree.Node2140.t=0.009400823090238862;
+givenTree.KDR_pat206_199603.t=0.03134912814710804;
+givenTree.DB_SI3099_01_200101.t=0.05790180124646449;
+givenTree.Node1913.t=0.01916224254836513;
+givenTree.Node1899.t=0.01312140030382403;
+givenTree.Node1853.t=0;
+givenTree.Node2172.t=0.01571375324091425;
+givenTree.dn87_200008.t=0.08790682744061389;
+givenTree.BRP2018_200104.t=0.1035690309408534;
+givenTree.Node2161.t=0;
+givenTree.PSW_Pat23_200101.t=0.0116082940472938;
+givenTree.Node2155.t=0;
+givenTree.Node1897.t=0;
+givenTree.AP_ARRP023_200406.t=0.1084153159797979;
+givenTree.PSW_Pat31_200201.t=0.03636805051248534;
+givenTree.Node2149.t=0.008889948921715594;
+givenTree.Node2147.t=0.01774684484391563;
+givenTree.dn80_200008.t=0.01536328184336364;
+givenTree.Node1898.t=0;
+givenTree.Node1903.t=0.01508084631204118;
+givenTree.dn55_200009.t=0;
+givenTree.PCF_Pat113_200101.t=0.02606142648713019;
+givenTree.PCF_Pat73_200101.t=0.03966504459576173;
+givenTree.HG087_199901.t=0.06793295068170019;
+givenTree.Node1931.t=0.02304169443057672;
+givenTree.N69_200301.t=0.05910817703989073;
+givenTree.DB_SI6515_04_200401.t=0.04054099553782713;
+givenTree.Node1671.t=0;
+givenTree.IP_21_199705.t=0.02286157587083432;
+givenTree.Pt4583_200201.t=0.06277660140703285;
+givenTree.Node208.t=0.005209799762148286;
+givenTree.Node1947.t=0.005531511053233966;
+givenTree.Node1935.t=0.01036962520304279;
+givenTree.Node219.t=0.01223328060591262;
+givenTree.Node202.t=0;
+givenTree.Node1943.t=0.00480039644473095;
+givenTree.Node1952.t=0.02596872237275833;
+givenTree.DB_SI7918_02_200201.t=0.03243131568060057;
+givenTree.Node228.t=0.02742889638369305;
+givenTree.CCB_1137_200501.t=0.03028678640631265;
+givenTree.Node2923.t=0.004892691485783985;
+givenTree.Node1950.t=0.02651906091584159;
+givenTree.AP_ARRP039_200406.t=0.06127327932716373;
+givenTree.KDR_pat55_199604.t=0.01519076504381444;
+givenTree.DB_SI6423_02_200201.t=0.01119070342485001;
+givenTree.DB_SI6424_02_200201.t=0.03757390212682327;
+givenTree.SLMT_UD517_200501.t=0.04146485071254866;
+givenTree.Node2898.t=0;
+givenTree.CCB_1739_200501.t=0.0802107187134348;
+givenTree.Node1928.t=0.03163075097245306;
+givenTree.Node1894.t=0;
+givenTree.Node134.t=0.009289498384181033;
+givenTree.Node1921.t=0;
+givenTree.Node179.t=0;
+givenTree.Node1922.t=0.01114807810806284;
+givenTree.Node309.t=0.005151596651791757;
+givenTree.PCF_Pat4_200101.t=0.07225526655985327;
+givenTree.BRSP382_200208.t=0.09459184345899234;
+givenTree.Node2441.t=0.01764914956036405;
+givenTree.Node2231.t=0.01659893806427599;
+givenTree.BRCN14_200208.t=0.09001776994260259;
+givenTree.Node1967.t=0.007578679471444378;
+givenTree.PCF_Pat51_200101.t=0.03516505803707366;
+givenTree.DB_SI2063_00_200001.t=0.003322381980971708;
+givenTree.Node203.t=0.009338684487663194;
+givenTree.Node1932.t=0.003335530016405801;
+givenTree.Node2194.t=0;
+givenTree.BrRJ007_200101.t=0.01203965165659823;
+givenTree.PCF_Pat32_200101.t=0.03515182004178138;
+givenTree.Node3053.t=0.03363964733887503;
+givenTree.Node2653.t=0.00382033863818169;
+givenTree.PSW_Pat30_200101.t=0.02979990990627236;
+givenTree.N06_200301.t=0.05178868738425779;
+givenTree.Node526.t=0;
+givenTree.04WK7_HIV_1_wk_200401.t=0.03216451192553036;
+givenTree.PCF_Pat145_200101.t=0.04721096238982669;
+givenTree.05_132921_200401.t=0.08696336513125355;
+givenTree.Node3010.t=0;
+givenTree.Pt4617_200201.t=0;
+givenTree.PSW_Pat7_199901.t=0.02926791159971494;
+givenTree.Node524.t=0.006918591035332167;
+givenTree.VHE_Pat30_200101.t=0.01123528878651369;
+givenTree.PCF_Pat79_200101.t=0.08353393349914932;
+givenTree.PSW_Pat46_200201.t=0.02974353000815604;
+givenTree.PSW_Pat29_200101.t=0.04818709597857821;
+givenTree.Node2755.t=0;
+givenTree.Node531.t=0.003827809052230206;
+givenTree.4002432_200401.t=0.06615262721424738;
+givenTree.Node406.t=0;
+givenTree.Node535.t=0.02491309978446349;
+givenTree.Node2406.t=0.007342904278387112;
+givenTree.Node2228.t=0.01569973974286346;
+givenTree.05_132878_200401.t=0.07332667258669291;
+givenTree.PSW_Pat10_199901.t=0.04265350160147964;
+givenTree.PSW_Pat14_200001.t=0.03608095382599612;
+givenTree.CH53_200101.t=0.03136646970990181;
+givenTree.CA7965_200011.t=0.0192186964963482;
+givenTree.Node511.t=0.07950592208503521;
+givenTree.Node2937.t=0;
+givenTree.Node510.t=0.02021943484826855;
+givenTree.Node516.t=0;
+givenTree.Node2769.t=0.008052879597870577;
+givenTree.Pt5066_200201.t=0.1114180060024465;
+givenTree.Node497.t=0.001101450359765371;
+givenTree.Node538.t=0.009358516017761442;
+givenTree.DMG31_199809.t=0.0178247455545161;
+givenTree.PSW_Pat32_200201.t=0.05062289917750747;
+givenTree.4003707_200401.t=0.03581387342135393;
+givenTree.PSW_Pat18_200001.t=0.03039504577734119;
+givenTree.04LSK7_200401.t=0;
+givenTree.Node2131.t=0;
+givenTree.Node508.t=0.01556089294883999;
+givenTree.Node2528.t=0;
+givenTree.PCF_Pat129_200101.t=0.03593898203004484;
+givenTree.Pt3258_200201.t=0.003583543024746112;
+givenTree.PSW_Pat40_200201.t=0.0263257293890638;
+givenTree.Node509.t=0.01337543541771181;
+givenTree.CA4289_199904.t=0.06119813395095744;
+givenTree.Node2293.t=0.02702212254614922;
+givenTree.PCF_Pat149_200101.t=0.03709167062972835;
+givenTree.Node3067.t=0.01607393244059723;
+givenTree.Node553.t=0.006307691671492599;
+givenTree.Node2875.t=0;
+givenTree.KDR_pat31_199603.t=0.03697738538362354;
+givenTree.PSW_Pat1_199802.t=0.01189471742909907;
+givenTree.Node552.t=0.006218199873999031;
+givenTree.Node523.t=0;
+givenTree.PSW_Pat38_200201.t=0.02426715829934299;
+givenTree.BRRJ898_200208.t=0.07716405307564042;
+givenTree.CCB_3192_200501.t=0.04549590680605742;
+givenTree.Node118.t=0.003174764912923741;
+givenTree.Node2706.t=0.005872143330568277;
+givenTree.Node2181.t=0.01468272560280875;
+givenTree.PSW_Pat27_200101.t=0.005978789210885547;
+givenTree.Node519.t=0;
+givenTree.MZ_03GEMZ013_200301.t=0.03175679761330356;
+givenTree.Node521.t=0;
+givenTree.MI_Pat83_200101.t=0.007326233207018995;
+givenTree.Node475.t=0.00494059436197431;
+givenTree.PSW_Pat4_199802.t=0.01647420873877254;
+givenTree.Node2846.t=0.003609141977931415;
+givenTree.HG078_199901.t=0.01805855978444206;
+givenTree.PSW_Pat26_200101.t=0.00592393044199211;
+givenTree.Node529.t=0.01481948352236978;
+givenTree.PSW_Pat15_200001.t=0.05317266296765411;
+givenTree.38020_199607.t=0.1001379369322505;
+givenTree.MI_Pat25_200101.t=0.06765686161249782;
+givenTree.04KMH5_200401.t=0.03591449755116706;
+givenTree.CA14484_200206.t=0.08565832050607108;
+givenTree.CCB_2469_200501.t=0.0104577290404707;
+givenTree.04KYR8_200401.t=0.1067100347087148;
+givenTree.Node539.t=0.01595554335723682;
+givenTree.Node450.t=0.01707276825133412;
+givenTree.Node541.t=0.004742929395612491;
+givenTree.JLB_Pat7_200006.t=0.05962208475561526;
+givenTree.Node472.t=0.02490194393015019;
+givenTree.04KJin8_1955_200401.t=0.02231127837540787;
+givenTree.Node2976.t=0.004802922133688094;
+givenTree.Node2299.t=0.02248505540006131;
+givenTree.Node522.t=0;
+givenTree.Node558.t=0.005782796159906024;
+givenTree.Node549.t=0.01309783028907714;
+givenTree.Node546.t=0.004495610801256808;
+givenTree.Node530.t=0;
+givenTree.MZ_03GEMZ015_200301.t=0.01802642735811563;
+givenTree.HG085_199901.t=0.03075533171269344;
+givenTree.JA_B304_198701.t=0.08064173996329296;
+givenTree.Node2105.t=0.02697953235184911;
+givenTree.JLB_Pat56_200006.t=0.05420964820142899;
+givenTree.Pt5795_200201.t=0.0143071320000294;
+givenTree.Node2639.t=0.00553897406544404;
+givenTree.BRBS530_200104.t=0.06040522596228207;
+givenTree.Node2031.t=0.0090150720444817;
+givenTree.VT12_200201.t=0.04424847825023764;
+givenTree.Node2644.t=0.05310839732482373;
+givenTree.Node2010.t=0.01391977611010943;
+givenTree.CA9897_200105.t=0.0598350209615801;
+givenTree.CA5704_200001.t=0.0207432202259764;
+givenTree.IP_14_199712.t=0.02671011335026237;
+givenTree.PCF_Pat165_200101.t=0.02863900121463638;
+givenTree.HG019_199901.t=0.03092939119829041;
+givenTree.MDS_02AZ045_199901.t=0;
+givenTree.Node2175.t=0.0134504447390136;
+givenTree.JLB_Pat38_200006.t=0.0661874538679611;
+givenTree.CA478_199101.t=0.02426588074975492;
+givenTree.CA9805_200109.t=0.03290785942326416;
+givenTree.Node2144.t=0;
+givenTree.PCF_Pat109_200101.t=0.02849769490352603;
+givenTree.Node2027.t=0.004337350052964007;
+givenTree.Node283.t=0.03716880666490708;
+givenTree.Node2035.t=0.01448469420620277;
+givenTree.05_132886_200401.t=0.07138140289074028;
+givenTree.Node456.t=0.01479553394940264;
+givenTree.Node2013.t=0.01433147675425283;
+givenTree.Pt3239_200201.t=0.01507072925659091;
+givenTree.CA4343_199805.t=0.06282252349398611;
+givenTree.Brp066_199612.t=0.0742682221339666;
+givenTree.Node2583.t=0.003813903519650776;
+givenTree.BRC1564_200208.t=0.06355035825540242;
+givenTree.Node2738.t=0.006409612563629211;
+givenTree.PCF_Pat188_200101.t=0.02180727193870845;
+givenTree.Node2014.t=0.02500457886662915;
+givenTree.Node184.t=0.01026606595934259;
+givenTree.PCF_Pat103_200101.t=0.06365028119948447;
+givenTree.Pt5543_200201.t=0.03893752328612708;
+givenTree.Node102.t=0;
+givenTree.Node2286.t=0;
+givenTree.PCF_Pat87_200101.t=0.02727215207673585;
+givenTree.Node2022.t=0.01963029517545923;
+givenTree.Node1994.t=0;
+givenTree.Node2011.t=0;
+givenTree.Node2019.t=0.02246187247710826;
+givenTree.SLMT_IVDU168_200501.t=0.03138266532875648;
+givenTree.RR_MAD_HF003_200501.t=0.08704872972338451;
+givenTree.CCB_3570_200501.t=0.0735348031559985;
+givenTree.Node2028.t=0.006697781253412852;
+givenTree.Node2026.t=0;
+givenTree.GRSPR81_200301.t=0.07477628896299267;
+givenTree.JLB_Pat94_200006.t=0.0394518819036252;
+givenTree.05_132887_200401.t=0.05425695291024121;
+givenTree.CA9960_200107.t=0.03336792339327264;
+givenTree.CH23_200101.t=0.05683692614062258;
+givenTree.HG076_199901.t=0.02075234407665398;
+givenTree.Node1669.t=0;
+givenTree.DMG46_199808.t=0.06383153704562222;
+givenTree.DMG43_199809.t=0.066173511133757;
+givenTree.Node2025.t=0.003598104501188617;
+givenTree.Node1977.t=0;
+givenTree.4000427_200401.t=0.05697706983221549;
+givenTree.Node2883.t=0.00974428670967724;
+givenTree.Node2054.t=0.01328021042710613;
+givenTree.Node2095.t=0;
+givenTree.Node2113.t=0.02066762355657684;
+givenTree.Node1668.t=0;
+givenTree.Node1604.t=0.0177315496481515;
+givenTree.Node2051.t=0.01734244943711027;
+givenTree.CCB_4799_200501.t=0.05295733230670735;
+givenTree.PCF_Pat13_200101.t=0.02427344057029183;
+givenTree.A012_198901.t=0.01710064031850414;
+givenTree.JA_1153_198701.t=0.03545940709332201;
+givenTree.IP_29_199707.t=0.04328202135801722;
+givenTree.Node2410.t=0.009729258223655782;
+givenTree.Node22.t=0.007079919334156714;
+givenTree.CH21_200101.t=0.05564795318526016;
+givenTree.Node2061.t=0.01682916797275292;
+givenTree.Node2042.t=0.02809022112564743;
+givenTree.VT32_200201.t=0.06176747958431265;
+givenTree.Node2038.t=0.02501206317406711;
+givenTree.CCB_183_200501.t=0.05813411326171101;
+givenTree.Node2323.t=0.01207639096248714;
+givenTree.PCF_Pat117_200101.t=0.03440226614493347;
+givenTree.Node2059.t=0.006431312340668328;
+givenTree.ea1_199901.t=0;
+givenTree.bc3_199901.t=0;
+givenTree.Node2045.t=0.0227016643027697;
+givenTree.Node3104.t=0;
+givenTree.Node2103.t=0.005566603411379443;
+givenTree.Node2110.t=0;
+givenTree.Node2109.t=0;
+givenTree.PCF_Pat175_200101.t=0.04165873558801473;
+givenTree.CA18380_200402.t=0.03504838231930162;
+givenTree.VHE_Pat28_200101.t=0.04909692744155136;
+givenTree.Node3120.t=0.004494471386513259;
+givenTree.Node2046.t=0;
+givenTree.SLMT_UD549_200501.t=0.02428309933182317;
+givenTree.CCB_2867_200501.t=0.0261796234372239;
+givenTree.HE_199201.t=0.04647554306675425;
+givenTree.BrRJ011_200101.t=0;
+givenTree.Node376.t=0.007338644557143338;
+givenTree.Node885.t=0.04340703244584218;
+givenTree.Node382.t=0.0131356589387581;
+givenTree.Node389.t=0.07139924779605053;
+givenTree.CCB_2547_200501.t=0.0623111201742312;
+givenTree.Node3110.t=0;
+givenTree.Node3114.t=0;
+givenTree.MI_Pat59_200101.t=0.03281575721618778;
+givenTree.05_132866_200401.t=0.0608677147791139;
+givenTree.dn26_200004.t=0;
+givenTree.Node910.t=0.01209868504646124;
+givenTree.Node2159.t=0.02035748357734257;
+givenTree.Node899.t=0.006434144452681916;
+givenTree.GRSPR41_200301.t=0.02866693194828441;
+givenTree.Node889.t=0.009828550165386437;
+givenTree.PCF_Pat20_200101.t=0.0175255633928803;
+givenTree.Node880.t=0.003660270034375987;
+givenTree.05_132870_200401.t=0.03076809820544324;
+givenTree.Pt7621_200201.t=0.07305161019745715;
+givenTree.RR_MAD_TO193_200501.t=0;
+givenTree.dn05_200001.t=0.06885224347959371;
+givenTree.Node767.t=0;
+givenTree.CCB_3766_200501.t=0.005171663717661937;
+givenTree.Brp011_199612.t=0;
+givenTree.Node875.t=0.03073387302285933;
+givenTree.AP_ARRP019_200406.t=0.09066451251602572;
+givenTree.MDS_02UANK090_200101.t=0.03183450203196962;
+givenTree.Node2740.t=0.01670398600529851;
+givenTree.36016_199607.t=0.09746170482980354;
+givenTree.GOL0_200401.t=0.08659096278364087;
+givenTree.Node884.t=0.01785438524506353;
+givenTree.Node2690.t=0;
+givenTree.CCB_4884_200501.t=0.06785049636835769;
+givenTree.Node371.t=0.0145014245217455;
+givenTree.Node837.t=0.007085921951821057;
+givenTree.MDS_02UAKV108_200101.t=0.04089267788705491;
+givenTree.Node387.t=0.008810402075293428;
+givenTree.Node703.t=0;
+givenTree.Node381.t=0.004855629237004372;
+givenTree.Node867.t=0.007267810609641632;
+givenTree.Node881.t=0.02111301116746762;
+givenTree.V2000_3_199801.t=0.07805574621668647;
+givenTree.Node873.t=0;
+givenTree.KDR_pat200_199603.t=0.04683650370242157;
+givenTree.Node2859.t=0.005065249648640625;
+givenTree.Node894.t=0.05358962639916943;
+givenTree.KDR_pat84_199604.t=0.03642311558457525;
+givenTree.Node913.t=0.006871137086061335;
+givenTree.CA9730_200108.t=0.03202506096289456;
+givenTree.Node458.t=0.03660852474706099;
+givenTree.CA16086_200303.t=0.02254755163308867;
+givenTree.dn92_200001.t=0.02050739772285284;
+givenTree.IP_36_199701.t=0.05877912328476922;
+givenTree.VC_pat49_199901.t=0.02458759433671763;
+givenTree.Node492.t=0;
+givenTree.Node702.t=0.007092923841669921;
+givenTree.Node2.t=0;
+givenTree.PCF_Pat80_200101.t=0.01120507025995732;
+givenTree.CA16157_200303.t=0.09852955111821153;
+givenTree.LV73HPD_199801.t=0.05245396801566248;
+givenTree.Pt4248_200201.t=0.00329539980434461;
+givenTree.05_132863_200401.t=0.05409133998161545;
+givenTree.Node2124.t=0.009749163522339475;
+givenTree.Node2982.t=0.02894667930629138;
+givenTree.IP_12_199707.t=0.05690589675683563;
+givenTree.CA4825_199907.t=0.04701218788476408;
+givenTree.Node2162.t=0.005005009680658907;
+givenTree.Node911.t=0.006923077258529556;
+givenTree.VT86b_200201.t=0.07799682096014542;
+givenTree.VC_pat256_199901.t=0.04594125398692698;
+givenTree.Node916.t=0.01032307287933194;
+givenTree.4004650_200401.t=0;
+givenTree.Node2977.t=0.04166240949628522;
+givenTree.DMG52_199902.t=0.04693763063618564;
+givenTree.EC1_199407.t=0.04697036207142589;
+givenTree.Node2717.t=0.04175024928578702;
+givenTree.Node893.t=0.0121885833977934;
+givenTree.BRP2017_200104.t=0.06355845482229459;
+givenTree.Node189.t=0;
+givenTree.CCB_3692_200501.t=0.01562797642350253;
+givenTree.Node2594.t=0.004059661627272295;
+givenTree.CA9731_200111.t=0.05908258046604376;
+givenTree.Pt3560_200201.t=0.05080889799416474;
+givenTree.CA14686_200211.t=0.05382845870831979;
+givenTree.HG013_199901.t=0.06486282063018267;
+givenTree.BRC1522_200208.t=0.004684668876881386;
+givenTree.Node898.t=0.007631486849024048;
+givenTree.JLB_Pat87_200006.t=0.02144188747676485;
+givenTree.Node2676.t=0.004363886537496022;
+givenTree.Node2270.t=0.02033722847824032;
+givenTree.HG047_199901.t=0.094485434463073;
+givenTree.Node2266.t=0.007414721511216011;
+givenTree.CCB_3545_200501.t=0.0601740422580606;
+givenTree.Node902.t=0.01020787377262407;
+givenTree.KDR_pat114_199604.t=0.01519146323461537;
+givenTree.Node844.t=0.02097138111828033;
+givenTree.4000764_200401.t=0;
+givenTree.Node2152.t=0.008031101369968447;
+givenTree.Node810.t=0.006022214525553746;
+givenTree.Node768.t=0.007747924698924136;
+givenTree.Node213.t=0.007865435017347369;
+givenTree.Node436.t=0.009756489645777808;
+givenTree.Node2127.t=0;
+givenTree.Node347.t=0.01602901483717768;
+givenTree.Node832.t=0.03127324528226805;
+givenTree.Node824.t=0.006750770823074062;
+givenTree.Node834.t=0.003847900000003023;
+givenTree.4004579_200401.t=0.06874145948210122;
+givenTree.Node2259.t=0.02727554056196489;
+givenTree.JLB_Pat22_200006.t=0.008126442130817566;
+givenTree.Node3035.t=0.01283802193247362;
+givenTree.GRSPR98_200301.t=0.1062960568542488;
+givenTree.Node854.t=0.007926941564443585;
+givenTree.PCF_Pat174_200101.t=0;
+givenTree.PCF_Pat6_200101.t=0.04593748231188357;
+givenTree.Node2596.t=0.02564388368718844;
+givenTree.BRC1519_200208.t=0.004335224226906844;
+givenTree.Node2543.t=0.03354040367816421;
+givenTree.JLB_Pat79_200006.t=0.01135852462583953;
+givenTree.Node2096.t=0.003825192137826209;
+givenTree.CCB_2983_200501.t=0.03753225357745755;
+givenTree.BR04RS112_200401.t=0.09027771641579267;
+givenTree.CCB_3808_200501.t=0.07634382400595364;
+givenTree.Node828.t=0.03741444447412037;
+givenTree.Node825.t=0.009669105849116717;
+givenTree.CCB_1207_200501.t=0.03155566441470279;
+givenTree.Pt3092_200201.t=0;
+givenTree.Node819.t=0.02253424962819884;
+givenTree.CCB_3913_200501.t=0.03386448068416753;
+givenTree.Node821.t=0.0607371065969072;
+givenTree.4003830_200401.t=0.0400384723160777;
+givenTree.Pt3185_200201.t=0.04637248893075722;
+givenTree.Node5.t=0.00356891522515532;
+givenTree.VT48_200201.t=0.03221599298117633;
+givenTree.Node2211.t=0.008336430650851427;
+givenTree.CCB_4447_200501.t=0.0397888762065933;
+givenTree.JLB_Pat71_200006.t=0.08462670911983011;
+givenTree.Node332.t=0.0107840086579674;
+givenTree.VT64_200201.t=0.00456211666220479;
+givenTree.Pt5143_200201.t=0.008357222759905891;
+givenTree.Node2870.t=0.02073828134895267;
+givenTree.Pt3211_200201.t=0.03327022093402053;
+givenTree.Node827.t=0.04563055129213089;
+givenTree.VHE_Pat23_200101.t=0.08522672042742789;
+givenTree.KDR_pat154_199604.t=0.02370199084653759;
+givenTree.Node144.t=0.01660201567202334;
+givenTree.KDR_pat128_199605.t=0.05231819928346244;
+givenTree.OMVB_RT_65_200301.t=0.07257259634871939;
+givenTree.Pt3819_200201.t=0.02588919173849536;
+givenTree.AV_M9721N_200501.t=0.1608996046159826;
+givenTree.Node855.t=0.01189114958504539;
+givenTree.CA14410_200205.t=0.06185052051014998;
+givenTree.CA6610_200005.t=0.09206853647118014;
+givenTree.Node856.t=0.01840833874454113;
+givenTree.Node2511.t=0;
+givenTree.Node2502.t=0.01375179793303208;
+givenTree.Node2433.t=0.01384160733459048;
+givenTree.CA9683_200110.t=0.06866443555441626;
+givenTree.4002032_200401.t=0;
+givenTree.Node868.t=0.005157188677312992;
+givenTree.Node23.t=0.000655620831824139;
+givenTree.CA4046_199903.t=0.05209843229535807;
+givenTree.Node2365.t=0.01418079799650946;
+givenTree.Node863.t=0.006563753760655494;
+givenTree.Node2302.t=0;
+givenTree.Node890.t=0.01676759361001596;
+givenTree.ED_V95_199901.t=0.06515929273270579;
+givenTree.ehh6_199901.t=0.06334831651149556;
+givenTree.Node2523.t=0;
+givenTree.Pt5730_200201.t=0.02529061012667852;
+givenTree.BRRJ912_200208.t=0.09555985349910268;
+givenTree.Node840.t=0.002956018302143675;
+givenTree.MYIDU9_200401.t=0.0517025567095688;
+givenTree.Node841.t=0.02212764026135617;
+givenTree.CCB_5040_200501.t=0.06166925009674432;
+givenTree.Node842.t=0.05905750281525973;
+givenTree.Node2136.t=0;
+givenTree.HG043_199901.t=0;
+givenTree.Node2571.t=0.0122346666126335;
+givenTree.Node848.t=0.01091537428614335;
+givenTree.Node2996.t=0.002521659161948656;
+givenTree.Node386.t=0;
+givenTree.Node2664.t=0.05116329641920594;
+givenTree.5000054_200401.t=0.1290180880969651;
+givenTree.Node839.t=0.008956497822419324;
+givenTree.Node3059.t=0.02215494734082557;
+givenTree.Node205.t=0.01434585169761776;
+givenTree.PCF_Pat33_200101.t=0.04587147510482399;
+givenTree.Node7.t=0.007246204365027325;
+givenTree.BrRJ009_200101.t=0.03324512061961925;
+givenTree.Node851.t=0.007311763567344877;
+givenTree.4003175_200401.t=0.04035729263610405;
+givenTree.Node155.t=0.04487008853442433;
+givenTree.Node993.t=0.01263642527226019;
+givenTree.Node989.t=0.01982264438446138;
+givenTree.BRNE266_200208.t=0.04312660757658682;
+givenTree.N42_200301.t=0.09616074541118866;
+givenTree.Node1008.t=0.01684074560115887;
+givenTree.Node2121.t=0.01113983136434238;
+givenTree.AC7_200001.t=0.00447966285364851;
+givenTree.Node994.t=0;
+givenTree.VT20_200201.t=0.06908314584912606;
+givenTree.NTHvr35_200301.t=0.01317230247743285;
+givenTree.BAL_199701.t=0;
+givenTree.Node2605.t=0.02660421468955198;
+givenTree.HG037_199901.t=0.05065253960025241;
+givenTree.dn67_200011.t=0.04698631596108509;
+givenTree.Node1002.t=0.012346951899579;
+givenTree.dn50_200010.t=0.01542652673146956;
+givenTree.Node2351.t=0.003547056965814262;
+givenTree.CH47_200101.t=0.0719147350963709;
+givenTree.36003_199607.t=0.03118279097398712;
+givenTree.Node980.t=0.007507757223303703;
+givenTree.Node998.t=0.007026002357853806;
+givenTree.Node2789.t=0.01842092322510206;
+givenTree.CA6502_200005.t=0.02118197002648721;
+givenTree.NTHvr199_200301.t=0.01758747591290155;
+givenTree.N34_200301.t=0.04983914097455014;
+givenTree.Pt3652_200201.t=0.01430924197467716;
+givenTree.Node2234.t=0.01174768749522202;
+givenTree.02BR005_200401.t=0.06573116472136759;
+givenTree.Node982.t=0.007178338865282819;
+givenTree.Pt5755_200201.t=0.02868998971248118;
+givenTree.Node907.t=0.006739761993990227;
+givenTree.Node1603.t=0;
+givenTree.Node957.t=0.003109833851898255;
+givenTree.4001904_200401.t=0.09488867639042194;
+givenTree.Node971.t=0.01425522266746253;
+givenTree.CCB_3060_200501.t=0.04480678881975356;
+givenTree.Node2057.t=0;
+givenTree.Node2793.t=0;
+givenTree.Pt3031_200201.t=0.00937061811587429;
+givenTree.NL_KHM_CD19_200412.t=0.03976915497001772;
+givenTree.Node981.t=0;
+givenTree.GRSPR51_200301.t=0.06283261943340319;
+givenTree.Node3043.t=0.01191201215616216;
+givenTree.Node983.t=0.006832246361440439;
+givenTree.Node986.t=0.0226079705121595;
+givenTree.Node170.t=0.00632031167409935;
+givenTree.AP_ARRP009_200406.t=0.05829786955046568;
+givenTree.JA_4935_198701.t=0.04048039776292833;
+givenTree.EC20_199407.t=0.04332362679498672;
+givenTree.SWC_7891_199611.t=0.03696578040205143;
+givenTree.Node1001.t=0;
+givenTree.HG059_199901.t=0.0814625088572663;
+givenTree.KDR_pat179_199603.t=0.02743870299804457;
+givenTree.Node1007.t=0;
+givenTree.Node1013.t=0;
+givenTree.Node2751.t=0.01753767200345809;
+givenTree.KDR_pat174_199602.t=0.03639467394042795;
+givenTree.Node979.t=0;
+givenTree.Node3048.t=0;
+givenTree.HG086_199901.t=0.02569910414007266;
+givenTree.CH30_200201.t=0.05185260343588989;
+givenTree.Node137.t=0.02867985457217109;
+givenTree.BRC1546_200208.t=0.08790433352253429;
+givenTree.CH80_200101.t=0.02715397023465537;
+givenTree.BRCN10_200208.t=0.1120506782210302;
+givenTree.dn48_200008.t=0.08839503489356268;
+givenTree.BREPM119_199901.t=0.04215022255514651;
+givenTree.Node1025.t=0.02887195826719787;
+givenTree.Node2397.t=0;
+givenTree.Node1023.t=0.01728808722473041;
+givenTree.4004342_200401.t=0.06249421373014893;
+givenTree.HDM003_200401.t=0.07346094273748849;
+givenTree.Node2427.t=0.01276936408173106;
+givenTree.Node1009.t=0.02635044815132339;
+givenTree.KDR_pat80_199601.t=0.02056646850491104;
+givenTree.4003174_200401.t=0.08372453070826014;
+givenTree.Pt7898_200201.t=0.06441131134128744;
+givenTree.Node2519.t=0.01862534968813904;
+givenTree.EC32_199407.t=0.02248610994091615;
+givenTree.CCB_1134_200501.t=0.0288746531919549;
+givenTree.CCB_5427_200501.t=0.04731700718550005;
+givenTree.Node2593.t=0.007453058095809717;
+givenTree.VT29_200201.t=0.02053279601655848;
+givenTree.VHE_Pat26_200101.t=0.02376301841470652;
+givenTree.Node2205.t=0.003640427038935298;
+givenTree.CA5261_199910.t=0.01519097277159288;
+givenTree.BR04RS207_200401.t=0.05406879543684033;
+givenTree.Node1017.t=0.0214802929019246;
+givenTree.CCB_236_200501.t=0.009892985882825127;
+givenTree.Node186.t=0.04291290100029583;
+givenTree.DB_SI4982_04_200401.t=0.07404152048885741;
+givenTree.Node3082.t=0;
+givenTree.Node2141.t=0.01159810560621336;
+givenTree.5000047_200401.t=0.02407563835319432;
+givenTree.Node1014.t=0.01497414377802031;
+givenTree.Node2691.t=0.04263616058931063;
+givenTree.MYIDU5_200401.t=0.01529654881252799;
+givenTree.Node2435.t=0.0151837656841616;
+givenTree.Node935.t=0.01603347200277968;
+givenTree.HAVANA178696_199904.t=0.05993539006606433;
+givenTree.4003914_200401.t=0;
+givenTree.92BR030_199201.t=0.0513504107566292;
+givenTree.ED_V17_199901.t=0.00154156095138008;
+givenTree.Node2851.t=0.01630719082667065;
+givenTree.MNR_FO_199408.t=0.09668435733955373;
+givenTree.SM_02YE519_200201.t=0.05196927940112418;
+givenTree.CA1540_199806.t=0.0625764694365208;
+givenTree.Node936.t=0.02454172902170307;
+givenTree.Node943.t=0.01256254257566826;
+givenTree.Node934.t=0;
+givenTree.Node2737.t=0;
+givenTree.Node2606.t=0.01021787690366142;
+givenTree.BRC1540_200208.t=0.05613341290788722;
+givenTree.CA4912_199908.t=0.05318381979374755;
+givenTree.KDR_pat142_199605.t=0.06961841675384266;
+givenTree.ED_V18_199901.t=0.0198072301458782;
+givenTree.BR04RS138_200401.t=0.05552909029388785;
+givenTree.Node3078.t=0;
+givenTree.Node940.t=0.03878024972133903;
+givenTree.Node2525.t=0.003528195598230592;
+givenTree.Node919.t=0;
+givenTree.Node3111.t=0;
+givenTree.Node924.t=0;
+givenTree.Pt5719_200201.t=0.06606212872484094;
+givenTree.4004187_200401.t=0.03031825444170421;
+givenTree.Node2332.t=0.01263961016106501;
+givenTree.5000051_200401.t=0.08804564286570057;
+givenTree.Node920.t=0.01121955813020838;
+givenTree.ARG_42_200001.t=0.03583407294428828;
+givenTree.JLB_Pat9_200006.t=0.04513931317516848;
+givenTree.AP_19_200001.t=0.06131473687446998;
+givenTree.CM237_200201.t=0.02150876843430497;
+givenTree.KDR_pat140_199603.t=0.0302307615070238;
+givenTree.Node927.t=0.01297335173205521;
+givenTree.Pt5603_200201.t=0;
+givenTree.Node2488.t=0.008145112747932897;
+givenTree.CH83_200101.t=0.03726030818027454;
+givenTree.CCB_3384_200501.t=0.02977533280563923;
+givenTree.Node2786.t=0.03247830853119192;
+givenTree.Node2522.t=0;
+givenTree.Node928.t=0.01815938627458478;
+givenTree.Node2330.t=0;
+givenTree.Node909.t=0.003614777080309721;
+givenTree.KDR_pat117_199602.t=0.05478025156852349;
+givenTree.Node61.t=0.008407621955897549;
+givenTree.CH115_200101.t=0.05003996141108553;
+givenTree.Node2585.t=0.01661566808794725;
+givenTree.DMG24_199903.t=0.02950212835414197;
+givenTree.Node959.t=0.008906252943970829;
+givenTree.Node972.t=0.005571656570432714;
+givenTree.ARG_57_200001.t=0.03894338161554075;
+givenTree.DB_SI1305_01_200101.t=0.03204745181101865;
+givenTree.DB_SI6198_03_200301.t=0.03528917976624866;
+givenTree.BRRJ929_200208.t=0.06378646725983246;
+givenTree.Node960.t=0.009329022961984016;
+givenTree.Node961.t=0.02825268249041375;
+givenTree.N67_200301.t=0.09086618933516398;
+givenTree.Node91.t=0.02101674288291524;
+givenTree.Node958.t=0.009609490239211722;
+givenTree.CH16_200101.t=0.04387137988401384;
+givenTree.CA5373_199911.t=0.03104887239965598;
+givenTree.BRP2177_200208.t=0.03205293934956222;
+givenTree.Node153.t=0.02208856119918279;
+givenTree.CCB_3446_200501.t=0.0483710637035378;
+givenTree.Node2853.t=0.0037281730790624;
+givenTree.SP_LP2_200106.t=0.07636582020273019;
+givenTree.Node968.t=0.007896348396514666;
+givenTree.Node224.t=0.003922353858831507;
+givenTree.Node2827.t=0.01689830656585814;
+givenTree.PCF_Pat8_200101.t=0.01424999091538998;
+givenTree.Node908.t=0.007352131757747786;
+givenTree.Node2116.t=0.002332686002459873;
+givenTree.MYIDU18_200401.t=0.04176138987491396;
+givenTree.CCB_3398_200501.t=0.05105367637079247;
+givenTree.MYIDUA10_200401.t=0;
+givenTree.Node933.t=0.01287364801095006;
+givenTree.Node2603.t=0.01100342859163885;
+givenTree.Node950.t=0.02705750827503835;
+givenTree.Node951.t=0.1093056718876046;
+givenTree.KDR_pat108_199603.t=0.04232374548365612;
+givenTree.MYIDUC1_200401.t=0.008485992986700571;
+givenTree.NL_KHM_CA34_200412.t=0.02779850356009788;
+givenTree.N52_200301.t=0.04580385812488949;
+givenTree.CCB_2929_200501.t=0.06601467595949373;
+givenTree.02UZ673_200201.t=0.02747963964269394;
+givenTree.MDS_01UAKV104_200101.t=0.04775524060413378;
+givenTree.Node2756.t=0.01533202825439031;
+givenTree.PCF_Pat9_200101.t=0.04960957418518391;
+givenTree.Node947.t=0.01120128602306934;
+givenTree.Node946.t=0.004830043608904786;
+givenTree.Node932.t=0;
+givenTree.5155_199601.t=0.03247840587660238;
+givenTree.BRSP385_200208.t=0.08723608879110721;
+givenTree.Pt3829_200201.t=0.03685208210770381;
+givenTree.Node678.t=0.05651500967257762;
+givenTree.Node493.t=0.003535420167018058;
+givenTree.CCB_3014_200501.t=0.06566235856045942;
+givenTree.Node693.t=0.004797706233720899;
+givenTree.Node676.t=0.01464853298240807;
+givenTree.MI_Pat30_200101.t=0.003555186792242263;
+givenTree.MDS_02UANK062_200101.t=0.02260342316936521;
+givenTree.Pt3238_200201.t=0.007101543405113572;
+givenTree.CCB_332_200501.t=0.04222532625584227;
+givenTree.Node1521.t=0.007086389249195795;
+givenTree.Node2924.t=0;
+givenTree.ED_V34_199901.t=0.06215669005007805;
+givenTree.VT54_200201.t=0.04161354589329285;
+givenTree.KDR_pat243_199605.t=0.01451995192944315;
+givenTree.Node686.t=0.01717597480607918;
+givenTree.Node614.t=0.003531472860673373;
+givenTree.CCB_4761_200501.t=0;
+givenTree.Node642.t=0.009534430407978188;
+givenTree.Node682.t=0.004936165608704321;
+givenTree.Node2400.t=0;
+givenTree.Node652.t=0.006319882542387743;
+givenTree.Node2897.t=0.003891724290642446;
+givenTree.Node2477.t=0;
+givenTree.BRP2137_200208.t=0.02131779019662515;
+givenTree.Node669.t=0.02678686199383588;
+givenTree.Pt3270_200201.t=0.02147860016939837;
+givenTree.99US_MSC5043_199901.t=0.08418749982661525;
+givenTree.CCB_3319_200501.t=0.0745299933417639;
+givenTree.KDR_pat109_199603.t=0;
+givenTree.PCF_Pat36_200101.t=0.04935865450174839;
+givenTree.CCB_4542_200501.t=0.0207748116699038;
+givenTree.Node665.t=0;
+givenTree.Pt5207_200201.t=0.06403346645037149;
+givenTree.Node2890.t=0.007540962802745301;
+givenTree.Pt4112_200201.t=0.06648821595485736;
+givenTree.SP_UFC_A_199201.t=0.008621009847954143;
+givenTree.Node673.t=0.01631721361482289;
+givenTree.Node2906.t=0.005206501505015827;
+givenTree.MDS_01UAKV260_200101.t=0;
+givenTree.CH13_200101.t=0.06409625898236963;
+givenTree.Node2499.t=0.002609480376654752;
+givenTree.Node653.t=0.007621039816320434;
+givenTree.Node2464.t=0.004860602228832267;
+givenTree.Node664.t=0.01637405209163553;
+givenTree.BB_96TH_NP1538_199601.t=0.03029900894282164;
+givenTree.MI_Pat89_200101.t=0;
+givenTree.KDR_pat5_199604.t=0.04804006834219288;
+givenTree.Pt4537_200201.t=0.007150283608230262;
+givenTree.Node2907.t=0.007761080800681134;
+givenTree.Node2960.t=0;
+givenTree.Pt3799_200201.t=0.04313475455971066;
+givenTree.Node681.t=0.01199167200436423;
+givenTree.Node613.t=0;
+givenTree.BRCN24_200208.t=0.04361100449735839;
+givenTree.Pt5078_200201.t=0;
+givenTree.Node2938.t=0.01196604970648277;
+givenTree.Node694.t=0.004174549561887645;
+givenTree.Pt5737_200201.t=0.02622884054548605;
+givenTree.KDR_pat143_199603.t=0.04874059771524712;
+givenTree.HG065_199901.t=0.04182491260559208;
+givenTree.Node2966.t=0;
+givenTree.KDR_pat137_199602.t=0.01014446343926457;
+givenTree.KDR_pat156_199604.t=0.03232931308047282;
+givenTree.CA16333_200304.t=0.009179320178420752;
+givenTree.Node141.t=0.01521069330963132;
+givenTree.Node706.t=0.02464641455748033;
+givenTree.SLMT_UD176_200501.t=0.0562895972622559;
+givenTree.Pt3010_200201.t=0.05234761761797242;
+givenTree.Node708.t=0.009322648342079442;
+givenTree.Node2066.t=0.01513057465131305;
+givenTree.DB_SI1661_04_200401.t=0.0629980368756599;
+givenTree.Node699.t=0.02023772071896494;
+givenTree.Node2461.t=0.02966235720988695;
+givenTree.JLB_Pat11_200006.t=0.04888980597604396;
+givenTree.Node2959.t=0.03664162607688413;
+givenTree.Node690.t=0.04140124446868187;
+givenTree.Node2478.t=0.01431688068798151;
+givenTree.Pt5206_200201.t=0.0256276770153899;
+givenTree.Node683.t=0.0161678024062737;
+givenTree.Pt3188_200201.t=0.02286714866430424;
+givenTree.Pt4242_200201.t=0.01039939390979465;
+givenTree.AP_ARRP047_200406.t=0.01063942425119863;
+givenTree.4000426_200401.t=0.07189791728773558;
+givenTree.Pt5704_200201.t=0.03947184299527693;
+givenTree.Node2916.t=0.02810056650676321;
+givenTree.Pt5783_200201.t=0;
+givenTree.Pt5720_200201.t=0.01680995057829893;
+givenTree.Node1602.t=0;
+givenTree.CCB_2515_200501.t=0.03818888459471099;
+givenTree.Pt5796_200201.t=0.003538824664988961;
+givenTree.Pt3734_200201.t=0.01398256174596549;
+givenTree.Node687.t=0.0987581321544399;
+givenTree.CCB_4739_200501.t=0.04072400280047139;
+givenTree.Pt7978_200201.t=0.007066710638347696;
+givenTree.CCB_4361_200501.t=0;
+givenTree.Node2932.t=0.01028688285475067;
+givenTree.Node639.t=0.01933723119789827;
+givenTree.Node2610.t=0.003821072303399842;
+givenTree.Node626.t=0.0713838869876894;
+givenTree.4000386_200401.t=0.09311744874576368;
+givenTree.CCB_1904_200501.t=0.004790462591629736;
+givenTree.Node630.t=0.03160941567041676;
+givenTree.PCF_Pat196_200101.t=0.0458446936082893;
+givenTree.Node3022.t=0.003576410725420906;
+givenTree.Node621.t=0.03872958751138005;
+givenTree.Node625.t=0.0238991777021356;
+givenTree.Node2546.t=0.01512657437501633;
+givenTree.CCB_5384_200501.t=0.07041836995351294;
+givenTree.CCB_72_200501.t=0.03683270101715069;
+givenTree.CA9675_200107.t=0.06854092235938085;
+givenTree.Pt3159_200201.t=0.04725875678458921;
+givenTree.Node2533.t=0.002451568315589027;
+givenTree.Node635.t=0.02266264984835409;
+givenTree.Node418.t=0.01436467934428582;
+givenTree.Node2656.t=0.004964136247769106;
+givenTree.02BR002_200401.t=0.0431788782287177;
+givenTree.Node101.t=0.01382195011428701;
+givenTree.Node624.t=0;
+givenTree.CA18433_200403.t=0.05014405947366383;
+givenTree.Node616.t=0;
+givenTree.RL42_199801.t=0.02673402615909872;
+givenTree.Node2705.t=0.01555989575537959;
+givenTree.Node610.t=0.01805189624127867;
+givenTree.BRP2056_200104.t=0.04670038835698775;
+givenTree.KDR_pat186_199605.t=0.05613824700976407;
+givenTree.CA9924_200104.t=0.0256181144875612;
+givenTree.Pt5091_200201.t=0.07008682922511397;
+givenTree.260Pt23_199511.t=0.0430347061515093;
+givenTree.CA16321_200306.t=0.0479595562919324;
+givenTree.Node2948.t=0.004518664433369476;
+givenTree.Pt5778_200201.t=0.07213639712584421;
+givenTree.CCB_4415_200501.t=0.05720362765326772;
+givenTree.Node2493.t=0.008413899378809651;
+givenTree.Node2589.t=0.04452098095349447;
+givenTree.Node617.t=0.007965808568706904;
+givenTree.PCM023_200101.t=0.08688846148108617;
+givenTree.4001172_200401.t=0;
+givenTree.4001797_200401.t=0.05182333789227925;
+givenTree.Node2065.t=0.009175989927321425;
+givenTree.PCF_Pat92_200101.t=0.05751571416285522;
+givenTree.ARG06_199701.t=0.03440007266726319;
+givenTree.Node494.t=0;
+givenTree.Node394.t=0.07971213271856238;
+givenTree.CA9760_200112.t=0.04273160164176194;
+givenTree.Node2329.t=0.005588459761289282;
+givenTree.Node720.t=0.009687667086521667;
+givenTree.Node3012.t=0;
+givenTree.PCF_Pat197_200101.t=0.00812381467340793;
+givenTree.Pt6124_200201.t=0.05876782938981793;
+givenTree.Node658.t=0.04896054676670643;
+givenTree.DB_SI5335_02_200201.t=0.06067324448112935;
+givenTree.Node655.t=0.03286960988189373;
+givenTree.Node2899.t=0.02636310122299841;
+givenTree.VT50_200201.t=0;
+givenTree.VT51_200201.t=0;
+givenTree.KDR_pat88_199605.t=0.02016059603203895;
+givenTree.Node2804.t=0.007320021114090755;
+givenTree.Node2505.t=0.008716218499813013;
+givenTree.Node255.t=0.008247005113940204;
+givenTree.N47_200301.t=0.09406716623605609;
+givenTree.92BR024_199201.t=0.048115564941259;
+givenTree.BRC1542_200208.t=0.04169667367210052;
+givenTree.Node654.t=0.0246458774580289;
+givenTree.MYIDUD5_200401.t=0.003992332349371077;
+givenTree.Node659.t=0.02485235395996889;
+givenTree.Pt6136_200201.t=0.03124875406971923;
+givenTree.Node167.t=0.01707588088836672;
+givenTree.MZ_99GEMZ014_199901.t=0.01801136530017053;
+givenTree.Node643.t=0.005141275884729639;
+givenTree.Node633.t=0.00258219815381717;
+givenTree.4003354_200401.t=0.03704996661466849;
+givenTree.VT31_200201.t=0.05242909138151648;
+givenTree.CH118_200101.t=0.04261149652240488;
+givenTree.Node615.t=0.003594443261872566;
+givenTree.GRSPR38_200301.t=0.05199569756812147;
+givenTree.CCB_1001_200501.t=0.0709655992534486;
+givenTree.BB_85US_Ba_L_198501.t=0.01800965451464153;
+givenTree.BRP2055_200104.t=0.08570721221616238;
+givenTree.Node634.t=0.007156261553017073;
+givenTree.VHE_Pat37_200101.t=0.03406676979181172;
+givenTree.4000361_200401.t=0.03290747350878066;
+givenTree.Node647.t=0.01872273844695907;
+givenTree.BRP2103_200208.t=0.1272230849607844;
+givenTree.PCF_Pat59_200101.t=0.06326322891920233;
+givenTree.Node2630.t=0.02486512456300726;
+givenTree.143P5_199108.t=0.02507641705508903;
+givenTree.CA16097_200304.t=0.04323609549609091;
+givenTree.CA4284_199904.t=0.02736664817725835;
+givenTree.Node407.t=0.01738506212424024;
+givenTree.CA7904_200010.t=0.02906434740308999;
+givenTree.Node404.t=0;
+givenTree.Node644.t=0.009763704904161546;
+givenTree.Node712.t=0.01516181524505848;
+givenTree.Pt3093_200201.t=0;
+givenTree.Node2215.t=0.008179783580303591;
+givenTree.Node2094.t=0.006986099862668553;
+givenTree.CA7921_200010.t=0.03278033215636529;
+givenTree.05_132888_200401.t=0.0841113920860582;
+givenTree.Node788.t=0.004673694099507986;
+givenTree.MZ_03GEMZ025_200301.t=0.01451444459968154;
+givenTree.BRRJ877_200104.t=0;
+givenTree.MDS_02UAKV151_200101.t=0.006818891573838411;
+givenTree.MDS_02UANK078_200101.t=0.004509574302854427;
+givenTree.Node783.t=0.02352649187339;
+givenTree.Node40.t=0.01062206400440542;
+givenTree.Node2939.t=0.01240400608774755;
+givenTree.ACTG347_0323_199708.t=0.02324178078932137;
+givenTree.KDR_pat118_199602.t=0.04156967946145555;
+givenTree.Node770.t=0.00860979201328985;
+givenTree.4001027_200401.t=0.04897419868937698;
+givenTree.ARG22_199701.t=0.04073278035519193;
+givenTree.CH90_200101.t=0.08639056433810802;
+givenTree.Node790.t=0.006731883379956685;
+givenTree.Node2710.t=0.01356273964818001;
+givenTree.Node2637.t=0.008329995172355754;
+givenTree.Node782.t=0.008583530746197828;
+givenTree.CA4824_199907.t=0.06728180706309694;
+givenTree.Node785.t=0.008819575886287914;
+givenTree.Node2956.t=0.01319007383597183;
+givenTree.BRNE274_200208.t=0.09348526431206565;
+givenTree.MI_Pat98_200101.t=0.05886330597312638;
+givenTree.Node777.t=0.01038027424932619;
+givenTree.Node2226.t=0.008412708616973016;
+givenTree.Node772.t=0.01103486848676274;
+givenTree.Node2366.t=0;
+givenTree.MDS_02UAKV177_200101.t=0.0226173995817304;
+givenTree.Pt3246_200201.t=0.03687837955984336;
+givenTree.4001569_200401.t=0;
+givenTree.MDS_01UAKV161_200101.t=0;
+givenTree.KDR_pat291_199605.t=0.02343404242366852;
+givenTree.Node814.t=0;
+givenTree.Node1030.t=0.08176776110051928;
+givenTree.MDS_02UAKV105_200101.t=0.00686357939367397;
+givenTree.PSW_Pat41_200201.t=0.04865453829936313;
+givenTree.Node2562.t=0.009667843350431724;
+givenTree.KDR_pat231_199605.t=0.01551369121953634;
+givenTree.Node2647.t=0.01754553743341172;
+givenTree.Node773.t=0.01442087176311678;
+givenTree.Node55.t=0.004247220663704016;
+givenTree.KDR_pat248_199602.t=0.06752927153713496;
+givenTree.HG093_199901.t=0.04862798701303624;
+givenTree.CA14384_200204.t=0.03225036033779443;
+givenTree.Node793.t=0.01329292063247992;
+givenTree.Node3026.t=0.01454371878588915;
+givenTree.Node811.t=0.005422134595334052;
+givenTree.MDS_02UANK087_200101.t=0.03623663365031909;
+givenTree.GRSPR99_200301.t=0.03608897105058154;
+givenTree.Node803.t=0.005593369626990783;
+givenTree.CCB_3258_200501.t=0.06394712112092195;
+givenTree.CA14172_200112.t=0.06040688080575373;
+givenTree.KDR_pat241_199605.t=0.07303777748831576;
+givenTree.CCB_4544_200501.t=0.06574934874732995;
+givenTree.EC003_199012.t=0.05226463041882843;
+givenTree.CA7075_200008.t=0.03371009338778332;
+givenTree.4001653_200401.t=0;
+givenTree.Node2289.t=0.01285334088307242;
+givenTree.KDR_pat169_199605.t=0.03657070515918644;
+givenTree.Pt4071_200201.t=0.03149150969330807;
+givenTree.Node818.t=0.01785931383391202;
+givenTree.CH62_200101.t=0.07345450746463347;
+givenTree.Node2164.t=0.01010851705531724;
+givenTree.Node2154.t=0.01056514059982386;
+givenTree.dn25_200005.t=0.004637296496517084;
+givenTree.Node256.t=0.02383156678210102;
+givenTree.Node815.t=0.009094079820149986;
+givenTree.Node807.t=0.01755009171266594;
+givenTree.Node804.t=0;
+givenTree.Pt4014_200201.t=0.0570683488732828;
+givenTree.380639e_199401.t=0.01609285926673059;
+givenTree.Node800.t=0.01431856360590874;
+givenTree.Node794.t=0;
+givenTree.Node795.t=0;
+givenTree.CA4425_199906.t=0.06340656144801246;
+givenTree.Node2772.t=0.01575825267628041;
+givenTree.MDS_02UANK098_200101.t=0.008996824153726485;
+givenTree.SLMT_UD269_200501.t=0.05832957098181474;
+givenTree.Node2784.t=0.01125743174444074;
+givenTree.MYIDUD8_200401.t=0;
+givenTree.BRBS531_200104.t=0.08405623348593454;
+givenTree.V2000_19_199801.t=0.03481630238402784;
+givenTree.dn22_200005.t=0.0243609587626115;
+givenTree.Node769.t=0;
+givenTree.n20_200301.t=0.09184291913664844;
+givenTree.Node336.t=0;
+givenTree.05_132859_200401.t=0.05108886295962881;
+givenTree.Node798.t=0.0137772775822837;
+givenTree.CA5705_200001.t=0.06156919773111525;
+givenTree.4000763_200401.t=0.04410259351318481;
+givenTree.Node2884.t=0.003883797759639247;
+givenTree.Node3000.t=0.03717630732274387;
+givenTree.Pt3503_200201.t=0.04813521182007165;
+givenTree.Node735.t=0.002845730701938543;
+givenTree.BR04RS175_200401.t=0.08917481795937796;
+givenTree.Node734.t=0;
+givenTree.MI_Pat97_200101.t=0.04518141414122003;
+givenTree.Pt3593_200201.t=0.02548299817512145;
+givenTree.BRSP485_200208.t=0.01078019096000754;
+givenTree.4002760_200401.t=0.07847636115374866;
+givenTree.Node2187.t=0;
+givenTree.Node3087.t=0;
+givenTree.Node2695.t=0.007099779771228522;
+givenTree.Pt3297_200201.t=0.01187059034727419;
+givenTree.LVMP1321_199901.t=0.05194164537678644;
+givenTree.Node742.t=0.01021424788089936;
+givenTree.Node2064.t=0;
+givenTree.Node744.t=0.03242407381660131;
+givenTree.Node291.t=0.01012010617138363;
+givenTree.CA14195_200201.t=0.05510308345429926;
+givenTree.Pt3554_200201.t=0;
+givenTree.LV_00FR_MP1473_199601.t=0.05423493427834523;
+givenTree.Node732.t=0.003214463432248051;
+givenTree.Pt3169_200201.t=0.04379479266186554;
+givenTree.Pt3057_200201.t=0.02566177530747389;
+givenTree.Pt4131_200201.t=0.04967984608894293;
+givenTree.Node728.t=0;
+givenTree.BRC1521_200208.t=0.005105051489271881;
+givenTree.Node705.t=0;
+givenTree.Node711.t=0.008681959366790008;
+givenTree.Pt3194_200201.t=0.007659354829652227;
+givenTree.Node2249.t=0.008131090382674563;
+givenTree.CA4340_199904.t=0.06675573691945753;
+givenTree.4000630_200401.t=0.00434958940467022;
+givenTree.Node2265.t=0.01140849517950321;
+givenTree.Node2275.t=0.0237487818153863;
+givenTree.KDR_pat262_199512.t=0.06817183431699675;
+givenTree.Node2900.t=0;
+givenTree.MZ_03GEMZ005_200301.t=0.0154249261254811;
+givenTree.KDR_pat147_199602.t=0.02583319430805395;
+givenTree.Pt3687_200201.t=0.02871129373534854;
+givenTree.CA9656_200104.t=0.04498153876979691;
+givenTree.Pt3085_200201.t=0.07126887674280684;
+givenTree.Node2512.t=0;
+givenTree.CCB_2275_200501.t=0.03122360260414139;
+givenTree.Node719.t=0.004838138325597702;
+givenTree.MZ_03GEMZ010_200301.t=0.02962083976164478;
+givenTree.Node723.t=0.03425944579046812;
+givenTree.MYIDUC5_200401.t=0.004307933816013478;
+givenTree.Node4.t=0;
+givenTree.MI_Pat23_200101.t=0.04609607638444781;
+givenTree.Node761.t=0.006513418206477454;
+givenTree.AP_GR4_200001.t=0.0515365238188072;
+givenTree.Node2088.t=0.003535437465602567;
+givenTree.Pt4176_200201.t=0.0225803819910845;
+givenTree.Node759.t=0;
+givenTree.Pt4543_200201.t=0.05051864169541175;
+givenTree.Pt3798_200201.t=0.04669359497844545;
+givenTree.Pt4127_200201.t=0.03774864526769287;
+givenTree.Node2942.t=0.009880047224102236;
+givenTree.Node3079.t=0;
+givenTree.PCF_Pat116_200101.t=0.04798832582507857;
+givenTree.Node749.t=0.00881221112582386;
+givenTree.Node2573.t=0.02347583433782859;
+givenTree.Node726.t=0.009475766739252323;
+givenTree.Node2930.t=0.01401454893495158;
+givenTree.Node2993.t=0.01820633009877653;
+givenTree.Node748.t=0.008339679624181204;
+givenTree.Node718.t=0.02777483099218743;
+givenTree.DB_SI3943_02_200201.t=0.003479826551829211;
+givenTree.Node2874.t=0.006627940694242743;
+givenTree.Node753.t=0.008560726209962103;
+givenTree.Node774.t=0.03918228890764686;
+givenTree.MDS_02UAKV129_200101.t=0.004499130881325154;
+givenTree.05_132903_200401.t=0.04538354218466904;
+givenTree.Node2864.t=0.007790677621175213;
+givenTree.Pt4518_200201.t=0.05752478632408493;
+givenTree.Node731.t=0.003536936242045272;
+givenTree.Node2311.t=0.005203817163515775;
+givenTree.HG004_199901.t=0.07269648735681213;
+givenTree.Node259.t=0.007533273524597118;
+givenTree.Pt3745_200201.t=0.003548989355008103;
+givenTree.N50_200301.t=0.06672965782370512;
+givenTree.HG061_199901.t=0.05644642876769387;
+givenTree.Node741.t=0.007731114410385693;
+givenTree.Node727.t=0.004488755569347546;
+givenTree.Node762.t=0.006274712169038513;
+givenTree.Pt5054_200201.t=0.007584601749026571;
+givenTree.Node2079.t=0.01451659081132736;
+givenTree.Node754.t=0.02047327908703838;
+givenTree.BR04RS195_200401.t=0.1022278763732932;
+givenTree.Node756.t=0.03697320961964578;
+givenTree.Pt3147_200201.t=0;
+givenTree.PCF_Pat7_200101.t=0.01198557383720002;
+givenTree.Pt3146_200201.t=0.01063760358494649;
+givenTree.Pt5195_200201.t=0.06858195223233771;
+givenTree.CCB_2384_200501.t=0;
+givenTree.CCB_3869_200501.t=0.07965996644531073;
+givenTree.Node1057.t=0.04493541296207188;
+givenTree.Node1318.t=0.006669358954929008;
+givenTree.Node2540.t=0.005205113564586409;
+givenTree.Node1314.t=0.008079045777902123;
+givenTree.Node45.t=0.004175816590967446;
+givenTree.Pt3575_200201.t=0.007262373549439344;
+givenTree.Node35.t=0.01375025259232939;
+givenTree.A063_199901.t=0.02905983419667634;
+givenTree.MDS_01UAKV263_200101.t=0.004429177243731621;
+givenTree.KDR_pat146_199604.t=0.04683722502666233;
+givenTree.AP_ARRP051_200406.t=0.07111758870390826;
+givenTree.Node140.t=0.007571396567764602;
+givenTree.ARG_39_200001.t=0.04584307416647329;
+givenTree.Node25.t=0;
+givenTree.Node2280.t=0.01763591697616587;
+givenTree.GRSPR19_200301.t=0.05181487515900977;
+givenTree.CCB_5130_200501.t=0.08629656644802561;
+givenTree.VT19_200201.t=0.0778456100932883;
+givenTree.Node1322.t=0.01754160679004239;
+givenTree.AP_ARRP033_200406.t=0.09517736188305564;
+givenTree.ARG04_199701.t=0.02262416232823396;
+givenTree.Pt4235_200201.t=0.09504730618521161;
+givenTree.Node1313.t=0.01838709897438635;
+givenTree.Node1327.t=0.06149887692950198;
+givenTree.KDR_pat202_199605.t=0.05763125264470259;
+givenTree.VT28pl_200201.t=0.01926021425793174;
+givenTree.Node1298.t=0.01111907316827935;
+givenTree.CCB_1136_200501.t=0.04884618987901414;
+givenTree.CH122_200101.t=0.03167103284068691;
+givenTree.Node3056.t=0.006606870586365218;
+givenTree.Node2200.t=0.005944417474214656;
+givenTree.Node1299.t=0.007202271551779777;
+givenTree.Node1303.t=0.01151827212263339;
+givenTree.Node2958.t=0.002976838166379079;
+givenTree.Node2167.t=0.005078008800366341;
+givenTree.Node2536.t=0.01701329741201339;
+givenTree.ARG_60_200001.t=0;
+givenTree.Node1296.t=0.04296369831576539;
+givenTree.AP_ARRP045_200406.t=0.008257363295128561;
+givenTree.Node2702.t=0.01102552030835086;
+givenTree.Node1332.t=0.01845271040655786;
+givenTree.ARG_59_200001.t=0;
+givenTree.Node1315.t=0.03340228793925031;
+givenTree.Node1160.t=0;
+givenTree.Node1294.t=0.01436007336251;
+givenTree.Node2238.t=0;
+givenTree.Node2242.t=0.02233283119074064;
+givenTree.Node1159.t=0.02267078916134629;
+givenTree.EC13_199407.t=0.02382078966471115;
+givenTree.Node2380.t=0.008819829385752159;
+givenTree.Node1325.t=0;
+givenTree.CCB_5418_200501.t=0.02595944960039872;
+givenTree.Node1331.t=0.03210811769543821;
+givenTree.Node2835.t=0.02074967200668325;
+givenTree.Node1111.t=0;
+givenTree.Node2816.t=0;
+givenTree.Node1157.t=0.00591297102015331;
+givenTree.Node2369.t=0;
+givenTree.Node2651.t=0;
+givenTree.Node1335.t=0.00699767108174796;
+givenTree.BRP2072_200104.t=0.107269692529979;
+givenTree.Node119.t=0.003538007649028074;
+givenTree.Node2521.t=0;
+givenTree.Pt6047_200201.t=0.06102578916787711;
+givenTree.Node1349.t=0;
+givenTree.AP_ARRP010_200406.t=0.07730141714153521;
+givenTree.Node50.t=0.004498775980822289;
+givenTree.Node147.t=0.003963168360315661;
+givenTree.CCB_4344_200501.t=0.04117715662131948;
+givenTree.Node2768.t=0.01926874273302398;
+givenTree.Pt5663_200201.t=0.02156537864736383;
+givenTree.BR04RS114_200401.t=0.05021627563833362;
+givenTree.4002924_200401.t=0.03694637365142578;
+givenTree.CA3888_199902.t=0.06412513239393614;
+givenTree.Node1341.t=0.02029171627864528;
+givenTree.Node1326.t=0.02148501289187361;
+givenTree.SLMT_UD326_200501.t=0.1139694733305396;
+givenTree.BRRJ923_200208.t=0.07578081349965038;
+givenTree.HG035_199901.t=0.01495969493861973;
+givenTree.CCB_2389_200501.t=0;
+givenTree.139089_200401.t=0.1004679522817759;
+givenTree.Node1312.t=0.005362893800100146;
+givenTree.dn39_200003.t=0.05769732157692304;
+givenTree.Node1158.t=0.01491422499246212;
+givenTree.VHE_Pat42_200101.t=0.01851009156270774;
+givenTree.Node2118.t=0.06185333299645747;
+givenTree.Node1351.t=0.1000459916474673;
+givenTree.Node1336.t=0.03572100393275943;
+givenTree.Pt3759_200201.t=0.03820759207721563;
+givenTree.HG073_199901.t=0.01525559249432844;
+givenTree.AP_ARRP042_200406.t=0.06505540600461379;
+givenTree.BREPM107_199901.t=0.08001326373530142;
+givenTree.Node2847.t=0.006141234719270024;
+givenTree.Node1337.t=0.01186255650099939;
+givenTree.BRP2130_200208.t=0.1416538742603692;
+givenTree.4000355_200401.t=0.08531260985403637;
+givenTree.CCB_2884_200501.t=0.04393882031891752;
+givenTree.Node2689.t=0.01166301704847277;
+givenTree.Node2752.t=0.005697234200642116;
+givenTree.AP_ARRP057_200406.t=0.07556555340274418;
+givenTree.CH128_200101.t=0.05828423186635042;
+givenTree.CA14544_200208.t=0.08081730776445377;
+givenTree.Node248.t=0.01290136305901564;
+givenTree.PCF_Pat195_200101.t=0.04178654827579354;
+givenTree.BRP2046_200104.t=0;
+givenTree.Node1262.t=0.01840345112086488;
+givenTree.Node2657.t=0;
+givenTree.CCB_802_200501.t=0.09477896303992171;
+givenTree.Node2911.t=0.03829474892432066;
+givenTree.Node2838.t=0.0235534286611304;
+givenTree.05AR163052_200501.t=0.05725116428231154;
+givenTree.AP_ARRP022_200406.t=0.06259400835933954;
+givenTree.AP_ARRP046_200406.t=0.05468567625133555;
+givenTree.CH106_200101.t=0.01552854689793099;
+givenTree.Node2454.t=0.0114223192861243;
+givenTree.BRRJ921_200208.t=0.1433785108802093;
+givenTree.Node2484.t=0;
+givenTree.EC18_199407.t=0.01782262691253313;
+givenTree.Node2416.t=0.006786739166416719;
+givenTree.DMG42_199809.t=0.04241281115417022;
+givenTree.Node2556.t=0.03791523653359521;
+givenTree.Node1269.t=0.01817804625639247;
+givenTree.PCF_Pat153_200101.t=0.03610297190612759;
+givenTree.Node1263.t=0.02752133979847984;
+givenTree.Node1257.t=0.007740261323852531;
+givenTree.Node3042.t=0;
+givenTree.Node1172.t=0.009590949823891193;
+givenTree.Node1258.t=0.01549931928367218;
+givenTree.ARG_56_200001.t=0.06772784888233202;
+givenTree.AP_ARRP032_200406.t=0.09738405550811351;
+givenTree.Pt3139_200201.t=0.03644068881065392;
+givenTree.DMG32_199807.t=0.02672048575382867;
+givenTree.Node1198.t=0.01170534141156172;
+givenTree.Node2541.t=0.008816083447996791;
+givenTree.Pt3318_200201.t=0.03503775368335474;
+givenTree.AP_ARRP012_200406.t=0.05133354274685867;
+givenTree.CA4820_199907.t=0.01938252045139196;
+givenTree.Node280.t=0.008672353331216383;
+givenTree.Node1163.t=0;
+givenTree.BRP2025_200104.t=0;
+givenTree.Node235.t=0.01149117008145326;
+givenTree.BR04RS143_200401.t=0.09301275018293634;
+givenTree.AP_ARRP017_200406.t=0.05366848041654818;
+givenTree.CA5132_199909.t=0.07275704847115147;
+givenTree.DB_SI5301_03_200301.t=0.08150407277661351;
+givenTree.Node2508.t=0;
+givenTree.SLMT_UD223_200501.t=0.0451902135809139;
+givenTree.Node1268.t=0;
+givenTree.4004185_200401.t=0.06576392714973095;
+givenTree.Node346.t=0.006843110128628197;
+givenTree.Node1278.t=0.009867245764905502;
+givenTree.Node358.t=0.03772702049180023;
+givenTree.01UYTRA1020_200101.t=0.07485684532373753;
+givenTree.CCB_5104_200501.t=0.08978481663803384;
+givenTree.Node1279.t=0;
+givenTree.AP_ARRP027_200406.t=0.05007645886164851;
+givenTree.Node365.t=0.02483659014949751;
+givenTree.EC10_199407.t=0.04984188460346867;
+givenTree.ARG_43_200001.t=0.07727617341074175;
+givenTree.92BR004_199201.t=0.02388739071661077;
+givenTree.Node2728.t=0.006981345046558594;
+givenTree.CH8_200101.t=0.0232877627821204;
+givenTree.Node2322.t=0.01794809829018712;
+givenTree.CH87_200101.t=0.03115277817878208;
+givenTree.Node1301.t=0;
+givenTree.CA14538_200207.t=0.03419733940059313;
+givenTree.Node366.t=0.02311467244995332;
+givenTree.Node1288.t=0.0208320449946564;
+givenTree.Brp089_199612.t=0.0750690104580839;
+givenTree.CH25_200101.t=0.03169825234627739;
+givenTree.dn94_200009.t=0.01719540398252338;
+givenTree.Node354.t=0;
+givenTree.Node12.t=0.005144846820169951;
+givenTree.Node2703.t=0;
+givenTree.Node1280.t=0.01286016176272203;
+givenTree.ARG2795_200101.t=0.02402151583722187;
+givenTree.Node2500.t=0.005964918319237736;
+givenTree.Node163.t=0.009101154408529134;
+givenTree.MI_Pat46_200101.t=0.0556707300277215;
+givenTree.Node503.t=0.004505021795307856;
+givenTree.Node2909.t=0.0149350193989886;
+givenTree.Node3085.t=0;
+givenTree.02AR115455_200201.t=0.07062098785084772;
+givenTree.Node2729.t=0.007786283902624316;
+givenTree.Node1277.t=0;
+givenTree.Node1267.t=0.008161460159516482;
+givenTree.Node279.t=0;
+givenTree.Node356.t=0.007979212349944882;
+givenTree.Node1291.t=0.03760487973422995;
+givenTree.Node355.t=0;
+givenTree.CH12_200101.t=0.003649341028728075;
+givenTree.KDR_pat161_199605.t=0.005173765798866474;
+givenTree.Node273.t=0.0135913678638617;
+givenTree.Node1161.t=0.01717287628973628;
+givenTree.CCB_4647_200501.t=0.06785156814235638;
+givenTree.CCB_132_200501.t=0.07891394121206388;
+givenTree.Node2212.t=0.00501573838968104;
+givenTree.MYIDUA12_200401.t=0.04688297106412169;
+givenTree.Node410.t=0.01836440578420683;
+givenTree.N74_200301.t=0.08531554107518793;
+givenTree.CCB_4609_200501.t=0.038336465719211;
+givenTree.Node1434.t=0.01615346588223464;
+givenTree.BRNE131_200208.t=0.06843560900101371;
+givenTree.DB_SI2338_00_200001.t=0.006954083460741563;
+givenTree.Node1423.t=0.01085893714731572;
+givenTree.Node1419.t=0.07063132198497363;
+givenTree.PCF_Pat74_200101.t=0.07047819539196667;
+givenTree.Node393.t=0.009988788754423918;
+givenTree.Node3089.t=0;
+givenTree.n24_200301.t=0.07749800732553155;
+givenTree.CA7850_200009.t=0.08913650808001554;
+givenTree.Node1402.t=0.00701074254503928;
+givenTree.Node253.t=0.007098139485769727;
+givenTree.Node282.t=0.01765712568593745;
+givenTree.Node2074.t=0.03138876530077848;
+givenTree.Node1416.t=0;
+givenTree.Node1430.t=0.01981099821557837;
+givenTree.Node1422.t=0.0183249773435633;
+givenTree.Node265.t=0.01560466768661618;
+givenTree.Node269.t=0;
+givenTree.Node2876.t=0.002598266617104922;
+givenTree.Node1408.t=0.005047606826821228;
+givenTree.MI_Pat22_200101.t=0.04285996309292365;
+givenTree.EC36_199407.t=0.02279508769546258;
+givenTree.Node1407.t=0.0150565664991336;
+givenTree.Pt3589_200201.t=0.07237598534071082;
+givenTree.Node2861.t=0.01318847752510558;
+givenTree.GRSPR1_200301.t=0;
+givenTree.Node1403.t=0.008990923712967811;
+givenTree.GRSPR2_200301.t=0.005047332473673147;
+givenTree.Pt5114_200201.t=0.02605436835310596;
+givenTree.CCB_922_200501.t=0.07318502764534407;
+givenTree.MDS_02AZ057_199901.t=0.03146367522873796;
+givenTree.CCB_1032_200501.t=0.04674923869749689;
+givenTree.SLMT_UD333_200501.t=0.05924363302601435;
+givenTree.Pt5620_200201.t=0.06852558322163542;
+givenTree.GRSPR14_200301.t=0.09007837380156639;
+givenTree.DB_SI1994_00_200001.t=0.007981884071254471;
+givenTree.AP_ARRP006_200406.t=0.06796345379778683;
+givenTree.CA5740_200001.t=0.07118823497207104;
+givenTree.Node1413.t=0;
+givenTree.02HNsq4_200201.t=0.05987941074470074;
+givenTree.MDS_01UAKV272_200101.t=0.01803631444795828;
+givenTree.Node1404.t=0.0318667040012169;
+givenTree.93BR029_199301.t=0.05861273318549073;
+givenTree.CCB_4170_200501.t=0.07048161916153786;
+givenTree.Node1441.t=0;
+givenTree.dn59_200007.t=0.01791458399837705;
+givenTree.Node220.t=0.07065960632951601;
+givenTree.Node1401.t=0;
+givenTree.Node1427.t=0.01589686052842594;
+givenTree.05_132919_200401.t=0.0520307014680941;
+givenTree.Node1447.t=0.007418699157594786;
+givenTree.CCB_3092_200501.t=0.02078084512069018;
+givenTree.CCB_4206_200501.t=0.05927636909915038;
+givenTree.Node2767.t=0;
+givenTree.SLMT_UD138_200501.t=0.02407248261881492;
+givenTree.CCB_3942_200501.t=0.06911548131338517;
+givenTree.dn23_200010.t=0.02512751258962757;
+givenTree.TY_pat9_200201.t=0.03942395145199757;
+givenTree.Node225.t=0.01133322434431739;
+givenTree.Node1455.t=0.02139507079638141;
+givenTree.BRNE135_200208.t=0.05991891563777436;
+givenTree.CCB_2857_200501.t=0.0475226987237068;
+givenTree.DMG69_199809.t=0.02514243395429569;
+givenTree.CCB_4307_200501.t=0.05017210086134915;
+givenTree.CCB_1373_200501.t=0.06199650888629451;
+givenTree.CA16347_200304.t=0.05667668986026606;
+givenTree.Node1477.t=0;
+givenTree.DB_SI9180_04_200401.t=0.07503379557976599;
+givenTree.Node1435.t=0.006649075945457389;
+givenTree.Node2967.t=0.003501921920320515;
+givenTree.Node1438.t=0.03773539801055846;
+givenTree.JLB_Pat65_200006.t=0.007123385069629521;
+givenTree.dn38_200001.t=0.0712924022607309;
+givenTree.Node1429.t=0.007579491604421688;
+givenTree.dn95_200004.t=0.05436652344317682;
+givenTree.EC7_199407.t=0.05349604328760519;
+givenTree.Node2376.t=0.01859094389945138;
+givenTree.Node2567.t=0.02186895244144773;
+givenTree.Pt3635_200201.t=0.04517386105684478;
+givenTree.Node2795.t=0.01907898086307127;
+givenTree.AP_ARRP030_200406.t=0.07190474846484991;
+givenTree.CCB_751_200501.t=0.05648052685965785;
+givenTree.GRSPR55D_200301.t=0.007104560433073624;
+givenTree.Node1443.t=0.0197652107139928;
+givenTree.VHE_Pat2_200101.t=0.05305472275150208;
+givenTree.Node1428.t=0.006748408760043551;
+givenTree.Node53.t=0.06350157821642241;
+givenTree.Node211.t=0;
+givenTree.05_132907_200401.t=0.06665182440507871;
+givenTree.CCB_3538_200501.t=0.0291500388372145;
+givenTree.PS4048_200406.t=0.07747014093195941;
+givenTree.260Pt18_199511.t=0.04040803420317334;
+givenTree.CCB_2112_200501.t=0.07591125697201766;
+givenTree.N03_200301.t=0.01499992037504803;
+givenTree.Node3007.t=0;
+givenTree.Node1367.t=0.01840581664972881;
+givenTree.Node1365.t=0;
+givenTree.Node1345.t=0.006342856917945339;
+givenTree.ARG_41_200001.t=0.08211194532575962;
+givenTree.Node176.t=0.01873527700917159;
+givenTree.Node1357.t=0.01069095666075397;
+givenTree.DH009_200112.t=0.01114957267599379;
+givenTree.Node2817.t=0.003728621010084878;
+givenTree.PCF_Pat177_200101.t=0.06325391920729695;
+givenTree.Node1364.t=0.003893178132788665;
+givenTree.Node3064.t=0.02059433346241893;
+givenTree.Node2721.t=0.006557328158815592;
+givenTree.GRSPR42_200301.t=0.07777049610866153;
+givenTree.Pt5109_200201.t=0.04893769141299931;
+givenTree.KDR_pat40_199603.t=0.02600339921635435;
+givenTree.GRSPR34_200301.t=0;
+givenTree.Node2204.t=0.008149194659990132;
+givenTree.PD_199301.t=0.04186456751477242;
+givenTree.Node1370.t=0.02514647671207779;
+givenTree.Node1344.t=0.01648113305774598;
+givenTree.Node2792.t=0.001258003045216832;
+givenTree.ARG2982_200101.t=0.03359020760474576;
+givenTree.ARG_47_200001.t=0.04343026809723059;
+givenTree.Node1348.t=0.0138738047521961;
+givenTree.Node1346.t=0.0121506316933115;
+givenTree.KDR_pat100_199605.t=0.03286982754152039;
+givenTree.AP_ARRP001_200406.t=0.05138558457955968;
+givenTree.Node306.t=0.01609833476412406;
+givenTree.Node1350.t=0.02251815835553841;
+givenTree.Node328.t=0.0203341927786765;
+givenTree.DMG25_199902.t=0.1022084769951681;
+givenTree.Node1483.t=0.02327583165909111;
+givenTree.Node2069.t=0.01447706117304849;
+givenTree.Node2783.t=0;
+givenTree.Node1358.t=0.03269469681171987;
+givenTree.BREPM275_199901.t=0.1343230744096546;
+givenTree.Node1361.t=0.006059928944779392;
+givenTree.Node130.t=0.02528943600337928;
+givenTree.Node2627.t=0.01045123462403561;
+givenTree.CCB_1065_200501.t=0.06795235561509815;
+givenTree.Node2887.t=0.01866809952720906;
+givenTree.Node2613.t=0.03176638789312543;
+givenTree.MDS_02UANK091_200101.t=0.009022550623152064;
+givenTree.AP_ARRP024_200406.t=0.02933304670039941;
+givenTree.Node1110.t=0;
+givenTree.4000360_200401.t=0.0801099315732231;
+givenTree.BrRJ041_200101.t=0.02184979492002075;
+givenTree.Node1387.t=0;
+givenTree.Node449.t=0.01517136149462915;
+givenTree.Node2514.t=0.01517646863790949;
+givenTree.501907h_199401.t=0.04783111602988942;
+givenTree.4002565_200401.t=0.03103924200111707;
+givenTree.PCF_Pat90_200101.t=0.01951934954003383;
+givenTree.Node1388.t=0.02070259465135581;
+givenTree.GRSPR7_200301.t=0.01542584589302755;
+givenTree.00TH_C3198_200001.t=0.04773124403527279;
+givenTree.Node1398.t=0.01118257342001166;
+givenTree.Node1376.t=0.00364355752114979;
+givenTree.PCF_Pat184_200101.t=0.03307952765667114;
+givenTree.Node1386.t=0.01198069609660277;
+givenTree.SP_LP19_200106.t=0.04583343393777764;
+givenTree.CA18377_200401.t=0.05285236038422799;
+givenTree.Node1394.t=0.006222353309183339;
+givenTree.ED_V62_199901.t=0.01067184256793636;
+givenTree.PCM031_200101.t=0.09033812495254463;
+givenTree.BRRJ884_200104.t=0;
+givenTree.Node1395.t=0.01388815455699523;
+givenTree.BRP2122_200208.t=0.04624994612189052;
+givenTree.SLMT_UD415_200501.t=0.07280054132716196;
+givenTree.N02_200301.t=0.005731626862692293;
+givenTree.CA14315_200203.t=0.07296469105426817;
+givenTree.Node481.t=0.08861609588508407;
+givenTree.Node1377.t=0.007565058002804672;
+givenTree.LV712GRI_199901.t=0.05123586209452713;
+givenTree.Node2305.t=0;
+givenTree.N01_200301.t=0.005552300517634433;
+givenTree.KDR_pat94_199603.t=0;
+givenTree.Node2559.t=0;
+givenTree.N08_200301.t=0;
+givenTree.Node1072.t=0.007160374766431602;
+givenTree.PCF_Pat43_200101.t=0.04696990928616476;
+givenTree.05_132869_200401.t=0.1173064837394692;
+givenTree.CA3930_199903.t=0.03923578599995772;
+givenTree.Node1383.t=0.02837979090113701;
+givenTree.CCB_2044_200501.t=0.05231167439255767;
+givenTree.Node305.t=0.005264692283226857;
+givenTree.Node2237.t=0;
+givenTree.Pt3728_200201.t=0.05496942617510593;
+givenTree.CCB_4950_200501.t=0.09406415170848488;
+givenTree.Node81.t=0.02729273330014673;
+givenTree.Node1378.t=0.006364939767186083;
+givenTree.CCB_5126_200501.t=0.06724976202935144;
+givenTree.CH89_200101.t=0.06672209362513679;
+givenTree.Pt7766_200201.t=0;
+givenTree.CCB_3091_200501.t=0.03523572933978981;
+givenTree.Pt4105_200201.t=0;
+givenTree.Node2780.t=0.00354157933154132;
+givenTree.Node1096.t=0.008514200251985939;
+givenTree.PCF_Pat97_200101.t=0.03896991819956701;
+givenTree.SP_LP32_200106.t=0.04294324898394501;
+givenTree.CA14655_200210.t=0.01518796989752768;
+givenTree.MYIDU8_200401.t=0.04665858338972661;
+givenTree.HG068_199901.t=0.05571613707229799;
+givenTree.Node1097.t=0.01601132562573853;
+givenTree.Node322.t=0.01625384092486147;
+givenTree.SLMT_IVDU077_200501.t=0.06491129049858572;
+givenTree.Pt3784_200201.t=0.04288081012844037;
+givenTree.IP_3_199707.t=0.05452776937285046;
+givenTree.Node1107.t=0.03210532171022585;
+givenTree.JF_125_200501.t=0.118990485381325;
+givenTree.Node428.t=0.01589887528875884;
+givenTree.Node1105.t=0.03412519089747711;
+givenTree.ED_V39_199901.t=0.06938312233382314;
+givenTree.Node1100.t=0.01812056416124572;
+givenTree.143P21_199101.t=0.02484824357295747;
+givenTree.CCB_4974_200501.t=0.04861813719838717;
+givenTree.CA5297_199911.t=0.03099056030699678;
+givenTree.Pt4117_200201.t=0.02134106076742201;
+givenTree.Node1076.t=0.01612339683318616;
+givenTree.KDR_pat175_199602.t=0.04135176358275265;
+givenTree.Node57.t=0;
+givenTree.Pt3640_200201.t=0.044366559339205;
+givenTree.PCF_Pat17_200101.t=0.04013507398095788;
+givenTree.37010_199607.t=0.06314841290640678;
+givenTree.VT05_200201.t=0.0433236667340009;
+givenTree.Node1081.t=0;
+givenTree.Node1087.t=0.008735079904614168;
+givenTree.Node1080.t=0.01524211324245112;
+givenTree.Node1084.t=0.02069391076625085;
+givenTree.Node2518.t=0;
+givenTree.Node1090.t=0.01439259623595357;
+givenTree.Node3009.t=0.004863855807672456;
+givenTree.CA14399_200205.t=0.04675010025094382;
+givenTree.Node1117.t=0.01964586227967699;
+givenTree.Node1092.t=0.02170881373566752;
+givenTree.VT55_200201.t=0.05154365114164024;
+givenTree.Node2362.t=0.01558798375466123;
+givenTree.Node1075.t=0.0114427918861819;
+givenTree.CCB_4854_200501.t=0.09807352830465574;
+givenTree.HG033_199901.t=0.04306806744123453;
+givenTree.KDR_pat29_199603.t=0.05827149882172959;
+givenTree.JA_4876_198701.t=0.02028140135090674;
+givenTree.Node51.t=0.01109944316636901;
+givenTree.ARG_51_200001.t=0.02348366984232914;
+givenTree.Node417.t=0;
+givenTree.Node1134.t=0.02596930854209599;
+givenTree.Pt3753_200201.t=0.02622629809265673;
+givenTree.Node2820.t=0.02183808557496827;
+givenTree.Node2800.t=0.04708534116505203;
+givenTree.CA9793_200110.t=0.07505648192825533;
+givenTree.CA4744_199907.t=0.07444643554297717;
+givenTree.Node2782.t=0;
+givenTree.Node8.t=0.01473673221254513;
+givenTree.IP_98CIRMF10_199801.t=0.03439823128697417;
+givenTree.TTDdp15_200106.t=0.1413959026602888;
+givenTree.Node1151.t=0.04358514657207257;
+givenTree.Node1129.t=0.0207548380229192;
+givenTree.Node2495.t=0.03391736071310137;
+givenTree.JLB_Pat1_200006.t=0.06868998198348343;
+givenTree.Node2317.t=0;
+givenTree.Node1131.t=0.008944163566418707;
+givenTree.Node2858.t=0.004995640498596018;
+givenTree.MI_Pat37_200101.t=0.03927970322370047;
+givenTree.Node154.t=0.02217665923368677;
+givenTree.IP_97CIRMF08_199701.t=0.009025956058192534;
+givenTree.Node1115.t=0.07307518134772047;
+givenTree.JF_018_200501.t=0.08541675001657392;
+givenTree.Node1118.t=0.01995441003326836;
+givenTree.Node3027.t=0.0583991457087614;
+givenTree.AV_M4141N_200501.t=0.07486164926025173;
+givenTree.Node2443.t=0.04702884057452681;
+givenTree.Node1121.t=0.08413648457600977;
+givenTree.Node1073.t=0.005223728283276046;
+givenTree.Node2743.t=0.01478272612521445;
+givenTree.Node1095.t=0.005856422515840553;
+givenTree.CA2307_199901.t=0.04534353859453131;
+givenTree.Node1103.t=0.01564379131652891;
+givenTree.Node298.t=0.003459134658827535;
+givenTree.99TH_C1416_199901.t=0.03513777158736938;
+givenTree.Node2349.t=0.008716218584245082;
+givenTree.Node1114.t=0.05084193505210504;
+givenTree.KDR_pat191_199604.t=0.03618784031674111;
+givenTree.JF_012_200501.t=0.1085494060504868;
+givenTree.SM_01YE382_200101.t=0.1058312599690732;
+givenTree.Node3105.t=0;
+givenTree.AV_M5374N_200501.t=0.0201252494164601;
+givenTree.Node1130.t=0.1006025834097635;
+givenTree.Node1116.t=0.06082565315888686;
+givenTree.Node1113.t=0.00743882711845744;
+givenTree.PCF_Pat198_200101.t=0.02406508923395585;
+givenTree.Node41.t=0.005723369788061431;
+givenTree.Node2409.t=0.004322003117691928;
+givenTree.Pt3263_200201.t=0.03013249671932618;
+givenTree.N55_200301.t=0.07187857892258416;
+givenTree.4003091_200401.t=0.08095018146430313;
+givenTree.BRNE271_200208.t=0.03139903108225663;
+givenTree.Node2584.t=0.003659831816230565;
+givenTree.Node2826.t=0.01828732192462465;
+givenTree.dn60_200003.t=0.05195513029372278;
+givenTree.BRP2047_200104.t=0.02870290286167114;
+givenTree.KDR_pat18_199604.t=0.04699996438206143;
+givenTree.Pt4555_200201.t=0.01995396146191138;
+givenTree.EC8_199407.t=0.0674962457372843;
+givenTree.Node2214.t=0.009368000634729015;
+givenTree.Node1047.t=0.0174179483863749;
+givenTree.4002186_200401.t=0;
+givenTree.BrRJ026_200101.t=0.006451535321677596;
+givenTree.Node977.t=0.003549052263137231;
+givenTree.Node2479.t=0.06080596250859249;
+givenTree.ED_V37_199901.t=0.06591821841992629;
+givenTree.Node2600.t=0.01587149499852134;
+givenTree.Node1048.t=0.02413814942890746;
+givenTree.Node1051.t=0.01533908622342237;
+givenTree.Node1039.t=0.003760476844427639;
+givenTree.38004_199607.t=0.007690723502217433;
+givenTree.CA5389_199911.t=0.05424999673109193;
+givenTree.Node2353.t=0.008246523524655117;
+givenTree.Node1040.t=0.01947685427040826;
+givenTree.Node2440.t=0.003806117931076767;
+givenTree.Node1035.t=0.00838749137550189;
+givenTree.Node1021.t=0.006922722053540248;
+givenTree.Node1028.t=0.004148572355622618;
+givenTree.Node1022.t=0.01371557630160708;
+givenTree.Node2576.t=0.02257496155767136;
+givenTree.CA5627_200001.t=0.06376898240758783;
+givenTree.IP_8_199701.t=0.03054564387359241;
+givenTree.DMG26_199903.t=0.03929156659915509;
+givenTree.Node1044.t=0.04840218666379147;
+givenTree.Node1020.t=0.01049078588479271;
+givenTree.VHE_Pat58_200101.t=0.03461596679683893;
+givenTree.CCB_351_200501.t=0.05314530754163176;
+givenTree.Node978.t=0;
+givenTree.Node2805.t=0.01950420824660942;
+givenTree.MYIDU23_200401.t=0.06121602131460267;
+givenTree.CA16170_200302.t=0.03623047203091388;
+givenTree.DB_SI2704_00_200001.t=0.09737602755778077;
+givenTree.Node1034.t=0;
+givenTree.Node2510.t=0.01017844881660218;
+givenTree.BRRJ928_200208.t=0.05446721620347188;
+givenTree.HG099_199901.t=0.06743078507453408;
+givenTree.CCB_3236_200501.t=0.05071226299749072;
+givenTree.Node976.t=0.007085326952927388;
+givenTree.Node906.t=0;
+givenTree.Node2954.t=0.01871333612562686;
+givenTree.Node2334.t=0.009559215519918366;
+givenTree.CA6606_200005.t=0.05134551008810578;
+givenTree.BRBS535_200104.t=0.02593038930314606;
+givenTree.BR04RS126_200401.t=0.06131802884497876;
+givenTree.Node3094.t=0.01354168210751349;
+givenTree.Node3018.t=0;
+givenTree.Node2201.t=0.002575865945661018;
+givenTree.KDR_pat272_199601.t=0.04533995860351867;
+givenTree.EC3_199407.t=0.0279014007514358;
+givenTree.Node2489.t=0.008828462664354511;
+givenTree.KDR_pat267_199512.t=0.01573599540177427;
+givenTree.CA9968_200110.t=0.01434564290728096;
+givenTree.Node2640.t=0.02761841778859418;
+givenTree.Node1300.t=0.007684899204110911;
+givenTree.BB_90US_873_199001.t=0.02806985786842998;
+givenTree.Node1074.t=0.003859609112957487;
+givenTree.Node1077.t=0.01382190317482112;
+givenTree.05_132922_200401.t=0.07054087872950211;
+givenTree.VHE_Pat8_200101.t=0.06763434142686563;
+givenTree.Pt3565_200201.t=0;
+givenTree.KDR_pat190_199603.t=0.03046905997320823;
+givenTree.260Pt5_199511.t=0.04087322481196286;
+givenTree.02HNsc11_200201.t=0.03805555472641164;
+givenTree.Node1056.t=0.01911631511022457;
+givenTree.Pt3558_200201.t=0.04884439605359098;
+givenTree.Node2951.t=0.01870982829491956;
+givenTree.4004220_200401.t=0;
+givenTree.MI_Pat55_200101.t=0.05585324213500078;
+givenTree.Node148.t=0.003101117559303949;
+givenTree.CA4435_199906.t=0.05532005342320773;
+givenTree.Node2577.t=0;
+givenTree.Node1066.t=0.01528912613517563;
+givenTree.Node120.t=0.007622333107923604;
+givenTree.Node1067.t=0.007007726652871369;
+givenTree.Node2133.t=0.007401169537029989;
+givenTree.Node1055.t=0.01291593230492526;
+givenTree.690168j_199401.t=0.03119017707778567;
+givenTree.Pt5643_200201.t=0.01529216443358165;
+givenTree.Node245.t=0.01483678972310055;
+givenTree.Node1061.t=0;
+givenTree.Node480.t=0.01572038241906131;
+givenTree.Pt5085_200201.t=0;
+givenTree.CA14535_200207.t=0.05170603271839026;
+givenTree.Node62.t=0.01721012981972484;
+givenTree.Node1213.t=0;
+givenTree.Node2524.t=0;
+givenTree.ARG02_199701.t=0.0110533584396273;
+givenTree.Node2922.t=0.008373310611227296;
+givenTree.CH124_200101.t=0.04258009647650528;
+givenTree.Node3080.t=0;
+givenTree.Node1220.t=0.01434767705625411;
+givenTree.Node2626.t=0;
+givenTree.Node1205.t=0;
+givenTree.Node2971.t=0.00709888361591663;
+givenTree.A050_199701.t=0.0465701715912261;
+givenTree.CCB_2738_200501.t=0.03099401087612327;
+givenTree.Node464.t=0;
+givenTree.Node2542.t=0;
+givenTree.Node1230.t=0.003924319845278919;
+givenTree.Node1229.t=0;
+givenTree.Node2750.t=0.004007925287710557;
+givenTree.Pt4640_200201.t=0.03675326653193567;
+givenTree.Node1204.t=0.003646541762870997;
+givenTree.Node2763.t=0.01673136471737977;
+givenTree.Node2620.t=0.005959400677405727;
+givenTree.ARG12_199701.t=0.03489415577216962;
+givenTree.A027_199901.t=0.02820039705347934;
+givenTree.AP_ARRP054_200406.t=0.09455166046340896;
+givenTree.AP_ARRP004_200406.t=0.03999202572191445;
+givenTree.Node1306.t=0.03873446686945928;
+givenTree.ARG15_199701.t=0.03412245192834176;
+givenTree.AP_ARRP050_200406.t=0.07021124935717207;
+givenTree.Node1210.t=0.005225084923691762;
+givenTree.CCB_1973_200501.t=0;
+givenTree.Node372.t=0.009918417610521186;
+givenTree.Node443.t=0.004740766714969808;
+givenTree.A32989_199701.t=0.0304455522388083;
+givenTree.ARG13_199701.t=0.01140726574646335;
+givenTree.mother_199601.t=0.02161452330262505;
+givenTree.Pt1025_200201.t=0.04174194043199153;
+givenTree.CH37_200101.t=0.03498546439660698;
+givenTree.Node3017.t=0;
+givenTree.Node1215.t=0.007229049251542561;
+givenTree.Node2517.t=0.01703233597031448;
+givenTree.N31_200301.t=0.07401817429502304;
+givenTree.Node2527.t=0.003723208188145058;
+givenTree.Node72.t=0.008470581061491587;
+givenTree.Node10.t=0.006675244596268789;
+givenTree.Node1201.t=0.005458269250255135;
+givenTree.Node1216.t=0;
+givenTree.AP_ARRP035_200406.t=0.05121220975668174;
+givenTree.CH69_200101.t=0.07878761268379322;
+givenTree.Pt5757_200201.t=0.006891891781634968;
+givenTree.GRSPR40_200301.t=0.04653838182399371;
+givenTree.Node1245.t=0.009309329004624983;
+givenTree.BRRJ901_200208.t=0.1404079662947255;
+givenTree.Node2554.t=0.00701438764074684;
+givenTree.AP_ARRP053_200406.t=0.07006274922989107;
+givenTree.Node304.t=0.002701435582557458;
+givenTree.A32879_199701.t=0.04651841547625978;
+givenTree.ARG36_199701.t=0.03245824398246648;
+givenTree.X1241_200201.t=0.06100705413744734;
+givenTree.Node1244.t=0.003552242907716057;
+givenTree.Node272.t=0.01032434079131537;
+givenTree.Node1171.t=0.005237236096478017;
+givenTree.Node1274.t=0.02252175625499294;
+givenTree.Node1199.t=0;
+givenTree.HG048_199901.t=0.01738103095976903;
+givenTree.AP_ARRP044_200406.t=0.0517080627545891;
+givenTree.VT78_200201.t=0.05302480215345339;
+givenTree.Node1202.t=0.003513000414754896;
+givenTree.MYIDUA11_200401.t=0.02454805619713535;
+givenTree.A047_199901.t=0.01600543029978023;
+givenTree.CH109_200101.t=0.06739775032868529;
+givenTree.Node2520.t=0;
+givenTree.Node1225.t=0;
+givenTree.Node237.t=0.01131136522476522;
+givenTree.Node232.t=0.007668272813748051;
+givenTree.Node1234.t=0.02053969300570064;
+givenTree.AP_ARRP015_200406.t=0.11638899680014;
+givenTree.RR_MAD_MO250_200501.t=0.04180747692270363;
+givenTree.AP_ARRP013_200406.t=0.05874009527580114;
+givenTree.Node2749.t=0;
+givenTree.Node2405.t=0;
+givenTree.Node1240.t=0;
+givenTree.Node1235.t=0.004261202957684432;
+givenTree.02THOUR847I_200201.t=0.06462647059102426;
+givenTree.Node1228.t=0;
+givenTree.Node1251.t=0.009505412282366649;
+givenTree.Node195.t=0.0231991767910846;
+givenTree.ARG29_199701.t=0.04716606343770721;
+givenTree.Node2892.t=0.07291100982972859;
+givenTree.Node323.t=0.02296303949827172;
+givenTree.Node199.t=0.03676092840716349;
+givenTree.CCB_2638_200501.t=0.04181076083997904;
+givenTree.CCB_4137_200501.t=0.03804548979199446;
+givenTree.ARG28_199701.t=0.0516647520160169;
+givenTree.HG102_199901.t=0.04848870266276192;
+givenTree.ARG_44_200001.t=0.03113956736436206;
+givenTree.Node1173.t=0.006132226105834365;
+givenTree.CCB_1104_200501.t=0.04195702445640382;
+givenTree.AP_ARRP026_200406.t=0.0701104616444517;
+givenTree.Node2350.t=0;
+givenTree.VT60_200201.t=0.0909595492058061;
+givenTree.Node1138.t=0.007962040655446277;
+givenTree.Node1112.t=0;
+givenTree.N72_200301.t=0.1850454341766379;
+givenTree.Node1154.t=0.04568987571128624;
+givenTree.Node3061.t=0;
+givenTree.CA14615_200209.t=0.0593323685527123;
+givenTree.Node2072.t=0.007550214740284895;
+givenTree.Node1139.t=0.009872136971154759;
+givenTree.CA9947_200104.t=0.01067845680228929;
+givenTree.Node1166.t=0.007488091788469493;
+givenTree.Node2372.t=0.01582275594038884;
+givenTree.VT73b_200201.t=0.03230386695053054;
+givenTree.Node1164.t=0.007619943519391483;
+givenTree.MDS_01UAKV259_200101.t=0.004434403773432572;
+givenTree.Node2453.t=0.007052568584856514;
+givenTree.Node2411.t=0.007617127986675879;
+givenTree.Node1128.t=0.01528197658415962;
+givenTree.CCB_1769_200501.t=0.01305784307726079;
+givenTree.VT33_200201.t=0.040000214538861;
+givenTree.Node183.t=0.008629402279463986;
+givenTree.Node469.t=0.007166096215252726;
+givenTree.97KE100_199701.t=0.08518366339576051;
+givenTree.CA6884_200007.t=0.06509416645533561;
+givenTree.Node1145.t=0.008004899381241321;
+givenTree.05_132873_200401.t=0.07029891935509738;
+givenTree.98KE234_199801.t=0.05000562664120284;
+givenTree.Node1141.t=0.05570018044675498;
+givenTree.Node173.t=0.01496624114528617;
+givenTree.Pt3106_200201.t=0;
+givenTree.RR_MAD_MO055_200501.t=0.1185879656460217;
+givenTree.Node1144.t=0.06883548027786285;
+givenTree.Node2310.t=0.007209085076002177;
+givenTree.Node216.t=0;
+givenTree.SP_LP28_200106.t=0.1230689648391337;
+givenTree.VC_pat207_199901.t=0.07893624422032867;
+givenTree.Node2188.t=0.008652244587977784;
+givenTree.Node1149.t=0.05784576737788523;
+givenTree.ARG33_199701.t=0.02313706036028963;
+givenTree.NTHvr60_200301.t=0.1067529486909512;
+givenTree.TH283_200101.t=0.105668611093668;
+givenTree.AS_BOC_199801.t=0.0453735246090755;
+givenTree.Node1140.t=0.01457132634720851;
+givenTree.DH017_200112.t=0.04969483332778882;
+givenTree.Node3060.t=0;
+givenTree.Node238.t=0;
+givenTree.AP_ARRP028_200406.t=0.0653168301189111;
+givenTree.Node1192.t=0.005847375584835721;
+givenTree.BRSP451_200208.t=0.1232968850136102;
+givenTree.Node71.t=0.01551524879946218;
+givenTree.CH33_200101.t=0.02768145851297604;
+givenTree.Node1191.t=0.01267205468299286;
+givenTree.Node1183.t=0.003086768314887546;
+givenTree.Node1175.t=0;
+givenTree.Node2818.t=0;
+givenTree.Node1207.t=0.007483144537593296;
+givenTree.Node1188.t=0.01277331748491096;
+givenTree.Node2992.t=0.00444413930395442;
+givenTree.Node2867.t=0.004213838743809564;
+givenTree.Node1601.t=0;
+givenTree.4004188_200401.t=0.06032687574981075;
+givenTree.BRP2109_200208.t=0.02095479419431402;
+givenTree.MDS_02UANK011_200101.t=0.01353361627229278;
+givenTree.CH15_200101.t=0.01138710314628566;
+givenTree.CH14_200101.t=0.03908137716659587;
+givenTree.RR_MAD_MO132_200501.t=0.004732295656117992;
+givenTree.Node1520.t=0;
+givenTree.Node1195.t=0.03557746156063054;
+givenTree.Node73.t=0.03011509064699559;
+givenTree.AP_ARRP025_200406.t=0.08629145914378748;
+givenTree.Node2673.t=0.005053914496040503;
+givenTree.AP_ARRP059_200406.t=0.06950652120525784;
+givenTree.Node1180.t=0.06073840024181445;
+givenTree.BRC1517_200208.t=0.03402365994760854;
+givenTree.Node1177.t=0.002489141673662135;
+givenTree.AP_ARRP005_200406.t=0.1223104552134286;
+givenTree.01UYTRA1179_200101.t=0.03334158886683688;
+givenTree.Node1165.t=0.04630294359149382;
+givenTree.VC_pat257_199901.t=0.03102349011578342;
+givenTree.Node1174.t=0;
+givenTree.CH1_200101.t=0.03425282449186325;
+givenTree.ARG01_199701.t=0.005708544225820219;
+givenTree.ARG10_199701.t=0.03525686718147615;
+givenTree.Node2811.t=0.002850190525329813;
+givenTree.MYIDU17_200401.t=0.01904604151356186;
+givenTree.ARG1649_200101.t=0.05083065810333578;
+givenTree.Node3109.t=0;
+givenTree.Node2470.t=0.05208501415211916;
+givenTree.A32878_199701.t=0;
+givenTree.Node476.t=0.01436975290755809;
+givenTree.Node87.t=0.0107110448130524;
+givenTree.AP_ARRP003_200406.t=0.06266070882953464;
+givenTree.ARG_49_200001.t=0.004977321476814656;
+DataSet ds = ReadDataFile(USE_NEXUS_FILE_DATA);
+DataSetFilter nucData = CreateFilter(ds,1,"0-872","5,741,2700,257,260,3027,3067,12,1326,2724,432,1987,2743,772,936,2789,938,2852,1124,2384,2851,94,622,626,640,657,2749,247,2587,326,2881,111,1355,3079,1350,2200,1518,1519,137,1719,1726,785,1156,1258,2619,1590,1721,783,1086,1992,1315,1668,1715,1772,1594,2635,290,1342,2194,808,2714,964,2776,1203,2447,2618,2705,1039,3086,1771,2947,144,559,1389,650,1977,790,1029,2747,1717,1820,563,2448,311,1462,2914,849,2736,887,918,1276,1285,2912,145,2444,123 [...]
+LikelihoodFunction nucLF = (nucData,givenTree);
+OPTIMIZATION_METHOD = 0;
+VERBOSITY_LEVEL = 1;
+Optimize (res, nucLF);
+fprintf (stdout, nucLF);
+/* test epilogue */
+	timeMatrix = endTestTimer 				  (_testDescription);
+	if (logTestResult (Abs (res[1][0] - _expectedLL) < 0.01))
+	{
+		return timeMatrix;
+	}
+	return 0;
+/* end test epilogue */
+END;
\ No newline at end of file
diff --git a/tests/hbltests/SimpleOptimizations/SmallCodon.bf b/tests/hbltests/SimpleOptimizations/SmallCodon.bf
new file mode 100644
index 0000000..1b7c450
--- /dev/null
+++ b/tests/hbltests/SimpleOptimizations/SmallCodon.bf
@@ -0,0 +1,675 @@
+#NEXUS
+
+BEGIN TAXA;
+	DIMENSIONS NTAX = 8;
+	TAXLABELS
+		'B_FR_83_HXB2_ACC_K03455' 'B_US_83_RF_ACC_M17451' 'B_US_86_JRFL_ACC_U63632' 'B_US_90_WEAU160_ACC_U21135' 'D_CD_83_ELI_ACC_K03454' 'D_CD_83_NDK_ACC_M27323' 'D_CD_84_84ZR085_ACC_U88822' 'D_UG_94_94UG114_ACC_U88824';
+END;
+
+BEGIN CHARACTERS;
+	DIMENSIONS NCHAR = 1320;
+	FORMAT
+		DATATYPE = DNA
+		GAP=-
+		MISSING=?
+	;
+
+MATRIX
+	'B_FR_83_HXB2_ACC_K03455'     CCCATTAGCCCTATTGAGACTGTACCAGTAAAATTAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAATAAAAGCATTAGTAGAAATTTGTACAGAGATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAAGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGATGGAA [...]
+	'B_US_83_RF_ACC_M17451'       CCCATTAGTCCTATTGAAACTGTACCAGTAAAATTAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAGGAAAAAATAAAAGCATTGGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCCAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAGTTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAGAAATCAGTAACAGTATTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATAAAGAGTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAAACACCACGGATTAGATATCAGTACAATGTGCTTCCACAAGGGTGGAA [...]
+	'B_US_86_JRFL_ACC_U63632'     CCCATTAGTCCTATTGAAACTGTACCAGTAAAATTAAAGCCAGGAATGGATGGCCCAAAAGTCAAACAATGGCCATTGACAGAAGAAAAAATAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAGAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATAAAGACTTCAGGAAATATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGGTATCAGTACAATGTGCTTCCGCAGGGATGGAA [...]
+	'B_US_90_WEAU160_ACC_U21135'  CCCATTAGTCCTATTGAAACTGTACCAGTAAAATTAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAGAAAATAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTTCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTACCCTTAGATGAAGACTTCAGGAAGTACACTGCATTTACCATACCTAGTATAAACAATGAAACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGATGGAA [...]
+	'D_CD_83_ELI_ACC_K03454'      CCAATTAGTCCTATTGAAACTGTACCAGTAAAATTAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAATAAAAGCATTAACAGAAATTTGTACAGATATGGAAAAGGAAGGAAAAATTTCAAGAATTGGGCCTGAAAATCCATACAATACTCCAATATTTGCCATAAAGAAAAAAGACAGTACCAAGTGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGATTTCTGGGAAGTTCAATTAGGAATACCGCATCCTGCAGGGCTGAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAAGATTTTAGGAAATATACCGCCTTTACCATATCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGATGGAA [...]
+	'D_CD_83_NDK_ACC_M27323'      CCAATTAGTCCTATTGAAACTGTACCAGTAAAATTAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAATAAAAGCATTAACAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAGAATTGGGCCTGAAAATCCATATAATACTCCAATATTTGCCATAAAGAAAAAAGACAGTACCAAGTGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGATTTCTGGGAGGTTCAATTAGGAATACCGCATCCTGCAGGGCTGAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATGAAGATTTTAGGAAATATACCGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTCCCACAGGGATGGAA [...]
+	'D_CD_84_84ZR085_ACC_U88822'  CCAATTAGTCCTATTGAAACTGTACCAGTAAAATTAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCGTTGACAGAAGAAAAAATAAAAGCATTAACAGAAATTTGTACAGATATGGAAAAGGAAGGAAAAATTTCAAGAATTGGGCCTGAAAATCCATACAATACTCCAATATTTGCCATAAAGAAAAAAGACAGTACTAAGTGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGGATACCACATCCTGCAGGATTAAAGAAGAAAAAGTCAATAACAGTACTGGATGTGGGCGATGCATATTTTTCAATTCCCTTATGTGAAGACTTTAGGAAGTACACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTACTTCCACAGGGATGGAA [...]
+	'D_UG_94_94UG114_ACC_U88824'  CCAATTAGTCCTATTGAAACTGTACCAGTAAAATTAAAGCCAGGGATGGATGGCCCAAAAGTTAAACAATGGCCGTTGACAGAAGAAAAAATAAAAGCACTAATAGAAATTTGTTCAGAACTAGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAACCCATACAATACTCCAATATTTGCCATAAAGAAAAAAGACAGTACTAAGTGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTTTGGGAAGTTCAACTAGGAATACCACATCCTGCAGGGCTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGACGCATATTTTTCAGTTCCCTTACATGAAGACTTTAGAAAATATACCGCATTCACCATACCTAGTACAAACAATGAGACACCAGGAATTAGATATCAGTACAATGTGCTTCCACAAGGATGGAA [...]
+END;
+
+BEGIN TREES;
+	TREE tree = ((((D_CD_83_ELI_ACC_K03454,D_CD_83_NDK_ACC_M27323),D_UG_94_94UG114_ACC_U88824),D_CD_84_84ZR085_ACC_U88822),B_US_83_RF_ACC_M17451,((B_FR_83_HXB2_ACC_K03455,B_US_86_JRFL_ACC_U63632),B_US_90_WEAU160_ACC_U21135));
+END;
+
+BEGIN HYPHY;
+
+/* test preamble */
+
+	_testDescription 		= " fit the MG94x012232 model to an HIV-1 RT (p51) alignment with 8 sequences and 430 codons";
+	_expectedLL 			= -3189.516375;
+	ExecuteAFile ("../Shared/TestInstrumentation.bf");
+	startTestTimer (_testDescription);
+
+/* end test preamble */
+
+OPTIMIZATION_PRECISION = 0.001;
+VERBOSITY_LEVEL        = -1;
+
+LF_SMOOTHING_SCALER = 0.001;
+
+global AT=1;
+global CT=1;
+global R=1;
+global AC=1;
+global CG:=AT;
+global GT:=AT;
+
+MG94custom={61,61};
+MG94custom[0][1]:=AC*R*synRate*0.10767;
+MG94custom[0][2]:=synRate*0.19375;
+MG94custom[0][3]:=AT*R*synRate*0.220455;
+MG94custom[0][4]:=AC*R*synRate*0.20142;
+MG94custom[0][8]:=R*synRate*0.150568;
+MG94custom[0][12]:=AT*R*synRate*0.261648;
+MG94custom[0][16]:=AC*R*synRate*0.189773;
+MG94custom[0][32]:=R*synRate*0.284375;
+MG94custom[1][0]:=AC*R*synRate*0.478125;
+MG94custom[1][2]:=CG*R*synRate*0.19375;
+MG94custom[1][3]:=CT*synRate*0.220455;
+MG94custom[1][5]:=AC*R*synRate*0.20142;
+MG94custom[1][9]:=R*synRate*0.150568;
+MG94custom[1][13]:=AT*R*synRate*0.261648;
+MG94custom[1][17]:=AC*R*synRate*0.189773;
+MG94custom[1][33]:=R*synRate*0.284375;
+MG94custom[1][48]:=AT*R*synRate*0.176989;
+MG94custom[2][0]:=synRate*0.478125;
+MG94custom[2][1]:=CG*R*synRate*0.10767;
+MG94custom[2][3]:=GT*R*synRate*0.220455;
+MG94custom[2][6]:=AC*R*synRate*0.20142;
+MG94custom[2][10]:=R*synRate*0.150568;
+MG94custom[2][14]:=AT*R*synRate*0.261648;
+MG94custom[2][18]:=AC*R*synRate*0.189773;
+MG94custom[2][34]:=R*synRate*0.284375;
+MG94custom[3][0]:=AT*R*synRate*0.478125;
+MG94custom[3][1]:=CT*synRate*0.10767;
+MG94custom[3][2]:=GT*R*synRate*0.19375;
+MG94custom[3][7]:=AC*R*synRate*0.20142;
+MG94custom[3][11]:=R*synRate*0.150568;
+MG94custom[3][15]:=AT*R*synRate*0.261648;
+MG94custom[3][19]:=AC*R*synRate*0.189773;
+MG94custom[3][35]:=R*synRate*0.284375;
+MG94custom[3][49]:=AT*R*synRate*0.176989;
+MG94custom[4][0]:=AC*R*synRate*0.386364;
+MG94custom[4][5]:=AC*synRate*0.10767;
+MG94custom[4][6]:=synRate*0.19375;
+MG94custom[4][7]:=AT*synRate*0.220455;
+MG94custom[4][8]:=CG*R*synRate*0.150568;
+MG94custom[4][12]:=CT*R*synRate*0.261648;
+MG94custom[4][20]:=AC*R*synRate*0.189773;
+MG94custom[4][36]:=R*synRate*0.284375;
+MG94custom[4][50]:=AT*R*synRate*0.176989;
+MG94custom[5][1]:=AC*R*synRate*0.386364;
+MG94custom[5][4]:=AC*synRate*0.478125;
+MG94custom[5][6]:=CG*synRate*0.19375;
+MG94custom[5][7]:=CT*synRate*0.220455;
+MG94custom[5][9]:=CG*R*synRate*0.150568;
+MG94custom[5][13]:=CT*R*synRate*0.261648;
+MG94custom[5][21]:=AC*R*synRate*0.189773;
+MG94custom[5][37]:=R*synRate*0.284375;
+MG94custom[5][51]:=AT*R*synRate*0.176989;
+MG94custom[6][2]:=AC*R*synRate*0.386364;
+MG94custom[6][4]:=synRate*0.478125;
+MG94custom[6][5]:=CG*synRate*0.10767;
+MG94custom[6][7]:=GT*synRate*0.220455;
+MG94custom[6][10]:=CG*R*synRate*0.150568;
+MG94custom[6][14]:=CT*R*synRate*0.261648;
+MG94custom[6][22]:=AC*R*synRate*0.189773;
+MG94custom[6][38]:=R*synRate*0.284375;
+MG94custom[6][52]:=AT*R*synRate*0.176989;
+MG94custom[7][3]:=AC*R*synRate*0.386364;
+MG94custom[7][4]:=AT*synRate*0.478125;
+MG94custom[7][5]:=CT*synRate*0.10767;
+MG94custom[7][6]:=GT*synRate*0.19375;
+MG94custom[7][11]:=CG*R*synRate*0.150568;
+MG94custom[7][15]:=CT*R*synRate*0.261648;
+MG94custom[7][23]:=AC*R*synRate*0.189773;
+MG94custom[7][39]:=R*synRate*0.284375;
+MG94custom[7][53]:=AT*R*synRate*0.176989;
+MG94custom[8][0]:=R*synRate*0.386364;
+MG94custom[8][4]:=CG*R*synRate*0.20142;
+MG94custom[8][9]:=AC*R*synRate*0.10767;
+MG94custom[8][10]:=synRate*0.19375;
+MG94custom[8][11]:=AT*R*synRate*0.220455;
+MG94custom[8][12]:=GT*R*synRate*0.261648;
+MG94custom[8][24]:=AC*synRate*0.189773;
+MG94custom[8][40]:=R*synRate*0.284375;
+MG94custom[9][1]:=R*synRate*0.386364;
+MG94custom[9][5]:=CG*R*synRate*0.20142;
+MG94custom[9][8]:=AC*R*synRate*0.478125;
+MG94custom[9][10]:=CG*R*synRate*0.19375;
+MG94custom[9][11]:=CT*synRate*0.220455;
+MG94custom[9][13]:=GT*R*synRate*0.261648;
+MG94custom[9][25]:=AC*R*synRate*0.189773;
+MG94custom[9][41]:=R*synRate*0.284375;
+MG94custom[9][54]:=AT*R*synRate*0.176989;
+MG94custom[10][2]:=R*synRate*0.386364;
+MG94custom[10][6]:=CG*R*synRate*0.20142;
+MG94custom[10][8]:=synRate*0.478125;
+MG94custom[10][9]:=CG*R*synRate*0.10767;
+MG94custom[10][11]:=GT*R*synRate*0.220455;
+MG94custom[10][14]:=GT*R*synRate*0.261648;
+MG94custom[10][26]:=AC*synRate*0.189773;
+MG94custom[10][42]:=R*synRate*0.284375;
+MG94custom[10][55]:=AT*R*synRate*0.176989;
+MG94custom[11][3]:=R*synRate*0.386364;
+MG94custom[11][7]:=CG*R*synRate*0.20142;
+MG94custom[11][8]:=AT*R*synRate*0.478125;
+MG94custom[11][9]:=CT*synRate*0.10767;
+MG94custom[11][10]:=GT*R*synRate*0.19375;
+MG94custom[11][15]:=GT*R*synRate*0.261648;
+MG94custom[11][27]:=AC*R*synRate*0.189773;
+MG94custom[11][43]:=R*synRate*0.284375;
+MG94custom[11][56]:=AT*R*synRate*0.176989;
+MG94custom[12][0]:=AT*R*synRate*0.386364;
+MG94custom[12][4]:=CT*R*synRate*0.20142;
+MG94custom[12][8]:=GT*R*synRate*0.150568;
+MG94custom[12][13]:=AC*synRate*0.10767;
+MG94custom[12][14]:=R*synRate*0.19375;
+MG94custom[12][15]:=AT*synRate*0.220455;
+MG94custom[12][28]:=AC*R*synRate*0.189773;
+MG94custom[12][44]:=R*synRate*0.284375;
+MG94custom[12][57]:=AT*R*synRate*0.176989;
+MG94custom[13][1]:=AT*R*synRate*0.386364;
+MG94custom[13][5]:=CT*R*synRate*0.20142;
+MG94custom[13][9]:=GT*R*synRate*0.150568;
+MG94custom[13][12]:=AC*synRate*0.478125;
+MG94custom[13][14]:=CG*R*synRate*0.19375;
+MG94custom[13][15]:=CT*synRate*0.220455;
+MG94custom[13][29]:=AC*R*synRate*0.189773;
+MG94custom[13][45]:=R*synRate*0.284375;
+MG94custom[13][58]:=AT*R*synRate*0.176989;
+MG94custom[14][2]:=AT*R*synRate*0.386364;
+MG94custom[14][6]:=CT*R*synRate*0.20142;
+MG94custom[14][10]:=GT*R*synRate*0.150568;
+MG94custom[14][12]:=R*synRate*0.478125;
+MG94custom[14][13]:=CG*R*synRate*0.10767;
+MG94custom[14][15]:=GT*R*synRate*0.220455;
+MG94custom[14][30]:=AC*R*synRate*0.189773;
+MG94custom[14][46]:=R*synRate*0.284375;
+MG94custom[14][59]:=AT*R*synRate*0.176989;
+MG94custom[15][3]:=AT*R*synRate*0.386364;
+MG94custom[15][7]:=CT*R*synRate*0.20142;
+MG94custom[15][11]:=GT*R*synRate*0.150568;
+MG94custom[15][12]:=AT*synRate*0.478125;
+MG94custom[15][13]:=CT*synRate*0.10767;
+MG94custom[15][14]:=GT*R*synRate*0.19375;
+MG94custom[15][31]:=AC*R*synRate*0.189773;
+MG94custom[15][47]:=R*synRate*0.284375;
+MG94custom[15][60]:=AT*R*synRate*0.176989;
+MG94custom[16][0]:=AC*R*synRate*0.348864;
+MG94custom[16][17]:=AC*R*synRate*0.10767;
+MG94custom[16][18]:=synRate*0.19375;
+MG94custom[16][19]:=AT*R*synRate*0.220455;
+MG94custom[16][20]:=AC*R*synRate*0.20142;
+MG94custom[16][24]:=R*synRate*0.150568;
+MG94custom[16][28]:=AT*R*synRate*0.261648;
+MG94custom[16][32]:=CG*R*synRate*0.284375;
+MG94custom[17][1]:=AC*R*synRate*0.348864;
+MG94custom[17][16]:=AC*R*synRate*0.478125;
+MG94custom[17][18]:=CG*R*synRate*0.19375;
+MG94custom[17][19]:=CT*synRate*0.220455;
+MG94custom[17][21]:=AC*R*synRate*0.20142;
+MG94custom[17][25]:=R*synRate*0.150568;
+MG94custom[17][29]:=AT*R*synRate*0.261648;
+MG94custom[17][33]:=CG*R*synRate*0.284375;
+MG94custom[17][48]:=CT*R*synRate*0.176989;
+MG94custom[18][2]:=AC*R*synRate*0.348864;
+MG94custom[18][16]:=synRate*0.478125;
+MG94custom[18][17]:=CG*R*synRate*0.10767;
+MG94custom[18][19]:=GT*R*synRate*0.220455;
+MG94custom[18][22]:=AC*R*synRate*0.20142;
+MG94custom[18][26]:=R*synRate*0.150568;
+MG94custom[18][30]:=AT*R*synRate*0.261648;
+MG94custom[18][34]:=CG*R*synRate*0.284375;
+MG94custom[19][3]:=AC*R*synRate*0.348864;
+MG94custom[19][16]:=AT*R*synRate*0.478125;
+MG94custom[19][17]:=CT*synRate*0.10767;
+MG94custom[19][18]:=GT*R*synRate*0.19375;
+MG94custom[19][23]:=AC*R*synRate*0.20142;
+MG94custom[19][27]:=R*synRate*0.150568;
+MG94custom[19][31]:=AT*R*synRate*0.261648;
+MG94custom[19][35]:=CG*R*synRate*0.284375;
+MG94custom[19][49]:=CT*R*synRate*0.176989;
+MG94custom[20][4]:=AC*R*synRate*0.348864;
+MG94custom[20][16]:=AC*R*synRate*0.386364;
+MG94custom[20][21]:=AC*synRate*0.10767;
+MG94custom[20][22]:=synRate*0.19375;
+MG94custom[20][23]:=AT*synRate*0.220455;
+MG94custom[20][24]:=CG*R*synRate*0.150568;
+MG94custom[20][28]:=CT*R*synRate*0.261648;
+MG94custom[20][36]:=CG*R*synRate*0.284375;
+MG94custom[20][50]:=CT*R*synRate*0.176989;
+MG94custom[21][5]:=AC*R*synRate*0.348864;
+MG94custom[21][17]:=AC*R*synRate*0.386364;
+MG94custom[21][20]:=AC*synRate*0.478125;
+MG94custom[21][22]:=CG*synRate*0.19375;
+MG94custom[21][23]:=CT*synRate*0.220455;
+MG94custom[21][25]:=CG*R*synRate*0.150568;
+MG94custom[21][29]:=CT*R*synRate*0.261648;
+MG94custom[21][37]:=CG*R*synRate*0.284375;
+MG94custom[21][51]:=CT*R*synRate*0.176989;
+MG94custom[22][6]:=AC*R*synRate*0.348864;
+MG94custom[22][18]:=AC*R*synRate*0.386364;
+MG94custom[22][20]:=synRate*0.478125;
+MG94custom[22][21]:=CG*synRate*0.10767;
+MG94custom[22][23]:=GT*synRate*0.220455;
+MG94custom[22][26]:=CG*R*synRate*0.150568;
+MG94custom[22][30]:=CT*R*synRate*0.261648;
+MG94custom[22][38]:=CG*R*synRate*0.284375;
+MG94custom[22][52]:=CT*R*synRate*0.176989;
+MG94custom[23][7]:=AC*R*synRate*0.348864;
+MG94custom[23][19]:=AC*R*synRate*0.386364;
+MG94custom[23][20]:=AT*synRate*0.478125;
+MG94custom[23][21]:=CT*synRate*0.10767;
+MG94custom[23][22]:=GT*synRate*0.19375;
+MG94custom[23][27]:=CG*R*synRate*0.150568;
+MG94custom[23][31]:=CT*R*synRate*0.261648;
+MG94custom[23][39]:=CG*R*synRate*0.284375;
+MG94custom[23][53]:=CT*R*synRate*0.176989;
+MG94custom[24][8]:=AC*synRate*0.348864;
+MG94custom[24][16]:=R*synRate*0.386364;
+MG94custom[24][20]:=CG*R*synRate*0.20142;
+MG94custom[24][25]:=AC*synRate*0.10767;
+MG94custom[24][26]:=synRate*0.19375;
+MG94custom[24][27]:=AT*synRate*0.220455;
+MG94custom[24][28]:=GT*R*synRate*0.261648;
+MG94custom[24][40]:=CG*R*synRate*0.284375;
+MG94custom[25][9]:=AC*R*synRate*0.348864;
+MG94custom[25][17]:=R*synRate*0.386364;
+MG94custom[25][21]:=CG*R*synRate*0.20142;
+MG94custom[25][24]:=AC*synRate*0.478125;
+MG94custom[25][26]:=CG*synRate*0.19375;
+MG94custom[25][27]:=CT*synRate*0.220455;
+MG94custom[25][29]:=GT*R*synRate*0.261648;
+MG94custom[25][41]:=CG*R*synRate*0.284375;
+MG94custom[25][54]:=CT*R*synRate*0.176989;
+MG94custom[26][10]:=AC*synRate*0.348864;
+MG94custom[26][18]:=R*synRate*0.386364;
+MG94custom[26][22]:=CG*R*synRate*0.20142;
+MG94custom[26][24]:=synRate*0.478125;
+MG94custom[26][25]:=CG*synRate*0.10767;
+MG94custom[26][27]:=GT*synRate*0.220455;
+MG94custom[26][30]:=GT*R*synRate*0.261648;
+MG94custom[26][42]:=CG*R*synRate*0.284375;
+MG94custom[26][55]:=CT*R*synRate*0.176989;
+MG94custom[27][11]:=AC*R*synRate*0.348864;
+MG94custom[27][19]:=R*synRate*0.386364;
+MG94custom[27][23]:=CG*R*synRate*0.20142;
+MG94custom[27][24]:=AT*synRate*0.478125;
+MG94custom[27][25]:=CT*synRate*0.10767;
+MG94custom[27][26]:=GT*synRate*0.19375;
+MG94custom[27][31]:=GT*R*synRate*0.261648;
+MG94custom[27][43]:=CG*R*synRate*0.284375;
+MG94custom[27][56]:=CT*R*synRate*0.176989;
+MG94custom[28][12]:=AC*R*synRate*0.348864;
+MG94custom[28][16]:=AT*R*synRate*0.386364;
+MG94custom[28][20]:=CT*R*synRate*0.20142;
+MG94custom[28][24]:=GT*R*synRate*0.150568;
+MG94custom[28][29]:=AC*synRate*0.10767;
+MG94custom[28][30]:=synRate*0.19375;
+MG94custom[28][31]:=AT*synRate*0.220455;
+MG94custom[28][44]:=CG*R*synRate*0.284375;
+MG94custom[28][57]:=CT*synRate*0.176989;
+MG94custom[29][13]:=AC*R*synRate*0.348864;
+MG94custom[29][17]:=AT*R*synRate*0.386364;
+MG94custom[29][21]:=CT*R*synRate*0.20142;
+MG94custom[29][25]:=GT*R*synRate*0.150568;
+MG94custom[29][28]:=AC*synRate*0.478125;
+MG94custom[29][30]:=CG*synRate*0.19375;
+MG94custom[29][31]:=CT*synRate*0.220455;
+MG94custom[29][45]:=CG*R*synRate*0.284375;
+MG94custom[29][58]:=CT*R*synRate*0.176989;
+MG94custom[30][14]:=AC*R*synRate*0.348864;
+MG94custom[30][18]:=AT*R*synRate*0.386364;
+MG94custom[30][22]:=CT*R*synRate*0.20142;
+MG94custom[30][26]:=GT*R*synRate*0.150568;
+MG94custom[30][28]:=synRate*0.478125;
+MG94custom[30][29]:=CG*synRate*0.10767;
+MG94custom[30][31]:=GT*synRate*0.220455;
+MG94custom[30][46]:=CG*R*synRate*0.284375;
+MG94custom[30][59]:=CT*synRate*0.176989;
+MG94custom[31][15]:=AC*R*synRate*0.348864;
+MG94custom[31][19]:=AT*R*synRate*0.386364;
+MG94custom[31][23]:=CT*R*synRate*0.20142;
+MG94custom[31][27]:=GT*R*synRate*0.150568;
+MG94custom[31][28]:=AT*synRate*0.478125;
+MG94custom[31][29]:=CT*synRate*0.10767;
+MG94custom[31][30]:=GT*synRate*0.19375;
+MG94custom[31][47]:=CG*R*synRate*0.284375;
+MG94custom[31][60]:=CT*R*synRate*0.176989;
+MG94custom[32][0]:=R*synRate*0.348864;
+MG94custom[32][16]:=CG*R*synRate*0.189773;
+MG94custom[32][33]:=AC*R*synRate*0.10767;
+MG94custom[32][34]:=synRate*0.19375;
+MG94custom[32][35]:=AT*R*synRate*0.220455;
+MG94custom[32][36]:=AC*R*synRate*0.20142;
+MG94custom[32][40]:=R*synRate*0.150568;
+MG94custom[32][44]:=AT*R*synRate*0.261648;
+MG94custom[33][1]:=R*synRate*0.348864;
+MG94custom[33][17]:=CG*R*synRate*0.189773;
+MG94custom[33][32]:=AC*R*synRate*0.478125;
+MG94custom[33][34]:=CG*R*synRate*0.19375;
+MG94custom[33][35]:=CT*synRate*0.220455;
+MG94custom[33][37]:=AC*R*synRate*0.20142;
+MG94custom[33][41]:=R*synRate*0.150568;
+MG94custom[33][45]:=AT*R*synRate*0.261648;
+MG94custom[33][48]:=GT*R*synRate*0.176989;
+MG94custom[34][2]:=R*synRate*0.348864;
+MG94custom[34][18]:=CG*R*synRate*0.189773;
+MG94custom[34][32]:=synRate*0.478125;
+MG94custom[34][33]:=CG*R*synRate*0.10767;
+MG94custom[34][35]:=GT*R*synRate*0.220455;
+MG94custom[34][38]:=AC*R*synRate*0.20142;
+MG94custom[34][42]:=R*synRate*0.150568;
+MG94custom[34][46]:=AT*R*synRate*0.261648;
+MG94custom[35][3]:=R*synRate*0.348864;
+MG94custom[35][19]:=CG*R*synRate*0.189773;
+MG94custom[35][32]:=AT*R*synRate*0.478125;
+MG94custom[35][33]:=CT*synRate*0.10767;
+MG94custom[35][34]:=GT*R*synRate*0.19375;
+MG94custom[35][39]:=AC*R*synRate*0.20142;
+MG94custom[35][43]:=R*synRate*0.150568;
+MG94custom[35][47]:=AT*R*synRate*0.261648;
+MG94custom[35][49]:=GT*R*synRate*0.176989;
+MG94custom[36][4]:=R*synRate*0.348864;
+MG94custom[36][20]:=CG*R*synRate*0.189773;
+MG94custom[36][32]:=AC*R*synRate*0.386364;
+MG94custom[36][37]:=AC*synRate*0.10767;
+MG94custom[36][38]:=synRate*0.19375;
+MG94custom[36][39]:=AT*synRate*0.220455;
+MG94custom[36][40]:=CG*R*synRate*0.150568;
+MG94custom[36][44]:=CT*R*synRate*0.261648;
+MG94custom[36][50]:=GT*R*synRate*0.176989;
+MG94custom[37][5]:=R*synRate*0.348864;
+MG94custom[37][21]:=CG*R*synRate*0.189773;
+MG94custom[37][33]:=AC*R*synRate*0.386364;
+MG94custom[37][36]:=AC*synRate*0.478125;
+MG94custom[37][38]:=CG*synRate*0.19375;
+MG94custom[37][39]:=CT*synRate*0.220455;
+MG94custom[37][41]:=CG*R*synRate*0.150568;
+MG94custom[37][45]:=CT*R*synRate*0.261648;
+MG94custom[37][51]:=GT*R*synRate*0.176989;
+MG94custom[38][6]:=R*synRate*0.348864;
+MG94custom[38][22]:=CG*R*synRate*0.189773;
+MG94custom[38][34]:=AC*R*synRate*0.386364;
+MG94custom[38][36]:=synRate*0.478125;
+MG94custom[38][37]:=CG*synRate*0.10767;
+MG94custom[38][39]:=GT*synRate*0.220455;
+MG94custom[38][42]:=CG*R*synRate*0.150568;
+MG94custom[38][46]:=CT*R*synRate*0.261648;
+MG94custom[38][52]:=GT*R*synRate*0.176989;
+MG94custom[39][7]:=R*synRate*0.348864;
+MG94custom[39][23]:=CG*R*synRate*0.189773;
+MG94custom[39][35]:=AC*R*synRate*0.386364;
+MG94custom[39][36]:=AT*synRate*0.478125;
+MG94custom[39][37]:=CT*synRate*0.10767;
+MG94custom[39][38]:=GT*synRate*0.19375;
+MG94custom[39][43]:=CG*R*synRate*0.150568;
+MG94custom[39][47]:=CT*R*synRate*0.261648;
+MG94custom[39][53]:=GT*R*synRate*0.176989;
+MG94custom[40][8]:=R*synRate*0.348864;
+MG94custom[40][24]:=CG*R*synRate*0.189773;
+MG94custom[40][32]:=R*synRate*0.386364;
+MG94custom[40][36]:=CG*R*synRate*0.20142;
+MG94custom[40][41]:=AC*synRate*0.10767;
+MG94custom[40][42]:=synRate*0.19375;
+MG94custom[40][43]:=AT*synRate*0.220455;
+MG94custom[40][44]:=GT*R*synRate*0.261648;
+MG94custom[41][9]:=R*synRate*0.348864;
+MG94custom[41][25]:=CG*R*synRate*0.189773;
+MG94custom[41][33]:=R*synRate*0.386364;
+MG94custom[41][37]:=CG*R*synRate*0.20142;
+MG94custom[41][40]:=AC*synRate*0.478125;
+MG94custom[41][42]:=CG*synRate*0.19375;
+MG94custom[41][43]:=CT*synRate*0.220455;
+MG94custom[41][45]:=GT*R*synRate*0.261648;
+MG94custom[41][54]:=GT*R*synRate*0.176989;
+MG94custom[42][10]:=R*synRate*0.348864;
+MG94custom[42][26]:=CG*R*synRate*0.189773;
+MG94custom[42][34]:=R*synRate*0.386364;
+MG94custom[42][38]:=CG*R*synRate*0.20142;
+MG94custom[42][40]:=synRate*0.478125;
+MG94custom[42][41]:=CG*synRate*0.10767;
+MG94custom[42][43]:=GT*synRate*0.220455;
+MG94custom[42][46]:=GT*R*synRate*0.261648;
+MG94custom[42][55]:=GT*R*synRate*0.176989;
+MG94custom[43][11]:=R*synRate*0.348864;
+MG94custom[43][27]:=CG*R*synRate*0.189773;
+MG94custom[43][35]:=R*synRate*0.386364;
+MG94custom[43][39]:=CG*R*synRate*0.20142;
+MG94custom[43][40]:=AT*synRate*0.478125;
+MG94custom[43][41]:=CT*synRate*0.10767;
+MG94custom[43][42]:=GT*synRate*0.19375;
+MG94custom[43][47]:=GT*R*synRate*0.261648;
+MG94custom[43][56]:=GT*R*synRate*0.176989;
+MG94custom[44][12]:=R*synRate*0.348864;
+MG94custom[44][28]:=CG*R*synRate*0.189773;
+MG94custom[44][32]:=AT*R*synRate*0.386364;
+MG94custom[44][36]:=CT*R*synRate*0.20142;
+MG94custom[44][40]:=GT*R*synRate*0.150568;
+MG94custom[44][45]:=AC*synRate*0.10767;
+MG94custom[44][46]:=synRate*0.19375;
+MG94custom[44][47]:=AT*synRate*0.220455;
+MG94custom[44][57]:=GT*R*synRate*0.176989;
+MG94custom[45][13]:=R*synRate*0.348864;
+MG94custom[45][29]:=CG*R*synRate*0.189773;
+MG94custom[45][33]:=AT*R*synRate*0.386364;
+MG94custom[45][37]:=CT*R*synRate*0.20142;
+MG94custom[45][41]:=GT*R*synRate*0.150568;
+MG94custom[45][44]:=AC*synRate*0.478125;
+MG94custom[45][46]:=CG*synRate*0.19375;
+MG94custom[45][47]:=CT*synRate*0.220455;
+MG94custom[45][58]:=GT*R*synRate*0.176989;
+MG94custom[46][14]:=R*synRate*0.348864;
+MG94custom[46][30]:=CG*R*synRate*0.189773;
+MG94custom[46][34]:=AT*R*synRate*0.386364;
+MG94custom[46][38]:=CT*R*synRate*0.20142;
+MG94custom[46][42]:=GT*R*synRate*0.150568;
+MG94custom[46][44]:=synRate*0.478125;
+MG94custom[46][45]:=CG*synRate*0.10767;
+MG94custom[46][47]:=GT*synRate*0.220455;
+MG94custom[46][59]:=GT*R*synRate*0.176989;
+MG94custom[47][15]:=R*synRate*0.348864;
+MG94custom[47][31]:=CG*R*synRate*0.189773;
+MG94custom[47][35]:=AT*R*synRate*0.386364;
+MG94custom[47][39]:=CT*R*synRate*0.20142;
+MG94custom[47][43]:=GT*R*synRate*0.150568;
+MG94custom[47][44]:=AT*synRate*0.478125;
+MG94custom[47][45]:=CT*synRate*0.10767;
+MG94custom[47][46]:=GT*synRate*0.19375;
+MG94custom[47][60]:=GT*R*synRate*0.176989;
+MG94custom[48][1]:=AT*R*synRate*0.348864;
+MG94custom[48][17]:=CT*R*synRate*0.189773;
+MG94custom[48][33]:=GT*R*synRate*0.284375;
+MG94custom[48][49]:=CT*synRate*0.220455;
+MG94custom[48][51]:=AC*R*synRate*0.20142;
+MG94custom[48][54]:=R*synRate*0.150568;
+MG94custom[48][58]:=AT*R*synRate*0.261648;
+MG94custom[49][3]:=AT*R*synRate*0.348864;
+MG94custom[49][19]:=CT*R*synRate*0.189773;
+MG94custom[49][35]:=GT*R*synRate*0.284375;
+MG94custom[49][48]:=CT*synRate*0.10767;
+MG94custom[49][53]:=AC*R*synRate*0.20142;
+MG94custom[49][56]:=R*synRate*0.150568;
+MG94custom[49][60]:=AT*R*synRate*0.261648;
+MG94custom[50][4]:=AT*R*synRate*0.348864;
+MG94custom[50][20]:=CT*R*synRate*0.189773;
+MG94custom[50][36]:=GT*R*synRate*0.284375;
+MG94custom[50][51]:=AC*synRate*0.10767;
+MG94custom[50][52]:=synRate*0.19375;
+MG94custom[50][53]:=AT*synRate*0.220455;
+MG94custom[50][57]:=CT*R*synRate*0.261648;
+MG94custom[51][5]:=AT*R*synRate*0.348864;
+MG94custom[51][21]:=CT*R*synRate*0.189773;
+MG94custom[51][37]:=GT*R*synRate*0.284375;
+MG94custom[51][48]:=AC*R*synRate*0.386364;
+MG94custom[51][50]:=AC*synRate*0.478125;
+MG94custom[51][52]:=CG*synRate*0.19375;
+MG94custom[51][53]:=CT*synRate*0.220455;
+MG94custom[51][54]:=CG*R*synRate*0.150568;
+MG94custom[51][58]:=CT*R*synRate*0.261648;
+MG94custom[52][6]:=AT*R*synRate*0.348864;
+MG94custom[52][22]:=CT*R*synRate*0.189773;
+MG94custom[52][38]:=GT*R*synRate*0.284375;
+MG94custom[52][50]:=synRate*0.478125;
+MG94custom[52][51]:=CG*synRate*0.10767;
+MG94custom[52][53]:=GT*synRate*0.220455;
+MG94custom[52][55]:=CG*R*synRate*0.150568;
+MG94custom[52][59]:=CT*R*synRate*0.261648;
+MG94custom[53][7]:=AT*R*synRate*0.348864;
+MG94custom[53][23]:=CT*R*synRate*0.189773;
+MG94custom[53][39]:=GT*R*synRate*0.284375;
+MG94custom[53][49]:=AC*R*synRate*0.386364;
+MG94custom[53][50]:=AT*synRate*0.478125;
+MG94custom[53][51]:=CT*synRate*0.10767;
+MG94custom[53][52]:=GT*synRate*0.19375;
+MG94custom[53][56]:=CG*R*synRate*0.150568;
+MG94custom[53][60]:=CT*R*synRate*0.261648;
+MG94custom[54][9]:=AT*R*synRate*0.348864;
+MG94custom[54][25]:=CT*R*synRate*0.189773;
+MG94custom[54][41]:=GT*R*synRate*0.284375;
+MG94custom[54][48]:=R*synRate*0.386364;
+MG94custom[54][51]:=CG*R*synRate*0.20142;
+MG94custom[54][55]:=CG*R*synRate*0.19375;
+MG94custom[54][56]:=CT*synRate*0.220455;
+MG94custom[54][58]:=GT*R*synRate*0.261648;
+MG94custom[55][10]:=AT*R*synRate*0.348864;
+MG94custom[55][26]:=CT*R*synRate*0.189773;
+MG94custom[55][42]:=GT*R*synRate*0.284375;
+MG94custom[55][52]:=CG*R*synRate*0.20142;
+MG94custom[55][54]:=CG*R*synRate*0.10767;
+MG94custom[55][56]:=GT*R*synRate*0.220455;
+MG94custom[55][59]:=GT*R*synRate*0.261648;
+MG94custom[56][11]:=AT*R*synRate*0.348864;
+MG94custom[56][27]:=CT*R*synRate*0.189773;
+MG94custom[56][43]:=GT*R*synRate*0.284375;
+MG94custom[56][49]:=R*synRate*0.386364;
+MG94custom[56][53]:=CG*R*synRate*0.20142;
+MG94custom[56][54]:=CT*synRate*0.10767;
+MG94custom[56][55]:=GT*R*synRate*0.19375;
+MG94custom[56][60]:=GT*R*synRate*0.261648;
+MG94custom[57][12]:=AT*R*synRate*0.348864;
+MG94custom[57][28]:=CT*synRate*0.189773;
+MG94custom[57][44]:=GT*R*synRate*0.284375;
+MG94custom[57][50]:=CT*R*synRate*0.20142;
+MG94custom[57][58]:=AC*R*synRate*0.10767;
+MG94custom[57][59]:=synRate*0.19375;
+MG94custom[57][60]:=AT*R*synRate*0.220455;
+MG94custom[58][13]:=AT*R*synRate*0.348864;
+MG94custom[58][29]:=CT*R*synRate*0.189773;
+MG94custom[58][45]:=GT*R*synRate*0.284375;
+MG94custom[58][48]:=AT*R*synRate*0.386364;
+MG94custom[58][51]:=CT*R*synRate*0.20142;
+MG94custom[58][54]:=GT*R*synRate*0.150568;
+MG94custom[58][57]:=AC*R*synRate*0.478125;
+MG94custom[58][59]:=CG*R*synRate*0.19375;
+MG94custom[58][60]:=CT*synRate*0.220455;
+MG94custom[59][14]:=AT*R*synRate*0.348864;
+MG94custom[59][30]:=CT*synRate*0.189773;
+MG94custom[59][46]:=GT*R*synRate*0.284375;
+MG94custom[59][52]:=CT*R*synRate*0.20142;
+MG94custom[59][55]:=GT*R*synRate*0.150568;
+MG94custom[59][57]:=synRate*0.478125;
+MG94custom[59][58]:=CG*R*synRate*0.10767;
+MG94custom[59][60]:=GT*R*synRate*0.220455;
+MG94custom[60][15]:=AT*R*synRate*0.348864;
+MG94custom[60][31]:=CT*R*synRate*0.189773;
+MG94custom[60][47]:=GT*R*synRate*0.284375;
+MG94custom[60][49]:=AT*R*synRate*0.386364;
+MG94custom[60][53]:=CT*R*synRate*0.20142;
+MG94custom[60][56]:=GT*R*synRate*0.150568;
+MG94custom[60][57]:=AT*R*synRate*0.478125;
+MG94custom[60][58]:=CT*synRate*0.10767;
+MG94custom[60][59]:=GT*R*synRate*0.19375;
+
+vectorOfFrequencies={
+{   0.0684634387476}
+{   0.0154174945249}
+{   0.0277433542637}
+{   0.0315672183411}
+{   0.0356916015236}
+{  0.00803750266039}
+{   0.0144632633625}
+{   0.0164567336793}
+{   0.0266806048061}
+{  0.00600828830748}
+{   0.0108117483528}
+{   0.0123019306771}
+{    0.046363843446}
+{   0.0104408179834}
+{   0.0187879627036}
+{   0.0213775059501}
+{   0.0372423266151}
+{  0.00838671526271}
+{   0.0150916617656}
+{   0.0171717441791}
+{   0.0194153011545}
+{  0.00437219200093}
+{  0.00786763837634}
+{  0.00895203428158}
+{   0.0145135537544}
+{   0.0032683522715}
+{  0.00588130936454}
+{  0.00669192971684}
+{   0.0252207226563}
+{  0.00567953290953}
+{   0.0102201621222}
+{   0.0116288061683}
+{   0.0558077379368}
+{   0.0125675179311}
+{   0.0226149003404}
+{   0.0257319100647}
+{   0.0290938869097}
+{  0.00655174280379}
+{   0.0117896796627}
+{   0.0134146501734}
+{   0.0217486037548}
+{  0.00489763566432}
+{  0.00881315969148}
+{   0.0100278767164}
+{   0.0377933284116}
+{  0.00851079706952}
+{   0.0153149435393}
+{     0.01742580086}
+{  0.00782174192914}
+{   0.0160149650053}
+{   0.0181073841606}
+{  0.00407765810865}
+{  0.00733763279709}
+{  0.00834897807998}
+{  0.00304817884003}
+{  0.00548511337442}
+{  0.00624112606825}
+{   0.0235217218785}
+{  0.00529692964466}
+{  0.00953167814686}
+{   0.0108454285073}
+}
+;
+
+Model MG94customModel=(MG94custom,vectorOfFrequencies,0);
+
+UseModel (MG94customModel);
+Tree givenTree=(((D_CD_83_ELI_ACC_K03454,D_CD_83_NDK_ACC_M27323)Node3,D_UG_94_94UG114_ACC_U88824)Node2,D_CD_84_84ZR085_ACC_U88822,(B_US_83_RF_ACC_M17451,((B_FR_83_HXB2_ACC_K03455,B_US_86_JRFL_ACC_U63632)Node11,B_US_90_WEAU160_ACC_U21135)Node10)Node8);
+
+DataSet ds = ReadDataFile(USE_NEXUS_FILE_DATA);
+DataSetFilter filteredData = CreateFilter(ds,3,"0-1319","4,5,7,6,1,0,2,3","TAA,TAG,TGA");
+
+PARAMETER_GROUPING = {"0" : {{"R","AC","AT","CT"}}};
+LikelihoodFunction lf = (filteredData,givenTree);
+OPTIMIZATION_PRECISION     = 0.001;
+VERBOSITY_LEVEL	           = 1;
+OPTIMIZATION_METHOD		   = 4;
+USE_ADAPTIVE_VARIABLE_STEP = 1;
+
+Optimize 			(res,lf);
+
+/* test epilogue */
+	timeMatrix = endTestTimer 				  (_testDescription);
+	if (logTestResult    (Abs (res[1][0] - _expectedLL) < 2*OPTIMIZATION_PRECISION))
+	{
+		return timeMatrix;
+	}
+	return 0;
+/* end test epilogue */
+
+
+END;
diff --git a/tests/hbltests/SimpleOptimizations/SmallCodonLocal.bf b/tests/hbltests/SimpleOptimizations/SmallCodonLocal.bf
new file mode 100644
index 0000000..16cc529
--- /dev/null
+++ b/tests/hbltests/SimpleOptimizations/SmallCodonLocal.bf
@@ -0,0 +1,672 @@
+#NEXUS
+
+BEGIN TAXA;
+	DIMENSIONS NTAX = 8;
+	TAXLABELS
+		'B_FR_83_HXB2_ACC_K03455' 'B_US_83_RF_ACC_M17451' 'B_US_86_JRFL_ACC_U63632' 'B_US_90_WEAU160_ACC_U21135' 'D_CD_83_ELI_ACC_K03454' 'D_CD_83_NDK_ACC_M27323' 'D_CD_84_84ZR085_ACC_U88822' 'D_UG_94_94UG114_ACC_U88824';
+END;
+
+BEGIN CHARACTERS;
+	DIMENSIONS NCHAR = 1320;
+	FORMAT
+		DATATYPE = DNA
+		GAP=-
+		MISSING=?
+	;
+
+MATRIX
+	'B_FR_83_HXB2_ACC_K03455'     CCCATTAGCCCTATTGAGACTGTACCAGTAAAATTAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAATAAAAGCATTAGTAGAAATTTGTACAGAGATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAAGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGATGGAA [...]
+	'B_US_83_RF_ACC_M17451'       CCCATTAGTCCTATTGAAACTGTACCAGTAAAATTAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAGGAAAAAATAAAAGCATTGGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCCAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAGTTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAGAAATCAGTAACAGTATTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATAAAGAGTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAAACACCACGGATTAGATATCAGTACAATGTGCTTCCACAAGGGTGGAA [...]
+	'B_US_86_JRFL_ACC_U63632'     CCCATTAGTCCTATTGAAACTGTACCAGTAAAATTAAAGCCAGGAATGGATGGCCCAAAAGTCAAACAATGGCCATTGACAGAAGAAAAAATAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAGAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATAAAGACTTCAGGAAATATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGGTATCAGTACAATGTGCTTCCGCAGGGATGGAA [...]
+	'B_US_90_WEAU160_ACC_U21135'  CCCATTAGTCCTATTGAAACTGTACCAGTAAAATTAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAGAAAATAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTTCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTACCCTTAGATGAAGACTTCAGGAAGTACACTGCATTTACCATACCTAGTATAAACAATGAAACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGATGGAA [...]
+	'D_CD_83_ELI_ACC_K03454'      CCAATTAGTCCTATTGAAACTGTACCAGTAAAATTAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAATAAAAGCATTAACAGAAATTTGTACAGATATGGAAAAGGAAGGAAAAATTTCAAGAATTGGGCCTGAAAATCCATACAATACTCCAATATTTGCCATAAAGAAAAAAGACAGTACCAAGTGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGATTTCTGGGAAGTTCAATTAGGAATACCGCATCCTGCAGGGCTGAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAAGATTTTAGGAAATATACCGCCTTTACCATATCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGATGGAA [...]
+	'D_CD_83_NDK_ACC_M27323'      CCAATTAGTCCTATTGAAACTGTACCAGTAAAATTAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAATAAAAGCATTAACAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAGAATTGGGCCTGAAAATCCATATAATACTCCAATATTTGCCATAAAGAAAAAAGACAGTACCAAGTGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGATTTCTGGGAGGTTCAATTAGGAATACCGCATCCTGCAGGGCTGAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATGAAGATTTTAGGAAATATACCGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTCCCACAGGGATGGAA [...]
+	'D_CD_84_84ZR085_ACC_U88822'  CCAATTAGTCCTATTGAAACTGTACCAGTAAAATTAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCGTTGACAGAAGAAAAAATAAAAGCATTAACAGAAATTTGTACAGATATGGAAAAGGAAGGAAAAATTTCAAGAATTGGGCCTGAAAATCCATACAATACTCCAATATTTGCCATAAAGAAAAAAGACAGTACTAAGTGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGGATACCACATCCTGCAGGATTAAAGAAGAAAAAGTCAATAACAGTACTGGATGTGGGCGATGCATATTTTTCAATTCCCTTATGTGAAGACTTTAGGAAGTACACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTACTTCCACAGGGATGGAA [...]
+	'D_UG_94_94UG114_ACC_U88824'  CCAATTAGTCCTATTGAAACTGTACCAGTAAAATTAAAGCCAGGGATGGATGGCCCAAAAGTTAAACAATGGCCGTTGACAGAAGAAAAAATAAAAGCACTAATAGAAATTTGTTCAGAACTAGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAACCCATACAATACTCCAATATTTGCCATAAAGAAAAAAGACAGTACTAAGTGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTTTGGGAAGTTCAACTAGGAATACCACATCCTGCAGGGCTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGACGCATATTTTTCAGTTCCCTTACATGAAGACTTTAGAAAATATACCGCATTCACCATACCTAGTACAAACAATGAGACACCAGGAATTAGATATCAGTACAATGTGCTTCCACAAGGATGGAA [...]
+END;
+
+BEGIN TREES;
+	TREE tree = ((((D_CD_83_ELI_ACC_K03454,D_CD_83_NDK_ACC_M27323),D_UG_94_94UG114_ACC_U88824),D_CD_84_84ZR085_ACC_U88822),B_US_83_RF_ACC_M17451,((B_FR_83_HXB2_ACC_K03455,B_US_86_JRFL_ACC_U63632),B_US_90_WEAU160_ACC_U21135));
+END;
+
+BEGIN HYPHY;
+
+/* test preamble */
+
+	_testDescription 		= " fit the MG94x012232 model to an HIV-1 RT (p51) alignment with 8 sequences and 430 codons";
+	_expectedLL 			= -3177.532445;
+	ExecuteAFile ("../Shared/TestInstrumentation.bf");
+	startTestTimer (_testDescription);
+
+/* end test preamble */
+
+OPTIMIZATION_PRECISION = 0.001;
+VERBOSITY_LEVEL        = -1;
+
+global AT=1;
+global CT=1;
+global AC=1;
+global CG:=AT;
+global GT:=AT;
+
+MG94custom={61,61};
+MG94custom[0][1]:=AC*nonSynRate*0.10767;
+MG94custom[0][2]:=synRate*0.19375;
+MG94custom[0][3]:=AT*nonSynRate*0.220455;
+MG94custom[0][4]:=AC*nonSynRate*0.20142;
+MG94custom[0][8]:=nonSynRate*0.150568;
+MG94custom[0][12]:=AT*nonSynRate*0.261648;
+MG94custom[0][16]:=AC*nonSynRate*0.189773;
+MG94custom[0][32]:=nonSynRate*0.284375;
+MG94custom[1][0]:=AC*nonSynRate*0.478125;
+MG94custom[1][2]:=CG*nonSynRate*0.19375;
+MG94custom[1][3]:=CT*synRate*0.220455;
+MG94custom[1][5]:=AC*nonSynRate*0.20142;
+MG94custom[1][9]:=nonSynRate*0.150568;
+MG94custom[1][13]:=AT*nonSynRate*0.261648;
+MG94custom[1][17]:=AC*nonSynRate*0.189773;
+MG94custom[1][33]:=nonSynRate*0.284375;
+MG94custom[1][48]:=AT*nonSynRate*0.176989;
+MG94custom[2][0]:=synRate*0.478125;
+MG94custom[2][1]:=CG*nonSynRate*0.10767;
+MG94custom[2][3]:=GT*nonSynRate*0.220455;
+MG94custom[2][6]:=AC*nonSynRate*0.20142;
+MG94custom[2][10]:=nonSynRate*0.150568;
+MG94custom[2][14]:=AT*nonSynRate*0.261648;
+MG94custom[2][18]:=AC*nonSynRate*0.189773;
+MG94custom[2][34]:=nonSynRate*0.284375;
+MG94custom[3][0]:=AT*nonSynRate*0.478125;
+MG94custom[3][1]:=CT*synRate*0.10767;
+MG94custom[3][2]:=GT*nonSynRate*0.19375;
+MG94custom[3][7]:=AC*nonSynRate*0.20142;
+MG94custom[3][11]:=nonSynRate*0.150568;
+MG94custom[3][15]:=AT*nonSynRate*0.261648;
+MG94custom[3][19]:=AC*nonSynRate*0.189773;
+MG94custom[3][35]:=nonSynRate*0.284375;
+MG94custom[3][49]:=AT*nonSynRate*0.176989;
+MG94custom[4][0]:=AC*nonSynRate*0.386364;
+MG94custom[4][5]:=AC*synRate*0.10767;
+MG94custom[4][6]:=synRate*0.19375;
+MG94custom[4][7]:=AT*synRate*0.220455;
+MG94custom[4][8]:=CG*nonSynRate*0.150568;
+MG94custom[4][12]:=CT*nonSynRate*0.261648;
+MG94custom[4][20]:=AC*nonSynRate*0.189773;
+MG94custom[4][36]:=nonSynRate*0.284375;
+MG94custom[4][50]:=AT*nonSynRate*0.176989;
+MG94custom[5][1]:=AC*nonSynRate*0.386364;
+MG94custom[5][4]:=AC*synRate*0.478125;
+MG94custom[5][6]:=CG*synRate*0.19375;
+MG94custom[5][7]:=CT*synRate*0.220455;
+MG94custom[5][9]:=CG*nonSynRate*0.150568;
+MG94custom[5][13]:=CT*nonSynRate*0.261648;
+MG94custom[5][21]:=AC*nonSynRate*0.189773;
+MG94custom[5][37]:=nonSynRate*0.284375;
+MG94custom[5][51]:=AT*nonSynRate*0.176989;
+MG94custom[6][2]:=AC*nonSynRate*0.386364;
+MG94custom[6][4]:=synRate*0.478125;
+MG94custom[6][5]:=CG*synRate*0.10767;
+MG94custom[6][7]:=GT*synRate*0.220455;
+MG94custom[6][10]:=CG*nonSynRate*0.150568;
+MG94custom[6][14]:=CT*nonSynRate*0.261648;
+MG94custom[6][22]:=AC*nonSynRate*0.189773;
+MG94custom[6][38]:=nonSynRate*0.284375;
+MG94custom[6][52]:=AT*nonSynRate*0.176989;
+MG94custom[7][3]:=AC*nonSynRate*0.386364;
+MG94custom[7][4]:=AT*synRate*0.478125;
+MG94custom[7][5]:=CT*synRate*0.10767;
+MG94custom[7][6]:=GT*synRate*0.19375;
+MG94custom[7][11]:=CG*nonSynRate*0.150568;
+MG94custom[7][15]:=CT*nonSynRate*0.261648;
+MG94custom[7][23]:=AC*nonSynRate*0.189773;
+MG94custom[7][39]:=nonSynRate*0.284375;
+MG94custom[7][53]:=AT*nonSynRate*0.176989;
+MG94custom[8][0]:=nonSynRate*0.386364;
+MG94custom[8][4]:=CG*nonSynRate*0.20142;
+MG94custom[8][9]:=AC*nonSynRate*0.10767;
+MG94custom[8][10]:=synRate*0.19375;
+MG94custom[8][11]:=AT*nonSynRate*0.220455;
+MG94custom[8][12]:=GT*nonSynRate*0.261648;
+MG94custom[8][24]:=AC*synRate*0.189773;
+MG94custom[8][40]:=nonSynRate*0.284375;
+MG94custom[9][1]:=nonSynRate*0.386364;
+MG94custom[9][5]:=CG*nonSynRate*0.20142;
+MG94custom[9][8]:=AC*nonSynRate*0.478125;
+MG94custom[9][10]:=CG*nonSynRate*0.19375;
+MG94custom[9][11]:=CT*synRate*0.220455;
+MG94custom[9][13]:=GT*nonSynRate*0.261648;
+MG94custom[9][25]:=AC*nonSynRate*0.189773;
+MG94custom[9][41]:=nonSynRate*0.284375;
+MG94custom[9][54]:=AT*nonSynRate*0.176989;
+MG94custom[10][2]:=nonSynRate*0.386364;
+MG94custom[10][6]:=CG*nonSynRate*0.20142;
+MG94custom[10][8]:=synRate*0.478125;
+MG94custom[10][9]:=CG*nonSynRate*0.10767;
+MG94custom[10][11]:=GT*nonSynRate*0.220455;
+MG94custom[10][14]:=GT*nonSynRate*0.261648;
+MG94custom[10][26]:=AC*synRate*0.189773;
+MG94custom[10][42]:=nonSynRate*0.284375;
+MG94custom[10][55]:=AT*nonSynRate*0.176989;
+MG94custom[11][3]:=nonSynRate*0.386364;
+MG94custom[11][7]:=CG*nonSynRate*0.20142;
+MG94custom[11][8]:=AT*nonSynRate*0.478125;
+MG94custom[11][9]:=CT*synRate*0.10767;
+MG94custom[11][10]:=GT*nonSynRate*0.19375;
+MG94custom[11][15]:=GT*nonSynRate*0.261648;
+MG94custom[11][27]:=AC*nonSynRate*0.189773;
+MG94custom[11][43]:=nonSynRate*0.284375;
+MG94custom[11][56]:=AT*nonSynRate*0.176989;
+MG94custom[12][0]:=AT*nonSynRate*0.386364;
+MG94custom[12][4]:=CT*nonSynRate*0.20142;
+MG94custom[12][8]:=GT*nonSynRate*0.150568;
+MG94custom[12][13]:=AC*synRate*0.10767;
+MG94custom[12][14]:=nonSynRate*0.19375;
+MG94custom[12][15]:=AT*synRate*0.220455;
+MG94custom[12][28]:=AC*nonSynRate*0.189773;
+MG94custom[12][44]:=nonSynRate*0.284375;
+MG94custom[12][57]:=AT*nonSynRate*0.176989;
+MG94custom[13][1]:=AT*nonSynRate*0.386364;
+MG94custom[13][5]:=CT*nonSynRate*0.20142;
+MG94custom[13][9]:=GT*nonSynRate*0.150568;
+MG94custom[13][12]:=AC*synRate*0.478125;
+MG94custom[13][14]:=CG*nonSynRate*0.19375;
+MG94custom[13][15]:=CT*synRate*0.220455;
+MG94custom[13][29]:=AC*nonSynRate*0.189773;
+MG94custom[13][45]:=nonSynRate*0.284375;
+MG94custom[13][58]:=AT*nonSynRate*0.176989;
+MG94custom[14][2]:=AT*nonSynRate*0.386364;
+MG94custom[14][6]:=CT*nonSynRate*0.20142;
+MG94custom[14][10]:=GT*nonSynRate*0.150568;
+MG94custom[14][12]:=nonSynRate*0.478125;
+MG94custom[14][13]:=CG*nonSynRate*0.10767;
+MG94custom[14][15]:=GT*nonSynRate*0.220455;
+MG94custom[14][30]:=AC*nonSynRate*0.189773;
+MG94custom[14][46]:=nonSynRate*0.284375;
+MG94custom[14][59]:=AT*nonSynRate*0.176989;
+MG94custom[15][3]:=AT*nonSynRate*0.386364;
+MG94custom[15][7]:=CT*nonSynRate*0.20142;
+MG94custom[15][11]:=GT*nonSynRate*0.150568;
+MG94custom[15][12]:=AT*synRate*0.478125;
+MG94custom[15][13]:=CT*synRate*0.10767;
+MG94custom[15][14]:=GT*nonSynRate*0.19375;
+MG94custom[15][31]:=AC*nonSynRate*0.189773;
+MG94custom[15][47]:=nonSynRate*0.284375;
+MG94custom[15][60]:=AT*nonSynRate*0.176989;
+MG94custom[16][0]:=AC*nonSynRate*0.348864;
+MG94custom[16][17]:=AC*nonSynRate*0.10767;
+MG94custom[16][18]:=synRate*0.19375;
+MG94custom[16][19]:=AT*nonSynRate*0.220455;
+MG94custom[16][20]:=AC*nonSynRate*0.20142;
+MG94custom[16][24]:=nonSynRate*0.150568;
+MG94custom[16][28]:=AT*nonSynRate*0.261648;
+MG94custom[16][32]:=CG*nonSynRate*0.284375;
+MG94custom[17][1]:=AC*nonSynRate*0.348864;
+MG94custom[17][16]:=AC*nonSynRate*0.478125;
+MG94custom[17][18]:=CG*nonSynRate*0.19375;
+MG94custom[17][19]:=CT*synRate*0.220455;
+MG94custom[17][21]:=AC*nonSynRate*0.20142;
+MG94custom[17][25]:=nonSynRate*0.150568;
+MG94custom[17][29]:=AT*nonSynRate*0.261648;
+MG94custom[17][33]:=CG*nonSynRate*0.284375;
+MG94custom[17][48]:=CT*nonSynRate*0.176989;
+MG94custom[18][2]:=AC*nonSynRate*0.348864;
+MG94custom[18][16]:=synRate*0.478125;
+MG94custom[18][17]:=CG*nonSynRate*0.10767;
+MG94custom[18][19]:=GT*nonSynRate*0.220455;
+MG94custom[18][22]:=AC*nonSynRate*0.20142;
+MG94custom[18][26]:=nonSynRate*0.150568;
+MG94custom[18][30]:=AT*nonSynRate*0.261648;
+MG94custom[18][34]:=CG*nonSynRate*0.284375;
+MG94custom[19][3]:=AC*nonSynRate*0.348864;
+MG94custom[19][16]:=AT*nonSynRate*0.478125;
+MG94custom[19][17]:=CT*synRate*0.10767;
+MG94custom[19][18]:=GT*nonSynRate*0.19375;
+MG94custom[19][23]:=AC*nonSynRate*0.20142;
+MG94custom[19][27]:=nonSynRate*0.150568;
+MG94custom[19][31]:=AT*nonSynRate*0.261648;
+MG94custom[19][35]:=CG*nonSynRate*0.284375;
+MG94custom[19][49]:=CT*nonSynRate*0.176989;
+MG94custom[20][4]:=AC*nonSynRate*0.348864;
+MG94custom[20][16]:=AC*nonSynRate*0.386364;
+MG94custom[20][21]:=AC*synRate*0.10767;
+MG94custom[20][22]:=synRate*0.19375;
+MG94custom[20][23]:=AT*synRate*0.220455;
+MG94custom[20][24]:=CG*nonSynRate*0.150568;
+MG94custom[20][28]:=CT*nonSynRate*0.261648;
+MG94custom[20][36]:=CG*nonSynRate*0.284375;
+MG94custom[20][50]:=CT*nonSynRate*0.176989;
+MG94custom[21][5]:=AC*nonSynRate*0.348864;
+MG94custom[21][17]:=AC*nonSynRate*0.386364;
+MG94custom[21][20]:=AC*synRate*0.478125;
+MG94custom[21][22]:=CG*synRate*0.19375;
+MG94custom[21][23]:=CT*synRate*0.220455;
+MG94custom[21][25]:=CG*nonSynRate*0.150568;
+MG94custom[21][29]:=CT*nonSynRate*0.261648;
+MG94custom[21][37]:=CG*nonSynRate*0.284375;
+MG94custom[21][51]:=CT*nonSynRate*0.176989;
+MG94custom[22][6]:=AC*nonSynRate*0.348864;
+MG94custom[22][18]:=AC*nonSynRate*0.386364;
+MG94custom[22][20]:=synRate*0.478125;
+MG94custom[22][21]:=CG*synRate*0.10767;
+MG94custom[22][23]:=GT*synRate*0.220455;
+MG94custom[22][26]:=CG*nonSynRate*0.150568;
+MG94custom[22][30]:=CT*nonSynRate*0.261648;
+MG94custom[22][38]:=CG*nonSynRate*0.284375;
+MG94custom[22][52]:=CT*nonSynRate*0.176989;
+MG94custom[23][7]:=AC*nonSynRate*0.348864;
+MG94custom[23][19]:=AC*nonSynRate*0.386364;
+MG94custom[23][20]:=AT*synRate*0.478125;
+MG94custom[23][21]:=CT*synRate*0.10767;
+MG94custom[23][22]:=GT*synRate*0.19375;
+MG94custom[23][27]:=CG*nonSynRate*0.150568;
+MG94custom[23][31]:=CT*nonSynRate*0.261648;
+MG94custom[23][39]:=CG*nonSynRate*0.284375;
+MG94custom[23][53]:=CT*nonSynRate*0.176989;
+MG94custom[24][8]:=AC*synRate*0.348864;
+MG94custom[24][16]:=nonSynRate*0.386364;
+MG94custom[24][20]:=CG*nonSynRate*0.20142;
+MG94custom[24][25]:=AC*synRate*0.10767;
+MG94custom[24][26]:=synRate*0.19375;
+MG94custom[24][27]:=AT*synRate*0.220455;
+MG94custom[24][28]:=GT*nonSynRate*0.261648;
+MG94custom[24][40]:=CG*nonSynRate*0.284375;
+MG94custom[25][9]:=AC*nonSynRate*0.348864;
+MG94custom[25][17]:=nonSynRate*0.386364;
+MG94custom[25][21]:=CG*nonSynRate*0.20142;
+MG94custom[25][24]:=AC*synRate*0.478125;
+MG94custom[25][26]:=CG*synRate*0.19375;
+MG94custom[25][27]:=CT*synRate*0.220455;
+MG94custom[25][29]:=GT*nonSynRate*0.261648;
+MG94custom[25][41]:=CG*nonSynRate*0.284375;
+MG94custom[25][54]:=CT*nonSynRate*0.176989;
+MG94custom[26][10]:=AC*synRate*0.348864;
+MG94custom[26][18]:=nonSynRate*0.386364;
+MG94custom[26][22]:=CG*nonSynRate*0.20142;
+MG94custom[26][24]:=synRate*0.478125;
+MG94custom[26][25]:=CG*synRate*0.10767;
+MG94custom[26][27]:=GT*synRate*0.220455;
+MG94custom[26][30]:=GT*nonSynRate*0.261648;
+MG94custom[26][42]:=CG*nonSynRate*0.284375;
+MG94custom[26][55]:=CT*nonSynRate*0.176989;
+MG94custom[27][11]:=AC*nonSynRate*0.348864;
+MG94custom[27][19]:=nonSynRate*0.386364;
+MG94custom[27][23]:=CG*nonSynRate*0.20142;
+MG94custom[27][24]:=AT*synRate*0.478125;
+MG94custom[27][25]:=CT*synRate*0.10767;
+MG94custom[27][26]:=GT*synRate*0.19375;
+MG94custom[27][31]:=GT*nonSynRate*0.261648;
+MG94custom[27][43]:=CG*nonSynRate*0.284375;
+MG94custom[27][56]:=CT*nonSynRate*0.176989;
+MG94custom[28][12]:=AC*nonSynRate*0.348864;
+MG94custom[28][16]:=AT*nonSynRate*0.386364;
+MG94custom[28][20]:=CT*nonSynRate*0.20142;
+MG94custom[28][24]:=GT*nonSynRate*0.150568;
+MG94custom[28][29]:=AC*synRate*0.10767;
+MG94custom[28][30]:=synRate*0.19375;
+MG94custom[28][31]:=AT*synRate*0.220455;
+MG94custom[28][44]:=CG*nonSynRate*0.284375;
+MG94custom[28][57]:=CT*synRate*0.176989;
+MG94custom[29][13]:=AC*nonSynRate*0.348864;
+MG94custom[29][17]:=AT*nonSynRate*0.386364;
+MG94custom[29][21]:=CT*nonSynRate*0.20142;
+MG94custom[29][25]:=GT*nonSynRate*0.150568;
+MG94custom[29][28]:=AC*synRate*0.478125;
+MG94custom[29][30]:=CG*synRate*0.19375;
+MG94custom[29][31]:=CT*synRate*0.220455;
+MG94custom[29][45]:=CG*nonSynRate*0.284375;
+MG94custom[29][58]:=CT*nonSynRate*0.176989;
+MG94custom[30][14]:=AC*nonSynRate*0.348864;
+MG94custom[30][18]:=AT*nonSynRate*0.386364;
+MG94custom[30][22]:=CT*nonSynRate*0.20142;
+MG94custom[30][26]:=GT*nonSynRate*0.150568;
+MG94custom[30][28]:=synRate*0.478125;
+MG94custom[30][29]:=CG*synRate*0.10767;
+MG94custom[30][31]:=GT*synRate*0.220455;
+MG94custom[30][46]:=CG*nonSynRate*0.284375;
+MG94custom[30][59]:=CT*synRate*0.176989;
+MG94custom[31][15]:=AC*nonSynRate*0.348864;
+MG94custom[31][19]:=AT*nonSynRate*0.386364;
+MG94custom[31][23]:=CT*nonSynRate*0.20142;
+MG94custom[31][27]:=GT*nonSynRate*0.150568;
+MG94custom[31][28]:=AT*synRate*0.478125;
+MG94custom[31][29]:=CT*synRate*0.10767;
+MG94custom[31][30]:=GT*synRate*0.19375;
+MG94custom[31][47]:=CG*nonSynRate*0.284375;
+MG94custom[31][60]:=CT*nonSynRate*0.176989;
+MG94custom[32][0]:=nonSynRate*0.348864;
+MG94custom[32][16]:=CG*nonSynRate*0.189773;
+MG94custom[32][33]:=AC*nonSynRate*0.10767;
+MG94custom[32][34]:=synRate*0.19375;
+MG94custom[32][35]:=AT*nonSynRate*0.220455;
+MG94custom[32][36]:=AC*nonSynRate*0.20142;
+MG94custom[32][40]:=nonSynRate*0.150568;
+MG94custom[32][44]:=AT*nonSynRate*0.261648;
+MG94custom[33][1]:=nonSynRate*0.348864;
+MG94custom[33][17]:=CG*nonSynRate*0.189773;
+MG94custom[33][32]:=AC*nonSynRate*0.478125;
+MG94custom[33][34]:=CG*nonSynRate*0.19375;
+MG94custom[33][35]:=CT*synRate*0.220455;
+MG94custom[33][37]:=AC*nonSynRate*0.20142;
+MG94custom[33][41]:=nonSynRate*0.150568;
+MG94custom[33][45]:=AT*nonSynRate*0.261648;
+MG94custom[33][48]:=GT*nonSynRate*0.176989;
+MG94custom[34][2]:=nonSynRate*0.348864;
+MG94custom[34][18]:=CG*nonSynRate*0.189773;
+MG94custom[34][32]:=synRate*0.478125;
+MG94custom[34][33]:=CG*nonSynRate*0.10767;
+MG94custom[34][35]:=GT*nonSynRate*0.220455;
+MG94custom[34][38]:=AC*nonSynRate*0.20142;
+MG94custom[34][42]:=nonSynRate*0.150568;
+MG94custom[34][46]:=AT*nonSynRate*0.261648;
+MG94custom[35][3]:=nonSynRate*0.348864;
+MG94custom[35][19]:=CG*nonSynRate*0.189773;
+MG94custom[35][32]:=AT*nonSynRate*0.478125;
+MG94custom[35][33]:=CT*synRate*0.10767;
+MG94custom[35][34]:=GT*nonSynRate*0.19375;
+MG94custom[35][39]:=AC*nonSynRate*0.20142;
+MG94custom[35][43]:=nonSynRate*0.150568;
+MG94custom[35][47]:=AT*nonSynRate*0.261648;
+MG94custom[35][49]:=GT*nonSynRate*0.176989;
+MG94custom[36][4]:=nonSynRate*0.348864;
+MG94custom[36][20]:=CG*nonSynRate*0.189773;
+MG94custom[36][32]:=AC*nonSynRate*0.386364;
+MG94custom[36][37]:=AC*synRate*0.10767;
+MG94custom[36][38]:=synRate*0.19375;
+MG94custom[36][39]:=AT*synRate*0.220455;
+MG94custom[36][40]:=CG*nonSynRate*0.150568;
+MG94custom[36][44]:=CT*nonSynRate*0.261648;
+MG94custom[36][50]:=GT*nonSynRate*0.176989;
+MG94custom[37][5]:=nonSynRate*0.348864;
+MG94custom[37][21]:=CG*nonSynRate*0.189773;
+MG94custom[37][33]:=AC*nonSynRate*0.386364;
+MG94custom[37][36]:=AC*synRate*0.478125;
+MG94custom[37][38]:=CG*synRate*0.19375;
+MG94custom[37][39]:=CT*synRate*0.220455;
+MG94custom[37][41]:=CG*nonSynRate*0.150568;
+MG94custom[37][45]:=CT*nonSynRate*0.261648;
+MG94custom[37][51]:=GT*nonSynRate*0.176989;
+MG94custom[38][6]:=nonSynRate*0.348864;
+MG94custom[38][22]:=CG*nonSynRate*0.189773;
+MG94custom[38][34]:=AC*nonSynRate*0.386364;
+MG94custom[38][36]:=synRate*0.478125;
+MG94custom[38][37]:=CG*synRate*0.10767;
+MG94custom[38][39]:=GT*synRate*0.220455;
+MG94custom[38][42]:=CG*nonSynRate*0.150568;
+MG94custom[38][46]:=CT*nonSynRate*0.261648;
+MG94custom[38][52]:=GT*nonSynRate*0.176989;
+MG94custom[39][7]:=nonSynRate*0.348864;
+MG94custom[39][23]:=CG*nonSynRate*0.189773;
+MG94custom[39][35]:=AC*nonSynRate*0.386364;
+MG94custom[39][36]:=AT*synRate*0.478125;
+MG94custom[39][37]:=CT*synRate*0.10767;
+MG94custom[39][38]:=GT*synRate*0.19375;
+MG94custom[39][43]:=CG*nonSynRate*0.150568;
+MG94custom[39][47]:=CT*nonSynRate*0.261648;
+MG94custom[39][53]:=GT*nonSynRate*0.176989;
+MG94custom[40][8]:=nonSynRate*0.348864;
+MG94custom[40][24]:=CG*nonSynRate*0.189773;
+MG94custom[40][32]:=nonSynRate*0.386364;
+MG94custom[40][36]:=CG*nonSynRate*0.20142;
+MG94custom[40][41]:=AC*synRate*0.10767;
+MG94custom[40][42]:=synRate*0.19375;
+MG94custom[40][43]:=AT*synRate*0.220455;
+MG94custom[40][44]:=GT*nonSynRate*0.261648;
+MG94custom[41][9]:=nonSynRate*0.348864;
+MG94custom[41][25]:=CG*nonSynRate*0.189773;
+MG94custom[41][33]:=nonSynRate*0.386364;
+MG94custom[41][37]:=CG*nonSynRate*0.20142;
+MG94custom[41][40]:=AC*synRate*0.478125;
+MG94custom[41][42]:=CG*synRate*0.19375;
+MG94custom[41][43]:=CT*synRate*0.220455;
+MG94custom[41][45]:=GT*nonSynRate*0.261648;
+MG94custom[41][54]:=GT*nonSynRate*0.176989;
+MG94custom[42][10]:=nonSynRate*0.348864;
+MG94custom[42][26]:=CG*nonSynRate*0.189773;
+MG94custom[42][34]:=nonSynRate*0.386364;
+MG94custom[42][38]:=CG*nonSynRate*0.20142;
+MG94custom[42][40]:=synRate*0.478125;
+MG94custom[42][41]:=CG*synRate*0.10767;
+MG94custom[42][43]:=GT*synRate*0.220455;
+MG94custom[42][46]:=GT*nonSynRate*0.261648;
+MG94custom[42][55]:=GT*nonSynRate*0.176989;
+MG94custom[43][11]:=nonSynRate*0.348864;
+MG94custom[43][27]:=CG*nonSynRate*0.189773;
+MG94custom[43][35]:=nonSynRate*0.386364;
+MG94custom[43][39]:=CG*nonSynRate*0.20142;
+MG94custom[43][40]:=AT*synRate*0.478125;
+MG94custom[43][41]:=CT*synRate*0.10767;
+MG94custom[43][42]:=GT*synRate*0.19375;
+MG94custom[43][47]:=GT*nonSynRate*0.261648;
+MG94custom[43][56]:=GT*nonSynRate*0.176989;
+MG94custom[44][12]:=nonSynRate*0.348864;
+MG94custom[44][28]:=CG*nonSynRate*0.189773;
+MG94custom[44][32]:=AT*nonSynRate*0.386364;
+MG94custom[44][36]:=CT*nonSynRate*0.20142;
+MG94custom[44][40]:=GT*nonSynRate*0.150568;
+MG94custom[44][45]:=AC*synRate*0.10767;
+MG94custom[44][46]:=synRate*0.19375;
+MG94custom[44][47]:=AT*synRate*0.220455;
+MG94custom[44][57]:=GT*nonSynRate*0.176989;
+MG94custom[45][13]:=nonSynRate*0.348864;
+MG94custom[45][29]:=CG*nonSynRate*0.189773;
+MG94custom[45][33]:=AT*nonSynRate*0.386364;
+MG94custom[45][37]:=CT*nonSynRate*0.20142;
+MG94custom[45][41]:=GT*nonSynRate*0.150568;
+MG94custom[45][44]:=AC*synRate*0.478125;
+MG94custom[45][46]:=CG*synRate*0.19375;
+MG94custom[45][47]:=CT*synRate*0.220455;
+MG94custom[45][58]:=GT*nonSynRate*0.176989;
+MG94custom[46][14]:=nonSynRate*0.348864;
+MG94custom[46][30]:=CG*nonSynRate*0.189773;
+MG94custom[46][34]:=AT*nonSynRate*0.386364;
+MG94custom[46][38]:=CT*nonSynRate*0.20142;
+MG94custom[46][42]:=GT*nonSynRate*0.150568;
+MG94custom[46][44]:=synRate*0.478125;
+MG94custom[46][45]:=CG*synRate*0.10767;
+MG94custom[46][47]:=GT*synRate*0.220455;
+MG94custom[46][59]:=GT*nonSynRate*0.176989;
+MG94custom[47][15]:=nonSynRate*0.348864;
+MG94custom[47][31]:=CG*nonSynRate*0.189773;
+MG94custom[47][35]:=AT*nonSynRate*0.386364;
+MG94custom[47][39]:=CT*nonSynRate*0.20142;
+MG94custom[47][43]:=GT*nonSynRate*0.150568;
+MG94custom[47][44]:=AT*synRate*0.478125;
+MG94custom[47][45]:=CT*synRate*0.10767;
+MG94custom[47][46]:=GT*synRate*0.19375;
+MG94custom[47][60]:=GT*nonSynRate*0.176989;
+MG94custom[48][1]:=AT*nonSynRate*0.348864;
+MG94custom[48][17]:=CT*nonSynRate*0.189773;
+MG94custom[48][33]:=GT*nonSynRate*0.284375;
+MG94custom[48][49]:=CT*synRate*0.220455;
+MG94custom[48][51]:=AC*nonSynRate*0.20142;
+MG94custom[48][54]:=nonSynRate*0.150568;
+MG94custom[48][58]:=AT*nonSynRate*0.261648;
+MG94custom[49][3]:=AT*nonSynRate*0.348864;
+MG94custom[49][19]:=CT*nonSynRate*0.189773;
+MG94custom[49][35]:=GT*nonSynRate*0.284375;
+MG94custom[49][48]:=CT*synRate*0.10767;
+MG94custom[49][53]:=AC*nonSynRate*0.20142;
+MG94custom[49][56]:=nonSynRate*0.150568;
+MG94custom[49][60]:=AT*nonSynRate*0.261648;
+MG94custom[50][4]:=AT*nonSynRate*0.348864;
+MG94custom[50][20]:=CT*nonSynRate*0.189773;
+MG94custom[50][36]:=GT*nonSynRate*0.284375;
+MG94custom[50][51]:=AC*synRate*0.10767;
+MG94custom[50][52]:=synRate*0.19375;
+MG94custom[50][53]:=AT*synRate*0.220455;
+MG94custom[50][57]:=CT*nonSynRate*0.261648;
+MG94custom[51][5]:=AT*nonSynRate*0.348864;
+MG94custom[51][21]:=CT*nonSynRate*0.189773;
+MG94custom[51][37]:=GT*nonSynRate*0.284375;
+MG94custom[51][48]:=AC*nonSynRate*0.386364;
+MG94custom[51][50]:=AC*synRate*0.478125;
+MG94custom[51][52]:=CG*synRate*0.19375;
+MG94custom[51][53]:=CT*synRate*0.220455;
+MG94custom[51][54]:=CG*nonSynRate*0.150568;
+MG94custom[51][58]:=CT*nonSynRate*0.261648;
+MG94custom[52][6]:=AT*nonSynRate*0.348864;
+MG94custom[52][22]:=CT*nonSynRate*0.189773;
+MG94custom[52][38]:=GT*nonSynRate*0.284375;
+MG94custom[52][50]:=synRate*0.478125;
+MG94custom[52][51]:=CG*synRate*0.10767;
+MG94custom[52][53]:=GT*synRate*0.220455;
+MG94custom[52][55]:=CG*nonSynRate*0.150568;
+MG94custom[52][59]:=CT*nonSynRate*0.261648;
+MG94custom[53][7]:=AT*nonSynRate*0.348864;
+MG94custom[53][23]:=CT*nonSynRate*0.189773;
+MG94custom[53][39]:=GT*nonSynRate*0.284375;
+MG94custom[53][49]:=AC*nonSynRate*0.386364;
+MG94custom[53][50]:=AT*synRate*0.478125;
+MG94custom[53][51]:=CT*synRate*0.10767;
+MG94custom[53][52]:=GT*synRate*0.19375;
+MG94custom[53][56]:=CG*nonSynRate*0.150568;
+MG94custom[53][60]:=CT*nonSynRate*0.261648;
+MG94custom[54][9]:=AT*nonSynRate*0.348864;
+MG94custom[54][25]:=CT*nonSynRate*0.189773;
+MG94custom[54][41]:=GT*nonSynRate*0.284375;
+MG94custom[54][48]:=nonSynRate*0.386364;
+MG94custom[54][51]:=CG*nonSynRate*0.20142;
+MG94custom[54][55]:=CG*nonSynRate*0.19375;
+MG94custom[54][56]:=CT*synRate*0.220455;
+MG94custom[54][58]:=GT*nonSynRate*0.261648;
+MG94custom[55][10]:=AT*nonSynRate*0.348864;
+MG94custom[55][26]:=CT*nonSynRate*0.189773;
+MG94custom[55][42]:=GT*nonSynRate*0.284375;
+MG94custom[55][52]:=CG*nonSynRate*0.20142;
+MG94custom[55][54]:=CG*nonSynRate*0.10767;
+MG94custom[55][56]:=GT*nonSynRate*0.220455;
+MG94custom[55][59]:=GT*nonSynRate*0.261648;
+MG94custom[56][11]:=AT*nonSynRate*0.348864;
+MG94custom[56][27]:=CT*nonSynRate*0.189773;
+MG94custom[56][43]:=GT*nonSynRate*0.284375;
+MG94custom[56][49]:=nonSynRate*0.386364;
+MG94custom[56][53]:=CG*nonSynRate*0.20142;
+MG94custom[56][54]:=CT*synRate*0.10767;
+MG94custom[56][55]:=GT*nonSynRate*0.19375;
+MG94custom[56][60]:=GT*nonSynRate*0.261648;
+MG94custom[57][12]:=AT*nonSynRate*0.348864;
+MG94custom[57][28]:=CT*synRate*0.189773;
+MG94custom[57][44]:=GT*nonSynRate*0.284375;
+MG94custom[57][50]:=CT*nonSynRate*0.20142;
+MG94custom[57][58]:=AC*nonSynRate*0.10767;
+MG94custom[57][59]:=synRate*0.19375;
+MG94custom[57][60]:=AT*nonSynRate*0.220455;
+MG94custom[58][13]:=AT*nonSynRate*0.348864;
+MG94custom[58][29]:=CT*nonSynRate*0.189773;
+MG94custom[58][45]:=GT*nonSynRate*0.284375;
+MG94custom[58][48]:=AT*nonSynRate*0.386364;
+MG94custom[58][51]:=CT*nonSynRate*0.20142;
+MG94custom[58][54]:=GT*nonSynRate*0.150568;
+MG94custom[58][57]:=AC*nonSynRate*0.478125;
+MG94custom[58][59]:=CG*nonSynRate*0.19375;
+MG94custom[58][60]:=CT*synRate*0.220455;
+MG94custom[59][14]:=AT*nonSynRate*0.348864;
+MG94custom[59][30]:=CT*synRate*0.189773;
+MG94custom[59][46]:=GT*nonSynRate*0.284375;
+MG94custom[59][52]:=CT*nonSynRate*0.20142;
+MG94custom[59][55]:=GT*nonSynRate*0.150568;
+MG94custom[59][57]:=synRate*0.478125;
+MG94custom[59][58]:=CG*nonSynRate*0.10767;
+MG94custom[59][60]:=GT*nonSynRate*0.220455;
+MG94custom[60][15]:=AT*nonSynRate*0.348864;
+MG94custom[60][31]:=CT*nonSynRate*0.189773;
+MG94custom[60][47]:=GT*nonSynRate*0.284375;
+MG94custom[60][49]:=AT*nonSynRate*0.386364;
+MG94custom[60][53]:=CT*nonSynRate*0.20142;
+MG94custom[60][56]:=GT*nonSynRate*0.150568;
+MG94custom[60][57]:=AT*nonSynRate*0.478125;
+MG94custom[60][58]:=CT*synRate*0.10767;
+MG94custom[60][59]:=GT*nonSynRate*0.19375;
+
+vectorOfFrequencies={
+{   0.0684634387476}
+{   0.0154174945249}
+{   0.0277433542637}
+{   0.0315672183411}
+{   0.0356916015236}
+{  0.00803750266039}
+{   0.0144632633625}
+{   0.0164567336793}
+{   0.0266806048061}
+{  0.00600828830748}
+{   0.0108117483528}
+{   0.0123019306771}
+{    0.046363843446}
+{   0.0104408179834}
+{   0.0187879627036}
+{   0.0213775059501}
+{   0.0372423266151}
+{  0.00838671526271}
+{   0.0150916617656}
+{   0.0171717441791}
+{   0.0194153011545}
+{  0.00437219200093}
+{  0.00786763837634}
+{  0.00895203428158}
+{   0.0145135537544}
+{   0.0032683522715}
+{  0.00588130936454}
+{  0.00669192971684}
+{   0.0252207226563}
+{  0.00567953290953}
+{   0.0102201621222}
+{   0.0116288061683}
+{   0.0558077379368}
+{   0.0125675179311}
+{   0.0226149003404}
+{   0.0257319100647}
+{   0.0290938869097}
+{  0.00655174280379}
+{   0.0117896796627}
+{   0.0134146501734}
+{   0.0217486037548}
+{  0.00489763566432}
+{  0.00881315969148}
+{   0.0100278767164}
+{   0.0377933284116}
+{  0.00851079706952}
+{   0.0153149435393}
+{     0.01742580086}
+{  0.00782174192914}
+{   0.0160149650053}
+{   0.0181073841606}
+{  0.00407765810865}
+{  0.00733763279709}
+{  0.00834897807998}
+{  0.00304817884003}
+{  0.00548511337442}
+{  0.00624112606825}
+{   0.0235217218785}
+{  0.00529692964466}
+{  0.00953167814686}
+{   0.0108454285073}
+}
+;
+
+Model MG94customModel=(MG94custom,vectorOfFrequencies,0);
+
+UseModel (MG94customModel);
+Tree givenTree=(((D_CD_83_ELI_ACC_K03454,D_CD_83_NDK_ACC_M27323)Node3,D_UG_94_94UG114_ACC_U88824)Node2,D_CD_84_84ZR085_ACC_U88822,(B_US_83_RF_ACC_M17451,((B_FR_83_HXB2_ACC_K03455,B_US_86_JRFL_ACC_U63632)Node11,B_US_90_WEAU160_ACC_U21135)Node10)Node8);
+
+DataSet ds = ReadDataFile(USE_NEXUS_FILE_DATA);
+DataSetFilter filteredData = CreateFilter(ds,3,"0-1319","4,5,7,6,1,0,2,3","TAA,TAG,TGA");
+
+PARAMETER_GROUPING = {"0" : {{"AC","AT","CT"}}};
+LikelihoodFunction lf = (filteredData,givenTree);
+OPTIMIZATION_PRECISION     = 0.001;
+VERBOSITY_LEVEL	           = 1;
+OPTIMIZATION_METHOD		   = 4;
+USE_ADAPTIVE_VARIABLE_STEP = 1;
+
+Optimize 			(res,lf);
+
+/* test epilogue */
+	timeMatrix = endTestTimer 				  (_testDescription);
+	if (logTestResult    (Abs (res[1][0] - _expectedLL) < 2*OPTIMIZATION_PRECISION))
+	{
+		return timeMatrix;
+	}
+	return 0;
+/* end test epilogue */
+
+
+END;
diff --git a/tests/hbltests/SimpleOptimizations/TwoSequenceTest.bf b/tests/hbltests/SimpleOptimizations/TwoSequenceTest.bf
new file mode 100644
index 0000000..1ce3617
--- /dev/null
+++ b/tests/hbltests/SimpleOptimizations/TwoSequenceTest.bf
@@ -0,0 +1,64 @@
+/* test preamble */
+
+	_testDescription 		= " a series of model fits on two HIV-1 RT sequences (nucleotide, protein and codon)";
+	expectedLL = {{-947.794202692758,-947.794927641445,-662.04841954136,-930.569844169857}};
+	ExecuteAFile 			("../Shared/TestInstrumentation.bf");
+	startTestTimer 			(_testDescription);
+
+/* end test preamble */
+
+
+modelLL    = {1,4};
+
+runTimer = Time(1);
+
+fprintf (stdout, "\nRunning a series of model fits on two HIV-1 RT sequences\n");
+
+inputOptions = {};
+inputOptions["0"] = PATH_TO_CURRENT_BF+".." +DIRECTORY_SEPARATOR+"data"+DIRECTORY_SEPARATOR+"2.fas";
+inputOptions["1"] = "HKY85";
+inputOptions["2"] = "Global";
+inputOptions["6"] = PATH_TO_CURRENT_BF+".."+DIRECTORY_SEPARATOR+"data"+DIRECTORY_SEPARATOR+"2.tree";
+
+ExecuteAFile (HYPHY_LIB_DIRECTORY + "TemplateBatchFiles" + DIRECTORY_SEPARATOR + "AnalyzeNucProtData.bf", inputOptions);
+
+modelLL [0] = res[1][0];
+
+inputOptions["2"] = "Global w/variation";
+inputOptions["3"] = "General Discrete";
+inputOptions["4"] = "2";
+inputOptions["7"] = "Don't Display";
+
+ExecuteAFile (HYPHY_LIB_DIRECTORY + "TemplateBatchFiles" + DIRECTORY_SEPARATOR + "AnalyzeNucProtData.bf", inputOptions);
+
+modelLL [1] = res[1][0];
+
+inputOptions["0"] = PATH_TO_CURRENT_BF+".."+DIRECTORY_SEPARATOR+"data"+DIRECTORY_SEPARATOR+"2.prot";
+inputOptions["1"] = "HIVBETWEEN";
+inputOptions["2"] = "Rate variation";
+
+ExecuteAFile (HYPHY_LIB_DIRECTORY + "TemplateBatchFiles" + DIRECTORY_SEPARATOR + "AnalyzeNucProtData.bf", inputOptions);
+
+modelLL [2] = res[1][0];
+
+
+inputOptions["1"] = PATH_TO_CURRENT_BF+".."+DIRECTORY_SEPARATOR+"data"+DIRECTORY_SEPARATOR+"2.fas";
+inputOptions["0"] = "Universal";
+inputOptions["2"] = "MG94";
+inputOptions["3"] = "Local";
+inputOptions["4"] = inputOptions["6"];
+inputOptions["5"] = inputOptions["7"];
+
+ExecuteAFile (HYPHY_LIB_DIRECTORY + "TemplateBatchFiles" + DIRECTORY_SEPARATOR + "AnalyzeCodonData.bf", inputOptions);
+
+modelLL [3] = res[1][0];
+
+
+/* test epilogue */
+	timeMatrix = endTestTimer 				  (_testDescription);
+	if (logTestResult (Abs (expectedLL-modelLL) < 2*OPTIMIZATION_PRECISION))
+	{
+		return timeMatrix;
+	}
+	return 0;
+/* end test epilogue */
\ No newline at end of file
diff --git a/tests/hbltests/SpecializedOptimizations/SingleSiteTemplate.bf b/tests/hbltests/SpecializedOptimizations/SingleSiteTemplate.bf
new file mode 100644
index 0000000..6fc440f
--- /dev/null
+++ b/tests/hbltests/SpecializedOptimizations/SingleSiteTemplate.bf
@@ -0,0 +1,640 @@
+#NEXUS
+
+BEGIN TAXA;
+	DIMENSIONS NTAX = 194;
+	TAXLABELS
+		'02198022_73' 'AY532111_138' 'AY532112_138' 'AY532113_126' 'OB1995002_168' 'OB1995012_164' 'OB1995001_165' 'OB2000015_106' 'OB2000016_106' 'OB2000043_98' 'OB2001018_95' 'OB2001058_86' 'AY532114_138' 'AY741811_138' 'AY532115_138' 'DQ078829_138' 'AY532116_138' 'AY532117_138' 'AY532118_138' 'AY532119_126' 'AY532120_138' 'DQ975270_126' 'AY532121_138' 'AY532122_138' 'AY532123_126' 'EP2002006_84' 'AY532124_138' 'AY532125_126' 'AY532126_126' 'AY532127_138' 'AY532128_138' 'AY532129_126' 'AY532 [...]
+END;
+
+BEGIN CHARACTERS;
+	DIMENSIONS NCHAR = 1620;
+	FORMAT
+		DATATYPE = DNA
+		GAP=-
+		MISSING=?
+	;
+
+MATRIX
+	'02198022_73'                  ATGAAGATGGCGTCGAATGACGTCAACCCATCTGATGGGTCCGCAGCCAACCTCGTCCCAGAGGTCAACAATGAGGTTATGGCTCTGGAGCCCGTTGTTGGTGCCGCCATTGCGGCACCTGTAGCGGGCCAACAAAACATAATTGACCCCTGGATTAGAAATAATTTTGTACAAGCCCCTGGTGGAGAATTCACAGTGTCCCCTAGGAATGCTCCAGGTGAAATACTATGGAGCGCACCTTTGGGCCCTGATTTGAACCCCTACCTTTCTCATTTGTCTAGAATGTATAATGGTTATGCAGGTGGTTTTGAAGTGCAAGTGATCCTCGCGGGGAACGCGTTCACCGCTGGGAAGGTCATATTTGCGGCAGTCCCTCCAAACTTCCCAACTGAAGGTCTGAGCCCTAGTCAAGTCACTATGTTCCCCCATATAATTGTAGATGTTAGACAATTAGAACCTG [...]
+	'AY532111_138'                 ATGAAGATGGCGTCGAATGACGCCAACCCATCTGATGGGTCCACAGCCAACCTCGTCCCAGAGGTCAACAATGAGGTTATGGCTTTGGAGCCCGTTGTTGGTGCCGCTATTGCGGCACCTGTAGCGGGCCAACAAAATGTAATTGACCCCTGGATTAGAAATAATTTTGTACAAGCCCCTGGTGGAGAGTTTACAGTATCCCCTAGAAACGCTCCGGGTGAGATACTATGGAGCGCGCCCTTGAGCCCTGATTTGAACCCCTACCTTTCTCATTTGGCCAGAATGTACAATGGTTATGCAGGTGGTTTTGAAGTGCAGGTAATCCTCGCGGGGAACGCGTTCACCGCGGGGAAAATCATATTTGCAGCAGTCCCACCAAATTTTCCAACTGAAGGCTTGAGCCCCAGCCAGGTTACTATGTTTCCCCATATAATAGTAGATGTTAGGCAATTGGAACCTG [...]
+	'AY532112_138'                 ATGAAGATGGCGTCGAATGACGCCAACCCATCTGATGGGTCCACAGCCAACCTCGTCCCAGAGGTCAACAATGAGGTTATGGCTTTGGAGCCCGTTGTTGGTGCCGCTATTGCGGCACCTGTAGCGGGCCAACAAAATATAATTGACCCCTGGATTAGAAATAATTTTGTACAAGCCCCTGGTGGAGAGTTTACAGTATCCCCTAGAAACGCTCCGGGTGAGATACTATGGAGCGCGCCCTTGGGCCCTGATTTGAACCCCTACCTTTCTCATTTGGCCAGAATGTACAATGGTTATGCAGGTGGTTTTGAAGTGCAGGTAATCCTCGCGGGGAACGCGTTCACCGCCGGGAAAATCATATTTGCAGCAGTCCCACCAAATTTTCCAACTGAAGGCTTGAGCCCCAGCCAGGTTACTATGTTCCCCCATATAATAGTAGATGTTAGGCAATTGGAACCTG [...]
+	'AY532113_126'                 ATGAAGATGGCGTCGAATGACGCCAACCCATCTGATGGGTCCACAGCCAACCTCGTCCCAGAGGTCAACAATGAGGTTATGGCTTTGGAGCCCGTTGTTGGTGCCGCTATTGCGGCACCTGTAGCGGGCCAACAAAATATAATTGACCCCTGGATTAGAAATAATTTTGTACAAGCCCCTGGTGGAGAGTTTACAGTATCCCCTAGAAACGCTCCGGGTGAGATACTATGGAGCGCGCCCTTGGGTCCTGATTTGAACCCCTACCTTTCTCATTTGGCCAGAATGTACAATGGTTATGCAGGTGGTTTTGAAGTGCAGGTAATCCTCGCGGGGAACGCGTTCACCGCCGGGAAAATCATATTTGCAGCAGTCCCACCAAATTTTCCAACTGAAGGCTTGAGCCCCAGCCAGGTTACTATGTTCCCCCATATAATAGTAGATGTTAGGCAATTGGAACCTG [...]
+	'OB1995002_168'                ATGAAGATGGCGTCGAATGACGCCAACCCATCTGATGGGTCCACAGCCAACCTCGTCCCAGAGGTCAACAATGAGGTTATGGCTTTGGAGCCCGTTGTTGGTGCCGCTATTGCGGCACCTGTAGCGGGCCAACAAAATGTAATTGACCCCTGGATTAGAAATAATTTTGTACAAGCCCCTGGTGGAGAGTTTACAGTATCCCCTAGAAACGCTCCGGGTGAGATACTATGGAGCGCGCCCCTGGGCCCTGATTTGAACCCCTACCTTTCTCATTTGGCCAGAATGTACAATGGTTATGCAGGTGGTTTTGAAGTGCAGGTAATCCTCGCGGGGAACGCGTTCACCGCCGGGAAAATCATATTTGCAGCAGTCCCACCAAATTTTCCAACTGAAGGCTTGAGCCCCAGCCAGGTTACTATGTTCCCCCATATAATAGTAGATGTTAGGCAATTGGAACCTG [...]
+	'OB1995012_164'                ATGAAGATGGCGTCGAATGACGCCAACCCATCTGGTGGGTCCACAGCCAACCTCGTCCCAGAGGTCAGCAATGAGGTTATGGCTTTGGAGCCCGTTGTTGGTGCCGCTATTGCGGCACCTGTAGCGGGCCAACAAAATGTAATTGACCCCTGGATTAGAAATAATTTTGTACAAGCCCCTGGTGGAGAGTTTACAGTATCCCCTAGAAACGCTCCGGGTGAAATACTGTGGAGCGCGCCCTTGGGCCCTGATTTGAACCCCTACCTTTCTCATTTGGCCAGAATGTGCAATGGTTATGCAGGTGGTTTTGAAGTGCAGGTAATCCTCGCGGGGAACGCGTTCACCGCCGGGAAAATCATATTTGCAGCAGTCCCACCAAATTTTCCAACTGAAGGCTTGAGCCCCAGTCAGGTTACTATGTTCCCCCATATAATAGTAGATGTTAGGCAATTGGAACCTG [...]
+	'OB1995001_165'                ATGAAGATGGCGTCGAATGACGCCACCCCATCTGATGGGTCCACAGCCAACCTCGTCCCAGAGGTCAACAATGAGGTTATGGCTTTGGAGCCCGTTGTTGGTGCCGCTATTGCGGCACCTGTAGCGGGCCAACAAAATGTAATTGACCCCTGGATTAGAAGTAATTTTGTACAAGCCCCTGGTGGAGAGTTTACAGTATCCCCTAGAAACGCTCCGGGTGAGATACTATGGAGCGCGCCCTTGGGCCCTGATTTGAACCCCTACCTTTCTCATTTGGCCAGAATGTACAATGGTTATGCAGGTGGTTTTGAAGTGCAGGTAATCCTCGCGGGGAACGCGTTCACCGCCGGGAAAATCATATTTGCAGCAGTCCCACCAAATTTTCCAACTGAAGGCTTGAGCCCCAGCCAGGTTACTATGTTCCCCCATATAATAGTAGATGTCAGGCAATTGGAACCTG [...]
+	'OB2000015_106'                ATGAAGATGGCGTCGAATGACGCCAACCCATCTGATGGGTCCACAGCCAACCTCGTCCCAGAGGTCAACAATGAGGTTATGGCTTTGGAGCCCGTTGTTGGTGCCGCTATCGCGGCACCTGTAGCGGGCCAACAAAATGTAATTGACCCCTGGATTAGAAATAATTTTGTGCAAGCCCCTGGTGGAGAGTTTACAGTATCCCCTAGAAACGCTCCGGGTGAGATCCTTTGGAGCGCGCCCTTGGGCCCTGATTTGAACCCCTACCTTTCTCATTTGGCCAGAATGTACAATGGTTATGCAGGTGGTTTTGAAGTGCAGGTAATCCTCGCGGGGAATGCGTTCACCGCCGGGAAAATCATATTTGCAGCAGTCCCACCAAATTTTCCAACTGAAGGCTTGAGCCCCAGCCAGGTTACTATGTTCCCCCATATAATAGTAGATGTTAGGCAATTGGAACCTG [...]
+	'OB2000016_106'                ATGAAGATGGCGTCGAATGACGCCAACCCATCTGATGGGTCCACAGCCAACCTCGTCCCAGAGGTCAACAATGAGGTTATGGCTTTGGAGCCCGTTGTTGGTGCCGCTATCGCGGCACCTGTAGCGGGCCAACAAAATGTAATTGACCCCTGGATTAGAAATAATTTTGTGCAAGCCCCTGGTGGAGAGTTTACAGTGTCCCCTAGAAACGCTCCGGGTGAGATCCTTTGGAGCGCGCCCTTGGGCCCTGATTTGAACCCCTACCTTTCTCATTTGGCCAGAATGTACAATGGTTATGCAGGTGGTTTTGAAGTGCAGGTAATCCTCGCGGGGAATGCGTTCACCGCCGGGAAAATCATATTTGCAGCAGTCCCACCAAATTTTCCAACTGAAGGCTTGAGCCCCAGCCAGGTTACTATGTTCCCCCATATAATAGTAGATGTTAGGCAATTGGAACCTG [...]
+	'OB2000043_98'                 ATGAAGATGGCGTCGAATGACGCCAACCCATCTGATGGGTCCACAGCCAACCTCGTCCCAGAGGTCAACAATGAGGTTATGGCTTTGGAGCCCGTTGTTGGTGCCGCTATCGCGGCACCTGTAGCGGGCCAACAAAATGTAATTGACCCCTGGATTAGAAATAATTTTGTGCAAGCCCCTGGTGGAGAGTTTACAGTATCCCCTAGAAACGCTCCGGGTGAGATCCTATGGAGCGCGCCCTTGGGCCCTGATTTGAACCCCTACCTTTCTCATTTGGCCAGAATGTACAATGGTTATGCAGGTGGTTTTGAAGTGCAGGTAATCCTCGCGGGGAATGCGTTCACCGCCGGGAAAATCATATTCGCAGCAGTCCCACCAAATTTTCCAACTGAAGGCTTGAGCCCCAGCCAGGTCACTATGTTCCCCCATATAATAGTAGATGTTAGGCAATTGGAACCTG [...]
+	'OB2001018_95'                 ATGAAGATGGCGTCGAATGACGCCACCCCATCTGATGGGTCCACAGCCAACCTCGTCCCAGAGGTCAACAATGAGGTCATGGCTTTGGAGCCCGTTGTTGGTGCCGCTATTGCGGCACGTGTAGCGGGCCAACAAAATGTAATTGACCCCTGGATTAGAAATAATTTTGTACAAGCCCCTGGTGGAGAGTTTACAGTGTCCCCTAGAAACGCTCCGGGTGAGATACTATGGAGCGCGCCCTTGGGCCCTGATCTGAACCCCTACCTTTCCCATTTGGCCAGAATGTACAATGGTTATGCAGGTGGTTTTGAAGTGCAGGTAATCCTCGCGGGGAACGCGTTCACCGCCGGGAAAATCATATTTGCAGCAGTCCCACCAAATTTTCCAACTGAAGGCTTGAGCCCCAGCCAGGTCACTATGTTCCCCCATATAATAGTAGATGTTAGGCAATTGGAACCTG [...]
+	'OB2001058_86'                 ATGAAGATGGCGTCGAATGACGCCAACCCATCTGATGGGTCCACAGCCAACCTCGTCCCAGAGGTCAACAATGAGGTCATGGCTTTGGAGCCCGTTGTTGGTGCCGCTATTGCGGCACCTGTAGCGGGCCAACAAAATGTAATTGACCCCTGGATTAGAAGTAATTTTGTACAAGCCCCTGGTGGAGAGTTTACAGTATCCCCTAGAAACGCTCCGGGTGAGATACTATGGAGCGCGCCCTTGGGCCCTGATCTAAACCCCTACCTTTCCCATTTGGCCAGAATGTACAATGGTTATGCAGGTGGTTTTGAAGTGCAGGTAATCCTCGCGGGGAACGCGTTCACCGCCGGGAAAATCATATTTGCAGCAGTCCCACCAAATTTTCCAACTGAAGGCTTGAGCCCCAGCCAGGTCACTATGTTCCCCCATATAATAGTAGATGTTAGGCAATTGGAACCTG [...]
+	'AY532114_138'                 ATGAAGATGGCGTCGAATGACGCCAACCCATCTGATGGGTCCACAGCCAACCTCGTCCCAGAGGTCAACAATGAGGTTATGGCTTTGGAGCCCGTTGTTGGTGCCGCTATTGCGGCACCTGTAGCGGGCCAACAAAATGTAATTGACCCCTGGATTAGAAATAATTTTGTACAAGCCCCTGGTGGAGAATTTACAGTATCCCCTAGAAACGCTCCGGGTGAGATACTATGGAGCGCGCCCTTGGGCCCTGATTTGAACCCCTACCTTTCTCATTTGGCCAGAATGTACAATGGCTATGCAGGTGGTTTTGAAGTGCAGGTAATTCTCGCGGGGAACGCGTTCACCGCCGGGAAAATCATATTTGCAGCAGTCCCACCAAATTTTCCAACTGAAGGCTTGAGCCCCAGCCAGGTTACTATGTTCCCCCATATAATAGTAGATGTTAGGCAATTGGAACCTG [...]
+	'AY741811_138'                 ATGAAGATGGCGTCGAATGACGCCAACCCATCTGATGGGTCCACAGCCAACCTCGTCCCAGAGGTCAACAATGAGGTTATGGCTTTGGAGCCCGTTGTTGGTGCCGCTATTGCGGCACCTGTAGCGGGCCAACAAAATGTAATTGACCCCTGGATTAGAAATAATTTTGTACAAGCCCCTGGTGGAGAGTTTACAGTATCCCCTAGAAACGCTCCGGGTGAGATACTATGGAGCGCGCCCTTGGGCCCTGATTTGAACCCTTACCTTTCTCATTTGGCCAGAATGTACAATGGTTATGCAGGTGGCTTTGAAGTGCAGGTAATCCTCGCGGGGAACGCGTTCACCGCCGGGAAAGTCATATTTGCAGCAGTCCCACCAAATTTTCCAACTGAAGGCTTGAGCCCCAGCCAGGTTACTATGTTCCCCCATATAATAGTAGATGTTAGGCAACTGGAACCTG [...]
+	'AY532115_138'                 ATGAAGATGGCGTCGAATGACGCCAACCCATCTGATGGGTCCACAGCCAACCTCGTCCCAGAGGTCAACAATGAGGTTATGGCTTTGGAGCCCGTTGTTGGTGCCGCTATTGCGGCACCTGTAGCGGGCCAACAAAATGTAATTGACCCCTGGATTAGAAATAATTTTGTACAAGCCCCTGGTGGAGAGTTTACAGTGTCCCCTAGAAACGCTCCGGGTGAGATACTATGGAGCGCGCCCTTGGGCCCTGATTTGAACCCCTACCTTTCCCATTTGGCCAGAATGTACAATGGTTATGCAGGTGGTTTTGATGTGCAGGTAATCCTCGCGGGGAACGCGTTCACCGCCGGGAAAATCATATTTGCAGCAGTCCCACCAAATTTTCCAACTGAAGGCTTGAGCCCCAGCCAGGTCACTATGTTCCCCCATATAATAGTAGATGTTAGGCAATTGGAACCTG [...]
+	'DQ078829_138'                 ATGAAGATGGCGTCGAATGACGCCAACCCATCTGATGGGTCCGCAGCCAACCTCGTCCCAGAGGTCAACAATGAGGTTATGGCTTTGGAGCCCGTTGTTGGTGCCGCTATTGCGGCACCTGTAGCGGGCCAACAAAATGTAATTGACCCCTGGATTAGAAATAATTTTGTACAAGCCCCTGGTGGAGAGTTTACAGTATCCCCTAGAAACGCTCCGGGTGAGATATTATGGAGCGCGCCCTTGGGCCCTGATTTGAACCCCTACCCTTCTCATTTGGCCAGAATGTACAATGGTTATGCGGGTGGTTTTGAAGTGCAAGTAATCCTCGCGGGGAATGCGTTCACCGCCGGGAAAATCATATTTGCAGCAGTCCCACCAAATTTTCCAACTGAAGGCTTGAGCCCCAGCCAGGTTACTATGTTCCCCCATATAATAGTAGATGTTAGGCAATTGGATCCTG [...]
+	'AY532116_138'                 ATGAAGATGGCGTCGAATGACGCCAACCCATCTGATGGGTCCACAGCCAACCTCGTCCCAGAGGTCAACAATGAGGTTATGGCTTTGGAGCCCGTTGTTGGTGCCGCTATTGCGACACCTGTAGCGGGCCAACAAAATGTAATTGACCCCTGGATTAGAAATAATTTTGTACAAGCCCCTGGTGGAGAGTTTACAGTATCCCCTAGAAACGCTCCGGGTGAGATACTATGGAGCGCGCCCTTGGGCCCTGATTTGAACCCCTACCTTTCTCATTTGGCCAGAATGTACAATGGTTATGCAGGTGGTTTTGAAGTGCAGGTAATCCTCGCGGGGAACGCGTTCACCGCCGGGAAAATCATATTTGCAGCAGTCCCACCAAATTTTCCAACTGAAGGCTTGAGCCCCAGCCAGGTTACTATGTTCCCCCATATAATAGTAGATGTTAGGCAATTGGAACCTG [...]
+	'AY532117_138'                 ATGAAGATGGCGTCGAATGACGCCAACCCATCTGATGGGTCCACAGCCAACCTCGTCCCAGAGGTCAACAATGAGGTTATGGCTTTGGAGCCCGTTGTTGGTGCCGCTATTGCGGCACCTGTAGCGGGCCAACAAAATGTAATTGACCCCTGGATTAGAAATAATTTTGTACTGGGCCCCTGGGGAGAGTTTACAGTGTCCCCTAGAAACGCTCCGGGTGAGATACTGTGGAGCGCGCCCTTGGGCCCTGATTTGAACCCTTACCTTTCTCATTTGGCCAGAATGTACAATGGTTACGCAGGTGGCTTTGAAGTGCAGGTAATCCTCGCGGGGAACGCGTTCACCGCCGGGAAAATCATATTTGCAGCAGTCCCACCAAATTTTCCAACTGAAGGCTTGAGCCCCAGCCAGGTTACTATGTTCCCCCATATAATAGTAGATGTTAGGCAATTGGAACCTG [...]
+	'AY532118_138'                 ATGAAGATGGCGTCGAATGACGCCAACCCATCTGATGGGTCCACAGCCAACCTCGTCCCAGAGGTCAACAATGAGGTTATGGCTTTGGAGCCCGTTGTTGGTGCCGCTATTGCGGCACCTGTAGCGGGCCAACAAAATATAATTGACCCCTGGATTAGAAATAATTTTGTACAAGCCCCTGGTGGAGAGTTTACAGTGTCCCCTAGAAATGCTCCGGGTGAGATACTATGGAGCGCGCCCTTGGGCCCTGATCTGAACCCCTACCTTTCCCATTTGGCCAGAATGTACAATGGTTATGCAGGTGGTTTTGAAGTGCAGGTAATCCTCGCGGGGAACGCGTTCACCGCCGGGAAAATCATATTTGCAGCAGTCCCACCAAATTTTCCAACTGAAGGCTTGGGCCCCAGCCAGGTCACTATGTTCCCCCATATAATAGTAGATGTTAGGCAATTGGAACCTG [...]
+	'AY532119_126'                 ATGAAGATGGCGTCGAGTGACGCCAACCCATCTGATGGGTCCACAGCCAACCTCGTCCCAGAGGTCAACAATGAGGTTATGGCTTTGGAGCCCGTTGTTGGTGCCGCTATTGCGGCACCTGTAGCGGGCCAACAAAATGTAATTGACCCCTGGATTAGAAATAATTTTGTACAAGCCCCTGGTGGAGAGTTTACAGTATCCCCTAGAAACGCTCCGGGTGAGATACTATGGAGCGCGCCCTTGGGCCCTGATTTGAACCCCTACCTTTCTCATTTGGCCAGAATGTACAACGGTTATGCAGGTGGTTTTGAAGTGCAGGTAATCCTCGCGGGGAATGCGTTCACCGCCGGGAAAATCATATTTGCAGCAGTCCCACCAAATTTTCCAACTGAAGGCTTGAGCCCCAGCCAGGTTACTATGTTCCCCCACATAATAGTAGATGTTAGGCAACTGGAACCCG [...]
+	'AY532120_138'                 ATGAAGATGGCGTCGAATGACGCCAACCCATCTGATGGGTCCACAGCCAACCTCGTCCCAGAGGTCAACAATGAGGTTATGGCTTTGGAGCCCGTTGTTGGTGCCGCTATTGCGGCACCTGTAGCGGGCCAACAAAATATAATTGACCCCTGGATTAGAAATAATTTTGTACAAGCCCCTGGTGGAGAGTTTACAGTATCCCCTAGAAACGCTCCGGGTGAGATACTATGGAGCGCGCCCTTGGGCCCTGATTTGAACCCCTACCTTTCTCATTTGGCCAGAATGTACAATGGTTATGCAGGTGGTTTTGAAGTGCAGGTAATCCTCGCGGGGAACGCGTTCACCGCCGGGAAAATCATATTTGCAGCAGTCCCACCAAATTTTCCAACTGAAGGCTTGAGCCCCAGCCAGGTTACTATGTTCCCCCATATAATAGTAGATGTTAGGCAATTGGAACCTG [...]
+	'DQ975270_126'                 ATGAAGATGGCGTCGAATGACGCCAACCCATCTGATGGGTCCACAGCCAACCTCGTCCCAGAGGTCAACAATGAGGTTATGGCTTTGGAGCCCGTTGTTGGTGCCGCTATTGCGGCACCTGTGGCGGGCCAACAAAATGTAATTGACCCCTGGATTAGAAATAATTTTGTACAAGCCCCTGGTGGAGAGTTTACAGTGTCCCCTAGAAACGCTCCGGGTGAGATACTATGGAGCGCGCCTTTGGGCCCTGATTTGAACCCCTACCTTTCTCATTTGGCCAGAACGTACAATGGTTATGCAGGTGGTTTTGAAGTGCAGGTAATCCTCGCGGGGAACGCGTTCACCGCCGGGAAAATCATATTTGCAGCAGTCCCACCAAATTTTCCAACTGAAGGCTTGAGCCCCAGCCAGGTTACCATGTTCCCCCATATAATAGTAGATGTTAGGCAATTGGAACCCG [...]
+	'AY532121_138'                 ATGAAGATGGCGTCGAATGACGCCAACCCATCTGATGGGTCCACAGCCAACCTCGTCCCAGAGGTCAACAATGAGGTTATGGCTTTGGAGCCCGTTGTTGGTGCCGCTATTGCGGCACCTGTAGCGGGCCAACAAAATGTAATTGACCCCTGGATTAGAAATAATTTTGTACAAGCCCCTGGTGGAGAGTTTACAGTATCCCCTAGAAACGCTCCGGGTGAGATACTATGGAGCGCGCCCTTGGGCCCTGATTTGAACCCTTACCTTTCTCATTTGGCCAGAATGTACAATGGTTATGCAGGTGGCTTTGAAGTGCAGGTAATCCTCGCGGGGAACGCGTTCACCGCCGGGAAAGTCATATTTGCAGCAGTCCCACCAAATTTTCCAACTGAAGGCTTGAGCCCCAGCCAGGTTACTATGTTCCCCCATATAATAGTAGATGTTAGGCAACTGGAACCTG [...]
+	'AY532122_138'                 ATGAAGATGGCGTCGAATGACGCCAACCCATCTGATGGGTCCACAGCCAACCTCGTCCCAGAGGTCAACAATGAGGTTATGGCTTTGGAGCCCGTTGTTGGTGCCGCTATTGCGGCACCTGTAGCGGGCCAACAAAATGTAATTGACCCCTGGATTAGAAATAATTTTGTACAAGCCCCTGGTGGAGAGTTTACAGTATCCCCTAGAAACGCTCCGGGTGAGATACTATGGAGCGCGCCCTTGGGCCCTGATTTGAACCCTTACCTTTCTCATTTGGCCAGAATGTACAATGGTTATGCAGGTGGCTTTGAAGTGCAGGTAATCCTCGCGGGGAACGCGTTCACCGCCGGGAAAGTCATATTTGCAGCAGTCCCACCAAATTTTCCAACTGAAGGCTTGAGCCCCAGCCAGGTTACTATGTTCCCCCATATAATAGTAGATGTTAGGCAACTGGAACCTG [...]
+	'AY532123_126'                 ATGAAGATGGCGTCGAATGACGCCAACCCATCTGATGGGTCCACAGCCAACCTCGTCCCAGAGGTCAACAATGAGGTTATGGCTTTGGAGCCCGTTGTTGGTGCCGCTATTGCGGCACCTGTAGCGGGCCAACAAAATGTAATTGACCCCTGGATTAGAAATAATTTTGTACAAGCCCCTGGTGGAGAGTTTACAGTATCCCCTAGAAACGCTCCGGGTGAGATACTATGGAGCGCGCCCTTGGGCCCTGATTTGAACCCTTACCTTTCTCATTTGGCCAGAATGTACAATGGTTATGCAGGTGGCTTTGAAGTGCAGGTAATCCTCGCGGGGAACGCGTTCACCGCCGGGAAAGTCATATTTGCAGCAGTCCCACCAAATTTTCCAACTGAAGGCTTGAGCCCCAGCCAGGTTACTATGTTCCCCCATATAATAGTAGATGTTAGGCAACTGGAACCTG [...]
+	'EP2002006_84'                 ATGAAGATGGCGTCGAATGACGCCAACCCATCTGATGGGTCCGCAGCCAACCTCGTCCCAGAGGTCAACAATGAGGTTATGGCTCTGGAGCCCGTTGTTGGTGCCGCCATTGCGGCACCTGTAGCGGGCCAACAAAACATAATTGACCCCTGGATTAGAAATAATTTTGTACAAGCCCCTGGTGGAGAATTCACAGTGTCCCCTAGAAATGCTCCAGGTGAAATACTATGGAGCGCACCTTTGGGCCCTGATTTGAACCCCTACCTTTCTCATTTGTCTAGAATGTATAATGGTTATGCAGGTGGTTTTGAAGTGCAAGTGATCCTCGCGGGGAACGCGTTCACCGCCGGGAAGGTCATATTTGCAGCAGTCCCTCCAAACTTCCCAACTGAAGGTCTGAGCCCTAGCCAAGTTACTATGTTCCCCCACATAATTGTAGATGTTAGACAATTGGAACCTG [...]
+	'AY532124_138'                 ATGAAGATGGCGTCGAATGACGCCAACCCATCTGATGGGTCCACAGCCAACCTCGTCCCAGAGGTCAACAATGAGGTTATGGCTTTGGAGCCCGTTGTTGGTGCCGCTATTGCGGCGCCTGTAGCGGGCCAACAAAATGTAATTGACCCCTGGATTAGAAATAATTTTGTACAAGCCCCTGGTGGAGAGTTTACAGTATCCCCTAGAAACGCTCCGGGTGAGATACTATGGAGCGCGCCCTTGGGCCCTGATTTGAACCCTTACCTTTCTCATTTGGCCAGAATGTACAATGGTTATGCAGGTGGCTTTGAAGTGCAGGTAATCCTCGCGAGGAACGCGTTCACCGCCGGGAAAGTCATATTTGCAGCAGTCCCACCAAATTTTCCAACTGAAGGCTTGAGCCCCAGCCAGGTTACTATGTTCCCCCATATAATAGTAGATGTTAGGCAACTGGAACCTG [...]
+	'AY532125_126'                 ATGAAGATGGCGTCGAATGACGCCAACCCATCTGATGGGTCCACAGCCAACCTCGTCCCAGAGGTCAACAATGAGGTTATGGCTTTGGAGCCCGTTGTTGGTGCCGCTATTGCGGCACCTGTAGCGGGCCAACAAAATGTAATTGACCCCTGGATTAGAAATAATTTTGTACAAGCCCCTGGTGGAGAGTTTACAGTATCCCCTAGAAACGCTCCGGGTGAGATACTATGGAGCGCGCCCTTGGGCCCTGATTTGAACCCTTACCTTTCTCATTTGGCCAGAATGTACAATGGTTATGCAGGTGGCTTTGAAGTGCAGGTAATCCTCGCGGGGAACGCGTTCACCGCCGGGAAAGTCATATTTGCAGCAGTCCCACCAAATTTTCCAACTGAAGGCTTGAGCCCCAGCCAGGTTACTATGTTCCCCCATATAATAGTAGATGTTAGGCAACTGGAACCTG [...]
+	'AY532126_126'                 ATGAAGATGGCGTCGAATGACGCCAACCCATCTGATGGGTCCACAGCCAACCTCGTCCCAGAGGTCAACAATGAGGTTATGGCTTTGGAGCCCGTTGTTGGTGCCGCTATTGCGGCACCTGTAGCGGGCCAACAAAATGTAATTGACCCCTGGATTAGAAATAATTTTGTACAAGCCCCTGGTGGAGAGTTTACAGTGTCCCCTAGAAACGCTCCGGGTGAGATACTATGGAGCGCGCCCTTGGGCCCTGATTTGAACCCCTACCTTTCCCATTTGGCCAGAATGTACAATGGTTATGCAGGTGGTTTTGAAGTGCAGGTAATCCTCGCGGGGAACGCGTTCACCGCCGGAAAAATCATATTTGCAGCAGTCCCACCAAATTTTCCAACTGAAGGCTTGAGCCCCAGCCAGGTCACTATGTTCCCCCATATAATAGTAGATGTTAGGCAATTGGAACCTG [...]
+	'AY532127_138'                 ATGAAGATGGCGTCGAATGACGCCAACCCATCTGATGGGTCCACAGCCAACCTCGTCCCAGAGGTCAACAATGAGGTTATGGCTTTGGAGCCCGTTGTTGGTGCCGCTATTGCGGCACCTGTAGCGGGCCAACAAAATGTAATTGACCCCTGGATTAGAAACAATTTTGTACAAGCCCCTGGTGGAGAGTTTACAGTATCCCCTAGAAACGCTCCGGGTGAGATACTATGGAGCGCGCCCTTGGGCCCTGATTTGAACCCCTACCTTTCTCATTTGGCCAGAATGTACAATGGTTATGCAGGTGGTTTTGAAGTGCAGGTAATCCTCGCGGGGAACGCGTTCACCGCCGGGAAAATCATATTTGCAGCAGTCCCACCAAATTTTCCAACTGAGGGCTTGAGCCCCAGCCAGGTTACTATGTTCCCCCATATAATAGTAGATGTTAGGCAATTGGAACCTG [...]
+	'AY532128_138'                 ATGAAGATGGCGTCGAATGACGCCAACCCATCTGATGGGTCCACAGCCAACCTCGTCCCAGAGGTCAACAATGAGGTTATGGCTTTGGAGCCCGTTGTTGGTGCCGCTATTGCGGCACCTGTAGCGGGCCAACAAAATATAATTGACCCCTGGATTAGAAATAATTTTGTACAAGCCCCTGGTGGAGAGTTTACAGTATCCCCTAGAAACGCTCCGGGTGAGATACTATGGAGCGCGCCCTTGGGCCCTGATTTGAACCCCTACCTTTCTCATTTGGCCAGAATGTACAATGGTTATGCAGGTGGTTTTGAAGTGCAGGTAATCCTCGCGGGGAACGCGTTCACCGCCGGGAAAATCATATTTGCAGCAGTCCCACCAAATTTTCCAACTGAAGGCTTGAGCCCCAGCCAGGTTACTATGTTCCCCCATATAATAGTAGATGTTAGGCAATTGGAACCTG [...]
+	'AY532129_126'                 ATGAAGATGGCGTCGAATGACGCCAACCCATCTGATGGGTCCACAGCCAACCTCGTCCCAGAGGTCAACAATGAGGTTATGGCTTTGGAGCCCGTTGTTGGTGCCGCTATTGCGGCACCTGTAGCGGGCCAACAAAATGTAATTGACCCCTGGATTAGAAATAATTTTGTACAAGCCCATGGTGGAGAGTTTACAGTATCCCCTAGAAACGCTCCGGGTGAGATACTATGGAGCGCGCCCTTAGGCCCTGATTTGAACCCCTACCTTTCTCATTTGGCCAGAATGTACAATGGTTATGCAGGTGGTTTTGAAGTGCAGGTAATCCTCGCGGGGAACGCGTTCACCGCCGGGAAAATCATATTTGCAGCAGTCCCACCAAATTTTCCAACTGAAGGCTTGAGCCCCAGCCAGGTTACTATGTTTCCCCATATAATAGTAGATGTTAGGCAATTGGAACCTG [...]
+	'AY532130_138'                 ATGAAGATGGCGTCGAATGACGCCAACCCATCTGATGGGTCCACAGCCAACCTCGTCCCAGAGGTCAACAATGAGGTTATGGCTTTGGAGCCCGTTGTTGGTGCCGCTATTGCGGCACCTGTAGCGGGCCAACAAAATATAATTGACCCCTGGATTAGAAATAATTTTGTACAAGCCCCTGGTGGAGAGTTTACAGTATCCCCTAGAAACGCTCCGGGTGAGATACTATGGAGCGCGCCCTTGGGCCCTGATTTGAACCCCTACCTTTCTCATCTGGCCAGAATGTACAATGGTTATGCAGGTGGTTTTGAAGTGCAGGTAATCCTCGCGGGGAACGCGTCCACCGCCGGGAAAATCATATTTGCAGCAGTCCCACCAAATTTTCCAACTGAAGGCTTGAGCCCCAGCCAGGTTACTATGTTCCCCCATATAATAGTAGATGTTAGGCAATTGGAACCCG [...]
+	'AY532131_138'                 ATGAAGATGGCGTCGAATGACGCCAACCCATCTGATGGGTCCACAGCCAACCTCGTCCCAGAGGTCAACAATGAGGTTATGGCTTTGGAGCCCGTTGTTGGTGCCGCTATTGCGGCACCTGTAGCGGGCCAACAAAATATAATTGACCCCTGGATTAGAAATAATTTTGTACAAGCCCCTGGTGGAGAGTTTACAGTATCCCCTAGAAACGCTCCGGGTGAGATACTATGGAGCGCGCCCTTGGGCCCTGATTTGAACCCCTACCTTTCTCATTTGGCCAGAGTGTACAATGGTTATGCAGGTGGTTTTGAAGTGCAGGTAATCCTCGCGGGGAACGCGTTCACCGCCGGGAAAATCATATTTGCAGCAGTCCCACCAAATTTTCCAACTGAAGGCTTGAGCCCCAGCCAGGTTACTATGTTCCCCCATATAATAGTAGATGTTAGGCAATTGGAACCTG [...]
+	'AY532132_138'                 ATGAAGATGGCGTCGAATGACGCCAACCCATCTGATGGGTCCACAGCCAACCTCGTCCCAGAGGTCAACAATGAGGTTATGGCTTTGGAGCCCGTTGTTGGTGCCGCTATTGCGGCACCTGTAGCGGGCCAACAAAATGTAATTGACCCCTGGATTAGAAATAATTTTGTACAAGCCCCTGGTGGAGAGTTTACAGTATCCCCTAGAAACGCTCCGGGTGAGATACTATGGAGCGCGCCCTTGGGCCCTGATTTGAACCCCTACCTTTCTCATCTGGCCAGAATGTACAACGGTTATGCAGGTGGTTTTGAAGTGCAGGTAATCCTCGCGGGGAACGCGTTCACCGCCGGGAAAATCATATTTGCAGCAGTCCCACCAAATTTTCCAACTGAAGGCTTGAGCCCTAGCCAGGTTACTATGTTCCCCCACATAATAGTAGATGTTAGGCAATTGGAACCCG [...]
+	'AY532133_138'                 ATGAAGATGGCGTCGAATGACGCCAACCCATCTGATGGGTCCACAGCCAACCTCGTCCCAGAGGTCAACAATGAGGTTATGGCTTTGGAGCCCGTTGTTGGTGCCGCTATTGCGGCACCTGTAGCGGGCCAACAAAATGTAATTGACCCCTGGATTAGAAATAATTTTGTACAAGCCCCTGGTGGAGAGTTTACAGTATCCCCTAGAAACGCTCCGGGTGAGATACTATGGAGCGCGCCCTTGAGCCCTGATTTGAACCCCTACCTTTCTCATCTGGCCAGAATGTACAACGGTTATGCAGGTGGTTTTGAAGTGCAGGTAATCCTCGCGGGGAACGCGTTCACCGCCGGGAAAATCATATTTGCAGCAGTCCCACCAAATTTTCCAACTGAAGGCTTGAGCCCTAGCCAGGTTACTATGTTCCCCCACATAATAGTAGATGTTAGGCAATTGGAACCCG [...]
+	'AY532134_138'                 ATGAAGATGGCGTCGAATGACGCCAACCCATCTGATGGGTCCACAGCCAACCTCGTCCCAGAGGTCAACAATGAGGTTATGGCTTTGGAGCCCGTTGTTGGTGCCGCTATTGCGGCACCTGTAGCGGGCCAACAAAATATAATTGACCCCTGGATTAGAAATAATTTTGTACAAGCCCCTGGTGGAGAGTTTACAGTATCCCCTAGAAACGCTCCGGGTGAGATACTATGGAGCGCGCCCTTGGGCCCTGATTTGAACCCCTACCTTTCTCATTTGGCCAGAATGTACAATGGTTATGCAGGTGGTTTTGAAGTGCAGGTAATCCTCGCGGGGAACGCGTTCACCGCCGGGAAAATCATATTTGCAGCAGTCCCACCAAATTTTCCAACTGAAGGCTTGAGCCCCAGCCAGGTTACTATGTTCCCCCATATAATAGTAGATGTTAGGCAATTGGAACCTG [...]
+	'AY532135_126'                 ATGAAGATGGCGTCGAATGACGCCAACCCACCTGATGGGTCCACAGCCAACCTCGTCCCAGAGGTCAACAATGAGGTTATGGCTTTGGAGCCCGTTGTTGGTGCCGCTATTGCGGCACCTGTAGCGGGCCAACAAAATATAATTGACCCCTGGATTAGAAATAATTTTGTACAAGCCCCTGGTGGAGAGTTTACAGTATCCCCTAGAAACGCTCCGGGTGAGATACTATGGAGCGCGCCCTTGGGCCCTGATTTGAACCCCTACCTTTCTCATTTGGCCAGAATGTACAATGGTTATGCAGGTGGTTTTGAAGTGCAGGTAATCCTCGCGGGGAACGCGTTCACCGCCGGGAAAATCATATTTGCAGCAGTCCCACCAAATTTTCCAACTGAAGGCTTGAGCCCCAGCCAGGTTACTATGTTCCCCCATATAATAGTAGATGTTAGGCAATTGGAACCTG [...]
+	'U46500_CAMBERWELL_174'        ATGAAGATGGCGTCGAGTGACGCCAACCCATCTGATGGGTCCGCAGCCAACCTCGTCCCAGAGGTCAACAATGAGGTTATGGCTCTGGAGCCCGTTGTTGGTGCCGCTATTGCGGCACCTGTAGCGGGCCAACAAAATATAATTGACCCCTGGATTAGAAATAATTTTGTACAAGCCCCTGGTGGAGAGTTTACAGTGTCCCCTAGAAACGCTCCAGGTGAGATACTATGGAGCGCGCCCTTGGGCCCTGATTTGAATCCCTATCTTTCTCACTTGTCCAGAATGTATAATGGTTATGCAGGTGGTTTTGAAGTGCAAGTGATCCTTGCGGGGAACGCGTTCACCGCCGGGAAAGTTATATTTGCAGCAGTTCCACCAAACTTTCCAACTGAAGGCTTAAGCCCCAGCCAGGTTACTATGTTCCCCCATATAATTGTAGATGTTAGACAACTGGAACCTG [...]
+	'AF080549_156'                 ATGAAGATGGCGTCGAATGACGCCAACCCATCTGATGGGTCCACAGCCAACCTCGTCCCAGAGGTCAACAATGAGGTTATGGCTTTGGAGCCCGTTGTTGGTGCCGCTATTGCGGCACCTGTAGCGGGCCAACAAAATGTAATTGACCCCTGGATTAGAAATAATTTTGTACAAGCCCCTGGTGGAGAGTTTACAGTATCCCCTAGAAACGCTCCGGGTGAGATACTATGGAGCGCGCCCTTAGGCCCTGATTTGAACCCCTACCTTTCTCATTTGGCCAGAATGTACAATGGTTATGCAGGTGGTTTTGAAGTGCAGGTAATCCTCGCGGGGAACGCGTTCACCGCCGGGAAAATCATATTTGCAGCAGTCCCACCAAATTTTCCAACTGAAGGCTTGAGCCCCAGCCAGGTTACTATGTTCCCCCATATAATAGTAGATGTTAGGCAATTGGAACCTG [...]
+	'AF080550_156'                 ATGAAGATGGCGTCGAATGACGCCAACCCATCTGATGGGTCCACAGCCAACCTCGTCCCAGAGGTCAACAATGAGGTTATGGCTTTGGAGCCCGTTGTCGGTGCCGCTATTGCGGCACCTGTAGCGGGCCAACAAAATGTAATTGACCCCTGGATTAGAAATAATTTTGTACAAGCCCCTGGTGGAGAGTTTACAGTATCCCCTAGAAACGCTCCGGGTGAGATACTATGGAGCGCGCCCTTGGGCCCTGATTTGAACCCCTACCTTTCTCATTTGGCCAGAATGTACAATGGTTATGCAGGTGGTTTTGAAGTGCAGGTAATCCTCGCGGGGAACGCGTTCACCGCCGGGAAAATCATATTTGCAGCAGTCCCACCAAATTTTCCAACTGAAGGCTTGAGCCCCAGCCAGGTTACTATGTTCCCCCATATAATAGTAGACGTTAGGCAATTGGAACCTG [...]
+	'AF080551_161'                 ATGAAGATGGCGTCGAATGACGCCAACCCATCTGATGGGTCCACAGCCAACCTCGTCCCAGAGGTCAACAATGAGGTTATGGCTTTGGAGCCCGTTGTTGGTGCCGCTATTGCGGCACCTGTAGCGGGCCAACAAAATGTAATTGACCCCTGGATTAGAAATAATTTTGTACAAGCCCCTGGTGGAGAGTTTACAGTATCCCCTAGAAACGCTCCGGGTGAGATACTATGGAGCGCGCCCTTGGGCCCTGATTTGAACCCTTACCTTTCTCATTTGGCCAGAATGTACAATGGTTATGCAGGTGGTTTTGAAGTGCAGGTAATCCTCGCGGGGAACGCGTTCACCGCCGGGAAAATCATATTTGCAGCAGTCCCACCAAATTTTCCAACTGAAGGCTTGAGCCCCAGCCAGGTTACTATGTTCCCCCATATAATAGTAGATGTTAGGCAATTGGAACCTG [...]
+	'AF080552_154'                 ATGAAGATGGCGTCGAATGACGCCAACCCATCTGATGGGTCCACAGCCAACCTCGTCCCAGAGGTCAACAATGAGGTTATGGCTTTGGAGCCCGTTGTTGGTGCCGCTATTGCGGCACCTGTAGCGGGCCAACAAAATGTAATTGACCCCTGGATTAGAAATAATTTTGTACAAGCCCCTGGTGGAGAGTTTACAGTATCCCCTAGAAACGCTCCGGGTGAGATACTATGGAGCGCGCCCTTAGGCCCTGATTTGAACCCCTACCTTTCTCATTTGGCCAGAATGTACAATGGTTATGCAGGTGGTTTTGAAGTGCAGGTAATCCTCGCGGGGAACGCGTTCACCGCCGGGAAAATCATATTTGCAGCAGTCCCACCAAATTTTCCAACTGAAGGCTTGAGCCCCAGCCAGGTTACTATGTTCCCCCATATAATAGTAGATGTTAGGCAATTGGAACCTG [...]
+	'AY030098_254'                 ATGAAGATGGCGTCGAGTGACGCCAACCCATCTGATGGGTCCACAGCCAACCTCGTTCCAGAGGTCAACAATGAGGTTATGGCTCTGGAGCCCGTTGTTGGTGCCGCTATTGCGGCACCTGTAGCGGGCCAACAAAATATAATTGACCCCTGGATTAGAAACAATTTTGTACAAGCCCCTGGTGGAGAGTTTACAGTGTCCCCTAGAAACGCTCCAGGCGAGATACTATGGAGCGCGCCCTTGGGCCCTGACTTGAACCCCTATCTTTCCCATTTGTCCAGAATGTACAATGGTTATGCAGGTGGTTTTGAAGTGCAAGTAATCCTCGCGGGGAACGCGTTCACCGCCGGGAAGGTTATATTTGCAGCAGTCCCACCAAACTTTCCAACTGAAGGCTTAAGCCCCAGCCAGGTTACCATGTTCCCCCATATAATTGTAGATGTTAGGCAATTGGAACCTG [...]
+	'AY032605_254'                 ATGAAGATGGCGTCGAGTGACGCCAACCCATCTGATGGGTCCGCAGCCAACCTCGTCCCAGAGGTCAACAATGAGGTTATGGCTCTGGAGCCCGTTGTTGGTGCCGCTATTGCGGCACCTGTAGCGGGCCAACAAAATATAATTGACCCCTGGATTAGAAATAATTTTGTACAAGCCCCTGGTGGAGAGTTTACAGTGTCCCCTAGAAACGCTCCAGGTGAGATACTATGGAGCGCGCCCTTGGGCCCTGATTTGAACCCCTATCTTTCTCATTTGTCCAGAATGTACAATGGTTATGCAGGCGGTTTCGAAGTGCAAGTAATCCTCGCGGGGAACGCGTTCACCGCCGGGAAAGTTATATTTGCAGCAGTTCCACCAAACTTTCCAACTGAAGGCTTAAGCCCCAGCCAGGTTACTATGTTCCCCCATATAATTGTAGATGTTAGGCAATTGGAACCTG [...]
+	'AY038600_126'                 ATGAAGATGGCGTCGAATGACGCCAGCCCATCTGATGGGTCCACAGCCAACCTCGTCCCAGAGGTCAACAATGAGGTTATGGCTTTGGAGCCCGTTGTTGGTGCCGCTATTGCGGCACCTGTGGCGGGCCAACAAAACGTAATTGACCCCTGGATTAGGAATAATTTTGTACAAGCCCCTGGTGGAGAGTTTACAGTATCCCCTAGAAACGCTCCAGGTGAGATACTATGGAGCGCGCCCTTGGGCCCTGATTTGAACCCCTACCTTTCTCATTTGGCCAGAATGTACAATGGTTATGCAGGTGGTTTTGAAGTGCAGGTAATCCTCGCGGGGAACGCGTTCACCGCCGGGAAAGTCATATTTGCAGCAGTCCCACCAAATTTTCCAACTGAAGGCTTGAGCCCCAGCCAGGTTACTATGTTCCCCCATATAATAGTAGATGTTAGGCAATTGGAACCTG [...]
+	'AY081134_138'                 ATGAAGATGGCGTCGAATGACGCCAACCCATCTGATGGGTCCACAGCCAACCTCGTCCCAGAGGTCAACAATGAGGTTATGGCTTTGGAGCCCGTTGTTGGTGCCGCTATTGCGGCACCTGTAGCGGGCCAACAAAATGTAATTGACCCCTGGATTAGAAATAATTTTGTACAAGCCCCTGGTGGAGAGTTTACAGTGTCCCCTAGAAACGCTCCGGGTGAGATACTATGGAGCGCGCCCTTGGGCCCTGATTTGAACCCCTACCTTTCCCATTTGGCCAGAATGTACAATGGTTATGCAGGTGGTTTTGAAGTGCAGGTAATCCTCGCGGGGAACGCGTTCACCGCCGGGAAAATCATATTTGCAGCAGTCCCACCAAATTTTCCAACTGAAGGCTTGAGCCCCAGCCAGGTTACTATGTTCCCCCATATAATAGTAGATGTTAGGCAATTGGAACCTG [...]
+	'AF080553_154'                 ATGAAGATGGCGTCGAATGACGCCAACCCATCTGATGGGTCCACAGCCAACCTCGTCCCAGAGGTCAACAATGAGGTTATGGCTTTGGAGCCCGTTGTTGGTGCCGCTATTGCGGCACCTGTAGCGGGCCAACAAAATGTAATTGACCCCTGGATTAGAAATAATTTTGTACAAGCCCCTGGTGGAGAGTTTACAGTATCCCCTAGAAACGCTCCGGGTGAGATACTATGGAGCGCGCCCTTAGGCCCTGATTTGAACCCCTACCTTTCTCATTTGGCCAGAATGTACAATGGTTATGCAGGTGGTTTTGAAGTGCAGGTAATCCTCGCGGGGAACGCGTTCACCGCCGGGAAAATCATATTTGCAGCAGTCCCACCAAATTTTCCAACTGAAGGCTTGAGCCCCAGCCAGGTTACTATGTTCCCCCATATAATAGTAGATGTTAGGCAATTGGAACCTG [...]
+	'AF080554_154'                 ATGAAGATGGCGTCGAATGACGCCAACCCATCTGATGGGTCCACAGCCAACCTCGTCCCAGAGGTCAACAATGAGGTTATGGCTTTGGAGCCCGTTGTTGGTGCCGCTATTGCGGCACCTGTAGCGGGCCAACAAAATGTAATTGACCCCTGGATTAGAAATAATTTTGTGCAAGCCCCTGGTGGAGAGTTTACAGTATCCCCTAGAAACGCTCCGGGTGAGATACTATGGAGCGCGCCCTTAGGCCCTGATTTGAACCCCTACCTTTCTCATTTGGCCAGAATGTACAATGGTTATGCAGGTGGTTTTGAAGTGCAAGTAATCCTCGCGGGGAACGCGTTCACCGCCGGGAAAATCATATTTGCAGCAGTCCCACCAAATTTTCCAACTGAAGGCTTGAGCCCCAGCCAGGTTACTATGTTCCCCCATATAATAGTAGATGTTAGGCAATTGGAACCTG [...]
+	'AF427120_102'                 ATGAAGATGGCGTCGAATGACGCCAACCCATCTGATGGGTCCACAGCCAACCTCGTCCCAGAGGTCAACAATGAGGTTATGGCTTTGGAGCCCGTTGTTGGTGCCGCTATTGCGGCACCTGTGGCGGGCCAACAAAATGTAATTGACCCCTGGATTAGAAATAATTTTGTACAAGCCCCTGGTGGAGAGTTCACAGTATCCCCTAGAAACGCTCCGGGTGAGATATTATGGAGCGCGCCCTTGGGCCCTGATTTAAACCCCTACCTTTCTCATTTGGCCAGAATGTACAATGGTTATGCAGGTGGTTTTGAAGTGCAGGTAATCCTCGCGGGGAACGCGTTCACCGCCGGGAAAATCATATTTGCAGCAGTCCCACCAAATTTTCCAACTGAAGGCTTGAGCCCCAGCCAGGTCACTATGTTTCCCCATATAATAGTGGATGTTAGGCAATTGGAACCTG [...]
+	'AF427121_102'                 ATGAAGATGGCGTCGAATGACGCCAACCCATCTGATGGGTCCACAGCCAACCTCGTCCCAGAGGTCAACAATGAGGTTATGACTTTGGAGCCCGTTGTTGGTGCCGCTATTGCGGCACCTGTAGCGGGCCAACAAAATGTAATTGACCCCTGGATTGGAAATAATATTGTACAAGCCCCTGGTGGAGAGTTTACAGTATCCCCTAGAAACGCTCCGGGTGAGATACTATGGAGCGCGCCCTTGGGCCCTGATTTGAACCCCTACCTTTCTCATTTGGCCAGAATGTACAATGGTTATGCAGGTGGTTTTGAAGTGCAAGTGATCCTCGCGGGGAACGCGTTCACCGCCGGGAAAATCATATTTGCAGCAGTCCCACCAAATTTTCCAACTGAAGGCTTGAGCCCCAGCCAGGTTACTGTGTTCCCCCATATAATAGTAGATGTTAGGCAATTAGAGCCTG [...]
+	'AF427122_102'                 ATGAAGATGGCGTCGAATGACGCCAACCCATCTGATGGGTCCACAGCCAACCTCGTCCCAGAGGTCAACAATGAGGTTATGGCTTTGGAGCCCGTTGTTGGTGCCGCTATTGCGGCACCTGTAGCGGGCCAACAAAATGTAATTGACCCCTGGATTAGAAATAATTTTGTACAAGCCCCTGGTGGAGAGTTTACAGTATCCCCTAGAAACGCTCCGGGTGAGATACTATGGAGCGCGCCCTTGGGCCCTGATTTGAACCCCTACCTTTCTCATTTGGCCAGAATGTACAATGGTTATGCAGGTGGTTTTGAAGTGCAGGTAATCCTCGCGGGGAACGCGTTCACCGCCGGGAAAATCATATTTGCAGCAGTCCCACCAAATTTTCCAACTGAAGGCTTGAGCCCCAGCCAGGTTACTATGTTCCCCCATATAATAGTAGATGTTAGGCAATTGGAACCTG [...]
+	'AF427123_102'                 ATGAAGATGGCGTCGAATGACGCCAACCCATCTGATGGGTCCACAGCCAACCTCGTCCCAGAGGTCAACAATGAGGTTATGGCTTTGGAGCCCGTTGTTGGTGCCGCTATTGCGGCACCTGTAGCGGGCCAACAAAATGTAATTGACCCCTGGATTAGAAATAATTTTGTACAAGCCCCTGGTGGAGAGTTTACAGTATCCCCTAGAAACGCTCCGGGTGAGATACTATGGAGCGCGCCCTTGGGCCCTGATTTGAACCCCTACCTTTCTCATTTGGCCAGAATGTACAATGGTTATGCAGGTGGTTTTGAAGTGCAGGTAATCCTCGCGGGGAACGCGTTCACCGCCGGGAAAATCATATTTGCAGCAGTCCCACCAAATTTTCCAACTGAAGGCTTGAGCCCCAGCCAGGTTACTATGTTCCCCCATATAATAGTAGATGTTAGGCAATTGGAACCTG [...]
+	'AF472623_155'                 ATGAAGATGGCGTCGAATGACGCCAACCCATCTGATGGGTCCACAGCCAACCTCGTCCCAGAGGTCAACAATGAGGTTATGGCTTTGGAGCCCGTTGTTGGTGCCGCTATTGCGGCACCTGTAGCGGGCCAACAAAATATAATTGACCCCTGGATTAGAAATAATTTTGTACAAGCCCCTGGTGGAGAGTTTACAGTATCCCCTAGAAACGCTCCGGGTGAGATACTATGGAGCGCGCCCTTGGGCCCTGATTTGAACCCCTACCTTTCTCATTTGGCCAGAATGTACAATGGTTATGCAGGTGGTTTTGAAGTGCAGGTAATCCTCGCGGGGAACGCGTTCACCGCCGGGAAAATCATATTTGCAGCAGTCCCACCAAATTTTCCAACTGAAGGCTTGAGCCCCAGCCAGGTTACTATGTTCCCCCATATAATAGTAGATGTTAGGCAATTGGAACCTG [...]
+	'AJ277619_162'                 ATGAAGATGGCGTCGAATGACGCCAACCCATCTGATGGGTCCACAGCCAACCTCGTCCCAGAGGTCAACAATGAGGTTATGGCTTTGGAGCCCGTTGTTGGTGCCGCTATCGCGGCACCTGTAGCGGGCCAACAAAATGTAATTGACCCCTGGATTAGAAGTAATTTTGTACAAGCCCCTGGTGGAGAGTTTACAGTATCCCCTAGAAACGCTCCAGGTGAGATACTATGGAGCGCGCCCTTGGGCCCTGATTTGAACCCCTACCTTTCTCATTTGGCCAGAATGTACAATGGTTATGCAGGTGGTCTTGAAGTGCAGGTAGTCCTCGCGGGAAACGCGTTCACCGCCGGGAAAATCATATTTGCAGCAGTCCCACCAAATTTTCCAACTGAAGGCTTGAGCCCCAGCCAGGTCACTATGTTCCCCCATATAATAGTAGATGTTAGGCAATTGGAACCTG [...]
+	'AF080555_154'                 ATGAAGATGGCGTCGAATGACGCCAACCCATCTGATGGGTCAACAGCCAACCTCGTCCCAGAGGTCAACAATGAGGTTATGGCTTTGGAGCCCGTTGTTGGTGCCGCTATTGCGGCACCTGTAGCGGGCCAACAAAATGTAATTGACCCCTGGATTAGAAATAATTTTGTACAAGCCCCTGGTGGAGAGTTTACAGTATCCCCTAGAAACGCTCCGGGTGAGATACTATGGAGCGCGCCCTTAGGCCCTGATTTGAACCCCTACCTTTCTCATTTGGCCAGAATGTACAATGGTTATGCAGGTGGTTTTGAAGTGCAGGTAATCCTCGCGGGGAACGCGTTCACCGCCGGGAAAATCATATTTGCAGCAGTCCCACCAAATTTTCCAACTGAAGGCTTGAGCCCCAGCCAGGTTACTATGTTCCCCCATATAATAGTAGATGTTAGGCAATTGGAACCTG [...]
+	'AF080556_153'                 ATGAAGATGGCGTCGAATGACGCCAACCCATCTGATGGGTCCACAGCCAACCTCGTCCCAGAGGTCAACAATGAGGTTATGGCTTTGGAGCCCGTTGTTGGTGCCGCTATTGCGGCACCTGTAGCGGGCCAACAAAATGTAATTGACCCCTGGATTAGAAATAATTTTGTACAAGCCCCTGGTGGAGAGTTTACAGTATCCCCTAGAAACGCTCCGGGTGAGATACTATGGAGCGCGCCCTTAGGCCCTGATTTGAACCCCTACCTTTCTCATTTGGCCAGAATGTACAATGGTTATGCAGGTGGTTTTGAAGTGCAGGTAATCCTCGCGGGGAACGCGTTCACCGCCGGGAAAATCATATTTGCAGCAGTCCCACCAAATTTTCCAACTGAAGGCTTGAGCCCCAGCCAGGTTACTATGTTCCCCCATATAATAGTAGATGTTAGGCAATTGGAACCTG [...]
+	'AF080557_152'                 ATGAAGATGGCGTCGAATGACGCCAACCCATCTGATGGGTCCACAGCCAACCTCGTCCCAGAGGTCAACAATGAGGTTATGGCTTTGGAGCCCGTTGTTGGTGCCGCTATTGCGGCACCTGTAGCGGGCCAACAAAATGTAATTGACCCCTGGATTAGAAATAATTTTGTACAAGCCCCTGGTGGAGAGTTTACAGTGTCCCCTAGAAACGCTCCGGGTGAGATACTATGGAGCGCGCCCTTAGGCCCTGACTTGAACCCCTACCTTTCTCATTTGGCCAGAATGTACAATGGTTATGCAGGTGGTTTTGAAGTGCAGGTAATCCTCGCGGGGAACGCGTTCACCGCCGGGAAAATCATATTTGCAGCAGTCCCACCAAATTTTCCAACTGAAGGCTTGAGCCCCAGCCAGGTTACTATGTTCCCCCATATAATAGTAGATGTTAGGCAATTGGAACCTG [...]
+	'AF080558_146'                 ATGAAGATGGCGTCGAATGACGCCAACCCATCTGATGGGTCCACAGCCAACCTCGTCCCAGAGGTCAACAATGAGGTTATGGCTTTGGAGCCCGTTGTTGGTGCCGCCATTGCGGCACCTGTAGCGGGCCAACAAAATGTAATTGACCCCTGGATTAGAAATAATTTTGTACAAGCCCCTGGTGGAGAGTTTACAGTGTCCCCTAGGAACGCTCCGGGTGAGATACTATGGAGCGCGCCCTTGGGCCCTGATTTGAACCCCTACCTTTCTCACTTGGCCAGAATGTATAATGGTTATGCAGGTGGTTTTGAAGTGCAGGTAATCCTCGCGGGGAACGCGTTCACCGCCGGGAAAATCATATTTGCAGCAGTCCCACCAAACTTTCCAACTGAAGGCTTGAGCCCCAGCCAGGTTACTATGTTCCCACATATAATAGTAGATGTTAGGCAATTGGAACCTG [...]
+	'AF080559_145'                 ATGAAGATGGCGTCGAATGACGCCAACCCATCTGATGGGTCCACAGCCAACCTCGTCCCAGAAGTCAACAATGAGGTTATGGCTTTGGAGCCCGTTGTTGGTGCCGCTATTGCGGCACCTGTAGCGGGCCAACAAAATGTAATTGACCCCTGGATTAGAAATAATTTTGTACAAGCCCCTGGTGGAGAGTTTACAGTGTCCCCTAGAAACGCTCCGGGTGAAATACTATGGAGCGCGCCCTTGGGCCCTGATTTGAACCCCTACCTTTCCCATTTGGCCAGAATGTACAATGGTTATGCAGGTGGTTTTGAAGTGCAGGTAATCCTCGCGGGGAACGCGTTCACCGCCGGGAAAATCATATTTGCAGCAGTCCCACCAAATTTTCCAACTGAAGGCTTGAGCCCCAGCCAGGTTACTATGTTCCCCCATATAATAGTAGATGTTAGGCAATTGGAACCTG [...]
+	'AF414417_198'                 ATGAAGATGGCGTCGAATGACGCCAACCCATCTGATGGGTCCGCAGCCAACCTCGTTCCAGAGGTCAATAATGAGGTTATGGCTCTGGAGCCCGTTGTTGATGCCGCTATTGCGGCACCTGTGGCGGGCCAACAAAACGTAATTGACCCCTGGATTAGAAACAATTTTGTACAAGCCCCTGGTGGAGAGTTCACAGTGTCCCCTAGAAACGCTCCAGGTGAGATACTGTGGAGCGCGCCCTTGGGCCCTGATCCGAACCCCTATCTTTCTCATTTGTCCAGAATGTACAATGGTTATGCAGGTGGTTTTGAAGTGCAAGTAATCCTCGCGGGGAACGCGTTCACCGCCGGGAAAGTCATATTTGCAGCAGTCCCACCAAACTTTCCTACTGAAGGCTTAAGCCCCAGCCAGGTTACTATGTTCCCCCACATAATTGTAGATGTTAGACAATTGGAACCTA [...]
+	'AF414424_162'                 ATGAAGATGGCGTCGAATGACGCCAACCCATCTGATGGGTCCACAGCCAACCTCGTCCCAGAGGTCAACAATGAGGTTATGGCTTTGGAGCCCGTTGTTGGTGCCGCTATTGCGGCACCTGTAGCGGGCCAACAAAATGTAATTGACCCCTGGATTAGAAATAATTTTGTACAAGCCCCTGGTGGAGAGTTTACAGTATCCCCTAGAAACGCTCCGGGCGAGATACTATGGAGCGCGCCCTTGGGCCCTGATTTGAACCCCTACCTTTCTCATTTGGCCAGAATGTACAATGGTTATGCAGGTGGTTTTGAAGTGCAGGTAATCCTCGCGGGGAACGCGTTCACCGCCGGGAAAATCATATTTGCAGCAGTCCCACCAAACTTTCCAACTGAAGGCTTGAGCCCCAGCCAGGTCACTATGTTCCCCCATATAATAGTAGATGTTGGGCAATTGGAACCTG [...]
+	'AF414425_BURWASHLANDING_162'  ATGAAGATGGCGTCGAATGACGCCAACCCATCTGATGGGTCCACAGCCAACCTCGTCCCAGAGGTCAACAATGAGGTTATGGCTTTGGAGCCCGTTGTTGGTGCCGCTATTGCGGCACCTGTAGCGGGCCAACAAAATGTAATTGACCCCTGGATTAGAAATAATTTTGTACAAGCCCCTGGTGGAGAGTTTACAGCATCCCCTAGAAACGCTCCGGGTGAGATACTATGGAGCGCGCCCTTGGGCCCTGATTTGAACCCCTACCTTTCTCATTTGGCCAGAATGTACAATGGTTATGCAGGTGGTTTTGAAGTGCAGGTAATCCTCGCGGGGAACGCGTTCACCGCCGGGAAAATCATATTTGCAGCAGTCCCACCAAATTTTCCAACTGAAGGCTTGAGCCCCAGCCAGGTTACTATGTTCCCCCATATAATAGTAGATGTTAGGCAATTGGAACCTG [...]
+	'AF425763_126'                 ATGAAGATGGCGTCGAATGACGCCAACCCATCTGATGGGTCCACAGCCAACCTCGTCCCAGAGGTCAACAATGAGGTTATGGCTTTGGAGCCCGTTGTTGGTGCCGCTATTGCGGCACCTGTAGCGGGCCAACAAAATGTAATTGACCCCTGGATTAGAAATAATTTTGTACAAGCCCCTCGTGGAGAGTTTACAGTATCCCCTAGAAACGCTCCGGGTGAGATACTATGGAGCGCGCCCTTGGGCCCTGATTTGAACCCCTACCTTTCTCATTTGGCCAGAATGTACAATGGCTATGCAGGTGGTTTTGAAGTGCAGGTAATTCTCGCGGGGAACGCGTTCACCGCCGGGAAAATCATATTTGCAGCAGTCCCACCAAATTTTCCAACTGAAGGCTTGAGCCCCAGCCAGGTTACTATGTTCCCCCATATAATAGTAGATGTTAGGCAATTGGAACCTG [...]
+	'AF425764_126'                 ATGAAGATGGCGTCGAATGACGCCAACCCATCTGATGGGTCCACAGCCAACCTCGTCCCAGAGGTCAACAATGAGGTTATGGCTTTGGAGCCCGTCGTTGGTGCCGCTATTGCGGCACCTGTAGCGGGCCAACAAAATGTAATTGACCCCTGGATTAGAAATAATTTTGTACAAGCCCCTGGTGGAGGGTTTACAGTATCCCCTAGAAACGCTCCGGGTGAGATACTATGGAGCGCGCCCTTGGGCCCTGATTTGAACCCCTACCTTTCTCATTTGGCCAGAATGTATAATGGCTATGCAGGTGGTTTTGAAGTGCAGGTAATTCTCGCGGGGAGCGCGTCCACCGCCGGGAAAATCATATTTGCAGCAGTCCCACCAAATTTTCCAACTGAAGGCTTGAGCCCCAGCCAGGTCACTATGTTCCCCCATATAATAGTAGATGTTAGGCAACTGGAACCTG [...]
+	'AF425765_95'                  ATGAAGATGGCGTCGAATGACGCCAACCCATCTGATGGGTCCACAGCCAACCTCGTCCCAGAGGTCAACAATGAGGTCATGGCTTTGGAGCCCGTTGTTGGTGCCGCTATTGCGGCACCTGTAGCGGGCCAACAAAATGTAATTGACCCCTGGATTAGAAATAATTTTGTACAAGCCCCTGGTGGAGAGTTTACAGTGTCCCCTAGAAACGCTCCGGGTGAGATACTATGGAGCGCGCCCTTGGGCCCTGATCTGAACCCCTACCTTTCCCATTTGGCCAGAATGTACAATGGTTATGCAGGTGGTTTTGAAGTGCAGGTAATCCTCGCGGGGAACGCGTTCACCGCCGGGAAAATCATATTTGCAGCAGTCCCACCAAATTTTCCAACTGAAGGCTTGAGCCCCAGCCAGGTCACTATGTTCCCCCATATAATAGTAGATGTTAGGCAATTGGAACCTG [...]
+	'AF425766_90'                  ATGAAGATGGCGTCGAATGACGCCAACCCATCTGATGGGTCCACAGCCAACCTCGTCCCAGAGGTCAACAATGAGGTTATGGCTTTGGAGCCCGTTGTTGGTGCCGCTATTGCGGCACCTGTAGCGGGCCAACAAAATGTAATTGACCCCTGGATTAGAAATAATTTTATACAAGCCCCTGGTGGAGAGTTTACAGTATCCCCTAGAAACGCTCCGGGTGAGATACTATGGAGCGCGCCCTTGGGCCCTGATTTGAACCCCTACCTTTCTCATTTGGCCAGAATGTACAATGGTTATGCAGGTGGTTTTGAAGTGCAGGTAATCCTCGCGGGGAACGCGTTCACCGCCGGGAAAATCATATTTGCAGCAGTCCCACCAAATTTTCCAACTGAAGGCTTGAGCCCCAGCCAGGTTACTATGTTCCCCCATATAATAGTAGATGTTAGGCAATTGGAACCTG [...]
+	'AF427113_114'                 ATGAAGATGGCGTCGAATGACGCCAACCCATCTGATGGGTCCACAGCCAACCTCGTCCCAGAGGTCAACAATGAGGTTATGGCTTTGGAGCCCGTTGTTGGTGCCGCTATTGCGGCACCTGTAGCGGGCCAACAAAATGTAATTGACCCCTGGATTAGAAATAATTTTGTACAAGCCCCTGGTGGAGAGTTTACAGTGTCCCCTAGAAACGCTCCGGGTGAGATACTATGGAGCGCGCCCTTGGGCCCTGATTTGAACCCCTACCTTTCCCATTTGGCCAGAATGTACAATGGTTATGCAGGTGGTTTTGAAGTGCAGGTAATCCTCGCGGGGAACGCGTTCACCGCCGGGAAAATCATATTTGCAGCAGTTCCACCAAATTTTCCAACTGAAGGCTTGAGCCCCAGCCAGGTCACTATGTTCCCCCATATAATAGTAGATGTTAGGCAATTGGAACCTG [...]
+	'AF427114_114'                 ATGAAGATGGCGTCGAATGACGCCAACCCATCTGATGGGTCCACAGCCAACCTCGTCCCAGAGGTCAACAATGAGGTTATGGCTTTGGAGCCCGTTGTTGGTGCCGCTATTGCGGCACCTGTAGCGGGCCAACAAAATGTAATTGACCCCTGGATTAGAAATAATTTTGTACAAGCCCCTGGTGGAGAGTTTACAGTGTCCCCTAGAAACGCTCCGGGTGAGATACTATGGAGCGCGCCCTTGGGCCCTGATTTGAACCCCTACCTTTCCCATTTGGCCAGAATGTACAATGGTTATGCAGGTGGTTTTGAAGTGCAGGTAATCCTCGCGGGGAACGCGTTCACCGCCGGGAAAATCATATTTGCAGCAGTCCCACCAAATTTTCCAACTGAAGGCTTGAGCCCCAGCCAGGTCACTATGTTCCCCCATATAATAGTAGATGTTAGGCAATTGGAACCTG [...]
+	'AF427115_114'                 ATGAAGATGGCGTCGAATGACGCCAACCCATCTGATGGGTCCACAGCCAACCTCGTCCCAGAGGTCAACAATGAGGTTATGGCTTTGGAGCCCGTTGTTGGTGCCGCTATTGCAGCACCTGTAGCGGGCCAACAAAATGTAATTGACCCCTGGATTAGAAATAATTTTGTACAAGCCCCTGGTGGAGAGTTTACAGTATCCCCTAGAAACGCTCCGGGTGAGATACTATGGAGCGCGCCCCTCGGCCCTGATTTGAACCCCTACCTTTCTCATTTGGCCAGAATGTACAATGGTTATGCAGGTGGTTTTGAAGTGCAGGTAATCCTCGCGGGGAACGCGTTCACCGCCGGGAAGATCATATTTGCAGCAGTCCCACCAAATTTTCCAACTGAAGGCTTGAGCCCCAGCCAGGTTACTATGTTCCCCCATATAATAGTAGATGTTAGGCAATTGGAACCTG [...]
+	'AF427116_114'                 ATGAAGATGGCGTCGAATGACGCCAACCCATCTGATGGGTCCACAGCCAACCTCGTCCCAGAGGTCAACAATGAGGTTATGGCTTTGGAGCCCGTTGTTGGTGCCGCTATTGCAGCACCTGTAGCGGGCCAACAAAATGTAATTGACCCCTGGATTAGAAATAATTTTGTACAAGCCCCTGGTGGAGAGTTTACAGTATCCCCTAGAAACGCTCCGGGTGAGATACTATGGAGCGCGCCCCTGGGCCCTGATTTGAACCCCTACCTTTCTCATTTGGCCAGAATGTACAATGGTTATGCAGGTGGTTTTGAAGTGCAGGTAATCCTCGCGGGGAACGCGTTCACCGCCGGGAAGATCATATTTGCAGCAGTCCCACCAAATTTTCCAACTGAAGGCTTGAGCCCCAGCCAGGTTACTATGTTCCCCCATATAATAGTAGATGTTAGGCAATTGGAACCTG [...]
+	'X76716_BRISTOL_186'           ATGAAGATGGCGTCGAATGACGCCAACCCATCTGATGGGTCCGCAGCCAACCTCGTCCCAGAGGTCAATAATGAGGTTATGGCTCTGGAGCCCGTTGTTGGTGCCGCTATTGCGGCACCTGTGGCGGGCCAACAAAACGTAATTGACCCCTGGATTAGAAACAATTTTGTACAAGCCCCTGGTGGAGAGTTCACAGTGTCCCCTAGAAACGCTCCAGGTGAGATACTGTGGAGCGCGCCCTTGGGCCCTGATCTGAACCCCTATCTTTCTCATTTGTCCAGAATGTACAATGGTTATGCAGGTGGTTTTGAAGTGCAAGTAATCCTCGCGGGGAACGCGTTCACCGCCGGGAAAGTCATATTTGCAGCAGTCCCACCAAACTTTCCTACTGAAGGCTTAAGCCCCAGCCAGGTTACTATGTTCCCCCACATAATTGTAGATGTTAGACAATTGGAACCTG [...]
+	'02202001_73'                  ATGAAGATGGCGTCGAATGACGTCAACCCATCTGATGGGTCCGCAGCCAACCTCGTCCCAGAGGTCAACAATGAGGTTATGGCTCTGGAGCCCGTTGTTGGTGCCGCCATTGCGGCACCTGTGGCGGGCCAACAAAACATAATTGACCCCTGGATTAGAAATAATTTTGTACAAGCCCCTGGTGGAGAATTCACAGTGTCCCCTAGGAATGCTCCAGGTGAAATACTATGGAGCGCACCTTTGGGCCCTGATTTGAACCCCTACCTTTCTCATTTGTCTAGAATGTATAATGGTTATGCAGGTGGTTTTGAAGTGCAAGTGATCCTCGCGGGGAACGCGTTCACCGCTGGGAAGGTCATATTTGCGGCAGTCCCTCCAAACTTCCCAACTGAAGGTCTGAGCCCTAGTCAAGTTACTATGTTCCCCCATATAATTGTAGATGTTAGACAATTAGAACCTG [...]
+	'AB294779_66'                  ATGAAGATGGCGTCGAATGACGTCAACCCATCTGATGGGTCCGCAGCCAACCTCGTCCCAGAGGTCAACAATGAGGTTATGGCTCTGGAGCCCGTTGTTGGTGCCGCCATTGCGGCACCTGTAGCGGGCCAACAAAACATAATTGACCCCTGGATTAGAAATAATTTTGTACAAGCTCCTGGTGGAGAATTCACAGTGTCCCCTAGGAATGCTCCAGGTGAAATACTATGGAGCGCACCCTTGGGCCCTGATTTGAACCCCTACCTTTCTCATTTGTCTAGAATGTATAATGGTTATGCAGGTGGTTTTGAAGTGCAAGTGATCCTCGCGGGGAACGCGTTCACCGCTGGGAAGGTCATATTTGCGGCAGTCCCTCCAAACTTCCCAACTGAAGGTCTGAGCCCTAGTCAAGTTACTATGTTCCCCCATATAATTGTAGATGTTAGACAATTAGAACCTG [...]
+	'AB083781_83'                  ATGAAGATGGCGTCGAATGACGCCAACCCATCTGATGGGTCCACAGCCAACCTCGTCCCAGAGGTCAACAATGAGGTTATGGCTTTGGAGCCCGTTGTTGGTGCCGCTATCGCGGCACCTGTAGCGGGCCAACAAAATGTAATTGACCCCTGGATTAGAAGTAATTTTGTACAAGCCCCTGGTGGAGAGTTTACAGTATCCCCTAGAAACGCTCCAGGTGAGATACTATGGAGCGCGCCCTTGGGCCCTGATCTGAATCCCTACCTTTCTCATTTGGCCAGAATGTACAATGGTTATGCTGGTGGTTTTGAAGTGCAGGTAATCCTCGCGGGGAACGCGTTCACCGCCGGGAAAATCATATTTGCAGCAGTCCCACCAAATTTTCCAACTGAAGGCTTGAGCCCCAGCCAGGTTACTATGTTCCCCCATATAATAGTAGATGTTAGGCAATTGGAACCTG [...]
+	'AJ004864_GRIMSBY_162'         ATGAAGATGGCGTCGAATGACGCCAACCCATCTGATGGGTCCACAGCCAACCTCGTCCCAGAGGTCAACAATGAGGTTATGGCTTTGGAACCCGTTGTTGGTGCCGCTATTGCGGCACCTGTAGCGGGCCAACAAAATGTAATTGACCCCTGGATTAGAAATAATTTTGTACAAGCCCCTGGTGGAGAGTTTACAGTATCCCCTAGAAACGCTCCGGGTGAGATACTATGGAGCGCGCCCTTGGGCCCTGATTTGAACCCCTACCTTTCTCATTTGGCCAGAATGTACAATGGTTATGCAGGTGGTTTTGAAGTGCAGGTAATCCTCGCGGGGAACGCGTTCACCGCCGGGAAAATCATATTTGCAGCAGTCCCACCAAATTTTCCAGCTGAAGGCTTGAGCCCCAGCCAGGTTACTATGTTCCCCCATATAATAGTAGATGTTAGGCAATTGGAACCTG [...]
+	'AB220921_CHIBA_48'            ATGAAGATGGCGTCGAATGACGCCAGCCCATCTGATGGGTCCACAGCCAACCTCGTCCCAGAGGTCAACAATGAGGTTATGGCTTTGGAGCCCGTTGTTGGTGCCGCCATTGCGGCACCTGTAGCGGGCCAACAAAATGTAATTGACCCCTGGATTAGGACTAATTTTGTACAAGCCCCTGGTGGAGAGTTCACAGTATCCCCTAGAAACGCTCCAGGTGAAATACTATGGAGCGCGCCCTTAGGCCCTGATCTGAATCCATACCTTTCTCACCTGGCCAGAATGTACAATGGTTATGCAGGTGGTTTTGAAGTGCAGGTAATCCTCGCGGGGAACGCGTTCACCGCCGGGAAAATCATCTTTGCAGCAGTCCCACCAAATTTCCCAACTGAAGGCTTGAGCCCCAGCCAGGTCACTATGTTCCCCCACATAATAGTAGATGTTAGGCAATTGGAACCTG [...]
+	'AB220922_48'                  ATGAAGATGGCGTCGAATGACGCCAGCCCATCTGATGGGTCCACAGCCAACCTCGTCCCAGAGGTCAACAATGAGGTTATGGCTTTGGAGCCCGTTGTTGGTGCCGCTATTGCGGCACCTGTAGCGGGCCAACAAAATGTAATTGACCCCTGGATTAGGAATAATTTTGTACAAGCCCCTGGTGGAGAGTTCACAGTATCCCCTAGAAACGCTCCAGGTGAAATACTATGGAGCGCGCCCTTAGGCCCTGATCTGAACCCATACCTTTCTCACCTGGCCAGAATGTACAATGGTTATGCAGGTGGTTTTGAAGTGCAGGTAATCCTCGCGGGGAACGCGTTCACCGCCGGGAAAATCATATTTGCAGCAGTCCCACCAAATTTCCCAACTGAAGGCTTGAGCCCCAGCCAGGTCACTATGTTCCCCCATATAATAGTAGATGTTAGGCAATTGGAACCTG [...]
+	'AB220923_48'                  ATGAAGATGGCGTCGAATGACGCCAGCCCATCTGATGGGTCCACAGCCAACCTCGTTCCAGAGGTCAACAATGAGGTTATGGCTTTGGAGCCCGTTGTTGGTGCCGCTATTGCGGCACCTGTAGCGGGCCAACAAAATGTAATTGACCCCTGGATTAGGAATAATTTTGTACAAGCCCCTGGTGGAGAGTTCACAGTGTCCCCTAGAAACGCTCCAGGTGAAATACTATGGAGCGCGCCCTTAGGCCCTGATCTGAATCCATACCTTTCTCACCTGGCCAGAATGTACAATGGTTATGCAGGTGGTTTTGAAGTGCAGGTAATCCTCGCGGGGAACGCGTTCACCGCCGGGAAAATCATATTTGCAGCAGTCCCACCAAATTTCCCAACTGAAGGCTTGAGCCCCAGCCAGGTCACTATGTTCCCCCACATAATAGTAGATGTTAGGCAATTGGAACCTG [...]
+	'AB291542_30'                  ATGAAGATGGCGTCGAATGACGCCAACCCATCTGATGGGTCCGCAGCCAACCTCGTCCCAGAGGTCAACAATGAGGTTATGGCTTTGGAGCCCGTTGTCGGTGCCGCTATTGCGGCGCCTGTAGCGGGCCAAACAAATGTAATTGACCCCTGGATTAGAAATAATTTTGTACAAGCCCCTGGTGGAGAGTTCACAGTATCCCCTAGAAACGCTCCAGGTGAAATACTATGGAGCGCGCCCTTAGGCCCTGATCTGAATCCCTACCTATCTCATTTGGCCAGAATGTATAACGGGCATGCAGGTGGTTTTGAAGTGCAGGTGATCCTCGCGGGGAACGCGTTCACCGCCGGAAAAATTATATTTGCAGCAGTCCCACCAAATTTCCCAACTGAAGGCTTGAGTCCCAGCCAGGTCACTATGTTCCCCCACATAATAGTAGATGTTAGGCAATTGGAACCTG [...]
+	'AB294782_54'                  ATGAAGATGGCGTCGAATGACGCCAGCCCATCTGATGGGTCCACAGCCAACCTCGTCCCAGAGGTCAACAATGAGGTTATGGCTTTGGAGCCCGTTGTTGGTGCCGCTATTGCGGCACCTGTAGCGGGCCAACAAAATGTAATTGACCCCTGGATTAGGAATAATTTTGTACAAGCCCCTGGTGGAGAGTTCACAGTATCCCCTAGAAACGCTCCAGGTGAAATACTATGGAGCGCGCCCTTAGGCCCTGATCTGAATCCATACCTTTCTCACCTGGCCAGAATGTACAATGGTTATGCAGGTGGTTTTGAAGTGCAGGTAATCCTCGCGGGGAACGCGTTCACCGCCGGGAAAATCATATTTGCAGCAGTCCCACCAAATTTCCCGACCGAAGGCTTGAGCCCCAGCCAGGTCACTATGTTCCCCCACATAATAGTAGATGTTAGGCAATTGGAACCTG [...]
+	'AB294783_54'                  ATGAAGATGGCGTCGAATGACGCCACCCCATCTGATGGGTCCACAGCCAACCTCGTCCCAGAGGTCAACAATGAGGTTATGGCTTTGGAGCCCGTTGTTGGTGCCGCGATTGCGGCACCTGTAGCGGGCCAACAAAATGTAATTGACCCCTGGATTAGAAATAATTTTGTACAAGCCCCTGGTGGAGAGTTTACAGTATCCCCTAGAAACGCTCCAGGTGAAATATTATGGAGCGCGCCCTTGGGCCCTGATTTGAATCCCTACCTTTCCCATTTGGCCAGAATGTACAATGGTTATGCAGGTGGTTTTGAAGTGCAGGTAATCCTCGCGGGGAACGCGTTCACCGCCGGAAAAATCATATTTGCAGCAGTCCCACCAAATTTCCCAACTGAAGGCTTGAGCCCCAGCCAGGTTACTATGTTCCCCCATATAATAGTAGATGTTAGGCAACTGGAACCTG [...]
+	'AB294784_42'                  ATGAAGATGGCGTCGAATGACGCCACCCCATCTGATGGGTCCACAGCCAACCTCGTCCCAGAGGTCAACAATGAGGTTATGGCTTTGGAGCCCGTTGTTGGTGCCGCGATTGCGGCACCTGTAGCGGGCCAACAAAATGTAATTGACCCCTGGATTAGAAATAATTTTGTACAAGCCCCTGGTGGAGAGTTTACAGTATCCCCTAGAAACGCTCCAGGTGAAATATTATGGAGCGCGCCCTTGGGCCCTGATTTGAATCCCTACCTTTCCCATTTGGCCAGAATGTACAATGGTTATGCAGGTGGTTTTGAAGTGCAGGTAATCCTCGCGGGGAACGCGTTCACCGCCGGGAAAATCATATTTGCAGCAGTCCCACCAAATTTCCCAACTGAAGGCTTGAGCCCCAGCCAGGTCACTATGTTCCCCCACATAATAGTAGATGTTAGGCAACTGGAACCTG [...]
+	'AB294785_42'                  ATGAAGATGGCGTCGAATGACGCCACCCCATCTGATGGGTCCACAGCCAACCTCGTCCCAGAGGTCAACAATGAGGTTATGGCTTTGGAGCCCGTTGTTGGTGCCGCGATTGCGGCACCTGTAGCGGGCCAACAAAATGTAATTGACCCCTGGATTAGAAATAATTTTGTACAAGCCCCTGGTGGAGAGTTTACAGTGTCCCCTAGAAACGCTCCAGGTGAAATATTATGGAGCGCGCCCTTGGGCCCTGATTTGAATCCCTACCTTTCCCATTTGGCCAGAATGTACAATGGTTATGCAGGTGGTTTTGAAGTGCAGGTAATCCTCGCGGGGAACGCGTTCACCGCCGGGAAAATCATATTTGCAGCAGTCCCACCAAATTTCCCAACTGAAGGCTTGAGCCCCAGCCAGGTCACTATGTTCCCCCATATAATAGTAGATGTTAGACAACTGGAACCTG [...]
+	'AB294786_42'                  ATGAAGATGGCGTCGAATGACGCCAGCCCATCTGATGGGTCCACAGCCAACCTCGTCCCAGAGGTCAACAATGAGGTTATGGCTTTGGAGCCCGTTGTTGGTGCCGCTATTGCGGCACCTGTAGCGGGCCAACAAAATGTAATTGACCCCTGGATTAGGAATAATTTTGTACAAGCCCCTGGTGGAGAGTTCACAGTATCCCCTAGAAACGCTCCAGGTGAAATACTATGGAGCGCGCCCCTAGGCCCTGATCTGAATCCATACCTTTCTCACCTGGCTAGAATGTACAATGGTTATGCAGGTGGTTTTGAAGTGCAGGTAATCCTCGCGGGGAACGCGTTCACCGCCGGGAAAATCATATTTGCAGCAGTCCCACCAAATTTCCCAACTGAAGGCTTGAGCCCCAGCCAGGTCACTATGTTCCCCCACATAATAGTAGATGTTAGGCAATTGGAACCTG [...]
+	'AB294787_42'                  ATGAAGATGGCGTCGAATGACGCCAGCCCATCTGATGGGTCCGCAGCCAACCTCGTCCCAGAGGTCAACAATGAGGTTATGGCTTTGGAGCCCGTTGTTGGTGCCGCTATTGCGGCACCTGTAGCGGGCCAACAAAATGTAATTGACCCCTGGATTAGGAATAATTTTGTACAAGCCCCTGGTGGAGAGTTCACGGTATCCCCTAGAAACGCTCCAGGTGAAATACTATGGAGCGCGCCCTTAGGCCCTGATCTGAATCCATACCTTTCTCACCTGGCCAGAATGTATAATGGTTATGCAGGTGGTTTTGAAGTGCAGGTAATCCTCGCGGGGAACGCGTTCACCGCCGGGAAAATCATATTTGCAGCAGTCCCACCAAATTTCCCAACTGAAGGCTTGAGTCCCAGCCAGGTCACTATGTTCCCCCATATAATAGTAGATGTTAGGCAATTGGAACCTG [...]
+	'AB294788_30'                  ATGAAGATGGCGTCGAATGACGCCACCCCATCTGATGGGTCCACAGCCAACCTCGTCCCAGAGGTCAACAATGAGGTTATGGCTTTGGAGCCCGTTGTTGGTGCCGCGATTGCGGCACCTGTAGCGGGCCAACAAAATGTAATTGACCCCTGGATTAGAAATAATTTTGTACAAGCCCCTGGTGGAGAGTTTACAGTATCCCCTAGAAACGCTCCAGGTGAAATATTATGGAGCGCGCCCTTGGGCCCTGATTTGAATCCCTACCTTTCCCATTTGGCCAGAATGTATAATGGTTATGCAGGTGGTTTTGAAGTGCAGGTAATCCTCGCGGGGAACGCGTTCACCGCCGGGAAAATCATATTTGCAGCAGTCCCACCAAATTTCCCAACTGAAGGCTTGAGCCCCAGCCAGGTCACTATGTTCCCCCATATAATAGTAGATGTCAGGCAACTGGAACCTG [...]
+	'AB294789_30'                  ATGAAGATGGCGTCGAGTGACGCCAACCCATCTGATGGGTCCACAGCCAACCTCGTCCCAGAGGTCAACAATGAGGTTATGGCTTTGGAGCCCGTTGTTGGTGCCGCTATTGCGGCACCTGTAGCGGGCCAACAAAATGTAATTGACCCCTGGATTAGAAATAATTTTGTACAAGCCCCTGGTGGAGAATTTACAGTATCCCCTAGAAACGCTCCAGGTGAAATACTATGGAGCGCGCCCTTGGGCCCTGATTTGAATCCCTACCTTTCCCATTTGGCCAGAATGTACAATAGTTATGCAGGTGGTTTTGAAGTGCAGGTAATCCTCGCGGGGAACGCGTTCACCGCCGGAAAAATCATATTTGCAGCAGTCCCACCAAATTTCCCAACTGAAGGCTTGAGCCCCAGCCAGGTCACTATGTTCCCCCATATAATAGTAGATGTTAGGCAACTGGAACCTG [...]
+	'AB294790_30'                  ATGAAGATGGCGTCGAGTGACGCCAACCCATCTGATGGGTCCACAGCCAACCTCGTCCCAGAGGTCAACAATGAGGTTATGGCTTTGGAGCCCGTTGTTGGTGCCGCTATTGCGGCACCTGTAGCGGGCCAACAAAATGTAATTGACCCCTGGATTAGAAATAATTTTGTACAAGCCCCTGGTGGAGAGTTTACAGTATCCCCTAGAAACGCTCCAGGTGAAATACTATGGAGCGCGCCCTTGGGCCCTGATTTGAATCCCTACCTTTCCCATTTGGCCAGAATGTACAATAGTTATGCAGGTGGTTTTGAAGTGCAGGTAATCCTCGCGGGGAACGCGTTCACCGCCGGAAAAATCATATTTGCAGCAGTCCCACCAAATTTCCCAACTGAAGGCTTGAGCCCCAGCCAGGTCACTATGTTCCCCCATATAATAGTAGATGTTAGGCAACTGGAACCTG [...]
+	'AB294791_30'                  ATGAAGATGGCGTCGAATGACGCCAGCCCATCTGATGGGTCCACAGCCAACCTCGTCCCAGAGGTCAACAATGAGGTTATGGCTTTGGAGCCCGTTGTTGGTGCCGCTATTGCGGCACCTGTAGCGGGCCAACAAAATGTAATTGACCCCTGGATTAGGAATAACTTTGTACAAGCCCCTGGTGGAGAGTTCACAGTATCCCCTAGAAACGCTCCAGGTGAAATACTATGGAGCGCGCCCTTAGGCCCTGATTTGAATCCATACCTTTCTCACCTGGCCAGAATGTACAATGGTTATGCAGGTGGTTTTGAAGTGCAGGTAATCCTCGCGGGGAACGCGTTCACCGCCGGGAAAATCATATTTGCAGCAGTCCCACCAAATTTCCCAACTGAAGGCTTGAGCCCCAGCCAGGTCACTATGTTCCCCCACATAATAGTAGATGTTAGGCAATTGGAACCTG [...]
+	'AB294792_30'                  ATGAAGATGGCGTCGAATGACGCCAGCCCATCTGATGGGTCCACAGCCAACCTCGTCCCAGAGGTCAACAATGAGGTTATGGCTTTGGAGCCCGTTGTTGGTGCCGCTATTGCGGCACCTGTAGCGGGCCAACAAAATGTAATTGACCCCTGGATTAGGAATAATTTTGTGCAAGCCCCTGGTGGAGAGTTCACAGTATCCCCTAGAAACGCTCCAGGTGAAATACTATGGAGCGCGCCCTTAGGCCCTGATCTGAATCCATACCTTTCTCACCTGGCCAGAATGTACAATGGTTATGCAGGTGGTTTTGACGTGCAGGTAATCCTCGCGGGGAACGCGTTCACCGCCGGGAAAATCATATTTGCAGCAGTCCCACCAAATTTCCCAACTGAAGGCTTGAGCCCCAGCCAGGTCACTATGTTCCCCCACATAATAGTAGATGTTAGGCAATTGGAACCTG [...]
+	'AB294793_30'                  ATGAAGATGGCGTCGAATGACGCCAACCCATCTGATGGGTCCGCAGCCAACCTCGTCCCAGAGGTCAACAATGAGGTTATGGCTTTGGAGCCCGTTGTCGGTGCCGCTATTGCGGCGCCTGTAGCGGGCCAACAAAATGTAATTGACCCCTGGATTAGAAATAATTTTGTACAAGCCCCTGGTGGAGAGTTCACAGTATCCCCTAGAAACGCTCCAGGTGAAATACTATGGAGCGCGCCCTTAGGCCCTGATCTGAATCCCTACCTATCTCATCTGGCCAGAATGTATAATGGTTATGCAGGTGGTTTTGAAGTGCAGGTGATCCTCGCGGGGAACGCGTTCACCGCCGGAAAAATTATATTTGCAGCAGTCCCACCAAATTTTCCAACTGAAGGCTTGAGCCCCAGTCAGGTCACTATGTTCCCCCACATAATAGTAGATGTTAGGCAATTGGAACCTG [...]
+	'AB294794_30'                  ATGAAGATGGCGTCGAATGACGCCAACCCATCTGATGGGTCCGCAGCCAACCTCGTCCCAGAGGTCAACAATGAGGTTATGGCTTTGGAGCCCGTTGTCGGTGCCGCTATTGCGGCGCCTGTAGCGGGCCAACAAAATGTAATTGACCCCTGGATTAGGAATAATTTTGTACAAGCCCCTGGTGGAGAGTTCACAGTATCCCCTAGAAACGCTCCAGGTGAAATACTATGGAGCGCGCCCTTAGGCCCTGATCTGAATCCCTACCTATCTCATTTGGCCAGAATGTATAATGGTTATGCAGGTGGTTTTGAAGTGCAGGTGATCCTCGCGGGGAACGCGTTCACCGCCGGAAAAATTATATTTGCAGCAGTCCCACCAAATTTTCCAACTGAAGGCTTGAGTCCCAGCCAGGTCACTATGTTCCCCCACATAATAGTAGATGTTAGGCAATTGGAACCTG [...]
+	'08450_12'                     ATGAAGATGGCGTCGAATGACGCCAACCCATCTGATGGGTCCACAGCCAACCTCGTCCCAGAGGTCAACAATGAGGTTATGGCTTTGGAGCCCGTTGTAGGTGCCGCTATTGCGGCGCCTGTAGCGGGCCAACAAAATGTAATTGACCCCTGGATTAGAAATAATTTTGTACAAGCCCCTGGTGGAGAGTTTACAGTGTCCCCTAGAAATGCTCCAGGTGAGATACTATGGAGTGCGCCCTTGGGCCCTGATTTGAACCCTTACCTTTCTCATCTGGCCAGAATGTATAATGGTTATGCAGGTGGTTTTGAAGTGCAGGTAATCCTCGCGGGGAACGCGTTCACCGCCGGAAAAATCATATTTGCAGCAGTTCCACCTAACTTTCCAACTGAAGGCTTGAGCCCCAGCCAGGTTACTATGTTCCCCCATATAATAGTAGATGTTAGGCAATTGGAACCTG [...]
+	'AF427117_102'                 ATGAAGATGGCGTCGAATGACGCCAACCCATCTGATGGGTCCACAGCCAACCTTGTCCCAGAGGTCAACAATGAGGTTATGGCTTTGGAACCCGTTGTTGGTGCCGCTATTGCGGCACCTGTAGCGGGCCAACAAAATGTAATTGACCCCTGGATTAGAAATAATTTTGTACAAGCCCCTGGTGGAGAGTTTACAGTATCCCCTAGAAACGCTCCAGGTGAGATACTATGGAGCGCGCCCTTGGGCCCTGATTTGAATCCCTACCTATCTCATTTGGCCAGGATGTACAATGGTTATGCAGGTGGTTTTGAAGTGCAGGTAATCCTCGCGGGGAACGCGTTCACTGCCGGGAAAATCATATTTGCAGCAGTCCCACCAAATTTTCCAACCGAAGGCTTGAGCCCTAGCCAGGTCACTATGTTCCCCCATATAATAGTAGATGTTAGGCAATTGGAACCTG [...]
+	'AUS2006_32'                   ATGAAGATGGCGTCGAGTGACGCCAACCCATCTGATGGGTCCACAGCCAACCTCGTCCCAGAGGTCAACAATGAGGTTATGGCTTTGGAGCCCGTTGTTGGTGCCGCTATTGCGGCACCTGTAGCGGGCCAACAAAATGTAATTGACCCCTGGATTAGAAATAATTTTGTACAAGCTCCTGGTGGAGAGTTCACAGTATCCCCTAGAAACGCTCCAGGTGAAATACTATGGAGCGCGCCCTTGGGTCCTGATTTGAACCCCTACCTTTCCCATTTGGCCAGAATGTACAATGGTTATGCAGGTGGTTTTGAAGTGCAGGTAGTCCTCGCGGGGAACGCGTTCACCGCCGGAAAAATCATATTTGCAGCAGTCCCACCAAATTTCCCAACTGAAGGCTTGAGCCCCAGCCAGGTCACTATGTTCCCCCATATAATAGTAGATGTTAGGCAACTGGAACCTG [...]
+	'AY485642_74'                  ATGAAGATGGCGTCGAATGACGCCAACCCATCTGATGGGTCCACAGCCAACCTCGTCCCAGAGGTCAACAATGAGGTTATGGCTTTGGAGCCCGTTGTTGGTGCCGCTATTGCGGCACCTGTAGCGGGCCAACAAAATGTAATTGACCCCTGGATTAGAAATAATTTTGTACAAGCCCCTGGTGGAGAGTTTACAGTATCCCCTAGAAACGCTCCAGGTGAAATACTATGGAGCGCGCCCTTGGGCCCTGATCTGAATCCCTACCTTCCTCATTTGGCCAGAATGTACAATGGCTATGCAGGTGGCTTTGAAGTGCAGGTAATCCTTGCGGGGAATGCGTTCACCGCCGGGAAAATCATATTTGCAGCAGTCCCACCAAATTTCCCAACTGAAGGCTTGAGCCCCAGCCAGGTCACTATGTTCCCCCATATAATAGTAGATGTTAGGCAACTGGAACCTG [...]
+	'AY502017_78'                  ATGAAGATGGCGTCGAATGACGCCAACCCATCTGATGGGTCCACAGCCAACCTCGTCCCAGAGGTCAACAATGAGGTTATGGCTTTGGAGCCCGTTGTTGGTGCCGCTATTGCGGCACCTGTAGCGGGCCAACAAAATGTAATTGACCCCTGGATTAGAAATAATTTTGTACAAGCCCCTGGTGGAGAGTTTACAGTATCCCCTAGAAACGCTCCAGGTGAAATACTATGGAGCGCGCCCTTGGGCCCTGATCTAAATCCCTACCTTTCTCATTTGGCCAGAATGTACAATGGCTATGCAGGTGGCTTTGAAGTGCAGGTAATCCTTGCGGGGAATGCGTTCACCGCCGGGAAAATCATATTTGCAGCAGTCCCACCAAATTTCCCAACTGAAGGCTTGAGCCCCAGCCAGGTCACTATGTTCCCCCATATAATAGTAGATGTTAGGCAACTGGAACCTG [...]
+	'AY502018_78'                  ATGAAGATGGCGTCGAATGACGCCAACCCATCTGATGGGTCCACAGCCAACCTCGTCCCAGAGGTCAACAATGAGGTTATGGCTTTGGAGCCCGTTGTTGGTGCCGCTATTGCGGCACCTGTAGCGGGCCAACAAAATGTAATTGACCCCTGGATTAGAAATAATTTTGTACAAGCCCCTGGTGGAGAGTTTACAGTATCCCCTAGAAACGCTCCAGGTGAAATACTATGGAGCGCGCCCTTGGGCCCTGATCTGAATCCCTACCTTTCTCATTTGGCCAGAATGTACAATGGCTATGCAGGTGGCTTTGAAGTGCAGGTAATCCTTGCGGGGAATGCGTTCACCGCCGGGAAAATCATATTTGCAGCAGTCCCACCAAATTTCCCAACTGAAGGCTTGAGCCCCAGCCAGGTCACTATGTTCCCCCATATAATAGTAGATGTTAGGCAACTGGAACCTG [...]
+	'AY502019_78'                  ATGAAGATGGCGTCGAATGACGCCAACCCATCTGATGGGTCCACAGCCAACCTCGTCCCAGAGGTCAACAATGAGGTTATGGCTTTGGAGCCCGTTGTTGGTGCCGCTATTGCGGCACCTGTAGCGGGCCAACAAAATGTAATTGACCCCTGGATTAGAAATAATTTTGTACAAGCCCCTGGTGGAGAGTTTACAGTATCCCCCAGAAACGCTCCAGGTGAAATACTATGGAGCGCGCCCTTGGGCCCTGATCTGAATCCCTACCTTTCTCATTTGGCCAGAATGTACAATGGCTATGCAGGTGGCTTTGAAGTGCAGGTAATCCTTGCGGGGAATGCGTTTACCGCCGGGAAAATCGTATTTGCAGCAGTCCCACCAAATTTCCCAACTGAAGGCTTGAGCCCCAGCCAGGTCACTATGTTCCCCCATATAATAGTAGATGTTAGGCAACTGGAACCTG [...]
+	'AY502020_66'                  ATGAAGATGGCGTCGAATGACGCCAACCCATCTGATGGGTCCACAGCCAACCTCGTCCCAGAGGTCAACAATGAGGTTATGGCTTTGGAGCCCGTTGTTGGTGCCGCTATTGCGGCACCTGTAGCGGGCCAACAAAATGTAATTGACCCCTGGATTAGAAATAATTTTGTACAAGCCCCTGGTGGAGAGTTTACAGTGTCACCTAGAAACGCTCCAGGTGAAATACTATGGAGCGCGCCCTTGGGCCCTGATCTGAATCCCTACCTTTCTCATTTGGCCAGAATGTACAATGGCTATGCAGGTGGCTTTGAAGTGCAGGTAATCCTTGCGGGGAATGCGTTCACCGCCGGGAAAATCATATTTGCAGCAGTCCCACCAAATTTCCCAACTGAAGGCTTGAGCCCCAGCCAGGTCACTATGTTCCCCCATATAATAGTAGATGTTAGGCAACTGGAACCTG [...]
+	'AY502021_66'                  ATGAAGATGGCGTCGAATGACGCCAACCCATCTGATGGGTCCACAGCCAACCTCGTCCCAGAGGTCAACAATGAGGTTATGGCTTTGGAGCCCGTTGTTGGTGCCGCTATTGCGGCACCTGTAGCGGGCCAACAAAATGTAATTGACCCCTGGATTAGAAATAATTTTGTACAAGCCCCTGGTGGAGAGTTTACAGTGTCACCTAGAAACGCTCCAGGTGAAATACTATGGAGCGCGCCCTTGGGCCCTGATCTGAATCCCTACCTTTCTCATTTGGCCAGAATGTACAATGGCTATGCAGGTGGCTTTGAAGTGCAGGTAATCCTTGCGGGGAATGCGTTCACCGCCGGGAAAATCATATTTGCAGCAGTCCCACCAAATTTCCCAACTGAAGGCTTGAGCCCCAGCCAGGTCACTATGTTCCCCCATATAATAGTAGATGTTAGGCAACTGGAACCTG [...]
+	'AY502022_66'                  ATGAAGATGGCGTCGAATGACGCCAACCCATCTGATGGGTCCACAGCCAACCTCGTCCCAGAGGTCAACAATGAGGTTATGGCTTTGGAGCCCGTTGTTGGTGCCGCTATTGCGGCACCTGTAGCGGGCCAACAAAATGTAATTGACCCCTGGATTAGAAATAATTTTGTACAAGCCCCTGGTGGAGAGTTTACAGTGTCACCTAGAAACGCTCCAGGTGAAATACTATGGAGCGCGCCCTTGGGCCCTGATCTGAATCCCTACCTTTCTCATTTGGCCAGAATGTACAATGGCTATGCAGGTGGCTTTGAAGTGCAGGTAATCCTTGCGGGGAATGCGTTCACCGCCGGGAAAATCATATTTGCAGCAGTCCCACCAAATTTCCCAACTGAAGGCTTGAGCCCCAGCCAGGTCACTATGTTCCCCCATATAATAGTAGATGTTAGGCAACTGGAACCTG [...]
+	'AY502023_FARMINGTONHILLS_78'  ATGAAGATGGCGTCGAATGACGCCAACCCATCTGATGGGTCCACAGCCAACCTCGTCCCAGAGGTCAACAATGAGGTTATGGCTTTGGAGCCCGTTGTTGGTGCCGCTATTGCGGCACCTGTAGCGGGCCAACAAAATGTAATTGACCCCTGGATTAGAAATAATTTTGTACAAGCCCCTGGTGGAGAGTTTACAGTATCCCCTAGAAACGCTCCAGGTGAAATACTATGGAGCGCGCCCTTGGGCCCTGATCTGAATCCCTACCTTTCTCATTTGGCCAGAATGTACAATGGCTATGCAGGTGGCTTTGAAGTGCAGGTAATCCTTGCGGGGAATGCGTTCACCGCCGGGAAAATCATATTTGCAGCAGTCCCACCAAATTTCCCAACTGAAGGCTTGAGCCCCAGCCAGGTCACTATGTTCCCCCATATAATAGTAGATGTTAGGCAACTGGAACCTG [...]
+	'AY581254_71'                  ATGAAGATGGCGTCGAATGACGCCAACCCATCTGATGGGTCCACAGCCAACCTCGTCCCAGAGGTCAACAATGAGGTTATGGCTTTGGAGCCCGTTGTTGGTGCCGCTATTGCGGCACCTGTAGCGGGCCAACAAAATGTAATTGACCCCTGGATTAGAAATAATTTTGTACAAGCCCCTGGTGGAGAGTTTACAGTATCCCCTAGAAACGCTCCAGGTGAAATACTATGGAGCGCGCCCTTGGGCCCTGATCTGAATCCCTACCTTTCTCATTTGGCCAGAATGTACAATGGCTATGCAGGTGGCTTTGAAGTGCAGGTAATCCTTGCGGGGAATGCGTTCACCGCCGGGAAAATCATATTTGCAGCAGTCCCACCAAATTTCCCAACTGAAGGCTTGAGCCCCAGCCAGGTCACTATGTTCCCCCATATAATAGTAGATGTTAGGCAACTGGAACCTG [...]
+	'AY587983_76'                  ATGAAGATGGCGTCGAATGACGCCAACCCATCTGATGGGTCCACAGCCAACCTCGTCCCAGAGGTCAACAATGAGGTTATGGCTTTGGAGCCCGTTGTTGGTGCCGCTATTGCGGCACCTGTAGCGGGCCAACAAAATGTAATTGACCCCTGGATTAGAAATAATTTTGTACAAGCCCCTGGTGGAGAGTTTACAGTATCCCCTAGAAACGCTCCAGGTGAAATACTATGGAGCGCGCCCTTGGGCCCTGATCTGAATCCCTACCTTTCTCATTTGGCCAGAATGTACAATGGCTATGCAGGTGGCTTTGAAGTGCAGGTAATCCTTGCGGGGAATGCGTTCACCGCCGGGAAAATCATATTTGCAGCAGTCCCACCAAATTTCCCAACTGAAGGCTTGAGCCCCAGCCAGGTCACTATGTTCCCCCATATAATAGTAGATGTTAGGCAACTGGAACCTG [...]
+	'AY587985_76'                  ATGAAGATGGCGTCGAATGACGCCAACCCATCTGATGGGTCCACAGCCAACCTCGTCCCAGAGGTCAACAATGAGGTTATGGCTTTGGAGCCCGTTGTTGGTGCCGCTATTGCGGCACCTGTAGCGGGCCAACAAAATGTAATTGACCCCTGGATTAGAAATAATTTTGTACAAGCCCCTGGTGGAGAGTTTACAGTATCCCCTAGAAACGCTCCAGGTGAAATACTATGGAGCGCGCCCTTGGGCCCTGATCTGAATCCCTACCTTTCTCATTTGGCCAGAATGTACAATGGCTATGCAGGTGGCTTTGAAGTGCAGGTAATCCTTGCGGGGAATGCGTTCACCGCCGGGAAAATCATATTTGCAGCAGTCCCACCAAATTTCCCAACTGAAGGCTTGAGCCCCAGCCAGGTCACTATGTTCCCCCATATAATAGTAGATGTTAGGCAACTGGAACCTG [...]
+	'AY587986_75'                  ATGAAGATGGCGTCGAATGACGCCAACCCATCTGATGGGTCCACAGCCAACCTCGTCCCAGAGGTCAACAATGAGGTTATGGCTTTGGAGCCCGTTGTTGGTGCCGCTATTGCGGCACCTGTAGCGGGCCAACAAAATGTAATTGACCCCTGGATTAGAAATAATTTTGTACAAGCCCCTGGTGGAGAGTTTACAGTATCCCCTAGAAACGCTCCAGGTGAAATACTATGGAGCGCGCCCTTGGGCCCTGATCTGAATCCCTACCTTTCTCATTTGGCCAGAATGTACAATGGCTATGCAGGTGGCTTTGAAGTGCAGGTAATCCTTGCGGGGAATGCGTTCACCGCCGGGAAAATCATATTTGCAGCAGTCCCACCAAATTTCCCAACTGAAGGCTTGAGCCCCAGCCAGGTCACTATGTTCCCCCATATAATAGTAGATGTTAGGCAACTGGAACCTG [...]
+	'AY587988_75'                  ATGAAGATGGCGTCGAATGACGCCAACCCATCTGATGGGTCCACAGCCAACCTCGTCCCAGAGGTCAACAATGAGGTTATGGCTTTGGAGCCCGTTGTTGGTGCCGCTATTGCGGCACCTGTAGCGGGCCAACAAAATGTAATTGACCCCTGGATTAGAAATAATTTTGTACAAGCCCCTGGTGGAGAGTTTACAGTATCCCCTAGAAACGCTCCAGGTGAAATACTATGGAGCGCGCCCTTGGGCCCTGATCTGAATCCCTACCTTTCTCATTTGGCCAGAATGTACAATGGCTATGCAGGTGGCTTTGAAGTGCAGGTAATCCTTGCGGGGAATGCGTTCACCGCCGGGAAAATCATATTTGCAGCAGTCCCACCAAATTTCCCAACTGAAGGCTTGAGCCCCAGCCAGGTCACTATGTTCCCCCATATAATAGTAGATGTTAGGCAACTGGAACCTG [...]
+	'AY587990_74'                  ATGAAGATGGCGTCGAATGACGCCAACCCATCTGATGGGTCCACAGCCAACCTCGTCCCAGAGGTCAACAATGAGGTTATGGCTTTGGAGCCCGTTGTTGGTGCCGCTATTGCGGCACCTGTAGCGGGCCAACAAAATGTAATTGACCCCTGGATTAGAAATAATTTTGTACAAGCCCCTGGTGGAGAGTTTACAGTATCCCCTAGAAACGCTCCAGGTGAAATACTATGGAGCGCGCCCTTGGGCCCTGATCTGAATCCCTACCTTTCTCATTTGGCCAGAATGTACAATGGCTATGCAGGTGGCTTTGAAGTGCAGGTAATCCTTGCGGGGAATGCGTTCACCGCCGGGAAAATCATATTTGCAGCAGTCCCACCAAATTTCCCAACTGAAGGCTTGAGCCCCAGCCAGGTCACTATGTTCCCCCATATAATAGTAGATGTTAGGCAACTGGAACCTG [...]
+	'AY587991_74'                  ATGAAGATGGCGTCGAATGACGCCAACCCATCTGATGGGTCCACAGCCAACCTCGTCCCAGAGGTCAACAATGAGGTTATGGCTTTGGAGCCCGTTGTTGGTGCCGCTATTGCGGCACCTGTAGCGGGCCAACAAAATGTAATTGACCCCTGGATTAGAAATAATTTTGTACAAGCCCCTGGTGGAGAGTTTACAGTATCCCCTAGAAACGCTCCAGGTGAAATACTATGGAGCGCGCCCTTGGGCCCTGATCTGAATCCCTACCTTTCTCATTTGGCCAGAATGTACAATGGCTATGCAGGTGGCTTTGAAGTGCAGGTAATCCTTGCGGGGAATGCGTTCACCGCCGGGAAAATCATATTTGCAGCAGTCCCACCAAATTTCCCAACTGAAGGCTTGAGCCCCAGCCAGGTCACTATGTTCCCCCATATAATAGTAGATGTTAGGCAACTGGAACCTG [...]
+	'AY587992_74'                  ATGAAGATGGCGTCGAATGACGCCAACCCATCTGATGGGTCCACAGCCAACCTCGTCCCAGAGGTCAACAATGAGGTTATGGCTTTGGAGCCCGTTGTTGGTGCCGCTATTGCGGCACCTGTAGCGGGCCAACAAAATGTAATTGACCCCTGGATTAGAAATAATTTTGTACAAGCCCCTGGTGGAGAGTTTACAGTATCCCCTAGAAACGCTCCAGGTGAAATACTATGGAGCGCGCCCTTGGGCCCTGATCTGAATCCCTACCTTTCTCATTTGGCCAGAATGTACAATGGCTATGCAGGTGGCTTTGAAGTGCAGGTAATCCTTGCGGGGAATGCGTTCACCGCCGGGAAAATCATATTTGCAGCAGTCCCACCAAATTTCCCAACTGAAGGCTTGAGCCCCAGCCAGGTCACTATGTTCCCCCATATAATAGTAGATGTTAGGCAACTGGAGCCTG [...]
+	'AY587993_74'                  ATGAAGATGGCGTCGAATGACGCCAACCCATCTGATGGGTCCACAGCCAACCTCGTCCCAGAGGTCAACAATGAGGTTATGGCTTTGGAGCCCGTTGTTGGTGCCGCTATTGCGGCACCTGTAGCGGGCCAACAAAATGTAATTGACCCCTGGATTAGAAATAATTTTGTACAAGCCCCTGGTGGAGAGTTTACAGTATCCCCTAGAAACGCTCCAGGTGAAATACTATGGAGCGCGCCCTTGGGCCCTGATCTGAATCCCTACCTTTCTCATTTGGCCAGAATGTACAATGGCTATGCAGGTGGCTTTGAAGTGCAGGTAATCCTTGCGGGGAATGCGTTCACCGCCGGGAAAATCATATTTGCAGCAGTCCCACCAAATTTCCCAACTGAAGGCTTGAGCCCCAGCCAGGTCACTATGTTCCCCCATATAATAGTAGATGTTAGGCAACTGGAACCTG [...]
+	'AY587994_74'                  ATGAAGATGGCGTCGAATGACGCCAACCCATCTGATGGGTCCACAGCCAACCTCGTCCCAGAGGTCAACAATGAGGTTATGGCTTTGGAGCCCGTTGTTGGTGCCGCTATTGCGGCACCTGTAGCGGGCCAACAAAATGTAATTGACCCCTGGATTAGAAATAATTTTGTACAAGCCCCTGGTGGAGAGTTTACAGTATCCCCTAGAAACGCTCCAGGTGAAATACTATGGAGCGCGCCCTTGGGCCCTGATCTGAATCCCTACCTTTCTCATTTGGCCAGAATGTACAATGGCTATGCAGGTGGCTTTGAAGTGCAGGTAATCCTTGCGGGGAATGCGTTCACCGCCGGGAAAATCATATTTGCAGCAGTCCCACCAAATTTCCCAACTGAAGGCTTGAGCCCCAGCCAGGTCACTATGTTCCCCCATATAATAGTAGATGTTAGGCAACTGGAACCTG [...]
+	'AY587996_74'                  ATGAAGATGGCGTCGAATGACGCCAACCCATCTGATGGGTCCACAGCCAACCTCGTCCCAGAGGTCAACAATGAGGTTATGGCTTTGGAGCCCGTTGTTGGTGCCGCTATTGCGGCACCTGTAGCGGGCCAACAAAATGTAATTGACCCCTGGATTAGAAATAATTTTGTACAAGCCCCTGGTGGAGAGTTTACAGTATCCCCTAGAAACGCTCCAGGTGAAATACTATGGAGCGCGCCCTTGGGCCCTGATCTGAATCCCTACCTTTCTCATTTGGCCAGAATGTACAATGGCTATGCAGGTGGCTTTGAAGTGCAGGTAATCCTTGCGGGGAATGCGTTCACCGCCGGGAAAATCATATTTGCAGCAGTCCCACCAAATTTCCCAACTGAAGGCTTGAGCCCCAGCCAGGTCACTATGTTCCCCCATATAATAGTAGATGTTAGGCAACTGGAACCTG [...]
+	'AY587997_75'                  ATGAAGATGGCGTCGAATGACGCCAACCCATCTGATGGGTCCACAGCCAACCTCGTCCCAGAGGTCAACAATGAGGTTATGGCTTTGGAGCCCGTTGTTGGTGCCGCTATTGCGGCACCTGTAGCGGGCCAACAAAATGTAATTGACCCCTGGATTAGAAATAATTTTGTACAAGCCCCTGGTGGAGAGTTTACAGTATCCCCTAGAAACGCTCCAGGTGAAATACTATGGAGCGCGCCCTTGGGCCCTGATCTGAATCCCTACCTTTCTCATTTGGCCAGAATGTACAATGGCTATGCAGGTGGCTTCGAAGTGCAGGTAATCCTTGCGGGGAATGCGTTCACCGCCGGGAAAATCATATTTGCAGCAGTCCCACCAAATTTCCCAACTGAAGGCTTGAGCCCCAGCCAGGTCACTATGTTCCCCCATATAATAGTAGATGTTAGGCAACTGGAACCTG [...]
+	'AY587998_75'                  ATGAAGATGGCGTCGAATGACGCCAACCCATCTGATGGGTCCACAGCCAACCTCGTCCCAGAGGTCAACAATGAGGTTATGGCTTTGGAGCCCGTTGTTGGTGCCGCTATTGCGGCACCTGTAGCGGGCCAACAAAATGTAATTGACCCCTGGATTAGAAATAATTTTGTACAAGCCCCTGGTGGAGAGTTTACAGTATCCCCTAGAAACGCTCCAGGTGAAATACTATGGAGCGCGCCCTTGGGCCCTGATCTGAATCCCTACCTTTCTCATTTGGCCAGAATGTACAATGGCTATGCAGGTGGCTTCGAAGTGCAGGTAATCCTTGCGGGGAATGCGTTCACCGCCGGGAAAATCATATTTGCAGCAGTCCCACCAAATTTCCCAACTGAAGGCTTGAGCCCCAGCCAGGTCACTATGTTCCCCCATATAATAGTAGATGTTAGGCAACTGGAACCTG [...]
+	'AY588001_75'                  ATGAAGATGGCGTCGAATGACGCCAACCCATCTGATGGGTCCACAGCCAACCTCGTCCCAGAGGTCAACAATGAGGTTATGGCTTTGGAGCCCGTTGTTGGTGCCGCTATTGCGGCACCTGTAGCGGGCCAACAAAATGTAATTGACCCCTGGATTAGAAATAATTTTGTACAAGCCCCTGGTGGAGAGTTTACAGTATCCCCTAGAAACGCTCCAGGTGAAATACTATGGAGCGCGCCCTTGGGCCCTGATCTGAATCCCTACCTTTCTCATTTGGCCAGAATGTACAATGGCTATGCAGGTGGCTTTGAAGTGCAGGTAATCCTTGCGGGGAATGCGTTCACCGCCGGGAAAATCATATTTGCAGCAGTCCCACCAAATTTCCCAACTGAAGGCTTGAGCCCCAGCCAGGTCACTATGTTCCCCCATATAATAGTAGATGTTAGGCAACTGGAACCTG [...]
+	'AY588006_75'                  ATGAAGATGGCGTCGAATGACGCCAACCCATCTGATGGGTCCACAGCCAACCTCGTCCCAGAGGTCAACAATGAGGTTATGGCTTTGGAGCCCGTTGTTGGTGCCGCTATTGCGGCACCTGTAGCGGGCCAACAAAATGTAATTGACCCCTGGATTAGAAATAATTTTGTACAAGCCCCTGGTGGAGAGTTTACAGTATCCCCTAGAAACGCTCCAGGTGAAATACTATGGAGCGCGCCCTTGGGCCCTGATCTGAATCCCTACCTTTCTCATTTGGCCAGAATGTACAATGGCTATGCAGGTGGCTTTGAAGTGCAGGTAATCCTTGCGGGGAATGCGTTCACCGCCGGGAAAATCATATTTGCAGCAGTCCCACCAAATTTCCCAACTGAAGGCTTGAGCCCCAGCCAGGTCACTATGTTCCCCCATATAATAGTAGATGTTAGGCAACTGGAACCTG [...]
+	'AY588011_72'                  ATGAAGATGGCGTCGAATGACGCCAACCCATCTGATGGGTCCACAGCCAACCTCGTCCCAGAGGTCAACAATGAGGTTATGGCTTTGGAGCCCGTTGTTGGTGCCGCTATTGCGGCACCTGTAGCGGGCCAACAAAATGTAATTGACCCCTGGATTAGAAATAATTTTGTACAAGCCCCTGGTGGAGAGTTTACAGTATCCCCTAGAAACGCTCCAGGTGAAATACTATGGAGCGCGCCCTTGGGCCCTGATCTGAATCCCTACCTTTCTCATTTGGCCAGAATGTACAATGGCTATGCAGGTGGCTTTGAAGTGCAGGTAATCCTTGCGGGGAATGCGTTCACCGCCGGGAAAATCATATTTGCAGCAGTCCCACCAAATTTCCCAACTGAAGGCTTGAGCCCCAGCCAGGTCACTATGTTCCCCCATATAATAGTAGATGTTAGGCAACTGGAACCTG [...]
+	'AY588013_75'                  ATGAAGATGGCGTCGAATGACGCCAACCCATCTGATGGGTCCACAGCCAACCTCGTCCCAGAGGTCAACAATGAGGTTATGGCTTTGGAGCCCGTTGTTGGTGCCGCTATTGCGGCACCTGTAGCGGGCCAACAAAATGTAATTGACCCCTGGATTAGAAATAATTTTGTACAAGCCCCTGGTGGAGAGTTTACAGTATCCCCTAGAAACGCTCCAGGTGAAATACTATGGAGCGCGCCCTTGGGCCCTGATCTGAATCCCTACCTTTCTCATTTGGCCAGAATGTACAATGGCTATGCAGGTGGCTTTGAAGTGCAGGTAATCCTTGCGGGGAATGCGTTCACCGCCGGGAAAATCATATTTGCAGCAGTCCCACCAAATTTCCCAACTGAAGGCTTGAGCCCCAGCCAGGTCACTATGTTCCCCCATATAATAGTAGATGTTAGGCAACTGGAACCTG [...]
+	'AY588014_74'                  ATGAAGATGGCGTCGAATGACGCCAACCCATCTGATGGGTCCACAGCCAACCTCGTCCCAGAGGTCAACAATGAGGTTATGGCTTTGGAGCCCGTTGTTGGTGCCGCTATTGCGGCACCTGTAGCGGGCCAACAAAATGTAATTGACCCCTGGATTAGAAATAATTTTGTACAAGCCCCTGGTGGAGAGTTTACAGTATCTCCTAGAAACGCTCCAGGTGAAATACTATGGAGCGCGCCCTTGGGCCCTGATCTGAATCCCTACCTTTCTCATTTGGCCAGAATGTACAATGGTTATGCAGGTGGCTTTGAAGTGCAGGTAATCCTTGCGGGGAATGCGTTCACCGCCGGGAAAATCATATTTGCAGCAGTCCCACCAAATTTCCCAACTGAAGGCTTGAGCCCCAGCCAGGTCACTATGTTCCCCCATATAATAGTAGATGTTAGGCAACTGGAACCTG [...]
+	'AY588016_74'                  ATGAAGATGGCGTCGAATGACGCCAACCCATCTGATGGGTCCACAGCCAACCTCGTCCCAGAGGTCAACAATGAGGTTATGGCTTTGGAGCCCGTTGTTGGTGCCGCTATTGCGGCACCTGTAGCGGGCCAACAAAATGTAATTGACCCCTGGATTAGAAATAATTTTGTACAAGCCCCTGGTGGAGAGTTTACAGTATCTCCTAGAAACGCTCCAGGTGAAATACTATGGAGCGCGCCCTTGGGCCCTGATCTGAATCCCTACCTTTCTCATTTGGCCAGAATGTACAATGGTTATGCAGGTGGCTTTGAAGTGCAGGTAATCCTTGCGGGGAATGCGTTCACCGCCGGGAAAATCATATTTGCAGCAGTCCCACCAAATTTCCCAACTGAAGGCTTGAGCCCCAGCCAGGTCACTATGTTCCCCCATATAATAGTAGATGTTAGGCAACTGGAACCTG [...]
+	'AY588020_71'                  ATGAAGATGGCGTCGAATGACGCCAACCCATCTGATGGGTCCACAGCCAACCTCGTCCCAGAGGTCAACAATGAGGTTATGGCTTTGGAGCCCGTTGTTGGTGCCGCTATTGCGGCACCTGTAGCGGGCCAACAAAATGTAATTGACCCCTGGATTAGAAATAATTTTGTACAAGCCCCTGGTGGAGAGTTTACAGTATCCCCTAGAAACGCTCCAGGTGAAATACTATGGAGCGCGCCCTTGGGCCCTGATCTGAATCCCTACCTTTCTCATTTGGCCAGAATGTACAATGGCTATGCAGGTGGCTTTGAAGTGCAGGTAATCCTTGCGGGGAATGCGTTCACCGCCGGGAAAATCATATTTGCAGCAGTCCCACCAAATTTCCCAACTGAAGGCTTGAGCCCCAGCCAGGTCACTATGTTCCCCCATATAATAGTAGATGTTAGGCAACTGGAACCTG [...]
+	'AY588021_70'                  ATGAAGATGGCGTCGAATGACGCCAACCCATCTGATGGGTCCACAGCCAACCTCGTCCCAGAGGTCAACAATGAGGTTATGGCTTTGGAGCCCGTTGTTGGTGCCGCTATTGCGGCACCTGTAGCGGGCCAACAAAATGTAATTGACCCCTGGATTAGAAATAATTTTGTACAAGCCCCTGGTGGAGAGTTTACAGTATCCCCTAGAAACGCTCCAGGTGAAATACTATGGAGCGCGCCCTTGGGCCCTGATCTGAATCCCTACCTTTCTCATTTGGCCAGAATGTACAATGGCTATGCAGGTGGCTTTGAAGTGCAGGTAATCCTTGCGGGGAATGCGTTCACCGCCGGGAAAATCATATTTGCAGCAGTCCCACCAAATTTCCCAACTGAAGGCTTGAGCCCCAGCCAGGTCACTATGTTCCCCCATATAATAGTAGATGTTAGGCAACTGGAACCTG [...]
+	'AY588022_71'                  ATGAAGATGGCGTCGAATGACGCCAACCCATCTGATGGGTCCACAGCCAACCTCGTCCCAGAGGTCAACAATGAGGTTATGGCTTTGGAGCCCGTTGTTGGTGCCGCTATTGCGGCACCTGTAGCGGGCCAACAAAATGTAATTGACCCCTGGATTAGAAATAATTTTGTACAAGCCCCTGGTGGAGAGTTTACAGTATCCCCTAGAAACGCTCCAGGTGAAATACTATGGAGCGCGCCCTTGGGCCCTGATCTGAATCCCTACCTTTCTCATTTGGCCAGAATGTACAATGGCTATGCAGGTGGCTTTGAAGTGCAGGTAATCCTTGCGGGGAATGCGTTCACCGCCGGGAAAATCATATTTGCAGCAGTCCCACCAAATTTCCCAACTGAAGGCTTGAGCCCCAGCCAGGTCACTATGTTCCCCCATATAATAGTAGATGTTAGGCAACTGGAACCTG [...]
+	'AY588025_71'                  ATGAAGATGGCGTCGAATGACGCCAACCCATCTGATGGGTCCACAGCCAACCTCGTCCCAGAGGTCAACAATGAGGTTATGGCTTTGGAGCCCGTTGTTGGTGCCGCTATTGCGGCACCTGTAGCGGGCCAACAAAATGTAATTGACCCCTGGATTAGAAATAATTTTGTACAAGCCCCTGGTGGAGAGTTTACAGTATCCCCTAGAAACGCTCCAGGTGAAATACTATGGAGCGCGCCCTTGGGCCCTGATCTGAATCCCTACCTTTCTCATTTGGCCAGAATGTACAATGGCTATGCAGGTGGCTTTGAAGTGCAGGTAATCCTTGCGGGGAATGCGTTCACCGCCGGGAAAATCATATTTGCAGCAGTCCCACCAAATTTCCCAACTGAAGGCTTGAGCCCCAGCCAGGTCACTATGTTCCCCCATATAATAGTAGATGTTAGGCAACTGGAACCTG [...]
+	'AY588026_76'                  ATGAAGATGGCGTCGAATGACGCCAACCCATCTGATGGGTCCACAGCCAACCTCGTCCCAGAGGTCAACAATGAGGTTATGGCTTTGGAGCCCGTTGTTGGTGCCGCTATTGCGGCACCTGTAGCGGGCCAACAAAATGTAATTGACCCCTGGATTAGAAATAATTTTGTACAAGCCCCTGGTGGAGAGTTTACAGTATCCCCTAGAAACGCTCCAGGTGAAATACTATGGAGCGCGCCCTTGGGCCCTGATCTGAATCCCTACCTTTCTCATTTGGCCAGAATGTACAATGGCTATGCAGGTGGCTTTGAAGTGCAGGTAATCCTTGCGGGGAATGCGTTCACCGCCGGGAAAATCATATTTGCAGCAGTCCCACCAAATTTCCCAACTGAAGGCTTGAGCCCCAGCCAGGTCACTATGTTCCCCCATATAATAGTAGATGTTAGGCAACTGGAACCTG [...]
+	'AY588027_70'                  ATGAAGATGGCGTCGAATGACGCCAACCCATCTGATGGGTCCACAGCCAACCTCGTCCCAGAGGTCAACAATGAGGTTATGGCTTTGGAGCCCGTTGTTGGTGCCGCTATTGCGGCACCTGTAGCGGGCCAACAAAATGTAATTGACCCCTGGATTAGAAATAATTTTGTACAAGCCCCTGGTGGAGAGTTTACAGTATCCCCTAGAAACGCTCCAGGTGAAATACTATGGAGCGCGCCCTTGGGCCCTGATCTGAATCCCTACCTTTCTCATTTGGCCAGAATGTACAATGGCTATGCAGGTGGCTTTGAAGTGCAGGTAATCCTTGCGGGGAATGCGTTCACCGCCGGGAAAATCATATTTGCAGCAGTCCCACCAAATTTCCCAACTGAAGGCTTGAGCCCCAGCCAGGTCACTATGTTCCCCCATATAATAGTAGATGTTAGGCAACTGGAACCTG [...]
+	'AY588028_69'                  ATGAAGATGGCGTCGAATGACGCCAACCCATCTGATGGGTCCACAGCCAACCTCGTCCCAGAGGTCAACAATGAGGTTATGGCTTTGGAGCCCGTTGTTGGTGCCGCTATTGCGGCACCTGTAGCGGGCCAACAAAATGTAATTGACCCCTGGATTAGAAATAATTTTGTACAAGCCCCTGGTGGAGAGTTTACAGTATCCCCTAGAAACGCTCCAGGTGAAATACTATGGAGCGCGCCCTTGGGCCCTGATCTGAATCCCTACCTTTCTCATTTGGCCAGAATGTACAATGGCTATGCAGGTGGCTTTGAAGTGCAGGTAATCCTTGCGGGGAATGCGTTCACCGCCGGGAAAATCATATTTGCAGCAGTCCCACCAAATTTCCCAACTGAAGGCTTGAGCCCCAGCCAGGTCACTATGTTCCCCCATATAATAGTAGATGTTAGGCAACTGGAACCTG [...]
+	'AY588029_68'                  ATGAAGATGGCGTCGAATGACGCCAACCCATCTGATGGGTCCACAGCCAACCTCGTCCCAGAGGTCAACAATGAGGTTATGGCTTTGGAGCCCGTTGTTGGTGCCGCTATTGCGGCACCTGTAGCGGGCCAACAAAATGTAATTGACCCCTGGATTAGAAATAATTTTGTACAAGCCCCTGGTGGAGAGTTTACAGTATCCCCTAGAAACGCTCCAGGTGAAATACTATGGAGCGCGCCCTTGGGCCCTGATCTGAATCCCTACCTTTCTCATTTGGCCAGAATGTACAATGGCTATGCAGGTGGCTTTGAAGTGCAGGTAATCCTTGCGGGGAATGCGTTCACCGCCGGGAAAATCATATTTGCAGCAGTCCCACCAAATTTCCCAACTGAAGGCTTGAGCCCCAGCCAGGTCACTATGTTCCCCCATATAATAGTAGATGTTAGGCAACTGGAACCTG [...]
+	'AY588030_71'                  ATGAAGATGGCGTCGAATGACGCCAACCCATCTGATGGGTCCACAGCCAACCTCGTCCCGGAGGTCAACAATGAGGTTATGGCTTTGGAGCCCGTTGTTGGTGCCGCTATTGCGGCACCTGTAGCGGGCCAACAAAATGTAATTGACCCCTGGATTAGAAATAATTTTGTACAAGCCCCTGGTGGAGAGTTTACAGTATCCCCTAGAAACGCTCCAGGTGAAATACTATGGAGCGCGCCCTTGGGCCCTGATCTGAATCCCTACCTTTCTCATTTGGCCAGAATGTACAATGGCTATGCAGGTGGCTTTGAAGTGCAGGTAATCCTTGCGGGGAATGCGTTCACCGCCGGGAAAATCATATTTGCAGCAGTCCCACCAAATTTCCCAACTGAAGGCTTGAGCCCCAGCCAGGTCACTATGTTCCCCCATATAATAGTAGATGTTAGGCAACTGGAACCTG [...]
+	'DQ078794_56'                  ATGAAGATGGCGTCGAATGACGCCACCCCATCTGATGGGTCCACAGCCAACCTCGTCCCAGAGGTCAACAATGAGGTTATGGCTTTGGAGCCCGTTGTTGGTGCCGCGATTGCGGCACCTGTAGCGGGCCAACAAAATGTAATTGACCCCTGGATTAGAAATAATTTTGTACAAGCCCCTGGTGGAGAGTTTACAGTATCCCCTAGAAACGCTCCAGGTGAAATATTATGGAGCGCGCCCTTGGGCCCTGATTTGAATCCCTACCTTTCCCATTTGGCCAGAATGTACAATGGTTATGCAGGTGGTTTTGAAGTGCAGGTAATCCTCGCGGGGAACGCGTTCACCGCCGGGAAAATCATATTTGCAGCAGTCCCACCAAACTTCCCAACTGAAGTCTTGAGCCCCAGCCAGGTCACTATGTTCCCCCATATAATAGTAGATGTTAGGCAACTGGAACCTG [...]
+	'DQ364459_78'                  ATGAAGATGGCGTCGAATGACGCCAGCTCATCTGATGGGTCTACAGCAAACCTCGTCCCAGAGGTCAACAATGAGGTTATGGCTTTGGAGCCCGTTGTTGGTGCCGCAATTGCGGCACCTGTAGCGGGCCAACAAAATGTAATTGACCCCTGGATTAGAAATAATTTTGTACAAGCCCCTGGTGGAGAGTTCACAGTATCCCCTAGAAACGCTCCAGGTGAAATACTATGGAGCGCGCCCTTGGGCCCTGATCTGAATCCCTACCTTTCTCATTTGGCCCGAATGTACAATGGTTATGCAGGTGGTTTTGAAGTGCAGGTAATCCTCGCGGGGAACGCGTTCACCGCCGGTAAAATCATATTTGCAGCAGTCCCACCAAATTTTCCAACTGAAGGCTTGAGCCCCAGCCAGGTCACCATGTTCCCCCATATAATAGTAGATGTTAGACAACTGGAACCTG [...]
+	'DQ369797_2003ASIA_90'         ATGAAGATGGCGCCGAATGACGCCAGCCCATCTGATGGGTCCACAGCCAACCTCGTCCCAGAGGTCAACAATGAGGTTATGGCTTTGGAGCCCGTTGTTGGTGCCGCTATTGCGGCACCTGTAGCGGGCCAACAAAATGTAATTGACCCCTGGATTAGGAATAATTTTGTGCAAGCCCCTGGTGGAGAGTTCACAGTATCCCCTAGAAACGCTCCAGGTGAAATACTATGGAGCGCGCCCTTAGGCCCTGATCTGAATCCATACCTTTCTCACCTGGCCAGAATGTACAATGGTTATGCAGGTGGTTTTGAAGTGCAGGTAATCCTCGCGGGGAACGCGTTCACCGCCGGGAAAATCATATTTGCAGCAGTCCCACCAAATTTCCCAACTGAAGGCTTGAGCCCCAGCCAGGTCACTATGTTCCCCCACATAATAGTAGATGTTAGGCAATTGGAACCTG [...]
+	'DQ415279_CARLOW_78'           ATGAAGATGGCGTCGAATGACGCCAACCCATCTGATGGGTCCACAGCCAACCTCGTCCCAGAGGTCAACAATGAGGTTATGGCTTTGGAGCCCGTTGTTGGTGCCGCTATTGCGGCACCTGTAGCGGGCCAACAAAATGTAATTGACCCCTGGATTAGAAATAATTTTGTACAAGCCCCTGGTGGAGAGTTTACAGTGTCCCCTAGAAACGCTCCAGGTGAAATACTATGGAGCGCGCCCTTGGGCCCTGATCTGAATCCCTACCTTTCTCATTTAGCCAGAATGTACAATGGCTATGCAGGTGGCTTTGAAGTGCAGGTAATCCTTGCGGGGAATGCGTTCACCGCCGGGAAAATCATATTTGCAGCAGTCCCACCAAATTTCCCAACTGAAGGCTTAAGCCCCAGCCAGGTCACTATGTTCCCCCATGTAATAGTAGATGTTAGGCAACTGGAACCTG [...]
+	'DQ419907_56'                  ATGAAGATGGCGTCGAATGACGCCAGCCCATCTGATGGGTCCACAGCCAACCTCGTCCCAGAGGTCAACAATGAGGTTATGGCTTTGGAGCCCGTTGTTGGTGCCGCTATTGCGGCACCTGTAGCGGGCCAACAGAATGTAATTGACCCCTGGATTAGGAATAGTTCTGTACAAGCCCCTGGTGGAGAGTTCACAGTATCCCCTAGAGACGCTCCAGGTGAAATACTATGGAGCGCGCCCTTAGGCCCTGATCTGAATCCATACCTTTCTCACCTGGCCAGAATGTACAATGGTTATGCAGGTGGTTTTGAAGTGCAGGTAATCCTCGCGGGGAACGCGTTCACCGCCGGGAAAATCATATTTGCAGCAGCCCCACCAAATTTCCCAACTGAAGGCTTGAGCCCCAGCCAGGTCACTATGTTCCCCCACATAATAGTAGGTGTTAGGCAATTGGAACCTG [...]
+	'DQ419908_56'                  ATGAAGATGGCGTCGAATGACGCCAGCCCATCTGATGGGTCCACAGCCAACCTCGTCCCAGAGGTCAACAATGAGGTTATGGCTTTGGAGCCCGTTGTTGGTGCCGCTATTGCGGCACCTGTAGCGGGCCAACAAAATGTAATTGACCCCTGGATTAGGAATAATTTTGTACAAGCCCCTGGTGGAGAGTTCACAGTATCCCCTAGAAACGCTCCAGGTGAAATACTATGGAGCGCGCCCTTAGGCCCTGATCTGAATCCATACCTTTCTCACCTGGCCAGAATGTACAATGGTTATGCAGGTGGTTTTGAAGTGCAGGTAATCCTCGCGGGGAACGCGTTCACCGCCGGGAAAATCATATTTGCAGCAGTCCCACCAAATTTCCCAACTGAAGGCTTGAGCCCCAGCCAGGTCACTATGTTCCCCCACATAATAGTAGATGTTAGGCAATTGGAACCTG [...]
+	'EF187497_33'                  ATGAAGATGGCGTCGAGTGACGCCAACCCATCTGATGGGTCCACAGCCAACCTCGTCCCAGAGGTCAACAATGAGGTTATGGCTTTGGAGCCCGTTGTTGGTGCCGCTATCGCGGCACCTGTAGCGGGCCAACAAAATGTAATTGACCCCTGGATTAGAAATAATTTTGTACAAGCCCCTGGTGGAGAGTTTACAGTATCCCCTAGAAACGCTCCAGGTGAAATACTATGGAGCGCGCCCTTGGGCCCTGATTTGAATCCCTACCTTTCCCACTTGGCCAGAATGTACAATGGTTATGCAGGTGGTTTTGAAGTGCAGGTAATTCTCGCGGGGAACGCGTTCACCGCTGGAAAAATTGTATTTGCAGCAGTCCCACCAAATTTCCCAACTGAAGGCTTGAGCCCCAGCCAGGTCACTATGTTCCCCCATATAATAGTAGATGTTAGGCAACTGGAACCTG [...]
+	'EF535854_30'                  ATGAAGATGGCGACGAATGACGCCAGCCCATCTGATGGGTCCACAGCCAACCTCGTCCCAGAGGTCAACAATGAGGTTATGGCTTTGGAGCCCGTTGTTGGTGCCGCTATTGCGGCACCTGTAGCGGGCCAACAAAATGTAATTGACCCCTGGATTAGGAATAATTTTGTACAAGCCCCTGGTGGAGAGTTCACAGTATCCCCTAGAAACGCTCCAGGTGAAATACTATGGAGCGCGCCCTTAGGCCCTGATCTGAATCCATACCTTTCTCACCTGGCCAGAATGTACAATGGTTATGCAGGTGGTTTTGAAGTGGAGGTAATCCTCGCGGGGAACGCGTTCACCGCCGGGAAGATCATATTTGCAGCAGTCCCACCAAATTTCCCAACTGAAGGCTTGAGCCCCAGCCAGGTCACTATGTTCCCCCACATAATAGTAGATGTTAGGCAATTGGAACCTG [...]
+	'EF684915_30'                  ATGAAGATGGCGTCGAATGACGCCAACCCATCTGATGGGTCCGCAGCCAACCTCGTCCCAGAGGTCAACAATGAGGTTATGGCTTTGGAGCCCGTTGTCGGTGCCGCTATTGCGGCGCCTGTAGCGGGCCAACAAAATGTAATTGACCCCTGGATTAGAAATAATTTTGTACAAGCCCCTGGTGGAGAGTTCACAGTATCCCCTAGAAACGCTCCAGGTGAAATACTATGGAGCGCGCCCTTAGGCCCTGATCTGAATCCCTACCTATCTCATTTGGCCAGAATGTATAATGGTTATGCAGGTGGTTTTGAAGTGCAGGTGATCCTCGCGGGGAACGCGTTCACCGCCGGAAAAATTATATTTGCAGCAGTCCCACCAAATTTTCCAACTGAAGGCTTGAGCCCCAGTCAGGTCACTATGTTCCCCCACATAATAGTAGATGTTAGGCAATTGGAACCTG [...]
+	'EP2002022_84'                 ATGAAGATGGCGTCCAATGACGCCAACCCATCTGATGGGTCCACAGCCAACCTCGTCCCAGAGGTCAACAATGAGGTTATGGCTTTGGAGCCCGTTGTTGGTGCCGCTATTGCGGCACCTGTAGCGGGCCAACAAAATGTAATTGACCCCTGGATTAGAAATAATTTTGTACAAGCCCCTGGTGGAGAGTTTACAGTATCCCCTAGAAACGCTCCAGGTGAAATACTATGGAGCGCGCCCTTGGGCCCTGATTTGAATCCCTACCTTTCTCATTTGGCCAGAATGTACAATGGCTATGCAGGTGGCTTTGAAGTGCAGGTAATCCTTGCGGGGAATGCGTTCACCGCCGGGAAAATCATATTTGCAGCAGTCCCACCAAATTTCCCAACTGAAGGCTTGAGCCCCAGCCAGGTCACTATGTTCCCCCATATAATAGTAGATGTTAGGCAACTGGAACCTG [...]
+	'EU096512_30'                  ATGAAGATGGCGTCGAATGACGCCAACCCATCTGATGGGTCCGCAGCCAACCTCGTCCCAGAGGTCAACAATGAGGTTATGGCTTTGGAGCCCGTTGTCGGTGCCGCTATTGCGGCGCCTGTAGCGGGCCAACAAAATGTAATTGACCCCTGGATTAGAAACAATTTTGTACAAGCCCCTGGTGGAGAGTTCACAGTATCCCCTAGAAACGCTCCAGGTGAAATACTATGGAGCGCGCCCTTAGGCCCTGATCTGAATCCCTACCTATCTCATTTGGCCAGAATGTATAATGGTTATGCAGGTGGTTTTGAAGTGCAGGTGATCCTCGCGGGGAACGCGTTCACCGCCGGAAAAATTATATTTGCAGCAGTCCCACCAAATTTTCCAACTGAAGGCTTGAGTCCCAGCCAGGTCACTATGTTCCCCCACATAATAGTAGATGTTAGGCAATTGGAACCTG [...]
+	'EU096513_18'                  ATGAAGATGGCGTCGAATGACGCCAACCCATCTGATGGGTCCGCAGCCAACCTCGTCCCAGAGGTCAACAATGAGGTTATGGCTTTGGAGCCCGTTGTCGGTGCCGCTATTGCGGCGCCTGTAGCGGGCCAACAAAATGTAATTGACCCCTGGATTAGAAACAATTTTGTACAAGCCCCTGGTGGAGAGTTCACAGTATCCCCCAGAAACGCTCCAGGTGAAATACTATGGAGCGCGCCCTTAGGCCCTGACCTGAATCCCTACCTATCTCATTTGGCCAGAATGTATAATGGTTATGCAGGTGGTTTTGAAGTGCAGGTGATCCTCGCGGGGAACGCGTTCACCGCCGGAAAAATTATATTTGCAGCAGTCCCACCAAATTTTCCAACTGAAGGCTTGAGTCCCAGCCAGGTCACTATGTTCCCCCACATAATAGTAGATGTTAGGCAATTGGAACCTG [...]
+	'EU310927_78'                  ATGAAGATGGCGTCGAGTGACGCCAGCCCATCTGATGGGTCCACAGCCAACCTCGTCCCAGAGGTCAACAATGAGGTTATGGCTTTGGAGCCCGTTGTTGGTGCCGCAATTGCGGCACCTGTAGCGGGCCAACAAAATGTAATTGACCCCTGGATTAGAAATAATTTTGTACAAGCCCCTGGTGGAGAGTTCACAGTATCCCCTAGAAACGCTCCAGGTGAAATACTATGGAGCGCGCCCTTGGGCCCTGATCTGAATCCCTACCTTTCTCATTTGGCCAGAATGTACAATGGTTATGCAGGTGGTTTTGAAGTGCAGGTAATTCTCGCGGGGAACGCGTTCACCGCCGGGAAAATCATATTTGCAGCAGTCCCACCAAATTTCCCAACTGAAGGCTTGAGCCCCAGCCAGGTCACTATGTTCCCCCATATAATAGTAGATGTTAGGCAACTGGAACCTG [...]
+	'EU366113_30'                  ATGAAGATGGCGTCGAATGACGCCAACCCATCTGATGGGTCCGCAGCCAACCTCGTCCCAGAGGTCAACAATGAGGTTATGGCTTTGGAGCCCGTTGTCGGTGCCGCTATTGCGGCGCCTGTAGCGGGCCAACAAAATGTAATTGACCCCTGGATTAGAAATAATTTTGTACAAGCCCCTGGTGGAGAGTTCACAGTATCCCCTAGAAACGCTCCAGGTGAAATACTATGGAGCGCGCCCTTAGGCCCTGATCTGAATCCCTACCTATCTCATTTGGCCAGAATGTATAATGGTTATGCAGGTGGTTTTGAAGTGCAGGTGATCCTCGCGGGGAACGCGTTCACCGCCGGAAAAATTATATTTGCAGCAGTCCCACCAAATTTTCCAACTGAAGGCTTGAGTCCCAGCCAGGTCACTATGTTCCCCCACATAATAGTGGATGTTAGGCAATTGGAACCTG [...]
+	'OB2003001_73'                 ATGAAGATGGCGTCGAATGACGCCAACCCATCTGATGGGTCCACAGCCAACCTCGTCCCAGAGGTCAACAATGAGGTTATGGCTTTGGAGCCCGTTGTTGGTGCCGCTATTGCGGCACCTGTAGCGGGCCAACAAAATGTAATTGACCCCTGGATTAGAAATAATTTTGTACAAGCCCCTGGTGGAGAGTTTACAGTATCCCCTAGAAACGCTCCAGGTGAAATACTATGGAGCGCGCCCTTGGGCCCTGATCTGAATCCCTACCTTTCTCATTTGGCCAGAATGTACAATGGCTATGCAGGTGGCTTTGAAGTGCAGGTAATCCTTGCGGGGAATGCGTTCACCGCCGGGAAAATTATATTTGCAGCAGTCCCACCAAATTTCCCAACTGAAGGCTTGAGCCCCAGCCAGGTCACTATGTTTCCCCATATAATAGTAGATGTTAGGCAACTGGAACCTG [...]
+	'OB2003003_73'                 ATGAAGATGGCGTCGAATGACGCCACCCCATCTGATGGGTCCACAGCCAACCTCGTCCCAGAGGTCAACAATGAGGTTATGGCTTTGGAGCCCGTTGTTGGTGCCGCTATTGCGGCACCTGTAGCGGGCCAACAAAATGTAATTGACCCCTGGATTAGAAATAATTTTGTACAAGCCCCTGGTGGAGAGTTTACAGTATCCCCTAGAAACGCTCCAGGTGAAATACTATGGAGCGCGCCCTTGGGCCCTGATCTGAATCCCTACCTTTCTCATTTGGCCAGAATGTACAATGGCTATGCAGGTGGCTTTGAAGTGCAGGTAGTCCTTGCGGGGAATGCGTTCACCGCCGGGAAAATCATATTTGCAGCAGTCCCACCAAATTTCCCAACTGAAGGCTTGAGCCCCAGCCAGGTCACTATGTTCCCCCATATAATAGTAGATGTTAGGCAACTGGAACCTG [...]
+	'OB2003023_71'                 ATGAAGATGGCGTCGAATGACGCCAACCCATCTGATGGGTCCGCAGCCAACCTCGTCCCAGAGGTCAACAATGAGGTTATGGCTTTGGAGCCCGTTGTTGGTGCCGCTATTGCGGCACCTGTAGCGGGCCAACAAAACGTAATTGACCCCTGGATTAGAAATAATTTTGTACAAGCCCCTGGTGGAGAGTTTACAGTATCCCCTAGAAACGCTCCAGGTGAAATACTATGGAGCGCGCCTTTGGGCCCTGATCTGAATCCCTACCTTTCTCACTTGGCCAGAATGTACAATGGCTATGCAGGTGGCTTTGAAGTGCAGGTAATCCTTGCGGGGAATGCGTTCACCGCCGGGAAAATCATATTTGCAGCAGTCCCACCAAATTTCCCAACTGAAGGCTTGAGCCCCAGCCAGGTCACTATGTTCCCCCATATAATAGTAGATGTTAGGCAACTGGAACCTG [...]
+	'OB2003LN457_63'               ATGAAGATGGCGTCGAATGACGCCACCCCATCTGATGGGTCCACAGCCAACCTCGTCCCAGAGGTCAACAATGAGGTTATGGCTTTGGAGCCCGTTGTTGGTGCCGCTATTGCGGCACCTGTAGCGGGCCAACAAAATGTAATTGACCCCTGGATTAGAAATAATTTTGTACAAGCCCCTGGTGGAGAGTTTACAGTGTCCCCTAGAAACGCTCCAGGTGAAATATTATGGAGCGCGCCCTTGGGCCCTGATTTGAATCCCTACCTTTCTCATTTGGCCAGAATGTACAATGGCTATGCAGGTGGCTTTGAAGTGCAGGTAATCCTTGCGGGGAATGCGTTCACCGCCGGGAAAATCATATTTGCAGCAGTCCCACCAAATTTCCCAACTGAAGGCTTGAGCCCCAGCCAGGTCACTATGTTCCCCCATATAATAGTAGATGTTAGGCAACTGGAACCTG [...]
+	'OB2004003_61'                 ATGAAGATGGCGTCGAATGACGCCAACCCATCTGATGGGTCCACAGCCAACCTCGTCCCAGAGGTCAACAATGAGGTTATGGCTTTGGAGCCCGTTGTTGGTGCCGCTATTGCGGCACCTGTAGCGGGCCAACAAAATGTAATTGACCCCTGGATTAGAAATAATTTTGTACAAGCCCCTGGTGGAGAGTTTACAGTATCCCCTAGAAACGCTCCAGGTGAAATACTATGGAGCGCGCCCTTGGGCCCTGATCTGAATCCCTACCTTTCTCATTTGGCCAGAATGTACAATGGCTATGCAGGTGGCTTTGAAGTGCAGGTAATCCTTGCGGGGAATGCGTTCACCGCCGGGAAAATCATATTTGCAGCAGTCCCACCAAATTTCCCAACTGAAGGCTTGAGCCCCAGCCAGGTCACTATGTTCCCCCATATAATAGTAGATGTTAGGCAACTGGAACCTG [...]
+	'OB2004007_60'                 ATGAAGATGGCGTCGAATGACGCCAACCCATCTGATGGGTCCACAGCCAACCTCGTCCCAGAGGTCAACAATGAGGTTATGGCTTTGGAGCCCGTTGTTGGTGCCGCTATTGCGGCACCTGTAGCGGGCCAACAAAATGTAATTGACCCCTGGATTAGAAATAATTTTGTACAAGCCCCTGGTGGAGAGTTTACAGTATCCCCTAGAAACGCTCCAGGTGAAATACTATGGAGCGCGCCCTTGGGCCCTGATCTGAATCCCTACCTTTCTCACTTGGCCAGAATGTACAATGGCTATGCAGGTGGCTTTGAAGTGCAGGTAATCCTTGCGGGGAATGCGTTCACCGCCGGGAAAATCATATTTGCAGCAGTCCCACCAAGTTTCCCAACTGAAGGCTTGAGCCCCAGCCAAGTTACTATGTTCCCCCATATAATAGTAGATGTTAGGCAACTGGAACCTG [...]
+	'OB2004012_59'                 ATGAAGATGGCGTCGAATGACGCCACCCCATCTGATGGGTCCACAGCCAACCTCGTCCCAGAGGTCAACAATGAGGTTATGGCTCTGGAGCCCGTTGTTGGTGCCGCTATTGCGGCACCTGTAGCGGGCCAACAGAATGTAATTGACCCCTGGATTAGAAATAATTTTGTACAAGCCCCTGGTGGAGAGTTTACAGTATCCCCTAGAAACGCTCCAGGTGAAATACTATGGAGCGCGCCCTTGGGCCCTGATCTGAATCCTTACCTTTCTCATTTGGCCAGAATGTACAATGGCTATGCAGGTGGCTTTGAAGTGCAGGTAATCCTTGCGGGGAATGCGTTCACCGCCGGGAAAATCATATTTGCAGCAGTCCCACCAAGTTTCCCAACTGAAGGCTTGAGCCCCAGCCAGGTTACTATGTTCCCCCATATAATAGTAGATGTTAGGCAACTGGAACCTG [...]
+	'OB2004028_57'                 ATGAAGATGGCGTCGAATGACGCCACCCCATCTGATGGGTCCACAGCCAACCTCGTCCCAGAGGTCAACAATGAGGTTATGGCTTTGGAGCCCGTTGTTGGTGCCGCTATTGCGGCACCTGTAGCGGGCCAACAAAATGTAATTGACCCCTGGATTAGAAATAACTTTGTACAAGCCCCTGGTGGAGAGTTTACAGTATCCCCTAGAAACGCTCCAGGTGAAATATTATGGAGCGCGCCCTTGGGCCCTGATTTGAATCCCTACCTTTCCCATTTGGCCAGAATGTATAATGGTTATGCAGGTGGTTTTGAAGTGCAGGTAATCCTAGCGGGGAACGCGTTCACCGCCGGGAAAATCATATTTGCAGCAGTCCCACCAAATTTCCCAACTGAAGGCTTGAGCCCCAGCCAGGTCACTATGTTCCCCCATATAATAGTAGATGTTAGGCAGCTGGAACCTG [...]
+	'OB2004039_56'                 ATGAAGATGGCGTCGAATGACGCCACCCCATCTGATGGGTCCACAGCCAACCTCGTCCCAGAGGTCAACAATGAGGTTATGGCTTTGGAGCCCGTTGTTGGTGCCGCTATTGCGGCACCTGTAGCGGGCCAACAAAATGTAATTGACCCCTGGATTAGAAATAATTTTGTACAAGCCCCTGGTGGAGAGTTTACAGTGTCCCCTAGAAACGCTCCAGGTGAAATATTATGGAGCGCGCCCTTGGGCCCTGATTTGAATCCCTACCTTTCCCATTTGGCCAGAATGTACAATGGTTATGCAGGTGGTTTTGAAGTGCAGGTAATCCTCGCGGGGAACGCGTTCACCGCCGGGAAAATCATATTTGCAGCAGTCCCACCAAATTTCCCAACTGAAGGCTTGAGCCCCAGCCAGGTCACTATGTTCCCCCATATAATAGTAGATGTTAGGCAACTGGAACCTG [...]
+	'OB2004048_54'                 ATGAAGATGGCGTCGAATGACGCCACCCCATCTGATGGGTCCACAGCCAACCTCGTCCCAGAGGTCAACAATGAGGTTATGGCTTTGGAGCCCGTTGTTGGTGCCGCTATTGCGGCACCTGTAGCGGGCCAACAAAATGTAATTGACCCCTGGATTAGAAATAATTTTGTACAAGCCCCTGGTGGAGAGTTTACAGTATCCCCTAGAAACGCTCCAGGTGAAATATTATGGAGTGCGCCCTTGGGCCCTGATTTGAATCCCTACCTTTCCCATTTGGCCAGAATGTACAATGGTTATGCAGGTGGTTTTGAAGTGCAGGTAATCCTCGCGGGGAACGCGTTCACCGCCGGGAAAATCATATTTGCAGCAGTCCCACCAAATTTCCCAACTGAAGGCTTGAGCCCCAGCCAGGTCACTATGTTCCCCCATATAATAGTAGATGTTAGGCAACTGGAACCTG [...]
+	'OB2004059_52'                 ATGAAGATGGCGTCGAATGACGCCACCCCATCTGATGGGTCCACAGCCAACCTCGTCCCAGAGGTCAACACTGAGGTTATGGCTTTGGAGCCCGTTGTTGGCGCCGCGATTGCGGCACCTGTAGCGGGCCAACAAAATGTAATTGACCCCTGGATTAGAAATAATTTTGTGCAAGCCCCTGGTGGAGAGTTTACAGTATCCCCTAGAAACGCTCCAGGTGAAATATTATGGAGCGCGCCCTTGGGCCCTGATTTGAATCCCTACCTTTCCCATTTGGCCAGAATGTACAATGGTTATGCAGGTGGTTTTGAAGTGCAGGTGATCCTCGCGGGGAACGCGTTCACCGCCGGGAAAATCATATTTGCAGCAGTCCCACCAAATTTCCCAACTGAAGGCTTGAGCCCCAGCCAGGTCACTATGTTCCCCCATATAATAGTAGATGTTAGGCAACTGGAACCTG [...]
+	'OB2004083_51'                 ATGAAGATGGCGTCGAATGACGCCACCCCATCTGATGGGTCCACAGCCAACCTCGTCCCAGAGGTCAACAATGAGGTTATGGCTTTGGAGCCCGTTGTTGGCGCCGCGATTGCGGCACCTGTAGCGGGCCAACAAAATGTAATTGACCCCTGGATTAGAAATAATTTTGTGCAAGCCCCTGGTGGAGAGTTTACAGTATCCCCTAGAAACGCTCCAGGTGAAATATTATGGAGCGCGCCCTTGGGCCCTGATTTGAATCCCTACCTTTCCCATTTGGCCAGAATGTACAATGGTTATGCAGGTGGTTTTGAAGTGCAGGTGATCCTCGCGGGGAACGCGTTCACCGCCGGGAAAATCATATTTGCAGCAGTCCCACCAAATTTCCCAACTGAAGGCTTGAGCCCCAGCCAGGTCACTATGTTCCCCCATATAATAGTAGATGTTAGGCAACTGGAACCTG [...]
+	'OB2006038_35'                 ATGAAGATGGCGTCGAGTGACGCCAACCCATCTGATGGGTCCACAGCCAACCTCGTCCCAGAGGTCAACAATGAGGTTATGGCTTTGGAGCCCGTTGTTGGTGCCGCTATTGCGGCACCTGTAGCGGGCCAACAAAATGTAATTGACCCCTGGATTAGAAATAATTTTGTACAAGCCCCTGGTGGAGAGTTTACAGTATCCCCTAGAAACGCTCCAGGTGAAATACTATGGAGCGCGCCCTTGGGCCCTGATTTGAACCCCTACCTTTCCCATTTGGCCAGAATGTACAATGGTTATGCAGGTGGCTTTGAAGTGCAGGTGATCCTCGCGGGGAACGCGTTCACTGCCGGGAAAATCATATTTGCAGCAGTCCCACCAAATTTCCCAACTGAAGGCTTGAGCCCCAGCCAGGTCACTATGTTCCCCCATATAATAGTAGATGTTAGGCAACTGGAACCTG [...]
+	'OB2006046_35'                 ATGAAGATGGCGTCGAATGACGCCACCCCATCTGATGGGTCCACAGCCAACCTCGTCCCAGAGGTCAACAATGAGGTTATGGCTTTGGAGCCCGTTGTTGGTGCCGCCATTGCGGCACCCGTAGCGGGCCAACAAAATGTAATTGACCCCTGGATTAGAAATAATTTTGTACAAGCCCCTGGTGGAGAGTTTACAGTATCCCCTAGAAACGCTCCAGGTGAAATATTATGGAGCGCGCCCTTGGGCCCTGATTTGAATCCCTACCTTTCCCATTTGGCCAGAATGTACAATGGTTATGCAGGTGGTTTTGAAGTGCAGGTAATCCTCGCGGGGAACGCGTTCACCGCCGGGAAGATCATATTTGCAGCAGTCCCACCAAATTTCCCAACTGAAGGCTTGAGCCCCAGCCAGGTCACTATGTTCCCCCATATAATAGTAGATGTTAGGCAACTGGAACCTG [...]
+	'OB2006054_35'                 ATGAAGATGGCGTCGAATGACGCCACCCCATCTGATGGGTCTACAGCCAACCTCGTCCCAGAGGTCAACAATGAGGTTATGGCTTTGGAGCCCGTTGTTGGTGCCGCTATTGCGGCACCTGTAGCGGGCCAACAAAATGTAATTGACCCCTGGATTAGAAATAATTTTGTACAAGCCCCTGGTGGGGAGTTTACAGTATCCCCTAGAAACGCTCCAGGTGAAATATTATGGAGCGCACCCTTGGGCCCTGATTTGAATCCCTACCTTTCCCATTTGGCCAGAATGTATAATGGTTATGCAGGTGGTTTTGAAGTGCAGGTAATCCTCGCGGGGAACGCGTTCACCGCCGGAAAAATCATATTTGCAGCAGTCCCACCAAATTTCCCAACTGAAGGCTTGAGCCCTAGCCAGGTCACTATGTTCCCCCATATAATAGTAGATGTTAGGCAGCTGGAACCTG [...]
+	'OB2006070_34'                 ATGAAGATGGCGTCGAGTGACGCCAACCCATCTGATGGGTCCACAGCCAACCTCGTCCCAGAGGTCAACAATGAGGTTATGGCTTTGGAGCCCGTTGTTGGTGCCGCTATTGCGGCACCTGTAGCGGGCCAACAAAATGTAATTGACCCCTGGATTAGAAATAATTTTGTACAAGCCCCTGGTGGAGAGTTTACAGTATCCCCTAGAAACGCTCCAGGTGAAATACTATGGAGCGCGCCCTTGGGCCCTGATTTGAATCCCTACCTTTCCCATTTGGCCAGAATGTACAATAGTTATGCAGGTGGTTTTGAAGTGCAGGTAATCCTCGCGGGGAACGCGTTCACCGCCGGAAAAATCATATTTGCAGCAGTCCCACCAAATTTCCCAACTGAAGGCTTGAGCCCCAGCCAGGTCACTATGTTCCCCCATATAATAGTAGATGTTAGGCAACTGGAACCTG [...]
+	'OB2006089_33'                 ATGAAGATGGCGTCGAATGACGCCAACCCATCTGATGGGTCCGCAGCCAACCTCGTCCCAGAGGTCAATAATGAGGTTATGGCTTTGGAGCCCGTTGTCGGTGCCGCTATTGCGGCGCCTGTAGCGGGCCAACAAAATGTAATTGACCCCTGGATTAGAAATAATTTTGTACAAGCCCCTGGTGGAGAGTTCACAGTATCCCCTAGAAACGCTCCAGGTGAAATACTATGGAGCGCGCCCTTAGGCCCTGATTTGAATCCCTACCTATCTCATTTGGCCAGAATGTATAATGGTTATGCAGGTGGTTTTGAAGTGCAGGTGATCCTCGCGGGGAACGCGTTCACCGCCGGAAAAATTATATTTGCAGCAGTCCCACCAAATTTTCCAACTGAAGGCTTGAGTCCCAGCCAGGTCACTATGTTCCCCCACATAATAGTAGATGTTAGGCAATTGGAACCTG [...]
+	'OB2006115_32'                 ATGAAGATGGCGTCGAATGACGCCAACCCATCTGATGGGTCCGCAGCCAACCTCGTCCCAGAGGTCAACAATGAGGTTATGGCTTTGGAGCCCGTTGTCGGTGCCGCTATTGCGGCGCCTGTAGCGGGCCAACAAAATGTAATTGACCCCTGGATTAGAAATAATTTTGTACAAGCCCCTGGTGGAGAGTTCACAGTATCCCCTAGAAACGCTCCAGGTGAAATACTATGGAGCGCGCCCTTAGGCCCTGATCTGAATCCCTACCTATCTCATTTGGCCAGAATGTATAATGGTTATGCAGGTGGTTTTGAAGTGCAGGTGATCCTCGCGGGGAACGCGTTCACCGCCGGAAAAATTATATTTGCAGCAGTCCCACCAAATTTTCCAACTGAAGGCTTGAGCCCCAGCCAGGTCACTATGTTCCCCCACATAATAGTAGATGTTAGGCAATTGGAACCTG [...]
+	'OB2006151_32'                 ATGAAGATGGCGTCGAATGACGCCAACCCATCTGATGGGTCCACAGCCAACCTCGTCCCAGAGGTCAACAATGAGGTTATGGCTTTGGAGCCCGTTGTAGGTGCCGCTATTGCGGCGCCTGTAGCGGGCCAACAAAATGTAATTGACCCCTGGATTAGAAACAACTTTGTACAAGCCCCTGGTGGAGAGTTTACAGTGTCCCCTAGAAATGCTCCAGGTGAGATACTATGGAGTGCGCCCTTGGGCCCTGATTTGAACCCTTACCTTTCTCATCTGGCCAGAATGTACAATGGTTATGCAGGTGGTTTTGAAGTGCAGGTAATCCTTGCGGGGAACGCGTTCACCGCCGGAAAAATCATATTTGCAGCAGTCCCACCTAACTTTCCAACTGAAGGCTTGAGCCCCAGCCAGGTTACCATGTTCCCCCATATAATAGTAGATGTTAGGCAATTGGAACCTG [...]
+	'OB2006164_27'                 ATGAAGATGGCGTCGAATGACGCCAACCCATCTGATGGGTCCGCAGCCAACCTCGTCCCAGAGGTCAACAATGAGGTTATGGCTTTGGAGCCCGTTGTCGGTGCCGCTATTGCGGCGCCTGTAGCGGGTCAACAAAATGTAATTGACCCCTGGATTAGAAATAATTTTGTACAAGCCCCTGGTGGAGAGTTCACAGTGTCCCCTAGAAACGCTCCAGGTGAAATACTATGGAGCGCGCCCTTAGGCCCTGATCTGAATCCCTACCTATCTCATTTGGCCAGGATGTATAATGGTTATGCAGGTGGTTTTGAAGTGCAGGTGATCCTCGCGGGGAACGCGTTCACCGCCGGAAAAATTATATTTGCAGCAGTACCACCAAATTTCCCAACTGAAGGCTTGAGTCCCAGCCAGGTCACTATGTTCCCCCACATAATAGTAGATGTTAGGCAATTGGAACCTG [...]
+	'OB2006169_26'                 ATGAAGATGGCGTCGAGTGACGCCAACCCATCTGATGGGTCCACAGCCAACCTCGTCCCAGAGGTCAACAATGAGGTTATGGCTTTGGAGCCCGTTGTTGGTGCCGCTATTGCGGCACCTGTAGCGGGCCAACAAAATGTAATTGACCCCTGGATTAGAAATAATTTTGTACAAGCCCCTGGTGGAGAGTTTACAGTATCCCCTAGAAACGCTCCAGGTGAAATACTATGGAGCGCGCCCTTGGGCCCTGATTTGAATCCCTACCTTTCCCATTTGGCCAGAATGTACAATAGTTATGCAGGTGGTTTTGAAGTGCAGGTAATCCTCGCGGGGAACGCGTTCACCGCCGGAAAAATCATATTTGCAGCAGTCCCACCAAATTTCCCAACTGAAGGCTTGAGCCCCAGCCAGGTCACTATGTTCCCCCATATAATAGTAGATGTTAGGCAACTGGAACCTG [...]
+	'OB2006173_25'                 ATGAAGATGGCGTCGAATGACGCCAACCCATCTGATGGGTCCGCAGCCAACCTCGTCCCAGAGGTCAACAATGAGGTTATGGCTTTGGAGCCCGTTGTCGGTGCCGCTATTGCGGCGCCTGTAGCGGGCCAACAAAATGTAATTGACCCCTGGATTAGAAACAATTTTGTACAAGCCCCTGGTGGAGAGTTCACAGTATCCCCTAGAAACGCTCCAGGTGAAATATTATGGAGCGCGCCCTTAGGCCCTGATCTGAATCCCTACCTATCTCATTTGGCCAGAATGTATAATGGTTATGCAGGTGGTTTTGAAGTGCAGGTGATCCTCGCGGGGAACGCGTTCACCGCCGGAAAAATTATATTTGCAGCAGTCCCACCAAATTTTCCAACTGAAGGCTTGAGTCCCAGCCAGGTCACTATGTTCCCCCACATAATAGTAGATGTTAGGCAATTGGAACCTG [...]
+	'OB2006182_26'                 ATGAAGATGGCGTCGAGTGACGCCAACCCATCTGATGGGTCCACAGCCAACCTCGTCCCAGAGGTCAACAATGAGGTTATGGCTTTGGAGCCCGTTGTTGGTGCCGCTATTGCGGCACCTGTAGCGGGCCAACAAAATGTAATTGACCCCTGGATTAGAAATAATTTTGTACAAGCCCCTGGTGGAGAGTTTACAGTATCCCCTAGAAACGCTCCAGGTGAAATACTATGGAGCGCGCCCTTGGGCCCTGATTTGAATCCCTACCTTTCCCATTTGGCCAGAATGTACAATAGTTATGCAGGTGGTTTTGAAGTGCAGGTAATCCTCGCGGGGAACGCGTTCACCGCCGGAAAAATCATATTTGCAGCAGTCCCACCAAATTTCCCAACTGAAGGCTTGAGCCCCAGCCAGGTCACTATGTTCCCCCATATAATAGTAGATGTTAGGCAACTGGAACCTG [...]
+	'OB2006226_25'                 ATGAAGATGGCGTCGAATGACGCCAACCCATCTGATGGGTCCGCAGCCAACCTCGTCCCAGAGGTCAACAATGAGGTTATGGCTTTGGAGCCCGTTGTCGGTGCCGCTATTGCGGCGCCTGTAGCGGGCCAACAAAATGTAATTGACCCCTGGATTAGAAACAATTTTGTACAAGCCCCTGGTGGAGAGTTCACAGTATCCCCTAGAAACGCTCCAGGTGAAATACTATGGAGCGCGCCCTTAGGCCCTGATCTGAATCCCTACCTATCTCATTTGGCCAGAATGTATAATGGTTATGCAGGTGGTTTTGAAGTGCAGGTGATCCTCGCGGGGAACGCGTTCACCGCCGGAAAGATTATATTTGCAGCAGTCCCACCAAATTTTCCAACTGAAGGCTTGAGTCCCAGCCAGGTCACTATGTTCCCCCACATAATAGTAGATGTTAGGCAATTGGAACCCG [...]
+	'OB2006232_25'                 ATGAAGATGGCGTCGAATGACGCCAACCCATCTGATGGGTCAGCAGCCAACCTCGTCCCAGAGGTCAACAATGAGGTTATGGCTTTGGAGCCCGTTGTCGGTGCCGCTATTGCGGCGCCTGTAGCGGGCCAACAAAATATAATTGACCCCTGGATTAGAAACAATTTTGTACAAGCCCCTGGTGGAGAGTTCACAGTATCCCCTAGAAACGCTCCAGGTGAAATACTATGGAGCGCGCCCTTAGGACCTGACCTGAATCCCTACCTATCTCATTTGGCCAGAATGTATAATGGTTATGCAGGTGGTTTTGAAGTGCAGGTGATCCTCGCGGGGAACGCGTTCACCGCCGGAAAAATTATATTTGCAGCAGTCCCACCAAATTTTCCAACTGAAGGCTTGAGTCCCAGCCAGGTCACTATGTTCCCCCACATAATAGTAGATGTTAGGCAATTGGAACCTG [...]
+	'OB2006234_25'                 ATGAAGATGGCGTCGAATGACGCCAACCCATCTGATGGGTCCGCAGCCAACCTCGTCCCAGAGGTCAACAATGAGGTTATGGCTTTGGAGCCCGTTGTCGGTGCCGCTATTGCGGCGCCTGTAGCGGGTCAACAAAATGTAATTGACCCCTGGATTAGAAATAATTTTGTACAAGCCCCTGGTGGAGAGTTCACAGTGTCCCCTAGAAACGCTCCAGGTGAAATACTATGGAGCGCGCCCTTAGGCCCTGATCTGAATCCCTACCTATCTCATTTGGCCAGGATGTATAATGGTTATGCAGGTGGTTTTGAAGTGCAGGTGATCCTCGCGGGGAACGCGTTCACCGCCGGAAAAATTATATTTGCAGCAGTACCACCAAATTTCCCAACTGAAGGCTTGAGTCCCAGCCAGGTCACTATGTTTCCCCATATAATAGTAGATGTTAGGCAATTGGAACCTG [...]
+	'OB2006235_25'                 ATGAAGATGGCGTCGAATGACGCCAACCCATCTGATGGGTCCGCAGCCAACCTCGTCCCAGAGGTCAACAATGAGGTTATGGCTTTGGAGCCCGTTGTCGGTGCCGCTATTGCGGCGCCTGTAGCGGGCCAACAAAATGTAATTGACCCCTGGATTAGAAATAATTTTGTACAAGCCCCTGGTGGAGAGTTCACAGTATCCCCTAGAAACGCTCCAGGTGAAATACTATGGAGCGCGCCCTTAGGCCCTGATCTGAATCCCTATCTATCTCATTTGGCCAGAATGTATAATGGTTATGCAGGTGGTTTTGAAGTGCAGGTGATCCTCGCGGGGAACGCGTTCACCGCCGGAAAAATTATATTTGCAGCAGTCCCACCAAATTTTCCAACTGAAGGCTTGAGCCCCAGCCAGGTCACCATGTTCCCCCACATAATAGTAGATGTTAGGCAATTGGAACCTG [...]
+	'OB2006239_25'                 ATGAAGATGGCGTCGAGTGACGCCAACCCATCTGATGGGTCCACAGCCAACCTCGTCCCAGAGGTCAACAATGAGGTTATGGCTTTGGAGCCCGTTGTTGGTGCCGCTATTGCGGCACCTGTAGCGGGCCAACAAAATGTAATTGACCCCTGGATTAGAAATAATTTTGTACAAGCCCCTGGTGGAGAGTTTACAGTATCCCCTAGAAACGCTCCAGGTGAAATACTATGGAGCGCGCCCTTGGGCCCTGATTTGAATCCCTACCTTTCCCATTTGGCCAGAATGTACAATAGTTATGCAGGTGGTTTCGAAGTGCAGGTAATCCTCGCGGGGAACGCGTTCACCGCCGGAAAAATCATATTTGCAGCAGTCCCACCAAATTTCCCAACTGAAGGCTTGAGCCCCAGCCAGGTCACTATGTTCCCCCATATAATAGTAGATGTTAGGCAACTAGAACCTG [...]
+	'OB2007009_24'                 ATGAAGATGGCGTCGAGTGACGCCAACCCATCTGATGGGTCCACAGCCAACCTCGTCCCAGAGGTCAACAATGAGGTTATGGCTTTGGAGCCCGTTGTTGGTGCCGCTATTGCGGCACCTGTAGCGGGCCAACAAAATGTAATTGACCCCTGGATTAGAAATAATTTTGTACAAGCCCCTGGTGGAGAGTTTACAGTATCCCCTAGAAACGCTCCAGGTGAAATACTATGGAGCGCGCCCTTGGGCCCTGATTTGAATCCCTACCTTTCCCATTTGGCCAGAATGTACAATAGTTATGCAGGTGGTTTTGAAGTGCAGGTAATCCTCGCGGGGAACGCGTTCACCGCCGGAAAAATCATATTTGCAGCAGTCCCACCAAATTTCCCAACTGAAGGCTTGAGCCCCAGCCAGGTCACTATGTTCCCCCATATAATAGTAGATGTTAGGCAACTGGAACCTG [...]
+	'OB2007011_22'                 ATGAAGATGGCGTCGAATGACGCCAACCCATCTGATGGGTCAGCAGCCAACCTCGTCCCAGAGGTCAACAATGAGGTTATGGCTTTGGAGCCCGTTGTCGGTGCCGCTATTGCGGCGCCTGTAGCGGGCCAACAAAATATAATTGACCCCTGGATTAGAAACAATTTTGTACAAGCCCCTGGTGGAGAGTTCACAGTATCCCCTAGAAACGCTCCAGGTGAAATACTATGGAGCGCGCCCTTAGGACCTGACCTGAATCCCTACCTATCTCATTTGGCCAGAATGTATAATGGTTATGCAGGTGGTTTTGAAGTGCAGGTGATCCTCGCGGGGAACGCGTTCACCGCCGGAAAAATTATATTTGCAGCAGTCCCACCAAATTTTCCAACTGAAGGCTTGAGTCCCAGCCAGGTCACTATGTTCCCCCACATAATAGTAGATGTTAGGCAATTGGAACCTG [...]
+	'OB2007028_24'                 ATGAAGATGGCGTCGAATGACGCCAACCCATCTGATGGGTCCGCAGCCAACCTCGTCCCAGAGGTTAACAATGAGGTTATGGCTTTGGAGCCCGTTGTCGGTGCCGCTATTGCGGCGCCTGTAGCGGGCCAACAAAATGTAATTGACCCCTGGATTAGAAATAATTTTGTACAAGCCCCTGGTGGAGAGTTCACAGTATCCCCTAGAAACGCTCCAGGTGAAATACTATGGAGCGCGCCCTTAGGCCCTGATCTGAATCCCTACCTATCTCATTTGGCCAGAATGTATAATGGTTATGCAGGTGGTTTTGAAGTGCAGGTGATCCTCGCGGGGAACGCGTTCACCGCCGGAAAAATTATATTTGCAGCAGTCCCACCAAATTTTCCAACTGAAGGCTTGAGTCCCAGCCAGGTCACTATGTTCCCCCACATAATAGTAGATGTTAGGCAATTGGAACCTG [...]
+	'OB2007049_24'                 ATGAAGATGGCGTCGAGTGACGCCAACCCATCTGATGGGTCCACAGCCAACCTCGTCCCAGAGGTCAACAATGAGGTTATGGCTTTGGAGCCCGTTGTTGGTGCCGCTATTGCGGCACCTGTAGCGGGCCAACAAAATGTAATTGACCCCTGGATTAGAAATAATTTTGTACAAGCCCCTGGTGGAGAGTTTACAGTATCCCCTAGAAACGCTCCAGGTGAAATACTATGGAGCGCGCCCTTGGGCCCTGATTTGAATCCCTACCTTTCCCATTTGGCCAGAATGTACAATAGTTATGCAGGTGGTTTTGAAGTGCAGGTAATCCTCGCGGGGAACGCGTTCACCGCCGGAAAAATCATATTTGCAGCAGTCCCACCAAATTTCCCAACTGAAGGCTTGAGCCCCAGCCAGGTCACTATGTTCCCCCATATAATAGTAGATGTTAGGCAACTGGAACCTG [...]
+	'OB2007209_15'                 ATGAAGATGGCGTCGAATGACGCCAACCCATCTGATGGGTCCGCAGCCAACCTCGTCCCAGAGGTCAGCAATGAGGTTATGGCTTTGGAGCCCGTTGTCGGTGCCGCTATTGCGGCGCCTGTAGCAGGCCAACAAAATGTAATTGACCCCTGGATTAGAAATAATTTTGTGCAAGCCCCTGGTGGAGAGTTCACAGTATCCCCTAGAAACGCTCCAGGTGAAATACTGTGGAGCGCGCCCTTAGGCCCTGATCTGAATCCCTACCTATCTCATTTGGCCAGAATGTATAATGGTTATGCAGGTGGCTTTGAAGTGCAGGTGATCCTCGCGGGGAACGCGTTCACCGCCGGAAAAATTATATTTGCAGCAGTCCCACCAAATTTTCCAACTGAAGGCCTGAGTCCCAGCCAGGTCACTATGTTCCCCCACATAATAGTAGATGTTAGGCAATTGGAACCTG [...]
+	'OB2007210_15'                 ATGAAGATGGCGTCGAATGACGCCAACCCATCTGATGGGTCCGCAGCCAACCTCGTCCCAGAGGTCAACAATGAGGTTATGGCTTTGGAGCCCGTTGTCGGTGCCGCTATTGCGGCGCCTGTAGCGGGCCAACAAAATGTAATTGACCCCTGGATTAGAAATAATTTTGTACAAGCCCCTGGTGGAGAGTTCACAGTATCCCCTAGAAACGCTCCAGGTGAAATACTATGGAGCGCGCCCTTAGGCCCTGATCTGAATCCCTACCTATCTCATTTGGCCAGAATGTATAATGGTTATGCAGGTGGTTTTGAAGTGCAGGTGATCCTCGCGGGGAACGCGTTCACCGCCGGAAAAATTATATTTGCAGCAGTCCCACCAAATTTTCCAACTGAAGGCTTGAGTCCCAGCCAGGTCACTATGTTCCCCCACATAATAGTAGATGTTAGGCAATTGGAACCTG [...]
+	'OB2007214_15'                 ATGAAGATGGCGTCGAATGACGCCAACCCATCTGATGGGTCCGCAGCCAACCTCGTCCCAGAGGTCAGCAATGAGGTTATGGCTTTGGAGCCCGTTGTCGGTGCCGCTATTGCGGCGCCTGTAGCGGGCCAACAAAATGTAATTGACCCCTGGATTAGAAATAATTTTGTACAAGCCCCTGGTGGAGAGTTCACAGTATCCCCTAGAAACGCTCCAGGTGAAATACTATGGAGCGCGCCCTTAGGCCCTGATCTGAATCCCTACCTATCTCATTTGGCCAGAATGTATAATGGTTATGCAGGTGGCTTTGAAGTGCAGGTGATCCTCGCGGGGAACGCGTTCACCGCCGGAAAAATTATATTTGCAGCAGTCCCACCAAATTTTCCAACTGAAGGCCTGAGTCCCAGCCAGGTCACTATGTTCCCCCACATAATAGTAGATGTTAGGCAATTGGAACCTG [...]
+	'OB2007220_15'                 ATGAAGATGGCGTCGAGTGACGCCAACCCATCTGATGGGTCCACAGCCAACCTCGTCCCAGAGGTCAACAATGAGGTTATGGCTTTGGAGCCCGTTGTTGGTGCCGCTATTGCGGCACCTGTAGCGGGCCAACAAAATGTAATTGACCCCTGGATTAGAAATAATTTTGTACAAGCCCCTGGTGGAGAGTTTACAGTATCCCCTAGAAACGCTCCAGGTGAAATACTATGGAGCGCGCCCTTGGGCCCTGATTTGAACCCCTACCTTTCCCATTTGGCCAGAATGTACAATAGTTATGCAGGTGGTTTTGAAGTGCAGGTAATCCTCGCGGGGAACGCGTTCACCGCCGGAAAAATCATATTTGCAGCAGTCCCACCAAATTTCCCAACTGAAGGCTTGAGCCCCAGCCAGGTCACTATGTTCCCCCATATAATAGTAGATGTTAGGCAATTGGAACCTG [...]
+	'OB2007254_15'                 ATGAAGATGGCGTCGAGTGACGCCAACCCATCTGATGGGTCCGCAGCCAACCTCGTCCCAGAGGTCAACAATGAGGTTATGGCTCTGGAGCCCGTTGTTGGTGCCGCCATTGCGGCACCTGTAGCGGGCCAACAAAATGTAATTGACCCCTGGATTAGAAACAATTTTGTACAAGCCCCTGGTGGAGAGTTTACAGTATCCCCTAGAAACGCTCCAGGTGAAATACTATGGAGCGCGCCCTTAGGCCCTGATCTAAATCCCTACCTATCCCATTTGGCCAGAATGTATAATGGTTATGCAGGTGGTTTTGAAGTGCAGGTAATCCTCGCGGGGAACGCGTTCACCGCCGGAAAGATTATATTTGCAGCAGTCCCACCAAATTTCCCAACTGAAGGCTTGAGCCCCAGCCAGGTCACTATGTTCCCCCATATAATAGTAGATGTTAGGCAACTGGAACCTG [...]
+	'OB2007286_13'                 ATGAAGATGGCGTCGAGTGACGCCAACCCATCTGATGGGTCCACAGCCAACCTCGTCCCAGAGGTCAACAATGAGGTTATGGCTTTGGAGCCCGTTGTTGGTGCCGCCATTGCGGCACCTGTAGCGGGCCAACAAAATGTAATTGACCCCTGGATTAGAAATAATTTTGTACAAGCCCCTGGTGGAGAGTTTACAGTATCCCCTAGAAACGCTCCAGGTGAAATACTATGGAGCGCGCCCTTGGGCCCTGATTTGAACCCCTACCTTTCCCATTTGGCCAGAATGTACAATAGTTATGCAGGTGGTTTTGAAGTGCAGGTAATCCTCGCGGGGAACGCGTTCACCGCCGGAAAAATCATATTTGCAGCAGTCCCACCAAATTTCCCAACTGAAGGCTTGAGCCCCAGCCAGGTCACTATGTTCCCCCATATAATAGTAGATGTTAGGCAATTGGAACCTG [...]
+	'OB2007300_13'                 ATGAAGATGGCGTCGAATGACGCCAACCCATCTGATGGGTCCGCAGCCAACCTCGTCCCAGAGGTCAACAATGAGGTTATGGCTTTGGAGCCCGTTGTCGGTGCCGCTATTGCGGCGCCTGTAGCGGGCCAACAAAATGTAATTGACCCCTGGATTAGAAATAATTTTGTACAAGCCCCTGGTGGAGAGTTCACAGTATCCCCTAGAAACGCTCCAGGTGAAATACTATGGAGCGCGCCCTTAGGCCCTGATCTGAATCCCTACCTATCTCATTTGGCCAGAATGTATAATGGTTATGCAGGTGGTTTTGAAGTGCAGGTGATCCTCGCGGGGAACGCGTTCACCGCCGGAAAAATTATATTTGCAGCAGTCCCACCAAATTTTCCAACTGAAGGCTTGAGTCCCAGCCAGGTCACTATGTTCCCCCACATAATAGTAGATGTTAGGCAATTGGAACCTG [...]
+	'OB2007317_13'                 ATGAAGATGGCGTCGAGTGACGCCAACCCATCTGATGGGTCCACAGCCAACCTCGTCCCAGAGGTCAACAATGAGGTTATGGCTTTGGAGCCCGTTGTTGGTGCCGCCATTGCGGCACCTGTAGCGGGCCAACAAAATGTAATTGACCCCTGGATTAGAAACAATTTTGTACAAGCCCCTGGTGGAGAGTTCACAGTATCCCCTAGAAACGCTCCAGGTGAAATACTATGGAGCGCGCCCTTAGGCCCTGATTTGAATCCCTACCTTTCCCATTTGGCCAGAATGTACAATGGTTATGCAGGTGGTTTTGAAGTGCAGGTAATCCTCGCGGGGAATGCGTTCACCGCCGGAAAAATCATATTTGCAGCAGTCCCACCAAACTTCCCAACTGAAGGCTTGAGCCCCAGCCAGGTCACTATGTTCCCCCACATAATAGTAGATGTTAGGCAATTGGAACCTG [...]
+	'OB2008013_12'                 ATGAAGATGGCGTCGAATGACGCCAACCCATCTGATGGGTCCGCAGCCAACCTCGTCCCAGAGGTCAGCAATGAGGTTATGGCTTTGGAGCCCGTTGTCGGTGCCGCTATTGCGGCGCCCGTAGCGGGCCAACAAAATGTAATTGACCCCTGGATTAGAAATAATTTTGTACAAGCCCCTGGTGGAGAGTTCACAGTATCCCCTAGAAACGCTCCAGGTGAAATACTATGGAGCGCGCCCTTAGGCCCTGATCTGAATCCCTACCTATCTCATTTGGCCAGAATGTATAATGGTTATGCAGGTGGTTTTGAAGTGCAGGTGATCCTCGCGGGGAACGCGTTCACCGCCGGAAAAATTATATTTGCAGCAGTCCCACCAAATTTTCCAACTGAAGGCCTGAGTCCCAGCCAGGTCACTATGTTCCCCCACATAATAGTAGATGTTAGGCAATTGGAACCTG [...]
+	'OB2008039_12'                 ATGAAGATGGCGTCGAATGACGCCAACCCATCTGATGGGTCCGCAGCCAACCTCGTCCCAGAGGTCAACAATGAGGTTATGGCTTTGGAGCCCGTTGTCGGTGCCGCTATTGCGGCGCCTGTAGCGGGCCAACAAAATGTAATTGACCCCTGGATTAGAAATAATTTTGTACAAGCCCCTGGTGGAGAGTTCACAGTATCCCCTAGAAACGCTCCAGGTGAAATACTATGGAGCGCGCCCTTAGGCCCTGATCTGAATCCCTACCTATCTCATTTGGCCAGAATGTATAATGGTTATGCAGGTGGTTTTGAAGTGCAGGTGATCCTCGCGGGGAACGCGTTCACCGCCGGAAAAATTATATTTGCAGCAGTCCCACCAAATTTTCCAACTGAAGGCTTGAGCCCCAGCCAGGTTACTATGTTCCCCCACATAATAGTAGATGTTAGGCAATTGGAACCTG [...]
+	'OB2008043_13'                 ATGAAGATGGCGTCGAATGACGCCAACCCATCTGATGGGTCCGCAGCCAACCTCGTCCCAGAGGTCAGCAATGAGGTTATGGCTTTGGAGCCCGTTGTCGGTGCCGCTATTGCGGCGCCTGTAGCAGGCCAACAAAATGTAATTGACCCCTGGATTAGAAATAATTTTGTGCAAGCCCCTGGTGGAGAGTTCACAGTATCCCCTAGAAACGCTCCAGGTGAAATACTGTGGAGCGCGCCCTTAGGCCCTGATCTGAATCCCTACCTATCTCATTTGGCCAGAATGTATAATGGTTATGCAGGTGGCTTTGAAGTGCAGGTGATCCTCGCGGGGAACGCGTTCACCGCCGGAAAAATTATATTTGCAGCAGTCCCACCAAATTTTCCAACTGAAGGCCTGAGTCCCAGCCAGGTCACTATGTTCCCCCACATAATAGTAGATGTTAGGCAATTGGAACCTG [...]
+	'OB2008092_12'                 ATGAAGATGGCGTCGAGTGACGCCAACCCATCTGATGGGTCTACAGCCAACCTCGTCCCAGAGGTCAACAATGAGGTTATGGCTTTGGAGCCCGTTGTTGGTGCCGCTATTGCGGCACCTGTAGCGGGCCAACAAAATGTAATTGACCCCTGGATTAGAAATAATTTTGTACAAGCCCCTGGTGGAGAGTTTACAGTATCCCCTAGAAACGCTCCAGGTGAAATACTATGGAGCGCGCCCTTGGGCCCCGATTTGAATCCCTACCTCTCCCATTTGGCCAGAATGTACAATAGTTATGCAGGTGGTTTTGAAGTGCAGGTAATCCTCGCGGGGAACGCGTTCACCGCCGGAAAAATCATATTTGCAGCAGTCCCACCAAATTTCCCAACTGAAGGCTTGAGCCCCAGCCAGGTCACTATGTTCCCCCATATAATAGTAGATGTTAGGCAATTGGAACCTG [...]
+	'OB2008155_9'                  ATGAAGATGGCGTCGAGTGACGCCAACCCATCTGATGGGTCCACAGCCAACCTCGTCCCAGAGGTCAACAATGAGGTTATGGCTTTGGAGCCCGTTGTTGGTGCCGCTATTGCGGCACCTGTAGCGGGCCAACAAAATGTAATTGACCCCTGGATTAGAAATAATTTTGTACAAGCCCCTGGTGGGGAGTTTACAGTATCCCCTAGAAACGCTCCAGGTGAAATACTATGGAGCGCGCCCTTGGGCCCTGACTTGAATCCCTACCTTTCCCATTTGGCCAGAATGTACAATAGTTATGCAGGTGGTTTTGAAGTGCAGGTAATCCTCGCGGGGAACGCGTTCACCGCCGGAAAAATCATATTTGCAGCAGTCCCACCAAATTTCCCAACCGAAGGCTTGAGCCCCAGCCAGGTTACTATGTTCCCCCATATAATAGTAGATGTTAGGCAACTGGAACCTG [...]
+	'OB2008158_9'                  ATGAAGATGGCGTCGAGTGACGCCAACCCATCTGATGGGTCCACAGCCAACCTCGTTCCAGAGGTCAACAATGAGGTTATGGCTTTGGAGCCCGTTGTTGGTGCCGCTATTGCGGCACCTGTAGCGGGCCAACAAAATATAATTGACCCCTGGATTAGAAATAATTTTGTACAAGCCCCTGGTGGGGAGTTTACAGTATCCCCCAGAAACGCTCCAGGTGAAATACTATGGAGCGCGCCCTTGGGCCCTGATTTGAACCCCTACCTTTCCCATTTGGCCAGAATGTACAATAGTTATGCAGGTGGTTTTGAAGTGCAGGTAATCCTCGCGGGGAACGCGTTCACCGCCGGAAAAATCATATTTGCAGCAGTCCCACCAAATTTCCCAACTGAAGGCTTGAGCCCCAGCCAGGTTACTATGTTCCCCCATATGATAGTAGATGTTAGGCAACTGGAACCTG [...]
+	'OB2008165_9'                  ATGAAGATGGCGTCGAGTGACGCCAACCCATCTGATGGGTCCACAGCCAACCTCGTCCCAGAGGTCAACAATGAGGTTATGGCTTTGGAGCCCGTTGTTGGTGCCGCTATTGCGGCACCTGTAGCGGGCCAACAAAATATAATTGACCCCTGGATTAGAAATAACTTTGTACAAGCCCCTGGTGGGGAGTTTACAGTATCCCCCAGAAACGCTCCAGGTGAAATACTATGGAGCGCGCCCTTGGGCCCTGATTTGAATCCCTACCTTTCCCATTTGGCCAGAATGTACAATAGTTATGCAGGTGGTTTCGAAGTGCAGGTAATCCTCGCGGGGAACGCGTTCACCGCCGGAAAAATCATATTTGCAGCAGTCCCACCAAATTTCCCAACTGAAGGCTTGAGCCCCAGCCAGGTTACTATGTTTCCCCATATAATAGTAGATGTTAGGCAACTGGAACCTG [...]
+	'OB2008179_9'                  ATGAAGATGGCGTCGAGTGACGCCAACCCATCTGATGGGTCCACAGCCAACCTCGTCCCAGAGGTCAACAATGAGGTTATGGCTTTGGAGCCCGTTGTTGGTGCCGCCATTGCGGCACCTGTAGCGGGCCAACAAAATGTAATTGACCCCTGGATTAGAAACAATTTTGTACAAGCCCCTGGTGGAGAGTTCACAGTATCCCCTAGAAACGCTCCAGGTGAAATACTATGGAGCGCGCCCTTAGGCCCTGATTTGAATCCCTACCTTTCCCATTTGGCCAGAATGTACAATGGTTATGCAGGTGGTTTTGAAGTGCAGGTAATCCTCGCGGGGAATGCGTTCACCGCCGGAAAAATCATATTTGCAGCAGTCCCACCAAACTTCCCAACTGAAGGCTTGAGTCCCAGCCAGGTTACTATGTTCCCCCACATAATAGTAGATGTTAGGCAATTGGAACCTG [...]
+END;
+
+BEGIN TREES;
+	TREE tree = (AY030098_254:59.11883855309145,(((EP2002006_84:20.71862451602763,(AB294779_66:12.705415861129552,(02202001_73:3.658741531500425,02198022_73:3.658741531500425):2.046674329629127):26.01320865489808):135.51768128006407,(AF414417_198:7.688952967247104,X76716_BRISTOL_186:19.688952967247104):34.547352828844595):47.414337395595226,(((((AF427117_102:67.42932688122974,((((DQ364459_78:21.123545540397345,EU310927_78:21.123545540397345):22.719044700272462,(((EP2002022_84:7.614380475976 [...]
+END;
+
+BEGIN HYPHY;
+
+
+global GT=0.04754386235325014;
+global CT=1.790695375321662;
+global CG=0.04663089086055527;
+global AT=0.112800133525329;
+global AC=0.09087674853705167;NucleotideMatrix={4,4};
+NucleotideMatrix[0][1]:=AC*t;
+NucleotideMatrix[0][2]:=t;
+NucleotideMatrix[0][3]:=AT*t;
+NucleotideMatrix[1][0]:=AC*t;
+NucleotideMatrix[1][2]:=CG*t;
+NucleotideMatrix[1][3]:=CT*t;
+NucleotideMatrix[2][0]:=t;
+NucleotideMatrix[2][1]:=CG*t;
+NucleotideMatrix[2][3]:=GT*t;
+NucleotideMatrix[3][0]:=AT*t;
+NucleotideMatrix[3][1]:=CT*t;
+NucleotideMatrix[3][2]:=GT*t;
+
+overallFrequencies={
+{    0.262631252386}
+{    0.263946958127}
+{    0.223320764923}
+{    0.250101024564}
+}
+;
+Model NucModel=(NucleotideMatrix,overallFrequencies);
+
+UseModel (NucModel);
+Tree givenTree=(((((((AY030098_254,((EP2002006_84,(AB294779_66,(02202001_73,02198022_73)Node14)Node12)Node10,(AF414417_198,X76716_BRISTOL_186)Node17)Node9)Node7,U46500_CAMBERWELL_174)Node6,AY032605_254)Node5,AF080558_146)Node4,(((((((DQ975270_126,AF427120_102)Node29,(DQ078829_138,AY038600_126)Node32)Node28,(AY532119_126,(AY532133_138,AY532132_138)Node37)Node35)Node27,(((AF414424_162,((AY532124_138,(AY532123_126,((AY532122_138,AY532125_126)Node50,AY741811_138)Node49)Node47)Node45,AY532121 [...]
+
+givenTree.OB2007009_24.t=0.004739873386136365;
+givenTree.Node265.t=0.001577639927677019;
+givenTree.OB2007049_24.t=0.009492922819478875;
+givenTree.AUS2006_32.t=0.01252300637005993;
+givenTree.OB2006169_26.t=0.01425183446826638;
+givenTree.Node266.t=0.0079116683308886;
+givenTree.OB2008155_9.t=0.01749853871566928;
+givenTree.OB2008165_9.t=0.007919935552629471;
+givenTree.Node267.t=0.01442528755897131;
+givenTree.OB2008158_9.t=0.007909932477037054;
+givenTree.Node264.t=0.001574419576003434;
+givenTree.OB2007286_13.t=0.009609333148380366;
+givenTree.OB2007220_15.t=0.001465949518663125;
+givenTree.Node273.t=0.03041946415715873;
+givenTree.Node261.t=0;
+givenTree.Node263.t=0;
+givenTree.OB2006038_35.t=0.02121986600547604;
+givenTree.Node247.t=0.01923686352634866;
+givenTree.OB2004012_59.t=0.04035057425652264;
+givenTree.Node237.t=0;
+givenTree.OB2003023_71.t=0.02069566298605448;
+givenTree.Node235.t=0;
+givenTree.AY485642_74.t=0.004739333345562846;
+givenTree.Node164.t=0.05135608212124406;
+givenTree.EF187497_33.t=0.04488205970811333;
+givenTree.Node168.t=0.003789656346542184;
+givenTree.Node250.t=0.004756353186075484;
+givenTree.Node234.t=0;
+givenTree.OB2006070_34.t=0.00473128657935658;
+givenTree.OB2004059_52.t=0.003156466961214055;
+givenTree.Node290.t=0.01266356612162116;
+givenTree.OB2004083_51.t=0;
+givenTree.Node256.t=0.008243417230955168;
+givenTree.Node254.t=0.0284577716130288;
+givenTree.Node297.t=0;
+givenTree.Node289.t=0;
+givenTree.AB294788_30.t=0.02224698813687604;
+givenTree.AB294785_42.t=0.02378181039433104;
+givenTree.AB294784_42.t=0.02069917824271978;
+givenTree.AB294783_54.t=0.01430593286992846;
+givenTree.Node258.t=0.004077950097221846;
+givenTree.OB2006182_26.t=0.004734527501569965;
+givenTree.AB294790_30.t=0.003152183990121488;
+givenTree.Node280.t=0;
+givenTree.AB294789_30.t=0.007893493567379218;
+givenTree.OB2006239_25.t=0.0126612689248173;
+givenTree.Node283.t=0;
+givenTree.Node276.t=0.006315332994084543;
+givenTree.Node260.t=0.003308185882092989;
+givenTree.OB2008092_12.t=0.02702184332520505;
+givenTree.Node279.t=0;
+givenTree.Node277.t=0;
+givenTree.OB2004003_61.t=0.01427385077703156;
+givenTree.Node184.t=0.003157531044313738;
+givenTree.AY587998_75.t=0.001576581494905866;
+givenTree.Node188.t=0.001576700299032293;
+givenTree.Node206.t=0.003155216977754153;
+givenTree.Node204.t=0;
+givenTree.AY587997_75.t=0;
+givenTree.AY588013_75.t=0;
+givenTree.Node223.t=0;
+givenTree.AY587985_76.t=0;
+givenTree.Node219.t=0.004744324799255688;
+givenTree.Node183.t=0.003165587405788932;
+givenTree.Node208.t=0;
+givenTree.AY588022_71.t=0;
+givenTree.AY588030_71.t=0.001576956629091784;
+givenTree.Node209.t=0;
+givenTree.AY581254_71.t=0;
+givenTree.AY588020_71.t=0;
+givenTree.AY532130_138.t=0.009505109756597435;
+givenTree.AY588027_70.t=0;
+givenTree.Node212.t=0;
+givenTree.Node213.t=0.001576533794412511;
+givenTree.Node214.t=0;
+givenTree.AY588021_70.t=0.003155452938926918;
+givenTree.AY588026_76.t=0;
+givenTree.AY502021_66.t=0.001578164027979337;
+givenTree.AY502022_66.t=0;
+givenTree.OB2003LN457_63.t=0.01110561628793385;
+givenTree.Node169.t=0.001576619850347002;
+givenTree.AY502023_FARMINGTONHILLS_78.t=0.003156027916236595;
+givenTree.AY502020_66.t=0;
+givenTree.OB2004007_60.t=0.01904111086094627;
+givenTree.Node238.t=0;
+givenTree.Node239.t=0.00157081112967683;
+givenTree.Node243.t=0;
+givenTree.Node241.t=0.006335484479053115;
+givenTree.OB2003003_73.t=0.02874315082346848;
+givenTree.AY587986_75.t=0;
+givenTree.Node230.t=0.001576648682129271;
+givenTree.AY587988_75.t=0.001577540579263141;
+givenTree.AY587983_76.t=0;
+givenTree.Node227.t=0;
+givenTree.Node226.t=0;
+givenTree.Node174.t=0.003151717169309701;
+givenTree.Node170.t=0;
+givenTree.Node176.t=0.003166483218474617;
+givenTree.Node222.t=0.003159622118899985;
+givenTree.Node182.t=0.003159285351060728;
+givenTree.Node295.t=0.00157880468613076;
+givenTree.Node357.t=0.009475319190318311;
+givenTree.Node355.t=0;
+givenTree.Node359.t=0.006331929527093801;
+givenTree.Node360.t=0.009507644518480933;
+givenTree.OB2007214_15.t=0.009511034397008957;
+givenTree.Node353.t=0.0015153955614804;
+givenTree.Node311.t=0.02195820386370286;
+givenTree.DQ369797_2003ASIA_90.t=0.01943584063552523;
+givenTree.Node317.t=0.08632451534260741;
+givenTree.Node351.t=0.007889040641095264;
+givenTree.Node321.t=0.01197646657554736;
+givenTree.OB2007209_15.t=0;
+givenTree.Node346.t=0;
+givenTree.Node336.t=0.001572918179058112;
+givenTree.Node348.t=0.0190661109079979;
+givenTree.OB2006234_25.t=0.004710226512670193;
+givenTree.OB2006164_27.t=0.006343070571178128;
+givenTree.Node322.t=0;
+givenTree.OB2008013_12.t=0.01108911256632663;
+givenTree.OB2008043_13.t=0.009480913690268475;
+givenTree.OB2007028_24.t=0.02062871611075646;
+givenTree.AB291542_30.t=0.02077475121721019;
+givenTree.AB294794_30.t=0.01269472485652725;
+givenTree.AB294782_54.t=0.0142508997589384;
+givenTree.EF535854_30.t=0.01909488976495887;
+givenTree.Node375.t=0.001558354714725687;
+givenTree.Node376.t=0.003176478452143192;
+givenTree.AB220923_48.t=0.01743695604360357;
+givenTree.Node380.t=0.001576127395226854;
+givenTree.AB220922_48.t=0.01585500280740154;
+givenTree.Node310.t=0.02292214924167317;
+givenTree.Node158.t=0.04181015143718874;
+givenTree.Node364.t=0.0661186016443794;
+givenTree.Node374.t=0;
+givenTree.Node366.t=0.001216079070731144;
+givenTree.Node381.t=0;
+givenTree.Node371.t=0.001534156327089903;
+givenTree.Node369.t=0;
+givenTree.AB220921_CHIBA_48.t=0.0143232543989461;
+givenTree.DQ419908_56.t=0.009485477009624117;
+givenTree.AB294787_42.t=0.01590226254067555;
+givenTree.Node367.t=0;
+givenTree.AB294786_42.t=0.004734249657089348;
+givenTree.AB294791_30.t=0.0142519516860956;
+givenTree.Node377.t=0;
+givenTree.DQ419907_56.t=0.02063386952221889;
+givenTree.AB294792_30.t=0.01267535936906533;
+givenTree.EU366113_30.t=0.01900163325679433;
+givenTree.Node159.t=0.006039392870848129;
+givenTree.OB2008179_9.t=0.007873099356755189;
+givenTree.Node163.t=0;
+givenTree.Node287.t=0.02840703580389017;
+givenTree.Node253.t=0.05862860285295592;
+givenTree.OB2007317_13.t=0.001610237228293042;
+givenTree.OB2007210_15.t=0.009977424087771426;
+givenTree.OB2007300_13.t=0.007454174104785319;
+givenTree.Node312.t=0.09622327887185268;
+givenTree.Node313.t=0.02272562223703153;
+givenTree.OB2007254_15.t=0.04204114741055195;
+givenTree.Node301.t=0;
+givenTree.OB2004039_56.t=0.009488491303569836;
+givenTree.OB2004048_54.t=0.007897345576195711;
+givenTree.Node288.t=0.003157107162020685;
+givenTree.DQ078794_56.t=0.01912891622673933;
+givenTree.Node294.t=0.003102562377549892;
+givenTree.OB2006046_35.t=0.01904055638498158;
+givenTree.Node307.t=0.00314419253439942;
+givenTree.Node303.t=0.003153710056152767;
+givenTree.OB2006054_35.t=0.04000136902527659;
+givenTree.Node304.t=0;
+givenTree.OB2004028_57.t=0.003172736281491856;
+givenTree.Node318.t=0.02038165296143381;
+givenTree.OB2006235_25.t=0.01741846443424801;
+givenTree.Node338.t=0;
+givenTree.OB2006115_32.t=0.004724517136207414;
+givenTree.Node325.t=0.001572816325206174;
+givenTree.Node323.t=0;
+givenTree.OB2008039_12.t=0.02061064734113044;
+givenTree.Node341.t=0;
+givenTree.Node337.t=0.001573039004281933;
+givenTree.Node343.t=0.001493653992896847;
+givenTree.AB294793_30.t=0.01113972703781233;
+givenTree.EF684915_30.t=0.0191149889188313;
+givenTree.Node329.t=0;
+givenTree.Node326.t=0.001558942011194371;
+givenTree.EU096512_30.t=0.003208235942357514;
+givenTree.OB2006226_25.t=0.01424795392507347;
+givenTree.OB2006089_33.t=0.006309101034887312;
+givenTree.OB2006173_25.t=0.006323596946426892;
+givenTree.EU096513_18.t=0.01944960704467786;
+givenTree.OB2006232_25.t=0.001584514926815119;
+givenTree.Node333.t=0.03027364045382434;
+givenTree.OB2007011_22.t=0.001566982867620924;
+givenTree.Node330.t=0.001626750019963808;
+givenTree.Node101.t=0;
+givenTree.Node55.t=0.001581129533540517;
+givenTree.Node7.t=0.01625293581514876;
+givenTree.Node190.t=0;
+givenTree.OB2000015_106.t=0.003150177832610532;
+givenTree.Node125.t=0.004719384487153747;
+givenTree.Node41.t=0.001580693836179224;
+givenTree.Node4.t=0.00580656931982454;
+givenTree.Node107.t=0;
+givenTree.Node124.t=0.02084871321307382;
+givenTree.AF080554_154.t=0.01433730619174163;
+givenTree.OB2000043_98.t=0.0159629559498306;
+givenTree.X76716_BRISTOL_186.t=0.001285346591785527;
+givenTree.AY532132_138.t=0.004727728701833738;
+givenTree.AY532127_138.t=0.0127170958726888;
+givenTree.DQ078829_138.t=0.04234717627538513;
+givenTree.Node40.t=0.001663240562563347;
+givenTree.AY532118_138.t=0.02947183126777922;
+givenTree.AF080558_146.t=0.04437183339026791;
+givenTree.OB2000016_106.t=0.009523584106997074;
+givenTree.EP2002006_84.t=0.02253775816919915;
+givenTree.AY030098_254.t=0.05244585654214554;
+givenTree.Node171.t=0.00155751024846598;
+givenTree.U46500_CAMBERWELL_174.t=0.06795446439291482;
+givenTree.AY588011_72.t=0;
+givenTree.AF425765_95.t=0.003162312582971612;
+givenTree.Node9.t=0.06796753656720045;
+givenTree.AY032605_254.t=0.009122713921334962;
+givenTree.02198022_73.t=0.004820419575502645;
+givenTree.AY532113_126.t=0.01109106222399797;
+givenTree.AY532131_138.t=0.00157920904087989;
+givenTree.Node196.t=0;
+givenTree.AF472623_155.t=0.003158813360195915;
+givenTree.Node17.t=0.04698639787522441;
+givenTree.Node111.t=0.001571474554977307;
+givenTree.Node109.t=0.004755660377727834;
+givenTree.AY532120_138.t=0.01267778248682504;
+givenTree.Node105.t=0.00791065121686859;
+givenTree.DQ975270_126.t=0.01818927492171214;
+givenTree.Node119.t=0.004753434824038429;
+givenTree.Node200.t=0;
+givenTree.AY532135_126.t=0.001570763809850816;
+givenTree.Node5.t=0.1008887551029712;
+givenTree.Node56.t=0.001579049854920773;
+givenTree.Node14.t=0;
+givenTree.AF427115_114.t=0.01126707416708499;
+givenTree.AY532134_138.t=0.006338705843929094;
+givenTree.Node122.t=0.003137875586705942;
+givenTree.AF427120_102.t=0.04651824458997508;
+givenTree.AY532115_138.t=0.009464107742760693;
+givenTree.AY741811_138.t=0.00315923339803343;
+givenTree.Node47.t=0;
+givenTree.AY532121_138.t=0.00475961568733789;
+givenTree.AF080559_145.t=0.00474709949270092;
+givenTree.OB1995001_165.t=0.009538030970611752;
+givenTree.Node49.t=0.001579259863822237;
+givenTree.OB1995002_168.t=0.00952607679647949;
+givenTree.AY532125_126.t=0;
+givenTree.Node25.t=0.001586994736884184;
+givenTree.Node50.t=0;
+givenTree.Node142.t=0.003155154503944688;
+givenTree.Node44.t=0.03357893314946137;
+givenTree.AY588016_74.t=0.001576558018837592;
+givenTree.AY588025_71.t=0.001576499228383337;
+givenTree.OB2001018_95.t=0.007951440595717712;
+givenTree.AY587992_74.t=0.00157647880756582;
+givenTree.OB2001058_86.t=0.01379697613992476;
+givenTree.Node165.t=0.00293936131077745;
+givenTree.OB2003001_73.t=0.01591958918895578;
+givenTree.Node73.t=0.002318891985628176;
+givenTree.Node87.t=0;
+givenTree.AY038600_126.t=0.03257782556798275;
+givenTree.Node143.t=0.009581883247700001;
+givenTree.Node148.t=0.00625024615437792;
+givenTree.AF080552_154.t=0.009495896948212536;
+givenTree.Node37.t=0.02458934770815761;
+givenTree.Node130.t=0.004836233472719631;
+givenTree.Node35.t=0.02089998588950412;
+givenTree.Node58.t=0.003172124924957843;
+givenTree.AY532126_126.t=0.01273672966449155;
+givenTree.Node29.t=0.007748982522293666;
+givenTree.Node26.t=0.001577711805183995;
+givenTree.Node160.t=0.02920971682068847;
+givenTree.EP2002022_84.t=0.01590123672407901;
+givenTree.Node24.t=0.003436618490740889;
+givenTree.AY081134_138.t=0.01272016335252868;
+givenTree.AY532124_138.t=0.00791272937858223;
+givenTree.AF427113_114.t=0.009528373954532968;
+givenTree.AJ277619_162.t=0.03058789152669926;
+givenTree.AF414424_162.t=0.02227963571575166;
+givenTree.AY532123_126.t=0;
+givenTree.Node27.t=0.007420342457813102;
+givenTree.Node45.t=0.001566038339640851;
+givenTree.Node129.t=0.01114602342625956;
+givenTree.AY532122_138.t=0.00315929368967071;
+givenTree.AY532128_138.t=0.01590699191936991;
+givenTree.Node60.t=0.003151875777457587;
+givenTree.Node3.t=0.0090945407061144;
+givenTree.AY587994_74.t=0;
+givenTree.AY532119_126.t=0.02692689464821552;
+givenTree.AF425763_126.t=0.01195664392153121;
+givenTree.Node23.t=0.004824775558262712;
+givenTree.Node67.t=0.001577951207355708;
+givenTree.08450_12.t=0.03913523333914045;
+givenTree.EU310927_78.t=0.0418907850522879;
+givenTree.AF080557_152.t=0.009496557378839606;
+givenTree.Node66.t=0;
+givenTree.AF425764_126.t=0.01841253157119456;
+givenTree.AY502018_78.t=0;
+givenTree.Node76.t=0.001454485760954998;
+givenTree.AY588014_74.t=0;
+givenTree.AY588029_68.t=0.003155175279366251;
+givenTree.AF427121_102.t=0.02478161523806436;
+givenTree.Node74.t=0.01276023461410826;
+givenTree.AJ004864_GRIMSBY_162.t=0.009511163460902956;
+givenTree.AY532114_138.t=0.00880122512206645;
+givenTree.Node179.t=0.009488222049729739;
+givenTree.AF427123_102.t=0.001576466720674505;
+givenTree.Node81.t=0.003835564211784764;
+givenTree.AB083781_83.t=0.01596628442796047;
+givenTree.AY532129_126.t=0.02717916009487675;
+givenTree.Node177.t=0;
+givenTree.AY502017_78.t=0.004766315414831319;
+givenTree.AF080549_156.t=0.00474258289187957;
+givenTree.AY588006_75.t=0;
+givenTree.Node63.t=0;
+givenTree.Node108.t=0;
+givenTree.AY502019_78.t=0.01269404066990483;
+givenTree.Node42.t=0;
+givenTree.AY532133_138.t=0.006373842832876865;
+givenTree.Node93.t=0.006195241968999848;
+givenTree.AF080555_154.t=0.007914407184743974;
+givenTree.Node28.t=0;
+givenTree.AF080553_154.t=0.003158218003616993;
+givenTree.AF414425_BURWASHLANDING_162.t=0.02070713716506666;
+givenTree.Node62.t=0;
+givenTree.Node79.t=0.02425332830155921;
+givenTree.AF080556_153.t=0;
+givenTree.AY588028_69.t=0;
+givenTree.Node32.t=0.006280544307277622;
+givenTree.Node155.t=0.1168692926166994;
+givenTree.Node95.t=0.03242281128599384;
+givenTree.AF427117_102.t=0.08294684118239698;
+givenTree.DQ364459_78.t=0.03095197871085878;
+givenTree.Node194.t=0;
+givenTree.Node199.t=0;
+givenTree.Node134.t=0.01563718753498616;
+givenTree.Node189.t=0;
+givenTree.OB1995012_164.t=0.02710827494083169;
+givenTree.AY532111_138.t=0.01591821326208998;
+givenTree.AF080550_156.t=0.01428002860057815;
+givenTree.Node114.t=0;
+givenTree.Node88.t=0.001564065557515308;
+givenTree.Node90.t=0.003183816570905015;
+givenTree.Node138.t=0.003679854190903237;
+givenTree.AY587990_74.t=0;
+givenTree.AF414417_198.t=0.01454749451254002;
+givenTree.02202001_73.t=0.01894325944518293;
+givenTree.AY532112_138.t=0.001579047933013919;
+givenTree.AF080551_161.t=0.00475094720332512;
+givenTree.Node102.t=0.003157925755903835;
+givenTree.AB294779_66.t=0.00956675047718384;
+givenTree.AY532117_138.t=0.03047042160819673;
+givenTree.AF427114_114.t=0.01277753410867442;
+givenTree.Node86.t=0;
+givenTree.Node10.t=0.145347036696054;
+givenTree.Node12.t=0.0353037426151181;
+givenTree.Node6.t=0.00618433434811493;
+givenTree.Node191.t=0;
+givenTree.AY587996_74.t=0;
+givenTree.Node57.t=0.003157964847102224;
+givenTree.Node131.t=0.004770841497645686;
+givenTree.Node71.t=0;
+givenTree.Node82.t=0.01256032773047641;
+givenTree.AF425766_90.t=0.01614226839145065;
+givenTree.DQ415279_CARLOW_78.t=0.01747150096322965;
+givenTree.AY588001_75.t=0;
+givenTree.AY587993_74.t=0;
+givenTree.AF427122_102.t=0.004753975340014273;
+givenTree.OB2006151_32.t=0.03571390077897988;
+givenTree.Node136.t=0.003001353379444288;
+givenTree.Node133.t=0.004688174379481136;
+givenTree.Node115.t=0;
+givenTree.AY587991_74.t=0.001576564786378596;
+givenTree.Node91.t=0.001571398202245706;
+givenTree.AF427116_114.t=0.003016532406699461;
+givenTree.Node185.t=0;
+givenTree.Node2.t=0.01743012074583535;
+givenTree.AY532116_138.t=0.02412722344093544;
+givenTree.Node151.t=0.01258020955053402;
+DataSet ds = ReadDataFile(USE_NEXUS_FILE_DATA);
+DataSetFilter nucData = CreateFilter(ds,1,"0-1619","43,25,73,72,0,60,71,38,44,58,21,49,15,45,19,35,34,61,26,24,23,27,13,22,31,42,55,39,47,56,57,75,12,64,63,50,52,51,66,62,29,16,69,70,1,5,40,17,41,53,30,32,33,2,3,20,36,37,48,8,7,9,28,18,11,65,10,68,59,46,67,14,6,4,54,74,94,164,93,133,144,141,146,97,99,135,98,121,122,129,130,118,117,112-114,109,119,111,110,126,131,125,123,104,124,128,116,115,106,120,127,105,108,107,147,103,149,101,102,100,151,150,152,148,96,138,158,95,166,192,191,190,174,1 [...]
+LikelihoodFunction nucLF = (nucData,givenTree);
+
+END;
\ No newline at end of file
diff --git a/tests/hbltests/SpecializedOptimizations/SiteLikelihood.bf b/tests/hbltests/SpecializedOptimizations/SiteLikelihood.bf
new file mode 100644
index 0000000..d234d95
--- /dev/null
+++ b/tests/hbltests/SpecializedOptimizations/SiteLikelihood.bf
@@ -0,0 +1,1237 @@
+#NEXUS
+
+BEGIN TAXA;
+	DIMENSIONS NTAX = 194;
+	TAXLABELS
+		'02198022_73' 'AY532111_138' 'AY532112_138' 'AY532113_126' 'OB1995002_168' 'OB1995012_164' 'OB1995001_165' 'OB2000015_106' 'OB2000016_106' 'OB2000043_98' 'OB2001018_95' 'OB2001058_86' 'AY532114_138' 'AY741811_138' 'AY532115_138' 'DQ078829_138' 'AY532116_138' 'AY532117_138' 'AY532118_138' 'AY532119_126' 'AY532120_138' 'DQ975270_126' 'AY532121_138' 'AY532122_138' 'AY532123_126' 'EP2002006_84' 'AY532124_138' 'AY532125_126' 'AY532126_126' 'AY532127_138' 'AY532128_138' 'AY532129_126' 'AY532 [...]
+END;
+
+BEGIN CHARACTERS;
+	DIMENSIONS NCHAR = 3;
+	FORMAT
+		DATATYPE = DNA
+		GAP=-
+		MISSING=?
+	;
+
+MATRIX
+	'02198022_73'                  TCG
+	'AY532111_138'                 TCG
+	'AY532112_138'                 TCG
+	'AY532113_126'                 TCG
+	'OB1995002_168'                TCG
+	'OB1995012_164'                TCG
+	'OB1995001_165'                TCG
+	'OB2000015_106'                TCG
+	'OB2000016_106'                TCG
+	'OB2000043_98'                 TCG
+	'OB2001018_95'                 TCG
+	'OB2001058_86'                 TCG
+	'AY532114_138'                 TCG
+	'AY741811_138'                 TCG
+	'AY532115_138'                 TCG
+	'DQ078829_138'                 TCG
+	'AY532116_138'                 TCG
+	'AY532117_138'                 TCG
+	'AY532118_138'                 TCG
+	'AY532119_126'                 TCG
+	'AY532120_138'                 TCG
+	'DQ975270_126'                 TCG
+	'AY532121_138'                 TCG
+	'AY532122_138'                 TCG
+	'AY532123_126'                 TCG
+	'EP2002006_84'                 TCG
+	'AY532124_138'                 TCG
+	'AY532125_126'                 TCG
+	'AY532126_126'                 TCG
+	'AY532127_138'                 TCG
+	'AY532128_138'                 TCG
+	'AY532129_126'                 TCG
+	'AY532130_138'                 TCG
+	'AY532131_138'                 TCG
+	'AY532132_138'                 TCG
+	'AY532133_138'                 TCG
+	'AY532134_138'                 TCG
+	'AY532135_126'                 TCG
+	'U46500_CAMBERWELL_174'        TCG
+	'AF080549_156'                 TCG
+	'AF080550_156'                 TCG
+	'AF080551_161'                 TCG
+	'AF080552_154'                 TCG
+	'AY030098_254'                 TCG
+	'AY032605_254'                 TCG
+	'AY038600_126'                 TCG
+	'AY081134_138'                 TCG
+	'AF080553_154'                 TCG
+	'AF080554_154'                 TCG
+	'AF427120_102'                 TCG
+	'AF427121_102'                 TCG
+	'AF427122_102'                 TCG
+	'AF427123_102'                 TCG
+	'AF472623_155'                 TCG
+	'AJ277619_162'                 TCG
+	'AF080555_154'                 TCG
+	'AF080556_153'                 TCG
+	'AF080557_152'                 TCG
+	'AF080558_146'                 TCG
+	'AF080559_145'                 TCG
+	'AF414417_198'                 TCG
+	'AF414424_162'                 TCG
+	'AF414425_BURWASHLANDING_162'  TCG
+	'AF425763_126'                 TCG
+	'AF425764_126'                 TCG
+	'AF425765_95'                  TCG
+	'AF425766_90'                  TCG
+	'AF427113_114'                 TCG
+	'AF427114_114'                 TCG
+	'AF427115_114'                 TCG
+	'AF427116_114'                 TCG
+	'X76716_BRISTOL_186'           TCG
+	'02202001_73'                  TCG
+	'AB294779_66'                  TCG
+	'AB083781_83'                  TCG
+	'AJ004864_GRIMSBY_162'         TCG
+	'AB220921_CHIBA_48'            TCG
+	'AB220922_48'                  TCG
+	'AB220923_48'                  TCG
+	'AB291542_30'                  TCG
+	'AB294782_54'                  TCG
+	'AB294783_54'                  TCG
+	'AB294784_42'                  TCG
+	'AB294785_42'                  TCG
+	'AB294786_42'                  TCG
+	'AB294787_42'                  TCG
+	'AB294788_30'                  TCG
+	'AB294789_30'                  TCG
+	'AB294790_30'                  TCG
+	'AB294791_30'                  TCG
+	'AB294792_30'                  TCG
+	'AB294793_30'                  TCG
+	'AB294794_30'                  TCG
+	'08450_12'                     TCG
+	'AF427117_102'                 TCG
+	'AUS2006_32'                   TCG
+	'AY485642_74'                  TCG
+	'AY502017_78'                  TCG
+	'AY502018_78'                  TCG
+	'AY502019_78'                  TCG
+	'AY502020_66'                  TCG
+	'AY502021_66'                  TCG
+	'AY502022_66'                  TCG
+	'AY502023_FARMINGTONHILLS_78'  TCG
+	'AY581254_71'                  TCG
+	'AY587983_76'                  TCG
+	'AY587985_76'                  TCG
+	'AY587986_75'                  TCG
+	'AY587988_75'                  TCG
+	'AY587990_74'                  TCG
+	'AY587991_74'                  TCG
+	'AY587992_74'                  TCG
+	'AY587993_74'                  TCG
+	'AY587994_74'                  TCG
+	'AY587996_74'                  TCG
+	'AY587997_75'                  TCG
+	'AY587998_75'                  TCG
+	'AY588001_75'                  TCG
+	'AY588006_75'                  TCG
+	'AY588011_72'                  TCG
+	'AY588013_75'                  TCG
+	'AY588014_74'                  TCG
+	'AY588016_74'                  TCG
+	'AY588020_71'                  TCG
+	'AY588021_70'                  TCG
+	'AY588022_71'                  TCG
+	'AY588025_71'                  TCG
+	'AY588026_76'                  TCG
+	'AY588027_70'                  TCG
+	'AY588028_69'                  TCG
+	'AY588029_68'                  TCG
+	'AY588030_71'                  TCG
+	'DQ078794_56'                  TCG
+	'DQ364459_78'                  TCG
+	'DQ369797_2003ASIA_90'         CCG
+	'DQ415279_CARLOW_78'           TCG
+	'DQ419907_56'                  TCG
+	'DQ419908_56'                  TCG
+	'EF187497_33'                  TCG
+	'EF535854_30'                  ACG
+	'EF684915_30'                  TCG
+	'EP2002022_84'                 TCC
+	'EU096512_30'                  TCG
+	'EU096513_18'                  TCG
+	'EU310927_78'                  TCG
+	'EU366113_30'                  TCG
+	'OB2003001_73'                 TCG
+	'OB2003003_73'                 TCG
+	'OB2003023_71'                 TCG
+	'OB2003LN457_63'               TCG
+	'OB2004003_61'                 TCG
+	'OB2004007_60'                 TCG
+	'OB2004012_59'                 TCG
+	'OB2004028_57'                 TCG
+	'OB2004039_56'                 TCG
+	'OB2004048_54'                 TCG
+	'OB2004059_52'                 TCG
+	'OB2004083_51'                 TCG
+	'OB2006038_35'                 TCG
+	'OB2006046_35'                 TCG
+	'OB2006054_35'                 TCG
+	'OB2006070_34'                 TCG
+	'OB2006089_33'                 TCG
+	'OB2006115_32'                 TCG
+	'OB2006151_32'                 TCG
+	'OB2006164_27'                 TCG
+	'OB2006169_26'                 TCG
+	'OB2006173_25'                 TCG
+	'OB2006182_26'                 TCG
+	'OB2006226_25'                 TCG
+	'OB2006232_25'                 TCG
+	'OB2006234_25'                 TCG
+	'OB2006235_25'                 TCG
+	'OB2006239_25'                 TCG
+	'OB2007009_24'                 TCG
+	'OB2007011_22'                 TCG
+	'OB2007028_24'                 TCG
+	'OB2007049_24'                 TCG
+	'OB2007209_15'                 TCG
+	'OB2007210_15'                 TCG
+	'OB2007214_15'                 TCG
+	'OB2007220_15'                 TCG
+	'OB2007254_15'                 TCG
+	'OB2007286_13'                 TCG
+	'OB2007300_13'                 TCG
+	'OB2007317_13'                 TCG
+	'OB2008013_12'                 TCG
+	'OB2008039_12'                 TCG
+	'OB2008043_13'                 TCG
+	'OB2008092_12'                 TCG
+	'OB2008155_9'                  TCG
+	'OB2008158_9'                  TCG
+	'OB2008165_9'                  TCG
+	'OB2008179_9'                  TCG;
+END;
+
+BEGIN TREES;
+	TREE tree = (AY030098_254:59.11883855309145,(((EP2002006_84:20.71862451602763,(AB294779_66:12.705415861129552,(02202001_73:3.658741531500425,02198022_73:3.658741531500425):2.046674329629127):26.01320865489808):135.51768128006407,(AF414417_198:7.688952967247104,X76716_BRISTOL_186:19.688952967247104):34.547352828844595):47.414337395595226,(((((AF427117_102:67.42932688122974,((((DQ364459_78:21.123545540397345,EU310927_78:21.123545540397345):22.719044700272462,(((EP2002022_84:7.614380475976 [...]
+END;
+
+BEGIN HYPHY;
+
+
+global dNdS=1;
+CodonMatrix={61,61};
+CodonMatrix[0][1]:=0.0908767*dNdS*synRate*0.287789;
+CodonMatrix[0][2]:=synRate*0.187249;
+CodonMatrix[0][3]:=0.1128*dNdS*synRate*0.298098;
+CodonMatrix[0][4]:=0.0908767*dNdS*synRate*0.283601;
+CodonMatrix[0][8]:=dNdS*synRate*0.162228;
+CodonMatrix[0][12]:=0.1128*dNdS*synRate*0.278842;
+CodonMatrix[0][16]:=0.0908767*dNdS*synRate*0.220452;
+CodonMatrix[0][32]:=dNdS*synRate*0.320485;
+CodonMatrix[1][0]:=0.0908767*dNdS*synRate*0.226864;
+CodonMatrix[1][2]:=0.0466309*dNdS*synRate*0.187249;
+CodonMatrix[1][3]:=1.7907*synRate*0.298098;
+CodonMatrix[1][5]:=0.0908767*dNdS*synRate*0.283601;
+CodonMatrix[1][9]:=dNdS*synRate*0.162228;
+CodonMatrix[1][13]:=0.1128*dNdS*synRate*0.278842;
+CodonMatrix[1][17]:=0.0908767*dNdS*synRate*0.220452;
+CodonMatrix[1][33]:=dNdS*synRate*0.320485;
+CodonMatrix[1][48]:=0.1128*dNdS*synRate*0.173363;
+CodonMatrix[2][0]:=synRate*0.226864;
+CodonMatrix[2][1]:=0.0466309*dNdS*synRate*0.287789;
+CodonMatrix[2][3]:=0.0475439*dNdS*synRate*0.298098;
+CodonMatrix[2][6]:=0.0908767*dNdS*synRate*0.283601;
+CodonMatrix[2][10]:=dNdS*synRate*0.162228;
+CodonMatrix[2][14]:=0.1128*dNdS*synRate*0.278842;
+CodonMatrix[2][18]:=0.0908767*dNdS*synRate*0.220452;
+CodonMatrix[2][34]:=dNdS*synRate*0.320485;
+CodonMatrix[3][0]:=0.1128*dNdS*synRate*0.226864;
+CodonMatrix[3][1]:=1.7907*synRate*0.287789;
+CodonMatrix[3][2]:=0.0475439*dNdS*synRate*0.187249;
+CodonMatrix[3][7]:=0.0908767*dNdS*synRate*0.283601;
+CodonMatrix[3][11]:=dNdS*synRate*0.162228;
+CodonMatrix[3][15]:=0.1128*dNdS*synRate*0.278842;
+CodonMatrix[3][19]:=0.0908767*dNdS*synRate*0.220452;
+CodonMatrix[3][35]:=dNdS*synRate*0.320485;
+CodonMatrix[3][49]:=0.1128*dNdS*synRate*0.173363;
+CodonMatrix[4][0]:=0.0908767*dNdS*synRate*0.275329;
+CodonMatrix[4][5]:=0.0908767*synRate*0.287789;
+CodonMatrix[4][6]:=synRate*0.187249;
+CodonMatrix[4][7]:=0.1128*synRate*0.298098;
+CodonMatrix[4][8]:=0.0466309*dNdS*synRate*0.162228;
+CodonMatrix[4][12]:=1.7907*dNdS*synRate*0.278842;
+CodonMatrix[4][20]:=0.0908767*dNdS*synRate*0.220452;
+CodonMatrix[4][36]:=dNdS*synRate*0.320485;
+CodonMatrix[4][50]:=0.1128*dNdS*synRate*0.173363;
+CodonMatrix[5][1]:=0.0908767*dNdS*synRate*0.275329;
+CodonMatrix[5][4]:=0.0908767*synRate*0.226864;
+CodonMatrix[5][6]:=0.0466309*synRate*0.187249;
+CodonMatrix[5][7]:=1.7907*synRate*0.298098;
+CodonMatrix[5][9]:=0.0466309*dNdS*synRate*0.162228;
+CodonMatrix[5][13]:=1.7907*dNdS*synRate*0.278842;
+CodonMatrix[5][21]:=0.0908767*dNdS*synRate*0.220452;
+CodonMatrix[5][37]:=dNdS*synRate*0.320485;
+CodonMatrix[5][51]:=0.1128*dNdS*synRate*0.173363;
+CodonMatrix[6][2]:=0.0908767*dNdS*synRate*0.275329;
+CodonMatrix[6][4]:=synRate*0.226864;
+CodonMatrix[6][5]:=0.0466309*synRate*0.287789;
+CodonMatrix[6][7]:=0.0475439*synRate*0.298098;
+CodonMatrix[6][10]:=0.0466309*dNdS*synRate*0.162228;
+CodonMatrix[6][14]:=1.7907*dNdS*synRate*0.278842;
+CodonMatrix[6][22]:=0.0908767*dNdS*synRate*0.220452;
+CodonMatrix[6][38]:=dNdS*synRate*0.320485;
+CodonMatrix[6][52]:=0.1128*dNdS*synRate*0.173363;
+CodonMatrix[7][3]:=0.0908767*dNdS*synRate*0.275329;
+CodonMatrix[7][4]:=0.1128*synRate*0.226864;
+CodonMatrix[7][5]:=1.7907*synRate*0.287789;
+CodonMatrix[7][6]:=0.0475439*synRate*0.187249;
+CodonMatrix[7][11]:=0.0466309*dNdS*synRate*0.162228;
+CodonMatrix[7][15]:=1.7907*dNdS*synRate*0.278842;
+CodonMatrix[7][23]:=0.0908767*dNdS*synRate*0.220452;
+CodonMatrix[7][39]:=dNdS*synRate*0.320485;
+CodonMatrix[7][53]:=0.1128*dNdS*synRate*0.173363;
+CodonMatrix[8][0]:=dNdS*synRate*0.275329;
+CodonMatrix[8][4]:=0.0466309*dNdS*synRate*0.283601;
+CodonMatrix[8][9]:=0.0908767*dNdS*synRate*0.287789;
+CodonMatrix[8][10]:=synRate*0.187249;
+CodonMatrix[8][11]:=0.1128*dNdS*synRate*0.298098;
+CodonMatrix[8][12]:=0.0475439*dNdS*synRate*0.278842;
+CodonMatrix[8][24]:=0.0908767*synRate*0.220452;
+CodonMatrix[8][40]:=dNdS*synRate*0.320485;
+CodonMatrix[9][1]:=dNdS*synRate*0.275329;
+CodonMatrix[9][5]:=0.0466309*dNdS*synRate*0.283601;
+CodonMatrix[9][8]:=0.0908767*dNdS*synRate*0.226864;
+CodonMatrix[9][10]:=0.0466309*dNdS*synRate*0.187249;
+CodonMatrix[9][11]:=1.7907*synRate*0.298098;
+CodonMatrix[9][13]:=0.0475439*dNdS*synRate*0.278842;
+CodonMatrix[9][25]:=0.0908767*dNdS*synRate*0.220452;
+CodonMatrix[9][41]:=dNdS*synRate*0.320485;
+CodonMatrix[9][54]:=0.1128*dNdS*synRate*0.173363;
+CodonMatrix[10][2]:=dNdS*synRate*0.275329;
+CodonMatrix[10][6]:=0.0466309*dNdS*synRate*0.283601;
+CodonMatrix[10][8]:=synRate*0.226864;
+CodonMatrix[10][9]:=0.0466309*dNdS*synRate*0.287789;
+CodonMatrix[10][11]:=0.0475439*dNdS*synRate*0.298098;
+CodonMatrix[10][14]:=0.0475439*dNdS*synRate*0.278842;
+CodonMatrix[10][26]:=0.0908767*synRate*0.220452;
+CodonMatrix[10][42]:=dNdS*synRate*0.320485;
+CodonMatrix[10][55]:=0.1128*dNdS*synRate*0.173363;
+CodonMatrix[11][3]:=dNdS*synRate*0.275329;
+CodonMatrix[11][7]:=0.0466309*dNdS*synRate*0.283601;
+CodonMatrix[11][8]:=0.1128*dNdS*synRate*0.226864;
+CodonMatrix[11][9]:=1.7907*synRate*0.287789;
+CodonMatrix[11][10]:=0.0475439*dNdS*synRate*0.187249;
+CodonMatrix[11][15]:=0.0475439*dNdS*synRate*0.278842;
+CodonMatrix[11][27]:=0.0908767*dNdS*synRate*0.220452;
+CodonMatrix[11][43]:=dNdS*synRate*0.320485;
+CodonMatrix[11][56]:=0.1128*dNdS*synRate*0.173363;
+CodonMatrix[12][0]:=0.1128*dNdS*synRate*0.275329;
+CodonMatrix[12][4]:=1.7907*dNdS*synRate*0.283601;
+CodonMatrix[12][8]:=0.0475439*dNdS*synRate*0.162228;
+CodonMatrix[12][13]:=0.0908767*synRate*0.287789;
+CodonMatrix[12][14]:=dNdS*synRate*0.187249;
+CodonMatrix[12][15]:=0.1128*synRate*0.298098;
+CodonMatrix[12][28]:=0.0908767*dNdS*synRate*0.220452;
+CodonMatrix[12][44]:=dNdS*synRate*0.320485;
+CodonMatrix[12][57]:=0.1128*dNdS*synRate*0.173363;
+CodonMatrix[13][1]:=0.1128*dNdS*synRate*0.275329;
+CodonMatrix[13][5]:=1.7907*dNdS*synRate*0.283601;
+CodonMatrix[13][9]:=0.0475439*dNdS*synRate*0.162228;
+CodonMatrix[13][12]:=0.0908767*synRate*0.226864;
+CodonMatrix[13][14]:=0.0466309*dNdS*synRate*0.187249;
+CodonMatrix[13][15]:=1.7907*synRate*0.298098;
+CodonMatrix[13][29]:=0.0908767*dNdS*synRate*0.220452;
+CodonMatrix[13][45]:=dNdS*synRate*0.320485;
+CodonMatrix[13][58]:=0.1128*dNdS*synRate*0.173363;
+CodonMatrix[14][2]:=0.1128*dNdS*synRate*0.275329;
+CodonMatrix[14][6]:=1.7907*dNdS*synRate*0.283601;
+CodonMatrix[14][10]:=0.0475439*dNdS*synRate*0.162228;
+CodonMatrix[14][12]:=dNdS*synRate*0.226864;
+CodonMatrix[14][13]:=0.0466309*dNdS*synRate*0.287789;
+CodonMatrix[14][15]:=0.0475439*dNdS*synRate*0.298098;
+CodonMatrix[14][30]:=0.0908767*dNdS*synRate*0.220452;
+CodonMatrix[14][46]:=dNdS*synRate*0.320485;
+CodonMatrix[14][59]:=0.1128*dNdS*synRate*0.173363;
+CodonMatrix[15][3]:=0.1128*dNdS*synRate*0.275329;
+CodonMatrix[15][7]:=1.7907*dNdS*synRate*0.283601;
+CodonMatrix[15][11]:=0.0475439*dNdS*synRate*0.162228;
+CodonMatrix[15][12]:=0.1128*synRate*0.226864;
+CodonMatrix[15][13]:=1.7907*synRate*0.287789;
+CodonMatrix[15][14]:=0.0475439*dNdS*synRate*0.187249;
+CodonMatrix[15][31]:=0.0908767*dNdS*synRate*0.220452;
+CodonMatrix[15][47]:=dNdS*synRate*0.320485;
+CodonMatrix[15][60]:=0.1128*dNdS*synRate*0.173363;
+CodonMatrix[16][0]:=0.0908767*dNdS*synRate*0.285701;
+CodonMatrix[16][17]:=0.0908767*dNdS*synRate*0.287789;
+CodonMatrix[16][18]:=synRate*0.187249;
+CodonMatrix[16][19]:=0.1128*dNdS*synRate*0.298098;
+CodonMatrix[16][20]:=0.0908767*dNdS*synRate*0.283601;
+CodonMatrix[16][24]:=dNdS*synRate*0.162228;
+CodonMatrix[16][28]:=0.1128*dNdS*synRate*0.278842;
+CodonMatrix[16][32]:=0.0466309*dNdS*synRate*0.320485;
+CodonMatrix[17][1]:=0.0908767*dNdS*synRate*0.285701;
+CodonMatrix[17][16]:=0.0908767*dNdS*synRate*0.226864;
+CodonMatrix[17][18]:=0.0466309*dNdS*synRate*0.187249;
+CodonMatrix[17][19]:=1.7907*synRate*0.298098;
+CodonMatrix[17][21]:=0.0908767*dNdS*synRate*0.283601;
+CodonMatrix[17][25]:=dNdS*synRate*0.162228;
+CodonMatrix[17][29]:=0.1128*dNdS*synRate*0.278842;
+CodonMatrix[17][33]:=0.0466309*dNdS*synRate*0.320485;
+CodonMatrix[17][48]:=1.7907*dNdS*synRate*0.173363;
+CodonMatrix[18][2]:=0.0908767*dNdS*synRate*0.285701;
+CodonMatrix[18][16]:=synRate*0.226864;
+CodonMatrix[18][17]:=0.0466309*dNdS*synRate*0.287789;
+CodonMatrix[18][19]:=0.0475439*dNdS*synRate*0.298098;
+CodonMatrix[18][22]:=0.0908767*dNdS*synRate*0.283601;
+CodonMatrix[18][26]:=dNdS*synRate*0.162228;
+CodonMatrix[18][30]:=0.1128*dNdS*synRate*0.278842;
+CodonMatrix[18][34]:=0.0466309*dNdS*synRate*0.320485;
+CodonMatrix[19][3]:=0.0908767*dNdS*synRate*0.285701;
+CodonMatrix[19][16]:=0.1128*dNdS*synRate*0.226864;
+CodonMatrix[19][17]:=1.7907*synRate*0.287789;
+CodonMatrix[19][18]:=0.0475439*dNdS*synRate*0.187249;
+CodonMatrix[19][23]:=0.0908767*dNdS*synRate*0.283601;
+CodonMatrix[19][27]:=dNdS*synRate*0.162228;
+CodonMatrix[19][31]:=0.1128*dNdS*synRate*0.278842;
+CodonMatrix[19][35]:=0.0466309*dNdS*synRate*0.320485;
+CodonMatrix[19][49]:=1.7907*dNdS*synRate*0.173363;
+CodonMatrix[20][4]:=0.0908767*dNdS*synRate*0.285701;
+CodonMatrix[20][16]:=0.0908767*dNdS*synRate*0.275329;
+CodonMatrix[20][21]:=0.0908767*synRate*0.287789;
+CodonMatrix[20][22]:=synRate*0.187249;
+CodonMatrix[20][23]:=0.1128*synRate*0.298098;
+CodonMatrix[20][24]:=0.0466309*dNdS*synRate*0.162228;
+CodonMatrix[20][28]:=1.7907*dNdS*synRate*0.278842;
+CodonMatrix[20][36]:=0.0466309*dNdS*synRate*0.320485;
+CodonMatrix[20][50]:=1.7907*dNdS*synRate*0.173363;
+CodonMatrix[21][5]:=0.0908767*dNdS*synRate*0.285701;
+CodonMatrix[21][17]:=0.0908767*dNdS*synRate*0.275329;
+CodonMatrix[21][20]:=0.0908767*synRate*0.226864;
+CodonMatrix[21][22]:=0.0466309*synRate*0.187249;
+CodonMatrix[21][23]:=1.7907*synRate*0.298098;
+CodonMatrix[21][25]:=0.0466309*dNdS*synRate*0.162228;
+CodonMatrix[21][29]:=1.7907*dNdS*synRate*0.278842;
+CodonMatrix[21][37]:=0.0466309*dNdS*synRate*0.320485;
+CodonMatrix[21][51]:=1.7907*dNdS*synRate*0.173363;
+CodonMatrix[22][6]:=0.0908767*dNdS*synRate*0.285701;
+CodonMatrix[22][18]:=0.0908767*dNdS*synRate*0.275329;
+CodonMatrix[22][20]:=synRate*0.226864;
+CodonMatrix[22][21]:=0.0466309*synRate*0.287789;
+CodonMatrix[22][23]:=0.0475439*synRate*0.298098;
+CodonMatrix[22][26]:=0.0466309*dNdS*synRate*0.162228;
+CodonMatrix[22][30]:=1.7907*dNdS*synRate*0.278842;
+CodonMatrix[22][38]:=0.0466309*dNdS*synRate*0.320485;
+CodonMatrix[22][52]:=1.7907*dNdS*synRate*0.173363;
+CodonMatrix[23][7]:=0.0908767*dNdS*synRate*0.285701;
+CodonMatrix[23][19]:=0.0908767*dNdS*synRate*0.275329;
+CodonMatrix[23][20]:=0.1128*synRate*0.226864;
+CodonMatrix[23][21]:=1.7907*synRate*0.287789;
+CodonMatrix[23][22]:=0.0475439*synRate*0.187249;
+CodonMatrix[23][27]:=0.0466309*dNdS*synRate*0.162228;
+CodonMatrix[23][31]:=1.7907*dNdS*synRate*0.278842;
+CodonMatrix[23][39]:=0.0466309*dNdS*synRate*0.320485;
+CodonMatrix[23][53]:=1.7907*dNdS*synRate*0.173363;
+CodonMatrix[24][8]:=0.0908767*synRate*0.285701;
+CodonMatrix[24][16]:=dNdS*synRate*0.275329;
+CodonMatrix[24][20]:=0.0466309*dNdS*synRate*0.283601;
+CodonMatrix[24][25]:=0.0908767*synRate*0.287789;
+CodonMatrix[24][26]:=synRate*0.187249;
+CodonMatrix[24][27]:=0.1128*synRate*0.298098;
+CodonMatrix[24][28]:=0.0475439*dNdS*synRate*0.278842;
+CodonMatrix[24][40]:=0.0466309*dNdS*synRate*0.320485;
+CodonMatrix[25][9]:=0.0908767*dNdS*synRate*0.285701;
+CodonMatrix[25][17]:=dNdS*synRate*0.275329;
+CodonMatrix[25][21]:=0.0466309*dNdS*synRate*0.283601;
+CodonMatrix[25][24]:=0.0908767*synRate*0.226864;
+CodonMatrix[25][26]:=0.0466309*synRate*0.187249;
+CodonMatrix[25][27]:=1.7907*synRate*0.298098;
+CodonMatrix[25][29]:=0.0475439*dNdS*synRate*0.278842;
+CodonMatrix[25][41]:=0.0466309*dNdS*synRate*0.320485;
+CodonMatrix[25][54]:=1.7907*dNdS*synRate*0.173363;
+CodonMatrix[26][10]:=0.0908767*synRate*0.285701;
+CodonMatrix[26][18]:=dNdS*synRate*0.275329;
+CodonMatrix[26][22]:=0.0466309*dNdS*synRate*0.283601;
+CodonMatrix[26][24]:=synRate*0.226864;
+CodonMatrix[26][25]:=0.0466309*synRate*0.287789;
+CodonMatrix[26][27]:=0.0475439*synRate*0.298098;
+CodonMatrix[26][30]:=0.0475439*dNdS*synRate*0.278842;
+CodonMatrix[26][42]:=0.0466309*dNdS*synRate*0.320485;
+CodonMatrix[26][55]:=1.7907*dNdS*synRate*0.173363;
+CodonMatrix[27][11]:=0.0908767*dNdS*synRate*0.285701;
+CodonMatrix[27][19]:=dNdS*synRate*0.275329;
+CodonMatrix[27][23]:=0.0466309*dNdS*synRate*0.283601;
+CodonMatrix[27][24]:=0.1128*synRate*0.226864;
+CodonMatrix[27][25]:=1.7907*synRate*0.287789;
+CodonMatrix[27][26]:=0.0475439*synRate*0.187249;
+CodonMatrix[27][31]:=0.0475439*dNdS*synRate*0.278842;
+CodonMatrix[27][43]:=0.0466309*dNdS*synRate*0.320485;
+CodonMatrix[27][56]:=1.7907*dNdS*synRate*0.173363;
+CodonMatrix[28][12]:=0.0908767*dNdS*synRate*0.285701;
+CodonMatrix[28][16]:=0.1128*dNdS*synRate*0.275329;
+CodonMatrix[28][20]:=1.7907*dNdS*synRate*0.283601;
+CodonMatrix[28][24]:=0.0475439*dNdS*synRate*0.162228;
+CodonMatrix[28][29]:=0.0908767*synRate*0.287789;
+CodonMatrix[28][30]:=synRate*0.187249;
+CodonMatrix[28][31]:=0.1128*synRate*0.298098;
+CodonMatrix[28][44]:=0.0466309*dNdS*synRate*0.320485;
+CodonMatrix[28][57]:=1.7907*synRate*0.173363;
+CodonMatrix[29][13]:=0.0908767*dNdS*synRate*0.285701;
+CodonMatrix[29][17]:=0.1128*dNdS*synRate*0.275329;
+CodonMatrix[29][21]:=1.7907*dNdS*synRate*0.283601;
+CodonMatrix[29][25]:=0.0475439*dNdS*synRate*0.162228;
+CodonMatrix[29][28]:=0.0908767*synRate*0.226864;
+CodonMatrix[29][30]:=0.0466309*synRate*0.187249;
+CodonMatrix[29][31]:=1.7907*synRate*0.298098;
+CodonMatrix[29][45]:=0.0466309*dNdS*synRate*0.320485;
+CodonMatrix[29][58]:=1.7907*dNdS*synRate*0.173363;
+CodonMatrix[30][14]:=0.0908767*dNdS*synRate*0.285701;
+CodonMatrix[30][18]:=0.1128*dNdS*synRate*0.275329;
+CodonMatrix[30][22]:=1.7907*dNdS*synRate*0.283601;
+CodonMatrix[30][26]:=0.0475439*dNdS*synRate*0.162228;
+CodonMatrix[30][28]:=synRate*0.226864;
+CodonMatrix[30][29]:=0.0466309*synRate*0.287789;
+CodonMatrix[30][31]:=0.0475439*synRate*0.298098;
+CodonMatrix[30][46]:=0.0466309*dNdS*synRate*0.320485;
+CodonMatrix[30][59]:=1.7907*synRate*0.173363;
+CodonMatrix[31][15]:=0.0908767*dNdS*synRate*0.285701;
+CodonMatrix[31][19]:=0.1128*dNdS*synRate*0.275329;
+CodonMatrix[31][23]:=1.7907*dNdS*synRate*0.283601;
+CodonMatrix[31][27]:=0.0475439*dNdS*synRate*0.162228;
+CodonMatrix[31][28]:=0.1128*synRate*0.226864;
+CodonMatrix[31][29]:=1.7907*synRate*0.287789;
+CodonMatrix[31][30]:=0.0475439*synRate*0.187249;
+CodonMatrix[31][47]:=0.0466309*dNdS*synRate*0.320485;
+CodonMatrix[31][60]:=1.7907*dNdS*synRate*0.173363;
+CodonMatrix[32][0]:=dNdS*synRate*0.285701;
+CodonMatrix[32][16]:=0.0466309*dNdS*synRate*0.220452;
+CodonMatrix[32][33]:=0.0908767*dNdS*synRate*0.287789;
+CodonMatrix[32][34]:=synRate*0.187249;
+CodonMatrix[32][35]:=0.1128*dNdS*synRate*0.298098;
+CodonMatrix[32][36]:=0.0908767*dNdS*synRate*0.283601;
+CodonMatrix[32][40]:=dNdS*synRate*0.162228;
+CodonMatrix[32][44]:=0.1128*dNdS*synRate*0.278842;
+CodonMatrix[33][1]:=dNdS*synRate*0.285701;
+CodonMatrix[33][17]:=0.0466309*dNdS*synRate*0.220452;
+CodonMatrix[33][32]:=0.0908767*dNdS*synRate*0.226864;
+CodonMatrix[33][34]:=0.0466309*dNdS*synRate*0.187249;
+CodonMatrix[33][35]:=1.7907*synRate*0.298098;
+CodonMatrix[33][37]:=0.0908767*dNdS*synRate*0.283601;
+CodonMatrix[33][41]:=dNdS*synRate*0.162228;
+CodonMatrix[33][45]:=0.1128*dNdS*synRate*0.278842;
+CodonMatrix[33][48]:=0.0475439*dNdS*synRate*0.173363;
+CodonMatrix[34][2]:=dNdS*synRate*0.285701;
+CodonMatrix[34][18]:=0.0466309*dNdS*synRate*0.220452;
+CodonMatrix[34][32]:=synRate*0.226864;
+CodonMatrix[34][33]:=0.0466309*dNdS*synRate*0.287789;
+CodonMatrix[34][35]:=0.0475439*dNdS*synRate*0.298098;
+CodonMatrix[34][38]:=0.0908767*dNdS*synRate*0.283601;
+CodonMatrix[34][42]:=dNdS*synRate*0.162228;
+CodonMatrix[34][46]:=0.1128*dNdS*synRate*0.278842;
+CodonMatrix[35][3]:=dNdS*synRate*0.285701;
+CodonMatrix[35][19]:=0.0466309*dNdS*synRate*0.220452;
+CodonMatrix[35][32]:=0.1128*dNdS*synRate*0.226864;
+CodonMatrix[35][33]:=1.7907*synRate*0.287789;
+CodonMatrix[35][34]:=0.0475439*dNdS*synRate*0.187249;
+CodonMatrix[35][39]:=0.0908767*dNdS*synRate*0.283601;
+CodonMatrix[35][43]:=dNdS*synRate*0.162228;
+CodonMatrix[35][47]:=0.1128*dNdS*synRate*0.278842;
+CodonMatrix[35][49]:=0.0475439*dNdS*synRate*0.173363;
+CodonMatrix[36][4]:=dNdS*synRate*0.285701;
+CodonMatrix[36][20]:=0.0466309*dNdS*synRate*0.220452;
+CodonMatrix[36][32]:=0.0908767*dNdS*synRate*0.275329;
+CodonMatrix[36][37]:=0.0908767*synRate*0.287789;
+CodonMatrix[36][38]:=synRate*0.187249;
+CodonMatrix[36][39]:=0.1128*synRate*0.298098;
+CodonMatrix[36][40]:=0.0466309*dNdS*synRate*0.162228;
+CodonMatrix[36][44]:=1.7907*dNdS*synRate*0.278842;
+CodonMatrix[36][50]:=0.0475439*dNdS*synRate*0.173363;
+CodonMatrix[37][5]:=dNdS*synRate*0.285701;
+CodonMatrix[37][21]:=0.0466309*dNdS*synRate*0.220452;
+CodonMatrix[37][33]:=0.0908767*dNdS*synRate*0.275329;
+CodonMatrix[37][36]:=0.0908767*synRate*0.226864;
+CodonMatrix[37][38]:=0.0466309*synRate*0.187249;
+CodonMatrix[37][39]:=1.7907*synRate*0.298098;
+CodonMatrix[37][41]:=0.0466309*dNdS*synRate*0.162228;
+CodonMatrix[37][45]:=1.7907*dNdS*synRate*0.278842;
+CodonMatrix[37][51]:=0.0475439*dNdS*synRate*0.173363;
+CodonMatrix[38][6]:=dNdS*synRate*0.285701;
+CodonMatrix[38][22]:=0.0466309*dNdS*synRate*0.220452;
+CodonMatrix[38][34]:=0.0908767*dNdS*synRate*0.275329;
+CodonMatrix[38][36]:=synRate*0.226864;
+CodonMatrix[38][37]:=0.0466309*synRate*0.287789;
+CodonMatrix[38][39]:=0.0475439*synRate*0.298098;
+CodonMatrix[38][42]:=0.0466309*dNdS*synRate*0.162228;
+CodonMatrix[38][46]:=1.7907*dNdS*synRate*0.278842;
+CodonMatrix[38][52]:=0.0475439*dNdS*synRate*0.173363;
+CodonMatrix[39][7]:=dNdS*synRate*0.285701;
+CodonMatrix[39][23]:=0.0466309*dNdS*synRate*0.220452;
+CodonMatrix[39][35]:=0.0908767*dNdS*synRate*0.275329;
+CodonMatrix[39][36]:=0.1128*synRate*0.226864;
+CodonMatrix[39][37]:=1.7907*synRate*0.287789;
+CodonMatrix[39][38]:=0.0475439*synRate*0.187249;
+CodonMatrix[39][43]:=0.0466309*dNdS*synRate*0.162228;
+CodonMatrix[39][47]:=1.7907*dNdS*synRate*0.278842;
+CodonMatrix[39][53]:=0.0475439*dNdS*synRate*0.173363;
+CodonMatrix[40][8]:=dNdS*synRate*0.285701;
+CodonMatrix[40][24]:=0.0466309*dNdS*synRate*0.220452;
+CodonMatrix[40][32]:=dNdS*synRate*0.275329;
+CodonMatrix[40][36]:=0.0466309*dNdS*synRate*0.283601;
+CodonMatrix[40][41]:=0.0908767*synRate*0.287789;
+CodonMatrix[40][42]:=synRate*0.187249;
+CodonMatrix[40][43]:=0.1128*synRate*0.298098;
+CodonMatrix[40][44]:=0.0475439*dNdS*synRate*0.278842;
+CodonMatrix[41][9]:=dNdS*synRate*0.285701;
+CodonMatrix[41][25]:=0.0466309*dNdS*synRate*0.220452;
+CodonMatrix[41][33]:=dNdS*synRate*0.275329;
+CodonMatrix[41][37]:=0.0466309*dNdS*synRate*0.283601;
+CodonMatrix[41][40]:=0.0908767*synRate*0.226864;
+CodonMatrix[41][42]:=0.0466309*synRate*0.187249;
+CodonMatrix[41][43]:=1.7907*synRate*0.298098;
+CodonMatrix[41][45]:=0.0475439*dNdS*synRate*0.278842;
+CodonMatrix[41][54]:=0.0475439*dNdS*synRate*0.173363;
+CodonMatrix[42][10]:=dNdS*synRate*0.285701;
+CodonMatrix[42][26]:=0.0466309*dNdS*synRate*0.220452;
+CodonMatrix[42][34]:=dNdS*synRate*0.275329;
+CodonMatrix[42][38]:=0.0466309*dNdS*synRate*0.283601;
+CodonMatrix[42][40]:=synRate*0.226864;
+CodonMatrix[42][41]:=0.0466309*synRate*0.287789;
+CodonMatrix[42][43]:=0.0475439*synRate*0.298098;
+CodonMatrix[42][46]:=0.0475439*dNdS*synRate*0.278842;
+CodonMatrix[42][55]:=0.0475439*dNdS*synRate*0.173363;
+CodonMatrix[43][11]:=dNdS*synRate*0.285701;
+CodonMatrix[43][27]:=0.0466309*dNdS*synRate*0.220452;
+CodonMatrix[43][35]:=dNdS*synRate*0.275329;
+CodonMatrix[43][39]:=0.0466309*dNdS*synRate*0.283601;
+CodonMatrix[43][40]:=0.1128*synRate*0.226864;
+CodonMatrix[43][41]:=1.7907*synRate*0.287789;
+CodonMatrix[43][42]:=0.0475439*synRate*0.187249;
+CodonMatrix[43][47]:=0.0475439*dNdS*synRate*0.278842;
+CodonMatrix[43][56]:=0.0475439*dNdS*synRate*0.173363;
+CodonMatrix[44][12]:=dNdS*synRate*0.285701;
+CodonMatrix[44][28]:=0.0466309*dNdS*synRate*0.220452;
+CodonMatrix[44][32]:=0.1128*dNdS*synRate*0.275329;
+CodonMatrix[44][36]:=1.7907*dNdS*synRate*0.283601;
+CodonMatrix[44][40]:=0.0475439*dNdS*synRate*0.162228;
+CodonMatrix[44][45]:=0.0908767*synRate*0.287789;
+CodonMatrix[44][46]:=synRate*0.187249;
+CodonMatrix[44][47]:=0.1128*synRate*0.298098;
+CodonMatrix[44][57]:=0.0475439*dNdS*synRate*0.173363;
+CodonMatrix[45][13]:=dNdS*synRate*0.285701;
+CodonMatrix[45][29]:=0.0466309*dNdS*synRate*0.220452;
+CodonMatrix[45][33]:=0.1128*dNdS*synRate*0.275329;
+CodonMatrix[45][37]:=1.7907*dNdS*synRate*0.283601;
+CodonMatrix[45][41]:=0.0475439*dNdS*synRate*0.162228;
+CodonMatrix[45][44]:=0.0908767*synRate*0.226864;
+CodonMatrix[45][46]:=0.0466309*synRate*0.187249;
+CodonMatrix[45][47]:=1.7907*synRate*0.298098;
+CodonMatrix[45][58]:=0.0475439*dNdS*synRate*0.173363;
+CodonMatrix[46][14]:=dNdS*synRate*0.285701;
+CodonMatrix[46][30]:=0.0466309*dNdS*synRate*0.220452;
+CodonMatrix[46][34]:=0.1128*dNdS*synRate*0.275329;
+CodonMatrix[46][38]:=1.7907*dNdS*synRate*0.283601;
+CodonMatrix[46][42]:=0.0475439*dNdS*synRate*0.162228;
+CodonMatrix[46][44]:=synRate*0.226864;
+CodonMatrix[46][45]:=0.0466309*synRate*0.287789;
+CodonMatrix[46][47]:=0.0475439*synRate*0.298098;
+CodonMatrix[46][59]:=0.0475439*dNdS*synRate*0.173363;
+CodonMatrix[47][15]:=dNdS*synRate*0.285701;
+CodonMatrix[47][31]:=0.0466309*dNdS*synRate*0.220452;
+CodonMatrix[47][35]:=0.1128*dNdS*synRate*0.275329;
+CodonMatrix[47][39]:=1.7907*dNdS*synRate*0.283601;
+CodonMatrix[47][43]:=0.0475439*dNdS*synRate*0.162228;
+CodonMatrix[47][44]:=0.1128*synRate*0.226864;
+CodonMatrix[47][45]:=1.7907*synRate*0.287789;
+CodonMatrix[47][46]:=0.0475439*synRate*0.187249;
+CodonMatrix[47][60]:=0.0475439*dNdS*synRate*0.173363;
+CodonMatrix[48][1]:=0.1128*dNdS*synRate*0.285701;
+CodonMatrix[48][17]:=1.7907*dNdS*synRate*0.220452;
+CodonMatrix[48][33]:=0.0475439*dNdS*synRate*0.320485;
+CodonMatrix[48][49]:=1.7907*synRate*0.298098;
+CodonMatrix[48][51]:=0.0908767*dNdS*synRate*0.283601;
+CodonMatrix[48][54]:=dNdS*synRate*0.162228;
+CodonMatrix[48][58]:=0.1128*dNdS*synRate*0.278842;
+CodonMatrix[49][3]:=0.1128*dNdS*synRate*0.285701;
+CodonMatrix[49][19]:=1.7907*dNdS*synRate*0.220452;
+CodonMatrix[49][35]:=0.0475439*dNdS*synRate*0.320485;
+CodonMatrix[49][48]:=1.7907*synRate*0.287789;
+CodonMatrix[49][53]:=0.0908767*dNdS*synRate*0.283601;
+CodonMatrix[49][56]:=dNdS*synRate*0.162228;
+CodonMatrix[49][60]:=0.1128*dNdS*synRate*0.278842;
+CodonMatrix[50][4]:=0.1128*dNdS*synRate*0.285701;
+CodonMatrix[50][20]:=1.7907*dNdS*synRate*0.220452;
+CodonMatrix[50][36]:=0.0475439*dNdS*synRate*0.320485;
+CodonMatrix[50][51]:=0.0908767*synRate*0.287789;
+CodonMatrix[50][52]:=synRate*0.187249;
+CodonMatrix[50][53]:=0.1128*synRate*0.298098;
+CodonMatrix[50][57]:=1.7907*dNdS*synRate*0.278842;
+CodonMatrix[51][5]:=0.1128*dNdS*synRate*0.285701;
+CodonMatrix[51][21]:=1.7907*dNdS*synRate*0.220452;
+CodonMatrix[51][37]:=0.0475439*dNdS*synRate*0.320485;
+CodonMatrix[51][48]:=0.0908767*dNdS*synRate*0.275329;
+CodonMatrix[51][50]:=0.0908767*synRate*0.226864;
+CodonMatrix[51][52]:=0.0466309*synRate*0.187249;
+CodonMatrix[51][53]:=1.7907*synRate*0.298098;
+CodonMatrix[51][54]:=0.0466309*dNdS*synRate*0.162228;
+CodonMatrix[51][58]:=1.7907*dNdS*synRate*0.278842;
+CodonMatrix[52][6]:=0.1128*dNdS*synRate*0.285701;
+CodonMatrix[52][22]:=1.7907*dNdS*synRate*0.220452;
+CodonMatrix[52][38]:=0.0475439*dNdS*synRate*0.320485;
+CodonMatrix[52][50]:=synRate*0.226864;
+CodonMatrix[52][51]:=0.0466309*synRate*0.287789;
+CodonMatrix[52][53]:=0.0475439*synRate*0.298098;
+CodonMatrix[52][55]:=0.0466309*dNdS*synRate*0.162228;
+CodonMatrix[52][59]:=1.7907*dNdS*synRate*0.278842;
+CodonMatrix[53][7]:=0.1128*dNdS*synRate*0.285701;
+CodonMatrix[53][23]:=1.7907*dNdS*synRate*0.220452;
+CodonMatrix[53][39]:=0.0475439*dNdS*synRate*0.320485;
+CodonMatrix[53][49]:=0.0908767*dNdS*synRate*0.275329;
+CodonMatrix[53][50]:=0.1128*synRate*0.226864;
+CodonMatrix[53][51]:=1.7907*synRate*0.287789;
+CodonMatrix[53][52]:=0.0475439*synRate*0.187249;
+CodonMatrix[53][56]:=0.0466309*dNdS*synRate*0.162228;
+CodonMatrix[53][60]:=1.7907*dNdS*synRate*0.278842;
+CodonMatrix[54][9]:=0.1128*dNdS*synRate*0.285701;
+CodonMatrix[54][25]:=1.7907*dNdS*synRate*0.220452;
+CodonMatrix[54][41]:=0.0475439*dNdS*synRate*0.320485;
+CodonMatrix[54][48]:=dNdS*synRate*0.275329;
+CodonMatrix[54][51]:=0.0466309*dNdS*synRate*0.283601;
+CodonMatrix[54][55]:=0.0466309*dNdS*synRate*0.187249;
+CodonMatrix[54][56]:=1.7907*synRate*0.298098;
+CodonMatrix[54][58]:=0.0475439*dNdS*synRate*0.278842;
+CodonMatrix[55][10]:=0.1128*dNdS*synRate*0.285701;
+CodonMatrix[55][26]:=1.7907*dNdS*synRate*0.220452;
+CodonMatrix[55][42]:=0.0475439*dNdS*synRate*0.320485;
+CodonMatrix[55][52]:=0.0466309*dNdS*synRate*0.283601;
+CodonMatrix[55][54]:=0.0466309*dNdS*synRate*0.287789;
+CodonMatrix[55][56]:=0.0475439*dNdS*synRate*0.298098;
+CodonMatrix[55][59]:=0.0475439*dNdS*synRate*0.278842;
+CodonMatrix[56][11]:=0.1128*dNdS*synRate*0.285701;
+CodonMatrix[56][27]:=1.7907*dNdS*synRate*0.220452;
+CodonMatrix[56][43]:=0.0475439*dNdS*synRate*0.320485;
+CodonMatrix[56][49]:=dNdS*synRate*0.275329;
+CodonMatrix[56][53]:=0.0466309*dNdS*synRate*0.283601;
+CodonMatrix[56][54]:=1.7907*synRate*0.287789;
+CodonMatrix[56][55]:=0.0475439*dNdS*synRate*0.187249;
+CodonMatrix[56][60]:=0.0475439*dNdS*synRate*0.278842;
+CodonMatrix[57][12]:=0.1128*dNdS*synRate*0.285701;
+CodonMatrix[57][28]:=1.7907*synRate*0.220452;
+CodonMatrix[57][44]:=0.0475439*dNdS*synRate*0.320485;
+CodonMatrix[57][50]:=1.7907*dNdS*synRate*0.283601;
+CodonMatrix[57][58]:=0.0908767*dNdS*synRate*0.287789;
+CodonMatrix[57][59]:=synRate*0.187249;
+CodonMatrix[57][60]:=0.1128*dNdS*synRate*0.298098;
+CodonMatrix[58][13]:=0.1128*dNdS*synRate*0.285701;
+CodonMatrix[58][29]:=1.7907*dNdS*synRate*0.220452;
+CodonMatrix[58][45]:=0.0475439*dNdS*synRate*0.320485;
+CodonMatrix[58][48]:=0.1128*dNdS*synRate*0.275329;
+CodonMatrix[58][51]:=1.7907*dNdS*synRate*0.283601;
+CodonMatrix[58][54]:=0.0475439*dNdS*synRate*0.162228;
+CodonMatrix[58][57]:=0.0908767*dNdS*synRate*0.226864;
+CodonMatrix[58][59]:=0.0466309*dNdS*synRate*0.187249;
+CodonMatrix[58][60]:=1.7907*synRate*0.298098;
+CodonMatrix[59][14]:=0.1128*dNdS*synRate*0.285701;
+CodonMatrix[59][30]:=1.7907*synRate*0.220452;
+CodonMatrix[59][46]:=0.0475439*dNdS*synRate*0.320485;
+CodonMatrix[59][52]:=1.7907*dNdS*synRate*0.283601;
+CodonMatrix[59][55]:=0.0475439*dNdS*synRate*0.162228;
+CodonMatrix[59][57]:=synRate*0.226864;
+CodonMatrix[59][58]:=0.0466309*dNdS*synRate*0.287789;
+CodonMatrix[59][60]:=0.0475439*dNdS*synRate*0.298098;
+CodonMatrix[60][15]:=0.1128*dNdS*synRate*0.285701;
+CodonMatrix[60][31]:=1.7907*dNdS*synRate*0.220452;
+CodonMatrix[60][47]:=0.0475439*dNdS*synRate*0.320485;
+CodonMatrix[60][49]:=0.1128*dNdS*synRate*0.275329;
+CodonMatrix[60][53]:=1.7907*dNdS*synRate*0.283601;
+CodonMatrix[60][56]:=0.0475439*dNdS*synRate*0.162228;
+CodonMatrix[60][57]:=0.1128*dNdS*synRate*0.226864;
+CodonMatrix[60][58]:=1.7907*synRate*0.287789;
+CodonMatrix[60][59]:=0.0475439*dNdS*synRate*0.187249;
+
+codonFrequencies={
+{   0.0183246365764}
+{   0.0232457744483}
+{    0.015124836785}
+{   0.0240784934301}
+{   0.0188751348721}
+{   0.0239441107653}
+{   0.0155792085177}
+{   0.0248018458165}
+{   0.0107971362219}
+{   0.0136967405741}
+{  0.00891176872296}
+{   0.0141873904292}
+{   0.0185584315825}
+{    0.023542355827}
+{   0.0153178071227}
+{   0.0243856990599}
+{   0.0141396030542}
+{     0.01793683722}
+{   0.0116705827975}
+{   0.0185793774314}
+{   0.0145643769564}
+{   0.0184756854684}
+{   0.0120211837993}
+{   0.0191375285068}
+{  0.00833125501088}
+{   0.0105686393314}
+{  0.00687647319654}
+{   0.0109472331529}
+{   0.0143200032804}
+{   0.0181656844854}
+{   0.0118194820112}
+{   0.0188164225506}
+{   0.0205556748551}
+{   0.0260759649625}
+{   0.0169662970337}
+{   0.0270100681064}
+{   0.0211731967322}
+{    0.026859324251}
+{   0.0174759888665}
+{   0.0278214891896}
+{   0.0121116956737}
+{   0.0153643290356}
+{  0.00999678326444}
+{   0.0159147158794}
+{   0.0208179345791}
+{    0.026408655347}
+{   0.0171827616551}
+{   0.0273546762525}
+{   0.0141055172951}
+{   0.0146108105056}
+{    0.011453416705}
+{   0.0145292672123}
+{  0.00945345123605}
+{   0.0150497401536}
+{  0.00831117119733}
+{    0.005407654115}
+{  0.00860889713599}
+{   0.0112612414028}
+{   0.0142854826379}
+{  0.00929483307916}
+{   0.0147972226354}
+}
+;
+Model MGModel=(CodonMatrix,codonFrequencies,0);
+
+UseModel (MGModel);
+Tree siteTree=(((((((AY030098_254,((EP2002006_84,(AB294779_66,(02202001_73,02198022_73)Node14)Node12)Node10,(AF414417_198,X76716_BRISTOL_186)Node17)Node9)Node7,U46500_CAMBERWELL_174)Node6,AY032605_254)Node5,AF080558_146)Node4,(((((((DQ975270_126,AF427120_102)Node29,(DQ078829_138,AY038600_126)Node32)Node28,(AY532119_126,(AY532133_138,AY532132_138)Node37)Node35)Node27,(((AF414424_162,((AY532124_138,(AY532123_126,((AY532122_138,AY532125_126)Node50,AY741811_138)Node49)Node47)Node45,AY532121_ [...]
+
+siteTree.AY030098_254.synRate:=0.117473;
+siteTree.EP2002006_84.synRate:=0.0504822;
+siteTree.AB294779_66.synRate:=0.0214285;
+siteTree.02202001_73.synRate:=0.0424309;
+siteTree.02198022_73.synRate:=0.0107972;
+siteTree.Node14.synRate:=0;
+siteTree.Node12.synRate:=0.0790766;
+siteTree.Node10.synRate:=0.325562;
+siteTree.AF414417_198.synRate:=0.0325848;
+siteTree.X76716_BRISTOL_186.synRate:=0.00287904;
+siteTree.Node17.synRate:=0.105244;
+siteTree.Node9.synRate:=0.15224;
+siteTree.Node7.synRate:=0.0364048;
+siteTree.U46500_CAMBERWELL_174.synRate:=0.152211;
+siteTree.Node6.synRate:=0.0138522;
+siteTree.AY032605_254.synRate:=0.0204339;
+siteTree.Node5.synRate:=0.22598;
+siteTree.AF080558_146.synRate:=0.0993882;
+siteTree.Node4.synRate:=0.0130061;
+siteTree.DQ975270_126.synRate:=0.040742;
+siteTree.AF427120_102.synRate:=0.104196;
+siteTree.Node29.synRate:=0.0173569;
+siteTree.DQ078829_138.synRate:=0.0948531;
+siteTree.AY038600_126.synRate:=0.0729708;
+siteTree.Node32.synRate:=0.0140677;
+siteTree.Node28.synRate:=0;
+siteTree.AY532119_126.synRate:=0.0603134;
+siteTree.AY532133_138.synRate:=0.0142767;
+siteTree.AY532132_138.synRate:=0.0105896;
+siteTree.Node37.synRate:=0.0550775;
+siteTree.Node35.synRate:=0.0468137;
+siteTree.Node27.synRate:=0.0166208;
+siteTree.AF414424_162.synRate:=0.049904;
+siteTree.AY532124_138.synRate:=0.0177237;
+siteTree.AY532123_126.synRate:=0;
+siteTree.AY532122_138.synRate:=0.00707648;
+siteTree.AY532125_126.synRate:=0;
+siteTree.Node50.synRate:=0;
+siteTree.AY741811_138.synRate:=0.00707634;
+siteTree.Node49.synRate:=0.00353737;
+siteTree.Node47.synRate:=0;
+siteTree.Node45.synRate:=0.00350776;
+siteTree.AY532121_138.synRate:=0.010661;
+siteTree.Node44.synRate:=0.0752132;
+siteTree.Node42.synRate:=0;
+siteTree.AY532129_126.synRate:=0.0608784;
+siteTree.AF080552_154.synRate:=0.0212698;
+siteTree.AF080555_154.synRate:=0.0177274;
+siteTree.AF080549_156.synRate:=0.0106229;
+siteTree.Node63.synRate:=0;
+siteTree.AF080553_154.synRate:=0.00707407;
+siteTree.AF080556_153.synRate:=0;
+siteTree.Node67.synRate:=0.00353444;
+siteTree.AF080557_152.synRate:=0.0212713;
+siteTree.Node66.synRate:=0;
+siteTree.Node62.synRate:=0;
+siteTree.Node60.synRate:=0.00705986;
+siteTree.Node58.synRate:=0.00710522;
+siteTree.AJ004864_GRIMSBY_162.synRate:=0.021304;
+siteTree.AY532114_138.synRate:=0.0197138;
+siteTree.AF425764_126.synRate:=0.0412421;
+siteTree.AF425763_126.synRate:=0.0267816;
+siteTree.Node76.synRate:=0.00325789;
+siteTree.Node74.synRate:=0.0285816;
+siteTree.AF427121_102.synRate:=0.0555082;
+siteTree.AF427123_102.synRate:=0.00353112;
+siteTree.AF427122_102.synRate:=0.0106484;
+siteTree.Node82.synRate:=0.0281338;
+siteTree.AF425766_90.synRate:=0.036157;
+siteTree.Node81.synRate:=0.00859125;
+siteTree.Node79.synRate:=0.0543249;
+siteTree.Node73.synRate:=0.00519407;
+siteTree.Node71.synRate:=0;
+siteTree.Node57.synRate:=0.0070735;
+siteTree.AF414425_BURWASHLANDING_162.synRate:=0.0463818;
+siteTree.AY532127_138.synRate:=0.0284849;
+siteTree.AY532116_138.synRate:=0.0540424;
+siteTree.AF427115_114.synRate:=0.025237;
+siteTree.AF427116_114.synRate:=0.00675671;
+siteTree.Node95.synRate:=0.0726236;
+siteTree.Node93.synRate:=0.0138767;
+siteTree.Node91.synRate:=0.00351976;
+siteTree.AY532111_138.synRate:=0.0356551;
+siteTree.Node90.synRate:=0.00713141;
+siteTree.Node88.synRate:=0.00350334;
+siteTree.OB1995012_164.synRate:=0.0607196;
+siteTree.Node87.synRate:=0;
+siteTree.AF080550_156.synRate:=0.0319857;
+siteTree.Node86.synRate:=0;
+siteTree.Node56.synRate:=0.0035369;
+siteTree.AY532117_138.synRate:=0.0682505;
+siteTree.AF080551_161.synRate:=0.0106416;
+siteTree.Node102.synRate:=0.00707342;
+siteTree.AF472623_155.synRate:=0.0070754;
+siteTree.AY532128_138.synRate:=0.03563;
+siteTree.AY532130_138.synRate:=0.0212904;
+siteTree.AY532131_138.synRate:=0.00353726;
+siteTree.Node111.synRate:=0.00351993;
+siteTree.Node109.synRate:=0.0106522;
+siteTree.AY532112_138.synRate:=0.0035369;
+siteTree.AY532113_126.synRate:=0.0248428;
+siteTree.Node115.synRate:=0;
+siteTree.AY532120_138.synRate:=0.0283969;
+siteTree.Node114.synRate:=0;
+siteTree.Node108.synRate:=0;
+siteTree.AY532134_138.synRate:=0.014198;
+siteTree.AY532135_126.synRate:=0.00351834;
+siteTree.Node119.synRate:=0.0106472;
+siteTree.Node107.synRate:=0;
+siteTree.Node105.synRate:=0.017719;
+siteTree.Node101.synRate:=0;
+siteTree.Node55.synRate:=0.00354156;
+siteTree.Node41.synRate:=0.00354058;
+siteTree.AF080554_154.synRate:=0.032114;
+siteTree.OB2000016_106.synRate:=0.0213318;
+siteTree.OB2000015_106.synRate:=0.00705606;
+siteTree.Node125.synRate:=0.0105709;
+siteTree.OB2000043_98.synRate:=0.0357553;
+siteTree.Node124.synRate:=0.0466989;
+siteTree.Node122.synRate:=0.00702851;
+siteTree.Node40.synRate:=0.00372548;
+siteTree.Node26.synRate:=0.00353391;
+siteTree.AY532126_126.synRate:=0.0285289;
+siteTree.AY532118_138.synRate:=0.0660137;
+siteTree.OB2001058_86.synRate:=0.0309037;
+siteTree.AF425765_95.synRate:=0.00708324;
+siteTree.OB2001018_95.synRate:=0.0178104;
+siteTree.Node138.synRate:=0.00824248;
+siteTree.Node136.synRate:=0.00672271;
+siteTree.Node134.synRate:=0.0350256;
+siteTree.AF427114_114.synRate:=0.0286203;
+siteTree.Node133.synRate:=0.010501;
+siteTree.Node131.synRate:=0.0106862;
+siteTree.AF080559_145.synRate:=0.010633;
+siteTree.AY081134_138.synRate:=0.0284918;
+siteTree.Node143.synRate:=0.0214624;
+siteTree.AF427113_114.synRate:=0.0213425;
+siteTree.Node142.synRate:=0.00706721;
+siteTree.Node130.synRate:=0.0108326;
+siteTree.AY532115_138.synRate:=0.0211986;
+siteTree.Node129.synRate:=0.0249659;
+siteTree.Node25.synRate:=0.0035547;
+siteTree.OB1995001_165.synRate:=0.0213642;
+siteTree.OB1995002_168.synRate:=0.0213374;
+siteTree.Node148.synRate:=0.0139999;
+siteTree.Node24.synRate:=0.00769766;
+siteTree.AJ277619_162.synRate:=0.0685136;
+siteTree.AB083781_83.synRate:=0.0357628;
+siteTree.Node151.synRate:=0.0281783;
+siteTree.Node23.synRate:=0.010807;
+siteTree.Node3.synRate:=0.0203708;
+siteTree.AF427117_102.synRate:=0.185792;
+siteTree.Node2.synRate:=0.0390416;
+siteTree.OB2006151_32.synRate:=0.0799953;
+siteTree.08450_12.synRate:=0.0876587;
+siteTree.Node155.synRate:=0.261775;
+siteTree.DQ364459_78.synRate:=0.0693291;
+siteTree.EU310927_78.synRate:=0.0938309;
+siteTree.Node160.synRate:=0.0654266;
+siteTree.EP2002022_84.synRate:=0.0356171;
+siteTree.OB2003001_73.synRate:=0.0356582;
+siteTree.Node165.synRate:=0.00658385;
+siteTree.AY502017_78.synRate:=0.010676;
+siteTree.AY502019_78.synRate:=0.0284333;
+siteTree.Node171.synRate:=0.00348866;
+siteTree.DQ415279_CARLOW_78.synRate:=0.0391343;
+siteTree.AY502018_78.synRate:=0;
+siteTree.AY588014_74.synRate:=0;
+siteTree.AY588016_74.synRate:=0.00353132;
+siteTree.Node179.synRate:=0.0212526;
+siteTree.Node177.synRate:=0;
+siteTree.AY588028_69.synRate:=0;
+siteTree.AY588029_68.synRate:=0.00706725;
+siteTree.Node185.synRate:=0;
+siteTree.AY588006_75.synRate:=0;
+siteTree.AY588001_75.synRate:=0;
+siteTree.Node191.synRate:=0;
+siteTree.AY587993_74.synRate:=0;
+siteTree.AY587994_74.synRate:=0;
+siteTree.AY587996_74.synRate:=0;
+siteTree.Node196.synRate:=0;
+siteTree.Node194.synRate:=0;
+siteTree.Node190.synRate:=0;
+siteTree.AY587990_74.synRate:=0;
+siteTree.AY588011_72.synRate:=0;
+siteTree.Node200.synRate:=0;
+siteTree.AY587992_74.synRate:=0.00353114;
+siteTree.Node199.synRate:=0;
+siteTree.Node189.synRate:=0;
+siteTree.AY587991_74.synRate:=0.00353134;
+siteTree.AY588025_71.synRate:=0.00353119;
+siteTree.AY588030_71.synRate:=0.00353221;
+siteTree.AY588022_71.synRate:=0;
+siteTree.Node209.synRate:=0;
+siteTree.AY588020_71.synRate:=0;
+siteTree.AY581254_71.synRate:=0;
+siteTree.Node214.synRate:=0;
+siteTree.AY588021_70.synRate:=0.00706788;
+siteTree.Node213.synRate:=0.00353127;
+siteTree.AY588027_70.synRate:=0;
+siteTree.Node212.synRate:=0;
+siteTree.Node208.synRate:=0;
+siteTree.Node206.synRate:=0.00706735;
+siteTree.Node204.synRate:=0;
+siteTree.Node188.synRate:=0.00353164;
+siteTree.Node184.synRate:=0.00707253;
+siteTree.AY587998_75.synRate:=0.00353137;
+siteTree.AY587997_75.synRate:=0;
+siteTree.Node219.synRate:=0.0106268;
+siteTree.Node183.synRate:=0.00709058;
+siteTree.AY587985_76.synRate:=0;
+siteTree.AY588013_75.synRate:=0;
+siteTree.Node223.synRate:=0;
+siteTree.AY588026_76.synRate:=0;
+siteTree.AY587983_76.synRate:=0;
+siteTree.Node227.synRate:=0;
+siteTree.AY587988_75.synRate:=0.00353352;
+siteTree.AY587986_75.synRate:=0;
+siteTree.Node230.synRate:=0.00353152;
+siteTree.Node226.synRate:=0;
+siteTree.Node222.synRate:=0.00707722;
+siteTree.Node182.synRate:=0.00707646;
+siteTree.Node176.synRate:=0.00709258;
+siteTree.Node174.synRate:=0.00705951;
+siteTree.Node170.synRate:=0;
+siteTree.OB2003003_73.synRate:=0.0643816;
+siteTree.Node169.synRate:=0.00353146;
+siteTree.AY502023_FARMINGTONHILLS_78.synRate:=0.00706916;
+siteTree.OB2003LN457_63.synRate:=0.0248754;
+siteTree.AY502021_66.synRate:=0.00353492;
+siteTree.AY502022_66.synRate:=0;
+siteTree.AY502020_66.synRate:=0;
+siteTree.Node243.synRate:=0;
+siteTree.Node241.synRate:=0.0141908;
+siteTree.Node239.synRate:=0.00351845;
+siteTree.OB2004007_60.synRate:=0.04265;
+siteTree.Node238.synRate:=0;
+siteTree.OB2004003_61.synRate:=0.0319719;
+siteTree.OB2004012_59.synRate:=0.090381;
+siteTree.Node247.synRate:=0.0430885;
+siteTree.Node237.synRate:=0;
+siteTree.Node235.synRate:=0;
+siteTree.OB2003023_71.synRate:=0.0463561;
+siteTree.AY485642_74.synRate:=0.0106156;
+siteTree.Node250.synRate:=0.0106537;
+siteTree.Node234.synRate:=0;
+siteTree.Node168.synRate:=0.00848842;
+siteTree.Node164.synRate:=0.115032;
+siteTree.EF187497_33.synRate:=0.100531;
+siteTree.OB2006038_35.synRate:=0.0475302;
+siteTree.AUS2006_32.synRate:=0.0280502;
+siteTree.OB2006169_26.synRate:=0.0319226;
+siteTree.OB2008165_9.synRate:=0.0177398;
+siteTree.OB2008158_9.synRate:=0.0177174;
+siteTree.Node267.synRate:=0.0323111;
+siteTree.OB2008155_9.synRate:=0.0391949;
+siteTree.Node266.synRate:=0.0177213;
+siteTree.OB2007009_24.synRate:=0.0106168;
+siteTree.Node265.synRate:=0.00353374;
+siteTree.OB2007049_24.synRate:=0.0212631;
+siteTree.Node264.synRate:=0.00352653;
+siteTree.OB2007220_15.synRate:=0.00328357;
+siteTree.OB2007286_13.synRate:=0.0215239;
+siteTree.Node273.synRate:=0.0681363;
+siteTree.Node263.synRate:=0;
+siteTree.Node261.synRate:=0;
+siteTree.OB2006070_34.synRate:=0.0105976;
+siteTree.AB294789_30.synRate:=0.0176806;
+siteTree.OB2006239_25.synRate:=0.0283599;
+siteTree.Node280.synRate:=0;
+siteTree.OB2006182_26.synRate:=0.0106048;
+siteTree.AB294790_30.synRate:=0.00706055;
+siteTree.Node283.synRate:=0;
+siteTree.Node279.synRate:=0;
+siteTree.Node277.synRate:=0;
+siteTree.OB2008092_12.synRate:=0.060526;
+siteTree.Node276.synRate:=0.0141457;
+siteTree.Node260.synRate:=0.00740998;
+siteTree.Node258.synRate:=0.00913417;
+siteTree.Node256.synRate:=0.0184644;
+siteTree.Node254.synRate:=0.0637424;
+siteTree.OB2004083_51.synRate:=0;
+siteTree.OB2004059_52.synRate:=0.00707015;
+siteTree.Node290.synRate:=0.028365;
+siteTree.AB294788_30.synRate:=0.0498309;
+siteTree.Node289.synRate:=0;
+siteTree.AB294785_42.synRate:=0.0532687;
+siteTree.AB294783_54.synRate:=0.0320438;
+siteTree.AB294784_42.synRate:=0.0463639;
+siteTree.Node297.synRate:=0;
+siteTree.Node295.synRate:=0.00353635;
+siteTree.DQ078794_56.synRate:=0.0428467;
+siteTree.Node294.synRate:=0.00694941;
+siteTree.Node288.synRate:=0.00707158;
+siteTree.OB2004039_56.synRate:=0.0212532;
+siteTree.OB2004048_54.synRate:=0.0176892;
+siteTree.OB2006046_35.synRate:=0.0426488;
+siteTree.Node304.synRate:=0;
+siteTree.OB2004028_57.synRate:=0.00710659;
+siteTree.OB2006054_35.synRate:=0.0895988;
+siteTree.Node307.synRate:=0.00704265;
+siteTree.Node303.synRate:=0.00706397;
+siteTree.Node301.synRate:=0;
+siteTree.Node287.synRate:=0.0636287;
+siteTree.Node253.synRate:=0.131322;
+siteTree.Node163.synRate:=0;
+siteTree.Node159.synRate:=0.0135276;
+siteTree.OB2008179_9.synRate:=0.0176349;
+siteTree.OB2007317_13.synRate:=0.00360676;
+siteTree.Node313.synRate:=0.050903;
+siteTree.OB2007254_15.synRate:=0.0941677;
+siteTree.Node312.synRate:=0.21553;
+siteTree.OB2007210_15.synRate:=0.0223484;
+siteTree.OB2007300_13.synRate:=0.0166966;
+siteTree.Node318.synRate:=0.0456527;
+siteTree.OB2006089_33.synRate:=0.0141317;
+siteTree.OB2006173_25.synRate:=0.0141642;
+siteTree.OB2006226_25.synRate:=0.0319139;
+siteTree.Node326.synRate:=0.00349186;
+siteTree.EU096512_30.synRate:=0.0071861;
+siteTree.EU096513_18.synRate:=0.043565;
+siteTree.Node330.synRate:=0.00364375;
+siteTree.OB2007011_22.synRate:=0.00350987;
+siteTree.OB2006232_25.synRate:=0.00354914;
+siteTree.Node333.synRate:=0.0678097;
+siteTree.Node329.synRate:=0;
+siteTree.Node325.synRate:=0.00352294;
+siteTree.Node323.synRate:=0;
+siteTree.OB2006115_32.synRate:=0.0105824;
+siteTree.OB2006235_25.synRate:=0.0390155;
+siteTree.Node338.synRate:=0;
+siteTree.OB2008039_12.synRate:=0.0461656;
+siteTree.AB294793_30.synRate:=0.0249518;
+siteTree.EF684915_30.synRate:=0.0428155;
+siteTree.Node343.synRate:=0.00334562;
+siteTree.Node341.synRate:=0;
+siteTree.Node337.synRate:=0.00352344;
+siteTree.EU366113_30.synRate:=0.0425616;
+siteTree.OB2006234_25.synRate:=0.0105504;
+siteTree.OB2006164_27.synRate:=0.0142078;
+siteTree.Node348.synRate:=0.042706;
+siteTree.Node346.synRate:=0;
+siteTree.Node336.synRate:=0.00352317;
+siteTree.Node322.synRate:=0;
+siteTree.AB291542_30.synRate:=0.0465332;
+siteTree.AB294794_30.synRate:=0.0284348;
+siteTree.OB2007028_24.synRate:=0.0462061;
+siteTree.OB2008013_12.synRate:=0.0248384;
+siteTree.OB2008043_13.synRate:=0.0212362;
+siteTree.OB2007209_15.synRate:=0;
+siteTree.Node360.synRate:=0.0212961;
+siteTree.OB2007214_15.synRate:=0.0213037;
+siteTree.Node359.synRate:=0.0141828;
+siteTree.Node357.synRate:=0.0212237;
+siteTree.Node355.synRate:=0;
+siteTree.Node353.synRate:=0.00339432;
+siteTree.Node351.synRate:=0.0176706;
+siteTree.Node321.synRate:=0.026826;
+siteTree.Node317.synRate:=0.193358;
+siteTree.Node311.synRate:=0.049184;
+siteTree.DQ369797_2003ASIA_90.synRate:=0.0435342;
+siteTree.AB294782_54.synRate:=0.0319205;
+siteTree.DQ419908_56.synRate:=0.0212465;
+siteTree.AB294787_42.synRate:=0.0356194;
+siteTree.AB220921_CHIBA_48.synRate:=0.0320826;
+siteTree.Node371.synRate:=0.00343635;
+siteTree.Node369.synRate:=0;
+siteTree.Node367.synRate:=0;
+siteTree.DQ419907_56.synRate:=0.0462177;
+siteTree.AB294792_30.synRate:=0.0283914;
+siteTree.Node377.synRate:=0;
+siteTree.AB294786_42.synRate:=0.0106042;
+siteTree.AB294791_30.synRate:=0.0319228;
+siteTree.Node381.synRate:=0;
+siteTree.AB220923_48.synRate:=0.0390569;
+siteTree.Node380.synRate:=0.00353036;
+siteTree.Node376.synRate:=0.00711497;
+siteTree.EF535854_30.synRate:=0.0427705;
+siteTree.Node375.synRate:=0.00349055;
+siteTree.AB220922_48.synRate:=0.0355135;
+siteTree.Node374.synRate:=0;
+siteTree.Node366.synRate:=0.00272389;
+siteTree.Node364.synRate:=0.148099;
+siteTree.Node310.synRate:=0.0513432;
+siteTree.Node158.synRate:=0.0936503;
+
+DataSet ds = ReadDataFile(USE_NEXUS_FILE_DATA);
+DataSetFilter siteFilter = CreateFilter(ds,3,"0-2","43,25,73,72,0,60,71,38,44,58,21,49,15,45,19,35,34,61,26,24,23,27,13,22,31,42,55,39,47,56,57,75,12,64,63,50,52,51,66,62,29,16,69,70,1,5,40,17,41,53,30,32,33,2,3,20,36,37,48,8,7,9,28,18,11,65,10,68,59,46,67,14,6,4,54,74,94,164,93,133,144,141,146,97,99,135,98,121,122,129,130,118,117,112-114,109,119,111,110,126,131,125,123,104,124,128,116,115,106,120,127,105,108,107,147,103,149,101,102,100,151,150,152,148,96,138,158,95,166,192,191,190,174,1 [...]
+
+ClearConstraints (siteTree);
+global alpha = 1;
+ReplicateConstraint ("this1.?.synRate:=alpha*this2.?.synRate__", siteTree, siteTree);
+
+/* test preamble */
+
+	_testDescription 		= " fit the MG94x012345 model to a single site alignment with 194 sequences ";
+	_expectedLL 			= -29.826;
+	ExecuteAFile ("../Shared/TestInstrumentation.bf");
+	startTestTimer (_testDescription);
+
+/* end test preamble */
+
+OPTIMIZATION_PRECISION = 0.001;
+VERBOSITY_LEVEL        = -1;
+
+
+LikelihoodFunction siteLikelihood = (siteFilter,siteTree);
+Optimize (res, siteLikelihood);
+
+/* test epilogue */
+	timeMatrix = endTestTimer 				  (_testDescription);
+	if (logTestResult    (Abs (res[1][0] - _expectedLL) < 2*OPTIMIZATION_PRECISION))
+	{
+		return timeMatrix;
+	}
+	return 0;
+/* end test epilogue */
+
+END;
\ No newline at end of file
diff --git a/tests/hbltests/Trickier/NonReversibleWithDynamicFrequencies.bf b/tests/hbltests/Trickier/NonReversibleWithDynamicFrequencies.bf
new file mode 100644
index 0000000..8dd3c94
--- /dev/null
+++ b/tests/hbltests/Trickier/NonReversibleWithDynamicFrequencies.bf
@@ -0,0 +1,25 @@
+/* test preamble */
+
+	_testDescription 		= " fit the non-reversible nucleotide model with parametric base frequencies to an alignment of 13 HIV env V3 sequences";
+	_expectedLL 			= -1139.17487295371;
+	ExecuteAFile 			("../Shared/TestInstrumentation.bf");
+	startTestTimer 			(_testDescription);
+
+/* end test preamble */
+
+DataSet 		ds = ReadDataFile("../data/HIVenvSweden.seq");
+DataSetFilter  filteredData = CreateFilter (ds,1);
+ExecuteAFile   ( HYPHY_LIB_DIRECTORY + "TemplateBatchFiles" + DIRECTORY_SEPARATOR +  "TemplateModels" + DIRECTORY_SEPARATOR + "NRM+Freqs.mdl");
+Tree NREVTree = DATAFILE_TREE;
+
+LikelihoodFunction lf = ( filteredData, NREVTree );	
+Optimize ( res, lf );
+
+/* test epilogue */
+	timeMatrix = endTestTimer 				  (_testDescription);
+	if (logTestResult (Abs (res[1][0] - _expectedLL) < 0.01))
+	{
+		return timeMatrix;
+	}
+	return 0;
+/* end test epilogue */
\ No newline at end of file
diff --git a/tests/hbltests/UnitTests/HBLCommands/AllCommands.bf b/tests/hbltests/UnitTests/HBLCommands/AllCommands.bf
new file mode 100644
index 0000000..ab58ef6
--- /dev/null
+++ b/tests/hbltests/UnitTests/HBLCommands/AllCommands.bf
@@ -0,0 +1,575 @@
+//Built-in functions
+
+function operators()
+{
+    //! (operator)
+
+    //Undefined for Matrix and Trees
+    a = 0.0;
+    assert(!a==1.0,"!a==1.0 failed");
+
+    a = 5.7;
+    assert(!a==0.0,"!a==0.0 failed");
+
+    a = "/bin/bash";
+    assert(!a==1.0,"!a==1.0 failed");
+
+    a = "/nonexistent/filepath";
+    assert(!a==0.0, "!\"/nonexistent/filepath\"==0.0 failed");
+    
+    
+    //!= (operator)
+    assert(1 != 2 == 1,"1 != 2 == 1 failed");
+    assert("Hyphy" != "HyPhy" == 1,"\"Hyphy\" != \"HyPhy\" == 1 failed");
+    assert(1 != "1" == 1,"1 != \"1\" == 1 failed");
+    assert("1" != 1 == 1,"\"1\" != 1 == 1 failed");
+
+    //$ (operator)
+    //Matrix
+    a = {{1,2,3}}${{1,2,3}};
+    assert(a[1]==4,"a[1]==4 failed");
+
+    //Numeric
+    assert(29.2$5.9==5,"29.2$5.9==5 failed");
+
+    //String  
+    assert(("ATATA"$"ATAT")[1]==3,"(\"ATATA\"$\"ATAT\")[1]==3 failed");
+    assert(("ATATA"$"CCC")[1]==-1,"(\"ATATA\"$\"CCC\")[1]==-1 failed");
+    assert(("ATATA"$"(TA)T")[1]==3,"(\"ATATA\"$\"(TA)T\")[1]==3 failed");
+
+    //% (operator)
+
+    //Matrix  
+    a = {
+        {    0.685433846825,    0.937009058412}
+        {    0.757032230905,    0.530296328368}
+        {     0.81098658657,    0.116591965341}
+        {    0.485633417379,     0.28659384099}
+        {    0.277806169884,    0.913600717418}
+        {    0.153395332897,    0.101711391029}
+        {    0.358844396043,   0.0366885005582}
+        {    0.847414346376,    0.498019525664}
+        {   0.0848120991338,    0.148932764807}
+        {    0.848594787961,    0.940901103649}
+        }; 
+
+    b = a % 0;
+    //{
+    //{   0.0848120991338,    0.148932764807}
+    //{    0.153395332897,    0.101711391029}
+    //{    0.277806169884,    0.913600717418}
+    //{    0.358844396043,   0.0366885005582}
+    //{    0.485633417379,     0.28659384099}
+    //{    0.685433846825,    0.937009058412}
+    //{    0.757032230905,    0.530296328368}
+    //{     0.81098658657,    0.116591965341}
+    //{    0.847414346376,    0.498019525664}
+    //{    0.848594787961,    0.940901103649}
+    //}
+
+    assert(b[0][1]==0.148932764807,"b[0][1]==0.148932764807 failed");
+
+    //Numeric     
+    assert(29%5==4,"29%5==4 failed");
+
+    //String  
+    assert("Hyphy"%"HYPHY"==1,"\"Hyphy\"%\"HYPHY\"==1 failed");
+
+    //&& (operator)
+    //Numeric     
+    a = 29&&5;
+    assert(a==1,"29&&5==1 failed");
+
+    //String  
+    a = "hyphy"&&1;
+    assert(a=="HYPHY","a==\"HYPHY\" failed");
+
+    //* (operator)
+
+    //Associative List    
+    //list is now {"key":"value","key2":"value2", "key3":"value3"}. Returns 3.
+    a = {"key":"value"};
+    b = {"key2":"value2", "key3":"value3"};
+    a*b;
+
+    assert(a["key3"]=="value3","a[\"key3\"]==\"value3\" failed");
+
+    //Numeric     
+    assert(5*2==10,"5*2==10 failed");
+
+    //Matrix*Matrix   
+    a = {{2,2,4,2}};
+    some_matrix = {{1}{3}{5}{7}};
+    c = a*some_matrix;
+    assert(c[0][0]==42);    
+
+    //Matrix*Number   
+    assert(({{2,2,4,2}}*2)[2]==8,"({{2,2,4,2}}*2)[2]==8 failed");
+
+    //String*String   
+    a = "juxta";
+    a*"position";
+    assert(a=="juxtaposition","a==\"juxtaposition\" failed");
+    
+    //String*Matrix   
+    assert(("tattarrattat"*{{"a","r","t"}})[0]==2,"(\"tattarrattat\"*{{\"a\",\"r\",\"t\"}})[0]==2 failed");
+
+    //+ (operator)
+    //Associative Array   
+    list = {"key":"value"};
+    list2 = {"key2":"value2", "key3":"value3"};
+    a = list + list2;
+    list3 = list["1"];
+    assert(list3["key3"] == "value3","list3[\"key3\"] == \"value3\" failed");
+
+    //Matrix  
+    assert(({{1,2,3}} + {{3,2,1}})[0]==4,"{({1,2,3}} + {{3,2,1}})[0]==4 failed");
+
+    //Numeric     
+    assert((21+21)==42,"(21+21)==42 failed");
+
+    //String  
+    assert("Juxta" + "position"=="Juxtaposition","\"Juxta\" + \"position\"==\"Juxtaposition\" failed");
+
+    //Topology/Tree   
+    Topology T = ((a_node,f_node)N1,c_node,d_node);
+    t = T + {"NAME":"e_node", "WHERE": "f_node", "PARENT": "g_node"};
+    Topology expect = ((a_node,(f_node,e_node)g_node)N1,c_node,d_node);
+    assert(t==0,"T==expect failed");
+
+    //- (operator)
+
+    //Associative List    
+    list = {"key":"value", "key2":"value2"};
+    list2 = {"key":"value"};
+    list - list2;
+    assert(list["key2"]=="value2","list[\"key2\"]==\"value2\" failed");
+
+    //Matrix  
+    assert(({{2,2,4,2}}-{{1,1,1,1}})[0] == 1,"({{2,2,4,2}}-{{1,1,1,1}})[0] == 1 failed");
+
+    //Numeric     
+    assert(5-3==2,"5-3==2 failed");
+
+    /// (operator)
+    //Numeric     
+    assert(6/3==2,"6/3==2 failed");
+
+    //String  
+    assert("string"/"strin*"==1,"\"string\"/\"strin*\"==1 failed");
+
+    //Greater Than
+
+    //Matrix  
+/*
+ *    a = {{0,7,11,14}{7,0,6,9}{11,6,0,7}{14,9,7,0}}>1;
+ *
+ *    a1 = a>1;
+ *    a2 = {
+ *            {                 4,                 0,                 1}
+ *            {                 4,                 0,                 1}
+ *            {                 5,                 0,                 1}
+ *            {                 5,            0.3125,                 1}
+ *            {                 5,                 0,                 3}
+ *            {                -1,                 0,                 6}
+ *            {                 0,                 0,                 0}
+ *            {                 0,                 0,                 0}
+ *            {                 0,                 0,                 0}
+ *            {                 0,                 0,                 0}
+ *        };
+ *
+ *    assert(a1[0][1] == a2[0][1],"a1[0][1] == a2[0][1] failed");
+ *
+ */
+    //Numeric     
+    assert(5>4==1,"5>4==1 failed");
+
+    //String  
+    assert("Bears" > "Battlestar Galactica"==1,"\"Bears\" > \"Battlestar Galactica\"==1 failed");
+
+    //Greater Than or Equal (operator)
+
+    //Matrix  
+/*
+ *    a = {{0,7,11,14}{7,0,6,9}{11,6,0,7}{14,9,7,0}};
+ *    a1 = a>=3;
+ *
+ *
+ *    c = {
+ *        {                 4,                 0,                 7,                 0,                -1}
+ *        {                 0,                 0,                 0,                 0,                 0}
+ *        {                 0,                 0,                 0,                 0,                 0}
+ *        {                 0,                 0,                 0,                21,                 0}
+ *        {                 0,                 0,                 0,                 0,                 0}
+ *        {                 0,                 0,                 0,                 0,                 0}
+ *        {                 0,                 0,                 0,                 0,                 0}
+ *        {                 0,                 0,                 0,                 0,                 0}
+ *        };
+ *
+ *    assert(a1[0][2]==c[0][2],"b[0][2],c[0][2] failed");
+ *
+ */
+    //Numeric     
+    assert(5>=4==1,"5>=4==1 failed");
+
+    //String  
+    assert("Bears" >= "Battlestar Galactica"==1,"\"Bears\" >= \"Battlestar Galactica\"==1 failed");
+
+    //Less Than (operator)
+    //Numeric     
+    assert(4<5==1,"4<5==1 failed");
+
+    //String  
+    assert("Battlestar Galactica"<"Bears"==1,"\"Battlestar Galactica\"<\"Bears\"==1 failed");
+
+    //Less Than or Equal (Operator)
+    //Numeric     
+    assert(4<=5==1,"4<=5==1 failed");
+
+    //String  
+    assert("Battlestar Galactica"<="Bears"==1,"\"Battlestar Galactica\"<=\"Bears\"==1 failed");
+
+    //Topology    
+    Topology T1 = ((a,b_node)N1,c,d,((g,h)N3,e,f)N2);
+    Topology T2 = ((a,b_node)N1,c,d,(e,f)N2);
+    assert(T2<=T1 == 1,"T2<=T1 == 1 failed");
+
+
+    //Or (operator)
+
+    //Numeric     
+    assert(.5||1==1,".5||1==1 failed");
+
+    //String  
+    a = {
+    {                 0}
+    {                 1}
+    {                 6}
+    {                 7}
+    };
+
+    assert(("stringstring"||"st")[0][2]==a[0][2],"(\"stringstring\"||\"st\")[0][2]==a[0][2] failed");
+        
+    //^ (operator)
+    //Matrix  
+    m =
+    {
+    {                 1,                 2}
+    {                 3,                 4}
+    };
+
+    assert(m^2>=(-6.73149-.01),"m^2==-6.73149 failed");
+
+    //Numeric     
+    assert(2^6>=64-1,"2^6==64 failed");
+
+    return 1;
+}
+
+function tree_specific() 
+{
+    //BranchCount
+    ACCEPT_ROOTED_TREES = 0;
+    Tree T = ((a,b),(c,d));
+    unrooted = BranchCount (T);
+    assert(unrooted == 2,"unrooted == 2 failed);");
+     
+    ACCEPT_ROOTED_TREES = 1;
+    Tree T = ((a,b),(c,d));
+    rooted = BranchCount (T);
+    assert(rooted == 1,"rooted == 1 failed);");
+
+    //BranchLength
+    Topology T = ((a:0.1,b:0.2):0.4,c:0.15,d:0.33);
+    assert(BranchLength(T,1)==0.2,"BranchLength(T,1)==0.2 failed);");
+
+    //BranchName
+    Topology T = (((a:0.1,b:0.2)ab:0.4,e:0.1):0.2,c:0.15,d:0.33);
+    assert(BranchName(T,1)=="Node1","BranchName(T,1)==\"Node1\" failed);");
+
+    //TipCount
+    Tree T1 = ((a,b)N1,c,d(N4),((g,h)N3,e,f)N2);
+    assert(TipCount(T1)==8,"TipCount(T1)==8 failed);");
+
+    //TipName
+    Tree T1 = ((a,b)N1,c,d(N4),((g,h)N3,e,f)N2);
+    assert(TipName(T1,1)=="b","TipName(T1,1)==\"b\" failed);");
+}
+
+
+function hbl_functions()
+{
+    //Absolute
+    //Associative Array   
+    list={"key":"value", "key2":"value2"};
+    assert(Abs(list)==2,"Abs(list)==2 failed);");
+
+    //Matrix (vector)     
+    assert(Format(Abs({{1,2,3}}),0,5)=="3.74166","Abs({{1,2,3}})==3.74166 failed);");
+
+    //Matrix (not a vector)   
+    assert(Abs({{1,2}{3,-4}})==4,"Abs({{1,2}{3,-4}})==4 failed);");
+
+    //Numeric     
+    assert(Abs(-7.5)==7.5,"Abs(-7.5)==7.5 failed);");
+
+    //String  
+    assert(Abs("Cornholio")==9,"Abs(\"Cornholio\")==9 failed);");
+
+    //Topology/Tree   
+    Topology T = ((a,b)N1,c,d);
+    m = Abs(T);
+
+    //{{2,2,5, 5,5, -1}}
+    assert(m[0][0]==2,"m[0][0]==2 failed);");
+
+    //ArcTan
+    assert(Format((4*Arctan(1)),0,5)=="3.14159","(4*Arctan(1))==3.14159 failed);");
+
+    //Beta
+    assert(Format(Beta(2,2),0,6)=="0.166667","Beta(2,2)==0.166667 failed);");
+
+    //CChi2
+
+    //Matrix  
+    assert(Format(CChi2({{1,2}{3,0}},5),0,1) == "0.4","CChi2({{1,2}{3,0}},5) == 0.4 failed);");
+
+    //Numeric     
+    assert(Format(CChi2(1.44,1),0,6) == "0.769861","CChi2(1.44,1) == 0.769861 failed);");
+
+    //CGammaDist
+    assert(Format(CGammaDist(4,20,5),0,6) == "0.529743","CGammaDist(4,20,5) == 0.529743 failed);");
+
+    //Columns
+    assert( Columns({{1,2,3,4}{1,2,3,4}{1,2,3,4}}) == 4 ," Columns({{1,2,3,4}{1,2,3,4}{1,2,3,4}}) == 4  failed);");
+
+    //Cos
+    assert(Cos(0)==1,"Cos(0)==1 failed);");
+
+    //Eigensystem
+    a=Eigensystem({{19,3}{-2,26}});
+    //assert(b[0]==20,"a[\"1\"][0]==20 failed);");
+
+    //Erf
+    assert(Format(Erf(.75),0,6)=="0.711156","Erf(.75)==0.711156 failed);");
+
+    //Eval
+    assert(Eval("3+3*13")==42,"Eval(\"3+3*13\")==42 failed);");
+
+    //Exp
+    assert(Format((Exp({{1,2}{2,1}}))[0][0],0,5)=="10.22671","(Exp({{1,2}{2,1}}))[0][0]==10.2267081822 failed);");
+    assert(Format(Exp(1),0,5)=="2.71828","Exp(1)==2.71828 failed);");
+    assert(Exp("1001111011000010")==6,"Exp(\"1001111011000010\")==6 failed);");
+
+    //Format
+    assert(Format(5,0,5)=="5.00000","Format(5,10,5)==5.00000 failed);");
+    assert(Format("5",0,5)=="5.00000","Format(\"5\",10,5)==5.00000 failed);");
+
+    Topology T1 = ((a,b)N1,c,d,((g,h)N3,e,f)N2);
+    assert(Format(T1,1,10) == "((a:-1,b:-1)N1:-1,c:-1,d:-1,((g:-1,h:-1)N3:-1,e:-1,f:-1)N2:-1)", "Line 368 failed");
+
+    //Gamma
+    assert(Format(Gamma(4),0,0)=="6","Gamma(4)==6 failed);");
+
+    //GammaDist
+    assert(Format(GammaDist(2,1,2),0,7)=="0.0366313","GammaDist(2,1,2)==0.0366313 failed);");
+
+    //IBeta
+    assert(Format(IBeta(.5,.5,5),0,5)=="0.98988","IBeta(.5,.5,5)==0.98988 failed);");
+
+    //IGamma
+    assert(Format(IGamma(3,4),0,5)=="0.76190","IGamma(3,4)==0.761897 failed);");
+
+    //Inverse
+    assert(Inverse("Dracula")=="alucarD","Inverse(\"Dracula\")==\"alucarD\"");
+    assert((Inverse({{1,3,3}{1,4,3}{1,3,4}}))[0]==7,"(Inverse({{1,3,3}{1,4,3}{1,3,4}}))[0]==7 failed);");
+
+    //Join
+    list={"key":"value", "key2":"value2"};
+    assert((Join(",", list))=="value,value2","(Join(\",\", list))==\"value,value2\" failed);");
+
+    assert((Join(",",{{1,2,3}{4,5,6}{7,8,9}}))=="1,2,3,4,5,6,7,8,9","(Join(\",\",{{1,2,3}{4,5,6}{7,8,9}}))==\"1,2,3,4,5,6,7,8,9\" failed);");
+
+    //LnGamma
+    assert(Format(LnGamma(200),0,3)=="857.934","LnGamma(200)==857.934 failed);");
+
+    //Log
+    m = {
+        {               1.2,               5.6,                 7}
+        {                 3,                 4,                12}
+        {                12,              3.23,                 8}
+        };
+
+    assert(Format((Log(m))[0][0],0,5)=="0.18232","(Log(m))[0][0]==0.182321556794 failed);");
+    assert(Format(Log(2.71828183),0,0)=="1","Log(2.71828183)==1 failed);");
+    assert(Log("hyphy")==109707827,"Log(\"hyphy\")==109707827 failed);");
+
+    //LUDecompose
+    assert((LUDecompose({{1.2,5.6,7}{3, 4,12}{12,3.23,8}}))[0][0]==12,"(LUDecompose({{1.2,5.6,7}{3, 4,12}{12,3.23,8}}))[0][0]==12 failed);");
+
+    //LUSolve
+    lu = LUDecompose({{1.2,5.6,7}{3, 4,12}{12,3.23,8}});
+    b = {{1}{2}{3}};
+    LUSolve(lu,b);
+
+    //Max
+    assert((Max({{1,2,3}{4,5,6}{7,8,9}},1))[0][0]==9,"Max{{1,2,3}{4,5,6}{7,8,9}},1)=={{9,8}} failed);");
+    assert(Max({{1,2,3}{4,5,6}{7,8,9}},5)==9,"Max{{1,2,3}{4,5,6}{7,8,9}},5)==9 failed);");
+    assert(Max(5,15)==15,"Max(5,15)==15 failed);");
+
+    //Min
+    assert((Min({{1,2,3}{4,5,6}{7,8,9}},1))[0][0]==1,"Min{{1,2,3}{4,5,6}{7,8,9}},1)=={{1,0}} failed);");
+    assert(Min({{1,2,3}{4,5,6}{7,8,9}},5)==1,"Min{{1,2,3}{4,5,6}{7,8,9}},5)==1 failed);");
+    assert(Min(5,15)==5,"Min(5,15)==5 failed);");
+
+    //PSTreeString
+    Tree T1 = ((a,b)N1,c,d,((g,h)N3,e,f)N2);
+    t = PSTreeString (T1,"STRING_SUPPLIED_LENGTHS",{{-1,-1}});
+
+    //Random
+    Random(3,15);
+    Random({{1,2,3}{4,5,6}{7,8,9}},2);
+    Random({{1,2}{3,4}},"LHS");
+
+    mean = {{1,1,1}};
+    cov = {{1,0}{0,1}};
+    a = {"PDF":"Dirichlet","ARG0":cov};
+    Random(mean,a);
+
+    //RerootTree
+    RerootTree("((a,b)N1,c,d)", "string");
+
+    Tree T1 = ((a,b)N1,c,d,((g,h)N3,e,f)N2);
+    str = "N3";
+    t = RerootTree(T1,str);
+
+    //Rows
+    assert(Rows({{1,2}{3,-4}})==2,"Rows({{1,2}{3,-4}})==2 failed);");
+
+    //Simplex
+    m = {
+        {                 1,                 2,                 3,                 4,                 0,                 0,                 0}
+        {                 0,                 3,                 2,                 1,                 1,                 0,                10}
+        {                 0,                 2,                 5,                 3,                 0,                 1,                15}
+        };
+
+    Simplex(m);
+
+    //Sin
+    assert(Format(Sin(3.1415297/6),0,5)=="0.49999","Sin(3.1415297/6)==0.499991 failed);");
+
+    //Sqrt
+    assert(Format(Sqrt(2),0,5)=="1.41421","Sqrt(2)==1.41421 failed);");
+
+    //Tan
+    assert(Format(Tan(3.1415297/4),0,5)=="0.99997","Tan(3.1415297/4)==0.999969 failed);");
+
+    //Time
+    assert(Time(0),"Time(0) failed);");
+    assert(Time(1),"Time(1) failed);");
+
+    //Transpose
+    m =
+        {
+            {                 1,                 2,                 3}
+            {                 1,                 2,                 3}
+        };
+
+    Transpose(m);
+
+    //Type
+    assert(Type(Exp(1))=="Number","Type(Exp(1))==\"Number\" failed);");
+
+    M = {{1,2}};
+    assert(Type(M) == "Matrix","Type(M) == \"Matrix\" failed);");
+
+    A = {"0":"A", "A":"0"};
+    assert(Type(A)=="AssociativeList","Type(A)==\"AssociativeList\" failed);");
+
+    Topology Top = (1,2,3);
+    assert(Type(Top) == "Topology","Type(Top) == \"Topology\" failed);");
+
+    Tree T = (1,2,3);
+    assert(Type(T)=="Tree","Type(T)==\"Tree\" failed);");
+
+    assert(Type("Hello world")=="String","Type(\"Hello world\")==\"String\" failed);");
+
+    //ZCDF
+    assert(Format(ZCDF(1),0,5)=="0.84134","ZCDF(1)==0.841345 failed);");
+
+    return 1;
+}
+
+//HBL Commands
+//AlignSequences
+//Assert
+//BGM
+//Break
+//Category
+//ChoiceList
+//ClearConstraints
+//ConstructCategoryMatrix
+//Continue
+//CovarianceMatrix
+//DataSetFilter
+//DeleteObject
+//Differentiate
+//Do
+//DoSQL
+//ExecuteAFile
+//ExecuteCommands
+//Export
+//Ffunction
+//FindRoot
+//For
+//Fprintf
+//Fscanf
+//Function
+//GetDataInfo
+//GetInformation
+//GetNeutralNull
+//GetString
+//GetURL
+//HarvestFrequencies
+//If
+//Import
+//Integrate
+//LFCompute
+//LikelihoodFunction
+//LikelihoodFunction3
+//LoadFunctionLibrary
+//Model
+//MolecularClock
+//MPIReceive
+//MPISend
+//NeuralNet
+//OpenDataPanel
+//OpenWindow
+//Optimize
+//ReplicateConstraint
+//RequireVersion
+//Return
+//SCFG
+//SelectTemplateModel
+//SetDialogPrompt
+//SetParameter
+//SimulateDataSet
+//SpawnLikelihoodFunction
+//StateCounter
+//UseModel
+//While
+
+/* execution stub */
+
+//fprintf    (stdout, "[Running COVERAGE TEST '", getTestName(), "']\n");
+result1 = operators();
+result2 = hbl_functions();
+if (result1 && result2)
+{
+	fprintf (stdout, "[TEST PASSED]\n");
+}
+else
+{
+	fprintf (stdout, "[TEST FAILED]\n");
+}
+
diff --git a/tests/hbltests/UnitTests/HBLCommands/BranchLength.bf b/tests/hbltests/UnitTests/HBLCommands/BranchLength.bf
new file mode 100644
index 0000000..c4c71d0
--- /dev/null
+++ b/tests/hbltests/UnitTests/HBLCommands/BranchLength.bf
@@ -0,0 +1,105 @@
+ExecuteAFile (PATH_TO_CURRENT_BF + "TestTools.ibf");
+runATest ();
+
+
+function getTestName ()
+{
+	return "Branch Length";
+}		
+
+function getTestedFunctions ()
+{
+	return {{"_TreeTopology::BranchLength","_CalcNode::BranchLength","_Matrix::ExpNumberOfSubs"}};
+}	
+
+function runTest ()
+{
+	ASSERTION_BEHAVIOR = 1; /* print warning to console and go to the end of the execution list */
+	testResult  	   = 0;
+	
+	Topology T 			   = (a,b,c);
+	assert (BranchLength (T,0) == (-1), "Retrieve a branch length by a valid index when no branch length has been defined");
+
+	Topology T 			   = ((a:0.1,b:0.2):0.4,c:0.15,d:0.33);
+
+	assert (BranchLength (T,0) == 0.1, "Retrieve a branch length by a valid index");
+	assert (Abs(BranchLength (T,-1) - {{0.1,0.2,0.4,0.15,0.33,0.0}}) == 0.0, "Retrieve all branch lengths");
+	assert (BranchLength (T,"b") == 0.2, "Retrieve a branch length by a valid name");
+	assert (BranchLength (T,"a;c") == 0.65, "Retrieve a valid path length; the first node is deeper than the second in the tree");
+	assert (BranchLength (T,"d;d") == 0.0, "Retrieve a valid trivial path length; checking boundary conditions");
+	assert (BranchLength (T,"d;b") == BranchLength (T,1)+BranchLength(T,2)+BranchLength(T,4), "Retrieve a valid path length; the second node is deeper than the first in the tree");
+	
+	/* invalid parameters */
+	
+	assert (Type (BranchLength (T,5)) == "Unknown", "Trying to retrieve a branch length using an invalid index");
+	assert (Type (BranchLength (T,"bb;d")) == "Unknown", "Trying to retrieve a path length using an 'invalid;valid' path specification");
+	assert (Type (BranchLength (T,"b;ddd")) == "Unknown", "Trying to retrieve a path length using an 'valid;invalid' path specification");
+	assert (Type (BranchLength (T,{{1,2}})) == "Unknown", "Trying to retrieve a branch length using an invalid argument type (matrix)");
+	assert (Type (BranchLength (T,"nosuchnode")) == "Unknown","Trying to retrieve a branch length using an invalid node name");
+	assert (Type(BranchLength (T,"a;EXPECTED_NUMBER_OF_SUBSTITUTIONS")) == "Unknown", "Trying to retrieve a branch length from a topology object");
+	
+	global 	  kappa = 4;
+	
+	Q_HKY85 = {{*,t,kappa*t,t}
+			   {t,*,t,t*kappa}
+			   {t*kappa,t,*,t}
+			   {t,t*kappa,t,*}};
+			   
+	freqs	= {{0.4}{0.3}{0.2}{0.1}};
+	
+	Model HKY85 = (Q_HKY85, freqs, 1);
+	
+	/* now the default branch lengths are
+	   measured in expected numbers of substitutions per site */
+	   
+	BRANCH_LENGTH_STENCIL = 0;
+	LARGE_MATRIX_BRANCH_LENGTH_MODIFIER_DIMENSION = 21;
+	
+	Tree  T = ((a:0.1,b:0.2):0.4,c:0.15,d:0.33);
+	
+	assert 	   (BranchLength (T,0) == 0.136, "Retrieve a branch length by a valid index, when there is a valid (HKY85) model attached to the node");
+	assert 	   (BranchLength (T,"a;EXPECTED_NUMBER_OF_SUBSTITUTIONS") == "0.4800000000000001*t+0.22*kappa*t", 
+								  "Retrieve the branch length expression for a valid node name; no BRANCH_LENGTH_STENCIL");
+	
+	/* using BRANCH_LENGTH_STENCIL we can specify
+	WHICH substitutions to count in the branch length;
+	in the case below -- transitions only first and then 
+	transversions only */
+	
+	BRANCH_LENGTH_STENCIL = {{0,0,1,0}
+							 {0,0,0,1}
+							 {1,0,0,0}
+							 {0,1,0,0}};
+	
+	assert 	   (BranchLength (T,"a;EXPECTED_NUMBER_OF_SUBSTITUTIONS") == "0.22*kappa*t", "Retrieve the branch length expression for a valid node name subject to BRANCH_LENGTH_STENCIL");
+	assert 	   (BranchLength (T,0) == 0.088, "Retrieve a branch length by a valid index, conditioned by BRANCH_LENGTH_STENCIL (transitions)");
+	
+	BRANCH_LENGTH_STENCIL = BRANCH_LENGTH_STENCIL ["_MATRIX_ELEMENT_VALUE_==0"];
+			   
+	assert 	   (BranchLength (T,0) == 0.048, "Retrieve a branch length by a valid index, conditioned by BRANCH_LENGTH_STENCIL (transversions)");
+	
+	/* 
+	override model definition and retrieve only the 
+	'original' branch length supplied during tree construction 
+	*/
+	
+	BRANCH_LENGTH_STENCIL = "STRING_SUPPLIED_LENGTHS";
+	assert 	   (BranchLength (T,0) == 0.1, "Retrieve a branch length by a valid index, conditioned by BRANCH_LENGTH_STENCIL = 'STRING_SUPPLIED_LENGTHS'");
+	
+	/* reset the branch length stencil */
+	
+	BRANCH_LENGTH_STENCIL = 0;
+	assert 	   (BranchLength (T,0) == 0.136, "Testing BRANCH_LENGTH_STENCIL reset");
+	
+	LARGE_MATRIX_BRANCH_LENGTH_MODIFIER = 2;
+	assert 	   (BranchLength (T,0) == 0.136, "Testing LARGE_MATRIX_BRANCH_LENGTH_MODIFIER; should not apply because of LARGE_MATRIX_BRANCH_LENGTH_MODIFIER_DIMENSION");
+	LARGE_MATRIX_BRANCH_LENGTH_MODIFIER_DIMENSION = 2;
+	assert 	   (BranchLength (T,0) == 0.136/2, "Testing LARGE_MATRIX_BRANCH_LENGTH_MODIFIER; should apply ");
+	
+	testResult = 1;
+		
+	return testResult;
+}
+
+/* execution stub */
+
diff --git a/tests/hbltests/UnitTests/HBLCommands/DeleteObject.bf b/tests/hbltests/UnitTests/HBLCommands/DeleteObject.bf
new file mode 100644
index 0000000..b755d80
--- /dev/null
+++ b/tests/hbltests/UnitTests/HBLCommands/DeleteObject.bf
@@ -0,0 +1,29 @@
+ExecuteAFile (PATH_TO_CURRENT_BF + "TestTools.ibf");
+runATest ();
+
+
+function getTestName ()
+{
+	return "DeleteObject";
+}		
+
+function getTestedFunctions ()
+{
+	return {{"_ElementaryCommand::HandleDeleteObject"}};
+}	
+
+
+function runTest () {
+	ASSERTION_BEHAVIOR = 1; /* print warning to console and go to the end of the execution list */
+	testResult  	   = 1;
+    
+    ExecuteAFile (PATH_TO_CURRENT_BF  + "res" + DIRECTORY_SEPARATOR + "test_likefunc2.nex");
+    ExecuteAFile (PATH_TO_CURRENT_BF  + "res" + DIRECTORY_SEPARATOR + "test_likefunc.nex", {}, "a_prefix");
+    ExecuteAFile (PATH_TO_CURRENT_BF  + "res" + DIRECTORY_SEPARATOR + "test_likefunc.nex");
+   
+    DeleteObject (x/a,z,lf);
+		
+	return testResult;
+}
+
+
diff --git a/tests/hbltests/UnitTests/HBLCommands/Differentiate.bf b/tests/hbltests/UnitTests/HBLCommands/Differentiate.bf
new file mode 100644
index 0000000..e78f15d
--- /dev/null
+++ b/tests/hbltests/UnitTests/HBLCommands/Differentiate.bf
@@ -0,0 +1,33 @@
+ExecuteAFile (PATH_TO_CURRENT_BF + "TestTools.ibf");
+runATest ();
+
+
+function getTestName () {
+	return "Differentiate";
+}		
+
+function getTestedFunctions ()
+{
+	return {{"_ElementaryCommand::HandleDifferentiate"}};
+}	
+
+
+function runTest () {
+	ASSERTION_BEHAVIOR = 1; /* print warning to console and go to the end of the execution list */
+	testResult  	   = 0;
+    
+    assert (runCommandWithSoftErrors ("Differentiate (2 invalid, x^2,x)", "is not a valid variable identifier in call to Differentiate"), "Invalid variable identifier in call to Differentiate.");
+    assert (runCommandWithSoftErrors ("Differentiate (dfx, x^2,x,\"beavis\")", "The number of times to differentiate must be a non-negative integer in call to Differentiate"), "Invalid order option in call to Differentiate.");
+    assert (runCommandWithSoftErrors ("Differentiate (dfx, x^2,x,z#4)", "<ERROR HERE>"), "Unparseable order option in call to Differentiate.");
+    assert (runCommandWithSoftErrors ("Differentiate (dfx, Time(x),x)","Differentiation of .+ failed"), "Unparseable order option in call to Differentiate.");
+
+    Differentiate (dfx, x^2,x);
+    x = -2; 
+    assert (dfx == -4, "Checking (x^2)' == 2x derivative");
+    Differentiate (dfx, x^3,x,2);
+    assert (Abs(dfx+12)<1e-10, "Checking (x^3)'' == 6x derivative");
+
+	testResult = 1;
+		
+	return testResult;
+}
\ No newline at end of file
diff --git a/tests/hbltests/UnitTests/HBLCommands/DoSQL.bf b/tests/hbltests/UnitTests/HBLCommands/DoSQL.bf
new file mode 100644
index 0000000..3474483
--- /dev/null
+++ b/tests/hbltests/UnitTests/HBLCommands/DoSQL.bf
@@ -0,0 +1,15 @@
+count = 0;
+function incCount(dummy)
+{
+   count = count + 1;
+   return 0;
+}
+
+dbpath="./testdata/Chinook_Sqlite.sqlite";
+DoSQL ( SQL_OPEN, dbpath, DBID );
+DoSQL ( DBID, "SELECT * FROM Album", "return incCount(0)");
+
+assert(count==347, "Number of Rows failed");
+assert(Columns(SQL_COLUMN_NAMES)==3, "Number of Column Names failed");
+
+DoSQL ( SQL_CLOSE, "", DBID );
diff --git a/tests/hbltests/UnitTests/HBLCommands/Export.bf b/tests/hbltests/UnitTests/HBLCommands/Export.bf
new file mode 100644
index 0000000..0a5657f
--- /dev/null
+++ b/tests/hbltests/UnitTests/HBLCommands/Export.bf
@@ -0,0 +1,37 @@
+ExecuteAFile (PATH_TO_CURRENT_BF + "TestTools.ibf");
+runATest ();
+
+
+function getTestName () {
+	return "Export";
+}		
+
+function getTestedFunctions ()
+{
+	return {{"_ElementaryCommand::HandleExport"}};
+}	
+
+
+function runTest () {
+	ASSERTION_BEHAVIOR = 1; /* print warning to console and go to the end of the execution list */
+	testResult  	   = 0;
+    
+    ExecuteAFile (PATH_TO_CURRENT_BF  + "res" + DIRECTORY_SEPARATOR + "test_likefunc.nex");
+    
+    Export (export_string, lf);
+    DeleteObject (lf);
+    ExecuteCommands (export_string);
+    assert (trapAllErrors("Export (export_string, MG94customModel);") == 1, "Roundtrip likelihood function export (model)");
+    assert (trapAllErrors("Export (export_string, filteredData);") == 1, "Roundtrip likelihood function export (data)");
+    
+    DataSet roundtrip_filter = ReadFromString (export_string);
+    assert (roundtrip_filter.sites == 1320 && roundtrip_filter.species == 8, "Failed a dataset filter roundtrip test");
+    
+    
+    assert (runCommandWithSoftErrors ("Export (seamus/romney, some_object)", "is not a valid variable identifier in call to Export"), "Invalid variable identifier in call to Export.");
+    assert (runCommandWithSoftErrors ("Export (seamus_romney, some_object)", " is not a supported type in call to Export"), "Invalid object to export.");
+
+	testResult = 1;
+		
+	return testResult;
+}
\ No newline at end of file
diff --git a/tests/hbltests/UnitTests/HBLCommands/GetDataInfo.bf b/tests/hbltests/UnitTests/HBLCommands/GetDataInfo.bf
new file mode 100644
index 0000000..3988df5
--- /dev/null
+++ b/tests/hbltests/UnitTests/HBLCommands/GetDataInfo.bf
@@ -0,0 +1,51 @@
+function getTestName ()
+{
+	return "GetDataInfo";
+}		
+
+function getTestedFunctions ()
+{
+	return {{"_ExecutionList::ExecuteCase46","_DataSetFilter::FindUniqueSequences"}};
+}	
+
+function runTest ()
+{
+	/* define some auxiliary objects here */
+
+	ASSERTION_BEHAVIOR = 1; /* print warning to console and go to the end of the execution list */
+	testResult  	   = 0;
+
+	DataSet 			fiveSeqs = ReadDataFile ("../../data/5.fas");	
+	DataSetFilter		nucF	 = CreateFilter (fiveSeqs,1);
+	
+	GetDataInfo 		(seqInfo, nucF, -1);
+	assert (seqInfo["UNIQUE_SEQUENCES"] == 5, "Expected 5 unique sequences with strict filtering");
+	GetDataInfo 		(seqInfo, nucF, -2);
+	assert (seqInfo["UNIQUE_SEQUENCES"] == 4, "Expected 4 unique sequences with strict+gap filtering");
+	GetDataInfo 		(seqInfo, nucF, -3);
+	assert (seqInfo["UNIQUE_SEQUENCES"] == 3, "Expected 3 unique sequences with superset filtering");
+	GetDataInfo 		(seqInfo, nucF, -4);
+	assert (seqInfo["UNIQUE_SEQUENCES"] == 2, "Expected 2 unique sequences with partial match filtering");
+
+	DataSetFilter		dinucF	 = CreateFilter (fiveSeqs,2);
+		
+	GetDataInfo 		(seqInfo, dinucF, -2);
+	assert (seqInfo["UNIQUE_SEQUENCES"] == 5, "Expected 5 unique sequences with strict+gap filtering (dinuc)");
+		
+	testResult = 1;	
+	return testResult;
+}
+
+/* execution stub */
+
+fprintf    (stdout, "[Running COVERAGE TEST '", getTestName(), "']\n");
+result  =  runTest();
+
+if (result)
+{
+	fprintf (stdout, "[TEST PASSED]\n");
+}
+else
+{
+	fprintf (stdout, "[TEST FAILED]\n");
+}
\ No newline at end of file
diff --git a/tests/hbltests/UnitTests/HBLCommands/GetString.bf b/tests/hbltests/UnitTests/HBLCommands/GetString.bf
new file mode 100644
index 0000000..f234937
--- /dev/null
+++ b/tests/hbltests/UnitTests/HBLCommands/GetString.bf
@@ -0,0 +1,193 @@
+ExecuteAFile (PATH_TO_CURRENT_BF + "TestTools.ibf");
+runATest ();
+
+function getTestName ()
+{
+	return "GetString";
+}		
+
+function getTestedFunctions ()
+{
+	return {{"_ExecutionList::HandleGetString"}};
+}	
+
+function factorial (N) {
+    f = 1; 
+    for (k = 2; k <= N; k+=1) {
+        f = f * k;
+    }
+    return f;
+}
+
+function runTest ()
+{
+	/* define some auxiliary objects here */
+	
+	ASSERTION_BEHAVIOR = 1; /* print warning to console and go to the end of the execution list */
+	testResult  	   = 0;
+
+	//-----------------------------------------------------------------------------------------------------------------
+	// ERROR HANDLING
+	//-----------------------------------------------------------------------------------------------------------------
+	
+    assert (runCommandWithSoftErrors ("GetString (a+b, HYPHY_VERSION, 0)", " is not a valid variable identifier in call to GetString"), "Failed error checking for an invalid receptacle");
+    assert (runCommandWithSoftErrors ("GetString (data, this_object_better_not_exist, 0)", " is not an allowed argument type"), "Failed error checking for an invalid argument");
+
+	
+	//-----------------------------------------------------------------------------------------------------------------
+	// VERSION STRINGS
+	//-----------------------------------------------------------------------------------------------------------------
+
+	GetString (versionString, HYPHY_VERSION, 0);
+	assert ((versionString$"^[0-9]+\\.[0-9a-zA-Z]+$")[0]==0, "The short version string must be of the form major.minor[beta]. Had " + versionString);
+	
+	GetString (versionString, HYPHY_VERSION, 1);
+	assert ((versionString$"^HYPHY\\ [0-9]+\\.[0-9a-zA-Z]+.+\\ for .+$")[0]==0, "The full version string must be of the form major.minor[beta][MP] for platform description. Had " + versionString);
+
+	GetString (versionString, HYPHY_VERSION, 2);
+	assert ((versionString$"^.+\\ [0-9]+\\.[0-9a-zA-Z]+$")[0]==0, "The intermediate version string must be of the form build type major.minor[beta]. Had " + versionString);
+
+
+	//-----------------------------------------------------------------------------------------------------------------
+	// TIME STAMPS
+	//-----------------------------------------------------------------------------------------------------------------
+
+	GetString (timeStamp, TIME_STAMP, 0);
+	assert ((timeStamp$"^[0-9]{4}/[0-9][0-9]?/[0-9][0-9]?\\ [0-9][0-9]?\\:[0-9][0-9]?$")[0]==0, "The GMT version of the time stamp must be of the form YYYY/M/D H:M. Had " + timeStamp);
+
+	GetString (timeStamp, TIME_STAMP, 1);
+	assert (Type (timeStamp) == "String", "The local version of the time stamp must be a string. Had " + Type (timeStamp));
+
+	//-----------------------------------------------------------------------------------------------------------------
+	// DATA SET 
+	//-----------------------------------------------------------------------------------------------------------------
+
+	DataSet 			_testDataSet = ReadDataFile ("../../data/mtDNA.fas");
+
+	GetString (sequenceNames, _testDataSet, -1);
+	assert (Type(sequenceNames) == "Matrix" && Type (sequenceNames[0]) == "String" && Rows(sequenceNames) == 1 && Columns (sequenceNames) == _testDataSet.species, "Retrieve all sequence names from a DataSet");
+	
+	GetString (sequenceName, _testDataSet, 2);
+	assert (sequenceNames[2] == sequenceName, "Retrieve a sequence name from DataSet by index");
+
+	GetString (sequenceName, _testDataSet, 1024);
+	assert (Type (sequenceName) == "Unknown", "Retrieve an invalid sequence index from a DataSet");
+
+	//-----------------------------------------------------------------------------------------------------------------
+	// DATA SET FILTER
+	//-----------------------------------------------------------------------------------------------------------------
+
+	DataSetFilter 		_testDataSetFilter = CreateFilter (_testDataSet,1,"",""+(_testDataSet.species-1)+",1,0");
+
+	GetString (filterNames, _testDataSetFilter, -1);
+	assert (Type(filterNames) == "Matrix" && Type (filterNames[0]) == "String" && Rows(filterNames) == 1 && Columns (filterNames) == _testDataSetFilter.species, "Retrieve all sequence names from a DataSetFilter");
+
+	GetString (filterSeqName, _testDataSetFilter, 0);
+	assert (sequenceNames[_testDataSet.species-1] == filterSeqName, "Retrieve a sequence name from DataSetFilter by index");
+
+	GetString (filterSeqName, _testDataSet, 1024);
+	assert (Type (filterSeqName) == "Unknown", "Retrieve an invalid sequence index from a DataSet");
+
+	//-----------------------------------------------------------------------------------------------------------------
+	// VARIABLES
+	//-----------------------------------------------------------------------------------------------------------------
+
+	testVariable = Log(2);
+	
+	GetString (variableInfo, testVariable, 0);
+	assert (Type (variableInfo) == "String" && variableInfo / "0.693*", "Retrieve the string representation of the value stored in a variable");
+	
+	global		  Z = 0;
+	testVariable := Z * (2+Y);
+	
+	GetString (variableInfo, testVariable, 0);
+	assert (Type (variableInfo) == "String" && variableInfo == "Z*(2+Y)", "Retrieve the expression for the constraint");
+
+	GetString (variableInfo, testVariable, -1);
+	
+	assert (Type (variableInfo) == "AssociativeList" && (variableInfo["Global"])[0] == "Z" && (variableInfo["Local"])[0] == "Y", "Retrieve the variables invovled in the constraint");
+
+	//-----------------------------------------------------------------------------------------------------------------
+	// HBL User Function
+	//-----------------------------------------------------------------------------------------------------------------
+
+	GetString (functionInfo, factorial, -1);
+	assert (Type (functionInfo) == "AssociativeList", "Retrieve information about a user function");
+	ExecuteCommands ("function " + functionInfo["ID"] + "(" + Join(",", functionInfo["Arguments"]) + ") {" + functionInfo["Body"] + "} fact5 = factorial (5);");
+	assert (fact5 == 120, "HBL function component retrieval 5! != " + fact5);
+	
+	//-----------------------------------------------------------------------------------------------------------------
+	// SUBSTITUTION MODELS
+	//-----------------------------------------------------------------------------------------------------------------
+
+    global R = 1;
+    binaryModel = {{*,rate1}{R*rate2,*}};
+    freqs       = {{0.5,0.5}};
+    Model         testModel1 = (binaryModel, freqs, 0);
+    Model         testModel2 =("Exp(binaryModel)",freqs,EXPLICIT_FORM_MATRIX_EXPONENTIAL);
+
+    GetString (modelInfo1, testModel1,       1);
+    GetString (modelInfo2, testModel1,       2);
+    GetString (modelBL, testModel1,         -1);
+    GetString (modelBits, testModel1,       -2);
+    GetString (modelInfo1_0, testModel1,    1,0);
+
+ 
+	assert (Type (modelInfo2) == "Unknown" && modelInfo1 == "rate2" && modelBL == "0.5*rate1+0.5*R*rate2" && modelInfo1_0 == "R*rate2" &&
+	        Type (modelBits) == "AssociativeList" && modelBits["EQ_FREQS"] == "freqs", "Retrieve information about a substitution model");
+
+    GetString (modelInfo1, testModel2,       0);
+    GetString (modelBL, testModel2,         -1);
+    GetString (modelBits, testModel2,       -2);
+    GetString (modelInfo1_0, testModel2,    1,0);
+
+	assert ( modelInfo1 == "rate1" && Type (modelInfo2) == "Unknown" && Type (modelBL) == "Unknown" && Type (modelInfo1_0) == "Unknown" , "Retrieve information about a substitution model in explicit form");
+
+	//-----------------------------------------------------------------------------------------------------------------
+	// Likelihood Functions
+	//-----------------------------------------------------------------------------------------------------------------
+
+    ExecuteAFile (PATH_TO_CURRENT_BF  + "res" + DIRECTORY_SEPARATOR + "test_likefunc.nex");
+    ExecuteAFile (PATH_TO_CURRENT_BF  + "res" + DIRECTORY_SEPARATOR + "test_likefunc2.nex");
+
+    GetString (likelihoodFunctionInfoArgument, lf, 10);
+    GetString (likelihoodFunctionInfoArgumentDep, lf, 18);
+    GetString (likelihoodFunctionInfoArgumentFail, lf, 65536);
+	assert (Type (likelihoodFunctionInfoArgumentFail) == "Unknown" && likelihoodFunctionInfoArgument == "givenTree.B_US_83_RF_ACC_M17451.synRate" &&
+	              likelihoodFunctionInfoArgumentDep == "GT", "Retrieve information about likelihood function parameters");
+
+    GetString (likelihoodFunctionInfoArgumentTotal, lf, -1);
+
+ 	//-----------------------------------------------------------------------------------------------------------------
+	// Global Retrieval by Type
+	//-----------------------------------------------------------------------------------------------------------------
+
+
+    GetString (objectID0, LikelihoodFunction, 0);
+    GetString (objectID1, DataSet, 1);
+    GetString (objectID2, DataSetFilter, 2000);
+    GetString (objectInfo, UserFunction, 0);
+    GetString (objectInfoInvalid, UserFunction, 5000);
+    GetString (treeInfo, Tree, 1);
+    GetString (treeInfoInvalid, Tree, 8192); 
+    DeleteObject (lf);
+    GetString (objectID0_2, LikelihoodFunction, 0);
+
+	assert (Type (objectID2) == "Unknown" && objectID0 == "lf" && objectID1 == "ds" && Type (objectInfo) == "AssociativeList" && Type (objectInfoInvalid) == "Unknown" &&
+	        objectID0_2 == "IntermediateCodon_AA_LF", "Retrieve identifiers of HBL objects by index");
+
+
+	//-----------------------------------------------------------------------------------------------------------------
+	// SCFG
+	//-----------------------------------------------------------------------------------------------------------------
+    
+    ExecuteAFile (PATH_TO_CURRENT_BF + "res" + DIRECTORY_SEPARATOR + "SCFG" + DIRECTORY_SEPARATOR + "scfgG6c.bf", {"0": "small.txt"});
+    GetString (scfgID, SCFG, 0);
+    assert (scfgID == "G6", "Retrieve an SCFG identifier");
+    ExecuteCommands ("GetString (scfgInfoTotal, `scfgID`, -1)");
+    assert ((scfgInfoTotal["TERMINALS"])[2] == "<", "Retrieve SCFG components");
+
+	testResult = 1;
+		
+	return testResult;
+}
diff --git a/tests/hbltests/UnitTests/HBLCommands/GetURL.bf b/tests/hbltests/UnitTests/HBLCommands/GetURL.bf
new file mode 100644
index 0000000..3d22928
--- /dev/null
+++ b/tests/hbltests/UnitTests/HBLCommands/GetURL.bf
@@ -0,0 +1,33 @@
+ExecuteAFile (PATH_TO_CURRENT_BF + "TestTools.ibf");
+runATest ();
+
+
+function getTestName () {
+	return "GetURL";
+}		
+
+function getTestedFunctions ()
+{
+	return {{"_ElementaryCommand::HandleGetURL", "CheckReceptacleCommandID"}};
+}	
+
+
+function runTest () {
+	ASSERTION_BEHAVIOR = 1; /* print warning to console and go to the end of the execution list */
+	testResult  	   = 0;
+
+    GetURL (url_data, "http://www.hyphy.org");
+    assert (Abs(url_data) > 0, "Expected to retrieve non-empty data from http://www.hyphy.org");
+    
+    GetURL (PATH_TO_CURRENT_BF + "tmp" + DIRECTORY_SEPARATOR + "GetURL.txt", "http://www.google.com", SAVE_TO_FILE);
+    assert (Abs(url_data) > 0, "Expected to retrieve non-empty data from http://www.hyphy.org");
+    
+    assert (runCommandWithSoftErrors ("GetURL (url_data/j, \"http://www.google.com\")", " is not a valid variable identifier"), "Failed error checking for an invalid receptacle");
+    assert (runCommandWithSoftErrors ("GetURL (url_data, \"http://www.thereisnowaythisurlexists.org\")", "Could not fetch "), "Failed error checking for a URL fetch error");
+    assert (runCommandWithSoftErrors ("GetURL (PATH_TO_CURRENT_BF + \"tmp\" + DIRECTORY_SEPARATOR + \"GetURL.txt\", \"http://www.thereisnowaythisurlexists.org\", SAVE_TO_FILE)", "Could not fetch "), "Failed error checking for a URL fetch error, writing to file");
+    assert (runCommandWithSoftErrors ("GetURL (url_data, \"http://www.hyphy.org\", FAILED_FLAG)", "Unknown action flag "), "Failed error checking for an invalid action flag");
+
+	testResult = 1;
+		
+	return testResult;
+}
diff --git a/tests/hbltests/UnitTests/HBLCommands/HarvestFrequencies.bf b/tests/hbltests/UnitTests/HBLCommands/HarvestFrequencies.bf
new file mode 100644
index 0000000..023cf30
--- /dev/null
+++ b/tests/hbltests/UnitTests/HBLCommands/HarvestFrequencies.bf
@@ -0,0 +1,92 @@
+ExecuteAFile (PATH_TO_CURRENT_BF + "TestTools.ibf");
+runATest ();
+
+
+function getTestName () {
+	return "HarvestFrequencies";
+}		
+
+function getTestedFunctions ()
+{
+	return {{" _ElementaryCommand::HandleHarvestFrequencies","_DataSet::HarvestFrequencies", "_DataSet::constructFreq"}};
+}	
+
+
+function runTest () {
+	ASSERTION_BEHAVIOR = 1; /* print warning to console and go to the end of the execution list */
+	testResult  	   = 0;
+    
+    assert (runCommandWithSoftErrors ("HarvestFrequencies (corn/holio,filter,2)","Incorrect number of arguments"), "Failed error checking for an invalid syntax");
+    assert (runCommandWithSoftErrors ("HarvestFrequencies (corn/holio,filter,1,1,1)","is not a valid variable identifier in call to HarvestFrequencies"), "Failed error checking for an invalid receptacle");
+    assert (runCommandWithSoftErrors ("HarvestFrequencies (cornholio,filter,1,1,1)","is neither a DataSet nor a DataSetFilter"), "Failed error checking for an invalid dataset/dataset filter parameter");
+
+    ExecuteAFile (PATH_TO_CURRENT_BF  + "res" + DIRECTORY_SEPARATOR + "test_likefunc.nex");
+
+    HarvestFrequencies (nucFreqs, filteredData, 1, 1, 1);
+    assert (Abs (nucFreqs-{
+{    0.404450757576}
+{    0.166287878788}
+{    0.209564393939}
+{    0.219696969697}
+}) < 1e-8, "Checking nucleotide frequency counts");
+
+    assert (runCommandWithSoftErrors ("HarvestFrequencies (cornholio,filteredData,3,2,1)","Atom should divide unit"), "Failed error checking for an invalid unit/atom specification");
+    
+    HarvestFrequencies (nucFreqsFromDS, ds, 1, 1, 1);
+    assert (Abs (nucFreqs-nucFreqsFromDS) < 1e-8, "Checking nucleotide frequency counts collected from the DataSet object");
+    
+    HarvestFrequencies (nucFreqsFromDSExplicit, ds, 1, 1, 1,"0");
+    assert (Abs (nucFreqsFromDSExplicit-{{    0}
+{    1}
+{    0}
+{    0}
+}) < 1e-8, "Checking nucleotide frequency counts collected from the DataSet object with a site partition string");
+
+    HarvestFrequencies (nucFreqsFromDSExplicit, ds, 1, 1, 1,"0-4",speciesIndex==1); // CCCAT
+    assert (Abs (nucFreqsFromDSExplicit-{{    .2}
+{    .6}
+{    0}
+{    .2}
+}) < 1e-8, "Checking nucleotide frequency counts collected from the DataSet object with a site/species partition");
+
+
+    simpleDataSet = ">1\nARGT--\n>2\nAGGYCC";
+    DataSet simpleTest = ReadFromString (simpleDataSet);
+    
+    COUNT_GAPS_IN_FREQUENCIES = 1;
+    HarvestFrequencies (count1, simpleTest, 1, 1, 1);
+    assert (Abs (count1-{{    3}
+{    3}
+{    4}
+{    2} 
+}* (1/12)) < 1e-8, "Checking simple frequency counts with - mapped to N-way ambiguities");
+    
+    COUNT_GAPS_IN_FREQUENCIES = 0;
+    HarvestFrequencies (count2, simpleTest, 1, 1, 1);
+    assert (Abs (count2-{{    2.5}
+{    2.5}
+{    3.5}
+{    1.5} 
+}* (1/10)) < 1e-8, "Checking simple frequency counts with - mapped to nil");
+    
+    HarvestFrequencies (count12_positional, simpleTest, 2, 1, 1);
+    assert (Abs (count12_positional-{{    2,0.5}
+{    1,1.5}
+{    2,1.5}
+{    0,1.5} 
+}* (1/5)) < 1e-8, "Checking positional dinucleotide frequency counts");
+    
+    
+    
+    HarvestFrequencies (count12_overall, simpleTest, 2, 1, 0);
+    assert (Abs (count2-count12_overall) < 1e-8, "Checking the equivalence of counting nucleotides directly or counting doublets while ignoring position");
+    
+    HarvestFrequencies (count22, simpleTest, 2, 2, 1);
+    assert (Abs (count22-{16,1,{0,0,0.5},{2,0,1.5},{5,0,1},{9,0,.5},{11,0,1.5}}* (1/5)) < 1e-8, "Checking dinucleotide frequency counts");
+    
+    HarvestFrequencies (count3, simpleTest, 4, 1, 1); // check the case when the number of sites is not a multiple of the unit
+
+	testResult = 1;
+		
+	return testResult;
+}
\ No newline at end of file
diff --git a/tests/hbltests/UnitTests/HBLCommands/JSON.bf b/tests/hbltests/UnitTests/HBLCommands/JSON.bf
new file mode 100644
index 0000000..7853187
--- /dev/null
+++ b/tests/hbltests/UnitTests/HBLCommands/JSON.bf
@@ -0,0 +1,23 @@
+// Tests associativeListtoJSON function.
+LoadFunctionLibrary("lib2014/UtilityFunctions.bf");
+
+test_json    =    {"fits"           : {},
+                  "timers"          : {},
+                  "profiles"        : "[[inf,0.9779047623694379],[inf,0.02209523763056209]]","GOOSE_HONGKONG_W355_97" : "[[1,-nan]]","DUCK_HONGKONG_Y283_97" : "[[-nan,inf]]",
+                  "evidence ratios" : {}
+                  };
+
+
+new_test_json = utility.associativeListToJSON(test_json);
+
+new_test_string = " " + new_test_json + " ";
+
+// inf and -nan are not parseable JSON
+inf_exists = new_test_string/"*inf*";
+nan_exists = new_test_string/"*-nan*";
+e999_exists = new_test_string/"*1e999*";
+null_exists = new_test_string/"*null*";
+assert(!inf_exists, "inf still exists in JSON");
+assert(!nan_exists, "-nan still exists in JSON");
+assert(e999_exists, "1e999 does not exist in JSON");
+assert(null_exists, "null does not exist in JSON");
diff --git a/tests/hbltests/UnitTests/HBLCommands/RequireVersion.bf b/tests/hbltests/UnitTests/HBLCommands/RequireVersion.bf
new file mode 100644
index 0000000..ab5d56a
--- /dev/null
+++ b/tests/hbltests/UnitTests/HBLCommands/RequireVersion.bf
@@ -0,0 +1,2 @@
+RequireVersion ("1.00");
+RequireVersion ("9.99");
\ No newline at end of file
diff --git a/tests/hbltests/UnitTests/HBLCommands/TestTools.ibf b/tests/hbltests/UnitTests/HBLCommands/TestTools.ibf
new file mode 100644
index 0000000..ccf5f5c
--- /dev/null
+++ b/tests/hbltests/UnitTests/HBLCommands/TestTools.ibf
@@ -0,0 +1,39 @@
+function runCommandWithSoftErrors (command, expected_error_reg_exp) {
+	localTestResult  	   = 0;
+
+    LAST_HBL_EXECUTION_ERROR = "";
+    SetParameter(HBL_EXECUTION_ERROR_HANDLING,1,0);
+    ExecuteCommands (command);
+    assert ((LAST_HBL_EXECUTION_ERROR$expected_error_reg_exp)[0] >= 0, "Expected an error matching '" + expected_error_reg_exp + "', while executing '" +  command + "'.\nHad error\n" + LAST_HBL_EXECUTION_ERROR + "\n");
+    SetParameter(HBL_EXECUTION_ERROR_HANDLING,0,0);
+    localTestResult          = 1;
+    
+    return localTestResult;
+}
+
+function trapAllErrors (command) {
+	localTestResult  	   = 0;
+
+    LAST_HBL_EXECUTION_ERROR = "";
+    ExecuteCommands ("SetParameter(HBL_EXECUTION_ERROR_HANDLING,1,0);" + command);
+    assert (Type(LAST_HBL_EXECUTION_ERROR) != "String", "Encountered an error '" + LAST_HBL_EXECUTION_ERROR + "', while executing '" +  command + "'.\n");
+    localTestResult          = 1;
+    
+    return localTestResult;
+}
+
+
+function runATest () {
+    fprintf    (stdout, "[Running COVERAGE TEST '", getTestName(), "']\n");
+    result  =  runTest();
+    if (result)
+    {
+        fprintf (stdout, "[TEST PASSED]\n");
+        return 1;
+    }
+    else
+    {
+        fprintf (stdout, "[TEST FAILED]\n");
+    }
+    return 0;
+}
\ No newline at end of file
diff --git a/tests/hbltests/UnitTests/HBLCommands/Type.bf b/tests/hbltests/UnitTests/HBLCommands/Type.bf
new file mode 100644
index 0000000..fbebe84
--- /dev/null
+++ b/tests/hbltests/UnitTests/HBLCommands/Type.bf
@@ -0,0 +1,48 @@
+function getTestName ()
+{
+	return "Type";
+}		
+
+function getTestedFunctions ()
+{
+	return {{"_MathObject::Type;*::ObjectClass"}};
+}	
+
+function runTest ()
+{
+	ASSERTION_BEHAVIOR = 1; /* print warning to console and go to the end of the execution list */
+	testResult  	   = 0;
+	
+	assert (Type(Exp(1)) == "Number", "Type of a numeric object");
+
+	M = {{1,2}};
+	assert (Type(M) == "Matrix", "Type of a matrix object");
+
+	A = {"0":"A", "A":"0"};
+	assert (Type(A) == "AssociativeList", "Type of an associative array object");
+
+	Topology Top = (1,2,3);
+	assert (Type(Top) == "Topology", "Type of a topology object");
+
+	Tree 	T = (1,2,3);
+	assert (Type(T) == "Tree", "Type of a tree object");
+	assert (Type (BranchLength (T,5)) == "Unknown", "Type of an unknown object");
+	
+	assert (Type("Hello world") == "String", "Type of a string object");
+	
+	testResult  	   = 1;
+	return testResult;
+}
+
+/* execution stub */
+
+fprintf    (stdout, "[Running COVERAGE TEST '", getTestName(), "']\n");
+result  =  runTest();
+if (result)
+{
+	fprintf (stdout, "[TEST PASSED]\n");
+}
+else
+{
+	fprintf (stdout, "[TEST FAILED]\n");
+}
diff --git a/tests/hbltests/UnitTests/HBLCommands/res/SCFG/SCFG.ibf b/tests/hbltests/UnitTests/HBLCommands/res/SCFG/SCFG.ibf
new file mode 100644
index 0000000..4a44dfa
--- /dev/null
+++ b/tests/hbltests/UnitTests/HBLCommands/res/SCFG/SCFG.ibf
@@ -0,0 +1,493 @@
+/* SCFG.ibf */
+
+SCFG_OPTIMIZATION_METHOD = 1;
+
+/* 	
+	declare associative list that indexes non-terminals by
+	by their literal (textual) representation 
+*/
+non_terminals = {};
+
+/*
+	by convention, the start symbol is represented by 
+	literal 'S' 
+*/
+non_terminals["S"] = 0;
+
+/*	
+	declare two more associative lists to contain branching
+	(X->YZ) and terminal (X-x) types of production rules, 
+	respectively 
+*/
+branching_rules = {};
+terminal_rules = {};
+
+
+/*  declare this at global scope */
+dot_string = "";
+
+/* ______________________________________________________________ */
+
+function add_branching_rule (ntL, ntR1, ntR2, prob_string)
+{
+	/* 
+		append production rule to associative list of
+		form X->YZ, using string arguments ntL->ntR1 ntR2
+		and a string expressing probability as a function 
+		of global varaibles
+	*/
+	
+	ntL_index = non_terminals[ntL];
+	if (ntL_index == 0 && ntL != "S")
+	{
+		/* first use of non-terminal, update list */
+		ntL_index = Abs(non_terminals);
+		non_terminals[ntL] = ntL_index;
+	}
+	
+	ntR1_index = non_terminals[ntR1];
+	if (ntR1_index == 0 && ntR1 != "S")
+	{
+		ntR1_index = Abs(non_terminals);
+		non_terminals[ntR1] = ntR1_index;
+	}
+	
+	ntR2_index = non_terminals[ntR2];
+	if (ntR2_index == 0 && ntR2 != "S")
+	{
+		ntR2_index = Abs(non_terminals);
+		non_terminals[ntR2] = ntR2_index;
+	}
+	
+	/* declare associative list comprising these items */
+	aRule = {};
+	aRule ["L"] = ntL_index;
+	aRule ["1"] = ntR1_index;
+	aRule ["2"] = ntR2_index;
+	
+	
+	/* an otherwise empty string denotes a deterministic rule */
+	if (Abs(prob_string))
+	{
+		aRule ["P"] = prob_string;
+	}
+	
+	
+	/* append associative list to the list of rules */
+	branching_rules[Abs(branching_rules)] = aRule;
+	
+	return 0;
+}
+
+
+/* ______________________________________________________________ */
+
+function add_terminal_rule (ntL, term_string, prob_string)
+{
+	/*
+		append production rule to associative list of 
+		form X->x using string arguments "ntL"->"term_string"
+		and a string expressing rule probability as a function
+		of global variables
+	*/
+	
+	ntL_index = non_terminals[ntL];
+	if (ntL_index == 0 && ntL != "S")
+	{
+		/* first use of non-terminal, update list */
+		ntL_index = Abs(non_terminals);
+		non_terminals[ntL] = ntL_index;
+	}
+	
+	aRule = {};
+	aRule ["L"] = ntL_index;
+	aRule ["T"] = term_string;
+	
+	if (Abs(prob_string))
+	{
+		aRule ["P"] = prob_string;
+	}
+	
+	terminal_rules[Abs(terminal_rules)] = aRule;
+	
+	return aRule;
+}
+
+
+/* ____________________________________________________________________ */
+function make_SCFG (scfgname)
+{
+	/* SCFG	 loopgram = (NTT_Rules, NT3_Rules); */
+	ExecuteCommands ("SCFG "+scfgname+" = (terminal_rules,branching_rules);");
+	return 0;
+}
+
+
+/* ____________________________________________________________________ */
+function output_graphviz (unused)
+{
+	/*
+		Generate a DOT formatted file encoding a graph representation
+		of the grammar, to be rendered using GraphViz.
+		This function takes no arguments, so just send a '0'.
+	*/
+	
+	
+	dot_string * 256;	/* allocate at least 256 bytes for string streaming */
+	dot_string * "digraph scfg {\n";
+	dot_string * "\tnode [style=\"setlinewidth(0)\"];\n";
+	
+	/* generate dictionary from associative list of non-terminals */
+	nt_keys = Rows(non_terminals);
+	
+	for (nt3 = 0; nt3 < Abs(branching_rules); nt3 = nt3 + 1)
+	{
+		rule = branching_rules[nt3];
+		nt_L = nt_keys[rule["L"]];
+		nt_1 = nt_keys[rule["1"]];
+		nt_2 = nt_keys[rule["2"]];
+		dot_string * ("\t\""+nt_L+"\"->\""+nt_1+"\";\n");
+		dot_string * ("\t\""+nt_L+"\"->\""+nt_2+"\";\n");
+	}
+	
+	
+	for (ntt = 0; ntt < Abs(terminal_rules); ntt = ntt + 1)
+	{
+		rule = terminal_rules[ntt];
+		nt_L = nt_keys[rule["L"]];
+		term_string = rule["T"];
+		dot_string * ("\t\""+nt_L+"\"->\"'"+term_string+"'\";\n");
+	}
+	
+	dot_string * "}\n";
+	dot_string * 0;	/* finalize string stream */
+	
+	SetDialogPrompt ("Select file to write DOT strings:");
+	fprintf (PROMPT_FOR_FILE, CLEAR_FILE, dot_string);
+	
+	return 0;
+}
+
+
+/* ______________________________________________________ */
+function attach_corpus (scfg_string)
+{
+	/*
+		A corpus is a set of strings, and hence refers to data
+		that can be used for either training or parsing via
+		the grammar.
+		Send the name of the SCFG as an argument, i.e., in 
+		double quotes ("foo").
+	*/
+	
+	SetDialogPrompt ("Select file containing corpus text");
+	
+	fscanf (PROMPT_FOR_FILE, "Lines", input);
+	corpus = Tranpose(input);
+	ExecuteCommands("SetParameter ("+scfg_string+", SCFG_STRING_CORPUS, corpus);");
+	
+	return corpus;
+}
+
+
+/* ____________________________________________________ */
+function train_grammar (scfg_string, method)
+{
+	/*
+		Call an optimization method:
+		
+		 "CG" = (recommended) maximum likelihood heuristic 
+		 		search, which by default is a conjugate 
+		 		gradient method
+		 		
+		 "EM" = expectation maximization, i.e., inside-
+				outside algorithm
+	*/
+	
+	/* make sure a corpus is attached */
+	ExecuteCommands("GetString (scfgInfo, "+scfg_string+", -1);");
+	
+	if (Columns(scfgInfo["SCFG_STRING_CORPUS"]) > 0)
+	{
+		if (method == "EM")
+		{
+			fprintf (stdout, "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n");
+			fprintf (stdout, " WARNING: EM will NOT work with probability constraints.\n");
+			fprintf (stdout, " It can only take the first global variable in the \n");
+			fprintf (stdout, " probability function as the rule-specific parameter.\n");
+			fprintf (stdout, "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n");
+			
+			SCFG_OPTIMIZATION_METHOD = 0;
+		}
+		else
+		{
+			SCFG_OPTIMIZATION_METHOD = 1;
+		}
+		
+		/* compute initial likelihood */
+		timer0 = Time(0);
+		ExecuteCommands("LFCompute ("+scfg_string+", LF_START_COMPUTE);");
+		ExecuteCommands("LFCompute ("+scfg_string+", logL);");
+		
+		fprintf (stdout, "\nPass 1. Time = ", Time(0)-timer0, " seconds \nInitial Log-likelihood: ", logL, "\n");
+		
+		timer0 = Time(0);
+		ExecuteCommands ("Optimize(res,"+scfg_string+");");
+		timer = Time(0);
+		
+		logL = res[1][0];
+		fprintf (stdout, "Optimization completed in ", timer-timer0, "s with log L = ", logL, "\n");
+		
+		df = Columns(scfgInfo["Global Independent"]) - Columns(scfgInfo["Global Constrained"]);
+		fprintf (stdout, "AIC = ", 2*df - 2*logL,"\n");
+		
+		
+		fprintf (stdout, "Export grammar to file (y/n)? : ");
+		fscanf (stdin, "String", _yn);
+		if (_yn != "N" && _yn != "n")
+		{
+			export_grammar(scfg_string);
+		}
+	}
+	else
+	{
+		fprintf (stdout, "Unable to train grammar, no corpus attached.  Call attach_corpus(\""+scfg_string+"\")\n");
+		res = 0;
+	}
+	
+	return res;
+}
+
+
+/* ___________________________________________________________ */
+function export_grammar (scfg_string)
+{
+	scfgInfo = "";
+	
+	ExecuteCommands("GetString (scfgInfo, "+scfg_string+", -1);");
+	
+	/* add maximum likelihood parameter estimates */
+	scfgInfo["MLE"] = Transpose(res[0][-1]);
+	
+	/* repair string entries, escape double-quotes to be literal */
+	for (pr = 0; pr < Columns(scfgInfo["PRODUCTIONS"]); pr = pr+1)
+	{
+		rule = ""+(scfgInfo["PRODUCTIONS"])[pr];
+		(scfgInfo["PRODUCTIONS"])[pr] = rule^{{"\""}{"\\\""}};
+	}
+	
+	export_str = "_exportScfg = " + scfgInfo + ";\n";
+	
+	SetDialogPrompt ("Select file to export grammar:");
+	fprintf (PROMPT_FOR_FILE, CLEAR_FILE, export_str);
+	
+	return 0;
+}
+
+/* ___________________________________________________________ */
+function import_parameters (scfg_string)
+{
+	SetDialogPrompt ("Import grammar parameters from file:");
+	fscanf (PROMPT_FOR_FILE, "Raw", importScfg);
+	
+	ExecuteCommands(importScfg);
+	
+	/* loop through global parameters and set to training estimates */
+	for (gi = 0; gi < Columns(_exportScfg["Global Independent"]); gi = gi+1)
+	{
+		ExecuteCommands ((_exportScfg["Global Independent"])[gi] + " := " + (_exportScfg["MLE"])[gi]+";");
+	}
+	
+	/* fill probability indices */
+	ExecuteCommands("LFCompute ("+scfg_string+", LF_START_COMPUTE);");
+	ExecuteCommands("LFCompute ("+scfg_string+", logL);");
+	
+	return 0;
+}
+
+
+
+/* ___________________________________________________________ */
+function parse_corpus (scfg_string)
+{
+	ExecuteCommands("GetString (scfgInfo, "+scfg_string+", -1);");
+	
+	if (Columns(scfgInfo["SCFG_STRING_CORPUS"]) > 0)
+	{
+		ExecuteCommands("DataSet ancData = ReconstructAncestors ("+scfg_string+");");
+		tempstr = ""+ancData;
+		
+		ntkeys = Rows(non_terminals);
+		for (_nt = 0; _nt < Columns(ntkeys); _nt = _nt+1)
+		{
+			tempstr = tempstr^{{"\("+_nt+" "}{"("+ntkeys[_nt]+" "}}; /* search and replace */
+		}
+		
+		/* fprintf(stdout, "\nBest parse tree (CYK):\n", tempstr, "\n"); */
+		fprintf (stdout, "\n\n***********Save parse trees to a file (y/n)?");
+		fscanf  (stdin, "String", resp);
+		if ((resp!="n")&&(resp!="N"))
+		{
+			SetDialogPrompt ("Write parse trees to:");
+			fprintf (PROMPT_FOR_FILE, CLEAR_FILE, temp_str, ";");
+		}
+	}
+	else
+	{
+		fprintf (stdout, "Error: no corpus attached to grammar to parse\n");
+	}
+	
+	/* convert string concatenation of parse trees into string matrix */
+	breaks = tempstr||"\n";
+	left = 0;
+	res = {Rows(breaks)$2,1};
+	for (s = 0; s < Rows(breaks); s = s+2)
+	{
+		ptree = tempstr[left][breaks[s]];
+		left = breaks[s];
+		res[s$2] = ptree;
+	}
+	
+	return res;
+}
+
+
+
+/* ______________________________________________________ */
+function render_parsetree (treestr)
+{
+	dot_string * 256;	/* allocate at least 256 bytes for string streaming */
+	dot_string * "digraph parsetree {\n";
+	dot_string * "\tnode [style=\"setlinewidth(0)\"];\n";
+	
+	
+	dot_string * dot_recursion(treestr, "root", 0, 0);
+	
+	
+	dot_string * "}\n";
+	dot_string * 0;	/* finalize string stream */
+	
+	SetDialogPrompt ("Select file to write DOT strings:");
+	fprintf (PROMPT_FOR_FILE, CLEAR_FILE, dot_string);
+}
+
+
+function dot_recursion (treestr, parent, nt_count, term_count)
+{
+	/* 
+		adapted from Python code authored by afyp
+		traverse parse tree and generate GraphViz code on the fly
+	*/
+	
+	children = {};
+	child = {2,1};
+	depth = 0;
+	
+	/* locate children of this parent at depth = 1 */
+	for (i = 1; i < Abs(treestr)-1; i = i+1)
+	{
+		if (treestr[i] == "(")
+		{
+			depth = depth + 1;
+			if (depth == 1)
+			{
+				/* record location in string */
+				child[0] = i+1;
+				
+				/* look ahead to find end of non-terminal identifier */
+				for (j = i+1; j < Abs(treestr)-1; j=j+1)
+				{
+					if (treestr[j] == " ")
+					{
+						child[1] = j;
+						break;
+					}
+				}
+				
+				/* insert vector into associative array */
+				children[Abs(children)] = child;
+			}
+		}
+		else if (treestr[i] == ")")
+		{
+			depth = depth - 1;
+		}
+	}
+	
+	/* output children and call recursions on each child */
+	for (ch = 0; ch < Abs(children); ch = ch + 1)
+	{
+		nt_count = nt_count + 1;
+		dot_string * ("\""+parent+"\"->\""+treestr[children[ch]]+nt_count+";\n");
+		
+		dot_recursion(treestr[]);
+	}
+	
+	
+	
+}
+
+
+/* ______________________________________________________ */
+function report_grammar (scfg_string)
+{
+	ExecuteCommands("GetString (scfgInfo, "+scfg_string+", -1);");
+	
+	productionInfo = scfgInfo["PRODUCTIONS"];
+	probabilityInfo = scfgInfo["PROBABILITIES"];
+	varInfoG = scfgInfo["Global Independent"];
+	
+	fprintf (stdout, "\nThe grammar comprises ", Columns (productionInfo), " production rules\n");
+	for (k=0; k<Columns (productionInfo); k=k+1)
+	{
+		fprintf (stdout, "Production Rule ", k+1, ": ", productionInfo[k], " P=", probabilityInfo[k],"\n");	
+	}
+	
+	fprintf (stdout, "\nThe grammar comprises ", Columns (varInfoG), " global independent variables\n");
+	for (k=0; k<Columns (varInfoG); k=k+1)
+	{
+		fprintf (stdout, k+1, ": ", varInfoG[k], " = ", res[0][k],"\n");	
+	}
+	
+	return 0;
+}
+
+
+/* ______________________________________________________ */
+function simulate_corpus (scfg_string, nreps)
+{
+	res = {nreps,1};
+	for (rep = 0; rep < nreps; rep = rep+1)
+	{
+		ExecuteCommands("DataSet sim = SimulateDataSet("+scfg_string+");");
+		res[rep] = sim;
+	}
+	return res;
+}
+
+
+
+/* ______________________________________________________ */
+function profile_likelihood (scfg_string, var, interval)
+{
+	res = {1,2};
+	
+	if (interval > 0. && interval < 1.)
+	{
+		COVARIANCE_PRECISION = interval;
+		
+		ExecuteCommands("GetString (scfgInfo, "+scfg_string+", -1);");
+		varInfoG = scfgInfo["Global Independent"];
+		
+		for (k=0; k<Columns (varInfoG); k=k+1)
+		{
+			if (varInfoG[k] == var)
+			{
+				COVARIANCE_PARAMETER = varInfoG[k];
+				ExecuteCommands("CovarianceMatrix (res,"+scfg_string+");");
+			}
+		}
+	}
+	
+	return res;
+}
diff --git a/tests/hbltests/UnitTests/HBLCommands/res/SCFG/scfgG6c.bf b/tests/hbltests/UnitTests/HBLCommands/res/SCFG/scfgG6c.bf
new file mode 100644
index 0000000..6a06f83
--- /dev/null
+++ b/tests/hbltests/UnitTests/HBLCommands/res/SCFG/scfgG6c.bf
@@ -0,0 +1,94 @@
+/* 
+	Reproduce Knudsen and Hein's grammar for step-loop RNA,
+	termed 'G6' in Dowell and Eddy (2004) BMC Bioinformatics
+		S -> LS | L
+		L -> >F< | .
+		F -> >F< | LS
+	where > < correspond to a base-pair (base and its complement)
+	and . corresponds to an unpaired base
+*/
+
+
+/* load NLP function macros */
+#include "SCFG.ibf";
+
+/* 
+	Anatomy of a global variable declaration:
+	------------------------------------------------------------------
+		global [variable name] = [initial value];
+		[variable name] :> [is constrained to be greater than value];
+		[variable name] :< [is constrained to be less than value];
+*/
+
+/* probability of chain extension */
+global extend = 1.8;		extend :> 0.;	extend :< 100.;
+global stop = 0.01;			stop :> 0.;		stop :< 100.;
+global dS := extend + stop;
+
+/* probability of steming */
+global grow_L = 0.01; 	grow_L :> 0.;	grow_L :< 100.;
+global stop_L = 1.99;		stop_L :> 0.;	stop_L :< 100.;
+global dL := grow_L + stop_L;
+
+global grow_F = 1.32; 	grow_F :> 0.;	grow_F :< 100.;
+global stop_F = 0.44;		stop_F :> 0.;	stop_F :< 100.;
+global dF := grow_F + stop_F;
+
+
+
+/*
+	How to declare a production rule:
+	-------------------------------------------------------
+		A branching rule assumes the form X->YZ.  The non-terminal
+		symbols X, Y, and Z can take any string token in HBL so 
+		long as your notation is consistent.  
+		
+		e.g., letting X="foo", Y="bar", and Z="Baz",
+		add_branching_rule("foo","bar","Baz","");
+		
+		Empty quotes indicate that the rule is deterministic.
+		Otherwise the quotes must contain a string representation
+		of a formula acting on declared global variables.
+		
+		Any operator implemented in HBL can be used:
+			arithmetic		+ - * /
+			polynomial		^ Sqrt
+			trigonometric	Sin Cos Tan
+			transcendental	Exp Log
+*/
+
+
+/* S production rules */
+add_branching_rule("S","L","S","extend/dS");
+add_branching_rule("S",">","F<","stop/dS*grow_L/dL");	/* enforce CNF */
+add_terminal_rule("S",".","stop/dS*stop_L/dL");
+
+
+/* L production rules */
+add_branching_rule("L",">","F<","grow_L/dL");
+add_terminal_rule("L",".","stop_L/dL");
+
+
+/* F production rules */
+add_branching_rule("F",">","F<","grow_F/dF");
+add_branching_rule("F","L","S","stop_F/dF");
+add_branching_rule("F<","F","<","");
+
+
+add_terminal_rule(">",">","");
+add_terminal_rule("<","<","");
+
+
+/* output_graphviz(0); */
+
+make_SCFG ("G6");
+attach_corpus("G6");
+
+//train_grammar("G6", "cg");
+//report_grammar("G6");
+
+/*parse_corpus("G6");*/
+/*
+sim = simulate_corpus("G6", 10);
+fprintf (stdout, sim, "\n");
+*/
diff --git a/tests/hbltests/UnitTests/HBLCommands/res/SCFG/small.txt b/tests/hbltests/UnitTests/HBLCommands/res/SCFG/small.txt
new file mode 100644
index 0000000..f2800de
--- /dev/null
+++ b/tests/hbltests/UnitTests/HBLCommands/res/SCFG/small.txt
@@ -0,0 +1 @@
+...>>>>>.......<<<<<.>>>>>>>>>>.>>>>>>>>>......>>.>>>..>>>.>>>>>>>....<<<<<<<<<<......>>>.......>>>>>>..>>...>>>>>>>.>>>>.....>>>>>>....<<<<<<.....<<<<....>>>>>>...>>......<<..<<<<<<...........<<<<<<..<<<<<<<<<...............................................................>>>>>>>>....<<<<...<<<<<<.>>>>>............<<<<<.>>>>....<<<<...<<<<<<......>.>>>...>>>>>....<<<<<.<<<<.<<<<<<<<<..>>>>>>>...<<<<<<<<.>>>>>>>>>>.......<<<<<<<<<<...>>>>>.......>>>>....................<<<<<<<<<<.<<<<<<<< [...]
\ No newline at end of file
diff --git a/tests/hbltests/UnitTests/HBLCommands/res/test_likefunc.nex b/tests/hbltests/UnitTests/HBLCommands/res/test_likefunc.nex
new file mode 100644
index 0000000..b8d7dd8
--- /dev/null
+++ b/tests/hbltests/UnitTests/HBLCommands/res/test_likefunc.nex
@@ -0,0 +1,648 @@
+#NEXUS
+
+BEGIN TAXA;
+	DIMENSIONS NTAX = 8;
+	TAXLABELS
+		'B_FR_83_HXB2_ACC_K03455' 'B_US_83_RF_ACC_M17451' 'B_US_86_JRFL_ACC_U63632' 'B_US_90_WEAU160_ACC_U21135' 'D_CD_83_ELI_ACC_K03454' 'D_CD_83_NDK_ACC_M27323' 'D_CD_84_84ZR085_ACC_U88822' 'D_UG_94_94UG114_ACC_U88824';
+END;
+
+BEGIN CHARACTERS;
+	DIMENSIONS NCHAR = 1320;
+	FORMAT
+		DATATYPE = DNA
+		GAP=-
+		MISSING=?
+	;
+
+MATRIX
+	'B_FR_83_HXB2_ACC_K03455'     CCCATTAGCCCTATTGAGACTGTACCAGTAAAATTAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAATAAAAGCATTAGTAGAAATTTGTACAGAGATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAAGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGATGGAA [...]
+	'B_US_83_RF_ACC_M17451'       CCCATTAGTCCTATTGAAACTGTACCAGTAAAATTAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAGGAAAAAATAAAAGCATTGGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCCAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAGTTAGGAATACCACATCCTGCAGGGTTAAAAAAGAAGAAATCAGTAACAGTATTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATAAAGAGTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAAACACCACGGATTAGATATCAGTACAATGTGCTTCCACAAGGGTGGAA [...]
+	'B_US_86_JRFL_ACC_U63632'     CCCATTAGTCCTATTGAAACTGTACCAGTAAAATTAAAGCCAGGAATGGATGGCCCAAAAGTCAAACAATGGCCATTGACAGAAGAAAAAATAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAGGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAAAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCCGCAGGGTTAAAAAAGAGAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATAAAGACTTCAGGAAATATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGGTATCAGTACAATGTGCTTCCGCAGGGATGGAA [...]
+	'B_US_90_WEAU160_ACC_U21135'  CCCATTAGTCCTATTGAAACTGTACCAGTAAAATTAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAGAAAATAAAAGCATTAGTAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAATCCATATAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGAATACCACATCCTTCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTACCCTTAGATGAAGACTTCAGGAAGTACACTGCATTTACCATACCTAGTATAAACAATGAAACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGATGGAA [...]
+	'D_CD_83_ELI_ACC_K03454'      CCAATTAGTCCTATTGAAACTGTACCAGTAAAATTAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAATAAAAGCATTAACAGAAATTTGTACAGATATGGAAAAGGAAGGAAAAATTTCAAGAATTGGGCCTGAAAATCCATACAATACTCCAATATTTGCCATAAAGAAAAAAGACAGTACCAAGTGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGATTTCTGGGAAGTTCAATTAGGAATACCGCATCCTGCAGGGCTGAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTTTCAGTTCCCTTAGATGAAGATTTTAGGAAATATACCGCCTTTACCATATCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTTCCACAGGGATGGAA [...]
+	'D_CD_83_NDK_ACC_M27323'      CCAATTAGTCCTATTGAAACTGTACCAGTAAAATTAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCATTGACAGAAGAAAAAATAAAAGCATTAACAGAAATTTGTACAGAAATGGAAAAGGAAGGAAAAATTTCAAGAATTGGGCCTGAAAATCCATATAATACTCCAATATTTGCCATAAAGAAAAAAGACAGTACCAAGTGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGATTTCTGGGAGGTTCAATTAGGAATACCGCATCCTGCAGGGCTGAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGATGAAGATTTTAGGAAATATACCGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTCCCACAGGGATGGAA [...]
+	'D_CD_84_84ZR085_ACC_U88822'  CCAATTAGTCCTATTGAAACTGTACCAGTAAAATTAAAGCCAGGAATGGATGGCCCAAAAGTTAAACAATGGCCGTTGACAGAAGAAAAAATAAAAGCATTAACAGAAATTTGTACAGATATGGAAAAGGAAGGAAAAATTTCAAGAATTGGGCCTGAAAATCCATACAATACTCCAATATTTGCCATAAAGAAAAAAGACAGTACTAAGTGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCAATTAGGGATACCACATCCTGCAGGATTAAAGAAGAAAAAGTCAATAACAGTACTGGATGTGGGCGATGCATATTTTTCAATTCCCTTATGTGAAGACTTTAGGAAGTACACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTACTTCCACAGGGATGGAA [...]
+	'D_UG_94_94UG114_ACC_U88824'  CCAATTAGTCCTATTGAAACTGTACCAGTAAAATTAAAGCCAGGGATGGATGGCCCAAAAGTTAAACAATGGCCGTTGACAGAAGAAAAAATAAAAGCACTAATAGAAATTTGTTCAGAACTAGAAAAGGAAGGAAAAATTTCAAAAATTGGGCCTGAAAACCCATACAATACTCCAATATTTGCCATAAAGAAAAAAGACAGTACTAAGTGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTTTGGGAAGTTCAACTAGGAATACCACATCCTGCAGGGCTAAAAAAGAAAAAATCAGTAACAGTACTGGATGTGGGTGACGCATATTTTTCAGTTCCCTTACATGAAGACTTTAGAAAATATACCGCATTCACCATACCTAGTACAAACAATGAGACACCAGGAATTAGATATCAGTACAATGTGCTTCCACAAGGATGGAA [...]
+END;
+
+BEGIN TREES;
+	TREE tree = ((((D_CD_83_ELI_ACC_K03454,D_CD_83_NDK_ACC_M27323),D_UG_94_94UG114_ACC_U88824),D_CD_84_84ZR085_ACC_U88822),B_US_83_RF_ACC_M17451,((B_FR_83_HXB2_ACC_K03455,B_US_86_JRFL_ACC_U63632),B_US_90_WEAU160_ACC_U21135));
+END;
+
+BEGIN HYPHY;
+
+OPTIMIZATION_PRECISION = 0.001;
+VERBOSITY_LEVEL        = -1;
+
+global AT=1;
+global CT=1;
+global R=1;
+global AC=1;
+global CG:=AT;
+global GT:=AT;
+
+MG94custom={61,61};
+MG94custom[0][1]:=AC*R*synRate*0.10767;
+MG94custom[0][2]:=synRate*0.19375;
+MG94custom[0][3]:=AT*R*synRate*0.220455;
+MG94custom[0][4]:=AC*R*synRate*0.20142;
+MG94custom[0][8]:=R*synRate*0.150568;
+MG94custom[0][12]:=AT*R*synRate*0.261648;
+MG94custom[0][16]:=AC*R*synRate*0.189773;
+MG94custom[0][32]:=R*synRate*0.284375;
+MG94custom[1][0]:=AC*R*synRate*0.478125;
+MG94custom[1][2]:=CG*R*synRate*0.19375;
+MG94custom[1][3]:=CT*synRate*0.220455;
+MG94custom[1][5]:=AC*R*synRate*0.20142;
+MG94custom[1][9]:=R*synRate*0.150568;
+MG94custom[1][13]:=AT*R*synRate*0.261648;
+MG94custom[1][17]:=AC*R*synRate*0.189773;
+MG94custom[1][33]:=R*synRate*0.284375;
+MG94custom[1][48]:=AT*R*synRate*0.176989;
+MG94custom[2][0]:=synRate*0.478125;
+MG94custom[2][1]:=CG*R*synRate*0.10767;
+MG94custom[2][3]:=GT*R*synRate*0.220455;
+MG94custom[2][6]:=AC*R*synRate*0.20142;
+MG94custom[2][10]:=R*synRate*0.150568;
+MG94custom[2][14]:=AT*R*synRate*0.261648;
+MG94custom[2][18]:=AC*R*synRate*0.189773;
+MG94custom[2][34]:=R*synRate*0.284375;
+MG94custom[3][0]:=AT*R*synRate*0.478125;
+MG94custom[3][1]:=CT*synRate*0.10767;
+MG94custom[3][2]:=GT*R*synRate*0.19375;
+MG94custom[3][7]:=AC*R*synRate*0.20142;
+MG94custom[3][11]:=R*synRate*0.150568;
+MG94custom[3][15]:=AT*R*synRate*0.261648;
+MG94custom[3][19]:=AC*R*synRate*0.189773;
+MG94custom[3][35]:=R*synRate*0.284375;
+MG94custom[3][49]:=AT*R*synRate*0.176989;
+MG94custom[4][0]:=AC*R*synRate*0.386364;
+MG94custom[4][5]:=AC*synRate*0.10767;
+MG94custom[4][6]:=synRate*0.19375;
+MG94custom[4][7]:=AT*synRate*0.220455;
+MG94custom[4][8]:=CG*R*synRate*0.150568;
+MG94custom[4][12]:=CT*R*synRate*0.261648;
+MG94custom[4][20]:=AC*R*synRate*0.189773;
+MG94custom[4][36]:=R*synRate*0.284375;
+MG94custom[4][50]:=AT*R*synRate*0.176989;
+MG94custom[5][1]:=AC*R*synRate*0.386364;
+MG94custom[5][4]:=AC*synRate*0.478125;
+MG94custom[5][6]:=CG*synRate*0.19375;
+MG94custom[5][7]:=CT*synRate*0.220455;
+MG94custom[5][9]:=CG*R*synRate*0.150568;
+MG94custom[5][13]:=CT*R*synRate*0.261648;
+MG94custom[5][21]:=AC*R*synRate*0.189773;
+MG94custom[5][37]:=R*synRate*0.284375;
+MG94custom[5][51]:=AT*R*synRate*0.176989;
+MG94custom[6][2]:=AC*R*synRate*0.386364;
+MG94custom[6][4]:=synRate*0.478125;
+MG94custom[6][5]:=CG*synRate*0.10767;
+MG94custom[6][7]:=GT*synRate*0.220455;
+MG94custom[6][10]:=CG*R*synRate*0.150568;
+MG94custom[6][14]:=CT*R*synRate*0.261648;
+MG94custom[6][22]:=AC*R*synRate*0.189773;
+MG94custom[6][38]:=R*synRate*0.284375;
+MG94custom[6][52]:=AT*R*synRate*0.176989;
+MG94custom[7][3]:=AC*R*synRate*0.386364;
+MG94custom[7][4]:=AT*synRate*0.478125;
+MG94custom[7][5]:=CT*synRate*0.10767;
+MG94custom[7][6]:=GT*synRate*0.19375;
+MG94custom[7][11]:=CG*R*synRate*0.150568;
+MG94custom[7][15]:=CT*R*synRate*0.261648;
+MG94custom[7][23]:=AC*R*synRate*0.189773;
+MG94custom[7][39]:=R*synRate*0.284375;
+MG94custom[7][53]:=AT*R*synRate*0.176989;
+MG94custom[8][0]:=R*synRate*0.386364;
+MG94custom[8][4]:=CG*R*synRate*0.20142;
+MG94custom[8][9]:=AC*R*synRate*0.10767;
+MG94custom[8][10]:=synRate*0.19375;
+MG94custom[8][11]:=AT*R*synRate*0.220455;
+MG94custom[8][12]:=GT*R*synRate*0.261648;
+MG94custom[8][24]:=AC*synRate*0.189773;
+MG94custom[8][40]:=R*synRate*0.284375;
+MG94custom[9][1]:=R*synRate*0.386364;
+MG94custom[9][5]:=CG*R*synRate*0.20142;
+MG94custom[9][8]:=AC*R*synRate*0.478125;
+MG94custom[9][10]:=CG*R*synRate*0.19375;
+MG94custom[9][11]:=CT*synRate*0.220455;
+MG94custom[9][13]:=GT*R*synRate*0.261648;
+MG94custom[9][25]:=AC*R*synRate*0.189773;
+MG94custom[9][41]:=R*synRate*0.284375;
+MG94custom[9][54]:=AT*R*synRate*0.176989;
+MG94custom[10][2]:=R*synRate*0.386364;
+MG94custom[10][6]:=CG*R*synRate*0.20142;
+MG94custom[10][8]:=synRate*0.478125;
+MG94custom[10][9]:=CG*R*synRate*0.10767;
+MG94custom[10][11]:=GT*R*synRate*0.220455;
+MG94custom[10][14]:=GT*R*synRate*0.261648;
+MG94custom[10][26]:=AC*synRate*0.189773;
+MG94custom[10][42]:=R*synRate*0.284375;
+MG94custom[10][55]:=AT*R*synRate*0.176989;
+MG94custom[11][3]:=R*synRate*0.386364;
+MG94custom[11][7]:=CG*R*synRate*0.20142;
+MG94custom[11][8]:=AT*R*synRate*0.478125;
+MG94custom[11][9]:=CT*synRate*0.10767;
+MG94custom[11][10]:=GT*R*synRate*0.19375;
+MG94custom[11][15]:=GT*R*synRate*0.261648;
+MG94custom[11][27]:=AC*R*synRate*0.189773;
+MG94custom[11][43]:=R*synRate*0.284375;
+MG94custom[11][56]:=AT*R*synRate*0.176989;
+MG94custom[12][0]:=AT*R*synRate*0.386364;
+MG94custom[12][4]:=CT*R*synRate*0.20142;
+MG94custom[12][8]:=GT*R*synRate*0.150568;
+MG94custom[12][13]:=AC*synRate*0.10767;
+MG94custom[12][14]:=R*synRate*0.19375;
+MG94custom[12][15]:=AT*synRate*0.220455;
+MG94custom[12][28]:=AC*R*synRate*0.189773;
+MG94custom[12][44]:=R*synRate*0.284375;
+MG94custom[12][57]:=AT*R*synRate*0.176989;
+MG94custom[13][1]:=AT*R*synRate*0.386364;
+MG94custom[13][5]:=CT*R*synRate*0.20142;
+MG94custom[13][9]:=GT*R*synRate*0.150568;
+MG94custom[13][12]:=AC*synRate*0.478125;
+MG94custom[13][14]:=CG*R*synRate*0.19375;
+MG94custom[13][15]:=CT*synRate*0.220455;
+MG94custom[13][29]:=AC*R*synRate*0.189773;
+MG94custom[13][45]:=R*synRate*0.284375;
+MG94custom[13][58]:=AT*R*synRate*0.176989;
+MG94custom[14][2]:=AT*R*synRate*0.386364;
+MG94custom[14][6]:=CT*R*synRate*0.20142;
+MG94custom[14][10]:=GT*R*synRate*0.150568;
+MG94custom[14][12]:=R*synRate*0.478125;
+MG94custom[14][13]:=CG*R*synRate*0.10767;
+MG94custom[14][15]:=GT*R*synRate*0.220455;
+MG94custom[14][30]:=AC*R*synRate*0.189773;
+MG94custom[14][46]:=R*synRate*0.284375;
+MG94custom[14][59]:=AT*R*synRate*0.176989;
+MG94custom[15][3]:=AT*R*synRate*0.386364;
+MG94custom[15][7]:=CT*R*synRate*0.20142;
+MG94custom[15][11]:=GT*R*synRate*0.150568;
+MG94custom[15][12]:=AT*synRate*0.478125;
+MG94custom[15][13]:=CT*synRate*0.10767;
+MG94custom[15][14]:=GT*R*synRate*0.19375;
+MG94custom[15][31]:=AC*R*synRate*0.189773;
+MG94custom[15][47]:=R*synRate*0.284375;
+MG94custom[15][60]:=AT*R*synRate*0.176989;
+MG94custom[16][0]:=AC*R*synRate*0.348864;
+MG94custom[16][17]:=AC*R*synRate*0.10767;
+MG94custom[16][18]:=synRate*0.19375;
+MG94custom[16][19]:=AT*R*synRate*0.220455;
+MG94custom[16][20]:=AC*R*synRate*0.20142;
+MG94custom[16][24]:=R*synRate*0.150568;
+MG94custom[16][28]:=AT*R*synRate*0.261648;
+MG94custom[16][32]:=CG*R*synRate*0.284375;
+MG94custom[17][1]:=AC*R*synRate*0.348864;
+MG94custom[17][16]:=AC*R*synRate*0.478125;
+MG94custom[17][18]:=CG*R*synRate*0.19375;
+MG94custom[17][19]:=CT*synRate*0.220455;
+MG94custom[17][21]:=AC*R*synRate*0.20142;
+MG94custom[17][25]:=R*synRate*0.150568;
+MG94custom[17][29]:=AT*R*synRate*0.261648;
+MG94custom[17][33]:=CG*R*synRate*0.284375;
+MG94custom[17][48]:=CT*R*synRate*0.176989;
+MG94custom[18][2]:=AC*R*synRate*0.348864;
+MG94custom[18][16]:=synRate*0.478125;
+MG94custom[18][17]:=CG*R*synRate*0.10767;
+MG94custom[18][19]:=GT*R*synRate*0.220455;
+MG94custom[18][22]:=AC*R*synRate*0.20142;
+MG94custom[18][26]:=R*synRate*0.150568;
+MG94custom[18][30]:=AT*R*synRate*0.261648;
+MG94custom[18][34]:=CG*R*synRate*0.284375;
+MG94custom[19][3]:=AC*R*synRate*0.348864;
+MG94custom[19][16]:=AT*R*synRate*0.478125;
+MG94custom[19][17]:=CT*synRate*0.10767;
+MG94custom[19][18]:=GT*R*synRate*0.19375;
+MG94custom[19][23]:=AC*R*synRate*0.20142;
+MG94custom[19][27]:=R*synRate*0.150568;
+MG94custom[19][31]:=AT*R*synRate*0.261648;
+MG94custom[19][35]:=CG*R*synRate*0.284375;
+MG94custom[19][49]:=CT*R*synRate*0.176989;
+MG94custom[20][4]:=AC*R*synRate*0.348864;
+MG94custom[20][16]:=AC*R*synRate*0.386364;
+MG94custom[20][21]:=AC*synRate*0.10767;
+MG94custom[20][22]:=synRate*0.19375;
+MG94custom[20][23]:=AT*synRate*0.220455;
+MG94custom[20][24]:=CG*R*synRate*0.150568;
+MG94custom[20][28]:=CT*R*synRate*0.261648;
+MG94custom[20][36]:=CG*R*synRate*0.284375;
+MG94custom[20][50]:=CT*R*synRate*0.176989;
+MG94custom[21][5]:=AC*R*synRate*0.348864;
+MG94custom[21][17]:=AC*R*synRate*0.386364;
+MG94custom[21][20]:=AC*synRate*0.478125;
+MG94custom[21][22]:=CG*synRate*0.19375;
+MG94custom[21][23]:=CT*synRate*0.220455;
+MG94custom[21][25]:=CG*R*synRate*0.150568;
+MG94custom[21][29]:=CT*R*synRate*0.261648;
+MG94custom[21][37]:=CG*R*synRate*0.284375;
+MG94custom[21][51]:=CT*R*synRate*0.176989;
+MG94custom[22][6]:=AC*R*synRate*0.348864;
+MG94custom[22][18]:=AC*R*synRate*0.386364;
+MG94custom[22][20]:=synRate*0.478125;
+MG94custom[22][21]:=CG*synRate*0.10767;
+MG94custom[22][23]:=GT*synRate*0.220455;
+MG94custom[22][26]:=CG*R*synRate*0.150568;
+MG94custom[22][30]:=CT*R*synRate*0.261648;
+MG94custom[22][38]:=CG*R*synRate*0.284375;
+MG94custom[22][52]:=CT*R*synRate*0.176989;
+MG94custom[23][7]:=AC*R*synRate*0.348864;
+MG94custom[23][19]:=AC*R*synRate*0.386364;
+MG94custom[23][20]:=AT*synRate*0.478125;
+MG94custom[23][21]:=CT*synRate*0.10767;
+MG94custom[23][22]:=GT*synRate*0.19375;
+MG94custom[23][27]:=CG*R*synRate*0.150568;
+MG94custom[23][31]:=CT*R*synRate*0.261648;
+MG94custom[23][39]:=CG*R*synRate*0.284375;
+MG94custom[23][53]:=CT*R*synRate*0.176989;
+MG94custom[24][8]:=AC*synRate*0.348864;
+MG94custom[24][16]:=R*synRate*0.386364;
+MG94custom[24][20]:=CG*R*synRate*0.20142;
+MG94custom[24][25]:=AC*synRate*0.10767;
+MG94custom[24][26]:=synRate*0.19375;
+MG94custom[24][27]:=AT*synRate*0.220455;
+MG94custom[24][28]:=GT*R*synRate*0.261648;
+MG94custom[24][40]:=CG*R*synRate*0.284375;
+MG94custom[25][9]:=AC*R*synRate*0.348864;
+MG94custom[25][17]:=R*synRate*0.386364;
+MG94custom[25][21]:=CG*R*synRate*0.20142;
+MG94custom[25][24]:=AC*synRate*0.478125;
+MG94custom[25][26]:=CG*synRate*0.19375;
+MG94custom[25][27]:=CT*synRate*0.220455;
+MG94custom[25][29]:=GT*R*synRate*0.261648;
+MG94custom[25][41]:=CG*R*synRate*0.284375;
+MG94custom[25][54]:=CT*R*synRate*0.176989;
+MG94custom[26][10]:=AC*synRate*0.348864;
+MG94custom[26][18]:=R*synRate*0.386364;
+MG94custom[26][22]:=CG*R*synRate*0.20142;
+MG94custom[26][24]:=synRate*0.478125;
+MG94custom[26][25]:=CG*synRate*0.10767;
+MG94custom[26][27]:=GT*synRate*0.220455;
+MG94custom[26][30]:=GT*R*synRate*0.261648;
+MG94custom[26][42]:=CG*R*synRate*0.284375;
+MG94custom[26][55]:=CT*R*synRate*0.176989;
+MG94custom[27][11]:=AC*R*synRate*0.348864;
+MG94custom[27][19]:=R*synRate*0.386364;
+MG94custom[27][23]:=CG*R*synRate*0.20142;
+MG94custom[27][24]:=AT*synRate*0.478125;
+MG94custom[27][25]:=CT*synRate*0.10767;
+MG94custom[27][26]:=GT*synRate*0.19375;
+MG94custom[27][31]:=GT*R*synRate*0.261648;
+MG94custom[27][43]:=CG*R*synRate*0.284375;
+MG94custom[27][56]:=CT*R*synRate*0.176989;
+MG94custom[28][12]:=AC*R*synRate*0.348864;
+MG94custom[28][16]:=AT*R*synRate*0.386364;
+MG94custom[28][20]:=CT*R*synRate*0.20142;
+MG94custom[28][24]:=GT*R*synRate*0.150568;
+MG94custom[28][29]:=AC*synRate*0.10767;
+MG94custom[28][30]:=synRate*0.19375;
+MG94custom[28][31]:=AT*synRate*0.220455;
+MG94custom[28][44]:=CG*R*synRate*0.284375;
+MG94custom[28][57]:=CT*synRate*0.176989;
+MG94custom[29][13]:=AC*R*synRate*0.348864;
+MG94custom[29][17]:=AT*R*synRate*0.386364;
+MG94custom[29][21]:=CT*R*synRate*0.20142;
+MG94custom[29][25]:=GT*R*synRate*0.150568;
+MG94custom[29][28]:=AC*synRate*0.478125;
+MG94custom[29][30]:=CG*synRate*0.19375;
+MG94custom[29][31]:=CT*synRate*0.220455;
+MG94custom[29][45]:=CG*R*synRate*0.284375;
+MG94custom[29][58]:=CT*R*synRate*0.176989;
+MG94custom[30][14]:=AC*R*synRate*0.348864;
+MG94custom[30][18]:=AT*R*synRate*0.386364;
+MG94custom[30][22]:=CT*R*synRate*0.20142;
+MG94custom[30][26]:=GT*R*synRate*0.150568;
+MG94custom[30][28]:=synRate*0.478125;
+MG94custom[30][29]:=CG*synRate*0.10767;
+MG94custom[30][31]:=GT*synRate*0.220455;
+MG94custom[30][46]:=CG*R*synRate*0.284375;
+MG94custom[30][59]:=CT*synRate*0.176989;
+MG94custom[31][15]:=AC*R*synRate*0.348864;
+MG94custom[31][19]:=AT*R*synRate*0.386364;
+MG94custom[31][23]:=CT*R*synRate*0.20142;
+MG94custom[31][27]:=GT*R*synRate*0.150568;
+MG94custom[31][28]:=AT*synRate*0.478125;
+MG94custom[31][29]:=CT*synRate*0.10767;
+MG94custom[31][30]:=GT*synRate*0.19375;
+MG94custom[31][47]:=CG*R*synRate*0.284375;
+MG94custom[31][60]:=CT*R*synRate*0.176989;
+MG94custom[32][0]:=R*synRate*0.348864;
+MG94custom[32][16]:=CG*R*synRate*0.189773;
+MG94custom[32][33]:=AC*R*synRate*0.10767;
+MG94custom[32][34]:=synRate*0.19375;
+MG94custom[32][35]:=AT*R*synRate*0.220455;
+MG94custom[32][36]:=AC*R*synRate*0.20142;
+MG94custom[32][40]:=R*synRate*0.150568;
+MG94custom[32][44]:=AT*R*synRate*0.261648;
+MG94custom[33][1]:=R*synRate*0.348864;
+MG94custom[33][17]:=CG*R*synRate*0.189773;
+MG94custom[33][32]:=AC*R*synRate*0.478125;
+MG94custom[33][34]:=CG*R*synRate*0.19375;
+MG94custom[33][35]:=CT*synRate*0.220455;
+MG94custom[33][37]:=AC*R*synRate*0.20142;
+MG94custom[33][41]:=R*synRate*0.150568;
+MG94custom[33][45]:=AT*R*synRate*0.261648;
+MG94custom[33][48]:=GT*R*synRate*0.176989;
+MG94custom[34][2]:=R*synRate*0.348864;
+MG94custom[34][18]:=CG*R*synRate*0.189773;
+MG94custom[34][32]:=synRate*0.478125;
+MG94custom[34][33]:=CG*R*synRate*0.10767;
+MG94custom[34][35]:=GT*R*synRate*0.220455;
+MG94custom[34][38]:=AC*R*synRate*0.20142;
+MG94custom[34][42]:=R*synRate*0.150568;
+MG94custom[34][46]:=AT*R*synRate*0.261648;
+MG94custom[35][3]:=R*synRate*0.348864;
+MG94custom[35][19]:=CG*R*synRate*0.189773;
+MG94custom[35][32]:=AT*R*synRate*0.478125;
+MG94custom[35][33]:=CT*synRate*0.10767;
+MG94custom[35][34]:=GT*R*synRate*0.19375;
+MG94custom[35][39]:=AC*R*synRate*0.20142;
+MG94custom[35][43]:=R*synRate*0.150568;
+MG94custom[35][47]:=AT*R*synRate*0.261648;
+MG94custom[35][49]:=GT*R*synRate*0.176989;
+MG94custom[36][4]:=R*synRate*0.348864;
+MG94custom[36][20]:=CG*R*synRate*0.189773;
+MG94custom[36][32]:=AC*R*synRate*0.386364;
+MG94custom[36][37]:=AC*synRate*0.10767;
+MG94custom[36][38]:=synRate*0.19375;
+MG94custom[36][39]:=AT*synRate*0.220455;
+MG94custom[36][40]:=CG*R*synRate*0.150568;
+MG94custom[36][44]:=CT*R*synRate*0.261648;
+MG94custom[36][50]:=GT*R*synRate*0.176989;
+MG94custom[37][5]:=R*synRate*0.348864;
+MG94custom[37][21]:=CG*R*synRate*0.189773;
+MG94custom[37][33]:=AC*R*synRate*0.386364;
+MG94custom[37][36]:=AC*synRate*0.478125;
+MG94custom[37][38]:=CG*synRate*0.19375;
+MG94custom[37][39]:=CT*synRate*0.220455;
+MG94custom[37][41]:=CG*R*synRate*0.150568;
+MG94custom[37][45]:=CT*R*synRate*0.261648;
+MG94custom[37][51]:=GT*R*synRate*0.176989;
+MG94custom[38][6]:=R*synRate*0.348864;
+MG94custom[38][22]:=CG*R*synRate*0.189773;
+MG94custom[38][34]:=AC*R*synRate*0.386364;
+MG94custom[38][36]:=synRate*0.478125;
+MG94custom[38][37]:=CG*synRate*0.10767;
+MG94custom[38][39]:=GT*synRate*0.220455;
+MG94custom[38][42]:=CG*R*synRate*0.150568;
+MG94custom[38][46]:=CT*R*synRate*0.261648;
+MG94custom[38][52]:=GT*R*synRate*0.176989;
+MG94custom[39][7]:=R*synRate*0.348864;
+MG94custom[39][23]:=CG*R*synRate*0.189773;
+MG94custom[39][35]:=AC*R*synRate*0.386364;
+MG94custom[39][36]:=AT*synRate*0.478125;
+MG94custom[39][37]:=CT*synRate*0.10767;
+MG94custom[39][38]:=GT*synRate*0.19375;
+MG94custom[39][43]:=CG*R*synRate*0.150568;
+MG94custom[39][47]:=CT*R*synRate*0.261648;
+MG94custom[39][53]:=GT*R*synRate*0.176989;
+MG94custom[40][8]:=R*synRate*0.348864;
+MG94custom[40][24]:=CG*R*synRate*0.189773;
+MG94custom[40][32]:=R*synRate*0.386364;
+MG94custom[40][36]:=CG*R*synRate*0.20142;
+MG94custom[40][41]:=AC*synRate*0.10767;
+MG94custom[40][42]:=synRate*0.19375;
+MG94custom[40][43]:=AT*synRate*0.220455;
+MG94custom[40][44]:=GT*R*synRate*0.261648;
+MG94custom[41][9]:=R*synRate*0.348864;
+MG94custom[41][25]:=CG*R*synRate*0.189773;
+MG94custom[41][33]:=R*synRate*0.386364;
+MG94custom[41][37]:=CG*R*synRate*0.20142;
+MG94custom[41][40]:=AC*synRate*0.478125;
+MG94custom[41][42]:=CG*synRate*0.19375;
+MG94custom[41][43]:=CT*synRate*0.220455;
+MG94custom[41][45]:=GT*R*synRate*0.261648;
+MG94custom[41][54]:=GT*R*synRate*0.176989;
+MG94custom[42][10]:=R*synRate*0.348864;
+MG94custom[42][26]:=CG*R*synRate*0.189773;
+MG94custom[42][34]:=R*synRate*0.386364;
+MG94custom[42][38]:=CG*R*synRate*0.20142;
+MG94custom[42][40]:=synRate*0.478125;
+MG94custom[42][41]:=CG*synRate*0.10767;
+MG94custom[42][43]:=GT*synRate*0.220455;
+MG94custom[42][46]:=GT*R*synRate*0.261648;
+MG94custom[42][55]:=GT*R*synRate*0.176989;
+MG94custom[43][11]:=R*synRate*0.348864;
+MG94custom[43][27]:=CG*R*synRate*0.189773;
+MG94custom[43][35]:=R*synRate*0.386364;
+MG94custom[43][39]:=CG*R*synRate*0.20142;
+MG94custom[43][40]:=AT*synRate*0.478125;
+MG94custom[43][41]:=CT*synRate*0.10767;
+MG94custom[43][42]:=GT*synRate*0.19375;
+MG94custom[43][47]:=GT*R*synRate*0.261648;
+MG94custom[43][56]:=GT*R*synRate*0.176989;
+MG94custom[44][12]:=R*synRate*0.348864;
+MG94custom[44][28]:=CG*R*synRate*0.189773;
+MG94custom[44][32]:=AT*R*synRate*0.386364;
+MG94custom[44][36]:=CT*R*synRate*0.20142;
+MG94custom[44][40]:=GT*R*synRate*0.150568;
+MG94custom[44][45]:=AC*synRate*0.10767;
+MG94custom[44][46]:=synRate*0.19375;
+MG94custom[44][47]:=AT*synRate*0.220455;
+MG94custom[44][57]:=GT*R*synRate*0.176989;
+MG94custom[45][13]:=R*synRate*0.348864;
+MG94custom[45][29]:=CG*R*synRate*0.189773;
+MG94custom[45][33]:=AT*R*synRate*0.386364;
+MG94custom[45][37]:=CT*R*synRate*0.20142;
+MG94custom[45][41]:=GT*R*synRate*0.150568;
+MG94custom[45][44]:=AC*synRate*0.478125;
+MG94custom[45][46]:=CG*synRate*0.19375;
+MG94custom[45][47]:=CT*synRate*0.220455;
+MG94custom[45][58]:=GT*R*synRate*0.176989;
+MG94custom[46][14]:=R*synRate*0.348864;
+MG94custom[46][30]:=CG*R*synRate*0.189773;
+MG94custom[46][34]:=AT*R*synRate*0.386364;
+MG94custom[46][38]:=CT*R*synRate*0.20142;
+MG94custom[46][42]:=GT*R*synRate*0.150568;
+MG94custom[46][44]:=synRate*0.478125;
+MG94custom[46][45]:=CG*synRate*0.10767;
+MG94custom[46][47]:=GT*synRate*0.220455;
+MG94custom[46][59]:=GT*R*synRate*0.176989;
+MG94custom[47][15]:=R*synRate*0.348864;
+MG94custom[47][31]:=CG*R*synRate*0.189773;
+MG94custom[47][35]:=AT*R*synRate*0.386364;
+MG94custom[47][39]:=CT*R*synRate*0.20142;
+MG94custom[47][43]:=GT*R*synRate*0.150568;
+MG94custom[47][44]:=AT*synRate*0.478125;
+MG94custom[47][45]:=CT*synRate*0.10767;
+MG94custom[47][46]:=GT*synRate*0.19375;
+MG94custom[47][60]:=GT*R*synRate*0.176989;
+MG94custom[48][1]:=AT*R*synRate*0.348864;
+MG94custom[48][17]:=CT*R*synRate*0.189773;
+MG94custom[48][33]:=GT*R*synRate*0.284375;
+MG94custom[48][49]:=CT*synRate*0.220455;
+MG94custom[48][51]:=AC*R*synRate*0.20142;
+MG94custom[48][54]:=R*synRate*0.150568;
+MG94custom[48][58]:=AT*R*synRate*0.261648;
+MG94custom[49][3]:=AT*R*synRate*0.348864;
+MG94custom[49][19]:=CT*R*synRate*0.189773;
+MG94custom[49][35]:=GT*R*synRate*0.284375;
+MG94custom[49][48]:=CT*synRate*0.10767;
+MG94custom[49][53]:=AC*R*synRate*0.20142;
+MG94custom[49][56]:=R*synRate*0.150568;
+MG94custom[49][60]:=AT*R*synRate*0.261648;
+MG94custom[50][4]:=AT*R*synRate*0.348864;
+MG94custom[50][20]:=CT*R*synRate*0.189773;
+MG94custom[50][36]:=GT*R*synRate*0.284375;
+MG94custom[50][51]:=AC*synRate*0.10767;
+MG94custom[50][52]:=synRate*0.19375;
+MG94custom[50][53]:=AT*synRate*0.220455;
+MG94custom[50][57]:=CT*R*synRate*0.261648;
+MG94custom[51][5]:=AT*R*synRate*0.348864;
+MG94custom[51][21]:=CT*R*synRate*0.189773;
+MG94custom[51][37]:=GT*R*synRate*0.284375;
+MG94custom[51][48]:=AC*R*synRate*0.386364;
+MG94custom[51][50]:=AC*synRate*0.478125;
+MG94custom[51][52]:=CG*synRate*0.19375;
+MG94custom[51][53]:=CT*synRate*0.220455;
+MG94custom[51][54]:=CG*R*synRate*0.150568;
+MG94custom[51][58]:=CT*R*synRate*0.261648;
+MG94custom[52][6]:=AT*R*synRate*0.348864;
+MG94custom[52][22]:=CT*R*synRate*0.189773;
+MG94custom[52][38]:=GT*R*synRate*0.284375;
+MG94custom[52][50]:=synRate*0.478125;
+MG94custom[52][51]:=CG*synRate*0.10767;
+MG94custom[52][53]:=GT*synRate*0.220455;
+MG94custom[52][55]:=CG*R*synRate*0.150568;
+MG94custom[52][59]:=CT*R*synRate*0.261648;
+MG94custom[53][7]:=AT*R*synRate*0.348864;
+MG94custom[53][23]:=CT*R*synRate*0.189773;
+MG94custom[53][39]:=GT*R*synRate*0.284375;
+MG94custom[53][49]:=AC*R*synRate*0.386364;
+MG94custom[53][50]:=AT*synRate*0.478125;
+MG94custom[53][51]:=CT*synRate*0.10767;
+MG94custom[53][52]:=GT*synRate*0.19375;
+MG94custom[53][56]:=CG*R*synRate*0.150568;
+MG94custom[53][60]:=CT*R*synRate*0.261648;
+MG94custom[54][9]:=AT*R*synRate*0.348864;
+MG94custom[54][25]:=CT*R*synRate*0.189773;
+MG94custom[54][41]:=GT*R*synRate*0.284375;
+MG94custom[54][48]:=R*synRate*0.386364;
+MG94custom[54][51]:=CG*R*synRate*0.20142;
+MG94custom[54][55]:=CG*R*synRate*0.19375;
+MG94custom[54][56]:=CT*synRate*0.220455;
+MG94custom[54][58]:=GT*R*synRate*0.261648;
+MG94custom[55][10]:=AT*R*synRate*0.348864;
+MG94custom[55][26]:=CT*R*synRate*0.189773;
+MG94custom[55][42]:=GT*R*synRate*0.284375;
+MG94custom[55][52]:=CG*R*synRate*0.20142;
+MG94custom[55][54]:=CG*R*synRate*0.10767;
+MG94custom[55][56]:=GT*R*synRate*0.220455;
+MG94custom[55][59]:=GT*R*synRate*0.261648;
+MG94custom[56][11]:=AT*R*synRate*0.348864;
+MG94custom[56][27]:=CT*R*synRate*0.189773;
+MG94custom[56][43]:=GT*R*synRate*0.284375;
+MG94custom[56][49]:=R*synRate*0.386364;
+MG94custom[56][53]:=CG*R*synRate*0.20142;
+MG94custom[56][54]:=CT*synRate*0.10767;
+MG94custom[56][55]:=GT*R*synRate*0.19375;
+MG94custom[56][60]:=GT*R*synRate*0.261648;
+MG94custom[57][12]:=AT*R*synRate*0.348864;
+MG94custom[57][28]:=CT*synRate*0.189773;
+MG94custom[57][44]:=GT*R*synRate*0.284375;
+MG94custom[57][50]:=CT*R*synRate*0.20142;
+MG94custom[57][58]:=AC*R*synRate*0.10767;
+MG94custom[57][59]:=synRate*0.19375;
+MG94custom[57][60]:=AT*R*synRate*0.220455;
+MG94custom[58][13]:=AT*R*synRate*0.348864;
+MG94custom[58][29]:=CT*R*synRate*0.189773;
+MG94custom[58][45]:=GT*R*synRate*0.284375;
+MG94custom[58][48]:=AT*R*synRate*0.386364;
+MG94custom[58][51]:=CT*R*synRate*0.20142;
+MG94custom[58][54]:=GT*R*synRate*0.150568;
+MG94custom[58][57]:=AC*R*synRate*0.478125;
+MG94custom[58][59]:=CG*R*synRate*0.19375;
+MG94custom[58][60]:=CT*synRate*0.220455;
+MG94custom[59][14]:=AT*R*synRate*0.348864;
+MG94custom[59][30]:=CT*synRate*0.189773;
+MG94custom[59][46]:=GT*R*synRate*0.284375;
+MG94custom[59][52]:=CT*R*synRate*0.20142;
+MG94custom[59][55]:=GT*R*synRate*0.150568;
+MG94custom[59][57]:=synRate*0.478125;
+MG94custom[59][58]:=CG*R*synRate*0.10767;
+MG94custom[59][60]:=GT*R*synRate*0.220455;
+MG94custom[60][15]:=AT*R*synRate*0.348864;
+MG94custom[60][31]:=CT*R*synRate*0.189773;
+MG94custom[60][47]:=GT*R*synRate*0.284375;
+MG94custom[60][49]:=AT*R*synRate*0.386364;
+MG94custom[60][53]:=CT*R*synRate*0.20142;
+MG94custom[60][56]:=GT*R*synRate*0.150568;
+MG94custom[60][57]:=AT*R*synRate*0.478125;
+MG94custom[60][58]:=CT*synRate*0.10767;
+MG94custom[60][59]:=GT*R*synRate*0.19375;
+
+vectorOfFrequencies={
+{   0.0684634387476}
+{   0.0154174945249}
+{   0.0277433542637}
+{   0.0315672183411}
+{   0.0356916015236}
+{  0.00803750266039}
+{   0.0144632633625}
+{   0.0164567336793}
+{   0.0266806048061}
+{  0.00600828830748}
+{   0.0108117483528}
+{   0.0123019306771}
+{    0.046363843446}
+{   0.0104408179834}
+{   0.0187879627036}
+{   0.0213775059501}
+{   0.0372423266151}
+{  0.00838671526271}
+{   0.0150916617656}
+{   0.0171717441791}
+{   0.0194153011545}
+{  0.00437219200093}
+{  0.00786763837634}
+{  0.00895203428158}
+{   0.0145135537544}
+{   0.0032683522715}
+{  0.00588130936454}
+{  0.00669192971684}
+{   0.0252207226563}
+{  0.00567953290953}
+{   0.0102201621222}
+{   0.0116288061683}
+{   0.0558077379368}
+{   0.0125675179311}
+{   0.0226149003404}
+{   0.0257319100647}
+{   0.0290938869097}
+{  0.00655174280379}
+{   0.0117896796627}
+{   0.0134146501734}
+{   0.0217486037548}
+{  0.00489763566432}
+{  0.00881315969148}
+{   0.0100278767164}
+{   0.0377933284116}
+{  0.00851079706952}
+{   0.0153149435393}
+{     0.01742580086}
+{  0.00782174192914}
+{   0.0160149650053}
+{   0.0181073841606}
+{  0.00407765810865}
+{  0.00733763279709}
+{  0.00834897807998}
+{  0.00304817884003}
+{  0.00548511337442}
+{  0.00624112606825}
+{   0.0235217218785}
+{  0.00529692964466}
+{  0.00953167814686}
+{   0.0108454285073}
+}
+;
+
+Model MG94customModel=(MG94custom,vectorOfFrequencies,0);
+
+UseModel (MG94customModel);
+Tree givenTree=(((D_CD_83_ELI_ACC_K03454,D_CD_83_NDK_ACC_M27323)Node3,D_UG_94_94UG114_ACC_U88824)Node2,D_CD_84_84ZR085_ACC_U88822,(B_US_83_RF_ACC_M17451,((B_FR_83_HXB2_ACC_K03455,B_US_86_JRFL_ACC_U63632)Node11,B_US_90_WEAU160_ACC_U21135)Node10)Node8);
+
+DataSet ds = ReadDataFile(USE_NEXUS_FILE_DATA);
+DataSetFilter filteredData = CreateFilter(ds,3,"0-1319","4,5,7,6,1,0,2,3","TAA,TAG,TGA");
+LikelihoodFunction lf = (filteredData,givenTree);
+
+
+
+END;
diff --git a/tests/hbltests/UnitTests/HBLCommands/res/test_likefunc2.nex b/tests/hbltests/UnitTests/HBLCommands/res/test_likefunc2.nex
new file mode 100644
index 0000000..734f2cf
--- /dev/null
+++ b/tests/hbltests/UnitTests/HBLCommands/res/test_likefunc2.nex
@@ -0,0 +1,1484 @@
+#NEXUS
+
+BEGIN TAXA;
+	DIMENSIONS NTAX = 349;
+	TAXLABELS
+		'AG207_796' 'IN1_1196' 'PARIS8395' 'TIANJIN3392' 'AG601_796' 'LA5_1195' 'SH19_896' 'VAL_491' 'NCH813_895' 'TD4796' 'DE3_1195' 'NY43_1196' 'TD5096' 'FL4_1195' 'PARIS36395' 'TD5196' 'HK434_1096' 'YOKOHAMA7392' 'HEBEI1293' 'AG39_796' 'FUJIAN133_596' 'NY37_1096' 'AUC10896_97' 'GD1_396' 'NY50_1196' 'AUC5_697' 'NY55_1296' 'PA2_297' 'BE17_197' 'GNX189_796' 'PR1_797' 'BE24496_197' 'GQ1014_1096' 'RI7_397' 'BE62_297' 'GZH66_497' 'SAITAMA8096_97' 'BK197' 'HAR3_1296' 'SANTAFE208_896' 'BR184_696' ' [...]
+END;
+
+BEGIN CHARACTERS;
+	DIMENSIONS NCHAR = 329;
+	FORMAT
+		DATATYPE = PROTEIN
+		GAP=-
+		MISSING=?
+	;
+
+MATRIX
+	'AG207_796'        QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFNNESFNWTGVAQNGTSYACKRGSIKSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPITDSEQTSLYVQASGRVTVSTKRSQQTVIPNIGYRPWVRGVSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRSGKSSIMRSDAPIGNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'IN1_1196'         QKLPGNDNSTATLCLGHHTVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDGPHQILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFTNESFNWTGVAQNGTSYACKRGSVKSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYVQSSGRVTVSTKRSQQTVTPNIGSRPWVRGVSSIISIYWTIVKPGDILLINSTGNLIAPRGYFKIRKGKSSIMRSDAPIDNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'PARIS8395'        QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSPTGRICDSPHRILDGKNCTLIDALLGDPHCDGFENKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINENFNWTGVAQDGKSYACKRGSVNSFFSRLNWLHKLDYKYPALNVTMPNNGKFDKLYIWGVHHPSTDSDQTSLYVRSSGRVTVSTKRSQQTVIPDIGYRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKLRNGKSSIMRSDAPIGNCSSGCITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'TIANJIN3392'      QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQDGGSYACKRGSVNSFFSRLNWLHKSEYKYPALNVTMPNNGKFDKLYIWGVHHPSTDSDQTSLYVRASGRVTVSTKRSQQTVTPNIGSRPWVRGQSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'AG601_796'        QKLPGNDNSTATLCLGRHAVRNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFNNESFNWTGVAQNGTSYACKRGSIKSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPITDSEQTSLYVQASGRVTVSTKRSQQTVIPNIGYGPWVRGVSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRSGKSSIMRSDAPIGNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'LA5_1195'         QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFTNEGFNWTGVAQDGKSYSCKRGSVNSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGISSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIDNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVNQNTLKLATGMRDVPEKQTR
+	'SH19_896'         QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFNNESFNWTGVAQNGTSYACKRRSVKSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTRIYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGVSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRSGKSSIMRSDAPIGNCKSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'VAL_491'          QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNEKWDLFVERGKAFSNCYPYDVPDYASLRSLVASSGTLEFINEGFNWTGVTQSGGSAACKRGSVNSFFSRLNWLYESESKYPALNVTMPNNGKFDKLYIWGVHHPSTDKEQTNLYVRASGRVTVSTKRSQQTVIPNIGPRPWVRGLSSRISIYWTIVKPGDILLISSTGNLIAPRGYFKIHTGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNKITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'NCH813_895'       QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIGVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEGFNWTGVAQDGTSYACKRGSVKSFFSRLNWLHKLEDKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGISSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRSGKSSIMRSDAPIGNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'TD4796'           QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFNNESFNWTGVAQNGTSYACKRRSVKSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPITDSEQTSLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGVSSRISIYWTIVKPGDILLISSTGNLIAPRGYFKIRSGKSSIMRSDAPIGNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPQKLTR
+	'DE3_1195'         QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFTNEGFNWTGVAQDGKSYACKRGSVNSFFSRLNWLHKLEYKYPELNVTMPNNSKFDKLYIWGVHHPSTDSDQTSLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGISSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIDNCNSECITPNGSIPNDKPFQNVNRITYGSCPRYVNQNTLKLATGMRNVPEKQTR
+	'NY43_1196'        QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHQILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSTAYSNCYPYDVPDYASLRSLVASSGTLEFTKEGFNWTGVAQDGTSYACKRGSVKSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGISSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRGGKSSIMRSDAPIDNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'TD5096'           QKLPGNDNSTATLCLGHHAVPNGTLVRTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFNNESFNWTGVAQNGTSYACKRRSVKSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGVSSIISIYWTIVKPGDILLINSTGNLIAPRGYFKIRSGKSSIMRSDAPIDNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'FL4_1195'         QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFTNEGFNWTGVAQDGKSYACKRGSVNSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGISSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIDNCNSECITPDGSIPNDKPFQNVNRITYGACPRYVNQNTLKLATGMRGVPEKQTR
+	'PARIS36395'       QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSPTGRICDSPHRILDGKNCTLIDALLGDPHCDGFKNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINENFNWTGVAQDGKSYACKRGSVNSFFSRLNWLHKLDYKYPALNVTMPNNGKFDKLYIWGVHHPSTDSDQTSLYVRSSGRVTVSTKRSQQTVIPDIGYRPWVRGQSSRISIYWTIVKPGDILLIHSTGNLIAPRGYFKIRNGKSSIMRSDAPIGNCSSGCITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'TD5196'           QRLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFNNESFNWTGVAQNGTSYACKRRSVKSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYVQASGRVTVSTKRSQQTVIPNIGTRPWVRGVSSIISIYWTIVKPGDILLINSTGNLIAPRGYFKIRSGKSSIMRSDAPIDNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'HK434_1096'       QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSPTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINENFNWTGVAQDGKSYACKRGSVNSFFSRLNWLHKLEYKYPALNVTMPNNGKFDKLYIWGVHHPSTDSDQTSLYVRASGRVTVSTKRSQQTVIPDIGYRPWVRGQSSRIGIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIGNCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'YOKOHAMA7392'     QKLPGNGNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQDGGSYACKRGSVNSFFSRLNWLHKLEYKYPALNVTMPNNGKFDKLYIWGVHHPSTDSDQTSLYVRASGRVTVSTKRSQQTVTPNIGSRPWVRGQSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIGKCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'HEBEI1293'        QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQDGGSYACKRGSVNSFFSRLNWLHKLEYKYPALNVTMPNNGKFDKLYIWGVHHPSTDSVQTSLYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGQSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIGNCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'AG39_796'         QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFNNESFNWTGVAQNGTSYACKRRSVKSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGVSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRSGKSSIMRSDAPIGNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'FUJIAN133_596'    QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFNNESFNWTGVAQNGTSYACKRGSVKSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSIYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGVSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRSGKSSIMRSDAPIGNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'NY37_1096'        QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFTNEGFNWTGVAQDGTSYACKRGSVKSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGVSSIISIYWTIVKPGDILLINSTGNLIAPRGYFKIRSGKSSIMRSDAPIDNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'AUC10896_97'      QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSDCYPYDVPDYASLRSLVASSGTLEFTNEGFNWTGVAQDGTSYACKRGSVKSFFSRLNWLHK--YKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYVQASGRVTVSTKRSQQTVIPNIGYRPWVRGISSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRSGKSSIMRSDAPIGNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'GD1_396'          QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDGPHRILDGKNCTLIDALLGDPLCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFTNESFNWTGVAQNGTSYACKRGSVKSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTRLYVQSSGRVTVSTKRSQQTVIPNIGSRPWVRGISSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRSGKSSIMRSDAPIDNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'NY50_1196'        QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHQILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSTAYSNCYPYDVPDYASLRSLVASSGTLEFTKEGFNWTGVAQDGTSYACKRGSVKSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGISSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRSGKSSIMRSDAPIDNCNSECISPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'AUC5_697'         QKIPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGENCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFNNESFNWTGVAQNGTSYACKRRSIKSFFSRLNWLHQLKYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYAQASGRVTVSTKRSQQTVIPNIGSRPWVRGVSSGISIYWTIVKPGDILLINSTGNLIAPRGYFKIRSGKSSIMRSDAPIGKCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'NY55_1296'        QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQNSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFNNESFNWTGVAQNGTSYACKRRSVKSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGVSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRSGKSSIMRSDAPIGNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'PA2_297'          QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFKNKEWDLFVERSTAYSNCYPYDVPDYASLRSLVASSGTLEFTNEGFNWTGVAQDGTSYACKRGSVKSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGVSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRSGKSSIMRSDAPIDNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'BE17_197'         QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGIICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLIASSGTLEFNNESFNWTGVAQNGTSYACKRRSVKSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYAQASGRVTVSTKRSQQTVIPNIGSRPWVRGVSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRSGKSSIMRSDAPIGNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'GNX189_796'       QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFNNESFNWTGVAQNGTSYACKRRSVKSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPITDSEQTSLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGVSSRISIYWTIVKPGDILLISSTGNLIAPRGYFKIRSGKSSIMRSDAPIGNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'PR1_797'          QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGENCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFNNESFNWTGVAQNGTSYACKRRSIKSFFSRLNWLHQLKYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYAQASGRVTVSTKRSQQTVIPNIGSRPWVRGVSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRSGKSSIMRSDAPIGKCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'BE24496_197'      QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFNNESFNWTGVSQNGTSYACKRRSVKSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTRLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGISSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRSGKSSIMRSDAPIDNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'GQ1014_1096'      QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSTAYSNCYPYDVPDYASLRSLVASSGTLEFTNEGFNWTGVAQNGTSYACKRGSVKSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGISSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRSGKSSIMRSDAPIDNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'RI7_397'          QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERNKAYSNCYPYDVPDYASLRSLVASSGTLEFTNEGFNWTGVAQNGTSYACKRGSVKSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSIYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGVSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRSGKSSIMRSDAPIGNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'BE62_297'         QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGIICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFNNESFNWTGVAQNGTSYACKRRSVKSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYAQASGRVTVSTKRSQQTVIPNIGSRPWVRGISSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRSGKSSIMRSDAPIGNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'GZH66_497'        QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSDCYPYDVPDYASLRSLVASSGTLEFTNEGFNWTGVAQDGTSYACKRGSVNSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGVSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIDNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'SAITAMA8096_97'   QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFNNESFNWTGVAQNGTSYACKRRSVKSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYAQASGRVTVSTKRSQQTVIPNIGSRPWVRGVSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRSGKSSIMRSDAPIGKCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'BK197'            QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGKICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSDCYPYDVPDYASLRSLVASSGTLEFTKEGFNWPGVAQDGTSYACKRGSVKSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGISSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRSGKSSIMRSDTPIDNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'HAR3_1296'        QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFNNESFNWTGVSQNGTSYACKRRSVKSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGISSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRSGKSSIMRSDAPIDNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'SANTAFE208_896'   QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFNNESFNWTGVAQNGTSYACKRGSVKSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSIYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGISSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRSGKSSIMRSDAPIGNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQTTLKLATGMRNVPEKQTR
+	'BR184_696'        QKLPGNDNSTATLCLGHHAVPNGTLVKTITNEQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDDFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFTKEGFNWTGVAQDGKSYACKRGSVNSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGISSRISIYWTIVKPGDLLLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIGNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'SAUS54_797'       QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGENCTLIDALLGDLHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFNNESFNWTGVAQNGTSYACKRRSIKSFFSRLNWLHQLKYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYAQASGRVTVSTKRSQQTVIPNIGSRPWVRGVSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRSGKSSIMRSDAPIGKCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'BR309_796'        QKLPGNDNSTATLCLGHHAVPNGTLVKTITSDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFTNEGFNWTGVAQDGTSYACKRGSVKGFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYVQTSGRVTVSTKRSQQTVIPNIGSRPWVRGVSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRSGKSSIMRSDAPIDNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'HI1_997'          QKIPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSFSTGRICDSPHRILDGENCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFNNESFNWTGVAQNGTSYACKRRSIKSFFSRLNWLHQLKYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYAQASGRVTVSTKRSQQTVIPNIGSGPWVRGVSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRSGKSSIMRSDAPIGKCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'BR3_496'          QKIPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDDFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFTKEGFNWTGVAQDGKSYACKRGSVNSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGISSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAHIGNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'HK358_796'        QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGKICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFNNESFNWTGVAQNGTSYACKRGSVKSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGVSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRSGKSSIMRSDAPIGNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'SHZH157_796'      QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFNNESFNWIGVAQNGTSSACKRRSVKSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGISSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRSGKSSIMRSDAPIGNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'BR43_697'         QKLPGNDNSTATLCLGHHAVPNGTLVKTITSDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFTNEGFNWTGVAQNGTSYACKRGSVKGFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYVWGFHHPSTDSDQTSLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGVSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRSGKSSIMRSDAPIDNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'HK387_797'        QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGENCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFNNESFNWTGVAQNGTSYACKRRSIKSFFSRLNWLHQLKYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYAQASGRVTVSTKRSQQTVIPNIGSRPWVRGVSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRSGKSSIMRSDAPIGKCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'SP214_197'        QKFPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDDFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFNNESFNWTGVAQNGTSYACKRRSVKSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGVSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRSGKSSIMRSDAPIGNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'BR45_696'         QKIPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTDRICDSPHRILDGKNCTLIDALLGDPHCDDFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFTKEGFNWTGVAQDGKSYACKRGSVNSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGISSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAHIGNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'HK391_797'        QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGENCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFNNESFNWTGVAQNGTSYACKRRSIKSFFSRLNWLHQLKYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYAQASGRVTVSTKRSQQTVIPNIGSRPWVRGVSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRSGKSSIMRSDAPIGKCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'SYD497'           QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGENCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFNNESFNWTGVAQNGTSYACKRRSIKSFFSRLNWLHQLKYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYAQASGRVTVSTKRSQQTVIPNIGSRPWVRGVSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRSGKSSIMRSDAPIGKCNSECITPNGSIPNDKHFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'BR51_897'         QKLPGNDNSTATLCLGHHAVPNGTLVKTITSDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFTNEGFNWTGVAQNGTSYACKRGSVKGFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYVWGVHHPSTDSDQTSLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGISSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRSGKSSIMRSDAPIDNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'SYD597'           QKIPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGENCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFNNESFNWTGVAQNGTSYACKRSSIKSFFSRLNWLHQLKYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSIYAQASGRVTVSTKRSQQTVIPNIGSRPWVRGISSRISIHWTIVKPGDILLINSTGNLIAPRGYFKIRSGKSSIMRSDAPIGKCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'BR597_796'        QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDDFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFTKEGFNWTGVAQDGKSYACKRGSVNSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYIQASGRVTVSTKRSQQTVIPNIGSRPWVRGISSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIGKCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'JA416_297'        RKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTSATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFNNESFNWTGVAQNGTSYACKRRSVKSFFSRLNWLHQLKYKYPAQNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGVSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRSGKSSIMRSDAPIGNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'SYD697'           QKIPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGENCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFNNESFNWTGVAQNGTSYACKRRSIKSFFSRLNWLHQLKYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYAQASGRVTVSTKRSQQTVIPNIGSRPWVRGVSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRSGKSSIMRSDAPIGKCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'BR87_596'         QKIPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDDFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFTKEGFNWTGVAQDGKSYACKRGSVNSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYVQASGRVTVSTKRSQQTVIPNIGCRPWVRGISSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAHIGNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'JOH10_697'        QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHQILDGKNCTLIDALLGDPHCDGFKNKEWDLFVERSTAYSNCYPYDVPDYASLRSLVASSGTLEFTNEGFNWAGVAQDGTSYACKRGSVKSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGISSRISIYWTIVKPGDILLISSTGNLIAPRGYFKIRSGKSSIIRSDAPIDNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'TAS1_797'         QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSTAYSNCYPYDVPDYASLRSLVASSGTLEFTNEGFNWTGVAQDGTSYACKRRSVKSFFSRLNWLHKPEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYVHASGRVTVSTKRSQQTVIPNIGSRPWVRGVSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRSGKSSIMRSDAPIDNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'CA10_797'         QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHQILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSTAYSNCYPYDVPDYASLRSLVASSGTLEFTKEGFNWTGVAQDGTSYACKRGSVKSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSIYVQASGRVTVSTKRSQQTVIPSIGSRPWVRGISSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRSRKSSIMRSDAPIDNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'JOH3_397'         QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFNNESFNWTGVAQNGTSYACKRGSVKSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGISSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRSGKSSIMRSDAPIGNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'CA13_1296'        QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHQILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSTAYSNCYPYDVPDYASLRSLVASSGTLEFTKEGFNWTGVAQDGTSYACKRGSVKSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGVSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRSGKSSIMRSDAPIDNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'JOH5396_97'       QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGKICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFTDEGFNWTGVAQDGKSSACKRGSVNSFFSRLNWLHKPEHKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGISSRISIHWTIVKPGDILLINSIGNLIAPRGYFKIRNGKSSIMRSDAPIDNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'TH78_397'         QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGGICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSDCYPYDVPDYASLRSLVASSGTLEFTNEGFNWTGVAQDGTSYACKRGSVKSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSVQTSLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGVFSRISIYWTIVKPGDILLISSTGNLIAPRGYFKIRSGKSSIMRSDAPIGNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'CANBERRA5_897'    QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGENCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFNNESFNWTGVAQNGTSYACKRRSIKSFFSRLNWLHQLKYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYAQASGRVTVSTKRSQQTVIPNIGSSPWVRGVSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRSGKSSIMRSDAPIGKCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'JOH9_597'         QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHQILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSTAYSNCYPYDVPDYASLRSLVASSGTLEFTKEGFNWTGVAQDGTSYACKRGSVKSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPITDSEQTSLYVQASGRVTVSTKRSQQTVIPSIGYRPWVRGVSSRISIYWTIVTPGDILLINSTGNLIAPRGYFKIRSGKSSIMRSDAPIDNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'TH79_397'         QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGGICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSDCYPYDVPDYASLRSLVASSGTLEFTNEGFNWTGVAQDGTSYACKRGSVKSFFSRLNWLHKLEYKYPALNVAMPNNDKFDKLYIWGVHHPSTDSVQTSLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGVFSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRSGKSSIMRSDAPIGNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'KO572_297'        QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFNNESFNWTGVAQNGTSYACKRRSVKSFFSRLNWLHQLKYKYPAQNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGVSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRSGKSSIMRSDAPIGNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'TH9496_97'        QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFTNEGFNWTGVAQDGTSYACKRGSVKSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSVQTSLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGVSSRISIYWTIVKPGDILLISSTGNLIAPRGYFKIRSGKSSIMRSDAPIGNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'CAR42297'         QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSDCYPYDVPDYASLRSLVASSGTLEFTNEGFNWTGVAQDGTSYACKRGSVKSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGISSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRSGKSSIMRSDAPIGNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'KO671_297'        QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFNNESFNWTGVAQNGTSYACKRRSVKSFFSRLNWLHQLKYKYPAQNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGISSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRSGKSSIMRSDAPIGNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'TIANJING51_297'   QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFNNESFNWTGVAQNGTSYACKRGSVKSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTRIYAQASGRVTVSTKRSQQTVIPNIGSRPWVRGVSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRSGKSSIMRSDAPIGKCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'CAR465_896'       QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSDCYPYDVPDYASLRSLVASSGTLEFTNEGFNWTGVAQDGTSYACKRGSVKSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGISSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRSGKSSIMRSDAPIGNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'TIANJING55_896'   QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFNNESFNWTGVAQNGTSYACKRRSVKSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGVSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRSGKSSIMRSDAPIGNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'CL170_1096'       QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLIASSGTLEFNNESFNWTGVAQNGTSYACKRRSVKSFFSRLNWLHKLKYKYPAQNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGISSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRSGKSSIMRSDAPIGNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'KY2_297'          QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDGPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFTNESFNWPGVAQNGTSYACKRGSVKSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYVQSSGRVTVSTKRSQQTVTPNIGSRPWVRGVSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRRGKSSIMRSDAPIDNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'TX1196_97'        QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQGSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFNNESFNWTGVAQNGTSYACKRGSVKSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGVSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRSGKSSIMRSDAPIDNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'CN101_197'        QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFKNKEWDLFVERSTAYSNCYPYDVPDYASLRSLVASSGTLEFTNEGFNWTGVAQDGTSYACKRGSVKSFFSRLNWLHKPEYKHPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGVSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRSGKSSIMRSDAPIDNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'MN1_1196'         QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSDCYPYDVPDYASLRSLVASSGTLEFTNEGFNWTGVAQDGTSYACKRGSVKSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGVSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRSGKSSIMRSDALIGNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'CN10679_997'      QKIPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQNSSTGRICDSPHRILDGENCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFNNESFNWTGVAQNGTSYACKRRSIKSFFSRLNWLHQLKYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYAQASGRVTVSTKRSQQTVIPNIGSRPWVRGVSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRSGKSSIMRSDAPIGKCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'MN1_497'          QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHQILDGKNCTLIDALLGDPHCDGFKNKEWDLFVERSTAYSNCYPYDVPDYASLRSLVASSGTLEFTKEGFNWTGVAQDGTSYACKRGSVKSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGISSKISIYWTIVKPGDILLINSTGNLIAPRGYFKIRSGKSSIMRSDAPIDNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'UR41_197'         QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDDFQNEEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFNNESFNWIGVAQNGTSYACKRRSVKSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYAQTSGRVTVSTKRSQQTVIPNIGSKPWVRGISSRISIYWTIVKPGDILLITSTGNLIAPRGYFKIRSGKSSIMRSDAPIGKCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'MO10_1196'        QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHQILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSTAYSNCYPYDVPDYASLRSLVASSGTLEFTKEGFNWTGVAQDGTSYACKRGSVKSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGVSSKISIYWTIVKPGDILLINSTGNLIAPRGYFKIRSGKSSIMRSDAPIDNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'VIC3097'          QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSTAYSNCYPYDVPDYASLRSLVASSGTLEFTNEGFNWTGVAQDGTSYACKRRSVKSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYVHASGRVTVSTKRSQQTVIPNIGSRPWVRGVSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRSGKSSIMRSDAPIDNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'CO11_1196'        QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDGPHQILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFTNESFNWTGVAQNGTSYACKRGSVKSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYVQSSGRVTVSTKRSQQTVTPNIGSRPWVRGISSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRKGKSSIIRSDAPIDNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'MO11_1196'        QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFKNKEWDLFVERSTAYSNCYPYDVPDYASLRSLVASSGTLEFTNEGFNWTGVAQDGTSYACKRGSVKSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGISSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRSGKSSIMRSDAPIDNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'VIC4797'          QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSTAYSNCYPYDVPDYASLRSLVASSGTLEFTNEGFNWTGVAQDGTSYACKRRSVKSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGIHHPSTDSDQTSLYVHASGRVTVSTKRSQQTVIPNIGSRPWVRGVSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRSGKSSIMRSDAPIDNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'CORD3278_796'     QKIPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFNNESFNWTGVAQNGTSYACKRRSVKSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPITDSEQTSLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGVSSRISIYWTIVKPGDILLISSTGNLIAPRGYFKIRSGKSSIMRSDAPIGNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQTTLKLATGMRNVPEKQTR
+	'MON318_696'       QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSDCYPYDVPDYASLRSLVASSGTLEFTNEGFNWTGVAQDGTSYACKRGSVKSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGVSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRSGKSSIMRSDAPIGNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'WE397'            QKIPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGENCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFNNESFNWTGVAQNGTSYACKRGSIKSFFSRLNWLHQLKYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYAQASGRVTVSTKRSQQTVIPNIGSRPWVRGVSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRSGKSSIMRSDAPIGKCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'DE4_397'          QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSDCYPYDVPDYTSLRSLVASSGTLEFTNEGFNWTGVAQDGTSYACKRGSVKSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGVSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRSGKSSIMRSDAPIGNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'MOS2_197'         QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFKNKEWDLFVERSSAYSNCYPYDVPDYASLRSLVASSGTLEFTNEGFNWTGVAQDGTSYACKRGSVKSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSVQTSLYVQASGRITVSTKRSQQTVIPNIGSRPWVRGISSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRSGKSSIMRSDAPIDNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'YOKOHAMA6896_97'  QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSDCYPYDVPDYASLRSLVASSGTLEFTNEGFNWTGVAQDGTSYACKRGSVKSFFSRLNWLHKLEYKYPALNVTMPNDDKFDKLYIWGVHHPSTDSDQTSLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGVSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRSGKSSIMRSDAPIGNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'FG39_1096'        QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLIASSGTLEFTNEGFNWTGVAQDGTSYACKRGSVKSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGVSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRSGKSSIMRSDAPIGNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'FR7597'           QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFTNEGFNWIGVAQDGTSYACKRGSVKSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGVSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRSGKSSIMRSDAPIGNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQSTLKLATGMRNVPEKQTR
+	'NJ8_1296'         QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRMCDGPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFTNESFNWTGVAQNGTSYACKRGSVKSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYVQSSGRVTVSTKRSQQTVTPNIGSRPWVRGVSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRRGKSSIMRSDAPIDNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'NY9_196'          QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGNLEFTNEGFNWTGVAQDGTSYACKRGSVKSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGVSSRISIYWTIVKPGDILLIHSTGNLIAPRGYFKIRSGKSSIMRSDAPIGNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'SHA9_995'         QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFTNEGFNWTGVAQDGTSYACKRGSVKSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTRIYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGVSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRSGKSSIMRSDAPIGNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'HK357_696'        QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVSDYASLRSLVASSGTLEFNNESFNWTGVAQNGTSYACKRRSVKSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGVSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRSGKSSIMRSDAPIGNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'CI2115_696'       QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFNNESFNWTGVAQNGTSYACKRRSVKSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGVSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRSGKSSIMRSDAPIGNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'GZH8_496'         QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFNNESFNWTGVAQNGTSYACKRRSVKSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGVSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRSGKSSIMRSDAPIGNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'GZH11_496'        QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFNNESFNWTGVAQNGTSYACKRRSVKSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGVSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRSGKSSIMRSDAPIGNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'SHZH43_396'       QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDGPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFTNESFNWTGVAQNGTSYACKRGSVKSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPITDSDQTSIYVQSSGRVTVSTKRSQQTVIPNIGSRPWVRGVSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRSGKSSIMRSDAPIDNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'WZH1_596'         QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDGPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFTNESFNWTGVAQNGTSYACKRGSVKSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSIYVQSSGRVTVSTKRSQQTVIPNIGSRPWVRGVSSRISIYWTIVKPGDILLITSTGNLIAPRGYFKIRSGKSSIMRSDAPIDNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'FUK11496E'        QKLPRNDNSTATLCLGHHAVPNGTLVKTITNDQVEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFTNEGFNWTGVAQDGTSYACKRGSVKSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSVQTSLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGVSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRSGKSSIMRSDAPIGNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'FUK11496C'        QKLPRNDNSTATLCLGHHAVPNGTLVKTITNDQVEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFTNEGFNWTGVAQDGTSYACKRGSVKSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSIYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGISSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRSGKSSIMRSDAPIGNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'AUC596'           QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSDCYPYDVPDYASLRSLVASSGTLEFTNEGFNWTGVAQDGTSYACKRGSVKSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGVSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRSGKSSIMRSDAPIGNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'BRI2296'          QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSDCYPYDVPDYASLRSLVASSGTLEFTNEGFNWTGVAQDGTSYACKRGSVKSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGISSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRSGKSSIMRSDAPIGNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'BRIS3596'         QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSDCYPYDVPDYASLRSLVASSGTLEFTNEGFNWTGVAQDGTSYACKRGSVKSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRSGKSSIMRSDAPIGNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'CHR196'           QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSDCYPYDVPDYASLRSLVASSGTLEFTNEGFNWTGVAQDGTSYACKRGSVKSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSVQTSLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGVSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRSGKSSIMRSDAPIGNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'HI2_796'          QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSDCYPYDVPDYASLRSLVASSGTLEFTNEGFNWTGVAQDGTSYACKRGSVKSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGVSSIISIYWTIVKPGDILLINSTGNLIAPRGYFKIRSGKSSIMRSDAPIGNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'WE4896'           QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSDCYPYDVPDYASLRSLVASSGTLEFTNEGFNWTGVAQDGTSYACKRGSVKSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVLHPGTDSDQTSLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGVSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRSGKSSIMRSDAPIGNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'CNIC35_196'       QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFTNEGFNWTGVAQDGTSYACKRGSVKSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGVSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRSGKSSIMRSDAPIGNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'WUH359_995'       QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFTNEGFNWTGVAQDGTSYACKRGSVKSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSIYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGISSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRSGKSSIMRSDAPIGNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'NCH933_995'       QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFTNEGFNWTGVAQDGTSYACKRGSVKSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSVQTSLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGISSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRSGKSSIMRSDAPIGNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'WA596'            QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFTNEGFNWAGVAQDGTSYACKRGSVKSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGISSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRSGKSSIMRSDAPIGNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'FUJIAN47_396'     QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFTNEGFNWTGVAQDGTSYACKRGSVKSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTRLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGISSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRSGKSSIMRSDAPIDNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'JA99_196'         QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFTNEGFNWTGVAQNGTSYACKRGSVKSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGISSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRSGKSSIMRSDAPIDNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'WI3_896'          QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYAPLRSLVASSGTLEFTNEGFNWTGVAQDGTSYACKRGSVKSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGVSSIISIYWTIVKPGDILLINSTGNLIAPRGYFKIRSGKSSIMRSDAPIDNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'AK2_796'          QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFTNEGFNWTGVAQDGTSYACKRGSVKSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGISSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRSGKSSIMRSDAPIDNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'TW523_596'        QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDMPDYASLRSLVASSGTLEFTNEGFNWTGVAQDGTSYACKRGSVKSFFSRLNWLHKLEYKYPALNVAMPNNDKFDKLYIWGVHHPSTDSDQTSLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGISSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRSGKSSIMRSDAPIDNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'CNIC22_195'       QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFTNEGFNWTGVAQDGKSYACKRGSVNSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTRIYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGISSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIGNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'GNX42_495'        QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFTNEGFNWTGVAQDGKSSACKRGSVNSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGISSRISIYWTIVKPGDILLITSTGNLIAPRGYFKIRNGKSSIMRSDAPIGNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'MO6_396'          QKLPGNDNSTATLCLGHHAVPNGTLVKTITDDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFTNEGFNWTGVAQDGKSYACKRGSVNSFFSRLNWLYKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGISSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIDNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'CN2796_1295'      QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSIGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFTNEGFNWTGVAQDGKSYACKRGSVKSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGISSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIDNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'ID3_1195'         QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFTNEGFNWTGVAQDGKSYACKRGSVKSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYVQASGRVTVSTKRIQQTVIPNIGSRPWVRGISSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIDNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'AK16_995'         QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEMTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFTNEGFNWTGVAQDGKSYACKRGSVNSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGISSRISIYWTIVKPGDILLITSTGNLIAPRGYFKIRNGKSSIMRSDAPIDNCNSKCITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'JOH1795'          QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEMTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFTNEGFNWTGVAQDGKSYACKRGSVKSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSIYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGISSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIDNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'ID4_1195'         QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFTNEGFNWTGVAQDGKSYACKRGSVNSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGISSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIDNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQKTLKLATGMRNVPEKQTR
+	'NV1_1195'         QKLPGNDNSTATLCLGHHAVPSGTLVKTITNDQIEVTNATELIQSSPTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFTNEGFNWTGVAQDGKSYSCKRGSVNSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGISSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIDNCNSECITPNGSIPNDKPFQNVNRITYGSCPRYVKQNTLKLATGMRNVPEKQTR
+	'KO45_296'         QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFTNEGFNWTGVAQDGKSYACKRGSVNSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGISSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIDNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'CN61_296'         QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFTNEGFNWTGVAQDGKSYACKRGSVNSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGISSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIDNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'BZ2_395'          QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFTNEGFNWTGVAQDGKSYACKRGSVNSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGISSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIDNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'GE491_396'        QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFTNEGFNWTGVAQDGKSYACKRGSVNSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGISSRISIYWTIVKPGDILLITSTGNLIAPRGYFKIRNGKSSIMRSDAPIDNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'UK897_696'        QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFTNEGFNWTGVAQDGKSYACKRGSVNSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGISSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIDNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'MN6_1195'         QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFTNEGFNWTGVAQDGKSYACKRGSVNSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGISSRISIYWTIVEPGDILLINSIGNLIAPRGYFKIRTGKSSIMRSDAPIDNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'CN17_196'         QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFTNEGFNWTGVAQDGKSYACKRGSVNSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGISSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIDNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'BE281_1294'       QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFTNEGFNWTGVAQDGKSYACKRGSVNSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPITDSDQTRLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGISSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIGNCNSECITPNGSIPNDKPFQNVNRITYGAFPRYVKQNTLKLATGMRNVPEKQTR
+	'SHD5_894'         QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFTNEGFNWTGVAQDGKSYACKRGSVNSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTRIYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGISSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIGNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQDTLKLATGMRNVPEKQTR
+	'AG4057_795'       QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRIIDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFTNEGFNWTGVAQDGKSYACKRGSVKSFFSRLNWLHKLEYKYPALNVAMPNNDKFDKLYIWGVHHPSTDSDQTSLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGISSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIGNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'BZ18_496'         QKIPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDDFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFTKESFNWTGVAQDGKSYACKRGSVNSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYVQASGRVTVCTKRSQQTVIPNIASRPWVRGISSRISIYWTIVKPGDILLINSTGNLIAPRGYFKMRNGKSSIMRSDAHIGNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'BZ8_496'          QKIPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDDFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFTKEGFNWTGVAQDGKSYACKRGSVNSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGISSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAHIGNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'GE578652_295'     QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFTKEGFNWTGVAQDGKSYACKRGSVKSFFSRLNWLHKLEYKYPALNVTMPNNDKFGKLYIWGVHHPSTDSDQTSLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGISSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIGNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'WV1_395'          QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFTKEGFNWTGVAQDGKSYACKRGSVKSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGISSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIGNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'SN27_595'         QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFTKEGFNWTGVAQDGKSYACKRGSVKSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGISSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIGNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'WA186_1294'       QKLPGNDNSTTTLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFTKEGFNWTGVAQDGKSYACKRGSVKSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTNSDQTSLYVQPSGRVAVSTKRSQQTVIPNIGSRPWVRGISSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIGNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKHTR
+	'GE767_495'        QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSKGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFTKEGFNWTGVAQDGKSYACKRGSVNSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGISSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIGNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'HK3_195'          QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFTKEGFNWTGVAQNGKSYACKRGSVNSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGISSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIGNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'SN28_595'         QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICGSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFTKEGFNWTGVAQDGKSYACKRGSVNSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGISSRISIYWTIVKPGDILLINSIGNLIAPRGYFKIRNGKSSIMRSDAPIGNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'NJ11_1294'        QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFTKEGFNWTGVAQDGKSYACKRGSVNSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGISSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIGNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'HK38_895'         QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFTKEGFNWTGVAQDGKSYACKRGSVNSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGISSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIGNCKSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'CN147_495'        QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSAGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFTKEGFNWTGVAQDGKSYSCKRGSVNSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKMYIWGVHHPSTDSDQTSLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGISSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMKSDAPIGNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'VA25_1294'        QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFTKEGFNWTGVAQDGKSYACKRGSVNSFFSRLNWLHKLEDKYPALNVAMPNNDKFDKLYIWGVHHPSTDSDQTSLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGISSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSMMRSDAPIGNCNSECITPNGSIPNDKPYQNVNRITYGACPRYVKQNTLKLATGMRNVPEKHSR
+	'JOH295'           QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFTKEGFSWTGVAQDGGSCACKRGSANSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYVQASGRVTVSTKRSQQTVTPNIGSRPWVRGISSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIGNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'AK10_295'         QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFTNEGFNWTGVAQDGKSYACKRGSVKSFFSRLNWLHKLEYKYPALDVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGISSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIDNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'NE11_395'         QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFTNEGFNWTGVAQDGKSYACKRGSVKSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGISSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIDNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'KWJ195_1194'      QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFTNEGFNWTGVAQDGKSYACKRGSVKSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGFHHPSTDSDQTSLYVQASGRVTVSTKRSQQTVIPNIGSRPWVRGISSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIDNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'CHW995_1294'      QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICNSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFTNEGFNWTGVAQDGKSYACKRGSVNSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYVQASGRVTVSTKKSQQTVIPNIGSRPWVRGISSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIDNCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'HAR3_194'         QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQDGTSYACKRGSVKSFFSRLNWLHKLEYKYPALNVTIPNSGKFDKLYIWGVHHPSTDSDQTSIYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGISSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIGNCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'HK42_396'         QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSPTGRICDSPHRILDGRNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINENFNWTGVAQDGKSYACKRGSVNSFFSRLNWLHKLDYKYPALNVTMPNNGKFDKLYIWGVHHPSTDSDQISLYVRSSGRVTVSTKRSQQTVIPDIGYRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKLRNGKSSIMRSDAPIGNCSSGCITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'MEM196_1195'      QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSPTGRICDSPHRILDGKNCTLIDALLGDPHCDGFKNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINENFNWTGVAQDGKSYACKRGSVNSFFSRLNWLHKLDYKYPALNVTMPNNGKFDKLYIWGVPHPSTDSDQTTLYVRSSGRVTVSTKRSQQTVIPDIGYRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKLRNGKSSIMRSDAPIGNCSSGCITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'NY17_1294'        QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSPTGRICNSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINENFNWTGVAQDGKSYTCKRGSVNSFFSRLNWLHKLEYKYPALNVTMPNNGKFDKLYIWGVHHPSTDSDQTSIYVRASGRVTVSTKRSQQTVIPDIGYRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKLRNGKSSIMRSDAPIGNCSSECITPNGSIPNDKPFQNVNRITYGACPRYIKQNTLKLSTGMRNVPEKQTR
+	'CA5_395'          QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSPTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVLDYASLRSLVASSGTLEFTNENFNWTGVAQNGKSYTCKRGSVNSFFSRLNWLHKLEYKYPALNVTMPNNGKFDKLYIWGVHHPSTDSDQTRLYVRASGKVTVSTKRSQQTVIPDIGYRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIGNCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'JA8695_1294'      QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSPTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFTNENFNWTGVAQNGKSYSCKRGSVNSFFSRLNWLHKLEYKYPALNVTMPNNGKFDKLYIWGVHHPSTDSDQTSLYVRASGKVTVSTKRSQQTVIPDIGYRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIGNCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'SP378_195'        QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSPTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFTNENFNWTGVAQDGKSYSCKRGSVNSFFSRLNWLHKLEYKYPALNVTMPNNGKFDKLYIWGVHHPSTDSDQTSLYVRASGKVTVSTKRSQQTVIPDIGYRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIGNCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'PA7_1294'         QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSPTGRICDSPHRILDGRNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFTNENFNWTGVAQDGKSYSCKRGSVNSFFSRLNWLHKLEYKYPALNVTMPNNGKFDKLYIWGVHHPSTDSDQTSLYVRASGRVTVSTKRSQQTVIPDIGYRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIDNCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRDVPEK???
+	'LA1_195'          QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQNSPTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFTNENFNWTGVAQDGKSYACKRGSVKSFFSRLNWLHKLEYKYPALNVTMPNNGKFDKLYIWGVHHPSTDSDQTSLYVRASGKVTVSTKRSQQTVIPDIGYRPWVRGQSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIGNCSSECITPNGSIPNDKPFPNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'NJ8_1194'         QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQNSPTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFTNENFNWTGVAQDGKSYACKRGSVKSFFSRLNWLHKLEYKYPALNVTMPNNGKFDKLYIWGVHHPSTDSVQTSLYVRASGKVTVSTKRSQQTVIPDIGYRPWVRGQSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIGNCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'CN124_295'        QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSPTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFTNENFNWTGVAQDGKSYACKRGSVKSFFSRLNWLHKLEYKYPALNVTMPNNGKFDKLYIWGVHHPSTDSDQTSLYVRASGKVTVSTKRSQQTVIPDIGYRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIGNCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'MA1_195'          QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSPTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFTNENFNWTGVAQDGKSYACKRGSVKSFFSRLNWLHKLEYKYPALNVTMPNNGKFDKLYIWGVHHPSTDSDQTSLYVRASGKVTVSTKRSQQTVTRNIGYRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIGNCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'OH3_195'          QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSPTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFTNENFNWTGVAQDGKSYACKRGSVKSFFSRLNWLHKLEYKYPALNVTMPNNGKFDKLYIWGVHHPSTDSDQTSLYVRASGKVTVSTKRSQQTVIPDIGYRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIGNCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLRLATGMRNVPEKQTR
+	'NJ10_195'         QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSPTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFTNENFNWTGVAQDGKSYACKRGSVKSFFSRLNWLHKLEYKYPALNVTMPNNGKFDKLYIWGVHHPSTDSDQTSLYVRASGKVTVSTKRSQQTVIPDIGYRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIGNCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'IL5_195'          QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSPTGRICNSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFTNENFNWTGVAQDGKSYACKRGSVKSFFSRLNWLHKLEYKYPALNVTMPNNGKFDKLYIWGVHHPSTDSDQTSLYVRASGKVTVSTKRSQQTVIPDIGYRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIGNCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPE????
+	'TX5_1294'         QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSFPTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFTNENFNWTGVAQDGKSYACKRGSVKSFFSRLNWLHKLEYKYPALNVTMPNNGKFDKLYIWGVHHPSTDSDQTSLYVRASGKVTVSTKRSQQTVIPDIGYRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIGNCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'SP351_195'        QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSPTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFTNENFNWTGVAQDGKSYACKRGSVKSFFSRLNWLHKLEYKYPALNVTMPNNGKFDKLYIWGVHHPSTDSDQTSLYVRASGKVTVSTKRSQQTVIPDIGYRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKGSIMRSDAPIGNCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'PA15_295'         QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSPTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFTNENFNWTGVAQDGKSYACKRGSVKSFFSRLNWLHKLEYKYPALNVTMPNNGKFDKLYIWGVHHPSTDSDQTSLYVRASGKVTVSTKRSQQTVIPDIGYRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIGNCSSECITPNGSIPNDKPFQNVNRITYGACPRYIKQNTLKLATGMRNVPEKQTR
+	'NY28_1294'        QKLPGNDNSTATLCLGHHAVPSGTLVKTITNDQIEVTNATELVQSSPTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFTNENFNWTGVAQDGKSYACKRGSVKSFFSRLNWLHKLEYKYPALHVTMPNNDKFGKLYIWGVHHPSTDSDQTSLYVRASGTVTVSTKRSQQPVIPDIGYRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIGNCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEK???
+	'HK1_694'          QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSPTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSSCYPYDVPDYASLRSLVASSGTLEFINENFNWTGVAQDGKSYACKRGSVKSFFSRLNWLHKLEYKYPALNVTMPNNGKFDKLYIWGVHHPSTDSDQTSLYVRASGRVTVSTKRSQQTVIPDIGYRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIGNCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'HK55_794'         QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSPTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINENFNWTGVAQDGKSYACKRGSVKSFFSRLNWLHKLEYKYPALNVTMPNNGKFDKLYIWGVHHPSTDSDQTSLYVRASGRVTVSTKRSQQTVIPDIGYRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIGNCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'JOH33_794'        QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSPTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINENFNWTGVAQDGKSYACKRGSVNSFFSRLNWLHKLEYKYPALNVTMPNNGKFDKLYIWGVHHPSTDSDQTSLYVRASGRVTVSTKRSQQTVIPDIGYRPWVRGQSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIGNCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'AG3779_1094'      QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSPTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINENFNWTGVAQDGKSYACKRGSVNSFFSRLNWLHKLEYKYPALNVTMPHNGKFDKLYIWGVHHPSTDSVQTSLYVRASGRVTVSTKRSQQTVIPDIGYRPWVRGQSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIGNCSSECITPNGSIPNDKPFPNVNRITYGACPRYVKENTLKLATGMRNVPEKQTR
+	'AKI194'           QKLPGNDNSTATLCLGHHAVPNGTLVRTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQDGKSYACKRGSVKSFFSRLNWLHKLEYKYPELNVTMPNNGKFDKLYIWGVHHPSTDSDQTSLYVRASGRVTVSTKRSQQTVIPNIGFRPWVRGQSSRMSIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIGNCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'RO182_194'        QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQDGKSYACKRGSVKSFFSRLNWLHKLEYKYPALNVTMPNNGKFDKLYIWGVHHPSTDSDQTSLYVRASGRVTVSTKRSQQTVIPNIGFRPWVRGQSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIGNCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'VT3_194'          QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQDGKSYACKRGSVNSFFSRLNWLHKLEYKYPALNVTMPNNGKFDKLYIWGVHHPSTDSDQTSLYVRASGRVTVSTKRSQQTVIPNIGFRPWVRGQSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIGNCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'RO160_194'        HKLPRNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQDGKSYACKRGSVNSFFSRLNWLHKLEYKYPALNVTMPNNGKFDKLYIWGVHHPSTDSDQTSLYVRASGRVTVSTKRSQQTVIPNIGFRPWVRGQSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIGNCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'SANT7198_894'     QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDIFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQDGKSYACKRGSVNSFFSRLNWLHKLEYKYPALNVTMPNNGKFDKLYIWGVHHPSTDSDQTRLYVRASGRVTVSTKRSQQTVIPNIGFRPWVRGQSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIGSCSSECITPNGSIPNDKPFQNVNRITYGACPRYVEPHTLKLATGMRYVPEKQTR
+	'FR120394'         QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQDGKSYACKRGSVKSFFSRLNWLHKLEYKYPALNVTMPNNGKFDKLYIWGVHHPSTDSDQTSLYVRASGKVTVSTKRSQQTVIPNIGFRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIGNCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'NED37293'         QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQDGKSYACKRGSVKSFFSRLNWLHKLEYKYPALNVTMPNNGKFDKLYIWGVHHPSTNSDQTSLYVRASGRVTVSTKRSQQTVIPNIGFRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIGNCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'NY16_1194'        QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQDGKSYTCKRGSVNSFFSRLNWLHQSKYKYPELNVTMPNNGKFDKLYIWGVHHPSTDSDQTILYARASGRVTVSTKRSQQTVIPNIGFRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIGNCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'NY4295_1194'      QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQDGKSYTCKRGSVNSFFSRLNWLHQSKYKYPELNVTMPNNGKFDKLYIWGVHHPSTDSDQTSLYARASGRVTVSTKRSQQTVIPNIGFRPWVRGQSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIGNCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'PA993_1294'       PKLPGNDNSTATLCLGHHAVPNGTLVKTITNEQIEVTNATELVQSSSTGRICNSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQDGKSYACKRGSVNSFFSRLNWLHKLEYKYPAVNVTMPNNGKFDKLYIWGVHHPSTDSDQTSLYVRASGRVTVSTKRSQQTVIPNIGFRPWVRGLSSGISIYWTIVRPGDILLINSTGNLIAPRGYSKIRNGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'CA5_1193'         QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQDGKSYSCKRGSVNSFFSRLNWLHKLEYKYPALNVTMPNNGKFDKLYIWGVHHPSTDSDQTSLYVRASGRVTVSTKRSQQTVIPNIGFRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIGNCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'WA41_1293'        RKLPGNDNSTATLCLGHHAVPSGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFVNEDFNWTGVAQDGKSYSCKRGSVNSFFSRLNWLHKLEYKYPALDVTMPNNGKFDKLYIWGVHHPSTDSDQTSLYVRASGRVTVSTKRSQQTVIPNIGFRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIGNCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'CA4_794'          QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQDGTSYSCKRGSVNSFFSRLNWLHKLKYKYPALNVTMPNNGKFDKLYIWGVHHPSTDSDQTSLYVRASGGVTVSTKRSQQTVIPNIGSRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIGNCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'SP190_393'        QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQDGKSYSCKRGSVNSFFSRLNWLHELEYKYPALNVTMPNNGKFDKLYIWGVHHPSTDSDQTSLYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIGNCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'ST1_193'          QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQDGKSYSCKRGSVNSFFSRLNWLHKLEYKYPALNVTMPNNGKFDKLYIWGVHHPSTDSDQTSLYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIGNCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'SP125_293'        QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQDGKSYTCKRGSVNSFFSRLNWLHKLEYKYPALNVTMPNNGKFDKLYIWGVHHPSTDSDQTSLYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIGNCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'WY1_1193'         QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYPSLRSLVASSGTLEFINEDFNWTGVAQDGKSYTCKRGSVNSFFSRLNWLHKLEYKYPALNVTMPNNGKFDKLYIWGVHHPSTDSDQTSLYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIGNCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'TX57_1293'        QKLPGNDNSTATLCLGHHAVPNGTLVKTITNGQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFIERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQDGKSYACKRGSVNSFFSRLNWLHKLEYKYPALNVTMPNNGKFDKLYIWGVHHPSTDSDQTSLYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKMRNGKSSIMRSDAPIGNCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'LA4_893'          QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQDGKSYACKRGSVNSFFSRLNWLHKLEYKYPALNVTMPNNGKFDKLYIWGVHHPSTDSDQTSLYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIGNCSSECITPNGSIPNDKPFQNVNKITYGACPRYVRQNTLKLATGMRNVPEKQTR
+	'LA6_993'          QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQDGKSYACKRGSVNSFFSRLNWLHKLEYKYPALNVTMPNNGKFDKLYIWGVHHPSTDSDQTSLYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGLSSRISIYWTIVKPGDILLINSIGNLIAPRGYFKIRNGKSSIMRSDAPIGNCSSECITPNGSIPNDKPFQNVNKITYGACPRYVRQNTLKLATGMRNVPEKQTR
+	'NY3_293'          QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQDGKSYACKRGSVNSFFSRLNWLHKLEYKYPALNVTMPNNGKFDKLYIWGVHHPSTDSDQTSLYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIGNCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'NY15_894'         QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQISSTGRICDSPHRILDGKNCTLIDALLGDPNCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQDGKSYACRRGSVNSFFSRLNWLHSLKYKYPALNVTMPNNGKFDKLYIWGVHHPSKDSDQTSLYARASGRVTVSTKRSQQTVIPNIGSRPWVRGQSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIGNCSSECITPNGSIPNDKPFQNVNRITYGACPRYIKQDTLKLATGMRNVPEKQTR
+	'AK18_493'         QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQDGKSYACKRGSVKSFFSRLNWLHKLEYKYPALNVTMPNNGKFDKLYIWGVHHPSTDSDQTSLYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIGNCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'NY26_293'         QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQDGKSYACKRGSVNSFFSRLNWLHKLEYKYPALNVTMPNNGKFDKLYIWGVHHPSTDSDQTSLYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIGNCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'NY38_193'         QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGIAQDGKSYACKRGSVNSFFSRLNWLHKLEYKYPALNVTMPNNGKSDKLYIWGVHHPSTDSDQTSLYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGQSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIGNCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'ENG22093'         QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQDGKSYACKRGSVKSFFSRLNWLHKLEYKYPALNVTMPNNGKFDKLYIWGVHHPSTDSDQTSLYVRASGGVTVSTKRSQQTVIPNIGSRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIGNCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'WA2693'           QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQDGKSYACKRGSVNSFFSRLNWLHKLEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDSDQTSLYVRASGGVTVSTKRSQQTVIPNIGYRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIGNCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'GA3_393'          QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQDGKSYACKRGSVNSFFSRLNWLHKLEYKYPALNVTMPNNGKFDKLYIWGVHHPSTDSDQTSLYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIGNCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'BK122_694'        QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATDLVQNSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQDGKSYACKRGSVNGFFSRLNWLHKLEYKYPALNVTMPNNGKSDKLYIWGVHHPSTDSDQTSLYVRASGGVTVSTKRSQQTVIPSIGSRPWVRGQSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIGNCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'TH7594'           QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQNSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQDGKSYACKRGSVKGFFSRLNWLHKLEYKYPALNVTIPNNGKSDKLYIWGVHHPSTDSDQTSLYVRASGGVTVSTKRSQQTVIPSIGSRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIGNCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'SN7_694'          QKLPGNDNSTATLCLGHHAVPNGTLVKTIANDQIEVTNATELVQNSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQDGKSYTCKRGSVNGFFSRLNWLHKLEYKYPALNVTMPNNGKFDKLYIWGVHHPSTDSDQTSLYVRASGGVTVSTKRSQQTVIPSIGSRPWVRGQSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIGNCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'AG3105_693'       QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDNPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQDGKSYACKRGSVNSFFSRLNWLHKLEDKYPALNVTMPNNGKFDKLYIWGFHHPSTDSDQTSLYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGQSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIGNCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'GD25_693'         QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSEAYSSCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQDGKSYACKRGSVNSFFSRLNWLHKLEYKYPALNVTMPNNGKFDKLYIWGFHHPSTDSDQTSLYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGQSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIGNCSSECITPNGSIPNDKPFQNVNKITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'WUZ1_794'         QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSSCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGIAQDGKSYACKRGSVNSFFSRLNWLHKLEYKYPTLNVTMPNNGKFDKLYIWGVHHPSTDSDQTSLYVRASGRVIVSTKRSQQTVIPNIGSRPWVRGQSSRISIHWTIVKPGDILLINSTGNLIAPRGYFKIRTGKSSIMRSDAPIGNCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'UDE44_394'        QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQDGKSYACKRGSVNSFFSRLNWLHKLEYKYPALNVTMPNNGKFDKLYIWGVHHPSTDSDQTSLYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGQSSRISIYWTIVKPGDILLIDSTGNLIAPRGYFKIRNGKSSIMRSDAPIGNCSSECITPNGSIPNDKPFQNVNKITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'CC893'            QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQDGKSYACKRGSVNSFFSRLNWLHKLEYKYPALNVTMPNNGKFDKLYIWGVHHPSTDSDQTSLYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGQSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIGNCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'WAIK2093'         QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERTKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQDGKSSACKRGSVNSFFSRLNWLHKLEYKYPALNVTMPNNGKFDKLYIWGVHHPSTDSDQTSLYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGQSSRISIYWTIVKPGDILLINSTGNLVAPRGYFKIRNGKSSIMRSDAPIGNCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'GD27_594'         QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGKICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQDGKSYACKRGSVNSFFSRLNWLHKLEYKYPALNVTMPNNGKFDKLYIWGVHHPSTDSDQTILYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGQSSRMSIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIGNCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'AA393'            QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQDGKSYACKRGSVNSFFSRLNWLHKLEYKYPALNVTMPNNGKFDKLYIWGVHHPSTDSDQTSLYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGQSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIGNCSSECITPNGSIPNDKPFQNVNRITYGACPRYVNQNTLKLATGMRNVPEKQTR
+	'NO93'             QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQDGESYACKRGSVNSFFSRLNWLHKLEYKYPALNVTMPNNGKFDKLYIWGVHHPSTDSDQTSLYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGQSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIGNCSSECITPNGSIPNDKPFQNMNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'NCH3396_593'      QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFKNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQDGGSYACKRGSVNSFFSRLNWLHKLEYKYPALNVTMPNNGKFDKLYIWGVHHPSTDSDQTRLYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGQSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIGNCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'NY1393'           QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQDGGSYACKRGSVNSFFSRLNWLHKLEYKYPALNVTMPNNGKFDKLYIWGVHHPSTDSDQTSLYVRASGRVTVSTKRSQQTVTPNIGSRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIGNCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'NGX10_193'        QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVQDYASLRSLVASSGTLEFINEDFNWTGVAQDGGSYACKRGSVNSFFSRLNWLHKLEYKYPALNVTMPNNGKFDKLYIWGVHHPSTDSDQTSLYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGLSSRISIYWTIVKPGDILLIDSTGNLIAPRGYFKIRNGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNRITYGACPRYVNQNTLKLATGMRNVPEKQTR
+	'SIC4_593'         QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVQDYASLRSLVASSGTLEFINEDFNWTGVAQDGGSYACKRGSVNSFFSRLNWLHKLEYKYPALNVTMPNNGKFDKLYIWGVHHPSTDSDQTSLYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGLSSRISIYWTIVKPGDILLIDSTGNLIAPRGYFKIRNGKSSIMRSDAPIGNCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'RU58_393'         QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVQDYASLRSLVASSGTLEFINEDFNWTGVTQDGGSYACKRGSVNSFFSRLNWLHKLEYKYPALNVTMPNNGKFDKLYIWGVHHPSTDSDQTSLYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGLSSGISIYWTIVKPGDILLIDSTGNLIAPRGYFKIRNGKSSIMRSDAPIGNCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'WUZ4_493'         QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVQDYASLRSLVASSGTLEFINEDFNWTGVAQDGGSYACKRGSVNSFFSRLNWLHKLEYKYPALNVTMPNNGKFDKLYIWGVHHPSTDSDQTSLYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGLSSGISIYWTIVKPGDILLIDSTGNLIAPRGYFKIRNGKSSIMRSDAPIGNCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'GD04_393'         QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQDGGSYACKRGSVNSFFSRLNWLHKLEYKYPALNVTMPNNGKFDKLYIWGVHHPSTDSDQTSLYVRESGRVTVSTKRSQQTVIPNIGSRPWVRGQSSRISIYWTIVKPGDILLIDSTGNLIAPRGYFKIRNGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNRITYGACPRYVNQNTLKLATGMRNVPEKQTR
+	'HAR1592'          QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQDGGSYACKRGSVNSFFSRLNWLHKLEYKYPALNVTMPNNGKFDKLYIWGVHHPSTDSDQTSLYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGQSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIGNCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'NCH12_1193'       QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRLCDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQDGGSYACRRGSVNSFFSRLNWLHKLEYKYPALNVTMPNNGKFDKLYIWGVHHPSTDSDQTSLYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGQSSRMSIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIGNCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQHTLKLATGMRNVPEKQTR
+	'NCH3332_493'      QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRLCDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQDGGSYACRRGSVNSFFSRLNWLHKLEYKYPALNVTMPNNGKFDKLYIWGVHHPSTDSDQTSLYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGQSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIGNCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQHTLKLATGMRNVPEKQTR
+	'NCH58_1293'       QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRLCDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFKWTGVAQDGGSYACRRGSVNSFFSRLNWLHKLEYKYPALNVTMPNNGKFDKLYIWGVHHPSTDSDQTSLYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGQSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIGNCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQHTLKLATGMRNVPEKQTR
+	'HK23_792'         QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQDGGSYACKRGSVNSFFSRLNWLYKLEYKYPALNVTMPNNGKFDKLYIWGVHHPSTDSVQTSLYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGQSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIGNCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'SHD9_393'         QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICGSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQDGGSYACKRGSVNSFFSRLNWLHKLEYKYPALNVTMPNNGKFDKLYIWGVHHPSTDSDQTSLYVRASGRVTVSTKRSQQTVTPNIGSRPWVRGQSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIGNCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'PS688_193'        QKLPGNDNSTATLCLGHHAVPNGTLVKTITKDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQDGGSYACKRGSVNSFFSRLNWLHKLEYKYPALNVTMPNNGKFDKLYIWGVHHPSTDSDQTSLYVRASGRVTVSTKRSQQTVTPNIGSRPWVRGQSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIGNCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'SAP_1292'         QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQDGGSYACKRGSVNSFFSRLNWLHKLEYKYPALNVTMPNNGKFDKLYIWGVHHPSTDSDQTSLYVRASGRVTVSTKRSQQTVTPNIGSRPWVRGQSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIGNCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'NY64_1293'        QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPNCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFTNEDFNWTGVAQDGGSYACKRGSVNSFFSRLNWLHKLEYKYPALNVTMPNNGKFDKLYIWGVHHPSTDSDQTSLYVRASGRVTVSTKRSQQTVTPNIGSRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'NY63_1293'        QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPNCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFTNEDFNWTGVAQDGGSYACKRGSVNSFFSRLNWLHKLEYKYPALNVTMPNNGKFDKLYIWGVHHPSTDSDQTSLYVRASGRVTVSTKRSQQTVTPNIGSRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'FR110994'         QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPNCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFTNEDFNWTGVAQDGGSYACKRGSVNSFFSRLNWLHKLEYKYPALNVTMPNNGKFDKLYIWGVHHPSTDSDQTSLYVRASGRVTVSTKRSQQTVTPNIGSRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'UR46967_294'      QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPNCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFTNEDFNWTGVAQDGGSYACKRGSVNSFFSRLNWLHKLEYKYPALNVTMPNNGKFDKLYIWGVHHPSTDSVQTSLYVRASGRVTVSTKRSQQTVTPIIGSRPWVRGQSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'CA271_1192'       QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQDGGSYACKRGSVNSFFSRLNWLHKSEYKYPALNVTMPNNGKFDKLYIWGVHHPSTDSDQTSLYVRASGRVTVSTKRSQQTVTPNIGSRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIGTCSFECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'KITA93'           QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQDGGSYACKRGSVNSFFSRLNWLHKSEYKYPALNVSMPNNGKFDKLYIWGVHHPSTDSDQTSLYVQASGRVTVSTKRSQQTVTPNIGSRPWVRGQSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIGTCSFECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'QD53_392'         QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTEVAQDGGSCACKRGSVNSFFSRLNWLHKSEYKYPALNVTMPNNGKFDKLYIWGVHHPSTDSDQTRLYVRASGRVTVSTKRSQQTVTPNIGSRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'AK9_1192'         QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHQILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQDGGSYSCKRGSVNSFFSRLNWLHKSEYKYPALNVTMPNNGKFDKLYIWGVHHPSTDSDQTSLYVRASGRVTVSTKRSQQTVTPNIGSRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'HI3_1192'         QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQDGGSYACKRGSVNSFFSRLNWLHKSEYKYPALNVTMPNNGKFDKLYIWGVHHPSTDSDQTSLYVRASGRVTVSTKRSQQTVTPNIGSRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'VIC193'           QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFKNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQDGGSYACKRGSVKSFFSRLNWLHKSEYKYPALNVTMPNNGKFDKLYIWGVHHPSTDSDQTSLYVRASGRVTVSTKRSQQTVTPNIGSRPWVRGQSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'BE32_192'         QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQDGGSYACKRGSVNSFFSRLNWLHKSEYKYPALNVTMPNNGKFDKLYIWGVHHPSTDRDQTSLYVRASGRVTVSTKRSQQTVTPNIGSRPWVRGQSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'BE46_292'         QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQDGGSYACKRGSVNSFFSRLNWLHKSEYKYPALNVTMPNNGKFDKLYIWGVHHPSTDSDQTSLYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGQSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'DJ3109_1291'      QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQDGGSYACKRGSVNSFFSRLNWLHKSEYKYPALNVTMPNNGKFDKLYIWGVHHPSTDRDQTSLYVRASGRVTVSTKRSQQTVTPNIGSRPWVRGQSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'KA206_1191'       QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQDGGSYACKRGSVNSFFSRLNWLHKSEYKYPALNVTMPNNGKFDKLYIWGVHHPSTDRDQTSLYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGQSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'PERTH01_492'      QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDSFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQDGGSYACKRGSVNSFFSRLNWLHESEYKYPALNVTMPNNGKVDKLYIWGVHHPSTDRDQTSLYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGQSSRISIYWTIVKPGDILLINSIGNLIAPRGYFKIRNGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'PS192SPF'         QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRIHDGKNCTLIDALLGDPHCDSFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQDGGSYACKRGSVNSFFSRLNWLHKSEYKYPALNVTMPNNGKVDKLYIWGVHHPSTDRDQTSLYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGQSSRISIYWTIVKPGDILLINSNGNLIAPRGYFKIRNGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'HK34_490'         QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQDGGSYACKRGSVNSFFSRLNWLHESKYKYPALNVTMPNNGKVDKLYIWGVHHPSTDRDQTSLYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGQSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'SH24_890'         QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGENCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQSGGSYACKRGSVNSFFSRLNWLHESEYKYPALNVTMPNNGKFDKLYIWGVHHPSTDRDQTSLYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGQSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'SN91'             QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQSGGSYACKRGSVNSFFSRLNWLHESEYKYPALNVTMPNNGKFDKLYIWGVHHPSTDRDQTSLYVRASGRVTVSTKRSQQTVIPNIGPRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRNGKSSIMRSDAPIGACSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'VIC29_392'        QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQNGGSYACKRGSVKSFFSRLNWLHESEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDREQTSLYIRASGRVTVSTKRSQQTVIPNIGSRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRTGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'VIC68_792'        QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQNGDSYACKRGSVKSFFSRLNWLHESEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDREQTSLYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRTGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'SAS68_692'        QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQNGDSYACKRGSVKSFFSRLNWLHESEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDREQTSLYIRASGRVTVSTKRSQQTVIPNIGSRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRTGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'BE47_292'         QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQNGDSYACKRGSVKSFFSRLNWLHESEYKYPALNVTMPNNDKFDKLYIWGIHHPITDREQTSLYIRASGRVTVSTKRSQQTVIPNIGSRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRTGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'SP118_293'        QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLMDALLGDPHCDGFQNKEWDLFVERNKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQNGDSYACKRGSVKSFFSRLNWLHESEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDREQTSLYIRASGRVTVSTKRSQQTVIPNIGSRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRTGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'WE66_692'         QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVPQNGDSYACKRGSVKSFFSRLNWLHESEYKYPTLNVTMPNNDKFDKLYIWGVHHPSTDREQTSLYIRASGRVTVSTKRSQQTVIPNIGSRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRTGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'DJ3946_1292'      QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDDFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQSGDSYACKRGSVKSFFSRLNWLHESEYKYPSLNVTMPNNDKFDKLYIWGVHHPSTDREQTSLYIRASGRVTVSTKRSQQTVIPNIGSRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRTGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'SN8_492'          QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGKICDSPHRILDGKNCTLIDALLGDPHCDDFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQSGDSYACKRGSVKSFFSRLNWLHKPEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDREQTSLYIRASGRVTVSTKRSQQTVIPNIGSRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRTGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'RU3193'           QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDDFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFTNEDFNWTGVAQSGDSYACKRGSVKSFFSRLNWLHESEYKYPALNVTMPNNDKFDKLYIWGVHHPITDREQTSLYIRASGRVTVSTKRSQQTVIPNIGSRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRTGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNRITYGACPRYVNQNTLKLATGMRNVPEKQTR
+	'UMEA1_1192'       QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGKICDSPHRILDGKNCTLIDALLGDPHCDDFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQSGDSYACKRGSVKSFFSRLNWLHESEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDREQTSLYIRASGRVTVSTKRSQQTVIPNIGSRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRTGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'UMEA2_1192'       QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGKICDSPHRILDGKNCTLIDALLGDPHCDDFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQSGDSYACKRGSVKSFFSRLNWLHESEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDREQTSLYIRASGRVTVSTKRSQQTVIPNIGSRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRTGKSSIMRSDATIGTCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'II236_1193'       QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWAGVAQSGDSYACKRGSVKSFFSRLNWLHKSEYKYPALNVTMPNNEKFDKLYIWGVHHPSTDREQTSLYIRASGRVTVSTKRSQQTVIPNIGSRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRTGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'II237_1193'       QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQSGDSYACKRGSVKSFFSRLNWLHKSEYKYPALNVTMPNNEKFDKLYIWGVHHPSTDREQTSLYIRASGRVTVSTKRSQQTVIPNIGFRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRTGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNRITYGACPRYVNQNTLKLATGMRNVPEKQTR
+	'KA149_1092'       QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQSGDSYACKRGSVKSFFSRLNWLHESEYKYPALNVTMPNNEKFDKLYIWGVHHPSTDREQTNLYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRTGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'PS8091'           QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQSGDSYACKRGSVKSFFSRLNWLHESEYKYPALNVTMPNNDKFDKLYIWGVHHPITDREQTSLYIRASGRVTVSTKRSQQTVIPNIGSRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRTGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'TW114391_192'     QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDDFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQSGDSYACKRGSVKSFFSRLNWLHESEYKYPALNVTMPNNGKFDKLYIWGVHHPITDREQTRLYIRASGRVTVSTKRSQQTVIPNIGSRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRTGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'EN26191'          QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQSGESYTCKRGSVKSFFSRLNWLHESEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDREQTSLYIRASGRVTVSTKRSQQTVIPNIGSRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRTGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'IN3_991'          QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQSGESYACKRGSVKSFFSRLNWLHESEYKYPALNVTMPNNGKFDKLYIWGVHHPITDREQTSLYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRTGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'SHIGA291'         QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQSGESYACKRGSVKSFFSRLNWLHESEYKYPALNVTMPNNGKFDKLYIWGVHHPITDREQTSLYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRTGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'HW1_291'          QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQSGESYACKRGSVKSFFSRLNWLHKSEYKYPALNVTMPNNGKFDKLYIWGVHHPSTDREQTSLYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRTGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'SH6_490'          QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQSGESYACKRGSVKSFFSRLNWLHKSEYKYPALNVTMPNNGKFDKLYIWGVHHPSTDREQTSLYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRTGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'BZ91'             QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQSGESYACKRGSVKSFFSRLNWLHKSEYKYPALNVTMPNNGKFDKLYIWGVHHPITDREQTSLYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRTGKSSIMRSDAPIGTCNSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'PR1_1090'         QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQSGESYACKRGSVKSFFSRLNWLHESEYKYPALNVTMPNNGKFDKLYIWGVHHPITDREQTSLYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRTGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'MX3255_194'       QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQSGESYACKRGSVKSFFSRLNWLHESDYKYPALNVTMPNNGKFDKLYIWGVHHPSTDREQTSLYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRTGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'SD1_491'          QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQSGESYACKRGSVKSFFSRLNWLHESDYKYPALNVTMPNNGKFDKLYIWGVHHPSTDREQTSLYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRTGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'SOFIA15593'       QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQSGESYACKRGSVKSFFSRLNWLHESDYKYPALNVTMPNNGKFDKLYIWGVHHPITDREQTSLYVRASGRVTVSTKRSQQTVIPNIGYRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRTGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'WA1591'           QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQSGESYACKRGSVKSFFSRLNWLHESDYKYPALNVTMPNNGKFDKLYIWGVHHPITDREQTSLYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRTGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'SEOUL45_1191'     QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQSGESYACKRGSVKSFFSRLNWLHESDYKYPALNVTMPNNGKFDKLYIWGVHHPITDREQTSLYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRTGKSSIMKSDAPIGTCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'PA09_1191'        QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSTTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFTNEDFNWTGVAQSGESYACKRGSVKSFFSRLNWLHESDYKYPALNVTMPNNGKFDKLYIWGVHHPITDREQTSLYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRTGKSSIMKSDAPIGTCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'SAS36_592'        QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFTNEDFNWTGVAQSGESYACKRGSVKSFFSRLNWLHESDYKYPALNVTMPNNGKFDKLYIWGVHHPSTDREQTSLYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRTGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'BE353_1289'       QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQSGESYACKRGSVKSFFSRLNWLHESEYKYPALNVTMPNNGKFDKLYIWGVHHPITDREQTNLYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRTGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'SHA1_289'         QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQSGGSYACKRGSVNSFFSRLNWLHESEYKYPALNVTMPNNGKFDKLYIWGVHHPITDREQTNLYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRTGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'SHA16_989'        QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQSGGSYACKRGSVNSFFSRLNWLHESEHKYPALNVTMPNNGKFDKLYIWGVHHPITDREQTNLYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRTGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'GUA39_689'        QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQSGGSYACKRGSVNSFFSRLNWLHESEHKYPALNVTMPNNGKFDKLYIWGVHHPITDREQTNLYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKMRTGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'GUA_389'          QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQSGGSYACKRGSVNSFFSRLNWLHESEHKYPALNVTMPNNGKFDKLYIWGVHHPITDREQTNLYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRTGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'BE57_189'         QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQSGGSYACKRGSVNSFFSRLNWLHESEYKYPALNVTMPNNGKFDKLYIWGVHHPITDREQTNLYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRTGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'SIC89'            QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVESSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQSGGSYACKRGSVNSFFSRLNWLHESEYKYPALNVTMPNNGKFDKLYIWGVHHPITDREQTNLYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRTGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'ENG64889'         QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQSGGSYACKRGSVKSFFSRLNWLHESEYKYPALNVTMPNNGKFDKLYIWGVHHPITDREQTNLYIRASGRVTVSTKRSQQTVIPNIGSRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRTGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'GZ54_489'         QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVHSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQSGGSYACKRGSINSFFSRLNWLHESEHKYPALNVTMPNNGKFDKLYIWGVHHPITDREQTNLYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRTGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'VIC589'           QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQSGESCACKRGSVNSFFSRLNWLHESEYKYPALNVTMPNNDKFDKLYIWGVHHPSTDREQTNLYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGQSSRISIYWTIVKPGDILLINSIGNLIAPRGYFKIRTGKSSIMRSDAPIGICSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'BE4_189'          QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQSGGSYACKRGSVNSFFSRLNWLHKSEYKYPALNVTMPNNGKFDKLYIWGVHHPSTDREQTNLYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRTGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'ENG88'            QKLPGNDNSTATLCSGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQSGGSYACKRGSVNSFFSRLNWLHESEYKYPALNVTMPNNGKFDKLYIWGVHHPSTDREQTNLYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRTGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'DL19_389'         QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKEWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVAQSGGSYACKRGSVNSFFSRLNWLHKSEYKYPALNVTMPNNGKFDKLYIWGVHHPSTDREQTNLYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGQSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRTGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'KB_288'           QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNKKWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVTQSGGSYTCKRGSVNSFFSRLNWLHESEYKYPALNVTMPNNGKFDKLYIWGVHHPSTDREQTNLYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRTGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNKITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'TX_39989_288'     QKLPGDDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNEKWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVTQSGGSYACKRGSVNSFFSRLNWLHESEYKYPALNVTMPNNGKFDKLYIWGVQHPSTDKEQTNLYARSSGRVTVSTERSQ?TVIPNIGSRPWVRALSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRTGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNKITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'TY5_1287'         QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGIICDSPHRILDGKNCTLIDALLGDPHCDGFQNEKWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVTQSGGSYTCKRGSVNSFFSRLNWLHESEYKYPALNVTMPNNGKSDKLYIWGVHHPSTDREQTNLYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRTGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNKITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'TY6_1287'         QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGIICDSPHRILDGKNCTLIDALLGDPHCDGFQNEKWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVTQSGGSYACKRGSVNSFFSRLNWLHESEYKYPALNVTMPNNGKFDKLYIWGVHHPITDREQTNLYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRTGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNKITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'SYD_1287'         QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNEKWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVTQSGGSYSCKRGSVNSFFSRLNWLHESEYKYPALNVTMPNNGKFDKLYIWGVHHPSTDREQTKLYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRTGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNKITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'CB_188'           QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNEKWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVTQSGGSYACKRGSVNSFFSRLNWLHESEYKYPALNVTMPNNGKFDKLYIWGVHHPSTDREQTNLYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRTGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNKITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'GC_987'           QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNEKWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVTQSGGSYACKRGSVNSFFSRLNWLHKSEYKYPALNVTMPNNGKFDKLYIWGVHHPVTDREQTNLYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRTGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNKITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'SIC_487'          QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNEKWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVTQSGGSYACKRGSVNSFFSRLNWLHKSEYKYPALNVTMPNNGKFDKLYIWGVHHPVTDREQTNLYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRTGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNKITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'GZ187'            QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNEKWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVTQGGGSYSCKRGSVNSFFSRLNWLHESECKYPALNVTMPNNGKFDKLYIWGVHHPSTDREQTNLYVRASGRVTVSTKRSQQAVIPNIGSRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRTGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNKITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'QL_987'           QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNEKWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVTQSGGSYSCKRGSVNSFFSRLNWLHESEYKYPALNVTMPNNGKFDKLYIWGVHHPSTDREQTNLYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRTGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNKITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'LA_1287'          QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNEKWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVTQSGGSYACKRGSVNSFFSRLNWLHESEYKYPALNVTMPNNGKFDKLYIWGVHHPITDREQTNLYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRTGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNKITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'SHA_887'          QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNEKWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVTQSGGSYACKRGSVNSFFSRLNWLHESEYKYPALNVTMPNNGKFDKLYIWGVHHPSTDREQTNLYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGLSSRISIYWTIVKPGDILLINRTGNLIAPRGYFKIRTGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNKITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'CO_1187'          QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNEKWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVTQSGGSYACKRGSVNSFFSRLNWLHVSEYKYPALNVTMPNNGKFDKLYIWGVHHPSTDREQTKLYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRTGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNKITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'VIC87'            QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNEKWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVTQSGGSYACKRGSVNSFFSRLNWLHESEYKYPALNVTMPNNGKFDKLYIWGVHHPSTDREQTNLYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRTGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNKITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'FO_1185'          QKLPGNDNSKATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNEKWDLFVERSKAFSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVTQSGGSYACKRGSVNSFFSRLNWLHESEYKYPALNVTMPNNGKFDKLYIWGVHHPSTDKEQTKLYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGLSSGISIYWTIVKPGDILLINSIGNLIAPRGYFKIRTGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNKITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'YN_1185'          QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNEKWDLFVERSKAFSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVTQSGGSYACKRGSVNSFFSRLNWLHKSEYKYPALNVTMPNNGNFDKLYIWGVHHPSTDKEQTNLYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRTGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNKITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'CC185'            QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNEKWDLFVERSKAFSNCYPYDVPDYASLRSLVASSGTLEFINEGFNWTGVTQSGGSYACKRGSVNSFFSRLNWLYGSESKYPALNVTMPNNGKFDKLYIWGVHHPSTDKEQTNLYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGLSSRISIYWTIVKPGDILLISSTGNLIAPRGYFKIRTGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNKITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'CC485'            QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNEKWDLFVERSKAFSNCYPYDVPDYASLRSLVASSGTLEFINEGFNWTGVTQSGGSYACKRGSVNSFFSRLNWLYGSEYKYPALNVTMPNNGKFDKLYIWGVHHPSTDKEQTNLYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGLSSRISIYWTIVKPGDILLISSTGNLIAPRGYFKIRTGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNKITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'UY3_688'          QKMPGNDNSTATLCLGHHAVPNRTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNEKWDLFVERSKAFSNCYPYDVPDYASLRSLVASSGTLEFINEDFNWTGVTQSGGSCACKRGSVNSFFSRLNWLYESEYKYPALNVTMPNNGKFDKLYIWGVHHPSTDKEQTNLYVRASGRVIVSTKRSQQTVVPNIGSRPWVRGLSSRISIYWTIVKPGDILLISSTGNLIAPRGYFKIRTGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNRITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'CC_688'           QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNEKWDLFIERSKAFSNCYPYDVPDYASLRSLVASSGTLEFINEGFNWTGVTQNGGSYACKRGSVNSFFSRLNWLYESEYKYPALNVTMPNNGKFDKLYIWGVHHPITEKEQTNLYVRASGRVTVSTKRSQQTRIPNIGSRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRTGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNKITYGACPRYGKQNTLKLATGMRNVPEKQTR
+	'YG_585'           QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNEKWDLFIERSKAFSNCYPYDVPDYASLRSLVASSGTLEFINEGFNWTGVTQNGGSYACKRGSVNSFFSRLNWLYESEYKYPALNVTMPNNGKFDKLYIWGVHHPSTEKEQTNLYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGLSTRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRTGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNKITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'CZ86'             QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNEKWDLFIERSKAFSNCYPYDVPDYASLRSLVASSGTLEFINEGFNWTGVTQSGGSYACKRGSVNSFFSRLNWLYESEYKYPALNVTMPNNGKFDKLYIWGVHHPITEKEQTNLYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRTGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNKITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'ST_185'           QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNEKWDLFIERSKAFSNCYPYDVPDYASLRSLVASSGTLEFINEGFNWTGVTQSGGSYACKRGSVNSFFSRLNWLYESEYKYPALNVTMPNNGKFDKLYIWGVHHPITEKEQTNLYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRTGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNKITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'GM_1185'          QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNEKWDLFIERSKAFSNCYPYDVPDYASLRSLVASSGTLEFINEGFNWTGVTQSGGSYACKRGSVNSFFSRLNWLYKSEYKYPALNVTMPNNGKFDKLYIWGVHHPSTEKEQTNLYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRTGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNKITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'LN_286'           QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNEKWDLFIERSKAFSNCYPYDVPDYASLRSLVASSGTLEFINEGFNWTGVTQSGGSYTCKRGSVNSFFSRLNWLYESEYKYPALNVTMPNNGKFDKLYIWGVHHPSTEKEQTNLYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRTGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNKITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'BK_785'           QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNEKWDLFVERSKAFSNCYPYDVPDYASLRSLVASSGTLEFINEGFNWTGVTQSGGSYACKRGSVNSFFSRLNWLYKSEYKYPALNVTMPNNGKFDKLYIWGVHHPSTEKEQTNLYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRTGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNKITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'BK25_785'         QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNEKWDLFVERSKAFSNCYPYDVPDYASLRSLVASSGTLEFINEGFNWTGVTQSGGSYSCKRGSVNSFFSRLNWLYESEYKYPALNVTMPNNGKFDKLYIWGVHHPSTEKEQTKLYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRTGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNKITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'YH_1085'          QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNEKWDLFVERSKAFSNCYPYDVPDYASLRSLVASSGTLEFINEGFNWTGVTQSGGSYACKRGSVNSFFSRLNWLYGSEYKYPALNVTMPNNGKFDKLYIWGVHHPSTEKEQTNLYARASGRVTVSTKRSQQTVIPNIGSRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKLRTGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNKITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'TG_885'           QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSIGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNEKWDLFVERSKAFSNCYPYDVPDYASLRSLVASSGTLEFINEGFNWTGVTQSGGSSACKRGSVNSFFSRLNWLYKSEYKYPALNVTMPNNGKFDKLYIWGVHHPSTDKEQTNLYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRTGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNKITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'TX_12764_483'     QNLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNEKWDLFVERSKAFSNCYPYDVPDYASLRSLVASSGTLEFINEGFNWTGVTQSGGSYACKRGSVNSFFSRLNWLYESESKYPALNVTMPNNGKFDKLYIWGVHHPSTDKEQTNLYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRTGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNKITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'TX_25784_385'     QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNEKWDLFVERSKAFSNCYPYDVPDYASLRSLVASSGTLEFINEGFNWTGVTQSGGSYACKRGSVNSFFSRLNWLYESESKYPALNVTMPNNGKFDKLYIWGVHHPSTDKEQTNLYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRTGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNKITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'MS85'             QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNEKWDLFVERSKAFSNCYPYDVPDYASLRSLVASSGTLEFINEGFNWTGVTQSGGSYACKRGSVNSFFSRLNWLYKSESKYPALNVTMPNNGKFDKLYIWGVHHPSTDKEQTNLYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGQSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRTGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNKITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'TX_24753_185'     QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNEKWDLFVERSKAFSNCYPYDVPDYASLRSLVASSGTLEFINEGFNWTGVTQSGGSYACKRGSVNSFFSRLNWLYESESNYPALNVTMPNNGKFDKLYIWGVHHPSTDKEQTNLYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRTGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNKITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'TX_25887_285'     QNLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNEKWDLFVERSKAFSNCYPYDVPDYASLRSLVASSGTLEFINEGFNWTGVTQSGGSYSCKRGSVNSFFSRLNWLYESESKYPALNVTMPNNGKFDKLYIWGVHHPCTDKEQTNLYVRASGRVTVSTKRSQQTVIPNIGPRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRTGKSSIMRSDAPIGTCSSGCITPNGSIPNDKPFQNVNKITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'SH_185'           QKLPGNDNSTATLCLGHHAVPNGTLVKTITNEQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNEKWDLFVERGKAFSNCYPYDVPDYASLRSLVASSGTLEFINEGFNWTGVTQSGGSYACKRGSVNSFFSRLNWLYKSESKYPALNVTMPNNGKFDKLYIWGVHHPSTDKEQTNLYVRASGRVTVSTKRSQQTVIPNIGPRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIHTGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNKITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'US85'             QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNEKWDLFVERGKAFSNCYPYDVPDYASLRSLVASSGTLEFINEGFNWTGVTQSGGSYACRRGSVNSFFSRLNWLYESESKYPALNVTMPNNGKFDKLYIWGVHHPSTDKEQTKLYVRASGRVTVSTKRSQQTVIPNIGPRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIHTGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNKITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'AK_1284'          Q?LPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNEKWDLFVERSKAFSNCYPYDVPDYASLRSLVASSGTLEFINEGFNWTGVTQSGGSYACKRGSVNSFFSRLNWLYESESKYPALNVTMPNNGKFDKLYIWGVHHPITDKEQTNLYVRASGRVTVSTKRSQQTVIPNIGPRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRTGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNKITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'TX_12835_583'     QNLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNEKWDLFVERSKAFSNCYPYDVPDYVSLRSLVASSGTLEFINEGFNWTGVTQSGGSYACKRGSDNSFFSRLNWLYESESKYHVLNVTMPNNGNFDKLYIWGVHHPSTDKEQTNLYVRASGRVTVSTKRSQQTVIPNIGPRPWVRGLSSRISIYWTIVKPGDILLINSSGNLIAPRGYFKIRTGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNKITYGACPKYVKQNTLKLATGMRNIPEKQTR
+	'GZ3_187'          QNLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNEKWDLFVERSKAFSNCYPYDVPDYASLRSLVASSGTLEFINEGFNWTGVTQSGGSYACKRGSDKSFFSRLNWLYESESKYPALNVTMPNNGNFDKLYIWGVHHPSTDKEQTNLYVRASGRVTVSTKRSQQTIIPNIGPRPWVRGLSSRISIYWTIVKPGDILLINSIGNLIAPRGYFKIRTGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNKITYGACPKYVKQNTLKLATGMRNIPEKQTR
+	'CM_885'           QNLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNEKWDLFVERSKAFSNCYPYDVPDYASLRSLVASSGTLEFINEGFNWTGVTQSGGSSTCKRGSNNSFFSRLNWLYESESKYPVLNVTMPNNGKFDKLYIWGIHHPSTDKEQTNLYIRASGRVTVSTKRSQQTVIPNIGSIPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRTGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNKITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'TX_17988_184'     QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNEKWDLFVERSKAFSNCYPYDVPDYVSLRSLVASSGTLEFTNEGFNWTGVTQSGGSYACKRGSVNSFFSRLNWLYESESKYPVLNVSMPNNGKLDKLYIWGVHHPSTDKVQTNLYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRTGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNKITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'TX_18088_184'     QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNEKWDLFVERSKAFSNCYPYDVPDYASLRSLVASSGTLEFTNEGFNWTGVTQSGGSYACKRGSVNSFFSRLNWLYESESKYPVLNVTMPNNGKFDKLYIWGVHHPSTDKEQTNLYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRTGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNKITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'TX_18733_184'     QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSLHRILDGKNCTLIDALLGDPHCDGFQNEKWDLFVERSKAFSNCYPYDVPDYASLRSLVASSGTLEFTNEGFNWTGVTQSGGSYACKRGSVNSFFSRLNWLYESESKYPVLNVTMPNNGKFDKLYIWGVHHPSTDKEQTNLYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRTGKSSIMRSDAPIGTCSSECVTPNGSIPNDKPFQNVNKITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'TX_24752_185'     QKLPGNDDSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNEKWDLFVERSKAFSNCYPYDVPDYASLRSLVASSGTLEFINEGFNWTGVTQSGGSYACKRGSVNSFFSRLNWLYESESKYPVLNVTMPNNGKFDKLYIWGVHHPSTDKEQTNLYVRASGKVTVSTKRSQQTVIPNIGSRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRTGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNKITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'NJ_185'           QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNEKWDLFVERSKAFSNCYPYDVPDYASLRSLVASSGTLEFINEGFNWTGVTQSGGSYACKRGSVNSFFSRLNWLYESESKYPVLNVTMPNNGKFDKLYIWGVHHPSTDKEQTNLYVRASGKVTVSTKRSQQTVIPNIGSRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRTGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNKITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'MI_185'           QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNEKWDLFVERSKAFSNCYPYDVPDYASLRSLVASSGTLEFINEGFNWTGVTQSGGSYACKRGSVNSFFSRLNWLYESESKYPVLNVTMPNNGKFDKLYIWGVHHPSTDKEQTNLYVRASGKVTVSTKRSQQTVIPNIGSRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRTGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNKITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'CT_385'           Q?LPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNEKWDLFVERSKAFSNCYPYDVPDYASLRSLVASSGTLEFINEGFNWTGVTQNGGSYACKRGSVNSFFSKLNWLYESEYKYPVLNVTMPNNGKFDKLYIWGVHHPITDKEQTNLYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRTGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNKITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'CAEN184'          QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNEKWDLFVERSKAYSNCYPYDVPDYASLRSLVASSGTLEFINEGFNWTGVTQSGGSYACKRGSVNSFFSRLNWLYKSESKYPVLNVTMPNNGKFDKLYIWGVHHPSTDKEQTNLYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRTGKSSIMRSDAPIGTCSYECITPNGSIPNDKPFQNVNKITYGACPRYVKQNTLKLATGMRNVPEKQTR
+	'OITA83'           QKLPGNDNSTATLCLGHHAVPNGTLVKTITNDQIEVTNATELVQSSSTGRICDSPHRILDGKNCTLIDALLGDPHCDGFQNEKWDLFVERSKAFSNCYPYDVPDYASLRSLVASSGTLEFINEGFNWTGVTQSGGSYACKRGSVNSFFSRLNWLYKSESKYPVLNVTMPNNGKFDKLYIWGVHHPSTDKEQTNLYVRASGRVTVSTKRSQQTVIPNIGSRPWVRGLSSRISIYWTIVKPGDILLINSTGNLIAPRGYFKIRTGKSSIMRSDAPIGTCSSECITPNGSIPNDKPFQNVNKITYGACPRYVKQNTLKLATGMRNVPEKQTR;
+END;
+
+BEGIN TREES;
+	TREE tree = ((((((((((((((((((CO_1187,SHA_887),LA_1287),(GZ187,QL_987)),VIC87),((((((TX_12764_483,((TX_24753_185,TX_25784_385),MS85)),((((((TX_18088_184,(TX_18733_184,TX_17988_184)),(CM_885,(GZ3_187,TX_12835_583))),OITA83),(((MI_185,NJ_185),TX_24752_185),CT_385)),CAEN184),((((VAL_491,SH_185),US85),TX_25887_285),AK_1284))),TG_885),((CC185,CC485),UY3_688)),(BK_785,((BK25_785,(((LN_286,(ST_185,CZ86)),GM_1185),YH_1085)),(YG_585,CC_688)))),(YN_1185,FO_1185))),((((TY6_1287,TY5_1287),SYD_1287) [...]
+END;
+
+BEGIN HYPHY;
+
+IntermediateCodon_AA_part_Jones={20,20};
+IntermediateCodon_AA_part_Jones[0][1]:=t*0.056;
+IntermediateCodon_AA_part_Jones[0][2]:=t*0.081;
+IntermediateCodon_AA_part_Jones[0][3]:=t*0.105;
+IntermediateCodon_AA_part_Jones[0][4]:=t*0.015;
+IntermediateCodon_AA_part_Jones[0][5]:=t*0.179;
+IntermediateCodon_AA_part_Jones[0][6]:=t*0.027;
+IntermediateCodon_AA_part_Jones[0][7]:=t*0.036;
+IntermediateCodon_AA_part_Jones[0][8]:=t*0.035;
+IntermediateCodon_AA_part_Jones[0][9]:=t*0.03;
+IntermediateCodon_AA_part_Jones[0][10]:=t*0.054;
+IntermediateCodon_AA_part_Jones[0][11]:=t*0.054;
+IntermediateCodon_AA_part_Jones[0][12]:=t*0.194;
+IntermediateCodon_AA_part_Jones[0][13]:=t*0.057;
+IntermediateCodon_AA_part_Jones[0][14]:=t*0.058;
+IntermediateCodon_AA_part_Jones[0][15]:=t*0.378;
+IntermediateCodon_AA_part_Jones[0][16]:=t*0.475;
+IntermediateCodon_AA_part_Jones[0][17]:=t*0.298;
+IntermediateCodon_AA_part_Jones[0][18]:=t*0.009;
+IntermediateCodon_AA_part_Jones[0][19]:=t*0.011;
+IntermediateCodon_AA_part_Jones[1][0]:=t*0.056;
+IntermediateCodon_AA_part_Jones[1][2]:=t*0.01;
+IntermediateCodon_AA_part_Jones[1][3]:=t*0.005;
+IntermediateCodon_AA_part_Jones[1][4]:=t*0.078;
+IntermediateCodon_AA_part_Jones[1][5]:=t*0.059;
+IntermediateCodon_AA_part_Jones[1][6]:=t*0.069;
+IntermediateCodon_AA_part_Jones[1][7]:=t*0.017;
+IntermediateCodon_AA_part_Jones[1][8]:=t*0.007;
+IntermediateCodon_AA_part_Jones[1][9]:=t*0.023;
+IntermediateCodon_AA_part_Jones[1][10]:=t*0.031;
+IntermediateCodon_AA_part_Jones[1][11]:=t*0.034;
+IntermediateCodon_AA_part_Jones[1][12]:=t*0.014;
+IntermediateCodon_AA_part_Jones[1][13]:=t*0.009;
+IntermediateCodon_AA_part_Jones[1][14]:=t*0.113;
+IntermediateCodon_AA_part_Jones[1][15]:=t*0.223;
+IntermediateCodon_AA_part_Jones[1][16]:=t*0.042;
+IntermediateCodon_AA_part_Jones[1][17]:=t*0.062;
+IntermediateCodon_AA_part_Jones[1][18]:=t*0.115;
+IntermediateCodon_AA_part_Jones[1][19]:=t*0.209;
+IntermediateCodon_AA_part_Jones[2][0]:=t*0.081;
+IntermediateCodon_AA_part_Jones[2][1]:=t*0.01;
+IntermediateCodon_AA_part_Jones[2][3]:=t*0.767;
+IntermediateCodon_AA_part_Jones[2][4]:=t*0.004;
+IntermediateCodon_AA_part_Jones[2][5]:=t*0.13;
+IntermediateCodon_AA_part_Jones[2][6]:=t*0.112;
+IntermediateCodon_AA_part_Jones[2][7]:=t*0.011;
+IntermediateCodon_AA_part_Jones[2][8]:=t*0.026;
+IntermediateCodon_AA_part_Jones[2][9]:=t*0.007;
+IntermediateCodon_AA_part_Jones[2][10]:=t*0.015;
+IntermediateCodon_AA_part_Jones[2][11]:=t*0.528;
+IntermediateCodon_AA_part_Jones[2][12]:=t*0.015;
+IntermediateCodon_AA_part_Jones[2][13]:=t*0.049;
+IntermediateCodon_AA_part_Jones[2][14]:=t*0.016;
+IntermediateCodon_AA_part_Jones[2][15]:=t*0.059;
+IntermediateCodon_AA_part_Jones[2][16]:=t*0.038;
+IntermediateCodon_AA_part_Jones[2][17]:=t*0.031;
+IntermediateCodon_AA_part_Jones[2][18]:=t*0.004;
+IntermediateCodon_AA_part_Jones[2][19]:=t*0.046;
+IntermediateCodon_AA_part_Jones[3][0]:=t*0.105;
+IntermediateCodon_AA_part_Jones[3][1]:=t*0.005;
+IntermediateCodon_AA_part_Jones[3][2]:=t*0.767;
+IntermediateCodon_AA_part_Jones[3][4]:=t*0.005;
+IntermediateCodon_AA_part_Jones[3][5]:=t*0.119;
+IntermediateCodon_AA_part_Jones[3][6]:=t*0.026;
+IntermediateCodon_AA_part_Jones[3][7]:=t*0.012;
+IntermediateCodon_AA_part_Jones[3][8]:=t*0.181;
+IntermediateCodon_AA_part_Jones[3][9]:=t*0.009;
+IntermediateCodon_AA_part_Jones[3][10]:=t*0.018;
+IntermediateCodon_AA_part_Jones[3][11]:=t*0.058;
+IntermediateCodon_AA_part_Jones[3][12]:=t*0.018;
+IntermediateCodon_AA_part_Jones[3][13]:=t*0.323;
+IntermediateCodon_AA_part_Jones[3][14]:=t*0.029;
+IntermediateCodon_AA_part_Jones[3][15]:=t*0.03;
+IntermediateCodon_AA_part_Jones[3][16]:=t*0.032;
+IntermediateCodon_AA_part_Jones[3][17]:=t*0.045;
+IntermediateCodon_AA_part_Jones[3][18]:=t*0.01;
+IntermediateCodon_AA_part_Jones[3][19]:=t*0.007;
+IntermediateCodon_AA_part_Jones[4][0]:=t*0.015;
+IntermediateCodon_AA_part_Jones[4][1]:=t*0.078;
+IntermediateCodon_AA_part_Jones[4][2]:=t*0.004;
+IntermediateCodon_AA_part_Jones[4][3]:=t*0.005;
+IntermediateCodon_AA_part_Jones[4][5]:=t*0.005;
+IntermediateCodon_AA_part_Jones[4][6]:=t*0.04;
+IntermediateCodon_AA_part_Jones[4][7]:=t*0.089;
+IntermediateCodon_AA_part_Jones[4][8]:=t*0.004;
+IntermediateCodon_AA_part_Jones[4][9]:=t*0.248;
+IntermediateCodon_AA_part_Jones[4][10]:=t*0.043;
+IntermediateCodon_AA_part_Jones[4][11]:=t*0.01;
+IntermediateCodon_AA_part_Jones[4][12]:=t*0.017;
+IntermediateCodon_AA_part_Jones[4][13]:=t*0.004;
+IntermediateCodon_AA_part_Jones[4][14]:=t*0.005;
+IntermediateCodon_AA_part_Jones[4][15]:=t*0.092;
+IntermediateCodon_AA_part_Jones[4][16]:=t*0.012;
+IntermediateCodon_AA_part_Jones[4][17]:=t*0.062;
+IntermediateCodon_AA_part_Jones[4][18]:=t*0.053;
+IntermediateCodon_AA_part_Jones[4][19]:=t*0.536;
+IntermediateCodon_AA_part_Jones[5][0]:=t*0.179;
+IntermediateCodon_AA_part_Jones[5][1]:=t*0.059;
+IntermediateCodon_AA_part_Jones[5][2]:=t*0.13;
+IntermediateCodon_AA_part_Jones[5][3]:=t*0.119;
+IntermediateCodon_AA_part_Jones[5][4]:=t*0.005;
+IntermediateCodon_AA_part_Jones[5][6]:=t*0.023;
+IntermediateCodon_AA_part_Jones[5][7]:=t*0.006;
+IntermediateCodon_AA_part_Jones[5][8]:=t*0.027;
+IntermediateCodon_AA_part_Jones[5][9]:=t*0.006;
+IntermediateCodon_AA_part_Jones[5][10]:=t*0.014;
+IntermediateCodon_AA_part_Jones[5][11]:=t*0.081;
+IntermediateCodon_AA_part_Jones[5][12]:=t*0.024;
+IntermediateCodon_AA_part_Jones[5][13]:=t*0.026;
+IntermediateCodon_AA_part_Jones[5][14]:=t*0.137;
+IntermediateCodon_AA_part_Jones[5][15]:=t*0.201;
+IntermediateCodon_AA_part_Jones[5][16]:=t*0.033;
+IntermediateCodon_AA_part_Jones[5][17]:=t*0.047;
+IntermediateCodon_AA_part_Jones[5][18]:=t*0.055;
+IntermediateCodon_AA_part_Jones[5][19]:=t*0.008;
+IntermediateCodon_AA_part_Jones[6][0]:=t*0.027;
+IntermediateCodon_AA_part_Jones[6][1]:=t*0.069;
+IntermediateCodon_AA_part_Jones[6][2]:=t*0.112;
+IntermediateCodon_AA_part_Jones[6][3]:=t*0.026;
+IntermediateCodon_AA_part_Jones[6][4]:=t*0.04;
+IntermediateCodon_AA_part_Jones[6][5]:=t*0.023;
+IntermediateCodon_AA_part_Jones[6][7]:=t*0.016;
+IntermediateCodon_AA_part_Jones[6][8]:=t*0.045;
+IntermediateCodon_AA_part_Jones[6][9]:=t*0.056;
+IntermediateCodon_AA_part_Jones[6][10]:=t*0.033;
+IntermediateCodon_AA_part_Jones[6][11]:=t*0.391;
+IntermediateCodon_AA_part_Jones[6][12]:=t*0.115;
+IntermediateCodon_AA_part_Jones[6][13]:=t*0.597;
+IntermediateCodon_AA_part_Jones[6][14]:=t*0.328;
+IntermediateCodon_AA_part_Jones[6][15]:=t*0.073;
+IntermediateCodon_AA_part_Jones[6][16]:=t*0.046;
+IntermediateCodon_AA_part_Jones[6][17]:=t*0.011;
+IntermediateCodon_AA_part_Jones[6][18]:=t*0.008;
+IntermediateCodon_AA_part_Jones[6][19]:=t*0.573;
+IntermediateCodon_AA_part_Jones[7][0]:=t*0.036;
+IntermediateCodon_AA_part_Jones[7][1]:=t*0.017;
+IntermediateCodon_AA_part_Jones[7][2]:=t*0.011;
+IntermediateCodon_AA_part_Jones[7][3]:=t*0.012;
+IntermediateCodon_AA_part_Jones[7][4]:=t*0.089;
+IntermediateCodon_AA_part_Jones[7][5]:=t*0.006;
+IntermediateCodon_AA_part_Jones[7][6]:=t*0.016;
+IntermediateCodon_AA_part_Jones[7][8]:=t*0.021;
+IntermediateCodon_AA_part_Jones[7][9]:=t*0.229;
+IntermediateCodon_AA_part_Jones[7][10]:=t*0.479;
+IntermediateCodon_AA_part_Jones[7][11]:=t*0.047;
+IntermediateCodon_AA_part_Jones[7][12]:=t*0.01;
+IntermediateCodon_AA_part_Jones[7][13]:=t*0.009;
+IntermediateCodon_AA_part_Jones[7][14]:=t*0.022;
+IntermediateCodon_AA_part_Jones[7][15]:=t*0.04;
+IntermediateCodon_AA_part_Jones[7][16]:=t*0.245;
+IntermediateCodon_AA_part_Jones[7][17]:=t*0.961;
+IntermediateCodon_AA_part_Jones[7][18]:=t*0.009;
+IntermediateCodon_AA_part_Jones[7][19]:=t*0.032;
+IntermediateCodon_AA_part_Jones[8][0]:=t*0.035;
+IntermediateCodon_AA_part_Jones[8][1]:=t*0.007;
+IntermediateCodon_AA_part_Jones[8][2]:=t*0.026;
+IntermediateCodon_AA_part_Jones[8][3]:=t*0.181;
+IntermediateCodon_AA_part_Jones[8][4]:=t*0.004;
+IntermediateCodon_AA_part_Jones[8][5]:=t*0.027;
+IntermediateCodon_AA_part_Jones[8][6]:=t*0.045;
+IntermediateCodon_AA_part_Jones[8][7]:=t*0.021;
+IntermediateCodon_AA_part_Jones[8][9]:=t*0.014;
+IntermediateCodon_AA_part_Jones[8][10]:=t*0.065;
+IntermediateCodon_AA_part_Jones[8][11]:=t*0.263;
+IntermediateCodon_AA_part_Jones[8][12]:=t*0.021;
+IntermediateCodon_AA_part_Jones[8][13]:=t*0.292;
+IntermediateCodon_AA_part_Jones[8][14]:=t*0.646;
+IntermediateCodon_AA_part_Jones[8][15]:=t*0.047;
+IntermediateCodon_AA_part_Jones[8][16]:=t*0.103;
+IntermediateCodon_AA_part_Jones[8][17]:=t*0.014;
+IntermediateCodon_AA_part_Jones[8][18]:=t*0.01;
+IntermediateCodon_AA_part_Jones[8][19]:=t*0.008;
+IntermediateCodon_AA_part_Jones[9][0]:=t*0.03;
+IntermediateCodon_AA_part_Jones[9][1]:=t*0.023;
+IntermediateCodon_AA_part_Jones[9][2]:=t*0.007;
+IntermediateCodon_AA_part_Jones[9][3]:=t*0.009;
+IntermediateCodon_AA_part_Jones[9][4]:=t*0.248;
+IntermediateCodon_AA_part_Jones[9][5]:=t*0.006;
+IntermediateCodon_AA_part_Jones[9][6]:=t*0.056;
+IntermediateCodon_AA_part_Jones[9][7]:=t*0.229;
+IntermediateCodon_AA_part_Jones[9][8]:=t*0.014;
+IntermediateCodon_AA_part_Jones[9][10]:=t*0.388;
+IntermediateCodon_AA_part_Jones[9][11]:=t*0.012;
+IntermediateCodon_AA_part_Jones[9][12]:=t*0.102;
+IntermediateCodon_AA_part_Jones[9][13]:=t*0.072;
+IntermediateCodon_AA_part_Jones[9][14]:=t*0.038;
+IntermediateCodon_AA_part_Jones[9][15]:=t*0.059;
+IntermediateCodon_AA_part_Jones[9][16]:=t*0.025;
+IntermediateCodon_AA_part_Jones[9][17]:=t*0.18;
+IntermediateCodon_AA_part_Jones[9][18]:=t*0.052;
+IntermediateCodon_AA_part_Jones[9][19]:=t*0.024;
+IntermediateCodon_AA_part_Jones[10][0]:=t*0.054;
+IntermediateCodon_AA_part_Jones[10][1]:=t*0.031;
+IntermediateCodon_AA_part_Jones[10][2]:=t*0.015;
+IntermediateCodon_AA_part_Jones[10][3]:=t*0.018;
+IntermediateCodon_AA_part_Jones[10][4]:=t*0.043;
+IntermediateCodon_AA_part_Jones[10][5]:=t*0.014;
+IntermediateCodon_AA_part_Jones[10][6]:=t*0.033;
+IntermediateCodon_AA_part_Jones[10][7]:=t*0.479;
+IntermediateCodon_AA_part_Jones[10][8]:=t*0.065;
+IntermediateCodon_AA_part_Jones[10][9]:=t*0.388;
+IntermediateCodon_AA_part_Jones[10][11]:=t*0.03;
+IntermediateCodon_AA_part_Jones[10][12]:=t*0.016;
+IntermediateCodon_AA_part_Jones[10][13]:=t*0.043;
+IntermediateCodon_AA_part_Jones[10][14]:=t*0.044;
+IntermediateCodon_AA_part_Jones[10][15]:=t*0.029;
+IntermediateCodon_AA_part_Jones[10][16]:=t*0.226;
+IntermediateCodon_AA_part_Jones[10][17]:=t*0.323;
+IntermediateCodon_AA_part_Jones[10][18]:=t*0.024;
+IntermediateCodon_AA_part_Jones[10][19]:=t*0.018;
+IntermediateCodon_AA_part_Jones[11][0]:=t*0.054;
+IntermediateCodon_AA_part_Jones[11][1]:=t*0.034;
+IntermediateCodon_AA_part_Jones[11][2]:=t*0.528;
+IntermediateCodon_AA_part_Jones[11][3]:=t*0.058;
+IntermediateCodon_AA_part_Jones[11][4]:=t*0.01;
+IntermediateCodon_AA_part_Jones[11][5]:=t*0.081;
+IntermediateCodon_AA_part_Jones[11][6]:=t*0.391;
+IntermediateCodon_AA_part_Jones[11][7]:=t*0.047;
+IntermediateCodon_AA_part_Jones[11][8]:=t*0.263;
+IntermediateCodon_AA_part_Jones[11][9]:=t*0.012;
+IntermediateCodon_AA_part_Jones[11][10]:=t*0.03;
+IntermediateCodon_AA_part_Jones[11][12]:=t*0.015;
+IntermediateCodon_AA_part_Jones[11][13]:=t*0.086;
+IntermediateCodon_AA_part_Jones[11][14]:=t*0.045;
+IntermediateCodon_AA_part_Jones[11][15]:=t*0.503;
+IntermediateCodon_AA_part_Jones[11][16]:=t*0.232;
+IntermediateCodon_AA_part_Jones[11][17]:=t*0.016;
+IntermediateCodon_AA_part_Jones[11][18]:=t*0.008;
+IntermediateCodon_AA_part_Jones[11][19]:=t*0.07;
+IntermediateCodon_AA_part_Jones[12][0]:=t*0.194;
+IntermediateCodon_AA_part_Jones[12][1]:=t*0.014;
+IntermediateCodon_AA_part_Jones[12][2]:=t*0.015;
+IntermediateCodon_AA_part_Jones[12][3]:=t*0.018;
+IntermediateCodon_AA_part_Jones[12][4]:=t*0.017;
+IntermediateCodon_AA_part_Jones[12][5]:=t*0.024;
+IntermediateCodon_AA_part_Jones[12][6]:=t*0.115;
+IntermediateCodon_AA_part_Jones[12][7]:=t*0.01;
+IntermediateCodon_AA_part_Jones[12][8]:=t*0.021;
+IntermediateCodon_AA_part_Jones[12][9]:=t*0.102;
+IntermediateCodon_AA_part_Jones[12][10]:=t*0.016;
+IntermediateCodon_AA_part_Jones[12][11]:=t*0.015;
+IntermediateCodon_AA_part_Jones[12][13]:=t*0.164;
+IntermediateCodon_AA_part_Jones[12][14]:=t*0.074;
+IntermediateCodon_AA_part_Jones[12][15]:=t*0.285;
+IntermediateCodon_AA_part_Jones[12][16]:=t*0.118;
+IntermediateCodon_AA_part_Jones[12][17]:=t*0.023;
+IntermediateCodon_AA_part_Jones[12][18]:=t*0.006;
+IntermediateCodon_AA_part_Jones[12][19]:=t*0.01;
+IntermediateCodon_AA_part_Jones[13][0]:=t*0.057;
+IntermediateCodon_AA_part_Jones[13][1]:=t*0.009;
+IntermediateCodon_AA_part_Jones[13][2]:=t*0.049;
+IntermediateCodon_AA_part_Jones[13][3]:=t*0.323;
+IntermediateCodon_AA_part_Jones[13][4]:=t*0.004;
+IntermediateCodon_AA_part_Jones[13][5]:=t*0.026;
+IntermediateCodon_AA_part_Jones[13][6]:=t*0.597;
+IntermediateCodon_AA_part_Jones[13][7]:=t*0.009;
+IntermediateCodon_AA_part_Jones[13][8]:=t*0.292;
+IntermediateCodon_AA_part_Jones[13][9]:=t*0.072;
+IntermediateCodon_AA_part_Jones[13][10]:=t*0.043;
+IntermediateCodon_AA_part_Jones[13][11]:=t*0.086;
+IntermediateCodon_AA_part_Jones[13][12]:=t*0.164;
+IntermediateCodon_AA_part_Jones[13][14]:=t*0.31;
+IntermediateCodon_AA_part_Jones[13][15]:=t*0.053;
+IntermediateCodon_AA_part_Jones[13][16]:=t*0.051;
+IntermediateCodon_AA_part_Jones[13][17]:=t*0.02;
+IntermediateCodon_AA_part_Jones[13][18]:=t*0.018;
+IntermediateCodon_AA_part_Jones[13][19]:=t*0.024;
+IntermediateCodon_AA_part_Jones[14][0]:=t*0.058;
+IntermediateCodon_AA_part_Jones[14][1]:=t*0.113;
+IntermediateCodon_AA_part_Jones[14][2]:=t*0.016;
+IntermediateCodon_AA_part_Jones[14][3]:=t*0.029;
+IntermediateCodon_AA_part_Jones[14][4]:=t*0.005;
+IntermediateCodon_AA_part_Jones[14][5]:=t*0.137;
+IntermediateCodon_AA_part_Jones[14][6]:=t*0.328;
+IntermediateCodon_AA_part_Jones[14][7]:=t*0.022;
+IntermediateCodon_AA_part_Jones[14][8]:=t*0.646;
+IntermediateCodon_AA_part_Jones[14][9]:=t*0.038;
+IntermediateCodon_AA_part_Jones[14][10]:=t*0.044;
+IntermediateCodon_AA_part_Jones[14][11]:=t*0.045;
+IntermediateCodon_AA_part_Jones[14][12]:=t*0.074;
+IntermediateCodon_AA_part_Jones[14][13]:=t*0.31;
+IntermediateCodon_AA_part_Jones[14][15]:=t*0.101;
+IntermediateCodon_AA_part_Jones[14][16]:=t*0.064;
+IntermediateCodon_AA_part_Jones[14][17]:=t*0.017;
+IntermediateCodon_AA_part_Jones[14][18]:=t*0.126;
+IntermediateCodon_AA_part_Jones[14][19]:=t*0.02;
+IntermediateCodon_AA_part_Jones[15][0]:=t*0.378;
+IntermediateCodon_AA_part_Jones[15][1]:=t*0.223;
+IntermediateCodon_AA_part_Jones[15][2]:=t*0.059;
+IntermediateCodon_AA_part_Jones[15][3]:=t*0.03;
+IntermediateCodon_AA_part_Jones[15][4]:=t*0.092;
+IntermediateCodon_AA_part_Jones[15][5]:=t*0.201;
+IntermediateCodon_AA_part_Jones[15][6]:=t*0.073;
+IntermediateCodon_AA_part_Jones[15][7]:=t*0.04;
+IntermediateCodon_AA_part_Jones[15][8]:=t*0.047;
+IntermediateCodon_AA_part_Jones[15][9]:=t*0.059;
+IntermediateCodon_AA_part_Jones[15][10]:=t*0.029;
+IntermediateCodon_AA_part_Jones[15][11]:=t*0.503;
+IntermediateCodon_AA_part_Jones[15][12]:=t*0.285;
+IntermediateCodon_AA_part_Jones[15][13]:=t*0.053;
+IntermediateCodon_AA_part_Jones[15][14]:=t*0.101;
+IntermediateCodon_AA_part_Jones[15][16]:=t*0.477;
+IntermediateCodon_AA_part_Jones[15][17]:=t*0.038;
+IntermediateCodon_AA_part_Jones[15][18]:=t*0.035;
+IntermediateCodon_AA_part_Jones[15][19]:=t*0.063;
+IntermediateCodon_AA_part_Jones[16][0]:=t*0.475;
+IntermediateCodon_AA_part_Jones[16][1]:=t*0.042;
+IntermediateCodon_AA_part_Jones[16][2]:=t*0.038;
+IntermediateCodon_AA_part_Jones[16][3]:=t*0.032;
+IntermediateCodon_AA_part_Jones[16][4]:=t*0.012;
+IntermediateCodon_AA_part_Jones[16][5]:=t*0.033;
+IntermediateCodon_AA_part_Jones[16][6]:=t*0.046;
+IntermediateCodon_AA_part_Jones[16][7]:=t*0.245;
+IntermediateCodon_AA_part_Jones[16][8]:=t*0.103;
+IntermediateCodon_AA_part_Jones[16][9]:=t*0.025;
+IntermediateCodon_AA_part_Jones[16][10]:=t*0.226;
+IntermediateCodon_AA_part_Jones[16][11]:=t*0.232;
+IntermediateCodon_AA_part_Jones[16][12]:=t*0.118;
+IntermediateCodon_AA_part_Jones[16][13]:=t*0.051;
+IntermediateCodon_AA_part_Jones[16][14]:=t*0.064;
+IntermediateCodon_AA_part_Jones[16][15]:=t*0.477;
+IntermediateCodon_AA_part_Jones[16][17]:=t*0.112;
+IntermediateCodon_AA_part_Jones[16][18]:=t*0.012;
+IntermediateCodon_AA_part_Jones[16][19]:=t*0.021;
+IntermediateCodon_AA_part_Jones[17][0]:=t*0.298;
+IntermediateCodon_AA_part_Jones[17][1]:=t*0.062;
+IntermediateCodon_AA_part_Jones[17][2]:=t*0.031;
+IntermediateCodon_AA_part_Jones[17][3]:=t*0.045;
+IntermediateCodon_AA_part_Jones[17][4]:=t*0.062;
+IntermediateCodon_AA_part_Jones[17][5]:=t*0.047;
+IntermediateCodon_AA_part_Jones[17][6]:=t*0.011;
+IntermediateCodon_AA_part_Jones[17][7]:=t*0.961;
+IntermediateCodon_AA_part_Jones[17][8]:=t*0.014;
+IntermediateCodon_AA_part_Jones[17][9]:=t*0.18;
+IntermediateCodon_AA_part_Jones[17][10]:=t*0.323;
+IntermediateCodon_AA_part_Jones[17][11]:=t*0.016;
+IntermediateCodon_AA_part_Jones[17][12]:=t*0.023;
+IntermediateCodon_AA_part_Jones[17][13]:=t*0.02;
+IntermediateCodon_AA_part_Jones[17][14]:=t*0.017;
+IntermediateCodon_AA_part_Jones[17][15]:=t*0.038;
+IntermediateCodon_AA_part_Jones[17][16]:=t*0.112;
+IntermediateCodon_AA_part_Jones[17][18]:=t*0.025;
+IntermediateCodon_AA_part_Jones[17][19]:=t*0.016;
+IntermediateCodon_AA_part_Jones[18][0]:=t*0.009;
+IntermediateCodon_AA_part_Jones[18][1]:=t*0.115;
+IntermediateCodon_AA_part_Jones[18][2]:=t*0.004;
+IntermediateCodon_AA_part_Jones[18][3]:=t*0.01;
+IntermediateCodon_AA_part_Jones[18][4]:=t*0.053;
+IntermediateCodon_AA_part_Jones[18][5]:=t*0.055;
+IntermediateCodon_AA_part_Jones[18][6]:=t*0.008;
+IntermediateCodon_AA_part_Jones[18][7]:=t*0.009;
+IntermediateCodon_AA_part_Jones[18][8]:=t*0.01;
+IntermediateCodon_AA_part_Jones[18][9]:=t*0.052;
+IntermediateCodon_AA_part_Jones[18][10]:=t*0.024;
+IntermediateCodon_AA_part_Jones[18][11]:=t*0.008;
+IntermediateCodon_AA_part_Jones[18][12]:=t*0.006;
+IntermediateCodon_AA_part_Jones[18][13]:=t*0.018;
+IntermediateCodon_AA_part_Jones[18][14]:=t*0.126;
+IntermediateCodon_AA_part_Jones[18][15]:=t*0.035;
+IntermediateCodon_AA_part_Jones[18][16]:=t*0.012;
+IntermediateCodon_AA_part_Jones[18][17]:=t*0.025;
+IntermediateCodon_AA_part_Jones[18][19]:=t*0.071;
+IntermediateCodon_AA_part_Jones[19][0]:=t*0.011;
+IntermediateCodon_AA_part_Jones[19][1]:=t*0.209;
+IntermediateCodon_AA_part_Jones[19][2]:=t*0.046;
+IntermediateCodon_AA_part_Jones[19][3]:=t*0.007;
+IntermediateCodon_AA_part_Jones[19][4]:=t*0.536;
+IntermediateCodon_AA_part_Jones[19][5]:=t*0.008;
+IntermediateCodon_AA_part_Jones[19][6]:=t*0.573;
+IntermediateCodon_AA_part_Jones[19][7]:=t*0.032;
+IntermediateCodon_AA_part_Jones[19][8]:=t*0.008;
+IntermediateCodon_AA_part_Jones[19][9]:=t*0.024;
+IntermediateCodon_AA_part_Jones[19][10]:=t*0.018;
+IntermediateCodon_AA_part_Jones[19][11]:=t*0.07;
+IntermediateCodon_AA_part_Jones[19][12]:=t*0.01;
+IntermediateCodon_AA_part_Jones[19][13]:=t*0.024;
+IntermediateCodon_AA_part_Jones[19][14]:=t*0.02;
+IntermediateCodon_AA_part_Jones[19][15]:=t*0.063;
+IntermediateCodon_AA_part_Jones[19][16]:=t*0.021;
+IntermediateCodon_AA_part_Jones[19][17]:=t*0.016;
+IntermediateCodon_AA_part_Jones[19][18]:=t*0.071;
+
+IntermediateCodon_AA_part_Freqs={
+{          0.076748}
+{          0.019803}
+{          0.051544}
+{           0.06183}
+{          0.040126}
+{          0.073152}
+{          0.022944}
+{          0.053761}
+{          0.058676}
+{          0.091904}
+{          0.023826}
+{          0.042645}
+{          0.050901}
+{          0.040752}
+{          0.051691}
+{          0.068765}
+{          0.058565}
+{          0.066005}
+{          0.014261}
+{          0.032102}
+}
+;
+Model IntermediateCodon_AA_part_Jones_model=(IntermediateCodon_AA_part_Jones,IntermediateCodon_AA_part_Freqs);
+
+UseModel (IntermediateCodon_AA_part_Jones_model);
+Tree IntermediateCodon_tree=((((((((((((((((((CO_1187,SHA_887),LA_1287),(GZ187,QL_987)),VIC87),((((((TX_12764_483,((TX_24753_185,TX_25784_385),MS85)),((((((TX_18088_184,(TX_18733_184,TX_17988_184)),(CM_885,(GZ3_187,TX_12835_583))),OITA83),(((MI_185,NJ_185),TX_24752_185),CT_385)),CAEN184),((((VAL_491,SH_185),US85),TX_25887_285),AK_1284))),TG_885),((CC185,CC485),UY3_688)),(BK_785,((BK25_785,(((LN_286,(ST_185,CZ86)),GM_1185),YH_1085)),(YG_585,CC_688)))),(YN_1185,FO_1185))),((((TY6_1287,TY5_ [...]
+
+IntermediateCodon_tree.WUZ1_794.t=0;
+IntermediateCodon_tree.Node62.t=0;
+IntermediateCodon_tree.NY1393.t=0;
+IntermediateCodon_tree.Node223.t=0;
+IntermediateCodon_tree.Node44.t=0;
+IntermediateCodon_tree.PS8091.t=0;
+IntermediateCodon_tree.Node253.t=0;
+IntermediateCodon_tree.Node156.t=0;
+IntermediateCodon_tree.Node129.t=0;
+IntermediateCodon_tree.CM_885.t=0;
+IntermediateCodon_tree.NO93.t=0;
+IntermediateCodon_tree.Node294.t=0;
+IntermediateCodon_tree.GZ3_187.t=0;
+IntermediateCodon_tree.Node135.t=0;
+IntermediateCodon_tree.SH6_490.t=0;
+IntermediateCodon_tree.Node85.t=0;
+IntermediateCodon_tree.Node42.t=0;
+IntermediateCodon_tree.Node121.t=0;
+IntermediateCodon_tree.GUA39_689.t=0;
+IntermediateCodon_tree.Node163.t=0;
+IntermediateCodon_tree.Node33.t=0;
+IntermediateCodon_tree.US85.t=0;
+IntermediateCodon_tree.TX_39989_288.t=0;
+IntermediateCodon_tree.Node190.t=0;
+IntermediateCodon_tree.MI_185.t=0;
+IntermediateCodon_tree.PERTH01_492.t=0;
+IntermediateCodon_tree.Node327.t=0;
+IntermediateCodon_tree.MS85.t=0;
+IntermediateCodon_tree.Node90.t=0;
+IntermediateCodon_tree.Node193.t=0;
+IntermediateCodon_tree.Node315.t=0;
+IntermediateCodon_tree.SP378_195.t=0;
+IntermediateCodon_tree.GD25_693.t=0;
+IntermediateCodon_tree.Node81.t=0;
+IntermediateCodon_tree.SHA_887.t=0;
+IntermediateCodon_tree.Node79.t=0;
+IntermediateCodon_tree.YG_585.t=0;
+IntermediateCodon_tree.CC_688.t=0;
+IntermediateCodon_tree.Node306.t=0;
+IntermediateCodon_tree.Node82.t=0;
+IntermediateCodon_tree.QD53_392.t=0;
+IntermediateCodon_tree.TX_18733_184.t=0;
+IntermediateCodon_tree.Node83.t=0;
+IntermediateCodon_tree.GM_1185.t=0;
+IntermediateCodon_tree.TX_17988_184.t=0;
+IntermediateCodon_tree.Node237.t=0;
+IntermediateCodon_tree.TIANJIN3392.t=0;
+IntermediateCodon_tree.IL5_195.t=0;
+IntermediateCodon_tree.VIC193.t=0;
+IntermediateCodon_tree.YH_1085.t=0;
+IntermediateCodon_tree.LA4_893.t=0;
+IntermediateCodon_tree.Node64.t=0;
+IntermediateCodon_tree.CA271_1192.t=0;
+IntermediateCodon_tree.Node290.t=0;
+IntermediateCodon_tree.AK_1284.t=0;
+IntermediateCodon_tree.Node236.t=0;
+IntermediateCodon_tree.PARIS36395.t=0;
+IntermediateCodon_tree.Node239.t=0;
+IntermediateCodon_tree.DL19_389.t=0;
+IntermediateCodon_tree.SN8_492.t=0;
+IntermediateCodon_tree.Node201.t=0;
+IntermediateCodon_tree.Node29.t=0;
+IntermediateCodon_tree.Node224.t=0;
+IntermediateCodon_tree.NCH3396_593.t=0;
+IntermediateCodon_tree.AK9_1192.t=0;
+IntermediateCodon_tree.TH7594.t=0;
+IntermediateCodon_tree.Node272.t=0;
+IntermediateCodon_tree.HI3_1192.t=0;
+IntermediateCodon_tree.Node61.t=0;
+IntermediateCodon_tree.TX_12764_483.t=0;
+IntermediateCodon_tree.Node30.t=0;
+IntermediateCodon_tree.YOKOHAMA7392.t=0;
+IntermediateCodon_tree.PA7_1294.t=0;
+IntermediateCodon_tree.SHD9_393.t=0;
+IntermediateCodon_tree.Node47.t=0;
+IntermediateCodon_tree.Node228.t=0;
+IntermediateCodon_tree.TX_25784_385.t=0;
+IntermediateCodon_tree.Node202.t=0;
+IntermediateCodon_tree.TG_885.t=0;
+IntermediateCodon_tree.PS688_193.t=0;
+IntermediateCodon_tree.CAEN184.t=0;
+IntermediateCodon_tree.Node226.t=0;
+IntermediateCodon_tree.SAP_1292.t=0;
+IntermediateCodon_tree.Node262.t=0;
+IntermediateCodon_tree.Node225.t=0;
+IntermediateCodon_tree.CN124_295.t=0;
+IntermediateCodon_tree.Node220.t=0;
+IntermediateCodon_tree.Node280.t=0;
+IntermediateCodon_tree.Node38.t=0;
+IntermediateCodon_tree.BK25_785.t=0;
+IntermediateCodon_tree.Node264.t=0;
+IntermediateCodon_tree.HEBEI1293.t=0;
+IntermediateCodon_tree.HK23_792.t=0;
+IntermediateCodon_tree.UR46967_294.t=0;
+IntermediateCodon_tree.NGX10_193.t=0;
+IntermediateCodon_tree.Node212.t=0;
+IntermediateCodon_tree.CC485.t=0;
+IntermediateCodon_tree.Node215.t=0;
+IntermediateCodon_tree.NY64_1293.t=0;
+IntermediateCodon_tree.Node301.t=0;
+IntermediateCodon_tree.Node213.t=0;
+IntermediateCodon_tree.HK42_396.t=0;
+IntermediateCodon_tree.WUZ4_493.t=0;
+IntermediateCodon_tree.GD04_393.t=0;
+IntermediateCodon_tree.Node27.t=0;
+IntermediateCodon_tree.TX_25887_285.t=0;
+IntermediateCodon_tree.SIC4_593.t=0;
+IntermediateCodon_tree.Node28.t=0;
+IntermediateCodon_tree.BE46_292.t=0;
+IntermediateCodon_tree.RU58_393.t=0;
+IntermediateCodon_tree.Node254.t=0;
+IntermediateCodon_tree.Node71.t=0;
+IntermediateCodon_tree.Node205.t=0;
+IntermediateCodon_tree.HAR1592.t=0;
+IntermediateCodon_tree.Node346.t=0;
+IntermediateCodon_tree.Node206.t=0;
+IntermediateCodon_tree.NCH58_1293.t=0;
+IntermediateCodon_tree.LA6_993.t=0;
+IntermediateCodon_tree.Node204.t=0;
+IntermediateCodon_tree.Node211.t=0;
+IntermediateCodon_tree.BE32_192.t=0;
+IntermediateCodon_tree.NCH3332_493.t=0;
+IntermediateCodon_tree.Node32.t=0;
+IntermediateCodon_tree.NCH12_1193.t=0;
+IntermediateCodon_tree.Node203.t=0;
+IntermediateCodon_tree.Node318.t=0;
+IntermediateCodon_tree.Node189.t=0;
+IntermediateCodon_tree.Node53.t=0;
+IntermediateCodon_tree.TX_12835_583.t=0;
+IntermediateCodon_tree.PS192SPF.t=0;
+IntermediateCodon_tree.Node194.t=0;
+IntermediateCodon_tree.HK34_490.t=0;
+IntermediateCodon_tree.CZ86.t=0;
+IntermediateCodon_tree.KA206_1191.t=0;
+IntermediateCodon_tree.Node267.t=0;
+IntermediateCodon_tree.Node3.t=0;
+IntermediateCodon_tree.LN_286.t=0;
+IntermediateCodon_tree.SN91.t=0;
+IntermediateCodon_tree.Node279.t=0;
+IntermediateCodon_tree.SH24_890.t=0;
+IntermediateCodon_tree.PA15_295.t=0;
+IntermediateCodon_tree.MA1_195.t=0;
+IntermediateCodon_tree.Node155.t=0;
+IntermediateCodon_tree.Node188.t=0;
+IntermediateCodon_tree.ST_185.t=0;
+IntermediateCodon_tree.JOH33_794.t=0;
+IntermediateCodon_tree.Node16.t=0;
+IntermediateCodon_tree.EN26191.t=0;
+IntermediateCodon_tree.Node234.t=0;
+IntermediateCodon_tree.Node21.t=0;
+IntermediateCodon_tree.Node329.t=0;
+IntermediateCodon_tree.Node157.t=0;
+IntermediateCodon_tree.II236_1193.t=0;
+IntermediateCodon_tree.CA4_794.t=0;
+IntermediateCodon_tree.Node158.t=0;
+IntermediateCodon_tree.VAL_491.t=0;
+IntermediateCodon_tree.II237_1193.t=0;
+IntermediateCodon_tree.Node314.t=0;
+IntermediateCodon_tree.Node291.t=0;
+IntermediateCodon_tree.LA1_195.t=0;
+IntermediateCodon_tree.Node266.t=0;
+IntermediateCodon_tree.Node244.t=0;
+IntermediateCodon_tree.SP118_293.t=0;
+IntermediateCodon_tree.Node160.t=0;
+IntermediateCodon_tree.Node243.t=0;
+IntermediateCodon_tree.Node161.t=0;
+IntermediateCodon_tree.Node184.t=0;
+IntermediateCodon_tree.AA393.t=0;
+IntermediateCodon_tree.Node39.t=0;
+IntermediateCodon_tree.CT_385.t=0;
+IntermediateCodon_tree.BE47_292.t=0;
+IntermediateCodon_tree.Node173.t=0;
+IntermediateCodon_tree.KA149_1092.t=0;
+IntermediateCodon_tree.Node15.t=0;
+IntermediateCodon_tree.SAS68_692.t=0;
+IntermediateCodon_tree.Node341.t=0;
+IntermediateCodon_tree.Node72.t=0;
+IntermediateCodon_tree.WE66_692.t=0;
+IntermediateCodon_tree.Node14.t=0;
+IntermediateCodon_tree.CC185.t=0;
+IntermediateCodon_tree.VIC29_392.t=0;
+IntermediateCodon_tree.Node235.t=0;
+IntermediateCodon_tree.Node162.t=0;
+IntermediateCodon_tree.Node175.t=0;
+IntermediateCodon_tree.Node174.t=0;
+IntermediateCodon_tree.HK55_794.t=0;
+IntermediateCodon_tree.TW114391_192.t=0;
+IntermediateCodon_tree.Node183.t=0;
+IntermediateCodon_tree.Node2.t=0;
+IntermediateCodon_tree.Node320.t=0;
+IntermediateCodon_tree.TX_24752_185.t=0;
+IntermediateCodon_tree.Node345.t=0;
+IntermediateCodon_tree.Node133.t=0;
+IntermediateCodon_tree.BZ91.t=0;
+IntermediateCodon_tree.Node132.t=0;
+IntermediateCodon_tree.BK_785.t=0;
+IntermediateCodon_tree.GD27_594.t=0;
+IntermediateCodon_tree.SAS36_592.t=0;
+IntermediateCodon_tree.Node139.t=0;
+IntermediateCodon_tree.Node54.t=0;
+IntermediateCodon_tree.HW1_291.t=0;
+IntermediateCodon_tree.Node131.t=0;
+IntermediateCodon_tree.TX57_1293.t=0;
+IntermediateCodon_tree.Node140.t=0;
+IntermediateCodon_tree.Node273.t=0;
+IntermediateCodon_tree.NJ10_195.t=0;
+IntermediateCodon_tree.Node141.t=0;
+IntermediateCodon_tree.Node63.t=0;
+IntermediateCodon_tree.PA09_1191.t=0;
+IntermediateCodon_tree.WAIK2093.t=0;
+IntermediateCodon_tree.Node248.t=0;
+IntermediateCodon_tree.SEOUL45_1191.t=0;
+IntermediateCodon_tree.PARIS8395.t=0;
+IntermediateCodon_tree.WA1591.t=0;
+IntermediateCodon_tree.Node296.t=0;
+IntermediateCodon_tree.Node147.t=0;
+IntermediateCodon_tree.NY17_1294.t=0;
+IntermediateCodon_tree.SD1_491.t=0;
+IntermediateCodon_tree.Node350.t=0;
+IntermediateCodon_tree.MX3255_194.t=0;
+IntermediateCodon_tree.Node144.t=0;
+IntermediateCodon_tree.Node340.t=0;
+IntermediateCodon_tree.Node143.t=0;
+IntermediateCodon_tree.Node130.t=0;
+IntermediateCodon_tree.Node41.t=0;
+IntermediateCodon_tree.Node37.t=0;
+IntermediateCodon_tree.HK1_694.t=0;
+IntermediateCodon_tree.Node134.t=0;
+IntermediateCodon_tree.SOFIA15593.t=0;
+IntermediateCodon_tree.NY28_1294.t=0;
+IntermediateCodon_tree.MEM196_1195.t=0;
+IntermediateCodon_tree.NY3_293.t=0;
+IntermediateCodon_tree.PR1_1090.t=0;
+IntermediateCodon_tree.VIC68_792.t=0;
+IntermediateCodon_tree.Node49.t=0;
+IntermediateCodon_tree.NJ_185.t=0;
+IntermediateCodon_tree.Node17.t=0;
+IntermediateCodon_tree.SHIGA291.t=0;
+IntermediateCodon_tree.Node322.t=0;
+IntermediateCodon_tree.Node277.t=0;
+IntermediateCodon_tree.BE353_1289.t=0;
+IntermediateCodon_tree.NJ8_1194.t=0;
+IntermediateCodon_tree.Node200.t=0;
+IntermediateCodon_tree.Node4.t=0;
+IntermediateCodon_tree.IN3_991.t=0;
+IntermediateCodon_tree.UMEA2_1192.t=0;
+IntermediateCodon_tree.TX_24753_185.t=0;
+IntermediateCodon_tree.Node5.t=0;
+IntermediateCodon_tree.Node55.t=0;
+IntermediateCodon_tree.Node278.t=0;
+IntermediateCodon_tree.UMEA1_1192.t=0;
+IntermediateCodon_tree.HK434_1096.t=0;
+IntermediateCodon_tree.UY3_688.t=0;
+IntermediateCodon_tree.Node165.t=0;
+IntermediateCodon_tree.Node334.t=0;
+IntermediateCodon_tree.Node316.t=0;
+IntermediateCodon_tree.Node6.t=0;
+IntermediateCodon_tree.AG3105_693.t=0;
+IntermediateCodon_tree.Node293.t=0;
+IntermediateCodon_tree.Node246.t=0;
+IntermediateCodon_tree.Node113.t=0;
+IntermediateCodon_tree.Node317.t=0;
+IntermediateCodon_tree.Node7.t=0;
+IntermediateCodon_tree.GUA_389.t=0;
+IntermediateCodon_tree.SHA1_289.t=0;
+IntermediateCodon_tree.Node1.t=0;
+IntermediateCodon_tree.Node124.t=0;
+IntermediateCodon_tree.GZ187.t=0;
+IntermediateCodon_tree.KITA93.t=0;
+IntermediateCodon_tree.NY26_293.t=0;
+IntermediateCodon_tree.Node114.t=0;
+IntermediateCodon_tree.SHA16_989.t=0;
+IntermediateCodon_tree.VIC589.t=0;
+IntermediateCodon_tree.Node164.t=0;
+IntermediateCodon_tree.Node304.t=0;
+IntermediateCodon_tree.Node115.t=0;
+IntermediateCodon_tree.OITA83.t=0;
+IntermediateCodon_tree.ENG64889.t=0;
+IntermediateCodon_tree.DJ3946_1292.t=0;
+IntermediateCodon_tree.Node335.t=0;
+IntermediateCodon_tree.Node319.t=0;
+IntermediateCodon_tree.SIC89.t=0;
+IntermediateCodon_tree.GA3_393.t=0;
+IntermediateCodon_tree.JA8695_1294.t=0;
+IntermediateCodon_tree.QL_987.t=0;
+IntermediateCodon_tree.Node261.t=0;
+IntermediateCodon_tree.Node110.t=0;
+IntermediateCodon_tree.CO_1187.t=0;
+IntermediateCodon_tree.Node8.t=0;
+IntermediateCodon_tree.Node263.t=0;
+IntermediateCodon_tree.Node40.t=0;
+IntermediateCodon_tree.CC893.t=0;
+IntermediateCodon_tree.BE4_189.t=0;
+IntermediateCodon_tree.GZ54_489.t=0;
+IntermediateCodon_tree.BE57_189.t=0;
+IntermediateCodon_tree.Node343.t=0;
+IntermediateCodon_tree.ENG88.t=0;
+IntermediateCodon_tree.Node199.t=0;
+IntermediateCodon_tree.Node117.t=0;
+IntermediateCodon_tree.NY63_1293.t=0;
+IntermediateCodon_tree.Node9.t=0;
+IntermediateCodon_tree.RU3193.t=0;
+IntermediateCodon_tree.UDE44_394.t=0;
+IntermediateCodon_tree.Node169.t=0;
+IntermediateCodon_tree.GC_987.t=0;
+IntermediateCodon_tree.SN7_694.t=0;
+IntermediateCodon_tree.SIC_487.t=0;
+IntermediateCodon_tree.Node105.t=0;
+IntermediateCodon_tree.FR110994.t=0;
+IntermediateCodon_tree.NY38_193.t=0;
+IntermediateCodon_tree.Node97.t=0;
+IntermediateCodon_tree.Node292.t=0;
+IntermediateCodon_tree.SH_185.t=0;
+IntermediateCodon_tree.Node265.t=0;
+IntermediateCodon_tree.CB_188.t=0;
+IntermediateCodon_tree.Node96.t=0;
+IntermediateCodon_tree.VIC87.t=0;
+IntermediateCodon_tree.Node98.t=0;
+IntermediateCodon_tree.Node271.t=0;
+IntermediateCodon_tree.Node12.t=0;
+IntermediateCodon_tree.Node11.t=0;
+IntermediateCodon_tree.LA_1287.t=0;
+IntermediateCodon_tree.Node255.t=0;
+IntermediateCodon_tree.Node99.t=0;
+IntermediateCodon_tree.SYD_1287.t=0;
+IntermediateCodon_tree.KB_288.t=0;
+IntermediateCodon_tree.SP351_195.t=0;
+IntermediateCodon_tree.BK122_694.t=0;
+IntermediateCodon_tree.Node25.t=0;
+IntermediateCodon_tree.AG3779_1094.t=0;
+IntermediateCodon_tree.TX_18088_184.t=0;
+IntermediateCodon_tree.CA5_395.t=0;
+IntermediateCodon_tree.Node93.t=0;
+IntermediateCodon_tree.Node13.t=0;
+IntermediateCodon_tree.TY6_1287.t=0;
+IntermediateCodon_tree.Node26.t=0;
+IntermediateCodon_tree.Node276.t=0;
+IntermediateCodon_tree.YN_1185.t=0;
+IntermediateCodon_tree.TX5_1294.t=0;
+IntermediateCodon_tree.AK18_493.t=0;
+IntermediateCodon_tree.OH3_195.t=0;
+IntermediateCodon_tree.FO_1185.t=0;
+IntermediateCodon_tree.Node321.t=0;
+IntermediateCodon_tree.Node76.t=0;
+IntermediateCodon_tree.TY5_1287.t=0;
+IntermediateCodon_tree.Node78.t=0;
+IntermediateCodon_tree.Node10.t=0;
+IntermediateCodon_tree.DJ3109_1291.t=0;
+IntermediateCodon_tree.SP125_293.t=0;
+IntermediateCodon_tree.WY1_1193.t=0;
+IntermediateCodon_tree.Node356.t=0;
+IntermediateCodon_tree.SP190_393.t=0;
+IntermediateCodon_tree.ST1_193.t=0;
+IntermediateCodon_tree.Node359.t=0;
+IntermediateCodon_tree.Node355.t=0;
+IntermediateCodon_tree.Node353.t=0;
+IntermediateCodon_tree.Node313.t=0;
+IntermediateCodon_tree.ENG22093.t=0;
+IntermediateCodon_tree.Node312.t=0;
+IntermediateCodon_tree.PA993_1294.t=0;
+IntermediateCodon_tree.CA5_1193.t=0;
+IntermediateCodon_tree.WA41_1293.t=0;
+IntermediateCodon_tree.Node367.t=0;
+IntermediateCodon_tree.Node365.t=0;
+IntermediateCodon_tree.AKI194.t=0;
+IntermediateCodon_tree.RO182_194.t=0;
+IntermediateCodon_tree.Node372.t=0;
+IntermediateCodon_tree.VT3_194.t=0;
+IntermediateCodon_tree.SANT7198_894.t=0;
+IntermediateCodon_tree.Node376.t=0;
+IntermediateCodon_tree.RO160_194.t=0;
+IntermediateCodon_tree.Node375.t=0;
+IntermediateCodon_tree.Node371.t=0;
+IntermediateCodon_tree.NY4295_1194.t=0;
+IntermediateCodon_tree.NY16_1194.t=0;
+IntermediateCodon_tree.Node381.t=0;
+IntermediateCodon_tree.NY15_894.t=0;
+IntermediateCodon_tree.Node380.t=0;
+IntermediateCodon_tree.Node370.t=0;
+IntermediateCodon_tree.Node364.t=0;
+IntermediateCodon_tree.NED37293.t=0;
+IntermediateCodon_tree.FR120394.t=0;
+IntermediateCodon_tree.Node385.t=0;
+IntermediateCodon_tree.Node363.t=0;
+IntermediateCodon_tree.Node311.t=0;
+IntermediateCodon_tree.WA2693.t=0;
+IntermediateCodon_tree.Node310.t=0;
+IntermediateCodon_tree.Node260.t=0;
+IntermediateCodon_tree.HAR3_194.t=0;
+IntermediateCodon_tree.WE397.t=0;
+IntermediateCodon_tree.CN10679_997.t=0;
+IntermediateCodon_tree.SYD697.t=0;
+IntermediateCodon_tree.HI1_997.t=0;
+IntermediateCodon_tree.AUC5_697.t=0;
+IntermediateCodon_tree.Node422.t=0;
+IntermediateCodon_tree.Node420.t=0;
+IntermediateCodon_tree.Node418.t=0;
+IntermediateCodon_tree.SYD597.t=0;
+IntermediateCodon_tree.Node417.t=0;
+IntermediateCodon_tree.Node415.t=0;
+IntermediateCodon_tree.HK391_797.t=0;
+IntermediateCodon_tree.PR1_797.t=0;
+IntermediateCodon_tree.SAUS54_797.t=0;
+IntermediateCodon_tree.CANBERRA5_897.t=0;
+IntermediateCodon_tree.Node431.t=0;
+IntermediateCodon_tree.Node429.t=0;
+IntermediateCodon_tree.Node427.t=0;
+IntermediateCodon_tree.HK387_797.t=0;
+IntermediateCodon_tree.Node426.t=0;
+IntermediateCodon_tree.Node414.t=0;
+IntermediateCodon_tree.SYD497.t=0;
+IntermediateCodon_tree.Node413.t=0;
+IntermediateCodon_tree.UR41_197.t=0;
+IntermediateCodon_tree.Node412.t=0;
+IntermediateCodon_tree.SAITAMA8096_97.t=0;
+IntermediateCodon_tree.Node411.t=0;
+IntermediateCodon_tree.BE17_197.t=0;
+IntermediateCodon_tree.BE62_297.t=0;
+IntermediateCodon_tree.Node438.t=0;
+IntermediateCodon_tree.Node410.t=0;
+IntermediateCodon_tree.KO671_297.t=0;
+IntermediateCodon_tree.KO572_297.t=0;
+IntermediateCodon_tree.JA416_297.t=0;
+IntermediateCodon_tree.Node445.t=0;
+IntermediateCodon_tree.Node443.t=0;
+IntermediateCodon_tree.CL170_1096.t=0;
+IntermediateCodon_tree.Node442.t=0;
+IntermediateCodon_tree.SHZH157_796.t=0;
+IntermediateCodon_tree.Node441.t=0;
+IntermediateCodon_tree.Node409.t=0;
+IntermediateCodon_tree.CI2115_696.t=0;
+IntermediateCodon_tree.NY55_1296.t=0;
+IntermediateCodon_tree.Node456.t=0;
+IntermediateCodon_tree.GZH8_496.t=0;
+IntermediateCodon_tree.Node455.t=0;
+IntermediateCodon_tree.TIANJING55_896.t=0;
+IntermediateCodon_tree.Node454.t=0;
+IntermediateCodon_tree.GZH11_496.t=0;
+IntermediateCodon_tree.Node453.t=0;
+IntermediateCodon_tree.HK357_696.t=0;
+IntermediateCodon_tree.Node452.t=0;
+IntermediateCodon_tree.SP214_197.t=0;
+IntermediateCodon_tree.Node451.t=0;
+IntermediateCodon_tree.CORD3278_796.t=0;
+IntermediateCodon_tree.GNX189_796.t=0;
+IntermediateCodon_tree.TD4796.t=0;
+IntermediateCodon_tree.Node468.t=0;
+IntermediateCodon_tree.Node466.t=0;
+IntermediateCodon_tree.AG207_796.t=0;
+IntermediateCodon_tree.AG601_796.t=0;
+IntermediateCodon_tree.Node471.t=0;
+IntermediateCodon_tree.Node465.t=0;
+IntermediateCodon_tree.AG39_796.t=0;
+IntermediateCodon_tree.Node464.t=0;
+IntermediateCodon_tree.Node450.t=0;
+IntermediateCodon_tree.Node408.t=0;
+IntermediateCodon_tree.TIANJING51_297.t=0;
+IntermediateCodon_tree.SH19_896.t=0;
+IntermediateCodon_tree.Node477.t=0;
+IntermediateCodon_tree.FUJIAN133_596.t=0;
+IntermediateCodon_tree.SANTAFE208_896.t=0;
+IntermediateCodon_tree.Node480.t=0;
+IntermediateCodon_tree.Node476.t=0;
+IntermediateCodon_tree.JOH3_397.t=0;
+IntermediateCodon_tree.HK358_796.t=0;
+IntermediateCodon_tree.Node483.t=0;
+IntermediateCodon_tree.Node475.t=0;
+IntermediateCodon_tree.Node407.t=0;
+IntermediateCodon_tree.HAR3_1296.t=0;
+IntermediateCodon_tree.BE24496_197.t=0;
+IntermediateCodon_tree.Node486.t=0;
+IntermediateCodon_tree.Node406.t=0;
+IntermediateCodon_tree.TX1196_97.t=0;
+IntermediateCodon_tree.TD5196.t=0;
+IntermediateCodon_tree.TD5096.t=0;
+IntermediateCodon_tree.Node491.t=0;
+IntermediateCodon_tree.Node489.t=0;
+IntermediateCodon_tree.Node405.t=0;
+IntermediateCodon_tree.SHZH43_396.t=0;
+IntermediateCodon_tree.WZH1_596.t=0;
+IntermediateCodon_tree.Node496.t=0;
+IntermediateCodon_tree.GD1_396.t=0;
+IntermediateCodon_tree.Node495.t=0;
+IntermediateCodon_tree.CO11_1196.t=0;
+IntermediateCodon_tree.IN1_1196.t=0;
+IntermediateCodon_tree.Node502.t=0;
+IntermediateCodon_tree.KY2_297.t=0;
+IntermediateCodon_tree.Node501.t=0;
+IntermediateCodon_tree.NJ8_1296.t=0;
+IntermediateCodon_tree.Node500.t=0;
+IntermediateCodon_tree.Node494.t=0;
+IntermediateCodon_tree.Node404.t=0;
+IntermediateCodon_tree.VIC4797.t=0;
+IntermediateCodon_tree.VIC3097.t=0;
+IntermediateCodon_tree.Node508.t=0;
+IntermediateCodon_tree.TAS1_797.t=0;
+IntermediateCodon_tree.Node507.t=0;
+IntermediateCodon_tree.Node403.t=0;
+IntermediateCodon_tree.JA99_196.t=0;
+IntermediateCodon_tree.Node402.t=0;
+IntermediateCodon_tree.FUK11496E.t=0;
+IntermediateCodon_tree.FUK11496C.t=0;
+IntermediateCodon_tree.Node513.t=0;
+IntermediateCodon_tree.Node401.t=0;
+IntermediateCodon_tree.RI7_397.t=0;
+IntermediateCodon_tree.Node400.t=0;
+IntermediateCodon_tree.BR51_897.t=0;
+IntermediateCodon_tree.BR43_697.t=0;
+IntermediateCodon_tree.Node519.t=0;
+IntermediateCodon_tree.BR309_796.t=0;
+IntermediateCodon_tree.Node518.t=0;
+IntermediateCodon_tree.GQ1014_1096.t=0;
+IntermediateCodon_tree.JOH10_697.t=0;
+IntermediateCodon_tree.CA10_797.t=0;
+IntermediateCodon_tree.NY43_1196.t=0;
+IntermediateCodon_tree.Node533.t=0;
+IntermediateCodon_tree.MN1_497.t=0;
+IntermediateCodon_tree.MO10_1196.t=0;
+IntermediateCodon_tree.Node536.t=0;
+IntermediateCodon_tree.Node532.t=0;
+IntermediateCodon_tree.CA13_1296.t=0;
+IntermediateCodon_tree.Node531.t=0;
+IntermediateCodon_tree.JOH9_597.t=0;
+IntermediateCodon_tree.Node530.t=0;
+IntermediateCodon_tree.NY50_1196.t=0;
+IntermediateCodon_tree.Node529.t=0;
+IntermediateCodon_tree.Node527.t=0;
+IntermediateCodon_tree.CN101_197.t=0;
+IntermediateCodon_tree.PA2_297.t=0;
+IntermediateCodon_tree.Node543.t=0;
+IntermediateCodon_tree.MO11_1196.t=0;
+IntermediateCodon_tree.MOS2_197.t=0;
+IntermediateCodon_tree.Node546.t=0;
+IntermediateCodon_tree.Node542.t=0;
+IntermediateCodon_tree.Node526.t=0;
+IntermediateCodon_tree.Node524.t=0;
+IntermediateCodon_tree.WI3_896.t=0;
+IntermediateCodon_tree.NY37_1096.t=0;
+IntermediateCodon_tree.Node551.t=0;
+IntermediateCodon_tree.AK2_796.t=0;
+IntermediateCodon_tree.Node550.t=0;
+IntermediateCodon_tree.TW523_596.t=0;
+IntermediateCodon_tree.Node549.t=0;
+IntermediateCodon_tree.Node523.t=0;
+IntermediateCodon_tree.Node517.t=0;
+IntermediateCodon_tree.Node399.t=0;
+IntermediateCodon_tree.SHA9_995.t=0;
+IntermediateCodon_tree.Node398.t=0;
+IntermediateCodon_tree.FG39_1096.t=0;
+IntermediateCodon_tree.NY9_196.t=0;
+IntermediateCodon_tree.Node559.t=0;
+IntermediateCodon_tree.TH9496_97.t=0;
+IntermediateCodon_tree.Node558.t=0;
+IntermediateCodon_tree.FR7597.t=0;
+IntermediateCodon_tree.Node557.t=0;
+IntermediateCodon_tree.Node397.t=0;
+IntermediateCodon_tree.WA596.t=0;
+IntermediateCodon_tree.Node396.t=0;
+IntermediateCodon_tree.BRIS3596.t=0;
+IntermediateCodon_tree.CAR42297.t=0;
+IntermediateCodon_tree.CAR465_896.t=0;
+IntermediateCodon_tree.Node572.t=0;
+IntermediateCodon_tree.Node570.t=0;
+IntermediateCodon_tree.BK197.t=0;
+IntermediateCodon_tree.Node569.t=0;
+IntermediateCodon_tree.MN1_1196.t=0;
+IntermediateCodon_tree.WE4896.t=0;
+IntermediateCodon_tree.DE4_397.t=0;
+IntermediateCodon_tree.Node582.t=0;
+IntermediateCodon_tree.Node580.t=0;
+IntermediateCodon_tree.YOKOHAMA6896_97.t=0;
+IntermediateCodon_tree.Node579.t=0;
+IntermediateCodon_tree.AUC596.t=0;
+IntermediateCodon_tree.Node578.t=0;
+IntermediateCodon_tree.HI2_796.t=0;
+IntermediateCodon_tree.Node577.t=0;
+IntermediateCodon_tree.TH78_397.t=0;
+IntermediateCodon_tree.TH79_397.t=0;
+IntermediateCodon_tree.Node589.t=0;
+IntermediateCodon_tree.CHR196.t=0;
+IntermediateCodon_tree.Node588.t=0;
+IntermediateCodon_tree.Node576.t=0;
+IntermediateCodon_tree.Node568.t=0;
+IntermediateCodon_tree.AUC10896_97.t=0;
+IntermediateCodon_tree.BRI2296.t=0;
+IntermediateCodon_tree.Node593.t=0;
+IntermediateCodon_tree.Node567.t=0;
+IntermediateCodon_tree.MON318_696.t=0;
+IntermediateCodon_tree.Node566.t=0;
+IntermediateCodon_tree.CNIC35_196.t=0;
+IntermediateCodon_tree.NCH813_895.t=0;
+IntermediateCodon_tree.Node599.t=0;
+IntermediateCodon_tree.FUJIAN47_396.t=0;
+IntermediateCodon_tree.WUH359_995.t=0;
+IntermediateCodon_tree.Node602.t=0;
+IntermediateCodon_tree.Node598.t=0;
+IntermediateCodon_tree.NCH933_995.t=0;
+IntermediateCodon_tree.Node597.t=0;
+IntermediateCodon_tree.Node565.t=0;
+IntermediateCodon_tree.Node395.t=0;
+IntermediateCodon_tree.GZH66_497.t=0;
+IntermediateCodon_tree.Node394.t=0;
+IntermediateCodon_tree.CNIC22_195.t=0;
+IntermediateCodon_tree.Node393.t=0;
+IntermediateCodon_tree.GNX42_495.t=0;
+IntermediateCodon_tree.Node392.t=0;
+IntermediateCodon_tree.BZ18_496.t=0;
+IntermediateCodon_tree.BR3_496.t=0;
+IntermediateCodon_tree.BR45_696.t=0;
+IntermediateCodon_tree.Node619.t=0;
+IntermediateCodon_tree.BR87_596.t=0;
+IntermediateCodon_tree.Node618.t=0;
+IntermediateCodon_tree.BZ8_496.t=0;
+IntermediateCodon_tree.Node617.t=0;
+IntermediateCodon_tree.Node615.t=0;
+IntermediateCodon_tree.BR184_696.t=0;
+IntermediateCodon_tree.Node614.t=0;
+IntermediateCodon_tree.BR597_796.t=0;
+IntermediateCodon_tree.Node613.t=0;
+IntermediateCodon_tree.NJ11_1294.t=0;
+IntermediateCodon_tree.CN147_495.t=0;
+IntermediateCodon_tree.SN28_595.t=0;
+IntermediateCodon_tree.Node633.t=0;
+IntermediateCodon_tree.Node631.t=0;
+IntermediateCodon_tree.GE767_495.t=0;
+IntermediateCodon_tree.Node630.t=0;
+IntermediateCodon_tree.JOH295.t=0;
+IntermediateCodon_tree.Node629.t=0;
+IntermediateCodon_tree.SN27_595.t=0;
+IntermediateCodon_tree.HK38_895.t=0;
+IntermediateCodon_tree.Node638.t=0;
+IntermediateCodon_tree.Node628.t=0;
+IntermediateCodon_tree.WA186_1294.t=0;
+IntermediateCodon_tree.VA25_1294.t=0;
+IntermediateCodon_tree.Node641.t=0;
+IntermediateCodon_tree.Node627.t=0;
+IntermediateCodon_tree.HK3_195.t=0;
+IntermediateCodon_tree.Node626.t=0;
+IntermediateCodon_tree.Node612.t=0;
+IntermediateCodon_tree.WV1_395.t=0;
+IntermediateCodon_tree.GE578652_295.t=0;
+IntermediateCodon_tree.Node645.t=0;
+IntermediateCodon_tree.Node611.t=0;
+IntermediateCodon_tree.NE11_395.t=0;
+IntermediateCodon_tree.AK10_295.t=0;
+IntermediateCodon_tree.Node650.t=0;
+IntermediateCodon_tree.KWJ195_1194.t=0;
+IntermediateCodon_tree.Node649.t=0;
+IntermediateCodon_tree.CHW995_1294.t=0;
+IntermediateCodon_tree.Node648.t=0;
+IntermediateCodon_tree.Node610.t=0;
+IntermediateCodon_tree.CN17_196.t=0;
+IntermediateCodon_tree.FL4_1195.t=0;
+IntermediateCodon_tree.LA5_1195.t=0;
+IntermediateCodon_tree.Node660.t=0;
+IntermediateCodon_tree.KO45_296.t=0;
+IntermediateCodon_tree.BZ2_395.t=0;
+IntermediateCodon_tree.Node666.t=0;
+IntermediateCodon_tree.CN61_296.t=0;
+IntermediateCodon_tree.Node665.t=0;
+IntermediateCodon_tree.GE491_396.t=0;
+IntermediateCodon_tree.Node664.t=0;
+IntermediateCodon_tree.UK897_696.t=0;
+IntermediateCodon_tree.MN6_1195.t=0;
+IntermediateCodon_tree.Node671.t=0;
+IntermediateCodon_tree.Node663.t=0;
+IntermediateCodon_tree.Node659.t=0;
+IntermediateCodon_tree.Node657.t=0;
+IntermediateCodon_tree.DE3_1195.t=0;
+IntermediateCodon_tree.NV1_1195.t=0;
+IntermediateCodon_tree.Node679.t=0;
+IntermediateCodon_tree.ID4_1195.t=0;
+IntermediateCodon_tree.Node678.t=0;
+IntermediateCodon_tree.MO6_396.t=0;
+IntermediateCodon_tree.Node677.t=0;
+IntermediateCodon_tree.JOH5396_97.t=0;
+IntermediateCodon_tree.Node676.t=0;
+IntermediateCodon_tree.AK16_995.t=0;
+IntermediateCodon_tree.JOH1795.t=0;
+IntermediateCodon_tree.Node685.t=0;
+IntermediateCodon_tree.Node675.t=0;
+IntermediateCodon_tree.ID3_1195.t=0;
+IntermediateCodon_tree.CN2796_1295.t=0;
+IntermediateCodon_tree.Node688.t=0;
+IntermediateCodon_tree.Node674.t=0;
+IntermediateCodon_tree.Node656.t=0;
+IntermediateCodon_tree.AG4057_795.t=0;
+IntermediateCodon_tree.SHD5_894.t=0;
+IntermediateCodon_tree.BE281_1294.t=0;
+IntermediateCodon_tree.Node693.t=0;
+IntermediateCodon_tree.Node691.t=0;
+IntermediateCodon_tree.Node655.t=0;
+IntermediateCodon_tree.Node609.t=0;
+IntermediateCodon_tree.Node391.t=0;
+IntermediateCodon_tree.Node389.t=0;
+DataSet IntermediateCodon_AA = ReadDataFile(USE_NEXUS_FILE_DATA);
+DataSetFilter IntermediateCodon_AA_part = CreateFilter(IntermediateCodon_AA,1,"0-328","312,311,310,308,309,313,329,332,330,331,341,342,340,339,338,337,348,345,344,343,346,347,7,334,335,333,336,328,316-318,325,326,324,322,321,323,327,320,319,315,314,303,302,304,305,301,306,307,300,299,298,297,295,293,292,294,289,288,290,291,296,287,275,274,279,282,280,281,284,283,285,286,278,276,277,258,267,266,264,263,265,272,257,262,259-261,271,273,268-270,256,255,252-254,251,232,231,233,230,226-228,225 [...]
+LikelihoodFunction IntermediateCodon_AA_LF = (IntermediateCodon_AA_part,IntermediateCodon_tree);
+
+END;
diff --git a/tests/hbltests/UnitTests/HBLCommands/testdata/Chinook_Sqlite.sqlite b/tests/hbltests/UnitTests/HBLCommands/testdata/Chinook_Sqlite.sqlite
new file mode 100644
index 0000000..1f6158e
Binary files /dev/null and b/tests/hbltests/UnitTests/HBLCommands/testdata/Chinook_Sqlite.sqlite differ
diff --git a/tests/hbltests/UnitTests/HBLCommands/tmp/GetURL.txt b/tests/hbltests/UnitTests/HBLCommands/tmp/GetURL.txt
new file mode 100644
index 0000000..e69de29
diff --git a/tests/hbltests/data/2.fas b/tests/hbltests/data/2.fas
new file mode 100644
index 0000000..1f8c436
--- /dev/null
+++ b/tests/hbltests/data/2.fas
@@ -0,0 +1,4 @@
+>1
+------------------------------------------------------------------------------------------------------NTTTGTACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGAYAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTYAATAAGARAACTCAAGAYTTYTGGGAAGTTCAAYTAGGAATACCACATCCCGCAGGGTTAAAAAAGAAAAAATCAGTAACAGTACTRGATGTGGGTGATGCATATTTYTCAGTTCCCTTAGATGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGGATTAGATATCAGTACAATGTGCTYCCACAGGGAGGATCACCAGCAATATTCCAAAGCATGACAAAAATCGAGCCTTTT [...]
+>2
+---------CCCATAGAAACTGTGGACATAAAGAAGNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNTTTGCACAGAAATGGAAAAGGAAGGGAAAATTTCAAAAATTGGGCCTGAAAATCCATACAATACTCCAGTATTTGCCATAAAGAAAAAAGACAGTACTAAATGGAGAAAATTAGTAGATTTCAGAGAACTTAATAAGAGAACTCAAGACTTCTGGGAAGTTCARTTAGGAATACCACACCCCTCAGGGTTAAAACAGAGAAAATCAGTRACAGTACTAGATGTGGGTGATGCATATTTCTCAGTTCCCTTAGACGACTTCAGGAAGTATACTGCATTTACCATACCTAGTATAAACAATGAGACACCAGGAATTAGRTATCAGTACAATGTGCTCCCACAGGGAGGATCACCTKCAATATTTCAAAGCATGACAARRATCGAGCCTTTT [...]
diff --git a/tests/hbltests/data/2.prot b/tests/hbltests/data/2.prot
new file mode 100644
index 0000000..7388ce2
--- /dev/null
+++ b/tests/hbltests/data/2.prot
@@ -0,0 +1,4 @@
+>1
+----------------------------------?CTEMEKEGKISKIGPENPYNTPVFAIKKK?STKWRKLVDFRE?NK?TQ?XWEVQ?GIPHPAGLKKKKSVTV?DVGDAYXSVPLDDFRKYTAFTIPSINNETPGIRYQYNV?PQGGSPAIFQSMTKIEPFR??NPDIVIY?YMDDLYVGSDLEIEQHRTKIEELR?HLLAGFTTPDKKHQ?EPPX?WMGYELHPD?WTVQPI???????????????????????????????????????????????????????
+>2
+---PIETVDIKK???????????????????????CTEMEKEGKISKIGPENPYNTPVFAIKKKDSTKWRKLVDFRELNKRTQDFWEV?LGIPHPSGLKQRKS?TVLDVGDAYFSVPLDDFRKYTAFTIPSINNETPGI?YQYNVLPQGGSP?IFQSMT?IEPFRKQNPDI?IYQYMDDLYVGSDL?IGQHRAKIEELRQHLLKGLTTPDKKHQKEPPFLWMGYELHPDKWTVQPI???????????????????????????????????????????????????????
diff --git a/tests/hbltests/data/2.tree b/tests/hbltests/data/2.tree
new file mode 100644
index 0000000..7a19af4
--- /dev/null
+++ b/tests/hbltests/data/2.tree
@@ -0,0 +1 @@
+(1,2)
\ No newline at end of file
diff --git a/tests/hbltests/data/5.fas b/tests/hbltests/data/5.fas
new file mode 100644
index 0000000..9a872e9
--- /dev/null
+++ b/tests/hbltests/data/5.fas
@@ -0,0 +1,10 @@
+>X3_BP_TP1_S1
+TTGAACAGGACCAGGATCCAATGTCAGCACAGTACAATGTACACATGGAATTAAACCAGT
+>X3_BP_TP1_S2
+TT-AACAGGACCAGGATCCAATGTCAGCACAGTACAATGTACACATGGAATTAAACCAGT
+>X3_BP_TP1_S3
+TTGAACAGGACCAGRATCCAATGTCAGCACAGTACAATGTACACATGGAATTAAACCAGT
+>X3_BP_TP1_S4
+TTGAACAGGACCAGGATCCAATGTCAGCACAGTACARTGTACACATGGAATTAAACCYGY
+>X3 BP TP1 S5
+TTGAACAGGACCAGGATCCAATGTCAGCACAGTACAATGTACACATGGAATTAAACCMRM
diff --git a/tests/hbltests/data/CD2.nex b/tests/hbltests/data/CD2.nex
new file mode 100644
index 0000000..7a959fa
--- /dev/null
+++ b/tests/hbltests/data/CD2.nex
@@ -0,0 +1,86 @@
+#NEXUS
+
+[
+Generated by HYPHY 0.9920070619beta(MP) for MacOS(Carbon) on Thu Jun 21 16:59:04 2007
+
+]
+
+BEGIN TAXA;
+	DIMENSIONS NTAX = 10;
+	TAXLABELS
+		'Human' 'Chimp' 'Baboon' 'RhMonkey' 'Cow' 'Pig' 'Horse' 'Cat' 'Mouse' 'Rat' ;
+END;
+
+BEGIN CHARACTERS;
+	DIMENSIONS NCHAR = 561;
+	FORMAT
+		DATATYPE = DNA
+
+		GAP=-
+		MISSING=?
+	;
+
+MATRIX
+	'Human'     AAAGAGATTACGAATGCCTTGGAAACCTGGGGTGCCTTGGGTCAGGACATCAACTTGGACATTCCTAGTTTTCAAATGAGTGATGATATTGACGATATAAAATGGGAAAAAACTTCAGACAAGAAAAAGATTGCACAATTCAGAAAAGAGAAAGAGACTTTCAAGGAAAAAGATACATATAAGCTATTTAAAAATGGAACTCTGAAAATTAAGCAT---CTGAAGACCGATGATCAGGATATCTACAAGGTATCAATATATGATACAAAAGGAAAAAATGTGTTGGAAAAAATATTTGATTTGAAGATTCAAGAGAGGGTCTCAAAACCAAAGATCTCCTGGACTTGTATCAACACAACCCTGACCTGTGAGGTAATGAATGGAACTGACCCCGAATTAAACCTGTATCAAGATGGGAAACATCTAAAA---CTTTCTCAGAGGGTCATCACACACAAGTGGACCACCAGCCTGAGTGC [...]
+	'Chimp'     GAAGAGATTACGAATGCCTTGGAAACCTGGGGTGCCTTGGGTCAGGACATCAACTTGGACATTCCTAGTTTTCAAATGAGTGATGATATTGACGATATAAAATGGGAAAAAACTTCAGACAAGAAAAAGATTGCACAATTCAGAAAAGAGAAAGAGACTTTCAAGGAAAAAGATACATATAAGCTATTTAAAAATGGAACTCTGAAAATTAAGCAT---CTGAAGACCGATGATCAGGATATCTACAAGGTATCAATATATGATACAAAAGGAAAAAATGTGTTGGAAAAAATATTTGATTTGAAGATTCAAGAGAGGGTCTCAAAACCAAAGATCTCCTGGACTTGTATCAACACAACCCTGACCTGTGAGGTAATGAATGGAACTGACCCCGAATTAAACCTGTATCAAGATGGGAAACATCTAAAA---CTTTCTCAGAGGGTCATCACACACAAGTGGACCACCAGCCTGAGTGC [...]
+	'Baboon'    AAAGAGATTAGGAATGCTTTGGAAACCTGGGGAGCGCTGGGTCAGGACATCGACTTGGACATTCCTAGTTTTCAAATGAGTGATGATATTGATGATATAAAATGGGAGAAAACTTCAGACAAGAAAAAGATTGCACAATTCAGAAAAGAGAAGGAGACTTTCGAGGAAAAAGATGCATATAAGCTATTTAAAAACGGAACTCTGAAAATTAAGCAT---CTGAAGATCCATGATCAGGATAGCTACAAGGTATCAATATACGATACAAAAGGAAAAAATGTGTTGGAAAAAACATTTGATTTGAAGATTCAAGAGAGGGTCTCAGAACCAAAGATCTCCTGGACTTGTATCAACACAACCCTGACCTGTGAAGTAATGAATGGAACTGACCCCGAATTAAACCTGTATCAAGATGGGAAACATCTAAAA---CTTTCTCAGAGGGTCATCACACACAAGTGGACCACCAGCCTGAGTGC [...]
+	'RhMonkey'  AAAGAGATTAGGAATGCTTTGGAAACCTGGGGAGCGCTGGGTCAGGACATCGACTTGGACATTCCTAGTTTTCAAATGAGTGATGATATTGATGATATAAGATGGGAAAAAACTTCAGACAAGAAAAAGATTGCACAATTCAGAAAAGAGAAGGAGACTTTCGAGGAAAAAGATGCATATAAGCTATTTAAAAACGGAACTCTGAAAAYTAAGCAT---CTGAAGATCCATGATCAGGATAGCTACAAGGTATCAATATACGATACAAAAGGAAAAAATGTGTTGGAAAAAACATTTGATTTGAAGATTCAAGAGAGGGTCTCAGAACCAAAGATCTCCTGGACTTGTATCAACACAACCCTGACCTGTGAAGTAATGAATGGAACTGRCCCCGAATTAAACCTGTATCAAGATGGGAAACATGTAAAA---CTTTCTCAGAGGGTCATCACACACAAGTGGACCACCAGCCTGAGTGC [...]
+	'Cow'       ------------GAAAGCATTGTCGTCTGGGGTGCCCTGGATCATGACCTCAACCTGGACATTCCTGGTTTTCCAAGAAGTGATATAGTGGCAGATATAAAATGGAACAGA------AACAAAAACAAGATTGCACGAATAAAGAAAGATATGCCACTTCACAATGAAATGGACAAATATGATATGTTTACAAATGGAACTCTGAAAATTAAAACT---CTGATGAGAAACGATAGTGGTCTCTATGAGGTAGAGGTTTATGATTCAAATGGAGTAAACCTACTGAGCAAAAAATTTGATTTGAAGATTCAAGAGATGCTCTCAGGACCTGAAATTAACTGGATCTGTACCAACAGAACTGTGAGCTGCAAGGTAGAAAATGGAAGTAATCCTAAATTACAACTGTTTTTAAATACGACCCGTGTCAAACAAGATCATGGGAAGCTCATCACCTACACGTGGAACACCAGATGGAATAA [...]
+	'Pig'       ---------------ACTGAGGTTGTCTGGGGCATCGTGGATCAAGACATCAACCTGGACATTCCTGAACTTTCAAAACATGATAACGTAGATCATATACGATGGCAGAAG------AATGAAAACAAGATCGCAGAATTTAAAAAAAACAAAGAAACTCACCCTGTGAAAGACACATACATGATGTTACCAAATGGAACTCTGAGAATTAAAGAT---CTGAAGAGAGATGATGAGGGTATCTACAAGGTAACTGTCTATGCTACGGATGGAAAACACATGCTGGAGAGAAAATTTGATTTGCCGATTCTAGATGGGGTCTCAAAACCTGTAATCTCCTGGAGCTGTGCCGACAAAACGGTGACCTGTGAGGTAGCAGAAGGAAGTGACCCTAAGTTAAAACTGTATGTAAATAAGTCCACTGCCAGAGAAGGTCGTCAGAAGGTCATCCTGTGGAAGTGGAACACCAAATGGAGCAC [...]
+	'Horse'     ------------AAGAATATCACCATCTTGGGTGCCCTGGAACGTGATATCAACCTGGACATTCCTGCTTTTCAAATGAGTGAGCATGTAGAAGATATACAATGGAGCAAA------GGAAAAACCAAGATTGCAAAATTCAAAAATGGCAGTATGACTTTCCAGAAAGATAAAACATACGAGGTATTAAAAAATGGAACTCTGAAAATTAAACAT---CTGGAGAGAATTCATGAAGGTACCTACAAGGTAGACGCATATGATAGTGATGGAAAAAATGTGTTGGAGGAAACATTTCATTTGAGCCTTCTAGAGATGGTCTCAAAACCTAATATCTCCTGGAGCTGCACCAACACCACCCTGACCTGCGAGGTGACAAAAGGAACTGACTTTGAGTTAAAACTCTATCTAAATGGGAGAATGATCCAAAAAAGTCCTCGCAAAGTCATCGTATACAAGCGGGCCAGCAACCAAATTGC [...]
+	'Cat'       ---------GCAAATGATGATATCGTCTGGGGTACCCTGGGTCAGGACATCAACCTGGACATTCCTGATTCTCAA---GGGATTAATATAGATGATATACACTGGGAAAAA------GGCAAGAAGAAGGTGGCGAGGTTCCAAATTAGCAACAAGCCTAAGAATCCAGATGAAAAATATAATGTGTCAATGAATGGAACTCTGAAAATTAAACAT---CTGATGCTAGAAGACTGCGATACCTACAAGGTTGTTATATACGATAAGGATGGAAAGAATGTGTTGGATAAAACATTTCAGCTGAAGATTCAAGAGAAGGTCTCAACGCCTAACATCGACTGGAATTGTATCAACAAAACCCTGGTCTGTAAGGTATCAAATGGAACAGACCCTGAATTAAAACTGTACGTAAATGGGACCAGTATCAAGCCCGTTTCTTCGAAGTTCAGCACATACAGGTTTATAAACAAGCAGAAGAT [...]
+	'Mouse'     ---------AGAGACAATGAGACCATCTGGGGTGTCTTGGGTCATGGCATCACCCTGAACATCCCCAACTTTCAAATGACTGATGATATTGATGAGGTGCGATGGGTAAGG------AGGGGCACCCTGGTCGCAGAGTTTAAAAGGAAGAAGCCACCTTTTTTGATATCAGAAACGTATGAGGTCTTAGCAAACGGATCCCTGAAGATAAAGAAGCCGATGATGAGAAACGACAGTGGCACCTATAATGTAATGGTGTATGGCACAAATGGGATGACTAGGCTGGAGAAGGACCTGGACGTGAGGATTCTGGAGAGGGTCTCAAAGCCCATGATCCACTGGGAATGCCCCAACACAACCCTGACCTGTGCGGTCTTGCAAGGGACAGATTTTGAACTGAAGCTGTATCAAGGGGAAACACTACTCAATAGTCTCCCCCAGAAGAACATGAGTTACCAGTGG---ACCAACCTGAACGC [...]
+	'Rat'       ---------AGAGACAGTGGGACCGTCTGGGGTGCCCTGGGTCATGGCATCAACCTGAACATCCCTAACTTTCAAATGACTGATGATATTGATGAGGTGCGATGGGAGAGG------GGGAGCACCCTGGTTGCCGAGTTTAAAAGGAAGATGAAGCCTTTTTTGAAATCGGGAGCATTTGAGATCTTAGCAAATGGAGACTTGAAGATAAAGAAT---CTGACAAGAGATGACAGTGGCACCTATAATGTAACGGTATACAGCACAAATGGGACACGTATCCTGGACAAGGCACTGGACTTGAGGATTCTAGAGATGGTCTCAAAGCCGATGATCTACTGGGAGTGCAGCAACGCAACCCTGACCTGTGAGGTCTTGGAAGGAACAGATGTTGAACTAAAGCTGTACCAAGGAAAGGAGCATCTCAGGAGCCTCCGTCAGAAGACCATGAGTTACCAGTGG---ACCAACCTGAGAGC [...]
+END;
+
+BEGIN TREES;
+	TREE tree = ((((Pig:0.147969,Cow:0.213430):0.085099,Horse:0.165787,Cat:0.264806):0.058611,((RhMonkey:0.002015,Baboon:0.003108):0.022733,(Human:0.004349,Chimp:0.000799):0.011873):0.101856):0.340802,Rat:0.050958,Mouse:0.097950);
+END;
+
+BEGIN HYPHY;
+
+DATA_PANEL_SOURCE_PATH="";
+DataSet CD2 = ReadDataFile (USE_NEXUS_FILE_DATA);
+DataSetFilter CD2_part = CreateFilter (CD2,3,"0-560","(null)","TAA,TAG,TGA");
+Tree CD2_tree=((((Pig,Cow)Node3,Horse,Cat)Node2,((RhMonkey,Baboon)Node9,(Human,Chimp)Node12)Node8)Node1,Rat,Mouse);
+OpenDataPanel(CD2,"(null)","0,0,0,0,2,0,10","MG94xREV_3x4,6,0,14443523,CD2_tree",CD2_LF);
+
+global CD2_part_Shared_AC=0.5710714109234631;
+global CD2_part_Shared_AT=0.2756961373814887;
+global CD2_part_Shared_CG=0.4456308760366715;
+global CD2_part_Shared_CT=0.9454291760502562;
+global CD2_part_Shared_GT=0.3224080259059006;
+CD2_tree.Node12.synRate=0.08168540352543764;
+CD2_tree.Node8.nonSynRate=0.2938890030949185;
+CD2_tree.Human.synRate=1e-30;
+CD2_tree.Baboon.nonSynRate=0;
+CD2_tree.Baboon.synRate=0.01716650886630832;
+CD2_tree.Node12.nonSynRate=0.02962786133931161;
+CD2_tree.Chimp.synRate=1e-30;
+CD2_tree.Chimp.nonSynRate=0.005834136861061837;
+CD2_tree.Node9.nonSynRate=0.0433794394076959;
+CD2_tree.Human.nonSynRate=0;
+CD2_tree.Node9.synRate=0.1139808847086709;
+CD2_tree.Node8.synRate=0.1586154947684889;
+CD2_tree.Rat.synRate=0.1533251749656354;
+CD2_tree.Mouse.nonSynRate=0.2332402459120736;
+CD2_tree.Mouse.synRate=0.4604267094040578;
+CD2_tree.Rat.nonSynRate=0.1585006932449144;
+CD2_tree.Node1.nonSynRate=0.5097883291072822;
+CD2_tree.Node1.synRate=1.227004762734591;
+CD2_tree.RhMonkey.synRate=0;
+CD2_tree.Node3.synRate=0.1877287558837553;
+CD2_tree.Pig.nonSynRate=0.4826366809736332;
+CD2_tree.Horse.nonSynRate=0.518627673056701;
+CD2_tree.Cow.nonSynRate=0.681831503936737;
+CD2_tree.Cat.synRate=0.4672127128189641;
+CD2_tree.Node3.nonSynRate=0.2648957141533021;
+CD2_tree.Horse.synRate=0.430860769501357;
+CD2_tree.Pig.synRate=0.3721230153643161;
+CD2_tree.Node2.synRate=0.2137858662796737;
+CD2_tree.RhMonkey.nonSynRate=0.01161863878954486;
+CD2_tree.Cat.nonSynRate=0.7203773170684773;
+CD2_tree.Node2.nonSynRate=0.1379570235930709;
+CD2_tree.Cow.synRate=0.3646221318370894;
+
+END;
diff --git a/tests/hbltests/data/HIVenvSweden.seq b/tests/hbltests/data/HIVenvSweden.seq
new file mode 100644
index 0000000..7eca08f
--- /dev/null
+++ b/tests/hbltests/data/HIVenvSweden.seq
@@ -0,0 +1,18 @@
+   13  273
+
+U68496    GTAGTAATTAGATCTGAAAACTTCTCGAACAATGCTAAAACCATAATAGTACAGCTAAATAAATCTGTAGAAATTAATTGTACAAGACCCAACAACAATACAAGAAGAAGTATACATTTTGGACCAGGGAAAGCATTTTATGCAGGAGAAATAATAGGAGATATAAGACAAGCATATTGTACCCTTAATGGAACAGAATGGAATAACACTTTAAAACAGGTAGCTGAAAAATTAAGAGAACAATTTATTAAAACAATAGTTTTTAATCAATCC
+U68497    ATAGTAATTAGATCTGAAAACTTCTCGAACAATGCTAAAACCATAATAGTACAGCTAAATAAATCTGTAGAAATTAATTGTACAAGACCCAACAACAATACAAGAAGAAGTATACATTTCGGACCAGGGAAAGCATTTTATGCAGGAGAAATAATAGGAGATATAAGACAAGCATATTGTACTCTTAATGGAGCAGAATGGAATAACACTGTAAAACAGGTAGCTGCAAAATTAAGAGAACAATTTAATAAAACAATAATCTTTAATCAATCC
+U68498    GTAGTAATTAGATCTGAAAACTTCACGAACAATGCTAAAACCATAATAGTACAGCTAAATAAATCTGTAGAAATTAATTGTGTAAGACCCGGCAACAATACAAGAAGAAGTATACATATAGGACCAGGGAGAGCATATTATACAGGAGAAGTAATAGGAGATATAAGACAAGCACATTGTAACCTTAGTAGAACAGACTGGAATAAAACTTTAAAACAGGTAGCTGAAAAATTAAGAGAACAATTTAATACAACAATAGTCTTTAATCAATCC
+U68499    ATAGTAATTAGATCTGAAAACTTCACGAACAATGCTAAAACCATAATAGTACAGCTAAATAAATCTGTAGAAATTAAGTGTGAAAGACCCAACAACAATACAAGAAAAAGTGTACATATAGGACCAGGGAGAGCATATTATACAGGAGAAATAATAGGAGATATAAGACAAGCACATTGTAACCTTAGTGGAACAGAATGGAGGGAAACTTTAAAACAGGTAGCTGAAAAATTAAGAGAACAATTTAATAAAACAATAGTCTTTAATCAATCC
+U68500    ATAGTAATTAGATCTGAAAACTTCACGAACAATGCTAAAACCATAATAGTACATCTAAATGAATCTGTAGAAATTATTTGTGAAAGACCCAACAACAATACAAGAAAAAGTGTACATATGGGACCAGGGAGAGCATATTACACAGGAGAAATAATAGGAGATATAAGACAAGCACATTGTAACATTAGTAGAACAAATTGGACGGAAACTTTAAAACAGGTAGCTGAAAAATTAAGAGAACAATTTAATAAAACAATAGTCTTTAATCAATCC
+U68501    GTAGTAATTAGATCTGAAAACTTCACGAACAATGCTAAGACCATAATAGTACAGCTAAATAAACCTGTAAAAATTAATTGTACAAGACCCAACAACAATGCAAAAATAAGAATACATATAGGACCAGGGAGACCATTTTATACAGCAGGAGAAATAGGAAATATAAGACAAGCACATTGTAACCTTAGTAGAACAGACTGGAATAACACTTTAAAACTGGTAGCTGAAAAATTAAGAGAACAATTTAATAAAACAATAGTCTTTAATCAATCC
+U68502    GTAGTAATTAGATCTGAAAACTTCACGAACAATGCTAAGACCATAATAGTACAGCTAAATAACTCTGTAGCAATTAAGTGTGAAAGACCCAACAACAATACAAGAAAAAGTATACCTATAGGACCAGGGAGAGCCTTTTATACAACAGGAGACATAGGAGATATAAGACAAGCACATTGTAACCTTAGTAGAAAAGACTGGAATGACACTTTAAGACAGGTAGTTGGAAAGTTAAGAGAACAATTTGGAAGAACAATAATCTTTAATCAATCC
+U68503    ATAGTAATTAGATCTGAAAACTTCACGAACAATGCTAAAACCATAATAGTACAGCTAAAGGAACCTGTAGACATTACTTGTGAAAGACCCAGCAACAATACAAGAAAAAGTATACATATAGGACCAGGAAAAGCATTTTATGCAACAGGAGAAATAGGAGATATAAGACGAGCACATTGTAACCTTAATAGAACAGCATGGAATAAAACTTTAAAACAGGTAGTTGAAAAATTAAGAGAACAATTTAAGAAAACAATAACCTTTAACCAATCC
+U68504    ATAGTAATTAGATCTGAAAACTTCACAGACAATGCTAAAACCATAATAGTACAGCTAAATAAATCTGTAGAAATTAATTGTACAAGACCCAACAACAATACAAGAAAAAGTATACATATAGGACCAGGGAGAGCTTTTTATACAACAGGTGAAATAGGAGATTTAAGACAAGCACATTGTAACCTTAGTAGAACAGCATGGAATGAAACTTTAAGACAAGTAGCTCAAAAATTAAAAGAACAATTTAATAGAACAATAGTTTTTAATCAATCC
+U68505    ATAGTAATTAGATCTGAAAACTTCACAGACAATGCTAAAACCATAATAGTACAGCTAAACAAATCTGTAGAAATTAATTGTATAAGACCCAACAACAATACAAGAAAAAGTATACATATAGGACCAGGGAGAGCATTTTATACAACAGGAGACATAGGAGATATAAGACAAGCATATTGTAACCTTAGTAGAACAGCATGGAATGAAACTTTAAGACAAGTAGCTCAAAAATTAAAAGAACAATTTAATAGAACAATAGTCTTTAATCAATCC
+U68506    ATAGTAATTAGATCTGAAAACTTCACGGACAATGCTAAAACCATAATAGTACAGCTAAATAAATCTGTAGAAATTAATTGTACAAGACCCAACAACAATACAAGAAAAAGTATAAATTTTGGACCAGGGAGAGCATTTTATACAACAGGTGAAATAGGAAATTTAAGACAAGCACATTGTAACCTTAGTAGAACAGCATGGAATGAAACTTTAAGACAAGTAGCTAAAAAACTAAAAGAACAATTTAATAGAACAATAGTTTTTAATCAATCC
+U68507    GTAGTAATTCGATCTGAAAACTTCACGGACAATGCTAAAACCATAATAGTACAGCTAAACAAATCTGTAGAAATTACTTGTGTAAGACCCAACAACAATACAAGAAAAAGTATAAATATAAGACCAGGGAGAGCATTTTATACAACAGGAGAAATAGGAGATATAAGACAAGCACATTGTAACCTTAGTAGAACAGCATGGAATGAAGCTTTAAGACAAGTAGCTAAAAAATTAAAAGAACAATTTAATAGAACAATAGTCTTTAATCAATCC
+U68508    ATAGTAATCAGATCTGAAAACTTCTCGGACAATGCTAAAACCATAATAGTACAGCTAAACAACACTGTAAACATTACTTGTGAAAGACCCAACAACAATACAAGAAAAAGGATACATATAGGACCAGGGAGAGCAGTTTATACAACAGGACAAATAGGAGATATAAGAAAAGCACATTGTAACCTTAGTAGAACAAATTGGACTGAAACTTTAAGACAAGTAGCTGAAAAATTAAAAGAACAATTTAATAAAACAATAATCTTTAATAATTCC
+
+1
+(U68496: 0.023746, U68497: 0.079178, ((U68498: 0.050407, (U68499: 0.028429, U68500: 0.099890): 0.083460): 0.023647, (U68501: 0.131681, (U68502: 0.191150, (U68503: 0.193336, ((((U68504: 0.018984, U68506: 0.070370): 0.055603, U68505: 0.030301): 0.036688, U68507: 0.061120): 0.034773, U68508: 0.198346): 0.050591): 0.064013): 0.033695): 0.048101): 0.152813);
diff --git a/tests/hbltests/data/HMM2_synthetic.fas b/tests/hbltests/data/HMM2_synthetic.fas
new file mode 100644
index 0000000..80c585d
--- /dev/null
+++ b/tests/hbltests/data/HMM2_synthetic.fas
@@ -0,0 +1,37 @@
+#NEXUS
+
+[
+Generated by HYPHY 2.0020100119beta(MP) for MacOS(Universal Binary) on Tue Apr 20 10:02:04 2010
+
+]
+
+BEGIN TAXA;
+	DIMENSIONS NTAX = 8;
+	TAXLABELS
+		'D_CD_83_ELI_ACC_K03454' 'D_CD_83_NDK_ACC_M27323' 'D_UG_94_94UG114_ACC_U88824' 'D_CD_84_84ZR085_ACC_U88822' 'B_US_83_RF_ACC_M17451' 'B_FR_83_HXB2_ACC_K03455' 'B_US_86_JRFL_ACC_U63632' 'B_US_90_WEAU160_ACC_U21135' ;
+END;
+
+BEGIN CHARACTERS;
+	DIMENSIONS NCHAR = 1320;
+	FORMAT
+		DATATYPE = DNA
+
+		GAP=-
+		MISSING=?
+		NOLABELS
+	;
+
+MATRIX
+ AAATTTTTGTAAGAGAATAAGCTTGCTTGTAACATTTAGCGGAAAGGCCTGTGTGAGGACCTAGTCATTCAAACGCTGGAAAACCTGGTAAGTTAGCCTGAGATCACAAACATAAAAAGAAAATACAGATAAGCGGCCACAATCAGAATAAGATATGAAACAATTTGAAGAAATTAAGACACTAATATATACTGACTTTAGATAACTATGTAGAATAAAGGACGGGGTCAGAAGGCAATATAAAGGCGCTTCTAAACCCACTTGGACGGTAGTACCCTACTTAAGGCGCACTAGTCAGCAAGCTTTTTTTTTAGGTGATCATTCGACTCCAAAGGCTAGGCACAATATGTGCATCAACGACTCACCGGTAACTAACCAAACTGTCTTCTATTAGATAAGAAGCGGAATGTTAATAGCACTGATCCATTAAAACGGTTACGTATACCAAGTTTGTGGTTTAACCAGCAATCAAGATAGACATCTACGATGAT [...]
+ AAATTTTTGTAAGAGAATAAGCTTGCTTGTAATATTTAGCGGAAAGGCCTGTGTGAGGACCTAGTCATTCAAACGCTGGAAGACCTGGTAAGTTAGCCTGATATCACAAACATAAAAAGAAAATACAGATAAGCGGCCACAATCAGAATAAGATATGAAACAATTTGAAGAAATTAAGACACTAATATAAACTGACTTTAGATAACTATGTAGAATAAAGGACGGGGTCAGAAGGCAATATAAAGGCGCTTCTAAACCCACTTGGACGGTAGTACCGTACTTAAGACGCACTAGTCAGCAAGCTTTTTTTTTAGGTGATCATTCGACTCCAAAAACTAGGCACAATATGTGCATCAACGACTCACCGGTAACTAACCAAACTGTCTTCTATTAGATAAGAAACGGAATGTTAATGGCACTGATCCATTAAAACGGTTACGTATACCAAGTTTGTGGTTTAACCAGCAATCAAGATAGACATCTACGATGAT [...]
+ AAATTTTTGTAAGAGAATAAGCTTGCTTGTAATATTCAACAGAAAGACCTGTGTGAGGACCTAGTCATTCAAACGCTGGAAAACCTGGTAAGTTAACTTGATATCACAAGTATAAAAAGTAAATACAGATAAACGGCCACAATCCGAATAAGATTTGAAACAATTTGAAGAAATTAAGAAACTAATATATATTGACTTCAGATAACTATGTAGAATAAAGGACGGGGTCAAAAGGCAATATGAAGACGCCCCTAAACCCACTTGGACGGTAATACACTACTTAAGACGCCCTAGTCAGCAAGCTCTTTTTTTAGGTGATCATTCGACTCCAAAGACTAAGCACAATACGTGCATCAACGACTCATCGGTAACTAACCAAACTGCCTTTTATTAGATAAGAAGCGGAATGTCAATAACACTGTTCCATTAGAACGAATACGTATACCAAGTTTGTGGTTTAGCCAGCAATCAAGATAGACATCTACGATGAT [...]
+ AAATTTTCGTAGGAAAATAAGCTTGCTTGTAATGTTTAACGGAAAGGCCCGTGTGAAGACCTAGTCATTCAAACGCTAGAAAACCTGGTAAATTAACCTGATATCACAAATATAAAAAGTAAATACAGATAAACGGCCACAATCAGAATAAGATATGAAACAATTTGAAGGAATTAAGACACTAATATATACTAACTTTAGATAACTATGTAGAATAAAGGACGGGGTCAGAAGGCAATATAAAGGCGCTTTTAAACCCACTTGGACGGTAATACCCTACTTAAGACGCACTAGTCAGCAAGCTCTTTTTTTAGGTGATCATTCGACTCCAAAGACTAAGCACGATATGTGCATCAACGACTCACCGGTGATTAACCAAACTGTCATCTATTAGATAAGAAGCGGAATGTTAATAGCACTGATCCATTAAAGCGGTTGCGTATACCAAGTTTGTGGTATAACCAGCAATCAAGATAGACATCTACGATGAT [...]
+ AAATTTTCGTAAGAGAATAGGCCTGTTTGTAATATTTAGCAGGAAGGTCTGTGTGAAAACCTAGTCATTCAAACGCTGGAAAACCTGGTAAGTTAACCTAATATCACAAATTTAAAAAGTAAATACAGATAAACGGCCACAATCAGAATAAGATATGAAACAATTTGAAGGAATTAAAACACTAATGTATACTGACTTTAGATAACTATGTAGAATAAAGGACGGAGTCAGAAGGCAATATAAAGGCGCTTCTAAACCCACTTGGACGGTGATGCCTTACTTAAGACGCACTAGTCAGCAAGCTCTTTTTTTAGGTGATCATTCGACTCCAAAGACTAAGCACGATATGTGCATCAACGACTCACCGGTGACTAACCTAACCGTCTTCTACTAGATAAGAAGCGGAATGTTAATAGCACCGATCCATTAAAACGATTGCGTATTCCAAGTTTGTGGTTTAACCAGCAATCAAGATAGACATCTACGATGAT [...]
+ AAATTTTCGTAAGAGAATAAGCTTGTTTGTAATATTTAACGGAAAGGCCTGTGTGAAGACTTAGTCATTCGAACGCTGGAAAACCTGGTAAGTTAACCTGATATCACAAATATAAAAAGTAAATACAGATAAACGGCCACAATCAGAATAAGATATGAAACAATTTGAAGGAATTAAGACACTACTATATACTGACTTTAGATAACTATGTAGAATAAAGGACGGGGTCAGAAGGCAGTATAAAGGCGCTTCTAAACCCACTTGGACAGTAATACCCTACTTAAGACGCACTAGTCAGCAAGCTCTTTTTTTAGGTGATCATTCGACTCCAAAGACTAAGCACGATATGTGCATCAACGACTCACCGGTGACTAACCAAACTGTCTTCTATTAGATAAGAAGCGGAATGTTAATAGCACTGATCCATTAAAACGATTGCGTATACCAAGTTTGTGGTTTAACCAGCAATCAAGATAGACATCTACGATGAT [...]
+ AAATTTTCGTAAGAGAATAAGCTTGTTTGTAATATTTAACGGAAAGGCCTGCGTGAAGACCTAGTCATTCAAACGCTGGAAAACCTGGTAAGTTAACCTGATATCACAAATATAAAAAGTAAATACAGATAAACGGCCACAATCAGAATAAGATATGAAACAATTTGAAGGAATTAAGACACTACTATATACTGACTTCAGATAACTATGTAGAATAAAGGACCGGGTCAGAAGGCGATATAAAGGCGCTTCTAAACCCACTTGGACGGTAATACCCTACTTAAGACGCACTAGTCAGCAAGCTCTTTTTTTAGGTGATCATTCGACTCCAAAGACTAAGCACGATATGTGCATCAACGGTTCACCTGTGACTAACCAAACTGTCTTCTGTTAGATAAGAAGCGGAATGTTAATAGCTCTGATCCATTAAAACGATTGCGTATACCAAGTTTGTGGTTTAACCAGCAATCAGGATAGACATCTACAATGAT [...]
+ AAATTTTCGTAAGAGAATAAGCTTGTTTGTAATATTTAACGGAAAGGCCTGTGTGAAGACCTAGTCACTCAAGCGCTGGACAACCTAGTAAGTTAACCTGATATCACAAATATAAAAAGTAAATACAGATAAACGGCCACAATCAGAATAAGATATGAAACAATTTGAAGGAATTAAGACACTATTGTATACTGACTTTAGATAACTATGTAGAATAAAGGACGGGGTCAAAAGGCAATATAAAGGCGCTTCTAAACCCACTTGGACGGTAATACCCTGCTTAAGACGCACTAGTCAGCAAGCTCTTTTTTTAGGTGATCATTCGACTTCAAAGACTAAGCACGATATGTGCATCAACAACTCACCAGTGACCAACCAAACTGTCTTCTATTAGATAAGAAGCGGAATGTTAATAGCACTGATCCATTAAAACGATTGCGTATACAAAGTTTGTGGTTTAACCAGCAATCAAGATAGACATCTACGATGAT [...]
+END;
+
+BEGIN TREES;
+	TREE tree = ((((D_CD_83_ELI_ACC_K03454,D_CD_83_NDK_ACC_M27323),D_UG_94_94UG114_ACC_U88824),D_CD_84_84ZR085_ACC_U88822),B_US_83_RF_ACC_M17451,((B_FR_83_HXB2_ACC_K03455,B_US_86_JRFL_ACC_U63632),B_US_90_WEAU160_ACC_U21135));
+END;
\ No newline at end of file
diff --git a/tests/hbltests/data/HMM4_synthetic.fas b/tests/hbltests/data/HMM4_synthetic.fas
new file mode 100644
index 0000000..6b155bb
--- /dev/null
+++ b/tests/hbltests/data/HMM4_synthetic.fas
@@ -0,0 +1,37 @@
+#NEXUS
+
+[
+Generated by HYPHY 2.0020100119beta(MP) for MacOS(Universal Binary) on Tue Apr 20 09:51:17 2010
+
+]
+
+BEGIN TAXA;
+	DIMENSIONS NTAX = 8;
+	TAXLABELS
+		'D_CD_83_ELI_ACC_K03454' 'D_CD_83_NDK_ACC_M27323' 'D_UG_94_94UG114_ACC_U88824' 'D_CD_84_84ZR085_ACC_U88822' 'B_US_83_RF_ACC_M17451' 'B_FR_83_HXB2_ACC_K03455' 'B_US_86_JRFL_ACC_U63632' 'B_US_90_WEAU160_ACC_U21135' ;
+END;
+
+BEGIN CHARACTERS;
+	DIMENSIONS NCHAR = 1320;
+	FORMAT
+		DATATYPE = DNA
+
+		GAP=-
+		MISSING=?
+		NOLABELS
+	;
+
+MATRIX
+ GTGCATAAGATATTAAGAGCGATAACCGTTTGTCCAACTGACATGAGATTCGAAGCGATATGTGTCTGGCTTGAAAACAGGAAGCACAGGCGAAAGCGAGTATCTGGACACTGCGAAGGTGTCAATCGAGAAAATTTAAGTAAGTTATGCGAAATATACAAACGAGTGATACAGAGTCGAAATACACATCACATTATTGATAGTTAATGAGGTCATTAGCCCCTGAATATAATCCGTGAGATAGAAAACATCGTTAGATGATGACGTAAATTTTACCTATCCTAGCGTAAGCAAGGAAAAAGTAGGGAAAGATAGAAATCCGTTCGCAACTAAAACAAGTTGGGGAAACAAGCTAATTAATTAAATAGCAATTGGGAGTACTGAACTAGAACAAATCGGGAGTCAAGACTAAATCCTGTTGGAATTACCATACAAAAATAGAGGTTGCTGGCACTACCTCCGCAAGAGTGAGAATGGAAGAACTGTAACAG [...]
+ GTGCATAAGATATTAAGAGCGATAACCGTTTGTTCAACTAACATGAGATTCGAGGCGATATGTGTCTGGCTTGAAAACAGGAAGCACAGGCGAAAGCACATATCTGGACACTGCGAAGGTGTCAATCGAGAAAGTTTAAGTAAGTTATGCGAAATATAAAAACGAGTAATACAGAGTCGAAATGCACGTCACATTATTGATAGATAATGAGGTCATTAGCCCCTGAATATAACCCGTGAGATAGAAAACATCGTTAGATGATGACGTAAATTCTACCTATCCTAGCGTAAGCAAGGAAAAAGTAGGGAAAGATAGAAATCCGTTCGCAACTAAAACAAGTTGGGGAAACAAGTCAATTAATTAAATAGCAATTGGGAGTGCTGAACTAGAACAAATCGGGAGTCAAGACTAAATCCTGTTGGAATTACCATACAAAAATAGAGGTTGCTGGCACTACCTCTGCAAGAGCGAAAATGGAAGAACTGTAACAG [...]
+ CTGCATAAGAGATTAAGACCGATAACCGTTTGTTTTACTAACATGAGATTCCAGGTGATACGTATCTGACGTAAAAACAGGAGGCGCAAGCGAAAGCACGTATCTGGACAGTACGAAAGTGTCAATCGAGTAAATTTAAGTAAGTTACGCGAGACATAAAAGCGAGTGGTACAGAGTCAAAATGCACATCACATTATTAATAGTTAATGAGGTCATTAGCCCCTGAATATAACCCGTGAGATAGAAAACATCGTTAGATGATGACGTAAATTCTACCTATCCTAGCGTAAACAAGGAAAAAGTAGGGAAAGGTAGAAATCCGTTCGCAACTAAAACAAGTTGGGGAAACAAGCCAATTACTTAAATAGCAATTGGGAGTGCCGAACTAGAACAAAACGGGAGTCAAGACTAAATCCTGTTGGAATTACCATACAAAAATAAAGGTTGCTGGCTCTACCTCCGCAAGAGCGAAAATGGAAGAACTGTAACAG [...]
+ GTGCATAAGATATTAAGAGCGATAACCGTCTGTACTACTAACATGAGATTCGAGGCGATATGTGTCTGGCTTGAAAACAGGAAGCACAGGTGAAAGCACGTATCTAGACACTGCGAAGGTGTCAATCGAGTGAATTTAAGTAAGTTATACTAGATATAAAAGCGAGTGGTACAGAGTCGAAATGCACATCACATTATTGATAGTTAATGAGGTCATTAGCCCCTGAATATAACCCGTGAGATAGAAAACATCGTTAGATGATGACGTAAATACTACCTATCCTAGCGTAAGCAAGGAAAAAGTAGGGAAAGATAGAAATCCGTTCGCAGCTAAAACAAGTTGGGGAAACAAGCCAATTAATTAAATAGCAATTGGGAGTGCTGAACTAGAACAAATCGGGAGTCAAGACTAAGTCCTGTTGGAATTACCATACAAAAGTAGAGGTTGCTGGCACTACCTCCGCAAGAGCGAAAATGGAAGAACTGTAACAG [...]
+ GTGCATAAGATATTAAGAGCGATAACTGTTTGGTCTACTAACATGAGATTCGAGGCGACATATGTCTGGCTTGAAAATAGAAGGCACAGGCGAAAGCACATATCTGGACACTGCGAAGATGTCAGGCGAGTGAATTTAAATAAGTTATATTAAACCTAAAAGCAACTGATACAGAGTCCAAATGTACGTCACATTATAGCTAGTTAATGAGGTCATTAGCCCCTGAATATAACCCGTGAGATAGGCAACATCATTAGATGATGACGTAAATTCTACCTATCCTAGCGTAAGCAAGGAAAAAGTAGGGAAAGATAGAAATCCGTTCGCTACTAAAACAAGTTAGGGAAACAAGCCGATTGATAAAATAACAATTGGAGGTGCTGAACTAGAACAAATCGGGAGTCAAGACTAAATCCTGTTGGAATTACCATACAAAAATAGAGGTTGCTGGCACTACCTCCGCAAGAACGAAAATGGAAGAACTGTAACAG [...]
+ GTGCATAAGATATTAAGAGCGAAAACTGTTTGGTCTACTAACATGGGATTCGAGGCGATATATGTTTGGCTTGAAGACAGGAAGCACAGGCAAAAGCACGTATCTGGACACTGCGAAGGTGTCAGTCGAGCAAATTTAAGTAAGTTATGCTAAACATAAAAGCGACTGATACAGAGTCCAAATGCACATTACATTATTGATAGTTAATGAGGTCATTAGCCCCTGAATATAACCCGTGAGATAAGCAACATCGTTAGATGACGACGTAAATTCTACCTATCCTAACGTAAGCAAGGAAAAAGTAGGGAAAGATAGAAATCCGTTCGCAACTAAAACAAGTTAGGGAAACAAGCCGAGTAATTAAATAACAATTGGAGGTGCTGAACTAGAACAAATCGGGAGTCAAGACTAAATCCTGTTGGAATTACCATACAAAAATAGAGGTTGCTGGCACTACCTCCGCAAGAACGAAAATGGAAGAACTGTAACAG [...]
+ GTGCATAAGATATTAAGAACGAAAACCGTTTGGTTTACTAACATGAGATTCGAGGCGATATATGCTTGACTTGAAAGCAGGAAGCACAGGCAACCGCACGTATCTGGACACTGCGAAGGTGTCAGTCGAGTAAATTTAAGTAAGTTATGCTTAACATAAAAGCGGCTGATACAGAGTCCAAATGCACATCACATTATTGATAGTTAATGAGGTCATTAGCCCCTGAATATAACCCGTGAGATAAGCAACATCGTTAGATGACGACGTAAATTCTACCTATCCTAGCGTAAGCAAGGAAAAAGTAGGGAAAGATAGAAATCCGTTCGCAACTAAAACAAGTTAGGGAAACAAGCCGATTAATTAAATAACAATTGGAGGTGCCGAACTAGAACAAATCGGGAGTCAAGACTAAATCCTGTTGGAATTACCATACAAAAATAGAGGTTGCTGGCACTACCTCCGCAAGAACGAAAATGGAAGAACTGTAACAG [...]
+ GTGCATAAGATATTAAGAGCGAAAAGTGTTTGGTCTACTTACATGAGATTGGAGGCGATATATGTTTGGCTTGAAGACAGGAAGCACAAGCAAAAGCACGCATCCGGACACTGCGAAGGTGTCAGTCGAGTAAATTTAAGTAAGTTATGCTAAACTTAAGAGCGACTGATACAGAGTCCAAATTCACATCACATTGTTGGTAGTTAATGAGGTCATTAGCCCCTGAATATAACCCGTGAGATAAGCAACATCGTTAGATGACGACGTAAATTCTACCTATCCTAGCGTAAGCAAGGAAAAAGTAGGGAAAGATAGAAATCCGTTCGCAACTAAAACAAGTTAGGGAAGCAAGCCGATTAATTAAATAACAATTGGAAGTGCTGAACTAGAACAAATCGGGAGTCAAGACTAAATCCTGTTGGAATTACCATACAAAAATAGAGGTTGCTGGCACTACCTCCGCAAGAACGAAAATGGAAGAACTGTAACAG [...]
+END;
+
+BEGIN TREES;
+	TREE tree = ((((D_CD_83_ELI_ACC_K03454,D_CD_83_NDK_ACC_M27323),D_UG_94_94UG114_ACC_U88824),D_CD_84_84ZR085_ACC_U88822),B_US_83_RF_ACC_M17451,((B_FR_83_HXB2_ACC_K03455,B_US_86_JRFL_ACC_U63632),B_US_90_WEAU160_ACC_U21135));
+END;
\ No newline at end of file
diff --git a/tests/hbltests/data/fluHA.nex b/tests/hbltests/data/fluHA.nex
new file mode 100644
index 0000000..723ae6b
--- /dev/null
+++ b/tests/hbltests/data/fluHA.nex
@@ -0,0 +1,371 @@
+#NEXUS
+
+BEGIN TAXA;
+	DIMENSIONS NTAX = 349;
+	TAXLABELS
+		'AG207_796' 'IN1_1196' 'PARIS8395' 'TIANJIN339' 'AG601_796' 'LA5_1195' 'SH19_896' 'VAL_491' 'NCH813_895' 'TD4796' 'DE3_1195' 'NY43_1196' 'TD5096' 'FL4_1195' 'PARIS36395' 'TD5196' 'HK434_1096' 'YOKOHAMA73' 'HEBEI1293' 'AG39_796' 'FUJIAN133_' 'NY37_1096' 'AUC10896_9' 'GD1_396' 'NY50_1196' 'AUC5_697' 'NY55_1296' 'PA2_297' 'BE17_197' 'GNX189_796' 'PR1_797' 'BE24496_19' 'GQ1014_109' 'RI7_397' 'BE62_297' 'GZH66_497' 'SAITAMA809' 'BK197' 'HAR3_1296' 'SANTAFE208' 'BR184_696' 'SAUS54_797' 'BR30 [...]
+END;
+
+BEGIN CHARACTERS;
+	DIMENSIONS NCHAR = 967;
+	FORMAT
+		DATATYPE = DNA
+		GAP=-
+		MISSING=?
+	;
+
+MATRIX
+	'AG207_796'   CAAAACTTCCCGGAAATGACAACAGCACGGCAACACTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCCGGCACCCTGGAGTTTAACAATGAAAGCTTCAATTGGACTGGAGTCGCTCAGAATGGAACAAGCTATGCTTGCAAAAGGGGATCTATTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'IN1_1196'    CAAAACTTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATACAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACGGTCCTCACCAAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCTTCCGGCACCCTGGAGTTTACCAATGAAAGCTTCAATTGGACTGGAGTCGCTCAGAATGGAACAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'PARIS8395'   CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCCCAACAGGTAGAATATGCGACAGTCCTCACCGGATCCTTGATGGAAAGAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCGAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAACGAAAACTTCAATTGGACTGGAGTCGCTCAGGATGGGAAAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATACC [...]
+	'TIANJIN339'  CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGGATGGGGGAAGCTATGCTTGCAAAAGGGGATCAGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'AG601_796'   CAGAACTTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACGCCATGCAGTGCGAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCCGGCACCCTGGAGTTTAACAATGAAAGCTTCAATTGGACTGGAGTCGCTCAGAATGGAACAAGCTATGCTTGCAAAAGGGGATCTATTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'LA5_1195'    CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACAAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCTCTAGTTGCCTCATCAGGCACCCTGGAGTTTACCAATGAAGGCTTCAATTGGACTGGAGTCGCTCAGGATGGGAAAAGCTATTCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'SH19_896'    CAAAACTTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCCGGCACCCTGGAGTTTAACAATGAAAGCTTCAATTGGACTGGAGTCGCTCAGAATGGAACAAGCTATGCTTGCAAAAGGAGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'VAL_491'     CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCTTGGGACATCATGCAGTACCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAGATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATGAGAAATGGGATCTTTTTGTTGAACGCGGCAAAGCTTTCAGCAACTGCTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCGTCAGGCACCCTGGAGTTTATCAATGAAGGCTTCAATTGGACTGGAGTCACTCAGAGTGGGGGAAGCGCTGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTCAGTAGATTGAATTGGTTGTATGAGAGCAAATATC [...]
+	'NCH813_895'  CAAAACTTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAGATTGGAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCTTCCCTTAGGTCACTAGTTGCCTCATCCGGCACCCTGGAGTTTATCAATGAAGGCTTCAATTGGACTGGAGTCGCTCAGGATGGAACAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAAGACAAATATC [...]
+	'TD4796'      CAAAACTTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCTCTAGTTGCCTCATCCGGCACCCTGGAGTTTAACAATGAAAGCTTCAATTGGACTGGAGTCGCTCAGAATGGAACAAGCTATGCTTGCAAAAGGAGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'DE3_1195'    CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTACCAATGAAGGCTTCAATTGGACTGGAGTCGCTCAGGATGGGAAAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'NY43_1196'   CAAAACTTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCAAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCACAGCCTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCCGGCACCCTGGAATTTACCAAAGAAGGCTTCAATTGGACTGGAGTCGCTCAGGATGGAACAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'TD5096'      CAAAACTTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAGAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCCGGCACCCTGGAGTTTAACAATGAAAGCTTCAATTGGACTGGAGTCGCCCAGAATGGAACAAGCTATGCTTGCAAAAGGAGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'FL4_1195'    CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTACCAATGAAGGCTTCAATTGGACTGGAGTCGCTCAGGATGGGAAAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'PARIS36395'  CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCCCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAGAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCAAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAACGAAAACTTCAATTGGACTGGAGTTGCTCAGGATGGGAAAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATACC [...]
+	'TD5196'      CAAAGCTTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCCGGCACCCTGGAGTTTAACAATGAAAGCTTCAATTGGACTGGAGTCGCCCAGAATGGAACAAGCTATGCTTGCAAAAGGAGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'HK434_1096'  CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCCCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAGAACTGCACACTGATAGATGCTCTTTTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAACGAAAACTTCAATTGGACTGGAGTCGCTCAGGATGGGAAAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'YOKOHAMA73'  CAAAACTTCCCGGAAATGGCAACAGCACAGCAACGCTGTGCCTGGGACATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGTTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGGATGGGGGAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'HEBEI1293'   CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGGATGGGGGAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'AG39_796'    CAAAACTTCCCGGAAATGACAACAGCACGGCAACACTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCCGGCACCCTGGAGTTTAACAATGAAAGCTTCAATTGGACTGGAGTCGCTCAGAATGGAACAAGCTATGCTTGCAAAAGGAGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'FUJIAN133_'  CAAAACTTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCCGGCACCCTGGAGTTTAACAATGAAAGCTTCAATTGGACTGGAGTCGCTCAGAATGGAACAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'NY37_1096'   CAAAACTTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCCGGAACCCTGGAGTTTACCAATGAAGGCTTCAATTGGACTGGAGTCGCTCAGGATGGAACAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'AUC10896_9'  CAAAACTTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCGACTGTTACCCTTATGATGTGCCGGATTATGCTTCCCTTAGGTCACTAGTTGCCTCATCCGGCACCCTGGAGTTTACCAATGAAGGCTTCAATTGGACTGGAGTCGCTCAGGATGGAACAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'GD1_396'     CAAAACTTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACGGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCTTTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCCGGCACCCTGGAGTTTACCAATGAAAGCTTCAATTGGACTGGAGTCGCTCAGAATGGAACAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCATAAATACAAATATC [...]
+	'NY50_1196'   CAAAACTTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCAAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCACAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCCGGCACCCTGGAGTTTACCAAAGAAGGCTTCAATTGGACTGGAGTCGCTCAGGATGGAACAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'AUC5_697'    CAAAAATTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAGAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCCTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCCGGCACCCTGGAGTTTAACAATGAAAGCTTCAATTGGACTGGAGTCGCTCAGAATGGAACAAGCTATGCTTGCAAAAGGAGATCTATTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACCAATACAAATATC [...]
+	'NY55_1296'   CAAAACTTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAATTCCTCAACAGGTAGGATATGTGACAGTCCTCACCGAATCCTTGATGGGAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCCGGCACCCTGGAGTTTAACAATGAAAGCTTCAATTGGACTGGAGTCGCTCAGAATGGAACAAGCTATGCTTGCAAAAGGAGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'PA2_297'     CAAAACTTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCAAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCACAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCCGGCACCCTGGAGTTTACCAATGAAGGCTTCAATTGGACTGGAGTCGCTCAGGATGGAACAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAGTATC [...]
+	'BE17_197'    CAAAACTTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTATAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAATTGCCTCATCCGGCACCCTGGAGTTTAACAATGAAAGCTTCAATTGGACTGGAGTCGCTCAGAATGGAACAAGCTATGCTTGCAAAAGGAGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'GNX189_796'  CAAAACTTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCCGGCACCCTGGAGTTTAACAATGAAAGCTTCAATTGGACTGGAGTCGCTCAGAATGGAACAAGCTATGCTTGCAAAAGGAGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'PR1_797'     CAAAACTTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAGAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCCTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCCGGCACCCTGGAGTTTAACAATGAAAGCTTCAATTGGACTGGAGTCGCTCAGAATGGAACAAGCTATGCTTGCAAAAGGAGATCTATTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACCAATACAAATATC [...]
+	'BE24496_19'  CAAAACTTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAGTGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTCAGGTCACTAGTTGCCTCATCCGGCACCCTGGAGTTTAACAATGAAAGCTTCAATTGGACTGGAGTCTCTCAGAATGGAACAAGCTATGCTTGCAAAAGGAGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'GQ1014_109'  CAAAACTTCCCGGTAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAACTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCACAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCCGGCACCCTGGAGTTTACCAATGAAGGCTTCAATTGGACTGGAGTCGCTCAGAATGGAACAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'RI7_397'     CAAAACTTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAAGAATGGGACCTTTTTGTTGAACGCAACAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCCGGCACCCTGGAGTTTACCAATGAAGGCTTCAATTGGACTGGAGTCGCCCAGAATGGAACAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'BE62_297'    CAAAACTTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTATAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACATTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCCGGCACCCTGGAGTTTAACAATGAAAGCTTCAATTGGACTGGAGTCGCTCAGAATGGAACAAGCTATGCTTGCAAAAGGAGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'GZH66_497'   CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCGACTGTTACCCTTATGATGTGCCGGATTATGCTTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTACCAATGAAGGCTTCAATTGGACTGGAGTCGCTCAGGATGGGACAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'SAITAMA809'  CAAAACTTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCCGGCACCCTGGAGTTTAACAATGAAAGCTTCAATTGGACTGGAGTCGCTCAGAATGGAACAAGCTATGCTTGCAAAAGGAGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'BK197'       CAAAACTTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAAAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAATTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCGACTGTTACCCTTATGATGTGCCGGATTATGCTTCCCTTAGGTCACTAGTTGCCTCATCTGGCACCCTGGAGTTTACCAAAGAAGGCTTCAATTGGCCTGGAGTCGCTCAGGATGGAACAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'HAR3_1296'   CAAAACTTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGCTACCCTTATGATGTGCCGGATTATGCCTCCCTCAGGTCACTAGTTGCCTCATCCGGCACCCTGGAGTTTAACAATGAAAGCTTCAATTGGACTGGAGTCTCTCAGAATGGAACAAGCTATGCTTGCAAAAGGAGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'SANTAFE208'  CAAAACTTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCATCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCCGGCACCCTGGAGTTTAACAATGAAAGCTTCAATTGGACTGGAGTCGCTCAGAATGGAACAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'BR184_696'   CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGAACAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGACTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCTTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTACCAAGGAAGGCTTCAATTGGACTGGAGTCGCTCAGGATGGGAAAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'SAUS54_797'  CAAAACTTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAGAAAACTGCACACTGATAGATGCTCTATTGGGAGACCTTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCCTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCCGGCACCCTGGAGTTTAACAATGAAAGCTTCAATTGGACTGGAGTCGCTCAGAATGGAACAAGCTATGCTTGCAAAAGGAGGTCTATTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACCAATACAAATATC [...]
+	'BR309_796'   CAAAACTTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAGTGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCCGGCACCCTGGAGTTTACCAATGAAGGCTTCAATTGGACTGGAGTCGCTCAGGATGGAACAAGCTATGCTTGCAAAAGGGGATCTGTTAAAGGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'HI1_997'     CAAAAATTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTTCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAGAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCCTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCCGGCACCCTGGAGTTTAACAATGAAAGCTTCAATTGGACTGGAGTCGCTCAGAATGGAACAAGCTATGCTTGCAAAAGGAGATCTATTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACCAATACAAATATC [...]
+	'BR3_496'     CAAAAATTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGACTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTACCAAGGAAGGCTTCAATTGGACTGGAGTCGCTCAGGATGGGAAAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'HK358_796'   CAAAACTTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAAAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCCGGCACCCTGGAGTTTAACAATGAAAGCTTCAATTGGACTGGAGTCGCTCAGAATGGAACAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'SHZH157_79'  CAAAACTTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCCGGCACCCTGGAGTTTAACAATGAAAGCTTCAATTGGATTGGAGTCGCTCAGAATGGAACAAGCTCTGCTTGCAAAAGGAGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'BR43_697'    CAAAACTTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAGTGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCCGGCACCCTGGAATTTACCAATGAAGGCTTCAATTGGACTGGAGTTGCTCAGAATGGAACAAGCTATGCTTGCAAAAGGGGATCTGTTAAAGGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'HK387_797'   CAAAACTTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAGAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCCTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCCGGCACCCTGGAGTTTAACAATGAAAGCTTCAATTGGACTGGAGTCGCTCAGAATGGAACAAGCTATGCTTGCAAAAGGAGATCTATTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACCAATACAAATATC [...]
+	'SP214_197'   CAAAATTTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGACTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCCGGCACCCTGGAGTTTAACAATGAAAGCTTCAATTGGACTGGAGTCGCTCAGAATGGAACAAGCTATGCTTGCAAAAGGAGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'BR45_696'    CAAAAATTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGATAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGACTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTACCAAGGAAGGCTTCAATTGGACTGGAGTCGCTCAGGATGGGAAAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'HK391_797'   CAAAACTTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAGAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCCTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCCGGCACCCTGGAGTTTAACAATGAAAGCTTCAATTGGACTGGAGTCGCTCAGAATGGAACAAGCTATGCTTGCAAAAGGAGATCTATTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACCAATACAAATATC [...]
+	'SYD497'      CAAAACTTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAGAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCCTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCCGGCACCCTGGAGTTTAACAATGAAAGCTTCAATTGGACTGGAGTCGCTCAGAATGGAACAAGCTATGCTTGCAAAAGGAGATCTATTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACCAATACAAATATC [...]
+	'BR51_897'    CAAAACTTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAGTGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCCGGCACCCTGGAGTTTACCAATGAAGGCTTCAATTGGACTGGAGTTGCTCAGAATGGAACAAGCTATGCTTGCAAAAGGGGATCTGTTAAAGGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'SYD597'      CAAAAATTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAGAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCCTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCCGGCACCCTGGAGTTTAACAATGAAAGCTTCAATTGGACTGGAGTCGCTCAGAATGGAACAAGCTATGCTTGCAAAAGGAGTTCTATTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACCAATACAAATATC [...]
+	'BR597_796'   CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGACTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTACCAAGGAAGGCTTCAATTGGACTGGAGTCGCTCAGGATGGGAAAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'JA416_297'   CGAAACTTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGGCACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAGTGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCCGGCACCCTGGAGTTTAACAATGAAAGCTTCAATTGGACTGGAGTTGCTCAGAATGGGACAAGCTATGCTTGCAAAAGGAGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACCAATACAAATATC [...]
+	'SYD697'      CAAAAATTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAGAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCCTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCCGGCACCCTGGAGTTTAACAATGAAAGCTTCAATTGGACTGGAGTCGCTCAGAATGGAACAAGCTATGCTTGCAAAAGGAGATCTATTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACCAATACAAATATC [...]
+	'BR87_596'    CAAAAATTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGACTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTACCAAGGAAGGCTTCAATTGGACTGGAGTCGCTCAGGATGGGAAAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'JOH10_697'   CAAAACTTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCAAATCCTTGATGGGAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCAAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCACAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCGGGCACCCTGGAGTTTACCAATGAAGGCTTCAATTGGGCTGGAGTCGCTCAGGATGGAACAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'TAS1_797'    CAAAACTTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCACAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCCGGCACCCTGGAGTTTACCAATGAAGGCTTCAATTGGACTGGAGTCGCTCAGGATGGAACAAGCTATGCTTGCAAAAGGAGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'CA10_797'    CAAAACTTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTTGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCAAATCCTTGATGGAAAAAACTGCACATTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCACAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCCGGCACCCTGGAGTTTACCAAAGAAGGCTTCAATTGGACTGGAGTCGCTCAGGATGGAACAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'JOH3_397'    CAAAACTTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCCGGCACCCTGGAGTTTAACAATGAAAGCTTCAATTGGACTGGAGTCGCTCAGAATGGAACAAGCTACGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'CA13_1296'   CAAAACTTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCAAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCACAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCCGGCACCCTGGAGTTTACCAAAGAAGGCTTCAATTGGACTGGAGTCGCTCAGGATGGAACAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'JOH5396_97'  CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAGATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAAAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTACCGATGAAGGCTTCAATTGGACTGGAGTCGCTCAGGATGGGAAAAGCTCTGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAACACAAATATC [...]
+	'TH78_397'    CAAAACTTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTGGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCGACTGTTACCCTTATGATGTGCCGGATTATGCTTCCCTTAGGTCACTAGTTGCCTCATCCGGCACCCTGGAGTTTACCAATGAAGGCTTCAATTGGACTGGAGTCGCTCAGGATGGAACAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATATAAATATC [...]
+	'CANBERRA5_'  CAAAACTTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAGAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCCTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCCGGCACCCTGGAGTTTAACAATGAAAGCTTCAATTGGACTGGAGTCGCTCAGAATGGAACAAGCTATGCTTGCAAAAGGAGATCTATTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACCAATACAAATATC [...]
+	'JOH9_597'    CAAAACTTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCAAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCACAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCCGGCACCCTGGAGTTTACCAAAGAAGGCTTCAATTGGACTGGAGTCGCTCAGGATGGAACAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'TH79_397'    CAAAACTTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTGGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCGACTGTTACCCTTATGATGTGCCGGATTATGCTTCCCTTAGGTCACTAGTTGCCTCATCCGGCACCCTGGAGTTTACCAATGAAGGCTTCAATTGGACTGGAGTCGCTCAGGATGGAACAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATATAAATATC [...]
+	'KO572_297'   CAAAACTTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCCGGCACCCTGGAGTTTAACAATGAAAGCTTCAATTGGACTGGAGTTGCTCAGAATGGGACAAGCTATGCTTGCAAAAGGAGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACCAATACAAATATC [...]
+	'TH9496_97'   CAAAACTTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCCGGCACCCTGGAGTTTACCAATGAAGGCTTCAATTGGACTGGAGTCGCTCAGGATGGAACAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'CAR42297'    CAAAACTTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCGACTGTTACCCTTATGATGTGCCGGATTATGCTTCCCTTAGGTCACTAGTTGCCTCATCCGGCACCCTGGAGTTTACCAATGAAGGCTTCAATTGGACTGGAGTCGCTCAGGATGGAACAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'KO671_297'   CAAAACTTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCCGGCACCCTGGAGTTTAACAATGAAAGCTTCAATTGGACTGGAGTTGCTCAGAATGGGACAAGCTATGCTTGCAAAAGGAGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACCAATACAAATATC [...]
+	'TIANJING51'  CAAAACTTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCCGGCACCCTGGAGTTTAACAATGAAAGCTTCAATTGGACTGGAGTCGCTCAGAATGGAACAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'CAR465_896'  CAAAACTTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCCTACAGCGACTGTTACCCTTATGATGTGCCGGATTATGCTTCCCTTAGGTCACTAGTTGCCTCATCCGGCACCCTGGAGTTTACCAATGAAGGCTTCAATTGGACTGGAGTCGCTCAGGATGGAACAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'TIANJING55'  CAAAACTTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGACGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCCGGCACCCTGGAGTTTAACAATGAAAGCTTCAATTGGACTGGAGTCGCTCAGAATGGAACAAGCTATGCTTGCAAAAGGAGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'CL170_1096'  CAAAACTTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAATTGCCTCATCCGGCACCCTGGAGTTTAACAATGAAAGCTTCAATTGGACTGGAGTCGCTCAGAATGGAACAAGCTATGCTTGCAAAAGGAGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'KY2_297'     CAAAACTTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACGGTCCTCACCGAATCCTTGATGGGAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCCTCCGGCACCCTGGAGTTTACCAATGAAAGCTTCAATTGGCCTGGAGTCGCTCAGAATGGAACAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'TX1196_97'   CAAAACTTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGGGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTAACAATGAAAGCTTCAATTGGACTGGAGTCGCCCAGAATGGAACAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'CN101_197'   CAAAACTTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCAAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCACAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCCGGCACCCTGGAGTTTACCAATGAAGGCTTCAATTGGACTGGAGTCGCTCAGGATGGAACAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAACATC [...]
+	'MN1_1196'    CAAAACTTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCGACTGTTACCCTTATGATGTGCCGGATTATGCTTCCCTTAGGTCACTAGTTGCCTCATCCGGCACCCTGGAGTTTACCAATGAAGGCTTCAATTGGACTGGAGTCGCTCAGGATGGAACAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'CN10679_99'  CAAAAATTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAATTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAGAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCCTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCCGGCACCCTGGAGTTTAACAATGAAAGCTTCAATTGGACTGGAGTCGCTCAGAATGGAACAAGCTATGCTTGCAAAAGGAGATCTATTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACCAATACAAATATC [...]
+	'MN1_497'     CAAAACTTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCAAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCAAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCACAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCCGGCACCCTGGAGTTTACCAAAGAAGGCTTCAATTGGACTGGAGTCGCTCAGGATGGAACAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'UR41_197'    CAAAACTTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGACTTCCAAAATGAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCCTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCCGGCACCCTGGAGTTTAACAATGAAAGCTTCAATTGGATTGGAGTCGCTCAGAATGGAACAAGCTATGCTTGCAAAAGGAGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'MO10_1196'   CAAAACTTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCAAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCACAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCCGGCACCCTGGAGTTTACCAAAGAAGGCTTCAATTGGACTGGAGTCGCTCAGGATGGAACAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'VIC3097'     CAAAACTTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGCTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCACAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCCGGCACCCTGGAGTTTACCAATGAAGGCTTCAATTGGACTGGAGTCGCTCAGGATGGAACAAGCTATGCTTGCAAAAGGAGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'CO11_1196'   CAAAACTTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACGGTCCTCACCAAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCTTCCGGCACCCTGGAGTTTACCAATGAAAGCTTCAATTGGACTGGAGTCGCTCAGAATGGAACAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'MO11_1196'   CAAAACTTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGGAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCAAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCACAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCCGGCACCCTGGAGTTTACCAATGAAGGCTTCAATTGGACTGGAGTCGCTCAGGATGGAACAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'VIC4797'     CAAAACTTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCACAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCCGGCACCCTGGAGTTTACCAATGAAGGCTTCAATTGGACTGGAGTCGCTCAGGATGGAACAAGCTATGCTTGCAAAAGGAGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'CORD3278_7'  CAAAAATTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCATCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCCGGCACCCTGGAGTTTAACAATGAAAGCTTCAATTGGACTGGAGTCGCTCAGAATGGAACAAGCTATGCTTGCAAAAGGAGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'MON318_696'  CAAAACTTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGGAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCGACTGTTACCCTTATGATGTGCCGGATTATGCTTCCCTTAGGTCACTAGTTGCCTCATCCGGCACCCTGGAGTTTACCAATGAAGGCTTCAATTGGACTGGAGTCGCTCAGGATGGAACAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'WE397'       CAAAAATTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAGAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCCTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCCGGCACCCTGGAGTTTAACAATGAAAGCTTCAATTGGACTGGAGTCGCTCAGAATGGAACAAGCTATGCTTGCAAAAGAGGATCTATTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACCAATACAAATATC [...]
+	'DE4_397'     CAAAACTTCCCGGAAATGACAACAGCACGGCAACTCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCGACTGTTACCCTTATGATGTGCCGGATTATACTTCCCTTAGGTCACTAGTTGCCTCATCCGGCACCCTGGAATTTACCAATGAAGGCTTCAATTGGACTGGAGTCGCTCAGGATGGAACAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'MOS2_197'    CAAAACTTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCAAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCTCAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCCGGCACCCTGGAGTTTACCAATGAAGGCTTCAATTGGACTGGAGTCGCTCAGGATGGAACAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'YOKOHAMA68'  CAAAACTTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCGACTGTTACCCTTATGATGTGCCGGATTATGCTTCCCTTAGGTCACTAGTTGCCTCATCCGGCACCCTGGAGTTTACCAATGAAGGCTTCAATTGGACTGGAGTCGCTCAGGATGGAACAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'FG39_1096'   CAAAACTTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAATTGCCTCATCCGGCACCCTGGAGTTTACCAATGAAGGCTTCAATTGGACTGGGGTCGCTCAGGATGGAACAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'FR7597'      CAAAACTTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTAGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACAGAATCCTTGATGGAAAAAACTGCACACTGATAGACGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCCGGCACCCTGGAGTTTACCAATGAAGGCTTCAATTGGATTGGAGTCGCTCAGGATGGAACAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'NJ8_1296'    CAAAACTTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATGTGCGACGGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCCGGCACCCTGGAGTTTACCAATGAAAGCTTCAATTGGACTGGAGTCGCTCAGAATGGAACAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'NY9_196'     CAAAACTTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCCGGCAACCTGGAGTTTACCAATGAAGGCTTCAATTGGACTGGAGTCGCTCAGGATGGAACAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'SHA9_995'    CAAAACTTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTCGGTCACTAGTTGCCTCATCCGGCACCCTGGAGTTTACCAATGAAGGCTTCAATTGGACTGGAGTCGCTCAGGATGGAACAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'HK357_696'   CAAAACTTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGTCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCCGGTACCCTGGAGTTTAACAATGAAAGCTTCAATTGGACTGGAGTCGCTCAGAATGGAACAAGCTATGCTTGCAAAAGGAGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'CI2115_696'  CAAAACTTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGGAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCCGGCACCCTGGAGTTTAACAATGAAAGCTTCAATTGGACTGGAGTCGCTCAGAATGGAACAAGCTATGCTTGCAAAAGGAGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'GZH8_496'    CAAAACTTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCCGGCACCCTGGAGTTTAACAATGAAAGCTTCAATTGGACTGGAGTCGCTCAGAATGGAACAAGCTATGCTTGCAAAAGGAGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'GZH11_496'   CAAAACTTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAAAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCCGGCACCCTGGAGTTTAACAATGAAAGCTTCAATTGGACTGGAGTCGCTCAGAATGGAACAAGCTATGCTTGCAAAAGGAGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'SHZH43_396'  CAAAACTTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACGGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCCGGCACCCTGGAGTTTACCAATGAAAGCTTCAATTGGACTGGAGTCGCTCAGAATGGAACAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCATAAATACAAATATC [...]
+	'WZH1_596'    CAAAACTTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACGGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCCGGCACCCTGGAGTTTACCAATGAAAGCTTCAATTGGACTGGAGTCGCTCAGAATGGAACAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'FUK11496E'   CAAAACTTCCCAGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAGTTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCCGGCACCCTGGAGTTTACCAATGAAGGCTTCAATTGGACTGGAGTCGCTCAGGATGGAACAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTTTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'FUK11496C'   CAAAACTTCCCAGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAGTTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCCGGCACCCTGGAGTTTACCAATGAAGGCTTCAATTGGACTGGAGTCGCTCAGGATGGAACAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTTTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'AUC596'      CAAAACTTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCGACTGTTACCCTTATGATGTGCCGGATTATGCTTCCCTTAGGTCACTAGTTGCCTCATCCGGCACCCTGGAGTTTACCAATGAAGGCTTCAATTGGACTGGAGTCGCTCAGGATGGAACAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'BRI2296'     CAAAACTTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCGACTGTTACCCTTATGATGTGCCGGATTATGCTTCCCTTAGGTCACTAGTTGCCTCATCCGGCACCCTGGAGTTTACCAATGAAGGCTTCAATTGGACTGGAGTCGCTCAGGATGGAACAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'BRIS3596'    CAAAACTTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCGACTGTTACCCTTATGATGTGCCGGATTATGCTTCCCTTAGGTCACTAGTTGCCTCATCCGGCACCCTGGAGTTTACCAATGAAGGCTTCAATTGGACTGGAGTCGCTCAGGATGGAACAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'CHR196'      CAAAACTTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCGACTGTTACCCTTATGATGTGCCGGATTATGCTTCCCTTAGGTCACTAGTTGCCTCATCCGGCACCCTGGAGTTTACCAATGAAGGCTTCAATTGGACTGGAGTCGCTCAGGATGGAACAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'HI2_796'     CAAAACTTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCGACTGTTACCCTTATGATGTGCCGGATTATGCTTCCCTTAGGTCACTAGTTGCCTCATCCGGCACCCTGGAGTTTACCAATGAAGGCTTCAATTGGACTGGAGTCGCTCAGGATGGAACAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'WE4896'      CAAAACTTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCGACTGTTACCCTTATGATGTGCCGGATTATGCTTCCCTTAGGTCACTAGTTGCCTCATCCGGCACCCTGGAGTTTACCAATGAAGGCTTCAATTGGACTGGAGTCGCTCAGGATGGAACAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'CNIC35_196'  CAAAACTTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCTTCCCTTAGGTCACTAGTTGCCTCATCCGGCACCCTGGAGTTTACCAATGAAGGCTTCAATTGGACTGGAGTCGCTCAGGATGGAACAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'WUH359_995'  CAAAACTTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCTTCCCTTAGGTCACTAGTTGCCTCATCCGGCACCCTGGAGTTTACCAATGAAGGCTTCAATTGGACTGGAGTCGCTCAGGATGGAACAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'NCH933_995'  CAAAACTTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAGTGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCTTCCCTTAGGTCACTAGTTGCCTCATCCGGCACCCTGGAGTTTACCAATGAAGGCTTCAATTGGACTGGAGTCGCTCAGGATGGAACAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'WA596'       CAAAACTTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCTGGCACCCTGGAGTTTACCAATGAAGGCTTCAATTGGGCTGGAGTCGCTCAGGATGGAACAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'FUJIAN47_3'  CAAAACTTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCTTCCCTTAGGTCACTAGTTGCCTCATCCGGCACCCTGGAGTTTACCAATGAAGGCTTCAATTGGACTGGAGTCGCTCAGGATGGAACAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'JA99_196'    CAAAACTTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCTTCCCTTAGGTCACTAGTTGCCTCATCCGGCACCCTGGAGTTTACCAATGAAGGCTTCAATTGGACTGGAGTCGCTCAGAATGGAACAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'WI3_896'     CAAAACTTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAGTGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCTCCCCTTAGGTCACTAGTTGCCTCATCCGGAACCCTGGAGTTTACCAATGAAGGCTTCAATTGGACTGGAGTCGCTCAGGATGGAACAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'AK2_796'     CAAAACTTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCCGGAACCCTGGAGTTTACCAATGAAGGCTTCAATTGGACTGGAGTCGCTCAGGATGGAACAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'TW523_596'   CAAAACTTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATATGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCCGGCACCCTGGAGTTTACCAATGAAGGCTTCAATTGGACTGGAGTCGCTCAGGATGGAACAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'CNIC22_195'  CAAAACTTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGTTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCCGGCACCCTGGAGTTTACCAATGAAGGCTTCAATTGGACTGGAGTCGCTCAGGATGGAAAAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'GNX42_495'   CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACTGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCCGGCACCCTGGAGTTTACCAATGAAGGCTTCAATTGGACTGGAGTCGCTCAGGATGGAAAAAGCTCTGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'MO6_396'     CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGGATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTACCAATGAAGGCTTCAATTGGACTGGAGTCGCTCAGGATGGGAAAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGTACAAATACAAATATC [...]
+	'CN2796_129'  CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAATAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGATCACTAGTTGCCTCATCAGGCACCCTGGAGTTTACCAATGAAGGCTTCAATTGGACTGGAGTCGCTCAGGATGGGAAAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'ID3_1195'    CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTACCAATGAAGGCTTCAATTGGACTGGAGTCGCTCAGGATGGGAAAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'AK16_995'    CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAGATGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTACCAATGAAGGCTTCAATTGGACTGGAGTCGCTCAGGATGGGAAAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'JOH1795'     CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAGATGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTACCAATGAAGGCTTCAATTGGACTGGAGTCGCTCAGGATGGGAAAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'ID4_1195'    CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTACCAATGAAGGCTTCAATTGGACTGGAGTCGCTCAGGATGGGAAAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'NV1_1195'    CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAGCGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGATTCAGAGTTCCCCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTACCAATGAAGGCTTCAATTGGACTGGAGTCGCTCAGGATGGGAAAAGCTATTCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'KO45_296'    CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGCTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTACCAATGAAGGCTTCAATTGGACTGGAGTCGCTCAGGATGGGAAAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'CN61_296'    CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTACCAATGAAGGCTTCAATTGGACTGGAGTCGCTCAGGATGGGAAAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATATAAATATC [...]
+	'BZ2_395'     CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTAGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTACCAATGAAGGCTTCAATTGGACTGGAGTCGCTCAGGATGGGAAAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'GE491_396'   CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTACCAATGAAGGCTTCAATTGGACTGGAGTCGCTCAGGATGGGAAAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'UK897_696'   CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACAAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTACCAATGAAGGCTTCAATTGGACTGGAGTCGCTCAGGATGGGAAAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'MN6_1195'    CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCCCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTACCAATGAAGGTTTCAATTGGACTGGAGTCGCTCAGGATGGGAAAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'CN17_196'    CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACAAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTACCAATGAAGGCTTCAATTGGACTGGAGTCGCTCAGGATGGGAAAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'BE281_1294'  CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTACCAATGAAGGCTTCAATTGGACTGGAGTCGCTCAGGATGGGAAAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'SHD5_894'    CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTACCAATGAAGGCTTCAATTGGACTGGAGTCGCTCAGGATGGGAAAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'AG4057_795'  CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCATTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTACCAATGAAGGCTTCAATTGGACTGGAGTCGCTCAGGATGGGAAAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'BZ18_496'    CAAAAATTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGACTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTACCAAGGAAAGCTTCAATTGGACTGGAGTCGCTCAGGATGGGAAAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'BZ8_496'     CAAAAATTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGACTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTACCAAGGAAGGCTTCAATTGGACTGGAGTCGCTCAGGATGGGAAAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'GE578652_2'  CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTACCAAGGAAGGCTTCAATTGGACTGGAGTCGCTCAGGATGGGAAAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'WV1_395'     CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTAAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTACCAAGGAAGGCTTCAATTGGACTGGAGTCGCTCAGGATGGGAAAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'SN27_595'    CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAGGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTACCAAGGAAGGCTTCAATTGGACTGGAGTCGCTCAGGATGGGAAAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'WA186_1294'  CAAAACTTCCCGGAAATGACAACAGCACAACAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTACCAAGGAAGGCTTCAATTGGACTGGAGTCGCTCAGGATGGGAAAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'GE767_495'   CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAAAAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTACCAAGGAAGGCTTCAATTGGACTGGAGTCGCTCAGGATGGGAAAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'HK3_195'     CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTACCAAGGAAGGCTTCAATTGGACTGGAGTCGCTCAGAATGGGAAAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'SN28_595'    CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGGAAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTACCAAGGAAGGCTTCAATTGGACTGGAGTCGCTCAGGATGGGAAAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'NJ11_1294'   CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTAGAGTTTACCAAGGAAGGCTTCAATTGGACTGGAGTCGCTCAGGATGGGAAAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'HK38_895'    CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAGGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAGCGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGATCACTAGTTGCCTCATCAGGCACCCTGGAGTTTACCAAGGAAGGCTTCAATTGGACTGGAGTCGCTCAGGATGGGAAAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'CN147_495'   CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAATGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAGCAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTACCAAGGAAGGCTTCAATTGGACTGGAGTCGCTCAGGATGGGAAAAGCTATTCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'VA25_1294'   CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTACCAAGGAAGGCTTCAATTGGACTGGAGTCGCTCAGGATGGGAAAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAAGACAAATATC [...]
+	'JOH295'      CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTACCAAGGAAGGCTTCAGTTGGACTGGAGTCGCTCAGGATGGGGGGAGCTGTGCTTGCAAAAGGGGATCTGCCAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'AK10_295'    CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTACCAATGAAGGCTTCAATTGGACTGGAGTCGCTCAGGATGGGAAAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'NE11_395'    CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTTCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTACCAATGAAGGCTTCAATTGGACTGGAGTCGCTCAGGATGGGAAAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'KWJ195_119'  CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTACCAATGAAGGCTTCAATTGGACTGGAGTCGCTCAGGATGGGAAAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'CHW995_129'  CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCAACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTACCAATGAAGGCTTCAATTGGACTGGAGTCGCTCAGGATGGGAAAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'HAR3_194'    CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGGATGGGACAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'HK42_396'    CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCCCAACAGGTAGAATATGCGACAGTCCTCACCGGATCCTTGATGGAAGAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAACGAAAACTTCAATTGGACTGGAGTCGCTCAGGATGGGAAAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATACC [...]
+	'MEM196_119'  CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCCCAACAGGTAGAATATGCGACAGTCCTCACCGGATCCTTGATGGAAAGAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCAAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAACGAAAACTTCAATTGGACTGGAGTCGCTCAGGATGGGAAAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATACC [...]
+	'NY17_1294'   CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCCCAACAGGTAGAATATGCAACAGTCCTCACCGGATCCTTGATGGAAAGAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACACTGGAGTTTATCAACGAAAACTTCAATTGGACTGGAGTCGCTCAGGATGGGAAAAGCTATACTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'CA5_395'     CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTCCAGAGTTCCCCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAGAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCTGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTACCAACGAAAACTTCAATTGGACTGGAGTCGCTCAGAATGGGAAAAGCTATACTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'JA8695_129'  CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCCCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAGAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTACCAACGAAAACTTCAATTGGACTGGAGTCGCTCAGAATGGGAAAAGCTATTCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'SP378_195'   CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCCCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAGAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTACCAACGAAAACTTCAATTGGACTGGAGTCGCTCAGGATGGGAAAAGCTATTCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'PA7_1294'    CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCCCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAGAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTACCAACGAAAACTTCAATTGGACTGGAGTCGCTCAGGATGGGAAAAGCTATTCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'LA1_195'     CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAATTCCCCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAGAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTACCAACGAAAACTTCAATTGGACTGGAGTCGCTCAGGATGGGAAAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'NJ8_1194'    CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAATTCCCCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAGAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTACCAACGAAAACTTCAATTGGACTGGAGTCGCTCAGGATGGGAAAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'CN124_295'   CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCCCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAGAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTACCAACGAAAACTTCAATTGGACTGGAGTCGCTCAGGATGGGAAAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'MA1_195'     CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCCCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAGAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTACCAACGAAAACTTCAATTGGACTGGAGTCGCTCAGGATGGGAAAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'OH3_195'     CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCCCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAGAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTACCAACGAAAACTTCAATTGGACTGGAGTCGCTCAGGATGGGAAAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'NJ10_195'    CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCCCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAGAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAATTTACCAACGAAAACTTCAATTGGACTGGAGTCGCTCAGGATGGGAAAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'IL5_195'     CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCCCAACAGGTAGAATATGCAACAGTCCTCACCGAATCCTTGATGGAAAGAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTACCAACGAAAACTTCAATTGGACTGGAGTCGCTCAGGATGGGAAAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'TX5_1294'    CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTTCCCAACAGGTAGAATATGTGACAGTCCTCACCGAATCCTTGATGGAAAGAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTACCAACGAAAACTTCAATTGGACTGGAGTCGCTCAGGATGGGAAAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'SP351_195'   CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCCCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAGAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTACCAACGAAAACTTCAATTGGACTGGAGTCGCTCAGGATGGGAAAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'PA15_295'    CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCCCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAGAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGATCACTAGTTGCCTCATCAGGCACCCTGGAGTTTACCAACGAAAACTTCAATTGGACTGGAGTCGCTCAGGATGGGAAAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'NY28_1294'   CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAGCGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCCCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAGAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTACCAACGAAAACTTCAATTGGACTGGAGTCGCTCAGGATGGGAAAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'HK1_694'     CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCCCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAGAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAGCTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAACGAAAACTTCAATTGGACTGGAGTCGCTCAGGATGGGAAAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'HK55_794'    CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCCCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAGAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAACGAAAACTTCAATTGGACTGGAGTCGCTCAGGATGGGAAAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'JOH33_794'   CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCCCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAGAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAACGAAAACTTCAATTGGACTGGAGTCGCTCAGGATGGGAAAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'AG3779_109'  CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCCCAACAGGTAGAATATGCGACAGCCCTCACCGAATCCTTGATGGAAAGAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAACGAAAACTTCAATTGGACTGGAGTCGCTCAGGATGGGAAAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'AKI194'      CAAAACTTCCCGGAAATGACAACAGCACAGCAACACTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAGAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGGATGGGAAAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGCTGCACAAATACAAATATC [...]
+	'RO182_194'   CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGGATGGGAAAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGCTGCACAAATACAAATATC [...]
+	'VT3_194'     CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGTAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGGATGGGAAAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGCTGCACAAATACAAATATC [...]
+	'RO160_194'   CACAACTTCCCAGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGGATGGGAAAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGCTGCACAAATACAAATATC [...]
+	'SANT7198_8'  CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGGACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACATTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGCGTCGCTCAGGATGGGAAAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGCTGCACAAATACAAATATC [...]
+	'FR120394'    CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGGATGGGAAAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'NED37293'    CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGGATGGGAAAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'NY16_1194'   CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAATTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGGATGGGAAAAGCTATACTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACCAATACAAATATC [...]
+	'NY4295_119'  CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAATTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGGATGGGAAAAGCTATACTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACCAATACAAATATC [...]
+	'PA993_1294'  CCAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGAACAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCAACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGGATGGGAAAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'CA5_1193'    CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGGATGGGAAAAGCTATTCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'WA41_1293'   CGAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAGCGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTGTCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGGATGGGAAAAGCTATTCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'CA4_794'     CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAGACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGGATGGGACAAGCTATTCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'SP190_393'   CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGGATGGGAAAAGCTATTCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACGAATACAAATATC [...]
+	'ST1_193'     CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGGATGGGAAAAGCTATTCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'SP125_293'   CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGGATGGGAAAAGCTATACTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'WY1_1193'    CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGGAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATCCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGGATGGGAAAAGCTATACTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAGTACAAATATC [...]
+	'TX57_1293'   CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGGTCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTATTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGGATGGGAAAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'LA4_893'     CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTAGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTGGCTCAGGATGGGAAAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'LA6_993'     CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTAGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTGGCTCAGGATGGGAAAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'NY3_293'     CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTAGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTAGCTCAGGATGGGAAAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'NY15_894'    CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGATTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTAATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTAGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTAGCTCAGGATGGGAAAAGCTATGCTTGCAGAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAGTTACAAATATC [...]
+	'AK18_493'    CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGGATGGGAAAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'NY26_293'    CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGGATGGGAAAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'NY38_193'    CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAATCGCTCAGGATGGGAAAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'ENG22093'    CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGGATGGGAAAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'WA2693'      CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCTTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGGATGGGAAAAGCTATGCTTGCAAACGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'GA3_393'     CAAAACTTCCCGGAAATGACAACAGCACAGCAACACTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGGATGGGAAAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'BK122_694'   CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCTTGGGACACCATGCGGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGACTTGGTTCAGAATTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGGGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGGATGGGAAAAGCTATGCTTGCAAAAGGGGATCTGTTAACGGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'TH7594'      CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCGGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAATTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATTAATGAAGACTTCAATTGGACTGGAGTCGCTCAGGATGGGAAAAGCTATGCTTGCAAAAGGGGATCTGTTAAAGGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'SN7_694'     CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGGCACCATGCGGTGCCAAACGGAACGCTAGTGAAAACAATCGCGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAATTCTTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGGATGGGAAAAGCTATACTTGCAAAAGGGGATCTGTTAACGGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'AG3105_693'  CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAATCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGGATGGGAAAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAAGACAAGTATC [...]
+	'GD25_693'    CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCGAAGCTTACAGCAGCTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGGATGGGAAAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'WUZ1_794'    CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAGCTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAATCGCTCAGGATGGGAAAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'UDE44_394'   CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCATCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGGATGGGAAAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'CC893'       CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGGATGGGAAAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'WAIK2093'    CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGCTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGGATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCACCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGGATGGGAAAAGCTCTGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'GD27_594'    CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAAAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGGATGGGAAAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'AA393'       CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGGATGGGAAAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'NO93'        CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAGATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGGATGGGGAAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'NCH3396_59'  CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGGAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCAAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGGATGGGGGAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'NY1393'      CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACATCATGCAGTGCCAAACGGAACGCTGGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGGAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGGATGGGGGAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'NGX10_193'   CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCCTATGATGTGCAGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGGATGGGGGAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'SIC4_593'    CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCCTATGATGTGCAGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGGATGGGGGAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'RU58_393'    CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCCTATGATGTGCAGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCACTCAGGATGGGGGAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'WUZ4_493'    CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCCTATGATGTGCAGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGGATGGGGGAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'GD04_393'    CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGGATGGGGGAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'HAR1592'     CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAGATTGAAGTGACTAATGCTACTGAGCTGGTACAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGGATGGGGGAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'NCH12_1193'  CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGACTATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGGATGGGGGAAGCTATGCTTGCAGAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'NCH3332_49'  CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGACTATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGGATGGGGGAAGCTATGCTTGCAGAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'NCH58_1293'  CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGACTATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAAGTGGACTGGAGTCGCTCAGGATGGGGGAAGCTATGCTTGCAGAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'HK23_792'    CAAAACTTCCCGGAAATGACAACAGCACAGCAACACTGTGCCTGGGACATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGGATGGGGGAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTAAATTGGTTGTACAAATACAAATATC [...]
+	'SHD9_393'    CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGTTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGGCAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGGATGGGGGAAGCTATGCTTGCAAAAGAGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'PS688_193'   CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAAAGATCAAATTGAAGTGACTAATGCTACTGAGTTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGGATGGGGGAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'SAP_1292'    CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGTTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGGATGGGGGAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'NY64_1293'   CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACAGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTAATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTACCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGGATGGGGGAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'NY63_1293'   CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACAGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTAATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTACCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGGATGGGGGAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'FR110994'    CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACAGAATCCTTGATGGGAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTAATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTACCAATGAGGACTTCAATTGGACTGGAGTCGCTCAGGATGGGGGAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'UR46967_29'  CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCCCTATTGGGAGACCCTAATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTACCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGGATGGGGGAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'CA271_1192'  CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGGATGGGGGAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTCAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'KITA93'      CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGGATGGGGGAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATACC [...]
+	'QD53_392'    CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGAAGTCGCTCAGGATGGGGGAAGCTGTGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'AK9_1192'    CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCAAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGGATGGGGGAAGCTATTCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'HI3_1192'    CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCCCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGGATGGGGGAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'VIC193'      CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCAAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTTGCTCAGGATGGGGGAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'BE32_192'    CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCTTGGGACATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGGATGGGGGAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'BE46_292'    CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCTTGGGACATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGGATGGGGGAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'DJ3109_129'  CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGGCATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTTGCTCAGGATGGGGGAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'KA206_1191'  CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGGATGGGGGAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'PERTH01_49'  CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTATGCCTGGGACATCATGCAGTGCCAAATGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATAGCTTCCAAAACAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGGATGGGGGAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACGAATACAAATATC [...]
+	'PS192SPF'    CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTATGCCTGGGACATCATGCAGTGCCAAATGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCATGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATAGCTTCCAAAACAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGGATGGGGGAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'HK34_490'    CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTATGCCTGGGACATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAGCGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGGATGGGGGAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACGAATACAAATATC [...]
+	'SH24_890'    CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATTCTTGATGGGGAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGAGTGGGGGAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACGAATACAAATATC [...]
+	'SN91'        CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGAGTGGGGGAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACGAATACAAATATC [...]
+	'VIC29_392'   CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTATGCCTGGGGCATCATGCAGTGCCAAACGGAACTCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTCGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAATTGTTACCCTTATGATGTGCCAGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGAATGGGGGCAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACGAATACAAATATC [...]
+	'VIC68_792'   CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGGCATCATGCAGTGCCAAACGGAACTCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTCGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAATTGTTACCCTTATGATGTGCCAGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGAATGGGGACAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACGAATACAAATATC [...]
+	'SAS68_692'   CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGGCATCATGCAGTGCCAAACGGAACTCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTCGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAATTGTTACCCTTATGATGTGCCAGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGAATGGGGACAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACGAATACAAATATC [...]
+	'BE47_292'    CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGGCATCATGCAGTGCCAAACGGAACTCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTCGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAATTGTTACCCTTATGATGTGCCAGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGAATGGGGACAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACGAATACAAATATC [...]
+	'SP118_293'   CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGGCATCATGCAGTGCCAAACGGAACTCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTCCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATGGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAACAAAGCTTACAGCAATTGTTACCCTTATGATGTGCCAGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTTGCTCAGAATGGGGACAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACGAATACAAATATC [...]
+	'WE66_692'    CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGGCATCATGCAGTGCCAAACGGAACTCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTCCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTCGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAATTGTTACCCTTATGATGTGCCAGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCCCTCAGAATGGGGACAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACGAATACAAATATC [...]
+	'DJ3946_129'  CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGGCATCATGCAGTGCCAAACGGAACTCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTCGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGACTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAATTGTTACCCTTATGATGTGCCAGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGAGTGGGGACAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACGAATACAAATATC [...]
+	'SN8_492'     CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGGCATCATGCAGTGCCAAACGGAACTCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAAAATATGCGACAGTCCTCACCGAATCCTCGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGACTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAATTGTTACCCTTATGATGTGCCAGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGAGTGGGGACAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'RU3193'      CAAAACTTCCCGGAAATGACAACAGCACCGCAACGCTGTGCCTGGGGCATCATGCAGTGCCAAACGGAACTCTAGTAAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTCGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGACTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAATTGTTACCCTTATGATGTGCCAGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTACCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGAGTGGGGACAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACGAATACAAATATC [...]
+	'UMEA1_1192'  CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGGCATCATGCAGTGCCAAACGGAACTCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAAAATATGCGACAGTCCTCACCGAATCCTCGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGACTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAATTGTTACCCTTATGATGTGCCAGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGAGTGGGGACAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACGAATACAAATATC [...]
+	'UMEA2_1192'  CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGGCATCATGCAGTGCCAAACGGAACTCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAAAATATGCGACAGTCCTCACCGAATCCTCGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGACTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAATTGTTACCCTTATGATGTGCCAGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGAGTGGGGACAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACGAATACAAATATC [...]
+	'II236_1193'  CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACATCATGCAGTGCCAAACGGAACTCTAGTGAAGACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCAGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGGCTGGAGTCGCTCAGAGTGGGGACAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'II237_1193'  CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACATCATGCAGTGCCAAACGGAACTCTAGTGAAGACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCAGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGAGTGGGGACAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'KA149_1092'  CAAAACTTCCCGGAAATGACAACAGCACAGCAACGTTGTGCCTGGGGCATCATGCAGTGCCAAACGGAACTCTAGTGAAGACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCAGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGAGTGGGGACAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACGAATACAAATATC [...]
+	'PS8091'      CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGTCATCATGCAGTGCCAAACGGAACTCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGATCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGAGTGGGGACAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACGAATACAAATATC [...]
+	'TW114391_1'  CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGGCATCATGCAGTGCCAAACGGAACTCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTCGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGACTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCAGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGAGTGGGGACAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACGAATACAAATATC [...]
+	'EN26191'     CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGGCATCATGCAGTGCCAAACGGAACTCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCAGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGAGTGGGGAAAGCTATACTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACGAATACAAATATC [...]
+	'IN3_991'     CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGGCATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGAGTGGGGAAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACGAATACAAATATC [...]
+	'SHIGA291'    CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGGCATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCTTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGAGTGGGGAAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACGAATACAAATATC [...]
+	'HW1_291'     CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGGCATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCTTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGAGTGGGGAAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'SH6_490'     CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGAGTGGGGAAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'BZ91'        CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTCATCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGAGTGGGGAAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'PR1_1090'    CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCCCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGAGTGGGGAAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACGAATACAAATATC [...]
+	'MX3255_194'  CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGTGACAGTCCTCACCGAATCCTTGATGGAAAAAATTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGATCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGAGTGGGGAAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACGAATACAAATATC [...]
+	'SD1_491'     CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGTGACAGTCCTCACCGAATCCTTGATGGAAAAAATTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGAGTGGGGAAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACGAATACAAATATC [...]
+	'SOFIA15593'  CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAATTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGAGTGGGGAAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACGAATACAAATATC [...]
+	'WA1591'      CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGTGACAGTCCTCACCGAATCCTTGATGGAAAAAATTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGAGTGGGGAAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACGAATACAAATATC [...]
+	'SEOUL45_11'  CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGTGACAGTCCTCACCGAATCCTTGATGGAAAAAATTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGATTTCAATTGGACTGGAGTCGCTCAGAGTGGGGAAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACGAATACAAATATC [...]
+	'PA09_1191'   CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCACAACAGGTAGAATATGTGACAGTCCTCACCGAATCCTTGATGGAAAAAATTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTACCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGAGTGGGGAAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCATGAATACAAATATC [...]
+	'SAS36_592'   CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGTGACAGTCCTCACCGAATCCTTGATGGAAAAAATTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTACCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGAGTGGGGAAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACGAATACAAATACC [...]
+	'BE353_1289'  CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGAGTGGGGAAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACGAATACAAATATC [...]
+	'SHA1_289'    CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGAGTGGGGGAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACGAATACAAATATC [...]
+	'SHA16_989'   CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGAGTGGGGGAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTCAGTAGATTGAATTGGTTGCACGAACACAAATATC [...]
+	'GUA39_689'   CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGAGTGGGGGAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGCTTCTTTAGTAGATTGAATTGGTTGCACGAACACAAATATC [...]
+	'GUA_389'     CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGAGTGGGGGAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGCTTCTTTAGTAGATTGAATTGGTTGCACGAACACAAATATC [...]
+	'BE57_189'    CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTCGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGAGTGGGGGAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTCAGTAGATTGAATTGGTTGCACGAATACAAATATC [...]
+	'SIC89'       CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTGAGAGTTCCTCAACAGGTCGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGAGTGGGGGAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTCAGTAGATTGAATTGGTTGCACGAATACAAATATC [...]
+	'ENG64889'    CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTAGGACATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTCGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCCCTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGAGTGGGGGAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTCAGTAGATTGAATTGGTTGCACGAATACAAATATC [...]
+	'GZ54_489'    CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCATAGTTCCTCAACAGGTCGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGAGTGGGGGAAGCTATGCTTGCAAAAGGGGATCTATTAACAGTTTCTTCAGTAGATTGAATTGGTTGCACGAACACAAATATC [...]
+	'VIC589'      CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGAGTGGGGAAAGCTGTGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACGAATACAAATATC [...]
+	'BE4_189'     CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGAGTGGGGGAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'ENG88'       CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCTCGGGACATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGAGTGGGGGAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTCAGTAGATTGAATTGGTTGCACGAATACAAATATC [...]
+	'DL19_389'    CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGTTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGAGTGGGGGAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTCAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'KB_288'      CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAGATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGGGACCCTCATTGTGATGGCTTCCAAAATAAGAAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCACTCAGAGTGGGGGAAGCTATACTTGCAAAAGGGGATCTGTTAACAGTTTCTTCAGTAGATTGAATTGGTTGCACGAATACAAATATC [...]
+	'TX_39989_2'  CAAAACTTCCCGGAGATGACAACAGCACAGCAACGCTGTGCCTGGGACATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAGATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATGAGAAATGGGACCTTTTTGTCGAACGCAGCAAGGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCACTCAGAGTGGGGGAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTCAGTAGATTGAATTGGTTGCACGAATACAAATATC [...]
+	'TY5_1287'    CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAGATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTATAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATGAGAAATGGGACCTTTTTGTTGAACGCAGCAAGGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCACTCAGAGTGGGGGAAGCTATACTTGCAAAAGGGGATCTGTTAACAGTTTCTTCAGTAGATTGAATTGGTTGCACGAATACAAATATC [...]
+	'TY6_1287'    CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAGATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTATAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATGAGAAATGGGACCTTTTTGTTGAACGCAGCAAGGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCACTCAGAGTGGGGGAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTCAGTAGATTGAATTGGTTGCACGAATACAAATATC [...]
+	'SYD_1287'    CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAGATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATGAGAAATGGGACCTTTTTGTTGAACGCAGCAAGGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCACTCAGAGTGGGGGAAGCTATTCTTGCAAAAGGGGATCTGTTAACAGTTTCTTCAGTAGATTGAATTGGTTGCACGAATACAAATATC [...]
+	'CB_188'      CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAGATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGGGACCCTCATTGTGATGGCTTCCAAAATGAGAAATGGGACCTTTTTGTTGAACGCAGCAAGGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCACTCAGAGTGGGGGAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTCAGTAGATTGAATTGGTTGCACGAATACAAATATC [...]
+	'GC_987'      CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAGATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATGAGAAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCACTCAGAGTGGGGGAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTCAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'SIC_487'     CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAGATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATGAGAAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCACTCAGAGTGGGGGAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTCAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'GZ187'       CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAGATTGAAGTGACTAATGCTACTGAGCTGGTCCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATGAGAAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCACTCAGGGTGGGGGAAGCTATTCTTGCAAAAGGGGATCTGTTAACAGTTTCTTCAGTAGATTGAATTGGTTGCACGAATGCAAATATC [...]
+	'QL_987'      CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAGATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATGAGAAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCACTCAGAGTGGGGGAAGCTATTCTTGCAAAAGGGGATCTGTTAACAGTTTCTTCAGTAGATTGAATTGGTTGCACGAATACAAATATC [...]
+	'LA_1287'     CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAGATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATGAGAAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCACTCAGAGTGGGGGAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTCAGTAGATTGAATTGGTTGCACGAATACAAATATC [...]
+	'SHA_887'     CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAGATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATGAGAAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCACTCAGAGTGGGGGAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTCAGTAGATTGAATTGGTTGCACGAATACAAATATC [...]
+	'CO_1187'     CAAAACTTCCTGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAGATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACTCTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATGAGAAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCACTCAGAGTGGGGGAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTCAGTAGATTGAATTGGTTGCACGTATACAAATATC [...]
+	'VIC87'       CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAGATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATGAGAAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCACTCAGAGTGGGGGAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTCAGTAGATTGAATTGGTTGCACGAATACAAATATC [...]
+	'FO_1185'     CAAAACTTCCCGGAAATGACAACAGCAAAGCAACGCTGTGCCTGGGACATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAGATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATGAGAAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTTCAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTAGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCACTCAGAGTGGGGGAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTCAGTAGATTGAATTGGTTGCACGAATACAAATATC [...]
+	'YN_1185'     CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAGATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATGAGAAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTTCAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCACTCAGAGTGGGGGAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTCAGTAGATTGAATTGGTTGCACAAATACAAATATC [...]
+	'CC185'       CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAGATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAATTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATGAGAAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTTCAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGGCTTCAATTGGACTGGAGTCACTCAGAGTGGGGGAAGCTATGCTTGTAAAAGGGGATCTGTTAACAGTTTCTTCAGTAGATTGAATTGGTTGTACGGAAGCAAATATC [...]
+	'CC485'       CAAAACTGCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAGATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAATTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATGAGAAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTTCAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGGCTTCAATTGGACTGGAGTCACTCAGAGTGGGGGAAGCTATGCTTGTAAAAGGGGATCTGTTAACAGTTTCTTCAGTAGATTGAATTGGTTGTACGGATACAAATATC [...]
+	'UY3_688'     CAGAAATGCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACAGAACGCTAGTGAAAACAATCACGAATGATCAGATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATGAGAAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTTCAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCACTCAGAGTGGGGGAAGCTGTGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTCAGTAGATTGAATTGGTTGTACGAATACAAATATC [...]
+	'CC_688'      CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAGATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATGAGAAATGGGACCTTTTTATTGAACGCAGCAAAGCTTTCAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGGCTTCAATTGGACTGGAGTCACTCAGAATGGGGGAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTCAGTAGATTGAATTGGTTGTACGAATACAAATATC [...]
+	'YG_585'      CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAGATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATGAGAAATGGGACCTTTTTATTGAACGCAGCAAAGCTTTCAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGGCTTCAATTGGACTGGAGTCACTCAGAATGGGGGAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTCAGTAGATTGAATTGGTTGTACGAATACAAATATC [...]
+	'CZ86'        CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAGATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATGAGAAATGGGACCTTTTTATTGAACGCAGCAAAGCTTTCAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGGCTTCAATTGGACTGGAGTCACTCAGAGTGGGGGAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTCAGTAGATTGAATTGGTTGTACGAATACAAATATC [...]
+	'ST_185'      CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAGATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATGAGAAATGGGACCTTTTTATTGAACGCAGCAAAGCTTTCAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGGCTTCAATTGGACTGGAGTCACTCAGAGTGGGGGAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTCAGTAGATTGAATTGGTTGTACGAATACAAATATC [...]
+	'GM_1185'     CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAGATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATGAGAAATGGGACCTTTTTATTGAACGCAGCAAAGCTTTCAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGGCTTCAATTGGACTGGAGTCACTCAGAGTGGGGGAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTCAGTAGATTGAATTGGTTGTACAAATACAAATATC [...]
+	'LN_286'      CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAGATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATGAGAAATGGGACCTTTTTATTGAACGCAGCAAAGCTTTCAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGGCTTCAATTGGACTGGAGTCACTCAGAGTGGGGGAAGCTATACTTGTAAAAGGGGATCTGTTAACAGTTTCTTCAGTAGATTGAATTGGTTGTACGAATACAAATATC [...]
+	'BK_785'      CAAAACTTCCCGGAAATGACAACAGCACAGCAACTCTGTGCCTGGGACATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAGATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATGAGAAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTTCAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGGCTTCAATTGGACTGGAGTCACTCAGAGTGGGGGAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTCAGTAGATTGAATTGGTTGTACAAATACAAATATC [...]
+	'BK25_785'    CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAGATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATGAGAAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTTCAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGGCTTCAATTGGACTGGAGTCACTCAGAGTGGGGGAAGCTATTCTTGCAAAAGGGGATCTGTTAACAGTTTCTTCAGTAGATTGAATTGGTTGTACGAATACAAATATC [...]
+	'YH_1085'     CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAGATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATGAGAAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTTCAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGGCTTCAATTGGACTGGAGTCACTCAGAGTGGGGGAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTCAGTAGATTGAATTGGTTGTACGGATATAAATATC [...]
+	'TG_885'      CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAGATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAATAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATGAGAAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTTCAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGGCTTCAATTGGACTGGAGTCACTCAGAGTGGGGGAAGCTCTGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTCAGTAGATTGAATTGGTTGTACAAATACAAATATC [...]
+	'TX_12764_4'  CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAGATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATGAGAAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTTCAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGGCTTCAATTGGACTGGAGTCACTCAGAGTGGGGGAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTCAGTAGATTGAATTGGTTGTACGAAAGCAAATATC [...]
+	'TX_25784_3'  CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAATGGAACGCTAGTGAAAACAATCACGAATGATCAGATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGGAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATGAGAAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTTCAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGGCTTCAATTGGACTGGAGTCACTCAGAGTGGGGGAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTCAGTAGATTGAATTGGTTGTACGAAAGCAAATATC [...]
+	'MS85'        CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAGATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGGAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATGAGAAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTTCAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGGCTTCAATTGGACTGGAGTCACTCAGAGTGGGGGAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTCAGTAGATTGAATTGGTTGTACAAAAGCAAATATC [...]
+	'TX_24753_1'  CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAGATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGGAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATGAGAAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTTCAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGGCTTCAATTGGACTGGAGTCACTCAGAGTGGGGGAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTCAGTAGATTGAATTGGTTGTACGAAAGCAATTATC [...]
+	'TX_25887_2'  CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAGATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATGAGAAATGGGATCTTTTTGTTGAACGCAGCAAAGCTTTCAGCAACTGCTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGGCTTCAATTGGACTGGAGTCACTCAGAGTGGGGGAAGCTATTCTTGCAAAAGGGGATCTGTTAACAGTTTCTTCAGTAGATTGAATTGGTTGTATGAGAGCAAATATC [...]
+	'SH_185'      CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACATCATGCAGTACCAAACGGAACGCTAGTGAAAACAATCACGAATGAACAGATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATGAGAAATGGGATCTTTTTGTTGAACGCGGCAAAGCTTTCAGCAACTGCTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCGTCAGGCACCCTGGAGTTTATCAATGAAGGCTTCAATTGGACTGGAGTCACTCAGAGTGGGGGAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTCAGTAGATTGAATTGGTTGTATAAGAGCAAATATC [...]
+	'US85'        CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACATCATGCAGTACCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAGATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATGAGAAATGGGACCTTTTTGTTGAACGCGGCAAAGCTTTCAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCGTCAGGCACCCTGGAGTTTATCAATGAAGGCTTCAATTGGACTGGAGTCACTCAGAGTGGGGGAAGCTATGCTTGCAGAAGGGGATCTGTTAACAGTTTCTTCAGTAGATTGAATTGGTTGTACGAGAGCAAATATC [...]
+	'AK_1284'     CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACATCATGCAGTACCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAGATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATGAGAAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTTCAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGGCTTCAATTGGACTGGAGTCACTCAGAGTGGGGGAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTCAGTAGATTGAATTGGTTGTACGAGAGCAAATATC [...]
+	'TX_12835_5'  CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAGATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGGAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTTCAAAATGAGAAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTTCAGCAACTGTTACCCTTATGATGTGCCAGATTATGTCTCCCTTAGGTCACTAGTTGCCTCGTCAGGCACCCTGGAGTTTATCAATGAAGGCTTCAATTGGACTGGGGTCACTCAGAGTGGGGGAAGCTATGCTTGCAAAAGGGGATCTGATAACAGTTTCTTCAGTAGACTGAATTGGTTGTACGAAAGCAAATATC [...]
+	'GZ3_187'     CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAGATTGAAGTGACTAATGCTACTGAGCTGGTCCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGGAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTTCAAAATGAGAAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTTCAGCAACTGTTACCCTTATGATGTGCCAGATTATGCCTCCCTTAGGTCACTAGTTGCCTCGTCAGGCACCCTGGAGTTTATCAATGAAGGCTTCAATTGGACTGGGGTCACTCAGAGTGGGGGAAGCTATGCTTGCAAAAGGGGATCTGATAAAAGTTTCTTCAGTAGACTGAACTGGTTGTACGAAAGCAAATATC [...]
+	'CM_885'      CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAGATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGGATATGCGACAGTCCTCACCGAATCCTTGATGGGAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATGAGAAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTTCAGCAACTGTTACCCTTATGATGTGCCAGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGGCTTCAATTGGACTGGAGTCACTCAGAGTGGGGGAAGCTCTACTTGCAAAAGGGGATCTAATAACAGTTTCTTCAGTAGACTGAACTGGTTGTACGAAAGCAAATATC [...]
+	'TX_17988_1'  CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAGATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGCTCTTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGGAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATGAGAAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTTCAGCAACTGTTACCCTTATGATGTGCCGGATTATGTCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAATTTACCAATGAAGGCTTCAATTGGACTGGAGTCACTCAGAGTGGGGGAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTCAGTAGATTGAATTGGTTGTACGAAAGCAAATATC [...]
+	'TX_18088_1'  CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAGATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGCTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGGAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATGAGAAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTTCAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAATTTACCAATGAAGGCTTCAATTGGACTGGAGTCACTCAGAGTGGGGGAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTCAGTAGATTGAATTGGTTGTACGAAAGCAAATATC [...]
+	'TX_18733_1'  CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAGATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGCTCCTCAACAGGTAGAATATGCGACAGTCTTCACCGAATCCTTGATGGGAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATGAGAAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTTCAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAATTTACCAATGAAGGCTTCAATTGGACTGGAGTCACTCAGAGTGGGGGAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTCAGTAGATTGAATTGGTTGTACGAAAGCAAATATC [...]
+	'TX_24752_1'  CAAAACTTCCCGGAAATGACGACAGCACAGCAACGCTGTGCTTGGGACATCATGCAGTGCCAAACGGAACACTAGTGAAAACAATCACGAATGATCAGATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGGAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATGAGAAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTTCAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGGCTTCAATTGGACTGGAGTCACTCAGAGTGGGGGAAGCTATGCTTGCAAAAGAGGATCTGTTAACAGTTTCTTCAGTAGATTGAATTGGTTGTACGAAAGCAAATATC [...]
+	'NJ_185'      CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCTTGGGACATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAGATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGGAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATGAGAAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTTCAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCTTGGAGTTTATCAATGAAGGCTTCAATTGGACTGGAGTCACTCAGAGTGGGGGAAGCTATGCTTGCAAAAGAGGATCTGTTAACAGTTTCTTCAGTAGATTGAATTGGTTGTACGAAAGCAAATATC [...]
+	'MI_185'      CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCTTGGGACATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAGATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGGAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATGAGAAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTTCAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGGCTTCAATTGGACTGGAGTCACTCAGAGTGGGGGAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTCAGTAGATTGAATTGGTTGTACGAAAGCAAATATC [...]
+	'CT_385'      CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAGATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGGAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATGAGAAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTTCAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCTTGGAGTTTATCAATGAAGGCTTCAATTGGACTGGAGTCACTCAGAATGGGGGAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTCAGTAAATTGAATTGGTTGTACGAATACAAATATC [...]
+	'CAEN184'     CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAGATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGGAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATGAGAAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAACGAAGGCTTCAATTGGACTGGAGTCACTCAGAGTGGGGGAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTCAGTAGATTGAATTGGTTGTACAAAAGCAAATATC [...]
+	'OITA83'      CAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAGATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGGAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATGAGAAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTTCAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGGCTTCAATTGGACTGGAGTCACTCAGAGTGGGGGAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTCAGTAGATTGAATTGGTTGTACAAAAGCAAATATC [...]
+END;
+
+BEGIN TREES;
+	TREE tree = (((((((((((((((((((((((((((((((((((((((((((((((((((CI2115_696:0.000000,NY55_1296:0.003047):0.001014,TIANJING55:0.001015):0.000000,(GZH11_496:0.001015,HK357_696:0.002031):0.000000):0.000000,GZH8_496:0.000000):0.000000,SP214_197:0.004068):0.000000,(((CORD3278_7:0.003054,(GNX189_796:0.001016,TD4796:0.003068):0.001013):0.001012,(AG601_796:0.004085,AG207_796:0.002038):0.003058):0.002038,AG39_796:0.002030):0.000000):0.000000,((((((((WE397:0.002030,((CN10679_99:0.001015,(SYD697:0.0 [...]
+END;
\ No newline at end of file
diff --git a/tests/hbltests/data/fluHA_codon.nex b/tests/hbltests/data/fluHA_codon.nex
new file mode 100644
index 0000000..515b481
--- /dev/null
+++ b/tests/hbltests/data/fluHA_codon.nex
@@ -0,0 +1,372 @@
+#NEXUS
+
+BEGIN TAXA;
+	DIMENSIONS NTAX = 349;
+	TAXLABELS
+		'AG207_796' 'IN1_1196' 'PARIS8395' 'TIANJIN3392' 'AG601_796' 'LA5_1195' 'SH19_896' 'VAL_491' 'NCH813_895' 'TD4796' 'DE3_1195' 'NY43_1196' 'TD5096' 'FL4_1195' 'PARIS36395' 'TD5196' 'HK434_1096' 'YOKOHAMA7392' 'HEBEI1293' 'AG39_796' 'FUJIAN133_596' 'NY37_1096' 'AUC10896_97' 'GD1_396' 'NY50_1196' 'AUC5_697' 'NY55_1296' 'PA2_297' 'BE17_197' 'GNX189_796' 'PR1_797' 'BE24496_197' 'GQ1014_1096' 'RI7_397' 'BE62_297' 'GZH66_497' 'SAITAMA8096_97' 'BK197' 'HAR3_1296' 'SANTAFE208_896' 'BR184_696' ' [...]
+END;
+
+BEGIN CHARACTERS;
+	DIMENSIONS NCHAR = 987;
+	FORMAT
+		DATATYPE = DNA
+		GAP=-
+		MISSING=?
+	;
+
+MATRIX
+	'AG207_796'        CAAAAACTTCCCGGAAATGACAACAGCACGGCAACACTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCCGGCACCCTGGAGTTTAACAATGAAAGCTTCAATTGGACTGGAGTCGCTCAGAATGGAACAAGCTATGCTTGCAAAAGGGGATCTATTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'IN1_1196'         CAAAAACTTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATACAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACGGTCCTCACCAAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCTTCCGGCACCCTGGAGTTTACCAATGAAAGCTTCAATTGGACTGGAGTCGCTCAGAATGGAACAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'PARIS8395'        CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCCCAACAGGTAGAATATGCGACAGTCCTCACCGGATCCTTGATGGAAAGAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCGAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAACGAAAACTTCAATTGGACTGGAGTCGCTCAGGATGGGAAAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'TIANJIN3392'      CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGGATGGGGGAAGCTATGCTTGCAAAAGGGGATCAGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATCAG [...]
+	'AG601_796'        CAGAAACTTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACGCCATGCAGTGCGAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCCGGCACCCTGGAGTTTAACAATGAAAGCTTCAATTGGACTGGAGTCGCTCAGAATGGAACAAGCTATGCTTGCAAAAGGGGATCTATTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'LA5_1195'         CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACAAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCTCTAGTTGCCTCATCAGGCACCCTGGAGTTTACCAATGAAGGCTTCAATTGGACTGGAGTCGCTCAGGATGGGAAAAGCTATTCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'SH19_896'         CAAAAACTTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCCGGCACCCTGGAGTTTAACAATGAAAGCTTCAATTGGACTGGAGTCGCTCAGAATGGAACAAGCTATGCTTGCAAAAGGAGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'VAL_491'          CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCTTGGGACATCATGCAGTACCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAGATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATGAGAAATGGGATCTTTTTGTTGAACGCGGCAAAGCTTTCAGCAACTGCTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCGTCAGGCACCCTGGAGTTTATCAATGAAGGCTTCAATTGGACTGGAGTCACTCAGAGTGGGGGAAGCGCTGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTCAGTAGATTGAATTGGTTGTATGAGTCAG [...]
+	'NCH813_895'       CAAAAACTTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAGATTGGAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCTTCCCTTAGGTCACTAGTTGCCTCATCCGGCACCCTGGAGTTTATCAATGAAGGCTTCAATTGGACTGGAGTCGCTCAGGATGGAACAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'TD4796'           CAAAAACTTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCTCTAGTTGCCTCATCCGGCACCCTGGAGTTTAACAATGAAAGCTTCAATTGGACTGGAGTCGCTCAGAATGGAACAAGCTATGCTTGCAAAAGGAGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'DE3_1195'         CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTACCAATGAAGGCTTCAATTGGACTGGAGTCGCTCAGGATGGGAAAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'NY43_1196'        CAAAAACTTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCAAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCACAGCCTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCCGGCACCCTGGAATTTACCAAAGAAGGCTTCAATTGGACTGGAGTCGCTCAGGATGGAACAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'TD5096'           CAAAAACTTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAGAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCCGGCACCCTGGAGTTTAACAATGAAAGCTTCAATTGGACTGGAGTCGCCCAGAATGGAACAAGCTATGCTTGCAAAAGGAGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'FL4_1195'         CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTACCAATGAAGGCTTCAATTGGACTGGAGTCGCTCAGGATGGGAAAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'PARIS36395'       CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCCCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAGAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCAAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAACGAAAACTTCAATTGGACTGGAGTTGCTCAGGATGGGAAAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'TD5196'           CAAAGACTTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCCGGCACCCTGGAGTTTAACAATGAAAGCTTCAATTGGACTGGAGTCGCCCAGAATGGAACAAGCTATGCTTGCAAAAGGAGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'HK434_1096'       CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCCCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAGAACTGCACACTGATAGATGCTCTTTTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAACGAAAACTTCAATTGGACTGGAGTCGCTCAGGATGGGAAAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'YOKOHAMA7392'     CAAAAACTTCCCGGAAATGGCAACAGCACAGCAACGCTGTGCCTGGGACATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGTTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGGATGGGGGAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'HEBEI1293'        CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGGATGGGGGAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'AG39_796'         CAAAAACTTCCCGGAAATGACAACAGCACGGCAACACTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCCGGCACCCTGGAGTTTAACAATGAAAGCTTCAATTGGACTGGAGTCGCTCAGAATGGAACAAGCTATGCTTGCAAAAGGAGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'FUJIAN133_596'    CAAAAACTTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCCGGCACCCTGGAGTTTAACAATGAAAGCTTCAATTGGACTGGAGTCGCTCAGAATGGAACAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'NY37_1096'        CAAAAACTTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCCGGAACCCTGGAGTTTACCAATGAAGGCTTCAATTGGACTGGAGTCGCTCAGGATGGAACAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'AUC10896_97'      CAAAAACTTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCGACTGTTACCCTTATGATGTGCCGGATTATGCTTCCCTTAGGTCACTAGTTGCCTCATCCGGCACCCTGGAGTTTACCAATGAAGGCTTCAATTGGACTGGAGTCGCTCAGGATGGAACAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAA---- [...]
+	'GD1_396'          CAAAAACTTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACGGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCTTTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCCGGCACCCTGGAGTTTACCAATGAAAGCTTCAATTGGACTGGAGTCGCTCAGAATGGAACAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCATAAATTAG [...]
+	'NY50_1196'        CAAAAACTTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCAAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCACAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCCGGCACCCTGGAGTTTACCAAAGAAGGCTTCAATTGGACTGGAGTCGCTCAGGATGGAACAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'AUC5_697'         CAAAAAATTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAGAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCCTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCCGGCACCCTGGAGTTTAACAATGAAAGCTTCAATTGGACTGGAGTCGCTCAGAATGGAACAAGCTATGCTTGCAAAAGGAGATCTATTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACCAATTAA [...]
+	'NY55_1296'        CAAAAACTTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAATTCCTCAACAGGTAGGATATGTGACAGTCCTCACCGAATCCTTGATGGGAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCCGGCACCCTGGAGTTTAACAATGAAAGCTTCAATTGGACTGGAGTCGCTCAGAATGGAACAAGCTATGCTTGCAAAAGGAGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'PA2_297'          CAAAAACTTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCAAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCACAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCCGGCACCCTGGAGTTTACCAATGAAGGCTTCAATTGGACTGGAGTCGCTCAGGATGGAACAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'BE17_197'         CAAAAACTTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTATAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAATTGCCTCATCCGGCACCCTGGAGTTTAACAATGAAAGCTTCAATTGGACTGGAGTCGCTCAGAATGGAACAAGCTATGCTTGCAAAAGGAGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'GNX189_796'       CAAAAACTTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCCGGCACCCTGGAGTTTAACAATGAAAGCTTCAATTGGACTGGAGTCGCTCAGAATGGAACAAGCTATGCTTGCAAAAGGAGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'PR1_797'          CAAAAACTTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAGAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCCTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCCGGCACCCTGGAGTTTAACAATGAAAGCTTCAATTGGACTGGAGTCGCTCAGAATGGAACAAGCTATGCTTGCAAAAGGAGATCTATTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACCAATTAA [...]
+	'BE24496_197'      CAAAAACTTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAGTGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTCAGGTCACTAGTTGCCTCATCCGGCACCCTGGAGTTTAACAATGAAAGCTTCAATTGGACTGGAGTCTCTCAGAATGGAACAAGCTATGCTTGCAAAAGGAGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'GQ1014_1096'      CAAAAACTTCCCGGTAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAACTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCACAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCCGGCACCCTGGAGTTTACCAATGAAGGCTTCAATTGGACTGGAGTCGCTCAGAATGGAACAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'RI7_397'          CAAAAACTTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAAGAATGGGACCTTTTTGTTGAACGCAACAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCCGGCACCCTGGAGTTTACCAATGAAGGCTTCAATTGGACTGGAGTCGCCCAGAATGGAACAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'BE62_297'         CAAAAACTTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTATAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACATTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCCGGCACCCTGGAGTTTAACAATGAAAGCTTCAATTGGACTGGAGTCGCTCAGAATGGAACAAGCTATGCTTGCAAAAGGAGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'GZH66_497'        CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCGACTGTTACCCTTATGATGTGCCGGATTATGCTTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTACCAATGAAGGCTTCAATTGGACTGGAGTCGCTCAGGATGGGACAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'SAITAMA8096_97'   CAAAAACTTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCCGGCACCCTGGAGTTTAACAATGAAAGCTTCAATTGGACTGGAGTCGCTCAGAATGGAACAAGCTATGCTTGCAAAAGGAGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'BK197'            CAAAAACTTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAAAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAATTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCGACTGTTACCCTTATGATGTGCCGGATTATGCTTCCCTTAGGTCACTAGTTGCCTCATCTGGCACCCTGGAGTTTACCAAAGAAGGCTTCAATTGGCCTGGAGTCGCTCAGGATGGAACAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'HAR3_1296'        CAAAAACTTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGCTACCCTTATGATGTGCCGGATTATGCCTCCCTCAGGTCACTAGTTGCCTCATCCGGCACCCTGGAGTTTAACAATGAAAGCTTCAATTGGACTGGAGTCTCTCAGAATGGAACAAGCTATGCTTGCAAAAGGAGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'SANTAFE208_896'   CAAAAACTTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCATCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCCGGCACCCTGGAGTTTAACAATGAAAGCTTCAATTGGACTGGAGTCGCTCAGAATGGAACAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'BR184_696'        CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGAACAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGACTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCTTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTACCAAGGAAGGCTTCAATTGGACTGGAGTCGCTCAGGATGGGAAAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'SAUS54_797'       CAAAAACTTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAGAAAACTGCACACTGATAGATGCTCTATTGGGAGACCTTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCCTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCCGGCACCCTGGAGTTTAACAATGAAAGCTTCAATTGGACTGGAGTCGCTCAGAATGGAACAAGCTATGCTTGCAAAAGGAGGTCTATTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACCAATTAA [...]
+	'BR309_796'        CAAAAACTTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAGTGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCCGGCACCCTGGAGTTTACCAATGAAGGCTTCAATTGGACTGGAGTCGCTCAGGATGGAACAAGCTATGCTTGCAAAAGGGGATCTGTTAAAGGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'HI1_997'          CAAAAAATTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTTCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAGAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCCTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCCGGCACCCTGGAGTTTAACAATGAAAGCTTCAATTGGACTGGAGTCGCTCAGAATGGAACAAGCTATGCTTGCAAAAGGAGATCTATTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACCAATTAA [...]
+	'BR3_496'          CAAAAAATTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGACTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTACCAAGGAAGGCTTCAATTGGACTGGAGTCGCTCAGGATGGGAAAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'HK358_796'        CAAAAACTTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAAAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCCGGCACCCTGGAGTTTAACAATGAAAGCTTCAATTGGACTGGAGTCGCTCAGAATGGAACAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'SHZH157_796'      CAAAAACTTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCCGGCACCCTGGAGTTTAACAATGAAAGCTTCAATTGGATTGGAGTCGCTCAGAATGGAACAAGCTCTGCTTGCAAAAGGAGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'BR43_697'         CAAAAACTTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAGTGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCCGGCACCCTGGAATTTACCAATGAAGGCTTCAATTGGACTGGAGTTGCTCAGAATGGAACAAGCTATGCTTGCAAAAGGGGATCTGTTAAAGGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'HK387_797'        CAAAAACTTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAGAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCCTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCCGGCACCCTGGAGTTTAACAATGAAAGCTTCAATTGGACTGGAGTCGCTCAGAATGGAACAAGCTATGCTTGCAAAAGGAGATCTATTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACCAATTAA [...]
+	'SP214_197'        CAAAAATTTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGACTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCCGGCACCCTGGAGTTTAACAATGAAAGCTTCAATTGGACTGGAGTCGCTCAGAATGGAACAAGCTATGCTTGCAAAAGGAGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'BR45_696'         CAAAAAATTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGATAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGACTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTACCAAGGAAGGCTTCAATTGGACTGGAGTCGCTCAGGATGGGAAAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'HK391_797'        CAAAAACTTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAGAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCCTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCCGGCACCCTGGAGTTTAACAATGAAAGCTTCAATTGGACTGGAGTCGCTCAGAATGGAACAAGCTATGCTTGCAAAAGGAGATCTATTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACCAATTAA [...]
+	'SYD497'           CAAAAACTTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAGAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCCTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCCGGCACCCTGGAGTTTAACAATGAAAGCTTCAATTGGACTGGAGTCGCTCAGAATGGAACAAGCTATGCTTGCAAAAGGAGATCTATTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACCAATTAA [...]
+	'BR51_897'         CAAAAACTTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAGTGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCCGGCACCCTGGAGTTTACCAATGAAGGCTTCAATTGGACTGGAGTTGCTCAGAATGGAACAAGCTATGCTTGCAAAAGGGGATCTGTTAAAGGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'SYD597'           CAAAAAATTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAGAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCCTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCCGGCACCCTGGAGTTTAACAATGAAAGCTTCAATTGGACTGGAGTCGCTCAGAATGGAACAAGCTATGCTTGCAAAAGGAGTTCTATTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACCAATTAA [...]
+	'BR597_796'        CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGACTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTACCAAGGAAGGCTTCAATTGGACTGGAGTCGCTCAGGATGGGAAAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'JA416_297'        CGAAAACTTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGGCACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAGTGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCCGGCACCCTGGAGTTTAACAATGAAAGCTTCAATTGGACTGGAGTTGCTCAGAATGGGACAAGCTATGCTTGCAAAAGGAGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACCAATTAA [...]
+	'SYD697'           CAAAAAATTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAGAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCCTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCCGGCACCCTGGAGTTTAACAATGAAAGCTTCAATTGGACTGGAGTCGCTCAGAATGGAACAAGCTATGCTTGCAAAAGGAGATCTATTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACCAATTAA [...]
+	'BR87_596'         CAAAAAATTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGACTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTACCAAGGAAGGCTTCAATTGGACTGGAGTCGCTCAGGATGGGAAAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'JOH10_697'        CAAAAACTTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCAAATCCTTGATGGGAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCAAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCACAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCGGGCACCCTGGAGTTTACCAATGAAGGCTTCAATTGGGCTGGAGTCGCTCAGGATGGAACAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'TAS1_797'         CAAAAACTTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCACAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCCGGCACCCTGGAGTTTACCAATGAAGGCTTCAATTGGACTGGAGTCGCTCAGGATGGAACAAGCTATGCTTGCAAAAGGAGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAACCAG [...]
+	'CA10_797'         CAAAAACTTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTTGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCAAATCCTTGATGGAAAAAACTGCACATTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCACAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCCGGCACCCTGGAGTTTACCAAAGAAGGCTTCAATTGGACTGGAGTCGCTCAGGATGGAACAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'JOH3_397'         CAAAAACTTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCCGGCACCCTGGAGTTTAACAATGAAAGCTTCAATTGGACTGGAGTCGCTCAGAATGGAACAAGCTACGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'CA13_1296'        CAAAAACTTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCAAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCACAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCCGGCACCCTGGAGTTTACCAAAGAAGGCTTCAATTGGACTGGAGTCGCTCAGGATGGAACAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'JOH5396_97'       CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAGATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAAAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTACCGATGAAGGCTTCAATTGGACTGGAGTCGCTCAGGATGGGAAAAGCTCTGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAACCAG [...]
+	'TH78_397'         CAAAAACTTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTGGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCGACTGTTACCCTTATGATGTGCCGGATTATGCTTCCCTTAGGTCACTAGTTGCCTCATCCGGCACCCTGGAGTTTACCAATGAAGGCTTCAATTGGACTGGAGTCGCTCAGGATGGAACAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'CANBERRA5_897'    CAAAAACTTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAGAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCCTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCCGGCACCCTGGAGTTTAACAATGAAAGCTTCAATTGGACTGGAGTCGCTCAGAATGGAACAAGCTATGCTTGCAAAAGGAGATCTATTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACCAATTAA [...]
+	'JOH9_597'         CAAAAACTTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCAAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCACAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCCGGCACCCTGGAGTTTACCAAAGAAGGCTTCAATTGGACTGGAGTCGCTCAGGATGGAACAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'TH79_397'         CAAAAACTTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTGGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCGACTGTTACCCTTATGATGTGCCGGATTATGCTTCCCTTAGGTCACTAGTTGCCTCATCCGGCACCCTGGAGTTTACCAATGAAGGCTTCAATTGGACTGGAGTCGCTCAGGATGGAACAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'KO572_297'        CAAAAACTTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCCGGCACCCTGGAGTTTAACAATGAAAGCTTCAATTGGACTGGAGTTGCTCAGAATGGGACAAGCTATGCTTGCAAAAGGAGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACCAATTAA [...]
+	'TH9496_97'        CAAAAACTTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCCGGCACCCTGGAGTTTACCAATGAAGGCTTCAATTGGACTGGAGTCGCTCAGGATGGAACAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'CAR42297'         CAAAAACTTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCGACTGTTACCCTTATGATGTGCCGGATTATGCTTCCCTTAGGTCACTAGTTGCCTCATCCGGCACCCTGGAGTTTACCAATGAAGGCTTCAATTGGACTGGAGTCGCTCAGGATGGAACAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'KO671_297'        CAAAAACTTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCCGGCACCCTGGAGTTTAACAATGAAAGCTTCAATTGGACTGGAGTTGCTCAGAATGGGACAAGCTATGCTTGCAAAAGGAGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACCAATTAA [...]
+	'TIANJING51_297'   CAAAAACTTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCCGGCACCCTGGAGTTTAACAATGAAAGCTTCAATTGGACTGGAGTCGCTCAGAATGGAACAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'CAR465_896'       CAAAAACTTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCCTACAGCGACTGTTACCCTTATGATGTGCCGGATTATGCTTCCCTTAGGTCACTAGTTGCCTCATCCGGCACCCTGGAGTTTACCAATGAAGGCTTCAATTGGACTGGAGTCGCTCAGGATGGAACAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'TIANJING55_896'   CAAAAACTTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGACGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCCGGCACCCTGGAGTTTAACAATGAAAGCTTCAATTGGACTGGAGTCGCTCAGAATGGAACAAGCTATGCTTGCAAAAGGAGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'CL170_1096'       CAAAAACTTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAATTGCCTCATCCGGCACCCTGGAGTTTAACAATGAAAGCTTCAATTGGACTGGAGTCGCTCAGAATGGAACAAGCTATGCTTGCAAAAGGAGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAA [...]
+	'KY2_297'          CAAAAACTTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACGGTCCTCACCGAATCCTTGATGGGAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCCTCCGGCACCCTGGAGTTTACCAATGAAAGCTTCAATTGGCCTGGAGTCGCTCAGAATGGAACAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'TX1196_97'        CAAAAACTTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGGGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTAACAATGAAAGCTTCAATTGGACTGGAGTCGCCCAGAATGGAACAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'CN101_197'        CAAAAACTTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCAAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCACAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCCGGCACCCTGGAGTTTACCAATGAAGGCTTCAATTGGACTGGAGTCGCTCAGGATGGAACAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAACCAG [...]
+	'MN1_1196'         CAAAAACTTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCGACTGTTACCCTTATGATGTGCCGGATTATGCTTCCCTTAGGTCACTAGTTGCCTCATCCGGCACCCTGGAGTTTACCAATGAAGGCTTCAATTGGACTGGAGTCGCTCAGGATGGAACAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'CN10679_997'      CAAAAAATTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAATTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAGAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCCTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCCGGCACCCTGGAGTTTAACAATGAAAGCTTCAATTGGACTGGAGTCGCTCAGAATGGAACAAGCTATGCTTGCAAAAGGAGATCTATTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACCAATTAA [...]
+	'MN1_497'          CAAAAACTTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCAAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCAAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCACAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCCGGCACCCTGGAGTTTACCAAAGAAGGCTTCAATTGGACTGGAGTCGCTCAGGATGGAACAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'UR41_197'         CAAAAACTTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGACTTCCAAAATGAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCCTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCCGGCACCCTGGAGTTTAACAATGAAAGCTTCAATTGGATTGGAGTCGCTCAGAATGGAACAAGCTATGCTTGCAAAAGGAGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'MO10_1196'        CAAAAACTTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCAAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCACAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCCGGCACCCTGGAGTTTACCAAAGAAGGCTTCAATTGGACTGGAGTCGCTCAGGATGGAACAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'VIC3097'          CAAAAACTTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGCTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCACAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCCGGCACCCTGGAGTTTACCAATGAAGGCTTCAATTGGACTGGAGTCGCTCAGGATGGAACAAGCTATGCTTGCAAAAGGAGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'CO11_1196'        CAAAAACTTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACGGTCCTCACCAAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCTTCCGGCACCCTGGAGTTTACCAATGAAAGCTTCAATTGGACTGGAGTCGCTCAGAATGGAACAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'MO11_1196'        CAAAAACTTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGGAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCAAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCACAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCCGGCACCCTGGAGTTTACCAATGAAGGCTTCAATTGGACTGGAGTCGCTCAGGATGGAACAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'VIC4797'          CAAAAACTTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCACAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCCGGCACCCTGGAGTTTACCAATGAAGGCTTCAATTGGACTGGAGTCGCTCAGGATGGAACAAGCTATGCTTGCAAAAGGAGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'CORD3278_796'     CAAAAAATTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCATCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCCGGCACCCTGGAGTTTAACAATGAAAGCTTCAATTGGACTGGAGTCGCTCAGAATGGAACAAGCTATGCTTGCAAAAGGAGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'MON318_696'       CAAAAACTTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGGAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCGACTGTTACCCTTATGATGTGCCGGATTATGCTTCCCTTAGGTCACTAGTTGCCTCATCCGGCACCCTGGAGTTTACCAATGAAGGCTTCAATTGGACTGGAGTCGCTCAGGATGGAACAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'WE397'            CAAAAAATTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAGAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCCTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCCGGCACCCTGGAGTTTAACAATGAAAGCTTCAATTGGACTGGAGTCGCTCAGAATGGAACAAGCTATGCTTGCAAAAGAGGATCTATTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACCAATTAA [...]
+	'DE4_397'          CAAAAACTTCCCGGAAATGACAACAGCACGGCAACTCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCGACTGTTACCCTTATGATGTGCCGGATTATACTTCCCTTAGGTCACTAGTTGCCTCATCCGGCACCCTGGAATTTACCAATGAAGGCTTCAATTGGACTGGAGTCGCTCAGGATGGAACAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'MOS2_197'         CAAAAACTTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCAAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCTCAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCCGGCACCCTGGAGTTTACCAATGAAGGCTTCAATTGGACTGGAGTCGCTCAGGATGGAACAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'YOKOHAMA6896_97'  CAAAAACTTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCGACTGTTACCCTTATGATGTGCCGGATTATGCTTCCCTTAGGTCACTAGTTGCCTCATCCGGCACCCTGGAGTTTACCAATGAAGGCTTCAATTGGACTGGAGTCGCTCAGGATGGAACAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'FG39_1096'        CAAAAACTTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAATTGCCTCATCCGGCACCCTGGAGTTTACCAATGAAGGCTTCAATTGGACTGGGGTCGCTCAGGATGGAACAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'FR7597'           CAAAAACTTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTAGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACAGAATCCTTGATGGAAAAAACTGCACACTGATAGACGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCCGGCACCCTGGAGTTTACCAATGAAGGCTTCAATTGGATTGGAGTCGCTCAGGATGGAACAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'NJ8_1296'         CAAAAACTTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATGTGCGACGGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCCGGCACCCTGGAGTTTACCAATGAAAGCTTCAATTGGACTGGAGTCGCTCAGAATGGAACAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'NY9_196'          CAAAAACTTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCCGGCAACCTGGAGTTTACCAATGAAGGCTTCAATTGGACTGGAGTCGCTCAGGATGGAACAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'SHA9_995'         CAAAAACTTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTCGGTCACTAGTTGCCTCATCCGGCACCCTGGAGTTTACCAATGAAGGCTTCAATTGGACTGGAGTCGCTCAGGATGGAACAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'HK357_696'        CAAAAACTTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGTCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCCGGTACCCTGGAGTTTAACAATGAAAGCTTCAATTGGACTGGAGTCGCTCAGAATGGAACAAGCTATGCTTGCAAAAGGAGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'CI2115_696'       CAAAAACTTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGGAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCCGGCACCCTGGAGTTTAACAATGAAAGCTTCAATTGGACTGGAGTCGCTCAGAATGGAACAAGCTATGCTTGCAAAAGGAGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'GZH8_496'         CAAAAACTTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCCGGCACCCTGGAGTTTAACAATGAAAGCTTCAATTGGACTGGAGTCGCTCAGAATGGAACAAGCTATGCTTGCAAAAGGAGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'GZH11_496'        CAAAAACTTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAAAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCCGGCACCCTGGAGTTTAACAATGAAAGCTTCAATTGGACTGGAGTCGCTCAGAATGGAACAAGCTATGCTTGCAAAAGGAGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'SHZH43_396'       CAAAAACTTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACGGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCCGGCACCCTGGAGTTTACCAATGAAAGCTTCAATTGGACTGGAGTCGCTCAGAATGGAACAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCATAAATTAG [...]
+	'WZH1_596'         CAAAAACTTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACGGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCCGGCACCCTGGAGTTTACCAATGAAAGCTTCAATTGGACTGGAGTCGCTCAGAATGGAACAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'FUK11496E'        CAAAAACTTCCCAGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAGTTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCCGGCACCCTGGAGTTTACCAATGAAGGCTTCAATTGGACTGGAGTCGCTCAGGATGGAACAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTTTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'FUK11496C'        CAAAAACTTCCCAGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAGTTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCCGGCACCCTGGAGTTTACCAATGAAGGCTTCAATTGGACTGGAGTCGCTCAGGATGGAACAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTTTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'AUC596'           CAAAAACTTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCGACTGTTACCCTTATGATGTGCCGGATTATGCTTCCCTTAGGTCACTAGTTGCCTCATCCGGCACCCTGGAGTTTACCAATGAAGGCTTCAATTGGACTGGAGTCGCTCAGGATGGAACAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'BRI2296'          CAAAAACTTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCGACTGTTACCCTTATGATGTGCCGGATTATGCTTCCCTTAGGTCACTAGTTGCCTCATCCGGCACCCTGGAGTTTACCAATGAAGGCTTCAATTGGACTGGAGTCGCTCAGGATGGAACAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'BRIS3596'         CAAAAACTTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCGACTGTTACCCTTATGATGTGCCGGATTATGCTTCCCTTAGGTCACTAGTTGCCTCATCCGGCACCCTGGAGTTTACCAATGAAGGCTTCAATTGGACTGGAGTCGCTCAGGATGGAACAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'CHR196'           CAAAAACTTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCGACTGTTACCCTTATGATGTGCCGGATTATGCTTCCCTTAGGTCACTAGTTGCCTCATCCGGCACCCTGGAGTTTACCAATGAAGGCTTCAATTGGACTGGAGTCGCTCAGGATGGAACAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'HI2_796'          CAAAAACTTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCGACTGTTACCCTTATGATGTGCCGGATTATGCTTCCCTTAGGTCACTAGTTGCCTCATCCGGCACCCTGGAGTTTACCAATGAAGGCTTCAATTGGACTGGAGTCGCTCAGGATGGAACAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'WE4896'           CAAAAACTTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCGACTGTTACCCTTATGATGTGCCGGATTATGCTTCCCTTAGGTCACTAGTTGCCTCATCCGGCACCCTGGAGTTTACCAATGAAGGCTTCAATTGGACTGGAGTCGCTCAGGATGGAACAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'CNIC35_196'       CAAAAACTTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCTTCCCTTAGGTCACTAGTTGCCTCATCCGGCACCCTGGAGTTTACCAATGAAGGCTTCAATTGGACTGGAGTCGCTCAGGATGGAACAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'WUH359_995'       CAAAAACTTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCTTCCCTTAGGTCACTAGTTGCCTCATCCGGCACCCTGGAGTTTACCAATGAAGGCTTCAATTGGACTGGAGTCGCTCAGGATGGAACAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'NCH933_995'       CAAAAACTTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAGTGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCTTCCCTTAGGTCACTAGTTGCCTCATCCGGCACCCTGGAGTTTACCAATGAAGGCTTCAATTGGACTGGAGTCGCTCAGGATGGAACAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'WA596'            CAAAAACTTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCTGGCACCCTGGAGTTTACCAATGAAGGCTTCAATTGGGCTGGAGTCGCTCAGGATGGAACAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'FUJIAN47_396'     CAAAAACTTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCTTCCCTTAGGTCACTAGTTGCCTCATCCGGCACCCTGGAGTTTACCAATGAAGGCTTCAATTGGACTGGAGTCGCTCAGGATGGAACAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'JA99_196'         CAAAAACTTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCTTCCCTTAGGTCACTAGTTGCCTCATCCGGCACCCTGGAGTTTACCAATGAAGGCTTCAATTGGACTGGAGTCGCTCAGAATGGAACAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'WI3_896'          CAAAAACTTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAGTGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCTCCCCTTAGGTCACTAGTTGCCTCATCCGGAACCCTGGAGTTTACCAATGAAGGCTTCAATTGGACTGGAGTCGCTCAGGATGGAACAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'AK2_796'          CAAAAACTTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCCGGAACCCTGGAGTTTACCAATGAAGGCTTCAATTGGACTGGAGTCGCTCAGGATGGAACAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'TW523_596'        CAAAAACTTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATATGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCCGGCACCCTGGAGTTTACCAATGAAGGCTTCAATTGGACTGGAGTCGCTCAGGATGGAACAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'CNIC22_195'       CAAAAACTTCCCGGAAATGACAACAGCACGGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGTTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCCGGCACCCTGGAGTTTACCAATGAAGGCTTCAATTGGACTGGAGTCGCTCAGGATGGAAAAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'GNX42_495'        CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACTGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCCGGCACCCTGGAGTTTACCAATGAAGGCTTCAATTGGACTGGAGTCGCTCAGGATGGAAAAAGCTCTGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'MO6_396'          CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGGATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTACCAATGAAGGCTTCAATTGGACTGGAGTCGCTCAGGATGGGAAAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGTACAAATTAG [...]
+	'CN2796_1295'      CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAATAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGATCACTAGTTGCCTCATCAGGCACCCTGGAGTTTACCAATGAAGGCTTCAATTGGACTGGAGTCGCTCAGGATGGGAAAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'ID3_1195'         CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTACCAATGAAGGCTTCAATTGGACTGGAGTCGCTCAGGATGGGAAAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'AK16_995'         CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAGATGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTACCAATGAAGGCTTCAATTGGACTGGAGTCGCTCAGGATGGGAAAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'JOH1795'          CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAGATGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTACCAATGAAGGCTTCAATTGGACTGGAGTCGCTCAGGATGGGAAAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'ID4_1195'         CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTACCAATGAAGGCTTCAATTGGACTGGAGTCGCTCAGGATGGGAAAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'NV1_1195'         CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAGCGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGATTCAGAGTTCCCCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTACCAATGAAGGCTTCAATTGGACTGGAGTCGCTCAGGATGGGAAAAGCTATTCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'KO45_296'         CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGCTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTACCAATGAAGGCTTCAATTGGACTGGAGTCGCTCAGGATGGGAAAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'CN61_296'         CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTACCAATGAAGGCTTCAATTGGACTGGAGTCGCTCAGGATGGGAAAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'BZ2_395'          CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTAGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTACCAATGAAGGCTTCAATTGGACTGGAGTCGCTCAGGATGGGAAAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'GE491_396'        CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTACCAATGAAGGCTTCAATTGGACTGGAGTCGCTCAGGATGGGAAAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'UK897_696'        CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACAAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTACCAATGAAGGCTTCAATTGGACTGGAGTCGCTCAGGATGGGAAAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'MN6_1195'         CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCCCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTACCAATGAAGGTTTCAATTGGACTGGAGTCGCTCAGGATGGGAAAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'CN17_196'         CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACAAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTACCAATGAAGGCTTCAATTGGACTGGAGTCGCTCAGGATGGGAAAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'BE281_1294'       CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTACCAATGAAGGCTTCAATTGGACTGGAGTCGCTCAGGATGGGAAAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'SHD5_894'         CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTACCAATGAAGGCTTCAATTGGACTGGAGTCGCTCAGGATGGGAAAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'AG4057_795'       CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCATTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTACCAATGAAGGCTTCAATTGGACTGGAGTCGCTCAGGATGGGAAAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'BZ18_496'         CAAAAAATTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGACTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTACCAAGGAAAGCTTCAATTGGACTGGAGTCGCTCAGGATGGGAAAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'BZ8_496'          CAAAAAATTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGACTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTACCAAGGAAGGCTTCAATTGGACTGGAGTCGCTCAGGATGGGAAAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'GE578652_295'     CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTACCAAGGAAGGCTTCAATTGGACTGGAGTCGCTCAGGATGGGAAAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'WV1_395'          CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTAAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTACCAAGGAAGGCTTCAATTGGACTGGAGTCGCTCAGGATGGGAAAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'SN27_595'         CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAGGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTACCAAGGAAGGCTTCAATTGGACTGGAGTCGCTCAGGATGGGAAAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'WA186_1294'       CAAAAACTTCCCGGAAATGACAACAGCACAACAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTACCAAGGAAGGCTTCAATTGGACTGGAGTCGCTCAGGATGGGAAAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'GE767_495'        CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAAAAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTACCAAGGAAGGCTTCAATTGGACTGGAGTCGCTCAGGATGGGAAAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'HK3_195'          CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTACCAAGGAAGGCTTCAATTGGACTGGAGTCGCTCAGAATGGGAAAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'SN28_595'         CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGGAAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTACCAAGGAAGGCTTCAATTGGACTGGAGTCGCTCAGGATGGGAAAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'NJ11_1294'        CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTAGAGTTTACCAAGGAAGGCTTCAATTGGACTGGAGTCGCTCAGGATGGGAAAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'HK38_895'         CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAGGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAGCGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGATCACTAGTTGCCTCATCAGGCACCCTGGAGTTTACCAAGGAAGGCTTCAATTGGACTGGAGTCGCTCAGGATGGGAAAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'CN147_495'        CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAATGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAGCAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTACCAAGGAAGGCTTCAATTGGACTGGAGTCGCTCAGGATGGGAAAAGCTATTCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'VA25_1294'        CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTACCAAGGAAGGCTTCAATTGGACTGGAGTCGCTCAGGATGGGAAAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'JOH295'           CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTACCAAGGAAGGCTTCAGTTGGACTGGAGTCGCTCAGGATGGGGGGAGCTGTGCTTGCAAAAGGGGATCTGCCAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'AK10_295'         CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTACCAATGAAGGCTTCAATTGGACTGGAGTCGCTCAGGATGGGAAAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'NE11_395'         CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTTCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTACCAATGAAGGCTTCAATTGGACTGGAGTCGCTCAGGATGGGAAAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'KWJ195_1194'      CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTACCAATGAAGGCTTCAATTGGACTGGAGTCGCTCAGGATGGGAAAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'CHW995_1294'      CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCAACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTACCAATGAAGGCTTCAATTGGACTGGAGTCGCTCAGGATGGGAAAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'HAR3_194'         CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGGATGGGACAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'HK42_396'         CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCCCAACAGGTAGAATATGCGACAGTCCTCACCGGATCCTTGATGGAAGAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAACGAAAACTTCAATTGGACTGGAGTCGCTCAGGATGGGAAAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'MEM196_1195'      CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCCCAACAGGTAGAATATGCGACAGTCCTCACCGGATCCTTGATGGAAAGAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCAAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAACGAAAACTTCAATTGGACTGGAGTCGCTCAGGATGGGAAAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'NY17_1294'        CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCCCAACAGGTAGAATATGCAACAGTCCTCACCGGATCCTTGATGGAAAGAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACACTGGAGTTTATCAACGAAAACTTCAATTGGACTGGAGTCGCTCAGGATGGGAAAAGCTATACTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'CA5_395'          CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTCCAGAGTTCCCCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAGAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCTGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTACCAACGAAAACTTCAATTGGACTGGAGTCGCTCAGAATGGGAAAAGCTATACTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'JA8695_1294'      CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCCCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAGAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTACCAACGAAAACTTCAATTGGACTGGAGTCGCTCAGAATGGGAAAAGCTATTCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'SP378_195'        CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCCCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAGAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTACCAACGAAAACTTCAATTGGACTGGAGTCGCTCAGGATGGGAAAAGCTATTCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'PA7_1294'         CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCCCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAGAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTACCAACGAAAACTTCAATTGGACTGGAGTCGCTCAGGATGGGAAAAGCTATTCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'LA1_195'          CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAATTCCCCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAGAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTACCAACGAAAACTTCAATTGGACTGGAGTCGCTCAGGATGGGAAAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'NJ8_1194'         CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAATTCCCCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAGAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTACCAACGAAAACTTCAATTGGACTGGAGTCGCTCAGGATGGGAAAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'CN124_295'        CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCCCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAGAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTACCAACGAAAACTTCAATTGGACTGGAGTCGCTCAGGATGGGAAAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'MA1_195'          CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCCCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAGAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTACCAACGAAAACTTCAATTGGACTGGAGTCGCTCAGGATGGGAAAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'OH3_195'          CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCCCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAGAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTACCAACGAAAACTTCAATTGGACTGGAGTCGCTCAGGATGGGAAAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'NJ10_195'         CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCCCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAGAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAATTTACCAACGAAAACTTCAATTGGACTGGAGTCGCTCAGGATGGGAAAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'IL5_195'          CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCCCAACAGGTAGAATATGCAACAGTCCTCACCGAATCCTTGATGGAAAGAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTACCAACGAAAACTTCAATTGGACTGGAGTCGCTCAGGATGGGAAAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'TX5_1294'         CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTTCCCAACAGGTAGAATATGTGACAGTCCTCACCGAATCCTTGATGGAAAGAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTACCAACGAAAACTTCAATTGGACTGGAGTCGCTCAGGATGGGAAAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'SP351_195'        CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCCCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAGAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTACCAACGAAAACTTCAATTGGACTGGAGTCGCTCAGGATGGGAAAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'PA15_295'         CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCCCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAGAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGATCACTAGTTGCCTCATCAGGCACCCTGGAGTTTACCAACGAAAACTTCAATTGGACTGGAGTCGCTCAGGATGGGAAAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'NY28_1294'        CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAGCGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCCCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAGAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTACCAACGAAAACTTCAATTGGACTGGAGTCGCTCAGGATGGGAAAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'HK1_694'          CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCCCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAGAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAGCTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAACGAAAACTTCAATTGGACTGGAGTCGCTCAGGATGGGAAAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'HK55_794'         CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCCCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAGAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAACGAAAACTTCAATTGGACTGGAGTCGCTCAGGATGGGAAAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'JOH33_794'        CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCCCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAGAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAACGAAAACTTCAATTGGACTGGAGTCGCTCAGGATGGGAAAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'AG3779_1094'      CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCCCAACAGGTAGAATATGCGACAGCCCTCACCGAATCCTTGATGGAAAGAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAACGAAAACTTCAATTGGACTGGAGTCGCTCAGGATGGGAAAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'AKI194'           CAAAAACTTCCCGGAAATGACAACAGCACAGCAACACTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAGAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGGATGGGAAAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGCTGCACAAATTAG [...]
+	'RO182_194'        CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGGATGGGAAAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGCTGCACAAATTAG [...]
+	'VT3_194'          CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGTAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGGATGGGAAAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGCTGCACAAATTAG [...]
+	'RO160_194'        CACAAACTTCCCAGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGGATGGGAAAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGCTGCACAAATTAG [...]
+	'SANT7198_894'     CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGGACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACATTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGCGTCGCTCAGGATGGGAAAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGCTGCACAAATTAG [...]
+	'FR120394'         CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGGATGGGAAAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'NED37293'         CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGGATGGGAAAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'NY16_1194'        CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAATTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGGATGGGAAAAGCTATACTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACCAATCAA [...]
+	'NY4295_1194'      CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAATTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGGATGGGAAAAGCTATACTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACCAATCAA [...]
+	'PA993_1294'       CCAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGAACAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCAACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGGATGGGAAAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'CA5_1193'         CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGGATGGGAAAAGCTATTCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'WA41_1293'        CGAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAGCGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTGTCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGGATGGGAAAAGCTATTCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'CA4_794'          CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAGACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGGATGGGACAAGCTATTCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAA [...]
+	'SP190_393'        CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGGATGGGAAAAGCTATTCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACGAATTAG [...]
+	'ST1_193'          CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGGATGGGAAAAGCTATTCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'SP125_293'        CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGGATGGGAAAAGCTATACTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'WY1_1193'         CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGGAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATCCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGGATGGGAAAAGCTATACTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAGTTAG [...]
+	'TX57_1293'        CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGGTCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTATTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGGATGGGAAAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'LA4_893'          CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTAGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTGGCTCAGGATGGGAAAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'LA6_993'          CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTAGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTGGCTCAGGATGGGAAAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'NY3_293'          CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTAGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTAGCTCAGGATGGGAAAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'NY15_894'         CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGATTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTAATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTAGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTAGCTCAGGATGGGAAAAGCTATGCTTGCAGAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAGTTTAA [...]
+	'AK18_493'         CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGGATGGGAAAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'NY26_293'         CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGGATGGGAAAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'NY38_193'         CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAATCGCTCAGGATGGGAAAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'ENG22093'         CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGGATGGGAAAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'WA2693'           CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCTTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGGATGGGAAAAGCTATGCTTGCAAACGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'GA3_393'          CAAAAACTTCCCGGAAATGACAACAGCACAGCAACACTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGGATGGGAAAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'BK122_694'        CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCTTGGGACACCATGCGGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGACTTGGTTCAGAATTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGGGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGGATGGGAAAAGCTATGCTTGCAAAAGGGGATCTGTTAACGGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'TH7594'           CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCGGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAATTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATTAATGAAGACTTCAATTGGACTGGAGTCGCTCAGGATGGGAAAAGCTATGCTTGCAAAAGGGGATCTGTTAAAGGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'SN7_694'          CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGGCACCATGCGGTGCCAAACGGAACGCTAGTGAAAACAATCGCGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAATTCTTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGGATGGGAAAAGCTATACTTGCAAAAGGGGATCTGTTAACGGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'AG3105_693'       CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAATCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGGATGGGAAAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'GD25_693'         CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCGAAGCTTACAGCAGCTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGGATGGGAAAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'WUZ1_794'         CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAGCTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAATCGCTCAGGATGGGAAAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'UDE44_394'        CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCATCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGGATGGGAAAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'CC893'            CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGGATGGGAAAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'WAIK2093'         CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGCTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGGATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCACCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGGATGGGAAAAGCTCTGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'GD27_594'         CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAAAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGGATGGGAAAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'AA393'            CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGGATGGGAAAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'NO93'             CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAGATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGGATGGGGAAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'NCH3396_593'      CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGGAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCAAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGGATGGGGGAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'NY1393'           CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACATCATGCAGTGCCAAACGGAACGCTGGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGGAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGGATGGGGGAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'NGX10_193'        CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCCTATGATGTGCAGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGGATGGGGGAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'SIC4_593'         CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCCTATGATGTGCAGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGGATGGGGGAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'RU58_393'         CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCCTATGATGTGCAGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCACTCAGGATGGGGGAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'WUZ4_493'         CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCCTATGATGTGCAGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGGATGGGGGAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'GD04_393'         CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGGATGGGGGAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'HAR1592'          CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAGATTGAAGTGACTAATGCTACTGAGCTGGTACAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGGATGGGGGAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'NCH12_1193'       CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGACTATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGGATGGGGGAAGCTATGCTTGCAGAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'NCH3332_493'      CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGACTATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGGATGGGGGAAGCTATGCTTGCAGAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'NCH58_1293'       CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGACTATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAAGTGGACTGGAGTCGCTCAGGATGGGGGAAGCTATGCTTGCAGAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'HK23_792'         CAAAAACTTCCCGGAAATGACAACAGCACAGCAACACTGTGCCTGGGACATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGGATGGGGGAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTAAATTGGTTGTACAAATTAG [...]
+	'SHD9_393'         CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGTTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGGCAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGGATGGGGGAAGCTATGCTTGCAAAAGAGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'PS688_193'        CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAAAGATCAAATTGAAGTGACTAATGCTACTGAGTTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGGATGGGGGAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'SAP_1292'         CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGTTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGGATGGGGGAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'NY64_1293'        CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACAGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTAATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTACCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGGATGGGGGAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'NY63_1293'        CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACAGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTAATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTACCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGGATGGGGGAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'FR110994'         CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACAGAATCCTTGATGGGAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTAATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTACCAATGAGGACTTCAATTGGACTGGAGTCGCTCAGGATGGGGGAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'UR46967_294'      CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCCCTATTGGGAGACCCTAATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTACCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGGATGGGGGAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATTAG [...]
+	'CA271_1192'       CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGGATGGGGGAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTCAGTAGATTGAATTGGTTGCACAAATCAG [...]
+	'KITA93'           CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGGATGGGGGAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATCAG [...]
+	'QD53_392'         CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGAAGTCGCTCAGGATGGGGGAAGCTGTGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATCAG [...]
+	'AK9_1192'         CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCAAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGGATGGGGGAAGCTATTCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATCAG [...]
+	'HI3_1192'         CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCCCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGGATGGGGGAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATCAG [...]
+	'VIC193'           CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCAAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTTGCTCAGGATGGGGGAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATCAG [...]
+	'BE32_192'         CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCTTGGGACATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGGATGGGGGAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATCAG [...]
+	'BE46_292'         CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCTTGGGACATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGGATGGGGGAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATCAG [...]
+	'DJ3109_1291'      CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGGCATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTTGCTCAGGATGGGGGAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATCAG [...]
+	'KA206_1191'       CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGGATGGGGGAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATCAG [...]
+	'PERTH01_492'      CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTATGCCTGGGACATCATGCAGTGCCAAATGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATAGCTTCCAAAACAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGGATGGGGGAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACGAATCAG [...]
+	'PS192SPF'         CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTATGCCTGGGACATCATGCAGTGCCAAATGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCATGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATAGCTTCCAAAACAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGGATGGGGGAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATCAG [...]
+	'HK34_490'         CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTATGCCTGGGACATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAGCGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGGATGGGGGAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACGAATCAA [...]
+	'SH24_890'         CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATTCTTGATGGGGAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGAGTGGGGGAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACGAATCAG [...]
+	'SN91'             CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGAGTGGGGGAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACGAATCAG [...]
+	'VIC29_392'        CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTATGCCTGGGGCATCATGCAGTGCCAAACGGAACTCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTCGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAATTGTTACCCTTATGATGTGCCAGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGAATGGGGGCAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACGAATCAG [...]
+	'VIC68_792'        CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGGCATCATGCAGTGCCAAACGGAACTCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTCGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAATTGTTACCCTTATGATGTGCCAGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGAATGGGGACAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACGAATCAG [...]
+	'SAS68_692'        CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGGCATCATGCAGTGCCAAACGGAACTCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTCGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAATTGTTACCCTTATGATGTGCCAGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGAATGGGGACAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACGAATCAG [...]
+	'BE47_292'         CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGGCATCATGCAGTGCCAAACGGAACTCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTCGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAATTGTTACCCTTATGATGTGCCAGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGAATGGGGACAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACGAATCAG [...]
+	'SP118_293'        CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGGCATCATGCAGTGCCAAACGGAACTCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTCCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATGGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAACAAAGCTTACAGCAATTGTTACCCTTATGATGTGCCAGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTTGCTCAGAATGGGGACAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACGAATCAG [...]
+	'WE66_692'         CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGGCATCATGCAGTGCCAAACGGAACTCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTCCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTCGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAATTGTTACCCTTATGATGTGCCAGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCCCTCAGAATGGGGACAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACGAATCAG [...]
+	'DJ3946_1292'      CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGGCATCATGCAGTGCCAAACGGAACTCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTCGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGACTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAATTGTTACCCTTATGATGTGCCAGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGAGTGGGGACAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACGAATCAG [...]
+	'SN8_492'          CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGGCATCATGCAGTGCCAAACGGAACTCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAAAATATGCGACAGTCCTCACCGAATCCTCGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGACTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAATTGTTACCCTTATGATGTGCCAGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGAGTGGGGACAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAACCAG [...]
+	'RU3193'           CAAAAACTTCCCGGAAATGACAACAGCACCGCAACGCTGTGCCTGGGGCATCATGCAGTGCCAAACGGAACTCTAGTAAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTCGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGACTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAATTGTTACCCTTATGATGTGCCAGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTACCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGAGTGGGGACAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACGAATCAG [...]
+	'UMEA1_1192'       CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGGCATCATGCAGTGCCAAACGGAACTCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAAAATATGCGACAGTCCTCACCGAATCCTCGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGACTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAATTGTTACCCTTATGATGTGCCAGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGAGTGGGGACAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACGAATCAG [...]
+	'UMEA2_1192'       CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGGCATCATGCAGTGCCAAACGGAACTCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAAAATATGCGACAGTCCTCACCGAATCCTCGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGACTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAATTGTTACCCTTATGATGTGCCAGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGAGTGGGGACAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACGAATCAG [...]
+	'II236_1193'       CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACATCATGCAGTGCCAAACGGAACTCTAGTGAAGACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCAGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGGCTGGAGTCGCTCAGAGTGGGGACAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATCAG [...]
+	'II237_1193'       CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACATCATGCAGTGCCAAACGGAACTCTAGTGAAGACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCAGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGAGTGGGGACAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATCAG [...]
+	'KA149_1092'       CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGTTGTGCCTGGGGCATCATGCAGTGCCAAACGGAACTCTAGTGAAGACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCAGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGAGTGGGGACAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACGAATCAG [...]
+	'PS8091'           CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGTCATCATGCAGTGCCAAACGGAACTCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGATCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGAGTGGGGACAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACGAATCAG [...]
+	'TW114391_192'     CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGGCATCATGCAGTGCCAAACGGAACTCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTCGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGACTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCAGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGAGTGGGGACAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACGAATCAG [...]
+	'EN26191'          CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGGCATCATGCAGTGCCAAACGGAACTCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCAGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGAGTGGGGAAAGCTATACTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACGAATCAG [...]
+	'IN3_991'          CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGGCATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGAGTGGGGAAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACGAATCAG [...]
+	'SHIGA291'         CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGGCATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCTTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGAGTGGGGAAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACGAATCAG [...]
+	'HW1_291'          CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGGCATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCTTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGAGTGGGGAAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATCAG [...]
+	'SH6_490'          CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGAGTGGGGAAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATCAG [...]
+	'BZ91'             CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTCATCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGAGTGGGGAAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATCAG [...]
+	'PR1_1090'         CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCCCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGAGTGGGGAAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACGAATCAG [...]
+	'MX3255_194'       CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGTGACAGTCCTCACCGAATCCTTGATGGAAAAAATTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGATCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGAGTGGGGAAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACGAATCAG [...]
+	'SD1_491'          CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGTGACAGTCCTCACCGAATCCTTGATGGAAAAAATTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGAGTGGGGAAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACGAATCAG [...]
+	'SOFIA15593'       CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAATTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGAGTGGGGAAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACGAATCAG [...]
+	'WA1591'           CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGTGACAGTCCTCACCGAATCCTTGATGGAAAAAATTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGAGTGGGGAAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACGAATCAG [...]
+	'SEOUL45_1191'     CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGTGACAGTCCTCACCGAATCCTTGATGGAAAAAATTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGATTTCAATTGGACTGGAGTCGCTCAGAGTGGGGAAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACGAATCAG [...]
+	'PA09_1191'        CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCACAACAGGTAGAATATGTGACAGTCCTCACCGAATCCTTGATGGAAAAAATTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTACCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGAGTGGGGAAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCATGAATCAG [...]
+	'SAS36_592'        CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGTGACAGTCCTCACCGAATCCTTGATGGAAAAAATTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTACCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGAGTGGGGAAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACGAATCAG [...]
+	'BE353_1289'       CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGAGTGGGGAAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTTAGTAGATTGAATTGGTTGCACGAATCAG [...]
+	'SHA1_289'         CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGAGTGGGGGAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACGAATCAG [...]
+	'SHA16_989'        CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGAGTGGGGGAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTCAGTAGATTGAATTGGTTGCACGAATCAG [...]
+	'GUA39_689'        CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGAGTGGGGGAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGCTTCTTTAGTAGATTGAATTGGTTGCACGAATCAG [...]
+	'GUA_389'          CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGAGTGGGGGAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGCTTCTTTAGTAGATTGAATTGGTTGCACGAATCAG [...]
+	'BE57_189'         CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTCGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGAGTGGGGGAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTCAGTAGATTGAATTGGTTGCACGAATCAG [...]
+	'SIC89'            CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTGAGAGTTCCTCAACAGGTCGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGAGTGGGGGAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTCAGTAGATTGAATTGGTTGCACGAATCAG [...]
+	'ENG64889'         CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTAGGACATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGACCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTCGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCCCTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGAGTGGGGGAAGCTATGCTTGCAAAAGGGGATCTGTTAAAAGTTTCTTCAGTAGATTGAATTGGTTGCACGAATCAG [...]
+	'GZ54_489'         CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCATAGTTCCTCAACAGGTCGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGAGTGGGGGAAGCTATGCTTGCAAAAGGGGATCTATTAACAGTTTCTTCAGTAGATTGAATTGGTTGCACGAATCAG [...]
+	'VIC589'           CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGAGTGGGGAAAGCTGTGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACGAATCAG [...]
+	'BE4_189'          CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGAGTGGGGGAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTTAGTAGATTGAATTGGTTGCACAAATCAG [...]
+	'ENG88'            CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCTCGGGACATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGAGTGGGGGAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTCAGTAGATTGAATTGGTTGCACGAATCAG [...]
+	'DL19_389'         CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAAATTGAAGTGACTAATGCTACTGAGTTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATAAGGAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCGCTCAGAGTGGGGGAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTCAGTAGATTGAATTGGTTGCACAAATCAG [...]
+	'KB_288'           CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAGATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGGGACCCTCATTGTGATGGCTTCCAAAATAAGAAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCACTCAGAGTGGGGGAAGCTATACTTGCAAAAGGGGATCTGTTAACAGTTTCTTCAGTAGATTGAATTGGTTGCACGAATCAG [...]
+	'TX_39989_288'     CAAAAACTTCCCGGAGATGACAACAGCACAGCAACGCTGTGCCTGGGACATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAGATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATGAGAAATGGGACCTTTTTGTCGAACGCAGCAAGGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCACTCAGAGTGGGGGAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTCAGTAGATTGAATTGGTTGCACGAATCAG [...]
+	'TY5_1287'         CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAGATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTATAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATGAGAAATGGGACCTTTTTGTTGAACGCAGCAAGGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCACTCAGAGTGGGGGAAGCTATACTTGCAAAAGGGGATCTGTTAACAGTTTCTTCAGTAGATTGAATTGGTTGCACGAATCAG [...]
+	'TY6_1287'         CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAGATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTATAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATGAGAAATGGGACCTTTTTGTTGAACGCAGCAAGGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCACTCAGAGTGGGGGAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTCAGTAGATTGAATTGGTTGCACGAATCAG [...]
+	'SYD_1287'         CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAGATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATGAGAAATGGGACCTTTTTGTTGAACGCAGCAAGGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCACTCAGAGTGGGGGAAGCTATTCTTGCAAAAGGGGATCTGTTAACAGTTTCTTCAGTAGATTGAATTGGTTGCACGAATCAG [...]
+	'CB_188'           CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAGATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGGGACCCTCATTGTGATGGCTTCCAAAATGAGAAATGGGACCTTTTTGTTGAACGCAGCAAGGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCACTCAGAGTGGGGGAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTCAGTAGATTGAATTGGTTGCACGAATCAG [...]
+	'GC_987'           CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAGATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATGAGAAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCACTCAGAGTGGGGGAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTCAGTAGATTGAATTGGTTGCACAAATCAG [...]
+	'SIC_487'          CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAGATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATGAGAAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCACTCAGAGTGGGGGAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTCAGTAGATTGAATTGGTTGCACAAATCAG [...]
+	'GZ187'            CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAGATTGAAGTGACTAATGCTACTGAGCTGGTCCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATGAGAAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCACTCAGGGTGGGGGAAGCTATTCTTGCAAAAGGGGATCTGTTAACAGTTTCTTCAGTAGATTGAATTGGTTGCACGAATCAG [...]
+	'QL_987'           CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAGATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATGAGAAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCACTCAGAGTGGGGGAAGCTATTCTTGCAAAAGGGGATCTGTTAACAGTTTCTTCAGTAGATTGAATTGGTTGCACGAATCAG [...]
+	'LA_1287'          CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAGATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATGAGAAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCACTCAGAGTGGGGGAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTCAGTAGATTGAATTGGTTGCACGAATCAG [...]
+	'SHA_887'          CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAGATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATGAGAAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCACTCAGAGTGGGGGAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTCAGTAGATTGAATTGGTTGCACGAATCAG [...]
+	'CO_1187'          CAAAAACTTCCTGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAGATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACTCTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATGAGAAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCACTCAGAGTGGGGGAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTCAGTAGATTGAATTGGTTGCACGTATCAG [...]
+	'VIC87'            CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAGATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATGAGAAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCACTCAGAGTGGGGGAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTCAGTAGATTGAATTGGTTGCACGAATCAG [...]
+	'FO_1185'          CAAAAACTTCCCGGAAATGACAACAGCAAAGCAACGCTGTGCCTGGGACATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAGATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATGAGAAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTTCAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTAGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCACTCAGAGTGGGGGAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTCAGTAGATTGAATTGGTTGCACGAATCAG [...]
+	'YN_1185'          CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAGATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATGAGAAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTTCAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCACTCAGAGTGGGGGAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTCAGTAGATTGAATTGGTTGCACAAATCAG [...]
+	'CC185'            CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAGATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAATTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATGAGAAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTTCAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGGCTTCAATTGGACTGGAGTCACTCAGAGTGGGGGAAGCTATGCTTGTAAAAGGGGATCTGTTAACAGTTTCTTCAGTAGATTGAATTGGTTGTACGGATCAG [...]
+	'CC485'            CAAAAACTGCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAGATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAATTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATGAGAAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTTCAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGGCTTCAATTGGACTGGAGTCACTCAGAGTGGGGGAAGCTATGCTTGTAAAAGGGGATCTGTTAACAGTTTCTTCAGTAGATTGAATTGGTTGTACGGATCAG [...]
+	'UY3_688'          CAGAAAATGCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACAGAACGCTAGTGAAAACAATCACGAATGATCAGATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATGAGAAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTTCAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGACTTCAATTGGACTGGAGTCACTCAGAGTGGGGGAAGCTGTGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTCAGTAGATTGAATTGGTTGTACGAATCAG [...]
+	'CC_688'           CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAGATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATGAGAAATGGGACCTTTTTATTGAACGCAGCAAAGCTTTCAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGGCTTCAATTGGACTGGAGTCACTCAGAATGGGGGAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTCAGTAGATTGAATTGGTTGTACGAATCAG [...]
+	'YG_585'           CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAGATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATGAGAAATGGGACCTTTTTATTGAACGCAGCAAAGCTTTCAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGGCTTCAATTGGACTGGAGTCACTCAGAATGGGGGAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTCAGTAGATTGAATTGGTTGTACGAATCAG [...]
+	'CZ86'             CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAGATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATGAGAAATGGGACCTTTTTATTGAACGCAGCAAAGCTTTCAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGGCTTCAATTGGACTGGAGTCACTCAGAGTGGGGGAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTCAGTAGATTGAATTGGTTGTACGAATCAG [...]
+	'ST_185'           CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAGATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATGAGAAATGGGACCTTTTTATTGAACGCAGCAAAGCTTTCAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGGCTTCAATTGGACTGGAGTCACTCAGAGTGGGGGAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTCAGTAGATTGAATTGGTTGTACGAATCAG [...]
+	'GM_1185'          CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAGATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATGAGAAATGGGACCTTTTTATTGAACGCAGCAAAGCTTTCAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGGCTTCAATTGGACTGGAGTCACTCAGAGTGGGGGAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTCAGTAGATTGAATTGGTTGTACAAATCAG [...]
+	'LN_286'           CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAGATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATGAGAAATGGGACCTTTTTATTGAACGCAGCAAAGCTTTCAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGGCTTCAATTGGACTGGAGTCACTCAGAGTGGGGGAAGCTATACTTGTAAAAGGGGATCTGTTAACAGTTTCTTCAGTAGATTGAATTGGTTGTACGAATCAG [...]
+	'BK_785'           CAAAAACTTCCCGGAAATGACAACAGCACAGCAACTCTGTGCCTGGGACATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAGATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATGAGAAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTTCAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGGCTTCAATTGGACTGGAGTCACTCAGAGTGGGGGAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTCAGTAGATTGAATTGGTTGTACAAATCAG [...]
+	'BK25_785'         CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAGATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATGAGAAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTTCAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGGCTTCAATTGGACTGGAGTCACTCAGAGTGGGGGAAGCTATTCTTGCAAAAGGGGATCTGTTAACAGTTTCTTCAGTAGATTGAATTGGTTGTACGAATCAG [...]
+	'YH_1085'          CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAGATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATGAGAAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTTCAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGGCTTCAATTGGACTGGAGTCACTCAGAGTGGGGGAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTCAGTAGATTGAATTGGTTGTACGGATCAG [...]
+	'TG_885'           CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAGATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAATAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATGAGAAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTTCAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGGCTTCAATTGGACTGGAGTCACTCAGAGTGGGGGAAGCTCTGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTCAGTAGATTGAATTGGTTGTACAAATCAG [...]
+	'TX_12764_483'     CAAAACCTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAGATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATGAGAAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTTCAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGGCTTCAATTGGACTGGAGTCACTCAGAGTGGGGGAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTCAGTAGATTGAATTGGTTGTACGAATCAG [...]
+	'TX_25784_385'     CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAATGGAACGCTAGTGAAAACAATCACGAATGATCAGATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGGAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATGAGAAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTTCAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGGCTTCAATTGGACTGGAGTCACTCAGAGTGGGGGAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTCAGTAGATTGAATTGGTTGTACGAATCAG [...]
+	'MS85'             CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAGATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGGAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATGAGAAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTTCAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGGCTTCAATTGGACTGGAGTCACTCAGAGTGGGGGAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTCAGTAGATTGAATTGGTTGTACAAATCAG [...]
+	'TX_24753_185'     CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACACCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAGATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGGAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATGAGAAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTTCAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGGCTTCAATTGGACTGGAGTCACTCAGAGTGGGGGAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTCAGTAGATTGAATTGGTTGTACGAATCAG [...]
+	'TX_25887_285'     CAAAACCTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAGATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATGAGAAATGGGATCTTTTTGTTGAACGCAGCAAAGCTTTCAGCAACTGCTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGGCTTCAATTGGACTGGAGTCACTCAGAGTGGGGGAAGCTATTCTTGCAAAAGGGGATCTGTTAACAGTTTCTTCAGTAGATTGAATTGGTTGTATGAGTCAG [...]
+	'SH_185'           CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACATCATGCAGTACCAAACGGAACGCTAGTGAAAACAATCACGAATGAACAGATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATGAGAAATGGGATCTTTTTGTTGAACGCGGCAAAGCTTTCAGCAACTGCTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCGTCAGGCACCCTGGAGTTTATCAATGAAGGCTTCAATTGGACTGGAGTCACTCAGAGTGGGGGAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTCAGTAGATTGAATTGGTTGTATAAGTCAG [...]
+	'US85'             CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACATCATGCAGTACCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAGATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATGAGAAATGGGACCTTTTTGTTGAACGCGGCAAAGCTTTCAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCGTCAGGCACCCTGGAGTTTATCAATGAAGGCTTCAATTGGACTGGAGTCACTCAGAGTGGGGGAAGCTATGCTTGCAGAAGGGGATCTGTTAACAGTTTCTTCAGTAGATTGAATTGGTTGTACGAGTCAG [...]
+	'AK_1284'          CAAAA?CTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACATCATGCAGTACCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAGATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGAAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATGAGAAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTTCAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGGCTTCAATTGGACTGGAGTCACTCAGAGTGGGGGAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTCAGTAGATTGAATTGGTTGTACGAGTCAG [...]
+	'TX_12835_583'     CAAAACCTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAGATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGGAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTTCAAAATGAGAAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTTCAGCAACTGTTACCCTTATGATGTGCCAGATTATGTCTCCCTTAGGTCACTAGTTGCCTCGTCAGGCACCCTGGAGTTTATCAATGAAGGCTTCAATTGGACTGGGGTCACTCAGAGTGGGGGAAGCTATGCTTGCAAAAGGGGATCTGATAACAGTTTCTTCAGTAGACTGAATTGGTTGTACGAATCAG [...]
+	'GZ3_187'          CAAAACCTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAGATTGAAGTGACTAATGCTACTGAGCTGGTCCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGGAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTTCAAAATGAGAAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTTCAGCAACTGTTACCCTTATGATGTGCCAGATTATGCCTCCCTTAGGTCACTAGTTGCCTCGTCAGGCACCCTGGAGTTTATCAATGAAGGCTTCAATTGGACTGGGGTCACTCAGAGTGGGGGAAGCTATGCTTGCAAAAGGGGATCTGATAAAAGTTTCTTCAGTAGACTGAACTGGTTGTACGAATCAG [...]
+	'CM_885'           CAAAACCTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAGATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGGATATGCGACAGTCCTCACCGAATCCTTGATGGGAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATGAGAAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTTCAGCAACTGTTACCCTTATGATGTGCCAGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGGCTTCAATTGGACTGGAGTCACTCAGAGTGGGGGAAGCTCTACTTGCAAAAGGGGATCTAATAACAGTTTCTTCAGTAGACTGAACTGGTTGTACGAATCAG [...]
+	'TX_17988_184'     CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAGATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGCTCTTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGGAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATGAGAAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTTCAGCAACTGTTACCCTTATGATGTGCCGGATTATGTCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAATTTACCAATGAAGGCTTCAATTGGACTGGAGTCACTCAGAGTGGGGGAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTCAGTAGATTGAATTGGTTGTACGAATCAG [...]
+	'TX_18088_184'     CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAGATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGCTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGGAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATGAGAAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTTCAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAATTTACCAATGAAGGCTTCAATTGGACTGGAGTCACTCAGAGTGGGGGAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTCAGTAGATTGAATTGGTTGTACGAATCAG [...]
+	'TX_18733_184'     CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAGATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGCTCCTCAACAGGTAGAATATGCGACAGTCTTCACCGAATCCTTGATGGGAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATGAGAAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTTCAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAATTTACCAATGAAGGCTTCAATTGGACTGGAGTCACTCAGAGTGGGGGAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTCAGTAGATTGAATTGGTTGTACGAATCAG [...]
+	'TX_24752_185'     CAAAAACTTCCCGGAAATGACGACAGCACAGCAACGCTGTGCTTGGGACATCATGCAGTGCCAAACGGAACACTAGTGAAAACAATCACGAATGATCAGATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGGAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATGAGAAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTTCAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGGCTTCAATTGGACTGGAGTCACTCAGAGTGGGGGAAGCTATGCTTGCAAAAGAGGATCTGTTAACAGTTTCTTCAGTAGATTGAATTGGTTGTACGAATCAG [...]
+	'NJ_185'           CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCTTGGGACATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAGATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGGAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATGAGAAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTTCAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCTTGGAGTTTATCAATGAAGGCTTCAATTGGACTGGAGTCACTCAGAGTGGGGGAAGCTATGCTTGCAAAAGAGGATCTGTTAACAGTTTCTTCAGTAGATTGAATTGGTTGTACGAATCAG [...]
+	'MI_185'           CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCTTGGGACATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAGATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGGAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATGAGAAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTTCAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGGCTTCAATTGGACTGGAGTCACTCAGAGTGGGGGAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTCAGTAGATTGAATTGGTTGTACGAATCAG [...]
+	'CT_385'           CAAAA?CTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAGATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGGAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATGAGAAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTTCAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCTTGGAGTTTATCAATGAAGGCTTCAATTGGACTGGAGTCACTCAGAATGGGGGAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTCAGTAAATTGAATTGGTTGTACGAATCAG [...]
+	'CAEN184'          CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAGATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGGAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATGAGAAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTACAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAACGAAGGCTTCAATTGGACTGGAGTCACTCAGAGTGGGGGAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTCAGTAGATTGAATTGGTTGTACAAATCAG [...]
+	'OITA83'           CAAAAACTTCCCGGAAATGACAACAGCACAGCAACGCTGTGCCTGGGACATCATGCAGTGCCAAACGGAACGCTAGTGAAAACAATCACGAATGATCAGATTGAAGTGACTAATGCTACTGAGCTGGTTCAGAGTTCCTCAACAGGTAGAATATGCGACAGTCCTCACCGAATCCTTGATGGGAAAAACTGCACACTGATAGATGCTCTATTGGGAGACCCTCATTGTGATGGCTTCCAAAATGAGAAATGGGACCTTTTTGTTGAACGCAGCAAAGCTTTCAGCAACTGTTACCCTTATGATGTGCCGGATTATGCCTCCCTTAGGTCACTAGTTGCCTCATCAGGCACCCTGGAGTTTATCAATGAAGGCTTCAATTGGACTGGAGTCACTCAGAGTGGGGGAAGCTATGCTTGCAAAAGGGGATCTGTTAACAGTTTCTTCAGTAGATTGAATTGGTTGTACAAATCAG [...]
+END;
+
+BEGIN TREES;
+	TREE tree = ((((((((((((((((((CO_1187,SHA_887)Node17,LA_1287)Node16,(GZ187,QL_987)Node21)Node15,VIC87)Node14,((((((TX_12764_483,((TX_24753_185,TX_25784_385)Node33,MS85)Node32)Node30,((((((TX_18088_184,(TX_18733_184,TX_17988_184)Node44)Node42,(CM_885,(GZ3_187,TX_12835_583)Node49)Node47)Node41,OITA83)Node40,(((MI_185,NJ_185)Node55,TX_24752_185)Node54,CT_385)Node53)Node39,CAEN184)Node38,((((VAL_491,SH_185)Node64,US85)Node63,TX_25887_285)Node62,AK_1284)Node61)Node37)Node29,TG_885)Node28,((C [...]
+END;
+
diff --git a/tests/hbltests/data/mtDNA.fas b/tests/hbltests/data/mtDNA.fas
new file mode 100644
index 0000000..c1915c5
--- /dev/null
+++ b/tests/hbltests/data/mtDNA.fas
@@ -0,0 +1,1429 @@
+>Acinonyx_jubatus
+ATGAACGAAAATCTATTCGCCTCTTTCATTACCCCAACAATAATAGGACTGCCTATTGTTATATTAATCATTATATTCCCAAGTATTCTATTTCCATCGCCCAACCGACTGATTAATAACCGCCTAATCTCACTGCAACAATGACTAGTACAACTAACATCAAAGCAAATATTGGCCATTCATAACTACAAAGGACAGACCTGAGCTCTAATACTGATGTCCCTTATCCTATTTATTGGATCAACAAACCTACTAGGCCTATTACCCCACTCATTTACTCCAACCACCCAATTATCAATAAACCTAGGAATAGCTATCCCACTATGAGCCGGTACTGTAATTACCGGGTTTCGCCATAAAACTAAAGCATCCCTAGCTCACTTCTTACCACAAGGAACACCCATTCCCCTAATTCCTATGCTTGTAGTTATCGAAACTATTAGTCTCTTTATTCAACCTATAGCCTTAGCCGTACGACTTACAGCTAACATT [...]
+TCACTTACTAATACACCTAATTGGAGGGGCCACTCTAGCCTTAACAAACATTACTGTCCCTGCTGCTTTAATTACTTTCATTATTCTTATTCTACTAACAATCCTTGAGTTTGCTGTAGCCCTAATCCAAGCCTATGTCTTCACCCTACTAGTAAGCCTATATTTACATGATAACACCTAAATGCCACAACTAGATACATCAACCTGATTTATTACTATTATATCAATAATTATAACACTATTTATCGTATTCCAACTAAAAATCTCAAAACACCTGTATCCGTCAAATCCAGAACCTAAATCCATAATCACACTAGAACAACCTAATCCCTGAGAAAAAAAATGAACGAAAATCTATTCGCCTCTTTCATTACCCCAACAAATGTTCATAATCCGCTGATTATTTTCAACTAATCATAAAGATATCGGTACTCTTTACCTCCTGTTTGGTGCTTGAGCTGGTATAGTAGGGACTGCTCTTAGTCTTCTAAT [...]
+AACTAGGTCAACCTGGCACACTACTAGGAGATGATCAAATTTACAATGTAATCGTTACAGCCCATGCTTTTGTAATGATTTTCTTCATAGTTATGCCTATTATAATTGGAGGATTCGGTAACTGATTGGTCCCATTAATGATTGGAGCTCCTGACATAGCATTCCCCCGAATGAATAATATAAGCTTCTGGCTCCTTCCTCCCTCTTTCTTACTTCTACTCGCTTCATCTATAGTGGAGGCTGGGGCAGGGACTGGATGAACAGTGTATCCACCCCTAGCTGGCAATCTGGCTCATGCAGGAGCATCCGTAGACCTGACTATCTTCTCACTTCACCTAGCAGGCGTTTCTTCAATTTTAGGTGCTATTAATTTTATTACAACTATCATTAATATAAAACCCCCTGCCATATCTCAATACCAAACACCTTTGTTTGTGTGATCAGTTCTAATCACTGCAGTCCTGTTACTTCTATCACTCCCAGTTTTAGCAG [...]
+ACCATGTTATTAACAGATCGAAATTTAAATACCACATTCTTCGATCCTGCTGGAGGAGGAGATCCTATCTTATACCAACATCTATTCTGATTTTTTGGCCACCCAGAGGTCTACATTTTAATTCTACCCGGTTTTGGAATAATCTCGCACATTGTTACCTATTATTCAGGCAAAAAAGAACCATTTGGTTACATGGGAATAGTTTGAGCCATAATATCAATTGGCTTCCTGGGCTTTATCGTATGAGCCCATCACATGTTTACTGTTGGAATGGACGTAGACACACGAGCATACTTTACATCAGCTACCATAATTATCGCCATCCCTACTGGGGTAAAAGTATTTAGTTGACTAGCCACTCTCCATGGAGGTAATATTAAATGATCTCCCGCCATACTATGGGCTTTAGGTTTTATTTTCCTGTTCACCGTAGGAGGCCTAACAGGAATTGTACTGGCTAACTCTTCACTAGATATTGTTCTCCATGATACA [...]
+AGTAGCCCATTTCCACTATGTCTTATCAATAGGAGCAGTATTCGCTATCATAGGAGGCTTCGTCCATTGATTCCCCTTATTCTCAGGATACACTCTTGATAATACTTGGGCAAAAATTCACTTCACGATTATATTTGTAGGAGTCAACATAACATTCTTCCCTCAACACTTCCTAGGCCTATCTGGAATGCCACGACGTTATTCTGATTACCCAGATGCATATACAACTTGAAACACAATTTCCTCAATAGGCTCTTTCATTTCATTAACAGCAGTCATACTTATAGTTTTCATGGTATGAGAAGCCTTTGCATCCAAGCGAGAAGTGGCCATAGTAGAATTAACCACAACTAATCTTGAGTGATTACATGGATGTCCCCCTCCGTATCACACATTTGAAGAGCCAACTTATGTATTACTAAAAATGGCATACCCTTTCCAGCTAGGCTTTCAAGACGCCACATCCCCTATTATAGAAGAACTTCTACACTT [...]
+ATACATTGATAATTGTATTCCTAATTAGCTCATTAGTCCTTTATATTATTTCATTAATATTAACAACCAAGCTTACGCATACAAGCACAATGGATGCTCAAGAAGTAGAAACCGTCTGAACTATCCTGCCTGCTATCATCCTGATTCTCATCGCCCTGCCCTCCCTACGAATCCTTTATATAATAGACGAAATTAATAACCCCTCCCTCACAGTAAAAACTATAGGGCATCAATGATATTGAAGTTACGAGTATACCGACTATGAAGACTTGAATTTTGACTCTTACATAGTCCCTACCCAAGAACTAAAACCAGGAGAACTGCGGCTACTAGAAGTCGACAACCGAGTAGTTTTACCAATAGAAATAACCATTCGCATACTAATTTCATCAGAAGACGTACTACACTCATGAGCTGTACCATCTCTAGGTCTAAAAACTGACGCTATTCCAGGTCGACTAAACCAAACGACCCTAATGAGTACACGACCTG [...]
+TACGGTCAGTGCTCAGAAATCTGTGGCTCAAACCACAGCTTCATACCCATTGTCCTCGAACTAGTCCCGCTGATATATTTTGAAAAATGATCTGCATCTATACTAATGACCCACCAAACCCATGCATACCACATAGTTAACCCCAGCCCATGACCGCTTACAGGGGCCCTTTCAGCCCTCCTTATAACCTCAGGCCTAGCTATATGATTTCACTATAACTCAACACTACTATTAACCCTTGGAATAACTACTAATCTATTAACAATATATCAATGATGACGAGACATCGTTCGAGAAAGCACATTTCAAGGCCATCATACGCCCATCGTTCAAAAAGGCCTCCGATATGGAATAATCCTCTTTATCGTCTCAGAAGTATTCTTTTTTGCAGGCTTCTTCTGGGCCTTTTACCACTCAAGCCTAGCCCCAACCCCCGAACTAGGAGGATGCTGACCACCAACAGGCATTATTCCCCTAAACCCCTTAGAAGTT [...]
+TAATACTTCAGTTCTTCTAGCCTCTGGAGTATCTATCACCTGAGCTCACCATAGCCTAATAGAAGGAAACCGAAAACACATGCTCCAAGCACTACTCATTACAATCTCCCTAGGAGTCTATTTTACACTCCTCCAAGCCTCCGAATATTACGAAACACCATTTACGATCTCAGATGGGATTTACGGATCCACCTTCTTTATAGCTACAGGATTCCACGGACTACATGTAATTATTGGTTCCACCTTCCTAATTGTATGCTTCTTACGCCAATTAAAATATCACTTTACATCAAATCATCATTTCGGGTTCGAAGCCGCTGCTTGATATTGACATTTCGTAGATGTAGTTTGACTATTCTTATACGTTTCCATTTATTGATGAGGATCTTATATGACCAACATTCGAAAATCACACCCCCTTATCAAAATCGTTAATCACTCATTCATCGATTTACCCACCCCACCTAACATTTCAGCATGATGAAACTTCGG [...]
+TAGGAGTCTGCCTAGTCCTACAGATCCTAACCGGCCTTTTCCTAGCCATACACTACACATCAGACACAATAACCGCCTTTTCATCAGTTACTCACATCTGCCGCGACGTCAACTACGGCTGAATTATTCGATACATGCACGCCAACGGAGCCTCTATATTCTTTATCTGCCTATACATGCATGTAGGACGAGGAATATACTACGGCTCCTACACCTTCTCAGAAACATGAAATATTGGAATCATACTACTACTCACAGTCATAGCCACAGCCTTCATAGGATATGTCTTACCATGAGGTCAAATATCTTTCTGAGGAGCAACTGTAATTACCAACCTCCTATCAGCAATTCCTTACATCGGCACTAATCTAGTAGAGTGAATTTGAGGAGGTTTCTCGGTAGACAAAGCTACCCTGACACGATTCTTTGCCTTCCACTTTATCCTTCCATTCATCATCTCAGCCCTAGCAGCAGTACACCTCTTATTTCTCC [...]
+GGATCCAATAACCCCTCAGGAATCACATCCGACTCAGACAAAATTCCATTCCACCCATACTACATAATCAAGGACATTCTAGGTCTCCTAATACTAATTTTAATACTCACACTACTCGTCCTCTTCTCACCAGACCTGTTAGGAGATCCAGACAACTACATCCCCGCCAACCCCCTAAACACTCCTCCCCATATTAAACCCGAATGATATTTTTTATTCGCATACGCAATCCTCCGATCCATCCCTAACAAATTAGGAGGAGTCCTAGCCCTAATATTCTCCATCCTAATCCTAGCAATCATTCCAATTTTCCACACCTCCAAACAACGAGGAATAATATTTCGACCACTAAGCCAATGCTTATTCTGACTCCTAGTAGCAGACCTCCTCACCCTAACATGAATTGGCGGCCAACCTGTAGAACACCCCTTTATTACCATCGGCCAACTAGCCTCCATTCTATACTTCTCAACCCTCCTAGTTCTAATACCT [...]
+CATCATCGAAAACCGCCTCCTAAAATGAATGTTTATAATTAATATCCTCTCACTAATTATCCCTATTCTCCTCGCCGTGGCTTTCCTAACCCTAGTTGAACGAAAAGTACTAGGCTACATACAACTTCGTAAAGGACCAAATGTCGTAGGACCATATGGCCTACTCCAACCTATTGCAGACGCCGTAAAACTCTTTACCAAAGAACCTCTCCGACCTCTCACATCCTCCATATTCATATTTATTATAGCACCAATTCTAGCCCTCACACTAGCACTAACTATGTGAATCCCACTACCCATGCCATATCCACTCATCAATATGAACCTAGGAGTACTATTCATACTAGCCATATCAAGCCTAGCCGTTTACTCTATCCTATGATCAGGATGGGCTTCAAACTCAAAATATGCTCTAATCGGAGCCTTACGAGCCGTAGCCCAAACAATCTCATATGAAGTCACACTAGCCATCATCCTTTTATCAGTATTACT [...]
+GGTCCTTCACACTAGCCACACTAATTACCACCCAAGAACACACATGGCTAATTATCCCTGCATGACCCCTAGCCATGATATGATTTATCTCAACACTAGCAGAAACTAACCGAGCCCCATTCGACCTAACAGAAGGGGAATCAGAATTAGTCTCCGGATTTAATGTAGAATACGCAGCAGGCCCCTTCGCCCTATTCTTTCTAGCAGAATACGCCAACATCATCATAATAAATATCCTTACAACAATCCTATTTTTCGGAGCATTCCATAATCCTTATATACCAGAACTATATATTGTCAACTTTACAGTAAAAACCCTGTTTTTAACAACCACTTTCCTATGAATCCGAGCATCATATCCACGATTCCGATATGATCAATTAATACACCTTTTATGAAAAAATTTTCTCCCTCTTACCCTAGCTTTATGCATATGACACGTATCAATGCCTATTATCACAGCAAGCATCCCACCTCAAACAATTAAACCCT [...]
+ATTATCATCATAACAACCGTTATTTCAGGAACTATTATCGTAATAACAACCTCCCACTGGCTTATAGTCTGAGTTGGCTTTGAAATAAACCTACTAGCCATCATTCCTATTCTAATAAAAAAATACAACCCACGAGCCATAGAAGCAGCCACAAAATATTTCCTAACACAAGCAACCGCCTCCATAATCCTAATAATAGGAATCATCATTAACCTACTGCACTCAGGACAATGAACCGTATCAAAAGACCTTAACCCCATAGCATCAATTATAATAACAACTGCCCTAGCAATAAAACTAGGACTAGCCCCCTTTCACTTCTGAGTACCTGAAGTCACACAAGGAATTTCCATGTCATCAGGCCTAATCTTATTAACATGACAAAAAATCGCACCCCTATCTATCCTATACCAAATCTCATCCACTATCAACCCTAGCCTACTCCTAACAATATCCATCATATCAGTTATGATTGGAGGCTGAGGAGGCCTC [...]
+ACAACTACGAAAAATCATAGCGTACTCCTCAATCGCCCATATAGGCTGAATAACAGCCATTATAATATATAATCCCACAATAATAATCCTAAACCTAACCATCTACATTATCATAACACTAACCACCTTTATACTATTTATATACAACTCCACCACAACAACACTGTCCCTGTCACAAACATGAAACAAAACTCCCCTAATCACCTCACTCATTTTAGTATTAATAATATCCCTAGGTGGTCTCCCCCCACTTTCTGGCTTCACTCCAAAATGAATAATCATCCAAGAACTAACTAAAAATGAAATAATCATAATACCAACATTACTAGCCATAACAGCACTACTCAACCTATACTTCTACATACGATTAACATATTCCACTGCACTAACCATATTTCCCTCAAACAATAGCATAAAGATAAAATGACGATTCGAATGCACAAAAAAAATAACCTTCTTACCCCCTCTAATTGTAATATCAACTATAATACT [...]
+CACCAATACTATCCATCCTGGATATAAACATTATACTCGCCCTACTCACTAACACGCTCCTATCCACACTACTTGTACTTATCGCATTTTGACTGCCCCAACTGAATATTTACGCAGAAAAAGTAAGCCCCTATGAGTGCGGATTTGACCCTATAGGATCTGCCCGTTTGCCCTTTTCCATGAAATTCTTCCTAGTAGCCATCACATTCCTGCTATTTGACCTAGAAATTGCCCTACTACTCCCCCTTCCCTGAGCCTCACAAACGAATAATCTACCAACTATACTCACCATAGCCCTTATACTGATCTCACTATTAGCTGTAAGCCTAGCCTATGAATGAACCCAAAAAGGATTAGAATGAACTGAAATGTCCATAGTCTACATTAACATCTTCCTAGCTTTCATCATATCACTCATAGGTCTATTAATATATCGATCCCACCTAATGTCTTCTCTCTTATGTTTAGAAGGCATGATATTATCTCTATTCA [...]
+ACGATAGTAGTCCTGAACAATCACTTTACACTAGCTAGTATAACTCCTATTATCTTGCTAGTATTCGCAGCCTGCGAGGCAGCACTAGGCTTATCCCTGCTAGTAATAGTATCAAACACATATGGTACCGACTATGTACAAAACCTAAACCTCCTACAATGCATTATTATCCCTACTGCTATACTTATACCAATAATATGATTATCAAAACCTAATATAATCTGAATTAACTCAACAACCTACAGCCTACTAATCAGTCTTGTTAGTCTGTCCTACCTAAATCAACCAGGTGATAATAGTCTAAACTCTTCATTATTATTTTTCTCAGACTCACTCTCTGCACCCTTATTAGTACTAACAACATGACTTCTACCATTAATACTAATAGCCAGCCAATCACACCTATCAAAAGAGATCTTAGCTCGAAAAAAACTATATATCACAATACTGATCCTCCTACAACTCCTCCTGATCATAACATTTACCGCCACA [...]
+TATATTTTACATCTTATTCGAAGCCACATTAATCCCTACTTTAATCATTATTACCCGATGGGGTAACCAAACAGAACGACTAAACGCTGGCCTGTATTTCCTATTCTACACTCTAGTAGGCTCACTACCCCTTCTAGTTGCACTATTATATATCCAAAATACAATAGGGACCTTAAACTTTTTAATTATCCAGTATTGAGCCAAACCTATCTCAACTACCTGATCCAATATTTTCCTGTGACTAGCATGTATAATAGCATTCATAGTAAAAATACCCCTATACGGACTTCACCTCTGACTACCAAAAGCACACGTTGAAGCCCCTATCGCTGGTTCAATGGTACTTGCTGCTGTGCTATTAAAACTAGGGGGATACGGGATAATACGCATCACAATTCTACTAAACCCCACAACTAGTCAAATAGCGTACCCCTTTATAATATTATCCCTATGAGGAATAATTATAACAAGCTCTATTTGCCTACGTCAAAC [...]
+AATCACTAATCGCATACTCATCTGTAAGCCACATAGCCCTAGTAATTGTAGCAGTACTGATCCAAACACCCTGAAGTTATATAGGAGCCACAGCTCTAATAATCGCTCACGGGCTAACTTCATCTATATTATTCTGCCTCGCAAACTCAAACTATGAACGAGTGCATAGCCGAACCATAATTTTAGCACGAGGCCTACAAACTATTCTTCCCCTAATAGCTGCTTGATGACTACTAGCCAGCCTTGCAAACCTAGCCCTACCACCCACAATTAACCTAGTCGGAGAATTATTTGTAGTAGTGGCCTCCTTCTCATGATCTAATATAACCATTATCCTTATAGGTACAAACATTATTATTACAGCCCTATACTCTCTCTATATACTCATTACAACCCAACGAGGCAAGTATACACATCACATTAAAAATATTAACCCATCATTTACACGAGAAAATACCCTAATAACCCTTCACCTACTCCCCCTTCTTCTCC [...]
+AACCCCAAAATTGTACTAGGACCCATTTACTGTAAAATAAAAGTAATAAACTTATCTACCTCATTTACACTAACTGCAATATTTATCCTACTATTACCCATCATCATATCTAACACCCGATTATATAAAGGCAACTTATACCCCCACTATGTAAAAACCACAATCTCATACGCCTTCACTATCAGCATAATCCCAACCATAATATTTATCTCTTCTGGACAGGAAACAGTCATCTCAAACTGACACTGATTATCAATCCAAACCCTTAATCTATCACTAAGCTTTAAAATAGACTACTTTTCAATCATCTTCACCCCCGTAGCACTATTTGTTACATGATCAATCATAGAATTCTCAATATGATATATACACTCAGATCCATACATTAACCGATTCTTCAAATATCTCCTCATATTTCTAATTACCATAATAATCCTAGTAACCGCCAACAACCTATTCCAACTATTTATTGGCTGAGAAGGAGTAGGCATT [...]
+CTTACTTATTGGGTGATGATATGGCCGAACAGACGCAAATACTGCCGCCCTACAAGCAATCCTCTATAATCGCATTGGAGACGTAGGCTTTATTATAGCTATAGCATGGTTCCTTACCAATTTAAACGCATGAAACCTACAACAAATTTTTATCACCCAACATGACAACCTAAACATTCCCCTACTAGGCCTCCTCCTAGCAGCCACAGGCAAATCTGCCCAATTTGGCCTACATCCATGACTACCATCAGCCATAGAAGGCCCAACCCCCGTCTCCGCCCTACTCCACTCAAGTACAATAGTCGTAGCCGGGGTCTTCCTACTAATTCGCTTCCACCCGCTTATAGAACAAAACAAAACTATACAAACCCTCACCCTATGCCTAGGAGCTATCACAACCCTATTTACAGCTATCTGTGCTCTCACACAAAACGACATTAAAAAAATCGTTGCCTTCTCAACCTCAAGCCAACTGGGCCTAATAATCGTAAC [...]
+TTAACCAACCCTACCTCGCATTCCTACACATCTGCACCCACGCATTCTTTAAAGCCATATTATTTATATGCTCAGGATCAATCATTCACAGCCTAAATGACGAGCAGGATATCCGAAAAATAGGCGGATTATATAAACCAATACCCTTTACCACTACCTCCCTCATTATCGGAAGCCTCGCATTAACAGGTATACCATTCCTAACAGGCTTTTATTCCAAAGACCTAATCATCGAGACAGCCAACACGTCGTATACCAACGCCTGAGCCCTATTAATTACTCTCATTGCCACATCCCTCACAGCTGCCTACAGTACTCGAATTATATTCTTTGTACTTCTAGGACAACCACGATTCAACGCCTTGAATCCAATCAATGAAAATAATACCTACCTTATCAATTCCATTAAACGTCTCTTAATTGGAAGTATCTTTGCAGGATATTTAATTTCTTATAACATCCCTCCAATAACCATCCCACAAATAACTATAC [...]
+CTGAAACTAACTGCCCTTGCCGTGACTATCACAGGCTTTATCCTGGCATTAGAACTCAACCTTGTGGCCAAAAACTTAAAACTCAAATACCCCTCAAACCTTTTTAAGTTCTCTAACCTCCTAGGGTATTTTCCAACCGTAATACACCGCCTCCCACCAAAAATAAGCCTAACTATGAGCCAAAAATCCGCATCGATACTACTAGACATAATTTGACTAGAAAATGTATTACCAAAATCCATCTCCTACTTCCAAATAAAAATATCAACCACCGTATCTAATCAGAAAGGACTAGTTAAACTCTACTTCCTATCCTTCATAATCACCCTAACCCTTAGCCTACTCTTA??????TTTAATTACCACGAG
+>Ailuropoda_melanoleuca
+ATGAACGAAAATCTGTTCGCCTCTTTTACTACCCCAATGATAATAGGAGTACCAATTGTGGTTCTGATTATTATTTTCCCAAGTATCTTATTTCCCTCACCTAATCGATTAATCAATAACCGCCTAGCTACTGTCCAACAATGATTAATTCAATTAGTATCTAAGTATATACTGTCTATTCACAATTATAAAGGACAAACCTGAGCGCTAATACTAATGTCATTAATTTTATTTATTGGCTCAACTAACCTTTTAGGCCTATTACCACATTCATTCACACCTACTACACAACTATCAATAAATTTAGGAATGGCCATTCCTCTGTGAGCAGGTACAGTAGTTATAGGATTTCGACACAAAACTAAGGCATCTCTGGCCCACTTTCTACCCCAAGGAACACCTCTTCCTCTGATCCCAATGTTAGTAATTATCGAGACAATTAGTCTGTTTATTCAACCTGTGGCCCTAGCTGTACGACTGACCGCTAATATT [...]
+CCATCTACTTATTCATTTAATCGGAGGGGCTACCCTAGTTTTAATAAACATTAACCCTGTAACAGCCCTAATTACCTTTATTATTCTTATTCTACTTACTATTCTCGAATTAGCTGTAGCTCTTATCCAAGCCTATGTTTTCACCCTACTAGTTAGTCTATACTTACATGATAATACCTAAATGCCACAATTAGACACATCCACATGATTTATTACAATCCTATCCATGATCTTAACACTATTTATTATATTTCAGTTAAAAGTCTCAAAACACAACTATCCTGAGTTTCCTGAATTAAAAACAACCCCACTATCAAAAAAACCTATGCCTTGAGAAGAAAAATGAACGAAAATCTGTTCGCCTCTTTTACTACCCCAATGAATGTTCATTAACCGATGACTGTTTTCCACCAACCACAAAGATATTGGCACTCTTTATCTTCTGTTTGGCGCATGAGCTGGTATAACGGGCACTGCTCTTAGCCTTCTAAT [...]
+AATTAGGTCAGCCTGGAGCTCTGTTAGGAGATGACCAAATTTACAATGTAGTTGTAACTGCCCACGCATTCGTAATAATCTTCTTTATAGTTATGCCTATTATGATCGGAGGCTTTGGAAATTGACTAGTACCTTTGATAATTGGTGCGCCTGATATAGCATTTCCCCGAATAAACAATATGAGTTTCTGATTACTACCTCCATCCTTTCTTCTCCTTCTGGCTTCTTCCATAGTAGAAGCAGGCGCAGGGACTGGATGAACTGTATACCCTCCTCTAGCAGGTAACTTAGCCCATGCAGGAGCATCAGTAGACCTAACAATCTTTTCTCTACATCTGGCAGGGGTTTCTTCTATTTTAGGGGCTATTAACTTTATTACCACTATCATCAACATGAAACCCCCTGCAATATCTCAATATCAAACTCCCCTATTCGTGTGATCAGTACTTATCACAGCAGTACTTCTCCTTCTATCTTTACCAGTCTTAGCAG [...]
+ACTATACTACTTACAGATCGAAATCTCAATACTACTTTCTTCGACCCGGCCGGAGGAGGGGATCCCATTCTATATCAACATCTATTTTGATTCTTTGGCCATCCTGAAGTCTATATTCTAATCCTCCCTGGGTTTGGAATAATTTCACACATTGTCACATACTATTCAGGAAAGAAAGAGCCCTTTGGTTATATGGGAATAGTGTGGGCAATAATGTCAATTGGGTTCTTAGGATTTATTGTATGGGCCCATCATATATTACTGGTAGGCATAGATGTTGATACACGAGCCTATTTTACCTCGGCCACTATAATTATTGCAATCCCGACAGGAGTCAAAGTATTCAGCTGACTAGCTACCCTGCATGGAGGAAATATTAAGTGATCCCCTGCCATAATGTGAGCCCTAGGTTTCATTTTTCTATTTACAGTAGGGGGTCTTACAGGCATTGTTCTAGCTAACTCATCTCTGGACATTGTCCTCCATGACACA [...]
+AGTAGCACACTTCCACTATGTACTATCAATAGGGGCCGTGTTCGCTATTATAGGAGGCTTCGTCCATTGATTCCCATTATTTTCGGGCTATACACTTAATAATACATGAGCAAAAATTCACTTCGTAATTATATTTGTTGGAGTCAATATAACATTCTTCCCCCAGCACTTCCTAGGTCTATCAGGTATGCCTCGACGATATTCTGATTATCCAGACGCCTATACAGCATGAAACACAGTGTCTTCAATGGGTTCATTCATTTCACTAACAGCAGTTATGTTAATAATTTTCATAATTTGAGAAGCCTTCGCATCTAAACGAGAAGTGGCAGTGATTGAGCTTACTACAACTAATATTGAATGGCTCCACGGATGTCCTCCCCCATACCATACATTCGAAGAGCCCGCCTACGTCATACTGAAAATGGCGCATCCCTTTCAAACAGGCCTTCAAGATGCAACTTCCCCCATCATGGAAGAACTCCTACACTT [...]
+ATACACTAATAATTGTATTCTTAATTAGTTCCTTAGTTCTCTATATCATTTCAATTATATTAACTACTAAATTAACACATACAAATACAATAGACGCACAAGAAGTGGAGACAGTATGAACTATTCTACCAGCTATCATCTTAATTATAATTGCACTTCCATCACTACGAATTCTTTATATGATAGATGAAATTAATAACCCATCATTAACTGTAAAGACTATGGGGCATCAATGATACTGAAGCTATGAGTATACAGATTATGAAGACTTGAGCTTCGATTCTTATATAACCCCAACACAAGAGCTAAAGCCCGGAGAGCTGCGATTACTAGAGGTAGATAATCGAGTAGTACTACCCATAGAAATAACAATTCGCATATTAATTTCCTCAGAAGATGTGCTACATTCGTGAGCGGTCCCATCTCTAGGACTAAAAACTGATGCGATCCCGGGGCGATTAAGTCAAACAACTCTTATGGCCATGCGACCAG [...]
+TATGGCCAATGCTCAGAGATTTGCGGTTCTAATCATAGCTTTATACCCATTGTACTTGAGATAGTTCCGCTGTCTTACTTTGAAAAATGATCCGCTTCAATACTAATGATCCACCAAACACATGCATATCATATAGTTAACCCAAGCCCATGGCCACTTACAGGAGCTCTCTCGGCTCTTCTTATAACATCAGGACTAATTATATGATTTCACTTTAACTCGGTATACTTACTAATACTAGGCCTCACCACCAACATACTTACCATGTATCAATGATGACGAGATATCGTCCGGGAAAGTACCTTCCAAGGCCATCACACCCCAATCGTCCAAGGAGGACTACGATATGGAATAGTCTTATTTATTGTATCAGAAGTATTTTTCTTCGCGGGATTCTTTTGGGCCTTCTACCACTCAAGCCTAGCACCTACTCCTGAATTAGGAGCATGTTGACCACCTACAGGTATCATCCCCTTAAATCCGCTAGAAGTT [...]
+TAACACCTCTGTACTTCTAGCATCTGGGGTATCTATCACTTGAGCTCATCATAGTCTAATAGAAGGAGACCGTAAACATATGCTCCAAGCCCTATTTATTACTATTTCACTAGGAGTTTATTTTACACTTCTACAAGCCTCAGAATACTATGAGACATCCTTTACTATTTCAGATGGAGTGTATGGTTCAACCTTCTTTATAGCAACTGGATTTCATGGGCTTCATGTAATTATTGGTTCAACTTTTCTTACTGTGTGTTTTCTACGACAACTACACTTTCACTTTACATCCAACCATCACTTTGGCTTTGAAGCGGCAGCATGATACTGACACTTCGTAGACGTTGTATGGCTTTTCCTTTATGTTTCTATTTACTGATGAGGATCCTACATGATCAACATCCGAAAAACTCATCCATTAGTTAAAATTATCAACAACTCATTCATTGACCTTCCAACACCATCAAACATTTCAACATGATGGAACTTTGG [...]
+TAGGAGTGTGTCTGATCTTGCAAATCTTAACAGGCTTATTTCTAGCCATACACTATACATCAGATACAGCTACAGCCTTTTCATCAGTCGCACACATTTGTCGAGACGTCAACTATGGGTGATTTATCCGATATATACATGCCAATGGGGCCTCTATATTTTTTATCTGCCTATTTATACACGTAGGGCGAGGCTTATACTATGGATCATACCTATTTCCAGAGACATGGAATATCGGAATTATTCTCCTACTTACAATTATAGCCACCGCATTTATAGGATACGTCCTACCCTGAGGCCAAATGTCCTTCTGAGGAGCGACTGTCATCACCAACCTACTATCGGCCATTCCCTACATCGGAACGAACCTAGTAGAATGAATCTGAGGGGGCTTTTCCGTAGATAAGGCGACCCTAACACGATTCTTTGCTTTCCACTTTATCCTTCCATTTATCATCTCAGCACTAGCAATAGTCCATCTATTATTCCTTC [...]
+GGATCTAATAACCCCTCCGGAATTCCATCTGACCCAGACAAAATCCCATTTTACCCCTATCATACAATTAAAGACATCCTAGGCGTCCTATTTCTTGTCCTCGCCTTAATAACCCTGGCTTTATTCTCACCAGACCTGTTAGGAGACCCTGATAACTATACCCCTGCAAATCCACTAAGTACCCCGCCACATATTAAGCCTGAATGGTACTTTCTATTTGCCTACGCTATCCTGCGATCCATTCCTAATAAACTAGGAGGGGTGCTAGCTCTAATCTTCTCTATTCTAATTCTAACTATTATTCCACTATTACATACATCCAAACAACGAAGCATGATATTCCGACCTCTAAGTCAATGCTTATTCTGACTCCTAGTAGCAGACCTACTCACACTAACATGAATTGGAGGACAGCCAGTAGAACACCCCTTCATTATTATTGGGCAATTGGCCTCTATTCTCTACTTTACAATTCTTCTAGTACTTATACCT [...]
+CATTATTGAGAATAGCCTCTCAAAATGAATGTTTATAATTAACATCTTCTCACTAATTGTACCTATTCTTCTTGCTGTAGCCTTTCTGACTCTAGTAGAACGAAAAGTACTAGGCTACATACAGCTTCGAAAAGGCCCAAATATTGTAGGTCCATATGGTCTCTTACAACCAATCGCAGATGCCGTAAAACTCTTTACTAAAGAACCTTTACGACCACTTACGTCATCCATAACTATATTTATTATAGCCCCTATTCTAGCCTTAACACTAGCTCTGACCATGTGAGTCCCCTTACCAATACCGCACCCCCTTATTAACATAAACCTAGGAGTACTATTCATACTAGCTATATCAAGTCTAGCTGTATACTCTATTCTCTGATCTGGATGAGCCTCAAACTCAAAATATGCCCTAATTGGAGCCCTACGAGCCGTAGCTCAAACGATCTCATATGAAGTCACACTAGCCATTATCCTTTTATCCGTTCTACT [...]
+GCTCATTTACGCTATCCACGCTAATCATTACCCAAGAACATCTTTGATTAATCTTCCCTGCATGACCACTAGCTATAATATGATTTATTTCTACCCTAGCAGAAACAAATCGAGCCCCCTTTGACCTAACAGAAGGAGAATCAGAACTAGTCTCTGGGTTTAATGTCGAATATGCAGCAGGTCCATTTGCCCTGTTCTTCCTAGCAGAATATGCCAACATCATCATAATAAATGCTCTTACAACTATTCTATTCTTCGGAGCATTTCACAGCCCCTACATACCAGAATTATACATTGTTAATTTTACCGTAAAAACTTTACTCCTCACAATCTCTTTTCTATGAATCCGAGCATCATATCCTCGATTCCGATACGACCAACTAATACACCTACTATGAAAAAACTTTCTACCTCTCACACTAGCTCTATGTATATGACATGTAACTCTACCTATTATTACAGCAAGCATTCCACCTCAAACGATAAAACCAG [...]
+ATTACCATTACATCCACCGTTGTCTTAGGAACTATAATTGTTCTATTTAGCTCCCACTGATTCATAATCTGAGTTGGCTTTGAAATAAATATACTAGCCATTATCCCAATTCTAATAAAAAAATATAACCCACGAGCCATAGAAGCTTCCACAAAATATTTTCTAACACAAGCTACAGCATCCATGCTTCTAATGCTAAGCATCATCATCAATCTACTATGCTCAGGACACTGAACAATTTCAACAATTCCCAATCCAGTAGCATCTACCATAATTACTATTGCTCTAACAATAAAACTTGGCCTATCACCATTTCACTTTTGAGTCCCAGAAGTTACACAAGGAATTTCCTTATCTTCAGGAATAATCCTATTAACATGACAAAAAATTGCACCTCTATCCATTCTATACCAAATTTCACCATCCATTAACTCAAATCTCTTACTAATAATAGCTATCACATCCATACTGGTAGGAGGCTGAGGAGGATTA [...]
+CCAACTCCGAAAAATCTTGGCATACTCCTCAATTACCCATATAGGCTGAATGGCTGCTATTATAGTATATAATCCTACCCTAGCAATTCTTAACCTAACAATTTACATCATAATAACTCTAGGAACATTTATACTATTCATACATAGCTCATCTACAACAACACTATCACTATCTTATACATGAAATAAATTCCCATTAATAGCCCCACTAATCTTAATACTTATACTATCACTAGGAGGCCTCCCTCCTCTCTCAGGCTTTATCCCCAAATGAATAATTATTCAAGAATTAACAAAAAACGACATAATTATTATACCTACACTTATAGCCATTACAGCCCTACTAAACCTATATTTTTACACACGCCTAACATATACTACAGCATTAACTATATTTCCCGCAACAAATAATATAAAAATAAAATGACAATTCGAAACCACAAAAAAGACAACTCTCCTAGCCCCTCTAATCGTGACATCAACTATACTACT [...]
+CCCCAATACTAGCAGCTCTTGATATAAACCTAATTCTAGCACTTCTAACCAACGTATTATTAGCCTCCCTGCTCGTTCTTATTGCATTCTGACTGCCACAACTAAATATCTATGCAGAAAAAGTAAGTCCTTATGAATGTGGATTTGATCCTATAGGATCAGCACGCCTTCCTTTCTCTATAAAATTTTTTCTAGTAGCTATTACATTCCTTTTATTCGACTTAGAAATTGCTCTACTCCTCCCGCTTCCTTGAGCATTACAGACTAACAACTTAATAACTATACTTATTATAGCTCTATTACTCATTTCCCTATTAGCCGCAAGCCTAGCTTATGAGTGAACCGAAAAGGGGCTAGAATGGGCCGAAATGTCTGTGGTCTATATTAATCTCTTTCTAGCCTTTACTATATCCTTAATAGGGCTACTCATCTACCGATCCCATTTAATATCCTCCCTATTATGCTTAGAAGGCATGATGCTGTCACTATTTG [...]
+ACAGTAACAATCCTAAGTAACCACTTCACACTAGCCAGTATGACTCCAATCATTCTATTAGTATTCGCTGCCTGTGAAGCAGCGTTGGGGCTTTCTCTGCTAGTAATAGTCTCTAATACCTATGGAACTGACTACGTACAAAATCTTAACCTCCTACAATGCATTATCCTCCCTACCATAATACTAGTACCCCTTACATGAATATCAAAGCCTAACATAATCTGAATTAATACAACAACCTATAGTCTACTCATCAGCCTTATTAGTCTGACATATCTTAATCAACTCAGTGATAATAGTCTAAACTTCTCATTAACATTCTTTACCGACTCCCTATCAGCCCCCCTGTTAGTTCTCACAACATGGCTACTGCCCTTAATACTTATAGCTAGTCAATTTCACCTGTCAAAAGAGACCCTGACCCGGAAAAAATTATATATCACAATACTAATTCTCCTGCAACTATTCTTAATTATAACATTTTCTGCTACT [...]
+CATATTCTATATCTTATTTGAAGCTACCCTGGTACCGACTTTAGTCATCATTACTCGATGAGGAAACCAAACAGAACGACTAAACGCGGGCCTCTATTTTTTATTCTACACCTTAGTAGGATCCTTGCCCTTACTAGTTGCACTGTTATATGCCCAAAACAGCTTAGGATCACTAAATTTTCTCATAGTACAGTACTGAACTCAGCCCTTGCCAAATTCCTGATCTAACATTTTCATGTGGCTGGCATGTATAATAGCATTCATAGTAAAAATACCGCTATATGGCTTACACCTATGACTACCCAAAGCACATGTAGAAGCTCCTATTGCAGGATCCATAGTACTTGCTGCAGTACTTCTAAAACTAGGGGGATACGGTATAATGCGGATTACAACAATACTCAACCCTCTAACAAATTTTATAGCCTACCCCTTCATAATGCTCTCACTATGAGGAATAATCATAACAAGTTCTATTTGTTTACGCCAGAC [...]
+AGTCCCTAATTGCATACTCCTCTGTTAGTCACATAGCCCTAGTCATTGTAGCAATTCTAATCCAATCCCCATGAAGCTACATAGGAGCTACTGCTCTAATAATCGCCCATGGGTTAACATCTTCTATGCTATTCTGTCTTGCAAACTCTAACTACGAGCGAACCCATAGCCGAACTATAATTCTCGCACGGGGCTCGCAAACGCTTCTTCCACTTATAGCAGCTTGATGACTATTAGCAGGCCTAACTAACTTAGCTCTTCCTCCTACAATTAATCTGATTGGGGAACTGTTTGTAGTGATAGCCACATTTTCATGATCCAATATTACCATTCTCTTAATAGGAGTTAACATTACCATTACTGCTCTCTACTCTCTATATATACTAATTTCTACACAGCGAGGCAAGTATACAGACCACATCAAAAATATTAAACCATCTTATACACGAGAAAATGCCTTAATAGCCTTACATTTACTACCCCTTTTACTTC [...]
+AACCCTAAAGTAGTTCTAGGCTTTATTTACTGTAAAATAAAAGTAATTAATCTACTTACCTCCTTCACCATTACAACCCTATTTATATTAATCATGCCCATTATCCTAACCTGTACCCCAGCATATGAAAATAAACTTTATCCGCAATATGTAAAAACCACAGTCTCTTATGCCTTCACAATTAGCATAATTCCCATAGTAATATTCATCCACTCCGGACAAGAAGCAATCATCTCAAACTGACACTGAATAACCATCCAAACCCTAAAACTCAGTCTAAGCTTCAAATTAGATTACTTTTCAATAATCTTCGTACCAGTGGCCCTATTCGTCACATGGTCAATTATAGAATTCTCTATATGATATATACACGCAGATCCTAACATTAACCGATTCTTTAAATATCTACTTATATTCCTCGTCACGATAATAATTCTAGTAACCGCAAATAATCTATTTCAGCTATTCATCGGCTGAGAGGGAGTAGGAATC [...]
+TCTCCTCATTGGATGATGATATGGACGAACAGATGCTAATACGGCTGCCCTACAAGCAGTACTATACAACCGCATTGGAGATGTTGGTTTTATCATGGCCATAGCTTGATTCTTACTCAATACAAATGCATGGGACTTCCAACAAATCTTTATAATCGAACATAAAAACCTCAATATTCCACTGGCAGGACTACTTCTAGCAGCTACCGGAAAGTCTGCCCAATTTGGACTTCACCCATGACTCCCATCAGCCATAGAAGGCCCCACTCCTGTCTCAGCACTACTTCACTCTAGCACAATAGTAGTAGCAGGCGTATTTCTTCTAGTCCGATTTCACCCCTTAATAGAACATAACAAGACAATTCAAACGGTTACCCTATGCTTAGGGGCAATAACAACCTTGTTTACAGCAATCTGCGCCCTTACCCAAAATGATATCAAAAAAATTATTGCCTTCTCCACCTCGAGCCAACTAGGACTAATAATTGTAAC [...]
+TTAATCAACCTCATCTGGCCTTTCTCCATATCTGCACGCATGCATTCTTCAAGGCCATGCTATTTCTATGCTCCGGATCTATTATTCATAGTCTAAACAACGAACAAGATATTCGAAAGATAGGAGGGCTATTTAAAAGTCTACCATTTACCACTACTGCTCTAATCATCGGAACTCTAGCACTTACAGGAATGCCCTTCTTAACAGGATTTTACTCCAAAGACTTAATTATTGAAACCGCCAATACGTCATACACCAACGCCTGAGCCTTACTAACAACCCTTATCGCCACATCCATAACTGCCGCCTACAGTACTCGAATTGTATTTTTTACACTTCTAGGACAACCTCGCTATAGTCCCATTATCACCATTAACGAGAATAACCAGTTCCTGACTAACTCTGTCAAACGATTGCTACTAGGAAGTATCTTTGCGGGATTCCTAATCTCTCATAACATTACACCCACCACTGTCCCACAAATAACCATGC [...]
+CTAAAAATGATAGCCCTTACAGTAACAATCCTAGGCTTTATTCTAGCACTAGAACTTAACCTAGCCATACAAAATCTCAAATTTGACTACCCGTTAAGCACGTTCAAATTTTCAAATCAACTAGGATATTTCCCTACTACTCTGCATCGTCTCGCACCAATAATAGGTCTATCAATAAGCCAAAAAACAGCATCCATACTGCTAGATGCAATCTGACTAGAGAATGTTCTACCAAAGTCCATCTCCTACTTTCAAATAAAATCCTCAATCACAGTCTCCAACCAAAAGGGACTAATTAAACTATACTTTCTCTCCTTTATAATTACACTAATCTTAAGTCTCTTTATA??????CTTAATTTCCACGAG
+>Ailurus_fulgens
+ATGAACGAAAACTTATTTGCCTCTTTCACTACCCCAACATTAATAGGACTCCCTATTGTGATTCTCATTATTATACTCCCGAGCATTCTTTTTCCATCATCCAACCGATTAACCAATAACCGACTTATTTCAATCCAACAGTGACTATTAAAGCTTACATCAAAACAAATACTATCCACTCACAACTACGAAGGACAAAGCTGAGCCCTAATACTAATATCTTTAATTCTATTCATTGGCTCAACCAACCTACTAGGCCTTCTACCTCATTCATTCACTCCAACTACACAACTATCTATAAACCTAGGTATAGCTATTCCTCTATGAGCAGGAACAGTAGTTACAGGATTCCGATATAAAACTAAAGCATCTCTAGCTCATTTCCTACCCCAAGGAACACCTATTTTCTTAATTCCTATACTTGTAATCATTGAAACTATCAGCCTATTCATTCAACCTATGGCCCTAGCTGTACGACTAACAGCCAACATT [...]
+CCACCTGTTAATCCACCTGATCGGAGGGGCTACCCTCGTCCTAATAAATATTAGTACTGTTACAGCCTTAATTACCTTTATTATTCTAGTTTTACTGACTATTTTAGAATTTGCAGTAGCCCTCATTCAAGCCTACGTATTTACTCTCTTAGTAAGCCTATATCTACATGACAATACCTAAATGCCACAATTAGATACTTCAACATGATTCATCACAATTATATCCGTAATACTTACCCTTTTCATCATATTCCAATTAAAAATCTTAAAATCTAGCTTTCCAAATAATCCTGAACCTAAACCAACACCAATACTAAAAACCTCCATACCCTGAGAAAAAAAATGAACGAAAACTTATTTGCCTCTTTCACTACCCCAACATATGTTCATAAACCGATGATTATTTTCCACAAATCATAAAGACATTGGCACCCTTTATCTTTTATTTGGTGCATGAGCTGGAATAGTTGGAACTGCCTTAAGTCTGTTAAT [...]
+AACTAGGTCAACCCGGCACCCTGTTAGGAGATGATCAGATTTATAATGTAATCGTAACTGCTCATGCATTCGTAATAATTTTCTTTATAGTAATGCCAATTATGATCGGAGGATTCGGGAACTGACTCGTACCACTAATAATTGGTGCCCCTGATATAGCATTTCCTCGAATAAACAATATAAGTTTCTGACTTTTACCTCCTTCTTTCCTTCTTCTTCTGGCCTCCTCTATAGTAGAAGCAGGCGCAGGAACCGGATGAACAGTATATCCTCCCTTAGCAGGTAATCTAGCCCATGCAGGGGCATCCGTAGATCTAACAATCTTTTCTCTCCACTTAGCAGGAGTTTCATCTATTCTAGGTGCTATCAACTTTATCACCACTATTATTAATATAAAACCCCCTGCAATGTCACAATATCAAATCCCCTTATTCGTATGATCTGTATTAATTACAGCGGTTTTACTACTTCTATCCCTTCCAGTTCTAGCAG [...]
+ACCATGCTATTAACAGATCGTAATCTAAATACAACTTTCTTTGATCCTGCTGGAGGAGGAGACCCCATCTTGTACCAGCACTTATTCTGATTCTTTGGGCACCCTGAAGTTTATATCCTTATCCTTCCAGGTTTTGGAATAATTTCACACATCGTAACATACTATTCAGGAAAAAAAGAACCTTTTGGATATATAGGGATAGTATGAGCAATAATATCTATTGGGTTCTTAGGTTTTATTGTATGAGCTCACCATATATTTACTGTAGGCATGGATGTTGACACACGAGCATACTTTACTTCCGCCACTATAATTATTGCAATTCCTACAGGAGTTAAAGTGTTCAGCTGACTGGCTACTTTACACGGAGGTAACATTAAATGATCGCCCGCTATATTATGAGCCCTAGGTTTTATCTTCTTATTTACAGTAGGTGGCTTAACAGGCATTGTTCTGTCAAACTCATCGTTAGACATTGTTCTTCACGATACA [...]
+AGTAGCTCATTTCCACTATGTACTATCAATGGGAGCAGTCTTTGCCATTATAGGAGGTTTTGTACACTGATTTCCACTATTCTCAGGATATACTCTTAATGACGTCTGAGCAAAAATTCATTTCACAATCATATTTGTAGGAGTCAATATAACATTCTTTCCTCAACATTTCCTAGGACTATCAGGGATACCTCGACGTTATTCCGATTATCCAGATGCCTATACTATATGAAATACAGTTTCATCCATGGGATCCTTCATCTCACTTACAGCAGTAATGCTAATAATCTTTATAATCTGAGAGGCTTTCGCATCCAAACGAGAAGTAATAACAGTAGAATTAACTTCAACCAATATCGAATGACTCCATGGATGCCCTCCTCCTTATCATACATTCGAAGAACCCACTTATGTAGTTTCAAAAATGGCATACCCTTTCCAAATAGGACTTCAAGATGCAACTTCTCCTATCATAGAAGAACTCCTCCACTT [...]
+ATACACTAATAATTGTTTTTCTAATCAGCTCCCTCGTCCTTTATATTATCTCATTAATATTGACTACTAAGTTGACTCATACTAGCACAATGGACGCACAAGAAGTTGAAACTATCTGAACTATTTTACCAGCTATCATCCTTATTCTAATTGCCCTACCTTCCTTACGAATCCTTTATATAATGGATGAAATTAATAACCCTTCCTTAACTGTAAAAACCATAGGCCATCAGTGATATTGAAGTTATGAATACACAGATTATGAAGACCTAAGCTTTGACTCCTATATAATTCCCACTCAAGAGCTCAAACCTGGAGAACTACGACTATTGGAAGTAGACAACCGAGTAGTACTACCAATAGAGTTAACAATCCGTATGTGGATTTCATCCGAAGATGTACTACACTCATGAGCTGTACCCTCCCTAGGCTTAAAAACCGATGCCATCCCAGGACGCCTGAATCAAACTACCCTAATAGCTATGCGACCTG [...]
+TATGGTCAGTGCTCAGAAATCTGTGGGTCAAACCATAGCTTTATACCTATCGTCCTAGAACTAGTCCCACTATCCCACTTTGAAAAATGATCTGCCTCATTGCTAATGACCCACCAAACCCATGCATACCATATAGTTAACCCAAGCCCATGGCCACTTACAGGGGCTCTCTCCGCTCTCCTTATAACATCAGGATTAATCATATGATTCCACTTTAACTCTATAATTTTGCTAGCGTTAGGCCTAACTACTAATACCTTAACCATATATCAATGATGACGAGATATTATTCGAGAGAGCACATTTCAAGGCCACCACACCCCTACCGTACAAGGAGGCCTACGATATGGCATAATCCTATTCATCGTGTCGGAAGTATTCTTTTTTGCAGGTTTCTTTTGAGCTTTCTATCACTCAAGTCTAGCCCCAACTCCTGAATTAGGAGGATGCTGACCCCCCACAGGCATTACACCCTTAAATCCCCTAGAAGTC [...]
+TAACACTTCCGTCCTATTAGCCTCAGGAGTATCAATCACCTGAGCCCACCATAGTTTAATAGAGGGGAACCGTAAACATATACTCCAAGCCCTACTAATTACAATCCTCTTAGGTGTCTACTTTACACTTCTACAAGTATCCGAATATTACGAAACATCTTTTACAATCTCCGATGGGGTTTATGGCTCTACTTTCTTTATAGCCACAGGATTCCATGGACTTCATGTAATTATTGGGTCAACTTTCCTAATCGTGTGTTTTCTACGCCAATTAAATTATCACTTTACATCTAACCACCACTTCGGATTTGAAGCAGCTGCTTGATATTGACACTTCGTAGATGTAGTATGACTGTTTTTGTATGTCTCCATTTATTGATGAGGATCCTATATGACCAACATTCGAAAAACTCACCCACTAATAAAAGTTATCAACAACTCATTCATCGACCTACCAACACCATCCAACATCTCAACATGATGAAACTTTGG [...]
+TCGGAATTTGCTTAATTCTACAAATCCTGACAGGCCTTTTCCTAGCTATACATTATACATCTGATACCGCCACAGCCTTCTCATCAATCACACATATCTGTCGAGATGTAAACTACGGCTGAATCATTCGCTACATACATGCTAATGGAGCCTCCCTATTCTTTATCTGCCTATACATGCATGTAGGACGAGGCCTGTACTATGGTTCTTATATATTCCTGGAAACATGAAACATTGGAATCATCTTATTATTCGCAACTATAGCTACAGCATTCATAGGATATGTCCTGCCCTGAGGACAGATATCATTCTGAGGAGCAACCGTTATCACCAACCTACTATCAGCCATTCCCTATATTGGAACTAACCTTGTAGAGTGAATCTGAGGAGGTTTCTCAGTCGACAAAGCAACTCTAACTCGATTCTTCGCCTTCCACTTCATTCTTCCATTTATCATTGCAACACTAGCAACTATCCATCTCTTATTCCTAC [...]
+GGATCTAATAACCCCTCAGGCATCCCATCCAACTCAGACAAAATTCCATTCCATCCCTATTATACAATTAAAGATATCTTGGGCGCTCTACTCCTTATCCTAATTCTCATGACATTAGTACTATTCTTACCTGACTTGCTTGGTGATCCTGATAACTATATTCCCGCTAACCCATTAAGCACACCACCCCATATTAAACCTGAGTGGTATTTCCTATTCGCATATGCAATTCTACGATCCATCCCAAACAAACTAGGAGGGGTGCTAGCCCTAATTCTTTCCATCTTAATCCTAGCGATCATCCCTCTTCTCCATACCTCAAAACAACGAGGAATGATATTCCGACCACTAAGCCAATGCCTCTTCTGACTGCTAGTAGCCGATCTACTAATCCTAACATGAATTGGAGGACAACCAGTGGAACACCCCTTTATCATTATCGGTCAACTGGCCTCCATTACCTACTTTACAATCCTCTTAATCCTAATACCT [...]
+CATTATCGAAAATAACCTCCTAAAATGAATGTTTATAATTAATATCATCTCACTTATTATTCCAATTCTACTAGCAGTAGCCTTCCTAACACTAGTTGAACGCAAAGTACTAGGCTATATACAACTACGAAAAGGCCCTAATATTGTAGGACCCTGCGGTCTCCTACAACCCATTGCAGACGCCATAAAACTCTTTACTAAAGAACCACTCCGCCCACTTACATCTTCCATAACCATATTTATCATAGCCCCCATCCTAGCTTTAACACTAGCCTTAACCATGTGAATCCCCTTACCAATACCATATCCCCTCATCAACATGAATCTAGGAGTCCTATTCATATTAGCAATATCAAGCCTAGCCGTCTACTCTATCCTATGATCTGGATGGGCTTCAAATTCAAAATATGCCCTAATCGGAGCTCTCCGAGCCGTAGCTCAAACAATTTCATACGAAGTTACATTAGCTATCATTCTACTATCAGTACTTAT [...]
+GCTCCTTTACCTTATCCACACTAATCATCACACAAGAACACCTATGACTTATTTTCCCCGCATGACCATTAGCTATAATGTGATTTATCTCGACTCTAGCAGAAACCAACCGAGCCCCATTTGACCTAACGGAAGGAGAATCAGAATTAGTCTCAGGATTTAACGTTGAATATGCAGCAGGCCCATTCGCCCTATTCTTCCTAGCAGAATACGCCAACATTATCATAATAAATATTCTTACTACCACTCTCTTCTTTGGTGCATTTCATAGTCCCTGCATACCAGAACTATACACTGTAAACTTCACAATCAAAACATTATTCTTAACTATCTCCTTTCTATGAATTCGAGCATCATACCCTCGCTTTCGCTACGACCAACTAATACATTTATTATGAAAAAATTTTCTACCTTTAACACTAGCCCTATGCATATGACACGTGACTTTACCCATCATTACAGCTGGTATTCCCCCCCAATCAATAAAACCTC [...]
+ATCATTATTATAACAACCGTGATCTCAGGCACTATAATAGTTTTAATCAGCTCTCACTGACTACTAATTTGGATTGGATTTGAAATAAATATACTAGCAATTATCCCAATCCTTATGAAAAAATTTAATCCACGAGCTATGGAAGCATCCACAAAATATTTTTTAACCCAAGCCACAGCATCTATAATCCTCATACTAGGAATTATCATCAACCTATTATACTCAGGACAATGAACTATACTACATACTCCTAACCCAATGGCATCAAACATAATAACCATTGCTTTAACAATAAAACTTGGACTCTCTCCCTTTCACTTCTGAGTTCCAGAAGTAACACAAGGAATTTCTCTCTCATCAGGTATGATCCTATTAACCTGACAAAAAATCGCACCCCTCTCTGTCTTATATCAAATAGCACCATCTATCAACCCAAACCTCCTAATATCCATAGCCATCATATCTATATTAGTAGCAGGCTGAGGGGGTCTC [...]
+CCAACTACGAAAAATTCTAGCATATTCATCAATTGGCCATATAGGATGAATAACCTCCATTACAGTTTATAACCCCACCCTTATACATCTAAACCTAGTAATATACATTATAATAACTCTGGGAACCTTTATACTGTTCATATACAACTCATCTCTAACTACTCTATCCTTATCTTACTCATGAAATAAATTTCCACTAACCACCCTCTTAATCCTAATACTTATATTATCACTCGGGGGCCTCCCTCCTCTTTCAGGCTTTATCCCTAAATGAATAATTATCCAAGAGCTCACAAAAAATAATATAATTATCATCCCAACATTTATGGCAATCGCAGCCTTACTAAGTCTATACTTTTATATACGGTTAACGTACACTACGGCACTAACTATATTTCCCTCAATAAACAACATAAAAATAAAATGACAGTTTGAGAATACAAAAAAAATTACCCTCCTACCTCCCTTAATTATTATATCAACCATACTTCT [...]
+CCCCAATAATACTAATCTTATATATTAACTTAATTATAACCCTCTTCATCAACATTACTTTAACCTCCCTACTAGTTCTTATTGCATTCTGACTTCCCCAACTAAATATTTATACAGAAAAAACGAGTCCCTATGAATGTGGCTTTGATCCTATGGGGTCCGCACGTATACCCTTTTCCATAAAATTTTTTCTAGTCGCTATTACATTTTTACTCTTCGACCTAGAAATTGCACTACTCCTACCCCTACCCTGAGCCACACAAACAGTTAATCTAACTACAATACTTACCACAGCTCTATTACTAATCTCCCTTCTAGCTGTAAGTCTAGCATATGAATGAACCGAAAAAGGACTAGAGTGAACAGAAATGTCCATAGTATACATTAACATTTTTCTAGCTTTTGCTATCTCTTTTATAGGATTACTTATATACCGATCACACTTAATATCATCCTTGCTCTGCCTAGAAGGCATAATACTATCTCTATTCG [...]
+ACAATCACAATCTTAAGTAACCACTTTACACTAGCTAGTATAATCCCTATTATTTTATTAGTCTTCGCAGCTTGTGAAGCAGCCTTGGGTCTCTCACTATTAGTTATAGTATCCAATACATATGGAACTGACTATGTACAAAACTTAAACCTACTACAATGCATTATCTTTCCCACTATTATACTAATTCCTCTAACCTGAATATCAAAACCTAATTTAATCTGAATTAACACGACAGCCTACAGCTTACTAATTAGCCTTATTAGCCTATCATATCTAAATCAACTTGCAGATAATAGCTTGAATTTTTCACTATTGTCTTTTACTGACTCCTTATCAGCACCTTTATTAACGCTTACAACATGACTACTTCCCCTAATACTAATAGCTAGCCAATTTCATCTATCAAAAGAGACTTTCACTCGAAAAAAACTTTATATCACAATACTAATTATACTTCAAGCATTTCTAATTATAACATTTACTGCCACA [...]
+TATATTTTATATCTTATTTGAAGCAACACTTGTGCCCACTTTAATCATCATCACCCGATGAGGTAGCCAAGCAGAGCGACTTAACGCGGGCCTTTACTTCCTATTCTACACCCTAATAGGATCCTTACCTCTTCTAATTGCACTATTATACATTCAAAATGATATGGGTACCCTAAACTCTCTCGCGATCCAATACTTATACCAACCCCTACTAAATTCCTGGTCTAATGCACTCCTATGACTAGCCTGTATAATAGCATTTATAGTAAAGATACCCTTATATGGACTTCACCTATGACTTCCAAAAGCCCATGTAGAGGCCCCTATTGCCGGATCCATAGTTCTTGCCGCGGTCCTTCTAAAATTAGGAGGATATGGCATAATACGAATTACTATCCTACTTAGTCCCCTAACTAACCTCATGGCCTACCCTTTCATAATACTATCTTTATGAGGAATAATCATAACAAGTTCCATTTGCTTACGCCAAAC [...]
+AAGCTCTAATTGCATATTCCTCCGTAAGCCACATAGCACTTGTAATCGTGGCCATTCTTATTCAAACCCCCTGAAGCTATATAGGAGCAACTGCCCTAATAATTGCTCACGGTCTCACATCATCTATAATATTCTGCTTAGCTAACTCCAATTATGAGCGCATCCACAGCCGAACTATAATTCTGGCACGAGGATTACAAACCCTCCTACCTCTTATAGCCATATGATGATTACTAGCCAGCCTAACCAACCTAGCACTACCCCCTTCAATTAATCTAATTGGAGAACTATTTGTAATTATGGCTTCATTCTCATGATCCAACTTCACCATTATTCTAATAGGAATTAATATCATTATCGCCGCCTTATATTCCCTCTATATACTTACTACTACTCAACGTGGCAAGTACTCCTACCACATTAAAAATATCAAACCCTCCTTCACACGAGAAAATGCTCTAATGACCCTTCACCTCCTACCCCTACTCCTAT [...]
+AATCCTAAAATCATTTTAGGGCCTATCTACTGTAAAATAAAAGTAATTAACCCATTCGCCCCCCTTACCATAACAATGCTCCTCATACTAACCCTACCCATTATCATAACCAGCACTCCAATTTATAAAAGTAAGTTCTTTCCACAATATGTAAAAACTACTATCTCGTATGCTTTCACAATTAGCATAATCCCCGCTATAATATTTATTTTCCTAGGCCAAGAAATAATTATTTCCAACTGACACTGAATAACTATTCAAACCCTAAAACTATCACTAAGCTTTAAACTAGATTACTTCTCAATAATTTTTATACCAGTAGCCCTCTTTGTCACATGGTCTATTATAGAATTCTCCATATGATACATACACTCAGATCCTTATATTAACCGATTCTTTAAGTACTTACTCTTATTCCTAATCACTATAATAATTCTGGTTACTGCCAATAATATATTCCAACTATTTATCGGTTGAGAGGGGGTAGGTATC [...]
+TCTACTTATCGGATGATGATATGGACGAGCAGACGCAAATACAGCTGCGTTACAAGCTATCCTCTACAACCGTATTGGAGACGTAGGCTTCATTATAGCTATAGCCTGATTCCTATTTAACTTAAATACATGAGATCTTCAACAAATCTTTATAATCAACCATGAAAACCTAACTCTACCCCTCATCGGCTTACTATTAGCTGCCACTGGAAAATCTGCCCAATTCGGCCTCCATCCATGACTCCCCTCAGCCATAGAAGGACCTACTCCTGTCTCAGCCCTACTCCATTCAAGCACAATGGTAGTTGCGGGTGTATTTCTTCTTATTCGATTCCACCCATTAATAGAACTTAACAAAACAGTACAAACAATTACCCTATGTTTAGGAGCGATCACAACCCTATTCACAGCAATATGCGCTCTTACCCAAAATGATATCAAAAAGATTATTGCTTTTTCCACTTCAAGCCAACTAGGACTTATAATTGTAAC [...]
+TTAACCAACCTTATTTAGCTTTTCTACATATCTGCACACATGCATTTTTCAAAGCTATATTATTTCTGTGCTCAGGATCAATCATCCATAGTTTAAACAACGAGCAAGATATCCGAAAAATAGGCGGCCTCTTTAAACTTCTACCATTTACCACCACTTCCCTAATTGTTGGAAGTCTTGCGCTCACAGGTATGCCTTTCCTTACAGGATTTTACTCCAAAGACCTAATCATTGAAACCGCTAATACGTCGTACACCAACGCCTGAGCCCTATTAATCACTCTCATTGCTACATCCATAACAGCTGCCTACAGTACTCGAATTTTATTCTTTACTCTACTAGGACAACCTCGCTTTAATCCTACCACCACAACTAATGAGAATAATCCACTCCTAATTAATTCCATTAAACGCCTTCTGTTCGGAAGCATTTTTGCAGGATATTTAATTACCTATAACATCACACCCACTTCTACTCCCCAGATAACTATAC [...]
+TTAAAAATAATAGCTCTCGCCGTGACTATTATAGGTTTCATCTTAACATTGGAACTCAACTCTATCACACAAAACCTAAAATTTAAATACCCTTCAAACTCATTTAAATTCTCAAATCAACTAGGATATTTCCCTACTGTCATTCATCGCCTATTACCAATAATAAGCCTGACAATAAGCCAAAAATCAGCATCAACCCTTTTAGACCTAACCTGACTAGAAAATGTATTACCAAAATCCATTTCTCATTTTCAAATAAATCTCTCAACCACTATTTCTAACCAAAAAGGCCTAATTAAACTATATTTTCTTTCTTTTATAATCACACTAATTCTAGCCATATTAATA??????CTTAATTCCCACGAG
+>Alopex_lagopus
+ATGAACGAAAATCTATTCGCCTCTTTCGCTACCCCCACAATAATGGGCCTACCAATCGCTGTATTAATTGTAATATTCCCATCTATTCTATTCCCATCACCTAACCGACTAATTAATAATCGACTAATCTCTATTCAACAGTGATTAATTCAACTTACATCTAAACAAATACTAATAATCCACAATCAAAAAGGACGAACCTGGGCCCTTATGCTAATATCACTAATTATATTTATTGGCTCAACCAACCTCCTCGGGCTATTACCCCACTCGTTTACACCCACAACCCAGTTATCTATAAATCTAGGGATAGCAATTCCCCTGTGAGCAGGGACAGTAATTACCGGGTTCCGCCACAAAACTAAAGCTTCTTTAGCACATTTCTTACCTCAAGGCACACCCCTCCCCCTAATCCCCATGCTAGTAATTATCGAAACAATTAGCCTATTCATCCAGCCTATGGCCTTGGCCGTCCGATTAACAGCTAACATC [...]
+GCACCTATTAATCCATCTGATCGGAGGAGCCACTCTAGCCCTGATTAATATCAGTGCTACCACGGCCCTTATTACCTTTACAATCCTAGTTTTACTTACCATCCTCGAATTCGCCGTCGCTCTTATCCAAGCTTATGTCTTTACACTACTAGTAAGTCTATACTTACATGACAACACCTAAATGCCACAGCTAGACACATCTACTTGATTCACCATAATTCTCTCAATAACCCTAACCCTGTTTATCTTATTTCAACTAAAAGTATCAAAACACTACTACCCGGAGAATCCAGGACCTAAGTCCGTTAAATCTACTAGCAAACACATCCCTTGAGAAGATAAATGAACGAAAATCTATTCGCCTCTTTCGCTACCCCCACAAATGTTCATTAATCGATGATTATTCTCTACTAACCACAAAGATATTGGCACTTTATACTTGCTGTTTGGAGCATGGGCCGGTATAGTAGGCACCGCCCTAAGCCTTCTGAT [...]
+AATTAGGCCAACCTGGCACCTTGTTAGGAGACGATCAGATCTACAACGTAATCGTAACCGCACACGCCTTTGTAATAATCTTCTTTATAGTAATACCAATTATAATTGGAGGGTTCGGAAACTGATTAGTTCCCCTAATAATTGGTGCTCCTGACATAGCATTCCCTCGAATAAACAACATAAGCTTCTGACTACTTCCCCCATCCTTTCTTCTACTATTAGCATCTTCCATAGTAGAAGCGGGCGCGGGAACAGGGTGAACCGTGTATCCACCACTAGCTGGCAACCTGGCTCACGCCGGAGCATCAGTAGATCTTACAATTTTCTCTCTTCACCTGGCCGGAGTCTCTTCAATTCTAGGGGCCATTAATTTTATTACTACTATTATTAATATAAAACCTCCTGCCATATCCCAATACCAAACCCCATTATTTGTATGATCAGTCCTAATTACAGCGGTTCTATTGCTATTATCGCTACCAGTACTAGCTG [...]
+ACTATACTTCTAACGGATCGCAACCTTAACACAACATTTTTCGATCCTGCTGGAGGAGGGGATCCTATTTTATACCAACACTTGTTTTGATTCTTCGGACACCCCGAGGTCTATATTTTAATCTTGCCTGGGTTTGGTATAATCTCCCACATCGTCACTTACTATTCAGGGAAAAAAGAACCCTTTGGTTATATAGGAATGGTATGAGCAATAATGTCTATCGGGTTTTTAGGTTTTATCGTGTGAGCTCATCACATATTCACTGTAGGAATAGACGTGGATACACGAGCATACTTCACATCCGCCACTATAATTATTGCCATTCCTACAGGGGTTAAAGTATTCAGCTGATTAGCAACACTTCACGGGGGAAATATTAAATGATCTCCAGCTATGCTGTGAGCTCTAGGCTTTATTTTCCTATTCACGGTAGGTGGCCTAACGGGCATCGTTTTAGCCAACTCGTCCCTGGACATCGTTCTCCATGACACG [...]
+TGTAGCCCACTTCCACTACGTACTCTCAATGGGAGCAGTATTTGCTATTATAGGCGGATTTGCCCACTGATTCCCCTTATTCTCGGGCTACACCCTAAATGACACCTGAGCAAAAATCCATTTTACAATCATATTCGTAGGGGTGAACATGACCTTCTTCCCTCAACACTTCCTGGGACTATCGGGCATACCCCGTCGATATTCCGACTACCCAGATGCATACACTACTTGAAACACCGTCTCATCTATAGGCTCATTCATCTCACTTACAGCAGTAATACTTATAATCTTCATAATCTGGGAAGCTTTTGCTTCTAAACGGGAGGTTGCAATAGTAGAGCTCACTACAACTAACATTGAGTGACTACACGGATGTCCTCCTCCATATCATACATTTGAGGAGCCCACATATGTCATCCAAAAAATGGCGTACCCTTTTCAACTCGGATTACAGGACGCAACCTCCCCTATTATAGAGGAGTTACTTCATTT [...]
+ATACCCTAATAATTGTATTCTTAATCAGCTCATTAGTTCTTTATATTATTACCTTAATATTAACCACCAAGCTAACTCATACAAGTACAATAGACGCACAAGAGGTAGAAACAGTCTGAACAATTCTACCAGCCATCATCCTAATCCTAATCGCTCTGCCCTCTCTACGGATTCTCTACATAATAGATGAAATTAATAACCCATCACTAACTGTAAAAACAATAGGCCACCAATGATACTGAAGCTACGAATACACTGACTACGAAGACCTAAACTTTGACTCTTACATAATTCCCACACAAGAATTAAAACCAGGGGAGCTTCGACTATTAGAAGTCGATAACCGAGTTGTTCTCCCAATAGAAATAACCGTCCGAATACTTATCTCTTCAGAAGACGTATTACACTCATGAGCCGTTCCATCACTAGGCTTAAAAACTGATGCCATCCCAGGACGATTAAATCAAACTACCCTAATAGCGATACGACCAG [...]
+TACGGCCAATGCTCTGAAATTTGCGGATCTAACCACAGCTTCATACCAATTGTTCTTGAAATAGTCCCACTGTCCTACTTCGAAACCTGATCTGCCTTAATGGTTATGACCCACCAAACTCATGCATACCACATAGTCAACCCAAGCCCATGACCACTAACAGGGGCCCTATCTGCCCTTCTTATAACATCGGGCCTTATTATATGATTTCATTACAACTCAATATCTCTACTTACTCTAGGACTTACAACTAATATGCTGACTATATACCAGTGGTGACGAGACGTAGTTCGAGAAGGCACATTTCAAGGACATCACACCTCTATTGTACAAAAGGGATTACGATATGGGATAATCCTATTCATCGTCTCAGAAGTTTTCTTTTTCGCTGGGTTTTTCTGAGCCTTTTATCACTCTAGCCTAGCCCCAACCCCCGAACTCGGAGGTTGTTGACCCCCTACCGGTATTACCCCCCTAAACCCGCTTGAAGTT [...]
+CAACACCTCTGTTCTCCTAGCCTCAGGAGTCTCAATCACCTGGGCCCACCATAGCCTAATAGAAGGTAATCGTAAACACATACTTCAAGCCCTATTTATTACCATTTCCCTAGGCGTATACTTTACACTACTACAAGCATCTGAGTATTACGAGACATCCTTCACAATCTCCGATGGAGTCTATGGGTCCACATTCTTCATAGCCACCGGATTCCACGGACTACACGTAATTATCGGCTCCACATTTCTTATTGTCTGCTTTATGCGACAACTGCACTACCATTTCACATCTAATCACCACTTCGGATTTGAAGCTGCCGCATGATACTGACACTTCGTCGACGTAGTCTGACTATTCCTATATGTTTCCATCTATTGATGAGGATCTTATATGACCAACATTCGAAAGACTCACCCACTAGCTAAAATCGTTAACGATTCATTCATTGACCTCCCCGCACCATCAAACATTTCTGCCTGATGAAACTTCGG [...]
+TAGGTGTCTGCCTCATTCTACAGATTATAACAGGCCTATTTCTAGCCATACACTATACATCCGATACAGCTACTGCTTTTTCATCAGTTACACACATTTGCCGAGACGTTAACTACGGCTGAATCATTCGCTACATACATGCAAATGGGGCATCTATATTCTTCATTTGTCTGTTCATGCACGTAGGACGAGGCCTATATTATGGATCCTACGTATTCATAGAAACATGGAACGTCGGAATTATCTTACTATTCGCAACCATAGCCACAGCATTTATAGGTTACGTCCTGCCATGAGGACAAATATCATTCTGAGGAGCGACTGTAATTACAAACCTCTTGTCCGCCATCCCCTACATCGGAACCAATCTAGTAGAATGAATCTGAGGAGGCTTCTCGGTAGACAAAGCAACTCTAACACGATTCTTCGCATTCCACTTTATCTTTCCATTTATTATCGCAGCGCTGGCAATGGTCCACCTCCTATTTCTTC [...]
+GGATCTAACAACCCTTCAGGAATCACATCCGACTCGGACAAAATCCCATTTCACCCCTACTACACAATTAAAGATATCCTAGGAATCTTACTCCTCCTTTCAGTCCTAATATCACTGGTCCTATTTTCACCAGACCTATTAGGAGACCCTGACAACTACACCCCTGCAAATCCTCTCAACACCCCTCCACATATCAAACCCGAGTGATATTTCCTATTTGCCTACGCTATTCTCCGGTCCATCCCTAATAAGCTAGGGGGAGTCCTCGCCCTAGTATTCTCCATCCTAATCTTAGCACTCATCCCTCACCTCCACACCTCAAAACAACGCGGAATAATATTCCGACCCCTCAGTCAATGCCTATTCTGACTCCTAACCGCAGACCTCCTCACCTTAACCTGAATCGGAGGACAGCCAGTAGAACACCCCTTTATCGTCATCGGCCAAATCGCCTCTATCCTATACTTTGCTATCTTATTGATTCTAATACCA [...]
+CATTATTGAAAATAATCTCCTAAAGTGAATGTTCTTTGTCAACATTATCTCCCTTATCGTCCCAATTCTTCTCGCCGTAGCCTTCCTTACTCTTGTTGAACGTAAAGTTCTAGGCTACATACAACTCCGAAAAGGGCCCAATATTGTAGGACCCTATGGCCTCCTTCAACCAATCGCCGATGCTGTAAAACTCTTTACAAAAGAACCCCTACGTCCCCTTACATCATCGATATCAATATTTATTCTAGCACCTATCCTAGCCCTATCACTGGCCCTAACCATATGAATCCCGCTCCCCATGCCCTACCCACTCATTAACATAAATTTAGGAGTGCTGTTTATATTAGCTATGTCTAGCCTCGCCGTATATTCTATTCTCTGATCAGGGTGGGCCTCAAACTCCAAATACGCCCTAATTGGGGCCCTGCGAGCCGTAGCTCAGACAATCTCATATGAGGTCACGCTAGCAATCATCCTCCTCTCCATTTTATT [...]
+GATCATTCACATTATCTACACTCATCATTACCCAAGAGCACATGTGACTAATCTTCCCCGCCTGACCTCTGGCCATAATATGGTTTATCTCTACTTTAGCGGAAACAAATCGAGCCCCCTTTGACTTGACTGAAGGGGAGTCAGAGCTGGTCTCAGGATTTAACGTAGAGTATGCAGCCGGACCCTTCGCCCTATTTTTCCTAGCAGAGTATGCAAATATTATCATGATAAACATCCTCACAACGATTTTATTCTTTGGCGCATTCCATAACCCGTTCCTACCAGAACTCTACTCAATCAACTTCACTATTAAGACCCTTTTACTAACCATCTCCTTCCTATGAATTCGAGCATCATACCCTCGATTCCGCTACGATCAACTAATACACCTCTTATGAAAAAATTTCCTGCCACTAACTTTGGCCCTATGTATATGACACGTTGCCCTACCTATCATTACCGCAAGCATCCCACCTCAAACAATAAAACCTC [...]
+ATTACAATTCTAACAACCGTTATGGCCGGAACTATGATCGTACTATTAAGCTCCCACTGATTGCTGATCTGGATCGGATTTGAAATAAATATGTTAGCCGTTATTCCTATTCTAATAAAAAAATTCAACCCACGGGCTATAGAAGCATCCACAAAATATTTCCTTACACAAGCAACAGCCTCAATGCTACTAATAATAGGAGTCACTATCAACCTTCTCTACTCCGGTCAATGAGCAATCTCAAAAATCTCGAACCCCGCAGCATCCACTATAATAACTATCGCCCTGACAATAAAATTGGGTCTATCCCCATTTCACTTCTGAGTTCCCGAAGTAACTCAGGGCATTTCACTCTTATCAGGCATAATCCTACTAACATGACAAAAAATTGCACCAATATCCGTTCTCTATCAAATTTCACCATCTATCAATACTAACCTCATAATACTAATAGCCCTTACATCTGTCCTAATTGGAGGATGAGGTGGACTT [...]
+TCAACTACGAAAAATCATAGCTTACTCCTCTATCGCGCACATAGGCTGAATAACAGCAATCATTATTTATAGCCCTACAATAATATTCCTAAACCTATCCCTATATATTTTTATGACCCTATCAACATTTATATTATTTATACTAAGCACATCCACCACAACCTTATCCCTCTCACACACATGAAATAAAGTCCCCTTAATCGCTTCCACCATTCTAACTCTAATACTATCCCTGGGAGGACTTCCACCACTATCCGGCTTCATCCCTAAATGAATAATCATCCAGGAACTAACAAAAAATGACATAATTATTATCCCAACACTTATAGCTATCACCGCACTACTCAACCTATACTTCTACATACGACTCACATACAGCACTGCACTCACCATATTCCCATCCGCAAACAACATAAAAATAAAATGACAGTTCGAGCACACAAAAAAGACAACCCTACTGCCCCCTTTGATTATCATTTCAACTATATTACT [...]
+CACCCATAATATCAATCTTGGACATAAACATTATACTTACTCTAGTAACCAATGTCACCCTGGCTTCCCTACTCGTAATAATCGCATTCTGACTCCCCCAACTAAATATTTATGCCGACAAGACGAGTCCTTACGAATGCGGCTTCGACCCCATAGGATCGGCGCGCCTGCCGTTTTCCATAAAATTTTTCCTAGTTGCAATTACGTTCCTGCTCTTCGATCTAGAAATTGCTCTCTTACTTCCGCTACCCTGGGCATCGCAAACCAACAAGCTAACAACCATACTTACAATAGCGCTCCTCCTAATCTCACTCCTGGCTGCGAGCCTAGCATACGAATGGACTGAAAAAGGTCTAGAATGAACTGAAATGTCCATAGTATATATTAACATCTTCTTAGCATTTATCCTATCATTAATGGGCATACTCGTTTACCGGTCCCACCTAATATCATCACTACTATGTCTGGAAGGCATAATACTATCACTATTTG [...]
+TCCGTGACTATCCTGAATAATCACCTCACACTGGCTAGCATAATACCAATCGTACTGCTGGTATTCGCCGCCTGCGAAGCAGCATTGGGACTGTCCCTACTAGTCATGGTATCTAACACTTATGGGACTGATTATGTGCAAAATCTGAATCTTCTACAATGCATTATTATTCCTACCGCTATACTTATCCCATTAACATGAATATCGAAGCCCAACATAATCTGAATCAATACCACAATATACAGCCTGCTTATTAGTCTAATTAGCCTATCTTACCTCAATCAACCGAACGATAACACCCTAAACTCATCCTTGCTGTTCTTCTCTGACTCCCTATCCGCGCCGCTACTGGCACTTACAACATGACTTCTACCACTAATATTGATAGCAAGCCAGTTCCACCTATCAAAAGAGCCACTCATCCGAAAAAAACTATATATTTCGATATTAACTTTGCTCCAACTACTCCTAATTATAACCTTCACCGCCACA [...]
+TCTCTTCTATATTCTATTTGAAGCTACCTTAATCCCCACTCTTATTATCATTACCCGGTGGGGTAATCAAACTGAACGACTAAACGCAGGGCTCTATTTTCTGTTCTACACCTTGACAGGATCTTTACCACTTCTTGTAGCACTTCTATATATCCAAAACAATATGGGCTCTCTAAATTTCCTCATAATCCAATACTGAATTCAGCCTCTACCAAGCTCCTGATCTAATGTTTTCCTATGGTTGGCGTGCATGATGGCTTTTATAGTAAAAATACCCCTGTACGGCCTCCACTTGTGACTACCAAAGGCACATGTAGAGGCCCCTATTGCCGGCTCCATAGTACTCGCAGCTGTACTACTAAAGCTAGGGGGATATGGCATAATACGAATTACAACTCTACTAAACCCCCTAACCAACCTGATGGCATACCCATTCATACTATTGTCACTATGGGGCATAATTATAACAAGTTCTATTTGTCTACGCCAGAC [...]
+AATCCCTAATCGCATACTCTTCTGTCAGTCACATAGCACTTGTTATTGTGGCAGTTCTGATCCAAACACCATGAAGTTACATAGGAGCAACAGCTCTAATAATCGCCCATGGTCTAACATCATCCATACTATTCTGCCTAGCCAACTCAAACTACGAACGAACCCACAGCCGTACCATAATTCTCGCGCGAGGCCTCCAAACCCTCCTCCCCTTAATAGCTGCTTGATGACTGCTAGCAAGTCTCACAAACCTAGCCCTCCCTCCAACAATTAATCTAATCGGGGAGCTGTTCGTAGTAATAGCTTCATTCTCATGATCCAACATTACGATTATCCTGATAGGAACTAATATCATCATTACCGCCCTTTACTCCCTCTATATACTAATCACCACACAGCGCGGCAAACATACTCACCATATCAAAAACATCAAGCCATCTTTCACACGGGAGAATGCCCTTATAACTCTCCACTTATTGCCCCTACTTCTCC [...]
+GACCCCAAAATTATCCTGGGACCCATCTACT?????ATAAAAGTAATAAATATATTCGCCTCCTGCATGATCACTGCCCTAATCCTACTCACCCTACCGATCATCATAACCTCTACTAAGTTCTACAAAGACAAACTGTACCCCTATTATGTAAAGACAGCAACCTCCTACGCATTTATAATTAGCATAATTCCCGCGATAATATTTATCTACTCCGGACAAGAAATAGTCATCTCAAACTGACACTGAATAACAATCCAGACCATAAAACTGTCCATAAGCTTCAAACTAGACTACTTCTCAATAATTTTCGTACCTGTAGCTTTATTCGTTACATGGTCTATCATAGAATTTTCCATATGATACATGCACTCAGACCCTTATATCAATCGATTCTTTAAATATCTACTCATATTCCTCATCACTATAATGATTTTAGTAACCGCAAACAATATATTTCAATTATTTATTGGCTGAGAAGGAGTAGGTATT [...]
+CCTGCTTATTGGATGATGATACGGTCGGACTGACGCAAACACAGCTGCCCTACAAGCTATTCTTTATAACCGAATTGGGGATGTAGGATTCATTATAGCCATAGCATGATTTCTACTATACCTAAATGCATGAGACCTTCAACAAATTTTTATATCAACCAACGATAATCTTAATCTCCCACTACTTGGCCTTCTACTAGCAGCCACTGGCAAATCCGCCCAATTCGGTCTACACCCATGACTCCCTTCGGCCATAGAAGGCCCAACCCCCGTATCAGCATTACTCCACTCCAGTACTATAGTTGTCGCAGGGGTGTTCCTATTAATCCGCTTCCATCCACTAATAGAACAGAACCTAACTATCCAAACTCTCACCTTATGCTTAGGAGCCGTTACTACACTATTCACCGCAATCTGTGCTCTTACACAAAATGATATCAAAAAAATTGTAGCATTCTCCACCTCAAGTCAGCTAGGACTCATGATCGTAAC [...]
+TTAACCAGCCTTATTTAGCCTTCCTGCATATCTGCACTCACGCATTTTTTAAAGCCATGTTGTTTATATGCTCCGGGTCAGTTATCCATAGCCTGAATGACGAGCAGGACATTCGAAAAATAGGTGGGCTATTCAAAGCCCTCCCCTTCACCACGACCTCCCTCATTATTGGAAGTCTCGCACTAACAGGTATACCATTCCTCACGGGCTTCTACTCCAAAGACCTAATCATCGAGACCGCCAATACGTCGAATACCAACGCCTGAGCCCTCTTAATTACCCTCGTTGCCACATCTATAACTGCCGCCTATAGCACTCGAATTCTATTCTTTGCACTCCTAGGTCAGCCCCGCTTTAACCCCATAATCTCTATCAACGAGAATAATCCTCACCTAATTAACTCTATTAAACGTCTGCTTCTCGGAAGTGTGTTTGCAGGATATATTATTTCCCACAGTATCACTCCTACTACCGTCCCACAAATGACTATGC [...]
+CTGAAAATAACTGCCCTCGCAGTAACCATCTTGGGTTTCATCCTGGCACTAGAACTAAACCTTACAATGCAAGGGCTCAAACTCAACCGCTCGTCTCATCACTTCAAATTTTCAAATCTCCTTGGCTATTACCCTACCATCATACACCGCTTGACACCCAAAATAAGTTTATTCATAAGTCAAAAATCAGCATCTATACTCCTAGACCATATCTGACTAGAAAGTGCTCTGCCAAAATCAATCTCGTTTTTCCAAATAAAATCTTCTACCTTAATTTCAAATCAAAAAGGCCTCATCAAACTCTATTTCCTATCGTTCATAATCACCATGGCCCTCAGCCTCCTAATC??????CTTAATTACCACGTG
+>Arctocephalus_australis
+ATGAACGAAAATCTATTCACCTCTTTCGCTTCCCCTACAATAATAGGCCTTCCCATTGTAACTCTAATTATCCTATTTCCAAGTATGTTATTCCCTTCACCAGGCCGACTGATTAACAACCGCTTCACCTCTATTCAACAGTGACTAATCCAATTAACATCAAAACAAATAATATTAATTCATAATCACAAAGGACAAACATGGACATTAATACTTATATCACTCATTATGTTTATTGGATCTACTAATTTACTGGGTCTACTACCACACTCATTCACCCCCACTACCCAACTGTCTATAAACCTAGGAATAGCCATCCCCCTATGAGCGGGAACGGTCGCCATAGGACTACGACACAAAACCAAAGCATCCTTGGCCCACTTCCTACCCCAGGGAACACCCTCCCCTCTTATCCCGATATTAGTAATTATTGAATCTATTAGCTTACTCATTCAACCCATAGCCTTAGCCGTACGACTGACAGCCAACATC [...]
+TCACCTATTAATTCACCTAATCGGTGGAGCCACCCTAGCCCTCACTAACATCAGTATAATTACGGCCCTTATCACTTTCATTATCCTCATTCTACTCACAATTCTTGAGTTCGCTGTAGCCTTGATCCAAGCCTACGTCTTCACTTTACTGGTAAGCCTATACTTACACGATAACACTTAAATGCCACAATTAGACACGTCGACATGATCCACTACAATTGTATCTATAATCCTAACACTATTCATCATTTTCCAATTAAAAATTTCCAAACACCACTTCCCGATAAGCCCAGAATTGAAACCATTATCGACATCAAAAACAAATACCCCCTGAGAAAAGAAATGAACGAAAATCTATTCACCTCTTTCGCTTCCCCTACAAATGTTCGTAAATCGATGATTATTCTCCACAAACCATAAAGATATTGGCACCCTTTATCTACTATTCGGTGCATGAGCTGGAATGGCTGGCACCGCCCTCAGCCTATTGAT [...]
+AGTTGGGCCAACCAGGCACTCTACTAGGAGATGACCAAATCTACAACGTAATTGTCACCGCCCATGCATTCGTGATAATCTTTTTCATGGTAATACCTATTATAATTGGGGGCTTTGGAAATTGATTAGTACCCCTAATAATTGGAGCCCCCGATATGGCATTTCCTCGAATAAACAACATAAGTTTCTGACTTCTACCCCCCTCCTTCCTACTACTACTAGCCTCTTCTCTAGTTGAAGCCGGCGCAGGTACCGGATGAACAGTTTACCCTCCCCTAGCAGGAAACCTAGCCCATGCAGGAGCTTCCGTAGACTTAACTATTTTCTCCCTTCACCTGGCAGGAGTATCATCTATTCTGGGAGCCATTAACTTTATTACTACTATTATCAACATGAAACCCCCTGCCATATCCCAATACCAAACCCCTTTATTCGTGTGATCCGTACTAATCACAGCGGTACTACTTCTGCTATCCCTGCCAGTCCTGGCAG [...]
+ACTATATTACTTACGGACCGAAATCTAAACACAACCTTTTTTGATCCAGCCGGAGGGGGTGACCCTATCCTATATCAACACCTATTCTGATTCTTCGGACACCCAGAAGTATATATTCTCATCCTACCAGGATTCGGGATAATCTCACACATCGTCACCTACTACTCAGGAAAAAAGGAACCCTTTGGTTATATAGGAATAGTCTGAGCAATAATATCCATCGGCTTCTTAGGCTTTATCGTATGAGCACATCATATATTCACCGTAGGAATAGATGTTGACACACGAGCATACTTCACCTCAGCCACTATAATTATCGCCATCCCTACAGGAGTAAAAGTATTTAGCTGACTAGCTACTCTGCATGGTGGTAATATCAAATGATCTCCTGCCATACTATGAGCCTTAGGATTTATTTTCCTATTCACAGTAGGAGGCCTCACAGGCATTGTGTTAGCAAATTCATCATTAGATATCGTCCTCCACGATACA [...]
+GGTGGCACACTTTCATTACGTATTATCAATAGGAGCGGTGTTTGCTATCATGGGCGGATTCGTTCATTGATTCCCCTTATTTTCAGGATTTATGCTCGATAGTACCTGGGCGAAAATCCACTTCACAATCATATTTGTTGGGGTCAATATGACATTCTTCCCACAACATTTTTTAGGCCTATCCGGAATACCACGACGATACTCTGACTACCCAGACGCCTACACAACATGAAATACAATCTCCTCTATAGGCTCGTTCATTTCACTTACAGCAGTGATACTTATGGTCTTCATAATCTGAGAAGCTTTTGCGTCCAAACGAGAGGTAGAGACGATTGAACTAACATCGACTAATATGGAGTGACTTCACGGATGTCCTCCTCCCTATCACACATTCGAAGAACCTACCTATATTGTATCGAAAATGGCGTACCCATTTCAAATAGGCCTTCAAGACGCAACCTCCCCTATCATGGAGGAACTAACACACTT [...]
+ACACACTAATAATCGTATTCCTAATTAGTTCACTAGTACTTTACATTATCTCAACTATACTTACCACGAAACTAACACACACAAGCACAATGGACGCCCAAGAAGTAGAAACGGTATGAACAATTTTACCAGCTATTATTCTAATTATAATTGCCTTACCCTCACTTCGAATTCTTTATATTATAGACGAAATTAACAACCCTTCTCTAACTGTAAAAACTATAGGGCACCAATGGTATTGAACCTACGAATATACCGATTATGAAGACCTAAGCTTTGATTCCTACATAATCCCTACGCAAGAACTAAAGCCTGGCGAGCTACGACTATTAGAGGTGGATAACCGAGTCGTACTTCCCATAGAAATAACAATCCGTATACTAATTTCATCAGAAGATGTACTTCACTCATGAGCTGTACCATCTCTGGGACTAAAAACCGACGCCATCCCGGGACGACTAAACCAAACCACTCTAATAGCTATACGACCAG [...]
+TACGGTCAATGCTCAGAAATCTGTGGCTCCAACCATAGCTTTATACCTATCGTTATTGAATCCATCCCATTATCTTGCTTCGAGAAATGGTCCGCCTCAATACTTATGACACACCAAACCCATACATACCATATAGTTAACCCTAGCCCTTGACCACTAACAGGGGCTCTGTCAGCCCTCCTTATAACCTCAGGCCTAATCATATGATTCCATTTTAACTCAACCCACCTCCTATTACTAGGTCTTATAACCAACACACTAACTATATATCAATGATGACGAGACATCGTCCGGGAAAGCACATTCCAAGGCCACCACACCCCAACTGTCCAAAAGGGCCTACGATATGGCATAATTCTCTTCATTGTATCCGAAGTATTCTTTTTCGCAGGATTTTTCTGAGCCTTCTACCATTCCAGCCTAGCACCCACCCTTGAACTAGGAGGATGCTGACCCCCCGCAGGAATCACACCTCTAAACCCACTAGAAGTT [...]
+TAACACCTCAGTACTATTGGCATCGGGCGTATCAATCACCTGAGCCCACCACAGCTTGATAGAAGGAAATCGTAAACACATACTTCAAGCCCTATTCATCACTATTCTCCTAGGCCTCTATTTTACACTTCTACAAGCCTCAGAGTACTACGAGACCCCTTTTACAATCTCCGACGGAGTTTATGGCTCCACTTTCTTCATAGCCACAGGATTCCACGGACTGCACGTGATTATCGGCTCAACCTTCCTAACCGTATGCTTCCTACGACAATTAAAATTTCATTTCACATCCAGCCATCACTTCGGATTTGAAGCCGCTGCCTGATACTGACATTTTGTAGACGTCGTATGACTATTCCTGTATGTATCCATTTATTGATGAGGATCAT??ATGACCAACATCCGAAAAATACATCCGCTGGCCAAAATTATCAACAACTCACTCATCGACCTACCCGCACCATCTAACATCTCAGCATGATGAAACTTTGG [...]
+TCGCGGTATGCTTAGCCTTACAAATCCTAACAGGCCTTTTCTTAGCCATACACTATACCTCAGACACCACCACGGCCTTTTCATCAGTCACCCACATTTGCCGAGACGTTAACTACGGCTGAATCATTCGGTATATGCACGCAAATGGAGCCTCCATATTCTTCATCTGTCTCTACATACACGTAGGACGAGGACTATACTACGGATCCTACACGCTAATAGAAACATGAAACATTGGCATCATCCTCCTATTTACAATCATAGCCACAGCATTCATAGGCTATGTACTTCCGTGAGGACAAATATCATTCTGAGGGGCAACCGTCATTACCAACCTCCTATCAGCAGTCCCCTACATTGGAACCAACCTAGTAGAATGAATCTGAGGGGGATTTTCAGTTGATAAAGCAACCCTAACACGATTCTTCGCCTTTCACTTCATTCTCCCCTTCGTAGCATCAGCACTAGTAATAGTACATCTGCTATTCCTAC [...]
+GGATCCAATAACCCATCAGGAGTCTCCTCTGACTCAGACAAAATCCCATTCCACCCATATTATACAATTAAAGATATCCTGGGGGCCCTCCTACTAATCTTGATTCTAATATTACTAGTAATATTTTCACCAGATCTGCTGGGAGACCCAGACAACTACATCCCAGCCAACCCCCTCAGCACTCCACCACATATTAAACCTGAATGATATTTTCTATTCGCTTACGCCATTTTACGATCTATCCCCAACAAACTAGGAGGAGTCCTAGCCTTACTCCTATCAATCTTAATCCTAGCTATTATCCCACTACTTCATACGTCAAAACAGCGAGGAATAATATTCCGACCCATCAGCCAATTTCTCTTCTGACTTTTAGTAGCAGATTTACTCACACTAACATGAATCGGAGGACAACCAGTCGAACACCCCTTCATCGCTATCGGCCAGCTAGCCTCAATCCTGTACTTCACAATCCTCTTAATTCTCATACCC [...]
+CATTATCGAAAATTACATCCTAAAATGAATGATCATAATTAATATTCTCTCACTAATTATCCCAATCCTCCTAGCCGTAGCCTTCCTGACACTGGTAGAGCGGAAAGTACTAGGCTACATGCAACTCCGAAAAGGCCCCAACATCGTAGGACCCTACGGACTCCTACAACCAATCGCGGACGCCGTAAAATTATTCACCAAAGAACCCCTACGACCACTCACCTCCTCCGCATCCATATTTATTACAGCCCCCATCCTAGCCTTAACCCTGGCCCTAACTTTATGAATCCCACTACCCATACCATATCCTCTCATCAATATAAACCTAGGAGTCCTATTTATACTAGCAATGTCAAGTCTAGCTGTCTACTCAATCCTATGATCTGGATGAGCATCAAATTCAAAATACGCACTAATTGGAGCCCTACGAGCCGTGGCCCAGACCATTTCATATGAAGTAACCCTAGCCATTATTCTCCTATCAGTACTTCT [...]
+GGTCCTTCACTCTATCCACACTAATCATTACCCAAGAACACCTATGACTAATCTTCCCAACATGACCCCTAGCCATAATATGATTTATCTCCACCCTAGCGGAGACCAATCGTGCCCCATTCGACTTAACAGAGGGAGAATCAGAACTAGTTTCGGGATTTAACGTAGAATACGCAGCAGGCCCATTCGCCCTATTTTTCCTAGCGGAATATGCCAATATCATCATAATAAATATCCTCACAACTACTCTATTCCTCGGGGCATTTCACAGTCCATACATACCCGAATTATACACCATCAACTTCACCCTGAAAACATTAATACTGACAATCCTATTCTTATGAATTCGAGCATCATATCCACGATTCCGCTACGACCAGTTAATGCACCTCCTATGAAAAAATTTCCTGCCCCTTACACTAGCCCTATGCATATGACACATAGCCCTACCCGTAATTACAGCTAGCATTCCCCCTCAAACGATAAAACCCC [...]
+ATCATAATTATAACAACCGTCGTATTAGGAACCATAATTGTCTTAACAAGTTCTCATTGACTAATGATCTGAATTGGGTTCGAAATAAACATGCTAGCAATTATTCCAATTCTGATAAAAAACCTTAGCCCCCGAGCCACAGAAGCCTCCACAAAATACTTTCTAATCCAAGCCACCGCATCCATACTCCTAATACTAGGCATTATTATTAACCTAACAACCTCAGGACAATGAGCAATCTTAAAGCTCCCGAGCCCAACGGCATCAAACCTCCTAACTATCGCTCTAGCAATAAAACTTGGAATAGCCCCATTTCACTTCTGAGTGCCTGAAGTAACACAAGGAACCCCACTATCATCAGGCATGATTTTACTCACATGACAAAAAATTGCACCCCTGTCCGTTCTTTACCAAATTACGCCGTCAACCAACCCAAACCTACTAATCACCATAGCAATTGCATCAATACTAGTGGGAGGATGAGGAGGACTA [...]
+CCAACTTCGAAAAATCCTAGCCTATTCATCAATTGCTCATATAGGATGAATCACCATTATCGTAATATATAATCCTACCCTAATGCTCCTAAACCTAATAATCTACATCACCATAACACTTGGAACATTTATACTATTTATATACAACTCATCTACAACAACACTGTCACTATCCCACACATGAAACAAATTACCCTTCATAACATCCCTAATCCTAGTACTAATGCTATCACTCGGAGGACTTCCCCCATTATCGGGCTTCGTACCCAAATGACTAATTATTCAAGAACTAACAAAAAATGATATAATTATTCTACCAACATTCATAGCTATCACAGCACTACTAAACCTATATTTCTACATACGATTATCTTACACTACGGCACTAACACTATTTCCCTCAACAAATAATATAAAAATAAAATGACAATTCGAAAACACAAAAAAGATAACCTTACTACCCCCATTAATCATTATCTCAACGATACTACT [...]
+CACCAATAATATCTATCCTAGACATAAACATAATTCTAGCCTTACTCACCAATACAATCCTAGCCTCCTTACTTGTATTAATCGCATTCTGACTCCCCCAGCTAAACATCTACTCGGAAAAAGCCAGCCCCTATGAATGTGGATTCGACCCTATAGGATCAGCACGCCTACCCTTCTCCATAAAATTTTTCCTAGTAGCCATTACGTTCCTACTATTCGACCTAGAGATCGCACTACTGCTACCCCTCCCGTGAGCATCTCACGCAAACAACTTAATAACCACCCTTACTATGGCACTCGTATTAATCTCCTTACTAGCCGCAAGTTTAGCTTACGAGTGAACCGAAAAAGGACTCGAATGAACAGAAATGTCCATAGTATACTTTAATATCTTTATAGCCTTCACCGTATCTTTCGTAGGACTACTCATGTATCGATCCCACCTCATATCCTCCCTACTTTGCCTAGAAGGTATAATATTATCACTATTCG [...]
+TCAATAACAATCCTAAACAACCATTTCACACTAGCCAGCATAGCTCCCATCATCCTACTCGTATTCGCAGCTTGTGAAGCGGCCCTAGGACTATCCCTCCTAGTAATAGTATCTAATACATACGGAACTGACTACGTACAAAACCTGAACCTCTTGCAATGCATCATCATCCCCACCATCATACTAATACCTGTAGCATGAATATCAAAACCTCATATAATCTGAATCAATTCGACAACCTACAGCCTACTAATTAGTCTCACCAGTCTACCACTCCTAAGTCAACTTAACGACAACAGCCTAAACTCATCATTATTGTTCTTCACGGACTCCTTATCAGCCCCTCTATTAACACTTACCACGTGACTCCTACCCCTGATACTCATAGCTAGTCAATCCCACCTATCAAAAGAACCACTGACCCGAAAAAAACTTTATATTACAATACTAATCCTCCTACAATTATTTCTAATCATAACATTTGCCGCTACA [...]
+TATATTTTATATCTTATTCGAAGCGACTCTAGTGCCCACGCTAATCATTATTACCCGATGAGGAAACCAAACAGAACGCCTAAACGCAGGACTATACTTCCTATTTTATACCCTAGTAGGATCACTACCATTACTAGTAGCGTTACTATACATACAAAACAACATAGGCACACTAAACTTCTTAGTAGCCCAATACTGAACCCAAACCCTACCAAACTCCTGATCCAATATTCTCCTGTGATTAGCGTGCATGATGGCATTCATAGTAAAAATACCCCTCTATGGACTCCACCTATGACTTCCTAAAGCGCATGTAGAGGCCCCTATCGCCGGATCCATAGTACTTGCCGCCGTACTTCTAAAACTGGGAGGTTACGGCATAATACGAATCACCATCCTGCTTAATCCCCTGACAAGCTTTATAGCGTACCCCTTCATAATATTGTCAATATGAGGAATAATTATAACAAGCTCCATCTGCTTACGCCAAAC [...]
+AATCACTAATTGCATACTCTTCCGTAAGCCATATGGCCCTAGTAATTGTAGCTATCCTTATCCAAACACCATTAAGCTATATAGGCGCAACCGCCCTAATAATCGCCCACGGCCTTACATCATCTATACTATTCTGCCTAGCTAACTCTAACTATGAACGCACTCACAGCCGAATCATAATCCTTGCACGCGGCCTACAAACCCTACTACCACTAATAGCGGCATGATGACTATTAGCGAGCCTAACCAATCTAGCACTACCCCCTACCATCAATCTAATCGGAGAATTACTCGTAGTGATGGCCTCATTCTCATGATCTAATGCTACCATTATTCTTATAGGAGTAAACATCATTATTACCGCCTTATACTCCCTATATATACTTATTATAACACAACGCGGAAAACACACCCACCACATCAAAAATATTAAACCCTCATTTACACGAGAGAACACCCTAATAATACTCCATCTTGTACCACTACTACTGC [...]
+AACCCTAAAATAATTCTAGGACCCCTTTACT?????ATAAAAGTAATTAATTTATTCGCCCCATTTACTATTATAATACTATTTATACTCACGATACCAATTATCATGACCAGCACTCCAATCTACGAAAGCAAACTCTACCCACAGTACGTGAAAACTACCATCTCTTATGCCTTCATAACCAGCATAATCCCCACAATAATATTCATTTCCTCAGGACAAGAAATAATCATCTCAAACTGACACTGAATGACTATTCAAACTATAAAACTATCATTAAGCTTTAAACTGGATTATTTCTCGATAATCTTCATACCCGTAGCTCTATTTGTCACATGATCCATCATAGAATTTTCAATCTGATATATATCCTCAGATCCTTATATCAATCGATTCTTCAAGTATCTATTAATATTCCTTATCACCATAATAATTTTAGTCACTGCGAATAACCTATTCCAATTATTCATCGGCTGAGAAGGAGTAGGCATT [...]
+CCTGCTCATCGGATGATGATATGGACGGTCAGATGCAAATACAGCCGCCCTTCAAGCAATCCTTTACAACCGCATCGGAGATGTAGGCTTCATCATAGCCATAGCATGATTCTTAACTAATCTAAACACATGAGACCTCCAACAAATCTTCATAATTCATCATAACGACCTAAACATACCACTCATAGGTCTCCTACTAGCGGCAACTGGCAAATCAGCCCAGTTTGGCCTACATCCATGACTACCCTCAGCCATAGAAGGGCCCACACCAGTATCAGCCCTACTACACTCAAGCACTATGGTCGTAGCTGGAGTATTCCTACTAATCCGATTCCACCCTTTAATAGAACATAACACAATAATACAGACAACTACCCTATGTTTAGGAGCCATCACCACACTTTTCACAGCGATATGCGCTCTCACCCAAAACGATATCAAAAAAATCATCGCATTTTCGACTTCGAGTCAACTAGGATTAATAATCGTCAC [...]
+TTGGCCAACCATATCTAGCATTTCTACACATCTGCACCCACGCGTTCTTTAAAGCCATGCTATTCATATGCTCCGGATCCATCATCCACAACCTAAACGACGAACAGGATATTCGAAAAATGGGAGGCCTGTTCAAACCAATACCATTTACCACTACCTCACTAATCATTGGCAGCCTAGCACTTACAGGCATGCCATTTCTCACAGGATTTTACTCCAAAGACTTAATTATCGAAACCGCCAACACGTCGAACACCAACGCCTGAGCCCTACTTCTGACCCTAATAGCCACATCCATGACAGCCGCCTACAGTACCCGAATAATATTTTCCACACTTCTAGGACAGCCCCGATTCAACTCTATAATTTCAGTAAACGAAAATAATCCACTATTAATTAACCCCATTAAACGTCTACTACTCGGAAGCATCTTCGCAGGATACCTAATAACCCTCAACATTCCACCCACAATAATCCCACAACTAACTATAC [...]
+CTAAAATTCACAGCCCTCACCATAACACTATTAGGCTTCACACTGGCCCTAGAACTCAGCACAACCTCACTAAATCTCAAATTCAAATACGCGTCAAACCTGTCCAAATTTTCGAACCTCTTGGGGTATTTCCCCACCATTATCCACCGTTTAGTGCCAACAATAAACCTAACAGCAGGCCAAAAACTAGCCTCCACATTAATGGATATAATCTGACTAGAATATCTACTACCAAAATCCATTTCCCACCTAAACATGAAGTCATCGATCACCATTTCCAACCAAAAAGGTCTAATTAAACTGTATTTCTTATCCTTCATAATTACCCTGACCCTAGCCCTAATTCTAACAACAACTAATTTCCACGAG
+>Arctocephalus_forsteri
+ATGAACGAAAATCTATTTACCTCTTTCGCTTCCCCTACAATAATAGGCCTTCCCATCGTAACTCTAATTATCCTATTTCCAAGTATGTTATTCCCTTCACCAGGCCGACTGATTAACAACCGCTTCACCTCTATTCAACAGTGACTAATCCAATTAACATCAAAACAAATAATATTAATCCATAATCACAAAGGACAAACATGGACATTAATACTTATATCACTCATTATGTTTATTGGATCTACCAATCTACTGGGTCTATTACCACACTCATTCACCCCCACTACCCAACTGTCTATAAACCTAGGAATAGCCATCCCCCTGTGAGCGGGAACGGTCGCCATGGGACTACGACACAAAACCAAAGCATCCTTGGCCCACTTCCTACCCCAAGGAACACCCTCCCCTCTTATCCCGATATTAGTAATTATTGAGTCTATTAGCTTACTTATTCAACCCATAGCCTTAGCCGTACGACTAACAGCCAACATC [...]
+TCACTTATTAATCCACCTAATCGGTGGGGCCACCCTAGCCCTCACTAACATCAGTATAATTACGGCCCTTATCACTTTCATTATCCTCATCCTGCTCACAATTCTTGAGTTCGCTGTAGCCTTAATCCAAGCCTACGTCTTCACTTTACTGGTAAGCCTATACTTACATGATAACACTTAAATGCCACAACTAGACACGTCGACATGATCTACTACAATTGTATCTATAATCCTGACACTATTCATCATTTTCCAATTAAAAATTTCAAAACACCACTTCCCGATAAGCCCAGAATTGAAACCACTATCGACATCAAAAACAAATACCCCCTGAGAAAAGAAATGAACGAAAATCTATTTACCTCTTTCGCTTCCCCTACAAATGTTCGTAAATCGATGATTATTCTCCACAAACCATAAAGATATTGGCACCCTCTATTTACTATTCGGTGCATGAGCTGGAATGGCTGGCACCGCCCTTAGCCTATTGAT [...]
+AGTTAGGCCAACCAGGCACTCTACTAGGAGATGACCAAATCTACAACGTAATTGTCACCGCCCACGCATTCGTAATAATCTTTTTTATGGTAATACCTATTATAATTGGGGGCTTTGGAAATTGATTAGTACCCCTAATAATTGGAGCCCCCGACATGGCATTTCCTCGAATAAACAACATAAGTTTCTGACTTCTACCCCCCTCCTTTCTACTACTACTAGCCTCTTCTCTAGTTGAAGCCGGCGCAGGTACCGGATGAACAGTTTACCCTCCTCTAGCAGGAAATCTAGCCCATGCAGGAGCTTCCGTAGACTTAACTATTTTCTCCCTTCACCTGGCAGGAGTATCATCCATTCTGGGAGCCATCAACTTTATTACTACTATTATCAACATGAAACCCCCTGCTATATCCCAATACCAAACCCCTTTATTCGTGTGATCCGTACTAATCACAGCGGTACTACTTCTGCTATCCCTACCAGTCCTGGCAG [...]
+ACTATATTACTCACGGACCGAAATCTAAACACAACCTTCTTTGATCCAGCCGGAGGGGGTGACCCTATCCTATATCAACACCTATTCTGATTCTTCGGACACCCAGAAGTGTATATTCTCATCCTACCAGGATTCGGGATAATCTCACACATCGTCACCTATTACTCAGGAAAAAAGGAACCCTTTGGTTATATGGGAATAGTCTGAGCAATAATATCAATCGGCTTCTTAGGCTTTATCGTATGAGCACACCATATATTCACCGTAGGAATAGATGTTGACACACGAGCATACTTCACCTCAGCCACTATAATTATCGCCATCCCTACTGGAGTAAAAGTATTTAGCTGACTAGCTACTCTGCATGGTGGTAACATCAAATGATCTCCTGCCATACTATGAGCCTTAGGATTTATCTTCCTATTCACAGTAGGAGGCCTCACAGGCATTGTGTTAGCAAACTCATCATTAGATATCGTCCTCCACGATACA [...]
+GGTGGCACACTTTCATTACGTATTATCAATAGGAGCAGTGTTTGCTATTATGGGCGGATTCGTTCATTGATTCCCCTTATTTTCAGGATTCATGCTCGATAGTACCTGGGCGAAAATCCACTTCACAATCATATTTGTTGGGGTCAATATGACATTCTTCCCACAACATTTTTTAGGCCTATCCGGAATACCACGACGATACTCTGACTACCCAGACGCCTACACAACATGAAATACAATCTCCTCTATAGGCTCGTTCATCTCACTTACGGCAGTGATACTTATGGTCTTCATAATCTGAGAAGCCTTTGCGTCCAAACGAGAGGTAGAGACGATTGAACTGACATCGACTAATATGGAGTGACTTCACGGATGTCCTCCTCCCTATCATACATTCGAAGAACCTACCTATATTGTATCGAAAATGGCGTACCCATTTCAAATAGGCCTTCAAGACGCAACCTCCCCTATCATGGAAGAATTAACACACTT [...]
+ACACACTAATAATTGTATTCCTAATCAGTTCACTAGTACTTTATATTATCTCAACTATACTTACCACGAAACTAACACACACAAGCACAATGGACGCCCAAGAAGTAGAAACGGTATGAACGATTTTACCAGCTATTATTCTAATTATAATTGCCTTACCCTCACTTCGAATTCTTTACATTATAGACGAAATCAACAACCCTTCTCTAACTGTAAAAACTATAGGACACCAATGATATTGAACCTACGAATATACTGATTATGAAGACCTAAGCTTTGATTCCTACATAATCCCTACGCAAGAACTAAAGCCTGGCGAGCTGCGACTATTAGAGGTGGATAACCGAGTCGTACTTCCCATAGAAATAACAATCCGTATACTAATTTCATCAGAAGATGTACTTCACTCATGAGCTGTACCATCTCTGGGACTAAAAACCGACGCCATCCCGGGACGATTAAACCAAACCACTCTAATAGCTATACGACCAG [...]
+TACGGTCAATGCTCAGAAATCTGTGGCTCCAACCATAGCTTTATACCTATCGTTATTGAATCCATCCCATTATCTTGCTTCGAGAAATGGTCCGCCTCAATACTTATGACACACCAAACCCATACATACCATATAGTCAACCCTAGCCCTTGACCATTAACAGGGGCTCTGTCAGCCCTCCTTATAACCTCAGGCCTAATCATATGATTCCACTTTAACTCAACCCACCTCCTATTACTAGGTCTTATAACCAACACACTAACTATATATCAATGATGACGAGACATCGTCCGGGAGAGCACATTCCAAGGCCACCACACCCCAACTGTCCAAAAAGGCCTACGATATGGCATAATTCTTTTCATTGTATCCGAAGTATTCTTCTTCGCAGGATTTTTCTGAGCCTTCTACCATTCCAGCCTAGCACCCACCCCCGAACTAGGAGGATGCTGACCCCCCACAGGAATCACACCTCTAAACCCACTAGAAGTT [...]
+TAACACCTCAGTACTATTGGCATCAGGCGTATCAATCACCTGAGCCCACCACAGCTTAATAGAAGGAAATCGTAAACACATACTTCAAGCCCTATTTATCACTATTCTCCTAGGCCTCTACTTTACACTTCTACAAGCCTCAGAGTACTACGAGACCCCTTTTACAATCTCCGACGGAGTTTATGGCTCCACTTTCTTCATAGCCACAGGATTCCACGGACTGCACGTGATTATCGGCTCAACCTTCCTAACCGTATGCTTCCTACGACAATTAAAATTCCATTTCACATCCAGCCATCACTTCGGATTTGAAGCCGCTGCCTGATACTGACATTTTGTAGACGTCGTATGACTATTCCTGTATGTATCCATTTATTGATGAGGATCATGTATGACCAACATCCGAAAAATACATCCACTGGCCAAAATTATCAACAACTCACTCATCGACCTACCCGCACCATCTAACATTTCAGCATGATGAAACTTTGG [...]
+TCGCGGTATGCTTAGCCTTACAAATCCTAACAGGCCTATTCTTAGCCATACACTATACCTCAGACACCACCACAGCCTTCTCATCAGTCACCCACATTTGCCGAGACGTTAACTACGGCTGAATCATTCGGTACATGCACGCAAATGGAGCCTCCATATTCTTCATCTGTCTCTACATACACGTAGGACGAGGACTATACTACGGATCCTACACGCTTATAGAAACATGAAACATTGGCATCATCCTCCTATTTACAATTATAGCCACAGCATTCATAGGCTATGTACTTCCATGAGGACAAATATCATTCTGAGGAGCAACCGTCATTACCAACCTCCTATCAGCAGTCCCCTACGTTGGAACCAACCTAGTAGAATGAATCTGAGGAGGATTTTCAGTCGATAAAGCAACCCTAACCCGATTCTTCGCCTTTCACTTTATTCTCCCCTTCGTGGCATCAGCACTAGTAATAGTACATCTGCTATTCCTAC [...]
+GGATCCAATAACCCATCAGGAGTCTCCTCTGACTCGGACAAGATCCCATTCCACCCATATTATACAATTAAAGATATCCTAGGAGCCCTCTTACTAATCTTGATTCTAATATTACTAGTAATATTTTCACCAGATCTACTGGGAGACCCAGACAACTACATCCCAGCCAACCCCCTCAGCACTCCACCACATATTAAACCTGAATGATATTTTCTATTCGCTTATGCCATTCTACGATCTATCCCCAACAAACTGGGAGGAGTCCTAGCCTTACTCCTATCAATCTTAATCCTAGCTATTATCCCACTACTCCACACATCAAAACAGCGAGGAATAATATTCCGACCCATCAGCCAATTTCTCTTCTGACTTTTAGTAGCAGATTTACTCACACTAACGTGAATTGGAGGACAACCGGTCGAACACCCCTTCATCGCTATCGGCCAGCTAGCCTCAATCCTGTACTTCACAATCCTCTTAATTCTCATACCC [...]
+CATTATCGAAAATCACATCCTAAAATGAATGATCATAATTAATATTCTCTCACTAATTATCCCAATCCTCCTAGCCGTAGCCTTCCTGACACTGGTAGAGCGGAAAGTACTAGGCTACATGCAACTCCGAAAAGGCCCCAACATCGTAGGACCCTACGGACTCCTACAACCAATCGCGGACGCCGTAAAATTATTCACCAAAGAACCCCTACGACCACTTACCTCCTCCGCATCCATATTTATTACAGCCCCCATCCTGGCCTTAACCCTGGCCCTAACTATATGAATCCCACTACCCATACCATATCCTCTCATCAATATAAATCTAGGAGTCCTATTTATACTAGCAATGTCAAGTCTAGCTGTCTACTCAATCCTATGATCTGGATGAGCATCAAATTCAAAATACGCACTAATTGGAGCCCTACGAGCCGTAGCCCAAACCATTTCATACGAAGTAACTCTAGCCATCATTCTCCTATCAGTACTTCT [...]
+GGTCCTTCACTCTATCCACACTAATCACTACCCAAGAACATCTATGACTAATCTTCCCAACATGACCCCTAGCCATAATATGATTTATCTCTACCCTAGCGGAGACTAATCGTGCCCCATTCGACTTAACAGAGGGAGAATCAGAACTAGTTTCGGGATTCAACGTAGAATACGCAGCAGGCCCATTCGCCCTATTTTTCCTAGCAGAATACGCCAATATCATCATAATAAACATCCTCACAACTACTCTATTCCTCGGGGCATTCCACAGTCCATACATACCCGAATTATACACCATTAATTTCACCCTGAAAACATTAATACTGACAATCCTATTCTTATGAATTCGAGCATCATATCCCCGATTCCGCTACGACCAGTTAATGCACCTCCTATGAAAAAATTTCCTGCCCCTCACACTGGCCCTATGCATGTGACACATAGCCCTACCCGTAATTACAGCTAGCATCCCCCCTCAAACGATAAAACCCC [...]
+ATCATAATTATAACAACCGTCGTATTAGGAACCATAATTGTCTTAACAAGTTCTCATTGACTAATAATCTGAATTGGGTTCGAAATAAACATGCTAGCAATTATTCCAATTCTGATAAAAAACTTTAGCCCCCGAGCCACAGAAGCCTCCACAAAGTACTTTCTAATCCAAGCCACCGCATCCATACTCCTAATACTAGGCATTATTATTAACCTAACAACCTCAGGACAATGAGCAATCTTAAAGCTCCCGAGCCCAACAGCATCAAACCTCCTAACTATCGCTCTAGCAATAAAACTTGGAATAGCCCCATTTCACTTCTGAGTGCCTGAAGTAACACAAGGAACCCCACTATCATCAGGCATGATTTTACTCACATGACAAAAAATTGCACCCCTATCCGTTCTTTACCAAATTACGCCGTCAACCAACCCAAACCTATTAATCACCATAGCAATTGCATCAATACTAGTGGGAGGATGAGGAGGACTA [...]
+CCAACTTCGAAAAATCCTAGCCTATTCATCAATCGCTCATATAGGATGAATCACCATTATCGTAATATATAATCCTACCCTAATGCTTCTAAACCTAATAATCTACATCACCATAACACTTGGAACATTTATACTATTTATATACAACTCATCTACAACAACACTGTCACTATCCCACACATGAAACAAATTACCCTTCATAACATCCCTAATCCTAGTACTAATGCTATCACTCGGAGGACTTCCCCCATTATCGGGCTTCGTACCCAAATGACTAATTATTCAAGAACTAACAAAAAATGATATAATTATCTTACCAACATTTATGACTATCACAGCACTACTAAACCTGTATTTCTACATACGATTATCTTACACTACGGCACTAACATTATTTCCCTCAACAAATAATATAAAAATAAAATGACAATTCGAAAACACAAAAAAGATAACCTTACTATCCCCATTAATCATTATCTCAACAATACTACT [...]
+CACCAATAATATCTATCCTAGACATAAACATAATTCTAGCCTTACTCACCAATACAATCCTAGCCTCCTTACTTGTACTAATCGCATTCTGACTCCCCCAACTAAACATCTACTCGGAAAAAGCCAGCCCCTATGAATGTGGATTCGACCCTATAGGATCAGCACGCCTACCCTTCTCCATAAAATTTTTCCTAGTAGCTATTACATTCCTACTATTCGACCTAGAAATCGCACTACTACTACCCCTCCCGTGAGCATCTCACGCAAACAACTTAATAACCACCCTTACCATGGCACTCGTATTAATCTCTCTGCTAGCCGCAAGTTTAGCTTACGAGTGAACCGAAAAAGGACTTGAATGAACAGAAATGTCCATAGTATACTTTAACATCTTTATAGCCTTCACCGTATCTTTCGTAGGACTACTCATGTATCGATCCCACCTCATATCCTCCCTACTTTGCCTAGAAGGTATAATATTATCACTATTCG [...]
+TCAATAACAATCTTAAACAACCATTTCACACTAGCCAGCATAGCTCCCATCATCCTACTCGTATTTGCAGCTTGTGAAGCGGCCCTAGGACTATCTCTCCTAGTAATAGTATCTAATACATACGGAACTGACTACGTACAAAACCTGAACCTCTTGCAATGCATCATCATCCCCACCATCATACTAATACCTGTAGCATGAATATCAAAACCTCATATAATCTGAATCAATACGACAACCTACAGCCTTCTAATTAGTCTCACCAGCCTACCACTCCTAAGTCAACTTAACGACAACAGCCTAAACTCATCATTATTGTTCTTCACGGACTCCTTATCAGCCCCTCTCTTAACACTTACTACGTGACTCCTACCCCTGATACTCATAGCTAGTCAACTCCACCTATCAAAAGAACCACTAGCCCGAAAAAAACTTTATATTACAATACTAATCCTCCTACAATTGTTGCTAATCATAACATTTGCCGCTACA [...]
+CATATTTTATATCTTATTCGAAGCGACCCTAGTGCCCACGCTAATCATTATTACTCGATGAGGAAACCAAACAGAACGCCTAAATGCAGGACTATACTTTCTATTTTATACCCTAGTAGGATCACTACCATTACTGGTAGCGTTACTATATATACAAAACAACATAGGCACACTAAACTTCTTAGTAGCCCAATACTGAACCCAAACCCTACCAAACTCCTGATCCAATATCCTCCTATGATTAGCGTGCATGATGGCATTCATAGTAAAAATACCCCTCTATGGACTCCACCTATGACTTCCTAAAGCGCATGTAGAGGCCCCTATCGCCGGATCCATAGTACTTGCCGCCGTACTTCTAAAACTGGGAGGTTACGGCATAATACGAATCACCATCCTGCTTAATCCCCTGACAAGCTTTATAGCGTACCCCTTCATAATATTGTCAATATGAGGAATAATTATAACAAGCTCTATCTGCTTACGCCAAAC [...]
+AATCACTAATCGCATACTCTTCCGTAAGCCATATGGCCCTAGTAATTGTAGCTATCCTTATCCAAACACCGTTAAGCTATATAGGCGCAACCGCCCTAATAATTGCCCACGGCCTTACATCATCTATACTATTCTGCTTAGCTAATTCTAACTATGAACGCACTCACAGCCGAATCATGATCCTTGCACGCGGCCTACAAACCCTACTACCACTAATAGCGGCATGATGACTATTAGCGAGCCTAACCAACCTAGCACTACCCCCTACCATCAATCTAATCGGGGAGTTACTCGTAGTGATAGCCTCATTCTCATGATCTAACGCTACCATTATTCTTATAGGAGTAAACATCATTATTACCGCCTTATACTCCCTATACATACTTATTACAACACAACGTGGAAAACACACCCACCACATCAAAAACATTAAACCCTCATTTACACGAGAGAACACCCTAATAATACTCCACCTTGTACCACTACTACTGC [...]
+AACCCCAAAATAATTCTAGGACCCCTTTACTGTAAAATAAAAGTAATTAATTTATTCGCCCCATTTACTATTATAACACTATTTATACTCACGATACCAATTATCTTGACCAGCACTCCAATCTACGAAAGCAAACTCTACCCACAGTACGTGAAAACTACCATCTCTTATGCCTTCATAACCAGCATAATCCCCACAATAATATTCATTTCCTCAGGACAAGAAATAATCATCTCAAACTGACACTGAATGACTATTCAAACTATAAAATTATCATTAAGCTTCAAACTGGATTATTTCTCGATAATCTTCATACCCGTAGCCCTATTCGTCACATGATCCATCATAGAATTTTCAATCTGATATATATCCTCAGATCCTTACATCAATCGATTCTTTAAGTATCTATTAATATTCCTTATCACCATAATAATTTTAGTCACTGCGAATAACCTATTCCAATTATTCATCGGCTGAGAAGGAGTAGGCATT [...]
+CCTGCTCATCGGGTGATGACACGGACGGTCAGATGCAAATACAGCCGCCCTTCAAGCAATCCTTTACAACCGCATCGGAGATGTGGGCTTCATCATAGCCATAGCATGATTCTTAACTAATCTAAACACATGAGACCTCCAACAAATTTTCATAATTCACCATAACGACCTAAACATACCGCTCATAGGTCTCCTACTGGCGGCAACTGGCAAATCAGCCCAATTTGGCCTACATCCATGACTACCCTCAGCCATAGAAGGGCCCACACCGGTATCAGCCCTACTACACTCAAGCACCATGGTCGTAGCTGGAGTATTTCTACTGATCCGATTCCACCCTTTAATAGAACATAACACAGTAATACAGACAACTACCCTATGCTTAGGAGCCATCACCACACTTTTCACAGCGATATGCGCTCTCACCCAAAACGATATCAAAAAAATCATCGCATTCTCAACTTCGAGTCAACTAGGATTAATAATCGTCAC [...]
+TTGGCCAACCATATCTAGCATTCCTACACATCTGCACCCACGCGTTCTTTAAAGCCATGCTATTTATATGCTCCGGATCCATCATCCACAACCTAAACGACGAACAAGATATTCGAAAAATAGGAGGCCTGTTCAAACCAATACCATTTACCACTACCTCACTAATCATTGGCAGCCTAGCACTTACAGGCATGCCATTTCTCACAGGATTTTACTCCAAAGACTTAATTATCGAAACCGCCAACACATCGAACACCAACGCCTGAGCCCTACTTCTAACCCTAATGGCCACATCCATAACAGCTGCCTACAGCACCCGAATAATATTTTCCACACTTCTAGGACAGCCCCGATTCAACCCCACAATTTCAGTAAATGAAAATAATCCACTACTAATCAACCCTATTAAACGTCTACTACTCGGAAGCATCTTCGCAGGATACCTAATAACCCTCAACATTCCACCCACAATGATCCCACAACTAACTATAC [...]
+CTAAAACTCACAGCCCTCACCGTAACACTATTAGGTTTCACACTGGCCCTAGAACTCAGCACAACCTCACTAAATCTCAAATTCAAATACGCGTCAAACCTGTCCAAATTCTCGAACCTCCTAGGGTATTTCCCCACCATTATCCACCGTTTAGTGCCAACAATAAACCTAGCAGCAGGCCAAAAACTAGCCTCTACATTAATGGATATAATCTGACTAGAATATCTACTACCAAAATCCATTTCCCACCTAAACATGAAGTCATCAATCACCATTTCCAACCAAAAAGGTCTAATTAAACTATATTTTCTATCCTTCATAATTACCCTGACCCTAGCCCTAATTCTAACAACAACTAGTTTCCACGAG
+>Arctocephalus_pusillus
+ATGAACGAAAATCTATTCACCTCTTTCACTTCCCCTACAATAATAGGCCTCCCCATCGTGACCCTAGTTATCCTATTTCCAAGTATATTATTTCCTTCACCAGGCCGACTAATCAATAACCGCTTCACCTCTATTCAACAGTGATTGATCCAATTGACATCAAAACAAATAATAATAATTCATAATCACAAAGGACAGACATGGACATTAATACTTACATCGCTCATTATGTTTATTGCATCTACTAATCTACTGGGTCTACTACCGCACTCATTTACTCCCACTACCCAACTGTCTATAAACCTAGGAATAGCCATCCCCTTATGAGCAGGAACAGTTGCTATAGGGTTACGACACAAAACCAAAGCATCCTTAGCTCACTTCCTACCCCAAGGAACACCCTCCCCCCTCATCCCAATATTAGTAATCATCGAATCCATTAGCCTACTCATTCAACCCATAGCCCTAGCCGTACGACTAACAGCCAACATC [...]
+TCACCTATTAATTCACCTAATCGGTGGAGCCACTCTAGCCCTCACTAATATCAGCATAATTACGGCCCTTATCACTTTCATTATTCTCATCCTACTCACGATCCGCGAATTTGCTGTAGCCTTGATCCAAGCCTACGTATTCACTTTACTAGTAAGCCTATACTTACACGATAACACCTAAATGCCACAACTAGACACATCGACATGGTTCACTACAATTGCATCCATAATCCTAACACTATTTATCGTATTTCAATTAAAAATTTCCAAACACCACTTTCCAATAAGCCCAGAATTGAAATCATTATCGGCATCAAAAACAAACACCCCCTGAGAAAAAAAATGAACGAAAATCTATTCACCTCTTTCACTTCCCCTACAAATGTTCGTAAATCGATGACTATTCTCTACAAACCATAAAGATATTGGCACTCTTTACCTACTATTCGGTGCATGAGCTGGAATGGCTGGCACCGCCCTCAGCTTATTGAT [...]
+AATTAGGCCAACCAGGCACTCTACTAGGAGATGACCAAATTTATAACGTAATTGTCACCGCCCACGCATTCGTAATAATCTTTTTCATGGTGATACCCATTATAATTGGAGGCTTTGGAAATTGATTAGTACCCCTAATAATTGGAGCTCCCGACATGGCATTTCCCCGAATAAACAACATAAGTTTCTGACTTCTACCCCCCTCCTTTCTACTATTACTAGCCTCTTCTCTAGTTGAAGCCGGCGCGGGTACCGGATGAACGGTTTACCCTCCCCTAGCGGGAAACCTGGCCCATGCAGGAGCTTCCGTAGACTTGACTATTTTCTCCCTTCATCTAGCAGGGGTATCATCTATTCTAGGAGCCATTAACTTTATTACCACCATTATCAATATGAAGCCCCCTGCCATATCCCAATACCAAACTCCTTTATTCGTGTGATCCGTACTAATTACAGCGGTACTACTTCTACTATCCCTACCAGTCCTAGCAG [...]
+ACTATATTACTTACGGACCGAAATCTAAATACAACCTTTTTTGACCCGGCTGGAGGAGGTGACCCCATCCTATACCAACATCTATTCTGATTCTTCGGACACCCAGAAGTATATATTCTAATTCTTCCAGGATTCGGGATAATCTCACACATCGTCACCTATTACTCGGGAAAAAAGGAACCCTTTGGCTATATAGGAATAGTCTGAGCAATAATATCCATCGGCTTCTTAGGCTTTATCGTATGAGCACATCATATATTTACCGTAGGAATAGATGTTGACACACGAGCATACTTCACCTCGGCCACCATAATTATCGCCATCCCTACAGGAGTAAAAGTATTTAGCTGACTAGCTACCCTGCATGGTGGCAATATCAAATGATCTCCCGCCATACTATGAGCCTTAGGATTCATTTTCCTATTTACAGTAGGAGGCCTCACGGGCATTGTGTTAGCAAATTCATCGTTGGATATTGTCCTCCACGACACG [...]
+AGTAGCACACTTCCACTACGTGTTATCAATAGGAGCAGTGTTTGCTATCATGGGTGGATTCGTCCACTGATTCCCCTTGTTTTCAGGATTCATGCTCGATAGTACCTGAGCGAAAATCCACTTCACAATCATATTTGTTGGAGTCAATATGACATTCTTCCCACAACATTTTCTAGGTCTATCCGGAATACCACGACGATACTCTGACTACCCAGACGCCTACACAACATGAAATACAATCTCCTCTATAGGCTCATTTATCTCGCTTACGGCGGTAATACTAATGGTCTTCATAATCTGAGAAGCTTTTGCATCCAAACGAGAAGTAGAGACGGTTGAGTTAACATTGACTAATATGGAATGACTTCACGGATGTCCTCCTCCCTACCACACATTCGAAGAGCCTACTTACATTGTATCAAAAATGGCATACCCTTTCCAAATAGGTCTTCAAGACGCAACCTCCCCTATTATAGAAGAACTAACACACTT [...]
+ACACATTAATAATTGTATTCCTAATTAGTTCACTAGTACTTTACATTATCTCAACTATACTTACCACGAAACTAACACACACAAGCACAATGGACGCCCAAGAAGTAGAAACAGTATGAACAATTTTACCAGCTATTATTTTAATTATAATTGCTTTACCCTCCCTTCGAATTCTTTATATCATAGACGAAATTAATAACCCTTCTCTAACTGTAAAAACTATAGGACACCAATGATATTGAACCTATGAATATACTGATTACGAAGACCTAAGCTTTGATTCCTACATAATTCCTACGCAAGAACTAAAGCCCGGCGAACTGCGACTATTAGAAGTGGATAACCGAGTCGTACTACCTATAGAAATAACAATCCGTATACTAATTTCATCAGAAGATGTACTACACTCATGAGCCGTGCCGTCTCTAGGACTAAAAACCGACGCCATCCCAGGACGATTAAACCAGACCACCCTAATAGCTATACGACCAG [...]
+TACGGTCAATGCTCAGAAATCTGTGGTTCCAACCATAGCTTTATACCTATCGTTATTGAATCCGTCCCATTATCTTGCTTCGAGAAATGGTCCGCCTCAATACTTATGACACACCAAACCCACGCATACCATATAGTCAACCCTAGCCCTTGGCCGTTAACAGGGGCCCTATCAGCTCTCCTTATAACCTCGGGCCTAATCATATGATTCCACTTTAACTCAACCTACCTTCTATCACTAGGCCTTATAACTAACACACTAACTATATATCAATGATGACGAGACGTCGTCCGAGAAAGCACATTCCAAGGACATCACACCCCAACTGTCCAAAAGGGCCTACGGTATGGCATAATTCTTTTCATCGTGTCCGAAGTATTCTTTTTCGCAGGATTTTTCTGAGCCTTCTATCATTCCAGCCTAGCACCCACCCCCGAACTAGGAGGGTGCTGACCCCCCACAGGAATCATACCTCTAAACCCACTGGAAGTT [...]
+TAACACCTCAGTACTATTAGCATCGGGTGTATCGATCACCTGAGCCCACCACAGCTTAATAGAAGGAAATCGTAAACACATGCTTCAAGCCCTATTCATCACCATCCTCCTAGGTCTCTATTTTACACTTCTACAAGCCTCAGAGTATTACGAAACCCCCTTTACAATCTCCGACGGGGTTTATGGCTCTACTTTCTTTATAGCTACAGGATTCCACGGATTACACGTGATTATCGGCTCAACCTTCCTAGCCGTATGCTTCCTGCGACAATTAAAATTCCACTTCACATCCAACCATCACTTTGGATTTGAAGCCGCCGCCTGATACTGACATTTTGTAGACGTCGTATGACTATTCCTATACGTATCTATTTATTGATGAGGATCATGTATGACCAACATTCGAAAAGTACATCCGCTGGCCAAAATTATCAACAACTCACTCATCGACCTACCCGCACCATCCAACATCTCAGCATGATGAAACTTTGG [...]
+TCGCAGTATGCTTAGCCTTACAAATCCTAACAGGCCTTTTCCTAGCCATACACTACACCTCAGACACCACCACAGCCTTTTCATCAGTCACCCACATTTGCCGAGACGTGAACTACGGCTGAATCATCCGATATATGCATGCAAATGGAGCCTCCATATTCTTCATCTGTCTCTACATACACGTAGGACGAGGACTATACTATGGATCATACACACTGACAGAAACATGAAATATTGGTATTATCCTCCTGTTTACAATCATAGCCACAGCATTCATAGGCTATGTACTTCCATGAGGACAAATATCATTCTGAGGAGCAACAGTCATTACTAACCTCCTATCAGCAGTCCCTTACATCGGAACTAACTTAGTAGAATGAATTTGAGGAGGATTCTCAGTTGATAAAGCAACCCTAACACGATTCTTCGCCTTCCACTTTATTCTCCCCTTCGTAGCATCAGCACTAGTAATAGTGCACCTACTATTCCTAC [...]
+GGATCCAATAACCCATCAGGAGTCTCCTCTGACTCAGACAAAATTCCATTCCACCCATACTACACAATTAAAGATATCCTAGGAACTCTCCTACTAATCCTAATTCTAATACTACTGGTAATATTTTCACCAGACCTGCTAGGAGATCCAGACAACTACATCCCAGCCAACCCACTCAGCACTCCACCACATATCAAACCTGAATGATATTTTCTATTCGCCTATGCCATTTTACGATCCATCCCCAACAAATTAGGAGGAGTTCTAGCCCTACTCCTATCAATCTTAATCCTAGCTATCATCCCACTACTTCACACATCAAAACAACGAGGAATAATATTTCGGCCCATCAGCCAGTGCCTCTTCTGACTCCTAGTAGCAGACCTACTCACACTAACATGAATTGGGGGACAACCGGTCGAACACCCCTTCATCACTATCGGCCAACTAGCCTCAGTTCTGTACTTCACAATCCTCCTAATCCTTATACCC [...]
+CATTATCGAAAATAACATCCTTAAATGAATGGCCATAATTAACATTCTCTCACTAATCATCCCAATCCTCCTGGCCGTAGCCTTCCTGACACTAGTAGAGCGAAAAGTGCTAGGCTACATGCAACTCCGGAAAGGCCCCAATATTGTAGGACCCTACGGACTCCTACAACCAATCGCGGACGCTGTGAAATTATTCACCAAAGAACCCCTGCGACCACTCACTTCCTCTGCATCTATGTTTATTACAGCTCCTATCCTGGCCTTAACCCTGGCCCTAACTATATGAATCCCACTACCCATACCATACCCTCTCATCAACATAAACCTAGGAATCCTATTTATACTGGCAATATCAAGCCTAGCTGTTTACTCAATCCTATGATCTGGATGAGCATCAAATTCAAAATACGCACTAATTGGAGCCTTACGAGCCGTAGCCCAAACCATTTCATACGAAGTAACCCTAGCCATTATTCTCCTATCGGTACTTCT [...]
+GATCATTCACTCTATCCACACTGATCACCACCCAAGAACACCTATGACTAATCTTCCCAACATGACCCCTAGCCATGATATGATTTATCTCCACCCTAGCAGAAACTAATCGTGCCCCATTTGACCTAACAGAGGGAGAATCAGAACTAGTTTCAGGATTCAACGTAGAGTATGCAGCAGGCCCATTTGCCCTATTTTTCCTAGCAGAGTACGCCAACATCATCATAATAAATATCCTCACAACTACCCTATTCCTTGGGGCATTCCACAGCCCATATATACCCGAATTATATACCATCAACTTCACTATAAAAACATTAATACTAACAATTCTATTCCTATGAATCCGGGCATCATACCCCCGATTTCGCTACGACCAGTTAATGCACCTCCTATGAAAAAATTTCCTGCCCCTCACACTAGCCCTATGCATATGACACATAGCTCTACCCGTAATCACAGCTAGCATCCCCCCTCAAACGATAAAACCCC [...]
+ATCATAATTATAACAACCGTCGTATCAGGAACCATAATTGTATTAACAAGTTCTCACTGACTAATAATCTGAATTGGGTTCGAAATAAATATACTGGCAATCATTCCAATTCTGATAAAAAATCCTAGCCCCCGAGCTACAGAAGCCTCCACAAAATATTTTCTAGTCCAAGCCACCGCATCCATACTCCTAATACTAGGCATTATCATCAACCTAACAACCTCAGGACAATGAACAATTCTAAAGCTCCCAAACTCAATAGCATCAAACCTCCTAACCATCGCTCTAGCAATAAAACTTGGAATAGCCCCCTTTCACTTCTGAGTGCCTGAAGTAACACAAGGAACCCCACTATCATCAGGTATGATTCTACTCACATGACAAAAAATCGCACCCCTGTCCGTTCTTTACCAAATTACACCATCAATCAACCCAAACCTAATAACCATTATAGCAATTGCATCAATACTGGTAGGAGGATGAGGAGGACTA [...]
+CCAACTCCGAAAAATTTTAGCCTATTCATCAATTGCTCACATAGGATGAATTACCATTATCATAACATATAATTCTACCCTAACACTCCTAAACCTGACAATCTACATCACCATAACACTCGGAACGTTCATACTATTTATGTATAATTCATCTACTACAACACTATCACTGTCCCACACATGAAACAAACTACCCCTCATAACATCCCTGATCCTAATACTTATACTATCACTTGGAGGACTTCCTCCACTATCGGGCTTTGTACCCAAATGACTAATTATCCAAGAACTAACAAAAAACGATATAATTATTCTACCAACATTCATAGCTATCACAGCACTACTAAACCTATACTTCTACATACGATTATCCTACACCACAGCACTAACACTATTTCCCTCGACAAATAATATAAAAATAAAATGACAATTCGAAAACACAAAAAAAATAGTCTTATTAGCCCCACTAATCATTATCTCAACAATACTACT [...]
+CACCGATAATATCTATCCTAGACATAAACATAATTCTAGCCCTACTCACCAACACAATTCTAGCCTCTTTGCTTGTACTAATTGCATTCTGACTCCCCCAGCTAAACATCTACTCAGAAAAAGCCAGCCCTTATGAATGCGGATTTGACCCTATAGGATCAGCACGCCTACCATTCTCCATAAAATTTTTCCTAGTAGCCATTACATTCCTACTATTTGATCTAGAAATCGCACTACTATTACCCCTCCCATGAGCATCTCACGCAAACAACCTAACAACTACTCTCACTATAGCACTTATATTAATCTCCCTACTAGCCGCAAGTTTAGCTTACGAATGAACCGAAAAAGGACTCGAATGAACAGAAATGTCCATGGTATACTTTAACATCTTTATAGCCTTCATCGTATCTTTCATAGGACTACTTATGTATCGATCCCACCTCATATCTTCTCTACTTTGCCTAGAAGGTATAATACTATCGCTATTTG [...]
+TCGATGACAATCCTAAGCAACCACTTTACACTGGCCAGCATAGCTCCCATCATCCTGCTCGTATTCGCAGCTTGTGAGGCGGCCCTAGGACTATCCCTCCTAGTAATAGTATCTAACACGTATGGGACTGACTACGTACAAAACCTGAACCTCTTACAATGCATCATCATCCCCACCATCATATTAATACCCATAACATGAATATCAAAACCCCATATAATTTGAATCAATACAACAACCTACAGCCTACTAATCAGCCTCACCAGTCTACCACTCCTAAATCAACTTAACGACAACAGCCTAAACTCATCATTATTGTTCTTCACGGACTCCTTGTCGGCCCCCCTCCTAACACTTACTACGTGACTCCTGCCCCTGATATTAATAGCTAGTCAATTCCACCTATCAAAAGAACCACTGACCCGAAAAAAACTTTATATTACAATACTAATCCTCCTTCAACTATTTCTAATCATAACATTCGCCGCCACA [...]
+CATATTTTATATCCTATTCGAAACAACTCTAGTGCCTACACTAATTATTATTACCCGATGAGGAAACCAAACAGAACGCCTAAACGCAGGACTATACTTCCTATTTTACACCCTAGTAGGATCATTACCCTTACTAGTAGCGTTACTACATTTACAAAATAGTATAGGCACACTAAACTTCTTAATAGCCCAATACTTAGCCCAAACCCTACCGAACTCCTGATCCAATGTTCTCCTATGATTAGCGTGCATAATGGCATTCATAGTAAAAATACCTCTCTATGGACTCCACCTGTGACTTCCCAAAGCACATGTAGAGGCCCCCATTGCCGGATCCATAGTACTTGCCGCCGTACTTCTGAAACTAGGAGGTTATGGCATAATACGAATCACCATCCTGCTTAATCCCCTGACAAGCTTTATGGCGTACCCCTTCATAATACTATCAATATGAGGAATAATTATGACAAGCTCCATCTGCTTACGCCAGAC [...]
+AATCACTAATCGCATACTCTTCTGTAAGCCATATGGCTCTAGTAATTGTAGCCATCCTCGTCCAAACACCATTAAGCTATATAGGCGCAACCGCCCTAATAATCGCCCACGGCCTTACATCGTCCATACTATTCTGCTTAGCTAACTCTAATTATGAACGCACCCACAGCCGAATTATAATCCTTGCACGCGGCCTACAAACTCTGCTACCACTAATAGCGGCATGATGACTATTAGCGAGCCTAACCAATCTAGCACTACCCCCTACCATTAATCTAATCGGAGAATTATTCGTAGTAATAGCCACGTTCTCATGATCTAACGCTACCATCATTCTTATAGGGGTGAACATCATTATTACCGCCTTATACTCCCTATATATACTTATTACGACACAACGAGGAAAACACACCTACCACATCAAAAACATTAAACCCTCATTTACACGAGAAAATACCCTAATAATACTCCACCTTATACCACTACTACTGC [...]
+AACCCTAAAATAATTCTAGGACCCCTTTACTGTAAAATAAAAGTAATTAATTCATTCTCCTCATTTATTATCACAACACTATTTATACTCACGATACCAATTATCCTAGCCAACACTCCAACCTACGAAAATAAACTCTACCCACAGTACGTGAAAACCACCATCTCCTACGCTTTCATAATCAGCATAATCCCCACAATAATATTCATTTCCTCAGGACAAGAAATAATCATCTCAAACTGACGCTGAATGACCATTCAAACTATAAAACTATCACTAAGCTTCAAACTAGATTACTTCTCGATAATTTTCATGCCCGTAGCCCTATTCGTTACATGATCCATCATAGAATTTTCAATCTGATATATATCCTCAGATCCTTACATCAACCGATTCTTCAAATATCTATTAATATTCCTCATCACCATAATAATTTTAGTCACCGCGAACAACCTATTTCAATTGTTCATCGGCTGAGAAGGAGTAGGCATT [...]
+CCTACTCATCGGATGATGGTACGGGCGATCAGATGCAAACACAGCCGCCCTTCAAGCAATCCTCTACAACCGCATCGGAGATGTAGGCCTCCTCATAGCCATAGCATGATTCCTAACCAACCTAAACACATGGGACCTCCAACAAATCTTCATAATTCACCATAATAACCTAAACATACCACTTATAGGTCTCCTACTAGCGGCAACTGGCAAATCAGCCCAATTCGGCCTACATCCATGACTGCCCTCAGCCATAGAAGGACCTACGCCAGTATCAGCCCTATTACACTCAAGCACTATAGTCGTAGCAGGAGTATTTCTACTGATCCGATTCCATCCTCTAATAGAACATAATACAATAATACAGACAATCACCCTATGCTTGGGAGCCATCACCACACTATTCACAGCGATATGCGCCCTCACCCAAAATGATATCAAAAAAATCATCGCATTCTCAACTTCAAGCCAACTAGGATTAATAATCGTCAC [...]
+TTGGGCAACCACATCTAGCATTCCTACACATCTGCACCCACGCATTCTTTAAAGCCATGCTATTCATATGCTCCGGATCCATCATCCATAACCTAAACGATGAACAGGACATTCGAAAAATAGGAGGCCTATTCAAATCAATACCGTTTACTACTACCTCACTAATTATCGGCAGTCTAGCACTCACAGGCATGCCATTTCTCACAGGATTTTACTCTAAAGACCTAATTATCGAAACCGCCAACACATCGAACACCAACGCCTGAGCCCTGCTTCTAACCCTTATAGCCACATCCATAACAGCTGCCTACAGCACCCGAATAATATTCTTCACACTTTTAGGACAGCCCCGATTCAACCCCACAATTATAGTAAACGAAAATGATCCACTATTAATTAACCCCATTAAACGTCTACTACTCGGAAGCATCTTCGCAGGATACCTAATAACCCTCAGCATTCCACCCACAATGGTCCCACAACTAACTATAC [...]
+CTAAAACTCACAGCTCTCGCCGTAACACTACTAGGCTTCATACTAGCCCTAGAACTTAGTACAACCTCACTAAATCTCAAATTCAAACACGCGTCAAACTTGTCCAAATTCTCGAACCTCCTAGGATATTTCCCCACCATTATCCACCGTTTAGTACCAGCAGTGAACCTAACAGCAAGCCAAAAACTAGCCTCTATATTAATAGATATAATCTGACTAGAATATCTACTACCTAAATCTATCTCCCACCTAAACATGAAATCATCAATCACCATTTCTAACCAAAAAGGCCTAATTAAACTATACTTCCTATCCTTCATAATTACCCTGGCCCTAGCCCTAATCCTAACAACAGCTAATTTCCACGAG
+>Arctocephalus_townsendi
+ATGAACGAAAATCTATTTACCTCTTTTGCTTCCCCTACAATAATAGGCCTCCCCGTCGTAACCCTAATTATCCTATTTCCAAGTATACTATTTCCTTCACCAGGCCGACTGATCAACAACCGCCTCACCTCTATTCAACAGTGACTGATCCAACTAACATCAAAACAAATAATATCAATCCATAATCGCAAAGGACAAACATGGACATTAATACTTATATCGCTCATTATGTTTATTGGATCTACTAACCTACTAGGTCTGCTACCGCACTCATTCACTCCAACTACCCAACTGTCTATAAACCTAGGAATAGCCATCCCCCTATGAGCGGGAACAGTTGCTATAGGGTTACGACATAAAACTAAAGCATCCTTGGCCCATTTTCTACCCCAGGGAACACCCTCCCCTCTCGTCCCAATATTAGTAATCATCGAATCTATTAGCTTACTCATTCAACCCATAGCCTTAGCCGTACGACTGACAGCCAACATT [...]
+CCACTTATTAATTCACCTAATCGGCGGAGCCACTCTGGCCCTCACCAACATCAGTATAATTACGGCCCTTGTCACTTTCATTATCCTTATCCTACTCACAATTCTTGAGTTTGCTGTAGCCTTGATCCAAGCCTACGTCTTCACTTTACTAGTAAGCCTATACTTACACGATAACACTTAAATGCCACAACTAGATACATCGACATGGTTCACTACAATTGTATCCATAATCCTAACACTGTTTATCATTTTTCAATTAAAAATTTCCAAACACCACTTCCCGATAAGCCCAGAATTGAAACCATTATCGACATCAAAAACAAATATCCCCTGAGAAGAGAAATGAACGAAAATCTATTTACCTCTTTTGCTTCCCCTACAAATGTTCGTAAATCGATGATTATTCTCTACAAACCATAAAGATATTGGCACCCTATATCTACTATTCGGTGCATGAGCTGGAATGGCTGGCACCGCCCTCAGCCTATTGAT [...]
+AGTTAGGCCAACCAGGCACTCTACTAGGAGATGACCAAATCTATAACGTAATTGTCACCGCCCACGCATTCGTGATAATCTTTTTCATAGTAATACCTATTATAATCGGGGGCTTTGGAAATTGACTAGTACCCCTAATAATTGGAGCTCCCGACATGGCATTTCCCCGAATAAACAACATAAGTTTCTGACTTCTACCCCCCTCCTTTCTACTACTACTAGCCTCTTCCCTAGTTGAAGCTGGCGCAGGTACCGGATGAACAGTTTACCCTCCCCTAGCAGGAAACCTAGCCCATGCAGGGGCCTCCGTAGACTTGACTATCTTCTCCCTCCACCTAGCGGGAGTATCATCTATTCTGGGAGCCATTAACTTTATTACTACTATTATCAACATGAAACCCCCTGCTATATCCCAATACCAGACTCCTTTATTCGTGTGATCCGTACTAATCACAGCGGTACTACTTCTGCTATCCCTACCCGTCCTGGCAG [...]
+ACTATATTACTTACGGACCGAAATCTAAATACAACCTTTTTTGATCCAGCCGGAGGGGGTGACCCTATCCTATATCAACACCTATTCTGATTCTTCGGACACCCAGAAGTATATATTCTCATCCTACCAGGATTTGGGATAATCTCACACATCGTCACCTACTACTCAGGAAAAAAGGAACCCTTTGGCTATATAGGAATAGTCTGAGCAATAATATCCATCGGCTTCTTAGGCTTTATCGTATGAGCACATCATATATTCACCGTAGGAATAGATGTTGACACACGAGCATACTTCACCTCAGCCACTATAATTATCGCCATCCCTACAGGGGTAAAAGTATTTAGCTGACTAGCTACTCTGCATGGTGGTAATATCAAATGATCTCCTGCCATACTATGAGCCTTAGGGTTTATTTTCCTATTCACGGTAGGAGGCCTCACAGGCATTGTGTTAGCAAATTCATCATTAGATATCGTCCTCCATGATACA [...]
+AGTAGCACACTTCCATTACGTGTTATCAATAGGAGCAGTGTTTGCTATCATGGGCGGATTCGTCCATTGATTCCCTTTATTTTCAGGATTCACACTCGACAATACCTGAGCGAAAATCCACTTCACGATCATATTTGTCGGAGTCAATATGACATTCTTCCCACAACATTTTCTAGGCCTATCCGGAATACCACGACGATATTCTGACTATCCAGACGCCTACACAACATGAAATACAATCTCCTCTATAGGCTCATTCATTTCACTCACGGCAGTAATACTTATAGTCTTCATAATCTGAGAGGCTTTTGCGTCCAAACGAGAGGTAGAGACGATTGAGCTAACATCGACTAATATGGAGTGACTTCACGGATGTCCTCCTCCTTATCACACATTCGAAGAACCTACCTATATTGTATCGAAAATGGCGTACCCCTTTCAAATAGGCCTTCAAGACGCAACCTCCCCTATCATGGAGGAACTAACACACTT [...]
+ACACACTAATAATTGTATTCCTAATTAGTTCACTAGTACTTTATATTATCTCAACTATACTTACTACGAAACTAACACACACAAGCACAATAGACGCCCAAGAGGTAGAGACAGTATGAACGATTTTACCAGCTATTATTTTAATCATAATCGCCTTACCCTCACTTCGAATCCTTTATATTATAGACGAAATTAATAACCCTTCTCTAACTGTAAAAACTATAGGACACCAATGGTATTGGACCTATGAATACACCGATTATGAGGACCTAAACTTTGATTCCTACATAATCCCCACGCAAGAACTAAAGCCTGGCGAGCTGCGACTATTAGAGGTGGATAACCGAGTCGTGCTACCCATAGAAATAACAATCCGTATACTAATTTCATCAGAAGATGTACTTCACTCATGAGCCGTACCGTCTCTAGGACTAAAAACTGACGCCATCCCGGGACGATTAAACCAAACCACTTTAATAGCCATACGACCAG [...]
+TACGGTCAATGCTCAGAAATCTGTGGCTCCAACCATAGCTTTATACCTATCGTTATTGAATCCGTCCCATTATCTTACTTCGAGAAATGATCCGCCTCAATACTTATGACACACCAAACCCACGCATACCATATAGTCAACCCTAGCCCTTGACCGTTAACAGGGGCCCTGTCAGCCCTCCTTATAACCTCAGGCCTAATCATGTGGTTCCACTTTAACTCAACCCACCTTCTATTACTAGGTCTCATAACCAACACACTGACTATATATCAATGATGACGAGACATCGTCCGGGAAAGCACATTCCAAGGCCACCACACCCCAACTGTCCAAAAGGGCCTACGATATGGCATAATCCTCTTCATCGTATCCGAAGTATTCTTTTTCGCAGGATTTTTCTGAGCCTTCTACCATTCCAGCCTAGCACCCACCCCAGAACTAGGAGGATGCTGACCCCCCATAGGAATCATACCTCTAAACCCACTAGAAGTT [...]
+TAACACCTCAGTGCTGTTGGCATCGGGCGTATCAATTACCTGAGCCCACCACAGCTTAATAGAAGGAGATCGTAAACACATACTTCAAGCCCTACTTATCACTATTCTCCTAGGCCTTTATTTTACACTTCTACAAGCCTCAGAGTACTACGAGACCCCTTTTACAATCTCCGACGGAGTTTACGGCTCCACTTTCTTCATGGCTACAGGATTCCACGGATTGCACGTGATTATCGGCTCAACCTTTCTAACCGTATGCTTCCTGCGACAATTAAAATTCCATTTCACATCCAGCCATCACTTCGGATTTGAAGCCGCCGCCTGATACTGACATTTTGTAGACGTCGTATGACTATTCCTATATGTATCTATTTATTGATGAGGATCATGTATGACCAACATTCGAAAAACACATCCGCTGGCCAAAATCATCAACAACTCACTCATCGACCTACCCGCACCATCTAATATCTCAACATGATGAAACTTTGG [...]
+TCGCGGCATGCTTAGCCTTACAAATCCTAACAGGCCTTTTCTTAGCCATACACTATACCTCAGACACCACTACAGCCTTTTCATCAGTCACCCACATTTGCCGAGACGTGAACTACGGCTGAATTATTCGGTACATACACGCAAATGGAGCCTCCATATTCTTCATCTGTCTCTATATACACGTAGGACGAGGATTATACTACGGATCCTACACACTAGCAGAAACATGAAATATTGGCATCATCCTCCTATTTACAATCATAGCCACAGCATTTATAGGCTATGTACTTCCATGGGGACAAATATCATTCTGAGGAGCAACCGTCATTACCAACCTCCTGTCAGCAATTCCTTACATCGGAACCAATCTAGTAGAATGAATCTGAGGGGGATTTTCAGTTGATAAAGCAACCCTAACACGATTCTTCGCCTTTCACTTTATTCTCCCCTTCGTAGCATCAGCACTAGTAATAGTACACCTGCTATTCCTAC [...]
+GGATCAAATAACCCATCAGGAGTCTCCTCCGACTCAGACAAAATTCCATTCCACCCATATTATACAATTAAAGATATTCTGGGAGCCCTCTTACTAATCCTAATTCTAATATTACTAGTAATATTCTCACCAGATCTACTGGGAGACCCGGACAATTACATCCCAGCCAACCCCCTCAGCACTCCACCACATATCAAACCTGAATGGTATTTTCTATTCGCTTATGCCATTTTACGATCCATCCCTAACAAACTAGGAGGAGTCCTAGCCCTACTCCTATCAATCTTAGTCCTAGCTATTATCCCACTACTTCACACATCAAAACAGCGAGGAATAATATTCCGGCCCATTAGCCAATTCCTCTTCTGACTACTAGTAGCAGACTTACTTACACTAACATGAATCGGAGGACAACCAGTCGAATACCCCTTCATTACTATCGGCCAACTAGCCTCTATCCTGTACTTCACAATCCTCCTAATTCTCATACCC [...]
+CATTATCGAAAATAACATCCTAAAATGAATGATTATAATTAATATCCTCTCACTAATTATCCCAATCCTCCTAGCCGTAGCCTTCCTGACACTAGTAGAGCGAAAAGTATTAGGCTATATGCAGCTCCGAAAAGGCCCCAACATCGTAGGACCCTACGGACTCCTACAACCAATTGCGGACGCCGTAAAATTATTCACCAAAGAACCCTTACGACCACTCACTTCCTCCGCATCTATATTTATTACAGCCCCCATCCTAGCCTTAACCCTGGCCCTAACTATATGAATCCCACTTCCCATACCATATCCTCTCATCAACATAAACCTAGGAGTCCTATTTATACTAGCAATGTCAAGTCTGGCTGTTTACTCAATCCTATGATCCGGGTGAGCATCAAATTCAAAATACGCACTAATTGGGGCCCTACGAGCCGTAGCCCAGACCATTTCATACGAAGTAACCCTGGCCATTATTCTCCTGTCGGTACTTCT [...]
+GATCCTTCACTCTATCTACACTAATCACCACCCAAGAACACCTATGATTAATCTTCCCAACATGACCCCTAGCCATGATATGATTTATCTCTACCCTAGCGGAAACTAATCGTGCCCCATTCGACCTAACAGAGGGAGAATCAGAACTAGTTTCGGGATTCAACGTAGAGTACGCGGCAGGCCCATTTGCCCTATTTTTCCTAGCGGAATATGCCAATATCATCATAATAAATATCCTCACAACTACCCTGTTCCTCGGGGCATTCCACAGCCCATACATACCCGAATTATACACCATCAACTTCACCCTAAAAACATTAGCACTGACAATCCTATTCTTATGAATCCGAGCATCGTATCCCCGATTCCGCTACGACCAGTTAATGCACCTCCTATGAAAAAATTTTCTACCCCTCACACTAGCCCTATGTATATGACACATAACCCTACCCGTAATCACAGCTAGCGTTCCCCCTCAAACGATAAAACCCC [...]
+ATCATAATTATAACAACCGTCGTATTAGGAACCGTAATTGTCTTAACAAGTTCCCATTGACTAATAATCTGAATTGGATTCGAAATAAATATGCTAGCAATCATTCCAATTCTGATAAAAAACTTTAGCCCCCGAGCCACAGAAGCCTCCACAAAATACTTTCTAGTCCAAGCCACCGCATCCATACTCCTAATACTAAGCATTATCATTAACCTAACAACCTCAGGACAATGGACAGTTCTAAAACTCCCAAACCCAACAGCATCAAACCTCCTAACTATCGCTTTAGCAATAAAACTTGGAATAGCTCCCTTTCACTTCTGAGTGCCTGAAGTAACACAAGGAACCCCACTATCATCAGGCATAATTTTACTCACATGACAAAAAATCGCACCCCTATCCGTTCTCTACCAAGTTGCACCGTCAATCAACCCAAACCTACTAATCACCATAGCAATTGCATCAGTACTAGTGGGAGGATGAGGAGGACTA [...]
+CCAACTCCGGAAAATCCTAGCTTACTCGTCAATCGCCCATATAGGATGAATTACCATTATCGTAATATATAATCCTACCCTAATACTCCTAAACCTAACAATCTATATCACCATAACACTTGGAACATTTATACTATTTATATATAATTCATCTACAACAACACTATCACTATCCCACACATGAAACAAATTGCCCCTCATAACATCCCTAATCCTAGTACTTATACTATCACTTGGAGGACTTCCCCCATTATCAGGCTTCGTGCCCAAATGACTTATTATTCAAGAACTAACAAAAAATGATATAATCATTCTACCAACATTTATGGCTATCACAGCACTACTAAACCTATACTTCTACATACGATTATCTTACACTACAGCACTAACACTGTTTCCATCAACAAATAATATAAAAATAAAATGACAATTTGAGAACACAAAAAAGATAGCCTTATTATCCCCACTAATCATTATCTCAACAATACTACT [...]
+CACCAATAATATCTATCCTAGACATAAATATAATTCTGGCCCTACTCACCAACACAATCCTAGCCTCCTTACTTGTACTAATCGCATTCTGACTCCCCCAACTAAACATCTACTCAGAAAAAGCCAGCCCTTACGAATGTGGATTTGACCCTATAGGATCAGCACGCCTGCCCTTCTCCATAAAATTTTTCCTAGTAGCCATTACATTCCTACTATTTGACCTAGAAATCGCACTACTACTACCTCTCCCGTGAGCATCCCACGCAAACAACCTGACAACCACCCTCACCATAGCACTTTTATTAATTTCCCTACTAGCCGCAAGCTTAGCTTACGAGTGAACCGAAAAAGGACTCGAATGAACAGAAATGTCCATAGTATACTTTAATATCTTTATAGCCTTCACCGTATCTTTCGTAGGACTACTCATGTATCGATCCCACCTTATATCCTCCCTACTTTGCCTAGAAGGTATAATATTATCACTATTCG [...]
+TCAATGACAATCCTAAATAACCATTTCACACTAGCTAGCATAGCCCCCATCATCCTACTCGTATTCGCAGCTTGTGAAGCGGCCCTAGGGCTATCCCTCCTAGTAATAGTATCTAACACATACGGAACTGACTACGTACAAAACCTAAACCTCTTACAATGCATTATTGTCCCTACCATCATACTAATACCCGTAACATGAATATCAAAACCTCATATAATTTGAATCAATACAACAACCTACAGCCTGCTAATTAGTCTCGCCAGCCTACCACTCCTAAGTCAACTTAACGACAATAGCCTAAACTCATCATTATTGTTCTTCACGGACTCCTTATCAGCCCCTCTCCTAACACTTACTACGTGACTCCTGCCCCTGATACTCATAGCTAGTCAATCCCACCTATCAAAAGAACCACTGACCCGGAAAAAACTTTACATCACAATGCTAATCCTTCTACAGCTATTTCTAATCATAACATTTGCCGCTACA [...]
+CATATTCTATATTTTATTCGAAGCGACTCTAGTGCCCACGCTAATCATTATTACCCGATGAGGAAACCAAACAGAACGCTTAAACGCAGGGCTATACTTCCTATTTTATACCCTAGTAGGATCACTACCATTACTAGTAGCGTTACTATATATACAAAACAACATGGGCACACTTAACTTCTTAATAACCCAATACTGAACCCAAACCCTGCCAAACTCCTGATCCAGTATTCTCCTATGGTTAGCGTGCATGATGGCATTCATAGTAAAAATACCCCTTTATGGACTTCACCTATGACTTCCTAAAGCGCATGTAGAGGCCCCCATCGCCGGATCCATAGTACTTGCCGCCGTACTTCTAAAACTAGGAGGTTACGGCATAATACGAATCACCATCCTGCTTAATCCCCTGACAAGCTTCATAGCGTATCCCTTCATAATGTTATCAATATGAGGAATAATTATAACAAGCTCCATCTGCTTACGCCAAAC [...]
+AATCACTAATCGCGTACTCTTCTGTAAGCCACATAGCCCTAGTAATTGTAGCTATCCTTATCCAAACGCCATTGAGCTATATAGGCGCAACCGCCCTAATAATTGCCCACGGCCTTACATCATCTATACTATTCTGCTTAGCTAACTCTAATTATGAACGCACCCACAGCCGAATCATGATCCTTGCACGCGGCCTACAAACTCTGCTACCACTAATAGCGGCATGATGACTATTAGCGAGCCTAACCAACCTAGCACTGCCCCCTACCATCAATCTAATCGGAGAATTACTCGTAGTGATAGCCTCATTCTCATGATCTAACGCTACCATTATTCTCATAGGAGTAAACATCATTATTACCGCCTTATACTCCCTATATATACTTATTACAACACAACGTGGAAAACACACTCACCACATCAAAAACATTAAACCCTCATTCACGCGAGAAAACACCCTAATAATACTCCACCTTATACCACTACTACTGC [...]
+AACCCTAAAATAATTCTAGGGCCCCTCTACTGTAAAATAAAAGTAATTAATTTATTCGCCTCATTTACTATTATAACACTATTTATACTCATGATACCAATCATCCTGGCCAGCACTCCAATCTACGAAAGCAAATTCTACCCACAATACGTGAAAACTACTATCTCTTACGCTTTCATAACCAGCATAATCCCCGCAATAATATTCATTTCCTCGGGACAAGAAATAATCATCTCAAACTGACACTGAATGACTATTCAAACTATAAAATTATCATTAAGCTTCAAACTAGATTATTTCTCAATAATTTTCATGCCCGTGGCCCTATTCGTCACATGATCCATCATAGAATTTTCAATATGATATATATCCTCAGATCCTTACATCAACCGATTCTTCAAGTATCTATTAATATTCCTTATTACCATAATAATTTTAGTTACCGCGAACAACCTATTCCAATTATTCATCGGATGAGAAGGAGTAGGCATT [...]
+CCTGCTCATCGGATGATGATATGGACGGTCAGATGCAAACACAGCCGCCCTTCAAGCAATCCTTTACAACCGCATTGGAGACGTAGGCTTCATCATAGCCATAGCATGATTCTTAACTAACCTAAACACGTGGGACCTCCAACAAATCTTCATAGTTCACCATAACGACCTAAACATACCACTCATAGGTCTTCTACTAGCGGCAACTGGCAAATCAGCCCAGTTTGGCCTACATCCATGGCTACCCTCAGCCATGGAAGGGCCCACACCAGTATCAGCCCTATTACACTCAAGCACTATGGTCGTAGCTGGAGTGTTTCTACTGATCCGATTCCATCCTCTAATAGAACATAATATAATAATACAGACAACTACCCTATGCTTAGGAGCCATCACCACACTATTCACAGCAATATGCGCCCTCACCCAAAATGACATCAAAAAAATCATCGCGTTCTCGACTTCGAGCCAATTAGGACTAATAATCGTCAC [...]
+TCGGCCAACCATATCTAGCATTCCTACACATCTGTACACATGCGTTCTTTAAAGCCATACTATTTATATGCTCCGGATCCATCATCCACAACCTAAACGACGAACAAGACATTCGGAAAATAGGAGGCCTATTCAAACCAATACCATTTACCACTACCTCACTAATTGTTGGCAACCTAGCACTTACAGGCATGCCATTTCTCACAGGATTTTACTCCAAAGATTTAATTATCGAAACCGCCAACACATCGAACACCAACGCCTGAGCCCTACTCTTAACCCTAGTAGCCACATCTATAACAGCTGCCTACAGCACCCGAATAATATTTTCCACACTCCTAGGACAACCCCGATTTAACTCTACGATTTCAGTGAACGAAAATAATCCACTATTAATCAACCCCATCAAACGTCTACTACTCGGAAGCATCTTCGCAGGATACCTAATAACCCTCAATATTCCACCCATGATGATCCCACAACTAACTATAC [...]
+CTAAAACTCACAGCCCTCACCGTAACACTACTAGGTTTCACACTGGCCCTAGAACTCAGCACAACTTCGCTAGACCTCAAATTCCAACACGCCTCAAACCTATCCAAATTCTCAAACCTCCTGGGATACTTCCCCACCATTATCCACCGCTTAGTACCAGCGACAAACCTAACAGCAAGCCAAAAGCTAGCCTCTACACTAATGGACATAATCTGACTAGAATATCTATTACCAAAATCCATTTCCCACCTAAACGTGAAATCATCAATCACCATCTCTAACCAAAAAGGCCTAATCAAACTATATTTCCTATCCTTCATGATTACCCTGATCCTAGCCCTAATTCTAACAACAGCTAATTCCCACGAG
+>Callorhinus_ursinus
+ATGCACGAAAATCTATTCGCCTCTTTCACTTCCCCTACAATAATAGGCCTCCCCATCGTAACTCTGATCATCCTGTTTCCAAGCATACTATTTCCCTCACCTAACCAACTAATCAGTAACCGCCTCACCTCAATCCAACAATGATTGATTCAATTAATATCAAAACAAATAATGTCAATCCACAATCACAAAGGACAAACGTGGGCATTAATACTCATATCACTTATTACATTCATCGGATCTACCAACCTACTAGGACTGTTACCACACTCATTTACTCCCACTACTCAATTATCTATAAACCTAGGAATAGCTATCCCATTATGGGCGGGAACAGTTATCGTAGGATTACGACATAAAACCAAGGCATCCTTAGCCCACTTCCTACCCCAAGGGACACCCTCTCCCCTTATCCCAATATTAGTAATTATTGAGTCTATCAGCCTACTCATTCAACCTATAGCCTTAGCCGTACGACTAACAGCCAATATC [...]
+CCACCTACTAATCCACTTAATCGGTGGAGCCACCCTGGCCCTTACTAATATCAGCATAATCACGGCCTTTATCACTTTTATCATCCTCACTCTACTCACAATCCTTGAATTCGCTGTAGCCTTAATCCAAGCCTATGTTTTCACTCTACTAGTTAGCCTATACTTACACGACAACACCTAAATGCCACAACTAGATACATCAACATGGTTTATAACAGTCTTATCCATAATCCTAACGCTATTTATCGTGTTTCAATTAAAAATCTCCAAACACCATTTCCCAATAAGCCCAGAACTGAAATCACCATTAACATCAAAAATCAATACTCCCTGAGAAAAAAAATGCACGAAAATCTATTCGCCTCTTTCACTTCCCCTACAAATGTTCATAAATCGATGATTATTCTCTACAAACCACAAAGATATCGGTACCCTCTACCTATTATTTGGTGCATGAGCTGGAATGGCTGGCACTGCCCTCAGCCTACTGAT [...]
+AATTAGGCCAACCAGGCACCCTACTAGGAGACGACCAAATCTATAACGTAATTGTCACCGCCCATGCATTCGTAATAATCTTTTTCATAGTAATACCTATCATAATTGGAGGCTTTGGAAACTGATTAGTACCCCTAATAATTGGAGCTCCCGACATGGCATTCCCCCGAATAAACAATATGAGTTTCTGACTTCTACCACCTTCTTTTCTACTACTACTAGCCTCTTCTCTAGTTGAAGCAGGCGCAGGTACCGGATGAACGGTCTACCCTCCCCTAGCAGGTAACCTAGCCCACGCAGGAGCTTCCGTGGACTTGACCATTTTCTCTCTTCACCTGGCGGGAGTATCATCTATCCTAGGAGCTATTAACTTTATTACTACCATTATCAACATAAAACCCCCCGCCATATCCCAATATCAAACTCCCCTGTTCGTATGATCTGTACTAATCACAGCAGTACTACTTCTGCTATCCCTACCAGTCCTAGCAG [...]
+ACTATATTGCTTACAGACCGGAATCTAAACACAACCTTTTTCGATCCAGCCGGAGGGGGTGACCCTATCCTATATCAACATCTATTCTGATTCTTCGGACACCCAGAAGTATATATCCTCATTCTACCAGGATTCGGAATGATCTCACACATCGTCACTTACTATTCAGGAAAAAAAGAACCTTTTGGCTATATAGGGATGGTTTGAGCAATAATATCCATTGGCTTCCTGGGCTTTATCGTATGAGCACATCACATATTCACCGTAGGAATAGATGTTGATACACGAGCATATTTCACTTCAGCCACTATAATCATCGCCATCCCCACAGGGGTCAAAGTATTCAGCTGATTAGCTACTCTGCATGGCGGTAACATCAAATGATCTCCTGCCATACTATGAGCTTTAGGATTCATCTTCCTATTTACAGTAGGAGGTCTCACAGGTATTGTGCTAGCGAATTCATCACTGGATATCGTCCTCCACGACACA [...]
+AGTAGCACACTTCCACTACGTTCTATCAATAGGAGCAGTATTCGCTATCATGGGTGGGTTTGTCCATTGATTCCCCTTATTTTCAGGATTTACGCTCGACGGTACCTGGGCAAAAATCCACTTCACGATTATATTCGTTGGAGTCAACATGACATTCTTCCCACAACATTTCCTAGGACTATCCGGAATACCACGACGATATTCTGATTACCCAGACGCCTACACAACATGAAATACAATCTCCTCTATAGGTTCATTCATTTCACTCACGGCAGTAATATTAATAATCTTCATGATTTGAGAAGCCTTCGCATCTAAACGAGAGGTAGAGGCGATTGAATTAACATCGACTAATATGGAATGACTCCACGGATGCCCTCCTCCTTATCACACATTCGAAGAACCCACCTATATTGTATTGAAAATGGCATATCCCTTCCAAATAGGCCTTCAAGATGCAACCTCCCCCATTATAGAGGAACTAACACACTT [...]
+ATACACTAATAATCGTATTCCTAATCAGTTCACTAGTACTTTATATTATTTCAACTATACTTACCACAAAACTAACGCATACAAGCACAATAGATGCCCAAGAAGTAGAGACGGTATGAACGATCTTGCCAGCTATTATTTTAATTATAATTGCCCTACCCTCATTACGAATCCTCTATATCATAGATGAAATCAACAATCCTTCACTAACCGTAAAAACTATAGGACACCAATGATATTGAACCTACGAATATACTGATTATGAAGACCTAAGTTTTGACTCCTACATAATTCCTACGCAAGAACTAAAGCCCGGTGAACTTCGACTATTAGAAGTAGATAACCGAGTTGTGTTACCCATAGAAATAACAGTTCGCATACTAATCTCATCAGAAGATGTACTCCACTCATGAGCCGTGCCGTCCCTAGGACTAAAAACCGATGCTATCCCAGGACGATTAAATCAAACCACTTTAATAGCCATGCGACCAG [...]
+TATGGACAATGCTCAGAGATCTGTGGCTCCAACCATAGTTTTATGCCCATCGTTATTGAATCCGTACCATTATCTTGCTTCGAGAAATGGTCTGCCTCAATGCTTATGACACACCAAACCCATGCATATCATATAGTTAACCCTAGCCCCTGACCACTGACAGGGGCCCTATCAGCCCTCCTTATAACCTCAGGCCTAATCATATGATTTCACTTCAGCTCAACCTACCTACTATTACTAGGTCTAGTAACCAATACACTAACTATATATCAATGGTGACGAGATATCGTCCGAGAAAGCACATTCCAAGGCCATCACACTCCAACCGTCCAAAAAGGCCTACGGTATGGCATAATCCTTTTCATCGTATCAGAAGTATTCTTTTTCGCAGGATTTTTCTGAGCCTTCTACCATTCCAGCCTAGCACCTACTCCCGAACTAGGAGGATGCTGACCCCCTATAGGAATCACACCTCTAAACCCACTAGAAGTC [...]
+AAACACCTCAGTACTTCTGGCATCAGGTGTATCAATTACCTGAGCCCACCACAGCTTAATAGAAGGGGACCGTAAGCACATACTCCAAGCCCTATTCATCACTATCATACTGGGCCTCTATTTTACACTTCTACAAGCCTCAGAGTATTACGAAACCCCCTTCACAATCTCTGATGGGGTCTACGGCTCCACCTTCTTCATAGCCACAGGATTCCACGGACTGCATGTAATTATTGGCTCAACCTTCCTAACCGTATGCTTCCTACGACAACTAAAATTTCACTTCACATCCAATCACCATTTCGGATTTGAAGCCGCTGCCTGATACTGACATTTTGTAGACGTCGTATGATTATTCCTATACGTATCCATTTATTGATGAGGGTCATGCATGACCAACATTCGAAAAGTTCATCCACTGGCCAAGATCATTAACAGCTCGCTCATTGACCTACCCGCACCATCCAATATCTCAGCATGATGAAACTTTGG [...]
+TCGCAACATGCTTAGTCTTACAAATCCTAACAGGACTATTCCTAGCCATGCACTATACCTCAGACACCACCACAGCCTTCTCATCAGTCGCCCATATTTGCCGAGACGTGAACTACGGCTGAATCATCCGATATATACACGCCAATGGAGCTTCCATATTCTTTATCTGCCTTTACATACACGTAGGACGAGGACTGTACTATGGATCCTACACACTCACAGAGACATGAAATATTGGCATCATCCTCTTACTTACAATTATAGCCACGGCATTCATGGGCTACGTACTTCCATGAGGACAAATATCATTCTGAGGGGCAACCGTCATCACTAACCTCCTATCAGCAATCCCTTATATCGGAGCCAACCTAGTAGAATGAATTTGAGGAGGATTCTCAGTTGATAAAGCAACCCTGACACGATTCTTCGCCTTCCACTTTATCCTCCCCTTCATAGTATCAGCATTAGTAATAGTCCACCTACTATTCCTAC [...]
+GGATCCAATAACCCATCGGGAGTCTCCTCTGACTCAGACAAAATCCCATTCCACCCATATTATACAATTAAAGATATCTTAGGAACCCTTCTGCTAATCTTAATCCTAATACTACTAGTAATATTCTCACCAGATCTACTAGGAGACCCAGACAACTACATCCCAGCCAACCCCCTCAGCACTCCACCACACATTAAACCTGAATGATATTTCCTATTCGCCTACGCTATTTTACGATCTATCCCCAATAAATTAGGAGGAGTCGTAGCCCTACTCCTGTCAATCTTAGTCCTTGCCATTATCCCACTACTCCATACGTCAAAACAACGAGGGATAATATTTCGACCCATTAGCCAATGCCTCTTCTGACTATTAGTAGCTGACTTACTAACACTAACATGAATCGGAGGACAGCCAGTTGAATACCCCTTTATTGCCATTGGCCAACTAGCCTCAATCCTATACTTCATAATCCTCCTAGTACTTATACCC [...]
+AATTATCGAGAACAATATCCTAAAATGAATGATCATAATCAATATCCTCTCGCTAATCATCCCGATCCTCCTAGCCGTAGCCTTCCTAACACTAGTAGAACGAAAAGTTCTAGGCTATATACAACTCCGAAAAGGTCCCAACATCGTAGGACCCTACGGACTCCTTCAACCCATCGCGGACGCTGTAAAATTATTCACCAAAGAACCCTTACGACCGCTCACCTCCTCCACATCAATATTTATTATGGCCCCTATCCTAGCCTTAACCTTAGCCCTAACCATGTGAATCCCTTTACCCATACCGTATCCTCTCACCAATATAAACTTAGGAGTTCTATTTATACTAGCAATATCAAGCCTAGCTGTTTACTCAATCTTATGATCCGGATGGGCATCAAATTCAAAATACGCCCTAATTGGAGCCCTACGAGCCGTAGCCCAAACTATCTCGTATGAAGTAACCCTAGCCATCATTCTTCTATCAGTATTACT [...]
+GATCTTTTACCCTATCTGCGCTAATCACTACCCAAGAACACCTATGACTAATCTTCCCAACATGACCCCTAGCCATGATATGATTTATCTCCACCCTAGCAGAAACAAACCGTGCCCCATTCGACCTGACAGAAGGAGAATCAGAACTGGTTTCAGGATTCAACGTAGAGTATGCAGCAGGCCCATTTGCCCTATTCTTCCTAGCAGAATACGCTAACATCATTATAATAAATATCCTCACTACCACCCTATTCCTAGGGGCATTCCACAATCCATACATACCCGAGTTATATACTATTAACTTCACCCTAAAAACACTAGCACTAACAATTGTATTCCTATGAATCCGGGCATCATACCCCCGATTCCGCTACGACCAGCTAATGCACCTCCTATGAAAAAATTTCCTACCCCTCACACTAGCCCTATGCATGTGACACATAACCTTACCCGTAATCACAGCTAGCATTCCCCCTCAAACGATAAAACCCC [...]
+ATCATAATCATAACAACTATTATATCAGGAACAATAATTGTCCTAACAAGCTCCCACTGACTGATAATCTGGATCGGATTCGAAATAAACATACTAGCAATTATTCCAATCCTGATAAAAAATTTTAGCCCCCGAGCCACGGAAGCATCCACAAAATATTTCCTAGTCCAAGCCACCGCATCCATGCTATTAATATTAGGCATTATTATCAACCTAATATCCTCAGGACAATGAACAATCCTAAAACTCCCAAACCCAATAGCATCGAATCTCCTAACTATCGCCCTAGCAATAAAACTTGGAATATCCCCATTTCACTTCTGAGTACCTGAAGTAACACAAGGAACCCCACTACCCTCAGGCATAATTCTATTAACGTGGCAAAAAATTGCACCCCTATCCATTCTCTATCAAATTGCACCATCAATTAACCCCAACCTGCTCACCATTATAGCAATTGCATCACTACTAGTAGGAGGATGAGGAGGACTA [...]
+CCAGCTCCGAAAAATTATAGCCTACTCATCAATCGCCCATATAGGATGAACTACCATTATCATAATATATAATCCCACCCTAATACTCCTAAACCTAACAATCTATATTACCATGACACTCGGAACATTCATACTATTTATTTATAATTCATCTACTACAACACTATCACTATCCCACACATGAAACAAACTACCCCTGATAACATCCCTAATCTTAATTCTCATATTATCACTCGGAGGTCTCCCCCCACTATCAGGCTTCGTACCAAAATGATTGATCATACAGGAACTAACAAAAAACGACATAATTATTTTACCAACATTTATAGCCATCACAGCACTACTAAACCTATACTTCTACATACGATTATCCTACACCACAGCACTAACACTGTTCCCCTCAACAAATAATATAAAAATAAAATGACAATTTGAAAGCACAAAAAAGATGATCCTACTACCCCCACTAATTATTATCTCAACAATATTGCT [...]
+CACCAATAATATCTATTCTAGACATAAACATAATTCTAGCCCTACTCACCAATACAATCCTGGCCTCCTTACTTGTACTAATCGCATTCTGACTACCTCAACTAAACATTTACTCGGAAAAAGCCAGCCCCTACGAATGTGGATTTGACCCTATAGGATCAGCACGCTTACCCTTTTCCATAAAATTCTTCCTAGTAGCCATTACATTCCTACTATTTGATCTAGAAATCGCATTACTATTACCCCTCCCATGAGCATCTCACGCAAACAATCTAACGACTACCCTCACTATAGCACTTACATTAATCTCCTTATTAGCTGTAAGCCTAGCTTACGAATGAACCGAAAAAGGACTAGAATGAACAGAAATGTCCATGGTATACTTCAATATCTTTCTAGCCTTCATCGTATCTCTCGTAGGATTACTCATATACCGATCCCACCTCATATCCTCCCTACTTTGCTTAGAAGGCATGATATTATCCCTATTTG [...]
+TCAGTAACAATCCTAAATAACCATTTTACACTAGCTAGCATAGCCCCCATTATCCTGCTTGTATTCGCGGCTTGCGAGGCGGCCCTGGGACTATCACTCCTAGTAATAGTATCCAACACATATGGAACTGATTATGTACAAAATCTAAACCTCTTACAATGCATTATTATCCCCACTATTATACTGATACCCCTAACGTGAATATCAAAACCCCATATAATTTGAATCAACACAACAACCTATAGCCTACTAATCAGCCTCGCTAGCCTACCATTCCTAAATCAACTTGGCGACAACAGCCTAAATTTATCACTACTGTTCTTCACAGACTCCTTATCGGCCCCCCTTTTAACACTCACTACGTGACTCCTGCCCTTAATACTCATAGCCAGTCAATTTCACCTATCAAAAGAACCGCTGACCCGAAAAAAACTTTATATTACAATACTAATCCTCCTACAACTATTTTTAATCATGACATTTGCCGCTACA [...]
+TATATTCTATATCCTATTTGAAGCTACCCTAGTACCTACACTGATTATTATTACCCGATGAGGAAACCAAACGGAACGCCTAAACGCGGGACTATACTTCCTATTTTACACCCTAGTAGGGTCCCTACCCCTACTAGTAGCCTTACTCTATATACAAAACAATATAGGTACACTAAATTTCCTAGTAGCTCAATACTGAGCTCAGACTCTACCAAACTCCTGATCTAACGTCCTCCTATGACTAGCGTGTATGACAGCGTTCATAGTAAAAATACCCCTTTATGGATTACACCTATGACTTCCCAAAGCACACGTAGAAGCCCCCATCGCCGGATCTATGGTACTTGCCGCTGTACTTCTGAAGCTAGGAGGATACGGCATGATACGAATTACTATTCTGCTTAGCCCCCTAACAAGCTTTATAGCATATCCCTTCATAATACTATCAGTGTGAGGCATAATCATAACAAGCTCTATCTGTCTACGCCAAAC [...]
+AATCGTTAATCGCATACTCTTCTGTAAGCCATATGGCCCTAGTAATCGTAGCTATCCTTATCCAAACACCATTAAGTTATATAGGCGCAACTGCACTAATAATCGCCCACGGCCTTACATCGTCTATGCTATTCTGTTTAGCCAACTCCAACTATGAACGCATCCACAGCCGAATTATAATCCTTGCACGCGGCCTACAAACCCTATTACCACTAATAGCAGCATGATGACTGCTAGCAAACCTAACCAACCTGGCGTTACCCCCTACCATCAATCTAATCGGAGAATTACTTGTGGTGATAACCTCATTTTCATGATCTAATATTACCATTATCCTTATAGGAACAAACATTATTATCACTGCCTTATACTCCCTATATATACTTATTATAACACAACGCGGAAAATATACTCACCATATCAAAAATATTAAGCCCTCCTTTACACGAGAAAACGCCCTAATAACGCTTCACCTTCTACCCCTACTACTGC [...]
+AATCCTAAAATAATTCTAGGGACCCTTTACTGTAAAATAAAAGTAATTAACTTATTCACCTCGCTCACCGTTACAACATTATTTATACTTACAATGCCAATTATCCTAACTAGCACCTCAATCTACAAAAGCAAACTCTACCCACAATACGTGAAAACCACCATCTCCTATGCCTTTATAATTAGCATAATCCCTGTAATAATATTTATTTACTCAGGACAAGAAATAATTATCTCAAACTGACACTGAATAACTATTCAAACTATAAAATTATCACTAAGCTTCAAACTAGACTATTTCTCGATAATCTTCATGCCTGTAGCCCTATTCGTCACATGATCTATCATAGAATTCTCAATATGATACATAGCCTCAGACCCTTACATCAACCGATTCTTCAAGTACCTATTAATATTCCTCATCACCATAATAATCCTAGTAACCGCAAATAATCTATTTCAACTATTTATCGGCTGAGAAGGAGTAGGCATT [...]
+CCTACTCATTGGATGATGATACGGACGGTCAGACGCAAATACAGCCGCCCTCCAAGCAATCCTATATAACCGCATTGGAGATGTAGGCTTTATTGCAGCCATAGCATGATTTTTAGCTAACCTAAACACGTGAGACTTCCAACAAATCTTTATAATTCATCACAACGACCTAAACATACCACTCATAGGCCTCCTGCTGGCAGCAACCGGTAAATCAGCCCAATTCGGCCTACACCCATGACTACCCTCCGCCATAGAAGGACCAACACCAGTATCAGCCTTACTGCACTCAAGCACTATAGTTGTAGCTGGAGTATTCCTCCTAATCCGATTCCACCCTTTAATAGAACATAATTCAACAATACAAACAGCTACCCTGTGCCTAGGAGCCATCACCACCTTATTTACAGCAATTTGTGCCCTCACACAAAATGACATCAAAAAAATCATCGCATTCTCAACTTCAAGCCAACTAGGACTGATAATCGTCAC [...]
+TTGGCCAACCATATCTAGCATTTCTACATATCTGCACCCACGCGTTCTTCAAGGCCATACTATTTATATGCTCCGGATCCATTATTCACAACCTAAATGACGAACAAGATATTCGAAAAATAGGAGGCTTATTCAAACCAATACCATTCACCACCACCTCACTGATCGTAGGCAGCCTAGCACTTACAGGCATACCATTCCTCACAGGATTTTACTCCAAAGATCTAATTATCGAAACCGCCAACACATCGAATACCAACGCCTGAGCCCTACTACTAACCTTAACAGCCACATCTATGACAGCTGCCTACAGCACCCGAATAATATTCTTCACACTTCTGGGACAACCCCGGTTTAATTCCACAATCACAATAAATGAGAATAACCCACTACTAATTAACCCCATCAAACGTCTACTACTAGGAAGCATTTTCGCTGGGTACCTAATAACCCTTAACATCCCACCTATAACAACTCCACAACTAACCATAC [...]
+CTAAAACTTACTGCCCTCACCATAACACTCATAGGTTTCATTCTGGCCCTGGAACTCAGTATAACCTCACTAAACCTCAAATTCAACCACGCATCAAACCTATTCAAGTTCTCAAATCTCCTAGGATATTTCCCCACCATCATTCATCGCCTGATACCAATAACAAACCTAACAGCAAGTCAAAAATTAGCCTCCACACTAATAGACATAATCTGATTAGAATATTTACTACCAAAGTCCATCTCCCACCTACACATAAAATCATCAACCACCATTTCTAATCAAAAGGGCCTAATTAAACTGTACTTCTTATCCTTCATAATTACCCTAACCCTAGCCATAATGTTAATTATAACTAATTCCCACGGG
+>Canis_latrans
+ATGAACGAAAATCTATTCGCCTCTTTCGCTGCCCCCTCAATAATAGGTCTCCCTATTGTAGTACTGATCGTCATGTTCCCTTCCATTTTATTCCCAGCACCCAATCGCCTAATCAATAACCGGTTAATCTCCATTCAACAATGATTAATTCAATTAACATCAAAACAAATACTAGCAATTCACAACCAGAAGGGACGAACCTGAGCTCTCATACTTATATCACTAATTCTATTCATTGGCTCAACTAATCTACTTGGACTATTACCCCACTCATTTACACCCACAACCCAACTCTCTATAAACCTCGGAATAGCAATCCCCCTATGAGCAGGGACAGTAATTACCGGCTTCCGTTATAAGACCAAAGCATCCTTGGCACACTTTCTACCCCAAGGCACCCCTCTTCCCCTAATTCCAATACTAGTAATCATCGAAACTATTAGTCTATTCATTCAACCCATATCTCTAGCCGTTCGATTAACCGCCAATATT [...]
+ACACCTCCTAATCCACTTGATTGGAGGGGCTACCTTAGCTCTTATTAATATTAGCGCGGCCACAGCTTTTATTACTTTTATTATTTTAATCCTTCTTACGATTCTAGAATTTGCTGTTGCTTTAATTCAAGCCTATGTTTTTACCCTACTAGTAAGTCTATACTTACACGACAACACCTAAATGCCACAGCTAGACACATCCACCTGATTCATTATAATCCTTTCAATATTTCTCACCCTCTTTATTCTATTTCAACTAAAAATTTCAAATCACTACTACCCAGAAAACCCAATAACCAAATCTGCTAAGATCACTGGTCAACATAACCCTTGAGAAAATAAATGAACGAAAATCTATTCGCCTCTTTCGCTGCCCCCTCAAATGTTCATTAACCGATGATTGTTCTCTACTAATCACAAAGATATTGGTACTTTATATCTACTGTTTGGAGCATGAGCCGGCATAGTAGGCACTGCCTTGAGCCTCCTCAT [...]
+AGCTAGGTCAGCCCGGTACTTTACTAGGCGACGACCAAATTTATAATGTCGTCGTAACCGCCCATGCTTTCGTAATAATCTTCTTCATAGTCATGCCCATTATAATTGGGGGCTTTGGGAACTGACTGGTGCCATTAATAATTGGTGCTCCGGACATGGCATTCCCCCGAATAAATAACATGAGCTTCTGACTTCTTCCTCCATCTTTTCTTCTACTATTAGCATCTTCTATGGTAGAAGCAGGTGCAGGAACGGGATGGACTGTATATCCTCCACTGGCTGGCAATCTGGCCCATGCAGGAGCATCCGTTGATCTTACAATTTTCTCCTTACATCTAGCTGGAGTCTCTTCTATTTTAGGGGCAATCAATTTCATCACTACTATTATCAACATAAAACCCCCTGCAATATCCCAGTATCAAACTCCCCTGTTTGTATGATCAGTACTAATTACAGCAGTTCTACTTTTACTATCGCTACCTGTACTGGCTG [...]
+ACAATACTTTTAACAGACCGGAATCTTAATACAACATTTTTCGACCCCGCTGGAGGAGGAGACCCTATCTTATATCAACACCTATTCTGATTCTTCGGACATCCTGAAGTTTACATTCTTATCCTGCCCGGATTCGGAATAATTTCTCACATTGTTACTTACTACTCAGGGAAAAAAGAGCCTTTCGGCTATATAGGAATAGTATGGGCAATAATATCTATTGGGTTTTTAGGCTTTATCGTATGAGCTCACCATATGTTTACCGTAGGAATAGACGTAGACACACGAGCATACTTCACATCCGCCACTATAATTATTGCTATTCCAACAGGAGTAAAAGTATTTAGTTGATTGGCAACACTTCACGGAGGCAATATTAAATGGTCTCCAGCCATACTATGAGCTTTAGGGTTTATTTTCTTATTTACAGTAGGCGGGCTAACAGGTATTGTTCTAGCTAATTCGTCCTTAGACATCGTTCTTCATGATACA [...]
+TGTAGCTCACTTTCACTATGTGCTTTCAATGGGAGCAGTTTTTGCTATCATGGGTGGATTTGCCCACTGATTCCCTTTATTCTCAGGTTATACTCTTAACGATACTTGAGCAAAGATTCACTTTACAATTATGTTTGTGGGAGTAAATATAACTTTCTTCCCTCAGCATTTCCTAGGTTTATCCGGAATGCCTCGTCGATACTCTGACTATCCAGATGCATATACCACCTGAAATACCGTCTCCTCTATAGGATCGTTTATCTCACTTACAGCGGTGATGCTTATAATTTTTATAATCTGAGAAGCCTTTGCATCCAAACGAGAAGTTGCTATAGTAGAACTTACTACAACTAACATTGAATGACTACATGGATGTCCCCCTCCATATCACACGTTCGAAGAACCTACATATGTAATCCAAAAAATGGCGTACCCATTTCAACTCGGATTACAGGACGCAACCTCCCCTATTATAGAGGAGCTACTTCATTT [...]
+ACACGCTAATAATTGTATTCTTAATCAGTTCTTTAGTTCTCTACATCATTTCACTAATGTTAACTACAAAATTAACTCATACAAGCACAATAGACGCACAAGAAGTAGAAACAGTATGAACTATCCTACCCGCCATCATCCTAATCCTAATCGCTCTGCCTTCCCTCCGAATCCTTTACATAATAGACGAAATTAATAACCCCTCCTTAACCGTGAAAACAATAGGCCACCAATGATACTGAAGCTATGAATATACTGATTATGAAGACTTAAACTTTGACTCCTACATAATCCCAACACAAGAATTAAAGCCAGGAGAACTCCGACTATTAGAGGTAGACAACCGAGTTGTCCTCCCAATAGAAATAACCATCCGAATACTTATCTCTTCAGAAGACGTTTTGCATTCATGAGCCGTTCCATCACTAGGTCTAAAAACTGACGCTATCCCAGGACGACTGAACCAAACCACCCTCATAGCCATACGACCAG [...]
+TATGGCCAGTGCTCTGAAATCTGCGGATCTAACCATAGCTTTATGCCCATTGTTCTTGAAATAGTCCCCCTATCTTACTTCGAAACCTGATCTGCCTTAATAGTAATGACCCACCAAACTCATGCCTACCATATAGTCAACCCAAGCCCATGACCGCTGACAGGAGCCCTTTCTGCCCTTCTTATAACATCGGGTCTTATCATATGATTTCACTATAACTCAATATCCCTACTTACATTAGGACTTACAACCAATCTATTAACCATATACCAGTGATGACGAGATGTGATCCGAGAAGGCACATTCCAAGGACATCATACCCCTATTGTACAAAAAGGACTACGCTACGGAATAGTTCTTTTTATTGTATCAGAAGTATTTTTCTTTGCAGGCTTCTTTTGAGCCTTTTACCATTCCAGCCTAGCTCCTACTCCTGAACTTGGGGGTTGCTGGCCTCCCACCGGAATTATTCCTCTTAACCCATTAGAAGTT [...]
+CAATACCTCAGTACTCCTGGCCTCCGGAGTATCTATTACTTGAGCTCATCATAGTTTAATAGAAGGCAATCGCAAACATATACTTCAAGCCCTATTTATTACAATCTCCTTAGGCGTATATTTCACACTATTACAGGCCTCCGAATATTATGAGACATCTTTTACAATCTCCGATGGAGTATACGGATCTACCTTTTTTATAGCCACTGGGTTTCACGGATTACACGTAATTATTGGCTCTACATTCCTTATTGTATGCTTTCTCCGACAACTATACTACCACTTCACATCAAACCATCACTTCGGATTTGAAGCCGCTGCATGATACTGACACTTTGTTGATGTAGTCTGACTATTCTTATATGTATCTATTTATTGATGAGGATCCTACATGACCAACATTCGAAAAACTCACCCACTAGCCAAAATTGTCAATAACTCATTCATTGACCTCCCAGCGCCATCTAACATCTCTGCTTGATGGAATTTCGG [...]
+TAGGAGTATGCCTGATTCTACAGATTCTAACAGGTTTATTTTTAGCTATACACTATACATCGGACACAGCCACAGCTTTTTCATCAGTCACCCACATCTGTCGAGACGTTAACTACGGCTGAATTATCCGCTACATACATGCAAATGGCGCTTCCATATTCTTTATTTGTCTGTTCATACATGTGGGACGAGGCCTATACTACGGATCCTATGTATTCATAGAAACATGAAACATTGGAATTGCACTACTATTCGCAACCATAGCCACAGCATTCATAGGCTATGTACTGCCATGAGGACAAATATCATTTTGAGGAGCAACCGTAATTACTAATCTTCTCTCTGCCATCCCCTATATCGGAACCAACTTAGTAGAATGAATCTGAGGCGGCTTCTCAGTGGACAAAGCAACCCTAACACGATTCTTTGCATTCCACTTTATCCTCCCATTCATTATCGCAGCCCTAGCAATAGTACACCTCCTATTTCTAC [...]
+GGATCCAACAACCCCTCAGGAATCACATCAAACTCAGACAAAATTCCATTTCACCCTTACTACACAATCAAAGACATCCTAGGAGCCTTACTCCTACTCCTAGCCCTAATAACACTAGTCTTATTCTCACCAGACCTATTAGGAGACCCAGATAACTACACCCCTGCAAACCCCCTAAGTACCCCACCACATATCAAACCCGAATGATATTTCCTATTCGCCTATGCTATCCTACGATCCATTCCCAATAAACTAGGAGGCGTACTCGCTCTAGTATTCTCCATCCTAATCCTGGCATTCGTTCCATTCCTCCACACATCTAAACAACGCAGCATAATATTCCGACCCCTAAGCCAATGCCTGTTCTGACTTTTAGTCGCCGATCTTCTCACCTTAACATGAATCGGAGGACAACCAGTTGAACACCCTTTCATCATCATCGGACAAGTCGCCTCAGTTCTATATTTCACCATCTTATTGATTCTAATACCA [...]
+CGTTATCGAAAATAACCTTCTAAAATGAATGTTCTTTATCAACATCATCTCTCTTATTGTCCCAATCCTTCTTGCCGTAGCCTTCCTTACCCTCGTCGAACGAAAAGTTTTAGGCTACATACAACTTCGAAAAGGGCCTAATATCGTAGGCCCCTACGGCCTCCTTCAACCAATCGCAGACGCAGTAAAACTCTTCACGAAAGAACCTCTACGACCACTTACATCCTCTATATCAATATTCATTCTAGCCCCCATTCTAGCCCTATCACTAGCCCTAACTATATGAATTCCCCTCCCAATACCCTACCCACTCATTAATATAAACTTGGGAGTTCTATTCATACTAGCAATATCAAGCCTCGCCGTATACTCCATCCTCTGATCAGGATGAGCTTCAAACTCCAAATACGCCCTAATCGGAGCCCTTCGAGCAGTAGCTCAAACAATCTCATATGAAGTAACACTAGCAATTATTCTCCTATCAGTCCTTCT [...]
+GGTCATTCACATTATCTACGCTAATTATTACCCAAGAGCATATATGATTAATCTTTCCAGCTTGACCCCTAGCCATGATATGATTCATTTCCACTCTAGCAGAGACTAATCGAGCCCCCTTCGACCTAACTGAAGGAGAATCCGAACTAGTTTCTGGGTTTAACGTGGAATATGCAGCAGGTCCTTTCGCCCTGTTTTTTCTAGCAGAGTACGCAAATATTATTATAATAAATATCCTTACAACAATTCTATTCTTCGGTGCATTCCACAACCCATTCATACCAGAACTCTACTCTATTAACTTCACTATAAAAACCCTCTTACTAACTATCTGCTTCCTATGAATTCGAGCATCATACCCCCGATTCCGCTATGATCAACTAATACACTTATTATGAAAAAATTTTCTACCCCTAACTTTAGCCCTATGCATATGACATGTTGCCTTGCCCATTATTACCGCGAGTATCCCACCCCAAACAATAAAACCCC [...]
+ATTATCATTATAGCAACCATCATGACAGGGACCATGATCGTTATACTAAGCTCGCAC???????????????????????????????????????GCCATCATCCCTATTCTCATAAAAAAGTACAATCCACGAGCCATAGAAGCCTCCACAAAATATTTCCTTACACAAGCCACTGCCTCAATACTACTAATGATAGGAGTCACTATTAACCTCCTTTACTCCGGCCAATGAGTAATCTCAAAAATCTCAAACCCCATCGCATCCATCATGATAACCACTGCCCTAACAATAAAACTAGGCCTATCTCCATTCCATTTCTGAGTTCCCGAAGTAACACAAGGAATTACACTTATATCAGGAATAATCCTACTAACATGACAAAAAATCGCACCTATATCCATCCTCTATCAAATCTCCCCATCAATTAATACCAACCTTCTTATACTAATAGCCCTTTCATCCGTTCTAGTAGGAGGCTGAGGCGGACTA [...]
+TCAACTACGAAAAATCATAGCATACTCCTCCATTGCCCACATAGGTTGGATAGCCGCTATCATTACTTACAACCCCACAATAATAATTCTAAACTTAACTTTATATATTCTAATAACGCTATCTTCCTTCATACTATTTATATTAAACTCATCCACTACAACCTTATCTTTATCTCACATATGAAATAAATTTCCCCTAATCACCTCCATAATCTTAATCTTAATATTATCCCTAGGAGGACTACCCCCATTATCCGGCTTCATCCCTAAATGAATAATCATTCAAGAATTAACAAAAAATAACATAATTATTATTCCAACACTAATGGCCATCACCGCCCTACTTAACCTATACTTCTACCTGCGACTCACATATAGCACCGCACTTACTATATTCCCATCCACAAATAACATAAAAATAAAATGACAATTCGAATACACAAAAAAGGTAACCTTACTGCCCCCCTTAATTATTACCTCAACTATATTACT [...]
+CACCTATATTATCAGTCTTGGACATAAACGTAATACTAACCTTGATAACTAATGTAACCCTGGCATCCTTACTTGTACTAATCGCATTCTGACTTCCCCAACTAAATATCTACACAGACAAGGCAAGCCCCTACGAATGTGGTTTTGACCCCATGGGATCTGCTCGCCTACCTTTCTCTATAAAATTCTTCCTAGTTGCCATCACATTTCTGCTTTTCGACCTAGAAATTGCACTCCTGCTCCCACTTCCCTGAGCGTCACAAACCAACAAGCTAACAACAATACTTATCATAGCACTTCTACTAATCTCCCTCCTAGCTGCAAGCCTAGCGTACGAATGGACCGAAAAGGGACTAGAATGAACCGAAATGTCCATAGTATATATTAATATCTTTCTGGCATTTATCCTTTCTCTGATAGGCATACTTGTTTACCGATCACACCTAATATCATCGCTACTATGCTTAGAGGGCATAATATTATCACTATTTG [...]
+TCTGTAACTATTCTCAACAATCACCTTACATTAGCCAGCATGATACCAATCGTACTACTAGTATTTGCTGCTTGCGAAGCAGCATTAGGACTATCTCTACTAGTTATAGTATCTAACACCTACGGGACTGATTACGTACAAAACCTAAACCTTTTACAATGCATTATTATCCCTACTACCATACTAATCCCCCTTACATGGATATCAAAGCCTAACATAATCTGAATTAACACGACAACATATGGTTTGCTAATCAGCTTAATCAGCTTATTTTATCTAAATCAACCAAATGATAATACATTGAACACCTCCTTAATATTTTTCTCTGATTCTCTATCAGCACCGTTATTAGCACTTACAACATGACTCCTGCCCCTTATACTCATAGCGAGTCAACACCATTTATCAAAAGAACCCTTAACTCGAAAAAAACTATATATCTCAATACTAATTCTTCTCCAATTGTTTCTAATTATAACCTTCACCGCCTCT [...]
+CTTCTTTTATATCCTATTTGAAGCAACACTAATCCCAACCCTGATTATTATTACCCGATGAGGAAATCAAACTGAACGACTAAACGCAGGGCTCTACTTCTTATTTTACACTTTAATAGGATCCCTCCCACTCCTAGTAGCTCTCCTTTACATCCACAATCTCATGGGCTCCCTGAATTTTCTCATAATTCAATACTGAACTCAACCTCTGCCAAACTCCTGATCTAACATTTTCTTATGATTGGCATGCATGATAGCATTCATAGTAAAGATACCTCTATACGGCCTCCACTTGTGACTACCAAAAGCACACGTAGAGGCCCCTATTGCCGGCTCCATAGTACTTGCTGCTGTACTCCTAAAACTAGGAGGCTATGGCATAATACGAATTACTACCCTACTAAACCCCCTGACCAACTTCATAGCGTATCCTTTCATAATATTATCTCTATGAGGCATAATCATAACAAGCTCTATCTGTCTCCGTCAAAC [...]
+AATCCCTAATTGCATACTCCTCAGTTAGTCATATAGCACTGGTTATCGTAGCAGTTCTTATTCAAACACCATGAAGCTATATAGGTGCAACAGCTCTAATGATTGCCCATGGTTTAACATCCTCAATACTATTCTGCTTAGCCAACTCTAATTACGAACGAATCCATAGCCGTACTATAATTCTCGCACGAGGACTTCAAACCCTCCTTCCCCTAATAGCAGCCTGATGACTACTAGCAAGTCTCACAAATCTGGCTCTCCCTCCAACAATTAATCTTATTGGAGAACTATTTGTAGTAATAGCCTCATTCTCATGATCCAACATTACCATCATTCTAATAGGAATTAACATTACCATCACTGCCCTATACTCACTTTACATATTAATCACCACACAACGTGGTAAATATTCCCACCATATCAAAAATATTAAACCATCATTCACACGAGAAAACGCCCTAATAACCTTACATCTACTGCCCCTCCTCCTCC [...]
+AACCCCAAAATCATTCTCGGCCCCATCTACTGTAGGATAAAAGTAATAAATATATTTACTTCATGCATAATCACAGCCCTAGTCATTCTTACTTTGCCCATCATTATAACCTCTACTAAACTCTACAAAAATAAGCTATACCCATACTATGTAAAAACCGCTACCTCTTACGCATTCATAATTAGCATAATCCCCACAATAATATTCATCTACTCAGGACAGGAAACAATTGTTTCAAACTGGCATTGAATAACTATCCAAACTATAAAACTATCCATGAGCTTCAAGTTAGACTACTTCTCAATAATCTTTGTACCTGTAGCCCTTTTTGTTACCTGGTCTATCATGGAATTCTCCATATGATACATGCACTCCGATCCTTATATTAACCGATTTTTCAAGTACCTTCTCTTATTCCTTATTACTATAATAGTCTTAGTTACCGCAAACAACATATTCCAACTATTCATTGGCTGAGAAGGAGTTGGCATT [...]
+TTTACTTATTGGATGATGGTACGGCCGAACCGATGCAAATACAGCCGCCCTACAAGCCGTTCTCTATAACCGTATTGGAGACGTAGGCTTCATCATAACCATAGCATGGTTTCTATTAAACTTAAACACATGAGACCTTCAACAAATCTTCATTACAACAAACAATAACTTTAACTTACCACTACTTGGCCTACTACTAGCAGCTACCGGTAAATCTGCTCAGTTCGGCTTACATCCCTGACTCCCCTCAGCCATAGAAGGCCCTACTCCTGTATCAGCCCTACTTCACTCAAGTACAATAGTTGTAGCAGGAGTGTTTCTTCTCATCCGCTTTCATCCACTAATAGAGCATAACCAAACTATTCAAACCCTCACTTTATGCTTAGGGGCCATTACTACATTATTTACCGCAATCTGCGCTCTTACACAGAACGACATCAAAAAAATTGTAGCATTCTCTACCTCAAGTCAACTAGGCCTAATAATAGTAAC [...]
+TTAATCAGCCTTATCTAGCCTTCTTACACATCTGCACTCACGCATTTTTTAAAGCCATACTATTTATATGTTCAGGGTCAATTATCCATAGCCTAAACGATGAACAAGATATTCGAAAAATAGGCGGCCTATTTAAAGTCCTCCCCTTCACCACAACTTCCCTGATTGTCGGAAGCCTCGCATTAACAGGCATGCCTTTCCTTACAGGATTCTACTCCAAAGACCTGATCATCGAGTCCGCCAACACGTCGAATACCAACGCCTGAGCCCTCTTAATTACACTCGTTGCCACATCCCTAACCGCTGCCTACAGCACCCGAATTATATTCTTTGCACTACTAGGCCAGCCCCGCTTCTCCCCTATAATCCTTATCAACGAGAACAATCCTCTCCTAATTAACTCTATTAAACGACTCCTTATCGGAAGTGTATTTGCAGGATTCATTATCTCCCACAGCATCACACCCACCACCATCCCACAGATAACTATGC [...]
+CTAAAAGTGATAGCCCTTGCAGTAACTATCTTGGGTTTCATCCTGGCACTAGAACTAAACCTTACCATGCAAGGACTTAAATTTAATTACCCTTCTAACTACTTTAAATTTTCCAGCCTCCTTGGCTACTATCCAGCCATTATGCACCGCCTCACACCTAAAACAAGTCTAACCATCAGCCAGAAATCAGCATCTATGCTTCTGGATTCCATCTGACTAGAAAGCATTTTACCCAAGTCAATCTCGTATTTCCAAATAAAATCTTCTACCCTTATTTCAAATCAAAAGGGTCTCATCAAACTCTATTTCCTATCATTCATACTAACTATAATTCTCAGCCTATTAATC??????CTTAATTACCACGGG
+>Canis_lupus
+ATGAACGAAAATCTATTCGCTTCTTTCGCTGCCCCCTCAATAATAGGTCTCCCTATTGTGGTACTGATCGTCATATTCCCTTCCATTTTATTCCCAACACCCAGTCGCCTAATCAATAATCGGTTAATCTCCATTCAGCAATGACTAATTCAACTAACATCAAAACAAATACTAGCAATTCATAACCAAAAGGGACGAACCTGAGCTCTCATACTTATATCACTAATTCTATTTATTGGCTCAACTAATCTACTTGGCCTACTACCTCACTCATTTACGCCCACAACACAACTCTCTATAAACCTCGGAATAGCAATCCCCCTATGAGCAGGGACAGTAATTACCGGTTTCCGCTATAAGACCAAAGCATCCTTAGCACACTTTCTACCCCAAGGCACCCCTCTTCCCCTAATTCCAATACTAGTAGTCATCGAAACTATTAGTCTATTTATTCAACCCATAGCTCTAGCCGTTCGATTAACCGCCAATATT [...]
+ACACCTCCTAATCCATTTGATTGGAGGGGCTACCTTAGCTCTTATCAATATTAGCGCGACCACAGCTTTTATCACTTTTATTATTCTAATCCTACTTACGATCCTGGAATTTGCTGTTGCCTTAATTCAAGCCTATGTTTTTACCTTACTAGTGAGTCTATACTTACATGACAACACCTAAATGCCACAGCTAGATACATCCACCTGATTTATTATAATCTTTTCAATATTTCTCACCCTCTTCATCCTATTTCAACTAAAAATTTCAAATCACTACTACCCAGAAAACCCGATAACCAAATCTGCTAAAATTGCTGGTCAACATAATCCTTGAGAAAACAAATGAACGAAAATCTATTCGCTTCTTTCGCTGCCCCCTCAAATGTTCATTAACCGATGATTGTTCTCCACTAATCACAAGGATATTGGTACTTTATACTTACTATTTGGAGCATGAGCCGGTATAGTAGGCACTGCCTTGAGCCTCCTCAT [...]
+AACTAGGTCAGCCCGGTACTTTACTAGGTGACGATCAAATTTATAATGTCATCGTAACCGCCCATGCTTTCGTAATAATCTTCTTCATAGTCATGCCCATCATAATTGGGGGCTTTGGAAACTGACTAGTGCCGTTAATAATTGGTGCTCCGGACATGGCATTCCCCCGAATAAATAACATGAGCTTCTGACTCCTTCCTCCATCCTTTCTTCTACTATTAGCATCTTCTATGGTAGAAGCAGGTGCAGGAACGGGATGAACCGTATACCCCCCACTGGCTGGCAATCTGGCCCATGCAGGAGCATCCGTTGACCTTACAATTTTCTCCTTACACTTAGCCGGAGTCTCTTCTATTTTAGGGGCAATTAATTTCATCACTACTATTATCAACATAAAACCCCCTGCAATATCCCAGTATCAAACTCCCCTGTTTGTATGATCAGTACTAATTACAGCAGTTCTACTCTTACTATCCCTGCCTGTACTGGCTG [...]
+ACAATACTTTTAACAGACCGGAATCTTAATACAACATTTTTTGATCCCGCTGGAGGAGGAGACCCTATCCTATATCAACACCTATTCTGATTCTTCGGGCATCCTGAAGTTTACATTCTTATCCTGCCCGGATTCGGAATAATTTCTCACATTGTCACTTACTACTCAGGGAAAAAAGAGCCTTTCGGTTATATAGGAATAGTATGAGCAATAATATCTATTGGGTTTTTAGGCTTTATCGTATGAGCTCACCATATGTTTACCGTAGGAATAGATGTAGACACACGAGCATACTTTACGTCCGCCACTATAATTATCGCTATTCCAACGGGAGTAAAAGTATTTAGTTGACTGGCAACACTTCATGGAGGCAATATTAAATGATCTCCAGCTATGCTATGAGCTTTAGGGTTTATTTTCTTATTTACAGTAGGCGGGTTAACAGGTATTGTCCTAGCTAATTCGTCCTTAGACATCGTTCTTCATGATACA [...]
+TGTAGCTCATTTTCACTATGTGCTTTCAATAGGAGCAGTTTTTGCCATTATGGGAGGATTTGCCCACTGATTCCCTTTATTCTCAGGTTATACTCTTAACGATACTTGAGCAAAGATTCACTTTACAATTATGTTTGTGGGAGTAAATATAACTTTCTTCCCTCAACATTTCCTAGGTTTATCTGGAATACCTCGTCGATACTCTGACTACCCAGATGCATATACTACCTGAAATACCGTCTCCTCTATAGGATCGTTTATCTCGCTTACAGCGGTGATGCTTATAATTTTTATGATTTGGGAAGCCTTTGCATCCAAACGAGAAGTTGCTATAGTAGAACTTACTACAACTAACATTGAGTGACTACATGGATGTCCCCCTCCATACCACACGTTCGAAGAACCTACATATGTGATCCAAAAAATGGCGTACCCATTTCAACTCGGATTACAGGACGCAACCTCCCCTATTATAGAGGAGCTACTTCATTT [...]
+ATACACTAATAATTGTATTCTTAATCAGTTCTTTAGTTCTCTATATCATTTCACTAATATTGACTACAAAATTAACCCATACAAGCACAATAGACGCACAAGAAGTGGAAACAGTATGAACCATTCTACCCGCCATTATCCTAATCCTAATCGCTCTGCCTTCCCTCCGAATCCTTTATATAATGGACGAAATTAATAACCCCTCTTTAACCGTGAAAACAATAGGCCACCAATGATACTGAAGCTATGAATATACTGACTATGAAGACTTAAACTTTGACTCCTACATAATCCCAACACAAGAATTAAAGCCAGGAGAACTCCGACTATTAGAAGTAGACAACCGAGTTGTCCTCCCAATAGAAATAACCATCCGAATACTTATCTCTTCAGAAGACGTTTTGCATTCATGAGCCGTTCCATCACTAGGTCTAAAAACTGACGCTATTCCAGGACGACTAAACCAAACCACCCTTATAGCCATACGACCAG [...]
+TATGGCCAGTGCTCTGAAATCTGCGGATCTAACCACAGCTTTATACCCATTGTTCTTGAAATAGTTCCCCTATCTTACTTTGAGACCTGATCTGCCTTAATAGTAATGACCCACCAAACTCACGCTTACCACATAGTCAACCCAAGCCCATGACCGCTGACAGGAGCCCTTTCTGCCCTCCTTATAACATCGGGTCTCATCATATGATTTCACTATAACTCGATATCCCTACTTACATTAGGATTCACAACCAACCTGTTAACCATATACCAGTGATGGCGAGATGTGATCCGAGAAGGCACATTCCAAGGACATCATACCCCTATTGTACAAAAAGGGCTACGATACGGAATAGTTCTTTTTATCGTATCAGAAGTATTTTTCTTTGCAGGCTTCTTCTGAGCCTTTTACCACTCCAGCCTAGCCCCTACTCCTGAACTTGGGGGTTGCTGGCCTCCTACCGGCATTATTCCTCTTAACCCATTAGAAGTG [...]
+CAACACCTCAGTCCTCCTAGCCTCCGGAGTATCTATTACTTGAGCCCATCATAGTTTAATAGAAGGTAATCGCAAACATATACTTCAAGCCTTATTCATTACAATCTCCTTAGGCGTATATTTTACGCTATTACAGGCCTCCGAATACTATGAGACATCTTTTACAATCTCCGATGGGGTATACGGATCTACCTTTTTTATAGCCACTGGATTTCACGGATTACACGTAATTATTGGCTCTACATTCCTCATCGTGTGCTTCCTCCGACAGCTATACTACCACTTCACATCAAACCACCACTTCGGATTTGAAGCCGCTGCATGATATTGACACTTTGTTGATGTAGTCTGGCTATTCTTGTATGTATCTATTTATTGATGAGGATCCTATATGACCAACATTCGAAAAACCCACCCACTAGCCAAAATTGTTAATAACTCATTCATTGACCTCCCAGCGCCGTCTAACATCTCTGCTTGATGGAACTTCGG [...]
+TAGGAGTATGCTTGATTCTACAGATTCTAACAGGTTTATTCTTAGCTATGCACTATACATCGGACACAGCCACAGCTTTTTCATCAGTCACCCACATCTGCCGAGACGTTAACTACGGCTGAATTATCCGCTATATGCACGCAAATGGCGCTTCCATATTCTTTATCTGCCTATTCCTACATGTAGGACGAGGCCTATATTACGGATCCTATGTATTCATAGAAACATGAAACATTGGAATTGTACTATTATTCGCAACCATAGCCACAGCATTCATGGGCTATGTACTACCATGAGGACAAATATCATTTTGAGGGGCAACTGTAATCACTAATCTTCTCTCTGCCATCCCTTATATCGGAACTGACTTAGTAGAATGAATCTGAGGCGGCTTCTCAGTGGACAAAGCAACCCTAACACGATTCTTTGCATTCCATTTCATCCTCCCTTTCATCATCGCAGCTCTAGCAATAGTACACCTCCTATTTCTAC [...]
+GGATCCAACAACCCTTCAGGAATCACATCAGACTCAGACAAAATTCCATTTCACCCTTACTACACAATCAAGGATATCCTAGGAGCCTTACTCCTACTCCTAATCCTAATATCACTAGTTTTATTTTCACCTGACCTATTAGGAGACCCAGATAACTACACCCCTGCAAACCCCCTAAACACCCCTCCACATATTAAACCTGAGTGATATTTTCTATTCGCCTATGCTATCCTACGATCCATTCCTAATAAATTAGGAGGTGTACTCGCCCTAGTATTCTCCATCCTAATCTTGGCATTCATTCCACTCCTCCACACATCTAAGCAACGCAGCATAATATTCCGGCCCCTTAGCCAATGCCTATTCTGACTTTTAGTCGCCGATCTTCTCACTTTAACATGAATTGGAGGACAACCAGTTGAACACCCTTTCATCATTATCGGACAAGTCGCTTCAATCTTATATTTCACCATCTTATTGATCCTAATACCA [...]
+CGTTATCGAAAACAACCTTCTAAAATGAATGTTCTTTATCAACATTATCTCTCTTATTATCCCAATCCTTCTTGCCGTAGCCTTCCTCACCCTTGTTGAACGAAAAGTCTTAGGCTATATACAACTTCGAAAAGGACCTAATATTGTAGGCCCCTACGGCCTCCTTCAACCAATCGCAGACGCAGTAAAACTCTTCACAAAAGAACCTCTACGACCACTTACATCCTCTATATCAATATTCATTCTAGCCCCCATTCTAGCTCTATCACTAGCCCTAACTATGTGAATTCCCCTCCCAATACCCTACCCACTCATTAATATAAACTTGGGAGTCCTATTCATACTAGCAATATCAAGCCTCGCCGTGTACTCCATCCTCTGATCAGGATGAGCCTCAAACTCCAAATACGCCCTAATCGGAGCCCTTCGAGCAGTAGCTCAAACAATCTCATATGAAGTAACGCTAGCAATTATTCTCCTATCAGTCCTCCT [...]
+GGTCATTTACACTATCCACGCTAATTATTACCCAAGAACATATATGATTAATCTTTCCGGCCTGACCCCTAGCCATGATATGATTCATCTCTACCCTAGCAGAAACTAACCGAGCCCCCTTCGACTTAACTGAAGGAGAATCCGAACTAGTCTCTGGATTTAACGTAGAGTATGCAGCAGGTCCTTTTGCCCTATTCTTTCTAGCAGAGTACGCAAATATTATTATAATAAACATCCTCACAACAATTCTATTCTTCGGCGCATTCCACAACCCATTCATACCAGAACTCTACTCTATTAACTTCACTATAAAAACCCTCTTATTAACCATCTGCTTCCTATGAATTCGAGCATCATACCCTCGATTCCGCTACGATCAATTAATACACTTATTATGAAAAAATTTTCTACCCTTAACTTTAGCCCTATGCATATGACATGTTGCCTTACCCATTATCACCGCAAGTATCCCACCCCAAACAATAAAACCCC [...]
+ATTATCATCATAGCAACTATCATGACAGGAACCATAATCGTCATACTAAGCTCGCACTGATTACTGATCTGAATTGGATTCGAAATAAACATGCTAGCCATCATCCCTATTCTCATAAAAAAGTACAATCCACGAGCCATAGAGGCCTCTACAAAATATTTTCTTACACAAGCTACAGCCTCAATATTACTAATAATAGGAGTCACTATCAACCTCCTTTACTCCGGCCAATGGGTAATCTCAAAAATCTCAAACCCCATCGCATCCATCATAATAACCACTGCCCTAACAATAAAACTAGGCCTATCTCCATTCCACTTCTGAGTTCCCGAAGTAACACAGGGAGTTACGCTCATATCAGGAATAATCCTACTAACATGACAAAAAATCGCACCTATATCCATCCTATATCAAATCTCTCCATCAATTAACACTAACCTTCTTATACTAATAGCCCTCACATCCGTTCTAGTAGGAGGCTGAGGCGGACTA [...]
+TCAACTACGAAAAATCATAGCATACTCCTCCATTGCCCACATAGGCTGAATAGCCGCTATCATTACTTATAACCCTACAATAATAATTCTAAACTTAACTTTATATATTCTAATAACACTATCTACCTTCATACTATTTATATTAAACTCATCCACCACGACCCTATCTTTATCCCACATATGAAACAAATTTCCCCTAATCACTTCCATAATCTTAATCTTAATACTATCCCTAGGAGGACTACCCCCATTATCTGGCTTCATCCCCAAATGAATAATTATTCAAGAATTAACGAAAAATAACATAATTATTATTCCAACACTAATGGCTATCACCGCTCTACTTAACTTATATTTCTACCTGCGACTCACATATAGCACCGCACTTACCATATTTCCATCCACAAACAACATAAAAATAAAATGACAGTTCGAATACACAAAAAAGGCAACCCTATTACCCCCCTTAATTATTACCTCAACTATACTACT [...]
+CACCTATATTATCAGTCTTGGACATAAACGTTATATTAACTTTGATAACTAATGTAACCCTAGCATCCTTACTTGTACTAATCGCATTCTGACTTCCCCAGCTAAATATCTATACAGACAAGACAAGCCCCTACGAATGTGGTTTTGACCCCATGGGATCTGCTCGCCTACCTTTCTCTATAAAATTTTTCCTAGTTGCCATCACATTTCTGCTTTTCGACCTAGAAATTGCACTCCTACTCCCACTTCCCTGAGCGTCACAAACCAACAAGCTAACAACAATACTTATCATAGCACTCCTACTAATCTCCCTCCTAGCTGCGAGCCTAGCGTATGAATGGACCGAAAAGGGGCTAGAATGAACCGAAATGTCCATAGTATATATTAATATCTTTCTGGCATTCATTCTTTCTCTAATAGGTATACTTGTTTATCGATCACACCTAATATCATCGCTACTATGCTTAGAGGGCATAATATTATCACTATTTG [...]
+TCTGTAACTATTCTCAACAATCACCTCACATTAGCCAGCATGATACCAATCGTACTACTAGTATTTGCTGCCTGCGAAGCAGCATTAGGACTATCTCTACTAGTTATAGTATCTAACACCTACGGGACTGATTACGTACAAAACCTAAACCTTTTACAATGCATTATCATCCCTACTATCATACTAATCCCCCTTACATGAATATCAAAGCCTAACATAATCTGAATTAACACGACAACATATGGTTTGCTAATCAGCTTAATCAGCTTATTCTACCTAAACCAACCAAATGATAATACATTGAACTCCTCCTTAATATTTTTCTCTGATTCCCTATCGGCACCACTATTAGCACTTACAACATGACTTCTGCCCCTTATACTTATAGCAAGCCAACACCATTTATCAAAAGAACCCTTAACTCGAAAAAAACTATATATTTCAATACTAATTCTTCTCCAATTGTTCCTAATTATAACTTTCACTGCCTCT [...]
+CTTCTTTTACATCCTATTTGAAGCAACACTGATTCCGACCCTGATCATTATTACCCGATGAGGAAATCAAACTGAACGACTAAACGCAGGACTCTACTTCTTATTTTATACTTTAATAGGATCCCTCCCACTCCTAGTAGCTCTCCTTTATATCCACAATTTCATGGGCTCCCTAAATTTTCTCATAATTCAATACTGAATCCAGCCTCTGCCAAACTCCTGATCTAATATTTTCCTATGACTGGCATGCATAATAGCATTCATAGTAAAGATACCTCTATACGGCCTCCACTTGTGACTACCAAAAGCACACGTAGAGGCCCCTATTGCCGGCTCCATAGTACTTGCCGCTGTACTCCTAAAACTAGGAGGCTATGGCATGATACGAATTACAACCCTACTAAATCCCCTGACCAATTTCATAGCATACCCCTTCATAATATTATCTCTATGAGGCATAATCATAACAAGCTCTATCTGTCTCCGTCAAAC [...]
+AATCCCTAATTGCATACTCCTCAGTTAGTCATATGGCACTGGTTATCGTAGCGGTTCTTATTCAAACACCATGAAGTTATATAGGTGCAACAGCTCTAATAATTGCCCATGGTTTAACATCCTCAATACTATTCTGCTTAGCCAACTCCAATTACGAACGAATCCATAGCCGTACTATAATTCTCGCACGAGGACTTCAAACCCTCCTTCCCCTAATAGCAGCCTGATGACTATTAGCAAGCCTCACAAATCTGGCTCTCCCTCCAACAATTAATCTTATCGGAGAACTATTTGTAGTGATATCCTCATTCTCATGATCCAACATTACTATTATCCTAATAGGAATTAACATTACCATCACCGCCCTATACTCACTTTATATATTAATCACCACACAACGTGGTAAATATTCCCACCATATCAAAAATATCAAACCATCATTCACACGAGAAAATGCCCTAATGACCTTGCACCTACTGCCCCTACTCCTCC [...]
+AACCCTAAAATTATTCTCGGTCCCATCTACTGTAAGATAAAAGTAATAAATATATTTTCTTCATGCATAATCACAGCCCTAGTTATTCTTACTTTGCCCATCATTATATCCTCTACTAAACTTTACAAGAATAAGCTATACCCATACTATGTAAAAACCGCTACTTCTTACGCGTTCATAATTAGCATAATTCCCACAATAATATTCATCTACTCGGGACAGGAAACAATTATTTCAAACTGGCATTGAATAACAATCCAAACTATAAAACTATCCATGAGTTTCAAATTAGACTACTTCTCAATAATCTTTGTACCTGTAGCCCTTTTTGTCACGTGGTCTATCATAGAATTCTCTATATGATATATACACTCCGATCCTTACATTAACCGGTTTTTCAAGTACCTTCTCTTATTCCTCATCACTATAATAGTCCTAGTTACCGCAAACAACATATTCCAACTATTCATTGGTTGAGAAGGAGTTGGCATT [...]
+CCTACTTATTGGATGATGGTACGGCCGAACCGATGCAAATACAGCCGCCCTACAAGCCGTCCTCTACAACCGTATTGGAGATGTAGGCTTCATTATAACCATAGCATGATTTCTACTAAACTTAAACACATGAGACCTTCAACAAATCTTCATTACGACAAACGATAATTTTAATCTGCCACTACTTGGCCTACTACTAGCAGCTACCGGTAAATCTGCTCAATTCGGCCTACATCCCTGACTCCCCTCAGCCATAGAAGGCCCCACTCCTGTATCAGCCCTACTTCACTCAAGCACAATAGTTGTAGCAGGAGTATTTCTTCTTATCCGCTTTCATCCACTAATAGAGCATAACCAAACTATTCAAACCCTCACTTTATGCTTAGGGGCCATTACTACACTATTTACCGCAATCTGCGCTCTTACACAGAACGATATCAAAAAAATTGTAGCGTTCTCTACCTCAAGCCAACTAGGCCTAATAATAGTAAC [...]
+TTAACCAGCCCTACTTAGCCTTCTTACACATCTGCACTCACGCATTTTTTAAAGCCATACTATTCATATGCTCAGGGTCAATTATCCACAGCCTAAACGATGAACAAGACATTCGAAAAATGGGTGGCCTATTTAAAGTCCTTCCCTTCACCACAACCTCCCTTATTATCGGAAGCCTCGCATTAACAGGCATGCCTTTCCTTACAGGATTCTACTCCAAAGACCTGATCATCGAGTCCGCTAACACGTCGAATACCAACGCCTGAGCCCTCTTAATTACACTCGTTGCCACATCCCTAACCGCTGCCTACAGCACCCGAATTATATTCTTTGCTCTACTAGGCCAGCCCCGCTTCTCCCCTATAATCCTTATCAACGAGAATAATCCTCTCCTAATTAACTCTATTAAACGACTCCTTATCGGAAGTGTATTTGCAGGGTATATTATCTCCCACAGCATCACACCCACTACCATCCCACAGATAACTATGC [...]
+CTAAAAATGACAGCCCTTGCAGTAACCATCTTGGGTTTCATCCTGGCACTAGAACTAAACCTTACCACACAAGGACTCAAATTTAACTATCCTTCTAATTACTTTAAATTCTCCAGCCTCCTTGGCTACTATCCAACCATTATGCACCGCCTCACACCTAAAACAAGTTTAACCATTAGCCAGAAATCAGCATCTATACTTCTGGACTCCATCTGACTAGAAAACATCCTACCCAAATCAATCTCATATTTCCAAATAAAATCTTCTACCCTTATTTCAAATCAAAAAGGTCTCATCAAACTCTATTTCCTATCGTTCATACTAACTATAATCCTCAGTCTACTAATC??????CTTAATTACCACGAG
+>Cystophora_cristata
+ATGAACGAAAATCTATTCACCTCTTTCGCTGCCCCCACAATAATAGGTCTACCTATCGTACTCCTAATCACCCTGTTCCCAAGCATCTTATTTCCATCCCCCGATCGACTAATCAACAATCGACTCGCCTCAATCCAACAATGACTGATCCAATTAACATCGAAGCAAATACTGTCAATTCACAATCATAAGGGACAAACATGAGCACTTATACTTATATCACTTATTCTATTTATCGGATCCACTAACCTACTAGGCCTTATACCACATTCATTCACCCCCACCACCCAACTATCCATAAACCTAGGAATGGCCATCCCCCTGTGAGCAGGAACAGTCATCACAGGTTTTCGATACAAAACAAAAGCATCCCTAGCCCACTTCCTACCCCAAGGAACACCTCTACCCCTCATTCCAATGCTAGTAATTATCGAAACTATCAGCTTATTTATTCAACCTATAGCCCTAGCCGTACGACTAACAGCCAACATC [...]
+CCACCTATTGATTCATCTAATCGGAGGAGCTACTCTTGCCCTTATAGACATTAGCACTACCACAGCATTTATTACTTTCATCATCCTCATTCTACTCACTATCCTCGAATTTGCTGTAGCCCTCATTCAAGCCTATGTCTTTACACTACTAGTAAGCCTATACCTACATGATAACACCTAAATGCCACAGTTAGACACATCAACATGACTTATTGTAATCTTGTCCATAATCCTGACTCTATTCATTACATTTCAGCTAAAAATCTCCAAACACCTCTTCCCAATAAATCCAGAACCAAAACATACGCTGCTACTAAAAAACAGCACGCCCTGAGAAGAAAAATGAACGAAAATCTATTCACCTCTTTCGCTGCCCCCACAAATGTTCATAAATCGATGGTTATTTTCTACTAATCATAAGGATATTGGCACTCTTTATCTGCTGTTTGGTGCATGAGCTGGTATAGTGGGCACTGCCCTTAGTCTCTTAAT [...]
+AACTGGGACAACCCGGCGCCCTGCTGGGAGATGATCAAATTTATAACGTAATTGTCACTGCCCATGCATTTGTAATAATTTTCTTCATGGTGATGCCTATTATAATTGGCGGTTTTGGGAACTGACTAGTACCCCTAATAATCGGCGCTCCTGATATAGCATTCCCCCGAATAAACAATATGAGTTTCTGACTCTTGCCACCATCCTTCCTGCTACTACTGGCCTCCTCTATAGTGGAAGCGGGTGCCGGGACCGGATGAACCGTCTATCCTCCCTTAGCTGGCAACTTAGCTCATGCGGGAGCATCTGTAGACCTAACGATTTTCTCCCTTCATTTGGCAGGTGTATCGTCTATCCTCGGAGCTATCAACTTCATTACTACCATCATTAACATAAAACCCCCTGCAATGTCTCAATACCAAACTCCACTATTCGTATGATCCGTACTAATCACAGCAGTGCTCTTACTACTATCACTACCAGTTCTAGCAG [...]
+ACTATGCTACTCACAGACCGAAATCTGAACACAACATTCTTCGACCCTGCTGGAGGAGGCGATCCTATCCTATATCAACACCTGTTCTGATTCTTCGGACATCCCGAGGTATATATCCTAATCCTACCAGGATTCGGAATAATCTCACACATCGTTACCTACTATTCAGGGAAAAAAGAACCTTTTGGTTACATAGGAATAGTTTGAGCAATAATGTCCATCGGCTTCCTGGGCTTTATTGTATGAGCTCACCACATATTCACTGTAGGAATGGACGTCGACACACGAGCATACTTCACTTCAGCAACCATAATCATTGCTATTCCAACAGGAGTTAAAGTATTCAGCTGACTAGCCACCCTTCACGGGGGTAATATCAAATGGTCTCCAGCCATACTATGAGCCCTGGGCTTTATCTTCCTGTTTACAGTAGGAGGCCTCACGGGCATCGTACTAGCTAACTCATCACTAGACATTGTCCTCCATGACACA [...]
+AGTAGCACACTTCCACTATGTTCTATCAATAGGAGCGGTATTCGCCATCATGGGCGGATTCGCTCATTGATTCCCCCTGTTCTCAGGCTACACACTCGACGACACCTGAGCAAAAATTCACTTCACGATTATATTCGTAGGAGTCAATATAACATTTTTTCCTCAACACTTTCTAGGTCTATCAGGAATACCCCGACGATATTCTGACTACCCAGACGCTTACACGACATGAAACACAGTCTCCTCCATGGGCTCATTCATCTCACTCACAGCAGTAATATTAATAGTATTTATAGTCTGAGAAGCTTTCGCATCCAAGCGAGAAGTAGCAGCAGTTGAGCTGACCTCAACAAACATCGAATGACTGCATGGATGTCCCCCTCCCTATCACACATTTGAAGAACCCACTTACGTCGTACTAAAAATGGCATATCCCCTCCAAATAGGTCTACAAGATGCGACCTCTCCTATTATAGAGGAACTACTACACTT [...]
+ACACATTAATAATTGTATTCCTAATTAGCTCATTAGTACTTTACATTATCTCACTCATACTAACCACAAAACTTACCCATACAAGTACAATAGACGCACAAGAGGTAGAGACGGTATGAACAATCTTACCAGCCATCATTTTAATTCTTATTGCCCTGCCGTCACTACGAATCCTCTATATAATGGATGAAATCAACAACCCTTCCTTAACCGTAAAAACCATGGGACATCAATGATACTGAAGCTATGAATATACAGACTATGAAGACCTGAACTTTGACTCATATATGATCCCCACACAAGAACTAAAGCCCGGAGAGCTGCGACTACTGGAAGTGGATAATCGAGTGGTTCTCCCGATAGAAATAACAATCCGCATGCTAATCTCATCAGAAGATGTACTCCACTCATGAGCTGTACCATCCCTAGGACTAAAAACTGATGCTATTCCAGGACGATTAAACCAAACAACCCTAATAGCCATACGACCAG [...]
+TACGGTCAATGTTCAGAAATCTGTGGCTCCAACCATAGCTTTATACCTATTGTTCTTGAATTAGTCCCACTATCCCACTTCGAGAAGTGATCCGCCTCGATACTTATGACCCACCAAACCCATGCATATCATATAGTCAACCCCAGTCCATGACCACTAACAGGAGCTCTCTCAGCCCTTCTCATAACATCCGGCCTAATCATATGATTCCACTTTAACTCAATATACCTACTAATGCTAGGTCTTACTACCAATACTCTAACCATATATCAATGATGACGAGATATCATCCGAGAGAGTACATTCCAAGGCCACCATACTCCAATTGTCCAGAAAGGCTTGCGGTATGGAATAATCCTTTTCATCGTATCAGAAGTATTCTTCTTCGCCGGATTTTTCTGAGCCTTCTATCACTCCAGCCTAGCACCCACTCCCGAACTAGGAGGATGTTGACCACCCACAGGTATTACCCCCCTGAACCCCATAGAAGTT [...]
+AAATACCTCTGTCCTTCTAGCCTCAGGAGTATCAATCACCTGAGCTCACCATAGTCTAATAGAAGGAAACCGTAAGCACATACTCCAAGCACTATTTATTACTATCTCTCTGGGCGTTTACTTTACACTACTACAAGCCTCAGAATACTACGAGACTCCTTTCACAATTTCTGACGGGGTCTACGGCTCTACCTTCTTCATAGCAACAGGATTCCACGGACTACACGTAATTATCGGCTCAACTTTCTTAATCGTATGCTTCATACGACAACTGAAATTCCACTTTACATCTAATCATCATTTCGGCTTTGAGGCTGCTGCTTGATACTGGCACTTTGTAGACGTAGTGTGACTATTCCTATACGTATCCATTTATTGATGAGGATCTTGCATGACCAACATCCGAAAAACCCACCCACTAATAAAAATTATCAACAACTCATTCATTGACCTACCCACACCATCAAACATCTCAGCATGATGAAACTTTGG [...]
+TCGGAATCTGCTTAATCTTACAGATCCTAACAGGCCTATTCCTAGCCATACATTATACTTCAGACACAACTACAGCCTTCTCGTCAGTAACACACATCTGTCGAGACGTAAACTACGGCTGAATTATCCGATATCTACACGCAAATGGAGCCTCCATATTTTTCATCTGCCTGTACATACACGTGGGACGAGGACTGTACTACGGCTCCTACACATTTACAGAGACATGAAATATCGGCATTATCCTCTTATTTACTGTCATAGCCACAGCATTCATGGGCTACGTCCTACCGTGAGGACAAATATCATTTTGAGGAGCGACAGTCATCACCAACCTACTATCAGCAATCCCCTACATCGGAGCCGATCTAGTAGAATGAATCTGAGGGGGATTTTCAGTCGATAAAGCAACTCTAACACGGTTTTTCGCCTTCCACTTCATCCTACCATTCGTCGTATCAGCACTAGCAACAGTCCACCTACTATTCCTAC [...]
+GGATCTAATAATCCCTCCGGAATCACATCCGACTCAGACAAAATCCCATTCCACCCATACTATACAATTAAAGACATCCTAGGAGCCCTACTCCTCATCCTAGTTCTAACACTACTAGTGCTATTCTCACCCGATCTGCTAGGAGACCCCGACAACTATACCCCTGCCAACCCCCTAAGTACCCCACCACATATTAAACCTGAATGATACTTCCTATTCGCCTATGCAATCCTACGATCTATCCCCAACAAACTAGGAGGAGTACTAGCCCTAGTACTCTCCATTCTTATCCTAGCCATTATACCCCTACTCCACACATCAAAACAACGAGGAATAATATTCCGACCCATCAGCCAATGCCTGTTCTGACTTCTAGTGGCAGATCTACTCACACTAACATGAATCGGAGGACAACCAGTCGAACACCCTTATATCACCATTGGTCAACTAGCCTCAATCCTATACTTTATAATTCTCTTAGTACTCATACCC [...]
+CATCATCGAAAATAACATCCTAAAATGAATGTTTATAATTAACATCATCTCACTAATCGTCCCAATTCTCCTCGCCGTAGCTTTCCTAACGCTAGTAGAACGGAAAGTACTAGGCTATATACAACTCCGAAAAGGACCTAATATCGTAGGGCCCTACGGACTTCTACAACCCATCGCAGACGCCGTAAAACTATTCACCAAGGAACCCCTACGACCACTAACATCTTCCACAACTATATTCATTATAGCCCCCATTCTAGCCTTAGCTTTAGCCCTAACTATGTGAATCCCTCTACCTATACCATACCCCCTCATCAATATAAACCTAGGAGTACTATTTATGCTAGCAATATCAAGCCTGGCCGTCTACTCAATCCTATGATCCGGATGGGCCTCAAACTCAAAATACGCCCTAATCGGAGCCCTACGAGCCGTAGCTCAAACAATCTCATATGAAGTAACCCTAGCCATTATCCTCCTATCAGTCCTACT [...]
+GATCCTTCACCCTATCTACACTAATTATCACTCAGGAACACCTATGATTAATCTTTCCCGCATGACCACTAGCTATAATATGATTTATCTCCACCCTAGCAGAAACCAACCGCGCTCCATTCGACCTAACGGAAGGAGAGTCGGAACTTGTCTCAGGATTCAATGTAGAATACGCAGCAGGCCCATTCGCCATATTCTTCCTAGCAGAATATGCCAACATTATCATAATAAACATTCTCACAACCCTCCTATTCTTCGGAGCATTCCACAACCCATACATACCTGAACTATATACCGTTAACTTCACCATAAAAACCCTAATACTAACAATCTTGTTTCTATGAATCCGAGCATCATATCCACGATTCCGATATGACCAACTAATACATCTCCTATGAAAAAACTTCCTACCCCTTACACTAGCCCTATGTATATGACATGTAACCCTTCCCATCATCTCAGCAAGCATCCCTCCTCAAACAATAAAACCCC [...]
+ATCATTATCATATCAACCGTTATATCAGGAACCATAATCGTCCTCACAAGCTCCCATTGGCTACTAACCTGAATTGGCTTTGAAATAAACATATTAGCAATCATCCCAATCCTGATAAAAAACCATAACCCACGAGCCACAGAAGCATCCACAAAATACTTCCTAGCACAAGCCACCGCATCCATACTTCTAATAATAGGTATCATTATCAACCTAATATTCTCAGGACAATGAACAATCTCAAAAATCCCCAATCCTATCGCATCAGGCCTAATAACCATTGCCCTGGCAATAAAACTCGGCATGGCCCCCTTCCATTTCTGAGTGCCCGAAGTAGCACAAGGAATCCCACTATCCTCAGGCATAATCTTACTCACATGACAAAAAATTGCACCACTATCTATCCTCTATCAAATTTCACCATCCATCAACCCCAAACTACTAGTCACCATAGCAATCGCATCAGTACTAATCGGAGGTTGAGGAGGACTA [...]
+CCAACTCCGAAAGATCCTAGCCTACTCATCAATCGCCCACATAGGATGAATAACCACCATTCTAACATACAACCCTACTCTAATAACCCTAAACCTCATAATCTACATCACAATAACCCTAAGCACATTCATACTATTCATGCATAACTCATCTACAACAACACTATCACTATCCAATACATGAAACAAATTACCTCTCATAACATCACTAATCCTAGTACTGATAATATCACTAGGAGGCCTCCCACCCCTATCAGGCTTTATACCCAAATGAATAATCATCCAAGAACTAACAAAAAACGACATAATTATTCTACCAACATTCATAGCCATCACAGCACTCCTAAACCTATACTTCTACATACGTCTATCCTATGCCACAACACTAACCATATTCCCCTCAATAAACAACATAAAAATAAAATGACAGTTCGAAAGCACAAAAAAAATTACCCTTCTACCACCACTAATTATTATCTCAACCATACTACT [...]
+CCCCAATAACATCAATCCTAGAAATAAACATAACACTGACCTTATTCACCAACACAGCCCTAGCTTCTCTACTCGTACTAATCGCATTTTGACTCCCTCAACTGAATACATACTCAGAAAAAGCCAGCCCTTACGAATGTGGATTCGACCCCATAGGATCAGCACGCCTACCCTTCTCCATAAAATTCTTTCTAGTAGCCATCACGTTTCTACTATTCGACCTAGAAATTGCCCTACTCCTACCACTTCCATGGGCATCACATACAGACAACCTAACCACCATACTTACTATGGCATTACTACTCATCTCTCTCCTAGCCGCAAGCCTAGCCTACGAATGAACTGAAAAAGGACTAGAGTGAACAGAAATGTCCATAGTATATGCCAACATCTTCTTGGCCTTCATTATGTCTCTTATAGGACTACTTATATATCGATCCCATCTAATATCCTCCCTGCTCTGCCTAGAGGGTATAATATTATCACTATTCG [...]
+ACAGTAACAATTCTGAGTAACCATTTCACATTAGCTAGCATGGCCCCCATTGTCCTACTCGTCTTTGCTGCCTGCGAAGCAGCCCTAGGCCTGTCACTTCTAGTAATGGTATCTAACACTTACGGAACTGACTACGTACAAAATCTGAACCTCCTACAATGCATCATTCTTCCTACCATAATGCTTATACCTCTGACATGAATATCAAAACCCAACATAATCTGAATCAATACAACAGCCTACAGCCTACTAATCAGCCTCATCAGTCTATCTTTCCTAAACCAACTCGGTGACAATTGCATAAACCTATCCCTACTATTCTTCACGGACTCCCTATCAGCCCCCTTGCTAGCACTCACAACATGACTCCTGCCCTTAATAATTATAGCCAGCCAATCCCACCTGTCAAAAGAACCACTAACCCGAAAAAAGCTTTATATTACAATACTAATCCTATTACAACTATTCCTAATCATGACATTTACCGCCACA [...]
+TATATTTTACATTTTATTTGAAGCAACCCTAGTACCCACCTTAATTGTCATTACCCGATGAGGAAACCAAACAGAACGCCTAAATGCAGGAACGTACTTCCTATTTTACACTCTAGTAGGATCCTTACCCCTGCTAGTAGCACTACTATTCATTCAAAACAACATAGGCACACTAAACTTCCTAATGATTCAACTCTGGACCCAACCCCTATCAAGTTCCTGATCTAACACCCTTCTATGACTAGCATGTATAATAGCATTTATAGTAAAAATACCTCTATATGGCCTTCACCTATGATTACCTAAAGCCCACGTTGAAGCACCCATCGCTGGATCTATAGTACTAGCTGCAGTACTTCTAAAACTAGGAGGCTATGGCATGATACGAATTACGGCATTACTAAATCCACTAACAAGCTTCATAGCATACCCCTTTATAATACTGTCATTATGAGGCATAATCATAACGAGCTCCATCTGCTTACGCCAAAC [...]
+AATCCCTAATCGCATACTCCTCCGTTAGCCACATGGCCCTGGTCATCGTAGCAATTCTCATCCAAACACCATGAAGTTATATAGGAGCAACAGCTCTAATAATCGCCCACGGCCTAACATCATCCATATTATTCTGCCTAGCCAACTCCAATTACGAACGCACCCATAGCCGAACCATAATTCTTGCACGCGGACTGCAAGTGCTCCTTCCCTTAATAGCAGCTTGATGACTGTTAGCAAGTCTCACTAACCTAGCACTTCCACCTACTATTAATCTAATCGGAGAACTATTCGTAGTAATAGCCTCATTTTCATGATCTAACATTACCATTATCCTAACAGGAACCAACATCATCATTACTGCCCTATATTCACTATATATACTAATTACCACACAACGCGGCAAATATACTAGCCATATCAAAAACATTAAACCTTCATTCACACGAGAGAACACCCTAATAACACTCCATTTAATACCCCTGTTACTAC [...]
+AACCCCAAAATTATCCTAGGACCTATCTACTGTAAAATAAAAGTAATTAACTTATTTGCTTCCTCCATCATCACAACACTATCCATACTAACACTCCCAATTATCTTAACCAGCACCCCCATATACAAAAACAAGCTTTACCCACTATACGTAAAAACCACCATTTCATACGCCTTTATAATTAGCATAATCCCCACAACAATATTCATCTTCTCAGGACAAGATATAATTATTTCAAACTGACACTGAATAACAATCCAAACCATAAAACTCACACTAAGCTTCAAATTAGATTACTTCTCCATAATTTTCATACCCGTAGCCCTCTTCGTTACATGGTCTATTATAGAGTTCTCAATATGATACATAAACTCGGACCCCTTTATTAACCGATTCTTCAAATACCTACTGATATTCCTCATCACCATAATAATTTTAGTCACCGCAAACAACCTATTCCAACTATTCATCGGCTGAGAAGGAGTAGGCATT [...]
+CCTCCTTATCGGATGATGACATGGACGAACTGACGCAAACACGGCCGCCCTCCAGGCAGTCCTCTACAACCGCATCGGAGACGTAGGCTTTATCATAGCCATAGCATGATTCTTAATCAACCTAAACACATGAGAATTCCAACAGATCTTCATTACCCATCACGACAACCTGAATATACCACTAATAGGCCTCCTGCTAGCAGCAACTGGTAAGTCGGCCCAATTCGGACTCCACCCATGACTGCCCTCAGCTATAGAAGGGCCCACCCCAGTATCCGCCCTACTTCATTCAAGCACCATAGTCGTAGCAGGGGTCTTCCTCCTAATTCGATTCCACCCTCTAATAGAACACAACACAATGATACAAACAACTACTCTATGCCTAGGGGCTATTACCACCTTATTCACGGCAATCTGCGCACTCACCCAAAACGATATTAAGAAAATCATCGCATTCTCAACCTCAAGCCAACTAGGACTTATAATTGTCAC [...]
+TTAACCAGCCGCACCTAGCATTTCTACACATCTGCACCCACGCATTCTTCAAGGCTATGCTATTTATATGCTCTGGGTCTATTATTCACAGCCTAAATGATGAACAAGATGTCCGAAAAATAGGAGGCCTATACAAAGTATTACCATTTACCACCACCTCACTAATTGTAGGAAGCCTAGCACTTACAGGAATGCCCTTCCTCACAGGATTCTACTCCAAAGACCTAATCATCGAAACCGCCTCCACGTCGTATACCAACGCCTGAGCCCTACTATTAACCCTCGTTGCCACATCCATAACAGCTGCCTACAGCACTCGAATCATATTCTTTGCACTCCTGGGCCAACCCCGATTTAACCCTATAATTACAATCAACGAGAACAACCCACTCCTAATTAACTCCATTAAACGTCTACTACTAGGAAGCATTTTTGCAGGATACCTAATCTCCCACAACATTTCACCCACCTCCACCCCACAAATAACTATAC [...]
+CTAAAACTAACGGCCCTAATCGTAACACTCCTAGGCTTTATTCTAGCACTAGAATTGAACCTCACCTCACAAAACCTCAAACTCAAGTACCCATCAAACCTATTTAAATTCTCCAACCTCCTTGGATACTTTCCTACCATTATCCACCGCTACATACCAGTAACAAACTTATTAATGAGCCAAAAATTAGCCTCAACACTACTAGACATAATCTGACTAGAAAGTGCACTACCAAAATCCATCTCTTACTTCCATATAAAATCATCAACCACTGTCTCCAACCAAAAAGGCCTAATCAAACTATATTCCCTCTCCTTCATCATCACCCTAGTCCTGGCCCTAATAATA??????ATTAATTTCCACGAG
+>Enhydra_lutris
+ATGAACGAAAATCTATTTTCCTCTTTCATTACCCCTGTAGTAATAGGACTTCCTATTGTTATCGCCATTGTAATATTCCCAAGTATTATATTCCCATCACCTAGTCGACTAATCAACAACCGACTCATCTCTATTCAACAATGACTAGTACAACTAACATCAAAACAAATGTTGTCCATTCACAACCAAAAAGGACAAACCTGGGCATTAATATTAATATCCCTCATCTTATTTATTGGCTCCACCAACCTATTGGGCCTACTACCCCACTCATTTACCCCTACTACTCAATTATCCATAAACTTAGGAATGGCTATCCCCTTATGAGCAGGCACAGTAATTACTGGCTTCCGATACAAAACAAAAGCCTCCCTAGCCCATTTCTTACCACAAGGAACACCCATCCCCCTAATCCCCATACTTATTATCATCGAAACTATTAGTCTGTTCATCCAACCAATGGCTCTAGCTGTACGGCTAACAGCTAACATC [...]
+CCACTTATTAATCCACCTAATCGGGGGAGCTACCCTAGCCCTAATAAACATTAGCACTATCACAGCAGCAGTAACCTTCATCATCCTTATCCTCTTGACCATCCTGGAATTTGCAGTAGCCCTTATTCAAGCCTATGTTTTCACTCTGCTAGTAAGCTTATACTTACATGATAATACTTAAATGCCACAACTAGACACTTCAACCTGGCTTATCACGATTATATCGATAATTATCACCCTATTCATTATATTCCAATTAAAAGTATCCAAGCATTGTTTTCCAGATAACCCTGAGCCAAAATTAACGACCACATCAAAACCCACCACACCTTGAGAAGAAAAATGAACGAAAATCTATTTTCCTCTTTCATTACCCCTGTAGATGTTCATAAATCGATGATTATTCTCCACAAATCACAAAGACATCGGCACCCTTTACCTTTTATTCGGTGCATGAGCCGGAATGGTAGGCACCGCTCTCAGCCTATTAAT [...]
+AATTAGGTCAACCTGGCGCTCTATTAGGGGATGACCAGATTTATAATGTTATCGTCACCGCCCACGCATTCGTGATAATTTTCTTTATAGTAATACCAATCATGATCGGTGGGTTTGGAAACTGACTAGTACCCCTAATAATTGGTGCGCCTGACATAGCATTTCCACGAATAAACAATATAAGCTTTTGACTCCTACCCCCCTCCTTTCTACTTCTTCTAGCCTCATCTATGGTAGAAGCGGGTGCAGGAACAGGATGAACCGTATACCCCCCTTTAGCAGGTAATCTAGCACATGCAGGAGCATCGGTAGACCTGACAATTTTTTCTCTACACCTGGCAGGTGTATCGTCCATCCTAGGAGCTATCAATTTTATCACCACTATCATTAACATAAAACCCCCCGCAATATCACAATACCAAACTCCCTTATTCGTGTGATCTGTACTAATTACGGCCGTGCTTTTACTCCTATCTCTACCAGTCTTAGCAG [...]
+ACTATACTACTTACAGACCGGAATCTGAATACCACCTTTTTTGACCCAGCTGGAGGAGGAGACCCTATTCTATACCAACACTTATTCTGATTCTTCGGACACCCAGAAGTATACATTCTAATTCTGCCTGGATTCGGAATTATCTCACACGTCGTTACATACTACTCAGGAAAGAAAGAACCGTTTGGTTATATAGGAATGGTATGGGCAATAATATCAATTGGCTTCCTAGGCTTTATTGTGTGAGCCCACCACATATTTACTGTAGGTATGGATGTCGATACACGAGCATACTTTACATCAGCCACTATAATCATTGCTATCCCTACAGGGGTAAAAGTATTTAGCTGACTGGCTACTCTACACGGAGGAAATATTAAATGATCCCCAGCTATGCTATGAGCTTTAGGGTTTATTTTTCTATTTACAGTGGGTGGTCTAACGGGTATCGTATTATCAAACTCATCACTGGATATTGTTCTTCACGACACA [...]
+AGTAGCACACTTTCATTACGTTCTCTCAATGGGGGCAGTATTTGCAATTATGGGTGGATTTGTCCACTGATTCCCACTATTCACGGGTTATATACTGAATGATACTTGAGCGAAAATCCACTTCACAATTATATTTGTCGGAGTAAACATAACATTCTTTCCTCAACACTTCCTAGGCCTATCAGGTATGCCTCGACGTTACTCCGACTATCCAGATGCTTACACAACATGAAACACAGTATCTTCCATAGGCTCATTCATCTCACTAACAGCAGTAATATTAATGATCTTCATAATCTGAGAAGCCTTCGCATCCAAACGAGAAGTACTAACAGTACAACTCACTTCAACAAACATTGAATGGTTACACGGGTGTCCTCCACCATATCACACCTTTGAGGAGCCAACCTATGTACTATCGAAAATGGCGTACCCTTTCCAAATAGGCCTCCAAGATGCAACCTCTCCTATCATAGAGGAACTACTACACTT [...]
+ACACGCTAATAATCGTATTCTTAATTAGCTCTCTCGTTCTCTACATTATTTCACTGATATTGACCACTAAACTCACGCATACCAGCACCATGGACGCCCAGGCAGTCGAAACAATCTGAACCATCTTACCCGCCATCATTCTAATCCTAATCGCCCTTCCCTCACTACGAATCCTTTACATAATAGACGAAATCAACAACCCTTCCCTAACTGTAAAAACCATGGGACATCAATGATATTGAAGCTATGAATACACTGACTACGAAGACCTGAACTTCGACTCCTACATAATTCCAACTCAAGAATTAAAACCCGGAGAACTACGACTACTAGAAGTAGACAACCGAGTAGTTCTCCCAATAGAAATAACAATCCGGATGCTAATTTCATCTGAAGACGTATTACACTCATGAGCCGTGCCATCCCTAGGACTAAAAACTGATGCCATCCCTGGACGCCTGAACCAAACTACCCTAATGGCCATGCGACCGG [...]
+TACGGCCAATGCTCTGAAATCTGCGGCTCTAATCACAGCTTCATACCAATTGTTCTCGAGCTAGTGCCTCTGTCATACTTTGAAAAATGATCTGCCTCAATGCTAATGACCCACCAAACCCATTCGTACCATATAGTTAACCCAAGCCCTTGACCCCTAACAGGGGCTCTCTCAGCACTCCTCACAACATCAGGACTAGTGATATGATTTCATTTTAACTCGATATTCCTTCTAACCCTAGGTATAGTAACCAACGTACTAACTATGTATCAATGGTGACGAGATATTGTCCGAGAAGGGACATTCCAAGGCCACCACACTCCTACCGTCCAAAAAGGCCTACGATACGGAATAATCCTATTTATTACATCAGAAGTCTTCTTCTTTGCGGGCTTCTTTTGAGCTTTTTACCATTCAAGCCTAGCACCAACCCCCGAACTAGGAGGATGCTGACCCCCTACGGGCATCACACCCTTGAACCCACTAGAAGTA [...]
+TAATACTTCAGTCCTCCTAGCCTCCGGAGTCTCCATTACCTGAGCCCATCACAGCCTAATGGAAGGAGACCGCAAACACATACTCCAGGCCCTATTCATTACAATCTCCTTAGGCCTATACTTTACCCTGTTGCAAGCCTCAGAATACTACGAAGCACCATTTGCAATCTCTGACGGGATTTACGGCTCCACATTTTTCATGGCCACAGGATTCCACGGTCTCCATGTCATCATCGGATCTACCTTCCTTATTGTATGCTTCCTGCGACAATTAAACTATCACTTCACATCTAGCCATCATTTTGGATTCGAAGCAGCTGCCTGATATTGACATTTCGTAGATGTTGTGTGACTATTCCTGTATGTATCTATCTATTGATGAGGATCTTATATGACCAACATTCGTAAGACCCATCCCCTAACCAAGATCATCAACAACTCATTCATCGACCTACCCGCACCATCAAACATCTCAGCATGATGAAACTTCGG [...]
+TCGGAATTTGCTTAATCCTTCAGATTCTTACAGGTTTATTTTTAGCTATACATTATACATCAGACACAACCACAGCCTTCTCATCAGTCGCCCATATCTGCCGAGACGTCAACTACGGCTGAATTATCCGGTACATACATGCAAACGGAGCATCCATATTCTTTATTTGCCTATTCCTACATGTAGGACGAGGATTATACTATGGATCTTACATATTTTCCGAAACATGAAACATTGGTATTGTCTTACTATTCACAGTTATAGCAACAGCATTCATAGGTTACGTCTTACCATGAGGACAAATATCCTTTTGAGGCGCAACCGTAATTACTAACCTACTATCAGCCATCCCATACATCGGAACTAACCTTGTAGAATGAATCTGGGGTGGGTTCTCAGTAGACAAAGCTACCCTAACACGATTCTTCGCCTTCCACTTTATCCTGCCCTTCATCATTTCAGCACTGGCAATAATCCACCTCCTATTCCTCC [...]
+GGGTCTAACAACCCATCCGGAATCCCATCCAACTCTGACAAAATCCCATTTCACCCCTACTATACCATCAAGGACATCCTAGGCGCCCTATCCCTAGTCCTAGCGCTGACAACGCTAGTGCTATTCTCCCCCGACCTGCTAGGAGACCCCGACAACTATATCCCCGCCAACCCACTCAGTACACCACCCCATATCAAACCCGAATGATATTTCCTATTTGCATATGCAATCCTACGGTCCATCCCTAACAAACTAGGAGGAGTACTAGCCTTAATCCTATCCATCCTAATCCTAGCTATCATTCCCCTACTACACACCTCTAAACAACGAAGCATGATATTCCGCCCACTCAGCCAATGCCTGTTCTGACTATTAGTAGCTGACCTCCTTACCCTAACCTGAATTGGAGGCCAACCAGTAGAGCACCCATTCGTSGTCATCGGCCAATTGGCCTCAATTCTTTACTTTATAATTCTCCTAGTACTAATACCA [...]
+CATTATCGAAAACAACCTATTAAAATGAATGCTCATAATCAACATCATTTCACTAATTGTACCAATCTTGCTCGCCGTAGCTTTCCTGACATTAGTGGAACGAAAAATCCTAGGATACATACAACTCCGCAAGGGCCCAAATATTGTAGGACCCTACGGCCTCCTACAACCAATTGCAGACGCCGTGAAACTTTTTACTAAAGAACCCCTACGACCCTTAACATCATCTATTACTATGTTCGTAATAGCCCCAATCCTAGCCCTAGCACTAGCCCTAACCATGTGAGTCCCATTACCTATACCTTACCCCCTCGTTAACATGAACCTAGGAGTCCTATTCATACTGGCAATGTCAAGCTTAGCCGTCTATTCCATTCTATGATCCGGATGAGCCTCAAACTCAAAATACGCCCTAATCGGAGCCCTACGAGCTGTAGCCCAAACAATCTCCTATGAGGTCACACTAGCTATCATTCTTCTTTCAGTACTGCT [...]
+GCTCATTCACCCTATCCACATTAATCACCACACAAGAACACCTATGACTAATCCTCCCCGCATGACCCCTAGCCATAATATGATTTATCTCAACTCTAGCAGAAACTAACCGCGCACCCTTCGACCTAACCGAAGGAGAATCAGAACTAGTCTCAGGGTTCAATGTCGAATACGCAGCCGGACCATTCGCCCTGTTTTTCCTAGCCGAATACGCTAACATCATCATAATAAATATTCTTACAACAATCCTATTTTTCGGCGCATTCCACACCCCCTACCTACCAGAACTATACACCATCAACTTCACCGTGAAAACACTCCTACTAACAGCCTCTTTCCTATGAATTCGAGCATCTTACCCACGATTCCGCTATGACCAACTTATACACCTACTATGAAAAAACTTCCTCCCTCTAACACTAGCTCTATGCATATGACACATGGCCCTACCTATTATAACAGCAAGCATTCCTCCCCAAACAATTAAACCCC [...]
+ACCACCATCATATCAACTGTTATCTTAGGAACTATCACAGTGCTAATAAGCTCTCACTGACTGATAATCTGGATCGGATTTGAAATGAATATACTAGCCATTATCCCAGTCCTAATAAAAAGTTTCAACCCACGAACCATAGAAGCATCAACAAAATATTTCCTCGCCCAAGCCACCGCATCCATACTCCTCATACTAGGAGTCATTATCAACCTACTACTGACAGGCCAATGAACAGTACTAAACACCCCACACCCAATCACATCAAACATAATAACAGTGGCCATAGCAATAAAACTAGGACTATCACCCTTTCACTTCTGAATACCCGAAGTAGCCCAAGGAATCTCACTATCATCAGGAATAATCCTACTTACCTGACAAAAAATTGCCCCTCTATCCGTTCTATACCAAATCTCACCCTCTGTAAACCCAAACCTACTAATGACTATAGCAGCCATATCCGTGCTGGTAGGTGGATGAGGGGGTCTT [...]
+ACAACTACGAAAAATCCTAGCTTATTCATCAATCGCTCATATGGGATGAATAGTCGCCGTAACAACATACAACCCCACCCTAATATTACTAAACCTTACAATCTACATTATAATAACACTAGGAACATTCATACTATTTATCCTCAGCTCATCCACAACTACACTATCATTATCCCACATATGAAACAAAACCCCATTAATCACTTCACTAGTCCTAGCAATTATACTCTCCTTAGGAGGCCTGCCTCCTCTGTCAGGATTTATCCCCAAATGAATAATCACTTACGAACTTACAAAAAATAACATGGTCACTGCAGCAATATTCATGGCAATAACAGCCCTACTAAACCTATATTTCTACATACGACTAACATATGCAACAGCACTAACCATGTTCCCTTCAACAAACGCCATAAAAATAAAATGACAATTCGAAAACATAAAAAACACCACCCTAATGTCTCCTCTAATTGTATCCTCAACTATACTACT [...]
+CCCCAATAATACTAGCAATATTCATAAACATAATACTGACCCTACTCACTAACATATCGCTAGCATCTCTACTCATCCTAATCGCATTCTGACTACCCCAACTAAATATCTACATAGAAAAAGCAAGTCCATATGAATGCGGTTTTGACCCACTAGGATCAGCACGTCTGCCTTTCTCTATAAAATTCTTCCTAGTAGCCATCACATTCTTACTGTTTGACTTAGAAATCGCATTACTTCTCCCATTACCATGAGCCTCACAATCAAACAACCTAGAAACGACACTCATTACAGCACTAACATTAATTTCCATCCTAGCCGTAAGCTTAGCCTACGAGTGGACCGAAGAAGGCTTAGAATGGAATGAAATGTCCATAGTGTATATTAATATCTTCCTAGCCTTTATCTTATCCTTCATAGGACTACTCATATACCGATCTCACCTCATATCCTCCCTACTCTGTCTAGAAGGTATAATACTATCCCTATTCG [...]
+ACAATCACAATCCTGGTAAACCACTTCACACTAGCCAGTATAACCCCTATCATCTTGCTTGTATTCGCGGCCTGTGAAGCAGCCCTAGGACTATCACTGCTAGTCATAGTCTCCAACACATATGGAACGGATTACGTACAAAACTTAAATCTACTACAATGTATTATTCTCCCAACCATAATACTGATTCCCCTGGCGTGACTATCAAAATATAACATAATCTGAATCAATACAACAGCTTATAGCATACTAATCAGCCTAATTAGCCTAACATATTTTAATCAGTCCCCAGACAATAATCTAAGCTTCTCATTACTCTTTTTCGCAGACTCCTTATCAGCACCCCTACTAACACTCACAACATGACTTCTCCCTCTAATGCTTATAGCAAGCCAACACCACCTATCGAAAGAAACCCTCATTCGTAAAAAACTGTATATCACAATATTAATCACACTTCAACTACTCCTAATTATAACATTCACCTCCACA [...]
+TATGTTCTACATCCTATTTGAAGCCACACTCATACCAACACTAATTATTATCACCCGATGAGGCAACCAAACAGAACGCCTAAACGCTGGCCTATACTTCCTATTCTACACCCTAGTAGGCTCTTTACCCCTTCTGATCGCTCTATTATGAACCCAGAACAATCTAGGCACCCTACACCTACTGGTAATCCAATTCTGAGTTCAACCCCTGCCAAACACCTGATCCAACACACTACTATGATTAGCATGCATAATGGCATTCATAGTAAAAATACCGCTATACGGCCTTCACCTATGACTCCCGAAAGCCCACGTAGAAGCCCCTATTGCGGGATCCATAGTCCTTGCCGCCGTACTCCTAAAACTGGGAGGATATGGAATAATACGAATTACCATACTACTAAACCCACTAACAAACCACATAGCCTATCCCTTCATGATACTATCCCTATGAGGGATAATCATGACAAGCTCTATCTGCTTGCGCCAAAC [...]
+AATCCCTAATTGCCTACTCCTCAGTAAGCCACATGGCCCTAGTAATCATAGCAGTACTCATTCAATCACCATGAAGTTACACAGGAGCAACAGCCCTAATAATCGCCCACGGTCTAACATCATCCCTATTATTCTGCTTAGCCAATTCCAACTATGAACGTATCCACAGCCGCACTATAATCCTCGCACGAGGCTTACAAATACTCTTACCATTAATAGCTGCATGATGATTACTCGCTAGCCTAACCAACCTAGCCCTACCACCCACTATCAACTTAGTAGGGGAACTATTCGTAGTAATAGCCTCATTCTCATGGTCCAACATCACCATCATCCTACTAGGAATTAACATCACCATCACTGCCCTATACTCCCTGTTCATACTAATCACCACGCAACGCGGGAAACTCACACATCATATCAAAAATGTTAACCCATCATTCACACGGGAAAATTCTCTAATGGCCCTCCACCTATTACCCCTACTACTCC [...]
+AACCCTAAAATTATCTTAGGCCCCATCTACTGTAAAATAAAAGTAATCAACCTATTCACTTCCTCCATCCTCGTAACACTATTCATACTAACCCTCCCCATCATAATAACCAACACTACCCTTTATACCAATAAACTATATCCCCAATACGTAAAAACCACTATCTCACATGCTTTTATAATAAGCCTGATCCCCACAATAATATTTCTCTACTTAGGGCAAGACACAATAATTTCAAACTGACACTGAATTACAATTCAAACTGTAAAACTCTCCCTCAACTTTAAACTTGATTACTTCTCAATAATCTTCATACCGGTAGCACTATTCGTCACATGATCAATTATAGAATTCTCAATATGATACATACACTCAGACCCCTACATCAACCGATTCTTCAAATATTTACTTCTTTTCCTAATCACTATAATAATCCTAGTCACCGCCAACAATATATTTCAACTATTTATCGGATGGGAAGGAGTAGGTATT [...]
+TCTACTTATCGGATGATGATACGGGCGAACAGACGCCAACACAGCCGCACTACAGGCCATCTTATACAACCGTATTGGAGATGTAGGGTTCATCTTAGCCATGGCCTGATTCCTAGCCAACCTAAACACCTGAGATCTACAACAAATCCTCATAACCGACCACAAAAATCTGAACCTCCCTCTCACAGGCCTATTATTGGCAGCTACCGGAAAATCCGCACAATTTGGCCTACACCCATGATTGCCCTCGGCCATAGAAGGTCCAACCCCTGTATCAGCCCTACTGCATTCAAGCACTATGGTTGTAGCAGGAGTATTTTTGCTAATCCGATTCCATCCCCTAATAGAACATAACAAAACAATTCAAACCATCACACTATGCCTAGGAGCAATCACAACCCTATTCACAGCAATTTGTGCCCTAACACAAAACGACATCAAAAAAATTATCGCTTTCTCCACTTCAAGCCAACTCGGACTAATAATCGTAAC [...]
+TCAATCAGCCCTACCTAGCGTTTCTCCATATCTGTACACATGCATTCTTCAAAGCCATATTATTCATGTGCTCTGGATCAATCATTCACAACCTAAACGATGAACAAGACATCCGAAAAATAGGAGGACTATACAAAGCCCTTCCATTTACCACCACCTCCCTGATCGTCGGAAGCCTAGCACTCACAGGAATACCATTCCTAACAGGATTTTACTCTAAAGACCTAATTATCGAAACCGCTAACACGTCATATACCAACGCCTGAGCCCTTCTAATTACCCTCATTGCCACCTCCATAACAGCTGCCTATAGCACTCGAATCCTATTTTTCGCACTCCTAGGACAACCCCGCTTCAACCCTGTCGTCGCAATCAACGAGAATAATCCCCTCCTAATCAACTCCATTAAACGTCTCCTACTCGGGAGTATCTTCGCAGGATTCCTAATCTCCTACAACATCACACCCACCACCACCCCACAGATAACTATGC [...]
+CTCAAAATAATAGCCCTCACCATAACCATCTTAGGTTTCATTTTGGCACTAGAACTTAACCTCACAATACAAAGCCTAAAATTTAAATATCCCTCGAACCTATTCAAATTCTCAAACATACTAGGCTACTTCCCAACTACTATTCACCGCCTAATACCCAAAATAAATCTACTCATAAGCCAAAAATCAGCATCAACACTGTTAGATATAATTTGACTAGAAAAGATCTTACCAAAATCCATCTCCCACTTCCAAATAAAATCTTCAATCACCGTCACTAACCAAAAAGGCCTAATCAAACTATACTTCTTATCATTTATACTAACCCTGACTCTAAGCCTACTCGTA??????CTTAACTTCCACGAG
+>Erignathus_barbatus
+ATGAACGAAAATCTATTCGCCTCTTTCACTACCCCTACAATAATAGGTCTTCCTATCGTTATCCTAATTATCTTATTTCCAAGTATTCTATTTCCCTCTCCCAATCGACTAGTTAATAATCGTCTTACCTCAATCCAACAATGACTAATTCAACTGACATCAAAACAAATACTGTCAATTCACAACCACAAAGGACAAACGTGAGCACTAATACTTATATCACTAATCCTATTTATCGGAACCACCAACCTATTAGGCCTTCTACCACATTCATTCACCCCTACCACCCAACTGTCTATAAATCTAGGGATAGCCATTCCCTTATGAGCAGGAACAGTCATCACAGGATTCCGATACAAAACGAAAGCATCTTTAGCCCACTTTCTGCCCCAAGGAACACCTTTACTCCTTATCCCAATACTGGTAATCATCGAAACTATTAGCCTATTTATTCAACCTATAGCCCTAGCCGTACGGTTAACAGCCAATATT [...]
+CCACCTACTAATTCACCTAATTGGAGGGGCCACCCTCGCCCTTATAGATATCAGCACCACTACGGCACTTATTACTTTTACCATCCTCATTCTACTTACCATCCTTGAATTCGCTGTAGCCCTCATTCAAGCCTACGTCTTTACCCTACTAGTAAGCTTATATCTACATGACAATACCTAAATGCCACAACTAGATACATCAACATGGTTTATTGTAATTCTATCAATAATCCTAACCCTATTCATCACATTTCAACTAAAAATCTCCAAGCATCTCTTTCCAATGAACCCAGAACCAAAACAGACTACACCACTAAAAAACAACACGCCTTGAGAAGAAAAATGAACGAAAATCTATTCGCCTCTTTCACTACCCCTACAAATGTTCATAAATCGATGATTATTTTCTACAAATCATAAAGATATCGGTACCCTCTACTTACTGTTCGGTGCATGAGCTGGTATAGTAGGCACCGCCCTCAGTCTCTTAAT [...]
+AACTAGGACAGCCTGGCGCTCTACTAGGAGATGATCAAATCTACAACGTGATTGTCACCGCTCACGCATTTGTAATAATCTTCTTCATGGTGATACCTATTATAATTGGCGGCTTCGGGAACTGACTAGTGCCCCTAATAATTGGCGCTCCTGACATAGCATTCCCTCGAATAAATAATATAAGTTTCTGACTTCTACCACCATCCTTCCTACTACTACTGGCTTCCTCCATAGTAGAAGCAGGTGCCGGAACTGGATGAACCGTCTACCCTCCTCTAGCCGGTAATTTAGCCCATGCAGGAGCATCCGTAGACCTAACAATCTTTTCCCTTCACCTGGCAGGTGTATCGTCCATTCTTGGCGCTATCAACTTTATTACTACCATCATCAACATAAAACCTCCTGCAATATCCCAATATCAAACCCCGCTGTTCGTATGATCCGTATTAATCACAGCAGTACTTCTACTGCTATCACTACCAGTTCTAGCAG [...]
+ACCATACTACTCACAGACCGAAACCTAAATACAACATTTTTCGACCCTGCAGGAGGAGGTGACCCTATTCTATATCAACACCTATTCTGATTCTTTGGACATCCCGAAGTATATATCTTAATTCTTCCAGGGTTCGGAATAATTTCACACATCGTTACCTATTATTCAGGGAAAAAAGAACCTTTCGGTTATATGGGAATAGTATGAGCAATAATGTCCATCGGCTTCCTGGGTTTCATTGTATGAGCCCACCATATATTCACTGTAGGAATAGACGTTGACACACGAGCATACTTTACCTCAGCTACTATAATCATCGCAATTCCAACAGGAGTCAAAGTATTCAGTTGACTGGCCACTCTACACGGGGGTAATATTAAATGATCCCCAGCTATGCTATGAGCCCTAGGTTTTATCTTTCTATTCACAGTAGGGGGCCTCACAGGTATCGTTCTAGCAAACTCATCACTGGACATCGTTCTTCACGACACA [...]
+AGTAGCACACTTCCACTATGTCTTATCAATAGGAGCAGTATTTGCTATCATGGGTGGATTTGTTCACTGATTCCCCCTATTTTCAGGCTACACACTCGATGATACCTGAGCAAAAATTCACTTCACAATTATATTTGTAGGGGTTAATATAACATTCTTTCCCCAACACTTCTTAGGCCTATCAGGAATACCACGACGATATTCCGACTATCCAGATGCCTACACAATATGAAATACAGTTTCCTCTATAGGCTCATTCATTTCACTCACAGCGGTAATGCTAATGGCATTCATAATCTGAGAAGCCTTCGCGTCTAAACGAGAAGTAGCAGCAGTTGAACTGACTACAACTAATATCGAATGACTGCACGGATGCCCCCCTCCCTACCATACATTTGAAGAACCTACTTACGTTGTATTAAAAATGGCATACCCCCTCCAAATAGGCCTACAAGACGCAACCTCCCCTATTATAGAAGAATTGCTACACTT [...]
+ACACATTAATAATCGTATTTCTAATTAGCTCATTAGTACTATATATTATCTCACTCATGCTAACCACAAAACTCACCCATACAAGCACAATAGATGCACAGGAGGTAGAAACAGTATGAACAATTCTGCCCGCTATTATCTTAATTTTAATCGCCCTACCATCACTACGAATCCTCTATATAATAGACGAAATCAACAACCCCTCCTTAACCGTAAAAACTATAGGACATCAATGATACTGAAGCTATGAATACACAGACTATGAAGACCTAAACTTTGATTCATACATAATCCCTACGCAAGAACTAAAACCTGGAGAACTACGACTATTAGAAGTAGATAATCGAGTAGTTCTTCCAATAGAAATAACTATTCGCATGCTAATCTCGTCAGAAGACGTACTTCACTCATGAGCCGTACCATCCCTAGGACTAAAAACTGACGCCATCCCAGGACGACTAAACCAGACAACCCTAATGGCTATACGACCAG [...]
+TACGGTCAGTGTTCAGAAATCTGCGGTTCCAACCATAGCTTTATACCTATTGTTCTCGAATTAGTCCCATTATCTCACTTCGAGAAATGATCTACCTCAATGCTTATGACCCACCAGACCCATGCATATCATATAGTCAACCCCAGTCCATGACCTTTAACAGGAGCTCTCTCAGCCCTTCTTATGACATCCGGCCTAATTATATGATTTCACTTTAACTCAGTATACCTACTTCTCTTAGGTCTCACAACCAATACTCTAACTATATACCAATGATGACGAGACATTATCCGAGAAAGCACATTCCAAGGCCACCATACCCCAATCGTCCAAAAAGGCTTACGATATGGCATAATCCTCTTTATTGTATCAGAAGTATTTTTCTTTGCCGGTTTTTTCTGAGCCTTCTACCACTCCAGCCTAGCACCTACCCCTGAACTAGGAGGATGTTGACCACCCACAGGCATTACTCCCCTGAACCCTATAGAAGTC [...]
+AAATACTTCTGTACTTTTAGCCTCGGGAGTATCAATTACCTGAGCCCATCACAGCCTAATAGAAGGAAATCGCAAACACATGCTTCAAGCACTATTTATCAGCATCTCCTTAGGTATTTACTTCACACTACTGCAGGCCTCAGAGTACTACGAAACCTCCTTCACAATTTCCGATGGAATCTACGGATCCACTTTCTTTATAGCAACAGGATTCCACGGGTTACACGTAATTATTGGCTCAACTTTCCTAATTGTGTGCTTCATACGACAATTGAAATTCCACTTCACATCCAACCACCATTTTGGATTTGAAGCCGCCGCTTGATACTGACATTTCGTAGACGTAGTATGACTATTCCTATACGTATCTATTTATTGATGAGGATCCTGCATGACCAACATCCGAAAAACTCACCCACTAATCAAAATCATCAACAGCTCATTCATCGACCTACCCACACCGTCAAACATCTCAGCATGATGAAACTTCGG [...]
+TCGGGATCTGCCTTATTTTACAAATCCTAACAGGCCTATTCCTAGCCATACATTACACCTCAGATACAACCACAGCTTTCTCATCAGTAACCCATATCTGTCGAGACGTAAATTATGGCTGAATTATCCGATATATACACGCTAACGGAGCTTCTATATTCTTCATCTGCCTATACATACATGTAGGACGAGGACTATACTACGGCTCTTATACATTTATAGAAACATGAAACATCGGCATTATCCTACTATTCACCGTCATAGCCACAGCATTCATAGGCTACGTCCTACCATGAGGGCAAATATCATTTTGAGGAGCAACCGTTATCACCAACCTACTATCAGCAATCCCCTACATCGGGACTGATCTAGTACAATGAATCTGAGGAGGATTCTCAGTTGACAAAGCAACCCTAACACGATTCTTCGCCTTCCACTTTATCCTACCATTTGTAGTATTAGCATTAGCAGCAGTCCACCTATTATTCCTAC [...]
+GGATCCAACAACCCCTCTGGAATCTCGTCCGACTCAGATAAAATTCCATTCCACCCATACTATACAGTCAAGGACATCTTAGGGGCCTTACTTCTAATCCTAGTTCTTATACTTCTAGTGCTATTCTCACCCGACCTACTGGGAGATCCCGACAACTACACTCCCGCTAACCCCCTAAGCACCCCACCACATATTAAGCCCGAATGATATTTCCTATTCGCCTATGCAATCCTACGATCCATCCCCAACAAACTTGGAGGAGTACTAGCCCTAGTGCTCTCTATCCTAATCCTCGCCATCGCTCCCCTACTCCATACATCAAAACAACGAGGAATAATATTCCGACCCATCAGCCAATGCTTGTTCTGACTACTGGTAGCAGACCTACTTACTCTAACATGAATCGGAGGACAACCAGTCGAACACCCCTACATCACCATCGGACAATTAGCCTCAATCCTATACTTTGCAATCCTCCTAGTATTTATGCCC [...]
+CATTATCGAAAATAATATCCTAAAATGAATGTTTATAATTAACATTATCTCACTAATCATCCCAATCCTCCTTGCTGTAGCTTTCCTAACATTAGTAGAACGAAAAGTACTAGGCTACATACAACTCCGAAAGGGACCCAACATCGTAGGACCCTACGGACTCCTACAACCCATTGCGGACGCTGTAAAACTATTCACCAAAGAACCCCTACGACCTTTAACATCCTCTACAACCATATTTATTATAGCCCCTATTCTAGCCCTAGCCCTAGCCCTAACCATATGAGTTCCCCTACCCATACCATATCCCCTCATCAACATAAACCTAGGAGTACTATTCATACTAGCAATATCAAGCCTAGCCGTTTACTCAATTCTATGATCTGGATGAGCCTCAAACTCAAAATACGCCCTAATCGGAGCCTTACGAGCCGTAGCCCAGACAATCTCATACGAAGTAACCCTAGCCATCATTCTCCTATCTGTTCTACT [...]
+GATCCTTCACTCTATCCACACTAATTACCACCCAAGAACACCTATGACTAATCTTCCCCGCATGACCATTAGCCATAATATGATTCGTATCCACCCTAGCAGAAACTAACCGCGCCCCATTCGACCTAACAGAAGGAGAATCAGAACTCGTATCAGGATTTAATGTAGAATACGCAGCAGGCCCATTCGCCATATTCTTCCTAGCAGAATACGCCAACATCATCATAATAAACATCTTTACAACCCTCCTATTCTTCGGAGCATTCCACAATCCATACATACCTGAACTATACACTATCAACTTTACCACAAAAACCCTAACACTAACAATCCTATTTCTATGAATCCGAGCATCATACCCACGATTCCGATACGACCAACTAATACATCTTCTATGAAAAAACTTCCTACCCCTCACATTAGCCTTATGCATATGACACGTAACCCTACCTATCATCTCAGCAAGCGTCCCTCCTCAAACAATAAAACCCC [...]
+ATTATCATCACAACAACCGTTATATCAGGAACCATAATCGTCCTTACAAGCTCCCATTGACTATTAACCTGAATCGGATTTGAAATAAACATACTAGCAATTATTCCAATCCTAATAAAAAAATATAACCCACGGGCTATAGAAGCATCCACAAAATACTTCCTAACACAAGCCACCGCATCCATAATCCTGATAATAGGCATCATTATCAATCTGATGTTCTCAGGACAATGAACAATCTCAAAAATCCCCAACCCCATCGCATCAAGCCTAGTAACCATTGCCCTAACAATAAAACTCGGCATAGCCCCCTTCCACTTCTGAGTACCTGAAGTAACACAAGGAATCCCACTGTCCTCGGGTATAATCCTGCTAACATGACAGAAAATTGCGCCACTATCCGTCCTCTACCAAATCTCACCATCTATCAACCCTAAACTACTAATCACCATAGCAATCGCATCAGTACTAATTGGAGGCTGAGGAGGACTA [...]
+TCAACTCCGAAAAATCATAGCCTACTCATCAATCGCCCACATAGGATGAATAGCTATTATCCTAACGTACAATCCCACCCTAATAGTCCTAAACCTCGTAATTTACATCACAATAACTCTAAGCACATTCATATTATTTATACACAACTCATCCACGACGACACTATCACTATCCCATACATGAAACAAACTACCACTCATAACATCCCTAATCTTAACACTAATAATATCCCTAGGAGGCCTTCCACCCCTTTCAGGCTTTACACCTAAATGAATGATTATCCAAGAATTAACAAAAAATGACATAATTATCCTACCGACATTCATAGCTATCACAGCACTCCTAAACCTGTACTTCTACATACGACTATCCTACACCACAACACTAACTATATTCCCCTCAGTAAACAACATAAAAATAAAATGACAATTTGAGAGCACAAAAAAAATCATCCTCCTGCCACCACTAATCATCGCCTCAACCATACTACT [...]
+CCCCAATGATATCAATCCTAGAAATAAACATAGTATTAACCCTATTTACCAATACAATCTTAGCCTCTCTGCTTATGTTAATCGCGTTCTGACTCCCTCAACTAAATACATACTCAGAAAAAGCCAGCCCCTACGAATGTGGATTCGACCCTATAGGATCGGCACGCCTGCCCTTCTCCATGAAGTTTTTCCTAGTAGCTATTACATTTCTACTATTCGACCTAGAGATTGCCCTACTTTTACCACTTCCATGAGCATCTCATACAGATAACTTAACCACCATACTCACCATAGCGCTCCTACTCATCTCACTCCTGGCCGCAAGCCTAGCCTATGAATGAACTGAAAAAGGACTAGAATGAACAGAAATGTCCATAGTATACGCCAACATCTTCTTGGCCTTCATCATATCTCTCATAGGGCTGCTCATATACCGGTCCCACCTAATATCTTCTTTACTCTGCCTAGAAGGTATAATATTATCATTATTCG [...]
+ACGGTAACAATTCTAAATAACCACTTCACATTAGCCAGCATAACTCCTATTATCTTACTCGTCTTCGCCGCCTGCGAAGCAGCCCTAGGATTATCACTCCTAGTAATGGTATCCAATACATACGGAACTGACTACGTACAGAATCTAAATCTTCTACCATGCATTATCCTCCCTACTATAATACTTATACCCTTGACATGAATATCAATATCTAGTATAATCTGAATTAACACAACAATCTACAGCCTACTAATTAGCCTCATTAGCCTATCCTTTCTAAATCAACCCGGCGACAACTGCATAAATCTATCCCTATTATTCTTTACAGACTCCCTATCAGCCCCTTTACTAGCACTTACAACATGACTCCTACCCTTAATACTCATAGCTAGCCAGCACCACTTATCAAAAGAATCACCAACCCGAAAGAAATTATTCATCACAATACTAATTCTACTACAGCTATTCCTAATCATGACATTTACCGCCACA [...]
+CATATTCTATATCCTATTTGAAGCAACCCTAGTACCTACTCTAATCATTATTACCCGGTGAGGAAATCAAACAGAACGTCTAAACGCAGGGATATACTTCCTATTTTATACCCTAACAGGATCCCTACCCCTACTGGTAGCACTATTATTTGTCCAAAATAACATAGGTACGTTAAACTTCCTGATAATTCAACTCTGAACCCAACCTATATCAAACTCCTGATCCAATATTCTCCTATGACTAGCATGTATGATGGCGTTCATGGTAAAAATACCCCTATACGGCCTTCACCTATGACTACCCAAAGCCCACGTAGAAGCACCTATCGCCGGATCCATAGTACTAGCCGCAGTGCTCCTAAAATTAGGAGGCTATGGTATGATACGAATTACAACACTTCTAAACCCACTAACAAGCTTCATAGCATACCCCTTTATAATACTATCGCTATGAGGTATAATCATAACAAGCTCCATCTGCTTACGCCAAAC [...]
+AATCCCTAATCGCATACTCCTCTGTCAGTCATATAGCCCTAGTTATTGTAGCAATCCTAATTCAAACACCATGAAGTTACATAGGAGCAACAGCCTTAATAATTGCCCACGGCTTAACATCTTCTATACTTTTCTGCCTGGCTAACTCCAATTACGAACGTACCCACAGCCGAACTATAATCCTCGCACGTGGACTGCAAGTACTCCTCCCCCTAATAGCAGCATGATGACTGTTAGCAAGTCTCACTAACTTAGCACTTCCCCCCTCCATCAATCTAATTGGAGAACTGTTCGTAGTAATAGCCTCATTCTCATGATCTAATATCACTGTTATCCTAATAGGAGCTAACATCATCATTACCGCCCTATACTCACTATATATACTAATTACCACACAACGCGGCAAATACACCCATCATATTAAAAATATTAAACCCTCATTCACACGAGAAAACGCTCTAATAATACTCCACCTAATACCTCTCCTGCTAC [...]
+AACCCCAAAATCATCCTAGGACCCATCTACTGTAAAATAAAAGTAATTAACCTATTTGCCTCCTCTATCATCACATCATTATTTATACTCACACTTCCAATTATTTTGACTAGCACTCCAATCTACAAAAATAAACTTTACCCACAATACGTAAAAACCACTATCTCATATGCCTTCATAGTCAGCATAATCCCCACAACAATATTCATCTACTCAGGACAAGAGATAATTATCTCAAACTGACACTGAATAACTATCCAAACCACAAAACTCACACTAAGCTTTAAACTAGATTACTTCTCCATAATTTTCATACCCGTAGCCCTTTTCGTTACATGATCTATCATAGAATTTTCAATATGGTACATACACTCAGACCCCTTTATCAACCGATTCTTCAAATACCTACTAATATTCCTCATTACCATAATAATTTTAGTTACCGCAAACAACCTGTTTCAACTATTCATCGGCTGAGAAGGAGTAGGTATC [...]
+CCTCCTCATTGGATGATGACACGGACGAACCGACGCAAACACAGCCGCCCTCCAAGCAGTCCTTTACAACCGCATTGGAGACGTAGGCTTCATCATGGCTATAGCATGATTTCTAATTAACTTAAACACATGAGAATTCCAACAGATTTTTATTACCCACCACAACAACCTAAATATACCACTCATAGGTCTTCTACTAGCAGCAACCGGAAAATCAGCCCAATTCGGACTTCACCCATGACTACCCTCAGCCATGGAAGGACCTACCCCAGTATCCGCCCTACTACACTCAAGCACTATAGTAGTAGCAGGAGTATTTCTCCTAATCCGATTTCACCCATTAATAGAACATAACATAATAATACAAACAATTACCCTTTGCCTTGGAGCTATCACCACTCTATTCACAGCAATCTGCGCACTAACCCAAAATGACATCAAGAAAATCATCGCATTCTCAACCTCAAGCCAGCTAGGACTAATAATTGTCAC [...]
+TTAATCAACCATATCTAGGCTTCCTACATATCTGCACCCACGCATTCTTTAAGGCCATACTATTCATATGCTCCGGATCCATTATCCACAGCCTAAATGACGCACAAGACATTCGAAAAATAGGAGGCTTATACAAAGTTCTACCATTTACCACCACCTCACTAATCGTAGGAAGCCTAGCACTTACAGGAATACCATTCCTCACAGGATTCTACTCCAAAGATCTAATCATCGAAACCGCCAACACGTCGTATACCAACGCCTGAGCCCTACTACTAACCCTCATCGCCACATCCATAACGGCCGCCTACAGCACCCGAATTATATTCTTCGCACTCCTAGGACAACCCCGCTTCAGCCCCATAATCACAACCAACGAGAACAGCCCACTCCTAATCAACTCTATCAAACGTCTACTACTAGGAAGCATTTTTGCAGGTTACCTAATCTCCTACAACATTACACCTACTACCACCCCACAAATAACCATAC [...]
+TGGAAATTAACAGCCCTAGCCGTAACACTCCTAGGCTTCATATTAGCACTAGAACTAAATCTTGCCTCACAAAACCTTAAACTCACATACCCATCAAACCTATTTAAATTCTCCAACCTCCTTGGATACTTTCCCACTATCATGCACCGCTACATACCATCAATCAACCTATCAATGAGCCAAAAACTGGCTTCAACACTAATGGATACAATCTGACTAGAAAATACACTACCAAAATCTATCTCTTATTTCCACATAAAATCATCAATTACCGTCTCTAATCAAAAAGGCCTAATCAAACTATATTTTCTCTCCTTCATCATCACCCTAATCCTAGCCTTAATAATA??????ACTAATTTCCACGAG
+>Eumetopias_jubatus
+ATGAACGAAAATCTATTCACCTCTTTCGCTTCCCCTACAATAATAGGCCTTCCCATCGTAACCCTAGTCATTCTATTTCCAAGTATACTATTTCCTTCACCAAGCCGACTAATCAACAACCGCCTTACCTCCATTCAACAGTGACTTATCCAATTAACATCAAAACAAATAATATTAATACATAATCACAAAGGACAAACATGAACATTAATACTTATATCACTCATCATATTTATTGGATCTACTAATCTACTGGGCCTACTACCGCACTCATTTACCCCCACTACCCAACTATCTATAAATCTAGGAATAGCCATCCCCCTATGAGCAGGGACAGTCGCCATAGGGTTACGACACAAAACTAAAGCATCCTTAGCCCACTTCCTACCCCAGGGAACACCCTCCCCCCTCATCCCAATATTAGTAATCATCGAATCTATTAGCTTACTCATCCAACCCATAGCCTTAGCCGTACGACTAACAGCCAACATC [...]
+CCACCTACTAATTCACCTAATCGGTGGGGCCACCCTAGCCCTTATTAACATCAGTATAATTTCGGCCTTTATCACCTTCATTATCCTCACCCTACTTACAATCCTTGAGTTCGCTGTAGCCTTAATCCAAGCCTACGTCTTCACTTTACTAGTAAGCCTATACTTACACGATAACACCTAAATGCCACAACTAGACACATCAACATGGTTAACTACAATCGTATCCATGATCCTAACACTATTTATCGTATTTCAACTAAAAATTTCCAAACACCACTTTCCAATAAGCCCAGAACTGAAACCATTATCAACATCAAAAACCTATACCCCCTGAGAAAAAAAATGAACGAAAATCTATTCACCTCTTTCGCTTCCCCTACAAATGTTCGTAAATCGATGATTATTCTCTACAAATCATAAGGATATTGGCACCCTCTATCTACTATTCGGTGCATGAGCCGGAATGGCTGGCACCGCCCTCAGCCTATTGAT [...]
+AATTAGGCCAACCAGGCACTCTACTGGGGGACGACCAAATCTACAATGTAATTGTCACCGCCCACGCATTCGTAATAATCTTTTTCATAGTAATGCCTATTATAATTGGAGGCTTTGGAAATTGATTAGTACCCCTAATAATTGGAGCTCCCGACATGGCATTTCCCCGAATAAACAACATAAGTTTCTGACTTCTACCCCCCTCCTTTCTACTACTACTAGCTTCTTCTCTAGTTGAAGCCGGCGCGGGTACCGGATGAACGGTTTACCCTCCCTTAGCAGGAAATCTAGCCCATGCAGGAGCTTCCGTAGATTTAACTATTTTCTCCCTTCACCTGGCAGGAGTATCATCTATTCTAGGAGCCATCAACTTTATTACTACCATTATCAACATGAAACCCCCTGCTATATCTCAATACCAAACTCCCTTATTCGTGTGATCTGTACTAATCACGGCAGTACTGCTTCTACTATCCCTACCAGTACTAGCAG [...]
+ACCATACTACTTACGGACCGAAATCTAAATACAACCTTTTTCGATCCGACCGGAGGGGGTGACCCTATCCTATATCAACACCTATTCTGATTTTTCGGACACCCAGAAGTATATATTCTCATTCTTCCAGGGTTCGGAATAATCTCACACATCGTCACCTATTACTCAGGAAAAAAGGAACCCTTTGGCTATATGGGGATAGTCTGAGCAATAATATCTATTGGCTTCTTAGGTTTTATCGTATGAGCACATCATATATTCACCGTAGGAATAGATGTTGACACGCGAGCATACTTTACCTCAGCCACTATAATCATCGCCATCCCCACAGGAGTAAAAGTATTTAGCTGACTAGCTACTCTACATGGTGGCAATATCAAATGATCTCCTGCCATACTATGAGCTTTAGGATTCATCTTCCTATTCACAGTAGGAGGTCTCACAGGCATTGTGCTAGCAAATTCATCACTGGTCATCGTTCTCCACGACACA [...]
+AGTAGCACACTTCCATTACGTATTATCAATAGGAGCGGTATTTGCTATCATGGGTGGATTTGTCCACTGATTCCCCTTATTTTCAGGATTCTCGCTTGACAGTACCTGAGCAAAAATCCACTTCACAATCATATTTGTTGGAGTCAACATGACATTCTTCCCACAACATTTTCTAGGACTGTCCGGAATACCACGACGATATTCTGACTACCCAGACGCCTACACAACATGAAATACAATCTCCTCTATAGGCTCATTCATCTCACTTACAGCAGTAATACTAATGATCTTTATAATCTGAGAAGCTTTTGCATCCAAACGAGAGGTAGAGACGGTTGAATTAATATCAACTAATATGGAATGACTTCACGGATGTCCTCCTCCCTATCACACATTCGAAGAACCTACCTATATTGTATCAAAAATGGCGTACCCCTTTCAAATAGGCCTTCAAGACGCAACCTCCCCTATTATAGAAGAACTAACACATTT [...]
+ACACACTAATAATCGTATTCTTAATTAGCTCACTAGTACTTTATATTATCTCAACTATACTTACTACTAAACTAACACACACAAGCACAATAGACGCCCAAGAAGTAGAAACAGTATGAACAATTTTACCAGCTATTATCTTAATCATAATTGCTTTACCCTCGCTTCGAATCCTTTACATTATAGACGAAATTAATAATCCTTCTCTAACTGTAAAAACTATAGGACACCAGTGATATTGAACCTATGAGTATTCTGATTATGAAGACCTAAGCTTTGACTCCTATATAATTCCTACGCAAGAACTAAAACCTGGCGAACTACGATTATTAGAAGTGGATAATCGAGTTGTACTACCCATAGAAATAACAATCCGTATATTAATTTCATCAGAAGACGTACTTCACTCATGAGCCGTACCGTCTCTAGGACTAAAAACCGACGCCATCCCGGGACGACTAAACCAAACCACCTTAATAGCTATACGACCAG [...]
+TACGGCCAATGCTCAGAAATCTGTGGTTCCAACCATAGCTTTATACCCATCGTTATTGAATCTGTCCCATTATCTTGCTTCGAGAAATGGTCCGCCTCAATGCTTATGACACACCAAACCCATGCATACCATATAGTCAACCCTAGCCCTTGACCATTAACAGGGGCCCTATCAGCCCTCCTTATAACCTCAGGCCTAATCATATGATTCCACTTTAACTCAACCCACCTCCTACTACTAGGTCTTATAACCAACACACTAACTATATATCAATGATGACGAGATATCGTCCGGGAAAGCACATTCCAAGGCCATCACACCCCAACCGTCCAAAAAGGCTTACGATATGGCATAATTCTTTTCATCGTATCCGAAGTGTTCTTTTTCGCAGGGTTTTTCTGAGCCTTCTACCATTCCAGTCTAGCACCCACCCCCGAACTAGGAGGATGCTGGCCCCCCACAGGAATCACACCCCTAAACCCACTAGAGGTC [...]
+AAACACCTCAGTACTACTAGCATCAGGCGTATCAATCACCTGAGCCCACCACAGCTTAATAGAAGGAGATCGCAAACACATGCTTCAAGCCCTACTCATTACCATCCTCCTAGGCCTCTATTTTACACTTCTACAAGCCTCAGAGTACTACGAAACCTCCTTTACAATCTCCGACGGAATCTATGGCTCTACTTTCTTCATAGCTACAGGATTCCACGGACTACACGTTATTATCGGCTCAACCTTCCTAACCGTATGCTTCCTACGACAATTAAAATTCCATTTCACATCCAATCATCACTTCGGATTTGAAGCTGCTGCCTGATACTGACATTTTGTAGATGTCGTATGACTATTCCTATATGTATCCATTTATTGATGAGGATCATGTATGACCAACATTCGAAAAGCACATCCGCTGGCCAAAATTATCAACAACTCACTCATCGACCTGCCCGCACCATCTAACATCTCAACATGATGAAACTTTGG [...]
+TTGCAGCATGCTTAGCCTTACAAATCTTAACAGGCCTTTTCCTAGCCATACACTATACCTCAGACACCACCACAGCCTTTTCATCAGTCGCCCATATTTGCCGAGACGTTAACTACGGCTGACTCATCCGATACATGCACGCAAATGGAGCCTCCATATTCTTTATCTGCCTCTACATACACGTAGGACGAGGACTATATTATGGATCCTACACACTAACAGAAACATGAAACATTGGCATCATCCTCCTGTTTACAATCATAGCTACAGCATTCATAGGCTATGTGCTTCCGTGAGGACAAATATCATTCTGAGGAGCAACCGTCATTACCAACCTCCTATCAGCTATCCCTTACATCGGAACCAACTTAGTAGAATGAATTTGAGGGGGATTTTCAGTCGACAAAGCAACCCTAACACGATTCTTCGCCTTCCACTTTATTCTCCCCTTCGTAGCATCAGCACTAGTAATAGTACACCTATTATTCCTAC [...]
+GGATCCAACAATCCATCAGGAATCTCCTCCAACTCAGACAAAATTCCATTCCATCCATATTACACAATTAAAGATATCCTGGGAACCCTCCTACTAATCTTAATCCTAATACTACTAGTAATATTTTCACCAGACCTGCTGGGAGACCCAGACAACTACATCCCAGCCAACCCCCTCAGCACTCCACCACATATTAAACCCGAATGATATTTCCTATTCGCCTATGCTATTTTACGATCCATCCCCAACAAATTAGGGGGAGTCCTAGCCCTACTCCTATCAATCTTAATCCTAGTCATCATTCCACTACTTCACACATCAAAACAACGAGGAATAATATTCCGACCTATTAGCCAATGCCTCTTCTGACTTCTAGTAGCAGACCTACTTACATTAACATGAATCGGAGGACAACCAGTCGAACACCCCTTCATCACTATCGGCCAACTAGCCTCAATCCTGTACTTCACAATCCTCCTAGTCCTTATACCC [...]
+CATTATCGAAAATAATATCCTAAAATGAATGATCATAATCAACATCTTCTCACTAATCATCCCAATCCTCTTAGCCGTAGCCTTCCTGACACTAGTAGAACGAAAAGTACTAGGCTACATGCAACTCCGAAAAGGCCCCAACATCGTAGGACCCTACGGACTCCTACAACCAATTGCAGATGCTGTAAAATTATTCACCAAAGAACCCTTACGGCCACTCACCTCCTCTGCATCAATATTTATTACAGCCCCTATCCTAGCCTTAAGCCTAGCCCTAACTATGTGAATCCCACTACCAATACCATATCCTCTCATCAATATGAACCTAGGAGTCCTATTCATACTAGCAATATGAAGCTTAGCTGTTTACTCAATCCTATGATCTGGATGAGCATCAAACTCAAAATATGCACTAATTGGAGCCCTGCGAGCCGTAGCCCAGACCATTTCATATGAAGTAACCCTAGCCATTATTCTCCTGTCAGTACTTCT [...]
+GATCCTTTACTCTATCTACACTAATCACCACCCAAGAACGCCTATGACTAATCTTCCCAACATGACCCCTAGCCATAATATGATTTATTTCCACCCTAGCAGAAACTAATCGCGCCCCATTCGATCTAACAGAAGGAGAATCAGAACTAGTTTCAGGATTCAACGTAGAATATGCAGCAGGCCCATTCGCCCTATTTTTCCTAGCAGAATACGCCAATATCATCATAATAAATATCCTCACAACCACCCTATTCCTCGGAGCATCTCACAATCCATATATACCCGAATTATACACCATCAACTTCACCCTAAAAACATTAATACTGACAATCCTATTCCTATGAATCCGGGCATCATACCCCCGATTCCGCTACGACCAACTAATACACCTTCTATGAAAAAATTTCCTACCCCTCACACTAGCCCTATGCATATGACACATAGCCCTACCCGTAATCACAGCTAGCATTCCCCCTCAAACGATAAAACCCC [...]
+ATCATAATCATAACAACTGTTATATCAGGAACCATAATTGTCTTAACAAGTTCTCACTGACTAATAATCTGAATCGGGTTCGAAATAAACATGCTAGCAATTATTCCAATCCTGATAAAAAACTTTAGCCCCCGGGCCACAGAAGCATCCACGAAATATTTTCTAATCCAAGCCACCGCATCCATACTCCTAATACTGGGTATCATCATCAACCTAACAACCTCAGGACAATGGACAATTCTAAAACTCCCAAACCCAATAGCATCAAACCTCCTAACTATCGCTCTAGCAATAAAACTTGGAATATCTCCATTTCACTTCTGAGTACCCGAAGTAACACAAGGAATCCCACTATCATCAGGAATGATTCTACTCACATGACAAAAAATCGCACCCCTATCCATTCTTTACCAAATTACACCATCAATTAACCCAAACCTGCTAATCACTATAGCAATTGCATCAGTACTAGCAGGAGGATGAGGAGGATTA [...]
+CCAACTCCGAAAAATTCTAGCCTATTCATCAATTGCTCATATAGGGTGAATCACCATTATCATAATATACAACCCTACCCTAACACTCCTAAACCTAACAATCTACATCACCATAACACTCGGAACGTTCATACTATTTATATACAATTCATCTACAACAACACTATCACTGTCCCATACATGAAACAAATTACCCCTCATAACATCCCTAATCCTAGCACTTATACTATCACTCGGAGGCCTCCCCCCATTATCAGGCTTCGTACCCAAATGACTAATTATTCAAGAACTAACAAAAAATGATATAATTATTCTACCAACATTCATAGCTATTACAGCACTACTAAACCTGTACTTCTACATACGATTATCTTACACCACGGCACTGACACTATTTCCCTCAACAAACAATATAAAAATAAAATGACAATTCGAAAATACAAAAAAGATAGTCTTGTTACCCCCACTAATCATCATCTCAACAATACTACT [...]
+CACCAATAATATCTATCCTAGACATAAATATAATTCTAGCCCTGCTTACCAACACAATCCTAGCCTCTTTACTTGTACTAATCGCATTTTGACTCCCCCAACTAAATATCTACTCAGAAAAAGCCAGCCCTTACGAATGTGGTTCGACCCCCATAGGATCAGCACGCTTACCCTTCTCTATAAAATTTTTCCTAGTAGCCATCACATTCCTACTATTTGACCTAGAAATTGCATTACTACTACCCCTCCCATGGGCATCTCACGCAAACAACCTAACAACCACCCTCACTATGGCACTCATATTAATCTCCCTACTAGCCGTAAGTCTAGCTTACGAATGAACTGAAAAAGGACTCGAATGAACAGAAATGTCCATAGTATATTTCAACATCCTCATAGCCTTCATCGTATCTTTCGTAGGGTTACTCATATACCGATCCCACCTCATATCCTCCCTACTTTGCCTAGAAGGTATAATACTATCACTGTTCG [...]
+TCAGTGACAATCCTAAACAACCATTTTACACTAGCTAGCATAGCCCCCATTATCTTACTCGTATTCGCAGCTTGCGAGGCGGCCCTTGGATTATCCCTCCTAGTAATAGTATCCAACACATATGGAACTGACTACGTACAAAACCTAAACCTCTTGCAATGCATCATCTACCCCACCATTATACTAATACCTATAATATGAATATCAAAACCCCATATAATTTGAATCAATACAACAATCTACAGCCTACTAATCAGTCTCACTAGCCTACCACTCCTAAATCAACCTAATGACAACAGCCTAAACTCATCATTATTGTTCTTCACGGACCCCTTATCAGCCCCCCTCCTAACACTTACCACGTGACTCTTACCCCTGATACTCATAGCTAGCCAATTCCACCTATCAAAAGAGCCACTAGCCCGAAAAAAACTTTATATTACAATACTAATCCTTCTACAACTATTTCTAATTATAACATTTACCGCCACA [...]
+CATATTTTACATCCTATTCGAAGCGACCCTAGTACCCACACTAATTATTATTACCCGATGAGGGAACCAAACAGAACGCCTAAACGCAGGACTGTACTTCTTATTTTACACCCTACTAGGATCATTACCCCTACTAGTAGCACTACTATATATACAAAACAATATAGGCACACTAAACTTCTTAATAGCCCAATATTGAACCCAAGCCCTACCAAACTCCTGATCCAATATTCTCTTATGACTAGCATGTATAATAGCATTTATAGTAAAAATACCCCTATATGGACTCCACCTGTGACTTCCCAAAGCACATGTAGAAGCCCCCATTGCTGGATCTATAGTACTTGCCGCCGTACTTCTAAAGCTAGGAGGCTACGGCATAATACGAATCACCATCCAGCTCAATCCTTTAACAAGCTTTATAGCGTATCCCTTCATAATACTGTCAATATGAGGTATAATTATGACAAGCTCCATCTGCTTACGCCAAAC [...]
+AATCACTAATCGCGTACTCTTCCGTAAGCCACATAGCCCTAGTAATTGTAGCTATCCTTATCCAGACACCATTAAGCTACATGGGTGCAACCGCCCTAATAATCGCTCACGGCCTTACGTCATCCATACTGTTCTGCTTAGCCAACTCCAATTATGAACGCACTCACAGTCGAATCATAATCCTCGCACGTGGCCTACAAACCCTATTACCACTAATAGCGGCATGATGACTATTAGCAAGCCTAACCAATCTAGCACTACCCCCTACCATCAATCTAATTGGAGAACTATTCGTAGTAATAGCCTCATTCTCATGATCTAACACTACCATTATTCTTATAGGAGCAAACATCATTATTACCGCCCTATACTCCCTATATATACTCATCACAACACAACGTGGAAATTATACTTATCACATTAAAAACATTAAACCATCGTTTACACGAGAGAACACCCTAATAATACTACACCTTATACCACTACTACTGC [...]
+AACCCCAAAATAATCCTAGGACCCCTATACTGTAAAATAAAAGTAATCAATTTATTCGCCTCATTCATTATCACAACACTATTCATACTCACGATACCAATTATCCTAACTAGCACTCCAATCTACAAAAGCAAACTCTACCCACAGTACGTAAAAACTACCATCTCTTACGCCTTTATAACCATTATAATCCCCACAATAATGTTCATTTCCTCCGGACAGGAAATAATTATCTCAAACTGGCACTGAATGACTATTCAAACCATAAAATTATCACTAAGCTTCAAATTAGATTACTTCTCGATAATTTTCATGCCAGTAGCCCTATTCGTCACATGATCCATCATAGAATTCTCAATATGATATATAGCCTCAGACCCTTACATCAACCGGTTCTTCAAGTACCTATTAATATTCCTCATCACAATAATAATTCTAGTCACCGCAAATAACCTATTTCAATTGTTTATCGGCTGGGAAGGAGTAGGCATT [...]
+CCTACTCATCGGATGATGATATGGACGGTCAGATGCAAACACAGCCGCCCTTCAGGCAATCCTCTACAATCGCATCGGAGACGTAGGCTTCATTATAGCCATAGCATGATTCTTAACTAACCTAAACACGTGAGACCTCCAACAAATCTTTATAATCCACCATAATAACCTAAATATACCACTCATAGGTCTCCTCCTAGCAGCAACCGGCAAATCAGCCCAATTTGGCCTACATCCATGACTACCCTCAGCCATAGAAGGACCCACACCAGTATCAGCCCTACTACACTCAAGCACTATAGTCGTAGCTGGAGTCTTCCTCCTGATCCGATTCCACCCTTTAATAGAAGATAATGTAACAATACAAACAATCACCCTATGCCTAGGAGCCATCACCACCCTATTCACAGCGGTGTGCGCTCTCACCCAAAATGATATTAAAAAAATCATCGCATTCTCAACTTCAAGTCAATTAGGATTGATAATCGTCAC [...]
+TTGGTCAACCATATTTAGCATTCCTACATATCTGCACCCACGCATTCTTTAAAGCCATACTATTCATATGCTCCGGATCCATCATCCACAACCTAAACAACGAACAAGATATTCGAAAAATGGGAGGTCTGTTCAAACCGATACCATTCACCACCACCTCACTAATTATTGGTAACCTAGCACTCACAGGCATGCCATTCCTTACAGGATTTTACTCAAAAGACCTAATCATCGAAACCGCCAATACATCGAACACCAACGCCTGAGCCCTACTACTAACCCTAATAGCCACATCCATAACAGCTGCCTACAGCACCCGAATAATATTCTCTACACTCCTGGGGCAGCCCCGATTCAATGCTACAATTACAGCAAACGAAAATAATCCTCTGCTAATCAACCCTATTAAACGCCTACTACTCGGAAGCATCTTCGCAGGATACCTAATAACCCTCAACATCCCACCAACAATGATCCCACAACTAACTATAC [...]
+CTAAAACTTACAGCTCTCATCGTAACACTACTAGGCTTCGTACTGGCCCTGGAACTCAACATAACCTCACTAAGCCTCAAATTCAAACACGCATCAGGCCTATCCAAATTCTCAAACCTCCTAGGATATTTTCCCACCATTATTCACCGTTCGGTACCAACGATAAACCTAGCAGCAAGCCAAAAATTAGCCTCCACATTAATAGACACAATCTGACTAGAATATTTACTGCCAAAGTCTATCTCTCACCTAAATATAAAATCATCAACTATCATTTCCAACCAAAAAGGTCTAATCAAACTATATTTCCTGTCTTTCATAATTACCCTGACCCTAGCCCTAATCCTAACAACGGCTAATTTCCACGAG
+>Felis_silvestris
+ATGAACGAAAATCTATTCGCCTCTTTCACTACCCCAACAATAATAGGATTACCTATTGTTATTTTAATTATTATATTTCCAAGCATTTTATTCCCTTCACCTAACCGACTAATTAATAACCGTCTAGTTTCACTCCAACAATGACTAGTACAACTAACATCAAAACAAATACTGGCTATTCATAATCATAAAGGACAAACCTGAGCCCTAATACTAATGTCCCTAATTCTATTTATTGGGTCAACAAACTTATTAGGCCTATTACCCCACTCATTCACCCCAACTACCCAATTATCAATAAATTTAGGAATAGCTATCCCGCTATGAGCCGGCACTGTAATTACCGGGTTTCGCCACAAGACTAAAGCATCTCTGGCCCACTTTCTACCACAAGGAACACCTGTCCCCCTAATTCCTATGCTTGTAGTCATTGAGACTATCAGCCTCTTTATCCAACCTATAGCTCTCGCCGTACGACTTACAGCCAACATC [...]
+TCACTTATTAATACATCTAATTGGAGGGGCCGCCCTAGCCCTGATAAACATTAGCACCTCTATTGCCTTAATCACCTTTACCATTCTCATTTTACTAACAATCCTTGAATTTGCCGTAGCCCTAATCCAAGCCTATGTTTTTACCCTGCTAGTAAGCCTATACTTACATGATAACACCTAAATGCCACAACTAGATACATCCACCTGATCCATCACTATTATATCAATAATTATAACACTATTTATTGTATTCCAACTAAAAATCTCAAAATACTTATATCCATCAAACCCAGAACCTAAATCCATAACCACACTAAAACAACGGAATCCCTGAGAAAAAAAATGAACGAAAATCTATTCGCCTCTTTCACTACCCCAACAAATGTTCATAAACCGGTGACTATTTTCAACTAATCACAAAGATATTGGTACTCTTTACCTTTTATTCGGTGCCTGAGCTGGCATGGTGGGGACTGCTCTTAGTCTTCTAAT [...]
+AACTGGGCCAACCTGGTACACTACTAGGAGATGATCAGATTTACAATGTAATCGTCACTGCCCATGCTTTTGTAATGATCTTTTTTATGGTGATGCCTATTATAATTGGAGGGTTCGGAAACTGATTGGTCCCATTAATAATTGGAGCTCCTGACATAGCATTTCCCCGAATAAACAACATGAGCTTCTGACTCCTCCCTCCATCCTTTCTACTCTTACTCGCCTCATCTATGGTAGAAGCCGGAGCAGGAACTGGGTGAACAGTATACCCACCCCTAGCCGGCAACCTGGCTCATGCAGGAGCATCCGTAGACCTAACTATTTTTTCACTACACCTGGCAGGTGTCTCCTCAATCTTGGGTGCTATTAATTTCATTACTACTATTATTAATATAAAACCTCCTGCCATGTCCCAATATCAAACACCTCTATTTGTCTGATCAGTCTTAATCACTGCTGTCTTACTACTTCTATCACTTCCAGTCTTAGCAG [...]
+ACTATATTATTAACAGATCGAAACCTAAACACCACATTCTTTGACCCCGCTGGGGGAGGAGATCCTATCTTATACCAACACTTATTCTGATTCTTTGGCCATCCAGAAGTTTACATTTTAATCCTACCCGGTTTTGGGATAATCTCACATATTGTTACCTATTATTCAGGTAAAAAAGAACCCTTTGGCTACATGGGAATAGTTTGAGCCATGATATCAATCGGCTTCCTGGGCTTTATCGTATGAGCCCATCACATGTTTACTGTAGGAATGGATGTAGACACACGAGCATACTTTACATCAGCCACTATAATTATTGCCATTCCTACCGGGGTGAAAGTATTTAGTTGACTGGCTACTCTTCATGGAGGTAATATTAAATGGTCCCCTGCTATATTATGAGCCTTAGGCTTTATTTTCCTATTTACCGTAGGAGGCCTAACGGGAATTGTACTAGCAAACTCTTCATTAGACATTGTTCTTCACGACACA [...]
+AGTGGCCCACTTTCACTATGTCTTGTCAATAGGAGCAGTATTCGCTATCATAGGAGGCTTCGTCCATTGATTCCCCCTATTCTCAGGATATACCCTTGACAACACTTGAGCAAAGATTCACTTTACGATTATGTTTGTAGGAGTCAATATAACGTTCTTCCCTCAGCACTTCCTAGGCCTGTCCGGAATGCCACGACGTTATTCTGACTATCCAGATGCATATACAACTTGAAATACGATTTCCTCAATGGGCTCTTTCATCTCATTAACAGCAGTCATGTTAATAGTTTTCATAGTGTGAGAAGCTTTCGCATCCAAGCGAGAAGTGGCCATAGTAGAACTAACCACAACTAATCTTGAATGATTGCATGGATGTCCTCCTCCGTACCACACATTTGAAGAGCCAACTTACGTACTATTAAAAATGGCGTACCCCTTTCAACTAGGTTTCCAAGATGCTACATCCCCCATTATAGAAGAACTCCTACACTT [...]
+ACACACTAATAATTGTATTTTTAATCAGCTCTTTAGTTCTTTATATTATCTCGTTGATGCTAACAACCAAGCTCACGCACACGAGTACAATAGATGCTCAAGAAGTAGAAACCATCTGAACCATCCTACCTGCTATTATCCTGATTCTTATCGCCCTACCCTCCTTACGAATTCTCTATATAATGGATGAAATCAACAACCCCTCCCTCACAGTAAAAACCATAGGACATCAATGATATTGAAGTTATGAGTACACTGATTACGAAGACTTGAATTTTGACTCTTACATAATTCCTACCCAAGAGCTAAAACCAGGAGAACTCCGGCTATTAGAAGTTGACAACCGAGTAGTTTTACCAATAGAAATGACCATTCGCATGTTAATCTCATCAGAAGATGTGTTACACTCATGAGCCGTCCCATCCCTAGGCCTAAAAACTGATGCTATCCCAGGCCGATTAAATCAAACAACTCTAATAGCTACACGACCTG [...]
+TATGGCCAATGCTCAGAAATCTGTGGCTCAAACCATAGCTTCATACCCATTGTTCTTGAATTAGTCCCACTAACGTACTTTGAAAAATGATCTGCATCTATACTGATGACCCACCAAACCCATGCATACCACATAGTCAACCCTAGCCCATGGCCACTTACAGGAGCCCTTTCAGCCCTCTTAATAACCTCAGGCCTGGCTATATGATTCCACTACAACTTAACACTGCTGTTAACCCTTGGAATAACTACCAACTTACTAACTATATATCAATGATGACGAGACATTATCCGAGAAAGCACATTCCAAGGCCATCATACACCTATCGTTCAAAAAGGCCTTCGATACGGAATAATCCTCTTTATCATCTCAGAAGTATTCTTTTTCGCAGGCTTCTTCTGGGCCTTCTACCACTCAAGCCTAGCCCCAACCCCCGAGCTAGGAGGATGCTGACCACCAACAGGCATTATTCCCCTGAACCCCCTGGAAGTT [...]
+TAATACCTCCGTGCTTCTAGCCTCCGGAGTATCAATCACCTGAGCTCACCACAGTTTGATGGAGGGAAATCGAAAACACATGCTTCAAGCACTATTTATTACAATCTCTTTAGGGGTCTACTTTACACTCCTCCAAGCCTCCGAATACTATGAAACATCATTCACGATCTCGGACGGAGTATACGGATCTACCTTCTTCATGGCCACAGGATTCCATGGGCTACATGTAATTATTGGCTCTACTTTCCTAATTGTATGCTTCTTACGCCAATTAAAATATCACTTTACATCAAATCACCACTTCGGATTTGAAGCCGCCGCCTGATATTGACACTTCGTAGACGTAGTTTGACTATTCCTATACGTTTCTATTTATTGATGAGGATCCTATATGACCAACATTCGAAAATCACACCCCCTTATCAAAATTATTAATCACTCATTCATCGATCTACCCACCCCATCTAACATCTCAGCATGATGAAACTTCGG [...]
+TAGGAGTCTGCCTAATCTTACAAATCCTCACCGGCCTCTTTTTGGCCATACACTACACATCAGACACAATAACCGCCTTTTCATCAGTTACCCACATCTGTCGCGACGTTAATTATGGCTGAATCATCCGATATTTACACGCCAACGGAGCTTCTATATTCTTTATCTGCCTGTACATACATGTAGGACGGGGAATGTACTACGGCTCCTACACCTTCTCAGAGACATGAAACATTGGAATCATACTATTATTTACAGTCATAGCCACAGCTTTTATGGGATACGTCCTACCATGAGGCCAAATGTCCTTCTGAGGAGCAACCGTAATCACCAACCTCCTGTCAGCAATTCCATACATCGGGACTGAACTAGTAGAATGAATCTGAGGGGGCTTCTCAGTAGACAAAGCCACCCTAACACGATTCTTTGCCTTCCACTTCATTCTTCCATTCATTATCTCAGCCTTAGCAGCAGTACACCTCTTATTCCTTC [...]
+GGATCTAACAACCCCTCAGGAATTACATCCGATTCAGACAAAATCCCATTCCACCCATACTATACAATCAAAGACATCCTAGGTCTTCTAGTACTAGTTTTAACACTCACACTACTCGTCCTRTTTTCACCAGACCTGCTAGGAGACCCAGACAACTACATCCCAGCCAACCCTTTAAATACCCCTCCCCATATTAAACCTGAATGATACTTCCTATTCGCATACGCAATTCTCCGATCCATCCCCAACAAACTAGGGGGAGTCCTAGCCCTAGTACTCTCCATCCTAGTACTAGCAATCATTCCAATCCTCCACACCTCCAAACAACGAGGAATAATGTTTCGACCACTAAGCCAATGTCTATTCTGACTTCTAGTAGCGGATCTCCTAACCCTAACATGAATCGGTGGCCAACCTGTAGAACATCCATTCATCACCATCGGCCAACTAGCCTCCATCCTATATTTCTCAACCCTCCTAATCCTAATACCC [...]
+CATTATTGAAAACCGTCTACTCAAATGAATGTTTATAATTAATGTACTCTCACTAATTATTCCTATTCTCCTAGCTGTAGCCTTCCTAACCCTAGTCGAACGAAAAGTGCTAGGCTATATGCAACTCCGCAAAGGACCAAATGTCGTAGGACCATACGGCCTACTTCAACCTATCGCAGATGCTGTAAAACTCTTTACCAAAGAGCCTCTCCGACCCCTTACATCCTCCATATTAATATTCATCATAGCACCAATCCTAGCCCTCACACTAGCCCTAACCATATGAATCCCACTACCCATACCATACCCGCTCATTAACATAAACCTGGGAGTACTATTTATGCTAGCTATATCAAGCCTAGCTGTTTATTCCATCCTATGATCAGGATGAGCCTCAAATTCAAAATACGCCCTAATCGGAGCCCTACGAGCCGTCGCCCAAACAATCTCATATGAAGTCACACTAGCCATCATTCTCCTATCAGTACTACT [...]
+GATCCTTCACACTAGCCATACTAATCACCACTCAAGAATATATATGACTAATCATTCCTGCATGACCCCTAGCCATAATATGATTTATCTCAACCCTAGCAGAGACCAACCGAGCCCCATTCGACCTGACAGAAGGAGAATCAGAACTAGTCTCCGGATTCGATGTAGAATATGCAGCAGGCCCCTTCGCCCTATTCTTCCTAGCAGAATATGCCAACATCATCATAATAAATATCCTCACAACAATCCTATTCTTCGGAGCATTCCACAGCCCTTATATACCAGAGCTATATACCATTAACTTTACAGTAAAGACCCTTCTCCTAACAACTACTTTCTTATGGATCCGAGCATCCTACCCACGATTCCGATATGACCAACTAATACACCTCCTATGAAAAAACTTTCTGCCTCTCACCCTAGCCCTATGCATATGACATGTATCCCTACCTATCATCACAGCAAGCATCCCACCTCAAACAATCAACCCCC [...]
+ATTATTATTATATTAACCGTTATCTCAGGAACTATAATTGTAGTGACAACCTCCCACTGACTTCTAGTCTGAATTGGCTTTGAAATGAACCTATTAGCCATCATCCCCATCCTCATGAAAAAATACAACCCACGAGCCATAGAAGCAGCCACAAAATATTTCTTAACACAAGCAGCCGCCTCCATAATCCTAATAATATGAATCATTATCAATCTACTGCACTCGGGACAATGGACCGTACTAAAAGACCTTAATCCCATAGCATCAATCATAATAACAACCGCTCTAGCAATAAAACTAGGACTAGCCCCATTCCACTTCTGAGTACCCGAAGTTACACAAGGAATTTCTATATCATCAGGCTTAATTCTACTAACATGACAAAAAATTGCACCACTATCAATCCTCTACCAAATCTCATCCACCATTAACCCTAACCTAATCCTAACAATATCCATCTTATCAGTCATAATCGGAGGCTGAGGAGGCCTA [...]
+ACAACTACGAAAAATCATAGCATACTCCTCAATCGCCCATATAGGCTGAATGACAGCTATCATAATGTACAGCCCCACAATAATAATCTTAAACCTAACTATCTATATCATTATAACACTAACCACCTTCATACTATTTATACACAACTCCACCACAACAACAGCATCCCTATCACAAACATGAAATAAAACCCCTCTAATCACCTCACTCATCCTAGTATTAATAATATCCCTGGGAGGCCTCCCCCCACTCTCCGGATTTATCCCAAAATGAATAATCATCCAAGAATTGACTAAAAATGAATTAATCATAATGCCAACATTACTAGCCATAACAGCACTACTCAACCTATACTTCTACATACGACTAACATACACCACCGCACTAACCATGTTCCCCTCAAACAACAGTATAAAAATAAAATGACGATTTGAATGCACAAAAAAAATAACCTTCCTACCCCCTCTAGTTGTAATATCAACCATACTACT [...]
+CACCAATACTATCTATCCTGGATATAAATGTAATACTTGCCTTACTTACCAATACACTCCTGTCCACACTACTTGTACTCATCGCATTCTGATTACCCCAACTAAACATCTATGCAGAAAAAGCAAGCCCCTATGAGTGCGGATTTGATCCTATAGGGTCCGCCCGCCTACCCTTCTCCATAAAATTCTTCCTGGTAGCCATTACATTCTTGCTATTTGATCTAGAAATTGCACTACTACTCCCCCTTCCCTGAGCCTCACAAACAGACAAACTACCAACCATACTCACTATAGCCCTTCTACTAATCTCATTACTAGCCGCAAGCCTAGCCTACGAATGAACCCAAAAAGGACTAGAATGAACTGAAATGTCCATAGTCTACATTAATATTTTCCTGGCTTTCATCATGTCGCTCATAGGACTACTAATATATCGATCCCACTTAATGTCTTCCCTCCTATGTCTAGAAGGCATGATATTATCCCTATTCA [...]
+GCCGTAGCCATCCTAAACAACCATCTCACACTAGCCAGCATAACCCCCATTATCCTATTAGTATTTGCAGCTTGTGAGGCAGCACTAGGTTTATCTCTACTAGTAATAGTATCAAATACATATGGCACTGACTATGTACAAAACCTAAACCTCCTACAATGCATTATTATCCCCACTGCCATACTCATACCAATAACATGCCTATCGAAACCTAACATAATCTGAATCAACTCAACAACCTACAGCCTACTAATTAGTCTTATTAGCCTCTCCTATCTAAACCAACTAGGTGGCCATAGTCTAAATTTTTCACTGTTATTTTTCTCAGACTCACTCTCCGCACCTTTACTAGTACTAACAACATGACTCCTACCGCTAATACTCATAGCCAGCCAATCACACCTATCAAAAGAAACTCCTAGTCGAAAAAAACTATACATCACAATACTCACTCTCCTGCAGCTTCTTTTGATTATAACATTTACCGCTACA [...]
+TATATTTTACATTTTATTTGAAGCCACATTAATCCCCACCTTAATCATCATTACCCGATGGGGTGACCAGACAGAGCGATTAAACGCCGGCCTATACTTTCTATTTTACACTCTAGTAGGCTCACTACCCCTTTTAGTCGCACTACTGTATATCCAGAATACAACAGGAACTTTAAATTTCCTGATCATCCAATACTGAGCCAAGCCCATCTCAACCACCTGGTCCAATATTTTCCTCTGACTAGCATGCATGATAGCATTTATAGTAAAAATACCTCTATATGGACTCCACCTATGATTGCCAAAAGCACATGTTGAAGCTCCCATCGCTGGTTCAATAGTACTTGCCGCCGTATTACTAAAACTAGGGGGATACGGGATAATGCGTATTACAGTCCTACTTAACCCCGCAACGAACCAAATGGCATACCCCTTTATAATACTATCCCTGTGAGGAATGGTTATAACAAGCTCCATTTGCCTGCGCCAAAC [...]
+AATCCCTAATCGCATACTCATCCGTAAGTCACATGGCCCTAGTAATTGTAGCAGTACTGATCCAAACACCCTGAAGCTATATAGGAGCTACAGCCTTAATAATTGCTCATGGACTGACCTCATCTATGCTATTCTGCCTTGCAAACTCAAACTATGAACGAGTACATAGCCGAACAATAATCCTAGCCCGGGGGCTACAGACTATCCTCCCCCTAATAGCTGCCTGATGACTACTAGCTAGCCTCGCAAACCTAGCCCTACCACCCACAATTAATCTAATCGGAGAGCTATTTGTAGTAATAGCCTCCTTCTCATGATCAAACATAACCATTATCCTAATGGGTACTAATATCATCATTACAGCCCTATACTCCCTCTACATACTTATTATAACTCAACGAGGCAAATACACACACCACATTAAAAATATCAACCCATCATTTACACGAGAAAACGCCCTAATAGCCCTCCACCTACTCCCCCTTCTCCTCC [...]
+AACCCTAAGATTGTACTAGGCCCCATTTACTGTAAAATAAAAGTAATAAACCTATTTACCCCACTCATACTAACTGCAATATTTATTCTACTCCTGCCCATCATTATATCTAACACCCAACTGTATAAAAACAGCCTATATCCCCACTATGTAAAAACCACAATCTCTTACGCCTTCATCATCAGCATAATCCCAACTATAATATTTATCTCCTCAGGACAAGAAGCAATTATCTCAAACTGACACTGACTATCAATCCAAACTCTCAAGCTATCACTAAGCTTTAAAATAGATTATTTCTCAACCATCTTTATCCCTGTAGCGCTTTTCGTCACATGGTCCATCATAGAATTCTCAATGTGGTACATGCACTCAGACCCATACATCAACCGATTCTTTAAATATCTCCTCATATTCCTAATCACTATGATAATTCTAGTTACCGCTAACAATCTATTTCAACTATTCATCGGCTGAGAGGGAGTAGGAATC [...]
+TCTACTTATCGGATGATGATATGGCCGAGCAGATGCAAACACTGCCGCCCTACAAGCAATCCTCTACAACCGCATTGGAGACGTAGGCTTCATCATAGCCATAGCATGATTTCTCACCAACTCAAACGCATGGGACTTCCAACAAATCTTTATCACCCAACACGAGAACCTAAATATTCCATTACTAGGGCTTCTATTAGCAGCCACAGGTAAATCCGCCCAATTCGGCCTACATCCGTGACTGCCATCAGCCATAGAAGGCCCAACTCCTGTCTCCGCCCTACTCCACTCAAGTACAATAGTCGTAGCAGGGGTCTTCTTACTTATCCGGTTTTACCCGCTCATAGAACAAAACAAAACTATACAAACTCTCACCCTATGTTTAGGAGCTATTACAACCTTGTTCACAGCTATTTGTGCTCTCACACAAAATGATATCAAAAAAGTTGTTGCCTTTTCAACCTCAAGCCAACTGGGCCTAATAATTGTAAC [...]
+TTAACCAACCTTACCTCGCATTTCTACACATTTGCACACACGCATTCTTCAAAGCCATGCTATTCATATGTTCAGGATCAATTATCCACAGTCTGAACGACGAACAAGACATTCGAAAAATAGGCGGATTATACAAACCAATGCCCTTCACCACTACCTCCCTAATCATTGGAAGCCTCGCACTCACAGGTATACCTTTCCTAACAGGTTTTTATTCCAAAGACCTAATCATCGAGACAGCCAACACGTCGTATACCAACGCCTGAGCCCTACTAATTACTCTCATTGCCACATCCCTTACAGCTGCCTACAGTACTCGAATTATATTCTTTGTGCTACTAGGACAACCACGATTCAATACCTTGAATCTAATCAATGAAAATAATACCCACCTCATCAACTCCATTAAACGTCTCTTAATCGGAAGTATCTTTGCAGGATATCTAATTTCTTACAACATCCCCCCAACAACTATCCCACAAATAACTATAC [...]
+CTAAAACTAACTGCTCTTGCCGTGACTATCGCAGGCTTCATCCTAGCATTAGAACTTAATCTCGCGGCTAAAAACTTAAAATTTATATACCCTTCAAACCTCTTTAAGTTTTCCAACCTCTTAGGGTACTTTCCAATTGTAATACACCGCCTCCCATCAAAAATGAGCCTAACTATGAGCCAAAAGTCCGCATCGATACTATTAGACATAATTTGACTAGAAAATGTATTACCCAAATCCATCTCCTTATTCCAAATAAAAATGTCAACTACTGTATCTAATCAGAAAGGACTAGTTAAACTCTACTTTTTATCTTTCATAATCACCCTAGCCCTCAGCCTAATCTTA??????CTTAATTCCCACGAG
+>Gulo_gulo
+ATGAACGAAAATCTATTCTCCTCTTTCATTACCCCTACAATAATAGGACTCCCTATTGTTATTCTTATCACCATGTTCCCAGGCATTATATTCCCCTCACCGAGTCGATTAATCAATAACCGACTCATCTCCATCCAACAATGATTAGTTCAACTAACATCAAAACAAATACTATCTGTTCACAACCAAAAGGGACAAACCTGAGCACTAATATTAATGTCCTTAATCCTATTTATTGGGTCTACCAATCTCTTAGGCCTTCTGCCCCATTCATTTACTCCCACTACCCAACTGTCTCTAAATCTAGGCATGGCCATCCCCCTGTGAGCGGGTACGGTAGTCACCGGTTTTCGATACAAAATAAAGGCATCCTTAGCCCACTTTCTACCACAAGGAACACCCCTACCTCTGATCCCAATACTTGTAATCATTGAGACCATTAGCCTTTTTATCCAGCCCATAGCCTTAGCTATTCGACTAACAGCCAACATC [...]
+TCACTTATTAATCCACCTGATCGGTGAAGCCACCTTGGCTTTAACAAGCATCAGCACCATTACCGCTATAGTAACTTTTATTATCCTTATTCTCCTAACCATCTTAGAATTTGCAGTGGCCCTTATTCAAGCTTACGTTTTTACTTTACTAGTAAGCTTATACCTACATGATAACACCTAAATGCCACAACTGGACACTTCAACATGGTTCATTATAATCCTGTCAATAATTATTACCCTATTCTTTATGTTTCAACTAAAAGTATCCAAGTATTATTTCCCAGAGAACCCTGAACCAAAACCGGTATCCATGTCAAACCCCATTACACCTTGAGAGAAAAAATGAACGAAAATCTATTCTCCTCTTTCATTACCCCTACAAATGTTCATAAATCGATGATTATTCTCCACTAATCATAAAGACATCGGCACCCTCTATCTTTTATTCGGCGCATGAGCCGGAATAGTAGGTACAGCCCTGAGCCTATTAAT [...]
+AATTGGGACAACCTGGTGCTCTGCTGGGAGATGACCAGATTTACAATGTAATTGTGACTGCCCATGCCTTCGTAATAATTTTCTTTATAGTGATACCCATCATGATTGGAGGTTTTGGGAACTGGTTAGTGCCCTTAATAATTGGTGCACCTGACATGGCATTCCCACGTATAAACAATATAAGCTTCTGGCTTCTACCCCCCTCCTTCCTTTTACTCTTAGCCTCCTCCATAGTAGAAGCAGGCGCGGGAACAGGATGAACTGTGTACCCTCCTCTAGCAGGAAATCTGGCACACGCAGGAGCATCTGTGGACCTAACAATCTTTTCCTTGCACCTGGCAGGTGTCTCATCCATCCTGGGGGCCATCAACTTTATTACAACTATTATTAACATGAAACCTCCTGCAATGTCACAATATCAAACCCCCCTATTTGTATGATCCGTATTAATTACGGCCGTACTCCTACTCCTATCCCTACCAGTGCTAGCAG [...]
+ACCATATTACTCACGGATCGAAATCTAAACACTACTTTCTTCGACCCTGCCGGAGGAGGAGATCCTATCTTGTACCAACATCTATTCTGATTTTTTGGGCATCCTGAAGTATATATTCTAATTTTACCAGGATTCGGAATTATTTCACACGTCGTAACATATTACTCAGGGAAAAAAGAACCATTTGGCTACATGGGGATAGTTTGGGCAATAATATCTATCGGATTTTTAGGGTTCATTGTATGAGCCCATCATATGTTTACCGTAGGGATGGACGTTGACACACGAGCATATTTCACTTCAGCCACTATAATTATCGCAATCCCGACGGGAGTGAAAGTATTCAGCTGACTAGCCACCCTACATGGAGGAAACATCAAATGATCACCAGCCATATGAGGAGCCTTGGGCTTTATCTTTCTTTTCACAGTGGGTGGTTTAACAGGCATTGTGCTGTCAAATTCATCACTAGACATCGTTCTTCACGACACA [...]
+AGTAGCACATTTCCATTACGTTCTCTCAATGGGAGCAGTTTTTGCAATCATAGGCGGATTTGTCCACTGATTCCCCCTATTTACAGGCTACATACTAAACGATACTTGAGCAAAAATTCATTTCACAATTATATTCGTGGGAGTAAACATGACATTCTTTCCCCAACATTTTTTGGGCCTATCAGGTATACCCCGACGATACTCTGACTACCCAGATGCCTACACGACATGAAATACGGTATCTTCCATAGGCTCCTTCATTTCACTAACAGCGGTAATACTAATAATCTTCATAATTTGAGAAGCTTTCGCATCCAAACGAGAAGTACTGACAGTGGAGCTTACTTCTACAAACATTGAATGATTACACGGATGTCCTCCCCCATATCACACATTCGAAGAACCAGCCTACGTGCTATCAAAAATGGCATACCCCTTCCAACTAGGCCTTCAAGATGCAACCTCCCCTATCATAGAAGAACTACTCCATTT [...]
+ATACACTAATAATTGTATTCTTAATCAGCTCTCTTGTTCTCTATATCATTTCACTCATACTTACCACTAAACTAACACACACTAGCACTATAGATGCTCAAGAAGTGCAAACAGTCTGAACCATTTTACCCGCCATTATCCTCATTCTAATCGCCTTACCCTCGCTACGAATCCTCTACATAATGGATGAAATTAATAACCCTTCCCTGACTGTAAAAACCATAGGCCACCAATGATATTGAAGTTATGAATATACGGACTATGAAGATTTAAACTTCGATTCTTACATAGTCCCAACTCAAGAGCTTAAGCCCGGAGAACTACGATTATTAGAAGTAGATAATCGAGTGGTTCTTCCAATAGAAATAACAATCCGTATACTAATCTCGTCCGAAGACGTGTTACACTCATGAGCCGTACCATCCCTAGGACTAAAAACCGACGCTATCCCGGGACGCCTCAATCAAACCACCCTTATAGCTATGCGCCCAG [...]
+TATGGTCAATGCTCTGAAATTTGCGGCTCCAACCACAGCTTTATGCCCATTGTTCTCGAACTAGTACCCCTATCCCACTTCGAAAAATGATCCGCCTCAATACTAATGACCCACCAAACCCACTCATATCACATGGTAAACCCAAGCCCATGGCCACTAACGGGAGCTCTCTCTGCCCTTCTCATAACATCAGGATTAGTAATATGATTCCACTTTAGCTCAATATCCCTGCTGACCCTAGGTATAACAACCAACTTACTAACTATATTCCAATGATGACGAGATGTAGTTCGAGAAGGGACATTCCAAGGCCATCATACTCCCCCTGTTCAAAAAGGCCTACGATACGGAATAATTCTTTTTATCGTATCGGAGGTTTTTTTCTTCGCAGGCTTTTTCTGAGCCTTCTACCACTCAAGCCTAGCACCAACCCCCGAATTAGGAGGTTGCTGACCACCCACAGGTATCACGCCCTTAAATCCACTGGAAGTG [...]
+TAATACCTCAGTCCTTCTAGCCTCCGGAGTCTCCATCACCTGAGCCCACCATAGCCTAATAGAAGGCAACCGTAAACACATACTCCAAGCATTATTTATTACAATCTCCCTAGGCCTGTATTTCACCCTTCTGCAAGCCTCAGAATACTACGAAGCACCTTTTACAATCTCTGACGGAGTCTACGGCTCCACATTCTTCATAGCCACAGGATTCCATGGTCTCCACGTCATTATTGGCTCTACCTTCCTCGTTGTATGCTTCCTACGACAACTAAACTACCACTTCACATCTAGCCACCATTTTGGATTTGAAGCAGCTGCTTGATACTGACATTTCGTAGATGTCGTGTGATTATTCCTATATGTCTCCATCTATTGATGAGGATCTTAAATGACCAACATTCGTAAAACCCACCCATTAGCCAAAATCATCAACAATTCATTCATTGATTTACCCACACCATCAAATATTTCAGCATGATGAAACTTCGG [...]
+TCGGAATTTGCCTAATCCTTCAGATTCTTACAGGTTTATTTTTAGCCATGCACTACACGTCAGATACAGCTACAGCTTTCTCATCAGTCACCCATATCTGCCGAGACGTCAACTATGGCTGAGTCATCCGATATATACATGCCAACGGGGCCTCCATATTCTTTATCTGCCTATTTCTGCACGTCGGACGGGGCCTATACTATGGGTCTTACACATACTCCGAAACATGAAACATCGGCATCATCTTGTTATTCACAGTCATAGCAACAGCATTCATAGGTTACGTGTTACCATGAGGACAAATATCCTTCTGAGGCGCAACTGTGATTACCAACCTACTATCAGCCATCCCATACATCGGGACTAGCCTTGTAGAATGAATCTGAGGGGGGTTCTCAGTAGACAAAGCCACCCTGACACGATTTTTTGCCTTCCACTTTATCTTACCATTCATCATCTTAGCACTAGCAGCCATCCACCTATTATTTCTTC [...]
+GGATCCAATAATCCCTCAGGAATCCCCTCCGACTCTGATAAAATCCCATTTCATCCATACTATACCATCAAGGACATTCTAGGAGCCCTATTCCTAGCTCTAGTACTCATGATACTAGTACTATTCTCACCCGACCTACTAGGAGACCCAGACAACTACACACCCGCCAACCCACTCAACACACCGCCCCACATCAAGCCCGAATGATACTTCCTATTTGCATATGCAATCCTACGATCCATCCCCAACAAATTAGGAGGAGTACTAGCCCTAGTCCTTTCCATCCTAGTCCTAGCCATTATTCCCCTGCTGCACACCTCAAAACAACGAGGCATGATGTTCCGCCCACTCAGCCAATGCCTATTTTGACTGCTAGTAGCCGACCTCCTCACCTTGACCTGAATTGGGGGCCAACCAGTAGAACACCCATTTATCACCATCGGCCAACTAGCCTCAATCCTCTATTTCGCCATCCTCCTAATTTTCATACCA [...]
+CATCGTCGAGAATAATCTTTTAAAATGAATGTTTTTAATTAATATCATCTCACTGATCGTACCTATCTTACTCGCCGTAGCTTTCCTAACGCTAGTAGAACGTAAAGTCCTAGGATATATACAACTTCGCAAAGGCCCAAACATCGTAGGCCCTTACGGACTCCTACAACCAATTGCAGACGCCGTAAAACTTTTCACTAAAGAACCCCTACGACCTCTAACATCATCTATTACCATATTTGTAATGGCCCCAATCCTAGCCCTAACGTTAGCCCTAACTATATGAATTTCACTACCTATACCCTACCCTCTCATCAACATAAATCTAGGGGTCCTATTCATGCTAGCAATATCAAGCCTAGCTGTCTATTCCATCTTATGATCCGGTTGAGCCTCAAATTCAAAATATGCCCTAATCGGAGCTCTCCGAGCCGTGGCCCAAACAATCTCCTACGAAGTGACACTAGCTATTATTCTTCTATCAGTCCTACT [...]
+GTTCCTTTACTTTATCCACACTGATCACCACACAAGAACACCTATGACTAATTTTCCCCGCATGACCCCTGGCCATGATATGATTCATCTCAACCCTAGCAGAAACCAACCGCGCTCCTTTCGACCTGACAGAAGGAGAATCAGAATTAGTTTCCGGATTCAACGTTGAATATGCAGCCGGACCCTTCGCCCTATTTTTCCTAGCCGAGTACGCTAACATTATCATAATAAATATCCTCACAACTATCCTATTCTTCGGTGCATTCCACACTCCCTACCTACCAGAATTATATTCTATTAACTTCACCATAAAAACACTTCTACTAACCATTTCCTTCTTATGAATCCGAGCATCCTACCCACGATTCCGCTACGACCAACTTATACACTTACTATGAAAAAACTTCCTTCCCCTAACTTTAGCCCTATGCATATGACACATGGCCCTACCCATCATAACAGCAAGCATTCCCCCCCAAACAATTAAACCCC [...]
+ACCATCATTATATCAACCGTTATCTCAGGAACCATTATAGTACTAATCAGCTCCCACTGATTAACAATCTGAATCGGATTTGAAATAAATATACTAGCCATTATCCCCATTCTAATAAAAAAATTTAATCCACGAGCCATGGAGGCCTCAACAAAATATTTTCTCACCCAAGCCACCGCATCCATACTCCTCATGCTAGGAATCACCATCAACCTACTGCTAACAGGACAATGAGCAGTACTAAACATACCCGATCCAATCGCATCAAACATAATAACAGTGGCCCTAGCAATAAAACTAGGACTATCTCCCTTCCACTTCTGAGTACCAGAAGTAACCCAAGGAATCCCATTATCATCAGGAATGATTCTACTCACCTGACAAAAAATCGCTCCCCTATCCATCTTATATCAAATCTCCCCATCCACAAATCCAAACCTATTAATAGCTATAGCCACTATATCTGTTCTAATAGGGGGCTGAGGAGGCCTT [...]
+ACAACTACGAAAAATCCTAGCATACTCATCAATCGCCCATATAGGATGAATGATCGCCGTAACAACATATAACCCTACTCTAATGTTACTAAACCTTGTAATTTATATTATGATAACACTCGGAGCCTTTATACTATTTATACTCAATTCATCCACGACTACCCTATCACTATCCCACATGTGAAACAAATTCCCACTAATCACCTCACTAATCCTAACAATTATATTATCACTAGGAGGCCTCCCTCCCCTTTCAGGCTTCATCCCCAAATGAATAATCATCCATGAACTCACAAAAAACAACATAATCATCATAGCAACATTTATGGCAATCACTGCCCTACTAAATCTTTACTTCTATATGCGACTAACATACGCAACAACACTAACTTTATTCCCCTCAATAAATATTATAAAAATAAAATGACAATTCGAAAATACAAAAAACACAACCCTACTTCCCTTACTAATTGTAATCTCAACCATACTACT [...]
+CCCCAATAATACTTACACTACTCATAAACATAATACTAACTCTACTCATCAACGTATCTCTCGCATCACTACTTGTCCTAATCGCATTCTGGCTGCCTCAATCAAACATCTACTCAGAAAAAGCAAGCCCCTATGAATGAGGCTTTGACCCCCTAGGATCGGCACGCCTGCCTTTCTCTATAAAATTTTTCCTAGTAGCCATCACATTTCTACTATTCGACCTAGAAATTGCATTACTCCTGCCACTACCATGAGCCTCCCAATCAATTAACCTAAAGACAACACTCACCATAGCGCTAGCACTAATCTCCTTACTAGCCCTAAGTCTAGCCTACGAATGAACCGAAGAAGGTTTAGAATGAAATGAAATGTCCATAGTGTATATTAACATCTTTTTAGCCTTTACTCTATCTTTTATAGGACTGCTTATTTACCGATCCCACCTAATATCTTCCCTACTCTGCCTAGAAGGCATAATATTATCCCTTTTTG [...]
+ACAGTGACCATCCTAACCAATCACCTCACACTAGCCAGCATAACCCCCATTATCCTCCTTGTATTCGCCGCCTGTGAAGCAGCATTGGGGCTATCCTTACTAGTTATAATCTCCAATACATATGGAACAGACCACGTACAAAACTTGAATTTACTACAATGCATTATCATCCCAACTATAATACTAATCCCCCTGACGTGACTATCAAAACCTAGCATAATCTGAATCAACACAACAGCATATAGCATGTTAATCAGCCTCATTGGCCTGACATACCTCAACCAATTCACAGATAACAACCTAAACTTCTCCCTATTATTTTTTACTGACTCCCTATCAGCTCCCCTATTAATACTCATAACATGACTCCTTCCCTTAATACTCATAGCAAGCCAATATCACCTATCAAAAGAAACTCTCACCCGAAAAAAGCTCTACATTACAATACTAGTCTTACTACAACTATTCCTAATTATAACATTCACCGCCACG [...]
+TATATTCTACATTCTATTCGAAGCTACACTAATACCAACACTAATTATTATTACTCGATGAGGTAATCAAACAGAGCGCCTAAACGCCGGCCTGTACTTCCTATTTTACACCCTAGTAGGGTCTCTGCCCCTCCTAATCGCACTACTATGAGTCCAAAATAACTTAGGCACCCTAAATTTATTAGTAATCCAGTATTGAGCGCCACCCTTACTAGATTCCTGATCAAATGCTCTACTCTGACTAGCATGCATAATAGCATTCATAGTAAAAATACCACTATACGGCCTCCACCTATGACTCCCGAAAGCCCATGTAGAAGCCCCCATCGCCGGGTCTATGGTCCTTGCCGCCGTGCTCCTTAAACTAGGCGGATACGGAATAATACGAATTACAGACCTATTAAACCCATTAACAAACTTCATAGCATACCCTTTCATAATATTGTCCCTCTGAGGAATAATCATAACGAGCTCCATTTGTCTACGCCAAAC [...]
+AGTCCCTAATCGCTTATTCTTCTGTAAGCCATATAGCCCTAGTAATTGTAGCAGTACTAATCCAATCACCATGAAGCTACATAGGAGCAACAGCCCTAATAATCGCCCATGGCCTAACATCATCTATACTATTTTGCCTAGCTAATTCTAACTACGAACGTGTTCACAGCCGTACTATAATTCTTGCACGAGGACTTCAAACACTCTTACCACTAATAGCCGCATGATGACTACTTGCTAGCTTGACTAACCTAGCACTACCACCCACAATCAACTTAGTAGGAGAGCTATTTGTAGTTATAGCCTCATTTTCATGATCCAATATTACTATTATCCTGATAGGAATCAACATTACCATTACCGCCCTATACTCCTTATACATATTAATTACCACACAACGCGGGAAGTACACACACCATATTAAAAACGTTAAACCATCATTTACACGTGAAAACTCCTTAATAGCTCTCCACTTACTACCCCTACTGCTTC [...]
+AACCCTAAAGTCATCCTTGGTCCCATCTACTGTAAAATAAAAGTAATTAACCTATTCACTTCCTCAATTCTTGTAGCACTATTTATATTAACCCTCCCTATCATAATAACTAACACCTCTATATACAATAACAAGCTTTATCCACAATACGTAAAAACCACTATTTCATATGCCTTCATAATCAGCCTAGTCCCTATAATAATATTCCTACACCTGGGACAGGACACAATGATCTCAAACTGACACTGAACTACTATCCAGACAATAAAATTGTCCCTTAGCTTCAAACTTGACTATTTCTCAATAATCTTCGTGCCAGTGGCATTATTCGTCACATGATCTATCATAGAGTTCTCAATGTGGTATATACACTCAGACCCCCACATCAATCGATTTTTTAAATATTTACTCCTATTCCTCATCACTATGATAATTCTGGTTACTGCCAACAACATATTTCAACTATTCATTGGCTGAGAAGGAGTAGGTATT [...]
+CCTACTCATCGGCTGATGATATGGACGAACAGACGCAAATACAGCCGCACTACAAGCCATCCTATACAACCGCATCGGAGATGTAGGATTCATTATAGCCATGGCCTGATTCCTGGCCAATCTAAACACATGAGACCTTCAACAAATTTTTATAACCAACCACGAAAACCTAAATATCCCCCTCACTGGTCTATTACTGGCAGCCGCTGGAAAATCCGCACAATTTGGTCTCCACCCATGACTACCCTCAGCCATAGAAGGCCCTACCCCCGTATCGGCCCTACTGCACTCAAGCACAATAGTTGTAGCAGGGGTATTCCTCCTAATCCGATTCCACCCCTTAATAGAGCATAACAAAACTATACAAACCATCACACTATGCCTAGGAGCAATCACAACCCTATTCACAGCAATTTGTGCCCTAACACAGAACGACATCAAAAAAATCGTTGCTTTTTCTACCTCCAGCCAGCTTGGACTGATAATTGTAAC [...]
+TCAACCAACCTTACCTAGCATTCCTCCACATCTGCACACACGCATTCTTCAAAGCCATATTATTTATGTGCTCCGGATCAATCATCCATAGCCTAAATGATGAACAAGACATCCGAAAAATAGGAGGATTATTCAAAGCGCTACCATTTACTACTACCTCCCTAATTATCGGAAGCCTAGCACTTACAGGAATACCCTTCCTAACGGGATTCTATTCTAAAGACCTAATCATTGAAACCGCCAACACGTCGTATACCAACGCCTGAGCCCTACTAATAACCCTCGTTGCTACATCCATAACAGCTGCCTATAGCACTCGAATTATATTCTTTGCACTCCTAGGCCAACCTCGCTTCAACCCTATTATCACAATCAACGAGAATAATCCACCCCTAATCAATTCCATCAAACGTCTTTTATTCGGGAGCATTTTTGCAGGATTCCTAATTTCCTACAACATTACACCCACCACTACCCCACAGATAACTATGC [...]
+CTCAAAATAATGGCCCTCACCGTAACTATCTTAGGCTTCATTCTGGCACTAGAACTTAACCTCATAATACAAAACCTAAAATTCAAGCACCCCTCAGACCTATACAAATTCTCAAATATGCTGGGCTCATTTCCCACCATCATACACCGCTTAATACCCAAAATAAGCCTAATCATGAGCCAGAAATCAGCATCAACACTACTAGACCTAGCCTGGACAGAAAAAATTCTACCAAAATCCATTGCCTTCTTCCAAATAAAATCCTCAATCACCGTCTCCAGCCAAAAGGGCCTAATCAAGTTGTACTTTATATCCTTCATACTTACCCTAACCCTTACTCTCACTCTACTTACACTTAGTTTCCACGAG
+>Halichoerus_grypus
+ATGAACGAAAATCTATTCGCCTCTTTCACTACCCCTACAATAATAGGTCTTCCTATCGTAATCCTAATTGTCCTATTCCCAAGCATCCTATTTCCATCTCCCGACCGACTAATCAATAATCGCCTCACCTCAATTCAACAATGATTAATCCAATTAACATCAAAACAAATGTTGTCAATCCATAACCATAAAGGACAGACATGAGCACTTATACTTATTTCACTTATTCTATTTATTGGATCCACTAACCTGCTAGGCCTCCTGCCTCACTCATTCACCCCTACCACCCAACTATCCATAAACTTAGGAATGGCTATCCCCCTGTGAGCAGGAACAGTAATCACAGGTTTTCGACACAAAACAAAAGCATCCCTAGCCCACTTCCTACCCCAAGGAACACCTCTACCCCTCATTCCAATACTAGTGATCATCGAAACTATTAGCCTGTTCATTCAACCCATAGCCTTAGCCGTGCGACTAACGGCCAATATT [...]
+TCACCTACTAATTCACCTAATCGGAGGAGCTACCCTCGCCCTTATAGACATTAGCACCACTACAGCATTCATTACTTTCATCGTCCTTATCCTACTCACTATCCTTGAATTTGCTGTAGCCCTCATTCAAGCCTATGTCTTCACACTGCTAGTAAGCTTATATCTACATGACAATACCTAAATGCCACAGTTAGATACATCAACTTGACTCATTATAATCTCATCCATAATCCTAACCTTATTCATCACGTTTCACCTAAAAGTCTCTAAACACTACTTCCCAACAAACCCAGAACCAAAACACACGCTGCTATTAAAAAACAGTGCACCCTGAGAAGAAAAATGAACGAAAATCTATTCGCCTCTTTCACTACCCCTACAAATGTTCATAGATCGATGGTTATTTTCCACAAATCATAAGGATATCGGCACTCTTTATTTGCTGTTTGGCGCATGAGCTGGAATAGCAGGCACCGCCCTTAGTCTCTTAAT [...]
+AACTAGGACAACCTGGCGCCCTACTAGGAGATGACCAAATTTACAACGTAATTGTCACCGCCCATGCATTTGTAATAATTTTCTTCATAGTAATGCCTATCATAATTGGCGGCTTTGGGAACTGACTAGTGCCCTTAATAATTGGAGCTCCTGATATAGCATTCCCCCGAATAAATAATATAAGTTTCTGACTTTTACCGCCATCCTTTCTACTACTACTGGCCTCCTCTATAGTAGAAGCAGGTGCCGGGACCGGGTGAACCGTTTATCCTCCCCTAGCTGGGAACCTGGCTCATGCAGGGGCATCTGTAGATCTAACGATTTTCTCCCTCCACTTAGCGGGTGTATCATCTATTCTTGGGGCTATCAACTTCATCACTACTATCATTAATATAAAACCCCCTGCAATGTCTCAATACCAAACTCCACTGTTCGTGTGATCCGTATTAATCACGGCAGTACTCCTGCTATTGTCACTACCAGTCCTAGCAG [...]
+ACCATGCTACTCACAGACCGAAACCTGAATACAACATTCTTCGACCCTGCCGGAGGAGGTGATCCTATCCTGTATCAACATCTATTCTGATTCTTCGGACATCCCGAAGTGTATATTCTAATCCTACCAGGATTCGGAATAATCTCACACATTGTTACCTACTATTCAGGGAAAAAAGAACCTTTTGGCTATATAGGAATAGTTTGAGCAATAATGTCCATCGGCTTCCTGGGCTTCATTGTATGAGCCCACCATATATTCACTGTAGGGATGGACGTCGACACACGAGCATACTTCACTTCAGCCACTATAATTATTGCAATTCCGACAGGAGTTAAAGTATTCAGCTGACTAGCTACCCTTCATGGGGGCAATATCAAGTGATCTCCAGCCATATTATGAGCCCTGGGCTTTATCTTCCTATTTACAGTGGGAGGCCTTACAGGCATCGTACTAGCCAACTCATCACTAGACATTGTCCTGCATGACACA [...]
+AGTAGCACATTTCCATTATGTCTTATCAATAGGAGCAGTATTCGCTATTATGGGTGGATTCGTCCATTGATTCCCCCTATTCTCAGGCTATACACTCGACAACACTTGAGCAAAAATTCACTTCACAATCATGTTCGTAGGAGTCAACATAACATTCTTTCCCCAACACTTCCTAGGTCTATCAGGAATACCTCGGCGATACTCCGACTACCCAGACGCCTACACTACATGAAATACAGTCTCCTCCATGGGCTCATTCATTTCACTCACAGCAGTGATATTAATGGTATTCATAATCTGAGAAGCTTTCGCATCTAAGCGAGAAGTAGCAGCAGTTGAATTAACTACAACTAATATCGAATGACTGCATGGATGTCCCCCTCCTTACCACACATTTGAAGAGCCCACCTACGTCGTACTAAAAATGGCATACCCCCTACAAATAGGCCTACAAGATGCAACCTCTCCCATTATAGAGGAGTTACTACACTT [...]
+ACACATTAATAATTGTATTTCTAATTAGCTCATTAGTACTCTACATTATTTCACTCATGCTAACCACGAAACTTACCCACACAAGTACAATAGACGCACAGGAAGTGGAAACAGTATGAACAATCCTACCCGCTATTATTTTAATCCTCATTGCCCTACCATCATTGCGAATCCTCTACATAATGGACGAAATCAATAATCCTTCCTTGACCGTAAAAACTATAGGACATCAGTGATACTGAAGCTATGAATACACAGACTACGAAGACCTGAACTTTGACTCATACATGATCCCTACACAAGAACTAAAGCCCGGAGAACTACGACTGCTAGAAGTAGACAACCGAGTGGTCCTCCCAATAGAAATAACAATCCGCATGCTAATCTCATCGGAAGATGTACTCCACTCATGAGCCGTACCGTCTCTAGGACTAAAAACTGATGCTATCCCAGGACGACTAAACCAAACAACCCTAATAGCCATACGACCAG [...]
+TACGGTCAATGCTCAGAAATCTGTGGTTCAAACCATAGCTTCATACCTATTGTCCTCGAATTGGTCCCACTATCCCACTTCGAGAAGTGATCTACCTCAATGCTTATGACCCACCAAACCCATGCATACCACATAGTCAACCCCAGTCCATGACCCCTAACAGGAGCCCTCTCAGCCCTTCTCATGACATCCGGCCTAATTATGTGATTCCACTTTAACTCAATATACCTACTAATGCTAGGCCTCACTACCAACACCCTGACTATATACCAATGATGACGAGATATTGTCCGAGAAAGTACATTCCAAGGTCACCATACTCCAATTGTCCAAAAAGGCTTACGATATGGTATGATCCTCTTTATCGTATCAGAAGTATTCTTCTTCGCTGGTTTTTTCTGAGCCTTTTACCACTCCAGCCTAGCACCCACCCCCGAGCTGGGAGGATGCTGACCACCCACAGGTATCACCCCTCTAAACCCTATAGAAGTC [...]
+AAATACTTCTGTCCTCTTAGCATCAGGAGTATCAATTACTTGAGCTCACCATAGCCTAATAGAAGGAAACCGCAAGCACATACTTCAAGCACTATTCATTACCATCTCTCTAGGCGTCTACTTCACATTACTACAAGCCTCAGAATACTACGAGACTCCTTTCACAATTTCCGACGGAATTTACGGCTCTACCTTCTTCATGGCAACAGGATTCCATGGACTGCACGTAATCATCGGTTCAACTTTCCTAATTGTATGCTTCATACGACAGCTAAAATTTCACTTCACATCTAACCACCATTTCGGCTTTGAAGCTGCCGCCTGATACTGACATTTCGTAGACGTAGTATGACTGTTCCTATACGTATCCATCTATTGATGAGGATCTGCTATGACCAACATCCGAAAAACCCATCCACTAATAAAAATTATCAACAACTCATTTATCGACCTACCCACACCGTCAAATATCTCAGCATGATGAAACTTTGG [...]
+TCGGAATCTGCCTAATCCTACAGATCTTAACAGGCTTATTCCTAGCCATACACTACACCTCAGACACAACCACAGCCTTCTCATCAGTAACCCACATCTGCCGAGACGTAAACTACGGCTGAATCATCCGTTATCTTCACGCAAATGGAGCTTCCATATTCTTCATCTGCCTATACATGCATGTGGGACGAGGACTATATTACGGCTCTTACACATTCACAGAGACATGAAACATCGGCATTATCCTCTTATTCACCATCATAGCCACGGCATTCATGGGCTACGTCCTACCATGAGGACAAATATCATTTTGAGGGGCAACAGTCATTACCAATCTACTATCAGCAATCCCCTATATCGGAACCGACCTTGTACAATGAATCTGAGGAGGATTTTCAGTAGACAAAGCAACCTTAACAGGATTCTTCGCCTTCCACTTCATCCTACCATTCGTAGTATTAGCACTAGCAGCAGTCCACCTACTATTCCTAC [...]
+GGATCAAACAACCCCTCCGGAATCATACCCGACTCAGACAAAATCCCATTCCACCCGTACTATACAATTAAAGACATCCTAGGAGCCCTGCTTCTCATTCTAGTCCTGACACTACTAGTACTATTCTCACCCGACCTATTGGGAGACCCCGACAACTACATCCCTGCCAATCCCCTAAGCACCCCACCACATATCAAACCCGAATGATACTTCCTATTCGCCTACGCAATCTTACGATCCATCCCAAACAAACTAGGAGGAGTGCTGGCCCTGGTACTCTCCATTCTCATCCTCGCTATCGTACCCCTGCTCCACACATCAAAACAACGAGGAATAATATTCCGACCCATCAGCCAATGCCTATTCTGACTTCTAGTAGCAGACCTACTTACACTGACATGAATCGGAGGACAACCAGTCGAACACCCCTATATTACCATCGGTCAACTAGCCTCAATCCTATACTTTATAATCCTCTTAGTACTCATACCC [...]
+CATTATTGAAAATAATATCCTAAAATGAATGTTTATAATTAATATCATCTCACTAATTATCCCAATTCTCCTCGCCGTAGCTTTCCTAACATTAGTAGAACGGAAAGTACTAGGCTACATACAACTCCGAAAAGGACCCAACATCGTAGGACCCTATGGACTCCTACAACCCATCGCAGACGCCGTAAAACTATTCACCAAGGAACCCCTACGACCACTAACATCTTCCACAACCATATTCATTATAGCCCCTATTCTAGCCTTAACCTTAGCCCTAACTATGTGAGTCCCCCTGCCCATACCATATCCCCTCATCAACATAAACCTAGGAGTGTTATTCATACTAGCAATATCAAGCCTAGCTGTCTACTCAATCCTATGATCCGGATGGGCCTCAAACTCAAAATACGCCCTAATCGGAGCCCTACGAGCCGTAGCCCAAACAATTTCATACGAAGTGACCCTAGCCATTATCCTTCTATCAGTCCTACT [...]
+GATCCTTCACCCTATCCACACTAATCATTACTCAAGAACACTTATGACTAATCTTTCCCGCATGACCACTAGCCATAATATGATTTATCTCCACCCTAGCAGAAACCAACCGCGCCCCATTTGATCTCACAGAAGGAGAATCAGAACTTGTCTCAGGATTTAACGTAGAATACGCAGCAGGCCCATTCGCTATATTCTTCTTAGCAGAATACGCTAACATCATCATGATAAACATCTTCACAACCCTCTTATTCTTCGGAGCATTTCACAACCCATACATACCTGAACTATATGTCGTCAACTTTACCGTAAAAACCCTGGCACTAACAATTCTATTCCTATGAATCCGGGCATCATACCCGCGATTCCGATACGACCAACTAATACATCTTCTATGAAAAAACTTCCTACCCCTTACACTAGCCCTATGTATATGACATGTAACCCTACCCATCATCTCAGCAAGCATTCCCCCTCAAACAATAAAACCCC [...]
+ATTATCATTATATCAACCGTTATATCAGGGACCATAATCGTCCTCACGAGCTCCCATTGGCTGCTGATCTGAATTGGCTTTGAAATAAACATGCTAGCGATTATCCCAATCCTGATAAAAAACCACACCCCACGAGCTACAGAAGCATCCACAAAATATTTCCTAACACAGGCCACCGCATCTATACTCCTAATGATAGGCATTATCATCAACCTAATATTCTCGGGAGAATGATCAATCTCAAAAATCCCTAACCCCATCGCATCAGGCCTAGTAACCATTGCTCTAACAATAAAACTCGGTATAGCCCCTTTCCACTTCTGAGTGCCCGAAGTGACACAGGGAATCTCACTATCCTCAGGCATAATCCTACTCACATGACAAAAAATTGCACCACTATCCATTCTCTATCAAATTTCACCATCCATTAACCCCAAACTACTAATTACCATAGCAATCGCATCAGTACTGATCGGAGGCTGAGGAGGACTA [...]
+CCAACTCCGAAAAATCCTAGCCTACTCATCAATCGCCCATATAGGATGAATAGCTGTCATTCTAACATACAACCCCACCCTAATAATCCTAAACCTCACAATCTACATTACAATAACCCTAAGCACATTCATACTATTCATGCACAACTCATCCACGACGACACTATCACTATCAAATACATGAAATAAACTACCGCTCATGACATCGCTAATCCTAGTACTAATAATATCACTAGGAGGCCTCCCACCTCTATCAGGCTTTGCGCCCAAATGAATAATTATTCAAGAATTAACAAAAAACGATATAATTATTCTACCAACATTCATGGCCATCACAGCACTATTAAACCTATACTTCTACATACGCCTATCCTATACCACAGCACTAACCATATTCCCCTCAGTAAACAACATAAAAATAAAGTGACAATTCGAAAGTGCAAAAAAAATTATCCTTCTGCCACCACTAATCATCATCTCGACCATACTACT [...]
+CCCCAATAATATCCATCCTAGAAATAAACATAGCATTAACCCTATTTACCAACACAGCCCTAGCCTCTCTACTCGTACTAATTGCATTCTGACTCCCTCAGCTAAATACATACTCAGAAAAAGTCAGCCCCTACGAATGTGGATTTGACCCCATAGGATCAGCACGCCTACCCTTCTCCATAAAATTCTTTCTAGTAGCTATCACATTCCTACTATTCGACCTAGAAATTGCCCTACTCCTTCCACTTCCATGAGCATCGCACACAGATAACCTAACCACCATACTTACCATAGCACTACTACTCATCTCTCTCCTAGCCGCAAGCCTAGCCTACGAATGAACTGAAAAGGGGCTAGAATGAACAGAAATGTCCATAGTATATGCCAACATCTTCTTGGCCTTCATTATATCTCTTATAGGACTACTTATATACCGATCCCACCTGATATCCTCCCTACTCTGCCTAGAAGGTATGATACTATCATTATTTG [...]
+ACAGTAACAATCCTGAACAACCATTTTACACTAGCTAGCATGGCCCCCATTATCCTTCTCGTCTTCGCTGCTTGTGAAGCAGCCCTGGGACTGTCACTCCTAGTAATAGTGTCCAACACATACGGAACCGACTACGTACAAAATCTGAACCTCCTACAATGCATCATTATCCCCACCATAATACTTATACCCCTGACGTGAATATCAAAACCTAACATGATCTGAATCAACACAACAGCCTATAGCCTACTAATCAGCCTTATCAGTCTGTCCTTCCTAAATCAACTCGGTGACAATTGCATAAGCCTGTCCCTACTATTCTTCACAGACTCCCTATCAGCTCCCCTATTAGCACTTACAACATGACTGTTACCCTTAATACTTATGGCTAGCCAATTTCACCTATCAAAAGAGCCACTAGCCCGGAAAAAACTTTATATCACAATACTAATCCTACTACAACTATTCCTAATCATAACATTTACCGCTACA [...]
+CATATTTTACATTCTATTTGAAGCAACCCTAGTACCTACTCTGATTATTATTACCCGATGGGGGAACCAAACAGAACGCCTAAATGCAGGAACGTACTTCCTATTTTACACTCTAGTAGGATCCTTGCCCCTGCTAGTAGCCCTGCTATTTATCCAAAATAATATAGGCACATTAAACTTCCTAATAATCCAACTCTGAGCCCAACCCCTACCAAGCTCCTGATCTAATACCCTCCTATGATTAGCATGTATAATGGCATTCATAGTAAAAATACCCCTATACGGCCTCCACCTATGACTGCCTAAAGCCCACGTAGAAGCACCCATCGCTGGATCCATAGTACTGGCCGCAGTACTTCTAAAACTAGGGGGCTATGGCATGATACGAATTACAGCACTACTAAGCCCACTAACAAGCTTCATGGCATACCCCTTCATAATACTATCACTATGAGGTATAACCATAACTAGCTCCATCTGCTTACGCCAAAC [...]
+AATCCCTAATTGCATACTCCTCCGTCAGTCACATAGCCCTAGTCATCGTAGCAATCCTCATCCAAACACCATGAAGTTACATAGGAGCAACAGCCCTAATAATCGCCCACGGTTTAACATCATCCGTATTATTCTGCCTAGCCAATTCCAACTACGAACGCACCCACAGTCGAACTATAATCCTCGCACGCGGTCTGCAAGTGCTCCTCCCCTTAATAGCAGCCTGATGGCTATTGGCAAGTCTTACCAACCTGGCACTTCCGCCTACCATCAATCTAATCGGAGAGCTATTCGTAGTAATAGCCTCATTTTCATGGTCCAACATTACTATTATCCTAATAGGAACCAACATCATCATTACCGCCCTATATTCACTGTACATACTAATTACCACACAACGCGGCAAATATACCTACCACATCAAAAACATCAAACCCTCATTCACACGAGAAAACGCCCTAATAACGCTCCACCTAATACCCCTACTACTAC [...]
+AACCCCAAAGTCATTCTAGGACCCATCTACTGTAAAATAAAAGTAATTAACTTATTCGCTTCCTCTATCATCACAACACTATCCATACTAACACTCCCAATCGTCTTAACCAGCACCTCAATCTACAAAAACAAGCTTTACCCGCAATACGTAAAAACCGCCATTTCATACGCCTTCATAATCAGTATGATCCCCACAACAATATTCATCTATTCAGGACAGGAGATAATTATCTCAAACTGACACTGAATGACAATTCAAACCATAAAACTTACACTTAGCTTTAAACTAGACCATTTCTCCATAATTTTCGTACCTGTGGCCCTCTTCGTTACATGATCTATTATAGAATTTTCAATATGATACATACACTCAGATCCTTTCATCAACCGATTCTTCAAATACCTACTAATATTCCTCATCACCATGATGATTTTAGTTACCGCAAACAACCTATTTCAGCTATTCATCGGCTGAGAGGGAGTGGGTATC [...]
+CCTTCTCATCGGGTGGTGACACGGACGAACCGACGCAAATACAGCCGCCCTCCAGGCAGTCCTCTATAATCGCATTGGAGACGTAGGCTTTATCATAGCCATAGCATGATTCTTAATTAATCTAAACACATGAGAACTCCAACAGATCTTCATTTCCCACCACAACAACCTAAACGTACCACTTATAGGCCTCCTCCTAGCAGCAACTGGAAAATCAGCTCAATTCGGACTTCACCCATGACTGCCTTCAGCCATAGAAGGACCTACCCCAGTATCCGCCCTACTCCATTCAAGTACCATGGTCGTAGCAGGAGTTTTCCTTCTAATTCGATTTCACCCTCTAATAGAACACAACACGATAATACAAACAACCACCCTATGCCTAGGGGCTATCACCACCCTATTCACAGCAATCTGCGCACTCACCCAGAACGACATCAAGAAAATCATCGCATTCTCAACCTCAAGCCAACTAGGACTCATAATCGTCAC [...]
+TCAACCAACCACACCTGGCATTCCTACACATCTGCACCCACGCATTCTTCAAAGCTATATTATTTCTATGCTCCGGATCTATCATTCACAACCTAAACGATGAGCAAGATATTCGAAAAATGGGAGGTTTATACAAAGTACTACCATTCACCACTACCTCATTAATTGTAGGAAGCTTAGCACTCACAGGAATGCCCTTCCTCACAGGATTCTACTCCAAAGACCTAATCATCGAAACCGCCAACACGTCGTATACCAACGCCTGAGCCCTATTACTAACCCTCGTCGCCACATCCATAACAGCAGCCTACAGCACTCGAATTATATTCTTCGCACTCCTAGATCAGCCTCGATTTAACCCCATAATTACAATCAACGAGAACAGCCCACTCCTAATTAATCCCATTAAACGCCTACTACTAGGAAGCATTTTTGCAGGGTACTTAATCTCCTACAACATTACACCCACCTCCACTCCACAAATAACTATAC [...]
+CTAAAACTGATAGCCTTAACCGTAACGCTTCTGGGCTTCATCCTAGCACTAGAACTGAACCTCACTTCACAAAGCCTTAAACTCAAACACCCATCAAACCTATTCAAATTCTCCAACCTCCTCGGATACTTCCCCACTATTATCCACCGCTACATGCCGATAGTAAACTTATCAGCTAGCCAAAAACTAGCCTCAACACTACTAGATGCAATCTGGCTAGAAAATGCATTACCAAAATCCATCTCTTACTTTCACATAAAATCATCAGTCACTATCTCCAATCAGAAAGGTCTAATCAAACTATACTTCCTCTCCTTCATCATCACCTTAATCCTCGCCCTAATAATA??????ATTAATTCCCACGAG
+>Helarctos_malayanus
+ATGAACGAAAATCTGTTCACCTCTTTTATTACCCCAACGATAATAGGGATTCCTGTTGTAGTCCTAATTGTCATGTCTCCGAGCATTTTATTTCCTTCTCCCAGTCGGCTAATCGACAACCGCTTGGTATCTATTCAACAGTGACTAGTCCGACTAACATCAAAACAAATACTATCCACCCATAATCACAAAGGACAAACCTGAGCACTAATGTTAATATCATTAATCCTATTTATTGGCTCAACTAATCTTCTAGGCCTATTACCACACTCATTCACACCTACCACACAGCTGTCAATGAACCTGGGAATGGCTATTCCCCTGTGAGCAGGTACAGTTGCTATCGGGTTCCGATATAAGACCAAAGCATCCCTGGCTCACTTTCTACCCCAAGGAACACCTTTTCCTCTAATCCCTATACTCGTAATTATTGAAACAATTAGCCTGTTCATCCAGCCCATGGCCTTAGCCGTTCGACTGACCGCTAATATT [...]
+CCACTTGCTCATCCATTTAATTGGGGGAGCTACTTTGGCTCTAATTAACATCAGCACCATTACAGCCCTTATTACCTTTACTATTTTAGTGCTACTCACTATTCTCGAGTTCGCTGTAGCCCTCATTCAGGCCTACGTCTTCACTCTGCTAGTAAGCCTATACTTACATGATAACACTTAAATGCCACAACTAGACACATCAACATGATCTGTCACAATCCTGTCTATAGTTCTAGCACTATTTATTGTGTTCCAGCTAAAAGTCTCAAAATACAAGTATCCTGAAACCCCCACACCGAAATCTTTCTCACTATCAAAGAAACTTATACCTTGAGAAGAAAAATGAACGAAAATCTGTTCACCTCTTTTATTACCCCAACGAATGTTCATAAACCGATGACTATTCTCTACAAACCACAAAGACATTGGTACCCTTTACCTTCTGTTCGGTGCGTGAGCCGGGATAGTAGGTACTGCCCTCAGCCTTTTAAT [...]
+AGCTAGGCCAGCCCGGGACTTTGTTGGGGGATGATCAGATCTACAATGTAATCGTAACTGCCCATGCGTTCGTGATAATCTTCTTCATAGTCATGCCTATTATAATTGGGGGATTCGGGAACTGATTAGTGCCCTTAATAATTGGTGCCCCCGACATAGCGTTTCCTCGAATAAATAACATAAGCTTCTGACTGCTGCCACCATCTTTCTTATTACTCCTAGCCTCTTCTATGGTAGAAGCAGGTGCAGGGACTGGATGAACTGTCTATCCCCCTCTAGCGGGCAATCTAGCCCATGCAGGAGCATCAGTAGACTTGACAATCTTTTCTCTACATTTAGCAGGCATTTCTTCCATTCTGGGAGCTATTAATTTCATTACTACTATCATTAATATGAAACCCCCAGCAATGTCCCAATACCAGACTCCTCTGTTTGTATGATCAGTCCTAATTACGGCAGTACTTCTTCTTTTATCCCTGCCAGTCTTAGCAG [...]
+ACCATACTTCTTACAGATCGAAACCTTAATACTACCTTTTTTGATCCGGCCGGAGGGGGAGACCCTATTCTATATCAACACTTGTTTTGATTCTTCGGGCACCCCGAGGTTTACATCCTAATTCTTCCAGGGTTCGGAATAATCTCTCATATTGTCACTTATTACTCAGGAAAAAAAGAACCTTTTGGCTACATAGGAATAGTCTGAGCAATAATATCTATTGGGTTCCTAGGATTTATCGTGTGAGCTCACCATATGTTTACTGTAGGGATAGACGTCGACACACGAGCTTACTTTACCTCAGCTACCATAATTATTGCAATCCCAACAGGAGTCAAAGTATTTAGCTGACTAGCCACTCTGCACGGAGGGAATATTAAATGATCTCCCGCTATAATATGAGCCCTAGGCTTTATTTTCCTGTTTACAGTGGGAGGCCTAACAGGAATTGTCCTAGCTAATTCGTCCTTAGACATTGTTCTCCATGACACA [...]
+GGTAGCTCATTTCCACTATGTATTATCAATGGGGGCTGTCTTTGCCATTATAGGAGGATTTGTCCACTGATTTCCGCTGTTTTCAGGCTACACACTTAATAATACATGAGCAAAAGTTCACTTCATAATTATATTCATTGGGGTTAATATGACATTCTTTCCCCAGCACTTTCTAGGCCTGTCAGGAATACCTCGGCGATATTCCGATTATCCAGATGCCTATACAACATGAAATACAGTATCTTCTATAGGCTCATTCATTTCACTAACAGCAGTTATACTGATAATTTTCATGATCTGGGAGGCCTTTGCATCAAAACGAGAGGTGGCAGTGGTAGAACTCACCTCAACCAACATTGAATGACTACACGGATGTCCTCCTCCATATCACACATTCGAAGAACCCACTTACATCACACTAAAAATGGCGTACCCCCTTCAAATAGGTCTTCAAGACGCAACTTCTCCTATCATAGAGGAACTCCTACACTT [...]
+ACACATTAATAATTGTGTTCCTAATTAGCTCCTTAGTTCTCTATATTATTTCAACTATATTAACTACCAAATTAACGCACACAAGCACAATGGACGCACAAGAAGTAGAGACGGTGTGAACCATCCTGCCAGCTATTATCCTAATTCTAATTGCACTCCCATCACTACGGATTCTCTACATAATGGATGAAATTAATAATCCCTCACTGACTGTAAAAACCATAGGTCATCAATGATACTGAAGCTATGAGTATACAGATTATGAAGATCTAGGCTTTGACTCTTATATGACTCCAACACAAGAACTAAAGCCTGGGGAGCTGCGGTTATTAGAAGTGGACAATCGAGTAGTACTGCCTGTAGAAATAACAATCCGTATCCTGATCTCGTCAGAAGATGTCTTACACTCATGAGCTGTGCCATCTCTGGGATTAAAAACTGATGCAATCCCAGGACGGCTGAATCAAACAACTCTCATAGCCATGCGACCAG [...]
+TACGGCCAATGCTCAGAAATTTGTGGCTCCAACCACAGTTTTATACCTATTGTCCTCGAGCTAGTCCCACTATCTTACTTTGAAAAATGGTCTGCCTCAATGCTAATGACTCACCAAACACACGCATATCACATAGTCAACCCAAGTCCATGACCACTGACAGGGGCCCTTTCAGCCCTTCTAATAACATCAGGACTAATTATATGATTTCACTTTAACTCTATATTCTTGTTATCACTAGGCCTTACAACTAATATACTTACTATATACCAATGGTGGCGGGATATTATTCGAGAGAGCACCTTTCAAGGCCATCACACCCCTGTTGTCCAAAAGGGGCTACGGTACGGGATAGTCCTATTTATCGTATCAGAAGTATTCTTCTTCGCAGGATTCTTCTGAGCTTTTTACCACTCAAGCCTAGCACCCACTCCCGAACTAGGAGCATGCTGACCACCCACAGGTATTACTCCCCTAAATCCGCTAGAAGTA [...]
+CAACACTTCAGTGCTTCTTGCATCCGGAGTGTCCATTACCTGAGCCCACCATAGTCTAATAGAGGGAAGCCGCAAACATATGCTGCAAGCCCTATTTATTACTATCTCTCTAGGCGTGTACTTCACACTTCTACAAGCCTCAGAGTACTATGAGGCATCCTTCACTATTTCAGATGGAGTCTATGGCTCAACTTTTTTCATAGCGACTGGGTTTCACGGACTTCATGTAATCATTGGCTCAACTTTCCTTACAATCTGCTTCCTACGGCAACTACATTTCCATTTCACATCAAGTCACCATTTTGGCTTTGAAGCAGCAGCATGGTATTGACACTTCGTAGATGTCGTGTGACTATTCCTATATGTTTCCATCTACTGATGAGGATCTTGCATGACCAACATCCGAAAAACCCACCCATTAGCTAAAATCATTAACAACTCACTTATTGACCTCCCAGCACCATCAAACATCTCGGCGTGATGAAACTTCGG [...]
+TCGGAGTATGCTTAATCCTACAGATTATGACAGGCCTATTTCTAGCCATACACTATACATCAGACACAACCACAGCCTTTTCATCAATCACTCATATCTGCCGAGACGTTCACTACGGATGAATTATCCGATATATACATGCAAACGGAGCCTCCATGTTCTTTATCTGCCTATTCATGCACGTAGGACGGGGTCTGTACTATGGCTCGTACCTATTCTCAGAAACATGAAACATCGGTATTATCCTCCTATTTACAGTTATAGCCACCGCATTTATAGGATACGTCCTACCCTGAGGCCAAATGTCCTTCTGAGGAGCAACTGTCATTACCAATCTCTTATCAGCCATCCCCTATATTGGAACGGACCTAGTAGAATGAGTCTGAGGGGGCTTTTCCGTAGACAAAGCAACTCTAACACGATTCTTTGCCTTCCACTTTATCCTTCCGTTCATCATCTTGGCACTAACAGCGGTCCACCTATTATTCCTAC [...]
+GGGTCCAACAATCCCTCTGGAATCCCATCTGACTCAGACAAAATCCCATTTCACCCGTACTATACAATTAAGGACATCCTAGGCGCCCTACTTCTTACCCTAGCCCTAACAACCCTAGTTCTATTCTCGCCCGACTTACTAGGAGACCCTGACAACTACATCCCCGCAAATCCATTGAGCACCCCACCCCACATCAAACCCGAATGGTACTTTCTATTTGCCTACGCTATCCTACGATCCATTCCCAACAAACTAGGAGGAGTACTAGCTCTAGTCTTCTCTATCCTAATCCTAGCCATTATCCCCCTCTTACACACATCCAAGCAACGAGGAATGATATTCCGACCTCTGAGCCAATGCCTATTTTGACTCCTAGTAGCAGACCTACTAACACTAACATGAATTGGAGGACAACCAGTAGAACATCCCTTTACCATTATCGGACAACTAGCCTCCATTCTCTATTTCATAATCTTCCTAGTATTCATACCC [...]
+AATTATTGAAAATAACCTCTCAAAATGAATGTTTATAATTAACATCATCTCACTAGTCGTACCCATTCTCCTCGCCGTAGCCTTTTTAACACTAGTAGAGCGAAAAGTACTTGGCTATATGCAACTCCGTAAAGGACCAAACATTGTAGGACCCTATGGTCTCCTGCAACCTGTTGCAGATGCTGTAAAGCTTTTCACCAAAGAACCCCTGCGCCCCCTCACATCATCTACGACTATATTCATTATAGCCCCTATTCTAGCCCTAACACTAGCCCTAACCATGTGAGTTCCCCTACCAATACCATACCCCCTTGTCAACATAAACCTCGGAGTACTATTTATGCTGGCAATATCAAGCCTAGCTGTGTACTCTATCCTTTGATCAGGATGAGCTTCAAACTCAAAATACGCTCTGATTGGAGCTCTGCGAGCCGTAGCCCAGACAATTTCGTATGAAGTTACACTAGCCATTATCCTCCTATCAGTCCTACT [...]
+GCTCATTCGCACTCTCCACCTTAATTACTACTCAAGAGCACCTCTGACTAATCTTCCCTGCATGACCCCTAGCTATAATATGATTTATTTCCACCCTAGCAGAAACTAACCGAGCCCCCTTCGACCTGACAGAAGGAGAATCAGAACTAGTCTCAGGCTTTAACGTCGAATATGCAGCAGGCCCATTCGCCCTATTTTTCCTAGCAGAATATGCTAATATCATCATAATAAATGCCTTCACGACTATCCTATTCTTCGGGGCATTTCACAACCCCTACATACCAGAACTGTATACTGTCAATTTCACTGTAAAAACACTACTCCTAACAGCTTCCTTCCTATGAATCCGTGCATCATACCCCCGATTCCGATATGACCAACTAATGCACTTATTATGAAAAAACTTCCTACCCCTTACACTAGCCCTATGCATATGACATGTAACACTACCCATTATCACAGCAAGCGTCCCTCCTCAGATAATAAAACCCC [...]
+ATCATTATCACATCCACCATTGTTCTAGGAACCATAATCGTTTTATTTAGCTCCCATTGACTCATAATCTGAATTGGTTTTGAAATAAATATGCTAGCTATTATCCCAATCCTAATGAAAAAATCTAATCCGCGAGCCATGGAAGCCTCCACAAAATATTTTCTCACACAAGCCACTGCATCCATGCTCCTAATACTAGGCATCATTATTAATCTGCTATACTCAGGACACTGAACAATCTCAATAATTCCCAACCCAATTGCATCAACCGTAATTACTATCGCCCTAGCAATAAAACTCGGCCTATCCCCTTTTCACTTCTGAGTCCCAGAGGTCACACAAGGCATTCCTTTATCCTCAGGAGTGATTCTACTAACATGACAGAAAATCGCACCTCTATCCGTCCTATATCAAATTTCACCATCCATCAACCCAAACCTACTAGTAACATTAGCCGCTACATCCGTATTAGTAGGAGGCTGAGGAGGACTA [...]
+CCAACTTCGAAAAATTCTAGCATACTCTTCAATCGCTCACATGGGCTGAATAGCTGCCATCATAGTATATAATCCCACCCTAATAATCCTCAACCTTGCAATCTACATCATAATAACTCTAGGAACATTTATACTATTTATACACAATCTATCTACAACAACACTATCGCTATCCCACACATGAAATAAATCACCACTAATCGCCTCGCTAATTCTAGCACTCATACTATCGCTAGGCGGCCTTCCTCCCCTCTCAGGCTTCATTCCCAAATGAATAATCATTCAAGAGCTAACAAAAAATGATATAATTGTTATGCCCACATTCATAGCCATTACAGCCCTACTAAACCTTTATTTCTACATGCGCCTAACATACGCCACGGCACTAACAATATTTCCCTCCGCAAATAATATAAAAATAAAATGACAATTTGAAAGCACAAAAAAAATAATTCTCTTACCCCCTCTGATCGTAGCATCAACCATACTCCT [...]
+CTCCAATACTATCAATCATGGACATCAACTTAATCCTAGCACTATTTACTAACATACTACTAGCTTCCCTACTCGTTCTTATTGCCTTCTGACTGCCACAGTCAAATATTTACATAGAGAAAGCAAGTCCTTATGAATGCGGATTCGACCCCATAGGATCGGCACGCCTCCCTTTTTCTATAAAATTTTTCCTAGTAGCCATTACATTCCTACTATTTGATCTAGAAATTGCACTACTCCTCCCCCTTCCCTGAGCATCACAAACTGATAACCTAATAACAATACTCACCATAGCCCTGCTGCTTATCTCCTTATTAGCCGTAAGTCTGGCCTATGAGTGAGCCGAAAAAGGTTTAGAGTGGGCCGAAATGCCTGTAGTCTATGTCAACATTTTCTTAGCCTTCATCGTATCCCTTACAGGACTACTCATTTACCGATCCCATCTAATGTCCTCCCTACTTTGCCTAGAGGGTATAATATTATCTTTATTTG [...]
+ACAGTAACAGTTTTAAATAACCATTTTACACTTGCCAACATAGCTCCAATTATCCTACTGGTATTCGCTGCCTGTGAAGCAGCACTAGGACTGTCCCTACTAGTAATAGTCTCCAACACCTACGGAACTGATTACGTACAAAACCTTAACCTCTTACAATGCATTATTTTTCCCACTATAATATTAGTGCCCCTTACATGAGCATCAAAACCCAATATAATCTGGATTAACACAACAGCCTACAGCCTGCTCATTAGTCTTATCAGCTTGACATATCTCAACCAGCTCAGTGATAATAGCCTAAACTTCTCACTATTATTCTTTACCGACTCCCTATCAGCCCCCTTACTAGCCCTTACAACGTGACTACTGCCCTTGATACTAATGGCAAGTCAATTCCACCTGTCAAAGGAAACTCTAACCCGAAAAAAATTATATATTACTATGCTAATCCTCCTACAACTATTCCTGATCATAACCTTTTCCGCTATA [...]
+CCTATTTTATATCTTGTTCGAAGCTACCCTAATACCTACTCTAGTTATTATCACTCGATGGGGGAATCAAACAGAACGATTAAACGCAGGTCTTTACTTTCTATTTTACACCCTAGTAGGATCTTTACCATTACTAGTTGCACTACTACACACTCAAAATAATCTAGGCTCCCTAAACTTTCTCGTAATACAATACTGAGCCCAACCTCTGCCAAACTCCTGATCCAGTATATTCCTGTGACTGGCGTGTATAATGGCATTCATAGTAAAAATACCTCTATATGGCCTCCACTTATGATTGCCAAAAGCACACGTAGAGGCTCCCATCGCAGGATCTATAGTACTTGCCGCCGTGCTCCTAAAACTAGGAGGCTACGGCATAATGCGAATCACAACACTACTTCACCCTCTAACGAGCTTCATGGCCTATCCCTTCATAATACTCTCGCTATGGGGTATAATCATAACAAGCTCTATTTGCCTGCGCCAAAC [...]
+AGTCCCTAATTGCCTACTCCTCTGTTAGTCACATAGCCCTAGTCATTGTAGCAGTATTGATCCAAACTCCATGAAGCTATATAGGAGCAACAGCCTTAATAATTGCCCACGGGCTAACATCCTCTATACTATTCTGCCTTGCAAACTCCAACTACGAACGAGTCCATAGCCGAACTATAATCCTTGCACGAGGCCTACAAACACTTCTCCCACTTATGGCAGCTTGATGATTACTAGCAAGTCTTACTAATCTGGCACTCCCTCCTACCATCAACCTCATCGGAGAGCTATTTGTGATAGTAGCTACATTTTCATGATCTAATATTACCATCACTCTAATAGGAACTAACATCATTATTACTGCCCTCTATTCACTCTATATACTAATCACCACACAACGAGGCAAATACACAGACCATGTCAAAAGCATCAAGCCATCCTTCACACGAGAAAACGCACTAATGGCTCTCCACCTCCTACCCCTTCTGCTAC [...]
+AATCCCAAAATAATTCTAGGACCCATCTACTGTAAAATAAAAGTAATTAACCTGCTTACTTCCTCTATTATCACAACCTTGCTCATACTAACAGTACCAATTATCCTTACTAACGCTTCAACACACAAAAACAAATTCTACCCACAATATGTGAAAACTACAATTTCCTATGCTTTCATAATCAGTACTATCCCCATAATGATATTCCTTTACTCAGGGCAAGAAGTAATTATCTCAAACTGACATTGAATAACTATTCAAACCCTAAAACTAACTTTAAGCTTTAAGCTAGACTACTTCTCGATAATTTTCATGCCAGTAGCCCTGTTCGTCACATGATCAATCATAGAATTTTCCATTTGATATATACACACTGACCCCAACATCAACCAATTCTTCAAATACCTACTTATATTCCTTGTTACTATAATAATCTTAGTAACCGCAAATAATCTATTCCAGCTATTCATCGGCTGAGAGGGAGTAGGAATC [...]
+CCTCCTCATTGGATGATGATACGGACGAACAGACGCCAATACAGCCGCCCTGCAAGCAGTCTTATATAATCGCATCGGAGACGTAGGCTTTATCATAGCCATAGCCTGATTTTTACTCAATGCAAATGCATGAGACTTTCAACAAATCTTTGCAATTGAACATGATAATCTTAATATTCCACTAGCAGGACTACTCCTAGCAGCCACTGGAAAATCAGCCCAATTTGGCCTTCATCCATGACTCCCATCAGCTATAGAAGGACCTACTCCCGTTTCAGCCCTACTCCACTCTAGCACAATAGTAGTAGCAGGAGTATTTCTTCTAATCCGATTTCACCCCTTGATAGAACACAACAAGACCATTCAGACAGCTGCTCTATGCTTAGGAGCAATAACAACCCTATTCACAGCAGTCTGCGCTCTTACTCAAAATGATATCAAAAAGATTATTGCCTTCTCCACCTCAAGCCAACTAGGACTAATAATTGTAAC [...]
+TTAACCAGCCTCATCTAGCATTTCTTCACATCTGTACACACGCATTTTTTAAGGCCATGCTGTTTATATGCTCCGGATCCATCATCCACAGCCTAAATGACGAACAAGATATCCGAAAAATAGGAGGCCTATTCAAAGCCTTACCATTTACCACTACCGCACTAATTATCGGAACTCTGGCACTTACAGGCATGCCTTTCCTAACAGGATTTTACTCCAAAGACCTAATTATCGAGACCGCTAACACGTCATATACCAACGCCTGAGCCCTACTAACAACTCTCATTGCCACATCCATAACCGCTGCCTACAGTACTCGAATCGTATTCTTCGCACTTCTAGGACAACCCCGCTTTAACCCCGCCGTTGTTATTAACGAGAATAACCCCCTCCTAATCAATTCTATCAAACGCCTACTCCTAGGAAGCATTTTTGCAGGGTATCTAATCTCCCACAACATTACACCCACCACCATCCCACAAATAACTATAC [...]
+CTTAAAACAACAGCCCTTGCGGTCACTATACTAGGCTTTATCCTAGCACTAGAACTCAATTCTACCATACAAGGCCTCAAATTTAATTATCCACAAAACCCATTCAAATTTTCTAATCAACTAGGATATTTCCCTACTATCATTCACCGCCTCCTACCAATAATGAGCTTATCAATAAGCCAAAAGATAGCATCTATATTATTAGACTCAACCTGACTAGAAAGTGTATTACCAAAATCTATCTCCTATTTCCAAATAAAATCCTCAATTACAGTCTCCAACCAGAAAGGGCTAATTAAACTATATTTCCTCTCTTTCATAATCACATTAATCCTGAGCTTCTTCGTA??????CTTAATTTCCACGAG
+>Herpestes_auropunctatus
+ATGAACGAAAATCTATTCGCCTCTTTCACTACCCCAACAATAATAGGACTTCCCGTCGTAATCCTTATTATTATATTCCCAAGCATCATATTCCCTGCACCAAATCGATTAATTAACAATCGCCTAATCTCACTCCAACAATGACTAATCCAACTTACATCAAAACAAATACTAGCTATTCACAACCACAAAGGACAGACATGAGCCCTCATACTAATATCCCTGATTCTATTTATCGGCTCAACTAATCTACTGGGCCTTCTTCCACACTCATTTACGCCCACAACACAACTATCAATAAACCTAGGAATGGCCATTCCCCTATGAGCCGGTACAGTAATTATGGGATTCCGACACAAGACAAAATCATCCCTAGCCCATTTTCTACCCCAAGGAACACCTTTACCACTAATTCCAATGCTTGTAGTTATTGAAACTATTAGCCTATTTATTCAACCAATAGCCCTGGCTGTACGACTTACAGCCAACATC [...]
+CCACCTACTAATTCACCTAATCGGAGGGGCTACCCTAGTCTTAATAAATATCAGTACTTCTATTGCTTTCATTACCTTTATTATCCTTATTCTATTGACAATTCTTGAATTTGCCGTAGCCCTAATTCAAGCCTATGTATTTACATTGCTGGTAAGCCTATACCTACATGACAACACATAAATGCCACAACTAGACACATCAACTTGATTCATTACGATCGTGTCAATAATCACAACATTATTCATTGTATTTCAACTAAAATTATCAAAGCACTTATACCCGTCAAACCCAGAGTTAAAATCCACAATTTCACTAAAACAACCCACTCCTTGAGAAAAAAAATGAACGAAAATCTATTCGCCTCTTTCACTACCCCAACAAATGTTCATAGATCGTTGATTGTTCTCTACCAACCACAAAGATATTGGCACCCTATATCTTCTATTTGGAGCCTGGGCTGGTATAGTGGGAACTGCTCTTAGTCTTTTAAT [...]
+AACTTGGCCAACCAGGTTCTCTGTTCGGAGATGACCAGATTTATAACGTAATCGTTACCGCCCATGCATTCGTAATAATCTTCTTCATGGTTATACCAATCATAATCGGCGGGTTTGGAAACTGGCTAGTACCACTAATAATTGGAGCACCTGACATGGCGTTCCCCCGAATAAATAACATGAGCTTCTGACTCCTCCCTCCATCCTTCCTACTTCTTCTAGCATCATCAATAGTGGAAGCGGGAGCAGGAACTGGATGAACCGTGTATCCACCCTTAGCCGGCAACTTAGCCCATGCAGGAGCATCCGTAGACCTGACTATTTTCTCTCTTCACCTTGCAGGTGTTTCCTCTATTCTAGGAGCCATTAATTTTATCACAACAATCATTAACATAAAACCACCAGCTATATCTCAATATCAAACACCCCTATTCGTTTGATCCGTACTAATCACAGCTGTGTTACTTCTTCTATCCTTACCTGTACTAGCAG [...]
+ACAATACTCTTAACAGACCGAAATCTAAATACCACATTTTTCGACCCTGCTGGAGGAGGAGACCCAATTCTGTACCAGCACTTATTCTGATTCTTCGGTCATCCAGAAGTCTATATCCTGATTCTACCAGGCTTTGGCATAATCTCTCATATTGTCACATATTATTCAGGTAAAAAAGAACCTTTCGGTTATATAGGAATGGTTTGAGCAATAATATCTATTGGCTTCCTAGGCTTCATTGTGTGAGCCCACCACATATTTACAGTAGGTATAGACGTTGATACACGAGCATATTTTACATCAGCTACAATAATTATTGCTATCCCTACTGGAGTGAAAGTATTCAGCTGACTCGCCACTCTTCACGGACGTAACATTAAATGATCGCCTGCCATACTATGAGCTCTAGGCTTCATCTTCCTATTTACAGTCGGCGGATTAACAGGCATCGTACTAGCCAATTCTTCACTAGATATTGTCCTCCACGACACA [...]
+AGTAGCCCACTTCCACTATGTATTATCAATAGGGGCTGTATTCGCCATCATGGGAGGCTTCGTTCACTGGTTTCCACTATTCTCGGGGTATACTCTAGACGATACTTGAGCAAAAGCTCACTTCACAATTATATTTGTAGGTGTTAATATAACATTCTTCCCGCAACATTTTCTCGGACTATCCGGGATACCTCGGCGTTACTCTGATTATCCAGATGCCTATACAACCTGAAACGCAATCTCCTCAATAGGCTCTTTTATTTCATTGACAGCAGTGATATTGATAGTCTTCATGGTATGAGAAGCATTTGCGTCTAAACGAGAAGTGGCAATGATTGAAATAATCAATACCAACCTCGAATGATTACATGGGTGTCCTCCCCCATACCACACATTTGAAGAGCCAACTTACGTGGTCTCAAAAATGGCATACCCGTTCCAATTAGGATTTCAAGATGCTTCATCTCCTATTATAGAAGAATTACTACATTT [...]
+ACACACTAATGATTGTATTTCTAATTAGCTCACTAGTACTATATATTATCTCACTAATATTAACAACTAAACTCACACATACAAGTACGATAGATGCCCAAGAGGTAGAAACCATCTGAACAATTTTACCCGCCATTATCCTAATCCTTATTGCACTACCTTCCCTACGAATCCTTTACATAATAGATGAAATTAATAGCCCCTCTTTAACAGTAAAAACCATGGGACACCAATGATACTGAAGTTATGAATATACAGACTATGAAGACCTAAGCTTCGACTCTTACATAGTACCCACTCAAGAACTAAAGCCTGGAGAACTACGACTACTAGAAGTCGATAACCGAGTTGTTTTACCCATAGAAATAACCATTCGAATATTAATCTCATCAGAGGATGTATTACACTCATGAGCCGTACCATCATTAGGCCTAAAAACTGATGCTATCCCAGGACGACTAAATCAAACAACTCTTATGGGCACCCGACCTG [...]
+TATGGCCAGTGTTCAGAAATCTGTGGCTCGAACCACAGCTTTATGCCCATTGTACTTGAATTAATTCCACTAAAACATTTCGAAAAATGATCAACATCCATACTAATGACCCACCAAACCCATACATACCACATAGTAAACCCAAGCCCATGACCACTCACAGGAGCTCTGTCCGCTCTTCTAATAACCTCAGGATTGGCCATATGGTTCCACTTCAACTCAACAGTATTATTAATTTTAGGTATAATTACCAATACCCTGACTATATATCAATGATGACGGGACATTATTCGAGAAAGCACATTCCAAGGTCACCACACGCCTACCGTTCAAAAAGGGCTGCGATACGGAATAGTCCTATTTATTATCTCAGAGGTTTTCTTCTTCGCAGGCTTCTTCTGAGCCTTTTACCATTCAAGCCTTGCCCCTACCCCAGAATTAGGAGGCTGCTGGCCTCCCACAGGCATTATCCCCCTTAACCCCTTAGAAGTT [...]
+CAATACATCCGTACTATTAGCCTCAGGAGTGTCTATCACCTGAGCTCACCATAGCCTAATAGAGGGTAACCGAAAACACATGCTCCAAGCCCTATTGATTACTATCTCACTAGGCGTGTACTTTACTTTACTTCAAGCCTCAGAATACTATGAAACAACATTCACCATCTCAGATGGAGTCTACGGTTCCACCTTTTTTATGGCTACAGGATTTCATGGACTACACGTAATCATTGGATCTACTTTCCTCATTGTTTGTTTTCTCCGCCAACTAAAATTTCACTTTACATCTAATCATCATTTTGGATTTGAAGCCGCTGCCTGATACTGACACTTCGTAGACGTAGTATGACTATTCCTGTACGTATCCATTTATTGATGAGGATCATATATGACCAACATCCGCAAATCACACCCACTCATTAAAATCGTCAACGAATCATTCATTGATCTCCCTACCCCATCTAACATTTCAGCCTGATGAAACTTTGG [...]
+TAGGAGTGTGCCTTATTCTACAGATCCTAACAGGCCTATTTCTAGCTATACACTACACATCAGACACATCAACCGCCTTTTCATCAGTAACCCACATTTGCCGCGACGTCAACTACGGCTGAATCATTCGATATATACACGCTAACGGAGCCTCCATATTCTTTATCTGCCTATTCATACACGTAGGACGAGGCATATATTATGGCTCTTATACATTCATAGAAACATGAAATATCGGAATTCTCCTATTATTCACAGTAATAGCAACTGCATTCATAGGTTACGTACTACCATGAGGTCAAATATCATTCTGAGGAGCCACAGTCATCACTAATCTACTATCAGCAATCCCCTACATCGGAACTAACCTAGTAGAATGAATCTGAGGCGGATTCTCAGTAGACAAAGCCACCCTAACACGATTCTTCGCATTCCACTTCATCCTACCATTCATTATCTCAGCCCTCGCAGCAGTACACCTCCTATTTCTGC [...]
+GGATCTAACAACCCCTCAGGAATCTCATCAGACTCAGACAAAATTCCATTTCACCCCTACTATACAATCAAAGACATCCTAGGACTCCTAATTATACTCATAATACTCATAATACTAGTCCTATTCTCACCAGACCTTCTAGGAGACCCAGACAACTACACCCCAGCCAACCCACTAAACACCCCACCACATATTAAGCCCGAATGATATTTTCTATTCGCATATGCAATCCTCCGATCCATCCCCAACAAACTAGGAGGAGTACTAGCCCTAGTACTATCTATTATAATCTTAGCTATCGTACCACTACTTCACACCTCAAACCAACGAGGCATGATATTCCGACCACTCAGCCAATGCTTATTTTGACTTCTAGTAGCAGACCTACTAACACTAACATGAATTGGAGGTCAACCAGTAGAACACCCATTCATCGCCATCGGACAACTAGCCTCTATCCTATACTTTTCTATTATCCTTATCCTCATGCCC [...]
+AACTATCGAAAATCAACTCCTAAAGTGAATGTTTATACTTAACATCCTATCACTAAGCATCCCAATCCTGCTCGCCGTAGCCTTCCTTACACTAGTCGAACGTAAAGTATTAGGTTACATACAACTCCGCAAAGGACCAAACATCGTAGGACCCTACGGCCTACTCCAACCCATCGCGGACGCCCTAAAACTCTTCACCAAAGAACCCCTCCGACCCCTAACATCCTCCGTATCCATATTCATCATAGCCCCTATCCTAGCCCTCACACTGGCCCTAATTATATGAATTCCCCTACCCATACCACACCCACTCATTAATATAAATCTAGGAATCCTATTTATACTAGCTATGTCCAGCCTCGCCGTATACTCAATCCTATGATCAGGATGAGCCTCCAACTCAAAATACGCCCTAATTGGAGCCCTACGAGCTGTAGCCCAAACTATCTCATACGAAGTTACACTAGCCATTATTCTTCTATCAGTACTACT [...]
+GCTCATTTACACTAGCCACCCTAATTACCACTCAAGAACATATATGACTAATTTTTCCAACATGACCACTAGCTATAATATGATTTATCTCAACATTAGCAGAAACCAACCGGGCTCCATTCGATCTAACAGAAGGAGAATCAGAATTAGTATCCGGATTTAACGTAGAATATGCAGCAGGTCCATTCGCCTTATTTTTTATAGCAGAATATGCTAATATTATCATAATAAATAGCCTGACAACAGTCCTATTCTTTGGGGCATCCCATAATCCCTACATGCCAGAACTCTATACTACAAACTTTATAGTCAAAACCCTAATCTTAACAATTATCTTCCTATGGATCCGAGCATCCTACCCACGATTCCGATATGATCAACTAATACACTTACTATGAAAAAACTTCCTACCACTCACCCTGGCCCTATGCATATGACACGTATCATTACCTATCATAACCGCTAGCATCCCACCTCTAACAATTAAACCCT [...]
+CTCACCATTATAATAACCGTAATCTCAGGAACCATAATTGTACTAACCAGCTCTCACTGACTAATAGTCTGAATTGGCTTCGAAATAAACACACTAGCCATCATTCCCATTCTCATAAAAAAATCCAACCCCCGAGCCATCGAAGCATCCACAAAATATTTTCTAACACAAGCAACCGCATCTATAATTCTCATAATGGGAATCGCCATTAACCTACTATACTCCGGACAATGAACCCTATCAAAAACCCTACACCCCGCAGCATCAGCCATAATAACCATTGCCCTAGCTATAAAACTAGGTCTAGCCCCATTCCACTTCTGAGTGCCAGAAGTCACCCAAGGAATCCACATATCCTCAGGCCTGATCCTACTAACATGACAAAAAATTGCGCCCCTATCAATCCTTTACCAAATCTCACCAGCCATTAACCCAAACCTACTATTACCAATAGCCATTGCATCCGTTCTGATCGGAGGATGAGGAGGACTA [...]
+ACAACTACGAAAAATCCTAGCATACTCCTCAATCGCACACATAGGATGAATAGCAGCCATTACACTCTACAACCCCACAATAATGGTTCTAAACCTAACAATCTACATCATTATAACATTAACCACCTTTATATTATTCATATACAGCTCCTCCACAACAACCCTATCACTATCACAAACATGAAATAAAACACCTTTAATCACCTCACTAATCCTTATACTAATACTCTCCCTAGGAGGACTTCCCCCATTATCAGGATTTATCCCAAAATGAATAATCATTCTAGAACTCACCAAAAACGAAATAATTATCATACCAACCCTACTAGCAATCACAGCATTACTTAATCTGTTTTTCTACATACGACTCACATACACCACAACACTCACCATATTCCCTTCAACAAATAACATGATAATAAAATGAAAATTTGACAGCACAAAAAAAATAATTTTTCTACCCCCACTAACTGTAATCTCAACAATACTACT [...]
+CACCACTCCTATCAATCCTGGACATAAACATAATATTAGCCCTATCTGTTAATACGATACTATCCGCACTACTTGTACTAATTGCATTCTGACTGCCTCAACTAAACCCGTATGCAGAAAAAGCGAGCCCATATGAATGCGGATTTGACCCTATAGGATCTGCCCGCTTACCTTTCTCCATAAAATTTTTCTTAATCGCTATTACATTCCTACTATTTGACCTAGAAATTGCACTTCTCCTCCCCCTGCCTTGAGCCTCACAAACAAACAACTTATCAACCATGCTTACAATGGCATTACTATTAATCTTACTTCTAGCTGCAAGCCTAGCCTACGAGTGAACTCAAAAGGGATTAGAGTGAACCGAAATGTCCATTGTATATATTAACATCTTCCTAGCCTTCATTATATCTCTCCTGGGTATATTAATCTACCGATCCCACCTAATATCCTCCCTCTTATGCTTAGAAGGCATAATGCTATCCCTATTCG [...]
+ACTCTAATTATCCTAAATAATCATTTCACACTAGCCAGTATGACCCCCATCATCCTGCTAGTGTTTGCTGCCTGCGAAGCAGCACTAGGCCTGTCCCTATTAGTAATGGTATCCAACACTTATGGAAATGACTACGTACAAAATCTAAATTTACTACAATGCATTATTCTACCAACAATTATATTAATTCCACTAACATGACTATCTAAACCCAACATGATCTGAATTAACTCCACAGCTTACAGCCTATTAATTAGCCTCATCAGCCTTACATATCTCAACCAACTTAACGACAATAGCCTAAACTTCTCACTCCTATTTTTCTCAGATTCCCTATCAGCCCCCTTATTAGCACTAACTACATGACTACTACCACTAATAATCACAGCCAGCCAGTCCCACTTATCAAAAGAAACCCTGACCCGAAAAAAACTATATATTACAATACTAATCACCCTTCAACTATTCCTAATCATAACATTTACCTCTACA [...]
+TATATTCTACATTCTATTTGAAGCCACATTAATTCCTACTTTAATTATTATCACCCGATGAGGTAACCAAACAGAGCGGTTGAATGCAGGACTTTATTTCCTATTCTATACTCTCGTAGGCTCACTACCACTTCTAATTGCATTGTTATACATCCAAAACACCTCGGGATCTCTAAATTTCCTAATTATACAGTACTGAAATAAACCAATATCCACCACATGATCTAATATTTTTATATGATTAGCATGTATAATAGCATTTATAGTAAAAATGCCTTTATATGGCTTACATCTCTGACTACCCAAAGCACACGTAGAAGCCCCAATCGCTGGATCGATAGTCCTAGCCGCAGTGCTCCTGAAACTAGGGGGTTACGGGATAATACGCATCACAACACTACTTAACCCCCTAACAAACCAAATAGCATATCCCTTCCTAATACTATCACTATGAGGAATAATTATAACAAGCTCAATCTGCTTACGCCAAAC [...]
+AATCTCTAATCGCATACTCATCCGTAAGTCATATAGCTCTAGTTATCGTAGCAGTCCTAATTCAAACACCATGGAGCTATATAGGAGCAACAGCTCTAATAATTGCCCACGGACTAACATCCTCAATACTATTTTGCCTCGCAAATTCAAACTATGAACGAGTACACAGTCGAACAATAATTCTAGCACGAGGCCTACAAACCCTACTTCCCCTAATAGCTGCCTGATGACTACTGGCCAGCCTCGCAAATCTGGCCCTACCCCCATCAATTAACCTGGTCGGAGAACTATTCGTAATCATGGCCTCCTTTTCATGATCAAACACCACCATCATCCTCATGGGGACGAACATTATTATCACAGCCCTGTATTCCCTCTACATACTAATTACAACCCAACGAGGAAAAAATACATACCACACTAAAAGCATCAAACCATCGTTCACACGGGAAAATGCTTTAATAGCATTACACATACTTCCACTCGTACTCT [...]
+AAGCCCAAAATTATCCTAGGTCCTCCTTACTGTAAAATGAAAGTAATAAATATATTTACCTCTCTAACATTAACAGCCATATTCATACTATTACTACCTATTATGATGATTAGCACTAAAGCATACAAAAACGACCTATATCCTAACTACGTAAAAACCACAGTCTCCTACGCCTTCATTACCAGTATAATTCCAGCCATAATATYCATTAATTCTGGACAAGAAGCGATTATCTCCAACTGACATTGACTGACAATTCAAACCCTAAAACTCTCCATGAGCTTCAAACTAGACTACTTCTCAGTTATCTTCGTACCAGTAGCATTRTTCGTTACATGATCAATTATAGAATTCTCAATATGATATATACACGCAGACCCCTACATTAACCGATTCTTCAAATATCTTCTTATATTCCTCATTACCATAATCATCTTAGTAACCGCTAACAACCTATTYCAACTATTTATCGGATGAGAAGGAGTAGGCATT [...]
+CCTACTTATCGGATGGTGATATGGCCGAACAGACGCTAATACCGCTGCCCTCCAAGCAATCCTCTATAATCGTATTGGAGACGTAGGATTTATTATATCAATAGCATGATTCCTCTCCAATACAAACACATGAGACTTCCAACAAATCTTCGTCACACAATATGAAAATCTAAATATACCACTAATAGGCCTACTTCTAGCAGCCACTGGTAAATCCGCCCAATTTGGACTACACCCGTGACTACCATCTGCCATAGAAGGACCCACACCTGTATCCGCCCTACTTCACTCAAGCACAATAGTGGTAGCAGGGGTATTTCTACTAATTCGCTTCCACCCCCTCATGGAACAAAATAAAATGATCCAGACCTCAACTCTATGCTTAGGGGCTATTACAACACTATTCACAGCTGTATGTGCTCTAACACAAAATGACATCAAAAAAATTGTAGCTTTCTCTACCTCAAGCCAACTCGGACTTATAATTGTAAC [...]
+TCAACCAACCCCACCTCGCATTCCTGCACATCTGTACACACGCCTTCTTCAAGGCCATGTTATTCATGTGCTCCGGATCAATTATCCACAGCCTAAATGATGAACAAGACATCCGAAAAATAGGGGGCCTATATAAATCTATACCATTCACCACTACCTCCCTCATTGTTGGAAGCCTCGCACTTACAGGAATACCTTTTCTAACCGGATTCTACTCCAAAGACCTAATTATTGAAACCGCCAACACGTCGTATACCAACGCCTGAGCCCTATTAATAACCCTTATCGCCACCTCTCTAACCGCTGTCTACAGCACTCGAATTATATTCTTCGCACTCCTAGGACAACCTCGCTTTAACTCCATAGTGCTAATCAACGAGAATAACCCCCTACTAGTAAACTCAATCAAACGCCTATTAATCGGTAGCATCTTCGCGGGATACTTAATCTCATATAATATCCCCCCAATAAACATCCCACAAATAACTATGC [...]
+CTAAAACTAATAGCCCTTACCGTAACAATCATAGGCTTCATCCTAGCCCTAGAACTTAACCTAGCAACTAAAAACCTAAAATTCAATTATTCATCAAACTTCTTCAAGTTCTCCAACCTCCTGGGCTACTTCCCAACTATCATGCACCGCTCCTTACCACTAGCTAACCTCAACATAAGTCAAAAATCTGCATCAATATTACTAGACACCATCTGACTAGAAAATGTAATGCCCAAAACTATTTCCCATTTCCAAATAAAATCATCCTCTATCGTATCAAACCAAAAGGGATTAATCAAGCTCTATTTCCTCTCCTTCATAATTACTATAACCCTCAGCATCCTACTA??????ATTAATTTCCACGGG
+>Hydrurga_leptonyx
+ATGAACGAAAATCTATTCGCCTCTTTCACTACCCCTACAATAATAGGCCTCCCTATCGTAATCTTAATCATTTTATTCCCAAGCATCCTGTTTCCCTCTCCCAATCGACTAGTCAATAATCGTCTTATCTCAATCCAACAATGACTAATCCAATTAACATCGAAGCAATTATTATCTATTCATAACTACAAAGGACAAACATGAGCACTAATACTTATATCACTCATTCTATTCATCGGATCTACCAATCTACTAGGTCTCTTACCACACTCATTTACTCCTACTACTCAACTATCAATAAACCTAGGAATAGCTATCCCTCTATGAGCAGGGACCGTCATCACAGGCTTTCGACACAAAACAAAAGCATCCCTAGCCCACTTTCTACCTCAAGGAACACCCTTACCCCTTATTCCAATATTAGTAATTATTGAAACTATTAGTCTATTCATTCAACCTATGGCCCTAGCTGTACGACTAACAGCCAACATC [...]
+TCATCTACTAATTCACCTAATCGGAGGAGCTACCCTTGTCCTTATAGACATTAGCACCGCTACAGCCTCAATTACCTTTACCATCCTTATTCTCCTCACCATCCTAGAATTTGCTGTAGCCCTTATCCAAGCCTATGTCTTCACACTACTAGTTAGTTTATATCTACACGACAACACTTAAATGCCACAGCTAGATACATCAACCTGATTCATTGTAATCCTGTCTATAATTTTAACCCTATTCATTATATTTCAATTGAAACTTTCTAAACACCACTTCCTAACAAATCCAGAGCCAAAACAAACATTACCACCAAAAAGCAATACACCTTGAGAAGAAAAATGAACGAAAATCTATTCGCCTCTTTCACTACCCCTACAAATGTTCATAAACCGATGACTATTTTCCACAAACCATAAAGATATTGGTACTCTCTATCTATTATTTGGTGCATGAGCCGGTATAGTAGGTACCGCCCTCAGTCTTTTAAT [...]
+AACTAGGACAACCTGGTGCCCTGCTAGGAGACGATCAGATCTATAACGTGATTGTCACCGCCCACGCATTCGTAATAATCTTCTTCATAGTAATACCTATCATAATCGGAGGCTTCGGAAACTGATTAGTACCCCTAATAATCGGCGCTCCTGACATGGCATTCCCCCGAATAAACAATATAAGCTTCTGACTCCTTCCACCATCTTTCCTACTACTACTAGCTTCATCCATAGTAGAAGCAGGTGCAGGAACAGGATGGACTGTGTATCCTCCCTTAGCTGGTAACCTAGCTCATGCAGGAGCATCCGTAGACCTGACAATTTTCTCCCTTCACCTAGCAGGAGTATCATCCATCCTTGGAGCTATTAATTTCATTACTACTATCATCAATATAAAACCTCCTGCAATATCTCAATATCAAATTCCCCTGTTCGTGTGATCTGTACTAATCACAGCAGTCCTCCTACTGCTATCACTACCAGTCCTAGCAG [...]
+ACTATACTACTTACAGATCGAAACCTAAATACAACATTCTTTGACCCCGCTGGAGGAGGGGACCCTATTTTATATCAACATCTATTCTGATTCTTTGGACATCCCGAAGTTTATATTCTAATTCTTCCAGGATTCGGAATAATTTCGCACATCGTTACCTACTACTCAGGAAAAAAAGAACCTTTTGGCTATATAGGAATAGTATGAGCAATAATATCCATTGGCTTCCTAGGCTTCATCGTATGAGCCCACCATATATTTACCGTAGGAATGGATGTTGATACACGAGCATACTTTACTTCAGCCACTATAATTATTGCAATTCCAACAGGAGTAAAAGTATTTAGCTGATTAGCTACCCTACATGGAGGTAACATCAAATGATCTCCAGCTCTACTATGAGCTCTAGGATTTATTTTCCTATTCACAGTAGGGGGTCTTACGGGCATTGTACTAGCAAACTCGTCACTAGATATCGTACTCCACGATACA [...]
+AGTAGCACACTTCCACTACGTCTTATCAATAGGAGCAGTATTCGCTATCATAGGCGGATTTGTTCACTGATTCCCCCTATTCTCAGGCTTCACTCTTGACGACACTTGAGCAAAAATTCACTTTACAATTATATTTGTTGGGGTTAACATAACATTCTTCCCCCAACATTTCTTAGGCTTATCAGGAATACCTCGACGATATTCCGACTACCCAGACGCCTACACAACATGAAACACAGTCTCCTCTATAGGTTCTTTTATTTCACTCACAGCAGTAATGCTAATAGTATTCATGATCTGAGAAGCCTTTGCATCCAAACGAGAAGTAGCAACAGTTGAATTAACTACAACTAACATCGAGTGACTACACGGATGTCCTCCTCCTTATCATACATTTGAAGAACCTACTTATGTTGTATTAAAAATGGCGTACCCTCTCCAAATAGGCTTACAAGACGCAACTTCTCCTATTATAGAAGAATTGTTACACTT [...]
+ACACGTTAATAATCGTATTCTTAATTAGCTCACTAGTGCTCTACATCATCTCACTCATGTTAACCACAAAACTAACCCACACGAGTACAATAGATGCACAAGAAGTAGAAACAGTATGAACGATCCTACCAGCTATTATCCTAATTCTAATCGCTCTACCCTCATTACGAATCCTCTACATAATAGATGAAATCAATAACCCCTCCTTAACTGTAAAAACCATAGGACATCAATGGTACTGAAGCTACGAATACACAGACTACGAAGACCTAAACTTTGACTCATATATAATTCCTACACAAGAACTAAAACCCGGAGAACTACGACTACTAGAAGTAGACAACCGAGTAATCCTTCCAATAGAAATAACAATCCGCATGTTAATTTCATCAGAAGATGTACTCCACTCATGAGCCGTACCATCCCTAGGCCTAAAAACCGATGCCATTCCAGGACGACTAAATCAAACAACCTTAATATCCATACGACCAG [...]
+TACGGTCAATGCTCAGAAATCTGCGGTTCTAACCACAGCTTTATACCTATTGTTCTCGAATTAGTCCCACTATCTCACTTTGAAAAGTGATCTACCTCAATGCTTATGACCCACCAAACCCATGCCTACCATATAGTTAATCCCAGCCCTTGACCATTAACAGGAGCTCTCTCGGCCCTCCTCATAACGTCCGGCCTAATCATATGATTCCACTTTAACTCAATATATCTACTCCTACTAGGTCTCACAACCAACACCCTAACTATATATCAATGATGACGAGATATCATCCGAGAAAGCACATTCCAAGGCCACCACACACCAATCGTCCAAAAGGGCCTACGATATGGCATAATTCTCTTCATTGTATCAGAAGTATTCTTTTTCGCAGGCTTTTTCTGAGCTTTTTACCACTCCAGCCTAGCACCTACCCCCGAACTAGGAGGATGCTGACCACCCACAGGTATCATCCCTCTAAATCCCATAGAAGTC [...]
+AAATACTTCCGTACTTCTAGCCTCAGGAGTATCAATTACCTGAGCCCACCATAGCTTAATAGAAGGGAATCGCAAACACATACTCCAAGCACTGTTCATTACCATCTCTCTAGGCGTCTACTTCACACTCCTACAAGCCTCAGAGTACTACGAAACCCCCTTTACAATCTCCGACGGGGTATATGGCTCTACTTTCTTTATAGCAACAGGATTCCATGGACTACATGTAATTATCGGCTCCACCTTCCTGATTGTATGCTTTATACGACAATTAAAATTTCACTTTACATCTAATCACCACTTTGGATTTGAAGCTGCCGCTTGATACTGACACTTCGTAGACGTAGTATGACTATTCCTATACGTATCTATCTATTGATGAGGATCCTACATGACCAACATTCGAAAGACCCATCCACTGGCCAAAATCATCAATAACTCATTTATTGATCTACCAACACCATCAAATATCTCAGCATGATGAAATTTTGG [...]
+TCGGAATCTGCCTAATCCTACAAATCCTAACAGGCCTATTCCTAGCCATACACTACACCTCAGACACAACTACAGCCTTTTCATCAGTCACACACATCTGCCGAGACGTAAACTACGGTTGAATCATCCGATACATACATGCAAATGGAGCATCCATATTCTTCATCTGCCTATACATACACGTAGGACGAGGACTATATTACGGCTCCTATACATTCACAGAAACATGAAACATCGGCATCATCCTCCTATTTACCGTCATAGCCACAGCATTTATAGGCTACGTACTGCCATGAGGACAAATATCATTTTGAGGAGCAACCGTTATTACCAACTTACTATCAGCAATTCCCTACATCGGAACCGACCTAGTACAATGAATTTGAGGCGGATTTTCAGTCGACAAAGCAACCCTAACACGATTCTTCGCCTTCCACTTTATCCTTCCCTTCGTAGTATCAGCACTAGCAGCAGTACATCTGCTATTCTTAC [...]
+GGATCCAATAACCCCTCCGGAATTCCATCCAACTCAGACAAAATCCCATTTCACCCCTACTACACAATCAAAGACATCCTAGGAGCCCTATTCCTCATTCTAACCCTAATACTACTAGTATTATTCTCACCCGATCTACTAGGAGACCCCGACAATTACATTCCTGCTAACCCCCTAAGCACCCCACCACATATCAAACCCGAATGATATTTCCTATTTGCCTACGCAATCCTACGATCCATTCCCAACAAACTAGGAGGAGTACTAGCCCTAGTTCTTTCTATCCTAATCCTTGCCATCATCCCCCTACTCCACACATCAAAACAACGAGGAATAATATTCCGACCCATCAGCCAATGCTTATTCTGACTATTAGTAGCAGACCTACTCACACTAACATGAATCGGAGGACAACCAGTCGAACACCCCTATATCACCATCGGACAACTAGCCTCAATCCTATACTTTACAATTCTACTAGTACTAATACCT [...]
+TATCATCGAAAATAACATCCTAAAATGAATGTTTATAATCAACATTATATCACTAATTATCCCAATCCTTCTTGCCGTAGCTTTCCTAACATTAGTAGAACGGAAAGTACTAGGTTATATACAACTCCGAAAAGGACCTAACATCGTAGGACCCTACGGACTCTTACAACCTATCGCAGACGCCGTAAAACTATTCACCAAAGAACCCTTACGACCACTAACATCCTCCACATCTATATTTATTATAGCTCCCATTCTAGCCCTAGCCCTAGCCCTAACCATATGAATCCCCCTACCCATACCATACCCCCTCATCAACATAAACCTAGGAGTACTATTTATGCTAGCGATATCAAGCCTAGCTGTCTACTCAATCCTATGATCCGGATGAGCCTCAGACTCCAAATATGCCCTAATTGGAGCCCTACGAGCCGTAGCCCAAACAATCTCATACGAAGTCACCCTAGCCATCATCCTACTATCAGTCCTACT [...]
+GATCTTTCACCCTATCAACACTAATCACCACCCAAGAACACCTATGACTAATCTTCCCTGCATGACCACTGGCCATGATATGATTCATCTCCACCCTAGCAGAAACCAACCGCGCCCCATTTGACCTAACAGAAGGAGAATCAGAACTTGTCTCAGGATTCAACGTAGAATACGCAGCAGGCCCATTCGCCATGTTTTTCCTAGCGGAATATGCCAACATCATTATAATAAACATCTTCACAACCCTCCTATTCTTCGGAGCATTCCACGCCCCATACATACCCGAACTCTACACCATTAACTTCACCGTAAAAACCCTGATACTAACAATCCTATTCCTATGAATCCGAGCATCATATCCACGATTTCGATACGACCAACTAATACACCTCCTATGAAAAAACTTCCTACCCCTTACACTAGCCCTATGTATATGACACGTAACACTACCCATTATCTCAGCAAGCATCCCTCCCCAAACAATAAAACCCT [...]
+GTCATCATCATAATAACCGTTATATCAGGAACTATAATCGTCCTCACAAGCTCCCACTGACTGTTGACTTGAATCGGCTTCGAAATAAACATATTAGCGATTATCCCAATCCTAATAAAAAATTATAACCCACGAGCCATAGAAGCATCCACAAAATACTTCCTAACACAAGCCACAGCATCAATACTTCTAATAATAGGCATCATTATCAACCTCATATTTTCAGGACAATGAACAATCTCAAAAATCCCAAATCCAATCGCAGCAGGCCTAATCACCATTGCCCTAGCAATAAAACTAGGCATAGCCCCCTTCCACTTCTGAGTACCCGAAGTAACACAAGGAATCTCATTACCCTCAGGCATAATCCTACTAACATGACAAAAAATCGCACCCCTATCCGTCCTCTATCAAATCTCACCATCCATTAACCCCAAATTAATAATTACCATAGCAATTGCATCAGTACTAGTAGGAGGCTGAGGAGGACTT [...]
+CCAACTCCGAAAAATCCTAGCCTACTCATCAATCACCCACATAGGATGAATAGCCGTTATCCTCACATACAACCCCACCCTCATACTCTTAAACCTCATAATCTATATCATAATAACCCTAAGCACATTCATATTATTTATTCACAACTCATCTACAACAATATCGTCACTATCCCAAACATGGAACAAACTTCCACTCGTAACATCACTAATCCTAATACTAATACTATCACTAGGAGGCCTCCCACCATTATCAGGATTTACTCCCAAATGAATAATCATCCAAGAACTAACAAAAAATGATATAATCATCCTACCAACATTCATAGCTATCACAGCACTACTAAACCTATACTTTTACATACGACTATCCTACACCACAACACTAACCATATTCCCCTCAGCAAACAACATAAAAATAAAATGACAATTCGAAAGTACAAAGAAAATTATCCTCCTACCACCATTAATCATCACCTCAACAATACTACT [...]
+CCCCAATAATATCAATCCTAGAAATAAACATAGTACTAGCCCTATTCACCAACACTATCCTGGCCTCTTTACTCGTACTAATCGCATTCTGACTTCCCCAACTAAATATCTACTCAGAAAAAGCTAGTCCCTACGAATGTGGATTCGACCCTATGGGATCAGCACGCTTACCCTTCTCTATAAAATTTTTCTTAGTAGCCATCACATTCCTACTATTCGACCTAGAAATCGCCCTACTCCTACCACTCCCATGAGCATCACACACAAACAACCTTACTACCATACTCACCATGGCACTACTACTTATCTCCCTCCTAGCCGCAAGCCTAGCTTACGAATGAACCGAAAAAGGACTAGAATGAACAGAAATGACTATAGTATATGCTAACATCTTCCTGGCCTTCATTACATCCCTCATAGGACTGCTCATATACCGGTCCCACCTCATATCTTCCTTACTTTGCTTAGAAGGCATAATATTATCATTATTCG [...]
+ACAGTAACAATTCTAAACAACCATTTTACACTAGCCAGTATAACTCCTATTATCCTACTCGTCTTTGCCGCCTGCGAAGCAGCCCTAGGACTATCACTCCTAGTAATAGTATCCAACACATACGGAACCGACTACGTACAAAACCTAAACCTTCTACAATGCATTATTCTCCCCACTATAATACTTATACCCTTGACATGGATATCAAAACCCAACATAATCTGAATTAATACAACGACCTACAGCCTATTAATTAGCCTCATTAGCTTGCCCTTCCTAAACCAACTCAATGATAACTGCATAAACCTATCCTTATTGTTCTTCACAGACTCCCTATCAGCCCCGCTACTAACACTTACAACATGACTTCTACCCCTAATACTCATAGCCAGCCAATCCCACCTATCAAAAGAACCACTAACCCGAAAAAAACTATATATCACAATACTAATCCTATTACAATTATTCCTAATCATAACATTCACCGCCACA [...]
+CATATTCTACATCCTATTTGAAGCAACCTTAGTACCCACCTTAATCATCATCACTCGATGAGGAAACCAAACAGAACGCCTGAACGCAGGAACATACTTTCTATTTTATACTCTGGTAGGATCCCTACCCCTACTAGTAGCCTTATTATTCATTCAAAATAATATAGGCACATTAAACTTCTTAATGCTCCAGCTCTGAACCCAACCCATATCAAACTCCTGATCCAACGCCCTCCTATGACTGGCATGTATAATGGCATTCATAGTAAAAATACCATTATATGGACTTCACCTATGACTACCCAAAGCACATGTAGAGGCACCCATCGCTGGATCAATAGTACTTGCCGCAGTACTCCTAAAATTAGGAGGTTATGGTATAATGCGAATCACAATACTACTCAACCCATTAACAAATTCCATAGCATACCCCTTCATAATACTATCATTATGAGGAATAATCATAACGAGCTCTATCTGCTTACGCCAAAC [...]
+AATCCTTAATCGCATACTCCTCCGTCAGTCACATAGCCCTAGTAATTGTAGCAATTCTAATCCAAACACCATGAAGTTACATAGGAGCAACAGCCTTAATAATCGCTCACGGCCTAACATCATCTATACTATTCTGCTTAGCCAACTCCAACTACGAACGTACCCACAGCCGAACCATAATCCTCGCACGCGGACTTCAAGTGCTCCTACCCCTAATAGCAGCATGATGACTACTAGCAAGCCTCGCCAACCTAGCCCTCCCTCCCACAATCAATCTAATTGGAGAACTATTTGTAGTAATAGCCTCATTTTCATGATCCAACATTACCATCATCCTAATAGGAATCAACATCATCATTACTGCCCTATACTCACTATACATATTAATCACTACACAACGCGGAAAATATACCCATCACATCAAAAACATTAAACCCTCATTCACACGAGAAAATGCCTTAATAACACTCCACCTAATACCCCTACTACTAC [...]
+AACCCCAAAATTATTCTAGGACCCATTTACTGTAAAATAAAAGTAATTAACCTATTCACCTCCTCTATTATTATATCATTATCTATATTAACATTTCCAGTCATCCTAACCAGTACCCCAATCTACAAAAGCAAACTCTATCCACAATACGTAAAAACCACTATCTCATACGCTTTCATAATTAGCATAATCCCCACAACAATATTTATTTACTCTGGGAAAGAAATAATTATCTCAAACTGGCACTGAATAACTATCCAAACCATAAAGCTCACATTAAGTTTTAAACTAGACTATTTCTCTATAATCTTCATACCCGTAGCCCTCTTCGTCACATGATCCATCATAGAATTCTCAATATGATACATACACTCAGACCCACACATCAATCAATTTTTTAAATATCTACTAATATTTCTTATCACCATAATAATCCTAGTCACCGCAAACAACCTATTCCAACTATTCATCGGATGAGAAGGAGTAGGTATC [...]
+CCTTCTCATTGGATGATGACACGGACGAACCGACGCAAACACAGCCTCCTTACAAGCAGTCCTCTACAACCGTATCGGAGACGTAGGCTTCATCATAGCCATAGCATGATTTCTAATTAACCTAAACACATGGGAGTTTCAACAGATCTTCATTACCCACCACGATAATCTAAATATACCACTCATAGGCCTTCTACTGGCAGCAACTGGAAAATCAGCCCAATTTGGTCTCCACCCGTGATTACCATCAGCTATAGAAGGCCCTACCCCAGTATCTGCTCTACTACATTCAAGTACCATAGTAGTAGCAGGAGTCTTCCTCCTAATCCGATTCCACCCGCTAATAGAGCATAACACAACAGTACAAACAGCCACCCTATGCCTAGGAGCCACCACCACCCTATTTACAGCAATTTGTGCACTCACCCAGAATGACATCAAAAAAATCATCGCATTCTCAACCTCAAGCCAACTAGGACTTATAATCGTTAC [...]
+TTAACCAACCATACTTGGCATTCCTACATATCTGCACTCACGCATTCTTCAAAGCCATACTATTCATATGCTCCGGATCCATTATCCACAATCTAAGCGACGAACAAGACATCCGAAAAATAGGAGGACTGTACAAAGTACTACCATTTACTACCACTTCACTAATCGTAGGCAGCCTAGCACTCACAGGAATGCCCTTTCTCACAGGATTCTACTCCAAAGACCTAATCATCGAAACCGCCAACACGTCGTATACCAACGCCTGAGCCCTATTAATCACCCTCATTGCCACATCCATAACAGCCGCCTACAGCACTCGAATTTTATTCTTTGCACTTCTAGGACAACCTCGCTTCAACCCTATAATTACAACCAACGAGAACAACCCACACCTAATCAACTCCATTAAACGCCTACTATTAGGAAGCATCTTCGCAGGATACCTAATCTCCCAAAACATCACACCCACCACCATTCCACAAATAACTATAC [...]
+CTAAAACTGACAGCTCTCACCGTAACACTCCTAGGATTCACCCTAGCACTAGAACTAAACCTTACCTCACAAAGCCTAAAACTTAAATATCCATCAAACCTATTCAAATTCTCTAATCTCCTTGGATACTTCCCCATCATCATTCACCGTTATGTACCAAAAATAAACCTCTCAGCAAGCCAAAAATTGGCCTCAACATTACTAGACATAATTTGACTAGAAAGCGTATTACCAAAATCCATCTCCTACTTCCACATAAAATCATCAACCACCGTTTCTAACCAAAAAGGCCTAATCAAACTATATTTCCTCTCCTTTGTAATCACTCTAATCCTAGCCCTAACAATA??????ACTAATTTCCACGAG
+>Leptonychotes_weddellii
+ATGAACGAAAATCTATTCGCCTCTTTCACTACCCCTACAATAATAGGCCTCCCCATCGTAATCCTAATCATCTTATTCCCAAGCATCCTATTTCCCTCTCCCAATCGACTAATTAATAATCGTCTTATCTCAATCCAACAATGATTAATCCAATTAACATCGAAACAAATACTATCCATCCATAACTACAAAGGACAAACATGAGCGCTAATACTTATATCACTCATTCTATTCATTGGATCTACCAACCTACTAGGTCTCTTACCACACTCATTTACTCCTACCACTCAACTATCAATAAACCTGGGAATAGCCATCCCTCTATGAGCAGGAACGGTCATTACAGGCTTTCGACATAAAACAAAAGCATCCCTAGCTCACTTTCTACCTCAAGGAACACCCTTACTCCTTATTCCAATGTTAGTAATTATTGAAACTATCAGTTTATTCATTCAACCCATGGCCCTGGCTGTACGACTAACAGCCAATATC [...]
+TCACCTACTAATTCACCTAATCGGAGGAGCTACCCTTGTCCTTATAGACATTAGCACCGCTACAGCTTCAATTACTTTTACCATCCTTATTCTTCTCACCATCCTAGAATTTGCTGTAGCCCTTATTCAAGCCTATGTCTTCACACTACTAGTTAGTTTATATCTACACGACAACACTTAAATGCCACAGTTAGACACATCAACCTGATCCATTGTAATCCTATCTATAATTTTAACCCTATTTATTATATTTCAGCTGAAAATTTCTAAGCACCACTTCCCAACAAATCCAGAGCCAAAACAAACATTGCTACCAAAAAGCAATACACCTTGAGAAGAAAAATGAACGAAAATCTATTCGCCTCTTTCACTACCCCTACAAATGTTCATAAACCGATGACTATTTTCCACAAACCACAAAGATATTGGTACTCTCTATCTATTATTTGGTGCATGAGCCGGTATAGTAGGTACCGCCCTCAGTCTTTTAAT [...]
+AACTAGGACAACCTGGTGCTTTACTAGGAGATGATCAGATTTATAACGTGATTGTCACCGCCCACGCATTCGTAATAATCTTTTTCATAGTAATACCTATCATAATCGGAGGCTTCGGAAACTGATTAGTACCCCTAATAATCGGCGCTCCTGACATAGCATTCCCCCGAATAAACAATATAAGCTTCTGACTCTTACCGCCATCTTTCCTACTACTACTGGCCTCCTCCATAGTAGAAGCAGGCGCAGGAACAGGATGAACCGTATATCCTCCCTTAGCTGGTAACCTAGCCCACGCAGGAGCATCTGTAGACCTGACGATTTTCTCCCTTCACCTAGCAGGTGTATCATCCATCCTTGGGGCTATTAATTTCATCACTACTATCATCAATATAAAACCTCCTGCAATATCTCAATATCAAATTCCCCTATTCGTGTGATCCGTACTAATCACAGCAGTACTCCTACTACTATCACTACCAGTTCTAGCAG [...]
+ACTATACTACTTTCAGATCGAAACCTGAATACAACATTCTTTGACCCCGCTGGAGGAGGGGATCCTATTCTATATCAACACCTATTCTGATTCTTTGGACATCCTGAAGTTTACATCCTAATCCTCCCAGGATTCGGAATGATTTCACATATCGTTACCTACTACTCAGGGAAAAAAGAACCCTTTGGTTATATAGGAATAGTATGAGCAATAATATCCATCGGCTTCCTAGGTTTCATCGTATGGGCCCACCATATATTTACCGTAGGAATGGATGTTGATACACGAGCATACTTCACTTCAGCCACTATAATCATTGCAATCCCAACAGGAGTAAAAGTATTTAGCTGACTAGCTACCCTACATGGAGGCAACATCAAGTGATCCCCAGCTATACTATGAGCCCTAGGGTTTATTTTCCTATTCACAGTAGGGGGTCTTACGGGCATCGTACTAGCAAACTCGTCACTGGACATCGTACTCCACGACACA [...]
+AGTAGCACACTTCCACTACGTCTTATCAATAGGAGCAGTCTTCGCTATCATAGGCGGATTTGTTCACTGATTCCCCCTATTCTCAGGCTTCACTCTTGACGACACTTGAGCAAAAATTCACTTTACAATTATATTTGTTGGGGTTAACATAACATTCTTCCCCCAACATTTCTTAGGCTTATCAGGAATACCTCGACGATACTCCGACTACCCAGACGCCTACACAACATGAAACACAGTGTCCTCTATAGGCTCATTTATTTCACTTACAGCAGTAATACTAATAGTATTCATGATCTGAGAAGCCTTCGCATCCAAACGAGAAGTAGCAACAGTTGAATTAACTACGACTAATATCGAATGACTGCACGGATGTCCTCCTCCCTATCACACATTTGAAGAACCTACTTATGTTGTACTAAAAATGGCGTACCCTCTCCAAATAGGTTTACAAGACGCAACTTCTCCTATTATAGAAGAACTGTTACACTT [...]
+ACACGCTAATAATCGTATTCTTAATTAGCTCGCTAGTGCTCTACATCATTTCACTCATGTTAACCACAAAACTAACCCACACAAGTACAATAGATGCGCAAGAAGTAGAAACAGTATGAACAATCCTGCCAGCTATTATCCTAATTCTAATCGCCCTGCCCTCGTTACGAATTCTCTACATAATAGATGAAATCAATAACCCCTCCTTAACTGTAAAAACTATAGGACATCAATGATACTGAAGCTACGAATACACAGACTACGAGGACCTAAACTTTGACTCATACATAATTCCTACACAAGAACTAAAACCCGGAGAACTACGACTACTAGAAGTAGACAACCGAGTAGTCCTTCCAATAGAAATAACAATTCGAATACTAATTTCATCCGAAGACGTACTCCACTCATGAGCCGTACCATCCCTAGGACTAAAAACCGATGCCATTCCAGGACGACTAAATCAAACAACTTTAATATCCATGCGACCAG [...]
+TACGGTCAATGCTCAGAAATCTGTGGTTCCAACCACAGCTTCATACCTATTGTTCTCGAATTAGTCCCACTATCTCACTTCGAAAAGTGATCTACCTCAATACTTATGACCCACCAAACCCATGCCTACCATATAGTAAACCCCAGCCCTTGACCATTAACAGGGGCTCTTTCAGCCCTCCTTATAACGTCTGGCCTAATCATATGATTCCACTTTAACTCAATATATTTACTCCTACTAGGTCTCACAACCAATACCCTGACTATGTATCAATGATGACGAGATATTATCCGAGAAAGCACATTCCAAGGCCACCACACACCAATTGTCCAAAAGGGCCTACGATATGGCATAATCCTCTTTATTGTGTCAGAAGTATTCTTTTTCGCAGGTTTTTTCTGAGCCTTTTACCACTCCAGCCTAGCACCTACCCCTGAACTAGGAGGATGTTGACCACCCACAGGCATCATCCCTCTAAATCCCATAGAAGTT [...]
+AAACACTTCCGTACTTCTAGCCTCGGGAGTATCAATCACCTGGGCCCACCATAGTTTAATAGAAGGAAACCGCAAACACATGCTCCAAGCACTGTTCATTACCATCTCTCTAGGCATCTACTTCACACTCCTACAAGCCTCAGAGTACTACGAAACCCCCTTTACAATCTCCGACGGAGTATACGGCTCTACTTTCTTTATAGCAACAGGATTTCATGGACTACATGTAATTATTGGCTCCACCTTCCTAATTGTATGCTTCATACGACAATTAAAGTTTCACTTCACATCTAACCACCACTTTGGATTTGAAGCTGCCGCTTGATACTGACACTTCGTAGACGTAGTGTGACTATTCCTATACGTATCTATCTATTGATGAGGATCCTACATGACCAACATTCGAAAAACCCACCCACTAGCCAAAATCATCAACAACTCATTCATTGACCTACCCACACCATCAAATATCTCAGCATGATGAAATTTCGG [...]
+TCGGAATCTGCCTAATCTTACAAATTCTAACAGGCCTATTCCTAGCCATACATTACACCTCAGACACAACTACAGCCTTTTCATCAGTTACACACATCTGCCGAGACGTAAACTACGGCTGAATCATTCGATACATACACGCAAATGGAGCATCCATATTCTTCATCTGCCTATACATACACGTAGGACGAGGACTATACTACGGCTCCTACACATTCACAGAAACATGAAACATCGGCATCATTCTCCTATTTACCGTCATAGCCACAGCATTCATAGGCTATGTTCTACCATGAGGACAAATATCATTCTGAGGAGCAACCGTTATTACCAACTTACTATCAGCAATTCCCTACATCGGAACTGACTTAGTACAATGAATCTGAGGCGGATTTTCAGTTGACAAAGCAACCCTAACACGATTCTTCGCCTTCCACTTTATCCTTCCCTTCATAGTATCAGCACTAGCAGCAGTACATCTACTATTCTTAC [...]
+GGATCCAACAACCCTTCCGGAATTCCATCTGACTCAGACAAAATCCCATTTCACCCCTACTACACAATCAAAGACATCCTAGGGGCCCTACTCCTCATTCTAACCCTAATATTACTAGTATTATTCTCACCCGACTTGCTAGGAGATCCCGACAACTATATTCCCGCTAATCCCCTAAGTACTCCACCACATATCAAACCCGAATGATATTTCCTATTTGCCTACGCAATCTTACGATCCATCCCTAACAAACTAGGAGGAGTACTAGCCCTAGCACTCTCTATCCTAATTCTTGCCATCATCCCCCTACTCCACACATCAAAACAACGAGGAATAATATTCCGACCCATCAGCCAATGCTTATTCTGACTATTAGTAGCAGACCTGCTCACACTAACATGAATCGGGGGACAACCAGTCGAACACCCCTACATCACCATCGGACAACTAGCCTCAATCCTATACTTTATAATCCTACTAGTACTAATACCC [...]
+CATTATCGAAAACAACATCCTAAAATGAATGTTTATAATCAACATTGCATCACTAATTATCCCAATCCTCCTTGCCGTAGCTTTCCTAACATTAGTAGAACGAAAAGTACTAGGCTACATACAACTCCGAAAAGGACCCAACATCGTAGGACCCTACGGACTCCTTCAACCTATCGCAGACGCTGTAAAACTATTTACCAAAGAACCTTTACGACCACTAACATCCTCTACATCTATATTTATTATAGCCCCCATTCTAGCCCTAACCCTAGCCCTAACAATATGAATCCCCTTACCCATACCATACCCCCTCATCAACATAAACCTAGGAGTACTATTTATGCTAGCAATATCAAGCCTAGCCGTCTACTCAATCCTATGATCCGGATGAGCTTCAAACTCCAAATACGCCCTAATCGGAGCCCTACGAGCCGTAGCCCAAACAATCTCATACGAAGTTACCCTAGCCATCATCTTACTATCAGTACTACT [...]
+GATCTTTCACCCTATCAACACTAATCACCACTCAAGAACATCTATGACTAATTTTCCCTGCATGACCACTAGCCATAATATGATTCATCTCCACCCTAGCAGAAACCAACCGTGCCCCATTTGACCTAACAGAAGGAGAATCAGAACTCGTCTCAGGATTCAACGTAGAATACGCAGCAGGCCCATTCGCCATGTTTTTCCTAGCAGAATACGCCAACATCATTATAATAAATATTTTCACAACCCTCCTATTCTTTGGAGCATTCCACGCTCCATACATACCTGAACTCTACACCATTAACTTCACCATAAAAACCCTAATACTAACAATCCTATTCCTATGAATCCGAGCATCATACCCACGATTTCGATACGACCAACTAATACACCTCCTATGAAAAAATTTCCTACCCCTTACACTAGCCCTATGCATATGACACGTAACACTACCCATTATTTCAGCAAGCATTCCTCCCCAAACAATAAAACCCT [...]
+GTCATCATCATAACAACCGTTATATCAGGAACTATAATCGTCCTTACAAGCTCCCACTGACTATTAACTTGAATCGGCTTCGAAATAAACATACTAGCGATCATCCCAATCCTAATAAAAAACTATAACCCACGAGCCATAGAAGCATCCACAAAATACTTCCTAACACAAGCCACCGCATCAATACTCCTAATAATAGGCATCATCATCAACCTTATATTCTCAGGACAATGAACAATCTCAAAAATCCCAAATCCAATCGCATCAGGCCTAATCACCATCGCCCTAGCAATAAAACTAGGCATAGCCCCCTTCCACTTCTGAGTACCCGAAGTAACACAGGGAATCTCATTACCCTCAGGCATAATCTTACTCACATGACAAAAAATCGCGCCCTTATCCGTCCTCTACCAAATCTCACCATCCATCAACCCCAAACTAATAATTCCCATAGCAATCGCATCAGTACTAGTAGGAGGCTGAGGAGGACTT [...]
+TCAACTCCGAAAAATCCTAGCTTACTCATCAATTGCCCACATGGGATGAATAGCCGTTATCCTTGCATACAATCCTACCCTTATACTCCTAAACTTCACAATCTATATTATAATAACCCTAAGCACATTTATACTATTTATTCACAACTCATCCACAACAATATCATCACTATCACAAACATGAAACAAACTTCCACTCGTAACATCACTAATCCTGATACTAATACTATCACTAGGAGGCCTACCACCATTATCAGGATTTACACCTAAATGAATAATCATCCAAGAGTTAACAAAAAATGATATAATTATCCTACCAACATTCATAGCCATCACAGCACTCCTAAACCTATACTTCTACATACGACTATCCTACACCACAACACTAACTATATTCCCCTCAGCAAATAACATAAAAATAAAATGACAATTCGAAAGCACAAAGAAAATCATCCTTCTACCACCACTAATCATCACCTCAACCATACTACT [...]
+CCCCAATAATATCAATCCTGGAAATAAACATAGTACTAGCTCTATTCACCAATACTATCCTGGCCTCTTTACTCGTACTAATCGCATTCTGACTTCCCCAGCTAAATATCTACTCAGAAAAAGCTAGCCCCTATGAATGTGGATTTGACCCCATGGGATCAGCACGCCTACCCTTTTCCATAAAATTTTTCTTAGTAGCCATTACATTCCTACTATTCGACCTAGAAATCGCCCTACTCCTACCACTCCCATGAGCATCACACACAAACAACCTTACTACCATACTTACCATGGCACTACTACTTATCTCCCTCCTAGCCGCAAGCCTAGCTTACGAATGAACCGAAAAAGGACTAGAATGAGCAGAAATGACTATAGTATATGCTAACATCTTCCTGGCCTTCATCACATCTCTTATAGGACTGCTCATATACCGGTCCCACCTCATATCCTCCCTACTCTGCTTAGAGGGCATAATACTATCATTATTCG [...]
+ACAGTAACAATCCTAAACAACCATTTTACACTAGCTAGTATAACTCCCATCATCCTACTTGTATTCGCTGCCTGCGAAGCAGCCCTAGGATTATCACTCCTAGTAATAGTATCCAACACATACGGAACCGACTACGTACAAAACCTAAACCTCCTGCAATGCATTATTCTCCCCACTATAATACTTATACCCCTAACATGAATATCAAAACCCAATATAATCTGAATCAACACAACAACCTACAGCCTATTAATTAGCCTCATTAGCTTACTCTTTCTAAACCAACTCAATGATAACTGCACAAATCTATCCCTATCATTCTTCACAGACTCCTTATCAGCCCCACTACTAACACTTACAACATGACTCCTACCCCTAATACTCATAGCTAGCCAGTTCCACCTATCAAAAGAACCACTAACCCGAAAAAAACTATACATCACAATACTAATCTTATTACAATTATTCCTAATCATAACATTCACCGCCACA [...]
+CATATTTTACATCCTATTTGAAGCGACCCTAGCACCCACCCTAATCATCATTACTCGATGAGGAAACCAAACAGAACGCCTAAACGCAGGAATATACTTTCTATTTTATACTCTAGTAGGATCCCTACCCCTACTAGTAGCCTTACTATTTATCCAAAACAACATAGGCACATTAAACTTCTTAATACTCCAACTCTGATCCCAACCCATACCAAACTCCTGATCTAATACCCTCTTATGACTAGCATGTATAATGGCATTCATAGTAAAAATACCATTATATGGACTCCACCTATGACTACCCAAAGCACATGTAGAGGCACCCATCGCTGGATCAATAGTACTTGCCGCAGTACTTCTAAAATTAGGAGGCTATGGTATAATACGAATTACAATCCTACTCAACCCATTAACGAATTCCATAGCATACCCCTTTATAATACTATCACTATGAGGAATAATCATAACGAGCTCTATCTGCTTACGCCAAAC [...]
+AATCCCTAATCGCATACTCCTCCGTCAGCCACATAGCCCTAGTTATCGCAGCAATTCTAATTCAAACACCATGAAGTTATATAGGAGCAACAGCCTTAATAATCGCTCACGGCCTAACATCATCCATACTATTCTGCTTAGCCAACTCCAACTATGAACGTACCCATAGCCGAACCATAATCCTCGCGCGCGGACTTCAAGTACTCCTACCCCTAATAGCAGCATGATGACTACTAGCAAGCCTCACCAACCTAGCTCTACCTCCTACCATCAATCTAATCGGAGAACTATTTGTAGTAATAGCCTCATTTTCATGATCCAATATTACCATCATCCTAATAGGAACCAACATCATCATTACTGCCCTATACTCATTATATATACTAATTACCACACAACGCGGAAAATATACCCACCACATCAAAAACATCAAACCCTCATTCACACGAGAAAATGCCTTAATAGCACTTCACCTAATACCCCTACTACTAT [...]
+AACCCCAAAATCATTCTAGGACCCATTTACTGTAAAATAAAAGTAATTAATCTATTCACCTCTTCTATTATCACATCACTATCTATATTAACATTTCCAGTCATCCTAACCAGCACCTCAATCTACAAAAGCAAACTCTATCCACAATACGTAAAAACTACCATCTCATACGCCTTCATAATCAGCATAATCCCTACCACAATATTTATCTACTCAGGAAAAGAAATAATCATCTCAAACTGACACTGAATAACCATCCAAACCATAAAACTCACACTAAGCTTTAAACTAGATTACTTCTCCATAATCTTTATACCTGTAGCCCTATTCGTCACATGATCTATCATAGAATTCTCAATATGATACATGCACTCAGACCCATATATCAATCGATTCTTTAAATACCTACTAATATTTCTCATCACCATAATAATCCTAGTCACCGCAAACAACCTATTCCAACTATTCATTGGATGAGAAGGAGTAGGTATC [...]
+CCTTCTCATTGGATGATGACACGGACGAACCGACGCAAACACAGCCGCCTTACAAGCAGTCCTCTACAACCGTATCGGAGACGTAGGTTTCATCATAGCTATAGCATGATTTTTAATCAACCTAAATACATGAGAATTTCAACAGATCTTCATTACCCACCACGACAACCTAAACATACCACTCATAGGCCTTCTACTAGCAGCAACCGGAAAATCAGCCCAATTTGGTCTCCACCCATGATTACCATCAGCTATAGAAGGTCCCACCCCAGTATCTGCCCTACTACATTCAAGCACTATAGTAGTAGCAGGAGTCTTCCTCCTAATCCGATTTCACCCACTAATAGAATATAACACAACAGTGCAAACAACCACCCTATGTCTAGGAGCTATCACCACCCTATTTACAGCAATCTGCGCACTCACCCAGAATGACATCAAGAAAATTATCGCATTCTCAACCTCAAGCCAACTAGGACTCATAATCGTCAC [...]
+TCAATCAACCATACCTGGCATTCCTACATATCTGCACCCACGCATTCTTCAAAGCCATGCTATTCATATGTTCCGGATCCATTATCCACAATTTAAACGATGAACAAGACATTCGAAAAATAGGAGGACTGTATAAAGTACTGCCATTCACTACCACCTCACTAATCGCAGGTAGCCTAGCACTCACAGGAATACCCTTTCTCACAGGATTCTACTCTAAAGACCTAATCATCGAAACCGCCAATACGTCGTACACCAACGCCTGAGCCCTATTAATAACCCTCGTTGCCACATCCATAACAGCCGCCTACAGTACCCGAATTCTATTCTTCGCACTTCTAGGACAACCCCGCTTCAACCCCATAATCACAACCAACGAAAACAACCCACACCTAATTAACTCCATTAAACGCCTACTACTAGGAAGCATCTTCGCAGGATACCTAATCTCCCAAAACATCACACCTACCACTATTCCACAAATAACTATAC [...]
+CTAAAACTAACAGCCCTTTCCGTGACACTTCTAGGATTCATCCTAGCACTAGAACTAAACCTTACCTCACAAAGCCTCAAACTTAAATACCCATCAAACCTATTCAAATTCTCTAATCTCCTTGGATACTTCCCCATCATCATTCACCGCTACGTACCAAAAATAAACCTCTCAGCAAGCCAAAATTTGGCCTCAACACTACTAGACACAATTTGACTAGAAAGTGCACTACCAAAATCCATCTCTTACTTCCACATAAAATCATCAACTACCATTTCTAACCAAAAAGGCCTAATCAAACTGTACTTCCTCTCTTTCATAATCACTTTAATCCTAGCCCTAACAATA??????ATTAATTTCCACGAG
+>Lobodon_carcinophaga
+ATGAACGAAAATCTATTCGCCTCTTTCACTACCCCTACAATAATAGGCCTTCCTATTGTAATTCTAATCATCCTGTTCCCAAGCATCCTATTTCCTTCTCCTAATCGACTAATTAACAACCGACTTATCTCAATTCAACAATGACTAATTCAACTAACATCAAAACAAATACTATCAATTCACAACCACAAAGGACAAACATGAGCACTAATACTTATATCACTCATTCTATTCATTGGATCTACCAACTTACTAGGTCTCCTACCACACTCATTTACCCCTACCACTCAACTGTCAATGAATCTAGGAATAGCTATCCCCCTATGAGCAGGAACAGTCATTATAGGCTTTCGGCATAAAATAAAAGCGTCCCTAGCCCACTTTCTACCTCAAGGAACACCCCTACTCCTTATCCCAATATTAGTAATTATTGAAACTATCAGTCTATTCATCCAACCCATAGCCCTGGCTGTACGACTAACAGCCAACATC [...]
+TCACCTACTGATTCACCTAATCGGAGGGGCTACCCTTGTCCTTATAGACATTAGCACTGTTACAGCCTCAATTACTTTTATCATCCTTATTCTACTCACTATTCTAGAATTTGCTGTAGCCCTCATTCAGGCCTATGTCTTCACATTACTAGTTAGTCTGTATCTACATGACAACACCTAAATGCCACAATTAGATACATCAACCTGATCCATTGTAATCCTATCCATAATTTTAACCCTATTCATTATATTCCAACTGAAAATTTCTAAACACCACTTCCCAACAAATCCAGAACCAAAACAAACACTACTATCAAAAAGCAATACGCCTTGAGAAGAAAAATGAACGAAAATCTATTCGCCTCTTTCACTACCCCTACAAATGTTCATAAATCGATGGCTATTTTCCACAAATCACAAAGATATTGGCACTCTCTACCTACTATTCGGTGCATGAGCCGGCATAGTAGGTACCGCCCTCAGTCTTTTAAT [...]
+AACTAGGACAACCTGGCGCTTTACTAGGAGACGACCAAATTTATAACGTGATCGTCACCGCCCACGCATTCGTAATAATCTTTTTTATAGTAATACCTATCATAATCGGAGGCTTCGGAAACTGATTAGTACCCTTAATAATTGGTGCTCCTGACATAGCATTTCCCCGAATAAATAATATGAGCTTCTGACTTCTACCACCATCCTTCTTATTACTACTAGCTTCCTCCATGGTAGAAGCAGGTGCAGGAACAGGATGAACCGTATATCCTCCCTTAGCTGGCAATCTAGCTCATGCAGGAGCATCTGTAGACTTAACAATTTTCTCTCTTCACCTGGCAGGTGTATCATCCATCCTTGGGGCTATTAATTTTATTACTACCATTATCAACATAAAACCTCCTGCAATATCTCAATACCAAATTCCCCTATTCGTGTGATCCGTACTGATCACAGCAGTACTCCTACTGCTATCACTACCAGTCCTAGCAG [...]
+ACTATACTACTTACAGATCGAAATCTAAATACAACATTCTTCGATCCTGCTGGAGGAGGTGACCCTATTCTGTATCAACATCTATTTTGATTCTTTGGACACCCTGAAGTTTACATTCTAATCCTTCCAGGATTCGGAATGATTTCACATATCGTTACCTATTATTCAGGGAAAAAAGAACCTTTTGGTTATATAGGAATAGTCTGAGCAATAATATCTATCGGCTTCTTAGGCTTCATCGTATGAGCCCACCATATATTCACTGTAGGAATAGATGTTGATACACGAGCATACTTCACCTCAGCCACTATAATTATTGCAATTCCAACAGGAGTAAAAGTCTTTAGCTGATTAGCTACTCTACACGGAGGCAACATCAAGTGATCTCCAGCTATACTATGAGCTCTAGGGTTTATCTTCCTATTCACAGTAGGAGGTCTTACGGGCATCGTATTAGCAAACTCATCACTAGATATCGTACTCCATGATACA [...]
+AGTAGCGCACTTCCACTACGTCTTATCAATAGGAGCAGTCTTCGCTATTATAGGCGGATTCGTTCACTGATTCCCCCTATTCTCAGGCTTCACTCTCGATGATACCTGAGCAAAAATTCACTTCACAATTATATTTGTTGGAGTTAACATAACATTCTTCCCTCAACATTTCTTAGGCTTATCAGGAATACCTCGACGATACTCCGACTACCCAGACGCCTACACAACATGAAACACAGTCTCCTCTATAGGCTCATTTATTTCACTTACAGCAGTAATACTAATAGTATTTATGATCTGAGAAGCCTTCGCATCCAAACGAGAAGTGGCAGTAGTTGAATTAACTACGACTAATATCGAATGACTACACGGATGTCCTCCTCCTTATCATACATTTGAAGAACCTACTTATGTTGTATTAAAAATGGCGTACCCTCTCCAAATAGGTTTACAAGACGCAACCTCCCCTATTATAGAAGAACTGCTACACTT [...]
+ATACATTGATAATCGTATTCTTAATCAGCTCACTAGTGCTCTACATCATTTCACTTATATTAACCACAAAACTAACCCACACAAGTACAATAGATGCACAAGAAGTAGAGACGGTATGAACAATCCTACCAGCTATTATCCTAATTCTAATCGCCCTACCCTCATTACGAATCCTCTATATAATAGACGAAATCAATAATCCCTCCTTAACCGTAAAAACCATAGGACATCAATGATACTGAAGCTATGAATACACAGACTATGAAGACCTAAACTTTGACTCATACATAATTCCTACACAAGAACTAAAGCCCGGAGAACTACGACTACTAGAAGTAGATAACCGAGTAGTCCTTCCAATAGAAATAACAATCCGCATATTAATTTCATCAGAAGACGTACTCCACTCATGAGCTGTACCATCCCTAGGACTAAAAACTGACGCCATTCCAGGACGACTAAACCAAACAACCTTAATATCCATACGACCAG [...]
+TACGGTCAATGCTCAGAAATCTGCGGTTCTAACCACAGCTTTATACCTATCGTTCTCGAATTAGTCCCACTATCTCACTTTGAAAAGTGATCTACCTCAATACTTATGACCCACCAAACCCATGCCTACCATATAGTTAATCCTAGCCCATGACCATTAACAGGAGCTCTCTCGGCCCTCCTTATAACATCTGGCCTAATCATATGATTCCACTTTAACTCAATATACTTACTCCTACTAGGTCTCACAACCAATACTCTAACTATATATCAATGATGACGAGATATCATTCGAGAAAGTACATTCCAAGGCCACCATACTCCAATCGTCCAAAAGGGCCTACGATATGGCATAATTCTTTTCATCGTATCAGAAGTATTCTTCTTCGCAGGTTTCTTCTGAGCCTTCTACCACTCCAGCCTAGCACCTACCCCCGAACTAGGAGGATGCTGACCACCCACAGGCATCATCCCCCTAAACCCCATAGAAGTT [...]
+AAATACCTCCGTACTTCTAGCCTCAGGAGTATCAATCACCTGAGCCCATCATAGCCTAATAGAAGGAAACCGTAAACACATACTCCAAGCACTATTCATTACCATCTCCCTAGGCGTCTACTTCACACTATTACAAGCCTCAGAGTACTACGAAACTCCTTTTACAATCTCCGACGGAGTGTACGGTTCTACTTTCTTTATAGCAACAGGATTTCATGGATTACATGTAATCATTGGCTCCACTTTCCTAATCGTATGCTTCATACGACAATTAAAATTCCACTTTACATCCAACCACCACTTTGGATTCGAAGCCGCTGCTTGATACTGACACTTCGTAGATGTAGTATGACTATTCCTATACGTATCTATCTATTGATGAGGATCCTACATGACCAACATTCGAAAAACCCACCCACTAGCCAAAATCATCAACAACTCATTTATCGATCTGCCCACACCACCAAATATCTCAGCATGATGAAACTTTGG [...]
+TCGGAATCTGCCTAATTCTACAAATTCTAACAGGTCTATTCCTAGCCATACATTACACCTCAGACACAACTACAGCCTTCTCATCAGTTACACACATCTGCCGAGATGTAAACTACGGTTGAATCATCCGATACATACACGCCAATGGAGCATCCATATTCTTTATCTGCTTATATATACACGTGGGACGAGGACTATACTACGGCTCCTATACATTCACAGAAACATGAAACATCGGCATTATCCTCCTATTTACCATCATAGCCACAGCATTCATAGGCTATGTACTACCATGAGGACAAATATCATTTTGGGGGGCAACCGTCATTACCAACCTACTATCAGCAATCCCCTACATCGGAACCGACCTAGTACAATGAATCTGAGGCGGATTTTCAGTCGACAAGGCAACCCTAACACGATTCTTTGCCTTTCACTTTATTCTACCCTTCGTAGCATCAGCACTAGCAGCAGTACATCTACTATTCTTAC [...]
+GGATCCAACAACCCTTCCGGAATCCCATCCGACTCAGACAAAATTCCATTTCACCCGTATTACACAATTAAAGACATCCTAGGAGCCCTACTCCTCATCCTGATCCTAATACTACTAGTTCTATTCTCACCCGACTTATTAGGAGACCCCGACAACTACATCCCTGCCAACCCCCTAAGTACCCCACCACATATCAAACCCGAATGATATTTCCTATTTGCCTACGCAATCCTACGATCCATCCCTAACAAACTAGGAGGAGTACTAGCCCTAATACTTTCCATCCTAATTCTCGCCATCATTCCCCTGCTCCACACATCAAAACAACGAGGAATAATATTCCGACCCATCAGCCAATGCTTATTTTGACTACTAGTAGCAGACCTACTCACACTAACATGAATCGGAGGACAGCCAGTCGAACACCCCTACATCACCATCGGACAACTAGCCTCAATCCTATACTTCATAATTCTACTAGTACTAATACCC [...]
+CATTATCGAAAATAATATCCTAAAATGAATGTTTATAATCAACATCGCATCACTAATCATTCCAATCCTCCTTGCCGTAGCTTTCCTAACATTAGTAGAACGAAAAGTACTAGGCTACATACAACTCCGAAAAGGACCCAACATCGTAGGACCCTACGGACTCCTACAACCCATCGCAGACGCTGTAAAACTATTTACTAAAGAACCTTTACGACCATTAACATCCTCCACATCCATATTCATTATAGCCCCCATTCTAGCCCTAACTTTAGCCCTAACTATATGAATCCCCCTACCTATGCCATACCCCCTTATCAACATAAACCTAGGAGTACTATTCATGCTAGCAATATCAAGCCTAGCCGTCTATTCAATCCTATGATCCGGATGAGCCTCAAACTCCAAATACGCTCTAATCGGGGCCCTACGAGCCGTAGCCCAGACAATTTCATACGAAGTAACCCTAGCCATCATCTTACTATCAGTCCTATT [...]
+GATCCTTCACCCTATCAACACTAATCACTACTCAAGAACATTTATGACTAATCTTCCCTGCATGACCACTAGCCATAATATGATTCATCTCCACCCTAGCAGAAACTAACCGCGCTCCATTTGACCTAACAGAAGGAGAATCAGAACTCGTCTCAGGATTCAACGTAGAGTATGCAGCTGGCCCATTCGCCATATTCTTCCTAGCAGAATACGCCAACATCATTATAATAAACATTTTCACAACCCTCCTATTCTTCGGAGCATTCCACACCCCATACATACCTGAACTCTACACCATTAACTTCATCATAAAAACCCTAATATTAACAATCCTATTCCTATGAATCCGAGCATCATACCCACGATTCCGATATGACCAACTAATACATCTCCTATGAAAAAACTTCTTACCCCTTACACTAGCCTTATGTATATGACACGTAACATTACCCATTATCTCAGCAAGTATTCCTCCTCAAACAATAAAACCCT [...]
+GTCATCATCATAACAACTGTTATATCAGGAACTACAATCGTTCTTACAAGCTCCCACTGACTATTAACTTGAATTGGCTTCGAAATAAATATACTAGCGATTATCCCAATCCTAATAAAAAACTACAACCCACGAGCCATAGAAGCATCCACAAAGTACTTCCTAACACAAGCCACCGCATCAATACTCCTAATAATGGGCATCATCATTAACCTAATATTCTCAGGACAATGAGTGATCTCAAAAATCCCAAACCCAATCGCATCAGGCCTAATTACTATTGCCCTAGCAATAAAACTAGGCATAGCCCCCTTTCACTTCTGAGTACCCGAAGTAACACAAGGAATCTCGCTACCCTCAGGTATAATCCTACTTACATGACAAAAAATCGCACCCCTATCCGTTCTTTACCAAATCTCACCCTCCATCAACCCCAAACTAATAATCCCCATAGCAATTGCATCAGTCCTAGTAGGAGGCTGAGGAGGACTC [...]
+CCAACTCCGAAAAATCCTAGCCTACTCATCAATTGCTCACATAGGATGAATAGCCGTTATCCTGACATACAACCCCACTCTCATACTCTTAAACCTCGTAATTTACATCATAATAACCCTAAGCACATTCATACTATTCATACATAACTCATCTACAACAATATCATCACTATCACAAACATGAAACAAACTACCACTCTTAACATCACTGATCCTAATACTAATACTATCACTAGGAGGCCTCCCACCATTATCAGGATTTACACCTAAATGAATAATTATCCAAGAACTAACAAAAAATGATATAATTATTCTACCAACATTCATAGCCATCACGGCACTCCTAAATCTATACTTCTACATACGACTATCGTACACCACAACACTAACAATATTTCCCTCAGCAAACAACATAAAAATAAAATGACAATTCGAAAGTACAAAGAAAATCATCCTTCTACCACCATTAATCATCACCTCAACTATACTACT [...]
+CCCCAATACTATCAATCTTAGAAATAAACATAGTACTAGCTCTATTTACCAATACCGCTCTAGCCTCTCTACTCGTATTAATCGCATTCTGACTCCCCCAACTAAACATTTATTCAGAAAAAGCTAGCCCCTATGAATGTGGATTTGATCCTATAGGATCAGCACGCTTACCCTTCTCCATAAAATTTTTCCTAGTAGCTATTACATTCTTACTATTCGACTTAGAAATCGCCCTGCTCCTACCACTTCCATGAGCATCACATACAAACAATCTCACTACTATACTCACCATAGCACTATTACTTATCTCCCTCCTAGCCGCAAGCCTAGCTTACGAATGAACCGAAAAAGGGCTAGAATGAACAGAAATGACCATAGTATATGCTAACATCTTCCTGGCCTTCATTACATCTCTCATAGGACTGCTCATATACCGGTCCCACCTCATATCTTCCTTACTTTGCTTAGAAGGTATAATACTATCACTATTCG [...]
+ACAGTAACAATCCTAAACAACCATTTCACACTAGCTAGTATAACTCCCATTATCCTGCTCGTCTTTGCCGCCTGTGAAGCAGCCCTAGGATTATCACTCCTAGTAATAGTATCCAACACATACGGAACCGACTACGTACAAAACCTAAACCTCCTACAATGCATTATCCTCCCCACTATAATACTTGTACCCTTGACATGAATATCAAAACCTAATATAATCTGAATCAACACAACAACCTACAGCCTATTAATTAGCCTCATTAGCCTACCTTTTCTAAATCAACTTAATGACAACTGCATAAATCTATCCCTATTATTCTTCACAGACTCCCTATCAGCCCCACTACTATCACTCACAACATGACTTCTACCCCTGATACTCATAGCCAGTCAATTCCACCTATCAAAAGAATCACTAACTCGAAAAAAACTATACATCACAATACTAATCTTATTACAGTTATTCCTAATCATAACATTTACCGCCACA [...]
+CATATTCTACATCCTATTTGAAGCAACCCTAGTACCTACCTTAATTATCATTACCCGATGAGGGAACCAAACAGAACGCCTAAATGCAGGAATATACTTTCTATTTTACACTCTAGTAGGATCCTTACCCCTGCTAGTAGCCCTATTATTCATCCAAAATAACATAGGCACATTAAACTTCTTAATACTCCAACTTTGAACCCAACCTATACTAAATTCCTGATCCAATACCCTCCTATGATTAGCATGCATAATAGCATTCATGGTAAAAATACCCCTATATGGACTTCACTTGTGACTACCCAAAGCACATGTAGAAGCACCCATCGCTGGATCAATAGTACTTGCCGCAGTACTCCTGAAACTAGGAGGTTATGGTATAATACGAATCACAATATTACTAAACCCATTAACAAATTCCATAGCATATCCCTTTATAATACTATCACTATGAGGCATGATCATAACGAGCTCTATCTGCTTACGCCAAAC [...]
+AATCCTTAATCGCATACTCCTCCGTCAGTCACATAGCCCTAGTTATCGTTGCAATTCTCATCCAAACACCGTGAAGCTACATAGGAGCAACAGCCCTAATAATCGCTCATGGTCTAACATCATCCATATTATTCTGTCTAGCTAACTCCAACTACGAACGCACCCACAGCCGAACAATAATCCTTGCACGCGGACTTCAAGTACTCCTGCCCCTAATAGCAGCATGATGACTACTAGCAAGTCTCACTAACCTAGCTCTCCCTCCCACCATTAACCTAATTGGAGAATTATTCGTAGTAATAGCCTCATTTTCATGATCTAACATTACCATTATCCTAATAGGAACCAATATCATTATCACTGCCCTATACTCATTATATATACTAATCACCACACAACGCGGAAAATACACCCACCATATCAAAAACATCAAACCTTCATTCACACGAGAAAATGCCTTAATAGCACTCCACCTAACACCCCTATTACTAC [...]
+AACCCAAAAATCATCCTAGGACCCATTTACTGTAAAATAAAAGTAATTAATCTATTCACCTCCTCTATCATTACATCATTATTTATATTAACACTCCCGATCATCTTAACCAGCACCCCAATCTACAAAAACAAGCTTTACCCACAGTATGTAAAAACTACCATCTCATACGCCTTTATAATTAGCATAATCCCCACAATAATATTCATCTACTCAGGAAAGGAAATAATTATCTCAAACTGACACTGAATAACCATCCAAACCATAAAACTCACACTAAGTTTTAAACTAGATTACTTCTCCATAATCTTTATACCCGTAGCCCTTTTCGTCACATGATCTATCATAGAATTCTCAATATGATACATACACTCAGACCCTTACATCAACCGATTCTTTAAATATCTTCTAATATTTCTTATTACCATAATAATCCTAGTAACCGCAAACAATCTGTTCCAACTATTCATCGGATGAGAAGGAGTAGGCATC [...]
+TCTTCTCATTGGATGGTGACACGGACGAACCGATGCAAACACAGCCGCCTTACAAGCAGTCCTCTACAACCGTATTGGAGACGTAGGCTTCATCATAGCTATAGCATGATTTCTAATTAACCTAAACACATGAGAATTCCAACAAATCTTTATCACACACCACGACAATCTAAACATACCACTAATAAGCCTTTTACTAGCAGCAACCGGAAAATCGGCCCAATTTGGTCTTCACCCATGACTACCATCAGCTATAGAAGGCCCTACTCCGGTATCCGCCCTACTTCACTCGAGCACTATAGTAGTAGCAGGGGTCTTCCTCCTAATCCGATTTCACCCACTAATAGAATATAACACAACAGCACAAACGGCCACCCTATGCCTAGGAGCTATTACCACCTTATTTACAGCAATCTGCGCACTCACCCAGAATGACATCAAAAAAATCATCGCATTCTCAACCTCAAGCCAGCTAGGACTTATAATCGTCAC [...]
+TCAACCAACCGCACTTGGCATTCCTACATATCTGTACTCACGCATTCTTCAAAGCCATATTATTCATATGCTCCGGATCCATCATCCACAATCTAAACGACGAACAAGACATTCGAAAAATAGGAGGACTGTACAAAGTCCTACCATTCACTACCACCTCACTAATCGTAGGAAGCCTAGCACTCACAGGAATACCCTTCCTTACAGGATTTTACTCCAAAGACCTAATCATCGAAACCGCCAATACGTCGTATACCAACGCCTGAGCCCTATTACTAACCCTCGTTGCCACATCCATAACAGCTGCCTACAGTACCCGAATTCTATTCTTCGCACTTCTAGGACAGCCCCGCTTCAACCCTATAATTACAACCAACGAGAATAATCCACACCTAATCAATTCCATTAAACGCCTACTACTAGGAAGTATTTTCGCAGGATACCTAATCTCCCAAAACATTACACCCACCACCATCCCACAAATAACTATAC [...]
+CTAAAATGGACAGCTCTTACCGTAACACTCCTAGGATTCATCCTAGCACTAGAACTAAACCTTACCTCCCAAAGCCTTAAACTCAAATACCCATCAAACCTATTCAAATTCTCCAACCTCCTCGGATACTTCCCCATTATCATTCACCGCTATGTACCAAATATAAACCTCTCAGCAAGCCAAAAACTAGCCTCAACATTACTAGACACAATCTGACTAGAGAGTGCACTACCAAAATCCATCTCCTACTTCCACATAAAATCATCAACCACCATTTCCAACCAAAAAGGCCTAATCAAATTATATTTCCTCTCTTTTGTAATCACCCTAATCCTAGCCCTAACAATA??????ATTAATTTCCACGAG
+>Lontra_canadensis
+ATGAACGAAAATCTATTTTCCTCTTTCATTACCCCTATAATGATAGGCCTACCAGTTGTTGTAGTTATTGTCATATTCCCAAGTATCATGTTCCCTTCACCCAGCCGACTAATTAACAATCGACTTATCTCCATTCAACAGTGACTGGTGCAACTAACATCAAAGCAGATATTGTCTATCCACAATCAAAAAGGACAAACCTGAGCATTAATACTACTATCACTGATCCTATTCATTGGCTCAACCAACCTATTAGGCCTCTTACCCCACTCATTTACCCCCACCACCCAGCTATCCCTGAACCTGGGAATAGCCATCCCCTTATGAGCGGGCACAGTAATTACTGGCTTCCGGTACAAAACAAAGGCCTCCCTAGCCCACTTCCTACCGCAAGGAACGCCGCTTCCCCTAATTCCCATGCTCGTCATCATCGAAACCATCAGTCTATTTATTCAACCTATGGCCCTGGCCGTACGACTAACGGCTAACATC [...]
+CCACCTATTAATCCACCTTATCGGAGGGGCCACCCTAGCTCTAATAAGCATCAGCACTACTATGGCAATTATTACTTTTATTATCCTTATACTCCTAACCATCCTAGAATTCGCAGTGGCCCTCATCCAAGCCTATGTATTTACCTTACTAGTTAGCTTATACCTACATGACAACACCTAAATGCCACAACTAGACACTTCAACATGATTTATCACAATCATATCAATACTTGTTACCCTGTTCTTCGTATTTCAGCTGAAAGTATCAAAGTACCACTTTCCAGAAAACCCCGAACCAAAACTAGCGGCTACATCAAAATATGCCACACCTTGAGAAGAAAAATGAACGAAAATCTATTTTCCTCTTTCATTACCCCTA???ATGTTCGTAAATCGATGGTTATTCTCTACAAATCACAAAGATATTGGCACCTTGTACCTTTTATTCGGTGCGTGAGCTGGAATGGTAGGAACTGCTCTTAGCCTACTAAT [...]
+AATTAGGTCAACCTGGCGCTTTGCTAGGGGACGACCAGATTTATAATGTTATCGTCACCGCCCACGCATTCGTAATGATTTTCTTCATGGTCATACCAATTATAATCGGGGGATTCGGAAACTGGCTAGTGCCCCTTATAATTGGTGCACCCGACATGGCATTTCCCCGAATAAACAACATAAGCTTTTGGCTTCTGCCTCCTTCATTCCTTCTTCTCTTGGCCTCATCCATGGTAGAATCGGGTGCGGGAACAGGATGAACCGTATACCCCCCTTTAGCTGGAAATCTGGCACATGCAGGAGCATCAGTAGACCTGACAATTTTTTCCCTACACCTGGCAGGTGTTTCGTCCATCCTAGGGGCCATTAACTTCATTACCACTATTATTAACATAAAACCACCCGCAATGTCACAATACCAGACCCCTCTATTTGTGTGATCTGTACTGATCACGGCTGTGCTCCTACTACTATCTCTGCCCGTACTAGCAG [...]
+ACCATATTGCTTACAGACCGAAATCTCAATACTACTTTCTTCGACCCCGCCGGAGGAGGAGACCCCATCCTGTACCAACACCTATTCTGATTTTTCGGGCACCCGGAGGTATACATCCTAATTCTACCAGGGTTTGGGATTATTTCACACGTCGTAACGTATTATTCAGGAAAGAAAGAACCATTTGGTTACATAGGAATGGTCTGAGCAATAATATCAATTGGTTTTCTGGGGTTTATCGTGTGAGCCCATCACATATTTACCGTAGGCATGGACGTCGACACACGAGCATATTTTACGTCAGCTACCATAATTATTGCAATCCCTACAGGAGTAAAAGTGTTTAGCTGACTGGCCACTCTGCACGGAGGAAATATTAAATGGTCGCCAGCTATACTATGGGCTCTAGGATTTATTTTTCTATTCACGGTAGGCGGTCTGACGGGTATTGTATTATCAAATTCGTCACTAGACATTGTCCTTCACGACACA [...]
+AGTAGCACATTTCCACTATGTCCTTTCGATAGGGGCAGTGTTTGCAATTATAGGTGGATTCGTCCATTGGTTCCCCCTATTTACGGGCTACACTCTAAATGATATTTGAGCAAAAATCCACTTCACAATTATATTTGTAGGAGTAAACATGACATTCTTTCCTCAACATTTCCTAGGCCTATCCGGTATACCTCGACGCTATTCTGATTACCCAGATGCCTATACAACATGAAACGCGGTATCTTCCATAGGCTCATTCATCTCACTGACAGCGGTAATGCTAATAATCTTCATAATCTGAGAGGCCTTCGCATCCAAACGAGAGGTATTGACGGTGGAACTCACCTCAACAAACATTGAATGATTACACGGATGCCCTCCACCATATCACACCTTTGAAGAACCTACTTATGTAGTGTCAAAAATGGCGTACCCTTTCCAAATAGGCCTCCAAGATGCAACCTCCCCTATTATAGAAGAGCTCCTGCACTT [...]
+ATACGTTAATGATTGTATTCCTAATTAGCTCCCTCGTACTCTACATCATTTCACTAATGCTAACTACCAAACTCACACATACTAGCACCATGGACGCTCAGGCGGTTGAAACAATCTGAACTATCTTGCCTGCTATTATTTTAATTCTAATTGCCCTGCCTTCACTACGAATCCTCTACATAATAGACGAAATCAACAGCCCCTCCCTAACCGTAAAAACCATAGGGCATCAATGATATTGAAGCTACGAGTACACGGATTATGGGGATTTAAACTTTGACTCTTATATAATCCCCACTCAAGAATTAAAGCCAGGAGAACTGCGACTACTGGAAGTGGACAATCGAGTGGTCCTCCCAGTGGAGATGACAGTTCGTATATTAATTTCATCCGAAGACGTACTGCACTCGTGGGCCGTACCATCCCTAGGATTAAAAACCGACGCTGTCCCGGGACGCCTGAATCAAACCACCCTCATAGCCATGCGACCAG [...]
+TATGGCCAATGCTCCGAAATCTGCGGCTCTAACCACAGCTTTATGCCAATTGTCCTCGAACTAGTACCCTTACCACACTTCGAAAAATGATCTGCCTCTGTATTAATGACCCACCAGACACACTCATATCACATGGTCAACCCGAGCCCATGACCCCTAACGGGCGCCCTCTCCGCCCTCCTCATAACATCAGGACTGGTAATGTGATTCCACTTTAACTCATCATCCCTCCTGGCTTTAGGTATAATAACAAACGTCCTGACTATATATCAGTGGTGACGAGACATTGTCCGAGAGGGAACATTCCAAGGCCACCACACTCCTACTGTCCAAAAAGGCTTACGATACGGAATAATCCTCTTCATTACATCTGAAGTCTTCTTTTTTGCAGGTTTCTTCTGAGCCTTCTACCACTCAAGTCTAGCCCCCACCCCCGAATTAGGGGGCTGCTGACCACCCACAGGCATCACTCCCCTAAACCCACTAGAAGTG [...]
+CAATACCTCGGTCCTACTGGCCTCTGGAGTTTCCATTACCTGAGCCCACCACAGCCTGATAGAGGGGGACCGCAAATACATACTCCAAGCCTTATTTATCACGATCTCCCTAGGTCTGTACTTCACCCTCCTACAAGCTTCAGAGTACTATGAAGCGCCATTTACAATCTCTGACGGAATCTACGGCTCCACATTCTTCATGGCTACCGGATTCCACGGCCTCCACGTCATCATCGGATCTACTTTCCTTATCGTATGTTTCCTACGACAATTGAACTATCACTTCACATCCAGCCACCATTTTGGATTTGAGGCAGCTGCCTGATACTGACACTTCGTAGATGTTGTATGACTATTCCTGTACGTATCTATCTATTGATGAGGATCTTATATGACCAACATTCGCAAAACCCACCCATTAGCCAAAATCATCAACGACTCATTCGTTGACCTACCCGCACCATCAAACATTTCAGCATGGTGAAACTTTGG [...]
+TCGGTATTTGCCTAATCCTTCAAATCCTTACAGGCTTATTCCTAGCTATGCATTACACATCAGACACAGCCACAGCCTTTTCGTCGGTCACCCATATCTGCCGAGACGTCAATTACGGTTGAGTTATCCGGTATATACATGCAAACGGAGCCTCCATATTCTTCATCTGCCTATTCCTGCATGTAGGACGAGGCCTATACTACGGATCTTATATATTCCCCGAGACATGAAACATCGGCATTGTTCTACTATTTGCGGTTATAGCAACAGCATTCATAGGTTACGTCTTACCATGAGGACAAATATCCTTTTGAGGTGCTACCGTCATTACTAACTTACTATCAGCTATCCCATACGTCGGCACCAGTCTTGTAGAATGAATCTGAGGAGGGTTTTCAGTAGACAAAGCCACCCTAACACGATTTTTCGCCTTCCACTTTATTCTACCGTTCATCATCTCAGCACTAGCAGCAGTCCACCTCCTATTCCTTC [...]
+GGATCCAACAACCCCTCCGGAATCCCCTCTGACTCTGACAAAATCCCCTTCCACCCCTACTACACCATCAAGGATGCCCTAGGCGCCCTACTCCTAATTTTAGCATTAATAACACTAGTGTTATTCTCACCCGACCTATTAGGAGACCCGGACAACTACATTCCTGCTAACCCACTTAACACACCACCCCATATCAAACCAGAGTGATACTTCCTATTCGCATACGCAATCTTACGATCCATTCCCAATAAACTAGGAGGGGTCCTAGCCCTAGCCCTCTCCATCCTAGTCTTAGCCATCATCCCCCTACTGCACACCTCGAAACAACGGGGCATGATGTTCCGTCCACTAAGCCAATGCCTATTCTGACTGCTAACAGCTGACTTACTTACCTTAACATGAATCGGCGGCCAACCAGTAGAACACCCATTCATCATCATTGGCCAACTAGCCTCAATCCTCTACTTCACAATCCTACTGATCCTCATACCA [...]
+CATTGTCGAGAATAACCTACTGAAATGAATGTTCATAATTAATGTCATTTCACTGATCGTACCAATCCTACTCGCCGTGGCCTTCCTGACATTAGTAGAACGAAAAATTCTAGGGTACATGCAACTCCGCAAAGGGCCAAACATCGTAGGACCCTATGGCTTACTACAACCAATCGCGGACGCCGTGAAACTCTTCACTAAAGAACCCCTACGACCCCTAACATCATCAATCACTATATTCGTAATAGCCCCCATTCTAGCCCTAACACTAGCCCTGACTATATGAGTCCCATTACCCATGCCCTACCCCCTTATTAACATAAATCTGGGGGTCCTATTCATACTGGCGATATCAAGCCTAGCCGTCTACTCAATCCTATGATCCGGATGAGCCTCAAACTCAAAATACGCCCTAATCGGGGCCCTTCGAGCCGTAGCCCAAACAATCTCGTATGAAGTCACACTAGCTATTATTCTCCTATCGGTGTTGTT [...]
+GCTCATTCACCCTATCCACATTAATCACCACCCAAGAACACCTATGATTAATTCTACCCGCATGACCCTTGGCCATAATATGATTTATCTCTACTCTAGCAGAAACCAACCGCGCACCATTCGACCTAACAGAAGGAGAATCGGAGCTGGTTTCAGGGTTCAACGTAGAATATGCAGCCGGACCATTCGCCCTATTCTTCCTAGCCGAGTACGCCAACATTATCATAATAAACGCCCTCACAACCATCCTATTTTTCGGCGCGTTCCACACCCCCTACCTACCAGAACTATACTCAGTCAACTTCACCATAAAAACACTCCTACTAACGGCCTCCTTCCTATGAATCCGAGCATCCTACCCACGATTCCGCTATGACCAACTCATACACCTACTATGAAAAAACTTTCTCCCCCTAACACTAGCACTATGTATATGGCATATATCCCTACCCATTATAACGGCAAGTATCCCTCCCCAAACAATCAAACCCC [...]
+ACTACCATCATATCAACCGTTATTTCAGGAACTATCATAGTACTAATTAGCTCCCACTGACTAACAACCTGAATCGGGTTCGAAATGAACATACTAGCCATTATTCCAATTCTAATAAAAAAATTTAACCCACGGGCTGTGGAAGCATCAACAAAATATTTTCTCGCCCAAGCCACCGCATCCATACTCCTCATACTAGGAATTATCATCAACCTGCTACTAACAGGACAATGAGCAGTGCTGAACACCCCCAGCCCAATTACATCTAACATAATGACAGTAGCCCTGGCAATAAAACTAGGATTGTCACCATTCCACTTCTGAGTGCCCGAAGTAACTCAAGGTATTCCATTATCATCTGGAATAATCCTACTTACCTGACAAAAAATCGCCCCCCTGTCAATTCTATATCAAATCTCACCCTCCATTAATCCAAACCTATTGATGATCATAGCGACCATATCCGTCCTAATCGGGGGCTGAGGTGGCCTT [...]
+ACAACTACGAAAAATCCTAGCCTATTCATCAATCACGCATATAGGATGAATAATCGCTGTAACGACGTACAACCCAACCCTGATAGTACTAAACCTTATAATTTACATTATAATAACACTGGGAACATTTACACTATTTATACTTAACTCATCTACTACCACACTATCCCTATCCCACATGTGAAACAAACTTCCACTGATAGCCTCACTAATCCTAGCAGTCATGTTATCACTAGGAGGCCTGCCCCCACTCTCAGGATTCATCCCCAAATGAATGATCATCCACGAACTTACAAAGAACAACATGATCGCTATAGCAATGCTTATAGCAATGACAGCCTTACTAAACCTATACTTTTATATACGACTAACGTACACCACAGCATTAACCATATTCCCTTCAACAAACATCATAAAAATAAAATGGCAATTCGAGCACACAAAAAACGCTACCCTGCTACCCCCCTTAATTGTAACCTCGACCATACTACT [...]
+CCCCAATAACACTGACCCTGCTCATAAACATATTACTAACCTTGCTCACCAACATGTCCCTGGCATCCCTGCTCATTCTAATCGCATTCTGATTGCCCCAATTAAATATCTACACAGAAAAAGCAAGCCCATACGAGTGTGGCTTCGACCCCCTAGGATCAGCACGCCTGCCTTTCTCCATGAAATTTTTCCTAGTGGCCATTACATTCCTACTGTTCGACCTAGAAATCGCACTACTCCTGCCACTACCATGAGCCTCACAATCAACTAACCTAAAAACAACACTCATTATAGCACTAACATTAATTTCTCTCTTAGCCGTGAGCCTGGCCTACGAATGAACCGAAGAAGGCCTAGAGTGGAATGAAATGTCCGTAGTATACATTAACATCTTCCTGGCCTTTATTCTATCCTTCATGGGTCTACTCGTTTACCGATCCCACCTCATATCCTCCCTACTATGCCTAGAAGGCATGATACTGTCACTCTTCG [...]
+ACAATCACCGTCCTAACAAATCACTTCACACTAGCCAGCATAACCCCCATCATCCTACTTGTATTCGCGGCCTGTGAAGCAGCACTGGGGTTATCTTTACTGGTTATAATCTCCAATACATACGGAACAGACTACGTACAAAACTTAAATCTACTCCAATGCATCATCATCCCAACGATAATACTAATTCCCCTGACATGACTATCAAAACCGAACATAATTTGAATCAACACAACTGCCTACAGCATGTTAATCAGCCTGATTAGCCTAACATACCTAAATCAACCCTCAGATAATAGCCTAAACTTCTCACCACTATTCTTTGCAGACTCCTTATCAGCGCCTCTGCTAATACTCACAATATGGCTCCTTCCCCTGATGCTTATAGCTAGCCAATATCACCTGTCAAAGGAAACCCTTACCCGAAAAAAACTCTACATTACTATATTAATTACACTGCAACTACTCCTAATTATGACATTCACCTCCACA [...]
+TATGTTCTACATCCTATTTGAGGCTACACTCATGCCAACACTAATCATTATCACTCGATGGGGCAACCAAGCAGAACGCCTAAACGCCGGCCTATATTTCTTATTCTACACCCTAGTAGGCTCCCTACCCCTTTTAATCTCCCTACTATGAATACAAAACAATCTGGGCACCTTGAACCTGCTAGTAATCCAATACTGAACACAACCCCCATTAAACTCCTGATCTAACACCCTACTATGATTGGCATGCATGATGGCATTTATAGTAAAAATACCCCTATATGGTCTCCACCTGTGACTCCCTAAAGCCCACGTAGAGGCCCCCATTGCAGGATCCATAGTCCTTGCTGCCGTACTGCTCAAACTAGGCGGATACGGAATGATACGAATTACTGTCCTATTAAACCCACTAACAAACCACATGGCCTATCCCTTTATAATGTTATCCCTGTGGGGAATAATCATAACTAGTTCTATTTGCCTACGTCAAAC [...]
+AATCCCTAATCGCTTATTCCTCTGTGAGCCACATGGCCTTAGTCATCGTAGCAGTACTCATCCAATCGCCATGAAGCTACATAGGGGCAACAGCCCTAATAATCGCCCATGGCCTGACGTCGTCCCTATTATTCTGCCTGGCCAACTCCAACTACGAACGCATTCACAGCCGCACCATAATCCTGGCACGAGGATTGCAAACACTCTTGCCATTAATAGCCGCATGATGGCTACTAGCCAGCCTAGCTAACCTAGCCCTACCACCTACCATTAATTTAGTAGGAGAGCTATTTGTAGTAATAGCCTCATTTTCATGATCTAACATTACCATTCTCCTAATAGGGGTTAACATCACCATTACCGCCCTATACTCCCTATACATACTGATCACCACACAACGCGGAAAGTACACACACCATATCAAAAGTATTAAACCATCATTCACACGAGAAAATTCCCTGATGGCCCTCCACCTTCTACCCCTACTACTCC [...]
+AACCCTAAGATTACCTTGGGGCTTATTTACT?????ATAAAAGTAATTAACCTGTTCACTTCCTCAATCCTCGTAACACTATTTATATTAATTCTCCCCATTATAATGACTAACACCACCCTGTACACTAATAAACTCTACCCCAAATACGTAAAAACCACCATTTCATACGCCTTCATAATCAGCCTGATTCCCACAATAATGTTCCTCCACCTGGGACAGGACACAATAATCTCAAATTGACACTGAATTACTGCCCAGACAGTAAAACTCTCGCTCAGCTTTAAACTTGACTATTTCTCAATGATCTTCATGCCAGTAGCACTATTCGTAACCTGGTCGATCATAGAATTCTCAATATGATACATACATTCAGACCCTAACATTAACCGATTCTTCAAGTACCTACTCCTTTTCCTCATCACCATAATAATTCTGGTCACCGCCAACAACATATTTCAACTATTCATTGGCTGGGAAGGGGTAGGCATT [...]
+TCTACTTATTGGATGATGACACGGACGAGCAGATGCCAACACAGCCGCATTGCAAGCCATTCTATACAACCGTATTGGGGACGTAGGATTTATTTTATCCATAGCCTGATTTCTAACTAACCTAAACACATGAGACTTCCAACAAATCTTCATAACTAACCACGAAAACCTAAACATCCCGCTCATGGGCCTGCTACTAGCAGCTACCGGAAAGTCCGCACAATTTGGCCTCCACCCATGGCTACCATCGGCCATAGAAGGCCCAACTCCTGTTTCAGCCCTACTACATTCAAGTACAATGGTTGTAGCAGGGGTATTTCTCCTAATCCGATTTCACCCCCTAATAGAGCACAACAAAACAATGCAAACCATAACGCTGTGCCTGGGAGCAATCACAACCCTATTTACAGCAATCTGCGCCCTAACACAAAATGATATTAAAAAAATCATTGCTTTCTCCACTTCAAGCCAACTCGGACTAATAATGGTAAC [...]
+TCAACCAGCCCTACTTGGCATTTCTTCACATTTGCACACACGCATTCTTCAAAGCCATGCTATTCATGTGCTCCGGATCAATTATTCACAGCCTAAATGATGAACAGGACATTCGAAAAATAGGAGGACTATTCAAAGCACTACCATTTACCACCACTTCCCTAATTATCGGAAGCCTGGCACTTACAGGAATGCCCTTCCTAACAGGATTCTATTCCAAAGACTTAATCATCGAAACCGCCAACACGTCGTGTACCAACGCCTGAGCCCTTCTAATAACTCTCGTTGCCACCTCCATAACAGCCGCCTACAGCACCCGAATTATATTCTTCGCACTCCTAGGTCAGCCCCGCTTCAACCCCATTATTACTATCAACGAGAATAATCCATTCCTAATAAACTCCATTAAACGCCTTCTACTAGGGAGCATCTTTGCAGGATTTCTAATCTCCTACAACATCACACCCACTACCACCCCGCAGATAACTATGC [...]
+CTCAAAATAATAGCTCTTGCCGTGACCATCTTGGGTTTCATCCTGGCACTAGAACTTAACCTCACAATGCAAAGCTTAAAATTCAAACACCCATCAAACCTATTTAACTTCTCAAATATGTTAGGCTATTTCCCCATCATTATACACCGCCTAATGCCCAAAGCAAATCTACTAATGAGCCAAAAACTAGCATCAACACTGCTGGACACAATCTGACTAGAAAAAATCCTACCAAAATCCATTTCCTATTTCCAAATAAAATCTTCGATCACTGTCTCCAACCAAAAAGGCCTAATCAAACTATATTTCTTATCATTTGTACTAACCCTAACCCTCAGCCTACTCACG??????CTTAATTTCCACGGG
+>Lynx_canadensis
+ATGAACGAAAATCTATTCGCCTCTTTCACTACCCCAACAATAATAGGATTACCCGTTGTTATTCTAATTATCATATTCCCAAGCATTCTATTCCCATCACCCAACCGACTAATTAACAACCGCCTAATCTCACTGCAACAATGGCTAGTACAACTAACATCAAAACAAATGCTGGCCATTCACAATCACAAAGGACAAACCTGAGCCCTAATACTAATATCCCTCATCCTATTTATTGGATCAACAAACTTACTAGGCCTACTGCCCCACTCGTTCACTCCGACTACTCAGTTGTCAATAAACTTGGGAATGGCCATTCCATTATGAGCTGGCACCGTGATCACCGGATTTCGCCATAAAACCAAAGCATCTCTAGCCCACTTTTTACCACAGGGAACGCCTATTCCCCTGATTCCTATGCTTGTAATCATCGAGACTATTAGTCTTTTTATCCAACCTGTGGCCCTAGCCGTACGACTTACAGCTAACATC [...]
+TCACTTACTAATACACCTAATTGGAGGGGCCACCCTAGCCTTGACAAACATCAGCACCTCCGTTGCTTTAATTACTTTTATCATCCTTATCCTTCTAACAATCCTTGAATTCGCCGTAGCCCTAATTCAAGCCTACGTCTTTACCCTACTAGTAAGCCTGTATCTACATGATAATACCTAAATGCCACAGCTGGATACATCAACCTGATTTATCACTATCATATCAATAATCATAACACTATTCATTATGTTTCAACTAAAAATCTCAAAACATCTGTATCCATCAAACCCAGAATCTAAATCCACGACTACGCCAAAACAACTTAGCCCTTGAGAAAAAAAATGAACGAAAATCTATTCGCCTCTTTCACTACCCCAACAAATGTTCATAAACCGCTGATTATTTTCAACTAATCACAAAGATATTGGCACTCTCTACCTTTTATTTGGTGCCTGGGCCGGTATGGTAGGGACTGCTCTCAGCCTCCTGAT [...]
+AACTAGGTCAACCTGGTACATTATTAGGAGACGACCAGATTTACAATGTAATCGTCACCGCCCACGCTTTTGTAATAATTTTCTTTATAGTAATACCCATTATAATTGGAGGGTTCGGGAACTGATTGGTCCCATTAATAATTGGAGCCCCTGACATAGCATTTCCCCGAATGAACAATATAAGCTTCTGACTTCTTCCTCCATCCTTTCTGCTTCTACTTGCTTCGTCCATAGTGGAGGCGGGAGCAGGAACTGGGTGAACGGTATATCCACCCCTAGCCGGTAACCTGGCTCATGCAGGAGCATCCGTGGATTTAACCATCTTCTCACTCCACCTGGCAGGTGTTTCTTCAATCTTGTGTGCTATTATCTTTATTACCACTATTATTAATATAAAACCCCCTGCTATGATCCGAATACAAACACCTCTATTGTTATGGTCAGTTCTAATTACTGCAGTTCTACTACTCCTATCACTCCCAGTTTTAGCAG [...]
+ACCATGCTACTAACAGATCGAAATTTAAACACCACATTCTTTGATCCTGCTGGAGGAGGGGATCCCATTTTATACCAGCACTTATTCTGATTCTTTGGTCACCCAGAGGTCTACATCCTAATTCTACCTGGCTTTGGAATAATCTCACACATTGTTACCTATTATTCAGGTAAAAAAGAACCCTTTGGCTACATGGGAATAGTTTGAGCTATAATATCAATCGGCTTCCTGGGCTTTATCGTATGAGCCCATCACATGTTTACTGTGGGGATGGATGTAGACACACGAGCATACTTTACATCTGCCACCATAATCATCGCCATTCCTACTGGGGTAAAAGTATTCAGTTGGCTAGCTACCCTCCATGGAGGTAACATTAAATGGTCCCCCGCCATACTATGAGCCCTAGGTTTCATCTTTCTGTTTACCGTAGGGGGCTTGACGGGAATTGTACTAGCAAACTCCTCATTAGATATTGTTCTTCACGATACA [...]
+GGTAGCCCATTTCCACTATGTCCTGTCAATGGGAGCAGTATTCGCTATTATGGGGGGCTTTGTTCATTGATTCCCCCTATTCTCAGGGTATACCCTTGATAATACTTGGGCAAAAATTCACTTCACGATTATATTTGTGGGTGTCAACATAACGTTCTTTCCTCAACATTTCCTAGGCCTATCTGGAATGCCACGACGTTACTCTGACTACCCAGATGCATATACAACTTGAAACACAATTTCCTCAATAGGCTCTTTCATCTCATTAACGGCAGTTATATTGATAGTTTTCATAGTGTGAGAAGCCTTCGCATCCAAGCGAGAAGTGGCCATAGTAGAATTAACCACGACTAATCTTGAGTGATTACATGGATGTCCCCCTCCATACCACACATTTGAAGAGCCAACTTATGTGTTATTAAAAATGGCGTACCCCTTTCAACTAGGTTTTCAAGATGCTACATCTCCCATTATAGAGGAGCTCCTACACTT [...]
+ACACATTAATAATTGTATTCCTAATTAGCTCACTAGTCCTTTATATTATCTCATTAATATTGACAACCAAACTCACACACACAAGCACAATAGATGCTCAAGAAGTAGAAACCATCTGAACCATCCTGCCTGCCATTATCCTGATTCTCATCGCCCTGCCTTCCTTACGAATCCTCTATATAATAGACGAAATCAACAACCCATCCCTCACGGTAAAAACTATAGGGCACCAGTGGTACTGAAGTTATGAGTACACCGACTATGAAGACTTAAATTTTGACTCTTATATAATCCCTACCCAAGAACTAAAGCCAGGAGAACTCCGACTACTAGAAGTTGACAACCGAGTGGTCTTGCCAATAGAAATAACCATTCGCATACTAATCTCGTCAGAAGACGTACTACATTCATGAGCCGTCCCATCCCTGGGTCTAAAAACCGACGCTATCCCAGGCCGACTAAACCAAACAACCCTGATGGGCACACGGCCTG [...]
+TATGGCCAATGTTCAGAAATCTGCGGCTCAAACCATAGTTTCATGCCCATTGTCCTCGAACTAGTCCCATTGACATATTTTGAAAAATGATCTGCATCCATACTGATGACCCACCAAACCCACGCGTACCACATAGTCAACCCTAGCCCATGGCCACTCACAGGGGCCCTTTCAGCCCTCTTAATAACCTCAGGCCTGGCTATATGATTTCACTATAACTCAGCACTGTTACTAGCCCTTGGAATGACTACTAATCTATTAACCATATATCAATGATGACGAGACATTATTCGAGAAAGTACATTCCAAGGCCACCATACACCCATTGTTCAAAAAGGCCTCCGATATGGAATAATCCTCTTTATCGTCTCAGAAGTATTCTTTTTCGCAGGCTTCTTCTGGGCCTTTTACCACTCAAGTCTAGCCCCAACTCCTGAACTAGGAGGATGCTGACCACCAACAGGCATTATTCCCCTAAACCCTCTGGAAGTC [...]
+TAACACTTCCGTACTTCTGGCCTCTGGAGTATCAATCACCTGGGCCCACCATAGCTTAATAGAAGGAAACCGAAAACATATGCTCCAAGCACTATTTATTACAATTTCCCTGGGGGTCTATTTTACACTCCTCCAGGCCTCCGAATATTACGAAACATCATTTACAATCTCGGACGGAGTTTACGGGTCCACTTTCTTCATGGCCACAGGATTCCACGGACTACATGTAATTATTGGCTCCACTTTCCTAATCGTATGCTTCTTACGCCAACTAAAATATCACTTCACATCAAATCACCACTTCGGGTTTGAAGCCGCTGCCTGATACTGACACTTCGTAGACGTAGTTTGACTATTCCTATACGTCTCCATCTATTGATGAGGATCTTATATGACCAACATTCGAAAATCACACCCCCTTATCAAATTTATCAACCACTCATTCATGGACCTACCCGCCCCATCCAATATTTCAGCATGATGGAACTTCGG [...]
+TAGGAGTTTGCCTAATCCTACAAATCCTCACCGGCCTTTTCCTAGCCATACATTACACATCAGACACAATAACCGCCTTTTCATCAGTCACTCATATCTGCCGCGACGTTAACTATGGCTGAATCATCCGATACATACATGCTAACGGAGCCTCCATATTCTTTATCTGCTTATACATACACGTAGGACGAGGAATATATTACGGCTCCTACACTTTCTCGGAAACATGAAACATTGGAATCTTATTGCTATTCACAGTTATAGCCACAGCCTTCATAGGATACGTCCTACCATGGGGCCAAATATCCTTCTGAGGGGCAACCGTAATCACTAATCTCCTATCAGCAATCCCGTATATCGGAACCAACCTAGTAGAATGAATTTGAGGGGGCTTCTCAGTAGACAAAGCCACCCTAACCCGATTCTTTGCCTTCCACTTCATTCTCCCATTCATCATCTCAGCCCTAGCAGCAGTACACCTCCTATTCCTCC [...]
+GGATCCAACAACCCCTCAGGAATCACATCTGACTCAGACAAAATCCCATTCCACCCATACTATACAATCAAGGACATCTTGGGTATCCTAGCACTAACTCTAACACTCATACTACTTGTCCTATTTTCACCAGACCTGCTAGGAGACCCAGATAATTATATCCCCGCCAACCCTCTAAGTACTCCTCCCCATATCAAGCCCGAATGATACTTCCTATTCGCGTATGCAATTCTCCGATCCATTCCTAACAAACTGGGAGGAGTTTTAGCCCTAGTACTCTCCATCCTAATCCTAGCGATCATCCCACTCCTTCATACCTCTAAACAACGAGGAATAACATTTCGACCACTAAGCCAATGCCTATTTTGACTCTTAGTAGCGGACCTCCTAACCCTAACATGAATTGGCGGCCAACCCGTAGAGCACCCCTTCATCACCATCGGCCAACTAGCCTCCATCCTATACTTCTTAACTCCCCTGGTCCTAATACCC [...]
+CATCATTGAAAACCGCCTCCTCAAATGAATGTTCATAATTAACATCCTCTCACTAATTATCCCTATCCTTCTCGCTGTAGCCTTCCTAACCCTAGTTGAACGAAAAGTACTGGGCTACATACAACTCCGTAAAGGACCAAATGTCGTAGGGCCATACGGTCTACTCCAACCCATTGCAGACGCCATAAAATTATTCACCAAAGAACCCCTGCGACCCCTCACATCCTCCATACTCATATTCATTATAGCACCAATTCTAGCCCTCACACTAGCCCTAACCATATGAGTCCCACTACCCATACCATACCCACTCATTAACATAAACCTAGGAGTACTATTCATACTAGCCATGTCAAGCCTAGCTGTCTACTCCATTCTATGGTCAGGGTGAGCCTCAAACTCAAAATACGCCCTAATTGGAGCCCTGCGAGCCGTGGCCCAAACAATCTCGTATGAAGTTACATTAGCCATCATCCTCCTATCAGTACTACT [...]
+GATCCTTCACACTAGCCACACTAATCACCACCCAAGAGTACATGTGACTAATTATTCCTGCATGACCCCTAGCCATAATATGATTTATCTCAACACTAGCAGAAACCAACCGAGCCCCATTCGACCTAACAGAGGGAGAATCAGAACTAGTGTCCGGGTTCAACGTAGAATATGCAGCAGGCCCCTTCGCTCTATTCTTCCTAGCAGAATACGCTAACATCATCATAATAAATATCCTCACAACAATTCTATTCTTCGGAGCATACCACAACCCCTATATTCCAGAACTACACACTGTCAACTTTACAGTAAAAACCCTGCTCCTAACCACCACCTTCCTATGAATCCGGGCATCTTACCCACGATTCCGATACGACCAACTAATGCACCTCCTATGAAAAAACTTTCTACCTCTCACCCTGGCCCTATGCATATGACACGTATCACTACCTATCATCACAGCAAGCATCCCACCTCAAACAATCAAACCCC [...]
+ATCATCATCATATCAACCGTTATCTTAGGAACCATAATTGTAATAACAACCTCCCATTGACTTATAGTCTGAATCGGCTTTGAAATAAACCTACTAGCCATTATTCCCATCCTCATAAAAAAATACAACCCACGAGCTATAGAAGCAGCCACAAAATATTTCTTAACACAAGCAACCGCCTCCATAATCCTAATAATGGGAATTATCATCAACCTACTACATTCAGGACAATGAACCGTATCAAAAGACCTCAACCCCATGGCATCAATCATAATAATAACCGCCCTAGCAATAAAACTAGGACTAGCCCCCTTCCACTTCTGAGTACCCGAAGTCACACAAGGAATTTCCATATCATCAGGCTTAATCTTACTAACATGACAAAAAATCGCACCACTATCCATCCTTTACCAAATCTCACCCGCCATCAACCCCAACCTTCTCCTAACAATATCCGTTATATCAGTTGTAATCGGAGGCTGAGGAGGCCTC [...]
+ACAGCTGCGAAAAATCATGGCATACTCCTCAATCGCCCACATAGGCTGAATAACAGCTATCACAATATACAACCCCACAATAATAATCCTAAACCTAACTATCTACATTATCATAACACTAACCACCTTCATACTATTTATATATAACTCCACCACAACAACATCATCCTTATCACAAACATGAAACAAAACTCCCCTGACCACCTTACTTATTCTAGTACTAATAATGTCCCTAGGCGGCCTCCCCCCACTCTCCGGCTTCATCCCAAAATGAATAATCATTCAAGAACTAACTAAAAACGAAATAATTGTAATACCAACACTACTAGCCATAACAGCACTACTCAACCTATACTTTTACATACGACTAACATACGCCACTGCACTAACCATGTTCCCCTCAAACAATAACATAAAAATAAAATGACGATTTGAATGCACAAAAAAAATAACCCTCTTACCCCCTCTAATCGTAATATCAACTATACTACT [...]
+CACCAATATTATCCACCCTGGATATAAACGTAATACTCGCCCTACTCACCAACACACTCCTATCCACATTACTTGTACTCATCGCATTCTGATTACCCCAACTAAATATTTATGCAGAAAAAGTAAGCCCCTATGAGTGCGGATTCGATCCCATGGGGTCTGCCCGTTTACCCTTTTCCATGAAATTCTTCTTAGTAGCCATCACATTTTTGTTATTTGACCTAGAAATTGCACTACTACTCCCTCTTCCCTGAGCCTCACAAACGAACAAACTATCAACCATACTCACTATGGCCCTTCTACTAATCTCATTACTAGCTGCAAGCCTAGCCTACGAATGAACCCAAAAAGGACTAGAATGAACTGAAATGTCCATAGTCTATATTAATATCTTCATGGCCTTTACCGTGTCACTCATAGGACTATTAGTATACCGATCCCACCTAATATCTTCTCTCCTGTGTCTAGAAGGCATAATGCTATCTCTATTCA [...]
+ACCATAGCAATCCTGAACAACCATTTCACACTAGCCAGTATGGCCCCTATCATTCTACTGGTATTCGCGGCTTGCGAGGCAGCACTAGGCCTATCTCTACTAGTAATAGTATCAAATACATACGGCACCGACTATGTACAAAACCTAAACCTCCTGCAATGCATTATTATCCCCACTGCCATACTTATACCAATAACATGACTATCAAAACCTAGCATAATTTGAATCAACTCAACAGCCTATAGCCTACTAATTAGTCTCATTAGCCTCTCCTACCTAAATCAACTAGGTGATAATAGCCTAAACTTCTCGTTACTATTTTTTTCAGACTCCCTCTCTGCACCCCTGCTAGTGCTGACAACGTGACTTCTACCATTAATACTCATGGCCAGCCAGTCACACCTGTCAAAAGAGACCCTAACCCGAAAAAAACTATATATCACAATACTCACCCTCCTGCAGCTCCTCTTGATCATAACATTTACCGCCACA [...]
+TATATTTTACATCCTATTCGAAGCCACACTAATCCCTACTTTAATTATCATTACCCGCTGAGGTAACCAGACAGAACGACTAAATGCCGGCCTATACTTCCTATTTTATACTCTAGTAGGCTCACTACCCCTCCTAGTCGCATTACTATATATCCAAAATACAATAGGAACCCTGAATTTCCTAATCATCCAATACTGGGCCAAACCCATCTCAACCACTTGGTCCAACATCTTTCTCTGACTAGCATGCATGATAGCATTTATAGTAAAAATACCCTTGTACGGGCTCCACCTTTGATTACCAAAAGCACACGTCGAAGCCCCTATCGCTGGCTCAATAGTACTTGCCGCCGTATTATTAAAACTAGGGGGGTACGGAATAATGCGCATCACAATCCTACTAAACCCTGCAACAAACCAAATAGCATACCCCTTCATAATACTATCCTTATGAGGAATAGTTATAACAAGCTCTATCTGCTTACGTCAAAC [...]
+AATCCTTAATCGCATACTCATCTGTAAGCCACATGGCCCTAGTAATTGTAGCAGTACTGATTCAAACACCCTGAAGCTATATAGGAGCCACAGCCCTAATAATTGCCCACGGACTAACTTCATCCATGCTATTTTGCCTCGCAAACTCAAACTATGAGCGAGTGCACAGCCGAACAATAATTCTAGCACGAGGCCTACAAACCATCCTCCCCCTAATAGCTGCCTGATGATTACTAGCCAGTCTCGCAAATCTAGCCCTACCACCCACAATCAATTTAATCGGAGAACTATTCGTAGTAATGGCTTCCTTCTCATGATCTAACATAACCATCATCCTTATGGGTACAAACATCATCATCACAGCCCTATACTCTCTCTACATACTCATCACAACCCAACGAGGCAAATATACACACCATATTAAAAATATTAACCCATCATTTACACGAGAAAACGCCCTAATAACCCTCCACCTACTCCCTCTCCTTCTCC [...]
+AACCCCAAAATTGTACTAGGCCCCATTTACT?????ATAAAAGTAATAAACTTATCTACCCCCTTCATATTAACCGCAATGTTTATCCTACTTTTACCTATCATTATATCTAACACCCAACTATACAAAAACAGCCTATATCCTCACTATGTAAAAACCACAATCTCCTATGCCTTTACTATCAGCATAATCCCAACCATAATATTCATCTCTTCGGGACAGGAAACAGTTATCTCAAACTGACACTGATTATCAATCCAAACCCTCAAGTTATCACTGAGTTTTAAAATAGACTATTTCTCAATCATCTTCATCCCCGTAGCACTTTTCGTCACATGATCAATCATAGAATTCTCGATATGATACATATACTCAGATCCGTATATTAATCGATTCTTCAAATATCTCCTTATATTCCTAATCACCATAATAATCCTAGTTACCGCTAACAACCTGTTCCAGCTGTTCATCGGCTGAGAAGGAGTAGGAATT [...]
+CCTACTCATTGGATGGTGATATGGCCGAACAGACGCAAACACTGCCGCCCTGCAAGCAATTCTCTACAACCGCATCGGAGATGTGGGCTTCATTATAGCCATAGCATGATTCCTCACTAACTCAAACGCATGAGATTTCCAACAAATCTTTATAGCCCAACACGAAAACCTAAACACCCCCTTACTAGGACTCCTACTAGCAGCCACAGGCAAGTCCGCCCAATTCGGCCTACATCCATGACTACCATCAGCCATAGAAGGCCCAACCCCCGTCTCCGCCCTACTCCACTCAAGCACAATAGTCGTAGCCGGAGTCTTCCTACTAATCCGATTTCACCCACTCATAGAACAAAACAAAACCATCCAAACCCTCACCCTATGTCTAGGAGCTATTACAACCCTATTTACAGCTATTTGTGCCCTCACACAAAACGACATTAAAAAAATCGTCGCCTTCTCAACCTCAAGCCAACTGGGCCTAATAATTGTAAC [...]
+TTAACCAACCCTACCTTGCATTCCTACATATTTGTACACACGCATTCTTCAAAGCCATACTATTCATATGCTCAGGATCAATCATCCATAGCCTAAATGACGAGCAAGACATTCGAAAGATAGGCGGATTGTACAAACCAATACCCTTTACCACTACCTCCCTCATCATTGGAAGCCTCGCACTAACAGGCATGCCCTTCCTGACAGGCTTCTACTCCAAAGACCTAATCATCGAGACCGCCAACACGTCGTATACCAACGCCTGAGCCCTACTAATTACTCTCATTGCCACATCCCTTACAGCTGCCTACAGTACTCGAATCATATTCTTTGTACTCCTAGGACAACCACGATTCAACGCCTTGAACCTAATCAATGAGAATAATACCCACCTCATCAGTTCCATTAAACGTCTTTTAATTGGAAGCATCTTTGCAGGATATCTAATCTCTTATAACATCCCCCCAATAACCATCCCACAAATAACCATAC [...]
+CTGAAACTAACTGCCCTTGCCGTGACTATCACAGGCTTTATCCTGGCATTAGAACTCAACCTCGTGGCCAAAAACTTAAAATTCAAATACCCCTCAAATCTTTTTAAGTTCTCTAACCTCCTAGGGTATTTTCCAATCGTAATACACCGTCTCCCACCAAAAATGAGCCTAACTATGAGCCAAAAATCCGCATCGATACTACTAGACATGATTTGACTAGAAAATGTATTACCAAAATCCATCTCCTACTTCCAAATAAAAATGTCAACTACCGTATCTAATCAGAAAGGACTAATCAAACTCTACTTCTTATCTTTCATAATCACCCTAACCCTTGGCTTACTTCTA??????CTTAATTTCCACGGG
+>Martes_americana
+ATGAACGAAAATTTATTCTCCTCTTTCATTACCCCTACAATAATAGGTCTTCCTATTGTTATCGCCATCACCATATTCCCAAGCATCATATTTCCCTCACCAAACCGGTTAATCAACAACCGGCTCATCTCCATCCAACAGTGATTGGTACAGCTAACATCAAAACAAATACTGTCTATTCACAATCAAAAAGGACAAACCTGAGCACTAATATTAATATCCCTAATCCTATTTATTGGCTCCACCAATCTACTAGGCCTCCTACCGCACTCATTCACTCCCACCACGCAGCTATCCCTAAATCTGGGTATAGCTATCCCCCTATGAGCGGGCACAGTAATTACTGGTTTCCGGCATAAAACAAAGGCCTCTTTAGCCCACTTCCTACCACAAGGAACACCACTTCCCCTAATTCCCATGCTTGTAGTCATTGAAACCATCAGCCTATTCATTCAACCCATAGCCCTGGCCGTGCGACTAACAGCCAATATC [...]
+TCACTTATTAATTCACCTAATTGGAGGAGCCACCCTAGCTTTAATGAGTATCAGCACTATCACAGCCATAGTGACCTTCACTATCCTAGTCCTTCTAACCATCTTAGAGTTTGCAGTAGCCCTTATCCAAGCCTACGTCTTTACTCTACTAGTAAGCCTGTACCTACATGATAACACTTAAATGCCACAACTAGACACCTCAACATGATTCGTCACGATCTTATCAATAATTATTACCCTATTCTTCATATTTCAACTAAAAGTAGCAAAATACAATTTTCCGGAGAACCCTGAGCCAAAACTAATATCCGTATCAAAATCCACTACACCTTGAGAAAAAAAATGAACGAAAATTTATTCTCCTCTTTCATTACCCCTACAAATGTTCATAAATCGATGATTATTCTCCACAAATCACAAAGACATCGGCACTCTTTACCTTTTATTTGGCGCATGAGCCGGAATAGTAGGCACTGCATTAAGCCTATTGAT [...]
+AATTAGGTCAACCTGGCGCTCTACTGGGAGATGACCAAATTTACAATGTGATTGTAACCGCCCATGCATTTGTAATAATTTTCTTTATAGTGATGCCCATTATAATTGGGGGCTTCGGAAACTGACTAGTGCCCTTAATAATCGGTGCACCTGATATGGCATTCCCACGTATAAACAACATAAGCTTCTGACTTCTACCTCCCTCTTTCCTTCTACTCTTAGCCTCTTCCATAGTGGAGGCGGGCGCAGGAACAGGATGAACCGTATACCCCCCTCTAGCAGGGAATCTAGCACACGCAGGAGCATCCGTAGATCTGACAATCTTCTCTCTACACCTGGCAGGCGTCTCATCTATCTTAGGGGCCATCAACTTCATTACAACTATCATCAATATGAAGCCTCCTGCAATATCGCAATACCAAACCCCTCTATTCGTATGATCCGTCCTAATCACAGCCGTACTTCTACTCTTATCCCTGCCAGTGTTGGCAG [...]
+ACCATACTACTTACAGACCGAAATCTAAACACTACCTTCTTCGACCCCGCCGGAGGAGGGGACCCCATCCTGTATCAACACCTGTTTTGATTTTTTGGACACCCCGAGGTATACATCTTAATTTTACCAGGATTTGGAATCATCTCGCACGTTGTAACATATTACTCAGGAAAGAAGGAACCATTCGGTTACATGGGCATGGTTTGAGCAATAATATCTATTGGGTTCTTGGGATTCATTGTATGAGCCCATCACATGTTTACCGTGGGAATGGATGTTGACACACGAGCATACTTCACCTCAGCCACTATAATTATCGCAATTCCAACAGGGGTAAAAGTATTTAGCTGACTAGCCACCCTTCACGGAGGTAACATTAAATGATCGCCGGCCATACTATGAGCCCTAGGTTTTATCTTTCTTTTCACAGTGGGTGGTTTAACAGGTATTGTGCTATCAAACTCGTCATTGGACATCGTTCTCCACGACACA [...]
+AGTAGCCCACTTCCATTACGTTCTCTCAATGGGAGCAGTTTTCGCAATCATAGGCGGATTCGTCCACTGATTCCCCTTATTCACAGGTTATACACTAAACGATATTTGAGCAAAAATTCACTTCACGATCATATTCGTGGGAGTAAACATGACATTCTTCCCCCAACACTTCCTAGGCCTATCAGGCATGCCCCGACGATATTCCGACTACCCAGATGCCTACACCACATGAAACACAGTATCTTCCATAGGCTCATTCATTTCATTAACTGCGGTCATGCTAATAATCTTCATAATCTGAGAAGCATTCGCATCCAAACGAGAAGTACTAACTGTAGAACTCACCTCAACAAATATTGAATGATTACACGGATGTCCTCCTCCATACCACACATTCGAAGAGCCAACTTACGTACTATCAAAAATGGCGTACCCTTTTCAATTAGGCCTTCAGGATGCAACCTCCCCCATCATGGAGGAGCTACTACACTT [...]
+ACACCCTGATAATCGTATTCTTGATTAGCTCTCTTGTTCTCTACATCATCTCACTTATACTAACCACTAAATTAACACATACTAGTACTATAGATGCCCAAGAGGTTGAAACGGTTTGAACCATCTTGCCTGCTATTATCCTAATTCTGATCGCTCTACCCTCACTACGAATCCTTTACATAATAGACGAGATCAACAACCCTTCGCTGACTGTAAAAACCATAGGTCACCAGTGATACTGAAGTTATGAATACACGGACTACGAAGACCTAAACTTCGATTCTTACATGATCCCTACCCAAGAACTAAAACCCGGAGAACTACGATTGCTAGAAGTAGATAACCGAGTGGTCCTCCCAATAGAGATAACAATTCGCATATTAATCTCATCCGAAGACGTACTGCACTCGTGAGCCGTACCATCCCTAGGGCTAAAAACTGATGCTATCCCAGGACGTCTTAACCAAACTACCCTTATGGCTATACGTCCAG [...]
+TACGGCCAGTGCTCCGAAATTTGTGGCTCCAACCACAGCTTCATGCCCATCGTTCTCGAGCTAGTGCCCTTATCCCACTTCGAAAAATGATCTGCCTCAATACTAATGACCCACCAAACTCACTCATATCACATAGTTAATCCAAGCCCATGACCACTAACGGGAGCTCTCTCTGCTCTCCTTATGACATCAGGATTAGTAATATGATTCCACTTTAACTCAATAGCCCTCCTGACTCTGGGTATGACAACCAACCTATTAACCATATTCCAGTGATGACGAGATGTGGTCCGAGAAGGAACATTCCAGGGCCACCACACCCCCACCGTCCAAAAAGGCCTGCGATACGGAATAATCCTTTTCATCGTATCAGAAGTCTTCTTCTTCGCAGGTTTCTTCTGAGCCTTCTATCACTCAAGCCTAGCACCGACGCCCGAACTGGGAGGTTGTTGACCACCTACAGGCATTACACCCTTAAATCCACTGGAAGTG [...]
+CAACACCTCAGTCCTTCTAGCCTCCGGAGTTTCTATTACCTGAGCCCATCATAGCCTAATAGAAGGCAATCGCAAACACATACTTCAAGCGCTATTCATTACAATCTCCCTAGGCTTATACTTTACCCTTCTGCAAGCCTCAGAATACTATGAAGCACCCTTCACAATCTCCGACGGAATCTACGGCTCCACGTTCTTCATAGCCACAGGGTTCCACGGACTACACGTCATCATTGGCTCCACTTTCCTCATTGTATGCTTCCTACGACAACTAAACTTCCACTTCACATCCAACCACCATTTCGGATTCGAGGCAGCCGCTTGGTACTGACACTTCGTAGACGTCGTGTGACTATTCCTGTACGTTTCCATCTATTGATGAGGATCTTATATGACCAACATTCGTAAAACCCACCCACTAGCTAAAATCATTAACAACTCATTTATCGACTTACCTGCTCCATCAAACATTTCCGCATGATGAAACTTCGG [...]
+TTGGAATCTGCCTAATCCTACAGATTCTTACAGGTTTATTTCTAGCTATACACTACACATCAGATACAGCCACAGCCTTCTCATCAGTTACCCACATTTGCCGAGATGTCAACTACGGCTGAATTATCCGATACATACATGCCAATGGGGCTTCCATATTCTTCATCTGCCTGTTCCTGCACGTTGGACGGGGCCTATACTATGGATCTTATATATACCCTGAAACATGGAATATTGGCATCATCCTATTATTCGCAGTTATAGCAACAGCATTCATAGGTTACGTTCTGCCATGAGGACAAATATCCTTTTGAGGTGCGACCGTAATTACCAACCTACTGTCAGCCATCCCCTACATCGGAACCAGCCTCGTAGAATGAATCTGAGGAGGATTCTCGGTAGACAAGGCTACCCTAACGCGATTCTTCGCCTTCCACTTTATCCTGCCATTCATCATCTTAGCATTGGCAGCAGTACACCTTCTATTCCTCC [...]
+GGATCCAATAACCCCTCAGGAATCCCCTCCGATTCTGACAAAATCCCATTCCACCCATACTACACCATCAAAGACATCCTAGGCGCCCTATTCCTAATCCTAGCCCTCATAATACTAGTACTATTCTCACCCGACCTTCTGGGAGACCCAGACAACTACATCCCCGCCAACCCGCTCAACACACCACCCCATATTAAACCTGAGTGATACTTCCTGTTCGCATATGCAATCCTGCGATCCATCCCCAACAAACTAGGAGGAGTACTAGCCCTAGTCTTCTCCATCCTAGTCCTGGCAATTGTCCCATTGCTCCATACTTCAAAACAACGAGGCATGATATTCCGCCCACTCAGCCAATGCCTATTCTGACTATTAGTGGCTGACCTCCTTACCTTAACCTGGATTGGAGGACAGCCCGTAGAACACCCATTCATCACTATCGGTCAACTAGCCTCAATCCTCTACTTCGCAATCCTTCTAATCCTTATGCCA [...]
+CATTATTGAAAATAACCTATTAAAATGAATGTTTATAATTAACATCATTTCACTGATCGTGCCTATTCTACTCGCCGTAGCCTTCCTGACATTAGTAGAGCGAAAAGTCCTAGGTTACATACAACTCCGTAAAGGCCCAAACGTCGTAGGCCCCTATGGTCTTCTACAACCCATTGCAGATGCCGTAAAACTTTTCACCAAAGAACCCTTACGACCTCTAACATCATCAATTACTATATTCGTAATAGCTCCCATTCTAGCCCTGACATTGGCCCTAACTATATGAATTCCGCTACCTATACCCTACCCCCTCATCAACATAAACCTAGGAGTCTTATTTATACTAGCAATATCAAGCCTAGCCGTCTACTCCATCCTATGATCCGGCTGAGCTTCAAACTCAAAGTACGCCCTAATTGGAGCCCTCCGAGCTGTAGCTCAGACAATCTCCTATGAAGTAACACTGGCCATCATTCTCCTATCAGTACTACT [...]
+GTTCCTTCACCCTGTCCACACTAATCACCACACAAGAGCACCTATGACTAATTCTCCCTGCATGACCCCTAGCCATGATATGGTTTATCTCAACACTAGCAGAAACCAACCGCGCTCCGTTCGACCTGACAGAGGGAGAATCAGAACTAGTCTCTGGGTTTAACGTCGAATATGCAGCCGGACCATTCGCCCTATTCTTCCTAGCAGAATACGCCAACATTATTATAATAAATGTCCTCACGACTATCCTATTCTTCGGCGCATTCCACACCCCTTACCTACCAGAATTATACTCCGTCAACTTCACCATAAAAACACTCCTACTAACCATTTCCTTCCTATGAATCCGAGCATCTTATCCACGATTCCGCTATGACCAACTAATACACTTACTATGAAAAAATTTCCTCCCCCTAACCCTAGCCCTATGCATATGACACATAGCCCTACCCATCATAACAGCAAGTATTCCACCCCAAACAATTAAACCCC [...]
+GCTATCATTATATCGACTGTTATCTCAGGCACTATCATAGTATTAATCAGTTCCCACTGATTAACAATCTGAATCGGGTTTGAAATGAACATACTAGCCATTATCCCCATTCTAATAAAAAAATTCAACCCACGAGCCATGGAGGCTTCAACAAAATACTTTCTTACCCAAGCCACCGCATCCATGCTCCTTATGCTAGGAGTTATCATCAACCTGCTACTAACAGGACAATGAACAGTACTAAACAAACCCAACCCGATCGCATCAAACATAATAACAGTAGCCCTAGCAATAAAACTAGGACTATCCCCCTTCCATTTCTGAGTACCCGAAGTAACCCAAGGAGTCCCAATATCATCAGGAATAATTCTACTCACCTGACAAAAAATCGCCCCCTTATCTATCTTATACCAAATCACCCCATCCATAAATCCGAACCTACTAGTAGCTATAGCTATTATATCCGTTCTGGTAGGGGGCTGAGGAGGCCTT [...]
+ACAACTACGAAAAATCCTAGCATACTCGTCAATCGCCCATATAGGATGAATAATCGCTGTAACAACGTACAACCCAACCCTAATATTACTAAACCTTACAATTTACATCACAATGACACTCGGAACCTTCATATTATTTATACTTAGCGCGTCCACAACCACCTTATCATTATCCCACACATGGAATAAACTCCCACTAATCGCCTCACTAATCTTGATAACCATACTATCGCTAGGAGGCCTACCTCCTCTCTCTGGCTTTATCCCTAAGTGGATAATCATCCATGAACTCACGAAAAATGACATAGTCACTGTAGCAACATTCATAGCAATGACGGCTCTACTAAACCTATACTTTTACATACGACTAACGTACGCAACAGCACTAACCATATTTCCCTCAACTAACATTATAAAAATAAAATGACAATTCGAAAGCACAAAAAACACAACCCTACTCCCCCCGCTAATCGTAATCTCAACCATACTACT [...]
+CCCCAATAATGCTAACGCTATTCATAAACATAGTTCTAACCCTACTTATTAATATATCCTTGGCATCACTACTTGTCCTAATTGCATTCTGACTTCCTCAACTAAACATTTATGCAGAAAAGGCAAGCCCTTACGAGTGCGGCTTTGACCCCCTAGGATCAGCACGCTTACCTTTCTCCATAAAGTTCTTCCTAGTAGCTATCACATTCTTACTATTCGACCTAGAAATTGCACTACTCCTACCATTGCCATGAGCCTCCCAATCAGTTAACCTAAAAACAACACTCACTATGGCGCTAGCGCTAATTTCCTTACTAGCACTGAGCCTGGCCTACGAATGAACCGAGGAAGGCCTTGAATGAAATGAAATGTCCATAGTATACATCAACATCTTCTTAGCCTTTATTCTATCCTTCATGGGGCTACTTATCTACCGATCCCATCTAATATCTTCCCTACTATGTCTTGAAGGCATGATGTTATCCCTCTTCA [...]
+ACAGTAACTATCCTAACTAACCACCTCACACTGGCCAGCATGACCCCTATTATTCTTCTCGTATTCGCTGCTTGTGAGGCCGCATTAGGATTATCTCTTCTGGTCATAATCTCCAACACATACGGAACAGACTACGTACAAAACTTGAATCTACTACAATGCATCATCGTCCCGACTATAATGCTAATCCCCCTAACATGACTATCGAAACCTAACATAATTTGAATCAACACAACAGCGTACAGCATGCTAATTAGTCTTATCGGCCTGACATACCTTAATCAATTCACGGACAACAACCTAAACTTTTCCCTACTATTCTTTGCCGACTCCCTATCAGCACCCCTGCTGATACTCACAACATGGCTCCTTCCCCTAATACTCATAGCAAGCCAACACCACTTATCAAAAGAAACCCTTACCCGAAAAAAACTCTACATTACAATACTAGTCATACTTCAACTGCTTCTAATCATGACATTCACCGCCACA [...]
+TATATTTTATATCCTATTTGAAGCCACGCTAATACCAACACTAATTATTATTACTCGATGGGGCAATCAAACAGAACGCTTGAACGCTGGCCTGTACTTCCTGTTCTACACCCTAGTAGGATCCCTGCCCCTCCTGATTGCGCTACTATGACTCCAAAGTAACCTAGGTACCCTAAACCTACTGGTGATCCAATATTGAACACAACCCCTGCTAAGCTCATGATCAAACACCTTACTATGATTAGCATGCATAATAGCATTTATGGTAAAAATACCTCTGTACGGCCTCCACTTATGACTCCCAAAAGCCCATGTAGAGGCCCCCATCGCTGGATCCATAGTCCTTGCAGCCGTGCTCCTAAAACTAGGCGGGTACGGGATAATACGAATCACCATCCTATTGAACCCACTAACAGACTTCATAGCATACCCTTTCATGATACTATCCCTCTGAGGAATAATCATAACCAGCTCTATCTGCCTACGCCAAAC [...]
+AATCTCTGATCGCTTACTCCTCTGTAAGCCACATGGCCTTAGTAATCGTGGCAGTACTCATCCAATCACCATGAAGCTACATGGGAGCAACAGCCCTAATAATCGCTCACGGCCTAACATCATCCATACTGTTCTGCCTGGCCAACTCTAACTATGAACGCGTTCACAGCCGTACTATAGTCCTTGCACGAGGACTACAAACACTCCTGCCACTAATGGCCGCATGATGATTACTCGCCAGCTTGACCAATCTAGCACTACCACCCACGATCAACCTAGTAGGAGAGCTGTTCGTAGTTATGGCCTCATTTTCATGATCCAACATTACCATCATCCTAATAGGAATCAACATCACCATTACCGCCCTATACTCCCTATACATGCTAATTACCACCCAACGTGGAAAATACACGCATCACATTAAAAACATCAAGCCATCCTTTACACGAGAAAACTCCTTAATAGCCCTCCATTTGCTACCCCTACTACTCC [...]
+AATCCTAAAGTCATCCTTGGTCCCATCTACT?????ATAAAAGTAATTAACTTATTTACTTCCTCAATCCTAGTGACACTATTCATACTGACCCTCCCCATCATGATAACCAACACCTCTATATACATTAGTAAACTCTACCCACAATACGTAAAAACCACCATTTCATGTGCCTTCATAATCAGCCTGATCCCCACGATAATATTCCTGCACCTGGGACAAGACACAATAATTTCAAACTGACACTGAATCACTATTCAAACTATAAAACTGTCCCTCAGCTTCAAATTTGACTACTTCTCGATAATCTTTATACCAGTGGCACTATTTGTCACATGATCGATCATAGAGTTCTCAGTCTGATATATACACTCAGACCCCTACATCAATCGATTCTTCAAATACCTACTCCTATTCCTCATCACCATAATAATTCTGGTCACTGCCAACAACATGTTTCAACTATTCATTGGCTGAGAAGGAGTAGGTATC [...]
+TCTACTCATCGGCTGATGGTACGGACGAACAGACGCAAACACAGCTGCACTACAAGCCATCCTATATAACCGTATCGGAGACGTAGGATTCATTATAGCGATAGCCTGATTTCTAACTAACCTGAACACATGAGACCTTCAACAGATCTTTATGACCAATCACGAGAACCTAAATATTCCCCTCATTGGTTTATTATTAGCAGCCACCGGAAAATCCGCACAATTTGGCCTCCACCCATGACTGCCCTCGGCCATAGAAGGCCCTACCCCCGTATCAGCCCTATTGCACTCAAGCACTATAGTTGTAGCAGGGGTATTTCTCCTAATCCGATTTCATCCCCTGATAGAACACAACAAAACCTTACAGACCATCACACTATGCCTAGGGGCAATCACGACCCTATTCACAGCAATCTGTGCCCTAACACAAAACGACATCAAGAAAATCGTCGCTTTCTCTACCTCCAGCCAGCTTGGCCTGATAATTGTAAC [...]
+TCAACCAACCCTATCTAGCATTCCTTCATATTTGCACACACGCATTCTTCAAAGCCATGCTGTTCATGTGCTCCGGATCAATTATCCACAGCCTAAACGATGAACAGGACATCCGAAAGATAGGAGGGCTATTCAAGGCATTACCATTCACCACCACCTCCCTAATCGTCGGAAGCCTGGCACTCACAGGAATACCTTTCCTAACAGGATTCTATTCCAAAGACCTAATCATCGAGACCGCCAACACGTCGTATACCAACGCCTGAGCCCTACTAATAACTCTCGTTGCCACATCCATAACAGCCGCCTACAGCACTCGAATCATATTCTTTGCACTCCTAGGACAACCCCGCTTCAACCCTATTATCACAATCAACGAGAATGATCCACACCTAATCAATTCCATCAAACGTCTTTTATTTGGGAGCATCTTCGCAGGATTCTTAATCTCCTACAACATTACACCCACCACCACCCCACAGATAACTATGC [...]
+CTCAAAATAATAGCTCTCGTCGTAACCATTTTAGGTTTCATCCTGGCACTAGAACTCAACCTTATAATACAGAACCTAAAGTTCAAGTACCCTTCAGGCCTATTTAAATTCTCAAACATACTAGGCTACTTTCCCACTATCATTCACCGCTTAATACCCAAAACAAACCTACTTATGGGCCAGAAATCAGCGTCAACGCTACTAGACATGACTTGGATAGAAGTAATCCTACCAAAATCTATCTCCCACTTCCAAATAAAATCCTCAATCACCATTTCTAACCAAAAGGGTTTAATCAAACTATACTTTATATCCTTCATACTCACCCTGACCCTCAGCCTACTTACA??????CTTAGTTTCCACGGG
+>Martes_melampus
+ATGAACGAAAATTTATTCTCCTCTTTCATTACCCCTACAATAATAGGACTCCCTATTGTTATCGCCATCACTATATTCCCAAGCATCATATTTCCCTCACCAACCCGGTTAATCAATAACCGGCTCATCTCCATCCAACAGTGATTGGTACAGCTAACATCGAAACAAATACTGTCTATTCACAATCAAAAAGGACAAACCTGAGCACTAATATTAATATCCCTAATCCTATTTATTGGCTCCACCAATCTACTAGGCCTCCTACCGCACTCATTCACTCCCACCACGCAACTATCCCTAAATCTGGGCATAGCTATCCCCCTATGAGCGGGCACAGTAATTACTGGCTTCCGGCATAAAACAAAGGCCTCCTTAGCCCACTTCCTACCACAAGGCACGCCGCTTCCTCTAATTCCCATGCTTGTAGTCATTGAAACCATCAGCCTATTCATTCAACCCATAGCCCTGGCCGTGCGACTAACAGCCAACATC [...]
+TCACTTATTAATCCACCTAATTGGAGGAGCCACCCTAGCCTTAATGAGTATCAGCACTGTCACAGCCATAGTGACCTTCACCATCCTCATCCTTCTAACCATCTTAGAGTTTGCAGTAGCCCTTATCCAAGCCTACGTCTTTACTTTACTAGTAAGCCTGTACTTACATGATAACACTTAAATGCCACAACTAGATACCTCGACATGATTCATCACGATCTTATCAATAATTATTACCCTGTTCTTCATATTTCAACTAAAAGTAGCAAAATACAACTTTCCAGAGAACCCTGAGCCAAAACTAATATCCGTATCAAAATCCACTACACCTTGAGAAAAAAAATGAACGAAAATTTATTCTCCTCTTTCATTACCCCTACAAATGTTCATAAATCGATGATTATTCTCCACAAATCACAAAGACATCGGCACTCTTTACCTCTTATTTGGCGCATGAGCCGGAATAGTGGGCACTGCATTAAGCCTATTGAT [...]
+AATTAGGTCAACCTGGCGCTTTGCTGGGAGATGATCAAATTTATAATGTGATTGTAACCGCCCATGCATTTGTAATGATTTTCTTCATAGTGATACCCATTATAATTGGGGGCTTCGGAAACTGACTAGTGCCCTTAATAATCGGTGCACCTGACATGGCATTCCCACGTATAAACAACATAAGCTTCTGACTTCTACCTCCTTCTTTCCTTCTACTTTTAGCCTCTTCCATAGTGGAAGCAGGTGCAGGAACAGGATGAACCGTATACCCCCCTCTAGCGGGAAATCTAGCACACGCAGGAGCATCCGTAGACCTGACAATCTTTTCTCTACACCTGGCAGGTGTCTCATCTATCTTGGGGGCCATCAATTTTATTACAACCATCATCAATATGAAGCCTCCTGCAATATCGCAATACCAAACCCCTCTATTCGTATGATCCGTCCTAATCACAGCCGTACTTCTTCTACTTTCCCTACCAGTATTAGCAG [...]
+ACTATACTACTTACAGACCGAAATCTAAATACTACCTTTTTCGACCCCGCCGGAGGAGGGGACCCCATCCTGTATCAACACCTGTTTTGATTTTTTGGGCACCCCGAGGTATACATCTTAATTTTACCAGGATTCGGAATCATCTCGCACGTTGTAACATATTACTCAGGAAAGAAGGAACCATTCGGTTACATGGGCATGGTTTGAGCAATAATATCTATTGGGTTCTTGGGATTCATTGTATGAGCCCATCACATGTTTACCGTGGGAATGGACGTTGACACACGAGCATACTTCACCTCAGCCACTATAATCATCGCAATTCCAACAGGGGTAAAAGTATTTAGCTGACTAGCCACCCTCCATGGGGGAAACATTAAATGATCGCCGGCCATACTGTGAGCCTTAGGCTTTATCTTTCTTTTCACAGTAGGCGGTTTAACAGGTATTGTGCTATCAAACTCATCACTAGATATTGTTCTCCACGACACA [...]
+AGTAGCCCACTTCCATTACGTTCTCTCAATGGGAGCGGTTTTCGCAATCATAGGCGGATTCGTCCACTGATTCCCCTTATTCACAGGTTATACACTAAACGATATTTGAGCAAAAATTCACTTCACGATCATATTCGTGGGAGTAAACATGACATTCTTCCCCCAACACTTCCTAGGCCTATCAGGCATACCCCGACGATACTCCGACTACCCAGATGCCTACACCACATGAAACACAGTATCTTCCATGGGTTCGTTCATTTCATTAACTGCGGTCATGCTAATAATCTTCATAATTTGAGAAGCATTCGCATCCAAACGAGAAGTACTAACTGTAGAACTCACCTCAACAAATATTGAATGATTACACGGATGTCCTCCTCCATACCACACATTCGAAGAGCCAACCTACGTACTATCAAAAATGGCGTACCCTTTCCAACTAGGCCTTCAGGATGCAACCTCCCCCATCATAGAGGAGCTACTACACTT [...]
+ACACCCTAATAATCGTATTCTTGATTAGCTCTCTTGTTCTCTACATCATTTCACTTATATTAACCACTAAATTAACACATACTAGTACTATAGATGCCCAAGAAGTTGAAACGGTTTGAACCATCTTGCCTGCTATTATTCTAATTCTAATTGCTCTACCCTCACTACGAATCCTTTACATAATAGACGAGATCAACAATCCTTCCCTGACTGTAAAAACTATAGGTCACCAATGATACTGAAGTTATGAGTACACGGACTACGAAGACCTAAACTTCGATTCTTACATGATCCCTACCCAAGAGCTAAAACCCGGAGAACTGCGATTGTTAGAAGTAGACAACCGAGTGGTCCTTCCAATAGAGATAACGATTCGCATATTAATCTCATCCGAAGACGTACTGCACTCGTGAGCCGTACCATCCCTAGGGCTAAAAACTGATGCTATCCCAGGACGTCTTAACCAAACCACCCTTATGGCTATACGTCCAG [...]
+TACGGCCAGTGCTCCGAAATCTGTGGTTCCAACCACAGCTTCATACCCATCGTTCTTGAACTAGTGCCCCTATCCCACTTCGAAAAATGATCTGCCTCAATACTAATGACCCACCAAACTCACTCATATCACATAGTTAATCCAAGCCCATGACCACTAACAGGAGCTCTCTCCGCTCTCCTTATGACATCAGGATTAGTAATATGATTCCACTTTAACTCAATAGCCCTCCTGACTCTAGGCATAACAACCAACTTATTAACCATATCCCAGTGATGACGAGATGTGGTCCGAGAAGGGACATTCCAAGGCCACCACACCCCCACCGTCCAAAAAGGCCTGCGATACGGAATAATCCTTTTCATCGTATCAGAGGTCTTTTTCTTCGCAGGTTTCTTCTGAGCCTTCTATCACTCAAGCCTAGCACCAACACCCGAGCTAGGAGGTTGTTGGCCACCTACAGGCATTACACCCTTAAATCCACTGGAAGTG [...]
+CAACACCTCAGTTCTTCTAGCCTCCGGAGTTTCTATCACCTGAGCCCACCATAGCCTAATAGAAGGTAATCGCAAACACATACTTCAAGCATTATTCATTACAATCTCCCTAGGCTTATACTTTACCCTCCTGCAAGCCTCAGAATACTATGAAACACCCTTCACAATCTCCGACGGAATCTACGGTTCCACATTCTTCATAGCCACAGGGTTCCATGGACTACACGTCATCATTGGCTCTACTTTCCTCATTGTATGCTTCCTACGACAACTAAACTTCCACTTCACGTCCAACCACCATTTCGGATTCGAGGCAGCCGCTTGGTACTGACACTTCGTAGACGTCGTGTGACTATTCCTATACGTTTCCATCTATTGATGAGGATCTTATATGACCAACATTCGTAAAACTCACCCACTAGCTAAAATCATCAACAATTCATTCATCGACTTACCTGCTCCATCAAACATTTCCGCATGATGAAACTTCGG [...]
+TTGGAATCTGCCTAATCCTACAGATTCTTACAGGTTTATTTCTAGCCATACACTATACATCAGACACAGCCACAGCCTTCTCATCAGTCACCCACATTTGCCGAGACGTCAACTACGGATGAATTATCCGATACATACATGCCAACGGGGCTTCCATATTCTTCATCTGCCTGTTCCTGCACGTCGGACGGGGCCTATACTATGGATCTTATATATACCCCGAAACATGGAACATTGGCATCATCCTATTATTCGCAGTTATAGCAACAGCATTCATAGGTTACGTTCTGCCATGAGGACAAATATCCTTTTGAGGTGCAACCGTAATTACCAACTTACTGTCAGCCATCCCCTACATCGGGACTAGTCTTGTAGAGTGAATCTGAGGAGGATTCTCGGTAGACAAAGCCACCCTAACGCGATTCTTCGCCTTCCACTTTATCCTGCCCTTCATCGTCTCAGCATTAGCAGCAGTACACCTTCTATTCCTCC [...]
+GGATCCAATAACCCCTCAGGAATCCCCTCCGACTCTGATAAAATCCCATTCCACCCATACTACACCATCAAAGACATCTTAGGCGCCCTATTCCTAATCCTAGTGCTCATAATACTAGTACTATTCTCACCCGATCTGCTGGGAGACCCAGACAACTACATCCCCGCCAACCCACTCAGCACACCACCCCATATTAAACCCGAGTGATACTTCCTGTTCGCATACGCAATCCTACGATCCATCCCCAATAAACTAGGAGGGGTACTAGCCCTAGTCTTCTCCATCCTAGTCCTAGCAATTATCCCACTACTTCATACTTCAAAACAACGAGGCATGATATTCCGCCCACTCAGCCAATGCCTATTCTGACTATTAGTGGCCGACCTCCTCACCTTAACCTGAATTGGAGGACAGCCCGTAGAACACCCATTCATCACTATCGGCCAACTAGCCTCGATCCTCTACTTCGCAATCCTTCTAATCCTTATACCA [...]
+CATTATCGAAAACAACTTATTAAAATGAATGTTTATAATTAACATCATTTCACTAATCGTACCTGTTCTACTCGCTGTAGCCTTCCTGACATTAGTAGAGCGAAAAGTCCTAGGTTACATACAACTCCGTAAAGGCCCAAATGTCGTAGGCCCCTATGGCCTTCTACAACCCATTGCAGATGCCGTAAAACTTTTCACTAAAGAACCCCTACGACCTCTAACATCATCAATTACTATATTCGTAATAGCTCCTATTCTAGCCCTGACATTGGCTCTGACCATATGAATTCCACTACCTATGCCCTACCCCCTCATCAACATAAACCTAGGAGTCTTGTTCATACTAGCAATATCAAGCCTAGCCGTCTACTCTATCCTATGATCCGGCTGAGCTTCAAACTCAAAATACGCCCTAATTGGAGCCCTCCGAGCTGTAGCTCAGACAATTTCCTATGAAGTAACACTAGCCATCATTCTTCTATCAGTATTACT [...]
+GTTCATTTACCCTATCTACACTAATCACTACACAAGAGCACCTATGATTAATCCTCCCTGCATGACCCCTGGCCATGATATGGTTTATCTCAACACTGGCAGAAACCAACCGCGCTCCATTTGACCTAACAGAGGGAGAATCAGAACTAGTCTCTGGGTTTAACGTTGAATATGCAGCCGGACCATTTGCCCTATTCTTCCTAGCAGAATACGCCAACATTATTATAATAAATGCCCTCACAACTATCCTATTCTTCGGCGCATTCCACACCCCCTACCTACCGGAATTATACTCCGTCAACTTCACCATAAAGACACTCCTACTAACCATTTCCTTCCTATGAATCCGAGCATCCTACCCACGATTCCGCTATGACCAACTAATACACTTACTATGAAAAAATTTTCTCCCTCTAACCCTAGCCCTATGCATATGACACATGGCCCTACCCATCATAACAGCAAGCATTCCACCCCAAACAATTAAACCCC [...]
+GCTATCATCATATCAACCGTTATCTCAGGCACTATCATAGTATTAATCAGTTCCCACTGATTAACAATCTGAATCGGGTTTGAAATAAACATACTGGCCATCATCCCCATTCTAATAAAAAAATTTAACCCACGAGCCATGGAAGCCTCAACAAAATACTTTCTTACCCAAGCCACCGCATCCATGCTCCTTATGCTAGGAATTATCATCAACCTACTTCTAACAGGACAATGAACAGTACTAAACATGCCCAATCCGATCGCATCAAACATAATAACAGTAGCCCTAGCAATAAAACTAGGACTGTCCCCCTTCCATTTCTGAGTGCCCGAAGTAACCCAAGGAGTCCCGATATCATCAGGAATAATCCTACTCACCTGACAAAAAATCGCCCCCTTATCTATCTTATACCAAATCGCCCCATCCATAAATCCGAACCTACTAACAACTATAGCCATCATATCCGTTCTAGTAGGAGGCTGAGGAGGCCTT [...]
+ACAACTACGAAAAATCCTAGCATACTCGTCAATCGCCCATATAGGATGAATGATCGCTGTAACAACGTACAACCCGACCCTAATATTACTAAACCTTACGATCTACATCGCAATGACACTCGGAACCTTCATATTATTCATACTTAACTCATCCACAACCACCCTATCACTATCCCACACATGGAATAAACTCCCACTAATCGCCTCACTAATCTTGATAATCATACTATCACTAGGAGGCCTACCTCCCCTCTCAGGCTTTGTCCCTAAGTGGATAATCATCCATGAACTCACGAAAAATGATATGACCATCGTAGCAACATTCATAGCAATAACAGCTCTACTAAACCTATACTTTTACATACGACTAACGTACGCAACAGCACTAACCATATTCCCCTCAACTAACACTATAAAAATAAAATGACAATTCGGAAGCACAAAAAACACAACCCTACTCCCCCCGCTAATCGTAATCTCAACCATACTACT [...]
+CCCCAATGATACTAACGCTATTCATAAACATAGTTCTAACCCTACTTATTAATGCATCCTTGGCATCACTACTTGTCCTAATCGCATTCTGACTACCTCAACTAAACATTTATGCAGAAAAGGCAAGCCCTTACGAGTGCGGCTTTGACCCCCTAGGATCAGCACGCCTACCTTTCTCCATAAAATTCTTCCTAGTGGCTATCACATTCTTACTATTCGACCTAGAAATTGCACTACTCCTACCATTGCCATGAGCCTCCCAATCAGTTAACCTAAAAACAACACTCACCATGGCGCTAGCGCTAATCTCCTTACTAGCACTAAGCCTGGCCTACGAATGAACCGAGGAAGGCCTTGAATGAAATAAAATGTCCATAGTGTACATCAACATCTTCTTGGCCTTTATTCTATCCTTCATGGGGCTACTTATCTACCGATCCCACTTAATATCTTCCCTACTCTGTCTTGAGGGCATGATGTTATCCCTCTTCG [...]
+ACAGTGACTATCCTGACTAACCACCTAACACTGGCCAGCATGACCCCTATTATTCTTCTCGTATTCGCCGCCTGTGAAGCCGCATTAGGATTATCTCTACTGGTCATAATCTCCAATACATACGGAACGGACTACGTACAAAACTTAAATCTACTACAATGCATCATTGTCCCAACTATAATGCTAATCCCCCTAACATGACTATCAAAGCCTAACATAATTTGAATCAACACAACAGCGTACAGCATGCTAATTAGTCTCATCGGCCTGACATACCTTAATCAATTCACGGACAACAACCTAAACTTCTCCCTACTATTCTTCACCGACTCCCTATCAGCACCCCTACTGATACTCACAACGTGGCTCCTTCCCCTAATACTCATAGCAAGCCAACACCACTTATCAAAAGAAACCCTTACCCGAAAAAAACTTTACATTACAATACTAGTCATACTTCAACTGCTCCTAATCATGACATTCACCGCCACA [...]
+CATATTCTATATTCTATTTGAAGCCACACTAATACCAACACTAATCATTATTACTCGATGGGGCAATCAAACAGAACGCTTGAACGCTGGCCTGTACTTCCTGTTCTACACCCTAGTAGGATCCCTGCCCCTCCTGATTGCACTATTATGACTCCAAAGTAACCTAGGCACCCTAAACCTGCTAGTGATCCAATATTGAACACAACCCCTGTTAAGCTCGTGATCAAACACCTTACTATGACTAGCATGCATAATAGCATTTATGGTAAAAATACCTTTGTACGGTCTTCACCTATGACTCCCAAAAGCCCATGTAGAGGCCCCCATCGCTGGCTCCATAGTCCTTGCAGCCGTGCTCCTAAAACTAGGCGGATATGGGATAATACGAATCACTATCCTATTAAACCCACTGACAGACTCCATAGCATACCCCTTCATGATACTATCCCTCTGAGGAATAATCATAACCAGCTCTATTTGTCTACGCCAAAC [...]
+AATCTTTGATCGCTTACTCCTCTGTAAGCCACATGGCCTTAGTAATCGTAGCAGTACTCATTCAATCACCATGAAGTTACATGGGAGCAACAGCCCTAATAATCGCTCACGGCCTAACATCATCCATACTATTCTGTTTGGCCAACACTAACTATGAACGCATTCACAGCCGTACTATAATCCTTGCACGAGGACTACAAACACTCCTACCACTAATGGCCGCATGATGACTACTCGCCAGCTTGACCAATCTAGCACTACCGCCCACAATCAATCTAGTAGGAGAACTGTTCGTAGTTATGGCCTCATTTTCATGATCCAACATTACCATCATCCTAATAGGAATCAACATCACCATTACCGCCCTATATTCCCTATACATGCTAATTACCACCCAACGTGGAAAATACACGCATCACATCAAAAACATTAAACCATCCTTTACACGAGAAAACTCCTTAATGACCCTCCATTTGCTACCCCTACTACTCC [...]
+AATCCTAAAGTCATCCTTGGTCCCATCTACTGTAAAATAAAAGTAATTAACTTATTTACTTCCTCAATCCTAGTGACACTATTTATATTGACCCTCCCCATCATGATAACCAACACCTCCATATACACTAGCAAACTCTACCCACGATACGTAAAAACCACCATTTCATACGCTTTCATAATCAGCCTAATCCCCACTATAATATTTCTGCACCTGGGACAAGACACAATAATTTCAAACTGACACTGAATCACTATCCAAACTATAAAACTGTCCCTCAGCTTCAAATTTGACTACTTCTCGATAATCTTTATACCAGTAGCACTATTTGTCACATGATCAATCATGGAATTCTCAATCTGATATATACACTCAGACCCCTACATCAATCGATTCTTCAAATACCTGCTCCTATTCCTCATCACCATAATAATTCTGGTCACTGCCAACAACATATTTCAACTATTCATTGGCTGAGAAGGAGTGGGTATC [...]
+CCTACTCATCGGCTGATGATACGGACGAACAGACGCAAACACAGCTGCATTACAAGCCATCCTATATAACCGTATCGGAGACGTAGGATTCATTATAGCAATAGCCTGATTCCTGACTAACCTGAACACATGAGACCTTCAACAAATCTTTATGGCTAACCATGAGAACCTAAATATTCCCCTCATTGGTTTATTATTGGCAGCCACCGGAAAATCCGCACAATTTGGCCTCCACCCATGATTGCCCTCGGCCATAGAAGGCCCTACCCCCGTATCAGCCCTATTGCACTCAAGCACTATAGTTGTAGCAGGGGTATTTCTCCTAATCCGATTTCACCCACTGATAGAACATAACAAAACCTTACAAACCATCACACTATGCCTAGGGGCAATCACAACCCTATTCACAGCAATCTGTGCCCTGACACAAAACGACATCAAAAAAATCGTCGCTTTCTCTACCTCTAGCCAGCTTGGTCTGATAATCGTAAC [...]
+TCAACCAACCCTACCTAGCATTCCTCCATATTTGCACACATGCATTCTTCAAGGCCATGCTGTTCATGTGCTCCGGATCAATTATCCATAGCCTGAACGATGAACAGGACATCCGAAAGATAGGAGGACTATTCAAGGCACTGCCATTCACCACCACCTCCCTAATCGTCGGAAGCCTGGCACTCACAGGAATACCCTTCCTAACAGGATTCTATTCCAAAGACCTAATCATCGAGACCGCCAACACGTCGTATACCAACGCCTGAGCCCTACTAATAACTCTCGTCGCCACATCCATAACAGCCGCCTACAGTACTCGAATCATATTCTTTGCACTCCTAGGACAACCCCGCTTCAGCCCTATTATCACAATCAACGAGAATGATCCACACCTAATCAATTCCATCAAACGTCTTCTATTTGGGAGCATCTTCGCAGGATTCTTAATCTCCTACAACATTACACCCACCACCACCCCACAGATAACTATGC [...]
+CTCAAAATAATAGCCCTCATCGTAACCATTTTAGGTTTCATCCTGGCACTGGAACTCAACCTTATAATACAGAGCCTAAAGTTCAAGTACCCTTCAGGCCTATTTAAATTCTCAAACATACTAGGCTACTTTCCCACTATCATTCACCGCTTAATACCCAAAGCAAACCTACTTATGGGCCAGAAATCAGCATCGACACTACTAGACATAACCTGAATAGAAAAAATCCTACCAAAATCCATCTCCCATTTCCAAATAAAATCCTCAATCACCGTTTCAAACCAAAAGGGCTTAATCAAATTATACTTTATATCCTTCATACTCACCCTAACCCTCAGCCTACTTACA??????CTTAATTTCCACGGG
+>Meles_meles
+ATGAACGAAAATCTATTTTCCTCTTTCATTACCCCAACAATAATAGGACTCCCTATTGTTGTTATAATCATTATATTCCCAAGTATTCTATTCCCCTCACCGAATCGACTAATCAATAATCGATTAATCTCTATCCAACAGTGACTAGTACAACTAACATCCAAGCAAATGCTGTCCATCCACAACCAAAAAGGTCAAACTTGAGCACTAATATTAATATCCTTAATCCTATTTATTGGCTCTACCAATTTACTAGGTCTATTACCTCACTCATTTACCCCTACTACTCAACTGTCCCTAAACTTAGGTATAGCTATCCCCCTATGGGCAGGAACAGTAATTGTTGGGTTCCGACATAAAACAAAGGCATCCTTAGCCCACTTCCTACCACAAGGAACACCACTACTTCTAATTCCTATACTTATTATCATTGAAACTATTAGCCTATTCATCCAACCAATAGCCCTAGCCGTGCGATTAACAGCAAATATT [...]
+TCACCTATTGATTCATCTGATTGGAAGTGCCACTTTAGCCCTAATAAACATTAGCACTGCCACAGCCATAGTAACCTTTATTATCCTAATTCTTCTAACCATCCTAGAATTTGCAGTAGCCCTTATCCAAGCCTACGTCTTCACCTTATTAGTAAGCTTATATCTACATGACAACACTTAAATGCCACAACTAGATACTTCAACATGACCAATCACAATCTTATCAATAATTATTACCTTATTTATTATATTTCAACTAAAAGTATCAAAATATAACTTTCCAGAAAACCCTGAACAAAAACTAGTATCTGTGCCAAAAACTATCACACCTTGAGAAAAAAAATGAACGAAAATCTATTTTCCTCTTTCATTACCCCAACAAATGTTCATAAATCGATGACTATTTTCCACAAACCATAAAGATATTGGTACCCTTTACCTTCTATTTGGTGCATGAGCTGGGATAGTAGGTACTGCTCTTAGTCTACTAAT [...]
+AATTAGGTCAACCCGGCACTTTATTGGGAGACGATCAGATCTACAATGTAGTCGTGACAGCCCATGCCTTCGTAATAATCTTCTTTATAGTTATACCCATCATAATTGGAGGCTTTGGAAACTGATTAGTCCCCCTAATAATTGGCGCACCCGACATAGCTTTCCCCCGAATAAATAATATAAGTTTCTGACTCCTACCTCCCTCCTTTCTTCTTCTCTTAGCCTCCTCCATAGTAGAAGCAGGTGCAGGAACAGGATGGACTGTATATCCTCCTCTAGCAGGAAACTTGGCACATGCAGGAGCATCTGTAGATTTAACAATTTTCTCTCTTCACCTAGCTGGTGTCTCATCTATCCTAGGAGCCATTAATTTTATCACTACCATTATTAACATGAAACCACCTGCAATATCACAATACCAAATTCCCTTATTCGTATGATCCGTACTAGTTACAGCCGTACTCTTACTTCTATCTCTACCAGTATTAGCGG [...]
+ACTATACTACTAACAGACCGAAACCTAAATACAACCTTCTTCGACCCTGCTGGAGGAGGGGATCCCATTCTTTACCAACATCTATTCTGATTTTTCGGACATCCTGAAGTATACATTTTAATCCTACCAGGATTTGGAATCATTTCACATGTTGTCACCTATTACTCAGGGAAAAAAGAACCATTCGGCTATATAGGAATAGTCTGAGCAATAATATCCATCGGTTTCTTAGGGTTCATTGTGTGAGCCCACCACATGTTCACTGTAGGAATAGACGTCGACACACGAGCATACTTCACCTCAGCTACCATAATTATTGCTATTCCCACAGGGGTTAAGGTATTTAGCTGACTAGCCACTTTACATGGGGGCAATATTAAATGATCACCGGCCATATTATGAGCCCTAGGGTTTATCTTCCTGTTTACAGTAGGAGGCTTAACAGGTATCGTCCTATCAAACTCATCGCTAGACATTGTTCTTCATGATACA [...]
+AGTAGCACATTTTCACTATGTCCTTTCAATGGGAGCAGTATTTGCAATCATAGGTGGATTCGTTCATTGATTCCCACTGTTTACAGGATATACACTAAATGATGTTTGAGCAAAAATTCACTTTACAATTATATTTGTAGGAGTCAATACCACATTCTTTCCACAACATTTCCTAGGTTTATCAGGTATACCTCGACGATACTCCGACTACCCAGATGCCTACACAGCATGAAATACAGTCTCCTCTATAGGCTCATTTATCTCATTAACAGCAGTTATACTGATAATTTTCATAATCTGAGAAGCCTTCGCATCCAAACGAGAAGTACTAACGGTAGAACTCACCTCAACAAACGTTGAATGACTACATGGATGCCCTCCCCCATATCACACATTTGAAGAGCCAACCTATGTATTATCAAAAATGGCATATCCCTTCCAAATAGGTCTTCAAGATGCAACTTCCCCTATTATAGAAGAACTTCTACACTT [...]
+ATACGTTAATAATCGTATTCCTAATTAGCTCCTTAGTCCTATATATCATTTCATTAATGTTAACAACTAAATTAACCCATACTAGTACTATGGATGCCCAAGAAGTTGAAACAGTTTGGACTATCCTACCTGCTATCATCTTAATCCTAATCGCCTTACCCTCACTACGAATTCTCTACATAATAGATGAAATCAATAATCCTTCCCTAACCGTAAAAACCATGGGTCACCAATGATACTGAAGTTACGAATACACGGACTATGAAGACTTAAACTTTGACTCTTACATAATTCCAACCCAAGAACTAAAACCCGGGGAACTTCGACTATTAGAAGTGGACAACCGAGTAGTCCTTCCAATAGAAATAACCATTCGTATATTAATCTCCTCTGAAGACGTATTACACTCATGAGCCGTACCATCACTAGGATTAAAAACCGATGCTATTCCAGGACGCCTTAATCAAACAACCCTTATAGCCATACGGCCAG [...]
+TACGGCCAATGTTCAGAAATCTGTGGTTCCAATCATAGTTTCATGCCAATCGTACTTGAACTAGTACCCCTATCCCATTTTGAAAAATGATCCGCCTCAATACTAATGACCCACCAAGCCCATTCATACCACATAGTCAACCCAAGCCCATGACCTCTAACAGGAGCCCTCTCCGCCCTCCTCATAACATCAGGCTTAGTAATATGATTCCATTTTAATTCAATCTACCTCTTGACTCTTGGTATAACAACTAATCTATTAACTATATACCAATGATGACGAGACATTATCCGAGAAGGAACATTTCAAGGTCATCACACCCCCACAGTCCAGAAAGGCTTGCGATACGGAATAGTCCTTTTTATCGTGTCAGAAGTTTTCTTCTTTGCAGGTTTCTTCTGGGCCTTCTACCATTCAAGCCTAGCACCGACCCCCGAATTAGGAGGATGCTGACCACCTACAGGTATCACACCCCTAAACCCACTAGAAGTC [...]
+TAACACCTCAGTTCTCCTAGCCTCTGGAGTCTCCATTACCTGAGCCCATCACAGCTTGATAGAGGGTTACCGTAAACATATACTTCAAGCACTATTTATTACAATCTCTCTAGGCTTATATTTCACCCTTTTACAAGCCTCAGAGTATTATGAAACATCATTCACAATCTCTGATGGAGTTTATGGCTCTACATTCTTTATGGCCACAGGATTCCATGGTCTTCACGTTATCATCGGGTCTACCTTCCTCATCGTATGTTTCCTACGCCAGCTAAACTATCATTTTACATCTAGTCACCATTTTGGTTTTGAAGCAGCTGCTTGATATTGACATTTCGTAGACGTAGTATGACTATTCCTTTACGTCTCCATTTATTGATGAGGGTCTTATATGACCAACATTCGTAAATCACACCCACTAATCAAAATCATCAACAACTCATTTATTGACTTACCCGCACCATCCAATATCTCAGCATGATGAAACTTTGG [...]
+TCGGGATCTGCCTAATCCTACAAATTCTTACAGGTTTATTCCTAGCCATACATTACACACCAGACACCACCACCGCTTTCTCATCAGTCACACATATTTGCCGAGACGTCAACTATGGTTGAATCATTCGATATATACACGCTAATGGAGCCTCCATATTCTTTATCTGCTTGTTCTTACATGTAGGACGAGGCCTATACTACGGATCCTATATATTTCCTGAGACATGAAATATCGGCATCATCCTATTATTTACAGTGATAGCAACTGCATTCATAGGTTACGTTTTACCATGAGGACAAATGTCTTTTTGAGGAGCAACCGTAATTACTAACTTATTGTCAGCTATCCCATACATTGGAACCAACCTCGTAGAATGAATCTGAGGGGGGTTCTCAGTAGATAAAGCCACCCTCACACGATTCTTTGCCTTCCACTTCATCTTACCATTCATCATTCTTGCCTTAGCAGTAATCCATTTACTATTTCTCC [...]
+GGATCCAATAACCCCTCTGGAATCCCCTCCAATTCTGACAAAATCCCATTCCATCCATATTACACTATCAAAGATATCCTAGGGGTTTTACTCCTAATACTAATGCTCATAATCCTAGTGCTATTTTCACCCGACCTATTAGGAGACCCAGACAACTACACCCCCGCCAACCCACTTAATACACCACCCCATATCAAGCCCGAATGGTATTTCTTATTCGCATACGCAATCCTACGATCTATCCCAAACAAACTAGGAGGGGTGTTAGCCCTAATCTTCTCTATCCTAATCCTAGCTATCATCCCATTACTACATACCTCAAAACAACGAAGTATAATATTCCGCCCACTAAGTCAATGCCTATTCTGATTACTAGTTGCAGACCTCTTCACCTTAACATGAATCGGAGGCCAACCAGTAGAATACCCATACATTGCCATCGGCCAACTAGCATCCATCCTCTACTTTACAATCCTCCTAATCTTAATACCA [...]
+CATTATCGAAAATAACTTACTAAAATGAATGTTTATAATCAACATTATCTCACTAATTGTGCCCATCTTACTTGCCGTAGCCTTCCTAACATTAGTGGAACGAAAAATCCTAGGGTACATACAACTCCGTAAAGGACCAAACATCGTAGGCCCTTACGGCCTATTACAGCCAATCGCAGACGCTGTAAAACTTTTCATTAAAGAGCCCCTACGACCCCTAACATCATCCATCACTATATTCGTTATAGCCCCAATCCTAGCTCTAACACTAGCCCTAACTATATGAATTCCACTACCAATACCCTATCCCCTCATCAATATAAACCTAGGAATCCTCTTTATACTAGCAATATCCAGCCTAGCCGTCTATTCCATCCTGTGATCAGGATGAGCCTCAAATTCAAAATATGCCCTAATCGGAGCCCTACGAGCCGTAGCCCAAACAATCTCCTATGAAGTCACATTAGCCATCATCCTTCTATCAGTACTATT [...]
+GCGCCTTCACCCTATCCACACTTATTATTACACAAGAACACTTATGACTAATTTTCCCCGCATGGCCCCTAGCTATAATATGATTTATCTCAACTCTAGCAGAAACCAACCGCGCCCCATTCGACCTAACAGAAGGAGAATCAGAACTAGTTTCTGGATTCAATGTCGAATATGCAGCTGGACCATTCGCCCTATTTTTCCTAGCCGAATACGCTAATATTATTATAATAAATATCCTCACTACTATCCTATTTTTCGGCGCATTCCATACCCCCTACTTACCAGAACTATACTCAATTAACTTCATCATAAAAGCACTCTTACTAACAATCTTCTTCCTATGAATCCGAGCATCCTATCCGCGATTCCGATACGATCAACTAATACATTTACTATGAAAAAATTTCCTCCCTTTAACACTAGCCCTATGCATATGATATATAGCCCTACCCGTTATAACAGCAAGTATCCCCCCACAAACAATTAAACCCC [...]
+ATCATCATCATATCAACTGTCATCCTAGGAACAATCATAGTACTAACAAGCTCCCACTGATTAATAATCTGAATCGGATTCGAAATAAACATACTAGCTATTATTCCTATCCTAATAAAAAAGTTCAATCCACGAGCCATAGAAGCATCAACAAAATATTTCCTAACCCAAGCCACCGCATCTATACTCCTTATATTAGGTATTATCACCAATTTACTACTATCAGGACAATGAACAATACTGAATACCCCCAATTTAATCACATCAAACATGATAACAATCGCCCTAGCAATAAAACTAGGACTATCTCCTTTTCACTTCTGAGTACCTGAAGTGACCCAAGGAATTCCATTATCATCAGGAATAGTCCTATTAACATGACAGAAAATCGCTCCCCTATCCGTCCTATACCAAATCTCTCCCTCCATTAACCCAAACCTATTAACAATCATAGCTATAACATCTGTCCTAGTAGGAGGCTGAGGAGGCCTT [...]
+CCAACTACGAAAAATCCTAGCATACTCATCAATTGCCCATATAGGATGAATAATCGCTGTAACAGCATATAGCCCAACCCTAATAGCCCTAAACCTAGCAATTTATATTACAATAACTCTCGGGACATTTATATTATTTATACTCAGCACATCCACAACTACACTATCACTATCCCATACATGAAATAAATTCCCACTAATTACATCACTCATCCTAATAGTCATACTATCACTAGGAGGCCTCCCTCCCCTCTCAGGCTTCATCCCCAAATGAATAATCATCCATGAACTCACAAAAAATAATATAATCATCGCACCAATATTCATAGCAATAACAGCCCTATTAAACCTATACTTCTACATACGACTGACCTATGCGACCGCACTCACCATATTCCCCTCAACAAATATCATAAAAATAAAATGACAATTTGAGAATACAAAAAATATAACCTTCTTACCACCACTAATTGTAATCTCAACTATACTTTT [...]
+CCCCAATAGCACTAGCACTATTAATAAACATACTATTAACCCTCCTCATTAACGTATCACTAGCATCCCTACTTGTCCTAATCGCATTCTGACTCCCCCAATTAAACATCTATACCGAAAAAGCAAGTCCTTACGAATGCGGCTTTGACCCCCTAGGATCAGCACGCCTACCTTTTTCCATAAAATTCTTCCTAGTAGCTATCACATTTCTTCTATTTGACTTAGAAATCGCTCTACTCCTACCACTACCATGAGCCTCACAATCAAGCAACTTAAATACAACACTCGCCACGGCGCTACTGCTAATTCTCCTGTTAGCAACAAGCCTAGCCTACGAATGAGCTGAAGAAGGCCTAGAATGAAATGAAATGTCCATAGTCTATATTAATATCCTCCTAGCTTTCTCTCTATCCTTCATAGGACTACTCATCTACCGATCCCACCTAATATCCTCCCTACTTTGCCTAGAAGGTATAATACTATCACTTTTTA [...]
+GCAGTAACTATTCTAGTTAATCACCTCACATTAGCTAGCATAGCTCCCATCATCCTCCTTGTATTCGCAGCCTGTGAAGCAGCCTTAGGATTATCTCTATTAGTAATAATCTCCAATACATATGGAACCGACTATGTACAAAACCTAAATCTACTACAATGCATCATTGTCCCCACTATAATATTAATTCCCCTAGCATGATTATCAAAACCTAATATAATCTGAATTAATACAACAGCTCACAGTATATTAATTAGCCTTATCAGCCTTACATACCTTAATCAACTCGCAGATAATAACCTAAATTTCTCACTACTATTTTTTGTAGACTCTTTATCAGCACCCCTCCTAATACTCACTACATGGCTTCTACCATTAATACTCATAGCAAGCCAACATCACCTGTCAAAAGAAACCCTCACCCGAAAAAAACTCTACATTACAATATTAATTATACTACAACTATTTTTAATCATAACATTTACCGCAACA [...]
+TATATTTTATATCCTATTTGAAGCCACATTAATGCCAACACTTGTTATTATTACCCGATGAGGTAATCAAACAGAACGCCTAAACGCTGGCCTATACTTCCTATTTTATACCCTAGTGGGCTCCCTACCCCTTCTAATCGCACTACTATGAGCCCAAAATAACCTAGGTACCCTAAACCTATTAGTAATCCAATACTGGGCACAACCACTGTCAAATTCATGATCCAACGCCCTACTATGACTAGCATGTATGATAGCATTCATAGTAAAAATACCTCTATATGGCCTCCACCTATGACTCCCAAAAGCCCACGTAGAAGCCCCCATCGCCGGATCCATGGTCCTCGCTGCCGTACTCCTTAAACTAGGTGGTTATGGAATAATACGTATTACTATATTATTAAATCCACTGACCAACCTCATAGCTTATCCTTTCATGATATTATCTTTGTGAGGAATAATTATAACAAGCTCCATTTGTCTACGCCAAAC [...]
+AATCTCTAATTGCCTACTCTTCCGTTAGCCATATAGCCCTAGTAATTATAGCAGTTCTCATCCAATCCCCATGAAGCTACATAGGAGCAACAGCCCTAATAATTGCCCATGGTCTAACATCATCTATATTATTCTGTTTAGCCAACTCCAACTATGAACGCATCCACAGTCGTACCATAATCCTTGCACGAGGCCTACAAACACTCCTCCCATTAATAGCCGCATGATGACTACTTGCTAGCCTGACTAACCTGGCTCTGCCCCCCACAATTAATCTAGTAGGGGAATTATTTGTAGTAATTGCCTCATTTTCATGATCTAACATCACTATCCTTCTAATAGGAATTAACATCACCATTACAGCCTTATACTCCCTGTATATATTAATTACTACACAACGCGGAAAATATACACATCACATCAAAAACATCAAACCATCCTTTACACGAGAAAATTCCCTAATAGCTCTCCACTTATTACCCTTACTACTCC [...]
+AACCCTAAACTTATCCTAGGACCCATTTACTGTAAAATAAAAGTAATCAATCTATTTTCCTCCTCAATTCTAGTAACACTATTCATACTTACTATCCCAATCATAATGACCAATACCACTGTATACACCAATAAACTCTACCCCCAATACGTAAAAACCACTGTCTCCTATGCTTTCATAATCAGTTTAATCCCCACAATAATTTTCCTTCATATGGGACAAGATATAATAATTTCAAACTGACACTGAATTACGATCCAAACCATAAAAATATCCCTCAGCTTCAAACTAGACTACTTCTCAATAATTTTCATTCCAGTAGCATTATTTGACACATGATCAATTATAGAATTCTCAATATGATACATACACTCAGACCCTTACATTAACCGATTTTTCAAATACTTACTTCTATTCCTCATCACCATAATAATTTTAGTTACTGCTAATAATATGTTTCAACTTTTCATCGGTTGAGAAGGAGTAGGAATT [...]
+TCTACTTATCGGCTGGTGATATGGACGAACAGACGCAAACACCGCCGCACTACAAGCCGTCCTGTATAATCGCATCGGAGACGTAGGGTTCATCCTGGCCATAGCCTGATTCCTATCTAATCTAAACACATGAGATCTACAACAGATCTTTATAACCAACCACGAAAACCTAAACATCCCTCTCATAGGCCTACTACTAGCAGCCACTGGAAAATCCGCCCAATTTGGGCTCCACCCATGACTACCCTCAGCTATAGAAGGGCCCACTCCTGTATCAGCCCTATTACACTCAAGCACAATAGTCGTAGCCGGGGTATTCCTCCTAATCCGATTTTACCCCTTAATAGAGCACAACAAAGCCATACAATCTATCACACTATGTTTAGGAGCAATAACAACCCTATTCACAGCAATCTGTGCTCTAACACAGAATGATATCAAAAAAATCGTAGCTTTCTCCACTTCAAGTCAACTAGGACTAATAATCGTAAC [...]
+TTAACCAACCTTACCTAGCATTCCTCCATATCTGCACGCACGCATTCTTCAAAGCTATACTATTTTTATGCTCAGGCTCAATCATCCACAGCCTAAACGATGAACAAGATATCCGAAAAATAGGAGGCCTATTCAAGGTACTACCATTCACCACCACCTCCCTAATCGTCGGAAGCCTAGCACTTACAGGTATGCCCTTCCTAACTGGATTCTACTCCAAAGACCTAATCATTGAAACTGCCAACACGTCGTATACCAACGCCTGAGCCCTACTAATTACTCTCGTCGCCACCTCCATAACAGCCGCCTACAGCACCCGAATTATATTCTTCGCACTACTAGGACAACCTCGCTTTAGCCCAACTATCATAATCAACGAGAACAATCCACTCCTAATTAACTCCATTAAACGCCTTCTACTCGGGAGCATTCTCGCAGGATTTTTAATCTCCCACAATATTACACCCACTACCATCCCACAGATAACTATGC [...]
+CTTAAAACCACGGCTCTTACTGTAACCATCTTGGGCTTCATCCTGGCACTAGAACTTAGCCTTACAATACAAAGCCTAAAGTTTAAACACCCATCAAATCTGTTTACATTTTCAAACATACTAGGCTACTTCCCCACCATCTTCCACCGCCTAATACCCAAAATAAACCTACTCATGAGCCAAAAGTCAGCAACAATATTACTAGATATAATCTGGCTAGAAAAAACATTACCTAAATCTATCTCTCAATTTCAAATAAAATCCTCAATAACCATTTCCAACCAAAAGGGCCTAATCAAGTTATACTTCATATCTTTCATCCTTACTCTAGTCCTTAGCTTACTAGTA??????CTTAATTTCCACGAG
+>Melursus_ursinus
+ATGAACGAAAATTTATTCACCTCTTTCACTACCCCCACGATAATGGGGATTCCTATTGTAGTCTTAATTGTTATGTTTCCGAGTCTTTTATTTCCTTCCCCTAGCCGACTGATCAATAATCGCTTAGTATCCATTCAACAGTGACTAGTCCGGCTAACATCAAAACAAATATTATCCACTCATAATCACAAAGGACAAACCTGGGCACTAATATTGATATCACTAATCCTGTTTATTGGCTCAACCAACCTTCTGGGTTTATTACCGCACTCATTCACACCTACCACTCAGCTGTCAATGAACTTGGGAATGGCTATCCCCTTGTGGGCGGGTACAGTTATTACTGGGTTTCGATACAAGACTAAAGCATCCTTGGCCCACTTCCTACCTCAAGGAACACCTTTACCTCTGATCCCTATACTCGTAATTATCGAGACAATCAGTCTATTCATCCAACCTGTAGCCTTAGCCGTACGACTGACCGCTAATATT [...]
+TCACTTGCTCATCCACTTAATCGGAGGAGCTACCTTAGTCCTAACAAGTATTAGTACCATTACAGCCCTTATCGCCTTCACTATTCTAGTGCTACTCACCATTCTCGAGTTCGCTGTAGCCCTCATTCAGGCCTACGTCTTCACCCTGCTAGTAGGCCTATACTTACACGATAACACTTAAATGCCACAACTAGACACATCAACATGATCTATTACTATCCTATCTATAGTTTTAACTCTATTTATTATATTCCAGTTAAAAATCTCAAAACACAAGTGCCCCGAAGCCCCCGAGCCGAAATCTCCCTTACCACCAAAGAAACTTATGCCCTGAGAAGAAAAATGAACGAAAATTTATTCACCTCTTTCACTACCCCCACGAATGTTCATAAATCGATGACTATTCTCTACAAATCACAAAGACATTGGTACTCTTTACCTTCTGTTCGGTGCATGAGCCGGAATAGTGGGCACTGCTCTCAGCCTTTTAAT [...]
+AACTAGGTCAACCCGGGGCTCTGTTGGGGGATGATCAGATCTACAACGTAGTCGTAACCGCCCATGCATTTGTGATAATCTTCTTCATAGTCATGCCTATTATAATTGGGGGGTTCGGGAATTGATTAGTGCCCTTGATAATCGGTGCTCCTGACATAGCGTTTCCTCGAATAAATAACATGAGTTTCTGACTACTGCCGCCATCTTTCTTATTGCTTCTGGCCTCTTCCATAGTAGAAGCAGGCGCAGGAACTGGGTGAACGGTCTATCCCCCTTTAGCAGGTAATCTGGCCCATGCAGGAGCATCAGTAGACTTAACAATCTTTTCTCTGCACTTAGCAGGCGTCTCTTCTATTCTAGGAGCTATCAACTTCATTACTACTATCATCAACATGAAGCCCCCTGCAATATCTCAGTACCAAACTCCTCTATTTGTGTGATCAGTCCTAATCACGGCAGTGCTCCTTCTTTTATCTCTGCCAGTCTTAGCAG [...]
+ACTATATTACTTACAGATCGAAATCTCAACACTACCTTTTTTGACCCAGCTGGAGGGGGAGACCCCATTCTATACCAACACTTGTTCTGATTCTTCGGACACCCTGAAGTTTATATCCTAATTCTTCCTGGGTTTGGAATGATCTCTCACATTGTTACCTATTACTCAGGAAAAAAAGAACCCTTTGGCTATATAGGAATAGTTTGAGCGATGATATCCATCGGATTCTTAGGATTTATCGTGTGAGCTCACCATATGTTTACCGTAGGTATAGACGTCGACACACGAGCTTACTTCACTTCAGCCACCATAATTATTGCAATCCCAACAGGAGTCAAAGTATTTAGCTGACTAGCCACCCTGCACGGAGGGAATATTAAATGATCTCCCGCTATAATATGAGCCCTGGGCTTTATCTTCCTGTTTACGGTGGGAGGCCTTACAGGAATTGTCCTAGCTAATTCATCCCTAGATATTGTTCTCCACGACACA [...]
+GGTAGCCCATTTTCACTATGTACTATCAATGGGAGCTGTCTTTGCCATTATAGGCGGATTTGTTCATTGATTCCCACTGTTTTCAGGCTACACACTTAATAACACATGAGCAAAGATTCACTTTACAATTATGTTCGTCGGGGTCAATATAACATTCTTCCCCCAGCACTTCCTAGGCCTGTCAGGAATGCCTCGGCGATATTCCGACTATCCAGATGCCTATACAACATGAAATACAGTATCTTCTATAGGCTCATTCATTTCACTAACAGCAGTTATGCTAATAATTTTCATGATTTGGGAGGCCTTTGCGTCAAAACGGGAGGTGGCAGTGGCAGAACTCACTTCAACCAACATTGAATGACTACATGGATGTCCCCCTCCATATCATACATTCGAAGAACCTGCCTACGTTATACTAAAAATGGCGTACCCCTTTCAAATGGGCCTTCAAGATGCAACTTCTCCCATCATAGAGGAACTCCTGCATTT [...]
+ATACATTAATAATTGTGTTCCTAATTAGCTCCTTGGTTCTCTATATTATTTCAATCATACTAACTACCAAATTAACACACACAAGCACAATGGACGCACAAGAAGTAGAGACGGTGTGAACCGTCCTACCAGCTGTTATTCTAATTCTGATTGCACTCCCATCGCTACGAATTCTCTATATAATGGATGAAATCAACAACCCCTCATTGACTGTAAAAACCATGGGTCATCAATGATATTGAAGCTATGAGTACACAGATTATGAAGATCTAAACTTTGACTCTTATATGACTCCGACACAAGAACTAAAGCCCGGGGAACTGCGGTTATTAGAAGTGGACAATCGAGTAGTGCTGCCCATAGAAGTAACGATCCGTATGCTGATTTCGTCAGAAGACGTCCTGCACTCGTGAGCTGTGCCATCCCTAGGGTTAAAAACTGATGCAATCCCAGGGCGGCTAAACCAAACAACTCTCATAGCCATGCGACCAG [...]
+TACGGCCAATGCTCAGAAATTTGTGGCTCCAATCACAGCTTTATACCCATTGTCCTTGAGCTAGTCCCACTGTCTTACTTTGAAAAATGATCCGCCTCAATACTAATGACCCACCAAACACATGCATACCACATAGTTAACCCAAGCCCGTGACCACTAACAGGAGCCCTCTCAGCCCTTCTTATAACATCGGGACTAACTATATGATTCCACTTTAACTCTATATTCTTGCTACTGCTAGGCCTTACAACCAACATGCTTACTATGTACCAATGATGGCGGGATGTTATTCGAGAGAGCACCTTTCAAGGGCATCATACCCCCGTTGTCCAAAAGGGGCTGCGGTGTGGGATAGTCCTATTTATCGTATCAGAAGTATTCTTCTTCGCAGGATTCTTCTGAGCTTTTTACCACTCAAGCCTAGCTCCCACCCCCCAACTAGGAGCATGCTGACCACCCACAGGGATTACCCCCCTAAACCCACTAAAAGTA [...]
+CAACACTTCAGTGCTTCTTGCATCCGGAGTGTCCATTACCTGGGCTCACCACAGCTTAATAGAGGGAAGCCGCAAACACATGCTTCAGGCCCTATTTATTACCATCTCCCTAGGTGTGTACTTCACACTCCTACAAGCCTCAGAGTACTATGAAGCATCTTTCACCATCTCAGACGGAGTCTATGGCTCAACTTTTTTCATAGCGACCGGATTCCACGGACTCCATGTAATTATTGGCTCAACTTTTCTCACAGTTTGTTTCCTACGGCAACTACACTTTCACTTCACATCGAATCACCACTTCGGCTTTGAAGCAGCAGCATGATATTGACACTTCGTAGACGTCGTGTGACTGTTCCTATATGTTTCTATCTATTGATGAGGGTCTTGCATGACCAACATCCGAAAAACCCACCCATTAGCTAAAATCATTAACAACTCACTCATTGACCTCCCAGCACCGTCAAACATCTCAGCATGATGAAACTTCGG [...]
+TCGGAGTGTGCTTAATTCTACAAATTCTAACAGGCCTATTTCTAGCCATGCACTATACATCAGACACAACCACAGCCTTTTCATCAGTCACCCATATCTGTCGAGACGTCCACTACGGATGAATCATCCGATATATACATGCAAACGGGGCCTCCATATTCTTTATCTGCCTATTCATGCACGTAGGACGGGGTCTGTACTATGGCTCATACCTATTCTCGGAGACATGAAACACCGGCATTATTCTCCTATTTACAGTCATAGCCACCGCATTCATAGGATACGTCCTACCCTGAGGCCAAATGTCCTTCTGAGGAGCAACTGTCATCACCAATCTGCTATCGGCCATTCCCTATATTGGAGCGGACCTAGTAGAATGAATCTGAGGGGGGTTTTCCGTAGACAAGGCGACTCTAACACGATTCTTTGCCTTCCACTTTATCTTTCCATTTATCATCCTAGCACTGGTAATAGTCCACCTATTGTTCCTAC [...]
+GGATCTAACAACCCCTCTGGAATCCCATCCAACTCAGACAAAATCCCATTTCACCCATATTATACAATTAAAGATATTATAGGCGCCTTACTTCTCATCCTAGCCCTGGCAACCCTAGTCCTATTCTCACCCGACTTACTAGGAGACCCCGACAACTACACCCCTGCAAACCCACTGAGCACCCCACCCCACATCAAACCCGAGTGGTACTTTCTATTTGCCTACGCTATCCTACGATCCATCCCCAATAAACTAGGAGGGGTACTAGCACTAATTTTCTCCATCCTAATCCTAGCTATCATTCCCCTTCTACACACATCCAAACAACGAGGAATGATATTCCGGCCCCTAAGCCAATGCCTATTTTGACTCCTAGTAGCAGACCTACTAACACTTACATGAATCGGAGGACAACCAGTAGAATATCCCTTCATCACTATTGGACAACTAGCCTCCATCCTCTACTTCATAATCCTCCTAGTACTCATGCCC [...]
+AATCATTGAAAATAATCTCTCAAAGTGAATGTTTATAATTAATATTATCTCACTAGTCGTACCCATCCTCCTCGCCGTAGCCTTCTTAACACTAGTAGAGCGGAAGGTATTGGGCTATATACAACTCCGTAAAGGACCAAACATTGTAGGACCCTATGGTCTCCTACAACCTGTCGCAGATGCTATAAAACTTTTCACCAAAGAGCCCCTACGCCCACTCACATCATCCGCGACTATATTCATTATAGCCCCTATTCTGGCCCTAACACTAGCCCTAACTATATGAATTCCCCTACCAATACCATACCCCCTTGCCAATATAAACCTCGGAGTATTGTTTATGCTGGCAATATCAAGCCTGGCCGTATACTCTATCCTTTGATCAGGATGAGCCTCAAACTCAAAATACGCCCTGATCGGAGCTCTACGAGCTGTAGCCCAGACAATTTCATACGAAGTCACATTAGCCATTATTCTCCTGTCAGTCCTACT [...]
+GCTCATTCGCACTCCCTGCTCTAATACCTACCCAAGAACACCTCTGACTAATTTTCCCTGCATGACCACTAGCCATAATATGATTTATCTCCACTCTAGCAGAAACTAACCGAGCCCCTTTTGACCTAACAGAAGGAGAATCAGAACTAGTCTCAGGTTTCAACGTCGAATATGCAGCAGGTCCATTCGCCCTATTCTTCCTAGCAGAATACACCAGCATTATTATAATAAATGCCCTTACGACTATCCTGTTTTTCGGAGCATTTCATAACCCCTGCATACCAGAACTATACACTGTTAACTTCACCGTAAAAACACTACTCCTAACAGCCTCTTTCCTATGGATTCGTGCATCATACCCTCGATTCCGATACGACCAACTAATGCACCTACTATGAAAAAACTTCCTGCCCCTTACACTGGCCTTGTGCATGTGACACGTAACACTACCCATTATCACAGCAAGCATCCCCCCTCAAATAATAAAACCTC [...]
+ATCATTATTATATCCACCGTTATTCTAGGAACCATAATCGTCTTATTTAGCTCCCATTGACTTATAATCTGAATTGGCTTTGAAATAAACATACTAGCTATTATCCCAATCCTAATGAAAAAATTTAATCCGCGAGCCACAGAGGCCTCCACAAAATATTTTCTCACACAGGCTACCGCATCCATGCTCCTAATACTAGGCATTATCATCAATTTACTATACTCAGGACACTGAACAGTCTCAACAATCTCCAACCCAGTCGCATCAACCGTAATCACTATTGCCCTAGCAATAAAACTCGGCCTGTCCCCCTTCCATTTCTGAGTCCCAGAAGTCGCACAAGGTATTTCTTTATCCTCAGGAGTAATTCTTCTAACATGACAAAAAATCGCACCTCTATCCGTCCTATATCAAATCTCACCATCCATTAATCCAAATCTACTAGTAACAATAGCTGCCACATCCGTATTAGTAGGAGGCTGAGGAGGACTA [...]
+TCAACTCCGAAAGATCCTAGCATACTCTTCAATCGCTCACATGGGCTGAATAGCCGCCATTATAGTATATAATCCCACTCTAATAATCCTTAATCTTGCAATTTATATCATAATAACCCTAGGGACATTTATACTATTTATACACAACTTATCTACAACAACACTATCACTATCCCACACATGAAACAAATCACCACTAATTGCCTCACTAATCCTAGCACTTATACTATCGCTAGGCGGTCTCCCTCCCCTCTCAGGCTTTATCCCCAAATGAATAATTATTCAAGAGCTGACAAAAAATGATATAATTGTCATACCTACATTCATAGCCATTACAGCCCTACTAAATCTTTACTTCTACGTGCGCCTAACATACGCTACAGCACTAACAATGTTTCCCTCAGCAAACAATATAAAAATAAAATGACAATTTGAAAGCACAAAAAAGATAATTCTCCTGCCTCCCCTAATCGTAGCATCAACCATACTCCT [...]
+CTCCAATACTATCGATCATGGACATCAACTTAATCTTAGCACTGCTTACCAATATACTACTAGCCTCCTTGCTCACTCTTATTGCCTTCTGGCTACCACAATTGAATATTTACGCAGAGAAAGTAAGCCCCTATGAGTGTGGATTCGACCCCGTAGGATCAGCACGCCTCCCTTTTTCCATAAAATTCTTCCTAGTAGCTACTACATTTCTACTATTTGACCTGGAAATTGCACTACTTCTTCCCCTTCCCTGAGCATCACAAACTGACAACCTAATAACGATACTTACCATAGCGCTACTGCTTATTTCCTTACTAGCTGCAAGCCTAGCTTATGAATGAACCGAAAAAGGCCTAGAGTGGGCCGAGATGCCCGCAGTCTATGTCAATATTTTCTTAGCCTTCATCGTATCTCTAACAGGACTACTCGTTTATCGATCCCATCTAATGTCGTCCCTACTTTGCCTAGAGGGTATAATGCTCTCTTTATTTA [...]
+GCAGTAACAGTCTTAAATAATCACTTTACACTGGCTAACATAGCTCCGATTATCCTACTAGTATTCGCTGCCTGTGAAGCAGCACTAGGACTGTCCCTGCTGGTAATAGTCTCCAATACTTACGGAACTGATTACGTACAAAACCTCAACCTCTTACAATGCATTATCCTCCCCACTATAATGTTAATACCTCTCACATGAGCATCAAAACCCAATATAATTTGGATTAATGCAACGGCCTACAGCCTACTTATTAGTCTCATCAGCTTGACATATCTCAACCAGCTCAGTGATAATAGCCTGAACTTCTCGTTACTGTTCTTTACCGACTCCCTATCAGCCCCCTTGTTGGCCCTTACAACATGACTATTGCCTCTAATATTAATAGCGAGCCAATTCCACTTGTCAAAGGAGACTCTGACTCGAAAAAAACTATACATCACTATACTAATCCTCCTACAACTACTCCTGATCATGACCTTTTCCGCTATA [...]
+CCTATTTTATATCTTGTTCGAAGCCACCCTGGTACCTACCCTAATCATTATTACTCGATGAGGGAATCAGACAGAACGATTAAATGCGGGCCTTTACTTTCTATTTTATACTCTAGTGGGATCTTTACCTTTACTAGTTGCACTACTACACACCCAAAATAACCTAGGCTCCCTAAATTTTCTCATAATACAATACTGAACCCAGCCTCTGCCAAACTCTTGATCCAGCATCTTCCTGTGACTGGCATGTATAATGGCATTCATAGTAAAAATACCCCTATACGGCCTTCACTTGTGACTACCAAAAGCACACGTAGAAGCCCCCATCGCAGGATCTATAGTGCTTGCCGCCGTACTCCTAAAACTAGGAGGCTACGGCATGATACGAATTACAACGCTACTTGGTCCTTTAACGAGCTCCATGGCTTACCCCTTTATAATACTCTCGCTATGAGGCATGGTTATAACAAGTTCTATTTGTCTACGCCAAAC [...]
+AGTCCCTAATTGCCTACTCCTCTGTTAGTCACATAGCCCTAGTCATTGTAGCAGTATTAATCCAAACCCCATGAAGCTACATAGGAGCAACAGCCCTAATAATTGCTCACGGACTAACATCCTCCATACTATTCTGTCTTGCAAACTCCAACTATGAACGAATCCATAGTCGAACTATAATCCTTGCGCGAGGTCTACAAACACTTCTCCCACTTATGGCAGCTTGATGACTACTAGCAAGTCTCACTAATCTAGCACTCCCCCCGACCATCAACCTCATAGGAGAATTGTTTGTAGTAGTAGCCACATTCTCATGATCTAACATCACCATCACTCTAATAGGGACCAATATCATTATTACTGCCCTCTATTCCCTCTACATACTAATCACCACACAACGAGGCAAGTACACAGACCATGTCAAAAGCATCAAGCCATCCTTCACACGAGAAAACGCCCTGATAGCTCTCCACCTCCTACCCCTACTGCTAC [...]
+AACCCCAAAATAATTCTAGGACCCATTTACTGTAAAGTAAAAGTAATTAATCTATTTACCTCCTCTATTATCACAACCTTGCTCATACTAACGATACCAATTATCCTCACCAGCACTTCAACATACAAAAATAAATTCTATCCGCAGTATGTAAAAACCACCGTTTCCTATGCTTTTATAGTCAGCACCATTCCCATAACAATATTCCTCTATTCAGGACAGGAAATAATTATCTCAAACTGACATTGAATAACCATTCAAACCCTAAAACTAACTTTAAACTTTAAATTAGACTACTTCTCGATAATTTTCATACCGGTAGCCCTATTCGTCACATGATCAATCATGGAGTTTTCTATTTGATATATACGCACTGATCCTAACATCAACCGATTCTTCAAATACCTACTTATATTTCTTATTACTATAATAATTTTGGTAACCGCAAACAATCTATTCCAACTATTCATTGGCTGAGAAGGAGTAGGGATC [...]
+CCTCCTCATTGGATGATGATATGGACGAACAGACGCCAATACAGCCGCCCTACAAGCAGTCCTATACAATCGCATCGGAGACGTAGGCTTTATTATAGCCATAGCCTGATTTTTACTCAATACAAATGCATGAGACTTCCAACAAATCTTTGCAGTCGAACATAAAAATCTTAATATCCCACTGGCAGGACTACTGCTAGCAGCCACCGGAAAATCGGCCCAATTCGGCCTTCATCCGTGACTCCCATCAGCTATAGAAGGACCTACTCCTGTTTCAGCCCTACTCCACTCTAGTACAATAGTAGTAGCAGGAGTATTTCTTCTAGTCCGATTCCACCCCTTGATGGAGCACAACAAGATCATCCAAACAGCTACTTTATGCTTAGGAGCAATAACAACTCTATTCACAGCAGCTTGCGCTCTCACCCAGAATGATATCAAAAAAATTATTGCCTTCTCCACCTCAAGTCAACTGGGACTAATAATCGTAAC [...]
+TCAACCAGCCTCACTTAGCATTTCTTCATATTTGCATACACGCATTCTTCAAAGCCATGCTGTTTATATGCTCCGGGTCTATTATCCACAGCCTAAATGACGAACAAGACATCCGAAAAATAGGAGGCCTATTCAAAACTCTACCACTTACCGCTACCGCACTAATTATCGGAACCCTAGCACTTACAGGTATGCCTTTCTTAACAGGATTCTACTCTAAAGACCTAATTATCGAAACCGCTAACACGTCGTATACCAACGCCTGAGCCCTACTAACAACCCTCGTTGCCACATCTATAACCGCTGCCTACAGTACTCGAATCGTGTTCTTCACACTCCTAGGACAACCCCGCTCTAACCCTATCATTATCATCAACGAGAACAATCCTCTCCTAATCAACTCCATCAAACGTCTTCTTCTAGGAAGCATTTTCGCAGGCTATCTAATCTCCCACAATATTACACCCACCACCATCCCACAAATAACCATGC [...]
+CTAAAAATAACAGCCCTCGCAGTCACCATGCTAGGCTTTATTCTAGCACTAGAACTTAACTCCACCATACAAAGCCTCAAATTCAACTATCCACAAAACCCATTCAAATTCTCCAACCAACTAGGGTATTTCCCCATTATCACCCACCGCCTCCTACCAATAATGAGCCTGTCAATAAGCCAGAAAATGGCATCCACATTACTAGATGCAATTTGACTAGAAAATGTATTACCAAAATCTATCTCCTACTTCCAAATAAAATCTTCGATTACAGTCTCCAACCAGAAAGGACTAATTAAATTATATTTCCTCTCTTTCATAATCACATTAGCCCTAAGCTTCCTCGTA??????CTTAATTTCCACGAG
+>Mephitis_mephitis
+ATGAACGAAAATCTATTCGCCTCTTTCACTACCCCTACAATAATTGGCCTACCAATTGTCATCATTATTGTACTATTCCCCAGTATCCTATTCCCCACATCTAATCGATTAATTAACAATCGTCTTATTTCAATTCAACAGTGATTGGTACAACTTACATCAAAACAAATACTGTCAATCCATAACAATAAAGGGCAGACCTGGGCCTTAATATTAATATCTCTCATTTTATTTATTGGCTCAACTAACCTACTAGGCTTATTACCACACTCATTCACTCCTACCACGCAGCTATCTATAAACCTAGGAATAGCCATCCCCTTATGGGCTGGTACAGTCGTGACTGGCTTTCGATACAAAACAAAATCATCCTTAGCCCACTTCCTACCCCAAGGGACACCTATTCCTCTGATCCCTATACTTGTTATTATCGAAACTATTAGCCTATTCATTCAACCCATAGCCCTGGCCGTACGACTAACAGCCAATATC [...]
+ACATCTATTAATTCACTTAATCGGAGGGGCCACTTTAGCCCTAATAAATATCAGCACCGCTACAGCCCTAATCACATTCACTATCCTCATCCTCCTAACGATCCTAGAATTTGCAGTAGCCTTAATCCAAGCCTACGTATTTACCCTTCTAGTAAGCCTATATCTACATGATAACACCTAAATGCCACAACTGGATACCTCGACTTGATTTATTACAATTGTATCTATAATCATTACATTATTTATTGTATTTCAACTTAAAATCTCAAAACATAACTTTCCTAAAGATCCAGAGTCCAAGTATACTAAATCTCTAACTATTACTACTCCTTGAGAAAAAAAATGAACGAAAATCTATTCGCCTCTTTCACTACCCCTACAAATGTTCATAAATCGGTGATTATTTTCTACTAATCACAAAGACATCGGCACTCTTTATCTTTTATTCGGGGCATGGGCTGGAATAGCAGGAACTGCCCTTAGCTTATTAAT [...]
+AGCTGGGGCAACCCGGAGCCCTACTAGGTGATGACCAAATTTATAATGTAGTTGTAACAGCTCATGCATTTGTTATAATTTTTTTTATAGTAATACCTATTATAATCGGTGGGTTTGGGAACTGATTAGTTCCTTTAATAATTGGAGCCCCAGATATAGCATTCCCACGAATAAATAACATAAGCTTCTGACTATTACCCCCATCCTTTCTGTTACTATTAGCTTCCTCCATGGTAGAAGCAGGAGCAGGAACCGGGTGAACGGTGTATCCCCCATTAGCAGGAAACCTAGCCCACGCAGGAGCATCTGTAGATTTGACAATCTTCTCTCTTCACTTAGCAGGGGTATCATCCATTTTAGGAGCTATTAACTTTATTACTACAATCATTAATATAAAACCTCCTGCAATATCACAATATCAGACCCCTCTGTTCGTATGATCTGTTCTAATTACAGCGGTTCTACTTCTCCTATCATTACCAGTACTAGCAG [...]
+ACTATGCTACTAACAGATCGAAATCTTAATACAACCTTTTTTGATCCAGCTGGAGGAGGAGACCCTATTTTGTATCAACATCTGTTCTGATTCTTTGGACACCCAGAAGTCTATATCTTAATCTTGCCAGGATTTGGAATAATTTCACACATTGTAACCTACTACTCAGGTAAAAAAGAACCTTTTGGGTATATAGGAATAGTGTGAGCAATAATATCTATTGGCTTCTTAGGCTTTATTGTATGAGCACATCACATATTTACAGTAGGCATAGATGTAGATACGCGAGCTTATTTTACCTCTGCCACCATGATTATTGCGATCCCAACTGGAGTGAAAGTATTCAGTTGACTAGCTACACTGCATGGAGGTAATATCAAATGGTCACCCGCTATACTGTGAGCACTAGGGTTCATTTTCTTATTTACTGTAGGGGGCCTTACAGGAATTGTACTATCTAATTCTTCACTGGATATTGTACTCCACGACACA [...]
+AGTAGCCCATTTCCACTATGTATTATCAATGGGAGCAGTATTTGCCATTATAGGCGGTTTTGTTCACTGATTCCCTTTATTCTCAGGCTATACACTCAATGACACATGAGCAAAAATTCACTTTACAATTATATTTGTAGGAGTAAACATAACATTTTTCCCTCAACACTTCCTAGGTCTATCAGGAATACCTCGACGTTACTCAGATTATCCTGACGCCTACACAACATGAAACACAGTATCCTCTATAGGCTCATTCATCTCACTCACAGCAGTTATATTAATAGTCTTCATGATTTGAGAAGCCTTTGCATCCAAACGAGAGGTGCTAACAATTAGCTATACTTCAACCAACATTGAATGGTTACATGGATGCCCTCCTCCATATCACACATTCGAAGAACCCGCCTATGTATTATTAAAAATGGCTTACCCATTTCAAATAGGACTCCAAGATGCAACATCTCCTATTATAGAAGAACTCTTACACTT [...]
+ATACTCTTATAATTGTTTTCCTAATCAGTTCACTAGTCTTATACATTATCTCACTAATATTAACCACCAAGCTCACCCATACTAATACAATAGATGCCCAAGAGGTTGAAACAGTGTGAACAATTCTTCCAGCTATTATTCTAATTTTAATCGCTCTACCATCCTTACGAATCCTCTATATGATAGATGAAATTAACAGTCCTTCATTAACAGTAAAGACTATAGGTCATCAATGATACTGAAGTTATGAGTATACAGACTATGAAGATTTAAATTTTGATTCTTACATAATCCCAACCCAAGAATTAAAACCCGGAGAACTGCGATTGCTAGAAGTAGATAATCGAGTAGTTCTCCCAATAGAAATAACAATTCGCATGCTTATCTCATCTGAAGATGTATTACATTCATGAGCTGTTCCATCCTTAGGGTTAAAAACTGATGCTATTCCTGGGCGCCTAAATCAAACAACATTAATAGCCATACGACCAG [...]
+TATGGCCAATGCTCAGAAATCTGCGGATCCAATCATAGCTTTATACCAATCGTTCTTGAATTAGTTCCATTGTCCCATTTTGAAAAATGATCTATATCAATACTAATGACCCACCAAACCCATGCCTACCACATAGTCAACCCAAGTCCATGGCCACTAACAGGGGCCCTGTCCGCCTTATTAATAACATCTGGTCTGATCATATGATTTCACTTTAACTCTGTACATTTATTACTGTTAGGACTTACAACCAACATACTGACTATATACCAATGATGGCGGGACGTGATTCGAGAAAGTACATTTCAAGGTCACCATACTCCTGTTGTCCAAAAAGGATTACGATACGGAATAATCCTATTTATCTTGTCAGAAGTATTATTTTTTGCAGGGTTCTTCTGAGCCTTCTACCACTCAAGCCTTGCACCAACACCAGAACTAGGGGGATGTTGACCACCCACAGGTATTATACCACTCAACCCCCTGGAAGTA [...]
+TAATACCTCCGTATTACTGGCTTCAGGAGTATCCATTACCTGAGCACACCATAGCCTAATAGAAGGAAACCGCAAACATATGCTCCAAGCCCTACTAATTACCATCTCTCTAGGACTATATTTTACAGCACTACAAGCCTCAGAATACTATGAAACATCATTTACAATTTCTGACGGCATCTACGGATCTACTTTCTTTATAGCTACAGGGTTCCACGGGTTACATGTAATTATTGGCTCGACTTTCCTAATCATCTGCTTCCTTCGACAACTAAATTTCCACTTCACATCTAGTCACCATTTCGGGTTCGAAGCAGCTGCTTGATACTGACATTTCGTAGATGTAGTATGACTATTCCTATATGTATCCATTTATTGATGAGGATCTTATATGACCAACATTCGAAAGACGCACCCACTAGCAAAAATCATCAACGACTCATTTATTGATTTACCTACTCCAGCCAATATTTCAACATGATGAAACTTCGG [...]
+TCGGAATTTGCTTGATTCTACAGATTGCAACAGGTTTATTCCTAGCCATACACTACACATCAGATACAACTACAGCCTTTTCCTCAGTCACCCATATTTGTCGAGATGTAAATTACGGCTGAATCATCCGATATTTACATGCTAATGGAGCCTCCATATTCTTTATCTGCCTATATCTACATGTAGGACGAGGATTGTACTATGGTTCTTATATATTCTTAGAAACCTGAAACATTGGCATTCTCCTACTTTTTACAGTAATAGCAACAGCATTCATAGGTTATGTATTACCATGAGGACAAATATCATTTTGAGGAGCAACTGTAATCACAAATCTATTATCAGCCATCCCCTATATCGGCACTAGTCTTGTAGAATGAATCTGAGGCGGATTCTCAGTAGACAAGGCAACTCTTACTCGATTCTTTGCTTTTCATTTTATCCTACCATTCATTATTTCAGCCTTAGCAGTAGTTCACTTACTATTCCTAC [...]
+GGATCTAATAATCCATCTGGAATAGTATCAGACACAGACAAAATCCCATTTCACCCCTACTATACAATCAAAGATATTCTAGGGGTATTACTCCTTATTTTAATACTTCTAACCTTAGTCCTATTTTTACCTGACATACTAGGAGATCCAGACAACTATACTCCAGCCAATCCACTGAACACCCCACCCCATATTAAACCAGAGTGATACTTCTTATTTGCCTATGCTATTTTACGATCCATCCCAAACAAACTAGGAGGAGTATTAGCCCTAATCTTATCAATCCTCATCTTAGCCATCATTCCACTCCTAAACACATCAAAACAACGAAGCATAATATTCCGACCCCTTAGCCAATTCCTATTCTGACTGCTTGTAGCAGACTTACTTACTCTTACCTGAATTGGAGGCCAACCAGTAGAACACCCATATATTATTATTGGCCAACTAGCCTCAATATTATATTTCACCATCCTCTTGATTCTAATACCT [...]
+TATTATTGAAAATAATATATTAAAATGAATGTTTATTATTAACATTACTTCTATAATTGTACCAATCCTTCTAGCAGTGGCCTTTCTAACCCTAGTAGAACGTAAAATTCTAGGCTATATACAACTTCGAAAAGGACCTAACATTGTAGGACCCTATGGCCTACTTCAACCAATTGCAGACGCCGTAAAATTATTCACTAAAGAGCCACTACGCCCACTTACATCCTCCTTATCCATATTTATTTTAGCCCCAATCCTAGCCCTAACTTTAGCCTTAACTATATGAATCCCCCTTCCTATGCCCTACCCACTAATCAACATAAACCTAAGTATTCTTTTTATACTAGCTATATCTAGCCTCGCTGTCTATTCAATTCTATGATCAGGATGATCCTCAAATTCAAAATACGCCCTAATTGGAGCCCTACGAGCCGTAGCTCAAACAATCTCATATGAAGTAACACTAGCCATCATCCTACTAGCAATCCTACT [...]
+GTTCATTCACCTTATCCACACTAATCATTACACAAGAACACCTATGACTAATTTTCCCCGCATGGCCACTAGCCATAATATGATTTATCTCAACTCTAGCAGAAACCAACCGAGCACCATTTGACTTAACAGAAGGTGAATCAGAACTAGTATCAGGGTTTAACGTAGAATACGCGGCCGGTCCATTCGCACTATTCTTTCTGGCAGAATATGCTAACATCATTATAATAAACATTCTCACAGTCATCCTATTCTTCGGCGCATTTCACAACCCATATATACCAGAACTATATACAGTTAACTTCACTACTAAAACACTACTTCTAACCATATCCTTTTTATGAATCCGAGCATCATACCCACGATTCCGCTATGACCAACTAATACACTTATTATGAAAAAACTTCCTTCCCCTAACACTAGCTATATGTATATGACATGTAACACTCCCCATTATTACAGCAAGCATCCCACCACAAACAATAAAACCCC [...]
+ATTATTATCCTATCAACAATCATCATAGGAACCATAATAGTAATAATAAGTTCTCACTGACTACTCATCTGAATTGGGTTCGAGATAAATATACTAGCAATTATCCCTATCCTTATAAAAAACTCCAATCCTCGAGCTACAGAAGCATCAACAAAATATTTTTTAACACAAGCAACTGCATCTATGCTGCTTTTACTGGGCATTGCCACAAATCTATTGCTAACAGGACACTGAACAATATCAAACATTCTAAACCCAATTGCATCTAATACAATTACCATTGCCCTGACAATAAAACTTGGACTTTCTCCATTCCATTTCTGAGTACCCGAAGTAACTCAAGGAGTCCCTATGCTATCAGGAATAGTCTTATTAACCTGACAAAAAATTGCACCACTATCAATCTTATACCAAATCGCACCATCTACTAATCCCAACCTACTCATCATTATAGCCATCACATCAGTATTGGTAGGAGGATGAGGAGGACTT [...]
+CCAACTGCGAAAAATCCTAGCATATTCATCCATTTCCCACATAGGATGAATAACAGCCGTATTAGTATATAACCCAACTATAACAATACTCAATCTACTAATATACATCACAATAACATTAGGAACTTTTATACTATTTATACACAATTCTTCTACCACTACACTATCCCTGTCCCATATGTGAAACAAATTACCCCTAGCCACTTCACTAGTATTACTTCTCATACTATCAATCGGAGGTCTACCACCCCTCTCAGGATTTATACCCAAATGAATAATTATTCAAGAACTCACAAAAAACGACCTAATTATTCTACCAACATTTCTAGCTATAACAGCCCTATTAAACTTATACTTCTACACACGACTCACATACAGCACTGCACTTACCATATTTCCCTCACCAAATAATATAAAGATAAAATGACTATTCGAAAACTCAAAAACAATAACACTGCTACCACCCCTAATCATCCTATCAACAATACTTTT [...]
+CCCCAATAATATCAACTCTATTTATTAATATCATCACAACACTGCTTATCAACATTACTCTACCCTCCCTACTTATAATTATCGCATTCTGACTACCACAACTAAATATTTATACAGAAAAAGCTAACCCTTATGAATGTGGCTTTGACCCAACAGGATCAGCACGACTACCATTTTCCATAAAATTCTTTCTAGTAGCAATTACATTTTTATTATTTGACCTAGAAATTGCACTTTTATTGCCTCTACCTTGAGCAACACAATCAATAAATTTAGACACAGTACTTACAATATCACTAATATTAATCTTACTCCTAGCTGCAAGCCTAGCATATGAGTGAACCGAAAAAGGCCTAGAATGAACTGAAGTGTCAATAGTATATATCAATCTTTTTTTAGCCTTTATTATGTCACTTATAGGTCTATTGGTATATCGATCCCACCTTATATCTTCTTTATTATGCCTAGAAGGTATGATACTATCCTTATTCA [...]
+TCAATCACTATTCTAAGTAATCATTTCACATTAGCTAGCATAGCTCCTATCATCCTACTAGTCTTTGCAGCCTGTGAAGCAGCGCTAGGCCTTTCATTATTAGTAATAGTATCAAACACATACGGAACTGACTATGTACAAAACCTAAATCTACTACAATGTATTATTCTCCCCACTATAATACTGATCCCCCTTACATGACTATCAAAGCCTAACATAATATGAATTAACTCTACCTTATATAGCCTATTAATCAGCTTGATCAGCCTAATCTATTTAAACCAACCCGGTGATAACAATCTCAATTCCTCACTATTATCTTTTACTGATCCCCTTTCAGCCCCTCTACTAACACTCACAACATGACTCTTGCCTTTAATATTAATAGCTAGCCAATTCCACTTATCAAAAGAAACTACTACTCGAAAAAAACTGTACATTACTATATTAACTCTGCTTCAACTGTTCTTAATTATAACATTTACCGGCACA [...]
+CATATTTTATATCTTATTTGAAGCCACCCTAATTCCTACCCTAATTATTATCACCCGATGAGGTAATCAAGCTGAACGGCTCAATGCAGGCTCATACTTCCTATTTTACACCCTAGCTGGATCACTACCACTCCTAGTAGCCCTACTATATACCCAGAATAATTTAAATTCACTAAACTTCATAATAGCACAACTATTATCCGAACCAATATCAAACTCTTGATCAAATGTTTTTTTATGGCTAGCATGTATAATAGCATTTATAGTTAAAATACCCCTATATGGTCTCCACCTATGACTTCCAAAAGCCCACGTAGAAGCCCCAATCGCTGGGTCCATAGTACTGGCCGCAGTACTTTTAAAACTAGGAGGCTATGGAATAATACGAATTACAATCTTTCTTAACCCTTTAACTAATTTTATAGCCTATCCTTTCATAATATTATCCTTATGAGGCATAATTATAACAAGCTCTATTTGCTTACGTCAAAC [...]
+AATCCCTAATCGCATACTCCTCAGTTAGTCATATAGCACTAGTAATCGTAGCAGTATTAATCCAAACGCCATGAAGCTTCGCAGGAGCAACAGCTTTAATAATCGCCCATGGCTTAACATCATCAATACTATTTTGCTTAGCTAATTCTAATTATGAACGAGCCCATAGTCGAACCATAATCCTCATTCGAGGACTACAAACTCTCTTACCACTTATAGCTGCCTGATGGCTTTTAGCCAGTCTGGCTAACCTAGCACTCCCTCCTACTATTAACTTGATTGGAGAACTATTCGTAGTAATAGCTTCATTTTCCTGATCTAACACCACTATCATACTAATAGGGACCAACATCATCCTTACTGCTTTATATTCACTATATATATTAATCATAACTCAACGTGGAAAATATACTCACCATATCAAAAATATTAAACCATCATTTACACGAGAAAACACCCTAATAGCAATACACCTCCTACCACTAATACTCT [...]
+AACCCAAAAATTATTATAGGCACAATTTACT?????ATAAAAGTAATTAATCTATTTGCCTCTTCTACTATAATAACCCTACTTATATTAACACTGCCAGTATTACTAACTAGCACTAACTTATATAAAAACAAACAATATCCAGAATATGTAAAAATAACTATTTCATATGCCTTCATAATCAGCATAATCCCAATAATAATATTCATATACTCAGGACAAGAAGCAATTATCTCCAACTGACACTGAATAACTATCCAAACTATAAAATTATCATTAAGCTTTAAGCTAGATTATTTCTCAATAATTTTCATACCAGTAGCCTTATTCGTTACATGATCAATTATAGAATTCTCAATATGATATATACACTCAGATCCCTACATCAACCGCTTCTTTAAATATTTACTAATATTCTTAATTACTATAATTATCTTAGTAACAGCCAATAATATATTCCAACTATTCATTGGATGAGAAGGGGTCGGTATT [...]
+TCTCCTAATTGGATGGTGATACGGACGAACAGATGCAAATACAGCTGCCCTACAGGCAATTTTATATAACCGAATCGGAGATGTAGGCTTCATCATAACCATAGCTTGATTTTTACTAAACCTAAACACATGAGACTTACAACAAATTTTTATGGCTAATCACAATAATCTAAACATACCACTCACAGGCCTCCTATTAGCAGCCACAGGCAAATCTGCTCAATTCAGCCTTCACCCATGACTTCCTTCAGCCATAGAAGGGCCCACACCAGTATCAGCCGTACTTCATTCTAGTACCATAGTAGTAGCAGGAGTATTCCTCCTTATTCGATTTCACCCCTTAATAGAACACAACAAGACTATACAAACCATTACTTTATGTTTAGGAGCACTAACCACCCTATTTACAGCTATGTGCGCTCTTACACAAAATGATATTAAAAAAATTATCGCTTTTTCCACTTCAAGTCAATTAGGACTCATAATTGTAAC [...]
+TCAACCAACCCTACCTCGCATTCTTCCATATCTGCACCCATGCATTCTTTAAAGCAATATTATTTATATGCTCAGGCTCCATCATCCACAACTTAAATGATGAACAAGATATCCGAAAGATAGGAGGGCTATTCAAACTAATACCCTTTACTGCCACCTCCCTTATTATTGGGAGTCTAGCCCTCACTGGGATGCCCTTCCTTGCAGGATTCTACTCCAAAGACCTGATTATCGAAACTGCCAACACATCGTATATCAACGCCTGAGCCCTATTAATAACCCTCGTTGCCACATCCATAACAGCCGCCTACAGCACCCGAATTATATTCTTTGCATTACTAGGACAACCCCGCTCTTACCCAATCATTACAATCAATGAGAACAATCCCCTCTTAATAAATTCTATTAAACGTCTATTACTAGGAAGCATTTTTGCAGGATTCCTAATTACCCACAACATTACTCCCACCTCCACACCACAAATAACTATGC [...]
+CTTAAAATAACAGCTCTTGCAGTAACCATTATCGGTTTTACCCTGGCACTCGAACTAAACCTCACAGCACAGAACTTAAAACTCAAATACCCTTCAAATCTTTTTAAATTTTCCAACATATTAGGATATTTTCCCATTATTATTCATCGACTCATTCCAATAACAAACCTAACTACAAGCCAAAAATCAGCATTTATATTAATGGACACAACATGACTAGAAAATATATTACCAAAATCTATCTCTAGCTTTCAGATAAAATCTTCCATCCTAACCTCCAACCAAAAAGGAATAATCAAACTATATTTTCTATCTTTCATTATCACCCTAGGAATAAGCGTAATAGTA??????CTTAGTTTCCACGAG
+>Mirounga_angustirostris
+ATGAACGAAAATCTATTCACCTCTTTCGCTACCCCTACAATAATAGGCCTCCCCATCGTAATCTTAATCATCTTATTCCCAAGTATTTTATTCCCCTCTCCTGATCGACTAATCAACAACCGCCTTATCTCAATTCAACAATGACTAATTCAACTAACATCAAAACAAATACTATCAATTCACAACCATAAAGGGCAAACATGAGCACTAATACTTATATCACTCATCCTATTTATTGGATCTACCAATCTACTAGGCCTTCTACCACATTCATTTACCCCTACCGCTCAACTATCTATAAACCTAGGCATAGCTATCCCCCTATGAGCAGGAACAGTCATTACAGGATTCCGATATAAAATAAAAATATCCCTAGCCCATTTTCTACCTCAAGGAACACCCCCACCCCTCATTCCAATATTAGTGATTATTGAAACTATTAGCCTATTTATTCAACCCATAGCCCTGGCTGTACGACTAACAGCCAATATT [...]
+TCACCTACTAATTCACCTAATTGGAGGAGCTACTCTCGTTCTTACAAATATTAGCACTGCTACAGCCTCAATCACTTTTATTATCCTTATTCTGCTTACTATCCTAGAATTTGCCGTAGCTCTTATCCAAGCCTACGTTTTCACACTACTAGTTAGTTTATATTTACATGATAACACCTAAATGCCACAATTAGATACATCAACCTGATTCATTGTAATTCTATCCATGATTTTAACCCTATTCATTATATTCCAACTGAAAATCTCCAAACATCACTTCCCAATGAATCCAGAACTAAAACAAACATCACTACTAAAAAGTAATGCACCTTGAGAAGAAAAATGAACGAAAATCTATTCACCTCTTTCGCTACCCCTACAAATGTTCATAAATCGATGACTATTCTCTACAAATCATAAAGACATCGGCACCCTCTACCTATTATTCGGTGCATGAGCCGGCATAGTAGGCACCGCCCTCAGTCTTTTAAT [...]
+AACTAGGGCAGCCTGGCGCTTTACTAGGAGACGATCAGATCTATAACGTGATTGTCACCGCTCACGCATTCGTAATAATCTTTTTTATAGTAATACCTATCATGATCGGAGGTTTCGGAAACTGATTAGTACCTCTAATGATTGGTGCCCCTGACATAGCATTTCCCCGAATAAATAATATAAGCTTCTGACTCCTACCACCATCTTTCCTATTACTATTAGCCTCCTCCATAGTAGAAGCAGGTGCAGGAACAGGATGAACCGTCTATCCCCCTCTAGCCGGTAACCTAGCCCATGCAGGAGCATCTGTAGACCTAACAATTTTCTCTCTTCACTTAGCAGGTGTATCATCTATCCTTGGAGCCATCAACTTTATTACCACTATTATTAACATAAAACCTCCCGCAATGTCTCAATATCAAATTCCCTTATTCGTATGATCCGTACTAATTACAGCAGTACTTCTGCTATTATCACTACCAGTTCTAGCAG [...]
+ACTATACTACTTACAGACCGAAATCTTAATACAACATTCTTTGACCCTGCTGGGGGAGGTGACCCTATTCTATATCAACATCTATTTTGATTCTTTGGACACCCCGAAGTATATATCCTAATTCTTCCAGGATTTGGAATAATTTCACACATTGTCACCTTCTACTCAGGAAAAAAAGAACCCTTCGGCTATATAGGAATAGTCTGAGCAATAATATCCATTGGTTTTCTAGGCTTCATTGTATGAGCTCATCATATATTTACCGTAGGAATAGACGTTGACACACGAGCCTACTTCACTTCAGCCACTATAATTATTGCAATTCCAACAGGAGTAAAAGTCTTCAGCTGACTGGCTACTCTGCACGGAGGTAATATTAAATGATCTCCAGCCATACTATGAGCTCTAGGATTTATTTTCCTATTCACAGTTGGGGGTCTTACGGGCATCGTACTAGCAAATTCGTCACTGGACATCGTACTCCACGATACA [...]
+AGTAGCGCACTTCCACTACGTATTATCAATAGGAGCAGTCTTCGCCATTATGGGCGGATTTGTACACTGATTCCCCTTATTCTCAGGCTTCACTCTCGATGACACCTGAGCAAAAATTCACTTCACAATTATATTTGTTGGAGTTAACATAACATTTTTCCCTCAACATTTCCTAGGCCTATCAGGAATACCTCGACGATATTCCGACTATCCAGACGCCTATACAACATGAAACACAGTCTCTTCTATAGGTTCATTCATCTCACTTACAGCAGTAATATTAATAATTTTCATGATTTGAGAAGCCTTCGCATCCAAACGAGAAGTAGCAACAGTTGAATTAACTACAACAAACATAGAGTGACTACACGGATGCCCTCCTCCCTATCATACATTCGAAGAACCTACTTACGTTGTATTAAAAATGGCGTACCCTTTCCAAATAGGTTTACAAGACGCAACTTCTCCTATTATAGAAGAATTATTACACTT [...]
+ACACGCTGATAATTGTATTTTTAATTAGCTCACTAGTACTTTACATTATTTCACTTATACTGACCACAAAACTAACCCACACAAATACAATAGACGCACAAGAAGTAGAAACAGTATGAACAATCCTACCAGCTATTATCCTCATCCTAATTGCTTTACCCTCATTACGAATCCTTTACATAATAGATGAAATTAACAACCCTTCCTTAACCGTAAAAACCATAGGACATCAATGATACTGAAGCTACGAATATACAGATTACGAAGACCTAAATTTCGACTCATACATAATTCCTACACAAGACCTAAAACCCGGAGAACTACGACTACTAGAAGTAGACAATCGAGTAGTTCTCCCAATGGAAATAACAATTCGCATACTAATCTCATCAGAAGACGTACTTCACTCATGAGCTGTACCATCCCTAGGACTAAAAACCGACGCCATCCCAGGACGACTAAACCAAACAACCCTAATGTCCACACGACCAG [...]
+TACGGTCAGTGCTCAGAAATCTGTGGTTCTAATCACAGCTTTATACCTATTGTCCTCGAACTAGTCCCACTGTCCCACTTTGAAAAGTGATCCACTTCAATACTTATGACCCATCAAACCCATGCATATCACATAGTTAACCCTAGTCCATGACCACTAACAGGAGCTCTTTCGGCCCTCCTTATGACATCCGGCCTAATTATATGATTCCATTTCAATTCAATATACTTACTTCTGCTAGGCCTCACAACTAACACCCTAACTATATATCAATGATGACGAGACATTATCCGAGAAAGCACATTTCAAGGTCATCACACCCCAATTGTCCAAAAAGGCTTACGATATGGCATAATTCTTTTTATTGTATCAGAAGTATTCTTTTTCGCAGGCTTTTTCTGAGCCTTTTACCACTCCAGCTTAGCACCTACCCCTGAACTAGGAGGATGTTGACCACCTACAGGCATTATTCCCCTAAACCCCATAGAAGTT [...]
+AAATACCTCCGTACTCTTAGCCTCAGGAGTATCAATTACTTGAGCTCACCATAGCCTGATAGAAGGGAATCGCAAACACATACTCCAAGCACTGTTCATTACTATCTCCCTAGGCATCTATTTCACATTATTACAAGCCTCAGAGTACTACGAAACCCCTTTTACAATCTCCGATGGAGTATATGGCTCTACTTTCTTCATGGCAACAGGATTCCATGGGCTACACGTAATTATTGGCTCTACTTTCCTAATTGTATGCTTTATACGACAATTAAAATTTCACTTCACATCTAATCACCACTTTGGGTTTGAAGCCGCTGCTTGATACTGACATTTCGTAGACGTAGTGTGACTATTCCTATACGTGTCTATCTATTGATGAGGATCC???ATGGCCAACATTCGAAAGACACACCCACTAGCCAAAATCATCAACAACTCATTCATTGACCTACCTACACCACCAAATATCTCAGCATGATGAAACTTTGG [...]
+TCGGAATCTGCTTAATCCTACAAATCCTAACAGGCCTATTCCTAGCCATACATTATACCTCAGACACAACCACAGCCTTTTCATCAGTCACACACATCTGCCGAGACGTAAATTACGGTTGAATCATCCGATATATACACGCAAACGGAGCCTCTATATTCTTCATCTGCCTATATATACACATAGGACGAGGACTATACTACGGCTCCTACACATTTACAGAAACATGAAACGTCGGCATTATCCTCCTATTTACCATTATAGCCACAGCATTTATAGGTTACGTACTGCCATGAGGGCAAATATCATTTTGAGGAGCAACCGTCATTACCAACCTACTATCAGCAGTTCCCTATGTCGGAAACGACTTGGTTCAATGAATCTGAGGCGGATTCTCAGTTGACAAAGCAACCCTAACACGATTCTTCGCCCTCCACTTTATCCTACCATTCGTAGCACTAGCACTAGCAGCAGTACATCTACTATTCCTAC [...]
+GGATCCAACAACCCCTCTGGAATTCCATCCGATTCAGACAAAATCCCATTCCACCCATACTACACAATCAAAGATATCTTAGGAGCCCTACTTCTTATTCTTACCCTAATACTATTAGTGTTATTCTCACCCGACTTACTAGGAGACCCCGACAACTACATCCCCGCCAACCCCCTAAGCACCCCACCACATATTAAACCCGAATGATACTTCCTATTTGCCTACGCAATCCTACGATCTATTCCTAACAAACTAGGAGGAGTCCTAGCCCTAATTCTCTCCATCCTAATTCTCGCCATTATCCCCCTACTTCACACATCAAGTCAACGAGGAATAATATTTCGACCTATTAGTCAATGCTTATTTTGACTTCTAGTAGCAGACCTACTTACATTAACATGAATTGGAGGACAACCAGTTGAACACCCCTATATCATCATTGGCCAACTAGCCTCAATTCTGTACTTCATAATCCTACTAGTACTAATACCC [...]
+CATTATCGAAAATCACATTCTAAAATGAATGTTTATAATCAATATCGCATCATTAGTTATTCCAATCCTACTTGCCGTAGCCTTCCTGACACTAGTAGAACGAAAAGTACTAGGCTATATACAACTCCGAAAAGGACCCAACATTGTAGGACCCTACGGACTTCTACAACCTATCGCAGATGCTGTAAAACTATTCACCAAAGAACCCTTACGACCACTAACATCCTCCACATCCATATTCATTATAGCCCCAATTCTAGCCCTAACCCTAGCCCTAACCATATGAATCCCCCTACCCATACCATACCCCCTCATTAACATAAACTTAGGAGTACTATTCATACTAGCAATATCAAGCCTAGCCGTCTATTCAATTCTATGATCAGGATGAGCCTCAAACTCAAAATACGCCCTAATCGGAGCCCTACGAGCTGTAGCCCAAACAATCTCATACGAAGTAACCCTAGCCATCATCTTACTATCAGTCCTATT [...]
+GATCATTTACCCTATCAACACTAATCACTACCCAAGAACATCTATGACTAATTTTCCCTGCATGACCCTTAGCCATAATATGATTTATCTCCACTCTAGCAGAAACTAACCGCGCTCCATTCGACCTGACAGAAGGAGAATCAGAACTTGTCTCAGGATTCAATGTAGAATACGCAGCAGGCCCATTCGCTATATTCTTCCTAGCAGAATACGCTAACATCATTATAATAAACATCTTCACAACTCTCCTATTCTTTGGAGCATTCCACACCCCCCTTATACCCGAACTCCACACCATCAATTTCACCATAAAAACTCTAATACTAACAATCCTATTTCTATGAATTCGAGCATCATATCCACGATTCCGATACGACCAACTGATACATCTTCTATGAAAAAACTTCCTACCCCTTACATTAGCCCTATGCATGTGACACGTCACACTACCCATTATCTCAGCAAGCATTCCTCCTCAAACAATAAAACCCT [...]
+ATCGCTATCATAACAACTGTCATATCAGGAACTATAATTGTTCTTACAAGCTCCCACTGATTATTAACTTGAATCGGCTTCGAAATAAACATACTAGCAATCATCCCAATCTTAATAAAAACCCATAATCCACGAACCACAGAAGCATCCACAAAATACTTTCTAACACAAGCTACCGCATCAATACTTCTAATAATAGGAATTATCATCAATTTAATATTTTCAGGACAATGAACAATCTCAAAAATTCCAAATCCAATCGCATCAGGCCTAATAACCATTGCTCTAGCAATAAAACTAGGCATAGCCCCCTTTCACTTTTGAGTACCCGAAGTAACACAAGGAATCCCATTATCCTCAGGCATAATCTTACTCACATGACAAAAAATCGCACCCCTATCCGTCCTCTACCAAATCTCATCATCCATCAACCCTAAACTAATAATCTCCATAGCAATTGTATCAGTGCTAGTCGGAGGCTGAGGAGGACTC [...]
+CCAACTCCGAAAAATCCTAGCTTACTCGTCAATTACCCACATAGGATGAATAGCCATTATCCTAATATATAACCCCACCCTCATACTCCTAAACCTTACAATCTACATCATAATAACTCTAAGCACATTCACACTACTTATTCACAACTCATCTACAACAATAGCATCGCTATCACAAACATGAAACAAACTACCACTTACAACATCACTAATCCTAATACTAATACTATCACTAGGAGGCCTCCCCCCACTATCAGGCTTCATACCCAAATGAATAATTATTCAAGAACTAACAAAAAATGATATAATCATCCTGCCAACATTCATGGCCATCACAGCACTTCTAAATCTATATTTCTACATACGACTATCCTACACCACAACACTAACCATATTCCCCTCAGCAAATAACATAAAAATAAAATGACAATTCGAAAGTACAAAAAAAATCATTCTCCTGCCACCATTAATTATTACTTCGACCATACTACT [...]
+CCCCAATAATATCAATCCTAGAAATAAACATAGTACTAGCCCTATTCACCAATACAATCCTAGCCTCTCTACTCGTTCTAATTGCATTTTGACTCCCCCAACTAAACATTTACTCAGAAAAAGTTAGCCCTTATGAATGCGGATTTGACCCCATAGGATCAGCACGCCTACCCTTCTCCATAAAATTTTTCTTAGTAGCCATCACATTCCTACTATTTGATCTAGAAATCGCCCTACTCTTACCACTTCCATGAGCATCACATACGGACAACCTTACTACCATACTTACCATAGCACTACTACTTATCTCCCTCTTAGCCGCAAGCCTAGCTTACGAATGAACTGAAAAAGGGCTAGAATGAGCAGAAATGACCATAGTATATGCCAATATCTTCTTGGCCTTTATTATATCTCTCATAGGACTGCTCATATACCGGTCTCACCTAATATCCTCCCTACTTTGCCTAGAAGGCATAATATTATCACTATTTG [...]
+ACAGTAACAATCTTAAATAACCATTTCACACTAGCCAGTATAACCCCCATCATCCTACTCGTCTTCGCTGCCTGTGAAGCAGCCCTAGGATTATCACTTCTAGTAATAGTATCCAACACATACGGAACTGACTACGTACAAAATCTAAACCTCCTACAATGCATCATCCTTCCCACTATAATACTTATACCTCTGACATGAATATCAAAACCCAATATAATCTGGATTAACACAACAACCTACAGCCTATTAATTAGCCTAATCAGCTTATCTTTCCTAAATCAACTTAACGACAACTGCATAAACCTATCCCTACTATTCTTCACAGACTCCCTATCCGCTCCACTACTAGCACTTACAACATGACTCCTACCCCTAATACTCATAGCTAGCCAACTCCACCTATCAAAAGAGCCACTAACCCGAAAAAAACTATATATTACTATACTAATCTCACTACAATTATTTCTAATTATAACATTTACCGCCACA [...]
+TATATTCTATATCTTATTTGAAGCGACCCTAGTACCTACCTTGATCATTATTACCCGATGAGGAAACCAAACAGAACGCCTAAATGCAGGAATATACTTCCTATTCTACACCTTAGTAGGATCCCTACCTCTACTGGTAGCCTTACTATTTATTCAAAACAACATAGGTACATTAAATTTCTTAATACTCCAGCTCTTAACCCAACCCATACTAAACTCCTGATCAAATACCCTCCTATGACTAGCATGCATTATAGCATTTATAGTTAAAATACCCCTGTACGGACTCCACCTATGACTACCCAAAGCACACGTAGAAGCACCTATCGCCGGATCAATAGTGCTTGCTGCAGTACTTCTAAAATTAGGAGGCTACGGAATAATACGAATCACAATAATACTCAACCCATTAACTAACTCTATAGCATACCCCTTCATAATTCTATCACTATGAGGCATAATCATAACAAGCTCTATCTGCTTACGCCAAAC [...]
+AATCTCTAATTGCATACTCCTCCGTTAGCCACATAGCCCTAGTTATCATAGCAATCCTTATTCAAACCCCATGAAGTTATATAGGAGCAACAGCCCTAATAATCGCTCACGGCCTAACATCATCTATACTCTTTTGCTTGGCTAACTCCAACTACGAGCGCACCCATAGCCGAACCATAATCCTCGCACGCGGACTTCAAGTACTCCTACCTTTAATAGCAGCATGATGACTACTAGCAAGCCTTACCAACTTAGCCCTTCCCCCCACCATTAACTTAATCGGAGAATTATTCGTAGTAATAGCCTCATTTTCATGATCCAACATCACTATTATTATAACAGGAACCAATATCATCATCACCGCCCTATATTCATTATATATATTAACTACTACACAACGTGGAAAATACACCCATCATGTCAAAAACATTAAGCCTTCATTCACACGAGAAAATGCCTTAATGGCACTCCACCTAATTCCCTTACTTCTAC [...]
+AACCCCAAAATCATTTTAGGACCCATTTACT?????ATAAAAGTAATTAACCTATTCACCTCCTCCATTATCACATCATTATCTATATTAACACTTCCAATTATCCTAACTAGCACCTCAATCTACAAAAATAAACTTTACCCACAATATGTAAAAACCACTATCTCATACGCCTTTATAATTAGCATAATCCCCACAACAATATTTATCTACTCAGGAAAAGAAATAATTATCTCAAACTGACACTGAATAACTATTCAAACCATAAAACTCACGCTAAGTTTCAAATTTGACTACTTTTCCATAATCTTCATACCCGTAGCCCTCTTTGTCACCTGATCCATCATAGAATTCTCAATATGATATATACACTCAGACCCTTTCATCAACCGATTCTTTAAATATCTACTAATATTTCTCATTACTATAATAATTCTAGTTACCGCAAATAATCTATTCCAACTATTCATTGGCTGAGAAGGAGTAGGCATC [...]
+CCTTCTCATCGGATGATGACACGGACGAACCGATGCAAACACAGCCGCCCTACAAGCAGTCCTCTATAACCGTATCGGAGACGTAGGCTTTATTATAGCCATAGCATGATTCCTAATTAATCTAAACACATGAGAATTCCAGCAGATCTTTTCCATCCACCATGACAATCTAAACATACCACTTATAGGCCTTTTACTAGCAGCAACCGGAAAATCAGCCCAATTTGGACTCCACCCATGACTACCATCAGCCATAGAAGGCCCCACCCCAGTATCCGCTCTACTACACTCCAGCACTATAGTAGTAGCAGGGGTCTTCCTTCTAATCCGATTTCACCCACTAACAGAGCACAATACACTAGTACAAACAGCTACCCTATGTTTAGGAGCTATTACTACACTGTTTACAGCAATCTGTGCACTTACCCAGAACGACATCAAGAAAATCATCGCATTCTCAACCTCAAGTCAATTAGGGCTCATAATTGTTAC [...]
+TCAATCAACCATATTTAGCATTTCTACACATCTGTACCCACGCATTCTTTAAAGCTATACTATTTATATGCTCTGGATCTATTATCCATAATTTAAATGATGAACAAGACATCCGAAAAATAGGAGGATTATACAAAGCATTACCATTTACTACCACCTCACTAATTGTAGGGAGCCTAGCACTCACAGGAATGCCCTTTCTTACAGGATTTTACTCTAAAGACCTAATCATCGAAACCGCCAACATGTCGAATACCAACGCCTGAGCCCTACTACTAACCCTCATTGCTACATCTATAACAGCCGCCTACAGCACTCGAATTATATTCTATACACTCCTAGGACAACCTCGATTTAACCCTATAATCACAACCAACGAAAACAACCCACTCCTAATAAACTCCATCAAACGCCTATTACTAGGAAGTATCTTCGCAGGATACCTAATCTCCCATAATATCACACCCACTACTATCCCACAAACAACCATAC [...]
+CTAAAATTAACAGCCCTTACCGTGACACTCCTAGGATTCATCTTAGCATTAGAACTGAACCTAACCTCACAAAATCTCAATCTCAAACATCCATCAACCCTATTTAAATTTTCCAATCTCCTTGGATACTTCCCCACCATTATTCACCGCTACATACCAGAAATAAACCTCTCAGCGAGCCAAAAACTAGCCTCAACATTACTAGACTCAATTTGACTAGAAAATGCACTACCCAAATCCATTTCTTACTTCCACATAAAAACATCAATTACCATTTCTAACCAAAAAGGCTTAATCAAATTATATTTCCTCTCCTTCGTAATTACCCTAATCCTAGCCCTAACAATA??????ATTAATTTCCCCGAG
+>Mirounga_leonina
+ATGAACGAAAATCTATTCACCTCTTTCGCTACCCCTACAATAATAGGCCTCCCCATCGTAATCTTAGTCATCTTATTCCCAAGTATTCTATTTCCCTCTCCCGATCGACTAATTAATAACCGCCTTACCTCAATTCAACAATGACTAATTCAACTAACATCAAAACAAATACTATCAATTCACAACCATAAAGGGCAAACATGAGCACTAATACTTATATCACTCATCCTATTTATTGGATCTACCAATCTATTAGGCCTTCTACCACATTCATTTACCCCTACCACTCAACTATCTATAAACCTAGGCATAGCCATCCCCTTATGAGCGGGAACAGTCATTACAGGGTTTCGATATAAGATAAAAATATCCTTAGCCCATTTTCTACCTCAAGGAACACCCTTACTCCTCATTCCAATATTAGTGATTATTGAAACTATTAGCCTATTTATTCAACCCATAGCCCTGGCCGTACGACTAACAGCCAATATT [...]
+TCACCTACTAATTCACCTAATTGGAGGAGCTACTCTTGTTCTTATAAGTATTAGCACTGCTACAGCCTCAATCACTTTTATTATCCTTATTCTACTCACTATCCTAGAATTTGCCGTAGCCCTTATCCAAGCCTATGTTTTCACACTACTAGTTAGTTTATATTTACATGATAACACCTAAATGCCACAATTAGATACATCAACCTGATTCACTGTAATTCTCTCCATGATCTTAACCCTATTCATTATATTTCAACTGAAAATCTCCAAACATCACTTCCCAATGAATCCAGAACTAAAACAAACATCACTACTAAAAAGTAATGCACCTTGAGAAGAAAAATGAACGAAAATCTATTCACCTCTTTCGCTACCCCTACAAATGTTCGTAAATCGATGACTATTCTCTACAAATCATAAAGACATCGGCACTCTCTACCTATTATTTGGTGCATGAGCCGGCATAGTAGGCACCGCCCTCAGTCTTTTAAT [...]
+AACTAGGGCAGCCTGGCGCTTTACTAGGAGACGATCAGATCTATAACGTGATTGTCACCGCTCACGCATTCGTAATAATCTTTTTTATAGTAATACCTATCATGATCGGAGGTTTCGGAAACTGGTTAGTACCTCTAATGATTGGTGCCCCTGACATAGCATTTCCCCGAATAAATAATATAAGCTTCTGACTTCTACCACCATCCTTCCTATTACTATTAGCTTCCTCCATAGTAGAAGCAGGTGCAGGAACAGGATGAACCGTCTATCCCCCTCTAGCTGGTAACCTAGCCCATGCAGGAGCATCTGTAGACCTAACAATTTTCTCTCTTCACTTGGCAGGTGTATCATCCATCCTTGGAGCCATCAACTTTATTACCACTATTATTAACATAAAACCCCCTGCAATATCTCAATATCAAATTCCCTTATTCGTATGATCCGTACTAATTACAGCAGTACTTCTGCTATTATCACTACCAGTTCTAGCAG [...]
+ACTATACTACTTACAGACCGAAATCTAAATACAACATTCTTTGATCCTGCTGGAGGAGGTGACCCTATTCTATATCAACATCTATTCTGATTCTTTGGACACCCCGAAGTATATATTCTAATTCTTCCAGGATTTGGAATAATCTCACACATCGTCACCTACTACTCAGGAAAAAAAGAACCCTTCGGCTATATAGGAATAGTCTGAGCAATAATATCCATTGGTTTCCTAGGCTTCATTGTATGAGCTCATCATATATTTACCGTAGGAATAGATGTTGACACACGAGCTTATTTCACTTCAGCCACTATAATTATTGCAATTCCAACAGGAGTAAAAGTCTTCAGCTGACTGGCTACTCTGCACGGAGGCAATATCAAATGATCTCCAGCCATACTATGAGCTCTAGGATTTATTTTCCTATTCACAGTTGGAGGTCTTACGGGCATCGTACTAGCAAATTCGTCACTGGACATCGTGCTCCATGATACA [...]
+AGTAGCGCACTTCCACTACGTACTATCAATAGGAGCAGTCTTCGCCATTATGGGCGGATTTGTACACTGATTCCCCTTATTCTCAGGCTTCACTCTCGATGACACCTGAGCAAAAATTCACTTTACAATTATATTTGTTGGAGTTAACATAACATTTTTCCCTCAACATTTCTTAGGTCTATCAGGAATACCTCGACGATATTCCGACTATCCAGACGCCTATACAACATGAAACACAGTCTCTTCTATAGGTTCATTTATCTCACTTACAGCAGTAATATTAATAGTCTTCATGATTTGAGAAGCCTTCGCATCAAAACGAGAAGTAGCAACAGTTGAATTAACCACAACAAACATAGAGTGACTACACGGATGCCCTCCTCCCTACCATACATTCGAAGAACCTACTTACGTTGTATTAAAAATGGCGTACCCTTTCCAAATAGGTTTACAAGACGCAACTTCTCCTATTATAGAAGAATTACTATACTT [...]
+ACACGCTAATAATTGTATTTTTAATTAGCTCACTAGTACTCTACATTATCTCACTTATATTGACCACAAAACTAACCCACACAAATACAATAGACGCACAAGAAGTAGAAACAGTATGAACGATCCTACCAGCTATTATCCTTATCCTAATTGCTTTACCCTCACTACGAATCCTTTACATAATAGATGAAATTAACAACCCTTCCTTAACCGTAAAAACTATAGGACATCAATGATATTGAAGCTATGAATACACAGATTACGAAGATCTAAATTTTGACTCATACATAATTCCTACACAAGACCTAAAACCCGGAGAACTACGACTACTAGAAGTAGACAACCGAGTAGTTCTTCCAATAGAAATAACAATTCGCATGCTAATCTCATCAGAAGACGTACTTCACTCATGAGCTGTACCATCCCTGGGACTAAAAACCGACGCCATCCCAGGACGACTAAACCAAACAACCCTAATATCCACACGACCAG [...]
+TACGGTCAGTGTTCAGAAATCTGTGGTTCTAATCATAGCTTTATACCTATTGTCCTCGAACTGGTTCCATTGTCCTACTTTGAAAAGTGATCCGCTTCAATACTTATGACTCACCAAACCCATGCATATCACATAGTTAACCCTAGTCCATGACCACTAACAGGAGCTCTTTCGGCCCTCCTTATGACATCCGGCCTAATTATATGATTCCATTTCAATTCAATATACTTACTTCTGCTAGGCCTCACAACTAACACCCTAACCATATATCAATGATGACGAGACATTATCCGAGAAAGCACATTCCAAGGTCATCACACCCCAATTGTCCAAAAAGGCTTACGATATGGCATAATTCTTTTTATTGTATCAGAAGTATTCTTTTTCGCAGGCTTTTTCTGAGCCTTTTACCACTCCAGCTTAGCACCTACCCCTGAACTAGGAGGATGTTGACCACCTACAGGCATTATTCCCCTAAACCCAATAGAAGTT [...]
+AAATACTTCCGTACTCTTAGCCTCAGGAGTATCAATTACTTGAGCCCACCATAGCCTAATAGAAGGAAATCGCAAACATATGCTCCAAGCACTGTTTATTACTATCTCCCTAGGCGTTTATTTCACATTATTACAAGCCTCAGAGTACTACGAAACCCCTTTTACAATCTCCGATGGAGTGTATGGCTCTACTTTCTTCATGGCAACAGGATTCCACGGACTGCACGTAATTATTGGCTCTACTTTCCTAATTGTATGCTTTATACGACAATTAAAATTTCACTTCACATCTAATCACCACTTTGGATTTGAAGCCGCTGCTTGATACTGACATTTCGTAGACGTAGTGTGACTCTTCCTATATGTATCTATCTATTGATGAGGATCCTACATGACCAACATTCGAAAGACACACCCACTAGCCAAAATCATCAACAACTCATTTATTGACCTACCCACACCACCAAATATCTCAGCATGATGAAACTTCGG [...]
+TCGGAATCTGCTTGATCCTACAGATCCTAACAGGCCTATTCTTAGCTATACATTACACCTCAGACACAACCACAGCCTTTTCATCAGTCACACACATCTGCCGAGATGTAAATTATGGTTGAATCATCCGATACATACACGCAAATGGAGCCTCCATATTCTTCATCTGCCTATACATACACATAGGACGAGGACTATACTACGGCTCCTACACATTTACAGAAACATGAAACATCGGCATTATCCTCCTATTCACCATTATAGCCACAGCATTTATAGGTTACGTACTGCCATGAGGACAAATATCATTTTGAGGAGCAACCGTCATTACCAACCTACTATCAGCAGTCCCCTATGTCGGAGACGACCTAGTACAATGAATCTGAGGCGGATTTTCAATCGACAAAGCAACCCTAACACGATTCTTCGCCCTCCACTTTATCCTACCATTCGTAGCACTAGCACTAGCAGCAGTACATCTACTATTCCTAC [...]
+GGATCCAACAACCCCTCTGGAATCCCATCCAACTCAGACATAATCCCATTCCACCCATACTACACAATCAAAGATATCTTAGGAGCCCTACTTCTTATTCTAACCCTAATACTATTAGTGTTATTCTCACCCGACTTATTAGGAGACCCCGACAACTACACCCCTGCCAACCCCCTAAGCACCCCACCACATATTAAACCCGAATGATATTTCCTATTTGCCTACGCAATCCTACGATCTATTCCCAACAAACTAGGAGGAGTTCTAGCCCTAATTCTCTCCATCCTAATTCTTGCCATTATCCCTCTACTTCACACATCGAGTCAACGAGGAATAATATTTCGACCTATCAGCCAATGCTTATTTTGACTTCTAGTAGCAGACCTACTTACATTAACATGAATTGGAGGACAACCAGTTGAACACCCCTATATCATCATTGGCCAACTAGCCTCAATTCTGTACTTCACAATCCTACTAGTACTAATACCC [...]
+CATTATCGAAAATAACATCCTAAAATGAATGTTCATAATCAATATCGCATCATTAATTATTCCAATCCTACTTGCCGTAGCCTTCCTAACACTAGTAGAACGAAAAGTACTAGGCTACATACAACTCCGAAAAGGACCCAACATCGTAGGACCCTACGGACTCCTACAACCTATCGCAGACGCTGTAAAACTATTCACCAAAGAACCCTTACGACCACTAACATCCTCCACATCCATATTCATTATAGCCCCAATTTTAGCCCTAACCCTAGCCCTAACCATATGAGTCCCCCTACCCATACCATACCCCCTTATTAACATAAACCTAGGAGTACTATTTATGCTAGCAATATCAAGCCTAGCCGTCTATTCAATCCTATGATCAGGATGAGCCTCAGGCTCAGGATACGCCCTAATCGGAGCCCTACGAGCTGTAGCCCAAACAATCTCATACGAAGTAACCCTAGCCATCATCCTACTATCAGTCCTATT [...]
+GATCCTTCACTCTATCAACACTAATTACTACCCAAGAACATCTATGACTAATTTTCCCTGCATGACCCTTAGCCATAATATGATTTATCTCTACTCTAGCAGAAACCAACCGCGCCCCATTCGACCTGACAGAAGGAGAATCAGAACTTGTCTCAGGATTTAATGTAGAATACGCAGCAGGCCCATTCGCCATGTTCTTCCTAGCAGAATACGCTAACATCATTATAATAAACATCTTCACAACTCTCCTATTCTTTGGAGCATTCCACACCCCATTCATGCCCGAACTCTACACCATCAACTTCACCATGAAAACCCTAATACTAACAATTCTATTTCTATGAATTCGAGCATCATACCCACGATTCCGATACGACCAACTAATACATCTTCTATGAAAAAATTTCCTACCCCTCACACTAGCCCTATGCATGTGACACGTCACACTACCTATTATCTCAGCAAGCATTCCTCCTCAAACAATAAAACCCC [...]
+ATCGCTATCATAACAACTGTCATATCAGGAACTGTAATTGTTCTTACAAGCTCCCACTGACTATTAACTTGAATCGGCTTCGAAATAAACATACTAGCAATTATCCCAATCCTAATAAAAACCCATAACCCACGAGCCACAGAAGCATCCACAAAATACTTTCTAACACAAGCTACCGCATCAATACTCCTAATAATAGGAATTATCATTAATTTAATATTTTCAGGACAATGAACAATCTCAAAAATCCCAAACCCAATTGCATCAGGCCTAATAACCATTGCTCTAGCAATAAAGCTAGGTATAGCTCCCTTTCACTTCTGAGTACCCGAAGTAACACAAGGAGTCCCATTATCCTCAGGCATAATCTTACTTACATGACAAAAAATTGCACCCCTATCCGTCCTCTACCAAATCTCATCATCCATCAACCCTAAACTAATAATCTCCATAGCAATTGTATCAGTACTAGTTGGAGGCTGAGGAGGACTC [...]
+CCAACTCCGAAAAATCCTAGCTTACTCGTCAATTACCCATATAGGATGAATAGCCATTATCCTAACATATAACCCCACCCTCATACTCCTAAACCTTACAATCTACATCATAATGACTCTAAGCACATTCACGCTACTTATTCATAACTCATCTACAACAATATCATCACTATCACAATCATGAAACAAACTACCACTTACAACATCACTAATCTTAATACTAATACTATCATTAGGAGGCCTCCCCCCACTATCAGGCTTCATACCCAAGTGAATAATTATTCAAGAACTAACAAAAAATGACATAATCATCCTACCAACATTTATAGCTATCACAGCACTTCTAAATCTATATTTCTACATACGACTATCCTACACCACAACACTAACCATATTCCCCTCAGCAAACAACATAAAAATAAAATGACAATTCGAAAGTACAAAAAAAATCATCCTCCTACCACCATTAATTATTACCTCAACTATACTACT [...]
+CCCCAATAATATCAATCCTAGAAATAAACATAGTACTAGCCCTATTCACCAATACCATCCTAGCCTCCCTACTTGTACTAATTGCATTTTGACTCCCCCAACTAAATATTTACTCAGAAAAAGTTAGCCCTTACGAATGCGGATTTGACCCCATAGGATCAGCACGCCTACCCTTCTCCATAAAATTTTTCTTAGTAGCCATCACATTCCTACTATTCGATCTAGAAATCGCCCTACTCCTACCACTTCCATGAGCATCACATACGGATAACCTTACTACTATACTCACCATAGCACTACTACTTATCTCCCTCTTAGCCGCAAGCCTAGCCTACGAATGAACTGAAAAAGGGCTAGAATGGGCAGAAATGACTATAGTATATGCCAATATCTTCTTGGCCTTTATCATATCTCTCATAGGACTGCTCATATACCGGTCTCACCTAATATCCTCCCTACTCTGCCTAGAAGGTATAATACTATCATTATTTG [...]
+ACAGTAACAATCTTAAATAACCATTTCACATTAGCCAGTATAACCCCCATTATCCTACTCGTCTTCGCTGCCTGTGAAGCAGCCCTAGGATTATCACTTCTAGTAATAGTATCCAACACATACGGAACTGACTACGTACAAAATCTGAACCTCCTACAATGCATCATCCTCCCCACTATAATACTTATACCTCTGACATGAATGTCAAAACCTAATATAATCTGGATTAATACAACAACCTATAGCCTATTAATTAGCCTAATCAGCTTATCTTTCCTAAATCAACTTAACGACAACTGCATAAACCTATCCCTATTATTCTTCACAGACTCCCTATCCGCTCCACTACTAGCACTTACAACATGACTCCTACCCCTAATACTCATAGCCAGCCAATTCCACCTATCAAAAGAACCACTAACCCGAAAAAAACTGTATATTACTATACTAATCTTACTACAATTATTTCTAATTATAACATTCACCGCCACA [...]
+TATATTCTATATCTTATTTGAAGCGACCCTAGTACCTACCTTAATCATTATTACCCGATGAGGAAACCAAACAGAACGTCTAAACGCAGGAATATACTTCCTATTCTACACCTTAGTAGGATCCCTACCTCTACTAGTAGCCTTACTATTTATTCAAAACAACATAGGCACATTAAATTTCTTAATACTCCAGCTCTTAACCCAACCCATACTAAACTCCTGATCTAATACCCTCCTATGACTAGCATGCATAATAGCATTTATAGTTAAGATACCCCTATACGGACTCCACCTATGACTGCCCAAAGCACACGTAGAGGCACCCATCGCCGGATCAATAGTACTTGCTGCAGTACTTCTAAAATTAGGAGGCTATGGAATAATACGAATAACAATAATACTCAACCCATTAACTAACTCTATAGCATACCCCTTCATAATACTATCACTATGAGGTATAATCATAACAAGTTCTATCTGCTTACGCCAAAC [...]
+AATCTCTAATCGCATACTCCTCCGTCAGCCACATAGCCCTAGTTATCATAGCAATCCTTATCCAAACCCCATGAAGTTATATAGGAGCAACAGCCCTAATAATTGCTCACGGCTTAACATCATCTATACTCTTTTGCTTGGCTAACTCCAACTACGAGCGCACCCATAGCCGAACCATAATCCTCGCACGCGGACTTCAAATACTCCTACCCTTAATAGCAGCATGATGACTACTAGCAAGCCTCACCAACTTAGCTCTTCCCCCTACCATTAACCTAATCGGAGAATTATTCGTAGTAATAGCCTCATTTTCATGATCCAACATTACTATTATTCTAACAGGAACCAACATCATCATCACTGCCCTATATTCATTATATATATTAATCACTACACAACGTGGAAAATTCACCCATCATGTCAAAAACATTAAGCCTTCATTCACACGAGAAAATGCCTTAATGGCACTCCACCTAATTCCCCTACTTCTAC [...]
+AACCCCAAAATCATTTTAGGGCCCATTTACTGTAAAATAAAAGTAATTAACCTATTCACCTCCTCCATTATCACATCACTATCTATATTAACACTTCCAATTATCCTAACTAGCACTTCAATCTACAAAAATAAACTTTATCCACAATATGTAAAAACCACTATCTCATACGCCTTCATAATTAGCATAATCCCCACAATAATATTTATTTACTCAGGAAAAGAAATAATTATCTCAAACTGACACTGAATAACTATTCAAACCATAAAACTCACACTAAGCTTCAAATTTGACTACTTTTCCATAATCTTCATACCCGTAGCCCTCTTTGTCACCTGATCCATCATAGAATTCTCAATATGATATATGCACTCAGACCCTTTCATCAACCGATTCTTTAAATACCTACTAATATTCCTCATTACCATAATAATTCTGGTTACCGCAAACAACCTATTCCAACTATTCATTGGCTGAGAAGGAGTAGGCATC [...]
+CCTTCTCATCGGATGATGACACGGACGAACCGATGCAAACACAGCCGCCCTACAAGCAGTCCTCTATAACCGCATTGGAGACGTAGGCTTTATTATAGCCATAGCATGATTTCTAATTAACCTAAACACATGAGAACTTCAACAGATCTTTATCATCCACCATGACAATCTAAACATACCACTCATAGGCCTTTTACTAGCAGCAACCGGAAAATCAGCCCAATTTGGACTCCACCCATGACTACCATCAGCTATAGAAGGCCCCACCCCAGTATCTGCTTTACTACACTCCAGCACTATAGTAGTAGCAGGGGTCTTCCTTCTAATCCGATTTCACCCACTAACAGAACACAATACATTAATACAAACAGCTACCCTATGCCTAGGAGCTATTACTACACTGTTTACAGCAATCTGTGCACTCACCCAGAACGATATCAAGAAAATCATCGCATTCTCAACCTCAAGCCAATTAGGGCTCATAATTGTTAC [...]
+TCAACCAACCATACCTAGCATTCCTACACATCTGTACCCACGCATTCTTTAAAGCTATACTATTCATATGCTCTGGATCTATTATCCATAGCTTAAATGATGAACAAGACATCCGAAAAATAGGAGGATTATACAAAGCATTACCATTCACCACCACCTCACTAATTGTAGGGAGCCTAGCACTCACAGGAATACCTTTCCTCACAGGTTTCTACTCTAAAGACCTAATCATCGAAACCGCCAACATGTCGAATACCAACGCCTGAGCCCTACTATTAACCCTTATCGCCACATCTATGACAGCCGCCTACAGCACTCGAATTATATTCTTCACACTCCTAGGACAACCTCGATTCAATCCTATAATCACAACCAACGAAAACAACCCACTCCTAATAAACTCCATCAAACGTCTACTACTAGGAAGCATCTTCGCAGGATACCTAATCTCCCATAATATCACACCCACTACTATTCCACAAACAACCATAC [...]
+TTAAAATTAACAGCCCTTACCGTGACGCTCTTAGGATTTATCTTAGCATTAGAACTGAACCTTACCTCACAAAGTCTCAAACTCAAACATCCATCAACCCTATTTAAATTTTCCAATCTCCTTGGATACTTCCCTACCATTATCCATCGCTACATACCAGAAATAAACCTCTCAGCGAGCCAAAAACTAGCCTCAACATTACTAGACTCAATTTGACTAGAAAATGTACTACCTAAATCCATTTCTTACTTCCACATAAAAACATCAATTACCATTTCTAACCAAAAAGGCTTAATCAAATTATATTTTCTCTCCTTCGTAATTACCCTAATCCTAGCCCTAATAATA??????ATTAATTCCCCCGAG
+>Monachus_monachus
+ATGAACGAAAATTTATTCGCCTCTTTCACTATCCCTACAATAATTGGCCTCCCTATTGTAATCCTAATTATCCTATTCCCAAGCATCCTATTCCCTTCCCCCGACCGACTAATTAATAACCGTCTTACCTCAATCCAACAATGATTAATTCAACTAACATCAAAACAAATACTGTCAACTCACAACTACAAAGGACAAACATGAGCACTAATACTCACATCACTCATTCTATTTATTGGAACTACCAATCTTTTAGGCCTCCTACCACATTCATTCACCCCCACCACTCAATTATCTATAAATCTAGGAATAGCCATCCCTCTATGAGCAGGAACAGTCATTATAGGATTCCGATACAAAACAAAAGCATCTCTAGCTCACTTTCTACCCCAAGGAACACCCTCACTCCTTATTCCAATATTAGTAATTATTGAGACTATCAGTCTACTGATTCAACCCATAGCTCTGGCTGTACGACTAACAGCCAACATT [...]
+CCACCTACTAATTCATCTAATCGGAGGAGCTACTCTCGTCCTTATAGACATTAGCATTGCTACAGCTTCAATCACTTTTATTGTCCTCATACTACTTACCATCCTTGAATTTGCTGTAGCTCTCATCCAAGCTTATGTCTTTACACTACTAGTTAGTTTATATTTACATGACAACACCTAAATGCCACAATTAGATACATCAACCTGATTTATAGTAATTCTATCAATAATCCTAACTCTATTTATTATATTTCAACTGAAAATTTCCAAACACTATTTTCCAATAAACCCAGAACCAAAACAAACACTGCCTCTAAAAAGTAATACACCTTGAGAAGAAAAATGAACGAAAATTTATTCGCCTCTTTCACTATCCCTACAAATGTTCATAAATCGATGATTGTTTTCCACAAATCACAAAGATATTGGTACTCTCTATCTATTGTTTGGCGCATGAGCTGGTATAGTAGGTACCGCTCTCAGTCTTTTAAT [...]
+AACTAGGACAGCCTGGCGCTTTACTAGGAGATGATCAAATTTACAATGTAATCGTCACCGCTCATGCATTCGTAATAATCTTCTTCATGGTAATACCTATCATAATTGGAGGCTTCGGAAACTGGTTAGTGCCCTTAATAATTGGCGCTCCTGACATAGCATTTCCCCGGATAAATAATATGAGCTTCTGGCTCCTACCACCATCTTTTCTATTACTACTAGCTTCCTCCATAGTAGAAGCAGGCGCAGGAACAGGATGAACCGTTTATCCTCCCTTAGCCGGTAATCTAGCCCATGCAGGAGCATCCGTAGATCTAACAATCTTCTCTCTTCACCTGGCAGGTGTATCATCCATTCTTGGAGCTATTAATTTTATTACCACTATTATTAACATAAAACCTCCTGCAATATCTCAATATCAAATTCCCTTATTCGTATGATCTGTACTAATTACAGCAGTACTTCTACTACTATCATTACCAGTCCTAGCAG [...]
+ACTATACTACTAACAGATCGAAACTTAAACACAACATTCTTTGATCCTGCTGGAGGAGGTGATCCCATTCTATACCAACATCTATTTTGGTTCTTCGGACATCCTGAAGTATACATCCTAATTCTACCAGGATTTGGAATGATTTCACATATTGTCACTTACTACTCAGGTAAAAAAGAACCTTTTGGCTATATAGGAATAGTCTGAGCAATAATGTCTATTGGCTTCCTAGGCTTTATTGTATGAGCCCATCATATATTTACCGTAGGAATAGATGTTGACACACGAGCATATTTCACTTCAGCCACTATAATTATTGCAATTCCAACAGGAGTTAAAGTATTCAGTTGACTAGCTACCTTACATGGAGGTAACATTAAATGATCTCCAGCTATACTATGAGCACTAGGATTTATTTTCCTATTCACAGTAGGAGGCCTTACAGGTATCGTACTGGCAAACTCATCTCTAGATATCGTACTCCACGATACA [...]
+AGTAGCACATTTCCATTACGTCTTATCAATAGGAGCAGTTTTCGCTATTATGGGCGGATTTGTTCACTGATTTCCTCTATTTTCAGGCTTTACTCTCGACGACACCTGAGCAAAGATTCACTTTACAATTATATTCGTTGGAGTTAATATAACATTTTTCCCCCAACATTTCCTAGGTCTATCAGGAATACCTCGACGATACTCCGACTATCCAGACGCCTACACAACATGAAATACAGTCTCCTCTATAGGCTCATTTATTTCACTCACAGCGGTAATATTAATAGTATTCATAATCTGAGAAGCCTTCGCATCTAAACGAGAAGTAGCAACAGTTGAATTAACTACAACTAATATCGAGTGACTGCATGGATGTCCTCCTCCCTATCATACGTTTGAAGAACCTACTTACGTTGTACTAAAAATGGCGTATCCTCTCCAAATAGGCTTACAAGACGCAACCTCCCCTATCATAGAAGAACTATTACACTT [...]
+ACACATTAATAATCGTATTCTTAATTAGCTCACTAGTACTTTATATTATTTCACTTATATTAACCACGAAATTAACACACACAAGTACAATAGACGCACAAGAAGTAGAAACAGTATGAACAATTTTACCAGCTATTATCCTAATCCTAATTGCCTTGCCCTCATTACGAATCCTTTACATAATAGATGAAATCAACAACCCCTCCCTAACCGTGAAAACTATAGGACATCAGTGATACTGAAGCTATGAATATACAGACTACGAAGATCTAAACTTTGACTCATACATAATTCCTACACAAGAACTAAAGCCCGGAGAACTACGACTATTAGAAGTAGACAATCGAGTAGTTCTCCCAATAGAAATAACAATCCGCATATTAATTTCATCAGAAGACGTACTCCACTCATGAGCTGTACCATCTTTAGGACTAAAAACCGATGCAATCCCAGGACGACTAAATCAAACAACTTTAATAGTAATACGACCAG [...]
+TACGGTCAGTGCTCAGAAATCTGCGGTTCCAACCATAGCTTTATACCTATTGTTCTCGAACTAGTCCCATTATCCCATTTCGAAAAGTGATCCACCTCAATGCTTATGACCCACCAAACCCATGCATACCATATAGTTAATCCTAGTCCATGACCATTAACAGGAGCTCTCTCGGCTCTCCTTATAACATCCGGCCTAATTATGTGATTCCACTTCAACTCAATCTACCTACTTCTGTTAGGTCTCACAACCAATACTCTAACCATATATCAATGATGACGAGACATTATCCGAGAAAGCACATTCCAAGGCCACCACACTCCTATCGTCCAAAAGGGCTTACGATATGGCATAATCCTATTTATCGTATCAGAAGTATTCTTTTTCGCTGGCTTTTTTTGAGCCTTTTATCACTCTAGCCTAGCACCTACCCCTGAACTAGGAGGATGCTGACCACCTACAGGCATCATCCCCCTAAATCCTATAGAAGTT [...]
+AAATACCTCCGTGCTTTTAGCCTCAGGGGTATCAATCACCTGAGCTCATCACAGTTTAATAGAAGGAAATCGCAAACACATACTCCAAGCACTGTTTATTACTATCTCCCTAGGCATTTACTTTACACTATTACAAGCCTCAGAATACTATGAAACTCCTTTTACAATCTCCGATGGAATCTACGGCTCTACTTTTTTCATAGCAACAGGATTTCATGGGCTACACGTAATTATCGGCTCTACTTTCCTAATTGTGTGCTTTATACGACAATTAAAATTCCACTTTACATCTAGCCACCACTTCGGATTTGAAGCTGCTGCTTGGTACTGACATTTTGTAGACGTAGTGTGACTATTCCTATATGTATCTATCTATTGATGAGGATCCT??ATGACCAACATCCGAAAAACTCACCCACTAGCTAAAATCATCAACAATTCACTCATTGATCTACCCGCACCATCAAATATCTCAGCATGATGAAATTTTGG [...]
+TTGGAATCTGCTTAATCCTACAAATTCTTACAGGCCTATTCTTAGCTATACATTATACTCCAGACACAACTACAGCCTTTTCATCAGTCGCTCACATCTGTCGAGACGTAAACTACGGCTGAATTATCCGATATATACACGCAAACGGAGCATCCATATTCTTCATCTGCCTATACATACATGTGGGACGAGGACTATACTATGGCTCCTATACATTCACAGAAACATGAAACATTGGCATTATCCTCCTGCTTACCATTATAGCCACAGCATTCATAGGCTACGTATTACCATGAGGACAAATGTCATTCTGAGGAGCAACTGTCATTACCAACCTATTATCAGCAATTCCCTACATCGGAACCGATCTAGTACAATGAATTTGAGGTGGATTCTCAGTCGACAAAGCAACCTTAACACGATTCTTCGCCTTCCACTTTATCTTACCATTTATAGTATCAGCACTAGTAGCAGTACACCTACTATTCCTAC [...]
+GGATCTAACAATCCCTCTGGAATTCCATCCAACTCAGACAAAATTCCATTCCACCCATATTACACAATTAAAGACATTCTGGGAGCCCTACTTCTCATCATAATCCTACTACTACTAGCACTATTTTCACCCGACTTACTAGGAGACCCCGATAACTACACCCCTGCCAACCCTCTAAGCACCCCACCACATATCAAACCCGAATGATACTTTCTATTCGCCTACGCAATCCTACGATCCATTCCTAATAAACTAGGAGGAGTCCTAGCCCTAATACTTTCTATTCTAATCCTCGCCATCATTCCCCTACTCCATACATCAAAACAACGAGGAATAATATTTCGACCCATCAGCCAATGTCTATTCTGATTACTAGTAGCAGACCTACTCACACTAACATGAATCGGAGGACAACCAGTCGAACACCCCTACATTATTATCGGCCAACTAGCCTCAATCCTATACTTCACTATCCTACTAGTATTAATACCC [...]
+CATCATCGAAAACAGTATCCTAAAATGAATGTTCATAATTAACATTCTATCACTAATCATCCCAATTCTTCTCGCCGTAGCCTTCCTAACACTAGTAGAACGAAAAGTACTAGGCTACATGCAACTCCGAAAAGGACCTAACGTTGTAGGACCCTACGGACTTTTACAACCCATTGCAGACGCCGTAAAATTATTCACCAAAGAACCCCTACGACCACTAACATCTTCCACATTTATATTCATCATAGCCCCTATTCTAGCTTTAGCCCTAGCCCTAACCATATGAATCCCTCTGCCTATACCATACCCCCTCATTAACATAAATCTAGGAGTACTATTTATGTTAGCAATATCAAGTCTAGCCGTCTACTCAATCCTATGATCCGGGTGGGCCTCAAACTCAAAATATGCCCTAATTGGAGCCCTACGAGCCGTAGCCCAAACAATCTCATACGAAGTAACCCTAGCCATTATCTTACTATCAATTTTACT [...]
+GATCCTTTACCCTATCAACACTAATCACCACCCAAGAACACCTATGACTAGTCTTCCCTGCATGACCACTAGCCATAATATGATTTATCTCTACTCTAGCAGAAACCAATCGCGCCCCATTCGACCTAACAGAAGGAGAATCAGAACTCGTCTCAGGGTTCAACGTAGAATACGCAGCAGGCCCATTCGCCATATTCTTTCTAGCAGAATATGCCAACATTATCATAATAAATATCTTTACAACTCTCCTATTCTTCGGAGCATTCCACATCCCATATATACCTGAACTCTATACCATCAACCTCACTGTAAAAACCCTAGCACTAACAATCCTATTCCTATGGATTCGAGCATCATACCCGCGATTCCGATACGACCAATTAATACATCTCCTATGAAAAAACTTCTTACCTCTCACACTAGCTCTGTGCATGTGACATGTAACACTCCCTATTATCACAGCAAGCATTCCTCCTCAAACAATAAAACCTC [...]
+ATCATTATCATAACAACTGTTATATCAGGAACTATAATTGTCCTTACAAGCTCCCACTGACTACTAACCTGAATTGGCTTCGAAATAAACATACTAGCGATCATCCCAATCCTAATAAAAAATTATAACCCACGAGCCATAGAAGCATCCACAAAATATTTCTTAACACAAGCTACCGCATCAATACTCCTAATAATAGGCATCATTATTAATCTAACATTCTCAGGACAATGAACAATCTCAAAAATCCCAAACCCAATTGCATCAAGCCTAATAACTATCGCCCTAGCAATAAAACTAGGCATAGCTCCCTTCCACTTCTGAGTACCCGAAGTAACACAAGGAACCTCACTATCCTCAGGCATAATCCTACTTACATGACAAAAAATTGCACCTCTATCCGTCCTCTACCAAATCTCATCATCTATCAACCCCAAACTAATAATTCCTATAGCAATTACATCCGTACTAATTGGAGGCTGAGGAGGACTT [...]
+TCAACTCCGAAAAATCCTAGCCTACTCATCAATCGCCCACATAGGATGAATAGCCGCTATTCTAATCTACAACCCCACCCTCATACTCCTAAATTTCATAATCTACATCACAATGACCCTAAGCACATTTATATTATTCATCCACAATTCATCTACAACAACATTATCATTATCCCAGACATGAAACAAACTACCACTCATAACACCCCTAATCCTAATACTAATACTATCACTAGGAGGTCTTCCACCCTTATCAGGCTTCACACCTAAATGAATAATCATTCAAGAACTAACAAAAAACGACATAATCATCCTACCAACATTCATAGCCATTACAGCACTACTAAACCTATACTTCTACATACGATTATCATATACCACAACACTAACCATATTCCCCTCAATAAATAACATAAAAATAAAATGACAATTTGAAAGTACAAAAAAAGTCATCCTCCTACCACCATTAATTATTATCTCAACTATAATACT [...]
+CTCCAATGATATTAATCCTAGAGATAAACATAGTACTAGCTTTACTTACCAACATCGCTCTAGCCTCCTTACTCGTACTAATCGCATTCTGACTTCCCCAACTAAATATTTACTCAGAAAAAGTCAGCCCCTATGAATGTGGGTTTGACCCCATAGGCTCAGCACGTTTACCTTTCTCCATAAAATTTTTCCTAGTAGCTATCACATTCCTACTATTTGACCTAGAAATCGCCCTACTTCTACCGCTCCCATGAGCATCACATACAAACAACCTTACCACCATACTCACCATAGCACTACTACTTATCTCCCTTCTAGCTGCAAGCCTAGCTTACGAATGAACTGAAAAAGGACTAGAATGAATAGAAATGACCATAGTATATGCTAATATCTTCTTGGCCTTCATTACATCTCTCATGGGACTGCTCATATACCGGTCCCATCTAATATCCTCTCTACTCTGCCTAGAAGGTATAATATTATCACTATTCG [...]
+ACAGTAACAATCTTAAATAACCATTTCACATTAGCTAACATAGCTCCTATTGTCCTACTTGTCTTCGCCGCCTGCGAGGCAGCCCTAGGACTATCACTTTTAGTAATAGTATCCAATACATACGGAACTGACTACGTACAAAACCTGAACCTTCTACAATGCATCATTCTCCCTACCATAATACTTATACCCCTAACATGAATATCAAAACCGAATATAATCTGGATCAACACAACGACCTACAGCCTACTAATTAGTCTTATCAGTCTACCCTACCTAAATCAGCTCAATGATAACTGCATGAACTTATCATTATTATTTTTTACGGACTCCCTATCAGCCCCATTACTAACACTCACAACATGACTCCTACCCCTAATACTTATAGCTAGTCAATTTCACCTATCAAAAGAATCACTAACTCGAAAAAAACTTTATATTACAATACTAATCCTACTACAATTATTTTTAATTATAACATTTACCGCCACA [...]
+CATATTCTACATCCTATTTGAAGCCACCCTAGTACCTACCTTAATCATTATTACCCGATGAGGAAATCAAACAGAACGTCTAAACGCAGGAATATATTTTCTATTTTATACCCTAGTAGGATCCTTACCCCTATTAGTAGCCCTACTATCCATTCAGAATAATACAGGCACATTAAATTTCTTAATACTCCAGCTCTGAACACAACCCATACTAAATTCCTGATCCAATATTCTCCTATGACTAGCATGCATAATAGCATTTATAGTAAAAATACCTTTATACGGACTTCATCTATGACTACCCAAAGCACATGTAGAAGCACCCATCGCTGGGTCAATAGTACTTGCCGCAGTACTTCTAAAACTAGGAGGTTACGGTATAATACGAATTACAATATTACTTAACCCACTAACAAGTTCTATAGCATACCCCTTCATAGCACTATCATTATGAGGCATAATTATAACAAGTTCCATCTGCCTACGTCAAAC [...]
+AATCCCTAATTGCATACTCCTCCGTCAGTCATATGGCCCTAGTTATTGTAGCAATCCTCATCCAAACACCATGAAGCTACATAGGAGCAACAGCCTTAATAATCGCCCATGGCCTGACATCATCCATACTATTCTGCTTAGCTAACTCCAACTATGAACGTATCCACAGCCGAACTATAATTCTGGCACGTGGACTTCAAATTCTACTACCCCTAATAGCAGCATGATGACTAATAGCAAGCCTCACCAATCTAGCCCTTCCCCCTACCATTAATCTAATCGGAGAATTATTTGTAGTAATAGCCTCATTTTCATGATCTAACACTACCATTATCCTAATAGGAACTAACATCATTATTACCGCATTATACTCACTATACATGCTAATCACTACACAACGCGGAAAATATACTCACCACATCAAAAATATCAAACCTACATTCACGCGAGAAAATGCTCTAATAACACTCCATCTAATACCTCTACTACTAC [...]
+AACCCCAAAATTATTCTAGGACCCATTTACT?????ATAAAAGTAATTAATCTACTCACCCTCTCCACTATCACATTATTATTTATACTGACTTTCCCAATCGTCCTTACTAGCACTCCAATCTATAAAAACAAGCTTTACCCACAATATGTAAAAACCACTACCCTATACGCCTTTATAATCAGCATAGCTCCCATAATAATATTTATCTACTCAGGAAAAGAAATAATTATCTCAAACTGACACTGAATAACTATCCAAACCATAAAACTCACACTAAGCTTCAAACTAGACTATTTCTCTTTAATTTTTATACCCGTAGCCCTCTTCGTCACATGATCTATCATAGAATTCTCAATATGATATATACACTCAGACCCATTCATCAACCAATTCTTCAAATACCTTTTAATATTTCTTATTACCATAATAATCCTAGTGACCGCAAACAATCTATTCCAACTATTCATTGGCTGAGAAGGAGTAGGTATC [...]
+TCTCCTTATCGGATGATGACACGGACGAGCTGACGCAAACACAGCCGCCTTGCAAGCAATCCTCTATAACCGTATTGGAGACGTAGGCTTTATCATAGCCATAGCATGATTCCTGACTAACCTAAACACATGAGAATTCCAACAGATCTTTATCACCTATCACGACAATCTAAATATACCCCTCATAGGTATTCTATTAGCAGCAACTGGAAAATCAGCCCAATTCGGACTCCATCCATGACTACCGTCAGCCATAGAAGGTCCCACCCCAGTATCCGCCCTACTACACTCAAGCACTATAGTAGTAGCAGGAGTCTTCCTTCTAATCCGATTTCACCCACTAATAGAACATAACACAACAATACAAACAACTACCCTATGTCTAGGCGCAATCACCACCCTATTCACAGCAATCTGTGCATTAACCCAAAATGATATTAAAAAAATCATTGCATTTTCAACTTCAAGCCAACTAGGACTTATAATTGTCAC [...]
+TCAACCAACCACACCTAGCATTCCTACATATCTGCACCCACGCATTCTTTAAGGCCATACTTTTTATATGCTCCGGATCCATTATCCACAACCTAAATGACGAACAAGACATTCGAAAAATAGGAGGCCTGTATAAAGTTCTACCATTTACCACCACCTCACTAATCGCAGGAAGCCTAGCACTTACAGGAATGCCCTTCCTTACAGGATTCTACTCCAAAGACCTAATCATCGAAACCGCTAACACGTCATACACCAACGCCTGAGCCCTATTACTAACCCTTATCGCCACATCCATGACAGCCGCCTATAGCACCCGAATCATATTCTTCGTACTCCTAGGACATCCTCGTTTTAACCCCATAATTACAACCAATGAAAATAATCCACTTCTAATCAACTCCATCAAACGCTTACTACTAGGAAGCATTTTCGCAGGATATCTAATCTCCCACAACATTACACCCACCACTATTCCACAAACAACTATAC [...]
+TTAAAACTAACAGCCCTTACCGTGACACTCCTAGGATTTATCCTAGCATTAGAACTAAACCTTATCTCACAAAACTTTAAACTTAAATATCCATCAAACATATTCAAATTCTCTAACCTCCTCGGATACTTCCCTCTCATCATCCATCGCTACGTACCAGAAATAAACCTGTCAATAAGCCAAAAACTAACTTCAACACTACTAGATACAATCTGACTAGAAAATGTGCTACCAAAATCTATCTCTTACTTCCACATAAAATCATCAATTACCATTTCTAATCAGAAAGGCCTAATTAAACTATACTTCCTATCCTTCATAATTACCCTAATCCTAGCCCTAATA?????????ATTAACTTCCACGAG
+>Monachus_schauinslandi
+ATGAACGAAAATTTATTCGCTTCTTTCGCTACCCCTACAATAATAGGCCTCCCCATCGTAATTCTCATTACCCTGTTTCCAAGTATCCTACTCCCCTCTCCCGATCGATTAATTAATAACCGCCTTATTTCTATTCAACAATGACTAATTCAACTAACATCAAAGCAAATATTGTCAGTCCATAACTACAAAGGACAAACATGGGCACTCATACTTATATCACTCATTCTATTCATTGGATCTACTAATCTTCTAGGTCTCTTACCACACTCATTTACTCCCACTACTCAACTATCCATAAATCTAGGCATAGCCATTCCCCTATGAGCAGGAACAGTCATTATAGGATTCCGACACAAAATAAAAACATCTCTAGCTCACTTCCTACCTCAAGGAACACCTCTACTTCTTATCCCAATACTAGTAATCATTGAAACTATTAGTCTATTAATTCAGCCCATAGCCCTAGCTGTACGACTAACAGCTAACATC [...]
+CCACCTACTAATTCACCTAATCGGAGGGGCTACTCTTATCCTTATAGACATCAACACTGCTACAGCCTCAATCACCTTTATTATCCTCATACTACTTACCATCCTCGAGTTCGCTGTAGCCCTTATCCAAGCCTATGTCTTCACACTATTAGTCAGCTTGTATCTACACGATAATACCTAAATGCCACAGCTAGACACATCAACCTGATCTACCATAATTCTATCCATAATCCTAACTCTATTTATTATATTTCAACTGAAAATCTCCAAACATTACTTCCCAATAAATCCAAAGCTAAAACAAATATCACCACTAAAAAGCAACACACCTTGAGAAGAAAAATGAACGAAAATTTATTCGCTTCTTTCGCTACCCCTACAAATGTTCATAAATCGATGATTATTTTCCACAAATCACAAAGACATCGGCACTCTCTATCTATTGTTCGGTGCATGGGCTGGTATAGTAGGCACTGCTCTTAGCCTTTTAAT [...]
+AACTAGGACAACCTGGCGCCCTACTAGGAGATGATCAAATTTACAACGTGATCGTCACCGCTCACGCATTCGTAATAATCTTTTTTATAGTCATACCTATTATAATCGGAGGCTTTGGAAACTGATTAGTTCCTCTAATAATCGGAGCTCCCGATATAGCATTCCCCCGAATAAACAACATAAGCTTCTGACTTCTACCACCATCTTTCCTATTACTACTGGCTTCCTCTATAGTAGAAGCAGGTGCAGGAACAGGATGAACCGTTTATCCTCCTTTAGCTGGTAATCTGGCCCATGCAGGAGCATCTGTAGACCTAACAATTTTTTCTCTGCACTTAGCAGGTGTATCATCCATTCTTGGAGCTATTAATTTTATCACCACAATTATTAACATAAAACCTCCTGCAATATCTCAATACCAAATTCCCTTGTTCGTATGATCTGTACTAATTACAGCAGTCCTCCTACTACTATCGCTACCAGTCTTAGCAG [...]
+ACTATATTACTTACAGATCGAAATCTAAATACAACATTCTTCGATCCTGCTGGAGGAGGTGACCCTATTTTATATCAGCACTTATTCTGATTCTTCGGACATCCTGAGGTATACATCCTAATTCTACCAGGATTCGGAATGATTTCACACATCGTCACCTACTACTCAGGAAAAAAAGAACCTTTCGGCTATATAGGAATAGTCTGAGCAATAATATCTATCGGCTTCTTGGGCTTCATTGTATGAGCCCACCATATATTTACTGTAGGAATGGATGTCGACACCCGAGCATACTTCACTTCAGCCACTATAATTATTGCAATCCCAACAGGAGTAAAAGTATTCAGCTGACTAGCTACTCTACACGGAGGCAATATTAAGTGATCTCCAGCTATACTATGAGCCCTAGGATTCATTTTCCTGTTCACAGTAGGAGGTCTTACGGGTATTGTACTAGCAAACTCATCATTAGATATTGTACTCCACGATACA [...]
+AGTAGCACATTTCCATTACGTCTTATCAATAGGAGCAGTCTTCGCCATCATAGGCGGATTCGTCCACTGATTCCCTTTATTCTCAGGCTTCACTCTTGATGATACCTGAGCAAAAATCCACTTCACAATTATATTCGTTGGAGTTAATATAACATTCTTCCCTCAACATTTCTTAGGTCTCTCAGGAATACCTCGACGATACTCTGATTACCCAGACGCTTATACGACATGAAATACAGTCTCCTCTATAGGCTCGTTCATTTCACTCACAGCAGTGATACTAATGGTATTCATAATTTGAGAAGCCTTCGCATCTAAACGAGAAGTAGCAACAGTTGAATTAACCACAACTAACATTGAATGACTACACGGATGCCCTCCTCCTTACCATACATTTGAAGAACCTACCTACGTTGTACTAAAAATGGCATACCCTCTCCAAATAGGCTTACAAGATGCAACTTCTCCAATCATAGAAGAACTACTACACTT [...]
+ACACATTAATAATCGTATTCTTAATTAGTTCATTAGTACTTTATATTATCTCACTTATGTTAACTACAAAACTTACTCACACAAGTACAATAGACGCACAAGAAGTAGAGACAGTATGAACGATTCTACCAGCCATCATCTTAATCCTAATTGCCCTACCCTCATTACGAATTCTTTACATAATAGATGAGATTAATAACCCCTCCTTGACTGTAAAGACTATAGGACACCAATGATACTGAAGCTATGAATACACAGACTACGAAGACCTAAACTTTGACTCATATATAATTCCCACACAAGAGCTAAAGCCCGGAGAACTTCGACTATTAGAAGTAGACAACCGGGTAGTTCTTCCAATAGAAATAACAGTTCGTATATTAATTTCATCAGAAGACGTACTCCACTCATGAGCCGTACCATCTCTAGGACTAAAAACCGACGCTATTCCAGGACGACTTAACCAAACAACCTTGATAGCCATGCGACCAG [...]
+TACGGTCAGTGTTCAGAAATTTGTGGCTCCAACCATAGCTTCATACCCATCGTTCTTGAATTAGTCCCACTATCTCACTTCGAAAAGTGATCTACCTCAATGCTTATGACACACCAAACCCATGCGTACCATATAGTTAACCCTAGCCCATGACCACTAACAGGAGCTCTCTCGGCCCTCCTCATAACATCAGGCCTAATTATATGATTCCACTTCAACTCAATATATTTACTCCTACTAGGCCTCACAACCAATACCCTAACCATATATCAATGATGACGAGACATCATCCGAGAAAGCACATTCCAAGGCCACCATACTCCAACCGTTCAAAAAGGCCTACGATATGGCATAATCCTCTTTATCGTGTCAGAAGTATTCTTTTTTGCAGGTTTCTTCTGAGCCTTCTACCACTCTAGTCTAGCACCCACCCCCGAGCTAGGAGGATGCTGACCACCCACAGGTATCATTCCCCTAAACCCCATAGAGGTT [...]
+AAATACTTCCGTACTTCTAGCCTCAGGAGTGTCAATCACCTGAGCCCACCATAGCCTAATAGAAGGAAATCGCAAACACATACTCCAAGCACTATTCATTACTATCTCCCTGGGCATTTACTTTACACTACTACAAGCCTCAGAATATTACGAAACTTCCTTTACAATCTCCGATGGGGTCTACGGCTCTACCTTCTTCATAGCAACAGGATTCCATGGACTACACGTAATTATTGGCTCCACTTTCCTAATCGTGTGCTTCATACGACAATTAAAATTTCACTTTACATCCAATCACCACTTCGGATTTGAAGCCGCTGCCTGATACTGACACTTCGTAGACGTAGTATGACTATTCCTATACGTATCTATCTATTGATGAGGATCCTGCATGACCAACATTCGAAAAACTCACCCACTAGCCAAGATCATCAATAACTCACTCATCGACCTACCCGCGCCATCAAACATCTCAATATGATGAAATTTCGG [...]
+TAGGAATCTGCCTAATTCTTCAAATCTTAACAGGCCTATTTCTAGCCATACACTACACCTCAGACACAACCACAGCCTTTTCATCAATCACACACATCTGCCGAGACGTAAATTACGGCTGAATTATCCGATATATACACGCCAACGGAGCATCTATATTCTTCATCTGCTTATACATACACGTAGGACGAGGACTATACTATGGCTCCTATACATTCACAGAAACATGAAACATCGGCATTATTCTCTTACTCACCGTCATAGCCACAGCATTCATAGGCTACGTACTACCATGAGGACAAATATCCTTCTGAGGGGCGACCGTCATCACCAACCTACTATCAGCAATCCCTTACATCGGAACCGATCTAGTACAATGAATCTGAGGCGGGTTCTCAGTAGATAAAGCAACCCTAACACGATTCTTCGCTTTCCATTTTATTATACCCTTCATAGTATTAGCACTAGCAGCAGTCCATTTATTATTTCTAC [...]
+GGATCCAACAATCCCTCCGGAATTCCATCCAACTCAGACAAAATCCCATTCCACCCATACTATACAATTAAAGACATTCTAGGAGCTTTACTCCTTATCCTAATTCTAATACTACTAGTACTATTCTCACCCGACTTACTAGGAGACCCTGACAACTACATCCCTGCCAACCCCTTAAACACTCCACCACACATTAAACCCGAATGATACTTCCTATTCGCCTACGCAATCCTACGATCTATCCCCAATAAACTAGGAGGAGTCCTAGCCCTAGTACTTTCCATCTTAATTCTCGCCATTATCCCTCTTCTCCACACATCAAAGCAACGAGGAATAACATTCCGACCTATAAGTCAATGCCTATTCTGACTATTAGCAGCAGACCTAATTACGCTAACATGAATTGGAGGACAACCAGTTGAATACCCCTACACCACTATTGGCCAACTAGCCTCAATCCTATACTTCACAATTCCACTAGTATTAATACCT [...]
+CATTATCGAAAACAACATTCTAAAATGAATGTTTATAATTAATATCATATCACTAATTATCCCAATTCTTCTTGCCGTAGCCTTCCTGACATTAGTAGAGCGAAAAGTACTAGGCTACATACAACTCCGAAAAGGACCCAACATCGTAGGACCCTACGGACTTCTACAACCCATCGCAGACGCTATAAAACTATTCACCAAAGAACCCCTTCGACCACTAACATCCTCTACATTCATATTCATTATAGCCCCCATTCTAGCCTTAGCCCTAGCCCTAACCATATGAATCCCCTTACCTATACCATATCCTCTAATCAACATAAATCTCGGAGTACTATTCATACTAGCAATATCAAGCCTAGCCGTCTACTCAATCTTATGATCCGGATGAGCCTCAAACTCAAAATACGCCCTAATTGGAGCCTTACGAGCCGTAGCTCAAACAATCTCATACGAAGTAACCTTAGCCATTATTCTACTATCAGTTCTACT [...]
+GATCTTTCACCCTATCAACACTAATCACCACTCAAGAACACCTATGACTAATCTTCCCTACATGACCACTGGCCATGATATGATTTATTTCTACCCTAGCAGAAACCAACCGTGCTCCATTCGACCTAACAGAAGGAGAATCAGAACTCGTCTCAGGATTCAACGTAGAATACGCAGCAGGTCCATTCGCCATATTCTTTCTAGCAGAGTATGCTAACATCATTATAATAAACATTTTCACAACCCTCCTATTCTTTGGAGCATTTCACACCCCATACATACCCGAACTCTATACCATCAACTTTACCATAAAAACCCTAGCATTAACAATCCTATTTCTATGAATTCGAGCCTCATACCCACGATTCCGCTACGACCAACTAATACATCTTCTATGAAAAAACTTCTTACCTCTCACACTAGCCCTATGCATGTGACACGTAACATTACCCATTATCACAGCAAGCATTCCTCCTCAAACGATAAAACCCC [...]
+GCCATTATCATAACAACCGTTATATCAGGAACCATAATCGTTCTCATAAGCTCTCACTGACTACTAACCTGAATCGGCTTCGAGATAAACATACTAGCGATTATCCCGATTCTAATAAAAAACTACAATCCACGAGCCATAGAAGCATCTACAAAATACTTCTTAACACAAGCCACCGCATCAATACTTCTAATAATAGGCATCATCCTCAACCTAATATTCTCAGGACAATGAACAATATCAAAAATCCCAAACCCAATCGCATCAAGCCTAATGACCATTGCCCTAGCTATAAAACTAGGAGTAGCTCCCTTCCACTTCTGAGTACCCGAAGTAACACAAGGAATCTCACTACCCTCAGGCATAATTCTACTAACATGACAAAAAATCGCACCCCTATCCATCCTCTATCAAATCTCACCATCCATCAATCCCAAACTAATAATTCCTATAGCAATCGCATCAGTACTAGTCGGAGGCTGAGGAGGACTG [...]
+TCAACTCCGAAAAATCCTAGCCTACTCATCAATTGCCCACATAGGATGAATAGCTGTTATCCTAACATATAACCCCACCCTCATACTCTTAAATCTCCTAATCTATATTATAATAACCCTAAGCACATTTATACTATTCATCTATAACTCATCCACAACAACATTATCACTATCTCAAACATGAAATAAATTACCACTCATAACATCCCTAATCCTAATGCTAATACTATCACTAGGAGGCCTCCCACCATTATCAGGCTTCATACCTAAATGAATAATCATTCAAGAACTAACAAAAAACGACATGATTATCCTACCAACATTCATAGCTATCACAGCACTCCTAAACCTATACTTTTACATACGACTATCCTACACCACAACACTAACCATATTCCCCTCAACAAATAACACAAAAATAAAATGACAATTCGAAAGCACAAAAAAAATTATCCTCCTGCCACCATTAATTATCACTTCAACTATACTACT [...]
+CCCCAATAATATTAATCTTAGAAATAAACATAATACTAGCTCTATTTACTAATACCGCTCTAGCCTCTCTACTTGTATTAATCGCATTTTGACTCCCCCAACTGAACATTTACTCAGAAAAAGCCAGCCCCTACGAATGCGGGTTTGATCCTATAGGATCAGCACGTCTACCCTTTTCCATAAAATTCTTCCTAGTAGCCATTACATTCTTACTATTTGATCTAGAAATCGCCCTACTCCTACCGCTCCCATGAGCATCACACACAAACAACCTCACTACTATACTCACCATGGCTCTACTACTTATCTCCCTCCTAGCTGCAAGCCTAGCCTATGAATGAACCGAAAAAGGATTAGAATGAACAGAAATGACTATAGTATATGCTAACATCTTTTTAGCCTTTACCACATCCCTCATAGGACTGCTCATATACCGGTCCCACCTAATATCCTCTCTACTTTGCTTAGAAGGTATAATATTATCACTATTTG [...]
+ACAGTAACAATTCTAAATAACCATTTCACACTAGCTAGTATAGCCCCTATCATCCTACTTGTCTTCGCCGCCTGTGAAGCAGCCCTAGGATTATCACTCCTAGTAATAGTATCCAATACATACGGAACTGACTACGTACAAAACCTAAATCTTCTACAATGCATTATTCTCCCCACTCTAATACTTATACCCCTGACATGAATATCAAAACCCAACATAATTTGAATCAACACAACAACCTACAGCCTACTAATCAGTCTCATCAGCCTATCCTTTCTAAACCAGCTTAACGACAACTACATAAATCCATCCCTACTATTCTTCACGGACTCTCTGTCGACCCCACTACTAGCACTCACAACATGACTCCTACCTCTAATACTTATAGCCAGTCAATTCCACCTGTCAAAAGAACCACTAACTCGAAAAAAACTATACATTACAATACTAATTCTACTACAACTATTCCTAATTATAACATTCACCGCTACA [...]
+TATATTCTACATCTTATTTGAAGCAACTTTAGTACCCACTCTAGTCATTATCACCCGATGAGGGAACCAAACAGAACGCTTAAACGCAGGAATATATTTTCTATTTTACACCCTAGTAGGATCCCTACCCTTACTAGTAGCCTTACTGTCCATTCAAAACAATATAGGCACATTAAACTTCTTAATGCTACAACTCTGAGCCCAACCTACACTAAACTCCTGATCCAATACTCTCTTATGGCTAGCATGTATAATGGCCTTTATAGTAAAAATACCCTTATACGGACTCCATCTGTGACTACCTAAAGCACACGTAGAAGCACCCATCGCTGGATCAATAGTACTTGCTGCAGTACTTCTAAAACTAGGAGGCTACGGCATAATACGGATTACAATATTACTTAACCCACTAACAAGTTCTACAGCATACCCCTTTATAATACTATCACTATGAGGTATAATCATAACAAGCTCTATCTGCTTACGTCAAAC [...]
+AATCTCTAATTGCATACTCCTCCGTCAGTCATATAGCCCTAGTCATTGTAGCAATCCTCATCCAAACACCATGAAGTTACATAGGAGCAACAGCCTTAATAATCGCCCACGGTCTAACATCATCCATACTATTCTGTCTAGCTAACTCCAACTATGAACGTACCCACAGTCGAACCATAATCCTTGCACGTGGACTTCAAGGTCTCTTACCCCTAATAGCAACATGATGACTAATAGCAAGCCTCACCAATCTAGCTCTTCCCCCTACCATTAACCTAATCGGAGAACTATTTGTAGTAATAGCCTCATTCTCATGATCCAATATTACCATTATCCTAATAGGAACTAACATCATTATCACCGCTATATATTCACTATATATACTAATCACCACGCAGCGTGGAAAATATACCCACCACATTAAGAACATTAAACCTTCATTTACACGAGAAAATGCCTTAATAACACTCCATCTAATACCTCTACTACTAT [...]
+AACCCCAAAATTATCCTAGGACCCACTTACTGTAAAATAAAAGTAATTAATCTATTCACCTCCTCCCTCATCACATCACTACTTATATTAACACTTCCAATTGTCTTAACTAGCACCCCAATCTACAAAAATAAACTCTACCCACAATATGTAAAAACCACTATCTCATACACTCTTATAATTAGCATAATTCCCACAACAATATTCATCTATTCAGGAAAAGAAATAATCATCTCAAACTGACACTGAATAACTATCCAAACCATAAAACTCACACTAAGTTTCAAACTAGATTACTTCTCCATAATCTTCATACCTGTAGCCCTCTTCGTTACATGATCCATTATAGAATTCTCAATATGATATATACACTCAGATCCTTTTATCAACCGATTCTTCAAATACCTCCTAATATTCCTCATCACTATAATAATCCTAGTCACTGCAAACAACTTATTTCAACTATTCATTGGCTGAGAAGGAGTAGGCATT [...]
+CCTCCTCATCGGATGATGATACGGACGAACCGATGCAAACACAGCCGCCCTACAAGCAGTCCTCTACAACCGTATCGGAGATGTAGGCTTCATCATAGCTATAGCATGATTCTTAATCAATCTTAATACATGAGAACTCCAACAAATCTTTATTACTTACCACGACAACTTAAATTTGCCACTCATAGGTCTTCTATTAGCAGCAACCGGAAAATCAGCTCAATTTGGACTCCATCCATGGCTACCATCAGCCATAGAGGGCCCTACTCCAGTATCTGCTCTACTACACTCAAGTACTATAGTAGTAGCAGGAGTCTTCCTTCTAATCCGATTTCACCCACTGATAGAGCATAATATGACAGTACAAACAACCACTTTATGTCTAGGAGCCATTACTACCCTATTTACAGCAATCTGTGCACTAACCCAAAACGACATTAAAAAAATCATCGCATTCTCAACTTCAAGCCAACTAGGACTAATAATTGTCAC [...]
+TTAACCAACCGTATCTAGCATTTCTACACATCTGTACCCACGCATTCTTCAAAGCCATACTATTCATATGCTCCGGGTCTATTATTCATAACTTAAATAACGAACAAGACATCCGAAAAATAGGAGGCCTATACAAAGCACTGCCATTCACCACTACCTCATTAATCACAGGAAACCTAGCACTCACAGGAATGCCCTTTCTCACAGGATTCTACTCCAAAGACCTAATTATCGAAACCGCTAATACGTCGTATACCAACGCCTGAGCCCTACTACTAACCCTCATTGCCACATCCATAACAGCTGCCTACAGCACTCGAATCATATTCTTCGCACTCCTAGGACAACCCCGCTTCAACCCTATAATCATAATCAACGAGAACAATCCACTCCTAATTAATCCTATTAAACGTCTACTACTAGGAAGCATCTTCGCAGGATACCTAATCCTCCACAATATTACACCCACTACTATCCCACAAACGACTATAC [...]
+CTAAAACTAATAGCCCTTATCATAACACTTCTAGGGTTTATTCTAGCACTAGAACTCAACCTTATATCACAAAGTTTTAAACTCAAATACCCATCAAACCTATTCAAATTCTCCAGCCTCCTTGGATACTTTCCTACTATTACCCACCGCTACATGCCAGAAATAAACCTATCAGCAAGCCAGAAACTAGCCTCAACATTACTAGATATAACTTGACTAGAAAATGTACTACCAAAATCCATCTCTCACTTTCACATAAAATGATCAACCATTATCTCTAACCAAAAAGGCCTAATTAAGCTATACTTTCTCTCCTTCGTAATCACTCTAATCCTAGCCCTAATAATA??????ATTAATTTCCACGAG
+>Mustela_vison
+ATGAACGAAAATCTATTTTCCTCATTCATTACCCCAACAATAATAGGACTCCCTATCGTAATTATTATCACTATGTTTCCAAGCATTATATTCCCATCACCTACCCGACTAATCAATAATCGACTCATCTCCATTCAACAATGATTAGTGCAACTAACATCAAAACAAATATTATCCATCCACAACCAAAAAGGACAAACTTGAGCCCTGATATTAATATCACTAATCTTATTTATCGGTTCTACTAATTTATTAGGCCTCCTGCCCCACTCATTCACCCCCACCACACAACTATCTTTAAATCTGGGTATAGCCATCCCCTTATGAGCAGGCACTGTAATCACTGGTTTTCGGCATAAAACAAAAGCCTCTTTAGCCCACTTTCTACCACAAGGAACACCACTACCTCTAATTCCCATACTTATTATTATCGAGACTATTAGCCTATTCATTCAACCCATAGCCCTGGCCGTACGACTAACAGCCAATATC [...]
+CCACCTATTAATTCACCTGATCGGAGGGGCTACTTTAGCCCTAATAAACATTAGCACAGTTACAGCAATAGTTACCTTCACCATCCTCGTCCTCCTAACTATCCTAGAATTCGCAGTAGCTCTTATCCAGGCCTATGTATTCACCTTACTAGTAAGCTTATACTTACACGACAATACTTAAATGCCACAACTAGACACTTCAACATGATTTGTCACAATCTTATCAATAATCATTACTCTGTTTTTTATATTTCAACTAAAAGTATCAAAATATAGCTTTCCAGAAAACCCCGAACCAAAGTCACTGACTACATCAAAGTCTACTACACCTTGAGAAAACAAATGAACGAAAATCTATTTTCCTCATTCATTACCCCAACAAATGTTCATTAATCGATGATTATTTTCTACTAACCATAAAGATATTGGCACCCTCTACCTTTTATTCGGCGCATGAGCCGGAATAGTAGGAACTGCTCTTAGTCTTCTAAT [...]
+AACTAGGTCAACCTGGCGCCCTGCTAGGAGACGACCAGATTTACAATGTAATCGTAACAGCCCACGCATTTGTAATAATTTTCTTCATAGTAATGCCTATTATAATTGGGGGCTTTGGAAACTGACTCATCCCTCTGATAATCGGTGCACCTGATATAGCATTTCCACGAATAAATAATATAAGCTTCTGACTTCTACCCCCCTCTTTCCTTCTCCTTTTAGCTTCCTCAATGGTAGAGGCAGGCGCAGGAACAGGATGAACCGTTTATCCTCCCTTAGCAGGAAACCTAGCACACGCAGGAGCATCCGTAGACCTAGCAATTTTCTCCCTACACTTAGCAGGAATTTCATCTATTCTAGGGTCTATCAACTTTATCACTACTATTATTAACATAAAACCTCCCGCTATATCACAATACCAAACCCCCTTATTCGTATGATCTGTCTTAGTTACAGCTGTATTACTACTTCTATCCTTGCCAGTCCTAGCAG [...]
+ACTATGTTACTCACGGACCGCAATCTGAATACTACTTTCTTTGACCCAGCCGGAGGAGGAGACCCTATCCTATATCAACACCTATTCTGATTTTTCGGACACCCCGAAGTTTATATCTTAATTCTACCAGGATTTGGCATTATTTCACATGTAGTAACTTACTACTCAGGAAAAAAAGAACCTTTTGGTTACATAGGGATAGTATGAGCAATGATATCAATCGGCTTCCTAGGATTTATTGTATGAGCCCACCATATGTTCACTGTAGGCCTAGACGTAGACACACGAGCATATTTCACTTCAGCTACCATAATTATTGCTATCCCAACAGGTGTAAAAGTATTTAGCTGATTAGCTACGCTGCACGGAGGGAACATCAAATGATCTCCAGCTATGCTATGGGCCTTAGGGTTTATCTTTTTATTTACAGTGGGTGGCTTAACGGGTATTGTATTATCAAACTCATCACTAGACATCGTTCTTCACGATACA [...]
+AGTAGCACATTTTCACTACGTTCTTTCAATAGGGGCAGTATTTGCAATCATAGGCGGATTCGTTCACTGGTTCCCATTATTTACAGGCTACACCCTAAATGATACTTGAGCAAAAATCCACTTTACAATCATATTTGTAGGAGTAAATATAACATTCTTTCCCCAACATTTCCTAGGATTATCAGGTATACCTCGACGCTACTCTGATTACCCAGACGCATACACAACATGAAACACAGTATCTTCCATAGGCTCATTCATTTCACTAACAGCAGTAATACTAATAATCTTCATAATTTGAGAAGCCTTTGCATCCAAACGAGAAGTATCTACAGTAGAATTAACCTCAACAAACATCGAATGACTACATGGATGTCCTCCCCCATACCACACATTCGAAGAACCAACCTATGTATTATCCAAGATGGCGTACCCTTTCCAAACAGGCCTCCAAGACGCAGCCTCTCCTATCATAGAAGAGCTCCTACACTT [...]
+ATACATTAATAATCGTATTCTTAATTAGCTCCCTTGTTCTCTACATTATTTCAGTAATACTAACCACTAAACTCACACATACTAGTACTATAGACGCTCAAGCAGTAGAAACAATTTGAACCATCTTACCAGCTATTATTCTAATCATAATTGCTTTACCCTCACTACGGATCCTTTATATAATAGATGAAATTAATAACCCTTCCTTGACTGTAAAAACCATAGGCCACCAATGATATTGAAGCTATGAATACACAGACTACGAAGACCTAAATTTTGACTCTTATATAATCCCAACTCAAGAATTAAAACCTGGGGAATTACGATTATTAGAAGTAGATAATCGAGTAGTCCTCCCAATAGAAATAACAATTCGTATACTAATCTCTTCCGAAGACGTATTACACTCATGAGCTGTCCCATCCCTAGGACTAAAAACTGACGCCATTCCAGGGCGCCTAAACCAAACTACTATTATAGCCATGCGACCAG [...]
+TACGGCCAATGCTCTGAAATCTGCGGCTCTAATCACAGCTTTATACCAATTGTTCTTGAGTTAGTGCCTCTGTCGCACTTCGAAAAATGATCTGCCTCAATATTAATGACCCACCAAACACACTCATACCATATAGTTAACCCAAGCCCATGGCCCCTAACAGGAGCATTATCCGCCCTGCTTACAACATCAGGTTTAGTAATGTGATTTCATCACAACTCATCATTCCTCCTTACCCTAAGTATGGCAACTAATATATTAACTATATACCAATGATGACGAGATGTAGTCCGAGAAGGTACATTTCAAGGCCATCATACTCCTACTGTCCAAAAAGGCCTACGATACGGAATAATTCTTTTTATTACCTCAGAAATTTTCTTCTTCGCAGGCTTCTTCTGAGCTTTCTATCATTCAAGCCTAGCACCAACCCCTGAACTAGGTGGATGCTGGCCACCTACAGGTATTACCCCTTTAAACCCCTTAGAAGTA [...]
+CAACACCTCAGTCTTACTAGCCTCTGGAGTCTCTATTACCTGAGCCCATCACAGCCTTATAGAAGGAGACCGCAAACATATAATCCAAGCCCTATTTATTACAATCCTCCTAGGTTTGTATTTTACCATTTTACAAACCTCAGAATACTACGAAGCCCCATTCACAATTTCTGATGGGATCTACGGCTCTACATTCTTTATAGCTACAGGGTTCCACGGCCTTCACGTCATCATCGGATCTACCTTTCTCATCGTATGCTTCCTACGACAACTAAACTATCACTTCACATCTGACCACCACTTTGGATTCGAAGCTGCTGCCTGATACTGACACTTCGTAGATGTAGTATGACTATTCCTATATGTATCCATCTATTGATGAGGATCTT??ATGACCAACATTCGTAAAACCCACCCATTAACCAAAATTATCAACAACTCATTCATTGATCTACCTGCTCCATCAAACATCTCAGCATGATGAAACTTCGG [...]
+TCGGAATCTGCCTAATTCTTCAAATTCTTACAGGCTTATTCTTAGCCATACACTACACATCAGACACAGCTACAGCCTTTTCATCAGTCACTCATATTTGCCGAGACGTTAATTATGGTTGAATCATTCGATACATACACGCAAATGGAGCTTCCATATTCTTTGTTTGCTTGTTCCTACATGTAGGACGAGGCTTATATTATGGATCTTATATATTTCCTGAAACATGAAATATTGGTATCATCTTACTATTCACAGTAATAGCAACAGCATTCATAGGTTACGTATTACCATGAGGACAAATATCATTTTGAGGTGCAACCGTAATTACCAATCTACTCTCAGCTATCCCATACATCGGAACTAATCTTGTAGAATGAATCTGAGGGGGGTTTTCAGTAGACAAAGCCACCTTAACACGATTCTTCGCCTTTCACTTCATCCTGCCATTCGTCATCTCAGCACTAGCAGCAGTTCACCTATTATTCCTCC [...]
+GGATCCAATAACCCCTCTGGAATCCCATCCGATTCAGACAAAATCCCCTTTCACCCCTACTATACCATTAAAGATATCCTAGGCGCCCTATTCCTCATTTTAACACTAACACTACTAGTATTATTCTCACCTGACCTATTAGGAGACCCAGACAATTATATTCCTGCTAACCCACTCAACACACCTCCCCATATCAAACCTGAATGGTACTTCCTATTCGCATATGCTATCCTACGATCCATCCCTAATAAACTAGGAGGAGTACTTGCCTTAGTTTTTTCTATTCTAGTTCTAGCTATCATTCCCCTACTGCACACCTCAAAACAACGAAGCATGATATTCCGCCCACTAAGCCAGTGCTTGTTCTGATTACTAGTAGCTGATCTCCTTACACTAACCTGAATCGGCGGCCAACCAGTAGAACACCCATTCATTACTATCGGCCAATTAGCTTCAATCCTCTATTTCATAATCCTCCTAGTCTTCATGCCA [...]
+TATTATTGAAAATAATCTATTAAAATGAATGTTTATAGTTAACACTATCTCACTAATTGTGCCAATCCTACTAGCCGTAGCTTTTCTAACATTAGTAGAACGAAAAGTACTAGGATATATACAACTTCGCAAAGGCCCAAACATTGTAGGACCTTACGGCCTCCTACAACCAATTGCAGATGCTGTAAAACTCTTTACAAAAGAACCCCTACGACCACTAACATCATCCATCACCATATTTGTTATAGCTCCCATCCTAGCCCTAACACTAGCCCTAACAATATGAATCCCACTACCCATGCCCTACCCACTCATTAATATAAACCTAGGAATTTTATTTATATTAGCAATATCAAGCCTAGCCGTTTACTCTATCCTGTGGTCAGGATGGGCCTCAAACTCAAAATACGCTTTAATCGGAGCTCTACGAGCTGTAGCCCAAACAATCTCATATGAAGTCACACTAGCCATCATCCTACTATCAGTATTACT [...]
+GCTCCTTTACCTTATCCACATTAATTATCACACAAGAACATCTATGACTAGTCTTCCCCGCATGACCCCTAGCCATAATATGATTTATCTCAACCCTAGCAGAAACCAACCGCGCCCCATTTGACCTAACAGAAGGAGAATCAGAATTAGTCTCAGGCTTCAACGTTGAATATGCAGCAGGACCATTTGCCCTGTTCTTCCTAGCCGAATACGCAAATATCATTATAATAAATATCCTCACAACCATCTTATTTTTCGGCGCATTCCACACCCCCTACCTACCAGAATTATATTCCATCAACTTCACCATAAAAGCACTCCTGCTAACAATCTCCTTCCTATGAATTCGAGCATCCTACCCACGATTCCGCTACGACCAACTCATACATTTATTATGAAAAAATTTTCTCCCACTAACACTAGCCCTATGCATATGACACATGGCCCTTCCCATTATAACAGCGAGCATTCCACCCCAAACAATCAAGCCCC [...]
+ATCATCATCATGTTTACCGTCGTCTCGGGGACTATAATAGTACTAATAAGCTCCCACTGATTGATAATCTGAATTGGGTTCGAAATAAATATACTAGCCATCATCCCAATTCTAATAAAAAAATTTAGCCCACGAGCAGTAGAAGCATCAACAAAATACTTCCTCACACAAGCCACCGCATCCATGCTTCTTATACTAGGAATTATTGTCAATCTATTACTAACAGGGCAATGAACAGTCTCAAGTACCCTAAACTCAACCGCATCTAACATAATAACAGTAGCCCTAGCAATAAAACTAGGCCTATCACCCTTTCACTTCTGAGTACCTGAAGTAACTCAAGGAGTCCCATTACCATCAGGAATAATTTTACTAACCTGACAAAAAATCGCTCCCCTATCAATTCTATACCAAATTTACCCATCCATAAACTCACATTTACTGACAACTATAGCAATTACATCAGTCCTAATCGGAGGATGAGGAGGACTG [...]
+ACAACTACGAAAAATCCTGGCCTACTCATCAATCGCACACATAGGATGAATAATCGCCGTAACAACATACAACCCAACCCTTACACTGCTAAACCTCTTAATTTACATCACAATAACTTTAGGAACATTCATACTATTCTCATTCAACTCATCCACAACTACACTATCATTATCCCTCATATGAAATAAACTACCATTAATCACCTCACTAATTCTAATCACAATACTATCATTAGGAGGCCTTCCTCCACTTTCAGGCTTTATTCCCAAATGAATAATTATCCATGAACTCACAAAAAACAATATAATTACACTAGCAATATTCATAGCAATAACAGCCCTATTAAATTTATACTTTTACATACGACTAACATACGCAACAGCACTAACTTTATTTCCCTCAACAAATACTATAAAAATAAAATGACAATTTGAAAACACAAAAAATACAACCCTACTATCCCCCCTAATTGTAATCTCAACCATACTACT [...]
+CACCAATAATATCAACACTATTCATAAATATAATATTAATTATACTCATCAATGTTTCATTAGCATCCCTACTTGTCACAATCGCATTTTGACTCCCTCAATTAAATATTTATACAGAAAAAGCAAGCCCATATGAATGCGGCTTCGATCCACTAGGGTCAGCACGTTTACCTTTCTCCATAAAATTTTTTCTAGTAGCCATTACATTTTTGCTATTTGACCTAGAAATCGCTCTCCTTCTACCACTACCATGAGCCTCACAATCAATTAACCTAAAAACCACACTCACTATAGCACTAGCACTAGTTTCACTACTAGCCGCAAGCCTGGCCTATGAATGAACCGAAGAAGGCTTAGAGTGAAACGAAATGTCCATAGTATATATCAACATTTTCCTAGCCTTTACTCTATCTTTTATGGGACTACTCATCTACCGATCCCACTTAATATCTTCTCTTCTCTGCCTAGAAGGGATAATATTATCACTCTTCG [...]
+ACAATCACCATCTTAATTAACCACCTTACATTAGCCAGCATAACCCCTATCATCCTTCTTGTATTTGCAGCCTGTGAAGCAGCACTGGGCTTATCCCTTTTAGTTATAATCTCAACTACATACGGAACAGACTACGTACAAAACTTAAACCTACTACAATGCATTATTATTCCAACCATAATACTAATTCCCCTAACATGACTATCAAAACCTAATATAATTTGAATTAATATAACAGCCCACAGTATATTAATTAGTTTAATTAGCCTAACATATCTTAACCAACTCACAGACAATAATCTAAACTTCTCATTACTATTCTTCGCAGATTCCTTATCAGCACCCTTGTTAGCACTTACAACATGACTACTCCCTCTAATAATTATAGCAAGCCAGCACCACCTATCAAAAGAAACCTTAATGCGAAAAAAACTTTATATTACAATACTAATCATACTACAACTATTCCTAATCATAACATTCGCTGCTACG [...]
+CATATTCTATATTCTATTTGAAGCCACACTCATACCAACATTAATCATCATTACCCGCTGAGGTAACCAAACAGAACGACTAAACGCCGGCTTATATTTTTTATTCTACACTCTAGTAGGCTCACTACCTCTATTAGTCGCCCTAGTATGAATCCAAAATAACCTAGGTACCTTAAACCTTTTAATCATTCAATATTGAGCACAACCCCTACTAAATTCATGATCCAATGCCCTATTATGACTAGCATGCATAATAGCATTCATAGTAAAAATACCTTTATATGGCCTCCACCTGTGACTCCCAAAAGCCCACGTAGAAGCTCCTATCGCAGGATCGATAGTCCTTGCCGCCGTCCTCCTAAAATTAGGCGGATACGGAATAATGCGAATTACCACACTACTAAACCCATTAACAAACCACATAGCATACCCCTTCATAATGCTATCATTATGAGGAATAATCATAACCAGCTCTATCTGTCTACGCCAAAC [...]
+AATCTTTAATCGCCTACTCCTCCGTAAGCCACATGGCCCTAGTAATCATAGCTGTACTCATCCAATCACCATGAAGCTATATGGGAGCAACAGCCCTAATAATTGCACACGGTCTAACATCATCTATGCTATTCTGCCTAGCCAATTCCAACTACGAACGCATTCACAGCCGTACTATAATCCTTGCACGAGGCCTACAAACATTGCTACCACTAATAGCTGCATGATGATTACTTGCCAGCTTAACTAATCTAGCCTTACCACCTACAATCAACCTAGTAGGAGAGTTATTCGTAGTAATAGCTTCATTCTCATGATCTAACATCACCATTATCCTAATAGGCATCAACATTACTATCACTGCCATCTATTCCCTATACATACTAATTACCACACAACGCGGAAAGTACACCCATCACATTAAAAGTATTAAACCATCATTTACACGAGAAAACTCCCTAATAGCCCTACACCTACTACCCCTACTCCTAC [...]
+AACCCTAAAATTATTCTAGGCCCTATTTACT?????ATAAAAGTAATAAATTTATTTACCTCCTCAATACTTATAACACTATTCATATTAACTATTCCCATTATAATAACTAACACCACAATATATACTAACAAACTTTACCCCCAATATGTAAAAACCACTATCTCATATGCTTTTATTATCAGCCTAATCCCCACAACTGTATTCCTTTATTCAGGACAAGACACAATAATTTCAAATTGACACTGAATTACAATTCAAACAATAAAACTATCACTTAGCTTTAAACTTGATTACTTTTCAATAACCTTTATACCAGTAGCTTTGTTTGTCACATGATCAATTATAGAATTCTCAATATGATACATACACTCAGATCCCTATATTAATCGATTTTTCAAATACCTACTCCTGTTTCTTATTACCATAATAATTCTGGTTACCGCCAACAACATATTCCAACTATTCATTGGCTGAGAAGGAGTAGGCATT [...]
+TCTACTTATCGGGTGATGATACGGACGAACAGACGCCAACACAGCCGCACTACAAGCTATTTTATATAACCGCATTGGAGATGTAGGGTTCATCCTAGCTATAGCCTGATTCCTGATTAACCTAAACACATGAGACCTCCAACAAATCTTTATAATTAACCACGAAAACCTAACCATACCCCTCATAGGCCTTATATTAGCAGCTACCGGAAAATCCGCACAATTTGGCCTTCACCCATGACTACCATCAGCCATGGAAGGCCCAACCCCTGTATCAGCCCTACTACACTCAAGCACAATAGTCGTAGCAGGGGTTTTCCTATTAATTCGATTCCACCCCTTAATAGAACACAACAAAACTATACAAACTACTACATTATGCCTAGGAGCAATCACAACCCTATTTACAGCAATTTGCGCCCTAACACAAAATGATATTAAAAAAATCGTTGCTTTCTCCACCTCAAGTCAACTAGGATTAATAATCGTAAC [...]
+TCAACCAACCCTACCTAGCATTCCTCCATATTTGCACTCACGCATTCTTCAAGGCCATGTTATTCATATGCTCCGGATCTATTATTCACAGCTTAAATGACGAGCAAGATATTCGAAAAATAGGAGGACTATTCAAAGCACTACCATTCACCACCACCTCCCTAATTGTTGGAAGCCTAGCACTTACAGGAATACCTTTTCTAACAGGTTTTTACTCCAAAGACCTGATCATTGAGACCGCCAACACGTCGTATACCAACGCCTGAGCCCTTCTAATAACTCTCGTTGCCACCTCCATAACAGCTGCCTACAGCACTCGAATCATATTCTTCGCACTATTAGGACAACCCCGCTTTAACCCTATTATCACAATCAACGAGAATAATCCACTCCTAATCAATTCCATTAAACGTCTCTTATTCGGGAGTATTTTCGCAGGATTCTTAATCTCTAACAATATTACACCCACCACCACCCCACAGATAACTATGC [...]
+CTTAAAATAACAGCTCTCACAGTAACTATTTTAGGTTTCATCCTGGCACTAGAACTAAACCTTACAATGCAGAGCCTAAAATTCAAGTACCCCTCTAACCTATTCAAATTCTCAAACATGCTGGGCTATTTCCCCACCATTATTCACCGCCTAGTACCCATAACAAACCTACTAATAAGTCAAAAATCAGCATCAACACTACTAGACACAATTTGATTAGAAAAAATCATACCAAAATCTATCTCCCATTTCCAAATAAAATCTTCAACTATTATCTCCACCCAAAAAGGTTTAATCAAACTATACTTCATATCTTTCATATTAACCCTAACTATTAGCTTGCTAGCA??????CTTAATTTCCACGTG
+>Neofelis_nebulosa
+ATGAACGAAAATCTATTCGCCTCTTTCACTACCCCAACAATAATAGGATTACCCATTGTTGTGTTAATTATTATATTCCCTAGTATTCTGTTTCCCTCACCTAACCGACTGGTCAACAATCGCCTAGTTTCACTACAACAGTGACTAGTACAACTAACATCAAAACAAATACTGGCCATCCACAACCACAAAGGACAAACTTGGGCCCTAATACTTATGTCTCTCATTCTATTTATCGGGTCAACAAACCTGTTAGGTCTACTACCTCACTCATTTACTCCAACTACCCAATTATCAATAAACTTAGGGATAGCTATCCCCCTGTGAGCTGGCACCGTGATCACCGGGTTTCGCCGCAAAACTAAAGCATCCCTGGCCCACTTTCTACCACAAGGAACACCAGGCCCTCTGATCCCTATGCTTGTAATTATCGAAACCATCAGTCTCTTCATTCAGCCCGTAGCCCTGGCCGTACGACTCACAGCTAACATT [...]
+TCACTTATTAATACACCTAATCGGAGGAGCTGCTTTAGCCTTGATAAACATTAGCACTCCCGTTGCCCTAATCACCTTTATCATCCTTATCCTGCTGACAATCCTCGAATTTGCTGTGGCTCTAATCCAAGCCTACGTCTTTACTTTACTTGTAAGCCTATACCTACACGATAATACCTAAATGCCACAGCTAGATACATCCACCTGATTTGTTACCATTGTATCTATAATTATAACACTATTTATTGTATTTCAACTAAAAATCTCAAAACACCTGTATCTATCGAACCCAGAACCTAAGCCTATGGCTATGCTGAAACAGCCTAATCCTTGAGAAAAAAAATGAACGAAAATCTATTCGCCTCTTTCACTACCCCAACAAATGTTCATAAACCGCTGACTATTTTCAACTAACCATAAAGATATTGGAACTCTTTACCTTTTATTTGGCGCTTGGGCCGGTATAGTAGGGACTGCTCTTAGTCTTTTAAT [...]
+AGCTGGGTCAACCTGGCACGCTACTAGGGGATGACCAGATTTATAATGTAGTCGTCACTGCTCATGCCTTCGTAATAATCTTTTTTATAGTAATACCCATTATGATTGGAGGGTTTGGAAACTGACTGGTCCCATTAATAATTGGGGCCCCCGACATAGCATTCCCTCGAATAAATAACATAAGCTTCTGACTCCTTCCTCCGTCTTTCCTACTTTTGCTCGCATCGTCTATAGTAGAGGCCGGGGCAGGAACTGGGTGGACAGTGTACCCGCCCCTAGCCGGCAATCTGGCCCATGCAGGAGCATCTGTAGACTTGACTATCTTTTCACTACATCTAGCGGGTGTTTCCTCTATCCTGGGCGCTATTAATTTTATTACTACTATTATTAATATAAAACCTCCTGCCATATCTCAATACCAAACACCACTATTTGTCTGATCAGTCTTAATCACTGCTGTATTACTGCTTTTATCACTGCCAGTTCTAGCAG [...]
+ACTATGCTACTGACAGATCGAAATTTAAATACTACATTTTTCGACCCTGCTGGGGGAGGGGACCCTATCCTATATCAACACTTATTCTGGTTTTTCGGTCATCCAGAGGTTTATATTTTAATTTTACCCGGGTTTGGAATAATTTCACATATCGTCACCTACTACTCCGGTAAAAAAGAGCCTTTTGGCTATATGGGAATGGTTTGAGCTATAATGTCAATTGGCTTTCTGGGCTTTATCGTATGAGCTCACCATATGTTTACTGTAGGAATAGACGTGGACACACGAGCATACTTTACATCAGCTACAATGATCATCGCTATCCCTACTGGAGTAAAAGTATTCAGTTGACTGGCCACCCTCCACGGAGGCAATATCAAATGGTCTCCTGCTATACTGTGAGCCCTGGGCTTTATTTTCCTGTTTACCGTGGGAGGCTTAACAGGAATCGTACTAGCAAATTCCTCACTGGATATTGTTCTTCACGACACG [...]
+AGTAGCTCACTTCCACTACGTCTTGTCAATAGGAGCAGTATTCGCTATTATAGGAGGCTTCGTCCATTGATTCCCCCTATTCTCAGGGTATACTCTCGACAATACTTGGGCAAAAGTTCATTTCACGATTATGTTCGTAGGTGTCAACATAACGTTTTTCCCTCAGCACTTCCTGGGCCTATCCGGAATGCCCCGACGTTATTCCGACTACCCAGACGCATATACAACTTGAAACACAATCTCCTCAATAGGTTCTTTCATTTCACTAACAGCAGTTATACTAATAGTCTTCATAGTGTGGGAAGCTTTCGCATCAAAACGAGAAGTGGCCATAGTGGAGTTAACCTCAACCAATCTCGAATGACTACATGGATGTCCCCCTCCCTACCACACATTTGAAGAACCAACCTATGTGTTGTCAAAAATGGCATACCCCCTCCAACTAGGCTTTCAAGATGCTACATCTCCCATTATAGAGGAACTCTTACACTT [...]
+ACACATTAATAATTGTATTTCTAATCAGCTCCCTAGTCCTCTATATCATCTCACTAATACTAACAACCAAACTAACACACACAAGCACAATAGACGCCCAAGAAGTAGAAACCATCTGAACCATCTTACCAGCTATCATTTTAATCCTCATCGCCCTGCCCTCTTTACGAATTCTCTATATAATAGATGAGATTAACAACCCCTCTCTTACCGTAAAAACCATAGGACATCAATGATATTGAAGCTATGAGTACACTGACTATGAAGACCTAAACTTTGACTCCTATATAATCCCCACTCAAGAACTAAAACCCGGTGAACTTCGACTGCTAGAAGTTGATAATCGAGTGGTATTACCAATAGAAATGACTATCCGCATATTAATCTCATCAGAAGATGTACTGCACTCATGAGCCATCCCGTCCCTGGGCCTAAAAACCGATGCTATTCCAGGTCGGTTAAACCAAACAACCCTAATGGGCACACGACCTG [...]
+TATGGCCAATGCTCGGAAATCTGCGGCTCAAACCATAGCTTTATGCCCATTGTTCTTGAATTAGTTCCCCTGTCATATTTTGACAAATGATCTATATCTATACTAATGACCCACCAAACCCACGCATACCACATGGTTAATCCCAGTCCATGACCACTTACAGGGGCCCTTTCAGCCCTACTAATAACCTCAGGCCTAGCTATATGATTTCACCACAACTCAATACTACTACTAACTTTAGGGATAACTACTAACCTATTGACTATATATCAATGGTGACGAGACATTATCCGAGAAAGCACATTCCAAGGCCATCACACACCCATCGTCCAAAAAGGCCTCCGATATGGGATAATCCTTTTTATTGTCTCAGAAGTATTCTTCTTTGCAGGCTTCTTTTGGGCCTTCTACCACTCAAGCCTAGCCCCAACCCCCGAATTAGGGGGATGCTGGCCACCAACAGGTATTACCCCTCTAAACCCCCTGGAGGTT [...]
+TAACACTTCTGTACTTTTAGCCTCCGGAGTGTCAATCACCTGGGCCCACCATAGTCTAATAGAAGGGAATCGAAAACACATACTCCAGGCGCTATTAATCACAATTTCTTTAGGAATTTATTTTACCCTCCTCCAAGCCTCTGAATATTATGAAACATCATTTACAATCTCAGACGGAGTTTATGGATCCACCTTCTTCATAGCCACAGGATTCCACGGACTGCATGTAATTATTGGCTCTACTTTTCTGGTTGTGTGCTTCTTACGCCAACTAAAATACCACTTCACATCAAGCCACCATTTTGGATTTGAAGCCGCTGCTTGATACTGGCATTTTGTAGACGTAGTTTGATTGTTCCTATACGTTTCTATCTATTGATGAGGATCCTGTATGACCAACATTCGAAAATCACACCCCCTCATTAAAATTATCAATCACTCATTCATTGATTTACCTGCACCATCTAACATCTCCGCGTGATGAAACTTTGG [...]
+TAGGAGTATGTTTAATCTTACAAATTCTCACCGGCCTCTTCCTGGCCATACACTACACATCAGATACAATAACTGCTTTCTCATCTGTCACCCATATTTGCCGCGACGTAAACTATGGTTGAATCATCCGATACCTACATGCCAACGGAGCCTCCATATTTTTTATCTGCCTATACATGCACGTAGGACGAGGAATATATTACGGCTCCTACACCTTCTCAGAAACATGAAACATTGGAATCGTATTACTATTTACAGTCATAGCCACAGCCTTCATGGGATACGTCCTACCATGAGGCCAAATATCCTTCTGAGGGGCAACTGTAATTACCAACCTCCTATCAGCAATCCCATACATTGGGGCCGACCTAGTAGAATGAATCTGAGGGGGCTTCTCAGTAGACAAAGCCACCCTGACACGATTTTTCGCCTTCCACTTCATCCTCCCATTTATCATCTCAGCCTTAGCAGCAGTTCACCTTCTATTTCTCC [...]
+GGATCCAATAACCCCTCAGGAATGGTATCCGATTCAGACAAAATCCCGTTCCACCCGTACTATACAATCAAAGATATCCTAGGCCTCCTAGTTCTAATTCTAGCGCTCACACTACTTGTTCTATTCTCCCCAGACCTACTAGGAGACCCTGACAATTACACTCCCGCCAACCCTCTAAATACCCCTCCCCATATCAAGCCTGAATGATACTTCCTATTTGCATACGCAATTCTCCGATCTATCCCCAACAAACTAGGAGGAGTTCTAGCCTTAGTGCTCTCTATCTTAGTCCTAGCAATCATCCCTGCCCTTCACACTTCTAAGCAGCGAGGAATAATATTCCGACCAATAAGCCAATGCTTATTCTGATTCCTAGTAGCAGACCTTCTGACCCTAACATGAATTGGTGGCCAACCTGTAGAACACCCTTTTACCACTATCGGCCAACTAGCCTCCATTCTATACTTCTTCACTCTCCTAGTTTTAATGCCC [...]
+TATAATTGAAAACCGCCTCCTTAAATGAATGTTCATAATCTATATCCTCTCATTAATTATCCCCATTCTCCTCGCCGTAGCCTTTCTGACCCTAGTTGAACGCAAAGTACTAGGCTACATACAACTCCGCAAGGGACCAAACGTCGTAGGACCATACGGCCTACTTCAACCCATCGCAGACGCTGTGAAACTCTTTACTAAAGAACCCCTCCGGCCCCTTACATCCTCTATATTCATATTCATCATAGCACCCATCCTAGCTCTTACACTAGCCCTAACTATATGAATTCCACTGCCCATACCATATCCACTTATTAACATAAACTTAGGAGTGCTATTCATACTAGCAATATCCAGCCTAGCTGTCTACTCCATCCTATGATCGGGATGGGCCTCAAACTCAAAATACGCCCTAATCGGAGCCTTACGAGCTGTAGCTCAGACAATCTCATATGAAGTCACACTAGCTATTATTCTCTTGTCAGTCCTATT [...]
+GATCCTTCACACTAGCTACACTAATTACCACTCAAGAATATATCTGACTTATTATCCCTGCATGACCCCTGGCTATAATATGATTCATCTCTACACTAGCAGAAACCAACCGAGCACCATTCGACCTCACAGAGGGAGAGTCAGAGCTCGTTTCTGGATTCAACGTAGAATACGCAGCAGGCCCCTTCGCCCTATTTTTTCTAGCAGAATATGCCAACATCATTATAATAAACATGCTTACAACAATACTATTTTTTGGAGCATTCCACAGCCCCTACATACCAGAACTACACACCATTAACTTCACAGTAAAAACCCTACTCCTAACAACCACCTTCCTATGAATTCGAGCATCATACCCACGATTCCGATACGACCAATTAATGCACCTCCTATGAAAAAGCTTCCTACCCCTCACCCTAGCCCTATGCATATGACATGTCTCCCTACCTATTATCACAGCAAGTATTCCACCTCAAACAATTAAACCCC [...]
+ATTATCATCATATTAACCGTCATTTCTGGGACTATGATCGTATTAACAACCTCCCACTGACTTATGGTCTGAATTGGCCTTGAAATAAACCTGCTAGCCATCATTCCCGTCCTCATAAAAAAACATAATCCACGAGCCACAGAAGCAGCCACAAAATATTTCCTAACACAAGCAACTGCCTCAATACTCCTAATAATAGGAATCATCATCAACTTACTACACTCAGGACAGTGGGCCATATCAAAAAATCTTAACCCCGTAGCATCCGCCATAATAACAGCTGCCTTAGCAATAAAACTAGGACTAGCCCCGTTCCACTTCTGAGTGCCCGAAGTCACACAAGGAATCTCTATATCCTCAGGCCTGATCCTGCTCACATGACAAAAAATTGCACCCCTATCAGTCCTCTACCAAATCTCACCTACCATCAACCCCGACTTACTCCTAACAATAGCCACCATATCAATTGCAATCGGAGGCTGAGGAGGACTC [...]
+CCAATTACGAAAAATCATAGCATACTCCTCAATCGCCCACATAGGTTGAATAACAGCTATCATAGTATACAGCCCCACGATAATAATTCTAAACCTAATAATCTATATCACCATAACACTAGCCACCTTCATGCTATTTATACACAACTCCACTACAACAGTATCATCTTTATCACAAACATGAAATAAAACACCCCTGGTCACCCTACTTATTCTAACACTAATAATGTCCTTAGGCGGCCTTCCCCCACTCTCCGGCTTCATCCCAAAATGAATAATTATCCAAGAACTGACTAAGAACGAAATAATTATAATACCCACACTACTAGCTATAACAGCACTACTCAATTTATACTTCTATATACGACTAACATACACCACCACACTAACTATATTCCCCTCAAGCAACAACATAAAAATAAAATGACGATTCGAACATACAAAAAAAATAATCTTCTTGCCCCCTCTTATCGTAATTTCTACCATACTACT [...]
+CACCAATACTATCCATTCTGGATATAAACGTAATACTCGCCCTACTTACCAACACACTTTTATCCACGCTACTTGTACTCATCGCATTTTGATTACCCCAATCAAATATCTACGCAGAAAAAGTAAGCCCCTATGAATGTGGATTTGACCCCATGGGATCTGCTCGTTTGCCTTTCTCCATAAAATTTTTCTTAGTAGCTATTACATTCCTGCTATTTGACCTAGAAATTGCACTACTACTGCCCCTTCCTTGAGCCTCACAAACAAACAAACTACCAACTATACTCTCCATGGCTCTCCTACTAATCTCCCTGCTGGCCGCAAGTCTAGCCTATGAATGAACCCAAAAAGGACTAGAATGAACTGAAATGTCCACAGTCTATATTAACATCTTTTTGGCTTTCACTATGTCACTTATAGGACTGTTAATGTATCGATCTCACCTAATGTCCTCCCTCCTATGTCTAGAAGGTATAATATTATCCTTATTCA [...]
+ACCGTAGCAATCCTGAATAATCACTTCACACTAGCTAGCATAACTCCCATTATCTTACTAGTATTTGCAGCCTGCGAGGCAGCACTGGGCCTATCTCTACTAGTAATAGTATCAAACACATATGGCACCGACTACGTACAAAACCTAAATCTCCTACAATGCATTATTATTCCCACTGCCATACTCATACCAATGACATGACTATCAAAGCCCAATATAATCTGAATCAACTCAACTATTTACAGCTTACTAATTAGCCTTATCAGCCTATCCTATTTAAACCAACTAGGCGACAATAGCCTAAACTTCTCGCTACTGTTTTTCTCAGACCCACTCTCTGCACCTCTACTAGTACTAACAACATGACTCCTGCCACTAATACTTATGGCTAGTCAGTCGCACCTATCAAAAGAGACCCTGACCCGAAAAAAACTATACATCACAATACTCACTACCTTGCAGCTCCTCTTAATTATAACATTCACCGCCACA [...]
+TATATTTTACATCCTATTTGAAGCCACATTAATCCCTACTCTCATTATCATCACCCGATGAGGTAATCAAACGGAACGACTAAATGCTGGCTTATACTTTCTATTCTATACCTTGATGGGCTCTCTGCCCCTTCTAGTCGCATTATTATATATCCAAAACACAACAGGAACCCTAAATTTCCTAATCATTCAATACTGGGCCAAGCCAATCTCGACCACCTGATCTAATATCTTCCTCTGACTAGCATGCATAATAGCATTTATAGTAAAAATACCTCTATATGGCCTCCATCTATGACTACCAAAAGCCCATGTTGAAGCCCCCATTGCCGGCTCAATAGTACTTGCTGCCGTGTTGCTAAAATTAGGGGGATATGGAATAATGCGCATTACAATTCTACTTAACCCCACAACAAACCAAATGGCATACCCCTTCATAATGCTATCCCTGTGAGGAATAGTTATAACAAGCTCTGTCTGCTTACGCCAGAC [...]
+AATCCTTAATCGCATACTCATCTGTAAGCCACATAGCCCTGGTAATCGTAGCAGTACTAATTCAGACACCCTGAAGTTATATAGGAGCTACAGCCCTCATAATTGCCCACGGACTAACTTCATCAATACTATTCTGCCTTGCAAACTCAAACTATGAGCGAGTCCATAGCCGGACAATAATTTTAGCACGAGGCCTACAAACCATCCTTCCCTTAATGGCTGCCTGATGGTTACTAGCCAGCCTTGCAAATTTAGCCCTGCCTCCTACCATTAACCTAATCGGAGAGCTATTTGTAGTAATAGCCTCTTTCTCATGATCTAACATAACCATTATCCTCATAGGTACAAATATTATTATCACAGCCCTATATACTCTCTACATGCTTATCACAACTCAACGAGGCAAACATACGCACCACATTAAAAACATCAACCCATCATTTACGCGGGAGAATGCTCTAATAACCCTTCACCTACTTCCACTTCTTCTCC [...]
+AACCCTAAAACCGTACTAGGTCCTATTTACTGTAAAATAAAAGTAATAAACCTATTTACCTCTCTCACACTCACCGCAATGTTTATTCTACTCTTACCTATTATTATATCTAACACTCAATTATATAAAAACAGTCTATATCCCCACTATGTAAAAACTACAATCTCATATGCCTTTACCATCAGTATAGTTCCAACTATAATATTTATTTCCTCTGGACAAGAAACAATTATCTCAAACTGACACTGACTATCAATCCAAACCCTCAAGTTGTCACTAAGCTTTAAACTAGATTATTTCTCAATCATCTTTATCCCTGTGGCGCTTTTTGTCACATGATCTATCATGGAGTTCTCAATATGATACATGCACATAGACCCCTATATCAATCGATTCTTTAAATATCTCCTCATATTTCTAATCACCATGATAATTCTAGTAACAGCCAACAACCTATTTCAACTGTTCATTGGTTGAGAGGGAGTCGGGATC [...]
+CCTACTTATCGGGTGGTGATATGGCCGAGCAGACGCAAATACTGCCGCCCTACAAGCGATTCTCTATAACCGCATTGGAGACGTAGGTTTTATTACGGCCATAGCATGATTTCTCGCCAACCTAAATGCATGAGATTTCCAACAAATCTTTATCGTCCAACATGAAAACCTAAACATCCCACTGCTAGGACTTCTCCTTGCAGCCACAGGCAAATCCGCCCAATTTGGCCTACACCCATGACTACCATCAGCCATAGAAGGTCCGACCCCTGTCTCCGCCCTACTCCACTCAAGCACAATAGTTGTAGCTGGAGTTTTCTTATTAATCCGCTTTCACCCACTCACAGAACAAAATAAGACCATACAAACCCTCACTCTATGCCTGGGAGCTATCACAACCCTATTCACAGCCATCTGTGCCCTCACACAAAATGATATCAAAAAAATCGTTGCCTTCTCAACCTCAAGTCAACTGGGCCTAATAATCGTTAC [...]
+TCAATCAACCTTACCTTGCGTTTCTACATATCTGTACCCACGCATTCTTCAAAGCCATACTATTTATATGCTCGGGATCAATCATCCATAGTTTAAATGACGAACAAGACATTCGAAAAATAGGCGGACTGTACAAACCGATACCCTTCACCACCACCTCCCTCATTATTGGAAGCCTCGCACTAACAGGTATACCCTTCCTAACAGGCTTTTACTCCAAAGACCTAATCATCGAGACAGCCAACACGTCGTATACCAACGCCTGAGCCCTATTAATTACTCTCATTGCCACATCCCTTACAGCCGCCTACAGCACCCGAATTATGTTCTTCACACTCCTAGGACAGCCCCGATTCAACCCCTTGAGCCCAATCAATGAGAATAACCCCTACCTTATCAACTCCATTAAACGTCTCTTGATTGGAAGCATCTTTGCAGGATACCTGATTTCCTATAATATTCCCCCAACAACCATCCCGCAAATAACTATAC [...]
+CTAAAACTAACGGCCCTCGCCGTAACCATTACAGGCTTCATCCTAGCATTAGAACTCAACCTCGCGACTAAAAACTTAAAATTTAAATACCCCTCAAACCTCTTTAAGTTTTCTAGCCTCCTGGGGTACTTTCCAATCGTAATGCACCGGCTCCCATCAACAATAAGCTTAACTATAAGCCAAAAATCCGCATCGATACTACTAGATATAATCTGACTAGAAAATGTATTACCAAAATCCATCTCCTACTTCCAAATAAAAATATCAACTATTGTATCTAATCAGAAAGGATTAGTTAAGCTCTACTTCTTATCTTTCATAATCACCTTGACCCTCAGCTTACTCTTA??????CTTAATTTCCACGCG
+>Neophoca_cinerea
+ATGAACGAAAATCTATTCACTTCTTTCGCTTCCCCTACAATAATGGGTCTTCCAATCGTAACCCTAATTATCCTATTTCCAAGTGCACTATTCCCTTCACCAGGCCGACTGATCAATAACCGCTTCACCTCTATTCAACAGTGACTAGTCCAATTAACATCAAAACAAATAATAATAATTCACAATCACAAAGGACAAGCGTGGACATTAATACTTATATCGCTTATTATATTTATTGGGTCTACCAATCTACTGGGCCTGCTACCGCACTCATTTACTCCCACTACCCAACTGTCCATAAACCTAGGAATGGCCATCCCCCTATGAGCAGGAGCAGTTGCTATAGGGTTACGACACAAAACTAAAGCATCCTTGGCCCACTTCCTGCCCCAAGGGACACCCTCCCCTCTTATCCCAACATTAGTAATCATTGAATCTATTAGCCTATTTATTCAACCCATAGCCCTAGCCGTGCGACTGACAGCCAACATT [...]
+TCACCTACTAATTCACCTAATCGGTGGAGCTACCCTAGCCCTCACTAACATCAGTATAATTGCGGCCCTTATCACTTTCATTATCCTCGTCTTACTCACAGTCCTTGAGTTTGCTGTAGCCTTGATCCAAGCCTACGTCTTCACTTTACTAGTAAGCCTATACTTACACGATAACACCTAAATGCCACAACTAGACACATCAACATGATTCACTACAATCGTATCCATGATCCTAACACTATTTATCGTGTTCCAATTAAAAATTTCCAAACACCACTTCCCAATGAGCCCAGAATTGAAACCATTATCGGCACCAAAAACAAATATCCCTTGAGAAAAAAAATGAACGAAAATCTATTCACTTCTTTCGCTTCCCCTACAAATGTTCGTAAATCGATGATTATTCTCTACAAACCATAAAGATATTGGCACCCTCTATCTACTATTCGGTGCATGAGCCGGAATAGCTGGCACCGCCCTCAGCCTATTGAT [...]
+AGTTAGGCCAACCAGGCACTCTACTAGGAGATGACCAAATCTACAACGTAATTGTCACTGCCCACGCATTCGTAATAATCTTCTTCATGGTAATACCTATTATAATTGGAGGCTTCGGAAATTGATTGGTGCCCCTGATAATTGGAGCTCCCGACATGGCATTTCCCCGAATAAACAACATAAGTTTCTGACTTCTACCCCCCTCCTTCCTACTACTACTAGCCTCTTCCCTAGTTGAAGCCGGCGCAGGTACCGGATGAACGGTTTACCCTCCCCTAGCAGGGAACCTAGCCCACGCAGGGGCTTCCGTAGACTTGACTATTTTCTCCCTTCACCTGGCTGGAGTGTCATCTATTCTAGGAGCCATTAACTTTATTACCACTATTATCAACATGAAACCCCCTGCTATGTCCCAATACCAAACCCCCCTATTCGTGTGATCCGTACTAATCACAGCGGTACTACTTCTGCTGTCCCTACCAGTCCTAGCAG [...]
+ACTATATTACTTACGGACCGAAATCTAAATACAACCTTTTTTGATCCAGCCGGAGGGGGTGACCCTATCCTATATCAACACCTATTCTGATTCTTCGGACATCCAGAAGTATATATTCTTATTTTGCCAGGATTCGGTATAATCTCACATATCGTCACCTATTACTCAGGAAAAAAAGAACCCTTCGGCTATATAGGAATAGTCTGAGCAATAATATCCATCGGCTTCCTAGGCTTTATCGTATGAGCACATCACATATTCACCGTAGGAATGGATGTTGACACGCGAGCATACTTCACCTCAGCCACTATAATTATCGCTATCCCTACAGGAGTAAAAGTATTTAGCTGGCTAGCTACTCTGCATGGTGGCAATATCAAGTGGTCTCCCGCTATACTATGAGCCCTAGGATTCATTTTCCTATTCACAGTAGGGGGCCTCACAGGCATTGTGTTAGCAAATTCATCATTAGATATCGTCCTCCACGATACA [...]
+AGTAGCACACTTCCATTACGTGTTATCAATAGGAGCAGTGTTTGCTATCATGGGCGGATTCGTCCATTGATTCCCTTTATTTTCAGGATTCATGCTCGATAATACCTGAGCGAAAATCCACTTCACAATCATATTCGTTGGAGTCAATATAACATTCTTCCCACAACATTTTCTAGGCCTATCCGGAATACCACGGCGATATTCTGATTACCCAGACGCTTACACAACATGAAATACAATCTCCTCTATAGGCTCGTTCATCTCACTTACGGCAGTAATACTAATGGTCTTCATAATCTGAGAGGCTTTTGCATCTAAACGAGAAGTAGAGACGATTGAGTTGACATCGACTAATATGGAATGACTTCACGGATGTCCTCCTCCCTATCACACATTCGAAGAACCTACCTTCATCATATTGAAAATGGCATACCCCTTTCAGATAGGCCTCCAAGATGCAACCTCCCCTATCATAGAGGAACTAACACACTT [...]
+ACACACTAATAATCGTATTCCTAATTAGCTCTCTAGTACTTTACATTATCTCAACTATACTTACCACGAAATTAACACACACATGCACAATAGATGCCCAAGAAGTAGAAACAGTATGAACAATTTTACCAGCTATCATTTTAATCATAATTGCCTTACCCTCACTTCGAATCCTTTATATTATAGACGAAATCAACAACCCTTCTCTAACTGTAAAAACTATAGGACACCAATGGTATTGAACCTATGAATATACCGACTATGAAGACCTAAACTTTGACTCTTACATAATCCCTACACAGGAACTAAAGCCTGGCGAGCTACGACTATTAGAAGTAGATAACCGAGTCGTACTACCCATAGAAATGACAATCCGCATGCTAATTTCATCAGAAGACGTACTTCACTCATGAGCCGTACCGTCTCTAGGACTAAAAACCGACGCTATCCCGGGACGATTAAACCAAACCACCTTAATAGCTATACGACCAG [...]
+TACGGTCAATGCTCAGAAATCTGTGGTTCTAATCATAGCTTTATACCCATCGTTATTGAATCTGTCCCATTATCTTACTTCGAGAAATGGTCCGCCTCAATACTTATGACACACCAAACCCATACGTATCATATAGTCAACCCTAGCCCTTGACCGTTAACAGGGGCCCTATCAGCCCTCCTTATAACCTCAGGCCTAATCATATGATTCCACTTTAACTCAATCCATCTCCTATTACTGGGTCTTATAACCAATATTCTAACTATGTGTCAATGATGACGAGATGTAGTCCGGGAAAGCACATTCCAAGGCCATCACACCCCAACTGTCCAAAAGGGCCTACGGTATGGCATAATTCTTTTTATCGTATCCGAAGTGTTCTTTTTCGCAGGATTTTTCTGAGCCTTCTACCATTCCAGCCTAGCACCCACCCCCGAACTAGGAGGATATTGACCCCCCGCAGGAATCACACCTCTAAACCCACTAGAAGTT [...]
+TAATACCTCAGTACTATTAGCATCGGGCGTATCAATCACCTGAGCCCACCACAGCTTAATAGAAGGAAATCGTAAACATATGCTTCAAGCCCTATTTATCACCATCCTCCTAGGCCTCTATTTCACACTTCTACAAGCCTCAGAATACTACGAGACCCCTTTTACAATCTCCGACGGAGTTTATGGCTCCACTTTCTTCATAGCTACAGGATTCCACGGACTACACGTAATTATCGGCTCAACCTTCCTAGCCGTATGCTTCCTGCGACAATTAAAATTCCATTTCACATCTAACCATCACTTCGGATTTGAAGCCGCCGCCTGATACTGACACTTTGTAGATGTCGTATGACTATTCCTATATGTATCTATTTATTGATGAGGATCATGTATGACCAACATTCGAAAAACACATCCACTGGCCAAAATCATCAACAACTCACTCATCGACCTACCCGCACCATCTAATATCTCAGCATGATGAAACTTCGG [...]
+TCGCAGTATGCTTGGCCTTACAAATCCTAACAGGCCTTTTCCTAGCCATACACTACACCTCAGACACCACCACAGCCTTTTCATCGGTCACCCACATTTGCCGAGACGTGAACTACGGCTGAATTATCCGGTATATGCACGCAAATGGAGCCTCTATATTCTTTATCTGCCTCTACATACATGTGGGACGAGGACTATACTATGGATCCTACACACTAACAGAAACATGAAACATTGGCATCATCCTCCTATTTACGATTATAGCCACAGCATTCATGGGCTATGTTCTTCCATGAGGACAGATATCATTCTGAGGGGCAACCGTCATTACCAACCTCCTATCAGCGGTCCCTTACATCGGGACTAACCTGGTAGAATGAATCTGAGGAGGGTTTTCAGTCGATAAAGCAACCCTAACACGATTCTTCGCCTTTCACTTTATTCTCCCCTTCATAGCATCGGCACTAGTAATAGTACACCTCCTATTCCTAC [...]
+GGATCCAATAACCCATCAGGAATCTCCTCCGACTCAGACAAAATTCCATTCCACCCATATTATACAATTAAAGATATCCTAGGAACCCTTTTTCTAATCCTAATTTTAATATTACTAGTAATATTTTCGCCAGATCTATTGGGAGACCCAGACAACTATATCCCAGCCAACCCCCTCAGCACTCCGCCACACATCAAACCCGAATGATATTTTCTATTCGCCTATGCCATTTTACGATCCATCCCCAACAAATTAGGAGGAGTCCTAGCCCTGCTCCTATCAATCCTAATCCTGGCTATCGTCCCACTACTTCACACGTCAAAACAACGAGGAATAATATTCCGACCCATCAGCCAATGCCTCTTCTGACTTCTAGTAGCAGACCTACTCACACTAACATGAATCGGAGGACAACCAGTTGAACACCCCTTCATCACTATCGGCCAACTAGCCTCAATCCTGTACTTCGCAATTCTCCTAATTCTTATACCC [...]
+CATTATCGAAAATAATATCCTAAAATGAATGATTATAATTAATATCCTCTCACTAATCATCCCAATCCTCCTAGCCGTAGCCTTCCTGACACTAGTAGAGCGAAAAGTACTAGGCTATATACAACTCCGAAAAGGCCCCAACATCGTAGGACCCTACGGGCTCCTACAACCAATTGCAGACGCCGTAAAATTATTCACCAAAGAACCCCTACGACCACTCACTTCCTCTACATCCATATTTATTACAGCCCCCATCCTGGCCCTAACCCTAGCTCTAACTATATGAATCCCACTACCCATACCATACCCTCTCATCAACATAAACCTAGGAGTCCTGTTTATACTAGCAATGTCAAGTTTAGCTGTTTACTCAATCCTATGAGCTGGGTGAGCATCAAATTCAAAATATGCATTAATTGGGGCCCTACGAGCCGTAGCCCAGACCATTTCATATGAAGTAACCCTAGCCATTATTCTCCTGTCAGTACTTCT [...]
+GGTCTTTCACCCTACCCACACTAATCACCACCCAAGAACACCTATGACTGATCTTCCCAACATGACCCCTAGCCATGATATGATTTATCTCCACCCTAGCAGAAACCAATCGTGCCCCGTTCGACCTAACAGAGGGAGAATCAGAACTAGTTTCAGGGTTCAATGTAGAGTACGCAGCAGGCCCATTCGCCCTATTTTTCCTAGCGGAATATGCCAACATTATCATAATAAATATCCTCACAACTACCCTATTCCTCGGGGCATTCCACAGTCCATATATACCCGAATTATATACCATCAACTTCACCTTAAAAACACTAACACTGACAATCCTATTCCTATGAATCCGGGCATCATACCCCCGATTCCGCTACGACCAGTTAATGCACCTCCTATGAAAAAATTTTCTGCCCCTCACACTAGCCCTATGCATATGACACATAGCCCTACCCGTAATTACAGCTAGCATTCCCCCTCAAACGATAAAACCCC [...]
+ATCATAATTATAGCAACCGTCGTATCAGGAACCATAATTGTCTTAACAAGTTCTCATTGACTAATAATCTGAATTGGGTTCGAAATAAACATGCTAGCAATTATCCCAATTCTGATGAAAAACTTCAACCCCCGAGCCACAGAAGCTTCCACAAAATACTTTCTAATCCAAGCCACCGCATCCATACTCCTAATACTAGGCATTATTATTAACCTAACAACCTCAGGACAATGGACAATTTTAAAGTCCCTAAACCCAATAGCATCAAATCTCCTAACTATCGCTCTAGCAATAAAACTTGGAATAGCTCCATTTCACTTCTGAGTGCCCGAAGTAACACAAGGAACCCCACTATCATCAGGCATGATTCTACTCACATGACAAAAAATCGCGCCCCTGTCCGTTCTTTACCAAATTGCACCGTCAATCAACCCAAACCTACTAATCACCATAGCAATCACATCAGTACTAGTAGGGGGATGAGGAGGATTA [...]
+CCAGCTCCGAAAAATTCTAGCCTATTCATCAATCGCTCACATAGGATGAATTACCATTATCATAATATATAATCCTACCCTAATACTCCTGAACCTGACAATCTACATCACCATAACACTTGGAACATTCATACTATTTATATATAATTCATCCACAACGACACTATCACTATCCCACACATGAAACAAATCACCCCTCATAACATCCCTAATCCTAGTACTTATACTATCACTTGGAGGACTTCCCCCATTGTCGGGCTTCGTACCCAAATGACTAATTATCCAAGAACTAACAAAAAATGACATAATCATTCTACCAACATTCATGGCTATCACAGCACTATTAAACCTGTACTTCTACATACGATTATCTTACACCACAGCACTAACACTATTTCCCTCAACAAACAATATAAAAATAAAATGACAGTTCGAAAACACAAAAAAGATAGCCTTACTATCCCCACTAATCATTATCTCAACAATAATACT [...]
+CACCAATAATATCTATCCTGGATATAAACATAATTCTAGCCCTACTCACCAACACAATCCTAGCCTCTTTACTTGTACTAATCGCATTCTGACTCCCCCAACTAAATATTTACTCGGAAAAAGCCAGCCCTTACGAATGTGGATTTGACCCCATAGGATCAGCACGTCTGCCTTTCTCCATAAAATTTTTCCTAGTAGCCATTACATTCCTACTATTCGATCTAGAAATCGCACTACTACTACCCCTCCCGTGAGCATCCCACGCAAACAACCTATCAACCACTCTCACTATAGCACTCACATTAATCTCTCTACTAGCCGCAAGCCTAGCTTACGAATGAACCGAAAAAGGACTCGAATGAACAGAAATGTCCATAGTATACTTTAATATCCTTATAGCCTTCTCCGTATCTTTCGTAGGACTACTCATGTATCGATCCCACCTCATATCCTCCCTACTTTGCCTAGAGGGTATAATACTATCACTATTCG [...]
+TCGATAACAGTTCTAAATAACCATTTTACACTAGCCAGCATAGCTCCCATCATCCTGCTCGTATTCGCAGCTTGTGAAGCAGCCCTAGGACTATCCCTCTTAGTAATAGTATCTAACACATACGGAACTGACCACGTACAAAACCTGAACCTCCTACAATGCATCATCATCCCCACCATCATACTAATACCCGTAACATGAATATCAAAACCCCATATAATTTGAATTAATACAACAACCTATGGCCTACTAATTAGCCTCACCAGTCTACCACTCCTAAATCAACTCAACGACAACAGCCTAAACTCATCATTATTGTTTTTCACGGACTCCTTATCGGCTCCCCTCCTAACACTTACCACATGACTTCTACCCCTGATACTTATAGCCAGTCAATTTCACTTATCAAAAGAACCGCTGGCCCGAAAAAAACTTTATATTACAATACTAATCCTTCTACAGCTATTTCTAATCATGACATTTACTGCTACA [...]
+CATATTCTACATTTTATTCGAAGCGACTCTAGTACCCACACTAATTATCATCACCCGATGAGGTAACCAAACAGAACGCCTAAACGCAGGACTATATTTCCTATTTTATACCCTAATAGGATCACTACCCCTACTAGTAGCATTACTGTATTTACAAAACAATATAGGCACACTAAACTTCCTAATAGCCCAATACTGAACCCAGACCCTACCAAACTCCTGATCCAATATTCTCCTATGATTAGCGTGCATGATGGCATTTATAGTAAAAATACCCCTTTATGGACTTCACCTATGACTTCCCAAAGCGCATGTAGAAGCCCCTATCGCCGGATCCATAGTACTTGCCGCCGTACTTCTAAAACTAGGAGGTTACGGCATAATACGAATCACCATCCTGCTTAGTCCCCTGACAAGCTTTATAGCGTACCCCTTTATAATACTATCAATATGAGGGATAATTATAACAAGCTCCATCTGTCTACGCCAAAC [...]
+AATCACTAATCGCATATTCTTCCGTAAGCCACATAGCCCTAGTAATTGTAGCTATCCTTATCCAAACACCATTAAGCTATATAGGCGCAACCGCCCTAATAATCGCCCACGGCCTTACATCATCTATACTATTCTGCTTAGCTAACTCTAATTATGAACGCACCCACAGCCGAATCATGATCCTTGCACGCGGCCTACAAACTCTGCTACCACTAATAGCGGCATGATGACTATTAGCAAGCCTAACCAATCTAGCACTACCCCCTACAATTAATCTAATCGGAGAATTACTCGTAGTAATAGCTTCATTCTCATGATCTAACGCTACCATTATTCTTATAGGAACAAACATCATTATCACCGCCCTGTATTCCCTATATATACTTATTACAACACAACGTGGAAAACACACCCACCACATCAAAAACATTAAACCTCCGTTTACACGAGAAAACACTCTAATAATACTCCACCTTACACCACTACTACTAC [...]
+AACCCTAAAATAATTCTAGGACCCCTTTACTGTAAAGTAAAAGTAATTAATTTATTCACCCCCTTTATTATTACAACACTATTTATACTCACTATACCAATCATCCTGACCAGCACTCCAATCTACGAAAACAAATTCTATCCACAGTACGTGAAAACTATCGTCTCCTACGCCTTCATAACCAGTATAATCCCCACAATAATATTCATCTCCTCAGGACAAGAAATAATCATCTCAAACTGACATTGAATGACTATTCAAACCATAAAATTATCACTAAGCTTCAAACTGGATTATTTCTCGATAATCTTCATACCCGTGGCCCTATTCGTCACATGGTCCATCATAGAATTTTCAATATGATACATATCCTCAGATCCTTACATCAACCGATTCTTCAAGTATCTATTAATATTCCTCATCACCATGATAATCTTAGTTACCGCGAACAACCTATTCCAATTATTCATTGGCTGGGAAGGGGTAGGCATT [...]
+CCTACTCATCGGATGATGACACGGACGGTCAGATGCAAACACAGCCGCCCTTCAAGCAATCCTTTACAATCGCATCGGAGATGTGGGCTTCATCATAACTATAGCATGATTCTTAACCAATCTAAACACATGGGACCTCCAACAAATTTTCATAATCCACTATAACGACCTAAACATACCACTCATAGGTCTCCTACTAGCGGCAACTGGCAAATCAGCCCAATTTGGCCTACATCCATGACTACCCTCAGCCATAGAAGGACCCACACCGGTATCAGCTCTATTGCACTCAAGCACTATGGTAGTAGCTGGAGTATTTTTACTGATCCGATTCCACCCTTTAATAGAACATAACACAGTGATACAGACAATTACCCTATGCTTAGGAGCCATCACCACATTATTCACAGCGATATGCGCTCTTACCCAAAATGATATCAAAAAAATCATTGCATTCTCGACTTCAAGTCAACTAGGATTAATAATCGTCAC [...]
+TTGGCCAACCATATCTAGCATTCCTACACATCTGTACCCATGCGTTCTTTAAAGCCATGCTATTTTTATGCTCCGGATCCATCATCCATAACCTAAACAACGAACAAGATATTCGAAAAATAGGAGGCCTATTCAAACCAATACCATTCACCACTACCTCACTAATTATTGGCAGCCTAGCACTTACAGGCATGCCATTTCTCACAGGATTTTACTCCAAAGACCTAATTATCGAAACCGCCAACACATCGAACACCAACGCCTGAGCCCTGCTTCTAACCCTCATAGCCACATCTATAACAGCTGCCTACAGCACCCGAATAATATTCTCCACACTTCTGGGACAGCCCCGATTCAACTCTACAGTCACAATAAACGAAAATAATCCACTATTAATCAACCCCATTAAACGTCTACTACTCGGAAGCATCTTCGCAGGATACCTAATAACCCTCAACACTCCACCCATAATGATCCCACAACTAACCATAC [...]
+CTAAAACTCACAGCCCTAGCCATAACACTACTAGGTTTTACACTGGCCCTAGAACTCAGCACAACCTCACTAAACCTTAAATTCAGTCACGCGTCAAACCTGTCCAAGTTCTCGAACCTCCTAGGATATTTCCCCACTATCACCCACCGTTTAGTACCAATGATAAACCTAGCAGTAAGCCAAAAGCTAGCCTCCACATTAATAGACATAGTCTGACTAGAATATCTATTACCAAAATCTATTTCCCACCTAAACATAAAATCATCAATCACCATTTCTAACCAAAAAGGCCTAATTAAACTATATTTCTTGTCCTTCATGATTACCCTAACCCTGGCCCTAATCCTAACAACAGCTAATTCCCACGAG
+>Odobenus_rosmarus
+ATGAACGAAAATCTATTTACCTCTTTCACTTCCCCTACCATAATGGGCTTCCCTGTCGTGATATTAATCATTCTATTCCCAAGTATCATATTCCCCTCACCTGACCGATTAATTAATAATCGCCTCGCCTCAATTCAACAATGACTAATCCAACTAACATCAAAACAGATAATATCCATTCATAATCATAAAGGACAAACATGAACATTAATACTCATATCACTCATTATATTTATTGGATCTACCAACCTGCTGGGCCTTCTACCACACTCATTTACCCCTACTACTCAACTATCAATAAACCTGGGGATAGCCATCCCCCTGTGAGCAGGAGCAGTTATTACAGGATTCCGATATAAAACTAAAGCATCCTTAGCCCACTTCCTCCCTCAAGGAACACCTCTTCCTCTTATCCCTATGTTAGTGATCATCGAGACCATCAGCCTATTCATCCAACCAATCGCTTTAGCCGTGCGATTAACAGCCAACATT [...]
+TCACCTATTAATACACCTGATTGGAGGAGCTACCCTCGCCCTAACCAATATCAGCATAACCACAGCCCTCATCACCTTTATTATTCTCATTCTACTCACCATTCTTGAATTTGCTGTAGCCCTAATTCAGGCCTACGTCTTTACCTTACTAGTAAGCCTGTACTTACACGACAACACCTAAATGCCACAGCTAGACACATCAACGTGATTCACTGTAATTGTATCCACGATTCTAACTTTATTCATCGTATTCCAATTAAAAATTTCAAAACACTCCCTTCAAACGAGTCTAGAACTGAAATCAACACTACCACTGAAGACCAACGCACCATGAGATAAAAAATGAACGAAAATCTATTTACCTCTTTCACTTCCCCTACCAATGTTTATAAATCGATGACTATTCTCCACAAATCACAAGGACATCGGCACTCTCTATTTATTATTCGGCGCTTGGGCCGGAATGGCTGGTACTGCCCTCAGCCTGTTGAT [...]
+AACTAGGTCAACCTGGCACTCTATTAGGGGACGACCAAATCTACAACGTAATTGTCACCGCCCATGCATTCGTAATAATCTTCTTCATAGTTATACCCATCATAACCGGAGGTTTTGGAAACTGATTAGTTCCCCTAATAATCGGAGCCCCCGACATAGCATTTCCTCGGATAAACAATATAAGCTTTTGACTATTGCCACCTTCTTTTCTACTACTATTGGCTTCATCCATGGTAGAGGCGGGAGCGGGAACCGGATGAACCGTCTACCCTCCTCTTGCAGGTAACCTAGCTCACGCAGGACCATCCGTGGACCTGACAATTTTCTCTCTTCACTTGGCAGGGGTATCATCCATTCTAGGGGCCATTAACTTTATCACAACCATTGTCAATATAAAACCTCCCGCAATATCCCAATACCAGACGCCCTTATTTGTATGGTCCGTATTAATTACAGCGGTACTACTGCTGCTATCACTACCAGTAGTGGCGG [...]
+ACTATGCTGCTCACAGACCGAAATCTGAATACAACTTTCTTTCATCCGTCCGGAGGAGGAGACCCCATCTTGTATCAACACCTATTCTGATTCTTTGGACATCCCGAAGTATATATCCTCATTCTACCAGGATTCGGAATAATTTCACACATCGTCACCTACTACTCAGGAAAGAAGGAGCCTTTTGGCTATATAGGAATGGTCTGGGCGATAATATCTATTGGCTTCTTAGGCTTTATCGTATGAGCACATCATATATTCACTGTAGGGATAGATGTTGACACACGAGCATACTTTACCTCAGCTACCATAATCATCGCAATTCCGACAGGAGTCAAAGTATTTAGCTGACTAGCTACTTTACATGGAGGTAACATCAAATGATCGCCTGCCATACTATGGGCCCTGGGATTTATCTTTCTATTTACGGTAGGAGGCCTTACGGGCATTGTACTGGCAAACTCATCACTGGACATCGTCCTCCATGACACA [...]
+GGTAGCACATTTCCACTATGTGCTATCAATAGGAGCGGTGTTTGCCATTATGGGTGGGTTCGTCCATTGATTCCCTCTATTTTCAGGGTTCACACTTAATAACACCTGAGCAAAAATCCATTTCACAATCATATTTGTTGGAGTTAACATGACATTCTTTCCCCAACACTTTTTAGGACTATCAGGAATACCACGGCGATATTCTGATTACCCAGATGCCTATACAGTATGAAACACGGTCTCTTCTATGGGTTCATTCATTTCACTAACCGCAGTCATACTAATAGTCTTCATAGTCTGAGAGGCCTTCGCATCCAAACGAGAAGTAGAAGCAGTTGAATTAACGTCTTCTAATATCGAATGACTGCATGGATGTCCTCCCCCATATCATACATTTGAAGAACCTGCTTACGTTATATCAAAGATGGCGTATCCCCTTCAAATAGGCCTCCAAGATGCAACCTCTCCTATCATGGAAGAACTACTACACTT [...]
+ACACACTAATAATCGTATTCTTAATCAGCTCGCTAGTGCTCTACATTATTTCAACTATACTAACCACAAAATTAACTCACACGAACACTATAGACGCACAAGAAGTAGAAACCGTATGAACCATTCTACCAGCCATCATTTTAATTATAATCGCTTTACCATCACTACGAATCCTATATATAATAGATGAAATCAACAGTCCTTTTCTAACCGTGAAGACTATGGGACATCAGTGGTACTGAAGTTACGAATACACCGACTATGAAGACTTAAGTTTCGACTCCTATATAGTACCAACACAAGAATTAAAGCCTGGAGAACTACGACTGCTAGAAGTAGACAATCGAATAGTACTACCAATAGAAATAACAGTTCGTATACTAATCTCATCAGAAGATGTCCTCCACTCATGAACTGTCCCGTCTTTAGGATTAAAGACCGATGCTATCCCAGGACGATTAAACCAGACTACCTTAATAGCTATGCGACCAG [...]
+TACGGTCAATGCTCAGAAATTTGTGGCTCAAACCATAGCTTCATGCCCATCGTCCTTGAATCAGTCCCATTGTCTTACTTTGAGAAATGATCAGCCTCAATTCTTATGACACACCAAACCCATACATATCATATAGTCAACCCTAGTCCATGGCCACTAACAGGAGCCCTTTCAACCCTACTCATGACATCAGGCCTAATTATGTGATTTCACTTCAACTCAACTCACCTACTACTCCTGGGTCTTATAACCAGTGTGTTGACCATATGCCAATGATGACGAGACATTGTACGAGAAAGCACATTCCAAGGCCATCACACACCAACCGTGCAAAAAGGTCTTCGATATGGCATAATCCTCTTCATTACATCAGAAGTGTTCTTTTTCGCCGGCTTTTTCTGAGCATTCTATCACTCCAGTCTAGCTCCTACTCCCGAACTAGGGGGATGTTGACCACCTACGGGTATTACACCCTTAAACCCATTGGAAGTC [...]
+CAACACCTCAGTGCTATTAGCTTCAGGCGTATCAATTACCTGAGCTCACCTCTGCCTAATGGAAGGAAACCGCAAGCATATACTCCAAGCACTATTCATCACTATCCTCTTAGGCCTGTATTTTACGCTTCTACAGGCTTCAGAGTACTATGAAACTTCTTTCACAATTTCAGATGGGATTTATGGCTCTACATTCTTCGTAGCCACAGGATTTCATGGCCTCCACGTAATCATCGGCTCAACTTTCCTAATTGTATGCTTCCTACGACAACTGAAATTCCACTTCACATCTAATCACCATTTCGGGTTTGAAGCCGCTGCCTGATACTGACACTTTGTAGACGTCGTGTGATTATTCCTATATGTATCCATTTATTGATGAGGATCTTGCATGACCAACATTCGAAAAACCCACCCACTAGCTAAAATCATCAACAACACATTTATCGACTTACCCACACCATCAAACATCTCGGCGTGATGGAACTTCGG [...]
+TCGCTACTTGCTTAATTCTACAAATCCTAACGGGCCTATTTCTAGCCATACACTATACTTCAGACACCACCACAGCTTTCTCATCAATCACACATATCTGCCGAGATGTCAACTATGGTTGAATCATTCGATATATACACGCAAATGGAGCTTCTATATTTTTCATCTGCCTCTATGCACACATAGGGCGGGGAATCTACTACGGCTCCTACACCCTCGCAGAAACATGGAACATCGGTATCGTATTATTACTCACTATTATAGCCACAGCATTTATAGGCTATGTATTACCATGAGGACAAATATCCTTCTGAGGAGCAACCGTCATCACCAACCTTCTGTCAGCAATTCCCTATGTAGGGACTGACTTGGTCGAATGAGTCTGAGGGGGGTTTTCAGTTGATAAAGCAACCCTAACACGATTCCTCGCCCTCCACTTCGTTCTTCCATTCATGGCATTAGCACTAACAGCAGTACACCTACTATTTCTCC [...]
+GGATCTAACAACCCTTCGGGAATCCTATCTGACTCAGACAAAATCCCATTTCACCCGTACTACACAATTAAAGATATCCTAGGGCTCATCATTCTAATCCTAATCCTAATACTACTAGTACTATTCTCACCAGATTTACTGGGAGACCCGGACAATTACACCCCAGCCAACCCTCTCAGCACCCCACCCCATATCAAACCCGAATGATATTTCCTATTCGCCTACGCTATCCTCCGATCTATTCCCAACAAACTCGGGGGAGTACTAGCTCTACTCCTATCCATCCTAGTCCTGGCTATTGTTCCGTCTCTCCACACATCGAAACAACGGAGCATAATATTCCGACCAATTAGTCAATGCCTGTTCTGACTACTAGTAGCTGACCTCATCACATTAACATGAATCGGAGGACAACCAGTCGAACACCCATTCATCATCATCGGCCAACTAGCCTCAATTCTATACTTTATAATTCTACTAGTATTTATGCCT [...]
+TATAATCGAAAACAGTATCTTGAAGTGAATGTTTATAATTAATATTCTCTCACTAATAATCCCCATTCTTCTAGCCGTAGCCTTCCTAACTCTAGTAGAACGAAAAGTACTAGGTTACATACAACTCCGAAAAGGACCCAACATTATAGGACCATACGGACTTCTCCAACCCATCGCGGATGCCATAAAACTTTTTACCAAGGAACCTTTACGACCATCAACTTCCTCCACATCAATATTCATCATAGCCCCTATTCTGGCCCTATCCCTAGCCCTAACCATATGGGCCCCACTACCTATACCGTACCCTCTCATCAATATAAACCTAGGAGTACTATTTATACTAGCAATATCAAGCCTAGCCGTCTATTCAATTCTATGATCCGGATGAGCATCGAATTCAAAATACGCTCTCATCGGAGCCCTACGAGCTGTGGCTCAAACCATCTCCTACGAAGTAACCCTAGCCATCATTCTCTTGTCCGTACTACT [...]
+GATCATTCTCTTTAACCACACTAATTACTACTCAAGAACATCTCTGACTTATTTTCCCCGCATGACCCCTAGCTATGATATGATTTATCTCCACTTTAGCAGAGACCAATCGTGCCCCCTTTGATCTAACCGAAGGAGAATCAGAATTAGTATCAGGCTTCAACGTAGAATATGCAGCAGGCCCATTCGCCCTATTCTTCCTGGCAGAATACGCCAACATTATTATAATAAATATATTCACAACCACTCTATTTCTTGGAGCATACCACAATCCTTGCATGCCTGAACTATATACCATCAACTTCACACTAAAAACTCTAGCACTGACAACCTTATTCCTATGAATTCGGGCATCATACCCACGATTTCGTTATGACCAACTCATACACCTCTTATGAAAAAACTTTCTACCTTTAACACTAGCTCTATGCATATGACACATGGCTCTGCCCATCATCACAGCAAGTGTTCCTCCACAAACCATAAAACCCC [...]
+ATTACAATCATAACAACCATAATATCAGGAACCATAATCGTCTTAATAAGTTCCCACTGACTAATAATTTGAATTGGATTCGAAATGAATATACTAGCTTTCATTCCTATCCTAATAAAAAATTTCAACCCACGAACCATGGAAGCATCCACAAAGTACTTCCTGACCCAGGCCACTGCATCAATACTATTAATATTAGGCATTACCATTAACTTGATACTCTCAGGACAATGAACAGTACTAAAACCTTCTAATCTAACATCATCAAGCCTTATAACCATCGCTTTGGCAATAAAACTCGGAATATCCCCATTCCACTTCTGAGTACCTGAAGTCACTCAAGGAACCTCACTACCCTCAGGCATAATTTTACTCACATGACAAAAAATCGCACCCCTATCAATCCTCTACCAAATCGCACCATCCATTAACTCCGGACTGCTAGCCACCATAGCAATCGCATCAGTACTAGTTGGAGGCTGAGGAGGACTA [...]
+CCAACTTCGAAAAATTCTAGCCTATTCATCAATTACCCACATAGGATGAATGGCCATCATCATAATATACAACCCTACCCTAACACTCCTAAACCTAGCAATCTACATCACTATAACACTCGGAACATTTATACTATTTATCCACAACTCATCCACAACAACTCTATCCCTATCCCACACATGAAACAAACTACCTCTCATGACATCCATAATCTTAATACTAATATTATCACTCGGAGGTCTTCCCCCTCTCTCAGGATTCGTACCCAAATGAATAATCATTCAGGAATTAACAAAAAATGACATAATTATTCTACCAATGTTCATAGCCATATCCGCACTGCTGAACTTACACTTCTACATACGCTTATCTTACACTACAACACTAACAATATTCCCATCAACTAACAACATAAAAATAAAATGACAATTCGAAAGCATAAAAAAGACGGTCCTCCTGCCTCCACTGATTATTCTCTCTACCATACTACT [...]
+CTCCAATAATAATCATCTTAGACATAAATATAATTCTAACCTTACTCACTAATACAGCTCTAGCCTCCCTACTCATGCTGATCGCATTCTGACTCCCCCAATTAAATACTTACTCAGAAAAAGCCAGCCCTTATGAGTGTGGATTTGATCCTATGGGATCAGCACGCCTACCTTTCTCCATAAAATTCTTCTTAGTGGCCATCACATTTCTGTTATTCGATCTAGAAATCGCACTTCTTCTACCTCTCCCGTGAGCATCACACGCGAATAATATAACTACCGTACTCACCACAGCACTCATGCTAATTTCTCTTCTAGCTGCAAGCCTGGCCTATGAGTGAGCCGAAAAAGGACTTGAGTGAACAGAAGTGTCCATAGTATATGCTAATATCTTTATAGCCTTTGTCGTGTCTTTAATAGGAATGCTCGTATATCGATCTCACCTAATATCTTCCCTACTCTGCCTGGAAGGCATAATACTGTCCCTATTTG [...]
+TCAGTAACAATCCTGAATAACCACTTCACACTGGCTAATATGGCACCCATTATCCTACTCGTATTTGCCGCCTGCGAAGCAGCCCTGGGATTATCACTCCTAGTAATAGTATCTAACACATACGGAACCGATTACGTACAGAACTTAAACCTCTTACAATGCATCATCATTCCCACTATTATACTAATACCCCTTACATGAATATCAAAACCCAACATGATCTGAATTAACACAACGGCCTATAGTCTACTAATTAACCTTATTACTCTTTCATTTCTCAATCAATCTAACGATAATAACTTAAACCTATCCCTATTATTCTCCACAGACTCTCTCTCGACCCCTCTCCTAGCACTCACAACATGACTCCTACCCTTGATACTTATAGCCAGCCAGCATCACCTATCAAAAGAACCACTAACTCGAAAAAAACTATACATTACAATATTAATCTCCTTGCAACTACTCTTAATCATGACCTTCACCGCTACA [...]
+TATATTCTACATCCTATTTGAGGCAACTCTAGTGCCTACACTAATTATCATTACCCGATGAGGAAACCAAACAGAACGTTTAAACGCAGGACTATATTTTCTGTTTTATACACTAACAGGATCACTACCTCTTCTAATCGCACTATTGCACATACAAAACAATATAGGCACGTTAAACCTCTTGGTCACCCAATATATGACTCAAACTCTACTAGACTCCTGATCTAATATTTTTCTATGACTAGCGTGCATGACAGCATTTATAGTAAAAATACCCCTATATGGTCTTCACCTATGACTGCCTAAAGCACACGTAGAAGCTCCCATCGCCGGATCCATAGTTCTTGCTGCCGTACTCCTAAAACTAGGCGGTTATGGCATAATACGGATTACAACACTACTCAATCCCCTAACAAATTTTATAGCCTACCCATTCATAATATTATCGCTATGAGGCATAATTATAACAAGCTCTATCTGCCTACGTCAAAC [...]
+AGTCATTAATCGCATATTCTTCTGTCAGCCACATAGCCCTAGTAATTGTAGCTATTCTCATCCAGACACCATGAAGCTATATAGGAGCGACCGCTCTAATAATCGCCCACGGTCTCACGTCATCCATACTATTCTGCCTGGCTAACTCTAACTATGAGCGCACTCACAGCCGAATCATAATTCTAACACGAGGCCTACAAACCCTACTACCACTAATAGCCATGTGATGACTACTAGCAAGCCTCACCAACCTGGCACTACCGCCCACCATTAACCTAATTGGAGAGTTACTAGTAGTAATTACTTCATTCTCATGATCTAACATTACCATCACCCTAATAGGAGCCAACATCATCATCACCGCCTTATACTCTCTCTATATACTCACTATAACACAACGCGGAAAATACACTCACCACATTAAAAATATCAAACCCTCTTTTACACGAGAAAATGCCTTAATAGCACTCCACCTGCTTCCTCTACTGCTAC [...]
+AATCCTAAAGTAATTCTAGGGCCCCTATGCTGTAAAATAAAAGTAATTAACCTATTCACTTCCTCCGTTATCACAACATTACTAATACTCACCATACCTATCATATTAGCTAGCACCTCGATCTACAAGAGCAAACTCTACCCAGAGTACGTAAAGACTACTACCTCGTATGCCTTTGTAATTAGCACAGTCCCCATAATAATATTTATTTACTCCGGACAGGAAATGATTATCTCAAACTGACACTGAATGACTATTCAATCCGTAAAACTATCACTAAGTTTTAAACTAGACCACTTCTCAATAATCTTCATACCCGTAGCCCTATTCATTACATGATCCATCATAGAATTCTCAATATGATATATAAACTCAGATCCTTACATTAATAAATTCTTCAAGTACTTACTAATATTCCTTGTCACCATAATAATTTTGGTTACCGCAAATAATTTATTCCAACTGTTTATCGGCTGAGAAGGAGTTGGCATC [...]
+TCTACTTATCGGGTGGTGATACGGACGATCGGACGCAAACACAGCCGCTCTACAAGCGATCCTTTATAACCGCATTGGAGATGTAGGTCTCATCATAGCCATAGCATGATTTCTAACAAACCTAAATACATGAGATCTCCAACAAATCTTTATAGCCGACCACAACAACCTAAATATACCACTCTTAGGCCTTCTACTAGCGGCAGCTGGTAAATCAGCCCAGTTTGGCCTCCACCCATGACTACCTTCAGCCATAGAAGGACCCACACCAGTGTCAGCCTTACTACACTCAAGCACTATAGTTGTAGCAGGGGTTTTCCTCCTGATTCGCTTTCACCCGCTAATTGAGCAAAGCGCAATAACGCAAACAGCTATCTTATGCCTAGGAGCCACAACCACATTATTCACAGCAATTTGTGCCCTCACCCAAAATGACATCAAAAAAATTATCGCATTCTCAACTTCGAGCCAATTAGGATTAATAATGGTCAC [...]
+TTAACCAACCATATCTGGCATTCCTACACATCTGTACCCACGCATTCTTTAAAGCCATACTATTCATATGCTCAGGATCCATTATTCACAGCTTAAACGACGAGCAACACATCCGAAAGATAGGAGGCCTATTCAAAATACTGCCACTCACCACTACTTCACTGGTAGTTGGCAGCCTAGCACTCACAGGGATACCATTTCTCACAGGATTCTATTCCAAAGACCCCATCATTGAGACCGCCAACACATCATATACAAACGCCTGAGCCCTAATATTAACCCTCACAGCCACATCCATAACAGCCGCCTACAGTACTCGGATCATATTCTTCACTCTCCTAGGACAACCTCGCTCTAACCCCACAGTAATATCTAGTGAAAATAACCCCCTCCTGATCAACTCCATCAAACGCCTACTGGTAGGGAGCATTTTCGCAGGGTACCTAATATTCTATAGCATCCCACCCACAACTGTCCCACAAACAACCATAC [...]
+CTAAAACTTACGGCCCTCGTTGTAACGCTTCTAGGCTTTATTGTAGCCTTAGAGCTAACCACCACCTCACATAAACTCAAATTTAAATATACATCAAACTTATTCAAATTCTCAAGTCTTCTAGGGTACTTCCCTGCCATCATCCACCGCTTCATACCATCTATCGGCCTATCAACAAGCCAAAAACTGGCATTCACACTAATAGACTCAACCTGACTGGAAAATGTGTTACCGAAATCCATCTCTTACTTTCACATAAAGTCATCAACCATTATCTCCAATCAAAAAGGTCTTATTAAGCTGTACTTTCTATCTTTTATAATTACCCTAGCCTTAGCCCTAACTATA??????ATTAAGTACCACGGG
+>Ommatophoca_rossii
+ATGAACGAAAATCTATTCGCCTCTTTCACTACCCCTACAATAATAGGTCTTCCCATCGTAATCCTAATCATCTTATTCCCAAGTGTTCTATTCCCCTCTCCCAATCGACTTATTAATAACCGTCTTATTTCAATTCAACAATGACTAATTCAGCTAACATCAAAACAAATGCTATCAATCCATAACTATAAAGGACAAACATGAGCACTAATACTCATATCACTTATCCTATTTATTGGATCTACCAATCTATTAGGCCTCTTACCACACTCATTTACTCCCACTACCCAACTATCAATAAACCTAGGAATAGCCATCCCTCTATGAGCAGGAACAGTCATTATAGGCTTCCGACACAAAATAAAAGCATCCCTAGCCCATTTTCTACCCCAAGGAACACCCCTACTCCTTATTCCAATACTAGTAATCATTGAAACTATTAGTCTATTTATTCAACCCATAGCCCTAGCTGTACGACTAACAGCCAATATC [...]
+CCACTTACTAATCCACCTAATTGGAGGAGCTACCCTTGTCCTCATAGACATTAGCACCGCCACAGCCTCAATCACTTTTATCATTCTTATTCTACTCACCATTCTAGAATTTGCTGTAGCCCTTATTCAAGCCTATGTCTTCACACTACTAATTAATCTATATCTACATGACAACACCTAAATGCCACAATTAGACACATCAACCTGATCTATCGTTATCCTATCTATAATTTTAACATTATTCATTATATTCCAACTGAAAATTTCTAAACACTACTTCCCAATGAACCCAGAACCAAAACAAGCACCCCTACCAAAAAGTAATACACCTTGAGAAGAAAAATGAACGAAAATCTATTCGCCTCTTTCACTACCCCTACAAATGTTCATAAACCGATGACTATTTTCCACAAACCATAAAGATATTGGTACCCTCTACTTATTATTTGGTGCATGAGCCGGAATAGTAGGAACTGCCCTCAGCCTTTTAAT [...]
+AACTAGGGCAACCTGGCGCTTTACTAGGAGATGATCAGATTTATAATGTGATTGTTACTGCCCATGCATTCGTAATAATCTTTTTTATAGTAATGCCCATCATAATCGGAGGCTTCGGAAACTGATTAGTGCCCTTAATAATTGGCGCTCCTGACATAGCATTCCCCCGAATAAATAATATGAGCTTCTGACTTCTACCCCCATCTTTCCTATTACTACTCGCTTCCTCCATAGTAGAAGCAGGTGCAGGAACAGGATGGACCGTATATCCTCCCTTAGCCGGTAATCTAGCCCATGCAGGAGCATCTGTAGACCTAACAATTTTCTCCCTTCACCTAGCAGGTGTATCATCCATTCTTGGGGCTATTAATTTTATCACTACTATTATCAATATAAAACCTCCTGCAATATCTCAATATCAAATTCCCTTATTCGTGTGATCTGTACTAATCACAGCAGTCCTCTTACTATTATCACTACCAGTTCTAGCAG [...]
+ACTATACTACTTACAGATCGAAACCTGAATACAACATTCTTCGATCCTGCCGGGGGAGGTGATCCCATTCTATACCAACACCTGTTCTGATTCTTTGGACACCCTGAAGTCTACATCCTGATCCTTCCAGGATTCGGAATAATTTCACATATCGTTACCTATTACTCAGGGAAAAAAGAACCTTTCGGTTATATAGGGATAGTCTGAGCAATAATATCCATCGGCTTCCTAGGCTTCATCGTATGGGCCCACCACATATTTACTGTAGGAATGGACGTTGACACACGAGCATATTTTACTTCAGCCACTATAATCATTGCTATTCCAACAGGAGTAAAAGTCTTTAGCTGATTAGCTACCCTGCATGGAGGCAACATCAAATGATCTCCAGCCATACTATGAGCTCTAGGATTTATTTTCCTATTCACAGTAGGAGGTCTCACGGGCATCGTACTAGCAAACTCGTCACTAGATATCGTACTCCACGATACA [...]
+AGTAGCGCACTTCCACTACGTCTTATCAATAGGAGCAGTCTTCGCTATTATAGGCGGATTCGTTCACTGGTTCCCCCTATTCTCAGGCTTCACTCTCGACGATACTTGAGCAAAAATTCACTTTACAATTATATTTGTCGGAGTTAACATAACATTCTTCCCTCAACATTTCTTAGGCCTATCAGGAATACCTCGACGATATTCCGATTACCCAGATGCCTACACAATATGAAATACAGTCTCCTCTATAGGTTCATTCATTTCACTTACAGCGGTCATACTAATAGTATTCATAATCTGAGAAGCCTTCGCATCTAAACGAGAAGTAGCAACAGTCGAATTGACCACAACCAATATCGAATGGCTACACGGATGTCCTCCTCCTTATCATACATTTGAAGAACCTACCTATGTTGTATTAAAAATGGCGTATCCTCTCCAAATAGGCTTACAAGACGCAACCTCCCCAATCATAGAAGAACTGTTACATTT [...]
+ACACGTTAATAATCGTATTCTTGATTAGCTCACTAGTGCTTTACATCATTTCACTTATATTAACTACAAAACTCACCCACACAAGCACAATAGATGCACAAGAAGTAGAGACAGTATGAACAATTCTGCCAGCCATTATCCTAATTCTAATTGCCCTACCCTCATTACGAATTCTTTATATAATAGATGAGATCAATAACCCCTCCCTAACAGTAAAAACCATAGGACATCAATGATACTGAAGCTACGAATACACAGACTACGAAGACCTAAACTTTGACTCATACATAATTCCTACACAAGAGCTAAAACCCGGAGAACTTCGACTATTAGAAGTAGATAATCGAGTAGTCCTTCCAATAGAAATAACAATCCGCATGTTAATTTCATCAGAAGATGTACTTCACTCATGGGCTGTGCCATCCCTAGGACTAAAAACCGATGCCATCCCAGGACGACTAAACCAAACAACCTTAATATCCATGCGACCAG [...]
+TACGGTCAATGTTCAGAAATTTGCGGTTCTAACCACAGCTTTATACCTATTGTTCTCGAATTAGTCCCACTATCTCACTTTGAAAAGTGATCTACCTCAATGCTTATGACCCACCAAACCCATGCCTATCACATAGTTAACCCCAGCCCATGACCATTAACAGGAGCTCTCTCGGCCCTCCTTATAACATCCGGCCTAATCATATGATTTCACTTTAACTCAATATACTTACTTATGCTAGGTCTCACAACCAATACTCTAACTATATATCAATGATGACGAGACATTATTCGAGAAAGCACATTCCAAGGCCACCATACTCCAATCGTCCAAAAAGGCCTACGATACGGCATAATTCTTTTCATTGTATCAGAAGTATTCTTTTTCGCAGGGTTTTTCTGAGCCTTTTATCATTCCAGCCTAGCACCTACCCCTGAGCTAGGAGGATGTTGACCACCCACAGGCATCATCCCTCTAAATCCCATAGAAGTC [...]
+AAACACCTCCGTGCTCCTAGCCTCAGGAGTGTCAATTACCTGAGCCCACCACAGCCTAATAGAAGGAAATCGTAAACATATACTCCAAGCACTATTCATTACCATCTCCCTAGGCATCTACTTCACACTATTACAAGCCTCAGAATATTATGAAACCCCTTTCACAATCTCCGACGGAGTATACGGCTCCACTTTCTTTATAGCAACAGGATTTCACGGACTACATGTAATTATTGGTTCCACTTTCCTAATTGTATGCTTTATACGACAATTAAAATTCCACTTTACATCTAGCCACCACTTTGGGTTCGAAGCCGCTGCTTGATACTGACATTTCGTAGACGTAGTGTGACTATTCCTATACGTATCTATCTATTGATGAGGATCCT??ATGACCAACATCCGAAAAACTCACCCACTAGCCAAAATCATCAACAATTCATTCATTGACCTACCCACACCATCAAATATTTCAGCATGATGAAATTTTGG [...]
+TCGGAATCTGCCTAATCCTACAAATCCTAACAGGCTTATTCCTAGCCATACACTATACTTCAGACACAACTACAGCCTTTTCATCAATTACACATATCTGCCGAGACGTAAACTACGGTTGAATCATCCGGTACATACATGCAAATGGAGCATCCATATTCTTCATCTGCTTATACATACACGTAGGACGAGGGCTATACTACGGCTCTTACACATTTACAGAAACATGAAACATCGGCATTATTCTCCTATTTACCATCATAGCCACAGCATTCATAGGCTATGTATTACCATGAGGACAAATATCATTCTGAGGAGCAACCGTTATCACCAACTTACTATCAGCAATCCCCTACATTGGAACAGACCTAGTACAATGAATCTGAGGAGGATTTTCAGTTGACAAAGCAACCCTAACACGATTCTTCGCCTTCCACTTTATCTTACCCTTCGTAGTATCAGCACTAGCAGCAGTCCACCTACTATTCTTAC [...]
+GGATCCAACAATCCCTCCGGAATTCCATCCAACTCAGACAAAATCCCATTTCACCCATACTACACAATTAAAGACATCCTAGGAGCTCTACTCCTCATCTTAACCCTTATACTACTAGTACTATTCTCACCCGACTTACTAGGAGACCCCGATAACTACACTCCTGCTAACCCCCTAAGCACTCCACCACATATTAAACCCGAATGATATTTCCTATTTGCATACGCAATCCTACGATCCATTCCTAACAAACTAGGGGGAGTATTAGCCCTAGCACTCTCTATCCTAATCCTCGCCATCATCCCCCTACTCCACACATCTAAACAACGAGGAATAATATTCCGACCCATTAGCCAATGCTTGTTCTGACTGCTAGTAGCAGACCTACTCACATTAACATGAATCGGAGGACAACCAGTCGAACACCCCTACATCACCATCGGACAACTAGCCTCAATCTTATACTTCACAATCCTACTAGTACTAATACCT [...]
+CATTATCGAAAACAATATCCTAAAATGAATGTTTATAATCAACATTGTATCACTAATTATCCCAATCCTTCTTGCCGTAGCTTTCCTAACATTAGTAGAACGGAAAGTACTAGGCTACATACAACTCCGAAAAGGACCCAACATCGTAGGACCCTTTGGACTCCTACAACCCATCGCAGACGCTGTAAAACTATTCACCAAAGAACCTCTACGACCACTAACATCCTCCACATCCATATTCATTATAGCTCCTATTCTAGCCCTAGCCCTAGCCCTAACCATATGAATCCCCCTACCCATACCATACCCCCTCATCAACATAAACTTAGGAGTACTATTCATACTAGCAATATCAAGCCTAGCCGTCTACTCAATCCTATGGTCCGGATGAGCCTCAAACTCCAAATATGCCTTAATTGGGGCCCTACGAGCCGTAGCCCAAACAATCTCATACGAAGTTACCCTAGCCATCATCCTACTATCAGTCCTACT [...]
+GATCCTTCACCCTATCAACACTAATCATCACACAAGAACATCTATGACTAATTTTCCCTGCATGACCACTAGCCATAATATGATTCATCTCCACCCTAGCAGAAACTAACCGCGCCCCATTCGACCTAACAGAAGGAGAATCAGAACTTGTCTCAGGATTCAACGTAGAATACGCAGCAGGCCCATTCGCCATATTCTTCCTAGCAGAATACGCCAACATCATTATAATAAACATCTTCACTACCCTTCTATTCTTTGGAGCATTCCACACCCCATACATACCTGAACTCTACACCATTAACTTTACTATAAAAACCCTAATACTAACAATCCTATTTCTATGAATCCGAGCATCATACCCACGATTTCGATATGACCAACTGATACACCTCCTATGAAAAAACTTCCTACCTCTAACACTAGCCCTATGCATATGACACGTAACATTACCCATTATCTCAGCAAGCATTCCTCCTCAAACAATAAAACCCT [...]
+ATCATCATCATAACAACCGTTATGTCAGGAACTATAATCGTCCTCACAAGCTCTCACTGACTATTAACTTGAATCGGCTTCGAAATAAACATGCTAACGATTATCCCAATCCTGATAAAAAACTACAACCCACGAGCCATAGAAGCATCCACAAAATACTTCCTAACACAAGCCACCGCATCAATACTCCTAATAATAGGCATCATTATCAACCTAATATTTTCAGGACAATGAACAATCTCAAAAATCCCAAACCCTATTGCATCTGGACTAATCACCATCGCCCTGACAATAAAACTAGGCATAGCCCCCTTCCACTTCTGAGTACCTGAAGTAACACAAGGAATCTCATTATCTTCAGGCATGATCTTACTCACATGACAAAAAATCGCACCCCTATCCGTCCTCTACCAAATCTCACCATCCATCAACCCCAAACTAATAATCCCCATAGCAATTGCATCCGTACTAGTAGGAGGATGAGGAGGACTT [...]
+CCAACTCCGAAAAATCCTAGCCTACTCATCAATTGCCCACATAGGATGAATAGCCATCATCCTAACATACAACCCAACCCTTATACTCTTAAACCTCACAATCTACATCACAATGACCCTAAGCACATTCATACTATTTATTCATAACTCATCTACAACAATATCATCACTATCCCAAACATGAAATAAGTTACCACTTGTAACATCACTAATCCTGATACTGATACTATCACTAGGAGGCCTCCCACCATTATCAGGATTCACACCTAAATGAATAATCATCCAAGAACTGACAAAAAATGACATAATTATTCTACCAACATTTATAGCTATTACAGCACTCCTAAACCTATACTTCTACATACGACTATCCTACACCACAACATTAACCATATTCCCCTCAGCTAACAATATAAAAATAAAATGACAATTCGAAAGCACAAAGAAAATCATCCTCCTACCACCACTAATTATCACCTCAACTATACTACT [...]
+CCCCAATAATATCGATCCTAGAGATAAACATAGTACTAGCTCTACTCACTAATACTGCCCTTGCCTCTCTACTTGTACTAATTGCATTCTGACTTCCCCAACTAAACATCTACTCAGAAAAAGCTAGCCCCTATGAATGCGGTTTCGATCCCATAGGATCAGCACGCCTACCCTTTTCCATAAAATTTTTCTTAGTGGCCATTACATTCCTACTATTCGACTTAGAAATCGCCCTACTCCTACCACTCCCATGGGCATCACATACAAATAACCTCACTACCATACTCACCATAGCACTACTTCTTATCTCCCTTCTAGCCGCAAGCCTAGCCTACGAATGAACCGAAAAAGGACTGGAATGAACAGAAATGACCATAGTATACGCAAACATCTTCCTGGCCTTTATCACATCTCTTATAGGACTGCTCATATACCGGTCCCACCTCATATCCTCCTTACTTTGCCTAGAAGGTATAATACTATCATTATTCG [...]
+ACAATTACAATTTTAAATAGCCATTTTACACTAGCTAGTATAACTCCCATTATCCTACTCGTCTTCGCCGCCTGCGAAGCAGCCCTAGGACTATCACTCCTAGTAATAGTATCTAACACATACGGAACCGACTACGTACAAAACCTAAATCTCCTACAATGCATTATTCTTCCCACTATAATACTTATACCCCTGACATGAATATCAAAACCCAACATAATCTGAATTAATACAACAACCTACAGCCTATTAATTAGCCTCATTAGCCTCCCCTTTCTAAACCAACCTAACGACAACTGCACAAACCTATCCCTATTGTTCTTCACAGATTCCCTATCAGCTCCACTACTAACACTTACAACATGACTTCTACCCCTAATACTCATAGCCAGCCAATTCCACCTATCAAAAGAATCACTAACCCGAAAAAAACTATATATCACAATACTAATTCTATTACAATTATTTCTAATCATAACATTCACCGCCACA [...]
+CATATTCTACATCCTATTTGAAGCAACCCTAGTACCTACCTTAATCATTATCACTCGATGAGGAAATCAAACAGAACGCCTAAATGCAGGAATATACTTTCTATTTTACACCCTAGTAGGATCCCTGCCTCTACTAGTAGCCCTACTATTCATTCAAAATAATATAGGCACACTAAATTTCTTAATACTCCAACTCTGAGCCCAACCTATACCAAACTCCTGATCTAATACCCTTCTATGATTAGCATGCATAATGGCATTCATAGTAAAAATACCCTTATACGGACTTCACCTGTGACTACCTAAAGCACATGTAGAAGCACCCATTGCTGGGTCAATAGTACTTGCCGCAGTACTCCTAAAACTAGGAGGCTACGGCATAATACGAGTCACAATCTTACTTAACCCATTAACAAATTCCATAGCATACCCCTTCATAATACTATCTCTATGAGGTATAATCATAACGAGCTCTATCTGCTTACGCCAAAC [...]
+AATCCTTAATCGCATACTCCTCCGTCAGCCACATAGCCCTAGTTATTGTAGCAATTCTCATTCAAACACCATGAAGTTACATAGGAGCAACAGCCCTAATAATCGCCCACGGCCTAACATCATCCATACTATTCTGCTTAGCTAACTCTAACTACGAACGTACCCACAGCCGAACTATAATCCTCGCACGTGGACTTCAGATACTCCTACCCCTAATAGCAGCATGATGATTACTAGCAAGCCTCACTAACCTAGCTCTCCCTCCCACCATTAACCTAATCGGAGAACTATTTGTAGTAATAGCCTCATTTTCATGATCTAGTATTACCATTATCCTAATAGGGACCAACATTATCATTACTGCTTTATATTCATTATATATATTAATCACCACACAACGCGGAAAATACACCCATCATATCAAAAACATCAAACCTTCATTCACACGAGAAAATGCCTTAATAACACTTCACCTAATACCCCTACTACTAC [...]
+AACCCCAAAGTTATCCTAGGACCCCTTTACT?????ATAAAAGTAATTAATCTATTTACTTCTTCCATTATTACATCATTATCCATATTAATACTTCCAATCATATTAACCAGCACCTCAATCTACAAAAACAAGCTTTACCCACAATACGTAAAAACCACTATCTCATACGCCTTTATAATCAGCATAATTCCCACAATAATATTCATCTACTCAGGAAAAGAAGTAATTATCTCAAACTGACACTGAATAACTATCCAAACCATAAAACTCACACTAAGTTTTAAACTAGATTACTTCTCCATAATCTTTGTACCCGTAGCCCTTTTTGTCACATGATCTATCATAGAATTCTCAATTTGATATATACACTCAGACCCTTACATCAACCGATTCTTCAAATACTTACTAATATTTCTAATCACCATAATAATTCTAGTCACCGCAAATAACCTATTCCAGCTATTCATTGGATGAGAAGGAGTAGGCATT [...]
+CCTTCTCATCGGATGATGACACGGACGAACCGACGCAAATACAGCCGCCTTACAAGCAGTCCTCTACAACCGTATCGGAGACGTAGGATTCATCATAGCTATAGCCTGATTTCTAATCAACCTAAACACATGAGAATTCCAACAGATCTTCATTACTCACCACGATAACCTAAATATACCACTAATAGGCCTTCTACTAGCAGCAACCGGAAAATCAGCCCAATTTGGACTTCATCCATGACTACCATCAGCTATAGAAGGCCCCACCCCAGTATCCGCTCTACTACACTCAAGCACTATAGTAGTAGCAGGGGTCTTCCTTCTAATTCGATTTCACCCACTAATAGAATGTAATACAACAGTACAAACAACCACCCTATGCCTAGGGGCTATCACTACCCTATTTACAGCAATCTGCGCACTCACCCAGAACGACATCAAAAAAATCATCGCATTCTCAACCTCAAGCCAACTAGGACTCATAATTGTCAC [...]
+TCAACCAACCATACCTAGCATTCCTACATATCTGCACCCACGCATTTTTCAAAGCCATACTATTCATATGCTCCGGATCCATTATCCACAACCTAAACGACGAACAAGATATCCGAAAAATAGGAGGACTATACAAAGTACTACCATTCACTACCACCTCACTAATCGCAGGAAGCCTAGCACTCACAGGCATACCCTTCCTTACAGGATTTTACTCCAAAGACCTAATTATTGAAACCGCCAACACGTCATATACCAACGCCTGAGCCCTACTACTAACCCTCGTTGCCACATCCATAACAGCCGCCTACAGCACCCGAATTCTATTCTTCGCGCTCCTAGGACAACCCCGCTTCAACCCTATAATTACAACCAATGAAAACAACCCACACCTAATTAATTCCATTAAACGCTTACTACTAGGAAGCATTTTCGCAGGATACCTAATCTCCCATAATATTACACCCACCACAATCCCACAAATAACTATAC [...]
+CTAAAACTGACAGCCCTCACCGTAACACTCCTAGGGTTTATCTTAGCATTAGAATTAAATCTTACCTCACAAAGCCTCAAACTTAAATACCCATCAAACCTATTTAAATTCTCTAACCTCCTTGGATACTTCCCCACCATTATTCACCGCTACGTACCAAAAACAAACCTCTTAGCGAGCCAAAAACTAGCCTCAACATTACTAGACATAATCTGACTAGAAAGTGCACTACCAAAATCAATCTCTTACTTCCATATAAAATCATCAACTACCATCTCTAACCAAAAAGGCCTAATCAAACTATACTTCCTCTCTTTCGTAATCACTTTAAGCCTAGCATTAACCATA??????ATTAATTTCCACGAG
+>Otaria_byronia
+ATGAACGAAAATCTATTCACCTCTTTCACTTCCCCTACAATAATAGGCCTTCCTATCGTGACCCTAATCATTCTATTCCCAAGTATATTATTTCCTTCACCAGGCCGACTGATCAGCAACCGCTTCACCTCTATTCAACAGTGACTGATCCAATTAACATCGAAACAAATAATAGCAATTCATAATCACAAAGGACAAACATGGTCATTAATACTTATGTCGCTCATCATATTTATTGGATCTACTAACCTACTGGGTCTGCTACCACACTCATTTACTCCCACTACCCAGCTGTCTATAAACCTAGGAATAGCAATTCCCCTATGAGCAGGAACAGTTGCTATAGGACTACGACACAAAACTAAAGCATCCTTAGCCCACTTCCTACCCCAGGGAACACCCTTCCCTCTTATCCCAATATTAGTAATTATCGAATTTATCAGCCTACTCATCCAACCCATGGCCTTAGCCGTACGACTAACAGCCAATATC [...]
+TCACCTATTAATCCACCTAATCGGTGGAGCCACTCTAGCCCTCACCAACATCAGTGCAATTACGGCCCTTATCACTTTCATCATCCTCATTTTACTCACAATCCTCGAATTTGCTGTAGCCTTGATCCAGGCTTACGTCTTTACTTTACTAGTAAGCCTATACTTACATGATAATACCTAAATGCCACAACTAGACACATCAACATGATTCACCACAATTATATCAATAATTCTAGCACTATTTGTCGTATTTCAATTAAAAATTTCCAAACACCACTTCCCAATAAACCCAGAATTGAAACCATTATTGACATCAAAAACAAATACCCCCTGAGAAAAAAAATGAACGAAAATCTATTCACCTCTTTCACTTCCCCTACAAATGTTCGTAAATCGATGATTATTCTCTACAAACCATAAAGATATTGGCACCCTCTATCTACTGTTTGGTGCATGAGCCGGAATGGCTGGCACCGCCCTCAGCCTATTAAT [...]
+AATTAGGGCAACCAGGCACCTTACTAGGAGATGATCAAATCTATAACGTAATTGTCACCGCCCACGCATTCGTAATAATCTTTTTCATGGTAATACCTATTATAATTGGAGGCTTTGGAAATTGATTGGTGCCCCTAATAATTGGAGCTCCCGACATAGCATTTCCCCGAATAAACAACATAAGCTTCTGACTTCTACCCCCCTCCTTCCTACTATTATTAGCCTCTTCTCTAGTTGAAGCCGGCGCAGGTACCGGATGAACGGTTTACCCTCCCCTAGCAGGAAACCTAGCCCATGCAGGAGCTTCCGTAGACTTGACCATTTTCTCCCTTCACCTAGCGGGGGTATCATCTATTCTGGGGGCCATTAACTTTATTACTACCATTATCAACATGAAACCCCCTGCTATGTCCCAATACCAAACTCCTTTGTTCGTGTGATCCGTGCTAATCACAGCCGTACTACTTCTGTTATCCCTACCAGTCCTAGCAG [...]
+ACTATATTACTTACGGACCGAAATCTAAATACAACCTTTTTTGATCCAGCCGGAGGGGGTGACCCTATCCTATATCAACACCTATTCTGATTCTTCGGACATCCAGAAGTATACATTCTCATCTTACCAGGATTTGGGATAATCTCACACATTGTCACCTATTACTCAGGAAAAAAGGAACCCTTTGGTTATATAGGAATAGTTTGAGCAATAATATCTATCGGCTTCTTAGGCTTTATCGTATGAGCGCATCATATATTTACCGTAGGGATAGATGTTGACACACGAGCATACTTCACCTCAGCCACTATAATTATCGCCATCCCTACAGGAGTAAAAGTATTCAGCTGACTAGCTACCCTGCACGGTGGTAATATCAAGTGATCTCCCGCTATACTATGAGCCTTAGGATTCATCTTCCTATTCACAGTGGGAGGCCTCACGGGCATTGTGCTAGCAAACTCATCGTTGGATATCGTTCTCCACGATACA [...]
+AGTAGCACACTTCCATTACGTACTATCAATAGGAGCAGTGTTTGCTATCATGGGTGGATTCGTCCATTGATTCCCCTTATTTTCAGGATTTATGCTCGACAGTACCTGGGCGAAAATCCACTTCACAATCATATTTGTTGGAGTCAACATGACATTCTTCCCACAACATTTTCTGGGTCTATCCGGAATACCACGACGATATTCTGACTACCCAGACGCCTATACAACATGAAATACAATCTCCTCTATAGGCTCGTTTATCTCACTTACAGCAGTAATACTAATGGTTTTCATAGTATGAGAGGCTTTTGCATCCAAACGAGAGGTAGAAACAGTTGAATTAACATCTACTAATATGGAATGACTTCACGGATGTCCTCCTCCCTATCACACATTCGAAGAACCTACCTACATTGTATCAAAAATGGCATATCCCCTTCAAATAGGCCTTCAAGACGCAACCTCCCCTATCATGGAAGAACTAACACACTT [...]
+ATACACTAATAATCGTATTCCTAATTAGTTCACTAGTACTTTATATTATCTCGACTATACTTACCACGAAACTAACACACACAAGCACAATGGACGCCCAAGAAGTAGAGACGGTGTGAACAATTCTGCCAGCTATTATTTTAATCATAATCGCTCTACCCTCACTTCGAATCCTTTATATTATAGACGAAATTAACAACCCTTCTCTAACCGTAAAAACTATAGGACATCAATGATACTGAACCTATGAATATACTGATTATGAAGACCTAAGCTTCGACTCATACATAATTCCTACGCAAGAACTAAAGCCTGGCGAGCTGCGACTATTAGAGGTGGATAACCGAGTCGTACTCCCCATAGAAATAACAATCCGTATACTAATTTCATCAGAAGATGTACTTCACTCATGAGCCGTACCATCTCTGGGATTAAAAACCGACGCCATCCCAGGACGATTAAACCAGACCACCTTAATAGCTATACGACCAG [...]
+TACGGTCAATGCTCGGAAATCTGTGGCTCCAATCATAGCTTTATACCTATCGTTATTGAATCTGTCCCATTATCTTACTTCGAGAAATGGTCCACCTCAATACTTATGACACACCAGACCCATGCATACCATATAGTCAACCCTAGCCCTTGACCGTTAACAGGGGCCCTATCAGCCCTACTCATAACTTCAGGCCTAATCATATGATTCCACTTTAACTCAACTCACCTCCTACTACTGGGTCTTACAACCAACGCACTAACTATATATCAATGATGACGAGACATCGTCCGAGAAGGCACATTCCAAGGCCATCACACCCCAACTGTCCAAAAAGGCCTACGATATGGCATAGTTCTTTTCATCGTGTCCGAAGTATTCTTTTTCGCAGGATTTTTCTGAGCCTTTTACCATTCCAGCCTAGCTCCCACCCCCGAACTAGGAGGATGCTGACCCCCAACAGGAATCACACCTCTAAACCCACTAGAAGTT [...]
+TAACACCTCAGTACTATTAGCATCAGGCGTATCAATCACCTGAGCCCACCACAGCTTAATAGAAGGAAACCGCAAACACATACTCCAAGCCCTACTTATCACTATCCTCCTAGGCCTCTATTTTACACTTCTACAAGCCTCAGAATACTACGAGACCCCTTTTACGATCTCTGACGGAATTTATGGCTCCACTTTCTTCATAGCTACAGGATTCCACGGGTTACACGTAATTATCGGCTCAACCTTCCTAGCCGTATGCTTCATGCGACAATTGAAATTCCATTTTACATCCAACCATCACTTCGGATTCGAAGCCGCTGCCTGATACTGACACTTCGTAGACGTCGTGTGACTATTCCTATACGTATCCATTTATTGATGAGGGTCAT??ATGACCAACATTCGAAAAGTACACCCACTGGCCAAAATTATCAACAACTTACTCATCGACCTACCCGCACCATCTAACATCTCAGCATGATGAAACTTTGG [...]
+TCGCAGTATGCTTAGCCTTACAAATCCTAACAGGTCTCTTCTTAGCCATACACTACACCTCAGACACTACCACAGCCTTTTCATCAGTCACCCACATTTGCCGAGACGTGAACTACGGATGAATCATCCGATACATACACGCAAATGGAGCCTCCATATTCTTCATCTGTCTCTACATGCACGTAGGACGAGGACTATACTACGGATCCTACACACTAACAGAAACATGAAACATTGGCATTATCCTCCTACTTACAGTCATAGCCACAGCATTCATAGGCTATGTACTTCCATGAGGACAAATATCATTCTGAGGAGCAACCGTCATTACCAACCTTCTATCAGCAATCCCTTACATCGGGACCAACTTGGTAGAATGAATTTGAGGAGGATTTTCAGTTGATAAAGCAACCCTAACGCGATTCTTCGCCTTCCACTTTATTCTCCCCTTCGTAGTATCAGCACTAGTAATAGTGCACCTACTGTTCCTAC [...]
+GGATCCAACAATCCATCAGGAATCTCCTCAGACTCAGACAAAATTCCATTCCACCCATACTATACAATTAAAGATATCCTAGGAACCCTCCTACTAATCTTAATTCTAATATTACTAGTAATATTTTCACCAGATCTGCTGGGAGACCCAGACAACTACATCCCAGCCAACCCCCTCAGCACCCCACCACATATCAAACCTGAATGGTACTTTCTATTCGCCTATGCCATCCTACGATCCATCCCAAACAAGTTAGGAGGAGTCCTAGCCCTACTCCTATCAATCTTAATCCTGGCCATTATCCCACTACTACATACATCAAAACAGCGAGGAATAATATTCCGACCCATTAGCCAATGCCTCTTCTGACTTCTAGCAGCGGATCTACTCACACTAACATGAATTGGAGGACAGCCAGTCGAACATCCCTTCATCACTATCGGCCAACTAGCCTCAATCCTGTACTTCACGATCCTCCTAGTTCTTATACCC [...]
+CATTATCGAAAATAACATCTTAAAATGAATGATCATAATTAATATCCTCTCACTAATCATCCCTATCCTCCTAGCCGTAGCTTTCCTGACACTAGTAGAACGAAAAGTACTAGGCTACATGCAACTCCGAAAAGGTCCCAACATCGTAGGACCCTACGGACTTCTACAGCCAATCGCGGACGCTGTAAAACTATTCACCAAAGAACCCTTACGACCACTCACTTCCTCTGCATCTATATTTATTACAGCCCCCATCCTGGCCTTAACCCTGGCCCTAACCATATGAATCCCACTACCCATACCATATCCTCTCATCAACATAAATCTAGGAGTCCTATTCATATTAGCAATGTCAAGTCTAGCCGTCTACTCAATCCTATGATCTGGGTGAGCATCAAATTCAAAATATGCACTAATTGGAGCCCTACGGGCCGTAGCCCAGACCATTTCATACGAAGTAACCCTAGCCATTATTCTCCTATCGGTGCTTCT [...]
+GCTCCTTCACTCTATCCACACTAATCACCACCCAAGAGCACCTATGACTAATCTTCCCAACATGACCCCTAGCCATAATATGGTTTATTTCCACCCTAGCAGAGACCAATCGTGCCCCATTCGACCTAACAGAGGGAGAATCGGAATTAGTCTCGGGGTTCAACGTAGAATATGCAGCAGGCCCATTCGCCCTATTTTTCCTAGCAGAATACGCCAATATCATCATGATAAACATCCTCACAACTACCCTATTTCTCGGGGCATTCCACAGCCCATACATACCCGAATTATACACCATCAATTTTACCCTAAAAACATTAACACTGACAATCCTATTTCTATGAATCCGGGCATCATACCCCCGATTCCGCTACGATCAATTAATGCACCTCCTATGAAAAAATTTCCTACCCCTCACGCTAGCACTATGCATATGACACATGGCCCTGCCAGTAATTACAGCTAGCATTCCCCCTCAAACGATAAAACCCC [...]
+ATCATAATTATAATAACCGTCATATCAGGAACTATACTTGTCTTAACAAGCTCTCATTGACTAATAATCTGAATTGGGTTCGAAATAAATATACTGGCAATTATTCCAATCCTGATAAAAAATTTTAGCCCCCGAGCCACAGAAGCATCCACAAAATACTTCTTAATCCAAGCCACCGCATCTATACTCCTGATATTGGGCATTATCATTAACCTAATAACCTCAGGACAATGAACGATTTTAAAACTCCCAAACCCAACAGCATCCAACCTTCTAACTATCGCTCTAGCAATAAAACTTGGAATAGCTCCATTCCACTTCTGAGTGCCTGAAGTAACACAGGGAACCCCACTATCATCAGGCATGATCCTACTCACATGACAAAAAATCGCACCCCTGTCCATTCTTTACCAAATTGCACCATCAATCAGCCCAAACCTATTAATCACTATAGCAATCGCGTCAGTACTAGTGGGAGGATGAGGGGGACTA [...]
+CCAACTCCGAAAAATCCTAGCCTACTCATCAATTGCTCATATAGGATGAATTACCATTATCGTAACATATAATCCTACCTTAATACTCCTAAACCTGACAATCTACATCACCATAACACTCGGAACATTTATACTATTTATATATAATTCATCTACGACAACACTATCACTATCCCACACATGAAACAAATTGCCCCTCATGACATCCCTAATCCTAGTCCTTATATTATCACTTGGAGGACTTCCCCCATTATCAGGCTTCGTACCCAAATGACTAATCATCCAAGAACTAACAAAAAATGACATAATTATTCTACCAACATTTATGGCAATCACAGCACTACTAAACCTGTACTTCTACATACGATTGTCTTATACCACAGCACTAACACTATTTCCCTCAATAAATAATATAAAAATAAAATGACAGTTCGAAAGCACAAAAAAAATAACCTTATTATCCCCACTAATCATCATCTCGACAATACTACT [...]
+CCCCAATAGTATCTATCCTAGACATAAACATAATTCTAACCCTACTCACCAACACAATCCTAGCCTCTTTACTTGTACTAATCGCGTTCTGACTCCCTCAGCTAAACATCTACTCGGAAAAAGCCAGCCCTTACGAATGCGGATTTGATCCCATAGGATCAGCTCGCCTACCCTTCTCCATAAAATTTTTCCTAGTGGCCATTACATTCCTACTGTTTGACCTAGAAATCGCACTACTCTTACCCCTCCCATGAGCATCTCACACAAACAACCTAACAACCACCCTCACTATGGCACTTATACTGATCTCCCTACTAGCCGCAAGTTTAGCTTATGAGTGAACCGAAAAAGGACTCGAATGAACAGAAATGTCCATAGTATACTTTAACATCTTTATAGCCTTCACCGTATCTCTTGTAGGACTGCTCATGTATCGATCTCACCTTATATCCTCTCTACTTTGCCTGGAAGGTATAATGCTATCACTATTCG [...]
+TCAATAACAATCCTAAACAACCACTTTACACTAGCCAGCATAGCCCCCATCATCCTACTCGTATTCGCGGCTTGTGAAGCGGCCCTAGGACTGTCCCTCCTAGTGATAGTATCTAACACATATGGAACGGACTACGTACAAAACCTAAACCTCTTACAATGCATCATTATCCCTACTATCATACTAATACCCGTAGCATGAATATCAAAACCCCACATAATTTGAATTAATACAACAACCTATAGTCTACTAATTAGTCTCACCAGCCTACCTCTTCTAAATCAATCTAACGACAATAGCCTAAACTCATCATTATTATTCTTCACGGATTCCTTATCAGCCCCTCTCTTAACACTTACTACGTGACTCTTACCTCTTACACTCATAGCTAGTCAATTCCATCTATCAAAAGAACCACTAGCCCGAAAAAAACTTTATATTACAATACTAATCCTCCTACAACTGTTTCTAATCATAACATTCACCGCTACA [...]
+CATATTTTATATCTTATTCGAAGCAACTCTAGTACCCACACTAATTATCATCACCCGATGAGGAAACCAAACAGAACGCTTAAACGCAGGACTATATTTCCTATTTTACACCCTAATGGGATCACTACCCTTACTGGTAGCACTACTATATATGCAAAACAATATAGGCACACTAAACTTCTTAATAGCCCAATACTGAGCCCAAACCCTACCAAACTCTTGATCCAATATTCTCCTATGACTAGCGTGCATGATGGCATTCATAGTAAAAATACCCCTATATGGACTTCACCTGTGACTACCTAAAGCACATGTAGAGGCTCCCATCGCCGGATCCATAGTACTTGCCGCCGTACTTCTAAAACTAGGGGGCTACGGCATAATACGAATCACTATCCTGCTTAGTCCCCTAACAAGCTTTATAGCGTACCCCTTCATAATATTGTCAATATGAGGAATAATCATGACAAGCTCCATTTGCTTACGCCAAAC [...]
+AATCACTAATTGCATATTCTTCAGTAAGCCACATAGCCCTAGTAATCGTGGCCATCCTTATCCAAACACCGTTAAGCTACATAGGCGCAACCGCCCTAATAATCGCCCACGGCCTTACATCATCCATACTATTCTGCTTGGCTAACTCTAACTATGAACGCACCCACAGCCGAACCATGATCCTTGCACGCGGCCTACAGACCCTACTGCCACTAATGGCGGCATGATGGCTATTAGCGAGCCTAACCAATCTAGCACTACCCCCTACTATTAATCTAATTGGAGAATTACTCGTAGTGATTACCTCATTCTCATGATCTAACGCTACCATTATTCTTATAGGAGTAAATATCATTATTACTGCCTTATACTCCCTGTATATACTTATCACAACTCAACGCGGAAAACATACCCACCACATCAAAAACATCAAACCCTCATTTACACGAGAAAACACTCTAATAATACTCCACCTTATACCACTACTACTAC [...]
+AACCCTAAAATGATTCTAGGTCCCCTTTACT?????ATAAAAGTAATTAATTCATTCGCCCCATTTATTATTACAACACTATTCATACTCACGATACCAATCATCCTAGCCAGCACTCCAATTTATGAAAGCAAACTCTACCCACAGTACGTGAAAACTATCACCTCTTACGCCTTCATAACCAGCATAATCCCCACAATAATATTCATTTCCTCAGGACAAGAAATAGTCATCTCAAACTGACACTGAATAACTATCCAAACTATAAAATTAACACTAAGCTTCAAACTAGATTATTTCTCGATAATTTTCATGCCCGTAGCCCTATTCGTCACATGATCCATCATAGAATTTTCAATCTGATACATATCCTCGGACCCTCACATCAACCGATTCTTCAAATACCTACTAATATTCCTCAACACCATAATAATTTTAGTTACCGCAAACAACCTATTTCAACTGTTCATCGGATGGGAAGGAGTAGGCATT [...]
+CCTACTCATCGGATGATGATACGGACGGTCAGATGCAAACACAGCTGCCCTTCAAGCAATCCTTTACAATCGCATCGGAGATGTAGGCTTCATCATAGCCATAGCATGATTCTTAACCAACCTAAACACATGGGATCTCCAACAAATCTTCATAATCCATCATGACAACCTAAACATACCACTCATAGGTCTTCTGCTAGCGGCAACTGGCAAATCAGCCCAATTTGGCCTACATCCATGATTACCCTCAGCCATAGAAGGACCCACACCGGTATCAGCCCTATTACACTCAAGCACCATGGTCGTAGCCGGAGTATTTCTACTAATCCGATTCCACCCTCTAATAGAACATAATATAATAATACAGACAGCCACTCTATGCTTGGGAGCCATCACCACACTATTCACAGCGATATGCGCTCTCACCCAAAACGACATCAAAAAAATCATCGCATTCTCGACTTCAAGCCAACTAGGATTAATAATCGTCAC [...]
+TCGGCCAACCATACCTGGCATTTCTACACATCTGCACCCATGCATTCTTTAAAGCTATACTATTTATATGCTCCGGATCTATCATCCATAACCTAAACGACGAGCAAGATATTCGAAAAATAGGAGGTCTATTCAAACCAATACCGTTCACCACCACCTCACTAATTATTGGCAACCTAGCGCTCACAGGCATACCATTTCTCACAGGATTTTACTCCAAAGACCTAATCATCGAAACCGCCAACACATCGAACACCAACGCCTGAGCCCTACTTCTAACCCTAATAGCCACATCCATAACAGCTGCCTACAGCACCCGAATAATATTCTCCACACTTTTGGGACAGCCCCGATTCAACTCTACAATTACAGTAAACGAAAATAATCCACTATTAATCAACCCCATTAAACGTCTACTACTCGGAAGCATTTTCGCAGGATACCTAATAACCCTCAACATTCCACCCAAAATAATCCCACAACTAACTATAC [...]
+CTAAAACTCACAGCCCTAACCGTAACACTACTGGGTTTCACACTGGCCCTAGAACTCAGCACAACCTCACTAAATCTCAAACTCAAACACGCATCAACTCTATCTAAATTCTCGAACCTACTAGGATATTTCCCCACCATTATTCACCGTTTAGTACCAACGATAAACCTATCAACAAGCCAAAAACTTGCCTCCACACTAATAGATATAATCTGACTAGAGTACCTACTACCAAAATCCGTTTCACACCTAAGCGTGAAGTCATCAGTCACCATTTCTAACCAAAAGGGCCTAATTAAACTATATTTCTTATCTTTCATAATCACCCTAGCCCTAACCCTAATCCTAACAACAACTAGTTTCCACGGG
+>Panthera_pardus
+ATGAACGAAAATCTATTCACCTCTTTCACTACCCCAACAATAATAGGACTGCCTATTGTCGTATTAATTATTATATTCCCCAGCATTCTATTCCCCTCGCCCAATCGACTAATTAATAACCGCCTAGTCTCACTCCAGCAGTGACTAGTACAACTAACATCAAAACAAATACTAGCTATTCACAGCCATAAAGGACAAACTTGAGCCCTGATACTTATGTCTCTCATTTTATTTATTGGGTCGACAAACCTATTGGGTCTACTGCCCCACTCATTTACTCCAACTACTCAATTATCAATAAACCTAGGAATAGCTATTCCCCTATGGGCCGGCGCCGTAGTCACCGGGTTTCGCTACAAAACTAAAGCGTCTCTAGCCCACTTTCTACCACAGGGAACACCAATCCCCCTGATCCCTATGCTTGTAATTATTGAGACCATTAGCCTTTTTATCCAGCCCGTAGCTCTGGCCGTACGACTTACAGCTAACATT [...]
+CCACTTATTAATACACTTAATTGGAGGAGCTGCTCTAGTCCTAATAAACATTAGTGCCTCTATTGCTTTAATTACCTTTATTATCCTCATCCTGCTGACAATCCTTGAATTCGCTGTGGCCCTGATCCAAGCCTACGTCTTTACTCTACTTGTAAGCCTGTATCTACACGATAATACTTAAATGCCACAGTTAGATACATCAACCTGATTCATTACTATCATTTCAATAATTATAACACTATTTATTATATTTCAGCTAAAAATCTCAAAATACTCATATCCATCAAGCCCAGAACCTAAATCCACAGCTACACTAAAACAACCTAATCCTTGAGAAAAAAAATGAACGAAAATCTATTCACCTCTTTCACTACCCCAACAAATGTTCATAAACCGCTGACTATTTTCAACCAATCACAAAGATATTGGAACTCTTTACCTTCTATTTGGTGCCTGGGCTGGCATGGTGGGGACTGCTCTCAGTCTCTTAAT [...]
+AACTGGGTCAACCTGGCACACTGCTAGGGGACGACCAAATTTATAATGTAGTCGTTACCGCCCATGCTTTTGTAATAATCTTCTTTATAGTAATGCCCATCATGATTGGAGGATTCGGAAACTGATTGGTCCCATTAATAATTGGAGCCCCCGATATAGCATTCCCTCGAATGAATAATATGAGCTTTTGACTCCTTCCCCCATCTTTCCTACTTTTGCTCGCATCATCTATGGTAGAGGCTGGGGCAGGAACTGGATGAACAGTATACCCACCCCTAGCCGGCAACCTAGCCCATGCAGGGGCATCCGTAGATTTAACTATTTTTTCACTACACCTGGCAGGTGTCTCCTCAATCTTAGGCGCTATTAATTTTATTACTACTATTATTAATATAAAACCCCCTGCTATATCCCAATACCAAACACCTCTATTCGTCTGATCGGTCTTAATCACTGCTGTATTGCTACTCCTATCACTGCCAGTTTTAGCAG [...]
+ACTATGCTACTGACAGATCGAAATCTGAACACCACATTCTTTGACCCTGCCGGAGGGGGGGATCCTATCTTATACCAGCACCTATTCTGATTTTTTGGTCACCCAGAAGTTTATATTTTAATTTTACCCGGGTTCGGAATAATTTCACACATTGTCACCTATTACTCAGGTAAAAAAGAGCCTTTTGGCTATATGGGAATAGTTTGAGCTATAATATCGATTGGCTTCCTGGGCTTTATCGTGTGAGCCCACCACATGTTTACTGTAGGAATAGATGTGGACACACGAGCATACTTTACATCAGCTACTATAATTATTGCTATTCCCACTGGAGTAAAAGTATTTAGCTGACTAGCCACTCTTCATGGAGGTAGTATCAAATGATCTCCCGCTATGCTATGAGCCCTAGGATTCATCTTTCTATTTACTGTAGGGGGCCTAACGGGAATTGTACTAGCAAATTCCTCATTAGACATTGTCCTTCATGACACA [...]
+AGTAGCCCACTTCCACTACGTACTGTCAATAGGAGCAGTATTTGCTATTATAGGAGGCTTCGTTCATTGATTCCCCCTATTCTCAGGGTATACTCTCGATAATACTTGGGCAAAAATTCATTTTACAATTATGTTCGTGGGTGTCAATATAACGTTTTTCCCTCAGCATTTCCTAGGCTTGTCCGGAATGCCTCGACGTTATTCTGACTACCCAGACGCATATACAACTTGAAACACAGTTTCCTCAATAGGCTCTTTTATTTCACTAACAGCAGTAATATTAATGGTTTTTATAGTATGAGAGGCTTTTGCATCAAAGCGAGAAGTGGCCATAGTGGAACTAACTACAACTAATCTTGAATGATTACATGGATGTCCCCCTCCGTATCACACATTTGAAGAGCCAACTTATGTGTTATTAAAAATGGCATACCCCTTCCAACTAGGTTTTCAAGATGCTACATCCCCCATCATAGAAGAGCTCCTACACTT [...]
+ACACACTAATAATTGTATTCCTAATTAGCTCCCTAGTCCTTTATATCATCTCACTAATACTAACAACCAAACTCACGCACACAAGCACAATGGATGCCCAAGAAGTAGAAACCATCTGAACCATTTTACCAGCTATCATCTTAATTCTCATTGCCCTACCCTCCTTACGAATTCTCTATATAATAGACGAGATTAATAGCCCCTCTCTTACTGTAAAGACCATGGGACATCAATGGTATTGAAGCTATGAATACACTGACTCTGAAGACCTAAGCTTTGACTCCTATATAATTCCCACTCAAGAGCTAAAGCCCGGAGAACTCCGACTATTAGAAGTTGATAACCGAGTAGTACTACCAATGGAAGTGACCATTCGCGTGTTAATCTCATCAGAAGACGTACTACACTCATGAGCCGTCCCATCCCTGGGCCTAAAAACTGATGCTATTCCAGGCCGACTAAACCAAACAACCCTAATGGGTACACGACCTG [...]
+TATGGTCAGTGCTCAGAGATCTGCGGCTCAAACCACAGTTTTATGCCCATTGTTCTTGAACTAGTCCCATTAGCATATTTTGAAAAATGATCTGCGTCTATACTGATGACCCATCAAACCCACGCATACCATATGGTTAACCCCAGTCCATGGCCACTTACAGGGGCCCTTTCAGCTCTACTGATAACTTCAGGTCTGGCTATATGATTTCACCATAACTCAATATTACTATTAACCCTAGGTATAACCACCAACCTGCTAACTATGTATCAGTGGTGACGAGATATTATTCGGGAAAGCACATTCCAAGGCCACCACACGCCTATCGTTCAAAAAGGTCTCCGTTATGGAATAATTCTCTTTATCATCTCAGAAGTATTCTTCTTCGCAGGCTTTTTCTGGGCCTTCTACCACTCAAGCCTAGCCCCAACCCCCGAGTTAGGAGGATGCTGGCCACCAACAGGTATTATTCCCTTAAACCCTCTAGAAGTC [...]
+TAATACCTCCGTACTTTTAGCTTCCGGAGTGTCAATCACCTGAGCCCACCATAGCTTAATGGAAGGGAACCGAAAACATATACTCCAAGCACTATTTATTACAATCTCCCTAGGAGTCTACTTTACCCTTCTCCAGGCCTCCGAATACTATGAAACATCATTTACAATCTCAGACGGAGTCTACGGATCTACCTTCTTCATAGCTACAGGATTCCACGGCCTACACGTAATTATTGGCTCCACCTTCTTAATTGTATGCTTCTTGCGCCAACTAAAATATCACTTCACATCGAGCCATCACTTCGGATTCGAAGCCGCTGCTTGATATTGACACTTCGTAGATGTGGTTTGACTATTCCTATACGTTTCCATTTATTGATGAGGATCCTATATGACCAACATTCGAAAATCACACCCCCTCATCAAAATTATTAATCACTCATTCATTGATCTCCCCGCTCCATCCAACATCTCAACATGATGGAACTTTGG [...]
+TAGGGGTATGTTTAATCCTACAAATTCTCACCGGCCTCTTTCTAGCCATACATTATACATCAGACACAACAACCGCTTTCTCATCAGTTACCCATATCTGCCGCGATGTAAATTATGGCTGAATTATCCGGTATCTACACGCCAATGGAGCCTCCATATTCTTTATCTGCCTATACATACATGTAGGACGAGGGGTATACTATGGCTCCTACACTTTCTCAGAGACATGGAACATTGGAGTCGTATTATTGCTCACGGTTATGGCCACAGCCTTCATAGGATATGTCTTACCGTGGGGCCAAATATCCTTTTGAGGGGCAACCGTAATTACCAACCTCCTATCAGCAATCCCATACATTGGGATTGACCTAGTAGAATGAATCTGAGGGGGCTTCTCAGTAGACAAAGCTACCTTGACACGATTCTTTGCCTTCCACTTCATCCTTCCATTTATCATCTCAGCTCTAGCAGCAGTCCACCTCCTATTCCTTC [...]
+GGATCTAACAACCCCTCAGGAATAGTATCTGACTCAGACAAAATTCCATTCCACCCATACTACACAATCAAAGATATCCTGGGCCTTCTAGTACTAATCTTAGCACTCATACTACTCGTCCTATTCTCACCAGACCTGTTAGGAGACCCCGATAATTACATCCCCGCCAACCCTCTAAATACCCCTCCCCATATCAAGCCTGAATGATACTTCCTATTTGCATACGCAATCCTCCGATCCATTCCCAACAAACTAGGAGGAGTCTTAGCCCTAGTCCTATCCATCCTAATCTTAGCAGTTATCCCCGCTCTCCACACTTCCAAACAACGAGGGATAATGTTTCGACCATTAAGCCAGTGCTTATTCTGATTCCTAGTAGCGGACCTTCTAGCCCTGACGTGAATTGGTGGCCAACCTGTAGAACACCCCTTCATTACCATCGGCCAACTAGCCTCCATCCTATACTTCTCCATCCTCCTAGTCCTAATACCT [...]
+CATTATTGAAAACCGCCTCCTTAAATGAATGTTCATAATTAATATCCTCTCACTAATCGTCCCAATTCTCCTCGCCGTGGCCTTCCTAACTCTAGTTGAACGTAAAGTACTAGGCTACATGCAACTTCGTAAAGGGCCTAATGTCGTAGGGCCATATGGCCTACTTCAACCCATTGCAGACGCCATAAAACTCTTCACTAAAGAACCTCTCCGACCCCTCACATCCTCCATATTCATATTTATTATAGCACCCATCCTAGCCCTCACACTAGCCCTAACCATATGAATCCCACTACCCATACCATACCCGCTCATTAACATAAACCTAGGGGTGCTATTCATACTAGCCATATCCAGCCTAGCTGTTTACTCCATCCTATGATCCGGATGGGCTTCAAACTCAAAATATGCTCTAATCGGCGCCCTACGGGCCGTAGCTCAAACAATCTCATATGAAGTCACACTAGCTATTATCCTCTTATCAGTACTACT [...]
+GATCATTCACATTAGCCACACTAATTACCACTCAAGAATACATCTGACTTATTATTCCCGCATGACCCCTAGCTATAATATGATTCATCTCTACACTAGCAGAAACCAACCGAGCCCCATTTGACCTCACAGAAGGAGAATCGGAGCTTGTTTCCGGATTCAACGTAGAATACGCAGCAGGTCCCTTTGCCCTATTCTTTCTAGCAGAATATGCCAACATTATCATAATAAACATCCTCACAACAATCCTGTTCTTCGGAGCATTTCACAGCCCCTATATACCAGAGCTATACACCACCAACTTCACTGTAAAAACTCTAATCCTAACAACCACCTTCCTATGAATCCGAGCATCTTATCCACGGTTCCGATACGACCAATTAATACACCTCCTATGAAAAAGCTTTCTACCCCTTACCCTTGCCCTATGCATATGACATGTCTCCCTACCCATCATTACAGCAAGCATCCCACCCCAAACAATCAAACCCC [...]
+ATCACCATTATATTAACCGTTATCTCAGGAACTATAATCGTAATAACAACCTCCCACTGACTTATGGTCTGAATTGGCTTCGAAATAAACCTACTAGCCGTCATTCCCATCCTTATAAAAAAATATAATCCACGAGCCACAGAAGCAGCCACAAAATATTTCCTAACACAAGCAACTGCTTCAATACTCCTAATAATAGGAATCATCATCAACCTACTACACTCAGGACAGTGGACCGTATCAAAAGACCTCAACCCCATAGCATCCATTATAATAACAATTGCCCTGGCAATAAAACTAGGACTAGCCCCATTCCACTTCTGAGTGCCCGAAGTCACACAAGGAATCTCCATGTCCTCAGGCCTAATCCTACTCACATGACAAAAAATCGCCCCACTATCAATCCTATACCAAATCTCACCCACCATCAACCCCAGCCTACTCCTAACAATAGCCATCATATCAGTTATAGTCGGAGGTTGAGGAGGACTT [...]
+CCAACTACGAAAAATTATAGCATATTCCTCAATTGCCCACATAGGCTGAATAGCAGCCATCATAATATATAGCCCCACAATAATAATTTTAAACCTGACCATCTACATCATCATAACACTAACCACCTTCATATTATTCATACACAACTCCACCACCACAACATCATCCCTATCACAAACATGAAACAAAACACCCCTAATCACCTCATTTATCCTAGTACTAATAATGTCTCTAGGCGGCCTTCCTCCACTCTCCGGCTTCATCCCAAAATGAATAATCATTCAGGGACTAACTAAAAACGAAATAATTATAATACCCACACTACTAGCTATAACAGCACTACTTAACCTGTACTTCTACATACGACTAACGTATACCACTGCACTGACTATATTCCCCTCAAACAACTGTATAAAAATAAAATGACGATTCGAGTGCACAGAAAAAACAACCTTTTTACCCCCCTTAATTGTAATATCCACCATGCTACT [...]
+CACCAATACTATCCATCCTAGATATAAACGTAATACTCGCCCTACTCACCAATACACTTCTATCTACGCTGCTTGTATTTATTGCATTCTGACTGCCCCAGCTAAATATTTATGCAGAAAAAGCAAGCCCTTATGAATGTGGATTTGACCCCATAGGATCTGCCCGCCTACCCTTCTCCATAAAATTTTTCTTAGTAGCTATTACATTCTTACTATTCGACCTAGAAATTGTACTACTACTCCCCCTTCCCTGGGCCTCACAAACAAACAAACTATCAACCATACTTATCACAGCTCTCCTACTAATCTCCCTACTAGCCGTAAGCCTGGCCTATGAATGAACTCAAAAAGGACTAGAGTGAACTGAAATGTCCATAGTCTATGTTAATATATTTCTAGCTTTCATCATGTCACTCATAGGACTATTAATGTACCGATCCCACTTAATATCCTCCCTCCTATGCCTAGAAGGTATAATACTATCCCTATTTA [...]
+ACCGTGACAATTCTAAATAATCATTTCACACTAGCCAACATGACTCCCATTATCTTGCTAGTATTTGCAGCCTGCGAGGCGGCACTAGGCTTATCCTTACTAGTAATGGTATCAAACACATACGGTACCGACTATGTACAAAACCTAAACCTCCTACAATGCATTATTGTCCCTACTGCCATACTCATACCAATAACATGACTATCAAAACCCAACATAATCTGAATTAACTCAACTACCTATAGCCTTCTGATCAGCCTTATTAGCCTCTCCTATTTAAACCAACTAGGCGACAACAGCCTAAATCTTTCATTACTATTTTTCTCAGACTCACTTTCTGCACCTCTGCTAGTCTTAACAACATGACTCCTACCGCTAATGCTCATGGCTAGTCAATCCCACCTGTCAAAGGAGACCCCATCTCGAAAAAAACTATACATCACAATACTCATCATCTTGCAGCTTCTCTTAATTATAACATTCACTGCCACA [...]
+CATATTCTATATTCTATTTGAAGCCACATTAATCCCCACTCTCATCATCATTACTCGATGGGGCAATCAAACAGAACGACTAAACGCTGGCCTATATTTTCTATTCTATACCCTGATAGGCTCACTGCCCCTTCTAGTCGCACTACTATACATTCAAAACACAACAGGGACTTTAAATTTTCTAGTCATCCAATACTGAGCCAAACCAATCTCAGCCACTTGATCTAACATTTTTCTCTGACTAGCATGCATAATAGCATTTATAGTAAAAATACCCCTATATGGACTCCACCTATGGCTACCGAAAGCACATGTCGAAGCCCCCATTGCCGGCTCAATAGTGCTTGCCGCCGTACTGTTAAAACTAGGGGGGTATGGAATAATACGCATTACAATTCTACTCAACCCCACAACAAACCAAATAGCATACCCCTTCATAATGCTATCCCTATGAGGAATAGTTATAACAAGTTCTATCTGTTTGCGCCAGAC [...]
+AATCCTTAATCGCATACTCATCAGTAAGCCACATAGCCCTAGTAATTGTAGCTGTATTAATCCAAACACCCTGAAGCTATATAGGAGCCACAGCCCTTATAATTGCTCACGGACTAACCTCCTCAATACTATTCTGTCTTGCAAACTCAAACTACGAACGAGTCCACAGCCGAACAATAATTCTAGCACGAGGCCTACAAACCATTCTTCCTCTGATAGCTGCCTGATGGCTACTAGCCAGCCTCGCAAACCTAGCCCTGCCCCCTACCATTAACTTAATCGGAGAACTATTCGTAGTGGTGGCCTCCTTCTCATGATCTAACATAACTATTGTCCTTATAGGCACAAATATTATCATCACAGCCTTATATACCCTCTATATACTCACCACAACCCAACGAGGTAAATACACGCACCATATCAAAAATATCAACCCATCATTCACACGAGAAAACGCCCTAATGGCCCTTCATCTACTCCCACTCCTTCTCT [...]
+AACCCCAAAATCGTACTAGGCCCTATTTATTGTAAAGTAAAAGTAATAAACCTATTTATCTTCTTTATACTCACTGCAATATTTATTCTACTCCTACCTATCATTATATCCAACACTCAACTATACAAAAATAACCTATACCCCCACTATGTAAAAACCACAATCTCTTACGCCTTCACCATCAGCATAATCCCGGCTATAATATTCGTTTCCTCCGGACAAGAAACAATTGTCTCAAACTGACATTGACTATCAATTCAAACCCTCAAATTGTCACTAAGCTTTAAACTAGATTACTTCTCGATCATCTTCATCCCTGTAGCGCTTTTCGTTACATGATCGATCATAGAATTCTCAATATGATACATACACACAGACCCTTATATCAACCGATTTTTCAAGTATCTCCTCATATTTCTAATCACTATAATAATCCTAGTAACCGCCAACAACCTGTTCCAACTGTTTATTGGTTGAGAAGGAGTAGGAATC [...]
+CCTGCTCATCGGATGATGATATGGTCGAGCAGACGCAAACACCGCCGCCCTACAGGCAATTCTCTACAACCGCATCGGAGATGTAGGATTTATCACAGCCATAGCATGATTCCTCGCCAATATAAATGCATGAGACTTCCAACAAATCTTTATTACCCAACACGAAAACCTAAATATTCCATTACTAGGGCTTCTTCTAGCAGCCACAGGCAAGTCTGCCCAATTTGGTCTACACCCATGACTACCGTCAGCCATAGAGGGTCCAACCCCTGTCTCTGCTCTACTTCACTCAAGTACAATAGTTGTAGCCGGAGTCTTTTTATTAATCCGCTTCTACCCACTCATAGAACATAACAAAACCATACAAACCCTCACTCTATGCCTAGGGGCCATCACAACCCTATTTACAGCCATCTGTGCCCTCACACAAAATGACATCAAAAAAATCGTCGCCTTCTCAACCTCGAGCCAATTGGGCCTAATAATCGTCAC [...]
+TCAACCAACCCCACCTTGCATTCCTTCATATCTGTACGCACGCATTTTTCAAAGCTATATTATTCATGTGCTCTGGGTCAATTATTCATAGTCTGAACGATGAACAAGACATTCGAAAAATAGGCGGACTATACAAACCAATACCTTTCACCACCTCCTCCCTCATCATTGGAAGTCTCGCATTAACAGGTATACCTTTCCTAACAGGCTTTTACTCCAAAGACCTAATCATCGAGACAGCCAACACGTCGTATACCAACGCCTGAGCCCTATTGGTCACTCTCATTGCTACATCCCTCACGGCCGCCTATAGTACTCGAATCATATTCTTTGCACTCCTAGGGCAACCTCGGTTTAACTCCCTAAGTCCAATCAATGAAAACAACCCCCACCTCATTAACTCCATTAAACGTCTCTTAATTGGAAGTATTTTTGCAGGATACTTGATTTCCCATAATATCCCCCCAACAACCATCCCACAAATAACTATGC [...]
+CTAAAACTAACTGCTCTCGCTGTAACTATCACAGGCTTTATCTTAGCATTAGAACTCAACCTCGCAGCCAAAAACTTAAAATTTAAATACCCCTCGAATCTCTTTAAGTTTTCTAACCTCCTAGGGTACTTTCCAATTGTAATACACCGCCTCCCATCAACAATAAGCTTAACTATAAGCCAAAAATCTGCATCGATACTATTAGATATAATCTGGCTAGAAAATGTATTGCCAAAATCCATCTCTCACTTCCAAATAAAAATATCAACCACTGTATCTAATCAGAAAGGACTAGTTAAACTCTACTTCTTATCTTTCATAATCACCTTGACCCTTAGCCTACTCTTA??????CTTAGTTTCCACGAG
+>Panthera_tigris
+ATGAACGAAAATCTATTCACCTCTTTTACTACCCCAACAATAATAGGACTGCCTGTTGTTGTGTTAATCGTTATGTTCCCCAGCATTCTATTTCCCTCGCCTAACCGACTAATTAATAACCGCCTAGTCTCACTCCAACAATGATTAGTACAACTTACATTAAAGCAAATACTGATTACCCACAATTACAAAGGACAAACCTGGGCCCTAATACTTATGTCTCTCATTTTATTTATTGGGTCAACAAATCTGCTAGGTCTACTACCTCACTCATTTACTCCAACTACCCAATTATCAATAAACCTAGGCATAGCCATCCCCTTGTGAGCCGGCACCGTAATCACTGGATTCCGTCACAAAACTAAAGCATCCTTGGCCCACTTTCTACCACAAGGAACACCAGTCCCCTTAATCCCTATGCTCGTAATTATCGAAACTATCAGCCTTTTTATCCAGCCCGTAGCCCTAGCCGTACGACTCACAGCTAATATT [...]
+CCATTTATTAATACACCTAATCGGAGGAGCTGCTTTAGCCCTAACAAATATTAGTGCCCCTACTGCTTTAATTACCTTTATCATCCTCATCCTACTGACAATTCTTGAATTCGCTGTAGCTCTAATCCAAGCCTATGTTTTTACCCTACTTGTGAGCCTGTATTTACATGATAATACTTAAATGCCACAGTTAGACACATCAACCTGATTTATTACTATTATTTCAATAATCATGACACTGTTCGTTATATTTCAACTAAAAATCTCAAAACATCTGTACCCATCAAGCCCAGAACCCAAATCTACAGCTGCATTAAAACAGCCGAGTCCCTGAGAAAAAAAATGAACGAAAATCTATTCACCTCTTTTACTACCCCAACAAATGTTCATAAACCGCTGACTATTTTCAACCAATCACAAGGATATTGGAACTCTTTACCTTTTATTTGGCGCCTGGGCTGGTATAGTGGGGACTGCCCTCAGTCTCCTAAT [...]
+AACTGGGTCAACCTGGCACACTACTAGGAGATGACCAAATTTATAATGTAGTAGTTACTGCCCATGCCTTTGTGATAATCTTTTTTATAGTAATGCCTATTATAATTGGAGGATTCGGAAACTGGCTAGTTCCGTTAATAATCGGAGCCCCCGATATGGCATTCCCTCGAATGAATAACATAAGCTTCTGACTCCTTCCCCCATCCTTCCTACTTCTGCTCGCATCGTCTATGGTAGAAGCTGGGGCAGGAACTGGGTGGACAGTATACCCACCCCTAGCTGGCAACCTAGCCCATGCAGGAGCATCCGTGGATCTAACTATTTTTTCACTACACCTAGCAGGCGTCTCCTCAATCTTAGGTGCTATTAATTTTATTACTACTATTATTAATATAAAACCGCCCGCTATGTCCCAATACCAAACACCCCTGTTTGTTTGATCGGTTCTAATTACTGCTGTGTTGCTACTTCTATCACTGCCAGTTTTAGCAG [...]
+ACCATGCTACTGACAGATCGAAATCTAAATACCACATTTTTTGATCCTGCCGGGGGAGGAGACCCCATCTTATATCAACACCTATTCTGATTCTTCGGTCACCCAGAAGTCTATATCTTAATCCTGCCCGGGTTTGGAATAATTTCACATATTGTCACCTACTACTCAGGCAAAAAAGAACCTTTTGGCTACATGGGGATAGTCTGAGCCATAATGTCAATTGGCTTTCTGGGCTTTATCGTATGGGCCCATCACATGTTTACTGTAGGGATAGATGTGGATACACGAGCATACTTTACGTCAGCTACTATAATTATCGCTATTCCTACTGGGGTAAAAGTATTTAGCTGATTGGCCACTCTTCACGGGGGTAATATTAAATGGTCTCCCGCTATACTATGGGCTTTGGGATTCATTTTCCTATTCACCGTAGGGGGCTTAACAGGAATTGTACTAGCAAACTCCTCATTGGATATTGTCCTTCACGACACA [...]
+AGTAGCCCACTTCCACTACGTCTTGTCAATAGGAGCAGTATTTGCTATTATAGGGGGCTTCGTTCACTGATTCCCCTTATTCTCAGGGTATACTCTTGATAATACTTGGGCAAAAGTTCATTTTACGATCATGTTCGTAGGTGTCAATATAACGTTTTTCCCTCAGCATTTCCTAGGCCTGTCTGGGATGCCTCGACGTTATTCTGACTATCCAGACGCGTATACAACTTGAAACACAATCTCCTCAATAGGCTCTTTTATTTCACTAACAGCAGTAATATTAATAGTCTTTATAATGTGAGAAGCTTTCGCATCAAAGCGAGAAGTAGCCACAGTGGAACTAACCACAACTAATCTCGAATGACTTCACGGATGTCCTCCTCCGTATCACACATTTGAAGAGCCAGCCTACGTGCTGTTAAAAATGGCATACCCCTTCCAACTAGGTTTTCAAGATGCTACATCCCCCATTATAGAAGAGCTTTTACACTT [...]
+ATACATTAATAATTGTATTCCTAATTAGCTCCCTAGTCCTCTACATTATCTCATTAATACTGACAACTAAACTTACGCATACAAGCACAATAGATGCCCAAGAAGTAGAAACTATCTGAACCATTTTACCAGCCATCATCTTAATTCTCATTGCCCTGCCTTCCTTACGAATTCTCTATATAATAGATGAGATTAATAATCCCTCCCTCACTGTAAAGACTATAGGACATCAGTGATACTGAAGTTATGAGTACACCGACTATGAGGACCTAAGCTTCGACTCCTACATAATCCCCACTCAAGAGTTAAAGCCCGGAGAGCTCCGACTACTAGAAGTTGATAACCGAGTAGTGTTGCCAATAGAAGTGACTATTCGCATGTTAGTCTCATCAGAGGACGTACTGCACTCGTGAGCCATCCCATCCCTGGGCCTAAAAACTGACGCTATCCCAGGCCGACTAAACCAAACAACCCTAATAGGCACACGGCCTG [...]
+TATGGTCAGTGCTCAGAAATCTGCGGCTCAAATCACAGTTTTATGCCCATTGTCCTTGAACTAGTCCCGCTGTCATATTTCGAAAAATGATCTGCATCTATGCTGATGACCCACCAAACCCACGCATATCACATGGTTAATCCCAGCCCATGGCCACTTACAGGGGCCCTTTCGGCCCTACTAATAACCTCAGGCCTGGCTATATGATTTCACTATAACTCAATACTACTATTAACTCTAGGAATAACCACTAACCTATTGACTATATACCAATGGTGACGAGACATCATTCGGGAGAGCACATTCCAAGGCCACCACACACCCATTGTTCAAAAAGGCCTCCGATACGGAATAATCCTTTTCATCATCTCAGAAGTATTCTTCTTCGCAGGTTTTTTCTGGGCCTTCTATCACTCAAGCCTGGCCCCGACCCCCGAATTGGGAGGATGCTGGCCACCAACAGGTATTATTCCCCTAAACCCCCTAGAAGTC [...]
+CAATACTTCTGTGCTCTTAGCTTCCGGAGTGTCAATCACCTGAGCCCATCATAGCCTAATAGAAGGAAATCGAAAACACATGCTCCAAGCACTATTTATTACAATCTCCCTAGGAGTCTATTTTACCCTCCTCCAAGCCTCTGAGTACTATGAAACATCATTTACAATCTCGGACGGAGTTTATGGGTCCACCTTTTTCATAGCCACAGGGTTCCACGGACTACACGTAATTATTGGCTCTACCTTCCTAATCGTATGTTTCTTGCGCCAACTAAAATACCACTTCACATCGAGCCACCATTTTGGATTCGAAGCCGCTGCTTGATATTGACATTTCGTAGACGTGGTTTGACTGTTCTTATACGTTTCCATTTATTGATGAGGATCCTATATGACCAACATTCGAAAATCACACCCCCTTATCAAAATTATTAATCACTCATTTATTGACCTACCCGCCCCATCCAATATTTCAGCATGATGAAACTTTGG [...]
+TAGGGGTGTGCTTAATCTTACAAATCCTCACTGGCCTCTTTCTAGCCATACACTACACATCAGACACAATAACCGCTTTCTCATCAGTTACCCACATTTGCCGCGACGTAAACTACGGCTGGATTATCCGATATCTACATGCCAACGGAGCCTCCATATTCTTTATCTGTCTATACATGCACGTAGGACGAGGAATATACTACGGCTCCTACACCTTCTCAGAAACATGAAATATCGGGATTGTGCTATTGTTTACGGTCATGGCTACAGCCTTCATAGGATATGTCTTACCATGAGGCCAAATGTCTTTTTGAGGGGCAACCGTAATCACCAACCTCCTGTCAGCAATCCCATATATTGGGACCGACCTAGTAGAGTGAATCTGAGGGGGTTTCTCAGTAGACAAAGCTACCCTGACACGATTCTTTGCCTTCCACTTCATCCTTCCGTTTATCGTCTCAGCCCTAGCAGCAGTCCACCTCCTATTCCTTC [...]
+GGATCCAATAACCCCTCAGGAATGGTGTCCGACTCAGACAAAATCCCATTCCACCCATACTACACAATTAAAGATATCTTAGGCCTCTTAGTACTAATCCTAACCCTCACACTACTCGTCCTATTCTCACCAGACCTATTAGGAGACCCTGATAACTACATCCCCGCCAACCCCCTAAATACCCCTCCCCATATTAAGCCCGAATGGTATTTCCTATTCGCATACGCAATCCTCCGATCTATTCCCAATAAACTAGGAGGAGTTCTAGCCCTAGTCTTATCCATCTTAATCTTAGCCACTATCCCTGCCCTCCACACATCCAAACAACGAGGAATAATGTTTCGACCGCTAAGCCAATGCTTATTCTGACTCTTAGTGGCAGACCTTCTAACCCTAACATGAATTGGTGGCCAACCTGTAGAACACCCCTTTATTGCCATCGGCCAACTAGCCTCTATCCTATACTTCTTCATCCTCCTAGTCCTAATACCC [...]
+CATTATTGAAAACCGCCTCCTTAAATGAATGTTTATAATCAATATTCTCTCATTAATTATCCCTATTCTCTTCGCCGTAGCCTTCCTAACCCTAGTTGAACGTAAAGTACTGGGCTACATACAACTCCGTAAAGGACCAAACGTCGTAGGACCATACGGCCTACTTCAGCCTATTGCAGACGCCATGAAACTCTTCACTAAAGAACCCCTCCGACCCCTCACATCCTCCACATTCATATTCATCACAGCACCCATCCTAGCTCTTACACTAGCCCTAACCATATGAATCCCACTGCCCATACCATACCCACTCATTAACATAAACTTAGGAGTGCTATTTATACTAGCTATGTCCAGCCTAGCTGTTTACTCCATTCTATGATCAGGATGGGCTTCAAACTCAAAATATGCCCTAATCGGAGCCCTACGAGCCGTAGCCCAAACAATCTCATATGAAGTCACATTAGCTATCATTCTCTTATCAGTACTACT [...]
+GATCCTTCACATTAGCTGCACTAATTACCACCCAAGAATACATCTGGCTCATCATCCCTGCATGACCCCTAGCCATAATATGATTCATCTCCACACTAGCAGAAACCAACCGAGCTCCATTTGATCTAACAGAAGGAGAATCAGAACTCGTTTCCGGATTCAACGTAGAATACGCAGCAGGCCCCTTTGCCCTATTTTTTCTAGCAGAATACGCTAATATTATCATAATAAACATCCTCACAACAATCTTATTTTTCGGAGCATTCCATAATCCCTATATACCAGAACTATATACTATCAACTTCACTGTAAAAACCCTAATTCTAACAACCACCTTCCTATGGATCCGAGCATCTTATCCACGATTCCGATATGACCAATTAATGCACCTCCTATGAAAAAACTTCCTACCCCTTACTCTAGCCCTATGCATATGACACGTCTCCCTACCCATCATTACAGCAAGCATTCCACCCCAAACAATCAAACCCC [...]
+ACCATCATTATACTAACCGTTATCTCAGGAACTATAATCGTAATAACAACTTCTCACTGACTTATAGTCTGAATTGGCTTCGAAATAAACCTATTAGCTATTATTCCCATCCTCATGAAAAAATATAACCCACGAGCCATAGAAGCAGCCACAAAATACTTCCTGACACAAGCAACCGCTTCAATACTCCTAATAATAGGAATTATCATCAACCTGCTGCACTCAGGACAATGAACCGTATCAAAAGACCTCAACCCCATGGCATCCATTATAATAACAACCGCCTTAGCAGTAAAACTAGGACTAGCCCCATTCCACTTCTGAGTGCCCGAAGTTACACAAGGAATCTCCTTGTCTTCAGGCCTGATCCTACTCACATGACAAAAAATCGCACCACTATCAATTCTTTACCAAATTTCACCCACCATTAACCCCAACCTACTCCTAGCAATAGCCATTATATCAGTTATAATCGGAGGCTGAGGGGGACTT [...]
+CCAGCTACGAAAAATCATAGCATACTCCTCAATCGCCCATATAGGTTGAATAACAGCCATCATAATATATAGCCCCACAATAATAATTTTAAACCTGACTATCTATATCATTATAACACTAACCACTTTCATGTTACTCATATACAACTCCACCACAACAACATTATCCTTATCACAAACATGAAACAAAACGCCCCTGATCACCTCACTTATCCTACTGCTAATAATGTCTCTGGGCGGCCTCCCCCCACTCTCTGGCTTCATCCCAAAATGAATAATCATTCAAAAACTAACCAAAAATGAAATAATCATAATACCCACACTACTAGCCATAACAGCACTACTTAACCTGTACTTCTACATACGACTAACATATACCACTGCACTAACTATATTCCCCTCAAACAACTGTATAAAAATAAAATGACGGTTCAAATGCACAAAAAAAATAATCTTTTTACCCCCCTTAATCGTAATGTCCACCATGCTACT [...]
+CACCAATACTATCCGTCCTAGATATAAACATAATACTCGCTCTACTCACCAACACACTTCTATCCACACTACTTGTACTCATCGCGTTCTGACTACCCCAACTAAACACCTATGCAGAAAAAGCAAGTCCTTATGAATGTGGATTTGACCCCATAGGATCCGCTCGCCTGCCCTTCTCCATAAAATTCTTCCTAGTAGCTATCACATTCTTGCTATTCGACCTAGAAATTGCACTACTGCTCCCTCTTCCCTGAGCCTCACAAACAAACAAACTGTCAACCATGCTTATCACAGCCCTTCTACTAATCTCCCTATTAGCCGCAAGCCTAGCCTACGAGTGAACCCAAAAAGGATTAGAATGAACTGAAATGTCCATAGTCTATGTTAACATCTTCCTGGCTTTCATCGTATCACTCATAGGACTATTAATGTACCGATCCCACTTAATATCCTCCCTTCTATGCCTAGAAGGCATAATACTATCCCTATTTA [...]
+ACCATGGCAGTTCTAAACAATCACTTTACACTAGCTAGCATGACCCCCATTATCCTGCTAGTATTTGCAGCCTGCGAGGCAGCACTGGGCTTGTCCCTACTAGTAATGGTATCAAATACATATGGTACCGACTATGTACAAAACCTAAACCTCTTGCAATGCATTATTATCCCCACTGCCATACTCATACCAATAACATGATTATCAAAACCCAGCATAATCTGAATTAACTCAACCACCTATAGTTTTCTGATCAGCCTTGTTAGCCTGTCCTACTTAAATCAACTAGGCGACAACAGCCTAAATCTCTCATTACTATTTTTCTCAGACTCACTCTCTGCACCCCTACTAGTATTAACAACATGACTCTTACCACTAATGCTCATGGCTAGTCAATCACACCTGTCAAAAGAGACCCTAGCCCGAAAAAAACTATACATTACAATACTTATTATCCTACAACTCCTCTTAATTATAACATTCACCGCTACA [...]
+TATATTCTACATTCTATTCGAAGCTACATTAATCCCTACTCTTATTATTATCACTCGATGAGGCAATCAAACAGAGCGACTAAACGCTGGTCTGTACTTTCTATTCTACACCCTGGTAGGCTCACTACCCCTCCTAGTCGCACTACTATACATCCAAAACACAACAGGAACTCTGAACTTCCTAATTATTCAATACTGAGCCAAACCAATTTCAGCCACCTGATCTAATATCTTTCTCTGACTAGCATGCATAATAGCATTCATAGTAAAAATACCTCTATATGGGCTCCACCTGTGACTACCAAAAGCACATGTCGAAGCTCCCATTGCCGGCTCAATAGTCCTTGCTGCTGTACTGTTGAAGCTAGGAGGATATGGAATGATACGCATTACAATCCTACTCAACCCCACAACAAACCAAATGGCATACCCCTTCATAATGCTATCCCTATGGGGAATAATTATAACAAGCTCTATTTGTCTACGCCAGAC [...]
+AATCCCTAATCGCATATTCATCCGTAAGCCATATGGCCCTAGTAATCGTGGCCGTACTAATTCAAACACCTTGGAGTTACATAGGAGCCACAGCTCTTATAATCGCCCACGGACTAACTTCCTCAGTGCTATTTTGCCTTGCAAACTCAAACTACGAACGAATCCATAGCCGAACAATAATTCTCGCACGAGGCCTACAAACCATCCTCCCCCTAATAGCTGCTTGATGACTACTGGCCAGCCTCGCAAACCTGGCCCTACCTCCTACTATTAACCTAATTGCAGAGCTATTTGTAGTAGTGGCCTCCTTTTCATGATCTAACATAACCATTACTCTCATGGGCACAAATATCATCATCACAGCCCTATATACCCTCTACATACTCATTACAACCCAACGAGGCAAATATACACACCACATTAAAAACATCAATCCATCATTCACACGAGAAAATGCCCTAATAACACTTCATCTGCTCCCACTTTTTCTCT [...]
+AACCCCAAAATCGTACTAGGTCCTATTTACTGTAAAATAAAAGTAATAAACCTACTTACCTCCTCTATACTCACTGCGATATTTATCCTACTCCTACCTATCATTACATCCAACACTCAATTATATAAAAGTAACCTATACCCTCACTATGTAAAAACCACAATCTCTTACGCCTTTACCATTAGTATAATCCCAGCCATAATATTCATTTCCTCCGGACAAGAGATAACCATCTCAAACTGATGTTGACTATCAATTCAAACCCTTAAATTATCACTAAGCTTCAAACTAGATTATTTCTCGATCATCTTCATCCCAGTAGCACTTTTCGTTACATGGTCGATCATAGAATTCTCAATGTGATACATACACACAGATCCCTATATTAACCAGTTCTTTAAGTACCTCCTTATATTCCTAATCACTATAATGATCTTAGTGACCGCCAATAATCTATTTCAGCTGTTTATTGGATGGGAGGGAGTAGGAATT [...]
+CCTACTTATCGGATGATGATATGGTCGAGCAGACGCAAACACTGCCGCCCTGCAAGCAATTCTCTACAACCGTATTGGTGATGTAGGATTTATCATGGCCATAGCATGATTCCTTACCAACCTAAATGCATGAAACCTCCAACAAATCTTTATCACTCAACATGAAAGCCTGAATATGCCATTACTAGGACTCCTCCTAGCCGCCACAGGCAAGTCCGCCCAATTTGGCCTACACCCATGATTGCCATCAGCCATAGAAGGTCCAACTCCCGTCTCCGCCCTACTCCACTCAAGCACAATAGTTGTAGCCGGAGTCTTCTTATTAATCCGCTTCCACCCACTCATAGAACAAAATAAAGCCATACAAACCCTCACTCTATGCCTGGGGGCCATCACAACCCTATTCACAGCCATCTGTGCCCTCACACAAAATGATATTAAAAAAATTGTTGCTTTCTCAACTTCAAGCCAATTAGGCCTGATAATCGTTAC [...]
+TTAACCAACCCTACCTTGCATTCCTGCATATCTGCACACACGCATTTTTTAAAGCCATATTATTCATGTGCTCCGGATCAATTATCCACAGTCTAAACGACGAGCAAGATATTCGAAAAATAGGCGGACTATATAAACCAATACCCTTTACTACCACCTCCCTTATTATCGGAAGCCTCGCATTAACAGGCATGCCATTCCTAACAGGCTTTTACTCCAAAGACCTAATCATCGAGACAGCCAATACGTCGTATACCAACGCCTGAGCCCTATTGGTCACTCTCATTGCTACATCCCTCACAGCCGCCTATAGTACTCGAATCATATTCTTTGCACTCCTGGGGCAACCCCGATTCAACTCCCTAAGCCCAATCAATGAAAACAACCCCCACCTCATCAACTCCATTAAACGTCTCTTAATTGGAAGCATTTTTGCAGGATACTTGATCTCCCATAACATCCCCCCAACGACCATCCCACAAATGACCATAC [...]
+CTAAAACTAACTGCTCTCGCCATGACCATCATAGGCTTTATCCTGGCATTAGAGCTTAACCTCGTGGCTAAAAACTTAAAATTTAAATACCCCTCAAATCTTTTTAAGTTTTCTAACCTCCTCGGGTACTTTCCAATCGTAATTCACCGCCTCCCATCGATAATAAGCCTAACCATAAGCCAAAAATCCGCATCGATACTATTAGATATAATCTGGCTAGAAAATGTAATACCAAAATCCATCTCCCACTTCCAAATAAAAATATCAACCGCCGTATCTAATCAGAAGGGACTAGTTAAGCTCTACTTCCTATCCTTCATAATCACCCTGACCCTTAGCCTACTCTTA??????CTTAGTTTCCACGAG
+>Phoca_caspica
+ATGAACGAAAATCTATTCGCCTCTTTCGCTACCCCTACAATAATAGGTCTTCCTATCGTAGTCCTAATTGTCTTATTCCCAAGCATCCTATTTCCATCTCCTGACCGACTAATCAATAATCGCCTCACCTCAATTCAACAGTGGCTAATCCAATTAACGTCAAAACAAATGTTGTCAATCCATAACCATAAAGGACAGACATGAGCACTTATACTTATTTCACTTATTCTATTTATTGGATCCACTAACCTGCTAGGCCTCCTACCACACTCATTCACCCCTACCACCCAACTATCCATAAACCTAGGAATGGCTATCCCCCTATGAGCAGGAACAGTCATCACAGGTTTTCGACACAAAACAAAAGCATCCCTAGCCCACTTCCTACCCCAAGGAACACCTCTACCCCTCATTCCGATGCTAGTGATCATCGAAACTATTAGCCTATTCATTCAACCCATAGCCTTAGCCGTACGACTAACGGCCAATATT [...]
+TCACCTACTAATCCACCTAATCGGAGGAGCTACCCTCGCCCTTATAGACATTAGCACCACTACAGCATTCATTACTTTCATCATCCTTATCCTGCTTACTATCCTTGAATTTGCCGTAGCCCTCATTCAAGCCTATGTCTTCACACTGCTAGTAAGCCTATATCTACATGACAATACCTAAATGCCACAGTTAGATACATCAACTTGACTCATCATAATCTTATCCATAATCCTAACCCTATTCATCACGTTTCAGCTAAAAGTCTCTAAACACTACTTCCCAACAAACCCAGAACCAAAACACGCGCTACTATTAAAAAACAGTGCACCCTGAGAAGAAAAATGAACGAAAATCTATTCGCCTCTTTCGCTACCCCTACAAATGTTCATAAATCGATGGTTATTTTCCACAAATCATAAGGATATTGGCACTCTTTATTTGCTGTTTGGCGCATGAGCTGGAATGGTAGGCACCGCCCTTAGTCTCTTAAT [...]
+AACTAGGACAACCTGGCGCCCTACTAGGAGATGACCAAATTTACAACGTAATTGTCACCGCCCATGCATTTGTAATAATTTTCTTCATAGTAATGCCCATCATAATTGGGGGCTTTGGGAACTGACTAGTGCCCCTAATAATTGGAGCTCCTGATATAGCATTCCCCCGAATAAACAACATAAGTTTCTGACTCTTACCACCATCCTTCCTACTACTACTGGCCTCCTCTATAGTAGAAGCAGGTGCCGGGACCGGGTGAACCGTTTATCCTCCCCTAGCTGGGAACCTGGCTCATGCAGGGGCATCTGTAGATCTAACGATTTTCTCCCTCCATTTGGCAGGTGTATCATCTATTCTTGGGGCTATCAACTTCATCACCACCATTATTAATATAAAACCCCCTGCAATGTCTCAATACCAAACTCCACTGTTCGTGTGATCCGTATTAATCACGGCAGTGCTCCTGCTATTGTCACTACCAGTCCTAGCAG [...]
+ACCATGTTACTTACAGACCGAAACCTGAATACAACATTCTTCGACCCTGCCGGAGGAGGTGATCCTATCCTGTATCAACATCTATTCTGATTCTTCGGGCATCCCGAAGTGTATATTCTAATCCTACCAGGATTCGGAATAATCTCACACATTGTCACCTACTATTCAGGGAAAAAAGAACCTTTTGGTTATATAGGAATAGTTTGAGCAATAATGTCCATCGGCTTCCTGGGCTTCATTGTATGAGCCCACCATATATTCACTGTAGGGATGGACGTCGACACACGAGCATACTTCACTTCAGCCACTATAATTATTGCAATTCCGACAGGAGTTAAAGTATTCAGCTGACTAGCTACCCTTCATGGGGGCAATATCAAGTGATCTCCAGCCATATTATGAGCCCTGGGCTTTATCTTCCTATTTACAGTGGGGGGCCTCACAGGTATCGTACTAGCCAACTCATCACTAGACATTGTCCTTCATGACACA [...]
+AGTAGCACATTTCCATTATGTTTTATCAATAGGAGCAGTATTCGCTATTATGGGCGGATTTGTCCATTGATTCCCCCTATTCTCGGGCTATACACTCGACGACACTTGAGCAAAAATTCACTTCACAATCATGTTCGTAGGAGTCAACATAACATTCTTTCCCCAACACTTCCTAGGTCTATCAGGAATACCTCGACGATACTCCGACTATCCAGACGCCTACACGACATGAAATACAGTCTCCTCTATGGGCTCATTCATTTCACTCACAGCGGTGATATTAATAGTATTCATAATCTGAGAAGCTTTCGCATCTAAGCGAGAAGTAGCAGCAGTTGAATTAACTACAACTAATATCGAATGACTGCATGGATGTCCCCCTCCTTATCACACATTTGAAGAGCCCACTTACGTCGTACTAAAAATGGCATACCCCCTACAAATAGGCCTACAAGATGCAACCTCTCCCATTATAGAGGAGTTACTACACTT [...]
+ACACATTAATAATTGTATTTCTAATTAGCTCATTAGTACTCTACATTATTTCACTCATGCTAACCACGAAACTTACCCACACAAGTACAATAGACGCACAAGAAGTGGAAACAGTATGAACAATCCTACCCGCTATCATCTTAATCCTCATTGCCCTACCATCATTGCGAATCCTCTACATAATGGACGAGATCAATAATCCTTCCTTGACCGTAAAAACTATAGGACATCAGTGATACTGAAGCTATGAATACACAGACTACGAAGACCTGAACTTTGACTCATACATGATCCCTACACAAGAGCTAAAGCCCGGAGAACTACGACTGCTAGAAGTAGACAACCGAGTAGTCCTCCCAATAGAAATAACAATCCGCATACTAATCTCATCAGAAGATGTACTCCACTCATGAGCCGTACCGTCTCTAGGACTAAAAACTGACGCTATCCCAGGACGACTAAACCAGACAACCCTAATAGCCATACGACCAG [...]
+TACGGTCAATGCTCAGAAATCTGTGGTTCAAACCATAGCTTCATACCTATCGTCCTTGAATTGGTCCCACTATCCCACTTCGAGAAGTGATCTACCTCAATGCTTATGACCCACCAAACCCATGCATACCATATAGTCAACCCCAGTCCATGACCCCTAACAGGAGCCCTCTCAGCCCTTCTCATGACATCCGGCCTAATCATGTGATTCCACTTTAACTCAATATACCTACTGATGCTAGGCCTCACTACCAACACCCTGACTATATACCAATGATGACGAGACATTGTCCGAGAAAGTACATTCCAAGGTCACCATACTCCAATTGTCCAAAAAGGCTTGCGATACGGTATGATCCTCTTCATCGTATCAGAAGTATTCTTCTTCGCCGGTTTTTTCTGAGCCTTTTACCACTCCAGCCTAGCACCCACCCCCGAGCTGGGAGGATGCTGACCACCCACAGGTATTACTCCTCTAAACCCTATAGAAGTC [...]
+AAATACTTCCGTCCTTTTAGCCTCAGGAGTATCAATTACCTGAGCTCACCATAGCCTAATAGAAGGAAACCGCAAGCACATACTTCAAGCACTATTCATTACCATCTCCCTAGGCGTTTACTTCACATTACTACAAGCCTCAGAACACTATGAAACTCCTTTCACAATCTCCGACGGAATTTACGGCTCTACCTTCTTCATGGCAACAGGATTCCATGGACTGCACGTAATCATCGGTTCAACTTTCTTAATTGTATGCTTCATACGACAGCTAAAATTTCACTTCACATCTAACCACCATTTCGGCTTTGAAGCCGCCGCCTGATACTGACATTTCGTAGACGTAGTGTGACTATTCCTATACGTATCTATCTATTGATGAGGATCTTGCATGACCAACATCCGAAAAACCCATCCACTAATAAAAATTATCAACAGCTCATTTATCGACCTACCCACACCATCAAATATCTCAGCATGATGAAACTTTGG [...]
+TCGGAATCTGCCTAATCCTACAGATCTTAACAGGCTTATTCCTAGCCATACATTACACCTCAGACACAACCACAGCCTTCTCATCAGTAACCCACATCTGCCGGGACGTAAACTACGGCTGAATCATCCGTTATCTTCACGCAAATGGAGCTTCCATATTCTTCATCTGCCTATACATGCATGTAGGACGAGGGCTGTATTACGGCTCCTACACATTCACAGAGACATGAAACATCGGCATTATCCTCTTATTCACCGTCATAGCTACAGCATTCATGGGCTACGTCCTACCGTGAGGACAAATATCATTTTGAGGAGCAACAGTCATTACCAATCTACTATCAGCAATCCCCTATATCGGAACCGACCTTGTACAATGAATCTGAGGAGGATTTTCAGTAGACAAAGCAACCTTAACACGATTCTTCGCCTTCCATTTCATCCTACCATTCGTAGTATTAGCGCTAGCAGCAGTCCACCTACTATTCCTAC [...]
+GGATCAAACAACCCCTCCGGAATCACATCCGACTCAGACAAAATCCCATTCCACCCGTACTATACAATTAAAGATATCCTAGGAGCTCTACTCCTCATTCTAGTCCTAACACTATTAGTGCTATTCTCACCCGACCTATTAGGAGACCCCGACAACTACATCCCTGCCAATCCCCTAAGCACCCCACCACATATCAAACCCGAATGATACTTCCTATTCGCCTACGCAATCTTACGATCCATCCCCAACAAACTAGGAGGAGTACTAGCCCTAGTACTCTCCATTCTTATCCTCGCCATCATACCCCTACTCCACACATCAAAACAACGAGGAATGATGTTCCGGCCCATCAGCCAATGCCTATTCTGACTTCTAGTAGCAGACCTACTTACACTGACATGAATCGGAGGACAACCAGTCGAACACCCCTATATTACCATTGGTCAACTAGCCTCAATTCTATACTTTATAATCCTCTTAGTACTCATACCC [...]
+CATCATCGAAAATAACATCCTAAAATGAATGTTTATAATTAATATCATCTCACTAATTATCCCAATTCTCCTCGCCGTAGCTTTCCTAACATTAGTGGAACGGAAAGTACTAGGCTACATACAACTCCGAAAAGGACCCAACATCGTAGGACCCTACGGACTCCTACAACCCATCGCAGACGCCGTAAAACTATTCACCAAAGAACCCCTACGACCACTGACATCTTCCACAACCATATTCATTATAGCCCCTATTCTAGCCTTAGCCTTAGCCCTAACTATATGAGTCCCCCTGCCCATACCATACCCCCTCATCAATATAAACCTAGGAGTGTTATTCATACTAGCAATATCAAGCCTAGCTGTCTACTCAATCCTATGATCCGGATGGGCTTCAAACTCAAAATACGCCCTAATCGGAGCCTTACGAGCCGTAGCCCAAACAATCTCATACGAAGTGACCCTAGCCATTATCCTTCTATCAGTCCTACT [...]
+GATCCTTCACCCTATCCACACTAATCATTACTCAAGAACACTTATGACTAATCTTTCCCGCATGACCACTAGCCATAATATGATTTATCTCCACCCTAGCAGAAACCAACCGTGCCCCATTTGACCTCACGGAAGGAGAATCAGAACTCGTCTCAGGATTCAACGTAGAGTACGCAGCAGGCCCATTCGCTATATTCTTCTTAGCAGAATACGCTAACATCATCATAATAAACATCCTCACGACCCTCTTATTCTTCGGGGCATTTCACAACCCATATATACCTGAACTATACGTCATCAACTTTACCGTAAAAACCCTGGCACTGACAATTCTATTCCTATGAATTCGGGCATCGTACCCACGATTCCGATACGACCAACTAATACATCTTCTATGAAAAAACTTCCTACCCCTTACACTAGCCCTATGTATATGACATGTAACCCTACCCATCATCTCAGCAAGCATTCCCCCTCAAACAATAAAACCCC [...]
+ATCATCATTATATCAACCGTTATATCAGGGACCATAATCGTCCTCACGAGCTCCCATTGGCTACTGATCTGAATTGGCTTTGAAATAAACATGCTAGCGGTTATCCCAATCCTGATAAAAACCCATACCCCACGAGCCACAGAAGCATCCACAAAATATTTCCTAACACAAGCCACCGCATCTATACTCCTAATGATGGGCATTATTATCAACCTGACATTCTCGGGAGAATGAACAATCTCAAAAATCCCCAACCCCATCGCATCAGGCCTAGTAACCATTGCTCTAACAATAAAACTCGGCATAGCCCCCTTCCACTTCTGAGTGCCTGAAGTGACACAAGGAATCTCACTATCCTCAGGCATAATCCTACTCACATGACAAAAAATTGCACCACTATCCGTTCTCTATCAAATTTCACCATCCATTAACCCCAAACTATTAATTACCATAGCAATCGCATCAGTACTGATCGGAGGCTGAGGAGGACTA [...]
+CCAACTCCGAAAAATCCTAGCCTACTCATCAATCGCCCACATAGGATGAATAGCTGCCATTCTAACATACAACCCTACCCTAATAATCCTAAACCTCACAATCTACATTGCAATAACCCTAAGCACATTCATACTATTCATACACAACTCATCCACGACGACACTATCACTATCGAACACATGAAATAAACTACCGCTCATGACATCACTAATCCTAGTACTAATAATATCACTAGGAGGCCTCCCACCTCTATCAGGTTTCGCGCCCAAATGAATAATCATTCAAGAACTAACAAAAAATGATATAATTATTCTACCAACATTCATGGCCATCACAGCACTATTAAACCTATACTTCTACATACGCCTATCCTACACCACAGCACTAACCATGTTCCCCTCAGTAAACAACATAAAAATAAAGTGACAATTCGAAAGTGCAAAAAAAATTATCCTTCTACCACCACTAATCATCATCTCGACCATACTACT [...]
+CCCCAATAATATCTATCTTAGAAATAAACATAGCATTAACCCTATTTACCAACACAGCCCTGGCCTCTCTACTCGTACTAATTGCATTCTGACTCCCTCAGCTAAATACATACTCAGAAAAAGCCAGCCCCTACGAATGTGGATTCGACCCCATAGGATCAGCACGCCTACCCTTCTCCATAAAATTCTTTCTAGTAGCCATCACATTCCTACTATTCGACCTAGAAATTGCCCTACTCCTCCCACTTCCATGAGCATCGCACACAGATAACCTAACCACCATACTTACCATAGCACTACTACTCATCTCTCTCCTAGCCGCAAGCCTAGCCTACGAATGAACTGAAAAGGGACTAGAATGAACAGAAATGTCCATAGTATATGCCAACATCTTCTTGGCCTTCATTATATCTCTTATAGGACTACTTATATACCGATCCCACCTGATATCCTCCCTACTCTGCCTAGAGGGTATGATATTATCATTATTTG [...]
+ACAGCAACAATCCTGAACAACCATTTTACACTAGCTAGCATAGCCCCCATTATCCTTCTCGTCTTCGCTGCTTGTGAAGCAGCCCTAGGACTGTCACTCCTAGTAACAGTGTCCAACACATACGGAACCGACTACGTACAAAATCTGAACCTCCTACAATGCATCATTATCCCCACCATAATACTTATACCCCTAACGTGAATATCAAAACCTAACATGATCTGAATCAACACGACAACCTATAGCCTACTAATCAGCCTTATCAGCCTGTCCTTCCTAAATCAACTCGGTGACAATTGCATAAGCCTGTCCCTACTATTTTTCACAGACTCCCTATCAGCTCCCCTATTAGCACTCACAACATGATTGCTACCCCTGATACTTATAGCTAGCCAATTTCACCTATCAAAAGAGCCACTAGTCCGGAAAAAACTTTACATTACAATACTAATCCTACTACAACTATTCCTAATCATAACATTTACCGCTACA [...]
+CATATTTTACATTCTATTTGAAGCAACCCTAGTACCTACTCTAATTATTATTACCCGATGAGGAAACCAGACAGAACGCCTAAATGCAGGAACGTACTTCCTATTTTATACTCTAGTAGGATCTTTGCCCTTGCTAGTAGCCCTTCTATTCATCCAAAACAATATAGGTACATTAAACCTCCTAATAATCCAACTCTGAGCCCAGCCCCTACCAAACTCCTGATCTAACACCCTCCTATGATTAGCATGTATAATGGCATTCATAGTAAAAATACCCCTATACGGCCTCCACCTATGACTGCCTAAAGCCCACGTAGAAGCACCCATCGCTGGGTCCATGGTACTGGCCGCAGTACTTCTAAAACTAGGAGGCTATGGCATGATACGAATTACAGCACTACTAAGCCCACTAACAAGCTTCATGGCATACCCCTTCATAATACTATCATTATGAGGCATAATCATAACTAGCTCCATCTGCTTACGCCAAAC [...]
+AATCCCTAATTGCGTATTCCTCTGTCAGTCACATAGCCCTAGTCATCGTAGCAATCCTCATCCAAACACCATGAAGTTACATAGGAGCAACAGCCCTGATAATCGCCCACGGTTTAACATCATCCGTATTATTCTGCCTAGCCAACTCCAACTACGAACGCACCCATAGTCGAACTATAATCCTCGCACGCGGACTGCAAGTGCTCCTTCCCTTAATAGCAGCCTGATGGCTATTGGCAAGTCTTACCAACCTGGCACTTCCGCCTACCATCAATCTAATTGGAGAACTATTCGTAGTAATAGCCTCATTTTCATGATCCAACATTACTATCATCCTAATAGGAACCAACATCATCATTACCGCCCTATATTCACTGTACATACTAATTACCACGCAACGCGGCAAATATACCTATCACATCAAAAACATCAAACCCTCATTCACACGAGAAAACGCCCTAATAACGCTCCACCTAATGCCCCTACTACTAC [...]
+AACCCCAAAATCATTCTAGGACCCATCTACTGTAAAATAAAAGTAATTAACTTATTCGCTTCCTCTATCATCACAACACTATTCATACTAACACTCCCAATCGTCTTAACCAGCACCTCAATCTACAAAAACAAGCTTTACCCACAATACGTAAAAACCACCATTTCATACGCCTTCATAATCAGTATGATCCCCACAACAATATTCATCTACTCAGGGCAAGAGATAATTATCTCAAACTGACACTGAATAACAATTCAAACCATAAAACTTACACTTAGCTTTAAACTAGACCATTTTTCCATAATTTTCGTACCTGTGGCCCTCTTCGTTACATGATCCATTATAGAATTTTCAATATGATACATACACTCAGATCCTTTCATCAACCGATTCTTCAAATACCTACTAATATTCCTCATCACCATGATGATTTTAGTTACCGCAAACAACCTATTTCAACTATTCATCGGCTGAGAAGGAGTGGGTATC [...]
+CCTTCTCATCGGGTGATGACACGGACGAACCGACGCAAATACAGCCGCCCTCCAGGCAGTCCTCTATAATCGCATTGGAGACGTAGGCTTTATCATAGCCATAGCATGATTCTTAATTAATCTAAACACATGGGAACTTCAACAGATCTTCATTTCCCACCACAACAACCTAAATATGCCACTTATAGGCCTCCTCCTAGCAGCAACTGGAAAATCAGCTCAATTCGGGCTTCACCCATGACTGCCTTCAGCCATAGAAGGACCCACCCCAGTATCCGCCCTACTCCATTCAAGTACCATGGTCGTAGCAGGAGTTTTCCTCCTAATTCGATTTCACCCTCTAATAGAACACAACACGATAGTACAAACAACCACCCTATGCCTAGGGGCTATCACCACCCTATTCACAGCAATCTGTGCACTCACCCAAAACGACATCAAGAAAATCATCGCATTCTCAACCTCAAGCCAACTAGGACTCATAATCGTCAC [...]
+TCAACCAACCACATCTGGCATTCCTACACATCTGCACTCACGCATTTTTCAAAGCTATACTATTTATATGCTCCGGATCTATCATTCACAGCCTAAACGATGAGCAAGATATTCGAAAAATGGGAGGTTTATACAAAGTACTGCCATTCACCACTACCTCATTAATTGTAGGAAGCTTAGCACTTACAGGAATGCCCTTCCTCACAGGATTCTACTCCAAAGACCTAATCATCGAAACTGCCAACACGTCGTATACCAACGCCTGAGCCCTATTACTAACCCTCGTCGCCACATCCATAACAGCAGCCTACAGCACTCGAATTATATTCTTCGCACTCCTAGGTCAGCCTCGATTTAACCCCATAATTACAATCAACGAGAATAGCCCACTCCTAATTAATTCCATTAAACGCCTCCTACTAGGAAGCATTTTTGCAGGGTACTTAATCTCCTACAACATTACACCCACCTCCACTCCACAAATAACCATAC [...]
+CTAAAACTAACAGCCCTGACCGTAACACTTCTGGGCTTCATCCTAGCACTGGAACTGAACCTCACTTCACAAAGCCTTAAACTCAAACACCCATCAAACCTATTTAAATTCTCCAACCTCCTCGGATACTTCCCCACTATTATCCACCGCTACATACCGATAGTAAACTTATCAGCAAGCCAGAAACTGGCCTCAACACTACTAGATGCAATCTGGCTAGAAAGTGCATTACCAAAATCCATCTCTTACTTTCACATAAAATCATCAGTCACTATCTCCAATCAAAAAGGCCTAATTAAACTATATTTCCTCTCCTTCACCATCACCTTAATCCTGGCCCTAATAATA??????ATTAATTCCCACGAG
+>Phoca_fasciata
+ATGAACGAAAATCTATTCGCCTCTTTCACTACCCCTACAATAATAGGTCTTCCTATCGTAATCCTAATCGTCCTATTCCCAAGCATCCTATTTCCATCCCCTGATCGACTAATTAACAATCGTCTCGCCTCAATCCAACAATGATTAATCCAGTTAACATCAAAGCAAATACTATCAATCCACAACCACAAAGGACAAACATGAGCACTTATACTTATATCACTTATTCTATTTATTGGATCTACTAACCTGCTAGGCCTCTTACCACACTCATTCACTCCTACCACTCAATTGTCCATAAACCTGGGAATGGCTATCCCCCTATGAGCAGGGACAGTCATCATGGGTTTTCGACATAAAACAAAAGCATCCCTGGCCCACTTCCTACCCCAAGGAACACCTCTACCTCTCATTCCAATGCTAGTAATTATCGAAACTATCAGCCTATTCATTCAACCTATGGCCCTAGCCGTACGACTAACAGCCAACATT [...]
+TCACCTACTAATTCACCTAATCGGAGGAGCTACCCTTGCCCTCATAGATATTAGCACCACTACAGCATTCATTACTTTCATCATCCTTATCCTACTCACCATCCTCGAGTTTGCCGTAGCCCTCATTCAAGCCTATGTCTTCACACTACTAGTAAGTCTATACCTACATGACAATACCTAAATGCCACAGTTAGATACATCAACATGATTTATCATAATCTTATCCATAGTCCTAACCCTATTCATTACGTTTCAACTAAAGATCTCTAAGCATTATTTCCCAACAAACCCAGAACCAAAACATACACTACTACTAAAAAACAACTCACCCTGAGAAGAAAAATGAACGAAAATCTATTCGCCTCTTTCACTACCCCTACAAATGTTCATAAATCGATGGCTATTTTCTACAAACCATAAAGATATTGGCACTCTTTATTTACTGTTCGGTGCATGAGCTGGTATGGTAGGCACTGCCCTTAGTCTCTTAAT [...]
+AACTAGGGCAACCTGGTGCTCTACTAGGAGATGACCAAATTTACAACGTAATTGTCACCGCCCATGCATTTGTAATAATTTTCTTTATAGTAATACCTATTATAATTGGCGGTTTTGGGAACTGACTAGTACCCTTAATAATCGGGGCCCCTGATATAGCATTTCCCCGAATAAATAACATAAGTTTCTGACTTTTACCACCATCCTTCCTATTACTACTGGCCTCCTCTATGGTAGAAGCAGGTGCCGGAACCGGATGAACCGTCTATCCTCCCTTAGCTGGTAATCTGGCCCATGCAGGAGCATCCGTAGATCTAACGATTTTCTCCCTTCACCTGGCAGGTGTATCATCCATTCTTGGAGCCATCAATTTCATCACTACTATCATTAATATAAAACCCCCTGCAATGTCTCAATACCAAACTCCACTATTCGTATGATCTGTCTTAATCACGGCAGTACTTTTACTATTGTCACTACCAGTCCTAGCAG [...]
+ACTATGCTACTCACAGACCGAAATCTAAATACAACATTCTTCGATCCTGCCGGGGGAGGTGACCCTATCCTATATCAACATCTGTTCTGATTCTTCGGACATCCCGAAGTATATATTCTGATTCTACCTGGATTCGGTATAATCTCACACATCGTTACCTACTATTCAGGGAAAAAAGAACCTTTTGGTTATATAGGAATAGTTTGAGCAATAATGTCCATCGGCTTCCTGGGCTTCATTGTATGAGCCCACCATATATTTACTGTAGGGATGGACGTCGACACACGAGCATACTTTACTTCAGCCACTATAATCATTGCAATTCCGACAGGAGTTAAAGTATTTAGCTGACTAGCCACCCTTCACGGGGGCAATATCAAATGATCTCCAGCTATACTATGAGCCCTGGGCTTTATCTTCTTATTTACGGTAGGGGGACTCACAGGTATTGTACTAGCTAATTCATCACTAGACATTGTCCTTCATGACACG [...]
+AGTAGCACACTTCCACTATGTCTTATCAATAGGAGCAGTATTCGCTATCATGGGCGGATTCGTCCATTGATTCCCCCTATTCTCAGGTTACACACTCGACAATACCTGAGCAAAAATTCACTTCACAATCATATTTGTGGGAGTCAACATAACATTCTTTCCCCAACACTTTCTAGGTCTATCAGGAATACCTCGACGATATTCCGATTACCCAGACGCCTACACGACATGAAACACAGTCTCCTCCATGGGCTCATTCATTTCACTTACAGCAGTAATATTAATGGTATTTATAATTTGAGAAGCTTTCGCGTCTAAGCGAGAAGTAGCAGCAGTTGAATTAACTACAACTAATATCGAATGACTGCATGGATGTCCCCCACCTTACCACACATTTGAAGAACCCACTTACGTCGTACTAAAAATGGCGTACCCTTTCCAAATAGGCCTACAAGATGCAACCTCTCCTATTATAGAGGAATTATTACATTT [...]
+ACACACTAATAATTGTATTTCTAATTAGCTCGTTAGTACTCTACATTATTTCACTCATGTTAACTACAAAACTTACTCACACAAGTACAATAGACGCACAAGAAGTGGAAACAGTGTGAACAATCTTACCCGCTATCATTTTAATTCTTATTGCCCTGCCATCATTACGAATCCTTTATATAATGGATGAAATCAATAATCCTTCTCTGACCGTAAAAACTATAGGACATCAGTGATACTGAAGCTATGAATATACGGACTATGAAGATCTAAACTTTGACTCATATATGATCCCTACACAAGAATTAAAGCCCGGAGAACTACGACTGCTAGAAGTAGATAACCGAGTAGTCCTCCCAATAGAGATAACAATCCGCATGCTAATCTCATCAGAAGATGTACTCCACTCATGAGCCGTACCATCACTAGGACTAAAAACTGATGCTATCCCAGGACGACTAAACCAAACAACCCTAATAGCCATACGACCGG [...]
+TACGGCCAATGCTCAGAAATCTGTGGTTCCAACCATAGCTTCATACCTATTGTCCTCGAATTAGTCCCACTATCCCACTTCGAGAAGTGATCTGCCTCAATGCTTATGACCCACCAAACCCATGCATATCATATAGTTAACCCCAGTCCATGACCACTTACAGGAGCCCTTTCAGCCCTTCTCATGACATCCGGCCTAATCATATGATTCCACTTTAACTCGATATACTTACTAATGCTAGGCCTCACCACCAACACCCTAACTATATATCAATGATGACGAGATATCATCCGAGAAAGTACATTTCAAGGTCACCATACTCCAATTGTCCAAAAAGGCTTGCGATACGGTATGATCCTCTTTATCGTATCAGAAGTATTCTTCTTCGCCGGTTTTTTCTGAGCCTTCTATCACTCCAGCCTAGCACCTACCCCTGAACTGGGAGGATGCTGACCACCCACAGGTATCATTCCTCTAAACCCTATAGAAGTT [...]
+AAATACTTCCGTCCTTTTAGCCTCAGGAGTATCAATCACCTGAGCTCACCATAGCCTAATAGAAGGAAACCGCAAGCACATACTTCAAGCACTATTCATCACCATTTCTCTAGGTATTTACTTCACACTACTACAAGCCTCAGAATATTACGAAACTCCCTTTACAATTTCCGACGGAATCTATGGCTCTACCTTCTTCATAGCAACAGGATTTCACGGACTACACGTAATCATCGGCTCGACTTTCCTAATTGTATGTTTCATACGACAACTGAAGTTCCACTTCACATCTAATCACCACTTCGGCTTTGAAGCCGCCGCCTGATACTGACATTTCGTAGACGTAGTATGACTATTCCTGTACGTATCTATCTATTGATGAGGATCTTGCATGACCAACATCCGAAAAACCCATCCACTAATAAAGATCATCAACAGCTCATTCATTGACCTGCCCGCACCATCAAATATCTCAGCATGATGAAACTTTGG [...]
+TTGGAATCTGCTTAATCCTACAGATCTTAACAGGTCTATTCCTGGCCATACATTACACCTCAGACACAACCACAGCCTTCTCATCAGTAACCCATATCTGCCGAGACGTAAACTACGGCTGAATCATCCGATATTTACACGCAAACGGAGCCTCCATATTTTTCATCTGCTTATATATGCATGTAGGACGAGGACTATACTACGGCTCCTATACATTCACAGAAACATGAAACATCGGCATTATTCTCTTGTTCACCGTCATAGCCACAGCATTCATAGGCTACGTCCTACCATGAGGACAAATATCATTCTGAGGAGCAACAGTCATCACTAATCTACTATCAGCAATTCCCTATATCGGAACCGACCTAGTACAATGAATCTGAGGAGGATTTTCAGTTGATAAAGCAACCCTAACACGATTTTTCGCTTTCCACTTTATCCTACCATTTGTAGTATCAGCACTAGCGGCAGTTCACCTACTATTCCTAC [...]
+GGATCCAACAACCCCTCCGGAATCGTATCCGACTCAGACAAAATCCCATTCCACCCATACTATACAATTAAAGATATCCTAGGAGCCCTACTCCTCATCCTAGTCCTAATACTACTAGTACTATTCTCACCCGACCTACTAGGAGACCCCGACAACTACACCCCTGCCAACCCCCTAAGCACCCCACCACATATCAAGCCCGAATGATACTTTCTATTTGCCTACGCAATCCTACGATCAATCCCCAACAAACTAGGAGGAGTGCTAGCCCTAGTACTCTCCATTCTCATCCTCGCCATTGTACCCCTACTCCACACATCGAAACAACGAGGAATAATGTTCCGACCCATCAGCCAATGCCTATTCTGACTACTAGTAGCAGACCTACTTACACTAACATGAATCGGGGGACAACCAGTTGAACACCCCTATATCACCATCGGCCAGCTAGCCTCAATCCTATACTTTATAATCCTCTTAGTACTCATACCC [...]
+CATTATCGAAAATAACATTCTAAAATGAATGTTCATAATTAACATCATCTCACTAATTATCCCAATTCTCCTCGCCGTAGCTTTCCTGACATTAGTGGAACGAAAAGTACTAGGCTACATACAACTCCGAAAAGGACCCAACATCGTAGGACCCTACGGACTTCTACAACCCATTGCCGATGCCGTAAAATTATTCACCAAAGAACCCCTGCGACCACTAACATCCTCCACAACCATATTTATTATAGCCCCTATCCTAGCTCTAGCCTTAGCCCTAACCATATGAGTCCCCCTACCTATACCATACCCCCTCATCAACATAAACCTAGGAGTACTATTCATACTAGCAATATCAAGCCTAGCCGTCTACTCAATCCTATGATCCGGATGAGCCTCAAACTCAAAATACGCCCTAATCGGAGCCCTACGAGCCGTAGCCCAAACAATCTCGTACGAAGTAACCCTAGCCATCATCCTCCTATCAATCCTACT [...]
+GATCCTTCACTCTGTCCACATTAATCATTACTCAAGAACACTTATGATTAATCTTTCCCGCATGACCACTGGCTATAATATGATTTATCTCCACTCTAGCAGAAACTAACCGCGCTCCATTTGATCTCACAGAAGGAGAATCAGAACTTGTCTCAGGATTCAACGTAGAGTACGCAGCAGGCCCCTTCGCTATATTCTTCTTAGCAGAATACGCTAATATTATCATAATAAACATCCTCACAACCCTCCTATTCTTTGGAGCATTTCACAACCCATATATACCCGAACTATACATCATCAACTTCACTACAAAAACCCTAGCACTAACAATTCTATTCCTATGAATCCGAGCATCATACCCGCGATTCCGATACGACCAACTAATGCACCTTCTATGAAAAAACTTCCTACCCCTTACACTAGCCCTATGCATATGACATGTAACCCTACCCATCATCTCAGCAAGCATTCCTCCTCAAACAATAAAACCCC [...]
+ATCATCATCATATCAACCATCATATCAGGGACCATGATTGTTCTCACAAGCTCCCACTGGTTACTAACCTGAATTGGCTTTGAGATAAACATACTAGCAATTATCCCAATCCTGATAAAAAACCATACCCCACGAGCTACAGAAGCATCAACAAAATATTTCCTAACACAAGCCACCGCATCTATGCTCCTAATAATAGGCATCATTATTAACCTAATATTCTCAGGACAATGAACAATCTCAAAAATCCCCAATCCCATCGCATCAGGCCTAATAACCATCGCTTTAGCAATAAAACTCGGCATAGCCCCCTTCCACTTCTGAGTGCCAGAAGTAACACAAGGAATCTCACTATCCTCAGGCATAATCCTACTCACATGACAAAAGATTGCACCACTATCCGTTCTCTATCAAATTTCATCATCCATTAACCCCAAACTACTAACTATCATAGCAATCGCATCAGTACTAATCGGAGGCTGAGGAGGACTA [...]
+TCAACTCCGAAAAATCCTGGCCTACTCATCAATCGCCCACATAGGATGAATAGCCGTCATTCTAACATACAACACTACTCTAATAATCCTAAACCTTACAATCTATATCACAATAACTCTAAGCACATTCATACTATTCATATACAACTCATCTACAACAACACTATCACTATCTAACACATGAAATAAACTACCACTCATAACATCACTAATCCTAATACTAATAATATCACTAGGAGGCCTCCCACCTCTATCAGGCTTTGCACCCAAATGAATAATTATTCAAGAGCTAACAAAAAACGATATAATTATCCTACCAACATTCATAGCCATCACAGCACTTCTAAATCTATACTTCTACATGCGCCTATCCTACACCACAGCACTAACCATATTCCCCTCAGTAAATAACATAAAAATAAAATGACAATTCGAAAGTACAAAAAAAATTATCCTTCTATCACCACTAATCATCACCTCAACCATGCTACT [...]
+CCCCAATAATATCAATCCTAGAAATAAACATAGCATTAACCCTATTTACCAACACAGCCCTAGCTTCTCTACTCGTGCTAATCGCATTCTGACTCCCTCAGCTAAACACATACTCGGAAAAAGCTAGTCCTTATGAGTGTGGATTCGACCCTATAGGGTCAGCACGCCTACCCTTTTCCATAAAATTCTTTCTAGTTGCTATTACATTTCTACTATTCGACCTAGAAATCGCCCTGCTCCTGCCACTCCCATGAGCATCACATACAGATAACCTAACCACCATACTTACCATAGCACTACTACTCATCTCTCTCCTAGCCGCAAGTCTAGCCTATGAATGGACTGAAAAAGGACTAGAATGAACAGAAATGTCCATGGTATACGCCAACATCTTCTTGGCCTTCATTATGTCTCTTATAGGACTACTTATATATCGATCCCATCTAATATCCTCTCTACTCTGTCTAGAAGGCATAATGCTATCACTATTTG [...]
+ACAGTAACAATCCTAAACAACCACTTTACACTAGCAAACATAGCCCCTATTATCCTACTCGTCTTCGCCGCTTGTGAAGCAGCCCTAGGACTGTCACTCCTAGTAATAGTGTCTAACACATACGGAACTGACTACGTACAAAATCTAAATCTCCTACAATGCATTATCCTTCCTACCATTATACTTATACCTCTGACATGAATATCAAAATCTAACATGATCTGAATTAACACAACAGCCTATAGCCTACTAATCAGCCTCGTCAGCCTATCTTTCCTAAACCAACTTGGTGATAATTGCATGAACCTATCCCTACTATTCTTCACAGATTCCCTATCAGCCCCTCTATTAACACTCACAACATGACTTCTTCCACTAATACTCATAGCCAGCCAATTTCACCTATCAAAAGAGCCACTAGCCCGAAAAAAGCTTTACATTACAATACTAGTTCTATTACAACTATTCCTAATCATGACATTTACCGCTACA [...]
+CATATTTTATATCCTATTTGAAGCAACCCTAGTACCCACCCTAATTATTATTACCCGATGGGGAAACCAAACAGAACGCCTAAATGCAGGAACCTATTTCCTATTTTATACCCTAGTAGGATCCTTACCCTTGCTGGTAGCACTACTATTTATCCAAAATAACATAGGCACATTAAACTTCCTAATGATCCAACTCTGGGCCCAACCCCTACCAAGCTCCTGATCCAACACCCTCCTATGATTAGCATGTATAATGGCATTCATAGTAAAAATACCCCTATATGGTCTCCACCTATGACTACCTAAAGCCCATGTAGAAGCACCCATCGCCGGGTCTATAGTACTAGCCGCAGTACTTCTAAAACTAGGGGGCTATGGCATGATACGAATTACAGTATTACTAAGCCCACTAACAAGCTCCATAGCATATCCTTTTATAATATTATCACTATGGGGTATAATCATAACGAGCTCCATCTGCTTACGCCAAAC [...]
+AATCCCTAATCGCATACTCCTCCGTCAGCCACATAGCCCTAGTTATCGCAGCAATCCTCATCCAGACACCATGAAGTTACATAGGAGCAACAGCCCTAATAATTGCCCACGGCTTAACATCATCCATATTATTCTGTCTAGCCAACTCTAACTACGAACGCACCCACAGCCGAACCATAATTCTTGCACGCGGGCTGCAAGTACTCCTTCCCTTAATAGCAGCCTGATGACTACTAGCAAGCCTTGCCAACCTGGCACTTCCACCCACCATCAATCTAATCGGAGAGCTATTCGTAGTAATGGCCTCATTTTCATGATCTAACATTACTATTATCCTAATAGGAACCAACATCATCATTACCGCCCTATATTCACTATATATACTAATTACCACACAACGCGGCAAGTATACCCACCACATCAAAAACATCAAACCCTCGTTCACACGAGAGAACGCCCTAATGACACTCCACCTAATACCCCTGCTACTAC [...]
+AACCCCAAAATCATCCTAGGACCTATCTACTGTAAAATAAAAGTAATTAACTTATTCGCCTCCTCCATCACTACAACACTATCCATACTAATACTCCCAATTATCTTAGCTAGCACCTCAATCTACAAAAACAAGCTTTACCCACAATACGTAAAAACTACCATTTTATACGCCTTTATAATTAGCATAATCCCCACAACAATATTCATCTACTCAGGACAGGAAATAATCATTTCAAACTGACACTGAATAACGATCCAAACCATAAAACTTACACTTAGCTTTAAATTAGACTACTTTTCCATAATTTTCATACCTGTGGCCCTCTTTGTTACATGATCCATTATAGAATTCTCAATATGATATATACACTCAGATCCTTTCATTAACCGATTTTTCAAATATCTGTTAATATTCCTCATCACCATGATAATTTTAGTTACCGCAAACAACCTATTCCAACTATTTATCGGCTGAGAAGGAGTAGGCATT [...]
+CCTCCTTATTGGATGATGACACGGACGAACTGACGCAAACACGGCCGCCCTCCAAGCAGTCCTCTACAATCGCATTGGAGATGTAGGCTTCATCATAGCCATAGCATGATTCTTAATTAACTTAAACACATGAGAACTCCAACAGATCTTCATTATCCCTCATAACAATCTAAACATACCACTCATAGGCCTCCTACTAGCAGCAACTGGGAAATCAGCCCAATTCGGGCTCCACCCATGACTACCATCAGCTATAGAAGGACCCACCCCAGTATCCGCCCTACTCCACTCAAGTACTATAGTCGTAGCAGGAGTTTTCCTCCTAATTCGATTTCACCCTTTAATAGAACACAACACGATAATACAAACAACCACCTTATGCCTAGGAGCTATTACCACCCTATTTACAGCAATCTGTGCACTCACCCAAAACGACATCAAGAAAATCATCGCATTCTCAACCTCAAGTCAACTAGGACTCATAATTGTCAC [...]
+TTAACCAACCATATCTAGCATTTCTACATATCTGTACCCACGCATTCTTCAAAGCCATACTATTCATATGCTCCGGATCTATCATCCACAACTTAAATGATGAACAAGATATCCGAAAAATAGGAGGCTTGTATAAAGTATTACCATTCACCACCACCTCATTAATCGTAGGAAGCCTAGCACTTACAGGAATACCCTTCCTCACAGGATTTTACTCCAAAGACCTAATCATCGAAACCGCTAACACGTCGTATACCAACGCCTGAGCCCTATTACTAACCCTTATCGCCACATCCATAACAGCTGCCTATAGTACTCGAATTATATTCTTCGCACTCCTGGGCCAACCCCGATTTAACCCCATAATCACAATTAACGAGAATAATCCACTCCTAATCAACTCCATTAAACGTCTACTACTAGGAAGCATTTTTGCAGGATACTTAATCTCCTACAACATTACACCCACCTCCACCCCACAAATAACTATAC [...]
+CTAAAACTAACAGCCCTAACCGTAACACTCCTAGGCTTCATCCTAGCACTAGAACTAAATCTCACCTCACAAAACCTCAAACTCAAATACCCATCAAATATATTCAAATTCTCCAACCTCCTCGGATATTTTCCCACTATCATCCACCGCTACGTACCGATAACAAACCTATCAGCGAGCCAAAAACTAGCCTCAACACTACTAGATTTAATCTGACTAGAAAGTACACTACCAAAATCTATCTCTTACTTTCACATAAAATCATCAATCACCGTTTCCAACCAAAAAGGCCTAATCAAATTATATTTTCTTTCCTTCATCGTAACCCTAATCCTAGCCCTAATAATA??????ATTAATTCCCACGAG
+>Phoca_groenlandica
+ATGAACGAAAATCTATTCGCCTCTTTCGCTGCCCCTACAATAATAGGTCTTCCCATCGTAATCCTAATTGTTCTATTTCCAAGCATCTTATTTCCATCCCCTGATCGATTAATCAACAATCGTCTCGCCTCAATTCAACAATGATTAATTCAGTTAACATCAAAGCAAATGCTATCAATCCACAACCATAAAGGACAAACGTGAGCACTTATACTTATATCACTTATCCTATTTATTGGGTCTACTAACCTGCTAGGCCTCCTACCACACTCATTCACTCCTACCACCCAACTATCCATAAACCTGGGAATGGCTATCCCCCTGTGAGCAGGGACAGTCATCACAGGTTTTCGATATAAAACAAAAATATCCCTGGCTCACTTCCTACCTCAAGGAACACCCTTACCTCTCATTCCAATACTAGTGATTATCGAAACTATCAGCCTATTCATTCAACCCATAGCCTTAGCCGTACGACTAACAGCTAACATT [...]
+TCACCTGCTAATTCACCTAATCGGAGGAGCTACCCTTGCTCTCATAGATATTAGCACCACCACAGCATTCATTACTTTCATCATCCTTATCTTACTCACTATCCTTGAATTTGCCGTAGCCCTCATTCAAGCCTATGTCTTTACACTACTAGTAAGCCTGTACCTACATGACAACACTTAAATGCCCCAGTTAGATACATCAACATGATTTATCATAATTTTATCTATAATCCTAACTCTATTCATTACATTCCAACTAAAAGTCTCTAAGCATTATTTCCCAATAAATCCAGAACCAAAACACACGCTACTATTAAAAAATAGTACACCCTGAGAAGAAAAATGAACGAAAATCTATTCGCCTCTTTCGCTGCCCCTACAAATGTTCATAAATCGATGGTTATTTTCCACAAATCATAAAGATATCGGTACTCTTTACTTACTGTTCGGTGCATGGGCTGGCATGGTAGGCACCGCTCTTAGTCTCTTAAT [...]
+AATTAGGACAACCTGGTGCCCTACTAGGAGATGACCAAATTTACAATGTAATTGTCACCGCCCATGCATTTGTAATAATTTTCTTTATAGTAATGCCTATTATAATTGGCGGGTTTGGGAACTGATTAGTACCCCTGATAATCGGAGCCCCTGATATAGCATTTCCCCGAATAAATAATATAAGTTTCTGACTTTTACCACCATCCTTCCTATTACTACTGGCCTCCTCTATAGTAGAAGCGGGTGCCGGAACTGGATGAACTGTCTATCCTCCCTTAGCTGGTAATCTAGCTCATGCAGGAGCATCCGTAGATTTAACGATTTTCTCCCTTCATCTGGCAGGTGTATCATCTATTCTCGGGGCCATCAACTTCATCACTACTATCATTAATATAAAACCCCCTGCAATGTCTCAATACCAAACTCCACTATTTGTATGATCCGTGTTAATCACGGCAGTACTCCTACTATTGTCATTACCAGTCCTAGCAG [...]
+ACCATGCTACTTACAGATCGGAATCTAAACACAACATTCTTCGATCCTGCCGGAGGAGGTGATCCTATCCTATATCAACATCTGTTCTGATTCTTCGGACACCCCGAAGTGTATATCCTGATCCTACCAGGATTCGGAATAATCTCACACATCGTCACCTACTATTCAGGGAAAAAAGAACCTTTTGGTTACATAGGAATAGTTTGAGCAATAATGTCCATCGGCTTTCTAGGCTTCATTGTATGAGCCCACCATATATTCACTGTAGGGATGGACGTTGATACACGAGCATACTTTACTTCAGCCACTATAATCATTGCAATTCCAACAGGAGTTAAAGTATTTAGCTGACTAGCCACCCTTCATGGGGGCAATATCAAATGATCTCCAGCCATACTATGAGCCCTGGGCTTTATCTTCCTATTTACAGTAGGGGGACTCACAGGTATTGTACTAGCTAACTCATCACTAGACATTGTCCTTCATGACACA [...]
+AGTAGCACACTTCCACTATGTCCTATCAATAGGAGCAGTATTCGCTATCATGGGCGGATTCGTCCATTGATTCCCCCTATTCTCAGGCTACACGCTTAATAATACCTGAGCAAAGATTCACTTCACAATCATATTCGTGGGAGTCAACATAACATTCTTTCCCCAACACTTCCTAGGTCTATCAGGAATACCTCGACGATATTCCGACTACCCAGACGCCTACACGACATGAAATACAGTCTCCTCCATGGGCTCATTCATTTCACTCACAGCAGTAATATTAATAGTATTCATAATCTGAGAAGCTTTCGCATCTAAGCGAGAAGTAGCAGCAGTTGAATTAACTACAACTAATATCGAATGACTGCATGGATGTCCTCCTCCCTACCACACATTTGAAGAACCCACTTACGTTGTACTAAAAATGGCATACCCCTTCCAAATAGGCCTACAAGATGCAACCTCTCCTATTATAGAAGAATTATTACACTT [...]
+ACACACTAATAATTGTATTTCTAATTAGCTCGTTAGTACTCTACATTATTTCACTCATACTAACTACAAAACTTACTCATACAAGTACAATAGACGCGCAAGAAGTGGAACCAGTGTGAACAATCCTACCCGCTATCATTTTAATCCTCATTGCCTTACCATCATTACGAATTCTTTATATAATAGATGAAATTAATAATCCTTCCTTGACCGTAAAAACTATAGGACATCAATGATACTGAAGCTACGAATATACAGACTACGAAGACCTGAACTTTGACTCATACATGGTCCCTACACAAGAATTAAAACCCGGAGAACTACGACTGCTAGAAGTAGACAACCGAGTAGTCCTCCCAATAGAAATAACAATCCGTATGCTAATCTCATCAGAAGATGTACTCCACTCATGGGCCGTACCATCACTAGGACTAAAAACCGATGCTATCCCAGGACGACTGAATCAAACAACCCTAATAGCTATACGACCAG [...]
+TACGGTCAATGCTCAGAAATCTGTGGTTCTAACCATAGCTTCATACCTATTGTCCTCGAATTAGTTCCACTATCCCACTTCGAGAAGTGATCTACCTCAATACTTATGGCCCACCAAACCCATGCATATCATATAGTCAATCCTAGTCCATGACCACTAACAGGAGCCCTTTCAGCCCTTCTCATGACATCCGGCCTAATCATATGATTTCACTTTAACTCGATATATCTACTAATGCTAGGCCTCACTACCAATACCCTGACTATATACCAATGATGACGAGATATTGTCCGAGAAAGTACATTCCAAGGTCACCATACTCCAATTGTCCAAAAAGGCTTGCGGTATGGTATGATCCTCTTTATCGTATCAGAAGTATTCTTCTTCGCTGGTTTTTTCTGAGCCTTTTACCACTCCAGTCTAGCACCTACCCCCGAGCTAGGAGGATGCTGACCACCTACAGGTATTACCCCTCTAAACCCTATAGAAGTC [...]
+AAATACTTCCGTCCTTTTAGCCTCAGGAGTATCAATCACCTGAGCTCACCATAGCCTAATAGAAGGAAACCGCAAGCACATACTCCAAGCACTATTTATTACCATCTCTCTAGGCATTTACTTCACACTACTACAAGCCTCAGAGTACTACGAAACCCCTTTCACAATTTCCGACGGAATCTATGGCTCTACCTTCTTCATAGCAACAGGATTCCACGGACTGCACGTAATCATTGGCTCAACTTTCTTAATTGTATGCTTTATACGACAACTGAAATTTCACTTCACATCCAACCACCATTTCGGCTTTGAAGCCGCCGCCTGATACTGACATTTCGTAGACGTAGTATGACTATTCCTGTACGTATCTATCTATTGATGAGGATCTTGCATGACCAACATCCGAAAAACCCACCCACTAATAAAGATTATCAACAACTCATTCATCGACCTACCCGCACCATCAAATATCTCAGCATGATGAAACTTTGG [...]
+TCGTAATCTGCTTAATCCTACAGATCCTAACAGGCCTATTCCTGGCCATACATTATACCTCAGACACAATCACAGCCTTCTCATCAGTGACCCATATCTGTCGAGACGTAAACTACGGCTGAATCATCCGATACCTACACGCAAATGGAGCCTCCATATTTTTCATCTGCTTATACATACACGTAGGACGAGGACTCTACTACGGTTCCTACACATTCACAGAAACATGAAATATCGGCATTATCCTCCTATTCACCGTCATAGCTACGGCATTCATGGGTTACGTCCTACCATGAGGGCAAATGTCATTCTGAGGAGCAACAGTTATCACTAATCTACTATCAGCAATCCCCTACATCGGAACCGATCTAGTACAATGAATCTGAGGAGGGTTCTCAGTTGATAAAGCAACCCTAACACGATTTTTCGCCTTCCACTTCATCTTACCATTCGTAGTATTAGCACTAGCGGCAGTTCATCTACTATTCTTAC [...]
+GGATCCAACAACCCCACCGGAATCGTATCCGACTCAGACAAAATCCCGCTCCACCCATATTATACAATTAAAGATATCCTAGGAGCCCTACTCCTCATCCTGGTCCTTATACTACTAGTACTGTTCTCACCCGACCTACTGGGAGACCCCGACAACTACATCCCTGCCAATCCCCTAAGTACCCCACCACATATCAAGCCCGAATGATACTTTTTATTTGCCTACGCAATCCTACGATCAATTCCCAACAAACTAGGAGGAGTGCTAGCCCTAGTACTCTCTATTCTTATCCTCGCCATTACACCCCTACTCCATACATCAAAACAACGAGGAATAATATTCCGGCCCATCAGCCAATGTCTATTCTGACTACTAGTAGCAGACCTACTCACACTAACATGAATCGGAGGACAACCAGTTGAACACCCCTATATTATCATTGGCCAACTAGCCTCAGTCCTATACTTTATGATCCTCTTAGTACTTATTCCC [...]
+CATCATCGAAAATAACATTCTAAAATGAATGTTCATAATTAATATCATCTCACTAATCGTCCCAATTCTCCTCGCCGTAGCTTTCCTAACATTAGTAGAACGAAAAGTACTAGGCTACATACAACTTCGAAAAGGACCCAACATTGTAGGACCCTACGGACTCCTACAGCCCATCGCTGACGCCGTAAAACTATTCACCAAAGAACCCCTACGACCACTAACATCCTCAACAACCATATTCATTATAGCCCCTATTCTAGCTCTAGCCTTAGCCCTAACTATATGAGTCCCCCTACCTATACCATATCCCCTCATTAACATAAACTTAGGAGTGCTATTTATACTAGCAATATCAAGCCTAGCCGTCTACTCAATCCTATGATCCGGATGAGCCTCAAACTCAAAATACGCCCTAATTGGAGCCCTGCGAGCCGTAGCCCAAACAATCTCATACGAAGTAACCCTAGCCATTATCCTTCTATCAGTCTTACT [...]
+GATCCTTCACTCTATCCACGCTAATCATTACTCAAGAACACTTATGACTAATCTTCCCCGCATGACCACTAGCCATAATATGATTTATCTCCACCCTAGCAGAAACCAACCGCGCCCCATTCGACCTAACAGAAGGAGAATCAGAACTTGTCTCAGGATTCAACGTAGAATACGCAGCAGGCCCGTTCGCTATATTCTTCTTAGCAGAATACGCTAACATCATCATAATAAACATCTTCACAACCCTCCTATTCTTTGGAGCATTTCACAATCCATATATACCTGAACTATATGTTATTAACTTCACTATAAAAACCCTAGCACTAACAATCCTATTCCTATGAATCCGAGCATCATACCCGCGATTCCGATACGACCAACTAATACATCTCCTATGAAAAAACTTCCTACCCCTTACACTAGCCTTATGCATATGACATGTAACCCTACCCATCATCTCAGCAAGCATTCCTCCTCAAACAATAAAACCCC [...]
+ATTATCATCATATCAACCGTCATATCAGGGACCATAATCGTCCTCACAAGCTCCCACTGGTTACTAACCTGAATTGGATTTGAAATAAACATACTAGCAATCATCCCAATCCTAATAAAAAATTACACCCCACGAGCTACAGAAGCATCCACAAAATACTTCCTAACACAGGCCACCGCGTCTATACTCCTAATAATAGGCATCATTATCAACCTAATATTCTCAGGACAATGAACAATCTCAAAAATCCCCAATCCCATTGCATCAGGCCTAGTAACCATTGCTTTAGCAATAAAACTCGGTATAACTCCCTTCCACTTCTGAGTGCCCGAAGTAACACAAGGAATCTCACTATCCTCAGGCATAATCCTACTCACATGACAAAAAATTGCACCACTATCCGTTCTTTATCAAATTTCACCATCCATTAACCCTAAACTACTAATCACCATGGCAATCGCATCAGTACTAATTGGGGGCTGAGGAGGACTA [...]
+CCAACTCCGAAAAATCCTAGCCTACTCATCAATCGCCCACATAGGATGAATGGCCGTTATTCTAACATACAACCCCACTCTGATAATCCTAAACCTCACAATCTATATCACAATAACTCTAAGCACCTTTATACTATTTATACACAACTCATCCACGACAACACTATCACTATCCAACACATGAAATAAACTACCACTCATAACATCACTAATTCTAATACTAATAATATCACTAGGAGGTCTCCCACCTTTATCAGGCTTCGTGCCCAAATGAATGATTATCCAAGAACTAACAAAAAACGACATAATCATCCTACCAACATTCATAGCCATCACAGCACTCCTAAATCTATACTTCTACATACGCCTATCCTACACCACAACACTAACCATATTTCCCTCAGCAAACAATATGAAAATAAAATGACAATTCGAAAGTACAAAAAAAATTATCCTTCTACCACCACTGATCATCGCCTCAACTATACTACT [...]
+CCCCAATTATATTAATCCTAGAAATAAACATAGCATTAACCCTATTTACCAACACAGCCCTAGCCTCTCTACTCGTACTAATTGCATTCTGACTCCCTCAACTAAATACATACTCAGAAAAAGCCAGTCCTTATGAATGTGGATTCGACCCTATAGGATCAGCACGCCTACCCTTCTCCATAAAATTCTTTCTAGTAGCTATTACGTTTTTACTATTTGACCTAGAAATCGCCCTACTCCTACCGCTTCCATGAGCATCCCATACAAATAACCTAACTACCATACTCACCATAGCACTATTACTCATCTCCCTCCTAGCCGCAAGTCTGGCCTACGAATGAACTGAAAAAGGACTAGAATGAACAGAAATGTCCATAGTATATGCCAATATCTTCTTGGCCTTCATTATATCTCTTATAGGACTGCTTGTATACCGATCCCATCTAATATCCTCTCTACTCTGCCTAGAAGGTATGATGCTATCACTATTTG [...]
+ACAGTAACAATCCTGATCAACCATTTTACATTAGCAAGCATAGCCCCCATCATTCTACTCGTCTTCGCTGCTTGTGAAGCAGCCTTAGGACTGTCACTCCTAGTAATAGTATCCAACACATACGGAACTGATTATGTACAAAATCTAAATCTCCTACAATGCATTATTCTTCCTACCATAATACTTATACCTCTGGCATGAATATCAAAACCGAACATAATCTGAATCAACACAACAGCCTATAGCCTACTAATCAGCTTCATCAGCCTATCTTTCCTAAACCAACTCGGCGATAATTGCATGAACCTGTCCCTACTATTCTTCACAGACTCCTTATCAGCCCCCCTGTTAACACTCACAACATGACTTCTACCACTAATACTCATAGCCAGCCAATTTCACCTGTCAAAAGAACCATTAGCTCGAAAAAAGCTTTATATCACAATACTAGTTCTACTACAACTATTTCTAATTATAACATTTACCGCTACA [...]
+CATATTTTACATTTTATTTGAAGCAACCCTAGTACCCACTTTAATCATTATTACCCGATGAGGAAACCAAACAGAACGCCTGAATGCAGGAACGTACTTCCTATTTTATACTCTAGCAGGATCCCTACCTTTACTAGTAGCACTGCTATTTATCCAAAATAATATAGGCACATTAAATTTCCTAATAATCCAACTCTGGGCCCAACCCCTGCCAAATTCCTGATCTAATACCCTCCTATGACTAGCATGTATAATGGCATTTATAGTAAAAATACCCCTATATGGCCTCCACCTATGACTACCCAAAGCTCACGTAGAAGCACCCATCGCTGGGTCCATAGTACTAGCCGCAGTACTTCTAAAACTAGGGGGCTACGGCATGATACGAATTACAGTATTACTGAGCCCACTAACAAGCTTTATGGCATACCCCTTCATAATACTGTCATTATGGGGCATGATCATAACGAGCTCCATCTGCCTACGCCAAAC [...]
+AATCCCTAATCGCATACTCCTCAGTCAGCCACATAGCCTTAGTCATTGTAGCAGTTCTCATTCAGACACCATGAAGCTACATAGGCGCAACAGCCCTAATAATTGCCCACGGCCTGACATCATCCATACTATTCTGCCTAGCCAACTCCAACTACGAACGCACTCATAGTCGAACTATAATTCTTGCACGCGGACTGCAAGTGCTCCTTCCCTTAATAGCAGCCTGATGACTATTAGCAAGCCTTACCAACCTGGCACTTCCACCCACCATCAACTTAATCGGAGAACTATTCGTAGTAATAGCCTCATTCTCATGATCTAATATTACTATTATCCTAATAGGAACTAACATCATCATTACCGCTCTATATTCACTATATATATTAATTACCACACAACGTGGCAAGTATACCTATCATATCAAAAACATTAAACCCTCATTTACACGAGAAAACGCCCTAATAATACTCCACCTAATACCTCTACTACTAC [...]
+AACCCCAAAATCATCCTAGGACCCATCTACTGTAAAATAAAAGTAATTAACTTATTCGCTTCCTCTATCATCACAACACTATCCCTACTAACACTTCCAATTATCTTAGCCAATACCCCAATCTACGAAAACAAGCTTTACCCACAATATGTAAAAACTACTATCTCATACGCCTTTATAATCAGTATAATCCCCACAATAATATTCATCCACTCAGGACAGGAAATAATTGTCTCAAACTGACACTGAATAACGATCCAAACCATAAAACTTACACTCAGCTTTAAATTAGATTATTTCTCCATAATCTTTATACCCGTGGCCCTCTTTGTTACATGATCCATTATAGAATTCTCAATGTGATACATACACTCAGACCCTTTCATTAACCGATTCTTTAAATACCTACTAATATTCCTCATCACCATGATAATTTTAGTTACCGCAAACAACCTATTCCAACTATTCATCGGCTGAGAAGGAGTAGGCATT [...]
+CCTCCTTATTGGATGATGGCACGGACGAACCGACGCAAACACGGCTGCCCTCCAGGCAGTCCTCTACAATCGCATTGGAGATGTAGGCTTCATCATAGCCATAGCATGGTTCTTAATTAACTTAAATACATGAGAGCTCCAACAGATCTTCATTATCCCCCACAATGACCTAAACATGCCACTAATAGGCCTCTTATTAGCAGCAACTGGGAAATCAGCTCAATTCGGGCTTCACCCATGACTTCCATCAGCTATAGAAGGACCCACCCCAGTATCCGCCCTACTCCACTCAAGTACCATAGTTGTAGCAGGAGTCTTCCTACTAATTCGATTCCACCCTCTAATAGAGCACAACACGACAATACAAACAATTACCCTATGCCTAGGAGCTATTACTACCCTGTTTACAGCAATCTGTGCACTCACCCAAAACGATATCAAGAAAATCATCGCATTCTCAACCTCAAGTCAACTAGGACTCATAATTGTCAC [...]
+TTAACCAACCACATCTAGCATTCCTACATATTTGCACTCACGCATTCTTCAAAGCCATACTATTTATATGCTCCGGGTCTATCATTCATAATCTAAACGATGAACAGGATATCCGAAAAATAGGAGGCCTGTACAAAGTACTACCGTTCACCACCACCTCATTAATTGTAGGAAGCTTAGCACTTACAGGAATACCCTTCCTCACAGGATTCTACTCCAAAGACCTAATCATCGAAACCGCTAACACGTCGTATACCAACGCCTGAGCCCTATTACTAACCCTCGTCGCCACATCCATAACAGCTGCCTACAGCACTCGAATTATATTCTTCGCACTCCTAGGTCAACCTCGATTTAACCCCATAATTATAATTAACGAGAACAATCCACTCCTAATTAACTCCATTAAACGTCTACTATTAGGAAGCATTTTTGCAGGAATCCTAATCTCCTATAACATCACACCCACCTCCACCCCACAAATAACCATAC [...]
+CTAAAACTAACAGCTTTGACCGTGACACTTCTAGGCTTCATCCTAGCACTAGAACTAAACCTTACCTCACAAAACCTCAAACTCAAGTATCCATCGAATATATTCAAATTCTCTAACCTCCTCGGATATTTTCCCACTATCATCCATCGCTACATACCAATAGTAAACCTATCAGCAAGCCAAAAACTAGCTTCAACACTACTAGACATAATCTGATTAGAAAATATACTACCAAAATCCATCTCTTACTTTCACATAAAATCATCAATCTCCATCTCCAATCAAAAAGGCCTAATCAAACTATATTTCCTTTCCTTCATCATCACCCTAACCCTGGCCCTAATAATA??????ATTAATTCCCACGAG
+>Phoca_hispida
+ATGAACGAAAATCTATTCGCCTCTTTCACTACCCCTACAATAATAGGTCTTCCTGTCGTAATCCTAATTGTATTATTCCCAAGCATCCTATTTCCATCCCCTGACCGACTAATCAATAATCGCCTCGCCTCGATTCAACAATGATTAATCCAATTAACATCAAAACAAATGTTATCAATCCATAACCATAAAGGACAGACATGAGCACTTATGCTTATTTCACTTATTCTATTTATTGGATCCACTAACCTGCTAGGCCTCCTACCACACTCATTCACCCCTACCACCCAACTATCCATAAACCTAGGAATGGCTATTCCCCTATGAGCAGGAACAGTCATCACAGGTTTTCGACACAAAACAAAAGCATCCCTAGCCCACTTCCTACCCCAAGGAACACCTCTACCCCTCATTCCAATACTAGTGATCATCGAGACTATTAGCCTATTCATTCAACCCATAGCCTTAGCCGTACGACTAACAGCCAATATT [...]
+TCACCTACTAATTCACCTAATCGGAGGAGCTACCCTCGCCCTTATGAACATTAGCACCACTACAGCATTCATTACTTTCATCATCCTTATCCTGCTCACCATCCTTGAATTTGCTGTAGCCCTTATTCAAGCTTATGTCTTCACACTGCTAGTAAGCTTATATCTACATGACAATACCTAAATGCCACAGTTAGATACATCAACTTGACTCATTATAATCTTATCCATAATCCTAACCCTATTCATCACGTTTCAACTAAAAGTCTCCAAACACTACTTCCCAACAAACCCAGAACCAAAACACACGCTGCTATTAAAAAACAGTACACCCTGAGAAGAAAAATGAACGAAAATCTATTCGCCTCTTTCACTACCCCTACAAATGTTCATAAATCGATGACTATTTTCCACAAATCATAAGGATATTGGCACTCTTTATTTGCTGTTTGGCGCATGAGCTGGAATAGTAGGCACCGCCCTTAGTCTCTTAAT [...]
+AACTAGGACAACCTGGCGCCCTACTAGGAGATGACCAAATTTACAACGTAATTGTCACCGCCCATGCATTTGTAATAATTTTCTTCATGGTAATGCCTATCATAATTGGCGGCTTTGGGAACTGACTAGTGCCCCTAATAATTGGAGCTCCTGATATAGCATTCCCCCGAATAAATAACATAAGTTTCTGACTTTTACCGCCATCCTTCCTACTACTACTGGCCTCCTCTATAGTAGAAGCAGGTGCCGGGACCGGGTGAACCGTTTATCCTCCCCTAGCCGGGAACCTGGCTCATGCAGGGGCATCTGTAGATCTAACGATTTTCTCCCTCCACTTGGCAGGTGTATCATCTATTCTCGGGGCTATCAACTTCATCACCACCATCATTAATATAAAACCCCCTGCAATGTCTCAATACCAAACTCCACTGTTCGTGTGATCCGTATTAATCACGGCAGTGCTCCTGCTATTGTCACTACCAGTCCTAGCAG [...]
+ACCATGCTACTCACAGATCGAAACCTGAATACAACATTCTTCGACCCTGCCGGAGGAGGTGATCCTATCCTGTACCAACATCTATTCTGATTCTTCGGACATCCCGAAGTATATATTCTAATCCTACCAGGATTCGGAATAATCTCACACATTGTTACATACTATTCAGGGAAAAAAGAACCTTTTGGTTATATAGGAATAGTCTGAGCAATAATGTCCATCGGCTTCCTGGGCTTCATTGTATGAGCCCACCATATATTCACTGTAGGGATGGACGTCGACACACGAGCATACTTCACTTCAGCCACTATAATCATCGCAATTCCGACAGGAGTTAAAGTATTCAGCTGACTAGCTACCCTTCATGGGGGCAATATCAAGTGGTCTCCAGCCATATTATGAGCCCTGGGCTTTATTTTCCTATTTACAGTAGGGGGCCTCACAGGTATCGTACTAGCCAACTCATCACTAGACATTGTCCTTCATGACACA [...]
+AGTAGCACACTTCCATTATGTTTTATCAATAGGAGCAGTATTCGCCATTATGGGTGGATTCGTCCATTGATTCCCCCTATTCTCAGGCTATACACTCGACGACACTTGAGCAAAAATCCACTTCACAATCATGTTCGTAGGAGTCAACATAACATTCTTCCCCCAACACTTCCTAGGTCTATCAGGAATACCTCGGCGATACTCCGACTACCCAGACGCCTACACGACATGAAATACAGTCTCCTCCATGGGCTCATTCATTTCACTCACGGCAGTAATATTAATAGTATTCATAATCTGAGAAGCTTTCGCATCTAAGCGAGAAGTAGCAGCAGTTGAATTAACTACAACTAATATCGAATGACTGCATGGATGTCCCCCTCCTTACCATACATTTGAAGAGCCCACTTACGTCGTACTAAAAATGGCATACCCCCTACAAATAGGCCTACAAGATGCAACCTCTCCCATTATAGAGGAGTTACTACACTT [...]
+ACACATTAATAATTGTATTTCTAATTAGCTCATTAGTACTCTACATTATTTCACTCATGCTAACCACAAAACTTACCCACACAAGTACAATAGACGCACAAGAAGTGGAAACAGTATGAACAATCCTACCCGCTATCATTTTAATTCTCATTGCCCTACCATCATTGCGAATCCTCTACATAATGGACGAGATCAATAACCCTTCCTTGACCGTAAAAACTATAGGACATCAGTGATACTGAAGCTATGAATATACAGACTACGAAGACCTGAACTTTGACTCATACATGATCCCTACACAAGAACTAAAGCCCGGAGAACTACGACTGCTAGAAGTAGACAACCGAGTAGTCCTCCCAATAGAAATAACAATCCGCATGCTAATCTCATCAGAAGATGTACTCCACTCATGAGCCGTACCGTCTCTAGGACTAAAAACTGATGCTATCCCAGGACGACTAAACCAAACAACCCTAATAGCCATACGACCAG [...]
+TATGGTCAATGCTCAGAAATCTGTGGTTCAAACCATAGCTTCATACCTATTGTCCTCGAATTGGTCCCACTATCCCACTTCGAGAAGTGATCTACCTCAATGCTTATGACCCACCAAACCCATGCATACCATATAGTCAACCCTAGTCCATGACCCCTTACAGGAGCCCTCTCAGCCCTTCTCATGACATCCGGCCTAATTATGTGATTCCACTTTAACTCAATATATCTACTAATGCTAGGCCTCACTACCAATACCCTGACTATATACCAATGATGACGAGATATTGTCCGAGAAAGTACATTCCAAGGTCACCATACTCCAATCGTCCAAAAAGGCTTGCGATATGGTATGATCCTCTTTATCGTATCAGAAGTATTCTTCTTCGCCGGTTTTTTCTGAGCCTTTTACCACTCCAGCCTAGCACCCACCCCCGAGCTAGGAGGATGCTGACCACCCACAGGTATTACCCCTCTAAACCCTATAGAAGTC [...]
+AAATACTTCTGTCCTCTTAGCCTCAGGAGTATCAATTACCTGAGCCCACCATAGCCTAATAGAAGGAAACCGCAAGCACATACTTCAAGCACTATTCATTACCATCTCTCTAGGCGTTTACTTCACACTACTACAAGCCTCAGAATACTACGAAACTCCTTTCACAATTTCCGACGGAATCTACGGCTCTACCTTCTTCATGGCAACAGGATTCCATGGACTACACGTAATCATCGGTTCAACTTTCTTAATTGTATGCTTCATACGACAACTAAAATTTCACTTCACATCTAACCACCATTTCGGCTTTGAAGCCGCTGCCTGATACTGACATTTCGTAGACGTAGTGTGACTGTTCCTATACGTGTCTATCTATTGATGAGGATCTTGCATGACCAACATCCGAAAAACCCATCCACTAATAAAAATTATCAACAACTCATTTATCGACCTACCCACACCATCAAATATCTCAGCATGATGAAACTTTGG [...]
+TCGGAATCTGCCTAATCCTACAAATCTTAACAGGCTTATTCCTAGCCATACACTACACCTCAGACACAACCACAGCCTTCTCATCAGTAACCCACATCTGCCGAGACGTAAACTACGGCTGAATTATCCGTTATCTTCACGCAAATGGAGCTTCCATATTCTTCATCTGCCTATACATGCATGTAGGACGAGGACTGTACTACGGCTCCTACACATTCACAGAAACATGAAACATCGGCATTATCCTCTTATTCACCGTCATAGCTACAGCATTCATAGGCTACGTCCTACCATGAGGACAAATATCATTTTGAGGAGCAACAGTTATTACCAATTTACTATCAGCAATCCCCTATGTCGGAACCGACCTTGTACAATGAATCTGAGGAGGGTTTTCAGTAGACAAAGCAACCCTAACACGATTCTTCGCCTTCCACTTCATCCTACCATTCGTAGTATTAGCACTAGCAGTAGTCCACCTACTATTCCTAC [...]
+GGATCAAACAACCCCTCCGGAATCACATCCGACTCAGACAAAATCCCATTCCACCCATACTATACAATTAAAGATATCCTAGGAGCCCTACTTCTTATTCTAGTCCTTACACTACTAGTGCTATTCTCACCCGACCTATTAGGAGACCCCGACAACTACATCCCTGCCAATCCCCTAAGCACCCCACCGCATATCAAACCCGAATGATACTTCCTATTCGCCTACGCAATCTTACGATCCATCCCTAACAAACTAGGAGGAGTACTAGCCCTAGTACTCTCCATTCTTATTCTCGCTATCATACCCCTGCTCCACACATCAAAACAACGAGGAATGATATTCCGACCCATCAGCCAATGCCTATTCTGACTTCTAGTGGCAGACCTACTTACACTGACATGAATCGGAGGACAACCAGTCGAACACCCCTATATTACCATTGGCCAACTAGCCTCAATCCTATACTTTATAATCCTCTTAGTACTCATACCC [...]
+CATCATCGAAAATAACATCCTAAAATGAATGTTTATAATTAATATCATCTCACTAATTATCCCAATTCTCCTCGCCGTAGCTTTCCTAACATTAGTGGAACGGAAAGTGCTAGGCTACATGCAACTCCGAAAAGGACCCAACATCGTAGGACCCTACGGACTCCTACAACCCATCGCAGACGCCGTAAAACTATTCACCAAAGAACCCCTACGACCACTAACATCTTCCACAACCATATTCATTATGGCTCCCATTCTAGCCTTAGCCTTAGCCCTAACCATATGAGTCCCCCTGCCTATACCATACCCCCTCATCAATATAAACCTAGGAGTGTTATTCATACTAGCAATATCAAGCCTGGCTGTCTACTCAATCCTATGATCCGGATGGGCCTCAAATTCAAAATACGCCCTAATCGGAGCCTTACGAGCCGTAGCCCAAACAATCTCATACGAAGTGACCCTAGCCATTATCCTTCTATCAGTCTTATT [...]
+GATCCTTCACCCTATCCACACTAATCATTACTCAAGAACACTTATGACTAATCTTTCCCGCATGACCACTAGCTATAATATGATTTATCTCCACCCTAGCAGAAACCAACCGTGCCCCATTTGACCTCACAGAAGGAGAATCAGAACTTGTCTCAGGATTTAACGTAGAATACGCAGCAGGCCCGTTCGCTATATTCTTCTTAGCAGAATACGCTAACATCATCATAATAAATATTTTCACAACCCTCTTATTCTTCGGAGCATTTCACAACCCATATATACCTGAACTATATGTCATCAACTTTACCGTAAAAACCCTGGCACTGACAATTCTATTCCTATGAATCCGGGCATCATACCCACGATTCCGATACGACCAACTAATACATCTTCTATGAAAAAACTTCCTACCCCTTACACTAGCCCTATGCATATGACATGTAACCCTACCCATCATCTCAGCAAGCATTCCCCCTCAAACAATAAAACCCC [...]
+ATCATCATTATATCAACTGTTATATCAGGGACCATAATCGTCCTCACGAGCTCCCATTGGCTACTGATCTGAATCGGCTTTGAAATAAACATGCTAGCGATTATCCCAATCCTGATAAAAAACCATACCCCACGAGCTACAGAAGCATCCACAAAATACTTCCTAACACAGGCCACCGCATCCATACTCCTAATGATAGGCATTATCATTAACCTAATATTTTCAGGAGAATGAACAATCTCAAAAATCCCCAACCCCATCGCATCAGGCCTAGTAACCATTGCTCTAACAATAAAACTCGGCATAGCCCCTTTCCACTTCTGAGTGCCCGAAGTGACACAAGGAATCTCACTGTCCTCAGGCATAATCCTACTCACATGACAAAAAATTGCACCACTATCCATCCTCTATCAAATTTCACCATCCATTAACCCCAAACTATTAATTACCATAGCAATCGCGTCAGTACTAATCGGAGGGTGAGGAGGACTA [...]
+CCAACTCCGAAAAATCCTAGCCTACTCATCAATCGCCCACATAGGATGAATAGCTGTCATTCTAACATACAATCCTACCCTAATAATCCTAAACCTCACAATCTACATTACAATAACCCTAAGCACATTTATACTATTCATGCACAACTCATCCACGACGACACTATCACTATCGAACACATGAAACAAACTACCGCTCATGACATCGCTAATCCTAATACTAATAATATCACTAGGAGGCCTCCCACCCCTATCAGGCTTTGCACCCAAATGAATAATTATTCAAGAACTAACAAAAAATGATATAATTATTCTACCAACATTCATAGCCATCACAGCACTATTAAACCTATACTTCTACATACGCCTATCCTACACCACAGCACTAACCATATTCCCCTCAGTAAACAACATAAAAATAAAATGACAATTCGAAAGTGCAAAAAAAATCATCCTTCTACCACCACTAATCATCATCTCGACCATACTACT [...]
+CCCCAATAATACTCATCTTAGAAATAAACATAGCATTAACCCTATTTACCAATACAGCCCTAGCCTCTCTACTCGTACTAATCGCATTCTGACTCCCTCAGCTAAATACATACTCAGAAAAAGCCAGCCCCTACGAATGTGGGTTCGACCCCATAGGATCGGCACGCCTACCCTTCTCCATAAAATTCTTTCTAGTAGCTATCACATTTCTACTATTCGACCTAGAAATTGCCCTACTCCTTCCACTTCCATGAGCATCGCACACAGACAATCTAACCACCATACTCACCATAGCACTACTACTCATCTCTCTCCTAGCCGCAAGCCTGGCCTACGAATGAACTGAAAAAGGACTAGAGTGAACAGAAATGTCCATAGTATATGCCAACATCTTCTTGGCCTTCATTATATCTCTTATAGGACTACTCATATACCGATCCCACCTGATATCCTCCCTACTCTGCCTAGAGGGTATGATATTATCATTATTCG [...]
+ACAGTAACAATCCTGAACAACCATTTTACACTAGCTAACATGGCCCCCATTATCCTTCTCGTCTTCGCTGCTTGTGAAGCAGCCCTAGGACTGTTACTCCTAGTAATAGTGTCCAACACATACGGAACCGACTACGTACAAAATCTGAACCTCCTACAATGCATCATTATCCCCACCTTAATACTCATACCCCTGACGTGAATATCAAAACCTAACATAATCTGAATCAACACGACAGCCTATAGCCTACTAATCAGCCTTGTCAGCCTGTCCTTCCTAAATCAACTCGGTGACAATTGCATAAGCCTGTCCCTACTATTCTTCACAGATTCCCTATCAGCTCCCCTATTAGCACTCACAACATGACTGCTACCCCTGATACTCATAGCTAGCCAATTTCACCTATCAAAAGAGCCACTGGCCCGGAAAAAACTTTATATTACAATACTAATCCTACTACAACTGTTCCTAATCATAACATTTACCGCTACA [...]
+CATATTTTATATTCTATTTGAAGCAACCCTAGTACCTACTCTAATTATTATCACCCGATGGGGGAACCAGACAGAACGCCTAAATGCAGGAACGTACTTCCTATTTTACACTCTAGTAGGATCCTTACCCTTGCTAGTAGCCCTACTATTTACCCAAAACAACATAGGTACATTAAACTTCCTAATAATCCAACTCTGAGCCCAGCCCCTACCAAACTCCTGATCTAACACCCACCTATGATTAGCATGTATAATGGCATTCATAGTAAAAATACCCCTATACGGCCTCCACCTATGGCTACCTAAAGCCCACGTAGAAGCACCCATCGCTGGATCCATAGTACTGGCCGCAGTACTTCTAAAACTAGGGGGCTATGGCATGATACGAATTACAACACTACTAAGCCCACTAACAAGCTTCATGGCATACCCCTTCATAATACTATCATTATGAGGCATAATCATAACTAGCTCCATCTGCTTACGCCAAAC [...]
+AATCCCTAATTGCATATTCCTCCGTCAGTCACATAGCCCTAGTCATCGTAGCAATCCTTATCCAAACACCATGAAGTTACATAGGAGCAACGGCCCTGATAATCGCCCATGGTTTAACATCATCCATATTATTCTGCCTAGCCAACTCTAACTACGAACGCACCCATAGTCGAACTATAATTCTCGCACGCGGACTGCAAGTGCTCCTTCCCCTAATAGCAGCCTGATGACTATTGGCAAGTCTTACCAACCTGGCACTTCCACCTACCATCAATCTAATTGGAGAGCTATTCGTAGTAATAGCCTCATTTTCATGATCCAACATTACTATCATCCTAATAGGAACCAACATCATCATTACCGCCCTATATTCACTATATATACTAATTACCACACAACGCGGCAAATATACCTATCACATCAAAAACATCAAACCCTCATTCACACGAGAAAACGCCCTAATAACGCTCCACCTAATGCCCCTGCTACTAC [...]
+AACCCCAAAATCATTCTAGGACCCATCTACTGTAAAATAAAAGTAATTAACTTATTCGCTTCCTCCATCATCACAACACTATCCATACTAACACTCCCAATCGTCTTAACCAGCACCTCAATCTACAAAAACAAGCTTTACCCACAATACGTAAAAACCACCATTTCATACGCCTTCATAATCAGTATGATCCCCACAACAATATTTATCTACTCAGGACAGGAGATAATTATCTCGAACTGACACTGAATAACAATTCAAACCATAAAACTTACACTTAGCTTTAAACTAGATTATTTTTCCATAATTTTCGTACCTGTGGCCCTTTTCGTTACATGATCCATTATAGAGTTTTCAATATGATACATACACTCAGATCCTTTCATTAACCGATTCTTCAAATACCTACTAATATTCCTCATCACTATGATAATTTTAGTTACCGCAAACAACCTATTTCAGCTATTCATCGGCTGAGAGGGGGTGGGTATT [...]
+CCTCCTCATCGGGTGATGACACGGACGAACCGACGCAAATACAGCCGCCCTCCAGGCAGTCCTCTATAACCGCATTGGAGATGTAGGCTTTATCATAGCCATAGCATGATTCTTAATTAATCTAAACACATGAGAACTTCAACAGATCTTTATTTCCCACCACAACAACCTAAACATACCACTTATAGGCCTCCTCCTAGCAGCAACTGGAAAATCAGCTCAATTCGGGCTTCACCCATGACTACCTTCAGCCATAGAAGGACCCACCCCAGTATCCGCCCTACTCCATTCAAGTACCATAGTCGTAGCTGGAGTCTTCCTCCTAATTCGATTTCACCCTCTAATAGAACACAACACGACAGTACAAACAACCACCCTATGCCTAGGAGCTATCACCACCCTATTCACAGCAATCTGTGCACTCACCCAAAACGACATCAAAAAAATCATCGCATTCTCAACCTCAAGCCAACTAGGACTCATAATCGTCAC [...]
+TCAACCAACCACATCTGGCATTCCTACATATCTGCACCCACGCATTCTTCAAAGCTATATTATTTATATGCTCCGGATCTATCATTCACAGCCTAAACGATGAGCAAGATGTTCGAAAAATGGGAGGTTTATACAAAGTGCTACCATTCACCACTACCTCATTAATTGTAGGAAGCTTAGCACTTACAGGAATGCCTTTCCTCACAGGATTCTACTCCAAAGACCTAATCATCGAAACCGCCAACACGTCGTATACCAACGCCTGAGCCCTATTACTAACCCTCGTCGCCACATCCATAACAGCAGCCTACAGCACTCGAATTATATTCTTCGCACTCCTAGGTCAGCCTCGATTTAGCCCCATAATTACAATCAACGAGAACAGCCCACTCCTAATTAATTCCATCAAACGCCTACTACTAGGAAGCATTTTTGCAGGGTACTTAATCTCCCACAACATTACACCCACCTCCACCCCACAAATAACCATAC [...]
+CTAAAACTGACAGCCTTGACCGTAACACTTCTAGGCTTCATCCTAGCACTGGAACTGAACCTCACTTCACAAAGCCTTAAACTCAAATACCCATCAAACCTATTTAAATTCTCTAATCTCCTCGGATACTTCCCCACTATTATCCACCGCTACATACCTATAGTAAACTTATCAGCGAGCCAAAAACTAGCCTCAACACTACTAGATGCAATCTGGCTAGAAAGTGCATTACCAAAATCCATCTCTCACTTTCACATAAAATCATCAGTCACTATCTCCAATCAAAAAGGCCTAATCAAACTATATTTCCTCTCCTTCATCATCACCTTAATCCTGGCCCTAATAATA??????ATTAATTCCCACGAG
+>Phoca_largha
+ATGAACGAAAATCTATTCGCCTCTTTCGCTACCCCTACAATAATAGGTCTTCCTATCGTAATCCTAATTATCTTATTCCCAAGCATCCTATTTCCATCTCCTGACCGACTAATCAATAATCGCCTCACCTCAATTCAACAATGATTAATCCAACTAACATCAAAACAAATGTTATCAATCCATAACCATAAAGGACAGACATGAGCACTTATACTTATTTCACTTATTCTATTTATTGGATCCACTAACCTGCTAGGCCTCCTACCACACTCATTCACCCCTACCACCCAACTATCCATAAACCTAGGAATGGCTATCCCCCTATGAGCAGGAACAGTCATCACGGGCTTTCGACACAAAACAAAAGCATCCCTAGCCCACTTCCTACCCCAAGGAACACCTCTACCCCTTATTCCAATACTAGTGATCATCGAAACTATTAGCCTATTTATTCAACCCATAGCTTTAGCCGTACGACTAACGGCTAATATT [...]
+TCACCTGCTAATTCACCTAATCGGAGGAGCTACCCTCGCCCTTATAGACATTAGCACTGCCACAGCATTCATTACTTTCACCATCCTTATCCTACTCACTATCCTTGAATTTGCTGTAGCCCTCATTCAAGCCTATGTCTTCACACTGCTAGTAAGCTTATATCTACATGACAATACTTAAATGCCACAGTTAGATACATCAACTTGACTCATTACAATCTTATCCATAATCCTAACCCTATTCATCACGTTTCAACTAAAAGTCTCTAAACACTACTTCCCAACAAACCCAGAACCAAAGCACACGCCGCTATTAAAAAACAGTGCGCCCTGAGAAGAAAAATGAACGAAAATCTATTCGCCTCTTTCGCTACCCCTACAAATGTTCATAAATCGATGGTTATTTTCCACAAATCATAAGGATATTGGCACTCTTTATTTGCTGTTTGGCGCATGAGCTGGAATAGTAGGCACCGCCCTCAGTCTCTTAAT [...]
+AACTAGGACAACCTGGCGCCCTACTAGGAGATGACCAAATTTACAACGTAATTGTCACCGCCCATGCATTCGTAATAATTTTCTTCATGGTAATGCCCATCATAATTGGCGGCTTTGGGAACTGACTAGTGCCCCTAATAATTGGAGCTCCTGATATAGCATTCCCCCGAATAAATAACATAAGTTTCTGACTTTTACCACCGTCCTTCCTACTACTACTGGCCTCCTCTATAGTAGAAGCAGGTGCCGGGACCGGGTGAACCGTTTATCCTCCTCTAGCTGGGAACCTAGCTCATGCAGGAGCCTCTGTAGATCTAACAATTTTCTCCCTCCACTTGGCAGGTGTATCATCTATTCTTGGAGCTATCAACTTCATCACCACCATTATTAATATAAAACCCCCTGCAATGTCTCAATACCAAACTCCACTGTTCGTATGATCCGTACTAATCACGGCGGTGCTCCTACTATTATCGCTACCAGTCCTAGCAG [...]
+ACCATGCTACTCACAGACCGAAACCTGAATACAACATTCTTCGACCCTGCTGGAGGAGGTGATCCTATCCTGTATCAACATCTGTTCTGATTCTTCGGACATCCCGAGGTGTATATTCTAATCCTACCAGGATTCGGAATAATCTCACACATCGTTACCTACTATTCAGGAAAAAAAGAACCTTTTGGTTATATAGGAATAGTTTGAGCAATAATGTCCATCGGCTTCCTGGGCTTCATTGTATGAGCCCACCATATATTCACTGTAGGGATGGACGTCGACACACGAGCATACTTCACTTCAGCCACTATAATTATTGCAATTCCAACGGGAGTTAAAGTATTCAGCTGACTAGCTACCCTTCATGGGGGCAATATTAAGTGGTCTCCAGCCATATTATGAGCCCTGGGCTTTATCTTCCTATTTACGGTAGGGGGGCTCACAGGTATCGTACTAGCCAACTCATCACTAGACATTGTCCTTCATGACACA [...]
+AGTAGCACATTTCCATTATGTTTTATCAATAGGAGCAGTATTCGCTATTATGGGTGGATTCGTCCATTGATTCCCCCTATTCTCAGGCTATACACTCGACGACACTTGAGCAAAAATTCACTTCACAATCATGTTCGTAGGAGTCAACATAACATTCTTTCCCCAACACTTCCTAGGTCTATCAGGAATACCTCGGCGATACTCCGACTACCCAGACGCCTACACGACATGAAATACAGTCTCCTCCATGGGTTCATTTATTTCACTCACAGCAGTGATATTAATAGTATTCATAATCTGAGAAGCTTTCGCATCCAAGCGAGAAGTAGCAGCAGTTGAATTAACTACAACTAATATCGAATGACTGCATGGATGTCCCCCTCCTTACCACACATTTGAAGAGCCCACTTACGTCGTACTAAAAATGGCATACCCCCTACAAATAGGCCTACAAGATGCAACCTCTCCCATTATAGAGGAGTTACTACACTT [...]
+ACACATTAATAATTGTGTTTCTAATTAGCTCATTAGTACTCTACATTATCTCACTTATACTAACCACAAAACTTACCCACACAAGTACAATAGACGCACAAGAAGTGGAAACAGTGTGAACGATCCTACCCGCTATCATTTTAATTCTCATCGCCCTACCATCATTGCGAATCCTCTACATAATGGACGAGATCAATAATCCTTCCTTGACCGTAAAAACTATAGGACATCAGTGATACTGAAGCTATGAGTACACAGACTACGAAGACCTGAACTTTGACTCATATATAATCCCCACACAAGAACTAAAGCCCGGAGAACTACGACTGCTAGAAGTAGACAACCGAGTAGTCCTCCCAATAGAAATAACAATCCGCATACTAATCTCATCAGAAGATGTACTCCACTCATGAGCCGTACCGTCTCTAGGACTAAAAACTGATGCTATCCCAGGACGACTAAACCAAACAACCCTAATAGCCATACGACCAG [...]
+TACGGTCAATGCTCAGAAATCTGTGGTTCAAACCATAGCTTCATACCTATTGTCCTCGAATTGGTCCCACTATCCCACTTCGAGAAATGATCTACCTCAATGCTTATGACCCACCAAACCCATGCATACCATATAGTCAACCCCAGCCCATGACCCCTAACAGGAGCCCTTTCAGCCCTTCTCATGACATCCGGCCTAATCATGTGATTCCACTTTAACTCAATATACCTACTAATGCTAGGCCTCACTACCAACACCCTGACTATATACCAATGATGACGAGATATTGTCCGAGAAAGTACATTCCAAGGTCACCATACTCCAATCGTCCAAAAAGGCTTGCGATATGGTATGATCCTCTTTATCGTATCAGAAGTGTTCTTCTTCACCGGTTTTTTCTGAGCCTTTTACCACTCCAGCCTAGCACCCACCCCCGAGCTGGGAGGATGCTGACCACCCACAGGTATTACCCCTCTAAACCCTATAGAAGTC [...]
+TAATACTTCTGTCCTTTTAGCCTCAGGAGTATCAATTACCTGAGCTCACCATAGCCTAATAGAAGGAAACCGCAAGCACATACTTCAAGCACTATTCATGACCATCTCTCTAGGCATTTACTTCACATTATTACAAGCCTCAGAATACTATGAAACTCCTTTCACAATTTCCGATGGAATCTATGGCTCTACCTTCTTCATGGCAACAGGATTCCATGGACTGCACGTAATCATCGGTTCAACTTTCTTAATTGTATGCTTCGTACGACAGCTAAAATTTCACTTCACATCTAACCATCATTTCGGCTTTGAAGCCGCCGCCTGATACTGACATTTCGTAGACGTAGTGTGACTATTCCTATATGTATCTATCTATTGATGAGGATCTTGCATGACCAACATCCGAAAAACCCATCCACTAATAAAAATTATCAACAACTCATTCATCGACCTACCCACACCATCAAATATCTCAGCATGATGAAACTTTGG [...]
+TCGGAATCTGCCTAATCCTGCATATCTTAACAGGCTTGTTCCTAGCCATACACTACACCTCAGACACAACCACAGCCTTCTCATCAGTAACCCACATCTGCCGAGACGTAAACTACGGCTGAATCATCCGTTATCTTCACGCAAATGGAGCTTCCATATTTTTCATCTGCCTATACATGCATGTAGGACGAGGACTGTATTACGGCTCCTACACATTCACAGAGACATGAAACATCGGCATTATCCTCTTATTCACCGTCATAGCTACAGCATTCATGGGCTACGTCCTACCATGAGGACAAATATCATTTTGAGGAGCAACAGTCATTACCAATCTACTATCAGCAATCCCCTATATCGGAACCGACCTTGTACAATGAATCTGAGGAGGGTTTTCAGTAGATAAAGCAACCTTAACACGATTCTTCGCCTTCCACTTCATCCTACCATTCGTAGTATTAGCCCTAGCAGCAGTCCACCTACTATTCCTAC [...]
+GGATCAAACAACCCCTCCGGAATCATATCCGACTCAGACAAAATCCCATTCCACCCGTACTATACAATTAAAGATATCCTAGGGGCCCTACTTCTCATTCTAGTCCTGACACTACTAGTACTATTCTCACCCGACCTGTTAGGAGACCCCGACAACTATATCCCTGCCAATCCCCTAAACACCCCACCACATATCAAACCCGAATGGTACTTCCTATTTGCCTACGCAATCTTACGATCCATCCCCAACAAACTAGGAGGAGTACTAGCCCTAGTACTCTCCATTCTTATCCTCGCTATCGTACCCCTACTCCACACGTCAAAACAACGAGGAATGATATTCCGGCCCATCAGCCAATGCCTATTCTGACTTCTAGTAGCAGACCTACTTACACTAACATGAATCGGAGGACAACCAGTCGAACACCCTTATATCACCATTGGTCAACTAGCCTCAATCCTATACTTTACAATCCTCCTAGTACTCATGCCC [...]
+CATCGTCGAAAATAACATCCTAAAATGAATGTTTATAATTAATATCATCTCACTAATTATCCCAATTCTCCTCGCCGTAGCTTTCCTAACATTAGTAGAACGGAAAGTACTAGGCTACATACAACTCCGAAAAGGACCTAACATCGTAGGACCCTACGGACTCCTACAACCCATCGCAGACGCCGTAAAACTATTCACCAAAGAACCCCTACGACCACTAACATCCTCCACGACCATATTCATTATGGCTCCTATTCTAGCCCTAGCCTTAGCCCTAACTATGTGAGCCCCCCTGCCCATACCATACCCCCTCATCAACATAAACCTAGGAGTGTTGTTCATACTAGCAATATCAAGCCTAGCTGTCTACTCAATCCTATGATCCGGATGGGCCTCAAACTCAAAATACGCCCTAATCGGAGCCTTACGAGCCGTAGCCCAAACAATCTCATACGAAGTGACCCTAGCCATTATCCTTCTATCAGTCTTACT [...]
+GATCCTTCACCCTATCCACACTAATCATTACTCAAGAACACCTATGACTAATCTTCCCCGCGTGACCACTAGCCATAATATGATTTATCTCCACCCTAGCAGAAACCAACCGTGCCCCATTTGACCTCACAGAAGGAGAATCGGAACTTGTTTCAGGATTCAACGTAGAATACGCAGCAGGCCCATTCGCTATATTCTTCCTAGCAGAATACGCTAACATCATCATAATAAACATCTTCACAACTCTCTTATTCCTCGGAGCATTTCACAACCCATATATACCTGAACTATATGTCATCAACTTTACCGTAAAAACCCTGGCACTGACAATTCTATTCCTATGGATCCGGGCATCATACCCACGATTCCGATACGACCAACTGATACATCTTCTATGAAAAAACTTCCTACCCCTTACACTAGCCCTATGTATATGACATGTAACCCTACCCATCATCTCAGCAAGCATTCCCCCTCAAACAATAAAACCCC [...]
+ATCATCATTATATCAACCGTTATATCAGGGACCATAATCGTCCTCACGAGCTCCCATTGGCTACTGACCTGAATTGGCTTTGAAATAAACATACTAGCAATTATCCCAATCCTGATAAAAAACCATACCCCACGAGCTACAGAAGCATCCACAAAATATTTCCTAACACAAGCCACCGCATCTATACTCCTAATAATAGGCATTATCATCAACCTAATATTCTCGGGAGAATGAACAATCTCAAAAATCCCTAACCCCGTCGCATCAGGCCTAGTAACCATTGCTCTAACAATAAAACTCGGCATAGCCCCTTTCCACTTCTGAGTGCCCGAAGTGACACAAGGAATCTCGCTATCCTCAGGCATAATTCTACTCACATGACAAAAAATTGCACCACTATCCGTTCTCTATCAAATTTCACCATCCATCAACCCCAAACTACTAATTACCATAGCAATCACATCCGTACTGATCGGAGGCTGAGGAGGACTA [...]
+CCAACTCCGAAAAATCCTAGCCTACTCATCAATCGCCCATATAGGATGGATAGCTGTCATTCTAACATACAACCCTACCCTAATGATCCTAAACCTCACAATCTACATTATAATAACCCTAAGCACATTCATACTATTCATGCACAACTCATCCACAACGACACTATCACTATCGAACACATGAAATAAACTACCACTCATGACATCACTAATCCTAATACTAATAATATCGCTAGGAGGCCTCCCACCTCTATCAGGCTTTGCGCCCAAATGAATAATCATTCAAGAACTAACAAAAAACGATATAATTATTCTACCAACATTCATGGCCATCACAGCACTATTGAACCTATACTTCTACATACGCTTATCCTACACCACAGCACTAACCATATTCCCCTCAGTAAACAACATAAAAATAAAATGACAGTTCGAAAGTACAAAAAAAATTATCCTTCTACCACCACTAATCATCATCTCAACCATACTACT [...]
+CCCCAATAATATCCATCTTAGAAATAAACATAGCACTAACTCTATTTACCAACACAGCCCTAGCCTCTCTACTCGTACTAATTGCATTCTGACTCCCTCAGCTAAATACATACTCAGAAAAAGCCAGCCCCTACGAATGTGGATTCGACCCCATAGGATCAGCACGCCTACCCTTCTCCATAAAATTCTTTCTAGTAGCTATCACATTTCTACTATTCGACCTAGAAATTGCCCTACTCCTTCCACTTCCATGAGCATCGCACACAGATAACCTAACCACCATACTCACCATAGCACTACTACTCATCTCTCTTCTAGCCGCAAGTCTGGCCTACGAATGAACTGAAAAAGGACTAGAATGAACAGAAATGTCCATAGTATATGCCAACATCTTCTTGGCCTTCATTATATCTCTTATAGGACTACTTATATACCGATCCCACCTGATATCCTCCCTACTCTGCCTAGAGGGTATAATACTATCATTATTTG [...]
+ACAGTAACAATCCTGAACAACCATTTTACACTAGCTAGCATAGCCCCCATTATTCTTCTTGTCTTCGCTGCTTGTGAAGCAGCCCTAGGACTGTCACTCCTGGTGATAGTGTCCAACACATACGGAACCGACTACGTACAAAATCTGAACCTCCTACAATGCATCATTATCCCCACCATAATACTTATACCTCTGACGTGAATATCAAAACCCAACATGATCTGAATCAACACAACAGCCTATAGCCTACTAATCAGCCTTGTCAGCCTATCCTTCCTAAATCAACTCGGTGACAATTGCATAAGCCTGTCCCTACTATTCTTCACAGACTCCCTATCAGCTCCCCTGCTAGCACTCACAACATGACTGCTACCCCTGATACTTATAGCCAGCCAATTTCACCTATCAAAAGAACCACTAACCCGGAAAAAACTTTATATTACAATACTAATCCTACTACAACTATTCCTAATCATAACATTTACCGCTACA [...]
+CATATTTTACATTTTATTTGAAGCAACCCTAGTGCCTACTCTAATTATTATTACCCGATGGGGAAACCAGACAGAACGCCTAAATGCGGGAACGTACTTCCTATTTTATACTCTAGTGGGATCCTTGCCCTTACTAGTAGCCCTACTATTCATCCAAAACAATATAGGTACATTAAACTTCCTAATAATCCAACTCTGAGCCCAACCCCTACCAAGCTCCTGATCTAACACCCTCCTATGATTAGCATGTATAATGGCATTCATGGTAAAAATACCCCTATACGGCCTCCACCTATGACTGCCTAAAGCCCACGTAGAAGCACCCATCGCTGGGTCCATAGTACTGGCCGCAGTACTCCTAAAACTAGGGGGCTATGGCATGATACGAATTACAGTACTTCTAAGCCCACTAACAAGCTTCATGGCATACCCCTTCATAATACTATCATTATGAGGCATAATCATAACCAGCTCCATCTGCTTACGCCAAAC [...]
+AATCCCTAATTGCATATTCCTCCGTAAGCCACATAGCCCTAGTCATCATAGCAATCCTCATCCAAACACCATGAAGTTACATGGGAGCAACAGCCCTAATAATCGCCCACGGTTTAACATCATCCATACTATTCTGCCTAGCCAACTCCAACTACGAACGTACCCATAGTCGAACTATAATTCTCGCACGCGGACTGCAAGTGCTCCTTCCCTTAATAGCAGCCTGATGACTATTGGCAAGTCTTACCAACCTAGCACTTCCGCCCACCATCAATCTAATTGGAGAGCTATTCGTAGTAATAGCCTCATTTTCATGGTCCAACATTACTATCATCCTAATAGGAACCAACATCATCATTACCGCCCTATACTCACTATATATACTAATTACCACACAACGCGGCAAATACACCTATCACATCAAAAACATCAAACCCTCATTCACACGAGAAAACGCCCTAATAACGCTACACCTAATACCCCTACTACTAC [...]
+AACCCCAAAATCATTCTAGGACCCATCTACTGTAAAATAAAAGTAATTAACCTATTCGCTTCCTCTATCATCACAACACTATCCATACTCACACTCCCAATCGTCTTGACCAGCACCTCAATCTACAAAAACAAGCTCTACCCACAATATGTAAAAACCACCATTTCATACGCCTTCATAATCAGCATGATCCCCACAACAATATTCATCTATTCGGGGCAGGAGATAATTATCTCAAACTGACACTGAATAACAATTCAAACCATAAAACTCACACTTAGCTTTAAACTAGACCATTTTTCCATAATTTTCGTACCTGTGGCCCTCTTCGTTACATGATCCATTATAGAGTTTTCAATATGATACATACACTCAGATCCTTTCATCAACCGATTCTTCAAATACCTACTAATATTCCTCATCACCATGATGATTTTAGTTACCGCAAACAACCTATTCCAACTATTCATCGGCTGAGAGGGAGTGGGTATC [...]
+CCTTCTCATCGGGTGGTGACACGGACGAACCGATGCAAATACAGCCGCCCTCCAGGCAATCCTCTACAATCGCATTGGAGATGTAGGTTTTATCATAGCCATAGCATGATTCTTAATCAACCTAAACACATGGGAACTTCAACAGATCTTTATTTCCCACCACAACAACCTAAACATACCACTTATAGGCCTCCTCCTAGCAGCAACTGGGAAATCAGCTCAATTCGGACTCCACCCATGACTGCCTTCAGCCATAGAAGGACCTACCCCAGTATCCGCCCTACTCCATTCAAGTACCATGGTCGTAGCAGGAGTTTTCCTCCTAATTCGATTTCACCCCCTAATAGAACACAACACGATAGTACAAACAACCACCCTATGCCTAGGGGCTATCACTACTCTATTCACGGCAATCTGTGCACTCACCCAAAACGACATCAAGAAAATTATCGCATTCTCGACCTCAAGCCAACTAGGACTCATAATCGTCAC [...]
+TCAACCAACCACACCTGGCATTCCTACACATCTGCACCCACGCATTCTTCAAAGCCATATTATTCATATGCTCCGGATCTATCATTCACAGCCTAAACGATGAGCAAGATATTCGAAAAATGGGAGGTTTATACAAAGTACTACCATTCACCACTACCTCATTAATTGTAGGAAGCTTAGCGCTTACAGGAATGCCCTTCCTCACAGGATTCTACTCCAAGGACCTAATCATCGAAACCGCTAACACGTCGTATACCAACGCCTGAGCCCTATTACTTACCCTCGTCGCCACATCCATAACAGCAGCCTACAGCACTCGAATTATATTCTTCGCACTTCTAGGTCAACCTCGATTTAACCCCATAATCACAATCAACGAGAACAGCCAACTCCTAATTAATTCCATTAAGCGCCTACTACTAGGAAGCATTTTTGCAGGGTACCTAATCTCCTACAACATTACACCCACCTCCACTCCACAAATAACCATAC [...]
+CTAAAACTGACAGCCTTGACCGTAACACTTCTAGGCTTCATCCTAGCACTGGAACTAAGCCTCACTTCACAAAGCCTTAAACTCAAATACCCATCAAACCTATTCAAATTCTCCAACCTCCTCGGATACTTCCCCACCATTATCCACCGCTACATACCGATAGCAAACTTATCAGCGAGCCAAAAACTAGCCTCAACACTACTAGATGCGATCTGGCTAGAAAGTGCATTACCAAAATCCATCTCTTACTTTCACATAAAATCATCAGTCACTATCTCCAACCAGAAAGGTCTAATCAAACTATACTTCCTCTCCTTCATCGTCACCTTAATCCTAGCCCTAATAATA??????ATTAATTCCCACGAG
+>Phoca_sibirica
+ATGAACGAAAATCTATTCGCCTCTTTCGCTGCCCCTACAATAATAGGCCTTCCTATCGTAATCCTAATTGTCTTATTCCCAAGCATCCTATTTCCATCTCCTGACCGACTAATCAATAATCGCCTCGCCTCAATTCAACAATGATTAATCCAATTAACATCAAAACAAATGTTGTCAATCCATAACCATAAGGGACAGACATGAGCACTTATACTTATTTCACTTATTCTATTTATTGGATCCACTAACCTGCTAGGCCTCCTACCACACTCATTCACCCCTACCACCCAACTATCCATAAACCTAGGAATGGCTATCCCCCTATGAGCAGGAACAGTCATCACAGGTTTTCGACACAAAACAAAAGCATCCCTAGCCCACTTCCTACCCCAAGGAACACCTCTACCCCTCATTCCAATACTAGTGATCATCGAAACTATTAGCCTATTCATTCAACCCATAGCCTTAGCCGTACGACTAACGGCCAATATT [...]
+TCACCTACTAATTCACCTAATCGGAGGGGCTACCCTCGCCCTTATAGACATTAGCACCACTACAGCACTCATTACTTTCACCATCCTCATCCTACTCACTATCCTGGAATTTGCTGTAGCCCTCATTCAAGCCTATGTCTTCACACTGCTAGTAAGCTTATATCTACATGACAATACCTAAATGCCACAGTTAGATACATCAACCTGACTCATTATAATCTTATCCATAATCCTAACCCTATTCATCACGTTTCAGCTAAAAGTCTCTAAGCACCACTTCCCGACAAACCCAGAACCTAAACACACGCTGTTACTAAAAAACAGTGCACCCTGAGAAGAAAAATGAACGAAAATCTATTCGCCTCTTTCGCTGCCCCTACAAATGTTCATAAATCGATGGTTATTTTCTACAAATCATAAGGATATTGGCACTCTTTATCTGCTGTTTGGCGCATGAGCTGGAATAGTAGGCACCGCCCTTAGTCTCTTAAT [...]
+AACTAGGACAACCTGGCGCCCTACTAGGAGATGACCAAATTTACAACGTAATCGTCACCGCCCATGCATTTGTAATAATTTTCTTCATGGTAATGCCTATCATAATTGGCGGCTTTGGGAACTGACTAGTACCCCTAATAATTGGAGCTCCTGATATAGCATTCCCCCGAATAAATAACATAAGTTTCTGACTCTTACCACCATCCTTCCTACTACTACTGGCCTCCTCTATAGTAGAAGCAGGTGCCGGGACCGGGTGAACCGTTTATCCTCCCCTAGCTGGGAACCTGGCTCATGCAGGGGCATCTGTAGATCTAACGATTTTCTCCCTCCACTTGGCAGGTGTGTCATCTATTCTTGGGGCTATCAACTTCATCACCACCATCATTAATATAAAACCCCCTGCAATGTCTCAATACCAAACTCCACTGTTCGTGTGATCCGTATTAATCACGGCAGTGCTCCTACTATTGTCGCTACCAGTCCTAGCAG [...]
+ACCATGCTACTCACAGACCGAAACCTGAATACAACATTCTTCGACCCTGCCGGAGGAGGTGATCCTATCCTGTATCAACATCTATTCTGATTCTTCGGACATCCCGAAGTGTATATTCTAATCCTACCAGGATTCGGAATAATCTCACACATTGTTACCTACTATTCAGGGAAAAAAGAACCTTTTGGTTATATAGGGATAGTTTGAGCAATAATGTCCATCGGCTTCCTGGGCTTCATTGTATGAGCCCACCACATGTTCACTGTAGGAATGGACGTCGACACACGAGCATACTTCACTTCAGCCACTATAATTATTGCAATTCCGACAGGGGTTAAAGTATTCAGCTGGCTAGCTACCCTTCATGGGGGCAATATCAAGTGATCTCCAGCCATATTATGAGCCCTGGGCTTTATCTTCCTATTTACAGTAGGGGGCCTCACAGGTATCGTACTAGCCAACTCATCACTAGATATTGTCCTTCATGACACA [...]
+AGTAGCACATTTCCATTATGTTTTATCAATAGGAGCAGTATTCGCTATTATGGGTGGATTCGTCCATTGATTCCCCCTATTCTCAGGCTATACACTCGACGACACTTGAGCAAAAATTCACTTCACAATCATGTTCGTAGGAGTCAACATAACATTCTTTCCCCAACACTTCCTAGGTCTATCAGGGATACCTCGGCGATACTCCGACTACCCAGACGCCTACACGACATGAAATACAGTCTCCTCCATGGGCTCATTTATTTCACTCACAGCAGTGATATTAATAGTATTCATAATCTGAGAAGCTTTCGCATCTAAGCGAGAAGTAGCAGCAGTTGAATTGACTACAACTAATATCGAATGACTGCATGGATGTCCCCCTCCTTATCACACATTTGAAGAGCCCACTTACGTTGTACTAAAAATGGCATACCCCCTACAAATAGGCCTACAAGATGCAACCTCTCCCATTATAGAGGAGTTACTACACTT [...]
+ACACATTAATAATTGTATTTCTAATTAGCTCATTAGTGCTCTACATTATTTCACTCATGCTAACCACGAAACTTACCCACACAAGTACAATAGACGCACAAGAAGTGGAAACGGTATGAACAATCCTACCTGCTATCATTTTAATTCTCATTGCCCTACCATCATTGCGAATCCTCTACATAATGGACGAGATCAATAATCCTTCCTTGACCGTAAAAACTATAGGACATCAGTGATACTGAAGCTATGAATACACAGACTACGAAGACCTGAACTTTGACTCATATATGATCCCTACACAAGAACTAAAGCCCGGAGAACTACGACTGCTAGAAGTAGACAACCGAGTGGTCCTCCCTATAGAAATAACAATCCGCATGCTAATCTCATCAGAAGATGTACTCCACTCATGAGCCGTACCGTCTCTAGGACTAAAAACTGATGCTATCCCAGGACGACTAAACCAAACAACCCTAATAGCCATACGACCAG [...]
+TACGGTCAATGCTCAGAAATCTGTGGTTCAAACCATAGCTTCATACCTATTGTCCTCGAATTGGTCCCACTATCCCACTTCGAGAAGTGATCTACCTCAATGCTTATGACCCACCAAACCCATGCATACCATATAGTCAACCCCAGTCCATGACCCCTAACAGGAGCCCTCTCAGCCCTTCTCATGACCTCCGGCCTAATTATGTGATTCCACTTTAACTCAGTATACCTACTAATGCTAGGCCTCACCACCAACACCCTGACTATATACCAATGATGACGAGACATTGTCCGAGAAAGTACATTCCAAGGTCACCATACTCCAATTGTCCAAAAAGGCTTACGATATGGTATGATCCTCTTTATCGTATCAGAAGTATTCTTCTTCGCCGGTTTTTTCTGAGCCTTTTACCACTCCAGCCTAGCACCCACCCCAGAGCTGGGAGGATGCTGACCACCCACAGGTATCACCCCTCTAAACCCTATAGAAGTC [...]
+AAATACTTCTGTCCTTTTAGCCTCGGGAGTATCAATTACCTGAGCTCACCATAGCCTAATAGAAGGAAACCGCAAGCACATACTTCAAGCACTATTCATTACCATCTCTCTAGGCGTTTACTTCACATTACTACAAGCCTCAGAATACTACGAAACCCCTTTCACAATCTCCGACGGAATCTACGGCTCTACCTTCTTCATGGCAACAGGATTCCATGGACTGCACGTAATCATCGGCTCAACTTTCTTAATTGTATGCTTCATGCGACAACTAAAATTTCACTTCACATCTAACCACCATTTCGGCTTTGAAGCCGCCGCCTGATACTGACATTTCGTAGACGTAGTGTGACTATTCCTATACGTGTCTATCTATTGATGAGGATCTTGCATGACCAACATCCGAAAAACCCATCCACTAATAAAAATTATCAACAACTCATTTATCGACCTACCCGCACCATCAAATATCTCAGCATGATGAAACTTTGG [...]
+TCGGAATCTGCCTAATCCTACAGATCTTAACAGGCTTATTCCTAGCCATACATTACACCTCAGACACAACCACAGCCTTCTCATCAGTAACCCACATCTGCCGAGACGTAAACTACGGCTGAATCATCCGCTATCTTCACGCAAATGGAGCTTCCATATTCTTCATCTGCCTATACATGCATGTGGGACGAGGACTGTATTACGGCTCCTACACATTCACAGAGACATGAAACATCGGCATTATCCTCTTATTCACCGTCATAGCTACAGCATTTATGGGCTACGTCCTACCATGAGGACAAATATCATTTTGAGGAGCAACAGTCATTACCAATCTACTATCAGCAATCCCCTACGTCGGAACCGACCTTGTACAATGAATCTGAGGGGGGTTTTCAGTAGACAAAGCAACCTTAACACGATTCTTCGCCTTCCACTTCATCCTACCATTCGTAGTATTAGCACTAGCAGCAGTCCACCTACTATTCCTAC [...]
+GGATCAAACAACCCCTCCGGAATCACATCCGACTCAGACAAAATCCCATTCCACCCTTACTATACAATTAAAGATATCCTAGGAGCCCTACTTCTCATTCTAGTCCTGACACTACTAGTGCTATTCTCACCCGACCTATTAGGAGACCCCGACAACTACATCCCTGCCAATCCCCTAAGCACCCCACCACATATTAAACCCGAATGATACTTCCTATTCGCCTACGCAATCTTACGATCCATCCCCAACAAACTGGGAGGAGTACTAGCCCTAGTACTCTCCATTCTTATCCTCGCTATCGTACCCCTGCTCCACACATCAAAACAACGAGGAATGATATTCCGGCCCATCAGCCAATGCCTATTCTGACTTCTAGTAGCAGACCTACTTACACTAACATGAATCGGAGGACAACCAGTCGAACACCCCTATATTACCATTGGTCAACTAGCCTCAATCCTATACTTTATAATCCTCTTAGTACTCATACCC [...]
+CATCATCGAAAATAACATCCTAAAATGAATGTTTATAATTAATATCATCTCACTAATTATCCCAATTCTCCTCGCCGTAGCTTTCCTAACATTAGTGGAACAAAAAGTACTAGGCTACATACAACTCCGAAAAGGACCCAACATCGTAGGACCCTACGGACTCCTACAACCCATCGCAGACGCTGTAAAACTATTCACCAAAGAACCCCTACGACCACTAACATCCTCCACAACCATATTCATTATAGCCCCTATTCTAGCCTTAGCCTTAGCCCTAACTATGTGAGTCCCCCTGCCCATACCATACCCCCTCATCAATATAAACCTAGGAGTGTTGTTCATACTAGCAATATCAAGCCTAGCTGTCTACTCAATCCTATGATCCGGATGGGCCTCAAACTCAAAATACGCCCTAATCGGAGCCTTACGAGCCGTAGCCCAAACAATCTCATACGAAGTGACCCTAGCCATTATCCTTCTATCAGTCTTACT [...]
+GATCCTTCACCCTATCCACACTAATCATTACTCAAGAGCACTTATGATTAATCTTCCCCGCGTGACCACTAGCCATAATATGATTTATCTCCACCCTAGCAGAAACCAACCGTGCCCCATTTGACCTCACAGAAGGAGAATCGGAACTTGTCTCAGGATTCAACGTAGAATACGCAGCAGGCCCGTTCGCTATATTCTTCTTAGCAGAATACGCTAACATCATCATAATAAACATCTTCACAACCCTCTTATTCTTCGGAGCGTTTCACAACCCATATATACCTGAACTATATGTCGTCAACTTTACCGTAAAAACCCTAGCACTGACAATTCTATTTCTATGAATCCGGGCATCGTACCCACGATTCCGATACGACCAACTAATACATCTTCTATGAAAAAACTTCCTACCCCTTACACTAGCCCTATGTATATGACATGTAACCCTGCCCATCATCTCAGCAAGCATTCCCCCTCAAACAATAAAACCCC [...]
+ATCATCATTATATCAACCGTTGTATCAGGGACCATAATCGTCCTCACGAGCTCCCATTGGCTACTGATCTGAATTGGCTTTGAAATGAACATGCTAGCGATTATCCCAATCCTGATAAAAAACCATACTCCACGAGCTACAGAAGCATCCACAAAATATTTCCTAATACAGGCCACCGCATCTATGCTCCTAATGATAGGCATTATTATCAACCTAATATTCTCAGGGGAATGAACAATCTCAAAAATCCCCAACCCCATCGCATCAGGCCTAGTAACCATTGCCCTAACAATAAAACTTGGCATAGCCCCTTTCCACTTCTGAGTGCCCGAAGTGACACAAGGAATCTCACTATCCTCAGGAATAATCCTACTCACATGACAAAAAATTGCACCACTATCCGTTCTCTATCAAATTTCACCATCCATTAACCCCAAACTACTAATTACCATAGCAATCGCATCAGTACTGGTCGGAGGCTGAGGAGGACTA [...]
+CCAACTCCGAAAAATCCTAGCCTACTCATCAATCGCCCATATAGGATGAATAGCTGTCATTCTAACATACAACCCCACCCTAATAATCCTAAACCTCACAATCTACATTACAATAACCCTAAGCACATTCATACTATTCATGCACAACTCATCCACGACGACACTATCACTATCGAACACATGAAACAAACTACCGCTCATGACATCACTAATCCTAATACTAATAATATCACTAGGAGGCCTCCCACCCCTATCAGGCTTTGCGCCTAAATGAATAATTATTCAAGAACTAACAAAAAATGATATAATTATCCTACCAACATTCATGGCCATCACAGCACTATTAAACCTATACTTCTACATACGCCTATCCTACACCACAGCACTAACCATATTCCCCTCAGTAAACAACATAAAAATAAAGTGACAATTCGAAAGTGCAAAAAAAATTATTCTTCTACCACCACTAATCATCATCTCGACCATACTACT [...]
+CCCCAATAATATCCATCTTAGAAATAAACATAGCATTAACCCTATTTACCAACACAGCCCTGGCCTCTCTACTCGTACTAATTGCATTCTGACTCCCTCAGCTAAACACATACTCAGAAAAAGCCAGCCCCTACGAATGTGGGTTCGACCCCATAGGATCAGCACGCCTACCCTTCTCCATAAAATTCTTCCTAGTAGCTATCACATTTCTACTATTCGACCTAGAAATTGCCCTACTCCTTCCACTTCCATGAGCATCGCACACAGATAACCTAACCACCATACTTACCATAGCACTACTACTCATCTCTCTCCTAGCCGCAAGCCTAGCCTACGAATGAACTGAAAAAGGACTAGAATGAACAGAAATGTCCATAGTATATGCCAACATCTTCTTGGCCTTCATTACATCTCTTATAGGACTACTTATATACCGATCCCACCTGATATCCTCCTTACTCTGCCTAGAGGGTATGATATTATCATTATTTG [...]
+ACAGTAACAATCCTGAACAACCATTTTACACTAGCTAGCATGGCCCCCATTATCCTTCTCGTCTTCGCTGCTTGTGAAGCAGCCCTGGGGCTGTCACTTCTAGTAATAGTGTCCAACACATACGGAACCGACTACGTACAAAATCTGAACCTCCTACAATGCATCATTATCCCCACCATAATACTTATACCCCTGACGTGAATATCAAAACCTAATATGATCTGAATCAACACGACAGCCTATAGCCTACTAATCAGCCTTGTCAGCCTGTCCTTCCTAAATCAACTCGGCGACAATTGCATAAGCCTGTCCCTACTATTCTTCACAGACTCCCTATCAGCTCCCCTATTAGCACTCACAACATGACTGCTACCCCTGATACTTATAGCTAGCCAATTTCACCTATCAAAAGAGCCACTAGCCCGGAAAAAACTTTATATTACAATACTAGTCCTACTACAACTATTCCTAATCATAACATTTACCGCTACA [...]
+CATATTTTACATTCTATTTGAAGCAACCCTAGTACCCACTCTAATTATTATTACCCGGTGGGGAAACCAGACAGAACGCCTAAATGCAGGGACGTACTTCCTATTTTATACTCTAGTAGGATCCTTGCCCTTGCTAGTAGCCCTACTATTTATCCAAAACAATATAGGTACATTAAACTTCCTAATAATCCAACTCTGAGCCCAGCCCCTACCAAGCTCCTGATCTAACACCCTCCTATGATTAGCATGTATAATGGCATTCATAGTAAAAATACCCCTATACGGTCTCCACCTATGACTGCCTAAAGCCCACGTAGAAGCACCCATCGCTGGATCCATAGTACTGGCCGCAGTACTTCTAAAACTAGGAGGCTATGGCATGATACGAATTACAGCACTACTAAGCCCATTAACAAGCTTTATGGCATACCCCTTCATAATACTATCATTATGAGGCATAATCATAACTAGCTCCATCTGCTTACGCCAAAC [...]
+AATCCCTAATTGCATATTCCTCCGTCAGTCACATAGCCCTAGTCATCGTAGCAATCCTCATCCAAACACCATGAAGTTACATAGGAGCAACAGCCCTAATAATCGCCCACGGTCTAACATCATCCGTATTGTTCTGCCTAGCCAACTCCAACTACGAACGCACCCACAGTCGAACTATAATCCTCGCACGCGGACTGCAAGTGCTCCTTCCCTTAATAGCAGCCTGATGGCTATTGGCAAGCCTTACCAACCTGGCACTTCCGCCTACCATCAATCTAATTGGAGAGCTATTCGTAGTAATAGCCTCATTTTCATGGTCCAACATTACTATCATCCTAATAGGAACCAACATCATCATTACCGCCCTATATTCACTGTACATACTAATTACCACACAACGCGGCAAATATACCTACCACATCAAAAACATCAAACCCTCATTCACACGAGAAAACGCCCTAATAACACTCCACCTAGTGCCCCTGCTACTAC [...]
+AACCCCAAAATCATTCTAGGACCCATCTACTGTAAAATAAAAGTAATTAACTTATTCGCTTCCTCTATCATAACAACAATATCCATACTAGCACTCCCAATCGTCTTAACCAGCACCTCAATCTACAAAAACAAGCTTTACCCACAATACGTAAAAACCACCATTTCATACGCCTTCATAATCAGTATGATCCCCACAACAATATTCATCTATTCAGGGCAGGAAATAATTATCTCAAACTGACACTGAATAACAATTCAAACCATTAAACTTACACTTAGCTTTAAACTAGACCATTTTTCCATAATTTTCGTACCTGTGGCCCTCTTCGTTACATGATCCATTATAGAGTTTTCAATATGATACATACACTCAGATCCTTTCATCAACCGATTCTTCAAATACCTACTAATATTCCTCATCACCATGATGATTTTAGTTACCGCAAACAACCTATTTCAACTATTCATCGGCTGAGAGGGAGTGGGTATC [...]
+CCTTCTCATCGGGTGATGACACGGACGAACCGACGCAAATACAGCCGCCCTCCAGGCAGTCCTCTATAATCGCATTGGAGATGTAGGCTTTATCATAGCCATAGCATGATTCTTAATTAATCTAAACACATGGGAACTTCAACAGATCTTCATTTCCCACCACAACAACCTAAACATACCACTTATAGGCCTCCTCCTAGCAGCAACTGGAAAATCAGCTCAATTCGGGCTTCACCCATGACTGCCTTCAGCCATAGAAGGACCCACCCCAGTATCCGCCCTACTCCATTCAAGCACCATGGTTGTAGCAGGAGTTTTCCTCCTAATTCGATTTCACCCTCTAATAGAACACAACACGATAGTACAAACAACCACCCTATGCCTAGGGGCTATCACCACCCTATTCACAGCAATCTGTGCACTTACCCAAAACGACATCAAAAAAATCATCGCATTCTCAACCTCAAGCCAACTAGGACTCATAATCGTCAC [...]
+TCAACCAACCACATCTGGCATTCCTACACATCTGCACCCACGCATTCTTCAAAGCTATATTATTTATATGCTCCGGATCTATCATTCACAGCCTAAACGATGAGCAAGATATTCGAAAAATAGGAGGTTTATACAAAGTACTACCATTCACCACTACCTCATTAATTGTAGGAAGCCTAGCACTTACAGGAATGCCCTTCCTCACAGGATTCTACTCCAAAGACCTAATCATCGAAACCGCCAACACGTCGTATACCAACGCCTGAGCCCTATTACTAACCCTCGTCGCCACATCCATAACCGCAGCCTACAGCACTCGAATTATATTCTTCGCACTCCTAGGTCAGCCTCGATTTAACCCCATAATTACAGTCAACGAGAACAGCCCACTCCTAATTAATTCAATTAAACGCCTACTACTAGGAAGCATCTTTGCAGGGTACTTAATCTCCTACAACATTACACCCACCTCTACCCCACAAATAACCATAC [...]
+CTAAAACTGACAGCCTTAGCCGTAACACTTCTGGGCTTCATCCTAGCACTGGAACTGAACCTCACTTCACAAAGCCTTAAACTCAAATACCCATCAAACCTATTCAAATTCTCCAACCTCCTCGGATACTTCCCCACCATTATCCACCGCTACATACCTATAGTAAACCTATCAGCGAGCCAAAAACTAGCCTCAACACTACTAGATGCAATCTGGCTGGAAAGTGCATTACCAAAATCCATCTCTTACTTTCACATAAAATCATCAGTCACTATCTCCAATCAGAAAGGCCTAATCAAACTATACTTCCTCTCCTTCATCATCACCTTAATCCTAGCCCTAATAATA??????ATTAATTCCCACGAG
+>Phoca_vitulina
+ATGAACGAAAATCTATTCGCCTCTTTCGCTACCCCTACAATAATAGGTCTTCCTATCGTAATCCTAATTGTCCTATTCCCAAGCATCCTATTTCCATCTCCTGACCGACTAATCAATAATCGCCTCGCCTCAATTCAACAATGATTAATCCAACTAACATCAAAACAAATGTTATCAATCCATAACCGTAAAGGACAGACATGAGCACTCATACTTATTTCACTTATTCTATTTATTGGATCCACTAACCTGCTAGGCCTCCTACCACACTCATTCACCCCTACCACCCAACTATCCATAAACCTAGGAATGGCTATCCCCCTATGAGCAGGAACAGTCATCACAGGTTTTCGACACAAAACAAAAGCATCCCTAGCCCACTTCCTACCCCAAGGAACACCTCTACCCCTCATTCCAATACTAGTGATCATCGAAACTATTAGCCTATTTATTCAACCCATAGCTTTAGCCGTACGACTGACGGCTAATATT [...]
+TCACCTACTAATTCACCTAATCGGAGGAGCTACCCTCGCCCTTATAGACATTAGCACCGCCACAGCATTCATTACTTTCACTATCCTTATCCTACTCACTATCCTTGAATTTGCTGTAGCCCTCATTCAAGCCTATGTCTTCACACTGCTAGTAAGCTTATATCTACATGACAATACCTAAATGCCACAGTTAGATACATCAACTTGACTCATTATAATCTTATCCATAATCCTAACTTTATTCATCACGTTTCAACTAAAAGTCTCTAAACACTACTTCCCAACAAACCCAGAACCAAAACACACGCCGCTATTAAAAAACAGTGCGCCCTGAGAAGAAAAATGAACGAAAATCTATTCGCCTCTTTCGCTACCCCTACAAATGTTCATAAATCGATGGTTATTTTCCACAAATCATAAGGATATCGGCACTCTTTATTTGCTGTTTGGCGCATGAGCTGGAATAGTAGGCACCGCCCTCAGTCTCTTAAT [...]
+AACTAGGACAACCTGGCGCCCTACTAGGAGATGACCAAATTTACAACGTAATTGTCACCGCCCATGCATTCGTAATAATTTTCTTCATGGTAATGCCCATCATAATTGGCGGCTTTGGGAACTGACTGGTGCCCCTAATAATTGGAGCTCCTGATATAGCATTCCCCCGAATAAATAACATAAGTTTCTGACTTTTACCACCGTCCTTCCTACTACTACTGGCCTCCTCTATAGTAGAAGCAGGTGCCGGAACCGGGTGAACCGTTTATCCTCCCCTAGCTGGGAACCTGGCTCATGCAGGAGCCTCTGTAGATCTAACAATTTTCTCGCTCCACTTGGCAGGTGTATCATCTATTCTTGGAGCTATCAACTTCATCACTACCATCATTAATATAAAACCCCCTGCAATGTCTCAATACCAAACTCCACTGTTCGTATGATCCGTATTAATCACAGCGGTGCTCCTACTATTGTCACTACCAGTCCTGGCAG [...]
+ACCATGCTACTCACAGACCGAAACCTGAATACAACATTCTTCGACCCTGCCGGAGGAGGTGATCCTATCCTGTATCAACATCTGTTCTGATTCTTCGGACATCCTGAGGTGTATATTCTAATCCTACCAGGATTCGGAATAATCTCACACATCGTTACCTACTATTCAGGAAAAAAAGAACCTTTTGGTTATATAGGAATAGTTTGAGCAATAATGTCCATCGGCTTCCTGGGCTTCATTGTATGAGCCCACCATATATTTACTGTAGGGATGGACGTCGACACACGAGCATACTTCACTTCAGCCACTATAATTATTGCAATTCCAACGGGAGTTAAGGTATTCAGCTGACTAGCTACCCTTCATGGGGGCAATATCAAGTGGTCTCCAGCCATATTATGAGCCCTGGGCTTTATCTTCCTATTTACGGTAGGGGGCCTCACAGGTATCGTACTAGCCAACTCATCACTAGACATTGTCCTTCATGACACA [...]
+GGTAGCACATTTCCATTATGTTTTATCAATAGGAGCAGTATTCGCTATTATGGGTGGATTCGTCCATTGATTCCCCCTATTCTCAGGCTATATACTCGACGACACTTGAGCAAAAATTCACTTCACAATCATATTCGTAGGAGTCAACATAACATTCTTTCCCCAACACTTCCTAGGTCTATCAGGAATACCTCGGCGATACTCCGACTACCCAGACGCCTACACGACATGAAATACAGTCTCCTCCATGGGCTCATTCATTTCACTTACAGCAGTGATATTAATAGTATTCATAATCTGAGAAGCTTTCGCATCCAAGCGAGAAGTAGCGGCAGTTGAATTAACTACAACTAATATCGAATGACTGCATGGATGTCCCCCTCCTTACCACACATTTGAAGAGCCCACTTACGTCGTACTAAAAATGGCATACCCCCTACAAATAGGCCTACAAGATGCAACCTCTCCCATTATAGAGGAGTTACTACACTT [...]
+ACACATTAATAATTGTGTTCCTAATTAGCTCATTAGTACTCTACATTATCTCACTTATACTAACCACGAAACTCACCCACACAAGTACAATAGACGCACAAGAAGTGGAAACGGTGTGAACGATCCTACCCGCTATCATTTTAATTCTCATTGCCCTACCATCATTACGAATCCTCTACATAATGGACGAGATCAATAACCCTTCCTTGACCGTAAAAACTATAGGACATCAGTGATACTGAAGCTATGAGTACACAGACTACGAAGACCTGAACTTTGACTCATATATGATCCCCACACAAGAACTAAAGCCCGGAGAACTACGACTGCTAGAAGTAGACAATCGAGTAGTCCTCCCAATAGAAATAACAATCCGCATACTAATCTCATCAGAAGATGTACTCCACTCATGAGCCGTACCGTCCCTAGGACTAAAAACTGATGCTATCCCAGGACGACTAAACCAAACAACCCTAATAGCCATACGACCAG [...]
+TACGGTCAATGCTCAGAAATCTGTGGTTCAAACCACAGCTTCATACCTATTGTCCTCGAATTGGTCCCACTATCCCACTTCGAGAAATGATCTACCTCAATGCTTATGACCCACCAAACCCATGCATACCATATAGTCAACCCCAGCCCATGACCCCTAACAGGAGCCCTTTCAGCCCTTCTCATAACATCCGGCCTAATCATGTGATTCCACTTTAACTCAATATACCTACTAATGCTAGGCCTCACTACCAACACCCTGACTATATACCAATGATGACGAGATATTGTCCGAGAAAGTACATTCCAAGGTCACCATACTCCAATCGTCCAAAAAGGCTTGCGATATGGTATGATCCTCTTCATCGTATCAGAAGTGTTCTTCTTCGCCGGTTTCTTCTGAGCCTTCTACCACTCCAGCCTAGCACCCACCCCCGAGCTGGGAGGATGCTGACCACCCACAGGTATTACCCCTCTAAACCCTATAGAAGTC [...]
+AAATACTTCTGTCCTTTTAGCCTCAGGAGTATCAATTACCTGAGCTCACCATAGCCTAATAGAAGGAAACCGCAAGCACATACTTCAAGCACTATTCATTACCATCTCCCTAGGCATTTACTTCACATTATTACAAGCCTCAGAATACTATGAAACTCCTTTCACAATTTCCGATGGAATCTATGGTTCTACCTTCTTCATGGCAACAGGATTCCATGGACTGCACGTAATCATCGGCTCAACTTTCTTAATTGTATGCTTCGTACGACAGCTAAAATTTCACTTCACATCTAACCACCATTTCGGCTTTGAAGCCGCCGCCTGATACTGACATTTCGTGGACGTAGTATGACTGTTCCTATACGTATCTATCTATTGATGAGGATCTTGCATGACCAACATCCGAAAAACCCATCCACTAATAAAAATTATCAACAACTCATTCATCGACCTACCCACACCATCAAATATCTCGGCATGATGAAACTTTGG [...]
+TCGGAATCTGCCTAATCCTGCAGATCTTAACAGGCTTATTCCTAGCCATACACTACACCTCAGACACAACCACAGCCTTCTCATCAGTAACCCACATCTGCCGAGACGTAAACTACGGCTGAATCATCCGTTATCTTCACGCAAATGGAGCTTCCATATTTTTCATCTGCCTATACATGCATGTAGGACGAGGACTGTATTACGGCTCCTACACATTCACAGAGACATGAAACATCGGCATTATCCTCTTATTCACCGTCATAGCTACAGCATTCATGGGCTACGTCCTACCATGAGGACAAATATCATTTTGAGGAGCAACAGTCATTACCAATCTACTATCAGCAATCCCCTATGTCGGAACCGACCTTGTACAATGAATCTGAGGAGGATTTTCAGTAGATAAAGCAACCTTAACACGATTCTTCGCCTTCCACTTCATCCTACCATTCGTAGTATTAGCACTAGACGCAGTCCACCTACTATTCCTAC [...]
+GGATCAAACAACCCCTCCGGAATCATATCCGACTCAGACAAAATCCCATTCCACCCGTACTATACAATTAAAGATATCCTAGGGGCCCTACTTCTCATTCTAGTCCTAACACTACTAGTGCTATTCTCACCCGACCTGTTAGGAGACCCAGACAACTATATCCCTCCGAATCCCCTAAGCACCCCACCACATATCAAACCCGAATGGTACTTCCTATTTGCCTACGCAATCTTACGATCCATCCCCAACAAACTAGGAGGAGTACTAGCCCTAGTACTCTCCATTCTTGTCCTCGCTATCATACCCCTACTCCACACATCAAAACAACGAGGAATAATATTCCGACCCATCAGCCAATGCCTATTCTGATTCCTAGTAGCAGACCTACTCACACTAACATGAATCGGAGGACAACCAGTCGAACACCCTTATATCACCGTTGGTCAACTAGCCTCAATCCTATACTTTACAATCCTCCTAGTACTCATACCC [...]
+CATCATCGAAAATAACATTCTAAAATGAATGTTTATAATTAATATCATCTCACTAATTATCCCAATTCTCCTCGCCGTAGCTTTCCTAACATTAGTAGAACGGAAAGTACTAGGCTACATACAACTCCGAAAAGGACCCAACATCGTAGGACCCTACGGACTCCTACAACCCATCGCAGACGCCGTAAAACTATTCACCAAAGAACCCCTACGACCACTAACATCTTCCACAACCATATTCATTATGGCCCCTATTCTAGCCTTAGCCCTAGCCCTAACTATATGAGTCCCCCTGCCCATACCATACCCCCTCATCAACATAAACCTAGGAGTGTTATTCATACTAGCAATATCAAGCCTAGCTGCCTACTCAATCTTATGATCCGGATGGGCCTCAAACTCAAAATACGCCCTAATCGGAGCCTTACGAGCCGTAGCCCAAACAATCTCATACGAAGTAACCCTAGCCATTATCCTTCTATCAGTCTTACT [...]
+GATCCTTCACCCTATCCACACTAATCATTACTCAAGAACACTTGTGACTAATCTTCCCCGCGTGACCACTAGCCATAATATGATTTATCTCCACCCTAGCAGAAACCAACCGTGCCCCATTTGACCTCACAGAAGGAGAATCAGAACTTGTTTCAGGATTCAACGTAGAATACGCAGCAGGCCCATTCGCTATGTTCTTCTTAGCAGAATACGCTAACATCATCATAATAAACATCTTCACAACCCTCTTATTCTTCGGAGCATTTCACAACCCATATATACCTGAACTATATGTTATCAACTTTACCGTAAAAACCCTGGCACTGACAATTCTATTCCTATGGATCCGGGCATCATACCCACGATTCCGATACGACCAACTAATACATCTTCTATGAAAAAACTTCCTACCCCTTACACTAGCCCTATGTATATGACATGTAACCCTACCCATCACCTCAGCAAGCATTCCCCCTCAAACAATAAAACCCC [...]
+ATCATCATTATATCAACCGTTATATCAGGGACCATAATCGTCCTCACGAGCTCCCATTGGCTACTGACCTGAATTGGCTTTGAAATAAACATACTAGCGATTATCCCAATCCTGATAAAAAACCATACCCCACGAGCTACAGAAGCATCCACAAAATATTTCCTAACACAGGCTACCGCATCTATACTCCTAATAATAGGCATTATTATCAACCTAATATTCTCAGGAGAATGAACAATCTCAAAAATCCCCAACCCTATCGCATCAGGCCTAGTAACCATTGCTCTAACAATAAAACTCGGCATAGCTCCTTTCCACTTCTGAGTGCCCGAAGTGACACAAGGAATCTCACTATCTTCAGGCATAATTCTACTCACATGACAAAAAATTGCACCACTATCCGTTCTCTATCAAATTTCACCATCCATTAACCCCAAACTATTAATTACCATAGCAATCGCATCCGTACTGATCGGAGGCTGAGGAGGACTA [...]
+CCAACTCCGAAAAATCCTAGCCTACTCATCAATCGCCCATATAGGATGAATAACTGTCATCCTAACATACAACCCTACCCTAATAGTCCTAAACCTCACAATCTACATTACAATAACCCTAAGCACATTCATACTATTTATGCACAACTCATCCACAACGACACTATCACTATCGAACACATGAAATAAACTACCGCTCATGACATCGCTGATCCTAATACTAATAATATCGCTAGGAGGCCTCCCACCCCTATCAGGCTTTGCACCCAAATGAATAATCATTCAAGAACTAACAAAAAACGATATAATTATTCTACCAACATTCATGGCCATCACAGCACTATTGAACCTATACTTCTACATACGCTTATCCTACAGCACAGCACTAACCATATTCCCCTCAGTAAACAACATAAAAATAAAATGACAGTTCGAAAGTGCAAAAAAAATCATCCTCCTACCACCACTAATCATCATCTCAACCATACTACT [...]
+CCCCAATAATATCCATCTTAGAAATAAACATAGCACTAACCCTATTTACCAACACAGCCCTGGCCTCTCTACTCGTACTAATTGCATTCTGACTCCCTCAGCTAAATACATACTCAGAAAAAGCCAGCCCCTACGAATGTGGATTTGACCCCATAGGATCAGCACGCCTACCCTTCTCCATAAAATTCTTTCTAGTAGCCATCACATTTCTACTATTCGACCTAGAAATTGCCCTACTCCTTCCACTTCCATGAGCATCGCACACAGATAACCTAACCACCATACTTACCATAGCACTACTACTCATCTCTCTTCTAGCCGCAAGCCTGGCCTACGAATGAACTGAAAAGGGACTAGAATGAACAGAAATGTCCATAGTATATGCCAACATCTTCTTGGCCTTCATTATATCTCTTATAGGACTACTTATATATCGATCCCACCTGATATCCTCCCTACTCTGCCTAGAAGGTATGATACTATCATTATTTG [...]
+ACAGTAACAATCCTGAATAACCATTTTACACTAGCTAGCATAGCCCCCATTATTCTTCTCGTCTTCGCTGCTTGTGAAGCAGCCCTAGGACTGTCACTCCTGGTAATAGTGTCCAACACATACGGAACCGACTACGTACAAAATCTGAACCTCCTACAATGCATCATTATCCCCACCATAATACTCATACCCCTGACGTGAATATCAAAACCTAACATGATCTGAATCAACACGACAGCCTATAGCCTACTAATCAGCCTTATCAGCCTATCCTTCCTAAATCAACTCGGTGACAATTGCATAAGCCTGTCCCTACTATTCTTCACAGACTCTCTATCAGCTCCCCTGTTAGCACTCACAACATGACTGCTACCCCTGATACTTATAGCTAGCCAATTTCACCTATCAAAAGAGCCACTAACCCGGAAAAAACTTTATATTACAATACTAATCCTACTACAACTATTCCTAATCATAACATTTACCGCTACA [...]
+CATATTTTACATTTTATTTGAAGCAACCCTAGTACCTACTCTAATTATTATTACCCGATGGGGAAACCAGACAGAACGCCTAAATGCAGGAACGTACTTCCTATTTTACACTCTAGTAGGATCCTTGCCCCTGCTAGTAGCCCTACTATTCATCCAAAACAATATAGGTACATTAAACTTCCTAATAATCCAACTCTGAGCCCAACCCCTACCAAGCTCCTGATCTAACACCCTCCTATGACTAGCATGTATAATGGCATTCATGGTAAAAATACCCCTATACGGCCTCCACCTATGACTGCCCAAAGCCCACGTAGAAGCACCCATCGCTGGGTCCATAGTACTAGCCGCAGTGCTCCTAAAACTAGGGGGCTATGGCATGATACGAATTACAGTACTTCTAAGCCCACTAACAAACTTCATGGCATACCCCTTCATAATACTATCATTATGAGGCATAATCATAACTAGCTCCATCTGCTTACGCCAAAC [...]
+AATCCCTAATTGCATATTCCTCCGTAAGCCACATAGCCCTAGTCATCATAGCAATTCTCATCCAAACGCCATGAAGTTACATGGGAGCAACAGCCCTAATAATCGCCCACGGTTTAACATCATCCATACTGTTCTGCCTAGCCAACTCCAACTACGAACGCACCCATAGTCGAACTATAATTCTCGCACGCGGACTGCAAGTGCTCCTTCCCTTAATAGCAGCCTGATGGCTATTGGCAAGTCTTACCAACCTGGCACTTCCACCCACCATCAATCTAATTGGAGAGCTATTCGTAGTAATAGCCTCATTTTCATGATCCAACATTACTATTATCCTAATAGGAACCAACATCATCATTACCGCCCTATACTCAATATACATACTAACTACCACACAACGCGGCAAATATACCTATCACATCAAAAACATCAAACCCTCATTCACACGAGAAAACGCCCTAATAACGCTACACCTAATGCCCCTACTACTAC [...]
+AACCCCAAAATCATTCTAGGACCTATCTACTGTAAAATAAAAGTAATTAACTTATTCGCTTCCTCTATCATCACAACACTATCCATACTCACACTCCCAATCGTCTTGACCAGCACCTCAATCTACAAAAACAAGCTCTACCCACAATATGTAAAAACCACCATTTCATACGCCTTCATAATCAGCATGATCCCCACAACAATATTCATCTATTCAGGGCAGGAGATAATTATCTCAAACTGACACTGAATAACAATTCAAACCATAAAACTCACACTTAGCTTTAAACTAGACCATTTTTCCATAATTTTCGTACCTGTGGCCCTTTTCGTTACATGATCCATTATAGAGTTTTCAATATGATACATACACTCAGATCCTTTCATCAACCGATTCTTCAAATACCTACTAATATTTCTCATCACCATGATGATTTTAGTTACCGCAAACAACCTATTCCAACTATTCATCGGCTGAGAAGGAGTGGGTATC [...]
+TCTTCTCATCGGGTGGTGACACGGACGAACCGACGCAAATACAGCCGCCCTCCAGGCAGTCCTCTATAATCGCATTGAAGATGTGGGTTTTATCATAGCCATAGCATGATTCTTAATCAACCTAAACACATGGGAACTTCAACAGATCTTTATTTCCCACCACAACAACCTAAATATACCACTTATAGGCCTCCTCCTAGCAGCAACTGGGAAATCAGCTCAATTCGGACTTCACCCATGACTGCCTTCAGCCATAGAAGGACCTACCCCAGTATCCGCCCTACTCCATTCTAGTACTATGGTCGTAGCAGGAGTTTTCCTCCTAATTCGATTCCACCCCCTAATAGAACACAACACGATAATACAAACAACCACCCTATGCCTAGGGGCTATCACTACTCTATTCACGGCAATCTGTGCACTCACCCAAAACGACATCAAGAAAATCATCGCATTCTCGACCTCAAGCCAACTAGGACTCATAATCATCAC [...]
+TCAACCAACCACACCTGGCATTCCTACACATCTGCACCCACGCATTCTTCAAAGCTATATTATTCATATGCTCCGGATCTATCATTCACAACCTAAACGATGAGCAAGATATCCGAAAAATGGGAGGTTTATATAAAGTACTACCATTCACCACTACCTCATTAATTGTAGGAAGCTTAGCGCTTACAGGAATGCCCTTCCTCACAGGATTCTACTCCAAAGACCTAATTATCGAAACCGCCAACACGTCGTATACCAACGCCTGAGCCCTATTACTGACTCTCGTCGCCACATCCATAACAGCAGCCTACAGCACTCGAATTATATTCTTCACACTCCTAGGGCAACCTCGATTTAACCCCATAATCACAATCAACGAGAACAGCCCACTCCTAATTAATTCCATTAAACGCCTACTACTAGGAAGCATTTTTGCAGGGTACTTAATCTCCTACAACATCACACCCACCTCCACTCCACAAATAACCATAC [...]
+CTAAAACTGACAGCCTTGACCGTAACACTTCTAGGCTTCATCCTAGCACTGGAACTGAACCTCACTTCACAAAGCCTTAAACTCAAATACCCATCAAACCTATTCAAATTCTCTAACCTCCTCGGATACTTCCCCACTATCATCCACCGCTACATACCGATAGTAAACTTATCAGCGAGCCAAAAACTAGCCTCAACACTACTAGATGCAATCTGGCTAGAGAGTGCATTACCAAAATCCATCTCTTACTTTCACATAAAATCATCAGTCACTATCTCCAACCAGAAGGGCCTAATCAAACTATACTTCCTCTCCTTCATCATCACCTTAATCCTGGCCCTAATAATA??????ATTAATTCCCACGAG
+>Phocarctos_hookeri
+ATGAACGAAAATCTATTCACCTCTTTCGCTTCCCCTGCAATAATAGGCCTTCCCATCGTAACCCTAATTATCCTGTTCCCAAGTATCTTATTTCCTTCACCGAGCCGACTGGTCAACAACCGCTTCACCTCTATCCAACAGTGATTGATCCAATTGACATCAAAACAAATAATATTAATTCACAATCACAAAGGACAAACATGGACATTAATACTTATGTCACTCATTACGTTTATTGGATCCACTAACCTACTGGGTCTGCTACCACACTCATTTACTCCTACTACCCAACTGTCTATAAACCTAGGAATGGCCATCCCCCTATGAGCAGGAACAGTTATTATAGGATTACGACATAAAACTAAAGCATCCCTGGCCCACTTCCTACCCCAGGGAACACCCTCCCCTCTCATCCCAATATTAGTGATTATCGAATCCATTAGCTTACTCATTCAACCCATAGCCTTAGCCGTACGACTGACAGCCAACATT [...]
+TCACCTATTAATTCACCTAATCGGTGGAGCTACCCTAGCCCTCACTAACATCAGTATAATTACGGCCCTTATCACTTTCACTATCCTCATCCTGCTCACAATCCTCGAGTTTGCTGTAGCCTTGATCCAAGCCTACGTTTTTACCTTACTAGTAAGCCTATACTTACATGATAACACCTAAATGCCACAACTAGACACATCAACATGGTTCACTACAATTATATCCATAATCTTGACACTATTTATCGTATTTCAATTAAAAATTTCTAAACACCACTTCCCAATAAGCCCAGAATCGAAGCCATTATCGGCGTCGAAAACGAATATCCCTTGAGAAAAAAAATGAACGAAAATCTATTCACCTCTTTCGCTTCCCCTGCAAATGTTCGTAAATCGATGATTATTCTCTACAAACCATAAAGATATTGGTACCCTCTATCTACTATTTGGCGCATGAGCCGGAATGGCTGGCACCGCCCTCAGCCTATTGAT [...]
+AGTTAGGTCAACCAGGCACTCTATTAGGAGATGACCAAATCTACAACGTAATTGTCACTGCCCACGCATTCGTAATGATTTTTTTCATGGTGATACCCATTATAATTGGAGGCTTTGGAAATTGATTGGTACCCTTAATAATTGGAGCTCCCGACATGGCATTTCCCCGAATAAACAACATAAGCTTCTGACTTTTACCTCCTTCCTTCCTACTGCTACTGGCCTCTTCTCTAGTTGAAGCTGGCGCAGGTACCGGATGAACGGTTTACCCTCCCCTAGCAGGAAACTTAGCCCACGCAGGAGCTTCCGTAGACTTGACTATTTTCTCCCTTCACCTAGCAGGGGTATCATCTATTCTGGGAGCCATTAACTTTATTACTACCATTATCAACATGAAACCCCCTGCTATATCCCAATACCAAACTCCTTTATTCGTGTGATCCGTACTGATCACGGCGGTACTACTTCTGCTGTCCCTACCAGTCCTAGCAG [...]
+ACCATATTGCTTACGGATCGAGATCTAAATACAACCTTTTTTGATCCAGCCGGAGGGGGTGACCCTATCCTATATCAACACCTATTCTGATTCTTCGGACACCCAGAAGTATATATTCTTATTCTACCAGGATTCGGGATAATCTCACACATCGTCACCTACTACTCAGGAAAAAAGGAACCCTTTGGTTATATAGGAATAGTCTGAGCAATAATATCCATCGGCTTCTTAGGCTTTATCGTATGAGCACATCATATATTCACTGTAGGAATGGATGTTGACACACGAGCATACTTCACCTCAGCCACTATAATTATCGCCATTCCTACAGGAGTAAAAGTATTTAGCTGGTTAGCTACTCTGCATGGTGGCAATATCAAATGATCTCCCGCTATACTATGAGCCTTGGGATTCATCTTCCTATTCACAGTAGGAGGCCTTACAGGCATTGTATTAGCAAATTCGTCATTAGATATCGTCCTCCACGACACA [...]
+GGTAGCACACTTCCATTACGTATTGTCAATAGGAGCAGTGTTTGCCATCATGGGCGGATTCGTTCATTGATTCCCCTTATTCTCAGGATTCATGCTCGACAGCACTTGGGCGAAAATCCACTTCACAATCATATTTGTTGGAGTCAATATGACATTCTTCCCACAACATTTTCTAGGCCTATCCGGAATACCACGACGATATTCTGACTACCCAGACGCCTACACAACATGAAATACAATCTCATCTATAGGCTCGTTCATCTCACTTACGGCAGTAATACTAATGGTCTTCATAATCTGAGAGGCTTTCGCATCCAAACGAGAAGTAGAGACGATTGAATTAACATCGACTAATATGGAATGACTTCACGGATGTCCTCCTCCCTATCACACATTCGAGGAACCTACGTACATTGTATCGAAAATGGCGTACCCCTTTCAAATAGGCCTTCAAGACGCAACCTCCCCTATTATGGAGGAATTAACACACTT [...]
+ATACATTAATGATCGTATTTCTAATTAGTTCACTAGTGCTTTATATTATCTCAACTATACTTACCACGAAACTTACACACACAAGCACAATGGACGCCCAGGAAGTAGAAACGGTATGAACAATTTTACCAGCTATTATTTTAATTATAATTGCTTTACCCTCACTTCGAATCCTTTATATTATAGACGAAATTAATAACCCTTCTCTAACTGTAAAAACTATAGGACACCAATGATATTGAACCTATGAGTATACTGATTATGAAGACCTAAACTTTGACTCCTACATAATCCCTACACAAGAACTAAAACCTGGCGAGCTGCGATTATTAGAAGTAGATAACCGAGTCGTACTGCCCATAGAAATAACAATCCGCATACTAATTTCATCAGAAGATGTACTTCACTCATGAGCCGTACCGTCTCTAGGACTAAAAACCGACGCTATCCCGGGACGATTAAACCAAACTACCTTAATAGCTATACGACCAG [...]
+TACGGTCAATGCTCAGAAATCTGTGGTTCCAACCATAGCTTCATACCTATCGTTATTGAATCCGTCCCATTGTCTTGCTTCGAGAAATGGTCCGCCTCAATACTTATGACACACCAAACCCATGCATACCATATAGTTAACCCTAGCCCTTGACCGTTAACAGGGGCCCTGTCAGCCCTCCTTATAACCTCAGGCCTAATCATATGATTTCACTTTAACTCAATTCACCTCCTATTACTAGGTCTTATAACCAATACACTAACTATATATCAATGATGACGAGACATCGTCCGGGAAAGCACGTTCCAAGGCCATCACACCCCAACTGTCCAAAAGGGCTTACGATATGGCATAATTCTTTTCATCGTATCCGAAGTATTCTTTTTCGCAGGATTTTTCTGAGCCTTCTACCATTCCAGCCTAGCACCCACCCCCGAACTAGGAGGATGCTGACCCCCCGCAGGAATCACACCTCTAAACCCACTAGAAGTT [...]
+TAACACTTCAGTACTATTGGCATCAGGCGTATCAATCACCTGAGCCCACCACAGCTTAATAGAAGGAGATCGTAAACATATGCTTCAAGCCCTATTTATCACTATTCTCCTAGGCCTCTATTTTACACTTCTACAGGCCTCAGAGTACTACGAGACCCCTTTCACAATCTCCGACGGAGTTTATGGCTCCACTTTCTTCATAGCTACAGGATTCCACGGATTACACGTAATCATCGGCTCAACCTTCCTAACCGTATGCTTCCTACGACAATTAAAATTCCATTTCACATCCAACCATCACTTCGGATTTGAAGCCGCTGCCTGATACTGACATTTCGTAGACGTCGTGTGACTATTCCTATATGTATCCATTTATTGATGAGGATCATGTATGACCAACATTCGAAAAATACATCCGCTGGCCAAAATCATCAACAACTCACTCATCGACCTACCCGCACCATCTAACATCTCAGCATGATGAAACTTTGG [...]
+TCGCGGTATGCTTAGCCTTACAAATCCTAACAGGCCTTTTCCTAGCCATACACTATACCTCAGACACCACCACAGCCTTTTCATCGGTCACCCACATTTGCCGAGACGTGAACTACGGCTGAATCATCCGATACATGCACGCAAATGGAGCCTCCATATTCTTCATCTGTCTCTACATACACGTGGGACGAGGATTATACTACGGCTCCTACACACTAACGGAAACATGAAACATTGGCATCATCCTCCTATTTACAATCATGGCCACAGCATTTATAGGCTACGTACTTCCGTGAGGACAAATATCGTTCTGAGGAGCAACCGTCATTACCAACCTCCTATCAGCAGTCCCTTACATCGGGACCGACCTAGTAGAATGAATTTGAGGAGGATTTTCAGTTGATAAAGCAACCCTAACACGATTCTTCGCCTTCCACTTTATTCTCCCCTTCGTAGCATCAGCACTAGTGATAGTACACCTACTATTCCTAC [...]
+GGATCCAATAACCCATCAGGAGTCTCCTCTGACTCAGACAAAATTCCGTTCCACCCATACTATACAATTAAGGATATCCTAGGAACCCTCTTACTAATCTTAATTCTAATACTACTAGTAATATTTTCACCAGACATGCTGGGAGACCCAGACAACTACATCCCAGCTAACCCCCTCAGTACCCCGCCACATATCAAACCTGAATGATATTTTCTATTCGCCTATGCCATTTTACGATCCATCCCCAACAAATTAGGAGGAGTCCTAGCCCTGCTCCTATCAATCTTAATCCTGGCTATCATCCCAATACTTCACACGTCAAAACAACGAGGAATAATGTTCCGACCCATCAGCCAATGCCTCTTCTGACTTCTAGTAACAGACTTACTCACACTAACATGAATCGGAGGACAACCGGTCGAACACCCATTCATCATTATCGGCCAACTAGCCTCAATCCTGTACTTCACAATCCTCCTAATTCTCATACCC [...]
+CATCATCGAAAATAAGATCTTAAAATGAATGACCATAATTAATATCCTCTCACTGATCATCCCAATCCTCCTAGCCGTAGCCTTCCTGACACTAGTAGAGCGAAAAGTACTAGGCTACATGCAACTCCGAAAAGGCCCCAATATCGTAGGACCCTTCGGGCTCCTACAACCAATTGCGGACGCCGTAAAATTATTCACCAAAGAGCCCTTACGACCACTCACCTCCTCCGCATCTATATTTATTACAGCCCCTATCCTGGCCCTAACCCTAGCCCTAACTATATGAGTCCCACTACCTATACCATATCCTCTCATCAATATAAACCTAGGAATCCTATTCATACTAGCAATGTCAAGCCTAGCTGTTTACTCAATCCTATGATCTGGGTGAGCATCAAATTCAAAATATGCACTAATTGGAGCCTTACGAGCCGTAGCCCAGACCATCTCATACGAAGTAACCCTGGCCATTATCCTCCTGTCAGTACTTCT [...]
+GGTCCTTCACCCTATCCACACTAATCACCACCCAAGAACACCTGTGATTAATCTTCCCAACATGACCCCTAGCCATGATATGATTTATCTCCACCCTAGCAGAAACCAATCGTGCCCCATTCGACCTAACGGAAGGAGAATCAGAACTAGTTTCGGGATTCAACGTGGAATACGCAGCAGGCCCATTTGCCCTATTTTTCCTAGCAGAATATGCCAATATTATCATAATAAACATCCTAACAACTACCTTATTCCTCGGGGCATTCCACAGTCCATACATACCCGAATTATATACAATCAACTTCACCCTAAAAACATTAACGCTGACAATCCTATTCCTATGAATCCGGGCATCATACCCCCGATTCCGCTACGACCAGTTAATGCACCTCCTATGAAAAAATTTCCTGCCCCTTACGCTAGCCCTATGCATATGACACATAACCCTGCCCGTAATTACAGCTAGCATTCCCCCTCAAACAATAAAACCCC [...]
+ATCATAATTATAACAACCGTCGTATCAGGAACCATAATTGTCCTAACAAGCTCTCATTGACTAATAATCTGAATCGGGTTCGAAATAAATATGCTAGCAATCATTCCGATTCTGATAAAAAACTTCAGCCCCCGAGCCACAGAAGCCTCCACAAAATACTTTCTAATCCAAGCCACCGCATCCATACTCCTAATGCTAGGCATTATCATCAACTTAATAACCTCGGGACAATGAACAATTCTAAAACCCCCAAACCCAATAACATCAAACCTCCTGACCATCGCCCTAACAATAAAACTTGGAATAGCCCCATTCCACTTCTGAGTGCCTGAAGTAACACAAGGAACCCCACTATCATCAGGCATGATTCTACTCACATGACAAAAAATCGCACCTCTATCCGTCCTTTACCAAATTGCACCGTCAATCAACCCAAATCTGCTAATCACATTAGCCATTGCATCAGTACTAGTAGGAGGATGAGGAGGACTA [...]
+TCAACTCCGAAAAATTCTAGCCTATTCATCAATTGCCCACATAGGATGAATTACCATTATCATAATATATAATCCTACCTTAATACTCCTAAACCTAATAATCTACATCACCATAACACTTGGAACATTTATACTATTTATATATAACTCATCCACAACAACACTATCACTGTCTCATACATGAAACAAATTGCCTCTCATGACATCCCTAATCCTAGTACTTATATTATCACTTGGAGGACTTCCCCCACTATCAGGCTTCGTACCCAAATGACTAATCATCCAAGAATTAACAAAAAATGACATAATCGTCCTACCGATATTCATGGCTATCACGGCATTACTAAACCTATATTTCTACATACGATTATCTTACACCACAGCACTAACACTATTTCCATCAACAAACAATATAAAAATAAAATGACAATTCGAAAACACAAAAAAGATAACCTTATTAACCCCACTAATCATTATCTCAACAATAATACT [...]
+CACCAATAATATCTATCCTAGACATAAACATAATAATAGCCTTGCTCACCAACACAATCCTAGCCTCTTTACTTGTACTAATCGCATTCTGACTCCCCCAGTTAAACATTTACTCAGAAAAAGCCAGCCCTTATGAATGTGGATTCGACCCCATAGGATCAGCACGCCTACCCTTTTCCATAAAATTTTTCCTAGTAGCCATTACGTTCCTATTATTCGACCTAGAAATCGCACTACTACTACCCCTCCCGTGAGCATCTCACGCGAATAACCTAACAACCACCCTCACTATAGCACTCATATTAATCTCCCTACTAGCCGCGAGTTTAGCTTACGAATGAACCGAAAAAGGACTCGAATGAACAGAAATGTCCATAGTATACTTTAATATCTTTATAGCCTTCACCGTGTCTTTCGTAGGACTGCTCATGTATCGATCCCACCTAATATCCTCTCTACTTTGCCTGGAAGGTATAATACTATCGCTATTCG [...]
+TCAATAACAATCCTAAACAACCACTTTACACTAGCCAACATAGCTCCCATCATCCTACTCGTATTCGCGGCTTGTGAGGCGGCCCTAGGATTATCCCTCCTAGTGATAGTATCTAACACATATGGAACTGACTACGTACAAAACCTGAATCTCTTACAATGCATCATCATTCCCACCATCATATTAATACCCGTGACATGAATGTCAAAACCCCATATAATTTGAATCAATACAACAGCCTATAGCCTACTAATTAGTCTCGCCAGCCTACCACTCCTAAGTCAACTTAACGACAACAGCCTAAACTCATCATTATTATTCTTCACGGACTCCCTATCGGCCCCCCTCCTAACGCTTACTACATGACTCCTACCCCTGATGCTTATAGCTAGTCAATTCCATCTATCAAAAGAACCACTGGCCCGAAAAAAACTTTATATTACAATACTAGTCCTTCTACAACTATTTCTAATCATAACATTCGCCGCTACA [...]
+CATATTTTACATCTTATTCGAAGCGACTCTAGTACCCACACTAATTATTATCACCCGATGAGGAAACCAGACAGAACGCCTAAACGCAGGACTATATTTCCTATTCTATACCCTAGCAGGGTCACTGCCCTTACTAGTAGCATTACTATATGTACAAAACAATATAGGCACGCTTAACTTCTTAATAGTCCAATACTGAACCCAAACCCTACCAAACTCCTGATCCAACATTCTCCTATGATTAGCGTGCATGATGGCATTCATAGTAAAAATACCCCTTTATGGACTCCACCTATGGCTTCCCAAAGCGCATGTAGAAGCCCCCATCGCCGGATCCATAGTACTTGCCGCCGTACTTCTAAAACTAGGAGGTTACGGCATAATACGAATCACTATCCTGCTTAATCCCCTGACAAGCTTTATAGCGTACCCCTTCATGATACTGTCAATATGAGGAATAATTATAACAAGCTCCATCTGCTTACGCCAAAC [...]
+AATCACTAATCGCATACTCCTCCGTAAGCCACATGGCCCTAGTGATTGTGGCTATCCTTATCCAAACACCATTAAGCTACATAGGCGCAACCGCCCTAATAATTGCCCACGGCCTCACATCATCTATGCTATTCTGCTTGGCTAACTCTAATTACGAACGCACCCACAGCCGAATCATAATCCTTGCACGCGGCCTACAAACCTTGCTACCACTAATAGCGGCATGATGACTACTAGCGAGCCTAACCAATTTAGCACTTCCCCCTACCATCAACCTAGTCGGAGAATTACTCGTAGTGATAGCCTCATTCTCATGATCTAACGCTACTATTATTCTTATAGGAGTAAACATCATTATTACCACCCTATACTCCCTATATATACTTACTACAACACAACGTGGAAAACACACTCACCACATCAAAAACATTAAACCCTCATTTACGCGAGAAAACACCTTAATAATACTCCACCTTATACCACTACTACTGC [...]
+AATCCTAAAATAATTCTAGGACCCCTTTACTGTAAAATAAAAGTAATCAATTTATTCACTACATTTATTGTTACAACACTACTTATACTCACGATACCAATTATCCTAACCAGCACTCCAATCTACGAAAGCAAACTCTACCCACAGTACGTGAAAACTATCATCTCTTACGCCTTCATAACCAGCATAATCCCCGCAATAATATTTATTTCCTCAGGACAAGAAATAATTATCTCAAACTGACACTGAATGACTATTCAAACCATAAAATTATCACTAAGCTTCAAACTAGATTACTTCTCGATAATTTTTATGCCCGTAGCCCTGTTCGTCACATGATCTATTATAGAATTTTCAATCTGATACATATCCTCAGATCCTTACATCAACCGATTCTTCAAATATCTATTAATATTCCTTATCACCATGATAGTTTTAGTTACCGCGAACAACCTATTCCAATTGTTCATCGGCTGAGAAGGAGTAGGCATC [...]
+CCTACTAATCGGATGATGATACGGACGGTCAGACGCAAACACAGCCGCCCTTCAAGCAATCCTTTACAATCGCATCGGAGATGTAGGTTTCATCATGGCCATGGCATGATTCCTAACTAACCTAAACACATGGGACCTCCAACAAATCTTCATAATTCACCATAATGACCTAAGCATACCACTCATAGGTCTCCTACTAGCGGCAACTGGCAAATCAGCCCAATTTGGTCTGCATCCATGACTACCCTCAGCCATAGAAGGGCCCACACCAGTATCAGCTCTATTACCCTCAAGCACTATGGTCGTGGCCGGAGTATTCCTACTGATCCGATTTCACCCTCTAATAGAACACAACACAACAATACAGACAATCACCCTATGCTTAGGAGCCACCACCACACTATTCACAGCGATATGCGCCCTCACTCAAAATGACATTAAAAAAATCATCGCATTCTCGACTTCGAGTCAACTAGGACTAATAATCGTCAC [...]
+TTGGCCAACCATATTTAGCATTCCTACATATCTGCACCCACGCGTTCTTTAAAGCCATATTATTTATGTGCTCTGGATCCATCATCCATAACCTAAACGATGAGCAAGATATTCGAAAAATAGGAGGCCTATTTAAACCAATACCGTTTACCACTACCTCACTAATCATTGGCAGCCTAGCACTCACAGGCATACCATTTCTCACAGGATTTTACTCCAAAGACCTAATCATCGAGGCCGCTAATACATCGAACACCAACGCCTGAGCCCTACTTCTAACCCTAACAGCCACATCCATAACAGCTGCCTACAGCACCCGAATAATATTCTACACACTCCTGGGGCAACCCCGATTCAACTCCACAATTACAGTAAACGAAAACAACCCACTACTAATTAATCCCATCAAACGTCTACTGCTCGGAAGCATCTTCGCAGGATACCTAATAACCCTTAACATCCCGCCCACAATGATCCCACAACTAACTATAC [...]
+CTAAAACTCACAGCCCTTGCCGTAACACTACTGGGTTTCACATTAGCTCTAGAACTCAGCACAGCCTCACTAGACCTTAAATTCAAACACGCGTCAGACCTATCCAAATTCTCGAATCTCCTAGGATATTTCCCCGCCATTATCCACCGTTTTGTACCAATGGTGAACCTAACAGCAAGCCAAAAACTAGCCTCTACATTAATGGACATAACCTTACTAGAATATCTGCTACCAAAATCTATTTCCCACCTAAACATAAAATCATCAATCACCATTTCTAACCAAAAAGGCCTAATTAAATTATATTTCCTATCCTTCATGATTACCCTGACCCTAGCCCTAATCCTAATAACAGCTAATTCCCACGAG
+>Procyon_lotor
+ATGAACGAAAATCTATTCTCCTCTTTCACTACCCCTACAATAATGGGACTTCCTCTCATTATCCTTATTACTATAGCCCCAAGCATCCTATTTCCTTCACCAGCCCGACTAATCAACAACCGATTTATTTCAATCCAACAATGATTGATCTGTCTAGTATCAAAACAAATACTCTCGATCCATAACCATAAAGGACAAACCTGAGCACTAATACTATTATCACTAATCTTATTTATTGGGTCAACCAACTTGCTAGGACTACTCCCACACTCATTTACTCCAACCACTCAATTATCCATGAACTTAGGGATAGCTATCCCCCTATGGGCCGGCACAGTGATTCTTGGTTTTCGATACAAGACAAAATCCTCCCTAGCCCACTTCCTACCCCAAGGAACACCTCTTCCTCTAATCCCCATGCTTGTTATTATTGAAACCATCAGCCTATTTATTCAACCCATAGCTCTAGCCGTACGATTAACGGCCAACATC [...]
+TCACCTATTAATTCACCTAATTGGAGGAGCCACTCTGGCTCTAATTAGTATCAACGTGCCCACAGCCTTAATTACTTTTATCATTCTTACTTTATTAACCATCTTAGAATTTGCCGTAGCCTTAATCCAAGCCTATGTCTTTACCCTATTAGTAAGCCTATACTTACATGATAATACTTAAATGCCACAACTAGATACTTCAACATGATTCATCACAATTCTATCAATAATCTTAACTCTATTTTTTGTATTCCAACTAAAAGTATCAAAACATTACTTCACAAATGACCCCAAACCTAAATCCACATTAATACCAAAAACCTCAACCCCCTGAGAAAAAAAATGAACGAAAATCTATTCTCCTCTTTCACTACCCCTACAAATGTTCATAACCCGATGGCTATTTTCCACAAATCACAAGGATATTGGCACTCTCTACCTTCTATTCGGGGCTTGGGCTGGAATAGTGGGCACCGCTCTCAGCCTACTAAT [...]
+AGTTAGGTCAACCGGGTACTTTATTAGGAGATGATCAGATTTACAATGTAATCGTAACTGCCCATGCTTTCGTAATAATCTTTTTCATAGTTATACCAATCATGATTGGAGGATTCGGTAACTGGCTAGTACCTCTTATAATTGGAGCACCTGACATAGCTTTCCCACGAATAAATAATATAAGCTTTTGACTTCTACCACCATCATTCCTACTATTACTAGCATCATCCATAGTAGAAGCAGGAGCAGGAACCGGATGAACCGTATATCCTCCTTTAGCAGGTAACCTAGCACATGCAGGAGCATCCGTGGACCTCACCATCTTCTCCCTTCACCTTGCAGGCGTCTCGTCCATCTTAGGTGCCATCAACTTCATCACCACTATTATTAACATGAAACCCCCCGCTATATCCCAATACCAAATCCCACTTTTTGTATGGTCAGTACTTATTACAGCAGTACTTCTCTTATTATCGCTGCCAGTACTAGCAG [...]
+ACCATATTACTCACCGACCGAAATCTGAACACAACCTTCTTTGACCCAGCAGGAGGAGGAGACCCAATCCTATACCAGCACCTATTCTGATTCTTTGGTCACCCTGAAGTTTACATTCTAATTCTACCTGGGTTCGGAATAATTTCTCATATCGTAACATATTATTCGGGCAAAAAAGAACCGTTCGGTTACATAGGAATAGTCTGAGCAATAATATCCATTGGTTTCCTAGGATTTATTGTATGGGCCCACCATATGTTTACAGTAGGTATGGACGTAGATACACGAGCATACTTCACTTCAGCCACTATAATTATTGCTATTCCTACAGGAGTAAAAGTCTTTAGCTGACTGGCTACCTTACACGGGGGAAATATTAAATGATCACCCGCTATATTATGAGCTCTGGGTTTCATTTTTCTATTTACAATTGGGGGTTTAACAGGAATTGTATTATCAAATTCATCACTGGATATTGTTCTTCACGACACT [...]
+AGTAGCACACTTTCACTATGTGTTGTCAATAGGAGCGGTATTCGCTATCATGGGAGGGTTCACTCACTGATTCCCGTTATTTTCAGGCTATACACTTAACGATGTTTGAGCAAAAATTCACTTCACAATCATGTTTGTAGGGGTTAACATGACATTTTTCCCCCAACACTTCCTAGGTCTATCAGGTATACCTCGACGATACTCTGACTACCCAGATGCATACACTACATGAAATACAGTCTCTTCTGTGGGATCATTCATCTCCCTAACAGCTGTAATACTAATGATTTTTATGGTATGAGAAGCCTTTGCTTCAAAACGAGAAGTGATGATAGTGGAACTAACCTCAACGAATATCGAATGGTTACATGGGTGTCCTCCTCCATATCACACATTTGAAGAACCTACTTATGTGCTGCTAAAAATGGCGTACCCGTTTCAGACAGGCCTTCAAGATGCAACCTCCCCCATTATAGAAGAGCTACTACACTT [...]
+ATACATTAATAATCGTATTTTTAATTAGCACTCTAGTTCTCTATATTATCTCTTCAATATTAACCACCAAATTAACACATACCAACACAATAGACGCTCAAGAAGTTGAAACAATCTGAACAATTCTACCAGCTGTTATCCTAATCCTAATTGCTCTCCCTTCTCTACGAATCCTTTACATGATAGATGAAATCAATAACCCTTCTTTAACTGTAAAAACAATAGGCCACCAATGGTACTGAAGTTATGAATATACTGATTACGAAGACCTAGACTTCGACTCTTACATAATCCCAACACAAGAATTAAAACCCGGAGAGCTACGACTACTAGAAGTCGACAACCGATTGATTCTTCCAATAGAAATAACAATCCGTATATTAATCTCATCAGAAGATGTTCTTCACTCATGAGCAGTGCCTTCCCTAGGACTAAAAACCGATGCCATCCCAGGACGCCTAAACCAGATTTCCCTAATAGCAACACGACCAG [...]
+TATGGTCAGTGCTCGGAGATCTGTGGTTCCAATCACAGCTTTATACCTATTGTCCTCGAACTAGTTCCATATTCCCATTTCGAAGAATGATCTATTACACTACTAATGACCCACCAAACCCATGCATATCACATAGTAAACCCAAGCCCATGACCATTAACAGGAGCACTATCCGCCCTTCTTATAACATCAGGCCTAATCATATGGTTCCACTTCAACTCAATGTCCTTACTGATATTAGGTCTCATAACCAATGTATTGACCATATACCAGTGATGACGAGACATCGTCCGAGAAAGCACATTTCAAGGTCACCACACCCCAATCGTACAAAAAGGGTTGCGATATGGCATAATCTTATTTATCGTGTCAGAAGTCTTCTTCTTCGCAGGATTCTTCTGAGCCTTTTACCATTCAAGCTTGGCACCTACTCCCGAACTAGGAGGTTGTTGACCACCAACCGGTATTCTACCCTTAAACCCCCTAGAAGTC [...]
+TAACACCTCTGTATTACTAGCCTCCGGAGTATCTATTACCTGAGCACACCATAGCTTGATAGAAGGAAACCGCAACCACATACTCCAAGCACTATTCATTACTATTTCCCTAGGAGTGTACTTTACACTACTTCAAGCTTCAGAGTATTACGAAACATCATTCACCATTTCTGATGGGGTATATGGCTCCACCTTCTTCATAGCTACAGGATTTCATGGCTTACACGTAATTATCGGATCAACTTTCCTCATTGTATGTTTCCTGCGTCAATTAAGCTACCATTTCACATCTAACCACCATTTCGGCTTTGAAGCCGCCGCCTGATATTGACACTTCGTAGATGTTGTCTGACTTTTCCTGTACGTCTCCATCTATTGATGAGGTTCTTATATGACCAACATCCGAAAAACTCACCCATTAGCTAAAATCGTCAACAACTCATTCATTGATCTACCCACCCCCTCAAACATCTCAGCATGATGAAATTTCGG [...]
+TCGGAATTTGTTTGCTTCTACAGATCGCAACAGGTTTATTTTTAGCCATGCACTATACACCAGATACAACCACAGCTTTCTCATCAGTTACCCACATTTGCCGAGATGTAAATTATGGCTGAATTATCCGATATATACACGCTAACGGAGCTTCCATATTCTTTATATGCCTATTCTTACACGTAGGACGAGGCTTATACTATGGCTCCTATACATTCTCTGAAACATGAAATATTGGTGTTATTTTACTACTCACAGTAATAGCAACTGCTTTCATAGGTTACGTCCTCCCATGAGGACAAATATCATTCTGAGGGGCAACAGTAATTACAAACCTCCTGTCAGCTATCCCCTATATCGGATCTAACCTTGTAGAATGAATTTGAGGAGGGTTTTCAGTAGACAAAGCCACCCTAACACGATTCTTCGCATTCCACTTCATTCTACCATTTATTATCACAGCGCTAGCAATAATTCACCTGCTATTCCTAC [...]
+GGATCCAATAACCCTTCTGGAATTACATCAGAATCTGACAAAATTCCATTTCACCCATACTACACCATTAAAGACATTCTGGGAATCCTATTCCTTATTTTTGTACTTATAGGTTTAGTGCTATTTACGCCAGACCTACTAGGTGACCCAGATAATTACACACCCGCTAACCCCTTAAACACCCCACCTCACATTAAACCTGAATGATATTTTCTATTCGCCTACGCAATTCTACGTTCCATTCCCAACAAACTAGGAGGAGTCCTAGCCCTAGTCCTCTCCATCTTAATCCTAATCATCATTCCACTCCTACACACCTCAAAACAACGAAGCATAATATTTCGGCCACTTAGCCAATGTTTATTCTGATTCCTAGTAGCAGACCTCCTCGTCCTAACATGAATTGGAGGTCAACCAGTAGAATATCCCTTCATCATCATCGGCCAACTAGCCTCCATCTTCTACTTTATAATCCTCCTGATCCTAATACCA [...]
+TATCATCGAAAATAATCTGTTAAAATGAGTGTATATAATTAACATCATTTCACTAATTGTACCAATCCTTTTAGCCGTAGCCTTCCTAACACTAGTAGAACGAAAAGTACTAGGATATATACAACTCCGAAAAGGCCCCAACATCGTAGGACCCTATGGCCTGTTACAGCCCATTGCAGACGCTGTAAAACTATTCACTAAAGAGCCTTTACAGCCGTTATCATCCTCCACAACAATATTCATCATAGCCCCCGTTCTAGCCCTGACACTAGCCCTGACTATATGAATCCCCCTACCCATACCCTACCCCCTTATTAACATAAATCTTGGAGTATTATTCATACTAGCGATATCAAGCCTGGCTGTCTACTCCATCTTATGATCAGGATGAGCTTCAAACTCAAAATACGCCCTAATCGGGGCCCTACGAGCTGTAGCCCAGACAATCTCATATGAGGTAACATTAGCTATCATCCTACTATCTGTATTATT [...]
+GATCCTTCACCCTATCTACACTAATCACCACACAAGAACACTTATGAATAATCTTCCCCGCATGACCCCTAGCCATAATATGATTTATCTCAACCCTAGCAGAAACAAATCGAGCACCCTTCGACTTAACAGAAGGGGAATCAGAACTAGTTTCTGGGTTCAACGTTGAATACGCAGCAGGACCTTTCGCCCTATTCTTTCTAGCAGAATACGCCAACATCATCATAATAAATATTCTAACAACCATTCTATTCTTCGGCGCATTCCACAGCCCACTCATACCAGAAATATATACTATTAACTTTACTGTAAAAACACTTCTCCTAACAATATTTTTCTTATGAGTTCGAGCATCATACCCACGATTTCGTTATGATCAACTAATACACCTATTATGAAAAAACTTCCTACCCTTGACACTGGCTCTATGCATATGACACGTAGCCCTACCCATTATCACAGCAAGCATTCCTCCCCAAACAATCAAGCCCT [...]
+ATTATCATCATATCAACTGTCATCTCAGGCACTATGATAGTACTAATTAGCTCCCACTGGCTAATGGTCTGAATCGGGTTTGAGATAAACATACTAGCAATCATCCCTATTTTAATAAAAAAATTCAACCCACGAGCCATAGAAGCTTCCACGAAATACTTTCTAACTCAAGCCACCGCATCCATAATCCTAATACTAAGTATCACCATAAATCTTATACTCACAGGACAGTGAACCGTATTGAGCAATAACAATCAAATTACAGCTAACATAATAACAATCGCTCTATCCATAAAACTTGGAATATCCCCTTTCCACTTCTGAGTGCCAGAAGTAACACAAGGAATTTCACTCTCCTCGGGAATAATCTTACTAACCTGACAAAAAATCGCACCTCTGTCTATTCTATACCAAATTTCACCGTCTATTAACCCAGACCTACTAGCGATCATAGCCATCATGTCAATTTTAATTGGAGGCTGAGGAGGCCTA [...]
+ACAACTACGAAAAATCCTAGCATATTCATCAATTGCTCATATAGGCTGAATAGCCGCTGTAACAACATACAACCCAACCCTAATAATACTAAACCTCACAATCTACATCATAATCACACTTGGAACATTTATACTATTTACAATGAACTCATCCACAACTACACTATCACTGTCTCACATATGAAACAAATTTCCTCTAATTACATCACTTGTCCTAACACTTATAATATCACTAGGAGGATTGCCTCCCCTCTCAGGATTCATCCCCAAATGACTAATTATTCAAGAACTGACAAAAAACGACATAATTATTATACCCACACTAATGGCCATGATAGCCCTACTAAACCTGTACTTCTACATACGACTAACATATGCCACAGCACTAACCATATTTCCCTCAATAAACAACATAAAAATGAAATGACAATTTGAAAATACAAAAAAAGTAACTTTACTACCACCACTTATTGTGATTTCCACCATACTAAT [...]
+CTCCCATTATATTAGCACTGCACATGAATATAATGTTAACTCTACTTACCAACACACTCCTAGCCTCCCTGCTCGTCCTAATCGCGTTCTGATTACCACAACTAAACATTTACACAGAAAAAGCAAGCCCTTACGAATGCGGATTTGACCCGATGGAATCAGCACGCCTACCTTTTTCCATAAAATTCTTCCTAGTAGCCATTACATTCCTACTATTTGATCTAGAAATTGCACTGTTATTACCACTACCTTGAGCATCGCAATCGATCAATCTAAAAACGATACTTATTATGTCACTAATACTAATCTCTTTACTAGCCATTAGCCTAGCCTACGAATGAACTGAAAAAGGATTAGAATGGGCTGAAGTGTCCATAGTATATGTAAATATCTCCCTAGCTTTCACCCTGTCCCTTATAGGCCTGCTCATATACCGATCACATCTAATATCTTCTCTACTATGCTTAGAAGGCATAATACTATCTCTCTTTG [...]
+TCAATTACAATTATAAGTAACCACTTCACATTAGCTAGCATGGCTCCCATTATCCTCCTGGTATTTGCAGCTTGCGAAGCAGCATTAGGGTTATCTCTCTTAGTTATAATTTCCAACACATACGGAACGGACTATGTACAAAACCTAAACCTCCTACAATGCATTATTATCCCCACCGCAATATTAATCCCCCTCACATGACTATCAAAACCCAACATACTATGAATTAACACAACAACCTACAGCATGCTAATCAGCTTCATCAGCCTAATTTACCTCAACCAGCTCATCGACAATACTCTAAACCTGTCACTTCTATTCTTCACAGACTCTCTCTCCGCACCCTTACTAGTTCTTACAACATGACTTCTCCCCTTAATACTAACAGCCAGTCAATTTCACTTAGCAAAAGAAACCTTAACTCGAAAAAAACTGTACATTACAATACTAATCACATTACAACTATTTCTAATCATAACATTCACTGCTACA [...]
+CATATTTTACATCCTATTCGAAGCTACACTTCTACCAACCCTAATCATTATCACCCGATGAGGCAATCAAACAGAACGACTGAATGCAGGCCTATACTTTCTATTCTACACTCTAGTAGGATCGCTTCCTCTCTTAGTAGCATTATTATGAATCCAAAATGACTTAGGTACCCTAAACTTTTTAATCGCACAGTACTGAATCCAGCATACATCATCTACCTGATCTAACATCTTCTTATGACTAGCATGCATAATGGCATTTATAGTGAAAATACCTCTGTACGGCCTTCACTTATGACTGCCCAAAGCCCACGTAGAAGCTCCCATCGCAGGGTCTATAGTTCTTGCCGCTATTCTGCTAAAATTAGGAGGCTATGGAATAATACGAATCACTGTTCTACTCAATCCAACAATAAGCTTCATAGCATATCCCTTCATAATACTATCCCTATGAGGAATAATTATAACAAGCTCCATTTGTCTACGCCAAAC [...]
+AATCCCTAATTGCATACTCTTCCGTAAGTCATATAGCCCTTGTGATCGCAGCAGTACTAATCCAGACCCCATGAAGTTACACAGGAGCTACTGTTCTAATAGTAGCACACGGCTTAACGTCATCTGCACTATTCTGCCTAGCCAACTCCAACTATGAACGTACCCATAGCCGAACTATAATCCTTACACGAGGCTTACAAACACTCTTACCCTTAATAGCTGCATGATGGCTACTCGCCAGCATAACCAACTTGGCGCTACCTCCCTCAATCAACTTAATTGGTGAACTATTCGTAGTAATAGCTTCATTCTCATGATCCAACATAACAATTGTTTTAATAGGAACAAACATTATCATTACTGCCCTATATACTCTTTATATACTAATCATAACACAACGCGGCAAATCCACACAACACATTAAAAATATCAAACCGTCCTTTACACGAGAAAACGCCCTAATAGCCCTCCACCTACTACCTTTACTCCTTC [...]
+AATCCTAAAATCATTATAGGGGCTATCCACTGTAAAGTAAAAGTAATTAACTTATTCGCCTCCTCTGTCATCATAGCATTATTCATACTAACCATGCCAATCATAATGACAAATACCCAAATCTACAAAAACAAACTCTACCCACAATATGTAAAAACTACCATTTCATATGCCTTTATAATTAGCCTTATCCCCACTTTAATATTCTTATACTCAGGACAAGAAATAATCATTTCAAACTGACACTGAATCACAATTCAAACTCTAAAACTATCACTAAGCTTCAAACTAGATTATTTCTCAATTATTTTCATGCCTGTAGCCCTATTCGTTACATGATCGATCATAGAATTCTCAATATGATATATACACTCAGACCCCTACATTAATCGGTTCTTCAAATACTTACTTATCTTTCTCATCACCATAATTATTCTAGTTACTGCCAACAATATATTCCAACTATTCATTGGCTGAGAAGGCGTAGGTATC [...]
+CCTACTAATTGGATGGTGACATGGACGAACAGATGCAAACACAGCCGCATTGCAAGCAATTCTCTACAACCGCATTGGAGACGTAGGATTTATCCTAGCCATAGCCTGATTTCTAACAAACCTAAACACATGGGACTTACAACAAATCTTCATAACCAACTGCAACAACCTCAACATACCCATAATAGGTCTATTACTAGCAGCCATCGGAAAATCAGCACAATTCGGTCTTCATCCCTGACTCCCATCAGCCATAGAAGGGCCTACTCCTGTTTCAGCCCTACTCCACTCAAGCACAATAGTCGTAGCAGGTGTATTCCTCCTGATTCGATTTCACCCACTAATGGAACATAACAAACACATACAAACAATCACCCTATGCCTAGGAGCAATGACAACCCTATTCACAGCGCTATGTGCTTTAACACAAAATGACATTAAAAAAATCATCGCTTTCTCCACTTCAAGCCAACTAGGACTTATAATCGTAAC [...]
+TCAATCAGCCATACCTAGCATTCCTACACATTTGCACTCACGCATTTTTCAAAGCTATACTATTCATATGTTCTGGGTCAATTATTCATAACCTAAACGACGAACAAGACATTCGAAAAATAGGAGGTCTCTACAAACTCTTACCTTTCACCACAACCTCACTCATTATCGGAAGCTTAGCACTAACAGGAATACCTTTCCTCACGGGATTTTACTCCAAAGATTTAATCATCGAAACCGCTAACACGTCGTATACCAACGCCTGAGCCCTTCTAATAACTCTCGTTGCCACTTCCCTAACAGCAGCCTACAGCACTCGAATCTTATTCTTCGCGCTCCTAGGACAACCCCGCTTCAGCCCTATTATTACAATCAACGAAAGCAATCCGCCCCTAATCAATTCAATCAAACGTCTACTACTCGGGAGCATCATTGCAGGCTATCTAATTACCCACAACATTTCACCCACCACCATCCCCCAGATAACTATGC [...]
+CTCAAAATAACAGCCCTGGCAGTAACCATCTTGGGTTTCATCCTGGCACTAGAACTAAACCTTACTGCACAAAGCCTAAAATTCAAGCATTCCTCAAATCTATTCAAGTTCTCAAACTCATTAGGGTATTTCCCCACTACCACACACCGCCTTGTGCCTAAAATAGGCTTATATACCAGCCAAAATTCGGCATCAACACTACTAGATGCAATCTGATTAGAAAAAGTACTGCCCAAATCTATCTCCCACTTTCAAATAAAATCCTCAACAACAGTTTCACACCAAAAAGGTCTAATCAAATTATACTTTCTATCCTTTATAATTACCCTCATTATTAGCCTGACCCTC??????CTTAATTTCCACGAG
+>Puma_concolor
+ATGAACGAAAATCTATTCGCCTCTTTCGCTACCCCAACAATAATAGGACTGCCTATCGTTATCTTAATTGTTATATTCCCAAGCATTCTATTCCCATCACCCAACCGACTAATTAATAACCGCCTGATCTCACTGCAACAATGACTAGTACAATTAACATCGAAGCAAATATTGGCCATCCACAATCACAAAGGACAAACCTGAGCCCTAATACTGATATCCCTCATCTTATTTATTGGATCAACAAACCTATTAGGCTTATTACCTCACTCATTCACCCCAACCACCCAATTATCAATAAACTTAGGAATAGCTATTCCACTATGAGCCGGCACTGTAATTACCGGGTTTCGCCATAAAACTAAAGCATCCCTAGCCCACTTTTTACCACAAGGAACACCTATTCCCCTAATCCCCATGCTCGTAATTATCGAAACTATTAGCCTCTTCATTCAACCTATGGCCCTAGCCGTACGACTTACAGCTAACATC [...]
+TCACTTACTAATACACTTAATTGGAGGGGCCACTTTAGCCTTAATAAACATTACAACTTCCGTTGCCTTAATTACTTTTATTATTCTTATCCTACTAACAATCCTTGAATTCGCTGTAGCCCTAATCCAAGCCTACGTTTTCACCCTACTAGTAAGCCTATATCTACATGATAATACCTAAATGCCACAACTAGATACATCAACTTGATTTATCACTATTGTATCAATAATTATAACACTATTTATCATATTCCAACTAAAAATCTCAAAATATCTATATCCGTCAAATCCAGAACCCAAGTCTACAATTACACTAAAACAATCTAATCCCTGAGAAAAAAAATGAACGAAAATCTATTCGCCTCTTTCGCTACCCCAACAAATGTTCATAAATCGCTGACTGTTTTCAACTAATCATAAAGATATTGGCACTCTTTACCTTCTATTTGGTGCCTGAGCCGGTATGGTAGGAACTGCTCTTAGTCTCCTAAT [...]
+AACTAGGTCAACCTGGCACACTACTAGGAGATGATCAAATTTATAATGTGGTCGTTACTGCCCATGCTTTTGTGATGATTTTCTTCATAGTAATACCTATTATGATTGGAGGGTTTGGTAACTGATTGGTCCCATTAATAATTGGAGCCCCTGACATAGCATTCCCCCGAATGAATAACATGAGCTTCTGACTTCTTCCTCCATCTTTTTTACTTCTACTTGCTTCATCTATGGTGGAGGCCGGAGCAGGGACTGGATTAACAATATATCCACCCTTAGCCGGTAATCTGGCTCATGCGGGAGCATCCGTAGATCTAACCATTTTCTCACTCCACCTAGCAGGTGTCTCTTCGATCTTGGGTGCTATTAATTTTATCACCACTATTATTAATATAAAACCTCCTGCCATATCTCAATACCAAACACCCCTTTTTGTATGATCAGTTTTAATCACTGCAGTCCTATTACTCCTATCACTCCCAGTCCTAGCAG [...]
+ACTATGCTATTAACAGATCGAAACCTAAATACCACATTCTTTGATCCTGCCGGAGGAGGAGATCCTATCTTATACCAACACTTATTCTGATTTTTTGGTCACCCGGAGGTCTATATTTTAATTCTACCCGGCTTCGGAATAATCTCACATATTGTTACCTATTACTCAGGTAAAAAGGAACCATTTGGCTACATGGGAATAGTTTGAGCCATAATATCAATTGGCTTTCTGGGCTTTATCGTATGGGCCCATCACATGTTTACCGTGGGAATAGATGTAGATACACGAGCATACTTTACATCAGCTACCATAATTATCGCCATTCCTACTGGGGTAAAAGTATTTAGCTGACTGGCTACTCTTCACGGAGGTAATATTAAGTGGTCCCCCGCCATACTATGAGCTTTAGGTTTTATCTTCCTATTTACCGTAGGAGGTTTGACAGGGATTGTACTAGCGAACTCCTCACTAGATATCGTTCTTCACGATACA [...]
+AGTAGCCCATTTCCACTATGTATTATCAATAGGAGCAGTATTCGCTATTATAGGGGGTTTCGTCCATTGATTCCCTTTATTCTCAGGGTACACTCTTGATAATACTTGGGCAAAAATTCACTTCACAATTATATTTGTGGGAGTTAACATAACGTTTTTCCCTCAGCACTTCCTAGGGCTATCTGGAATGCCGCGACGTTATTCTGACTACCCAGACGCATATACGACTTGAAACACAATTTCCTCAATAGGCTCTTTCATCTCACTAACGGCAGTTATACTAATAATTTTCATAGTGTGAGAAGCTTTTGCATCCAAGCGAGAAGTGGCTATAGTAGAATTGACCACAACTAATCTCGAATGACTACATGGATGTCCCCCTCCCTACCACACATTTGAAGAGCCAACTTATGTACTATTAAAAATGGCATATCCCCTACAATTAGGCTTTCAAGATGCCACATCTCCTATTATAGAAGAGCTCCTACACTT [...]
+ATACATTAATAATTGTATTTCTAATTAGCTCGCTAGTCCTCTATATTATCTCATTGATACTAACAACCAAGCTTACACATACAAGCACAATAGATGCTCAAGAAGTAGAGACCATCTGAACGATCCTGCCCGCCATCATCCTAATTCTCATTGCCCTACCCTCCCTACGAATTCTTTATATAATAGATGAAATCAACAGCCCCTCCCTTACAGTTAAAACCATAGGACATCAGTGATACTGAAGCTACGAGTACACTGACTACGAAGATTTGAACTTTGACTCCTACATAATCCCTACCCAAGAGCTAAAACCAGGAGAACTTCGGCTACTAGAAGTTGACAACCGAGTAGTTTTACCAATAGAAATAACTATTCGCATACTAATTTCATCAGAAGACGTACTACACTCATGAGCTGTCCCATCCCTAGGTCTAAAAACTGACGCTATTCCAGGTCGACTAAACCAAACAACCCTAATAGGCACACGACCTG [...]
+TATGGTCAATGCTCAGAAATCTGTGGCTCAAACCACAGTTTCATGCCCATCGTCCTCGAACTAGTCCCACTAGCATATTTTGAAAAATGATCTGCATCTATACTGATGACCCACCAAACCCACGCATACCACATAGTCAACCCCAGCCCATGGCCACTTACAGGGGCCCTTTCAGCCCTCTTAATAACCTCAGGTCTAGCCATATGATTTCACTACAATTCAACACTATTATTAACCCTTGGAATAACTACTAATCTATTAACAATATATCAGTGATGACGAGACATCATTCGAGAGAGTACATTCCAAGGCCATCATACACCCACTGTCCAAAAAGGCCTTCGATATGGAATAATCCTCTTTATCGTCTCAGAAGTATTCTTTTTTGCAGGCTTCTTCTGGGCCTTTTACCACTCAAGTCTAGCCCCAACCCCCGAACTAGGAGGATGCTGACCACCAACAGGCATTATTCCCTTAAACCCCTTAGAAGTT [...]
+TAACACTTCTGTACTTCTAGCCTCTGGAGTATCAATCACTTGAGCCCACCATAGTTTAATAGAAGGAAACCGAAAACACATGCTCCAAGCACTATTTATCACAATTTCCCTAGGAGTTTACTTCACACTCCTCCAAGCCTCCGAATATTACGAAACATCATTCACAATCTCAGATGGGATTTATGGGTCTACCTTCTTCATGGCCACAGGATTCCACGGACTACATGTAATCATTGGCTCCACTTTCCTAATTGTATGCTTCTTACGTCAACTAAAATATCACTTTACATCAAACCACCACTTCGGATTCGAAGCCGCTGCTTGATATTGACATTTCGTAGACGTAGTTTGACTATTCTTATACGTTTCCATTTATTGATGAGGATCTTATATGACCAACATTCGAAAATCACACCCCCTTATCAAAATCATTAATCACTCATTTATTGATTTACCCACCCCATCCAACATTTCAGCATGATGAAACTTTGG [...]
+TAGGGGTCTGCCTAATCCTACAAATCCTAACCGGCCTCTTCCTGGCCATACACTATACATCAGACACAATGACTGCCTTTTCATCAGTCACTCACATCTGTCGTGACGTTAACTACGGCTGAATTATTCGGTACATACATGCCAACGGAGCCTCCATATTCTTTATCTGCCTATACATGCACGTGGGACGAGGAATATATTATGGCTCCTATACCTTCTCGGAAACATGAAATATTGGAATCATACTACTATTTGCGGTCATAGCCACAGCCTTTATAGGATATGTCTTACCATGAGGCCAAATATCCTTCTGAGGAGCAACCGTAATTACTAACCTCCTATCAGCAATCCCATACATCGGAACCAATTTGGTAGAGTGAATTTGAGGAGGCTTTTCAGTAGACAAAGCCACCCTAACACGATTCTTTGCCTTCCATTTTATCCTCCCATTCATCATCTCAGCTCTAGCAGCAGTACACCTTCTATTTCTCC [...]
+GGATCTAACAACCCCTCAGGAATCACATCTGATTCAGACAAAATCCCATTCCATCCATACTACACAACCAAAGACATCTTGGGTCTCCTAGCATTAATCTTAACACTCATGCTACTCGTCCTATTCTTACCAGATATATTAGGAGACCCAGACAACTACATCCCTGCCAACCCTCTAAATACTCCCCCTCATATCAAACCCGAATGATACTTCCTGTTCGCATATGCAATCCTCCGATCCATCCCCAACAAACTAGGAGGAGTACTAGCCCTAGTACTCTCTATTCTAATCTTAGCAATAATCCCAACCCTCCACACCTCCAAGCAACGAGGAATAATGTTCCGACCACTAAGCCAATGCTTATTCTGACTCCTAGTAGCAGACCTCCTAACCCTAACATGAATTGGCGGCCAACCCGTAGAACATCCTTTTATTACAATCGGTCAATTAGCCTCTGTCCTATATTTCTCAACCCTCCTAATCCTAATACCC [...]
+CATTATCGAAAATCGCCTTCTAAAATGAATGTTCATAATCAATATCCTCTCACTAATTATCCCCATTCTCCTCGCTGTAGCCTTCCTCACCTTAGTTGAACGAAAAGTACTAGGCTACATACAACTCCGCAAAGGACCAAATGTCGTAGGACCATACGGCCTACTCCAACCTATCGCAGACGCCGTAAAACTCTTCACCAAAGAACCCCTCCGACCCCTCACATCCTCCATATTCATATTCATTATAGCACCAATTCTAGCCCTCACACTAGCCCTAACCATGTGAATTCCACTACCCATACCATACCCACTTATCAACATAAACCTGGGAGTGCTATTTATGTTAGCTATGTCAAGCCTAGCCGTTTACTCCATCCTATGATCAGGATGAGCCTCAAATTCAAAATACGCCCTAATCGGAGCCCTACGAGCCGTAGCCCAAACAATCTCATATGAAGTCACCCTAGCCATCATCCTCTTATCAGTATTGCT [...]
+GATCCTTCACACTAGCTACACTAATCATTACCCAAGAACATATATGATTAATTATCCCCGCATGGCCCCTAGCCATAATATGATTTATCTCAACACTAGCAGAAACCAACCGGGCCCCATTTGACCTAACAGAAGGAGAATCAGAACTAGTCTCAGGGTTCAACGTAGAATACGCAGCAGGCCCCTTCGCCCTATTCTTTCTAGCAGAGTACGCTAACATCATTATAATAAATATCCTTACAACAATCTTATTCCTCGGAGCATTCCACAACCCCTACATACCAGAACTATATACCATCAACTTCACAGTAAAAACCCTATTTCTAACAACCACTTTCTTATGAATCCGAGCATCCTATCCACGATTCCGATATGACCAACTAATACACCTTCTATGAAAAAACTTCCTACCTCTTACCCTAGCCCTATGCATATGACACGTATCAATGCCCATTACCATAGCAAGCATCCCGCCTCAAACAATCAAACCCC [...]
+ATCACCATTATATTAACCGTTATCTCAGGAACTATAATTGTAATAACAACCTCCCACTGACTTATAGTCTGAATCGGCTTTGAAATAAATCTACTAGCCATTATCCCCATCCTAATAAAAAACTATAACCCACGAGCCATAGAAGCAGCCACAAAATATTTCCTAACTCAAGCAACCGCCTCCATAATCCTGATAATAGGAATTATCATCAACCTACTGCACTCAGGACAATGAACCGTGTCAAAAGACCTCAACCCCCTAGCATCAATCATAATAACAACCGCCCTAGCGATAAAACTAGGACTAGCCCCGTTCCACTTCTGAGTGCCTGAAGTCACACAGGGAGTTTCTATATCATCAGGCCTAATCCTACTAACATGACAAAAAATTGCACCACTATCTATTCTCTACCAAATCTCACCCACCATTAACCCCAACCTACTCCTAACAATATCCATCATATCAGTTATAATTGGAGGCTGGGGAGGCCTC [...]
+ACAACTACGAAAAATCATAGCATATTCCTCAATCGCCCATATAGGCTGAATAACAGCTATCACAATATACAACCCCACAATAATAATCCTAAACCTAATCATCTATATCATTATAACACTAACCACTTTTATATTATTTATACACAACTCCACCACAACAACATCATCCCTGTCACAAACATGAAATAAAACCCCCTTAATCACCTCACTTATCCTAGTACTAATAATATCCCTGGGCGGCCTACCCCCGCTTTCCGGTTTCATTCCAAAATGAATAATCATCCAAGAACTAACTAAAAATGAAATAATTATAATACCAACACTACTAGCCATAACAGCACTGCTCAACCTATATTTCTACATACGACTAACATACACCACTGCACTAACTATATTTCCCTCAAACAATAACATAAAAATAAAATGACGATTCGAATGCACAAAAAAAATAACCTTCATACCCCCTCTAATCGTAATATCAACCATACTACT [...]
+CACCAATACTATATATCCTGAATATAAACGTAATACTCGCCTTACTCACCAACACACTTCTATCCACATTACTCGTACTCATCGCATTCTGACTGCCCCAACTAAATATTTACGCAGAAAAAGTAAGCCCCTATGAATGTGGGTTTGACCCCATGGGATCTGCTCGTCTACCCTTTTCCATGAAATTTTTCTTAGTAGCCATCACATTCTTACTGTTCGACCTAGAAATTGCACTACTACTCCCTCTTCCCTGAGCCTCACAAACAAACAATTTATCAACCATACTCACTATAGCCCTTCTATTAATCTCCCTGGTAGCCGCAAGCCTGGCCTACGAATGAACCCAAAAAGGACTAGAATGAACTGAAATGTCCATAGTCTACATTAACATCTTCCTGGCCTTCACCATGTCACTCATAGGACTATTAATGTACCGATCCCACCTAATATCTTCTCTCTTATGTCTAGAAGGCATAATATTATCCCTATTTA [...]
+GCCGTAGCAATTCTAAACAATCACTTTACACTAGCCAGCATAACCCCTATTATTCTACTAGTATTTGCAGCCTGCGAGGCGGCACTAGGCCTATCCCTGCTAGTAATAGTATCAAATACATATGGTACCGACTATGTACAAAACCTAAACCTCCTACAATGCATCATTATCCCCACCGCTATGCTTATACCAATAACATGATTATCAAAACCTAACATAATCTGAATTAACTCAACAGCCTACAGCCTACTAATTAGTCTTATTAGCCTCTCCCATCTAAATCAACTAGGTGATAACAGCTTAAACTTCTCATTATTATTTTTCTCAGACTCACTCTCTGCACCTCTACTGGTATTAACAACATGACTTCTGCCACTAATACTCGTAGCCAGCCAATCACACCTATCAAAAGAAACCTTAACCCGAAAAAAACTATATATTACAATACTCATCCTCCTACAACTCCTCTTGATCATAACATTTACCGCCACA [...]
+TATATTCTATATTCTATTTGAAGCCACATTAATCCCCACTTTAATTATCATTACCCGATGAGGCAACCAAACAGAACGACTAAATGCTGGCTTGTATTTTCTATTTTATACCCTAATAGGCTCATTACCTCTTTTAGTCGCACTATTATATATCCAACACACACTAGGAACCCTAAACTTCTTAATCATTCAATACTGAGCCAAACCCATCTCAACTACCTGATCCAACATTTTCCTCTGACTAGCATGCATAATAGCATTTATAGTAAAAATACCTTTATACGGACTCCACCTCTGATTGCCAAAAGCACATGTTGAAGCCCCTATCGCCGGCTCAATAGTGCTTGCCGCCGTATTATTAAAGCTAGGGGGGTACGGAATAATGCGCATCACAATTTTACTAAACCCCACAACAAATCAAATAGCATACCCCTTTATAATACTATCCCTATGAGGAATAGTTATAACAAGTTCTATTTGTCTACGTCAAAC [...]
+AATCTTTAATTGCATACTCATCTGTAAGCCATATAGCCCTAGTAATTGTAGCAGTACTAATCCAAACACCCTGAAGCTACATAGGAGCCACAGCCCTAATAATTGCCCACGGACTAACTTCATCCATATTATTTTGTCTTGCAAACTCAAACTATGAACGAGTACATAGCCGAACAATAATCCTAGCACGAGGCTTACAAACTATTCTTCCCCTGATAGCTGCTTGATGACTACTAGCCAGCCTCGCAAACCTAGCCCTACCGCCCACAATTAACCTAATCGGAGAACTATTTGTAGTAATAGCCTCTTTCTCATGATCCAACATAACCATTATCCTCATAGGTACAAACATTATCATCACAGCCCTGTATTCTCTCTATATACTCATTACAACCCAACGAGGTAAGTACACACATCACATTAAAAATATTAACCCATCATTTACACGAGAAAACACCCTAATAGCCCTACATATACTCCCCCTTCTCCTCT [...]
+AACCCCAAAATTGTATTAGGACCCATTTATT?????ATAAAAGTAATAAATCTATTTACCCCATTTATATTAACCACAATACTTATTCTACTTCTACCTATCATCATATCCAATACCCAATTATACAAAAACAGTCTGTATCCCTACTATGTAAAAACTACAGTCTCCTACGCCTTCACCATCAGCATAATCCCAACCATAATATTTATCTCTTCAGGGCAGGAAGCAGTCATCTCAAACTGACACTGACTGTCAATTCAAACCCTTAAACTGTCATTAAGCTTTAAAATAGACTACTTCTCAATCATCTTTATCCCCGTAGCACTATTTGTCACATGATCAATCATAGAGTTCTCAATGTGATATATACACTCAGATCCATGCATTAACCAGTTCTTTAAATATCTTCTCATATTTCTAATTACCATAATAATTCTAGTAACCGCTAATAACCTGTTCCAACTATTTATCGGCTGAGAAGGAGTGGGAATT [...]
+TTTACTCATTGGGTGATGACATGGCCGAGCAGACGCGAACACAGCTGCCCTACAAGCAATCCTTTACAATCGCATTGGGGATGTAGGTTTTATCATAGCCATAGCATGATTCCTTACCAACCTAAACGCATGGGACTTCCAACAGATCTTTATCATCCAACATAAAAACTTAAACATCCCTTTACTAGGACTCCTATTAGCAGCCACAGGTAAATCTGCCCAATTCGGTCTACATCCATGACTACCATCAGCCATAGAAGGCCCAACCCCCGTCTCCGCTCTACTCCACTCAAGTACAATAGTCGTAGCCGGAGTCTTTTTAATAATCCGCTTCCACCCACTTATGGAACAAAACAAAACCATACAAACTTTCACCTTATGTTTAGGGGCCATCACAACCCTGTTCACAGCCATCTGTGCTCTCACACAAAACGACATCAAAAAAATTGTTGCCTTTTCAACCTCAAGCCAGTTGGGCCTAATAATTGTAAC [...]
+TTAACCAACCCTATCTCGCATTCCTACACATCTGCACTCACGCATTCTTTAAAGCCATATTATTCATATGCTCAGGATCAATTATTCACAGCCTAAATGACGAACAGGACATTCGAAAAATAGGCGGATTATATAAACCAATGCCCTTTACCACCACCTCCCTCATTATCGGAAGCCTCGCATTAACAGGTATACCCTTCCTAACAGGTTTCTATTCCAAAGACCTAATCATCGAGACAGCCAACACGTCGTATACCAACGCCTGAGCCCTACTAATTACTCTCATTGCCACATCCCTTACAGCTGCCTACAGCACTCGAATTATATTCTTTGTACTCCTGGGACAACCACGATTCAACGCCTTGAACCTAATCAATGAAAATAATACCCACCTCATCAACTCCATTAAACGTCTCTTAATTGGAAGCATCTTTGCAGGATACCTAATCTCTTATAATATCCCTCCAACAACCATCCCACAAATGACTATAC [...]
+CTGAAACTAACTGCTCTTGCCGTGACTATCACAGGCTTTATCCTAGCATTAGAACTCAACCTCGCGACCAAAAACTTAAAATTCAAATATCCCTCAAACCTCTTCAAGTTTTCCAGCCTCCTAGGGTATTTTCCAACTGTAATACACCGCCTCCCATCAAAAATAAGCCTAACTATAAGCCAAAAATCCGCATCGATACTACTAGACACTATCTGACTAGAAAATGTATTACCAAAATCCATCTCCTACTTCCAAATAAAAATGTCAACTACCGTATCTAATCAGAAAGGACTAGTTAAACTCTACTTCTTATCTTTCATAATCACCTTAACCCTTAGCCTACTCTTA??????CTTAATTACCACGAG
+>Spilogale_putorius
+ATGAACGAAAATCTATTCACCTCTTTCACTACCCCAACAATAATTGGGCTACCAATTGTTGTCATTATCATTATATTTCCCAGTATTTTCTTTCCCTCACCCAACCGACTAGTTAACAATCGACTTATTTCAATCCAACAATGACTAGTCCAATTAATATCGAAACAAATACTATCAATTCATAATAACAAAGGACAAATTTGAGCCTTAATATTAATGTCCCTTATCTTATTTATTGGGTCAACTAACCTCCTAGGCCTACTACCACACTCATTCACTCCAACTACACAACTATCTATAAACCTGGGTATAGCTATTCCACTATGAGCTGGCACAGTTCTAACTGGCCTTCGCCATAAAACAAAAGCATCTTTAGCCCATTTTTTACCCCAAGGAACACCCGTTCTCCTAATCCCGATACTTGTAATTATTGAAACCATCAGCCTATTTATTCAACCTATAGCATTAGCTGTACGATTAACAGCCAATATT [...]
+CCATCTGTTAATTCATCTTATTGGAGGGGCTACTTTAGCCCTGATAAATATCAGCACTACAACAGCCTTAATCACTTTTATCATTCTAATTCTTCTTACCATTCTAGAATTCGCCGTAGCTCTAATTCAAGCCTACGTGTTTACCCTCTTAGTAAGCCTATACCTACATGACAACACCTAAATGCCACAATTAGATACCTCGACCTGATTTATTACAATTATCTCTATAATCATTACATTATTTATTGTATTTCAACTTAAAATCTCAAAATATAATTTTCCGAAGGGCCCTGAGCCTAATCTAACAAAATTAACATCAACTACTTCACCTTGAGAAAAAAAATGAACGAAAATCTATTCACCTCTTTCACTACCCCAACAAATGTTCATAAACCGATGATTATTTTCTACAAACCATAAAGACATCGGCACCCTTTATCTTTTATTTGGTGCATGAGCCGGAATAGCTGGGACCGCTCTTAGCCTATTAAT [...]
+AGCTAGGACAGCCCGGGGCTCTACTAGGGGATGATCAAATCTACAACGTAATTGTAACAGCCCATGCATTTGTTATAATCTTTTTTATAGTAATACCGATCATAATCGGAGGATTCGGTAACTGATTAGTTCCCTTAATAATTGGGGCTCCAGACATGGCATTCCCACGAATAAATAATATAAGCTTCTGACTTCTACCCCCATCCTTTCTTTTACTCTTAGCCTCTTCCATAGTAGAAGCAGGGGCAGGAACAGGATGAACAGTGTATCCCCCATTAGCAGGTAACTTAGCCCATGCAGGGGCATCCGTAGATTTAACAATTTTCTCCCTTCACCTAGCAGGCGTATCATCAATCTTAGGAGCTATTAACTTTATTACCACAATTATTAATATGAAACCTCCTGCAATATCACAATATCAAACTCCATTATTTGTATGATCCGTACTAATTACAGCAGTTCTACTTCTCTTATCACTACCAGTATTAGCAG [...]
+ACTATATTACTTACAGATCGAAACTTAAATACAACCTTTTTCGACCCGGCTGGAGGAGGAGATCCTATTTTATATCAACACTTATTTTGATTCTTTGGACATCCTGAAGTCTATATTTTGATCCTACCAGGATTTGGAATAATCTCACATATTGTGACCTACTATTCAGGCAAAAAAGAACCTTTTGGGTATATAGGGATAGTGTGGGCAATAATATCCATTGGTTTCCTGGGCTTTATCGTATGAGCTCACCATATGTTTACTGTAGGAATAGATGTAGATACACGAGCATATTTTACTTCTGCTACTATAATCATCGCAATTCCAACAGGAGTAAAAGTATTTAGCTGATTAGCAACCTTACATGGTGGTAACATTAAATGATCACCCGCTATGCTATGGGCACTAGGATTTATTTTCTTATTTACAGTAGGAGGTCTTACAGGAATTGTACTATCCAACTCTTCACTAGATATCGTACTTCACGACACA [...]
+AGTAGCCCATTTTCACTATGTACTTTCAATGGGAGCAGTGTTTGCTATCATAGGCGGATTTGTTCACTGATTCCCTCTATTTTCAGGATATACACTTAATGACACATGAGCAAAAATTCACTTTACAATCATATTCGTAGGAGTTAATATAACATTTTTCCCTCAACATTTTCTGGGATTATCAGGAATACCTCGACGCTACTCAGACTACCCAGACGCTTATACAACATGAAATACAGTATCCTCTATAGGCTCATTTATTTCACTAACAGCAGTAATACTAATGATCTTCATAATTTGAGAAGCCTTTGCATCCAAACGAGAAGTATTAACAGTTAGTTACACTTCAACTAACATTGAATGATTACATGGATGTCCTCCTCCATACCACACATTCGAAGAACCTGCTTATGTAACACTGAAAATGGCTTATCCGTTCCAAATAGGACTCCAAGATGCAACTTCTCCTATTATAGAAGAACTACTACACTT [...]
+ATACACTTATAATTGTCTTCTTAATTAGTTCACTGGTTCTTTACATTATTTCATTAATATTAACCACTAAATTAACTCATACTAATACAATAGATGCCCAAGAAGTTGAAACAGGGTGAACAATTCTCCCAGCTATTATCTTGATTTTAATTGCCTTGCCATCTCTACGAATCCTCTACATAATGGACGAGATTAATAATCCATCATTAACAGTAAAAACTATAGGTCACCAATGATATTGAAGTTATGAATACACAGATTATGAGGACTTAAATTTCGACTCTTATATAATTCCAACTCAAGAATTAAAACCTGGAGAACTACGATTATTAGAAGTAGACAATCGAGTTGTTTTACCAATAGAAATTACCATCCGTATACTTATTTCATCTGAAGACGTATTACACTCATGAGCCGTACCATCATTAGGGTTAAAAACTGATGCTATCCCTGGACGCCTAAACCAAACAACACTAATAGCCATACGACCAG [...]
+TACGGTCAATGCTCAGAAATTTGTGGATCAAACCACAGCTTTATACCTATTGTTCTTGAATTAGTTCCTCTATCCCACTTCGAAAAATGATCTATCTCAATACTAATGACCCACCAAACCCATGCTTACCATATAGTTAACCCAAGCCCATGGCCACTAACAGGAGCCCTATCCGCCCTATTAATAACATCCGGCTTAATTATATGATTCCACTTCAATTCCACACATTTACTACTACTAGGACTTACAACTAATATATTAACCATGTACCAATGATGACGAGATGTAATCCGAGAAAGCACATTTCAAGGTCATCATACACCTATCGTTCAAAAAGGGTTGCGGTATGGAATAGTACTATTTATTTTATCAGAAGTATTCTCTTTTGCAGGTTTCTTCTGAGCTTTCTACCACTCAAGCCTCGCACCAACACCAGACCTAGGAGGATGTTGACCACCTACAGGTATCTTACCCCTTAATCCTTTAGATGTA [...]
+TAATACCTCCGTTCTACTAGCCTCAGGAGTAACTATTACCTGAGCACACCATAGCCTAATAGAAGGAAACCGCAAACATATACTTCAGGCCCTATTTATTACTATCTCACTAGGTTTATACTTTACAGCACTACAAGCTTCAGAGTATTACGAAACCTCATTTACAATCTCTGATGGAGTCTACGGATCTACCTTTTTTATAGCTACAGGATTCCACGGACTGCATGTAATCATTGGCTCAACTTTCCTGATTATTTGCTTTCTTCGACAACTAAATTATCACTTCACATCTAGCCATCATTTTGGATTTGAAGCAGCTGCCTGATATTGACATTTCGTAGACGTAGTGTGATTATTCCTATATGTATCAATCTATTGATGAGGATCATATATGACCAACATTCGAAAATCCCACCCACTAGCTAAAATCATCAATAACGCATTCATTGATTTACCTGCCCCCTCTAATATTTCAACATGATGAAACTTCGG [...]
+TCGGAATCTGCTTGATTCTACAGATTGCGACAGGTTTATTCTTAGCTATACACTATACATCAGATACAACCACAGCCTTCTCCTCAGTCACCCATATTTGCCGAGACGTAAACTACGGCTGAATTATCCGATACCTACATGCAAATGGAGCTTCCATATTTTTTATTTGCCTATACCTACATGTAGGACGAGGACTCTATTACGGCTCATATATATTTCTAGAAACATGAAATATTGGTATCATCCTACTTTTCACAGTGATAGCAACTGCATTCATAGGTTACGTACTACCATGAGGACAAATATCATTCTGAGGAGCAACTGTAATCACAAATTTACTCTCAGCCATCCCCTATATCGGCACTGACCTAGTCGAGTGAATCTGGGGCGGATTCTCAGTAGACAAAGCAACCCTAACTCGATTCTTTGCTTTCCACTTTATCTTACCATTCATCATCTCAGCCCTAGCAATAGTCCACTTACTGTTCCTTC [...]
+GGATCTAACAACCCATCTGGAATGGTATCAGACTCTGACAAAATTCCATTCCACCCATACTACACAATCAAGGACATCTTAGGAATCTTACTCCTGACCCTAATCCTTATAGCCCTTGTCCTATTCTCACCTGACATACTAGGAGATCCAGACAACTACACCCCAGCCAACCCATTAAACACTCCACCCCATATTAAACCCGAGTGATATTTCCTATTTGCTTACGCCATCCTACGATCTATCCCCAACAAACTAGGAGGAGTCCTAGCTCTAATCCTATCTATTCTAGTACTAGCCATTATCCCCCTCCTAAACACATCAAAACAACGAAGCATAATATTCCGACCCCTCAGTCAATGCTTATTCTGACTTTTAGTAGCAGACCTACTAACTCTGACCTGAATTGGAGGTCAACCAGTAGAACACCCGTACATCATCATTGGCCAATTAGCCTCATTACTATACTTCACTATCCTACTGATCCTGATACCC [...]
+TATTATTGAAAATAACATATTAAAATGAATGTTTATTATAAATATTGCCTCCATAATTGTACCAATCCTTTTAGCAGTAGCTTTCCTAACTCTAGTAGAACGTAAAGTATTAGGCTATATACAACTTCGAAAAGGACCCAATATCGTAGGGCCATACGGCCTACTCCAACCTATCGCAGATGCCGTAAAACTATTCACAAAAGAACCATTACGACCGCTTACATCCTCCCTATCTATATTTATTCTAGCCCCAATTCTAGCCCTAACCTTAGCCTTAACTATATGAGTTCCTCTTCCAATACCCTATCCACTCATTAATATAAACTTAAGCATTCTTTTCATATTAGCTATATCTAGTCTCGCTGTTTACTCAATCTTATGATCGGGATGATCTTCAAATTCAAAATATGCTCTAATTGGAGCTCTACGAGCCGTAGCTCAAACAATCTCATATGAAGTAACACTAGCCATTATTTTATTATCAGTCCTACT [...]
+GCTCATTCACCTTATCCACTCTTATCATCACGCAAGAACATTTGTGACTAATCTTCCCCGCATGGCCTCTAGCTATAATATGATTTATTTCAACCCTAGCAGAAACCAACCGAGCACCATTCGACCTAACAGAAGGTGAATCAGAACTAGTCTCAGGATTTAATGTAGAATATTCAGCCGGTCCATTCGCACTGTTTTTTCTAGCAGAATATGCTAACATTATCATAATAAATATTCTCACAATTATCTTATTCTTCGGCGCATTCCACAACCCATTTATGCCAGAATTATATACAGTTAACTTTACCATCAAAACCCTACTCCTAACAATCTCTTTCCTATGGATCCGAGCATCATACCCACGATTCCGCTATGATCAACTAATACACCTATTATGAAAAAATTTTCTGCCCCTAACATTAGCTATATGTATATGACACGTAGCCCTTCCCATTATCACAGCAAGTGTTCCACCACAAACAATAAAACCCC [...]
+ATTATTATTTTATCAACAGTTATTATAGGGACGATCATAGTAATAACAAGCTCCCATTGACTACTCGTCTGAATCGGATTTGAAATAAATATACTAGCCATTATCCCTATCTTCATAAAAAAATTTAACCCACGAGCTGTAGAAGCATCAACAAAATATTTTTTAACACAAGCAACAGCATCAATATTATTAATACTGGGCATTGCCACAAATCTAATATTAACAGGGCAATGAACAATATCCAATATTTTAAACCCCGCCGCATCCAACACAATTACCATTGCTCTATCAATAAAGCTTGGACTCTCTCCATTCCACTTCTGAGTACCCGAAGTAACCCAAGGAATCCCCATGCTATCAGGAATAATCCTATTAACCTGACAAAAAATCGCACCACTATCAATTATATATCAAATTTCACCATCCATTAACCCCAATTTAATTATTACCATAGCCACTACATCCGTCCTAGTAGGAGGATGAGGAGGACTC [...]
+CCAACTACGAAAAATCCTAGCATACTCATCCATTTCTCATATAGGATGAATAGCATCTGTACTAATATATAGCCCAACATTAATAACACTTAACCTACTAATTTACATAACAATAACACTAGGAACATTTATACTATTTATATATAATTCTTCCACTACTACATCATCACTATCTCATATATGAAATAAATTACCTCTGGCTACTTCACTAGTCCTATTAATTATATTATCAATTGGAGGCTTACCTCCTCTCTCAGGATTCATGCCTAAATGAATAATTATTCAAGAACTTACAAAAAATGATCTAATCATTATTCCAACATTACTAGCTATAACAGCCTTACTAAATCTATATTTCTATACACGACTTGCATATAACACAGCACTCACCATATTTCCCTCATCAAGTAACATAAAAATAAAATGACAGCTCGAAAACTTAAAAACGATAATATTTTTATCACCCCTAATTATTTTATCAATTATACTTCT [...]
+CCCCAATAATATCAACCCTATACATAAATATTATCACAGCGCTATTCATTAATATTTCCCTATCCTCTCTGCTCGTAACTATCGCATTCTGACTACCACAATTAAATATTTATACAGAAAAAGCTAGCCCTTACGAATGTGGCTTTGATCCAACAGGATCAGCACGACTACCATTTTCCATAAAATTCTTCTTAGTAGCCATTACATTCCTACTATTCGACCTAGAAATTGCACTTTTACTACCTCTACCCTGAGCAACACAATCAACTGACCTAAAAACAGTACTCACTATATCACTTATACTAATCCTACTTTTAGCTGCAAGCCTAATATATGAATGAACCGAAAAAGGATTAGAATGAACTGAAGTGCCAATAGTATATGCTAACATCTTCCTGGCTTTTATCATATCACTTTTAGGTCTATTAGTATACCGATCTCATCTCATATCCTCCCTACTATGCCTAGAAGGGATAATATTATCTCTATTCA [...]
+ACCATTACTATTTTAAGTAACCATTTCACATTAGCTAGTATGACACCTATCATCTTGCTGGTCTTCGCAGCCTGTGAGGCAGCACTGGGTTTATCGCTATTAGTAATAGTATCAAATACATACGGAACCGACTACGTACAAAACCTAAACTTACTACAATGCATTATTTTTCCCACTATAATACTAATCCCCCTTACATGATTATCTAAACCTAGCATACTATGAATTAACTCCACTTCCTACAGCCTGCTGATCGGGCTAATTAGCTTAATCTATCTAAATCAACTCACCGACAACAATTCCAACCTCTCGTTATTATTCTTTACCGACTCCCTCTCGGCCCCATTGTTAGCACTTACAACATGACTGTTACCTCTAATATTAACAGCTAGCCAATCTCACTTATCAAAAGAAACCAATACCCGAAAAAAACTCTATATTACAACATTAGTTCTACTTCAACTACTATTAATCATAACATTTACTGCTACA [...]
+TATATTTTATATCCTATTTGAAGCTACCTTAATTCCAACCCTTATTATTATCACTCGATGAGGCAACCAAACTGAACGCCTCAATGCAGGCTCATATTTCTTATTCTATACCTTAACAGGATCACTACCCCTTTTAGTAGCTTTATCATATATTCAAAACAATCTAAATACATTAAATTTTACAACAATCCAACTTTTATCTCAACCAATATCAAACTCTTCATCTAATATGCTATTATGACTAGCATGTATAATAGCATTTATGGTTAAAATACCTCTATATGGTCTTCACCTATGACTTCCAAAAGCACACGTAGAAGCTCCCATTGCCGGGTCCATAGTACTGGCTGCAGTACTTCTAAAACTAGGAGGCTACGGAATAATGCGAATCACAGTCCTACTCAATCCTATTACCAACTTTATAGCTTACCCCTTCATAATATTACCCTTATGAGGCATAATTATAACAAGCTCAATCTGTTTACGCCAAAC [...]
+AATCCCTTATTGCATATTCCTCAGTTAGTCATATAGCACTAGTAATCGTGGCAGTATTAATTCAAACACCATGAAAGTTCGCAGGAGCAACTGCCCTAATAATTGCCCATGGCCTAACATCATCAATATTATTCTGTTTAGCTAACTCCAACTATGAACGAGTACATAGTCGAACTATAATCCTCGTTCGAGGACTACAAACCCTCTTACCCTTAATAGCCGCATGATGACTACTAGCTAGCTTAGCTAACTTAGCACTTCCCCCTACCATCAACTTAATCGGCGAATTATTCGTAATTATATCTTCATTTTCTTGATCCAACATCACCATTATCCTTATAGGAGCTAATGTAGTTATCACTGCTCTATACTCGCTTTACATACTAATTATAACCCAACGAGGAAAATATACTCACCATATCAAAAACATCAAACCCTCATTCACACGAGAAAATACTTTAATAATAATACACCTCCTACCCCTACTACTAT [...]
+AACCCTAAAATCATCATAGGACCAATCTACTGTAGAATAAAAGTAATCAATCTACTTGCTCCCTCTATTATAATAATCTTATCTATATTAACATTACCAGTACTATTAACCTGTACCAATTTATATAAAAACAAGCAATATCCACAGTACGTAAAAACTACTATCTCATATGCTTTTATAATTAGTATAATTCCAATAATAGTATTCCTATATTCAGGACAAGAAGCAATCATCTCCAACTGACATTGAATAACTATTCAAACTATAAAATTATCACTAAGCCTTAAACTAGACTATTTCTCGATAATATTCATACCAGTAGCCCTATTCGTCACATGATCAATCATAGAATTCTCAATATGATATATACACTCAGACCCATATATTAATCGCTTCTTCAAATACTTATTAATATTCTTAATTACTATAATAATTTTAGTTACAGCTAACAACATATTCCAACTATTCATCGGATGAGAAGGAGTAGGTATT [...]
+TCTTCTAATTGGATGATGACATGGACGTACCGATGCAAACACAGCCGCCCTACAAGCAATCCTATATAATCGAATCGGAGACGTAGGATTTATTACAGCCATAGCCTGATTCCTACTCAATCTAAACACATGAGACTTTCAACAAATATTTATAACCAATCATAACAACTTAAACTTACCACTCATAGGCCTCCTACTGGCCGCCACAGGAAAATCAGCCCAATTTGGCCTCCATCCATGACTTCCATCAGCTATAGAAGGTCCAACACCAGTTTCAGCCCTACTCCACTCTAGCACTATAGTAGTAGCAGGAGTATTCCTCCTCATCCGATTTCATCCCCTAATAGAACATAACAAAACAATTCAAACCACTACTCTTTGCTTAGGAGCAATGACCACCTTATTTACGGCTATATGTGCTCTCACACAAAATGATATCAAAAAAATTATCGCTTTCTCCACCTCAAGCCAACTAGGACTTATAATTGTAAC [...]
+TTAACCAGCCCCATTTAGCATTCCTTCATATCTGCACTCATGCATTTTTTAAAGCAATACTATTTATATGCTCAGGTTCCATTATTCATAATCTAAATGATGAACAAGATATCCGGAAGATAGGAGGTTTATTCAAATTAATGCCCTTTACTACCACCTCACTTATTATTGGAAGCCTAGCCCTTACTGGAATACCTTTCCTTACAGGATTCTACTCCAAAGACCTAATCATTGAAACCATCAACACGTCGTATACCAACGCCTGAGCCCTACTAATAACCCTCGTTGCCACATCCATAACAGCCGCCTACAGTACCCGAATCATATTCTTCGCACTACTAGACCAACCTCGTTTTAATCCAACTATCATAATCAACGAGAGCAATCCACTCCTAATAAATTCCATTAAACGCCTATTACTAGGGAGCATCTTTGCAGGATTCTTAATCTCCCACAATATTACACCCACCACTATCCCACAGATAACTATGC [...]
+CTTAAAATAACAGCTCTTGCAGTAACCATCACAGGTTTCATCCTGGCACTTGAACTAAACCTTACAACACAGAACCTAAAACTTAAATACTTATCAAACTTATTCAAATTCTCTAGCTCACTAGGGTATTTTCCCATTATTATACATCGACTTACCCCAGCCTCAAACTTAATTATAAGTCAAAAATTAGCATTTATGCTATTAGACACAACATGACTAGAAAATATCATACCAAAATCTATCTCTAATTTCCAAGTAAAATCATCCATTTTAATTTCTAACCAAAAGGGAATAATCAAACTATACTTTATATCCTTTATTGTTACTCTAGTAGTAAGTATATTAATA??????CTTAATTTCCACGAG
+>Taxidea_taxus
+ATGAACGAAAATTTATTCTCCTCTTTCATTACCCCTACAATAATAGGACTCCCTATTGTTGTTATTATTACAATATTCCCAAGCATCTTATTCCCCTCCCCAAACCGATTAGTTCCTAATCGACTTATCTCTATTCAACAATGACTAGTCCAACTAACATCGAAACAAATATTATCTATTCACAGCTCAAAAGGACAAACCTGAGCATTAATACTGATATCTCTCATCCTATTCATTGGCTCTACCAACCTACTAGGCCTTTTACCCCATTCGTTTACCCCCACCACACAACTATCTCTAAACCTAGGAATAGCCATCCCCCTATGAGCAGGCACAGTAATTATCGGATTCCGACACAAAACTAAAGCTTCCCTAGCCCACTTTCTACCACAAGGAACCCCTCTTCCCCTAATTCCTATACTCGTAGTCATTGAGACTATTAGCTTATTTATCCAACCTATGGCCCTAGCTGTACGACTAACAGCCAATATC [...]
+CCACCTATTAATTCACCTAATTGGCGGAGCTACTCTGGTCCTAACAAACATAAGCACTATCGCAGCCATAGTAACTTTCACCATTCTTATCCTACTAACCATTCTAGAATTTGCAGTAGCCCTCATTCAAGCCTATGTCTTCACCCTACTAGTAAGCCTATACCTACATGACAACACCTAAATGCCACAATTAGACACTTCAACATGGCTTATTACCATCATTTCAATAATTATTACCCTATTTATCCTATTCCAACTGAAATTATCAAAATATAACTTTCCAGAAAACCCTGAGTCAAAATTAACATCAAAACTAAAACCCACCGTCCCTTGAGAAAAAAAATGAACGAAAATTTATTCTCCTCTTTCATTACCCCTACAAATGTTCATAAACCGGTGACTATTCTCCACAAATCATAAGGATATCGGCACTCTCTACCTCCTATTCGGTGCATGAGCTGGAATAGTAGGCACCGCTCTCAGCCTATTAAT [...]
+AACTAGGCCAACCAGGCACCCTACTGGGAGATGACCAGATCTACAATGTCATTGTGACCGCCCATGCCTTTGTAATAATCTTCTTCATAGTCATACCAATTATAATCGGGGGCTTCGGAAACTGATTAGTTCCCTTAATAATTGGCGCACCCGACATAGCATTCCCACGAATAAATAATATAAGCTTCTGACTTCTGCCTCCTTCCCTTCTTCTCCTACTAGCCTCCTCCATAGTGGAAGCAGGAGCAGGAACAGGATGAACCGTATACCCTCCTCTAGCAGGTAATCTAGCGCATGCAGGAGCGTCCGTAGACTTAACAATTTTCTCCCTACATTTAGCAGGTGTCTCGTCCATCCTAGGGGCTATCAACTTTATCACCACTATTATTAATATAAAACCCCCCGCAATATCACAATACCAAACTCCTCTATTCGTGTGATCCGTCCTAATCACAGCCGTACTTCTGCTCTTATCCTTACCAGTACTAGCTG [...]
+ACAATGCTACTCACAGACCGAAACCTAAACACTACTTTCTTCGACCCAGCAGGAGGAGGAGATCCTATTTTATATCAACACTTATTTTGATTCTTTGGCCACCCTGAAGTATATATTCTAATTTTACCAGGCTTTGGAATAATCTCGCACATTGTTACCTATTACTCAGGAAAGAAAGAACCTTTCGGGTACATAGGAATAGTCTGAGCCATAATATCAATCGGCTTCCTGGGATTTATCGTGTGAGCCCACCATATATTTACTGTAGGAATAGACGTCGACACACGAGCATACTTCACTTCTGCTACCATAATCATCGCAATTCCAACAGGCGTGAAAGTATTTAGCTGACTCGCTACCTTACATGGAGGAAATATTAAATGATCACCAGCCATACTATGAGCCCTAGGGTTCATCTTTCTATTTACAGTAGGTGGCTTAACAGGAATTGTATTATCAAACTCATCACTAGACATCGTTCTTCACGACACA [...]
+AGTAGCACACTTCCACTACGTCCTCTCAATAGGGGCAGTATTTGCAATTATGGGCGGATTTGCCCACTGATTCCCACTATTTACAGGCTATACTCTAAATGATGTTTGGGCAAAAGCTCACTTCACAATTATATTTGTAGGAGTCAACATAACATTTTTTCCTCAACATTTCCTAGGACTATCCGGCATACCACGACGATACTCCGACTACCCAGACGCTTATACAACATGAAATACAGTGTCTTCCATAGGTTCATTCATTTCACTAACAGCAGTAATACTAATAATCTTCATAATCTGAGAGGCCTTTGCATCTAAACGAGAAGTATTAATGGTAGAACTCACCTCAACAAACATTGAATGACTGCACGGATGCCCTCCCCCATATCACACATTTGAAGAGCCAACTTACGTTCTATCAAAGATGGCATACCCTTTTCAAATAGGCCTTCAAGATGCAACTTCACCCATCATAGAAGAATTACTACATTT [...]
+ATACGCTAATAATCGTATTCTTAATCAGTTCTCTTGTCCTTTACATCATCTCACTAATACTAACCACCAAACTAACACACACAAGCACTATAGACGCCCAGGAGGTCGAAACAGTATGAACCATCTTGCCTGCCATCATTTTAATTCTAATTGCTCTACCTTCATTACGAATCCTCTATATAATAGATGAAATCAACAACCCATCTTTAACCGTAAAAACAATAGGACACCAATGATACTGAAGTTACGAATATACAGACTACGAAGATCTTAACTTCGACTCATACATAATTCCAACTCAAGAACTAAAACCCGGAGAACTACGACTTCTGGAAGTAGACAATCGAGTAGTACTCCCAATAGAAATAACAATTCGCATATTAATCTCATCTGAAGACGTACTACACTCATGAGCTGTACCCTCTCTAGGGCTAAAAACCGACGCTATTCCAGGTCGCCTAAACCAAACAACCCTAATAGCTATACGACCAG [...]
+TATGGTCAATGTTCAGAAATCTGCGGTTCCAACCACAGCTTTATACCCATCGTCCTTGAACTAGTACCTTTATCTTACTTCGAAAAATGATCTGCTTCAATACTAATGACCCACCAAACCCATTCATACCACATAGTAAACCCCAGCCCATGACCACTCACGGGAGCCCTATCCGCCCTTCTCATAACATCGGGACTAGCAATATGATTTCACTTCAACTCAATAATTCTCCTAGTCCTGGGAATAACTACCAATATATTAACCATATACCAATGATGACGAGACATCATTCGAGAAGGAACATTTCAAGGTCACCACACACCTACCGTTCAAAAAGGCCTACGATATGGAATAATCCTTTTCATCGTATCAGAAGTATTCTTCTTTGCAGGGTTTTTCTGAGCCTTTTACCACTCAAGCCTGGCACCAACCCCCGAGTTAGGAGGATGCTGACCCCCTACTGGCATTTTACCCCTAAATCCATTGGAAGTA [...]
+AAATACCTCCGTACTCCTAGCTTCAGGAGTATCCATTACCTGAGCCCACCATAGTCTAATAGAGGGAAACCGAAAGCACATACTCCAAGGCCTATTCATCACAATCTCCCTAGGCCTATACTTTACACTCCTACAAGCCTCAGAATACTACGAAACCCCATTCACAATCTCTGATGGAATTTATGGCTCTACATTCTTCATAGCAACGGGATTTCACGGCCTACATGTCATTATTGGATCCACCTTCCTTGTCGTGTGCTTCCTACGCCAATTAAAATTCCACTTTACATCCAATCACCATTTTGGATTTGAAGCAGCAGCCTGATACTGACATTTCGTAGATGTTGTATGACTATTCCTATACGTATCTATCTATTGATGAGGATCCTATATGACCAACATTCGCAAAACTCACCCATTAGCTAAAATTATCAACAATTCATTTATCGATTTACCCGCACCGTCAAATATCTCAACATGATGAAACTTCGG [...]
+TTGGAGTCTGCCTAATCATCCAAATCCTCACAGGACTATTTCTAGCCATACACTACACATCGGATACAACCACAGCTTTCTCATCAGTAACCCACATCTGTCGAGACGTAAACTATGGCTGAATTATCCGATATATACATGCCAACGGGGCTTCCATATTCTTTATCTGCCTGTTCCTACACGTAGGACGAGGCCTATACTATGGTTCTTATATATTTCCCGAAACATGAAACATTGGCATTATCCTATTACTAACAGTTATAGCAACTGCATTCATAGGTTACGTTTTACCATGAGGACAAATATCATTCTGAGGTGCAACCGTAATCACCAACCTACTATCAGCCATCCCATATATCGGAACTAACCTTGTAGAATGAATTTGAGGAGGCTTCTCAGTAGACAAAGCCACCCTAACACGATTCTTCGCCTTCCACTTCATCCTACCATTCATCATTTTAGCACTAGCAGCCATTCACCTACTATTCCTCC [...]
+GGATCCAACAACCCTTCAGGAATCCCCTCTAACTCAGACAAAATCCCATTCCACCCATACTATACAATCAAAGACATCCTAGGAGCCCTACTTATAGCACTCCTACTAATAGTACTAGTATTATTCTCACCCGATTTGCTAGGAGACCCAGACAATTACACACCCGCCAATCCACTCAGCACGCCACCCCATATCAAACCCGAATGATACTTCCTATTTGCATACGCAATCCTACGATCCATCCCCAACAAGCTAGGAGGAGTACTAGCCCTATTATTTTCCATCCTAATTTTAGCCATCATCCCACTTCTCCACACCTCCAAACAACGAAGCATAATATTCCGTCCATTAAGCCAATGCATATTCTGACTACTAGTAGCCGATCTTCTCATTCTAACATGAATTGGCGGCCAACCAGTAGAACACCCATACATCACTATTGGCCAACTAGCCTCAATCCTCTACTTCACAATCCTCCTAGCCCTAATACCA [...]
+CATTATCGAAAACAACCTATTAAAATGAATGTTCATAATCAACATCATCTCACTAATTGTACCCATCCTACTCGCCGTAGCCTTCCTTACATTAGTAGAACGAAAAATCTTAGGGTATATACAACTTCGCAAAGGCCCAAACATCGTAGGACCCTACGGCCTACTACAACCAATTGCAGACGCCGTAAAACTCTTTACCAAAGAACCCCTACGACCTCTAACATCATCCATTACTATATTCATAATAGCCCCAATTTTAGCACTAACCTTAGCCCTAACCATATGAATTCCACTACCCATACCCTACCCACTCATCAACATAAACTTAGGAATCCTGTTTATACTAGCTATATCAAGCCTAGCCGTATATTCTATCCTATGATCTGGATGAGCCTCAAACTCAAAATATGCTCTGATTGGAGCTCTCCGAGCCGTAGCCCAAACAATCTCATACGAAGTCACACTAGCCATCATCCTCCTATCCCTACTACT [...]
+GATCCTTCACACTATCCACACTAATCACCACACAAGAACACCTATGACTAATCTTCCCTGCATGACCCCTAGCTATAATATGATTTATTTCAACCCTAGCAGAAACTAACCGCGCCCCATTCGACCTAACCGAAGGAGAATCAGAACTGGTGTCCGGATTTAATGTCGAATACGCAGCCGGACCATTCGCCCTATTTTTCCTAGCCGAATATGCCAACATTATCATAATAAACATTCTCACAACCATCCTATTTTTCGGTGCATTCCATACTCCTTACCTCCCAGAACTATACTCCGTCAACTTCATCATAAAAACACTACTACTAACAATCTCTTTCTTATGAATCCGAGCATCATACCCACGATTTCGTTACGACCAACTCATGCACCTACTATGAAAAAATTTCCTCCCCTTAACACTAGCCCTATGCATATGACACGTATCCCTACCAATCATAACAGCAAGTATCCCACCACAAACAATCAAACCCC [...]
+ATTACTATCATATCAACCGTTATCTCAGGAACTATTATAGTACTAATAAGTTCCCACTGATTAACCATCTGAATCGGATTTGAAATAAACATACTAGCTGTAATCCCCATTCTAATAAAAAACTTCAACCCACGAGCCACAGAAGCATCAACAAAATATTTCCTCACTCAAGCCACCGCATCAATACTTCTAATGCTAGGAATTATTACTAACCTGCTACTAACAGGACAATGAACGGCACTAAGCACACCCAACCCCATTGCATCAAACATAATAACAGTAGCCTTGGCAATAAAACTAGGACTATCCCCCTTCCACTTTTGAGTGCCCGAAGTAACCCAAGGGATTTCCCTATCATCAGGAATAATTCTACTCACCTGACAAAAAATCGCCCCCTTATCCATCCTATACCAAATCTCACCATCCACCAATCCAAACCTACTAACAATCATGGCTATCATATCCATTCTCACAGGAGGTTGAGGAGGCCTT [...]
+ACAACTACGAAAAATCATAGCATACTCATCAATTGCCCACATAGGATGAATAGTCGCTGTAACAACATACAACCCCACCTTAATAACATTAAACCTCATAATCTACATCATAATAACACTTGGAACATTCATACTATTCATACTTAACTCATCCACGACCACACTCTCACTATCTAACATATGAAATAAATCCCCACTAATTGCCTCACTAGTCCTAACTATCATACTATCACTAGGAGGTTTACCCCCATTATCAGGCTTCATCCCCAAATGAATAATCATTCATGAACTTACAAAAAATGATATAATCATTATACCCGTATTTATAGCAATAACAGCTCTCCTAAACCTATTTTTCTATATACGATTAACATACACAACAGCACTAACCATATTCCCTTCAACAAACATTACAAAAATAAAATGACAATTCGAAAACACAAAAACTATAACCCTTTTACCACCACTAATCGTAATCTCAACTATAATACT [...]
+CCCCAATAATACTAACAATCTCCATAAACATAGTATTAACCCTATTCACCAACATAGCCCTGGCATCACTACTCGTCCTAATTGCATTCTGACTCCCACAACTAAACATTTACTCAGAAAAAGCAGGCCCCTACGAGTGTGGATTCGACCCTCTAGGATCCGCACGCTTACCTTTCTCCATAAAATTTTTCTTAGTAGCCATCACATTTCTGCTGTTCGATCTAGAAATCGCACTACTCCTACCCTTACCATGAGCCTCACAATCAATCAACTTAAATACAATACTCACCATAGCATTACTACTAATTTCCTTACTAGCCATTAGCCTGGCCTATGAATGAACCGAAGAAGGCTTAGAATGAAATGAAATGTCCATAGTATACATCAATATCTTCCTTGCCTTTACTCTATCTTTCATAGGATTACTCATCTACCGATCTCACCTTATATCCTCCCTCCTATGCCTGGAAGGTATAATATTATCCCTCTTTG [...]
+ACAGTAACCATCTTAAGCAATCACTTCACACTAGCTAGCATAGCCCCCATTATTCTTTTAGTATTCGCGGCCTGTGAAGCAGCACTAGGCCTATCCCTGCTGGTCATGGTCTCCAACACTTACGGAACAGACTACGTACAAAATCTGAACTTACTACAATGCATTATTATTCCAACTCTAACACTGATCCCCCTAACATGATTATCAAAACCCAACATAATCTGAATCAACACAACGGCATATAGCATATTAATTAGCCTTATCAGCCTAATATACCTCAATCAACTTACCGACAATAGCCTAAATTTCTCACTTTTATTCTTTACAGACTCTTTATCGGCCCCCCTATTAATACTCACAACATGACTCCTCCCCCTAATACTAATAGCAAGCCAACACCACCTGTCAAAGGAAACCCTCATTCGAAAAAAACTATATATTACAATACTAATTACACTACAACTATTCTTAATAATAACATTCGCCGCCACA [...]
+AATATTTTACATTATATTTGAAGCCACATTGATACCCACACTAATCATTATCACCCGATGGGGCAATCAAGCAGAACGCCTAAACGCAGGCCTGTATTTCTTATTTTATACCCTAACGGGCTCTTTACCCCTATTAATCGCATTACTATGAGCCCAAAACAACTCAGGCACTCTAAACCTGCTAGTGCTACAACACTGAACACAACCATTATCAGACTCCTGATCTAATACCCTACTATGACTGGCATGCATAATAGCATTCATAGTAAAAATACCCCTATACGGCCTCCACCTATGACTTCCAAAAGCCCATGTAGAAGCCCCAATCGCTGGGTCCATGGTTCTCGCCGCCGTCCTCCTAAAACTAGGTGGGTACGGAATAATACGAATCACTATAATACTAAACCCACTAACAAGTTTTATAGCGTACCCCTTCATAATACTATCCTTATGAGGAATAATCATAACCAGCTCCATCTGCCTACGCCAAAC [...]
+AATCCTTAATCGCCTACTCTTCTGTAAGCCATATAGCCCTAGTAATCATGGCCGTCCTTATTCAATCACCATGAAGCTACATAGGAGCAACAGCCCTAATAATTGCCCACGGCCTGACATCTTCCGTATTATTCTGCCTGGCTAATTCCAACTATGAACGCACTCATAGCCGCACTATAATCCTTGCACGAGGATTACAAATACTCCTACCCTTAATAGCCTCATGATGACTACTTGCCAGCCTAACTAACCTAGCCCTACCACCCACAATCAACCTAATAGGAGAACTATTCGTGGTAGTAGCCTCATTCTCATGATCTAATATTACCATTATCCTAATAGGACTCAACATCACCATCACTGCCCTCTACTCCCTATACATGCTAATTACTACCCAACGCGGAAAACACACTCACCACATTAAAAATATCAAACCAACATACACACGAGAAAACTGCCTAATAGCCCTCCATCTCCTACCCCTACTTCTCC [...]
+AACCCTAAAATTATCCTAGGGGCCATCTATT?????ATAAAAGTAATTAATCCATTCTCCCCCTTAATTCTCGTAACACTATTCATACTAACACTACCTGTTATAATGACCAGCACTACCATCTACACCAGTAAACTTTACCCACAATATGTAAAAACCACTATTTCATATGCCTTTATAACCAGCCTAATTCCTACAATAATATTCCTACACTCAGGCCAAGACATAATAGTCTCGAACTGACATTGAATCACAATCCAAACTATAAAACTATCACTCAGCTTCAAACTAGATTATTTCTCAATAATCTTTATACCAGTGGCATTATTCGTCACATGATCAATCATAGAGTTTTCAATATGATACATACACTCAGACCCCTACATCAACCGATTTTTCAAATATCTACTAATATTCCTCATCACCATAATAATTCTGGTTACTGCCAACAATATATTTCAACTATTTATCGGCTGAGAAGGAGTAGGCATT [...]
+CCTACTGATCGGATGATGATATGGACGAACGGACGCAAATACAGCCGCATTACAAGCTATCTTATATAATCGCATCGGAGACGTAGGATTCATCATAACAATAGCCTGATTTCTAACTAACCTAAACACATGAGACCTGCAACAAATCTTCATAACCAACAATGAAAACCTTAATATCCCCCTTATAGGCCTCCTACTAGCAGCCACTGGAAAATCCGCACAATTTGGCCTACACCCCTGACTACCCTCAGCCATAGAAGGACCTACCCCTGTATCAGCCCTACTACATTCAAGCACAATAGTTGTAGCAGGAGTTTTTCTCCTAATCCGATTCCACCCATTAATAGAACATAACAAAACAATACAAACTGCTACACTATGCCTAGGAGCTATCACAACTCTATTCACAGCAATATGTGCCCTCACACAAAATGATATCAAAAAAATTATTGCTTTTTCCACCTCCAGCCAACTCGGACTAATAATCGTAAC [...]
+TTAACCAACCATACCTAGCATTCCTCCATATCTGCACACACGCATTCTTCAAAGCTATACTATTCCTATGCTCAGGATCTATCATCCACAGCCTAAACGACGAACAAGATATTCGAAAAATAGGAGGACTATACAAAGCACTACCATTCACCACCACCTCCCTAACAGTAGGAAGCCTAGCACTCACAGGAATACCCTTTCTCACAGGGTTCTACTCCAAAGACCTAATCATTGAAACCGCCAACACGTCGTATACCAACGCCTGAGCCCTACTAATAACTCTCGTTGCCACATCCCTAACAGCCGCCTACAGCACTCGAATTATATTCTTCGCACTCCTAGGACAACCCCGCTTCAACCCCACCGCCACAATCAACGAGAACAATCCATTCCTAATCAATTCCATCAAACGCTTACTATTCGGGAGCATTTTTGCAGGCTATTTCATTACCTACAACATCACACCCACTACCGTACCCCAGATAACTATGC [...]
+CTAAAAACAACGGCCCTCATCGTCACCATCTTAGGCTTCATCCTGGCACTAGAACTAATCCTCACAATACAGAGCCTGAAATTTAAATATCCCAACAACTTAACAAAATTCTCAAGCATACTAGGATATTATCCCATTATTATTCACCGCTTAATGCCAAAAATAAACCTACTCATAAGCCAAAAATCAGCATCAACACTAATAGACCTAATCTGACTAGAAAAAATCCTACCAAAATCCATCTCCCACTTCCAAATGAAATCCTCAATCACCGTATCCAACCAAAAAGGCCTAATTAAACTGTACTTCATATCCTTTATATTCACCCTAACCTTCACCCTACTTATA??????CTTAATTTCCACGAG
+>Tremarctos_ornatus
+ATGAACGAAAATTTATTTGCCTCTTTTACTACCCCAACGATAATAGGAGTCCCTATTGTAGTCCTAATCATTGTATTCCCAAGTATTCTATTTCCATCCCCTAGTCGACTGATTAATAACCGTTTGATTTCTACCCAACAGTGATTAGTTCAGCTAACATTAAAACAAATACTGTCTATTCACAATTACAAGGGACAAACCTGAGCACTGATATTAATATCACTGGTCTTATTTATCGGCTCAACCAACCTTCTAGGCCTACTGCCACACTCATTTACGCCTACTACACAACTATCAATAAATTTAGGAATGGCTATCCCCTTATGAGCGGGTACAATCGTTATCGGATTCCGATATAAAACCAAAGCATCCCTAGCTCACTTCTTACCTCAAGGAACACCCTTTCCCCTAACTCCAATACTAGTAGTTATCGAAACAATCAGTCTATTCATCCAACCTATGGCCTTAGCTGTGCGTCTAACTGCCAACATC [...]
+TCACTTACTTATTCATCTAATTGGAAAAGCTACTCTAGCTCTAATAAACATCAGCATCGCCACAGCCCTCATCACTTTCTCTATTCTAGTACTACTCACTATTCTTGAACTCGCCGTGGCTCTCATCCAAGCCTATGTCTTTGCTCTACTAGTAAGTCTATACTTACATGACAACACCTAAATGCCACAACTAGACACGTCAACATGGTTTATCACAATTCTATCTATAACTCTAACACTATTTATTGTATTCCAACTAAAAATCCTAGAGTACAATTACCCCAAAACTCCCGAACTAAAACCTTTTCCACCATCAAAAAAAACTATACCTTGAGAAAAGAAATGAACGAAAATTTATTTGCCTCTTTTACTACCCCAACGAATGTTCATAGACCGATGACTATTTTCCACAAACCATAAAGACATTGGTACTCTCTATATTCTATTCGGTGCATGAGCCGGAATAGTAGGTACTGCCCTCAGCCTTCTAAT [...]
+AACTAGGTCAACCCGGAGCCCTGTTAGGGGATGATCAAATCTATAACGTGGTCGTAACTGCCCATGCATTCGTAATAATCTTCTTTATAGTAATGCCTATTATAATCGGAGGTTTTGGAAACTGATTAGTGCCTTTAATAATTGGCGCTCCCGATATAGCATTCCCTCGAATAAACAATATGAGTTTCTGATTACTGCCACCATCCTTCCTACTTCTTCTAGCCTCTTCCATAGTAGAAGCAGGTGCAGGGACTGGTTGAACTGTTTACCCCCCTCTAGCGGGCAATCTAGCCCATGCAGGAGCATCAGTAGACCTAACAATTTTTTCCCTACATTTAGCAGGCGTTTCCTCCATTCTAGGAGCTATTAACTTTATTACCACTATTATCAATATGAAGCCTCCTGCAATATCTCAATACCAAACTCCTCTGTTCGTATGATCCGTCCTAATTACGGCGGTACTTCTTCTCTTATCCTTACCAGTTCTGGCAG [...]
+ACTATGCTGCTGACAGATCGAAACCTCAACACTACTTTCTTTGATCCGGCAGGAGGAGGGGACCCCATTCTGTACCAACACTTGTTCTGATTCTTTGGGCACCCAGAGGTATATATCCTAATTCTTCCTGGATTCGGGATAATCTCACACATCGTCACGTACTATTCAGGGAAAAAAGAACCCTTTGGTTATATAGGGATGGTTTGAGCAATGATATCCATCGGATTCTTAGGTTTCATCGTATGAGCCCATCACATATTCACTGTAGGCATGGATGTTGATACACGAGCCTACTTCACCTCAGCAACCATGATTATTGCAATCCCAACGGGAGTTAAAGTATTTAGCTGACTGGCTACCCTGCATGGAGGAAACATTAAATGATCCCCCGCTATAATATGAGCCTTAGGCTTTATCTTTCTATTTACAGTGGGAGGTCTCACAGGAATTGTCTTGGCCAACTCGTCCCTGGATATTGTTCTTCATGATACA [...]
+AGTAGCCCACTTTCACTATGTACTATCAATAGGAGCCGTCTTTGCCATCATGGGTGGATTTGTCCACTGATTTCCACTATTTTCAGGCTTCACACTCAATGATACATGAGCAAAAATCCACTTTACAATCATGTTTGTTGGGGTTAATATGACGTTCTTTCCCCAACACTTCCTAGGCCTATCAGGAATGCCTCGACGATACTCCGATTACCCAGATGCCTATGCAACATGAAATACAGTATCTTCTATAGGCTCATTCATTTCACTAACAGCGGTTATGCTAATAATTTTCATAATTTGGGAAGCCTTCGCATCGAAACGAGAAGTGGCAACAATTGAACTCACCACAACGAATATCGAATGACTACACGGATGCCCTCCTCCGTATCACACATTCGAGGAACCCACTTACATCACACTAAAAATGGCGTATCCCTTTCAAATAGGCCTTCAAGACGCAACTTCTCCCATTATAGAAGAGCTCCTACACTT [...]
+ATACATTAATGATTGTATTCCTGATTAGCTCCTTAGTTCTCTACATTATTTCAACTATGCTAACTACTAAACTAACGCACACAAACACAATAGATGCACAGGAAGTAGAAACGGTATGAACCATTCTACCAGCCATTATCCTGGTTCTAATTGCACTCCCATCATTACGAATCCTCTATATAATGGATGAAATCAACAATCCTTTACTGACTGTAAAAACTATAGGCCATCAATGATACTGAAGTTACGAATATACGGACTATGAAGATTTGAACTTTGATTCTTACATGATTCCAACACAAGAATTAAAGCCTGGAGAACTACGACTATTAGAAGTAGACAATCGAGCGGTACTACCCATAGAAATGACTATTCGCATGCTAATTTCATCAGAAGATGTCTTGCACTCATGAGCTGTACCATCCCTAGGACTAAAAACTGATGCAATTCCGGGACGACTAAACCAAACGACTCTCATGGCCATGCGACCAG [...]
+TATGGCCAATGCTCGGAAATCTGTGGCTCTAACCACAGCTTCATGCCTATTGTTCTCGAACTAGTCCCACTGTCCTATTTCGAAAAATGATCCGCTTCAATATTAATGGCCCACCAAACACATGCATATCACATAGTCAATCCAAGCCCATGACCACTAACGGGAGCCCTTTCAGCCCTTCTTATAACATCAGGACTAATCATATGATTCCACTTCAACTCAACATCCTTGCTATTACTAGGCCTTACAACTAATATACTTACCATATATCAATGATGACGGGACATTATCCGAGAAAGTACTTTTCAAGGCCACCACACTCCTGTCGTTCAAAAGGGGTTGCGGTATGGGATAGTCCTATTTATTGTATCGGAGGTATTTTTCTTCACAGGATTCTTCTGAGCTTTTTACCACTCAAGCTTAGCACCCACTCCCGAACTAGGAGCATGCTGACCACCCACAGGCATCACCCCCCTAAACCCATTGGAAGTG [...]
+TAATACCTCAGTACTCCTAGCATCTGGAGTATCTATTACTTGAGCCCACCATAGCTTAATGGAAGGAAATCGCAATCATGTACTCCAGGCTCTACTTATCACTATCTCCTTAGGTGTATACTTTACACTCCTACAGGCCTCAGAATATTACGAAGCATCTTTTACCATTTCGGACGGAATCTATGGCTCAACCTTCTTCGTAGCAACTGGGTTCCATGGACTCCACGTAATTATTGGCTCAACCTTCCTCATTATCTGCTTCCTACGACAACTACACTTCCATTTTACATCAAGCCACCACTTTGGCTTCGAAGCAGCAGCATGGTATTGACACTTCGTAGATATCGTATGACTATTCTTATATGTCTCTATCTATTGATGAGGATCCTGCATGACCAACATCCGAAAAACTCACCCACTAGCTAAAATCATCAACAGCTCATTCATTGACCTCCCAACACCATCAAATATCTCAGCGTGATGAAACTTCGG [...]
+TTGGGGTGTGCCTGATCCTACACATCCTAACGGGCCTATTCCTGGCCATACACTATACAGCAGACACGACTACAGCCTTCTCATCAGTCGCCCATATCTGTCGAGACGTTAACTACGGATGAGTTATCCGATACATACACGCGAACGGAGCTTCAATATTCTTTATCTGCTTGTTCATACACGTGGGACGGGGTCTGTATTACGGCTCATACCTATTCTCAGAAACATGAAACATTGGAATTATTCTCCTACTCACAATTATAGCCACAGCATTCATGGGGTACGTGCTGCCCTGAGGCCAAATATCCTTTTGAGGAGCAACCGTCATCACCAATCTGCTATCAGCTATCCCCTACATTGGAACCGACCTAGTAGAATGAATCTGAGGTGGATTCTCAGTAGATAAAGCAACCCTTACCCGATTTTTCGCTTTTCACTTTATCCTTCCATTCATTATTTTAGCACTAGCCATAGTCCACCTATTATTTCTTC [...]
+GGATCCAACAATCCCTCTGGAATCTCATCGAACTCAGACAAAATCCCATTTCACCCTTACTATACAATTAAAGATATTCTAGGCGTCTTACTTCTTCTCCTAGCCCTGGTAACCCTAGTCCTATTCTCACCCGACTTACTAGGAGACCCCGACAACTACACCCCTGCAAACCCAGTGAGCACCCCACTACATATCAAGCCTGAATGGTACTTCTTATTTGCCTACGCCATTCTACGATCTATTCCCAATAAATTGGGAGGAGTACTGGCCCTAATCTTCTCCATTCTAATCCTAGCTATCATTCCTCTGCTGCACACATCCAAACAACGAGGAATGATATTCCGACCTTTAAGCCAATGCCTTTTCTGGCTTCTAGCAGCAGACTTACTAACACTAACATGAATCGGAGGACAACCAGTGGAACATCCTCTTGTTATCATCGGACAGCTAGCCTCTATCCTCTACTTCACAATCCTCCTAGTACTTATACCC [...]
+AATCATTGAAAATAACCTCTCAAAGTGAATGTTTGTAATTAACATTATCTCACTAATCGTACCAATCCTTCTTGCCGTAGCCTTCCTAACACTAGTAGAACGGAAGGTACTAGGCTACATACAACTTCGAAAAGGACCAAACATTGTAGGACCCTACGGCCTCCTACAACCCATCGCAGACGCCGTAAAACTCTTCACCAAGGAGCCCTTACGGCCACTCACATCGTCTGTAACTATATTTATCATAGCCCCTATTCTAGCCCTAACACTAGCCCTGACCATATGAATTCCCCTACCAATACCATACCCCCTCATCAACATAAACCTAGGAGTACTATTCATACTAGCAATATCAAGCCTAGCTGTGTATTCTATTCTCTGGTCTGGATGAGCCTCAAACTCAAAATACGCCCTAATTGGAGCCTTACGAGCCGTAGCCCAAACAATCTCATATGAAGTCACACTAGCCATTATTCTCCTATCGGTCCTACT [...]
+GCTCGTTTACACTTTCCACACTAATCATCACTCAGGAACATCTCTGACTAATCTTCCCCATGTGACCCCTAGCCATAATATGATTTGTCTCTACTTTAGCAGAAACCAATCGAGCTCCCTTCGACCTAACAGAAGGAGAATCAGAGCTAGTCTCAGGATTTAACGTCGAATACGCAGCAGGCCCATTTGCTCTATTTTTCCTGGCAGAATATGCCAACATCATTATAATAAATGCCCTCACAACTATCCTATTCTTTGGAGCATTCCATAACCCCTACATGCCAGAACTATATACCGTCAACTTCACTGCAAAAACACTACTCCTAACAATCTCTTTCCTATGGATTCGCGCATCATACCCCCGATTTCGGTACGATCAACTAATACACCTATTATGAAAAAACTTTCTACCTCTCACATTAGCCTTATGCATATGGTACGTAACTCTACCTATCATTACAGCAAGCATCCCTCCCCAAACAATAAATCCTC [...]
+ACTATTATTATATCCACCATCGCCCTAGGAACCATAATCGTTCTATTTAGCTCCCACTGATTTATAATCTGAATCGGTTTTGAAATAAATATACTGGCAATTATTCCCATTTTAATGAAAAAATTTAACCCACGAGCCGTAGAAGCCTCCACAAAATATTTTCTAACACAGGCCACTGCATCCATGCTCCTCATACTAGGCATTATTATCAACTTACTATACTCAGGACACTGAACAATCTCAACAACTCTCAACCCAATCGTATCAACCGTGATCACCATTGCCCTAGCGATAAAACTTGGCCTATCTCCCTTCCACTTCTGAGTTCCAGAAGTTACACAAGGCATTCCCCTATCCTCAGGAGTAATCCTACTAACATGACAGAAAATCGCACCCTTGTCCGTTCTATACCAGATCTCACCATTCATTAACCCAAACTTATTAATAACAATGGCTATCACATCCGTACTACTAGGAGGCTGAGGAGGACTA [...]
+TCAACTCCGAAAAATCCTAGCATACTCCTCAATCACTCACATAGGCTGGATAGCTGCCATCATAATCTATAATCCTACTCTAATAATTCTTAACCTAACAATCTACATCGTAATAACCCTAGGAACGTTCATATTATTCATGCATAACTCATCCACGACGACACTATCACTATCCCACACATGAAATAAACTCCCACTAATCACCTCGCTAATCCTAGCACTTATACTATCACTAGGAGGCCTCCCTCCCCTCTCAGGCTTTATTCCCAAGTGAATAATCATTCAAGAACTAACAAAAAATGATATAATCATTATACCTGTATTCATAGCCATCACAGCCCTACTAAACCTATATTTCTACATACGCCTAGCATACGCCACAGCACTAACAATATTCCCTTCAGCAAATAACATAAAAATGAAATGACAATTCGAGACCACAAAAAAGATAATCCTCCTACCCCCTCTGATTGTAGCATCAACTATACTCCT [...]
+CTCCAATTCTATCAACCCTGGACATTAACCTAATTCTAGCACTATTTACTAACGCACTACTGTCCTCTTTACTCATTCTTATCGCATTCTGGTTACCACAATTAAACGTCTACGCGGAGAAAGCAAGTCCTTATGAGTGCGGATTTGATCCCGTGGGATCGGCACGCCTCCCCTTTTCCATAAAATTTTTTCTGGTAGCTATCACATTTCTATTATTTGACCTGGAAATCGCACTACTTCTCCCTCTACCCTGAGCGTTGCAAGCCAACAACCTAACAACTGTACTTGCTACAGCACTACTGCTCATCTCTCTACTAGCTGCAAGCCTAGCCTATGAATGAACTGAAAAGGGACTAGAATGGGCTAAAATGTCCATAGTCTACATTAATATCTTCTTGGCTTTTATTGTATCCCTAACAGGACTACTCATCTACCGATCCCACCTAATGTCTTCCCTACTCTGCTTGGAAGGTATAATATTGTCTCTATTTG [...]
+ACAGTAACAATCCTAAACAACCATTTCACACTAGCTAGCATAGCCCCGATCATCCTACTAGTATTCGCTGCCTGCGAAGCAGCACTGGGGCTATCCCTACTAGTAATGGTCTCCAATACCTATGGAACTGACTATGTACAAAACCTTAACCTCCTACAATGCATTATCCTTCCCACTGTAATGCTGGTACCTCTTACGTGAATATCAAAACCCAATATAATCTGAATCAACACGACAACTTACAGTCTACTCACTAGCCTTATTAGCCTAATATACCTTAATCAACTTAGCGATAACAGCCTGAACTTCTCACCACTATTCTTCACCGATTCCCTATCAGCCCCCCTATTAGTTCTCACAACATGGCTACTCCCTCTAATGTTAATGGCCAGTCAATCCCACCTGTCAAAGGAGACTCTGACTCGAAAGAAATTATACATTACCATACTAATTCTCCTACAACTGTTCCTAATCATAACATTTTCCGCCATA [...]
+CCTATTTTATATCCTATTCGAGGCCACCCTAGTACCTACCTTAATCATCATCACCCGATGAGGGAATCAAACAGAACGGTTAAATGCGGGCCTTTACTTTCTATTCTACACCCTAGTAGGATCTTTACCCCTACTAATTGCACTATTACATACCCAAAACAACCTAGGCTCCTTAAACTTTCTCATGATGCAATACTGAATTCAACCCTTACCAAGCTCCTGATCTAGTATCTTCTTATGACTAGCATGCATGATAGCATTCATGGTAAAAATACCCCTATATGGCCTCCATCTATGACTACCAAAGGCACACGTAGAAGCTCCTATCGCAGGATCCATAGTACTTGCCGCCGTACTTCTAAAACTAGGAGGCTACGGTATGATGCGAATCACAATACTGCTCAACCCCTTAACAAACTTTATGGCCTACCCCTTCATGATACTCTCGCTGTGAGGCATGATCATGACAAGTTCCATTTGTCTACGCCAAGC [...]
+AATCCCTAATCGCCTACTCTTCCGTCAGTCATATAGCCCTAGTAATTGTAGCAGTATTAATTCAAACCCCATGGAGCTACATGGGAGCGACGGCTTTGATGATCGCCCATGGACTAACATCCTCTATACTGTTCTGCCTTGCAAACTCCAACTACGAGCGAACCCATAGTCGAATCATAATCCTTGCACGAGGTCTACAAACACTTCTCCCACTTATAGCAGCTTGATGACTTCTAGCAAGCCTCACTAACCTGGCACTTCCTCCTACCATTAACCTCATTGGGGAATTATTCGTAGTAATAGCCTCATTTTCATGATCCAACGCTACTATTATTCTAATAGGAACCAACATCATCATTACTGCCCTCTACTCCCTCTACATGCTAATTACCACACAACGAGGTAAATACACAGACCACGTTAAAAACATCAAGCCATCCTTCACACGAGAAAACGCCCTAATAGCCCTTCACTTACTACCCCTCCTACTGC [...]
+AACCCTAAAATGATTCTAGGACCCATTTATTGTAAAATAAAAGTAATCAATCTATTTACCTCCTCCGTTATTACAACCCTACTCATGCTAACAATACCAATTATCCTAACCAGTACTTCAACATATAAAGATAAATCCTACCCACAGTACGTAAAGACCACAATTTCTTACGCCTTTACAATCAGCACTATCCCCATAATAATATTCATCTTCTCAGGACAAGAAACGGTCATCTCGAACTGACACTGAGTGACAATTCAAACTCTAAAGTTAACTCTCAGCTTTAAGCTAGACTACTTCTCAATGATTTTCATGCCAGTAGCTCTGTTTGTTACATGATCAATCATAGAATTCTCCATATGATATATACATGCCGACCCCAACATTAACCAATTCTTTAAGTATCTCCTTACGTTCCTTATTACCATAATGATCTTAGTGACCGCAAACAACCTATTCCAACTATTTATTGGCTGAGAAGGAGTAGGAATT [...]
+CCTCCTCATTGGGTGGTGATATGGCCGAACAGACGCTAATACGGCCGCCCTACAAGCGATTCTATACAACCGCATCGGGGACGTGGGCTTTATCATGGCTATAGCTTGATTTCTACTCAATACAAATGCGTGAGACTTCCAACAAATCTTTATAATCGAACATAAAAACTTCAACACTCCACTGATAGGTCTACTTTTAGCAGCTACCGGAAAATCGGCCCAATTCGGCCTCCATCCATGACTTCCATCAGCCATAGAAGGACCCACTCCCGTTTCAGCCCTACTCCACTCCAGTACAATGGTAGTGGCAGGGGTATTCCTCCTAATTCGATTCCACCCCCTAATGGAACATAACAAGGCCATCCAAACGGCTACTTTATGCCTGGGAGCAATAACAACCCTATTCACAGCAATCTGTGCCCTCACCCAAAACGATATCAAAAAAATCATTGCCTTCTCCACCTCAAGCCAATTGGGATTAATAGTCGTAAC [...]
+TCAACCAGCCCCATCTAGCATTCCTCCATATCTGTACACACGCATTCTTCAAAGCCATACTGTTCTTATGCTCCGGATCCATCATCCATAACCTAAATAACGAGCAAGATATCCGAAAGATAGGAGGCCTGCTCAAAGTCCTGCCATTCACTTCCACTGCACTGATCATCGGAACCCTAGCTCTTACAGGAATGCCTTTCCTTACGGGGTTCTACTCTAAAGACCTAATTATTGAAACCGCCAACACGTCGTATACCAACGCCTGAGCCCTATTAACAACCCTCGTTGCCACATCCATAACCGCTGCCTATAGTACTCGAATTGTATTCTTTGCACTTTTAGGACAACCCCGCTTTAACCCTACTATCACCATTAACGAAAATAACCCCCTTTTAACCAACCCTATTAAACGCCTACTATTGGGAAGTATCTTCGCAGGATATTTAATCTCCCACAGCATCACACCTATAAATGTCCCACAAACAACCATAC [...]
+CTAAAAATGGCAGCCCTTGCAGTGACCATCTTAGGCTTTATCCTAGCGCTAGAACTCAACCTCACTGCACGAAACCTCAAATTCAACTATCCACTAAGCCCATTCAAATTTTCCAACCAACTGGGATATTTCCCTATTATTATTCATCGCTTTGTGCCAATAATGAGCTTATCAATAAGCCAAAAAGCAGCGTCCACACTGTTAGACGCAACCTGACTGGAAAATGTATTGCCAAAATCCATCTCCTACTTTCAAATAAAATCCTCAATTACAGTCTCCAACCAAAAAGGACTGATCAAACTATACTTTCTCTCCTTTATAATTACACTCCTCCTAAGCTTCCTCGTG??????CTTAATTTCCACGAG
+>Uncia_uncia
+ATGAACGAAAATCTATTCACCTCTTTCACTACCCCAACAATAATAGGACTGCCTATTGTCGTATTAATTATTATGTTCCCCAGCATTCTATTCCCTTCACCTAATCGACTAATTAATAACCGCCTAGTCTCACTCCAGCAGTGATTAGTACAACTAACGTCAAAACAAATATTAGCCATTCACAATCGCAAAGGACAAACTTGGGCCCTAATACTCATGTCCCTCATTCTATTTATTGGATCAACAAACCTGTTAGGCCTACTGCCCCACTCATTTACCCCAACTACCCAACTATCAATAAACTTAGGAATAGCTATTCCCCTATGAGCCGGTGCCGTAATCACCGGATTTCGCCACAAAACTAAAGCATCCCTAGCCCACTTTCTACCACAAGGAACACCAATCCCCCTGATCCCCATACTTGTAATTATTGAAACTATTAGCCTTTTTATCCAGCCCGTGGCTCTGGCCGTACGACTAACAGCTAACATT [...]
+CCACTTATTAATACACTTAATTGGAGGGGCTGCTCTGGCTCTAGCAAATATTAATGCCTCTATTGCTCTAATTACCTTTATTATTCTCATCCTACTAACAATCCTTGAGTTCGCTGTAGCCCTAATCCAAGCCTACGTCTTTACCCTACTTGTAAGTCTATATCTACATGACAATACCTAAATGCCACAGTTAGATACATCAACCTGATTTATTACTATTACTTCCATAATTATAACACTATTTATTATATTTCAACTAAAAATCTCAAAACACCTGTATCCATCAAGCCCGGAGCTCAAATCTACGGCCGCACTAAAACAACCTAGTCCTTGAGAAAAAAAATGAACGAAAATCTATTCACCTCTTTCACTACCCCAACAAATGTTCATAAACCGCTGACTATTTTCAACCAATCACAAAGATATTGGAACTCTTTACCTTCTATTTGGCGCCTGAGCTGGTATGGTGGGGACTGCTCTCAGTCTCTTAAT [...]
+AGCTGGGTCAACCTGGCACACTGCTAGGGGATGACCAGATTTATAATGTAGTCGTCACCGCCCATGCTTTTGTAATAATCTTCTTTATAGTGATGCCTATTATAATTGGAGGGTTTGGAAACTGATTAGTCCCATTAATAATCGGGGCCCCCGATATAGCATTCCCTCGAATGAATAATATGAGTTTCTGACTCCTCCCCCCGTCTTTCCTGCTTTTGCTCGCATCATCTATGGTAGAGGCTGGGGCGGGGACTGGGTGGACAGTATACCCGCCTCTAGCCGGCAACCTAGCTCATGCAGGAGCATCCGTAGACCTAACTATTTTCTCACTACACTTGGCAGGTGTCTCCTCAATCTTAGGCGCTATTAATTTTATTACTACTATTATTAATATAAAACCCCCTGCTATATCCCAGTATCAAACACCTCTATTTGTCTGATCGGTCTTAATCACTGCTGTATTACTACTCCTATCGCTGCCAGTTTTAGCAG [...]
+ACTATGCTACTGACAGATCGAAATCTGAACACCACATTTTTTGACCCCGCTGGAGGAGGGGATCCTATCTTATATCAACACTTATTCTGATTTTTCGGTCACCCAGAAGTCTACATTTTAATTTTACCCGGGTTTGGAATGATTTCACATATTGTCACCTATTACTCAGGTAAAAAAGAACCTTTTGGCTACATGGGAATAGTTTGAGCTATAATATCAATTGGCTTTCTGGGCTTTATCGTATGGGCCCATCACATGTTTACTGTGGGGATAGATGTGGACACACGAGCATACTTTACATCAGCTACTATAATTATTGCTATTCCCACAGGGGTAAAAGTATTTAGTTGACTGGCTACTCTTCATGGAGGTAATATTAAATGGTCTCCCGCTATGCTATGGGCCCTAGGATTTATTTTCTTATTCACTGTGGGGGGCCTAACAGGAATCGTACTAGCAAATTCCTCATTAGACATTGTCCTTCACGACACA [...]
+AGTAGCTCACTTCCACTATGTATTGTCAATAGGAGCAGTATTTGCTATCATAGGGGGTTTTGTTCATTGATTCCCCCTATTCTCAGGATATACTCTCGATAATACTTGGGCAAAAATTCATTTCACTATTATATTCGTAGGTGTCAATATAACGTTTTTCCCTCAGCATTTTCTAGGCTTGTCCGGAATGCCTCGACGTTATTCTGACTATCCAGATGCATATACAACTTGAAATACAGTCTCCTCAATAGGCTCTTTTATCTCACTAACAGCAGTAATATTAATGGTTTTCATAGTGTGAGAAGCTTTTGCATCAAAGCGAGAAGTGGCCACAGTGGAACTAACCACAACCAATCTTGAATGGCTGCATGCATGTCCCCCTCCGTATCACACATTTGAAGAACCAACCTATGTACTGTTAAAAATGGCATATCCTTTCCAACTAGGTTTCCAAGATGCTACATCCCCTATCATAGAAGAGCTTCTACACTT [...]
+ACACACTGATAATTGTATTCCTAATTAGCTCCCTAGTCCTTTACATCATCTCACTAATACTGACAACCAAACTCACGCACACAAGTACAATAGATGCCCAGGAAGTAGAAACCATCTGAACTATTTTACCAGCCATCATCTTAATTCTCATTGCCCTGCCCTCCTTACGAATTCTCTACATAATAGACGAGATTAATAACCCCTCTCTCACTGTAAAGACCATGGGACATCAATGATACTGAAGCTATGAATATACTGACTATGAGGACCTGAACTTTGACTCCTATATAATCCCTACTCAAGAACTAAAGCCCGGAGAACTCCGATTATTAGAAGTTGATAACCGAGTAGTGTTACCAATAGAAATGACTATTCGCATGTTAATCTCATCAGAAGACGTACTACACTCATGAGCCGTCCCATCCCTGGGCCTAAAAACTGACGCCATTCCAGGCCGACTAAACCAAACAACCCTAATAGGTACACGACCTG [...]
+TATGGTCAATGCTCAGAGATCTGTGGCTCAAACCACAGTTTTATACCCATTGTTCTTGAACTAGTCCCACTATCATACTTTGAAGAATGATCTACGTCTATACTGATGACCCATCAAACCCACGCATACCATATAGTTAACCCCAGCCCATGGCCACTTACGGGGGCACTTTCAGCTCTATTAATAACTTCAGGCCTGGCTATATGATTTCACCACAACTCAATATTACTACTAACTCTAGGTATAACCACCAATCTGCTCACTATGTATCAATGATGACGAGATATTATTCGGGAAAGCACATTCCAAGGTCACCACACACCCACCGTTCAAAAAGGTCTCCGTTACGGGATAATTCTCTTTATCATCTCAGAAGTATTCTTCTTCGCAGGATTTTTCTGGGCCTTCTACCACTCAAGCCTAGCCCCAACTCCCGAACTAGGAGGATGCTGGCCACCTACAGGTATCACCCTGCTCAACCCCCTAGAAGTC [...]
+CAACACTTCCGTACTATTAGCTTCCGGAGTAGCAACCACCTGAGCTCACCACAGCCTAATAAAAGGTAACCGAAAACATATGCTTCAAGCCCTATTCACCACAATCTCTTTAGGGATATACTTGACACTACTTCAAGCCTCAGAATACTGTGAAGCATCATTCACAATCTCAGACGGGGTCTATGGATCCACTTTCTTTATGGCCACAGGATTTCATGGACTCCATGTGATTATTGGCTCTATTTTCCTCATCGTCTGCTTCCTACACCAATTAAAATATCATTTCATATCCAACTACCATTTTGGATATGAAGCTGCTGCCTGATACTGACATTTCGTAGGTGTAGTGTGACTATTCTTGTAAGTTTCTATTTATTGATGAGGACACCATATGACCAACATTCGAAAATCACACCCCCTTATCAAAATTATCAATCACTCATTCATTGATCTTCCCACTCCATCCAACATCTCAGCATGATGAAACTTTGG [...]
+TAGGAGTATGTTTAATCCTACAAATTCTCACCGGCCTCTTTCTAGCCATACACTATACATCAGACACAATAACCGCTTTCTCGTCAGTCACCCACATCTGCCGCGACGTAAATTATGGCTGAATTATCCGATACCTACACGCCAACGGAGCCTCCATATTCTTTATCTGCCTATACATACACGTAGGACGAGGAATGTACTACGGCTCCTACACCTTCTCAGAAACATGAAACATTGGAGCCGTACTATTGCTCGCAGTCATGGCTACAGCCTTCATGGGATATGTCTTACCCTGAGGCCAAATATCCTTCTGAGGAGCAACCGTGATCACCAATCTCCTATCATCAATCCCATACATTGGGAGCAACCTAGTAGAATGGATCTGAGGGGGCTTCTCAGTAGATAAAGCCTCCTTGACACGATTCTTTGCCTTCCACTTTATCCTTCCATTCATCATCTCAGCCCTAGCAGAAATCCACCTCCTATTCCTTC [...]
+GGATCTAACAACCCCTCAGGAATGGTATCTGACTCAGACAAAATCCCATTCCACCCGCACTACACAGTCAAAGACATCCTAGGCCTTTTAACACTAACCCTAACGCTCATGCTACTTGTCCTATTCTCACCAGACCTATTAGGAGACCCTGATAACTACATCCCCGCCAATCCTCTAAACACCCCTCCTCATATCAAGCCTGAGTGGTACTTCCTATTCGCATACGCAATCCTTCGATCTATCCCCAATAAACTAGGGGGAGTCCTAGCCCTAGTCCTATCCATCTTAATCCTAACAATTATCCCCGCCCTCCACACTTCCAAACAACGGGGGATAATGTTTCGACCACTAAGCCAGTGCTTATTCTGATTCCTAGTAGCAGACCTTCTGACCCTGACATGAATTGGCGGCCAGCCCGTAGAATATCCTTTCATCACCATCGGGCAACTAGCCTCCATCCTATATTTCTCTATTCTCCTAGTCCTAATACCC [...]
+CATTATTGAAAACCGCCTCCTTAAATGAATGTTCATAATCAATATCCTCTCACTAATTATCCCCATTCTCCTCGCCGTAGCCTTCCTAACCCTAGTTGAACGCAAAGTACTAGGCTACATGCAACTTCGCAAGGGGCCGAACATCGTAGGACCATATGGCCTGCTCCAACCCATTGCAGACGCCATGAAACTCTTCACTAAAGAGCCCCTCCGACCCCTCACATCATCCACATTCATATTTATTATAGCACCTATCCTAGCCCTTACACTAGCCCTAACCATATGAATCCCATTGCCCATACCATACCCACTCATCAATATAAACCTGGGAGTACTATTCATACTAGCCATATCCAGCCTAGCTGTCTACTCCATTCTATGATCCGGGTGGGCTTCAAACTCAAAGTACGCTCTAATCGGCGCCCTACGAGCCGTAGCCCAAACAATCTCATATGAAGTCACACTAGCTATTATCCTCTTATCTGTACTACT [...]
+GATCCTTCACATTAGCCACACTAATTACCACTCAAGAATATATCTGACTTATTATCCCCGCATGACCCCTAGCTATAATATGATTCATCTCTACTCTAGCAGAAACCAACCGAGCCCCATTTGACCTCACAGAAGGAGAATCAGAGCTTGTTTCCGGATTTAACGTAGAATATGCAGCAGGCCCTTTCGCCCTGTTCTTTCTAGCAGAATACGCCAACATTATCATAATAAACATCCTCACAACAATCCTATTCTTCGGAGCATTTCATAGTCCCTACATACCAGAACTATACACCACCAACTTCACTGTAAAAACCCTAATCCTAACAACCACCTTCCTATGGATCCGAGCATCCTATCCACGATTCCGATACGACCAATTAATACACCTCCTATGAAAAAGCTTTCTACCCCTTACCCTAGCCCTATGTATATGACACGTCTCCCTGCCCATCATCACAGCAAGTATTCCACCTCAAACAATCAAACCCC [...]
+ATTATCATTATATTAACCGTTATCTCAGGAACTATGATCGTAATAACAACTTCCCACTGACTCATGGTCTGAATCGGCTTCGAAATAAACCTACTAGCCATTATTCCTATCCTCATAAAAAAATACAACCCACGAGCCATAGAAGCAGCCACAAAATACTTCCTAACACAAGCAACTGCTTCCATGCTCCTAATAATAGGAATCATCATCAACTTACTGCACTCAGGACAATGAACTGTCTCAAAAGACCTGAACCCCATAGCATCCATTATAATAACAACCGCCCTAGCAATAAAACTAGGATTAGCCCCATTCCACTTCTGACTGCCCGAAGTCACACAAGGAATCTCCATGTCCTCGGGCCTAATCCTACTCACATGACAAAAAATCGCCCCACTATCAATTCTATACCAAATCTCACCTACCATTAATCCTAACCTACTCCTAACAATAGCCATCATATCAGTTATAATCGGAGGCTGAGGGGGACTC [...]
+CCAACTACGAAAAATCATAGCATATTCCTCAATCGCCCATATAGGCTGAATAGCAGCTATCATAATATACAGCCCCACAATAATAATTTTAAACCTGATCATCTACATCACCATAACACTAACCACCTTTATACTATTCATATATAACTCAACCACAACAACATCATCCCTATCACAGACATGAAATAAAACTCCCCTAATCACCTCATTTATCCTAGTACTAATAATATCTCTAAGCGGCCTTCCTCCACTCTCCGGCTTCATCCCAAAATGAATAATCATCCAAGAACTAACTAAAAATGAAATAATTATAATACCCACACTACTAGCTATAACAGCGCTACTTAACCTATACTTCTACATACGACTAACATATACCACTGCACTAACTATATTCCCCTCAAATAACTGCATAAAAATGAAATGACGATTCGAACGCACAAAAAAAACAATCCTTTTACCCCCCTTAATCGTAATATCTACCATACTACT [...]
+CACCAATACTATCTGTCCTAGATATACATGTAATACTAACTCTGCTTACCAACACACTTCTATCCACACTACCTGTATTAATCGCATTCTGATTACCCCAATTAAACACCTATGCAGAAAAAGCAAGCCCTTATGAGTGTGGATTTGACCCCATAGGATCCGCCCGCCTACCCTTCTCTATAAAATTTTTCCTAGTAGCTATTACATTCCTACTATTCGATCTAGAAATTGCACTACTACTCCCCCTTCCCTGGGCCTCACAAACAAACAAATTATCAACCATACTTATCATAGCCCTCCTACTAATCTCTCTACTAGCCGCGAGCCTAGCCTACGAATGAACCCAAAAAGGACTAGAGTGAACTGAAATGTCCATAGTCTATATTAATATATTCCTGGCTTTCATCATATCACTTATAGGACTATTGATGTACCGATCCCACTTAATATCCTCTCTCCTATGTCTGGAAGGCATAATGCTATCCCTATTTA [...]
+ACCGTAGCAATCCTAAATAACCATTTCACACTAGCTAGCATGACTCCTATCATCCTGCTAGTATTTGCAGCCTGCGAGGCGGCACTGGGCTTATCCTTACTAGTAATGGTATCAAACACATATGGTACTGATTATGTACAAAACCTAAACCTCCTGCAATGCATTATTATCCCTACTGCCATACTCATACCGATAACATGACTATCAAAACCCAACATAATCTGAATTAACTCAACTACCTACAGCCTCCTGATCAGCCTTATTAGCCTTTCCTATTTAAATCAACTAGGCGACAACAGCCTAAATCTCTCATTACTATTCTTCTCAGACTCACTTTCTGCACCTCTACTAGTATTAACAACATGACTCCTGCCACTAATACTTGTGGCTAGTCAGTCACACCTATCAAAAGAGACCTTGGCCCGAAAAAAACTATACATCACGATACTTATTACTTTACAACTTCTCCTAATTATAACATTCACCGCCACA [...]
+TATATTTTATATCCTATTTGAAGCCACATTAATCCCCACCCTTATTATTATTACCCGATGGGGCAATCAAACGGAGCGACTAAACGCTGGCCTATACTTTCTACTCTACACCTTGGTAGGCTCACTGCCCCTCCTAGTCGCACTGCTATACATTCAAAACACAACGGGAACTTTAAATTTCCTAATCATTCAATACTGAACCAAACCAATCTCAACCACCTGGTCTAACATCTTTCTCTGACTAGCATGCATAATAGCATTTGTAGTAAAAATACCTCTATATGGACTCCACCTGTGATTACCAAAAGCACATGTCGAAGCCCCCATTGCCGGCTCAATAGTACTTGCTGCCGTACTGTTAAAACTAGGGGGATATGGAATGATACGTATTACAATTCTACTCAACCCCACAACAAACCAAATAGCATATCCTTTCATGATGCTGTCCCTATGGGGAATAGTTATAACAAGTTCTATCTGTTTACGTCAGAC [...]
+AATCCGTAATCGCATATTCATCCGTAAGCCATATAGCCCTAGTAATTGTAGCTGTGCTAATCCAAACACCCTGAAGTTATATAGGAGCTACAGCCCTTATAATCGCCCGCGGACTAACCTCCTCAATATTATTTTGCCTCGCAAACTCAAACGACGAACGAGTCCATAGCCGAACAATAATTCTAGCACGAGTCCTACAAGCCATCCTCCCTCTGATAGCTGCCTGATGGCTACTAGCCAGTCTCGCGAACCTAGCCCTGCCTCCTACCATTAACCTAATCGGAGAGCTATTTGTAGTAATAGCTTCCTTCTCATGATCCAACATAACTATCGTCCTCATGGGTACAAATATTATCATCACAGCCCTATATACCCTCTATATGCTCACTACAACCCAACGAGGTAAATATACACACCACATTAAAAACATCAATCCATCATTCACACGAGAAAACACCCTAATAGCCCTTCACCTGCTCCCACTCCTTCTCT [...]
+AACCCCAAAATCGCACTAGGTCCTATTTATTGTAAAATAAAAGTAATAAACCTATTTACCTTCTCTATACTCACCACAGTATCCATTCTATTCCTGCCCATCATCATATCCAATACTCAACTATACAAAAATAACCTATACCCCCATTATGTAAAAACCACAATCTCTTATGCCTTCACCATCAGCACAATTCCGGCTATAATATTTATTTCCTCCGGACAAGAAACAATTGTCTCAAACTGACACTGACTATCAGTCCAAACCCTCAAATTGTCACTAAGCTTTAAACTAGATTATTTCTCGATCATCTTCATCCCTGTGGCACTTTTCGTTACATGATCAATCATAGAATTCTCAATATGATATATACACACAGATCCTCATATCAATCGATTCTTCAAATATCTCCTCATATTTCTAATCACTATAATAATCCTAGTGACCGCCAATAACCTGTTCCAACTATTTATCGGTTGAGAGGGAGTAGGAATT [...]
+CCTGCTCATCGGATGATGATATGGTCGAGCAGACGCAAACACTGCCGCCCTACAAGCGATTCTCTACAACCGCATCGGAGACGTAGGATTTATCACGGCCATAGCATGATTCCTTGCCAACATAAATGCATGAGACTTTCAACAGATCTTTATTACCCAGCATGAAAACCTAAATGTCCCATTGCTAAGTCTTCTCCTAGCAGCGACAGGCAAGTCTGCTCAATTTGGCCTACACCCATGACTACCATCAGCCATAGAGGGTCCAACCCCCGTTTCCGCCCTACTCCACTCAAGTACAATGGTTGTAGCCGGAGTCTTTTTACTAATCCGCTTCCACCCACTCATAGAACAAAATAAAACCATACAAACTCTCACCCTATGCCTAGGGGCCATCACAACCTTATTCACAGCTATCTGCGCCCTCACACAAAATGACATCAAAAAAATCGTTGCCTTCTCAACTTCAAGCCAATTAGGTCTAATAATCGTTAC [...]
+TCAACCAACCCTACCTTGCATTCCTTCACATCTGTACGCACGCATTTTTCAAAGCTATATTATTTATGTGCTCTGGATCAATTATTCACAGCCTAAATGATGAACAAGACATTCGAAAGATAGGCGGATTATATAAACCCATACCTTTCACCACCTCCTCCCTCATCATCGGAAGTCTCGCATTAACAGGAATACCTTTCCTAACAGGCTTTTACTCTAAAGACCTGATTATCGAGACAGCCAATACGTCGTATACCAACGCCTGAGCCCTATCGGTCACTCTCATCGCTACATCTCTCACGGCTGCCTATAGTACTCGAATCATATTCTTTGCACTCCTAGGACAGCCCCGATTTAACTCCCTAAGTCCAATCAATGAAAATAACCCCCACCTAATCAACTCCATTAAACGTCTCTTAATTGGAAGCATTTTTGCAGGGTACTTGATTTCCCACAACATTCCCCCAATAACCACCCCACAAATAACCATAC [...]
+CTAAAACTAACTGCTCTCGCCGTAACCATCACAGGCTTCATCTTAGCATTAGAACTTAACCTTGCAACTAAAAACTTAAAATTCAAATACCCCTCGAACCTCTTTAAGTTTTCTAGCTTCCTAGGGTACTTTCCAATTGTAATACACCGCCTCCCATCAACAATAGGCCTAACTATAAGCCAAAAGTCCGCATCGATACTATTAGATATAATCTGACTAGAAAATGTATTACCAAAATCCATCTCCCACTTCCAAATAAAAATATCAACCATCGTATCTAATCAGAAAGGGCTAGTTAAGCTCTACTTCTTATCCTTCATAATCACCTTGACCCTTAGCCTGCTCTTA??????CTTAATTTCCACGAG
+>Ursus_americanus
+ATGAACGAAAGTTTGTTCACCTCTTTTATTACCCCAACAATAATGGGAATTCCTATTGTAGTATTAATCATTATGTTTCCGAGCATTCTATTTCCTTCTCCTAGTCGACTAGTCAATAACCGCTTAGTATCTATTCAACAGTGACTAGTCCGACTAACATCAAAACAAATACTTTCCATTCATAATCATAAAGGACAAACCTGAGCACTAATGTTGATGTCACTAATCCTATTTATTGGCTCGACCAATCTTCTGGGTCTGTTGCCACACTCATTCACACCCACCACACAACTGTCAATGAATCTGGGAATAGCTATTCCCTTGTGGACAGGCACAGTTGCTATCGGACTTCGATACAAGACCAAGGCATCCTTGGCTCACTTTCTACCTCAAGGAACACCTTTTCCCCTAATCCCTATACTTGTAATTATCGAAACGATCAGCCTATTCATCCAACCTATAGCCTTAGCCGTTCGACTAACCGCTAACATT [...]
+TCACCTGCTCATCCATTTGATTGGGGGAGCTACTCTGGCCCTAACAAGTATTAGCACCATTACAGCCCTTATCACCTTTACCATTCTAGTGCTACTCACTATTCTTGAGTTCGCTGTAGCCCTCATTCAGGCCTACGTCTTCACTCTACTAGTAAGCCTATACTTACACGATAACACCTAAATGCCACAACTAGACACATCAGCATGATCTATCACAATCCTATCTATAGTTCTAGCACTATTTATTATATTCCAATTAAAAGTCTCAAAATATAAATACCCTGAAATCCCCGAGCCAAAGCCTCTCTCATCACCAAAGAAACCTATACCTTGAGAAGAAAAATGAACGAAAGTTTGTTCACCTCTTTTATTACCCCAACAAATGTTCATAAATCGATGACTGTTCTCTACAAATCATAAAGATATTGGCACTCTTTACCTTCTGTTCGGTGCATGAGCCGGAATAGTAGGTACTGCTCTCAGCCTTTTAAT [...]
+AGCTAGGTCAGCCCGGGGCTCTGTTGGGGGATGATCAAATCTACAATGTAATCGTAACTGCCCATGCATTCGTAATAATCTTCTTTATGGTCATGCCTATTATAATTGGGGGATTTGGGAACTGATTAGTACCCTTAATAATTGGTGCCCCCGACATAGCATTTCCTCGAATAAATAATATAAGTTTCTGACTGCTGCCACCATCTTTCTTATTGCTCCTAGCCTCTTCTATAGTAGAAGCAGGGGCAGGGACTGGATGAACTGTCTACCCCCCTCTAGCGGGTAATCTGGCCCATGCAGGGGCATCAGTAGACTTAACAATCTTTTCTCTACACTTAGCAGGTATCTCTTCTATTCTAGGAGCTATCAATTTCATCACTACTATTATCAACATGAAGCCCCCTGCAATGTCTCAATATCAAACCCCCCTGTTTGTATGATCAGTCCTAATTACGGCAGTGCTTCTTCTTTTATCTCTGCCAGTCTTAGCAG [...]
+ACCATACTACTTACAGATCGAAACCTTAATACCACCTTTTTTGACCCAGCCGGAGGAGGAGACCCTATTCTATATCAACACTTGTTTTGATTCTTCGGACACCCTGAAGTTTATATCCTAATTCTTCCAGGGTTCGGAATGATCTCTCACATTGTCACTTATTACTCAGGAAAAAAAGAGCCTTTCGGCTATATAGGAATAGTCTGAGCGATAATGTCTATTGGATTCTTAGGATTTATCGTGTGAGCTCACCATATGTTTACCGTAGGTATAGATGTCGACACACGAGCTTACTTCACTTCAGCCACCATAATTATTGCAATCCCAACAGGGGTTAAAGTATTTAGCTGATTAGCCACCCTACACGGAGGGAATATTAAATGATCTCCCGCTATAATATGAGCCCTAGGCTTTATTTTCCTGTTTACAGTGGGGGGCCTTACAGGAATTGTCCTAGCTAACTCATCTCTAGATATTGTTCTTCATGATACA [...]
+GGTAGCTCATTTCCACTATGTGTTATCAATGGGGGCTGTCTTTGCCATTATGGGGGGATTTGTGCATTGATTCCCACTGTTTTCAGGCTATACGCTTAATAATACATGAGCAAAAATTCACTTCATAATCATGTTCGTAGGGGTTAATATGACATTCTTTCCCCAGCATTTTCTAGGCCTGTCAGGAATACCTCGGCGATACTCCGACTATCCGGATGCCTATACAACATGAAATACAGTATCTTCTATAGGCTCATTCATTTCACTAACAGCAGTTATACTAATAATTTTTATGATTTGGGAGGCCTTTGCATCAAAACGAGAGGTGGCAGTGGTAGAACTCACTTCAACCAACATTGAGTGGCTACATGGATGTCCTCCTCCATATCACACATTTGAAGAACCCACTTACGTTACACTAAAAATGGCACACCCCTTTCAAATAGGTCTTCAAGATGCAACTTCTCCTATCATAGAAGAACTCCTACATTT [...]
+ATACATTAATAATTGTATTCCTAATTAGCTCCTTAGTTCTCTATATTATTTCAACTATATTAACTACCAAATTAACACACACAAACACAATGGATGCACAAGAAGTAGAGACGGTGTGAACCATCCTGCCAGCTATAATCCTAATTCTAATCGCACTCCCATCGCTACGGATTCTCTATATAATGGATGAAATCAATAACCCCTCACTGACCGTAAAAACCATGGGCCATCAATGATATTGAAGTTACGAGTACACAGATTATGAAGATCTAAATTTTGACTCCTACATGACTCCAACACAAGAACTAAAGCCTGGAGAACTGCGGTTATTAGAAGTGGACAATCGAGTAGTACTGCCCATAGAAATAACGATCCGTATGCTAATCTCATCAGAAGATGTCTTGCACTCATGAGCTGTACCATCCCTAGGGTTAAAAACCGATGCAATCCCAGGACGACTAAATCAAACAACTCTCATAGCCATGCGACCGG [...]
+TATGGCCAATGCTCAGAAATTTGTGGCTCCAACCACAGCTTTATGCCTATTGTCCTCGAGCTAGTCCCACTATCCTACTTTGAAAAATGGTCTGCCTCAATACTAATGACTCACCAAACGCATGCATATCACATAGTCAATCCAAGTCCATGGCCACTAACAGGAGCCCTCTCAGCCCTTCTTATGACATCAGGATTAATTATATGATTCCACTTTAGCTCTGTATTCTTGTTATTGCTAGGTCTTACAACCAACATACTCACTATATACCAATGATGGCGAGATATTATCCGAGAGAGTACCTTTCAGGGCCACCACACCCCTGTTGTCCAAAAAGGATTGCGATATGGAATAGTCCTATTTATCGTGTCAGAAGTATTCTTCTTCGCAGGATTTTTCTGAGCCTTTTACCACTCAAGCCTAGCACCAACTCCAGAACTGGGAGCATGCTGACCACCTACAGGTATTACTCCCCTAAATCCACTAGAAGTG [...]
+CAATACTTCAGTACTTCTTGCATCCGGAGTGTCCATTACCTGGGCACACCACAGCTTAATGGAGGGAAACCGCAAGCACATGCTTCAAGCCCTATTTATTACTATCTCCCTAGGCGTGTACTTTACACTTCTACAAGCCTCAGAATATTATGAGGCATCTTTTACTATCTCAGACGGGGTCTACGGCTCAACTTTTTTTATAGCGACTGGATTTCACGGACTTCACGTAATCATCGGTTCAACTTTTCTCACAGTTTGCTTCCTACGACAACTACATTTTCATTTCACATCAAGTCACCACTTCGGCTTCGAAGCAGCAGCATGATACTGACATTTCGTAGATGTCGTATGACTATTCCTATATGTTTCCATCTATTGATGAGGATCTTGCATGACCAACATCCGAAAAACCCACCCATTAGCTAAAATCATCAACAACTCACTTATTGATCTCCCAACACCATCAAATATCTCAGCATGATGAAACTTCGG [...]
+TCGGAGTATGTTTAGTACTACAAATTCTAACGGGCCTATTTCTAGCCATACACTACACATCAGATACAACTACAGCCTTTTCATCAATCACCCATATTTGCCGAGATGTTCACTACGGATGAATTATCCGATACATACATGCTAACGGAGCTTCCATGTTCTTTATCTGCCTGTTCATGCACGTAGGACGGGGTCTGTACTATGGCTCATACCTACTCTCAGAAACATGAAACATTGGCATTATCCTCCTATTTACAGTTATAGCCACCGCATTCATAGGATATGTCCTGCCCTGAGGCCAAATATCCTTCTGAGGAGCAACTGTTATCACCAACCTCCTATCAGCCATCCCCTATATTGGAACAGACCTAGTAGAATGGATCTGAGGGGGCTTTTCTGTGAATAAGGCAACTCTGACACGATTCTTTGCCTTCCACTTTATTCTTCCATTCATCATCTTGACACTAGCAGCAGTCCACCTATTATTCCTAC [...]
+GGATCTAATAACCCCTCTGGAATCCCATCTGACTCAGACAAAATCCCATTTCATCCATATTATACAATTAAAGACGCCCTAGGCGCCCTACTTTTCATCCTAGCCCTAGCAACTCTAGTCCTATTCTCGCCTGACCTACTAGGAGATCCCGATAACTACACCCCCGCAAACCCACTGAGCACCCCACCCCACATCAAACCTGAATGATATTTTCTATTTGCCTACGCTATTCTACGGTCCATCCCCAACAAACTAGGAGGAGTACTAGCACTAATTTTCTCTATCCTAATCCTAGCTATTATCCCCCTTCTACACACATCCAAGCAACGAGGAATAATGTTCCGACCCCTAAGCCAATGCCTATTCTGACTTCTAGTAGCAGACCTACTAACACTAACATGAATCGGAGGGCAACCAGTAGAACACCCCTTTATCATTATCGGCCAGTTGGCCTCTATCCTCTACTTCACAATCCTCCTAGTGCTCATGCCT [...]
+GATCATTGAAAATAACCTCTCAAAATGAATGTTTATAATTAACACTATCTCACTAGTTGTACCCATTCTCCTCGCCGTAGCTTTCTTAACACTAGTAGAGCGAAAAGTACTAGGCTATATACAACTTCGTAAAGGACCAAACATTGTAGGACCCTATGGCCTCCTGCAACCTATCGCAGATGCTATAAAACTTTTCACCAAAGAACCCCTACGCCCACTCACATCGTCTGTGACCATGTTTATTATAGCCCCTATTCTAGCCCTAACACTAGCCCTAACCATGTGAATTCCCCTGCCAATGCCATACCCCCTTGTCAACATAAACCTCGGAGTGCTGTTTATACTAGCAATATCAAGTCTAGCTGTATACTCTATCCTTTGATCAGGATGAGCTTCAAACTCAAAATATGCTCTGATTGGAGCCCTACGAGCTGTAGCCCAGACAATTTCATACGAAGTCACATTAACCATTATCCTCCTATCAGTCCTACT [...]
+GCTCATTCACACTCTCTACCTTAATTACTACTCAAGAGCACCTCTGACTAATTTTCCCTACATGACCCCTAGCCATGATATGATTTATTTCCACTCTAGCAGAAACTAACCGAGCCCCTTTCGACCTAGCAGAAGGAGAATCAGAGCTAGTCTCAGGTTTTAACGTCGAATATGCAGCAGGCCCATTCGCCCTATTTTTCCTAGCAGAATATACTAATATTATTATAATAAATGCCCTCACGACTGTCCTATTCTTCGGAGCATTTCATAGCCCCTATATACCAGAACTATACACCGTCAACTTTACCGTAAAAACACTACTCCTAACAGCCTCTTTCCTATGAATCCGTGCATCATATCCCCGATTCCGATATGACCAATTAATACACCTACTATGAAAAAGCTTCCTACCCCTAACACTAGCCCTGTGCATGTGACATGTAACACTACCTATTATCACAGCGAGCATTCCTCCCCAGATAATAAAACCTC [...]
+ATCATTATCACATCCACTATTGTCCTAGGAACCATAATCGTTTTATTTAGCTCCCATTGACTCATAATCTGAATTGGCTTTGAAATAAACATACTAGCTATTATCCCAGTCCTAATGAAAAAATTTAATCCACGAGCCATAGAAGCCTCTACAAAATATTTCCTCACACAAGCCACTGCATCCATGCTTCTAATACTAGGCATTATTATCAACCTACTATACTCAGGACACTGAACAGTCTCAATAATCCCCAACCCAGTCGCATCAACCGTAATCACCATTGCCCTAGCAATGAAACTCGGTCTATCCCCCTTTCATTTCTGAGTCCCAGAAGTCACACAAGGCGTCTCTTTATCCTCAGGAATGATCCTACTAACATGACAAAAAATCGCACCTCTATCCGTCCTATATCAAATCTCACCATCCATCAACCCAAACCTACTGGTAACAATAGCTGCTACATCCGTATTAGTAGGAGGCTGAGGAGGACTA [...]
+TCAACTTCGAAAAATCCTAGCATACTCTTCAATCGCCCACATGGGTTGAATGGCTGCCATTATAGTATATAACCCCACCCTAATAATCCTTAACCTTGCAATTTATATCATAATAACTCTAGGGACATTTATACTATTCATGTACAACCTATCTACAACAACCCTGTCACTGTCCCATACATGAAATAAATCACCACTAATTGCCTCACTAATCCTAGCACTTATACTATCACTAGGCGGCCTCCCTCCCCTCTCAGGCTTTATTCCCAAATGAATAATTATTCAGGAGCTAACAAAAAATGATATAATTATTATACCCATATTCATAGCCATCACAGCCCTACTAAACCTTTACTTCTACATGCGTCTAACATATGCCACGGCGCTAACAATGTTTCCCTCAGCAAATAATATAAAAATAAAATGACAGTTTGAAAGCACAAAAAAAATAATTCTCTTACCCCCTCTAATCGTAGCATCGACCATACTCCT [...]
+CTCCAATACTATCAATCATGGACATCAACTTAATCTTAGCACTGTTCACTAACATAATACTAGCCTCCTTGCTCGTTCTTATCGCCTTTTGACTGCCGCAATTAAATATTTACGCAGAGAAAGTGAGCCCCTATGAATGCGGGTTTGACCCCCTAGGATCGGCACGCCTCCCTTTTTCTATAAAATTTTTCCTAGTAGCTATTACATTCCTACTATTTGACCTAGAAATTGCACTACTCCTCCCCCTTCCCTGAGCATCACAAACTGACAACCTAACAACGATACTCACCATAGCACTACTGCTTATCTCTCTATTAGCCGCAAGCCTGGCCTATGAATGAACTGAAAAAGGTCTAGAATGAGCTGAAATGCCTGTAGTCTATGTCAACATTTTCTTAGCTTTCATCGTGTCTCTAATAGGGCTACTTATTTATCGATCTCATCTAATGTCTTCCCTACTTTGCCTAGAAGGTATAATGCTATCTTTATTTG [...]
+ACAGTAACAGTTTTAAATAACCATTTCACACTAGCCAACATAGCCCCAATTATCCTGCTGGTATTCGCCGCCTGCGAAGCGGCATTAGGATTATCCCTGCTAGTAATAGTCTCCAACACTTACGGAACTGATTACGTACAAAACCTCAATCTCTTACAATGCATTATCCTCCCCACTATAATATTAATGCCCCTTACATGAGCATCAAAGCCCAATATAATTTGAATCAACACAACAGCTTACAGCCTGCTCATTAGTCTTATTAGCCTGACATACCTCAACCAGCTCAGTGATAATAGTCAAAACTTCTCAATATTATTCTTTACCGACTCCCTATCAGCCCCCTTACTAGCCCTTACAACATGACTACTGCCTTTAATACTAATGGCGAGTCAATTCCACCTGTCAAAGGAAACCCTAGCCCGAAAAAAATTATACATCACTATACTAATCCTTCTACAACTATTCCTAATCATGGCCTTCTCTGCCATA [...]
+CCTATTCTATATCTTGTTTGAAGCCACCCTAATACCCACTCTAGTCATTATTACTCGATGAGGAAATCAAACAGAACGGTTAAACGCGGGCCTTTACTTTCTATTTTATACTCTAGTAGGATCTTTACCACTACTAATTGCACTACTACACACTCAAAATAATCTAGGCTCCCTAAACTTTCTCATAATACAATACTGAACCCAGCCTCTGCCAAACTCCTGATCCAGTGCCTTCCTGTGACTAGCGTGTATAATAGCATTCATAGTAAAAATACCTCTATACGGCCTTCACTTATGACTGCCAAAAGCACATGTAGAAGCCCCCATCGCAGGATCCATAGTGCTTGCCGCCGTGCTCCTAAAACTAGGAGGCTACGGCATGATACGAATTACAACACTACTTGGCCCTCTAACAAGCTTCATGGCCTACCCCTTCATAATACTCTCGCTATGGGGCATAATTATAACAAGCTCTATTTGCCTACGCCAAAC [...]
+AGTCTCTAATTGCCTACTCCTCTGTTAGTCACATAGCCCTGGTCATTGTAGCAGTATTAATCCAAACCCCATGAAGCTACATAGGAGCAACAGCCTTAATAGTTGCCCATGGACTAACATCCTCCATACTATTCTGTCTTGCAAACTCCAACTATGAGCGAATTCATAGCCGAACTATAATCCTTGCGCGAGGCTTACAAACACTCCTCCCACTTATAGCAGCTTGATGACTACTAGCAAGTCTTACTAATCTAGCACTCCCTCCTACCATCAACCTCATCGGAGAACTGTTCGTGGTAGTAGCCACATTTTCATGATCTAACATCACTATCGCCCTAATAGGAACCAATATCATTATTACTGCCCTCTATTCTCTCTACATACTAATCACCACACAACGAGGCAAGTACACGGATCATGTCAAAAGTATCAAACCATCCTTCACACGAGAAAACGCTCTGATAGCTCTCCACCTTCTGCCCCTTCTACTAC [...]
+AACCCCAAAATAATCCTAGGGCCCATTTACTGTAAAATAAAAGTAATCAATCTATTTGCTTCCTCTATTGCCATAACTTTACTCATGTTAACAATACCAATTATCCTTACCAGCGCTTCAACGTATAAAAATAAATTCTACCCACAGTATGTAAAAACTACAATTTCCCATGCTTTCATAATTAGTACTATTCCTATAATGATATTCTTCTACTCAGGGCAAGAGATAATTATCTCAAACTGACATTGAATAACTATTCAGACCCTAAAACTAACTCTAAGCTTTAAACTAGACTATTTCTCGATAATTTTCATGCCGGTAGCCCTGTTCGTTACATGATCAATCATAGAGTTTTCTATTTGGTATATACACACTGACCCCAACATTAACCGATTCTTCAAATATCTACTTATATTCCTTATTACTATAATAATCTTAGTAACCGCAAATAATCTGTTCCAATTATTTATTGGCTGAGAAGGGGTAGGGATC [...]
+CCTTCTTATCGGGTGATGATACGGACGAACAGACGCCAATACAGCTGCCCTCCAAGCAGTCTTATATAATCGCATCGGAGACGTAGGCTTTATCCTGGCCATAGCCTGATTTTTACTTAATACGAATGCATGAGATTTCCAACAAATCTTTGCAATTGAACATGATAACCTCAACATTCCACTAGCAGGACTACTCCTAGCAGCTACTGGAAAATCAGCCCAATTCGGCCTTCATCCATGACTCCCATCAGCTATAGAAGGGCCTACTCCTGTTTCAGCCCTACTCCACTCTAGTACAATAGTAGTAGCAGGGGTATTTCTTCTGATCCGATTCCACCCCTTAATGGAGCATAATAAAACTATCCAAACAGCTGCTTTATGCTTAGGAGCAATAACAACCTTATTTACAGCAGCCTGCGCTCTCACTCAAAATGATATTAAAAAGATTATTGCCTTCTCCACCTCAAGCCAATTAGGGCTAATAATCGTAAC [...]
+TTAACCAACCTTATTTAGCATTTCTTCATATCTGTACACACGCATTTTTCAAAGCTATACTGTTTATATGCTCCGGATCCATTATTCACAGCCTAAACAATGAACAAGATATCCGAAAAATAGGAGGCCTATTCAAAGCCTTACCACTTACCACCACCGCACTGATTATCGGGACTCTAGCACTTACAGGTATACCTTTCCTAACAGGATTTTACTCTAAAGACCTAATTATCGAGACCGCTAACACGTCATATACCAACGCCTGAGCCCTACTAACAACTCTCATTGCCACATCCATAACCGCCGCCTATAGCACTCGAATTGTATTCTTCGCACTTCTAGGACAACCTCGCTTTAACCCCGCCATTGTTATCAACGAAAATAACCCTCTCCTAATCAACTCCATCAAACGTCTACTCCTAGGAAGTATTTTCGCAGGATACCTAATCTCTCATAATATCACACCTACTACCATCCCACAAATAACTATGC [...]
+CTAAAAATAACAGCCCTTGCGGTCACTATACTAGGCTTTATCCTAGCACTAGAACTCAACTCTACTATGCAAGGCCTCAAATTTAACTATCCACAAAGTCCATTCAAATTTTCTAATCAACTAGGGTATTTCCCCATTATTATTCACCGCCTTCTACCAATAATGAGCCTATCAATAAGCCAAAAAACGGCATCCATATTACTAGACATAATCTGACTAGAAAATGTACTACCAAAATCTATCTCCTACTTCCAAATAAAATCCTCAATCACAGTTTCCAATCAGAAAGGACTAATTAAATTATATTTCCTCTCTTTCATGATCACACTGGCCCTAAGCTTCTTTGTA??????CTTAATTTCCACGGG
+>Ursus_arctos
+ATGAACGAAAATTTATTTACCTCTTTTATCACCCCAACGATAGTGGGAATTCCTATTGTACTTTTAATTATTATGTTTCCGAGCATTTTATTTCCTTCCCCCAGTCGACTGATCGACAATCGCTTAGTATCTATTCAACAGTGACTAGTTCGGCTAACATCAAAACAAATATTATCCATTCATAGCCACAAAGGACAAACCTGGGCACTAATATTGATATCACTAATCCTATTTATTGGCTCAACTAATCTTCTGGGACTATTGCCGCACTCATTCACACCTACCACTCAGCTGTCAATGAACCTAGGAATGGCTATTCCCTTATGGGCAGGTACAGTTGCTACTGGATTCCGATACAAGACCAAAGCATCCTTGGCTCACTTTCTACCTCAAGGAACACCTTTCCCTCTAATCCCGATACTCGTAATTATTGAAACAATCAGCCTATTTATCCAACCTGTGGCCCTGGCCGTGCGACTAACCGCTAATATT [...]
+CCATTTGCTCATTCATTTAATTGGGGGAGCTACCTTGACTCTAACAAGTATTAGTACTATTACAGCCTTTATCACCTTTACCGTTCTAGTGCTACTTACTATTCTCGAGTTCGCTGTAGCCCTCATTCAGGCCTACGTCTTCACCCTGCTAGTAAGCTTGTACCTACACGATAACACTTAAATGCCACAACTAGACACATCAACATGGTCTATTACAATTCTATCCATAGCTCTAACACTATTTATCGCCCTCCAATTAAAAGTCTCAAAATATAAATACCCTGAGACCCCCGAGCCGAAATCTCTCTCATCATTAAAAAAGCTTGTGCCTTGAGAAGAAAAATGAACGAAAATTTATTTACCTCTTTTATCACCCCAACGAATGTTCATAAGCCGGTGATTATTCTCTACGAACCATAAAGACATTGGCACTCTTTACCTTCTGTTCGGTGCATGAGCCGGAATAGTGGGCACTGCCCTCAGCCTTTTAAT [...]
+AGCTGGGTCAGCCCGGGGCTCTGTTGGGGGATGATCAGATCTACAATGTAATCGTAACTGCCCATGCATTCGTGATAATCTTCTTCATAGTTATGCCTATTATAATTGGGGGATTCGGGAACTGATTAGTGCCCTTGATGATCGGTGCTCCCGACATAGCGTTCCCTCGAATAAATAACATAAGCTTCTGGTTGCTGCCACCATCTTTCTTACTGCTTCTGGCCTCCTCTATGGTAGAAGCAGGTGCAGGGACTGGATGAACTGTCTATCCTCCTCTAGCGGGTAATCTGGCCCATGCAGGAGCATCGGTAGACTTAACAATCTTTTCTCTGCACCTAGCAGGCATCTCTTCTATTCTGGGGGCTATCAATTTCATCACTACTATTGTTAACATGAAACCCCCTGCAATATCTCAATATCAAACCCCTCTGTTTGTATGATCAGTCCTAATCACAGCAGTACTTCTTCTTTTATCTCTACCAGTCTTAGCGG [...]
+ACTATACTACTTACAGATCGAAACCTTAACACTACCTTTTTTGATCCAGCTGGAGGAGGAGACCCTATTTTATATCAACACTTGTTCTGATTCTTCGGACATCCTGAGGTTTACATTCTAATCCTTCCTGGGTTCGGAATGATCTCTCACATTGTCACTTATTATTCAGGAAAAAAAGAACCTTTTGGCTATATAGGAATAGTCTGAGCGATAATATCCATTGGATTCTTAGGATTTATCGTGTGAGCTCATCATATGTTTACCGTAGGTATAGACGTTGACACACGAGCTTACTTCACTTCAGCTACCATAATCATTGCTATCCCGACAGGAGTCAAAGTATTTAGCTGACTAGCCACTCTGCACGGAGGGAATATTAAATGATCTCCCGCTATGATGTGAGCCCTGGGCTTTATCTTCCTGTTTACAGTAGGAGGCCTTACAGGAATTGTCCTAGCTAATTCATCTCTAGACATCGTTCTCCATGACACG [...]
+GGTAGCCCATTTTCACTACGTGCTGTCAATGGGAGCTGTTTTCGCCATCATAGGAGGATTTGCCCACTGATTCCCACTATTTTCAGGCTACACACTTAACAACACATGAGCAAAAATTCACTTTATAATTATATTCATCGGGGTTAATATGACATTCTTTCCTCAGCATTTTCTAGGCCTGTCAGGAATACCTCGGCGATATTCCGACTATCCAGATGCCTATACAACATGAAACACAGTATCTTCTATAGGCTCATTTATTTCACTAACAGCAGTTATGCTAATAATTTTCATGATTTGGGAGGCCTTTGCATCAAAACGAGAGGTGGCAGTGGTAGAACTCACCTCAACCAACATTGAATGACTACATGGATGCCCTCCTCCATATCACACATTCGAAGAACCTGCCTACGTCACACTAAAAATGGCATGTCCCTTCCAAATAGGTCTTCAAGATGCAACTTCTCCTATCATAGAGGAACTTCTGCATTT [...]
+ATACATTAATAATTGTGTTCCTAATTAGCTCCCTGGTTCTCTATATCATCTCAACTATACTAACCACCAAATTAACATACACAAGTACAATAGACGCACAAGAAGTAGAGACTGTGTGAACTATCCTGCCAGCTATTATCTTGATTCTGATTGCACTCCCATCACTACGGATCCTCTATATGATGGATGAGATCAATAGTCCCTCACTAACTGTAAAAACCATGGGCCACCAGTGATATTGAAGTTACGAATATACAGATTATGAAGATTTAAACTTTGACTCCTATATGATTCCGACACAAGAACTAAAGCCTGGAGAATTGCGGTTATTAGAAGTGGACAATCGAGTAGTGCTGCCCATAGAAATAACGATCCGTATGCTGATCTCGTCAGAAGACGTCTTGCATTCATGAGCTGTACCATCCCTAGGGCTAAAAACTGATGCAATCCCAGGACGGCTAAACCAGACAACTCTCATAGCTATGCGACCGG [...]
+TACGGCCAATGCTCAGAAATTTGTGGCTCCAATCACAGTTTTATACCTATTGTCCTCGAGCTAGTCCCACTATCCTATTTTGAAGAATGATCCGCTTCAATACTAATGACTCACCAAACACATGCATACCATATAGTTAACCCAAGCCCATGACCACTAACAGGAGCCCTCTCAGCCCTCCTTATAACATCAGGACTAATTATGTGATTTCACTTTAACTCCATACTCTTGTTATTGCTAGGCCTTACAACCAATATACTTACCATATATCAATGGTGACGGGATATTATTCGAGAGAGTACATTTCAAGGCCATCACACTCCTGCTGTCCAAAAGGGACTACGGTATGGAATAGTCTTATTTATCGTATCAGAAGTATTCTTCTTTGCAGGATTCTTCTGAGCTTTTTATCACTCAAGCCTAGCACCCACTCCCGAACTAGGAGCATGCTGACCGCCCACAGGTATTACTCCCCTGAACCCGCTAGAAGTA [...]
+CAATACTTCAGTACTTCTTGCATCCGGAGTATCCATTACCTGAGCTCATCACAGCTTAATAGAGGGAAGCCGCAAGCACATACTCCAAGCCCTATTCATTACTATCTCTCTAGGCGTGTACTTTACACTCCTACAAGCCTCAGAGTACTATGAGGCATCCTTCACTATTTCAGATGGAGTCTACGGCTCAACTTTTTTCATAGCGACTGGATTTCACGGACTTCATGTAATCATTGGCTCAACTTTTCTCACAGTCTGTTTCCTACGACAACTACACTTTCATTTCACATCAAGTCACCATTTCGGCTTTGAAGCAGCAGCATGATATTGACACTTCGTAGATGTCGTATGACTATTCCTATATGTTTCCATCTATTGATGAGGGTCCTGCATGACCAACATCCGAAAAACCCACCCATTAGCTAAAATCATCAACAACTCATTTATTGACCTTCCAACACCATCAAACATCTCAGCATGATGAAACTTTGG [...]
+TTGGAGTATGTTTAATTCTACAGATTCTAACAGGCCTGTTCCTAGCCATACACTATACACCAGACACAACCACAGCTTTTTCATCGGTCACCCACATTTGCCGAGACGTTCACTACGGATGAGTTATCCGATATGTACATGCAAATGGAGCCTCCATCTTCTTTATCTGCCTATTTATGCACGTAGGACGGGGCCTGTACTATGGCTCATACCTATTCTCAGAAACATGAAACATTGGCATTATTCTCCTATTTACAATTATAGCCACCGCATTTATAGGATACGTCCTACCCTGGGGCCAAATGTCCTTCTGAGGAGCGACTGTCATCACCAATCTACTATCGGCCATTCCCTACATCGGAACGGACCTGGTAGAATGAATCTGAGGGGGCTTTTCCGTAGATAAGGCGACCCTAACACGATTCTTTGCTTTCCACTTTATTCTCCCGTTCATCATCCTAGCACTAGCAGCAGTCCATCTATTGTTCCTAC [...]
+GGATCTAACAACCCCTCTGGAATCCCATCTGACTCAGACAAAATCCCCTTCCATCCATACTATACAATTAAAGATATTCTAGGCGCCCTACTTCTCGCCCTAACCTTAGCAACCCTAGTCCTATTCTCGCCCGACTTACTAGGAGACCCTGATAACTATACCCCCGCAAATCCACTGAGCACTCCACCCCACATCAAACCCGAATGGTACTTTCTATTTGCCTACGCTATCCTACGATCTATCCCTAATAAACTAGGAGGAGTACTAGCACTAATTTTCTCCATTCTAATCCTAGCCATCATTCCTCTTCTACACACGTCCAAACAACGAGGAATGATATTCCGACCCCTAAGCCAATGCCTATTTTGACTTCTAGTAGCAGACCTACTAACACTAACATGAATTGGAGGACAACCAGTAGAACATCCCTTCATTATTATCGGACAACTAGCCTCCATTCTCTACTTTACAATCCTCCTAGTACTTATACCT [...]
+AATTATTGAAAACAACCTCTTAAAGTGGATGTTTATAATTAACATTATCTCACTAGTCGTACCCATTCTCCTCGCCGTAGCCTTCTTAACACTAGTGGAGCGAAAAGTACTGGGCTACATACAACTTCGTAAAGGGCCAAACATTGTAGGACCCTATGGTCTCCTACAACCTATCGCAGATGCTACAAAACTTTTTACCAAAGAACCCTTGCGCCCACTCACATCGTCCACAACTATATTTATTATAGCCCCTATTCTAGCCCTAACACTAGCCCTAACTATATGAGTTCCCCTACCAATGCCATATCCCCTTGTCAATATAAACCTCGGAGTACTGTTTATATTAGCAATATCAAGCTTAGCTGTATATTCTATCCTTTGATCGGGATGGGCTTCAAACTCAAAATACGCTCTGATTGGAGCCCTACGAGCCGTAGCCCAGACAATTTCATATGAAGTTACATTAGCCATTATTCTCCTATCAGTCCTACT [...]
+GCTCATTCACACTCTCTACTTTAATTACTACTCAAGAACACCTCTGACTAATTTTCCCCACATGACCTCTGGCCATAATATGATTTATTTCTACCCTAGCGGAAACTAACCGAGCCCCTTTTGACCTAGCAGAAGGAGAGTCAGAATTAGTCTCAGGTTTCAACGTCGAGTACGCAGCAGGTCCATTCGCCTTATTTTTCTTAGCAGAATATACCAACATTATTATAATAAATGCCCTCACGACTATCCTATTCTTTGGAGCATTTCATAACCCCTATATACCAGAACTATACACTGTCAACTTCACTGTAAAAACACTCCTCCTAACAGCTTCTTTCCTATGAATCCGCGCATCCTACCCTCGATTCCGATACGATCAACTAATACACCTGCTATGAAAAAATTTCCTACCCCTCACACTGGCCCTGTGCATGTGACATGTAACACTACCCATTATCACAGCAAGCATTCCTCCTCAAATAATAAAACCTC [...]
+ATCATTATCACATCCACCATTATCCTAGGAACCATGATCGTTCTATTTAGCTCCCATTGACTCATAATCTGAATTGGCTTTGAAATGAACATACTAGCCATTATCCCAATCCTAATGAAAAAATTTAATCCACGAGCCATAGAAGCTTCTACAAAATATTTCCTCACACAAGCCACCGCATCCATGCTCCTGATACTAGGCATTATTATCAATCTACTACATTCAGGGCACTGAACAATCTCAATAATCCCCAACCCAATCGCATCAACCGTAATCACCATTGCCCTAGCAATAAAACTTGGCCTATCCCCCTTTCACTTTTGAGTTCCAGAAGTCACACAAGGCGTTCCTTTGTCCTCAGGAATGATTCTACTAACATGACAAAAAATCGCACCTCTATCCGTCCTATACCAAATCTCACCGTCCATCAATCCAAACCTGCTAGTAGCAATAGCCGCTACATCCGTATTAGTAGGAGGCTGAGGAGGACTA [...]
+TCAACTCCGAAAAATCCTAGCATACTCTTCAATCGCTCACATGGGCTGAATAGCTGCCATCATAGTATATAATCCTACCCTAATAATCCTTAACCTTACAATCTACATCATAATAACTCTAGGGACATTTATACTATTCATGTACAATCTATCTACAACAACATTATCACTGTCCCACACATGAAATAAATTACCACTAATTGCCTCACTAATCCTAGCACTTATACTATCACTAGGCGGCCTCCCTCCTCTCTCAGGCTTTATTCCCAAATGAATAATTATTCAAGAGTTGACAAAAAATGACATAATTGTTATACCCATATTCATAGCCATCACAGCTCTACTAAACCTTTATTTCTACATGCGCCTAGCATACGCTACAGCACTAACAATGTTTCCCTCGGCAAACAATACAAAAATAAAATGACAATTTGAAAGCATAAAAAAAATAATCTTCCTACCCCCTCTAATCGTAGCATCAACCATACTCCT [...]
+CTCCAATACTCTCAATCATGGACATCAACTTAATCTTAGCACTATTTACCAACATACTACTAGCCTCCTTACTCGTTCTTATTGCCTTCTGACTACCACAGTTAAATATTTACGCAGAGAAAGCAAGCCCCTATGAATGCGGGTTTGACCCCATGGGATCGGCACGCCTCCCTTTTTCCATGAAATTCTTCCTAGTAGCTATTACATTTCTACTATTTGACCTAGAAATTGCACTACTCCTCCCTCTTCCCTGAGCATCACAAACTGACAACTTAATAACGATACTCACCATAGCGTTACTGCTTATCTCCCTACTAGCTGTAAGCCTGGCCTATGAATGAGCTGAAAAAGGTCTAGAATGGGCCGAAGTGCCTGTAGTCTATGTTAATATTTTCTTAGCCTTCATTGTATCCCTAATAGGACTGCTCGTTTATCGATCCCATCTAATATCCTCCCTGCTCTGCCTAGAGGGTATAATGCTATCTCTATTTG [...]
+ACAGTAACAGTTTTAAACAATCACTTCACACTGGCTAATATAGCTCCTATCATCCTGCTAGTATTCGCTGCCTGCGAGGCAGCACTAGGACTGTCCCTGCTAGTAATAGTCTCCAACACTTACGGAACTGATTATGTACAAAACCTCAATCTCTTACAATGCATCATCTTTCCCACTATAATATTAGTACCTCTTACATGAGCATCAAAGCCCAATATAATTTGGATCAATACAACAGCTTACAGCCTGCTTATCAGTCTTATCAGCTTGACATATCTCAACCAACTCAGTGATAATAGCCTAAACTTCTCATTGCTATTCTTTACCGACTCCCTATCAGCCCCCCTATTAACCCTCACAACATGACTACTACCCCTGATACTAATGGCGAGTCAATTTCACCTGTCAAAGGAAACTCTGACCCGAAAGAAATTATACATCACCATACTAGTCCTTCTACAACTATTCCTGATCATAACCTTTTCTGCTATA [...]
+CCTATTCTATATCTTGTTCGAAGCCACCCTAGTGCCCACTCTGGTTATTATCACTCGATGAGGAAATCAAACAGAACGACTAAACGCGGGCCTTTACTTTCTGTTTTATACTCTAGTAGGGTCTCTGCCATTACTAATTGCACTGCTACACACCCAAAATAATCTAGGCTCCCTAAATTTTCTCTTAATACAATACTGAATCCAGCCTCTGCCAAATTCCTGATCTAGTATATTTCTGTGACTAGCGTGTATAATGGCATTTATGGTAAAAATACCCCTATACGGTCTTCATCTGTGATTACCAAAAGCACACGTAGAGGCACCTATTGCAGGATCTATAGTACTTGCTGCCGTACTCCTAAAACTAGGAGGCTATGGCATGATACGAATTACAACACTACTTAGTCCTTTAACGAGCTTCATGGCTTACCCCTTCATAATACTCTCGCTATGGGGCATAATTATAACAAGTTCTATCTGCCTACGCCAAAC [...]
+AGTCCCTAATTGCTTATTCCTCTGTTAGTCACATGGCCCTAGTCATTGTAGCAGTATTAATCCAAACCCCATGAAGCTATATAGGAGCAACAGCCTTAATAATCGCCCACGGACTAACATCCTCCTTGCTATTCTGTCTTGCAAACTCCAACTATGAACGAACCCATAGCCGAACTATGATCCTCGCGCGAGGCCTACAAACACTTCTCCCACTTATGGCAGCTTGATGACTACTAGCAAGTCTCACTAATCTATCACTCCCTCCTACCATCAACCTTATCGGAGAACTGTTTGTAGTAGTAGCTACATTTTCATGGTCTAACATCACCATCACTCTAATAGGAACCAACATTATCATTACTGCCCTCTACTCCCTCTACATACTAATCACCACACAACGAGGCAAGTGCACAAACCATGTCAAAAGTATTAAACCATCCTTTACACGAGAAAACGCCCTGATAGCTCTCCATCTCTTACCCCTCCTGCTAC [...]
+AATCCCAAAATAATTCTAGGACCTATTTACTGTAAAATAAAAGTAATCAATCTGTTTACTTCCTCTATTATCACAACTTTGCTCATATTAACGATACCGATTATCCTCACCAGCGCTTCAACACACAAAAATAAATCCTACCCACAATATGTAAAAACTACAGTCTCTTATGCTTTCATAATCAGTACTATTCCCATAGTAATATTTCTCTACTCAGGGCAAGAAGTAATTATTTCAAACTGACATTGAATAACTATTCAAACCCTAAAGCTAACTCTAAGCTTTAAGCTAGACTACTTCTCAATAATTTTCATGCCAGTAGCCCTGTTCGTCACATGATCGATCATGGAGTTTTCCATTTGATACATACACACCGACCTCAACATCAACCATTTCTTCAAATACCTACTCATATTCCTTATCACTATAATAATTCTAGTGACCGCAAATAATCTACTTCAACTATTCATCGGCTGAGAAGGAGTAGGGATC [...]
+CCTCCTTATCGGGTGGTGGTACGGACGAGCAGACGCCAATACAGCCGCTCTACAAGCAGTCCTATACAATCGCATCGGAGATGTAGGCTTTATCATAGCTATAGCCTGATTTTTACTCAATACAAATGCATGAGACTTCCAACAAATCTTTGCAATTGAACATGAAAACCTTAGCATTCCACTAGCAGGACTGCTCCTAGCAGCCACTGGAAAATCAGCCCAATTCGGCCTTCATCCATGACTCCCATCAGCTATAGAAGGACCTACTCCTGTTTCAGCCCTACTCCACTCTAGTACAATAGTAGTAGCAGGGGTATTTCTTCTAATCCGATTTTACCCCCTAATAGAACACAACAAGACTATCCAAACGGCCACTTTATGCCTAGGTGCAATAACTACCCTATTTACAGCAGCCTGTGCTCTCACCCAGAATGATATCAAAAAGATCATTGCCTTTTCCACCTCAAGCCAGCTAGGACTAATAATCGTAAC [...]
+TTAATCAGCCTCACCTAGCATTCCTTCATATCTGCATACACGCATTTTTCAAGGCCATACTATTTATATGCTCCGGGTCCATTATCCACAGCTTGAATGATGAACAAGACATCCGAAAAATAGGAGGTCTATTCAAAGCCCTGCCACTTACCACTACCGCATTAATTATCGGAGTCCTAGCACTCACAGGTATACCTTTCCTAACAGGATTCTACTCTAAAGACCTAATTATCGAAACCGCCAACACGTCGTACACCAACGCCTGAGCCCTACTAACAACTCTCGTTGCCACATCCATAACCGCTGCCTACAGTACTCGAATCGTATTCTTTGTACTTCTAGGACAACCTCGCTTTAACCCTGTCATTATTATCAACGAGAATAACCCTCTCCTAATCAATTCCATCAAGCGCCTACTTCTAGGAAGTATTTTCGCAGGATACCTAATCTTCCACAATATTACACCCACTACCATCCCACAAACAACCATAC [...]
+CTAAAAATAATAGCCCTCGCGGTCACCATGTTAGGTTTTATCCTGGCATTAGAACTTAACTCTACCACACAAACTCTCAAACTTGACTATCCACAAAATCCATTCAAATTCTCCATTCAACTAGGATACTTCCCCATTATTACTCACCGCCTCCTGCCAATAATGAGCTTATCAATAAGCCAAAAAATGGCATCTATATTACTAGACACAACCTGACTAGAAAATGTACTACCAAAATCCATCTCCTACTTCCAAATAAAATCTTCAATCACAGTCTCTAACCAGAAAGGACTAATTAAACTATATTTCCTCTCTTTCATGATCACATTAACCCTAAGCTTCTTCGTA??????CTTAATTTCCACGAG
+>Ursus_maritimus
+ATGAACGAAAATTTATTTACCTCTTTTATCACCCCAACGATAGTGGGAATTCCTATTGTACCTTTAATTATCATGTTTCCGAGCATTTTATTTCCTTCTCCCAGTCGACTGATCGATAATCGCTTAGTATCTATTCAACAGTGACTAGTTCGGCTAACATCAAAACAAATATTATCCATTCATAGCCACAAAGGACAAACCTGGGCACTAATATTGATATCACTAATCCTATTTATTGGCTCAACTAATCTTCTGGGTCTATTACCGCACTCATTCACACCTACCACACAACTGTCAATGAACCTAGGAATGGCTATTCCCTTATGGGCAGGTACAGTCGCTACTGGATTCCGATACAAGACCAAGGCATCCTTGGCTCACTTTCTACCTCAAGGGACACCTTTCCCTCTAATCCCGATACTCGTAATTATTGAAACAATCAGCCTATTTATCCAGCCTGTGGCCCTGGCCGTGCGACTAACCGCTAATATT [...]
+CCATTTGCTCATTCATTTAATTGGGGGAGCTACTTTGACTCTAACAAGTATTAGCACTATTACAGCCTTTATCACCTTTACCGTTCTAGTACTACTTACCATTCTCGAGTTCGCTGTAGCCCTCATTCAGGCCTACGTCTTCACCCTGCTAGTAAGCCTATACCTACACGATAACACTTAAATGCCACAACTAGATACATCAACATGATCTATTACAATTCTATCCATAGTTCTAACACTATTTATCGCCCTTCAATTAAAAGTCTCAAAATACAAATACCCTGAGATCCCCGAGCCAAAATCTCTCTCATCATCAAAAAAGCTTGTACCTTGAGAAGAAAAATGAACGAAAATTTATTTACCTCTTTTATCACCCCAACGAATGTTCATAAACCGGTGATTATTCTCTACGAACCATAAAGACATTGGCACCCTTTATCTTCTGTTCGGTGCATGAGCCGGAATAGTGGGCACTGCCCTCAGCCTTTTAAT [...]
+AGCTGGGTCAGCCCGGGGCTCTGTTGGGGGATGATCAGATCTACAATGTAGTCGTAACTGCCCATGCATTCGTGATAATCTTCTTCATAGTTATGCCTATTATAATTGGGGGATTCGGGAACTGATTAGTGCCTTTGATGATCGGTGCCCCCGACATAGCGTTCCCTCGAATAAATAACATAAGCTTCTGGTTGCTGCCACCATCTTTCTTACTGCTTCTGGCCTCCTCTATGGTAGAAGCAGGTGCAGGGACTGGATGAACTGTCTACCCTCCTCTAGCGGGTAATCTGGCCCATGCAGGAGCATCAGTAGACTTAACAATCTTTTCTCTGCACCTAGCAGGCATCTCTTCTATTCTGGGGGCTATCAATTTCATCACTACTATTATTAACATGAAACCCCCTGCAATATCTCAATATCAAACCCCTCTGTTTGTATGATCAGTCCTAATCACAGCAGTACTTCTTCTTTTATCTCTGCCAGTCTTAGCAG [...]
+ACTATACTACTTACAGATCGAAACCTTAACACTACCTTTTTTGATCCAGCTGGAGGAGGAGATCCTATTTTATATCAACACTTGTTCTGATTCTTCGGACACCCTGAGGTTTACATTCTAATCCTTCCTGGGTTCGGAATGATCTCTCACATTGTTACTTATTATTCAGGAAAAAAAGAACCTTTTGGCTATATAGGAATAGTCTGAGCGATAATATCCATTGGATTCTTAGGATTTATCGTGTGAGCTCATCATATGTTTACCGTAGGTATAGACGTTGACACACGAGCTTACTTCACTTCAGCTACCATAATTATTGCTATCCCGACAGGAGTCAAAGTATTTAGCTGACTAGCCACTCTGCACGGAGGGAATATTAAATGATCTCCCGCTATGATGTGAGCCCTGGGCTTTATTTTCCTGTTTACAGTAGGAGGCCTTACGGGAATTGTCCTAGCTAATTCATCTCTAGACATCGTTCTCCATGACACG [...]
+GGTAGCCCATTTTCACTACGTGCTGTCAATGGGAGCTGTTTTCGCCATCATAGGAGGATTTGTCCACTGATTCCCACTATTCTCAGGCTACACACTTAATAACACATGAGCAAAAATTCACTTTATAATTATATTCATTGGGGTTAATATGACATTCTTTCCTCAGCATTTTCTAGGCCTGTCAGGAATACCTCGGCGATATTCCGACTATCCAGATGCCTATACAACATGAAACACAGTATCTTCTATAGGCTCATTTATTTCACTAACAGCAGTTATGCTAATAATTTTCATGATTTGGGAGGCCTTCGCATCAAAACGAGAGGTGGCAGTGGTAGAACTTACCTCAACCAACATTGAATGACTACACGGATGCCCTCCTCCATATCACACATTCGAAGAACCTGCCTACGTTACACTAAAAATGGCATGCCCCTTCCAAATAGGTCTTCAAGACGCAACTTCTCCCATCATAGAGGAACTTTTGCATTT [...]
+ATACATTAATAATTGTGTTCCTAATTAGCTCCCTAGTTCTCTATATTATCTCAACTATACTAACCACCAAATTAACACACACAAGTACAATAGACGCACAAGAAGTAGAGACGGTGTGAACTATCCTGCCAGCTATTATCTTGATTCTGATCGCACTCCCATCACTACGGATCCTCTATATGATGGATGAGATCAATAATCCCTCACTAACTGTAAAAACCATGGGCCACCAGTGATATTGAAGTTACGAATATACAGATTATGAAGATTTAAACTTTGACTCCTATATGATTCCGACACAAGAACTAAAGCCTGGAGAATTGCGGTTATTAGAAGTGGACAATCGAGTAGTGCTGCCCGTAGAAATAACGATCCGTATACTGATCTCGTCAGAAGATGTCTTGCATTCATGAGCTGTACCATCCCTAGGGCTAAAAACTGATGCAATCCCAGGACGGCTAAACCAGACAACTCTCATAGCCATGCGACCAG [...]
+TATGGCCAATGCTCAGAAATTTGTGGCTCCAATCACAGTTTTATACCTATTGTCCTCGAGCTAGTCCCACTATCCTATTTTGAAGAATGATCCGCTTCAATACTAATGACTCACCAAACACATGCATACCATATAGTCAACCCAAGCCCATGACCACTAACAGGAGCCCTCTCAGCCCTTCTTATAACATCGGGGCTAATTATGTGATTTCACTTTAACTCTATACTCTTATTATTGCTAGGCCTTACAACCAATATACTCACCATGTATCAATGGTGACGGGATATTATTCGAGAGAGTACATTTCAAGGCCATCACACTCCTGTTGTCCAAAAGGGACTGCGGTACGGAATAGTCCTATTTATCGTATCAGAAGTATTCTTCTTTGCAGGATTCTTCTGAGCTTTTTATCACTCAAGCCTAGCACCCACTCCCGAACTAGGAGCATGCTGACCACCCACAGGTATTACTCCCCTAAACCCGCTAGAAGTC [...]
+CAACACTTCGGTACTTCTTGCATCCGGAGTGTCCATTACCTGAGCTCACCACAGCTTAATAGAGGGAAGCCGCAAGCACATACTCCAAGCCCTATTCATTACTATTTCTCTAGGCGTGTACTTTACACTCCTACAAGCCTCAGAGTACTATGAGGCATCCTTCACTATTTCAGATGGAGTCTACGGCTCAACTTTTTTCATAGCGACTGGATTTCACGGACTTCATGTAATCATTGGCTCAACTTTTCTCACAGTCTGTTTCCTACGACAACTACACTTTCATTTCACATCAAGTCACCATTTCGGCTTTGAAGCAGCAGCATGATATTGACATTTCGTAGATGTTGTATGACTATTCCTATATGTTTCCATCTATTGATGAGGGTCCTGCATGACCAACATCCGAAAAACCCACCCATTAGCTAAAATCATCAACAACTCATTTATTGATCTTCCAACACCATCAAACATCTCAGCATGATGAAACTTTGG [...]
+TTGGAGTGTGTTTAATTCTACAGATTCTAACAGGCCTGTTTCTAGCCATACACTATACATCAGACACAACCACAGCTTTTTCATCAGTCACCCACATTTGCCGAGACGTTCACTACGGGTGAGTTATCCGATATGTACATGCAAATGGAGCCTCCATGTTCTTTATCTGCCTATTCATGCACGTAGGACGGGGCCTGTACTATGGCTCATACCTATTCTCAGAAACATGAAACATTGGCATTATTCACCTATTTACAGTTATAGCCACCGCATTTATAGGATACGTCCTACCCTGAGGCCAAATGTCCTTCTGAGGAGCGACTGTCATCACCAATCTACTATCGGCCATTCCCTATATCGGAACGGACCTGGTAGAATGAATCTGAGGGGGCTTTTCCGTAGATAAGGCGACTCTAACACGATTCTTTGCTTTCCACTTTATTCTCCCGTTCATCATCCTAGCACTAGCAGCAGTCCACCTATTGTTCCTAC [...]
+GGATCCAACAACCCCTCTGGAATCCCATCTGACTCAGACAAAATCCCATTCCATCCATACTATACAATTAAGGATATTCTAGGCGCCCTACTTCTCACCCTAGCCTTAGCAACCCTAGTCCTATTCTCGCCCGACTTACTAGGAGACCCTGATAACTATATCCCCGCAAATCCACTGAGCACCCCACCCCACATCAAACCCGAGTGGTACTTTCTATTTGCCTACGCTATCCTACGATCCATCCCTAATAAACTAGGAGGAGTACTAGCACTAATTTTCTCCATTCTAATCCTAGCCCTCATTCCTCTTCTACACACGTCCAAACAACGAGGAATGATATTCCGGCCCCTAAGCCAATGCCTATTTTGACTTCTAGTAGCAGACCTACTAACACTAACATGAATTGGAGGACAACCAGTAGAACACCCCTTCATTATTATCGGACAACTAGCCTCCATTCTCTACTTTACAATCCTCCTAGTACTCATACCC [...]
+AATTATTGAAAACAACCTCTTAAAGTGGATGTTTATAATTAACATTATCTCACTAGTCGTGCCCATTCTCCTCGCCGTAGCCTTCTTAACACTAGTGGAGCGAAAAGTACTGGGCTATATACAACTTCGTAAAGGACCAAACATTGTAGGACCCTATGGTCTCCTACAACCTATCGCAGATGCTACAAAACTTTTTACCAAAGAACCCTTGCGCCCACTCACATCATCTACAACTATATTTATTATAGCCCCTATTCTAGCCCTAACACTAGCCCTAACTATATGAGTTCCCCTACCAATGCCATACCCCCTTGTCAATATAAACCTCGGAGTACTGTTTATATTAGCAATATCAAGCTTAGCTGTATATTCTATCCTTTGATCGGGATGGGCTTCAAACTCAAAATACGCTCTGATTGGAGCCCTACGAGCCGTAGCCCAGACAATCTCATATGAAGTCACATTAGCCATTATCCTCCTATCAGTCCTACT [...]
+GCTCATTCACACTCTCTACTTTAATTACTACTCAAGAACACCTCTGACTAATTTTCCCCACATGACCTCTGGCCATAATATGATTTATTTCCACTCTAGCAGAAACTAACCGAGCCCCTTTTGACCTAGCAGAAGGAGAGTCAGAATTAGTCTCAGGTTTCAACGTCGAGTACGCAGCAGGCCCATTCGCCTTATTTTTCTTAGCAGAATACACCAACATTATTATAATAAATGCCCTCACGACTATCCTATTCTTTGGAGCATTTCATAACCCCTACATACCAGAACTATACACTGTCAACTTCACTGTAAAAACACTCCTCCTAACAGCTTCTTTCCTATGAATCCGCGCATCATACCCTCGATTCCGATACGACCAACTAATACACCTGCTATGAAAAAATTTCCTACCCCTCACACTGGCCCTGTGCATGTGACATGTAACACTACCCATTATCACAGCAAGCATTCCTCCTCAAATAATAAAACCTC [...]
+ATCATTATCACATCCACCATTATCCTAGGAACCATGATCGTTCTATTTAGCTCCCATTGACTCATAATCTGAATTGGCTTTGAAATGAACATACTAGCCATTATCCCAATCCTAATGAAAAAATTTAATCCACGAGCCACAGAAGCTTCTACAAAATATTTCCTCACACAAGCCACCGCATCCATGCTCCTGATACTAGGCATTATTATCAATCTACTACATTCAGGGCACTGAACAATCTCAATAATCCCCAACCCAATCGCATCGACCGTAATCACCATTGCCCTAGCAATAAAACTTGGCCTATCCCCCTTTCACTTTTGAGTTCCAGAAGTCACACAAGGCGTTCCTTTGTCCTCAGGAATGGTTCTACTAACATGACAAAAAATCGCACCTCTATCCGTCCTATACCAAATCTCACCGTCCATCAATCCAAACCTGCTAGTAGCAATAGCCGCTACATCCGTATTAGTAGGAGGCTGAGGAGGACTA [...]
+TCAACTCCGAAAAATCCTAGCATACTCTTCAATCGCTCACATGGGCTGAATAGCTGCCATCATAGTATATAATCCTACCCTAATAATCCTTAACCTTACAATCTACATCATAATAACTCTAGGGACATTTATACTATTCATGTACAATCTATCTACAACAACATTATCACTGTCCCACACATGAAATAAATTACCACTAATTGCCTCACTAATCCTAGCACTTATACTATCACTAGGCGGCCTCCCTCCCCTCTCAGGCTTTATTCCCAAATGAATAATTATTCAAGAGTTGACAAAAAATGATATAATTGTCATACCCATATTCATAGCCACCACAGCTCTACTAAACCTTTATTTCTACATGCGCCTAGCATACGCTACAGCACTAACAATGTTTCCCTCGGCAAACAATACAAAAATAAAATGACAATTTGAAAGCATAAAAAAAATAATCTTCTTGCCCCCTCTAATCGTAGCATCAACCATACTCCT [...]
+CTCCAATACTCTCAATCATGGACATCAACTTAATCTTAGCGCTATTTACCAACATACTACTAGCCTCCTTACTCGTTCTTATTGCCTTCTGACTACCACAGTTAAATATTTACGCAGAAAAAGCAAGCCCCTATGAATGCGGGTTTGACCCCATAGGATCGGCACGCCTCCCTTTTTCCATGAAATTTTTCCTAGTAGCTATTACATTTCTACTATTTGACCTAGAAATTGCACTACTCCTCCCTCTTCCCTGAGCATCACAAACTGACAACCTAATAACGATACTCACCATAGCGCTACTGCTTATCTCCTTACTAGCCGTAAGTCTGGCCTATGAATGAACTGAAAAAGGTCTAGAATGGGCCGAAGTGCCTGTAGTTTATGTTAATATTTTCTTAGCCTTCATTGTATCCCTAGTAGGACTACTCATTTATCGATCCCATCTAATATCCTCCCTACTTTGCCTAGAGGGTATAATGCTGTCTTTATTTG [...]
+ACAGTAACAGTTTTAAACAATCACTTTACACTGGCTAATATAGCTCCTATTATCCTGCTGGTATTCGCTGCCTGCGAGGCAGCACTAGGACTGTCCCTGCTAGTAATAGTCTCTAACACTTACGGAACTGATTATGTACAAAACCTCAATCTCTTACAATGCATCATCTTCCCCACTATAATGCTAGTACCTCTTACATGAGCGTCAAAGCCCAATATAATTTGGATCAATACAACAGCTTACAGCCTGCTTATCAGTCTTGTCAGTTTAACATATCTCAACCAGCTCAGTGACAATAGCCTAAACTTCTCATTGCTATTCTTTACCGACTCCCTATCAGCCCCCCTATTAGTCCTCACAACATGACTACTACCCCTAATGCTAATGGCGAGTCAATTTCACCTGTCAAAGGAAACTCTGACCCGAAAGAAATTATACATCACCATACTAGTCCTTCTACAACTATTCCTGATCATAACCTTTTCTGCTATA [...]
+CCTATTCTATATCTTGTTCGAAGCCACCCTAGTACCCACTCTGGTTATTATCACTCGATGAGGAAATCAAACAGAACGACTAAACGCGGGCCTTTACTTTCTGTTTTATACTCTAGTAGGGTCTCTACCATTACTAGTTGCACTGCTACACACCCAAAATAATCTAGGCTCCCTAAATTTTCTCTTAATACAATACTGAACCCAACCTCTGCCAAATTCCTGATCTAGCATATTTCTGTGACTAGCGTGTATAATGGCATTTATGGTAAAAATACCTCTATACGGTCTTCACCTGTGATTACCAAAAGCACACGTAGAGGCACCTATTGCAGGATCCATAGTACTTGCTGCCGTACTCCTAAAACTAGGAGGCTATGGCATGATACGAATTACAACACTACTTGGTCCTTTAACGAGCTTCATGGCTTACCCCTTCATAATACTCTCGCTATGGGGCATAATTATAACAAGTTCTATCTGCCTACGCCAAAC [...]
+AGTCCCTAATTGCTTATTCCTCTGTTAGCCACATGGCCCTGGTCATTGTAGCAGTATTAATCCAAACCCCATGAAGCTATATAGGAGCAACAGCCTTAATAATCGCCCACGGACTAACATCCTCCTTACTATTCTGTCTTGCAAACTCCAACTATGAACGAATCCATAGCCGAACTATGATCCTCGCGCGAGGCCTACAAACACTTCTCCCACTTATGGCAGCTTGATGACTACTAGCAAGTCTCACTAATCTATCACTCCCTCCTACCATCAACCTTATCGGAGAACTGTTTGTAGTAGTAGCTACATTTTCATGATCTAACATCACCATCACTCTAATAGGAACCAACATTATCATTACTGCCCTCTACTCCCTCTACATACTAATCACCACACAACGAGGCAAGTGCACAAACCATGTCAAAAGTATTAAACCATCCTTTACACGAGAAAACGCCCTGATAGCTCTCCATCTCTTACCCCTTCTGCTAC [...]
+AATCCCAAAATAATTCTAGGACCTATTTACTGTAAAATAAAAGTAATCAATTTGTTTACTTCCTCTATTATCATAACTTTGCTCATATTAACGATACCGATTATCCTCACCAGCGCTTCAACACACAAAAACAAATCCTACCCACAATATGTAAAAACTACAGTCTCTTATGCTTTCATAATCAGTACCATTCCCATAGTAATATTCCTTTACTCAGGGCAAGAAGTAATTATTTCAAACTGACATTGAATAACTATTCAAACCCTAAAGCTAACTCTAAGCTTTAAGCTAGACTACTTCTCAGTAATTTTTATGCCAGTAGCCCTGTTCGTCACATGATCGATCATGGAGTTTTCCATTTGATATATACACACTGATCTCAACATCAACCATTTCTTCAAATACCTACTCATATTCCTTATCACTATAATAATTCTAGTGACCGCAAATAATCTACTTCAACTATTCATCGGCTGAGAAGGAGTAGGGATC [...]
+CCTCCTTATCGGATGGTGGTACGGACGAGCAGACGCCAATACAGCCGCTCTACAAGCAGTCCTATACAATCGCATCGGAGATGTAGGCTTTATCATAGCCATAGCCTGATTTTTACTCAATACAAATGCATGAGACTTCCAACAAATCTTTGCAATTGAACATGAAAACCTTAACATTCCACTAGCAGGACTGCTCCTAGCAGCCACTGGAAAGTCAGCCCAATTCGGCCTTCATCCATGACTCCCATCAGCTATAGAAGGACCTACTCCTGTTTCAGCCCTACTCCACTCTAGTACAATAGTAGTAGCAGGGGTATTTCTTCTAATCCGATTTTACCCTCTGATAGAACACAACAAGACTATCCAAACAGCCACTTTATGCCTAGGCGCAATAACCACCCTATTTACAGCAGCCTGTGCTCTCACCCAGAATGACATCAAAAAGATCATTGCCTTTTCCACTTCAAGCCAGCTAGGACTAATAATCGTAAC [...]
+TTAATCAGCCCCACCTAGCATTCCTTCATATCTGCACACACGCATTTTTCAAGGCCATACTATTTATATGCTCCGGGTCCATTATCCACAGCTTAAATGATGAACAAGACATCCGAAAAATAGGAGGCCTATTCAAAGCCCTGCCGCTTACCACTACCGCATTAATTATCGGAGTCCTAGCACTCACAGGTATACCTTTCCTAACAGGATTCTACTCTAAAGACCTAATTATCGAAACCGCCAACACGTCGTACACCAACGCCTGAGCCCTACTAACAACTCTCGTTGCCACATCCATAACCGCTGCCTACAGTACTCGAATCGTATTCTTTGTACTTCTAGGACAACCTCGCTTTAACCCTGTCATTATTATCAACGAGAATAACCCCCTCCTAATCAATTCCATCAAGCGTCTGCTTCTAGGAAGTATTTTCGCAGGATACCTAATCTTCCACAATATCACACCCACTACCATCCCACAAATAACCATAC [...]
+CTAAAAATAATAGCTCTCGCGGTCACTATACTAGGTTTTATCCTAGCATTAGAACTCAATTCTACCACACAAACTCTCAAACTTGACTATCCACAAAATCCATTTAAATTCTCTATTCAACTAGGATACTTCCCCATCATCATTCACCGCCTCCTGCCAATAATGAGCTTGTCAATAAGCCAAAAAATGGCATCTATATTACTAGACATAACCTGACTAGAAAATGTACTACCAAAATCCATCTCCTACTTCCAAATAAAATCTTCAATCACAGTCTCTAACCAAAAAGGACTAATTAAACTATACTTCCTCTCTTTCATGATCACATTAATCCTAAGCTTCTTCGTA??????CTTAATTTCCACGAG
+>Ursus_thibetanus
+ATGAACGAAAATCTATTCACCTCTTTTATTACCCCGACGATAATGGGGGTCCCCATTGTAGTCTTAATCGTTATGTTTCCGAGCATTTTATTCCCTTCTCCCAGTCGACTGATCGACAATCGCTTAGTGTCTATTCAACAATGACTAGTCTGGCTAACATCAAAACAAATGCTATCCATTCATAATCGTAAAGGGCAAACCTGAGCACTAATGTTGATATCCCTAATCCTATTTATTGGCTCAACTAATCTTCTGGGTCTATTGCCACACTCATTCACACCTACCACACAACTGTCAATGAATCTGGGAATGGCCATTCCCTTGTGAGCAGGTACAGTTGCCACTGGATTTCGATATAAGACCAAAGCATCCTTAGCTCACTTTCTACCTCAAGGAACACCTTTTCCTCTAATCCCTATACTTGTAATTATCGAAACAATCAGTCTATTCATCCAACCTATGGCCTTAGCCGTACGATTAACTGCTAATATT [...]
+TCACTTGCTTATCCATTTAATTGGAGGGGCTACTCTAGCTCTAACAAGTATTAGCACTATTACAGCCCTCATCACCTTTATTATTCTAGTGCTACTTACTATTCTCGAGTTCGCTGTAGCCCTCATTCAGGCCTACGTCTTCACCCTGCTAGTAAGCCTATACTTACACGATAACACCTAAATGCCACAACTAGACACATCAACATGATCTATCACAATCCTATCTATAGTTCTAGCACTATTCATTATCTTCCAGTTAAAGATCTCAAAATATAAATACCCCGAAACCCCCGAACCGAAATCCCCTTCACCATCAAAGAAACTTATACCTTGAGAAGAAAAATGAACGAAAATCTATTCACCTCTTTTATTACCCCGACGAATGTTCATAAACCGATGGCTATTCTCTACAAATCATAAAGATATTGGCACTCTCTATCTTCTATTCGGTGCATGAGCCGGAATAGTAGGTACTGCTCTCAGCCTTTTGAT [...]
+AACTAGGTCAGCCCGGGATCCTGTTGGGGGATGATCAGATCTACAATGTAGTCGTAACTGCCCATGCATTCGTGATAATCTTCTTTATGGTTATGCCTATTATAATTGGGGGATTCGGGAACTGATTAGTGCCCTTAATAATTGGTGCTCCTGACATAGCGTTTCCTCGAATGAATAATATAAGCTTCTGACTGCTGCCACCATCTTCTTTGTTGCTTCTAGCTTCTTCTATAGTAGAAGCAGGGGCAGGAACTGGGTGAACTGTCTACCCCCCTCTAGCGGGCAATCTGGCCCATGCAGGAGCATCAGTAGACTTAACAATCTTTTCTCTACACTTAGCAGGCATCTCTTCTATTCTGGGAGCCATCAACTTCATCACTACTATCATTAACATAAAACCTCCTGCAATATCTCAATACCAAACCCCTCTGTTTGTGTGATCAGTCCTAATCACGGCAGTGCTTCTTCTTTTATCTCTGCCAATCTTGGCGG [...]
+ACCATACTACTTACAGATCGAAACCTCAACACTACCTTTTTTGACCCAGCCGGAGGGGGAGATCCTATTCTGTACCAACACTTGTTTTGATTCTTCGGACACCCTGAAGTTTATATCCTAATTCTTCCAGGATTCGGAATGATCTCTCACATTGTCACTTATTACTCAGGAAAAAAAGAGCCTTTCGGCTACATGGGAATAGTCTGAGCGATAATATCCATTGGATTCTTAGGATTTATCGTGTGAGCTCATCATATGTTTACCGTAGGTATAGATGTCGACACACGAGCTTACTTCACTTCAGCTACCATAATTATTGCAATCCCAACAGGAGTCAAAGTATTTAGCTGACTAACTACCCTGCACGGAGGGAATATTAAATGATCTCCTGCTATAATATGAACCCTAAGCTTTATTTTCCTGTTTACAATAGGGGGCCTAACAGGAATTGTCCTAGCTAATTCGTCTCTAAACATTGTTCTCCATGACACA [...]
+GGTAACCCATTTCCACTATGTGCTGTCAATAGGAGCTGTCTTTGCCATTATAGGAGGATTTGTCCACTGATTTCCACTGTTTTCAGGCTATACACTTAATAATACATGAGCAAAGATTCACTTCATAATCATATTCGTTGGGGTTAATATAACATTCTTTCCCCAACATTTCCTAGGCCTGTCGGGAATGCCTCGGCGATATTCCGACTATCCAGATGCCTACACAATATGAAATACAGTATCTTCTATAGGCTCATTCATTTCACTAACAGCAGTTATACTAATAATTTTCATGATTTGGGAGGCCTTTGCATCAAAGCGAGAGGTAGCAGTGGTAGAACTCACTTCAACCAATATTGAATGACTACATGGATGTCCTCCTCCGTACCATACATTTGAAGAACCCGCTTACGTTATACTAAAAATGGCACACCCCTTTCAAATAGGTCTTCAAGACGCAACTTCTCCTATCATGGAGGAACTCCTACATTT [...]
+ATACACTAATAATTGTATTCCTAATTAGCTCCTTAGTTCTCTATATTATTTCAATTATATTAACTGCCAAATTAACACACACAAATACAATAGATGCACAAGAAGTAGAGACGGTATGAACCATCTTGCCGGCTATTATTCTAATTCTAATTGCACTCCCATCGCTACGGATTCTTTATATAATAGATGAAATCAATAACCCCTCACTGACCGTAAAAACCATGGGCCATCAATGATATTGAAGTTACGAGTATACAGATTACGAAGATCTGAGCTTTGACTCTTATATAACCCCAACACAAGAACTAAAACCTGGAGAACTGCGACTATTAGAAGTGGACAATCGAGTAGTACTGCCCATAGAAATAACGATCCGTATGCTGATCTCATCAGAAGATGTCTTGCACTCATGGGCTGTGCCATCCCTAGGATTAAAAACTGATGCAATCCCAGGACGGCTAAACCAAACAACTCTCATAGCTATACGACCAG [...]
+TACGGCCAATGCTCAGAAATTTGTGGCTCCAATCACAGCTTTATACCTATTGTCCTCGAGCTAGTCCCACTATCCTATTTTGAAAAATGGTCTGCCTCAATACTAATGACTCACCAAACGCATGCATATCATATAGTTAACCCAAGTCCATGACCACTAACAGGAGCCCTTTCAGCCCTTCTTATAACATCAGGACTAATCATATGACTCCACTTTAACTCTATATTCTTGCTATCGCTAGGCCTTACAACCAACATACTTACTATATACCAATGATGACGGGATATTATTCGAGAGAGTACCTTTCAGGGTCATCACACCCCCGTTGTCCAAAAAGGACTGCGGTACGGAATAGTCCTATTTATCGTATCAGAAGTATTCTTCTTCGCAGGGTTCTTCTGAGCTTTTTATCACTCAAGCCTAGCACCCACTCCCGAACTGGGGGCATGCTGACCACCCACAGGTATTACTCCCCTGAACCCGCTAGAAGTA [...]
+CAATACTTCAGTACTTCTTGCATCCGGAGTGTCCATTACCTGAGCTCACCACAGCTTAATAGAGGGAAGCCGCAAGCACATGCTTCAGGCCCTATTTATTACTATCTCTCTAGGCGTGTACTTCACACTTCTACAAGCCTCAGAGTATTATGAGGCGTCCTTCACTATCTCAGATGGAGTCTATGGCTCAACTTTCTTCATAGCGACTGGATTTCACGGACTTCATGTAATTATTGGCTCAACTTTTCTCACAGTCTGTTTCCTACGGCAACTACATTTTCATTTTACATCAAGCCACCATTTCGGCTTTGAAGCAGCAGCATGATATTGACACTTCGTAGATGTCGTATGACTATTCCTATATGTTTCTATCTATTGATGAGGGTCTTGCATGACCAACATCCGAAAAACCCATCCATTAGCCAAAATCATCAACAACTCACTCATTGATCTCCCAGCACCATCAAATATCTCAGCATGATGAAACTTTGG [...]
+TCGGAATATGCCTAATCCTACAGATTCTGACAGGCCTATTTCTAGCTATACACTACACATCAGACGCGACTACAGCCTTTTCATCAGTCGCCCATATTTGCCGAGACGTCCATTACGGATGAATTATCCGATACATACATGCAAACGGAGCCTCCATGTTCTTCATCTGCCTATTCATACACGTAGGACGGGGCTTGTACTATGGCTCATACCTACTCTCAGAAACATGAAACATTGGCATCATCCTCCTATTTACAGTTATAGCCACCGCATTCATAGGATATGTCCTACCCTGAGGCCAAATATCTTTCTGAGGAGCGACTGTCATTACCAACCTCCTATCAGCCATTCCCTATATTGGAACGGACCTAGTAGAGTGAATCTGAGGGGGCTTTTCCGTAGATAAAGCAACCCTAACACGATTCTTTGCTTTCCACTTTATCCTTCCATTTATCATCCTAGCACTAGCAGCAGTCCATCTATTGTTCCTAC [...]
+GGATCCAACAACCCCTCTGGAATCCCATCCGACTCGGACAAAATCCCATTCCACCCATACTATACAATTAAGGACGCCCTAGGCGCCCTACTTCTCATTCTAGCCCTAGCAACTCTAGTTCTATTCTCGCCCGACTTACTGGGAGACCCTGACAACTATACCCCCGCAAACCCACTGAGCACCCCGCCCCACATCAAGCCCGAGTGATACTTTTTATTTGCTTACGCCATCTTACGATCCATCCCCAACAAACTAGGAGGAGTACTAGCGCTAATCTTCTCTATCCTAATCCTAGCCATTATCCCCCTTCTACACACATCCAAACAACGAGGAATAATGTTCCGACCCCTAAGCCAATGCCTATTTTGACTCCTAGTAGCAGACCTACTAACACTAACATGAATCGGAGGACAACCAGTAGAACATCCCTTCATCATTATCGGACAGCTAGCCTCCATCCTCTACTTCACAATCCTCCTGGTGCTCATGCCC [...]
+AATCATTGAAAACAATCTCTCAAAGTGAATGTTTATAATTAACACTATCTCACTAGTTGTACCCATTCTCCTTGCCGTAGCCTTCTTAACACTAGTAGAGCGAAAAGTACTAGGCTATATACAACTTCGTAAAGGACCAAACATTGTAGGGCCCTACGGTCTCCTACAACCTGTCGCAGATGCTGTAAAACTTTTCACCAAAGAGCCTCTACGCCCACTCACATCATCTGCGACTATATTCATTATGGCCCCTATTCTGGCTCTAACACTGGCCCTAACCATGTGAATTCCCCTACCAATGCCATATCCCCTTGTCAATATAAACCTCGGAGTACTATTCATACTAGCAATATCAAGCCTAGCTGTATACTCTATTCTTTGATCAGGATGAGCTTCAAATTCAAAATACGCTCTGATCGGAGCCCTACGGGCCGTAGCCCAGACAATTTCATATGAAGTCACATTAGCTATTATCCTCCTATCAGTCCTACT [...]
+GCTCATTCGCACTTTCCACTTTAATTACTACTCAAGAGCACCTCTGACTAATCTTCCCTGCATGACCCCTAGCCATGATATGATTTATTTCCACCCTAGCAGAAACCAACCGAGCCCCCTTCGACCTAGCAGAAGGAGAATCAGAACTGGTCTCAGGTTTTAACGTTGAGTACGCGGCAGGTCCGTTCGCCCTATTTTTCCTAGCAGAATATACTAATATCATTATAATAAATGCCCTCACGACTATCCTGTTCTTCGGGGCATTTCATAATCCCTACATACCAGAACTGTACACTGTCAATTTCACCGTAAAAACACTGCTCTTAACAGCTTCCTTCCTATGAATCCGTGCATCATATCCCCGATTCCGATATGACCAACTAATGCATCTGCTATGAAAAAACTTCCTACCCCTTACACTAGCCCTGTGCATGTGACATGTAACACTACCCATTATCACAGCAAGCATTCCCCCCCAAATAATAAAACCTC [...]
+ATCATTATCACATCCACCGTTGTCCTAGGAACCATAATCGTTTTATTTAGCTCCCATTGACTCATAATCTGAATTGGCTTTGAAATAAATATACTAGCTATTATCCCAATCCTAATGAAAAAATTTAACCCACGAGCCATAGAAGCCTCTACAAAATATTTCCTCACACAAGCCACTGCATCCATGCTTCTAATACTAGGCATTATTATCAACCTACTACACTCAGGGCACTGAACAGTCTCAATAATCCCTAACCCAATCGCATCAACCGTAATTACCATTGCCCTAGCAATAAAACTCGGCCTATCCCCCTTCCACTTCTGAGTCCCAGAAGTCACACAAGGCGTTCCTTTATCCTCAGGAATAATTCTACTAACATGACAAAAAATCGCACCTCTATCCGTCTTATATCAAATCTCACCATCCATCAACCCAAACCTACTGGTAGCAATAGCCGCCACATCCGTATTAGTAGGGGGCTGAGGAGGATTA [...]
+TCAACTTCGAAAAATCCTAGCATACTCTTCAATCGCTCACATGGGCTGAATAGCCGCCATCATAGTATATAACCCCACTCTAATAATCCTTAACCTTGCAATCTATATCATAATAACTCTGGGGACATTTATACTATTTATGCACAGCCTATCCACAACAACACTATCACTGTCCCATACATGAAATAAACTACCACTAATTGCCTCACTAATTCTAGCACTTATATTATCACTAGGCGGCCTCCCTCCCCTCTCAGGCTTCATCCCCAAATGAATAATTATTCAAGAACTAACAAAAAATGATATAATCGTCATGCCCACATTCATAGCCATCACAGCCTTACTAAATCTTTATTTTTACATGCGTCTAACATACGCCACAGCATTAACAATATTCCCCTCAGCAAATAACATAAAAATAAAATGACAGTTTGAAAGCACAAAAAAAATAATTCTCTTGCCCCCTCTAATCGTAGCATCAACCATACTCCT [...]
+CTCCAATACTATCAATCATGGACATCAACTTAATCTTAGCACTATTTACTAACATACTACTAGCTTCCTTACTCGTCCTTATTGCCTTCTGACTACCACAATTAAATATCTATGCAGAAAAAGCAAGCCCCTATGAATGCGGGTTTGACCCCGTAGGATCGGCACGCCTCCCTTTTTCCATAAAATTTTTCCTAGTAGCTATCACATTTCTACTATTTGACCTAGAAATTGCGCTACTCCTCCCCCTTCCCTGAGCATCACAAACTGACAATCTAATAACGATACTCATCATAGCATTACTGCTTATCTCCCTATTAGCCGCAAGTCTGGCCTATGAATGAGCCGAAAAAGGTCTAGAATGGGCCGAAATGCCTGTGGTCTATGTCAATATTTTCCTAGCCTTCATCGTATCCCTAATAGGGCTACTTATTTACCGATCTCATCTAATGTCCTCTCTACTTTGCCTGGAGGGTATAATGCTGTCTTTATTTG [...]
+ACAGTAACAGTTTTAAATAATCATTTTACACTAGCTAACATAGCTCCCATTATCTTACTAGTATTTGCTGCCTGCGAAGCAGCACTAGGACTATCCCTGCTAGTAATAGTCTCCAACACTTATGGAACCGATTACGTACAAAATCTTAATCTCTTACAATGCATTATCTTTCCCACTATAATACTAGTGCCCCTTACATGAGCATCAAAACCCAGTATAATCTGGATTAATACAACAGCTTACAGCCTACTCATTTGTCTTATCAGCTTGACATATCTCAACCATCTCGGTGATAATAGCCTAAACTTCTCATTATTATTCTTTACCGACTCCCTATCAGCCCCCTTACTAGCTCTTACAACATGACTACTGCCTCTAATACTAATAGCAAGTCAATCCCACCTATCAAAGGAGACCCTGACCCGAAAGAAACTATATATCACTATACTAGTCCTCCTACAGCTATTCCTGATTATAACCTTTTCTGCTATA [...]
+CCTGTTCTATATCTTGTTCGAAGCCACCCTAATACCCACTCTAATTATTATTACTCGATGAGGGAATCAAACAGAACGATTAAACGCGGGCCTTTACTTTCTATTTTATACTCTAGTAGGATCTTTACCACTGCTAATTGCACTACTACATACTCAAAACAATCTAGGTACCCTAAATCTTCTCATAATACAATACTGAATCCAGCCTCTGCCAAACTCCTGATCCAGTGTCTTCCTGTGACTAGCATGTATAATAGCATTCATAGTAAAAATACCTCTGTATGGCCTTCACTTGTGATTGCCAAAAGCACATGTAGAAGCCCCTATCGCAGGATCTATAGTGCTTGCCGCCGTACTCCTAAAACTAGGAGGCTACGGCATGATACGAATTACAACACTACTTGACCCTCTAACAAGCTTCATGGCCTACCCCTTCATAATACTCTCACTATGGGGCATAATCATAACAAGTTCTATTTGCCTGCGCCAAAC [...]
+AGTCCCTAATTGCTTACTCCTCTGTTAGTCATATAGCCCTAGTCATTGTAGCAGTATTGATCCAAACTCCATGAAGCTATATAGGAGCAACAGCCTTAATAGTTGCCCATGGACTAACATCCTCCATGCTATTCTGTCTTGCAAACTCCAACTATGAACGAGTCCATAGCCGAACTATAATCCTTGCGCGAGGTCTACAAACACTCCTTCCACTTATAGCAGCTTGATGACTACTAGCAAGTCTTACTAATCTGGCACTCCCTCCTACCATCAATCTCATCGGAGAACTATTTGTGGTAGTAGCCACATTTTCATGATCTAACATCACCATCACTCTAATAGGAGCCAACATCATCATTACTGCCCTCTATTCTCTCTACATACTAATCACCACACAACGAGGCAAGTGCACAGACCATATCAAAAGCATCAAGCCATCCTTCACACGAGAAAACGCCCTAATAGCTCTCCACCTCCTACCCCTTCTACTTC [...]
+AACCCCAAAGTAATTCTGGGGCCCATTTACTGTAAAATAAAAGTAATTAATCTGTTTGCCTCCTCTATTATCACAACCTTGCTCATATTAACGGTACCAATTATCCTTACCAGCGCTTCAACACACAAAAATAAATTCTACCCACAGTATGTAAAAACTACAATTTCCTATGCTTTCGCAGTCAGCACTGTTCCTATAATGATATTCCTCTACTCAGGGCAAGAGATAATCATCTCAAACTGACATTGAATAACTATTCAAACCCTAAAGCTAACTCTAAGCTTTAAGCTAGACTATTTCTCGATAATTTTTATACCAGTAGCCCTGTTCGTCACATGGTCCATCATAGAATTTTCTATTTGATATATACACACTGATCCCAACATCAACCGATTCTTCAAATATCTACTTATATTCCTCATTACTATAATAATTTTAGTAACCGCAAATAATCTGTTCCAACTATTCATCGGCTGAGAAGGGGTAGGAATC [...]
+CCTCCTTATTGGGTGATGATACGGACGAACAGATGCCAATACAGCTGCTCTACAGGCAGTCCTATATAACCGCATCGGAGACGTAGGCTTTATTATAGCTATAGCCTGATTTCTACTCAATACAAATGCATGAGACTTCCAACAAATCTTTGCAATCGAACATGACAACCTTAATATCCCACTAGCAGGACTACTCCTAGCAGCCACTGGAAAATCAGCCCAATTCGGCCTTCATCCATGACTTCCATCAGCTATAGAAGGACCCACTCCTGTTTCAGCCCTACTCCACTCCAGTACAATAGTAGTAGCAGGGGTATTTCTTCTAATCCGATTTCACCCCTTAATGGAACATAATAAGACCATCCAAACAGCCGCCCTATGCTTAGGAGCAATAACAACCCTATTTACAGCAGCCTGCGCTCTCACCCAAAATGACATTAAAAAGATTATTGCCTTCTCCACCTCAAGCCAACTAGGATTAATAATCGTAAC [...]
+TTAACCAACCCCATTTAGCATTTCTTCATATCTGCACACACGCATTTTTCAAGGCCATACTGTTTATATGCTCTGGATCCATTATCCACAGTCTAAATGACGAACAAGACATCCGAAAAATAGGAGGCCTATTCAAAGTCTTACCACTTACCACCACTGCACTAATTATTGGAACCCTAGCACTCACAGGTATACCTTTCCTAACAGGATTTTACTCTAAAGACCTAATTATCGAGACCGCCAATACGTCGTATACCAACGCCTGAGCCCTACTAATAACTCTCGTCGCCACATCCATAACCGCTGCCTACAGTACTCGAATTGTATTTTTCGCACTTCTAGGACAACCTCGCTTTAACCCTGCTATTATCATCAACGAGAATAATCCTCTCTTGGTTAACTCCATCAAGCGTCTACTTCTAGGAAGTATTTTCGCAGGATACCTAATCTCCCACAATATTACACCTACTACCATCCCACAAATAACCATAC [...]
+CTAAAAACAACAGCCCTCGCGGTCACTATACTAGGCTTTATCCTAGCACTAGAACTTAATTCTACCATACAAGTCTTCAAATTTAACTATCCACAAAATCTATTCAAATTCTCCAATCAACTAGGGTACTTCCCTATTATTATTCACCGCTTCCTACCAACAATGAGCTTATCAATAAGCCAAAAGATGGCATCTATATTACTAGACACAATCTGACTAGAAAATGTATTACCAAAATCCATCTCCTACTTCCAAATAAAATCTTCAATCACAGTCTCCAACCAGAAAGGACTAATCAAACTATACTTCCTCTCTTTCATGATCACACTAACCCTAAGCTTCCTCGTA??????CTTAATTTCCACGAG
+>Vulpes_vulpes
+ATGAACGAAAATTTATTCGCCTCTTTCGCTACCCCTACAATAATGGGCCTCCCAATCGCTGTATTAATCGTAATATTCCCATCTATTCTATTCCCATCACCTAATCGACTAATTAACAATCGATTAATTTCTATCCAACAGTGATTAATTCAACTTACATCCAAACAGATACTAACAATTCACAACCAAAAAGGACGAACCTGAGCCCTTATGCTGATATCACTGATTTTATTTATTGGCTCGACTAATCTCCTCGGATTGCTACCCCACTCATTCACACCCACAACCCAATTGTCTATAAACCTAGGAATAGCAATTCCCCTGTGAGCAGGGACAGTAATTACCGGGTTCCGCCACAAAACTAAGGCCTCTCTAGCACACTTCCTGCCCCAAGGAACACCCCTCCCCCTAATTCCCATGCTAGTAATCATCGAGACAATTAGTCTATTCATCCAACCTATGGCCTTAGCTGTCCGATTAACAGCCAACATT [...]
+ACACCTATTAATTCACCTAATTGGAGGGGCCACTCTAGCCCTAATCAACATCAGTGCTACCACAGCCCTTATTACTTTTATAATTCTAGTTTTACTTACCATTCTCGAATTCGCCGTCGCTCTTATTCAGGCCTACGTCTTTACACTACTAGTAAGTCTATACTTACATGACAATACCTAAATGCCACAGCTAGACACATCAACTTGATTAGTTATAATTCTTTCAATAATTCTAACTCTGTTTATCTTATTCCAACTAAAAGTATCAAAACACTACTATCCAGAGAGCCCAGGACCTAAATCTATCAAGTCTATTAGCAAACACACCCCTTGAGAAAACAAATGAACGAAAATTTATTCGCCTCTTTCGCTACCCCTACAAATGTTCATTAATCGATGATTATTCTCTACTAACCACAAAGACATCGGTACTTTATATTTGCTATTCGGAGCATGAGCCGGTATAGTAGGCACTGCCCTAAGCCTCCTAAT [...]
+AATTAGGTCAACCCGGCACCTTATTAGGGGACGATCAGATTTATAACGTAATCGTAACCGCACATGCCTTCGTAATAATCTTCTTCATGGTCATACCAATTATAATTGGGGGATTTGGGAACTGATTAGTTCCCCTGATAATTGGTGCCCCAGACATAGCATTTCCTCGGATAAATAACATAAGCTTCTGACTACTTCCCCCATCCTTTCTTCTACTATTAGCATCTTCCATAGTAGAAGCGGGTGCGGGAACTGGGTGAACCGTATATCCCCCATTAGCTGGTAACCTGGCTCATGCTGGAGCATCAGTGGACCTTACAATTTTCTCCCTGCACCTGGCCGGAGTCTCTTCAATTTTAGGAGCTATTAATTTCATCACTACTATTATCAATATAAAACCTCCCGCCATATCCCAATACCAAACCCCCCTATTTGTGTGATCAGTCCTAATTACAGCTGTTCTATTACTACTATCACTACCAGTACTGGCTG [...]
+ACTATGCTTCTGACAGACCGTAACCTTAACACGACATTTTTTGATCCTGCTGGAGGAGGGGACCCTATTTTATACCAACACTTGTTTTGATTCTTCGGACACCCTGAAGTCTACATTTTAATCTTGCCTGGGTTTGGTATAATCTCCCACATCGTTACTTATTATTCAGGAAAGAAAGAGCCCTTCGGTTACATGGGAATGGTATGAGCAATAATGTCTATCGGATTCTTAGGCTTTATCGTATGAGCTCACCACATATTCACTGTAGGAATAGATGTGGATACACGAGCATACTTCACGTCTGCTACTATAATTATCGCTATTCCTACAGGGGTTAAAGTATTCAGTTGATTAGCAACACTCCATGGGGGCAATATTAAATGATCTCCAGCTATACTATGAGCTCTAGGTTTTATTTTCCTATTCACAGTAGGTGGCCTAACGGGCATCGTTTTAGCCAACTCATCCTTAGATATCGTTCTTCATGACACG [...]
+CGTAGCTCACTTCCACTACGTTCTCTCAATAGGAGCAGTATTTGCTATTATAGGCGGATTTGCCCACTGATTCCCCCTATTCTCAGGCTACACTCTAAATGACACCTGAGCAAAAATCCACTTTACAATTATATTTGTAGGGGTGAACATAACTTTCTTCCCTCAACACTTCCTAGGGCTATCGGGTATGCCCCGTCGATATTCTGACTACCCAGATGCATACACCACTTGAAATACCGTCTCATCTATAGGCTCATTCATCTCACTTACAGCAGTAATACTTATAATCTTCATAATCTGGGAAGCCTTCGCTTCTAAACGGGAGGTCGCAATAGTAGAACTCACTACAACTAACATTGAATGATTACACGGATGTCCTCCTCCGTACCACACATTTGAAGAGCCTACGTATGTCATCCAAAAAATGGCGTACCCTTTTCAACTCGGATTACAGGACGCGACCTCCCCTATTATAGAGGAGCTACTTCATTT [...]
+ATACCCTAATAATCGTATTCTTAATCAGCTCATTAGTTCTTTACATTATTACTTTAATACTAACTACCAAGCTAACCCACACAAGTACAATAGACGCGCAAGAGGTAGAAACAGTCTGAACCATTCTACCAGCCATTATCCTAATCCTGATTGCTCTTCCTTCTCTACGAATTCTCTACATAATGGATGAAATTAATAACCCATCACTAACCGTAAAAACAATAGGCCATCAATGATATTGAAGCTACGAGTACACTGACTATGAAGATCTGAACTTTGACTCCTACATGATTCCTACACAAGAATTAAAACCAGGAGAACTCCGACTATTAGAAGTCGACAACCGAGTCGTTCTCCCAATGGAAATAACTGTCCGAATACTTATTTCTTCAGAAGACGTATTGCACTCATGAGCCGTTCCATCACTAGGCTTAAAAACTGATGCCATCCCAGGACGATTAAATCAAACTACCCTAATAGCGATACGACCAG [...]
+TACGGCCAATGCTCTGAAATTTGCGGATCCAACCACAGCTTTATACCAATTGTTCTTGAAATAGTCCCACTGTCCTACTTCGAAACCTGATCTGCTGTAATGGTTATGACCCACCAAACCCATGCTTACCATATAGTCAATCCGAGCCCATGACCACTAACAGGAGCCCTATCTGCCCTACTTATAACATCGGGTCTCATCATATGATTTCACTACAACTCAATATCTTTACTCACTCTAGGACTTACAACTAACATACTAACTATGTATCAATGATGACGAGACGTAGTTCGAGAAGGCACGTTTCAAGGACACCATACCCCCACTGTGCAAAAAGGGCTACGATATGGAATAATCCTATTTATCGTCTCAGAAGTTTTCTTTTTCGCTGGCTTCTTTTGAGCCTTCTACCACTCCAGCCTAGCTCCAACCCCCGAACTCGGGGGTTGCTGGCCACCCACTGGCATCATTCCTCTGAATCCGCTTGAAGTC [...]
+CAACACCTCTGTCCTGCTAGCCTCAGGGGTCTCAATCACCTGAGCCCACCACAGCCTAATAGAAGGCAATCGCAAGCACATACTTCAAGCCCTATTTATTACTATCTCCCTAGGCGTATATTTCACACTACTACAAGCCTCTGAATATTATGAGACATCCTTCACAATCTCCGACGGAGTCTATGGGTCCACATTCTTTATGGCTACCGGATTCCACGGACTGCATGTAATTATCGGCTCCACATTCCTTATTGTCTGCTTTATGCGACAACTGCACTACCACTTCACATCTAATCACCACTTTGGATTTGAAGCTGCTGCATGGTACTGACACTTCGTCGATGTAGTATGACTATTCCTATATGTTTCCATCTATTGATGAGGATCTTACATGACCAACATTCGAAAGACTCACCCACTAGCTAAAATCGTAAACGACTCATTCATCGACCTTCCCGCACCATCAAATATTTCTGCCTGATGGAACTTCGG [...]
+TAGGTGTATGCCTTATTCTACAGATTGCAACAGGTCTATTTTTAGCCATACACTATACATCTGACACAGCTACTGCTTTCTCATCTGTCACTCACATCTGCCGAGACGTTAACTATGGCTGAATTATCCGCTACATACATGCAAACGGAGCATCTATATTTTTTATCTGCCTCTTCATGCACGTGGGACGAGGCTTATATTATGGATCTTATGTATTCATAGAAACATGAAATATTGGAATTATCTTATTGTTCGCAACCATGGCCACAGCATTTATGGGCTATGTTTTACCGTGAGGACAAATATCATTCTGAGGGGCAACCGTAATTACAAATCTTCTATCTGCTATCCCCTATATCGGAACCGATCTAGTAGAATGAATTTGAGGGGGCTTCTCAGTAGACAAAGCAACCCTAACACGATTCTTTGCATTCCACTTTATCCTTCCATTCATCATCGCAGCATTAGCGATGGTTCATCTCTTATTTCTCC [...]
+GGATCCAACAACCCTTCAGGAATCACATCCGACTCAGACAAAATTCCGTTTCACCCCTACTACACAATTAAAGACATCCTAGGAGTTTTACTTCTCCTTTCAGTTCTAATATCACTAGTCCTATTCTCACCAGATCTTTTAGGAGACCCAGACAATTACACCCCCGCAAACCCTCTCAGCACTCCCCCACATATTAAACCCGAATGATACTTCCTATTTGCCTATGCCATTCTCCGGTCCATCCCTAACAAACTAGGAGGAGTCCTAGCCCTAGTGTTCTCAATTCTAATCTTAGCACTTATCCCCCACCTACACACCTCAAAACAACGTGGGATAATATTCCGACCCCTTAGTCAATGCCTATTCTGACTTCTAACCGCGGACCTCCTCACCTTAACTTGAATCGGAGGGCAGCCAGTAGAACACCCCTTTATCATCATTGGCCAAATTGCCTCCATCCTGTATTTTGCTATCTTATTGATTCTAATGCCA [...]
+CATTATCGAAAACAATCTCCTAAAATGAATGTTCTTTATCAACATTCTCTCCCTTATCGTCCCAATCCTTCTCGCCGTAGCTTTCCTCACTCTCGTTGAACGGAAAGTCCTAGGCTATATACAACTTCGAAAAGGACCCAATATTGTAGGTCCCTATGGTCTCCTCCAACCAATCGCCGATGCTGTAAAACTCTTTACAAAAGAACCCCTACGTCCCCTTACATCGTCTATATCAATATTTATTCTAGCACCCATTCTGGCCCTATCATTAGCTCTAACCATATGAATCCCACTCCCCATGCCCTACCCACTCATTAATATAAATCTAGGGGTGCTATTTATATTAGCCATGTCAAGCCTCGCCGTATACTCCATCCTCTGATCAGGATGGGCCTCGAACTCCAAGTACGCCCTAATCGGAGCCCTTCGAGCCGTAGCTCAAACAATCTCATACGAAGTCACACTAGCGATCATCCTCCTTTCTATTTTGCT [...]
+GATCATTCACACTATCCACACTCATTATTACCCAAGAACATATATGACTAATTTTCCCTGCCTGACCTCTAGCCATGATATGATTTATCTCTACCCTAGCAGAAACAAACCGGGCCCCCTTTGACTTAACTGAGGGGGAATCAGAACTGGTCTCAGGGTTTAACGTGGAGTATGCAGCCGGACCCTTCGCCCTATTCTTCCTAGCAGAGTATGCAAATATTATCATAATAAATATCCTCACAACAATTTTATTCTTCGGCGCATTCCACAATCCATTCTTACCAGAGCTCTACTCCATCAACTTCACCATTAAGACCCTTCTACTAACCATCTCTTTTCTATGAATTCGAGCATCCTACCCTCGGTTCCGCTATGACCAATTAATACACCTCCTATGAAAAAACTTCCTACCACTAACTTTGGCCCTGTGCATATGACACGTCGCCCTACCTATTATCACTGCAAGCATTCCACCTCAAACAATAAAACCTC [...]
+ATTGCCATTCTAGCAACCGTCATAACTGGAACTATAATCGTAATACTAAGCTCCCACTGGTTACTAATCTGAATCGGATTCGAAATGAATATGTTAGCCATCATTCCTATTCTAATAAAAAAATTCAATCCACGAGCCATAGAGGCATCCACAAAGTATTTCCTCACACAAGCAACAGCCTCGATATTACTAATAATAGGAGTCACTATCAACCTTCTCTACTCCGGTCAGTGAATAATCTCAAAAGTCTCGAATCCTGCAGCATCAACTATAATAACTATTGCCCTAACAATAAAACTGGGTCTATCCCCATTTCACTTCTGAGTCCCTGAAGTAACCCAAGGCATTTCACTCTCATCAGGTATGATCCTACTGACATGACAAAAAATTGCACCAATATCCGTTCTCTACCAGATCTCACCATCAATCAATACTGACCTTATAACACTAGTGGCCCTCGCGTCTGTCCTAATCGGAGGATGAGGCGGACTT [...]
+TCAACTACGAAAAATCATAGCATATTCCTCCATCGCACATATAGGCTGAATAGCGGCAATCATTACTTACAACCCCACAATAATATTTCTAAACCTGTCCCTATACATTCTAATAACCCTATCAACATTTATACTATTCATACTGAGCGCATCTACCACAACCCTATCTCTCTCACACACATGAAACAAAATCCCCCTAATTGCTTCCACCATCCTAACTCTAATACTATCCCTGGGAGGGCTTCCACCACTGTCCGGCTTTATTCCTAAATGAATAATTATTCAAGAACTAACAAAAAATGATATAATTGTTGTCCCAACACTTATAGCCATCACTGCACTACTCAACCTATACTTCTACATACGACTCACATACAGTACCGCACTCACTATATTCCCATCCGCAAACAACATAAAAATAAAATGACAATTTGAACACACAAAAAAGATAACCTTGCTACCCCCTCTGATTATTATCTCAACCATACTACT [...]
+TACCCATAATATCAATTCTGGACATTAACATAATACTTACTCTGATAACCAATATTACCCTGGCTTCCCTACTCGTAATAATCGCATTTTGACTTCCTCAACTAAATATTTATGCCGACAAAACCAGTCCTTACGAATGTGGCTTTGACCCCATAGGATCGGCACGTTTACCATTTTCTATAAAATTTTTCCTGGTTGCAATTACATTCCTACTCTTTGACTTAGAAATCGCCCTCCTACTTCCACTACCCTGGGCATCACAAACCAATAAGCTAACAACTATGCTTATCATGGCACTCCTTCTAATCTCACTTCTGGCTGCAAGCCTAGCATATGAATGAACTGAAAAAGGCCTAGAATGAACTGAAATGTCCATAGTATATATTAACATCTTCCTGGCATTCATTCTATCATTAATGGGCATACTCGTCTACCGATCCCACCTAATATCATCACTGCTATGCCTAGAAGGCATGATACTGTCACTATTCG [...]
+TCTGTGACTATCCTGAATAATCACCTCACATTAGCTAGCATAATACCAATTGTACTGCTAGTATTCGCCGCCTGCGAAGCAGCATTGGGATTATCTCTACTAGTTATAGTATCTAACACTTACGGAACTGATCATGTGCAAAACCTAAACCTTCTACAATGCATTATTATTCCTACCGCTATACTTATTCCCCTAACATGAACATCAAAGCCTAACATAATCTGAATTAACTCCACAATATACAGCCTGCTAATTAGCCTAATTAGTTTGTCTTATCTAAATCAACCGAACGACAACACCCTAAACTCGTCCTTACTATTCTTCTCCGACTCCCTATCAGCACCACTACTGGCACTCACAACATGACTTCTACCACTTATATTGATAGCAAGCCAATCCCATCTATCAAAAGAGCCTCTTATCCGAAAAAAACTATATATCTCAATACTAATTCTACTCCAACTATTCTTAATTATAACCTTCACCGCCACA [...]
+CCTCTTCTATATTCTATTCGAAGCTACCCTAATTCCCACCCTTATTATTATCACCCGGTGAGGTAATCAGACCGAACGACTAAACGCAGGGCTATACTTCCTGTTTTACAACTTGACAGGATCCCTACCACTTCTCGTAGCACTTCTGTATATTCAAAATAGCATAGGCTCTCTAAACTTCCTCATAATCCAATACTGAATTCAGCCTCTACCAAGCTCCTGATCTAACATTTTTCTATGGTTAGCATGTATGATGGCTTTCATAGTAAAAATACCCCTATACGGCCTCCACTTGTGACTACCAAAGGCACATGTAGAGGCCCCTATTGCCGGTTCTATGGTACTTGCAGCCGTACTTCTAAAACTAGGAGGTTACGGTATAATACGAATCACAACCCTACTAAACCCCCTAACCGACCTGATAGTATACCCCTTCATATTACTATCACTATGGGGCATAATTATAACTAGTTCTATTTGTTTACGTCAAAC [...]
+AATCTCTAATCGCATACTCTTCCGTTAGCCATATAGCACTTGTCATTGTAGCGGTACTTATCCAAACACCGTGAAGTTACATAGGGGCAACAGCTCTAATAATCGCCCATGGTTTAACATCATCCATACTATTCTGCTTAGCCAACTCAAACTACGAACGAACCCACAGTCGTACTATAATTCTCGCACGAGGCCTCCAAACCCTCCTCCCCCTGATAGCTGCTTGATGACTATTAGCGAGTCTCGCAAACCTAGCCCTTCCCCCAACAATTAACTTAATCGGGGAGCTGTTCGTAGTAATAGCCTCATTCTCATGATCCAATATTACAATTATCCTGATAGGAATAAACATCATCATTACCGCCCTTTATACCCTATATATACTAATCACTACACAACGCGGTAAACATACCCACCATATTAAAAACATCAAACCGTCCTTTACACGGGAGAATGCCCTAATAACCCTCCACTTGCTGCCCTTGCTTCTCC [...]
+GACCCCAAAGTTGTTCTGGGGCCCATCTACTGCAGGATAAAAGTAATAAATATATTCGCCTCCTGCATGATCACTGCCTTAATCTTACTCACCCTACCAATCATTATAACCTCTACCAAGCTCTACAAAGACAAATTATATCCATATTATGTAAAAACAGCAACCTCCCACGCATTTATAATTAGCATAATTCCTGCAATAATGTTCATCTATTCTGGACAGGAAATGGTAGTCTCGAACTGGCACTGAATAACGATCCAAACCATAAAACTGTCTATAAGCTTTAAACTAGATTACTTCTCAATAATTTTTGTACCCGTGGCTTTGTTTGTCACATGGTCCATTATGGAGTTCTCTATATGATATATACACTCAGACCCCTACATCAACCGATTTTTTAAATATCTCCTTATATTCCTTATCACTATAATAATTCTAGTGACCGCAAACAACATATTTCAATTGTTCATCGGCTGAGAAGGAGTAGGCATT [...]
+CCTACTTATTGGATGATGATACGGTCGAACCGATGCAAATACAGCCGCCCTACAAGCCATTCTCTACAACCGAATTGGAGATGTCGGATTCATCATAGCTATAGCATGATTCTTACTACACCTAAATGCGTGAGACCTTCAACAAATTTTTATATCAGCCAACGACAACCTTAATCTTCCCCTATTTGGTCTTTTACTAGCAGCCACCGGCAAATCTGCCCAATTCGGACTACACCCATGACTCCCCTCAGCTATGGAAGGTCCAACTCCCGTATCAGCCCTACTCCACTCCAGTACTATAGTTGTCGCAGGAGTATTTCTACTAATTCGTTTCCACCCCCTAATAGAACAAAATCCAACTATCCAAACCCTCACTCTATGTCTAGGGGCCATCACTACACTGTTTACTGCAATCTGCGCTCTTACACAAAATGATATTAAAAAAATTGTTGCATTCTCTACCTCAAGCCAACTAGGACTTATAATCGTAAC [...]
+TTAACCAACCTTACTTGGCCTTTCTGCACATCTGCACCCACGCATTCTTTAAAGCCATATTATTCATGTGCTCCGGGTCAATTATCCATAGTTTAAATGATGAGCAAGACATTCGAAAAATAGGCGGACTATTTAAAGCCCTCCCCTTTACCACGACCTCCCTTATTATTGGAAGCCTCGCACTGACAGGCATACCATTCCTCACAGGCTTCTATTCCAAAGACCTGATTATCGAGACCGCCAACACGTCGAATACCAACGCCTGAGCCCTCTTAATTACCCTCGTTGCCACATCTATAACTGCCGCCTACAGCACTCGAATTCTATTCTTCGCACTATTAGGCCAGCCCCGCTTTACCCCCATTATTTCCATCAACGAGAATAATCCTTACCTAATTAACTCTATTAAACGCCTACTTCTCGGGAGTGTGTTCGCAGGGTATGTTATCTCCCACAGTATTACTCCCACTACCATCCCACAAATGACTATGC [...]
+CTGAAAATAGCTGCCCTCGCAGTAACCATCTTGGGTTTCATCCTGGCATTAGAACTAAACCTTACAATGCAAGGGCTCAAATTCAACCACTCATCTCACTATTTCAAGTTTTCAAACCTCCTTGGCTATTACCCCACCATCATACACCGTCTGGCACCCAAAACAAGCCTATCCATAAGTCAAAAATCAGCATCCATACTCCTAGATCATATCTGACTAGAAAGTGTTCTACCAAAATCAATCGCATTCTTCCAAATAAAATCCTCCACCCTAGTTTCAAATCAAAAAGGCCTCATTAAGCTCTATTTCTTCTCATTCATAATCACCATGGCCCTCAGCCTCTCAATT??????CTTAATTACCACGTG
+>Zalophus_californianus
+ATGAACGAAAATCTATTCACCTCTTTCACTTCCCCTACAATAATAGGCCTTCCTATCGTAACCCTAATCATCCTATTTCCAAGCATATTATTCCCTTCACCAGGCCGACTGATCAATAACCGCCTCACCTCAATTCAACAGTGACTGATCCAATTAACATCAAAGCAAATAATATTAATTCACAATCACAAAGGACAAACATGGACATTAATACTCATATCGCTCATCATATTCATTGGATCTACCAATCTACTAGGTCTACTACCACACTCATTTACTCCCACTACCCAACTATCTATAAATCTAGGAATGGCCATCCCCCTGTGAGCAGGAACAGTCGCCATAGGACTACGAACCAAAACTAAAGCATCCTTAGCCCACTTTCTACCCCAAGGAACACCCTTCCCCCTCATCCCAATATTAGTAATCATTGAATCTATTAGCTTGCTCATTCAACCTATAGCCTTAGCCGTACGACTAACAGCCAATATC [...]
+CCACCTATTAATTCACCTAATTGGTGGAGCCACCCTAGCCCTCATTAACATCAGCGCAATTACGGCCCTTATTACTTTCATTATCCTCACTCTACTTACAGTACTTGAGTTCGCTGTAGCCTTAATCCAAGCCTACGTCTTCACTTTACTAGTAAGCCTATACTTACATGATAACACCTAAATGCCACAACTAGACACATCAACATGGTTTACTACAATTGTATCCATAATCCTAACACTATTTATCGTATTTCAATTAAAAATTTCCAAACACCACTTCCCAATAAGCCCAGAATTGAAACCGTTATCAACATCAAAAACCAATATCCCCTGAGAAAAAAAATGAACGAAAATCTATTCACCTCTTTCACTTCCCCTACAAATGTTCGTAAATCGATGATTATTCTCTACAAACCATAAAGATATTGGCACCCTCTATTTACTATTTGGTGCATGAGCTGGAATGGCTGGCACCGCTCTCAGCCTATTAAT [...]
+AATTAGGCCAACCAGGCACCCTACTAGGGGACGACCAAATCTACAATGTAATTGTCACCGCCCATGCATTCGTAATAATCTTTTTCATAGTAATGCCTATTATGATTGGAGGCTTTGGAAATTGATTAGTACCCCTAATAATTGGTGCTCCCGACATGGCATTTCCCCGAATAAACAACATAAGTTTCTGACTTCTACCCCCCTCCTTTCTACTACTACTAGCCTCTTCTCTAGTTGAAGCCGGCGCGGGTACCGGATGAACGGTTTATCCTCCCCTAGCAGGGAATCTAGCCCATGCGGGAGCTTCCGTAGACTTGACTATTTTCTCCCTTCACCTGGCAGGAGTATCATCTATTCTGGGAGCCATCAACTTTATTACTACCATTATCAACATGAAACCCCCCGCTATGTCCCAGTACCAAACTCCTTTATTCGTGTGATCCGTACTAATCACAGCAGTACTACTTCTGCTATCCCTACCAGTACTAGCAG [...]
+ACTATACTACTTACGGACCGAAATCTAAATACAACCTTTTTCGATCCAGCCGGAGGGGGTGACCCTATCCTATATCAACATCTATTCTGATTCTTCGGACACCCAGAAGTATATATTCTTATCCTACCAGGGTTCGGAATAATCTCTCATATCGTCACATATTATTCAGGAAAAAAGGAACCCTTTGGCTATATAGGAATGGTCTGAGCAATAATATCCATTGGCTTCTTAGGCTTTATCGTATGAGCACATCATATATTCACCGTAGGAATAGATGTTGACACGCGAGCATATTTCACCTCAGCCACTATAATCATCGCCATCCCTACAGGAGTAAAAGTATTTAGCTGACTAGCTACCCTGCACGGCGGCAATATCAAATGATCTCCTGCCATACTATGAGCTTTAGGATTCATCTTCCTATTCACAGTAGGAGGTCTCACAGGCATTGTGCTAGCAAACTCATCATTAGATATTGTCCTCCACGACACA [...]
+AGTGGCCCACTTCCATTACGTATTATCAATAGGAGCAGTGTTTGCTATCATGGGCGGATTTGTCCATTGATTCCCCTTATTCTCAGGATTCATGCTCGACAGCACCTGAGCGAAAATCCACTTCACAATCATATTTGTTGGAGTCAACATGACATTCTTCCCACAACATTTTCTAGGGCTGTCCGGAATACCACGACGATATTCTGACTACCCAGACGCCTATACAACATGAAATACAATCTCTTCTATAGGTTCGTTCATCTCGCTTACGGCAGTAATACTAATGGTCTTCATAATCTGAGAGGCTTTTGCATCTAAACGAGAGGTAGAGACGGTCGAATTAACATCAACTAATATGGAATGACTTCATGGATGCCCTCCTCCCTACCACACATTCGAAGAACCTACTTACATTATATTAAAAATGGCGTACCCCTTTCAAATAGGCCTTCAAGACGCAACCTCCCCTATTATAGAAGAACTAACACACTT [...]
+ACACACTAATAATCGTATTCCTAATTAGTTCACTAGTACTTTATATTATCTCAACCATACTTACTACGAAACTAACGCACACAAACACAATAGACGCCCAAGAAGTAGAGACAGTATGAACAATTTTACCAGCCATTATTTTAATTATAATTGCCCTACCCTCGCTTCGAATCCTTTATATTATAGACGAAATTAATAATCCTTCTCTAACTGTAAAAACTATAGGACACCAATGATATTGAACCTATGAGTATACTGATTATGAAGACCTAAGCTTTGACTCCTACATAATTCCTACACAAGAATTAAAACCTGGCGAACTACGACTATTAGAAGTGGATAATCGAGTCGTACTACCCATAGAAATAACAGTCCGTATACTAATTTCATCAGAAGATGTACTTCACTCATGAGCTGTACCATCCCTAGGACTGAAAACCGACGCTATCCCAGGACGATTAAACCAAACCACCTTAATGGCTATACGACCAG [...]
+TACGGTCAATGCTCAGAAATCTGTGGTTCCAACCATAGCTTTATACCTATCGTTATTGAATCTGTCCCATTATCTTGCTTCGAGAAATGGTCCGCCTCAATGCTTATGACACACCAAACCCATGCATACCATATAGTTAACCCTAGCCCTTGACCATTAACAGGGGCCCTATCAGCCCTCCTTATAACCTCAGGCCTAATCATGTGATTCCACTTTAATTCAACCCACCTCCTACTACTGGGCCTTATAACCAACACACTAACTATATATCAATGATGACGAGATATCGTCCGGGAAAGCACATTCCAAGGCCATCACACCCCAACCGTCCAAAAGGGCCTACGATATGGCATAATCCTTTTCATCGTATCCGAAGTATTCTTTTTCGCAGGATTTTTCTGAGCTTTCTATCATTCCAGCCTAGCACCTACCCCCGAACTAGGAGGATGCTGGCCCCCCACAGGAATTACACCTTTAAACCCACTAGAAGTC [...]
+AAACACCTCAGTACTATTGGCATCAGGCGTATCAATCACCTGAGCCCACCACAGCTTAATAGAAGGAAATCGTAAACACATACTTCAAGCCCTATCAATCACTATCCTCCTAGGCCTATACTTCACACTTCTACAAGCCTCAGAGTACTACGAAACCTCTTTTACAATCTCCGACGGAATTTACGGCTCCACTTTCTTTATGGCTACAGGATTCCACGGACTACACGTGATTATCGGCTCGACCTTCCTAACCGTATGCTTCCTACGACAATTAAAATTCCATTTCACATCCAACCATCACTTCGGATTTGAAGCTGCTGCCTGGTATTGACATTTCGTAGACGTCGTATGACTATTCCTATATGTATCTATCTATTGATGAGGATCATGTATGACCAACATTCGAAAAGTACATCCACTGGCCAAAATTATCAACAGTTCACTTATCGACCTGCCCACACCATCTAACATCTCAGCATGATGAAACTTTGG [...]
+TCGCAGCATGCTTAGCCTTACAAATCCTAACAGGCCTTTTCCTAGCTATACACTATACCTCAGACACCACCACAGCCTTTTCATCAGTCACCCACATTTGCCGAGACGTCAACTACGGCTGAATCATCCGATACATGCACGCAAATGGAGCCTCCATATTCTTTATCTGCCTCTACATGCACGTAGGACGAGGACTGTACTACGGATCCTATACACTAACAGAAACATGAAACATTGGCATCATCCTCCTATTTACAATCATAGCTACAGCATTTATAGGCTATGTACTTCCATGAGGACAAATATCATTTTGAGGAGCAACCGTCATTACCAACCTCCTATCAGCAGTCCCTTACATCGGAACCAACCTAGTAGAATGAATTTGAGGGGGATTTTCAGTCGACAAAGCAACCCTAACACGATTCTTTGCCTTCCACTTTATTCTCCCCTTCATAGCATCAGCACTAGTAATAGTACACCTATTATTCCTAC [...]
+GGGTCCAACAACCCATCAGGAATCTCCTCTGACTCAGACAAAATTCCATTCCACCCATATTACACAATTAAAGATATCCTAGGAACCCTCCTACTAATCTTAACCCTAATACTACTAGTAATATTTTCACCGGACCTGCTGGGAGACCCAGACAACTATATTCCAGCCAACCCCCTCAGCACTCCACCACATATTAAACCTGAGTGATATTTCCTATTCGCCTATGCTATTTTACGATCCATCCCCAACAAATTAGGGGGAGTTCTAGCCCTACTCCTATCAATCTTAATTCTAGCTATCATTCCACTACTTCATACATCAAAACAACGAGGAATAATATTCCGACCCATCAGCCAATGCCTCTTCTGACTCCTAGTAGCAGACCTACTCACATTGACATGAATCGGAGGACAACCAGTCGAACACCCCTTCATCACCATCGGCCAACTAGCCTCAATCCTATACTTCACTATCCTCCTAGTTTTTATACCC [...]
+CATTATCGAAAATAACATCCTAAAATGAATGATCATAATCAATATCCTCTCACTAATTATCCCAATCCTACTAGCCGTAGCCTTCCTGACACTAGTAGAACGAAAAGTACTAGGCTACATGCAACTCCGAAAAGGTCCCAATATCGTAGGACCCTACGGTCTCCTACAACCAATTGCGGACGCTGTAAAATTATTCACCAAAGAACCCTTACGACCACTCACTTCCTCCACATCAATATTTATCATAGCCCCTATCCTAGCCTTGACCCTAGCTCTAACTATATGAATCCCACTACCTATGCCATATCCTCTCATCAACATGAACTTAGGAGTCCTATTCATACTAGCAATGTCAAGTCTGGCTGTTTACTCAATTCTATGATCTGGATGAGCATCAAACTCAAAGTATGCACTAATTGGAGCCCTGCGAGCCGTAGCCCAGACCATTTCATATGAAGTTACCCTAGCCATTATTCTCCTATCAGTACTTCT [...]
+GATCCTTCACTCTATCCACACTAATCACTACCCAAGAACATCTATGACTAATCTTCCCAACATGGCCCCTAGCCATGATATGATTTATTTCCACCCTAGCAGAAACCAATCGTGCCCCATTCGACCTAACAGAAGGGGAATCAGAACTAGTTTCAGGATTCAACGTAGAATATTCAGCAGGCCCATTCGCTCTATTTTTCCTGGCAGAATATGCTAATATCATCATAATAAATATCCTCACAACTACCCTATTCCTCGGGGCATTCCACAGTCCATATATACCCGAGTTATATACTATCAATTTCACCCTAAAAACACTAACACTGACAATCCTATTCCTATGAATCCGGGCATCATACCCCCGATTCCGCTACGACCAATTAATGCACCTTCTATGAAAAAATTTCCTACCCCTCACACTAGCCCTATGCATATGACACATAACCCTACCCGTAATTACAGCTAGCATCCCCCCTCAAACGATAAAACCCC [...]
+ATCATAATTATAACAACCGTCGTATCAGGAACCATAATTGTCCTAACAAGTTCTCATTGACTAATAATCTGAATCGGATTCGAAATAAATATACTGGCAATCATTCCAATCCTGATAAAAAACTTTAACCCCCGAGCTACAGAAGCATCCACAAAATACTTTCTAATCCAAGCCACCGCATCCATACTCCTAATACTGGGCATCATTATCAACCTAACAACTTCAGGACAATGAACAATTCTAAAACCCCCAAACCCAATAGCATCAAATCTCCTAACTATCGCTCTAGCAATAAAACTTGGAATATCTCCATTTCACTTCTGAGTGCCTGAAGTAACACAAGGAACCCCACTATCATCAGGCATGATTCTACTTACATGACAAAAAATCGCACCCCTATCCATCCTTTACCAAATTGAACCATCAATTAACCCCAACCTACTAACCACCATAGCAATTGCATCAGTACTAGTAGGAGGATGAGGAGGATTA [...]
+CCAACTCCGAAAAATTCTAGCCTATTCATCAATTGCTCATATAGGATGAATTACCATTATCATAGTATATAATCCTACCCTAACACTCCTAAACCTAACAATTTACATCACCATAACACTCGGGACATTTATACTATTTATACACAGCTCATCTACAACAACACTATCACTATCCCACACATGAAACAAACTACCCCTCATGACATCCCTAATCCTAGTACTTATATTATCACTCGGAGGTCTCCCCCCACTATCAGGCTTCGTACCCAAATGACTAATTATTCAAGAACTAACAAAAAATGATATAATCATCCTACCAACATTCATAGCTATTACAGCACTACTAAACCTGTACTTCTACATACGACTATCCTACACCACAGCACTAACACTATTCCCCTCAACGAACAATATAAAAATAAAATGACAATTCGAAAACACAAAAAAGATAGCCTTATTACCCCCACTAATCATTATCTCAACAATATTACT [...]
+CACCAATAATATCTATTCTAGACATAAACATAATTCTAGCCCTACTTACCAACACAATCCTAGCCTCCTTACTTGTACTAATCGCATTCTGACTCCCCCAACTAAACATCTACTCGGAAAAGACTAGCCCTTACGAATGCGGATTTGACCCCATAGGATCAGCGCGTTTGCCCTTCTCCATAAAATTTTTTCTAGTAGCTATTACATTTCTACTATTTGACCTAGAAATCGCACTACTACTACCCCTCCCATGAGCATCTCACGCAAACAACCTAACAAATACCCTCACTATAGCACTCATATTAATCTCTCTACTAGCCGCAAGTCTAGCTTACGAATGAACCGAAAAAGGACTAGAATGAACAGAAATGTCCATAATATACTTCAACATCTTCATAGCCTTCACCGTATCTCTCGTAGGACTACTCATGTATCGATCCCACCTCATATCCTCCCTACTTTGCCTAGAAGGCATAATACTATCATTATTCG [...]
+TCAGTGACAATCCTAAACAACCATTTTACACTAGCTAGCATAGCCCCCATTATCCTACTTGTATTCGCAGCTTGCGAGGCGGCCCTTGGACTATCCCTCCTAGTAATAGTATCTAACACATATGGAACTGACTACGTACAAAACCTAAACCTCTTACAATGCATCATTATCCCCACCATCATACTAATACCCATAACATGAATATCAAAACCCCATATAATCTGAATTAATACAACAACCTATAGCCTACTAATTAGTCTTACCAGCCTACCACTCCTAAGCCAACCTAACGACAACAGCCTAAACTCATCATTACTATTCTTCACGGACTCCCTATCAGCCCCCCTCCTAACACTTACTACATGACTCTTACCCCTGATACTCATAGCTAGCCAATTCCACCTATCAAAAGAGCCACTAGCCCGAAAAAAACTTTATATTACAATATTAATCCTTCTACAATTATTTCTAATTATAACATTCACCGCTACA [...]
+CATATTCTACATCTTATTCGAAGCAACTCTAGTGCCCACACTAATTATTATTACCCGATGAGGTAACCAAACAGAACGCCTGAACGCAGGACTATACTTCCTATTCTATACCCTGGTAGGATCACTACCCCTACTAGTAGCATTACTATACATACAAAACAATATAGGCACACTAAATTTCTTAATAGCCCAATACTGAACCCAAGCCCTACCAAACTCCTGATCCAATATTCTCTTATGACTAGCGTGCATGATAGCATTTATAGTAAAAATACCCCTCTATGGGCTCCACCTATGACTTCCCAAAGCACATGTAGAAGCCCCCATTGCTGGATCCATAGTACTTGCCGCCGTGCTTCTAAAACTAGGAGGCTACGGCATAATACGAATTACCATCTTGCTCAATCCTCTAACAAGCTTCATGGCATACCCCTTTATAATATTATCAATATGAGGTATAATCATGACAAGCTCCATCTGCTTACGCCAAAC [...]
+AATCATTAATCGCATACTCCTCCGTAAGCCACATGGCCCTAGTAATTGTAGCCATCCTCGTCCAGACACCATTAAGCTATATAGGCGCAACCGCCCTAATAATCGCCCACGGCCTTACATCATCTATACTATTCTGCTTAGCCAACTCCAATTATGAACGCACCCACAGTCGAATTATAATCCTCGCACGTGGCCTACAAACCCTACTACCACTAATAGCGGCATGATGACTATTAGCAAGCCTAACCAATCTAGCACTACCCCCTACCATTAATCTAATCGGAGAATTACTCGTGGTAATAGCCTCATTCTCATGATCTAACGCTACTATTATTCTTATAGGAGTAAACATCACCATTACTGCCCTATACTCCCTATATATACTTATTACAACACAACGCGGAAAACATACTCATCACATCAAAAACATTAAACCCTCGTTTACACGAGAGAACACCCTAATAATACTACATCTTATACCACTACTACTAC [...]
+AATCCTAAATTAATTCTAGGGCCCCTTTACTGTAAAATAAAAGTAATCAATTTATTCGCCTCATTCATTATTATAACACTATCCATACTCACCATACCAATTATCCTAACCAGCACTCCAATCTACGAAAGCAAACTCTACCCACAGTACGTGAAAACTACCATCTTCTACGCCTTTATAACCAGTATAATCCCCACAACAATATTCATTTCCTCAGGACAGGAAATAGTCATCTCAAACTGACACTGAATGACGATTCAAACTATAAAATTATCACTAAGCTTCAAACTAGATTATTTCTCGATAATTTTCGTGCCCGTAGCCCTATTCGTCACATGATCCATCATAGAATTCTCAATGTGATACATAACTTCAGACCCTCACATCAACCGGTTCTTCAAGTATCTACTAATATTCCTTATTACAATAATAATTTTAGTTACCGCGAATAATCTATTTCAATTATTCATCGGCTGGGAAGGAGTAGGCATT [...]
+CCTACTCATCGGATGATGATACGGACGGTCAGATGCAAACACAGCCGCTCTTCAAGCAATCCTCTACAATCGCATCGGAGACGTAGGCTTTATCATAGCCATAGCATGATTCTTAATTAATCTAAATACGTGAGACCTCCAACAAATCTTTATAATTCACCATGATAACCTAAATATACCACTCGCAGGTCTCCTGCTAGCGGCAACTGGCAAATCAGCCCAATTTGGTCTACATCCATGACTACCCTCGGCCATAGAAGGACCCACACCAGTATCAGCCCTATTACACTCGAGCACTATAGTTGTAGCTGGAGTTTTCCTCCTAATCCGATTCCACCCTCTAATAGAAAATAATATGATAATACAAACAATCACCCTATGCCTAGGAGCCATTACCACCCTATTCACAGCGGTATGCGCTCTCACCCAAAATGACATCAAAAAAATCATCGCATTCTCAACTTCAAGCCAACTAGGATTGATAATCGTCAC [...]
+TTGGTCAGCCATATCTAGCATTCCTACACATCTGCACTCACGCATTCTTTAAAGCAATACTATTTATATGCTCCGGATCCATCATCCACAACCTAAACGACGAACAAGATATTCGAAAGATAGGAGGCCTATTCAAACCAATACCATTCACCACTACCTCACTAATTATTGGCAGTCTAGCACTCACAGGCATGCCATTTCTTACAGGATTTTACTCAAAAGACTTAATCATCGAAACCGCCAACACATCGAACACCAACGCCTGAGCCCTGCTACTAACCCTAATAGCCACATCCATAACAGCTGCCTACAGCACCCGAATAATATTCTCCACACTTCTGGGACAACCCCGATTCAATGCTACAATTTCAGTAAATGAGAGCAATCCATTACTAATCAACCCTATTAAACGTCTACTACTCGGAAGCATCTTCGCAGGATACCTAATAACTCTCAACATTCCACCCACAACGATCCCACAACTAACTATAC [...]
+CTAAAACTTACAGCTCTCACCGTAACACTACTAGGTTTCGTACTGGCCCTAGAACTCAGTACAACCTCACTAAACCTTAAATTCAAACACGCATCAGACCTGTCAAAATTCTCAAACCTCCTAGGATATTTCCCCACCATTATTCACCGTTTGGTACCAACAATAAACCTAGCAGCAAGCCAAAAATTAGCCTCCACATTAATAGACATAATCTGACTAGAATACTTACTGCCAAAGTCTATTTCCCATCTAAACATGAAATCATCAATCACTATCTCTAACCAAAAAGGCCTGATCAAACTGTATTTCCTGTCCTTCATAATTACCCTGACCCTAGCCCTAATCCTAACAACAGCTAATTTCCACGAG
+
+
+((((((((Acinonyx_jubatus,Puma_concolor),Lynx_canadensis),Felis_silvestris),(Neofelis_nebulosa,((Panthera_pardus,Uncia_uncia),Panthera_tigris))),Herpestes_auropunctatus),((Alopex_lagopus,Vulpes_vulpes),(Canis_latrans,Canis_lupus))),((((((((((Arctocephalus_australis,Arctocephalus_forsteri),Arctocephalus_townsendi),Phocarctos_hookeri),Neophoca_cinerea),Arctocephalus_pusillus),Otaria_byronia),(Eumetopias_jubatus,Zalophus_californianus)),Callorhinus_ursinus),Odobenus_rosmarus),(((Cystophora_c [...]
\ No newline at end of file

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/debian-med/hyphy.git



More information about the debian-med-commit mailing list